diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..5e233f8 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,34 @@ +version: 2.1 + +# this allows you to use CircleCI's dynamic configuration feature +setup: true + +# the path-filtering orb is required to continue a pipeline based on +# the path of an updated fileset +orbs: + path-filtering: circleci/path-filtering@0.1.2 + +workflows: + # the always-run workflow is always triggered, regardless of the pipeline parameters. + always-run: + jobs: + # the path-filtering/filter job determines which pipeline + # parameters to update. + - path-filtering/filter: + name: check-updated-files + # 3-column, whitespace-delimited mapping. One mapping per + # line: + # + mapping: | + mmdet/.* lint_only false + requirements/.* lint_only false + tests/.* lint_only false + tools/.* lint_only false + configs/.* lint_only false + .circleci/.* lint_only false + base-revision: master + # this is the path of the configuration we should trigger once + # path filtering and pipeline parameter value updates are + # complete. In this case, we are using the parent dynamic + # configuration itself. + config-path: .circleci/test.yml diff --git a/.circleci/docker/Dockerfile b/.circleci/docker/Dockerfile new file mode 100644 index 0000000..5154130 --- /dev/null +++ b/.circleci/docker/Dockerfile @@ -0,0 +1,11 @@ +ARG PYTORCH="1.8.1" +ARG CUDA="10.2" +ARG CUDNN="7" + +FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel + +# To fix GPG key error when running apt-get update +RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub +RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub + +RUN apt-get update && apt-get install -y ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 libgl1-mesa-glx git diff --git a/.circleci/scripts/get_mmcv_var.sh b/.circleci/scripts/get_mmcv_var.sh new file mode 100644 index 0000000..552ff87 --- /dev/null +++ b/.circleci/scripts/get_mmcv_var.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +TORCH=$1 +CUDA=$2 + +# 10.2 -> cu102 +MMCV_CUDA="cu`echo ${CUDA} | tr -d '.'`" + +# MMCV only provides pre-compiled packages for torch 1.x.0 +# which works for any subversions of torch 1.x. +# We force the torch version to be 1.x.0 to ease package searching +# and avoid unnecessary rebuild during MMCV's installation. +TORCH_VER_ARR=(${TORCH//./ }) +TORCH_VER_ARR[2]=0 +printf -v MMCV_TORCH "%s." "${TORCH_VER_ARR[@]}" +MMCV_TORCH=${MMCV_TORCH%?} # Remove the last dot + +echo "export MMCV_CUDA=${MMCV_CUDA}" >> $BASH_ENV +echo "export MMCV_TORCH=${MMCV_TORCH}" >> $BASH_ENV diff --git a/.circleci/test.yml b/.circleci/test.yml new file mode 100644 index 0000000..d413d49 --- /dev/null +++ b/.circleci/test.yml @@ -0,0 +1,189 @@ + + +version: 2.1 + +# the default pipeline parameters, which will be updated according to +# the results of the path-filtering orb +parameters: + lint_only: + type: boolean + default: true + +jobs: + lint: + docker: + - image: cimg/python:3.7.4 + steps: + - checkout + - run: + name: Install pre-commit hook + command: | + pip install pre-commit + pre-commit install + - run: + name: Linting + command: pre-commit run --all-files + - run: + name: Check docstring coverage + command: | + pip install interrogate + interrogate -v --ignore-init-method --ignore-module --ignore-nested-functions --ignore-regex "__repr__" --fail-under 50 mmdet + build_cpu: + parameters: + # The python version must match available image tags in + # https://circleci.com/developer/images/image/cimg/python + python: + type: string + torch: + type: string + torchvision: + type: string + docker: + - image: cimg/python:<< parameters.python >> + resource_class: large + steps: + - checkout + - run: + name: Get MMCV_TORCH as environment variables + command: | + . .circleci/scripts/get_mmcv_var.sh << parameters.torch >> + source $BASH_ENV + - run: + name: Install Libraries + command: | + sudo apt-get update + sudo apt-get install -y ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 libgl1-mesa-glx libjpeg-dev zlib1g-dev libtinfo-dev libncurses5 libgeos-dev cmake git + - run: + name: Configure Python & pip + command: | + python -m pip install --upgrade pip + python -m pip install wheel + - run: + name: Install PyTorch + command: | + python -V + python -m pip install torch==<< parameters.torch >>+cpu torchvision==<< parameters.torchvision >>+cpu -f https://download.pytorch.org/whl/torch_stable.html + - run: + name: Install mmdet dependencies + command: | + python -m pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cpu/torch${MMCV_TORCH}/index.html + python -m pip install -r requirements.txt + python -m pip install albumentations --no-binary qudida,albumentations + python -m pip install git+https://github.com/cocodataset/panopticapi.git + - run: + name: Build and install + command: | + python -m pip install -e . + - run: + name: Run unittests + command: | + python -m coverage run --branch --source mmdet -m pytest tests/ + python -m coverage xml + python -m coverage report -m + build_cuda: + parameters: + torch: + type: string + cuda: + type: enum + enum: ["10.1", "10.2", "11.1"] + cudnn: + type: integer + default: 7 + machine: + image: ubuntu-2004-cuda-11.4:202110-01 + docker_layer_caching: true + resource_class: gpu.nvidia.small + steps: + - checkout + - run: + name: Get MMCV_TORCH and MMCV_CUDA as environment variables + command: | + . .circleci/scripts/get_mmcv_var.sh << parameters.torch >> << parameters.cuda >> + source $BASH_ENV + - run: + name: Build Docker image + command: | + docker build .circleci/docker -t mmdet:gpu --build-arg PYTORCH=<< parameters.torch >> --build-arg CUDA=<< parameters.cuda >> --build-arg CUDNN=<< parameters.cudnn >> + docker run --gpus all -t -d -v /home/circleci/project:/mmdet -w /mmdet --name mmdet mmdet:gpu + - run: + name: Install mmdet dependencies + command: | + docker exec mmdet pip install --upgrade pip + docker exec mmdet pip install wheel + docker exec mmdet pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/${MMCV_CUDA}/torch${MMCV_TORCH}/index.html + docker exec mmdet pip install -r requirements.txt + docker exec mmdet pip install typing-extensions -U + docker exec mmdet pip install albumentations --use-pep517 qudida albumentations + docker exec mmdet python -c 'import albumentations; print(albumentations.__version__)' + docker exec mmdet pip install git+https://github.com/cocodataset/panopticapi.git + - run: + name: Build and install + command: | + docker exec mmdet pip install -e . + - run: + name: Run unittests + command: | + docker exec mmdet python -m pytest tests/ +workflows: + pr_stage_lint: + when: << pipeline.parameters.lint_only >> + jobs: + - lint: + name: lint + filters: + branches: + ignore: + - master + pr_stage_test: + when: + not: + << pipeline.parameters.lint_only >> + jobs: + - lint: + name: lint + filters: + branches: + ignore: + - master + - build_cpu: + name: minimum_version_cpu + torch: 1.6.0 + torchvision: 0.7.0 + python: 3.7.7 + requires: + - lint + - build_cpu: + name: maximum_version_cpu + torch: 1.9.0 + torchvision: 0.10.0 + python: 3.8.0 + requires: + - minimum_version_cpu + - hold: + type: approval + requires: + - maximum_version_cpu + - build_cuda: + name: mainstream_version_gpu + torch: 1.8.1 + # Use double quotation mark to explicitly specify its type + # as string instead of number + cuda: "10.2" + requires: + - hold + merge_stage_test: + when: + not: + << pipeline.parameters.lint_only >> + jobs: + - build_cuda: + name: minimum_version_gpu + torch: 1.6.0 + # Use double quotation mark to explicitly specify its type + # as string instead of number + cuda: "10.1" + filters: + branches: + only: + - master diff --git a/.dev_scripts/batch_test_list.py b/.dev_scripts/batch_test_list.py new file mode 100644 index 0000000..1e74ce2 --- /dev/null +++ b/.dev_scripts/batch_test_list.py @@ -0,0 +1,359 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# yapf: disable +atss = dict( + config='configs/atss/atss_r50_fpn_1x_coco.py', + checkpoint='atss_r50_fpn_1x_coco_20200209-985f7bd0.pth', + eval='bbox', + metric=dict(bbox_mAP=39.4), +) +autoassign = dict( + config='configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py', + checkpoint='auto_assign_r50_fpn_1x_coco_20210413_115540-5e17991f.pth', + eval='bbox', + metric=dict(bbox_mAP=40.4), +) +carafe = dict( + config='configs/carafe/faster_rcnn_r50_fpn_carafe_1x_coco.py', + checkpoint='faster_rcnn_r50_fpn_carafe_1x_coco_bbox_mAP-0.386_20200504_175733-385a75b7.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=38.6), +) +cascade_rcnn = [ + dict( + config='configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py', + checkpoint='cascade_rcnn_r50_fpn_1x_coco_20200316-3dc56deb.pth', + eval='bbox', + metric=dict(bbox_mAP=40.3), + ), + dict( + config='configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py', + checkpoint='cascade_mask_rcnn_r50_fpn_1x_coco_20200203-9d4dcb24.pth', + eval=['bbox', 'segm'], + metric=dict(bbox_mAP=41.2, segm_mAP=35.9), + ), +] +cascade_rpn = dict( + config='configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py', + checkpoint='crpn_faster_rcnn_r50_caffe_fpn_1x_coco-c8283cca.pth', + eval='bbox', + metric=dict(bbox_mAP=40.4), +) +centripetalnet = dict( + config='configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py', # noqa + checkpoint='centripetalnet_hourglass104_mstest_16x6_210e_coco_20200915_204804-3ccc61e5.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=44.7), +) +cornernet = dict( + config='configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py', + checkpoint='cornernet_hourglass104_mstest_8x6_210e_coco_20200825_150618-79b44c30.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=41.2), +) +dcn = dict( + config='configs/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py', + checkpoint='faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200130-d68aed1e.pth', + eval='bbox', + metric=dict(bbox_mAP=41.3), +) +deformable_detr = dict( + config='configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py', + checkpoint='deformable_detr_r50_16x2_50e_coco_20210419_220030-a12b9512.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=44.5), +) +detectors = dict( + config='configs/detectors/detectors_htc_r50_1x_coco.py', + checkpoint='detectors_htc_r50_1x_coco-329b1453.pth', + eval=['bbox', 'segm'], + metric=dict(bbox_mAP=49.1, segm_mAP=42.6), +) +detr = dict( + config='configs/detr/detr_r50_8x2_150e_coco.py', + checkpoint='detr_r50_8x2_150e_coco_20201130_194835-2c4b8974.pth', + eval='bbox', + metric=dict(bbox_mAP=40.1), +) +double_heads = dict( + config='configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py', + checkpoint='dh_faster_rcnn_r50_fpn_1x_coco_20200130-586b67df.pth', + eval='bbox', + metric=dict(bbox_mAP=40.0), +) +dynamic_rcnn = dict( + config='configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py', + checkpoint='dynamic_rcnn_r50_fpn_1x-62a3f276.pth', + eval='bbox', + metric=dict(bbox_mAP=38.9), +) +empirical_attention = dict( + config='configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco.py', # noqa + checkpoint='faster_rcnn_r50_fpn_attention_1111_1x_coco_20200130-403cccba.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=40.0), +) +faster_rcnn = dict( + config='configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py', + checkpoint='faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth', + eval='bbox', + metric=dict(bbox_mAP=37.4), +) +fcos = dict( + config='configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco.py', # noqa + checkpoint='fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco-0a0d75a8.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=38.7), +) +foveabox = dict( + config='configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py', + checkpoint='fovea_align_r50_fpn_gn-head_4x4_2x_coco_20200203-8987880d.pth', + eval='bbox', + metric=dict(bbox_mAP=37.9), +) +free_anchor = dict( + config='configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py', + checkpoint='retinanet_free_anchor_r50_fpn_1x_coco_20200130-0f67375f.pth', + eval='bbox', + metric=dict(bbox_mAP=38.7), +) +fsaf = dict( + config='configs/fsaf/fsaf_r50_fpn_1x_coco.py', + checkpoint='fsaf_r50_fpn_1x_coco-94ccc51f.pth', + eval='bbox', + metric=dict(bbox_mAP=37.4), +) +gcnet = dict( + config='configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py', # noqa + checkpoint='mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200202-587b99aa.pth', # noqa + eval=['bbox', 'segm'], + metric=dict(bbox_mAP=40.4, segm_mAP=36.2), +) +gfl = dict( + config='configs/gfl/gfl_r50_fpn_1x_coco.py', + checkpoint='gfl_r50_fpn_1x_coco_20200629_121244-25944287.pth', + eval='bbox', + metric=dict(bbox_mAP=40.2), +) +gn = dict( + config='configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py', + checkpoint='mask_rcnn_r50_fpn_gn-all_2x_coco_20200206-8eee02a6.pth', + eval=['bbox', 'segm'], + metric=dict(bbox_mAP=40.1, segm_mAP=36.4), +) +gn_ws = dict( + config='configs/gn+ws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py', + checkpoint='faster_rcnn_r50_fpn_gn_ws-all_1x_coco_20200130-613d9fe2.pth', + eval='bbox', + metric=dict(bbox_mAP=39.7), +) +grid_rcnn = dict( + config='configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py', + checkpoint='grid_rcnn_r50_fpn_gn-head_2x_coco_20200130-6cca8223.pth', + eval='bbox', + metric=dict(bbox_mAP=40.4), +) +groie = dict( + config='configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py', + checkpoint='faster_rcnn_r50_fpn_groie_1x_coco_20200604_211715-66ee9516.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=38.3), +) +guided_anchoring = [ + dict( + config='configs/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco.py', # noqa + checkpoint='ga_retinanet_r50_caffe_fpn_1x_coco_20201020-39581c6f.pth', + eval='bbox', + metric=dict(bbox_mAP=36.9), + ), + dict( + config='configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py', + checkpoint='ga_faster_r50_caffe_fpn_1x_coco_20200702_000718-a11ccfe6.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=39.6), + ), +] +hrnet = dict( + config='configs/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco.py', + checkpoint='faster_rcnn_hrnetv2p_w18_1x_coco_20200130-56651a6d.pth', + eval='bbox', + metric=dict(bbox_mAP=36.9), +) +htc = dict( + config='configs/htc/htc_r50_fpn_1x_coco.py', + checkpoint='htc_r50_fpn_1x_coco_20200317-7332cf16.pth', + eval=['bbox', 'segm'], + metric=dict(bbox_mAP=42.3, segm_mAP=37.4), +) +libra_rcnn = dict( + config='configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py', + checkpoint='libra_faster_rcnn_r50_fpn_1x_coco_20200130-3afee3a9.pth', + eval='bbox', + metric=dict(bbox_mAP=38.3), +) +mask_rcnn = dict( + config='configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py', + checkpoint='mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth', + eval=['bbox', 'segm'], + metric=dict(bbox_mAP=38.2, segm_mAP=34.7), +) +ms_rcnn = dict( + config='configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py', + checkpoint='ms_rcnn_r50_caffe_fpn_1x_coco_20200702_180848-61c9355e.pth', + eval=['bbox', 'segm'], + metric=dict(bbox_mAP=38.2, segm_mAP=36.0), +) +nas_fcos = dict( + config='configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py', # noqa + checkpoint='nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco_20200520-1bdba3ce.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=39.4), +) +nas_fpn = dict( + config='configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py', + checkpoint='retinanet_r50_nasfpn_crop640_50e_coco-0ad1f644.pth', + eval='bbox', + metric=dict(bbox_mAP=40.5), +) +paa = dict( + config='configs/paa/paa_r50_fpn_1x_coco.py', + checkpoint='paa_r50_fpn_1x_coco_20200821-936edec3.pth', + eval='bbox', + metric=dict(bbox_mAP=40.4), +) +pafpn = dict( + config='configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py', + checkpoint='faster_rcnn_r50_pafpn_1x_coco_bbox_mAP-0.375_20200503_105836-b7b4b9bd.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=37.5), +) +pisa = dict( + config='configs/pisa/pisa_faster_rcnn_r50_fpn_1x_coco.py', + checkpoint='pisa_faster_rcnn_r50_fpn_1x_coco-dea93523.pth', + eval='bbox', + metric=dict(bbox_mAP=38.4), +) +point_rend = dict( + config='configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py', + checkpoint='point_rend_r50_caffe_fpn_mstrain_1x_coco-1bcb5fb4.pth', + eval=['bbox', 'segm'], + metric=dict(bbox_mAP=38.4, segm_mAP=36.3), +) +regnet = dict( + config='configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py', + checkpoint='mask_rcnn_regnetx-3.2GF_fpn_1x_coco_20200520_163141-2a9d1814.pth', # noqa + eval=['bbox', 'segm'], + metric=dict(bbox_mAP=40.4, segm_mAP=36.7), +) +reppoints = dict( + config='configs/reppoints/reppoints_moment_r50_fpn_1x_coco.py', + checkpoint='reppoints_moment_r50_fpn_1x_coco_20200330-b73db8d1.pth', + eval='bbox', + metric=dict(bbox_mAP=37.0), +) +res2net = dict( + config='configs/res2net/faster_rcnn_r2_101_fpn_2x_coco.py', + checkpoint='faster_rcnn_r2_101_fpn_2x_coco-175f1da6.pth', + eval='bbox', + metric=dict(bbox_mAP=43.0), +) +resnest = dict( + config='configs/resnest/faster_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py', # noqa + checkpoint='faster_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco_20200926_125502-20289c16.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=42.0), +) +retinanet = dict( + config='configs/retinanet/retinanet_r50_fpn_1x_coco.py', + checkpoint='retinanet_r50_fpn_1x_coco_20200130-c2398f9e.pth', + eval='bbox', + metric=dict(bbox_mAP=36.5), +) +rpn = dict( + config='configs/rpn/rpn_r50_fpn_1x_coco.py', + checkpoint='rpn_r50_fpn_1x_coco_20200218-5525fa2e.pth', + eval='proposal_fast', + metric=dict(AR_1000=58.2), +) +sabl = [ + dict( + config='configs/sabl/sabl_retinanet_r50_fpn_1x_coco.py', + checkpoint='sabl_retinanet_r50_fpn_1x_coco-6c54fd4f.pth', + eval='bbox', + metric=dict(bbox_mAP=37.7), + ), + dict( + config='configs/sabl/sabl_faster_rcnn_r50_fpn_1x_coco.py', + checkpoint='sabl_faster_rcnn_r50_fpn_1x_coco-e867595b.pth', + eval='bbox', + metric=dict(bbox_mAP=39.9), + ), +] +scnet = dict( + config='configs/scnet/scnet_r50_fpn_1x_coco.py', + checkpoint='scnet_r50_fpn_1x_coco-c3f09857.pth', + eval='bbox', + metric=dict(bbox_mAP=43.5), +) +sparse_rcnn = dict( + config='configs/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco.py', + checkpoint='sparse_rcnn_r50_fpn_1x_coco_20201222_214453-dc79b137.pth', + eval='bbox', + metric=dict(bbox_mAP=37.9), +) +ssd = [ + dict( + config='configs/ssd/ssd300_coco.py', + checkpoint='ssd300_coco_20210803_015428-d231a06e.pth', + eval='bbox', + metric=dict(bbox_mAP=25.5), + ), + dict( + config='configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco.py', + checkpoint='ssdlite_mobilenetv2_scratch_600e_coco_20210629_110627-974d9307.pth',# noqa + eval='bbox', + metric=dict(bbox_mAP=21.3), + ), +] +tridentnet = dict( + config='configs/tridentnet/tridentnet_r50_caffe_1x_coco.py', + checkpoint='tridentnet_r50_caffe_1x_coco_20201230_141838-2ec0b530.pth', + eval='bbox', + metric=dict(bbox_mAP=37.6), +) +vfnet = dict( + config='configs/vfnet/vfnet_r50_fpn_1x_coco.py', + checkpoint='vfnet_r50_fpn_1x_coco_20201027-38db6f58.pth', + eval='bbox', + metric=dict(bbox_mAP=41.6), +) +yolact = dict( + config='configs/yolact/yolact_r50_1x8_coco.py', + checkpoint='yolact_r50_1x8_coco_20200908-f38d58df.pth', + eval=['bbox', 'segm'], + metric=dict(bbox_mAP=31.2, segm_mAP=29.0), +) +yolo = dict( + config='configs/yolo/yolov3_d53_320_273e_coco.py', + checkpoint='yolov3_d53_320_273e_coco-421362b6.pth', + eval='bbox', + metric=dict(bbox_mAP=27.9), +) +yolof = dict( + config='configs/yolof/yolof_r50_c5_8x8_1x_coco.py', + checkpoint='yolof_r50_c5_8x8_1x_coco_20210425_024427-8e864411.pth', + eval='bbox', + metric=dict(bbox_mAP=37.5), +) +centernet = dict( + config='configs/centernet/centernet_resnet18_dcnv2_140e_coco.py', + checkpoint='centernet_resnet18_dcnv2_140e_coco_20210702_155131-c8cd631f.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=29.5), +) +yolox = dict( + config='configs/yolox/yolox_tiny_8x8_300e_coco.py', + checkpoint='yolox_tiny_8x8_300e_coco_20210806_234250-4ff3b67e.pth', # noqa + eval='bbox', + metric=dict(bbox_mAP=31.5), +) +# yapf: enable diff --git a/.dev_scripts/batch_train_list.txt b/.dev_scripts/batch_train_list.txt new file mode 100644 index 0000000..a7004d7 --- /dev/null +++ b/.dev_scripts/batch_train_list.txt @@ -0,0 +1,66 @@ +configs/atss/atss_r50_fpn_1x_coco.py +configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py +configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py +configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py +configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py +configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py +configs/detectors/detectors_htc_r50_1x_coco.py +configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py +configs/detr/detr_r50_8x2_150e_coco.py +configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py +configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py +configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py +configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py +configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py +configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py +configs/faster_rcnn/faster_rcnn_r50_fpn_ohem_1x_coco.py +configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py +configs/mask_rcnn/mask_rcnn_r50_fpn_fp16_1x_coco.py +configs/retinanet/retinanet_r50_fpn_fp16_1x_coco.py +configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py +configs/fsaf/fsaf_r50_fpn_1x_coco.py +configs/gfl/gfl_r50_fpn_1x_coco.py +configs/ghm/retinanet_ghm_r50_fpn_1x_coco.py +configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py +configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py +configs/htc/htc_r50_fpn_1x_coco.py +configs/ld/ld_r18_gflv1_r101_fpn_coco_1x.py +configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py +configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py +configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py +configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py +configs/paa/paa_r50_fpn_1x_coco.py +configs/pisa/pisa_mask_rcnn_r50_fpn_1x_coco.py +configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py +configs/reppoints/reppoints_moment_r50_fpn_gn-neck+head_1x_coco.py +configs/retinanet/retinanet_r50_caffe_fpn_1x_coco.py +configs/rpn/rpn_r50_fpn_1x_coco.py +configs/sabl/sabl_retinanet_r50_fpn_1x_coco.py +configs/ssd/ssd300_coco.py +configs/tridentnet/tridentnet_r50_caffe_1x_coco.py +configs/vfnet/vfnet_r50_fpn_1x_coco.py +configs/yolact/yolact_r50_8x8_coco.py +configs/yolo/yolov3_d53_320_273e_coco.py +configs/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco.py +configs/scnet/scnet_r50_fpn_1x_coco.py +configs/yolof/yolof_r50_c5_8x8_1x_coco.py +configs/carafe/mask_rcnn_r50_fpn_carafe_1x_coco.py +configs/dcn/faster_rcnn_r50_fpn_mdpool_1x_coco.py +configs/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py +configs/dcn/faster_rcnn_r50_fpn_dpool_1x_coco.py +configs/dcn/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py +configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco.py +configs/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco.py +configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py +configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py +configs/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco.py +configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py +configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py +configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py +configs/resnest/mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco.py +configs/res2net/faster_rcnn_r2_101_fpn_2x_coco.py +configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py +configs/centernet/centernet_resnet18_dcnv2_140e_coco.py +configs/yolox/yolox_tiny_8x8_300e_coco.py +configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco.py +configs/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco.py diff --git a/.dev_scripts/benchmark_filter.py b/.dev_scripts/benchmark_filter.py new file mode 100644 index 0000000..178cd9c --- /dev/null +++ b/.dev_scripts/benchmark_filter.py @@ -0,0 +1,167 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os +import os.path as osp + + +def parse_args(): + parser = argparse.ArgumentParser(description='Filter configs to train') + parser.add_argument( + '--basic-arch', + action='store_true', + help='to train models in basic arch') + parser.add_argument( + '--datasets', action='store_true', help='to train models in dataset') + parser.add_argument( + '--data-pipeline', + action='store_true', + help='to train models related to data pipeline, e.g. augmentations') + parser.add_argument( + '--nn-module', + action='store_true', + help='to train models related to neural network modules') + parser.add_argument( + '--model-options', + nargs='+', + help='custom options to special model benchmark') + parser.add_argument( + '--out', + type=str, + default='batch_train_list.txt', + help='output path of gathered metrics to be stored') + args = parser.parse_args() + return args + + +basic_arch_root = [ + 'atss', 'autoassign', 'cascade_rcnn', 'cascade_rpn', 'centripetalnet', + 'cornernet', 'detectors', 'deformable_detr', 'detr', 'double_heads', + 'dynamic_rcnn', 'faster_rcnn', 'fcos', 'foveabox', 'fp16', 'free_anchor', + 'fsaf', 'gfl', 'ghm', 'grid_rcnn', 'guided_anchoring', 'htc', 'ld', + 'libra_rcnn', 'mask_rcnn', 'ms_rcnn', 'nas_fcos', 'paa', 'pisa', + 'point_rend', 'reppoints', 'retinanet', 'rpn', 'sabl', 'ssd', 'tridentnet', + 'vfnet', 'yolact', 'yolo', 'sparse_rcnn', 'scnet', 'yolof', 'centernet' +] + +datasets_root = [ + 'wider_face', 'pascal_voc', 'cityscapes', 'lvis', 'deepfashion' +] + +data_pipeline_root = ['albu_example', 'instaboost'] + +nn_module_root = [ + 'carafe', 'dcn', 'empirical_attention', 'gcnet', 'gn', 'gn+ws', 'hrnet', + 'pafpn', 'nas_fpn', 'regnet', 'resnest', 'res2net', 'groie' +] + +benchmark_pool = [ + 'configs/albu_example/mask_rcnn_r50_fpn_albu_1x_coco.py', + 'configs/atss/atss_r50_fpn_1x_coco.py', + 'configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py', + 'configs/carafe/mask_rcnn_r50_fpn_carafe_1x_coco.py', + 'configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py', + 'configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py', + 'configs/centernet/centernet_resnet18_dcnv2_140e_coco.py', + 'configs/centripetalnet/' + 'centripetalnet_hourglass104_mstest_16x6_210e_coco.py', + 'configs/cityscapes/mask_rcnn_r50_fpn_1x_cityscapes.py', + 'configs/cornernet/' + 'cornernet_hourglass104_mstest_8x6_210e_coco.py', + 'configs/dcn/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py', + 'configs/dcn/faster_rcnn_r50_fpn_dpool_1x_coco.py', + 'configs/dcn/faster_rcnn_r50_fpn_mdpool_1x_coco.py', + 'configs/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py', + 'configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py', + 'configs/detectors/detectors_htc_r50_1x_coco.py', + 'configs/detr/detr_r50_8x2_150e_coco.py', + 'configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py', + 'configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py', + 'configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco.py', # noqa + 'configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py', + 'configs/faster_rcnn/faster_rcnn_r50_fpn_ohem_1x_coco.py', + 'configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py', + 'configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py', + 'configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py', + 'configs/fcos/fcos_center_r50_caffe_fpn_gn-head_4x4_1x_coco.py', + 'configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py', + 'configs/retinanet/retinanet_r50_fpn_fp16_1x_coco.py', + 'configs/mask_rcnn/mask_rcnn_r50_fpn_fp16_1x_coco.py', + 'configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py', + 'configs/fsaf/fsaf_r50_fpn_1x_coco.py', + 'configs/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco.py', + 'configs/gfl/gfl_r50_fpn_1x_coco.py', + 'configs/ghm/retinanet_ghm_r50_fpn_1x_coco.py', + 'configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py', + 'configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py', + 'configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py', + 'configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py', + 'configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py', + 'configs/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco.py', + 'configs/htc/htc_r50_fpn_1x_coco.py', + 'configs/instaboost/mask_rcnn_r50_fpn_instaboost_4x_coco.py', + 'configs/ld/ld_r18_gflv1_r101_fpn_coco_1x.py', + 'configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py', + 'configs/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1.py', + 'configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py', + 'configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py', + 'configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py', + 'configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py', + 'configs/paa/paa_r50_fpn_1x_coco.py', + 'configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py', + 'configs/pisa/pisa_mask_rcnn_r50_fpn_1x_coco.py', + 'configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py', + 'configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py', + 'configs/reppoints/reppoints_moment_r50_fpn_gn-neck+head_1x_coco.py', + 'configs/res2net/faster_rcnn_r2_101_fpn_2x_coco.py', + 'configs/resnest/' + 'mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco.py', + 'configs/retinanet/retinanet_r50_caffe_fpn_1x_coco.py', + 'configs/rpn/rpn_r50_fpn_1x_coco.py', + 'configs/sabl/sabl_retinanet_r50_fpn_1x_coco.py', + 'configs/ssd/ssd300_coco.py', + 'configs/tridentnet/tridentnet_r50_caffe_1x_coco.py', + 'configs/vfnet/vfnet_r50_fpn_1x_coco.py', + 'configs/yolact/yolact_r50_1x8_coco.py', + 'configs/yolo/yolov3_d53_320_273e_coco.py', + 'configs/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco.py', + 'configs/scnet/scnet_r50_fpn_1x_coco.py', + 'configs/yolof/yolof_r50_c5_8x8_1x_coco.py', +] + + +def main(): + args = parse_args() + + benchmark_type = [] + if args.basic_arch: + benchmark_type += basic_arch_root + if args.datasets: + benchmark_type += datasets_root + if args.data_pipeline: + benchmark_type += data_pipeline_root + if args.nn_module: + benchmark_type += nn_module_root + + special_model = args.model_options + if special_model is not None: + benchmark_type += special_model + + config_dpath = 'configs/' + benchmark_configs = [] + for cfg_root in benchmark_type: + cfg_dir = osp.join(config_dpath, cfg_root) + configs = os.scandir(cfg_dir) + for cfg in configs: + config_path = osp.join(cfg_dir, cfg.name) + if (config_path in benchmark_pool + and config_path not in benchmark_configs): + benchmark_configs.append(config_path) + + print(f'Totally found {len(benchmark_configs)} configs to benchmark') + with open(args.out, 'w') as f: + for config in benchmark_configs: + f.write(config + '\n') + + +if __name__ == '__main__': + main() diff --git a/.dev_scripts/benchmark_inference_fps.py b/.dev_scripts/benchmark_inference_fps.py new file mode 100644 index 0000000..81dcd6b --- /dev/null +++ b/.dev_scripts/benchmark_inference_fps.py @@ -0,0 +1,170 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os +import os.path as osp + +import mmcv +from mmcv import Config, DictAction +from mmcv.runner import init_dist +from terminaltables import GithubFlavoredMarkdownTable + +from tools.analysis_tools.benchmark import repeat_measure_inference_speed + + +def parse_args(): + parser = argparse.ArgumentParser( + description='MMDet benchmark a model of FPS') + parser.add_argument('config', help='test config file path') + parser.add_argument('checkpoint_root', help='Checkpoint file root path') + parser.add_argument( + '--round-num', + type=int, + default=1, + help='round a number to a given precision in decimal digits') + parser.add_argument( + '--repeat-num', + type=int, + default=1, + help='number of repeat times of measurement for averaging the results') + parser.add_argument( + '--out', type=str, help='output path of gathered fps to be stored') + parser.add_argument( + '--max-iter', type=int, default=2000, help='num of max iter') + parser.add_argument( + '--log-interval', type=int, default=50, help='interval of logging') + parser.add_argument( + '--fuse-conv-bn', + action='store_true', + help='Whether to fuse conv and bn, this will slightly increase' + 'the inference speed') + parser.add_argument( + '--cfg-options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file. If the value to ' + 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + 'Note that the quotation marks are necessary and that no white space ' + 'is allowed.') + parser.add_argument( + '--launcher', + choices=['none', 'pytorch', 'slurm', 'mpi'], + default='none', + help='job launcher') + parser.add_argument('--local_rank', type=int, default=0) + args = parser.parse_args() + if 'LOCAL_RANK' not in os.environ: + os.environ['LOCAL_RANK'] = str(args.local_rank) + return args + + +def results2markdown(result_dict): + table_data = [] + is_multiple_results = False + for cfg_name, value in result_dict.items(): + name = cfg_name.replace('configs/', '') + fps = value['fps'] + ms_times_pre_image = value['ms_times_pre_image'] + if isinstance(fps, list): + is_multiple_results = True + mean_fps = value['mean_fps'] + mean_times_pre_image = value['mean_times_pre_image'] + fps_str = ','.join([str(s) for s in fps]) + ms_times_pre_image_str = ','.join( + [str(s) for s in ms_times_pre_image]) + table_data.append([ + name, fps_str, mean_fps, ms_times_pre_image_str, + mean_times_pre_image + ]) + else: + table_data.append([name, fps, ms_times_pre_image]) + + if is_multiple_results: + table_data.insert(0, [ + 'model', 'fps', 'mean_fps', 'times_pre_image(ms)', + 'mean_times_pre_image(ms)' + ]) + + else: + table_data.insert(0, ['model', 'fps', 'times_pre_image(ms)']) + table = GithubFlavoredMarkdownTable(table_data) + print(table.table, flush=True) + + +if __name__ == '__main__': + args = parse_args() + assert args.round_num >= 0 + assert args.repeat_num >= 1 + + config = Config.fromfile(args.config) + + if args.launcher == 'none': + raise NotImplementedError('Only supports distributed mode') + else: + init_dist(args.launcher) + + result_dict = {} + for model_key in config: + model_infos = config[model_key] + if not isinstance(model_infos, list): + model_infos = [model_infos] + for model_info in model_infos: + record_metrics = model_info['metric'] + cfg_path = model_info['config'].strip() + cfg = Config.fromfile(cfg_path) + checkpoint = osp.join(args.checkpoint_root, + model_info['checkpoint'].strip()) + try: + fps = repeat_measure_inference_speed(cfg, checkpoint, + args.max_iter, + args.log_interval, + args.fuse_conv_bn, + args.repeat_num) + if args.repeat_num > 1: + fps_list = [round(fps_, args.round_num) for fps_ in fps] + times_pre_image_list = [ + round(1000 / fps_, args.round_num) for fps_ in fps + ] + mean_fps = round( + sum(fps_list) / len(fps_list), args.round_num) + mean_times_pre_image = round( + sum(times_pre_image_list) / len(times_pre_image_list), + args.round_num) + print( + f'{cfg_path} ' + f'Overall fps: {fps_list}[{mean_fps}] img / s, ' + f'times per image: ' + f'{times_pre_image_list}[{mean_times_pre_image}] ' + f'ms / img', + flush=True) + result_dict[cfg_path] = dict( + fps=fps_list, + mean_fps=mean_fps, + ms_times_pre_image=times_pre_image_list, + mean_times_pre_image=mean_times_pre_image) + else: + print( + f'{cfg_path} fps : {fps:.{args.round_num}f} img / s, ' + f'times per image: {1000 / fps:.{args.round_num}f} ' + f'ms / img', + flush=True) + result_dict[cfg_path] = dict( + fps=round(fps, args.round_num), + ms_times_pre_image=round(1000 / fps, args.round_num)) + except Exception as e: + print(f'{cfg_path} error: {repr(e)}') + if args.repeat_num > 1: + result_dict[cfg_path] = dict( + fps=[0], + mean_fps=0, + ms_times_pre_image=[0], + mean_times_pre_image=0) + else: + result_dict[cfg_path] = dict(fps=0, ms_times_pre_image=0) + + if args.out: + mmcv.mkdir_or_exist(args.out) + mmcv.dump(result_dict, osp.join(args.out, 'batch_inference_fps.json')) + + results2markdown(result_dict) diff --git a/.dev_scripts/benchmark_test_image.py b/.dev_scripts/benchmark_test_image.py new file mode 100644 index 0000000..75f7576 --- /dev/null +++ b/.dev_scripts/benchmark_test_image.py @@ -0,0 +1,102 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import logging +import os.path as osp +from argparse import ArgumentParser + +from mmcv import Config + +from mmdet.apis import inference_detector, init_detector, show_result_pyplot +from mmdet.utils import get_root_logger + + +def parse_args(): + parser = ArgumentParser() + parser.add_argument('config', help='test config file path') + parser.add_argument('checkpoint_root', help='Checkpoint file root path') + parser.add_argument('--img', default='demo/demo.jpg', help='Image file') + parser.add_argument('--aug', action='store_true', help='aug test') + parser.add_argument('--model-name', help='model name to inference') + parser.add_argument('--show', action='store_true', help='show results') + parser.add_argument( + '--wait-time', + type=float, + default=1, + help='the interval of show (s), 0 is block') + parser.add_argument( + '--device', default='cuda:0', help='Device used for inference') + parser.add_argument( + '--score-thr', type=float, default=0.3, help='bbox score threshold') + args = parser.parse_args() + return args + + +def inference_model(config_name, checkpoint, args, logger=None): + cfg = Config.fromfile(config_name) + if args.aug: + if 'flip' in cfg.data.test.pipeline[1]: + cfg.data.test.pipeline[1].flip = True + else: + if logger is not None: + logger.error(f'{config_name}: unable to start aug test') + else: + print(f'{config_name}: unable to start aug test', flush=True) + + model = init_detector(cfg, checkpoint, device=args.device) + # test a single image + result = inference_detector(model, args.img) + + # show the results + if args.show: + show_result_pyplot( + model, + args.img, + result, + score_thr=args.score_thr, + wait_time=args.wait_time) + return result + + +# Sample test whether the inference code is correct +def main(args): + config = Config.fromfile(args.config) + + # test single model + if args.model_name: + if args.model_name in config: + model_infos = config[args.model_name] + if not isinstance(model_infos, list): + model_infos = [model_infos] + model_info = model_infos[0] + config_name = model_info['config'].strip() + print(f'processing: {config_name}', flush=True) + checkpoint = osp.join(args.checkpoint_root, + model_info['checkpoint'].strip()) + # build the model from a config file and a checkpoint file + inference_model(config_name, checkpoint, args) + return + else: + raise RuntimeError('model name input error.') + + # test all model + logger = get_root_logger( + log_file='benchmark_test_image.log', log_level=logging.ERROR) + + for model_key in config: + model_infos = config[model_key] + if not isinstance(model_infos, list): + model_infos = [model_infos] + for model_info in model_infos: + print('processing: ', model_info['config'], flush=True) + config_name = model_info['config'].strip() + checkpoint = osp.join(args.checkpoint_root, + model_info['checkpoint'].strip()) + try: + # build the model from a config file and a checkpoint file + inference_model(config_name, checkpoint, args, logger) + except Exception as e: + logger.error(f'{config_name} " : {repr(e)}') + + +if __name__ == '__main__': + args = parse_args() + main(args) diff --git a/.dev_scripts/check_links.py b/.dev_scripts/check_links.py new file mode 100755 index 0000000..b195d2a --- /dev/null +++ b/.dev_scripts/check_links.py @@ -0,0 +1,157 @@ +# Modified from: +# https://github.com/allenai/allennlp/blob/main/scripts/check_links.py + +import argparse +import logging +import os +import pathlib +import re +import sys +from multiprocessing.dummy import Pool +from typing import NamedTuple, Optional, Tuple + +import requests +from mmcv.utils import get_logger + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Goes through all the inline-links ' + 'in markdown files and reports the breakages') + parser.add_argument( + '--num-threads', + type=int, + default=100, + help='Number of processes to confirm the link') + parser.add_argument('--https-proxy', type=str, help='https proxy') + parser.add_argument( + '--out', + type=str, + default='link_reports.txt', + help='output path of reports') + args = parser.parse_args() + return args + + +OK_STATUS_CODES = ( + 200, + 401, # the resource exists but may require some sort of login. + 403, # ^ same + 405, # HEAD method not allowed. + # the resource exists, but our default 'Accept-' header may not + # match what the server can provide. + 406, +) + + +class MatchTuple(NamedTuple): + source: str + name: str + link: str + + +def check_link( + match_tuple: MatchTuple, + http_session: requests.Session, + logger: logging = None) -> Tuple[MatchTuple, bool, Optional[str]]: + reason: Optional[str] = None + if match_tuple.link.startswith('http'): + result_ok, reason = check_url(match_tuple, http_session) + else: + result_ok = check_path(match_tuple) + if logger is None: + print(f" {'✓' if result_ok else '✗'} {match_tuple.link}") + else: + logger.info(f" {'✓' if result_ok else '✗'} {match_tuple.link}") + return match_tuple, result_ok, reason + + +def check_url(match_tuple: MatchTuple, + http_session: requests.Session) -> Tuple[bool, str]: + """Check if a URL is reachable.""" + try: + result = http_session.head( + match_tuple.link, timeout=5, allow_redirects=True) + return ( + result.ok or result.status_code in OK_STATUS_CODES, + f'status code = {result.status_code}', + ) + except (requests.ConnectionError, requests.Timeout): + return False, 'connection error' + + +def check_path(match_tuple: MatchTuple) -> bool: + """Check if a file in this repository exists.""" + relative_path = match_tuple.link.split('#')[0] + full_path = os.path.join( + os.path.dirname(str(match_tuple.source)), relative_path) + return os.path.exists(full_path) + + +def main(): + args = parse_args() + + # setup logger + logger = get_logger(name='mmdet', log_file=args.out) + + # setup https_proxy + if args.https_proxy: + os.environ['https_proxy'] = args.https_proxy + + # setup http_session + http_session = requests.Session() + for resource_prefix in ('http://', 'https://'): + http_session.mount( + resource_prefix, + requests.adapters.HTTPAdapter( + max_retries=5, + pool_connections=20, + pool_maxsize=args.num_threads), + ) + + logger.info('Finding all markdown files in the current directory...') + + project_root = (pathlib.Path(__file__).parent / '..').resolve() + markdown_files = project_root.glob('**/*.md') + + all_matches = set() + url_regex = re.compile(r'\[([^!][^\]]+)\]\(([^)(]+)\)') + for markdown_file in markdown_files: + with open(markdown_file) as handle: + for line in handle.readlines(): + matches = url_regex.findall(line) + for name, link in matches: + if 'localhost' not in link: + all_matches.add( + MatchTuple( + source=str(markdown_file), + name=name, + link=link)) + + logger.info(f' {len(all_matches)} markdown files found') + logger.info('Checking to make sure we can retrieve each link...') + + with Pool(processes=args.num_threads) as pool: + results = pool.starmap(check_link, [(match, http_session, logger) + for match in list(all_matches)]) + + # collect unreachable results + unreachable_results = [(match_tuple, reason) + for match_tuple, success, reason in results + if not success] + + if unreachable_results: + logger.info('================================================') + logger.info(f'Unreachable links ({len(unreachable_results)}):') + for match_tuple, reason in unreachable_results: + logger.info(' > Source: ' + match_tuple.source) + logger.info(' Name: ' + match_tuple.name) + logger.info(' Link: ' + match_tuple.link) + if reason is not None: + logger.info(' Reason: ' + reason) + sys.exit(1) + logger.info('No Unreachable link found.') + + +if __name__ == '__main__': + main() diff --git a/.dev_scripts/convert_test_benchmark_script.py b/.dev_scripts/convert_test_benchmark_script.py new file mode 100644 index 0000000..c31cad4 --- /dev/null +++ b/.dev_scripts/convert_test_benchmark_script.py @@ -0,0 +1,119 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os +import os.path as osp + +from mmcv import Config + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert benchmark model list to script') + parser.add_argument('config', help='test config file path') + parser.add_argument('--port', type=int, default=29666, help='dist port') + parser.add_argument( + '--work-dir', + default='tools/batch_test', + help='the dir to save metric') + parser.add_argument( + '--run', action='store_true', help='run script directly') + parser.add_argument( + '--out', type=str, help='path to save model benchmark script') + + args = parser.parse_args() + return args + + +def process_model_info(model_info, work_dir): + config = model_info['config'].strip() + fname, _ = osp.splitext(osp.basename(config)) + job_name = fname + work_dir = osp.join(work_dir, fname) + checkpoint = model_info['checkpoint'].strip() + if not isinstance(model_info['eval'], list): + evals = [model_info['eval']] + else: + evals = model_info['eval'] + eval = ' '.join(evals) + return dict( + config=config, + job_name=job_name, + work_dir=work_dir, + checkpoint=checkpoint, + eval=eval) + + +def create_test_bash_info(commands, model_test_dict, port, script_name, + partition): + config = model_test_dict['config'] + job_name = model_test_dict['job_name'] + checkpoint = model_test_dict['checkpoint'] + work_dir = model_test_dict['work_dir'] + eval = model_test_dict['eval'] + + echo_info = f' \necho \'{config}\' &' + commands.append(echo_info) + commands.append('\n') + + command_info = f'GPUS=8 GPUS_PER_NODE=8 ' \ + f'CPUS_PER_TASK=2 {script_name} ' + + command_info += f'{partition} ' + command_info += f'{job_name} ' + command_info += f'{config} ' + command_info += f'$CHECKPOINT_DIR/{checkpoint} ' + command_info += f'--work-dir {work_dir} ' + + command_info += f'--eval {eval} ' + command_info += f'--cfg-option dist_params.port={port} ' + command_info += ' &' + + commands.append(command_info) + + +def main(): + args = parse_args() + if args.out: + out_suffix = args.out.split('.')[-1] + assert args.out.endswith('.sh'), \ + f'Expected out file path suffix is .sh, but get .{out_suffix}' + assert args.out or args.run, \ + ('Please specify at least one operation (save/run/ the ' + 'script) with the argument "--out" or "--run"') + + commands = [] + partition_name = 'PARTITION=$1 ' + commands.append(partition_name) + commands.append('\n') + + checkpoint_root = 'CHECKPOINT_DIR=$2 ' + commands.append(checkpoint_root) + commands.append('\n') + + script_name = osp.join('tools', 'slurm_test.sh') + port = args.port + work_dir = args.work_dir + + cfg = Config.fromfile(args.config) + + for model_key in cfg: + model_infos = cfg[model_key] + if not isinstance(model_infos, list): + model_infos = [model_infos] + for model_info in model_infos: + print('processing: ', model_info['config']) + model_test_dict = process_model_info(model_info, work_dir) + create_test_bash_info(commands, model_test_dict, port, script_name, + '$PARTITION') + port += 1 + + command_str = ''.join(commands) + if args.out: + with open(args.out, 'w') as f: + f.write(command_str) + if args.run: + os.system(command_str) + + +if __name__ == '__main__': + main() diff --git a/.dev_scripts/convert_train_benchmark_script.py b/.dev_scripts/convert_train_benchmark_script.py new file mode 100644 index 0000000..1ccd8e9 --- /dev/null +++ b/.dev_scripts/convert_train_benchmark_script.py @@ -0,0 +1,99 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os +import os.path as osp + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert benchmark model json to script') + parser.add_argument( + 'txt_path', type=str, help='txt path output by benchmark_filter') + parser.add_argument( + '--partition', + type=str, + default='openmmlab', + help='slurm partition name') + parser.add_argument( + '--max-keep-ckpts', + type=int, + default=1, + help='The maximum checkpoints to keep') + parser.add_argument( + '--run', action='store_true', help='run script directly') + parser.add_argument( + '--out', type=str, help='path to save model benchmark script') + + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + if args.out: + out_suffix = args.out.split('.')[-1] + assert args.out.endswith('.sh'), \ + f'Expected out file path suffix is .sh, but get .{out_suffix}' + assert args.out or args.run, \ + ('Please specify at least one operation (save/run/ the ' + 'script) with the argument "--out" or "--run"') + + partition = args.partition # cluster name + + root_name = './tools' + train_script_name = osp.join(root_name, 'slurm_train.sh') + # stdout is no output + stdout_cfg = '>/dev/null' + + max_keep_ckpts = args.max_keep_ckpts + + commands = [] + with open(args.txt_path, 'r') as f: + model_cfgs = f.readlines() + for i, cfg in enumerate(model_cfgs): + cfg = cfg.strip() + if len(cfg) == 0: + continue + # print cfg name + echo_info = f'echo \'{cfg}\' &' + commands.append(echo_info) + commands.append('\n') + + fname, _ = osp.splitext(osp.basename(cfg)) + out_fname = osp.join(root_name, 'work_dir', fname) + # default setting + if cfg.find('16x') >= 0: + command_info = f'GPUS=16 GPUS_PER_NODE=8 ' \ + f'CPUS_PER_TASK=2 {train_script_name} ' + elif cfg.find('gn-head_4x4_1x_coco.py') >= 0 or \ + cfg.find('gn-head_4x4_2x_coco.py') >= 0: + command_info = f'GPUS=4 GPUS_PER_NODE=4 ' \ + f'CPUS_PER_TASK=2 {train_script_name} ' + else: + command_info = f'GPUS=8 GPUS_PER_NODE=8 ' \ + f'CPUS_PER_TASK=2 {train_script_name} ' + command_info += f'{partition} ' + command_info += f'{fname} ' + command_info += f'{cfg} ' + command_info += f'{out_fname} ' + if max_keep_ckpts: + command_info += f'--cfg-options ' \ + f'checkpoint_config.max_keep_ckpts=' \ + f'{max_keep_ckpts}' + ' ' + command_info += f'{stdout_cfg} &' + + commands.append(command_info) + + if i < len(model_cfgs): + commands.append('\n') + + command_str = ''.join(commands) + if args.out: + with open(args.out, 'w') as f: + f.write(command_str) + if args.run: + os.system(command_str) + + +if __name__ == '__main__': + main() diff --git a/.dev_scripts/gather_models.py b/.dev_scripts/gather_models.py new file mode 100644 index 0000000..dbfef88 --- /dev/null +++ b/.dev_scripts/gather_models.py @@ -0,0 +1,342 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import glob +import json +import os.path as osp +import shutil +import subprocess +from collections import OrderedDict + +import mmcv +import torch +import yaml + + +def ordered_yaml_dump(data, stream=None, Dumper=yaml.SafeDumper, **kwds): + + class OrderedDumper(Dumper): + pass + + def _dict_representer(dumper, data): + return dumper.represent_mapping( + yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, data.items()) + + OrderedDumper.add_representer(OrderedDict, _dict_representer) + return yaml.dump(data, stream, OrderedDumper, **kwds) + + +def process_checkpoint(in_file, out_file): + checkpoint = torch.load(in_file, map_location='cpu') + # remove optimizer for smaller file size + if 'optimizer' in checkpoint: + del checkpoint['optimizer'] + + # remove ema state_dict + for key in list(checkpoint['state_dict']): + if key.startswith('ema_'): + checkpoint['state_dict'].pop(key) + + # if it is necessary to remove some sensitive data in checkpoint['meta'], + # add the code here. + if torch.__version__ >= '1.6': + torch.save(checkpoint, out_file, _use_new_zipfile_serialization=False) + else: + torch.save(checkpoint, out_file) + sha = subprocess.check_output(['sha256sum', out_file]).decode() + final_file = out_file.rstrip('.pth') + '-{}.pth'.format(sha[:8]) + subprocess.Popen(['mv', out_file, final_file]) + return final_file + + +def is_by_epoch(config): + cfg = mmcv.Config.fromfile('./configs/' + config) + return cfg.runner.type == 'EpochBasedRunner' + + +def get_final_epoch_or_iter(config): + cfg = mmcv.Config.fromfile('./configs/' + config) + if cfg.runner.type == 'EpochBasedRunner': + return cfg.runner.max_epochs + else: + return cfg.runner.max_iters + + +def get_best_epoch_or_iter(exp_dir): + best_epoch_iter_full_path = list( + sorted(glob.glob(osp.join(exp_dir, 'best_*.pth'))))[-1] + best_epoch_or_iter_model_path = best_epoch_iter_full_path.split('/')[-1] + best_epoch_or_iter = best_epoch_or_iter_model_path.\ + split('_')[-1].split('.')[0] + return best_epoch_or_iter_model_path, int(best_epoch_or_iter) + + +def get_real_epoch_or_iter(config): + cfg = mmcv.Config.fromfile('./configs/' + config) + if cfg.runner.type == 'EpochBasedRunner': + epoch = cfg.runner.max_epochs + if cfg.data.train.type == 'RepeatDataset': + epoch *= cfg.data.train.times + return epoch + else: + return cfg.runner.max_iters + + +def get_final_results(log_json_path, + epoch_or_iter, + results_lut, + by_epoch=True): + result_dict = dict() + last_val_line = None + last_train_line = None + last_val_line_idx = -1 + last_train_line_idx = -1 + with open(log_json_path, 'r') as f: + for i, line in enumerate(f.readlines()): + log_line = json.loads(line) + if 'mode' not in log_line.keys(): + continue + + if by_epoch: + if (log_line['mode'] == 'train' + and log_line['epoch'] == epoch_or_iter): + result_dict['memory'] = log_line['memory'] + + if (log_line['mode'] == 'val' + and log_line['epoch'] == epoch_or_iter): + result_dict.update({ + key: log_line[key] + for key in results_lut if key in log_line + }) + return result_dict + else: + if log_line['mode'] == 'train': + last_train_line_idx = i + last_train_line = log_line + + if log_line and log_line['mode'] == 'val': + last_val_line_idx = i + last_val_line = log_line + + # bug: max_iters = 768, last_train_line['iter'] = 750 + assert last_val_line_idx == last_train_line_idx + 1, \ + 'Log file is incomplete' + result_dict['memory'] = last_train_line['memory'] + result_dict.update({ + key: last_val_line[key] + for key in results_lut if key in last_val_line + }) + + return result_dict + + +def get_dataset_name(config): + # If there are more dataset, add here. + name_map = dict( + CityscapesDataset='Cityscapes', + CocoDataset='COCO', + CocoPanopticDataset='COCO', + DeepFashionDataset='Deep Fashion', + LVISV05Dataset='LVIS v0.5', + LVISV1Dataset='LVIS v1', + VOCDataset='Pascal VOC', + WIDERFaceDataset='WIDER Face', + OpenImagesDataset='OpenImagesDataset', + OpenImagesChallengeDataset='OpenImagesChallengeDataset', + Objects365V1Dataset='Objects365 v1', + Objects365V2Dataset='Objects365 v2') + cfg = mmcv.Config.fromfile('./configs/' + config) + return name_map[cfg.dataset_type] + + +def convert_model_info_to_pwc(model_infos): + pwc_files = {} + for model in model_infos: + cfg_folder_name = osp.split(model['config'])[-2] + pwc_model_info = OrderedDict() + pwc_model_info['Name'] = osp.split(model['config'])[-1].split('.')[0] + pwc_model_info['In Collection'] = 'Please fill in Collection name' + pwc_model_info['Config'] = osp.join('configs', model['config']) + + # get metadata + memory = round(model['results']['memory'] / 1024, 1) + meta_data = OrderedDict() + meta_data['Training Memory (GB)'] = memory + if 'epochs' in model: + meta_data['Epochs'] = get_real_epoch_or_iter(model['config']) + else: + meta_data['Iterations'] = get_real_epoch_or_iter(model['config']) + pwc_model_info['Metadata'] = meta_data + + # get dataset name + dataset_name = get_dataset_name(model['config']) + + # get results + results = [] + # if there are more metrics, add here. + if 'bbox_mAP' in model['results']: + metric = round(model['results']['bbox_mAP'] * 100, 1) + results.append( + OrderedDict( + Task='Object Detection', + Dataset=dataset_name, + Metrics={'box AP': metric})) + if 'segm_mAP' in model['results']: + metric = round(model['results']['segm_mAP'] * 100, 1) + results.append( + OrderedDict( + Task='Instance Segmentation', + Dataset=dataset_name, + Metrics={'mask AP': metric})) + if 'PQ' in model['results']: + metric = round(model['results']['PQ'], 1) + results.append( + OrderedDict( + Task='Panoptic Segmentation', + Dataset=dataset_name, + Metrics={'PQ': metric})) + pwc_model_info['Results'] = results + + link_string = 'https://download.openmmlab.com/mmdetection/v2.0/' + link_string += '{}/{}'.format(model['config'].rstrip('.py'), + osp.split(model['model_path'])[-1]) + pwc_model_info['Weights'] = link_string + if cfg_folder_name in pwc_files: + pwc_files[cfg_folder_name].append(pwc_model_info) + else: + pwc_files[cfg_folder_name] = [pwc_model_info] + return pwc_files + + +def parse_args(): + parser = argparse.ArgumentParser(description='Gather benchmarked models') + parser.add_argument( + 'root', + type=str, + help='root path of benchmarked models to be gathered') + parser.add_argument( + 'out', type=str, help='output path of gathered models to be stored') + parser.add_argument( + '--best', + action='store_true', + help='whether to gather the best model.') + + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + models_root = args.root + models_out = args.out + mmcv.mkdir_or_exist(models_out) + + # find all models in the root directory to be gathered + raw_configs = list(mmcv.scandir('./configs', '.py', recursive=True)) + + # filter configs that is not trained in the experiments dir + used_configs = [] + for raw_config in raw_configs: + if osp.exists(osp.join(models_root, raw_config)): + used_configs.append(raw_config) + print(f'Find {len(used_configs)} models to be gathered') + + # find final_ckpt and log file for trained each config + # and parse the best performance + model_infos = [] + for used_config in used_configs: + exp_dir = osp.join(models_root, used_config) + by_epoch = is_by_epoch(used_config) + # check whether the exps is finished + if args.best is True: + final_model, final_epoch_or_iter = get_best_epoch_or_iter(exp_dir) + else: + final_epoch_or_iter = get_final_epoch_or_iter(used_config) + final_model = '{}_{}.pth'.format('epoch' if by_epoch else 'iter', + final_epoch_or_iter) + + model_path = osp.join(exp_dir, final_model) + # skip if the model is still training + if not osp.exists(model_path): + continue + + # get the latest logs + log_json_path = list( + sorted(glob.glob(osp.join(exp_dir, '*.log.json'))))[-1] + log_txt_path = list(sorted(glob.glob(osp.join(exp_dir, '*.log'))))[-1] + cfg = mmcv.Config.fromfile('./configs/' + used_config) + results_lut = cfg.evaluation.metric + if not isinstance(results_lut, list): + results_lut = [results_lut] + # case when using VOC, the evaluation key is only 'mAP' + # when using Panoptic Dataset, the evaluation key is 'PQ'. + for i, key in enumerate(results_lut): + if 'mAP' not in key and 'PQ' not in key: + results_lut[i] = key + '_mAP' + model_performance = get_final_results(log_json_path, + final_epoch_or_iter, results_lut, + by_epoch) + + if model_performance is None: + continue + + model_time = osp.split(log_txt_path)[-1].split('.')[0] + model_info = dict( + config=used_config, + results=model_performance, + model_time=model_time, + final_model=final_model, + log_json_path=osp.split(log_json_path)[-1]) + model_info['epochs' if by_epoch else 'iterations'] =\ + final_epoch_or_iter + model_infos.append(model_info) + + # publish model for each checkpoint + publish_model_infos = [] + for model in model_infos: + model_publish_dir = osp.join(models_out, model['config'].rstrip('.py')) + mmcv.mkdir_or_exist(model_publish_dir) + + model_name = osp.split(model['config'])[-1].split('.')[0] + + model_name += '_' + model['model_time'] + publish_model_path = osp.join(model_publish_dir, model_name) + trained_model_path = osp.join(models_root, model['config'], + model['final_model']) + + # convert model + final_model_path = process_checkpoint(trained_model_path, + publish_model_path) + + # copy log + shutil.copy( + osp.join(models_root, model['config'], model['log_json_path']), + osp.join(model_publish_dir, f'{model_name}.log.json')) + shutil.copy( + osp.join(models_root, model['config'], + model['log_json_path'].rstrip('.json')), + osp.join(model_publish_dir, f'{model_name}.log')) + + # copy config to guarantee reproducibility + config_path = model['config'] + config_path = osp.join( + 'configs', + config_path) if 'configs' not in config_path else config_path + target_config_path = osp.split(config_path)[-1] + shutil.copy(config_path, osp.join(model_publish_dir, + target_config_path)) + + model['model_path'] = final_model_path + publish_model_infos.append(model) + + models = dict(models=publish_model_infos) + print(f'Totally gathered {len(publish_model_infos)} models') + mmcv.dump(models, osp.join(models_out, 'model_info.json')) + + pwc_files = convert_model_info_to_pwc(publish_model_infos) + for name in pwc_files: + with open(osp.join(models_out, name + '_metafile.yml'), 'w') as f: + ordered_yaml_dump(pwc_files[name], f, encoding='utf-8') + + +if __name__ == '__main__': + main() diff --git a/.dev_scripts/gather_test_benchmark_metric.py b/.dev_scripts/gather_test_benchmark_metric.py new file mode 100644 index 0000000..07c6bf4 --- /dev/null +++ b/.dev_scripts/gather_test_benchmark_metric.py @@ -0,0 +1,96 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import glob +import os.path as osp + +import mmcv +from mmcv import Config + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Gather benchmarked models metric') + parser.add_argument('config', help='test config file path') + parser.add_argument( + 'root', + type=str, + help='root path of benchmarked models to be gathered') + parser.add_argument( + '--out', type=str, help='output path of gathered metrics to be stored') + parser.add_argument( + '--not-show', action='store_true', help='not show metrics') + parser.add_argument( + '--show-all', action='store_true', help='show all model metrics') + + args = parser.parse_args() + return args + + +if __name__ == '__main__': + args = parse_args() + + root_path = args.root + metrics_out = args.out + result_dict = {} + + cfg = Config.fromfile(args.config) + + for model_key in cfg: + model_infos = cfg[model_key] + if not isinstance(model_infos, list): + model_infos = [model_infos] + for model_info in model_infos: + record_metrics = model_info['metric'] + config = model_info['config'].strip() + fname, _ = osp.splitext(osp.basename(config)) + metric_json_dir = osp.join(root_path, fname) + if osp.exists(metric_json_dir): + json_list = glob.glob(osp.join(metric_json_dir, '*.json')) + if len(json_list) > 0: + log_json_path = list(sorted(json_list))[-1] + + metric = mmcv.load(log_json_path) + if config in metric.get('config', {}): + + new_metrics = dict() + for record_metric_key in record_metrics: + record_metric_key_bk = record_metric_key + old_metric = record_metrics[record_metric_key] + if record_metric_key == 'AR_1000': + record_metric_key = 'AR@1000' + if record_metric_key not in metric['metric']: + raise KeyError( + 'record_metric_key not exist, please ' + 'check your config') + new_metric = round( + metric['metric'][record_metric_key] * 100, 1) + new_metrics[record_metric_key_bk] = new_metric + + if args.show_all: + result_dict[config] = dict( + before=record_metrics, after=new_metrics) + else: + for record_metric_key in record_metrics: + old_metric = record_metrics[record_metric_key] + new_metric = new_metrics[record_metric_key] + if old_metric != new_metric: + result_dict[config] = dict( + before=record_metrics, + after=new_metrics) + break + else: + print(f'{config} not included in: {log_json_path}') + else: + print(f'{config} not exist file: {metric_json_dir}') + else: + print(f'{config} not exist dir: {metric_json_dir}') + + if metrics_out: + mmcv.mkdir_or_exist(metrics_out) + mmcv.dump(result_dict, + osp.join(metrics_out, 'batch_test_metric_info.json')) + if not args.not_show: + print('===================================') + for config_name, metrics in result_dict.items(): + print(config_name, metrics) + print('===================================') diff --git a/.dev_scripts/gather_train_benchmark_metric.py b/.dev_scripts/gather_train_benchmark_metric.py new file mode 100644 index 0000000..f9c6c80 --- /dev/null +++ b/.dev_scripts/gather_train_benchmark_metric.py @@ -0,0 +1,150 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import glob +import os.path as osp + +import mmcv +from gather_models import get_final_results + +try: + import xlrd +except ImportError: + xlrd = None +try: + import xlutils + from xlutils.copy import copy +except ImportError: + xlutils = None + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Gather benchmarked models metric') + parser.add_argument( + 'root', + type=str, + help='root path of benchmarked models to be gathered') + parser.add_argument( + 'txt_path', type=str, help='txt path output by benchmark_filter') + parser.add_argument( + '--out', type=str, help='output path of gathered metrics to be stored') + parser.add_argument( + '--not-show', action='store_true', help='not show metrics') + parser.add_argument( + '--excel', type=str, help='input path of excel to be recorded') + parser.add_argument( + '--ncol', type=int, help='Number of column to be modified or appended') + + args = parser.parse_args() + return args + + +if __name__ == '__main__': + args = parse_args() + + if args.excel: + assert args.ncol, 'Please specify "--excel" and "--ncol" ' \ + 'at the same time' + if xlrd is None: + raise RuntimeError( + 'xlrd is not installed,' + 'Please use “pip install xlrd==1.2.0” to install') + if xlutils is None: + raise RuntimeError( + 'xlutils is not installed,' + 'Please use “pip install xlutils==2.0.0” to install') + readbook = xlrd.open_workbook(args.excel) + sheet = readbook.sheet_by_name('Sheet1') + sheet_info = {} + total_nrows = sheet.nrows + for i in range(3, sheet.nrows): + sheet_info[sheet.row_values(i)[0]] = i + xlrw = copy(readbook) + table = xlrw.get_sheet(0) + + root_path = args.root + metrics_out = args.out + + result_dict = {} + with open(args.txt_path, 'r') as f: + model_cfgs = f.readlines() + for i, config in enumerate(model_cfgs): + config = config.strip() + if len(config) == 0: + continue + + config_name = osp.split(config)[-1] + config_name = osp.splitext(config_name)[0] + result_path = osp.join(root_path, config_name) + if osp.exists(result_path): + # 1 read config + cfg = mmcv.Config.fromfile(config) + total_epochs = cfg.runner.max_epochs + final_results = cfg.evaluation.metric + if not isinstance(final_results, list): + final_results = [final_results] + final_results_out = [] + for key in final_results: + if 'proposal_fast' in key: + final_results_out.append('AR@1000') # RPN + elif 'mAP' not in key: + final_results_out.append(key + '_mAP') + + # 2 determine whether total_epochs ckpt exists + ckpt_path = f'epoch_{total_epochs}.pth' + if osp.exists(osp.join(result_path, ckpt_path)): + log_json_path = list( + sorted(glob.glob(osp.join(result_path, + '*.log.json'))))[-1] + + # 3 read metric + model_performance = get_final_results( + log_json_path, total_epochs, final_results_out) + if model_performance is None: + print(f'log file error: {log_json_path}') + continue + for performance in model_performance: + if performance in ['AR@1000', 'bbox_mAP', 'segm_mAP']: + metric = round( + model_performance[performance] * 100, 1) + model_performance[performance] = metric + result_dict[config] = model_performance + + # update and append excel content + if args.excel: + if 'AR@1000' in model_performance: + metrics = f'{model_performance["AR@1000"]}' \ + f'(AR@1000)' + elif 'segm_mAP' in model_performance: + metrics = f'{model_performance["bbox_mAP"]}/' \ + f'{model_performance["segm_mAP"]}' + else: + metrics = f'{model_performance["bbox_mAP"]}' + + row_num = sheet_info.get(config, None) + if row_num: + table.write(row_num, args.ncol, metrics) + else: + table.write(total_nrows, 0, config) + table.write(total_nrows, args.ncol, metrics) + total_nrows += 1 + + else: + print(f'{config} not exist: {ckpt_path}') + else: + print(f'not exist: {config}') + + # 4 save or print results + if metrics_out: + mmcv.mkdir_or_exist(metrics_out) + mmcv.dump(result_dict, + osp.join(metrics_out, 'model_metric_info.json')) + if not args.not_show: + print('===================================') + for config_name, metrics in result_dict.items(): + print(config_name, metrics) + print('===================================') + if args.excel: + filename, sufflx = osp.splitext(args.excel) + xlrw.save(f'{filename}_o{sufflx}') + print(f'>>> Output {filename}_o{sufflx}') diff --git a/.dev_scripts/linter.sh b/.dev_scripts/linter.sh new file mode 100644 index 0000000..b0fe0ac --- /dev/null +++ b/.dev_scripts/linter.sh @@ -0,0 +1,3 @@ +yapf -r -i mmdet/ configs/ tests/ tools/ +isort -rc mmdet/ configs/ tests/ tools/ +flake8 . diff --git a/.dev_scripts/test_benchmark.sh b/.dev_scripts/test_benchmark.sh new file mode 100644 index 0000000..cb79950 --- /dev/null +++ b/.dev_scripts/test_benchmark.sh @@ -0,0 +1,119 @@ +PARTITION=$1 +CHECKPOINT_DIR=$2 + +echo 'configs/atss/atss_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION atss_r50_fpn_1x_coco configs/atss/atss_r50_fpn_1x_coco.py $CHECKPOINT_DIR/atss_r50_fpn_1x_coco_20200209-985f7bd0.pth --work-dir tools/batch_test/atss_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29666 & +echo 'configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION autoassign_r50_fpn_8x2_1x_coco configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py $CHECKPOINT_DIR/auto_assign_r50_fpn_1x_coco_20210413_115540-5e17991f.pth --work-dir tools/batch_test/autoassign_r50_fpn_8x2_1x_coco --eval bbox --cfg-option dist_params.port=29667 & +echo 'configs/carafe/faster_rcnn_r50_fpn_carafe_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION faster_rcnn_r50_fpn_carafe_1x_coco configs/carafe/faster_rcnn_r50_fpn_carafe_1x_coco.py $CHECKPOINT_DIR/faster_rcnn_r50_fpn_carafe_1x_coco_bbox_mAP-0.386_20200504_175733-385a75b7.pth --work-dir tools/batch_test/faster_rcnn_r50_fpn_carafe_1x_coco --eval bbox --cfg-option dist_params.port=29668 & +echo 'configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION cascade_rcnn_r50_fpn_1x_coco configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py $CHECKPOINT_DIR/cascade_rcnn_r50_fpn_1x_coco_20200316-3dc56deb.pth --work-dir tools/batch_test/cascade_rcnn_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29669 & +echo 'configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION cascade_mask_rcnn_r50_fpn_1x_coco configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py $CHECKPOINT_DIR/cascade_mask_rcnn_r50_fpn_1x_coco_20200203-9d4dcb24.pth --work-dir tools/batch_test/cascade_mask_rcnn_r50_fpn_1x_coco --eval bbox segm --cfg-option dist_params.port=29670 & +echo 'configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION crpn_faster_rcnn_r50_caffe_fpn_1x_coco configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py $CHECKPOINT_DIR/crpn_faster_rcnn_r50_caffe_fpn_1x_coco-c8283cca.pth --work-dir tools/batch_test/crpn_faster_rcnn_r50_caffe_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29671 & +echo 'configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION centripetalnet_hourglass104_mstest_16x6_210e_coco configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py $CHECKPOINT_DIR/centripetalnet_hourglass104_mstest_16x6_210e_coco_20200915_204804-3ccc61e5.pth --work-dir tools/batch_test/centripetalnet_hourglass104_mstest_16x6_210e_coco --eval bbox --cfg-option dist_params.port=29672 & +echo 'configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION cornernet_hourglass104_mstest_8x6_210e_coco configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py $CHECKPOINT_DIR/cornernet_hourglass104_mstest_8x6_210e_coco_20200825_150618-79b44c30.pth --work-dir tools/batch_test/cornernet_hourglass104_mstest_8x6_210e_coco --eval bbox --cfg-option dist_params.port=29673 & +echo 'configs/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco configs/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py $CHECKPOINT_DIR/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200130-d68aed1e.pth --work-dir tools/batch_test/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco --eval bbox --cfg-option dist_params.port=29674 & +echo 'configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION deformable_detr_r50_16x2_50e_coco configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py $CHECKPOINT_DIR/deformable_detr_r50_16x2_50e_coco_20210419_220030-a12b9512.pth --work-dir tools/batch_test/deformable_detr_r50_16x2_50e_coco --eval bbox --cfg-option dist_params.port=29675 & +echo 'configs/detectors/detectors_htc_r50_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION detectors_htc_r50_1x_coco configs/detectors/detectors_htc_r50_1x_coco.py $CHECKPOINT_DIR/detectors_htc_r50_1x_coco-329b1453.pth --work-dir tools/batch_test/detectors_htc_r50_1x_coco --eval bbox segm --cfg-option dist_params.port=29676 & +echo 'configs/detr/detr_r50_8x2_150e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION detr_r50_8x2_150e_coco configs/detr/detr_r50_8x2_150e_coco.py $CHECKPOINT_DIR/detr_r50_8x2_150e_coco_20201130_194835-2c4b8974.pth --work-dir tools/batch_test/detr_r50_8x2_150e_coco --eval bbox --cfg-option dist_params.port=29677 & +echo 'configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION dh_faster_rcnn_r50_fpn_1x_coco configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py $CHECKPOINT_DIR/dh_faster_rcnn_r50_fpn_1x_coco_20200130-586b67df.pth --work-dir tools/batch_test/dh_faster_rcnn_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29678 & +echo 'configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION dynamic_rcnn_r50_fpn_1x_coco configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py $CHECKPOINT_DIR/dynamic_rcnn_r50_fpn_1x-62a3f276.pth --work-dir tools/batch_test/dynamic_rcnn_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29679 & +echo 'configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION faster_rcnn_r50_fpn_attention_1111_1x_coco configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco.py $CHECKPOINT_DIR/faster_rcnn_r50_fpn_attention_1111_1x_coco_20200130-403cccba.pth --work-dir tools/batch_test/faster_rcnn_r50_fpn_attention_1111_1x_coco --eval bbox --cfg-option dist_params.port=29680 & +echo 'configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION faster_rcnn_r50_fpn_1x_coco configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py $CHECKPOINT_DIR/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth --work-dir tools/batch_test/faster_rcnn_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29681 & +echo 'configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco.py $CHECKPOINT_DIR/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco-0a0d75a8.pth --work-dir tools/batch_test/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco --eval bbox --cfg-option dist_params.port=29682 & +echo 'configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION fovea_align_r50_fpn_gn-head_4x4_2x_coco configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py $CHECKPOINT_DIR/fovea_align_r50_fpn_gn-head_4x4_2x_coco_20200203-8987880d.pth --work-dir tools/batch_test/fovea_align_r50_fpn_gn-head_4x4_2x_coco --eval bbox --cfg-option dist_params.port=29683 & +echo 'configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION retinanet_free_anchor_r50_fpn_1x_coco configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py $CHECKPOINT_DIR/retinanet_free_anchor_r50_fpn_1x_coco_20200130-0f67375f.pth --work-dir tools/batch_test/retinanet_free_anchor_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29684 & +echo 'configs/fsaf/fsaf_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION fsaf_r50_fpn_1x_coco configs/fsaf/fsaf_r50_fpn_1x_coco.py $CHECKPOINT_DIR/fsaf_r50_fpn_1x_coco-94ccc51f.pth --work-dir tools/batch_test/fsaf_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29685 & +echo 'configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py $CHECKPOINT_DIR/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200202-587b99aa.pth --work-dir tools/batch_test/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco --eval bbox segm --cfg-option dist_params.port=29686 & +echo 'configs/gfl/gfl_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION gfl_r50_fpn_1x_coco configs/gfl/gfl_r50_fpn_1x_coco.py $CHECKPOINT_DIR/gfl_r50_fpn_1x_coco_20200629_121244-25944287.pth --work-dir tools/batch_test/gfl_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29687 & +echo 'configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION mask_rcnn_r50_fpn_gn-all_2x_coco configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py $CHECKPOINT_DIR/mask_rcnn_r50_fpn_gn-all_2x_coco_20200206-8eee02a6.pth --work-dir tools/batch_test/mask_rcnn_r50_fpn_gn-all_2x_coco --eval bbox segm --cfg-option dist_params.port=29688 & +echo 'configs/gn+ws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION faster_rcnn_r50_fpn_gn_ws-all_1x_coco configs/gn+ws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py $CHECKPOINT_DIR/faster_rcnn_r50_fpn_gn_ws-all_1x_coco_20200130-613d9fe2.pth --work-dir tools/batch_test/faster_rcnn_r50_fpn_gn_ws-all_1x_coco --eval bbox --cfg-option dist_params.port=29689 & +echo 'configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION grid_rcnn_r50_fpn_gn-head_2x_coco configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py $CHECKPOINT_DIR/grid_rcnn_r50_fpn_gn-head_2x_coco_20200130-6cca8223.pth --work-dir tools/batch_test/grid_rcnn_r50_fpn_gn-head_2x_coco --eval bbox --cfg-option dist_params.port=29690 & +echo 'configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION faster_rcnn_r50_fpn_groie_1x_coco configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py $CHECKPOINT_DIR/faster_rcnn_r50_fpn_groie_1x_coco_20200604_211715-66ee9516.pth --work-dir tools/batch_test/faster_rcnn_r50_fpn_groie_1x_coco --eval bbox --cfg-option dist_params.port=29691 & +echo 'configs/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION ga_retinanet_r50_caffe_fpn_1x_coco configs/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco.py $CHECKPOINT_DIR/ga_retinanet_r50_caffe_fpn_1x_coco_20201020-39581c6f.pth --work-dir tools/batch_test/ga_retinanet_r50_caffe_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29692 & +echo 'configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION ga_faster_r50_caffe_fpn_1x_coco configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py $CHECKPOINT_DIR/ga_faster_r50_caffe_fpn_1x_coco_20200702_000718-a11ccfe6.pth --work-dir tools/batch_test/ga_faster_r50_caffe_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29693 & +echo 'configs/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION faster_rcnn_hrnetv2p_w18_1x_coco configs/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco.py $CHECKPOINT_DIR/faster_rcnn_hrnetv2p_w18_1x_coco_20200130-56651a6d.pth --work-dir tools/batch_test/faster_rcnn_hrnetv2p_w18_1x_coco --eval bbox --cfg-option dist_params.port=29694 & +echo 'configs/htc/htc_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION htc_r50_fpn_1x_coco configs/htc/htc_r50_fpn_1x_coco.py $CHECKPOINT_DIR/htc_r50_fpn_1x_coco_20200317-7332cf16.pth --work-dir tools/batch_test/htc_r50_fpn_1x_coco --eval bbox segm --cfg-option dist_params.port=29695 & +echo 'configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION libra_faster_rcnn_r50_fpn_1x_coco configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py $CHECKPOINT_DIR/libra_faster_rcnn_r50_fpn_1x_coco_20200130-3afee3a9.pth --work-dir tools/batch_test/libra_faster_rcnn_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29696 & +echo 'configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION mask_rcnn_r50_fpn_1x_coco configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py $CHECKPOINT_DIR/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth --work-dir tools/batch_test/mask_rcnn_r50_fpn_1x_coco --eval bbox segm --cfg-option dist_params.port=29697 & +echo 'configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION ms_rcnn_r50_caffe_fpn_1x_coco configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py $CHECKPOINT_DIR/ms_rcnn_r50_caffe_fpn_1x_coco_20200702_180848-61c9355e.pth --work-dir tools/batch_test/ms_rcnn_r50_caffe_fpn_1x_coco --eval bbox segm --cfg-option dist_params.port=29698 & +echo 'configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py $CHECKPOINT_DIR/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco_20200520-1bdba3ce.pth --work-dir tools/batch_test/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco --eval bbox --cfg-option dist_params.port=29699 & +echo 'configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION retinanet_r50_nasfpn_crop640_50e_coco configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py $CHECKPOINT_DIR/retinanet_r50_nasfpn_crop640_50e_coco-0ad1f644.pth --work-dir tools/batch_test/retinanet_r50_nasfpn_crop640_50e_coco --eval bbox --cfg-option dist_params.port=29700 & +echo 'configs/paa/paa_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION paa_r50_fpn_1x_coco configs/paa/paa_r50_fpn_1x_coco.py $CHECKPOINT_DIR/paa_r50_fpn_1x_coco_20200821-936edec3.pth --work-dir tools/batch_test/paa_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29701 & +echo 'configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION faster_rcnn_r50_pafpn_1x_coco configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py $CHECKPOINT_DIR/faster_rcnn_r50_pafpn_1x_coco_bbox_mAP-0.375_20200503_105836-b7b4b9bd.pth --work-dir tools/batch_test/faster_rcnn_r50_pafpn_1x_coco --eval bbox --cfg-option dist_params.port=29702 & +echo 'configs/pisa/pisa_faster_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION pisa_faster_rcnn_r50_fpn_1x_coco configs/pisa/pisa_faster_rcnn_r50_fpn_1x_coco.py $CHECKPOINT_DIR/pisa_faster_rcnn_r50_fpn_1x_coco-dea93523.pth --work-dir tools/batch_test/pisa_faster_rcnn_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29703 & +echo 'configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION point_rend_r50_caffe_fpn_mstrain_1x_coco configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py $CHECKPOINT_DIR/point_rend_r50_caffe_fpn_mstrain_1x_coco-1bcb5fb4.pth --work-dir tools/batch_test/point_rend_r50_caffe_fpn_mstrain_1x_coco --eval bbox segm --cfg-option dist_params.port=29704 & +echo 'configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION mask_rcnn_regnetx-3.2GF_fpn_1x_coco configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py $CHECKPOINT_DIR/mask_rcnn_regnetx-3.2GF_fpn_1x_coco_20200520_163141-2a9d1814.pth --work-dir tools/batch_test/mask_rcnn_regnetx-3.2GF_fpn_1x_coco --eval bbox segm --cfg-option dist_params.port=29705 & +echo 'configs/reppoints/reppoints_moment_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION reppoints_moment_r50_fpn_1x_coco configs/reppoints/reppoints_moment_r50_fpn_1x_coco.py $CHECKPOINT_DIR/reppoints_moment_r50_fpn_1x_coco_20200330-b73db8d1.pth --work-dir tools/batch_test/reppoints_moment_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29706 & +echo 'configs/res2net/faster_rcnn_r2_101_fpn_2x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION faster_rcnn_r2_101_fpn_2x_coco configs/res2net/faster_rcnn_r2_101_fpn_2x_coco.py $CHECKPOINT_DIR/faster_rcnn_r2_101_fpn_2x_coco-175f1da6.pth --work-dir tools/batch_test/faster_rcnn_r2_101_fpn_2x_coco --eval bbox --cfg-option dist_params.port=29707 & +echo 'configs/resnest/faster_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION faster_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco configs/resnest/faster_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py $CHECKPOINT_DIR/faster_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco_20200926_125502-20289c16.pth --work-dir tools/batch_test/faster_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco --eval bbox --cfg-option dist_params.port=29708 & +echo 'configs/retinanet/retinanet_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION retinanet_r50_fpn_1x_coco configs/retinanet/retinanet_r50_fpn_1x_coco.py $CHECKPOINT_DIR/retinanet_r50_fpn_1x_coco_20200130-c2398f9e.pth --work-dir tools/batch_test/retinanet_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29709 & +echo 'configs/rpn/rpn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION rpn_r50_fpn_1x_coco configs/rpn/rpn_r50_fpn_1x_coco.py $CHECKPOINT_DIR/rpn_r50_fpn_1x_coco_20200218-5525fa2e.pth --work-dir tools/batch_test/rpn_r50_fpn_1x_coco --eval proposal_fast --cfg-option dist_params.port=29710 & +echo 'configs/sabl/sabl_retinanet_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION sabl_retinanet_r50_fpn_1x_coco configs/sabl/sabl_retinanet_r50_fpn_1x_coco.py $CHECKPOINT_DIR/sabl_retinanet_r50_fpn_1x_coco-6c54fd4f.pth --work-dir tools/batch_test/sabl_retinanet_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29711 & +echo 'configs/sabl/sabl_faster_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION sabl_faster_rcnn_r50_fpn_1x_coco configs/sabl/sabl_faster_rcnn_r50_fpn_1x_coco.py $CHECKPOINT_DIR/sabl_faster_rcnn_r50_fpn_1x_coco-e867595b.pth --work-dir tools/batch_test/sabl_faster_rcnn_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29712 & +echo 'configs/scnet/scnet_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION scnet_r50_fpn_1x_coco configs/scnet/scnet_r50_fpn_1x_coco.py $CHECKPOINT_DIR/scnet_r50_fpn_1x_coco-c3f09857.pth --work-dir tools/batch_test/scnet_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29713 & +echo 'configs/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION sparse_rcnn_r50_fpn_1x_coco configs/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco.py $CHECKPOINT_DIR/sparse_rcnn_r50_fpn_1x_coco_20201222_214453-dc79b137.pth --work-dir tools/batch_test/sparse_rcnn_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29714 & +echo 'configs/ssd/ssd300_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION ssd300_coco configs/ssd/ssd300_coco.py $CHECKPOINT_DIR/ssd300_coco_20210803_015428-d231a06e.pth --work-dir tools/batch_test/ssd300_coco --eval bbox --cfg-option dist_params.port=29715 & +echo 'configs/tridentnet/tridentnet_r50_caffe_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION tridentnet_r50_caffe_1x_coco configs/tridentnet/tridentnet_r50_caffe_1x_coco.py $CHECKPOINT_DIR/tridentnet_r50_caffe_1x_coco_20201230_141838-2ec0b530.pth --work-dir tools/batch_test/tridentnet_r50_caffe_1x_coco --eval bbox --cfg-option dist_params.port=29716 & +echo 'configs/vfnet/vfnet_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION vfnet_r50_fpn_1x_coco configs/vfnet/vfnet_r50_fpn_1x_coco.py $CHECKPOINT_DIR/vfnet_r50_fpn_1x_coco_20201027-38db6f58.pth --work-dir tools/batch_test/vfnet_r50_fpn_1x_coco --eval bbox --cfg-option dist_params.port=29717 & +echo 'configs/yolact/yolact_r50_1x8_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION yolact_r50_1x8_coco configs/yolact/yolact_r50_1x8_coco.py $CHECKPOINT_DIR/yolact_r50_1x8_coco_20200908-f38d58df.pth --work-dir tools/batch_test/yolact_r50_1x8_coco --eval bbox segm --cfg-option dist_params.port=29718 & +echo 'configs/yolo/yolov3_d53_320_273e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION yolov3_d53_320_273e_coco configs/yolo/yolov3_d53_320_273e_coco.py $CHECKPOINT_DIR/yolov3_d53_320_273e_coco-421362b6.pth --work-dir tools/batch_test/yolov3_d53_320_273e_coco --eval bbox --cfg-option dist_params.port=29719 & +echo 'configs/yolof/yolof_r50_c5_8x8_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION yolof_r50_c5_8x8_1x_coco configs/yolof/yolof_r50_c5_8x8_1x_coco.py $CHECKPOINT_DIR/yolof_r50_c5_8x8_1x_coco_20210425_024427-8e864411.pth --work-dir tools/batch_test/yolof_r50_c5_8x8_1x_coco --eval bbox --cfg-option dist_params.port=29720 & +echo 'configs/centernet/centernet_resnet18_dcnv2_140e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION centernet_resnet18_dcnv2_140e_coco configs/centernet/centernet_resnet18_dcnv2_140e_coco.py $CHECKPOINT_DIR/centernet_resnet18_dcnv2_140e_coco_20210702_155131-c8cd631f.pth --work-dir tools/batch_test/centernet_resnet18_dcnv2_140e_coco --eval bbox --cfg-option dist_params.port=29721 & +echo 'configs/yolox/yolox_tiny_8x8_300e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION yolox_tiny_8x8_300e_coco configs/yolox/yolox_tiny_8x8_300e_coco.py $CHECKPOINT_DIR/yolox_tiny_8x8_300e_coco_20210806_234250-4ff3b67e.pth --work-dir tools/batch_test/yolox_tiny_8x8_300e_coco --eval bbox --cfg-option dist_params.port=29722 & +echo 'configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 tools/slurm_test.sh $PARTITION ssdlite_mobilenetv2_scratch_600e_coco configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco.py $CHECKPOINT_DIR/ssdlite_mobilenetv2_scratch_600e_coco_20210629_110627-974d9307.pth --work-dir tools/batch_test/ssdlite_mobilenetv2_scratch_600e_coco --eval bbox --cfg-option dist_params.port=29723 & diff --git a/.dev_scripts/test_init_backbone.py b/.dev_scripts/test_init_backbone.py new file mode 100644 index 0000000..862f4af --- /dev/null +++ b/.dev_scripts/test_init_backbone.py @@ -0,0 +1,181 @@ +# Copyright (c) OpenMMLab. All rights reserved. +"""Check out backbone whether successfully load pretrained checkpoint.""" +import copy +import os +from os.path import dirname, exists, join + +import pytest +from mmcv import Config, ProgressBar +from mmcv.runner import _load_checkpoint + +from mmdet.models import build_detector + + +def _get_config_directory(): + """Find the predefined detector config directory.""" + try: + # Assume we are running in the source mmdetection repo + repo_dpath = dirname(dirname(__file__)) + except NameError: + # For IPython development when this __file__ is not defined + import mmdet + repo_dpath = dirname(dirname(mmdet.__file__)) + config_dpath = join(repo_dpath, 'configs') + if not exists(config_dpath): + raise Exception('Cannot find config path') + return config_dpath + + +def _get_config_module(fname): + """Load a configuration as a python module.""" + from mmcv import Config + config_dpath = _get_config_directory() + config_fpath = join(config_dpath, fname) + config_mod = Config.fromfile(config_fpath) + return config_mod + + +def _get_detector_cfg(fname): + """Grab configs necessary to create a detector. + + These are deep copied to allow for safe modification of parameters without + influencing other tests. + """ + config = _get_config_module(fname) + model = copy.deepcopy(config.model) + return model + + +def _traversed_config_file(): + """We traversed all potential config files under the `config` file. If you + need to print details or debug code, you can use this function. + + If the `backbone.init_cfg` is None (do not use `Pretrained` init way), you + need add the folder name in `ignores_folder` (if the config files in this + folder all set backbone.init_cfg is None) or add config name in + `ignores_file` (if the config file set backbone.init_cfg is None) + """ + config_path = _get_config_directory() + check_cfg_names = [] + + # `base`, `legacy_1.x` and `common` ignored by default. + ignores_folder = ['_base_', 'legacy_1.x', 'common'] + # 'ld' need load teacher model, if want to check 'ld', + # please check teacher_config path first. + ignores_folder += ['ld'] + # `selfsup_pretrain` need convert model, if want to check this model, + # need to convert the model first. + ignores_folder += ['selfsup_pretrain'] + + # the `init_cfg` in 'centripetalnet', 'cornernet', 'cityscapes', + # 'scratch' is None. + # the `init_cfg` in ssdlite(`ssdlite_mobilenetv2_scratch_600e_coco.py`) + # is None + # Please confirm `bockbone.init_cfg` is None first. + ignores_folder += ['centripetalnet', 'cornernet', 'cityscapes', 'scratch'] + ignores_file = ['ssdlite_mobilenetv2_scratch_600e_coco.py'] + + for config_file_name in os.listdir(config_path): + if config_file_name not in ignores_folder: + config_file = join(config_path, config_file_name) + if os.path.isdir(config_file): + for config_sub_file in os.listdir(config_file): + if config_sub_file.endswith('py') and \ + config_sub_file not in ignores_file: + name = join(config_file, config_sub_file) + check_cfg_names.append(name) + return check_cfg_names + + +def _check_backbone(config, print_cfg=True): + """Check out backbone whether successfully load pretrained model, by using + `backbone.init_cfg`. + + First, using `mmcv._load_checkpoint` to load the checkpoint without + loading models. + Then, using `build_detector` to build models, and using + `model.init_weights()` to initialize the parameters. + Finally, assert weights and bias of each layer loaded from pretrained + checkpoint are equal to the weights and bias of original checkpoint. + For the convenience of comparison, we sum up weights and bias of + each loaded layer separately. + + Args: + config (str): Config file path. + print_cfg (bool): Whether print logger and return the result. + + Returns: + results (str or None): If backbone successfully load pretrained + checkpoint, return None; else, return config file path. + """ + if print_cfg: + print('-' * 15 + 'loading ', config) + cfg = Config.fromfile(config) + init_cfg = None + try: + init_cfg = cfg.model.backbone.init_cfg + init_flag = True + except AttributeError: + init_flag = False + if init_cfg is None or init_cfg.get('type') != 'Pretrained': + init_flag = False + if init_flag: + checkpoint = _load_checkpoint(init_cfg.checkpoint) + if 'state_dict' in checkpoint: + state_dict = checkpoint['state_dict'] + else: + state_dict = checkpoint + + model = build_detector( + cfg.model, + train_cfg=cfg.get('train_cfg'), + test_cfg=cfg.get('test_cfg')) + model.init_weights() + + checkpoint_layers = state_dict.keys() + for name, value in model.backbone.state_dict().items(): + if name in checkpoint_layers: + assert value.equal(state_dict[name]) + + if print_cfg: + print('-' * 10 + 'Successfully load checkpoint' + '-' * 10 + + '\n', ) + return None + else: + if print_cfg: + print(config + '\n' + '-' * 10 + + 'config file do not have init_cfg' + '-' * 10 + '\n') + return config + + +@pytest.mark.parametrize('config', _traversed_config_file()) +def test_load_pretrained(config): + """Check out backbone whether successfully load pretrained model by using + `backbone.init_cfg`. + + Details please refer to `_check_backbone` + """ + _check_backbone(config, print_cfg=False) + + +def _test_load_pretrained(): + """We traversed all potential config files under the `config` file. If you + need to print details or debug code, you can use this function. + + Returns: + check_cfg_names (list[str]): Config files that backbone initialized + from pretrained checkpoint might be problematic. Need to recheck + the config file. The output including the config files that the + backbone.init_cfg is None + """ + check_cfg_names = _traversed_config_file() + need_check_cfg = [] + + prog_bar = ProgressBar(len(check_cfg_names)) + for config in check_cfg_names: + init_cfg_name = _check_backbone(config) + if init_cfg_name is not None: + need_check_cfg.append(init_cfg_name) + prog_bar.update() + print('These config files need to be checked again') + print(need_check_cfg) diff --git a/.dev_scripts/train_benchmark.sh b/.dev_scripts/train_benchmark.sh new file mode 100644 index 0000000..dc30be9 --- /dev/null +++ b/.dev_scripts/train_benchmark.sh @@ -0,0 +1,134 @@ +echo 'configs/atss/atss_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab atss_r50_fpn_1x_coco configs/atss/atss_r50_fpn_1x_coco.py ./tools/work_dir/atss_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab autoassign_r50_fpn_8x2_1x_coco configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py ./tools/work_dir/autoassign_r50_fpn_8x2_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab cascade_mask_rcnn_r50_fpn_1x_coco configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py ./tools/work_dir/cascade_mask_rcnn_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab crpn_faster_rcnn_r50_caffe_fpn_1x_coco configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py ./tools/work_dir/crpn_faster_rcnn_r50_caffe_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/centernet/centernet_resnet18_dcnv2_140e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab centernet_resnet18_dcnv2_140e_coco configs/centernet/centernet_resnet18_dcnv2_140e_coco.py ./tools/work_dir/centernet_resnet18_dcnv2_140e_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py' & +GPUS=16 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab centripetalnet_hourglass104_mstest_16x6_210e_coco configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py ./tools/work_dir/centripetalnet_hourglass104_mstest_16x6_210e_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab cornernet_hourglass104_mstest_8x6_210e_coco configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py ./tools/work_dir/cornernet_hourglass104_mstest_8x6_210e_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/detectors/detectors_htc_r50_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab detectors_htc_r50_1x_coco configs/detectors/detectors_htc_r50_1x_coco.py ./tools/work_dir/detectors_htc_r50_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py' & +GPUS=16 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab deformable_detr_r50_16x2_50e_coco configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py ./tools/work_dir/deformable_detr_r50_16x2_50e_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/detr/detr_r50_8x2_150e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab detr_r50_8x2_150e_coco configs/detr/detr_r50_8x2_150e_coco.py ./tools/work_dir/detr_r50_8x2_150e_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab dh_faster_rcnn_r50_fpn_1x_coco configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py ./tools/work_dir/dh_faster_rcnn_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab dynamic_rcnn_r50_fpn_1x_coco configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py ./tools/work_dir/dynamic_rcnn_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab faster_rcnn_r50_fpn_1x_coco configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py ./tools/work_dir/faster_rcnn_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab faster_rcnn_r50_caffe_dc5_mstrain_1x_coco configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py ./tools/work_dir/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab faster_rcnn_r50_caffe_fpn_mstrain_1x_coco configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py ./tools/work_dir/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab faster_rcnn_r50_caffe_fpn_1x_coco configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py ./tools/work_dir/faster_rcnn_r50_caffe_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/faster_rcnn/faster_rcnn_r50_fpn_ohem_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab faster_rcnn_r50_fpn_ohem_1x_coco configs/faster_rcnn/faster_rcnn_r50_fpn_ohem_1x_coco.py ./tools/work_dir/faster_rcnn_r50_fpn_ohem_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab fovea_align_r50_fpn_gn-head_4x4_2x_coco configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py ./tools/work_dir/fovea_align_r50_fpn_gn-head_4x4_2x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/mask_rcnn/mask_rcnn_r50_fpn_fp16_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_r50_fpn_fp16_1x_coco configs/mask_rcnn/mask_rcnn_r50_fpn_fp16_1x_coco.py ./tools/work_dir/mask_rcnn_r50_fpn_fp16_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/retinanet/retinanet_r50_fpn_fp16_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab retinanet_r50_fpn_fp16_1x_coco configs/retinanet/retinanet_r50_fpn_fp16_1x_coco.py ./tools/work_dir/retinanet_r50_fpn_fp16_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab retinanet_free_anchor_r50_fpn_1x_coco configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py ./tools/work_dir/retinanet_free_anchor_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/fsaf/fsaf_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab fsaf_r50_fpn_1x_coco configs/fsaf/fsaf_r50_fpn_1x_coco.py ./tools/work_dir/fsaf_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/gfl/gfl_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab gfl_r50_fpn_1x_coco configs/gfl/gfl_r50_fpn_1x_coco.py ./tools/work_dir/gfl_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/ghm/retinanet_ghm_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab retinanet_ghm_r50_fpn_1x_coco configs/ghm/retinanet_ghm_r50_fpn_1x_coco.py ./tools/work_dir/retinanet_ghm_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab grid_rcnn_r50_fpn_gn-head_2x_coco configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py ./tools/work_dir/grid_rcnn_r50_fpn_gn-head_2x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab ga_faster_r50_caffe_fpn_1x_coco configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py ./tools/work_dir/ga_faster_r50_caffe_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/htc/htc_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab htc_r50_fpn_1x_coco configs/htc/htc_r50_fpn_1x_coco.py ./tools/work_dir/htc_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/ld/ld_r18_gflv1_r101_fpn_coco_1x.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab ld_r18_gflv1_r101_fpn_coco_1x configs/ld/ld_r18_gflv1_r101_fpn_coco_1x.py ./tools/work_dir/ld_r18_gflv1_r101_fpn_coco_1x --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab libra_faster_rcnn_r50_fpn_1x_coco configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py ./tools/work_dir/libra_faster_rcnn_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py ./tools/work_dir/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab ms_rcnn_r50_caffe_fpn_1x_coco configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py ./tools/work_dir/ms_rcnn_r50_caffe_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py' & +GPUS=4 GPUS_PER_NODE=4 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py ./tools/work_dir/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/paa/paa_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab paa_r50_fpn_1x_coco configs/paa/paa_r50_fpn_1x_coco.py ./tools/work_dir/paa_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/pisa/pisa_mask_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab pisa_mask_rcnn_r50_fpn_1x_coco configs/pisa/pisa_mask_rcnn_r50_fpn_1x_coco.py ./tools/work_dir/pisa_mask_rcnn_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab point_rend_r50_caffe_fpn_mstrain_1x_coco configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py ./tools/work_dir/point_rend_r50_caffe_fpn_mstrain_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/reppoints/reppoints_moment_r50_fpn_gn-neck+head_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab reppoints_moment_r50_fpn_gn-neck+head_1x_coco configs/reppoints/reppoints_moment_r50_fpn_gn-neck+head_1x_coco.py ./tools/work_dir/reppoints_moment_r50_fpn_gn-neck+head_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/retinanet/retinanet_r50_caffe_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab retinanet_r50_caffe_fpn_1x_coco configs/retinanet/retinanet_r50_caffe_fpn_1x_coco.py ./tools/work_dir/retinanet_r50_caffe_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/rpn/rpn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab rpn_r50_fpn_1x_coco configs/rpn/rpn_r50_fpn_1x_coco.py ./tools/work_dir/rpn_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/sabl/sabl_retinanet_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab sabl_retinanet_r50_fpn_1x_coco configs/sabl/sabl_retinanet_r50_fpn_1x_coco.py ./tools/work_dir/sabl_retinanet_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/ssd/ssd300_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab ssd300_coco configs/ssd/ssd300_coco.py ./tools/work_dir/ssd300_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/tridentnet/tridentnet_r50_caffe_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab tridentnet_r50_caffe_1x_coco configs/tridentnet/tridentnet_r50_caffe_1x_coco.py ./tools/work_dir/tridentnet_r50_caffe_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/vfnet/vfnet_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab vfnet_r50_fpn_1x_coco configs/vfnet/vfnet_r50_fpn_1x_coco.py ./tools/work_dir/vfnet_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/yolact/yolact_r50_8x8_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab yolact_r50_8x8_coco configs/yolact/yolact_r50_8x8_coco.py ./tools/work_dir/yolact_r50_8x8_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/yolo/yolov3_d53_320_273e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab yolov3_d53_320_273e_coco configs/yolo/yolov3_d53_320_273e_coco.py ./tools/work_dir/yolov3_d53_320_273e_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab sparse_rcnn_r50_fpn_1x_coco configs/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco.py ./tools/work_dir/sparse_rcnn_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/scnet/scnet_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab scnet_r50_fpn_1x_coco configs/scnet/scnet_r50_fpn_1x_coco.py ./tools/work_dir/scnet_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/yolof/yolof_r50_c5_8x8_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab yolof_r50_c5_8x8_1x_coco configs/yolof/yolof_r50_c5_8x8_1x_coco.py ./tools/work_dir/yolof_r50_c5_8x8_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/carafe/mask_rcnn_r50_fpn_carafe_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_r50_fpn_carafe_1x_coco configs/carafe/mask_rcnn_r50_fpn_carafe_1x_coco.py ./tools/work_dir/mask_rcnn_r50_fpn_carafe_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/dcn/faster_rcnn_r50_fpn_mdpool_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab faster_rcnn_r50_fpn_mdpool_1x_coco configs/dcn/faster_rcnn_r50_fpn_mdpool_1x_coco.py ./tools/work_dir/faster_rcnn_r50_fpn_mdpool_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco configs/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py ./tools/work_dir/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/dcn/faster_rcnn_r50_fpn_dpool_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab faster_rcnn_r50_fpn_dpool_1x_coco configs/dcn/faster_rcnn_r50_fpn_dpool_1x_coco.py ./tools/work_dir/faster_rcnn_r50_fpn_dpool_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/dcn/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco configs/dcn/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py ./tools/work_dir/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco.py ./tools/work_dir/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco configs/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco.py ./tools/work_dir/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_r50_fpn_gn-all_2x_coco configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py ./tools/work_dir/mask_rcnn_r50_fpn_gn-all_2x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_r50_fpn_gn_ws-all_2x_coco configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py ./tools/work_dir/mask_rcnn_r50_fpn_gn_ws-all_2x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_hrnetv2p_w18_1x_coco configs/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco.py ./tools/work_dir/mask_rcnn_hrnetv2p_w18_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab faster_rcnn_r50_pafpn_1x_coco configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py ./tools/work_dir/faster_rcnn_r50_pafpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab retinanet_r50_nasfpn_crop640_50e_coco configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py ./tools/work_dir/retinanet_r50_nasfpn_crop640_50e_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_regnetx-3.2GF_fpn_1x_coco configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py ./tools/work_dir/mask_rcnn_regnetx-3.2GF_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/resnest/mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco configs/resnest/mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco.py ./tools/work_dir/mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/res2net/faster_rcnn_r2_101_fpn_2x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab faster_rcnn_r2_101_fpn_2x_coco configs/res2net/faster_rcnn_r2_101_fpn_2x_coco.py ./tools/work_dir/faster_rcnn_r2_101_fpn_2x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab faster_rcnn_r50_fpn_groie_1x_coco configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py ./tools/work_dir/faster_rcnn_r50_fpn_groie_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/cityscapes/mask_rcnn_r50_fpn_1x_cityscapes.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab mask_rcnn_r50_fpn_1x_cityscapes configs/cityscapes/mask_rcnn_r50_fpn_1x_cityscapes.py ./tools/work_dir/mask_rcnn_r50_fpn_1x_cityscapes --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab panoptic_fpn_r50_fpn_1x_coco configs/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco.py ./tools/work_dir/panoptic_fpn_r50_fpn_1x_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/yolox/yolox_tiny_8x8_300e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab yolox_tiny_8x8_300e_coco configs/yolox/yolox_tiny_8x8_300e_coco.py ./tools/work_dir/yolox_tiny_8x8_300e_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & +echo 'configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco.py' & +GPUS=8 GPUS_PER_NODE=8 CPUS_PER_TASK=2 ./tools/slurm_train.sh openmmlab ssdlite_mobilenetv2_scratch_600e_coco configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco.py ./tools/work_dir/ssdlite_mobilenetv2_scratch_600e_coco --cfg-options checkpoint_config.max_keep_ckpts=1 >/dev/null & diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..92afad1 --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +- The use of sexualized language or imagery and unwelcome sexual attention or + advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic + address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at chenkaidev@gmail.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq + +[homepage]: https://www.contributor-covenant.org diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..c669626 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1 @@ +We appreciate all contributions to improve MMDetection. Please refer to [CONTRIBUTING.md](https://github.com/open-mmlab/mmcv/blob/master/CONTRIBUTING.md) in MMCV for more details about the contributing guideline. diff --git a/.github/ISSUE_TEMPLATE/1-bug-report.yml b/.github/ISSUE_TEMPLATE/1-bug-report.yml new file mode 100644 index 0000000..4199391 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1-bug-report.yml @@ -0,0 +1,105 @@ +name: "🐞 Bug report" +description: "Create a report to help us reproduce and fix the bug" +labels: "kind/bug,status/unconfirmed" +title: "[Bug] " + +body: + - type: markdown + attributes: + value: | + If you have already identified the reason, we strongly appreciate you creating a new PR to fix it [here](https://github.com/open-mmlab/mmdetection/pulls)! + If this issue is about installing MMCV, please file an issue at [MMCV](https://github.com/open-mmlab/mmcv/issues/new/choose). + If you need our help, please fill in as much of the following form as you're able to. + + **The less clear the description, the longer it will take to solve it.** + + - type: checkboxes + attributes: + label: Prerequisite + description: Please check the following items before creating a new issue. + options: + - label: I have searched [Issues](https://github.com/open-mmlab/mmdetection/issues) and [Discussions](https://github.com/open-mmlab/mmdetection/discussions) but cannot get the expected help. + required: true + - label: I have read the [FAQ documentation](https://mmdetection.readthedocs.io/en/latest/faq.html) but cannot get the expected help. + required: true + - label: The bug has not been fixed in the [latest version (master)](https://github.com/open-mmlab/mmdetection) or [latest version (3.x)](https://github.com/open-mmlab/mmdetection/tree/dev-3.x). + required: true + + - type: dropdown + id: task + attributes: + label: Task + description: The problem arises when + options: + - I'm using the official example scripts/configs for the officially supported tasks/models/datasets. + - I have modified the scripts/configs, or I'm working on my own tasks/models/datasets. + validations: + required: true + + - type: dropdown + id: branch + attributes: + label: Branch + description: The problem arises when I'm working on + options: + - master branch https://github.com/open-mmlab/mmdetection + - 3.x branch https://github.com/open-mmlab/mmdetection/tree/3.x + validations: + required: true + + + - type: textarea + attributes: + label: Environment + description: | + Please run `python mmdet/utils/collect_env.py` to collect necessary environment information and copy-paste it here. + You may add additional information that may be helpful for locating the problem, such as + - How you installed PyTorch \[e.g., pip, conda, source\] + - Other environment variables that may be related (such as `$PATH`, `$LD_LIBRARY_PATH`, `$PYTHONPATH`, etc.) + validations: + required: true + + - type: textarea + attributes: + label: Reproduces the problem - code sample + description: | + Please provide a code sample that reproduces the problem you ran into. It can be a Colab link or just a code snippet. + placeholder: | + ```python + # Sample code to reproduce the problem + ``` + validations: + required: true + + - type: textarea + attributes: + label: Reproduces the problem - command or script + description: | + What command or script did you run? + placeholder: | + ```shell + The command or script you run. + ``` + validations: + required: true + + - type: textarea + attributes: + label: Reproduces the problem - error message + description: | + Please provide the error message or logs you got, with the full traceback. + placeholder: | + ``` + The error message or logs you got, with the full traceback. + ``` + validations: + required: true + + - type: textarea + attributes: + label: Additional information + description: Tell us anything else you think we should know. + placeholder: | + 1. What's your expected result? + 2. What dataset did you use? + 3. What do you think might be the reason? diff --git a/.github/ISSUE_TEMPLATE/2-feature-request.yml b/.github/ISSUE_TEMPLATE/2-feature-request.yml new file mode 100644 index 0000000..317f720 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/2-feature-request.yml @@ -0,0 +1,31 @@ +name: 🚀 Feature request +description: Suggest an idea for this project +labels: "kind/enhancement,status/unconfirmed" +title: "[Feature] " + +body: + - type: markdown + attributes: + value: | + We strongly appreciate you creating a PR to implement this feature [here](https://github.com/open-mmlab/mmdetection/pulls)! + If you need our help, please fill in as much of the following form as you're able to. + + **The less clear the description, the longer it will take to solve it.** + + - type: textarea + attributes: + label: What's the feature? + description: | + Tell us more about the feature and how this feature can help. + placeholder: | + E.g., It is inconvenient when \[....\]. + This feature can \[....\]. + validations: + required: true + + - type: textarea + attributes: + label: Any other context? + description: | + Have you considered any alternative solutions or features? If so, what are they? + Also, feel free to add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/3-new-model.yml b/.github/ISSUE_TEMPLATE/3-new-model.yml new file mode 100644 index 0000000..2346685 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/3-new-model.yml @@ -0,0 +1,32 @@ +name: "\U0001F31F New model/dataset/scheduler addition" +description: Submit a proposal/request to implement a new model / dataset / scheduler +labels: "kind/feature,status/unconfirmed" +title: "[New Models] " + + +body: + - type: textarea + id: description-request + validations: + required: true + attributes: + label: Model/Dataset/Scheduler description + description: | + Put any and all important information relative to the model/dataset/scheduler + + - type: checkboxes + attributes: + label: Open source status + description: | + Please provide the open-source status, which would be very helpful + options: + - label: "The model implementation is available" + - label: "The model weights are available." + + - type: textarea + id: additional-info + attributes: + label: Provide useful links for the implementation + description: | + Please provide information regarding the implementation, the weights, and the authors. + Please mention the authors by @gh-username if you're aware of their usernames. diff --git a/.github/ISSUE_TEMPLATE/4-documentation.yml b/.github/ISSUE_TEMPLATE/4-documentation.yml new file mode 100644 index 0000000..32a62e2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/4-documentation.yml @@ -0,0 +1,34 @@ +name: 📚 Documentation +description: Report an issue related to the documentation. +labels: "kind/doc,status/unconfirmed" +title: "[Docs] " + +body: +- type: dropdown + id: branch + attributes: + label: Branch + description: This issue is related to the + options: + - master branch https://mmdetection.readthedocs.io/en/latest/ + - 3.x branch https://mmdetection.readthedocs.io/en/3.x/ + validations: + required: true + +- type: textarea + attributes: + label: 📚 The doc issue + description: > + A clear and concise description the issue. + validations: + required: true + +- type: textarea + attributes: + label: Suggest a potential alternative/fix + description: > + Tell us how we could improve the documentation in this regard. +- type: markdown + attributes: + value: > + Thanks for contributing 🎉! diff --git a/.github/ISSUE_TEMPLATE/5-reimplementation.yml b/.github/ISSUE_TEMPLATE/5-reimplementation.yml new file mode 100644 index 0000000..ea41531 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/5-reimplementation.yml @@ -0,0 +1,89 @@ +name: "💥 Reimplementation Questions" +description: "Ask about questions during model reimplementation" +labels: "kind/enhancement,status/unconfirmed" +title: "[Reimplementation] " + +body: + - type: markdown + attributes: + value: | + We strongly appreciate you creating a PR to implement this feature [here](https://github.com/open-mmlab/mmdetection/pulls)! + If you need our help, please fill in as much of the following form as you're able to. + + **The less clear the description, the longer it will take to solve it.** + + - type: checkboxes + attributes: + label: Prerequisite + description: Please check the following items before creating a new issue. + options: + - label: I have searched [Issues](https://github.com/open-mmlab/mmdetection/issues) and [Discussions](https://github.com/open-mmlab/mmdetection/discussions) but cannot get the expected help. + required: true + - label: I have read the [FAQ documentation](https://mmdetection.readthedocs.io/en/latest/faq.html) but cannot get the expected help. + required: true + - label: The bug has not been fixed in the [latest version (master)](https://github.com/open-mmlab/mmdetection) or [latest version (3.x)](https://github.com/open-mmlab/mmdetection/tree/dev-3.x). + required: true + + - type: textarea + attributes: + label: 💬 Describe the reimplementation questions + description: | + A clear and concise description of what the problem you meet and what have you done. + There are several common situations in the reimplementation issues as below + + 1. Reimplement a model in the model zoo using the provided configs + 2. Reimplement a model in the model zoo on other dataset (e.g., custom datasets) + 3. Reimplement a custom model but all the components are implemented in MMDetection + 4. Reimplement a custom model with new modules implemented by yourself + + There are several things to do for different cases as below. + + - For case 1 & 3, please follow the steps in the following sections thus we could help to quick identify the issue. + - For case 2 & 4, please understand that we are not able to do much help here because we usually do not know the full code and the users should be responsible to the code they write. + - One suggestion for case 2 & 4 is that the users should first check whether the bug lies in the self-implemented code or the original code. For example, users can first make sure that the same model runs well on supported datasets. If you still need help, please describe what you have done and what you obtain in the issue, and follow the steps in the following sections and try as clear as possible so that we can better help you. + placeholder: | + A clear and concise description of what the bug is. + What config dir you run? + + ```none + A placeholder for the config. + ``` + + ```shell + The command or script you run. + ``` + + ``` + The error message or logs you got, with the full traceback. + ``` + validations: + required: true + + - type: textarea + attributes: + label: Environment + description: | + Please run `python mmdet/utils/collect_env.py` to collect necessary environment information and paste it here. + You may add addition that may be helpful for locating the problem, such as + - How you installed PyTorch \[e.g., pip, conda, source\] + - Other environment variables that may be related (such as `$PATH`, `$LD_LIBRARY_PATH`, `$PYTHONPATH`, etc.) + validations: + required: true + + - type: textarea + attributes: + label: Expected results + description: If applicable, paste the related results here, e.g., what you expect and what you get. + placeholder: | + ```none + A placeholder for results comparison + ``` + + - type: textarea + attributes: + label: Additional information + description: Tell us anything else you think we should know. + placeholder: | + 1. Did you make any modifications on the code or config? Did you understand what you have modified? + 2. What dataset did you use? + 3. What do you think might be the reason? diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..7211b31 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,9 @@ +blank_issues_enabled: true + +contact_links: + - name: 💬 Forum + url: https://github.com/open-mmlab/mmdetection/discussions + about: Ask general usage questions and discuss with other MMDetection community members + - name: 🌐 Explore OpenMMLab + url: https://openmmlab.com/ + about: Get know more about OpenMMLab diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..8f8e289 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,25 @@ +Thanks for your contribution and we appreciate it a lot. The following instructions would make your pull request more healthy and more easily get feedback. If you do not understand some items, don't worry, just make the pull request and seek help from maintainers. + +## Motivation + +Please describe the motivation of this PR and the goal you want to achieve through this PR. + +## Modification + +Please briefly describe what modification is made in this PR. + +## BC-breaking (Optional) + +Does the modification introduce changes that break the backward-compatibility of the downstream repos? +If so, please describe how it breaks the compatibility and how the downstream projects should modify their code to keep compatibility with this PR. + +## Use cases (Optional) + +If this PR introduces a new feature, it is better to list some use cases here, and update the documentation. + +## Checklist + +1. Pre-commit or other linting tools are used to fix the potential lint issues. +2. The modification is covered by complete unit tests. If not, please add more unit test to ensure the correctness. +3. If the modification has potential influence on downstream projects, this PR should be tested with downstream projects, like MMDet or MMCls. +4. The documentation has been modified accordingly, like docstring or example tutorials. diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..30ba5f8 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,286 @@ +name: build + +on: + push: + paths-ignore: + - ".dev_scripts/**" + - ".github/**.md" + - "demo/**" + - "docker/**" + - "tools/**" + - "README.md" + - "README_zh-CN.md" + + pull_request: + paths-ignore: + - ".dev_scripts/**" + - ".github/**.md" + - "demo/**" + - "docker/**" + - "docs/**" + - "docs_zh-CN/**" + - "tools/**" + - "README.md" + - "README_zh-CN.md" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + build_cpu: + runs-on: ubuntu-18.04 + strategy: + matrix: + python-version: [3.7] + torch: [1.5.1, 1.6.0, 1.7.0, 1.8.0, 1.9.0, 1.10.1] + include: + - torch: 1.5.1 + torchvision: 0.6.1 + mmcv: 1.5 + - torch: 1.6.0 + torchvision: 0.7.0 + mmcv: 1.6 + - torch: 1.7.0 + torchvision: 0.8.1 + mmcv: 1.7 + - torch: 1.8.0 + torchvision: 0.9.0 + mmcv: 1.8 + - torch: 1.9.0 + torchvision: 0.10.0 + mmcv: 1.9 + - torch: 1.10.1 + torchvision: 0.11.2 + mmcv: "1.10" + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install PyTorch + run: pip install torch==${{matrix.torch}}+cpu torchvision==${{matrix.torchvision}}+cpu -f https://download.pytorch.org/whl/torch_stable.html + - name: Install MMCV + run: | + pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cpu/torch${{matrix.mmcv}}/index.html + python -c 'import mmcv; print(mmcv.__version__)' + - name: Install unittest dependencies + run: | + pip install -r requirements/tests.txt -r requirements/optional.txt + pip install albumentations>=0.3.2 --no-binary imgaug,albumentations + pip install git+https://github.com/cocodataset/panopticapi.git + - name: Build and install + run: rm -rf .eggs && pip install -e . + - name: Run unittests and generate coverage report + run: | + coverage run --branch --source mmdet -m pytest tests/ + coverage xml + coverage report -m + + build_cuda101: + runs-on: ubuntu-18.04 + container: + image: pytorch/pytorch:1.6.0-cuda10.1-cudnn7-devel + + strategy: + matrix: + python-version: [3.7] + torch: [1.5.1+cu101, 1.6.0+cu101, 1.7.0+cu101, 1.8.0+cu101] + include: + - torch: 1.5.1+cu101 + torch_version: torch1.5.1 + torchvision: 0.6.1+cu101 + mmcv: 1.5 + - torch: 1.6.0+cu101 + torch_version: torch1.6.0 + torchvision: 0.7.0+cu101 + mmcv: 1.6 + - torch: 1.7.0+cu101 + torch_version: torch1.7.0 + torchvision: 0.8.1+cu101 + mmcv: 1.7 + - torch: 1.8.0+cu101 + torch_version: torch1.8.0 + torchvision: 0.9.0+cu101 + mmcv: 1.8 + + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Fetch GPG keys + run: | + apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub + apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub + - name: Install system dependencies + run: | + apt-get update && apt-get install -y ffmpeg libsm6 libxext6 git ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 python${{matrix.python-version}}-dev + apt-get clean + rm -rf /var/lib/apt/lists/* + - name: Install PyTorch + run: python -m pip install torch==${{matrix.torch}} torchvision==${{matrix.torchvision}} -f https://download.pytorch.org/whl/torch_stable.html + - name: Install dependencies for compiling onnx when python=3.9 + run: python -m pip install "protobuf <= 3.20.1" && apt-get install libprotobuf-dev protobuf-compiler + if: ${{matrix.python-version == '3.9'}} + - name: Install mmdet dependencies + run: | + python -V + export CFLAGS=`python -c 'import sysconfig;print("-I"+sysconfig.get_paths()["include"])'` + export CXXFLAGS="${CFLAGS}" + python -m pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu101/torch${{matrix.mmcv}}/index.html + python -m pip install pycocotools + python -m pip install -r requirements/tests.txt -r requirements/optional.txt + python -m pip install albumentations>=0.3.2 --no-binary imgaug,albumentations + python -m pip install git+https://github.com/cocodataset/panopticapi.git + python -c 'import mmcv; print(mmcv.__version__)' + - name: Build and install + run: | + rm -rf .eggs + python setup.py check -m -s + TORCH_CUDA_ARCH_LIST=7.0 pip install . + - name: Run unittests and generate coverage report + run: | + coverage run --branch --source mmdet -m pytest tests/ + coverage xml + coverage report -m + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v1.0.10 + with: + file: ./coverage.xml + flags: unittests + env_vars: OS,PYTHON + name: codecov-umbrella + fail_ci_if_error: false + + build_cuda102: + runs-on: ubuntu-18.04 + container: + image: pytorch/pytorch:1.9.0-cuda10.2-cudnn7-devel + + strategy: + matrix: + python-version: [3.7, 3.8, 3.9] + torch: [1.9.0+cu102, 1.10.1+cu102] + include: + - torch: 1.9.0+cu102 + torch_version: torch1.9.0 + torchvision: 0.10.0+cu102 + mmcv: 1.9 + - torch: 1.10.1+cu102 + torch_version: torch1.10.1 + torchvision: 0.11.2+cu102 + mmcv: "1.10" + + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Fetch GPG keys + run: | + apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub + apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub + # Add ppa source repo for python3.9. + - name: Add python3.9 source + run: | + apt-get update && apt-get install -y software-properties-common + add-apt-repository -y ppa:deadsnakes/ppa + if: ${{matrix.python-version == '3.9'}} + # Install python-dev for some packages which require libpython3.Xm. + # Github's setup-python cannot install python3.9-dev, so we have to use apt install. + # Set DEBIAN_FRONTEND=noninteractive to avoid some interactions. + - name: Install python-dev + run: apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends python${{matrix.python-version}}-dev + - name: Install system dependencies + run: | + apt-get update && apt-get install -y ffmpeg libsm6 libxext6 git ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 + apt-get clean + rm -rf /var/lib/apt/lists/* + - name: Install PyTorch + run: python -m pip install torch==${{matrix.torch}} torchvision==${{matrix.torchvision}} -f https://download.pytorch.org/whl/torch_stable.html + - name: Install dependencies for compiling onnx when python=3.9 + run: python -m pip install "protobuf <= 3.20.1" && apt-get update && apt-get -y install libprotobuf-dev protobuf-compiler cmake + if: ${{matrix.python-version == '3.9'}} + - name: Install mmdet dependencies + run: | + python -V + export CFLAGS=`python -c 'import sysconfig;print("-I"+sysconfig.get_paths()["include"])'` + export CXXFLAGS="${CFLAGS}" + python -m pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu102/torch${{matrix.mmcv}}/index.html + python -m pip install pycocotools + python -m pip install -r requirements/tests.txt -r requirements/optional.txt + python -m pip install albumentations>=0.3.2 --no-binary imgaug,albumentations + python -m pip install git+https://github.com/cocodataset/panopticapi.git + python -c 'import mmcv; print(mmcv.__version__)' + - name: Build and install + run: | + rm -rf .eggs + python setup.py check -m -s + TORCH_CUDA_ARCH_LIST=7.0 pip install . + - name: Run unittests and generate coverage report + run: | + coverage run --branch --source mmdet -m pytest tests/ + coverage xml + coverage report -m + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v2 + with: + files: ./coverage.xml + flags: unittests + env_vars: OS,PYTHON + name: codecov-umbrella + fail_ci_if_error: false + + build_windows: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [windows-2022] + python: [3.8] + platform: [cpu, cu111] + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python }} + - name: Upgrade pip + run: python -m pip install pip --upgrade --user + - name: Install PyTorch + # As a complement to Linux CI, we test on PyTorch LTS version + run: pip install torch==1.8.2+${{ matrix.platform }} torchvision==0.9.2+${{ matrix.platform }} -f https://download.pytorch.org/whl/lts/1.8/torch_lts.html + - name: Install MMCV + run: pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cpu/torch1.8/index.html --only-binary mmcv-full + - name: Install unittest dependencies + run: | + python -V + python -m pip install pycocotools + python -m pip install -r requirements/tests.txt -r requirements/optional.txt + python -m pip install albumentations>=0.3.2 --no-binary imgaug,albumentations + python -m pip install git+https://github.com/cocodataset/panopticapi.git + python -c 'import mmcv; print(mmcv.__version__)' + - name: Show pip list + run: pip list + - name: Build and install + run: pip install -e . + - name: Run unittests + run: coverage run --branch --source mmdet -m pytest tests + - name: Generate coverage report + run: | + coverage xml + coverage report -m + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v2 + with: + file: ./coverage.xml + flags: unittests + env_vars: OS,PYTHON + name: codecov-umbrella + fail_ci_if_error: false diff --git a/.github/workflows/build_pat.yml b/.github/workflows/build_pat.yml new file mode 100644 index 0000000..82eaafc --- /dev/null +++ b/.github/workflows/build_pat.yml @@ -0,0 +1,31 @@ +name: build_pat + +on: push + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + build_parrots: + runs-on: ubuntu-latest + container: + image: ghcr.io/zhouzaida/parrots-mmcv:1.3.4 + credentials: + username: zhouzaida + password: ${{ secrets.CR_PAT }} + + steps: + - uses: actions/checkout@v2 + - name: Install mmdet dependencies + run: | + git clone https://github.com/open-mmlab/mmcv.git && cd mmcv + MMCV_WITH_OPS=1 python setup.py install + cd .. && rm -rf mmcv + python -c 'import mmcv; print(mmcv.__version__)' + pip install -r requirements.txt + - name: Build and install + run: rm -rf .eggs && pip install -e . diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..c7fed28 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,31 @@ +name: deploy + +on: push + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + build-n-publish: + runs-on: ubuntu-latest + if: startsWith(github.event.ref, 'refs/tags') + steps: + - uses: actions/checkout@v2 + - name: Set up Python 3.7 + uses: actions/setup-python@v2 + with: + python-version: 3.7 + - name: Install torch + run: pip install torch + - name: Install wheel + run: pip install wheel + - name: Build MMDetection + run: python setup.py sdist bdist_wheel + - name: Publish distribution to PyPI + run: | + pip install twine + twine upload dist/* -u __token__ -p ${{ secrets.pypi_password }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..a1e5aa2 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,30 @@ +name: lint + +on: [push, pull_request] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Python 3.7 + uses: actions/setup-python@v2 + with: + python-version: 3.7 + - name: Install pre-commit hook + run: | + pip install pre-commit + pre-commit install + - name: Linting + run: pre-commit run --all-files + - name: Check docstring coverage + run: | + pip install interrogate + interrogate -v --ignore-init-method --ignore-module --ignore-nested-functions --ignore-regex "__repr__" --fail-under 80 mmdet diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 0000000..1ceee3d --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,31 @@ +name: 'Close stale issues and PRs' + +on: + schedule: + # check issue and pull request once every day + - cron: '25 11 * * *' + +permissions: + contents: read + +jobs: + invalid-stale-close: + permissions: + issues: write + pull-requests: write + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v4 + with: + stale-issue-message: 'This issue is marked as stale because it has been marked as invalid or awaiting response for 7 days without any further response. It will be closed in 5 days if the stale label is not removed or if there is no further response.' + stale-pr-message: 'This PR is marked as stale because there has been no activity in the past 45 days. It will be closed in 10 days if the stale label is not removed or if there is no further updates.' + close-issue-message: 'This issue is closed because it has been stale for 5 days. Please open a new issue if you have similar issues or you have any new updates now.' + close-pr-message: 'This PR is closed because it has been stale for 10 days. Please reopen this PR if you have any updates and want to keep contributing the code.' + # only issues/PRS with any of invalid and awaiting response labels are checked + any-of-labels: 'invalid, awaiting response' + days-before-issue-stale: 7 + days-before-pr-stale: 45 + days-before-issue-close: 5 + days-before-pr-close: 10 + # automatically remove the stale label when the issues or the pull reqquests are updated or commented + remove-stale-when-updated: true diff --git a/.github/workflows/test_mim.yml b/.github/workflows/test_mim.yml new file mode 100644 index 0000000..1a8e8ef --- /dev/null +++ b/.github/workflows/test_mim.yml @@ -0,0 +1,50 @@ +name: test-mim + +on: + push: + paths: + - 'model-index.yml' + - 'configs/**' + + pull_request: + paths: + - 'model-index.yml' + - 'configs/**' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + build_cpu: + runs-on: ubuntu-18.04 + strategy: + matrix: + python-version: [3.7] + torch: [1.8.0] + include: + - torch: 1.8.0 + torch_version: torch1.8 + torchvision: 0.9.0 + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Upgrade pip + run: pip install pip --upgrade + - name: Install Pillow + run: pip install Pillow==6.2.2 + if: ${{matrix.torchvision == '0.4.2'}} + - name: Install PyTorch + run: pip install torch==${{matrix.torch}}+cpu torchvision==${{matrix.torchvision}}+cpu -f https://download.pytorch.org/whl/torch_stable.html + - name: Install openmim + run: pip install openmim + - name: Build and install + run: rm -rf .eggs && mim install -e . + - name: test commands of mim + run: mim search mmdet diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..892731d --- /dev/null +++ b/.gitignore @@ -0,0 +1,124 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/en/_build/ +docs/zh_cn/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + +data/ +data +.vscode +.idea +.DS_Store + +# custom +*.pkl +*.pkl.json +*.log.json +docs/modelzoo_statistics.md +mmdet/.mim +work_dirs/ + +# Pytorch +*.pth +*.py~ +*.sh~ diff --git a/.owners.yml b/.owners.yml new file mode 100644 index 0000000..0d782a7 --- /dev/null +++ b/.owners.yml @@ -0,0 +1,13 @@ +assign: + strategy: + # random + daily-shift-based + scedule: "*/1 * * * *" + assignees: + - Czm369 + - hhaAndroid + - zwhus + - RangiLyu + - BIGWangYuDong + - ZwwWayne + - ZwwWayne diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..6ea250c --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,50 @@ +repos: + - repo: https://github.com/PyCQA/flake8 + rev: 5.0.4 + hooks: + - id: flake8 + - repo: https://github.com/PyCQA/isort + rev: 5.11.5 + hooks: + - id: isort + - repo: https://github.com/pre-commit/mirrors-yapf + rev: v0.32.0 + hooks: + - id: yapf + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.3.0 + hooks: + - id: trailing-whitespace + - id: check-yaml + - id: end-of-file-fixer + - id: requirements-txt-fixer + - id: double-quote-string-fixer + - id: check-merge-conflict + - id: fix-encoding-pragma + args: ["--remove"] + - id: mixed-line-ending + args: ["--fix=lf"] + - repo: https://github.com/codespell-project/codespell + rev: v2.2.1 + hooks: + - id: codespell + - repo: https://github.com/executablebooks/mdformat + rev: 0.7.9 + hooks: + - id: mdformat + args: ["--number"] + additional_dependencies: + - mdformat-openmmlab + - mdformat_frontmatter + - linkify-it-py + - repo: https://github.com/myint/docformatter + rev: v1.3.1 + hooks: + - id: docformatter + args: ["--in-place", "--wrap-descriptions", "79"] + - repo: https://github.com/open-mmlab/pre-commit-hooks + rev: v0.2.0 # Use the ref you want to point at + hooks: + - id: check-algo-readme + - id: check-copyright + args: ["mmdet"] # replace the dir_to_check with your expected directory to check diff --git a/.readthedocs.yml b/.readthedocs.yml new file mode 100644 index 0000000..82a1543 --- /dev/null +++ b/.readthedocs.yml @@ -0,0 +1,9 @@ +version: 2 + +formats: all + +python: + version: 3.8 + install: + - requirements: requirements/docs.txt + - requirements: requirements/readthedocs.txt diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000..aac9313 --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,8 @@ +cff-version: 1.2.0 +message: "If you use this software, please cite it as below." +authors: + - name: "MMDetection Contributors" +title: "OpenMMLab Detection Toolbox and Benchmark" +date-released: 2018-08-22 +url: "https://github.com/open-mmlab/mmdetection" +license: Apache-2.0 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1bfc23e --- /dev/null +++ b/LICENSE @@ -0,0 +1,203 @@ +Copyright 2018-2023 OpenMMLab. All rights reserved. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018-2023 OpenMMLab. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..6300b22 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,6 @@ +include requirements/*.txt +include mmdet/VERSION +include mmdet/.mim/model-index.yml +include mmdet/.mim/demo/*/* +recursive-include mmdet/.mim/configs *.py *.yml +recursive-include mmdet/.mim/tools *.sh *.py diff --git a/configs/_base_/datasets/cityscapes_detection.py b/configs/_base_/datasets/cityscapes_detection.py new file mode 100644 index 0000000..e341b59 --- /dev/null +++ b/configs/_base_/datasets/cityscapes_detection.py @@ -0,0 +1,56 @@ +# dataset settings +dataset_type = 'CityscapesDataset' +data_root = 'data/cityscapes/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', img_scale=[(2048, 800), (2048, 1024)], keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 1024), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=1, + workers_per_gpu=2, + train=dict( + type='RepeatDataset', + times=8, + dataset=dict( + type=dataset_type, + ann_file=data_root + + 'annotations/instancesonly_filtered_gtFine_train.json', + img_prefix=data_root + 'leftImg8bit/train/', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + ann_file=data_root + + 'annotations/instancesonly_filtered_gtFine_val.json', + img_prefix=data_root + 'leftImg8bit/val/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + + 'annotations/instancesonly_filtered_gtFine_test.json', + img_prefix=data_root + 'leftImg8bit/test/', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='bbox') diff --git a/configs/_base_/datasets/cityscapes_instance.py b/configs/_base_/datasets/cityscapes_instance.py new file mode 100644 index 0000000..4e3c34e --- /dev/null +++ b/configs/_base_/datasets/cityscapes_instance.py @@ -0,0 +1,56 @@ +# dataset settings +dataset_type = 'CityscapesDataset' +data_root = 'data/cityscapes/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', img_scale=[(2048, 800), (2048, 1024)], keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2048, 1024), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=1, + workers_per_gpu=2, + train=dict( + type='RepeatDataset', + times=8, + dataset=dict( + type=dataset_type, + ann_file=data_root + + 'annotations/instancesonly_filtered_gtFine_train.json', + img_prefix=data_root + 'leftImg8bit/train/', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + ann_file=data_root + + 'annotations/instancesonly_filtered_gtFine_val.json', + img_prefix=data_root + 'leftImg8bit/val/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + + 'annotations/instancesonly_filtered_gtFine_test.json', + img_prefix=data_root + 'leftImg8bit/test/', + pipeline=test_pipeline)) +evaluation = dict(metric=['bbox', 'segm']) diff --git a/configs/_base_/datasets/coco_detection.py b/configs/_base_/datasets/coco_detection.py new file mode 100644 index 0000000..4f08b38 --- /dev/null +++ b/configs/_base_/datasets/coco_detection.py @@ -0,0 +1,49 @@ +# dataset settings +dataset_type = 'CocoDataset' +data_root = '/workspace/whole_world/rdata/share/datasets/COCO/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='bbox') diff --git a/configs/_base_/datasets/coco_instance.py b/configs/_base_/datasets/coco_instance.py new file mode 100644 index 0000000..9901a85 --- /dev/null +++ b/configs/_base_/datasets/coco_instance.py @@ -0,0 +1,49 @@ +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +evaluation = dict(metric=['bbox', 'segm']) diff --git a/configs/_base_/datasets/coco_instance_semantic.py b/configs/_base_/datasets/coco_instance_semantic.py new file mode 100644 index 0000000..6c8bf07 --- /dev/null +++ b/configs/_base_/datasets/coco_instance_semantic.py @@ -0,0 +1,54 @@ +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', with_bbox=True, with_mask=True, with_seg=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='SegRescale', scale_factor=1 / 8), + dict(type='DefaultFormatBundle'), + dict( + type='Collect', + keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + seg_prefix=data_root + 'stuffthingmaps/train2017/', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +evaluation = dict(metric=['bbox', 'segm']) diff --git a/configs/_base_/datasets/coco_panoptic.py b/configs/_base_/datasets/coco_panoptic.py new file mode 100644 index 0000000..dbade7c --- /dev/null +++ b/configs/_base_/datasets/coco_panoptic.py @@ -0,0 +1,59 @@ +# dataset settings +dataset_type = 'CocoPanopticDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadPanopticAnnotations', + with_bbox=True, + with_mask=True, + with_seg=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='SegRescale', scale_factor=1 / 4), + dict(type='DefaultFormatBundle'), + dict( + type='Collect', + keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/panoptic_train2017.json', + img_prefix=data_root + 'train2017/', + seg_prefix=data_root + 'annotations/panoptic_train2017/', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/panoptic_val2017.json', + img_prefix=data_root + 'val2017/', + seg_prefix=data_root + 'annotations/panoptic_val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/panoptic_val2017.json', + img_prefix=data_root + 'val2017/', + seg_prefix=data_root + 'annotations/panoptic_val2017/', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric=['PQ']) diff --git a/configs/_base_/datasets/deepfashion.py b/configs/_base_/datasets/deepfashion.py new file mode 100644 index 0000000..308b4b2 --- /dev/null +++ b/configs/_base_/datasets/deepfashion.py @@ -0,0 +1,53 @@ +# dataset settings +dataset_type = 'DeepFashionDataset' +data_root = 'data/DeepFashion/In-shop/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(750, 1101), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(750, 1101), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + imgs_per_gpu=2, + workers_per_gpu=1, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/DeepFashion_segmentation_query.json', + img_prefix=data_root + 'Img/', + pipeline=train_pipeline, + data_root=data_root), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/DeepFashion_segmentation_query.json', + img_prefix=data_root + 'Img/', + pipeline=test_pipeline, + data_root=data_root), + test=dict( + type=dataset_type, + ann_file=data_root + + 'annotations/DeepFashion_segmentation_gallery.json', + img_prefix=data_root + 'Img/', + pipeline=test_pipeline, + data_root=data_root)) +evaluation = dict(interval=5, metric=['bbox', 'segm']) diff --git a/configs/_base_/datasets/lvis_v0.5_instance.py b/configs/_base_/datasets/lvis_v0.5_instance.py new file mode 100644 index 0000000..207e005 --- /dev/null +++ b/configs/_base_/datasets/lvis_v0.5_instance.py @@ -0,0 +1,24 @@ +# dataset settings +_base_ = 'coco_instance.py' +dataset_type = 'LVISV05Dataset' +data_root = 'data/lvis_v0.5/' +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + _delete_=True, + type='ClassBalancedDataset', + oversample_thr=1e-3, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/lvis_v0.5_train.json', + img_prefix=data_root + 'train2017/')), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/lvis_v0.5_val.json', + img_prefix=data_root + 'val2017/'), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/lvis_v0.5_val.json', + img_prefix=data_root + 'val2017/')) +evaluation = dict(metric=['bbox', 'segm']) diff --git a/configs/_base_/datasets/lvis_v1_instance.py b/configs/_base_/datasets/lvis_v1_instance.py new file mode 100644 index 0000000..be791ed --- /dev/null +++ b/configs/_base_/datasets/lvis_v1_instance.py @@ -0,0 +1,24 @@ +# dataset settings +_base_ = 'coco_instance.py' +dataset_type = 'LVISV1Dataset' +data_root = 'data/lvis_v1/' +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + _delete_=True, + type='ClassBalancedDataset', + oversample_thr=1e-3, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/lvis_v1_train.json', + img_prefix=data_root)), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/lvis_v1_val.json', + img_prefix=data_root), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/lvis_v1_val.json', + img_prefix=data_root)) +evaluation = dict(metric=['bbox', 'segm']) diff --git a/configs/_base_/datasets/objects365v1_detection.py b/configs/_base_/datasets/objects365v1_detection.py new file mode 100644 index 0000000..8989b6f --- /dev/null +++ b/configs/_base_/datasets/objects365v1_detection.py @@ -0,0 +1,49 @@ +# dataset settings +dataset_type = 'Objects365V1Dataset' +data_root = 'data/Objects365/Obj365_v1/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/objects365_train.json', + img_prefix=data_root + 'train/', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/objects365_val.json', + img_prefix=data_root + 'val/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/objects365_val.json', + img_prefix=data_root + 'val/', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='bbox') diff --git a/configs/_base_/datasets/objects365v2_detection.py b/configs/_base_/datasets/objects365v2_detection.py new file mode 100644 index 0000000..99942c1 --- /dev/null +++ b/configs/_base_/datasets/objects365v2_detection.py @@ -0,0 +1,49 @@ +# dataset settings +dataset_type = 'Objects365V2Dataset' +data_root = 'data/Objects365/Obj365_v2/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/zhiyuan_objv2_train.json', + img_prefix=data_root + 'train/', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/zhiyuan_objv2_val.json', + img_prefix=data_root + 'val/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/zhiyuan_objv2_val.json', + img_prefix=data_root + 'val/', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='bbox') diff --git a/configs/_base_/datasets/openimages_detection.py b/configs/_base_/datasets/openimages_detection.py new file mode 100644 index 0000000..a65d306 --- /dev/null +++ b/configs/_base_/datasets/openimages_detection.py @@ -0,0 +1,65 @@ +# dataset settings +dataset_type = 'OpenImagesDataset' +data_root = 'data/OpenImages/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, denorm_bbox=True), + dict(type='Resize', img_scale=(1024, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1024, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ], + ), +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=0, # workers_per_gpu > 0 may occur out of memory + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/oidv6-train-annotations-bbox.csv', + img_prefix=data_root + 'OpenImages/train/', + label_file=data_root + 'annotations/class-descriptions-boxable.csv', + hierarchy_file=data_root + + 'annotations/bbox_labels_600_hierarchy.json', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/validation-annotations-bbox.csv', + img_prefix=data_root + 'OpenImages/validation/', + label_file=data_root + 'annotations/class-descriptions-boxable.csv', + hierarchy_file=data_root + + 'annotations/bbox_labels_600_hierarchy.json', + meta_file=data_root + 'annotations/validation-image-metas.pkl', + image_level_ann_file=data_root + + 'annotations/validation-annotations-human-imagelabels-boxable.csv', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/validation-annotations-bbox.csv', + img_prefix=data_root + 'OpenImages/validation/', + label_file=data_root + 'annotations/class-descriptions-boxable.csv', + hierarchy_file=data_root + + 'annotations/bbox_labels_600_hierarchy.json', + meta_file=data_root + 'annotations/validation-image-metas.pkl', + image_level_ann_file=data_root + + 'annotations/validation-annotations-human-imagelabels-boxable.csv', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='mAP') diff --git a/configs/_base_/datasets/voc0712.py b/configs/_base_/datasets/voc0712.py new file mode 100644 index 0000000..ae4fd90 --- /dev/null +++ b/configs/_base_/datasets/voc0712.py @@ -0,0 +1,64 @@ +# dataset settings +dataset_type = 'VOCDataset' +data_root = '/workspace/package_for_transfer/VOC/VOCdevkit/' +classes = ('aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', + 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', + 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', + 'tvmonitor') +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1000, 600), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1000, 600), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='RepeatDataset', + times=3, + dataset=dict( + type=dataset_type, + ann_file=[ + data_root + 'VOC2007/ImageSets/Main/trainval.txt', + data_root + 'VOC2012/ImageSets/Main/trainval.txt' + ], + img_prefix=[data_root + 'VOC2007/', data_root + 'VOC2012/'], + pipeline=train_pipeline, + classes=classes)), + val=dict( + type='CocoDataset', + ann_file=data_root + 'coco_format/voc07_test.json', # 注意这里走的是COCO格式 + img_prefix=data_root, + pipeline=test_pipeline, + classes=classes), + test=dict( + type='CocoDataset', + ann_file=data_root + 'coco_format/voc07_test.json', + img_prefix=data_root, + pipeline=test_pipeline, + classes=classes)) + + +evaluation = dict(interval=1, metric='mAP') diff --git a/configs/_base_/datasets/wider_face.py b/configs/_base_/datasets/wider_face.py new file mode 100644 index 0000000..d1d649b --- /dev/null +++ b/configs/_base_/datasets/wider_face.py @@ -0,0 +1,63 @@ +# dataset settings +dataset_type = 'WIDERFaceDataset' +data_root = 'data/WIDERFace/' +img_norm_cfg = dict(mean=[123.675, 116.28, 103.53], std=[1, 1, 1], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(300, 300), keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(300, 300), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=60, + workers_per_gpu=2, + train=dict( + type='RepeatDataset', + times=2, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'train.txt', + img_prefix=data_root + 'WIDER_train/', + min_size=17, + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + ann_file=data_root + 'val.txt', + img_prefix=data_root + 'WIDER_val/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'val.txt', + img_prefix=data_root + 'WIDER_val/', + pipeline=test_pipeline)) diff --git a/configs/_base_/default_runtime.py b/configs/_base_/default_runtime.py new file mode 100644 index 0000000..4916ad1 --- /dev/null +++ b/configs/_base_/default_runtime.py @@ -0,0 +1,27 @@ +checkpoint_config = dict(interval=1) +# yapf:disable +log_config = dict( + interval=200, + hooks=[ + dict(type='TextLoggerHook'), + # dict(type='TensorboardLoggerHook') + ]) +# yapf:enable +custom_hooks = [dict(type='NumClassCheckHook')] + +dist_params = dict(backend='nccl') +log_level = 'INFO' +load_from = None +resume_from = None +workflow = [('train', 1)] + +# disable opencv multithreading to avoid system being overloaded +opencv_num_threads = 0 +# set multi-process start method as `fork` to speed up the training +mp_start_method = 'fork' + +# Default setting for scaling LR automatically +# - `enable` means enable scaling LR automatically +# or not by default. +# - `base_batch_size` = (8 GPUs) x (2 samples per GPU). +auto_scale_lr = dict(enable=False, base_batch_size=16) diff --git a/configs/_base_/models/ascend_retinanet_r50_fpn.py b/configs/_base_/models/ascend_retinanet_r50_fpn.py new file mode 100644 index 0000000..9a18fd7 --- /dev/null +++ b/configs/_base_/models/ascend_retinanet_r50_fpn.py @@ -0,0 +1,60 @@ +# model settings +model = dict( + type='RetinaNet', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_input', + num_outs=5), + bbox_head=dict( + type='AscendRetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + # model training and testing settings + train_cfg=dict( + assigner=dict( + type='AscendMaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) diff --git a/configs/_base_/models/ascend_ssd300.py b/configs/_base_/models/ascend_ssd300.py new file mode 100644 index 0000000..cf47fca --- /dev/null +++ b/configs/_base_/models/ascend_ssd300.py @@ -0,0 +1,56 @@ +# model settings +input_size = 300 +model = dict( + type='SingleStageDetector', + backbone=dict( + type='SSDVGG', + depth=16, + with_last_pool=False, + ceil_mode=True, + out_indices=(3, 4), + out_feature_indices=(22, 34), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://vgg16_caffe')), + neck=dict( + type='SSDNeck', + in_channels=(512, 1024), + out_channels=(512, 1024, 512, 256, 256, 256), + level_strides=(2, 2, 1, 1), + level_paddings=(1, 1, 0, 0), + l2_norm_scale=20), + bbox_head=dict( + type='AscendSSDHead', + in_channels=(512, 1024, 512, 256, 256, 256), + num_classes=80, + anchor_generator=dict( + type='SSDAnchorGenerator', + scale_major=False, + input_size=input_size, + basesize_ratio_range=(0.15, 0.9), + strides=[8, 16, 32, 64, 100, 300], + ratios=[[2], [2, 3], [2, 3], [2, 3], [2], [2]]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2])), + # model training and testing settings + train_cfg=dict( + assigner=dict( + type='AscendMaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0., + ignore_iof_thr=-1, + gt_max_assign_all=False), + smoothl1_beta=1., + allowed_border=-1, + pos_weight=-1, + neg_pos_ratio=3, + debug=False), + test_cfg=dict( + nms_pre=1000, + nms=dict(type='nms', iou_threshold=0.45), + min_bbox_size=0, + score_thr=0.02, + max_per_img=200)) +# cudnn_benchmark = True diff --git a/configs/_base_/models/cascade_mask_rcnn_r50_fpn.py b/configs/_base_/models/cascade_mask_rcnn_r50_fpn.py new file mode 100644 index 0000000..2902cca --- /dev/null +++ b/configs/_base_/models/cascade_mask_rcnn_r50_fpn.py @@ -0,0 +1,196 @@ +# model settings +model = dict( + type='CascadeRCNN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), + roi_head=dict( + type='CascadeRoIHead', + num_stages=3, + stage_loss_weights=[1, 0.5, 0.25], + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=[ + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.05, 0.05, 0.1, 0.1]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.033, 0.033, 0.067, 0.067]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)) + ], + mask_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + mask_head=dict( + type='FCNMaskHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=80, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=0, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=[ + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=28, + pos_weight=-1, + debug=False), + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.6, + neg_iou_thr=0.6, + min_pos_iou=0.6, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=28, + pos_weight=-1, + debug=False), + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.7, + min_pos_iou=0.7, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=28, + pos_weight=-1, + debug=False) + ]), + test_cfg=dict( + rpn=dict( + nms_pre=1000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100, + mask_thr_binary=0.5))) diff --git a/configs/_base_/models/cascade_rcnn_r50_fpn.py b/configs/_base_/models/cascade_rcnn_r50_fpn.py new file mode 100644 index 0000000..42f74ae --- /dev/null +++ b/configs/_base_/models/cascade_rcnn_r50_fpn.py @@ -0,0 +1,179 @@ +# model settings +model = dict( + type='CascadeRCNN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), + roi_head=dict( + type='CascadeRoIHead', + num_stages=3, + stage_loss_weights=[1, 0.5, 0.25], + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=[ + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.05, 0.05, 0.1, 0.1]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.033, 0.033, 0.067, 0.067]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)) + ]), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=0, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=[ + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + pos_weight=-1, + debug=False), + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.6, + neg_iou_thr=0.6, + min_pos_iou=0.6, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + pos_weight=-1, + debug=False), + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.7, + min_pos_iou=0.7, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + pos_weight=-1, + debug=False) + ]), + test_cfg=dict( + rpn=dict( + nms_pre=1000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100))) diff --git a/configs/_base_/models/fast_rcnn_r50_fpn.py b/configs/_base_/models/fast_rcnn_r50_fpn.py new file mode 100644 index 0000000..9982fe0 --- /dev/null +++ b/configs/_base_/models/fast_rcnn_r50_fpn.py @@ -0,0 +1,62 @@ +# model settings +model = dict( + type='FastRCNN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + roi_head=dict( + type='StandardRoIHead', + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + pos_weight=-1, + debug=False)), + test_cfg=dict( + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100))) diff --git a/configs/_base_/models/faster_rcnn_r50_caffe_c4.py b/configs/_base_/models/faster_rcnn_r50_caffe_c4.py new file mode 100644 index 0000000..dbf965a --- /dev/null +++ b/configs/_base_/models/faster_rcnn_r50_caffe_c4.py @@ -0,0 +1,117 @@ +# model settings +norm_cfg = dict(type='BN', requires_grad=False) +model = dict( + type='FasterRCNN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=3, + strides=(1, 2, 2), + dilations=(1, 1, 1), + out_indices=(2, ), + frozen_stages=1, + norm_cfg=norm_cfg, + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + rpn_head=dict( + type='RPNHead', + in_channels=1024, + feat_channels=1024, + anchor_generator=dict( + type='AnchorGenerator', + scales=[2, 4, 8, 16, 32], + ratios=[0.5, 1.0, 2.0], + strides=[16]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + roi_head=dict( + type='StandardRoIHead', + shared_head=dict( + type='ResLayer', + depth=50, + stage=3, + stride=2, + dilation=1, + style='caffe', + norm_cfg=norm_cfg, + norm_eval=True, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=1024, + featmap_strides=[16]), + bbox_head=dict( + type='BBoxHead', + with_avg_pool=True, + roi_feat_size=7, + in_channels=2048, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=12000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=6000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100))) diff --git a/configs/_base_/models/faster_rcnn_r50_caffe_dc5.py b/configs/_base_/models/faster_rcnn_r50_caffe_dc5.py new file mode 100644 index 0000000..a377a6f --- /dev/null +++ b/configs/_base_/models/faster_rcnn_r50_caffe_dc5.py @@ -0,0 +1,105 @@ +# model settings +norm_cfg = dict(type='BN', requires_grad=False) +model = dict( + type='FasterRCNN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + strides=(1, 2, 2, 1), + dilations=(1, 1, 1, 2), + out_indices=(3, ), + frozen_stages=1, + norm_cfg=norm_cfg, + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + rpn_head=dict( + type='RPNHead', + in_channels=2048, + feat_channels=2048, + anchor_generator=dict( + type='AnchorGenerator', + scales=[2, 4, 8, 16, 32], + ratios=[0.5, 1.0, 2.0], + strides=[16]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + roi_head=dict( + type='StandardRoIHead', + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=2048, + featmap_strides=[16]), + bbox_head=dict( + type='Shared2FCBBoxHead', + in_channels=2048, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=0, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=12000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms=dict(type='nms', iou_threshold=0.7), + nms_pre=6000, + max_per_img=1000, + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100))) diff --git a/configs/_base_/models/faster_rcnn_r50_fpn.py b/configs/_base_/models/faster_rcnn_r50_fpn.py new file mode 100644 index 0000000..9bb42cf --- /dev/null +++ b/configs/_base_/models/faster_rcnn_r50_fpn.py @@ -0,0 +1,108 @@ +# model settings +model = dict( + type='FasterRCNN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='/workspace/whole_world/rdata/share/pretrained/checkpoints/resnet50-19c8e357.pth')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + roi_head=dict( + type='StandardRoIHead', + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=2000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=1000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100) + # soft-nms is also supported for rcnn testing + # e.g., nms=dict(type='soft_nms', iou_threshold=0.5, min_score=0.05) + )) diff --git a/configs/_base_/models/faster_rcnn_r50_fpn_no_freeze.py b/configs/_base_/models/faster_rcnn_r50_fpn_no_freeze.py new file mode 100644 index 0000000..2066e37 --- /dev/null +++ b/configs/_base_/models/faster_rcnn_r50_fpn_no_freeze.py @@ -0,0 +1,108 @@ +# model settings +model = dict( + type='FasterRCNN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + # frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=False, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='/workspace/whole_world/rdata/share/pretrained/checkpoints/resnet50-19c8e357.pth')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + roi_head=dict( + type='StandardRoIHead', + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=2000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=1000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100) + # soft-nms is also supported for rcnn testing + # e.g., nms=dict(type='soft_nms', iou_threshold=0.5, min_score=0.05) + )) diff --git a/configs/_base_/models/mask_rcnn_r50_caffe_c4.py b/configs/_base_/models/mask_rcnn_r50_caffe_c4.py new file mode 100644 index 0000000..122202e --- /dev/null +++ b/configs/_base_/models/mask_rcnn_r50_caffe_c4.py @@ -0,0 +1,125 @@ +# model settings +norm_cfg = dict(type='BN', requires_grad=False) +model = dict( + type='MaskRCNN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=3, + strides=(1, 2, 2), + dilations=(1, 1, 1), + out_indices=(2, ), + frozen_stages=1, + norm_cfg=norm_cfg, + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + rpn_head=dict( + type='RPNHead', + in_channels=1024, + feat_channels=1024, + anchor_generator=dict( + type='AnchorGenerator', + scales=[2, 4, 8, 16, 32], + ratios=[0.5, 1.0, 2.0], + strides=[16]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + roi_head=dict( + type='StandardRoIHead', + shared_head=dict( + type='ResLayer', + depth=50, + stage=3, + stride=2, + dilation=1, + style='caffe', + norm_cfg=norm_cfg, + norm_eval=True), + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=1024, + featmap_strides=[16]), + bbox_head=dict( + type='BBoxHead', + with_avg_pool=True, + roi_feat_size=7, + in_channels=2048, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + mask_roi_extractor=None, + mask_head=dict( + type='FCNMaskHead', + num_convs=0, + in_channels=2048, + conv_out_channels=256, + num_classes=80, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=0, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=12000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=False, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=14, + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=6000, + nms=dict(type='nms', iou_threshold=0.7), + max_per_img=1000, + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100, + mask_thr_binary=0.5))) diff --git a/configs/_base_/models/mask_rcnn_r50_fpn.py b/configs/_base_/models/mask_rcnn_r50_fpn.py new file mode 100644 index 0000000..d903e55 --- /dev/null +++ b/configs/_base_/models/mask_rcnn_r50_fpn.py @@ -0,0 +1,120 @@ +# model settings +model = dict( + type='MaskRCNN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + roi_head=dict( + type='StandardRoIHead', + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + mask_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + mask_head=dict( + type='FCNMaskHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=80, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=2000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=28, + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=1000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100, + mask_thr_binary=0.5))) diff --git a/configs/_base_/models/retinanet_r50_fpn.py b/configs/_base_/models/retinanet_r50_fpn.py new file mode 100644 index 0000000..4150732 --- /dev/null +++ b/configs/_base_/models/retinanet_r50_fpn.py @@ -0,0 +1,60 @@ +# model settings +model = dict( + type='RetinaNet', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='/workspace/whole_world/rdata/share/pretrained/checkpoints/resnet50-19c8e357.pth')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_input', + num_outs=5), + bbox_head=dict( + type='RetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + # model training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) diff --git a/configs/_base_/models/retinanet_r50_fpn_no_freeze.py b/configs/_base_/models/retinanet_r50_fpn_no_freeze.py new file mode 100644 index 0000000..478a90d --- /dev/null +++ b/configs/_base_/models/retinanet_r50_fpn_no_freeze.py @@ -0,0 +1,60 @@ +# model settings +model = dict( + type='RetinaNet', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + # frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=False, # 这就是eval,不能让他为True + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='/workspace/whole_world/rdata/share/pretrained/checkpoints/resnet50-19c8e357.pth')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_input', + num_outs=5), + bbox_head=dict( + type='RetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + # model training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) diff --git a/configs/_base_/models/rpn_r50_caffe_c4.py b/configs/_base_/models/rpn_r50_caffe_c4.py new file mode 100644 index 0000000..8b32ca9 --- /dev/null +++ b/configs/_base_/models/rpn_r50_caffe_c4.py @@ -0,0 +1,58 @@ +# model settings +model = dict( + type='RPN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=3, + strides=(1, 2, 2), + dilations=(1, 1, 1), + out_indices=(2, ), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + neck=None, + rpn_head=dict( + type='RPNHead', + in_channels=1024, + feat_channels=1024, + anchor_generator=dict( + type='AnchorGenerator', + scales=[2, 4, 8, 16, 32], + ratios=[0.5, 1.0, 2.0], + strides=[16]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=0, + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=12000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0))) diff --git a/configs/_base_/models/rpn_r50_fpn.py b/configs/_base_/models/rpn_r50_fpn.py new file mode 100644 index 0000000..edaf4d4 --- /dev/null +++ b/configs/_base_/models/rpn_r50_fpn.py @@ -0,0 +1,58 @@ +# model settings +model = dict( + type='RPN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=0, + pos_weight=-1, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=2000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0))) diff --git a/configs/_base_/models/ssd300.py b/configs/_base_/models/ssd300.py new file mode 100644 index 0000000..9fdf7bc --- /dev/null +++ b/configs/_base_/models/ssd300.py @@ -0,0 +1,56 @@ +# model settings +input_size = 300 +model = dict( + type='SingleStageDetector', + backbone=dict( + type='SSDVGG', + depth=16, + with_last_pool=False, + ceil_mode=True, + out_indices=(3, 4), + out_feature_indices=(22, 34), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://vgg16_caffe')), + neck=dict( + type='SSDNeck', + in_channels=(512, 1024), + out_channels=(512, 1024, 512, 256, 256, 256), + level_strides=(2, 2, 1, 1), + level_paddings=(1, 1, 0, 0), + l2_norm_scale=20), + bbox_head=dict( + type='SSDHead', + in_channels=(512, 1024, 512, 256, 256, 256), + num_classes=80, + anchor_generator=dict( + type='SSDAnchorGenerator', + scale_major=False, + input_size=input_size, + basesize_ratio_range=(0.15, 0.9), + strides=[8, 16, 32, 64, 100, 300], + ratios=[[2], [2, 3], [2, 3], [2, 3], [2], [2]]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2])), + # model training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0., + ignore_iof_thr=-1, + gt_max_assign_all=False), + smoothl1_beta=1., + allowed_border=-1, + pos_weight=-1, + neg_pos_ratio=3, + debug=False), + test_cfg=dict( + nms_pre=1000, + nms=dict(type='nms', iou_threshold=0.45), + min_bbox_size=0, + score_thr=0.02, + max_per_img=200)) +# cudnn_benchmark = True diff --git a/configs/_base_/models/ssd300_20.py b/configs/_base_/models/ssd300_20.py new file mode 100644 index 0000000..16a2b43 --- /dev/null +++ b/configs/_base_/models/ssd300_20.py @@ -0,0 +1,56 @@ +# model settings +input_size = 300 +model = dict( + type='SingleStageDetector', + backbone=dict( + type='SSDVGG', + depth=16, + with_last_pool=False, + ceil_mode=True, + out_indices=(3, 4), + out_feature_indices=(22, 34), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://vgg16_caffe')), + neck=dict( + type='SSDNeck', + in_channels=(512, 1024), + out_channels=(512, 1024, 512, 256, 256, 256), + level_strides=(2, 2, 1, 1), + level_paddings=(1, 1, 0, 0), + l2_norm_scale=20), + bbox_head=dict( + type='SSDHead', + in_channels=(512, 1024, 512, 256, 256, 256), + num_classes=20, + anchor_generator=dict( + type='SSDAnchorGenerator', + scale_major=False, + input_size=input_size, + basesize_ratio_range=(0.15, 0.9), + strides=[8, 16, 32, 64, 100, 300], + ratios=[[2], [2, 3], [2, 3], [2, 3], [2], [2]]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2])), + # model training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0., + ignore_iof_thr=-1, + gt_max_assign_all=False), + smoothl1_beta=1., + allowed_border=-1, + pos_weight=-1, + neg_pos_ratio=3, + debug=False), + test_cfg=dict( + nms_pre=1000, + nms=dict(type='nms', iou_threshold=0.45), + min_bbox_size=0, + score_thr=0.02, + max_per_img=200)) +# cudnn_benchmark = True diff --git a/configs/_base_/schedules/schedule_17biglr_qat_w4a4.py b/configs/_base_/schedules/schedule_17biglr_qat_w4a4.py new file mode 100644 index 0000000..f8706b2 --- /dev/null +++ b/configs/_base_/schedules/schedule_17biglr_qat_w4a4.py @@ -0,0 +1,11 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.024, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[2, 12, 15]) +runner = dict(type='EpochBasedRunner', max_epochs=17) diff --git a/configs/_base_/schedules/schedule_17lr_qat_w4a4.py b/configs/_base_/schedules/schedule_17lr_qat_w4a4.py new file mode 100644 index 0000000..4d810af --- /dev/null +++ b/configs/_base_/schedules/schedule_17lr_qat_w4a4.py @@ -0,0 +1,11 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.024, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[3, 14, 18]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/_base_/schedules/schedule_1x.py b/configs/_base_/schedules/schedule_1x.py new file mode 100644 index 0000000..13b3783 --- /dev/null +++ b/configs/_base_/schedules/schedule_1x.py @@ -0,0 +1,11 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[8, 11]) +runner = dict(type='EpochBasedRunner', max_epochs=12) diff --git a/configs/_base_/schedules/schedule_1x_voc_general.py b/configs/_base_/schedules/schedule_1x_voc_general.py new file mode 100644 index 0000000..532daad --- /dev/null +++ b/configs/_base_/schedules/schedule_1x_voc_general.py @@ -0,0 +1,11 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[5, 8]) +runner = dict(type='EpochBasedRunner', max_epochs=10) diff --git a/configs/_base_/schedules/schedule_20e.py b/configs/_base_/schedules/schedule_20e.py new file mode 100644 index 0000000..00e8590 --- /dev/null +++ b/configs/_base_/schedules/schedule_20e.py @@ -0,0 +1,11 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[16, 19]) +runner = dict(type='EpochBasedRunner', max_epochs=20) diff --git a/configs/_base_/schedules/schedule_2x.py b/configs/_base_/schedules/schedule_2x.py new file mode 100644 index 0000000..69dc9ee --- /dev/null +++ b/configs/_base_/schedules/schedule_2x.py @@ -0,0 +1,11 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/_base_/schedules/schedule_fine_tune_general.py b/configs/_base_/schedules/schedule_fine_tune_general.py new file mode 100644 index 0000000..c3d8848 --- /dev/null +++ b/configs/_base_/schedules/schedule_fine_tune_general.py @@ -0,0 +1,12 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.0001, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='exp', + warmup_by_epoch=True, + warmup_iters=1, + warmup_ratio=0.1, + step=[5]) +runner = dict(type='EpochBasedRunner', max_epochs=8) diff --git a/configs/_base_/schedules/schedule_qat_w2a2.py b/configs/_base_/schedules/schedule_qat_w2a2.py new file mode 100644 index 0000000..2f52a60 --- /dev/null +++ b/configs/_base_/schedules/schedule_qat_w2a2.py @@ -0,0 +1,13 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='exp', + warmup_by_epoch=True, + warmup_iters=1, + warmup_ratio=0.0001, + step=[9, 14, 17]) + # step=[8, 13, 17]) +runner = dict(type='EpochBasedRunner', max_epochs=18) diff --git a/configs/_base_/schedules/schedule_qat_w2a2_big.py b/configs/_base_/schedules/schedule_qat_w2a2_big.py new file mode 100644 index 0000000..6b565fd --- /dev/null +++ b/configs/_base_/schedules/schedule_qat_w2a2_big.py @@ -0,0 +1,13 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='exp', + warmup_by_epoch=True, + warmup_iters=1, + warmup_ratio=0.004, + gamma=0.5, + step=[8, 13, 14, 15, 16, 17]) # 0.01 0.005 0.0025 0.00125 0.000625 +runner = dict(type='EpochBasedRunner', max_epochs=18) diff --git a/configs/_base_/schedules/schedule_qat_w4a4.py b/configs/_base_/schedules/schedule_qat_w4a4.py new file mode 100644 index 0000000..c5f5ce6 --- /dev/null +++ b/configs/_base_/schedules/schedule_qat_w4a4.py @@ -0,0 +1,14 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.001, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='exp', + warmup_by_epoch=True, + warmup_iters=1, + warmup_ratio=0.001, + # step=[9, 14]) + # step=[7, 13, 15]) # 这是属于voc ret18的 + step=[8, 14]) # 这是属于voc ret18的 +runner = dict(type='EpochBasedRunner', max_epochs=16) diff --git a/configs/_base_/schedules/schedule_qat_w4a4_big.py b/configs/_base_/schedules/schedule_qat_w4a4_big.py new file mode 100644 index 0000000..2fa930b --- /dev/null +++ b/configs/_base_/schedules/schedule_qat_w4a4_big.py @@ -0,0 +1,13 @@ +# 用来分析到底是训练参数的问题吗 +# optimizer +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='exp', + warmup_by_epoch=True, + warmup_iters=1, + warmup_ratio=0.01, + step=[8, 14]) +runner = dict(type='EpochBasedRunner', max_epochs=16) diff --git a/configs/_base_/schedules/schedule_smal_qat_w4a4.py b/configs/_base_/schedules/schedule_smal_qat_w4a4.py new file mode 100644 index 0000000..e7ce65e --- /dev/null +++ b/configs/_base_/schedules/schedule_smal_qat_w4a4.py @@ -0,0 +1,11 @@ +# optimizer +optimizer = dict(type='SGD', lr=0.0001, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=200, + warmup_ratio=0.001, + step=[9, 13]) +runner = dict(type='EpochBasedRunner', max_epochs=16) diff --git a/configs/albu_example/README.md b/configs/albu_example/README.md new file mode 100644 index 0000000..9a180f0 --- /dev/null +++ b/configs/albu_example/README.md @@ -0,0 +1,31 @@ +# Albu Example + +> [Albumentations: fast and flexible image augmentations](https://arxiv.org/abs/1809.06839) + + + +## Abstract + +Data augmentation is a commonly used technique for increasing both the size and the diversity of labeled training sets by leveraging input transformations that preserve output labels. In computer vision domain, image augmentations have become a common implicit regularization technique to combat overfitting in deep convolutional neural networks and are ubiquitously used to improve performance. While most deep learning frameworks implement basic image transformations, the list is typically limited to some variations and combinations of flipping, rotating, scaling, and cropping. Moreover, the image processing speed varies in existing tools for image augmentation. We present Albumentations, a fast and flexible library for image augmentations with many various image transform operations available, that is also an easy-to-use wrapper around other augmentation libraries. We provide examples of image augmentations for different computer vision tasks and show that Albumentations is faster than other commonly used image augmentation tools on the most of commonly used image transformations. + +
+ +
+ +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :--------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | pytorch | 1x | 4.4 | 16.6 | 38.0 | 34.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/albu_example/mask_rcnn_r50_fpn_albu_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/albu_example/mask_rcnn_r50_fpn_albu_1x_coco/mask_rcnn_r50_fpn_albu_1x_coco_20200208-ab203bcd.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/albu_example/mask_rcnn_r50_fpn_albu_1x_coco/mask_rcnn_r50_fpn_albu_1x_coco_20200208_225520.log.json) | + +## Citation + +```latex +@article{2018arXiv180906839B, + author = {A. Buslaev, A. Parinov, E. Khvedchenya, V.~I. Iglovikov and A.~A. Kalinin}, + title = "{Albumentations: fast and flexible image augmentations}", + journal = {ArXiv e-prints}, + eprint = {1809.06839}, + year = 2018 +} +``` diff --git a/configs/albu_example/mask_rcnn_r50_fpn_albu_1x_coco.py b/configs/albu_example/mask_rcnn_r50_fpn_albu_1x_coco.py new file mode 100644 index 0000000..b3f879a --- /dev/null +++ b/configs/albu_example/mask_rcnn_r50_fpn_albu_1x_coco.py @@ -0,0 +1,73 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +albu_train_transforms = [ + dict( + type='ShiftScaleRotate', + shift_limit=0.0625, + scale_limit=0.0, + rotate_limit=0, + interpolation=1, + p=0.5), + dict( + type='RandomBrightnessContrast', + brightness_limit=[0.1, 0.3], + contrast_limit=[0.1, 0.3], + p=0.2), + dict( + type='OneOf', + transforms=[ + dict( + type='RGBShift', + r_shift_limit=10, + g_shift_limit=10, + b_shift_limit=10, + p=1.0), + dict( + type='HueSaturationValue', + hue_shift_limit=20, + sat_shift_limit=30, + val_shift_limit=20, + p=1.0) + ], + p=0.1), + dict(type='JpegCompression', quality_lower=85, quality_upper=95, p=0.2), + dict(type='ChannelShuffle', p=0.1), + dict( + type='OneOf', + transforms=[ + dict(type='Blur', blur_limit=3, p=1.0), + dict(type='MedianBlur', blur_limit=3, p=1.0) + ], + p=0.1), +] +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='Pad', size_divisor=32), + dict( + type='Albu', + transforms=albu_train_transforms, + bbox_params=dict( + type='BboxParams', + format='pascal_voc', + label_fields=['gt_labels'], + min_visibility=0.0, + filter_lost_elements=True), + keymap={ + 'img': 'image', + 'gt_masks': 'masks', + 'gt_bboxes': 'bboxes' + }, + update_pad_shape=False, + skip_img_without_anno=True), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict( + type='Collect', + keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks'], + meta_keys=('filename', 'ori_shape', 'img_shape', 'img_norm_cfg', + 'pad_shape', 'scale_factor')) +] +data = dict(train=dict(pipeline=train_pipeline)) diff --git a/configs/atss/README.md b/configs/atss/README.md new file mode 100644 index 0000000..055ed05 --- /dev/null +++ b/configs/atss/README.md @@ -0,0 +1,31 @@ +# ATSS + +> [Bridging the Gap Between Anchor-based and Anchor-free Detection via Adaptive Training Sample Selection](https://arxiv.org/abs/1912.02424) + + + +## Abstract + +Object detection has been dominated by anchor-based detectors for several years. Recently, anchor-free detectors have become popular due to the proposal of FPN and Focal Loss. In this paper, we first point out that the essential difference between anchor-based and anchor-free detection is actually how to define positive and negative training samples, which leads to the performance gap between them. If they adopt the same definition of positive and negative samples during training, there is no obvious difference in the final performance, no matter regressing from a box or a point. This shows that how to select positive and negative training samples is important for current object detectors. Then, we propose an Adaptive Training Sample Selection (ATSS) to automatically select positive and negative samples according to statistical characteristics of object. It significantly improves the performance of anchor-based and anchor-free detectors and bridges the gap between them. Finally, we discuss the necessity of tiling multiple anchors per location on the image to detect objects. Extensive experiments conducted on MS COCO support our aforementioned analysis and conclusions. With the newly introduced ATSS, we improve state-of-the-art detectors by a large margin to 50.7% AP without introducing any overhead. + +
+ +
+ +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------: | :-----: | :-----: | :------: | :------------: | :----: | :---------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | pytorch | 1x | 3.7 | 19.7 | 39.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/atss/atss_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/atss/atss_r50_fpn_1x_coco/atss_r50_fpn_1x_coco_20200209-985f7bd0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/atss/atss_r50_fpn_1x_coco/atss_r50_fpn_1x_coco_20200209_102539.log.json) | +| R-101 | pytorch | 1x | 5.6 | 12.3 | 41.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/atss/atss_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/atss/atss_r101_fpn_1x_coco/atss_r101_fpn_1x_20200825-dfcadd6f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/atss/atss_r101_fpn_1x_coco/atss_r101_fpn_1x_20200825-dfcadd6f.log.json) | + +## Citation + +```latex +@article{zhang2019bridging, + title = {Bridging the Gap Between Anchor-based and Anchor-free Detection via Adaptive Training Sample Selection}, + author = {Zhang, Shifeng and Chi, Cheng and Yao, Yongqiang and Lei, Zhen and Li, Stan Z.}, + journal = {arXiv preprint arXiv:1912.02424}, + year = {2019} +} +``` diff --git a/configs/atss/atss_quant_general.py b/configs/atss/atss_quant_general.py new file mode 100644 index 0000000..6dc2598 --- /dev/null +++ b/configs/atss/atss_quant_general.py @@ -0,0 +1,39 @@ +trace_config = dict( + backbone_detail = dict( + input_concrete_args = dict(), + preserve_attr = ['arch_settings', 'avg_down', 'base_channels', 'conv_cfg', 'dcn', 'deep_stem', 'depth', 'dump_patches', 'feat_dim' + , 'frozen_stages', 'init_cfg', 'inplanes', 'is_init', 'norm_cfg', 'norm_eval', 'out_indices' + , 'plugins', 'res_layers', 'stage_block', 'stage_with_dcn', 'stem_channels', 'zero_init_residual', 'strides', 'with_cp', 'make_res_layer', 'make_stage_plugins'], + not_duplicated_prefixes = [], + further_detail = dict( + exclude_prefixes = [], + removed_quantizer_names = [], + specified_general_quantizers = [], + last_8bit_module = [] + )), + neck_detail = dict( + input_concrete_args = dict(in_num = 4), + preserve_attr = ['in_channels', 'init_cfg', 'is_init', 'l2_norm', 'no_norm_on_lateral', 'num_ins', 'num_outs', 'out_channels', 'relu_before_extra_convs', 'start_level', 'upsample_cfg'], + not_duplicated_prefixes = [], + further_detail = dict( # 'getitem_post_act_fake_quantizer' + exclude_prefixes = [], + removed_quantizer_names = ['getitem_1_post_act_fake_quantizer','getitem_2_post_act_fake_quantizer'], + specified_general_quantizers = ['getitem_1_post_act_fake_quantizer', 'getitem_2_post_act_fake_quantizer', 'getitem_3_post_act_fake_quantizer'], + last_8bit_module = [] + )), + bbox_head_detail = dict( + input_concrete_args = dict(in_num = 5), + preserve_attr = ['anchor_generator', 'assigner', 'bbox_coder', 'cls_out_channels', 'conv_cfg', 'dump_patches', 'feat_channels', 'fp16_enabled', + 'in_channels', 'init_cfg', 'is_init', 'norm_cfg', 'loss_bbox', 'loss_cls', 'loss_centerness', 'num_anchors' + , 'num_base_priors', 'num_classes', 'prior_generator', 'reg_decoded_bbox', 'sampler', 'sampling', 'stacked_convs', 'test_cfg', 'train_cfg', 'use_sigmoid_cls' + + , 'simple_test', 'async_simple_test_rpn', 'aug_test', 'aug_test_bboxes', 'aug_test_rpn', 'forward_single', 'forward_train', 'get_anchors', 'get_bboxes', 'get_targets', 'loss', 'loss_single', 'merge_aug_bboxes', + 'simple_test_bboxes', 'simple_test_rpn', '_get_bboxes_single', '_get_target_single', 'get_num_level_anchors_inside', 'centerness_target', '_bbox_post_process', 'get_anchors', '_get_targets_single'], + not_duplicated_prefixes = ['cls_convs', 'reg_convs', 'atss_cls', 'atss_reg', 'atss_centerness'], + further_detail = dict( + exclude_prefixes = [], + removed_quantizer_names = ['getitem_2_post_act_fake_quantizer','getitem_3_post_act_fake_quantizer'], + qloss_flag = True, + specified_general_quantizers = [], + last_8bit_module = ['atss_cls', 'atss_reg', 'atss_centerness'] + ))) \ No newline at end of file diff --git a/configs/atss/atss_r101_fpn_1x_coco.py b/configs/atss/atss_r101_fpn_1x_coco.py new file mode 100644 index 0000000..5225d2a --- /dev/null +++ b/configs/atss/atss_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './atss_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/atss/atss_r50_fpn_1x_coco.py b/configs/atss/atss_r50_fpn_1x_coco.py new file mode 100644 index 0000000..3b84df8 --- /dev/null +++ b/configs/atss/atss_r50_fpn_1x_coco.py @@ -0,0 +1,62 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='ATSS', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='/workspace/whole_world/bdata1/long.huang/temp/pretrained/backbones/resnet50-19c8e357.pth')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + bbox_head=dict( + type='ATSSHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=2.0), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), + # training and testing settings + train_cfg=dict( + assigner=dict(type='ATSSAssigner', topk=9), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/configs/atss/atss_r50_fpn_1x_coco_quant_w2a2.py b/configs/atss/atss_r50_fpn_1x_coco_quant_w2a2.py new file mode 100644 index 0000000..949b961 --- /dev/null +++ b/configs/atss/atss_r50_fpn_1x_coco_quant_w2a2.py @@ -0,0 +1,76 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_qat_w2a2.py', '../_base_/default_runtime.py' + , 'atss_quant_general.py', +] +model = dict( + type='ATSS', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + # frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=False, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='/workspace/whole_world/rdata/share/pretrained/checkpoints/resnet50-19c8e357.pth')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + bbox_head=dict( + type='ATSSHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=2.0), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), + # training and testing settings + train_cfg=dict( + assigner=dict(type='ATSSAssigner', topk=9), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) +# optimizer +# optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +evaluation = dict(save_best='auto', interval=10, dynamic_intervals=[(11, 1)],metric='bbox') +checkpoint_config = dict(interval=10) +data = dict( + samples_per_gpu=8, # 就是16 + workers_per_gpu=8, +) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) +load_from = '../long_used_pretrained/atss_r50_fpn_1x_coco_20200209-985f7bd0.pth' +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=10, norm_type=2)) diff --git a/configs/atss/atss_r50_fpn_1x_coco_quant_w4a4.py b/configs/atss/atss_r50_fpn_1x_coco_quant_w4a4.py new file mode 100644 index 0000000..e09073b --- /dev/null +++ b/configs/atss/atss_r50_fpn_1x_coco_quant_w4a4.py @@ -0,0 +1,76 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_qat_w4a4.py', '../_base_/default_runtime.py' + , 'atss_quant_general.py', +] +model = dict( + type='ATSS', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + # frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=False, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='/workspace/whole_world/rdata/share/pretrained/checkpoints/resnet50-19c8e357.pth')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + bbox_head=dict( + type='ATSSHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=2.0), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), + # training and testing settings + train_cfg=dict( + assigner=dict(type='ATSSAssigner', topk=9), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) +# optimizer +# optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +evaluation = dict(save_best='auto', interval=10, dynamic_intervals=[(11, 1)],metric='bbox') +checkpoint_config = dict(interval=10) +data = dict( + samples_per_gpu=16, # 就是16 + workers_per_gpu=8, +) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) +load_from = '../long_used_pretrained/atss_r50_fpn_1x_coco_20200209-985f7bd0.pth' +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=10, norm_type=2)) diff --git a/configs/atss/atss_r50_fpn_1x_voc.py b/configs/atss/atss_r50_fpn_1x_voc.py new file mode 100644 index 0000000..24f97a1 --- /dev/null +++ b/configs/atss/atss_r50_fpn_1x_voc.py @@ -0,0 +1,69 @@ +_base_ = [ + '../_base_/datasets/voc0712.py', + '../_base_/schedules/schedule_1x_voc_general.py', '../_base_/default_runtime.py' +] +model = dict( + type='ATSS', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='/workspace/whole_world/bdata1/long.huang/temp/pretrained/backbones/resnet50-19c8e357.pth')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + bbox_head=dict( + type='ATSSHead', + num_classes=20, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=2.0), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), + # training and testing settings + train_cfg=dict( + assigner=dict(type='ATSSAssigner', topk=9), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), # 奇怪,为甚恶魔atss这里是0.6?? + max_per_img=100)) +# dataset settings +data = dict( + samples_per_gpu=8, + workers_per_gpu=4) + +evaluation = dict(save_best='auto', interval=1, metric='bbox') + +# optimizer +# optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/configs/atss/atss_r50_fpn_1x_voc_quant_w2a2.py b/configs/atss/atss_r50_fpn_1x_voc_quant_w2a2.py new file mode 100644 index 0000000..5fc072e --- /dev/null +++ b/configs/atss/atss_r50_fpn_1x_voc_quant_w2a2.py @@ -0,0 +1,70 @@ +_base_ = [ + '../_base_/datasets/voc0712.py', + '../_base_/schedules/schedule_qat_w2a2.py', '../_base_/default_runtime.py', 'atss_quant_general.py' +] +model = dict( + type='ATSS', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + # frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=False, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='/workspace/whole_world/bdata1/long.huang/temp/pretrained/backbones/resnet50-19c8e357.pth')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + bbox_head=dict( + type='ATSSHead', + num_classes=20, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=2.0), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), + # training and testing settings + train_cfg=dict( + assigner=dict(type='ATSSAssigner', topk=9), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), # 奇怪,为甚恶魔atss这里是0.6?? + max_per_img=100)) +# dataset settings +data = dict( + samples_per_gpu=4, + workers_per_gpu=4) + +evaluation = dict(save_best='auto', interval=10, dynamic_intervals=[(11, 1)],metric='bbox') +checkpoint_config = dict(interval=10) +# optimizer +# optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +load_from = 'work_dirs/atss_r50_fpn_1x_voc/best_bbox_mAP_epoch_6.pth' diff --git a/configs/atss/metafile.yml b/configs/atss/metafile.yml new file mode 100644 index 0000000..f4c567e --- /dev/null +++ b/configs/atss/metafile.yml @@ -0,0 +1,60 @@ +Collections: + - Name: ATSS + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - ATSS + - FPN + - ResNet + Paper: + URL: https://arxiv.org/abs/1912.02424 + Title: 'Bridging the Gap Between Anchor-based and Anchor-free Detection via Adaptive Training Sample Selection' + README: configs/atss/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/detectors/atss.py#L6 + Version: v2.0.0 + +Models: + - Name: atss_r50_fpn_1x_coco + In Collection: ATSS + Config: configs/atss/atss_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 3.7 + inference time (ms/im): + - value: 50.76 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/atss/atss_r50_fpn_1x_coco/atss_r50_fpn_1x_coco_20200209-985f7bd0.pth + + - Name: atss_r101_fpn_1x_coco + In Collection: ATSS + Config: configs/atss/atss_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 5.6 + inference time (ms/im): + - value: 81.3 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/atss/atss_r101_fpn_1x_coco/atss_r101_fpn_1x_20200825-dfcadd6f.pth diff --git a/configs/autoassign/README.md b/configs/autoassign/README.md new file mode 100644 index 0000000..1297206 --- /dev/null +++ b/configs/autoassign/README.md @@ -0,0 +1,35 @@ +# AutoAssign + +> [AutoAssign: Differentiable Label Assignment for Dense Object Detection](https://arxiv.org/abs/2007.03496) + + + +## Abstract + +Determining positive/negative samples for object detection is known as label assignment. Here we present an anchor-free detector named AutoAssign. It requires little human knowledge and achieves appearance-aware through a fully differentiable weighting mechanism. During training, to both satisfy the prior distribution of data and adapt to category characteristics, we present Center Weighting to adjust the category-specific prior distributions. To adapt to object appearances, Confidence Weighting is proposed to adjust the specific assign strategy of each instance. The two weighting modules are then combined to generate positive and negative weights to adjust each location's confidence. Extensive experiments on the MS COCO show that our method steadily surpasses other best sampling strategies by large margins with various backbones. Moreover, our best model achieves 52.1% AP, outperforming all existing one-stage detectors. Besides, experiments on other datasets, e.g., PASCAL VOC, Objects365, and WiderFace, demonstrate the broad applicability of AutoAssign. + +
+ +
+ +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | box AP | Config | Download | +| :------: | :---: | :-----: | :------: | :----: | :------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | caffe | 1x | 4.08 | 40.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/autoassign/auto_assign_r50_fpn_1x_coco/auto_assign_r50_fpn_1x_coco_20210413_115540-5e17991f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/autoassign/auto_assign_r50_fpn_1x_coco/auto_assign_r50_fpn_1x_coco_20210413_115540-5e17991f.log.json) | + +**Note**: + +1. We find that the performance is unstable with 1x setting and may fluctuate by about 0.3 mAP. mAP 40.3 ~ 40.6 is acceptable. Such fluctuation can also be found in the original implementation. +2. You can get a more stable results ~ mAP 40.6 with a schedule total 13 epoch, and learning rate is divided by 10 at 10th and 13th epoch. + +## Citation + +```latex +@article{zhu2020autoassign, + title={AutoAssign: Differentiable Label Assignment for Dense Object Detection}, + author={Zhu, Benjin and Wang, Jianfeng and Jiang, Zhengkai and Zong, Fuhang and Liu, Songtao and Li, Zeming and Sun, Jian}, + journal={arXiv preprint arXiv:2007.03496}, + year={2020} +} +``` diff --git a/configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py b/configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py new file mode 100644 index 0000000..db548dc --- /dev/null +++ b/configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py @@ -0,0 +1,85 @@ +# We follow the original implementation which +# adopts the Caffe pre-trained backbone. +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='AutoAssign', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs=True, + num_outs=5, + relu_before_extra_convs=True, + init_cfg=dict(type='Caffe2Xavier', layer='Conv2d')), + bbox_head=dict( + type='AutoAssignHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + strides=[8, 16, 32, 64, 128], + loss_bbox=dict(type='GIoULoss', loss_weight=5.0)), + train_cfg=None, + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) +img_norm_cfg = dict( + mean=[102.9801, 115.9465, 122.7717], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(lr=0.01, paramwise_cfg=dict(norm_decay_mult=0.)) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=1.0 / 1000, + step=[8, 11]) +total_epochs = 12 diff --git a/configs/autoassign/metafile.yml b/configs/autoassign/metafile.yml new file mode 100644 index 0000000..f1e9051 --- /dev/null +++ b/configs/autoassign/metafile.yml @@ -0,0 +1,33 @@ +Collections: + - Name: AutoAssign + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - AutoAssign + - FPN + - ResNet + Paper: + URL: https://arxiv.org/abs/2007.03496 + Title: 'AutoAssign: Differentiable Label Assignment for Dense Object Detection' + README: configs/autoassign/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.12.0/mmdet/models/detectors/autoassign.py#L6 + Version: v2.12.0 + +Models: + - Name: autoassign_r50_fpn_8x2_1x_coco + In Collection: AutoAssign + Config: configs/autoassign/autoassign_r50_fpn_8x2_1x_coco.py + Metadata: + Training Memory (GB): 4.08 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/autoassign/auto_assign_r50_fpn_1x_coco/auto_assign_r50_fpn_1x_coco_20210413_115540-5e17991f.pth diff --git a/configs/carafe/README.md b/configs/carafe/README.md new file mode 100644 index 0000000..803abe0 --- /dev/null +++ b/configs/carafe/README.md @@ -0,0 +1,42 @@ +# CARAFE + +> [CARAFE: Content-Aware ReAssembly of FEatures](https://arxiv.org/abs/1905.02188) + + + +## Abstract + +Feature upsampling is a key operation in a number of modern convolutional network architectures, e.g. feature pyramids. Its design is critical for dense prediction tasks such as object detection and semantic/instance segmentation. In this work, we propose Content-Aware ReAssembly of FEatures (CARAFE), a universal, lightweight and highly effective operator to fulfill this goal. CARAFE has several appealing properties: (1) Large field of view. Unlike previous works (e.g. bilinear interpolation) that only exploit sub-pixel neighborhood, CARAFE can aggregate contextual information within a large receptive field. (2) Content-aware handling. Instead of using a fixed kernel for all samples (e.g. deconvolution), CARAFE enables instance-specific content-aware handling, which generates adaptive kernels on-the-fly. (3) Lightweight and fast to compute. CARAFE introduces little computational overhead and can be readily integrated into modern network architectures. We conduct comprehensive evaluations on standard benchmarks in object detection, instance/semantic segmentation and inpainting. CARAFE shows consistent and substantial gains across all the tasks (1.2%, 1.3%, 1.8%, 1.1db respectively) with negligible computational overhead. It has great potential to serve as a strong building block for future research. It has great potential to serve as a strong building block for future research. + +
+ +
+ +## Results and Models + +The results on COCO 2017 val is shown in the below table. + +| Method | Backbone | Style | Lr schd | Test Proposal Num | Inf time (fps) | Box AP | Mask AP | Config | Download | +| :--------------------: | :------: | :-----: | :-----: | :---------------: | :------------: | :----: | :-----: | :------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Faster R-CNN w/ CARAFE | R-50-FPN | pytorch | 1x | 1000 | 16.5 | 38.6 | 38.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/carafe/faster_rcnn_r50_fpn_carafe_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/carafe/faster_rcnn_r50_fpn_carafe_1x_coco/faster_rcnn_r50_fpn_carafe_1x_coco_bbox_mAP-0.386_20200504_175733-385a75b7.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/carafe/faster_rcnn_r50_fpn_carafe_1x_coco/faster_rcnn_r50_fpn_carafe_1x_coco_20200504_175733.log.json) | +| - | - | - | - | 2000 | | | | | | +| Mask R-CNN w/ CARAFE | R-50-FPN | pytorch | 1x | 1000 | 14.0 | 39.3 | 35.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/carafe/mask_rcnn_r50_fpn_carafe_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/carafe/mask_rcnn_r50_fpn_carafe_1x_coco/mask_rcnn_r50_fpn_carafe_1x_coco_bbox_mAP-0.393__segm_mAP-0.358_20200503_135957-8687f195.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/carafe/mask_rcnn_r50_fpn_carafe_1x_coco/mask_rcnn_r50_fpn_carafe_1x_coco_20200503_135957.log.json) | +| - | - | - | - | 2000 | | | | | | + +## Implementation + +The CUDA implementation of CARAFE can be find at https://github.com/myownskyW7/CARAFE. + +## Citation + +We provide config files to reproduce the object detection & instance segmentation results in the ICCV 2019 Oral paper for [CARAFE: Content-Aware ReAssembly of FEatures](https://arxiv.org/abs/1905.02188). + +```latex +@inproceedings{Wang_2019_ICCV, + title = {CARAFE: Content-Aware ReAssembly of FEatures}, + author = {Wang, Jiaqi and Chen, Kai and Xu, Rui and Liu, Ziwei and Loy, Chen Change and Lin, Dahua}, + booktitle = {The IEEE International Conference on Computer Vision (ICCV)}, + month = {October}, + year = {2019} +} +``` diff --git a/configs/carafe/faster_rcnn_r50_fpn_carafe_1x_coco.py b/configs/carafe/faster_rcnn_r50_fpn_carafe_1x_coco.py new file mode 100644 index 0000000..dedac3f --- /dev/null +++ b/configs/carafe/faster_rcnn_r50_fpn_carafe_1x_coco.py @@ -0,0 +1,50 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + neck=dict( + type='FPN_CARAFE', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5, + start_level=0, + end_level=-1, + norm_cfg=None, + act_cfg=None, + order=('conv', 'norm', 'act'), + upsample_cfg=dict( + type='carafe', + up_kernel=5, + up_group=1, + encoder_kernel=3, + encoder_dilation=1, + compressed_channels=64))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=64), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=64), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/carafe/mask_rcnn_r50_fpn_carafe_1x_coco.py b/configs/carafe/mask_rcnn_r50_fpn_carafe_1x_coco.py new file mode 100644 index 0000000..668c023 --- /dev/null +++ b/configs/carafe/mask_rcnn_r50_fpn_carafe_1x_coco.py @@ -0,0 +1,60 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + neck=dict( + type='FPN_CARAFE', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5, + start_level=0, + end_level=-1, + norm_cfg=None, + act_cfg=None, + order=('conv', 'norm', 'act'), + upsample_cfg=dict( + type='carafe', + up_kernel=5, + up_group=1, + encoder_kernel=3, + encoder_dilation=1, + compressed_channels=64)), + roi_head=dict( + mask_head=dict( + upsample_cfg=dict( + type='carafe', + scale_factor=2, + up_kernel=5, + up_group=1, + encoder_kernel=3, + encoder_dilation=1, + compressed_channels=64)))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=64), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=64), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/carafe/metafile.yml b/configs/carafe/metafile.yml new file mode 100644 index 0000000..b58a3f6 --- /dev/null +++ b/configs/carafe/metafile.yml @@ -0,0 +1,55 @@ +Collections: + - Name: CARAFE + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RPN + - FPN_CARAFE + - ResNet + - RoIPool + Paper: + URL: https://arxiv.org/abs/1905.02188 + Title: 'CARAFE: Content-Aware ReAssembly of FEatures' + README: configs/carafe/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.12.0/mmdet/models/necks/fpn_carafe.py#L11 + Version: v2.12.0 + +Models: + - Name: faster_rcnn_r50_fpn_carafe_1x_coco + In Collection: CARAFE + Config: configs/carafe/faster_rcnn_r50_fpn_carafe_1x_coco.py + Metadata: + Training Memory (GB): 4.26 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/carafe/faster_rcnn_r50_fpn_carafe_1x_coco/faster_rcnn_r50_fpn_carafe_1x_coco_bbox_mAP-0.386_20200504_175733-385a75b7.pth + + - Name: mask_rcnn_r50_fpn_carafe_1x_coco + In Collection: CARAFE + Config: configs/carafe/mask_rcnn_r50_fpn_carafe_1x_coco.py + Metadata: + Training Memory (GB): 4.31 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 35.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/carafe/mask_rcnn_r50_fpn_carafe_1x_coco/mask_rcnn_r50_fpn_carafe_1x_coco_bbox_mAP-0.393__segm_mAP-0.358_20200503_135957-8687f195.pth diff --git a/configs/cascade_rcnn/README.md b/configs/cascade_rcnn/README.md new file mode 100644 index 0000000..5a9e817 --- /dev/null +++ b/configs/cascade_rcnn/README.md @@ -0,0 +1,79 @@ +# Cascade R-CNN + +> [Cascade R-CNN: High Quality Object Detection and Instance Segmentation](https://arxiv.org/abs/1906.09756) + + + +## Abstract + +In object detection, the intersection over union (IoU) threshold is frequently used to define positives/negatives. The threshold used to train a detector defines its quality. While the commonly used threshold of 0.5 leads to noisy (low-quality) detections, detection performance frequently degrades for larger thresholds. This paradox of high-quality detection has two causes: 1) overfitting, due to vanishing positive samples for large thresholds, and 2) inference-time quality mismatch between detector and test hypotheses. A multi-stage object detection architecture, the Cascade R-CNN, composed of a sequence of detectors trained with increasing IoU thresholds, is proposed to address these problems. The detectors are trained sequentially, using the output of a detector as training set for the next. This resampling progressively improves hypotheses quality, guaranteeing a positive training set of equivalent size for all detectors and minimizing overfitting. The same cascade is applied at inference, to eliminate quality mismatches between hypotheses and detectors. An implementation of the Cascade R-CNN without bells or whistles achieves state-of-the-art performance on the COCO dataset, and significantly improves high-quality detection on generic and specific object detection datasets, including VOC, KITTI, CityPerson, and WiderFace. Finally, the Cascade R-CNN is generalized to instance segmentation, with nontrivial improvements over the Mask R-CNN. + +
+ +
+ +## Results and Models + +### Cascade R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :--------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | caffe | 1x | 4.2 | | 40.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_rcnn_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r50_caffe_fpn_1x_coco/cascade_rcnn_r50_caffe_fpn_1x_coco_bbox_mAP-0.404_20200504_174853-b857be87.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r50_caffe_fpn_1x_coco/cascade_rcnn_r50_caffe_fpn_1x_coco_20200504_174853.log.json) | +| R-50-FPN | pytorch | 1x | 4.4 | 16.1 | 40.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco/cascade_rcnn_r50_fpn_1x_coco_20200316-3dc56deb.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco/cascade_rcnn_r50_fpn_1x_coco_20200316_214748.log.json) | +| R-50-FPN | pytorch | 20e | - | - | 41.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_rcnn_r50_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r50_fpn_20e_coco/cascade_rcnn_r50_fpn_20e_coco_bbox_mAP-0.41_20200504_175131-e9872a90.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r50_fpn_20e_coco/cascade_rcnn_r50_fpn_20e_coco_20200504_175131.log.json) | +| R-101-FPN | caffe | 1x | 6.2 | | 42.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_rcnn_r101_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r101_caffe_fpn_1x_coco/cascade_rcnn_r101_caffe_fpn_1x_coco_bbox_mAP-0.423_20200504_175649-cab8dbd5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r101_caffe_fpn_1x_coco/cascade_rcnn_r101_caffe_fpn_1x_coco_20200504_175649.log.json) | +| R-101-FPN | pytorch | 1x | 6.4 | 13.5 | 42.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_rcnn_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r101_fpn_1x_coco/cascade_rcnn_r101_fpn_1x_coco_20200317-0b6a2fbf.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r101_fpn_1x_coco/cascade_rcnn_r101_fpn_1x_coco_20200317_101744.log.json) | +| R-101-FPN | pytorch | 20e | - | - | 42.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_rcnn_r101_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r101_fpn_20e_coco/cascade_rcnn_r101_fpn_20e_coco_bbox_mAP-0.425_20200504_231812-5057dcc5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r101_fpn_20e_coco/cascade_rcnn_r101_fpn_20e_coco_20200504_231812.log.json) | +| X-101-32x4d-FPN | pytorch | 1x | 7.6 | 10.9 | 43.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_1x_coco/cascade_rcnn_x101_32x4d_fpn_1x_coco_20200316-95c2deb6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_1x_coco/cascade_rcnn_x101_32x4d_fpn_1x_coco_20200316_055608.log.json) | +| X-101-32x4d-FPN | pytorch | 20e | 7.6 | | 43.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_20e_coco/cascade_rcnn_x101_32x4d_fpn_20e_coco_20200906_134608-9ae0a720.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_20e_coco/cascade_rcnn_x101_32x4d_fpn_20e_coco_20200906_134608.log.json) | +| X-101-64x4d-FPN | pytorch | 1x | 10.7 | | 44.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_1x_coco/cascade_rcnn_x101_64x4d_fpn_1x_coco_20200515_075702-43ce6a30.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_1x_coco/cascade_rcnn_x101_64x4d_fpn_1x_coco_20200515_075702.log.json) | +| X-101-64x4d-FPN | pytorch | 20e | 10.7 | | 44.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_20e_coco/cascade_rcnn_x101_64x4d_fpn_20e_coco_20200509_224357-051557b1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_20e_coco/cascade_rcnn_x101_64x4d_fpn_20e_coco_20200509_224357.log.json) | + +### Cascade Mask R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :-------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | caffe | 1x | 5.9 | | 41.2 | 36.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_1x_coco/cascade_mask_rcnn_r50_caffe_fpn_1x_coco_bbox_mAP-0.412__segm_mAP-0.36_20200504_174659-5004b251.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_1x_coco/cascade_mask_rcnn_r50_caffe_fpn_1x_coco_20200504_174659.log.json) | +| R-50-FPN | pytorch | 1x | 6.0 | 11.2 | 41.2 | 35.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco/cascade_mask_rcnn_r50_fpn_1x_coco_20200203-9d4dcb24.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco/cascade_mask_rcnn_r50_fpn_1x_coco_20200203_170449.log.json) | +| R-50-FPN | pytorch | 20e | - | - | 41.9 | 36.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_20e_coco/cascade_mask_rcnn_r50_fpn_20e_coco_bbox_mAP-0.419__segm_mAP-0.365_20200504_174711-4af8e66e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_20e_coco/cascade_mask_rcnn_r50_fpn_20e_coco_20200504_174711.log.json) | +| R-101-FPN | caffe | 1x | 7.8 | | 43.2 | 37.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_1x_coco/cascade_mask_rcnn_r101_caffe_fpn_1x_coco_bbox_mAP-0.432__segm_mAP-0.376_20200504_174813-5c1e9599.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_1x_coco/cascade_mask_rcnn_r101_caffe_fpn_1x_coco_20200504_174813.log.json) | +| R-101-FPN | pytorch | 1x | 7.9 | 9.8 | 42.9 | 37.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_fpn_1x_coco/cascade_mask_rcnn_r101_fpn_1x_coco_20200203-befdf6ee.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_fpn_1x_coco/cascade_mask_rcnn_r101_fpn_1x_coco_20200203_092521.log.json) | +| R-101-FPN | pytorch | 20e | - | - | 43.4 | 37.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_fpn_20e_coco/cascade_mask_rcnn_r101_fpn_20e_coco_bbox_mAP-0.434__segm_mAP-0.378_20200504_174836-005947da.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_fpn_20e_coco/cascade_mask_rcnn_r101_fpn_20e_coco_20200504_174836.log.json) | +| X-101-32x4d-FPN | pytorch | 1x | 9.2 | 8.6 | 44.3 | 38.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco_20200201-0f411b1f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco_20200201_052416.log.json) | +| X-101-32x4d-FPN | pytorch | 20e | 9.2 | - | 45.0 | 39.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco_20200528_083917-ed1f4751.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco_20200528_083917.log.json) | +| X-101-64x4d-FPN | pytorch | 1x | 12.2 | 6.7 | 45.3 | 39.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco_20200203-9a2db89d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco_20200203_044059.log.json) | +| X-101-64x4d-FPN | pytorch | 20e | 12.2 | | 45.6 | 39.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco_20200512_161033-bdb5126a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco_20200512_161033.log.json) | + +**Notes:** + +- The `20e` schedule in Cascade (Mask) R-CNN indicates decreasing the lr at 16 and 19 epochs, with a total of 20 epochs. + +## Pre-trained Models + +We also train some models with longer schedules and multi-scale training for Cascade Mask R-CNN. The users could finetune them for downstream tasks. + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :--------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | caffe | 3x | 5.7 | | 44.0 | 38.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210707_002651-6e29b3a6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210707_002651.log.json) | +| R-50-FPN | pytorch | 3x | 5.9 | | 44.3 | 38.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco_20210628_164719-5bdc3824.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco_20210628_164719.log.json) | +| R-101-FPN | caffe | 3x | 7.7 | | 45.4 | 39.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco_20210707_002620-a5bd2389.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco_20210707_002620.log.json) | +| R-101-FPN | pytorch | 3x | 7.8 | | 45.5 | 39.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco_20210628_165236-51a2d363.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco_20210628_165236.log.json) | +| X-101-32x4d-FPN | pytorch | 3x | 9.0 | | 46.3 | 40.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco_20210706_225234-40773067.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco_20210706_225234.log.json) | +| X-101-32x8d-FPN | pytorch | 3x | 12.1 | | 46.1 | 39.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco_20210719_180640-9ff7e76f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco_20210719_180640.log.json) | +| X-101-64x4d-FPN | pytorch | 3x | 12.0 | | 46.6 | 40.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco_20210719_210311-d3e64ba0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco_20210719_210311.log.json) | + +## Citation + +```latex +@article{Cai_2019, + title={Cascade R-CNN: High Quality Object Detection and Instance Segmentation}, + ISSN={1939-3539}, + url={http://dx.doi.org/10.1109/tpami.2019.2956516}, + DOI={10.1109/tpami.2019.2956516}, + journal={IEEE Transactions on Pattern Analysis and Machine Intelligence}, + publisher={Institute of Electrical and Electronics Engineers (IEEE)}, + author={Cai, Zhaowei and Vasconcelos, Nuno}, + year={2019}, + pages={1–1} +} +``` diff --git a/configs/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_1x_coco.py b/configs/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..5ee6231 --- /dev/null +++ b/configs/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './cascade_mask_rcnn_r50_caffe_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) diff --git a/configs/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco.py b/configs/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..1df87fc --- /dev/null +++ b/configs/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco.py @@ -0,0 +1,7 @@ +_base_ = './cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) diff --git a/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_1x_coco.py b/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_1x_coco.py new file mode 100644 index 0000000..f59c155 --- /dev/null +++ b/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_20e_coco.py b/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_20e_coco.py new file mode 100644 index 0000000..45ab7ed --- /dev/null +++ b/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_20e_coco.py @@ -0,0 +1,6 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_20e_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco.py b/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..1b20f16 --- /dev/null +++ b/configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco.py @@ -0,0 +1,6 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_1x_coco.py b/configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..12d37ef --- /dev/null +++ b/configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,41 @@ +_base_ = ['./cascade_mask_rcnn_r50_fpn_1x_coco.py'] + +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco.py b/configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..9fb817e --- /dev/null +++ b/configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco.py @@ -0,0 +1,49 @@ +_base_ = ['./cascade_mask_rcnn_r50_fpn_mstrain_3x_coco.py'] +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) + +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +# In mstrain 3x config, img_scale=[(1333, 640), (1333, 800)], +# multiscale_mode='range' +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + train=dict(dataset=dict(pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py b/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..49ab539 --- /dev/null +++ b/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/cascade_mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] diff --git a/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_20e_coco.py b/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_20e_coco.py new file mode 100644 index 0000000..1296dc4 --- /dev/null +++ b/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_20e_coco.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/cascade_mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_20e.py', '../_base_/default_runtime.py' +] diff --git a/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco.py b/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..ed0c6d1 --- /dev/null +++ b/configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco.py @@ -0,0 +1,4 @@ +_base_ = [ + '../common/mstrain_3x_coco_instance.py', + '../_base_/models/cascade_mask_rcnn_r50_fpn.py' +] diff --git a/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco.py b/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..06cbbe7 --- /dev/null +++ b/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco.py b/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco.py new file mode 100644 index 0000000..4e35236 --- /dev/null +++ b/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco.py @@ -0,0 +1,14 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_20e_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py b/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..7d37d17 --- /dev/null +++ b/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py @@ -0,0 +1,14 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py b/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..eeec1aa --- /dev/null +++ b/configs/cascade_rcnn/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py @@ -0,0 +1,60 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_mstrain_3x_coco.py' + +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=8, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + style='pytorch', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnext101_32x8d'))) + +# ResNeXt-101-32x8d model trained with Caffe2 at FB, +# so the mean and std need to be changed. +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], + std=[57.375, 57.120, 58.395], + to_rgb=False) + +# In mstrain 3x config, img_scale=[(1333, 640), (1333, 800)], +# multiscale_mode='range' +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + train=dict(dataset=dict(pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco.py b/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..7dbef5f --- /dev/null +++ b/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco.py b/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco.py new file mode 100644 index 0000000..579b1ac --- /dev/null +++ b/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco.py @@ -0,0 +1,14 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_20e_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py b/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..ed6cf4b --- /dev/null +++ b/configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py @@ -0,0 +1,14 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/cascade_rcnn/cascade_rcnn_r101_caffe_fpn_1x_coco.py b/configs/cascade_rcnn/cascade_rcnn_r101_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..1e90f4b --- /dev/null +++ b/configs/cascade_rcnn/cascade_rcnn_r101_caffe_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './cascade_rcnn_r50_caffe_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) diff --git a/configs/cascade_rcnn/cascade_rcnn_r101_fpn_1x_coco.py b/configs/cascade_rcnn/cascade_rcnn_r101_fpn_1x_coco.py new file mode 100644 index 0000000..5c07776 --- /dev/null +++ b/configs/cascade_rcnn/cascade_rcnn_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './cascade_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/cascade_rcnn/cascade_rcnn_r101_fpn_20e_coco.py b/configs/cascade_rcnn/cascade_rcnn_r101_fpn_20e_coco.py new file mode 100644 index 0000000..b1719c2 --- /dev/null +++ b/configs/cascade_rcnn/cascade_rcnn_r101_fpn_20e_coco.py @@ -0,0 +1,6 @@ +_base_ = './cascade_rcnn_r50_fpn_20e_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/cascade_rcnn/cascade_rcnn_r50_caffe_fpn_1x_coco.py b/configs/cascade_rcnn/cascade_rcnn_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..696bcfb --- /dev/null +++ b/configs/cascade_rcnn/cascade_rcnn_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,42 @@ +_base_ = './cascade_rcnn_r50_fpn_1x_coco.py' + +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) + +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py b/configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..87e21fb --- /dev/null +++ b/configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/cascade_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] diff --git a/configs/cascade_rcnn/cascade_rcnn_r50_fpn_20e_coco.py b/configs/cascade_rcnn/cascade_rcnn_r50_fpn_20e_coco.py new file mode 100644 index 0000000..6f886e1 --- /dev/null +++ b/configs/cascade_rcnn/cascade_rcnn_r50_fpn_20e_coco.py @@ -0,0 +1,4 @@ +_base_ = './cascade_rcnn_r50_fpn_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 19]) +runner = dict(type='EpochBasedRunner', max_epochs=20) diff --git a/configs/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_1x_coco.py b/configs/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..5ac02c1 --- /dev/null +++ b/configs/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './cascade_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_20e_coco.py b/configs/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_20e_coco.py new file mode 100644 index 0000000..486e45e --- /dev/null +++ b/configs/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_20e_coco.py @@ -0,0 +1,14 @@ +_base_ = './cascade_rcnn_r50_fpn_20e_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_1x_coco.py b/configs/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..78229f0 --- /dev/null +++ b/configs/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,15 @@ +_base_ = './cascade_rcnn_r50_fpn_1x_coco.py' +model = dict( + type='CascadeRCNN', + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_20e_coco.py b/configs/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_20e_coco.py new file mode 100644 index 0000000..58812de --- /dev/null +++ b/configs/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_20e_coco.py @@ -0,0 +1,15 @@ +_base_ = './cascade_rcnn_r50_fpn_20e_coco.py' +model = dict( + type='CascadeRCNN', + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/cascade_rcnn/metafile.yml b/configs/cascade_rcnn/metafile.yml new file mode 100644 index 0000000..6586325 --- /dev/null +++ b/configs/cascade_rcnn/metafile.yml @@ -0,0 +1,545 @@ +Collections: + - Name: Cascade R-CNN + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Cascade R-CNN + - FPN + - RPN + - ResNet + - RoIAlign + Paper: + URL: http://dx.doi.org/10.1109/tpami.2019.2956516 + Title: 'Cascade R-CNN: Delving into High Quality Object Detection' + README: configs/cascade_rcnn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/detectors/cascade_rcnn.py#L6 + Version: v2.0.0 + - Name: Cascade Mask R-CNN + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Cascade R-CNN + - FPN + - RPN + - ResNet + - RoIAlign + Paper: + URL: http://dx.doi.org/10.1109/tpami.2019.2956516 + Title: 'Cascade R-CNN: Delving into High Quality Object Detection' + README: configs/cascade_rcnn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/detectors/cascade_rcnn.py#L6 + Version: v2.0.0 + +Models: + - Name: cascade_rcnn_r50_caffe_fpn_1x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_rcnn_r50_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.2 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r50_caffe_fpn_1x_coco/cascade_rcnn_r50_caffe_fpn_1x_coco_bbox_mAP-0.404_20200504_174853-b857be87.pth + + - Name: cascade_rcnn_r50_fpn_1x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.4 + inference time (ms/im): + - value: 62.11 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco/cascade_rcnn_r50_fpn_1x_coco_20200316-3dc56deb.pth + + - Name: cascade_rcnn_r50_fpn_20e_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_rcnn_r50_fpn_20e_coco.py + Metadata: + Training Memory (GB): 4.4 + inference time (ms/im): + - value: 62.11 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r50_fpn_20e_coco/cascade_rcnn_r50_fpn_20e_coco_bbox_mAP-0.41_20200504_175131-e9872a90.pth + + - Name: cascade_rcnn_r101_caffe_fpn_1x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_rcnn_r101_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.2 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r101_caffe_fpn_1x_coco/cascade_rcnn_r101_caffe_fpn_1x_coco_bbox_mAP-0.423_20200504_175649-cab8dbd5.pth + + - Name: cascade_rcnn_r101_fpn_1x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_rcnn_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.4 + inference time (ms/im): + - value: 74.07 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r101_fpn_1x_coco/cascade_rcnn_r101_fpn_1x_coco_20200317-0b6a2fbf.pth + + - Name: cascade_rcnn_r101_fpn_20e_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_rcnn_r101_fpn_20e_coco.py + Metadata: + Training Memory (GB): 6.4 + inference time (ms/im): + - value: 74.07 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_r101_fpn_20e_coco/cascade_rcnn_r101_fpn_20e_coco_bbox_mAP-0.425_20200504_231812-5057dcc5.pth + + - Name: cascade_rcnn_x101_32x4d_fpn_1x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.6 + inference time (ms/im): + - value: 91.74 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_1x_coco/cascade_rcnn_x101_32x4d_fpn_1x_coco_20200316-95c2deb6.pth + + - Name: cascade_rcnn_x101_32x4d_fpn_20e_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_20e_coco.py + Metadata: + Training Memory (GB): 7.6 + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_32x4d_fpn_20e_coco/cascade_rcnn_x101_32x4d_fpn_20e_coco_20200906_134608-9ae0a720.pth + + - Name: cascade_rcnn_x101_64x4d_fpn_1x_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 10.7 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_1x_coco/cascade_rcnn_x101_64x4d_fpn_1x_coco_20200515_075702-43ce6a30.pth + + - Name: cascade_rcnn_x101_64x4d_fpn_20e_coco + In Collection: Cascade R-CNN + Config: configs/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_20e_coco.py + Metadata: + Training Memory (GB): 10.7 + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_rcnn_x101_64x4d_fpn_20e_coco/cascade_rcnn_x101_64x4d_fpn_20e_coco_20200509_224357-051557b1.pth + + - Name: cascade_mask_rcnn_r50_caffe_fpn_1x_coco + In Collection: Cascade Mask R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 5.9 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_1x_coco/cascade_mask_rcnn_r50_caffe_fpn_1x_coco_bbox_mAP-0.412__segm_mAP-0.36_20200504_174659-5004b251.pth + + - Name: cascade_mask_rcnn_r50_fpn_1x_coco + In Collection: Cascade Mask R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.0 + inference time (ms/im): + - value: 89.29 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 35.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco/cascade_mask_rcnn_r50_fpn_1x_coco_20200203-9d4dcb24.pth + + - Name: cascade_mask_rcnn_r50_fpn_20e_coco + In Collection: Cascade Mask R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_20e_coco.py + Metadata: + Training Memory (GB): 6.0 + inference time (ms/im): + - value: 89.29 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_20e_coco/cascade_mask_rcnn_r50_fpn_20e_coco_bbox_mAP-0.419__segm_mAP-0.365_20200504_174711-4af8e66e.pth + + - Name: cascade_mask_rcnn_r101_caffe_fpn_1x_coco + In Collection: Cascade Mask R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.8 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_1x_coco/cascade_mask_rcnn_r101_caffe_fpn_1x_coco_bbox_mAP-0.432__segm_mAP-0.376_20200504_174813-5c1e9599.pth + + - Name: cascade_mask_rcnn_r101_fpn_1x_coco + In Collection: Cascade Mask R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.9 + inference time (ms/im): + - value: 102.04 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_fpn_1x_coco/cascade_mask_rcnn_r101_fpn_1x_coco_20200203-befdf6ee.pth + + - Name: cascade_mask_rcnn_r101_fpn_20e_coco + In Collection: Cascade Mask R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_20e_coco.py + Metadata: + Training Memory (GB): 7.9 + inference time (ms/im): + - value: 102.04 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_fpn_20e_coco/cascade_mask_rcnn_r101_fpn_20e_coco_bbox_mAP-0.434__segm_mAP-0.378_20200504_174836-005947da.pth + + - Name: cascade_mask_rcnn_x101_32x4d_fpn_1x_coco + In Collection: Cascade Mask R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 9.2 + inference time (ms/im): + - value: 116.28 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco_20200201-0f411b1f.pth + + - Name: cascade_mask_rcnn_x101_32x4d_fpn_20e_coco + In Collection: Cascade Mask R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco.py + Metadata: + Training Memory (GB): 9.2 + inference time (ms/im): + - value: 116.28 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco/cascade_mask_rcnn_x101_32x4d_fpn_20e_coco_20200528_083917-ed1f4751.pth + + - Name: cascade_mask_rcnn_x101_64x4d_fpn_1x_coco + In Collection: Cascade Mask R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 12.2 + inference time (ms/im): + - value: 149.25 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco/cascade_mask_rcnn_x101_64x4d_fpn_1x_coco_20200203-9a2db89d.pth + + - Name: cascade_mask_rcnn_x101_64x4d_fpn_20e_coco + In Collection: Cascade Mask R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco.py + Metadata: + Training Memory (GB): 12.2 + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco/cascade_mask_rcnn_x101_64x4d_fpn_20e_coco_20200512_161033-bdb5126a.pth + + - Name: cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco + In Collection: Cascade Mask R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 5.7 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco/cascade_mask_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210707_002651-6e29b3a6.pth + + - Name: cascade_mask_rcnn_r50_fpn_mstrain_3x_coco + In Collection: Cascade Mask R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 5.9 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco/cascade_mask_rcnn_r50_fpn_mstrain_3x_coco_20210628_164719-5bdc3824.pth + + - Name: cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco + In Collection: Cascade Mask R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 7.7 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco/cascade_mask_rcnn_r101_caffe_fpn_mstrain_3x_coco_20210707_002620-a5bd2389.pth + + - Name: cascade_mask_rcnn_r101_fpn_mstrain_3x_coco + In Collection: Cascade Mask R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 7.8 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco/cascade_mask_rcnn_r101_fpn_mstrain_3x_coco_20210628_165236-51a2d363.pth + + - Name: cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco + In Collection: Cascade Mask R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 9.0 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco/cascade_mask_rcnn_x101_32x4d_fpn_mstrain_3x_coco_20210706_225234-40773067.pth + + - Name: cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco + In Collection: Cascade Mask R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 12.1 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco/cascade_mask_rcnn_x101_32x8d_fpn_mstrain_3x_coco_20210719_180640-9ff7e76f.pth + + - Name: cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco + In Collection: Cascade Mask R-CNN + Config: configs/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 12.0 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco/cascade_mask_rcnn_x101_64x4d_fpn_mstrain_3x_coco_20210719_210311-d3e64ba0.pth diff --git a/configs/cascade_rpn/README.md b/configs/cascade_rpn/README.md new file mode 100644 index 0000000..fb2b482 --- /dev/null +++ b/configs/cascade_rpn/README.md @@ -0,0 +1,41 @@ +# Cascade RPN + +> [Cascade RPN: Delving into High-Quality Region Proposal Network with Adaptive Convolution](https://arxiv.org/abs/1909.06720) + + + +## Abstract + +This paper considers an architecture referred to as Cascade Region Proposal Network (Cascade RPN) for improving the region-proposal quality and detection performance by systematically addressing the limitation of the conventional RPN that heuristically defines the anchors and aligns the features to the anchors. First, instead of using multiple anchors with predefined scales and aspect ratios, Cascade RPN relies on a single anchor per location and performs multi-stage refinement. Each stage is progressively more stringent in defining positive samples by starting out with an anchor-free metric followed by anchor-based metrics in the ensuing stages. Second, to attain alignment between the features and the anchors throughout the stages, adaptive convolution is proposed that takes the anchors in addition to the image features as its input and learns the sampled features guided by the anchors. A simple implementation of a two-stage Cascade RPN achieves AR 13.4 points higher than that of the conventional RPN, surpassing any existing region proposal methods. When adopting to Fast R-CNN and Faster R-CNN, Cascade RPN can improve the detection mAP by 3.1 and 3.5 points, respectively. + +
+ +
+ +## Results and Models + +### Region proposal performance + +| Method | Backbone | Style | Mem (GB) | Train time (s/iter) | Inf time (fps) | AR 1000 | Config | Download | +| :----: | :------: | :---: | :------: | :-----------------: | :------------: | :-----: | :---------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------: | +| CRPN | R-50-FPN | caffe | - | - | - | 72.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rpn/crpn_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rpn/crpn_r50_caffe_fpn_1x_coco/cascade_rpn_r50_caffe_fpn_1x_coco-7aa93cef.pth) | + +### Detection performance + +| Method | Proposal | Backbone | Style | Schedule | Mem (GB) | Train time (s/iter) | Inf time (fps) | box AP | Config | Download | +| :----------: | :---------: | :------: | :---: | :------: | :------: | :-----------------: | :------------: | :----: | :---------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Fast R-CNN | Cascade RPN | R-50-FPN | caffe | 1x | - | - | - | 39.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rpn/crpn_fast_rcnn_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rpn/crpn_fast_rcnn_r50_caffe_fpn_1x_coco/crpn_fast_rcnn_r50_caffe_fpn_1x_coco-cb486e66.pth) | +| Faster R-CNN | Cascade RPN | R-50-FPN | caffe | 1x | - | - | - | 40.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco/crpn_faster_rcnn_r50_caffe_fpn_1x_coco-c8283cca.pth) | + +## Citation + +We provide the code for reproducing experiment results of [Cascade RPN](https://arxiv.org/abs/1909.06720). + +```latex +@inproceedings{vu2019cascade, + title={Cascade RPN: Delving into High-Quality Region Proposal Network with Adaptive Convolution}, + author={Vu, Thang and Jang, Hyunjun and Pham, Trung X and Yoo, Chang D}, + booktitle={Conference on Neural Information Processing Systems (NeurIPS)}, + year={2019} +} +``` diff --git a/configs/cascade_rpn/crpn_fast_rcnn_r50_caffe_fpn_1x_coco.py b/configs/cascade_rpn/crpn_fast_rcnn_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..29f5d07 --- /dev/null +++ b/configs/cascade_rpn/crpn_fast_rcnn_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,77 @@ +_base_ = '../fast_rcnn/fast_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + roi_head=dict( + bbox_head=dict( + bbox_coder=dict(target_stds=[0.04, 0.04, 0.08, 0.08]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.5), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rcnn=dict( + assigner=dict( + pos_iou_thr=0.65, neg_iou_thr=0.65, min_pos_iou=0.65), + sampler=dict(num=256))), + test_cfg=dict(rcnn=dict(score_thr=1e-3))) +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadProposals', num_max_proposals=300), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'proposals', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadProposals', num_max_proposals=300), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['proposals']), + dict( + type='ToDataContainer', + fields=[dict(key='proposals', stack=False)]), + dict(type='Collect', keys=['img', 'proposals']), + ]) +] +data = dict( + train=dict( + proposal_file=data_root + + 'proposals/crpn_r50_caffe_fpn_1x_train2017.pkl', + pipeline=train_pipeline), + val=dict( + proposal_file=data_root + + 'proposals/crpn_r50_caffe_fpn_1x_val2017.pkl', + pipeline=test_pipeline), + test=dict( + proposal_file=data_root + + 'proposals/crpn_r50_caffe_fpn_1x_val2017.pkl', + pipeline=test_pipeline)) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py b/configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..bad86e6 --- /dev/null +++ b/configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,92 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py' +rpn_weight = 0.7 +model = dict( + rpn_head=dict( + _delete_=True, + type='CascadeRPNHead', + num_stages=2, + stages=[ + dict( + type='StageCascadeRPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[1.0], + strides=[4, 8, 16, 32, 64]), + adapt_cfg=dict(type='dilation', dilation=3), + bridged_feature=True, + sampling=False, + with_cls=False, + reg_decoded_bbox=True, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=(.0, .0, .0, .0), + target_stds=(0.1, 0.1, 0.5, 0.5)), + loss_bbox=dict( + type='IoULoss', linear=True, + loss_weight=10.0 * rpn_weight)), + dict( + type='StageCascadeRPNHead', + in_channels=256, + feat_channels=256, + adapt_cfg=dict(type='offset'), + bridged_feature=False, + sampling=True, + with_cls=True, + reg_decoded_bbox=True, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=(.0, .0, .0, .0), + target_stds=(0.05, 0.05, 0.1, 0.1)), + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=1.0 * rpn_weight), + loss_bbox=dict( + type='IoULoss', linear=True, + loss_weight=10.0 * rpn_weight)) + ]), + roi_head=dict( + bbox_head=dict( + bbox_coder=dict(target_stds=[0.04, 0.04, 0.08, 0.08]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.5), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=[ + dict( + assigner=dict( + type='RegionAssigner', center_ratio=0.2, ignore_ratio=0.5), + allowed_border=-1, + pos_weight=-1, + debug=False), + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.7, + min_pos_iou=0.3, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + pos_weight=-1, + debug=False) + ], + rpn_proposal=dict(max_per_img=300, nms=dict(iou_threshold=0.8)), + rcnn=dict( + assigner=dict( + pos_iou_thr=0.65, neg_iou_thr=0.65, min_pos_iou=0.65), + sampler=dict(type='RandomSampler', num=256))), + test_cfg=dict( + rpn=dict(max_per_img=300, nms=dict(iou_threshold=0.8)), + rcnn=dict(score_thr=1e-3))) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/configs/cascade_rpn/crpn_r50_caffe_fpn_1x_coco.py b/configs/cascade_rpn/crpn_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..5562e69 --- /dev/null +++ b/configs/cascade_rpn/crpn_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,77 @@ +_base_ = '../rpn/rpn_r50_caffe_fpn_1x_coco.py' +model = dict( + rpn_head=dict( + _delete_=True, + type='CascadeRPNHead', + num_stages=2, + stages=[ + dict( + type='StageCascadeRPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[1.0], + strides=[4, 8, 16, 32, 64]), + adapt_cfg=dict(type='dilation', dilation=3), + bridged_feature=True, + sampling=False, + with_cls=False, + reg_decoded_bbox=True, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=(.0, .0, .0, .0), + target_stds=(0.1, 0.1, 0.5, 0.5)), + loss_bbox=dict(type='IoULoss', linear=True, loss_weight=10.0)), + dict( + type='StageCascadeRPNHead', + in_channels=256, + feat_channels=256, + adapt_cfg=dict(type='offset'), + bridged_feature=False, + sampling=True, + with_cls=True, + reg_decoded_bbox=True, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=(.0, .0, .0, .0), + target_stds=(0.05, 0.05, 0.1, 0.1)), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, + loss_weight=1.0), + loss_bbox=dict(type='IoULoss', linear=True, loss_weight=10.0)) + ]), + train_cfg=dict(rpn=[ + dict( + assigner=dict( + type='RegionAssigner', center_ratio=0.2, ignore_ratio=0.5), + allowed_border=-1, + pos_weight=-1, + debug=False), + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.7, + min_pos_iou=0.3, + ignore_iof_thr=-1, + iou_calculator=dict(type='BboxOverlaps2D')), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + pos_weight=-1, + debug=False) + ]), + test_cfg=dict( + rpn=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.8), + min_bbox_size=0))) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/configs/cascade_rpn/metafile.yml b/configs/cascade_rpn/metafile.yml new file mode 100644 index 0000000..335b2bc --- /dev/null +++ b/configs/cascade_rpn/metafile.yml @@ -0,0 +1,44 @@ +Collections: + - Name: Cascade RPN + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Cascade RPN + - FPN + - ResNet + Paper: + URL: https://arxiv.org/abs/1909.06720 + Title: 'Cascade RPN: Delving into High-Quality Region Proposal Network with Adaptive Convolution' + README: configs/cascade_rpn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.8.0/mmdet/models/dense_heads/cascade_rpn_head.py#L538 + Version: v2.8.0 + +Models: + - Name: crpn_fast_rcnn_r50_caffe_fpn_1x_coco + In Collection: Cascade RPN + Config: configs/cascade_rpn/crpn_fast_rcnn_r50_caffe_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rpn/crpn_fast_rcnn_r50_caffe_fpn_1x_coco/crpn_fast_rcnn_r50_caffe_fpn_1x_coco-cb486e66.pth + + - Name: crpn_faster_rcnn_r50_caffe_fpn_1x_coco + In Collection: Cascade RPN + Config: configs/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cascade_rpn/crpn_faster_rcnn_r50_caffe_fpn_1x_coco/crpn_faster_rcnn_r50_caffe_fpn_1x_coco-c8283cca.pth diff --git a/configs/centernet/README.md b/configs/centernet/README.md new file mode 100644 index 0000000..0f951a0 --- /dev/null +++ b/configs/centernet/README.md @@ -0,0 +1,40 @@ +# CenterNet + +> [Objects as Points](https://arxiv.org/abs/1904.07850) + + + +## Abstract + +Detection identifies objects as axis-aligned boxes in an image. Most successful object detectors enumerate a nearly exhaustive list of potential object locations and classify each. This is wasteful, inefficient, and requires additional post-processing. In this paper, we take a different approach. We model an object as a single point --- the center point of its bounding box. Our detector uses keypoint estimation to find center points and regresses to all other object properties, such as size, 3D location, orientation, and even pose. Our center point based approach, CenterNet, is end-to-end differentiable, simpler, faster, and more accurate than corresponding bounding box based detectors. CenterNet achieves the best speed-accuracy trade-off on the MS COCO dataset, with 28.1% AP at 142 FPS, 37.4% AP at 52 FPS, and 45.1% AP with multi-scale testing at 1.4 FPS. We use the same approach to estimate 3D bounding box in the KITTI benchmark and human pose on the COCO keypoint dataset. Our method performs competitively with sophisticated multi-stage methods and runs in real-time. + +
+ +
+ +## Results and Models + +| Backbone | DCN | Mem (GB) | Box AP | Flip box AP | Config | Download | +| :-------: | :-: | :------: | :----: | :---------: | :---------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ResNet-18 | N | 3.45 | 25.9 | 27.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/centernet/centernet_resnet18_140e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/centernet/centernet_resnet18_140e_coco/centernet_resnet18_140e_coco_20210705_093630-bb5b3bf7.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/centernet/centernet_resnet18_140e_coco/centernet_resnet18_140e_coco_20210705_093630.log.json) | +| ResNet-18 | Y | 3.47 | 29.5 | 30.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/centernet/centernet_resnet18_dcnv2_140e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/centernet/centernet_resnet18_dcnv2_140e_coco/centernet_resnet18_dcnv2_140e_coco_20210702_155131-c8cd631f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/centernet/centernet_resnet18_dcnv2_140e_coco/centernet_resnet18_dcnv2_140e_coco_20210702_155131.log.json) | + +Note: + +- Flip box AP setting is single-scale and `flip=True`. +- Due to complex data enhancement, we find that the performance is unstable and may fluctuate by about 0.4 mAP. mAP 29.4 ~ 29.8 is acceptable in ResNet-18-DCNv2. +- Compared to the source code, we refer to [CenterNet-Better](https://github.com/FateScript/CenterNet-better), and make the following changes + - fix wrong image mean and variance in image normalization to be compatible with the pre-trained backbone. + - Use SGD rather than ADAM optimizer and add warmup and grad clip. + - Use DistributedDataParallel as other models in MMDetection rather than using DataParallel. + +## Citation + +```latex +@article{zhou2019objects, + title={Objects as Points}, + author={Zhou, Xingyi and Wang, Dequan and Kr{\"a}henb{\"u}hl, Philipp}, + booktitle={arXiv preprint arXiv:1904.07850}, + year={2019} +} +``` diff --git a/configs/centernet/centernet_resnet18_140e_coco.py b/configs/centernet/centernet_resnet18_140e_coco.py new file mode 100644 index 0000000..52c86a5 --- /dev/null +++ b/configs/centernet/centernet_resnet18_140e_coco.py @@ -0,0 +1,3 @@ +_base_ = './centernet_resnet18_dcnv2_140e_coco.py' + +model = dict(neck=dict(use_dcn=False)) diff --git a/configs/centernet/centernet_resnet18_dcnv2_140e_coco.py b/configs/centernet/centernet_resnet18_dcnv2_140e_coco.py new file mode 100644 index 0000000..b8a0bb1 --- /dev/null +++ b/configs/centernet/centernet_resnet18_dcnv2_140e_coco.py @@ -0,0 +1,127 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + type='CenterNet', + backbone=dict( + type='ResNet', + depth=18, + norm_eval=False, + norm_cfg=dict(type='BN'), + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet18')), + neck=dict( + type='CTResNetNeck', + in_channel=512, + num_deconv_filters=(256, 128, 64), + num_deconv_kernels=(4, 4, 4), + use_dcn=True), + bbox_head=dict( + type='CenterNetHead', + num_classes=80, + in_channel=64, + feat_channel=64, + loss_center_heatmap=dict(type='GaussianFocalLoss', loss_weight=1.0), + loss_wh=dict(type='L1Loss', loss_weight=0.1), + loss_offset=dict(type='L1Loss', loss_weight=1.0)), + train_cfg=None, + test_cfg=dict(topk=100, local_maximum_kernel=3, max_per_img=100)) + +# We fixed the incorrect img_norm_cfg problem in the source code. +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True, color_type='color'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict( + type='RandomCenterCropPad', + crop_size=(512, 512), + ratios=(0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3), + mean=[0, 0, 0], + std=[1, 1, 1], + to_rgb=True, + test_pad_mode=None), + dict(type='Resize', img_scale=(512, 512), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] +test_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict( + type='MultiScaleFlipAug', + scale_factor=1.0, + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict( + type='RandomCenterCropPad', + ratios=None, + border=None, + mean=[0, 0, 0], + std=[1, 1, 1], + to_rgb=True, + test_mode=True, + test_pad_mode=['logical_or', 31], + test_pad_add_pix=1), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict( + type='Collect', + meta_keys=('filename', 'ori_filename', 'ori_shape', + 'img_shape', 'pad_shape', 'scale_factor', 'flip', + 'flip_direction', 'img_norm_cfg', 'border'), + keys=['img']) + ]) +] + +dataset_type = 'CocoDataset' +data_root = 'data/coco/' + +# Use RepeatDataset to speed up training +data = dict( + samples_per_gpu=16, + workers_per_gpu=4, + train=dict( + _delete_=True, + type='RepeatDataset', + times=5, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) + +# optimizer +# Based on the default settings of modern detectors, the SGD effect is better +# than the Adam in the source code, so we use SGD default settings and +# if you use adam+lr5e-4, the map is 29.1. +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) + +# learning policy +# Based on the default settings of modern detectors, we added warmup settings. +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=1.0 / 1000, + step=[18, 24]) # the real step is [18*5, 24*5] +runner = dict(max_epochs=28) # the real epoch is 28*5=140 + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (16 samples per GPU) +auto_scale_lr = dict(base_batch_size=128) diff --git a/configs/centernet/metafile.yml b/configs/centernet/metafile.yml new file mode 100644 index 0000000..e86e57b --- /dev/null +++ b/configs/centernet/metafile.yml @@ -0,0 +1,46 @@ +Collections: + - Name: CenterNet + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x TITANXP GPUs + Architecture: + - ResNet + Paper: + URL: https://arxiv.org/abs/1904.07850 + Title: 'Objects as Points' + README: configs/centernet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.13.0/mmdet/models/detectors/centernet.py#L10 + Version: v2.13.0 + +Models: + - Name: centernet_resnet18_dcnv2_140e_coco + In Collection: CenterNet + Config: configs/centernet/centernet_resnet18_dcnv2_140e_coco.py + Metadata: + Batch Size: 128 + Training Memory (GB): 3.47 + Epochs: 140 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 29.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/centernet/centernet_resnet18_dcnv2_140e_coco/centernet_resnet18_dcnv2_140e_coco_20210702_155131-c8cd631f.pth + + - Name: centernet_resnet18_140e_coco + In Collection: CenterNet + Config: configs/centernet/centernet_resnet18_140e_coco.py + Metadata: + Batch Size: 128 + Training Memory (GB): 3.45 + Epochs: 140 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 25.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/centernet/centernet_resnet18_140e_coco/centernet_resnet18_140e_coco_20210705_093630-bb5b3bf7.pth diff --git a/configs/centripetalnet/README.md b/configs/centripetalnet/README.md new file mode 100644 index 0000000..b01b00a --- /dev/null +++ b/configs/centripetalnet/README.md @@ -0,0 +1,36 @@ +# CentripetalNet + +> [CentripetalNet: Pursuing High-quality Keypoint Pairs for Object Detection](https://arxiv.org/abs/2003.09119) + + + +## Abstract + +Keypoint-based detectors have achieved pretty-well performance. However, incorrect keypoint matching is still widespread and greatly affects the performance of the detector. In this paper, we propose CentripetalNet which uses centripetal shift to pair corner keypoints from the same instance. CentripetalNet predicts the position and the centripetal shift of the corner points and matches corners whose shifted results are aligned. Combining position information, our approach matches corner points more accurately than the conventional embedding approaches do. Corner pooling extracts information inside the bounding boxes onto the border. To make this information more aware at the corners, we design a cross-star deformable convolution network to conduct feature adaption. Furthermore, we explore instance segmentation on anchor-free detectors by equipping our CentripetalNet with a mask prediction module. On MS-COCO test-dev, our CentripetalNet not only outperforms all existing anchor-free detectors with an AP of 48.0% but also achieves comparable performance to the state-of-the-art instance segmentation approaches with a 40.2% MaskAP. + +
+ +
+ +## Results and Models + +| Backbone | Batch Size | Step/Total Epochs | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :--------------: | :--------------------------------------------------------------: | :---------------: | :------: | :------------: | :----: | :-----------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| HourglassNet-104 | [16 x 6](./centripetalnet_hourglass104_mstest_16x6_210e_coco.py) | 190/210 | 16.7 | 3.7 | 44.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco/centripetalnet_hourglass104_mstest_16x6_210e_coco_20200915_204804-3ccc61e5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco/centripetalnet_hourglass104_mstest_16x6_210e_coco_20200915_204804.log.json) | + +Note: + +- TTA setting is single-scale and `flip=True`. +- The model we released is the best checkpoint rather than the latest checkpoint (box AP 44.8 vs 44.6 in our experiment). + +## Citation + +```latex +@InProceedings{Dong_2020_CVPR, +author = {Dong, Zhiwei and Li, Guoxuan and Liao, Yue and Wang, Fei and Ren, Pengju and Qian, Chen}, +title = {CentripetalNet: Pursuing High-Quality Keypoint Pairs for Object Detection}, +booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)}, +month = {June}, +year = {2020} +} +``` diff --git a/configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py b/configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py new file mode 100644 index 0000000..5281c5b --- /dev/null +++ b/configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py @@ -0,0 +1,110 @@ +_base_ = [ + '../_base_/default_runtime.py', '../_base_/datasets/coco_detection.py' +] + +# model settings +model = dict( + type='CornerNet', + backbone=dict( + type='HourglassNet', + downsample_times=5, + num_stacks=2, + stage_channels=[256, 256, 384, 384, 384, 512], + stage_blocks=[2, 2, 2, 2, 2, 4], + norm_cfg=dict(type='BN', requires_grad=True)), + neck=None, + bbox_head=dict( + type='CentripetalHead', + num_classes=80, + in_channels=256, + num_feat_levels=2, + corner_emb_channels=0, + loss_heatmap=dict( + type='GaussianFocalLoss', alpha=2.0, gamma=4.0, loss_weight=1), + loss_offset=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1), + loss_guiding_shift=dict( + type='SmoothL1Loss', beta=1.0, loss_weight=0.05), + loss_centripetal_shift=dict( + type='SmoothL1Loss', beta=1.0, loss_weight=1)), + # training and testing settings + train_cfg=None, + test_cfg=dict( + corner_topk=100, + local_maximum_kernel=3, + distance_threshold=0.5, + score_thr=0.05, + max_per_img=100, + nms=dict(type='soft_nms', iou_threshold=0.5, method='gaussian'))) +# data settings +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict( + type='RandomCenterCropPad', + crop_size=(511, 511), + ratios=(0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3), + test_mode=False, + test_pad_mode=None, + **img_norm_cfg), + dict(type='Resize', img_scale=(511, 511), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict( + type='MultiScaleFlipAug', + scale_factor=1.0, + flip=True, + transforms=[ + dict(type='Resize'), + dict( + type='RandomCenterCropPad', + crop_size=None, + ratios=None, + border=None, + test_mode=True, + test_pad_mode=['logical_or', 127], + **img_norm_cfg), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict( + type='Collect', + keys=['img'], + meta_keys=('filename', 'ori_shape', 'img_shape', 'pad_shape', + 'scale_factor', 'flip', 'img_norm_cfg', 'border')), + ]) +] +data = dict( + samples_per_gpu=6, + workers_per_gpu=3, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='Adam', lr=0.0005) +optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2)) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=1.0 / 3, + step=[190]) +runner = dict(type='EpochBasedRunner', max_epochs=210) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (16 GPUs) x (6 samples per GPU) +auto_scale_lr = dict(base_batch_size=96) diff --git a/configs/centripetalnet/metafile.yml b/configs/centripetalnet/metafile.yml new file mode 100644 index 0000000..61aed3e --- /dev/null +++ b/configs/centripetalnet/metafile.yml @@ -0,0 +1,39 @@ +Collections: + - Name: CentripetalNet + Metadata: + Training Data: COCO + Training Techniques: + - Adam + Training Resources: 16x V100 GPUs + Architecture: + - Corner Pooling + - Stacked Hourglass Network + Paper: + URL: https://arxiv.org/abs/2003.09119 + Title: 'CentripetalNet: Pursuing High-quality Keypoint Pairs for Object Detection' + README: configs/centripetalnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.5.0/mmdet/models/detectors/cornernet.py#L9 + Version: v2.5.0 + +Models: + - Name: centripetalnet_hourglass104_mstest_16x6_210e_coco + In Collection: CentripetalNet + Config: configs/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco.py + Metadata: + Batch Size: 96 + Training Memory (GB): 16.7 + inference time (ms/im): + - value: 270.27 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 210 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/centripetalnet/centripetalnet_hourglass104_mstest_16x6_210e_coco/centripetalnet_hourglass104_mstest_16x6_210e_coco_20200915_204804-3ccc61e5.pth diff --git a/configs/cityscapes/README.md b/configs/cityscapes/README.md new file mode 100644 index 0000000..c52a79f --- /dev/null +++ b/configs/cityscapes/README.md @@ -0,0 +1,46 @@ +# Cityscapes + +> [The Cityscapes Dataset for Semantic Urban Scene Understanding](https://arxiv.org/abs/1604.01685) + + + +## Abstract + +Visual understanding of complex urban street scenes is an enabling factor for a wide range of applications. Object detection has benefited enormously from large-scale datasets, especially in the context of deep learning. For semantic urban scene understanding, however, no current dataset adequately captures the complexity of real-world urban scenes. +To address this, we introduce Cityscapes, a benchmark suite and large-scale dataset to train and test approaches for pixel-level and instance-level semantic labeling. Cityscapes is comprised of a large, diverse set of stereo video sequences recorded in streets from 50 different cities. 5000 of these images have high quality pixel-level annotations; 20000 additional images have coarse annotations to enable methods that leverage large volumes of weakly-labeled data. Crucially, our effort exceeds previous attempts in terms of dataset size, annotation richness, scene variability, and complexity. Our accompanying empirical study provides an in-depth analysis of the dataset characteristics, as well as a performance evaluation of several state-of-the-art approaches based on our benchmark. + +
+ +
+ +## Common settings + +- All baselines were trained using 8 GPU with a batch size of 8 (1 images per GPU) using the [linear scaling rule](https://arxiv.org/abs/1706.02677) to scale the learning rate. +- All models were trained on `cityscapes_train`, and tested on `cityscapes_val`. +- 1x training schedule indicates 64 epochs which corresponds to slightly less than the 24k iterations reported in the original schedule from the [Mask R-CNN paper](https://arxiv.org/abs/1703.06870) +- COCO pre-trained weights are used to initialize. +- A conversion [script](../../tools/dataset_converters/cityscapes.py) is provided to convert Cityscapes into COCO format. Please refer to [install.md](../../docs/1_exist_data_model.md#prepare-datasets) for details. +- `CityscapesDataset` implemented three evaluation methods. `bbox` and `segm` are standard COCO bbox/mask AP. `cityscapes` is the cityscapes dataset official evaluation, which may be slightly higher than COCO. + +### Faster R-CNN + +| Backbone | Style | Lr schd | Scale | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------: | :-----: | :-----: | :------: | :------: | :------------: | :----: | :---------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | 1x | 800-1024 | 5.2 | - | 40.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cityscapes/faster_rcnn_r50_fpn_1x_cityscapes.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cityscapes/faster_rcnn_r50_fpn_1x_cityscapes_20200502-829424c0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cityscapes/faster_rcnn_r50_fpn_1x_cityscapes_20200502_114915.log.json) | + +### Mask R-CNN + +| Backbone | Style | Lr schd | Scale | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :------: | :-----: | :-----: | :------: | :------: | :------------: | :----: | :-----: | :-------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | 1x | 800-1024 | 5.3 | - | 40.9 | 36.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cityscapes/mask_rcnn_r50_fpn_1x_cityscapes.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cityscapes/mask_rcnn_r50_fpn_1x_cityscapes/mask_rcnn_r50_fpn_1x_cityscapes_20201211_133733-d2858245.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cityscapes/mask_rcnn_r50_fpn_1x_cityscapes/mask_rcnn_r50_fpn_1x_cityscapes_20201211_133733.log.json) | + +## Citation + +```latex +@inproceedings{Cordts2016Cityscapes, + title={The Cityscapes Dataset for Semantic Urban Scene Understanding}, + author={Cordts, Marius and Omran, Mohamed and Ramos, Sebastian and Rehfeld, Timo and Enzweiler, Markus and Benenson, Rodrigo and Franke, Uwe and Roth, Stefan and Schiele, Bernt}, + booktitle={Proc. of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, + year={2016} +} +``` diff --git a/configs/cityscapes/faster_rcnn_r50_fpn_1x_cityscapes.py b/configs/cityscapes/faster_rcnn_r50_fpn_1x_cityscapes.py new file mode 100644 index 0000000..ca636bd --- /dev/null +++ b/configs/cityscapes/faster_rcnn_r50_fpn_1x_cityscapes.py @@ -0,0 +1,44 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/cityscapes_detection.py', + '../_base_/default_runtime.py' +] +model = dict( + backbone=dict(init_cfg=None), + roi_head=dict( + bbox_head=dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=8, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)))) +# optimizer +# lr is set for a batch size of 8 +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + # [7] yields higher performance than [6] + step=[7]) +runner = dict( + type='EpochBasedRunner', max_epochs=8) # actual epoch = 8 * 8 = 64 +log_config = dict(interval=100) +# For better, more stable performance initialize from COCO +load_from = 'https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth' # noqa + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (1 samples per GPU) +auto_scale_lr = dict(base_batch_size=8) diff --git a/configs/cityscapes/mask_rcnn_r50_fpn_1x_cityscapes.py b/configs/cityscapes/mask_rcnn_r50_fpn_1x_cityscapes.py new file mode 100644 index 0000000..83ea058 --- /dev/null +++ b/configs/cityscapes/mask_rcnn_r50_fpn_1x_cityscapes.py @@ -0,0 +1,51 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/cityscapes_instance.py', '../_base_/default_runtime.py' +] +model = dict( + backbone=dict(init_cfg=None), + roi_head=dict( + bbox_head=dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=8, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)), + mask_head=dict( + type='FCNMaskHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=8, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0)))) +# optimizer +# lr is set for a batch size of 8 +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + # [7] yields higher performance than [6] + step=[7]) +runner = dict( + type='EpochBasedRunner', max_epochs=8) # actual epoch = 8 * 8 = 64 +log_config = dict(interval=100) +# For better, more stable performance initialize from COCO +load_from = 'https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_1x_coco/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth' # noqa + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (1 samples per GPU) +auto_scale_lr = dict(base_batch_size=8) diff --git a/configs/common/lsj_100e_coco_instance.py b/configs/common/lsj_100e_coco_instance.py new file mode 100644 index 0000000..cacf23d --- /dev/null +++ b/configs/common/lsj_100e_coco_instance.py @@ -0,0 +1,90 @@ +_base_ = '../_base_/default_runtime.py' +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +image_size = (1024, 1024) + +file_client_args = dict(backend='disk') +# comment out the code below to use different file client +# file_client_args = dict( +# backend='petrel', +# path_mapping=dict({ +# './data/': 's3://openmmlab/datasets/detection/', +# 'data/': 's3://openmmlab/datasets/detection/' +# })) + +train_pipeline = [ + dict(type='LoadImageFromFile', file_client_args=file_client_args), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=image_size, + ratio_range=(0.1, 2.0), + multiscale_mode='range', + keep_ratio=True), + dict( + type='RandomCrop', + crop_type='absolute_range', + crop_size=image_size, + recompute_bbox=True, + allow_negative_crop=True), + dict(type='FilterAnnotations', min_gt_bbox_wh=(1e-2, 1e-2)), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=image_size), # padding to image_size leads 0.5+ mAP + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile', file_client_args=file_client_args), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +# Use RepeatDataset to speed up training +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='RepeatDataset', + times=4, # simply change this from 2 to 16 for 50e - 400e training. + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +evaluation = dict(interval=5, metric=['bbox', 'segm']) + +# optimizer assumes bs=64 +optimizer = dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.00004) +optimizer_config = dict(grad_clip=None) + +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.067, + step=[22, 24]) +runner = dict(type='EpochBasedRunner', max_epochs=25) diff --git a/configs/common/mstrain-poly_3x_coco_instance.py b/configs/common/mstrain-poly_3x_coco_instance.py new file mode 100644 index 0000000..c22ed94 --- /dev/null +++ b/configs/common/mstrain-poly_3x_coco_instance.py @@ -0,0 +1,80 @@ +_base_ = '../_base_/default_runtime.py' +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +# In mstrain 3x config, img_scale=[(1333, 640), (1333, 800)], +# multiscale_mode='range' +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', + with_bbox=True, + with_mask=True, + poly2mask=False), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +# Use RepeatDataset to speed up training +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='RepeatDataset', + times=3, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric=['bbox', 'segm']) + +# optimizer +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) + +# learning policy +# Experiments show that using step=[9, 11] has higher performance +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[9, 11]) +runner = dict(type='EpochBasedRunner', max_epochs=12) diff --git a/configs/common/mstrain_3x_coco.py b/configs/common/mstrain_3x_coco.py new file mode 100644 index 0000000..80ec8b8 --- /dev/null +++ b/configs/common/mstrain_3x_coco.py @@ -0,0 +1,76 @@ +_base_ = '../_base_/default_runtime.py' +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +# In mstrain 3x config, img_scale=[(1333, 640), (1333, 800)], +# multiscale_mode='range' +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +# Use RepeatDataset to speed up training +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='RepeatDataset', + times=3, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='bbox') + +# optimizer +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) + +# learning policy +# Experiments show that using step=[9, 11] has higher performance +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[9, 11]) +runner = dict(type='EpochBasedRunner', max_epochs=12) diff --git a/configs/common/mstrain_3x_coco_instance.py b/configs/common/mstrain_3x_coco_instance.py new file mode 100644 index 0000000..50f39be --- /dev/null +++ b/configs/common/mstrain_3x_coco_instance.py @@ -0,0 +1,76 @@ +_base_ = '../_base_/default_runtime.py' +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +# In mstrain 3x config, img_scale=[(1333, 640), (1333, 800)], +# multiscale_mode='range' +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +# Use RepeatDataset to speed up training +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='RepeatDataset', + times=3, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric=['bbox', 'segm']) + +# optimizer +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) + +# learning policy +# Experiments show that using step=[9, 11] has higher performance +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[9, 11]) +runner = dict(type='EpochBasedRunner', max_epochs=12) diff --git a/configs/common/ssj_270k_coco_instance.py b/configs/common/ssj_270k_coco_instance.py new file mode 100644 index 0000000..851098f --- /dev/null +++ b/configs/common/ssj_270k_coco_instance.py @@ -0,0 +1,91 @@ +_base_ = '../_base_/default_runtime.py' +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +image_size = (1024, 1024) + +file_client_args = dict(backend='disk') + +# Standard Scale Jittering (SSJ) resizes and crops an image +# with a resize range of 0.8 to 1.25 of the original image size. +train_pipeline = [ + dict(type='LoadImageFromFile', file_client_args=file_client_args), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=image_size, + ratio_range=(0.8, 1.25), + multiscale_mode='range', + keep_ratio=True), + dict( + type='RandomCrop', + crop_type='absolute_range', + crop_size=image_size, + recompute_bbox=True, + allow_negative_crop=True), + dict(type='FilterAnnotations', min_gt_bbox_wh=(1e-2, 1e-2)), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=image_size), # padding to image_size leads 0.5+ mAP + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile', file_client_args=file_client_args), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) + +evaluation = dict(interval=6000, metric=['bbox', 'segm']) + +# optimizer assumes batch_size = (32 GPUs) x (2 samples per GPU) +optimizer = dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.00004) +optimizer_config = dict(grad_clip=None) + +# lr steps at [0.9, 0.95, 0.975] of the maximum iterations +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=0.001, + step=[243000, 256500, 263250]) +checkpoint_config = dict(interval=6000) +# The model is trained by 270k iterations with batch_size 64, +# which is roughly equivalent to 144 epochs. +runner = dict(type='IterBasedRunner', max_iters=270000) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (32 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/common/ssj_scp_270k_coco_instance.py b/configs/common/ssj_scp_270k_coco_instance.py new file mode 100644 index 0000000..540839f --- /dev/null +++ b/configs/common/ssj_scp_270k_coco_instance.py @@ -0,0 +1,97 @@ +_base_ = '../_base_/default_runtime.py' +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +image_size = (1024, 1024) + +file_client_args = dict(backend='disk') + +# Standard Scale Jittering (SSJ) resizes and crops an image +# with a resize range of 0.8 to 1.25 of the original image size. +load_pipeline = [ + dict(type='LoadImageFromFile', file_client_args=file_client_args), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=image_size, + ratio_range=(0.8, 1.25), + multiscale_mode='range', + keep_ratio=True), + dict( + type='RandomCrop', + crop_type='absolute_range', + crop_size=image_size, + recompute_bbox=True, + allow_negative_crop=True), + dict(type='FilterAnnotations', min_gt_bbox_wh=(1e-2, 1e-2)), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Pad', size=image_size), +] +train_pipeline = [ + dict(type='CopyPaste', max_num_pasted=100), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile', file_client_args=file_client_args), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='MultiImageMixDataset', + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=load_pipeline), + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) + +evaluation = dict(interval=6000, metric=['bbox', 'segm']) + +# optimizer assumes batch_size = (32 GPUs) x (2 samples per GPU) +optimizer = dict(type='SGD', lr=0.1, momentum=0.9, weight_decay=0.00004) +optimizer_config = dict(grad_clip=None) + +# lr steps at [0.9, 0.95, 0.975] of the maximum iterations +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=0.001, + step=[243000, 256500, 263250]) +checkpoint_config = dict(interval=6000) +# The model is trained by 270k iterations with batch_size 64, +# which is roughly equivalent to 144 epochs. +runner = dict(type='IterBasedRunner', max_iters=270000) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (32 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/convnext/README.md b/configs/convnext/README.md new file mode 100644 index 0000000..edf72e8 --- /dev/null +++ b/configs/convnext/README.md @@ -0,0 +1,40 @@ +# ConvNeXt + +> [A ConvNet for the 2020s](https://arxiv.org/abs/2201.03545) + +## Abstract + +The "Roaring 20s" of visual recognition began with the introduction of Vision Transformers (ViTs), which quickly superseded ConvNets as the state-of-the-art image classification model. A vanilla ViT, on the other hand, faces difficulties when applied to general computer vision tasks such as object detection and semantic segmentation. It is the hierarchical Transformers (e.g., Swin Transformers) that reintroduced several ConvNet priors, making Transformers practically viable as a generic vision backbone and demonstrating remarkable performance on a wide variety of vision tasks. However, the effectiveness of such hybrid approaches is still largely credited to the intrinsic superiority of Transformers, rather than the inherent inductive biases of convolutions. In this work, we reexamine the design spaces and test the limits of what a pure ConvNet can achieve. We gradually "modernize" a standard ResNet toward the design of a vision Transformer, and discover several key components that contribute to the performance difference along the way. The outcome of this exploration is a family of pure ConvNet models dubbed ConvNeXt. Constructed entirely from standard ConvNet modules, ConvNeXts compete favorably with Transformers in terms of accuracy and scalability, achieving 87.8% ImageNet top-1 accuracy and outperforming Swin Transformers on COCO detection and ADE20K segmentation, while maintaining the simplicity and efficiency of standard ConvNets. + +
+ +
+ +## Results and models + +| Method | Backbone | Pretrain | Lr schd | Multi-scale crop | FP16 | Mem (GB) | box AP | mask AP | Config | Download | +| :----------------: | :--------: | :---------: | :-----: | :--------------: | :--: | :------: | :----: | :-----: | :-------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Mask R-CNN | ConvNeXt-T | ImageNet-1K | 3x | yes | yes | 7.3 | 46.2 | 41.7 | [config](./mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/convnext/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco_20220426_154953-050731f4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/convnext/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco_20220426_154953.log.json) | +| Cascade Mask R-CNN | ConvNeXt-T | ImageNet-1K | 3x | yes | yes | 9.0 | 50.3 | 43.6 | [config](./cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/convnext/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco_20220509_204200-8f07c40b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/convnext/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco_20220509_204200.log.json) | +| Cascade Mask R-CNN | ConvNeXt-S | ImageNet-1K | 3x | yes | yes | 12.3 | 51.8 | 44.8 | [config](./cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/convnext/cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco/cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco_20220510_201004-3d24f5a4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/convnext/cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco/cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco_20220510_201004.log.json) | + +**Note**: + +- ConvNeXt backbone needs to install [MMClassification](https://github.com/open-mmlab/mmclassification) first, which has abundant backbones for downstream tasks. + +```shell +pip install mmcls>=0.22.0 +``` + +- The performance is unstable. `Cascade Mask R-CNN` may fluctuate about 0.2 mAP. + +## Citation + +```bibtex +@article{liu2022convnet, + title={A ConvNet for the 2020s}, + author={Liu, Zhuang and Mao, Hanzi and Wu, Chao-Yuan and Feichtenhofer, Christoph and Darrell, Trevor and Xie, Saining}, + journal={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)}, + year={2022} +} +``` diff --git a/configs/convnext/cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py b/configs/convnext/cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py new file mode 100644 index 0000000..0ccc31d --- /dev/null +++ b/configs/convnext/cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py @@ -0,0 +1,32 @@ +_base_ = './cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py' # noqa + +# please install mmcls>=0.22.0 +# import mmcls.models to trigger register_module in mmcls +custom_imports = dict(imports=['mmcls.models'], allow_failed_imports=False) +checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/convnext/downstream/convnext-small_3rdparty_32xb128-noema_in1k_20220301-303e75e3.pth' # noqa + +model = dict( + backbone=dict( + _delete_=True, + type='mmcls.ConvNeXt', + arch='small', + out_indices=[0, 1, 2, 3], + drop_path_rate=0.6, + layer_scale_init_value=1.0, + gap_before_final_norm=False, + init_cfg=dict( + type='Pretrained', checkpoint=checkpoint_file, + prefix='backbone.'))) + +optimizer = dict( + _delete_=True, + constructor='LearningRateDecayOptimizerConstructor', + type='AdamW', + lr=0.0002, + betas=(0.9, 0.999), + weight_decay=0.05, + paramwise_cfg={ + 'decay_rate': 0.7, + 'decay_type': 'layer_wise', + 'num_layers': 12 + }) diff --git a/configs/convnext/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py b/configs/convnext/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py new file mode 100644 index 0000000..93304c0 --- /dev/null +++ b/configs/convnext/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py @@ -0,0 +1,149 @@ +_base_ = [ + '../_base_/models/cascade_mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +# please install mmcls>=0.22.0 +# import mmcls.models to trigger register_module in mmcls +custom_imports = dict(imports=['mmcls.models'], allow_failed_imports=False) +checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/convnext/downstream/convnext-tiny_3rdparty_32xb128-noema_in1k_20220301-795e9634.pth' # noqa + +model = dict( + backbone=dict( + _delete_=True, + type='mmcls.ConvNeXt', + arch='tiny', + out_indices=[0, 1, 2, 3], + drop_path_rate=0.4, + layer_scale_init_value=1.0, + gap_before_final_norm=False, + init_cfg=dict( + type='Pretrained', checkpoint=checkpoint_file, + prefix='backbone.')), + neck=dict(in_channels=[96, 192, 384, 768]), + roi_head=dict(bbox_head=[ + dict( + type='ConvFCBBoxHead', + num_shared_convs=4, + num_shared_fcs=1, + in_channels=256, + conv_out_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + reg_decoded_bbox=True, + norm_cfg=dict(type='SyncBN', requires_grad=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=10.0)), + dict( + type='ConvFCBBoxHead', + num_shared_convs=4, + num_shared_fcs=1, + in_channels=256, + conv_out_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.05, 0.05, 0.1, 0.1]), + reg_class_agnostic=False, + reg_decoded_bbox=True, + norm_cfg=dict(type='SyncBN', requires_grad=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=10.0)), + dict( + type='ConvFCBBoxHead', + num_shared_convs=4, + num_shared_fcs=1, + in_channels=256, + conv_out_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.033, 0.033, 0.067, 0.067]), + reg_class_agnostic=False, + reg_decoded_bbox=True, + norm_cfg=dict(type='SyncBN', requires_grad=True), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=10.0)) + ])) + +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +# augmentation strategy originates from DETR / Sparse RCNN +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='AutoAugment', + policies=[[ + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), (576, 1333), + (608, 1333), (640, 1333), (672, 1333), (704, 1333), + (736, 1333), (768, 1333), (800, 1333)], + multiscale_mode='value', + keep_ratio=True) + ], + [ + dict( + type='Resize', + img_scale=[(400, 1333), (500, 1333), (600, 1333)], + multiscale_mode='value', + keep_ratio=True), + dict( + type='RandomCrop', + crop_type='absolute_range', + crop_size=(384, 600), + allow_negative_crop=True), + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + override=True, + keep_ratio=True) + ]]), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict(train=dict(pipeline=train_pipeline), persistent_workers=True) + +optimizer = dict( + _delete_=True, + constructor='LearningRateDecayOptimizerConstructor', + type='AdamW', + lr=0.0002, + betas=(0.9, 0.999), + weight_decay=0.05, + paramwise_cfg={ + 'decay_rate': 0.7, + 'decay_type': 'layer_wise', + 'num_layers': 6 + }) + +lr_config = dict(warmup_iters=1000, step=[27, 33]) +runner = dict(max_epochs=36) + +# you need to set mode='dynamic' if you are using pytorch<=1.5.0 +fp16 = dict(loss_scale=dict(init_scale=512)) diff --git a/configs/convnext/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco.py b/configs/convnext/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco.py new file mode 100644 index 0000000..e8a283f --- /dev/null +++ b/configs/convnext/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco.py @@ -0,0 +1,90 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +# please install mmcls>=0.22.0 +# import mmcls.models to trigger register_module in mmcls +custom_imports = dict(imports=['mmcls.models'], allow_failed_imports=False) +checkpoint_file = 'https://download.openmmlab.com/mmclassification/v0/convnext/downstream/convnext-tiny_3rdparty_32xb128-noema_in1k_20220301-795e9634.pth' # noqa + +model = dict( + backbone=dict( + _delete_=True, + type='mmcls.ConvNeXt', + arch='tiny', + out_indices=[0, 1, 2, 3], + drop_path_rate=0.4, + layer_scale_init_value=1.0, + gap_before_final_norm=False, + init_cfg=dict( + type='Pretrained', checkpoint=checkpoint_file, + prefix='backbone.')), + neck=dict(in_channels=[96, 192, 384, 768])) + +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +# augmentation strategy originates from DETR / Sparse RCNN +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='AutoAugment', + policies=[[ + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), (576, 1333), + (608, 1333), (640, 1333), (672, 1333), (704, 1333), + (736, 1333), (768, 1333), (800, 1333)], + multiscale_mode='value', + keep_ratio=True) + ], + [ + dict( + type='Resize', + img_scale=[(400, 1333), (500, 1333), (600, 1333)], + multiscale_mode='value', + keep_ratio=True), + dict( + type='RandomCrop', + crop_type='absolute_range', + crop_size=(384, 600), + allow_negative_crop=True), + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + override=True, + keep_ratio=True) + ]]), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict(train=dict(pipeline=train_pipeline), persistent_workers=True) + +optimizer = dict( + _delete_=True, + constructor='LearningRateDecayOptimizerConstructor', + type='AdamW', + lr=0.0001, + betas=(0.9, 0.999), + weight_decay=0.05, + paramwise_cfg={ + 'decay_rate': 0.95, + 'decay_type': 'layer_wise', + 'num_layers': 6 + }) + +lr_config = dict(warmup_iters=1000, step=[27, 33]) +runner = dict(max_epochs=36) + +# you need to set mode='dynamic' if you are using pytorch<=1.5.0 +fp16 = dict(loss_scale=dict(init_scale=512)) diff --git a/configs/convnext/metafile.yml b/configs/convnext/metafile.yml new file mode 100644 index 0000000..84e50e8 --- /dev/null +++ b/configs/convnext/metafile.yml @@ -0,0 +1,93 @@ +Models: + - Name: mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco + In Collection: Mask R-CNN + Config: configs/convnext/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco.py + Metadata: + Training Memory (GB): 7.3 + Epochs: 36 + Training Data: COCO + Training Techniques: + - AdamW + - Mixed Precision Training + Training Resources: 8x A100 GPUs + Architecture: + - ConvNeXt + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 41.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/convnext/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco_20220426_154953-050731f4.pth + Paper: + URL: https://arxiv.org/abs/2201.03545 + Title: 'A ConvNet for the 2020s' + README: configs/convnext/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.16.0/mmdet/models/backbones/swin.py#L465 + Version: v2.16.0 + + - Name: cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco + In Collection: Cascade Mask R-CNN + Config: configs/convnext/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py + Metadata: + Training Memory (GB): 9.0 + Epochs: 36 + Training Data: COCO + Training Techniques: + - AdamW + - Mixed Precision Training + Training Resources: 8x A100 GPUs + Architecture: + - ConvNeXt + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 50.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 43.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/convnext/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco_20220509_204200-8f07c40b.pth + Paper: + URL: https://arxiv.org/abs/2201.03545 + Title: 'A ConvNet for the 2020s' + README: configs/convnext/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.16.0/mmdet/models/backbones/swin.py#L465 + Version: v2.25.0 + + - Name: cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco + In Collection: Cascade Mask R-CNN + Config: configs/convnext/cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py + Metadata: + Training Memory (GB): 12.3 + Epochs: 36 + Training Data: COCO + Training Techniques: + - AdamW + - Mixed Precision Training + Training Resources: 8x A100 GPUs + Architecture: + - ConvNeXt + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 51.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 44.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/convnext/cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco/cascade_mask_rcnn_convnext-s_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco_20220510_201004-3d24f5a4.pth + Paper: + URL: https://arxiv.org/abs/2201.03545 + Title: 'A ConvNet for the 2020s' + README: configs/convnext/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.16.0/mmdet/models/backbones/swin.py#L465 + Version: v2.25.0 diff --git a/configs/cornernet/README.md b/configs/cornernet/README.md new file mode 100644 index 0000000..d0b9e98 --- /dev/null +++ b/configs/cornernet/README.md @@ -0,0 +1,43 @@ +# CornerNet + +> [Cornernet: Detecting objects as paired keypoints](https://arxiv.org/abs/1808.01244) + + + +## Abstract + +We propose CornerNet, a new approach to object detection where we detect an object bounding box as a pair of keypoints, the top-left corner and the bottom-right corner, using a single convolution neural network. By detecting objects as paired keypoints, we eliminate the need for designing a set of anchor boxes commonly used in prior single-stage detectors. In addition to our novel formulation, we introduce corner pooling, a new type of pooling layer that helps the network better localize corners. Experiments show that CornerNet achieves a 42.2% AP on MS COCO, outperforming all existing one-stage detectors. + +
+ +
+ +## Results and Models + +| Backbone | Batch Size | Step/Total Epochs | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :--------------: | :---------------------------------------------------------: | :---------------: | :------: | :------------: | :----: | :-------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| HourglassNet-104 | [10 x 5](./cornernet_hourglass104_mstest_10x5_210e_coco.py) | 180/210 | 13.9 | 4.2 | 41.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco/cornernet_hourglass104_mstest_10x5_210e_coco_20200824_185720-5fefbf1c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco/cornernet_hourglass104_mstest_10x5_210e_coco_20200824_185720.log.json) | +| HourglassNet-104 | [8 x 6](./cornernet_hourglass104_mstest_8x6_210e_coco.py) | 180/210 | 15.9 | 4.2 | 41.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco/cornernet_hourglass104_mstest_8x6_210e_coco_20200825_150618-79b44c30.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco/cornernet_hourglass104_mstest_8x6_210e_coco_20200825_150618.log.json) | +| HourglassNet-104 | [32 x 3](./cornernet_hourglass104_mstest_32x3_210e_coco.py) | 180/210 | 9.5 | 3.9 | 40.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/cornernet/cornernet_hourglass104_mstest_32x3_210e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/cornernet/cornernet_hourglass104_mstest_32x3_210e_coco/cornernet_hourglass104_mstest_32x3_210e_coco_20200819_203110-1efaea91.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/cornernet/cornernet_hourglass104_mstest_32x3_210e_coco/cornernet_hourglass104_mstest_32x3_210e_coco_20200819_203110.log.json) | + +Note: + +- TTA setting is single-scale and `flip=True`. +- Experiments with `images_per_gpu=6` are conducted on Tesla V100-SXM2-32GB, `images_per_gpu=3` are conducted on GeForce GTX 1080 Ti. +- Here are the descriptions of each experiment setting: + - 10 x 5: 10 GPUs with 5 images per gpu. This is the same setting as that reported in the original paper. + - 8 x 6: 8 GPUs with 6 images per gpu. The total batchsize is similar to paper and only need 1 node to train. + - 32 x 3: 32 GPUs with 3 images per gpu. The default setting for 1080TI and need 4 nodes to train. + +## Citation + +```latex +@inproceedings{law2018cornernet, + title={Cornernet: Detecting objects as paired keypoints}, + author={Law, Hei and Deng, Jia}, + booktitle={15th European Conference on Computer Vision, ECCV 2018}, + pages={765--781}, + year={2018}, + organization={Springer Verlag} +} +``` diff --git a/configs/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco.py b/configs/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco.py new file mode 100644 index 0000000..6cb05a7 --- /dev/null +++ b/configs/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco.py @@ -0,0 +1,110 @@ +_base_ = [ + '../_base_/default_runtime.py', '../_base_/datasets/coco_detection.py' +] + +# model settings +model = dict( + type='CornerNet', + backbone=dict( + type='HourglassNet', + downsample_times=5, + num_stacks=2, + stage_channels=[256, 256, 384, 384, 384, 512], + stage_blocks=[2, 2, 2, 2, 2, 4], + norm_cfg=dict(type='BN', requires_grad=True)), + neck=None, + bbox_head=dict( + type='CornerHead', + num_classes=80, + in_channels=256, + num_feat_levels=2, + corner_emb_channels=1, + loss_heatmap=dict( + type='GaussianFocalLoss', alpha=2.0, gamma=4.0, loss_weight=1), + loss_embedding=dict( + type='AssociativeEmbeddingLoss', + pull_weight=0.10, + push_weight=0.10), + loss_offset=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1)), + # training and testing settings + train_cfg=None, + test_cfg=dict( + corner_topk=100, + local_maximum_kernel=3, + distance_threshold=0.5, + score_thr=0.05, + max_per_img=100, + nms=dict(type='soft_nms', iou_threshold=0.5, method='gaussian'))) +# data settings +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict( + type='RandomCenterCropPad', + crop_size=(511, 511), + ratios=(0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3), + test_mode=False, + test_pad_mode=None, + **img_norm_cfg), + dict(type='Resize', img_scale=(511, 511), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict( + type='MultiScaleFlipAug', + scale_factor=1.0, + flip=True, + transforms=[ + dict(type='Resize'), + dict( + type='RandomCenterCropPad', + crop_size=None, + ratios=None, + border=None, + test_mode=True, + test_pad_mode=['logical_or', 127], + **img_norm_cfg), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict( + type='Collect', + keys=['img'], + meta_keys=('filename', 'ori_shape', 'img_shape', 'pad_shape', + 'scale_factor', 'flip', 'img_norm_cfg', 'border')), + ]) +] +data = dict( + samples_per_gpu=5, + workers_per_gpu=3, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='Adam', lr=0.0005) +optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2)) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=1.0 / 3, + step=[180]) +runner = dict(type='EpochBasedRunner', max_epochs=210) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (10 GPUs) x (5 samples per GPU) +auto_scale_lr = dict(base_batch_size=50) diff --git a/configs/cornernet/cornernet_hourglass104_mstest_32x3_210e_coco.py b/configs/cornernet/cornernet_hourglass104_mstest_32x3_210e_coco.py new file mode 100644 index 0000000..f539cdb --- /dev/null +++ b/configs/cornernet/cornernet_hourglass104_mstest_32x3_210e_coco.py @@ -0,0 +1,110 @@ +_base_ = [ + '../_base_/default_runtime.py', '../_base_/datasets/coco_detection.py' +] + +# model settings +model = dict( + type='CornerNet', + backbone=dict( + type='HourglassNet', + downsample_times=5, + num_stacks=2, + stage_channels=[256, 256, 384, 384, 384, 512], + stage_blocks=[2, 2, 2, 2, 2, 4], + norm_cfg=dict(type='BN', requires_grad=True)), + neck=None, + bbox_head=dict( + type='CornerHead', + num_classes=80, + in_channels=256, + num_feat_levels=2, + corner_emb_channels=1, + loss_heatmap=dict( + type='GaussianFocalLoss', alpha=2.0, gamma=4.0, loss_weight=1), + loss_embedding=dict( + type='AssociativeEmbeddingLoss', + pull_weight=0.10, + push_weight=0.10), + loss_offset=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1)), + # training and testing settings + train_cfg=None, + test_cfg=dict( + corner_topk=100, + local_maximum_kernel=3, + distance_threshold=0.5, + score_thr=0.05, + max_per_img=100, + nms=dict(type='soft_nms', iou_threshold=0.5, method='gaussian'))) +# data settings +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict( + type='RandomCenterCropPad', + crop_size=(511, 511), + ratios=(0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3), + test_mode=False, + test_pad_mode=None, + **img_norm_cfg), + dict(type='Resize', img_scale=(511, 511), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict( + type='MultiScaleFlipAug', + scale_factor=1.0, + flip=True, + transforms=[ + dict(type='Resize'), + dict( + type='RandomCenterCropPad', + crop_size=None, + ratios=None, + border=None, + test_mode=True, + test_pad_mode=['logical_or', 127], + **img_norm_cfg), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict( + type='Collect', + keys=['img'], + meta_keys=('filename', 'ori_shape', 'img_shape', 'pad_shape', + 'scale_factor', 'flip', 'img_norm_cfg', 'border')), + ]) +] +data = dict( + samples_per_gpu=3, + workers_per_gpu=3, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='Adam', lr=0.0005) +optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2)) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=1.0 / 3, + step=[180]) +runner = dict(type='EpochBasedRunner', max_epochs=210) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (32 GPUs) x (3 samples per GPU) +auto_scale_lr = dict(base_batch_size=96) diff --git a/configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py b/configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py new file mode 100644 index 0000000..9b115d7 --- /dev/null +++ b/configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py @@ -0,0 +1,110 @@ +_base_ = [ + '../_base_/default_runtime.py', '../_base_/datasets/coco_detection.py' +] + +# model settings +model = dict( + type='CornerNet', + backbone=dict( + type='HourglassNet', + downsample_times=5, + num_stacks=2, + stage_channels=[256, 256, 384, 384, 384, 512], + stage_blocks=[2, 2, 2, 2, 2, 4], + norm_cfg=dict(type='BN', requires_grad=True)), + neck=None, + bbox_head=dict( + type='CornerHead', + num_classes=80, + in_channels=256, + num_feat_levels=2, + corner_emb_channels=1, + loss_heatmap=dict( + type='GaussianFocalLoss', alpha=2.0, gamma=4.0, loss_weight=1), + loss_embedding=dict( + type='AssociativeEmbeddingLoss', + pull_weight=0.10, + push_weight=0.10), + loss_offset=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1)), + # training and testing settings + train_cfg=None, + test_cfg=dict( + corner_topk=100, + local_maximum_kernel=3, + distance_threshold=0.5, + score_thr=0.05, + max_per_img=100, + nms=dict(type='soft_nms', iou_threshold=0.5, method='gaussian'))) +# data settings +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict( + type='RandomCenterCropPad', + crop_size=(511, 511), + ratios=(0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3), + test_mode=False, + test_pad_mode=None, + **img_norm_cfg), + dict(type='Resize', img_scale=(511, 511), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict( + type='MultiScaleFlipAug', + scale_factor=1.0, + flip=True, + transforms=[ + dict(type='Resize'), + dict( + type='RandomCenterCropPad', + crop_size=None, + ratios=None, + border=None, + test_mode=True, + test_pad_mode=['logical_or', 127], + **img_norm_cfg), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict( + type='Collect', + keys=['img'], + meta_keys=('filename', 'ori_shape', 'img_shape', 'pad_shape', + 'scale_factor', 'flip', 'img_norm_cfg', 'border')), + ]) +] +data = dict( + samples_per_gpu=6, + workers_per_gpu=3, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='Adam', lr=0.0005) +optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2)) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=1.0 / 3, + step=[180]) +runner = dict(type='EpochBasedRunner', max_epochs=210) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (6 samples per GPU) +auto_scale_lr = dict(base_batch_size=48) diff --git a/configs/cornernet/metafile.yml b/configs/cornernet/metafile.yml new file mode 100644 index 0000000..c2f6143 --- /dev/null +++ b/configs/cornernet/metafile.yml @@ -0,0 +1,83 @@ +Collections: + - Name: CornerNet + Metadata: + Training Data: COCO + Training Techniques: + - Adam + Training Resources: 8x V100 GPUs + Architecture: + - Corner Pooling + - Stacked Hourglass Network + Paper: + URL: https://arxiv.org/abs/1808.01244 + Title: 'CornerNet: Detecting Objects as Paired Keypoints' + README: configs/cornernet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.3.0/mmdet/models/detectors/cornernet.py#L9 + Version: v2.3.0 + +Models: + - Name: cornernet_hourglass104_mstest_10x5_210e_coco + In Collection: CornerNet + Config: configs/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco.py + Metadata: + Training Resources: 10x V100 GPUs + Batch Size: 50 + Training Memory (GB): 13.9 + inference time (ms/im): + - value: 238.1 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 210 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco/cornernet_hourglass104_mstest_10x5_210e_coco_20200824_185720-5fefbf1c.pth + + - Name: cornernet_hourglass104_mstest_8x6_210e_coco + In Collection: CornerNet + Config: configs/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco.py + Metadata: + Batch Size: 48 + Training Memory (GB): 15.9 + inference time (ms/im): + - value: 238.1 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 210 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cornernet/cornernet_hourglass104_mstest_8x6_210e_coco/cornernet_hourglass104_mstest_8x6_210e_coco_20200825_150618-79b44c30.pth + + - Name: cornernet_hourglass104_mstest_32x3_210e_coco + In Collection: CornerNet + Config: configs/cornernet/cornernet_hourglass104_mstest_32x3_210e_coco.py + Metadata: + Training Resources: 32x V100 GPUs + Batch Size: 96 + Training Memory (GB): 9.5 + inference time (ms/im): + - value: 256.41 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 210 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/cornernet/cornernet_hourglass104_mstest_32x3_210e_coco/cornernet_hourglass104_mstest_32x3_210e_coco_20200819_203110-1efaea91.pth diff --git a/configs/dcn/README.md b/configs/dcn/README.md new file mode 100644 index 0000000..745b01c --- /dev/null +++ b/configs/dcn/README.md @@ -0,0 +1,48 @@ +# DCN + +> [Deformable Convolutional Networks](https://arxiv.org/abs/1703.06211) + + + +## Abstract + +Convolutional neural networks (CNNs) are inherently limited to model geometric transformations due to the fixed geometric structures in its building modules. In this work, we introduce two new modules to enhance the transformation modeling capacity of CNNs, namely, deformable convolution and deformable RoI pooling. Both are based on the idea of augmenting the spatial sampling locations in the modules with additional offsets and learning the offsets from target tasks, without additional supervision. The new modules can readily replace their plain counterparts in existing CNNs and can be easily trained end-to-end by standard back-propagation, giving rise to deformable convolutional networks. Extensive experiments validate the effectiveness of our approach on sophisticated vision tasks of object detection and semantic segmentation. + +
+ +
+ +## Results and Models + +| Backbone | Model | Style | Conv | Pool | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------------: | :----------: | :-----: | :----------: | :---: | :-----: | :------: | :------------: | :----: | :-----: | :---------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | Faster | pytorch | dconv(c3-c5) | - | 1x | 4.0 | 17.8 | 41.3 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200130-d68aed1e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200130_212941.log.json) | +| R-50-FPN | Faster | pytorch | - | dpool | 1x | 5.0 | 17.2 | 38.9 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcn/faster_rcnn_r50_fpn_dpool_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_dpool_1x_coco/faster_rcnn_r50_fpn_dpool_1x_coco_20200307-90d3c01d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_dpool_1x_coco/faster_rcnn_r50_fpn_dpool_1x_coco_20200307_203250.log.json) | +| R-101-FPN | Faster | pytorch | dconv(c3-c5) | - | 1x | 6.0 | 12.5 | 42.7 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcn/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200203-1377f13d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200203_230019.log.json) | +| X-101-32x4d-FPN | Faster | pytorch | dconv(c3-c5) | - | 1x | 7.3 | 10.0 | 44.5 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcn/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco_20200203-4f85c69c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco_20200203_001325.log.json) | +| R-50-FPN | Mask | pytorch | dconv(c3-c5) | - | 1x | 4.5 | 15.4 | 41.8 | 37.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200203-4d9ad43b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200203_061339.log.json) | +| R-101-FPN | Mask | pytorch | dconv(c3-c5) | - | 1x | 6.5 | 11.7 | 43.5 | 38.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcn/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200216-a71f5bce.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200216_191601.log.json) | +| R-50-FPN | Cascade | pytorch | dconv(c3-c5) | - | 1x | 4.5 | 14.6 | 43.8 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcn/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200130-2f1fca44.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200130_220843.log.json) | +| R-101-FPN | Cascade | pytorch | dconv(c3-c5) | - | 1x | 6.4 | 11.0 | 45.0 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcn/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200203-3b2f0594.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200203_224829.log.json) | +| R-50-FPN | Cascade Mask | pytorch | dconv(c3-c5) | - | 1x | 6.0 | 10.0 | 44.4 | 38.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcn/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200202-42e767a2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200202_010309.log.json) | +| R-101-FPN | Cascade Mask | pytorch | dconv(c3-c5) | - | 1x | 8.0 | 8.6 | 45.8 | 39.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcn/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200204-df0c5f10.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200204_134006.log.json) | +| X-101-32x4d-FPN | Cascade Mask | pytorch | dconv(c3-c5) | - | 1x | 9.2 | | 47.3 | 41.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco-e75f90c8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco-20200606_183737.log.json) | +| R-50-FPN (FP16) | Mask | pytorch | dconv(c3-c5) | - | 1x | 3.0 | | 41.9 | 37.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fp16/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fp16/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco_20210520_180247-c06429d2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fp16/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco_20210520_180247.log.json) | + +**Notes:** + +- `dconv` denotes deformable convolution, `c3-c5` means adding dconv in resnet stage 3 to 5. `dpool` denotes deformable roi pooling. +- The dcn ops are modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch, which should be more memory efficient and slightly faster. +- (\*) For R-50-FPN (dg=4), dg is short for deformable_group. This model is trained and tested on Amazon EC2 p3dn.24xlarge instance. +- **Memory, Train/Inf time is outdated.** + +## Citation + +```latex +@inproceedings{dai2017deformable, + title={Deformable Convolutional Networks}, + author={Dai, Jifeng and Qi, Haozhi and Xiong, Yuwen and Li, Yi and Zhang, Guodong and Hu, Han and Wei, Yichen}, + booktitle={Proceedings of the IEEE international conference on computer vision}, + year={2017} +} +``` diff --git a/configs/dcn/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py b/configs/dcn/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..081b998 --- /dev/null +++ b/configs/dcn/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../cascade_rcnn/cascade_mask_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/configs/dcn/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py b/configs/dcn/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..3b3683a --- /dev/null +++ b/configs/dcn/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/configs/dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py b/configs/dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..daaa472 --- /dev/null +++ b/configs/dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/configs/dcn/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py b/configs/dcn/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..a01df33 --- /dev/null +++ b/configs/dcn/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../cascade_rcnn/cascade_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/configs/dcn/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py b/configs/dcn/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..aa664bd --- /dev/null +++ b/configs/dcn/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/configs/dcn/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py b/configs/dcn/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..f5fee7e --- /dev/null +++ b/configs/dcn/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../faster_rcnn/faster_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/configs/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py b/configs/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..8787088 --- /dev/null +++ b/configs/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/configs/dcn/faster_rcnn_r50_fpn_dpool_1x_coco.py b/configs/dcn/faster_rcnn_r50_fpn_dpool_1x_coco.py new file mode 100644 index 0000000..1b695f0 --- /dev/null +++ b/configs/dcn/faster_rcnn_r50_fpn_dpool_1x_coco.py @@ -0,0 +1,12 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + roi_head=dict( + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict( + _delete_=True, + type='DeformRoIPoolPack', + output_size=7, + output_channels=256), + out_channels=256, + featmap_strides=[4, 8, 16, 32]))) diff --git a/configs/dcn/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py b/configs/dcn/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..e3bea19 --- /dev/null +++ b/configs/dcn/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py @@ -0,0 +1,16 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/dcn/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py b/configs/dcn/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..cb34002 --- /dev/null +++ b/configs/dcn/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/configs/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py b/configs/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..ababe58 --- /dev/null +++ b/configs/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/configs/dcn/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco.py b/configs/dcn/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..ee5cca7 --- /dev/null +++ b/configs/dcn/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) + +fp16 = dict(loss_scale=512.) diff --git a/configs/dcn/metafile.yml b/configs/dcn/metafile.yml new file mode 100644 index 0000000..36f3887 --- /dev/null +++ b/configs/dcn/metafile.yml @@ -0,0 +1,272 @@ +Collections: + - Name: Deformable Convolutional Networks + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Deformable Convolution + Paper: + URL: https://arxiv.org/abs/1703.06211 + Title: "Deformable Convolutional Networks" + README: configs/dcn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/ops/dcn/deform_conv.py#L15 + Version: v2.0.0 + +Models: + - Name: faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 4.0 + inference time (ms/im): + - value: 56.18 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco/faster_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200130-d68aed1e.pth + + - Name: faster_rcnn_r50_fpn_dpool_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/faster_rcnn_r50_fpn_dpool_1x_coco.py + Metadata: + Training Memory (GB): 5.0 + inference time (ms/im): + - value: 58.14 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_dpool_1x_coco/faster_rcnn_r50_fpn_dpool_1x_coco_20200307-90d3c01d.pth + + - Name: faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 6.0 + inference time (ms/im): + - value: 80 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco/faster_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200203-1377f13d.pth + + - Name: faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 7.3 + inference time (ms/im): + - value: 100 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco/faster_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco_20200203-4f85c69c.pth + + - Name: mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 4.5 + inference time (ms/im): + - value: 64.94 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200203-4d9ad43b.pth + + - Name: mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco.py + Metadata: + Training Techniques: + - SGD with Momentum + - Weight Decay + - Mixed Precision Training + Training Memory (GB): 3.0 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fp16/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_fp16_dconv_c3-c5_1x_coco_20210520_180247-c06429d2.pth + + - Name: mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 6.5 + inference time (ms/im): + - value: 85.47 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco/mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200216-a71f5bce.pth + + - Name: cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 4.5 + inference time (ms/im): + - value: 68.49 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco/cascade_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200130-2f1fca44.pth + + - Name: cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 6.4 + inference time (ms/im): + - value: 90.91 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco/cascade_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200203-3b2f0594.pth + + - Name: cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 6.0 + inference time (ms/im): + - value: 100 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco/cascade_mask_rcnn_r50_fpn_dconv_c3-c5_1x_coco_20200202-42e767a2.pth + + - Name: cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 8.0 + inference time (ms/im): + - value: 116.28 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco/cascade_mask_rcnn_r101_fpn_dconv_c3-c5_1x_coco_20200204-df0c5f10.pth + + - Name: cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks + Config: configs/dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 9.2 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 41.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco-e75f90c8.pth diff --git a/configs/dcnv2/README.md b/configs/dcnv2/README.md new file mode 100644 index 0000000..d230f20 --- /dev/null +++ b/configs/dcnv2/README.md @@ -0,0 +1,37 @@ +# DCNv2 + +> [Deformable ConvNets v2: More Deformable, Better Results](https://arxiv.org/abs/1811.11168) + + + +## Abstract + +The superior performance of Deformable Convolutional Networks arises from its ability to adapt to the geometric variations of objects. Through an examination of its adaptive behavior, we observe that while the spatial support for its neural features conforms more closely than regular ConvNets to object structure, this support may nevertheless extend well beyond the region of interest, causing features to be influenced by irrelevant image content. To address this problem, we present a reformulation of Deformable ConvNets that improves its ability to focus on pertinent image regions, through increased modeling power and stronger training. The modeling power is enhanced through a more comprehensive integration of deformable convolution within the network, and by introducing a modulation mechanism that expands the scope of deformation modeling. To effectively harness this enriched modeling capability, we guide network training via a proposed feature mimicking scheme that helps the network to learn features that reflect the object focus and classification power of RCNN features. With the proposed contributions, this new version of Deformable ConvNets yields significant performance gains over the original model and produces leading results on the COCO benchmark for object detection and instance segmentation. + +## Results and Models + +| Backbone | Model | Style | Conv | Pool | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :---------------: | :----: | :-----: | :-----------: | :----: | :-----: | :------: | :------------: | :----: | :-----: | :------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | Faster | pytorch | mdconv(c3-c5) | - | 1x | 4.1 | 17.6 | 41.4 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcnv2/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco_20200130-d099253b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco_20200130_222144.log.json) | +| \*R-50-FPN (dg=4) | Faster | pytorch | mdconv(c3-c5) | - | 1x | 4.2 | 17.4 | 41.5 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcnv2/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco_20200130-01262257.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco_20200130_222058.log.json) | +| R-50-FPN | Faster | pytorch | - | mdpool | 1x | 5.8 | 16.6 | 38.7 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcnv2/faster_rcnn_r50_fpn_mdpool_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_mdpool_1x_coco/faster_rcnn_r50_fpn_mdpool_1x_coco_20200307-c0df27ff.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_mdpool_1x_coco/faster_rcnn_r50_fpn_mdpool_1x_coco_20200307_203304.log.json) | +| R-50-FPN | Mask | pytorch | mdconv(c3-c5) | - | 1x | 4.5 | 15.1 | 41.5 | 37.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dcnv2/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dcn/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco_20200203-ad97591f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dcn/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco_20200203_063443.log.json) | +| R-50-FPN (FP16) | Mask | pytorch | mdconv(c3-c5) | - | 1x | 3.1 | | 42.0 | 37.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fp16/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fp16/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco_20210520_180434-cf8fefa5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fp16/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco_20210520_180434.log.json) | + +**Notes:** + +- `mdconv` denotes modulated deformable convolution, `c3-c5` means adding dconv in resnet stage 3 to 5. `mdpool` denotes modulated deformable roi pooling. +- The dcn ops are modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch, which should be more memory efficient and slightly faster. +- (\*) For R-50-FPN (dg=4), dg is short for deformable_group. This model is trained and tested on Amazon EC2 p3dn.24xlarge instance. +- **Memory, Train/Inf time is outdated.** + +## Citation + +```latex +@article{zhu2018deformable, + title={Deformable ConvNets v2: More Deformable, Better Results}, + author={Zhu, Xizhou and Hu, Han and Lin, Stephen and Dai, Jifeng}, + journal={arXiv preprint arXiv:1811.11168}, + year={2018} +} +``` diff --git a/configs/dcnv2/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py b/configs/dcnv2/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..d1bcf3c --- /dev/null +++ b/configs/dcnv2/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCNv2', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/configs/dcnv2/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco.py b/configs/dcnv2/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco.py new file mode 100644 index 0000000..d0ab89c --- /dev/null +++ b/configs/dcnv2/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCNv2', deform_groups=4, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/configs/dcnv2/faster_rcnn_r50_fpn_mdpool_1x_coco.py b/configs/dcnv2/faster_rcnn_r50_fpn_mdpool_1x_coco.py new file mode 100644 index 0000000..ad7b034 --- /dev/null +++ b/configs/dcnv2/faster_rcnn_r50_fpn_mdpool_1x_coco.py @@ -0,0 +1,12 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + roi_head=dict( + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict( + _delete_=True, + type='ModulatedDeformRoIPoolPack', + output_size=7, + output_channels=256), + out_channels=256, + featmap_strides=[4, 8, 16, 32]))) diff --git a/configs/dcnv2/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco.py b/configs/dcnv2/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..7e21454 --- /dev/null +++ b/configs/dcnv2/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCNv2', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) + +fp16 = dict(loss_scale=512.) diff --git a/configs/dcnv2/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py b/configs/dcnv2/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..5ca2a67 --- /dev/null +++ b/configs/dcnv2/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCNv2', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/configs/dcnv2/metafile.yml b/configs/dcnv2/metafile.yml new file mode 100644 index 0000000..f6d5381 --- /dev/null +++ b/configs/dcnv2/metafile.yml @@ -0,0 +1,123 @@ +Collections: + - Name: Deformable Convolutional Networks v2 + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Deformable Convolution + Paper: + URL: https://arxiv.org/abs/1811.11168 + Title: "Deformable ConvNets v2: More Deformable, Better Results" + README: configs/dcnv2/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/ops/dcn/deform_conv.py#L15 + Version: v2.0.0 + +Models: + - Name: faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks v2 + Config: configs/dcnv2/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 4.1 + inference time (ms/im): + - value: 56.82 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco/faster_rcnn_r50_fpn_mdconv_c3-c5_1x_coco_20200130-d099253b.pth + + - Name: faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco + In Collection: Deformable Convolutional Networks v2 + Config: configs/dcnv2/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco.py + Metadata: + Training Memory (GB): 4.2 + inference time (ms/im): + - value: 57.47 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco/faster_rcnn_r50_fpn_mdconv_c3-c5_group4_1x_coco_20200130-01262257.pth + + - Name: faster_rcnn_r50_fpn_mdpool_1x_coco + In Collection: Deformable Convolutional Networks v2 + Config: configs/dcnv2/faster_rcnn_r50_fpn_mdpool_1x_coco.py + Metadata: + Training Memory (GB): 5.8 + inference time (ms/im): + - value: 60.24 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/faster_rcnn_r50_fpn_mdpool_1x_coco/faster_rcnn_r50_fpn_mdpool_1x_coco_20200307-c0df27ff.pth + + - Name: mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks v2 + Config: configs/dcnv2/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 4.5 + inference time (ms/im): + - value: 66.23 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dcn/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_mdconv_c3-c5_1x_coco_20200203-ad97591f.pth + + - Name: mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco + In Collection: Deformable Convolutional Networks v2 + Config: configs/dcnv2/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 3.1 + Training Techniques: + - SGD with Momentum + - Weight Decay + - Mixed Precision Training + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fp16/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco/mask_rcnn_r50_fpn_fp16_mdconv_c3-c5_1x_coco_20210520_180434-cf8fefa5.pth diff --git a/configs/ddod/README.md b/configs/ddod/README.md new file mode 100644 index 0000000..9ab1f48 --- /dev/null +++ b/configs/ddod/README.md @@ -0,0 +1,31 @@ +# DDOD + +> [Disentangle Your Dense Object Detector](https://arxiv.org/pdf/2107.02963.pdf) + + + +## Abstract + +Deep learning-based dense object detectors have achieved great success in the past few years and have been applied to numerous multimedia applications such as video understanding. However, the current training pipeline for dense detectors is compromised to lots of conjunctions that may not hold. In this paper, we investigate three such important conjunctions: 1) only samples assigned as positive in classification head are used to train the regression head; 2) classification and regression share the same input feature and computational fields defined by the parallel head architecture; and 3) samples distributed in different feature pyramid layers are treated equally when computing the loss. We first carry out a series of pilot experiments to show disentangling such conjunctions can lead to persistent performance improvement. Then, based on these findings, we propose Disentangled Dense Object Detector(DDOD), in which simple and effective disentanglement mechanisms are designed and integrated into the current state-of-the-art dense object detectors. Extensive experiments on MS COCO benchmark show that our approach can lead to 2.0 mAP, 2.4 mAP and 2.2 mAP absolute improvements on RetinaNet, FCOS, and ATSS baselines with negligible extra overhead. Notably, our best model reaches 55.0 mAP on the COCO test-dev set and 93.5 AP on the hard subset of WIDER FACE, achieving new state-of-the-art performance on these two competitive benchmarks. Code is available at https://github.com/zehuichen123/DDOD. + +
+ +
+ +## Results and Models + +| Model | Backbone | Style | Lr schd | Mem (GB) | box AP | Config | Download | +| :-------: | :------: | :-----: | :-----: | :------: | :----: | :--------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| DDOD-ATSS | R-50 | pytorch | 1x | 3.4 | 41.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ddod/ddod_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ddod/ddod_r50_fpn_1x_coco/ddod_r50_fpn_1x_coco_20220523_223737-29b2fc67.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ddod/ddod_r50_fpn_1x_coco/ddod_r50_fpn_1x_coco_20220523_223737.log.json) | + +## Citation + +```latex +@inproceedings{chen2021disentangle, +title={Disentangle Your Dense Object Detector}, +author={Chen, Zehui and Yang, Chenhongyi and Li, Qiaofei and Zhao, Feng and Zha, Zheng-Jun and Wu, Feng}, +booktitle={Proceedings of the 29th ACM International Conference on Multimedia}, +pages={4939--4948}, +year={2021} +} +``` diff --git a/configs/ddod/ddod_r50_fpn_1x_coco.py b/configs/ddod/ddod_r50_fpn_1x_coco.py new file mode 100644 index 0000000..02dd2fe --- /dev/null +++ b/configs/ddod/ddod_r50_fpn_1x_coco.py @@ -0,0 +1,67 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + type='DDOD', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + bbox_head=dict( + type='DDODHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=2.0), + loss_iou=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), + train_cfg=dict( + # assigner is mean cls_assigner + assigner=dict(type='ATSSAssigner', topk=9, alpha=0.8), + reg_assigner=dict(type='ATSSAssigner', topk=9, alpha=0.5), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) + +# This `persistent_workers` is only valid when PyTorch>=1.7.0 +data = dict(persistent_workers=True) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/configs/ddod/metafile.yml b/configs/ddod/metafile.yml new file mode 100644 index 0000000..c223950 --- /dev/null +++ b/configs/ddod/metafile.yml @@ -0,0 +1,33 @@ +Collections: + - Name: DDOD + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - DDOD + - FPN + - ResNet + Paper: + URL: https://arxiv.org/pdf/2107.02963.pdf + Title: 'Disentangle Your Dense Object Detector' + README: configs/ddod/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.25.0/mmdet/models/detectors/ddod.py#L6 + Version: v2.25.0 + +Models: + - Name: ddod_r50_fpn_1x_coco + In Collection: DDOD + Config: configs/ddod/ddod_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 3.4 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ddod/ddod_r50_fpn_1x_coco/ddod_r50_fpn_1x_coco_20220523_223737-29b2fc67.pth diff --git a/configs/deepfashion/README.md b/configs/deepfashion/README.md new file mode 100644 index 0000000..45daec0 --- /dev/null +++ b/configs/deepfashion/README.md @@ -0,0 +1,70 @@ +# DeepFashion + +> [DeepFashion: Powering Robust Clothes Recognition and Retrieval With Rich Annotations](https://openaccess.thecvf.com/content_cvpr_2016/html/Liu_DeepFashion_Powering_Robust_CVPR_2016_paper.html) + + + +## Abstract + +Recent advances in clothes recognition have been driven by the construction of clothes datasets. Existing datasets are limited in the amount of annotations and are difficult to cope with the various challenges in real-world applications. In this work, we introduce DeepFashion, a large-scale clothes dataset with comprehensive annotations. It contains over 800,000 images, which are richly annotated with massive attributes, clothing landmarks, and correspondence of images taken under different scenarios including store, street snapshot, and consumer. Such rich annotations enable the development of powerful algorithms in clothes recognition and facilitating future researches. To demonstrate the advantages of DeepFashion, we propose a new deep model, namely FashionNet, which learns clothing features by jointly predicting clothing attributes and landmarks. The estimated landmarks are then employed to pool or gate the learned features. It is optimized in an iterative manner. Extensive experiments demonstrate the effectiveness of FashionNet and the usefulness of DeepFashion. + +
+ +
+ +## Introduction + +[MMFashion](https://github.com/open-mmlab/mmfashion) develops "fashion parsing and segmentation" module +based on the dataset +[DeepFashion-Inshop](https://drive.google.com/drive/folders/0B7EVK8r0v71pVDZFQXRsMDZCX1E?usp=sharing). +Its annotation follows COCO style. +To use it, you need to first download the data. Note that we only use "img_highres" in this task. +The file tree should be like this: + +```sh +mmdetection +├── mmdet +├── tools +├── configs +├── data +│ ├── DeepFashion +│ │ ├── In-shop +│ │ ├── Anno +│ │ │   ├── segmentation +│ │ │   | ├── DeepFashion_segmentation_train.json +│ │ │   | ├── DeepFashion_segmentation_query.json +│ │ │   | ├── DeepFashion_segmentation_gallery.json +│ │ │   ├── list_bbox_inshop.txt +│ │ │   ├── list_description_inshop.json +│ │ │   ├── list_item_inshop.txt +│ │ │   └── list_landmarks_inshop.txt +│ │ ├── Eval +│ │ │ └── list_eval_partition.txt +│ │ ├── Img +│ │ │ ├── img +│ │ │ │ ├──XXX.jpg +│ │ │ ├── img_highres +│ │ │ └── ├──XXX.jpg + +``` + +After that you can train the Mask RCNN r50 on DeepFashion-In-shop dataset by launching training with the `mask_rcnn_r50_fpn_1x.py` config +or creating your own config file. + +## Results and Models + +| Backbone | Model type | Dataset | bbox detection Average Precision | segmentation Average Precision | Config | Download (Google) | +| :------: | :--------: | :-----------------: | :------------------------------: | :----------------------------: | :----------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ResNet50 | Mask RCNN | DeepFashion-In-shop | 0.599 | 0.584 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/deepfashion/mask_rcnn_r50_fpn_15e_deepfashion.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/deepfashion/mask_rcnn_r50_fpn_15e_deepfashion/mask_rcnn_r50_fpn_15e_deepfashion_20200329_192752.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/deepfashion/mask_rcnn_r50_fpn_15e_deepfashion/20200329_192752.log.json) | + +## Citation + +```latex +@inproceedings{liuLQWTcvpr16DeepFashion, + author = {Liu, Ziwei and Luo, Ping and Qiu, Shi and Wang, Xiaogang and Tang, Xiaoou}, + title = {DeepFashion: Powering Robust Clothes Recognition and Retrieval with Rich Annotations}, + booktitle = {Proceedings of IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, + month = {June}, + year = {2016} +} +``` diff --git a/configs/deepfashion/mask_rcnn_r50_fpn_15e_deepfashion.py b/configs/deepfashion/mask_rcnn_r50_fpn_15e_deepfashion.py new file mode 100644 index 0000000..c4e8638 --- /dev/null +++ b/configs/deepfashion/mask_rcnn_r50_fpn_15e_deepfashion.py @@ -0,0 +1,10 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/deepfashion.py', '../_base_/schedules/schedule_1x.py', + '../_base_/default_runtime.py' +] +model = dict( + roi_head=dict( + bbox_head=dict(num_classes=15), mask_head=dict(num_classes=15))) +# runtime settings +runner = dict(type='EpochBasedRunner', max_epochs=15) diff --git a/configs/deformable_detr/README.md b/configs/deformable_detr/README.md new file mode 100644 index 0000000..378e1f2 --- /dev/null +++ b/configs/deformable_detr/README.md @@ -0,0 +1,41 @@ +# Deformable DETR + +> [Deformable DETR: Deformable Transformers for End-to-End Object Detection](https://arxiv.org/abs/2010.04159) + + + +## Abstract + +DETR has been recently proposed to eliminate the need for many hand-designed components in object detection while demonstrating good performance. However, it suffers from slow convergence and limited feature spatial resolution, due to the limitation of Transformer attention modules in processing image feature maps. To mitigate these issues, we proposed Deformable DETR, whose attention modules only attend to a small set of key sampling points around a reference. Deformable DETR can achieve better performance than DETR (especially on small objects) with 10 times less training epochs. Extensive experiments on the COCO benchmark demonstrate the effectiveness of our approach. + +
+ +
+ +## Results and Models + +| Backbone | Model | Lr schd | box AP | Config | Download | +| :------: | :---------------------------------: | :-----: | :----: | :------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | Deformable DETR | 50e | 44.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/deformable_detr/deformable_detr_r50_16x2_50e_coco/deformable_detr_r50_16x2_50e_coco_20210419_220030-a12b9512.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/deformable_detr/deformable_detr_r50_16x2_50e_coco/deformable_detr_r50_16x2_50e_coco_20210419_220030-a12b9512.log.json) | +| R-50 | + iterative bounding box refinement | 50e | 46.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/deformable_detr/deformable_detr_refine_r50_16x2_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/deformable_detr/deformable_detr_refine_r50_16x2_50e_coco/deformable_detr_refine_r50_16x2_50e_coco_20210419_220503-5f5dff21.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/deformable_detr/deformable_detr_refine_r50_16x2_50e_coco/deformable_detr_refine_r50_16x2_50e_coco_20210419_220503-5f5dff21.log.json) | +| R-50 | ++ two-stage Deformable DETR | 50e | 46.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/deformable_detr/deformable_detr_twostage_refine_r50_16x2_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/deformable_detr/deformable_detr_twostage_refine_r50_16x2_50e_coco/deformable_detr_twostage_refine_r50_16x2_50e_coco_20210419_220613-9d28ab72.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/deformable_detr/deformable_detr_twostage_refine_r50_16x2_50e_coco/deformable_detr_twostage_refine_r50_16x2_50e_coco_20210419_220613-9d28ab72.log.json) | + +# NOTE + +1. All models are trained with batch size 32. +2. The performance is unstable. `Deformable DETR` and `iterative bounding box refinement` may fluctuate about 0.3 mAP. `two-stage Deformable DETR` may fluctuate about 0.2 mAP. + +## Citation + +We provide the config files for Deformable DETR: [Deformable DETR: Deformable Transformers for End-to-End Object Detection](https://arxiv.org/abs/2010.04159). + +```latex +@inproceedings{ +zhu2021deformable, +title={Deformable DETR: Deformable Transformers for End-to-End Object Detection}, +author={Xizhou Zhu and Weijie Su and Lewei Lu and Bin Li and Xiaogang Wang and Jifeng Dai}, +booktitle={International Conference on Learning Representations}, +year={2021}, +url={https://openreview.net/forum?id=gZ9hCDWe6ke} +} +``` diff --git a/configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py b/configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py new file mode 100644 index 0000000..c64d09f --- /dev/null +++ b/configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py @@ -0,0 +1,177 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', '../_base_/default_runtime.py' +] +model = dict( + type='DeformableDETR', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='ChannelMapper', + in_channels=[512, 1024, 2048], + kernel_size=1, + out_channels=256, + act_cfg=None, + norm_cfg=dict(type='GN', num_groups=32), + num_outs=4), + bbox_head=dict( + type='DeformableDETRHead', + num_query=300, + num_classes=80, + in_channels=2048, + sync_cls_avg_factor=True, + as_two_stage=False, + transformer=dict( + type='DeformableDetrTransformer', + encoder=dict( + type='DetrTransformerEncoder', + num_layers=6, + transformerlayers=dict( + type='BaseTransformerLayer', + attn_cfgs=dict( + type='MultiScaleDeformableAttention', embed_dims=256), + feedforward_channels=1024, + ffn_dropout=0.1, + operation_order=('self_attn', 'norm', 'ffn', 'norm'))), + decoder=dict( + type='DeformableDetrTransformerDecoder', + num_layers=6, + return_intermediate=True, + transformerlayers=dict( + type='DetrTransformerDecoderLayer', + attn_cfgs=[ + dict( + type='MultiheadAttention', + embed_dims=256, + num_heads=8, + dropout=0.1), + dict( + type='MultiScaleDeformableAttention', + embed_dims=256) + ], + feedforward_channels=1024, + ffn_dropout=0.1, + operation_order=('self_attn', 'norm', 'cross_attn', 'norm', + 'ffn', 'norm')))), + positional_encoding=dict( + type='SinePositionalEncoding', + num_feats=128, + normalize=True, + offset=-0.5), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=2.0), + loss_bbox=dict(type='L1Loss', loss_weight=5.0), + loss_iou=dict(type='GIoULoss', loss_weight=2.0)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='HungarianAssigner', + cls_cost=dict(type='FocalLossCost', weight=2.0), + reg_cost=dict(type='BBoxL1Cost', weight=5.0, box_format='xywh'), + iou_cost=dict(type='IoUCost', iou_mode='giou', weight=2.0))), + test_cfg=dict(max_per_img=100)) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +# train_pipeline, NOTE the img_scale and the Pad's size_divisor is different +# from the default setting in mmdet. +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='AutoAugment', + policies=[ + [ + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + keep_ratio=True) + ], + [ + dict( + type='Resize', + # The radio of all image in train dataset < 7 + # follow the original impl + img_scale=[(400, 4200), (500, 4200), (600, 4200)], + multiscale_mode='value', + keep_ratio=True), + dict( + type='RandomCrop', + crop_type='absolute_range', + crop_size=(384, 600), + allow_negative_crop=True), + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + override=True, + keep_ratio=True) + ] + ]), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=1), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] +# test_pipeline, NOTE the Pad's size_divisor is different from the default +# setting (size_divisor=32). While there is little effect on the performance +# whether we use the default setting or use size_divisor=1. +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=1), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(filter_empty_gt=False, pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict( + type='AdamW', + lr=2e-4, + weight_decay=0.0001, + paramwise_cfg=dict( + custom_keys={ + 'backbone': dict(lr_mult=0.1), + 'sampling_offsets': dict(lr_mult=0.1), + 'reference_points': dict(lr_mult=0.1) + })) +optimizer_config = dict(grad_clip=dict(max_norm=0.1, norm_type=2)) +# learning policy +lr_config = dict(policy='step', step=[40]) +runner = dict(type='EpochBasedRunner', max_epochs=50) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (16 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=32) diff --git a/configs/deformable_detr/deformable_detr_refine_r50_16x2_50e_coco.py b/configs/deformable_detr/deformable_detr_refine_r50_16x2_50e_coco.py new file mode 100644 index 0000000..01f13df --- /dev/null +++ b/configs/deformable_detr/deformable_detr_refine_r50_16x2_50e_coco.py @@ -0,0 +1,2 @@ +_base_ = 'deformable_detr_r50_16x2_50e_coco.py' +model = dict(bbox_head=dict(with_box_refine=True)) diff --git a/configs/deformable_detr/deformable_detr_twostage_refine_r50_16x2_50e_coco.py b/configs/deformable_detr/deformable_detr_twostage_refine_r50_16x2_50e_coco.py new file mode 100644 index 0000000..2aa840d --- /dev/null +++ b/configs/deformable_detr/deformable_detr_twostage_refine_r50_16x2_50e_coco.py @@ -0,0 +1,2 @@ +_base_ = 'deformable_detr_refine_r50_16x2_50e_coco.py' +model = dict(bbox_head=dict(as_two_stage=True)) diff --git a/configs/deformable_detr/metafile.yml b/configs/deformable_detr/metafile.yml new file mode 100644 index 0000000..873292d --- /dev/null +++ b/configs/deformable_detr/metafile.yml @@ -0,0 +1,56 @@ +Collections: + - Name: Deformable DETR + Metadata: + Training Data: COCO + Training Techniques: + - AdamW + - Multi Scale Train + - Gradient Clip + Training Resources: 8x V100 GPUs + Architecture: + - ResNet + - Transformer + Paper: + URL: https://openreview.net/forum?id=gZ9hCDWe6ke + Title: 'Deformable DETR: Deformable Transformers for End-to-End Object Detection' + README: configs/deformable_detr/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.12.0/mmdet/models/detectors/deformable_detr.py#L6 + Version: v2.12.0 + +Models: + - Name: deformable_detr_r50_16x2_50e_coco + In Collection: Deformable DETR + Config: configs/deformable_detr/deformable_detr_r50_16x2_50e_coco.py + Metadata: + Epochs: 50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/deformable_detr/deformable_detr_r50_16x2_50e_coco/deformable_detr_r50_16x2_50e_coco_20210419_220030-a12b9512.pth + + - Name: deformable_detr_refine_r50_16x2_50e_coco + In Collection: Deformable DETR + Config: configs/deformable_detr/deformable_detr_refine_r50_16x2_50e_coco.py + Metadata: + Epochs: 50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/deformable_detr/deformable_detr_refine_r50_16x2_50e_coco/deformable_detr_refine_r50_16x2_50e_coco_20210419_220503-5f5dff21.pth + + - Name: deformable_detr_twostage_refine_r50_16x2_50e_coco + In Collection: Deformable DETR + Config: configs/deformable_detr/deformable_detr_twostage_refine_r50_16x2_50e_coco.py + Metadata: + Epochs: 50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/deformable_detr/deformable_detr_twostage_refine_r50_16x2_50e_coco/deformable_detr_twostage_refine_r50_16x2_50e_coco_20210419_220613-9d28ab72.pth diff --git a/configs/detectors/README.md b/configs/detectors/README.md new file mode 100644 index 0000000..baa245f --- /dev/null +++ b/configs/detectors/README.md @@ -0,0 +1,69 @@ +# DetectoRS + +> [DetectoRS: Detecting Objects with Recursive Feature Pyramid and Switchable Atrous Convolution](https://arxiv.org/abs/2006.02334) + + + +## Abstract + +Many modern object detectors demonstrate outstanding performances by using the mechanism of looking and thinking twice. In this paper, we explore this mechanism in the backbone design for object detection. At the macro level, we propose Recursive Feature Pyramid, which incorporates extra feedback connections from Feature Pyramid Networks into the bottom-up backbone layers. At the micro level, we propose Switchable Atrous Convolution, which convolves the features with different atrous rates and gathers the results using switch functions. Combining them results in DetectoRS, which significantly improves the performances of object detection. On COCO test-dev, DetectoRS achieves state-of-the-art 55.7% box AP for object detection, 48.5% mask AP for instance segmentation, and 50.0% PQ for panoptic segmentation. + +
+ +
+ +## Introduction + +DetectoRS requires COCO and [COCO-stuff](http://calvin.inf.ed.ac.uk/wp-content/uploads/data/cocostuffdataset/stuffthingmaps_trainval2017.zip) dataset for training. You need to download and extract it in the COCO dataset path. +The directory should be like this. + +```none +mmdetection +├── mmdet +├── tools +├── configs +├── data +│ ├── coco +│ │ ├── annotations +│ │ ├── train2017 +│ │ ├── val2017 +│ │ ├── test2017 +| | ├── stuffthingmaps +``` + +## Results and Models + +DetectoRS includes two major components: + +- Recursive Feature Pyramid (RFP). +- Switchable Atrous Convolution (SAC). + +They can be used independently. +Combining them together results in DetectoRS. +The results on COCO 2017 val are shown in the below table. + +| Method | Detector | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------: | :-----------------: | :-----: | :------: | :------------: | :----: | :-----: | :---------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| RFP | Cascade + ResNet-50 | 1x | 7.5 | - | 44.8 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/detectors/cascade_rcnn_r50_rfp_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/detectors/cascade_rcnn_r50_rfp_1x_coco/cascade_rcnn_r50_rfp_1x_coco-8cf51bfd.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/detectors/cascade_rcnn_r50_rfp_1x_coco/cascade_rcnn_r50_rfp_1x_coco_20200624_104126.log.json) | +| SAC | Cascade + ResNet-50 | 1x | 5.6 | - | 45.0 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/detectors/cascade_rcnn_r50_sac_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/detectors/cascade_rcnn_r50_sac_1x_coco/cascade_rcnn_r50_sac_1x_coco-24bfda62.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/detectors/cascade_rcnn_r50_sac_1x_coco/cascade_rcnn_r50_sac_1x_coco_20200624_104402.log.json) | +| DetectoRS | Cascade + ResNet-50 | 1x | 9.9 | - | 47.4 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/detectors/detectors_cascade_rcnn_r50_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/detectors/detectors_cascade_rcnn_r50_1x_coco/detectors_cascade_rcnn_r50_1x_coco-32a10ba0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/detectors/detectors_cascade_rcnn_r50_1x_coco/detectors_cascade_rcnn_r50_1x_coco_20200706_001203.log.json) | +| RFP | HTC + ResNet-50 | 1x | 11.2 | - | 46.6 | 40.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/detectors/htc_r50_rfp_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/detectors/htc_r50_rfp_1x_coco/htc_r50_rfp_1x_coco-8ff87c51.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/detectors/htc_r50_rfp_1x_coco/htc_r50_rfp_1x_coco_20200624_103053.log.json) | +| SAC | HTC + ResNet-50 | 1x | 9.3 | - | 46.4 | 40.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/detectors/htc_r50_sac_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/detectors/htc_r50_sac_1x_coco/htc_r50_sac_1x_coco-bfa60c54.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/detectors/htc_r50_sac_1x_coco/htc_r50_sac_1x_coco_20200624_103111.log.json) | +| DetectoRS | HTC + ResNet-50 | 1x | 13.6 | - | 49.1 | 42.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/detectors/detectors_htc_r50_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/detectors/detectors_htc_r50_1x_coco/detectors_htc_r50_1x_coco-329b1453.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/detectors/detectors_htc_r50_1x_coco/detectors_htc_r50_1x_coco_20200624_103659.log.json) | +| DetectoRS | HTC + ResNet-101 | 20e | 19.6 | | 50.5 | 43.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/detectors/detectors_htc_r101_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/detectors/detectors_htc_r101_20e_coco/detectors_htc_r101_20e_coco_20210419_203638-348d533b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/detectors/detectors_htc_r101_20e_coco/detectors_htc_r101_20e_coco_20210419_203638.log.json) | + +*Note*: This is a re-implementation based on MMDetection-V2. +The original implementation is based on MMDetection-V1. + +## Citation + +We provide the config files for [DetectoRS: Detecting Objects with Recursive Feature Pyramid and Switchable Atrous Convolution](https://arxiv.org/pdf/2006.02334.pdf). + +```latex +@article{qiao2020detectors, + title={DetectoRS: Detecting Objects with Recursive Feature Pyramid and Switchable Atrous Convolution}, + author={Qiao, Siyuan and Chen, Liang-Chieh and Yuille, Alan}, + journal={arXiv preprint arXiv:2006.02334}, + year={2020} +} +``` diff --git a/configs/detectors/cascade_rcnn_r50_rfp_1x_coco.py b/configs/detectors/cascade_rcnn_r50_rfp_1x_coco.py new file mode 100644 index 0000000..4430d8a --- /dev/null +++ b/configs/detectors/cascade_rcnn_r50_rfp_1x_coco.py @@ -0,0 +1,28 @@ +_base_ = [ + '../_base_/models/cascade_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + backbone=dict( + type='DetectoRS_ResNet', + conv_cfg=dict(type='ConvAWS'), + output_img=True), + neck=dict( + type='RFP', + rfp_steps=2, + aspp_out_channels=64, + aspp_dilations=(1, 3, 6, 1), + rfp_backbone=dict( + rfp_inplanes=256, + type='DetectoRS_ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + conv_cfg=dict(type='ConvAWS'), + pretrained='torchvision://resnet50', + style='pytorch'))) diff --git a/configs/detectors/cascade_rcnn_r50_sac_1x_coco.py b/configs/detectors/cascade_rcnn_r50_sac_1x_coco.py new file mode 100644 index 0000000..ccd9319 --- /dev/null +++ b/configs/detectors/cascade_rcnn_r50_sac_1x_coco.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/cascade_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + backbone=dict( + type='DetectoRS_ResNet', + conv_cfg=dict(type='ConvAWS'), + sac=dict(type='SAC', use_deform=True), + stage_with_sac=(False, True, True, True))) diff --git a/configs/detectors/detectors_cascade_rcnn_r50_1x_coco.py b/configs/detectors/detectors_cascade_rcnn_r50_1x_coco.py new file mode 100644 index 0000000..f760404 --- /dev/null +++ b/configs/detectors/detectors_cascade_rcnn_r50_1x_coco.py @@ -0,0 +1,32 @@ +_base_ = [ + '../_base_/models/cascade_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + backbone=dict( + type='DetectoRS_ResNet', + conv_cfg=dict(type='ConvAWS'), + sac=dict(type='SAC', use_deform=True), + stage_with_sac=(False, True, True, True), + output_img=True), + neck=dict( + type='RFP', + rfp_steps=2, + aspp_out_channels=64, + aspp_dilations=(1, 3, 6, 1), + rfp_backbone=dict( + rfp_inplanes=256, + type='DetectoRS_ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + conv_cfg=dict(type='ConvAWS'), + sac=dict(type='SAC', use_deform=True), + stage_with_sac=(False, True, True, True), + pretrained='torchvision://resnet50', + style='pytorch'))) diff --git a/configs/detectors/detectors_htc_r101_20e_coco.py b/configs/detectors/detectors_htc_r101_20e_coco.py new file mode 100644 index 0000000..93d7d2b --- /dev/null +++ b/configs/detectors/detectors_htc_r101_20e_coco.py @@ -0,0 +1,28 @@ +_base_ = '../htc/htc_r101_fpn_20e_coco.py' + +model = dict( + backbone=dict( + type='DetectoRS_ResNet', + conv_cfg=dict(type='ConvAWS'), + sac=dict(type='SAC', use_deform=True), + stage_with_sac=(False, True, True, True), + output_img=True), + neck=dict( + type='RFP', + rfp_steps=2, + aspp_out_channels=64, + aspp_dilations=(1, 3, 6, 1), + rfp_backbone=dict( + rfp_inplanes=256, + type='DetectoRS_ResNet', + depth=101, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + conv_cfg=dict(type='ConvAWS'), + sac=dict(type='SAC', use_deform=True), + stage_with_sac=(False, True, True, True), + pretrained='torchvision://resnet101', + style='pytorch'))) diff --git a/configs/detectors/detectors_htc_r50_1x_coco.py b/configs/detectors/detectors_htc_r50_1x_coco.py new file mode 100644 index 0000000..0d2fc4f --- /dev/null +++ b/configs/detectors/detectors_htc_r50_1x_coco.py @@ -0,0 +1,28 @@ +_base_ = '../htc/htc_r50_fpn_1x_coco.py' + +model = dict( + backbone=dict( + type='DetectoRS_ResNet', + conv_cfg=dict(type='ConvAWS'), + sac=dict(type='SAC', use_deform=True), + stage_with_sac=(False, True, True, True), + output_img=True), + neck=dict( + type='RFP', + rfp_steps=2, + aspp_out_channels=64, + aspp_dilations=(1, 3, 6, 1), + rfp_backbone=dict( + rfp_inplanes=256, + type='DetectoRS_ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + conv_cfg=dict(type='ConvAWS'), + sac=dict(type='SAC', use_deform=True), + stage_with_sac=(False, True, True, True), + pretrained='torchvision://resnet50', + style='pytorch'))) diff --git a/configs/detectors/htc_r50_rfp_1x_coco.py b/configs/detectors/htc_r50_rfp_1x_coco.py new file mode 100644 index 0000000..496104e --- /dev/null +++ b/configs/detectors/htc_r50_rfp_1x_coco.py @@ -0,0 +1,24 @@ +_base_ = '../htc/htc_r50_fpn_1x_coco.py' + +model = dict( + backbone=dict( + type='DetectoRS_ResNet', + conv_cfg=dict(type='ConvAWS'), + output_img=True), + neck=dict( + type='RFP', + rfp_steps=2, + aspp_out_channels=64, + aspp_dilations=(1, 3, 6, 1), + rfp_backbone=dict( + rfp_inplanes=256, + type='DetectoRS_ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + conv_cfg=dict(type='ConvAWS'), + pretrained='torchvision://resnet50', + style='pytorch'))) diff --git a/configs/detectors/htc_r50_sac_1x_coco.py b/configs/detectors/htc_r50_sac_1x_coco.py new file mode 100644 index 0000000..72d4db9 --- /dev/null +++ b/configs/detectors/htc_r50_sac_1x_coco.py @@ -0,0 +1,8 @@ +_base_ = '../htc/htc_r50_fpn_1x_coco.py' + +model = dict( + backbone=dict( + type='DetectoRS_ResNet', + conv_cfg=dict(type='ConvAWS'), + sac=dict(type='SAC', use_deform=True), + stage_with_sac=(False, True, True, True))) diff --git a/configs/detectors/metafile.yml b/configs/detectors/metafile.yml new file mode 100644 index 0000000..4bed569 --- /dev/null +++ b/configs/detectors/metafile.yml @@ -0,0 +1,114 @@ +Collections: + - Name: DetectoRS + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - ASPP + - FPN + - RFP + - RPN + - ResNet + - RoIAlign + - SAC + Paper: + URL: https://arxiv.org/abs/2006.02334 + Title: 'DetectoRS: Detecting Objects with Recursive Feature Pyramid and Switchable Atrous Convolution' + README: configs/detectors/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.2.0/mmdet/models/backbones/detectors_resnet.py#L205 + Version: v2.2.0 + +Models: + - Name: cascade_rcnn_r50_rfp_1x_coco + In Collection: DetectoRS + Config: configs/detectors/cascade_rcnn_r50_rfp_1x_coco.py + Metadata: + Training Memory (GB): 7.5 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/detectors/cascade_rcnn_r50_rfp_1x_coco/cascade_rcnn_r50_rfp_1x_coco-8cf51bfd.pth + + - Name: cascade_rcnn_r50_sac_1x_coco + In Collection: DetectoRS + Config: configs/detectors/cascade_rcnn_r50_sac_1x_coco.py + Metadata: + Training Memory (GB): 5.6 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/detectors/cascade_rcnn_r50_sac_1x_coco/cascade_rcnn_r50_sac_1x_coco-24bfda62.pth + + - Name: detectors_cascade_rcnn_r50_1x_coco + In Collection: DetectoRS + Config: configs/detectors/detectors_cascade_rcnn_r50_1x_coco.py + Metadata: + Training Memory (GB): 9.9 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/detectors/detectors_cascade_rcnn_r50_1x_coco/detectors_cascade_rcnn_r50_1x_coco-32a10ba0.pth + + - Name: htc_r50_rfp_1x_coco + In Collection: DetectoRS + Config: configs/detectors/htc_r50_rfp_1x_coco.py + Metadata: + Training Memory (GB): 11.2 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/detectors/htc_r50_rfp_1x_coco/htc_r50_rfp_1x_coco-8ff87c51.pth + + - Name: htc_r50_sac_1x_coco + In Collection: DetectoRS + Config: configs/detectors/htc_r50_sac_1x_coco.py + Metadata: + Training Memory (GB): 9.3 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/detectors/htc_r50_sac_1x_coco/htc_r50_sac_1x_coco-bfa60c54.pth + + - Name: detectors_htc_r50_1x_coco + In Collection: DetectoRS + Config: configs/detectors/detectors_htc_r50_1x_coco.py + Metadata: + Training Memory (GB): 13.6 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 49.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 42.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/detectors/detectors_htc_r50_1x_coco/detectors_htc_r50_1x_coco-329b1453.pth diff --git a/configs/detr/README.md b/configs/detr/README.md new file mode 100644 index 0000000..9f2485d --- /dev/null +++ b/configs/detr/README.md @@ -0,0 +1,37 @@ +# DETR + +> [End-to-End Object Detection with Transformers](https://arxiv.org/abs/2005.12872) + + + +## Abstract + +We present a new method that views object detection as a direct set prediction problem. Our approach streamlines the detection pipeline, effectively removing the need for many hand-designed components like a non-maximum suppression procedure or anchor generation that explicitly encode our prior knowledge about the task. The main ingredients of the new framework, called DEtection TRansformer or DETR, are a set-based global loss that forces unique predictions via bipartite matching, and a transformer encoder-decoder architecture. Given a fixed small set of learned object queries, DETR reasons about the relations of the objects and the global image context to directly output the final set of predictions in parallel. The new model is conceptually simple and does not require a specialized library, unlike many other modern detectors. DETR demonstrates accuracy and run-time performance on par with the well-established and highly-optimized Faster RCNN baseline on the challenging COCO object detection dataset. Moreover, DETR can be easily generalized to produce panoptic segmentation in a unified manner. We show that it significantly outperforms competitive baselines. + +
+ +
+ +## Results and Models + +| Backbone | Model | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------: | :---: | :-----: | :------: | :------------: | :----: | :----------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | DETR | 150e | 7.9 | | 40.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/detr/detr_r50_8x2_150e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/detr/detr_r50_8x2_150e_coco/detr_r50_8x2_150e_coco_20201130_194835-2c4b8974.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/detr/detr_r50_8x2_150e_coco/detr_r50_8x2_150e_coco_20201130_194835.log.json) | + +## Citation + +We provide the config files for DETR: [End-to-End Object Detection with Transformers](https://arxiv.org/abs/2005.12872). + +```latex +@inproceedings{detr, + author = {Nicolas Carion and + Francisco Massa and + Gabriel Synnaeve and + Nicolas Usunier and + Alexander Kirillov and + Sergey Zagoruyko}, + title = {End-to-End Object Detection with Transformers}, + booktitle = {ECCV}, + year = {2020} +} +``` diff --git a/configs/detr/detr_r50_8x2_150e_coco.py b/configs/detr/detr_r50_8x2_150e_coco.py new file mode 100644 index 0000000..892447d --- /dev/null +++ b/configs/detr/detr_r50_8x2_150e_coco.py @@ -0,0 +1,150 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', '../_base_/default_runtime.py' +] +model = dict( + type='DETR', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(3, ), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + bbox_head=dict( + type='DETRHead', + num_classes=80, + in_channels=2048, + transformer=dict( + type='Transformer', + encoder=dict( + type='DetrTransformerEncoder', + num_layers=6, + transformerlayers=dict( + type='BaseTransformerLayer', + attn_cfgs=[ + dict( + type='MultiheadAttention', + embed_dims=256, + num_heads=8, + dropout=0.1) + ], + feedforward_channels=2048, + ffn_dropout=0.1, + operation_order=('self_attn', 'norm', 'ffn', 'norm'))), + decoder=dict( + type='DetrTransformerDecoder', + return_intermediate=True, + num_layers=6, + transformerlayers=dict( + type='DetrTransformerDecoderLayer', + attn_cfgs=dict( + type='MultiheadAttention', + embed_dims=256, + num_heads=8, + dropout=0.1), + feedforward_channels=2048, + ffn_dropout=0.1, + operation_order=('self_attn', 'norm', 'cross_attn', 'norm', + 'ffn', 'norm')), + )), + positional_encoding=dict( + type='SinePositionalEncoding', num_feats=128, normalize=True), + loss_cls=dict( + type='CrossEntropyLoss', + bg_cls_weight=0.1, + use_sigmoid=False, + loss_weight=1.0, + class_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=5.0), + loss_iou=dict(type='GIoULoss', loss_weight=2.0)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='HungarianAssigner', + cls_cost=dict(type='ClassificationCost', weight=1.), + reg_cost=dict(type='BBoxL1Cost', weight=5.0, box_format='xywh'), + iou_cost=dict(type='IoUCost', iou_mode='giou', weight=2.0))), + test_cfg=dict(max_per_img=100)) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +# train_pipeline, NOTE the img_scale and the Pad's size_divisor is different +# from the default setting in mmdet. +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='AutoAugment', + policies=[[ + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), (576, 1333), + (608, 1333), (640, 1333), (672, 1333), (704, 1333), + (736, 1333), (768, 1333), (800, 1333)], + multiscale_mode='value', + keep_ratio=True) + ], + [ + dict( + type='Resize', + img_scale=[(400, 1333), (500, 1333), (600, 1333)], + multiscale_mode='value', + keep_ratio=True), + dict( + type='RandomCrop', + crop_type='absolute_range', + crop_size=(384, 600), + allow_negative_crop=True), + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + override=True, + keep_ratio=True) + ]]), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=1), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] +# test_pipeline, NOTE the Pad's size_divisor is different from the default +# setting (size_divisor=32). While there is little effect on the performance +# whether we use the default setting or use size_divisor=1. +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=1), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict( + type='AdamW', + lr=0.0001, + weight_decay=0.0001, + paramwise_cfg=dict( + custom_keys={'backbone': dict(lr_mult=0.1, decay_mult=1.0)})) +optimizer_config = dict(grad_clip=dict(max_norm=0.1, norm_type=2)) +# learning policy +lr_config = dict(policy='step', step=[100]) +runner = dict(type='EpochBasedRunner', max_epochs=150) diff --git a/configs/detr/metafile.yml b/configs/detr/metafile.yml new file mode 100644 index 0000000..45622cf --- /dev/null +++ b/configs/detr/metafile.yml @@ -0,0 +1,33 @@ +Collections: + - Name: DETR + Metadata: + Training Data: COCO + Training Techniques: + - AdamW + - Multi Scale Train + - Gradient Clip + Training Resources: 8x V100 GPUs + Architecture: + - ResNet + - Transformer + Paper: + URL: https://arxiv.org/abs/2005.12872 + Title: 'End-to-End Object Detection with Transformers' + README: configs/detr/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.7.0/mmdet/models/detectors/detr.py#L7 + Version: v2.7.0 + +Models: + - Name: detr_r50_8x2_150e_coco + In Collection: DETR + Config: configs/detr/detr_r50_8x2_150e_coco.py + Metadata: + Training Memory (GB): 7.9 + Epochs: 150 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/detr/detr_r50_8x2_150e_coco/detr_r50_8x2_150e_coco_20201130_194835-2c4b8974.pth diff --git a/configs/double_heads/README.md b/configs/double_heads/README.md new file mode 100644 index 0000000..4a149b5 --- /dev/null +++ b/configs/double_heads/README.md @@ -0,0 +1,32 @@ +# Double Heads + +> [Rethinking Classification and Localization for Object Detection](https://arxiv.org/abs/1904.06493) + + + +## Abstract + +Two head structures (i.e. fully connected head and convolution head) have been widely used in R-CNN based detectors for classification and localization tasks. However, there is a lack of understanding of how does these two head structures work for these two tasks. To address this issue, we perform a thorough analysis and find an interesting fact that the two head structures have opposite preferences towards the two tasks. Specifically, the fully connected head (fc-head) is more suitable for the classification task, while the convolution head (conv-head) is more suitable for the localization task. Furthermore, we examine the output feature maps of both heads and find that fc-head has more spatial sensitivity than conv-head. Thus, fc-head has more capability to distinguish a complete object from part of an object, but is not robust to regress the whole object. Based upon these findings, we propose a Double-Head method, which has a fully connected head focusing on classification and a convolution head for bounding box regression. Without bells and whistles, our method gains +3.5 and +2.8 AP on MS COCO dataset from Feature Pyramid Network (FPN) baselines with ResNet-50 and ResNet-101 backbones, respectively. + +
+ +
+ +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------: | :-----: | :-----: | :------: | :------------: | :----: | :--------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | 1x | 6.8 | 9.5 | 40.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/double_heads/dh_faster_rcnn_r50_fpn_1x_coco/dh_faster_rcnn_r50_fpn_1x_coco_20200130-586b67df.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/double_heads/dh_faster_rcnn_r50_fpn_1x_coco/dh_faster_rcnn_r50_fpn_1x_coco_20200130_220238.log.json) | + +## Citation + +```latex +@article{wu2019rethinking, + title={Rethinking Classification and Localization for Object Detection}, + author={Yue Wu and Yinpeng Chen and Lu Yuan and Zicheng Liu and Lijuan Wang and Hongzhi Li and Yun Fu}, + year={2019}, + eprint={1904.06493}, + archivePrefix={arXiv}, + primaryClass={cs.CV} +} +``` diff --git a/configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py b/configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..9b8118b --- /dev/null +++ b/configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,23 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + roi_head=dict( + type='DoubleHeadRoIHead', + reg_roi_scale_factor=1.3, + bbox_head=dict( + _delete_=True, + type='DoubleConvFCBBoxHead', + num_convs=4, + num_fcs=2, + in_channels=256, + conv_out_channels=1024, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=2.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=2.0)))) diff --git a/configs/double_heads/metafile.yml b/configs/double_heads/metafile.yml new file mode 100644 index 0000000..6fe9b7a --- /dev/null +++ b/configs/double_heads/metafile.yml @@ -0,0 +1,41 @@ +Collections: + - Name: Rethinking Classification and Localization for Object Detection + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - RPN + - ResNet + - RoIAlign + Paper: + URL: https://arxiv.org/pdf/1904.06493 + Title: 'Rethinking Classification and Localization for Object Detection' + README: configs/double_heads/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/roi_heads/double_roi_head.py#L6 + Version: v2.0.0 + +Models: + - Name: dh_faster_rcnn_r50_fpn_1x_coco + In Collection: Rethinking Classification and Localization for Object Detection + Config: configs/double_heads/dh_faster_rcnn_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.8 + inference time (ms/im): + - value: 105.26 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/double_heads/dh_faster_rcnn_r50_fpn_1x_coco/dh_faster_rcnn_r50_fpn_1x_coco_20200130-586b67df.pth diff --git a/configs/dyhead/README.md b/configs/dyhead/README.md new file mode 100644 index 0000000..8e6aed3 --- /dev/null +++ b/configs/dyhead/README.md @@ -0,0 +1,52 @@ +# DyHead + +> [Dynamic Head: Unifying Object Detection Heads with Attentions](https://arxiv.org/abs/2106.08322) + + + +## Abstract + +The complex nature of combining localization and classification in object detection has resulted in the flourished development of methods. Previous works tried to improve the performance in various object detection heads but failed to present a unified view. In this paper, we present a novel dynamic head framework to unify object detection heads with attentions. By coherently combining multiple self-attention mechanisms between feature levels for scale-awareness, among spatial locations for spatial-awareness, and within output channels for task-awareness, the proposed approach significantly improves the representation ability of object detection heads without any computational overhead. Further experiments demonstrate that the effectiveness and efficiency of the proposed dynamic head on the COCO benchmark. With a standard ResNeXt-101-DCN backbone, we largely improve the performance over popular object detectors and achieve a new state-of-the-art at 54.0 AP. Furthermore, with latest transformer backbone and extra data, we can push current best COCO result to a new record at 60.6 AP. + +
+ +
+ +## Results and Models + +| Method | Backbone | Style | Setting | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :----: | :------: | :-----: | :----------: | :-----: | :------: | :------------: | :----: | :----------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ATSS | R-50 | caffe | reproduction | 1x | 5.4 | 13.2 | 42.5 | [config](./atss_r50_caffe_fpn_dyhead_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dyhead/atss_r50_fpn_dyhead_for_reproduction_1x_coco/atss_r50_fpn_dyhead_for_reproduction_4x4_1x_coco_20220107_213939-162888e6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dyhead/atss_r50_fpn_dyhead_for_reproduction_1x_coco/atss_r50_fpn_dyhead_for_reproduction_4x4_1x_coco_20220107_213939.log.json) | +| ATSS | R-50 | pytorch | simple | 1x | 4.9 | 13.7 | 43.3 | [config](./atss_r50_fpn_dyhead_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dyhead/atss_r50_fpn_dyhead_4x4_1x_coco/atss_r50_fpn_dyhead_4x4_1x_coco_20211219_023314-eaa620c6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dyhead/atss_r50_fpn_dyhead_4x4_1x_coco/atss_r50_fpn_dyhead_4x4_1x_coco_20211219_023314.log.json) | + +- We trained the above models with 4 GPUs and 4 `samples_per_gpu`. +- The `reproduction` setting aims to reproduce the official implementation based on Detectron2. +- The `simple` setting serves as a minimum example to use DyHead in MMDetection. Specifically, + - it adds `DyHead` to `neck` after `FPN` + - it sets `stacked_convs=0` to `bbox_head` +- The `simple` setting achieves higher AP than the original implementation. + We have not conduct ablation study between the two settings. + `dict(type='Pad', size_divisor=128)` may further improve AP by prefer spatial alignment across pyramid levels, although large padding reduces efficiency. + +We also trained the model with Swin-L backbone. Results are as below. + +| Method | Backbone | Style | Setting | Lr schd | mstrain | box AP | Config | Download | +| :----: | :------: | :---: | :----------: | :-----: | :------: | :----: | :----------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ATSS | Swin-L | caffe | reproduction | 2x | 480~1200 | 56.2 | [config](./atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dyhead/atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco/atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco_20220509_100315-bc5b6516.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dyhead/atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco/atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco_20220509_100315.log.json) | + +## Relation to Other Methods + +- DyHead can be regarded as an improved [SEPC](https://arxiv.org/abs/2005.03101) with [DyReLU modules](https://arxiv.org/abs/2003.10027) and simplified [SE blocks](https://arxiv.org/abs/1709.01507). +- Xiyang Dai et al., the author team of DyHead, adopt it for [Dynamic DETR](https://openaccess.thecvf.com/content/ICCV2021/html/Dai_Dynamic_DETR_End-to-End_Object_Detection_With_Dynamic_Attention_ICCV_2021_paper.html). + The description of Dynamic Encoder in Sec. 3.2 will help you understand DyHead. + +## Citation + +```latex +@inproceedings{DyHead_CVPR2021, + author = {Dai, Xiyang and Chen, Yinpeng and Xiao, Bin and Chen, Dongdong and Liu, Mengchen and Yuan, Lu and Zhang, Lei}, + title = {Dynamic Head: Unifying Object Detection Heads With Attentions}, + booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)}, + year = {2021} +} +``` diff --git a/configs/dyhead/atss_r50_caffe_fpn_dyhead_1x_coco.py b/configs/dyhead/atss_r50_caffe_fpn_dyhead_1x_coco.py new file mode 100644 index 0000000..223b653 --- /dev/null +++ b/configs/dyhead/atss_r50_caffe_fpn_dyhead_1x_coco.py @@ -0,0 +1,112 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='ATSS', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + neck=[ + dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + dict( + type='DyHead', + in_channels=256, + out_channels=256, + num_blocks=6, + # disable zero_init_offset to follow official implementation + zero_init_offset=False) + ], + bbox_head=dict( + type='ATSSHead', + num_classes=80, + in_channels=256, + pred_kernel_size=1, # follow DyHead official implementation + stacked_convs=0, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128], + center_offset=0.5), # follow DyHead official implementation + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=2.0), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), + # training and testing settings + train_cfg=dict( + assigner=dict(type='ATSSAssigner', topk=9), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) + +# use caffe img_norm, size_divisor=128, pillow resize +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=(1333, 800), + keep_ratio=True, + backend='pillow'), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=128), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True, backend='pillow'), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=128), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/dyhead/atss_r50_fpn_dyhead_1x_coco.py b/configs/dyhead/atss_r50_fpn_dyhead_1x_coco.py new file mode 100644 index 0000000..8c5109d --- /dev/null +++ b/configs/dyhead/atss_r50_fpn_dyhead_1x_coco.py @@ -0,0 +1,65 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='ATSS', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=[ + dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + dict(type='DyHead', in_channels=256, out_channels=256, num_blocks=6) + ], + bbox_head=dict( + type='ATSSHead', + num_classes=80, + in_channels=256, + stacked_convs=0, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=2.0), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), + # training and testing settings + train_cfg=dict( + assigner=dict(type='ATSSAssigner', topk=9), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/configs/dyhead/atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco.py b/configs/dyhead/atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco.py new file mode 100644 index 0000000..dc9c328 --- /dev/null +++ b/configs/dyhead/atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco.py @@ -0,0 +1,164 @@ +_base_ = '../_base_/default_runtime.py' + +pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_large_patch4_window12_384_22k.pth' # noqa +model = dict( + type='ATSS', + backbone=dict( + type='SwinTransformer', + pretrain_img_size=384, + embed_dims=192, + depths=[2, 2, 18, 2], + num_heads=[6, 12, 24, 48], + window_size=12, + mlp_ratio=4, + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.2, + patch_norm=True, + out_indices=(1, 2, 3), + # Please only add indices that would be used + # in FPN, otherwise some parameter will not be used + with_cp=False, + convert_weights=True, + init_cfg=dict(type='Pretrained', checkpoint=pretrained)), + neck=[ + dict( + type='FPN', + in_channels=[384, 768, 1536], + out_channels=256, + start_level=0, + add_extra_convs='on_output', + num_outs=5), + dict( + type='DyHead', + in_channels=256, + out_channels=256, + num_blocks=6, + # disable zero_init_offset to follow official implementation + zero_init_offset=False) + ], + bbox_head=dict( + type='ATSSHead', + num_classes=80, + in_channels=256, + pred_kernel_size=1, # follow DyHead official implementation + stacked_convs=0, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128], + center_offset=0.5), # follow DyHead official implementation + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=2.0), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), + # training and testing settings + train_cfg=dict( + assigner=dict(type='ATSSAssigner', topk=9), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) + +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(2000, 480), (2000, 1200)], + multiscale_mode='range', + keep_ratio=True, + backend='pillow'), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=128), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(2000, 1200), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True, backend='pillow'), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=128), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +# Use RepeatDataset to speed up training +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='RepeatDataset', + times=2, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='bbox') + +# optimizer +optimizer_config = dict(grad_clip=None) +optimizer = dict( + type='AdamW', + lr=0.00005, + betas=(0.9, 0.999), + weight_decay=0.05, + paramwise_cfg=dict( + custom_keys={ + 'absolute_pos_embed': dict(decay_mult=0.), + 'relative_position_bias_table': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.) + })) + +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[8, 11]) +runner = dict(type='EpochBasedRunner', max_epochs=12) diff --git a/configs/dyhead/metafile.yml b/configs/dyhead/metafile.yml new file mode 100644 index 0000000..3fb7370 --- /dev/null +++ b/configs/dyhead/metafile.yml @@ -0,0 +1,76 @@ +Collections: + - Name: DyHead + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 4x T4 GPUs + Architecture: + - ATSS + - DyHead + - FPN + - ResNet + - Deformable Convolution + - Pyramid Convolution + Paper: + URL: https://arxiv.org/abs/2106.08322 + Title: 'Dynamic Head: Unifying Object Detection Heads with Attentions' + README: configs/dyhead/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.22.0/mmdet/models/necks/dyhead.py#L130 + Version: v2.22.0 + +Models: + - Name: atss_r50_caffe_fpn_dyhead_1x_coco + In Collection: DyHead + Config: configs/dyhead/atss_r50_caffe_fpn_dyhead_1x_coco.py + Metadata: + Training Memory (GB): 5.4 + inference time (ms/im): + - value: 75.7 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dyhead/atss_r50_fpn_dyhead_for_reproduction_1x_coco/atss_r50_fpn_dyhead_for_reproduction_4x4_1x_coco_20220107_213939-162888e6.pth + + - Name: atss_r50_fpn_dyhead_1x_coco + In Collection: DyHead + Config: configs/dyhead/atss_r50_fpn_dyhead_1x_coco.py + Metadata: + Training Memory (GB): 4.9 + inference time (ms/im): + - value: 73.1 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dyhead/atss_r50_fpn_dyhead_4x4_1x_coco/atss_r50_fpn_dyhead_4x4_1x_coco_20211219_023314-eaa620c6.pth + + - Name: atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco + In Collection: DyHead + Config: configs/dyhead/atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco.py + Metadata: + Training Memory (GB): 58.4 + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 56.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dyhead/atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco/atss_swin-l-p4-w12_fpn_dyhead_mstrain_2x_coco_20220509_100315-bc5b6516.pth diff --git a/configs/dynamic_rcnn/README.md b/configs/dynamic_rcnn/README.md new file mode 100644 index 0000000..0045df7 --- /dev/null +++ b/configs/dynamic_rcnn/README.md @@ -0,0 +1,30 @@ +# Dynamic R-CNN + +> [Dynamic R-CNN: Towards High Quality Object Detection via Dynamic Training](https://arxiv.org/abs/2004.06002) + + + +## Abstract + +Although two-stage object detectors have continuously advanced the state-of-the-art performance in recent years, the training process itself is far from crystal. In this work, we first point out the inconsistency problem between the fixed network settings and the dynamic training procedure, which greatly affects the performance. For example, the fixed label assignment strategy and regression loss function cannot fit the distribution change of proposals and thus are harmful to training high quality detectors. Consequently, we propose Dynamic R-CNN to adjust the label assignment criteria (IoU threshold) and the shape of regression loss function (parameters of SmoothL1 Loss) automatically based on the statistics of proposals during training. This dynamic design makes better use of the training samples and pushes the detector to fit more high quality samples. Specifically, our method improves upon ResNet-50-FPN baseline with 1.9% AP and 5.5% AP90 on the MS COCO dataset with no extra overhead. + +
+ +
+ +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------: | :-----: | :-----: | :------: | :------------: | :----: | :------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | pytorch | 1x | 3.8 | | 38.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x/dynamic_rcnn_r50_fpn_1x-62a3f276.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x/dynamic_rcnn_r50_fpn_1x_20200618_095048.log.json) | + +## Citation + +```latex +@article{DynamicRCNN, + author = {Hongkai Zhang and Hong Chang and Bingpeng Ma and Naiyan Wang and Xilin Chen}, + title = {Dynamic {R-CNN}: Towards High Quality Object Detection via Dynamic Training}, + journal = {arXiv preprint arXiv:2004.06002}, + year = {2020} +} +``` diff --git a/configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py b/configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..f2deb99 --- /dev/null +++ b/configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,28 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + roi_head=dict( + type='DynamicRoIHead', + bbox_head=dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))), + train_cfg=dict( + rpn_proposal=dict(nms=dict(iou_threshold=0.85)), + rcnn=dict( + dynamic_rcnn=dict( + iou_topk=75, + beta_topk=10, + update_iter_interval=100, + initial_iou=0.4, + initial_beta=1.0))), + test_cfg=dict(rpn=dict(nms=dict(iou_threshold=0.85)))) diff --git a/configs/dynamic_rcnn/metafile.yml b/configs/dynamic_rcnn/metafile.yml new file mode 100644 index 0000000..fec43db --- /dev/null +++ b/configs/dynamic_rcnn/metafile.yml @@ -0,0 +1,35 @@ +Collections: + - Name: Dynamic R-CNN + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Dynamic R-CNN + - FPN + - RPN + - ResNet + - RoIAlign + Paper: + URL: https://arxiv.org/pdf/2004.06002 + Title: 'Dynamic R-CNN: Towards High Quality Object Detection via Dynamic Training' + README: configs/dynamic_rcnn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.2.0/mmdet/models/roi_heads/dynamic_roi_head.py#L11 + Version: v2.2.0 + +Models: + - Name: dynamic_rcnn_r50_fpn_1x_coco + In Collection: Dynamic R-CNN + Config: configs/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 3.8 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/dynamic_rcnn/dynamic_rcnn_r50_fpn_1x/dynamic_rcnn_r50_fpn_1x-62a3f276.pth diff --git a/configs/efficientnet/README.md b/configs/efficientnet/README.md new file mode 100644 index 0000000..99b0572 --- /dev/null +++ b/configs/efficientnet/README.md @@ -0,0 +1,30 @@ +# EfficientNet + +> [EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks](https://arxiv.org/abs/1905.11946v5) + + + +## Introduction + +Convolutional Neural Networks (ConvNets) are commonly developed at a fixed resource budget, and then scaled up for better accuracy if more resources are available. In this paper, we systematically study model scaling and identify that carefully balancing network depth, width, and resolution can lead to better performance. Based on this observation, we propose a new scaling method that uniformly scales all dimensions of depth/width/resolution using a simple yet highly effective compound coefficient. We demonstrate the effectiveness of this method on scaling up MobileNets and ResNet. + +To go even further, we use neural architecture search to design a new baseline network and scale it up to obtain a family of models, called EfficientNets, which achieve much better accuracy and efficiency than previous ConvNets. In particular, our EfficientNet-B7 achieves state-of-the-art 84.3% top-1 accuracy on ImageNet, while being 8.4x smaller and 6.1x faster on inference than the best existing ConvNet. Our EfficientNets also transfer well and achieve state-of-the-art accuracy on CIFAR-100 (91.7%), Flowers (98.8%), and 3 other transfer learning datasets, with an order of magnitude fewer parameters. + +## Results and Models + +### RetinaNet + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Efficientnet-b3 | pytorch | 1x | - | - | 40.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/efficientnet/retinanet_effb3_fpn_crop896_8x4_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/efficientnet/retinanet_effb3_fpn_crop896_8x4_1x_coco/retinanet_effb3_fpn_crop896_8x4_1x_coco_20220322_234806-615a0dda.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/efficientnet/retinanet_effb3_fpn_crop896_8x4_1x_coco/retinanet_effb3_fpn_crop896_8x4_1x_coco_20220322_234806.log.json) | + +## Citation + +```latex +@article{tan2019efficientnet, + title={Efficientnet: Rethinking model scaling for convolutional neural networks}, + author={Tan, Mingxing and Le, Quoc V}, + journal={arXiv preprint arXiv:1905.11946}, + year={2019} +} +``` diff --git a/configs/efficientnet/metafile.yml b/configs/efficientnet/metafile.yml new file mode 100644 index 0000000..de40b95 --- /dev/null +++ b/configs/efficientnet/metafile.yml @@ -0,0 +1,19 @@ +Models: + - Name: retinanet_effb3_fpn_crop896_8x4_1x_coco + In Collection: RetinaNet + Config: configs/efficientnet/retinanet_effb3_fpn_crop896_8x4_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/efficientnet/retinanet_effb3_fpn_crop896_8x4_1x_coco/retinanet_effb3_fpn_crop896_8x4_1x_coco_20220322_234806-615a0dda.pth + Paper: + URL: https://arxiv.org/abs/1905.11946v5 + Title: 'EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks' + README: configs/efficientnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.23.0/mmdet/models/backbones/efficientnet.py#L159 + Version: v2.23.0 diff --git a/configs/efficientnet/retinanet_effb3_fpn_crop896_8x4_1x_coco.py b/configs/efficientnet/retinanet_effb3_fpn_crop896_8x4_1x_coco.py new file mode 100644 index 0000000..39ccb37 --- /dev/null +++ b/configs/efficientnet/retinanet_effb3_fpn_crop896_8x4_1x_coco.py @@ -0,0 +1,94 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', '../_base_/default_runtime.py' +] + +# cudnn_benchmark = True +norm_cfg = dict(type='BN', requires_grad=True) +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/efficientnet/efficientnet-b3_3rdparty_8xb32-aa_in1k_20220119-5b4887a0.pth' # noqa +model = dict( + backbone=dict( + _delete_=True, + type='EfficientNet', + arch='b3', + drop_path_rate=0.2, + out_indices=(3, 4, 5), + frozen_stages=0, + norm_cfg=dict( + type='SyncBN', requires_grad=True, eps=1e-3, momentum=0.01), + norm_eval=False, + init_cfg=dict( + type='Pretrained', prefix='backbone', checkpoint=checkpoint)), + neck=dict( + in_channels=[48, 136, 384], + start_level=0, + out_channels=256, + relu_before_extra_convs=True, + no_norm_on_lateral=True, + norm_cfg=norm_cfg), + bbox_head=dict(type='RetinaSepBNHead', num_ins=5, norm_cfg=norm_cfg), + # training and testing settings + train_cfg=dict(assigner=dict(neg_iou_thr=0.5))) + +# dataset settings +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +img_size = (896, 896) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=img_size, + ratio_range=(0.8, 1.2), + keep_ratio=True), + dict(type='RandomCrop', crop_size=img_size), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=img_size), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=img_size, + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=img_size), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=4, + workers_per_gpu=4, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer_config = dict(grad_clip=None) +optimizer = dict( + type='SGD', + lr=0.04, + momentum=0.9, + weight_decay=0.0001, + paramwise_cfg=dict(norm_decay_mult=0, bypass_duplicate=True)) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=0.1, + step=[8, 11]) +# runtime settings +runner = dict(type='EpochBasedRunner', max_epochs=12) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (4 samples per GPU) +auto_scale_lr = dict(base_batch_size=32) diff --git a/configs/empirical_attention/README.md b/configs/empirical_attention/README.md new file mode 100644 index 0000000..fc2620a --- /dev/null +++ b/configs/empirical_attention/README.md @@ -0,0 +1,33 @@ +# Empirical Attention + +> [An Empirical Study of Spatial Attention Mechanisms in Deep Networks](https://arxiv.org/abs/1904.05873) + + + +## Abstract + +Attention mechanisms have become a popular component in deep neural networks, yet there has been little examination of how different influencing factors and methods for computing attention from these factors affect performance. Toward a better general understanding of attention mechanisms, we present an empirical study that ablates various spatial attention elements within a generalized attention formulation, encompassing the dominant Transformer attention as well as the prevalent deformable convolution and dynamic convolution modules. Conducted on a variety of applications, the study yields significant findings about spatial attention in deep networks, some of which run counter to conventional understanding. For example, we find that the query and key content comparison in Transformer attention is negligible for self-attention, but vital for encoder-decoder attention. A proper combination of deformable convolution with key content only saliency achieves the best accuracy-efficiency tradeoff in self-attention. Our results suggest that there exists much room for improvement in the design of attention mechanisms. + +
+ +
+ +## Results and Models + +| Backbone | Attention Component | DCN | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------: | :-----------------: | :-: | :-----: | :------: | :------------: | :----: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | 1111 | N | 1x | 8.0 | 13.8 | 40.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco/faster_rcnn_r50_fpn_attention_1111_1x_coco_20200130-403cccba.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco/faster_rcnn_r50_fpn_attention_1111_1x_coco_20200130_210344.log.json) | +| R-50 | 0010 | N | 1x | 4.2 | 18.4 | 39.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/empirical_attention/faster_rcnn_r50_fpn_attention_0010_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_0010_1x_coco/faster_rcnn_r50_fpn_attention_0010_1x_coco_20200130-7cb0c14d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_0010_1x_coco/faster_rcnn_r50_fpn_attention_0010_1x_coco_20200130_210125.log.json) | +| R-50 | 1111 | Y | 1x | 8.0 | 12.7 | 42.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco_20200130-8b2523a6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco_20200130_204442.log.json) | +| R-50 | 0010 | Y | 1x | 4.2 | 17.1 | 42.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/empirical_attention/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco_20200130-1a2e831d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco_20200130_210410.log.json) | + +## Citation + +```latex +@article{zhu2019empirical, + title={An Empirical Study of Spatial Attention Mechanisms in Deep Networks}, + author={Zhu, Xizhou and Cheng, Dazhi and Zhang, Zheng and Lin, Stephen and Dai, Jifeng}, + journal={arXiv preprint arXiv:1904.05873}, + year={2019} +} +``` diff --git a/configs/empirical_attention/faster_rcnn_r50_fpn_attention_0010_1x_coco.py b/configs/empirical_attention/faster_rcnn_r50_fpn_attention_0010_1x_coco.py new file mode 100644 index 0000000..a544e3a --- /dev/null +++ b/configs/empirical_attention/faster_rcnn_r50_fpn_attention_0010_1x_coco.py @@ -0,0 +1,13 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict(plugins=[ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + stages=(False, False, True, True), + position='after_conv2') + ])) diff --git a/configs/empirical_attention/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco.py b/configs/empirical_attention/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco.py new file mode 100644 index 0000000..bbefd27 --- /dev/null +++ b/configs/empirical_attention/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco.py @@ -0,0 +1,16 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + plugins=[ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + stages=(False, False, True, True), + position='after_conv2') + ], + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco.py b/configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco.py new file mode 100644 index 0000000..13a4645 --- /dev/null +++ b/configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco.py @@ -0,0 +1,13 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict(plugins=[ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='1111', + kv_stride=2), + stages=(False, False, True, True), + position='after_conv2') + ])) diff --git a/configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco.py b/configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco.py new file mode 100644 index 0000000..b1f26c0 --- /dev/null +++ b/configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco.py @@ -0,0 +1,16 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + plugins=[ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='1111', + kv_stride=2), + stages=(False, False, True, True), + position='after_conv2') + ], + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True))) diff --git a/configs/empirical_attention/metafile.yml b/configs/empirical_attention/metafile.yml new file mode 100644 index 0000000..923bcb2 --- /dev/null +++ b/configs/empirical_attention/metafile.yml @@ -0,0 +1,103 @@ +Collections: + - Name: Empirical Attention + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Deformable Convolution + - FPN + - RPN + - ResNet + - RoIAlign + - Spatial Attention + Paper: + URL: https://arxiv.org/pdf/1904.05873 + Title: 'An Empirical Study of Spatial Attention Mechanisms in Deep Networks' + README: configs/empirical_attention/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/ops/generalized_attention.py#L10 + Version: v2.0.0 + +Models: + - Name: faster_rcnn_r50_fpn_attention_1111_1x_coco + In Collection: Empirical Attention + Config: configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco.py + Metadata: + Training Memory (GB): 8.0 + inference time (ms/im): + - value: 72.46 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_1111_1x_coco/faster_rcnn_r50_fpn_attention_1111_1x_coco_20200130-403cccba.pth + + - Name: faster_rcnn_r50_fpn_attention_0010_1x_coco + In Collection: Empirical Attention + Config: configs/empirical_attention/faster_rcnn_r50_fpn_attention_0010_1x_coco.py + Metadata: + Training Memory (GB): 4.2 + inference time (ms/im): + - value: 54.35 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_0010_1x_coco/faster_rcnn_r50_fpn_attention_0010_1x_coco_20200130-7cb0c14d.pth + + - Name: faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco + In Collection: Empirical Attention + Config: configs/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco.py + Metadata: + Training Memory (GB): 8.0 + inference time (ms/im): + - value: 78.74 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco/faster_rcnn_r50_fpn_attention_1111_dcn_1x_coco_20200130-8b2523a6.pth + + - Name: faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco + In Collection: Empirical Attention + Config: configs/empirical_attention/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco.py + Metadata: + Training Memory (GB): 4.2 + inference time (ms/im): + - value: 58.48 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/empirical_attention/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco/faster_rcnn_r50_fpn_attention_0010_dcn_1x_coco_20200130-1a2e831d.pth diff --git a/configs/fast_rcnn/README.md b/configs/fast_rcnn/README.md new file mode 100644 index 0000000..767f76c --- /dev/null +++ b/configs/fast_rcnn/README.md @@ -0,0 +1,73 @@ +# Fast R-CNN + +> [Fast R-CNN](https://arxiv.org/abs/1504.08083) + + + +## Abstract + +This paper proposes a Fast Region-based Convolutional Network method (Fast R-CNN) for object detection. Fast R-CNN builds on previous work to efficiently classify object proposals using deep convolutional networks. Compared to previous work, Fast R-CNN employs several innovations to improve training and testing speed while also increasing detection accuracy. Fast R-CNN trains the very deep VGG16 network 9x faster than R-CNN, is 213x faster at test-time, and achieves a higher mAP on PASCAL VOC 2012. Compared to SPPnet, Fast R-CNN trains VGG16 3x faster, tests 10x faster, and is more accurate. + +
+ +
+ +## Introduction + +Before training the Fast R-CNN, users should first train an [RPN](../rpn/README.md), and use the RPN to extract the region proposals. + +- Firstly, extract the region proposals of the val set by this command as below: + +```bash +./tools/dist_test.sh \ + configs/rpn_r50_fpn_1x_coco.py \ + checkpoints/rpn_r50_fpn_1x_coco_20200218-5525fa2e.pth \ + 8 \ + --out proposals/rpn_r50_fpn_1x_val2017.pkl +``` + +- Then, change the `ann_file` and `img_prefix` of `data.test` in the RPN config to train set as below: + +```python +data = dict( + test=dict( + ann_file='data/coco/annotations/instances_train2017.json', + img_prefix='data/coco/train2017/')) +``` + +- Extract the region proposals of the train set by this command as below: + +```bash +./tools/dist_test.sh \ + configs/rpn_r50_fpn_1x_coco.py \ + checkpoints/rpn_r50_fpn_1x_coco_20200218-5525fa2e.pth \ + 8 \ + --out proposals/rpn_r50_fpn_1x_train2017.pkl +``` + +- Modify the path of `proposal_file` in Fast R-CNN config as below: + +```python +data = dict( + train=dict( + proposal_file='proposals/rpn_r50_fpn_1x_train2017.pkl'), + val=dict( + proposal_file='proposals/rpn_r50_fpn_1x_val2017.pkl'), + test=dict( + proposal_file='proposals/rpn_r50_fpn_1x_val2017.pkl')) +``` + +Finally, users can start training the Fast R-CNN. + +## Results and Models + +## Citation + +```latex +@inproceedings{girshick2015fast, + title={Fast r-cnn}, + author={Girshick, Ross}, + booktitle={Proceedings of the IEEE international conference on computer vision}, + year={2015} +} +``` diff --git a/configs/fast_rcnn/fast_rcnn_r101_caffe_fpn_1x_coco.py b/configs/fast_rcnn/fast_rcnn_r101_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..3ab8e98 --- /dev/null +++ b/configs/fast_rcnn/fast_rcnn_r101_caffe_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './fast_rcnn_r50_caffe_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) diff --git a/configs/fast_rcnn/fast_rcnn_r101_fpn_1x_coco.py b/configs/fast_rcnn/fast_rcnn_r101_fpn_1x_coco.py new file mode 100644 index 0000000..83852b2 --- /dev/null +++ b/configs/fast_rcnn/fast_rcnn_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './fast_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/fast_rcnn/fast_rcnn_r101_fpn_2x_coco.py b/configs/fast_rcnn/fast_rcnn_r101_fpn_2x_coco.py new file mode 100644 index 0000000..c220885 --- /dev/null +++ b/configs/fast_rcnn/fast_rcnn_r101_fpn_2x_coco.py @@ -0,0 +1,6 @@ +_base_ = './fast_rcnn_r50_fpn_2x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/fast_rcnn/fast_rcnn_r50_caffe_fpn_1x_coco.py b/configs/fast_rcnn/fast_rcnn_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..f1b29ef --- /dev/null +++ b/configs/fast_rcnn/fast_rcnn_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,48 @@ +_base_ = './fast_rcnn_r50_fpn_1x_coco.py' + +model = dict( + backbone=dict( + norm_cfg=dict(type='BN', requires_grad=False), + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) + +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadProposals', num_max_proposals=2000), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'proposals', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadProposals', num_max_proposals=None), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['proposals']), + dict( + type='ToDataContainer', + fields=[dict(key='proposals', stack=False)]), + dict(type='Collect', keys=['img', 'proposals']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/fast_rcnn/fast_rcnn_r50_fpn_1x_coco.py b/configs/fast_rcnn/fast_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..d2f080e --- /dev/null +++ b/configs/fast_rcnn/fast_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,52 @@ +_base_ = [ + '../_base_/models/fast_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadProposals', num_max_proposals=2000), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'proposals', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadProposals', num_max_proposals=None), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='ToTensor', keys=['proposals']), + dict( + type='ToDataContainer', + fields=[dict(key='proposals', stack=False)]), + dict(type='Collect', keys=['img', 'proposals']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + proposal_file=data_root + 'proposals/rpn_r50_fpn_1x_train2017.pkl', + pipeline=train_pipeline), + val=dict( + proposal_file=data_root + 'proposals/rpn_r50_fpn_1x_val2017.pkl', + pipeline=test_pipeline), + test=dict( + proposal_file=data_root + 'proposals/rpn_r50_fpn_1x_val2017.pkl', + pipeline=test_pipeline)) diff --git a/configs/fast_rcnn/fast_rcnn_r50_fpn_2x_coco.py b/configs/fast_rcnn/fast_rcnn_r50_fpn_2x_coco.py new file mode 100644 index 0000000..228e856 --- /dev/null +++ b/configs/fast_rcnn/fast_rcnn_r50_fpn_2x_coco.py @@ -0,0 +1,5 @@ +_base_ = './fast_rcnn_r50_fpn_1x_coco.py' + +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/faster_rcnn/README.md b/configs/faster_rcnn/README.md new file mode 100644 index 0000000..47c8ec7 --- /dev/null +++ b/configs/faster_rcnn/README.md @@ -0,0 +1,88 @@ +# Faster R-CNN + +> [Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks](https://arxiv.org/abs/1506.01497) + + + +## Abstract + +State-of-the-art object detection networks depend on region proposal algorithms to hypothesize object locations. Advances like SPPnet and Fast R-CNN have reduced the running time of these detection networks, exposing region proposal computation as a bottleneck. In this work, we introduce a Region Proposal Network (RPN) that shares full-image convolutional features with the detection network, thus enabling nearly cost-free region proposals. An RPN is a fully convolutional network that simultaneously predicts object bounds and objectness scores at each position. The RPN is trained end-to-end to generate high-quality region proposals, which are used by Fast R-CNN for detection. We further merge RPN and Fast R-CNN into a single network by sharing their convolutional features---using the recently popular terminology of neural networks with 'attention' mechanisms, the RPN component tells the unified network where to look. For the very deep VGG-16 model, our detection system has a frame rate of 5fps (including all steps) on a GPU, while achieving state-of-the-art object detection accuracy on PASCAL VOC 2007, 2012, and MS COCO datasets with only 300 proposals per image. In ILSVRC and COCO 2015 competitions, Faster R-CNN and RPN are the foundations of the 1st-place winning entries in several tracks. + +
+ +
+ +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-C4 | caffe | 1x | - | - | 35.6 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/faster_rcnn/faster_rcnn_r50_caffe_c4_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_c4_1x_coco/faster_rcnn_r50_caffe_c4_1x_coco_20220316_150152-3f885b85.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_c4_1x_coco/faster_rcnn_r50_caffe_c4_1x_coco_20220316_150152.log.json) | +| R-50-DC5 | caffe | 1x | - | - | 37.2 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_dc5_1x_coco/faster_rcnn_r50_caffe_dc5_1x_coco_20201030_151909-531f0f43.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_dc5_1x_coco/faster_rcnn_r50_caffe_dc5_1x_coco_20201030_151909.log.json) | +| R-50-FPN | caffe | 1x | 3.8 | | 37.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco/faster_rcnn_r50_caffe_fpn_1x_coco_bbox_mAP-0.378_20200504_180032-c5925ee5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco/faster_rcnn_r50_caffe_fpn_1x_coco_20200504_180032.log.json) | +| R-50-FPN | pytorch | 1x | 4.0 | 21.4 | 37.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130_204655.log.json) | +| R-50-FPN (FP16) | pytorch | 1x | 3.4 | 28.8 | 37.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_fpn_fp16_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fp16/faster_rcnn_r50_fpn_fp16_1x_coco/faster_rcnn_r50_fpn_fp16_1x_coco_20200204-d4dc1471.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fp16/faster_rcnn_r50_fpn_fp16_1x_coco/faster_rcnn_r50_fpn_fp16_1x_coco_20200204_143530.log.json) | +| R-50-FPN | pytorch | 2x | - | - | 38.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_2x_coco/faster_rcnn_r50_fpn_2x_coco_bbox_mAP-0.384_20200504_210434-a5d8aa15.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_2x_coco/faster_rcnn_r50_fpn_2x_coco_20200504_210434.log.json) | +| R-101-FPN | caffe | 1x | 5.7 | | 39.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r101_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_caffe_fpn_1x_coco/faster_rcnn_r101_caffe_fpn_1x_coco_bbox_mAP-0.398_20200504_180057-b269e9dd.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_caffe_fpn_1x_coco/faster_rcnn_r101_caffe_fpn_1x_coco_20200504_180057.log.json) | +| R-101-FPN | pytorch | 1x | 6.0 | 15.6 | 39.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_fpn_1x_coco/faster_rcnn_r101_fpn_1x_coco_20200130-f513f705.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_fpn_1x_coco/faster_rcnn_r101_fpn_1x_coco_20200130_204655.log.json) | +| R-101-FPN | pytorch | 2x | - | - | 39.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r101_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_fpn_2x_coco/faster_rcnn_r101_fpn_2x_coco_bbox_mAP-0.398_20200504_210455-1d2dac9c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_fpn_2x_coco/faster_rcnn_r101_fpn_2x_coco_20200504_210455.log.json) | +| X-101-32x4d-FPN | pytorch | 1x | 7.2 | 13.8 | 41.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x4d_fpn_1x_coco/faster_rcnn_x101_32x4d_fpn_1x_coco_20200203-cff10310.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x4d_fpn_1x_coco/faster_rcnn_x101_32x4d_fpn_1x_coco_20200203_000520.log.json) | +| X-101-32x4d-FPN | pytorch | 2x | - | - | 41.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x4d_fpn_2x_coco/faster_rcnn_x101_32x4d_fpn_2x_coco_bbox_mAP-0.412_20200506_041400-64a12c0b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x4d_fpn_2x_coco/faster_rcnn_x101_32x4d_fpn_2x_coco_20200506_041400.log.json) | +| X-101-64x4d-FPN | pytorch | 1x | 10.3 | 9.4 | 42.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_64x4d_fpn_1x_coco/faster_rcnn_x101_64x4d_fpn_1x_coco_20200204-833ee192.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_64x4d_fpn_1x_coco/faster_rcnn_x101_64x4d_fpn_1x_coco_20200204_134340.log.json) | +| X-101-64x4d-FPN | pytorch | 2x | - | - | 41.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_64x4d_fpn_2x_coco/faster_rcnn_x101_64x4d_fpn_2x_coco_20200512_161033-5961fa95.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_64x4d_fpn_2x_coco/faster_rcnn_x101_64x4d_fpn_2x_coco_20200512_161033.log.json) | + +## Different regression loss + +We trained with R-50-FPN pytorch style backbone for 1x schedule. + +| Backbone | Loss type | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------: | :------------: | :------: | :------------: | :----: | :----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | L1Loss | 4.0 | 21.4 | 37.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130_204655.log.json) | +| R-50-FPN | IoULoss | | | 37.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_fpn_iou_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_iou_1x_coco/faster_rcnn_r50_fpn_iou_1x_coco_20200506_095954-938e81f0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_iou_1x_coco/faster_rcnn_r50_fpn_iou_1x_coco_20200506_095954.log.json) | +| R-50-FPN | GIoULoss | | | 37.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_fpn_giou_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_giou_1x_coco-0eada910.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_giou_1x_coco_20200505_161120.log.json) | +| R-50-FPN | BoundedIoULoss | | | 37.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_fpn_bounded_iou_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_bounded_iou_1x_coco-98ad993b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_bounded_iou_1x_coco_20200505_160738.log.json) | + +## Pre-trained Models + +We also train some models with longer schedules and multi-scale training. The users could finetune them for downstream tasks. + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :----------------------------------------------------------------: | :-----: | :-----: | :------: | :------------: | :----: | :-------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| [R-50-C4](./faster_rcnn_r50_caffe_c4_mstrain_1x_coco.py) | caffe | 1x | - | | 35.9 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/faster_rcnn/faster_rcnn_r50_caffe_c4_mstrain_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_c4_mstrain_1x_coco/faster_rcnn_r50_caffe_c4_mstrain_1x_coco_20220316_150527-db276fed.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_c4_mstrain_1x_coco/faster_rcnn_r50_caffe_c4_mstrain_1x_coco_20220316_150527.log.json) | +| [R-50-DC5](./faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py) | caffe | 1x | - | | 37.4 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco_20201028_233851-b33d21b9.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco_20201028_233851.log.json) | +| [R-50-DC5](./faster_rcnn_r50_caffe_dc5_mstrain_3x_coco.py) | caffe | 3x | - | | 38.7 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco_20201028_002107-34a53b2c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco_20201028_002107.log.json) | +| [R-50-FPN](./faster_rcnn_r50_caffe_fpn_mstrain_2x_coco.py) | caffe | 2x | 3.7 | | 39.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco_bbox_mAP-0.397_20200504_231813-10b2de58.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco_20200504_231813.log.json) | +| [R-50-FPN](./faster_rcnn_r50_caffe_fpn_mstrain_3x_coco.py) | caffe | 3x | 3.7 | | 39.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210526_095054-1f77628b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210526_095054.log.json) | +| [R-50-FPN](./faster_rcnn_r50_fpn_mstrain_3x_coco.py) | pytorch | 3x | 3.9 | | 40.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_mstrain_3x_coco/faster_rcnn_r50_fpn_mstrain_3x_coco_20210524_110822-e10bd31c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_mstrain_3x_coco/faster_rcnn_r50_fpn_mstrain_3x_coco_20210524_110822.log.json) | +| [R-101-FPN](./faster_rcnn_r101_caffe_fpn_mstrain_3x_coco.py) | caffe | 3x | 5.6 | | 42.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco_20210526_095742-a7ae426d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco_20210526_095742.log.json) | +| [R-101-FPN](./faster_rcnn_r101_fpn_mstrain_3x_coco.py) | pytorch | 3x | 5.8 | | 41.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r101_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_fpn_mstrain_3x_coco/faster_rcnn_r101_fpn_mstrain_3x_coco_20210524_110822-4d4d2ca8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_fpn_mstrain_3x_coco/faster_rcnn_r101_fpn_mstrain_3x_coco_20210524_110822.log.json) | +| [X-101-32x4d-FPN](./faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py) | pytorch | 3x | 7.0 | | 42.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco_20210524_124151-16b9b260.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco_20210524_124151.log.json) | +| [X-101-32x8d-FPN](./faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py) | pytorch | 3x | 10.1 | | 42.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco_20210604_182954-002e082a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco_20210604_182954.log.json) | +| [X-101-64x4d-FPN](./faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py) | pytorch | 3x | 10.0 | | 43.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco_20210524_124528-26c63de6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco_20210524_124528.log.json) | + +We further finetune some pre-trained models on the COCO subsets, which only contain only a few of the 80 categories. + +| Backbone | Style | Class name | Pre-traind model | Mem (GB) | box AP | Config | Download | +| ----------------------------------------------------------------------------- | ----- | ------------------ | ------------------------------------------------------------------- | -------- | ------ | --------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [R-50-FPN](./faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-person.py) | caffe | person | [R-50-FPN-Caffe-3x](./faster_rcnn_r50_caffe_fpn_mstrain_3x_coco.py) | 3.7 | 55.8 | [config](./faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-person.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco-person/faster_rcnn_r50_fpn_1x_coco-person_20201216_175929-d022e227.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco-person/faster_rcnn_r50_fpn_1x_coco-person_20201216_175929.log.json) | +| [R-50-FPN](./faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-person-bicycle-car.py) | caffe | person-bicycle-car | [R-50-FPN-Caffe-3x](./faster_rcnn_r50_caffe_fpn_mstrain_3x_coco.py) | 3.7 | 44.1 | [config](./faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-person-bicycle-car.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco-person-bicycle-car/faster_rcnn_r50_fpn_1x_coco-person-bicycle-car_20201216_173117-6eda6d92.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco-person-bicycle-car/faster_rcnn_r50_fpn_1x_coco-person-bicycle-car_20201216_173117.log.json) | + +## Torchvision New Receipe (TNR) + +Torchvision released its high-precision ResNet models. The training details can be found on the [Pytorch website](https://pytorch.org/blog/how-to-train-state-of-the-art-models-using-torchvision-latest-primitives/). Here, we have done grid searches on learning rate and weight decay and found the optimal hyper-parameter on the detection task. + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :-------------------------------------------------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| [R-50-TNR](./faster_rcnn_r50_fpn_tnr-pretrain_1x_coco.py) | pytorch | 1x | - | | 40.2 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/faster_rcnn/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco_20220320_085147-efedfda4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco_20220320_085147.log.json) | + +## Citation + +```latex +@article{Ren_2017, + title={Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks}, + journal={IEEE Transactions on Pattern Analysis and Machine Intelligence}, + publisher={Institute of Electrical and Electronics Engineers (IEEE)}, + author={Ren, Shaoqing and He, Kaiming and Girshick, Ross and Sun, Jian}, + year={2017}, + month={Jun}, +} +``` diff --git a/configs/faster_rcnn/faster_rcnn_quant_general.py b/configs/faster_rcnn/faster_rcnn_quant_general.py new file mode 100644 index 0000000..b2b3af6 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_quant_general.py @@ -0,0 +1,56 @@ +trace_config = dict( + model_general_architecture = 'FasterRCNN', + backbone_detail = dict( + input_concrete_args = dict(), + preserve_attr = ['arch_settings', 'avg_down', 'base_channels', 'conv_cfg', 'dcn', 'deep_stem', 'depth', 'dump_patches', 'feat_dim' + , 'frozen_stages', 'init_cfg', 'inplanes', 'is_init', 'norm_cfg', 'norm_eval', 'out_indices' + , 'plugins', 'res_layers', 'stage_block', 'stage_with_dcn', 'stem_channels', 'zero_init_residual', 'strides', 'with_cp', 'make_res_layer', 'make_stage_plugins'], + not_duplicated_prefixes = [], + further_detail = dict( + exclude_prefixes = [], + removed_quantizer_names = [], + specified_general_quantizers = [], + last_8bit_module = [] + )), + neck_detail = dict( + input_concrete_args = dict(in_num = 4), + preserve_attr = ['add_extra_convs', 'backbone_end_level', 'dump_patches', 'end_level', 'fp16_enabled' + , 'in_channels', 'init_cfg', 'is_init', 'l2_norm', 'no_norm_on_lateral', 'num_ins', 'num_outs', 'out_channels' + , 'relu_before_extra_convs', 'start_level', 'upsample_cfg'], + not_duplicated_prefixes = [], + further_detail = dict( + exclude_prefixes = [], + removed_quantizer_names = [], + specified_general_quantizers = ['getitem_post_act_fake_quantizer', 'getitem_1_post_act_fake_quantizer', 'getitem_2_post_act_fake_quantizer', 'getitem_3_post_act_fake_quantizer'], + last_8bit_module = [] + )), + rpn_head_detail = dict( + input_concrete_args = dict(in_num = 5), + preserve_attr = ['anchor_generator', 'assigner', 'bbox_coder', 'cls_out_channels', 'conv_cfg', 'dump_patches', 'feat_channels', 'fp16_enabled', + 'in_channels', 'init_cfg', 'is_init', 'norm_cfg', 'loss_bbox', 'loss_cls', 'num_anchors' + , 'num_base_priors', 'num_classes', 'num_convs', 'prior_generator', 'reg_decoded_bbox', 'sampler', 'sampling', 'stacked_convs', 'test_cfg', 'train_cfg', 'use_sigmoid_cls' + + , 'simple_test', 'async_simple_test_rpn', 'aug_test', 'aug_test_bboxes', 'aug_test_rpn', 'forward_single', 'forward_train', 'get_anchors', 'get_bboxes', 'get_targets', 'loss', 'loss_single', 'merge_aug_bboxes', + 'simple_test_bboxes', 'simple_test_rpn', '_get_bboxes_single', '_bbox_post_process', 'get_anchors', '_get_targets_single'], + not_duplicated_prefixes = ['rpn_conv', 'rpn_cls', 'rpn_reg'], # 避免共享头被复制、独立化 + further_detail = dict( + exclude_prefixes = [], + removed_quantizer_names = [], + specified_general_quantizers = [], + last_8bit_module = [] + )), + roi_head_bbox_head_detail = dict( + input_concrete_args = dict(dim_setting = 2), + preserve_attr = ['bbox_coder', 'cls_last_dim', 'cls_predictor_cfg', 'conv_cfg', 'conv_out_channels', 'custom_accuracy', 'custom_activation', 'custom_cls_channels' + , 'debug_imgs', 'dump_patches', 'fc_out_channels', 'fp16_enabled', 'in_channels', 'init_cfg', 'is_init', 'loss_bbox', 'loss_cls', 'norm_cfg', 'num_classes', 'num_cls_convs', 'num_cls_fcs', 'num_reg_convs', 'num_reg_fcs' + , 'num_shared_convs', 'num_shared_fcs', 'reg_class_agnostic', 'reg_decoded_bbox', 'reg_last_dim', 'reg_predictor_cfg', 'roi_feat_size', 'share_out_channels', 'with_avg_pool', 'with_cls', 'with_reg' + , 'get_bboxes', 'get_targets', 'loss', 'refine_bboxes', 'regress_by_class', '_get_bboxes_single', '_bbox_post_process', 'get_anchors', '_get_targets_single'], + not_duplicated_prefixes = ['cls_convs', 'reg_convs', 'retina_cls', 'retina_reg'], # 避免共享头被复制、独立化 + further_detail = dict( + exclude_prefixes = [], + removed_quantizer_names = [], + qloss_flag = True, + specified_general_quantizers = [], + last_8bit_module = [] 哦草,这里没写 + )) + ) \ No newline at end of file diff --git a/configs/faster_rcnn/faster_rcnn_r101_caffe_fpn_1x_coco.py b/configs/faster_rcnn/faster_rcnn_r101_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..c6f078c --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r101_caffe_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './faster_rcnn_r50_caffe_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) diff --git a/configs/faster_rcnn/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco.py b/configs/faster_rcnn/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..6a13fe9 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco.py @@ -0,0 +1,49 @@ +_base_ = 'faster_rcnn_r50_fpn_mstrain_3x_coco.py' + +model = dict( + backbone=dict( + depth=101, + norm_cfg=dict(requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) + +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + train=dict(dataset=dict(pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/faster_rcnn/faster_rcnn_r101_fpn_1x_coco.py b/configs/faster_rcnn/faster_rcnn_r101_fpn_1x_coco.py new file mode 100644 index 0000000..1de53a6 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/faster_rcnn/faster_rcnn_r101_fpn_2x_coco.py b/configs/faster_rcnn/faster_rcnn_r101_fpn_2x_coco.py new file mode 100644 index 0000000..0d41599 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r101_fpn_2x_coco.py @@ -0,0 +1,6 @@ +_base_ = './faster_rcnn_r50_fpn_2x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/faster_rcnn/faster_rcnn_r101_fpn_mstrain_3x_coco.py b/configs/faster_rcnn/faster_rcnn_r101_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..0b498bb --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r101_fpn_mstrain_3x_coco.py @@ -0,0 +1,7 @@ +_base_ = 'faster_rcnn_r50_fpn_mstrain_3x_coco.py' + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/faster_rcnn/faster_rcnn_r18_fpn_1x_coco.py b/configs/faster_rcnn/faster_rcnn_r18_fpn_1x_coco.py new file mode 100644 index 0000000..b19bbe2 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r18_fpn_1x_coco.py @@ -0,0 +1,18 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +# optimizer +model = dict( + backbone=dict( + depth=18, + init_cfg=dict(type='Pretrained', checkpoint='../long_used_pretrained/resnet18-5c106cde.pth')), + neck=dict(in_channels=[64, 128, 256, 512])) +evaluation = dict(save_best='auto', interval=1, metric='bbox') +checkpoint_config = dict(interval=10) +data = dict( + samples_per_gpu=16, # 就是8 + workers_per_gpu=8, # 就是8 +) diff --git a/configs/faster_rcnn/faster_rcnn_r18_fpn_1x_coco_quant_w4a4.py b/configs/faster_rcnn/faster_rcnn_r18_fpn_1x_coco_quant_w4a4.py new file mode 100644 index 0000000..00e1fe9 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r18_fpn_1x_coco_quant_w4a4.py @@ -0,0 +1,19 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn_no_freeze.py', + '../_base_/datasets/coco_detection.py', '../_base_/schedules/schedule_qat_w4a4.py', + 'faster_rcnn_quant_general.py', '../_base_/default_runtime.py' +] + +# optimizer +model = dict( + backbone=dict( + depth=18, + init_cfg=dict(type='Pretrained', checkpoint='/workspace/whole_world/rdata/share/pretrained/checkpoints/resnet18-5c106cde.pth')), + neck=dict(in_channels=[64, 128, 256, 512])) +evaluation = dict(save_best='auto', interval=1, metric='bbox') +checkpoint_config = dict(interval=10) +data = dict( + samples_per_gpu=4, # 就是8 + workers_per_gpu=4, # 就是8 +) +# 确实没有预训练模型,得自己训 diff --git a/configs/faster_rcnn/faster_rcnn_r18_fpn_1x_voc.py b/configs/faster_rcnn/faster_rcnn_r18_fpn_1x_voc.py new file mode 100644 index 0000000..cac5d8c --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r18_fpn_1x_voc.py @@ -0,0 +1,23 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/voc0712.py', '../_base_/schedules/schedule_1x_voc_general.py', + '../_base_/default_runtime.py' +] + +# optimizer +model = dict( + backbone=dict( + depth=18, + init_cfg=dict(type='Pretrained', checkpoint='../long_used_pretrained/resnet18-5c106cde.pth')), + neck=dict(in_channels=[64, 128, 256, 512]), + roi_head=dict( + bbox_head=dict( + num_classes=20))) +evaluation = dict(save_best='auto', interval=1, metric='bbox') +checkpoint_config = dict(interval=10) + + +data = dict( + samples_per_gpu=16, + workers_per_gpu=8) + diff --git a/configs/faster_rcnn/faster_rcnn_r18_fpn_1x_voc_quant_w4a4.py b/configs/faster_rcnn/faster_rcnn_r18_fpn_1x_voc_quant_w4a4.py new file mode 100644 index 0000000..3cc6a69 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r18_fpn_1x_voc_quant_w4a4.py @@ -0,0 +1,24 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn_no_freeze.py', + '../_base_/datasets/voc0712.py', '../_base_/schedules/schedule_qat_w4a4.py', + 'faster_rcnn_quant_general.py', '../_base_/default_runtime.py' +] + +# optimizer +model = dict( + backbone=dict( + depth=18, + init_cfg=dict(type='Pretrained', checkpoint='../long_used_pretrained/resnet18-5c106cde.pth')), + neck=dict(in_channels=[64, 128, 256, 512]), + roi_head=dict( + bbox_head=dict( + num_classes=20))) +evaluation = dict(save_best='auto', interval=1, metric='bbox') +checkpoint_config = dict(interval=10) + +# dataset settings +data = dict( + samples_per_gpu=16, + workers_per_gpu=8) + +# load_from = '../long_used_pretrained/retinanet_r18_fpn_1x_coco_20220407_171055-614fd399.pth' diff --git a/configs/faster_rcnn/faster_rcnn_r50_caffe_c4_1x_coco.py b/configs/faster_rcnn/faster_rcnn_r50_caffe_c4_1x_coco.py new file mode 100644 index 0000000..b071962 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_caffe_c4_1x_coco.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_caffe_c4.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) diff --git a/configs/faster_rcnn/faster_rcnn_r50_caffe_c4_mstrain_1x_coco.py b/configs/faster_rcnn/faster_rcnn_r50_caffe_c4_mstrain_1x_coco.py new file mode 100644 index 0000000..f4d83e6 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_caffe_c4_mstrain_1x_coco.py @@ -0,0 +1,38 @@ +_base_ = './faster_rcnn_r50_caffe_c4_1x_coco.py' +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_1x_coco.py b/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_1x_coco.py new file mode 100644 index 0000000..ee2010c --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_1x_coco.py @@ -0,0 +1,37 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_caffe_dc5.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py b/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py new file mode 100644 index 0000000..14eaef2 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py @@ -0,0 +1,42 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_caffe_dc5.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco.py b/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco.py new file mode 100644 index 0000000..403747f --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco.py @@ -0,0 +1,4 @@ +_base_ = './faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py' +# learning policy +lr_config = dict(step=[28, 34]) +runner = dict(type='EpochBasedRunner', max_epochs=36) diff --git a/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py b/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..56c01bd --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,41 @@ +_base_ = './faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_90k_coco.py b/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_90k_coco.py new file mode 100644 index 0000000..b5aea6a --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_90k_coco.py @@ -0,0 +1,15 @@ +_base_ = 'faster_rcnn_r50_caffe_fpn_1x_coco.py' + +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[60000, 80000]) + +# Runner type +runner = dict(_delete_=True, type='IterBasedRunner', max_iters=90000) + +checkpoint_config = dict(interval=10000) +evaluation = dict(interval=10000, metric='bbox') diff --git a/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-person-bicycle-car.py b/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-person-bicycle-car.py new file mode 100644 index 0000000..4f1f376 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-person-bicycle-car.py @@ -0,0 +1,9 @@ +_base_ = './faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py' +model = dict(roi_head=dict(bbox_head=dict(num_classes=3))) +classes = ('person', 'bicycle', 'car') +data = dict( + train=dict(classes=classes), + val=dict(classes=classes), + test=dict(classes=classes)) + +load_from = 'https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco_bbox_mAP-0.398_20200504_163323-30042637.pth' # noqa diff --git a/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-person.py b/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-person.py new file mode 100644 index 0000000..b5dfb4f --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-person.py @@ -0,0 +1,9 @@ +_base_ = './faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py' +model = dict(roi_head=dict(bbox_head=dict(num_classes=1))) +classes = ('person', ) +data = dict( + train=dict(classes=classes), + val=dict(classes=classes), + test=dict(classes=classes)) + +load_from = 'https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco_bbox_mAP-0.398_20200504_163323-30042637.pth' # noqa diff --git a/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py b/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py new file mode 100644 index 0000000..f807a19 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py @@ -0,0 +1,46 @@ +_base_ = './faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco.py b/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco.py new file mode 100644 index 0000000..df58973 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 23]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco.py b/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..9eeaace --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco.py @@ -0,0 +1,47 @@ +_base_ = 'faster_rcnn_r50_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) + +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + train=dict(dataset=dict(pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_90k_coco.py b/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_90k_coco.py new file mode 100644 index 0000000..74dca24 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_90k_coco.py @@ -0,0 +1,15 @@ +_base_ = 'faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py' + +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[60000, 80000]) + +# Runner type +runner = dict(_delete_=True, type='IterBasedRunner', max_iters=90000) + +checkpoint_config = dict(interval=10000) +evaluation = dict(interval=10000, metric='bbox') diff --git a/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py b/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..009bd93 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] diff --git a/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco_quant_w4a4.py b/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco_quant_w4a4.py new file mode 100644 index 0000000..75d5bcc --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco_quant_w4a4.py @@ -0,0 +1,18 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn_no_freeze.py', + '../_base_/datasets/coco_detection.py', '../_base_/schedules/schedule_qat_w4a4.py', + 'faster_rcnn_quant_general.py', '../_base_/default_runtime.py' +] + +# optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +evaluation = dict(save_best='auto', interval=1, metric='bbox') +checkpoint_config = dict(interval=10) +data = dict( + samples_per_gpu=16, # 就是8 + workers_per_gpu=8, # 就是8 +) + +load_from = '../long_used_pretrained/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth' + + + diff --git a/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_voc.py b/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_voc.py new file mode 100644 index 0000000..9a9ee6d --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_voc.py @@ -0,0 +1,16 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/voc0712.py', '../_base_/schedules/schedule_1x_voc_general.py', + '../_base_/default_runtime.py' +] +evaluation = dict(save_best='auto', interval=1, metric='bbox') +checkpoint_config = dict(interval=10) + +model = dict( + roi_head=dict( + bbox_head=dict( + num_classes=20))) +# dataset settings +data = dict( + samples_per_gpu=16, + workers_per_gpu=8) diff --git a/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_voc_quant_w4a4.py b/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_voc_quant_w4a4.py new file mode 100644 index 0000000..5bf2a3c --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_voc_quant_w4a4.py @@ -0,0 +1,18 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn_no_freeze.py', + '../_base_/datasets/voc0712.py', '../_base_/schedules/schedule_qat_w4a4.py', + 'faster_rcnn_quant_general.py', '../_base_/default_runtime.py' +] +evaluation = dict(save_best='auto', interval=1, metric='bbox') +checkpoint_config = dict(interval=10) + +model = dict( + roi_head=dict( + bbox_head=dict( + num_classes=20))) + +# dataset settings +data = dict( + samples_per_gpu=8, + workers_per_gpu=4) +# load_from = '../long_used_pretrained/retinanet_r50_fpn_2x_coco_20200131-fdb43119.pth' diff --git a/configs/faster_rcnn/faster_rcnn_r50_fpn_2x_coco.py b/configs/faster_rcnn/faster_rcnn_r50_fpn_2x_coco.py new file mode 100644 index 0000000..e77a7fa --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_fpn_2x_coco.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_2x.py', '../_base_/default_runtime.py' +] diff --git a/configs/faster_rcnn/faster_rcnn_r50_fpn_bounded_iou_1x_coco.py b/configs/faster_rcnn/faster_rcnn_r50_fpn_bounded_iou_1x_coco.py new file mode 100644 index 0000000..648081f --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_fpn_bounded_iou_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + roi_head=dict( + bbox_head=dict( + reg_decoded_bbox=True, + loss_bbox=dict(type='BoundedIoULoss', loss_weight=10.0)))) diff --git a/configs/faster_rcnn/faster_rcnn_r50_fpn_ciou_1x_coco.py b/configs/faster_rcnn/faster_rcnn_r50_fpn_ciou_1x_coco.py new file mode 100644 index 0000000..886d566 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_fpn_ciou_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + roi_head=dict( + bbox_head=dict( + reg_decoded_bbox=True, + loss_bbox=dict(type='CIoULoss', loss_weight=12.0)))) diff --git a/configs/faster_rcnn/faster_rcnn_r50_fpn_fp16_1x_coco.py b/configs/faster_rcnn/faster_rcnn_r50_fpn_fp16_1x_coco.py new file mode 100644 index 0000000..acd4040 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_fpn_fp16_1x_coco.py @@ -0,0 +1,3 @@ +_base_ = './faster_rcnn_r50_fpn_1x_coco.py' +# fp16 settings +fp16 = dict(loss_scale=512.) diff --git a/configs/faster_rcnn/faster_rcnn_r50_fpn_giou_1x_coco.py b/configs/faster_rcnn/faster_rcnn_r50_fpn_giou_1x_coco.py new file mode 100644 index 0000000..5556c49 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_fpn_giou_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + roi_head=dict( + bbox_head=dict( + reg_decoded_bbox=True, + loss_bbox=dict(type='GIoULoss', loss_weight=10.0)))) diff --git a/configs/faster_rcnn/faster_rcnn_r50_fpn_iou_1x_coco.py b/configs/faster_rcnn/faster_rcnn_r50_fpn_iou_1x_coco.py new file mode 100644 index 0000000..ddf663e --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_fpn_iou_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + roi_head=dict( + bbox_head=dict( + reg_decoded_bbox=True, + loss_bbox=dict(type='IoULoss', loss_weight=10.0)))) diff --git a/configs/faster_rcnn/faster_rcnn_r50_fpn_mstrain_3x_coco.py b/configs/faster_rcnn/faster_rcnn_r50_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..faf8f92 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_fpn_mstrain_3x_coco.py @@ -0,0 +1,3 @@ +_base_ = [ + '../common/mstrain_3x_coco.py', '../_base_/models/faster_rcnn_r50_fpn.py' +] diff --git a/configs/faster_rcnn/faster_rcnn_r50_fpn_ohem_1x_coco.py b/configs/faster_rcnn/faster_rcnn_r50_fpn_ohem_1x_coco.py new file mode 100644 index 0000000..f897e7c --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_fpn_ohem_1x_coco.py @@ -0,0 +1,2 @@ +_base_ = './faster_rcnn_r50_fpn_1x_coco.py' +model = dict(train_cfg=dict(rcnn=dict(sampler=dict(type='OHEMSampler')))) diff --git a/configs/faster_rcnn/faster_rcnn_r50_fpn_soft_nms_1x_coco.py b/configs/faster_rcnn/faster_rcnn_r50_fpn_soft_nms_1x_coco.py new file mode 100644 index 0000000..759ae3a --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_fpn_soft_nms_1x_coco.py @@ -0,0 +1,12 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + test_cfg=dict( + rcnn=dict( + score_thr=0.05, + nms=dict(type='soft_nms', iou_threshold=0.5), + max_per_img=100))) diff --git a/configs/faster_rcnn/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco.py b/configs/faster_rcnn/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco.py new file mode 100644 index 0000000..ecbfb92 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco.py @@ -0,0 +1,17 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +checkpoint = 'https://download.pytorch.org/models/resnet50-11ad3fa6.pth' +model = dict( + backbone=dict(init_cfg=dict(type='Pretrained', checkpoint=checkpoint))) + +# `lr` and `weight_decay` have been searched to be optimal. +optimizer = dict( + _delete_=True, + type='AdamW', + lr=0.0001, + weight_decay=0.1, + paramwise_cfg=dict(norm_decay_mult=0., bypass_duplicate=True)) diff --git a/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_1x_coco.py b/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..3808c9f --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_2x_coco.py b/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_2x_coco.py new file mode 100644 index 0000000..e93f5d8 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_2x_coco.py @@ -0,0 +1,14 @@ +_base_ = './faster_rcnn_r50_fpn_2x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py b/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..f55985d --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py @@ -0,0 +1,16 @@ +_base_ = [ + '../common/mstrain_3x_coco.py', '../_base_/models/faster_rcnn_r50_fpn.py' +] +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/faster_rcnn/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py b/configs/faster_rcnn/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..a5d5aeb --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py @@ -0,0 +1,62 @@ +_base_ = [ + '../common/mstrain_3x_coco.py', '../_base_/models/faster_rcnn_r50_fpn.py' +] +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=8, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + style='pytorch', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnext101_32x8d'))) + +# ResNeXt-101-32x8d model trained with Caffe2 at FB, +# so the mean and std need to be changed. +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], + std=[57.375, 57.120, 58.395], + to_rgb=False) + +# In mstrain 3x config, img_scale=[(1333, 640), (1333, 800)], +# multiscale_mode='range' +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +# Use RepeatDataset to speed up training +data = dict( + train=dict(dataset=dict(pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_1x_coco.py b/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..8bf2b65 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_2x_coco.py b/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_2x_coco.py new file mode 100644 index 0000000..7ea9b2d --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_2x_coco.py @@ -0,0 +1,14 @@ +_base_ = './faster_rcnn_r50_fpn_2x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py b/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..80397f4 --- /dev/null +++ b/configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py @@ -0,0 +1,16 @@ +_base_ = [ + '../common/mstrain_3x_coco.py', '../_base_/models/faster_rcnn_r50_fpn.py' +] +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/faster_rcnn/metafile.yml b/configs/faster_rcnn/metafile.yml new file mode 100644 index 0000000..3011b15 --- /dev/null +++ b/configs/faster_rcnn/metafile.yml @@ -0,0 +1,452 @@ +Collections: + - Name: Faster R-CNN + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - RPN + - ResNet + - RoIPool + Paper: + URL: https://arxiv.org/abs/1506.01497 + Title: "Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks" + README: configs/faster_rcnn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/detectors/faster_rcnn.py#L6 + Version: v2.0.0 + +Models: + - Name: faster_rcnn_r50_caffe_c4_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_caffe_c4_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 35.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_c4_1x_coco/faster_rcnn_r50_caffe_c4_1x_coco_20220316_150152-3f885b85.pth + + - Name: faster_rcnn_r50_caffe_c4_mstrain_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_caffe_c4_mstrain_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 35.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_c4_mstrain_1x_coco/faster_rcnn_r50_caffe_c4_mstrain_1x_coco_20220316_150527-db276fed.pth + + - Name: faster_rcnn_r50_caffe_dc5_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_dc5_1x_coco/faster_rcnn_r50_caffe_dc5_1x_coco_20201030_151909-531f0f43.pth + + - Name: faster_rcnn_r50_caffe_fpn_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 3.8 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco/faster_rcnn_r50_caffe_fpn_1x_coco_bbox_mAP-0.378_20200504_180032-c5925ee5.pth + + - Name: faster_rcnn_r50_fpn_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.0 + inference time (ms/im): + - value: 46.73 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth + + - Name: faster_rcnn_r50_fpn_fp16_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_fpn_fp16_1x_coco.py + Metadata: + Training Memory (GB): 3.4 + Training Techniques: + - SGD with Momentum + - Weight Decay + - Mixed Precision Training + inference time (ms/im): + - value: 34.72 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP16 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fp16/faster_rcnn_r50_fpn_fp16_1x_coco/faster_rcnn_r50_fpn_fp16_1x_coco_20200204-d4dc1471.pth + + - Name: faster_rcnn_r50_fpn_2x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_fpn_2x_coco.py + Metadata: + Training Memory (GB): 4.0 + inference time (ms/im): + - value: 46.73 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_2x_coco/faster_rcnn_r50_fpn_2x_coco_bbox_mAP-0.384_20200504_210434-a5d8aa15.pth + + - Name: faster_rcnn_r101_caffe_fpn_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r101_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 5.7 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_caffe_fpn_1x_coco/faster_rcnn_r101_caffe_fpn_1x_coco_bbox_mAP-0.398_20200504_180057-b269e9dd.pth + + - Name: faster_rcnn_r101_fpn_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.0 + inference time (ms/im): + - value: 64.1 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_fpn_1x_coco/faster_rcnn_r101_fpn_1x_coco_20200130-f513f705.pth + + - Name: faster_rcnn_r101_fpn_2x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r101_fpn_2x_coco.py + Metadata: + Training Memory (GB): 6.0 + inference time (ms/im): + - value: 64.1 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_fpn_2x_coco/faster_rcnn_r101_fpn_2x_coco_bbox_mAP-0.398_20200504_210455-1d2dac9c.pth + + - Name: faster_rcnn_x101_32x4d_fpn_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.2 + inference time (ms/im): + - value: 72.46 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x4d_fpn_1x_coco/faster_rcnn_x101_32x4d_fpn_1x_coco_20200203-cff10310.pth + + - Name: faster_rcnn_x101_32x4d_fpn_2x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_2x_coco.py + Metadata: + Training Memory (GB): 7.2 + inference time (ms/im): + - value: 72.46 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x4d_fpn_2x_coco/faster_rcnn_x101_32x4d_fpn_2x_coco_bbox_mAP-0.412_20200506_041400-64a12c0b.pth + + - Name: faster_rcnn_x101_64x4d_fpn_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 10.3 + inference time (ms/im): + - value: 106.38 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_64x4d_fpn_1x_coco/faster_rcnn_x101_64x4d_fpn_1x_coco_20200204-833ee192.pth + + - Name: faster_rcnn_x101_64x4d_fpn_2x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_2x_coco.py + Metadata: + Training Memory (GB): 10.3 + inference time (ms/im): + - value: 106.38 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_64x4d_fpn_2x_coco/faster_rcnn_x101_64x4d_fpn_2x_coco_20200512_161033-5961fa95.pth + + - Name: faster_rcnn_r50_fpn_iou_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_fpn_iou_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.9 + # re-release + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_iou_1x_coco/faster_rcnn_r50_fpn_iou_1x_coco_20200506_095954-938e81f0.pth + + - Name: faster_rcnn_r50_fpn_giou_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_fpn_giou_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_giou_1x_coco-0eada910.pth + + - Name: faster_rcnn_r50_fpn_bounded_iou_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_fpn_bounded_iou_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_bounded_iou_1x_coco-98ad993b.pth + + - Name: faster_rcnn_r50_caffe_dc5_mstrain_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco/faster_rcnn_r50_caffe_dc5_mstrain_1x_coco_20201028_233851-b33d21b9.pth + + - Name: faster_rcnn_r50_caffe_dc5_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco.py + Metadata: + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco/faster_rcnn_r50_caffe_dc5_mstrain_3x_coco_20201028_002107-34a53b2c.pth + + - Name: faster_rcnn_r50_caffe_fpn_mstrain_2x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco.py + Metadata: + Training Memory (GB): 4.3 + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco/faster_rcnn_r50_caffe_fpn_mstrain_2x_coco_bbox_mAP-0.397_20200504_231813-10b2de58.pth + + - Name: faster_rcnn_r50_caffe_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 3.7 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210526_095054-1f77628b.pth + + - Name: faster_rcnn_r50_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 3.9 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_mstrain_3x_coco/faster_rcnn_r50_fpn_mstrain_3x_coco_20210524_110822-e10bd31c.pth + + - Name: faster_rcnn_r101_caffe_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 5.6 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco/faster_rcnn_r101_caffe_fpn_mstrain_3x_coco_20210526_095742-a7ae426d.pth + + - Name: faster_rcnn_r101_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r101_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 5.8 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r101_fpn_mstrain_3x_coco/faster_rcnn_r101_fpn_mstrain_3x_coco_20210524_110822-4d4d2ca8.pth + + - Name: faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 7.0 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco/faster_rcnn_x101_32x4d_fpn_mstrain_3x_coco_20210524_124151-16b9b260.pth + + - Name: faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 10.1 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco/faster_rcnn_x101_32x8d_fpn_mstrain_3x_coco_20210604_182954-002e082a.pth + + - Name: faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 10.0 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco/faster_rcnn_x101_64x4d_fpn_mstrain_3x_coco_20210524_124528-26c63de6.pth + + - Name: faster_rcnn_r50_fpn_tnr-pretrain_1x_coco + In Collection: Faster R-CNN + Config: configs/faster_rcnn/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco.py + Metadata: + Training Memory (GB): 4.0 + inference time (ms/im): + - value: 46.73 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco/faster_rcnn_r50_fpn_tnr-pretrain_1x_coco_20220320_085147-efedfda4.pth diff --git a/configs/fcos/README.md b/configs/fcos/README.md new file mode 100644 index 0000000..76be365 --- /dev/null +++ b/configs/fcos/README.md @@ -0,0 +1,45 @@ +# FCOS + +> [FCOS: Fully Convolutional One-Stage Object Detection](https://arxiv.org/abs/1904.01355) + + + +## Abstract + +We propose a fully convolutional one-stage object detector (FCOS) to solve object detection in a per-pixel prediction fashion, analogue to semantic segmentation. Almost all state-of-the-art object detectors such as RetinaNet, SSD, YOLOv3, and Faster R-CNN rely on pre-defined anchor boxes. In contrast, our proposed detector FCOS is anchor box free, as well as proposal free. By eliminating the predefined set of anchor boxes, FCOS completely avoids the complicated computation related to anchor boxes such as calculating overlapping during training. More importantly, we also avoid all hyper-parameters related to anchor boxes, which are often very sensitive to the final detection performance. With the only post-processing non-maximum suppression (NMS), FCOS with ResNeXt-64x4d-101 achieves 44.7% in AP with single-model and single-scale testing, surpassing previous one-stage detectors with the advantage of being much simpler. For the first time, we demonstrate a much simpler and flexible detection framework achieving improved detection accuracy. We hope that the proposed FCOS framework can serve as a simple and strong alternative for many other instance-level tasks. + +
+ +
+ +## Results and Models + +| Backbone | Style | GN | MS train | Tricks | DCN | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------: | :---: | :-: | :------: | :----: | :-: | :-----: | :------: | :------------: | :----: | :-----------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | caffe | Y | N | N | N | 1x | 3.6 | 22.7 | 36.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fcos/fcos_r50_caffe_fpn_gn-head_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r50_caffe_fpn_gn-head_1x_coco/fcos_r50_caffe_fpn_gn-head_1x_coco-821213aa.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r50_caffe_fpn_gn-head_1x_coco/20201227_180009.log.json) | +| R-50 | caffe | Y | N | Y | N | 1x | 3.7 | - | 38.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco-0a0d75a8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco/20210105_135818.log.json) | +| R-50 | caffe | Y | N | Y | Y | 1x | 3.8 | - | 42.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco-ae4d8b3d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco/20210105_224556.log.json) | +| R-101 | caffe | Y | N | N | N | 1x | 5.5 | 17.3 | 39.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fcos/fcos_r101_caffe_fpn_gn-head_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r101_caffe_fpn_gn-head_1x_coco/fcos_r101_caffe_fpn_gn-head_1x_coco-0e37b982.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r101_caffe_fpn_gn-head_1x_coco/20210103_155046.log.json) | + +| Backbone | Style | GN | MS train | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------: | :-----: | :-: | :------: | :-----: | :------: | :------------: | :----: | :---------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | caffe | Y | Y | 2x | 2.6 | 22.9 | 38.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fcos/fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco/fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco-d92ceeea.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco/20201227_161900.log.json) | +| R-101 | caffe | Y | Y | 2x | 5.5 | 17.3 | 40.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fcos/fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco/fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco-511424d6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco/20210103_155046.log.json) | +| X-101 | pytorch | Y | Y | 2x | 10.0 | 9.7 | 42.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fcos/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco-ede514a8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco/20210114_133041.log.json) | + +**Notes:** + +- The X-101 backbone is X-101-64x4d. +- Tricks means setting `norm_on_bbox`, `centerness_on_reg`, `center_sampling` as `True`. +- DCN means using `DCNv2` in both backbone and head. + +## Citation + +```latex +@article{tian2019fcos, + title={FCOS: Fully Convolutional One-Stage Object Detection}, + author={Tian, Zhi and Shen, Chunhua and Chen, Hao and He, Tong}, + journal={arXiv preprint arXiv:1904.01355}, + year={2019} +} +``` diff --git a/configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco.py b/configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco.py new file mode 100644 index 0000000..2699bdb --- /dev/null +++ b/configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco.py @@ -0,0 +1,54 @@ +_base_ = 'fcos_r50_caffe_fpn_gn-head_1x_coco.py' + +model = dict( + backbone=dict( + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + bbox_head=dict( + norm_on_bbox=True, + centerness_on_reg=True, + dcn_on_last_conv=False, + center_sampling=True, + conv_bias=True, + loss_bbox=dict(type='GIoULoss', loss_weight=1.0)), + # training and testing settings + test_cfg=dict(nms=dict(type='nms', iou_threshold=0.6))) + +# dataset settings +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +optimizer_config = dict(_delete_=True, grad_clip=None) + +lr_config = dict(warmup='linear') diff --git a/configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco.py b/configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco.py new file mode 100644 index 0000000..cf93c91 --- /dev/null +++ b/configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco.py @@ -0,0 +1,56 @@ +_base_ = 'fcos_r50_caffe_fpn_gn-head_1x_coco.py' + +model = dict( + backbone=dict( + dcn=dict(type='DCNv2', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True), + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + bbox_head=dict( + norm_on_bbox=True, + centerness_on_reg=True, + dcn_on_last_conv=True, + center_sampling=True, + conv_bias=True, + loss_bbox=dict(type='GIoULoss', loss_weight=1.0)), + # training and testing settings + test_cfg=dict(nms=dict(type='nms', iou_threshold=0.6))) + +# dataset settings +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +optimizer_config = dict(_delete_=True, grad_clip=None) + +lr_config = dict(warmup='linear') diff --git a/configs/fcos/fcos_center_r50_caffe_fpn_gn-head_1x_coco.py b/configs/fcos/fcos_center_r50_caffe_fpn_gn-head_1x_coco.py new file mode 100644 index 0000000..9f502e7 --- /dev/null +++ b/configs/fcos/fcos_center_r50_caffe_fpn_gn-head_1x_coco.py @@ -0,0 +1,2 @@ +_base_ = './fcos_r50_caffe_fpn_gn-head_1x_coco.py' +model = dict(bbox_head=dict(center_sampling=True, center_sample_radius=1.5)) diff --git a/configs/fcos/fcos_r101_caffe_fpn_gn-head_1x_coco.py b/configs/fcos/fcos_r101_caffe_fpn_gn-head_1x_coco.py new file mode 100644 index 0000000..45bea48 --- /dev/null +++ b/configs/fcos/fcos_r101_caffe_fpn_gn-head_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './fcos_r50_caffe_fpn_gn-head_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron/resnet101_caffe'))) diff --git a/configs/fcos/fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco.py b/configs/fcos/fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco.py new file mode 100644 index 0000000..f4d36f1 --- /dev/null +++ b/configs/fcos/fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco.py @@ -0,0 +1,47 @@ +_base_ = './fcos_r50_caffe_fpn_gn-head_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron/resnet101_caffe'))) +img_norm_cfg = dict( + mean=[102.9801, 115.9465, 122.7717], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/fcos/fcos_r50_caffe_fpn_gn-head_1x_coco.py b/configs/fcos/fcos_r50_caffe_fpn_gn-head_1x_coco.py new file mode 100644 index 0000000..955787b --- /dev/null +++ b/configs/fcos/fcos_r50_caffe_fpn_gn-head_1x_coco.py @@ -0,0 +1,106 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# model settings +model = dict( + type='FCOS', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron/resnet50_caffe')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', # use P5 + num_outs=5, + relu_before_extra_convs=True), + bbox_head=dict( + type='FCOSHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + strides=[8, 16, 32, 64, 128], + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='IoULoss', loss_weight=1.0), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) +img_norm_cfg = dict( + mean=[102.9801, 115.9465, 122.7717], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict( + lr=0.01, paramwise_cfg=dict(bias_lr_mult=2., bias_decay_mult=0.)) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) +# learning policy +lr_config = dict( + policy='step', + warmup='constant', + warmup_iters=500, + warmup_ratio=1.0 / 3, + step=[8, 11]) +runner = dict(type='EpochBasedRunner', max_epochs=12) diff --git a/configs/fcos/fcos_r50_caffe_fpn_gn-head_4x4_1x_coco.py b/configs/fcos/fcos_r50_caffe_fpn_gn-head_4x4_1x_coco.py new file mode 100644 index 0000000..2816b16 --- /dev/null +++ b/configs/fcos/fcos_r50_caffe_fpn_gn-head_4x4_1x_coco.py @@ -0,0 +1,4 @@ +# TODO: Remove this config after benchmarking all related configs +_base_ = 'fcos_r50_caffe_fpn_gn-head_1x_coco.py' + +data = dict(samples_per_gpu=4, workers_per_gpu=4) diff --git a/configs/fcos/fcos_r50_caffe_fpn_gn-head_fp16_1x_bs8x8_coco.py b/configs/fcos/fcos_r50_caffe_fpn_gn-head_fp16_1x_bs8x8_coco.py new file mode 100644 index 0000000..f7c973c --- /dev/null +++ b/configs/fcos/fcos_r50_caffe_fpn_gn-head_fp16_1x_bs8x8_coco.py @@ -0,0 +1,13 @@ +_base_ = ['./fcos_r50_caffe_fpn_gn-head_1x_coco.py'] + +data = dict(samples_per_gpu=8, workers_per_gpu=8) + +# optimizer +optimizer = dict(lr=0.04) +fp16 = dict(loss_scale='dynamic') + +# learning policy +# In order to avoid non-convergence in the early stage of +# mixed-precision training, the warmup in the lr_config is set to linear, +# warmup_iters increases and warmup_ratio decreases. +lr_config = dict(warmup='linear', warmup_iters=1000, warmup_ratio=1.0 / 10) diff --git a/configs/fcos/fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco.py b/configs/fcos/fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco.py new file mode 100644 index 0000000..497d03f --- /dev/null +++ b/configs/fcos/fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco.py @@ -0,0 +1,39 @@ +_base_ = './fcos_r50_caffe_fpn_gn-head_1x_coco.py' +img_norm_cfg = dict( + mean=[102.9801, 115.9465, 122.7717], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/fcos/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco.py b/configs/fcos/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco.py new file mode 100644 index 0000000..e70e465 --- /dev/null +++ b/configs/fcos/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco.py @@ -0,0 +1,60 @@ +_base_ = './fcos_r50_caffe_fpn_gn-head_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict( + lr=0.01, paramwise_cfg=dict(bias_lr_mult=2., bias_decay_mult=0.)) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/fcos/metafile.yml b/configs/fcos/metafile.yml new file mode 100644 index 0000000..ae922eb --- /dev/null +++ b/configs/fcos/metafile.yml @@ -0,0 +1,146 @@ +Collections: + - Name: FCOS + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - Group Normalization + - ResNet + Paper: + URL: https://arxiv.org/abs/1904.01355 + Title: 'FCOS: Fully Convolutional One-Stage Object Detection' + README: configs/fcos/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/detectors/fcos.py#L6 + Version: v2.0.0 + +Models: + - Name: fcos_r50_caffe_fpn_gn-head_1x_coco + In Collection: FCOS + Config: configs/fcos/fcos_r50_caffe_fpn_gn-head_1x_coco.py + Metadata: + Training Memory (GB): 3.6 + inference time (ms/im): + - value: 44.05 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 36.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r50_caffe_fpn_gn-head_1x_coco/fcos_r50_caffe_fpn_gn-head_1x_coco-821213aa.pth + + - Name: fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco + In Collection: FCOS + Config: configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco.py + Metadata: + Training Memory (GB): 3.7 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_1x_coco-0a0d75a8.pth + + - Name: fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco + In Collection: FCOS + Config: configs/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco.py + Metadata: + Training Memory (GB): 3.8 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco/fcos_center-normbbox-centeronreg-giou_r50_caffe_fpn_gn-head_dcn_1x_coco-ae4d8b3d.pth + + - Name: fcos_r101_caffe_fpn_gn-head_1x_coco + In Collection: FCOS + Config: configs/fcos/fcos_r101_caffe_fpn_gn-head_1x_coco.py + Metadata: + Training Memory (GB): 5.5 + inference time (ms/im): + - value: 57.8 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r101_caffe_fpn_gn-head_1x_coco/fcos_r101_caffe_fpn_gn-head_1x_coco-0e37b982.pth + + - Name: fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco + In Collection: FCOS + Config: configs/fcos/fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco.py + Metadata: + Training Memory (GB): 2.6 + inference time (ms/im): + - value: 43.67 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco/fcos_r50_caffe_fpn_gn-head_mstrain_640-800_2x_coco-d92ceeea.pth + + - Name: fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco + In Collection: FCOS + Config: configs/fcos/fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco.py + Metadata: + Training Memory (GB): 5.5 + inference time (ms/im): + - value: 57.8 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco/fcos_r101_caffe_fpn_gn-head_mstrain_640-800_2x_coco-511424d6.pth + + - Name: fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco + In Collection: FCOS + Config: configs/fcos/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco.py + Metadata: + Training Memory (GB): 10.0 + inference time (ms/im): + - value: 103.09 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fcos/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco/fcos_x101_64x4d_fpn_gn-head_mstrain_640-800_2x_coco-ede514a8.pth diff --git a/configs/foveabox/README.md b/configs/foveabox/README.md new file mode 100644 index 0000000..7fcd094 --- /dev/null +++ b/configs/foveabox/README.md @@ -0,0 +1,53 @@ +# FoveaBox + +> [FoveaBox: Beyond Anchor-based Object Detector](https://arxiv.org/abs/1904.03797) + + + +## Abstract + +We present FoveaBox, an accurate, flexible, and completely anchor-free framework for object detection. While almost all state-of-the-art object detectors utilize predefined anchors to enumerate possible locations, scales and aspect ratios for the search of the objects, their performance and generalization ability are also limited to the design of anchors. Instead, FoveaBox directly learns the object existing possibility and the bounding box coordinates without anchor reference. This is achieved by: (a) predicting category-sensitive semantic maps for the object existing possibility, and (b) producing category-agnostic bounding box for each position that potentially contains an object. The scales of target boxes are naturally associated with feature pyramid representations. In FoveaBox, an instance is assigned to adjacent feature levels to make the model more accurate.We demonstrate its effectiveness on standard benchmarks and report extensive experimental analysis. Without bells and whistles, FoveaBox achieves state-of-the-art single model performance on the standard COCO and Pascal VOC object detection benchmark. More importantly, FoveaBox avoids all computation and hyper-parameters related to anchor boxes, which are often sensitive to the final detection performance. We believe the simple and effective approach will serve as a solid baseline and help ease future research for object detection. + +
+ +
+ +## Introduction + +FoveaBox is an accurate, flexible and completely anchor-free object detection system for object detection framework, as presented in our paper [https://arxiv.org/abs/1904.03797](https://arxiv.org/abs/1904.03797): +Different from previous anchor-based methods, FoveaBox directly learns the object existing possibility and the bounding box coordinates without anchor reference. This is achieved by: (a) predicting category-sensitive semantic maps for the object existing possibility, and (b) producing category-agnostic bounding box for each position that potentially contains an object. + +## Results and Models + +### Results on R50/101-FPN + +| Backbone | Style | align | ms-train | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------: | :-----: | :---: | :------: | :-----: | :------: | :------------: | :----: | :------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | pytorch | N | N | 1x | 5.6 | 24.1 | 36.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/foveabox/fovea_r50_fpn_4x4_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r50_fpn_4x4_1x_coco/fovea_r50_fpn_4x4_1x_coco_20200219-ee4d5303.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r50_fpn_4x4_1x_coco/fovea_r50_fpn_4x4_1x_coco_20200219_223025.log.json) | +| R-50 | pytorch | N | N | 2x | 5.6 | - | 37.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/foveabox/fovea_r50_fpn_4x4_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r50_fpn_4x4_2x_coco/fovea_r50_fpn_4x4_2x_coco_20200203-2df792b1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r50_fpn_4x4_2x_coco/fovea_r50_fpn_4x4_2x_coco_20200203_112043.log.json) | +| R-50 | pytorch | Y | N | 2x | 8.1 | 19.4 | 37.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco/fovea_align_r50_fpn_gn-head_4x4_2x_coco_20200203-8987880d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco/fovea_align_r50_fpn_gn-head_4x4_2x_coco_20200203_134252.log.json) | +| R-50 | pytorch | Y | Y | 2x | 8.1 | 18.3 | 40.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/foveabox/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco_20200205-85ce26cb.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco_20200205_112557.log.json) | +| R-101 | pytorch | N | N | 1x | 9.2 | 17.4 | 38.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/foveabox/fovea_r101_fpn_4x4_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r101_fpn_4x4_1x_coco/fovea_r101_fpn_4x4_1x_coco_20200219-05e38f1c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r101_fpn_4x4_1x_coco/fovea_r101_fpn_4x4_1x_coco_20200219_011740.log.json) | +| R-101 | pytorch | N | N | 2x | 11.7 | - | 40.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/foveabox/fovea_r101_fpn_4x4_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r101_fpn_4x4_2x_coco/fovea_r101_fpn_4x4_2x_coco_20200208-02320ea4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r101_fpn_4x4_2x_coco/fovea_r101_fpn_4x4_2x_coco_20200208_202059.log.json) | +| R-101 | pytorch | Y | N | 2x | 11.7 | 14.7 | 40.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/foveabox/fovea_align_r101_fpn_gn-head_4x4_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r101_fpn_gn-head_4x4_2x_coco/fovea_align_r101_fpn_gn-head_4x4_2x_coco_20200208-c39a027a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r101_fpn_gn-head_4x4_2x_coco/fovea_align_r101_fpn_gn-head_4x4_2x_coco_20200208_203337.log.json) | +| R-101 | pytorch | Y | Y | 2x | 11.7 | 14.7 | 42.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/foveabox/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco_20200208-649c5eb6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco_20200208_202124.log.json) | + +\[1\] *1x and 2x mean the model is trained for 12 and 24 epochs, respectively.* \ +\[2\] *Align means utilizing deformable convolution to align the cls branch.* \ +\[3\] *All results are obtained with a single model and without any test time data augmentation.*\ +\[4\] *We use 4 GPUs for training.* + +Any pull requests or issues are welcome. + +## Citation + +Please consider citing our paper in your publications if the project helps your research. BibTeX reference is as follows. + +```latex +@article{kong2019foveabox, + title={FoveaBox: Beyond Anchor-based Object Detector}, + author={Kong, Tao and Sun, Fuchun and Liu, Huaping and Jiang, Yuning and Shi, Jianbo}, + journal={arXiv preprint arXiv:1904.03797}, + year={2019} +} +``` diff --git a/configs/foveabox/fovea_align_r101_fpn_gn-head_4x4_2x_coco.py b/configs/foveabox/fovea_align_r101_fpn_gn-head_4x4_2x_coco.py new file mode 100644 index 0000000..c5d1784 --- /dev/null +++ b/configs/foveabox/fovea_align_r101_fpn_gn-head_4x4_2x_coco.py @@ -0,0 +1,12 @@ +_base_ = './fovea_r50_fpn_4x4_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101')), + bbox_head=dict( + with_deform=True, + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True))) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/foveabox/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py b/configs/foveabox/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py new file mode 100644 index 0000000..cc5affe --- /dev/null +++ b/configs/foveabox/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py @@ -0,0 +1,29 @@ +_base_ = './fovea_r50_fpn_4x4_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101')), + bbox_head=dict( + with_deform=True, + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +data = dict(train=dict(pipeline=train_pipeline)) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py b/configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py new file mode 100644 index 0000000..e7265bc --- /dev/null +++ b/configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py @@ -0,0 +1,10 @@ +_base_ = './fovea_r50_fpn_4x4_1x_coco.py' +model = dict( + bbox_head=dict( + with_deform=True, + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True))) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/configs/foveabox/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py b/configs/foveabox/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py new file mode 100644 index 0000000..8fc39be --- /dev/null +++ b/configs/foveabox/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py @@ -0,0 +1,25 @@ +_base_ = './fovea_r50_fpn_4x4_1x_coco.py' +model = dict( + bbox_head=dict( + with_deform=True, + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +data = dict(train=dict(pipeline=train_pipeline)) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/foveabox/fovea_r101_fpn_4x4_1x_coco.py b/configs/foveabox/fovea_r101_fpn_4x4_1x_coco.py new file mode 100644 index 0000000..9201af1 --- /dev/null +++ b/configs/foveabox/fovea_r101_fpn_4x4_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './fovea_r50_fpn_4x4_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/foveabox/fovea_r101_fpn_4x4_2x_coco.py b/configs/foveabox/fovea_r101_fpn_4x4_2x_coco.py new file mode 100644 index 0000000..1ef5243 --- /dev/null +++ b/configs/foveabox/fovea_r101_fpn_4x4_2x_coco.py @@ -0,0 +1,6 @@ +_base_ = './fovea_r50_fpn_4x4_2x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/foveabox/fovea_r50_fpn_4x4_1x_coco.py b/configs/foveabox/fovea_r50_fpn_4x4_1x_coco.py new file mode 100644 index 0000000..7e986eb --- /dev/null +++ b/configs/foveabox/fovea_r50_fpn_4x4_1x_coco.py @@ -0,0 +1,52 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# model settings +model = dict( + type='FOVEA', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + num_outs=5, + add_extra_convs='on_input'), + bbox_head=dict( + type='FoveaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + strides=[8, 16, 32, 64, 128], + base_edge_list=[16, 32, 64, 128, 256], + scale_ranges=((1, 64), (32, 128), (64, 256), (128, 512), (256, 2048)), + sigma=0.4, + with_deform=False, + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=1.50, + alpha=0.4, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=0.11, loss_weight=1.0)), + # training and testing settings + train_cfg=dict(), + test_cfg=dict( + nms_pre=1000, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) +data = dict(samples_per_gpu=4, workers_per_gpu=4) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/configs/foveabox/fovea_r50_fpn_4x4_2x_coco.py b/configs/foveabox/fovea_r50_fpn_4x4_2x_coco.py new file mode 100644 index 0000000..68ce4d2 --- /dev/null +++ b/configs/foveabox/fovea_r50_fpn_4x4_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './fovea_r50_fpn_4x4_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/foveabox/metafile.yml b/configs/foveabox/metafile.yml new file mode 100644 index 0000000..fe9a283 --- /dev/null +++ b/configs/foveabox/metafile.yml @@ -0,0 +1,172 @@ +Collections: + - Name: FoveaBox + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 4x V100 GPUs + Architecture: + - FPN + - ResNet + Paper: + URL: https://arxiv.org/abs/1904.03797 + Title: 'FoveaBox: Beyond Anchor-based Object Detector' + README: configs/foveabox/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/detectors/fovea.py#L6 + Version: v2.0.0 + +Models: + - Name: fovea_r50_fpn_4x4_1x_coco + In Collection: FoveaBox + Config: configs/foveabox/fovea_r50_fpn_4x4_1x_coco.py + Metadata: + Training Memory (GB): 5.6 + inference time (ms/im): + - value: 41.49 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 36.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r50_fpn_4x4_1x_coco/fovea_r50_fpn_4x4_1x_coco_20200219-ee4d5303.pth + + - Name: fovea_r50_fpn_4x4_2x_coco + In Collection: FoveaBox + Config: configs/foveabox/fovea_r50_fpn_4x4_2x_coco.py + Metadata: + Training Memory (GB): 5.6 + inference time (ms/im): + - value: 41.49 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r50_fpn_4x4_2x_coco/fovea_r50_fpn_4x4_2x_coco_20200203-2df792b1.pth + + - Name: fovea_align_r50_fpn_gn-head_4x4_2x_coco + In Collection: FoveaBox + Config: configs/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py + Metadata: + Training Memory (GB): 8.1 + inference time (ms/im): + - value: 51.55 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco/fovea_align_r50_fpn_gn-head_4x4_2x_coco_20200203-8987880d.pth + + - Name: fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco + In Collection: FoveaBox + Config: configs/foveabox/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py + Metadata: + Training Memory (GB): 8.1 + inference time (ms/im): + - value: 54.64 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco_20200205-85ce26cb.pth + + - Name: fovea_r101_fpn_4x4_1x_coco + In Collection: FoveaBox + Config: configs/foveabox/fovea_r101_fpn_4x4_1x_coco.py + Metadata: + Training Memory (GB): 9.2 + inference time (ms/im): + - value: 57.47 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r101_fpn_4x4_1x_coco/fovea_r101_fpn_4x4_1x_coco_20200219-05e38f1c.pth + + - Name: fovea_r101_fpn_4x4_2x_coco + In Collection: FoveaBox + Config: configs/foveabox/fovea_r101_fpn_4x4_2x_coco.py + Metadata: + Training Memory (GB): 11.7 + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_r101_fpn_4x4_2x_coco/fovea_r101_fpn_4x4_2x_coco_20200208-02320ea4.pth + + - Name: fovea_align_r101_fpn_gn-head_4x4_2x_coco + In Collection: FoveaBox + Config: configs/foveabox/fovea_align_r101_fpn_gn-head_4x4_2x_coco.py + Metadata: + Training Memory (GB): 11.7 + inference time (ms/im): + - value: 68.03 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r101_fpn_gn-head_4x4_2x_coco/fovea_align_r101_fpn_gn-head_4x4_2x_coco_20200208-c39a027a.pth + + - Name: fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco + In Collection: FoveaBox + Config: configs/foveabox/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py + Metadata: + Training Memory (GB): 11.7 + inference time (ms/im): + - value: 68.03 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/foveabox/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco/fovea_align_r101_fpn_gn-head_mstrain_640-800_4x4_2x_coco_20200208-649c5eb6.pth diff --git a/configs/fpg/README.md b/configs/fpg/README.md new file mode 100644 index 0000000..0ffd2e7 --- /dev/null +++ b/configs/fpg/README.md @@ -0,0 +1,43 @@ +# FPG + +> [Feature Pyramid Grids](https://arxiv.org/abs/2004.03580) + + + +## Abstract + +Feature pyramid networks have been widely adopted in the object detection literature to improve feature representations for better handling of variations in scale. In this paper, we present Feature Pyramid Grids (FPG), a deep multi-pathway feature pyramid, that represents the feature scale-space as a regular grid of parallel bottom-up pathways which are fused by multi-directional lateral connections. FPG can improve single-pathway feature pyramid networks by significantly increasing its performance at similar computation cost, highlighting importance of deep pyramid representations. In addition to its general and uniform structure, over complicated structures that have been found with neural architecture search, it also compares favorably against such approaches without relying on search. We hope that FPG with its uniform and effective nature can serve as a strong component for future work in object recognition. + +
+ +
+ +## Results and Models + +We benchmark the new training schedule (crop training, large batch, unfrozen BN, 50 epochs) introduced in NAS-FPN. +All backbones are Resnet-50 in pytorch style. + +| Method | Neck | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :----------: | :--------: | :-----: | :------: | :------------: | :----: | :-----: | :------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Faster R-CNN | FPG | 50e | 20.0 | - | 42.3 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fpg/faster_rcnn_r50_fpg_crop640_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fpg/faster_rcnn_r50_fpg_crop640_50e_coco/faster_rcnn_r50_fpg_crop640_50e_coco_20220311_011856-74109f42.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fpg/faster_rcnn_r50_fpg_crop640_50e_coco/faster_rcnn_r50_fpg_crop640_50e_coco_20220311_011856.log.json) | +| Faster R-CNN | FPG-chn128 | 50e | 11.9 | - | 41.2 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fpg/faster_rcnn_r50_fpg-chn128_crop640_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fpg/faster_rcnn_r50_fpg-chn128_crop640_50e_coco/faster_rcnn_r50_fpg-chn128_crop640_50e_coco_20220311_011857-9376aa9d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fpg/faster_rcnn_r50_fpg-chn128_crop640_50e_coco/faster_rcnn_r50_fpg-chn128_crop640_50e_coco_20220311_011857.log.json) | +| Faster R-CNN | FPN | 50e | 20.0 | - | 38.9 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fpg/faster_rcnn_r50_fpn_crop640_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fpg/faster_rcnn_r50_fpn_crop640_50e_coco/faster_rcnn_r50_fpn_crop640_50e_coco_20220311_011857-be7c9f42.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fpg/faster_rcnn_r50_fpn_crop640_50e_coco/faster_rcnn_r50_fpn_crop640_50e_coco_20220311_011857.log.json) | +| Mask R-CNN | FPG | 50e | 23.2 | - | 43.0 | 38.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fpg/mask_rcnn_r50_fpg_crop640_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fpg/mask_rcnn_r50_fpg_crop640_50e_coco/mask_rcnn_r50_fpg_crop640_50e_coco_20220311_011857-233b8334.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fpg/mask_rcnn_r50_fpg_crop640_50e_coco/mask_rcnn_r50_fpg_crop640_50e_coco_20220311_011857.log.json) | +| Mask R-CNN | FPG-chn128 | 50e | 15.3 | - | 41.7 | 37.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fpg/mask_rcnn_r50_fpg-chn128_crop640_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fpg/mask_rcnn_r50_fpg-chn128_crop640_50e_coco/mask_rcnn_r50_fpg-chn128_crop640_50e_coco_20220311_011859-043c9b4e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fpg/mask_rcnn_r50_fpg-chn128_crop640_50e_coco/mask_rcnn_r50_fpg-chn128_crop640_50e_coco_20220311_011859.log.json) | +| Mask R-CNN | FPN | 50e | 23.2 | - | 39.6 | 35.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fpg/mask_rcnn_r50_fpn_crop640_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fpg/mask_rcnn_r50_fpn_crop640_50e_coco/mask_rcnn_r50_fpn_crop640_50e_coco_20220311_011855-a756664a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fpg/mask_rcnn_r50_fpn_crop640_50e_coco/mask_rcnn_r50_fpn_crop640_50e_coco_20220311_011855.log.json) | +| RetinaNet | FPG | 50e | 20.8 | - | 40.5 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fpg/retinanet_r50_fpg_crop640_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fpg/retinanet_r50_fpg_crop640_50e_coco/retinanet_r50_fpg_crop640_50e_coco_20220311_110809-b0bcf5f4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fpg/retinanet_r50_fpg_crop640_50e_coco/retinanet_r50_fpg_crop640_50e_coco_20220311_110809.log.json) | +| RetinaNet | FPG-chn128 | 50e | 19.9 | - | 39.9 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fpg/retinanet_r50_fpg-chn128_crop640_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fpg/retinanet_r50_fpg-chn128_crop640_50e_coco/retinanet_r50_fpg-chn128_crop640_50e_coco_20220313_104829-ee99a686.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fpg/retinanet_r50_fpg-chn128_crop640_50e_coco/retinanet_r50_fpg-chn128_crop640_50e_coco_20220313_104829.log.json) | + +**Note**: Chn128 means to decrease the number of channels of features and convs from 256 (default) to 128 in +Neck and BBox Head, which can greatly decrease memory consumption without sacrificing much precision. + +## Citation + +```latex +@article{chen2020feature, + title={Feature pyramid grids}, + author={Chen, Kai and Cao, Yuhang and Loy, Chen Change and Lin, Dahua and Feichtenhofer, Christoph}, + journal={arXiv preprint arXiv:2004.03580}, + year={2020} +} +``` diff --git a/configs/fpg/faster_rcnn_r50_fpg-chn128_crop640_50e_coco.py b/configs/fpg/faster_rcnn_r50_fpg-chn128_crop640_50e_coco.py new file mode 100644 index 0000000..4535034 --- /dev/null +++ b/configs/fpg/faster_rcnn_r50_fpg-chn128_crop640_50e_coco.py @@ -0,0 +1,9 @@ +_base_ = 'faster_rcnn_r50_fpg_crop640_50e_coco.py' + +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + neck=dict(out_channels=128, inter_channels=128), + rpn_head=dict(in_channels=128), + roi_head=dict( + bbox_roi_extractor=dict(out_channels=128), + bbox_head=dict(in_channels=128))) diff --git a/configs/fpg/faster_rcnn_r50_fpg_crop640_50e_coco.py b/configs/fpg/faster_rcnn_r50_fpg_crop640_50e_coco.py new file mode 100644 index 0000000..3ab2a2c --- /dev/null +++ b/configs/fpg/faster_rcnn_r50_fpg_crop640_50e_coco.py @@ -0,0 +1,48 @@ +_base_ = 'faster_rcnn_r50_fpn_crop640_50e_coco.py' + +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + neck=dict( + type='FPG', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + inter_channels=256, + num_outs=5, + stack_times=9, + paths=['bu'] * 9, + same_down_trans=None, + same_up_trans=dict( + type='conv', + kernel_size=3, + stride=2, + padding=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + across_lateral_trans=dict( + type='conv', + kernel_size=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + across_down_trans=dict( + type='interpolation_conv', + mode='nearest', + kernel_size=3, + norm_cfg=norm_cfg, + order=('act', 'conv', 'norm'), + inplace=False), + across_up_trans=None, + across_skip_trans=dict( + type='conv', + kernel_size=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + output_trans=dict( + type='last_conv', + kernel_size=3, + order=('act', 'conv', 'norm'), + inplace=False), + norm_cfg=norm_cfg, + skip_inds=[(0, 1, 2, 3), (0, 1, 2), (0, 1), (0, ), ()])) diff --git a/configs/fpg/faster_rcnn_r50_fpn_crop640_50e_coco.py b/configs/fpg/faster_rcnn_r50_fpn_crop640_50e_coco.py new file mode 100644 index 0000000..e4ec940 --- /dev/null +++ b/configs/fpg/faster_rcnn_r50_fpn_crop640_50e_coco.py @@ -0,0 +1,73 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + backbone=dict(norm_cfg=norm_cfg, norm_eval=False), + neck=dict(norm_cfg=norm_cfg), + roi_head=dict(bbox_head=dict(norm_cfg=norm_cfg))) +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=(640, 640), + ratio_range=(0.8, 1.2), + keep_ratio=True), + dict(type='RandomCrop', crop_size=(640, 640)), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=(640, 640)), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(640, 640), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=64), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, + workers_per_gpu=4, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# learning policy +optimizer = dict( + type='SGD', + lr=0.08, + momentum=0.9, + weight_decay=0.0001, + paramwise_cfg=dict(norm_decay_mult=0, bypass_duplicate=True)) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=0.1, + step=[30, 40]) +# runtime settings +runner = dict(max_epochs=50) +evaluation = dict(interval=2) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/fpg/mask_rcnn_r50_fpg-chn128_crop640_50e_coco.py b/configs/fpg/mask_rcnn_r50_fpg-chn128_crop640_50e_coco.py new file mode 100644 index 0000000..baa4a5a --- /dev/null +++ b/configs/fpg/mask_rcnn_r50_fpg-chn128_crop640_50e_coco.py @@ -0,0 +1,10 @@ +_base_ = 'mask_rcnn_r50_fpg_crop640_50e_coco.py' + +model = dict( + neck=dict(out_channels=128, inter_channels=128), + rpn_head=dict(in_channels=128), + roi_head=dict( + bbox_roi_extractor=dict(out_channels=128), + bbox_head=dict(in_channels=128), + mask_roi_extractor=dict(out_channels=128), + mask_head=dict(in_channels=128))) diff --git a/configs/fpg/mask_rcnn_r50_fpg_crop640_50e_coco.py b/configs/fpg/mask_rcnn_r50_fpg_crop640_50e_coco.py new file mode 100644 index 0000000..3c9ea27 --- /dev/null +++ b/configs/fpg/mask_rcnn_r50_fpg_crop640_50e_coco.py @@ -0,0 +1,48 @@ +_base_ = 'mask_rcnn_r50_fpn_crop640_50e_coco.py' + +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + neck=dict( + type='FPG', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + inter_channels=256, + num_outs=5, + stack_times=9, + paths=['bu'] * 9, + same_down_trans=None, + same_up_trans=dict( + type='conv', + kernel_size=3, + stride=2, + padding=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + across_lateral_trans=dict( + type='conv', + kernel_size=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + across_down_trans=dict( + type='interpolation_conv', + mode='nearest', + kernel_size=3, + norm_cfg=norm_cfg, + order=('act', 'conv', 'norm'), + inplace=False), + across_up_trans=None, + across_skip_trans=dict( + type='conv', + kernel_size=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + output_trans=dict( + type='last_conv', + kernel_size=3, + order=('act', 'conv', 'norm'), + inplace=False), + norm_cfg=norm_cfg, + skip_inds=[(0, 1, 2, 3), (0, 1, 2), (0, 1), (0, ), ()])) diff --git a/configs/fpg/mask_rcnn_r50_fpn_crop640_50e_coco.py b/configs/fpg/mask_rcnn_r50_fpn_crop640_50e_coco.py new file mode 100644 index 0000000..c6bcc24 --- /dev/null +++ b/configs/fpg/mask_rcnn_r50_fpn_crop640_50e_coco.py @@ -0,0 +1,79 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + backbone=dict(norm_cfg=norm_cfg, norm_eval=False), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + norm_cfg=norm_cfg, + num_outs=5), + roi_head=dict( + bbox_head=dict(norm_cfg=norm_cfg), mask_head=dict(norm_cfg=norm_cfg))) +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=(640, 640), + ratio_range=(0.8, 1.2), + keep_ratio=True), + dict(type='RandomCrop', crop_size=(640, 640)), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=(640, 640)), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(640, 640), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=64), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, + workers_per_gpu=4, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# learning policy +optimizer = dict( + type='SGD', + lr=0.08, + momentum=0.9, + weight_decay=0.0001, + paramwise_cfg=dict(norm_decay_mult=0, bypass_duplicate=True)) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=0.1, + step=[30, 40]) +# runtime settings +runner = dict(max_epochs=50) +evaluation = dict(interval=2) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/fpg/metafile.yml b/configs/fpg/metafile.yml new file mode 100644 index 0000000..6b0a6a7 --- /dev/null +++ b/configs/fpg/metafile.yml @@ -0,0 +1,104 @@ +Collections: + - Name: Feature Pyramid Grids + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Feature Pyramid Grids + Paper: + URL: https://arxiv.org/abs/2004.03580 + Title: 'Feature Pyramid Grids' + README: configs/fpg/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.10.0/mmdet/models/necks/fpg.py#L101 + Version: v2.10.0 + +Models: + - Name: faster_rcnn_r50_fpg_crop640_50e_coco + In Collection: Feature Pyramid Grids + Config: configs/fpg/faster_rcnn_r50_fpg_crop640_50e_coco.py + Metadata: + Training Memory (GB): 20.0 + Epochs: 50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fpg/faster_rcnn_r50_fpg_crop640_50e_coco/faster_rcnn_r50_fpg_crop640_50e_coco_20220311_011856-74109f42.pth + + - Name: faster_rcnn_r50_fpg-chn128_crop640_50e_coco + In Collection: Feature Pyramid Grids + Config: configs/fpg/faster_rcnn_r50_fpg-chn128_crop640_50e_coco.py + Metadata: + Training Memory (GB): 11.9 + Epochs: 50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fpg/faster_rcnn_r50_fpg-chn128_crop640_50e_coco/faster_rcnn_r50_fpg-chn128_crop640_50e_coco_20220311_011857-9376aa9d.pth + + - Name: mask_rcnn_r50_fpg_crop640_50e_coco + In Collection: Feature Pyramid Grids + Config: configs/fpg/mask_rcnn_r50_fpg_crop640_50e_coco.py + Metadata: + Training Memory (GB): 23.2 + Epochs: 50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fpg/mask_rcnn_r50_fpg_crop640_50e_coco/mask_rcnn_r50_fpg_crop640_50e_coco_20220311_011857-233b8334.pth + + - Name: mask_rcnn_r50_fpg-chn128_crop640_50e_coco + In Collection: Feature Pyramid Grids + Config: configs/fpg/mask_rcnn_r50_fpg-chn128_crop640_50e_coco.py + Metadata: + Training Memory (GB): 15.3 + Epochs: 50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fpg/mask_rcnn_r50_fpg-chn128_crop640_50e_coco/mask_rcnn_r50_fpg-chn128_crop640_50e_coco_20220311_011859-043c9b4e.pth + + - Name: retinanet_r50_fpg_crop640_50e_coco + In Collection: Feature Pyramid Grids + Config: configs/fpg/retinanet_r50_fpg_crop640_50e_coco.py + Metadata: + Training Memory (GB): 20.8 + Epochs: 50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fpg/retinanet_r50_fpg_crop640_50e_coco/retinanet_r50_fpg_crop640_50e_coco_20220311_110809-b0bcf5f4.pth + + - Name: retinanet_r50_fpg-chn128_crop640_50e_coco + In Collection: Feature Pyramid Grids + Config: configs/fpg/retinanet_r50_fpg-chn128_crop640_50e_coco.py + Metadata: + Training Memory (GB): 19.9 + Epochs: 50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fpg/retinanet_r50_fpg-chn128_crop640_50e_coco/retinanet_r50_fpg-chn128_crop640_50e_coco_20220313_104829-ee99a686.pth diff --git a/configs/fpg/retinanet_r50_fpg-chn128_crop640_50e_coco.py b/configs/fpg/retinanet_r50_fpg-chn128_crop640_50e_coco.py new file mode 100644 index 0000000..9a6cf7e --- /dev/null +++ b/configs/fpg/retinanet_r50_fpg-chn128_crop640_50e_coco.py @@ -0,0 +1,5 @@ +_base_ = 'retinanet_r50_fpg_crop640_50e_coco.py' + +model = dict( + neck=dict(out_channels=128, inter_channels=128), + bbox_head=dict(in_channels=128)) diff --git a/configs/fpg/retinanet_r50_fpg_crop640_50e_coco.py b/configs/fpg/retinanet_r50_fpg_crop640_50e_coco.py new file mode 100644 index 0000000..504ed5e --- /dev/null +++ b/configs/fpg/retinanet_r50_fpg_crop640_50e_coco.py @@ -0,0 +1,53 @@ +_base_ = '../nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py' + +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + neck=dict( + _delete_=True, + type='FPG', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + inter_channels=256, + num_outs=5, + add_extra_convs=True, + start_level=1, + stack_times=9, + paths=['bu'] * 9, + same_down_trans=None, + same_up_trans=dict( + type='conv', + kernel_size=3, + stride=2, + padding=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + across_lateral_trans=dict( + type='conv', + kernel_size=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + across_down_trans=dict( + type='interpolation_conv', + mode='nearest', + kernel_size=3, + norm_cfg=norm_cfg, + order=('act', 'conv', 'norm'), + inplace=False), + across_up_trans=None, + across_skip_trans=dict( + type='conv', + kernel_size=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + output_trans=dict( + type='last_conv', + kernel_size=3, + order=('act', 'conv', 'norm'), + inplace=False), + norm_cfg=norm_cfg, + skip_inds=[(0, 1, 2, 3), (0, 1, 2), (0, 1), (0, ), ()])) + +evaluation = dict(interval=2) diff --git a/configs/free_anchor/README.md b/configs/free_anchor/README.md new file mode 100644 index 0000000..d24c340 --- /dev/null +++ b/configs/free_anchor/README.md @@ -0,0 +1,37 @@ +# FreeAnchor + +> [FreeAnchor: Learning to Match Anchors for Visual Object Detection](https://arxiv.org/abs/1909.02466) + + + +## Abstract + +Modern CNN-based object detectors assign anchors for ground-truth objects under the restriction of object-anchor Intersection-over-Unit (IoU). In this study, we propose a learning-to-match approach to break IoU restriction, allowing objects to match anchors in a flexible manner. Our approach, referred to as FreeAnchor, updates hand-crafted anchor assignment to "free" anchor matching by formulating detector training as a maximum likelihood estimation (MLE) procedure. FreeAnchor targets at learning features which best explain a class of objects in terms of both classification and localization. FreeAnchor is implemented by optimizing detection customized likelihood and can be fused with CNN-based detectors in a plug-and-play manner. Experiments on COCO demonstrate that FreeAnchor consistently outperforms their counterparts with significant margins. + +
+ +
+ +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :---------: | :-----: | :-----: | :------: | :------------: | :----: | :---------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | pytorch | 1x | 4.9 | 18.4 | 38.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco/retinanet_free_anchor_r50_fpn_1x_coco_20200130-0f67375f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco/retinanet_free_anchor_r50_fpn_1x_coco_20200130_095625.log.json) | +| R-101 | pytorch | 1x | 6.8 | 14.9 | 40.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/free_anchor/retinanet_free_anchor_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/free_anchor/retinanet_free_anchor_r101_fpn_1x_coco/retinanet_free_anchor_r101_fpn_1x_coco_20200130-358324e6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/free_anchor/retinanet_free_anchor_r101_fpn_1x_coco/retinanet_free_anchor_r101_fpn_1x_coco_20200130_100723.log.json) | +| X-101-32x4d | pytorch | 1x | 8.1 | 11.1 | 41.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/free_anchor/retinanet_free_anchor_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/free_anchor/retinanet_free_anchor_x101_32x4d_fpn_1x_coco/retinanet_free_anchor_x101_32x4d_fpn_1x_coco_20200130-d4846968.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/free_anchor/retinanet_free_anchor_x101_32x4d_fpn_1x_coco/retinanet_free_anchor_x101_32x4d_fpn_1x_coco_20200130_095627.log.json) | + +**Notes:** + +- We use 8 GPUs with 2 images/GPU. +- For more settings and models, please refer to the [official repo](https://github.com/zhangxiaosong18/FreeAnchor). + +## Citation + +```latex +@inproceedings{zhang2019freeanchor, + title = {{FreeAnchor}: Learning to Match Anchors for Visual Object Detection}, + author = {Zhang, Xiaosong and Wan, Fang and Liu, Chang and Ji, Rongrong and Ye, Qixiang}, + booktitle = {Neural Information Processing Systems}, + year = {2019} +} +``` diff --git a/configs/free_anchor/metafile.yml b/configs/free_anchor/metafile.yml new file mode 100644 index 0000000..170fb5c --- /dev/null +++ b/configs/free_anchor/metafile.yml @@ -0,0 +1,79 @@ +Collections: + - Name: FreeAnchor + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FreeAnchor + - ResNet + Paper: + URL: https://arxiv.org/abs/1909.02466 + Title: 'FreeAnchor: Learning to Match Anchors for Visual Object Detection' + README: configs/free_anchor/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/dense_heads/free_anchor_retina_head.py#L10 + Version: v2.0.0 + +Models: + - Name: retinanet_free_anchor_r50_fpn_1x_coco + In Collection: FreeAnchor + Config: configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.9 + inference time (ms/im): + - value: 54.35 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco/retinanet_free_anchor_r50_fpn_1x_coco_20200130-0f67375f.pth + + - Name: retinanet_free_anchor_r101_fpn_1x_coco + In Collection: FreeAnchor + Config: configs/free_anchor/retinanet_free_anchor_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.8 + inference time (ms/im): + - value: 67.11 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/free_anchor/retinanet_free_anchor_r101_fpn_1x_coco/retinanet_free_anchor_r101_fpn_1x_coco_20200130-358324e6.pth + + - Name: retinanet_free_anchor_x101_32x4d_fpn_1x_coco + In Collection: FreeAnchor + Config: configs/free_anchor/retinanet_free_anchor_x101_32x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 8.1 + inference time (ms/im): + - value: 90.09 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/free_anchor/retinanet_free_anchor_x101_32x4d_fpn_1x_coco/retinanet_free_anchor_x101_32x4d_fpn_1x_coco_20200130-d4846968.pth diff --git a/configs/free_anchor/retinanet_free_anchor_r101_fpn_1x_coco.py b/configs/free_anchor/retinanet_free_anchor_r101_fpn_1x_coco.py new file mode 100644 index 0000000..f4aea53 --- /dev/null +++ b/configs/free_anchor/retinanet_free_anchor_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './retinanet_free_anchor_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py b/configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py new file mode 100644 index 0000000..28f983c --- /dev/null +++ b/configs/free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py @@ -0,0 +1,22 @@ +_base_ = '../retinanet/retinanet_r50_fpn_1x_coco.py' +model = dict( + bbox_head=dict( + _delete_=True, + type='FreeAnchorRetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_bbox=dict(type='SmoothL1Loss', beta=0.11, loss_weight=0.75))) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/configs/free_anchor/retinanet_free_anchor_x101_32x4d_fpn_1x_coco.py b/configs/free_anchor/retinanet_free_anchor_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..65f8a9e --- /dev/null +++ b/configs/free_anchor/retinanet_free_anchor_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,13 @@ +_base_ = './retinanet_free_anchor_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/fsaf/README.md b/configs/fsaf/README.md new file mode 100644 index 0000000..4392a6e --- /dev/null +++ b/configs/fsaf/README.md @@ -0,0 +1,57 @@ +# FSAF + +> [Feature Selective Anchor-Free Module for Single-Shot Object Detection](https://arxiv.org/abs/1903.00621) + + + +## Abstract + +We motivate and present feature selective anchor-free (FSAF) module, a simple and effective building block for single-shot object detectors. It can be plugged into single-shot detectors with feature pyramid structure. The FSAF module addresses two limitations brought up by the conventional anchor-based detection: 1) heuristic-guided feature selection; 2) overlap-based anchor sampling. The general concept of the FSAF module is online feature selection applied to the training of multi-level anchor-free branches. Specifically, an anchor-free branch is attached to each level of the feature pyramid, allowing box encoding and decoding in the anchor-free manner at an arbitrary level. During training, we dynamically assign each instance to the most suitable feature level. At the time of inference, the FSAF module can work jointly with anchor-based branches by outputting predictions in parallel. We instantiate this concept with simple implementations of anchor-free branches and online feature selection strategy. Experimental results on the COCO detection track show that our FSAF module performs better than anchor-based counterparts while being faster. When working jointly with anchor-based branches, the FSAF module robustly improves the baseline RetinaNet by a large margin under various settings, while introducing nearly free inference overhead. And the resulting best model can achieve a state-of-the-art 44.6% mAP, outperforming all existing single-shot detectors on COCO. + +
+ +
+ +## Introduction + +FSAF is an anchor-free method published in CVPR2019 ([https://arxiv.org/pdf/1903.00621.pdf](https://arxiv.org/pdf/1903.00621.pdf)). +Actually it is equivalent to the anchor-based method with only one anchor at each feature map position in each FPN level. +And this is how we implemented it. +Only the anchor-free branch is released for its better compatibility with the current framework and less computational budget. + +In the original paper, feature maps within the central 0.2-0.5 area of a gt box are tagged as ignored. However, +it is empirically found that a hard threshold (0.2-0.2) gives a further gain on the performance. (see the table below) + +## Results and Models + +### Results on R50/R101/X101-FPN + +| Backbone | ignore range | ms-train | Lr schd | Train Mem (GB) | Train time (s/iter) | Inf time (fps) | box AP | Config | Download | +| :------: | :----------: | :------: | :-----: | :------------: | :-----------------: | :------------: | :---------: | :---------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | 0.2-0.5 | N | 1x | 3.15 | 0.43 | 12.3 | 36.0 (35.9) | | [model](https://download.openmmlab.com/mmdetection/v2.0/fsaf/fsaf_pscale0.2_nscale0.5_r50_fpn_1x_coco/fsaf_pscale0.2_nscale0.5_r50_fpn_1x_coco_20200715-b555b0e0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fsaf/fsaf_pscale0.2_nscale0.5_r50_fpn_1x_coco/fsaf_pscale0.2_nscale0.5_r50_fpn_1x_coco_20200715_094657.log.json) | +| R-50 | 0.2-0.2 | N | 1x | 3.15 | 0.43 | 13.0 | 37.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fsaf/fsaf_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fsaf/fsaf_r50_fpn_1x_coco/fsaf_r50_fpn_1x_coco-94ccc51f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fsaf/fsaf_r50_fpn_1x_coco/fsaf_r50_fpn_1x_coco_20200428_072327.log.json) | +| R-101 | 0.2-0.2 | N | 1x | 5.08 | 0.58 | 10.8 | 39.3 (37.9) | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fsaf/fsaf_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fsaf/fsaf_r101_fpn_1x_coco/fsaf_r101_fpn_1x_coco-9e71098f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fsaf/fsaf_r101_fpn_1x_coco/fsaf_r101_fpn_1x_coco_20200428_160348.log.json) | +| X-101 | 0.2-0.2 | N | 1x | 9.38 | 1.23 | 5.6 | 42.4 (41.0) | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/fsaf/fsaf_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fsaf/fsaf_x101_64x4d_fpn_1x_coco/fsaf_x101_64x4d_fpn_1x_coco-e3f6e6fd.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fsaf/fsaf_x101_64x4d_fpn_1x_coco/fsaf_x101_64x4d_fpn_1x_coco_20200428_160424.log.json) | + +**Notes:** + +- *1x means the model is trained for 12 epochs.* +- *AP values in the brackets represent those reported in the original paper.* +- *All results are obtained with a single model and single-scale test.* +- *X-101 backbone represents ResNext-101-64x4d.* +- *All pretrained backbones use pytorch style.* +- *All models are trained on 8 Titan-XP gpus and tested on a single gpu.* + +## Citation + +BibTeX reference is as follows. + +```latex +@inproceedings{zhu2019feature, + title={Feature Selective Anchor-Free Module for Single-Shot Object Detection}, + author={Zhu, Chenchen and He, Yihui and Savvides, Marios}, + booktitle={Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition}, + pages={840--849}, + year={2019} +} +``` diff --git a/configs/fsaf/fsaf_r101_fpn_1x_coco.py b/configs/fsaf/fsaf_r101_fpn_1x_coco.py new file mode 100644 index 0000000..12b49fe --- /dev/null +++ b/configs/fsaf/fsaf_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './fsaf_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/fsaf/fsaf_r50_fpn_1x_coco.py b/configs/fsaf/fsaf_r50_fpn_1x_coco.py new file mode 100644 index 0000000..67f3ec1 --- /dev/null +++ b/configs/fsaf/fsaf_r50_fpn_1x_coco.py @@ -0,0 +1,48 @@ +_base_ = '../retinanet/retinanet_r50_fpn_1x_coco.py' +# model settings +model = dict( + type='FSAF', + bbox_head=dict( + type='FSAFHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + reg_decoded_bbox=True, + # Only anchor-free branch is implemented. The anchor generator only + # generates 1 anchor at each feature point, as a substitute of the + # grid of features. + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=1, + scales_per_octave=1, + ratios=[1.0], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict(_delete_=True, type='TBLRBBoxCoder', normalizer=4.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0, + reduction='none'), + loss_bbox=dict( + _delete_=True, + type='IoULoss', + eps=1e-6, + loss_weight=1.0, + reduction='none')), + # training and testing settings + train_cfg=dict( + assigner=dict( + _delete_=True, + type='CenterRegionAssigner', + pos_scale=0.2, + neg_scale=0.2, + min_pos_iof=0.01), + allowed_border=-1, + pos_weight=-1, + debug=False)) +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=10, norm_type=2)) diff --git a/configs/fsaf/fsaf_x101_64x4d_fpn_1x_coco.py b/configs/fsaf/fsaf_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..89c0c63 --- /dev/null +++ b/configs/fsaf/fsaf_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './fsaf_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/fsaf/metafile.yml b/configs/fsaf/metafile.yml new file mode 100644 index 0000000..5434e9a --- /dev/null +++ b/configs/fsaf/metafile.yml @@ -0,0 +1,80 @@ +Collections: + - Name: FSAF + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x Titan-XP GPUs + Architecture: + - FPN + - FSAF + - ResNet + Paper: + URL: https://arxiv.org/abs/1903.00621 + Title: 'Feature Selective Anchor-Free Module for Single-Shot Object Detection' + README: configs/fsaf/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/detectors/fsaf.py#L6 + Version: v2.1.0 + +Models: + - Name: fsaf_r50_fpn_1x_coco + In Collection: FSAF + Config: configs/fsaf/fsaf_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 3.15 + inference time (ms/im): + - value: 76.92 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fsaf/fsaf_r50_fpn_1x_coco/fsaf_r50_fpn_1x_coco-94ccc51f.pth + + - Name: fsaf_r101_fpn_1x_coco + In Collection: FSAF + Config: configs/fsaf/fsaf_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 5.08 + inference time (ms/im): + - value: 92.59 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.3 (37.9) + Weights: https://download.openmmlab.com/mmdetection/v2.0/fsaf/fsaf_r101_fpn_1x_coco/fsaf_r101_fpn_1x_coco-9e71098f.pth + + - Name: fsaf_x101_64x4d_fpn_1x_coco + In Collection: FSAF + Config: configs/fsaf/fsaf_x101_64x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 9.38 + inference time (ms/im): + - value: 178.57 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.4 (41.0) + Weights: https://download.openmmlab.com/mmdetection/v2.0/fsaf/fsaf_x101_64x4d_fpn_1x_coco/fsaf_x101_64x4d_fpn_1x_coco-e3f6e6fd.pth diff --git a/configs/gcnet/README.md b/configs/gcnet/README.md new file mode 100644 index 0000000..403e086 --- /dev/null +++ b/configs/gcnet/README.md @@ -0,0 +1,69 @@ +# GCNet + +> [GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond](https://arxiv.org/abs/1904.11492) + + + +## Abstract + +The Non-Local Network (NLNet) presents a pioneering approach for capturing long-range dependencies, via aggregating query-specific global context to each query position. However, through a rigorous empirical analysis, we have found that the global contexts modeled by non-local network are almost the same for different query positions within an image. In this paper, we take advantage of this finding to create a simplified network based on a query-independent formulation, which maintains the accuracy of NLNet but with significantly less computation. We further observe that this simplified design shares similar structure with Squeeze-Excitation Network (SENet). Hence we unify them into a three-step general framework for global context modeling. Within the general framework, we design a better instantiation, called the global context (GC) block, which is lightweight and can effectively model the global context. The lightweight property allows us to apply it for multiple layers in a backbone network to construct a global context network (GCNet), which generally outperforms both simplified NLNet and SENet on major benchmarks for various recognition tasks. + +
+ +
+ +## Introduction + +By [Yue Cao](http://yue-cao.me), [Jiarui Xu](http://jerryxu.net), [Stephen Lin](https://scholar.google.com/citations?user=c3PYmxUAAAAJ&hl=en), Fangyun Wei, [Han Hu](https://sites.google.com/site/hanhushomepage/). + +We provide config files to reproduce the results in the paper for +["GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond"](https://arxiv.org/abs/1904.11492) on COCO object detection. + +**GCNet** is initially described in [arxiv](https://arxiv.org/abs/1904.11492). Via absorbing advantages of Non-Local Networks (NLNet) and Squeeze-Excitation Networks (SENet), GCNet provides a simple, fast and effective approach for global context modeling, which generally outperforms both NLNet and SENet on major benchmarks for various recognition tasks. + +## Results and Models + +The results on COCO 2017val are shown in the below table. + +| Backbone | Model | Context | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------: | :---: | :------------: | :-----: | :------: | :------------: | :----: | :-----: | :-----------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | Mask | GC(c3-c5, r16) | 1x | 5.0 | | 39.7 | 35.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco_20200515_211915-187da160.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco_20200515_211915.log.json) | +| R-50-FPN | Mask | GC(c3-c5, r4) | 1x | 5.1 | 15.0 | 39.9 | 36.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco_20200204-17235656.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco_20200204_024626.log.json) | +| R-101-FPN | Mask | GC(c3-c5, r16) | 1x | 7.6 | 11.4 | 41.3 | 37.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco_20200205-e58ae947.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco_20200205_192835.log.json) | +| R-101-FPN | Mask | GC(c3-c5, r4) | 1x | 7.8 | 11.6 | 42.2 | 37.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco_20200206-af22dc9d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco_20200206_112128.log.json) | + +| Backbone | Model | Context | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------: | :--------------: | :------------: | :-----: | :------: | :------------: | :----: | :-----: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | Mask | - | 1x | 4.4 | 16.6 | 38.4 | 34.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco_20200202-bb3eb55c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco_20200202_214122.log.json) | +| R-50-FPN | Mask | GC(c3-c5, r16) | 1x | 5.0 | 15.5 | 40.4 | 36.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200202-587b99aa.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200202_174907.log.json) | +| R-50-FPN | Mask | GC(c3-c5, r4) | 1x | 5.1 | 15.1 | 40.7 | 36.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200202-50b90e5c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200202_085547.log.json) | +| R-101-FPN | Mask | - | 1x | 6.4 | 13.3 | 40.5 | 36.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco_20200210-81658c8a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco_20200210_220422.log.json) | +| R-101-FPN | Mask | GC(c3-c5, r16) | 1x | 7.6 | 12.0 | 42.2 | 37.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200207-945e77ca.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200207_015330.log.json) | +| R-101-FPN | Mask | GC(c3-c5, r4) | 1x | 7.8 | 11.8 | 42.2 | 37.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200206-8407a3f0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200206_142508.log.json) | +| X-101-FPN | Mask | - | 1x | 7.6 | 11.3 | 42.4 | 37.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco_20200211-7584841c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco_20200211_054326.log.json) | +| X-101-FPN | Mask | GC(c3-c5, r16) | 1x | 8.8 | 9.8 | 43.5 | 38.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200211-cbed3d2c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200211_164715.log.json) | +| X-101-FPN | Mask | GC(c3-c5, r4) | 1x | 9.0 | 9.7 | 43.9 | 39.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200212-68164964.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200212_070942.log.json) | +| X-101-FPN | Cascade Mask | - | 1x | 9.2 | 8.4 | 44.7 | 38.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco_20200310-d5ad2a5e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco_20200310_115217.log.json) | +| X-101-FPN | Cascade Mask | GC(c3-c5, r16) | 1x | 10.3 | 7.7 | 46.2 | 39.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200211-10bf2463.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200211_184154.log.json) | +| X-101-FPN | Cascade Mask | GC(c3-c5, r4) | 1x | 10.6 | | 46.4 | 40.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200703_180653-ed035291.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200703_180653.log.json) | +| X-101-FPN | DCN Cascade Mask | - | 1x | | | 47.5 | 40.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco_20210615_211019-abbc39ea.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco_20210615_211019.log.json) | +| X-101-FPN | DCN Cascade Mask | GC(c3-c5, r16) | 1x | | | 48.0 | 41.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco_20210615_215648-44aa598a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco_20210615_215648.log.json) | +| X-101-FPN | DCN Cascade Mask | GC(c3-c5, r4) | 1x | | | 47.9 | 41.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco_20210615_161851-720338ec.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco_20210615_161851.log.json) | + +**Notes:** + +- The `SyncBN` is added in the backbone for all models in **Table 2**. +- `GC` denotes Global Context (GC) block is inserted after 1x1 conv of backbone. +- `DCN` denotes replace 3x3 conv with 3x3 Deformable Convolution in `c3-c5` stages of backbone. +- `r4` and `r16` denote ratio 4 and ratio 16 in GC block respectively. + +## Citation + +```latex +@article{cao2019GCNet, + title={GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond}, + author={Cao, Yue and Xu, Jiarui and Lin, Stephen and Wei, Fangyun and Hu, Han}, + journal={arXiv preprint arXiv:1904.11492}, + year={2019} +} +``` diff --git a/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco.py b/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco.py new file mode 100644 index 0000000..5118895 --- /dev/null +++ b/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco.py @@ -0,0 +1,4 @@ +_base_ = '../cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), norm_eval=False)) diff --git a/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco.py b/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..413499d --- /dev/null +++ b/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco.py @@ -0,0 +1,4 @@ +_base_ = '../dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), norm_eval=False)) diff --git a/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco.py b/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..50689aa --- /dev/null +++ b/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = '../dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco.py b/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..1367231 --- /dev/null +++ b/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = '../dcn/cascade_mask_rcnn_x101_32x4d_fpn_dconv_c3-c5_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 4), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py b/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..50883ff --- /dev/null +++ b/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = '../cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py b/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..31fdd07 --- /dev/null +++ b/configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = '../cascade_rcnn/cascade_mask_rcnn_x101_32x4d_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 4), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/configs/gcnet/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco.py b/configs/gcnet/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..ad6ad47 --- /dev/null +++ b/configs/gcnet/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco.py @@ -0,0 +1,8 @@ +_base_ = '../mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict(plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/configs/gcnet/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco.py b/configs/gcnet/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..29f9167 --- /dev/null +++ b/configs/gcnet/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco.py @@ -0,0 +1,8 @@ +_base_ = '../mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict(plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 4), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco.py b/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco.py new file mode 100644 index 0000000..6e1c5d0 --- /dev/null +++ b/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco.py @@ -0,0 +1,4 @@ +_base_ = '../mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), norm_eval=False)) diff --git a/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py b/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..781dba7 --- /dev/null +++ b/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = '../mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py b/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..32972de --- /dev/null +++ b/configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = '../mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 4), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/configs/gcnet/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco.py b/configs/gcnet/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..d299b69 --- /dev/null +++ b/configs/gcnet/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco.py @@ -0,0 +1,8 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict(plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/configs/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco.py b/configs/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..5ac908e --- /dev/null +++ b/configs/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco.py @@ -0,0 +1,8 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict(plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 4), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco.py b/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco.py new file mode 100644 index 0000000..0308a56 --- /dev/null +++ b/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco.py @@ -0,0 +1,4 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), norm_eval=False)) diff --git a/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py b/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..e04780c --- /dev/null +++ b/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py b/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..980f819 --- /dev/null +++ b/configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 4), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco.py b/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco.py new file mode 100644 index 0000000..f0c96e5 --- /dev/null +++ b/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco.py @@ -0,0 +1,4 @@ +_base_ = '../mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), norm_eval=False)) diff --git a/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py b/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..7fb8e82 --- /dev/null +++ b/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = '../mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py b/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py new file mode 100644 index 0000000..b1ddbee --- /dev/null +++ b/configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = '../mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + plugins=[ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 4), + stages=(False, True, True, True), + position='after_conv3') + ])) diff --git a/configs/gcnet/metafile.yml b/configs/gcnet/metafile.yml new file mode 100644 index 0000000..1281122 --- /dev/null +++ b/configs/gcnet/metafile.yml @@ -0,0 +1,440 @@ +Collections: + - Name: GCNet + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Global Context Block + - FPN + - RPN + - ResNet + - ResNeXt + Paper: + URL: https://arxiv.org/abs/1904.11492 + Title: 'GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond' + README: configs/gcnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/ops/context_block.py#L13 + Version: v2.0.0 + +Models: + - Name: mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 5.0 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 35.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_r16_gcb_c3-c5_1x_coco_20200515_211915-187da160.pth + + - Name: mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 5.1 + inference time (ms/im): + - value: 66.67 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_r4_gcb_c3-c5_1x_coco_20200204-17235656.pth + + - Name: mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 7.6 + inference time (ms/im): + - value: 87.72 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_r16_gcb_c3-c5_1x_coco_20200205-e58ae947.pth + + - Name: mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 7.8 + inference time (ms/im): + - value: 86.21 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_r4_gcb_c3-c5_1x_coco_20200206-af22dc9d.pth + + - Name: mask_rcnn_r50_fpn_syncbn-backbone_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco.py + Metadata: + Training Memory (GB): 4.4 + inference time (ms/im): + - value: 60.24 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 34.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_1x_coco_20200202-bb3eb55c.pth + + - Name: mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 5.0 + inference time (ms/im): + - value: 64.52 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200202-587b99aa.pth + + - Name: mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 5.1 + inference time (ms/im): + - value: 66.23 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200202-50b90e5c.pth + + - Name: mask_rcnn_r101_fpn_syncbn-backbone_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco.py + Metadata: + Training Memory (GB): 6.4 + inference time (ms/im): + - value: 75.19 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_1x_coco_20200210-81658c8a.pth + + - Name: mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 7.6 + inference time (ms/im): + - value: 83.33 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200207-945e77ca.pth + + - Name: mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 7.8 + inference time (ms/im): + - value: 84.75 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200206-8407a3f0.pth + + - Name: mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco.py + Metadata: + Training Memory (GB): 7.6 + inference time (ms/im): + - value: 88.5 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco_20200211-7584841c.pth + + - Name: mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 8.8 + inference time (ms/im): + - value: 102.04 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200211-cbed3d2c.pth + + - Name: mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 9.0 + inference time (ms/im): + - value: 103.09 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200212-68164964.pth + + - Name: cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco + In Collection: GCNet + Config: configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco.py + Metadata: + Training Memory (GB): 9.2 + inference time (ms/im): + - value: 119.05 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_1x_coco_20200310-d5ad2a5e.pth + + - Name: cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 10.3 + inference time (ms/im): + - value: 129.87 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r16_gcb_c3-c5_1x_coco_20200211-10bf2463.pth + + - Name: cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 10.6 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200703_180653-ed035291.pth + + - Name: cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_1x_coco_20210615_211019-abbc39ea.pth + + - Name: cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 48.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 41.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r16_gcb_c3-c5_1x_coco_20210615_215648-44aa598a.pth + + - Name: cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco + In Collection: GCNet + Config: configs/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 41.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gcnet/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco/cascade_mask_rcnn_x101_32x4d_fpn_syncbn-backbone_dconv_c3-c5_r4_gcb_c3-c5_1x_coco_20210615_161851-720338ec.pth diff --git a/configs/gfl/README.md b/configs/gfl/README.md new file mode 100644 index 0000000..703936b --- /dev/null +++ b/configs/gfl/README.md @@ -0,0 +1,42 @@ +# GFL + +> [Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection](https://arxiv.org/abs/2006.04388) + + + +## Abstract + +One-stage detector basically formulates object detection as dense classification and localization. The classification is usually optimized by Focal Loss and the box location is commonly learned under Dirac delta distribution. A recent trend for one-stage detectors is to introduce an individual prediction branch to estimate the quality of localization, where the predicted quality facilitates the classification to improve detection performance. This paper delves into the representations of the above three fundamental elements: quality estimation, classification and localization. Two problems are discovered in existing practices, including (1) the inconsistent usage of the quality estimation and classification between training and inference and (2) the inflexible Dirac delta distribution for localization when there is ambiguity and uncertainty in complex scenes. To address the problems, we design new representations for these elements. Specifically, we merge the quality estimation into the class prediction vector to form a joint representation of localization quality and classification, and use a vector to represent arbitrary distribution of box locations. The improved representations eliminate the inconsistency risk and accurately depict the flexible distribution in real data, but contain continuous labels, which is beyond the scope of Focal Loss. We then propose Generalized Focal Loss (GFL) that generalizes Focal Loss from its discrete form to the continuous version for successful optimization. On COCO test-dev, GFL achieves 45.0% AP using ResNet-101 backbone, surpassing state-of-the-art SAPD (43.5%) and ATSS (43.6%) with higher or comparable inference speed, under the same backbone and training settings. Notably, our best model can achieve a single-model single-scale AP of 48.2%, at 10 FPS on a single 2080Ti GPU. + +
+ +
+ +## Results and Models + +| Backbone | Style | Lr schd | Multi-scale Training | Inf time (fps) | box AP | Config | Download | +| :---------------: | :-----: | :-----: | :------------------: | :------------: | :----: | :---------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | pytorch | 1x | No | 19.5 | 40.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gfl/gfl_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r50_fpn_1x_coco/gfl_r50_fpn_1x_coco_20200629_121244-25944287.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r50_fpn_1x_coco/gfl_r50_fpn_1x_coco_20200629_121244.log.json) | +| R-50 | pytorch | 2x | Yes | 19.5 | 42.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gfl/gfl_r50_fpn_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r50_fpn_mstrain_2x_coco/gfl_r50_fpn_mstrain_2x_coco_20200629_213802-37bb1edc.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r50_fpn_mstrain_2x_coco/gfl_r50_fpn_mstrain_2x_coco_20200629_213802.log.json) | +| R-101 | pytorch | 2x | Yes | 14.7 | 44.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gfl/gfl_r101_fpn_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r101_fpn_mstrain_2x_coco/gfl_r101_fpn_mstrain_2x_coco_20200629_200126-dd12f847.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r101_fpn_mstrain_2x_coco/gfl_r101_fpn_mstrain_2x_coco_20200629_200126.log.json) | +| R-101-dcnv2 | pytorch | 2x | Yes | 12.9 | 47.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gfl/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco_20200630_102002-134b07df.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco_20200630_102002.log.json) | +| X-101-32x4d | pytorch | 2x | Yes | 12.1 | 45.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gfl/gfl_x101_32x4d_fpn_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_x101_32x4d_fpn_mstrain_2x_coco/gfl_x101_32x4d_fpn_mstrain_2x_coco_20200630_102002-50c1ffdb.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_x101_32x4d_fpn_mstrain_2x_coco/gfl_x101_32x4d_fpn_mstrain_2x_coco_20200630_102002.log.json) | +| X-101-32x4d-dcnv2 | pytorch | 2x | Yes | 10.7 | 48.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gfl/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco_20200630_102002-14a2bf25.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco_20200630_102002.log.json) | + +\[1\] *1x and 2x mean the model is trained for 90K and 180K iterations, respectively.* \ +\[2\] *All results are obtained with a single model and without any test time data augmentation such as multi-scale, flipping and etc..* \ +\[3\] *`dcnv2` denotes deformable convolutional networks v2.* \ +\[4\] *FPS is tested with a single GeForce RTX 2080Ti GPU, using a batch size of 1.* + +## Citation + +We provide config files to reproduce the object detection results in the paper [Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection](https://arxiv.org/abs/2006.04388) + +```latex +@article{li2020generalized, + title={Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection}, + author={Li, Xiang and Wang, Wenhai and Wu, Lijun and Chen, Shuo and Hu, Xiaolin and Li, Jun and Tang, Jinhui and Yang, Jian}, + journal={arXiv preprint arXiv:2006.04388}, + year={2020} +} +``` diff --git a/configs/gfl/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco.py b/configs/gfl/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco.py new file mode 100644 index 0000000..b72c2b6 --- /dev/null +++ b/configs/gfl/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco.py @@ -0,0 +1,15 @@ +_base_ = './gfl_r50_fpn_mstrain_2x_coco.py' +model = dict( + backbone=dict( + type='ResNet', + depth=101, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/gfl/gfl_r101_fpn_mstrain_2x_coco.py b/configs/gfl/gfl_r101_fpn_mstrain_2x_coco.py new file mode 100644 index 0000000..e33b5c0 --- /dev/null +++ b/configs/gfl/gfl_r101_fpn_mstrain_2x_coco.py @@ -0,0 +1,13 @@ +_base_ = './gfl_r50_fpn_mstrain_2x_coco.py' +model = dict( + backbone=dict( + type='ResNet', + depth=101, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/gfl/gfl_r50_fpn_1x_coco.py b/configs/gfl/gfl_r50_fpn_1x_coco.py new file mode 100644 index 0000000..cfd4b02 --- /dev/null +++ b/configs/gfl/gfl_r50_fpn_1x_coco.py @@ -0,0 +1,57 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='GFL', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + bbox_head=dict( + type='GFLHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + loss_cls=dict( + type='QualityFocalLoss', + use_sigmoid=True, + beta=2.0, + loss_weight=1.0), + loss_dfl=dict(type='DistributionFocalLoss', loss_weight=0.25), + reg_max=16, + loss_bbox=dict(type='GIoULoss', loss_weight=2.0)), + # training and testing settings + train_cfg=dict( + assigner=dict(type='ATSSAssigner', topk=9), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/configs/gfl/gfl_r50_fpn_mstrain_2x_coco.py b/configs/gfl/gfl_r50_fpn_mstrain_2x_coco.py new file mode 100644 index 0000000..b8be601 --- /dev/null +++ b/configs/gfl/gfl_r50_fpn_mstrain_2x_coco.py @@ -0,0 +1,22 @@ +_base_ = './gfl_r50_fpn_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) +# multi-scale training +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 480), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +data = dict(train=dict(pipeline=train_pipeline)) diff --git a/configs/gfl/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco.py b/configs/gfl/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco.py new file mode 100644 index 0000000..2539807 --- /dev/null +++ b/configs/gfl/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco.py @@ -0,0 +1,18 @@ +_base_ = './gfl_r50_fpn_mstrain_2x_coco.py' +model = dict( + type='GFL', + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, False, True, True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/gfl/gfl_x101_32x4d_fpn_mstrain_2x_coco.py b/configs/gfl/gfl_x101_32x4d_fpn_mstrain_2x_coco.py new file mode 100644 index 0000000..effda19 --- /dev/null +++ b/configs/gfl/gfl_x101_32x4d_fpn_mstrain_2x_coco.py @@ -0,0 +1,16 @@ +_base_ = './gfl_r50_fpn_mstrain_2x_coco.py' +model = dict( + type='GFL', + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/gfl/metafile.yml b/configs/gfl/metafile.yml new file mode 100644 index 0000000..8f049c6 --- /dev/null +++ b/configs/gfl/metafile.yml @@ -0,0 +1,134 @@ +Collections: + - Name: Generalized Focal Loss + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Generalized Focal Loss + - FPN + - ResNet + Paper: + URL: https://arxiv.org/abs/2006.04388 + Title: 'Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection' + README: configs/gfl/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.2.0/mmdet/models/detectors/gfl.py#L6 + Version: v2.2.0 + +Models: + - Name: gfl_r50_fpn_1x_coco + In Collection: Generalized Focal Loss + Config: configs/gfl/gfl_r50_fpn_1x_coco.py + Metadata: + inference time (ms/im): + - value: 51.28 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r50_fpn_1x_coco/gfl_r50_fpn_1x_coco_20200629_121244-25944287.pth + + - Name: gfl_r50_fpn_mstrain_2x_coco + In Collection: Generalized Focal Loss + Config: configs/gfl/gfl_r50_fpn_mstrain_2x_coco.py + Metadata: + inference time (ms/im): + - value: 51.28 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r50_fpn_mstrain_2x_coco/gfl_r50_fpn_mstrain_2x_coco_20200629_213802-37bb1edc.pth + + - Name: gfl_r101_fpn_mstrain_2x_coco + In Collection: Generalized Focal Loss + Config: configs/gfl/gfl_r101_fpn_mstrain_2x_coco.py + Metadata: + inference time (ms/im): + - value: 68.03 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r101_fpn_mstrain_2x_coco/gfl_r101_fpn_mstrain_2x_coco_20200629_200126-dd12f847.pth + + - Name: gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco + In Collection: Generalized Focal Loss + Config: configs/gfl/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco.py + Metadata: + inference time (ms/im): + - value: 77.52 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco_20200630_102002-134b07df.pth + + - Name: gfl_x101_32x4d_fpn_mstrain_2x_coco + In Collection: Generalized Focal Loss + Config: configs/gfl/gfl_x101_32x4d_fpn_mstrain_2x_coco.py + Metadata: + inference time (ms/im): + - value: 82.64 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_x101_32x4d_fpn_mstrain_2x_coco/gfl_x101_32x4d_fpn_mstrain_2x_coco_20200630_102002-50c1ffdb.pth + + - Name: gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco + In Collection: Generalized Focal Loss + Config: configs/gfl/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco.py + Metadata: + inference time (ms/im): + - value: 93.46 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 48.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco/gfl_x101_32x4d_fpn_dconv_c4-c5_mstrain_2x_coco_20200630_102002-14a2bf25.pth diff --git a/configs/ghm/README.md b/configs/ghm/README.md new file mode 100644 index 0000000..cf9fb73 --- /dev/null +++ b/configs/ghm/README.md @@ -0,0 +1,33 @@ +# GHM + +> [Gradient Harmonized Single-stage Detector](https://arxiv.org/abs/1811.05181) + + + +## Abstract + +Despite the great success of two-stage detectors, single-stage detector is still a more elegant and efficient way, yet suffers from the two well-known disharmonies during training, i.e. the huge difference in quantity between positive and negative examples as well as between easy and hard examples. In this work, we first point out that the essential effect of the two disharmonies can be summarized in term of the gradient. Further, we propose a novel gradient harmonizing mechanism (GHM) to be a hedging for the disharmonies. The philosophy behind GHM can be easily embedded into both classification loss function like cross-entropy (CE) and regression loss function like smooth-L1 (SL1) loss. To this end, two novel loss functions called GHM-C and GHM-R are designed to balancing the gradient flow for anchor classification and bounding box refinement, respectively. Ablation study on MS COCO demonstrates that without laborious hyper-parameter tuning, both GHM-C and GHM-R can bring substantial improvement for single-stage detector. Without any whistles and bells, our model achieves 41.6 mAP on COCO test-dev set which surpasses the state-of-the-art method, Focal Loss (FL) + SL1, by 0.8. + +
+ +
+ +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | 1x | 4.0 | 3.3 | 37.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ghm/retinanet_ghm_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_r50_fpn_1x_coco/retinanet_ghm_r50_fpn_1x_coco_20200130-a437fda3.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_r50_fpn_1x_coco/retinanet_ghm_r50_fpn_1x_coco_20200130_004213.log.json) | +| R-101-FPN | pytorch | 1x | 6.0 | 4.4 | 39.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ghm/retinanet_ghm_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_r101_fpn_1x_coco/retinanet_ghm_r101_fpn_1x_coco_20200130-c148ee8f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_r101_fpn_1x_coco/retinanet_ghm_r101_fpn_1x_coco_20200130_145259.log.json) | +| X-101-32x4d-FPN | pytorch | 1x | 7.2 | 5.1 | 40.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ghm/retinanet_ghm_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_x101_32x4d_fpn_1x_coco/retinanet_ghm_x101_32x4d_fpn_1x_coco_20200131-e4333bd0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_x101_32x4d_fpn_1x_coco/retinanet_ghm_x101_32x4d_fpn_1x_coco_20200131_113653.log.json) | +| X-101-64x4d-FPN | pytorch | 1x | 10.3 | 5.2 | 41.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ghm/retinanet_ghm_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_x101_64x4d_fpn_1x_coco/retinanet_ghm_x101_64x4d_fpn_1x_coco_20200131-dd381cef.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_x101_64x4d_fpn_1x_coco/retinanet_ghm_x101_64x4d_fpn_1x_coco_20200131_113723.log.json) | + +## Citation + +```latex +@inproceedings{li2019gradient, + title={Gradient Harmonized Single-stage Detector}, + author={Li, Buyu and Liu, Yu and Wang, Xiaogang}, + booktitle={AAAI Conference on Artificial Intelligence}, + year={2019} +} +``` diff --git a/configs/ghm/metafile.yml b/configs/ghm/metafile.yml new file mode 100644 index 0000000..b4f488c --- /dev/null +++ b/configs/ghm/metafile.yml @@ -0,0 +1,101 @@ +Collections: + - Name: GHM + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - GHM-C + - GHM-R + - FPN + - ResNet + Paper: + URL: https://arxiv.org/abs/1811.05181 + Title: 'Gradient Harmonized Single-stage Detector' + README: configs/ghm/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/losses/ghm_loss.py#L21 + Version: v2.0.0 + +Models: + - Name: retinanet_ghm_r50_fpn_1x_coco + In Collection: GHM + Config: configs/ghm/retinanet_ghm_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.0 + inference time (ms/im): + - value: 303.03 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_r50_fpn_1x_coco/retinanet_ghm_r50_fpn_1x_coco_20200130-a437fda3.pth + + - Name: retinanet_ghm_r101_fpn_1x_coco + In Collection: GHM + Config: configs/ghm/retinanet_ghm_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.0 + inference time (ms/im): + - value: 227.27 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_r101_fpn_1x_coco/retinanet_ghm_r101_fpn_1x_coco_20200130-c148ee8f.pth + + - Name: retinanet_ghm_x101_32x4d_fpn_1x_coco + In Collection: GHM + Config: configs/ghm/retinanet_ghm_x101_32x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.2 + inference time (ms/im): + - value: 196.08 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_x101_32x4d_fpn_1x_coco/retinanet_ghm_x101_32x4d_fpn_1x_coco_20200131-e4333bd0.pth + + - Name: retinanet_ghm_x101_64x4d_fpn_1x_coco + In Collection: GHM + Config: configs/ghm/retinanet_ghm_x101_64x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 10.3 + inference time (ms/im): + - value: 192.31 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ghm/retinanet_ghm_x101_64x4d_fpn_1x_coco/retinanet_ghm_x101_64x4d_fpn_1x_coco_20200131-dd381cef.pth diff --git a/configs/ghm/retinanet_ghm_r101_fpn_1x_coco.py b/configs/ghm/retinanet_ghm_r101_fpn_1x_coco.py new file mode 100644 index 0000000..aaf6fc2 --- /dev/null +++ b/configs/ghm/retinanet_ghm_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './retinanet_ghm_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/ghm/retinanet_ghm_r50_fpn_1x_coco.py b/configs/ghm/retinanet_ghm_r50_fpn_1x_coco.py new file mode 100644 index 0000000..61b9751 --- /dev/null +++ b/configs/ghm/retinanet_ghm_r50_fpn_1x_coco.py @@ -0,0 +1,19 @@ +_base_ = '../retinanet/retinanet_r50_fpn_1x_coco.py' +model = dict( + bbox_head=dict( + loss_cls=dict( + _delete_=True, + type='GHMC', + bins=30, + momentum=0.75, + use_sigmoid=True, + loss_weight=1.0), + loss_bbox=dict( + _delete_=True, + type='GHMR', + mu=0.02, + bins=10, + momentum=0.7, + loss_weight=10.0))) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/configs/ghm/retinanet_ghm_x101_32x4d_fpn_1x_coco.py b/configs/ghm/retinanet_ghm_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..cd2e4cc --- /dev/null +++ b/configs/ghm/retinanet_ghm_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './retinanet_ghm_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/ghm/retinanet_ghm_x101_64x4d_fpn_1x_coco.py b/configs/ghm/retinanet_ghm_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..b6107d8 --- /dev/null +++ b/configs/ghm/retinanet_ghm_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './retinanet_ghm_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/gn+ws/README.md b/configs/gn+ws/README.md new file mode 100644 index 0000000..184bed3 --- /dev/null +++ b/configs/gn+ws/README.md @@ -0,0 +1,54 @@ +# GN + WS + +> [Weight Standardization](https://arxiv.org/abs/1903.10520) + + + +## Abstract + +Batch Normalization (BN) has become an out-of-box technique to improve deep network training. However, its effectiveness is limited for micro-batch training, i.e., each GPU typically has only 1-2 images for training, which is inevitable for many computer vision tasks, e.g., object detection and semantic segmentation, constrained by memory consumption. To address this issue, we propose Weight Standardization (WS) and Batch-Channel Normalization (BCN) to bring two success factors of BN into micro-batch training: 1) the smoothing effects on the loss landscape and 2) the ability to avoid harmful elimination singularities along the training trajectory. WS standardizes the weights in convolutional layers to smooth the loss landscape by reducing the Lipschitz constants of the loss and the gradients; BCN combines batch and channel normalizations and leverages estimated statistics of the activations in convolutional layers to keep networks away from elimination singularities. We validate WS and BCN on comprehensive computer vision tasks, including image classification, object detection, instance segmentation, video recognition and semantic segmentation. All experimental results consistently show that WS and BCN improve micro-batch training significantly. Moreover, using WS and BCN with micro-batch training is even able to match or outperform the performances of BN with large-batch training. + +
+ +
+ +## Results and Models + +Faster R-CNN + +| Backbone | Style | Normalization | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------------: | :-----: | :-----------: | :-----: | :------: | :------------: | :----: | :-----: | :-----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | GN+WS | 1x | 5.9 | 11.7 | 39.7 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco/faster_rcnn_r50_fpn_gn_ws-all_1x_coco_20200130-613d9fe2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco/faster_rcnn_r50_fpn_gn_ws-all_1x_coco_20200130_210936.log.json) | +| R-101-FPN | pytorch | GN+WS | 1x | 8.9 | 9.0 | 41.7 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/faster_rcnn_r101_fpn_gn_ws-all_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_r101_fpn_gn_ws-all_1x_coco/faster_rcnn_r101_fpn_gn_ws-all_1x_coco_20200205-a93b0d75.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_r101_fpn_gn_ws-all_1x_coco/faster_rcnn_r101_fpn_gn_ws-all_1x_coco_20200205_232146.log.json) | +| X-50-32x4d-FPN | pytorch | GN+WS | 1x | 7.0 | 10.3 | 40.7 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco_20200203-839c5d9d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco_20200203_220113.log.json) | +| X-101-32x4d-FPN | pytorch | GN+WS | 1x | 10.8 | 7.6 | 42.1 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco_20200212-27da1bc2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco_20200212_195302.log.json) | + +Mask R-CNN + +| Backbone | Style | Normalization | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------------: | :-----: | :-----------: | :-------: | :------: | :------------: | :----: | :-----: | :----------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | GN+WS | 2x | 7.3 | 10.5 | 40.6 | 36.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco/mask_rcnn_r50_fpn_gn_ws-all_2x_coco_20200226-16acb762.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco/mask_rcnn_r50_fpn_gn_ws-all_2x_coco_20200226_062128.log.json) | +| R-101-FPN | pytorch | GN+WS | 2x | 10.3 | 8.6 | 42.0 | 37.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/mask_rcnn_r101_fpn_gn_ws-all_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r101_fpn_gn_ws-all_2x_coco/mask_rcnn_r101_fpn_gn_ws-all_2x_coco_20200212-ea357cd9.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r101_fpn_gn_ws-all_2x_coco/mask_rcnn_r101_fpn_gn_ws-all_2x_coco_20200212_213627.log.json) | +| X-50-32x4d-FPN | pytorch | GN+WS | 2x | 8.4 | 9.3 | 41.1 | 37.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco_20200216-649fdb6f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco_20200216_201500.log.json) | +| X-101-32x4d-FPN | pytorch | GN+WS | 2x | 12.2 | 7.1 | 42.1 | 37.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco_20200319-33fb95b5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco_20200319_104101.log.json) | +| R-50-FPN | pytorch | GN+WS | 20-23-24e | 7.3 | - | 41.1 | 37.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco_20200213-487d1283.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco_20200213_035123.log.json) | +| R-101-FPN | pytorch | GN+WS | 20-23-24e | 10.3 | - | 43.1 | 38.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco_20200213-57b5a50f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco_20200213_130142.log.json) | +| X-50-32x4d-FPN | pytorch | GN+WS | 20-23-24e | 8.4 | - | 42.1 | 38.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco_20200226-969bcb2c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco_20200226_093732.log.json) | +| X-101-32x4d-FPN | pytorch | GN+WS | 20-23-24e | 12.2 | - | 42.7 | 38.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn%2Bws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco_20200316-e6cd35ef.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco_20200316_013741.log.json) | + +Note: + +- GN+WS requires about 5% more memory than GN, and it is only 5% slower than GN. +- In the paper, a 20-23-24e lr schedule is used instead of 2x. +- The X-50-GN and X-101-GN pretrained models are also shared by the authors. + +## Citation + +```latex +@article{weightstandardization, + author = {Siyuan Qiao and Huiyu Wang and Chenxi Liu and Wei Shen and Alan Yuille}, + title = {Weight Standardization}, + journal = {arXiv preprint arXiv:1903.10520}, + year = {2019}, +} +``` diff --git a/configs/gn+ws/faster_rcnn_r101_fpn_gn_ws-all_1x_coco.py b/configs/gn+ws/faster_rcnn_r101_fpn_gn_ws-all_1x_coco.py new file mode 100644 index 0000000..cd2cb2b --- /dev/null +++ b/configs/gn+ws/faster_rcnn_r101_fpn_gn_ws-all_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://jhu/resnet101_gn_ws'))) diff --git a/configs/gn+ws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py b/configs/gn+ws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py new file mode 100644 index 0000000..1b326b8 --- /dev/null +++ b/configs/gn+ws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py @@ -0,0 +1,16 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +conv_cfg = dict(type='ConvWS') +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + backbone=dict( + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://jhu/resnet50_gn_ws')), + neck=dict(conv_cfg=conv_cfg, norm_cfg=norm_cfg), + roi_head=dict( + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + conv_out_channels=256, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg))) diff --git a/configs/gn+ws/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco.py b/configs/gn+ws/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco.py new file mode 100644 index 0000000..f64ae89 --- /dev/null +++ b/configs/gn+ws/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco.py @@ -0,0 +1,18 @@ +_base_ = './faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py' +conv_cfg = dict(type='ConvWS') +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + style='pytorch', + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://jhu/resnext101_32x4d_gn_ws'))) diff --git a/configs/gn+ws/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco.py b/configs/gn+ws/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco.py new file mode 100644 index 0000000..246851b --- /dev/null +++ b/configs/gn+ws/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco.py @@ -0,0 +1,18 @@ +_base_ = './faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py' +conv_cfg = dict(type='ConvWS') +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + backbone=dict( + type='ResNeXt', + depth=50, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + style='pytorch', + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://jhu/resnext50_32x4d_gn_ws'))) diff --git a/configs/gn+ws/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco.py b/configs/gn+ws/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco.py new file mode 100644 index 0000000..a790d93 --- /dev/null +++ b/configs/gn+ws/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco.py @@ -0,0 +1,4 @@ +_base_ = './mask_rcnn_r101_fpn_gn_ws-all_2x_coco.py' +# learning policy +lr_config = dict(step=[20, 23]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/gn+ws/mask_rcnn_r101_fpn_gn_ws-all_2x_coco.py b/configs/gn+ws/mask_rcnn_r101_fpn_gn_ws-all_2x_coco.py new file mode 100644 index 0000000..a9fa6a2 --- /dev/null +++ b/configs/gn+ws/mask_rcnn_r101_fpn_gn_ws-all_2x_coco.py @@ -0,0 +1,6 @@ +_base_ = './mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://jhu/resnet101_gn_ws'))) diff --git a/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco.py b/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco.py new file mode 100644 index 0000000..5516808 --- /dev/null +++ b/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco.py @@ -0,0 +1,4 @@ +_base_ = './mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py' +# learning policy +lr_config = dict(step=[20, 23]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py b/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py new file mode 100644 index 0000000..63be60f --- /dev/null +++ b/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py @@ -0,0 +1,20 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +conv_cfg = dict(type='ConvWS') +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + backbone=dict( + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://jhu/resnet50_gn_ws')), + neck=dict(conv_cfg=conv_cfg, norm_cfg=norm_cfg), + roi_head=dict( + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + conv_out_channels=256, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg), + mask_head=dict(conv_cfg=conv_cfg, norm_cfg=norm_cfg))) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/gn+ws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco.py b/configs/gn+ws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco.py new file mode 100644 index 0000000..cfa14c9 --- /dev/null +++ b/configs/gn+ws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco.py @@ -0,0 +1,4 @@ +_base_ = './mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco.py' +# learning policy +lr_config = dict(step=[20, 23]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/gn+ws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco.py b/configs/gn+ws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco.py new file mode 100644 index 0000000..6498b03 --- /dev/null +++ b/configs/gn+ws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco.py @@ -0,0 +1,19 @@ +_base_ = './mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py' +# model settings +conv_cfg = dict(type='ConvWS') +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + style='pytorch', + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://jhu/resnext101_32x4d_gn_ws'))) diff --git a/configs/gn+ws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco.py b/configs/gn+ws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco.py new file mode 100644 index 0000000..79ce0ad --- /dev/null +++ b/configs/gn+ws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco.py @@ -0,0 +1,4 @@ +_base_ = './mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco.py' +# learning policy +lr_config = dict(step=[20, 23]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/gn+ws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco.py b/configs/gn+ws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco.py new file mode 100644 index 0000000..7fac317 --- /dev/null +++ b/configs/gn+ws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco.py @@ -0,0 +1,19 @@ +_base_ = './mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py' +# model settings +conv_cfg = dict(type='ConvWS') +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + backbone=dict( + type='ResNeXt', + depth=50, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + style='pytorch', + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://jhu/resnext50_32x4d_gn_ws'))) diff --git a/configs/gn+ws/metafile.yml b/configs/gn+ws/metafile.yml new file mode 100644 index 0000000..6cfcb07 --- /dev/null +++ b/configs/gn+ws/metafile.yml @@ -0,0 +1,263 @@ +Collections: + - Name: Weight Standardization + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Group Normalization + - Weight Standardization + Paper: + URL: https://arxiv.org/abs/1903.10520 + Title: 'Weight Standardization' + README: configs/gn+ws/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py + Version: v2.0.0 + +Models: + - Name: faster_rcnn_r50_fpn_gn_ws-all_1x_coco + In Collection: Weight Standardization + Config: configs/gn+ws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco.py + Metadata: + Training Memory (GB): 5.9 + inference time (ms/im): + - value: 85.47 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_r50_fpn_gn_ws-all_1x_coco/faster_rcnn_r50_fpn_gn_ws-all_1x_coco_20200130-613d9fe2.pth + + - Name: faster_rcnn_r101_fpn_gn_ws-all_1x_coco + In Collection: Weight Standardization + Config: configs/gn+ws/faster_rcnn_r101_fpn_gn_ws-all_1x_coco.py + Metadata: + Training Memory (GB): 8.9 + inference time (ms/im): + - value: 111.11 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_r101_fpn_gn_ws-all_1x_coco/faster_rcnn_r101_fpn_gn_ws-all_1x_coco_20200205-a93b0d75.pth + + - Name: faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco + In Collection: Weight Standardization + Config: configs/gn+ws/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco.py + Metadata: + Training Memory (GB): 7.0 + inference time (ms/im): + - value: 97.09 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco/faster_rcnn_x50_32x4d_fpn_gn_ws-all_1x_coco_20200203-839c5d9d.pth + + - Name: faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco + In Collection: Weight Standardization + Config: configs/gn+ws/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco.py + Metadata: + Training Memory (GB): 10.8 + inference time (ms/im): + - value: 131.58 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco/faster_rcnn_x101_32x4d_fpn_gn_ws-all_1x_coco_20200212-27da1bc2.pth + + - Name: mask_rcnn_r50_fpn_gn_ws-all_2x_coco + In Collection: Weight Standardization + Config: configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco.py + Metadata: + Training Memory (GB): 7.3 + inference time (ms/im): + - value: 95.24 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r50_fpn_gn_ws-all_2x_coco/mask_rcnn_r50_fpn_gn_ws-all_2x_coco_20200226-16acb762.pth + + - Name: mask_rcnn_r101_fpn_gn_ws-all_2x_coco + In Collection: Weight Standardization + Config: configs/gn+ws/mask_rcnn_r101_fpn_gn_ws-all_2x_coco.py + Metadata: + Training Memory (GB): 10.3 + inference time (ms/im): + - value: 116.28 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r101_fpn_gn_ws-all_2x_coco/mask_rcnn_r101_fpn_gn_ws-all_2x_coco_20200212-ea357cd9.pth + + - Name: mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco + In Collection: Weight Standardization + Config: configs/gn+ws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco.py + Metadata: + Training Memory (GB): 8.4 + inference time (ms/im): + - value: 107.53 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco/mask_rcnn_x50_32x4d_fpn_gn_ws-all_2x_coco_20200216-649fdb6f.pth + + - Name: mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco + In Collection: Weight Standardization + Config: configs/gn+ws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco.py + Metadata: + Training Memory (GB): 12.2 + inference time (ms/im): + - value: 140.85 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco/mask_rcnn_x101_32x4d_fpn_gn_ws-all_2x_coco_20200319-33fb95b5.pth + + - Name: mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco + In Collection: Weight Standardization + Config: configs/gn+ws/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco.py + Metadata: + Training Memory (GB): 7.3 + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_r50_fpn_gn_ws-all_20_23_24e_coco_20200213-487d1283.pth + + - Name: mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco + In Collection: Weight Standardization + Config: configs/gn+ws/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco.py + Metadata: + Training Memory (GB): 10.3 + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_r101_fpn_gn_ws-all_20_23_24e_coco_20200213-57b5a50f.pth + + - Name: mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco + In Collection: Weight Standardization + Config: configs/gn+ws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco.py + Metadata: + Training Memory (GB): 8.4 + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_x50_32x4d_fpn_gn_ws-all_20_23_24e_coco_20200226-969bcb2c.pth + + - Name: mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco + In Collection: Weight Standardization + Config: configs/gn+ws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco.py + Metadata: + Training Memory (GB): 12.2 + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn%2Bws/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco/mask_rcnn_x101_32x4d_fpn_gn_ws-all_20_23_24e_coco_20200316-e6cd35ef.pth diff --git a/configs/gn/README.md b/configs/gn/README.md new file mode 100644 index 0000000..9bb2888 --- /dev/null +++ b/configs/gn/README.md @@ -0,0 +1,41 @@ +# GN + +> [Group Normalization](https://arxiv.org/abs/1803.08494) + + + +## Abstract + +Batch Normalization (BN) is a milestone technique in the development of deep learning, enabling various networks to train. However, normalizing along the batch dimension introduces problems --- BN's error increases rapidly when the batch size becomes smaller, caused by inaccurate batch statistics estimation. This limits BN's usage for training larger models and transferring features to computer vision tasks including detection, segmentation, and video, which require small batches constrained by memory consumption. In this paper, we present Group Normalization (GN) as a simple alternative to BN. GN divides the channels into groups and computes within each group the mean and variance for normalization. GN's computation is independent of batch sizes, and its accuracy is stable in a wide range of batch sizes. On ResNet-50 trained in ImageNet, GN has 10.6% lower error than its BN counterpart when using a batch size of 2; when using typical batch sizes, GN is comparably good with BN and outperforms other normalization variants. Moreover, GN can be naturally transferred from pre-training to fine-tuning. GN can outperform its BN-based counterparts for object detection and segmentation in COCO, and for video classification in Kinetics, showing that GN can effectively replace the powerful BN in a variety of tasks. GN can be easily implemented by a few lines of code in modern libraries. + +
+ +
+ +## Results and Models + +| Backbone | model | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-----------: | :--------: | :-----: | :------: | :------------: | :----: | :-----: | :--------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN (d) | Mask R-CNN | 2x | 7.1 | 11.0 | 40.2 | 36.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_2x_coco/mask_rcnn_r50_fpn_gn-all_2x_coco_20200206-8eee02a6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_2x_coco/mask_rcnn_r50_fpn_gn-all_2x_coco_20200206_050355.log.json) | +| R-50-FPN (d) | Mask R-CNN | 3x | 7.1 | - | 40.5 | 36.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn/mask_rcnn_r50_fpn_gn-all_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_3x_coco/mask_rcnn_r50_fpn_gn-all_3x_coco_20200214-8b23b1e5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_3x_coco/mask_rcnn_r50_fpn_gn-all_3x_coco_20200214_063512.log.json) | +| R-101-FPN (d) | Mask R-CNN | 2x | 9.9 | 9.0 | 41.9 | 37.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn/mask_rcnn_r101_fpn_gn-all_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r101_fpn_gn-all_2x_coco/mask_rcnn_r101_fpn_gn-all_2x_coco_20200205-d96b1b50.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r101_fpn_gn-all_2x_coco/mask_rcnn_r101_fpn_gn-all_2x_coco_20200205_234402.log.json) | +| R-101-FPN (d) | Mask R-CNN | 3x | 9.9 | | 42.1 | 38.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn/mask_rcnn_r101_fpn_gn-all_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r101_fpn_gn-all_3x_coco/mask_rcnn_r101_fpn_gn-all_3x_coco_20200513_181609-0df864f4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r101_fpn_gn-all_3x_coco/mask_rcnn_r101_fpn_gn-all_3x_coco_20200513_181609.log.json) | +| R-50-FPN (c) | Mask R-CNN | 2x | 7.1 | 10.9 | 40.0 | 36.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco_20200207-20d3e849.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco_20200207_225832.log.json) | +| R-50-FPN (c) | Mask R-CNN | 3x | 7.1 | - | 40.1 | 36.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/gn/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco_20200225-542aefbc.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco_20200225_235135.log.json) | + +**Notes:** + +- (d) means pretrained model converted from Detectron, and (c) means the contributed model pretrained by [@thangvubk](https://github.com/thangvubk). +- The `3x` schedule is epoch \[28, 34, 36\]. +- **Memory, Train/Inf time is outdated.** + +## Citation + +```latex +@inproceedings{wu2018group, + title={Group Normalization}, + author={Wu, Yuxin and He, Kaiming}, + booktitle={Proceedings of the European Conference on Computer Vision (ECCV)}, + year={2018} +} +``` diff --git a/configs/gn/mask_rcnn_r101_fpn_gn-all_2x_coco.py b/configs/gn/mask_rcnn_r101_fpn_gn-all_2x_coco.py new file mode 100644 index 0000000..a505ba0 --- /dev/null +++ b/configs/gn/mask_rcnn_r101_fpn_gn-all_2x_coco.py @@ -0,0 +1,7 @@ +_base_ = './mask_rcnn_r50_fpn_gn-all_2x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron/resnet101_gn'))) diff --git a/configs/gn/mask_rcnn_r101_fpn_gn-all_3x_coco.py b/configs/gn/mask_rcnn_r101_fpn_gn-all_3x_coco.py new file mode 100644 index 0000000..12a9d17 --- /dev/null +++ b/configs/gn/mask_rcnn_r101_fpn_gn-all_3x_coco.py @@ -0,0 +1,5 @@ +_base_ = './mask_rcnn_r101_fpn_gn-all_2x_coco.py' + +# learning policy +lr_config = dict(step=[28, 34]) +runner = dict(type='EpochBasedRunner', max_epochs=36) diff --git a/configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py b/configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py new file mode 100644 index 0000000..1de7d98 --- /dev/null +++ b/configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py @@ -0,0 +1,49 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + backbone=dict( + norm_cfg=norm_cfg, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron/resnet50_gn')), + neck=dict(norm_cfg=norm_cfg), + roi_head=dict( + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + conv_out_channels=256, + norm_cfg=norm_cfg), + mask_head=dict(norm_cfg=norm_cfg))) +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/gn/mask_rcnn_r50_fpn_gn-all_3x_coco.py b/configs/gn/mask_rcnn_r50_fpn_gn-all_3x_coco.py new file mode 100644 index 0000000..f917719 --- /dev/null +++ b/configs/gn/mask_rcnn_r50_fpn_gn-all_3x_coco.py @@ -0,0 +1,5 @@ +_base_ = './mask_rcnn_r50_fpn_gn-all_2x_coco.py' + +# learning policy +lr_config = dict(step=[28, 34]) +runner = dict(type='EpochBasedRunner', max_epochs=36) diff --git a/configs/gn/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco.py b/configs/gn/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco.py new file mode 100644 index 0000000..2f430fd --- /dev/null +++ b/configs/gn/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco.py @@ -0,0 +1,17 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + backbone=dict( + norm_cfg=norm_cfg, + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://contrib/resnet50_gn')), + neck=dict(norm_cfg=norm_cfg), + roi_head=dict( + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + conv_out_channels=256, + norm_cfg=norm_cfg), + mask_head=dict(norm_cfg=norm_cfg))) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/gn/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco.py b/configs/gn/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco.py new file mode 100644 index 0000000..66834f0 --- /dev/null +++ b/configs/gn/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco.py @@ -0,0 +1,5 @@ +_base_ = './mask_rcnn_r50_fpn_gn-all_contrib_2x_coco.py' + +# learning policy +lr_config = dict(step=[28, 34]) +runner = dict(type='EpochBasedRunner', max_epochs=36) diff --git a/configs/gn/metafile.yml b/configs/gn/metafile.yml new file mode 100644 index 0000000..4a1ecae --- /dev/null +++ b/configs/gn/metafile.yml @@ -0,0 +1,162 @@ +Collections: + - Name: Group Normalization + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Group Normalization + Paper: + URL: https://arxiv.org/abs/1803.08494 + Title: 'Group Normalization' + README: configs/gn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py + Version: v2.0.0 + +Models: + - Name: mask_rcnn_r50_fpn_gn-all_2x_coco + In Collection: Group Normalization + Config: configs/gn/mask_rcnn_r50_fpn_gn-all_2x_coco.py + Metadata: + Training Memory (GB): 7.1 + inference time (ms/im): + - value: 90.91 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_2x_coco/mask_rcnn_r50_fpn_gn-all_2x_coco_20200206-8eee02a6.pth + + - Name: mask_rcnn_r50_fpn_gn-all_3x_coco + In Collection: Group Normalization + Config: configs/gn/mask_rcnn_r50_fpn_gn-all_3x_coco.py + Metadata: + Training Memory (GB): 7.1 + inference time (ms/im): + - value: 90.91 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_3x_coco/mask_rcnn_r50_fpn_gn-all_3x_coco_20200214-8b23b1e5.pth + + - Name: mask_rcnn_r101_fpn_gn-all_2x_coco + In Collection: Group Normalization + Config: configs/gn/mask_rcnn_r101_fpn_gn-all_2x_coco.py + Metadata: + Training Memory (GB): 9.9 + inference time (ms/im): + - value: 111.11 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r101_fpn_gn-all_2x_coco/mask_rcnn_r101_fpn_gn-all_2x_coco_20200205-d96b1b50.pth + + - Name: mask_rcnn_r101_fpn_gn-all_3x_coco + In Collection: Group Normalization + Config: configs/gn/mask_rcnn_r101_fpn_gn-all_3x_coco.py + Metadata: + Training Memory (GB): 9.9 + inference time (ms/im): + - value: 111.11 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r101_fpn_gn-all_3x_coco/mask_rcnn_r101_fpn_gn-all_3x_coco_20200513_181609-0df864f4.pth + + - Name: mask_rcnn_r50_fpn_gn-all_contrib_2x_coco + In Collection: Group Normalization + Config: configs/gn/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco.py + Metadata: + Training Memory (GB): 7.1 + inference time (ms/im): + - value: 91.74 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco/mask_rcnn_r50_fpn_gn-all_contrib_2x_coco_20200207-20d3e849.pth + + - Name: mask_rcnn_r50_fpn_gn-all_contrib_3x_coco + In Collection: Group Normalization + Config: configs/gn/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco.py + Metadata: + Training Memory (GB): 7.1 + inference time (ms/im): + - value: 91.74 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/gn/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco/mask_rcnn_r50_fpn_gn-all_contrib_3x_coco_20200225-542aefbc.pth diff --git a/configs/grid_rcnn/README.md b/configs/grid_rcnn/README.md new file mode 100644 index 0000000..e844021 --- /dev/null +++ b/configs/grid_rcnn/README.md @@ -0,0 +1,47 @@ +# Grid R-CNN + +> [Grid R-CNN](https://arxiv.org/abs/1811.12030) + + + +## Abstract + +This paper proposes a novel object detection framework named Grid R-CNN, which adopts a grid guided localization mechanism for accurate object detection. Different from the traditional regression based methods, the Grid R-CNN captures the spatial information explicitly and enjoys the position sensitive property of fully convolutional architecture. Instead of using only two independent points, we design a multi-point supervision formulation to encode more clues in order to reduce the impact of inaccurate prediction of specific points. To take the full advantage of the correlation of points in a grid, we propose a two-stage information fusion strategy to fuse feature maps of neighbor grid points. The grid guided localization approach is easy to be extended to different state-of-the-art detection frameworks. Grid R-CNN leads to high quality object localization, and experiments demonstrate that it achieves a 4.1% AP gain at IoU=0.8 and a 10.0% AP gain at IoU=0.9 on COCO benchmark compared to Faster R-CNN with Res50 backbone and FPN architecture. + +Grid R-CNN is a well-performed objection detection framework. It transforms the traditional box offset regression problem into a grid point estimation problem. With the guidance of the grid points, it can obtain high-quality localization results. However, the speed of Grid R-CNN is not so satisfactory. In this technical report we present Grid R-CNN Plus, a better and faster version of Grid R-CNN. We have made several updates that significantly speed up the framework and simultaneously improve the accuracy. On COCO dataset, the Res50-FPN based Grid R-CNN Plus detector achieves an mAP of 40.4%, outperforming the baseline on the same model by 3.0 points with similar inference time. + +
+ +
+ +## Results and Models + +| Backbone | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :---------: | :-----: | :------: | :------------: | :----: | :---------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | 2x | 5.1 | 15.0 | 40.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco/grid_rcnn_r50_fpn_gn-head_2x_coco_20200130-6cca8223.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco/grid_rcnn_r50_fpn_gn-head_2x_coco_20200130_221140.log.json) | +| R-101 | 2x | 7.0 | 12.6 | 41.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/grid_rcnn/grid_rcnn_r101_fpn_gn-head_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_r101_fpn_gn-head_2x_coco/grid_rcnn_r101_fpn_gn-head_2x_coco_20200309-d6eca030.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_r101_fpn_gn-head_2x_coco/grid_rcnn_r101_fpn_gn-head_2x_coco_20200309_164224.log.json) | +| X-101-32x4d | 2x | 8.3 | 10.8 | 42.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/grid_rcnn/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco_20200130-d8f0e3ff.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco_20200130_215413.log.json) | +| X-101-64x4d | 2x | 11.3 | 7.7 | 43.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/grid_rcnn/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco_20200204-ec76a754.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco_20200204_080641.log.json) | + +**Notes:** + +- All models are trained with 8 GPUs instead of 32 GPUs in the original paper. +- The warming up lasts for 1 epoch and `2x` here indicates 25 epochs. + +## Citation + +```latex +@inproceedings{lu2019grid, + title={Grid r-cnn}, + author={Lu, Xin and Li, Buyu and Yue, Yuxin and Li, Quanquan and Yan, Junjie}, + booktitle={Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition}, + year={2019} +} + +@article{lu2019grid, + title={Grid R-CNN Plus: Faster and Better}, + author={Lu, Xin and Li, Buyu and Yue, Yuxin and Li, Quanquan and Yan, Junjie}, + journal={arXiv preprint arXiv:1906.05688}, + year={2019} +} +``` diff --git a/configs/grid_rcnn/grid_rcnn_r101_fpn_gn-head_2x_coco.py b/configs/grid_rcnn/grid_rcnn_r101_fpn_gn-head_2x_coco.py new file mode 100644 index 0000000..1bb5889 --- /dev/null +++ b/configs/grid_rcnn/grid_rcnn_r101_fpn_gn-head_2x_coco.py @@ -0,0 +1,7 @@ +_base_ = './grid_rcnn_r50_fpn_gn-head_2x_coco.py' + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_1x_coco.py b/configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_1x_coco.py new file mode 100644 index 0000000..4aa00ec --- /dev/null +++ b/configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = ['grid_rcnn_r50_fpn_gn-head_2x_coco.py'] +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[8, 11]) +checkpoint_config = dict(interval=1) +# runtime settings +runner = dict(type='EpochBasedRunner', max_epochs=12) diff --git a/configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py b/configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py new file mode 100644 index 0000000..df63cd5 --- /dev/null +++ b/configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py @@ -0,0 +1,131 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', '../_base_/default_runtime.py' +] +# model settings +model = dict( + type='GridRCNN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), + roi_head=dict( + type='GridRoIHead', + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=dict( + type='Shared2FCBBoxHead', + with_reg=False, + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False), + grid_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + grid_head=dict( + type='GridHead', + grid_points=9, + num_convs=8, + in_channels=256, + point_feat_channels=64, + norm_cfg=dict(type='GN', num_groups=36), + loss_grid=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=15))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=0, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + pos_radius=1, + pos_weight=-1, + max_num_grid=192, + debug=False)), + test_cfg=dict( + rpn=dict( + nms_pre=1000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.03, + nms=dict(type='nms', iou_threshold=0.3), + max_per_img=100))) +# optimizer +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=3665, + warmup_ratio=1.0 / 80, + step=[17, 23]) +runner = dict(type='EpochBasedRunner', max_epochs=25) diff --git a/configs/grid_rcnn/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco.py b/configs/grid_rcnn/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco.py new file mode 100644 index 0000000..3bc8516 --- /dev/null +++ b/configs/grid_rcnn/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco.py @@ -0,0 +1,24 @@ +_base_ = './grid_rcnn_r50_fpn_gn-head_2x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) +# optimizer +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=3665, + warmup_ratio=1.0 / 80, + step=[17, 23]) +runner = dict(type='EpochBasedRunner', max_epochs=25) diff --git a/configs/grid_rcnn/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco.py b/configs/grid_rcnn/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco.py new file mode 100644 index 0000000..c78f8f6 --- /dev/null +++ b/configs/grid_rcnn/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco.py @@ -0,0 +1,13 @@ +_base_ = './grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/grid_rcnn/metafile.yml b/configs/grid_rcnn/metafile.yml new file mode 100644 index 0000000..d1aa851 --- /dev/null +++ b/configs/grid_rcnn/metafile.yml @@ -0,0 +1,101 @@ +Collections: + - Name: Grid R-CNN + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RPN + - Dilated Convolution + - ResNet + - RoIAlign + Paper: + URL: https://arxiv.org/abs/1906.05688 + Title: 'Grid R-CNN' + README: configs/grid_rcnn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/detectors/grid_rcnn.py#L6 + Version: v2.0.0 + +Models: + - Name: grid_rcnn_r50_fpn_gn-head_2x_coco + In Collection: Grid R-CNN + Config: configs/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py + Metadata: + Training Memory (GB): 5.1 + inference time (ms/im): + - value: 66.67 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco/grid_rcnn_r50_fpn_gn-head_2x_coco_20200130-6cca8223.pth + + - Name: grid_rcnn_r101_fpn_gn-head_2x_coco + In Collection: Grid R-CNN + Config: configs/grid_rcnn/grid_rcnn_r101_fpn_gn-head_2x_coco.py + Metadata: + Training Memory (GB): 7.0 + inference time (ms/im): + - value: 79.37 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_r101_fpn_gn-head_2x_coco/grid_rcnn_r101_fpn_gn-head_2x_coco_20200309-d6eca030.pth + + - Name: grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco + In Collection: Grid R-CNN + Config: configs/grid_rcnn/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco.py + Metadata: + Training Memory (GB): 8.3 + inference time (ms/im): + - value: 92.59 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco/grid_rcnn_x101_32x4d_fpn_gn-head_2x_coco_20200130-d8f0e3ff.pth + + - Name: grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco + In Collection: Grid R-CNN + Config: configs/grid_rcnn/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco.py + Metadata: + Training Memory (GB): 11.3 + inference time (ms/im): + - value: 129.87 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/grid_rcnn/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco/grid_rcnn_x101_64x4d_fpn_gn-head_2x_coco_20200204-ec76a754.pth diff --git a/configs/groie/README.md b/configs/groie/README.md new file mode 100644 index 0000000..126773f --- /dev/null +++ b/configs/groie/README.md @@ -0,0 +1,72 @@ +# GRoIE + +> [A novel Region of Interest Extraction Layer for Instance Segmentation](https://arxiv.org/abs/2004.13665) + + + +## Abstract + +Given the wide diffusion of deep neural network architectures for computer vision tasks, several new applications are nowadays more and more feasible. Among them, a particular attention has been recently given to instance segmentation, by exploiting the results achievable by two-stage networks (such as Mask R-CNN or Faster R-CNN), derived from R-CNN. In these complex architectures, a crucial role is played by the Region of Interest (RoI) extraction layer, devoted to extracting a coherent subset of features from a single Feature Pyramid Network (FPN) layer attached on top of a backbone. +This paper is motivated by the need to overcome the limitations of existing RoI extractors which select only one (the best) layer from FPN. Our intuition is that all the layers of FPN retain useful information. Therefore, the proposed layer (called Generic RoI Extractor - GRoIE) introduces non-local building blocks and attention mechanisms to boost the performance. +A comprehensive ablation study at component level is conducted to find the best set of algorithms and parameters for the GRoIE layer. Moreover, GRoIE can be integrated seamlessly with every two-stage architecture for both object detection and instance segmentation tasks. Therefore, the improvements brought about by the use of GRoIE in different state-of-the-art architectures are also evaluated. The proposed layer leads up to gain a 1.1% AP improvement on bounding box detection and 1.7% AP improvement on instance segmentation. + +
+ +
+ +## Introduction + +By Leonardo Rossi, Akbar Karimi and Andrea Prati from +[IMPLab](http://implab.ce.unipr.it/). + +We provide configs to reproduce the results in the paper for +"*A novel Region of Interest Extraction Layer for Instance Segmentation*" +on COCO object detection. + +This paper is motivated by the need to overcome to the limitations of existing +RoI extractors which select only one (the best) layer from FPN. + +Our intuition is that all the layers of FPN retain useful information. + +Therefore, the proposed layer (called Generic RoI Extractor - **GRoIE**) +introduces non-local building blocks and attention mechanisms to boost the +performance. + +## Results and Models + +The results on COCO 2017 minival (5k images) are shown in the below table. + +### Application of GRoIE to different architectures + +| Backbone | Method | Lr schd | box AP | mask AP | Config | Download | +| :-------: | :-------------: | :-----: | :----: | :-----: | :---------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | Faster Original | 1x | 37.4 | | [config](../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130_204655.log.json) | +| R-50-FPN | + GRoIE | 1x | 38.3 | | [config](./faster_rcnn_r50_fpn_groie_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/groie/faster_rcnn_r50_fpn_groie_1x_coco/faster_rcnn_r50_fpn_groie_1x_coco_20200604_211715-66ee9516.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/groie/faster_rcnn_r50_fpn_groie_1x_coco/faster_rcnn_r50_fpn_groie_1x_coco_20200604_211715.log.json) | +| R-50-FPN | Grid R-CNN | 1x | 39.1 | | [config](./grid_rcnn_r50_fpn_gn-head_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/groie/grid_rcnn_r50_fpn_gn-head_groie_1x_coco/grid_rcnn_r50_fpn_gn-head_groie_1x_coco_20200605_202059-4b75d86f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/groie/grid_rcnn_r50_fpn_gn-head_groie_1x_coco/grid_rcnn_r50_fpn_gn-head_groie_1x_coco_20200605_202059.log.json) | +| R-50-FPN | + GRoIE | 1x | | | [config](./grid_rcnn_r50_fpn_gn-head_groie_1x_coco.py) | | +| R-50-FPN | Mask R-CNN | 1x | 38.2 | 34.7 | [config](../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_1x_coco/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_1x_coco/mask_rcnn_r50_fpn_1x_coco_20200205_050542.log.json) | +| R-50-FPN | + GRoIE | 1x | 39.0 | 36.0 | [config](./mask_rcnn_r50_fpn_groie_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/groie/mask_rcnn_r50_fpn_groie_1x_coco/mask_rcnn_r50_fpn_groie_1x_coco_20200604_211715-50d90c74.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/groie/mask_rcnn_r50_fpn_groie_1x_coco/mask_rcnn_r50_fpn_groie_1x_coco_20200604_211715.log.json) | +| R-50-FPN | GC-Net | 1x | 40.7 | 36.5 | [config](../gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200202-50b90e5c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200202_085547.log.json) | +| R-50-FPN | + GRoIE | 1x | 41.0 | 37.8 | [config](./mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/groie/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco_20200604_211715-42eb79e1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/groie/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco_20200604_211715-42eb79e1.pth) | +| R-101-FPN | GC-Net | 1x | 42.2 | 37.8 | [config](../gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200206-8407a3f0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco_20200206_142508.log.json) | +| R-101-FPN | + GRoIE | 1x | 42.6 | 38.7 | [config](./mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/groie/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco_20200607_224507-8daae01c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/groie/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco_20200607_224507.log.json) | + +## Citation + +If you use this work or benchmark in your research, please cite this project. + +```latex +@inproceedings{rossi2021novel, + title={A novel region of interest extraction layer for instance segmentation}, + author={Rossi, Leonardo and Karimi, Akbar and Prati, Andrea}, + booktitle={2020 25th International Conference on Pattern Recognition (ICPR)}, + pages={2203--2209}, + year={2021}, + organization={IEEE} +} +``` + +## Contact + +The implementation of GRoIE is currently maintained by +[Leonardo Rossi](https://github.com/hachreak/). diff --git a/configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py b/configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py new file mode 100644 index 0000000..0fc528b --- /dev/null +++ b/configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py @@ -0,0 +1,25 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +# model settings +model = dict( + roi_head=dict( + bbox_roi_extractor=dict( + type='GenericRoIExtractor', + aggregation='sum', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32], + pre_cfg=dict( + type='ConvModule', + in_channels=256, + out_channels=256, + kernel_size=5, + padding=2, + inplace=False, + ), + post_cfg=dict( + type='GeneralizedAttention', + in_channels=256, + spatial_range=-1, + num_heads=6, + attention_type='0100', + kv_stride=2)))) diff --git a/configs/groie/grid_rcnn_r50_fpn_gn-head_groie_1x_coco.py b/configs/groie/grid_rcnn_r50_fpn_gn-head_groie_1x_coco.py new file mode 100644 index 0000000..8e4b4ab --- /dev/null +++ b/configs/groie/grid_rcnn_r50_fpn_gn-head_groie_1x_coco.py @@ -0,0 +1,45 @@ +_base_ = '../grid_rcnn/grid_rcnn_r50_fpn_gn-head_1x_coco.py' +# model settings +model = dict( + roi_head=dict( + bbox_roi_extractor=dict( + type='GenericRoIExtractor', + aggregation='sum', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32], + pre_cfg=dict( + type='ConvModule', + in_channels=256, + out_channels=256, + kernel_size=5, + padding=2, + inplace=False, + ), + post_cfg=dict( + type='GeneralizedAttention', + in_channels=256, + spatial_range=-1, + num_heads=6, + attention_type='0100', + kv_stride=2)), + grid_roi_extractor=dict( + type='GenericRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32], + pre_cfg=dict( + type='ConvModule', + in_channels=256, + out_channels=256, + kernel_size=5, + padding=2, + inplace=False, + ), + post_cfg=dict( + type='GeneralizedAttention', + in_channels=256, + spatial_range=-1, + num_heads=6, + attention_type='0100', + kv_stride=2)))) diff --git a/configs/groie/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py b/configs/groie/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py new file mode 100644 index 0000000..8b83722 --- /dev/null +++ b/configs/groie/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py @@ -0,0 +1,45 @@ +_base_ = '../gcnet/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py' +# model settings +model = dict( + roi_head=dict( + bbox_roi_extractor=dict( + type='GenericRoIExtractor', + aggregation='sum', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32], + pre_cfg=dict( + type='ConvModule', + in_channels=256, + out_channels=256, + kernel_size=5, + padding=2, + inplace=False, + ), + post_cfg=dict( + type='GeneralizedAttention', + in_channels=256, + spatial_range=-1, + num_heads=6, + attention_type='0100', + kv_stride=2)), + mask_roi_extractor=dict( + type='GenericRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32], + pre_cfg=dict( + type='ConvModule', + in_channels=256, + out_channels=256, + kernel_size=5, + padding=2, + inplace=False, + ), + post_cfg=dict( + type='GeneralizedAttention', + in_channels=256, + spatial_range=-1, + num_heads=6, + attention_type='0100', + kv_stride=2)))) diff --git a/configs/groie/mask_rcnn_r50_fpn_groie_1x_coco.py b/configs/groie/mask_rcnn_r50_fpn_groie_1x_coco.py new file mode 100644 index 0000000..81dfb48 --- /dev/null +++ b/configs/groie/mask_rcnn_r50_fpn_groie_1x_coco.py @@ -0,0 +1,45 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +# model settings +model = dict( + roi_head=dict( + bbox_roi_extractor=dict( + type='GenericRoIExtractor', + aggregation='sum', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32], + pre_cfg=dict( + type='ConvModule', + in_channels=256, + out_channels=256, + kernel_size=5, + padding=2, + inplace=False, + ), + post_cfg=dict( + type='GeneralizedAttention', + in_channels=256, + spatial_range=-1, + num_heads=6, + attention_type='0100', + kv_stride=2)), + mask_roi_extractor=dict( + type='GenericRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32], + pre_cfg=dict( + type='ConvModule', + in_channels=256, + out_channels=256, + kernel_size=5, + padding=2, + inplace=False, + ), + post_cfg=dict( + type='GeneralizedAttention', + in_channels=256, + spatial_range=-1, + num_heads=6, + attention_type='0100', + kv_stride=2)))) diff --git a/configs/groie/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py b/configs/groie/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py new file mode 100644 index 0000000..852c5ca --- /dev/null +++ b/configs/groie/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py @@ -0,0 +1,45 @@ +_base_ = '../gcnet/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_1x_coco.py' +# model settings +model = dict( + roi_head=dict( + bbox_roi_extractor=dict( + type='GenericRoIExtractor', + aggregation='sum', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32], + pre_cfg=dict( + type='ConvModule', + in_channels=256, + out_channels=256, + kernel_size=5, + padding=2, + inplace=False, + ), + post_cfg=dict( + type='GeneralizedAttention', + in_channels=256, + spatial_range=-1, + num_heads=6, + attention_type='0100', + kv_stride=2)), + mask_roi_extractor=dict( + type='GenericRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32], + pre_cfg=dict( + type='ConvModule', + in_channels=256, + out_channels=256, + kernel_size=5, + padding=2, + inplace=False, + ), + post_cfg=dict( + type='GeneralizedAttention', + in_channels=256, + spatial_range=-1, + num_heads=6, + attention_type='0100', + kv_stride=2)))) diff --git a/configs/groie/metafile.yml b/configs/groie/metafile.yml new file mode 100644 index 0000000..badf53a --- /dev/null +++ b/configs/groie/metafile.yml @@ -0,0 +1,94 @@ +Collections: + - Name: GRoIE + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Generic RoI Extractor + - FPN + - RPN + - ResNet + - RoIAlign + Paper: + URL: https://arxiv.org/abs/2004.13665 + Title: 'A novel Region of Interest Extraction Layer for Instance Segmentation' + README: configs/groie/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/roi_heads/roi_extractors/groie.py#L15 + Version: v2.1.0 + +Models: + - Name: faster_rcnn_r50_fpn_groie_1x_coco + In Collection: GRoIE + Config: configs/groie/faster_rcnn_r50_fpn_groie_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/groie/faster_rcnn_r50_fpn_groie_1x_coco/faster_rcnn_r50_fpn_groie_1x_coco_20200604_211715-66ee9516.pth + + - Name: grid_rcnn_r50_fpn_gn-head_groie_1x_coco + In Collection: GRoIE + Config: configs/groie/grid_rcnn_r50_fpn_gn-head_groie_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/groie/grid_rcnn_r50_fpn_gn-head_groie_1x_coco/grid_rcnn_r50_fpn_gn-head_groie_1x_coco_20200605_202059-4b75d86f.pth + + - Name: mask_rcnn_r50_fpn_groie_1x_coco + In Collection: GRoIE + Config: configs/groie/mask_rcnn_r50_fpn_groie_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/groie/mask_rcnn_r50_fpn_groie_1x_coco/mask_rcnn_r50_fpn_groie_1x_coco_20200604_211715-50d90c74.pth + + - Name: mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco + In Collection: GRoIE + Config: configs/groie/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/groie/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco/mask_rcnn_r50_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco_20200604_211715-42eb79e1.pth + + - Name: mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco + In Collection: GRoIE + Config: configs/groie/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/groie/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco/mask_rcnn_r101_fpn_syncbn-backbone_r4_gcb_c3-c5_groie_1x_coco_20200607_224507-8daae01c.pth diff --git a/configs/guided_anchoring/README.md b/configs/guided_anchoring/README.md new file mode 100644 index 0000000..563e43f --- /dev/null +++ b/configs/guided_anchoring/README.md @@ -0,0 +1,59 @@ +# Guided Anchoring + +> [Region Proposal by Guided Anchoring](https://arxiv.org/abs/1901.03278) + + + +## Abstract + +Region anchors are the cornerstone of modern object detection techniques. State-of-the-art detectors mostly rely on a dense anchoring scheme, where anchors are sampled uniformly over the spatial domain with a predefined set of scales and aspect ratios. In this paper, we revisit this foundational stage. Our study shows that it can be done much more effectively and efficiently. Specifically, we present an alternative scheme, named Guided Anchoring, which leverages semantic features to guide the anchoring. The proposed method jointly predicts the locations where the center of objects of interest are likely to exist as well as the scales and aspect ratios at different locations. On top of predicted anchor shapes, we mitigate the feature inconsistency with a feature adaption module. We also study the use of high-quality proposals to improve detection performance. The anchoring scheme can be seamlessly integrated into proposal methods and detectors. With Guided Anchoring, we achieve 9.1% higher recall on MS COCO with 90% fewer anchors than the RPN baseline. We also adopt Guided Anchoring in Fast R-CNN, Faster R-CNN and RetinaNet, respectively improving the detection mAP by 2.2%, 2.7% and 1.2%. + +
+ +
+ +## Results and Models + +The results on COCO 2017 val is shown in the below table. (results on test-dev are usually slightly higher than val). + +| Method | Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | AR 1000 | Config | Download | +| :----: | :-------------: | :-----: | :-----: | :------: | :------------: | :-----: | :-----------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| GA-RPN | R-50-FPN | caffe | 1x | 5.3 | 15.8 | 68.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_rpn_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_r50_caffe_fpn_1x_coco/ga_rpn_r50_caffe_fpn_1x_coco_20200531-899008a6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_r50_caffe_fpn_1x_coco/ga_rpn_r50_caffe_fpn_1x_coco_20200531_011819.log.json) | +| GA-RPN | R-101-FPN | caffe | 1x | 7.3 | 13.0 | 69.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_rpn_r101_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_r101_caffe_fpn_1x_coco/ga_rpn_r101_caffe_fpn_1x_coco_20200531-ca9ba8fb.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_r101_caffe_fpn_1x_coco/ga_rpn_r101_caffe_fpn_1x_coco_20200531_011812.log.json) | +| GA-RPN | X-101-32x4d-FPN | pytorch | 1x | 8.5 | 10.0 | 70.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_rpn_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_x101_32x4d_fpn_1x_coco/ga_rpn_x101_32x4d_fpn_1x_coco_20200220-c28d1b18.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_x101_32x4d_fpn_1x_coco/ga_rpn_x101_32x4d_fpn_1x_coco_20200220_221326.log.json) | +| GA-RPN | X-101-64x4d-FPN | pytorch | 1x | 7.1 | 7.5 | 71.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_rpn_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_x101_64x4d_fpn_1x_coco/ga_rpn_x101_64x4d_fpn_1x_coco_20200225-3c6e1aa2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_x101_64x4d_fpn_1x_coco/ga_rpn_x101_64x4d_fpn_1x_coco_20200225_152704.log.json) | + +| Method | Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------------: | :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| GA-Faster RCNN | R-50-FPN | caffe | 1x | 5.5 | | 39.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco/ga_faster_r50_caffe_fpn_1x_coco_20200702_000718-a11ccfe6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco/ga_faster_r50_caffe_fpn_1x_coco_20200702_000718.log.json) | +| GA-Faster RCNN | R-101-FPN | caffe | 1x | 7.5 | | 41.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_faster_r101_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_r101_caffe_fpn_1x_coco/ga_faster_r101_caffe_fpn_1x_coco_bbox_mAP-0.415_20200505_115528-fb82e499.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_r101_caffe_fpn_1x_coco/ga_faster_r101_caffe_fpn_1x_coco_20200505_115528.log.json) | +| GA-Faster RCNN | X-101-32x4d-FPN | pytorch | 1x | 8.7 | 9.7 | 43.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_faster_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_x101_32x4d_fpn_1x_coco/ga_faster_x101_32x4d_fpn_1x_coco_20200215-1ded9da3.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_x101_32x4d_fpn_1x_coco/ga_faster_x101_32x4d_fpn_1x_coco_20200215_184547.log.json) | +| GA-Faster RCNN | X-101-64x4d-FPN | pytorch | 1x | 11.8 | 7.3 | 43.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_faster_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_x101_64x4d_fpn_1x_coco/ga_faster_x101_64x4d_fpn_1x_coco_20200215-0fa7bde7.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_x101_64x4d_fpn_1x_coco/ga_faster_x101_64x4d_fpn_1x_coco_20200215_104455.log.json) | +| GA-RetinaNet | R-50-FPN | caffe | 1x | 3.5 | 16.8 | 36.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco/ga_retinanet_r50_caffe_fpn_1x_coco_20201020-39581c6f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco/ga_retinanet_r50_caffe_fpn_1x_coco_20201020_225450.log.json) | +| GA-RetinaNet | R-101-FPN | caffe | 1x | 5.5 | 12.9 | 39.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_retinanet_r101_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_r101_caffe_fpn_1x_coco/ga_retinanet_r101_caffe_fpn_1x_coco_20200531-6266453c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_r101_caffe_fpn_1x_coco/ga_retinanet_r101_caffe_fpn_1x_coco_20200531_012847.log.json) | +| GA-RetinaNet | X-101-32x4d-FPN | pytorch | 1x | 6.9 | 10.6 | 40.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_retinanet_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_x101_32x4d_fpn_1x_coco/ga_retinanet_x101_32x4d_fpn_1x_coco_20200219-40c56caa.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_x101_32x4d_fpn_1x_coco/ga_retinanet_x101_32x4d_fpn_1x_coco_20200219_223025.log.json) | +| GA-RetinaNet | X-101-64x4d-FPN | pytorch | 1x | 9.9 | 7.7 | 41.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/guided_anchoring/ga_retinanet_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_x101_64x4d_fpn_1x_coco/ga_retinanet_x101_64x4d_fpn_1x_coco_20200226-ef9f7f1f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_x101_64x4d_fpn_1x_coco/ga_retinanet_x101_64x4d_fpn_1x_coco_20200226_221123.log.json) | + +- In the Guided Anchoring paper, `score_thr` is set to 0.001 in Fast/Faster RCNN and 0.05 in RetinaNet for both baselines and Guided Anchoring. + +- Performance on COCO test-dev benchmark are shown as follows. + +| Method | Backbone | Style | Lr schd | Aug Train | Score thr | AP | AP_50 | AP_75 | AP_small | AP_medium | AP_large | Download | +| :------------: | :-------: | :---: | :-----: | :-------: | :-------: | :-: | :---: | :---: | :------: | :-------: | :------: | :------: | +| GA-Faster RCNN | R-101-FPN | caffe | 1x | F | 0.05 | | | | | | | | +| GA-Faster RCNN | R-101-FPN | caffe | 1x | F | 0.001 | | | | | | | | +| GA-RetinaNet | R-101-FPN | caffe | 1x | F | 0.05 | | | | | | | | +| GA-RetinaNet | R-101-FPN | caffe | 2x | T | 0.05 | | | | | | | | + +## Citation + +We provide config files to reproduce the results in the CVPR 2019 paper for [Region Proposal by Guided Anchoring](https://arxiv.org/abs/1901.03278). + +```latex +@inproceedings{wang2019region, + title={Region Proposal by Guided Anchoring}, + author={Jiaqi Wang and Kai Chen and Shuo Yang and Chen Change Loy and Dahua Lin}, + booktitle={IEEE Conference on Computer Vision and Pattern Recognition}, + year={2019} +} +``` diff --git a/configs/guided_anchoring/ga_fast_r50_caffe_fpn_1x_coco.py b/configs/guided_anchoring/ga_fast_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..8fc203c --- /dev/null +++ b/configs/guided_anchoring/ga_fast_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,65 @@ +_base_ = '../fast_rcnn/fast_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + roi_head=dict( + bbox_head=dict(bbox_coder=dict(target_stds=[0.05, 0.05, 0.1, 0.1]))), + # model training and testing settings + train_cfg=dict( + rcnn=dict( + assigner=dict(pos_iou_thr=0.6, neg_iou_thr=0.6, min_pos_iou=0.6), + sampler=dict(num=256))), + test_cfg=dict(rcnn=dict(score_thr=1e-3))) +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadProposals', num_max_proposals=300), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'proposals', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadProposals', num_max_proposals=None), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img', 'proposals']), + ]) +] +data = dict( + train=dict( + proposal_file=data_root + 'proposals/ga_rpn_r50_fpn_1x_train2017.pkl', + pipeline=train_pipeline), + val=dict( + proposal_file=data_root + 'proposals/ga_rpn_r50_fpn_1x_val2017.pkl', + pipeline=test_pipeline), + test=dict( + proposal_file=data_root + 'proposals/ga_rpn_r50_fpn_1x_val2017.pkl', + pipeline=test_pipeline)) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/configs/guided_anchoring/ga_faster_r101_caffe_fpn_1x_coco.py b/configs/guided_anchoring/ga_faster_r101_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..a40e7c6 --- /dev/null +++ b/configs/guided_anchoring/ga_faster_r101_caffe_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './ga_faster_r50_caffe_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) diff --git a/configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py b/configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..b0add92 --- /dev/null +++ b/configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,65 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_caffe_fpn_1x_coco.py' +model = dict( + rpn_head=dict( + _delete_=True, + type='GARPNHead', + in_channels=256, + feat_channels=256, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=8, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[8], + strides=[4, 8, 16, 32, 64]), + anchor_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.07, 0.07, 0.14, 0.14]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.07, 0.07, 0.11, 0.11]), + loc_filter_thr=0.01, + loss_loc=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_shape=dict(type='BoundedIoULoss', beta=0.2, loss_weight=1.0), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)), + roi_head=dict( + bbox_head=dict(bbox_coder=dict(target_stds=[0.05, 0.05, 0.1, 0.1]))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + ga_assigner=dict( + type='ApproxMaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + ignore_iof_thr=-1), + ga_sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + center_ratio=0.2, + ignore_ratio=0.5), + rpn_proposal=dict(nms_post=1000, max_per_img=300), + rcnn=dict( + assigner=dict(pos_iou_thr=0.6, neg_iou_thr=0.6, min_pos_iou=0.6), + sampler=dict(type='RandomSampler', num=256))), + test_cfg=dict( + rpn=dict(nms_post=1000, max_per_img=300), rcnn=dict(score_thr=1e-3))) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/configs/guided_anchoring/ga_faster_r50_fpn_1x_coco.py b/configs/guided_anchoring/ga_faster_r50_fpn_1x_coco.py new file mode 100644 index 0000000..e3d8238 --- /dev/null +++ b/configs/guided_anchoring/ga_faster_r50_fpn_1x_coco.py @@ -0,0 +1,65 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + rpn_head=dict( + _delete_=True, + type='GARPNHead', + in_channels=256, + feat_channels=256, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=8, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[8], + strides=[4, 8, 16, 32, 64]), + anchor_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.07, 0.07, 0.14, 0.14]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.07, 0.07, 0.11, 0.11]), + loc_filter_thr=0.01, + loss_loc=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_shape=dict(type='BoundedIoULoss', beta=0.2, loss_weight=1.0), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)), + roi_head=dict( + bbox_head=dict(bbox_coder=dict(target_stds=[0.05, 0.05, 0.1, 0.1]))), + # model training and testing settings + train_cfg=dict( + rpn=dict( + ga_assigner=dict( + type='ApproxMaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + ignore_iof_thr=-1), + ga_sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + center_ratio=0.2, + ignore_ratio=0.5), + rpn_proposal=dict(nms_post=1000, max_per_img=300), + rcnn=dict( + assigner=dict(pos_iou_thr=0.6, neg_iou_thr=0.6, min_pos_iou=0.6), + sampler=dict(type='RandomSampler', num=256))), + test_cfg=dict( + rpn=dict(nms_post=1000, max_per_img=300), rcnn=dict(score_thr=1e-3))) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/configs/guided_anchoring/ga_faster_x101_32x4d_fpn_1x_coco.py b/configs/guided_anchoring/ga_faster_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..f1dda94 --- /dev/null +++ b/configs/guided_anchoring/ga_faster_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './ga_faster_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/guided_anchoring/ga_faster_x101_64x4d_fpn_1x_coco.py b/configs/guided_anchoring/ga_faster_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..fb9e2af --- /dev/null +++ b/configs/guided_anchoring/ga_faster_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './ga_faster_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/guided_anchoring/ga_retinanet_r101_caffe_fpn_1x_coco.py b/configs/guided_anchoring/ga_retinanet_r101_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..1b1cccd --- /dev/null +++ b/configs/guided_anchoring/ga_retinanet_r101_caffe_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './ga_retinanet_r50_caffe_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) diff --git a/configs/guided_anchoring/ga_retinanet_r101_caffe_fpn_mstrain_2x.py b/configs/guided_anchoring/ga_retinanet_r101_caffe_fpn_mstrain_2x.py new file mode 100644 index 0000000..260895b --- /dev/null +++ b/configs/guided_anchoring/ga_retinanet_r101_caffe_fpn_mstrain_2x.py @@ -0,0 +1,169 @@ +_base_ = '../_base_/default_runtime.py' + +# model settings +model = dict( + type='RetinaNet', + backbone=dict( + type='ResNet', + depth=101, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs=True, + num_outs=5), + bbox_head=dict( + type='GARetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[4], + strides=[8, 16, 32, 64, 128]), + anchor_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loc_filter_thr=0.01, + loss_loc=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_shape=dict(type='BoundedIoULoss', beta=0.2, loss_weight=1.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=0.04, loss_weight=1.0))) +# training and testing settings +train_cfg = dict( + ga_assigner=dict( + type='ApproxMaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0.4, + ignore_iof_thr=-1), + ga_sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + center_ratio=0.2, + ignore_ratio=0.5, + debug=False) +test_cfg = dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100) +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 480), (1333, 960)], + keep_ratio=True, + multiscale_mode='range'), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='bbox') +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2)) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=1.0 / 3, + step=[16, 22]) +checkpoint_config = dict(interval=1) +# yapf:disable +log_config = dict( + interval=50, + hooks=[ + dict(type='TextLoggerHook'), + # dict(type='TensorboardLoggerHook') + ]) +# yapf:enable +# runtime settings +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco.py b/configs/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..3351201 --- /dev/null +++ b/configs/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,62 @@ +_base_ = '../retinanet/retinanet_r50_caffe_fpn_1x_coco.py' +model = dict( + bbox_head=dict( + _delete_=True, + type='GARetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[4], + strides=[8, 16, 32, 64, 128]), + anchor_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loc_filter_thr=0.01, + loss_loc=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_shape=dict(type='BoundedIoULoss', beta=0.2, loss_weight=1.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=0.04, loss_weight=1.0)), + # training and testing settings + train_cfg=dict( + ga_assigner=dict( + type='ApproxMaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0.4, + ignore_iof_thr=-1), + ga_sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + assigner=dict(neg_iou_thr=0.5, min_pos_iou=0.0), + center_ratio=0.2, + ignore_ratio=0.5)) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/configs/guided_anchoring/ga_retinanet_r50_fpn_1x_coco.py b/configs/guided_anchoring/ga_retinanet_r50_fpn_1x_coco.py new file mode 100644 index 0000000..7694723 --- /dev/null +++ b/configs/guided_anchoring/ga_retinanet_r50_fpn_1x_coco.py @@ -0,0 +1,62 @@ +_base_ = '../retinanet/retinanet_r50_fpn_1x_coco.py' +model = dict( + bbox_head=dict( + _delete_=True, + type='GARetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[4], + strides=[8, 16, 32, 64, 128]), + anchor_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loc_filter_thr=0.01, + loss_loc=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_shape=dict(type='BoundedIoULoss', beta=0.2, loss_weight=1.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=0.04, loss_weight=1.0)), + # training and testing settings + train_cfg=dict( + ga_assigner=dict( + type='ApproxMaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0.4, + ignore_iof_thr=-1), + ga_sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + assigner=dict(neg_iou_thr=0.5, min_pos_iou=0.0), + center_ratio=0.2, + ignore_ratio=0.5)) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/configs/guided_anchoring/ga_retinanet_x101_32x4d_fpn_1x_coco.py b/configs/guided_anchoring/ga_retinanet_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..c5eb34f --- /dev/null +++ b/configs/guided_anchoring/ga_retinanet_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './ga_retinanet_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/guided_anchoring/ga_retinanet_x101_64x4d_fpn_1x_coco.py b/configs/guided_anchoring/ga_retinanet_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..5c69a6f --- /dev/null +++ b/configs/guided_anchoring/ga_retinanet_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './ga_retinanet_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/guided_anchoring/ga_rpn_r101_caffe_fpn_1x_coco.py b/configs/guided_anchoring/ga_rpn_r101_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..039703e --- /dev/null +++ b/configs/guided_anchoring/ga_rpn_r101_caffe_fpn_1x_coco.py @@ -0,0 +1,8 @@ +_base_ = './ga_rpn_r50_caffe_fpn_1x_coco.py' +# model settings +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) diff --git a/configs/guided_anchoring/ga_rpn_r50_caffe_fpn_1x_coco.py b/configs/guided_anchoring/ga_rpn_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..7830894 --- /dev/null +++ b/configs/guided_anchoring/ga_rpn_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,58 @@ +_base_ = '../rpn/rpn_r50_caffe_fpn_1x_coco.py' +model = dict( + rpn_head=dict( + _delete_=True, + type='GARPNHead', + in_channels=256, + feat_channels=256, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=8, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[8], + strides=[4, 8, 16, 32, 64]), + anchor_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.07, 0.07, 0.14, 0.14]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.07, 0.07, 0.11, 0.11]), + loc_filter_thr=0.01, + loss_loc=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_shape=dict(type='BoundedIoULoss', beta=0.2, loss_weight=1.0), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict( + rpn=dict( + ga_assigner=dict( + type='ApproxMaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + ignore_iof_thr=-1), + ga_sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + center_ratio=0.2, + ignore_ratio=0.5)), + test_cfg=dict(rpn=dict(nms_post=1000))) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/configs/guided_anchoring/ga_rpn_r50_fpn_1x_coco.py b/configs/guided_anchoring/ga_rpn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..27ab3e7 --- /dev/null +++ b/configs/guided_anchoring/ga_rpn_r50_fpn_1x_coco.py @@ -0,0 +1,58 @@ +_base_ = '../rpn/rpn_r50_fpn_1x_coco.py' +model = dict( + rpn_head=dict( + _delete_=True, + type='GARPNHead', + in_channels=256, + feat_channels=256, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=8, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[8], + strides=[4, 8, 16, 32, 64]), + anchor_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.07, 0.07, 0.14, 0.14]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.07, 0.07, 0.11, 0.11]), + loc_filter_thr=0.01, + loss_loc=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_shape=dict(type='BoundedIoULoss', beta=0.2, loss_weight=1.0), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)), + # model training and testing settings + train_cfg=dict( + rpn=dict( + ga_assigner=dict( + type='ApproxMaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + ignore_iof_thr=-1), + ga_sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + center_ratio=0.2, + ignore_ratio=0.5)), + test_cfg=dict(rpn=dict(nms_post=1000))) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/configs/guided_anchoring/ga_rpn_x101_32x4d_fpn_1x_coco.py b/configs/guided_anchoring/ga_rpn_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..cccc985 --- /dev/null +++ b/configs/guided_anchoring/ga_rpn_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './ga_rpn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/guided_anchoring/ga_rpn_x101_64x4d_fpn_1x_coco.py b/configs/guided_anchoring/ga_rpn_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..4e134d2 --- /dev/null +++ b/configs/guided_anchoring/ga_rpn_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './ga_rpn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/guided_anchoring/metafile.yml b/configs/guided_anchoring/metafile.yml new file mode 100644 index 0000000..f39d183 --- /dev/null +++ b/configs/guided_anchoring/metafile.yml @@ -0,0 +1,246 @@ +Collections: + - Name: Guided Anchoring + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - Guided Anchoring + - ResNet + Paper: + URL: https://arxiv.org/abs/1901.03278 + Title: 'Region Proposal by Guided Anchoring' + README: configs/guided_anchoring/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/dense_heads/ga_retina_head.py#L10 + Version: v2.0.0 + +Models: + - Name: ga_rpn_r50_caffe_fpn_1x_coco + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_rpn_r50_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 5.3 + inference time (ms/im): + - value: 63.29 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Region Proposal + Dataset: COCO + Metrics: + AR@1000: 68.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_r50_caffe_fpn_1x_coco/ga_rpn_r50_caffe_fpn_1x_coco_20200531-899008a6.pth + + - Name: ga_rpn_r101_caffe_fpn_1x_coco + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_rpn_r101_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.3 + inference time (ms/im): + - value: 76.92 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Region Proposal + Dataset: COCO + Metrics: + AR@1000: 69.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_r101_caffe_fpn_1x_coco/ga_rpn_r101_caffe_fpn_1x_coco_20200531-ca9ba8fb.pth + + - Name: ga_rpn_x101_32x4d_fpn_1x_coco + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_rpn_x101_32x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 8.5 + inference time (ms/im): + - value: 100 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Region Proposal + Dataset: COCO + Metrics: + AR@1000: 70.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_x101_32x4d_fpn_1x_coco/ga_rpn_x101_32x4d_fpn_1x_coco_20200220-c28d1b18.pth + + - Name: ga_rpn_x101_64x4d_fpn_1x_coco + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_rpn_x101_64x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.1 + inference time (ms/im): + - value: 133.33 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Region Proposal + Dataset: COCO + Metrics: + AR@1000: 70.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_rpn_x101_64x4d_fpn_1x_coco/ga_rpn_x101_64x4d_fpn_1x_coco_20200225-3c6e1aa2.pth + + - Name: ga_faster_r50_caffe_fpn_1x_coco + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 5.5 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_r50_caffe_fpn_1x_coco/ga_faster_r50_caffe_fpn_1x_coco_20200702_000718-a11ccfe6.pth + + - Name: ga_faster_r101_caffe_fpn_1x_coco + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_faster_r101_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.5 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_r101_caffe_fpn_1x_coco/ga_faster_r101_caffe_fpn_1x_coco_bbox_mAP-0.415_20200505_115528-fb82e499.pth + + - Name: ga_faster_x101_32x4d_fpn_1x_coco + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_faster_x101_32x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 8.7 + inference time (ms/im): + - value: 103.09 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_x101_32x4d_fpn_1x_coco/ga_faster_x101_32x4d_fpn_1x_coco_20200215-1ded9da3.pth + + - Name: ga_faster_x101_64x4d_fpn_1x_coco + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_faster_x101_64x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 11.8 + inference time (ms/im): + - value: 136.99 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_faster_x101_64x4d_fpn_1x_coco/ga_faster_x101_64x4d_fpn_1x_coco_20200215-0fa7bde7.pth + + - Name: ga_retinanet_r50_caffe_fpn_1x_coco + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 3.5 + inference time (ms/im): + - value: 59.52 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 36.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_r50_caffe_fpn_1x_coco/ga_retinanet_r50_caffe_fpn_1x_coco_20201020-39581c6f.pth + + - Name: ga_retinanet_r101_caffe_fpn_1x_coco + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_retinanet_r101_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 5.5 + inference time (ms/im): + - value: 77.52 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_r101_caffe_fpn_1x_coco/ga_retinanet_r101_caffe_fpn_1x_coco_20200531-6266453c.pth + + - Name: ga_retinanet_x101_32x4d_fpn_1x_coco + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_retinanet_x101_32x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.9 + inference time (ms/im): + - value: 94.34 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_x101_32x4d_fpn_1x_coco/ga_retinanet_x101_32x4d_fpn_1x_coco_20200219-40c56caa.pth + + - Name: ga_retinanet_x101_64x4d_fpn_1x_coco + In Collection: Guided Anchoring + Config: configs/guided_anchoring/ga_retinanet_x101_64x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 9.9 + inference time (ms/im): + - value: 129.87 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/guided_anchoring/ga_retinanet_x101_64x4d_fpn_1x_coco/ga_retinanet_x101_64x4d_fpn_1x_coco_20200226-ef9f7f1f.pth diff --git a/configs/hrnet/README.md b/configs/hrnet/README.md new file mode 100644 index 0000000..e340c78 --- /dev/null +++ b/configs/hrnet/README.md @@ -0,0 +1,101 @@ +# HRNet + +> [Deep High-Resolution Representation Learning for Human Pose Estimation](https://arxiv.org/abs/1902.09212) + + + +## Abstract + +This is an official pytorch implementation of Deep High-Resolution Representation Learning for Human Pose Estimation. In this work, we are interested in the human pose estimation problem with a focus on learning reliable high-resolution representations. Most existing methods recover high-resolution representations from low-resolution representations produced by a high-to-low resolution network. Instead, our proposed network maintains high-resolution representations through the whole process. We start from a high-resolution subnetwork as the first stage, gradually add high-to-low resolution subnetworks one by one to form more stages, and connect the mutli-resolution subnetworks in parallel. We conduct repeated multi-scale fusions such that each of the high-to-low resolution representations receives information from other parallel representations over and over, leading to rich high-resolution representations. As a result, the predicted keypoint heatmap is potentially more accurate and spatially more precise. We empirically demonstrate the effectiveness of our network through the superior pose estimation results over two benchmark datasets: the COCO keypoint detection dataset and the MPII Human Pose dataset. + +High-resolution representation learning plays an essential role in many vision problems, e.g., pose estimation and semantic segmentation. The high-resolution network (HRNet), recently developed for human pose estimation, maintains high-resolution representations through the whole process by connecting high-to-low resolution convolutions in parallel and produces strong high-resolution representations by repeatedly conducting fusions across parallel convolutions. +In this paper, we conduct a further study on high-resolution representations by introducing a simple yet effective modification and apply it to a wide range of vision tasks. We augment the high-resolution representation by aggregating the (upsampled) representations from all the parallel convolutions rather than only the representation from the high-resolution convolution as done in HRNet. This simple modification leads to stronger representations, evidenced by superior results. We show top results in semantic segmentation on Cityscapes, LIP, and PASCAL Context, and facial landmark detection on AFLW, COFW, 300W, and WFLW. In addition, we build a multi-level representation from the high-resolution representation and apply it to the Faster R-CNN object detection framework and the extended frameworks. The proposed approach achieves superior results to existing single-model networks on COCO object detection. + +
+ +
+ +## Results and Models + +### Faster R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :----------: | :-----: | :-----: | :------: | :------------: | :----: | :---------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| HRNetV2p-W18 | pytorch | 1x | 6.6 | 13.4 | 36.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco/faster_rcnn_hrnetv2p_w18_1x_coco_20200130-56651a6d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco/faster_rcnn_hrnetv2p_w18_1x_coco_20200130_211246.log.json) | +| HRNetV2p-W18 | pytorch | 2x | 6.6 | - | 38.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/faster_rcnn_hrnetv2p_w18_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w18_2x_coco/faster_rcnn_hrnetv2p_w18_2x_coco_20200702_085731-a4ec0611.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w18_2x_coco/faster_rcnn_hrnetv2p_w18_2x_coco_20200702_085731.log.json) | +| HRNetV2p-W32 | pytorch | 1x | 9.0 | 12.4 | 40.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/faster_rcnn_hrnetv2p_w32_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w32_1x_coco/faster_rcnn_hrnetv2p_w32_1x_coco_20200130-6e286425.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w32_1x_coco/faster_rcnn_hrnetv2p_w32_1x_coco_20200130_204442.log.json) | +| HRNetV2p-W32 | pytorch | 2x | 9.0 | - | 41.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/faster_rcnn_hrnetv2p_w32_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w32_2x_coco/faster_rcnn_hrnetv2p_w32_2x_coco_20200529_015927-976a9c15.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w32_2x_coco/faster_rcnn_hrnetv2p_w32_2x_coco_20200529_015927.log.json) | +| HRNetV2p-W40 | pytorch | 1x | 10.4 | 10.5 | 41.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/faster_rcnn_hrnetv2p_w40_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w40_1x_coco/faster_rcnn_hrnetv2p_w40_1x_coco_20200210-95c1f5ce.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w40_1x_coco/faster_rcnn_hrnetv2p_w40_1x_coco_20200210_125315.log.json) | +| HRNetV2p-W40 | pytorch | 2x | 10.4 | - | 42.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/faster_rcnn_hrnetv2p_w40_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w40_2x_coco/faster_rcnn_hrnetv2p_w40_2x_coco_20200512_161033-0f236ef4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w40_2x_coco/faster_rcnn_hrnetv2p_w40_2x_coco_20200512_161033.log.json) | + +### Mask R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :----------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :-------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| HRNetV2p-W18 | pytorch | 1x | 7.0 | 11.7 | 37.7 | 34.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco/mask_rcnn_hrnetv2p_w18_1x_coco_20200205-1c3d78ed.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco/mask_rcnn_hrnetv2p_w18_1x_coco_20200205_232523.log.json) | +| HRNetV2p-W18 | pytorch | 2x | 7.0 | - | 39.8 | 36.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/mask_rcnn_hrnetv2p_w18_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w18_2x_coco/mask_rcnn_hrnetv2p_w18_2x_coco_20200212-b3c825b1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w18_2x_coco/mask_rcnn_hrnetv2p_w18_2x_coco_20200212_134222.log.json) | +| HRNetV2p-W32 | pytorch | 1x | 9.4 | 11.3 | 41.2 | 37.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/mask_rcnn_hrnetv2p_w32_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w32_1x_coco/mask_rcnn_hrnetv2p_w32_1x_coco_20200207-b29f616e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w32_1x_coco/mask_rcnn_hrnetv2p_w32_1x_coco_20200207_055017.log.json) | +| HRNetV2p-W32 | pytorch | 2x | 9.4 | - | 42.5 | 37.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/mask_rcnn_hrnetv2p_w32_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w32_2x_coco/mask_rcnn_hrnetv2p_w32_2x_coco_20200213-45b75b4d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w32_2x_coco/mask_rcnn_hrnetv2p_w32_2x_coco_20200213_150518.log.json) | +| HRNetV2p-W40 | pytorch | 1x | 10.9 | | 42.1 | 37.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/mask_rcnn_hrnetv2p_w40_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w40_1x_coco/mask_rcnn_hrnetv2p_w40_1x_coco_20200511_015646-66738b35.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w40_1x_coco/mask_rcnn_hrnetv2p_w40_1x_coco_20200511_015646.log.json) | +| HRNetV2p-W40 | pytorch | 2x | 10.9 | | 42.8 | 38.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/mask_rcnn_hrnetv2p_w40_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w40_2x_coco/mask_rcnn_hrnetv2p_w40_2x_coco_20200512_163732-aed5e4ab.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w40_2x_coco/mask_rcnn_hrnetv2p_w40_2x_coco_20200512_163732.log.json) | + +### Cascade R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :----------: | :-----: | :-----: | :------: | :------------: | :----: | :-----------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| HRNetV2p-W18 | pytorch | 20e | 7.0 | 11.0 | 41.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/cascade_rcnn_hrnetv2p_w18_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_rcnn_hrnetv2p_w18_20e_coco/cascade_rcnn_hrnetv2p_w18_20e_coco_20200210-434be9d7.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_rcnn_hrnetv2p_w18_20e_coco/cascade_rcnn_hrnetv2p_w18_20e_coco_20200210_105632.log.json) | +| HRNetV2p-W32 | pytorch | 20e | 9.4 | 11.0 | 43.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/cascade_rcnn_hrnetv2p_w32_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_rcnn_hrnetv2p_w32_20e_coco/cascade_rcnn_hrnetv2p_w32_20e_coco_20200208-928455a4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_rcnn_hrnetv2p_w32_20e_coco/cascade_rcnn_hrnetv2p_w32_20e_coco_20200208_160511.log.json) | +| HRNetV2p-W40 | pytorch | 20e | 10.8 | | 43.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/cascade_rcnn_hrnetv2p_w40_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_rcnn_hrnetv2p_w40_20e_coco/cascade_rcnn_hrnetv2p_w40_20e_coco_20200512_161112-75e47b04.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_rcnn_hrnetv2p_w40_20e_coco/cascade_rcnn_hrnetv2p_w40_20e_coco_20200512_161112.log.json) | + +### Cascade Mask R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :----------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :----------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| HRNetV2p-W18 | pytorch | 20e | 8.5 | 8.5 | 41.6 | 36.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_mask_rcnn_hrnetv2p_w18_20e_coco/cascade_mask_rcnn_hrnetv2p_w18_20e_coco_20200210-b543cd2b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_mask_rcnn_hrnetv2p_w18_20e_coco/cascade_mask_rcnn_hrnetv2p_w18_20e_coco_20200210_093149.log.json) | +| HRNetV2p-W32 | pytorch | 20e | | 8.3 | 44.3 | 38.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w32_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_mask_rcnn_hrnetv2p_w32_20e_coco/cascade_mask_rcnn_hrnetv2p_w32_20e_coco_20200512_154043-39d9cf7b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_mask_rcnn_hrnetv2p_w32_20e_coco/cascade_mask_rcnn_hrnetv2p_w32_20e_coco_20200512_154043.log.json) | +| HRNetV2p-W40 | pytorch | 20e | 12.5 | | 45.1 | 39.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w40_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_mask_rcnn_hrnetv2p_w40_20e_coco/cascade_mask_rcnn_hrnetv2p_w40_20e_coco_20200527_204922-969c4610.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_mask_rcnn_hrnetv2p_w40_20e_coco/cascade_mask_rcnn_hrnetv2p_w40_20e_coco_20200527_204922.log.json) | + +### Hybrid Task Cascade (HTC) + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :----------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :--------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| HRNetV2p-W18 | pytorch | 20e | 10.8 | 4.7 | 42.8 | 37.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/htc_hrnetv2p_w18_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/htc_hrnetv2p_w18_20e_coco/htc_hrnetv2p_w18_20e_coco_20200210-b266988c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/htc_hrnetv2p_w18_20e_coco/htc_hrnetv2p_w18_20e_coco_20200210_182735.log.json) | +| HRNetV2p-W32 | pytorch | 20e | 13.1 | 4.9 | 45.4 | 39.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/htc_hrnetv2p_w32_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/htc_hrnetv2p_w32_20e_coco/htc_hrnetv2p_w32_20e_coco_20200207-7639fa12.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/htc_hrnetv2p_w32_20e_coco/htc_hrnetv2p_w32_20e_coco_20200207_193153.log.json) | +| HRNetV2p-W40 | pytorch | 20e | 14.6 | | 46.4 | 40.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/htc_hrnetv2p_w40_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/htc_hrnetv2p_w40_20e_coco/htc_hrnetv2p_w40_20e_coco_20200529_183411-417c4d5b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/htc_hrnetv2p_w40_20e_coco/htc_hrnetv2p_w40_20e_coco_20200529_183411.log.json) | + +### FCOS + +| Backbone | Style | GN | MS train | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :----------: | :-----: | :-: | :------: | :-----: | :------: | :------------: | :----: | :------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| HRNetV2p-W18 | pytorch | Y | N | 1x | 13.0 | 12.9 | 35.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco_20201212_100710-4ad151de.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco_20201212_100710.log.json) | +| HRNetV2p-W18 | pytorch | Y | N | 2x | 13.0 | - | 38.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco_20201212_101110-5c575fa5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco_20201212_101110.log.json) | +| HRNetV2p-W32 | pytorch | Y | N | 1x | 17.5 | 12.9 | 39.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco_20201211_134730-cb8055c0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco_20201211_134730.log.json) | +| HRNetV2p-W32 | pytorch | Y | N | 2x | 17.5 | - | 40.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco_20201212_112133-77b6b9bb.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco_20201212_112133.log.json) | +| HRNetV2p-W18 | pytorch | Y | Y | 2x | 13.0 | 12.9 | 38.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco_20201212_111651-441e9d9f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco_20201212_111651.log.json) | +| HRNetV2p-W32 | pytorch | Y | Y | 2x | 17.5 | 12.4 | 41.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco_20201212_090846-b6f2b49f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco_20201212_090846.log.json) | +| HRNetV2p-W48 | pytorch | Y | Y | 2x | 20.3 | 10.8 | 42.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco_20201212_124752-f22d2ce5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco_20201212_124752.log.json) | + +**Note:** + +- The `28e` schedule in HTC indicates decreasing the lr at 24 and 27 epochs, with a total of 28 epochs. +- HRNetV2 ImageNet pretrained models are in [HRNets for Image Classification](https://github.com/HRNet/HRNet-Image-Classification). + +## Citation + +```latex +@inproceedings{SunXLW19, + title={Deep High-Resolution Representation Learning for Human Pose Estimation}, + author={Ke Sun and Bin Xiao and Dong Liu and Jingdong Wang}, + booktitle={CVPR}, + year={2019} +} + +@article{SunZJCXLMWLW19, + title={High-Resolution Representations for Labeling Pixels and Regions}, + author={Ke Sun and Yang Zhao and Borui Jiang and Tianheng Cheng and Bin Xiao + and Dong Liu and Yadong Mu and Xinggang Wang and Wenyu Liu and Jingdong Wang}, + journal = {CoRR}, + volume = {abs/1904.04514}, + year={2019} +} +``` diff --git a/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py b/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py new file mode 100644 index 0000000..839cf3e --- /dev/null +++ b/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py @@ -0,0 +1,11 @@ +_base_ = './cascade_mask_rcnn_hrnetv2p_w32_20e_coco.py' +# model settings +model = dict( + backbone=dict( + extra=dict( + stage2=dict(num_channels=(18, 36)), + stage3=dict(num_channels=(18, 36, 72)), + stage4=dict(num_channels=(18, 36, 72, 144))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w18')), + neck=dict(type='HRFPN', in_channels=[18, 36, 72, 144], out_channels=256)) diff --git a/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w32_20e_coco.py b/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w32_20e_coco.py new file mode 100644 index 0000000..9942602 --- /dev/null +++ b/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w32_20e_coco.py @@ -0,0 +1,40 @@ +_base_ = '../cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + _delete_=True, + type='HRNet', + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(32, 64)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(32, 64, 128)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(32, 64, 128, 256))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w32')), + neck=dict( + _delete_=True, + type='HRFPN', + in_channels=[32, 64, 128, 256], + out_channels=256)) +# learning policy +lr_config = dict(step=[16, 19]) +runner = dict(type='EpochBasedRunner', max_epochs=20) diff --git a/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w40_20e_coco.py b/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w40_20e_coco.py new file mode 100644 index 0000000..10d5e83 --- /dev/null +++ b/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w40_20e_coco.py @@ -0,0 +1,12 @@ +_base_ = './cascade_mask_rcnn_hrnetv2p_w32_20e_coco.py' +# model settings +model = dict( + backbone=dict( + type='HRNet', + extra=dict( + stage2=dict(num_channels=(40, 80)), + stage3=dict(num_channels=(40, 80, 160)), + stage4=dict(num_channels=(40, 80, 160, 320))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w40')), + neck=dict(type='HRFPN', in_channels=[40, 80, 160, 320], out_channels=256)) diff --git a/configs/hrnet/cascade_rcnn_hrnetv2p_w18_20e_coco.py b/configs/hrnet/cascade_rcnn_hrnetv2p_w18_20e_coco.py new file mode 100644 index 0000000..ebd5e20 --- /dev/null +++ b/configs/hrnet/cascade_rcnn_hrnetv2p_w18_20e_coco.py @@ -0,0 +1,11 @@ +_base_ = './cascade_rcnn_hrnetv2p_w32_20e_coco.py' +# model settings +model = dict( + backbone=dict( + extra=dict( + stage2=dict(num_channels=(18, 36)), + stage3=dict(num_channels=(18, 36, 72)), + stage4=dict(num_channels=(18, 36, 72, 144))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w18')), + neck=dict(type='HRFPN', in_channels=[18, 36, 72, 144], out_channels=256)) diff --git a/configs/hrnet/cascade_rcnn_hrnetv2p_w32_20e_coco.py b/configs/hrnet/cascade_rcnn_hrnetv2p_w32_20e_coco.py new file mode 100644 index 0000000..e7f89a9 --- /dev/null +++ b/configs/hrnet/cascade_rcnn_hrnetv2p_w32_20e_coco.py @@ -0,0 +1,40 @@ +_base_ = '../cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + _delete_=True, + type='HRNet', + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(32, 64)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(32, 64, 128)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(32, 64, 128, 256))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w32')), + neck=dict( + _delete_=True, + type='HRFPN', + in_channels=[32, 64, 128, 256], + out_channels=256)) +# learning policy +lr_config = dict(step=[16, 19]) +runner = dict(type='EpochBasedRunner', max_epochs=20) diff --git a/configs/hrnet/cascade_rcnn_hrnetv2p_w40_20e_coco.py b/configs/hrnet/cascade_rcnn_hrnetv2p_w40_20e_coco.py new file mode 100644 index 0000000..265e8d6 --- /dev/null +++ b/configs/hrnet/cascade_rcnn_hrnetv2p_w40_20e_coco.py @@ -0,0 +1,12 @@ +_base_ = './cascade_rcnn_hrnetv2p_w32_20e_coco.py' +# model settings +model = dict( + backbone=dict( + type='HRNet', + extra=dict( + stage2=dict(num_channels=(40, 80)), + stage3=dict(num_channels=(40, 80, 160)), + stage4=dict(num_channels=(40, 80, 160, 320))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w40')), + neck=dict(type='HRFPN', in_channels=[40, 80, 160, 320], out_channels=256)) diff --git a/configs/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco.py b/configs/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco.py new file mode 100644 index 0000000..1df2c3d --- /dev/null +++ b/configs/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = './faster_rcnn_hrnetv2p_w32_1x_coco.py' +# model settings +model = dict( + backbone=dict( + extra=dict( + stage2=dict(num_channels=(18, 36)), + stage3=dict(num_channels=(18, 36, 72)), + stage4=dict(num_channels=(18, 36, 72, 144))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w18')), + neck=dict(type='HRFPN', in_channels=[18, 36, 72, 144], out_channels=256)) diff --git a/configs/hrnet/faster_rcnn_hrnetv2p_w18_2x_coco.py b/configs/hrnet/faster_rcnn_hrnetv2p_w18_2x_coco.py new file mode 100644 index 0000000..a4b987a --- /dev/null +++ b/configs/hrnet/faster_rcnn_hrnetv2p_w18_2x_coco.py @@ -0,0 +1,5 @@ +_base_ = './faster_rcnn_hrnetv2p_w18_1x_coco.py' + +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/hrnet/faster_rcnn_hrnetv2p_w32_1x_coco.py b/configs/hrnet/faster_rcnn_hrnetv2p_w32_1x_coco.py new file mode 100644 index 0000000..be05809 --- /dev/null +++ b/configs/hrnet/faster_rcnn_hrnetv2p_w32_1x_coco.py @@ -0,0 +1,37 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + _delete_=True, + type='HRNet', + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(32, 64)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(32, 64, 128)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(32, 64, 128, 256))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w32')), + neck=dict( + _delete_=True, + type='HRFPN', + in_channels=[32, 64, 128, 256], + out_channels=256)) diff --git a/configs/hrnet/faster_rcnn_hrnetv2p_w32_2x_coco.py b/configs/hrnet/faster_rcnn_hrnetv2p_w32_2x_coco.py new file mode 100644 index 0000000..63c8717 --- /dev/null +++ b/configs/hrnet/faster_rcnn_hrnetv2p_w32_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './faster_rcnn_hrnetv2p_w32_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/hrnet/faster_rcnn_hrnetv2p_w40_1x_coco.py b/configs/hrnet/faster_rcnn_hrnetv2p_w40_1x_coco.py new file mode 100644 index 0000000..886a7c9 --- /dev/null +++ b/configs/hrnet/faster_rcnn_hrnetv2p_w40_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = './faster_rcnn_hrnetv2p_w32_1x_coco.py' +model = dict( + backbone=dict( + type='HRNet', + extra=dict( + stage2=dict(num_channels=(40, 80)), + stage3=dict(num_channels=(40, 80, 160)), + stage4=dict(num_channels=(40, 80, 160, 320))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w40')), + neck=dict(type='HRFPN', in_channels=[40, 80, 160, 320], out_channels=256)) diff --git a/configs/hrnet/faster_rcnn_hrnetv2p_w40_2x_coco.py b/configs/hrnet/faster_rcnn_hrnetv2p_w40_2x_coco.py new file mode 100644 index 0000000..585cc2c --- /dev/null +++ b/configs/hrnet/faster_rcnn_hrnetv2p_w40_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './faster_rcnn_hrnetv2p_w40_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco.py b/configs/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco.py new file mode 100644 index 0000000..fd662bd --- /dev/null +++ b/configs/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco.py @@ -0,0 +1,10 @@ +_base_ = './fcos_hrnetv2p_w32_gn-head_4x4_1x_coco.py' +model = dict( + backbone=dict( + extra=dict( + stage2=dict(num_channels=(18, 36)), + stage3=dict(num_channels=(18, 36, 72)), + stage4=dict(num_channels=(18, 36, 72, 144))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w18')), + neck=dict(type='HRFPN', in_channels=[18, 36, 72, 144], out_channels=256)) diff --git a/configs/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco.py b/configs/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco.py new file mode 100644 index 0000000..3497595 --- /dev/null +++ b/configs/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './fcos_hrnetv2p_w18_gn-head_4x4_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/hrnet/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco.py b/configs/hrnet/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco.py new file mode 100644 index 0000000..37bfdae --- /dev/null +++ b/configs/hrnet/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco.py @@ -0,0 +1,10 @@ +_base_ = './fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco.py' +model = dict( + backbone=dict( + extra=dict( + stage2=dict(num_channels=(18, 36)), + stage3=dict(num_channels=(18, 36, 72)), + stage4=dict(num_channels=(18, 36, 72, 144))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w18')), + neck=dict(type='HRFPN', in_channels=[18, 36, 72, 144], out_channels=256)) diff --git a/configs/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco.py b/configs/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco.py new file mode 100644 index 0000000..10617f2 --- /dev/null +++ b/configs/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco.py @@ -0,0 +1,70 @@ +_base_ = '../fcos/fcos_r50_caffe_fpn_gn-head_4x4_1x_coco.py' +model = dict( + backbone=dict( + _delete_=True, + type='HRNet', + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(32, 64)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(32, 64, 128)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(32, 64, 128, 256))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w32')), + neck=dict( + _delete_=True, + type='HRFPN', + in_channels=[32, 64, 128, 256], + out_channels=256, + stride=2, + num_outs=5)) +img_norm_cfg = dict( + mean=[103.53, 116.28, 123.675], std=[57.375, 57.12, 58.395], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco.py b/configs/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco.py new file mode 100644 index 0000000..7b38130 --- /dev/null +++ b/configs/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './fcos_hrnetv2p_w32_gn-head_4x4_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/hrnet/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco.py b/configs/hrnet/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco.py new file mode 100644 index 0000000..482f887 --- /dev/null +++ b/configs/hrnet/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco.py @@ -0,0 +1,39 @@ +_base_ = './fcos_hrnetv2p_w32_gn-head_4x4_1x_coco.py' +img_norm_cfg = dict( + mean=[103.53, 116.28, 123.675], std=[57.375, 57.12, 58.395], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/hrnet/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco.py b/configs/hrnet/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco.py new file mode 100644 index 0000000..0ae9dbe --- /dev/null +++ b/configs/hrnet/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco.py @@ -0,0 +1,11 @@ +_base_ = './fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco.py' +model = dict( + backbone=dict( + type='HRNet', + extra=dict( + stage2=dict(num_channels=(40, 80)), + stage3=dict(num_channels=(40, 80, 160)), + stage4=dict(num_channels=(40, 80, 160, 320))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w40')), + neck=dict(type='HRFPN', in_channels=[40, 80, 160, 320], out_channels=256)) diff --git a/configs/hrnet/htc_hrnetv2p_w18_20e_coco.py b/configs/hrnet/htc_hrnetv2p_w18_20e_coco.py new file mode 100644 index 0000000..3c2eb1d --- /dev/null +++ b/configs/hrnet/htc_hrnetv2p_w18_20e_coco.py @@ -0,0 +1,10 @@ +_base_ = './htc_hrnetv2p_w32_20e_coco.py' +model = dict( + backbone=dict( + extra=dict( + stage2=dict(num_channels=(18, 36)), + stage3=dict(num_channels=(18, 36, 72)), + stage4=dict(num_channels=(18, 36, 72, 144))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w18')), + neck=dict(type='HRFPN', in_channels=[18, 36, 72, 144], out_channels=256)) diff --git a/configs/hrnet/htc_hrnetv2p_w32_20e_coco.py b/configs/hrnet/htc_hrnetv2p_w32_20e_coco.py new file mode 100644 index 0000000..545cb83 --- /dev/null +++ b/configs/hrnet/htc_hrnetv2p_w32_20e_coco.py @@ -0,0 +1,37 @@ +_base_ = '../htc/htc_r50_fpn_20e_coco.py' +model = dict( + backbone=dict( + _delete_=True, + type='HRNet', + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(32, 64)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(32, 64, 128)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(32, 64, 128, 256))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w32')), + neck=dict( + _delete_=True, + type='HRFPN', + in_channels=[32, 64, 128, 256], + out_channels=256)) diff --git a/configs/hrnet/htc_hrnetv2p_w40_20e_coco.py b/configs/hrnet/htc_hrnetv2p_w40_20e_coco.py new file mode 100644 index 0000000..94bff1b --- /dev/null +++ b/configs/hrnet/htc_hrnetv2p_w40_20e_coco.py @@ -0,0 +1,11 @@ +_base_ = './htc_hrnetv2p_w32_20e_coco.py' +model = dict( + backbone=dict( + type='HRNet', + extra=dict( + stage2=dict(num_channels=(40, 80)), + stage3=dict(num_channels=(40, 80, 160)), + stage4=dict(num_channels=(40, 80, 160, 320))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w40')), + neck=dict(type='HRFPN', in_channels=[40, 80, 160, 320], out_channels=256)) diff --git a/configs/hrnet/htc_hrnetv2p_w40_28e_coco.py b/configs/hrnet/htc_hrnetv2p_w40_28e_coco.py new file mode 100644 index 0000000..7067e8b --- /dev/null +++ b/configs/hrnet/htc_hrnetv2p_w40_28e_coco.py @@ -0,0 +1,4 @@ +_base_ = './htc_hrnetv2p_w40_20e_coco.py' +# learning policy +lr_config = dict(step=[24, 27]) +runner = dict(type='EpochBasedRunner', max_epochs=28) diff --git a/configs/hrnet/htc_x101_64x4d_fpn_16x1_28e_coco.py b/configs/hrnet/htc_x101_64x4d_fpn_16x1_28e_coco.py new file mode 100644 index 0000000..815f285 --- /dev/null +++ b/configs/hrnet/htc_x101_64x4d_fpn_16x1_28e_coco.py @@ -0,0 +1,4 @@ +_base_ = '../htc/htc_x101_64x4d_fpn_16x1_20e_coco.py' +# learning policy +lr_config = dict(step=[24, 27]) +runner = dict(type='EpochBasedRunner', max_epochs=28) diff --git a/configs/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco.py b/configs/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco.py new file mode 100644 index 0000000..cb12200 --- /dev/null +++ b/configs/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco.py @@ -0,0 +1,10 @@ +_base_ = './mask_rcnn_hrnetv2p_w32_1x_coco.py' +model = dict( + backbone=dict( + extra=dict( + stage2=dict(num_channels=(18, 36)), + stage3=dict(num_channels=(18, 36, 72)), + stage4=dict(num_channels=(18, 36, 72, 144))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w18')), + neck=dict(type='HRFPN', in_channels=[18, 36, 72, 144], out_channels=256)) diff --git a/configs/hrnet/mask_rcnn_hrnetv2p_w18_2x_coco.py b/configs/hrnet/mask_rcnn_hrnetv2p_w18_2x_coco.py new file mode 100644 index 0000000..ca62682 --- /dev/null +++ b/configs/hrnet/mask_rcnn_hrnetv2p_w18_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './mask_rcnn_hrnetv2p_w18_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/hrnet/mask_rcnn_hrnetv2p_w32_1x_coco.py b/configs/hrnet/mask_rcnn_hrnetv2p_w32_1x_coco.py new file mode 100644 index 0000000..d5f0eb5 --- /dev/null +++ b/configs/hrnet/mask_rcnn_hrnetv2p_w32_1x_coco.py @@ -0,0 +1,37 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + _delete_=True, + type='HRNet', + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(32, 64)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(32, 64, 128)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(32, 64, 128, 256))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w32')), + neck=dict( + _delete_=True, + type='HRFPN', + in_channels=[32, 64, 128, 256], + out_channels=256)) diff --git a/configs/hrnet/mask_rcnn_hrnetv2p_w32_2x_coco.py b/configs/hrnet/mask_rcnn_hrnetv2p_w32_2x_coco.py new file mode 100644 index 0000000..63d5d13 --- /dev/null +++ b/configs/hrnet/mask_rcnn_hrnetv2p_w32_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './mask_rcnn_hrnetv2p_w32_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/hrnet/mask_rcnn_hrnetv2p_w40_1x_coco.py b/configs/hrnet/mask_rcnn_hrnetv2p_w40_1x_coco.py new file mode 100644 index 0000000..5a76f4b --- /dev/null +++ b/configs/hrnet/mask_rcnn_hrnetv2p_w40_1x_coco.py @@ -0,0 +1,11 @@ +_base_ = './mask_rcnn_hrnetv2p_w18_1x_coco.py' +model = dict( + backbone=dict( + type='HRNet', + extra=dict( + stage2=dict(num_channels=(40, 80)), + stage3=dict(num_channels=(40, 80, 160)), + stage4=dict(num_channels=(40, 80, 160, 320))), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://msra/hrnetv2_w40')), + neck=dict(type='HRFPN', in_channels=[40, 80, 160, 320], out_channels=256)) diff --git a/configs/hrnet/mask_rcnn_hrnetv2p_w40_2x_coco.py b/configs/hrnet/mask_rcnn_hrnetv2p_w40_2x_coco.py new file mode 100644 index 0000000..3a2a510 --- /dev/null +++ b/configs/hrnet/mask_rcnn_hrnetv2p_w40_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './mask_rcnn_hrnetv2p_w40_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/hrnet/metafile.yml b/configs/hrnet/metafile.yml new file mode 100644 index 0000000..ac36efa --- /dev/null +++ b/configs/hrnet/metafile.yml @@ -0,0 +1,971 @@ +Models: + - Name: faster_rcnn_hrnetv2p_w18_1x_coco + In Collection: Faster R-CNN + Config: configs/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco.py + Metadata: + Training Memory (GB): 6.6 + inference time (ms/im): + - value: 74.63 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 36.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w18_1x_coco/faster_rcnn_hrnetv2p_w18_1x_coco_20200130-56651a6d.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: faster_rcnn_hrnetv2p_w18_2x_coco + In Collection: Faster R-CNN + Config: configs/hrnet/faster_rcnn_hrnetv2p_w18_2x_coco.py + Metadata: + Training Memory (GB): 6.6 + inference time (ms/im): + - value: 74.63 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w18_2x_coco/faster_rcnn_hrnetv2p_w18_2x_coco_20200702_085731-a4ec0611.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: faster_rcnn_hrnetv2p_w32_1x_coco + In Collection: Faster R-CNN + Config: configs/hrnet/faster_rcnn_hrnetv2p_w32_1x_coco.py + Metadata: + Training Memory (GB): 9.0 + inference time (ms/im): + - value: 80.65 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w32_1x_coco/faster_rcnn_hrnetv2p_w32_1x_coco_20200130-6e286425.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: faster_rcnn_hrnetv2p_w32_2x_coco + In Collection: Faster R-CNN + Config: configs/hrnet/faster_rcnn_hrnetv2p_w32_2x_coco.py + Metadata: + Training Memory (GB): 9.0 + inference time (ms/im): + - value: 80.65 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w32_2x_coco/faster_rcnn_hrnetv2p_w32_2x_coco_20200529_015927-976a9c15.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: faster_rcnn_hrnetv2p_w40_1x_coco + In Collection: Faster R-CNN + Config: configs/hrnet/faster_rcnn_hrnetv2p_w40_1x_coco.py + Metadata: + Training Memory (GB): 10.4 + inference time (ms/im): + - value: 95.24 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w40_1x_coco/faster_rcnn_hrnetv2p_w40_1x_coco_20200210-95c1f5ce.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: faster_rcnn_hrnetv2p_w40_2x_coco + In Collection: Faster R-CNN + Config: configs/hrnet/faster_rcnn_hrnetv2p_w40_2x_coco.py + Metadata: + Training Memory (GB): 10.4 + inference time (ms/im): + - value: 95.24 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/faster_rcnn_hrnetv2p_w40_2x_coco/faster_rcnn_hrnetv2p_w40_2x_coco_20200512_161033-0f236ef4.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: mask_rcnn_hrnetv2p_w18_1x_coco + In Collection: Mask R-CNN + Config: configs/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco.py + Metadata: + Training Memory (GB): 7.0 + inference time (ms/im): + - value: 85.47 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 34.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w18_1x_coco/mask_rcnn_hrnetv2p_w18_1x_coco_20200205-1c3d78ed.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: mask_rcnn_hrnetv2p_w18_2x_coco + In Collection: Mask R-CNN + Config: configs/hrnet/mask_rcnn_hrnetv2p_w18_2x_coco.py + Metadata: + Training Memory (GB): 7.0 + inference time (ms/im): + - value: 85.47 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w18_2x_coco/mask_rcnn_hrnetv2p_w18_2x_coco_20200212-b3c825b1.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: mask_rcnn_hrnetv2p_w32_1x_coco + In Collection: Mask R-CNN + Config: configs/hrnet/mask_rcnn_hrnetv2p_w32_1x_coco.py + Metadata: + Training Memory (GB): 9.4 + inference time (ms/im): + - value: 88.5 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w32_1x_coco/mask_rcnn_hrnetv2p_w32_1x_coco_20200207-b29f616e.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: mask_rcnn_hrnetv2p_w32_2x_coco + In Collection: Mask R-CNN + Config: configs/hrnet/mask_rcnn_hrnetv2p_w32_2x_coco.py + Metadata: + Training Memory (GB): 9.4 + inference time (ms/im): + - value: 88.5 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w32_2x_coco/mask_rcnn_hrnetv2p_w32_2x_coco_20200213-45b75b4d.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: mask_rcnn_hrnetv2p_w40_1x_coco + In Collection: Mask R-CNN + Config: configs/hrnet/mask_rcnn_hrnetv2p_w40_1x_coco.py + Metadata: + Training Memory (GB): 10.9 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w40_1x_coco/mask_rcnn_hrnetv2p_w40_1x_coco_20200511_015646-66738b35.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: mask_rcnn_hrnetv2p_w40_2x_coco + In Collection: Mask R-CNN + Config: configs/hrnet/mask_rcnn_hrnetv2p_w40_2x_coco.py + Metadata: + Training Memory (GB): 10.9 + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/mask_rcnn_hrnetv2p_w40_2x_coco/mask_rcnn_hrnetv2p_w40_2x_coco_20200512_163732-aed5e4ab.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: cascade_rcnn_hrnetv2p_w18_20e_coco + In Collection: Cascade R-CNN + Config: configs/hrnet/cascade_rcnn_hrnetv2p_w18_20e_coco.py + Metadata: + Training Memory (GB): 7.0 + inference time (ms/im): + - value: 90.91 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_rcnn_hrnetv2p_w18_20e_coco/cascade_rcnn_hrnetv2p_w18_20e_coco_20200210-434be9d7.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: cascade_rcnn_hrnetv2p_w32_20e_coco + In Collection: Cascade R-CNN + Config: configs/hrnet/cascade_rcnn_hrnetv2p_w32_20e_coco.py + Metadata: + Training Memory (GB): 9.4 + inference time (ms/im): + - value: 90.91 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_rcnn_hrnetv2p_w32_20e_coco/cascade_rcnn_hrnetv2p_w32_20e_coco_20200208-928455a4.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: cascade_rcnn_hrnetv2p_w40_20e_coco + In Collection: Cascade R-CNN + Config: configs/hrnet/cascade_rcnn_hrnetv2p_w40_20e_coco.py + Metadata: + Training Memory (GB): 10.8 + Epochs: 20 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_rcnn_hrnetv2p_w40_20e_coco/cascade_rcnn_hrnetv2p_w40_20e_coco_20200512_161112-75e47b04.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: cascade_mask_rcnn_hrnetv2p_w18_20e_coco + In Collection: Cascade R-CNN + Config: configs/hrnet/cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py + Metadata: + Training Memory (GB): 8.5 + inference time (ms/im): + - value: 117.65 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_mask_rcnn_hrnetv2p_w18_20e_coco/cascade_mask_rcnn_hrnetv2p_w18_20e_coco_20200210-b543cd2b.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: cascade_mask_rcnn_hrnetv2p_w32_20e_coco + In Collection: Cascade R-CNN + Config: configs/hrnet/cascade_mask_rcnn_hrnetv2p_w32_20e_coco.py + Metadata: + inference time (ms/im): + - value: 120.48 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_mask_rcnn_hrnetv2p_w32_20e_coco/cascade_mask_rcnn_hrnetv2p_w32_20e_coco_20200512_154043-39d9cf7b.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: cascade_mask_rcnn_hrnetv2p_w40_20e_coco + In Collection: Cascade R-CNN + Config: configs/hrnet/cascade_mask_rcnn_hrnetv2p_w40_20e_coco.py + Metadata: + Training Memory (GB): 12.5 + Epochs: 20 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_mask_rcnn_hrnetv2p_w40_20e_coco/cascade_mask_rcnn_hrnetv2p_w40_20e_coco_20200527_204922-969c4610.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: htc_hrnetv2p_w18_20e_coco + In Collection: HTC + Config: configs/hrnet/htc_hrnetv2p_w18_20e_coco.py + Metadata: + Training Memory (GB): 10.8 + inference time (ms/im): + - value: 212.77 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/htc_hrnetv2p_w18_20e_coco/htc_hrnetv2p_w18_20e_coco_20200210-b266988c.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: htc_hrnetv2p_w32_20e_coco + In Collection: HTC + Config: configs/hrnet/htc_hrnetv2p_w32_20e_coco.py + Metadata: + Training Memory (GB): 13.1 + inference time (ms/im): + - value: 204.08 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/htc_hrnetv2p_w32_20e_coco/htc_hrnetv2p_w32_20e_coco_20200207-7639fa12.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: htc_hrnetv2p_w40_20e_coco + In Collection: HTC + Config: configs/hrnet/htc_hrnetv2p_w40_20e_coco.py + Metadata: + Training Memory (GB): 14.6 + Epochs: 20 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/htc_hrnetv2p_w40_20e_coco/htc_hrnetv2p_w40_20e_coco_20200529_183411-417c4d5b.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: fcos_hrnetv2p_w18_gn-head_4x4_1x_coco + In Collection: FCOS + Config: configs/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco.py + Metadata: + Training Resources: 4x V100 GPUs + Batch Size: 16 + Training Memory (GB): 13.0 + inference time (ms/im): + - value: 77.52 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 35.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco/fcos_hrnetv2p_w18_gn-head_4x4_1x_coco_20201212_100710-4ad151de.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: fcos_hrnetv2p_w18_gn-head_4x4_2x_coco + In Collection: FCOS + Config: configs/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco.py + Metadata: + Training Resources: 4x V100 GPUs + Batch Size: 16 + Training Memory (GB): 13.0 + inference time (ms/im): + - value: 77.52 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco/fcos_hrnetv2p_w18_gn-head_4x4_2x_coco_20201212_101110-5c575fa5.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: fcos_hrnetv2p_w32_gn-head_4x4_1x_coco + In Collection: FCOS + Config: configs/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco.py + Metadata: + Training Resources: 4x V100 GPUs + Batch Size: 16 + Training Memory (GB): 17.5 + inference time (ms/im): + - value: 77.52 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco/fcos_hrnetv2p_w32_gn-head_4x4_1x_coco_20201211_134730-cb8055c0.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: fcos_hrnetv2p_w32_gn-head_4x4_2x_coco + In Collection: FCOS + Config: configs/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco.py + Metadata: + Training Resources: 4x V100 GPUs + Batch Size: 16 + Training Memory (GB): 17.5 + inference time (ms/im): + - value: 77.52 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco/fcos_hrnetv2p_w32_gn-head_4x4_2x_coco_20201212_112133-77b6b9bb.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco + In Collection: FCOS + Config: configs/hrnet/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco.py + Metadata: + Training Resources: 4x V100 GPUs + Batch Size: 16 + Training Memory (GB): 13.0 + inference time (ms/im): + - value: 77.52 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco/fcos_hrnetv2p_w18_gn-head_mstrain_640-800_4x4_2x_coco_20201212_111651-441e9d9f.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco + In Collection: FCOS + Config: configs/hrnet/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco.py + Metadata: + Training Resources: 4x V100 GPUs + Batch Size: 16 + Training Memory (GB): 17.5 + inference time (ms/im): + - value: 80.65 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco/fcos_hrnetv2p_w32_gn-head_mstrain_640-800_4x4_2x_coco_20201212_090846-b6f2b49f.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 + + - Name: fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco + In Collection: FCOS + Config: configs/hrnet/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco.py + Metadata: + Training Resources: 4x V100 GPUs + Batch Size: 16 + Training Memory (GB): 20.3 + inference time (ms/im): + - value: 92.59 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Architecture: + - HRNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/hrnet/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco/fcos_hrnetv2p_w40_gn-head_mstrain_640-800_4x4_2x_coco_20201212_124752-f22d2ce5.pth + Paper: + URL: https://arxiv.org/abs/1904.04514 + Title: 'Deep High-Resolution Representation Learning for Visual Recognition' + README: configs/hrnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/backbones/hrnet.py#L195 + Version: v2.0.0 diff --git a/configs/htc/README.md b/configs/htc/README.md new file mode 100644 index 0000000..747f8f6 --- /dev/null +++ b/configs/htc/README.md @@ -0,0 +1,67 @@ +# HTC + +> [Hybrid Task Cascade for Instance Segmentation](https://arxiv.org/abs/1901.07518) + + + +## Abstract + +Cascade is a classic yet powerful architecture that has boosted performance on various tasks. However, how to introduce cascade to instance segmentation remains an open question. A simple combination of Cascade R-CNN and Mask R-CNN only brings limited gain. In exploring a more effective approach, we find that the key to a successful instance segmentation cascade is to fully leverage the reciprocal relationship between detection and segmentation. In this work, we propose a new framework, Hybrid Task Cascade (HTC), which differs in two important aspects: (1) instead of performing cascaded refinement on these two tasks separately, it interweaves them for a joint multi-stage processing; (2) it adopts a fully convolutional branch to provide spatial context, which can help distinguishing hard foreground from cluttered background. Overall, this framework can learn more discriminative features progressively while integrating complementary features together in each stage. Without bells and whistles, a single HTC obtains 38.4 and 1.5 improvement over a strong Cascade Mask R-CNN baseline on MSCOCO dataset. Moreover, our overall system achieves 48.6 mask AP on the test-challenge split, ranking 1st in the COCO 2018 Challenge Object Detection Task. + +
+ +
+ +## Introduction + +HTC requires COCO and [COCO-stuff](http://calvin.inf.ed.ac.uk/wp-content/uploads/data/cocostuffdataset/stuffthingmaps_trainval2017.zip) dataset for training. You need to download and extract it in the COCO dataset path. +The directory should be like this. + +```none +mmdetection +├── mmdet +├── tools +├── configs +├── data +│ ├── coco +│ │ ├── annotations +│ │ ├── train2017 +│ │ ├── val2017 +│ │ ├── test2017 +| | ├── stuffthingmaps +``` + +## Results and Models + +The results on COCO 2017val are shown in the below table. (results on test-dev are usually slightly higher than val) + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :-------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | 1x | 8.2 | 5.8 | 42.3 | 37.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/htc/htc_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_r50_fpn_1x_coco/htc_r50_fpn_1x_coco_20200317-7332cf16.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_r50_fpn_1x_coco/htc_r50_fpn_1x_coco_20200317_070435.log.json) | +| R-50-FPN | pytorch | 20e | 8.2 | - | 43.3 | 38.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/htc/htc_r50_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_r50_fpn_20e_coco/htc_r50_fpn_20e_coco_20200319-fe28c577.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_r50_fpn_20e_coco/htc_r50_fpn_20e_coco_20200319_070313.log.json) | +| R-101-FPN | pytorch | 20e | 10.2 | 5.5 | 44.8 | 39.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/htc/htc_r101_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_r101_fpn_20e_coco/htc_r101_fpn_20e_coco_20200317-9b41b48f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_r101_fpn_20e_coco/htc_r101_fpn_20e_coco_20200317_153107.log.json) | +| X-101-32x4d-FPN | pytorch | 20e | 11.4 | 5.0 | 46.1 | 40.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/htc/htc_x101_32x4d_fpn_16x1_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_x101_32x4d_fpn_16x1_20e_coco/htc_x101_32x4d_fpn_16x1_20e_coco_20200318-de97ae01.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_x101_32x4d_fpn_16x1_20e_coco/htc_x101_32x4d_fpn_16x1_20e_coco_20200318_034519.log.json) | +| X-101-64x4d-FPN | pytorch | 20e | 14.5 | 4.4 | 47.0 | 41.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/htc/htc_x101_64x4d_fpn_16x1_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_x101_64x4d_fpn_16x1_20e_coco/htc_x101_64x4d_fpn_16x1_20e_coco_20200318-b181fd7a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_x101_64x4d_fpn_16x1_20e_coco/htc_x101_64x4d_fpn_16x1_20e_coco_20200318_081711.log.json) | + +- In the HTC paper and COCO 2018 Challenge, `score_thr` is set to 0.001 for both baselines and HTC. +- We use 8 GPUs with 2 images/GPU for R-50 and R-101 models, and 16 GPUs with 1 image/GPU for X-101 models. + If you would like to train X-101 HTC with 8 GPUs, you need to change the lr from 0.02 to 0.01. + +We also provide a powerful HTC with DCN and multi-scale training model. No testing augmentation is used. + +| Backbone | Style | DCN | training scales | Lr schd | box AP | mask AP | Config | Download | +| :-------------: | :-----: | :---: | :-------------: | :-----: | :----: | :-----: | :------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| X-101-64x4d-FPN | pytorch | c3-c5 | 400~1400 | 20e | 50.4 | 43.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/htc/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco_20200312-946fd751.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/htc/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco_20200312_203410.log.json) | + +## Citation + +We provide config files to reproduce the results in the CVPR 2019 paper for [Hybrid Task Cascade](https://arxiv.org/abs/1901.07518). + +```latex +@inproceedings{chen2019hybrid, + title={Hybrid task cascade for instance segmentation}, + author={Chen, Kai and Pang, Jiangmiao and Wang, Jiaqi and Xiong, Yu and Li, Xiaoxiao and Sun, Shuyang and Feng, Wansen and Liu, Ziwei and Shi, Jianping and Ouyang, Wanli and Chen Change Loy and Dahua Lin}, + booktitle={IEEE Conference on Computer Vision and Pattern Recognition}, + year={2019} +} +``` diff --git a/configs/htc/htc_r101_fpn_20e_coco.py b/configs/htc/htc_r101_fpn_20e_coco.py new file mode 100644 index 0000000..b42297b --- /dev/null +++ b/configs/htc/htc_r101_fpn_20e_coco.py @@ -0,0 +1,9 @@ +_base_ = './htc_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) +# learning policy +lr_config = dict(step=[16, 19]) +runner = dict(type='EpochBasedRunner', max_epochs=20) diff --git a/configs/htc/htc_r50_fpn_1x_coco.py b/configs/htc/htc_r50_fpn_1x_coco.py new file mode 100644 index 0000000..1e8e18a --- /dev/null +++ b/configs/htc/htc_r50_fpn_1x_coco.py @@ -0,0 +1,56 @@ +_base_ = './htc_without_semantic_r50_fpn_1x_coco.py' +model = dict( + roi_head=dict( + semantic_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=256, + featmap_strides=[8]), + semantic_head=dict( + type='FusedSemanticHead', + num_ins=5, + fusion_level=1, + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=183, + loss_seg=dict( + type='CrossEntropyLoss', ignore_index=255, loss_weight=0.2)))) +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', with_bbox=True, with_mask=True, with_seg=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='SegRescale', scale_factor=1 / 8), + dict(type='DefaultFormatBundle'), + dict( + type='Collect', + keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict( + seg_prefix=data_root + 'stuffthingmaps/train2017/', + pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/htc/htc_r50_fpn_20e_coco.py b/configs/htc/htc_r50_fpn_20e_coco.py new file mode 100644 index 0000000..7d2e011 --- /dev/null +++ b/configs/htc/htc_r50_fpn_20e_coco.py @@ -0,0 +1,4 @@ +_base_ = './htc_r50_fpn_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 19]) +runner = dict(type='EpochBasedRunner', max_epochs=20) diff --git a/configs/htc/htc_without_semantic_r50_fpn_1x_coco.py b/configs/htc/htc_without_semantic_r50_fpn_1x_coco.py new file mode 100644 index 0000000..565104f --- /dev/null +++ b/configs/htc/htc_without_semantic_r50_fpn_1x_coco.py @@ -0,0 +1,236 @@ +_base_ = [ + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# model settings +model = dict( + type='HybridTaskCascade', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + rpn_head=dict( + type='RPNHead', + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), + roi_head=dict( + type='HybridTaskCascadeRoIHead', + interleaved=True, + mask_info_flow=True, + num_stages=3, + stage_loss_weights=[1, 0.5, 0.25], + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=[ + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.05, 0.05, 0.1, 0.1]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.033, 0.033, 0.067, 0.067]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)) + ], + mask_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + mask_head=[ + dict( + type='HTCMaskHead', + with_conv_res=False, + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=80, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0)), + dict( + type='HTCMaskHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=80, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0)), + dict( + type='HTCMaskHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=80, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0)) + ]), + # model training and testing settings + train_cfg=dict( + rpn=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=0, + pos_weight=-1, + debug=False), + rpn_proposal=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=[ + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=28, + pos_weight=-1, + debug=False), + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.6, + neg_iou_thr=0.6, + min_pos_iou=0.6, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=28, + pos_weight=-1, + debug=False), + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.7, + min_pos_iou=0.7, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True), + mask_size=28, + pos_weight=-1, + debug=False) + ]), + test_cfg=dict( + rpn=dict( + nms_pre=1000, + max_per_img=1000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + score_thr=0.001, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100, + mask_thr_binary=0.5))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + val=dict(pipeline=test_pipeline), test=dict(pipeline=test_pipeline)) diff --git a/configs/htc/htc_x101_32x4d_fpn_16x1_20e_coco.py b/configs/htc/htc_x101_32x4d_fpn_16x1_20e_coco.py new file mode 100644 index 0000000..0c834f2 --- /dev/null +++ b/configs/htc/htc_x101_32x4d_fpn_16x1_20e_coco.py @@ -0,0 +1,19 @@ +_base_ = './htc_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) +data = dict(samples_per_gpu=1, workers_per_gpu=1) +# learning policy +lr_config = dict(step=[16, 19]) +runner = dict(type='EpochBasedRunner', max_epochs=20) diff --git a/configs/htc/htc_x101_64x4d_fpn_16x1_20e_coco.py b/configs/htc/htc_x101_64x4d_fpn_16x1_20e_coco.py new file mode 100644 index 0000000..8b0d962 --- /dev/null +++ b/configs/htc/htc_x101_64x4d_fpn_16x1_20e_coco.py @@ -0,0 +1,19 @@ +_base_ = './htc_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) +data = dict(samples_per_gpu=1, workers_per_gpu=1) +# learning policy +lr_config = dict(step=[16, 19]) +runner = dict(type='EpochBasedRunner', max_epochs=20) diff --git a/configs/htc/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco.py b/configs/htc/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco.py new file mode 100644 index 0000000..c8d8703 --- /dev/null +++ b/configs/htc/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco.py @@ -0,0 +1,43 @@ +_base_ = './htc_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) +# dataset settings +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', with_bbox=True, with_mask=True, with_seg=True), + dict( + type='Resize', + img_scale=[(1600, 400), (1600, 1400)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='SegRescale', scale_factor=1 / 8), + dict(type='DefaultFormatBundle'), + dict( + type='Collect', + keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks', 'gt_semantic_seg']), +] +data = dict( + samples_per_gpu=1, workers_per_gpu=1, train=dict(pipeline=train_pipeline)) +# learning policy +lr_config = dict(step=[16, 19]) +runner = dict(type='EpochBasedRunner', max_epochs=20) diff --git a/configs/htc/metafile.yml b/configs/htc/metafile.yml new file mode 100644 index 0000000..acd038c --- /dev/null +++ b/configs/htc/metafile.yml @@ -0,0 +1,165 @@ +Collections: + - Name: HTC + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - HTC + - RPN + - ResNet + - ResNeXt + - RoIAlign + Paper: + URL: https://arxiv.org/abs/1901.07518 + Title: 'Hybrid Task Cascade for Instance Segmentation' + README: configs/htc/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/detectors/htc.py#L6 + Version: v2.0.0 + +Models: + - Name: htc_r50_fpn_1x_coco + In Collection: HTC + Config: configs/htc/htc_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 8.2 + inference time (ms/im): + - value: 172.41 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/htc/htc_r50_fpn_1x_coco/htc_r50_fpn_1x_coco_20200317-7332cf16.pth + + - Name: htc_r50_fpn_20e_coco + In Collection: HTC + Config: configs/htc/htc_r50_fpn_20e_coco.py + Metadata: + Training Memory (GB): 8.2 + inference time (ms/im): + - value: 172.41 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/htc/htc_r50_fpn_20e_coco/htc_r50_fpn_20e_coco_20200319-fe28c577.pth + + - Name: htc_r101_fpn_20e_coco + In Collection: HTC + Config: configs/htc/htc_r101_fpn_20e_coco.py + Metadata: + Training Memory (GB): 10.2 + inference time (ms/im): + - value: 181.82 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/htc/htc_r101_fpn_20e_coco/htc_r101_fpn_20e_coco_20200317-9b41b48f.pth + + - Name: htc_x101_32x4d_fpn_16x1_20e_coco + In Collection: HTC + Config: configs/htc/htc_x101_32x4d_fpn_16x1_20e_coco.py + Metadata: + Training Resources: 16x V100 GPUs + Batch Size: 16 + Training Memory (GB): 11.4 + inference time (ms/im): + - value: 200 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/htc/htc_x101_32x4d_fpn_16x1_20e_coco/htc_x101_32x4d_fpn_16x1_20e_coco_20200318-de97ae01.pth + + - Name: htc_x101_64x4d_fpn_16x1_20e_coco + In Collection: HTC + Config: configs/htc/htc_x101_64x4d_fpn_16x1_20e_coco.py + Metadata: + Training Resources: 16x V100 GPUs + Batch Size: 16 + Training Memory (GB): 14.5 + inference time (ms/im): + - value: 227.27 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 41.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/htc/htc_x101_64x4d_fpn_16x1_20e_coco/htc_x101_64x4d_fpn_16x1_20e_coco_20200318-b181fd7a.pth + + - Name: htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco + In Collection: HTC + Config: configs/htc/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco.py + Metadata: + Training Resources: 16x V100 GPUs + Batch Size: 16 + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 50.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 43.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/htc/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco/htc_x101_64x4d_fpn_dconv_c3-c5_mstrain_400_1400_16x1_20e_coco_20200312-946fd751.pth diff --git a/configs/instaboost/README.md b/configs/instaboost/README.md new file mode 100644 index 0000000..82ed334 --- /dev/null +++ b/configs/instaboost/README.md @@ -0,0 +1,58 @@ +# Instaboost + +> [Instaboost: Boosting instance segmentation via probability map guided copy-pasting](https://arxiv.org/abs/1908.07801) + + + +## Abstract + +Instance segmentation requires a large number of training samples to achieve satisfactory performance and benefits from proper data augmentation. To enlarge the training set and increase the diversity, previous methods have investigated using data annotation from other domain (e.g. bbox, point) in a weakly supervised mechanism. In this paper, we present a simple, efficient and effective method to augment the training set using the existing instance mask annotations. Exploiting the pixel redundancy of the background, we are able to improve the performance of Mask R-CNN for 1.7 mAP on COCO dataset and 3.3 mAP on Pascal VOC dataset by simply introducing random jittering to objects. Furthermore, we propose a location probability map based approach to explore the feasible locations that objects can be placed based on local appearance similarity. With the guidance of such map, we boost the performance of R101-Mask R-CNN on instance segmentation from 35.7 mAP to 37.9 mAP without modifying the backbone or network structure. Our method is simple to implement and does not increase the computational complexity. It can be integrated into the training pipeline of any instance segmentation model without affecting the training and inference efficiency. + +
+ +
+ +## Introduction + +Configs in this directory is the implementation for ICCV2019 paper "InstaBoost: Boosting Instance Segmentation Via Probability Map Guided Copy-Pasting" and provided by the authors of the paper. InstaBoost is a data augmentation method for object detection and instance segmentation. The paper has been released on [`arXiv`](https://arxiv.org/abs/1908.07801). + +## Usage + +### Requirements + +You need to install `instaboostfast` before using it. + +```shell +pip install instaboostfast +``` + +The code and more details can be found [here](https://github.com/GothicAi/Instaboost). + +### Integration with MMDetection + +InstaBoost have been already integrated in the data pipeline, thus all you need is to add or change **InstaBoost** configurations after **LoadImageFromFile**. We have provided examples like [this](mask_rcnn_r50_fpn_instaboost_4x#L121). You can refer to [`InstaBoostConfig`](https://github.com/GothicAi/InstaBoost-pypi#instaboostconfig) for more details. + +## Results and Models + +- All models were trained on `coco_2017_train` and tested on `coco_2017_val` for convenience of evaluation and comparison. In the paper, the results are obtained from `test-dev`. +- To balance accuracy and training time when using InstaBoost, models released in this page are all trained for 48 Epochs. Other training and testing configs strictly follow the original framework. +- For results and models in MMDetection V1.x, please refer to [Instaboost](https://github.com/GothicAi/Instaboost). + +| Network | Backbone | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-----------: | :-------------: | :-----: | :------: | :------------: | :----: | :-----: | :--------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Mask R-CNN | R-50-FPN | 4x | 4.4 | 17.5 | 40.6 | 36.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/instaboost/mask_rcnn_r50_fpn_instaboost_4x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/instaboost/mask_rcnn_r50_fpn_instaboost_4x_coco/mask_rcnn_r50_fpn_instaboost_4x_coco_20200307-d025f83a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/instaboost/mask_rcnn_r50_fpn_instaboost_4x_coco/mask_rcnn_r50_fpn_instaboost_4x_coco_20200307_223635.log.json) | +| Mask R-CNN | R-101-FPN | 4x | 6.4 | | 42.5 | 38.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/instaboost/mask_rcnn_r101_fpn_instaboost_4x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/instaboost/mask_rcnn_r101_fpn_instaboost_4x_coco/mask_rcnn_r101_fpn_instaboost_4x_coco_20200703_235738-f23f3a5f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/instaboost/mask_rcnn_r101_fpn_instaboost_4x_coco/mask_rcnn_r101_fpn_instaboost_4x_coco_20200703_235738.log.json) | +| Mask R-CNN | X-101-64x4d-FPN | 4x | 10.7 | | 44.7 | 39.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/instaboost/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/instaboost/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco_20200515_080947-8ed58c1b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/instaboost/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco_20200515_080947.log.json) | +| Cascade R-CNN | R-101-FPN | 4x | 6.0 | 12.0 | 43.7 | 38.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/instaboost/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/instaboost/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco_20200307-c19d98d9.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/instaboost/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco_20200307_223646.log.json) | + +## Citation + +```latex +@inproceedings{fang2019instaboost, + title={Instaboost: Boosting instance segmentation via probability map guided copy-pasting}, + author={Fang, Hao-Shu and Sun, Jianhua and Wang, Runzhong and Gou, Minghao and Li, Yong-Lu and Lu, Cewu}, + booktitle={Proceedings of the IEEE International Conference on Computer Vision}, + pages={682--691}, + year={2019} +} +``` diff --git a/configs/instaboost/cascade_mask_rcnn_r101_fpn_instaboost_4x_coco.py b/configs/instaboost/cascade_mask_rcnn_r101_fpn_instaboost_4x_coco.py new file mode 100644 index 0000000..9d0515d --- /dev/null +++ b/configs/instaboost/cascade_mask_rcnn_r101_fpn_instaboost_4x_coco.py @@ -0,0 +1,7 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_instaboost_4x_coco.py' + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/instaboost/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco.py b/configs/instaboost/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco.py new file mode 100644 index 0000000..a89a81f --- /dev/null +++ b/configs/instaboost/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco.py @@ -0,0 +1,28 @@ +_base_ = '../cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='InstaBoost', + action_candidate=('normal', 'horizontal', 'skip'), + action_prob=(1, 0, 0), + scale=(0.8, 1.2), + dx=15, + dy=15, + theta=(-1, 1), + color_prob=0.5, + hflag=False, + aug_ratio=0.5), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict(train=dict(pipeline=train_pipeline)) +# learning policy +lr_config = dict(step=[32, 44]) +runner = dict(type='EpochBasedRunner', max_epochs=48) diff --git a/configs/instaboost/cascade_mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco.py b/configs/instaboost/cascade_mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco.py new file mode 100644 index 0000000..d67b799 --- /dev/null +++ b/configs/instaboost/cascade_mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco.py @@ -0,0 +1,14 @@ +_base_ = './cascade_mask_rcnn_r50_fpn_instaboost_4x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/instaboost/mask_rcnn_r101_fpn_instaboost_4x_coco.py b/configs/instaboost/mask_rcnn_r101_fpn_instaboost_4x_coco.py new file mode 100644 index 0000000..ebbb43e --- /dev/null +++ b/configs/instaboost/mask_rcnn_r101_fpn_instaboost_4x_coco.py @@ -0,0 +1,6 @@ +_base_ = './mask_rcnn_r50_fpn_instaboost_4x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/instaboost/mask_rcnn_r50_fpn_instaboost_4x_coco.py b/configs/instaboost/mask_rcnn_r50_fpn_instaboost_4x_coco.py new file mode 100644 index 0000000..55ca62b --- /dev/null +++ b/configs/instaboost/mask_rcnn_r50_fpn_instaboost_4x_coco.py @@ -0,0 +1,28 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='InstaBoost', + action_candidate=('normal', 'horizontal', 'skip'), + action_prob=(1, 0, 0), + scale=(0.8, 1.2), + dx=15, + dy=15, + theta=(-1, 1), + color_prob=0.5, + hflag=False, + aug_ratio=0.5), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict(train=dict(pipeline=train_pipeline)) +# learning policy +lr_config = dict(step=[32, 44]) +runner = dict(type='EpochBasedRunner', max_epochs=48) diff --git a/configs/instaboost/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco.py b/configs/instaboost/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco.py new file mode 100644 index 0000000..2010f44 --- /dev/null +++ b/configs/instaboost/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco.py @@ -0,0 +1,14 @@ +_base_ = './mask_rcnn_r50_fpn_instaboost_4x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/instaboost/metafile.yml b/configs/instaboost/metafile.yml new file mode 100644 index 0000000..325283d --- /dev/null +++ b/configs/instaboost/metafile.yml @@ -0,0 +1,99 @@ +Collections: + - Name: InstaBoost + Metadata: + Training Data: COCO + Training Techniques: + - InstaBoost + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Paper: + URL: https://arxiv.org/abs/1908.07801 + Title: 'Instaboost: Boosting instance segmentation via probability map guided copy-pasting' + README: configs/instaboost/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/datasets/pipelines/instaboost.py#L7 + Version: v2.0.0 + +Models: + - Name: mask_rcnn_r50_fpn_instaboost_4x_coco + In Collection: InstaBoost + Config: configs/instaboost/mask_rcnn_r50_fpn_instaboost_4x_coco.py + Metadata: + Training Memory (GB): 4.4 + inference time (ms/im): + - value: 57.14 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 48 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/instaboost/mask_rcnn_r50_fpn_instaboost_4x_coco/mask_rcnn_r50_fpn_instaboost_4x_coco_20200307-d025f83a.pth + + - Name: mask_rcnn_r101_fpn_instaboost_4x_coco + In Collection: InstaBoost + Config: configs/instaboost/mask_rcnn_r101_fpn_instaboost_4x_coco.py + Metadata: + Training Memory (GB): 6.4 + Epochs: 48 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/instaboost/mask_rcnn_r101_fpn_instaboost_4x_coco/mask_rcnn_r101_fpn_instaboost_4x_coco_20200703_235738-f23f3a5f.pth + + - Name: mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco + In Collection: InstaBoost + Config: configs/instaboost/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco.py + Metadata: + Training Memory (GB): 10.7 + Epochs: 48 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/instaboost/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco/mask_rcnn_x101_64x4d_fpn_instaboost_4x_coco_20200515_080947-8ed58c1b.pth + + - Name: cascade_mask_rcnn_r50_fpn_instaboost_4x_coco + In Collection: InstaBoost + Config: configs/instaboost/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco.py + Metadata: + Training Memory (GB): 6.0 + inference time (ms/im): + - value: 83.33 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 48 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/instaboost/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco/cascade_mask_rcnn_r50_fpn_instaboost_4x_coco_20200307-c19d98d9.pth diff --git a/configs/lad/README.md b/configs/lad/README.md new file mode 100644 index 0000000..f2b7c20 --- /dev/null +++ b/configs/lad/README.md @@ -0,0 +1,44 @@ +# LAD + +> [Improving Object Detection by Label Assignment Distillation](https://arxiv.org/abs/2108.10520) + + + +## Abstract + +Label assignment in object detection aims to assign targets, foreground or background, to sampled regions in an image. Unlike labeling for image classification, this problem is not well defined due to the object's bounding box. In this paper, we investigate the problem from a perspective of distillation, hence we call Label Assignment Distillation (LAD). Our initial motivation is very simple, we use a teacher network to generate labels for the student. This can be achieved in two ways: either using the teacher's prediction as the direct targets (soft label), or through the hard labels dynamically assigned by the teacher (LAD). Our experiments reveal that: (i) LAD is more effective than soft-label, but they are complementary. (ii) Using LAD, a smaller teacher can also improve a larger student significantly, while soft-label can't. We then introduce Co-learning LAD, in which two networks simultaneously learn from scratch and the role of teacher and student are dynamically interchanged. Using PAA-ResNet50 as a teacher, our LAD techniques can improve detectors PAA-ResNet101 and PAA-ResNeXt101 to 46AP and 47.5AP on the COCO test-dev set. With a stronger teacher PAA-SwinB, we improve the students PAA-ResNet50 to 43.7AP by only 1x schedule training and standard setting, and PAA-ResNet101 to 47.9AP, significantly surpassing the current methods. + +
+ +
+ +## Results and Models + +We provide config files to reproduce the object detection results in the +WACV 2022 paper for Improving Object Detection by Label Assignment +Distillation. + +### PAA with LAD + +| Teacher | Student | Training schedule | AP (val) | Config | Download | +| :-----: | :-----: | :---------------: | :------: | :---------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| -- | R-50 | 1x | 40.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/paa/paa_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_1x_coco/paa_r50_fpn_1x_coco_20200821-936edec3.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_1x_coco/paa_r50_fpn_1x_coco_20200821-936edec3.log.json) | +| -- | R-101 | 1x | 42.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/paa/paa_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r101_fpn_1x_coco/paa_r101_fpn_1x_coco_20200821-0a1825a4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r101_fpn_1x_coco/paa_r101_fpn_1x_coco_20200821-0a1825a4.log.json) | +| R-101 | R-50 | 1x | 41.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/lad/lad_r50_paa_r101_fpn_coco_1x.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/lad/lad_r50_paa_r101_fpn_coco_1x/lad_r50_paa_r101_fpn_coco_1x_20220708_124246-74c76ff0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/lad/lad_r50_paa_r101_fpn_coco_1x/lad_r50_paa_r101_fpn_coco_1x_20220708_124246.log.json) | +| R-50 | R-101 | 1x | 43.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/lad/lad_r101_paa_r50_fpn_coco_1x.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/lad/lad_r101_paa_r50_fpn_coco_1x/lad_r101_paa_r50_fpn_coco_1x_20220708_124357-9407ac54.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/lad/lad_r101_paa_r50_fpn_coco_1x/lad_r101_paa_r50_fpn_coco_1x_20220708_124357.log.json) | + +## Note + +- Meaning of Config name: lad_r50(student model)\_paa(based on paa)\_r101(teacher model)\_fpn(neck)\_coco(dataset)\_1x(12 epoch).py +- Results may fluctuate by about 0.2 mAP. + +## Citation + +```latex +@inproceedings{nguyen2021improving, + title={Improving Object Detection by Label Assignment Distillation}, + author={Chuong H. Nguyen and Thuy C. Nguyen and Tuan N. Tang and Nam L. H. Phan}, + booktitle = {WACV}, + year={2022} +} +``` diff --git a/configs/lad/lad_r101_paa_r50_fpn_coco_1x.py b/configs/lad/lad_r101_paa_r50_fpn_coco_1x.py new file mode 100644 index 0000000..4877d95 --- /dev/null +++ b/configs/lad/lad_r101_paa_r50_fpn_coco_1x.py @@ -0,0 +1,126 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +teacher_ckpt = 'https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_1x_coco/paa_r50_fpn_1x_coco_20200821-936edec3.pth' # noqa +model = dict( + type='LAD', + # student + backbone=dict( + type='ResNet', + depth=101, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + bbox_head=dict( + type='LADHead', + reg_decoded_bbox=True, + score_voting=True, + topk=9, + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=1.3), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.5)), + # teacher + teacher_ckpt=teacher_ckpt, + teacher_backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch'), + teacher_neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + teacher_bbox_head=dict( + type='LADHead', + reg_decoded_bbox=True, + score_voting=True, + topk=9, + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=1.3), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.5)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.1, + neg_iou_thr=0.1, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + score_voting=True, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) +data = dict(samples_per_gpu=8, workers_per_gpu=4) +optimizer = dict(lr=0.01) +fp16 = dict(loss_scale=512.) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/lad/lad_r50_paa_r101_fpn_coco_1x.py b/configs/lad/lad_r50_paa_r101_fpn_coco_1x.py new file mode 100644 index 0000000..29bbe69 --- /dev/null +++ b/configs/lad/lad_r50_paa_r101_fpn_coco_1x.py @@ -0,0 +1,125 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +teacher_ckpt = 'http://download.openmmlab.com/mmdetection/v2.0/paa/paa_r101_fpn_1x_coco/paa_r101_fpn_1x_coco_20200821-0a1825a4.pth' # noqa +model = dict( + type='LAD', + # student + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + bbox_head=dict( + type='LADHead', + reg_decoded_bbox=True, + score_voting=True, + topk=9, + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=1.3), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.5)), + # teacher + teacher_ckpt=teacher_ckpt, + teacher_backbone=dict( + type='ResNet', + depth=101, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch'), + teacher_neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + teacher_bbox_head=dict( + type='LADHead', + reg_decoded_bbox=True, + score_voting=True, + topk=9, + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=1.3), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.5)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.1, + neg_iou_thr=0.1, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + score_voting=True, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) +data = dict(samples_per_gpu=8, workers_per_gpu=4) +optimizer = dict(lr=0.01) +fp16 = dict(loss_scale=512.) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/lad/metafile.yml b/configs/lad/metafile.yml new file mode 100644 index 0000000..11a9fa9 --- /dev/null +++ b/configs/lad/metafile.yml @@ -0,0 +1,45 @@ +Collections: + - Name: Label Assignment Distillation + Metadata: + Training Data: COCO + Training Techniques: + - Label Assignment Distillation + - SGD with Momentum + - Weight Decay + Training Resources: 2x V100 GPUs + Architecture: + - FPN + - ResNet + Paper: + URL: https://arxiv.org/abs/2108.10520 + Title: 'Improving Object Detection by Label Assignment Distillation' + README: configs/lad/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.19.0/mmdet/models/detectors/lad.py#L10 + Version: v2.19.0 + +Models: + - Name: lad_r101_paa_r50_fpn_coco_1x + In Collection: Label Assignment Distillation + Config: configs/lad/lad_r101_paa_r50_fpn_coco_1x.py + Metadata: + Training Memory (GB): 12.4 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/lad/lad_r101_paa_r50_fpn_coco_1x/lad_r101_paa_r50_fpn_coco_1x_20220708_124357-9407ac54.pth + - Name: lad_r50_paa_r101_fpn_coco_1x + In Collection: Label Assignment Distillation + Config: configs/lad/lad_r50_paa_r101_fpn_coco_1x.py + Metadata: + Training Memory (GB): 8.9 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/lad/lad_r50_paa_r101_fpn_coco_1x/lad_r50_paa_r101_fpn_coco_1x_20220708_124246-74c76ff0.pth diff --git a/configs/ld/README.md b/configs/ld/README.md new file mode 100644 index 0000000..0109729 --- /dev/null +++ b/configs/ld/README.md @@ -0,0 +1,43 @@ +# LD + +> [Localization Distillation for Dense Object Detection](https://arxiv.org/abs/2102.12252) + + + +## Abstract + +Knowledge distillation (KD) has witnessed its powerful capability in learning compact models in object detection. Previous KD methods for object detection mostly focus on imitating deep features within the imitation regions instead of mimicking classification logits due to its inefficiency in distilling localization information. In this paper, by reformulating the knowledge distillation process on localization, we present a novel localization distillation (LD) method which can efficiently transfer the localization knowledge from the teacher to the student. Moreover, we also heuristically introduce the concept of valuable localization region that can aid to selectively distill the semantic and localization knowledge for a certain region. Combining these two new components, for the first time, we show that logit mimicking can outperform feature imitation and localization knowledge distillation is more important and efficient than semantic knowledge for distilling object detectors. Our distillation scheme is simple as well as effective and can be easily applied to different dense object detectors. Experiments show that our LD can boost the AP score of GFocal-ResNet-50 with a single-scale 1× training schedule from 40.1 to 42.1 on the COCO benchmark without any sacrifice on the inference speed. + +
+ +
+ +## Results and Models + +### GFocalV1 with LD + +| Teacher | Student | Training schedule | Mini-batch size | AP (val) | Config | Download | +| :-------: | :-----: | :---------------: | :-------------: | :------: | :-------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| -- | R-18 | 1x | 6 | 35.8 | | | +| R-101 | R-18 | 1x | 6 | 36.5 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/ld/ld_r18_gflv1_r101_fpn_coco_1x.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ld/ld_r18_gflv1_r101_fpn_coco_1x/ld_r18_gflv1_r101_fpn_coco_1x_20220702_062206-330e6332.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ld/ld_r18_gflv1_r101_fpn_coco_1x/ld_r18_gflv1_r101_fpn_coco_1x_20220702_062206.log.json) | +| -- | R-34 | 1x | 6 | 38.9 | | | +| R-101 | R-34 | 1x | 6 | 39.9 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/ld/ld_r34_gflv1_r101_fpn_coco_1x.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ld/ld_r34_gflv1_r101_fpn_coco_1x/ld_r34_gflv1_r101_fpn_coco_1x_20220630_134007-9bc69413.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ld/ld_r34_gflv1_r101_fpn_coco_1x/ld_r34_gflv1_r101_fpn_coco_1x_20220630_134007.log.json) | +| -- | R-50 | 1x | 6 | 40.1 | | | +| R-101 | R-50 | 1x | 6 | 41.0 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/ld/ld_r50_gflv1_r101_fpn_coco_1x.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ld/ld_r50_gflv1_r101_fpn_coco_1x/ld_r50_gflv1_r101_fpn_coco_1x_20220629_145355-8dc5bad8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ld/ld_r50_gflv1_r101_fpn_coco_1x/ld_r50_gflv1_r101_fpn_coco_1x_20220629_145355.log.json) | +| -- | R-101 | 2x | 6 | 44.6 | | | +| R-101-DCN | R-101 | 2x | 6 | 45.5 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/ld/ld_r101_gflv1_r101dcn_fpn_coco_2x.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ld/ld_r101_gflv1_r101dcn_fpn_coco_2x/ld_r101_gflv1_r101dcn_fpn_coco_2x_20220629_185920-9e658426.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ld/ld_r101_gflv1_r101dcn_fpn_coco_2x/ld_r101_gflv1_r101dcn_fpn_coco_2x_20220629_185920.log.json) | + +## Note + +- Meaning of Config name: ld_r18(student model)\_gflv1(based on gflv1)\_r101(teacher model)\_fpn(neck)\_coco(dataset)\_1x(12 epoch).py + +## Citation + +```latex +@Inproceedings{zheng2022LD, + title={Localization Distillation for Dense Object Detection}, + author= {Zheng, Zhaohui and Ye, Rongguang and Wang, Ping and Ren, Dongwei and Zuo, Wangmeng and Hou, Qibin and Cheng, Mingming}, + booktitle={CVPR}, + year={2022} +} +``` diff --git a/configs/ld/ld_r101_gflv1_r101dcn_fpn_coco_2x.py b/configs/ld/ld_r101_gflv1_r101dcn_fpn_coco_2x.py new file mode 100644 index 0000000..1cbdb4c --- /dev/null +++ b/configs/ld/ld_r101_gflv1_r101dcn_fpn_coco_2x.py @@ -0,0 +1,44 @@ +_base_ = ['./ld_r18_gflv1_r101_fpn_coco_1x.py'] +teacher_ckpt = 'https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco_20200630_102002-134b07df.pth' # noqa +model = dict( + teacher_config='configs/gfl/gfl_r101_fpn_dconv_c3-c5_mstrain_2x_coco.py', + teacher_ckpt=teacher_ckpt, + backbone=dict( + type='ResNet', + depth=101, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5)) + +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) +# multi-scale training +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 480), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +data = dict(train=dict(pipeline=train_pipeline)) diff --git a/configs/ld/ld_r18_gflv1_r101_fpn_coco_1x.py b/configs/ld/ld_r18_gflv1_r101_fpn_coco_1x.py new file mode 100644 index 0000000..18dce81 --- /dev/null +++ b/configs/ld/ld_r18_gflv1_r101_fpn_coco_1x.py @@ -0,0 +1,62 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +teacher_ckpt = 'https://download.openmmlab.com/mmdetection/v2.0/gfl/gfl_r101_fpn_mstrain_2x_coco/gfl_r101_fpn_mstrain_2x_coco_20200629_200126-dd12f847.pth' # noqa +model = dict( + type='KnowledgeDistillationSingleStageDetector', + teacher_config='configs/gfl/gfl_r101_fpn_mstrain_2x_coco.py', + teacher_ckpt=teacher_ckpt, + backbone=dict( + type='ResNet', + depth=18, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet18')), + neck=dict( + type='FPN', + in_channels=[64, 128, 256, 512], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + bbox_head=dict( + type='LDHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + loss_cls=dict( + type='QualityFocalLoss', + use_sigmoid=True, + beta=2.0, + loss_weight=1.0), + loss_dfl=dict(type='DistributionFocalLoss', loss_weight=0.25), + loss_ld=dict( + type='KnowledgeDistillationKLDivLoss', loss_weight=0.25, T=10), + reg_max=16, + loss_bbox=dict(type='GIoULoss', loss_weight=2.0)), + # training and testing settings + train_cfg=dict( + assigner=dict(type='ATSSAssigner', topk=9), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) + +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/configs/ld/ld_r34_gflv1_r101_fpn_coco_1x.py b/configs/ld/ld_r34_gflv1_r101_fpn_coco_1x.py new file mode 100644 index 0000000..3b6996d --- /dev/null +++ b/configs/ld/ld_r34_gflv1_r101_fpn_coco_1x.py @@ -0,0 +1,19 @@ +_base_ = ['./ld_r18_gflv1_r101_fpn_coco_1x.py'] +model = dict( + backbone=dict( + type='ResNet', + depth=34, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet34')), + neck=dict( + type='FPN', + in_channels=[64, 128, 256, 512], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5)) diff --git a/configs/ld/ld_r50_gflv1_r101_fpn_coco_1x.py b/configs/ld/ld_r50_gflv1_r101_fpn_coco_1x.py new file mode 100644 index 0000000..2b18785 --- /dev/null +++ b/configs/ld/ld_r50_gflv1_r101_fpn_coco_1x.py @@ -0,0 +1,19 @@ +_base_ = ['./ld_r18_gflv1_r101_fpn_coco_1x.py'] +model = dict( + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5)) diff --git a/configs/ld/metafile.yml b/configs/ld/metafile.yml new file mode 100644 index 0000000..2055e32 --- /dev/null +++ b/configs/ld/metafile.yml @@ -0,0 +1,69 @@ +Collections: + - Name: Localization Distillation + Metadata: + Training Data: COCO + Training Techniques: + - Localization Distillation + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - ResNet + Paper: + URL: https://arxiv.org/abs/2102.12252 + Title: 'Localization Distillation for Dense Object Detection' + README: configs/ld/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.11.0/mmdet/models/dense_heads/ld_head.py#L11 + Version: v2.11.0 + +Models: + - Name: ld_r18_gflv1_r101_fpn_coco_1x + In Collection: Localization Distillation + Config: configs/ld/ld_r18_gflv1_r101_fpn_coco_1x.py + Metadata: + Training Memory (GB): 1.8 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 36.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ld/ld_r18_gflv1_r101_fpn_coco_1x/ld_r18_gflv1_r101_fpn_coco_1x_20220702_062206-330e6332.pth + - Name: ld_r34_gflv1_r101_fpn_coco_1x + In Collection: Localization Distillation + Config: configs/ld/ld_r34_gflv1_r101_fpn_coco_1x.py + Metadata: + Training Memory (GB): 2.2 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ld/ld_r34_gflv1_r101_fpn_coco_1x/ld_r34_gflv1_r101_fpn_coco_1x_20220630_134007-9bc69413.pth + - Name: ld_r50_gflv1_r101_fpn_coco_1x + In Collection: Localization Distillation + Config: configs/ld/ld_r50_gflv1_r101_fpn_coco_1x.py + Metadata: + Training Memory (GB): 3.6 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ld/ld_r50_gflv1_r101_fpn_coco_1x/ld_r50_gflv1_r101_fpn_coco_1x_20220629_145355-8dc5bad8.pth + - Name: ld_r101_gflv1_r101dcn_fpn_coco_2x + In Collection: Localization Distillation + Config: configs/ld/ld_r101_gflv1_r101dcn_fpn_coco_2x.py + Metadata: + Training Memory (GB): 5.5 + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ld/ld_r101_gflv1_r101dcn_fpn_coco_2x/ld_r101_gflv1_r101dcn_fpn_coco_2x_20220629_185920-9e658426.pth diff --git a/configs/legacy_1.x/README.md b/configs/legacy_1.x/README.md new file mode 100644 index 0000000..c48477f --- /dev/null +++ b/configs/legacy_1.x/README.md @@ -0,0 +1,54 @@ +# Legacy Configs in MMDetection V1.x + + + +Configs in this directory implement the legacy configs used by MMDetection V1.x and its model zoos. + +To help users convert their models from V1.x to MMDetection V2.0, we provide v1.x configs to inference the converted v1.x models. +Due to the BC-breaking changes in MMDetection V2.0 from MMDetection V1.x, running inference with the same model weights in these two version will produce different results. The difference will cause within 1% AP absolute difference as can be found in the following table. + +## Usage + +To upgrade the model version, the users need to do the following steps. + +### 1. Convert model weights + +There are three main difference in the model weights between V1.x and V2.0 codebases. + +1. Since the class order in all the detector's classification branch is reordered, all the legacy model weights need to go through the conversion process. +2. The regression and segmentation head no longer contain the background channel. Weights in these background channels should be removed to fix in the current codebase. +3. For two-stage detectors, their wegihts need to be upgraded since MMDetection V2.0 refactors all the two-stage detectors with `RoIHead`. + +The users can do the same modification as mentioned above for the self-implemented +detectors. We provide a scripts `tools/model_converters/upgrade_model_version.py` to convert the model weights in the V1.x model zoo. + +```bash +python tools/model_converters/upgrade_model_version.py ${OLD_MODEL_PATH} ${NEW_MODEL_PATH} --num-classes ${NUM_CLASSES} + +``` + +- OLD_MODEL_PATH: the path to load the model weights in 1.x version. +- NEW_MODEL_PATH: the path to save the converted model weights in 2.0 version. +- NUM_CLASSES: number of classes of the original model weights. Usually it is 81 for COCO dataset, 21 for VOC dataset. + The number of classes in V2.0 models should be equal to that in V1.x models - 1. + +### 2. Use configs with legacy settings + +After converting the model weights, checkout to the v1.2 release to find the corresponding config file that uses the legacy settings. +The V1.x models usually need these three legacy modules: `LegacyAnchorGenerator`, `LegacyDeltaXYWHBBoxCoder`, and `RoIAlign(align=False)`. +For models using ResNet Caffe backbones, they also need to change the pretrain name and the corresponding `img_norm_cfg`. +An example is in [`retinanet_r50_caffe_fpn_1x_coco_v1.py`](retinanet_r50_caffe_fpn_1x_coco_v1.py) +Then use the config to test the model weights. For most models, the obtained results should be close to that in V1.x. +We provide configs of some common structures in this directory. + +## Performance + +The performance change after converting the models in this directory are listed as the following. + +| Method | Style | Lr schd | V1.x box AP | V1.x mask AP | V2.0 box AP | V2.0 mask AP | Config | Download | +| :-------------------------: | :-----: | :-----: | :---------: | :----------: | :---------: | :----------: | :------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | +| Mask R-CNN R-50-FPN | pytorch | 1x | 37.3 | 34.2 | 36.8 | 33.9 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/legacy_1.x/mask_rcnn_r50_fpn_1x_coco_v1.py) | [model](https://s3.ap-northeast-2.amazonaws.com/open-mmlab/mmdetection/models/mask_rcnn_r50_fpn_1x_20181010-069fa190.pth) | +| RetinaNet R-50-FPN | caffe | 1x | 35.8 | - | 35.4 | - | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/legacy_1.x/retinanet_r50_caffe_1x_coco_v1.py) | | +| RetinaNet R-50-FPN | pytorch | 1x | 35.6 | - | 35.2 | - | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/legacy_1.x/retinanet_r50_fpn_1x_coco_v1.py) | [model](https://s3.ap-northeast-2.amazonaws.com/open-mmlab/mmdetection/models/retinanet_r50_fpn_1x_20181125-7b0c2548.pth) | +| Cascade Mask R-CNN R-50-FPN | pytorch | 1x | 41.2 | 35.7 | 40.8 | 35.6 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/legacy_1.x/cascade_mask_rcnn_r50_fpn_1x_coco_v1.py) | [model](https://s3.ap-northeast-2.amazonaws.com/open-mmlab/mmdetection/models/cascade_mask_rcnn_r50_fpn_1x_20181123-88b170c9.pth) | +| SSD300-VGG16 | caffe | 120e | 25.7 | - | 25.4 | - | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/legacy_1.x/ssd300_coco_v1.py) | [model](https://s3.ap-northeast-2.amazonaws.com/open-mmlab/mmdetection/models/ssd300_coco_vgg16_caffe_120e_20181221-84d7110b.pth) | diff --git a/configs/legacy_1.x/cascade_mask_rcnn_r50_fpn_1x_coco_v1.py b/configs/legacy_1.x/cascade_mask_rcnn_r50_fpn_1x_coco_v1.py new file mode 100644 index 0000000..fc9d004 --- /dev/null +++ b/configs/legacy_1.x/cascade_mask_rcnn_r50_fpn_1x_coco_v1.py @@ -0,0 +1,79 @@ +_base_ = [ + '../_base_/models/cascade_mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='CascadeRCNN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + rpn_head=dict( + anchor_generator=dict(type='LegacyAnchorGenerator', center_offset=0.5), + bbox_coder=dict( + type='LegacyDeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0])), + roi_head=dict( + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict( + type='RoIAlign', + output_size=7, + sampling_ratio=2, + aligned=False)), + bbox_head=[ + dict( + type='Shared2FCBBoxHead', + reg_class_agnostic=True, + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='LegacyDeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2])), + dict( + type='Shared2FCBBoxHead', + reg_class_agnostic=True, + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='LegacyDeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.05, 0.05, 0.1, 0.1])), + dict( + type='Shared2FCBBoxHead', + reg_class_agnostic=True, + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='LegacyDeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.033, 0.033, 0.067, 0.067])), + ], + mask_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict( + type='RoIAlign', + output_size=14, + sampling_ratio=2, + aligned=False)))) +dist_params = dict(backend='nccl', port=29515) diff --git a/configs/legacy_1.x/faster_rcnn_r50_fpn_1x_coco_v1.py b/configs/legacy_1.x/faster_rcnn_r50_fpn_1x_coco_v1.py new file mode 100644 index 0000000..8c573be --- /dev/null +++ b/configs/legacy_1.x/faster_rcnn_r50_fpn_1x_coco_v1.py @@ -0,0 +1,38 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + type='FasterRCNN', + backbone=dict( + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + rpn_head=dict( + type='RPNHead', + anchor_generator=dict( + type='LegacyAnchorGenerator', + center_offset=0.5, + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict(type='LegacyDeltaXYWHBBoxCoder'), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), + roi_head=dict( + type='StandardRoIHead', + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict( + type='RoIAlign', + output_size=7, + sampling_ratio=2, + aligned=False), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=dict( + bbox_coder=dict(type='LegacyDeltaXYWHBBoxCoder'), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn_proposal=dict(max_per_img=2000), + rcnn=dict(assigner=dict(match_low_quality=True)))) diff --git a/configs/legacy_1.x/mask_rcnn_r50_fpn_1x_coco_v1.py b/configs/legacy_1.x/mask_rcnn_r50_fpn_1x_coco_v1.py new file mode 100644 index 0000000..04581bb --- /dev/null +++ b/configs/legacy_1.x/mask_rcnn_r50_fpn_1x_coco_v1.py @@ -0,0 +1,34 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + rpn_head=dict( + anchor_generator=dict(type='LegacyAnchorGenerator', center_offset=0.5), + bbox_coder=dict(type='LegacyDeltaXYWHBBoxCoder'), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), + roi_head=dict( + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict( + type='RoIAlign', + output_size=7, + sampling_ratio=2, + aligned=False)), + mask_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict( + type='RoIAlign', + output_size=14, + sampling_ratio=2, + aligned=False)), + bbox_head=dict( + bbox_coder=dict(type='LegacyDeltaXYWHBBoxCoder'), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))), + + # model training and testing settings + train_cfg=dict( + rpn_proposal=dict(max_per_img=2000), + rcnn=dict(assigner=dict(match_low_quality=True)))) diff --git a/configs/legacy_1.x/retinanet_r50_caffe_fpn_1x_coco_v1.py b/configs/legacy_1.x/retinanet_r50_caffe_fpn_1x_coco_v1.py new file mode 100644 index 0000000..a63d248 --- /dev/null +++ b/configs/legacy_1.x/retinanet_r50_caffe_fpn_1x_coco_v1.py @@ -0,0 +1,41 @@ +_base_ = './retinanet_r50_fpn_1x_coco_v1.py' +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron/resnet50_caffe'))) +# use caffe img_norm +img_norm_cfg = dict( + mean=[102.9801, 115.9465, 122.7717], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/legacy_1.x/retinanet_r50_fpn_1x_coco_v1.py b/configs/legacy_1.x/retinanet_r50_fpn_1x_coco_v1.py new file mode 100644 index 0000000..6198b97 --- /dev/null +++ b/configs/legacy_1.x/retinanet_r50_fpn_1x_coco_v1.py @@ -0,0 +1,17 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + bbox_head=dict( + type='RetinaHead', + anchor_generator=dict( + type='LegacyAnchorGenerator', + center_offset=0.5, + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict(type='LegacyDeltaXYWHBBoxCoder'), + loss_bbox=dict(type='SmoothL1Loss', beta=0.11, loss_weight=1.0))) diff --git a/configs/legacy_1.x/ssd300_coco_v1.py b/configs/legacy_1.x/ssd300_coco_v1.py new file mode 100644 index 0000000..65ccc1e --- /dev/null +++ b/configs/legacy_1.x/ssd300_coco_v1.py @@ -0,0 +1,84 @@ +_base_ = [ + '../_base_/models/ssd300.py', '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_2x.py', '../_base_/default_runtime.py' +] +# model settings +input_size = 300 +model = dict( + bbox_head=dict( + type='SSDHead', + anchor_generator=dict( + type='LegacySSDAnchorGenerator', + scale_major=False, + input_size=input_size, + basesize_ratio_range=(0.15, 0.9), + strides=[8, 16, 32, 64, 100, 300], + ratios=[[2], [2, 3], [2, 3], [2, 3], [2], [2]]), + bbox_coder=dict( + type='LegacyDeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]))) +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict(mean=[123.675, 116.28, 103.53], std=[1, 1, 1], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(300, 300), keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(300, 300), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, + workers_per_gpu=3, + train=dict( + _delete_=True, + type='RepeatDataset', + times=5, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='SGD', lr=2e-3, momentum=0.9, weight_decay=5e-4) +optimizer_config = dict(_delete_=True) +dist_params = dict(backend='nccl', port=29555) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/libra_rcnn/README.md b/configs/libra_rcnn/README.md new file mode 100644 index 0000000..87a128a --- /dev/null +++ b/configs/libra_rcnn/README.md @@ -0,0 +1,53 @@ +# Libra R-CNN + +> [Libra R-CNN: Towards Balanced Learning for Object Detection](https://arxiv.org/abs/1904.02701) + + + +## Abstract + +Compared with model architectures, the training process, which is also crucial to the success of detectors, has received relatively less attention in object detection. In this work, we carefully revisit the standard training practice of detectors, and find that the detection performance is often limited by the imbalance during the training process, which generally consists in three levels - sample level, feature level, and objective level. To mitigate the adverse effects caused thereby, we propose Libra R-CNN, a simple but effective framework towards balanced learning for object detection. It integrates three novel components: IoU-balanced sampling, balanced feature pyramid, and balanced L1 loss, respectively for reducing the imbalance at sample, feature, and objective level. Benefitted from the overall balanced design, Libra R-CNN significantly improves the detection performance. Without bells and whistles, it achieves 2.5 points and 2.0 points higher Average Precision (AP) than FPN Faster R-CNN and RetinaNet respectively on MSCOCO. + +Instance recognition is rapidly advanced along with the developments of various deep convolutional neural networks. Compared to the architectures of networks, the training process, which is also crucial to the success of detectors, has received relatively less attention. In this work, we carefully revisit the standard training practice of detectors, and find that the detection performance is often limited by the imbalance during the training process, which generally consists in three levels - sample level, feature level, and objective level. To mitigate the adverse effects caused thereby, we propose Libra R-CNN, a simple yet effective framework towards balanced learning for instance recognition. It integrates IoU-balanced sampling, balanced feature pyramid, and objective re-weighting, respectively for reducing the imbalance at sample, feature, and objective level. Extensive experiments conducted on MS COCO, LVIS and Pascal VOC datasets prove the effectiveness of the overall balanced design. + +
+ +
+ +## Results and Models + +The results on COCO 2017val are shown in the below table. (results on test-dev are usually slightly higher than val) + +| Architecture | Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :----------: | :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :----------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Faster R-CNN | R-50-FPN | pytorch | 1x | 4.6 | 19.0 | 38.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco/libra_faster_rcnn_r50_fpn_1x_coco_20200130-3afee3a9.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco/libra_faster_rcnn_r50_fpn_1x_coco_20200130_204655.log.json) | +| Fast R-CNN | R-50-FPN | pytorch | 1x | | | | | | +| Faster R-CNN | R-101-FPN | pytorch | 1x | 6.5 | 14.4 | 40.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/libra_rcnn/libra_faster_rcnn_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_faster_rcnn_r101_fpn_1x_coco/libra_faster_rcnn_r101_fpn_1x_coco_20200203-8dba6a5a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_faster_rcnn_r101_fpn_1x_coco/libra_faster_rcnn_r101_fpn_1x_coco_20200203_001405.log.json) | +| Faster R-CNN | X-101-64x4d-FPN | pytorch | 1x | 10.8 | 8.5 | 42.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/libra_rcnn/libra_faster_rcnn_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_faster_rcnn_x101_64x4d_fpn_1x_coco/libra_faster_rcnn_x101_64x4d_fpn_1x_coco_20200315-3a7d0488.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_faster_rcnn_x101_64x4d_fpn_1x_coco/libra_faster_rcnn_x101_64x4d_fpn_1x_coco_20200315_231625.log.json) | +| RetinaNet | R-50-FPN | pytorch | 1x | 4.2 | 17.7 | 37.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/libra_rcnn/libra_retinanet_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_retinanet_r50_fpn_1x_coco/libra_retinanet_r50_fpn_1x_coco_20200205-804d94ce.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_retinanet_r50_fpn_1x_coco/libra_retinanet_r50_fpn_1x_coco_20200205_112757.log.json) | + +## Citation + +We provide config files to reproduce the results in the CVPR 2019 paper [Libra R-CNN](https://arxiv.org/pdf/1904.02701.pdf). + +The extended version of [Libra R-CNN](https://arxiv.org/pdf/2108.10175.pdf) is accpeted by IJCV. + +```latex +@inproceedings{pang2019libra, + title={Libra R-CNN: Towards Balanced Learning for Object Detection}, + author={Pang, Jiangmiao and Chen, Kai and Shi, Jianping and Feng, Huajun and Ouyang, Wanli and Dahua Lin}, + booktitle={IEEE Conference on Computer Vision and Pattern Recognition}, + year={2019} +} + +@article{pang2021towards, + title={Towards Balanced Learning for Instance Recognition}, + author={Pang, Jiangmiao and Chen, Kai and Li, Qi and Xu, Zhihai and Feng, Huajun and Shi, Jianping and Ouyang, Wanli and Lin, Dahua}, + journal={International Journal of Computer Vision}, + volume={129}, + number={5}, + pages={1376--1393}, + year={2021}, + publisher={Springer} +} +``` diff --git a/configs/libra_rcnn/libra_fast_rcnn_r50_fpn_1x_coco.py b/configs/libra_rcnn/libra_fast_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..efbedc8 --- /dev/null +++ b/configs/libra_rcnn/libra_fast_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,50 @@ +_base_ = '../fast_rcnn/fast_rcnn_r50_fpn_1x_coco.py' +# model settings +model = dict( + neck=[ + dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + dict( + type='BFP', + in_channels=256, + num_levels=5, + refine_level=2, + refine_type='non_local') + ], + roi_head=dict( + bbox_head=dict( + loss_bbox=dict( + _delete_=True, + type='BalancedL1Loss', + alpha=0.5, + gamma=1.5, + beta=1.0, + loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rcnn=dict( + sampler=dict( + _delete_=True, + type='CombinedSampler', + num=512, + pos_fraction=0.25, + add_gt_as_proposals=True, + pos_sampler=dict(type='InstanceBalancedPosSampler'), + neg_sampler=dict( + type='IoUBalancedNegSampler', + floor_thr=-1, + floor_fraction=0, + num_bins=3))))) +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +data = dict( + train=dict(proposal_file=data_root + + 'libra_proposals/rpn_r50_fpn_1x_train2017.pkl'), + val=dict(proposal_file=data_root + + 'libra_proposals/rpn_r50_fpn_1x_val2017.pkl'), + test=dict(proposal_file=data_root + + 'libra_proposals/rpn_r50_fpn_1x_val2017.pkl')) diff --git a/configs/libra_rcnn/libra_faster_rcnn_r101_fpn_1x_coco.py b/configs/libra_rcnn/libra_faster_rcnn_r101_fpn_1x_coco.py new file mode 100644 index 0000000..e899706 --- /dev/null +++ b/configs/libra_rcnn/libra_faster_rcnn_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './libra_faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py b/configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..89a0d7b --- /dev/null +++ b/configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,41 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +# model settings +model = dict( + neck=[ + dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + dict( + type='BFP', + in_channels=256, + num_levels=5, + refine_level=2, + refine_type='non_local') + ], + roi_head=dict( + bbox_head=dict( + loss_bbox=dict( + _delete_=True, + type='BalancedL1Loss', + alpha=0.5, + gamma=1.5, + beta=1.0, + loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rpn=dict(sampler=dict(neg_pos_ub=5), allowed_border=-1), + rcnn=dict( + sampler=dict( + _delete_=True, + type='CombinedSampler', + num=512, + pos_fraction=0.25, + add_gt_as_proposals=True, + pos_sampler=dict(type='InstanceBalancedPosSampler'), + neg_sampler=dict( + type='IoUBalancedNegSampler', + floor_thr=-1, + floor_fraction=0, + num_bins=3))))) diff --git a/configs/libra_rcnn/libra_faster_rcnn_x101_64x4d_fpn_1x_coco.py b/configs/libra_rcnn/libra_faster_rcnn_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..06740a7 --- /dev/null +++ b/configs/libra_rcnn/libra_faster_rcnn_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './libra_faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/libra_rcnn/libra_retinanet_r50_fpn_1x_coco.py b/configs/libra_rcnn/libra_retinanet_r50_fpn_1x_coco.py new file mode 100644 index 0000000..be27420 --- /dev/null +++ b/configs/libra_rcnn/libra_retinanet_r50_fpn_1x_coco.py @@ -0,0 +1,26 @@ +_base_ = '../retinanet/retinanet_r50_fpn_1x_coco.py' +# model settings +model = dict( + neck=[ + dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_input', + num_outs=5), + dict( + type='BFP', + in_channels=256, + num_levels=5, + refine_level=1, + refine_type='non_local') + ], + bbox_head=dict( + loss_bbox=dict( + _delete_=True, + type='BalancedL1Loss', + alpha=0.5, + gamma=1.5, + beta=0.11, + loss_weight=1.0))) diff --git a/configs/libra_rcnn/metafile.yml b/configs/libra_rcnn/metafile.yml new file mode 100644 index 0000000..8c32795 --- /dev/null +++ b/configs/libra_rcnn/metafile.yml @@ -0,0 +1,99 @@ +Collections: + - Name: Libra R-CNN + Metadata: + Training Data: COCO + Training Techniques: + - IoU-Balanced Sampling + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Balanced Feature Pyramid + Paper: + URL: https://arxiv.org/abs/1904.02701 + Title: 'Libra R-CNN: Towards Balanced Learning for Object Detection' + README: configs/libra_rcnn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/necks/bfp.py#L10 + Version: v2.0.0 + +Models: + - Name: libra_faster_rcnn_r50_fpn_1x_coco + In Collection: Libra R-CNN + Config: configs/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.6 + inference time (ms/im): + - value: 52.63 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_faster_rcnn_r50_fpn_1x_coco/libra_faster_rcnn_r50_fpn_1x_coco_20200130-3afee3a9.pth + + - Name: libra_faster_rcnn_r101_fpn_1x_coco + In Collection: Libra R-CNN + Config: configs/libra_rcnn/libra_faster_rcnn_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.5 + inference time (ms/im): + - value: 69.44 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_faster_rcnn_r101_fpn_1x_coco/libra_faster_rcnn_r101_fpn_1x_coco_20200203-8dba6a5a.pth + + - Name: libra_faster_rcnn_x101_64x4d_fpn_1x_coco + In Collection: Libra R-CNN + Config: configs/libra_rcnn/libra_faster_rcnn_x101_64x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 10.8 + inference time (ms/im): + - value: 117.65 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_faster_rcnn_x101_64x4d_fpn_1x_coco/libra_faster_rcnn_x101_64x4d_fpn_1x_coco_20200315-3a7d0488.pth + + - Name: libra_retinanet_r50_fpn_1x_coco + In Collection: Libra R-CNN + Config: configs/libra_rcnn/libra_retinanet_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.2 + inference time (ms/im): + - value: 56.5 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/libra_rcnn/libra_retinanet_r50_fpn_1x_coco/libra_retinanet_r50_fpn_1x_coco_20200205-804d94ce.pth diff --git a/configs/lvis/README.md b/configs/lvis/README.md new file mode 100644 index 0000000..0c2760e --- /dev/null +++ b/configs/lvis/README.md @@ -0,0 +1,56 @@ +# LVIS + +> [LVIS: A Dataset for Large Vocabulary Instance Segmentation](https://arxiv.org/abs/1908.03195) + + + +## Abstract + +Progress on object detection is enabled by datasets that focus the research community's attention on open challenges. This process led us from simple images to complex scenes and from bounding boxes to segmentation masks. In this work, we introduce LVIS (pronounced \`el-vis'): a new dataset for Large Vocabulary Instance Segmentation. We plan to collect ~2 million high-quality instance segmentation masks for over 1000 entry-level object categories in 164k images. Due to the Zipfian distribution of categories in natural images, LVIS naturally has a long tail of categories with few training samples. Given that state-of-the-art deep learning methods for object detection perform poorly in the low-sample regime, we believe that our dataset poses an important and exciting new scientific challenge. + +
+ +
+ +## Common Setting + +- Please follow [install guide](../../docs/get_started.md#install-mmdetection) to install open-mmlab forked cocoapi first. + +- Run following scripts to install our forked lvis-api. + + ```shell + pip install git+https://github.com/lvis-dataset/lvis-api.git + ``` + +- All experiments use oversample strategy [here](../../docs/tutorials/customize_dataset.md#class-balanced-dataset) with oversample threshold `1e-3`. + +- The size of LVIS v0.5 is half of COCO, so schedule `2x` in LVIS is roughly the same iterations as `1x` in COCO. + +## Results and models of LVIS v0.5 + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :--------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | 2x | - | - | 26.1 | 25.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis-dbd06831.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis_20200531_160435.log.json) | +| R-101-FPN | pytorch | 2x | - | - | 27.1 | 27.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_2x_lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_2x_lvis-54582ee2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_2x_lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_2x_lvis_20200601_134748.log.json) | +| X-101-32x4d-FPN | pytorch | 2x | - | - | 26.7 | 26.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_2x_lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_2x_lvis-3cf55ea2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_2x_lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_2x_lvis_20200531_221749.log.json) | +| X-101-64x4d-FPN | pytorch | 2x | - | - | 26.4 | 26.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_2x_lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_2x_lvis-1c99a5ad.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_2x_lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_2x_lvis_20200601_194651.log.json) | + +## Results and models of LVIS v1 + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | 1x | 9.1 | - | 22.5 | 21.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1/mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1-aa78ac3d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1/mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1-20200829_061305.log.json) | +| R-101-FPN | pytorch | 1x | 10.8 | - | 24.6 | 23.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_1x_lvis_v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_1x_lvis_v1/mask_rcnn_r101_fpn_sample1e-3_mstrain_1x_lvis_v1-ec55ce32.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_1x_lvis_v1/mask_rcnn_r101_fpn_sample1e-3_mstrain_1x_lvis_v1-20200829_070959.log.json) | +| X-101-32x4d-FPN | pytorch | 1x | 11.8 | - | 26.7 | 25.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_1x_lvis_v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_1x_lvis_v1/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_1x_lvis_v1-ebbc5c81.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_1x_lvis_v1/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_1x_lvis_v1-20200829_071317.log.json) | +| X-101-64x4d-FPN | pytorch | 1x | 14.6 | - | 27.2 | 25.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_1x_lvis_v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_1x_lvis_v1/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_1x_lvis_v1-43d9edfe.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_1x_lvis_v1/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_1x_lvis_v1-20200830_060206.log.json) | + +## Citation + +```latex +@inproceedings{gupta2019lvis, + title={{LVIS}: A Dataset for Large Vocabulary Instance Segmentation}, + author={Gupta, Agrim and Dollar, Piotr and Girshick, Ross}, + booktitle={Proceedings of the {IEEE} Conference on Computer Vision and Pattern Recognition}, + year={2019} +} +``` diff --git a/configs/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_1x_lvis_v1.py b/configs/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_1x_lvis_v1.py new file mode 100644 index 0000000..0f017f5 --- /dev/null +++ b/configs/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_1x_lvis_v1.py @@ -0,0 +1,6 @@ +_base_ = './mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py b/configs/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py new file mode 100644 index 0000000..637f4a6 --- /dev/null +++ b/configs/lvis/mask_rcnn_r101_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py @@ -0,0 +1,6 @@ +_base_ = './mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1.py b/configs/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1.py new file mode 100644 index 0000000..92ddb52 --- /dev/null +++ b/configs/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1.py @@ -0,0 +1,31 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/lvis_v1_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + roi_head=dict( + bbox_head=dict(num_classes=1203), mask_head=dict(num_classes=1203)), + test_cfg=dict( + rcnn=dict( + score_thr=0.0001, + # LVIS allows up to 300 + max_per_img=300))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict(train=dict(dataset=dict(pipeline=train_pipeline))) diff --git a/configs/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py b/configs/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py new file mode 100644 index 0000000..d53c5dc --- /dev/null +++ b/configs/lvis/mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py @@ -0,0 +1,31 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/lvis_v0.5_instance.py', + '../_base_/schedules/schedule_2x.py', '../_base_/default_runtime.py' +] +model = dict( + roi_head=dict( + bbox_head=dict(num_classes=1230), mask_head=dict(num_classes=1230)), + test_cfg=dict( + rcnn=dict( + score_thr=0.0001, + # LVIS allows up to 300 + max_per_img=300))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict(train=dict(dataset=dict(pipeline=train_pipeline))) diff --git a/configs/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_1x_lvis_v1.py b/configs/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_1x_lvis_v1.py new file mode 100644 index 0000000..a6115c1 --- /dev/null +++ b/configs/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_1x_lvis_v1.py @@ -0,0 +1,14 @@ +_base_ = './mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py b/configs/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py new file mode 100644 index 0000000..96b6252 --- /dev/null +++ b/configs/lvis/mask_rcnn_x101_32x4d_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py @@ -0,0 +1,14 @@ +_base_ = './mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_1x_lvis_v1.py b/configs/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_1x_lvis_v1.py new file mode 100644 index 0000000..0f95a73 --- /dev/null +++ b/configs/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_1x_lvis_v1.py @@ -0,0 +1,14 @@ +_base_ = './mask_rcnn_r50_fpn_sample1e-3_mstrain_1x_lvis_v1.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py b/configs/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py new file mode 100644 index 0000000..986acda --- /dev/null +++ b/configs/lvis/mask_rcnn_x101_64x4d_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py @@ -0,0 +1,14 @@ +_base_ = './mask_rcnn_r50_fpn_sample1e-3_mstrain_2x_lvis_v0.5.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/mask2former/README.md b/configs/mask2former/README.md new file mode 100644 index 0000000..ebce50d --- /dev/null +++ b/configs/mask2former/README.md @@ -0,0 +1,73 @@ +# Mask2Former + +> [Masked-attention Mask Transformer for Universal Image Segmentation](http://arxiv.org/abs/2112.01527) + + + +## Abstract + +Image segmentation is about grouping pixels with different semantics, e.g., category or instance membership, where each choice of semantics defines a task. While only the semantics of each task differ, current research focuses on designing specialized architectures for each task. We present Masked-attention Mask Transformer (Mask2Former), a new architecture capable of addressing any image segmentation task (panoptic, instance or semantic). Its key components include masked attention, which extracts localized features by constraining cross-attention within predicted mask regions. In addition to reducing the research effort by at least three times, it outperforms the best specialized architectures by a significant margin on four popular datasets. Most notably, Mask2Former sets a new state-of-the-art for panoptic segmentation (57.8 PQ on COCO), instance segmentation (50.1 AP on COCO) and semantic segmentation (57.7 mIoU on ADE20K). + +
+ +
+ +## Introduction + +Mask2Former requires COCO and [COCO-panoptic](http://images.cocodataset.org/annotations/panoptic_annotations_trainval2017.zip) dataset for training and evaluation. You need to download and extract it in the COCO dataset path. +The directory should be like this. + +```none +mmdetection +├── mmdet +├── tools +├── configs +├── data +│ ├── coco +│ │ ├── annotations +| | | ├── instances_train2017.json +| | | ├── instances_val2017.json +│ │ │ ├── panoptic_train2017.json +│ │ │ ├── panoptic_train2017 +│ │ │ ├── panoptic_val2017.json +│ │ │ ├── panoptic_val2017 +│ │ ├── train2017 +│ │ ├── val2017 +│ │ ├── test2017 +``` + +## Results and Models + +### Panoptic segmentation + +| Backbone | style | Pretrain | Lr schd | Mem (GB) | Inf time (fps) | PQ | box mAP | mask mAP | Config | Download | +| :------: | :-----: | :----------: | :-----: | :------: | :------------: | :--: | :-----: | :------: | :----------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | pytorch | ImageNet-1K | 50e | 13.9 | - | 51.9 | 44.8 | 41.9 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former/mask2former_r50_lsj_8x2_50e_coco-panoptic.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r50_lsj_8x2_50e_coco-panoptic/mask2former_r50_lsj_8x2_50e_coco-panoptic_20220326_224516-11a44721.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r50_lsj_8x2_50e_coco-panoptic/mask2former_r50_lsj_8x2_50e_coco-panoptic_20220326_224516.log.json) | +| R-101 | pytorch | ImageNet-1K | 50e | 16.1 | - | 52.4 | 45.3 | 42.4 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former/mask2former_r101_lsj_8x2_50e_coco-panoptic.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r101_lsj_8x2_50e_coco-panoptic/mask2former_r101_lsj_8x2_50e_coco-panoptic_20220329_225104-c54e64c9.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r101_lsj_8x2_50e_coco-panoptic/mask2former_r101_lsj_8x2_50e_coco-panoptic_20220329_225104.log.json) | +| Swin-T | - | ImageNet-1K | 50e | 15.9 | - | 53.4 | 46.3 | 43.4 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic_20220326_224553-fc567107.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic_20220326_224553.log.json) | +| Swin-S | - | ImageNet-1K | 50e | 19.1 | - | 54.5 | 47.8 | 44.5 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic_20220329_225200-c7b94355.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic_20220329_225200.log.json) | +| Swin-B | - | ImageNet-1K | 50e | 26.0 | - | 55.1 | 48.2 | 44.9 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic_20220331_002244-c149a9e9.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic_20220331_002244.log.json) | +| Swin-B | - | ImageNet-21K | 50e | 25.8 | - | 56.3 | 50.0 | 46.3 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic_20220329_230021-3bb8b482.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic_20220329_230021.log.json) | +| Swin-L | - | ImageNet-21K | 100e | 21.1 | - | 57.6 | 52.2 | 48.5 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic_20220407_104949-d4919c44.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic_20220407_104949.log.json) | + +### Instance segmentation + +| Backbone | style | Pretrain | Lr schd | Mem (GB) | Inf time (fps) | box mAP | mask mAP | Config | Download | +| -------- | ------- | ----------- | ------- | -------- | -------------- | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| R-50 | pytorch | ImageNet-1K | 50e | 13.7 | - | 45.7 | 42.9 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former/mask2former_r50_lsj_8x2_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r50_lsj_8x2_50e_coco/mask2former_r50_lsj_8x2_50e_coco_20220506_191028-8e96e88b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r50_lsj_8x2_50e_coco/mask2former_r50_lsj_8x2_50e_coco_20220506_191028.log.json) | +| R-101 | pytorch | ImageNet-1K | 50e | 15.5 | - | 46.7 | 44.0 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former/mask2former_r101_lsj_8x2_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r101_lsj_8x2_50e_coco/mask2former_r101_lsj_8x2_50e_coco_20220426_100250-c50b6fa6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r101_lsj_8x2_50e_coco/mask2former_r101_lsj_8x2_50e_coco_20220426_100250.log.json) | +| Swin-T | - | ImageNet-1K | 50e | 15.3 | - | 47.7 | 44.7 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco_20220508_091649-4a943037.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco_20220508_091649.log.json) | +| Swin-S | - | ImageNet-1K | 50e | 18.8 | - | 49.3 | 46.1 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco_20220504_001756-743b7d99.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco_20220504_001756.log.json) | + +Note: We have trained the instance segmentation models many times (see more details in [PR 7571](https://github.com/open-mmlab/mmdetection/pull/7571)). The results of the trained models are relatively stable (+- 0.2), and have a certain gap (about 0.2 AP) in comparison with the results in the [paper](http://arxiv.org/abs/2112.01527). However, the performance of the model trained with the official code is unstable and may also be slightly lower than the reported results as mentioned in the [issue](https://github.com/facebookresearch/Mask2Former/issues/46). + +## Citation + +```latex +@article{cheng2021mask2former, + title={Masked-attention Mask Transformer for Universal Image Segmentation}, + author={Bowen Cheng and Ishan Misra and Alexander G. Schwing and Alexander Kirillov and Rohit Girdhar}, + journal={arXiv}, + year={2021} +} +``` diff --git a/configs/mask2former/mask2former_r101_lsj_8x2_50e_coco-panoptic.py b/configs/mask2former/mask2former_r101_lsj_8x2_50e_coco-panoptic.py new file mode 100644 index 0000000..33fdde6 --- /dev/null +++ b/configs/mask2former/mask2former_r101_lsj_8x2_50e_coco-panoptic.py @@ -0,0 +1,7 @@ +_base_ = './mask2former_r50_lsj_8x2_50e_coco-panoptic.py' + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/mask2former/mask2former_r101_lsj_8x2_50e_coco.py b/configs/mask2former/mask2former_r101_lsj_8x2_50e_coco.py new file mode 100644 index 0000000..5543fb0 --- /dev/null +++ b/configs/mask2former/mask2former_r101_lsj_8x2_50e_coco.py @@ -0,0 +1,7 @@ +_base_ = ['./mask2former_r50_lsj_8x2_50e_coco.py'] + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/mask2former/mask2former_r50_lsj_8x2_50e_coco-panoptic.py b/configs/mask2former/mask2former_r50_lsj_8x2_50e_coco-panoptic.py new file mode 100644 index 0000000..2c23625 --- /dev/null +++ b/configs/mask2former/mask2former_r50_lsj_8x2_50e_coco-panoptic.py @@ -0,0 +1,253 @@ +_base_ = [ + '../_base_/datasets/coco_panoptic.py', '../_base_/default_runtime.py' +] +num_things_classes = 80 +num_stuff_classes = 53 +num_classes = num_things_classes + num_stuff_classes +model = dict( + type='Mask2Former', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=-1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + panoptic_head=dict( + type='Mask2FormerHead', + in_channels=[256, 512, 1024, 2048], # pass to pixel_decoder inside + strides=[4, 8, 16, 32], + feat_channels=256, + out_channels=256, + num_things_classes=num_things_classes, + num_stuff_classes=num_stuff_classes, + num_queries=100, + num_transformer_feat_level=3, + pixel_decoder=dict( + type='MSDeformAttnPixelDecoder', + num_outs=3, + norm_cfg=dict(type='GN', num_groups=32), + act_cfg=dict(type='ReLU'), + encoder=dict( + type='DetrTransformerEncoder', + num_layers=6, + transformerlayers=dict( + type='BaseTransformerLayer', + attn_cfgs=dict( + type='MultiScaleDeformableAttention', + embed_dims=256, + num_heads=8, + num_levels=3, + num_points=4, + im2col_step=64, + dropout=0.0, + batch_first=False, + norm_cfg=None, + init_cfg=None), + ffn_cfgs=dict( + type='FFN', + embed_dims=256, + feedforward_channels=1024, + num_fcs=2, + ffn_drop=0.0, + act_cfg=dict(type='ReLU', inplace=True)), + operation_order=('self_attn', 'norm', 'ffn', 'norm')), + init_cfg=None), + positional_encoding=dict( + type='SinePositionalEncoding', num_feats=128, normalize=True), + init_cfg=None), + enforce_decoder_input_project=False, + positional_encoding=dict( + type='SinePositionalEncoding', num_feats=128, normalize=True), + transformer_decoder=dict( + type='DetrTransformerDecoder', + return_intermediate=True, + num_layers=9, + transformerlayers=dict( + type='DetrTransformerDecoderLayer', + attn_cfgs=dict( + type='MultiheadAttention', + embed_dims=256, + num_heads=8, + attn_drop=0.0, + proj_drop=0.0, + dropout_layer=None, + batch_first=False), + ffn_cfgs=dict( + embed_dims=256, + feedforward_channels=2048, + num_fcs=2, + act_cfg=dict(type='ReLU', inplace=True), + ffn_drop=0.0, + dropout_layer=None, + add_identity=True), + feedforward_channels=2048, + operation_order=('cross_attn', 'norm', 'self_attn', 'norm', + 'ffn', 'norm')), + init_cfg=None), + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=2.0, + reduction='mean', + class_weight=[1.0] * num_classes + [0.1]), + loss_mask=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + reduction='mean', + loss_weight=5.0), + loss_dice=dict( + type='DiceLoss', + use_sigmoid=True, + activate=True, + reduction='mean', + naive_dice=True, + eps=1.0, + loss_weight=5.0)), + panoptic_fusion_head=dict( + type='MaskFormerFusionHead', + num_things_classes=num_things_classes, + num_stuff_classes=num_stuff_classes, + loss_panoptic=None, + init_cfg=None), + train_cfg=dict( + num_points=12544, + oversample_ratio=3.0, + importance_sample_ratio=0.75, + assigner=dict( + type='MaskHungarianAssigner', + cls_cost=dict(type='ClassificationCost', weight=2.0), + mask_cost=dict( + type='CrossEntropyLossCost', weight=5.0, use_sigmoid=True), + dice_cost=dict( + type='DiceCost', weight=5.0, pred_act=True, eps=1.0)), + sampler=dict(type='MaskPseudoSampler')), + test_cfg=dict( + panoptic_on=True, + # For now, the dataset does not support + # evaluating semantic segmentation metric. + semantic_on=False, + instance_on=True, + # max_per_image is for instance segmentation. + max_per_image=100, + iou_thr=0.8, + # In Mask2Former's panoptic postprocessing, + # it will filter mask area where score is less than 0.5 . + filter_low_score=True), + init_cfg=None) + +# dataset settings +image_size = (1024, 1024) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict( + type='LoadPanopticAnnotations', + with_bbox=True, + with_mask=True, + with_seg=True), + dict(type='RandomFlip', flip_ratio=0.5), + # large scale jittering + dict( + type='Resize', + img_scale=image_size, + ratio_range=(0.1, 2.0), + multiscale_mode='range', + keep_ratio=True), + dict( + type='RandomCrop', + crop_size=image_size, + crop_type='absolute', + recompute_bbox=True, + allow_negative_crop=True), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=image_size), + dict(type='DefaultFormatBundle', img_to_float=True), + dict( + type='Collect', + keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data_root = 'data/coco/' +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline), + val=dict( + pipeline=test_pipeline, + ins_ann_file=data_root + 'annotations/instances_val2017.json', + ), + test=dict( + pipeline=test_pipeline, + ins_ann_file=data_root + 'annotations/instances_val2017.json', + )) + +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +# optimizer +optimizer = dict( + type='AdamW', + lr=0.0001, + weight_decay=0.05, + eps=1e-8, + betas=(0.9, 0.999), + paramwise_cfg=dict( + custom_keys={ + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi, + }, + norm_decay_mult=0.0)) +optimizer_config = dict(grad_clip=dict(max_norm=0.01, norm_type=2)) + +# learning policy +lr_config = dict( + policy='step', + gamma=0.1, + by_epoch=False, + step=[327778, 355092], + warmup='linear', + warmup_by_epoch=False, + warmup_ratio=1.0, # no warmup + warmup_iters=10) + +max_iters = 368750 +runner = dict(type='IterBasedRunner', max_iters=max_iters) + +log_config = dict( + interval=50, + hooks=[ + dict(type='TextLoggerHook', by_epoch=False), + dict(type='TensorboardLoggerHook', by_epoch=False) + ]) +interval = 5000 +workflow = [('train', interval)] +checkpoint_config = dict( + by_epoch=False, interval=interval, save_last=True, max_keep_ckpts=3) + +# Before 365001th iteration, we do evaluation every 5000 iterations. +# After 365000th iteration, we do evaluation every 368750 iterations, +# which means that we do evaluation at the end of training. +dynamic_intervals = [(max_iters // interval * interval + 1, max_iters)] +evaluation = dict( + interval=interval, + dynamic_intervals=dynamic_intervals, + metric=['PQ', 'bbox', 'segm']) diff --git a/configs/mask2former/mask2former_r50_lsj_8x2_50e_coco.py b/configs/mask2former/mask2former_r50_lsj_8x2_50e_coco.py new file mode 100644 index 0000000..eca6135 --- /dev/null +++ b/configs/mask2former/mask2former_r50_lsj_8x2_50e_coco.py @@ -0,0 +1,79 @@ +_base_ = ['./mask2former_r50_lsj_8x2_50e_coco-panoptic.py'] +num_things_classes = 80 +num_stuff_classes = 0 +num_classes = num_things_classes + num_stuff_classes +model = dict( + panoptic_head=dict( + num_things_classes=num_things_classes, + num_stuff_classes=num_stuff_classes, + loss_cls=dict(class_weight=[1.0] * num_classes + [0.1])), + panoptic_fusion_head=dict( + num_things_classes=num_things_classes, + num_stuff_classes=num_stuff_classes), + test_cfg=dict(panoptic_on=False)) + +# dataset settings +image_size = (1024, 1024) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +pad_cfg = dict(img=(128, 128, 128), masks=0, seg=255) +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='RandomFlip', flip_ratio=0.5), + # large scale jittering + dict( + type='Resize', + img_scale=image_size, + ratio_range=(0.1, 2.0), + multiscale_mode='range', + keep_ratio=True), + dict( + type='RandomCrop', + crop_size=image_size, + crop_type='absolute', + recompute_bbox=True, + allow_negative_crop=True), + dict(type='FilterAnnotations', min_gt_bbox_wh=(1e-5, 1e-5), by_mask=True), + dict(type='Pad', size=image_size, pad_val=pad_cfg), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle', img_to_float=True), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Pad', size_divisor=32, pad_val=pad_cfg), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +data = dict( + _delete_=True, + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +evaluation = dict(metric=['bbox', 'segm']) diff --git a/configs/mask2former/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic.py b/configs/mask2former/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic.py new file mode 100644 index 0000000..f13f5e1 --- /dev/null +++ b/configs/mask2former/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic.py @@ -0,0 +1,5 @@ +_base_ = ['./mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic.py'] +pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window12_384_22k.pth' # noqa + +model = dict( + backbone=dict(init_cfg=dict(type='Pretrained', checkpoint=pretrained))) diff --git a/configs/mask2former/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic.py b/configs/mask2former/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic.py new file mode 100644 index 0000000..33a805c --- /dev/null +++ b/configs/mask2former/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic.py @@ -0,0 +1,42 @@ +_base_ = ['./mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic.py'] +pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window12_384.pth' # noqa + +depths = [2, 2, 18, 2] +model = dict( + backbone=dict( + pretrain_img_size=384, + embed_dims=128, + depths=depths, + num_heads=[4, 8, 16, 32], + window_size=12, + init_cfg=dict(type='Pretrained', checkpoint=pretrained)), + panoptic_head=dict(in_channels=[128, 256, 512, 1024])) + +# set all layers in backbone to lr_mult=0.1 +# set all norm layers, position_embeding, +# query_embeding, level_embeding to decay_multi=0.0 +backbone_norm_multi = dict(lr_mult=0.1, decay_mult=0.0) +backbone_embed_multi = dict(lr_mult=0.1, decay_mult=0.0) +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +custom_keys = { + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'backbone.patch_embed.norm': backbone_norm_multi, + 'backbone.norm': backbone_norm_multi, + 'absolute_pos_embed': backbone_embed_multi, + 'relative_position_bias_table': backbone_embed_multi, + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi +} +custom_keys.update({ + f'backbone.stages.{stage_id}.blocks.{block_id}.norm': backbone_norm_multi + for stage_id, num_blocks in enumerate(depths) + for block_id in range(num_blocks) +}) +custom_keys.update({ + f'backbone.stages.{stage_id}.downsample.norm': backbone_norm_multi + for stage_id in range(len(depths) - 1) +}) +# optimizer +optimizer = dict( + paramwise_cfg=dict(custom_keys=custom_keys, norm_decay_mult=0.0)) diff --git a/configs/mask2former/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic.py b/configs/mask2former/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic.py new file mode 100644 index 0000000..91a180d --- /dev/null +++ b/configs/mask2former/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic.py @@ -0,0 +1,26 @@ +_base_ = ['./mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic.py'] +pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_large_patch4_window12_384_22k.pth' # noqa + +model = dict( + backbone=dict( + embed_dims=192, + num_heads=[6, 12, 24, 48], + init_cfg=dict(type='Pretrained', checkpoint=pretrained)), + panoptic_head=dict(num_queries=200, in_channels=[192, 384, 768, 1536])) + +data = dict(samples_per_gpu=1, workers_per_gpu=1) + +lr_config = dict(step=[655556, 710184]) + +max_iters = 737500 +runner = dict(type='IterBasedRunner', max_iters=max_iters) + +# Before 735001th iteration, we do evaluation every 5000 iterations. +# After 735000th iteration, we do evaluation every 737500 iterations, +# which means that we do evaluation at the end of training.' +interval = 5000 +dynamic_intervals = [(max_iters // interval * interval + 1, max_iters)] +evaluation = dict( + interval=interval, + dynamic_intervals=dynamic_intervals, + metric=['PQ', 'bbox', 'segm']) diff --git a/configs/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic.py b/configs/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic.py new file mode 100644 index 0000000..b2b621c --- /dev/null +++ b/configs/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic.py @@ -0,0 +1,37 @@ +_base_ = ['./mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic.py'] +pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_small_patch4_window7_224.pth' # noqa + +depths = [2, 2, 18, 2] +model = dict( + backbone=dict( + depths=depths, init_cfg=dict(type='Pretrained', + checkpoint=pretrained))) + +# set all layers in backbone to lr_mult=0.1 +# set all norm layers, position_embeding, +# query_embeding, level_embeding to decay_multi=0.0 +backbone_norm_multi = dict(lr_mult=0.1, decay_mult=0.0) +backbone_embed_multi = dict(lr_mult=0.1, decay_mult=0.0) +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +custom_keys = { + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'backbone.patch_embed.norm': backbone_norm_multi, + 'backbone.norm': backbone_norm_multi, + 'absolute_pos_embed': backbone_embed_multi, + 'relative_position_bias_table': backbone_embed_multi, + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi +} +custom_keys.update({ + f'backbone.stages.{stage_id}.blocks.{block_id}.norm': backbone_norm_multi + for stage_id, num_blocks in enumerate(depths) + for block_id in range(num_blocks) +}) +custom_keys.update({ + f'backbone.stages.{stage_id}.downsample.norm': backbone_norm_multi + for stage_id in range(len(depths) - 1) +}) +# optimizer +optimizer = dict( + paramwise_cfg=dict(custom_keys=custom_keys, norm_decay_mult=0.0)) diff --git a/configs/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco.py b/configs/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco.py new file mode 100644 index 0000000..7b1b05a --- /dev/null +++ b/configs/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco.py @@ -0,0 +1,37 @@ +_base_ = ['./mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco.py'] +pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_small_patch4_window7_224.pth' # noqa + +depths = [2, 2, 18, 2] +model = dict( + backbone=dict( + depths=depths, init_cfg=dict(type='Pretrained', + checkpoint=pretrained))) + +# set all layers in backbone to lr_mult=0.1 +# set all norm layers, position_embeding, +# query_embeding, level_embeding to decay_multi=0.0 +backbone_norm_multi = dict(lr_mult=0.1, decay_mult=0.0) +backbone_embed_multi = dict(lr_mult=0.1, decay_mult=0.0) +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +custom_keys = { + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'backbone.patch_embed.norm': backbone_norm_multi, + 'backbone.norm': backbone_norm_multi, + 'absolute_pos_embed': backbone_embed_multi, + 'relative_position_bias_table': backbone_embed_multi, + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi +} +custom_keys.update({ + f'backbone.stages.{stage_id}.blocks.{block_id}.norm': backbone_norm_multi + for stage_id, num_blocks in enumerate(depths) + for block_id in range(num_blocks) +}) +custom_keys.update({ + f'backbone.stages.{stage_id}.downsample.norm': backbone_norm_multi + for stage_id in range(len(depths) - 1) +}) +# optimizer +optimizer = dict( + paramwise_cfg=dict(custom_keys=custom_keys, norm_decay_mult=0.0)) diff --git a/configs/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic.py b/configs/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic.py new file mode 100644 index 0000000..04b2f10 --- /dev/null +++ b/configs/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic.py @@ -0,0 +1,62 @@ +_base_ = ['./mask2former_r50_lsj_8x2_50e_coco-panoptic.py'] +pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_tiny_patch4_window7_224.pth' # noqa + +depths = [2, 2, 6, 2] +model = dict( + type='Mask2Former', + backbone=dict( + _delete_=True, + type='SwinTransformer', + embed_dims=96, + depths=depths, + num_heads=[3, 6, 12, 24], + window_size=7, + mlp_ratio=4, + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.3, + patch_norm=True, + out_indices=(0, 1, 2, 3), + with_cp=False, + convert_weights=True, + frozen_stages=-1, + init_cfg=dict(type='Pretrained', checkpoint=pretrained)), + panoptic_head=dict( + type='Mask2FormerHead', in_channels=[96, 192, 384, 768]), + init_cfg=None) + +# set all layers in backbone to lr_mult=0.1 +# set all norm layers, position_embeding, +# query_embeding, level_embeding to decay_multi=0.0 +backbone_norm_multi = dict(lr_mult=0.1, decay_mult=0.0) +backbone_embed_multi = dict(lr_mult=0.1, decay_mult=0.0) +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +custom_keys = { + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'backbone.patch_embed.norm': backbone_norm_multi, + 'backbone.norm': backbone_norm_multi, + 'absolute_pos_embed': backbone_embed_multi, + 'relative_position_bias_table': backbone_embed_multi, + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi +} +custom_keys.update({ + f'backbone.stages.{stage_id}.blocks.{block_id}.norm': backbone_norm_multi + for stage_id, num_blocks in enumerate(depths) + for block_id in range(num_blocks) +}) +custom_keys.update({ + f'backbone.stages.{stage_id}.downsample.norm': backbone_norm_multi + for stage_id in range(len(depths) - 1) +}) +# optimizer +optimizer = dict( + type='AdamW', + lr=0.0001, + weight_decay=0.05, + eps=1e-8, + betas=(0.9, 0.999), + paramwise_cfg=dict(custom_keys=custom_keys, norm_decay_mult=0.0)) diff --git a/configs/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco.py b/configs/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco.py new file mode 100644 index 0000000..0ccbe91 --- /dev/null +++ b/configs/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco.py @@ -0,0 +1,61 @@ +_base_ = ['./mask2former_r50_lsj_8x2_50e_coco.py'] +pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_tiny_patch4_window7_224.pth' # noqa +depths = [2, 2, 6, 2] +model = dict( + type='Mask2Former', + backbone=dict( + _delete_=True, + type='SwinTransformer', + embed_dims=96, + depths=depths, + num_heads=[3, 6, 12, 24], + window_size=7, + mlp_ratio=4, + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.3, + patch_norm=True, + out_indices=(0, 1, 2, 3), + with_cp=False, + convert_weights=True, + frozen_stages=-1, + init_cfg=dict(type='Pretrained', checkpoint=pretrained)), + panoptic_head=dict( + type='Mask2FormerHead', in_channels=[96, 192, 384, 768]), + init_cfg=None) + +# set all layers in backbone to lr_mult=0.1 +# set all norm layers, position_embeding, +# query_embeding, level_embeding to decay_multi=0.0 +backbone_norm_multi = dict(lr_mult=0.1, decay_mult=0.0) +backbone_embed_multi = dict(lr_mult=0.1, decay_mult=0.0) +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +custom_keys = { + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'backbone.patch_embed.norm': backbone_norm_multi, + 'backbone.norm': backbone_norm_multi, + 'absolute_pos_embed': backbone_embed_multi, + 'relative_position_bias_table': backbone_embed_multi, + 'query_embed': embed_multi, + 'query_feat': embed_multi, + 'level_embed': embed_multi +} +custom_keys.update({ + f'backbone.stages.{stage_id}.blocks.{block_id}.norm': backbone_norm_multi + for stage_id, num_blocks in enumerate(depths) + for block_id in range(num_blocks) +}) +custom_keys.update({ + f'backbone.stages.{stage_id}.downsample.norm': backbone_norm_multi + for stage_id in range(len(depths) - 1) +}) +# optimizer +optimizer = dict( + type='AdamW', + lr=0.0001, + weight_decay=0.05, + eps=1e-8, + betas=(0.9, 0.999), + paramwise_cfg=dict(custom_keys=custom_keys, norm_decay_mult=0.0)) diff --git a/configs/mask2former/metafile.yml b/configs/mask2former/metafile.yml new file mode 100644 index 0000000..d9f4692 --- /dev/null +++ b/configs/mask2former/metafile.yml @@ -0,0 +1,223 @@ +Collections: + - Name: Mask2Former + Metadata: + Training Data: COCO + Training Techniques: + - AdamW + - Weight Decay + Training Resources: 8x A100 GPUs + Architecture: + - Mask2Former + Paper: + URL: https://arxiv.org/pdf/2112.01527 + Title: 'Masked-attention Mask Transformer for Universal Image Segmentation' + README: configs/mask2former/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.23.0/mmdet/models/detectors/mask2former.py#L7 + Version: v2.23.0 + +Models: +- Name: mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic + In Collection: Mask2Former + Config: configs/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic.py + Metadata: + Training Memory (GB): 19.1 + Iterations: 368750 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 44.5 + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 54.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco-panoptic_20220329_225200-c7b94355.pth +- Name: mask2former_r101_lsj_8x2_50e_coco + In Collection: Mask2Former + Config: configs/mask2former/mask2former_r101_lsj_8x2_50e_coco.py + Metadata: + Training Memory (GB): 15.5 + Iterations: 368750 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 44.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r101_lsj_8x2_50e_coco/mask2former_r101_lsj_8x2_50e_coco_20220426_100250-c50b6fa6.pth +- Name: mask2former_r101_lsj_8x2_50e_coco-panoptic + In Collection: Mask2Former + Config: configs/mask2former/mask2former_r101_lsj_8x2_50e_coco-panoptic.py + Metadata: + Training Memory (GB): 16.1 + Iterations: 368750 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 42.4 + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 52.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r101_lsj_8x2_50e_coco-panoptic/mask2former_r101_lsj_8x2_50e_coco-panoptic_20220329_225104-c54e64c9.pth +- Name: mask2former_r50_lsj_8x2_50e_coco-panoptic + In Collection: Mask2Former + Config: configs/mask2former/mask2former_r50_lsj_8x2_50e_coco-panoptic.py + Metadata: + Training Memory (GB): 13.9 + Iterations: 368750 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 41.9 + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 51.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r50_lsj_8x2_50e_coco-panoptic/mask2former_r50_lsj_8x2_50e_coco-panoptic_20220326_224516-11a44721.pth +- Name: mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic + In Collection: Mask2Former + Config: configs/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic.py + Metadata: + Training Memory (GB): 15.9 + Iterations: 368750 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 43.4 + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 53.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco-panoptic_20220326_224553-fc567107.pth +- Name: mask2former_r50_lsj_8x2_50e_coco + In Collection: Mask2Former + Config: configs/mask2former/mask2former_r50_lsj_8x2_50e_coco.py + Metadata: + Training Memory (GB): 13.7 + Iterations: 368750 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 42.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_r50_lsj_8x2_50e_coco/mask2former_r50_lsj_8x2_50e_coco_20220506_191028-8e96e88b.pth +- Name: mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic + In Collection: Mask2Former + Config: configs/mask2former/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic.py + Metadata: + Training Memory (GB): 21.1 + Iterations: 737500 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 52.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 48.5 + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 57.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic/mask2former_swin-l-p4-w12-384-in21k_lsj_16x1_100e_coco-panoptic_20220407_104949-d4919c44.pth +- Name: mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic + In Collection: Mask2Former + Config: configs/mask2former/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic.py + Metadata: + Training Memory (GB): 25.8 + Iterations: 368750 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 50.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 46.3 + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 56.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic/mask2former_swin-b-p4-w12-384-in21k_lsj_8x2_50e_coco-panoptic_20220329_230021-3bb8b482.pth +- Name: mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic + In Collection: Mask2Former + Config: configs/mask2former/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic.py + Metadata: + Training Memory (GB): 26.0 + Iterations: 368750 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 48.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 44.9 + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 55.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic/mask2former_swin-b-p4-w12-384_lsj_8x2_50e_coco-panoptic_20220331_002244-c149a9e9.pth +- Name: mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco + In Collection: Mask2Former + Config: configs/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco.py + Metadata: + Training Memory (GB): 15.3 + Iterations: 368750 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 44.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco/mask2former_swin-t-p4-w7-224_lsj_8x2_50e_coco_20220508_091649-4a943037.pth +- Name: mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco + In Collection: Mask2Former + Config: configs/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco.py + Metadata: + Training Memory (GB): 18.8 + Iterations: 368750 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 49.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 46.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask2former/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco/mask2former_swin-s-p4-w7-224_lsj_8x2_50e_coco_20220504_001756-743b7d99.pth diff --git a/configs/mask_rcnn/README.md b/configs/mask_rcnn/README.md new file mode 100644 index 0000000..11a39b0 --- /dev/null +++ b/configs/mask_rcnn/README.md @@ -0,0 +1,59 @@ +# Mask R-CNN + +> [Mask R-CNN](https://arxiv.org/abs/1703.06870) + + + +## Abstract + +We present a conceptually simple, flexible, and general framework for object instance segmentation. Our approach efficiently detects objects in an image while simultaneously generating a high-quality segmentation mask for each instance. The method, called Mask R-CNN, extends Faster R-CNN by adding a branch for predicting an object mask in parallel with the existing branch for bounding box recognition. Mask R-CNN is simple to train and adds only a small overhead to Faster R-CNN, running at 5 fps. Moreover, Mask R-CNN is easy to generalize to other tasks, e.g., allowing us to estimate human poses in the same framework. We show top results in all three tracks of the COCO suite of challenges, including instance segmentation, bounding-box object detection, and person keypoint detection. Without bells and whistles, Mask R-CNN outperforms all existing, single-model entries on every task, including the COCO 2016 challenge winners. We hope our simple and effective approach will serve as a solid baseline and help ease future research in instance-level recognition. + +
+ +
+ +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :-------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | caffe | 1x | 4.3 | | 38.0 | 34.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_1x_coco/mask_rcnn_r50_caffe_fpn_1x_coco_bbox_mAP-0.38__segm_mAP-0.344_20200504_231812-0ebd1859.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_1x_coco/mask_rcnn_r50_caffe_fpn_1x_coco_20200504_231812.log.json) | +| R-50-FPN | pytorch | 1x | 4.4 | 16.1 | 38.2 | 34.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_1x_coco/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_1x_coco/mask_rcnn_r50_fpn_1x_coco_20200205_050542.log.json) | +| R-50-FPN (FP16) | pytorch | 1x | 3.6 | 24.1 | 38.1 | 34.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r50_fpn_fp16_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fp16/mask_rcnn_r50_fpn_fp16_1x_coco/mask_rcnn_r50_fpn_fp16_1x_coco_20200205-59faf7e4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fp16/mask_rcnn_r50_fpn_fp16_1x_coco/mask_rcnn_r50_fpn_fp16_1x_coco_20200205_130539.log.json) | +| R-50-FPN | pytorch | 2x | - | - | 39.2 | 35.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r50_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_2x_coco/mask_rcnn_r50_fpn_2x_coco_bbox_mAP-0.392__segm_mAP-0.354_20200505_003907-3e542a40.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_2x_coco/mask_rcnn_r50_fpn_2x_coco_20200505_003907.log.json) | +| R-101-FPN | caffe | 1x | | | 40.4 | 36.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r101_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_caffe_fpn_1x_coco/mask_rcnn_r101_caffe_fpn_1x_coco_20200601_095758-805e06c1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_caffe_fpn_1x_coco/mask_rcnn_r101_caffe_fpn_1x_coco_20200601_095758.log.json) | +| R-101-FPN | pytorch | 1x | 6.4 | 13.5 | 40.0 | 36.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_1x_coco/mask_rcnn_r101_fpn_1x_coco_20200204-1efe0ed5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_1x_coco/mask_rcnn_r101_fpn_1x_coco_20200204_144809.log.json) | +| R-101-FPN | pytorch | 2x | - | - | 40.8 | 36.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r101_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_2x_coco/mask_rcnn_r101_fpn_2x_coco_bbox_mAP-0.408__segm_mAP-0.366_20200505_071027-14b391c7.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_2x_coco/mask_rcnn_r101_fpn_2x_coco_20200505_071027.log.json) | +| X-101-32x4d-FPN | pytorch | 1x | 7.6 | 11.3 | 41.9 | 37.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco/mask_rcnn_x101_32x4d_fpn_1x_coco_20200205-478d0b67.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco/mask_rcnn_x101_32x4d_fpn_1x_coco_20200205_034906.log.json) | +| X-101-32x4d-FPN | pytorch | 2x | - | - | 42.2 | 37.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x4d_fpn_2x_coco/mask_rcnn_x101_32x4d_fpn_2x_coco_bbox_mAP-0.422__segm_mAP-0.378_20200506_004702-faef898c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x4d_fpn_2x_coco/mask_rcnn_x101_32x4d_fpn_2x_coco_20200506_004702.log.json) | +| X-101-64x4d-FPN | pytorch | 1x | 10.7 | 8.0 | 42.8 | 38.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_64x4d_fpn_1x_coco/mask_rcnn_x101_64x4d_fpn_1x_coco_20200201-9352eb0d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_64x4d_fpn_1x_coco/mask_rcnn_x101_64x4d_fpn_1x_coco_20200201_124310.log.json) | +| X-101-64x4d-FPN | pytorch | 2x | - | - | 42.7 | 38.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_64x4d_fpn_2x_coco/mask_rcnn_x101_64x4d_fpn_2x_coco_20200509_224208-39d6f70c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_64x4d_fpn_2x_coco/mask_rcnn_x101_64x4d_fpn_2x_coco_20200509_224208.log.json) | +| X-101-32x8d-FPN | pytorch | 1x | 10.6 | - | 42.8 | 38.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x8d_fpn_1x_coco/mask_rcnn_x101_32x8d_fpn_1x_coco_20220630_173841-0aaf329e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x8d_fpn_1x_coco/mask_rcnn_x101_32x8d_fpn_1x_coco_20220630_173841.log.json) | + +## Pre-trained Models + +We also train some models with longer schedules and multi-scale training. The users could finetune them for downstream tasks. + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------------------------------------------------------------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :--------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| [R-50-FPN](./mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco.py) | caffe | 2x | 4.3 | | 40.3 | 36.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco_bbox_mAP-0.403__segm_mAP-0.365_20200504_231822-a75c98ce.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco_20200504_231822.log.json) | +| [R-50-FPN](./mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco.py) | caffe | 3x | 4.3 | | 40.8 | 37.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_20200504_163245.log.json) | +| [R-50-FPN](./mask_rcnn_r50_fpn_mstrain-poly_3x_coco.py) | pytorch | 3x | 4.1 | | 40.9 | 37.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r50_fpn_mstrain-poly_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_fpn_mstrain-poly_3x_coco_20210524_201154-21b550bb.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_fpn_mstrain-poly_3x_coco_20210524_201154.log.json) | +| [R-101-FPN](./mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco.py) | caffe | 3x | 5.9 | | 42.9 | 38.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco_20210526_132339-3c33ce02.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco_20210526_132339.log.json) | +| [R-101-FPN](./mask_rcnn_r101_fpn_mstrain-poly_3x_coco.py) | pytorch | 3x | 6.1 | | 42.7 | 38.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r101_fpn_mstrain-poly_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_mstrain-poly_3x_coco/mask_rcnn_r101_fpn_mstrain-poly_3x_coco_20210524_200244-5675c317.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_mstrain-poly_3x_coco/mask_rcnn_r101_fpn_mstrain-poly_3x_coco_20210524_200244.log.json) | +| [x101-32x4d-FPN](./mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco.py) | pytorch | 3x | 7.3 | | 43.6 | 39.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco_20210524_201410-abcd7859.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco_20210524_201410.log.json) | +| [X-101-32x8d-FPN](./mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco.py) | pytorch | 1x | 10.4 | | 43.4 | 39.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_1x_coco/mask_rcnn_x101_32x8d_fpn_mstrain-poly_1x_coco_20220630_170346-b4637974.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_1x_coco/mask_rcnn_x101_32x8d_fpn_mstrain-poly_1x_coco_20220630_170346.log.json) | +| [X-101-32x8d-FPN](./mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco.py) | pytorch | 3x | 10.3 | | 44.3 | 39.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco_20210607_161042-8bd2c639.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco_20210607_161042.log.json) | +| [X-101-64x4d-FPN](./mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco.py) | pytorch | 3x | 10.4 | | 44.5 | 39.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco_20210526_120447-c376f129.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco_20210526_120447.log.json) | + +## Citation + +```latex +@article{He_2017, + title={Mask R-CNN}, + journal={2017 IEEE International Conference on Computer Vision (ICCV)}, + publisher={IEEE}, + author={He, Kaiming and Gkioxari, Georgia and Dollar, Piotr and Girshick, Ross}, + year={2017}, + month={Oct} +} +``` diff --git a/configs/mask_rcnn/mask_rcnn_r101_caffe_fpn_1x_coco.py b/configs/mask_rcnn/mask_rcnn_r101_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..95b324f --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_r101_caffe_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './mask_rcnn_r50_caffe_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) diff --git a/configs/mask_rcnn/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco.py b/configs/mask_rcnn/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco.py new file mode 100644 index 0000000..e39781d --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco.py @@ -0,0 +1,55 @@ +_base_ = [ + '../common/mstrain-poly_3x_coco_instance.py', + '../_base_/models/mask_rcnn_r50_fpn.py' +] + +model = dict( + backbone=dict( + depth=101, + norm_cfg=dict(requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', + with_bbox=True, + with_mask=True, + poly2mask=False), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + train=dict(dataset=dict(pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py b/configs/mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py new file mode 100644 index 0000000..b7986e8 --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/mask_rcnn/mask_rcnn_r101_fpn_2x_coco.py b/configs/mask_rcnn/mask_rcnn_r101_fpn_2x_coco.py new file mode 100644 index 0000000..c9059d5 --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_r101_fpn_2x_coco.py @@ -0,0 +1,6 @@ +_base_ = './mask_rcnn_r50_fpn_2x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/mask_rcnn/mask_rcnn_r101_fpn_mstrain-poly_3x_coco.py b/configs/mask_rcnn/mask_rcnn_r101_fpn_mstrain-poly_3x_coco.py new file mode 100644 index 0000000..0696cbe --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_r101_fpn_mstrain-poly_3x_coco.py @@ -0,0 +1,10 @@ +_base_ = [ + '../common/mstrain-poly_3x_coco_instance.py', + '../_base_/models/mask_rcnn_r50_fpn.py' +] + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/mask_rcnn/mask_rcnn_r50_caffe_c4_1x_coco.py b/configs/mask_rcnn/mask_rcnn_r50_caffe_c4_1x_coco.py new file mode 100644 index 0000000..a44c018 --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_r50_caffe_c4_1x_coco.py @@ -0,0 +1,39 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_caffe_c4.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_1x_coco.py b/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..5a23f8c --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,40 @@ +_base_ = './mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py b/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py new file mode 100644 index 0000000..6308e40 --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py @@ -0,0 +1,49 @@ +_base_ = './mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', + with_bbox=True, + with_mask=True, + poly2mask=False), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco.py b/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco.py new file mode 100644 index 0000000..4f7150c --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 23]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco.py b/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco.py new file mode 100644 index 0000000..1b48a21 --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco.py @@ -0,0 +1,4 @@ +_base_ = './mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py' +# learning policy +lr_config = dict(step=[28, 34]) +runner = dict(type='EpochBasedRunner', max_epochs=36) diff --git a/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain_1x_coco.py b/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain_1x_coco.py new file mode 100644 index 0000000..bebbaaa --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain_1x_coco.py @@ -0,0 +1,45 @@ +_base_ = './mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_poly_1x_coco_v1.py b/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_poly_1x_coco_v1.py new file mode 100644 index 0000000..3f8079d --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_poly_1x_coco_v1.py @@ -0,0 +1,61 @@ +_base_ = './mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + rpn_head=dict( + loss_bbox=dict(type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0)), + roi_head=dict( + bbox_roi_extractor=dict( + roi_layer=dict( + type='RoIAlign', + output_size=7, + sampling_ratio=2, + aligned=False)), + bbox_head=dict( + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)), + mask_roi_extractor=dict( + roi_layer=dict( + type='RoIAlign', + output_size=14, + sampling_ratio=2, + aligned=False)))) +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', + with_bbox=True, + with_mask=True, + poly2mask=False), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py b/configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..6a6c924 --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] diff --git a/configs/mask_rcnn/mask_rcnn_r50_fpn_1x_wandb_coco.py b/configs/mask_rcnn/mask_rcnn_r50_fpn_1x_wandb_coco.py new file mode 100644 index 0000000..88c8576 --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_r50_fpn_1x_wandb_coco.py @@ -0,0 +1,26 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +# Set evaluation interval +evaluation = dict(interval=2) +# Set checkpoint interval +checkpoint_config = dict(interval=4) + +# yapf:disable +log_config = dict( + interval=50, + hooks=[ + dict(type='TextLoggerHook'), + dict(type='MMDetWandbHook', + init_kwargs={ + 'project': 'mmdetection', + 'group': 'maskrcnn-r50-fpn-1x-coco' + }, + interval=50, + log_checkpoint=True, + log_checkpoint_metadata=True, + num_eval_images=100) + ]) diff --git a/configs/mask_rcnn/mask_rcnn_r50_fpn_2x_coco.py b/configs/mask_rcnn/mask_rcnn_r50_fpn_2x_coco.py new file mode 100644 index 0000000..932b1f9 --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_r50_fpn_2x_coco.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_2x.py', '../_base_/default_runtime.py' +] diff --git a/configs/mask_rcnn/mask_rcnn_r50_fpn_fp16_1x_coco.py b/configs/mask_rcnn/mask_rcnn_r50_fpn_fp16_1x_coco.py new file mode 100644 index 0000000..fb8289b --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_r50_fpn_fp16_1x_coco.py @@ -0,0 +1,3 @@ +_base_ = './mask_rcnn_r50_fpn_1x_coco.py' +# fp16 settings +fp16 = dict(loss_scale=512.) diff --git a/configs/mask_rcnn/mask_rcnn_r50_fpn_mstrain-poly_3x_coco.py b/configs/mask_rcnn/mask_rcnn_r50_fpn_mstrain-poly_3x_coco.py new file mode 100644 index 0000000..b3d9242 --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_r50_fpn_mstrain-poly_3x_coco.py @@ -0,0 +1,4 @@ +_base_ = [ + '../common/mstrain-poly_3x_coco_instance.py', + '../_base_/models/mask_rcnn_r50_fpn.py' +] diff --git a/configs/mask_rcnn/mask_rcnn_r50_fpn_poly_1x_coco.py b/configs/mask_rcnn/mask_rcnn_r50_fpn_poly_1x_coco.py new file mode 100644 index 0000000..9eb6d57 --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_r50_fpn_poly_1x_coco.py @@ -0,0 +1,23 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', + with_bbox=True, + with_mask=True, + poly2mask=False), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict(train=dict(pipeline=train_pipeline)) diff --git a/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py b/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..a8b3799 --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './mask_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_2x_coco.py b/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_2x_coco.py new file mode 100644 index 0000000..2cd3cee --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_2x_coco.py @@ -0,0 +1,14 @@ +_base_ = './mask_rcnn_r101_fpn_2x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco.py b/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco.py new file mode 100644 index 0000000..b698a7d --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco.py @@ -0,0 +1,18 @@ +_base_ = [ + '../common/mstrain-poly_3x_coco_instance.py', + '../_base_/models/mask_rcnn_r50_fpn.py' +] + +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_1x_coco.py b/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_1x_coco.py new file mode 100644 index 0000000..108ea4e --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_1x_coco.py @@ -0,0 +1,65 @@ +_base_ = './mask_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=8, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + style='pytorch', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnext101_32x8d'))) + +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], + std=[57.375, 57.120, 58.395], + to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) diff --git a/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_1x_coco.py b/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_1x_coco.py new file mode 100644 index 0000000..6b912f6 --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_1x_coco.py @@ -0,0 +1,60 @@ +_base_ = './mask_rcnn_r101_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=8, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + style='pytorch', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnext101_32x8d'))) + +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], + std=[57.375, 57.120, 58.395], + to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', + with_bbox=True, + with_mask=True, + poly2mask=False), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco.py b/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco.py new file mode 100644 index 0000000..8ba0e9c --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco.py @@ -0,0 +1,85 @@ +_base_ = [ + '../common/mstrain-poly_3x_coco_instance.py', + '../_base_/models/mask_rcnn_r50_fpn.py' +] + +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=8, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + style='pytorch', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnext101_32x8d'))) + +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], + std=[57.375, 57.120, 58.395], + to_rgb=False) + +# In mstrain 3x config, img_scale=[(1333, 640), (1333, 800)], +# multiscale_mode='range' +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', + with_bbox=True, + with_mask=True, + poly2mask=False), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +# Use RepeatDataset to speed up training +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='RepeatDataset', + times=3, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) diff --git a/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_1x_coco.py b/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..2333b03 --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './mask_rcnn_x101_32x4d_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_2x_coco.py b/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_2x_coco.py new file mode 100644 index 0000000..6074cca --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_2x_coco.py @@ -0,0 +1,14 @@ +_base_ = './mask_rcnn_x101_32x4d_fpn_2x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco.py b/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco.py new file mode 100644 index 0000000..9f9cb1c --- /dev/null +++ b/configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco.py @@ -0,0 +1,18 @@ +_base_ = [ + '../common/mstrain-poly_3x_coco_instance.py', + '../_base_/models/mask_rcnn_r50_fpn.py' +] + +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/mask_rcnn/metafile.yml b/configs/mask_rcnn/metafile.yml new file mode 100644 index 0000000..30938ea --- /dev/null +++ b/configs/mask_rcnn/metafile.yml @@ -0,0 +1,443 @@ +Collections: + - Name: Mask R-CNN + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Softmax + - RPN + - Convolution + - Dense Connections + - FPN + - ResNet + - RoIAlign + Paper: + URL: https://arxiv.org/abs/1703.06870v3 + Title: "Mask R-CNN" + README: configs/mask_rcnn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/detectors/mask_rcnn.py#L6 + Version: v2.0.0 + +Models: + - Name: mask_rcnn_r50_caffe_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.3 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 34.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_1x_coco/mask_rcnn_r50_caffe_fpn_1x_coco_bbox_mAP-0.38__segm_mAP-0.344_20200504_231812-0ebd1859.pth + + - Name: mask_rcnn_r50_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.4 + inference time (ms/im): + - value: 62.11 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 34.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_1x_coco/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth + + - Name: mask_rcnn_r50_fpn_fp16_1x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r50_fpn_fp16_1x_coco.py + Metadata: + Training Memory (GB): 3.6 + Training Techniques: + - SGD with Momentum + - Weight Decay + - Mixed Precision Training + inference time (ms/im): + - value: 41.49 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP16 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 34.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fp16/mask_rcnn_r50_fpn_fp16_1x_coco/mask_rcnn_r50_fpn_fp16_1x_coco_20200205-59faf7e4.pth + + - Name: mask_rcnn_r50_fpn_2x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r50_fpn_2x_coco.py + Metadata: + Training Memory (GB): 4.4 + inference time (ms/im): + - value: 62.11 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 35.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_2x_coco/mask_rcnn_r50_fpn_2x_coco_bbox_mAP-0.392__segm_mAP-0.354_20200505_003907-3e542a40.pth + + - Name: mask_rcnn_r101_caffe_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r101_caffe_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_caffe_fpn_1x_coco/mask_rcnn_r101_caffe_fpn_1x_coco_20200601_095758-805e06c1.pth + + - Name: mask_rcnn_r101_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.4 + inference time (ms/im): + - value: 74.07 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_1x_coco/mask_rcnn_r101_fpn_1x_coco_20200204-1efe0ed5.pth + + - Name: mask_rcnn_r101_fpn_2x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r101_fpn_2x_coco.py + Metadata: + Training Memory (GB): 6.4 + inference time (ms/im): + - value: 74.07 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_2x_coco/mask_rcnn_r101_fpn_2x_coco_bbox_mAP-0.408__segm_mAP-0.366_20200505_071027-14b391c7.pth + + - Name: mask_rcnn_x101_32x4d_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.6 + inference time (ms/im): + - value: 88.5 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco/mask_rcnn_x101_32x4d_fpn_1x_coco_20200205-478d0b67.pth + + - Name: mask_rcnn_x101_32x4d_fpn_2x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_2x_coco.py + Metadata: + Training Memory (GB): 7.6 + inference time (ms/im): + - value: 88.5 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x4d_fpn_2x_coco/mask_rcnn_x101_32x4d_fpn_2x_coco_bbox_mAP-0.422__segm_mAP-0.378_20200506_004702-faef898c.pth + + - Name: mask_rcnn_x101_64x4d_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 10.7 + inference time (ms/im): + - value: 125 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_64x4d_fpn_1x_coco/mask_rcnn_x101_64x4d_fpn_1x_coco_20200201-9352eb0d.pth + + - Name: mask_rcnn_x101_64x4d_fpn_2x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_2x_coco.py + Metadata: + Training Memory (GB): 10.7 + inference time (ms/im): + - value: 125 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_64x4d_fpn_2x_coco/mask_rcnn_x101_64x4d_fpn_2x_coco_20200509_224208-39d6f70c.pth + + - Name: mask_rcnn_x101_32x8d_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 10.6 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x8d_fpn_1x_coco/mask_rcnn_x101_32x8d_fpn_1x_coco_20220630_173841-0aaf329e.pth + + - Name: mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco.py + Metadata: + Training Memory (GB): 4.3 + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_2x_coco_bbox_mAP-0.403__segm_mAP-0.365_20200504_231822-a75c98ce.pth + + - Name: mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco.py + Metadata: + Training Memory (GB): 4.3 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth + + - Name: mask_rcnn_r50_fpn_mstrain-poly_3x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r50_fpn_mstrain-poly_3x_coco.py + Metadata: + Training Memory (GB): 4.1 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_fpn_mstrain-poly_3x_coco_20210524_201154-21b550bb.pth + + - Name: mask_rcnn_r101_fpn_mstrain-poly_3x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r101_fpn_mstrain-poly_3x_coco.py + Metadata: + Training Memory (GB): 6.1 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_mstrain-poly_3x_coco/mask_rcnn_r101_fpn_mstrain-poly_3x_coco_20210524_200244-5675c317.pth + + - Name: mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco.py + Metadata: + Training Memory (GB): 5.9 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r101_caffe_fpn_mstrain-poly_3x_coco_20210526_132339-3c33ce02.pth + + - Name: mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco.py + Metadata: + Training Memory (GB): 7.3 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco/mask_rcnn_x101_32x4d_fpn_mstrain-poly_3x_coco_20210524_201410-abcd7859.pth + + - Name: mask_rcnn_x101_32x8d_fpn_mstrain-poly_1x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_1x_coco.py + Metadata: + Training Memory (GB): 10.4 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_1x_coco/mask_rcnn_x101_32x8d_fpn_mstrain-poly_1x_coco_20220630_170346-b4637974.pth + + - Name: mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco.py + Metadata: + Training Memory (GB): 10.3 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco/mask_rcnn_x101_32x8d_fpn_mstrain-poly_3x_coco_20210607_161042-8bd2c639.pth + + - Name: mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco + In Collection: Mask R-CNN + Config: configs/mask_rcnn/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco.py + Metadata: + Epochs: 36 + Training Memory (GB): 10.4 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco/mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco_20210526_120447-c376f129.pth diff --git a/configs/maskformer/README.md b/configs/maskformer/README.md new file mode 100644 index 0000000..5d8daa2 --- /dev/null +++ b/configs/maskformer/README.md @@ -0,0 +1,53 @@ +# MaskFormer + +> [Per-Pixel Classification is Not All You Need for Semantic Segmentation](https://arxiv.org/abs/2107.06278) + + + +## Abstract + +Modern approaches typically formulate semantic segmentation as a per-pixel classification task, while instance-level segmentation is handled with an alternative mask classification. Our key insight: mask classification is sufficiently general to solve both semantic- and instance-level segmentation tasks in a unified manner using the exact same model, loss, and training procedure. Following this observation, we propose MaskFormer, a simple mask classification model which predicts a set of binary masks, each associated with a single global class label prediction. Overall, the proposed mask classification-based method simplifies the landscape of effective approaches to semantic and panoptic segmentation tasks and shows excellent empirical results. In particular, we observe that MaskFormer outperforms per-pixel classification baselines when the number of classes is large. Our mask classification-based method outperforms both current state-of-the-art semantic (55.6 mIoU on ADE20K) and panoptic segmentation (52.7 PQ on COCO) models. + +
+ +
+ +## Introduction + +MaskFormer requires COCO and [COCO-panoptic](http://images.cocodataset.org/annotations/panoptic_annotations_trainval2017.zip) dataset for training and evaluation. You need to download and extract it in the COCO dataset path. +The directory should be like this. + +```none +mmdetection +├── mmdet +├── tools +├── configs +├── data +│ ├── coco +│ │ ├── annotations +│ │ │ ├── panoptic_train2017.json +│ │ │ ├── panoptic_train2017 +│ │ │ ├── panoptic_val2017.json +│ │ │ ├── panoptic_val2017 +│ │ ├── train2017 +│ │ ├── val2017 +│ │ ├── test2017 +``` + +## Results and Models + +| Backbone | style | Lr schd | Mem (GB) | Inf time (fps) | PQ | SQ | RQ | PQ_th | SQ_th | RQ_th | PQ_st | SQ_st | RQ_st | Config | Download | detail | +| :------: | :-----: | :-----: | :------: | :------------: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :----: | :-----------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | pytorch | 75e | 16.2 | - | 46.854 | 80.617 | 57.085 | 51.089 | 81.511 | 61.853 | 40.463 | 79.269 | 49.888 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/maskformer/maskformer_r50_mstrain_16x1_75e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/maskformer/maskformer_r50_mstrain_16x1_75e_coco/maskformer_r50_mstrain_16x1_75e_coco_20220221_141956-bc2699cb.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/maskformer/maskformer_r50_mstrain_16x1_75e_coco/maskformer_r50_mstrain_16x1_75e_coco_20220221_141956.log.json) | This version was mentioned in Table XI, in paper [Masked-attention Mask Transformer for Universal Image Segmentation](https://arxiv.org/abs/2112.01527) | +| Swin-L | pytorch | 300e | 27.2 | - | 53.249 | 81.704 | 64.231 | 58.798 | 82.923 | 70.282 | 44.874 | 79.863 | 55.097 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/maskformer/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/maskformer/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco_20220326_221612-061b4eb8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/maskformer/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco_20220326_221612.log.json) | - | + +## Citation + +```latex +@inproceedings{cheng2021maskformer, + title={Per-Pixel Classification is Not All You Need for Semantic Segmentation}, + author={Bowen Cheng and Alexander G. Schwing and Alexander Kirillov}, + journal={NeurIPS}, + year={2021} +} +``` diff --git a/configs/maskformer/maskformer_r50_mstrain_16x1_75e_coco.py b/configs/maskformer/maskformer_r50_mstrain_16x1_75e_coco.py new file mode 100644 index 0000000..46b3c13 --- /dev/null +++ b/configs/maskformer/maskformer_r50_mstrain_16x1_75e_coco.py @@ -0,0 +1,238 @@ +_base_ = [ + '../_base_/datasets/coco_panoptic.py', '../_base_/default_runtime.py' +] +num_things_classes = 80 +num_stuff_classes = 53 +num_classes = num_things_classes + num_stuff_classes +model = dict( + type='MaskFormer', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=-1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + panoptic_head=dict( + type='MaskFormerHead', + in_channels=[256, 512, 1024, 2048], # pass to pixel_decoder inside + feat_channels=256, + out_channels=256, + num_things_classes=num_things_classes, + num_stuff_classes=num_stuff_classes, + num_queries=100, + pixel_decoder=dict( + type='TransformerEncoderPixelDecoder', + norm_cfg=dict(type='GN', num_groups=32), + act_cfg=dict(type='ReLU'), + encoder=dict( + type='DetrTransformerEncoder', + num_layers=6, + transformerlayers=dict( + type='BaseTransformerLayer', + attn_cfgs=dict( + type='MultiheadAttention', + embed_dims=256, + num_heads=8, + attn_drop=0.1, + proj_drop=0.1, + dropout_layer=None, + batch_first=False), + ffn_cfgs=dict( + embed_dims=256, + feedforward_channels=2048, + num_fcs=2, + act_cfg=dict(type='ReLU', inplace=True), + ffn_drop=0.1, + dropout_layer=None, + add_identity=True), + operation_order=('self_attn', 'norm', 'ffn', 'norm'), + norm_cfg=dict(type='LN'), + init_cfg=None, + batch_first=False), + init_cfg=None), + positional_encoding=dict( + type='SinePositionalEncoding', num_feats=128, normalize=True)), + enforce_decoder_input_project=False, + positional_encoding=dict( + type='SinePositionalEncoding', num_feats=128, normalize=True), + transformer_decoder=dict( + type='DetrTransformerDecoder', + return_intermediate=True, + num_layers=6, + transformerlayers=dict( + type='DetrTransformerDecoderLayer', + attn_cfgs=dict( + type='MultiheadAttention', + embed_dims=256, + num_heads=8, + attn_drop=0.1, + proj_drop=0.1, + dropout_layer=None, + batch_first=False), + ffn_cfgs=dict( + embed_dims=256, + feedforward_channels=2048, + num_fcs=2, + act_cfg=dict(type='ReLU', inplace=True), + ffn_drop=0.1, + dropout_layer=None, + add_identity=True), + # the following parameter was not used, + # just make current api happy + feedforward_channels=2048, + operation_order=('self_attn', 'norm', 'cross_attn', 'norm', + 'ffn', 'norm')), + init_cfg=None), + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0, + reduction='mean', + class_weight=[1.0] * num_classes + [0.1]), + loss_mask=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + reduction='mean', + loss_weight=20.0), + loss_dice=dict( + type='DiceLoss', + use_sigmoid=True, + activate=True, + reduction='mean', + naive_dice=True, + eps=1.0, + loss_weight=1.0)), + panoptic_fusion_head=dict( + type='MaskFormerFusionHead', + num_things_classes=num_things_classes, + num_stuff_classes=num_stuff_classes, + loss_panoptic=None, + init_cfg=None), + train_cfg=dict( + assigner=dict( + type='MaskHungarianAssigner', + cls_cost=dict(type='ClassificationCost', weight=1.0), + mask_cost=dict( + type='FocalLossCost', weight=20.0, binary_input=True), + dice_cost=dict( + type='DiceCost', weight=1.0, pred_act=True, eps=1.0)), + sampler=dict(type='MaskPseudoSampler')), + test_cfg=dict( + panoptic_on=True, + # For now, the dataset does not support + # evaluating semantic segmentation metric. + semantic_on=False, + instance_on=False, + # max_per_image is for instance segmentation. + max_per_image=100, + object_mask_thr=0.8, + iou_thr=0.8, + # In MaskFormer's panoptic postprocessing, + # it will not filter masks whose score is smaller than 0.5 . + filter_low_score=False), + init_cfg=None) + +# dataset settings +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadPanopticAnnotations', + with_bbox=True, + with_mask=True, + with_seg=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='AutoAugment', + policies=[[ + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), (576, 1333), + (608, 1333), (640, 1333), (672, 1333), (704, 1333), + (736, 1333), (768, 1333), (800, 1333)], + multiscale_mode='value', + keep_ratio=True) + ], + [ + dict( + type='Resize', + img_scale=[(400, 1333), (500, 1333), (600, 1333)], + multiscale_mode='value', + keep_ratio=True), + dict( + type='RandomCrop', + crop_type='absolute_range', + crop_size=(384, 600), + allow_negative_crop=True), + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + override=True, + keep_ratio=True) + ]]), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=1), + dict(type='DefaultFormatBundle'), + dict( + type='Collect', + keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=1), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=1, + workers_per_gpu=1, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) + +# optimizer +optimizer = dict( + type='AdamW', + lr=0.0001, + weight_decay=0.0001, + eps=1e-8, + betas=(0.9, 0.999), + paramwise_cfg=dict( + custom_keys={ + 'backbone': dict(lr_mult=0.1, decay_mult=1.0), + 'query_embed': dict(lr_mult=1.0, decay_mult=0.0) + }, + norm_decay_mult=0.0)) +optimizer_config = dict(grad_clip=dict(max_norm=0.01, norm_type=2)) + +# learning policy +lr_config = dict( + policy='step', + gamma=0.1, + by_epoch=True, + step=[50], + warmup='linear', + warmup_by_epoch=False, + warmup_ratio=1.0, # no warmup + warmup_iters=10) +runner = dict(type='EpochBasedRunner', max_epochs=75) diff --git a/configs/maskformer/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco.py b/configs/maskformer/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco.py new file mode 100644 index 0000000..bc23c54 --- /dev/null +++ b/configs/maskformer/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco.py @@ -0,0 +1,67 @@ +_base_ = './maskformer_r50_mstrain_16x1_75e_coco.py' + +pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_large_patch4_window12_384_22k.pth' # noqa +depths = [2, 2, 18, 2] +model = dict( + backbone=dict( + _delete_=True, + type='SwinTransformer', + pretrain_img_size=384, + embed_dims=192, + patch_size=4, + window_size=12, + mlp_ratio=4, + depths=depths, + num_heads=[6, 12, 24, 48], + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.3, + patch_norm=True, + out_indices=(0, 1, 2, 3), + with_cp=False, + convert_weights=True, + init_cfg=dict(type='Pretrained', checkpoint=pretrained)), + panoptic_head=dict( + in_channels=[192, 384, 768, 1536], # pass to pixel_decoder inside + pixel_decoder=dict( + _delete_=True, + type='PixelDecoder', + norm_cfg=dict(type='GN', num_groups=32), + act_cfg=dict(type='ReLU')), + enforce_decoder_input_project=True)) + +# weight_decay = 0.01 +# norm_weight_decay = 0.0 +# embed_weight_decay = 0.0 +embed_multi = dict(lr_mult=1.0, decay_mult=0.0) +norm_multi = dict(lr_mult=1.0, decay_mult=0.0) +custom_keys = { + 'norm': norm_multi, + 'absolute_pos_embed': embed_multi, + 'relative_position_bias_table': embed_multi, + 'query_embed': embed_multi +} + +# optimizer +optimizer = dict( + type='AdamW', + lr=6e-5, + weight_decay=0.01, + eps=1e-8, + betas=(0.9, 0.999), + paramwise_cfg=dict(custom_keys=custom_keys, norm_decay_mult=0.0)) +optimizer_config = dict(grad_clip=dict(max_norm=0.01, norm_type=2)) + +# learning policy +lr_config = dict( + policy='step', + gamma=0.1, + by_epoch=True, + step=[250], + warmup='linear', + warmup_by_epoch=False, + warmup_ratio=1e-6, + warmup_iters=1500) +runner = dict(type='EpochBasedRunner', max_epochs=300) diff --git a/configs/maskformer/metafile.yml b/configs/maskformer/metafile.yml new file mode 100644 index 0000000..6530fa1 --- /dev/null +++ b/configs/maskformer/metafile.yml @@ -0,0 +1,43 @@ +Collections: + - Name: MaskFormer + Metadata: + Training Data: COCO + Training Techniques: + - AdamW + - Weight Decay + Training Resources: 16x V100 GPUs + Architecture: + - MaskFormer + Paper: + URL: https://arxiv.org/pdf/2107.06278 + Title: 'Per-Pixel Classification is Not All You Need for Semantic Segmentation' + README: configs/maskformer/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.22.0/mmdet/models/detectors/maskformer.py#L7 + Version: v2.22.0 + +Models: + - Name: maskformer_r50_mstrain_16x1_75e_coco + In Collection: MaskFormer + Config: configs/maskformer/maskformer_r50_mstrain_16x1_75e_coco.py + Metadata: + Training Memory (GB): 16.2 + Epochs: 75 + Results: + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 46.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/maskformer/maskformer_r50_mstrain_16x1_75e_coco/maskformer_r50_mstrain_16x1_75e_coco_20220221_141956-bc2699cb.pth + - Name: maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco + In Collection: MaskFormer + Config: configs/maskformer/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco.py + Metadata: + Training Memory (GB): 27.2 + Epochs: 300 + Results: + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 53.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/maskformer/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco/maskformer_swin-l-p4-w12_mstrain_64x1_300e_coco_20220326_221612-061b4eb8.pth diff --git a/configs/ms_rcnn/README.md b/configs/ms_rcnn/README.md new file mode 100644 index 0000000..97bca05 --- /dev/null +++ b/configs/ms_rcnn/README.md @@ -0,0 +1,36 @@ +# MS R-CNN + +> [Mask Scoring R-CNN](https://arxiv.org/abs/1903.00241) + + + +## Abstract + +Letting a deep network be aware of the quality of its own predictions is an interesting yet important problem. In the task of instance segmentation, the confidence of instance classification is used as mask quality score in most instance segmentation frameworks. However, the mask quality, quantified as the IoU between the instance mask and its ground truth, is usually not well correlated with classification score. In this paper, we study this problem and propose Mask Scoring R-CNN which contains a network block to learn the quality of the predicted instance masks. The proposed network block takes the instance feature and the corresponding predicted mask together to regress the mask IoU. The mask scoring strategy calibrates the misalignment between mask quality and mask score, and improves instance segmentation performance by prioritizing more accurate mask predictions during COCO AP evaluation. By extensive evaluations on the COCO dataset, Mask Scoring R-CNN brings consistent and noticeable gain with different models, and outperforms the state-of-the-art Mask R-CNN. We hope our simple and effective approach will provide a new direction for improving instance segmentation. + +
+ +
+ +## Results and Models + +| Backbone | style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :----------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :---------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | caffe | 1x | 4.5 | | 38.2 | 36.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco/ms_rcnn_r50_caffe_fpn_1x_coco_20200702_180848-61c9355e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco/ms_rcnn_r50_caffe_fpn_1x_coco_20200702_180848.log.json) | +| R-50-FPN | caffe | 2x | - | - | 38.8 | 36.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r50_caffe_fpn_2x_coco/ms_rcnn_r50_caffe_fpn_2x_coco_bbox_mAP-0.388__segm_mAP-0.363_20200506_004738-ee87b137.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r50_caffe_fpn_2x_coco/ms_rcnn_r50_caffe_fpn_2x_coco_20200506_004738.log.json) | +| R-101-FPN | caffe | 1x | 6.5 | | 40.4 | 37.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ms_rcnn/ms_rcnn_r101_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r101_caffe_fpn_1x_coco/ms_rcnn_r101_caffe_fpn_1x_coco_bbox_mAP-0.404__segm_mAP-0.376_20200506_004755-b9b12a37.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r101_caffe_fpn_1x_coco/ms_rcnn_r101_caffe_fpn_1x_coco_20200506_004755.log.json) | +| R-101-FPN | caffe | 2x | - | - | 41.1 | 38.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ms_rcnn/ms_rcnn_r101_caffe_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r101_caffe_fpn_2x_coco/ms_rcnn_r101_caffe_fpn_2x_coco_bbox_mAP-0.411__segm_mAP-0.381_20200506_011134-5f3cc74f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r101_caffe_fpn_2x_coco/ms_rcnn_r101_caffe_fpn_2x_coco_20200506_011134.log.json) | +| R-X101-32x4d | pytorch | 2x | 7.9 | 11.0 | 41.8 | 38.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ms_rcnn/ms_rcnn_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_x101_32x4d_fpn_1x_coco/ms_rcnn_x101_32x4d_fpn_1x_coco_20200206-81fd1740.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_x101_32x4d_fpn_1x_coco/ms_rcnn_x101_32x4d_fpn_1x_coco_20200206_100113.log.json) | +| R-X101-64x4d | pytorch | 1x | 11.0 | 8.0 | 43.0 | 39.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_x101_64x4d_fpn_1x_coco/ms_rcnn_x101_64x4d_fpn_1x_coco_20200206-86ba88d2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_x101_64x4d_fpn_1x_coco/ms_rcnn_x101_64x4d_fpn_1x_coco_20200206_091744.log.json) | +| R-X101-64x4d | pytorch | 2x | 11.0 | 8.0 | 42.6 | 39.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_x101_64x4d_fpn_2x_coco/ms_rcnn_x101_64x4d_fpn_2x_coco_20200308-02a445e2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_x101_64x4d_fpn_2x_coco/ms_rcnn_x101_64x4d_fpn_2x_coco_20200308_012247.log.json) | + +## Citation + +```latex +@inproceedings{huang2019msrcnn, + title={Mask Scoring R-CNN}, + author={Zhaojin Huang and Lichao Huang and Yongchao Gong and Chang Huang and Xinggang Wang}, + booktitle={IEEE Conference on Computer Vision and Pattern Recognition}, + year={2019}, +} +``` diff --git a/configs/ms_rcnn/metafile.yml b/configs/ms_rcnn/metafile.yml new file mode 100644 index 0000000..a6c7dc5 --- /dev/null +++ b/configs/ms_rcnn/metafile.yml @@ -0,0 +1,159 @@ +Collections: + - Name: Mask Scoring R-CNN + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RPN + - FPN + - ResNet + - RoIAlign + Paper: + URL: https://arxiv.org/abs/1903.00241 + Title: 'Mask Scoring R-CNN' + README: configs/ms_rcnn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/detectors/mask_scoring_rcnn.py#L6 + Version: v2.0.0 + +Models: + - Name: ms_rcnn_r50_caffe_fpn_1x_coco + In Collection: Mask Scoring R-CNN + Config: configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.5 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco/ms_rcnn_r50_caffe_fpn_1x_coco_20200702_180848-61c9355e.pth + + - Name: ms_rcnn_r50_caffe_fpn_2x_coco + In Collection: Mask Scoring R-CNN + Config: configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_2x_coco.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r50_caffe_fpn_2x_coco/ms_rcnn_r50_caffe_fpn_2x_coco_bbox_mAP-0.388__segm_mAP-0.363_20200506_004738-ee87b137.pth + + - Name: ms_rcnn_r101_caffe_fpn_1x_coco + In Collection: Mask Scoring R-CNN + Config: configs/ms_rcnn/ms_rcnn_r101_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.5 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r101_caffe_fpn_1x_coco/ms_rcnn_r101_caffe_fpn_1x_coco_bbox_mAP-0.404__segm_mAP-0.376_20200506_004755-b9b12a37.pth + + - Name: ms_rcnn_r101_caffe_fpn_2x_coco + In Collection: Mask Scoring R-CNN + Config: configs/ms_rcnn/ms_rcnn_r101_caffe_fpn_2x_coco.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_r101_caffe_fpn_2x_coco/ms_rcnn_r101_caffe_fpn_2x_coco_bbox_mAP-0.411__segm_mAP-0.381_20200506_011134-5f3cc74f.pth + + - Name: ms_rcnn_x101_32x4d_fpn_1x_coco + In Collection: Mask Scoring R-CNN + Config: configs/ms_rcnn/ms_rcnn_x101_32x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.9 + inference time (ms/im): + - value: 90.91 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_x101_32x4d_fpn_1x_coco/ms_rcnn_x101_32x4d_fpn_1x_coco_20200206-81fd1740.pth + + - Name: ms_rcnn_x101_64x4d_fpn_1x_coco + In Collection: Mask Scoring R-CNN + Config: configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 11.0 + inference time (ms/im): + - value: 125 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_x101_64x4d_fpn_1x_coco/ms_rcnn_x101_64x4d_fpn_1x_coco_20200206-86ba88d2.pth + + - Name: ms_rcnn_x101_64x4d_fpn_2x_coco + In Collection: Mask Scoring R-CNN + Config: configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_2x_coco.py + Metadata: + Training Memory (GB): 11.0 + inference time (ms/im): + - value: 125 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ms_rcnn/ms_rcnn_x101_64x4d_fpn_2x_coco/ms_rcnn_x101_64x4d_fpn_2x_coco_20200308-02a445e2.pth diff --git a/configs/ms_rcnn/ms_rcnn_r101_caffe_fpn_1x_coco.py b/configs/ms_rcnn/ms_rcnn_r101_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..9b7dcbb --- /dev/null +++ b/configs/ms_rcnn/ms_rcnn_r101_caffe_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './ms_rcnn_r50_caffe_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) diff --git a/configs/ms_rcnn/ms_rcnn_r101_caffe_fpn_2x_coco.py b/configs/ms_rcnn/ms_rcnn_r101_caffe_fpn_2x_coco.py new file mode 100644 index 0000000..202bcce --- /dev/null +++ b/configs/ms_rcnn/ms_rcnn_r101_caffe_fpn_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './ms_rcnn_r101_caffe_fpn_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py b/configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..5845125 --- /dev/null +++ b/configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,16 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_caffe_fpn_1x_coco.py' +model = dict( + type='MaskScoringRCNN', + roi_head=dict( + type='MaskScoringRoIHead', + mask_iou_head=dict( + type='MaskIoUHead', + num_convs=4, + num_fcs=2, + roi_feat_size=14, + in_channels=256, + conv_out_channels=256, + fc_out_channels=1024, + num_classes=80)), + # model training and testing settings + train_cfg=dict(rcnn=dict(mask_thr_binary=0.5))) diff --git a/configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_2x_coco.py b/configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_2x_coco.py new file mode 100644 index 0000000..008a70a --- /dev/null +++ b/configs/ms_rcnn/ms_rcnn_r50_caffe_fpn_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './ms_rcnn_r50_caffe_fpn_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/ms_rcnn/ms_rcnn_r50_fpn_1x_coco.py b/configs/ms_rcnn/ms_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..0a163ce --- /dev/null +++ b/configs/ms_rcnn/ms_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,16 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + type='MaskScoringRCNN', + roi_head=dict( + type='MaskScoringRoIHead', + mask_iou_head=dict( + type='MaskIoUHead', + num_convs=4, + num_fcs=2, + roi_feat_size=14, + in_channels=256, + conv_out_channels=256, + fc_out_channels=1024, + num_classes=80)), + # model training and testing settings + train_cfg=dict(rcnn=dict(mask_thr_binary=0.5))) diff --git a/configs/ms_rcnn/ms_rcnn_x101_32x4d_fpn_1x_coco.py b/configs/ms_rcnn/ms_rcnn_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..20479bb --- /dev/null +++ b/configs/ms_rcnn/ms_rcnn_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './ms_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_1x_coco.py b/configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..ee5b734 --- /dev/null +++ b/configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './ms_rcnn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_2x_coco.py b/configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_2x_coco.py new file mode 100644 index 0000000..54c605b --- /dev/null +++ b/configs/ms_rcnn/ms_rcnn_x101_64x4d_fpn_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './ms_rcnn_x101_64x4d_fpn_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/nas_fcos/README.md b/configs/nas_fcos/README.md new file mode 100644 index 0000000..def8831 --- /dev/null +++ b/configs/nas_fcos/README.md @@ -0,0 +1,35 @@ +# NAS-FCOS + +> [NAS-FCOS: Fast Neural Architecture Search for Object Detection](https://arxiv.org/abs/1906.04423) + + + +## Abstract + +The success of deep neural networks relies on significant architecture engineering. Recently neural architecture search (NAS) has emerged as a promise to greatly reduce manual effort in network design by automatically searching for optimal architectures, although typically such algorithms need an excessive amount of computational resources, e.g., a few thousand GPU-days. To date, on challenging vision tasks such as object detection, NAS, especially fast versions of NAS, is less studied. Here we propose to search for the decoder structure of object detectors with search efficiency being taken into consideration. To be more specific, we aim to efficiently search for the feature pyramid network (FPN) as well as the prediction head of a simple anchor-free object detector, namely FCOS, using a tailored reinforcement learning paradigm. With carefully designed search space, search algorithms and strategies for evaluating network quality, we are able to efficiently search a top-performing detection architecture within 4 days using 8 V100 GPUs. The discovered architecture surpasses state-of-the-art object detection models (such as Faster R-CNN, RetinaNet and FCOS) by 1.5 to 3.5 points in AP on the COCO dataset, with comparable computation complexity and memory footprint, demonstrating the efficacy of the proposed NAS for object detection. + +
+ +
+ +## Results and Models + +| Head | Backbone | Style | GN-head | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :----------: | :------: | :---: | :-----: | :-----: | :------: | :------------: | :----: | :-------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| NAS-FCOSHead | R-50 | caffe | Y | 1x | | | 39.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco_20200520-1bdba3ce.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco_20200520.log.json) | +| FCOSHead | R-50 | caffe | Y | 1x | | | 38.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/nas_fcos/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/nas_fcos/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco_20200521-7fdcbce0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/nas_fcos/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco_20200521.log.json) | + +**Notes:** + +- To be consistent with the author's implementation, we use 4 GPUs with 4 images/GPU. + +## Citation + +```latex +@article{wang2019fcos, + title={Nas-fcos: Fast neural architecture search for object detection}, + author={Wang, Ning and Gao, Yang and Chen, Hao and Wang, Peng and Tian, Zhi and Shen, Chunhua}, + journal={arXiv preprint arXiv:1906.04423}, + year={2019} +} +``` diff --git a/configs/nas_fcos/metafile.yml b/configs/nas_fcos/metafile.yml new file mode 100644 index 0000000..1ea28cf --- /dev/null +++ b/configs/nas_fcos/metafile.yml @@ -0,0 +1,44 @@ +Collections: + - Name: NAS-FCOS + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 4x V100 GPUs + Architecture: + - FPN + - NAS-FCOS + - ResNet + Paper: + URL: https://arxiv.org/abs/1906.04423 + Title: 'NAS-FCOS: Fast Neural Architecture Search for Object Detection' + README: configs/nas_fcos/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/detectors/nasfcos.py#L6 + Version: v2.1.0 + +Models: + - Name: nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco + In Collection: NAS-FCOS + Config: configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco_20200520-1bdba3ce.pth + + - Name: nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco + In Collection: NAS-FCOS + Config: configs/nas_fcos/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/nas_fcos/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco_20200521-7fdcbce0.pth diff --git a/configs/nas_fcos/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco.py b/configs/nas_fcos/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco.py new file mode 100644 index 0000000..a455c92 --- /dev/null +++ b/configs/nas_fcos/nas_fcos_fcoshead_r50_caffe_fpn_gn-head_4x4_1x_coco.py @@ -0,0 +1,100 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + type='NASFCOS', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False, eps=0), + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + neck=dict( + type='NASFCOS_FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs=True, + num_outs=5, + norm_cfg=dict(type='BN'), + conv_cfg=dict(type='DCNv2', deform_groups=2)), + bbox_head=dict( + type='FCOSHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + strides=[8, 16, 32, 64, 128], + norm_cfg=dict(type='GN', num_groups=32), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='IoULoss', loss_weight=1.0), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) + +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + samples_per_gpu=4, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) + +optimizer = dict( + lr=0.01, paramwise_cfg=dict(bias_lr_mult=2., bias_decay_mult=0.)) diff --git a/configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py b/configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py new file mode 100644 index 0000000..b779492 --- /dev/null +++ b/configs/nas_fcos/nas_fcos_nashead_r50_caffe_fpn_gn-head_4x4_1x_coco.py @@ -0,0 +1,99 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + type='NASFCOS', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False, eps=0), + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + neck=dict( + type='NASFCOS_FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs=True, + num_outs=5, + norm_cfg=dict(type='BN'), + conv_cfg=dict(type='DCNv2', deform_groups=2)), + bbox_head=dict( + type='NASFCOSHead', + num_classes=80, + in_channels=256, + feat_channels=256, + strides=[8, 16, 32, 64, 128], + norm_cfg=dict(type='GN', num_groups=32), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='IoULoss', loss_weight=1.0), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) + +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) + +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + samples_per_gpu=4, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) + +optimizer = dict( + lr=0.01, paramwise_cfg=dict(bias_lr_mult=2., bias_decay_mult=0.)) diff --git a/configs/nas_fpn/README.md b/configs/nas_fpn/README.md new file mode 100644 index 0000000..c5acf40 --- /dev/null +++ b/configs/nas_fpn/README.md @@ -0,0 +1,36 @@ +# NAS-FPN + +> [NAS-FPN: Learning Scalable Feature Pyramid Architecture for Object Detection](https://arxiv.org/abs/1904.07392) + + + +## Abstract + +Current state-of-the-art convolutional architectures for object detection are manually designed. Here we aim to learn a better architecture of feature pyramid network for object detection. We adopt Neural Architecture Search and discover a new feature pyramid architecture in a novel scalable search space covering all cross-scale connections. The discovered architecture, named NAS-FPN, consists of a combination of top-down and bottom-up connections to fuse features across scales. NAS-FPN, combined with various backbone models in the RetinaNet framework, achieves better accuracy and latency tradeoff compared to state-of-the-art object detection models. NAS-FPN improves mobile detection accuracy by 2 AP compared to state-of-the-art SSDLite with MobileNetV2 model in \[32\] and achieves 48.3 AP which surpasses Mask R-CNN \[10\] detection accuracy with less computation time. + +
+ +
+ +## Results and Models + +We benchmark the new training schedule (crop training, large batch, unfrozen BN, 50 epochs) introduced in NAS-FPN. RetinaNet is used in the paper. + +| Backbone | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :---------: | :-----: | :------: | :------------: | :----: | :----------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | 50e | 12.9 | 22.9 | 37.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/nas_fpn/retinanet_r50_fpn_crop640_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/nas_fpn/retinanet_r50_fpn_crop640_50e_coco/retinanet_r50_fpn_crop640_50e_coco-9b953d76.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/nas_fpn/retinanet_r50_fpn_crop640_50e_coco/retinanet_r50_fpn_crop640_50e_coco_20200529_095329.log.json) | +| R-50-NASFPN | 50e | 13.2 | 23.0 | 40.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco/retinanet_r50_nasfpn_crop640_50e_coco-0ad1f644.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco/retinanet_r50_nasfpn_crop640_50e_coco_20200528_230008.log.json) | + +**Note**: We find that it is unstable to train NAS-FPN and there is a small chance that results can be 3% mAP lower. + +## Citation + +```latex +@inproceedings{ghiasi2019fpn, + title={Nas-fpn: Learning scalable feature pyramid architecture for object detection}, + author={Ghiasi, Golnaz and Lin, Tsung-Yi and Le, Quoc V}, + booktitle={Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition}, + pages={7036--7045}, + year={2019} +} +``` diff --git a/configs/nas_fpn/metafile.yml b/configs/nas_fpn/metafile.yml new file mode 100644 index 0000000..ab8d649 --- /dev/null +++ b/configs/nas_fpn/metafile.yml @@ -0,0 +1,59 @@ +Collections: + - Name: NAS-FPN + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - NAS-FPN + - ResNet + Paper: + URL: https://arxiv.org/abs/1904.07392 + Title: 'NAS-FPN: Learning Scalable Feature Pyramid Architecture for Object Detection' + README: configs/nas_fpn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/necks/nas_fpn.py#L67 + Version: v2.0.0 + +Models: + - Name: retinanet_r50_fpn_crop640_50e_coco + In Collection: NAS-FPN + Config: configs/nas_fpn/retinanet_r50_fpn_crop640_50e_coco.py + Metadata: + Training Memory (GB): 12.9 + inference time (ms/im): + - value: 43.67 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/nas_fpn/retinanet_r50_fpn_crop640_50e_coco/retinanet_r50_fpn_crop640_50e_coco-9b953d76.pth + + - Name: retinanet_r50_nasfpn_crop640_50e_coco + In Collection: NAS-FPN + Config: configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py + Metadata: + Training Memory (GB): 13.2 + inference time (ms/im): + - value: 43.48 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 50 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco/retinanet_r50_nasfpn_crop640_50e_coco-0ad1f644.pth diff --git a/configs/nas_fpn/retinanet_r50_fpn_crop640_50e_coco.py b/configs/nas_fpn/retinanet_r50_fpn_crop640_50e_coco.py new file mode 100644 index 0000000..ae7981f --- /dev/null +++ b/configs/nas_fpn/retinanet_r50_fpn_crop640_50e_coco.py @@ -0,0 +1,85 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', '../_base_/default_runtime.py' +] +# cudnn_benchmark = True +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + relu_before_extra_convs=True, + no_norm_on_lateral=True, + norm_cfg=norm_cfg), + bbox_head=dict(type='RetinaSepBNHead', num_ins=5, norm_cfg=norm_cfg), + # training and testing settings + train_cfg=dict(assigner=dict(neg_iou_thr=0.5))) +# dataset settings +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=(640, 640), + ratio_range=(0.8, 1.2), + keep_ratio=True), + dict(type='RandomCrop', crop_size=(640, 640)), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=(640, 640)), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(640, 640), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=64), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, + workers_per_gpu=4, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict( + type='SGD', + lr=0.08, + momentum=0.9, + weight_decay=0.0001, + paramwise_cfg=dict(norm_decay_mult=0, bypass_duplicate=True)) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=0.1, + step=[30, 40]) +# runtime settings +runner = dict(type='EpochBasedRunner', max_epochs=50) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py b/configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py new file mode 100644 index 0000000..e3d4e8a --- /dev/null +++ b/configs/nas_fpn/retinanet_r50_nasfpn_crop640_50e_coco.py @@ -0,0 +1,84 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', '../_base_/default_runtime.py' +] +# cudnn_benchmark = True +# model settings +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + type='RetinaNet', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict(type='NASFPN', stack_times=7, norm_cfg=norm_cfg), + bbox_head=dict(type='RetinaSepBNHead', num_ins=5, norm_cfg=norm_cfg), + # training and testing settings + train_cfg=dict(assigner=dict(neg_iou_thr=0.5))) +# dataset settings +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=(640, 640), + ratio_range=(0.8, 1.2), + keep_ratio=True), + dict(type='RandomCrop', crop_size=(640, 640)), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=(640, 640)), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(640, 640), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=128), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, + workers_per_gpu=4, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict( + type='SGD', + lr=0.08, + momentum=0.9, + weight_decay=0.0001, + paramwise_cfg=dict(norm_decay_mult=0, bypass_duplicate=True)) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=0.1, + step=[30, 40]) +# runtime settings +runner = dict(type='EpochBasedRunner', max_epochs=50) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/objects365/README.md b/configs/objects365/README.md new file mode 100644 index 0000000..b685f9b --- /dev/null +++ b/configs/objects365/README.md @@ -0,0 +1,102 @@ +# Objects365 Dataset + +> [Objects365 Dataset](https://openaccess.thecvf.com/content_ICCV_2019/papers/Shao_Objects365_A_Large-Scale_High-Quality_Dataset_for_Object_Detection_ICCV_2019_paper.pdf) + + + +## Abstract + + + +#### Objects365 Dataset V1 + +[Objects365 Dataset V1](http://www.objects365.org/overview.html) is a brand new dataset, +designed to spur object detection research with a focus on diverse objects in the Wild. +It has 365 object categories over 600K training images. More than 10 million, high-quality bounding boxes are manually labeled through a three-step, carefully designed annotation pipeline. It is the largest object detection dataset (with full annotation) so far and establishes a more challenging benchmark for the community. Objects365 can serve as a better feature learning dataset for localization-sensitive tasks like object detection +and semantic segmentation. + + + +
+ +
+ +#### Objects365 Dataset V2 + +[Objects365 Dataset V2](http://www.objects365.org/overview.html) is based on the V1 release of the Objects365 dataset. +Objects 365 annotated 365 object classes on more than 1800k images, with more than 29 million bounding boxes in the training set, surpassing PASCAL VOC, ImageNet, and COCO datasets. +Objects 365 includes 11 categories of people, clothing, living room, bathroom, kitchen, office/medical, electrical appliances, transportation, food, animals, sports/musical instruments, and each category has dozens of subcategories. + +## Citation + +``` +@inproceedings{shao2019objects365, + title={Objects365: A large-scale, high-quality dataset for object detection}, + author={Shao, Shuai and Li, Zeming and Zhang, Tianyuan and Peng, Chao and Yu, Gang and Zhang, Xiangyu and Li, Jing and Sun, Jian}, + booktitle={Proceedings of the IEEE/CVF international conference on computer vision}, + pages={8430--8439}, + year={2019} +} +``` + +## Prepare Dataset + +1. You need to download and extract Objects365 dataset. Users can download Objects365 V2 by using `tools/misc/download_dataset.py`. + + **Usage** + + ```shell + python tools/misc/download_dataset.py --dataset-name objects365v2 \ + --save-dir ${SAVING PATH} \ + --unzip \ + --delete # Optional, delete the download zip file + ``` + + **Note:** There is no download link for Objects365 V1 right now. If you would like to download Objects365-V1, please visit [official website](http://www.objects365.org/) to concat the author. + +2. The directory should be like this: + + ```none + mmdetection + ├── mmdet + ├── tools + ├── configs + ├── data + │ ├── Objects365 + │ │ ├── Obj365_v1 + │ │ │ ├── annotations + │ │ │ │ ├── objects365_train.json + │ │ │ │ ├── objects365_val.json + │ │ │ ├── train # training images + │ │ │ ├── val # validation images + │ │ ├── Obj365_v2 + │ │ │ ├── annotations + │ │ │ │ ├── zhiyuan_objv2_train.json + │ │ │ │ ├── zhiyuan_objv2_val.json + │ │ │ ├── train # training images + │ │ │ │ ├── patch0 + │ │ │ │ ├── patch1 + │ │ │ │ ├── ... + │ │ │ ├── val # validation images + │ │ │ │ ├── patch0 + │ │ │ │ ├── patch1 + │ │ │ │ ├── ... + ``` + +## Results and Models + +### Objects365 V1 + +| Architecture | Backbone | Style | Lr schd | Mem (GB) | box AP | Config | Download | +| :----------: | :------: | :-----: | :-----: | :------: | :----: | :-----------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Faster R-CNN | R-50 | pytorch | 1x | - | 19.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/objects365/faster_rcnn_r50_fpn_16x4_1x_obj365v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/objects365/faster_rcnn_r50_fpn_16x4_1x_obj365v1/faster_rcnn_r50_fpn_16x4_1x_obj365v1_20221219_181226-9ff10f95.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/objects365/faster_rcnn_r50_fpn_16x4_1x_obj365v1/faster_rcnn_r50_fpn_16x4_1x_obj365v1_20221219_181226.log.json) | +| Faster R-CNN | R-50 | pytorch | 1350K | - | 22.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/objects365/faster_rcnn_r50_fpn_syncbn_1350k_obj365v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/objects365/faster_rcnn_r50_fpn_syncbn_1350k_obj365v1/faster_rcnn_r50_fpn_syncbn_1350k_obj365v1_20220510_142457-337d8965.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/objects365/faster_rcnn_r50_fpn_syncbn_1350k_obj365v1/faster_rcnn_r50_fpn_syncbn_1350k_obj365v1_20220510_142457.log.json) | +| Retinanet | R-50 | pytorch | 1x | - | 14.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/objects365/retinanet_r50_fpn_1x_obj365v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/objects365/retinanet_r50_fpn_1x_obj365v1/retinanet_r50_fpn_1x_obj365v1_20221219_181859-ba3e3dd5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/objects365/retinanet_r50_fpn_1x_obj365v1/retinanet_r50_fpn_1x_obj365v1_20221219_181859.log.json) | +| Retinanet | R-50 | pytorch | 1350K | - | 18.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/objects365/retinanet_r50_fpn_syncbn_1350k_obj365v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/objects365/retinanet_r50_fpn_syncbn_1350k_obj365v1/retinanet_r50_fpn_syncbn_1350k_obj365v1_20220513_111237-7517c576.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/objects365/retinanet_r50_fpn_syncbn_1350k_obj365v1/retinanet_r50_fpn_syncbn_1350k_obj365v1_20220513_111237.log.json) | + +### Objects365 V2 + +| Architecture | Backbone | Style | Lr schd | Mem (GB) | box AP | Config | Download | +| :----------: | :------: | :-----: | :-----: | :------: | :----: | :------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Faster R-CNN | R-50 | pytorch | 1x | - | 19.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/objects365/faster_rcnn_r50_fpn_16x4_1x_obj365v2.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/objects365/faster_rcnn_r50_fpn_16x4_1x_obj365v2/faster_rcnn_r50_fpn_16x4_1x_obj365v2_20221220_175040-5910b015.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/objects365/faster_rcnn_r50_fpn_16x4_1x_obj365v2/faster_rcnn_r50_fpn_16x4_1x_obj365v2_20221220_175040.log.json) | +| Retinanet | R-50 | pytorch | 1x | - | 16.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/objects365/retinanet_r50_fpn_1x_obj365v2.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/objects365/retinanet_r50_fpn_1x_obj365v2/retinanet_r50_fpn_1x_obj365v2_20221223_122105-d9b191f1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/objects365/retinanet_r50_fpn_1x_obj365v2/retinanet_r50_fpn_1x_obj365v2_20221223_122105.log.json) | diff --git a/configs/objects365/faster_rcnn_r50_fpn_16x4_1x_obj365v1.py b/configs/objects365/faster_rcnn_r50_fpn_16x4_1x_obj365v1.py new file mode 100644 index 0000000..36bfa27 --- /dev/null +++ b/configs/objects365/faster_rcnn_r50_fpn_16x4_1x_obj365v1.py @@ -0,0 +1,25 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/objects365v1_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict(roi_head=dict(bbox_head=dict(num_classes=365))) + +data = dict(samples_per_gpu=4) + +# Using 32 GPUS while training +optimizer = dict(type='SGD', lr=0.08, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=1.0 / 1000, + step=[8, 11]) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (16 GPUs) x (4 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/objects365/faster_rcnn_r50_fpn_16x4_1x_obj365v2.py b/configs/objects365/faster_rcnn_r50_fpn_16x4_1x_obj365v2.py new file mode 100644 index 0000000..13bbeb8 --- /dev/null +++ b/configs/objects365/faster_rcnn_r50_fpn_16x4_1x_obj365v2.py @@ -0,0 +1,25 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/objects365v2_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict(roi_head=dict(bbox_head=dict(num_classes=365))) + +data = dict(samples_per_gpu=4) + +# Using 32 GPUS while training +optimizer = dict(type='SGD', lr=0.08, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=1.0 / 1000, + step=[8, 11]) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (16 GPUs) x (4 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/objects365/faster_rcnn_r50_fpn_syncbn_1350k_obj365v1.py b/configs/objects365/faster_rcnn_r50_fpn_syncbn_1350k_obj365v1.py new file mode 100644 index 0000000..4e6f341 --- /dev/null +++ b/configs/objects365/faster_rcnn_r50_fpn_syncbn_1350k_obj365v1.py @@ -0,0 +1,31 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/objects365v1_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + backbone=dict(norm_cfg=norm_cfg), + roi_head=dict(bbox_head=dict(num_classes=365))) + +# Using 8 GPUS while training +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) + +runner = dict( + _delete_=True, type='IterBasedRunner', max_iters=1350000) # 36 epochs +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=1.0 / 1000, + step=[900000, 1200000]) + +checkpoint_config = dict(interval=150000) +evaluation = dict(interval=150000, metric='bbox') + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) diff --git a/configs/objects365/metafile.yml b/configs/objects365/metafile.yml new file mode 100644 index 0000000..5e71ad7 --- /dev/null +++ b/configs/objects365/metafile.yml @@ -0,0 +1,101 @@ +- Name: retinanet_r50_fpn_1x_obj365v1 + In Collection: RetinaNet + Config: configs/objects365/retinanet_r50_fpn_1x_obj365v1.py + Metadata: + Training Memory (GB): 7.4 + Epochs: 12 + Training Data: Objects365 v1 + Training Techniques: + - SGD with Momentum + - Weight Decay + Results: + - Task: Object Detection + Dataset: Objects365 v1 + Metrics: + box AP: 14.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/objects365/retinanet_r50_fpn_1x_obj365v1/retinanet_r50_fpn_1x_obj365v1_20221219_181859-ba3e3dd5.pth + +- Name: retinanet_r50_fpn_syncbn_1350k_obj365v1 + In Collection: RetinaNet + Config: configs/objects365/retinanet_r50_fpn_syncbn_1350k_obj365v1.py + Metadata: + Training Memory (GB): 7.6 + Iterations: 1350000 + Training Data: Objects365 v1 + Training Techniques: + - SGD with Momentum + - Weight Decay + Results: + - Task: Object Detection + Dataset: Objects365 v1 + Metrics: + box AP: 18.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/objects365/retinanet_r50_fpn_syncbn_1350k_obj365v1/retinanet_r50_fpn_syncbn_1350k_obj365v1_20220513_111237-7517c576.pth + +- Name: retinanet_r50_fpn_1x_obj365v2 + In Collection: RetinaNet + Config: configs/objects365/retinanet_r50_fpn_1x_obj365v2.py + Metadata: + Training Memory (GB): 7.2 + Epochs: 12 + Training Data: Objects365 v2 + Training Techniques: + - SGD with Momentum + - Weight Decay + Results: + - Task: Object Detection + Dataset: Objects365 v2 + Metrics: + box AP: 16.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/objects365/retinanet_r50_fpn_1x_obj365v2/retinanet_r50_fpn_1x_obj365v2_20221223_122105-d9b191f1.pth + +- Name: faster_rcnn_r50_fpn_16x4_1x_obj365v1 + In Collection: Faster R-CNN + Config: configs/objects365/faster_rcnn_r50_fpn_16x4_1x_obj365v1.py + Metadata: + Training Memory (GB): 11.4 + Epochs: 12 + Training Data: Objects365 v1 + Training Techniques: + - SGD with Momentum + - Weight Decay + Results: + - Task: Object Detection + Dataset: Objects365 v1 + Metrics: + box AP: 19.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/objects365/faster_rcnn_r50_fpn_16x4_1x_obj365v1/faster_rcnn_r50_fpn_16x4_1x_obj365v1_20221219_181226-9ff10f95.pth + +- Name: faster_rcnn_r50_fpn_syncbn_1350k_obj365v1 + In Collection: Faster R-CNN + Config: configs/objects365/faster_rcnn_r50_fpn_syncbn_1350k_obj365v1.py + Metadata: + Training Memory (GB): 8.6 + Iterations: 1350000 + Training Data: Objects365 v1 + Training Techniques: + - SGD with Momentum + - Weight Decay + Results: + - Task: Object Detection + Dataset: Objects365 v1 + Metrics: + box AP: 22.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/objects365/faster_rcnn_r50_fpn_syncbn_1350k_obj365v1/faster_rcnn_r50_fpn_syncbn_1350k_obj365v1_20220510_142457-337d8965.pth + +- Name: faster_rcnn_r50_fpn_16x4_1x_obj365v2 + In Collection: Faster R-CNN + Config: configs/objects365/faster_rcnn_r50_fpn_16x4_1x_obj365v2.py + Metadata: + Training Memory (GB): 10.8 + Epochs: 12 + Training Data: Objects365 v1 + Training Techniques: + - SGD with Momentum + - Weight Decay + Results: + - Task: Object Detection + Dataset: Objects365 v2 + Metrics: + box AP: 19.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/objects365/faster_rcnn_r50_fpn_16x4_1x_obj365v2/faster_rcnn_r50_fpn_16x4_1x_obj365v2_20221220_175040-5910b015.pth diff --git a/configs/objects365/retinanet_r50_fpn_1x_obj365v1.py b/configs/objects365/retinanet_r50_fpn_1x_obj365v1.py new file mode 100644 index 0000000..080c02b --- /dev/null +++ b/configs/objects365/retinanet_r50_fpn_1x_obj365v1.py @@ -0,0 +1,23 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/objects365v1_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict(bbox_head=dict(num_classes=365)) + +# Using 8 GPUS while training +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=10000, + warmup_ratio=1.0 / 1000, + step=[8, 11]) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) diff --git a/configs/objects365/retinanet_r50_fpn_1x_obj365v2.py b/configs/objects365/retinanet_r50_fpn_1x_obj365v2.py new file mode 100644 index 0000000..9f0db00 --- /dev/null +++ b/configs/objects365/retinanet_r50_fpn_1x_obj365v2.py @@ -0,0 +1,23 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/objects365v2_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict(bbox_head=dict(num_classes=365)) + +# Using 8 GPUS while training +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=10000, + warmup_ratio=1.0 / 1000, + step=[8, 11]) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) diff --git a/configs/objects365/retinanet_r50_fpn_syncbn_1350k_obj365v1.py b/configs/objects365/retinanet_r50_fpn_syncbn_1350k_obj365v1.py new file mode 100644 index 0000000..6dd9277 --- /dev/null +++ b/configs/objects365/retinanet_r50_fpn_syncbn_1350k_obj365v1.py @@ -0,0 +1,29 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/objects365v1_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict(backbone=dict(norm_cfg=norm_cfg), bbox_head=dict(num_classes=365)) + +# Using 8 GPUS while training +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) + +runner = dict( + _delete_=True, type='IterBasedRunner', max_iters=1350000) # 36 epochs +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=10000, + warmup_ratio=1.0 / 1000, + step=[900000, 1200000]) + +checkpoint_config = dict(interval=150000) +evaluation = dict(interval=150000, metric='bbox') + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) diff --git a/configs/openimages/README.md b/configs/openimages/README.md new file mode 100644 index 0000000..e5c1c27 --- /dev/null +++ b/configs/openimages/README.md @@ -0,0 +1,148 @@ +# Open Images Dataset + +> [Open Images Dataset](https://arxiv.org/abs/1811.00982) + + + +## Abstract + + + +#### Open Images v6 + +[Open Images](https://storage.googleapis.com/openimages/web/index.html) is a dataset of ~9M images annotated with image-level labels, +object bounding boxes, object segmentation masks, visual relationships, +and localized narratives: + +- It contains a total of 16M bounding boxes for 600 object classes on + 1.9M images, making it the largest existing dataset with object location + annotations. The boxes have been largely manually drawn by professional + annotators to ensure accuracy and consistency. The images are very diverse + and often contain complex scenes with several objects (8.3 per image on + average). + +- Open Images also offers visual relationship annotations, indicating pairs + of objects in particular relations (e.g. "woman playing guitar", "beer on + table"), object properties (e.g. "table is wooden"), and human actions (e.g. + "woman is jumping"). In total it has 3.3M annotations from 1,466 distinct + relationship triplets. + +- In V5 we added segmentation masks for 2.8M object instances in 350 classes. + Segmentation masks mark the outline of objects, which characterizes their + spatial extent to a much higher level of detail. + +- In V6 we added 675k localized narratives: multimodal descriptions of images + consisting of synchronized voice, text, and mouse traces over the objects being + described. (Note we originally launched localized narratives only on train in V6, + but since July 2020 we also have validation and test covered.) + +- Finally, the dataset is annotated with 59.9M image-level labels spanning 19,957 + classes. + +We believe that having a single dataset with unified annotations for image +classification, object detection, visual relationship detection, instance +segmentation, and multimodal image descriptions will enable to study these +tasks jointly and stimulate progress towards genuine scene understanding. + + + +
+ +
+ +#### Open Images Challenge 2019 + +[Open Images Challenges 2019](https://storage.googleapis.com/openimages/web/challenge2019.html) is based on the V5 release of the Open +Images dataset. The images of the dataset are very varied and +often contain complex scenes with several objects (explore the dataset). + +## Citation + +``` +@article{OpenImages, + author = {Alina Kuznetsova and Hassan Rom and Neil Alldrin and Jasper Uijlings and Ivan Krasin and Jordi Pont-Tuset and Shahab Kamali and Stefan Popov and Matteo Malloci and Alexander Kolesnikov and Tom Duerig and Vittorio Ferrari}, + title = {The Open Images Dataset V4: Unified image classification, object detection, and visual relationship detection at scale}, + year = {2020}, + journal = {IJCV} +} +``` + +## Prepare Dataset + +1. You need to download and extract Open Images dataset. + +2. The Open Images dataset does not have image metas (width and height of the image), + which will be used during evaluation. We suggest to get test image metas before + training/testing by using `tools/misc/get_image_metas.py`. + + **Usage** + + ```shell + python tools/misc/get_image_metas.py ${CONFIG} \ + --out ${OUTPUT FILE NAME} + ``` + +3. The directory should be like this: + + ```none + mmdetection + ├── mmdet + ├── tools + ├── configs + ├── data + │ ├── OpenImages + │ │ ├── annotations + │ │ │ ├── bbox_labels_600_hierarchy.json + │ │ │ ├── class-descriptions-boxable.csv + │ │ │ ├── oidv6-train-annotations-bbox.scv + │ │ │ ├── validation-annotations-bbox.csv + │ │ │ ├── validation-annotations-human-imagelabels-boxable.csv + │ │ │ ├── validation-image-metas.pkl # get from script + │ │ ├── challenge2019 + │ │ │ ├── challenge-2019-train-detection-bbox.txt + │ │ │ ├── challenge-2019-validation-detection-bbox.txt + │ │ │ ├── class_label_tree.np + │ │ │ ├── class_sample_train.pkl + │ │ │ ├── challenge-2019-validation-detection-human-imagelabels.csv # download from official website + │ │ │ ├── challenge-2019-validation-metas.pkl # get from script + │ │ ├── OpenImages + │ │ │ ├── train # training images + │ │ │ ├── test # testing images + │ │ │ ├── validation # validation images + ``` + +**Note**: + +1. The training and validation images of Open Images Challenge dataset are based on + Open Images v6, but the test images are different. +2. The Open Images Challenges annotations are obtained from [TSD](https://github.com/Sense-X/TSD). + You can also download the annotations from [official website](https://storage.googleapis.com/openimages/web/challenge2019_downloads.html), + and set data.train.type=OpenImagesDataset, data.val.type=OpenImagesDataset, and data.test.type=OpenImagesDataset in the config +3. If users do not want to use `validation-annotations-human-imagelabels-boxable.csv` and `challenge-2019-validation-detection-human-imagelabels.csv` + users can set `data.val.load_image_level_labels=False` and `data.test.load_image_level_labels=False` in the config. + Please note that loading image-levels label is the default of Open Images evaluation metric. + More details please refer to the [official website](https://storage.googleapis.com/openimages/web/evaluation.html) + +## Results and Models + +| Architecture | Backbone | Style | Lr schd | Sampler | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :---------------------------: | :------: | :-----: | :-----: | :-----------------: | :------: | :------------: | :----: | :----------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Faster R-CNN | R-50 | pytorch | 1x | Group Sampler | 7.7 | - | 51.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_20211130_231159-e87ab7ce.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_20211130_231159.log.json) | +| Faster R-CNN | R-50 | pytorch | 1x | Class Aware Sampler | 7.7 | - | 60.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_20220306_202424-98c630e5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_20220306_202424.log.json) | +| Faster R-CNN (Challenge 2019) | R-50 | pytorch | 1x | Group Sampler | 7.7 | - | 54.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge_20220114_045100-0e79e5df.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge_20220114_045100.log.json) | +| Faster R-CNN (Challenge 2019) | R-50 | pytorch | 1x | Class Aware Sampler | 7.1 | - | 65.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge_20220221_192021-34c402d9.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge_20220221_192021.log.json) | +| Retinanet | R-50 | pytorch | 1x | Group Sampler | 6.6 | - | 61.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/openimages/retinanet_r50_fpn_32x2_1x_openimages.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/openimages/retinanet_r50_fpn_32x2_1x_openimages/retinanet_r50_fpn_32x2_1x_openimages_20211223_071954-d2ae5462.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/openimages/retinanet_r50_fpn_32x2_1x_openimages/retinanet_r50_fpn_32x2_1x_openimages_20211223_071954.log.json) | +| SSD | VGG16 | pytorch | 36e | Group Sampler | 10.8 | - | 35.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/openimages/ssd300_32x8_36e_openimages.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/openimages/ssd300_32x8_36e_openimages/ssd300_32x8_36e_openimages_20211224_000232-dce93846.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/openimages/ssd300_32x8_36e_openimages/ssd300_32x8_36e_openimages_20211224_000232.log.json) | + +**Notes:** + +- 'cas' is short for 'Class Aware Sampler' + +### Results of consider image level labels + +| Architecture | Sampler | Consider Image Level Labels | box AP | +| :-------------------------------: | :-----------------: | :-------------------------: | :----: | +| Faster R-CNN r50 (Challenge 2019) | Group Sampler | w/o | 62.19 | +| Faster R-CNN r50 (Challenge 2019) | Group Sampler | w/ | 54.87 | +| Faster R-CNN r50 (Challenge 2019) | Class Aware Sampler | w/o | 71.77 | +| Faster R-CNN r50 (Challenge 2019) | Class Aware Sampler | w/ | 64.98 | diff --git a/configs/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages.py b/configs/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages.py new file mode 100644 index 0000000..3dfc341 --- /dev/null +++ b/configs/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages.py @@ -0,0 +1,23 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/openimages_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict(roi_head=dict(bbox_head=dict(num_classes=601))) + +# Using 32 GPUS while training +optimizer = dict(type='SGD', lr=0.08, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=26000, + warmup_ratio=1.0 / 64, + step=[8, 11]) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (32 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge.py b/configs/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge.py new file mode 100644 index 0000000..c8900ad --- /dev/null +++ b/configs/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge.py @@ -0,0 +1,47 @@ +_base_ = ['faster_rcnn_r50_fpn_32x2_1x_openimages.py'] + +model = dict( + roi_head=dict(bbox_head=dict(num_classes=500)), + test_cfg=dict(rcnn=dict(score_thr=0.01))) + +# dataset settings +dataset_type = 'OpenImagesChallengeDataset' +data_root = 'data/OpenImages/' +data = dict( + train=dict( + type=dataset_type, + ann_file=data_root + + 'challenge2019/challenge-2019-train-detection-bbox.txt', + img_prefix=data_root + 'OpenImages/', + label_file=data_root + 'challenge2019/cls-label-description.csv', + hierarchy_file=data_root + 'challenge2019/class_label_tree.np'), + val=dict( + type=dataset_type, + ann_file=data_root + + 'challenge2019/challenge-2019-validation-detection-bbox.txt', + img_prefix=data_root + 'OpenImages/', + label_file=data_root + 'challenge2019/cls-label-description.csv', + hierarchy_file=data_root + 'challenge2019/class_label_tree.np', + meta_file=data_root + + 'challenge2019/challenge-2019-validation-metas.pkl', + image_level_ann_file=data_root + + 'challenge2019/challenge-2019-validation-detection-' + 'human-imagelabels.csv'), + test=dict( + type=dataset_type, + ann_file=data_root + + 'challenge2019/challenge-2019-validation-detection-bbox.txt', + img_prefix=data_root + 'OpenImages/', + label_file=data_root + 'challenge2019/cls-label-description.csv', + hierarchy_file=data_root + 'challenge2019/class_label_tree.np', + meta_file=data_root + + 'challenge2019/challenge-2019-validation-metas.pkl', + image_level_ann_file=data_root + + 'challenge2019/challenge-2019-validation-detection-' + 'human-imagelabels.csv')) +evaluation = dict(interval=1, metric='mAP') + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (32 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages.py b/configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages.py new file mode 100644 index 0000000..88d029d --- /dev/null +++ b/configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages.py @@ -0,0 +1,5 @@ +_base_ = ['faster_rcnn_r50_fpn_32x2_1x_openimages.py'] + +# Use ClassAwareSampler +data = dict( + train_dataloader=dict(class_aware_sampler=dict(num_sample_class=1))) diff --git a/configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge.py b/configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge.py new file mode 100644 index 0000000..26bd64e --- /dev/null +++ b/configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge.py @@ -0,0 +1,5 @@ +_base_ = ['faster_rcnn_r50_fpn_32x2_1x_openimages_challenge.py'] + +# Use ClassAwareSampler +data = dict( + train_dataloader=dict(class_aware_sampler=dict(num_sample_class=1))) diff --git a/configs/openimages/metafile.yml b/configs/openimages/metafile.yml new file mode 100644 index 0000000..d9f924e --- /dev/null +++ b/configs/openimages/metafile.yml @@ -0,0 +1,102 @@ +Models: + - Name: faster_rcnn_r50_fpn_32x2_1x_openimages + In Collection: Faster R-CNN + Config: configs/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages.py + Metadata: + Training Memory (GB): 7.7 + Epochs: 12 + Training Data: Open Images v6 + Training Techniques: + - SGD with Momentum + - Weight Decay + Results: + - Task: Object Detection + Dataset: Open Images v6 + Metrics: + box AP: 51.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_20211130_231159-e87ab7ce.pth + + - Name: retinanet_r50_fpn_32x2_1x_openimages + In Collection: RetinaNet + Config: configs/openimages/retinanet_r50_fpn_32x2_1x_openimages.py + Metadata: + Training Memory (GB): 6.6 + Epochs: 12 + Training Data: Open Images v6 + Training Techniques: + - SGD with Momentum + - Weight Decay + Results: + - Task: Object Detection + Dataset: Open Images v6 + Metrics: + box AP: 61.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/openimages/retinanet_r50_fpn_32x2_1x_openimages/retinanet_r50_fpn_32x2_1x_openimages_20211223_071954-d2ae5462.pth + + - Name: ssd300_32x8_36e_openimages + In Collection: SSD + Config: configs/openimages/ssd300_32x8_36e_openimages.py + Metadata: + Training Memory (GB): 10.8 + Epochs: 36 + Training Data: Open Images v6 + Training Techniques: + - SGD with Momentum + - Weight Decay + Results: + - Task: Object Detection + Dataset: Open Images v6 + Metrics: + box AP: 35.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/openimages/ssd300_32x8_36e_openimages/ssd300_32x8_36e_openimages_20211224_000232-dce93846.pth + + - Name: faster_rcnn_r50_fpn_32x2_1x_openimages_challenge + In Collection: Faster R-CNN + Config: configs/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge.py + Metadata: + Training Memory (GB): 7.7 + Epochs: 12 + Training Data: Open Images Challenge 2019 + Training Techniques: + - SGD with Momentum + - Weight Decay + Results: + - Task: Object Detection + Dataset: Open Images Challenge 2019 + Metrics: + box AP: 54.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge/faster_rcnn_r50_fpn_32x2_1x_openimages_challenge_20220114_045100-0e79e5df.pth + + - Name: faster_rcnn_r50_fpn_32x2_cas_1x_openimages + In Collection: Faster R-CNN + Config: configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages.py + Metadata: + Training Memory (GB): 7.7 + Epochs: 12 + Training Data: Open Images Challenge 2019 + Training Techniques: + - SGD with Momentum + - Weight Decay + Results: + - Task: Object Detection + Dataset: Open Images Challenge 2019 + Metrics: + box AP: 60.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_20220306_202424-98c630e5.pth + + - Name: faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge + In Collection: Faster R-CNN + Config: configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge.py + Metadata: + Training Memory (GB): 7.1 + Epochs: 12 + Training Data: Open Images Challenge 2019 + Training Techniques: + - SGD with Momentum + - Weight Decay + Results: + - Task: Object Detection + Dataset: Open Images Challenge 2019 + Metrics: + box AP: 65.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge/faster_rcnn_r50_fpn_32x2_cas_1x_openimages_challenge_20220221_192021-34c402d9.pth diff --git a/configs/openimages/retinanet_r50_fpn_32x2_1x_openimages.py b/configs/openimages/retinanet_r50_fpn_32x2_1x_openimages.py new file mode 100644 index 0000000..0191aa1 --- /dev/null +++ b/configs/openimages/retinanet_r50_fpn_32x2_1x_openimages.py @@ -0,0 +1,22 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/openimages_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict(bbox_head=dict(num_classes=601)) + +optimizer = dict(type='SGD', lr=0.08, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=26000, + warmup_ratio=1.0 / 64, + step=[8, 11]) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (32 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/openimages/ssd300_32x8_36e_openimages.py b/configs/openimages/ssd300_32x8_36e_openimages.py new file mode 100644 index 0000000..e2565b9 --- /dev/null +++ b/configs/openimages/ssd300_32x8_36e_openimages.py @@ -0,0 +1,83 @@ +_base_ = [ + '../_base_/models/ssd300.py', '../_base_/datasets/openimages_detection.py', + '../_base_/default_runtime.py', '../_base_/schedules/schedule_1x.py' +] +model = dict( + bbox_head=dict( + num_classes=601, + anchor_generator=dict(basesize_ratio_range=(0.2, 0.9)))) +# dataset settings +dataset_type = 'OpenImagesDataset' +data_root = 'data/OpenImages/' +img_norm_cfg = dict(mean=[123.675, 116.28, 103.53], std=[1, 1, 1], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict(type='LoadAnnotations', with_bbox=True, normed_bbox=True), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(300, 300), keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(300, 300), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, # using 32 GPUS while training. + workers_per_gpu=0, # workers_per_gpu > 0 may occur out of memory + train=dict( + _delete_=True, + type='RepeatDataset', + times=3, + dataset=dict( + type=dataset_type, + ann_file=data_root + + 'annotations/oidv6-train-annotations-bbox.csv', + img_prefix=data_root + 'OpenImages/train/', + label_file=data_root + + 'annotations/class-descriptions-boxable.csv', + hierarchy_file=data_root + + 'annotations/bbox_labels_600_hierarchy.json', + pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='SGD', lr=0.04, momentum=0.9, weight_decay=5e-4) +optimizer_config = dict() +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=20000, + warmup_ratio=0.001, + step=[8, 11]) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (32 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=256) diff --git a/configs/paa/README.md b/configs/paa/README.md new file mode 100644 index 0000000..c8861ec --- /dev/null +++ b/configs/paa/README.md @@ -0,0 +1,47 @@ +# PAA + +> [Probabilistic Anchor Assignment with IoU Prediction for Object Detection](https://arxiv.org/abs/2007.08103) + + + +## Abstract + +In object detection, determining which anchors to assign as positive or negative samples, known as anchor assignment, has been revealed as a core procedure that can significantly affect a model's performance. In this paper we propose a novel anchor assignment strategy that adaptively separates anchors into positive and negative samples for a ground truth bounding box according to the model's learning status such that it is able to reason about the separation in a probabilistic manner. To do so we first calculate the scores of anchors conditioned on the model and fit a probability distribution to these scores. The model is then trained with anchors separated into positive and negative samples according to their probabilities. Moreover, we investigate the gap between the training and testing objectives and propose to predict the Intersection-over-Unions of detected boxes as a measure of localization quality to reduce the discrepancy. The combined score of classification and localization qualities serving as a box selection metric in non-maximum suppression well aligns with the proposed anchor assignment strategy and leads significant performance improvements. The proposed methods only add a single convolutional layer to RetinaNet baseline and does not require multiple anchors per location, so are efficient. Experimental results verify the effectiveness of the proposed methods. Especially, our models set new records for single-stage detectors on MS COCO test-dev dataset with various backbones. + +
+ +
+ +## Results and Models + +We provide config files to reproduce the object detection results in the +ECCV 2020 paper for Probabilistic Anchor Assignment with IoU +Prediction for Object Detection. + +| Backbone | Lr schd | Mem (GB) | Score voting | box AP | Config | Download | +| :-------: | :-----: | :------: | :----------: | :----: | :---------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | 12e | 3.7 | True | 40.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/paa/paa_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_1x_coco/paa_r50_fpn_1x_coco_20200821-936edec3.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_1x_coco/paa_r50_fpn_1x_coco_20200821-936edec3.log.json) | +| R-50-FPN | 12e | 3.7 | False | 40.2 | - | | +| R-50-FPN | 18e | 3.7 | True | 41.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/paa/paa_r50_fpn_1.5x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_1.5x_coco/paa_r50_fpn_1.5x_coco_20200823-805d6078.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_1.5x_coco/paa_r50_fpn_1.5x_coco_20200823-805d6078.log.json) | +| R-50-FPN | 18e | 3.7 | False | 41.2 | - | | +| R-50-FPN | 24e | 3.7 | True | 41.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/paa/paa_r50_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_2x_coco/paa_r50_fpn_2x_coco_20200821-c98bfc4e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_2x_coco/paa_r50_fpn_2x_coco_20200821-c98bfc4e.log.json) | +| R-50-FPN | 36e | 3.7 | True | 43.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/paa/paa_r50_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_mstrain_3x_coco/paa_r50_fpn_mstrain_3x_coco_20210121_145722-06a6880b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_mstrain_3x_coco/paa_r50_fpn_mstrain_3x_coco_20210121_145722.log.json) | +| R-101-FPN | 12e | 6.2 | True | 42.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/paa/paa_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r101_fpn_1x_coco/paa_r101_fpn_1x_coco_20200821-0a1825a4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r101_fpn_1x_coco/paa_r101_fpn_1x_coco_20200821-0a1825a4.log.json) | +| R-101-FPN | 12e | 6.2 | False | 42.4 | - | | +| R-101-FPN | 24e | 6.2 | True | 43.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/paa/paa_r101_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r101_fpn_2x_coco/paa_r101_fpn_2x_coco_20200821-6829f96b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r101_fpn_2x_coco/paa_r101_fpn_2x_coco_20200821-6829f96b.log.json) | +| R-101-FPN | 36e | 6.2 | True | 45.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/paa/paa_r101_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r101_fpn_mstrain_3x_coco/paa_r101_fpn_mstrain_3x_coco_20210122_084202-83250d22.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r101_fpn_mstrain_3x_coco/paa_r101_fpn_mstrain_3x_coco_20210122_084202.log.json) | + +**Note**: + +1. We find that the performance is unstable with 1x setting and may fluctuate by about 0.2 mAP. We report the best results. + +## Citation + +```latex +@inproceedings{paa-eccv2020, + title={Probabilistic Anchor Assignment with IoU Prediction for Object Detection}, + author={Kim, Kang and Lee, Hee Seok}, + booktitle = {ECCV}, + year={2020} +} +``` diff --git a/configs/paa/metafile.yml b/configs/paa/metafile.yml new file mode 100644 index 0000000..e08b663 --- /dev/null +++ b/configs/paa/metafile.yml @@ -0,0 +1,104 @@ +Collections: + - Name: PAA + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - Probabilistic Anchor Assignment + - ResNet + Paper: + URL: https://arxiv.org/abs/2007.08103 + Title: 'Probabilistic Anchor Assignment with IoU Prediction for Object Detection' + README: configs/paa/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.4.0/mmdet/models/detectors/paa.py#L6 + Version: v2.4.0 + +Models: + - Name: paa_r50_fpn_1x_coco + In Collection: PAA + Config: configs/paa/paa_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 3.7 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_1x_coco/paa_r50_fpn_1x_coco_20200821-936edec3.pth + + - Name: paa_r50_fpn_1.5x_coco + In Collection: PAA + Config: configs/paa/paa_r50_fpn_1.5x_coco.py + Metadata: + Training Memory (GB): 3.7 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_1.5x_coco/paa_r50_fpn_1.5x_coco_20200823-805d6078.pth + + - Name: paa_r50_fpn_2x_coco + In Collection: PAA + Config: configs/paa/paa_r50_fpn_2x_coco.py + Metadata: + Training Memory (GB): 3.7 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_2x_coco/paa_r50_fpn_2x_coco_20200821-c98bfc4e.pth + + - Name: paa_r50_fpn_mstrain_3x_coco + In Collection: PAA + Config: configs/paa/paa_r50_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 3.7 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r50_fpn_mstrain_3x_coco/paa_r50_fpn_mstrain_3x_coco_20210121_145722-06a6880b.pth + + - Name: paa_r101_fpn_1x_coco + In Collection: PAA + Config: configs/paa/paa_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.2 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r101_fpn_1x_coco/paa_r101_fpn_1x_coco_20200821-0a1825a4.pth + + - Name: paa_r101_fpn_2x_coco + In Collection: PAA + Config: configs/paa/paa_r101_fpn_2x_coco.py + Metadata: + Training Memory (GB): 6.2 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r101_fpn_2x_coco/paa_r101_fpn_2x_coco_20200821-6829f96b.pth + + - Name: paa_r101_fpn_mstrain_3x_coco + In Collection: PAA + Config: configs/paa/paa_r101_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 6.2 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/paa/paa_r101_fpn_mstrain_3x_coco/paa_r101_fpn_mstrain_3x_coco_20210122_084202-83250d22.pth diff --git a/configs/paa/paa_r101_fpn_1x_coco.py b/configs/paa/paa_r101_fpn_1x_coco.py new file mode 100644 index 0000000..94f1c27 --- /dev/null +++ b/configs/paa/paa_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './paa_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/paa/paa_r101_fpn_2x_coco.py b/configs/paa/paa_r101_fpn_2x_coco.py new file mode 100644 index 0000000..641ef76 --- /dev/null +++ b/configs/paa/paa_r101_fpn_2x_coco.py @@ -0,0 +1,3 @@ +_base_ = './paa_r101_fpn_1x_coco.py' +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/paa/paa_r101_fpn_mstrain_3x_coco.py b/configs/paa/paa_r101_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..71858ed --- /dev/null +++ b/configs/paa/paa_r101_fpn_mstrain_3x_coco.py @@ -0,0 +1,6 @@ +_base_ = './paa_r50_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/paa/paa_r50_fpn_1.5x_coco.py b/configs/paa/paa_r50_fpn_1.5x_coco.py new file mode 100644 index 0000000..aabce4a --- /dev/null +++ b/configs/paa/paa_r50_fpn_1.5x_coco.py @@ -0,0 +1,3 @@ +_base_ = './paa_r50_fpn_1x_coco.py' +lr_config = dict(step=[12, 16]) +runner = dict(type='EpochBasedRunner', max_epochs=18) diff --git a/configs/paa/paa_r50_fpn_1x_coco.py b/configs/paa/paa_r50_fpn_1x_coco.py new file mode 100644 index 0000000..4c9c4aa --- /dev/null +++ b/configs/paa/paa_r50_fpn_1x_coco.py @@ -0,0 +1,70 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='PAA', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + bbox_head=dict( + type='PAAHead', + reg_decoded_bbox=True, + score_voting=True, + topk=9, + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=1.3), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.5)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.1, + neg_iou_thr=0.1, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/configs/paa/paa_r50_fpn_2x_coco.py b/configs/paa/paa_r50_fpn_2x_coco.py new file mode 100644 index 0000000..663d2c0 --- /dev/null +++ b/configs/paa/paa_r50_fpn_2x_coco.py @@ -0,0 +1,3 @@ +_base_ = './paa_r50_fpn_1x_coco.py' +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/paa/paa_r50_fpn_mstrain_3x_coco.py b/configs/paa/paa_r50_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..91fa28c --- /dev/null +++ b/configs/paa/paa_r50_fpn_mstrain_3x_coco.py @@ -0,0 +1,20 @@ +_base_ = './paa_r50_fpn_1x_coco.py' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +data = dict(train=dict(pipeline=train_pipeline)) +lr_config = dict(step=[28, 34]) +runner = dict(type='EpochBasedRunner', max_epochs=36) diff --git a/configs/pafpn/README.md b/configs/pafpn/README.md new file mode 100644 index 0000000..ae1e3a3 --- /dev/null +++ b/configs/pafpn/README.md @@ -0,0 +1,34 @@ +# PAFPN + +> [Path Aggregation Network for Instance Segmentation](https://arxiv.org/abs/1803.01534) + + + +## Abstract + +The way that information propagates in neural networks is of great importance. In this paper, we propose Path Aggregation Network (PANet) aiming at boosting information flow in proposal-based instance segmentation framework. Specifically, we enhance the entire feature hierarchy with accurate localization signals in lower layers by bottom-up path augmentation, which shortens the information path between lower layers and topmost feature. We present adaptive feature pooling, which links feature grid and all feature levels to make useful information in each feature level propagate directly to following proposal subnetworks. A complementary branch capturing different views for each proposal is created to further improve mask prediction. These improvements are simple to implement, with subtle extra computational overhead. Our PANet reaches the 1st place in the COCO 2017 Challenge Instance Segmentation task and the 2nd place in Object Detection task without large-batch training. It is also state-of-the-art on MVD and Cityscapes. + +
+ +
+ +## Results and Models + +| Backbone | style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | 1x | 4.0 | 17.2 | 37.5 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pafpn/faster_rcnn_r50_pafpn_1x_coco/faster_rcnn_r50_pafpn_1x_coco_bbox_mAP-0.375_20200503_105836-b7b4b9bd.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pafpn/faster_rcnn_r50_pafpn_1x_coco/faster_rcnn_r50_pafpn_1x_coco_20200503_105836.log.json) | + +## Citation + +```latex +@inproceedings{liu2018path, + author = {Shu Liu and + Lu Qi and + Haifang Qin and + Jianping Shi and + Jiaya Jia}, + title = {Path Aggregation Network for Instance Segmentation}, + booktitle = {Proceedings of IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, + year = {2018} +} +``` diff --git a/configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py b/configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py new file mode 100644 index 0000000..b2fdef9 --- /dev/null +++ b/configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py @@ -0,0 +1,8 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' + +model = dict( + neck=dict( + type='PAFPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5)) diff --git a/configs/pafpn/metafile.yml b/configs/pafpn/metafile.yml new file mode 100644 index 0000000..f9cf97c --- /dev/null +++ b/configs/pafpn/metafile.yml @@ -0,0 +1,38 @@ +Collections: + - Name: PAFPN + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - PAFPN + Paper: + URL: https://arxiv.org/abs/1803.01534 + Title: 'Path Aggregation Network for Instance Segmentation' + README: configs/pafpn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/necks/pafpn.py#L11 + Version: v2.0.0 + +Models: + - Name: faster_rcnn_r50_pafpn_1x_coco + In Collection: PAFPN + Config: configs/pafpn/faster_rcnn_r50_pafpn_1x_coco.py + Metadata: + Training Memory (GB): 4.0 + inference time (ms/im): + - value: 58.14 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pafpn/faster_rcnn_r50_pafpn_1x_coco/faster_rcnn_r50_pafpn_1x_coco_bbox_mAP-0.375_20200503_105836-b7b4b9bd.pth diff --git a/configs/panoptic_fpn/README.md b/configs/panoptic_fpn/README.md new file mode 100644 index 0000000..b31c9c0 --- /dev/null +++ b/configs/panoptic_fpn/README.md @@ -0,0 +1,63 @@ +# Panoptic FPN + +> [Panoptic feature pyramid networks](https://arxiv.org/abs/1901.02446) + + + +## Abstract + +The recently introduced panoptic segmentation task has renewed our community's interest in unifying the tasks of instance segmentation (for thing classes) and semantic segmentation (for stuff classes). However, current state-of-the-art methods for this joint task use separate and dissimilar networks for instance and semantic segmentation, without performing any shared computation. In this work, we aim to unify these methods at the architectural level, designing a single network for both tasks. Our approach is to endow Mask R-CNN, a popular instance segmentation method, with a semantic segmentation branch using a shared Feature Pyramid Network (FPN) backbone. Surprisingly, this simple baseline not only remains effective for instance segmentation, but also yields a lightweight, top-performing method for semantic segmentation. In this work, we perform a detailed study of this minimally extended version of Mask R-CNN with FPN, which we refer to as Panoptic FPN, and show it is a robust and accurate baseline for both tasks. Given its effectiveness and conceptual simplicity, we hope our method can serve as a strong baseline and aid future research in panoptic segmentation. + +
+ +
+ +## Dataset + +PanopticFPN requires COCO and [COCO-panoptic](http://images.cocodataset.org/annotations/panoptic_annotations_trainval2017.zip) dataset for training and evaluation. You need to download and extract it in the COCO dataset path. +The directory should be like this. + +```none +mmdetection +├── mmdet +├── tools +├── configs +├── data +│ ├── coco +│ │ ├── annotations +│ │ │ ├── panoptic_train2017.json +│ │ │ ├── panoptic_train2017 +│ │ │ ├── panoptic_val2017.json +│ │ │ ├── panoptic_val2017 +│ │ ├── train2017 +│ │ ├── val2017 +│ │ ├── test2017 +``` + +## Results and Models + +| Backbone | style | Lr schd | Mem (GB) | Inf time (fps) | PQ | SQ | RQ | PQ_th | SQ_th | RQ_th | PQ_st | SQ_st | RQ_st | Config | Download | +| :-------: | :-----: | :-----: | :------: | :------------: | :--: | :--: | :--: | :---: | :---: | :---: | :---: | :---: | :---: | :---------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | 1x | 4.7 | | 40.2 | 77.8 | 49.3 | 47.8 | 80.9 | 57.5 | 28.9 | 73.1 | 37.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco/panoptic_fpn_r50_fpn_1x_coco_20210821_101153-9668fd13.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco/panoptic_fpn_r50_fpn_1x_coco_20210821_101153.log.json) | +| R-50-FPN | pytorch | 3x | - | - | 42.5 | 78.1 | 51.7 | 50.3 | 81.5 | 60.3 | 30.7 | 73.0 | 38.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/panoptic_fpn/panoptic_fpn_r50_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r50_fpn_mstrain_3x_coco/panoptic_fpn_r50_fpn_mstrain_3x_coco_20210824_171155-5650f98b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r50_fpn_mstrain_3x_coco/panoptic_fpn_r50_fpn_mstrain_3x_coco_20210824_171155.log.json) | +| R-101-FPN | pytorch | 1x | 6.7 | | 42.2 | 78.3 | 51.4 | 50.1 | 81.4 | 59.9 | 30.3 | 73.6 | 38.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/panoptic_fpn/panoptic_fpn_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r101_fpn_1x_coco/panoptic_fpn_r101_fpn_1x_coco_20210820_193950-ab9157a2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r101_fpn_1x_coco/panoptic_fpn_r101_fpn_1x_coco_20210820_193950.log.json) | +| R-101-FPN | pytorch | 3x | - | - | 44.1 | 78.9 | 53.6 | 52.1 | 81.7 | 62.3 | 32.0 | 74.6 | 40.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/panoptic_fpn/panoptic_fpn_r101_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r101_fpn_mstrain_3x_coco/panoptic_fpn_r101_fpn_mstrain_3x_coco_20210823_114712-9c99acc4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r101_fpn_mstrain_3x_coco/panoptic_fpn_r101_fpn_mstrain_3x_coco_20210823_114712.log.json) | +| R2-50-FPN | pytorch | 1x | - | - | 42.5 | 78.0 | 51.8 | 50.0 | 81.4 | 60.0 | 31.1 | 72.8 | 39.4 | [config](https://github.com/open-mmlab/mmdetection/tree/dev/configs/panoptic_fpn/panoptic_fpn_r2_50_fpn_fp16_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/rfnext/panoptic_fpn_r2_50_fpn_fp16_1x_coco/panoptic_fpn_r2_50_fpn_fp16_1x_coco-fa6c51f0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/rfnext/panoptic_fpn_r2_50_fpn_fp16_1x_coco/panoptic_fpn_r2_50_fpn_fp16_1x_coco_20221114_224729.log.json) | + +## Citation + +The base method for panoptic segmentation task. + +```latex +@inproceedings{kirillov2018panopticfpn, + author = { + Alexander Kirillov, + Ross Girshick, + Kaiming He, + Piotr Dollar, + }, + title = {Panoptic Feature Pyramid Networks}, + booktitle = {Proceedings of IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, + year = {2019} +} +``` diff --git a/configs/panoptic_fpn/metafile.yml b/configs/panoptic_fpn/metafile.yml new file mode 100644 index 0000000..c258c8e --- /dev/null +++ b/configs/panoptic_fpn/metafile.yml @@ -0,0 +1,83 @@ +Collections: + - Name: PanopticFPN + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - PanopticFPN + Paper: + URL: https://arxiv.org/pdf/1901.02446 + Title: 'Panoptic feature pyramid networks' + README: configs/panoptic_fpn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.16.0/mmdet/models/detectors/panoptic_fpn.py#L7 + Version: v2.16.0 + +Models: + - Name: panoptic_fpn_r50_fpn_1x_coco + In Collection: PanopticFPN + Config: configs/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.6 + Epochs: 12 + Results: + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 40.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco/panoptic_fpn_r50_fpn_1x_coco_20210821_101153-9668fd13.pth + + - Name: panoptic_fpn_r50_fpn_mstrain_3x_coco + In Collection: PanopticFPN + Config: configs/panoptic_fpn/panoptic_fpn_r50_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 4.6 + Epochs: 36 + Results: + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 42.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r50_fpn_mstrain_3x_coco/panoptic_fpn_r50_fpn_mstrain_3x_coco_20210824_171155-5650f98b.pth + + - Name: panoptic_fpn_r101_fpn_1x_coco + In Collection: PanopticFPN + Config: configs/panoptic_fpn/panoptic_fpn_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.5 + Epochs: 12 + Results: + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 42.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r101_fpn_1x_coco/panoptic_fpn_r101_fpn_1x_coco_20210820_193950-ab9157a2.pth + + - Name: panoptic_fpn_r101_fpn_mstrain_3x_coco + In Collection: PanopticFPN + Config: configs/panoptic_fpn/panoptic_fpn_r101_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 6.5 + Epochs: 36 + Results: + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 44.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/panoptic_fpn/panoptic_fpn_r101_fpn_mstrain_3x_coco/panoptic_fpn_r101_fpn_mstrain_3x_coco_20210823_114712-9c99acc4.pth + + - Name: panoptic_fpn_r2_50_fpn_fp16_1x_coco + In Collection: PanopticFPN + Config: configs/panoptic_fpn/panoptic_fpn_r2_50_fpn_fp16_1x_coco.py + Metadata: + Training Memory (GB): 3.5 + Epochs: 12 + Results: + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + PQ: 42.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/rfnext/panoptic_fpn_r2_50_fpn_fp16_1x_coco/panoptic_fpn_r2_50_fpn_fp16_1x_coco-fa6c51f0.pth diff --git a/configs/panoptic_fpn/panoptic_fpn_r101_fpn_1x_coco.py b/configs/panoptic_fpn/panoptic_fpn_r101_fpn_1x_coco.py new file mode 100644 index 0000000..78b8079 --- /dev/null +++ b/configs/panoptic_fpn/panoptic_fpn_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './panoptic_fpn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/panoptic_fpn/panoptic_fpn_r101_fpn_mstrain_3x_coco.py b/configs/panoptic_fpn/panoptic_fpn_r101_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..057e481 --- /dev/null +++ b/configs/panoptic_fpn/panoptic_fpn_r101_fpn_mstrain_3x_coco.py @@ -0,0 +1,6 @@ +_base_ = './panoptic_fpn_r50_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/panoptic_fpn/panoptic_fpn_r2_50_fpn_fp16_1x_coco.py b/configs/panoptic_fpn/panoptic_fpn_r2_50_fpn_fp16_1x_coco.py new file mode 100644 index 0000000..6c75f01 --- /dev/null +++ b/configs/panoptic_fpn/panoptic_fpn_r2_50_fpn_fp16_1x_coco.py @@ -0,0 +1,12 @@ +_base_ = './panoptic_fpn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='Res2Net', + depth=50, + scales=4, + base_width=26, + init_cfg=dict( + type='Pretrained', + checkpoint='res2net50_v1b_26w_4s-3cf99910.pth'))) + +fp16 = dict(loss_scale='dynamic') diff --git a/configs/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco.py b/configs/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..2995524 --- /dev/null +++ b/configs/panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco.py @@ -0,0 +1,33 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_panoptic.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='PanopticFPN', + semantic_head=dict( + type='PanopticFPNHead', + num_things_classes=80, + num_stuff_classes=53, + in_channels=256, + inner_channels=128, + start_level=0, + end_level=4, + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True), + conv_cfg=None, + loss_seg=dict( + type='CrossEntropyLoss', ignore_index=255, loss_weight=0.5)), + panoptic_fusion_head=dict( + type='HeuristicFusionHead', + num_things_classes=80, + num_stuff_classes=53), + test_cfg=dict( + panoptic=dict( + score_thr=0.6, + max_per_img=100, + mask_thr_binary=0.5, + mask_overlap=0.5, + nms=dict(type='nms', iou_threshold=0.5, class_agnostic=True), + stuff_area_limit=4096))) + +custom_hooks = [] diff --git a/configs/panoptic_fpn/panoptic_fpn_r50_fpn_mstrain_3x_coco.py b/configs/panoptic_fpn/panoptic_fpn_r50_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..b510935 --- /dev/null +++ b/configs/panoptic_fpn/panoptic_fpn_r50_fpn_mstrain_3x_coco.py @@ -0,0 +1,61 @@ +_base_ = './panoptic_fpn_r50_fpn_1x_coco.py' + +# dataset settings +dataset_type = 'CocoPanopticDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +# In mstrain 3x config, img_scale=[(1333, 640), (1333, 800)], +# multiscale_mode='range' +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadPanopticAnnotations', + with_bbox=True, + with_mask=True, + with_seg=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='SegRescale', scale_factor=1 / 4), + dict(type='DefaultFormatBundle'), + dict( + type='Collect', + keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks', 'gt_semantic_seg']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +# Use RepeatDataset to speed up training +data = dict( + train=dict( + _delete_=True, + type='RepeatDataset', + times=3, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/panoptic_train2017.json', + img_prefix=data_root + 'train2017/', + seg_prefix=data_root + 'annotations/panoptic_train2017/', + pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/pascal_voc/README.md b/configs/pascal_voc/README.md new file mode 100644 index 0000000..3c09813 --- /dev/null +++ b/configs/pascal_voc/README.md @@ -0,0 +1,40 @@ +# Pascal VOC + +> [The Pascal Visual Object Classes (VOC) Challenge](https://link.springer.com/article/10.1007/s11263-009-0275-4) + + + +## Abstract + +The Pascal Visual Object Classes (VOC) challenge is a benchmark in visual object category recognition and detection, providing the vision and machine learning communities with a standard dataset of images and annotation, and standard evaluation procedures. Organised annually from 2005 to present, the challenge and its associated dataset has become accepted as the benchmark for object detection. + +This paper describes the dataset and evaluation procedure. We review the state-of-the-art in evaluated methods for both classification and detection, analyse whether the methods are statistically different, what they are learning from the images (e.g. the object or its context), and what the methods find easy or confuse. The paper concludes with lessons learnt in the three year history of the challenge, and proposes directions for future improvement and extension. + +
+ +
+ +## Results and Models + +| Architecture | Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :-------------: | :------: | :-----: | :-----: | :------: | :------------: | :----: | :--------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Faster R-CNN C4 | R-50 | caffe | 18k | | - | 80.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pascal_voc/faster_rcnn_r50_caffe_c4_mstrain_18k_voc0712.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pascal_voc/faster_rcnn_r50_caffe_c4_mstrain_18k_voc0712//home/dong/code_sensetime/2022Q1/mmdetection/work_dirs/prepare_voc/gather/pascal_voc/faster_rcnn_r50_caffe_c4_mstrain_18k_voc0712/faster_rcnn_r50_caffe_c4_mstrain_18k_voc0712_20220314_234327-847a14d2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pascal_voc/faster_rcnn_r50_caffe_c4_mstrain_18k_voc0712/faster_rcnn_r50_caffe_c4_mstrain_18k_voc0712_20220314_234327.log.json) | +| Faster R-CNN | R-50 | pytorch | 1x | 2.6 | - | 80.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712/faster_rcnn_r50_fpn_1x_voc0712_20220320_192712-54bef0f3.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712/faster_rcnn_r50_fpn_1x_voc0712_20220320_192712.log.json) | +| Retinanet | R-50 | pytorch | 1x | 2.1 | - | 77.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pascal_voc/retinanet_r50_fpn_1x_voc0712.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pascal_voc/retinanet_r50_fpn_1x_voc0712/retinanet_r50_fpn_1x_voc0712_20200617-47cbdd0e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pascal_voc/retinanet_r50_fpn_1x_voc0712/retinanet_r50_fpn_1x_voc0712_20200616_014642.log.json) | +| SSD300 | VGG16 | - | 120e | - | - | 76.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pascal_voc/ssd300_voc0712.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pascal_voc/ssd300_voc0712/ssd300_voc0712_20220320_194658-17edda1b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pascal_voc/ssd300_voc0712/ssd300_voc0712_20220320_194658.log.json) | +| SSD512 | VGG16 | - | 120e | - | - | 79.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pascal_voc/ssd512_voc0712.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pascal_voc/ssd512_voc0712/ssd512_voc0712_20220320_194717-03cefefe.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pascal_voc/ssd512_voc0712/ssd512_voc0712_20220320_194717.log.json) | + +## Citation + +```latex +@Article{Everingham10, + author = "Everingham, M. and Van~Gool, L. and Williams, C. K. I. and Winn, J. and Zisserman, A.", + title = "The Pascal Visual Object Classes (VOC) Challenge", + journal = "International Journal of Computer Vision", + volume = "88", + year = "2010", + number = "2", + month = jun, + pages = "303--338", +} +``` diff --git a/configs/pascal_voc/faster_rcnn_r50_caffe_c4_mstrain_18k_voc0712.py b/configs/pascal_voc/faster_rcnn_r50_caffe_c4_mstrain_18k_voc0712.py new file mode 100644 index 0000000..7bb1d73 --- /dev/null +++ b/configs/pascal_voc/faster_rcnn_r50_caffe_c4_mstrain_18k_voc0712.py @@ -0,0 +1,81 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_caffe_c4.py', + '../_base_/default_runtime.py' +] +model = dict(roi_head=dict(bbox_head=dict(num_classes=20))) + +# dataset settings +dataset_type = 'VOCDataset' +data_root = 'data/VOCdevkit/' +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 480), (1333, 512), (1333, 544), (1333, 576), + (1333, 608), (1333, 640), (1333, 672), (1333, 704), + (1333, 736), (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=[ + data_root + 'VOC2007/ImageSets/Main/trainval.txt', + data_root + 'VOC2012/ImageSets/Main/trainval.txt' + ], + img_prefix=[data_root + 'VOC2007/', data_root + 'VOC2012/'], + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'VOC2007/ImageSets/Main/test.txt', + img_prefix=data_root + 'VOC2007/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'VOC2007/ImageSets/Main/test.txt', + img_prefix=data_root + 'VOC2007/', + pipeline=test_pipeline)) + +# optimizer +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) + +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=100, + warmup_ratio=0.001, + step=[12000, 16000]) + +# Runner type +runner = dict(type='IterBasedRunner', max_iters=18000) + +checkpoint_config = dict(interval=3000) +evaluation = dict(interval=3000, metric='mAP') diff --git a/configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712.py b/configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712.py new file mode 100644 index 0000000..7866ace --- /dev/null +++ b/configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712.py @@ -0,0 +1,14 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', '../_base_/datasets/voc0712.py', + '../_base_/default_runtime.py' +] +model = dict(roi_head=dict(bbox_head=dict(num_classes=20))) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +# actual epoch = 3 * 3 = 9 +lr_config = dict(policy='step', step=[3]) +# runtime settings +runner = dict( + type='EpochBasedRunner', max_epochs=4) # actual epoch = 4 * 3 = 12 diff --git a/configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712_cocofmt.py b/configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712_cocofmt.py new file mode 100644 index 0000000..12eee2c --- /dev/null +++ b/configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc0712_cocofmt.py @@ -0,0 +1,75 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', '../_base_/datasets/voc0712.py', + '../_base_/default_runtime.py' +] +model = dict(roi_head=dict(bbox_head=dict(num_classes=20))) + +CLASSES = ('aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', + 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', + 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor') + +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/VOCdevkit/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1000, 600), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1000, 600), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type='RepeatDataset', + times=3, + dataset=dict( + type=dataset_type, + ann_file='data/voc0712_trainval.json', + img_prefix='data/VOCdevkit', + pipeline=train_pipeline, + classes=CLASSES)), + val=dict( + type=dataset_type, + ann_file='data/voc07_test.json', + img_prefix='data/VOCdevkit', + pipeline=test_pipeline, + classes=CLASSES), + test=dict( + type=dataset_type, + ann_file='data/voc07_test.json', + img_prefix='data/VOCdevkit', + pipeline=test_pipeline, + classes=CLASSES)) +evaluation = dict(interval=1, metric='bbox') + +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +# actual epoch = 3 * 3 = 9 +lr_config = dict(policy='step', step=[3]) +# runtime settings +runner = dict( + type='EpochBasedRunner', max_epochs=4) # actual epoch = 4 * 3 = 12 diff --git a/configs/pascal_voc/retinanet_r50_fpn_1x_voc0712.py b/configs/pascal_voc/retinanet_r50_fpn_1x_voc0712.py new file mode 100644 index 0000000..b4b050d --- /dev/null +++ b/configs/pascal_voc/retinanet_r50_fpn_1x_voc0712.py @@ -0,0 +1,14 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', '../_base_/datasets/voc0712.py', + '../_base_/default_runtime.py' +] +model = dict(bbox_head=dict(num_classes=20)) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +# actual epoch = 3 * 3 = 9 +lr_config = dict(policy='step', step=[3]) +# runtime settings +runner = dict( + type='EpochBasedRunner', max_epochs=4) # actual epoch = 4 * 3 = 12 diff --git a/configs/pascal_voc/ssd300_voc0712.py b/configs/pascal_voc/ssd300_voc0712.py new file mode 100644 index 0000000..e7008ae --- /dev/null +++ b/configs/pascal_voc/ssd300_voc0712.py @@ -0,0 +1,74 @@ +_base_ = [ + '../_base_/models/ssd300.py', '../_base_/datasets/voc0712.py', + '../_base_/default_runtime.py' +] +model = dict( + bbox_head=dict( + num_classes=20, anchor_generator=dict(basesize_ratio_range=(0.2, + 0.9)))) +# dataset settings +dataset_type = 'VOCDataset' +data_root = 'data/VOCdevkit/' +img_norm_cfg = dict(mean=[123.675, 116.28, 103.53], std=[1, 1, 1], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(300, 300), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(300, 300), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, + workers_per_gpu=3, + train=dict( + type='RepeatDataset', times=10, dataset=dict(pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='SGD', lr=1e-3, momentum=0.9, weight_decay=5e-4) +optimizer_config = dict() +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[16, 20]) +checkpoint_config = dict(interval=1) +# runtime settings +runner = dict(type='EpochBasedRunner', max_epochs=24) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/pascal_voc/ssd512_voc0712.py b/configs/pascal_voc/ssd512_voc0712.py new file mode 100644 index 0000000..f4627c2 --- /dev/null +++ b/configs/pascal_voc/ssd512_voc0712.py @@ -0,0 +1,57 @@ +_base_ = 'ssd300_voc0712.py' +input_size = 512 +model = dict( + neck=dict( + out_channels=(512, 1024, 512, 256, 256, 256, 256), + level_strides=(2, 2, 2, 2, 1), + level_paddings=(1, 1, 1, 1, 1), + last_kernel_size=4), + bbox_head=dict( + in_channels=(512, 1024, 512, 256, 256, 256, 256), + anchor_generator=dict( + input_size=input_size, + strides=[8, 16, 32, 64, 128, 256, 512], + basesize_ratio_range=(0.15, 0.9), + ratios=([2], [2, 3], [2, 3], [2, 3], [2, 3], [2], [2])))) +img_norm_cfg = dict(mean=[123.675, 116.28, 103.53], std=[1, 1, 1], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(512, 512), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(512, 512), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(dataset=dict(pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/pisa/README.md b/configs/pisa/README.md new file mode 100644 index 0000000..c847c85 --- /dev/null +++ b/configs/pisa/README.md @@ -0,0 +1,50 @@ +# PISA + +> [Prime Sample Attention in Object Detection](https://arxiv.org/abs/1904.04821) + + + +## Abstract + +It is a common paradigm in object detection frameworks to treat all samples equally and target at maximizing the performance on average. In this work, we revisit this paradigm through a careful study on how different samples contribute to the overall performance measured in terms of mAP. Our study suggests that the samples in each mini-batch are neither independent nor equally important, and therefore a better classifier on average does not necessarily mean higher mAP. Motivated by this study, we propose the notion of Prime Samples, those that play a key role in driving the detection performance. We further develop a simple yet effective sampling and learning strategy called PrIme Sample Attention (PISA) that directs the focus of the training process towards such samples. Our experiments demonstrate that it is often more effective to focus on prime samples than hard samples when training a detector. Particularly, On the MSCOCO dataset, PISA outperforms the random sampling baseline and hard mining schemes, e.g., OHEM and Focal Loss, consistently by around 2% on both single-stage and two-stage detectors, even with a strong backbone ResNeXt-101. + +
+ +
+ +## Results and Models + +| PISA | Network | Backbone | Lr schd | box AP | mask AP | Config | Download | +| :--: | :----------: | :------------: | :-----: | :----: | :-----: | :---------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| × | Faster R-CNN | R-50-FPN | 1x | 36.4 | | - | | +| √ | Faster R-CNN | R-50-FPN | 1x | 38.4 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pisa/pisa_faster_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_faster_rcnn_r50_fpn_1x_coco/pisa_faster_rcnn_r50_fpn_1x_coco-dea93523.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_faster_rcnn_r50_fpn_1x_coco/pisa_faster_rcnn_r50_fpn_1x_coco_20200506_185619.log.json) | +| × | Faster R-CNN | X101-32x4d-FPN | 1x | 40.1 | | - | | +| √ | Faster R-CNN | X101-32x4d-FPN | 1x | 41.9 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pisa/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco-e4accec4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco_20200505_181503.log.json) | +| × | Mask R-CNN | R-50-FPN | 1x | 37.3 | 34.2 | - | | +| √ | Mask R-CNN | R-50-FPN | 1x | 39.1 | 35.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pisa/pisa_mask_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_mask_rcnn_r50_fpn_1x_coco/pisa_mask_rcnn_r50_fpn_1x_coco-dfcedba6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_mask_rcnn_r50_fpn_1x_coco/pisa_mask_rcnn_r50_fpn_1x_coco_20200508_150500.log.json) | +| × | Mask R-CNN | X101-32x4d-FPN | 1x | 41.1 | 37.1 | - | | +| √ | Mask R-CNN | X101-32x4d-FPN | 1x | | | | | +| × | RetinaNet | R-50-FPN | 1x | 35.6 | | - | | +| √ | RetinaNet | R-50-FPN | 1x | 36.9 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pisa/pisa_retinanet_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_retinanet_r50_fpn_1x_coco/pisa_retinanet_r50_fpn_1x_coco-76409952.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_retinanet_r50_fpn_1x_coco/pisa_retinanet_r50_fpn_1x_coco_20200504_014311.log.json) | +| × | RetinaNet | X101-32x4d-FPN | 1x | 39.0 | | - | | +| √ | RetinaNet | X101-32x4d-FPN | 1x | 40.7 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pisa/pisa_retinanet_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_retinanet_x101_32x4d_fpn_1x_coco/pisa_retinanet_x101_32x4d_fpn_1x_coco-a0c13c73.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_retinanet_x101_32x4d_fpn_1x_coco/pisa_retinanet_x101_32x4d_fpn_1x_coco_20200505_001404.log.json) | +| × | SSD300 | VGG16 | 1x | 25.6 | | - | | +| √ | SSD300 | VGG16 | 1x | 27.6 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pisa/pisa_ssd300_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_ssd300_coco/pisa_ssd300_coco-710e3ac9.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_ssd300_coco/pisa_ssd300_coco_20200504_144325.log.json) | +| × | SSD512 | VGG16 | 1x | 29.3 | | - | | +| √ | SSD512 | VGG16 | 1x | 31.8 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pisa/pisa_ssd512_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_ssd512_coco/pisa_ssd512_coco-247addee.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_ssd512_coco/pisa_ssd512_coco_20200508_131030.log.json) | + +**Notes:** + +- In the original paper, all models are trained and tested on mmdet v1.x, thus results may not be exactly the same with this release on v2.0. +- It is noted PISA only modifies the training pipeline so the inference time remains the same with the baseline. + +## Citation + +```latex +@inproceedings{cao2019prime, + title={Prime sample attention in object detection}, + author={Cao, Yuhang and Chen, Kai and Loy, Chen Change and Lin, Dahua}, + booktitle={IEEE Conference on Computer Vision and Pattern Recognition}, + year={2020} +} +``` diff --git a/configs/pisa/metafile.yml b/configs/pisa/metafile.yml new file mode 100644 index 0000000..cd43afb --- /dev/null +++ b/configs/pisa/metafile.yml @@ -0,0 +1,110 @@ +Collections: + - Name: PISA + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - PISA + - RPN + - ResNet + - RoIPool + Paper: + URL: https://arxiv.org/abs/1904.04821 + Title: 'Prime Sample Attention in Object Detection' + README: configs/pisa/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/roi_heads/pisa_roi_head.py#L8 + Version: v2.1.0 + +Models: + - Name: pisa_faster_rcnn_r50_fpn_1x_coco + In Collection: PISA + Config: configs/pisa/pisa_faster_rcnn_r50_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_faster_rcnn_r50_fpn_1x_coco/pisa_faster_rcnn_r50_fpn_1x_coco-dea93523.pth + + - Name: pisa_faster_rcnn_x101_32x4d_fpn_1x_coco + In Collection: PISA + Config: configs/pisa/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco-e4accec4.pth + + - Name: pisa_mask_rcnn_r50_fpn_1x_coco + In Collection: PISA + Config: configs/pisa/pisa_mask_rcnn_r50_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 35.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_mask_rcnn_r50_fpn_1x_coco/pisa_mask_rcnn_r50_fpn_1x_coco-dfcedba6.pth + + - Name: pisa_retinanet_r50_fpn_1x_coco + In Collection: PISA + Config: configs/pisa/pisa_retinanet_r50_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 36.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_retinanet_r50_fpn_1x_coco/pisa_retinanet_r50_fpn_1x_coco-76409952.pth + + - Name: pisa_retinanet_x101_32x4d_fpn_1x_coco + In Collection: PISA + Config: configs/pisa/pisa_retinanet_x101_32x4d_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_retinanet_x101_32x4d_fpn_1x_coco/pisa_retinanet_x101_32x4d_fpn_1x_coco-a0c13c73.pth + + - Name: pisa_ssd300_coco + In Collection: PISA + Config: configs/pisa/pisa_ssd300_coco.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 27.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_ssd300_coco/pisa_ssd300_coco-710e3ac9.pth + + - Name: pisa_ssd512_coco + In Collection: PISA + Config: configs/pisa/pisa_ssd512_coco.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 31.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pisa/pisa_ssd512_coco/pisa_ssd512_coco-247addee.pth diff --git a/configs/pisa/pisa_faster_rcnn_r50_fpn_1x_coco.py b/configs/pisa/pisa_faster_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..71e65b0 --- /dev/null +++ b/configs/pisa/pisa_faster_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,30 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' + +model = dict( + roi_head=dict( + type='PISARoIHead', + bbox_head=dict( + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))), + train_cfg=dict( + rpn_proposal=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + sampler=dict( + type='ScoreHLRSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True, + k=0.5, + bias=0.), + isr=dict(k=2, bias=0), + carl=dict(k=1, bias=0.2))), + test_cfg=dict( + rpn=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0))) diff --git a/configs/pisa/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco.py b/configs/pisa/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..16edd99 --- /dev/null +++ b/configs/pisa/pisa_faster_rcnn_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,30 @@ +_base_ = '../faster_rcnn/faster_rcnn_x101_32x4d_fpn_1x_coco.py' + +model = dict( + roi_head=dict( + type='PISARoIHead', + bbox_head=dict( + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))), + train_cfg=dict( + rpn_proposal=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + sampler=dict( + type='ScoreHLRSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True, + k=0.5, + bias=0.), + isr=dict(k=2, bias=0), + carl=dict(k=1, bias=0.2))), + test_cfg=dict( + rpn=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0))) diff --git a/configs/pisa/pisa_mask_rcnn_r50_fpn_1x_coco.py b/configs/pisa/pisa_mask_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..047a293 --- /dev/null +++ b/configs/pisa/pisa_mask_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,30 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' + +model = dict( + roi_head=dict( + type='PISARoIHead', + bbox_head=dict( + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))), + train_cfg=dict( + rpn_proposal=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + sampler=dict( + type='ScoreHLRSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True, + k=0.5, + bias=0.), + isr=dict(k=2, bias=0), + carl=dict(k=1, bias=0.2))), + test_cfg=dict( + rpn=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0))) diff --git a/configs/pisa/pisa_mask_rcnn_x101_32x4d_fpn_1x_coco.py b/configs/pisa/pisa_mask_rcnn_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..2186a8f --- /dev/null +++ b/configs/pisa/pisa_mask_rcnn_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,30 @@ +_base_ = '../mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py' + +model = dict( + roi_head=dict( + type='PISARoIHead', + bbox_head=dict( + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0))), + train_cfg=dict( + rpn_proposal=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0), + rcnn=dict( + sampler=dict( + type='ScoreHLRSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True, + k=0.5, + bias=0.), + isr=dict(k=2, bias=0), + carl=dict(k=1, bias=0.2))), + test_cfg=dict( + rpn=dict( + nms_pre=2000, + max_per_img=2000, + nms=dict(type='nms', iou_threshold=0.7), + min_bbox_size=0))) diff --git a/configs/pisa/pisa_retinanet_r50_fpn_1x_coco.py b/configs/pisa/pisa_retinanet_r50_fpn_1x_coco.py new file mode 100644 index 0000000..70f89e2 --- /dev/null +++ b/configs/pisa/pisa_retinanet_r50_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = '../retinanet/retinanet_r50_fpn_1x_coco.py' + +model = dict( + bbox_head=dict( + type='PISARetinaHead', + loss_bbox=dict(type='SmoothL1Loss', beta=0.11, loss_weight=1.0)), + train_cfg=dict(isr=dict(k=2., bias=0.), carl=dict(k=1., bias=0.2))) diff --git a/configs/pisa/pisa_retinanet_x101_32x4d_fpn_1x_coco.py b/configs/pisa/pisa_retinanet_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..b97b672 --- /dev/null +++ b/configs/pisa/pisa_retinanet_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = '../retinanet/retinanet_x101_32x4d_fpn_1x_coco.py' + +model = dict( + bbox_head=dict( + type='PISARetinaHead', + loss_bbox=dict(type='SmoothL1Loss', beta=0.11, loss_weight=1.0)), + train_cfg=dict(isr=dict(k=2., bias=0.), carl=dict(k=1., bias=0.2))) diff --git a/configs/pisa/pisa_ssd300_coco.py b/configs/pisa/pisa_ssd300_coco.py new file mode 100644 index 0000000..b5cc006 --- /dev/null +++ b/configs/pisa/pisa_ssd300_coco.py @@ -0,0 +1,8 @@ +_base_ = '../ssd/ssd300_coco.py' + +model = dict( + bbox_head=dict(type='PISASSDHead'), + train_cfg=dict(isr=dict(k=2., bias=0.), carl=dict(k=1., bias=0.2))) + +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/configs/pisa/pisa_ssd512_coco.py b/configs/pisa/pisa_ssd512_coco.py new file mode 100644 index 0000000..3219d6d --- /dev/null +++ b/configs/pisa/pisa_ssd512_coco.py @@ -0,0 +1,8 @@ +_base_ = '../ssd/ssd512_coco.py' + +model = dict( + bbox_head=dict(type='PISASSDHead'), + train_cfg=dict(isr=dict(k=2., bias=0.), carl=dict(k=1., bias=0.2))) + +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/configs/point_rend/README.md b/configs/point_rend/README.md new file mode 100644 index 0000000..183e83d --- /dev/null +++ b/configs/point_rend/README.md @@ -0,0 +1,33 @@ +# PointRend + +> [PointRend: Image Segmentation as Rendering](https://arxiv.org/abs/1912.08193) + + + +## Abstract + +We present a new method for efficient high-quality image segmentation of objects and scenes. By analogizing classical computer graphics methods for efficient rendering with over- and undersampling challenges faced in pixel labeling tasks, we develop a unique perspective of image segmentation as a rendering problem. From this vantage, we present the PointRend (Point-based Rendering) neural network module: a module that performs point-based segmentation predictions at adaptively selected locations based on an iterative subdivision algorithm. PointRend can be flexibly applied to both instance and semantic segmentation tasks by building on top of existing state-of-the-art models. While many concrete implementations of the general idea are possible, we show that a simple design already achieves excellent results. Qualitatively, PointRend outputs crisp object boundaries in regions that are over-smoothed by previous methods. Quantitatively, PointRend yields significant gains on COCO and Cityscapes, for both instance and semantic segmentation. PointRend's efficiency enables output resolutions that are otherwise impractical in terms of memory or computation compared to existing approaches. + +
+ +
+ +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :------: | :---: | :-----: | :------: | :------------: | :----: | :-----: | :----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | caffe | 1x | 4.6 | | 38.4 | 36.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco/point_rend_r50_caffe_fpn_mstrain_1x_coco-1bcb5fb4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco/point_rend_r50_caffe_fpn_mstrain_1x_coco_20200612_161407.log.json) | +| R-50-FPN | caffe | 3x | 4.6 | | 41.0 | 38.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/point_rend/point_rend_r50_caffe_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/point_rend/point_rend_r50_caffe_fpn_mstrain_3x_coco/point_rend_r50_caffe_fpn_mstrain_3x_coco-e0ebb6b7.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/point_rend/point_rend_r50_caffe_fpn_mstrain_3x_coco/point_rend_r50_caffe_fpn_mstrain_3x_coco_20200614_002632.log.json) | + +Note: All models are trained with multi-scale, the input image shorter side is randomly scaled to one of (640, 672, 704, 736, 768, 800). + +## Citation + +```latex +@InProceedings{kirillov2019pointrend, + title={{PointRend}: Image Segmentation as Rendering}, + author={Alexander Kirillov and Yuxin Wu and Kaiming He and Ross Girshick}, + journal={ArXiv:1912.08193}, + year={2019} +} +``` diff --git a/configs/point_rend/metafile.yml b/configs/point_rend/metafile.yml new file mode 100644 index 0000000..82aea05 --- /dev/null +++ b/configs/point_rend/metafile.yml @@ -0,0 +1,54 @@ +Collections: + - Name: PointRend + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - PointRend + - FPN + - ResNet + Paper: + URL: https://arxiv.org/abs/1912.08193 + Title: 'PointRend: Image Segmentation as Rendering' + README: configs/point_rend/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.2.0/mmdet/models/detectors/point_rend.py#L6 + Version: v2.2.0 + +Models: + - Name: point_rend_r50_caffe_fpn_mstrain_1x_coco + In Collection: PointRend + Config: configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py + Metadata: + Training Memory (GB): 4.6 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco/point_rend_r50_caffe_fpn_mstrain_1x_coco-1bcb5fb4.pth + + - Name: point_rend_r50_caffe_fpn_mstrain_3x_coco + In Collection: PointRend + Config: configs/point_rend/point_rend_r50_caffe_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 4.6 + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/point_rend/point_rend_r50_caffe_fpn_mstrain_3x_coco/point_rend_r50_caffe_fpn_mstrain_3x_coco-e0ebb6b7.pth diff --git a/configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py b/configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py new file mode 100644 index 0000000..0c0e563 --- /dev/null +++ b/configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py @@ -0,0 +1,44 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain_1x_coco.py' +# model settings +model = dict( + type='PointRend', + roi_head=dict( + type='PointRendRoIHead', + mask_roi_extractor=dict( + type='GenericRoIExtractor', + aggregation='concat', + roi_layer=dict( + _delete_=True, type='SimpleRoIAlign', output_size=14), + out_channels=256, + featmap_strides=[4]), + mask_head=dict( + _delete_=True, + type='CoarseMaskHead', + num_fcs=2, + in_channels=256, + conv_out_channels=256, + fc_out_channels=1024, + num_classes=80, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0)), + point_head=dict( + type='MaskPointHead', + num_fcs=3, + in_channels=256, + fc_channels=256, + num_classes=80, + coarse_pred_each_layer=True, + loss_point=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))), + # model training and testing settings + train_cfg=dict( + rcnn=dict( + mask_size=7, + num_points=14 * 14, + oversample_ratio=3, + importance_sample_ratio=0.75)), + test_cfg=dict( + rcnn=dict( + subdivision_steps=5, + subdivision_num_points=28 * 28, + scale_factor=2))) diff --git a/configs/point_rend/point_rend_r50_caffe_fpn_mstrain_3x_coco.py b/configs/point_rend/point_rend_r50_caffe_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..169278e --- /dev/null +++ b/configs/point_rend/point_rend_r50_caffe_fpn_mstrain_3x_coco.py @@ -0,0 +1,4 @@ +_base_ = './point_rend_r50_caffe_fpn_mstrain_1x_coco.py' +# learning policy +lr_config = dict(step=[28, 34]) +runner = dict(type='EpochBasedRunner', max_epochs=36) diff --git a/configs/pvt/README.md b/configs/pvt/README.md new file mode 100644 index 0000000..1fd090b --- /dev/null +++ b/configs/pvt/README.md @@ -0,0 +1,57 @@ +# PVT + +> [Pyramid vision transformer: A versatile backbone for dense prediction without convolutions](https://arxiv.org/abs/2102.12122) + + + +## Abstract + +Although using convolutional neural networks (CNNs) as backbones achieves great successes in computer vision, this work investigates a simple backbone network useful for many dense prediction tasks without convolutions. Unlike the recently-proposed Transformer model (e.g., ViT) that is specially designed for image classification, we propose Pyramid Vision Transformer~(PVT), which overcomes the difficulties of porting Transformer to various dense prediction tasks. PVT has several merits compared to prior arts. (1) Different from ViT that typically has low-resolution outputs and high computational and memory cost, PVT can be not only trained on dense partitions of the image to achieve high output resolution, which is important for dense predictions but also using a progressive shrinking pyramid to reduce computations of large feature maps. (2) PVT inherits the advantages from both CNN and Transformer, making it a unified backbone in various vision tasks without convolutions by simply replacing CNN backbones. (3) We validate PVT by conducting extensive experiments, showing that it boosts the performance of many downstream tasks, e.g., object detection, semantic, and instance segmentation. For example, with a comparable number of parameters, RetinaNet+PVT achieves 40.4 AP on the COCO dataset, surpassing RetinNet+ResNet50 (36.3 AP) by 4.1 absolute AP. We hope PVT could serve as an alternative and useful backbone for pixel-level predictions and facilitate future researches. + +Transformer recently has shown encouraging progresses in computer vision. In this work, we present new baselines by improving the original Pyramid Vision Transformer (abbreviated as PVTv1) by adding three designs, including (1) overlapping patch embedding, (2) convolutional feed-forward networks, and (3) linear complexity attention layers. +With these modifications, our PVTv2 significantly improves PVTv1 on three tasks e.g., classification, detection, and segmentation. Moreover, PVTv2 achieves comparable or better performances than recent works such as Swin Transformer. We hope this work will facilitate state-of-the-art Transformer researches in computer vision. + +
+ +
+ +## Results and Models + +### RetinaNet (PVTv1) + +| Backbone | Lr schd | Mem (GB) | box AP | Config | Download | +| :--------: | :-----: | :------: | :----: | :--------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| PVT-Tiny | 12e | 8.5 | 36.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pvt/retinanet_pvt_t_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvt-t_fpn_1x_coco/retinanet_pvt-t_fpn_1x_coco_20210831_103110-17b566bd.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvt-t_fpn_1x_coco/retinanet_pvt-t_fpn_1x_coco_20210831_103110.log.json) | +| PVT-Small | 12e | 14.5 | 40.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pvt/retinanet_pvt_s_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvt-s_fpn_1x_coco/retinanet_pvt-s_fpn_1x_coco_20210906_142921-b6c94a5b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvt-s_fpn_1x_coco/retinanet_pvt-s_fpn_1x_coco_20210906_142921.log.json) | +| PVT-Medium | 12e | 20.9 | 41.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pvt/retinanet_pvt_m_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvt-m_fpn_1x_coco/retinanet_pvt-m_fpn_1x_coco_20210831_103243-55effa1b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvt-m_fpn_1x_coco/retinanet_pvt-m_fpn_1x_coco_20210831_103243.log.json) | + +### RetinaNet (PVTv2) + +| Backbone | Lr schd | Mem (GB) | box AP | Config | Download | +| :------: | :-----: | :------: | :----: | :------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| PVTv2-B0 | 12e | 7.4 | 37.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pvt/retinanet_pvt_v2_b0_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b0_fpn_1x_coco/retinanet_pvtv2-b0_fpn_1x_coco_20210831_103157-13e9aabe.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b0_fpn_1x_coco/retinanet_pvtv2-b0_fpn_1x_coco_20210831_103157.log.json) | +| PVTv2-B1 | 12e | 9.5 | 41.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pvt/retinanet_pvt_v2_b1_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b1_fpn_1x_coco/retinanet_pvtv2-b1_fpn_1x_coco_20210831_103318-7e169a7d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b1_fpn_1x_coco/retinanet_pvtv2-b1_fpn_1x_coco_20210831_103318.log.json) | +| PVTv2-B2 | 12e | 16.2 | 44.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pvt/retinanet_pvt_v2_b2_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b2_fpn_1x_coco/retinanet_pvtv2-b2_fpn_1x_coco_20210901_174843-529f0b9a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b2_fpn_1x_coco/retinanet_pvtv2-b2_fpn_1x_coco_20210901_174843.log.json) | +| PVTv2-B3 | 12e | 23.0 | 46.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pvt/retinanet_pvt_v2_b3_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b3_fpn_1x_coco/retinanet_pvtv2-b3_fpn_1x_coco_20210903_151512-8357deff.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b3_fpn_1x_coco/retinanet_pvtv2-b3_fpn_1x_coco_20210903_151512.log.json) | +| PVTv2-B4 | 12e | 17.0 | 46.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pvt/retinanet_pvt_v2_b4_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b4_fpn_1x_coco/retinanet_pvtv2-b4_fpn_1x_coco_20210901_170151-83795c86.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b4_fpn_1x_coco/retinanet_pvtv2-b4_fpn_1x_coco_20210901_170151.log.json) | +| PVTv2-B5 | 12e | 18.7 | 46.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/pvt/retinanet_pvt_v2_b5_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b5_fpn_1x_coco/retinanet_pvtv2-b5_fpn_1x_coco_20210902_201800-3420eb57.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b5_fpn_1x_coco/retinanet_pvtv2-b5_fpn_1x_coco_20210902_201800.log.json) | + +## Citation + +```latex +@article{wang2021pyramid, + title={Pyramid vision transformer: A versatile backbone for dense prediction without convolutions}, + author={Wang, Wenhai and Xie, Enze and Li, Xiang and Fan, Deng-Ping and Song, Kaitao and Liang, Ding and Lu, Tong and Luo, Ping and Shao, Ling}, + journal={arXiv preprint arXiv:2102.12122}, + year={2021} +} +``` + +```latex +@article{wang2021pvtv2, + title={PVTv2: Improved Baselines with Pyramid Vision Transformer}, + author={Wang, Wenhai and Xie, Enze and Li, Xiang and Fan, Deng-Ping and Song, Kaitao and Liang, Ding and Lu, Tong and Luo, Ping and Shao, Ling}, + journal={arXiv preprint arXiv:2106.13797}, + year={2021} +} +``` diff --git a/configs/pvt/metafile.yml b/configs/pvt/metafile.yml new file mode 100644 index 0000000..5884378 --- /dev/null +++ b/configs/pvt/metafile.yml @@ -0,0 +1,243 @@ +Models: + - Name: retinanet_pvt-t_fpn_1x_coco + In Collection: RetinaNet + Config: configs/pvt/retinanet_pvt-t_fpn_1x_coco.py + Metadata: + Training Memory (GB): 8.5 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x NVIDIA V100 GPUs + Architecture: + - PyramidVisionTransformer + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 36.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvt-t_fpn_1x_coco/retinanet_pvt-t_fpn_1x_coco_20210831_103110-17b566bd.pth + Paper: + URL: https://arxiv.org/abs/2102.12122 + Title: "Pyramid Vision Transformer: A Versatile Backbone for Dense Prediction without Convolutions" + README: configs/pvt/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.17.0/mmdet/models/backbones/pvt.py#L315 + Version: 2.17.0 + + - Name: retinanet_pvt-s_fpn_1x_coco + In Collection: RetinaNet + Config: configs/pvt/retinanet_pvt-s_fpn_1x_coco.py + Metadata: + Training Memory (GB): 14.5 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x NVIDIA V100 GPUs + Architecture: + - PyramidVisionTransformer + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvt-s_fpn_1x_coco/retinanet_pvt-s_fpn_1x_coco_20210906_142921-b6c94a5b.pth + Paper: + URL: https://arxiv.org/abs/2102.12122 + Title: "Pyramid Vision Transformer: A Versatile Backbone for Dense Prediction without Convolutions" + README: configs/pvt/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.17.0/mmdet/models/backbones/pvt.py#L315 + Version: 2.17.0 + + - Name: retinanet_pvt-m_fpn_1x_coco + In Collection: RetinaNet + Config: configs/pvt/retinanet_pvt-m_fpn_1x_coco.py + Metadata: + Training Memory (GB): 20.9 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x NVIDIA V100 GPUs + Architecture: + - PyramidVisionTransformer + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvt-m_fpn_1x_coco/retinanet_pvt-m_fpn_1x_coco_20210831_103243-55effa1b.pth + Paper: + URL: https://arxiv.org/abs/2102.12122 + Title: "Pyramid Vision Transformer: A Versatile Backbone for Dense Prediction without Convolutions" + README: configs/pvt/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.17.0/mmdet/models/backbones/pvt.py#L315 + Version: 2.17.0 + + - Name: retinanet_pvtv2-b0_fpn_1x_coco + In Collection: RetinaNet + Config: configs/pvt/retinanet_pvtv2-b0_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.4 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x NVIDIA V100 GPUs + Architecture: + - PyramidVisionTransformerV2 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b0_fpn_1x_coco/retinanet_pvtv2-b0_fpn_1x_coco_20210831_103157-13e9aabe.pth + Paper: + URL: https://arxiv.org/abs/2106.13797 + Title: "PVTv2: Improved Baselines with Pyramid Vision Transformer" + README: configs/pvt/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.17.0/mmdet/models/backbones/pvt.py#L543 + Version: 2.17.0 + + - Name: retinanet_pvtv2-b1_fpn_1x_coco + In Collection: RetinaNet + Config: configs/pvt/retinanet_pvtv2-b1_fpn_1x_coco.py + Metadata: + Training Memory (GB): 9.5 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x NVIDIA V100 GPUs + Architecture: + - PyramidVisionTransformerV2 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b1_fpn_1x_coco/retinanet_pvtv2-b1_fpn_1x_coco_20210831_103318-7e169a7d.pth + Paper: + URL: https://arxiv.org/abs/2106.13797 + Title: "PVTv2: Improved Baselines with Pyramid Vision Transformer" + README: configs/pvt/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.17.0/mmdet/models/backbones/pvt.py#L543 + Version: 2.17.0 + + - Name: retinanet_pvtv2-b2_fpn_1x_coco + In Collection: RetinaNet + Config: configs/pvt/retinanet_pvtv2-b2_fpn_1x_coco.py + Metadata: + Training Memory (GB): 16.2 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x NVIDIA V100 GPUs + Architecture: + - PyramidVisionTransformerV2 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b2_fpn_1x_coco/retinanet_pvtv2-b2_fpn_1x_coco_20210901_174843-529f0b9a.pth + Paper: + URL: https://arxiv.org/abs/2106.13797 + Title: "PVTv2: Improved Baselines with Pyramid Vision Transformer" + README: configs/pvt/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.17.0/mmdet/models/backbones/pvt.py#L543 + Version: 2.17.0 + + - Name: retinanet_pvtv2-b3_fpn_1x_coco + In Collection: RetinaNet + Config: configs/pvt/retinanet_pvtv2-b3_fpn_1x_coco.py + Metadata: + Training Memory (GB): 23.0 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x NVIDIA V100 GPUs + Architecture: + - PyramidVisionTransformerV2 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b3_fpn_1x_coco/retinanet_pvtv2-b3_fpn_1x_coco_20210903_151512-8357deff.pth + Paper: + URL: https://arxiv.org/abs/2106.13797 + Title: "PVTv2: Improved Baselines with Pyramid Vision Transformer" + README: configs/pvt/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.17.0/mmdet/models/backbones/pvt.py#L543 + Version: 2.17.0 + + - Name: retinanet_pvtv2-b4_fpn_1x_coco + In Collection: RetinaNet + Config: configs/pvt/retinanet_pvtv2-b4_fpn_1x_coco.py + Metadata: + Training Memory (GB): 17.0 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x NVIDIA V100 GPUs + Architecture: + - PyramidVisionTransformerV2 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b4_fpn_1x_coco/retinanet_pvtv2-b4_fpn_1x_coco_20210901_170151-83795c86.pth + Paper: + URL: https://arxiv.org/abs/2106.13797 + Title: "PVTv2: Improved Baselines with Pyramid Vision Transformer" + README: configs/pvt/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.17.0/mmdet/models/backbones/pvt.py#L543 + Version: 2.17.0 + + - Name: retinanet_pvtv2-b5_fpn_1x_coco + In Collection: RetinaNet + Config: configs/pvt/retinanet_pvtv2-b5_fpn_1x_coco.py + Metadata: + Training Memory (GB): 18.7 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x NVIDIA V100 GPUs + Architecture: + - PyramidVisionTransformerV2 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/pvt/retinanet_pvtv2-b5_fpn_1x_coco/retinanet_pvtv2-b5_fpn_1x_coco_20210902_201800-3420eb57.pth + Paper: + URL: https://arxiv.org/abs/2106.13797 + Title: "PVTv2: Improved Baselines with Pyramid Vision Transformer" + README: configs/pvt/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.17.0/mmdet/models/backbones/pvt.py#L543 + Version: 2.17.0 diff --git a/configs/pvt/retinanet_pvt-l_fpn_1x_coco.py b/configs/pvt/retinanet_pvt-l_fpn_1x_coco.py new file mode 100644 index 0000000..e299f2a --- /dev/null +++ b/configs/pvt/retinanet_pvt-l_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = 'retinanet_pvt-t_fpn_1x_coco.py' +model = dict( + backbone=dict( + num_layers=[3, 8, 27, 3], + init_cfg=dict(checkpoint='https://github.com/whai362/PVT/' + 'releases/download/v2/pvt_large.pth'))) +fp16 = dict(loss_scale=dict(init_scale=512)) diff --git a/configs/pvt/retinanet_pvt-m_fpn_1x_coco.py b/configs/pvt/retinanet_pvt-m_fpn_1x_coco.py new file mode 100644 index 0000000..b888f78 --- /dev/null +++ b/configs/pvt/retinanet_pvt-m_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = 'retinanet_pvt-t_fpn_1x_coco.py' +model = dict( + backbone=dict( + num_layers=[3, 4, 18, 3], + init_cfg=dict(checkpoint='https://github.com/whai362/PVT/' + 'releases/download/v2/pvt_medium.pth'))) diff --git a/configs/pvt/retinanet_pvt-s_fpn_1x_coco.py b/configs/pvt/retinanet_pvt-s_fpn_1x_coco.py new file mode 100644 index 0000000..4660348 --- /dev/null +++ b/configs/pvt/retinanet_pvt-s_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = 'retinanet_pvt-t_fpn_1x_coco.py' +model = dict( + backbone=dict( + num_layers=[3, 4, 6, 3], + init_cfg=dict(checkpoint='https://github.com/whai362/PVT/' + 'releases/download/v2/pvt_small.pth'))) diff --git a/configs/pvt/retinanet_pvt-t_fpn_1x_coco.py b/configs/pvt/retinanet_pvt-t_fpn_1x_coco.py new file mode 100644 index 0000000..a6cff7d --- /dev/null +++ b/configs/pvt/retinanet_pvt-t_fpn_1x_coco.py @@ -0,0 +1,16 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='RetinaNet', + backbone=dict( + _delete_=True, + type='PyramidVisionTransformer', + num_layers=[2, 2, 2, 2], + init_cfg=dict(checkpoint='https://github.com/whai362/PVT/' + 'releases/download/v2/pvt_tiny.pth')), + neck=dict(in_channels=[64, 128, 320, 512])) +# optimizer +optimizer = dict(_delete_=True, type='AdamW', lr=0.0001, weight_decay=0.0001) diff --git a/configs/pvt/retinanet_pvtv2-b0_fpn_1x_coco.py b/configs/pvt/retinanet_pvtv2-b0_fpn_1x_coco.py new file mode 100644 index 0000000..cbe2295 --- /dev/null +++ b/configs/pvt/retinanet_pvtv2-b0_fpn_1x_coco.py @@ -0,0 +1,17 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='RetinaNet', + backbone=dict( + _delete_=True, + type='PyramidVisionTransformerV2', + embed_dims=32, + num_layers=[2, 2, 2, 2], + init_cfg=dict(checkpoint='https://github.com/whai362/PVT/' + 'releases/download/v2/pvt_v2_b0.pth')), + neck=dict(in_channels=[32, 64, 160, 256])) +# optimizer +optimizer = dict(_delete_=True, type='AdamW', lr=0.0001, weight_decay=0.0001) diff --git a/configs/pvt/retinanet_pvtv2-b1_fpn_1x_coco.py b/configs/pvt/retinanet_pvtv2-b1_fpn_1x_coco.py new file mode 100644 index 0000000..5374c50 --- /dev/null +++ b/configs/pvt/retinanet_pvtv2-b1_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = 'retinanet_pvtv2-b0_fpn_1x_coco.py' +model = dict( + backbone=dict( + embed_dims=64, + init_cfg=dict(checkpoint='https://github.com/whai362/PVT/' + 'releases/download/v2/pvt_v2_b1.pth')), + neck=dict(in_channels=[64, 128, 320, 512])) diff --git a/configs/pvt/retinanet_pvtv2-b2_fpn_1x_coco.py b/configs/pvt/retinanet_pvtv2-b2_fpn_1x_coco.py new file mode 100644 index 0000000..cf9a18d --- /dev/null +++ b/configs/pvt/retinanet_pvtv2-b2_fpn_1x_coco.py @@ -0,0 +1,8 @@ +_base_ = 'retinanet_pvtv2-b0_fpn_1x_coco.py' +model = dict( + backbone=dict( + embed_dims=64, + num_layers=[3, 4, 6, 3], + init_cfg=dict(checkpoint='https://github.com/whai362/PVT/' + 'releases/download/v2/pvt_v2_b2.pth')), + neck=dict(in_channels=[64, 128, 320, 512])) diff --git a/configs/pvt/retinanet_pvtv2-b3_fpn_1x_coco.py b/configs/pvt/retinanet_pvtv2-b3_fpn_1x_coco.py new file mode 100644 index 0000000..7a47f82 --- /dev/null +++ b/configs/pvt/retinanet_pvtv2-b3_fpn_1x_coco.py @@ -0,0 +1,8 @@ +_base_ = 'retinanet_pvtv2-b0_fpn_1x_coco.py' +model = dict( + backbone=dict( + embed_dims=64, + num_layers=[3, 4, 18, 3], + init_cfg=dict(checkpoint='https://github.com/whai362/PVT/' + 'releases/download/v2/pvt_v2_b3.pth')), + neck=dict(in_channels=[64, 128, 320, 512])) diff --git a/configs/pvt/retinanet_pvtv2-b4_fpn_1x_coco.py b/configs/pvt/retinanet_pvtv2-b4_fpn_1x_coco.py new file mode 100644 index 0000000..9891d7b --- /dev/null +++ b/configs/pvt/retinanet_pvtv2-b4_fpn_1x_coco.py @@ -0,0 +1,18 @@ +_base_ = 'retinanet_pvtv2-b0_fpn_1x_coco.py' +model = dict( + backbone=dict( + embed_dims=64, + num_layers=[3, 8, 27, 3], + init_cfg=dict(checkpoint='https://github.com/whai362/PVT/' + 'releases/download/v2/pvt_v2_b4.pth')), + neck=dict(in_channels=[64, 128, 320, 512])) +# optimizer +optimizer = dict( + _delete_=True, type='AdamW', lr=0.0001 / 1.4, weight_decay=0.0001) +# dataset settings +data = dict(samples_per_gpu=1, workers_per_gpu=1) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (1 samples per GPU) +auto_scale_lr = dict(base_batch_size=8) diff --git a/configs/pvt/retinanet_pvtv2-b5_fpn_1x_coco.py b/configs/pvt/retinanet_pvtv2-b5_fpn_1x_coco.py new file mode 100644 index 0000000..a9fea2e --- /dev/null +++ b/configs/pvt/retinanet_pvtv2-b5_fpn_1x_coco.py @@ -0,0 +1,19 @@ +_base_ = 'retinanet_pvtv2-b0_fpn_1x_coco.py' +model = dict( + backbone=dict( + embed_dims=64, + num_layers=[3, 6, 40, 3], + mlp_ratios=(4, 4, 4, 4), + init_cfg=dict(checkpoint='https://github.com/whai362/PVT/' + 'releases/download/v2/pvt_v2_b5.pth')), + neck=dict(in_channels=[64, 128, 320, 512])) +# optimizer +optimizer = dict( + _delete_=True, type='AdamW', lr=0.0001 / 1.4, weight_decay=0.0001) +# dataset settings +data = dict(samples_per_gpu=1, workers_per_gpu=1) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (1 samples per GPU) +auto_scale_lr = dict(base_batch_size=8) diff --git a/configs/queryinst/README.md b/configs/queryinst/README.md new file mode 100644 index 0000000..ad6e0b3 --- /dev/null +++ b/configs/queryinst/README.md @@ -0,0 +1,36 @@ +# QueryInst + +> [Instances as Queries](https://openaccess.thecvf.com/content/ICCV2021/html/Fang_Instances_As_Queries_ICCV_2021_paper.html) + + + +## Abstract + +We present QueryInst, a new perspective for instance segmentation. QueryInst is a multi-stage end-to-end system that treats instances of interest as learnable queries, enabling query based object detectors, e.g., Sparse R-CNN, to have strong instance segmentation performance. The attributes of instances such as categories, bounding boxes, instance masks, and instance association embeddings are represented by queries in a unified manner. In QueryInst, a query is shared by both detection and segmentation via dynamic convolutions and driven by parallelly-supervised multi-stage learning. We conduct extensive experiments on three challenging benchmarks, i.e., COCO, CityScapes, and YouTube-VIS to evaluate the effectiveness of QueryInst in object detection, instance segmentation, and video instance segmentation tasks. For the first time, we demonstrate that a simple end-to-end query based framework can achieve the state-of-the-art performance in various instance-level recognition tasks. + +
+ +
+ +## Results and Models + +| Model | Backbone | Style | Lr schd | Number of Proposals | Multi-Scale | RandomCrop | box AP | mask AP | Config | Download | +| :-------: | :-------: | :-----: | :-----: | :-----------------: | :---------: | :--------: | :----: | :-----: | :------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| QueryInst | R-50-FPN | pytorch | 1x | 100 | False | False | 42.0 | 37.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/queryinst/queryinst_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r50_fpn_1x_coco/queryinst_r50_fpn_1x_coco_20210907_084916-5a8f1998.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r50_fpn_1x_coco/queryinst_r50_fpn_1x_coco_20210907_084916.log.json) | +| QueryInst | R-50-FPN | pytorch | 3x | 100 | True | False | 44.8 | 39.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/queryinst/queryinst_r50_fpn_mstrain_480-800_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r50_fpn_mstrain_480-800_3x_coco/queryinst_r50_fpn_mstrain_480-800_3x_coco_20210901_103643-7837af86.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r50_fpn_mstrain_480-800_3x_coco/queryinst_r50_fpn_mstrain_480-800_3x_coco_20210901_103643.log.json) | +| QueryInst | R-50-FPN | pytorch | 3x | 300 | True | True | 47.5 | 41.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/queryinst/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco_20210904_101802-85cffbd8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco_20210904_101802.log.json) | +| QueryInst | R-101-FPN | pytorch | 3x | 100 | True | False | 46.4 | 41.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/queryinst/queryinst_r101_fpn_mstrain_480-800_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r101_fpn_mstrain_480-800_3x_coco/queryinst_r101_fpn_mstrain_480-800_3x_coco_20210904_104048-91f9995b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r101_fpn_mstrain_480-800_3x_coco/queryinst_r101_fpn_mstrain_480-800_3x_coco_20210904_104048.log.json) | +| QueryInst | R-101-FPN | pytorch | 3x | 300 | True | True | 49.0 | 42.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/queryinst/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco_20210904_153621-76cce59f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco_20210904_153621.log.json) | + +## Citation + +```latex +@InProceedings{Fang_2021_ICCV, + author = {Fang, Yuxin and Yang, Shusheng and Wang, Xinggang and Li, Yu and Fang, Chen and Shan, Ying and Feng, Bin and Liu, Wenyu}, + title = {Instances As Queries}, + booktitle = {Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV)}, + month = {October}, + year = {2021}, + pages = {6910-6919} +} +``` diff --git a/configs/queryinst/metafile.yml b/configs/queryinst/metafile.yml new file mode 100644 index 0000000..da7f0a7 --- /dev/null +++ b/configs/queryinst/metafile.yml @@ -0,0 +1,100 @@ +Collections: + - Name: QueryInst + Metadata: + Training Data: COCO + Training Techniques: + - AdamW + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - ResNet + - QueryInst + Paper: + URL: https://openaccess.thecvf.com/content/ICCV2021/papers/Fang_Instances_As_Queries_ICCV_2021_paper.pdf + Title: 'Instances as Queries' + README: configs/queryinst/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/detectors/queryinst.py + Version: v2.18.0 + +Models: + - Name: queryinst_r50_fpn_1x_coco + In Collection: QueryInst + Config: configs/queryinst/queryinst_r50_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r50_fpn_1x_coco/queryinst_r50_fpn_1x_coco_20210907_084916-5a8f1998.pth + + - Name: queryinst_r50_fpn_mstrain_480-800_3x_coco + In Collection: QueryInst + Config: configs/queryinst/queryinst_r50_fpn_mstrain_480-800_3x_coco.py + Metadata: + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r50_fpn_mstrain_480-800_3x_coco/queryinst_r50_fpn_mstrain_480-800_3x_coco_20210901_103643-7837af86.pth + + - Name: queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco + In Collection: QueryInst + Config: configs/queryinst/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py + Metadata: + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 41.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco_20210904_101802-85cffbd8.pth + + - Name: queryinst_r101_fpn_mstrain_480-800_3x_coco + In Collection: QueryInst + Config: configs/queryinst/queryinst_r101_fpn_mstrain_480-800_3x_coco.py + Metadata: + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 41.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r101_fpn_mstrain_480-800_3x_coco/queryinst_r101_fpn_mstrain_480-800_3x_coco_20210904_104048-91f9995b.pth + + - Name: queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco + In Collection: QueryInst + Config: configs/queryinst/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py + Metadata: + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 49.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 42.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/queryinst/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco_20210904_153621-76cce59f.pth diff --git a/configs/queryinst/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py b/configs/queryinst/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py new file mode 100644 index 0000000..fd138f5 --- /dev/null +++ b/configs/queryinst/queryinst_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py @@ -0,0 +1,7 @@ +_base_ = './queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py' + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/queryinst/queryinst_r101_fpn_mstrain_480-800_3x_coco.py b/configs/queryinst/queryinst_r101_fpn_mstrain_480-800_3x_coco.py new file mode 100644 index 0000000..07cae19 --- /dev/null +++ b/configs/queryinst/queryinst_r101_fpn_mstrain_480-800_3x_coco.py @@ -0,0 +1,7 @@ +_base_ = './queryinst_r50_fpn_mstrain_480-800_3x_coco.py' + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/queryinst/queryinst_r50_fpn_1x_coco.py b/configs/queryinst/queryinst_r50_fpn_1x_coco.py new file mode 100644 index 0000000..48f5773 --- /dev/null +++ b/configs/queryinst/queryinst_r50_fpn_1x_coco.py @@ -0,0 +1,138 @@ +_base_ = [ + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +num_stages = 6 +num_proposals = 100 +model = dict( + type='QueryInst', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=0, + add_extra_convs='on_input', + num_outs=4), + rpn_head=dict( + type='EmbeddingRPNHead', + num_proposals=num_proposals, + proposal_feature_channel=256), + roi_head=dict( + type='SparseRoIHead', + num_stages=num_stages, + stage_loss_weights=[1] * num_stages, + proposal_feature_channel=256, + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + mask_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=[ + dict( + type='DIIHead', + num_classes=80, + num_ffn_fcs=2, + num_heads=8, + num_cls_fcs=1, + num_reg_fcs=3, + feedforward_channels=2048, + in_channels=256, + dropout=0.0, + ffn_act_cfg=dict(type='ReLU', inplace=True), + dynamic_conv_cfg=dict( + type='DynamicConv', + in_channels=256, + feat_channels=64, + out_channels=256, + input_feat_shape=7, + act_cfg=dict(type='ReLU', inplace=True), + norm_cfg=dict(type='LN')), + loss_bbox=dict(type='L1Loss', loss_weight=5.0), + loss_iou=dict(type='GIoULoss', loss_weight=2.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=2.0), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + clip_border=False, + target_means=[0., 0., 0., 0.], + target_stds=[0.5, 0.5, 1., 1.])) for _ in range(num_stages) + ], + mask_head=[ + dict( + type='DynamicMaskHead', + dynamic_conv_cfg=dict( + type='DynamicConv', + in_channels=256, + feat_channels=64, + out_channels=256, + input_feat_shape=14, + with_proj=False, + act_cfg=dict(type='ReLU', inplace=True), + norm_cfg=dict(type='LN')), + num_convs=4, + num_classes=80, + roi_feat_size=14, + in_channels=256, + conv_kernel_size=3, + conv_out_channels=256, + class_agnostic=False, + norm_cfg=dict(type='BN'), + upsample_cfg=dict(type='deconv', scale_factor=2), + loss_mask=dict( + type='DiceLoss', + loss_weight=8.0, + use_sigmoid=True, + activate=False, + eps=1e-5)) for _ in range(num_stages) + ]), + # training and testing settings + train_cfg=dict( + rpn=None, + rcnn=[ + dict( + assigner=dict( + type='HungarianAssigner', + cls_cost=dict(type='FocalLossCost', weight=2.0), + reg_cost=dict(type='BBoxL1Cost', weight=5.0), + iou_cost=dict(type='IoUCost', iou_mode='giou', + weight=2.0)), + sampler=dict(type='PseudoSampler'), + pos_weight=1, + mask_size=28, + ) for _ in range(num_stages) + ]), + test_cfg=dict( + rpn=None, rcnn=dict(max_per_img=num_proposals, mask_thr_binary=0.5))) + +# optimizer +optimizer = dict( + _delete_=True, + type='AdamW', + lr=0.0001, + weight_decay=0.0001, + paramwise_cfg=dict( + custom_keys={'backbone': dict(lr_mult=0.1, decay_mult=1.0)})) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=0.1, norm_type=2)) +# learning policy +lr_config = dict(policy='step', step=[8, 11], warmup_iters=1000) +runner = dict(type='EpochBasedRunner', max_epochs=12) diff --git a/configs/queryinst/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py b/configs/queryinst/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py new file mode 100644 index 0000000..3089b3c --- /dev/null +++ b/configs/queryinst/queryinst_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py @@ -0,0 +1,54 @@ +_base_ = './queryinst_r50_fpn_mstrain_480-800_3x_coco.py' +num_proposals = 300 +model = dict( + rpn_head=dict(num_proposals=num_proposals), + test_cfg=dict( + _delete_=True, + rpn=None, + rcnn=dict(max_per_img=num_proposals, mask_thr_binary=0.5))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +# augmentation strategy originates from DETR. +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='AutoAugment', + policies=[[ + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), (576, 1333), + (608, 1333), (640, 1333), (672, 1333), (704, 1333), + (736, 1333), (768, 1333), (800, 1333)], + multiscale_mode='value', + keep_ratio=True) + ], + [ + dict( + type='Resize', + img_scale=[(400, 1333), (500, 1333), (600, 1333)], + multiscale_mode='value', + keep_ratio=True), + dict( + type='RandomCrop', + crop_type='absolute_range', + crop_size=(384, 600), + allow_negative_crop=True), + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + override=True, + keep_ratio=True) + ]]), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']) +] +data = dict(train=dict(pipeline=train_pipeline)) diff --git a/configs/queryinst/queryinst_r50_fpn_mstrain_480-800_3x_coco.py b/configs/queryinst/queryinst_r50_fpn_mstrain_480-800_3x_coco.py new file mode 100644 index 0000000..89e2cd1 --- /dev/null +++ b/configs/queryinst/queryinst_r50_fpn_mstrain_480-800_3x_coco.py @@ -0,0 +1,23 @@ +_base_ = './queryinst_r50_fpn_1x_coco.py' + +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +min_values = (480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, value) for value in min_values], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']) +] + +data = dict(train=dict(pipeline=train_pipeline)) +lr_config = dict(policy='step', step=[27, 33]) +runner = dict(type='EpochBasedRunner', max_epochs=36) diff --git a/configs/regnet/README.md b/configs/regnet/README.md new file mode 100644 index 0000000..61dba42 --- /dev/null +++ b/configs/regnet/README.md @@ -0,0 +1,121 @@ +# RegNet + +> [Designing Network Design Spaces](https://arxiv.org/abs/2003.13678) + + + +## Abstract + +In this work, we present a new network design paradigm. Our goal is to help advance the understanding of network design and discover design principles that generalize across settings. Instead of focusing on designing individual network instances, we design network design spaces that parametrize populations of networks. The overall process is analogous to classic manual design of networks, but elevated to the design space level. Using our methodology we explore the structure aspect of network design and arrive at a low-dimensional design space consisting of simple, regular networks that we call RegNet. The core insight of the RegNet parametrization is surprisingly simple: widths and depths of good networks can be explained by a quantized linear function. We analyze the RegNet design space and arrive at interesting findings that do not match the current practice of network design. The RegNet design space provides simple and fast networks that work well across a wide range of flop regimes. Under comparable training settings and flops, the RegNet models outperform the popular EfficientNet models while being up to 5x faster on GPUs. + +
+ +
+ +## Introduction + +We implement RegNetX and RegNetY models in detection systems and provide their first results on Mask R-CNN, Faster R-CNN and RetinaNet. + +The pre-trained models are converted from [model zoo of pycls](https://github.com/facebookresearch/pycls/blob/master/MODEL_ZOO.md). + +## Usage + +To use a regnet model, there are two steps to do: + +1. Convert the model to ResNet-style supported by MMDetection +2. Modify backbone and neck in config accordingly + +### Convert model + +We already prepare models of FLOPs from 400M to 12G in our model zoo. + +For more general usage, we also provide script `regnet2mmdet.py` in the tools directory to convert the key of models pretrained by [pycls](https://github.com/facebookresearch/pycls/) to +ResNet-style checkpoints used in MMDetection. + +```bash +python -u tools/model_converters/regnet2mmdet.py ${PRETRAIN_PATH} ${STORE_PATH} +``` + +This script convert model from `PRETRAIN_PATH` and store the converted model in `STORE_PATH`. + +### Modify config + +The users can modify the config's `depth` of backbone and corresponding keys in `arch` according to the configs in the [pycls model zoo](https://github.com/facebookresearch/pycls/blob/master/MODEL_ZOO.md). +The parameter `in_channels` in FPN can be found in the Figure 15 & 16 of the paper (`wi` in the legend). +This directory already provides some configs with their performance, using RegNetX from 800MF to 12GF level. +For other pre-trained models or self-implemented regnet models, the users are responsible to check these parameters by themselves. + +**Note**: Although Fig. 15 & 16 also provide `w0`, `wa`, `wm`, `group_w`, and `bot_mul` for `arch`, they are quantized thus inaccurate, using them sometimes produces different backbone that does not match the key in the pre-trained model. + +## Results and Models + +### Mask R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :----------------------------------------------------------------------------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :--------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| [R-50-FPN](../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py) | pytorch | 1x | 4.4 | 12.0 | 38.2 | 34.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_1x_coco/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_1x_coco/mask_rcnn_r50_fpn_1x_coco_20200205_050542.log.json) | +| [RegNetX-3.2GF-FPN](./mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py) | pytorch | 1x | 5.0 | | 40.3 | 36.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco/mask_rcnn_regnetx-3.2GF_fpn_1x_coco_20200520_163141-2a9d1814.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco/mask_rcnn_regnetx-3.2GF_fpn_1x_coco_20200520_163141.log.json) | +| [RegNetX-4.0GF-FPN](./mask_rcnn_regnetx-4GF_fpn_1x_coco.py) | pytorch | 1x | 5.5 | | 41.5 | 37.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-4GF_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-4GF_fpn_1x_coco/mask_rcnn_regnetx-4GF_fpn_1x_coco_20200517_180217-32e9c92d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-4GF_fpn_1x_coco/mask_rcnn_regnetx-4GF_fpn_1x_coco_20200517_180217.log.json) | +| [R-101-FPN](../mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py) | pytorch | 1x | 6.4 | 10.3 | 40.0 | 36.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_1x_coco/mask_rcnn_r101_fpn_1x_coco_20200204-1efe0ed5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r101_fpn_1x_coco/mask_rcnn_r101_fpn_1x_coco_20200204_144809.log.json) | +| [RegNetX-6.4GF-FPN](./mask_rcnn_regnetx-6.4GF_fpn_1x_coco.py) | pytorch | 1x | 6.1 | | 41.0 | 37.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-6.4GF_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-6.4GF_fpn_1x_coco/mask_rcnn_regnetx-6.4GF_fpn_1x_coco_20200517_180439-3a7aae83.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-6.4GF_fpn_1x_coco/mask_rcnn_regnetx-6.4GF_fpn_1x_coco_20200517_180439.log.json) | +| [X-101-32x4d-FPN](../mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py) | pytorch | 1x | 7.6 | 9.4 | 41.9 | 37.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco/mask_rcnn_x101_32x4d_fpn_1x_coco_20200205-478d0b67.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_x101_32x4d_fpn_1x_coco/mask_rcnn_x101_32x4d_fpn_1x_coco_20200205_034906.log.json) | +| [RegNetX-8.0GF-FPN](./mask_rcnn_regnetx-8GF_fpn_1x_coco.py) | pytorch | 1x | 6.4 | | 41.7 | 37.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-8GF_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-8GF_fpn_1x_coco/mask_rcnn_regnetx-8GF_fpn_1x_coco_20200517_180515-09daa87e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-8GF_fpn_1x_coco/mask_rcnn_regnetx-8GF_fpn_1x_coco_20200517_180515.log.json) | +| [RegNetX-12GF-FPN](./mask_rcnn_regnetx-12GF_fpn_1x_coco.py) | pytorch | 1x | 7.4 | | 42.2 | 38 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-12GF_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-12GF_fpn_1x_coco/mask_rcnn_regnetx-12GF_fpn_1x_coco_20200517_180552-b538bd8b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-12GF_fpn_1x_coco/mask_rcnn_regnetx-12GF_fpn_1x_coco_20200517_180552.log.json) | +| [RegNetX-3.2GF-FPN-DCN-C3-C5](./mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco.py) | pytorch | 1x | 5.0 | | 40.3 | 36.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco_20200520_172726-75f40794.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco_20200520_172726.log.json) | + +### Faster R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :-------------------------------------------------------------: | :-----: | :-----: | :------: | :------------: | :----: | :---------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| [R-50-FPN](../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py) | pytorch | 1x | 4.0 | 18.2 | 37.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130_204655.log.json) | +| [RegNetX-3.2GF-FPN](./faster_rcnn_regnetx-3.2GF_fpn_1x_coco.py) | pytorch | 1x | 4.5 | | 39.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-3.2GF_fpn_1x_coco/faster_rcnn_regnetx-3.2GF_fpn_1x_coco_20200517_175927-126fd9bf.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-3.2GF_fpn_1x_coco/faster_rcnn_regnetx-3.2GF_fpn_1x_coco_20200517_175927.log.json) | +| [RegNetX-3.2GF-FPN](./faster_rcnn_regnetx-3.2GF_fpn_2x_coco.py) | pytorch | 2x | 4.5 | | 41.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-3.2GF_fpn_2x_coco/faster_rcnn_regnetx-3.2GF_fpn_2x_coco_20200520_223955-e2081918.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-3.2GF_fpn_2x_coco/faster_rcnn_regnetx-3.2GF_fpn_2x_coco_20200520_223955.log.json) | + +### RetinaNet + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :-----------------------------------------------------------: | :-----: | :-----: | :------: | :------------: | :----: | :-------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| [R-50-FPN](../retinanet/retinanet_r50_fpn_1x_coco.py) | pytorch | 1x | 3.8 | 16.6 | 36.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet/retinanet_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r50_fpn_1x_coco/retinanet_r50_fpn_1x_coco_20200130-c2398f9e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r50_fpn_1x_coco/retinanet_r50_fpn_1x_coco_20200130_002941.log.json) | +| [RegNetX-800MF-FPN](./retinanet_regnetx-800MF_fpn_1x_coco.py) | pytorch | 1x | 2.5 | | 35.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/retinanet_regnetx-800MF_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/retinanet_regnetx-800MF_fpn_1x_coco/retinanet_regnetx-800MF_fpn_1x_coco_20200517_191403-f6f91d10.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/retinanet_regnetx-800MF_fpn_1x_coco/retinanet_regnetx-800MF_fpn_1x_coco_20200517_191403.log.json) | +| [RegNetX-1.6GF-FPN](./retinanet_regnetx-1.6GF_fpn_1x_coco.py) | pytorch | 1x | 3.3 | | 37.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/retinanet_regnetx-1.6GF_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/retinanet_regnetx-1.6GF_fpn_1x_coco/retinanet_regnetx-1.6GF_fpn_1x_coco_20200517_191403-37009a9d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/retinanet_regnetx-1.6GF_fpn_1x_coco/retinanet_regnetx-1.6GF_fpn_1x_coco_20200517_191403.log.json) | +| [RegNetX-3.2GF-FPN](./retinanet_regnetx-3.2GF_fpn_1x_coco.py) | pytorch | 1x | 4.2 | | 39.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/retinanet_regnetx-3.2GF_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/retinanet_regnetx-3.2GF_fpn_1x_coco/retinanet_regnetx-3.2GF_fpn_1x_coco_20200520_163141-cb1509e8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/retinanet_regnetx-3.2GF_fpn_1x_coco/retinanet_regnetx-3.2GF_fpn_1x_coco_20200520_163141.log.json) | + +### Pre-trained models + +We also train some models with longer schedules and multi-scale training. The users could finetune them for downstream tasks. + +| Method | Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :---------------: | :---------------------------------------------------------------------------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :-----------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Faster RCNN | [RegNetX-400MF-FPN](./faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 2.3 | | 37.1 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco_20210526_095112-e1967c37.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco_20210526_095112.log.json) | +| Faster RCNN | [RegNetX-800MF-FPN](./faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 2.8 | | 38.8 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco_20210526_095118-a2c70b20.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco_20210526_095118.log.json) | +| Faster RCNN | [RegNetX-1.6GF-FPN](./faster_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 3.4 | | 40.5 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/faster_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-1_20210526_095325-94aa46cc.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-1_20210526_095325.log.json) | +| Faster RCNN | [RegNetX-3.2GF-FPN](./faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 4.4 | | 42.3 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-3_20210526_095152-e16a5227.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-3_20210526_095152.log.json) | +| Faster RCNN | [RegNetX-4GF-FPN](./faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 4.9 | | 42.8 | - | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco_20210526_095201-65eaf841.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco_20210526_095201.log.json) | +| Mask RCNN | [RegNetX-400MF-FPN](./mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco.py) | pytorch | 3x | 2.5 | | 37.6 | 34.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco_20210601_235443-8aac57a4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco_20210601_235443.log.json) | +| Mask RCNN | [RegNetX-800MF-FPN](./mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco.py) | pytorch | 3x | 2.9 | | 39.5 | 36.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco_20210602_210641-715d51f5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco_20210602_210641.log.json) | +| Mask RCNN | [RegNetX-1.6GF-FPN](./mask_rcnn_regnetx-1.6GF_fpn_mstrain-poly_3x_coco.py) | pytorch | 3x | 3.6 | | 40.9 | 37.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-1.6GF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-1_20210602_210641-6764cff5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-1.6GF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-1_20210602_210641.log.json) | +| Mask RCNN | [RegNetX-3.2GF-FPN](./mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 5.0 | | 43.1 | 38.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco_20200521_202221-99879813.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco_20200521_202221.log.json) | +| Mask RCNN | [RegNetX-4GF-FPN](./mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco.py) | pytorch | 3x | 5.1 | | 43.4 | 39.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco_20210602_032621-00f0331c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco_20210602_032621.log.json) | +| Cascade Mask RCNN | [RegNetX-400MF-FPN](./cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 4.3 | | 41.6 | 36.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco_20210715_211619-5142f449.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco_20210715_211619.log.json) | +| Cascade Mask RCNN | [RegNetX-800MF-FPN](./cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 4.8 | | 42.8 | 37.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco_20210715_211616-dcbd13f4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco_20210715_211616.log.json) | +| Cascade Mask RCNN | [RegNetX-1.6GF-FPN](./cascade_mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 5.4 | | 44.5 | 39.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/cascade_mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-1_20210715_211616-75f29a61.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-1_20210715_211616.log.json) | +| Cascade Mask RCNN | [RegNetX-3.2GF-FPN](./cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 6.4 | | 45.8 | 40.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-3_20210715_211616-b9c2c58b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-3_20210715_211616.log.json) | +| Cascade Mask RCNN | [RegNetX-4GF-FPN](./cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py) | pytorch | 3x | 6.9 | | 45.8 | 40.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/regnet/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco_20210715_212034-cbb1be4c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco_20210715_212034.log.json) | + +### Notice + +1. The models are trained using a different weight decay, i.e., `weight_decay=5e-5` according to the setting in ImageNet training. This brings improvement of at least 0.7 AP absolute but does not improve the model using ResNet-50. +2. RetinaNets using RegNets are trained with learning rate 0.02 with gradient clip. We find that using learning rate 0.02 could improve the results by at least 0.7 AP absolute and gradient clip is necessary to stabilize the training. However, this does not improve the performance of ResNet-50-FPN RetinaNet. + +## Citation + +```latex +@article{radosavovic2020designing, + title={Designing Network Design Spaces}, + author={Ilija Radosavovic and Raj Prateek Kosaraju and Ross Girshick and Kaiming He and Piotr Dollár}, + year={2020}, + eprint={2003.13678}, + archivePrefix={arXiv}, + primaryClass={cs.CV} +} +``` diff --git a/configs/regnet/cascade_mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py b/configs/regnet/cascade_mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..358d85a --- /dev/null +++ b/configs/regnet/cascade_mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py @@ -0,0 +1,17 @@ +_base_ = 'cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_1.6gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_1.6gf')), + neck=dict( + type='FPN', + in_channels=[72, 168, 408, 912], + out_channels=256, + num_outs=5)) diff --git a/configs/regnet/cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py b/configs/regnet/cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..8464571 --- /dev/null +++ b/configs/regnet/cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py @@ -0,0 +1,63 @@ +_base_ = [ + '../common/mstrain_3x_coco_instance.py', + '../_base_/models/cascade_mask_rcnn_r50_fpn.py' +] +model = dict( + backbone=dict( + _delete_=True, + type='RegNet', + arch='regnetx_3.2gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_3.2gf')), + neck=dict( + type='FPN', + in_channels=[96, 192, 432, 1008], + out_channels=256, + num_outs=5)) +img_norm_cfg = dict( + # The mean and std are used in PyCls when training RegNets + mean=[103.53, 116.28, 123.675], + std=[57.375, 57.12, 58.395], + to_rgb=False) +train_pipeline = [ + # Images are converted to float32 directly after loading in PyCls + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + train=dict(dataset=dict(pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) + +optimizer = dict(weight_decay=0.00005) diff --git a/configs/regnet/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py b/configs/regnet/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..2a8990a --- /dev/null +++ b/configs/regnet/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py @@ -0,0 +1,17 @@ +_base_ = 'cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_400mf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_400mf')), + neck=dict( + type='FPN', + in_channels=[32, 64, 160, 384], + out_channels=256, + num_outs=5)) diff --git a/configs/regnet/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py b/configs/regnet/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..3157863 --- /dev/null +++ b/configs/regnet/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py @@ -0,0 +1,17 @@ +_base_ = 'cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_4.0gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_4.0gf')), + neck=dict( + type='FPN', + in_channels=[80, 240, 560, 1360], + out_channels=256, + num_outs=5)) diff --git a/configs/regnet/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py b/configs/regnet/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..41376ad --- /dev/null +++ b/configs/regnet/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py @@ -0,0 +1,17 @@ +_base_ = 'cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_800mf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_800mf')), + neck=dict( + type='FPN', + in_channels=[64, 128, 288, 672], + out_channels=256, + num_outs=5)) diff --git a/configs/regnet/faster_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py b/configs/regnet/faster_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..385b5ca --- /dev/null +++ b/configs/regnet/faster_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py @@ -0,0 +1,17 @@ +_base_ = 'faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_1.6gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_1.6gf')), + neck=dict( + type='FPN', + in_channels=[72, 168, 408, 912], + out_channels=256, + num_outs=5)) diff --git a/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_1x_coco.py b/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_1x_coco.py new file mode 100644 index 0000000..88d270e --- /dev/null +++ b/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_1x_coco.py @@ -0,0 +1,57 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + backbone=dict( + _delete_=True, + type='RegNet', + arch='regnetx_3.2gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_3.2gf')), + neck=dict( + type='FPN', + in_channels=[96, 192, 432, 1008], + out_channels=256, + num_outs=5)) +img_norm_cfg = dict( + # The mean and std are used in PyCls when training RegNets + mean=[103.53, 116.28, 123.675], + std=[57.375, 57.12, 58.395], + to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.00005) diff --git a/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_2x_coco.py b/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_2x_coco.py new file mode 100644 index 0000000..612490b --- /dev/null +++ b/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_2x_coco.py @@ -0,0 +1,3 @@ +_base_ = './faster_rcnn_regnetx-3.2GF_fpn_1x_coco.py' +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py b/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..b7e6e1a --- /dev/null +++ b/configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py @@ -0,0 +1,61 @@ +_base_ = [ + '../common/mstrain_3x_coco.py', '../_base_/models/faster_rcnn_r50_fpn.py' +] +model = dict( + backbone=dict( + _delete_=True, + type='RegNet', + arch='regnetx_3.2gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_3.2gf')), + neck=dict( + type='FPN', + in_channels=[96, 192, 432, 1008], + out_channels=256, + num_outs=5)) +img_norm_cfg = dict( + # The mean and std are used in PyCls when training RegNets + mean=[103.53, 116.28, 123.675], + std=[57.375, 57.12, 58.395], + to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + train=dict(dataset=dict(pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) + +optimizer = dict(weight_decay=0.00005) diff --git a/configs/regnet/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py b/configs/regnet/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..0a05f6e --- /dev/null +++ b/configs/regnet/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py @@ -0,0 +1,17 @@ +_base_ = 'faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_400mf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_400mf')), + neck=dict( + type='FPN', + in_channels=[32, 64, 160, 384], + out_channels=256, + num_outs=5)) diff --git a/configs/regnet/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py b/configs/regnet/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..98b3fc2 --- /dev/null +++ b/configs/regnet/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py @@ -0,0 +1,17 @@ +_base_ = 'faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_4.0gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_4.0gf')), + neck=dict( + type='FPN', + in_channels=[80, 240, 560, 1360], + out_channels=256, + num_outs=5)) diff --git a/configs/regnet/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py b/configs/regnet/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..67f448b --- /dev/null +++ b/configs/regnet/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py @@ -0,0 +1,17 @@ +_base_ = 'faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_800mf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_800mf')), + neck=dict( + type='FPN', + in_channels=[64, 128, 288, 672], + out_channels=256, + num_outs=5)) diff --git a/configs/regnet/mask_rcnn_regnetx-1.6GF_fpn_mstrain-poly_3x_coco.py b/configs/regnet/mask_rcnn_regnetx-1.6GF_fpn_mstrain-poly_3x_coco.py new file mode 100644 index 0000000..7970c3c --- /dev/null +++ b/configs/regnet/mask_rcnn_regnetx-1.6GF_fpn_mstrain-poly_3x_coco.py @@ -0,0 +1,26 @@ +_base_ = [ + '../common/mstrain-poly_3x_coco_instance.py', + '../_base_/models/mask_rcnn_r50_fpn.py' +] + +model = dict( + backbone=dict( + _delete_=True, + type='RegNet', + arch='regnetx_1.6gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_1.6gf')), + neck=dict( + type='FPN', + in_channels=[72, 168, 408, 912], + out_channels=256, + num_outs=5)) + +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.00005) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/configs/regnet/mask_rcnn_regnetx-12GF_fpn_1x_coco.py b/configs/regnet/mask_rcnn_regnetx-12GF_fpn_1x_coco.py new file mode 100644 index 0000000..ce3661c --- /dev/null +++ b/configs/regnet/mask_rcnn_regnetx-12GF_fpn_1x_coco.py @@ -0,0 +1,17 @@ +_base_ = './mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_12gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_12gf')), + neck=dict( + type='FPN', + in_channels=[224, 448, 896, 2240], + out_channels=256, + num_outs=5)) diff --git a/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py b/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py new file mode 100644 index 0000000..44bf0d1 --- /dev/null +++ b/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py @@ -0,0 +1,58 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + backbone=dict( + _delete_=True, + type='RegNet', + arch='regnetx_3.2gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_3.2gf')), + neck=dict( + type='FPN', + in_channels=[96, 192, 432, 1008], + out_channels=256, + num_outs=5)) +img_norm_cfg = dict( + # The mean and std are used in PyCls when training RegNets + mean=[103.53, 116.28, 123.675], + std=[57.375, 57.12, 58.395], + to_rgb=False) +train_pipeline = [ + # Images are converted to float32 directly after loading in PyCls + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.00005) diff --git a/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco.py b/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco.py new file mode 100644 index 0000000..5b53428 --- /dev/null +++ b/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = 'mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCNv2', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_3.2gf'))) diff --git a/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py b/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..aca64d3 --- /dev/null +++ b/configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py @@ -0,0 +1,66 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + backbone=dict( + _delete_=True, + type='RegNet', + arch='regnetx_3.2gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_3.2gf')), + neck=dict( + type='FPN', + in_channels=[96, 192, 432, 1008], + out_channels=256, + num_outs=5)) +img_norm_cfg = dict( + # The mean and std are used in PyCls when training RegNets + mean=[103.53, 116.28, 123.675], + std=[57.375, 57.12, 58.395], + to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.00005) +lr_config = dict(step=[28, 34]) +runner = dict(type='EpochBasedRunner', max_epochs=36) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/configs/regnet/mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco.py b/configs/regnet/mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco.py new file mode 100644 index 0000000..c38dfa6 --- /dev/null +++ b/configs/regnet/mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco.py @@ -0,0 +1,26 @@ +_base_ = [ + '../common/mstrain-poly_3x_coco_instance.py', + '../_base_/models/mask_rcnn_r50_fpn.py' +] + +model = dict( + backbone=dict( + _delete_=True, + type='RegNet', + arch='regnetx_400mf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_400mf')), + neck=dict( + type='FPN', + in_channels=[32, 64, 160, 384], + out_channels=256, + num_outs=5)) + +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.00005) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/configs/regnet/mask_rcnn_regnetx-4GF_fpn_1x_coco.py b/configs/regnet/mask_rcnn_regnetx-4GF_fpn_1x_coco.py new file mode 100644 index 0000000..874d485 --- /dev/null +++ b/configs/regnet/mask_rcnn_regnetx-4GF_fpn_1x_coco.py @@ -0,0 +1,17 @@ +_base_ = './mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_4.0gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_4.0gf')), + neck=dict( + type='FPN', + in_channels=[80, 240, 560, 1360], + out_channels=256, + num_outs=5)) diff --git a/configs/regnet/mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco.py b/configs/regnet/mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco.py new file mode 100644 index 0000000..f0b65ea --- /dev/null +++ b/configs/regnet/mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco.py @@ -0,0 +1,26 @@ +_base_ = [ + '../common/mstrain-poly_3x_coco_instance.py', + '../_base_/models/mask_rcnn_r50_fpn.py' +] + +model = dict( + backbone=dict( + _delete_=True, + type='RegNet', + arch='regnetx_4.0gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_4.0gf')), + neck=dict( + type='FPN', + in_channels=[80, 240, 560, 1360], + out_channels=256, + num_outs=5)) + +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.00005) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/configs/regnet/mask_rcnn_regnetx-6.4GF_fpn_1x_coco.py b/configs/regnet/mask_rcnn_regnetx-6.4GF_fpn_1x_coco.py new file mode 100644 index 0000000..99387d8 --- /dev/null +++ b/configs/regnet/mask_rcnn_regnetx-6.4GF_fpn_1x_coco.py @@ -0,0 +1,17 @@ +_base_ = './mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_6.4gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_6.4gf')), + neck=dict( + type='FPN', + in_channels=[168, 392, 784, 1624], + out_channels=256, + num_outs=5)) diff --git a/configs/regnet/mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco.py b/configs/regnet/mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco.py new file mode 100644 index 0000000..335ebab --- /dev/null +++ b/configs/regnet/mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco.py @@ -0,0 +1,26 @@ +_base_ = [ + '../common/mstrain-poly_3x_coco_instance.py', + '../_base_/models/mask_rcnn_r50_fpn.py' +] + +model = dict( + backbone=dict( + _delete_=True, + type='RegNet', + arch='regnetx_800mf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_800mf')), + neck=dict( + type='FPN', + in_channels=[64, 128, 288, 672], + out_channels=256, + num_outs=5)) + +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.00005) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/configs/regnet/mask_rcnn_regnetx-8GF_fpn_1x_coco.py b/configs/regnet/mask_rcnn_regnetx-8GF_fpn_1x_coco.py new file mode 100644 index 0000000..1e7832f --- /dev/null +++ b/configs/regnet/mask_rcnn_regnetx-8GF_fpn_1x_coco.py @@ -0,0 +1,17 @@ +_base_ = './mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_8.0gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_8.0gf')), + neck=dict( + type='FPN', + in_channels=[80, 240, 720, 1920], + out_channels=256, + num_outs=5)) diff --git a/configs/regnet/metafile.yml b/configs/regnet/metafile.yml new file mode 100644 index 0000000..28bd82f --- /dev/null +++ b/configs/regnet/metafile.yml @@ -0,0 +1,797 @@ +Models: + - Name: mask_rcnn_regnetx-3.2GF_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco.py + Metadata: + Training Memory (GB): 5.0 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-3.2GF_fpn_1x_coco/mask_rcnn_regnetx-3.2GF_fpn_1x_coco_20200520_163141-2a9d1814.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: mask_rcnn_regnetx-4GF_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-4GF_fpn_1x_coco.py + Metadata: + Training Memory (GB): 5.5 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-4GF_fpn_1x_coco/mask_rcnn_regnetx-4GF_fpn_1x_coco_20200517_180217-32e9c92d.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: mask_rcnn_regnetx-6.4GF_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-6.4GF_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.1 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-6.4GF_fpn_1x_coco/mask_rcnn_regnetx-6.4GF_fpn_1x_coco_20200517_180439-3a7aae83.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: mask_rcnn_regnetx-8GF_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-8GF_fpn_1x_coco.py + Metadata: + Training Memory (GB): 6.4 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-8GF_fpn_1x_coco/mask_rcnn_regnetx-8GF_fpn_1x_coco_20200517_180515-09daa87e.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: mask_rcnn_regnetx-12GF_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-12GF_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.4 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-12GF_fpn_1x_coco/mask_rcnn_regnetx-12GF_fpn_1x_coco_20200517_180552-b538bd8b.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco.py + Metadata: + Training Memory (GB): 5.0 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco/mask_rcnn_regnetx-3.2GF_fpn_mdconv_c3-c5_1x_coco_20200520_172726-75f40794.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: faster_rcnn_regnetx-3.2GF_fpn_1x_coco + In Collection: Faster R-CNN + Config: configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.5 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-3.2GF_fpn_1x_coco/faster_rcnn_regnetx-3.2GF_fpn_1x_coco_20200517_175927-126fd9bf.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: faster_rcnn_regnetx-3.2GF_fpn_2x_coco + In Collection: Faster R-CNN + Config: configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_2x_coco.py + Metadata: + Training Memory (GB): 4.5 + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-3.2GF_fpn_2x_coco/faster_rcnn_regnetx-3.2GF_fpn_2x_coco_20200520_223955-e2081918.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: retinanet_regnetx-800MF_fpn_1x_coco + In Collection: RetinaNet + Config: configs/regnet/retinanet_regnetx-800MF_fpn_1x_coco.py + Metadata: + Training Memory (GB): 2.5 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 35.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/retinanet_regnetx-800MF_fpn_1x_coco/retinanet_regnetx-800MF_fpn_1x_coco_20200517_191403-f6f91d10.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: retinanet_regnetx-1.6GF_fpn_1x_coco + In Collection: RetinaNet + Config: configs/regnet/retinanet_regnetx-1.6GF_fpn_1x_coco.py + Metadata: + Training Memory (GB): 3.3 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/retinanet_regnetx-1.6GF_fpn_1x_coco/retinanet_regnetx-1.6GF_fpn_1x_coco_20200517_191403-37009a9d.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: retinanet_regnetx-3.2GF_fpn_1x_coco + In Collection: RetinaNet + Config: configs/regnet/retinanet_regnetx-3.2GF_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.2 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/retinanet_regnetx-3.2GF_fpn_1x_coco/retinanet_regnetx-3.2GF_fpn_1x_coco_20200520_163141-cb1509e8.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/regnet/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 2.3 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-400MF_fpn_mstrain_3x_coco_20210526_095112-e1967c37.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/regnet/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 2.8 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-800MF_fpn_mstrain_3x_coco_20210526_095118-a2c70b20.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: faster_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/regnet/faster_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 3.4 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-1_20210526_095325-94aa46cc.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/regnet/faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 4.4 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-3_20210526_095152-e16a5227.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco + In Collection: Faster R-CNN + Config: configs/regnet/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 4.9 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco/faster_rcnn_regnetx-4GF_fpn_mstrain_3x_coco_20210526_095201-65eaf841.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 5.0 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco_20200521_202221-99879813.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco.py + Metadata: + Training Memory (GB): 2.5 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 34.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-400MF_fpn_mstrain-poly_3x_coco_20210601_235443-8aac57a4.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco.py + Metadata: + Training Memory (GB): 2.9 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-800MF_fpn_mstrain-poly_3x_coco_20210602_210641-715d51f5.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: mask_rcnn_regnetx-1.6GF_fpn_mstrain-poly_3x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-1.6GF_fpn_mstrain-poly_3x_coco.py + Metadata: + Training Memory (GB): 3.6 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-1.6GF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-1_20210602_210641-6764cff5.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 5.0 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco/mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco_20200521_202221-99879813.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco + In Collection: Mask R-CNN + Config: configs/regnet/mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco.py + Metadata: + Training Memory (GB): 5.1 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco/mask_rcnn_regnetx-4GF_fpn_mstrain-poly_3x_coco_20210602_032621-00f0331c.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco + In Collection: Cascade R-CNN + Config: configs/regnet/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 4.3 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-400MF_fpn_mstrain_3x_coco_20210715_211619-5142f449.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco + In Collection: Cascade R-CNN + Config: configs/regnet/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 4.8 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-800MF_fpn_mstrain_3x_coco_20210715_211616-dcbd13f4.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: cascade_mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco + In Collection: Cascade R-CNN + Config: configs/regnet/cascade_mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 5.4 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-1.6GF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-1_20210715_211616-75f29a61.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco + In Collection: Cascade R-CNN + Config: configs/regnet/cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 6.4 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-3.2GF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-3_20210715_211616-b9c2c58b.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 + + - Name: cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco + In Collection: Cascade R-CNN + Config: configs/regnet/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco.py + Metadata: + Training Memory (GB): 6.9 + Epochs: 36 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - RegNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/regnet/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco/cascade_mask_rcnn_regnetx-4GF_fpn_mstrain_3x_coco_20210715_212034-cbb1be4c.pth + Paper: + URL: https://arxiv.org/abs/2003.13678 + Title: 'Designing Network Design Spaces' + README: configs/regnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/regnet.py#L11 + Version: v2.1.0 diff --git a/configs/regnet/retinanet_regnetx-1.6GF_fpn_1x_coco.py b/configs/regnet/retinanet_regnetx-1.6GF_fpn_1x_coco.py new file mode 100644 index 0000000..7395c1b --- /dev/null +++ b/configs/regnet/retinanet_regnetx-1.6GF_fpn_1x_coco.py @@ -0,0 +1,17 @@ +_base_ = './retinanet_regnetx-3.2GF_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_1.6gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_1.6gf')), + neck=dict( + type='FPN', + in_channels=[72, 168, 408, 912], + out_channels=256, + num_outs=5)) diff --git a/configs/regnet/retinanet_regnetx-3.2GF_fpn_1x_coco.py b/configs/regnet/retinanet_regnetx-3.2GF_fpn_1x_coco.py new file mode 100644 index 0000000..f05307c --- /dev/null +++ b/configs/regnet/retinanet_regnetx-3.2GF_fpn_1x_coco.py @@ -0,0 +1,59 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + backbone=dict( + _delete_=True, + type='RegNet', + arch='regnetx_3.2gf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_3.2gf')), + neck=dict( + type='FPN', + in_channels=[96, 192, 432, 1008], + out_channels=256, + num_outs=5)) +img_norm_cfg = dict( + # The mean and std are used in PyCls when training RegNets + mean=[103.53, 116.28, 123.675], + std=[57.375, 57.12, 58.395], + to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.00005) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/configs/regnet/retinanet_regnetx-800MF_fpn_1x_coco.py b/configs/regnet/retinanet_regnetx-800MF_fpn_1x_coco.py new file mode 100644 index 0000000..f6f8989 --- /dev/null +++ b/configs/regnet/retinanet_regnetx-800MF_fpn_1x_coco.py @@ -0,0 +1,17 @@ +_base_ = './retinanet_regnetx-3.2GF_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='RegNet', + arch='regnetx_800mf', + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://regnetx_800mf')), + neck=dict( + type='FPN', + in_channels=[64, 128, 288, 672], + out_channels=256, + num_outs=5)) diff --git a/configs/reppoints/README.md b/configs/reppoints/README.md new file mode 100644 index 0000000..5e71ae5 --- /dev/null +++ b/configs/reppoints/README.md @@ -0,0 +1,59 @@ +# RepPoints + +> [RepPoints: Point Set Representation for Object Detection](https://arxiv.org/abs/1904.11490) + + + +## Abstract + +Modern object detectors rely heavily on rectangular bounding boxes, such as anchors, proposals and the final predictions, to represent objects at various recognition stages. The bounding box is convenient to use but provides only a coarse localization of objects and leads to a correspondingly coarse extraction of object features. In this paper, we present RepPoints(representative points), a new finer representation of objects as a set of sample points useful for both localization and recognition. Given ground truth localization and recognition targets for training, RepPoints learn to automatically arrange themselves in a manner that bounds the spatial extent of an object and indicates semantically significant local areas. They furthermore do not require the use of anchors to sample a space of bounding boxes. We show that an anchor-free object detector based on RepPoints can be as effective as the state-of-the-art anchor-based detection methods, with 46.5 AP and 67.4 AP50 on the COCO test-dev detection benchmark, using ResNet-101 model. + +
+ +
+ +## Introdution + +By [Ze Yang](https://yangze.tech/), [Shaohui Liu](http://b1ueber2y.me/), and [Han Hu](https://ancientmooner.github.io/). + +We provide code support and configuration files to reproduce the results in the paper for +["RepPoints: Point Set Representation for Object Detection"](https://arxiv.org/abs/1904.11490) on COCO object detection. + +**RepPoints**, initially described in [arXiv](https://arxiv.org/abs/1904.11490), is a new representation method for visual objects, on which visual understanding tasks are typically centered. Visual object representation, aiming at both geometric description and appearance feature extraction, is conventionally achieved by `bounding box + RoIPool (RoIAlign)`. The bounding box representation is convenient to use; however, it provides only a rectangular localization of objects that lacks geometric precision and may consequently degrade feature quality. Our new representation, RepPoints, models objects by a `point set` instead of a `bounding box`, which learns to adaptively position themselves over an object in a manner that circumscribes the object’s `spatial extent` and enables `semantically aligned feature extraction`. This richer and more flexible representation maintains the convenience of bounding boxes while facilitating various visual understanding applications. This repo demonstrated the effectiveness of RepPoints for COCO object detection. + +Another feature of this repo is the demonstration of an `anchor-free detector`, which can be as effective as state-of-the-art anchor-based detection methods. The anchor-free detector can utilize either `bounding box` or `RepPoints` as the basic object representation. + +## Results and Models + +The results on COCO 2017val are shown in the table below. + +| Method | Backbone | GN | Anchor | convert func | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :-------: | :-----------: | :-: | :----: | :----------: | :-----: | :------: | :------------: | :----: | :---------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| BBox | R-50-FPN | Y | single | - | 1x | 3.9 | 15.9 | 36.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/reppoints/bbox_r50_grid_fpn_gn-neck+head_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/reppoints/bbox_r50_grid_fpn_gn-neck%2Bhead_1x_coco/bbox_r50_grid_fpn_gn-neck%2Bhead_1x_coco_20200329_145916-0eedf8d1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/reppoints/bbox_r50_grid_fpn_gn-neck%2Bhead_1x_coco/bbox_r50_grid_fpn_gn-neck%2Bhead_1x_coco_20200329_145916.log.json) | +| BBox | R-50-FPN | Y | none | - | 1x | 3.9 | 15.4 | 37.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/reppoints/bbox_r50_grid_center_fpn_gn-neck+head_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/reppoints/bbox_r50_grid_fpn_gn-neck%2Bhead_1x_coco/bbox_r50_grid_fpn_gn-neck%2Bhead_1x_coco_20200329_145916-0eedf8d1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/reppoints/bbox_r50_grid_fpn_gn-neck%2Bhead_1x_coco/bbox_r50_grid_fpn_gn-neck%2Bhead_1x_coco_20200329_145916.log.json) | +| RepPoints | R-50-FPN | N | none | moment | 1x | 3.3 | 18.5 | 37.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/reppoints/reppoints_moment_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r50_fpn_1x_coco/reppoints_moment_r50_fpn_1x_coco_20200330-b73db8d1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r50_fpn_1x_coco/reppoints_moment_r50_fpn_1x_coco_20200330_233609.log.json) | +| RepPoints | R-50-FPN | Y | none | moment | 1x | 3.9 | 17.5 | 38.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/reppoints/reppoints_moment_r50_fpn_gn-neck+head_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r50_fpn_gn-neck%2Bhead_1x_coco/reppoints_moment_r50_fpn_gn-neck%2Bhead_1x_coco_20200329_145952-3e51b550.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r50_fpn_gn-neck%2Bhead_1x_coco/reppoints_moment_r50_fpn_gn-neck%2Bhead_1x_coco_20200329_145952.log.json) | +| RepPoints | R-50-FPN | Y | none | moment | 2x | 3.9 | - | 38.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/reppoints/reppoints_moment_r50_fpn_gn-neck+head_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r50_fpn_gn-neck%2Bhead_2x_coco/reppoints_moment_r50_fpn_gn-neck%2Bhead_2x_coco_20200329-91babaa2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r50_fpn_gn-neck%2Bhead_2x_coco/reppoints_moment_r50_fpn_gn-neck%2Bhead_2x_coco_20200329_150020.log.json) | +| RepPoints | R-101-FPN | Y | none | moment | 2x | 5.8 | 13.7 | 40.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/reppoints/reppoints_moment_r101_fpn_gn-neck+head_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r101_fpn_gn-neck%2Bhead_2x_coco/reppoints_moment_r101_fpn_gn-neck%2Bhead_2x_coco_20200329-4fbc7310.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r101_fpn_gn-neck%2Bhead_2x_coco/reppoints_moment_r101_fpn_gn-neck%2Bhead_2x_coco_20200329_132205.log.json) | +| RepPoints | R-101-FPN-DCN | Y | none | moment | 2x | 5.9 | 12.1 | 42.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/reppoints/reppoints_moment_r101_fpn_dconv_c3-c5_gn-neck+head_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco/reppoints_moment_r101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco_20200329-3309fbf2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco/reppoints_moment_r101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco_20200329_132134.log.json) | +| RepPoints | X-101-FPN-DCN | Y | none | moment | 2x | 7.1 | 9.3 | 44.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/reppoints/reppoints_moment_x101_fpn_dconv_c3-c5_gn-neck+head_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_x101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco/reppoints_moment_x101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco_20200329-f87da1ea.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_x101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco/reppoints_moment_x101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco_20200329_132201.log.json) | + +**Notes:** + +- `R-xx`, `X-xx` denote the ResNet and ResNeXt architectures, respectively. +- `DCN` denotes replacing 3x3 conv with the 3x3 deformable convolution in `c3-c5` stages of backbone. +- `none` in the `anchor` column means 2-d `center point` (x,y) is used to represent the initial object hypothesis. `single` denotes one 4-d anchor box (x,y,w,h) with IoU based label assign criterion is adopted. +- `moment`, `partial MinMax`, `MinMax` in the `convert func` column are three functions to convert a point set to a pseudo box. +- Note the results here are slightly different from those reported in the paper, due to framework change. While the original paper uses an [MXNet](https://mxnet.apache.org/) implementation, we re-implement the method in [PyTorch](https://pytorch.org/) based on mmdetection. + +## Citation + +```latex +@inproceedings{yang2019reppoints, + title={RepPoints: Point Set Representation for Object Detection}, + author={Yang, Ze and Liu, Shaohui and Hu, Han and Wang, Liwei and Lin, Stephen}, + booktitle={The IEEE International Conference on Computer Vision (ICCV)}, + month={Oct}, + year={2019} +} +``` diff --git a/configs/reppoints/bbox_r50_grid_center_fpn_gn-neck+head_1x_coco.py b/configs/reppoints/bbox_r50_grid_center_fpn_gn-neck+head_1x_coco.py new file mode 100644 index 0000000..b24c8db --- /dev/null +++ b/configs/reppoints/bbox_r50_grid_center_fpn_gn-neck+head_1x_coco.py @@ -0,0 +1,2 @@ +_base_ = './reppoints_moment_r50_fpn_gn-neck+head_1x_coco.py' +model = dict(bbox_head=dict(transform_method='minmax', use_grid_points=True)) diff --git a/configs/reppoints/bbox_r50_grid_fpn_gn-neck+head_1x_coco.py b/configs/reppoints/bbox_r50_grid_fpn_gn-neck+head_1x_coco.py new file mode 100644 index 0000000..8d5013d --- /dev/null +++ b/configs/reppoints/bbox_r50_grid_fpn_gn-neck+head_1x_coco.py @@ -0,0 +1,13 @@ +_base_ = './reppoints_moment_r50_fpn_gn-neck+head_1x_coco.py' +model = dict( + bbox_head=dict(transform_method='minmax', use_grid_points=True), + # training and testing settings + train_cfg=dict( + init=dict( + assigner=dict( + _delete_=True, + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1)))) diff --git a/configs/reppoints/metafile.yml b/configs/reppoints/metafile.yml new file mode 100644 index 0000000..d94137e --- /dev/null +++ b/configs/reppoints/metafile.yml @@ -0,0 +1,181 @@ +Collections: + - Name: RepPoints + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Group Normalization + - FPN + - RepPoints + - ResNet + Paper: + URL: https://arxiv.org/abs/1904.11490 + Title: 'RepPoints: Point Set Representation for Object Detection' + README: configs/reppoints/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/detectors/reppoints_detector.py#L9 + Version: v2.0.0 + +Models: + - Name: bbox_r50_grid_fpn_gn-neck+head_1x_coco + In Collection: RepPoints + Config: configs/reppoints/bbox_r50_grid_fpn_gn-neck+head_1x_coco.py + Metadata: + Training Memory (GB): 3.9 + inference time (ms/im): + - value: 62.89 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 36.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/reppoints/bbox_r50_grid_fpn_gn-neck%2Bhead_1x_coco/bbox_r50_grid_fpn_gn-neck%2Bhead_1x_coco_20200329_145916-0eedf8d1.pth + + - Name: bbox_r50_grid_center_fpn_gn-neck+head_1x_coco + In Collection: RepPoints + Config: configs/reppoints/bbox_r50_grid_center_fpn_gn-neck+head_1x_coco.py + Metadata: + Training Memory (GB): 3.9 + inference time (ms/im): + - value: 64.94 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/reppoints/bbox_r50_grid_fpn_gn-neck%2Bhead_1x_coco/bbox_r50_grid_fpn_gn-neck%2Bhead_1x_coco_20200329_145916-0eedf8d1.pth + + - Name: reppoints_moment_r50_fpn_1x_coco + In Collection: RepPoints + Config: configs/reppoints/reppoints_moment_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 3.3 + inference time (ms/im): + - value: 54.05 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r50_fpn_1x_coco/reppoints_moment_r50_fpn_1x_coco_20200330-b73db8d1.pth + + - Name: reppoints_moment_r50_fpn_gn-neck+head_1x_coco + In Collection: RepPoints + Config: configs/reppoints/reppoints_moment_r50_fpn_gn-neck+head_1x_coco.py + Metadata: + Training Memory (GB): 3.9 + inference time (ms/im): + - value: 57.14 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r50_fpn_gn-neck%2Bhead_1x_coco/reppoints_moment_r50_fpn_gn-neck%2Bhead_1x_coco_20200329_145952-3e51b550.pth + + - Name: reppoints_moment_r50_fpn_gn-neck+head_2x_coco + In Collection: RepPoints + Config: configs/reppoints/reppoints_moment_r50_fpn_gn-neck+head_2x_coco.py + Metadata: + Training Memory (GB): 3.9 + inference time (ms/im): + - value: 57.14 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r50_fpn_gn-neck%2Bhead_2x_coco/reppoints_moment_r50_fpn_gn-neck%2Bhead_2x_coco_20200329-91babaa2.pth + + - Name: reppoints_moment_r101_fpn_gn-neck+head_2x_coco + In Collection: RepPoints + Config: configs/reppoints/reppoints_moment_r101_fpn_gn-neck+head_2x_coco.py + Metadata: + Training Memory (GB): 5.8 + inference time (ms/im): + - value: 72.99 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r101_fpn_gn-neck%2Bhead_2x_coco/reppoints_moment_r101_fpn_gn-neck%2Bhead_2x_coco_20200329-4fbc7310.pth + + - Name: reppoints_moment_r101_fpn_dconv_c3-c5_gn-neck+head_2x_coco + In Collection: RepPoints + Config: configs/reppoints/reppoints_moment_r101_fpn_dconv_c3-c5_gn-neck+head_2x_coco.py + Metadata: + Training Memory (GB): 5.9 + inference time (ms/im): + - value: 82.64 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_r101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco/reppoints_moment_r101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco_20200329-3309fbf2.pth + + - Name: reppoints_moment_x101_fpn_dconv_c3-c5_gn-neck+head_2x_coco + In Collection: RepPoints + Config: configs/reppoints/reppoints_moment_x101_fpn_dconv_c3-c5_gn-neck+head_2x_coco.py + Metadata: + Training Memory (GB): 7.1 + inference time (ms/im): + - value: 107.53 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/reppoints/reppoints_moment_x101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco/reppoints_moment_x101_fpn_dconv_c3-c5_gn-neck%2Bhead_2x_coco_20200329-f87da1ea.pth diff --git a/configs/reppoints/reppoints.png b/configs/reppoints/reppoints.png new file mode 100644 index 0000000..a9306d9 Binary files /dev/null and b/configs/reppoints/reppoints.png differ diff --git a/configs/reppoints/reppoints_minmax_r50_fpn_gn-neck+head_1x_coco.py b/configs/reppoints/reppoints_minmax_r50_fpn_gn-neck+head_1x_coco.py new file mode 100644 index 0000000..0f56a46 --- /dev/null +++ b/configs/reppoints/reppoints_minmax_r50_fpn_gn-neck+head_1x_coco.py @@ -0,0 +1,2 @@ +_base_ = './reppoints_moment_r50_fpn_gn-neck+head_1x_coco.py' +model = dict(bbox_head=dict(transform_method='minmax')) diff --git a/configs/reppoints/reppoints_moment_r101_fpn_dconv_c3-c5_gn-neck+head_2x_coco.py b/configs/reppoints/reppoints_moment_r101_fpn_dconv_c3-c5_gn-neck+head_2x_coco.py new file mode 100644 index 0000000..e223d80 --- /dev/null +++ b/configs/reppoints/reppoints_moment_r101_fpn_dconv_c3-c5_gn-neck+head_2x_coco.py @@ -0,0 +1,8 @@ +_base_ = './reppoints_moment_r50_fpn_gn-neck+head_2x_coco.py' +model = dict( + backbone=dict( + depth=101, + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True), + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/reppoints/reppoints_moment_r101_fpn_gn-neck+head_2x_coco.py b/configs/reppoints/reppoints_moment_r101_fpn_gn-neck+head_2x_coco.py new file mode 100644 index 0000000..1185470 --- /dev/null +++ b/configs/reppoints/reppoints_moment_r101_fpn_gn-neck+head_2x_coco.py @@ -0,0 +1,6 @@ +_base_ = './reppoints_moment_r50_fpn_gn-neck+head_2x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/reppoints/reppoints_moment_r50_fpn_1x_coco.py b/configs/reppoints/reppoints_moment_r50_fpn_1x_coco.py new file mode 100644 index 0000000..158a906 --- /dev/null +++ b/configs/reppoints/reppoints_moment_r50_fpn_1x_coco.py @@ -0,0 +1,67 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='RepPointsDetector', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_input', + num_outs=5), + bbox_head=dict( + type='RepPointsHead', + num_classes=80, + in_channels=256, + feat_channels=256, + point_feat_channels=256, + stacked_convs=3, + num_points=9, + gradient_mul=0.1, + point_strides=[8, 16, 32, 64, 128], + point_base_scale=4, + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox_init=dict(type='SmoothL1Loss', beta=0.11, loss_weight=0.5), + loss_bbox_refine=dict(type='SmoothL1Loss', beta=0.11, loss_weight=1.0), + transform_method='moment'), + # training and testing settings + train_cfg=dict( + init=dict( + assigner=dict(type='PointAssigner', scale=4, pos_num=1), + allowed_border=-1, + pos_weight=-1, + debug=False), + refine=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False)), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) +optimizer = dict(lr=0.01) diff --git a/configs/reppoints/reppoints_moment_r50_fpn_gn-neck+head_1x_coco.py b/configs/reppoints/reppoints_moment_r50_fpn_gn-neck+head_1x_coco.py new file mode 100644 index 0000000..337f167 --- /dev/null +++ b/configs/reppoints/reppoints_moment_r50_fpn_gn-neck+head_1x_coco.py @@ -0,0 +1,4 @@ +_base_ = './reppoints_moment_r50_fpn_1x_coco.py' +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict(neck=dict(norm_cfg=norm_cfg), bbox_head=dict(norm_cfg=norm_cfg)) +optimizer = dict(lr=0.01) diff --git a/configs/reppoints/reppoints_moment_r50_fpn_gn-neck+head_2x_coco.py b/configs/reppoints/reppoints_moment_r50_fpn_gn-neck+head_2x_coco.py new file mode 100644 index 0000000..feca44a --- /dev/null +++ b/configs/reppoints/reppoints_moment_r50_fpn_gn-neck+head_2x_coco.py @@ -0,0 +1,3 @@ +_base_ = './reppoints_moment_r50_fpn_gn-neck+head_1x_coco.py' +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/reppoints/reppoints_moment_x101_fpn_dconv_c3-c5_gn-neck+head_2x_coco.py b/configs/reppoints/reppoints_moment_x101_fpn_dconv_c3-c5_gn-neck+head_2x_coco.py new file mode 100644 index 0000000..c0a12d0 --- /dev/null +++ b/configs/reppoints/reppoints_moment_x101_fpn_dconv_c3-c5_gn-neck+head_2x_coco.py @@ -0,0 +1,16 @@ +_base_ = './reppoints_moment_r50_fpn_gn-neck+head_2x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + dcn=dict(type='DCN', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/reppoints/reppoints_partial_minmax_r50_fpn_gn-neck+head_1x_coco.py b/configs/reppoints/reppoints_partial_minmax_r50_fpn_gn-neck+head_1x_coco.py new file mode 100644 index 0000000..9a63bd0 --- /dev/null +++ b/configs/reppoints/reppoints_partial_minmax_r50_fpn_gn-neck+head_1x_coco.py @@ -0,0 +1,2 @@ +_base_ = './reppoints_moment_r50_fpn_gn-neck+head_1x_coco.py' +model = dict(bbox_head=dict(transform_method='partial_minmax')) diff --git a/configs/res2net/README.md b/configs/res2net/README.md new file mode 100644 index 0000000..1285870 --- /dev/null +++ b/configs/res2net/README.md @@ -0,0 +1,77 @@ +# Res2Net + +> [Res2Net: A New Multi-scale Backbone Architecture](https://arxiv.org/abs/1904.01169) + + + +## Abstract + +Representing features at multiple scales is of great importance for numerous vision tasks. Recent advances in backbone convolutional neural networks (CNNs) continually demonstrate stronger multi-scale representation ability, leading to consistent performance gains on a wide range of applications. However, most existing methods represent the multi-scale features in a layer-wise manner. In this paper, we propose a novel building block for CNNs, namely Res2Net, by constructing hierarchical residual-like connections within one single residual block. The Res2Net represents multi-scale features at a granular level and increases the range of receptive fields for each network layer. The proposed Res2Net block can be plugged into the state-of-the-art backbone CNN models, e.g., ResNet, ResNeXt, and DLA. We evaluate the Res2Net block on all these models and demonstrate consistent performance gains over baseline models on widely-used datasets, e.g., CIFAR-100 and ImageNet. Further ablation studies and experimental results on representative computer vision tasks, i.e., object detection, class activation mapping, and salient object detection, further verify the superiority of the Res2Net over the state-of-the-art baseline methods. + +
+ +
+ +## Introduction + +We propose a novel building block for CNNs, namely Res2Net, by constructing hierarchical residual-like connections within one single residual block. The Res2Net represents multi-scale features at a granular level and increases the range of receptive fields for each network layer. + +| Backbone | Params. | GFLOPs | top-1 err. | top-5 err. | +| :---------------: | :-----: | :----: | :--------: | :--------: | +| ResNet-101 | 44.6 M | 7.8 | 22.63 | 6.44 | +| ResNeXt-101-64x4d | 83.5M | 15.5 | 20.40 | - | +| HRNetV2p-W48 | 77.5M | 16.1 | 20.70 | 5.50 | +| Res2Net-101 | 45.2M | 8.3 | 18.77 | 4.64 | + +Compared with other backbone networks, Res2Net requires fewer parameters and FLOPs. + +**Note:** + +- GFLOPs for classification are calculated with image size (224x224). + +## Results and Models + +### Faster R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :--------: | :-----: | :-----: | :------: | :------------: | :----: | :---------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R2-101-FPN | pytorch | 2x | 7.4 | - | 43.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/res2net/faster_rcnn_r2_101_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/res2net/faster_rcnn_r2_101_fpn_2x_coco/faster_rcnn_r2_101_fpn_2x_coco-175f1da6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/res2net/faster_rcnn_r2_101_fpn_2x_coco/faster_rcnn_r2_101_fpn_2x_coco_20200514_231734.log.json) | + +### Mask R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :--------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :-------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R2-101-FPN | pytorch | 2x | 7.9 | - | 43.6 | 38.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/res2net/mask_rcnn_r2_101_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/res2net/mask_rcnn_r2_101_fpn_2x_coco/mask_rcnn_r2_101_fpn_2x_coco-17f061e8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/res2net/mask_rcnn_r2_101_fpn_2x_coco/mask_rcnn_r2_101_fpn_2x_coco_20200515_002413.log.json) | + +### Cascade R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :--------: | :-----: | :-----: | :------: | :------------: | :----: | :-----------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R2-101-FPN | pytorch | 20e | 7.8 | - | 45.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/res2net/cascade_rcnn_r2_101_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/res2net/cascade_rcnn_r2_101_fpn_20e_coco/cascade_rcnn_r2_101_fpn_20e_coco-f4b7b7db.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/res2net/cascade_rcnn_r2_101_fpn_20e_coco/cascade_rcnn_r2_101_fpn_20e_coco_20200515_091644.log.json) | + +### Cascade Mask R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :--------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :----------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R2-101-FPN | pytorch | 20e | 9.5 | - | 46.4 | 40.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/res2net/cascade_mask_rcnn_r2_101_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/res2net/cascade_mask_rcnn_r2_101_fpn_20e_coco/cascade_mask_rcnn_r2_101_fpn_20e_coco-8a7b41e1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/res2net/cascade_mask_rcnn_r2_101_fpn_20e_coco/cascade_mask_rcnn_r2_101_fpn_20e_coco_20200515_091645.log.json) | + +### Hybrid Task Cascade (HTC) + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :--------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :--------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R2-101-FPN | pytorch | 20e | - | - | 47.5 | 41.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/res2net/htc_r2_101_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/res2net/htc_r2_101_fpn_20e_coco/htc_r2_101_fpn_20e_coco-3a8d2112.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/res2net/htc_r2_101_fpn_20e_coco/htc_r2_101_fpn_20e_coco_20200515_150029.log.json) | + +- Res2Net ImageNet pretrained models are in [Res2Net-PretrainedModels](https://github.com/Res2Net/Res2Net-PretrainedModels). +- More applications of Res2Net are in [Res2Net-Github](https://github.com/Res2Net/). + +## Citation + +```latex +@article{gao2019res2net, + title={Res2Net: A New Multi-scale Backbone Architecture}, + author={Gao, Shang-Hua and Cheng, Ming-Ming and Zhao, Kai and Zhang, Xin-Yu and Yang, Ming-Hsuan and Torr, Philip}, + journal={IEEE TPAMI}, + year={2020}, + doi={10.1109/TPAMI.2019.2938758}, +} +``` diff --git a/configs/res2net/cascade_mask_rcnn_r2_101_fpn_20e_coco.py b/configs/res2net/cascade_mask_rcnn_r2_101_fpn_20e_coco.py new file mode 100644 index 0000000..6b6c001 --- /dev/null +++ b/configs/res2net/cascade_mask_rcnn_r2_101_fpn_20e_coco.py @@ -0,0 +1,10 @@ +_base_ = '../cascade_rcnn/cascade_mask_rcnn_r50_fpn_20e_coco.py' +model = dict( + backbone=dict( + type='Res2Net', + depth=101, + scales=4, + base_width=26, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://res2net101_v1d_26w_4s'))) diff --git a/configs/res2net/cascade_rcnn_r2_101_fpn_20e_coco.py b/configs/res2net/cascade_rcnn_r2_101_fpn_20e_coco.py new file mode 100644 index 0000000..10dddbb --- /dev/null +++ b/configs/res2net/cascade_rcnn_r2_101_fpn_20e_coco.py @@ -0,0 +1,10 @@ +_base_ = '../cascade_rcnn/cascade_rcnn_r50_fpn_20e_coco.py' +model = dict( + backbone=dict( + type='Res2Net', + depth=101, + scales=4, + base_width=26, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://res2net101_v1d_26w_4s'))) diff --git a/configs/res2net/faster_rcnn_r2_101_fpn_2x_coco.py b/configs/res2net/faster_rcnn_r2_101_fpn_2x_coco.py new file mode 100644 index 0000000..fc2221c --- /dev/null +++ b/configs/res2net/faster_rcnn_r2_101_fpn_2x_coco.py @@ -0,0 +1,10 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_2x_coco.py' +model = dict( + backbone=dict( + type='Res2Net', + depth=101, + scales=4, + base_width=26, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://res2net101_v1d_26w_4s'))) diff --git a/configs/res2net/htc_r2_101_fpn_20e_coco.py b/configs/res2net/htc_r2_101_fpn_20e_coco.py new file mode 100644 index 0000000..22d0c5d --- /dev/null +++ b/configs/res2net/htc_r2_101_fpn_20e_coco.py @@ -0,0 +1,13 @@ +_base_ = '../htc/htc_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='Res2Net', + depth=101, + scales=4, + base_width=26, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://res2net101_v1d_26w_4s'))) +# learning policy +lr_config = dict(step=[16, 19]) +runner = dict(type='EpochBasedRunner', max_epochs=20) diff --git a/configs/res2net/mask_rcnn_r2_101_fpn_2x_coco.py b/configs/res2net/mask_rcnn_r2_101_fpn_2x_coco.py new file mode 100644 index 0000000..33aef1a --- /dev/null +++ b/configs/res2net/mask_rcnn_r2_101_fpn_2x_coco.py @@ -0,0 +1,10 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_2x_coco.py' +model = dict( + backbone=dict( + type='Res2Net', + depth=101, + scales=4, + base_width=26, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://res2net101_v1d_26w_4s'))) diff --git a/configs/res2net/metafile.yml b/configs/res2net/metafile.yml new file mode 100644 index 0000000..27bac8c --- /dev/null +++ b/configs/res2net/metafile.yml @@ -0,0 +1,146 @@ +Models: + - Name: faster_rcnn_r2_101_fpn_2x_coco + In Collection: Faster R-CNN + Config: configs/res2net/faster_rcnn_r2_101_fpn_2x_coco.py + Metadata: + Training Memory (GB): 7.4 + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Res2Net + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/res2net/faster_rcnn_r2_101_fpn_2x_coco/faster_rcnn_r2_101_fpn_2x_coco-175f1da6.pth + Paper: + URL: https://arxiv.org/abs/1904.01169 + Title: 'Res2Net for object detection and instance segmentation' + README: configs/res2net/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/res2net.py#L239 + Version: v2.1.0 + + - Name: mask_rcnn_r2_101_fpn_2x_coco + In Collection: Mask R-CNN + Config: configs/res2net/mask_rcnn_r2_101_fpn_2x_coco.py + Metadata: + Training Memory (GB): 7.9 + Epochs: 24 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Res2Net + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/res2net/mask_rcnn_r2_101_fpn_2x_coco/mask_rcnn_r2_101_fpn_2x_coco-17f061e8.pth + Paper: + URL: https://arxiv.org/abs/1904.01169 + Title: 'Res2Net for object detection and instance segmentation' + README: configs/res2net/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/res2net.py#L239 + Version: v2.1.0 + + - Name: cascade_rcnn_r2_101_fpn_20e_coco + In Collection: Cascade R-CNN + Config: configs/res2net/cascade_rcnn_r2_101_fpn_20e_coco.py + Metadata: + Training Memory (GB): 7.8 + Epochs: 20 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Res2Net + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/res2net/cascade_rcnn_r2_101_fpn_20e_coco/cascade_rcnn_r2_101_fpn_20e_coco-f4b7b7db.pth + Paper: + URL: https://arxiv.org/abs/1904.01169 + Title: 'Res2Net for object detection and instance segmentation' + README: configs/res2net/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/res2net.py#L239 + Version: v2.1.0 + + - Name: cascade_mask_rcnn_r2_101_fpn_20e_coco + In Collection: Cascade R-CNN + Config: configs/res2net/cascade_mask_rcnn_r2_101_fpn_20e_coco.py + Metadata: + Training Memory (GB): 9.5 + Epochs: 20 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Res2Net + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/res2net/cascade_mask_rcnn_r2_101_fpn_20e_coco/cascade_mask_rcnn_r2_101_fpn_20e_coco-8a7b41e1.pth + Paper: + URL: https://arxiv.org/abs/1904.01169 + Title: 'Res2Net for object detection and instance segmentation' + README: configs/res2net/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/res2net.py#L239 + Version: v2.1.0 + + - Name: htc_r2_101_fpn_20e_coco + In Collection: HTC + Config: configs/res2net/htc_r2_101_fpn_20e_coco.py + Metadata: + Epochs: 20 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Res2Net + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 41.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/res2net/htc_r2_101_fpn_20e_coco/htc_r2_101_fpn_20e_coco-3a8d2112.pth + Paper: + URL: https://arxiv.org/abs/1904.01169 + Title: 'Res2Net for object detection and instance segmentation' + README: configs/res2net/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.1.0/mmdet/models/backbones/res2net.py#L239 + Version: v2.1.0 diff --git a/configs/resnest/README.md b/configs/resnest/README.md new file mode 100644 index 0000000..3676e56 --- /dev/null +++ b/configs/resnest/README.md @@ -0,0 +1,54 @@ +# ResNeSt + +> [ResNeSt: Split-Attention Networks](https://arxiv.org/abs/2004.08955) + + + +## Abstract + +It is well known that featuremap attention and multi-path representation are important for visual recognition. In this paper, we present a modularized architecture, which applies the channel-wise attention on different network branches to leverage their success in capturing cross-feature interactions and learning diverse representations. Our design results in a simple and unified computation block, which can be parameterized using only a few variables. Our model, named ResNeSt, outperforms EfficientNet in accuracy and latency trade-off on image classification. In addition, ResNeSt has achieved superior transfer learning results on several public benchmarks serving as the backbone, and has been adopted by the winning entries of COCO-LVIS challenge. + +
+ +
+ +## Results and Models + +### Faster R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :-------: | :-----: | :-----: | :------: | :------------: | :----: | :------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| S-50-FPN | pytorch | 1x | 4.8 | - | 42.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/resnest/faster_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/resnest/faster_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco/faster_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco_20200926_125502-20289c16.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/resnest/faster_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco/faster_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco-20200926_125502.log.json) | +| S-101-FPN | pytorch | 1x | 7.1 | - | 44.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/resnest/faster_rcnn_s101_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/resnest/faster_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco/faster_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco_20201006_021058-421517f1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/resnest/faster_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco/faster_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco-20201006_021058.log.json) | + +### Mask R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :----------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| S-50-FPN | pytorch | 1x | 5.5 | - | 42.6 | 38.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/resnest/mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/resnest/mask_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco/mask_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco_20200926_125503-8a2c3d47.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/resnest/mask_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco/mask_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco-20200926_125503.log.json) | +| S-101-FPN | pytorch | 1x | 7.8 | - | 45.2 | 40.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/resnest/mask_rcnn_s101_fpn_syncbn-backbone+head_mstrain_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/resnest/mask_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco/mask_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco_20201005_215831-af60cdf9.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/resnest/mask_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco/mask_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco-20201005_215831.log.json) | + +### Cascade R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :-------: | :-----: | :-----: | :------: | :------------: | :----: | :-------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| S-50-FPN | pytorch | 1x | - | - | 44.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/resnest/cascade_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/resnest/cascade_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco/cascade_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco_20201122_213640-763cc7b5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/resnest/cascade_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco/cascade_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco-20201005_113242.log.json) | +| S-101-FPN | pytorch | 1x | 8.4 | - | 46.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/resnest/cascade_rcnn_s101_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/resnest/cascade_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco/cascade_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco_20201005_113242-b9459f8f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/resnest/cascade_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco/cascade_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco-20201122_213640.log.json) | + +### Cascade Mask R-CNN + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| S-50-FPN | pytorch | 1x | - | - | 45.4 | 39.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/resnest/cascade_mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/resnest/cascade_mask_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco/cascade_mask_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco_20201122_104428-99eca4c7.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/resnest/cascade_mask_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco/cascade_mask_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco-20201122_104428.log.json) | +| S-101-FPN | pytorch | 1x | 10.5 | - | 47.7 | 41.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/resnest/cascade_mask_rcnn_s101_fpn_syncbn-backbone+head_mstrain_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/resnest/cascade_mask_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco/cascade_mask_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco_20201005_113243-42607475.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/resnest/cascade_mask_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco/cascade_mask_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco-20201005_113243.log.json) | + +## Citation + +```latex +@article{zhang2020resnest, +title={ResNeSt: Split-Attention Networks}, +author={Zhang, Hang and Wu, Chongruo and Zhang, Zhongyue and Zhu, Yi and Zhang, Zhi and Lin, Haibin and Sun, Yue and He, Tong and Muller, Jonas and Manmatha, R. and Li, Mu and Smola, Alexander}, +journal={arXiv preprint arXiv:2004.08955}, +year={2020} +} +``` diff --git a/configs/resnest/cascade_mask_rcnn_s101_fpn_syncbn-backbone+head_mstrain_1x_coco.py b/configs/resnest/cascade_mask_rcnn_s101_fpn_syncbn-backbone+head_mstrain_1x_coco.py new file mode 100644 index 0000000..406f39d --- /dev/null +++ b/configs/resnest/cascade_mask_rcnn_s101_fpn_syncbn-backbone+head_mstrain_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './cascade_mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco.py' +model = dict( + backbone=dict( + stem_channels=128, + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='open-mmlab://resnest101'))) diff --git a/configs/resnest/cascade_mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco.py b/configs/resnest/cascade_mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco.py new file mode 100644 index 0000000..83d7537 --- /dev/null +++ b/configs/resnest/cascade_mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco.py @@ -0,0 +1,118 @@ +_base_ = '../cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + backbone=dict( + type='ResNeSt', + stem_channels=64, + depth=50, + radix=2, + reduction_factor=4, + avg_down_stride=True, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='open-mmlab://resnest50')), + roi_head=dict( + bbox_head=[ + dict( + type='Shared4Conv1FCBBoxHead', + in_channels=256, + conv_out_channels=256, + fc_out_channels=1024, + norm_cfg=norm_cfg, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared4Conv1FCBBoxHead', + in_channels=256, + conv_out_channels=256, + fc_out_channels=1024, + norm_cfg=norm_cfg, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.05, 0.05, 0.1, 0.1]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared4Conv1FCBBoxHead', + in_channels=256, + conv_out_channels=256, + fc_out_channels=1024, + norm_cfg=norm_cfg, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.033, 0.033, 0.067, 0.067]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)) + ], + mask_head=dict(norm_cfg=norm_cfg))) +# # use ResNeSt img_norm +img_norm_cfg = dict( + mean=[123.68, 116.779, 103.939], std=[58.393, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', + with_bbox=True, + with_mask=True, + poly2mask=False), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/resnest/cascade_rcnn_s101_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py b/configs/resnest/cascade_rcnn_s101_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py new file mode 100644 index 0000000..0a7476a --- /dev/null +++ b/configs/resnest/cascade_rcnn_s101_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './cascade_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py' +model = dict( + backbone=dict( + stem_channels=128, + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='open-mmlab://resnest101'))) diff --git a/configs/resnest/cascade_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py b/configs/resnest/cascade_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py new file mode 100644 index 0000000..6ed7730 --- /dev/null +++ b/configs/resnest/cascade_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py @@ -0,0 +1,116 @@ +_base_ = '../cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + backbone=dict( + type='ResNeSt', + stem_channels=64, + depth=50, + radix=2, + reduction_factor=4, + avg_down_stride=True, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='open-mmlab://resnest50')), + roi_head=dict( + bbox_head=[ + dict( + type='Shared4Conv1FCBBoxHead', + in_channels=256, + conv_out_channels=256, + fc_out_channels=1024, + norm_cfg=norm_cfg, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared4Conv1FCBBoxHead', + in_channels=256, + conv_out_channels=256, + fc_out_channels=1024, + norm_cfg=norm_cfg, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.05, 0.05, 0.1, 0.1]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared4Conv1FCBBoxHead', + in_channels=256, + conv_out_channels=256, + fc_out_channels=1024, + norm_cfg=norm_cfg, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.033, 0.033, 0.067, 0.067]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)) + ], )) +# # use ResNeSt img_norm +img_norm_cfg = dict( + mean=[123.68, 116.779, 103.939], std=[58.393, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', + with_bbox=True, + with_mask=False, + poly2mask=False), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/resnest/faster_rcnn_s101_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py b/configs/resnest/faster_rcnn_s101_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py new file mode 100644 index 0000000..40a2f1f --- /dev/null +++ b/configs/resnest/faster_rcnn_s101_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './faster_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py' +model = dict( + backbone=dict( + stem_channels=128, + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='open-mmlab://resnest101'))) diff --git a/configs/resnest/faster_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py b/configs/resnest/faster_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py new file mode 100644 index 0000000..eb1ecd2 --- /dev/null +++ b/configs/resnest/faster_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py @@ -0,0 +1,62 @@ +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + backbone=dict( + type='ResNeSt', + stem_channels=64, + depth=50, + radix=2, + reduction_factor=4, + avg_down_stride=True, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='open-mmlab://resnest50')), + roi_head=dict( + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + conv_out_channels=256, + norm_cfg=norm_cfg))) +# # use ResNeSt img_norm +img_norm_cfg = dict( + mean=[123.68, 116.779, 103.939], std=[58.393, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', + with_bbox=True, + with_mask=False, + poly2mask=False), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/resnest/mask_rcnn_s101_fpn_syncbn-backbone+head_mstrain_1x_coco.py b/configs/resnest/mask_rcnn_s101_fpn_syncbn-backbone+head_mstrain_1x_coco.py new file mode 100644 index 0000000..c882ba1 --- /dev/null +++ b/configs/resnest/mask_rcnn_s101_fpn_syncbn-backbone+head_mstrain_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco.py' +model = dict( + backbone=dict( + stem_channels=128, + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='open-mmlab://resnest101'))) diff --git a/configs/resnest/mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco.py b/configs/resnest/mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco.py new file mode 100644 index 0000000..4e50dea --- /dev/null +++ b/configs/resnest/mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco.py @@ -0,0 +1,64 @@ +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +norm_cfg = dict(type='SyncBN', requires_grad=True) +model = dict( + backbone=dict( + type='ResNeSt', + stem_channels=64, + depth=50, + radix=2, + reduction_factor=4, + avg_down_stride=True, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=norm_cfg, + norm_eval=False, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='open-mmlab://resnest50')), + roi_head=dict( + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + conv_out_channels=256, + norm_cfg=norm_cfg), + mask_head=dict(norm_cfg=norm_cfg))) +# # use ResNeSt img_norm +img_norm_cfg = dict( + mean=[123.68, 116.779, 103.939], std=[58.393, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', + with_bbox=True, + with_mask=True, + poly2mask=False), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/resnest/metafile.yml b/configs/resnest/metafile.yml new file mode 100644 index 0000000..cfeec71 --- /dev/null +++ b/configs/resnest/metafile.yml @@ -0,0 +1,230 @@ +Models: + - Name: faster_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco + In Collection: Faster R-CNN + Config: configs/resnest/faster_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py + Metadata: + Training Memory (GB): 4.8 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - ResNeSt + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/resnest/faster_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco/faster_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco_20200926_125502-20289c16.pth + Paper: + URL: https://arxiv.org/abs/2004.08955 + Title: 'ResNeSt: Split-Attention Networks' + README: configs/resnest/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.7.0/mmdet/models/backbones/resnest.py#L273 + Version: v2.7.0 + + - Name: faster_rcnn_s101_fpn_syncbn-backbone+head_mstrain-range_1x_coco + In Collection: Faster R-CNN + Config: configs/resnest/faster_rcnn_s101_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py + Metadata: + Training Memory (GB): 7.1 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - ResNeSt + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/resnest/faster_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco/faster_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco_20201006_021058-421517f1.pth + Paper: + URL: https://arxiv.org/abs/2004.08955 + Title: 'ResNeSt: Split-Attention Networks' + README: configs/resnest/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.7.0/mmdet/models/backbones/resnest.py#L273 + Version: v2.7.0 + + - Name: mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco + In Collection: Mask R-CNN + Config: configs/resnest/mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco.py + Metadata: + Training Memory (GB): 5.5 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - ResNeSt + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/resnest/mask_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco/mask_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco_20200926_125503-8a2c3d47.pth + Paper: + URL: https://arxiv.org/abs/2004.08955 + Title: 'ResNeSt: Split-Attention Networks' + README: configs/resnest/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.7.0/mmdet/models/backbones/resnest.py#L273 + Version: v2.7.0 + + - Name: mask_rcnn_s101_fpn_syncbn-backbone+head_mstrain_1x_coco + In Collection: Mask R-CNN + Config: configs/resnest/mask_rcnn_s101_fpn_syncbn-backbone+head_mstrain_1x_coco.py + Metadata: + Training Memory (GB): 7.8 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - ResNeSt + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/resnest/mask_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco/mask_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco_20201005_215831-af60cdf9.pth + Paper: + URL: https://arxiv.org/abs/2004.08955 + Title: 'ResNeSt: Split-Attention Networks' + README: configs/resnest/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.7.0/mmdet/models/backbones/resnest.py#L273 + Version: v2.7.0 + + - Name: cascade_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco + In Collection: Cascade R-CNN + Config: configs/resnest/cascade_rcnn_s50_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py + Metadata: + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - ResNeSt + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/resnest/cascade_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco/cascade_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco_20201122_213640-763cc7b5.pth + Paper: + URL: https://arxiv.org/abs/2004.08955 + Title: 'ResNeSt: Split-Attention Networks' + README: configs/resnest/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.7.0/mmdet/models/backbones/resnest.py#L273 + Version: v2.7.0 + + - Name: cascade_rcnn_s101_fpn_syncbn-backbone+head_mstrain-range_1x_coco + In Collection: Cascade R-CNN + Config: configs/resnest/cascade_rcnn_s101_fpn_syncbn-backbone+head_mstrain-range_1x_coco.py + Metadata: + Training Memory (GB): 8.4 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - ResNeSt + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/resnest/cascade_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco/cascade_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain-range_1x_coco_20201005_113242-b9459f8f.pth + Paper: + URL: https://arxiv.org/abs/2004.08955 + Title: 'ResNeSt: Split-Attention Networks' + README: configs/resnest/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.7.0/mmdet/models/backbones/resnest.py#L273 + Version: v2.7.0 + + - Name: cascade_mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco + In Collection: Cascade R-CNN + Config: configs/resnest/cascade_mask_rcnn_s50_fpn_syncbn-backbone+head_mstrain_1x_coco.py + Metadata: + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - ResNeSt + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.4 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/resnest/cascade_mask_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco/cascade_mask_rcnn_s50_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco_20201122_104428-99eca4c7.pth + Paper: + URL: https://arxiv.org/abs/2004.08955 + Title: 'ResNeSt: Split-Attention Networks' + README: configs/resnest/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.7.0/mmdet/models/backbones/resnest.py#L273 + Version: v2.7.0 + + - Name: cascade_mask_rcnn_s101_fpn_syncbn-backbone+head_mstrain_1x_coco + In Collection: Cascade R-CNN + Config: configs/resnest/cascade_mask_rcnn_s101_fpn_syncbn-backbone+head_mstrain_1x_coco.py + Metadata: + Training Memory (GB): 10.5 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - ResNeSt + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 41.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/resnest/cascade_mask_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco/cascade_mask_rcnn_s101_fpn_syncbn-backbone%2Bhead_mstrain_1x_coco_20201005_113243-42607475.pth + Paper: + URL: https://arxiv.org/abs/2004.08955 + Title: 'ResNeSt: Split-Attention Networks' + README: configs/resnest/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.7.0/mmdet/models/backbones/resnest.py#L273 + Version: v2.7.0 diff --git a/configs/resnet_strikes_back/README.md b/configs/resnet_strikes_back/README.md new file mode 100644 index 0000000..dd00b20 --- /dev/null +++ b/configs/resnet_strikes_back/README.md @@ -0,0 +1,40 @@ +# ResNet strikes back + +> [ResNet strikes back: An improved training procedure in timm](https://arxiv.org/abs/2110.00476) + + + +## Abstract + +The influential Residual Networks designed by He et al. remain the gold-standard architecture in numerous scientific publications. They typically serve as the default architecture in studies, or as baselines when new architectures are proposed. Yet there has been significant progress on best practices for training neural networks since the inception of the ResNet architecture in 2015. Novel optimization & dataaugmentation have increased the effectiveness of the training recipes. + +In this paper, we re-evaluate the performance of the vanilla ResNet-50 when trained with a procedure that integrates such advances. We share competitive training settings and pre-trained models in the timm open-source library, with the hope that they will serve as better baselines for future work. For instance, with our more demanding training setting, a vanilla ResNet-50 reaches 80.4% top-1 accuracy at resolution 224×224 on ImageNet-val without extra data or distillation. We also report the performance achieved with popular models with our training procedure. + +
+ +
+ +## Results and Models + +| Method | Backbone | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :----------------: | :------: | :-----: | :------: | :------------: | :---------: | :---------: | :-----------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Faster R-CNN | R-50 rsb | 1x | 3.9 | - | 40.8 (+3.4) | - | [Config](./faster_rcnn_r50_fpn_rsb-pretrain_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/resnet_strikes_back/faster_rcnn_r50_fpn_rsb-pretrain_1x_coco/faster_rcnn_r50_fpn_rsb-pretrain_1x_coco_20220113_162229-32ae82a9.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/resnet_strikes_back/faster_rcnn_r50_fpn_rsb-pretrain_1x_coco/faster_rcnn_r50_fpn_rsb-pretrain_1x_coco_20220113_162229.log.json) | +| Mask R-CNN | R-50 rsb | 1x | 4.5 | - | 41.2 (+3.0) | 38.2 (+3.0) | [Config](./mask_rcnn_r50_fpn_rsb-pretrain_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/resnet_strikes_back/mask_rcnn_r50_fpn_rsb-pretrain_1x_coco/mask_rcnn_r50_fpn_rsb-pretrain_1x_coco_20220113_174054-06ce8ba0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/resnet_strikes_back/mask_rcnn_r50_fpn_rsb-pretrain_1x_coco/mask_rcnn_r50_fpn_rsb-pretrain_1x_coco_20220113_174054.log.json) | +| Cascade Mask R-CNN | R-50 rsb | 1x | 6.2 | - | 44.8 (+3.6) | 39.9 (+3.6) | [Config](./cascade_mask_rcnn_r50_fpn_rsb-pretrain_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/resnet_strikes_back/cascade_mask_rcnn_r50_fpn_rsb-pretrain_1x_coco/cascade_mask_rcnn_r50_fpn_rsb-pretrain_1x_coco_20220113_193636-8b9ad50f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/resnet_strikes_back/cascade_mask_rcnn_r50_fpn_rsb-pretrain_1x_coco/cascade_mask_rcnn_r50_fpn_rsb-pretrain_1x_coco_20220113_193636.log.json) | +| RetinaNet | R-50 rsb | 1x | 3.8 | - | 39.0 (+2.5) | - | [Config](./retinanet_r50_fpn_rsb-pretrain_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/resnet_strikes_back/retinanet_r50_fpn_rsb-pretrain_1x_coco/retinanet_r50_fpn_rsb-pretrain_1x_coco_20220113_175432-bd24aae9.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/resnet_strikes_back/retinanet_r50_fpn_rsb-pretrain_1x_coco/retinanet_r50_fpn_rsb-pretrain_1x_coco_20220113_175432.log.json) | + +**Notes:** + +- 'rsb' is short for 'resnet strikes back' +- We have done some grid searches on learning rate and weight decay and get these optimal hyper-parameters. + +## Citation + +```latex +@article{wightman2021resnet, +title={Resnet strikes back: An improved training procedure in timm}, +author={Ross Wightman, Hugo Touvron, Hervé Jégou}, +journal={arXiv preprint arXiv:2110.00476}, +year={2021} +} +``` diff --git a/configs/resnet_strikes_back/cascade_mask_rcnn_r50_fpn_rsb-pretrain_1x_coco.py b/configs/resnet_strikes_back/cascade_mask_rcnn_r50_fpn_rsb-pretrain_1x_coco.py new file mode 100644 index 0000000..8b601f0 --- /dev/null +++ b/configs/resnet_strikes_back/cascade_mask_rcnn_r50_fpn_rsb-pretrain_1x_coco.py @@ -0,0 +1,18 @@ +_base_ = [ + '../_base_/models/cascade_mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb256-rsb-a1-600e_in1k_20211228-20e21305.pth' # noqa +model = dict( + backbone=dict( + init_cfg=dict( + type='Pretrained', prefix='backbone.', checkpoint=checkpoint))) + +optimizer = dict( + _delete_=True, + type='AdamW', + lr=0.0002, + weight_decay=0.05, + paramwise_cfg=dict(norm_decay_mult=0., bypass_duplicate=True)) diff --git a/configs/resnet_strikes_back/faster_rcnn_r50_fpn_rsb-pretrain_1x_coco.py b/configs/resnet_strikes_back/faster_rcnn_r50_fpn_rsb-pretrain_1x_coco.py new file mode 100644 index 0000000..fe86684 --- /dev/null +++ b/configs/resnet_strikes_back/faster_rcnn_r50_fpn_rsb-pretrain_1x_coco.py @@ -0,0 +1,18 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb256-rsb-a1-600e_in1k_20211228-20e21305.pth' # noqa +model = dict( + backbone=dict( + init_cfg=dict( + type='Pretrained', prefix='backbone.', checkpoint=checkpoint))) + +optimizer = dict( + _delete_=True, + type='AdamW', + lr=0.0002, + weight_decay=0.05, + paramwise_cfg=dict(norm_decay_mult=0., bypass_duplicate=True)) diff --git a/configs/resnet_strikes_back/mask_rcnn_r50_fpn_rsb-pretrain_1x_coco.py b/configs/resnet_strikes_back/mask_rcnn_r50_fpn_rsb-pretrain_1x_coco.py new file mode 100644 index 0000000..321d98e --- /dev/null +++ b/configs/resnet_strikes_back/mask_rcnn_r50_fpn_rsb-pretrain_1x_coco.py @@ -0,0 +1,18 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb256-rsb-a1-600e_in1k_20211228-20e21305.pth' # noqa +model = dict( + backbone=dict( + init_cfg=dict( + type='Pretrained', prefix='backbone.', checkpoint=checkpoint))) + +optimizer = dict( + _delete_=True, + type='AdamW', + lr=0.0002, + weight_decay=0.05, + paramwise_cfg=dict(norm_decay_mult=0., bypass_duplicate=True)) diff --git a/configs/resnet_strikes_back/metafile.yml b/configs/resnet_strikes_back/metafile.yml new file mode 100644 index 0000000..4c85a16 --- /dev/null +++ b/configs/resnet_strikes_back/metafile.yml @@ -0,0 +1,116 @@ +Models: + - Name: faster_rcnn_r50_fpn_rsb-pretrain_1x_coco + In Collection: Faster R-CNN + Config: configs/resnet_strikes_back/faster_rcnn_r50_fpn_rsb-pretrain_1x_coco.py + Metadata: + Training Memory (GB): 3.9 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - ResNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/resnet_strikes_back/faster_rcnn_r50_fpn_rsb-pretrain_1x_coco/faster_rcnn_r50_fpn_rsb-pretrain_1x_coco_20220113_162229-32ae82a9.pth + Paper: + URL: https://arxiv.org/abs/2110.00476 + Title: 'ResNet strikes back: An improved training procedure in timm' + README: configs/resnet_strikes_back/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.22.0/configs/resnet_strikes_back/README.md + Version: v2.22.0 + + - Name: cascade_mask_rcnn_r50_fpn_rsb-pretrain_1x_coco + In Collection: Cascade R-CNN + Config: configs/resnet_strikes_back/cascade_mask_rcnn_r50_fpn_rsb-pretrain_1x_coco.py + Metadata: + Training Memory (GB): 6.2 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - ResNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/resnet_strikes_back/cascade_mask_rcnn_r50_fpn_rsb-pretrain_1x_coco/cascade_mask_rcnn_r50_fpn_rsb-pretrain_1x_coco_20220113_193636-8b9ad50f.pth + Paper: + URL: https://arxiv.org/abs/2110.00476 + Title: 'ResNet strikes back: An improved training procedure in timm' + README: configs/resnet_strikes_back/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.22.0/configs/resnet_strikes_back/README.md + Version: v2.22.0 + + - Name: retinanet_r50_fpn_rsb-pretrain_1x_coco + In Collection: RetinaNet + Config: configs/resnet_strikes_back/retinanet_r50_fpn_rsb-pretrain_1x_coco.py + Metadata: + Training Memory (GB): 3.8 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - ResNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/resnet_strikes_back/retinanet_r50_fpn_rsb-pretrain_1x_coco/retinanet_r50_fpn_rsb-pretrain_1x_coco_20220113_175432-bd24aae9.pth + Paper: + URL: https://arxiv.org/abs/2110.00476 + Title: 'ResNet strikes back: An improved training procedure in timm' + README: configs/resnet_strikes_back/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.22.0/configs/resnet_strikes_back/README.md + Version: v2.22.0 + + - Name: mask_rcnn_r50_fpn_rsb-pretrain_1x_coco + In Collection: Mask R-CNN + Config: configs/resnet_strikes_back/mask_rcnn_r50_fpn_rsb-pretrain_1x_coco.py + Metadata: + Training Memory (GB): 4.5 + Epochs: 12 + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - ResNet + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/resnet_strikes_back/mask_rcnn_r50_fpn_rsb-pretrain_1x_coco/mask_rcnn_r50_fpn_rsb-pretrain_1x_coco_20220113_174054-06ce8ba0.pth + Paper: + URL: https://arxiv.org/abs/2110.00476 + Title: 'ResNet strikes back: An improved training procedure in timm' + README: configs/resnet_strikes_back/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.22.0/configs/resnet_strikes_back/README.md + Version: v2.22.0 diff --git a/configs/resnet_strikes_back/retinanet_r50_fpn_rsb-pretrain_1x_coco.py b/configs/resnet_strikes_back/retinanet_r50_fpn_rsb-pretrain_1x_coco.py new file mode 100644 index 0000000..480697a --- /dev/null +++ b/configs/resnet_strikes_back/retinanet_r50_fpn_rsb-pretrain_1x_coco.py @@ -0,0 +1,18 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +checkpoint = 'https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_8xb256-rsb-a1-600e_in1k_20211228-20e21305.pth' # noqa +model = dict( + backbone=dict( + init_cfg=dict( + type='Pretrained', prefix='backbone.', checkpoint=checkpoint))) + +optimizer = dict( + _delete_=True, + type='AdamW', + lr=0.0001, + weight_decay=0.05, + paramwise_cfg=dict(norm_decay_mult=0., bypass_duplicate=True)) diff --git a/configs/retinanet/README.md b/configs/retinanet/README.md new file mode 100644 index 0000000..b9e0a2a --- /dev/null +++ b/configs/retinanet/README.md @@ -0,0 +1,53 @@ +# RetinaNet + +> [Focal Loss for Dense Object Detection](https://arxiv.org/abs/1708.02002) + + + +## Abstract + +The highest accuracy object detectors to date are based on a two-stage approach popularized by R-CNN, where a classifier is applied to a sparse set of candidate object locations. In contrast, one-stage detectors that are applied over a regular, dense sampling of possible object locations have the potential to be faster and simpler, but have trailed the accuracy of two-stage detectors thus far. In this paper, we investigate why this is the case. We discover that the extreme foreground-background class imbalance encountered during training of dense detectors is the central cause. We propose to address this class imbalance by reshaping the standard cross entropy loss such that it down-weights the loss assigned to well-classified examples. Our novel Focal Loss focuses training on a sparse set of hard examples and prevents the vast number of easy negatives from overwhelming the detector during training. To evaluate the effectiveness of our loss, we design and train a simple dense detector we call RetinaNet. Our results show that when trained with the focal loss, RetinaNet is able to match the speed of previous one-stage detectors while surpassing the accuracy of all existing state-of-the-art two-stage detectors. + +
+ +
+ +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :-------------: | :-----: | :----------: | :------: | :------------: | :----: | :-------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-18-FPN | pytorch | 1x | 1.7 | | 31.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet/retinanet_r18_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r18_fpn_1x_coco/retinanet_r18_fpn_1x_coco_20220407_171055-614fd399.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r18_fpn_1x_coco/retinanet_r18_fpn_1x_coco_20220407_171055.log.json) | +| R-18-FPN | pytorch | 1x(1 x 8 BS) | 5.0 | | 31.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet/retinanet_r18_fpn_1x8_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r18_fpn_1x8_1x_coco/retinanet_r18_fpn_1x8_1x_coco_20220407_171255-4ea310d7.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r18_fpn_1x8_1x_coco/retinanet_r18_fpn_1x8_1x_coco_20220407_171255.log.json) | +| R-50-FPN | caffe | 1x | 3.5 | 18.6 | 36.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet/retinanet_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r50_caffe_fpn_1x_coco/retinanet_r50_caffe_fpn_1x_coco_20200531-f11027c5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r50_caffe_fpn_1x_coco/retinanet_r50_caffe_fpn_1x_coco_20200531_012518.log.json) | +| R-50-FPN | pytorch | 1x | 3.8 | 19.0 | 36.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet/retinanet_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r50_fpn_1x_coco/retinanet_r50_fpn_1x_coco_20200130-c2398f9e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r50_fpn_1x_coco/retinanet_r50_fpn_1x_coco_20200130_002941.log.json) | +| R-50-FPN (FP16) | pytorch | 1x | 2.8 | 31.6 | 36.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet/retinanet_r50_fpn_fp16_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/fp16/retinanet_r50_fpn_fp16_1x_coco/retinanet_r50_fpn_fp16_1x_coco_20200702-0dbfb212.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/fp16/retinanet_r50_fpn_fp16_1x_coco/retinanet_r50_fpn_fp16_1x_coco_20200702_020127.log.json) | +| R-50-FPN | pytorch | 2x | - | - | 37.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet/retinanet_r50_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r50_fpn_2x_coco/retinanet_r50_fpn_2x_coco_20200131-fdb43119.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r50_fpn_2x_coco/retinanet_r50_fpn_2x_coco_20200131_114738.log.json) | +| R-101-FPN | caffe | 1x | 5.5 | 14.7 | 38.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet/retinanet_r101_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r101_caffe_fpn_1x_coco/retinanet_r101_caffe_fpn_1x_coco_20200531-b428fa0f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r101_caffe_fpn_1x_coco/retinanet_r101_caffe_fpn_1x_coco_20200531_012536.log.json) | +| R-101-FPN | pytorch | 1x | 5.7 | 15.0 | 38.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet/retinanet_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r101_fpn_1x_coco/retinanet_r101_fpn_1x_coco_20200130-7a93545f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r101_fpn_1x_coco/retinanet_r101_fpn_1x_coco_20200130_003055.log.json) | +| R-101-FPN | pytorch | 2x | - | - | 38.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet/retinanet_r101_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r101_fpn_2x_coco/retinanet_r101_fpn_2x_coco_20200131-5560aee8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r101_fpn_2x_coco/retinanet_r101_fpn_2x_coco_20200131_114859.log.json) | +| X-101-32x4d-FPN | pytorch | 1x | 7.0 | 12.1 | 39.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet/retinanet_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_x101_32x4d_fpn_1x_coco/retinanet_x101_32x4d_fpn_1x_coco_20200130-5c8b7ec4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_x101_32x4d_fpn_1x_coco/retinanet_x101_32x4d_fpn_1x_coco_20200130_003004.log.json) | +| X-101-32x4d-FPN | pytorch | 2x | - | - | 40.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet/retinanet_x101_32x4d_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_x101_32x4d_fpn_2x_coco/retinanet_x101_32x4d_fpn_2x_coco_20200131-237fc5e1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_x101_32x4d_fpn_2x_coco/retinanet_x101_32x4d_fpn_2x_coco_20200131_114812.log.json) | +| X-101-64x4d-FPN | pytorch | 1x | 10.0 | 8.7 | 41.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet/retinanet_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_x101_64x4d_fpn_1x_coco/retinanet_x101_64x4d_fpn_1x_coco_20200130-366f5af1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_x101_64x4d_fpn_1x_coco/retinanet_x101_64x4d_fpn_1x_coco_20200130_003008.log.json) | +| X-101-64x4d-FPN | pytorch | 2x | - | - | 40.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet/retinanet_x101_64x4d_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_x101_64x4d_fpn_2x_coco/retinanet_x101_64x4d_fpn_2x_coco_20200131-bca068ab.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_x101_64x4d_fpn_2x_coco/retinanet_x101_64x4d_fpn_2x_coco_20200131_114833.log.json) | + +## Pre-trained Models + +We also train some models with longer schedules and multi-scale training. The users could finetune them for downstream tasks. + +| Backbone | Style | Lr schd | Mem (GB) | box AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :----: | :-----------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | 3x | 3.5 | 39.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet/retinanet_r50_fpn_mstrain_640-800_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r50_fpn_mstrain_3x_coco/retinanet_r50_fpn_mstrain_3x_coco_20210718_220633-88476508.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r50_fpn_mstrain_3x_coco/retinanet_r50_fpn_mstrain_3x_coco_20210718_220633-88476508.log.json) | +| R-101-FPN | caffe | 3x | 5.4 | 40.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet/retinanet_r101_caffe_fpn_mstrain_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r101_caffe_fpn_mstrain_3x_coco/retinanet_r101_caffe_fpn_mstrain_3x_coco_20210721_063439-88a8a944.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r101_caffe_fpn_mstrain_3x_coco/retinanet_r101_caffe_fpn_mstrain_3x_coco_20210721_063439-88a8a944.log.json) | +| R-101-FPN | pytorch | 3x | 5.4 | 41 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet/retinanet_r101_fpn_mstrain_640-800_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r101_fpn_mstrain_3x_coco/retinanet_r101_fpn_mstrain_3x_coco_20210720_214650-7ee888e0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r101_fpn_mstrain_3x_coco/retinanet_r101_fpn_mstrain_3x_coco_20210720_214650-7ee888e0.log.json) | +| X-101-64x4d-FPN | pytorch | 3x | 9.8 | 41.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet/retinanet_x101_64x4d_fpn_mstrain_640-800_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_x101_64x4d_fpn_mstrain_3x_coco/retinanet_x101_64x4d_fpn_mstrain_3x_coco_20210719_051838-022c2187.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_x101_64x4d_fpn_mstrain_3x_coco/retinanet_x101_64x4d_fpn_mstrain_3x_coco_20210719_051838-022c2187.log.json) | + +## Citation + +```latex +@inproceedings{lin2017focal, + title={Focal loss for dense object detection}, + author={Lin, Tsung-Yi and Goyal, Priya and Girshick, Ross and He, Kaiming and Doll{\'a}r, Piotr}, + booktitle={Proceedings of the IEEE international conference on computer vision}, + year={2017} +} +``` diff --git a/configs/retinanet/ascend_retinanet_r18_fpn_1x8_1x_coco.py b/configs/retinanet/ascend_retinanet_r18_fpn_1x8_1x_coco.py new file mode 100644 index 0000000..8643c60 --- /dev/null +++ b/configs/retinanet/ascend_retinanet_r18_fpn_1x8_1x_coco.py @@ -0,0 +1,23 @@ +_base_ = [ + '../_base_/models/ascend_retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +# data +data = dict(samples_per_gpu=8) + +# optimizer +model = dict( + backbone=dict( + depth=18, + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet18')), + neck=dict(in_channels=[64, 128, 256, 512])) + +# Note: If the learning rate is set to 0.0025, the mAP will be 32.4. +optimizer = dict(type='SGD', lr=0.005, momentum=0.9, weight_decay=0.0001) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (1 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=8) diff --git a/configs/retinanet/metafile.yml b/configs/retinanet/metafile.yml new file mode 100644 index 0000000..8751cbb --- /dev/null +++ b/configs/retinanet/metafile.yml @@ -0,0 +1,312 @@ +Collections: + - Name: RetinaNet + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Focal Loss + - FPN + - ResNet + Paper: + URL: https://arxiv.org/abs/1708.02002 + Title: "Focal Loss for Dense Object Detection" + README: configs/retinanet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/mmdet/models/detectors/retinanet.py#L6 + Version: v2.0.0 + +Models: + - Name: retinanet_r18_fpn_1x_coco + In Collection: RetinaNet + Config: configs/retinanet/retinanet_r18_fpn_1x_coco.py + Metadata: + Training Memory (GB): 1.7 + Training Resources: 8x V100 GPUs + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 31.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r18_fpn_1x_coco/retinanet_r18_fpn_1x_coco_20220407_171055-614fd399.pth + + - Name: retinanet_r18_fpn_1x8_1x_coco + In Collection: RetinaNet + Config: configs/retinanet/retinanet_r18_fpn_1x8_1x_coco.py + Metadata: + Training Memory (GB): 5.0 + Training Resources: 1x V100 GPUs + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 31.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r18_fpn_1x8_1x_coco/retinanet_r18_fpn_1x8_1x_coco_20220407_171255-4ea310d7.pth + + - Name: retinanet_r50_caffe_fpn_1x_coco + In Collection: RetinaNet + Config: configs/retinanet/retinanet_r50_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 3.5 + inference time (ms/im): + - value: 53.76 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 36.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r50_caffe_fpn_1x_coco/retinanet_r50_caffe_fpn_1x_coco_20200531-f11027c5.pth + + - Name: retinanet_r50_fpn_1x_coco + In Collection: RetinaNet + Config: configs/retinanet/retinanet_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 3.8 + inference time (ms/im): + - value: 52.63 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 36.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r50_fpn_1x_coco/retinanet_r50_fpn_1x_coco_20200130-c2398f9e.pth + + - Name: retinanet_r50_fpn_fp16_1x_coco + In Collection: RetinaNet + Config: configs/retinanet/retinanet_r50_fpn_fp16_1x_coco.py + Metadata: + Training Memory (GB): 2.8 + Training Techniques: + - SGD with Momentum + - Weight Decay + - Mixed Precision Training + inference time (ms/im): + - value: 31.65 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP16 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 36.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/fp16/retinanet_r50_fpn_fp16_1x_coco/retinanet_r50_fpn_fp16_1x_coco_20200702-0dbfb212.pth + + - Name: retinanet_r50_fpn_2x_coco + In Collection: RetinaNet + Config: configs/retinanet/retinanet_r50_fpn_2x_coco.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r50_fpn_2x_coco/retinanet_r50_fpn_2x_coco_20200131-fdb43119.pth + + - Name: retinanet_r50_fpn_mstrain_640-800_3x_coco + In Collection: RetinaNet + Config: configs/retinanet/retinanet_r50_fpn_mstrain_640-800_3x_coco.py + Metadata: + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r50_fpn_mstrain_3x_coco/retinanet_r50_fpn_mstrain_3x_coco_20210718_220633-88476508.pth + + - Name: retinanet_r101_caffe_fpn_1x_coco + In Collection: RetinaNet + Config: configs/retinanet/retinanet_r101_caffe_fpn_1x_coco.py + Metadata: + Training Memory (GB): 5.5 + inference time (ms/im): + - value: 68.03 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r101_caffe_fpn_1x_coco/retinanet_r101_caffe_fpn_1x_coco_20200531-b428fa0f.pth + + - Name: retinanet_r101_caffe_fpn_mstrain_3x_coco + In Collection: RetinaNet + Config: configs/retinanet/retinanet_r101_caffe_fpn_mstrain_3x_coco.py + Metadata: + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r101_caffe_fpn_mstrain_3x_coco/retinanet_r101_caffe_fpn_mstrain_3x_coco_20210721_063439-88a8a944.pth + + - Name: retinanet_r101_fpn_1x_coco + In Collection: RetinaNet + Config: configs/retinanet/retinanet_r101_fpn_1x_coco.py + Metadata: + Training Memory (GB): 5.7 + inference time (ms/im): + - value: 66.67 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r101_fpn_1x_coco/retinanet_r101_fpn_1x_coco_20200130-7a93545f.pth + + - Name: retinanet_r101_fpn_2x_coco + In Collection: RetinaNet + Config: configs/retinanet/retinanet_r101_fpn_2x_coco.py + Metadata: + Training Memory (GB): 5.7 + inference time (ms/im): + - value: 66.67 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r101_fpn_2x_coco/retinanet_r101_fpn_2x_coco_20200131-5560aee8.pth + + - Name: retinanet_r101_fpn_mstrain_640-800_3x_coco + In Collection: RetinaNet + Config: configs/retinanet/retinanet_r101_fpn_mstrain_640-800_3x_coco.py + Metadata: + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41 + Weights: https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r101_fpn_mstrain_3x_coco/retinanet_r101_fpn_mstrain_3x_coco_20210720_214650-7ee888e0.pth + + - Name: retinanet_x101_32x4d_fpn_1x_coco + In Collection: RetinaNet + Config: configs/retinanet/retinanet_x101_32x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.0 + inference time (ms/im): + - value: 82.64 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_x101_32x4d_fpn_1x_coco/retinanet_x101_32x4d_fpn_1x_coco_20200130-5c8b7ec4.pth + + - Name: retinanet_x101_32x4d_fpn_2x_coco + In Collection: RetinaNet + Config: configs/retinanet/retinanet_x101_32x4d_fpn_2x_coco.py + Metadata: + Training Memory (GB): 7.0 + inference time (ms/im): + - value: 82.64 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_x101_32x4d_fpn_2x_coco/retinanet_x101_32x4d_fpn_2x_coco_20200131-237fc5e1.pth + + - Name: retinanet_x101_64x4d_fpn_1x_coco + In Collection: RetinaNet + Config: configs/retinanet/retinanet_x101_64x4d_fpn_1x_coco.py + Metadata: + Training Memory (GB): 10.0 + inference time (ms/im): + - value: 114.94 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_x101_64x4d_fpn_1x_coco/retinanet_x101_64x4d_fpn_1x_coco_20200130-366f5af1.pth + + - Name: retinanet_x101_64x4d_fpn_2x_coco + In Collection: RetinaNet + Config: configs/retinanet/retinanet_x101_64x4d_fpn_2x_coco.py + Metadata: + Training Memory (GB): 10.0 + inference time (ms/im): + - value: 114.94 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_x101_64x4d_fpn_2x_coco/retinanet_x101_64x4d_fpn_2x_coco_20200131-bca068ab.pth + + - Name: retinanet_x101_64x4d_fpn_mstrain_640-800_3x_coco + In Collection: RetinaNet + Config: configs/retinanet/retinanet_x101_64x4d_fpn_mstrain_640-800_3x_coco.py + Metadata: + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_x101_64x4d_fpn_mstrain_3x_coco/retinanet_x101_64x4d_fpn_mstrain_3x_coco_20210719_051838-022c2187.pth diff --git a/configs/retinanet/retinanet_fpn_quant_general.py b/configs/retinanet/retinanet_fpn_quant_general.py new file mode 100644 index 0000000..f573014 --- /dev/null +++ b/configs/retinanet/retinanet_fpn_quant_general.py @@ -0,0 +1,39 @@ +trace_config = dict( + backbone_detail = dict( + input_concrete_args = dict(), + preserve_attr = ['arch_settings', 'avg_down', 'base_channels', 'conv_cfg', 'dcn', 'deep_stem', 'depth', 'dump_patches', 'feat_dim' + , 'frozen_stages', 'init_cfg', 'inplanes', 'is_init', 'norm_cfg', 'norm_eval', 'out_indices' + , 'plugins', 'res_layers', 'stage_block', 'stage_with_dcn', 'stem_channels', 'zero_init_residual', 'strides', 'with_cp', 'make_res_layer', 'make_stage_plugins'], + not_duplicated_prefixes = [], + further_detail = dict( + exclude_prefixes = [], + removed_quantizer_names = [], + specified_general_quantizers = [], + last_8bit_module = [] + )), + neck_detail = dict( + input_concrete_args = dict(in_num = 4), + preserve_attr = ['in_channels', 'init_cfg', 'is_init', 'l2_norm', 'no_norm_on_lateral', 'num_ins', 'num_outs', 'out_channels', 'relu_before_extra_convs', 'start_level', 'upsample_cfg'], + not_duplicated_prefixes = [], + further_detail = dict( + exclude_prefixes = [], + removed_quantizer_names = ['getitem_1_post_act_fake_quantizer','getitem_2_post_act_fake_quantizer'], # 因为这些输入已经被做过量化了 + specified_general_quantizers = ['getitem_1_post_act_fake_quantizer', 'getitem_2_post_act_fake_quantizer', 'getitem_3_post_act_fake_quantizer'], + last_8bit_module = [] + )), + bbox_head_detail = dict( + input_concrete_args = dict(in_num = 5), + preserve_attr = ['anchor_generator', 'assigner', 'bbox_coder', 'cls_out_channels', 'conv_cfg', 'dump_patches', 'feat_channels', 'fp16_enabled', + 'in_channels', 'init_cfg', 'is_init', 'norm_cfg', 'loss_bbox', 'loss_cls', 'num_anchors' + , 'num_base_priors', 'num_classes', 'prior_generator', 'reg_decoded_bbox', 'sampler', 'sampling', 'stacked_convs', 'test_cfg', 'train_cfg', 'use_sigmoid_cls' + + , 'simple_test', 'async_simple_test_rpn', 'aug_test', 'aug_test_bboxes', 'aug_test_rpn', 'forward_single', 'forward_train', 'get_anchors', 'get_bboxes', 'get_targets', 'loss', 'loss_single', 'merge_aug_bboxes', + 'simple_test_bboxes', 'simple_test_rpn', '_get_bboxes_single', '_bbox_post_process', 'get_anchors', '_get_targets_single'], + not_duplicated_prefixes = ['cls_convs', 'reg_convs', 'retina_cls', 'retina_reg'], + further_detail = dict( + exclude_prefixes = [], + removed_quantizer_names = ['getitem_3_post_act_fake_quantizer'], + qloss_flag = True, + specified_general_quantizers = [], + last_8bit_module = ['retina_cls', 'retina_reg'] + ))) \ No newline at end of file diff --git a/configs/retinanet/retinanet_r101_caffe_fpn_1x_coco.py b/configs/retinanet/retinanet_r101_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..56eaae2 --- /dev/null +++ b/configs/retinanet/retinanet_r101_caffe_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './retinanet_r50_caffe_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) diff --git a/configs/retinanet/retinanet_r101_caffe_fpn_mstrain_3x_coco.py b/configs/retinanet/retinanet_r101_caffe_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..b87295e --- /dev/null +++ b/configs/retinanet/retinanet_r101_caffe_fpn_mstrain_3x_coco.py @@ -0,0 +1,7 @@ +_base_ = './retinanet_r50_caffe_fpn_mstrain_1x_coco.py' +# learning policy +model = dict( + pretrained='open-mmlab://detectron2/resnet101_caffe', + backbone=dict(depth=101)) +lr_config = dict(step=[28, 34]) +runner = dict(type='EpochBasedRunner', max_epochs=36) diff --git a/configs/retinanet/retinanet_r101_fpn_1x_coco.py b/configs/retinanet/retinanet_r101_fpn_1x_coco.py new file mode 100644 index 0000000..a7f0600 --- /dev/null +++ b/configs/retinanet/retinanet_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './retinanet_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/retinanet/retinanet_r101_fpn_2x_coco.py b/configs/retinanet/retinanet_r101_fpn_2x_coco.py new file mode 100644 index 0000000..721112a --- /dev/null +++ b/configs/retinanet/retinanet_r101_fpn_2x_coco.py @@ -0,0 +1,6 @@ +_base_ = './retinanet_r50_fpn_2x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/retinanet/retinanet_r101_fpn_mstrain_640-800_3x_coco.py b/configs/retinanet/retinanet_r101_fpn_mstrain_640-800_3x_coco.py new file mode 100644 index 0000000..6bbcac4 --- /dev/null +++ b/configs/retinanet/retinanet_r101_fpn_mstrain_640-800_3x_coco.py @@ -0,0 +1,6 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', '../common/mstrain_3x_coco.py' +] +# optimizer +model = dict(pretrained='torchvision://resnet101', backbone=dict(depth=101)) +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/configs/retinanet/retinanet_r18_fpn_1x8_1x_coco.py b/configs/retinanet/retinanet_r18_fpn_1x8_1x_coco.py new file mode 100644 index 0000000..01a35f2 --- /dev/null +++ b/configs/retinanet/retinanet_r18_fpn_1x8_1x_coco.py @@ -0,0 +1,23 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +# data +data = dict(samples_per_gpu=8) + +# optimizer +model = dict( + backbone=dict( + depth=18, + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet18')), + neck=dict(in_channels=[64, 128, 256, 512])) + +# Note: If the learning rate is set to 0.0025, the mAP will be 32.4. +optimizer = dict(type='SGD', lr=0.005, momentum=0.9, weight_decay=0.0001) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (1 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=8) diff --git a/configs/retinanet/retinanet_r18_fpn_1x_coco.py b/configs/retinanet/retinanet_r18_fpn_1x_coco.py new file mode 100644 index 0000000..95797a2 --- /dev/null +++ b/configs/retinanet/retinanet_r18_fpn_1x_coco.py @@ -0,0 +1,24 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +# optimizer +model = dict( + backbone=dict( + depth=18, + init_cfg=dict(type='Pretrained', checkpoint='/workspace/whole_world/rdata/share/pretrained/checkpoints/resnet18-5c106cde.pth')), + neck=dict(in_channels=[64, 128, 256, 512])) +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +evaluation = dict(save_best='auto', interval=1, metric='bbox') +checkpoint_config = dict(interval=10) +data = dict( + samples_per_gpu=2, # 就是16 + workers_per_gpu=2, +) +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=8, norm_type=2)) diff --git a/configs/retinanet/retinanet_r18_fpn_1x_coco_quant_w2a2.py b/configs/retinanet/retinanet_r18_fpn_1x_coco_quant_w2a2.py new file mode 100644 index 0000000..e761e5f --- /dev/null +++ b/configs/retinanet/retinanet_r18_fpn_1x_coco_quant_w2a2.py @@ -0,0 +1,26 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn_no_freeze.py', + '../_base_/datasets/coco_detection.py', '../_base_/schedules/schedule_qat_w2a2.py' + , 'retinanet_fpn_quant_general.py', '../_base_/default_runtime.py' +] + +# optimizer +model = dict( + backbone=dict( + depth=18, + init_cfg=dict(type='Pretrained', checkpoint='/workspace/whole_world/rdata/share/pretrained/checkpoints/resnet18-5c106cde.pth')), + neck=dict(in_channels=[64, 128, 256, 512])) +# optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +evaluation = dict(save_best='auto', interval=10, dynamic_intervals=[(11, 1)],metric='bbox') +checkpoint_config = dict(interval=10) +data = dict( + samples_per_gpu=16, # 就是16 + workers_per_gpu=8, +) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) +load_from = '../long_used_pretrained/retinanet_r18_fpn_1x_coco_20220407_171055-614fd399.pth' +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=6, norm_type=2)) diff --git a/configs/retinanet/retinanet_r18_fpn_1x_coco_quant_w2a2_aqd.py b/configs/retinanet/retinanet_r18_fpn_1x_coco_quant_w2a2_aqd.py new file mode 100644 index 0000000..2ae83b4 --- /dev/null +++ b/configs/retinanet/retinanet_r18_fpn_1x_coco_quant_w2a2_aqd.py @@ -0,0 +1,26 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn_no_freeze.py', + '../_base_/datasets/coco_detection.py', '../_base_/schedules/schedule_qat_w2a2.py' + , 'retinanet_fpn_quant_general.py', '../_base_/default_runtime.py' +] + +# optimizer +model = dict( + backbone=dict( + depth=18, + init_cfg=dict(type='Pretrained', checkpoint='/workspace/whole_world/rdata/share/pretrained/checkpoints/resnet18-5c106cde.pth')), + neck=dict(in_channels=[64, 128, 256, 512])) +# optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +evaluation = dict(save_best='auto', interval=10, dynamic_intervals=[(11, 1)],metric='bbox') +checkpoint_config = dict(interval=10) +data = dict( + samples_per_gpu=8, # 就是16 + workers_per_gpu=8, +) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) +load_from = '/work_dirs/retinanet_r18_fpn_1x_coco_AQD/epoch_12.pth' +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=8, norm_type=2)) diff --git a/configs/retinanet/retinanet_r18_fpn_1x_coco_quant_w4a4.py b/configs/retinanet/retinanet_r18_fpn_1x_coco_quant_w4a4.py new file mode 100644 index 0000000..5511953 --- /dev/null +++ b/configs/retinanet/retinanet_r18_fpn_1x_coco_quant_w4a4.py @@ -0,0 +1,26 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn_no_freeze.py', + '../_base_/datasets/coco_detection.py', '../_base_/schedules/schedule_qat_w4a4.py' + , 'retinanet_fpn_quant_general.py', '../_base_/default_runtime.py' +] + +# optimizer +model = dict( + backbone=dict( + depth=18, + init_cfg=dict(type='Pretrained', checkpoint='/workspace/whole_world/rdata/share/pretrained/checkpoints/resnet18-5c106cde.pth')), + neck=dict(in_channels=[64, 128, 256, 512])) +# optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +evaluation = dict(save_best='auto', interval=10, dynamic_intervals=[(11, 1)],metric='bbox') +checkpoint_config = dict(interval=10) +data = dict( + samples_per_gpu=16, # 就是16 + workers_per_gpu=8, +) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) +load_from = '/workspace/whole_world/rdata/share/pretrained/long_used/retinanet_r18_fpn_1x_coco_20220407_171055-614fd399.pth' +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=6, norm_type=2)) diff --git a/configs/retinanet/retinanet_r18_fpn_1x_coco_quant_w4a4_aqd.py b/configs/retinanet/retinanet_r18_fpn_1x_coco_quant_w4a4_aqd.py new file mode 100644 index 0000000..f2830ca --- /dev/null +++ b/configs/retinanet/retinanet_r18_fpn_1x_coco_quant_w4a4_aqd.py @@ -0,0 +1,26 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn_no_freeze.py', + '../_base_/datasets/coco_detection.py', '../_base_/schedules/schedule_qat_w4a4.py' + , 'retinanet_fpn_quant_general.py', '../_base_/default_runtime.py' +] + +# optimizer +model = dict( + backbone=dict( + depth=18, + init_cfg=dict(type='Pretrained', checkpoint='/workspace/whole_world/rdata/share/pretrained/checkpoints/resnet18-5c106cde.pth')), + neck=dict(in_channels=[64, 128, 256, 512])) +# optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +evaluation = dict(save_best='auto', interval=10, dynamic_intervals=[(11, 1)],metric='bbox') +checkpoint_config = dict(interval=10) +data = dict( + samples_per_gpu=8, # 就是16 + workers_per_gpu=8, +) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) +load_from = '/work_dirs/retinanet_r18_fpn_1x_coco_AQD/epoch_12.pth' +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=8, norm_type=2)) diff --git a/configs/retinanet/retinanet_r18_fpn_1x_voc.py b/configs/retinanet/retinanet_r18_fpn_1x_voc.py new file mode 100644 index 0000000..c6f05de --- /dev/null +++ b/configs/retinanet/retinanet_r18_fpn_1x_voc.py @@ -0,0 +1,32 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/voc0712.py', '../_base_/schedules/schedule_1x_voc_general.py' + , '../_base_/default_runtime.py' +] + + +# optimizer +model = dict( + backbone=dict( + depth=18, + init_cfg=dict(type='Pretrained', checkpoint='/workspace/whole_world/bdata1/long.huang/temp/pretrained/backbones/resnet18-5c106cde.pth')), + neck=dict(in_channels=[64, 128, 256, 512]), + bbox_head=dict(num_classes=20)) +# optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +evaluation = dict(save_best='auto', interval=4, dynamic_intervals=[(5, 1)],metric='bbox') +checkpoint_config = dict(interval=10) + + + +# dataset settings +data = dict( + samples_per_gpu=16, + workers_per_gpu=8) + + + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) +# load_from = '/workspace/whole_world/bdata1/long.huang/temp/pretrained/long_used/retinanet_r18_fpn_1x_coco_20220407_171055-614fd399.pth' diff --git a/configs/retinanet/retinanet_r18_fpn_1x_voc_harmony.py b/configs/retinanet/retinanet_r18_fpn_1x_voc_harmony.py new file mode 100644 index 0000000..dba37a7 --- /dev/null +++ b/configs/retinanet/retinanet_r18_fpn_1x_voc_harmony.py @@ -0,0 +1,32 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/voc0712.py', '../_base_/schedules/schedule_fp32_fine_tune_general.py' + , '../_base_/default_runtime.py' +] + + +# optimizer +model = dict( + backbone=dict( + depth=18, + init_cfg=dict(type='Pretrained', checkpoint='/workspace/whole_world/rdata/share/pretrained/checkpoints/resnet18-5c106cde.pth')), + neck=dict(in_channels=[64, 128, 256, 512]), + bbox_head=dict(num_classes=20)) +# optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +evaluation = dict(save_best='auto', interval=1, metric='bbox') +checkpoint_config = dict(interval=10) + + + +# dataset settings +data = dict( + samples_per_gpu=16, + workers_per_gpu=8) + + + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) +load_from = '/workspace/share/long_dir/retinanet_r18_fpn_1x_voc/best_bbox_mAP_epoch_6.pth' diff --git a/configs/retinanet/retinanet_r18_fpn_1x_voc_quant_w2a2.py b/configs/retinanet/retinanet_r18_fpn_1x_voc_quant_w2a2.py new file mode 100644 index 0000000..6a03dde --- /dev/null +++ b/configs/retinanet/retinanet_r18_fpn_1x_voc_quant_w2a2.py @@ -0,0 +1,33 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn_no_freeze.py', + '../_base_/datasets/voc0712.py', '../_base_/schedules/schedule_qat_w2a2.py' + , 'retinanet_fpn_quant_general.py', '../_base_/default_runtime.py' +] +# schedule_qat_w2a2 schedule_fine_tune_general + +# optimizer +model = dict( + backbone=dict( + depth=18, + init_cfg=dict(type='Pretrained', checkpoint='/workspace/whole_world/rdata/share/pretrained/checkpoints/resnet18-5c106cde.pth')), + neck=dict(in_channels=[64, 128, 256, 512]), + bbox_head=dict(num_classes=20)) +# optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +evaluation = dict(save_best='auto', interval=10, dynamic_intervals=[(11, 1)],metric='bbox') +checkpoint_config = dict(interval=10) + + + +# dataset settings +data = dict( + samples_per_gpu=16, + workers_per_gpu=8) + + + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) +load_from = '/workspace/share/long_dir/retinanet_r18_fpn_1x_voc/best_bbox_mAP_epoch_6.pth' +# tune_from = 'work_dirs/retinanet_r18_fpn_voc_w2a2_LSQ/best_bbox_mAP_epoch_18.pth' \ No newline at end of file diff --git a/configs/retinanet/retinanet_r18_fpn_1x_voc_quant_w2a2_AQD.py b/configs/retinanet/retinanet_r18_fpn_1x_voc_quant_w2a2_AQD.py new file mode 100644 index 0000000..11e081f --- /dev/null +++ b/configs/retinanet/retinanet_r18_fpn_1x_voc_quant_w2a2_AQD.py @@ -0,0 +1,33 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn_no_freeze.py', + '../_base_/datasets/voc0712.py', '../_base_/schedules/schedule_qat_w2a2.py' + , 'retinanet_fpn_quant_general.py', '../_base_/default_runtime.py' +] +# schedule_qat_w2a2 schedule_fine_tune_general + +# optimizer +model = dict( + backbone=dict( + depth=18, + init_cfg=dict(type='Pretrained', checkpoint='/workspace/whole_world/bdata1/long.huang/temp/pretrained/backbones/resnet18-5c106cde.pth')), + neck=dict(in_channels=[64, 128, 256, 512]), + bbox_head=dict(num_classes=20)) +# optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +evaluation = dict(save_best='auto', interval=10, dynamic_intervals=[(11, 1)],metric='bbox') +checkpoint_config = dict(interval=10) + + + +# dataset settings +data = dict( + samples_per_gpu=8, + workers_per_gpu=4) + + + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) +load_from = 'work_dirs/retinanet_r18_fpn_1x_voc/best_bbox_mAP_epoch_6.pth' +# tune_from = 'work_dirs/retinanet_r18_fpn_voc_w2a2_LSQ/best_bbox_mAP_epoch_18.pth' \ No newline at end of file diff --git a/configs/retinanet/retinanet_r18_fpn_1x_voc_quant_w2a2_tune.py b/configs/retinanet/retinanet_r18_fpn_1x_voc_quant_w2a2_tune.py new file mode 100644 index 0000000..4477d2d --- /dev/null +++ b/configs/retinanet/retinanet_r18_fpn_1x_voc_quant_w2a2_tune.py @@ -0,0 +1,35 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn_no_freeze.py', + '../_base_/datasets/voc0712.py', '../_base_/schedules/schedule_fine_tune_general.py' + , 'retinanet_fpn_quant_general.py', '../_base_/default_runtime.py' +] +# schedule_qat_w2a2 schedule_fine_tune_general + +# optimizer +model = dict( + backbone=dict( + depth=18, + init_cfg=dict(type='Pretrained', checkpoint='/workspace/share/pretrained/checkpoints/resnet18-5c106cde.pth')), + neck=dict(in_channels=[64, 128, 256, 512]), + bbox_head=dict(num_classes=20)) +# optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +evaluation = dict(save_best='auto', interval=1, metric='bbox') +checkpoint_config = dict(interval=10) + + + +# dataset settings +data = dict( + samples_per_gpu=16, + workers_per_gpu=8) + + + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) +# load_from = '/workspace/share/long_dir/retinanet_r18_fpn_1x_voc/best_bbox_mAP_epoch_6.pth' +tune_from = 'work_dirs/retinanet_r18_fpn_voc_w2a2_LSQ/best_bbox_mAP_epoch_18.pth' +# tune_from = 'work_dirs/retinanet_r18_fpn_voc_w2a2_LSQ_HQOD_ok/best_bbox_mAP_epoch_14.pth' +# tune_from = 'work_dirs/retinanet_r18_fpn_voc_w2a2_LSQ_HQOD/best_bbox_mAP_epoch_16.pth' \ No newline at end of file diff --git a/configs/retinanet/retinanet_r18_fpn_1x_voc_quant_w4a4.py b/configs/retinanet/retinanet_r18_fpn_1x_voc_quant_w4a4.py new file mode 100644 index 0000000..4995c5c --- /dev/null +++ b/configs/retinanet/retinanet_r18_fpn_1x_voc_quant_w4a4.py @@ -0,0 +1,32 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn_no_freeze.py', + '../_base_/datasets/voc0712.py', '../_base_/schedules/schedule_qat_w4a4.py' + , 'retinanet_fpn_quant_general.py', '../_base_/default_runtime.py' +] + + +# optimizer +model = dict( + backbone=dict( + depth=18, + init_cfg=dict(type='Pretrained', checkpoint='/workspace/whole_world/rdata/share/pretrained/checkpoints/resnet18-5c106cde.pth')), + neck=dict(in_channels=[64, 128, 256, 512]), + bbox_head=dict(num_classes=20)) +# optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +evaluation = dict(save_best='auto', interval=1, metric='bbox') +checkpoint_config = dict(interval=10) + + + +# dataset settings +data = dict( + samples_per_gpu=16, + workers_per_gpu=8) + + + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) +load_from = '/workspace/share/long_dir/retinanet_r18_fpn_1x_voc/best_bbox_mAP_epoch_6.pth' diff --git a/configs/retinanet/retinanet_r18_fpn_1x_voc_quant_w4a4_debug.py b/configs/retinanet/retinanet_r18_fpn_1x_voc_quant_w4a4_debug.py new file mode 100644 index 0000000..529d2c1 --- /dev/null +++ b/configs/retinanet/retinanet_r18_fpn_1x_voc_quant_w4a4_debug.py @@ -0,0 +1,89 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn_no_freeze.py', + '../_base_/schedules/schedule_qat_w4a4.py' + , 'retinanet_fpn_quant_general.py', '../_base_/default_runtime.py' +] + +# dataset settings +dataset_type = 'VOCDataset' +data_root = '/workspace/whole_world/bdata1/long.huang/temp/VOC/VOCdevkit/' +classes = ('aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', + 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', + 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', + 'tvmonitor') +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1000, 600), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1000, 600), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, + workers_per_gpu=4, + train=dict( + type='CocoDataset', + ann_file=data_root + 'coco_format/voc07_test.json', # 注意这里走的是COCO格式 + img_prefix=data_root, + pipeline=train_pipeline, + classes=classes), + val=dict( + type='CocoDataset', + ann_file=data_root + 'coco_format/voc07_test.json', # 注意这里走的是COCO格式 + img_prefix=data_root, + pipeline=test_pipeline, + classes=classes), + test=dict( + type='CocoDataset', + ann_file=data_root + 'coco_format/voc07_test.json', + img_prefix=data_root, + pipeline=test_pipeline, + classes=classes)) + + + +# optimizer +model = dict( + backbone=dict( + depth=18, + init_cfg=dict(type='Pretrained', checkpoint='/workspace/whole_world/bdata1/long.huang/temp/pretrained/backbones/resnet18-5c106cde.pth')), + neck=dict(in_channels=[64, 128, 256, 512]), + bbox_head=dict(num_classes=20)) +# optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +evaluation = dict(save_best='auto', interval=10, dynamic_intervals=[(11, 1)],metric='bbox') +checkpoint_config = dict(interval=10) + + + +# # dataset settings +# data = dict( +# samples_per_gpu=8, +# workers_per_gpu=4) + + + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) +load_from = 'work_dirs/retinanet_r18_fpn_1x_voc/best_bbox_mAP_epoch_6.pth' diff --git a/configs/retinanet/retinanet_r50_caffe_fpn_1x_coco.py b/configs/retinanet/retinanet_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..04c9af5 --- /dev/null +++ b/configs/retinanet/retinanet_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,41 @@ +_base_ = './retinanet_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/retinanet/retinanet_r50_caffe_fpn_mstrain_1x_coco.py b/configs/retinanet/retinanet_r50_caffe_fpn_mstrain_1x_coco.py new file mode 100644 index 0000000..4d7b8f2 --- /dev/null +++ b/configs/retinanet/retinanet_r50_caffe_fpn_mstrain_1x_coco.py @@ -0,0 +1,46 @@ +_base_ = './retinanet_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/retinanet/retinanet_r50_caffe_fpn_mstrain_2x_coco.py b/configs/retinanet/retinanet_r50_caffe_fpn_mstrain_2x_coco.py new file mode 100644 index 0000000..eea9690 --- /dev/null +++ b/configs/retinanet/retinanet_r50_caffe_fpn_mstrain_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './retinanet_r50_caffe_fpn_mstrain_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 23]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/retinanet/retinanet_r50_caffe_fpn_mstrain_3x_coco.py b/configs/retinanet/retinanet_r50_caffe_fpn_mstrain_3x_coco.py new file mode 100644 index 0000000..8057650 --- /dev/null +++ b/configs/retinanet/retinanet_r50_caffe_fpn_mstrain_3x_coco.py @@ -0,0 +1,4 @@ +_base_ = './retinanet_r50_caffe_fpn_mstrain_1x_coco.py' +# learning policy +lr_config = dict(step=[28, 34]) +runner = dict(type='EpochBasedRunner', max_epochs=36) diff --git a/configs/retinanet/retinanet_r50_fpn_1x_coco.py b/configs/retinanet/retinanet_r50_fpn_1x_coco.py new file mode 100644 index 0000000..dbd4813 --- /dev/null +++ b/configs/retinanet/retinanet_r50_fpn_1x_coco.py @@ -0,0 +1,15 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +evaluation = dict(save_best='auto', interval=1, metric='bbox') + +data = dict( + samples_per_gpu=4, # 就是16 + workers_per_gpu=4, +) + +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=10, norm_type=2)) diff --git a/configs/retinanet/retinanet_r50_fpn_1x_coco_quant_w2a2.py b/configs/retinanet/retinanet_r50_fpn_1x_coco_quant_w2a2.py new file mode 100644 index 0000000..5b31690 --- /dev/null +++ b/configs/retinanet/retinanet_r50_fpn_1x_coco_quant_w2a2.py @@ -0,0 +1,21 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn_no_freeze.py', + '../_base_/datasets/coco_detection.py', '../_base_/schedules/schedule_qat_w2a2.py' + , 'retinanet_fpn_quant_general.py', '../_base_/default_runtime.py' +] +# optimizer +# optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +evaluation = dict(save_best='auto', interval=10, dynamic_intervals=[(11, 1)],metric='bbox') +checkpoint_config = dict(interval=10) +data = dict( + samples_per_gpu=4, # 就是16 + workers_per_gpu=4, +) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) +load_from = '../long_used_pretrained/retinanet_r50_fpn_2x_coco_20200131-fdb43119.pth' +# resume_from = 'work_dirs/retinanet_r50_fpn_1x_coco_quant_w4a4_HQOD/best_bbox_mAP_epoch_21_can.pth' +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=10, norm_type=2)) diff --git a/configs/retinanet/retinanet_r50_fpn_1x_coco_quant_w2a2_aqd.py b/configs/retinanet/retinanet_r50_fpn_1x_coco_quant_w2a2_aqd.py new file mode 100644 index 0000000..5b31690 --- /dev/null +++ b/configs/retinanet/retinanet_r50_fpn_1x_coco_quant_w2a2_aqd.py @@ -0,0 +1,21 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn_no_freeze.py', + '../_base_/datasets/coco_detection.py', '../_base_/schedules/schedule_qat_w2a2.py' + , 'retinanet_fpn_quant_general.py', '../_base_/default_runtime.py' +] +# optimizer +# optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +evaluation = dict(save_best='auto', interval=10, dynamic_intervals=[(11, 1)],metric='bbox') +checkpoint_config = dict(interval=10) +data = dict( + samples_per_gpu=4, # 就是16 + workers_per_gpu=4, +) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) +load_from = '../long_used_pretrained/retinanet_r50_fpn_2x_coco_20200131-fdb43119.pth' +# resume_from = 'work_dirs/retinanet_r50_fpn_1x_coco_quant_w4a4_HQOD/best_bbox_mAP_epoch_21_can.pth' +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=10, norm_type=2)) diff --git a/configs/retinanet/retinanet_r50_fpn_1x_coco_quant_w4a4.py b/configs/retinanet/retinanet_r50_fpn_1x_coco_quant_w4a4.py new file mode 100644 index 0000000..23e7709 --- /dev/null +++ b/configs/retinanet/retinanet_r50_fpn_1x_coco_quant_w4a4.py @@ -0,0 +1,21 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn_no_freeze.py', + '../_base_/datasets/coco_detection.py', '../_base_/schedules/schedule_qat_w4a4.py' + , 'retinanet_fpn_quant_general.py', '../_base_/default_runtime.py' +] +# optimizer +# optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +evaluation = dict(save_best='auto', interval=10, dynamic_intervals=[(11, 1)],metric='bbox') +checkpoint_config = dict(interval=10) +data = dict( + samples_per_gpu=16, # 就是16 + workers_per_gpu=8, +) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) +load_from = '../long_used_pretrained/retinanet_r50_fpn_2x_coco_20200131-fdb43119.pth' +# resume_from = 'work_dirs/retinanet_r50_fpn_1x_coco_quant_w4a4_HQOD/best_bbox_mAP_epoch_21_can.pth' +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=10, norm_type=2)) \ No newline at end of file diff --git a/configs/retinanet/retinanet_r50_fpn_1x_coco_quant_w4a4_aqd.py b/configs/retinanet/retinanet_r50_fpn_1x_coco_quant_w4a4_aqd.py new file mode 100644 index 0000000..3a53846 --- /dev/null +++ b/configs/retinanet/retinanet_r50_fpn_1x_coco_quant_w4a4_aqd.py @@ -0,0 +1,21 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn_no_freeze.py', + '../_base_/datasets/coco_detection.py', '../_base_/schedules/schedule_qat_w4a4.py' + , 'retinanet_fpn_quant_general.py', '../_base_/default_runtime.py' +] +# optimizer +# optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +evaluation = dict(save_best='auto', interval=10, dynamic_intervals=[(11, 1)],metric='bbox') +checkpoint_config = dict(interval=10) +data = dict( + samples_per_gpu=4, # 就是16 + workers_per_gpu=4, +) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) +load_from = '../long_used_pretrained/retinanet_r50_fpn_2x_coco_20200131-fdb43119.pth' +# resume_from = 'work_dirs/retinanet_r50_fpn_1x_coco_quant_w4a4_HQOD/best_bbox_mAP_epoch_21_can.pth' +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=10, norm_type=2)) \ No newline at end of file diff --git a/configs/retinanet/retinanet_r50_fpn_1x_voc.py b/configs/retinanet/retinanet_r50_fpn_1x_voc.py new file mode 100644 index 0000000..d6c3d4b --- /dev/null +++ b/configs/retinanet/retinanet_r50_fpn_1x_voc.py @@ -0,0 +1,17 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/voc0712.py', '../_base_/schedules/schedule_1x_voc_general.py', + '../_base_/default_runtime.py' +] +model = dict( + bbox_head=dict(num_classes=20)) + +optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +evaluation = dict(save_best='auto', interval=1, metric='bbox') +checkpoint_config = dict(interval=10) +# dataset settings +data = dict( + samples_per_gpu=8, + workers_per_gpu=4) + + diff --git a/configs/retinanet/retinanet_r50_fpn_1x_voc_harmony.py b/configs/retinanet/retinanet_r50_fpn_1x_voc_harmony.py new file mode 100644 index 0000000..c89aa07 --- /dev/null +++ b/configs/retinanet/retinanet_r50_fpn_1x_voc_harmony.py @@ -0,0 +1,18 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/voc0712.py', '../_base_/schedules/schedule_fp32_fine_tune_general.py', + '../_base_/default_runtime.py' +] +model = dict( + bbox_head=dict(num_classes=20)) + +# optimizer = dict(type='SGD', lr=0.004, momentum=0.9, weight_decay=0.0001) +evaluation = dict(save_best='auto', interval=1, metric='bbox') +checkpoint_config = dict(interval=10) +# dataset settings +data = dict( + samples_per_gpu=16, + workers_per_gpu=8) +load_from = '/workspace/share/long_dir/retinanet_r50_fpn_1x_voc/best_bbox_mAP_epoch_6.pth' + + diff --git a/configs/retinanet/retinanet_r50_fpn_1x_voc_quant_w2a2.py b/configs/retinanet/retinanet_r50_fpn_1x_voc_quant_w2a2.py new file mode 100644 index 0000000..de35f58 --- /dev/null +++ b/configs/retinanet/retinanet_r50_fpn_1x_voc_quant_w2a2.py @@ -0,0 +1,21 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn_no_freeze.py', + '../_base_/datasets/voc0712.py', '../_base_/schedules/schedule_qat_w4a4.py' + , 'retinanet_fpn_quant_general.py', '../_base_/default_runtime.py' +] + +model = dict( + bbox_head=dict(num_classes=20)) + +evaluation = dict(save_best='auto', interval=10, dynamic_intervals=[(11, 1)],metric='bbox') +checkpoint_config = dict(interval=10) +# dataset settings +data = dict( + samples_per_gpu=4, + workers_per_gpu=4) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) +# load_from = '../long_used_pretrained/retinanet_r50_fpn_2x_coco_20200131-fdb43119.pth' \ No newline at end of file diff --git a/configs/retinanet/retinanet_r50_fpn_1x_voc_quant_w2a2_resume.py b/configs/retinanet/retinanet_r50_fpn_1x_voc_quant_w2a2_resume.py new file mode 100644 index 0000000..e7e64d1 --- /dev/null +++ b/configs/retinanet/retinanet_r50_fpn_1x_voc_quant_w2a2_resume.py @@ -0,0 +1,37 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn_no_freeze.py', + '../_base_/datasets/voc0712.py', '../_base_/schedules/schedule_qat_w2a2_big.py' + , 'retinanet_fpn_quant_general.py', '../_base_/default_runtime.py' +] + +model = dict( + bbox_head=dict(num_classes=20)) + +evaluation = dict(save_best='auto', interval=10, dynamic_intervals=[(11, 1)],metric='bbox') +checkpoint_config = dict(interval=10) +# dataset settings +data = dict( + samples_per_gpu=4, + workers_per_gpu=4) + + +# optimizer +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='exp', + warmup_by_epoch=True, + warmup_iters=1, + warmup_ratio=0.004, + gamma=0.5, + step=[8, 13, 14, 15, 16, 17, 19, 20, 21]) # 0.01 0.005 0.0025 0.00125 0.000625 +runner = dict(type='EpochBasedRunner', max_epochs=21) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) +# load_from = 'work_dirs/retinanet_r50_fpn_1x_voc/best_bbox_mAP_epoch_6.pth' +resume_from = 'work_dirs/retinanet_r50_fpn_voc_w2a2_LSQ_HQOD/best_bbox_mAP_epoch_18.pth' \ No newline at end of file diff --git a/configs/retinanet/retinanet_r50_fpn_1x_voc_quant_w4a4.py b/configs/retinanet/retinanet_r50_fpn_1x_voc_quant_w4a4.py new file mode 100644 index 0000000..dd800d1 --- /dev/null +++ b/configs/retinanet/retinanet_r50_fpn_1x_voc_quant_w4a4.py @@ -0,0 +1,21 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn_no_freeze.py', + '../_base_/datasets/voc0712.py', '../_base_/schedules/schedule_qat_w4a4.py' + , 'retinanet_fpn_quant_general.py', '../_base_/default_runtime.py' +] + +model = dict( + bbox_head=dict(num_classes=20)) + +evaluation = dict(save_best='auto', interval=10, dynamic_intervals=[(11, 1)],metric='bbox') +checkpoint_config = dict(interval=10) +# dataset settings +data = dict( + samples_per_gpu=8, + workers_per_gpu=4) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (2 samples per GPU) +auto_scale_lr = dict(base_batch_size=16) +# load_from = '../long_used_pretrained/retinanet_r50_fpn_2x_coco_20200131-fdb43119.pth' \ No newline at end of file diff --git a/configs/retinanet/retinanet_r50_fpn_2x_coco.py b/configs/retinanet/retinanet_r50_fpn_2x_coco.py new file mode 100644 index 0000000..927915f --- /dev/null +++ b/configs/retinanet/retinanet_r50_fpn_2x_coco.py @@ -0,0 +1,4 @@ +_base_ = './retinanet_r50_fpn_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/retinanet/retinanet_r50_fpn_90k_coco.py b/configs/retinanet/retinanet_r50_fpn_90k_coco.py new file mode 100644 index 0000000..ceda327 --- /dev/null +++ b/configs/retinanet/retinanet_r50_fpn_90k_coco.py @@ -0,0 +1,15 @@ +_base_ = 'retinanet_r50_fpn_1x_coco.py' + +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[60000, 80000]) + +# Runner type +runner = dict(_delete_=True, type='IterBasedRunner', max_iters=90000) + +checkpoint_config = dict(interval=10000) +evaluation = dict(interval=10000, metric='bbox') diff --git a/configs/retinanet/retinanet_r50_fpn_fp16_1x_coco.py b/configs/retinanet/retinanet_r50_fpn_fp16_1x_coco.py new file mode 100644 index 0000000..0c067e3 --- /dev/null +++ b/configs/retinanet/retinanet_r50_fpn_fp16_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './retinanet_r50_fpn_1x_coco.py' +# fp16 settings +fp16 = dict(loss_scale=512.) + +# set grad_norm for stability during mixed-precision training +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=10, norm_type=2)) diff --git a/configs/retinanet/retinanet_r50_fpn_mstrain_640-800_3x_coco.py b/configs/retinanet/retinanet_r50_fpn_mstrain_640-800_3x_coco.py new file mode 100644 index 0000000..02a2c29 --- /dev/null +++ b/configs/retinanet/retinanet_r50_fpn_mstrain_640-800_3x_coco.py @@ -0,0 +1,5 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', '../common/mstrain_3x_coco.py' +] +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/configs/retinanet/retinanet_x101_32x4d_fpn_1x_coco.py b/configs/retinanet/retinanet_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..765a4c2 --- /dev/null +++ b/configs/retinanet/retinanet_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './retinanet_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/retinanet/retinanet_x101_32x4d_fpn_2x_coco.py b/configs/retinanet/retinanet_x101_32x4d_fpn_2x_coco.py new file mode 100644 index 0000000..14de96f --- /dev/null +++ b/configs/retinanet/retinanet_x101_32x4d_fpn_2x_coco.py @@ -0,0 +1,14 @@ +_base_ = './retinanet_r50_fpn_2x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/retinanet/retinanet_x101_64x4d_fpn_1x_coco.py b/configs/retinanet/retinanet_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..948cd18 --- /dev/null +++ b/configs/retinanet/retinanet_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './retinanet_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/retinanet/retinanet_x101_64x4d_fpn_2x_coco.py b/configs/retinanet/retinanet_x101_64x4d_fpn_2x_coco.py new file mode 100644 index 0000000..ad04b6e --- /dev/null +++ b/configs/retinanet/retinanet_x101_64x4d_fpn_2x_coco.py @@ -0,0 +1,14 @@ +_base_ = './retinanet_r50_fpn_2x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/retinanet/retinanet_x101_64x4d_fpn_mstrain_640-800_3x_coco.py b/configs/retinanet/retinanet_x101_64x4d_fpn_mstrain_640-800_3x_coco.py new file mode 100644 index 0000000..f6ab512 --- /dev/null +++ b/configs/retinanet/retinanet_x101_64x4d_fpn_mstrain_640-800_3x_coco.py @@ -0,0 +1,8 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', '../common/mstrain_3x_coco.py' +] +# optimizer +model = dict( + pretrained='open-mmlab://resnext101_64x4d', + backbone=dict(type='ResNeXt', depth=101, groups=64, base_width=4)) +optimizer = dict(type='SGD', lr=0.01) diff --git a/configs/rfnext/README.md b/configs/rfnext/README.md new file mode 100644 index 0000000..13f3991 --- /dev/null +++ b/configs/rfnext/README.md @@ -0,0 +1,131 @@ +# RF-Next: Efficient Receptive Field Search for CNN + +> [RF-Next: Efficient Receptive Field Search for Convolutional Neural Networks](http://mftp.mmcheng.net/Papers/22TPAMI-ActionSeg.pdf) + + + +## Abstract + +Temporal/spatial receptive fields of models play an important role in sequential/spatial tasks. Large receptive fields facilitate long-term relations, while small receptive fields help to capture the local details. Existing methods construct models with hand-designed receptive fields in layers. Can we effectively search for receptive field combinations to replace hand-designed patterns? To answer this question, we propose to find better receptive field combinations through a global-to-local search scheme. Our search scheme exploits both global search to find the coarse combinations and local search to get the refined receptive field combinations further. The global search finds possible coarse combinations other than human-designed patterns. On top of the global search, we propose an expectation-guided iterative local search scheme to refine combinations effectively. Our RF-Next models, plugging receptive field search to various models, boost the performance on many tasks, e.g., temporal action segmentation, object detection, instance segmentation, and speech synthesis. +The source code is publicly available on [http://mmcheng.net/rfnext](http://mmcheng.net/rfnext). + +## Results and Models + +### ConvNext on COCO + +| Backbone | Method | RFNext | Lr Schd | box mAP | mask mAP | Config | Download | +| :-----------: | :----------------: | :-------------: | :-----: | :-----: | :------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ConvNeXt-T | Cascade Mask R-CNN | NO | 3x | 50.3 | 43.6 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/convnext/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/convnext/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco_20220426_154953-050731f4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/convnext/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco/mask_rcnn_convnext-t_p4_w7_fpn_fp16_ms-crop_3x_coco_20220426_154953.log.json) | +| RF-ConvNeXt-T | Cascade Mask R-CNN | Single-Branch | 3x | 50.6 | 44.0 | [search](https://github.com/open-mmlab/mmdetection/tree/master/configs/rfnext/rfnext_search_cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py) [retrain](https://github.com/open-mmlab/mmdetection/tree/master/configs/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_convnext_tiny_patch4_window7_mstrain_480-800_giou_4conv1f_adamw_3x_coco_in1k/rfnext_fixed_single_branch_cascade_mask_rcnn_convnext_tiny_patch4_window7_mstrain_480-800_giou_4conv1f_adamw_3x_coco_in1k-71aeb991.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_convnext_tiny_patch4_window7_mstrain_480-800_giou_4conv1f_adamw_3x_coco_in1k/rfnext_fixed_single_branch_cascade_mask_rcnn_convnext_tiny_patch4_window7_mstrain_480-800_giou_4conv1f_adamw_3x_coco_in1k_20220131_091748.log.json) | +| RF-ConvNeXt-T | Cascade Mask R-CNN | Multiple-Branch | 3x | 50.9 | 44.3 | [search](https://github.com/open-mmlab/mmdetection/tree/master/configs/rfnext/rfnext_search_cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py) [retrain](https://github.com/open-mmlab/mmdetection/tree/master/configs/rfnext/rfnext_fixed_multi_branch_cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_search_cascade_mask_rcnn_convnext_tiny_patch4_window7_mstrain_480-800_giou_4conv1f_adamw_3x_coco_in1k/rfnext_search_cascade_mask_rcnn_convnext_tiny_patch4_window7_mstrain_480-800_giou_4conv1f_adamw_3x_coco_in1k-f47db42b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_search_cascade_mask_rcnn_convnext_tiny_patch4_window7_mstrain_480-800_giou_4conv1f_adamw_3x_coco_in1k/rfnext_search_cascade_mask_rcnn_convnext_tiny_patch4_window7_mstrain_480-800_giou_4conv1f_adamw_3x_coco_in1k_20220128_200900.log.json) | + +### PVTv2 on COCO + +| Backbone | Method | RFNext | Lr Schd | box mAP | mask mAP | Config | Download | +| :---------: | :--------: | :-------------: | :-----: | :-----: | :------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| PVTv2-b0 | Mask R-CNN | NO | 1x | 38.2 | 36.2 | - | - | +| RF-PVTv2-b0 | Mask R-CNN | Single-Branch | 1x | 38.9 | 36.8 | [search](https://github.com/open-mmlab/mmdetection/tree/master/configs/rfnext/rfnext_search_mask_rcnn_pvtv2-b0_fpn_1x_coco.py) [retrain](https://github.com/open-mmlab/mmdetection/tree/master/configs/rfnext/rfnext_fixed_single_branch_mask_rcnn_pvtv2-b0_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_fixed_single_branch_mask_rcnn_pvtv2-b0_fpn_1x_coco/rfnext_fixed_single_branch_mask_rcnn_pvtv2-b0_fpn_1x_coco-7b25d72e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_fixed_single_branch_mask_rcnn_pvtv2-b0_fpn_1x_coco/rfnext_fixed_single_branch_mask_rcnn_pvtv2-b0_fpn_1x_coco_20221120_213845.log.json) | +| RF-PVTv2-b0 | Mask R-CNN | Multiple-Branch | 1x | 39.3 | 37.1 | [search](https://github.com/open-mmlab/mmdetection/tree/master/configs/rfnext/rfnext_search_mask_rcnn_pvtv2-b0_fpn_1x_coco.py) [retrain](https://github.com/open-mmlab/mmdetection/tree/master/configs/rfnext/rfnext_fixed_multi_branch_mask_rcnn_pvtv2-b0_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_search_mask_rcnn_pvtv2-b0_fpn_1x_coco/rfnext_search_mask_rcnn_pvtv2-b0_fpn_1x_coco-dc8fd5de.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_search_mask_rcnn_pvtv2-b0_fpn_1x_coco/rfnext_search_mask_rcnn_pvtv2-b0_fpn_1x_coco_20221119_204703.log.json) | + +The results of PVTv2-b0 are from [PVT](https://github.com/whai362/PVT/tree/v2/detection). + +### Res2Net on COCO + +| Backbone | Method | RFNext | Lr Schd | box mAP | mask mAP | Config | Download | +| :------------: | :----------------: | :-------------: | :-----: | :-----: | :------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Res2Net-101 | Cascade Mask R-CNN | NO | 20e | 46.4 | 40.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/res2net/cascade_mask_rcnn_r2_101_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/res2net/cascade_mask_rcnn_r2_101_fpn_20e_coco/cascade_mask_rcnn_r2_101_fpn_20e_coco-8a7b41e1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/res2net/cascade_mask_rcnn_r2_101_fpn_20e_coco/cascade_mask_rcnn_r2_101_fpn_20e_coco_20200515_091645.log.json) | +| RF-Res2Net-101 | Cascade Mask R-CNN | Single-Branch | 20e | 46.9 | 40.7 | [search](https://github.com/open-mmlab/mmdetection/tree/master/configs/rfnext/rfnext_search_cascade_mask_rcnn_r2_101_fpn_20e_coco.py) [retrain](https://github.com/open-mmlab/mmdetection/tree/master/configs/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_r2_101_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_r2_101_fpn_20e_coco/rfnext_fixed_single_branch_cascade_mask_rcnn_r2_101_fpn_20e_coco-e22d5257.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_r2_101_fpn_20e_coco/rfnext_fixed_single_branch_cascade_mask_rcnn_r2_101_fpn_20e_coco_20220402_141321.log.json) | +| RF-Res2Net-101 | Cascade Mask R-CNN | Multiple-Branch | 20e | 47.9 | 41.5 | [search](https://github.com/open-mmlab/mmdetection/tree/master/configs/rfnext/rfnext_search_cascade_mask_rcnn_r2_101_fpn_20e_coco.py) [retrain](https://github.com/open-mmlab/mmdetection/tree/master/configs/rfnext/rfnext_fixed_multi_branch_cascade_mask_rcnn_r2_101_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_search_cascade_mask_rcnn_r2_101_fpn_20e_coco/rfnext_search_cascade_mask_rcnn_r2_101_fpn_20e_coco-e17510a0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_search_cascade_mask_rcnn_r2_101_fpn_20e_coco/rfnext_search_cascade_mask_rcnn_r2_101_fpn_20e_coco_20220327_221419.log.json) | + +### HRNet on COCO + +| Backbone | Method | RFNext | Lr Schd | box mAP | mask mAP | Config | Download | +| :-------------: | :----------------: | :-------------: | :-----: | :-----: | :------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| HRNetV2p-W18 | Cascade Mask R-CNN | NO | 20e | 41.6 | 36.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/hrnet/cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_mask_rcnn_hrnetv2p_w18_20e_coco/cascade_mask_rcnn_hrnetv2p_w18_20e_coco_20200210-b543cd2b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/hrnet/cascade_mask_rcnn_hrnetv2p_w18_20e_coco/cascade_mask_rcnn_hrnetv2p_w18_20e_coco_20200210_093149.log.json) | +| RF-HRNetV2p-W18 | Cascade Mask R-CNN | Single-Branch | 20e | 43.0 | 37.6 | [search](https://github.com/open-mmlab/mmdetection/tree/master/configs/rfnext/rfsearched_search_cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py) [retrain](https://github.com/open-mmlab/mmdetection/tree/master/configs/rfnext/rfsearched_fixed_single_branch_cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_hrnetv2p_w18_20e_coco/rfnext_fixed_single_branch_cascade_mask_rcnn_hrnetv2p_w18_20e_coco-682f121d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_hrnetv2p_w18_20e_coco/rfnext_fixed_single_branch_cascade_mask_rcnn_hrnetv2p_w18_20e_coco_20221118_141400.log.json) | +| RF-HRNetV2p-W18 | Cascade Mask R-CNN | Multiple-Branch | 20e | 43.7 | 38.2 | [search](https://github.com/open-mmlab/mmdetection/tree/master/configs/rfnext/rfsearched_search_cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py) [retrain](https://github.com/open-mmlab/mmdetection/tree/master/configs/rfnext/rfsearched_fixed_multi_branch_cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_search_cascade_mask_rcnn_hrnetv2p_w18_20e_coco/rfnext_search_cascade_mask_rcnn_hrnetv2p_w18_20e_coco-7b9c7885.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_search_cascade_mask_rcnn_hrnetv2p_w18_20e_coco/rfnext_search_cascade_mask_rcnn_hrnetv2p_w18_20e_coco_20221115_230113.log.json) | + +Note: the performance of multi-branch models listed above are evaluated during searching to save computional cost, retraining would achieve similar or better performance. + +### Res2Net on COCO panoptic + +| Backbone | Method | RFNext | Lr schd | PQ | SQ | RQ | Config | Download | +| :-----------: | :----------: | :-------------: | :-----: | :--: | :--: | :--: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Res2Net-50 | Panoptic FPN | NO | 1x | 42.5 | 78.0 | 51.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/panoptic_fpn/panoptic_fpn_r2_50_fpn_fp16_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/rfnext/panoptic_fpn_r2_50_fpn_fp16_1x_coco/panoptic_fpn_r2_50_fpn_fp16_1x_coco-fa6c51f0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/rfnext/panoptic_fpn_r2_50_fpn_fp16_1x_coco/panoptic_fpn_r2_50_fpn_fp16_1x_coco_20221114_224729.log.json) | +| RF-Res2Net-50 | Panoptic FPN | Single-Branch | 1x | 44.0 | 78.7 | 53.6 | [search](https://github.com/open-mmlab/mmdetection/tree/master/configs/rfnext/rfnext_search_panoptic_fpn_r2_50_fpn_fp16_1x_coco.py) [retrain](https://github.com/open-mmlab/mmdetection/tree/master/configs/rfnext/rfnext_fixed_single_branch_panoptic_fpn_r2_50_fpn_fp16_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_fixed_single_branch_panoptic_fpn_r2_50_fpn_fp16_1x_coco/rfnext_fixed_single_branch_panoptic_fpn_r2_50_fpn_fp16_1x_coco-52181d5b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_fixed_single_branch_panoptic_fpn_r2_50_fpn_fp16_1x_coco/rfnext_fixed_single_branch_panoptic_fpn_r2_50_fpn_fp16_1x_coco_20221115_152436.log.json) | +| RF-Res2Net-50 | Panoptic FPN | Multiple-Branch | 1x | 44.3 | 79.0 | 53.9 | [search](https://github.com/open-mmlab/mmdetection/tree/master/configs/rfnext/rfnext_search_panoptic_fpn_r2_50_fpn_fp16_1x_coco.py) [retrain](https://github.com/open-mmlab/mmdetection/tree/master/configs/rfnext/rfnext_fixed_multi_branch_panoptic_fpn_r2_50_fpn_fp16_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_search_panoptic_fpn_r2_50_fpn_fp16_1x_coco/rfnext_search_panoptic_fpn_r2_50_fpn_fp16_1x_coco-34a893a0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_search_panoptic_fpn_r2_50_fpn_fp16_1x_coco/rfnext_search_panoptic_fpn_r2_50_fpn_fp16_1x_coco_20221114_224722.log.json) | + +## Configs + +If you want to search receptive fields on an existing model, you need to define a `RFSearchHook` in the `custom_hooks` of config file. + +```python +custom_hooks = [ + dict( + type='RFSearchHook', + mode='search', + rfstructure_file=None, + verbose=True, + by_epoch=True, + config=dict( + search=dict( + step=0, + max_step=11, + search_interval=1, + exp_rate=0.5, + init_alphas=0.01, + mmin=1, + mmax=24, + num_branches=2, + skip_layer=[])) + ), +] +``` + +Arguments: + +- `max_step`: The maximum number of steps to update the structures. +- `search_interval`: The interval (epoch) between two updates. +- `exp_rate`: The controller of the sparsity of search space. For a conv with an initial dilation rate of `D`, dilation rates will be sampled with an interval of `exp_rate * D`. +- `num_branches`: The controller of the size of search space (the number of branches). If you set `S=3`, the dilations are `[D - exp_rate * D, D, D + exp_rate * D]` for three branches. If you set `num_branches=2`, the dilations are `[D - exp_rate * D, D + exp_rate * D]`. With `num_branches=2`, you can achieve similar performance with less MEMORY and FLOPS. +- `skip_layer`: The modules in skip_layer will be ignored during the receptive field search. + +## Training + +### 1. Searching Jobs + +You can launch searching jobs by using config files with prefix `rfnext_search`. The json files of searched structures will be saved to `work_dir`. + +If you want to further search receptive fields upon a searched structure, please set `rfsearch_cfg.rfstructure_file` in config file to the corresponding json file. + +### 2. Training Jobs + +Setting `rfsearch_cfg.rfstructure_file` to the searched structure file (.json) and setting `rfsearch_cfg.mode` to `fixed_single_branch` or `fixed_multi_branch`, you can retrain a model with the searched structure. +You can launch fixed_single_branch/fixed_multi_branch training jobs by using config files with prefix `rfnext_fixed_single_branch` or `rfnext_fixed_multi_branch`. + +Note that the models after the searching stage is ready a `fixed_multi_branch` version, which achieves better performance than `fixed_single_branch`, without any retraining. + +## Inference + +`rfsearch_cfg.rfstructure_file` and `rfsearch_cfg.mode` should be set for inferencing stage. + +**Note:For the models trained with modes of `fixed_single_branch` or `fixed_multi_branch`, you can just use the training config for inferencing.** +**But If you want to inference the models trained with the mode of `search`, please use the config with prefix of `rfnext_fixed_multi_branch` to inference the models. (Otherwise, you should set `rfsearch_cfg.mode` to `fixed_multi_branch` and set the searched rfstructure_file.)** + +## Citation + +``` +@article{gao2022rfnext, +title={RF-Next: Efficient Receptive Field Search for Convolutional Neural Networks}, +author={Gao, Shanghua and Li, Zhong-Yu and Han, Qi and Cheng, Ming-Ming and Wang, Liang}, +journal=TPAMI, +year={2022} +} + +@inproceedings{gao2021global2local, + title = {Global2Local: Efficient Structure Search for Video Action Segmentation}, + author = {Gao, Shanghua and Han, Qi and Li, Zhong-Yu and Peng, Pai and Wang, Liang and Cheng, Ming-Ming}, + booktitle = CVPR, + year = {2021} +} +``` diff --git a/configs/rfnext/metafile.yml b/configs/rfnext/metafile.yml new file mode 100644 index 0000000..59469d7 --- /dev/null +++ b/configs/rfnext/metafile.yml @@ -0,0 +1,249 @@ +Collections: + - Name: RF-Next + Metadata: + Training Data: COCO + Training Techniques: + - RF-Next + Training Resources: 8x V100 GPUs + Architecture: + - RF-Next + Paper: + URL: http://mftp.mmcheng.net/Papers/22TPAMI-ActionSeg.pdf + Title: "RF-Next: Efficient Receptive Field Search for Convolutional Neural Networks" + README: configs/rfnext/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/mmdet/utils/rfnext.py + Version: v2.27.0 + +Models: + - Name: rfnext_search_cascade_mask_rcnn_convnext_tiny_patch4_window7_mstrain_480-800_giou_4conv1f_adamw_3x_coco_in1k + In Collection: RF-Next + Config: configs/rfnext/rfnext_search_cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py + Metadata: + Training Memory (GB): 11.9 + Epochs: 36 + Training Data: COCO + Training Techniques: + RF-Next (search) + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 50.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 44.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_search_cascade_mask_rcnn_convnext_tiny_patch4_window7_mstrain_480-800_giou_4conv1f_adamw_3x_coco_in1k/rfnext_search_cascade_mask_rcnn_convnext_tiny_patch4_window7_mstrain_480-800_giou_4conv1f_adamw_3x_coco_in1k-f47db42b.pth + Paper: + URL: https://arxiv.org/pdf/2206.06637.pdf + Title: 'RF-Next: Efficient Receptive Field Search for CNN' + README: configs/rfnext/README.md + + - Name: rfnext_fixed_single_branch_cascade_mask_rcnn_convnext_tiny_patch4_window7_mstrain_480-800_giou_4conv1f_adamw_3x_coco_in1k + In Collection: RF-Next + Config: configs/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py + Metadata: + Training Memory (GB): 9.4 + Epochs: 36 + Training Data: COCO + Training Techniques: + RF-Next (fixed_single_branch) + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 50.6 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 44.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_convnext_tiny_patch4_window7_mstrain_480-800_giou_4conv1f_adamw_3x_coco_in1k/rfnext_fixed_single_branch_cascade_mask_rcnn_convnext_tiny_patch4_window7_mstrain_480-800_giou_4conv1f_adamw_3x_coco_in1k-71aeb991.pth + Paper: + URL: https://arxiv.org/pdf/2206.06637.pdf + Title: 'RF-Next: Efficient Receptive Field Search for CNN' + README: configs/rfnext/README.md + + - Name: rfnext_search_cascade_mask_rcnn_hrnetv2p_w18_20e_coco + In Collection: RF-Next + Config: configs/rfnext/rfnext_search_cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py + Metadata: + Training Memory (GB): 12.9 + Epochs: 20 + Training Data: COCO + Training Techniques: + RF-Next (search) + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 38.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_search_cascade_mask_rcnn_hrnetv2p_w18_20e_coco/rfnext_search_cascade_mask_rcnn_hrnetv2p_w18_20e_coco-7b9c7885.pth + Paper: + URL: https://arxiv.org/pdf/2206.06637.pdf + Title: 'RF-Next: Efficient Receptive Field Search for CNN' + README: configs/rfnext/README.md + + - Name: rfnext_fixed_single_branch_cascade_mask_rcnn_hrnetv2p_w18_20e_coco + In Collection: RF-Next + Config: configs/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py + Metadata: + Training Memory (GB): 8.4 + Epochs: 20 + Training Data: COCO + Training Techniques: + RF-Next (fixed_single_branch) + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_hrnetv2p_w18_20e_coco/rfnext_fixed_single_branch_cascade_mask_rcnn_hrnetv2p_w18_20e_coco-682f121d.pth + Paper: + URL: https://arxiv.org/pdf/2206.06637.pdf + Title: 'RF-Next: Efficient Receptive Field Search for CNN' + README: configs/rfnext/README.md + + - Name: rfnext_search_cascade_mask_rcnn_r2_101_fpn_20e_coco + In Collection: RF-Next + Config: configs/rfnext/rfnext_search_cascade_mask_rcnn_r2_101_fpn_20e_coco.py + Metadata: + Training Memory (GB): 11.9 + Epochs: 20 + Training Data: COCO + Training Techniques: + RF-Next (search) + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 41.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_search_cascade_mask_rcnn_r2_101_fpn_20e_coco/rfnext_search_cascade_mask_rcnn_r2_101_fpn_20e_coco-e17510a0.pth + Paper: + URL: https://arxiv.org/pdf/2206.06637.pdf + Title: 'RF-Next: Efficient Receptive Field Search for CNN' + README: configs/rfnext/README.md + + - Name: rfnext_fixed_single_branch_cascade_mask_rcnn_r2_101_fpn_20e_coco + In Collection: RF-Next + Config: configs/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_r2_101_fpn_20e_coco.py + Metadata: + Training Memory (GB): 9.3 + Epochs: 20 + Training Data: COCO + Training Techniques: + RF-Next (fixed_single_branch) + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_r2_101_fpn_20e_coco/rfnext_fixed_single_branch_cascade_mask_rcnn_r2_101_fpn_20e_coco-e22d5257.pth + Paper: + URL: https://arxiv.org/pdf/2206.06637.pdf + Title: 'RF-Next: Efficient Receptive Field Search for CNN' + README: configs/rfnext/README.md + + - Name: rfnext_search_mask_rcnn_pvtv2-b0_fpn_1x_coco + In Collection: RF-Next + Config: configs/rfnext/rfnext_search_mask_rcnn_pvtv2-b0_fpn_1x_coco.py + Metadata: + Training Memory (GB): 10.3 + Epochs: 12 + Training Data: COCO + Training Techniques: + RF-Next (search) + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_search_mask_rcnn_pvtv2-b0_fpn_1x_coco/rfnext_search_mask_rcnn_pvtv2-b0_fpn_1x_coco-dc8fd5de.pth + Paper: + URL: https://arxiv.org/pdf/2206.06637.pdf + Title: 'RF-Next: Efficient Receptive Field Search for CNN' + README: configs/rfnext/README.md + + - Name: rfnext_fixed_single_branch_mask_rcnn_pvtv2-b0_fpn_1x_coco + In Collection: RF-Next + Config: configs/rfnext/rfnext_fixed_single_branch_mask_rcnn_pvtv2-b0_fpn_1x_coco.py + Metadata: + Training Memory (GB): 8.3 + Epochs: 12 + Training Data: COCO + Training Techniques: + RF-Next (fixed_single_branch) + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.9 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_fixed_single_branch_mask_rcnn_pvtv2-b0_fpn_1x_coco/rfnext_fixed_single_branch_mask_rcnn_pvtv2-b0_fpn_1x_coco-7b25d72e.pth + Paper: + URL: https://arxiv.org/pdf/2206.06637.pdf + Title: 'RF-Next: Efficient Receptive Field Search for CNN' + README: configs/rfnext/README.md + + - Name: rfnext_search_panoptic_fpn_r2_50_fpn_fp16_1x_coco + In Collection: RF-Next + Config: configs/rfnext/rfnext_search_panoptic_fpn_r2_50_fpn_fp16_1x_coco.py + Metadata: + Training Memory (GB): 4.3 + Epochs: 12 + Training Data: COCO + Training Techniques: + RF-Next (search) + Results: + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + box AP: 44.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_search_panoptic_fpn_r2_50_fpn_fp16_1x_coco/rfnext_search_panoptic_fpn_r2_50_fpn_fp16_1x_coco-34a893a0.pth + Paper: + URL: https://arxiv.org/pdf/2206.06637.pdf + Title: 'RF-Next: Efficient Receptive Field Search for CNN' + README: configs/rfnext/README.md + + - Name: rfnext_fixed_single_branch_panoptic_fpn_r2_50_fpn_fp16_1x_coco + In Collection: RF-Next + Config: configs/rfnext/rfnext_fixed_single_branch_panoptic_fpn_r2_50_fpn_fp16_1x_coco.py + Metadata: + Training Memory (GB): 3.5 + Epochs: 12 + Training Data: COCO + Training Techniques: + RF-Next (fixed_single_branch) + Results: + - Task: Panoptic Segmentation + Dataset: COCO + Metrics: + box AP: 44.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/rfnext/rfnext_fixed_single_branch_panoptic_fpn_r2_50_fpn_fp16_1x_coco/rfnext_fixed_single_branch_panoptic_fpn_r2_50_fpn_fp16_1x_coco-52181d5b.pth + Paper: + URL: https://arxiv.org/pdf/2206.06637.pdf + Title: 'RF-Next: Efficient Receptive Field Search for CNN' + README: configs/rfnext/README.md diff --git a/configs/rfnext/rfnext_fixed_multi_branch_cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py b/configs/rfnext/rfnext_fixed_multi_branch_cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py new file mode 100644 index 0000000..76b499c --- /dev/null +++ b/configs/rfnext/rfnext_fixed_multi_branch_cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py @@ -0,0 +1,23 @@ +_base_ = '../convnext/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py' # noqa + +custom_hooks = [ + dict( + type='RFSearchHook', + mode='fixed_multi_branch', + rfstructure_file= # noqa + './configs/rfnext/search_log/convnext_cascade_maskrcnn/local_search_config_step11.json', # noqa + verbose=True, + by_epoch=True, + config=dict( + search=dict( + step=0, + max_step=12, + search_interval=1, + exp_rate=0.5, + init_alphas=0.01, + normlize='absavg', + mmin=1, + mmax=24, + num_branches=2, + skip_layer=[]))) +] diff --git a/configs/rfnext/rfnext_fixed_multi_branch_cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py b/configs/rfnext/rfnext_fixed_multi_branch_cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py new file mode 100644 index 0000000..1751427 --- /dev/null +++ b/configs/rfnext/rfnext_fixed_multi_branch_cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py @@ -0,0 +1,21 @@ +_base_ = '../hrnet/cascade_mask_rcnn_hrnetv2p_w32_20e_coco.py' + +custom_hooks = [ + dict( + mode='fixed_multi_branch', + rfstructure_file= # noqa + './configs/rfnext/search_log/cascade_mask_rcnn_hrnetv2p_w18_20e_coco/local_search_config_step11.json', # noqa + verbose=True, + by_epoch=True, + config=dict( + search=dict( + step=0, + max_step=12, + search_interval=1, + exp_rate=0.5, + init_alphas=0.01, + mmin=1, + mmax=24, + num_branches=2, + skip_layer=[]))) +] diff --git a/configs/rfnext/rfnext_fixed_multi_branch_cascade_mask_rcnn_r2_101_fpn_20e_coco.py b/configs/rfnext/rfnext_fixed_multi_branch_cascade_mask_rcnn_r2_101_fpn_20e_coco.py new file mode 100644 index 0000000..d8bc9e2 --- /dev/null +++ b/configs/rfnext/rfnext_fixed_multi_branch_cascade_mask_rcnn_r2_101_fpn_20e_coco.py @@ -0,0 +1,23 @@ +_base_ = '../res2net/cascade_mask_rcnn_r2_101_fpn_20e_coco.py' + +custom_hooks = [ + dict(type='NumClassCheckHook'), + dict( + type='RFSearchHook', + mode='fixed_multi_branch', + rfstructure_file= # noqa + './configs/rfnext/search_log/cascade_mask_rcnn_r2_101_fpn_20e_coco/local_search_config_step11.json', # noqa + verbose=True, + by_epoch=True, + config=dict( + search=dict( + step=0, + max_step=12, + search_interval=1, + exp_rate=0.5, + init_alphas=0.01, + mmin=1, + mmax=24, + num_branches=2, + skip_layer=['stem', 'layer1']))) +] diff --git a/configs/rfnext/rfnext_fixed_multi_branch_mask_rcnn_pvtv2-b0_fpn_1x_coco.py b/configs/rfnext/rfnext_fixed_multi_branch_mask_rcnn_pvtv2-b0_fpn_1x_coco.py new file mode 100644 index 0000000..b98a8f9 --- /dev/null +++ b/configs/rfnext/rfnext_fixed_multi_branch_mask_rcnn_pvtv2-b0_fpn_1x_coco.py @@ -0,0 +1,46 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# model setting +model = dict( + backbone=dict( + _delete_=True, + type='PyramidVisionTransformerV2', + embed_dims=32, + num_layers=[2, 2, 2, 2], + init_cfg=dict( + checkpoint= # noqa + 'https://github.com/whai362/PVT/releases/download/v2/pvt_v2_b0.pth' # noqa + )), + neck=dict( + type='FPN', + in_channels=[32, 64, 160, 256], + out_channels=256, + num_outs=5)) + +# optimizer +optimizer = dict(_delete_=True, type='AdamW', lr=0.0002, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) + +custom_hooks = [ + dict( + type='RFSearchHook', + mode='fixed_multi_branch', + rfstructure_file= # noqa + './configs/rfnext/search_log/mask_rcnn_pvtv2-b0_fpn_1x_coco/local_search_config_step10.json', # noqa + verbose=True, + by_epoch=True, + config=dict( + search=dict( + step=0, + max_step=11, + search_interval=1, + exp_rate=0.5, + init_alphas=0.01, + mmin=1, + mmax=24, + num_branches=2, + skip_layer=[]))) +] diff --git a/configs/rfnext/rfnext_fixed_multi_branch_panoptic_fpn_r2_50_fpn_fp16_1x_coco.py b/configs/rfnext/rfnext_fixed_multi_branch_panoptic_fpn_r2_50_fpn_fp16_1x_coco.py new file mode 100644 index 0000000..1471f0a --- /dev/null +++ b/configs/rfnext/rfnext_fixed_multi_branch_panoptic_fpn_r2_50_fpn_fp16_1x_coco.py @@ -0,0 +1,22 @@ +_base_ = '../panoptic_fpn/panoptic_fpn_r2_50_fpn_fp16_1x_coco.py' + +custom_hooks = [ + dict( + type='RFSearchHook', + mode='fixed_multi_branch', + rfstructure_file= # noqa + './configs/rfnext/search_log/panoptic_fpn_r2_50_fpn_fp16_1x_coco/local_search_config_step10.json', # noqa + verbose=True, + by_epoch=True, + config=dict( + search=dict( + step=0, + max_step=11, + search_interval=1, + exp_rate=0.5, + init_alphas=0.01, + mmin=1, + mmax=24, + num_branches=2, + skip_layer=['stem', 'layer1']))) +] diff --git a/configs/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py b/configs/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py new file mode 100644 index 0000000..19db83b --- /dev/null +++ b/configs/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py @@ -0,0 +1,22 @@ +_base_ = '../convnext/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py' # noqa + +custom_hooks = [ + dict( + type='RFSearchHook', + mode='fixed_single_branch', + rfstructure_file= # noqa + './configs/rfnext/search_log/convnext_cascade_maskrcnn/local_search_config_step11.json', # noqa + verbose=True, + by_epoch=True, + config=dict( + search=dict( + step=0, + max_step=12, + search_interval=1, + exp_rate=0.5, + init_alphas=0.01, + mmin=1, + mmax=24, + num_branches=2, + skip_layer=[]))) +] diff --git a/configs/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py b/configs/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py new file mode 100644 index 0000000..071f510 --- /dev/null +++ b/configs/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py @@ -0,0 +1,22 @@ +_base_ = '../hrnet/cascade_mask_rcnn_hrnetv2p_w32_20e_coco.py' + +custom_hooks = [ + dict( + type='RFSearchHook', + mode='fixed_single_branch', + rfstructure_file= # noqa + './configs/rfnext/search_log/cascade_mask_rcnn_hrnetv2p_w18_20e_coco/local_search_config_step11.json', # noqa + verbose=True, + by_epoch=True, + config=dict( + search=dict( + step=0, + max_step=12, + search_interval=1, + exp_rate=0.5, + init_alphas=0.01, + mmin=1, + mmax=24, + num_branches=2, + skip_layer=[]))) +] diff --git a/configs/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_r2_101_fpn_20e_coco.py b/configs/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_r2_101_fpn_20e_coco.py new file mode 100644 index 0000000..3813b38 --- /dev/null +++ b/configs/rfnext/rfnext_fixed_single_branch_cascade_mask_rcnn_r2_101_fpn_20e_coco.py @@ -0,0 +1,23 @@ +_base_ = '../res2net/cascade_mask_rcnn_r2_101_fpn_20e_coco.py' + +custom_hooks = [ + dict(type='NumClassCheckHook'), + dict( + type='RFSearchHook', + mode='fixed_single_branch', + rfstructure_file= # noqa + './configs/rfnext/search_log/cascade_mask_rcnn_r2_101_fpn_20e_coco/local_search_config_step11.json', # noqa + verbose=True, + by_epoch=True, + config=dict( + search=dict( + step=0, + max_step=12, + search_interval=1, + exp_rate=0.5, + init_alphas=0.01, + mmin=1, + mmax=24, + num_branches=2, + skip_layer=['stem', 'layer1']))) +] diff --git a/configs/rfnext/rfnext_fixed_single_branch_mask_rcnn_pvtv2-b0_fpn_1x_coco.py b/configs/rfnext/rfnext_fixed_single_branch_mask_rcnn_pvtv2-b0_fpn_1x_coco.py new file mode 100644 index 0000000..dc12384 --- /dev/null +++ b/configs/rfnext/rfnext_fixed_single_branch_mask_rcnn_pvtv2-b0_fpn_1x_coco.py @@ -0,0 +1,46 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# model setting +model = dict( + backbone=dict( + _delete_=True, + type='PyramidVisionTransformerV2', + embed_dims=32, + num_layers=[2, 2, 2, 2], + init_cfg=dict( + checkpoint= # noqa + 'https://github.com/whai362/PVT/releases/download/v2/pvt_v2_b0.pth' # noqa + )), + neck=dict( + type='FPN', + in_channels=[32, 64, 160, 256], + out_channels=256, + num_outs=5)) + +# optimizer +optimizer = dict(_delete_=True, type='AdamW', lr=0.0002, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) + +custom_hooks = [ + dict( + type='RFSearchHook', + mode='fixed_single_branch', + rfstructure_file= # noqa + './configs/rfnext/search_log/mask_rcnn_pvtv2-b0_fpn_1x_coco/local_search_config_step10.json', # noqa + verbose=True, + by_epoch=True, + config=dict( + search=dict( + step=0, + max_step=11, + search_interval=1, + exp_rate=0.5, + init_alphas=0.01, + mmin=1, + mmax=24, + num_branches=2, + skip_layer=[]))) +] diff --git a/configs/rfnext/rfnext_fixed_single_branch_panoptic_fpn_r2_50_fpn_fp16_1x_coco.py b/configs/rfnext/rfnext_fixed_single_branch_panoptic_fpn_r2_50_fpn_fp16_1x_coco.py new file mode 100644 index 0000000..da45eba --- /dev/null +++ b/configs/rfnext/rfnext_fixed_single_branch_panoptic_fpn_r2_50_fpn_fp16_1x_coco.py @@ -0,0 +1,22 @@ +_base_ = '../panoptic_fpn/panoptic_fpn_r2_50_fpn_fp16_1x_coco.py' + +custom_hooks = [ + dict( + type='RFSearchHook', + mode='fixed_single_branch', + rfstructure_file= # noqa + './configs/rfnext/search_log/panoptic_fpn_r2_50_fpn_fp16_1x_coco/local_search_config_step10.json', # noqa + verbose=True, + by_epoch=True, + config=dict( + search=dict( + step=0, + max_step=11, + search_interval=1, + exp_rate=0.5, + init_alphas=0.01, + mmin=1, + mmax=24, + num_branches=2, + skip_layer=['stem', 'layer1']))) +] diff --git a/configs/rfnext/rfnext_search_cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py b/configs/rfnext/rfnext_search_cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py new file mode 100644 index 0000000..3a99123 --- /dev/null +++ b/configs/rfnext/rfnext_search_cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py @@ -0,0 +1,21 @@ +_base_ = '../convnext/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py' # noqa + +custom_hooks = [ + dict( + type='RFSearchHook', + mode='search', + rfstructure_file=None, + verbose=True, + by_epoch=True, + config=dict( + search=dict( + step=0, + max_step=12, + search_interval=1, + exp_rate=0.5, + init_alphas=0.01, + mmin=1, + mmax=24, + num_branches=2, + skip_layer=[]))) +] diff --git a/configs/rfnext/rfnext_search_cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py b/configs/rfnext/rfnext_search_cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py new file mode 100644 index 0000000..3a76939 --- /dev/null +++ b/configs/rfnext/rfnext_search_cascade_mask_rcnn_hrnetv2p_w18_20e_coco.py @@ -0,0 +1,21 @@ +_base_ = '../hrnet/cascade_mask_rcnn_hrnetv2p_w32_20e_coco.py' + +custom_hooks = [ + dict( + type='RFSearchHook', + mode='search', + rfstructure_file=None, + verbose=True, + by_epoch=True, + config=dict( + search=dict( + step=0, + max_step=12, + search_interval=1, + exp_rate=0.5, + init_alphas=0.01, + mmin=1, + mmax=24, + num_branches=2, + skip_layer=[]))) +] diff --git a/configs/rfnext/rfnext_search_cascade_mask_rcnn_r2_101_fpn_20e_coco.py b/configs/rfnext/rfnext_search_cascade_mask_rcnn_r2_101_fpn_20e_coco.py new file mode 100644 index 0000000..364ce28 --- /dev/null +++ b/configs/rfnext/rfnext_search_cascade_mask_rcnn_r2_101_fpn_20e_coco.py @@ -0,0 +1,22 @@ +_base_ = '../res2net/cascade_mask_rcnn_r2_101_fpn_20e_coco.py' + +custom_hooks = [ + dict(type='NumClassCheckHook'), + dict( + type='RFSearchHook', + mode='search', + rfstructure_file=None, + verbose=True, + by_epoch=True, + config=dict( + search=dict( + step=0, + max_step=12, + search_interval=1, + exp_rate=0.5, + init_alphas=0.01, + mmin=1, + mmax=24, + num_branches=2, + skip_layer=['stem', 'layer1']))) +] diff --git a/configs/rfnext/rfnext_search_mask_rcnn_pvtv2-b0_fpn_1x_coco.py b/configs/rfnext/rfnext_search_mask_rcnn_pvtv2-b0_fpn_1x_coco.py new file mode 100644 index 0000000..ee2e288 --- /dev/null +++ b/configs/rfnext/rfnext_search_mask_rcnn_pvtv2-b0_fpn_1x_coco.py @@ -0,0 +1,45 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# model setting +model = dict( + backbone=dict( + _delete_=True, + type='PyramidVisionTransformerV2', + embed_dims=32, + num_layers=[2, 2, 2, 2], + init_cfg=dict( + checkpoint= # noqa + 'https://github.com/whai362/PVT/releases/download/v2/pvt_v2_b0.pth' # noqa + )), + neck=dict( + type='FPN', + in_channels=[32, 64, 160, 256], + out_channels=256, + num_outs=5)) + +# optimizer +optimizer = dict(_delete_=True, type='AdamW', lr=0.0002, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) + +custom_hooks = [ + dict( + type='RFSearchHook', + mode='search', + rfstructure_file=None, + verbose=True, + by_epoch=True, + config=dict( + search=dict( + step=0, + max_step=11, + search_interval=1, + exp_rate=0.5, + init_alphas=0.01, + mmin=1, + mmax=24, + num_branches=2, + skip_layer=[]))) +] diff --git a/configs/rfnext/rfnext_search_panoptic_fpn_r2_50_fpn_fp16_1x_coco.py b/configs/rfnext/rfnext_search_panoptic_fpn_r2_50_fpn_fp16_1x_coco.py new file mode 100644 index 0000000..4c9816d --- /dev/null +++ b/configs/rfnext/rfnext_search_panoptic_fpn_r2_50_fpn_fp16_1x_coco.py @@ -0,0 +1,21 @@ +_base_ = '../panoptic_fpn/panoptic_fpn_r2_50_fpn_fp16_1x_coco.py' + +custom_hooks = [ + dict( + type='RFSearchHook', + mode='search', + rfstructure_file=None, + verbose=True, + by_epoch=True, + config=dict( + search=dict( + step=0, + max_step=11, + search_interval=1, + exp_rate=0.5, + init_alphas=0.01, + mmin=1, + mmax=24, + num_branches=2, + skip_layer=['stem', 'layer1']))) +] diff --git a/configs/rfnext/search_log/cascade_mask_rcnn_hrnetv2p_w18_20e_coco/local_search_config_step11.json b/configs/rfnext/search_log/cascade_mask_rcnn_hrnetv2p_w18_20e_coco/local_search_config_step11.json new file mode 100644 index 0000000..e5dfef7 --- /dev/null +++ b/configs/rfnext/search_log/cascade_mask_rcnn_hrnetv2p_w18_20e_coco/local_search_config_step11.json @@ -0,0 +1,1133 @@ +{ + "search": { + "step": 11, + "max_step": 12, + "search_interval": 1, + "exp_rate": 0.5, + "init_alphas": 0.01, + "mmin": 1, + "mmax": 24, + "num_branches": 2, + "skip_layer": [ + "layer1" + ] + }, + "structure": { + "module.backbone.conv1": [ + 1, + 1 + ], + "module.backbone.conv2": [ + 1, + 1 + ], + "module.backbone.transition1.0.0": [ + 1, + 1 + ], + "module.backbone.transition1.1.0.0": [ + 1, + 1 + ], + "module.backbone.stage2.0.branches.0.0.conv1": [ + 2, + 2 + ], + "module.backbone.stage2.0.branches.0.0.conv2": [ + 1, + 1 + ], + "module.backbone.stage2.0.branches.0.1.conv1": [ + 1, + 1 + ], + "module.backbone.stage2.0.branches.0.1.conv2": [ + 2, + 2 + ], + "module.backbone.stage2.0.branches.0.2.conv1": [ + 1, + 1 + ], + "module.backbone.stage2.0.branches.0.2.conv2": [ + 2, + 2 + ], + "module.backbone.stage2.0.branches.0.3.conv1": [ + 1, + 1 + ], + "module.backbone.stage2.0.branches.0.3.conv2": [ + 1, + 1 + ], + "module.backbone.stage2.0.branches.1.0.conv1": [ + 3, + 3 + ], + "module.backbone.stage2.0.branches.1.0.conv2": [ + 4, + 4 + ], + "module.backbone.stage2.0.branches.1.1.conv1": [ + 1, + 1 + ], + "module.backbone.stage2.0.branches.1.1.conv2": [ + 2, + 2 + ], + "module.backbone.stage2.0.branches.1.2.conv1": [ + 1, + 1 + ], + "module.backbone.stage2.0.branches.1.2.conv2": [ + 1, + 1 + ], + "module.backbone.stage2.0.branches.1.3.conv1": [ + 1, + 1 + ], + "module.backbone.stage2.0.branches.1.3.conv2": [ + 1, + 1 + ], + "module.backbone.stage2.0.fuse_layers.1.0.0.0": [ + 1, + 1 + ], + "module.backbone.transition2.2.0.0": [ + 1, + 1 + ], + "module.backbone.stage3.0.branches.0.0.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.0.branches.0.0.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.0.branches.0.1.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.0.branches.0.1.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.0.branches.0.2.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.0.branches.0.2.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.0.branches.0.3.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.0.branches.0.3.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.0.branches.1.0.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.0.branches.1.0.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.0.branches.1.1.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.0.branches.1.1.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.0.branches.1.2.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.0.branches.1.2.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.0.branches.1.3.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.0.branches.1.3.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.0.branches.2.0.conv1": [ + 2, + 2 + ], + "module.backbone.stage3.0.branches.2.0.conv2": [ + 2, + 2 + ], + "module.backbone.stage3.0.branches.2.1.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.0.branches.2.1.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.0.branches.2.2.conv1": [ + 3, + 3 + ], + "module.backbone.stage3.0.branches.2.2.conv2": [ + 3, + 3 + ], + "module.backbone.stage3.0.branches.2.3.conv1": [ + 3, + 3 + ], + "module.backbone.stage3.0.branches.2.3.conv2": [ + 7, + 7 + ], + "module.backbone.stage3.0.fuse_layers.1.0.0.0": [ + 1, + 1 + ], + "module.backbone.stage3.0.fuse_layers.2.0.0.0": [ + 1, + 1 + ], + "module.backbone.stage3.0.fuse_layers.2.0.1.0": [ + 1, + 1 + ], + "module.backbone.stage3.0.fuse_layers.2.1.0.0": [ + 1, + 1 + ], + "module.backbone.stage3.1.branches.0.0.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.1.branches.0.0.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.1.branches.0.1.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.1.branches.0.1.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.1.branches.0.2.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.1.branches.0.2.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.1.branches.0.3.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.1.branches.0.3.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.1.branches.1.0.conv1": [ + 2, + 2 + ], + "module.backbone.stage3.1.branches.1.0.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.1.branches.1.1.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.1.branches.1.1.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.1.branches.1.2.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.1.branches.1.2.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.1.branches.1.3.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.1.branches.1.3.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.1.branches.2.0.conv1": [ + 2, + 2 + ], + "module.backbone.stage3.1.branches.2.0.conv2": [ + 2, + 2 + ], + "module.backbone.stage3.1.branches.2.1.conv1": [ + 3, + 3 + ], + "module.backbone.stage3.1.branches.2.1.conv2": [ + 5, + 5 + ], + "module.backbone.stage3.1.branches.2.2.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.1.branches.2.2.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.1.branches.2.3.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.1.branches.2.3.conv2": [ + 2, + 2 + ], + "module.backbone.stage3.1.fuse_layers.1.0.0.0": [ + 1, + 1 + ], + "module.backbone.stage3.1.fuse_layers.2.0.0.0": [ + 1, + 1 + ], + "module.backbone.stage3.1.fuse_layers.2.0.1.0": [ + 1, + 1 + ], + "module.backbone.stage3.1.fuse_layers.2.1.0.0": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.0.0.conv1": [ + 2, + 2 + ], + "module.backbone.stage3.2.branches.0.0.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.0.1.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.0.1.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.0.2.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.0.2.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.0.3.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.0.3.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.1.0.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.1.0.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.1.1.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.1.1.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.1.2.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.1.2.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.1.3.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.1.3.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.2.0.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.2.0.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.2.1.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.2.1.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.2.2.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.2.2.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.2.3.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.2.branches.2.3.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.2.fuse_layers.1.0.0.0": [ + 1, + 1 + ], + "module.backbone.stage3.2.fuse_layers.2.0.0.0": [ + 1, + 1 + ], + "module.backbone.stage3.2.fuse_layers.2.0.1.0": [ + 1, + 1 + ], + "module.backbone.stage3.2.fuse_layers.2.1.0.0": [ + 1, + 1 + ], + "module.backbone.stage3.3.branches.0.0.conv1": [ + 2, + 2 + ], + "module.backbone.stage3.3.branches.0.0.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.3.branches.0.1.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.3.branches.0.1.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.3.branches.0.2.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.3.branches.0.2.conv2": [ + 2, + 2 + ], + "module.backbone.stage3.3.branches.0.3.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.3.branches.0.3.conv2": [ + 2, + 2 + ], + "module.backbone.stage3.3.branches.1.0.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.3.branches.1.0.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.3.branches.1.1.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.3.branches.1.1.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.3.branches.1.2.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.3.branches.1.2.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.3.branches.1.3.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.3.branches.1.3.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.3.branches.2.0.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.3.branches.2.0.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.3.branches.2.1.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.3.branches.2.1.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.3.branches.2.2.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.3.branches.2.2.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.3.branches.2.3.conv1": [ + 1, + 1 + ], + "module.backbone.stage3.3.branches.2.3.conv2": [ + 1, + 1 + ], + "module.backbone.stage3.3.fuse_layers.1.0.0.0": [ + 1, + 1 + ], + "module.backbone.stage3.3.fuse_layers.2.0.0.0": [ + 1, + 1 + ], + "module.backbone.stage3.3.fuse_layers.2.0.1.0": [ + 1, + 1 + ], + "module.backbone.stage3.3.fuse_layers.2.1.0.0": [ + 1, + 1 + ], + "module.backbone.transition3.3.0.0": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.0.0.conv1": [ + 2, + 2 + ], + "module.backbone.stage4.0.branches.0.0.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.0.1.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.0.1.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.0.2.conv1": [ + 2, + 2 + ], + "module.backbone.stage4.0.branches.0.2.conv2": [ + 2, + 2 + ], + "module.backbone.stage4.0.branches.0.3.conv1": [ + 2, + 2 + ], + "module.backbone.stage4.0.branches.0.3.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.1.0.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.1.0.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.1.1.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.1.1.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.1.2.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.1.2.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.1.3.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.1.3.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.2.0.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.2.0.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.2.1.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.2.1.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.2.2.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.2.2.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.2.3.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.2.3.conv2": [ + 2, + 2 + ], + "module.backbone.stage4.0.branches.3.0.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.3.0.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.3.1.conv1": [ + 2, + 2 + ], + "module.backbone.stage4.0.branches.3.1.conv2": [ + 2, + 2 + ], + "module.backbone.stage4.0.branches.3.2.conv1": [ + 3, + 3 + ], + "module.backbone.stage4.0.branches.3.2.conv2": [ + 3, + 3 + ], + "module.backbone.stage4.0.branches.3.3.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.0.branches.3.3.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.0.fuse_layers.1.0.0.0": [ + 1, + 1 + ], + "module.backbone.stage4.0.fuse_layers.2.0.0.0": [ + 1, + 1 + ], + "module.backbone.stage4.0.fuse_layers.2.0.1.0": [ + 1, + 1 + ], + "module.backbone.stage4.0.fuse_layers.2.1.0.0": [ + 1, + 1 + ], + "module.backbone.stage4.0.fuse_layers.3.0.0.0": [ + 1, + 1 + ], + "module.backbone.stage4.0.fuse_layers.3.0.1.0": [ + 2, + 2 + ], + "module.backbone.stage4.0.fuse_layers.3.0.2.0": [ + 1, + 1 + ], + "module.backbone.stage4.0.fuse_layers.3.1.0.0": [ + 1, + 1 + ], + "module.backbone.stage4.0.fuse_layers.3.1.1.0": [ + 1, + 1 + ], + "module.backbone.stage4.0.fuse_layers.3.2.0.0": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.0.0.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.0.0.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.0.1.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.0.1.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.0.2.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.0.2.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.0.3.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.0.3.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.1.0.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.1.0.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.1.1.conv1": [ + 2, + 2 + ], + "module.backbone.stage4.1.branches.1.1.conv2": [ + 2, + 2 + ], + "module.backbone.stage4.1.branches.1.2.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.1.2.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.1.3.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.1.3.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.2.0.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.2.0.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.2.1.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.2.1.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.2.2.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.2.2.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.2.3.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.2.3.conv2": [ + 2, + 2 + ], + "module.backbone.stage4.1.branches.3.0.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.3.0.conv2": [ + 2, + 2 + ], + "module.backbone.stage4.1.branches.3.1.conv1": [ + 2, + 2 + ], + "module.backbone.stage4.1.branches.3.1.conv2": [ + 2, + 2 + ], + "module.backbone.stage4.1.branches.3.2.conv1": [ + 2, + 2 + ], + "module.backbone.stage4.1.branches.3.2.conv2": [ + 3, + 3 + ], + "module.backbone.stage4.1.branches.3.3.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.1.branches.3.3.conv2": [ + 2, + 2 + ], + "module.backbone.stage4.1.fuse_layers.1.0.0.0": [ + 1, + 1 + ], + "module.backbone.stage4.1.fuse_layers.2.0.0.0": [ + 1, + 1 + ], + "module.backbone.stage4.1.fuse_layers.2.0.1.0": [ + 1, + 1 + ], + "module.backbone.stage4.1.fuse_layers.2.1.0.0": [ + 1, + 1 + ], + "module.backbone.stage4.1.fuse_layers.3.0.0.0": [ + 1, + 1 + ], + "module.backbone.stage4.1.fuse_layers.3.0.1.0": [ + 1, + 1 + ], + "module.backbone.stage4.1.fuse_layers.3.0.2.0": [ + 1, + 1 + ], + "module.backbone.stage4.1.fuse_layers.3.1.0.0": [ + 1, + 1 + ], + "module.backbone.stage4.1.fuse_layers.3.1.1.0": [ + 1, + 1 + ], + "module.backbone.stage4.1.fuse_layers.3.2.0.0": [ + 1, + 1 + ], + "module.backbone.stage4.2.branches.0.0.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.2.branches.0.0.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.2.branches.0.1.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.2.branches.0.1.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.2.branches.0.2.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.2.branches.0.2.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.2.branches.0.3.conv1": [ + 2, + 2 + ], + "module.backbone.stage4.2.branches.0.3.conv2": [ + 2, + 2 + ], + "module.backbone.stage4.2.branches.1.0.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.2.branches.1.0.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.2.branches.1.1.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.2.branches.1.1.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.2.branches.1.2.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.2.branches.1.2.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.2.branches.1.3.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.2.branches.1.3.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.2.branches.2.0.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.2.branches.2.0.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.2.branches.2.1.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.2.branches.2.1.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.2.branches.2.2.conv1": [ + 1, + 1 + ], + "module.backbone.stage4.2.branches.2.2.conv2": [ + 1, + 1 + ], + "module.backbone.stage4.2.branches.2.3.conv1": [ + 3, + 3 + ], + "module.backbone.stage4.2.branches.2.3.conv2": [ + 2, + 2 + ], + "module.backbone.stage4.2.branches.3.0.conv1": [ + 2, + 2 + ], + "module.backbone.stage4.2.branches.3.0.conv2": [ + 3, + 3 + ], + "module.backbone.stage4.2.branches.3.1.conv1": [ + 3, + 3 + ], + "module.backbone.stage4.2.branches.3.1.conv2": [ + 3, + 3 + ], + "module.backbone.stage4.2.branches.3.2.conv1": [ + 3, + 3 + ], + "module.backbone.stage4.2.branches.3.2.conv2": [ + 8, + 8 + ], + "module.backbone.stage4.2.branches.3.3.conv1": [ + 10, + 10 + ], + "module.backbone.stage4.2.branches.3.3.conv2": [ + 10, + 10 + ], + "module.backbone.stage4.2.fuse_layers.1.0.0.0": [ + 2, + 2 + ], + "module.backbone.stage4.2.fuse_layers.2.0.0.0": [ + 2, + 2 + ], + "module.backbone.stage4.2.fuse_layers.2.0.1.0": [ + 1, + 1 + ], + "module.backbone.stage4.2.fuse_layers.2.1.0.0": [ + 1, + 1 + ], + "module.backbone.stage4.2.fuse_layers.3.0.0.0": [ + 2, + 2 + ], + "module.backbone.stage4.2.fuse_layers.3.0.1.0": [ + 1, + 1 + ], + "module.backbone.stage4.2.fuse_layers.3.0.2.0": [ + 3, + 3 + ], + "module.backbone.stage4.2.fuse_layers.3.1.0.0": [ + 1, + 1 + ], + "module.backbone.stage4.2.fuse_layers.3.1.1.0": [ + 3, + 3 + ], + "module.backbone.stage4.2.fuse_layers.3.2.0.0": [ + 4, + 4 + ], + "module.neck.fpn_convs.0.conv": [ + 1, + 1 + ], + "module.neck.fpn_convs.1.conv": [ + 1, + 1 + ], + "module.neck.fpn_convs.2.conv": [ + 1, + 1 + ], + "module.neck.fpn_convs.3.conv": [ + 1, + 1 + ], + "module.neck.fpn_convs.4.conv": [ + 3, + 3 + ], + "module.rpn_head.rpn_conv": [ + 4, + 4 + ], + "module.roi_head.mask_head.0.convs.0.conv": [ + 1, + 1 + ], + "module.roi_head.mask_head.0.convs.1.conv": [ + 1, + 1 + ], + "module.roi_head.mask_head.0.convs.2.conv": [ + 3, + 3 + ], + "module.roi_head.mask_head.0.convs.3.conv": [ + 2, + 2 + ], + "module.roi_head.mask_head.1.convs.0.conv": [ + 1, + 1 + ], + "module.roi_head.mask_head.1.convs.1.conv": [ + 1, + 1 + ], + "module.roi_head.mask_head.1.convs.2.conv": [ + 2, + 2 + ], + "module.roi_head.mask_head.1.convs.3.conv": [ + 1, + 1 + ], + "module.roi_head.mask_head.2.convs.0.conv": [ + 1, + 1 + ], + "module.roi_head.mask_head.2.convs.1.conv": [ + 1, + 1 + ], + "module.roi_head.mask_head.2.convs.2.conv": [ + 1, + 1 + ], + "module.roi_head.mask_head.2.convs.3.conv": [ + 1, + 1 + ] + } +} diff --git a/configs/rfnext/search_log/cascade_mask_rcnn_r2_101_fpn_20e_coco/local_search_config_step11.json b/configs/rfnext/search_log/cascade_mask_rcnn_r2_101_fpn_20e_coco/local_search_config_step11.json new file mode 100644 index 0000000..64757c6 --- /dev/null +++ b/configs/rfnext/search_log/cascade_mask_rcnn_r2_101_fpn_20e_coco/local_search_config_step11.json @@ -0,0 +1,124 @@ +{ + "search": { + "step": 11, + "max_step": 12, + "search_interval": 1, + "exp_rate": 0.5, + "init_alphas": 0.01, + "mmin": 1, + "mmax": 24, + "num_branches": 2, + "skip_layer": [ + "stem", "layer1" + ] + }, + "structure": { + "module.backbone.layer2.0.convs.0": 1, + "module.backbone.layer2.0.convs.1": 1, + "module.backbone.layer2.0.convs.2": 1, + "module.backbone.layer2.1.convs.0": 1, + "module.backbone.layer2.1.convs.1": 1, + "module.backbone.layer2.1.convs.2": 1, + "module.backbone.layer2.2.convs.0": 1, + "module.backbone.layer2.2.convs.1": 1, + "module.backbone.layer2.2.convs.2": 1, + "module.backbone.layer2.3.convs.0": 1, + "module.backbone.layer2.3.convs.1": 1, + "module.backbone.layer2.3.convs.2": 1, + "module.backbone.layer3.0.convs.0": 1, + "module.backbone.layer3.0.convs.1": 1, + "module.backbone.layer3.0.convs.2": 1, + "module.backbone.layer3.1.convs.0": 2, + "module.backbone.layer3.1.convs.1": 1, + "module.backbone.layer3.1.convs.2": 2, + "module.backbone.layer3.2.convs.0": 2, + "module.backbone.layer3.2.convs.1": 1, + "module.backbone.layer3.2.convs.2": 2, + "module.backbone.layer3.3.convs.0": 2, + "module.backbone.layer3.3.convs.1": 2, + "module.backbone.layer3.3.convs.2": 2, + "module.backbone.layer3.4.convs.0": 1, + "module.backbone.layer3.4.convs.1": 2, + "module.backbone.layer3.4.convs.2": 2, + "module.backbone.layer3.5.convs.0": 2, + "module.backbone.layer3.5.convs.1": 2, + "module.backbone.layer3.5.convs.2": 2, + "module.backbone.layer3.6.convs.0": 2, + "module.backbone.layer3.6.convs.1": 2, + "module.backbone.layer3.6.convs.2": 3, + "module.backbone.layer3.7.convs.0": 1, + "module.backbone.layer3.7.convs.1": 1, + "module.backbone.layer3.7.convs.2": 2, + "module.backbone.layer3.8.convs.0": 1, + "module.backbone.layer3.8.convs.1": 2, + "module.backbone.layer3.8.convs.2": 3, + "module.backbone.layer3.9.convs.0": 1, + "module.backbone.layer3.9.convs.1": 1, + "module.backbone.layer3.9.convs.2": 3, + "module.backbone.layer3.10.convs.0": 1, + "module.backbone.layer3.10.convs.1": 2, + "module.backbone.layer3.10.convs.2": 2, + "module.backbone.layer3.11.convs.0": 1, + "module.backbone.layer3.11.convs.1": 1, + "module.backbone.layer3.11.convs.2": 2, + "module.backbone.layer3.12.convs.0": 1, + "module.backbone.layer3.12.convs.1": 1, + "module.backbone.layer3.12.convs.2": 2, + "module.backbone.layer3.13.convs.0": 2, + "module.backbone.layer3.13.convs.1": 2, + "module.backbone.layer3.13.convs.2": 2, + "module.backbone.layer3.14.convs.0": 2, + "module.backbone.layer3.14.convs.1": 2, + "module.backbone.layer3.14.convs.2": 2, + "module.backbone.layer3.15.convs.0": 2, + "module.backbone.layer3.15.convs.1": 2, + "module.backbone.layer3.15.convs.2": 2, + "module.backbone.layer3.16.convs.0": 3, + "module.backbone.layer3.16.convs.1": 4, + "module.backbone.layer3.16.convs.2": 3, + "module.backbone.layer3.17.convs.0": 10, + "module.backbone.layer3.17.convs.1": 3, + "module.backbone.layer3.17.convs.2": 9, + "module.backbone.layer3.18.convs.0": 3, + "module.backbone.layer3.18.convs.1": 6, + "module.backbone.layer3.18.convs.2": 3, + "module.backbone.layer3.19.convs.0": 1, + "module.backbone.layer3.19.convs.1": 1, + "module.backbone.layer3.19.convs.2": 2, + "module.backbone.layer3.20.convs.0": 2, + "module.backbone.layer3.20.convs.1": 2, + "module.backbone.layer3.20.convs.2": 1, + "module.backbone.layer3.21.convs.0": 2, + "module.backbone.layer3.21.convs.1": 1, + "module.backbone.layer3.21.convs.2": 1, + "module.backbone.layer3.22.convs.0": 2, + "module.backbone.layer3.22.convs.1": 3, + "module.backbone.layer3.22.convs.2": 1, + "module.backbone.layer4.0.convs.0": 3, + "module.backbone.layer4.0.convs.1": 3, + "module.backbone.layer4.0.convs.2": 3, + "module.backbone.layer4.1.convs.0": 1, + "module.backbone.layer4.1.convs.1": 2, + "module.backbone.layer4.1.convs.2": 3, + "module.backbone.layer4.2.convs.0": 1, + "module.backbone.layer4.2.convs.1": 3, + "module.backbone.layer4.2.convs.2": 8, + "module.neck.fpn_convs.0.conv": 1, + "module.neck.fpn_convs.1.conv": 1, + "module.neck.fpn_convs.2.conv": 1, + "module.neck.fpn_convs.3.conv": 1, + "module.rpn_head.rpn_conv": 3, + "module.roi_head.mask_head.0.convs.0.conv": 1, + "module.roi_head.mask_head.0.convs.1.conv": 1, + "module.roi_head.mask_head.0.convs.2.conv": 3, + "module.roi_head.mask_head.0.convs.3.conv": 1, + "module.roi_head.mask_head.1.convs.0.conv": 1, + "module.roi_head.mask_head.1.convs.1.conv": 1, + "module.roi_head.mask_head.1.convs.2.conv": 2, + "module.roi_head.mask_head.1.convs.3.conv": 1, + "module.roi_head.mask_head.2.convs.0.conv": 1, + "module.roi_head.mask_head.2.convs.1.conv": 1, + "module.roi_head.mask_head.2.convs.2.conv": 2, + "module.roi_head.mask_head.2.convs.3.conv": 1 + } +} diff --git a/configs/rfnext/search_log/convnext_cascade_maskrcnn/local_search_config_step11.json b/configs/rfnext/search_log/convnext_cascade_maskrcnn/local_search_config_step11.json new file mode 100644 index 0000000..fd115c2 --- /dev/null +++ b/configs/rfnext/search_log/convnext_cascade_maskrcnn/local_search_config_step11.json @@ -0,0 +1,62 @@ +{ + "search": { + "step": 11, + "max_step": 12, + "search_interval": 1, + "exp_rate": 0.5, + "init_alphas": 0.01, + "mmin": 1, + "mmax": 24, + "num_branches": 2, + "skip_layer": [] + }, + "structure": { + "module.backbone.stages.0.0.depthwise_conv": 1, + "module.backbone.stages.0.1.depthwise_conv": 1, + "module.backbone.stages.0.2.depthwise_conv": 1, + "module.backbone.stages.1.0.depthwise_conv": 1, + "module.backbone.stages.1.1.depthwise_conv": 1, + "module.backbone.stages.1.2.depthwise_conv": 1, + "module.backbone.stages.2.0.depthwise_conv": 1, + "module.backbone.stages.2.1.depthwise_conv": 1, + "module.backbone.stages.2.2.depthwise_conv": 1, + "module.backbone.stages.2.3.depthwise_conv": 1, + "module.backbone.stages.2.4.depthwise_conv": 1, + "module.backbone.stages.2.5.depthwise_conv": 1, + "module.backbone.stages.2.6.depthwise_conv": 2, + "module.backbone.stages.2.7.depthwise_conv": 1, + "module.backbone.stages.2.8.depthwise_conv": 1, + "module.backbone.stages.3.0.depthwise_conv": 2, + "module.backbone.stages.3.1.depthwise_conv": 2, + "module.backbone.stages.3.2.depthwise_conv": 2, + "module.neck.fpn_convs.0.conv": 1, + "module.neck.fpn_convs.1.conv": 1, + "module.neck.fpn_convs.2.conv": 1, + "module.neck.fpn_convs.3.conv": 1, + "module.rpn_head.rpn_conv": 3, + "module.roi_head.bbox_head.0.shared_convs.0.conv": 1, + "module.roi_head.bbox_head.0.shared_convs.1.conv": 1, + "module.roi_head.bbox_head.0.shared_convs.2.conv": 1, + "module.roi_head.bbox_head.0.shared_convs.3.conv": 2, + "module.roi_head.bbox_head.1.shared_convs.0.conv": 1, + "module.roi_head.bbox_head.1.shared_convs.1.conv": 2, + "module.roi_head.bbox_head.1.shared_convs.2.conv": 1, + "module.roi_head.bbox_head.1.shared_convs.3.conv": 1, + "module.roi_head.bbox_head.2.shared_convs.0.conv": 1, + "module.roi_head.bbox_head.2.shared_convs.1.conv": 2, + "module.roi_head.bbox_head.2.shared_convs.2.conv": 2, + "module.roi_head.bbox_head.2.shared_convs.3.conv": 1, + "module.roi_head.mask_head.0.convs.0.conv": 1, + "module.roi_head.mask_head.0.convs.1.conv": 3, + "module.roi_head.mask_head.0.convs.2.conv": 3, + "module.roi_head.mask_head.0.convs.3.conv": 2, + "module.roi_head.mask_head.1.convs.0.conv": 1, + "module.roi_head.mask_head.1.convs.1.conv": 3, + "module.roi_head.mask_head.1.convs.2.conv": 2, + "module.roi_head.mask_head.1.convs.3.conv": 1, + "module.roi_head.mask_head.2.convs.0.conv": 1, + "module.roi_head.mask_head.2.convs.1.conv": 2, + "module.roi_head.mask_head.2.convs.2.conv": 2, + "module.roi_head.mask_head.2.convs.3.conv": 1 + } +} diff --git a/configs/rfnext/search_log/mask_rcnn_pvtv2-b0_fpn_1x_coco/local_search_config_step10.json b/configs/rfnext/search_log/mask_rcnn_pvtv2-b0_fpn_1x_coco/local_search_config_step10.json new file mode 100644 index 0000000..f7ad2e8 --- /dev/null +++ b/configs/rfnext/search_log/mask_rcnn_pvtv2-b0_fpn_1x_coco/local_search_config_step10.json @@ -0,0 +1,99 @@ +{ + "search": { + "step": 10, + "max_step": 11, + "search_interval": 1, + "exp_rate": 0.5, + "init_alphas": 0.01, + "mmin": 1, + "mmax": 24, + "num_branches": 2, + "skip_layer": [] + }, + "structure": { + "module.backbone.layers.0.0.projection": [ + 1, + 1 + ], + "module.backbone.layers.0.1.0.ffn.layers.1": [ + 1, + 1 + ], + "module.backbone.layers.0.1.1.ffn.layers.1": [ + 1, + 1 + ], + "module.backbone.layers.1.0.projection": [ + 1, + 1 + ], + "module.backbone.layers.1.1.0.ffn.layers.1": [ + 1, + 1 + ], + "module.backbone.layers.1.1.1.ffn.layers.1": [ + 1, + 1 + ], + "module.backbone.layers.2.0.projection": [ + 1, + 1 + ], + "module.backbone.layers.2.1.0.ffn.layers.1": [ + 1, + 1 + ], + "module.backbone.layers.2.1.1.ffn.layers.1": [ + 1, + 1 + ], + "module.backbone.layers.3.0.projection": [ + 1, + 1 + ], + "module.backbone.layers.3.1.0.ffn.layers.1": [ + 2, + 2 + ], + "module.backbone.layers.3.1.1.ffn.layers.1": [ + 1, + 1 + ], + "module.neck.fpn_convs.0.conv": [ + 1, + 1 + ], + "module.neck.fpn_convs.1.conv": [ + 2, + 2 + ], + "module.neck.fpn_convs.2.conv": [ + 2, + 2 + ], + "module.neck.fpn_convs.3.conv": [ + 2, + 2 + ], + "module.rpn_head.rpn_conv": [ + 3, + 3 + ], + "module.roi_head.mask_head.convs.0.conv": [ + 1, + 1 + ], + "module.roi_head.mask_head.convs.1.conv": [ + 2, + 2 + ], + "module.roi_head.mask_head.convs.2.conv": [ + 2, + 2 + ], + "module.roi_head.mask_head.convs.3.conv": [ + 2, + 2 + ] + } +} diff --git a/configs/rfnext/search_log/panoptic_fpn_r2_50_fpn_fp16_1x_coco/local_search_config_step10.json b/configs/rfnext/search_log/panoptic_fpn_r2_50_fpn_fp16_1x_coco/local_search_config_step10.json new file mode 100644 index 0000000..dce0275 --- /dev/null +++ b/configs/rfnext/search_log/panoptic_fpn_r2_50_fpn_fp16_1x_coco/local_search_config_step10.json @@ -0,0 +1,238 @@ +{ + "search": { + "step": 10, + "max_step": 11, + "search_interval": 1, + "exp_rate": 0.5, + "init_alphas": 0.01, + "mmin": 1, + "mmax": 24, + "num_branches": 2, + "skip_layer": [ + "stem", + "layer1" + ] + }, + "structure": { + "module.backbone.layer2.0.convs.0": [ + 1, + 1 + ], + "module.backbone.layer2.0.convs.1": [ + 1, + 1 + ], + "module.backbone.layer2.0.convs.2": [ + 1, + 1 + ], + "module.backbone.layer2.1.convs.0": [ + 2, + 2 + ], + "module.backbone.layer2.1.convs.1": [ + 2, + 2 + ], + "module.backbone.layer2.1.convs.2": [ + 2, + 2 + ], + "module.backbone.layer2.2.convs.0": [ + 1, + 1 + ], + "module.backbone.layer2.2.convs.1": [ + 1, + 1 + ], + "module.backbone.layer2.2.convs.2": [ + 2, + 2 + ], + "module.backbone.layer2.3.convs.0": [ + 1, + 1 + ], + "module.backbone.layer2.3.convs.1": [ + 1, + 1 + ], + "module.backbone.layer2.3.convs.2": [ + 1, + 1 + ], + "module.backbone.layer3.0.convs.0": [ + 2, + 2 + ], + "module.backbone.layer3.0.convs.1": [ + 2, + 2 + ], + "module.backbone.layer3.0.convs.2": [ + 2, + 2 + ], + "module.backbone.layer3.1.convs.0": [ + 2, + 2 + ], + "module.backbone.layer3.1.convs.1": [ + 2, + 2 + ], + "module.backbone.layer3.1.convs.2": [ + 3, + 3 + ], + "module.backbone.layer3.2.convs.0": [ + 1, + 1 + ], + "module.backbone.layer3.2.convs.1": [ + 2, + 2 + ], + "module.backbone.layer3.2.convs.2": [ + 2, + 2 + ], + "module.backbone.layer3.3.convs.0": [ + 3, + 3 + ], + "module.backbone.layer3.3.convs.1": [ + 3, + 3 + ], + "module.backbone.layer3.3.convs.2": [ + 3, + 3 + ], + "module.backbone.layer3.4.convs.0": [ + 2, + 2 + ], + "module.backbone.layer3.4.convs.1": [ + 1, + 1 + ], + "module.backbone.layer3.4.convs.2": [ + 2, + 2 + ], + "module.backbone.layer3.5.convs.0": [ + 2, + 2 + ], + "module.backbone.layer3.5.convs.1": [ + 2, + 2 + ], + "module.backbone.layer3.5.convs.2": [ + 3, + 3 + ], + "module.backbone.layer4.0.convs.0": [ + 3, + 3 + ], + "module.backbone.layer4.0.convs.1": [ + 3, + 3 + ], + "module.backbone.layer4.0.convs.2": [ + 3, + 3 + ], + "module.backbone.layer4.1.convs.0": [ + 3, + 3 + ], + "module.backbone.layer4.1.convs.1": [ + 8, + 8 + ], + "module.backbone.layer4.1.convs.2": [ + 10, + 10 + ], + "module.backbone.layer4.2.convs.0": [ + 3, + 3 + ], + "module.backbone.layer4.2.convs.1": [ + 2, + 2 + ], + "module.backbone.layer4.2.convs.2": [ + 5, + 5 + ], + "module.neck.fpn_convs.0.conv": [ + 1, + 1 + ], + "module.neck.fpn_convs.1.conv": [ + 2, + 2 + ], + "module.neck.fpn_convs.2.conv": [ + 1, + 1 + ], + "module.neck.fpn_convs.3.conv": [ + 2, + 2 + ], + "module.rpn_head.rpn_conv": [ + 3, + 3 + ], + "module.roi_head.mask_head.convs.0.conv": [ + 1, + 1 + ], + "module.roi_head.mask_head.convs.1.conv": [ + 2, + 2 + ], + "module.roi_head.mask_head.convs.2.conv": [ + 2, + 2 + ], + "module.roi_head.mask_head.convs.3.conv": [ + 1, + 1 + ], + "module.semantic_head.conv_upsample_layers.0.conv.0.conv": [ + 2, + 2 + ], + "module.semantic_head.conv_upsample_layers.1.conv.0.conv": [ + 6, + 6 + ], + "module.semantic_head.conv_upsample_layers.2.conv.0.conv": [ + 2, + 2 + ], + "module.semantic_head.conv_upsample_layers.2.conv.1.conv": [ + 1, + 1 + ], + "module.semantic_head.conv_upsample_layers.3.conv.0.conv": [ + 5, + 5 + ], + "module.semantic_head.conv_upsample_layers.3.conv.1.conv": [ + 3, + 3 + ], + "module.semantic_head.conv_upsample_layers.3.conv.2.conv": [ + 1, + 1 + ] + } +} diff --git a/configs/rpn/README.md b/configs/rpn/README.md new file mode 100644 index 0000000..99addc0 --- /dev/null +++ b/configs/rpn/README.md @@ -0,0 +1,39 @@ +# RPN + +> [Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks](https://arxiv.org/abs/1506.01497) + + + +## Abstract + +State-of-the-art object detection networks depend on region proposal algorithms to hypothesize object locations. Advances like SPPnet and Fast R-CNN have reduced the running time of these detection networks, exposing region proposal computation as a bottleneck. In this work, we introduce a Region Proposal Network (RPN) that shares full-image convolutional features with the detection network, thus enabling nearly cost-free region proposals. An RPN is a fully convolutional network that simultaneously predicts object bounds and objectness scores at each position. The RPN is trained end-to-end to generate high-quality region proposals, which are used by Fast R-CNN for detection. We further merge RPN and Fast R-CNN into a single network by sharing their convolutional features---using the recently popular terminology of neural networks with 'attention' mechanisms, the RPN component tells the unified network where to look. For the very deep VGG-16 model, our detection system has a frame rate of 5fps (including all steps) on a GPU, while achieving state-of-the-art object detection accuracy on PASCAL VOC 2007, 2012, and MS COCO datasets with only 300 proposals per image. In ILSVRC and COCO 2015 competitions, Faster R-CNN and RPN are the foundations of the 1st-place winning entries in several tracks. + +
+ +
+ +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | AR1000 | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :-------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | caffe | 1x | 3.5 | 22.6 | 58.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/rpn/rpn_r50_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/rpn/rpn_r50_caffe_fpn_1x_coco/rpn_r50_caffe_fpn_1x_coco_20200531-5b903a37.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/rpn/rpn_r50_caffe_fpn_1x_coco/rpn_r50_caffe_fpn_1x_coco_20200531_012334.log.json) | +| R-50-FPN | pytorch | 1x | 3.8 | 22.3 | 58.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/rpn/rpn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/rpn/rpn_r50_fpn_1x_coco/rpn_r50_fpn_1x_coco_20200218-5525fa2e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/rpn/rpn_r50_fpn_1x_coco/rpn_r50_fpn_1x_coco_20200218_151240.log.json) | +| R-50-FPN | pytorch | 2x | - | - | 58.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/rpn/rpn_r50_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/rpn/rpn_r50_fpn_2x_coco/rpn_r50_fpn_2x_coco_20200131-0728c9b3.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/rpn/rpn_r50_fpn_2x_coco/rpn_r50_fpn_2x_coco_20200131_190631.log.json) | +| R-101-FPN | caffe | 1x | 5.4 | 17.3 | 60.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/rpn/rpn_r101_caffe_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/rpn/rpn_r101_caffe_fpn_1x_coco/rpn_r101_caffe_fpn_1x_coco_20200531-0629a2e2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/rpn/rpn_r101_caffe_fpn_1x_coco/rpn_r101_caffe_fpn_1x_coco_20200531_012345.log.json) | +| R-101-FPN | pytorch | 1x | 5.8 | 16.5 | 59.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/rpn/rpn_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/rpn/rpn_r101_fpn_1x_coco/rpn_r101_fpn_1x_coco_20200131-2ace2249.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/rpn/rpn_r101_fpn_1x_coco/rpn_r101_fpn_1x_coco_20200131_191000.log.json) | +| R-101-FPN | pytorch | 2x | - | - | 60.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/rpn/rpn_r101_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/rpn/rpn_r101_fpn_2x_coco/rpn_r101_fpn_2x_coco_20200131-24e3db1a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/rpn/rpn_r101_fpn_2x_coco/rpn_r101_fpn_2x_coco_20200131_191106.log.json) | +| X-101-32x4d-FPN | pytorch | 1x | 7.0 | 13.0 | 60.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/rpn/rpn_x101_32x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/rpn/rpn_x101_32x4d_fpn_1x_coco/rpn_x101_32x4d_fpn_1x_coco_20200219-b02646c6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/rpn/rpn_x101_32x4d_fpn_1x_coco/rpn_x101_32x4d_fpn_1x_coco_20200219_012037.log.json) | +| X-101-32x4d-FPN | pytorch | 2x | - | - | 61.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/rpn/rpn_x101_32x4d_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/rpn/rpn_x101_32x4d_fpn_2x_coco/rpn_x101_32x4d_fpn_2x_coco_20200208-d22bd0bb.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/rpn/rpn_x101_32x4d_fpn_2x_coco/rpn_x101_32x4d_fpn_2x_coco_20200208_200752.log.json) | +| X-101-64x4d-FPN | pytorch | 1x | 10.1 | 9.1 | 61.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/rpn/rpn_x101_64x4d_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/rpn/rpn_x101_64x4d_fpn_1x_coco/rpn_x101_64x4d_fpn_1x_coco_20200208-cde6f7dd.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/rpn/rpn_x101_64x4d_fpn_1x_coco/rpn_x101_64x4d_fpn_1x_coco_20200208_200752.log.json) | +| X-101-64x4d-FPN | pytorch | 2x | - | - | 61.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/rpn/rpn_x101_64x4d_fpn_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/rpn/rpn_x101_64x4d_fpn_2x_coco/rpn_x101_64x4d_fpn_2x_coco_20200208-c65f524f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/rpn/rpn_x101_64x4d_fpn_2x_coco/rpn_x101_64x4d_fpn_2x_coco_20200208_200752.log.json) | + +## Citation + +```latex +@inproceedings{ren2015faster, + title={Faster r-cnn: Towards real-time object detection with region proposal networks}, + author={Ren, Shaoqing and He, Kaiming and Girshick, Ross and Sun, Jian}, + booktitle={Advances in neural information processing systems}, + year={2015} +} +``` diff --git a/configs/rpn/rpn_r101_caffe_fpn_1x_coco.py b/configs/rpn/rpn_r101_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..27be946 --- /dev/null +++ b/configs/rpn/rpn_r101_caffe_fpn_1x_coco.py @@ -0,0 +1,7 @@ +_base_ = './rpn_r50_caffe_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet101_caffe'))) diff --git a/configs/rpn/rpn_r101_fpn_1x_coco.py b/configs/rpn/rpn_r101_fpn_1x_coco.py new file mode 100644 index 0000000..962728f --- /dev/null +++ b/configs/rpn/rpn_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './rpn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/rpn/rpn_r101_fpn_2x_coco.py b/configs/rpn/rpn_r101_fpn_2x_coco.py new file mode 100644 index 0000000..ac7671c --- /dev/null +++ b/configs/rpn/rpn_r101_fpn_2x_coco.py @@ -0,0 +1,6 @@ +_base_ = './rpn_r50_fpn_2x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/rpn/rpn_r50_caffe_c4_1x_coco.py b/configs/rpn/rpn_r50_caffe_c4_1x_coco.py new file mode 100644 index 0000000..6da0ee9 --- /dev/null +++ b/configs/rpn/rpn_r50_caffe_c4_1x_coco.py @@ -0,0 +1,38 @@ +_base_ = [ + '../_base_/models/rpn_r50_caffe_c4.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# dataset settings +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_label=False), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +evaluation = dict(interval=1, metric='proposal_fast') diff --git a/configs/rpn/rpn_r50_caffe_fpn_1x_coco.py b/configs/rpn/rpn_r50_caffe_fpn_1x_coco.py new file mode 100644 index 0000000..68c36fa --- /dev/null +++ b/configs/rpn/rpn_r50_caffe_fpn_1x_coco.py @@ -0,0 +1,41 @@ +_base_ = './rpn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + norm_cfg=dict(requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe'))) +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_label=False), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/rpn/rpn_r50_fpn_1x_coco.py b/configs/rpn/rpn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..26f95a3 --- /dev/null +++ b/configs/rpn/rpn_r50_fpn_1x_coco.py @@ -0,0 +1,18 @@ +_base_ = [ + '../_base_/models/rpn_r50_fpn.py', '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_label=False), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes']), +] +data = dict(train=dict(pipeline=train_pipeline)) +evaluation = dict(interval=1, metric='proposal_fast') diff --git a/configs/rpn/rpn_r50_fpn_2x_coco.py b/configs/rpn/rpn_r50_fpn_2x_coco.py new file mode 100644 index 0000000..2f264bf --- /dev/null +++ b/configs/rpn/rpn_r50_fpn_2x_coco.py @@ -0,0 +1,5 @@ +_base_ = './rpn_r50_fpn_1x_coco.py' + +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/rpn/rpn_x101_32x4d_fpn_1x_coco.py b/configs/rpn/rpn_x101_32x4d_fpn_1x_coco.py new file mode 100644 index 0000000..d0c7394 --- /dev/null +++ b/configs/rpn/rpn_x101_32x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './rpn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/rpn/rpn_x101_32x4d_fpn_2x_coco.py b/configs/rpn/rpn_x101_32x4d_fpn_2x_coco.py new file mode 100644 index 0000000..c6880b7 --- /dev/null +++ b/configs/rpn/rpn_x101_32x4d_fpn_2x_coco.py @@ -0,0 +1,14 @@ +_base_ = './rpn_r50_fpn_2x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/rpn/rpn_x101_64x4d_fpn_1x_coco.py b/configs/rpn/rpn_x101_64x4d_fpn_1x_coco.py new file mode 100644 index 0000000..96e691a --- /dev/null +++ b/configs/rpn/rpn_x101_64x4d_fpn_1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './rpn_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/rpn/rpn_x101_64x4d_fpn_2x_coco.py b/configs/rpn/rpn_x101_64x4d_fpn_2x_coco.py new file mode 100644 index 0000000..4182a39 --- /dev/null +++ b/configs/rpn/rpn_x101_64x4d_fpn_2x_coco.py @@ -0,0 +1,14 @@ +_base_ = './rpn_r50_fpn_2x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/sabl/README.md b/configs/sabl/README.md new file mode 100644 index 0000000..03992be --- /dev/null +++ b/configs/sabl/README.md @@ -0,0 +1,47 @@ +# SABL + +> [Side-Aware Boundary Localization for More Precise Object Detection](https://arxiv.org/abs/1912.04260) + + + +## Abstract + +Current object detection frameworks mainly rely on bounding box regression to localize objects. Despite the remarkable progress in recent years, the precision of bounding box regression remains unsatisfactory, hence limiting performance in object detection. We observe that precise localization requires careful placement of each side of the bounding box. However, the mainstream approach, which focuses on predicting centers and sizes, is not the most effective way to accomplish this task, especially when there exists displacements with large variance between the anchors and the targets. In this paper, we propose an alternative approach, named as Side-Aware Boundary Localization (SABL), where each side of the bounding box is respectively localized with a dedicated network branch. To tackle the difficulty of precise localization in the presence of displacements with large variance, we further propose a two-step localization scheme, which first predicts a range of movement through bucket prediction and then pinpoints the precise position within the predicted bucket. We test the proposed method on both two-stage and single-stage detection frameworks. Replacing the standard bounding box regression branch with the proposed design leads to significant improvements on Faster R-CNN, RetinaNet, and Cascade R-CNN, by 3.0%, 1.7%, and 0.9%, respectively. + +
+ +
+ +## Results and Models + +The results on COCO 2017 val is shown in the below table. (results on test-dev are usually slightly higher than val). +Single-scale testing (1333x800) is adopted in all results. + +| Method | Backbone | Lr schd | ms-train | box AP | Config | Download | +| :----------------: | :-------: | :-----: | :------: | :----: | :----------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| SABL Faster R-CNN | R-50-FPN | 1x | N | 39.9 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/sabl/sabl_faster_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_faster_rcnn_r50_fpn_1x_coco/sabl_faster_rcnn_r50_fpn_1x_coco-e867595b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_faster_rcnn_r50_fpn_1x_coco/20200830_130324.log.json) | +| SABL Faster R-CNN | R-101-FPN | 1x | N | 41.7 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/sabl/sabl_faster_rcnn_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_faster_rcnn_r101_fpn_1x_coco/sabl_faster_rcnn_r101_fpn_1x_coco-f804c6c1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_faster_rcnn_r101_fpn_1x_coco/20200830_183949.log.json) | +| SABL Cascade R-CNN | R-50-FPN | 1x | N | 41.6 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/sabl/sabl_cascade_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_cascade_rcnn_r50_fpn_1x_coco/sabl_cascade_rcnn_r50_fpn_1x_coco-e1748e5e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_cascade_rcnn_r50_fpn_1x_coco/20200831_033726.log.json) | +| SABL Cascade R-CNN | R-101-FPN | 1x | N | 43.0 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/sabl/sabl_cascade_rcnn_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_cascade_rcnn_r101_fpn_1x_coco/sabl_cascade_rcnn_r101_fpn_1x_coco-2b83e87c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_cascade_rcnn_r101_fpn_1x_coco/20200831_141745.log.json) | + +| Method | Backbone | GN | Lr schd | ms-train | box AP | Config | Download | +| :------------: | :-------: | :-: | :-----: | :---------: | :----: | :---------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| SABL RetinaNet | R-50-FPN | N | 1x | N | 37.7 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/sabl/sabl_retinanet_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_retinanet_r50_fpn_1x_coco/sabl_retinanet_r50_fpn_1x_coco-6c54fd4f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_retinanet_r50_fpn_1x_coco/20200830_053451.log.json) | +| SABL RetinaNet | R-50-FPN | Y | 1x | N | 38.8 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/sabl/sabl_retinanet_r50_fpn_gn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_retinanet_r50_fpn_gn_1x_coco/sabl_retinanet_r50_fpn_gn_1x_coco-e16dfcf1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_retinanet_r50_fpn_gn_1x_coco/20200831_141955.log.json) | +| SABL RetinaNet | R-101-FPN | N | 1x | N | 39.7 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/sabl/sabl_retinanet_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_retinanet_r101_fpn_1x_coco/sabl_retinanet_r101_fpn_1x_coco-42026904.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_retinanet_r101_fpn_1x_coco/20200831_034256.log.json) | +| SABL RetinaNet | R-101-FPN | Y | 1x | N | 40.5 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/sabl/sabl_retinanet_r101_fpn_gn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_retinanet_r101_fpn_gn_1x_coco/sabl_retinanet_r101_fpn_gn_1x_coco-40a893e8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_retinanet_r101_fpn_gn_1x_coco/20200830_201422.log.json) | +| SABL RetinaNet | R-101-FPN | Y | 2x | Y (640~800) | 42.9 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/sabl/sabl_retinanet_r101_fpn_gn_2x_ms_640_800_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_retinanet_r101_fpn_gn_2x_ms_640_800_coco/sabl_retinanet_r101_fpn_gn_2x_ms_640_800_coco-1e63382c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_retinanet_r101_fpn_gn_2x_ms_640_800_coco/20200830_144807.log.json) | +| SABL RetinaNet | R-101-FPN | Y | 2x | Y (480~960) | 43.6 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/sabl/sabl_retinanet_r101_fpn_gn_2x_ms_480_960_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_retinanet_r101_fpn_gn_2x_ms_480_960_coco/sabl_retinanet_r101_fpn_gn_2x_ms_480_960_coco-5342f857.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_retinanet_r101_fpn_gn_2x_ms_480_960_coco/20200830_164537.log.json) | + +## Citation + +We provide config files to reproduce the object detection results in the ECCV 2020 Spotlight paper for [Side-Aware Boundary Localization for More Precise Object Detection](https://arxiv.org/abs/1912.04260). + +```latex +@inproceedings{Wang_2020_ECCV, + title = {Side-Aware Boundary Localization for More Precise Object Detection}, + author = {Jiaqi Wang and Wenwei Zhang and Yuhang Cao and Kai Chen and Jiangmiao Pang and Tao Gong and Jianping Shi and Chen Change Loy and Dahua Lin}, + booktitle = {ECCV}, + year = {2020} +} +``` diff --git a/configs/sabl/metafile.yml b/configs/sabl/metafile.yml new file mode 100644 index 0000000..23c51cf --- /dev/null +++ b/configs/sabl/metafile.yml @@ -0,0 +1,140 @@ +Collections: + - Name: SABL + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - ResNet + - SABL + Paper: + URL: https://arxiv.org/abs/1912.04260 + Title: 'Side-Aware Boundary Localization for More Precise Object Detection' + README: configs/sabl/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.4.0/mmdet/models/roi_heads/bbox_heads/sabl_head.py#L14 + Version: v2.4.0 + +Models: + - Name: sabl_faster_rcnn_r50_fpn_1x_coco + In Collection: SABL + Config: configs/sabl/sabl_faster_rcnn_r50_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_faster_rcnn_r50_fpn_1x_coco/sabl_faster_rcnn_r50_fpn_1x_coco-e867595b.pth + + - Name: sabl_faster_rcnn_r101_fpn_1x_coco + In Collection: SABL + Config: configs/sabl/sabl_faster_rcnn_r101_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_faster_rcnn_r101_fpn_1x_coco/sabl_faster_rcnn_r101_fpn_1x_coco-f804c6c1.pth + + - Name: sabl_cascade_rcnn_r50_fpn_1x_coco + In Collection: SABL + Config: configs/sabl/sabl_cascade_rcnn_r50_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_cascade_rcnn_r50_fpn_1x_coco/sabl_cascade_rcnn_r50_fpn_1x_coco-e1748e5e.pth + + - Name: sabl_cascade_rcnn_r101_fpn_1x_coco + In Collection: SABL + Config: configs/sabl/sabl_cascade_rcnn_r101_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_cascade_rcnn_r101_fpn_1x_coco/sabl_cascade_rcnn_r101_fpn_1x_coco-2b83e87c.pth + + - Name: sabl_retinanet_r50_fpn_1x_coco + In Collection: SABL + Config: configs/sabl/sabl_retinanet_r50_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_retinanet_r50_fpn_1x_coco/sabl_retinanet_r50_fpn_1x_coco-6c54fd4f.pth + + - Name: sabl_retinanet_r50_fpn_gn_1x_coco + In Collection: SABL + Config: configs/sabl/sabl_retinanet_r50_fpn_gn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 38.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_retinanet_r50_fpn_gn_1x_coco/sabl_retinanet_r50_fpn_gn_1x_coco-e16dfcf1.pth + + - Name: sabl_retinanet_r101_fpn_1x_coco + In Collection: SABL + Config: configs/sabl/sabl_retinanet_r101_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 39.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_retinanet_r101_fpn_1x_coco/sabl_retinanet_r101_fpn_1x_coco-42026904.pth + + - Name: sabl_retinanet_r101_fpn_gn_1x_coco + In Collection: SABL + Config: configs/sabl/sabl_retinanet_r101_fpn_gn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_retinanet_r101_fpn_gn_1x_coco/sabl_retinanet_r101_fpn_gn_1x_coco-40a893e8.pth + + - Name: sabl_retinanet_r101_fpn_gn_2x_ms_640_800_coco + In Collection: SABL + Config: configs/sabl/sabl_retinanet_r101_fpn_gn_2x_ms_640_800_coco.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_retinanet_r101_fpn_gn_2x_ms_640_800_coco/sabl_retinanet_r101_fpn_gn_2x_ms_640_800_coco-1e63382c.pth + + - Name: sabl_retinanet_r101_fpn_gn_2x_ms_480_960_coco + In Collection: SABL + Config: configs/sabl/sabl_retinanet_r101_fpn_gn_2x_ms_480_960_coco.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/sabl/sabl_retinanet_r101_fpn_gn_2x_ms_480_960_coco/sabl_retinanet_r101_fpn_gn_2x_ms_480_960_coco-5342f857.pth diff --git a/configs/sabl/sabl_cascade_rcnn_r101_fpn_1x_coco.py b/configs/sabl/sabl_cascade_rcnn_r101_fpn_1x_coco.py new file mode 100644 index 0000000..64fe230 --- /dev/null +++ b/configs/sabl/sabl_cascade_rcnn_r101_fpn_1x_coco.py @@ -0,0 +1,90 @@ +_base_ = [ + '../_base_/models/cascade_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# model settings +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101')), + roi_head=dict(bbox_head=[ + dict( + type='SABLHead', + num_classes=80, + cls_in_channels=256, + reg_in_channels=256, + roi_feat_size=7, + reg_feat_up_ratio=2, + reg_pre_kernel=3, + reg_post_kernel=3, + reg_pre_num=2, + reg_post_num=1, + cls_out_channels=1024, + reg_offset_out_channels=256, + reg_cls_out_channels=256, + num_cls_fcs=1, + num_reg_fcs=0, + reg_class_agnostic=True, + norm_cfg=None, + bbox_coder=dict( + type='BucketingBBoxCoder', num_buckets=14, scale_factor=1.7), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox_reg=dict(type='SmoothL1Loss', beta=0.1, + loss_weight=1.0)), + dict( + type='SABLHead', + num_classes=80, + cls_in_channels=256, + reg_in_channels=256, + roi_feat_size=7, + reg_feat_up_ratio=2, + reg_pre_kernel=3, + reg_post_kernel=3, + reg_pre_num=2, + reg_post_num=1, + cls_out_channels=1024, + reg_offset_out_channels=256, + reg_cls_out_channels=256, + num_cls_fcs=1, + num_reg_fcs=0, + reg_class_agnostic=True, + norm_cfg=None, + bbox_coder=dict( + type='BucketingBBoxCoder', num_buckets=14, scale_factor=1.5), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox_reg=dict(type='SmoothL1Loss', beta=0.1, + loss_weight=1.0)), + dict( + type='SABLHead', + num_classes=80, + cls_in_channels=256, + reg_in_channels=256, + roi_feat_size=7, + reg_feat_up_ratio=2, + reg_pre_kernel=3, + reg_post_kernel=3, + reg_pre_num=2, + reg_post_num=1, + cls_out_channels=1024, + reg_offset_out_channels=256, + reg_cls_out_channels=256, + num_cls_fcs=1, + num_reg_fcs=0, + reg_class_agnostic=True, + norm_cfg=None, + bbox_coder=dict( + type='BucketingBBoxCoder', num_buckets=14, scale_factor=1.3), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox_reg=dict(type='SmoothL1Loss', beta=0.1, loss_weight=1.0)) + ])) diff --git a/configs/sabl/sabl_cascade_rcnn_r50_fpn_1x_coco.py b/configs/sabl/sabl_cascade_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..4b28a59 --- /dev/null +++ b/configs/sabl/sabl_cascade_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,86 @@ +_base_ = [ + '../_base_/models/cascade_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# model settings +model = dict( + roi_head=dict(bbox_head=[ + dict( + type='SABLHead', + num_classes=80, + cls_in_channels=256, + reg_in_channels=256, + roi_feat_size=7, + reg_feat_up_ratio=2, + reg_pre_kernel=3, + reg_post_kernel=3, + reg_pre_num=2, + reg_post_num=1, + cls_out_channels=1024, + reg_offset_out_channels=256, + reg_cls_out_channels=256, + num_cls_fcs=1, + num_reg_fcs=0, + reg_class_agnostic=True, + norm_cfg=None, + bbox_coder=dict( + type='BucketingBBoxCoder', num_buckets=14, scale_factor=1.7), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox_reg=dict(type='SmoothL1Loss', beta=0.1, + loss_weight=1.0)), + dict( + type='SABLHead', + num_classes=80, + cls_in_channels=256, + reg_in_channels=256, + roi_feat_size=7, + reg_feat_up_ratio=2, + reg_pre_kernel=3, + reg_post_kernel=3, + reg_pre_num=2, + reg_post_num=1, + cls_out_channels=1024, + reg_offset_out_channels=256, + reg_cls_out_channels=256, + num_cls_fcs=1, + num_reg_fcs=0, + reg_class_agnostic=True, + norm_cfg=None, + bbox_coder=dict( + type='BucketingBBoxCoder', num_buckets=14, scale_factor=1.5), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox_reg=dict(type='SmoothL1Loss', beta=0.1, + loss_weight=1.0)), + dict( + type='SABLHead', + num_classes=80, + cls_in_channels=256, + reg_in_channels=256, + roi_feat_size=7, + reg_feat_up_ratio=2, + reg_pre_kernel=3, + reg_post_kernel=3, + reg_pre_num=2, + reg_post_num=1, + cls_out_channels=1024, + reg_offset_out_channels=256, + reg_cls_out_channels=256, + num_cls_fcs=1, + num_reg_fcs=0, + reg_class_agnostic=True, + norm_cfg=None, + bbox_coder=dict( + type='BucketingBBoxCoder', num_buckets=14, scale_factor=1.3), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox_reg=dict(type='SmoothL1Loss', beta=0.1, loss_weight=1.0)) + ])) diff --git a/configs/sabl/sabl_faster_rcnn_r101_fpn_1x_coco.py b/configs/sabl/sabl_faster_rcnn_r101_fpn_1x_coco.py new file mode 100644 index 0000000..e48d425 --- /dev/null +++ b/configs/sabl/sabl_faster_rcnn_r101_fpn_1x_coco.py @@ -0,0 +1,38 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101')), + roi_head=dict( + bbox_head=dict( + _delete_=True, + type='SABLHead', + num_classes=80, + cls_in_channels=256, + reg_in_channels=256, + roi_feat_size=7, + reg_feat_up_ratio=2, + reg_pre_kernel=3, + reg_post_kernel=3, + reg_pre_num=2, + reg_post_num=1, + cls_out_channels=1024, + reg_offset_out_channels=256, + reg_cls_out_channels=256, + num_cls_fcs=1, + num_reg_fcs=0, + reg_class_agnostic=True, + norm_cfg=None, + bbox_coder=dict( + type='BucketingBBoxCoder', num_buckets=14, scale_factor=1.7), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox_reg=dict(type='SmoothL1Loss', beta=0.1, + loss_weight=1.0)))) diff --git a/configs/sabl/sabl_faster_rcnn_r50_fpn_1x_coco.py b/configs/sabl/sabl_faster_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..732c7ba --- /dev/null +++ b/configs/sabl/sabl_faster_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,34 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + roi_head=dict( + bbox_head=dict( + _delete_=True, + type='SABLHead', + num_classes=80, + cls_in_channels=256, + reg_in_channels=256, + roi_feat_size=7, + reg_feat_up_ratio=2, + reg_pre_kernel=3, + reg_post_kernel=3, + reg_pre_num=2, + reg_post_num=1, + cls_out_channels=1024, + reg_offset_out_channels=256, + reg_cls_out_channels=256, + num_cls_fcs=1, + num_reg_fcs=0, + reg_class_agnostic=True, + norm_cfg=None, + bbox_coder=dict( + type='BucketingBBoxCoder', num_buckets=14, scale_factor=1.7), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox_reg=dict(type='SmoothL1Loss', beta=0.1, + loss_weight=1.0)))) diff --git a/configs/sabl/sabl_retinanet_r101_fpn_1x_coco.py b/configs/sabl/sabl_retinanet_r101_fpn_1x_coco.py new file mode 100644 index 0000000..b08e916 --- /dev/null +++ b/configs/sabl/sabl_retinanet_r101_fpn_1x_coco.py @@ -0,0 +1,54 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# model settings +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101')), + bbox_head=dict( + _delete_=True, + type='SABLRetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[4], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='BucketingBBoxCoder', num_buckets=14, scale_factor=3.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.5), + loss_bbox_reg=dict( + type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.5)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='ApproxMaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0.0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False)) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/configs/sabl/sabl_retinanet_r101_fpn_gn_1x_coco.py b/configs/sabl/sabl_retinanet_r101_fpn_gn_1x_coco.py new file mode 100644 index 0000000..fc30d63 --- /dev/null +++ b/configs/sabl/sabl_retinanet_r101_fpn_gn_1x_coco.py @@ -0,0 +1,56 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# model settings +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101')), + bbox_head=dict( + _delete_=True, + type='SABLRetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[4], + strides=[8, 16, 32, 64, 128]), + norm_cfg=norm_cfg, + bbox_coder=dict( + type='BucketingBBoxCoder', num_buckets=14, scale_factor=3.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.5), + loss_bbox_reg=dict( + type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.5)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='ApproxMaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0.0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False)) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/configs/sabl/sabl_retinanet_r101_fpn_gn_2x_ms_480_960_coco.py b/configs/sabl/sabl_retinanet_r101_fpn_gn_2x_ms_480_960_coco.py new file mode 100644 index 0000000..e8fe166 --- /dev/null +++ b/configs/sabl/sabl_retinanet_r101_fpn_gn_2x_ms_480_960_coco.py @@ -0,0 +1,73 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_2x.py', '../_base_/default_runtime.py' +] +# model settings +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101')), + bbox_head=dict( + _delete_=True, + type='SABLRetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[4], + strides=[8, 16, 32, 64, 128]), + norm_cfg=norm_cfg, + bbox_coder=dict( + type='BucketingBBoxCoder', num_buckets=14, scale_factor=3.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.5), + loss_bbox_reg=dict( + type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.5)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='ApproxMaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0.0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False)) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 480), (1333, 960)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +data = dict(train=dict(pipeline=train_pipeline)) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/configs/sabl/sabl_retinanet_r101_fpn_gn_2x_ms_640_800_coco.py b/configs/sabl/sabl_retinanet_r101_fpn_gn_2x_ms_640_800_coco.py new file mode 100644 index 0000000..30c4339 --- /dev/null +++ b/configs/sabl/sabl_retinanet_r101_fpn_gn_2x_ms_640_800_coco.py @@ -0,0 +1,73 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_2x.py', '../_base_/default_runtime.py' +] +# model settings +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101')), + bbox_head=dict( + _delete_=True, + type='SABLRetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[4], + strides=[8, 16, 32, 64, 128]), + norm_cfg=norm_cfg, + bbox_coder=dict( + type='BucketingBBoxCoder', num_buckets=14, scale_factor=3.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.5), + loss_bbox_reg=dict( + type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.5)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='ApproxMaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0.0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False)) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +data = dict(train=dict(pipeline=train_pipeline)) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/configs/sabl/sabl_retinanet_r50_fpn_1x_coco.py b/configs/sabl/sabl_retinanet_r50_fpn_1x_coco.py new file mode 100644 index 0000000..6fe6bd6 --- /dev/null +++ b/configs/sabl/sabl_retinanet_r50_fpn_1x_coco.py @@ -0,0 +1,50 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# model settings +model = dict( + bbox_head=dict( + _delete_=True, + type='SABLRetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[4], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='BucketingBBoxCoder', num_buckets=14, scale_factor=3.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.5), + loss_bbox_reg=dict( + type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.5)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='ApproxMaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0.0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False)) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/configs/sabl/sabl_retinanet_r50_fpn_gn_1x_coco.py b/configs/sabl/sabl_retinanet_r50_fpn_gn_1x_coco.py new file mode 100644 index 0000000..6acf080 --- /dev/null +++ b/configs/sabl/sabl_retinanet_r50_fpn_gn_1x_coco.py @@ -0,0 +1,52 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# model settings +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + bbox_head=dict( + _delete_=True, + type='SABLRetinaHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[4], + strides=[8, 16, 32, 64, 128]), + norm_cfg=norm_cfg, + bbox_coder=dict( + type='BucketingBBoxCoder', num_buckets=14, scale_factor=3.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.5), + loss_bbox_reg=dict( + type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.5)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='ApproxMaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0.0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False)) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/configs/scnet/README.md b/configs/scnet/README.md new file mode 100644 index 0000000..773874a --- /dev/null +++ b/configs/scnet/README.md @@ -0,0 +1,63 @@ +# SCNet + +> [SCNet: Training Inference Sample Consistency for Instance Segmentation](https://arxiv.org/abs/2012.10150) + + + +## Abstract + + + +Cascaded architectures have brought significant performance improvement in object detection and instance segmentation. However, there are lingering issues regarding the disparity in the Intersection-over-Union (IoU) distribution of the samples between training and inference. This disparity can potentially exacerbate detection accuracy. This paper proposes an architecture referred to as Sample Consistency Network (SCNet) to ensure that the IoU distribution of the samples at training time is close to that at inference time. Furthermore, SCNet incorporates feature relay and utilizes global contextual information to further reinforce the reciprocal relationships among classifying, detecting, and segmenting sub-tasks. Extensive experiments on the standard COCO dataset reveal the effectiveness of the proposed method over multiple evaluation metrics, including box AP, mask AP, and inference speed. In particular, while running 38% faster, the proposed SCNet improves the AP of the box and mask predictions by respectively 1.3 and 2.3 points compared to the strong Cascade Mask R-CNN baseline. + +
+ +
+ +## Dataset + +SCNet requires COCO and [COCO-stuff](http://calvin.inf.ed.ac.uk/wp-content/uploads/data/cocostuffdataset/stuffthingmaps_trainval2017.zip) dataset for training. You need to download and extract it in the COCO dataset path. +The directory should be like this. + +```none +mmdetection +├── mmdet +├── tools +├── configs +├── data +│ ├── coco +│ │ ├── annotations +│ │ ├── train2017 +│ │ ├── val2017 +│ │ ├── test2017 +| | ├── stuffthingmaps +``` + +## Results and Models + +The results on COCO 2017val are shown in the below table. (results on test-dev are usually slightly higher than val) + +| Backbone | Style | Lr schd | Mem (GB) | Inf speed (fps) | box AP | mask AP | TTA box AP | TTA mask AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :-------------: | :----: | :-----: | :--------: | :---------: | :------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-FPN | pytorch | 1x | 7.0 | 6.2 | 43.5 | 39.2 | 44.8 | 40.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/scnet/scnet_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/scnet/scnet_r50_fpn_1x_coco/scnet_r50_fpn_1x_coco-c3f09857.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/scnet/scnet_r50_fpn_1x_coco/scnet_r50_fpn_1x_coco_20210117_192725.log.json) | +| R-50-FPN | pytorch | 20e | 7.0 | 6.2 | 44.5 | 40.0 | 45.8 | 41.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/scnet/scnet_r50_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/scnet/scnet_r50_fpn_20e_coco/scnet_r50_fpn_20e_coco-a569f645.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/scnet/scnet_r50_fpn_20e_coco/scnet_r50_fpn_20e_coco_20210116_060148.log.json) | +| R-101-FPN | pytorch | 20e | 8.9 | 5.8 | 45.8 | 40.9 | 47.3 | 42.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/scnet/scnet_r101_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/scnet/scnet_r101_fpn_20e_coco/scnet_r101_fpn_20e_coco-294e312c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/scnet/scnet_r101_fpn_20e_coco/scnet_r101_fpn_20e_coco_20210118_175824.log.json) | +| X-101-64x4d-FPN | pytorch | 20e | 13.2 | 4.9 | 47.5 | 42.3 | 48.9 | 44.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/scnet/scnet_x101_64x4d_fpn_20e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/scnet/scnet_x101_64x4d_fpn_20e_coco/scnet_x101_64x4d_fpn_20e_coco-fb09dec9.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/scnet/scnet_x101_64x4d_fpn_20e_coco/scnet_x101_64x4d_fpn_20e_coco_20210120_045959.log.json) | + +### Notes + +- Training hyper-parameters are identical to those of [HTC](https://github.com/open-mmlab/mmdetection/tree/master/configs/htc). +- TTA means Test Time Augmentation, which applies horizontal flip and multi-scale testing. Refer to [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/scnet/scnet_r50_fpn_1x_coco.py). + +## Citation + +We provide the code for reproducing experiment results of [SCNet](https://arxiv.org/abs/2012.10150). + +```latex +@inproceedings{vu2019cascade, + title={SCNet: Training Inference Sample Consistency for Instance Segmentation}, + author={Vu, Thang and Haeyong, Kang and Yoo, Chang D}, + booktitle={AAAI}, + year={2021} +} +``` diff --git a/configs/scnet/metafile.yml b/configs/scnet/metafile.yml new file mode 100644 index 0000000..15eaebf --- /dev/null +++ b/configs/scnet/metafile.yml @@ -0,0 +1,116 @@ +Collections: + - Name: SCNet + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - ResNet + - SCNet + Paper: + URL: https://arxiv.org/abs/2012.10150 + Title: 'SCNet: Training Inference Sample Consistency for Instance Segmentation' + README: configs/scnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.9.0/mmdet/models/detectors/scnet.py#L6 + Version: v2.9.0 + +Models: + - Name: scnet_r50_fpn_1x_coco + In Collection: SCNet + Config: configs/scnet/scnet_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.0 + inference time (ms/im): + - value: 161.29 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/scnet/scnet_r50_fpn_1x_coco/scnet_r50_fpn_1x_coco-c3f09857.pth + + - Name: scnet_r50_fpn_20e_coco + In Collection: SCNet + Config: configs/scnet/scnet_r50_fpn_20e_coco.py + Metadata: + Training Memory (GB): 7.0 + inference time (ms/im): + - value: 161.29 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/scnet/scnet_r50_fpn_20e_coco/scnet_r50_fpn_20e_coco-a569f645.pth + + - Name: scnet_r101_fpn_20e_coco + In Collection: SCNet + Config: configs/scnet/scnet_r101_fpn_20e_coco.py + Metadata: + Training Memory (GB): 8.9 + inference time (ms/im): + - value: 172.41 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/scnet/scnet_r101_fpn_20e_coco/scnet_r101_fpn_20e_coco-294e312c.pth + + - Name: scnet_x101_64x4d_fpn_20e_coco + In Collection: SCNet + Config: configs/scnet/scnet_x101_64x4d_fpn_20e_coco.py + Metadata: + Training Memory (GB): 13.2 + inference time (ms/im): + - value: 204.08 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (800, 1333) + Epochs: 20 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 42.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/scnet/scnet_x101_64x4d_fpn_20e_coco/scnet_x101_64x4d_fpn_20e_coco-fb09dec9.pth diff --git a/configs/scnet/scnet_r101_fpn_20e_coco.py b/configs/scnet/scnet_r101_fpn_20e_coco.py new file mode 100644 index 0000000..ebba529 --- /dev/null +++ b/configs/scnet/scnet_r101_fpn_20e_coco.py @@ -0,0 +1,6 @@ +_base_ = './scnet_r50_fpn_20e_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/scnet/scnet_r50_fpn_1x_coco.py b/configs/scnet/scnet_r50_fpn_1x_coco.py new file mode 100644 index 0000000..fe03b0d --- /dev/null +++ b/configs/scnet/scnet_r50_fpn_1x_coco.py @@ -0,0 +1,136 @@ +_base_ = '../htc/htc_r50_fpn_1x_coco.py' +# model settings +model = dict( + type='SCNet', + roi_head=dict( + _delete_=True, + type='SCNetRoIHead', + num_stages=3, + stage_loss_weights=[1, 0.5, 0.25], + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=[ + dict( + type='SCNetBBoxHead', + num_shared_fcs=2, + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='SCNetBBoxHead', + num_shared_fcs=2, + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.05, 0.05, 0.1, 0.1]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='SCNetBBoxHead', + num_shared_fcs=2, + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.033, 0.033, 0.067, 0.067]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)) + ], + mask_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + mask_head=dict( + type='SCNetMaskHead', + num_convs=12, + in_channels=256, + conv_out_channels=256, + num_classes=80, + conv_to_res=True, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0)), + semantic_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0), + out_channels=256, + featmap_strides=[8]), + semantic_head=dict( + type='SCNetSemanticHead', + num_ins=5, + fusion_level=1, + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=183, + loss_seg=dict( + type='CrossEntropyLoss', ignore_index=255, loss_weight=0.2), + conv_to_res=True), + glbctx_head=dict( + type='GlobalContextHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=80, + loss_weight=3.0, + conv_to_res=True), + feat_relay_head=dict( + type='FeatureRelayHead', + in_channels=1024, + out_conv_channels=256, + roi_feat_size=7, + scale_factor=2))) + +# uncomment below code to enable test time augmentations +# img_norm_cfg = dict( +# mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +# test_pipeline = [ +# dict(type='LoadImageFromFile'), +# dict( +# type='MultiScaleFlipAug', +# img_scale=[(600, 900), (800, 1200), (1000, 1500), (1200, 1800), +# (1400, 2100)], +# flip=True, +# transforms=[ +# dict(type='Resize', keep_ratio=True), +# dict(type='RandomFlip', flip_ratio=0.5), +# dict(type='Normalize', **img_norm_cfg), +# dict(type='Pad', size_divisor=32), +# dict(type='ImageToTensor', keys=['img']), +# dict(type='Collect', keys=['img']), +# ]) +# ] +# data = dict( +# val=dict(pipeline=test_pipeline), +# test=dict(pipeline=test_pipeline)) diff --git a/configs/scnet/scnet_r50_fpn_20e_coco.py b/configs/scnet/scnet_r50_fpn_20e_coco.py new file mode 100644 index 0000000..3b121a6 --- /dev/null +++ b/configs/scnet/scnet_r50_fpn_20e_coco.py @@ -0,0 +1,4 @@ +_base_ = './scnet_r50_fpn_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 19]) +runner = dict(type='EpochBasedRunner', max_epochs=20) diff --git a/configs/scnet/scnet_x101_64x4d_fpn_20e_coco.py b/configs/scnet/scnet_x101_64x4d_fpn_20e_coco.py new file mode 100644 index 0000000..1e54b03 --- /dev/null +++ b/configs/scnet/scnet_x101_64x4d_fpn_20e_coco.py @@ -0,0 +1,15 @@ +_base_ = './scnet_r50_fpn_20e_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/scnet/scnet_x101_64x4d_fpn_8x1_20e_coco.py b/configs/scnet/scnet_x101_64x4d_fpn_8x1_20e_coco.py new file mode 100644 index 0000000..be8ddc5 --- /dev/null +++ b/configs/scnet/scnet_x101_64x4d_fpn_8x1_20e_coco.py @@ -0,0 +1,8 @@ +_base_ = './scnet_x101_64x4d_fpn_20e_coco.py' +data = dict(samples_per_gpu=1, workers_per_gpu=1) +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (1 samples per GPU) +auto_scale_lr = dict(base_batch_size=8) diff --git a/configs/scratch/README.md b/configs/scratch/README.md new file mode 100644 index 0000000..189f181 --- /dev/null +++ b/configs/scratch/README.md @@ -0,0 +1,35 @@ +# Scratch + +> [Rethinking ImageNet Pre-training](https://arxiv.org/abs/1811.08883) + + + +## Abstract + +We report competitive results on object detection and instance segmentation on the COCO dataset using standard models trained from random initialization. The results are no worse than their ImageNet pre-training counterparts even when using the hyper-parameters of the baseline system (Mask R-CNN) that were optimized for fine-tuning pre-trained models, with the sole exception of increasing the number of training iterations so the randomly initialized models may converge. Training from random initialization is surprisingly robust; our results hold even when: (i) using only 10% of the training data, (ii) for deeper and wider models, and (iii) for multiple tasks and metrics. Experiments show that ImageNet pre-training speeds up convergence early in training, but does not necessarily provide regularization or improve final target task accuracy. To push the envelope we demonstrate 50.9 AP on COCO object detection without using any external data---a result on par with the top COCO 2017 competition results that used ImageNet pre-training. These observations challenge the conventional wisdom of ImageNet pre-training for dependent tasks and we expect these discoveries will encourage people to rethink the current de facto paradigm of \`pre-training and fine-tuning' in computer vision. + +
+ +
+ +## Results and Models + +| Model | Backbone | Style | Lr schd | box AP | mask AP | Config | Download | +| :----------: | :------: | :-----: | :-----: | :----: | :-----: | :---------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Faster R-CNN | R-50-FPN | pytorch | 6x | 40.7 | | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/scratch/faster_rcnn_r50_fpn_gn-all_scratch_6x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/scratch/faster_rcnn_r50_fpn_gn-all_scratch_6x_coco/scratch_faster_rcnn_r50_fpn_gn_6x_bbox_mAP-0.407_20200201_193013-90813d01.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/scratch/faster_rcnn_r50_fpn_gn-all_scratch_6x_coco/scratch_faster_rcnn_r50_fpn_gn_6x_20200201_193013.log.json) | +| Mask R-CNN | R-50-FPN | pytorch | 6x | 41.2 | 37.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/scratch/mask_rcnn_r50_fpn_gn-all_scratch_6x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/scratch/mask_rcnn_r50_fpn_gn-all_scratch_6x_coco/scratch_mask_rcnn_r50_fpn_gn_6x_bbox_mAP-0.412__segm_mAP-0.374_20200201_193051-1e190a40.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/scratch/mask_rcnn_r50_fpn_gn-all_scratch_6x_coco/scratch_mask_rcnn_r50_fpn_gn_6x_20200201_193051.log.json) | + +Note: + +- The above models are trained with 16 GPUs. + +## Citation + +```latex +@article{he2018rethinking, + title={Rethinking imagenet pre-training}, + author={He, Kaiming and Girshick, Ross and Doll{\'a}r, Piotr}, + journal={arXiv preprint arXiv:1811.08883}, + year={2018} +} +``` diff --git a/configs/scratch/faster_rcnn_r50_fpn_gn-all_scratch_6x_coco.py b/configs/scratch/faster_rcnn_r50_fpn_gn-all_scratch_6x_coco.py new file mode 100644 index 0000000..55aa3a6 --- /dev/null +++ b/configs/scratch/faster_rcnn_r50_fpn_gn-all_scratch_6x_coco.py @@ -0,0 +1,24 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + backbone=dict( + frozen_stages=-1, + zero_init_residual=False, + norm_cfg=norm_cfg, + init_cfg=None), + neck=dict(norm_cfg=norm_cfg), + roi_head=dict( + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + conv_out_channels=256, + norm_cfg=norm_cfg))) +# optimizer +optimizer = dict(paramwise_cfg=dict(norm_decay_mult=0)) +optimizer_config = dict(_delete_=True, grad_clip=None) +# learning policy +lr_config = dict(warmup_ratio=0.1, step=[65, 71]) +runner = dict(type='EpochBasedRunner', max_epochs=73) diff --git a/configs/scratch/mask_rcnn_r50_fpn_gn-all_scratch_6x_coco.py b/configs/scratch/mask_rcnn_r50_fpn_gn-all_scratch_6x_coco.py new file mode 100644 index 0000000..cc52cb8 --- /dev/null +++ b/configs/scratch/mask_rcnn_r50_fpn_gn-all_scratch_6x_coco.py @@ -0,0 +1,25 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +norm_cfg = dict(type='GN', num_groups=32, requires_grad=True) +model = dict( + backbone=dict( + frozen_stages=-1, + zero_init_residual=False, + norm_cfg=norm_cfg, + init_cfg=None), + neck=dict(norm_cfg=norm_cfg), + roi_head=dict( + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + conv_out_channels=256, + norm_cfg=norm_cfg), + mask_head=dict(norm_cfg=norm_cfg))) +# optimizer +optimizer = dict(paramwise_cfg=dict(norm_decay_mult=0)) +optimizer_config = dict(_delete_=True, grad_clip=None) +# learning policy +lr_config = dict(warmup_ratio=0.1, step=[65, 71]) +runner = dict(type='EpochBasedRunner', max_epochs=73) diff --git a/configs/scratch/metafile.yml b/configs/scratch/metafile.yml new file mode 100644 index 0000000..65025fa --- /dev/null +++ b/configs/scratch/metafile.yml @@ -0,0 +1,48 @@ +Collections: + - Name: Rethinking ImageNet Pre-training + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - RPN + - ResNet + Paper: + URL: https://arxiv.org/abs/1811.08883 + Title: 'Rethinking ImageNet Pre-training' + README: configs/scratch/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.0.0/configs/scratch/faster_rcnn_r50_fpn_gn-all_scratch_6x_coco.py + Version: v2.0.0 + +Models: + - Name: faster_rcnn_r50_fpn_gn-all_scratch_6x_coco + In Collection: Rethinking ImageNet Pre-training + Config: configs/scratch/faster_rcnn_r50_fpn_gn-all_scratch_6x_coco.py + Metadata: + Epochs: 72 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/scratch/faster_rcnn_r50_fpn_gn-all_scratch_6x_coco/scratch_faster_rcnn_r50_fpn_gn_6x_bbox_mAP-0.407_20200201_193013-90813d01.pth + + - Name: mask_rcnn_r50_fpn_gn-all_scratch_6x_coco + In Collection: Rethinking ImageNet Pre-training + Config: configs/scratch/mask_rcnn_r50_fpn_gn-all_scratch_6x_coco.py + Metadata: + Epochs: 72 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/scratch/mask_rcnn_r50_fpn_gn-all_scratch_6x_coco/scratch_mask_rcnn_r50_fpn_gn_6x_bbox_mAP-0.412__segm_mAP-0.374_20200201_193051-1e190a40.pth diff --git a/configs/seesaw_loss/README.md b/configs/seesaw_loss/README.md new file mode 100644 index 0000000..696b008 --- /dev/null +++ b/configs/seesaw_loss/README.md @@ -0,0 +1,47 @@ +# Seesaw Loss + +> [Seesaw Loss for Long-Tailed Instance Segmentation](https://arxiv.org/abs/2008.10032) + + + +## Abstract + +Instance segmentation has witnessed a remarkable progress on class-balanced benchmarks. However, they fail to perform as accurately in real-world scenarios, where the category distribution of objects naturally comes with a long tail. Instances of head classes dominate a long-tailed dataset and they serve as negative samples of tail categories. The overwhelming gradients of negative samples on tail classes lead to a biased learning process for classifiers. Consequently, objects of tail categories are more likely to be misclassified as backgrounds or head categories. To tackle this problem, we propose Seesaw Loss to dynamically re-balance gradients of positive and negative samples for each category, with two complementary factors, i.e., mitigation factor and compensation factor. The mitigation factor reduces punishments to tail categories w.r.t. the ratio of cumulative training instances between different categories. Meanwhile, the compensation factor increases the penalty of misclassified instances to avoid false positives of tail categories. We conduct extensive experiments on Seesaw Loss with mainstream frameworks and different data sampling strategies. With a simple end-to-end training pipeline, Seesaw Loss obtains significant gains over Cross-Entropy Loss, and achieves state-of-the-art performance on LVIS dataset without bells and whistles. + +
+ +
+ +- Please setup [LVIS dataset](../lvis/README.md) for MMDetection. + +- RFS indicates to use oversample strategy [here](../../docs/tutorials/customize_dataset.md#class-balanced-dataset) with oversample threshold `1e-3`. + +## Results and models of Seasaw Loss on LVIS v1 dataset + +| Method | Backbone | Style | Lr schd | Data Sampler | Norm Mask | box AP | mask AP | Config | Download | +| :----------------: | :-------: | :-----: | :-----: | :----------: | :-------: | :----: | :-----: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Mask R-CNN | R-50-FPN | pytorch | 2x | random | N | 25.6 | 25.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/seesaw_loss/mask_rcnn_r50_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r50_fpn_random_seesaw_loss_mstrain_2x_lvis_v1-a698dd3d.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r50_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.log.json) | +| Mask R-CNN | R-50-FPN | pytorch | 2x | random | Y | 25.6 | 25.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/seesaw_loss/mask_rcnn_r50_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r50_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1-a1c11314.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r50_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.log.json) | +| Mask R-CNN | R-101-FPN | pytorch | 2x | random | N | 27.4 | 26.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn_r101_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r101_fpn_random_seesaw_loss_mstrain_2x_lvis_v1-8e6e6dd5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r101_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.log.json) | +| Mask R-CNN | R-101-FPN | pytorch | 2x | random | Y | 27.2 | 27.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/seesaw_loss/mask_rcnn_r101_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r101_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1-a0b59c42.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r101_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.log.json) | +| Mask R-CNN | R-50-FPN | pytorch | 2x | RFS | N | 27.6 | 26.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/seesaw_loss/mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1-392a804b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.log.json) | +| Mask R-CNN | R-50-FPN | pytorch | 2x | RFS | Y | 27.6 | 26.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/seesaw_loss/mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1-cd0f6a12.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.log.json) | +| Mask R-CNN | R-101-FPN | pytorch | 2x | RFS | N | 28.9 | 27.6 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/seesaw_loss/mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1-e68eb464.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.log.json) | +| Mask R-CNN | R-101-FPN | pytorch | 2x | RFS | Y | 28.9 | 28.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/seesaw_loss/mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1-1d817139.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.log.json) | +| Cascade Mask R-CNN | R-101-FPN | pytorch | 2x | random | N | 33.1 | 29.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/cascade_mask_rcnn_r101_fpn_random_seesaw_loss_mstrain_2x_lvis_v1-71e2215e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/cascade_mask_rcnn_r101_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.log.json) | +| Cascade Mask R-CNN | R-101-FPN | pytorch | 2x | random | Y | 33.0 | 30.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/cascade_mask_rcnn_r101_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1-8b5a6745.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/cascade_mask_rcnn_r101_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.log.json) | +| Cascade Mask R-CNN | R-101-FPN | pytorch | 2x | RFS | N | 30.0 | 29.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/cascade_mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1-5d8ca2a4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/cascade_mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.log.json) | +| Cascade Mask R-CNN | R-101-FPN | pytorch | 2x | RFS | Y | 32.8 | 30.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/cascade_mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1-c8551505.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/cascade_mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.log.json) | + +## Citation + +We provide config files to reproduce the instance segmentation performance in the CVPR 2021 paper for [Seesaw Loss for Long-Tailed Instance Segmentation](https://arxiv.org/abs/2008.10032). + +```latex +@inproceedings{wang2021seesaw, + title={Seesaw Loss for Long-Tailed Instance Segmentation}, + author={Jiaqi Wang and Wenwei Zhang and Yuhang Zang and Yuhang Cao and Jiangmiao Pang and Tao Gong and Kai Chen and Ziwei Liu and Chen Change Loy and Dahua Lin}, + booktitle={Proceedings of the {IEEE} Conference on Computer Vision and Pattern Recognition}, + year={2021} +} +``` diff --git a/configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.py b/configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.py new file mode 100644 index 0000000..beeb0d1 --- /dev/null +++ b/configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.py @@ -0,0 +1,132 @@ +_base_ = [ + '../_base_/models/cascade_mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_2x.py', '../_base_/default_runtime.py' +] + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101')), + roi_head=dict( + bbox_head=[ + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=1203, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=True, + cls_predictor_cfg=dict(type='NormedLinear', tempearture=20), + loss_cls=dict( + type='SeesawLoss', + p=0.8, + q=2.0, + num_classes=1203, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=1203, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.05, 0.05, 0.1, 0.1]), + reg_class_agnostic=True, + cls_predictor_cfg=dict(type='NormedLinear', tempearture=20), + loss_cls=dict( + type='SeesawLoss', + p=0.8, + q=2.0, + num_classes=1203, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=1203, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.033, 0.033, 0.067, 0.067]), + reg_class_agnostic=True, + cls_predictor_cfg=dict(type='NormedLinear', tempearture=20), + loss_cls=dict( + type='SeesawLoss', + p=0.8, + q=2.0, + num_classes=1203, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)) + ], + mask_head=dict(num_classes=1203)), + test_cfg=dict( + rcnn=dict( + score_thr=0.0001, + # LVIS allows up to 300 + max_per_img=300))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +dataset_type = 'LVISV1Dataset' +data_root = 'data/lvis_v1/' +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/lvis_v1_train.json', + img_prefix=data_root, + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/lvis_v1_val.json', + img_prefix=data_root, + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/lvis_v1_val.json', + img_prefix=data_root, + pipeline=test_pipeline)) +evaluation = dict(interval=24, metric=['bbox', 'segm']) diff --git a/configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py b/configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py new file mode 100644 index 0000000..0f29948 --- /dev/null +++ b/configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py @@ -0,0 +1,5 @@ +_base_ = './cascade_mask_rcnn_r101_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.py' # noqa: E501 +model = dict( + roi_head=dict( + mask_head=dict( + predictor_cfg=dict(type='NormedConv2d', tempearture=20)))) diff --git a/configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.py b/configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.py new file mode 100644 index 0000000..bb88750 --- /dev/null +++ b/configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.py @@ -0,0 +1,98 @@ +_base_ = [ + '../_base_/models/cascade_mask_rcnn_r50_fpn.py', + '../_base_/datasets/lvis_v1_instance.py', + '../_base_/schedules/schedule_2x.py', '../_base_/default_runtime.py' +] + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101')), + roi_head=dict( + bbox_head=[ + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=1203, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=True, + cls_predictor_cfg=dict(type='NormedLinear', tempearture=20), + loss_cls=dict( + type='SeesawLoss', + p=0.8, + q=2.0, + num_classes=1203, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=1203, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.05, 0.05, 0.1, 0.1]), + reg_class_agnostic=True, + cls_predictor_cfg=dict(type='NormedLinear', tempearture=20), + loss_cls=dict( + type='SeesawLoss', + p=0.8, + q=2.0, + num_classes=1203, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=1203, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.033, 0.033, 0.067, 0.067]), + reg_class_agnostic=True, + cls_predictor_cfg=dict(type='NormedLinear', tempearture=20), + loss_cls=dict( + type='SeesawLoss', + p=0.8, + q=2.0, + num_classes=1203, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)) + ], + mask_head=dict(num_classes=1203)), + test_cfg=dict( + rcnn=dict( + score_thr=0.0001, + # LVIS allows up to 300 + max_per_img=300))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict(train=dict(dataset=dict(pipeline=train_pipeline))) +evaluation = dict(interval=24, metric=['bbox', 'segm']) diff --git a/configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py b/configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py new file mode 100644 index 0000000..262e76b --- /dev/null +++ b/configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py @@ -0,0 +1,5 @@ +_base_ = './cascade_mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.py' # noqa: E501 +model = dict( + roi_head=dict( + mask_head=dict( + predictor_cfg=dict(type='NormedConv2d', tempearture=20)))) diff --git a/configs/seesaw_loss/mask_rcnn_r101_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.py b/configs/seesaw_loss/mask_rcnn_r101_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.py new file mode 100644 index 0000000..57deab1 --- /dev/null +++ b/configs/seesaw_loss/mask_rcnn_r101_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.py @@ -0,0 +1,6 @@ +_base_ = './mask_rcnn_r50_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/seesaw_loss/mask_rcnn_r101_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py b/configs/seesaw_loss/mask_rcnn_r101_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py new file mode 100644 index 0000000..a539929 --- /dev/null +++ b/configs/seesaw_loss/mask_rcnn_r101_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py @@ -0,0 +1,6 @@ +_base_ = './mask_rcnn_r50_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py' # noqa: E501 +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/seesaw_loss/mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.py b/configs/seesaw_loss/mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.py new file mode 100644 index 0000000..1f5065e --- /dev/null +++ b/configs/seesaw_loss/mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.py @@ -0,0 +1,6 @@ +_base_ = './mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/seesaw_loss/mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py b/configs/seesaw_loss/mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py new file mode 100644 index 0000000..13d0b5f --- /dev/null +++ b/configs/seesaw_loss/mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py @@ -0,0 +1,6 @@ +_base_ = './mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py' # noqa: E501 +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/seesaw_loss/mask_rcnn_r50_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.py b/configs/seesaw_loss/mask_rcnn_r50_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.py new file mode 100644 index 0000000..743f5f2 --- /dev/null +++ b/configs/seesaw_loss/mask_rcnn_r50_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.py @@ -0,0 +1,75 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_2x.py', '../_base_/default_runtime.py' +] +model = dict( + roi_head=dict( + bbox_head=dict( + num_classes=1203, + cls_predictor_cfg=dict(type='NormedLinear', tempearture=20), + loss_cls=dict( + type='SeesawLoss', + p=0.8, + q=2.0, + num_classes=1203, + loss_weight=1.0)), + mask_head=dict(num_classes=1203)), + test_cfg=dict( + rcnn=dict( + score_thr=0.0001, + # LVIS allows up to 300 + max_per_img=300))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +dataset_type = 'LVISV1Dataset' +data_root = 'data/lvis_v1/' +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/lvis_v1_train.json', + img_prefix=data_root, + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/lvis_v1_val.json', + img_prefix=data_root, + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/lvis_v1_val.json', + img_prefix=data_root, + pipeline=test_pipeline)) +evaluation = dict(interval=24, metric=['bbox', 'segm']) diff --git a/configs/seesaw_loss/mask_rcnn_r50_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py b/configs/seesaw_loss/mask_rcnn_r50_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py new file mode 100644 index 0000000..0af8921 --- /dev/null +++ b/configs/seesaw_loss/mask_rcnn_r50_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py @@ -0,0 +1,5 @@ +_base_ = './mask_rcnn_r50_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.py' +model = dict( + roi_head=dict( + mask_head=dict( + predictor_cfg=dict(type='NormedConv2d', tempearture=20)))) diff --git a/configs/seesaw_loss/mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.py b/configs/seesaw_loss/mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.py new file mode 100644 index 0000000..4fc1504 --- /dev/null +++ b/configs/seesaw_loss/mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.py @@ -0,0 +1,41 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/lvis_v1_instance.py', + '../_base_/schedules/schedule_2x.py', '../_base_/default_runtime.py' +] +model = dict( + roi_head=dict( + bbox_head=dict( + num_classes=1203, + cls_predictor_cfg=dict(type='NormedLinear', tempearture=20), + loss_cls=dict( + type='SeesawLoss', + p=0.8, + q=2.0, + num_classes=1203, + loss_weight=1.0)), + mask_head=dict(num_classes=1203)), + test_cfg=dict( + rcnn=dict( + score_thr=0.0001, + # LVIS allows up to 300 + max_per_img=300))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict(train=dict(dataset=dict(pipeline=train_pipeline))) +evaluation = dict(interval=12, metric=['bbox', 'segm']) diff --git a/configs/seesaw_loss/mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py b/configs/seesaw_loss/mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py new file mode 100644 index 0000000..0ef6bd2 --- /dev/null +++ b/configs/seesaw_loss/mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py @@ -0,0 +1,5 @@ +_base_ = './mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.py' +model = dict( + roi_head=dict( + mask_head=dict( + predictor_cfg=dict(type='NormedConv2d', tempearture=20)))) diff --git a/configs/seesaw_loss/metafile.yml b/configs/seesaw_loss/metafile.yml new file mode 100644 index 0000000..fb90aa5 --- /dev/null +++ b/configs/seesaw_loss/metafile.yml @@ -0,0 +1,203 @@ +Collections: + - Name: Seesaw Loss + Metadata: + Training Data: LVIS + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Softmax + - RPN + - Convolution + - Dense Connections + - FPN + - ResNet + - RoIAlign + - Seesaw Loss + Paper: + URL: https://arxiv.org/abs/2008.10032 + Title: 'Seesaw Loss for Long-Tailed Instance Segmentation' + README: configs/seesaw_loss/README.md + +Models: + - Name: mask_rcnn_r50_fpn_random_seesaw_loss_mstrain_2x_lvis_v1 + In Collection: Seesaw Loss + Config: configs/seesaw_loss/mask_rcnn_r50_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: LVIS v1 + Metrics: + box AP: 25.6 + - Task: Instance Segmentation + Dataset: LVIS v1 + Metrics: + mask AP: 25.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r50_fpn_random_seesaw_loss_mstrain_2x_lvis_v1-a698dd3d.pth + - Name: mask_rcnn_r50_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1 + In Collection: Seesaw Loss + Config: configs/seesaw_loss/mask_rcnn_r50_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: LVIS v1 + Metrics: + box AP: 25.6 + - Task: Instance Segmentation + Dataset: LVIS v1 + Metrics: + mask AP: 25.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r50_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1-a1c11314.pth + - Name: mask_rcnn_r101_fpn_random_seesaw_loss_mstrain_2x_lvis_v1 + In Collection: Seesaw Loss + Config: configs/seesaw_loss/mask_rcnn_r101_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: LVIS v1 + Metrics: + box AP: 27.4 + - Task: Instance Segmentation + Dataset: LVIS v1 + Metrics: + mask AP: 26.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r101_fpn_random_seesaw_loss_mstrain_2x_lvis_v1-8e6e6dd5.pth + - Name: mask_rcnn_r101_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1 + In Collection: Seesaw Loss + Config: configs/seesaw_loss/mask_rcnn_r101_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: LVIS v1 + Metrics: + box AP: 27.2 + - Task: Instance Segmentation + Dataset: LVIS v1 + Metrics: + mask AP: 27.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r101_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1-a0b59c42.pth + - Name: mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1 + In Collection: Seesaw Loss + Config: configs/seesaw_loss/mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: LVIS v1 + Metrics: + box AP: 27.6 + - Task: Instance Segmentation + Dataset: LVIS v1 + Metrics: + mask AP: 26.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1-392a804b.pth + - Name: mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1 + In Collection: Seesaw Loss + Config: configs/seesaw_loss/mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: LVIS v1 + Metrics: + box AP: 27.6 + - Task: Instance Segmentation + Dataset: LVIS v1 + Metrics: + mask AP: 26.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r50_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1-cd0f6a12.pth + - Name: mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1 + In Collection: Seesaw Loss + Config: configs/seesaw_loss/mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: LVIS v1 + Metrics: + box AP: 28.9 + - Task: Instance Segmentation + Dataset: LVIS v1 + Metrics: + mask AP: 27.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1-e68eb464.pth + - Name: mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1 + In Collection: Seesaw Loss + Config: configs/seesaw_loss/mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: LVIS v1 + Metrics: + box AP: 28.9 + - Task: Instance Segmentation + Dataset: LVIS v1 + Metrics: + mask AP: 28.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1-1d817139.pth + - Name: cascade_mask_rcnn_r101_fpn_random_seesaw_loss_mstrain_2x_lvis_v1 + In Collection: Seesaw Loss + Config: configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_random_seesaw_loss_mstrain_2x_lvis_v1.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: LVIS v1 + Metrics: + box AP: 33.1 + - Task: Instance Segmentation + Dataset: LVIS v1 + Metrics: + mask AP: 29.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/cascade_mask_rcnn_r101_fpn_random_seesaw_loss_mstrain_2x_lvis_v1-71e2215e.pth + - Name: cascade_mask_rcnn_r101_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1 + In Collection: Seesaw Loss + Config: configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: LVIS v1 + Metrics: + box AP: 33.0 + - Task: Instance Segmentation + Dataset: LVIS v1 + Metrics: + mask AP: 30.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/cascade_mask_rcnn_r101_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1-8b5a6745.pth + - Name: cascade_mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1 + In Collection: Seesaw Loss + Config: configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: LVIS v1 + Metrics: + box AP: 30.0 + - Task: Instance Segmentation + Dataset: LVIS v1 + Metrics: + mask AP: 29.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/cascade_mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_mstrain_2x_lvis_v1-5d8ca2a4.pth + - Name: cascade_mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1 + In Collection: Seesaw Loss + Config: configs/seesaw_loss/cascade_mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: LVIS v1 + Metrics: + box AP: 32.8 + - Task: Instance Segmentation + Dataset: LVIS v1 + Metrics: + mask AP: 30.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/seesaw_loss/cascade_mask_rcnn_r101_fpn_sample1e-3_seesaw_loss_normed_mask_mstrain_2x_lvis_v1-c8551505.pth diff --git a/configs/selfsup_pretrain/README.md b/configs/selfsup_pretrain/README.md new file mode 100644 index 0000000..9bd92cb --- /dev/null +++ b/configs/selfsup_pretrain/README.md @@ -0,0 +1,109 @@ +# Backbones Trained by Self-Supervise Algorithms + + + +## Abstract + +Unsupervised image representations have significantly reduced the gap with supervised pretraining, notably with the recent achievements of contrastive learning methods. These contrastive methods typically work online and rely on a large number of explicit pairwise feature comparisons, which is computationally challenging. In this paper, we propose an online algorithm, SwAV, that takes advantage of contrastive methods without requiring to compute pairwise comparisons. Specifically, our method simultaneously clusters the data while enforcing consistency between cluster assignments produced for different augmentations (or views) of the same image, instead of comparing features directly as in contrastive learning. Simply put, we use a swapped prediction mechanism where we predict the cluster assignment of a view from the representation of another view. Our method can be trained with large and small batches and can scale to unlimited amounts of data. Compared to previous contrastive methods, our method is more memory efficient since it does not require a large memory bank or a special momentum network. In addition, we also propose a new data augmentation strategy, multi-crop, that uses a mix of views with different resolutions in place of two full-resolution views, without increasing the memory or compute requirements much. We validate our findings by achieving 75.3% top-1 accuracy on ImageNet with ResNet-50, as well as surpassing supervised pretraining on all the considered transfer tasks. + +
+ +
+ +We present Momentum Contrast (MoCo) for unsupervised visual representation learning. From a perspective on contrastive learning as dictionary look-up, we build a dynamic dictionary with a queue and a moving-averaged encoder. This enables building a large and consistent dictionary on-the-fly that facilitates contrastive unsupervised learning. MoCo provides competitive results under the common linear protocol on ImageNet classification. More importantly, the representations learned by MoCo transfer well to downstream tasks. MoCo can outperform its supervised pre-training counterpart in 7 detection/segmentation tasks on PASCAL VOC, COCO, and other datasets, sometimes surpassing it by large margins. This suggests that the gap between unsupervised and supervised representation learning has been largely closed in many vision tasks. + +
+ +
+ +## Usage + +To use a self-supervisely pretrained backbone, there are two steps to do: + +1. Download and convert the model to PyTorch-style supported by MMDetection +2. Modify the config and change the training setting accordingly + +### Convert model + +For more general usage, we also provide script `selfsup2mmdet.py` in the tools directory to convert the key of models pretrained by different self-supervised methods to PyTorch-style checkpoints used in MMDetection. + +```bash +python -u tools/model_converters/selfsup2mmdet.py ${PRETRAIN_PATH} ${STORE_PATH} --selfsup ${method} +``` + +This script convert model from `PRETRAIN_PATH` and store the converted model in `STORE_PATH`. + +For example, to use a ResNet-50 backbone released by MoCo, you can download it from [here](https://dl.fbaipublicfiles.com/moco/moco_checkpoints/moco_v2_800ep/moco_v2_800ep_pretrain.pth.tar) and use the following command + +```bash +python -u tools/model_converters/selfsup2mmdet.py ./moco_v2_800ep_pretrain.pth.tar mocov2_r50_800ep_pretrain.pth --selfsup moco +``` + +To use the ResNet-50 backbone released by SwAV, you can download it from [here](https://dl.fbaipublicfiles.com/deepcluster/swav_800ep_pretrain.pth.tar) + +### Modify config + +The backbone requires SyncBN and the `frozen_stages` need to be changed. A config that use the moco backbone is as below + +```python +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + pretrained='./mocov2_r50_800ep_pretrain.pth', + backbone=dict( + frozen_stages=0, + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False)) + +``` + +## Results and Models + +| Method | Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :-------: | :-----------------------------------------------------------------: | :-----: | :------------: | :------: | :------------: | :----: | :-----: | :--------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Mask RCNN | [R50 by MoCo v2](./mask_rcnn_r50_fpn_mocov2-pretrain_1x_coco.py) | pytorch | 1x | | | 38.0 | 34.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/selfsup_pretrain/mask_rcnn_r50_fpn_mocov2-pretrain_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/selfsup_pretrain/mask_rcnn_r50_fpn_mocov2-pretrain_1x_coco/mask_rcnn_r50_fpn_mocov2-pretrain_1x_coco_20210604_114614-a8b63483.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/selfsup_pretrain/mask_rcnn_r50_fpn_mocov2-pretrain_1x_coco/mask_rcnn_r50_fpn_mocov2-pretrain_1x_coco_20210604_114614.log.json) | +| Mask RCNN | [R50 by MoCo v2](./mask_rcnn_r50_fpn_mocov2-pretrain_ms-2x_coco.py) | pytorch | multi-scale 2x | | | 40.8 | 36.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/selfsup_pretrain/mask_rcnn_r50_fpn_mocov2-pretrain_ms-2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/selfsup_pretrain/mask_rcnn_r50_fpn_mocov2-pretrain_ms-2x_coco/mask_rcnn_r50_fpn_mocov2-pretrain_ms-2x_coco_20210605_163717-d95df20a.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/selfsup_pretrain/mask_rcnn_r50_fpn_mocov2-pretrain_ms-2x_coco/mask_rcnn_r50_fpn_mocov2-pretrain_ms-2x_coco_20210605_163717.log.json) | +| Mask RCNN | [R50 by SwAV](./mask_rcnn_r50_fpn_swav-pretrain_1x_coco.py) | pytorch | 1x | | | 39.1 | 35.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/selfsup_pretrain/mask_rcnn_r50_fpn_swav-pretrain_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/selfsup_pretrain/mask_rcnn_r50_fpn_swav-pretrain_1x_coco/mask_rcnn_r50_fpn_swav-pretrain_1x_coco_20210604_114640-7b9baf28.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/selfsup_pretrain/mask_rcnn_r50_fpn_swav-pretrain_1x_coco/mask_rcnn_r50_fpn_swav-pretrain_1x_coco_20210604_114640.log.json) | +| Mask RCNN | [R50 by SwAV](./mask_rcnn_r50_fpn_swav-pretrain_ms-2x_coco.py) | pytorch | multi-scale 2x | | | 41.3 | 37.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/selfsup_pretrain/mask_rcnn_r50_fpn_swav-pretrain_ms-2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/selfsup_pretrain/mask_rcnn_r50_fpn_swav-pretrain_ms-2x_coco/mask_rcnn_r50_fpn_swav-pretrain_ms-2x_coco_20210605_163717-08e26fca.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/selfsup_pretrain/mask_rcnn_r50_fpn_swav-pretrain_ms-2x_coco/mask_rcnn_r50_fpn_swav-pretrain_ms-2x_coco_20210605_163717.log.json) | + +### Notice + +1. We only provide single-scale 1x and multi-scale 2x configs as examples to show how to use backbones trained by self-supervised algorithms. We will try to reproduce the results in their corresponding paper using the released backbone in the future. Please stay tuned. + +## Citation + +We support to apply the backbone models pre-trained by different self-supervised methods in detection systems and provide their results on Mask R-CNN. + +The pre-trained models are converted from [MoCo](https://github.com/facebookresearch/moco) and downloaded from [SwAV](https://github.com/facebookresearch/swav). + +For SwAV, please cite + +```latex +@article{caron2020unsupervised, + title={Unsupervised Learning of Visual Features by Contrasting Cluster Assignments}, + author={Caron, Mathilde and Misra, Ishan and Mairal, Julien and Goyal, Priya and Bojanowski, Piotr and Joulin, Armand}, + booktitle={Proceedings of Advances in Neural Information Processing Systems (NeurIPS)}, + year={2020} +} +``` + +For MoCo, please cite + +```latex +@Article{he2019moco, + author = {Kaiming He and Haoqi Fan and Yuxin Wu and Saining Xie and Ross Girshick}, + title = {Momentum Contrast for Unsupervised Visual Representation Learning}, + journal = {arXiv preprint arXiv:1911.05722}, + year = {2019}, +} +@Article{chen2020mocov2, + author = {Xinlei Chen and Haoqi Fan and Ross Girshick and Kaiming He}, + title = {Improved Baselines with Momentum Contrastive Learning}, + journal = {arXiv preprint arXiv:2003.04297}, + year = {2020}, +} +``` diff --git a/configs/selfsup_pretrain/mask_rcnn_r50_fpn_mocov2-pretrain_1x_coco.py b/configs/selfsup_pretrain/mask_rcnn_r50_fpn_mocov2-pretrain_1x_coco.py new file mode 100644 index 0000000..f1e0615 --- /dev/null +++ b/configs/selfsup_pretrain/mask_rcnn_r50_fpn_mocov2-pretrain_1x_coco.py @@ -0,0 +1,13 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + backbone=dict( + frozen_stages=0, + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + init_cfg=dict( + type='Pretrained', checkpoint='./mocov2_r50_800ep_pretrain.pth'))) diff --git a/configs/selfsup_pretrain/mask_rcnn_r50_fpn_mocov2-pretrain_ms-2x_coco.py b/configs/selfsup_pretrain/mask_rcnn_r50_fpn_mocov2-pretrain_ms-2x_coco.py new file mode 100644 index 0000000..09aa156 --- /dev/null +++ b/configs/selfsup_pretrain/mask_rcnn_r50_fpn_mocov2-pretrain_ms-2x_coco.py @@ -0,0 +1,32 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_2x.py', '../_base_/default_runtime.py' +] + +model = dict( + backbone=dict( + frozen_stages=0, + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + init_cfg=dict( + type='Pretrained', checkpoint='./mocov2_r50_800ep_pretrain.pth'))) + +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']) +] + +data = dict(train=dict(pipeline=train_pipeline)) diff --git a/configs/selfsup_pretrain/mask_rcnn_r50_fpn_swav-pretrain_1x_coco.py b/configs/selfsup_pretrain/mask_rcnn_r50_fpn_swav-pretrain_1x_coco.py new file mode 100644 index 0000000..f92a345 --- /dev/null +++ b/configs/selfsup_pretrain/mask_rcnn_r50_fpn_swav-pretrain_1x_coco.py @@ -0,0 +1,13 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + backbone=dict( + frozen_stages=0, + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + init_cfg=dict( + type='Pretrained', checkpoint='./swav_800ep_pretrain.pth.tar'))) diff --git a/configs/selfsup_pretrain/mask_rcnn_r50_fpn_swav-pretrain_ms-2x_coco.py b/configs/selfsup_pretrain/mask_rcnn_r50_fpn_swav-pretrain_ms-2x_coco.py new file mode 100644 index 0000000..fe47361 --- /dev/null +++ b/configs/selfsup_pretrain/mask_rcnn_r50_fpn_swav-pretrain_ms-2x_coco.py @@ -0,0 +1,32 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_2x.py', '../_base_/default_runtime.py' +] + +model = dict( + backbone=dict( + frozen_stages=0, + norm_cfg=dict(type='SyncBN', requires_grad=True), + norm_eval=False, + init_cfg=dict( + type='Pretrained', checkpoint='./swav_800ep_pretrain.pth.tar'))) + +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']) +] + +data = dict(train=dict(pipeline=train_pipeline)) diff --git a/configs/simple_copy_paste/README.md b/configs/simple_copy_paste/README.md new file mode 100644 index 0000000..46162aa --- /dev/null +++ b/configs/simple_copy_paste/README.md @@ -0,0 +1,38 @@ +# SimpleCopyPaste + +> [Simple Copy-Paste is a Strong Data Augmentation Method for Instance Segmentation](https://arxiv.org/abs/2012.07177) + + + +## Abstract + +Building instance segmentation models that are data-efficient and can handle rare object categories is an important challenge in computer vision. Leveraging data augmentations is a promising direction towards addressing this challenge. Here, we perform a systematic study of the Copy-Paste augmentation (\[13, 12\]) for instance segmentation where we randomly paste objects onto an image. Prior studies on Copy-Paste relied on modeling the surrounding visual context for pasting the objects. However, we find that the simple mechanism of pasting objects randomly is good enough and can provide solid gains on top of strong baselines. Furthermore, we show Copy-Paste is additive with semi-supervised methods that leverage extra data through pseudo labeling (e.g. self-training). On COCO instance segmentation, we achieve 49.1 mask AP and 57.3 box AP, an improvement of +0.6 mask AP and +1.5 box AP over the previous state-of-the-art. We further demonstrate that Copy-Paste can lead to significant improvements on the LVIS benchmark. Our baseline model outperforms the LVIS 2020 Challenge winning entry by +3.6 mask AP on rare categories. + +
+ +
+ +## Results and Models + +### Mask R-CNN with Standard Scale Jittering (SSJ) and Simple Copy-Paste(SCP) + +Standard Scale Jittering(SSJ) resizes and crops an image with a resize range of 0.8 to 1.25 of the original image size, and Simple Copy-Paste(SCP) selects a random subset of objects from one of the images and pastes them onto the other image. + +| Backbone | Training schedule | Augmentation | batch size | box AP | mask AP | Config | Download | +| :------: | :---------------: | :----------: | :--------: | :----: | :-----: | :--------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | 90k | SSJ | 64 | 43.3 | 39.0 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_90k_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_90k_coco/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_90k_coco_20220316_181409-f79c84c5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_90k_coco/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_90k_coco_20220316_181409.log.json) | +| R-50 | 90k | SSJ+SCP | 64 | 43.8 | 39.2 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_90k_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_90k_coco/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_90k_coco_20220316_181307-6bc5726f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_90k_coco/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_90k_coco_20220316_181307.log.json) | +| R-50 | 270k | SSJ | 64 | 43.5 | 39.1 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_270k_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_270k_coco/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_270k_coco_20220324_182940-33a100c5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_270k_coco/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_270k_coco_20220324_182940.log.json) | +| R-50 | 270k | SSJ+SCP | 64 | 45.1 | 40.3 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_270k_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_270k_coco/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_270k_coco_20220324_201229-80ee90b7.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_270k_coco/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_270k_coco_20220324_201229.log.json) | + +## Citation + +```latex +@inproceedings{ghiasi2021simple, + title={Simple copy-paste is a strong data augmentation method for instance segmentation}, + author={Ghiasi, Golnaz and Cui, Yin and Srinivas, Aravind and Qian, Rui and Lin, Tsung-Yi and Cubuk, Ekin D and Le, Quoc V and Zoph, Barret}, + booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition}, + pages={2918--2928}, + year={2021} +} +``` diff --git a/configs/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_270k_coco.py b/configs/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_270k_coco.py new file mode 100644 index 0000000..d0ce917 --- /dev/null +++ b/configs/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_270k_coco.py @@ -0,0 +1,20 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + # 270k iterations with batch_size 64 is roughly equivalent to 144 epochs + '../common/ssj_270k_coco_instance.py', +] + +norm_cfg = dict(type='SyncBN', requires_grad=True) +# Use MMSyncBN that handles empty tensor in head. It can be changed to +# SyncBN after https://github.com/pytorch/pytorch/issues/36530 is fixed. +head_norm_cfg = dict(type='MMSyncBN', requires_grad=True) +model = dict( + backbone=dict(frozen_stages=-1, norm_eval=False, norm_cfg=norm_cfg), + neck=dict(norm_cfg=norm_cfg), + rpn_head=dict(num_convs=2), # leads to 0.1+ mAP + roi_head=dict( + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + conv_out_channels=256, + norm_cfg=head_norm_cfg), + mask_head=dict(norm_cfg=head_norm_cfg))) diff --git a/configs/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_90k_coco.py b/configs/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_90k_coco.py new file mode 100644 index 0000000..1eee95f --- /dev/null +++ b/configs/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_90k_coco.py @@ -0,0 +1,7 @@ +_base_ = 'mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_270k_coco.py' + +# lr steps at [0.9, 0.95, 0.975] of the maximum iterations +lr_config = dict( + warmup_iters=500, warmup_ratio=0.067, step=[81000, 85500, 87750]) +# 90k iterations with batch_size 64 is roughly equivalent to 48 epochs +runner = dict(type='IterBasedRunner', max_iters=90000) diff --git a/configs/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_270k_coco.py b/configs/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_270k_coco.py new file mode 100644 index 0000000..bd28ddd --- /dev/null +++ b/configs/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_270k_coco.py @@ -0,0 +1,20 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + # 270k iterations with batch_size 64 is roughly equivalent to 144 epochs + '../common/ssj_scp_270k_coco_instance.py' +] + +norm_cfg = dict(type='SyncBN', requires_grad=True) +# Use MMSyncBN that handles empty tensor in head. It can be changed to +# SyncBN after https://github.com/pytorch/pytorch/issues/36530 is fixed. +head_norm_cfg = dict(type='MMSyncBN', requires_grad=True) +model = dict( + backbone=dict(frozen_stages=-1, norm_eval=False, norm_cfg=norm_cfg), + neck=dict(norm_cfg=norm_cfg), + rpn_head=dict(num_convs=2), # leads to 0.1+ mAP + roi_head=dict( + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + conv_out_channels=256, + norm_cfg=head_norm_cfg), + mask_head=dict(norm_cfg=head_norm_cfg))) diff --git a/configs/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_90k_coco.py b/configs/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_90k_coco.py new file mode 100644 index 0000000..b632c13 --- /dev/null +++ b/configs/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_90k_coco.py @@ -0,0 +1,7 @@ +_base_ = 'mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_270k_coco.py' + +# lr steps at [0.9, 0.95, 0.975] of the maximum iterations +lr_config = dict( + warmup_iters=500, warmup_ratio=0.067, step=[81000, 85500, 87750]) +# 90k iterations with batch_size 64 is roughly equivalent to 48 epochs +runner = dict(type='IterBasedRunner', max_iters=90000) diff --git a/configs/simple_copy_paste/metafile.yml b/configs/simple_copy_paste/metafile.yml new file mode 100644 index 0000000..bb6106c --- /dev/null +++ b/configs/simple_copy_paste/metafile.yml @@ -0,0 +1,92 @@ +Collections: + - Name: SimpleCopyPaste + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 32x A100 GPUs + Architecture: + - Softmax + - RPN + - Convolution + - Dense Connections + - FPN + - ResNet + - RoIAlign + Paper: + URL: https://arxiv.org/abs/2012.07177 + Title: "Simple Copy-Paste is a Strong Data Augmentation Method for Instance Segmentation" + README: configs/simple_copy_paste/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.25.0/mmdet/datasets/pipelines/transforms.py#L2762 + Version: v2.25.0 + +Models: + - Name: mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_270k_coco + In Collection: SimpleCopyPaste + Config: configs/simplecopypaste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_270k_coco.py + Metadata: + Training Memory (GB): 7.2 + Iterations: 270000 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.5 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_270k_coco/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_270k_coco_20220324_182940-33a100c5.pth + + - Name: mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_90k_coco + In Collection: SimpleCopyPaste + Config: configs/simplecopypaste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_90k_coco.py + Metadata: + Training Memory (GB): 7.2 + Iterations: 90000 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.3 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_90k_coco/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_32x2_90k_coco_20220316_181409-f79c84c5.pth + + - Name: mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_270k_coco + In Collection: SimpleCopyPaste + Config: configs/simplecopypaste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_270k_coco.py + Metadata: + Training Memory (GB): 7.2 + Iterations: 270000 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.1 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 40.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_270k_coco/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_270k_coco_20220324_201229-80ee90b7.pth + + - Name: mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_90k_coco + In Collection: SimpleCopyPaste + Config: configs/simplecopypaste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_90k_coco.py + Metadata: + Training Memory (GB): 7.2 + Iterations: 90000 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.8 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_90k_coco/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_90k_coco_20220316_181307-6bc5726f.pth diff --git a/configs/solo/README.md b/configs/solo/README.md new file mode 100644 index 0000000..4a36676 --- /dev/null +++ b/configs/solo/README.md @@ -0,0 +1,54 @@ +# SOLO + +> [SOLO: Segmenting Objects by Locations](https://arxiv.org/abs/1912.04488) + + + +## Abstract + +We present a new, embarrassingly simple approach to instance segmentation in images. Compared to many other dense prediction tasks, e.g., semantic segmentation, it is the arbitrary number of instances that have made instance segmentation much more challenging. In order to predict a mask for each instance, mainstream approaches either follow the 'detect-thensegment' strategy as used by Mask R-CNN, or predict category masks first then use clustering techniques to group pixels into individual instances. We view the task of instance segmentation from a completely new perspective by introducing the notion of "instance categories", which assigns categories to each pixel within an instance according to the instance's location and size, thus nicely converting instance mask segmentation into a classification-solvable problem. Now instance segmentation is decomposed into two classification tasks. We demonstrate a much simpler and flexible instance segmentation framework with strong performance, achieving on par accuracy with Mask R-CNN and outperforming recent singleshot instance segmenters in accuracy. We hope that this very simple and strong framework can serve as a baseline for many instance-level recognition tasks besides instance segmentation. + +
+ +
+ +## Results and Models + +### SOLO + +| Backbone | Style | MS train | Lr schd | Mem (GB) | Inf time (fps) | mask AP | Download | +| :------: | :-----: | :------: | :-----: | :------: | :------------: | :-----: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | pytorch | N | 1x | 8.0 | 14.0 | 33.1 | [model](https://download.openmmlab.com/mmdetection/v2.0/solo/solo_r50_fpn_1x_coco/solo_r50_fpn_1x_coco_20210821_035055-2290a6b8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/solo/solo_r50_fpn_1x_coco/solo_r50_fpn_1x_coco_20210821_035055.log.json) | +| R-50 | pytorch | Y | 3x | 7.4 | 14.0 | 35.9 | [model](https://download.openmmlab.com/mmdetection/v2.0/solo/solo_r50_fpn_3x_coco/solo_r50_fpn_3x_coco_20210901_012353-11d224d7.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/solo/solo_r50_fpn_3x_coco/solo_r50_fpn_3x_coco_20210901_012353.log.json) | + +### Decoupled SOLO + +| Backbone | Style | MS train | Lr schd | Mem (GB) | Inf time (fps) | mask AP | Download | +| :------: | :-----: | :------: | :-----: | :------: | :------------: | :-----: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | pytorch | N | 1x | 7.8 | 12.5 | 33.9 | [model](https://download.openmmlab.com/mmdetection/v2.0/solo/decoupled_solo_r50_fpn_1x_coco/decoupled_solo_r50_fpn_1x_coco_20210820_233348-6337c589.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/solo/decoupled_solo_r50_fpn_1x_coco/decoupled_solo_r50_fpn_1x_coco_20210820_233348.log.json) | +| R-50 | pytorch | Y | 3x | 7.9 | 12.5 | 36.7 | [model](https://download.openmmlab.com/mmdetection/v2.0/solo/decoupled_solo_r50_fpn_3x_coco/decoupled_solo_r50_fpn_3x_coco_20210821_042504-7b3301ec.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/solo/decoupled_solo_r50_fpn_3x_coco/decoupled_solo_r50_fpn_3x_coco_20210821_042504.log.json) | + +- Decoupled SOLO has a decoupled head which is different from SOLO head. + Decoupled SOLO serves as an efficient and equivalent variant in accuracy + of SOLO. Please refer to the corresponding config files for details. + +### Decoupled Light SOLO + +| Backbone | Style | MS train | Lr schd | Mem (GB) | Inf time (fps) | mask AP | Download | +| :------: | :-----: | :------: | :-----: | :------: | :------------: | :-----: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | pytorch | Y | 3x | 2.2 | 31.2 | 32.9 | [model](https://download.openmmlab.com/mmdetection/v2.0/solo/decoupled_solo_light_r50_fpn_3x_coco/decoupled_solo_light_r50_fpn_3x_coco_20210906_142703-e70e226f.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/solo/decoupled_solo_light_r50_fpn_3x_coco/decoupled_solo_light_r50_fpn_3x_coco_20210906_142703.log.json) | + +- Decoupled Light SOLO using decoupled structure similar to Decoupled + SOLO head, with light-weight head and smaller input size, Please refer + to the corresponding config files for details. + +## Citation + +```latex +@inproceedings{wang2020solo, + title = {{SOLO}: Segmenting Objects by Locations}, + author = {Wang, Xinlong and Kong, Tao and Shen, Chunhua and Jiang, Yuning and Li, Lei}, + booktitle = {Proc. Eur. Conf. Computer Vision (ECCV)}, + year = {2020} +} +``` diff --git a/configs/solo/decoupled_solo_light_r50_fpn_3x_coco.py b/configs/solo/decoupled_solo_light_r50_fpn_3x_coco.py new file mode 100644 index 0000000..101f8f1 --- /dev/null +++ b/configs/solo/decoupled_solo_light_r50_fpn_3x_coco.py @@ -0,0 +1,63 @@ +_base_ = './decoupled_solo_r50_fpn_3x_coco.py' + +# model settings +model = dict( + mask_head=dict( + type='DecoupledSOLOLightHead', + num_classes=80, + in_channels=256, + stacked_convs=4, + feat_channels=256, + strides=[8, 8, 16, 32, 32], + scale_ranges=((1, 64), (32, 128), (64, 256), (128, 512), (256, 2048)), + pos_scale=0.2, + num_grids=[40, 36, 24, 16, 12], + cls_down_index=0, + loss_mask=dict( + type='DiceLoss', use_sigmoid=True, activate=False, + loss_weight=3.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True))) + +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(852, 512), (852, 480), (852, 448), (852, 416), (852, 384), + (852, 352)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(852, 512), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/solo/decoupled_solo_r50_fpn_1x_coco.py b/configs/solo/decoupled_solo_r50_fpn_1x_coco.py new file mode 100644 index 0000000..b611cdf --- /dev/null +++ b/configs/solo/decoupled_solo_r50_fpn_1x_coco.py @@ -0,0 +1,28 @@ +_base_ = [ + './solo_r50_fpn_1x_coco.py', +] +# model settings +model = dict( + mask_head=dict( + type='DecoupledSOLOHead', + num_classes=80, + in_channels=256, + stacked_convs=7, + feat_channels=256, + strides=[8, 8, 16, 32, 32], + scale_ranges=((1, 96), (48, 192), (96, 384), (192, 768), (384, 2048)), + pos_scale=0.2, + num_grids=[40, 36, 24, 16, 12], + cls_down_index=0, + loss_mask=dict( + type='DiceLoss', use_sigmoid=True, activate=False, + loss_weight=3.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True))) + +optimizer = dict(type='SGD', lr=0.01) diff --git a/configs/solo/decoupled_solo_r50_fpn_3x_coco.py b/configs/solo/decoupled_solo_r50_fpn_3x_coco.py new file mode 100644 index 0000000..4a8c19d --- /dev/null +++ b/configs/solo/decoupled_solo_r50_fpn_3x_coco.py @@ -0,0 +1,25 @@ +_base_ = './solo_r50_fpn_3x_coco.py' + +# model settings +model = dict( + mask_head=dict( + type='DecoupledSOLOHead', + num_classes=80, + in_channels=256, + stacked_convs=7, + feat_channels=256, + strides=[8, 8, 16, 32, 32], + scale_ranges=((1, 96), (48, 192), (96, 384), (192, 768), (384, 2048)), + pos_scale=0.2, + num_grids=[40, 36, 24, 16, 12], + cls_down_index=0, + loss_mask=dict( + type='DiceLoss', use_sigmoid=True, activate=False, + loss_weight=3.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True))) diff --git a/configs/solo/metafile.yml b/configs/solo/metafile.yml new file mode 100644 index 0000000..b6244e8 --- /dev/null +++ b/configs/solo/metafile.yml @@ -0,0 +1,115 @@ +Collections: + - Name: SOLO + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - Convolution + - ResNet + Paper: https://arxiv.org/abs/1912.04488 + README: configs/solo/README.md + +Models: + - Name: decoupled_solo_r50_fpn_1x_coco + In Collection: SOLO + Config: configs/solo/decoupled_solo_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.8 + Epochs: 12 + inference time (ms/im): + - value: 116.4 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (1333, 800) + Results: + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 33.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/solo/decoupled_solo_r50_fpn_1x_coco/decoupled_solo_r50_fpn_1x_coco_20210820_233348-6337c589.pth + + - Name: decoupled_solo_r50_fpn_3x_coco + In Collection: SOLO + Config: configs/solo/decoupled_solo_r50_fpn_3x_coco.py + Metadata: + Training Memory (GB): 7.9 + Epochs: 36 + inference time (ms/im): + - value: 117.2 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (1333, 800) + Results: + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 36.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/solo/decoupled_solo_r50_fpn_3x_coco/decoupled_solo_r50_fpn_3x_coco_20210821_042504-7b3301ec.pth + + - Name: decoupled_solo_light_r50_fpn_3x_coco + In Collection: SOLO + Config: configs/solo/decoupled_solo_light_r50_fpn_3x_coco.py + Metadata: + Training Memory (GB): 2.2 + Epochs: 36 + inference time (ms/im): + - value: 35.0 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (852, 512) + Results: + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 32.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/solo/decoupled_solo_light_r50_fpn_3x_coco/decoupled_solo_light_r50_fpn_3x_coco_20210906_142703-e70e226f.pth + + - Name: solo_r50_fpn_3x_coco + In Collection: SOLO + Config: configs/solo/solo_r50_fpn_3x_coco.py + Metadata: + Training Memory (GB): 7.4 + Epochs: 36 + inference time (ms/im): + - value: 94.2 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (1333, 800) + Results: + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 35.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/solo/solo_r50_fpn_3x_coco/solo_r50_fpn_3x_coco_20210901_012353-11d224d7.pth + + - Name: solo_r50_fpn_1x_coco + In Collection: SOLO + Config: configs/solo/solo_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 8.0 + Epochs: 12 + inference time (ms/im): + - value: 95.1 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (1333, 800) + Results: + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 33.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/solo/solo_r50_fpn_1x_coco/solo_r50_fpn_1x_coco_20210821_035055-2290a6b8.pth diff --git a/configs/solo/solo_r50_fpn_1x_coco.py b/configs/solo/solo_r50_fpn_1x_coco.py new file mode 100644 index 0000000..9093a50 --- /dev/null +++ b/configs/solo/solo_r50_fpn_1x_coco.py @@ -0,0 +1,53 @@ +_base_ = [ + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +# model settings +model = dict( + type='SOLO', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50'), + style='pytorch'), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=0, + num_outs=5), + mask_head=dict( + type='SOLOHead', + num_classes=80, + in_channels=256, + stacked_convs=7, + feat_channels=256, + strides=[8, 8, 16, 32, 32], + scale_ranges=((1, 96), (48, 192), (96, 384), (192, 768), (384, 2048)), + pos_scale=0.2, + num_grids=[40, 36, 24, 16, 12], + cls_down_index=0, + loss_mask=dict(type='DiceLoss', use_sigmoid=True, loss_weight=3.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True)), + # model training and testing settings + test_cfg=dict( + nms_pre=500, + score_thr=0.1, + mask_thr=0.5, + filter_thr=0.05, + kernel='gaussian', # gaussian/linear + sigma=2.0, + max_per_img=100)) + +# optimizer +optimizer = dict(type='SGD', lr=0.01) diff --git a/configs/solo/solo_r50_fpn_3x_coco.py b/configs/solo/solo_r50_fpn_3x_coco.py new file mode 100644 index 0000000..52302cd --- /dev/null +++ b/configs/solo/solo_r50_fpn_3x_coco.py @@ -0,0 +1,28 @@ +_base_ = './solo_r50_fpn_1x_coco.py' + +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 800), (1333, 768), (1333, 736), (1333, 704), + (1333, 672), (1333, 640)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict(train=dict(pipeline=train_pipeline)) + +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=1.0 / 3, + step=[27, 33]) +runner = dict(type='EpochBasedRunner', max_epochs=36) diff --git a/configs/solov2/README.md b/configs/solov2/README.md new file mode 100644 index 0000000..2ffe70f --- /dev/null +++ b/configs/solov2/README.md @@ -0,0 +1,59 @@ +# SOLOv2 + +> [SOLOv2: Dynamic and Fast Instance Segmentation](https://arxiv.org/abs/2003.10152) + + + +## Abstract + +In this work, we aim at building a simple, direct, and fast instance segmentation +framework with strong performance. We follow the principle of the SOLO method of +Wang et al. "SOLO: segmenting objects by locations". Importantly, we take one +step further by dynamically learning the mask head of the object segmenter such +that the mask head is conditioned on the location. Specifically, the mask branch +is decoupled into a mask kernel branch and mask feature branch, which are +responsible for learning the convolution kernel and the convolved features +respectively. Moreover, we propose Matrix NMS (non maximum suppression) to +significantly reduce the inference time overhead due to NMS of masks. Our +Matrix NMS performs NMS with parallel matrix operations in one shot, and +yields better results. We demonstrate a simple direct instance segmentation +system, outperforming a few state-of-the-art methods in both speed and accuracy. +A light-weight version of SOLOv2 executes at 31.3 FPS and yields 37.1% AP. +Moreover, our state-of-the-art results in object detection (from our mask byproduct) +and panoptic segmentation show the potential to serve as a new strong baseline +for many instance-level recognition tasks besides instance segmentation. + +
+ +
+ +## Results and Models + +### SOLOv2 + +| Backbone | Style | MS train | Lr schd | Mem (GB) | mask AP | Config | Download | +| :--------: | :-----: | :------: | :-----: | :------: | :-----: | :-----------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | pytorch | N | 1x | 5.1 | 34.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/solov2/solov2_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_r50_fpn_1x_coco/solov2_r50_fpn_1x_coco_20220512_125858-a357fa23.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_r50_fpn_1x_coco/solov2_r50_fpn_1x_coco_20220512_125858.log.json) | +| R-50 | pytorch | Y | 3x | 5.1 | 37.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/solov2/solov2_r50_fpn_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_r50_fpn_3x_coco/solov2_r50_fpn_3x_coco_20220512_125856-fed092d4.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_r50_fpn_3x_coco/solov2_r50_fpn_3x_coco_20220512_125856.log.json) | +| R-101 | pytorch | Y | 3x | 6.9 | 39.1 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/solov2/solov2_r101_fpn_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_r101_fpn_3x_coco/solov2_r101_fpn_3x_coco_20220511_095119-c559a076.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_r101_fpn_3x_coco/solov2_r101_fpn_3x_coco_20220511_095119.log.json) | +| R-101(DCN) | pytorch | Y | 3x | 7.1 | 41.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/solov2/solov2_r101_dcn_fpn_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_r101_dcn_fpn_3x_coco/solov2_r101_dcn_fpn_3x_coco_20220513_214734-16c966cb.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_r101_dcn_fpn_3x_coco/solov2_r101_dcn_fpn_3x_coco_20220513_214734.log.json) | +| X-101(DCN) | pytorch | Y | 3x | 11.3 | 42.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/solov2/solov2_x101_dcn_fpn_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_x101_dcn_fpn_3x_coco/solov2_x101_dcn_fpn_3x_coco_20220513_214337-aef41095.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_x101_dcn_fpn_3x_coco/solov2_x101_dcn_fpn_3x_coco_20220513_214337.log.json) | + +### Light SOLOv2 + +| Backbone | Style | MS train | Lr schd | Mem (GB) | mask AP | Config | Download | +| :------: | :-----: | :------: | :-----: | :------: | :-----: | :------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-18 | pytorch | Y | 3x | 9.1 | 29.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/solov2/solov2_light_r18_fpn_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_light_r18_fpn_3x_coco/solov2_light_r18_fpn_3x_coco_20220511_083717-75fa355b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_light_r18_fpn_3x_coco/solov2_light_r18_fpn_3x_coco_20220511_083717.log.json) | +| R-34 | pytorch | Y | 3x | 9.3 | 31.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/solov2/solov2_light_r34_fpn_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_light_r34_fpn_3x_coco/solov2_light_r34_fpn_3x_coco_20220511_091839-e51659d3.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_light_r34_fpn_3x_coco/solov2_light_r34_fpn_3x_coco_20220511_091839.log.json) | +| R-50 | pytorch | Y | 3x | 9.9 | 33.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/solov2/solov2_light_r50_fpn_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_light_r50_fpn_3x_coco/solov2_light_r50_fpn_3x_coco_20220512_165256-c93a6074.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_light_r50_fpn_3x_coco/solov2_light_r50_fpn_3x_coco_20220512_165256.log.json) | + +## Citation + +```latex +@article{wang2020solov2, + title={SOLOv2: Dynamic and Fast Instance Segmentation}, + author={Wang, Xinlong and Zhang, Rufeng and Kong, Tao and Li, Lei and Shen, Chunhua}, + journal={Proc. Advances in Neural Information Processing Systems (NeurIPS)}, + year={2020} +} +``` diff --git a/configs/solov2/metafile.yml b/configs/solov2/metafile.yml new file mode 100644 index 0000000..656f66f --- /dev/null +++ b/configs/solov2/metafile.yml @@ -0,0 +1,119 @@ +Collections: + - Name: SOLOv2 + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x A100 GPUs + Architecture: + - FPN + - Convolution + - ResNet + Paper: https://arxiv.org/abs/2003.10152 + README: configs/solov2/README.md + +Models: + - Name: solov2_r50_fpn_1x_coco + In Collection: SOLOv2 + Config: configs/solov2/solov2_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 5.1 + Epochs: 12 + Results: + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 34.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_r50_fpn_1x_coco/solov2_r50_fpn_1x_coco_20220512_125858-a357fa23.pth + + - Name: solov2_r50_fpn_3x_coco + In Collection: SOLOv2 + Config: configs/solov2/solov2_r50_fpn_3x_coco.py + Metadata: + Training Memory (GB): 5.1 + Epochs: 36 + Results: + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 37.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_r50_fpn_3x_coco/solov2_r50_fpn_3x_coco_20220512_125856-fed092d4.pth + + - Name: solov2_r101_fpn_3x_coco + In Collection: SOLOv2 + Config: configs/solov2/solov2_r101_fpn_3x_coco.py + Metadata: + Training Memory (GB): 6.9 + Epochs: 36 + Results: + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_r101_fpn_3x_coco/solov2_r101_fpn_3x_coco_20220511_095119-c559a076.pth + + - Name: solov2_r101_dcn_fpn_3x_coco + In Collection: SOLOv2 + Config: configs/solov2/solov2_r101_dcn_fpn_3x_coco.py + Metadata: + Training Memory (GB): 7.1 + Epochs: 36 + Results: + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 41.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_r101_dcn_fpn_3x_coco/solov2_r101_dcn_fpn_3x_coco_20220513_214734-16c966cb.pth + + - Name: solov2_x101_dcn_fpn_3x_coco + In Collection: SOLOv2 + Config: configs/solov2/solov2_x101_dcn_fpn_3x_coco.py + Metadata: + Training Memory (GB): 11.3 + Epochs: 36 + Results: + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 42.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_x101_dcn_fpn_3x_coco/solov2_x101_dcn_fpn_3x_coco_20220513_214337-aef41095.pth + + - Name: solov2_light_r18_fpn_3x_coco + In Collection: SOLOv2 + Config: configs/solov2/solov2_light_r18_fpn_3x_coco.py + Metadata: + Training Memory (GB): 9.1 + Epochs: 36 + Results: + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 29.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_light_r18_fpn_3x_coco/solov2_light_r18_fpn_3x_coco_20220511_083717-75fa355b.pth + + - Name: solov2_light_r34_fpn_3x_coco + In Collection: SOLOv2 + Config: configs/solov2/solov2_light_r34_fpn_3x_coco.py + Metadata: + Training Memory (GB): 9.3 + Epochs: 36 + Results: + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 31.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_light_r34_fpn_3x_coco/solov2_light_r34_fpn_3x_coco_20220511_091839-e51659d3.pth + + - Name: solov2_light_r50_fpn_3x_coco + In Collection: SOLOv2 + Config: configs/solov2/solov2_light_r50_fpn_3x_coco.py + Metadata: + Training Memory (GB): 9.9 + Epochs: 36 + Results: + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 33.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/solov2/solov2_light_r50_fpn_3x_coco/solov2_light_r50_fpn_3x_coco_20220512_165256-c93a6074.pth diff --git a/configs/solov2/solov2_light_r18_fpn_3x_coco.py b/configs/solov2/solov2_light_r18_fpn_3x_coco.py new file mode 100644 index 0000000..6fb33b0 --- /dev/null +++ b/configs/solov2/solov2_light_r18_fpn_3x_coco.py @@ -0,0 +1,7 @@ +_base_ = 'solov2_light_r50_fpn_3x_coco.py' + +# model settings +model = dict( + backbone=dict( + depth=18, init_cfg=dict(checkpoint='torchvision://resnet18')), + neck=dict(in_channels=[64, 128, 256, 512])) diff --git a/configs/solov2/solov2_light_r34_fpn_3x_coco.py b/configs/solov2/solov2_light_r34_fpn_3x_coco.py new file mode 100644 index 0000000..ea082a1 --- /dev/null +++ b/configs/solov2/solov2_light_r34_fpn_3x_coco.py @@ -0,0 +1,7 @@ +_base_ = 'solov2_light_r50_fpn_3x_coco.py' + +# model settings +model = dict( + backbone=dict( + depth=34, init_cfg=dict(checkpoint='torchvision://resnet34')), + neck=dict(in_channels=[64, 128, 256, 512])) diff --git a/configs/solov2/solov2_light_r50_dcn_fpn_3x_coco.py b/configs/solov2/solov2_light_r50_dcn_fpn_3x_coco.py new file mode 100644 index 0000000..4d758e2 --- /dev/null +++ b/configs/solov2/solov2_light_r50_dcn_fpn_3x_coco.py @@ -0,0 +1,62 @@ +_base_ = 'solov2_r50_fpn_3x_coco.py' + +# model settings +model = dict( + backbone=dict( + dcn=dict(type='DCNv2', deformable_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True)), + mask_head=dict( + feat_channels=256, + stacked_convs=3, + scale_ranges=((1, 64), (32, 128), (64, 256), (128, 512), (256, 2048)), + mask_feature_head=dict(out_channels=128), + dcn_cfg=dict(type='DCNv2'), + dcn_apply_to_all_conv=False)) # light solov2 head + +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=1.0 / 3, + step=[27, 33]) +runner = dict(type='EpochBasedRunner', max_epochs=36) + +# data +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(768, 512), (768, 480), (768, 448), (768, 416), (768, 384), + (768, 352)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(448, 768), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/solov2/solov2_light_r50_fpn_3x_coco.py b/configs/solov2/solov2_light_r50_fpn_3x_coco.py new file mode 100644 index 0000000..e08f1db --- /dev/null +++ b/configs/solov2/solov2_light_r50_fpn_3x_coco.py @@ -0,0 +1,57 @@ +_base_ = 'solov2_r50_fpn_1x_coco.py' + +# model settings +model = dict( + mask_head=dict( + stacked_convs=2, + feat_channels=256, + scale_ranges=((1, 56), (28, 112), (56, 224), (112, 448), (224, 896)), + mask_feature_head=dict(out_channels=128))) + +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=1.0 / 3, + step=[27, 33]) +runner = dict(type='EpochBasedRunner', max_epochs=36) + +# data +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(768, 512), (768, 480), (768, 448), (768, 416), (768, 384), + (768, 352)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(448, 768), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/solov2/solov2_r101_dcn_fpn_3x_coco.py b/configs/solov2/solov2_r101_dcn_fpn_3x_coco.py new file mode 100644 index 0000000..1594118 --- /dev/null +++ b/configs/solov2/solov2_r101_dcn_fpn_3x_coco.py @@ -0,0 +1,13 @@ +_base_ = 'solov2_r50_fpn_3x_coco.py' + +# model settings +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(checkpoint='torchvision://resnet101'), + dcn=dict(type='DCNv2', deformable_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True)), + mask_head=dict( + mask_feature_head=dict(conv_cfg=dict(type='DCNv2')), + dcn_cfg=dict(type='DCNv2'), + dcn_apply_to_all_conv=True)) diff --git a/configs/solov2/solov2_r101_fpn_3x_coco.py b/configs/solov2/solov2_r101_fpn_3x_coco.py new file mode 100644 index 0000000..6c248e5 --- /dev/null +++ b/configs/solov2/solov2_r101_fpn_3x_coco.py @@ -0,0 +1,6 @@ +_base_ = 'solov2_r50_fpn_3x_coco.py' + +# model settings +model = dict( + backbone=dict( + depth=101, init_cfg=dict(checkpoint='torchvision://resnet101'))) diff --git a/configs/solov2/solov2_r50_fpn_1x_coco.py b/configs/solov2/solov2_r50_fpn_1x_coco.py new file mode 100644 index 0000000..9aee571 --- /dev/null +++ b/configs/solov2/solov2_r50_fpn_1x_coco.py @@ -0,0 +1,61 @@ +_base_ = [ + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +# model settings +model = dict( + type='SOLOv2', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50'), + style='pytorch'), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=0, + num_outs=5), + mask_head=dict( + type='SOLOV2Head', + num_classes=80, + in_channels=256, + feat_channels=512, + stacked_convs=4, + strides=[8, 8, 16, 32, 32], + scale_ranges=((1, 96), (48, 192), (96, 384), (192, 768), (384, 2048)), + pos_scale=0.2, + num_grids=[40, 36, 24, 16, 12], + cls_down_index=0, + mask_feature_head=dict( + feat_channels=128, + start_level=0, + end_level=3, + out_channels=256, + mask_stride=4, + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True)), + loss_mask=dict(type='DiceLoss', use_sigmoid=True, loss_weight=3.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0)), + # model training and testing settings + test_cfg=dict( + nms_pre=500, + score_thr=0.1, + mask_thr=0.5, + filter_thr=0.05, + kernel='gaussian', # gaussian/linear + sigma=2.0, + max_per_img=100)) + +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) diff --git a/configs/solov2/solov2_r50_fpn_3x_coco.py b/configs/solov2/solov2_r50_fpn_3x_coco.py new file mode 100644 index 0000000..640c730 --- /dev/null +++ b/configs/solov2/solov2_r50_fpn_3x_coco.py @@ -0,0 +1,28 @@ +_base_ = 'solov2_r50_fpn_1x_coco.py' + +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 800), (1333, 768), (1333, 736), (1333, 704), + (1333, 672), (1333, 640)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict(train=dict(pipeline=train_pipeline)) + +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=1.0 / 3, + step=[27, 33]) +runner = dict(type='EpochBasedRunner', max_epochs=36) diff --git a/configs/solov2/solov2_x101_dcn_fpn_3x_coco.py b/configs/solov2/solov2_x101_dcn_fpn_3x_coco.py new file mode 100644 index 0000000..6115fed --- /dev/null +++ b/configs/solov2/solov2_x101_dcn_fpn_3x_coco.py @@ -0,0 +1,17 @@ +_base_ = 'solov2_r50_fpn_3x_coco.py' + +# model settings +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + dcn=dict(type='DCNv2', deformable_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d')), + mask_head=dict( + mask_feature_head=dict(conv_cfg=dict(type='DCNv2')), + dcn_cfg=dict(type='DCNv2'), + dcn_apply_to_all_conv=True)) diff --git a/configs/sparse_rcnn/README.md b/configs/sparse_rcnn/README.md new file mode 100644 index 0000000..d7912e0 --- /dev/null +++ b/configs/sparse_rcnn/README.md @@ -0,0 +1,38 @@ +# Sparse R-CNN + +> [Sparse R-CNN: End-to-End Object Detection with Learnable Proposals](https://arxiv.org/abs/2011.12450) + + + +## Abstract + +We present Sparse R-CNN, a purely sparse method for object detection in images. Existing works on object detection heavily rely on dense object candidates, such as k anchor boxes pre-defined on all grids of image feature map of size H×W. In our method, however, a fixed sparse set of learned object proposals, total length of N, are provided to object recognition head to perform classification and location. By eliminating HWk (up to hundreds of thousands) hand-designed object candidates to N (e.g. 100) learnable proposals, Sparse R-CNN completely avoids all efforts related to object candidates design and many-to-one label assignment. More importantly, final predictions are directly output without non-maximum suppression post-procedure. Sparse R-CNN demonstrates accuracy, run-time and training convergence performance on par with the well-established detector baselines on the challenging COCO dataset, e.g., achieving 45.0 AP in standard 3× training schedule and running at 22 fps using ResNet-50 FPN model. We hope our work could inspire re-thinking the convention of dense prior in object detectors. + +
+ +
+ +## Results and Models + +| Model | Backbone | Style | Lr schd | Number of Proposals | Multi-Scale | RandomCrop | box AP | Config | Download | +| :----------: | :-------: | :-----: | :-----: | :-----------------: | :---------: | :--------: | :----: | :----------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Sparse R-CNN | R-50-FPN | pytorch | 1x | 100 | False | False | 37.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco/sparse_rcnn_r50_fpn_1x_coco_20201222_214453-dc79b137.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco/sparse_rcnn_r50_fpn_1x_coco_20201222_214453-dc79b137.log.json) | +| Sparse R-CNN | R-50-FPN | pytorch | 3x | 100 | True | False | 42.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/sparse_rcnn/sparse_rcnn_r50_fpn_mstrain_480-800_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/sparse_rcnn/sparse_rcnn_r50_fpn_mstrain_480-800_3x_coco/sparse_rcnn_r50_fpn_mstrain_480-800_3x_coco_20201218_154234-7bc5c054.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/sparse_rcnn/sparse_rcnn_r50_fpn_mstrain_480-800_3x_coco/sparse_rcnn_r50_fpn_mstrain_480-800_3x_coco_20201218_154234-7bc5c054.log.json) | +| Sparse R-CNN | R-50-FPN | pytorch | 3x | 300 | True | True | 45.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/sparse_rcnn/sparse_rcnn_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/sparse_rcnn/sparse_rcnn_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco/sparse_rcnn_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco_20201223_024605-9fe92701.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/sparse_rcnn/sparse_rcnn_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco/sparse_rcnn_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco_20201223_024605-9fe92701.log.json) | +| Sparse R-CNN | R-101-FPN | pytorch | 3x | 100 | True | False | 44.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/sparse_rcnn/sparse_rcnn_r101_fpn_mstrain_480-800_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/sparse_rcnn/sparse_rcnn_r101_fpn_mstrain_480-800_3x_coco/sparse_rcnn_r101_fpn_mstrain_480-800_3x_coco_20201223_121552-6c46c9d6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/sparse_rcnn/sparse_rcnn_r101_fpn_mstrain_480-800_3x_coco/sparse_rcnn_r101_fpn_mstrain_480-800_3x_coco_20201223_121552-6c46c9d6.log.json) | +| Sparse R-CNN | R-101-FPN | pytorch | 3x | 300 | True | True | 46.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/sparse_rcnn/sparse_rcnn_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/sparse_rcnn/sparse_rcnn_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco/sparse_rcnn_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco_20201223_023452-c23c3564.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/sparse_rcnn/sparse_rcnn_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco/sparse_rcnn_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco_20201223_023452-c23c3564.log.json) | + +### Notes + +We observe about 0.3 AP noise especially when using ResNet-101 as the backbone. + +## Citation + +```latex +@article{peize2020sparse, + title = {{SparseR-CNN}: End-to-End Object Detection with Learnable Proposals}, + author = {Peize Sun and Rufeng Zhang and Yi Jiang and Tao Kong and Chenfeng Xu and Wei Zhan and Masayoshi Tomizuka and Lei Li and Zehuan Yuan and Changhu Wang and Ping Luo}, + journal = {arXiv preprint arXiv:2011.12450}, + year = {2020} +} +``` diff --git a/configs/sparse_rcnn/metafile.yml b/configs/sparse_rcnn/metafile.yml new file mode 100644 index 0000000..bb1273e --- /dev/null +++ b/configs/sparse_rcnn/metafile.yml @@ -0,0 +1,80 @@ +Collections: + - Name: Sparse R-CNN + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - ResNet + - Sparse R-CNN + Paper: + URL: https://arxiv.org/abs/2011.12450 + Title: 'Sparse R-CNN: End-to-End Object Detection with Learnable Proposals' + README: configs/sparse_rcnn/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.9.0/mmdet/models/detectors/sparse_rcnn.py#L6 + Version: v2.9.0 + +Models: + - Name: sparse_rcnn_r50_fpn_1x_coco + In Collection: Sparse R-CNN + Config: configs/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco/sparse_rcnn_r50_fpn_1x_coco_20201222_214453-dc79b137.pth + + - Name: sparse_rcnn_r50_fpn_mstrain_480-800_3x_coco + In Collection: Sparse R-CNN + Config: configs/sparse_rcnn/sparse_rcnn_r50_fpn_mstrain_480-800_3x_coco.py + Metadata: + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/sparse_rcnn/sparse_rcnn_r50_fpn_mstrain_480-800_3x_coco/sparse_rcnn_r50_fpn_mstrain_480-800_3x_coco_20201218_154234-7bc5c054.pth + + - Name: sparse_rcnn_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco + In Collection: Sparse R-CNN + Config: configs/sparse_rcnn/sparse_rcnn_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py + Metadata: + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 45.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/sparse_rcnn/sparse_rcnn_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco/sparse_rcnn_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco_20201223_024605-9fe92701.pth + + - Name: sparse_rcnn_r101_fpn_mstrain_480-800_3x_coco + In Collection: Sparse R-CNN + Config: configs/sparse_rcnn/sparse_rcnn_r101_fpn_mstrain_480-800_3x_coco.py + Metadata: + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/sparse_rcnn/sparse_rcnn_r101_fpn_mstrain_480-800_3x_coco/sparse_rcnn_r101_fpn_mstrain_480-800_3x_coco_20201223_121552-6c46c9d6.pth + + - Name: sparse_rcnn_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco + In Collection: Sparse R-CNN + Config: configs/sparse_rcnn/sparse_rcnn_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py + Metadata: + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/sparse_rcnn/sparse_rcnn_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco/sparse_rcnn_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco_20201223_023452-c23c3564.pth diff --git a/configs/sparse_rcnn/sparse_rcnn_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py b/configs/sparse_rcnn/sparse_rcnn_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py new file mode 100644 index 0000000..de323bd --- /dev/null +++ b/configs/sparse_rcnn/sparse_rcnn_r101_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py @@ -0,0 +1,7 @@ +_base_ = './sparse_rcnn_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py' + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/sparse_rcnn/sparse_rcnn_r101_fpn_mstrain_480-800_3x_coco.py b/configs/sparse_rcnn/sparse_rcnn_r101_fpn_mstrain_480-800_3x_coco.py new file mode 100644 index 0000000..ab4c5f6 --- /dev/null +++ b/configs/sparse_rcnn/sparse_rcnn_r101_fpn_mstrain_480-800_3x_coco.py @@ -0,0 +1,7 @@ +_base_ = './sparse_rcnn_r50_fpn_mstrain_480-800_3x_coco.py' + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco.py b/configs/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco.py new file mode 100644 index 0000000..b383ee4 --- /dev/null +++ b/configs/sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco.py @@ -0,0 +1,95 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +num_stages = 6 +num_proposals = 100 +model = dict( + type='SparseRCNN', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=0, + add_extra_convs='on_input', + num_outs=4), + rpn_head=dict( + type='EmbeddingRPNHead', + num_proposals=num_proposals, + proposal_feature_channel=256), + roi_head=dict( + type='SparseRoIHead', + num_stages=num_stages, + stage_loss_weights=[1] * num_stages, + proposal_feature_channel=256, + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + bbox_head=[ + dict( + type='DIIHead', + num_classes=80, + num_ffn_fcs=2, + num_heads=8, + num_cls_fcs=1, + num_reg_fcs=3, + feedforward_channels=2048, + in_channels=256, + dropout=0.0, + ffn_act_cfg=dict(type='ReLU', inplace=True), + dynamic_conv_cfg=dict( + type='DynamicConv', + in_channels=256, + feat_channels=64, + out_channels=256, + input_feat_shape=7, + act_cfg=dict(type='ReLU', inplace=True), + norm_cfg=dict(type='LN')), + loss_bbox=dict(type='L1Loss', loss_weight=5.0), + loss_iou=dict(type='GIoULoss', loss_weight=2.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=2.0), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + clip_border=False, + target_means=[0., 0., 0., 0.], + target_stds=[0.5, 0.5, 1., 1.])) for _ in range(num_stages) + ]), + # training and testing settings + train_cfg=dict( + rpn=None, + rcnn=[ + dict( + assigner=dict( + type='HungarianAssigner', + cls_cost=dict(type='FocalLossCost', weight=2.0), + reg_cost=dict(type='BBoxL1Cost', weight=5.0), + iou_cost=dict(type='IoUCost', iou_mode='giou', + weight=2.0)), + sampler=dict(type='PseudoSampler'), + pos_weight=1) for _ in range(num_stages) + ]), + test_cfg=dict(rpn=None, rcnn=dict(max_per_img=num_proposals))) + +# optimizer +optimizer = dict(_delete_=True, type='AdamW', lr=0.000025, weight_decay=0.0001) +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=1, norm_type=2)) +# learning policy +lr_config = dict(policy='step', step=[8, 11]) +runner = dict(type='EpochBasedRunner', max_epochs=12) diff --git a/configs/sparse_rcnn/sparse_rcnn_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py b/configs/sparse_rcnn/sparse_rcnn_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py new file mode 100644 index 0000000..36f1d62 --- /dev/null +++ b/configs/sparse_rcnn/sparse_rcnn_r50_fpn_300_proposals_crop_mstrain_480-800_3x_coco.py @@ -0,0 +1,52 @@ +_base_ = './sparse_rcnn_r50_fpn_mstrain_480-800_3x_coco.py' +num_proposals = 300 +model = dict( + rpn_head=dict(num_proposals=num_proposals), + test_cfg=dict( + _delete_=True, rpn=None, rcnn=dict(max_per_img=num_proposals))) +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +# augmentation strategy originates from DETR. +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='AutoAugment', + policies=[[ + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), (576, 1333), + (608, 1333), (640, 1333), (672, 1333), (704, 1333), + (736, 1333), (768, 1333), (800, 1333)], + multiscale_mode='value', + keep_ratio=True) + ], + [ + dict( + type='Resize', + img_scale=[(400, 1333), (500, 1333), (600, 1333)], + multiscale_mode='value', + keep_ratio=True), + dict( + type='RandomCrop', + crop_type='absolute_range', + crop_size=(384, 600), + allow_negative_crop=True), + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + override=True, + keep_ratio=True) + ]]), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] +data = dict(train=dict(pipeline=train_pipeline)) diff --git a/configs/sparse_rcnn/sparse_rcnn_r50_fpn_mstrain_480-800_3x_coco.py b/configs/sparse_rcnn/sparse_rcnn_r50_fpn_mstrain_480-800_3x_coco.py new file mode 100644 index 0000000..2fa2a80 --- /dev/null +++ b/configs/sparse_rcnn/sparse_rcnn_r50_fpn_mstrain_480-800_3x_coco.py @@ -0,0 +1,23 @@ +_base_ = './sparse_rcnn_r50_fpn_1x_coco.py' + +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +min_values = (480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, value) for value in min_values], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] + +data = dict(train=dict(pipeline=train_pipeline)) +lr_config = dict(policy='step', step=[27, 33]) +runner = dict(type='EpochBasedRunner', max_epochs=36) diff --git a/configs/ssd/README.md b/configs/ssd/README.md new file mode 100644 index 0000000..463926b --- /dev/null +++ b/configs/ssd/README.md @@ -0,0 +1,62 @@ +# SSD + +> [SSD: Single Shot MultiBox Detector](https://arxiv.org/abs/1512.02325) + + + +## Abstract + +We present a method for detecting objects in images using a single deep neural network. Our approach, named SSD, discretizes the output space of bounding boxes into a set of default boxes over different aspect ratios and scales per feature map location. At prediction time, the network generates scores for the presence of each object category in each default box and produces adjustments to the box to better match the object shape. Additionally, the network combines predictions from multiple feature maps with different resolutions to naturally handle objects of various sizes. Our SSD model is simple relative to methods that require object proposals because it completely eliminates proposal generation and subsequent pixel or feature resampling stage and encapsulates all computation in a single network. This makes SSD easy to train and straightforward to integrate into systems that require a detection component. Experimental results on the PASCAL VOC, MS COCO, and ILSVRC datasets confirm that SSD has comparable accuracy to methods that utilize an additional object proposal step and is much faster, while providing a unified framework for both training and inference. Compared to other single stage methods, SSD has much better accuracy, even with a smaller input image size. For 300×300 input, SSD achieves 72.1% mAP on VOC2007 test at 58 FPS on a Nvidia Titan X and for 500×500 input, SSD achieves 75.1% mAP, outperforming a comparable state of the art Faster R-CNN model. + +
+ +
+ +## Results and models of SSD + +| Backbone | Size | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :------: | :--: | :---: | :-----: | :------: | :------------: | :----: | :----------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| VGG16 | 300 | caffe | 120e | 9.9 | 43.7 | 25.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ssd/ssd300_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ssd/ssd300_coco/ssd300_coco_20210803_015428-d231a06e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ssd/ssd300_coco/ssd300_coco_20210803_015428.log.json) | +| VGG16 | 512 | caffe | 120e | 19.4 | 30.7 | 29.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ssd/ssd512_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ssd/ssd512_coco/ssd512_coco_20210803_022849-0a47a1ca.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ssd/ssd512_coco/ssd512_coco_20210803_022849.log.json) | + +## Results and models of SSD-Lite + +| Backbone | Size | Training from scratch | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :---------: | :--: | :-------------------: | :-----: | :------: | :------------: | :----: | :------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| MobileNetV2 | 320 | yes | 600e | 4.0 | 69.9 | 21.3 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/ssd/ssdlite_mobilenetv2_scratch_600e_coco/ssdlite_mobilenetv2_scratch_600e_coco_20210629_110627-974d9307.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/ssd/ssdlite_mobilenetv2_scratch_600e_coco/ssdlite_mobilenetv2_scratch_600e_coco_20210629_110627.log.json) | + +## Notice + +### Compatibility + +In v2.14.0, [PR5291](https://github.com/open-mmlab/mmdetection/pull/5291) refactored SSD neck and head for more +flexible usage. If users want to use the SSD checkpoint trained in the older versions, we provide a scripts +`tools/model_converters/upgrade_ssd_version.py` to convert the model weights. + +```bash +python tools/model_converters/upgrade_ssd_version.py ${OLD_MODEL_PATH} ${NEW_MODEL_PATH} + +``` + +- OLD_MODEL_PATH: the path to load the old version SSD model. +- NEW_MODEL_PATH: the path to save the converted model weights. + +### SSD-Lite training settings + +There are some differences between our implementation of MobileNetV2 SSD-Lite and the one in [TensorFlow 1.x detection model zoo](https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf1_detection_zoo.md) . + +1. Use 320x320 as input size instead of 300x300. +2. The anchor sizes are different. +3. The C4 feature map is taken from the last layer of stage 4 instead of the middle of the block. +4. The model in TensorFlow1.x is trained on coco 2014 and validated on coco minival2014, but we trained and validated the model on coco 2017. The mAP on val2017 is usually a little lower than minival2014 (refer to the results in TensorFlow Object Detection API, e.g., MobileNetV2 SSD gets 22 mAP on minival2014 but 20.2 mAP on val2017). + +## Citation + +```latex +@article{Liu_2016, + title={SSD: Single Shot MultiBox Detector}, + journal={ECCV}, + author={Liu, Wei and Anguelov, Dragomir and Erhan, Dumitru and Szegedy, Christian and Reed, Scott and Fu, Cheng-Yang and Berg, Alexander C.}, + year={2016}, +} +``` diff --git a/configs/ssd/ascend_ssd300_coco.py b/configs/ssd/ascend_ssd300_coco.py new file mode 100644 index 0000000..25457ee --- /dev/null +++ b/configs/ssd/ascend_ssd300_coco.py @@ -0,0 +1,72 @@ +_base_ = [ + '../_base_/models/ascend_ssd300.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_2x.py', '../_base_/default_runtime.py' +] +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict(mean=[123.675, 116.28, 103.53], std=[1, 1, 1], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(300, 300), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(300, 300), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, + workers_per_gpu=3, + train=dict( + _delete_=True, + type='RepeatDataset', + times=5, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='SGD', lr=2e-3, momentum=0.9, weight_decay=5e-4) +optimizer_config = dict(_delete_=True) +custom_hooks = [ + dict(type='NumClassCheckHook'), + dict(type='CheckInvalidLossHook', interval=50, priority='VERY_LOW') +] + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/ssd/metafile.yml b/configs/ssd/metafile.yml new file mode 100644 index 0000000..b9ee79c --- /dev/null +++ b/configs/ssd/metafile.yml @@ -0,0 +1,78 @@ +Collections: + - Name: SSD + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - VGG + Paper: + URL: https://arxiv.org/abs/1512.02325 + Title: 'SSD: Single Shot MultiBox Detector' + README: configs/ssd/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.14.0/mmdet/models/dense_heads/ssd_head.py#L16 + Version: v2.14.0 + +Models: + - Name: ssd300_coco + In Collection: SSD + Config: configs/ssd/ssd300_coco.py + Metadata: + Training Memory (GB): 9.9 + inference time (ms/im): + - value: 22.88 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (300, 300) + Epochs: 120 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 25.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ssd/ssd300_coco/ssd300_coco_20210803_015428-d231a06e.pth + + - Name: ssd512_coco + In Collection: SSD + Config: configs/ssd/ssd512_coco.py + Metadata: + Training Memory (GB): 19.4 + inference time (ms/im): + - value: 32.57 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (512, 512) + Epochs: 120 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 29.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ssd/ssd512_coco/ssd512_coco_20210803_022849-0a47a1ca.pth + + - Name: ssdlite_mobilenetv2_scratch_600e_coco + In Collection: SSD + Config: configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco.py + Metadata: + Training Memory (GB): 4.0 + inference time (ms/im): + - value: 14.3 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (320, 320) + Epochs: 600 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 21.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/ssd/ssdlite_mobilenetv2_scratch_600e_coco/ssdlite_mobilenetv2_scratch_600e_coco_20210629_110627-974d9307.pth diff --git a/configs/ssd/ssd300_coco copy.py b/configs/ssd/ssd300_coco copy.py new file mode 100644 index 0000000..111737b --- /dev/null +++ b/configs/ssd/ssd300_coco copy.py @@ -0,0 +1,71 @@ +_base_ = [ + '../_base_/models/ssd300.py', '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_2x.py', '../_base_/default_runtime.py' +] +# dataset settings +dataset_type = 'CocoDataset' +data_root = '/data/dongzhiwei1/dataset/coco2017/' +img_norm_cfg = dict(mean=[123.675, 116.28, 103.53], std=[1, 1, 1], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(300, 300), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(300, 300), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=80, + workers_per_gpu=16, + train=dict( + _delete_=True, + type='RepeatDataset', + times=5, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='SGD', lr=2e-3, momentum=0.9, weight_decay=5e-4) +optimizer_config = dict(_delete_=True) +custom_hooks = [ + dict(type='NumClassCheckHook'), + dict(type='CheckInvalidLossHook', interval=800, priority='VERY_LOW') +] + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/ssd/ssd300_coco_quant_w2a2.py b/configs/ssd/ssd300_coco_quant_w2a2.py new file mode 100644 index 0000000..ff0d2a8 --- /dev/null +++ b/configs/ssd/ssd300_coco_quant_w2a2.py @@ -0,0 +1,76 @@ +_base_ = [ + '../_base_/models/ssd300.py', '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_qat_w2a2.py', '../_base_/default_runtime.py', 'ssd300_quant_general.py' +] +# dataset settings +dataset_type = 'CocoDataset' +data_root = '/data/dongzhiwei1/dataset/coco2017/' +img_norm_cfg = dict(mean=[123.675, 116.28, 103.53], std=[1, 1, 1], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(300, 300), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(300, 300), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=64, + workers_per_gpu=16, + train=dict( + _delete_=True, + type='RepeatDataset', + times=5, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +# optimizer = dict(type='SGD', lr=1e-2, momentum=0.9, weight_decay=5e-4) +optimizer_config = dict(_delete_=True) +custom_hooks = [ + dict(type='NumClassCheckHook'), + dict(type='CheckInvalidLossHook', interval=800, priority='VERY_LOW') +] + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) + +evaluation = dict(save_best='auto', interval=10, dynamic_intervals=[(11, 1)], metric='bbox') +checkpoint_config = dict(interval=9) + +load_from = '../long_used_pretrained/ssd300_coco_20210803_015428-d231a06e.pth' diff --git a/configs/ssd/ssd300_coco_quant_w4a4.py b/configs/ssd/ssd300_coco_quant_w4a4.py new file mode 100644 index 0000000..87108fc --- /dev/null +++ b/configs/ssd/ssd300_coco_quant_w4a4.py @@ -0,0 +1,76 @@ +_base_ = [ + '../_base_/models/ssd300.py', '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_qat_w4a4.py', '../_base_/default_runtime.py', 'ssd300_quant_general.py' +] +# dataset settings +dataset_type = 'CocoDataset' +data_root = '/data/dongzhiwei1/dataset/coco2017/' +img_norm_cfg = dict(mean=[123.675, 116.28, 103.53], std=[1, 1, 1], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(300, 300), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(300, 300), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=64, + workers_per_gpu=16, + train=dict( + _delete_=True, + type='RepeatDataset', + times=5, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +# optimizer = dict(type='SGD', lr=2e-3, momentum=0.9, weight_decay=5e-4) +optimizer_config = dict(_delete_=True) +custom_hooks = [ + dict(type='NumClassCheckHook'), + dict(type='CheckInvalidLossHook', interval=800, priority='VERY_LOW') +] + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) + +evaluation = dict(save_best='auto', interval=10, dynamic_intervals=[(11, 1)], metric='bbox') +checkpoint_config = dict(interval=9) + +load_from = '../long_used_pretrained/ssd300_coco_20210803_015428-d231a06e.pth' diff --git a/configs/ssd/ssd300_fp16_coco.py b/configs/ssd/ssd300_fp16_coco.py new file mode 100644 index 0000000..7c53af4 --- /dev/null +++ b/configs/ssd/ssd300_fp16_coco.py @@ -0,0 +1,9 @@ +_base_ = ['./ssd300_coco.py'] + +fp16 = dict(loss_scale='dynamic') + +# learning policy +# In order to avoid non-convergence in the early stage of +# mixed-precision training, the warmup in the lr_config is set to linear, +# warmup_iters increases and warmup_ratio decreases. +lr_config = dict(warmup='linear', warmup_iters=1000, warmup_ratio=1.0 / 10) diff --git a/configs/ssd/ssd300_quant_general.py b/configs/ssd/ssd300_quant_general.py new file mode 100644 index 0000000..4abc076 --- /dev/null +++ b/configs/ssd/ssd300_quant_general.py @@ -0,0 +1,40 @@ +trace_config = dict( + backbone_detail = dict( + input_concrete_args = dict(), + preserve_attr = ['act_cfg', 'arch_settings', 'conv_cfg', 'bn_eval', 'is_init', 'bn_frozen', 'extra_setting', 'frozen_stages', 'init_cfg', 'inplanes' + , 'out_feature_indices', 'out_indices', 'range_sub_modules', 'stage_blocks'], + not_duplicated_prefixes = [], + further_detail = dict( + exclude_prefixes = [], + removed_quantizer_names = [], + specified_general_quantizers = [], + last_8bit_module = [] + )), + neck_detail = dict( + input_concrete_args = dict(in_num = 2), + preserve_attr = ['init_cfg', 'is_init', 'l2_norm'], + not_duplicated_prefixes = [], + further_detail = dict( + exclude_prefixes = [], + removed_quantizer_names = [], + specified_general_quantizers = ['getitem_1_post_act_fake_quantizer'], + last_8bit_module = [] + )), + bbox_head_detail = dict( + input_concrete_args = dict(in_num = 6), + preserve_attr = ['simple_test', 'num_classes', 'assigner', 'bbox_coder', 'cls_focal_loss', 'cls_out_channels', 'conv_cfg', 'feat_channels', + 'fp16_enabled', 'in_channels', 'init_cfg', 'is_init', 'norm_cfg', 'num_base_priors', 'prior_generator', 'reg_decoded_bbox' + , 'sampler', 'sampling', 'stacked_convs', 'test_cfg', 'train_cfg', 'use_depthwise', 'use_sigmoid_cls', 'async_simple_test_rpn', 'aug_test', + 'aug_test_bboxes', 'aug_test_rpn', 'forward_single', 'forward_train', 'get_bboxes', 'get_targets', 'loss', 'loss_single', 'merge_aug_bboxes', + 'simple_test_bboxes', 'simple_test_rpn', '_get_bboxes_single', '_bbox_post_process', 'get_anchors', '_get_targets_single'], + not_duplicated_prefixes = [], + further_detail = dict( + # exclude_prefixes = ['cls_convs.0.0', 'cls_convs.1.0', 'cls_convs.2.0', 'cls_convs.3.0', 'cls_convs.4.0', 'cls_convs.5.0'], # 只禁用cls分支 + # exclude_prefixes = ['reg_convs.0.0', 'reg_convs.1.0', 'reg_convs.2.0', 'reg_convs.3.0', 'reg_convs.4.0', 'reg_convs.5.0'], # 只禁用reg分支 + + qloss_flag = True, + specified_general_quantizers = ['getitem_post_act_fake_quantizer', 'getitem_1_post_act_fake_quantizer', 'getitem_2_post_act_fake_quantizer' + , 'getitem_3_post_act_fake_quantizer', 'getitem_4_post_act_fake_quantizer', 'getitem_5_post_act_fake_quantizer'], + last_8bit_module = ['cls_convs.0.0', 'cls_convs.1.0', 'cls_convs.2.0', 'cls_convs.3.0', 'cls_convs.4.0' + , 'cls_convs.5.0', 'reg_convs.0.0', 'reg_convs.1.0', 'reg_convs.2.0', 'reg_convs.3.0', 'reg_convs.4.0', 'reg_convs.5.0'] + ))) \ No newline at end of file diff --git a/configs/ssd/ssd300_voc0712.py b/configs/ssd/ssd300_voc0712.py new file mode 100644 index 0000000..ae13b69 --- /dev/null +++ b/configs/ssd/ssd300_voc0712.py @@ -0,0 +1,94 @@ +_base_ = [ + '../_base_/models/ssd300_20.py', '../_base_/datasets/voc0712.py', + '../_base_/schedules/schedule_2x.py', '../_base_/default_runtime.py' +] +# dataset settings +dataset_type = 'VOCDataset' +data_root = '/workspace/share/datasets/VOC/VOCdevkit/' +classes = ('aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', + 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', + 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', + 'tvmonitor') + + +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(300, 300), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(300, 300), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=80, + workers_per_gpu=16, + train=dict( + _delete_=True, + type='RepeatDataset', + times=5, + dataset=dict( + type=dataset_type, + ann_file=[ + data_root + 'VOC2007/ImageSets/Main/trainval.txt', + data_root + 'VOC2012/ImageSets/Main/trainval.txt' + ], + img_prefix=[data_root + 'VOC2007/', data_root + 'VOC2012/'], + pipeline=train_pipeline)), + val=dict( + type='CocoDataset', + ann_file=data_root + 'coco_format/voc07_test.json', # 注意这里走的是COCO格式 + img_prefix=data_root, + classes=classes, + pipeline=test_pipeline), + test=dict( + type='CocoDataset', + ann_file=data_root + 'coco_format/voc07_test.json', + img_prefix=data_root, + classes=classes, + pipeline=test_pipeline)) +# optimizer +# optimizer = dict(type='SGD', lr=2e-3, momentum=0.9, weight_decay=5e-4) +optimizer_config = dict(_delete_=True) +custom_hooks = [ + dict(type='NumClassCheckHook'), + dict(type='CheckInvalidLossHook', interval=800, priority='VERY_LOW') +] + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) + +# evaluation = dict(interval=1, metric='mAP') # 这个只有AP50,或者叫mAP +evaluation = dict(save_best='auto', interval=1, metric='bbox') diff --git a/configs/ssd/ssd300_voc0712_harmony.py b/configs/ssd/ssd300_voc0712_harmony.py new file mode 100644 index 0000000..338c8b9 --- /dev/null +++ b/configs/ssd/ssd300_voc0712_harmony.py @@ -0,0 +1,95 @@ +_base_ = [ + '../_base_/models/ssd300_20.py', '../_base_/datasets/voc0712.py', + '../_base_/schedules/schedule_fp32_fine_tune_general.py', '../_base_/default_runtime.py' +] +# dataset settings +dataset_type = 'VOCDataset' +data_root = '/workspace/share/datasets/VOC/VOCdevkit/' +classes = ('aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', + 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', + 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', + 'tvmonitor') + + +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(300, 300), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(300, 300), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=16, + workers_per_gpu=8, + train=dict( + _delete_=True, + type='RepeatDataset', + times=5, + dataset=dict( + type=dataset_type, + ann_file=[ + data_root + 'VOC2007/ImageSets/Main/trainval.txt', + data_root + 'VOC2012/ImageSets/Main/trainval.txt' + ], + img_prefix=[data_root + 'VOC2007/', data_root + 'VOC2012/'], + pipeline=train_pipeline)), + val=dict( + type='CocoDataset', + ann_file=data_root + 'coco_format/voc07_test.json', # 注意这里走的是COCO格式 + img_prefix=data_root, + classes=classes, + pipeline=test_pipeline), + test=dict( + type='CocoDataset', + ann_file=data_root + 'coco_format/voc07_test.json', + img_prefix=data_root, + classes=classes, + pipeline=test_pipeline)) +# optimizer +# optimizer = dict(type='SGD', lr=2e-3, momentum=0.9, weight_decay=5e-4) +optimizer_config = dict(_delete_=True) +custom_hooks = [ + dict(type='NumClassCheckHook'), + dict(type='CheckInvalidLossHook', interval=800, priority='VERY_LOW') +] + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) +checkpoint_config = dict(interval=10) +# evaluation = dict(interval=1, metric='mAP') # 这个只有AP50,或者叫mAP +evaluation = dict(save_best='auto', interval=1, metric='bbox') +load_from = '/workspace/share/long_dir/ssd300_voc0712/epoch_23.pth' diff --git a/configs/ssd/ssd300_voc0712_quant_w4a4.py b/configs/ssd/ssd300_voc0712_quant_w4a4.py new file mode 100644 index 0000000..d64dc34 --- /dev/null +++ b/configs/ssd/ssd300_voc0712_quant_w4a4.py @@ -0,0 +1,94 @@ +_base_ = [ + '../_base_/models/ssd300_20.py', '../_base_/datasets/voc0712.py', + '../_base_/schedules/schedule_qat_w4a4.py', '../_base_/default_runtime.py', 'ssd300_quant_general.py' +] +# dataset settings +dataset_type = 'VOCDataset' +data_root = '/workspace/share/datasets/VOC/VOCdevkit/' +classes = ('aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', + 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', + 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', + 'tvmonitor') +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(300, 300), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(300, 300), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=48, + workers_per_gpu=8, + train=dict( + _delete_=True, + type='RepeatDataset', + times=5, + dataset=dict( + type=dataset_type, + ann_file=[ + data_root + 'VOC2007/ImageSets/Main/trainval.txt', + data_root + 'VOC2012/ImageSets/Main/trainval.txt' + ], + img_prefix=[data_root + 'VOC2007/', data_root + 'VOC2012/'], + pipeline=train_pipeline)), + val=dict( + type='CocoDataset', + ann_file=data_root + 'coco_format/voc07_test.json', # 注意这里走的是COCO格式 + img_prefix=data_root, + classes=classes, + pipeline=test_pipeline), + test=dict( + type='CocoDataset', + ann_file=data_root + 'coco_format/voc07_test.json', + img_prefix=data_root, + classes=classes, + pipeline=test_pipeline)) +# optimizer +# optimizer = dict(type='SGD', lr=2e-3, momentum=0.9, weight_decay=5e-4) +optimizer_config = dict(_delete_=True) +custom_hooks = [ + dict(type='NumClassCheckHook'), + dict(type='CheckInvalidLossHook', interval=800, priority='VERY_LOW') +] + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) + +# evaluation = dict(interval=1, metric='mAP') # 这个只有AP50,或者叫mAP +evaluation = dict(save_best='auto', interval=1, metric='bbox') +checkpoint_config = dict(interval=10) +load_from = '/workspace/share/long_dir/ssd300_voc0712/epoch_23.pth' diff --git a/configs/ssd/ssd512_coco.py b/configs/ssd/ssd512_coco.py new file mode 100644 index 0000000..117777f --- /dev/null +++ b/configs/ssd/ssd512_coco.py @@ -0,0 +1,84 @@ +_base_ = 'ssd300_coco.py' +input_size = 512 +model = dict( + neck=dict( + out_channels=(512, 1024, 512, 256, 256, 256, 256), + level_strides=(2, 2, 2, 2, 1), + level_paddings=(1, 1, 1, 1, 1), + last_kernel_size=4), + bbox_head=dict( + in_channels=(512, 1024, 512, 256, 256, 256, 256), + anchor_generator=dict( + type='SSDAnchorGenerator', + scale_major=False, + input_size=input_size, + basesize_ratio_range=(0.1, 0.9), + strides=[8, 16, 32, 64, 128, 256, 512], + ratios=[[2], [2, 3], [2, 3], [2, 3], [2, 3], [2], [2]]))) +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict(mean=[123.675, 116.28, 103.53], std=[1, 1, 1], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(512, 512), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(512, 512), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, + workers_per_gpu=3, + train=dict( + _delete_=True, + type='RepeatDataset', + times=5, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='SGD', lr=2e-3, momentum=0.9, weight_decay=5e-4) +optimizer_config = dict(_delete_=True) +custom_hooks = [ + dict(type='NumClassCheckHook'), + dict(type='CheckInvalidLossHook', interval=50, priority='VERY_LOW') +] + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/ssd/ssd512_fp16_coco.py b/configs/ssd/ssd512_fp16_coco.py new file mode 100644 index 0000000..a74434e --- /dev/null +++ b/configs/ssd/ssd512_fp16_coco.py @@ -0,0 +1,9 @@ +_base_ = ['./ssd512_coco.py'] +# fp16 settings +fp16 = dict(loss_scale='dynamic') + +# learning policy +# In order to avoid non-convergence in the early stage of +# mixed-precision training, the warmup in the lr_config is set to linear, +# warmup_iters increases and warmup_ratio decreases. +lr_config = dict(warmup='linear', warmup_iters=1000, warmup_ratio=1.0 / 10) diff --git a/configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco.py b/configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco.py new file mode 100644 index 0000000..5eb6b03 --- /dev/null +++ b/configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco.py @@ -0,0 +1,150 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', '../_base_/default_runtime.py' +] + +model = dict( + type='SingleStageDetector', + backbone=dict( + type='MobileNetV2', + out_indices=(4, 7), + norm_cfg=dict(type='BN', eps=0.001, momentum=0.03), + init_cfg=dict(type='TruncNormal', layer='Conv2d', std=0.03)), + neck=dict( + type='SSDNeck', + in_channels=(96, 1280), + out_channels=(96, 1280, 512, 256, 256, 128), + level_strides=(2, 2, 2, 2), + level_paddings=(1, 1, 1, 1), + l2_norm_scale=None, + use_depthwise=True, + norm_cfg=dict(type='BN', eps=0.001, momentum=0.03), + act_cfg=dict(type='ReLU6'), + init_cfg=dict(type='TruncNormal', layer='Conv2d', std=0.03)), + bbox_head=dict( + type='SSDHead', + in_channels=(96, 1280, 512, 256, 256, 128), + num_classes=80, + use_depthwise=True, + norm_cfg=dict(type='BN', eps=0.001, momentum=0.03), + act_cfg=dict(type='ReLU6'), + init_cfg=dict(type='Normal', layer='Conv2d', std=0.001), + + # set anchor size manually instead of using the predefined + # SSD300 setting. + anchor_generator=dict( + type='SSDAnchorGenerator', + scale_major=False, + strides=[16, 32, 64, 107, 160, 320], + ratios=[[2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3]], + min_sizes=[48, 100, 150, 202, 253, 304], + max_sizes=[100, 150, 202, 253, 304, 320]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2])), + # model training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0., + ignore_iof_thr=-1, + gt_max_assign_all=False), + smoothl1_beta=1., + allowed_border=-1, + pos_weight=-1, + neg_pos_ratio=3, + debug=False), + test_cfg=dict( + nms_pre=1000, + nms=dict(type='nms', iou_threshold=0.45), + min_bbox_size=0, + score_thr=0.02, + max_per_img=200)) +# cudnn_benchmark = True + +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(320, 320), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=320), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(320, 320), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=320), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=24, + workers_per_gpu=4, + train=dict( + _delete_=True, + type='RepeatDataset', # use RepeatDataset to speed up training + times=5, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) + +# optimizer +optimizer = dict(type='SGD', lr=0.015, momentum=0.9, weight_decay=4.0e-5) +optimizer_config = dict(grad_clip=None) + +# learning policy +lr_config = dict( + policy='CosineAnnealing', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + min_lr=0) +runner = dict(type='EpochBasedRunner', max_epochs=120) + +# Avoid evaluation and saving weights too frequently +evaluation = dict(interval=5, metric='bbox') +checkpoint_config = dict(interval=10) +custom_hooks = [ + dict(type='NumClassCheckHook'), + dict(type='CheckInvalidLossHook', interval=50, priority='VERY_LOW') +] + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (24 samples per GPU) +auto_scale_lr = dict(base_batch_size=192) diff --git a/configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco_quant_w4a4.py b/configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco_quant_w4a4.py new file mode 100644 index 0000000..59f4310 --- /dev/null +++ b/configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco_quant_w4a4.py @@ -0,0 +1,152 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', '../_base_/default_runtime.py', '../_base_/schedules/schedule_qat_w4a4.py' + , 'ssd300_quant_general.py' +] + +model = dict( + type='SingleStageDetector', + backbone=dict( + type='MobileNetV2', + out_indices=(4, 7), + norm_cfg=dict(type='BN', eps=0.001, momentum=0.03), + init_cfg=dict(type='TruncNormal', layer='Conv2d', std=0.03)), + neck=dict( + type='SSDNeck', + in_channels=(96, 1280), + out_channels=(96, 1280, 512, 256, 256, 128), + level_strides=(2, 2, 2, 2), + level_paddings=(1, 1, 1, 1), + l2_norm_scale=None, + use_depthwise=True, + norm_cfg=dict(type='BN', eps=0.001, momentum=0.03), + act_cfg=dict(type='ReLU6'), + init_cfg=dict(type='TruncNormal', layer='Conv2d', std=0.03)), + bbox_head=dict( + type='SSDHead', + in_channels=(96, 1280, 512, 256, 256, 128), + num_classes=80, + use_depthwise=True, + norm_cfg=dict(type='BN', eps=0.001, momentum=0.03), + act_cfg=dict(type='ReLU6'), + init_cfg=dict(type='Normal', layer='Conv2d', std=0.001), + + # set anchor size manually instead of using the predefined + # SSD300 setting. + anchor_generator=dict( + type='SSDAnchorGenerator', + scale_major=False, + strides=[16, 32, 64, 107, 160, 320], + ratios=[[2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3]], + min_sizes=[48, 100, 150, 202, 253, 304], + max_sizes=[100, 150, 202, 253, 304, 320]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2])), + # model training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0., + ignore_iof_thr=-1, + gt_max_assign_all=False), + smoothl1_beta=1., + allowed_border=-1, + pos_weight=-1, + neg_pos_ratio=3, + debug=False), + test_cfg=dict( + nms_pre=1000, + nms=dict(type='nms', iou_threshold=0.45), + min_bbox_size=0, + score_thr=0.02, + max_per_img=200)) +# cudnn_benchmark = True + +# dataset settings +dataset_type = 'CocoDataset' +data_root = '/data/dongzhiwei1/dataset/coco2017/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(320, 320), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=320), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(320, 320), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=320), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=40, + workers_per_gpu=8, + train=dict( + _delete_=True, + type='RepeatDataset', # use RepeatDataset to speed up training + times=2, # repeat,相当于训了好几次 + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) + +# optimizer +# optimizer = dict(type='SGD', lr=0.015, momentum=0.9, weight_decay=4.0e-5) +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) + +# # learning policy +# lr_config = dict( +# policy='CosineAnnealing', +# warmup='linear', +# warmup_iters=500, +# warmup_ratio=0.001, +# min_lr=0) +# runner = dict(type='EpochBasedRunner', max_epochs=120) + +# Avoid evaluation and saving weights too frequently +evaluation = dict(save_best='auto', interval=10, dynamic_intervals=[(11, 1)], metric='bbox') +checkpoint_config = dict(interval=9) +custom_hooks = [ + dict(type='NumClassCheckHook'), + dict(type='CheckInvalidLossHook', interval=50, priority='VERY_LOW') +] + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (24 samples per GPU) +auto_scale_lr = dict(base_batch_size=192) +load_from = '../long_used_pretrained/ssdlite_mobilenetv2_scratch_600e_coco_20210629_110627-974d9307.pth' diff --git a/configs/ssd/ssdlite_mobilenetv2_scratch_600e_voc.py b/configs/ssd/ssdlite_mobilenetv2_scratch_600e_voc.py new file mode 100644 index 0000000..5cf49b7 --- /dev/null +++ b/configs/ssd/ssdlite_mobilenetv2_scratch_600e_voc.py @@ -0,0 +1,168 @@ +_base_ = [ + '../_base_/datasets/voc0712.py', '../_base_/default_runtime.py' +] + +model = dict( + type='SingleStageDetector', + backbone=dict( + type='MobileNetV2', + out_indices=(4, 7), + norm_cfg=dict(type='BN', eps=0.001, momentum=0.03), + init_cfg=dict(type='TruncNormal', layer='Conv2d', std=0.03)), + neck=dict( + type='SSDNeck', + in_channels=(96, 1280), + out_channels=(96, 1280, 512, 256, 256, 128), + level_strides=(2, 2, 2, 2), + level_paddings=(1, 1, 1, 1), + l2_norm_scale=None, + use_depthwise=True, + norm_cfg=dict(type='BN', eps=0.001, momentum=0.03), + act_cfg=dict(type='ReLU6'), + init_cfg=dict(type='TruncNormal', layer='Conv2d', std=0.03)), + bbox_head=dict( + type='SSDHead', + in_channels=(96, 1280, 512, 256, 256, 128), + num_classes=20, + use_depthwise=True, + norm_cfg=dict(type='BN', eps=0.001, momentum=0.03), + act_cfg=dict(type='ReLU6'), + init_cfg=dict(type='Normal', layer='Conv2d', std=0.001), + + # set anchor size manually instead of using the predefined + # SSD300 setting. + anchor_generator=dict( + type='SSDAnchorGenerator', + scale_major=False, + strides=[16, 32, 64, 107, 160, 320], + ratios=[[2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3]], + min_sizes=[48, 100, 150, 202, 253, 304], + max_sizes=[100, 150, 202, 253, 304, 320]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2])), + # model training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0., + ignore_iof_thr=-1, + gt_max_assign_all=False), + smoothl1_beta=1., + allowed_border=-1, + pos_weight=-1, + neg_pos_ratio=3, + debug=False), + test_cfg=dict( + nms_pre=1000, + nms=dict(type='nms', iou_threshold=0.45), + min_bbox_size=0, + score_thr=0.02, + max_per_img=200)) +# cudnn_benchmark = True + +# dataset settings +dataset_type = 'VOCDataset' +data_root = '/workspace/share/datasets/VOC/VOCdevkit/' +classes = ('aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', + 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', + 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', + 'tvmonitor') +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(320, 320), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=320), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(320, 320), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=320), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=120, + workers_per_gpu=24, + train=dict( + _delete_=True, + type='RepeatDataset', # use RepeatDataset to speed up training + times=5, + dataset=dict( + type=dataset_type, + ann_file=[ + data_root + 'VOC2007/ImageSets/Main/trainval.txt', + data_root + 'VOC2012/ImageSets/Main/trainval.txt' + ], + img_prefix=[data_root + 'VOC2007/', data_root + 'VOC2012/'], + pipeline=train_pipeline)), + val=dict( + type='CocoDataset', + ann_file=data_root + 'coco_format/voc07_test.json', # 注意这里走的是COCO格式 + img_prefix=data_root, + classes=classes, + pipeline=test_pipeline), + test=dict( + type='CocoDataset', + ann_file=data_root + 'coco_format/voc07_test.json', + img_prefix=data_root, + classes=classes, + pipeline=test_pipeline)) + +# optimizer +optimizer = dict(type='SGD', lr=0.015, momentum=0.9, weight_decay=4.0e-5) +optimizer_config = dict(grad_clip=None) + +# learning policy +lr_config = dict( + policy='CosineAnnealing', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + min_lr=0) +runner = dict(type='EpochBasedRunner', max_epochs=30) + +# Avoid evaluation and saving weights too frequently +evaluation = dict(save_best='auto', interval=1, metric='bbox') +checkpoint_config = dict(interval=10) +custom_hooks = [ + dict(type='NumClassCheckHook'), + dict(type='CheckInvalidLossHook', interval=50, priority='VERY_LOW') +] + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (24 samples per GPU) +auto_scale_lr = dict(base_batch_size=192) +# load_from = '../long_used_pretrained/ssdlite_mobilenetv2_scratch_600e_coco_20210629_110627-974d9307.pth' diff --git a/configs/ssd/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4.py b/configs/ssd/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4.py new file mode 100644 index 0000000..86048f0 --- /dev/null +++ b/configs/ssd/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4.py @@ -0,0 +1,169 @@ +_base_ = [ + '../_base_/datasets/voc0712.py', '../_base_/default_runtime.py', '../_base_/schedules/schedule_qat_w4a4.py' + , 'ssdlite_quant_general.py' +] + +model = dict( + type='SingleStageDetector', + backbone=dict( + type='MobileNetV2', + out_indices=(4, 7), + norm_cfg=dict(type='BN', eps=0.001, momentum=0.03), + init_cfg=dict(type='TruncNormal', layer='Conv2d', std=0.03)), + neck=dict( + type='SSDNeck', + in_channels=(96, 1280), + out_channels=(96, 1280, 512, 256, 256, 128), + level_strides=(2, 2, 2, 2), + level_paddings=(1, 1, 1, 1), + l2_norm_scale=None, + use_depthwise=True, + norm_cfg=dict(type='BN', eps=0.001, momentum=0.03), + act_cfg=dict(type='ReLU6'), + init_cfg=dict(type='TruncNormal', layer='Conv2d', std=0.03)), + bbox_head=dict( + type='SSDHead', + in_channels=(96, 1280, 512, 256, 256, 128), + num_classes=20, + use_depthwise=True, + norm_cfg=dict(type='BN', eps=0.001, momentum=0.03), + act_cfg=dict(type='ReLU6'), + init_cfg=dict(type='Normal', layer='Conv2d', std=0.001), + + # set anchor size manually instead of using the predefined + # SSD300 setting. + anchor_generator=dict( + type='SSDAnchorGenerator', + scale_major=False, + strides=[16, 32, 64, 107, 160, 320], + ratios=[[2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3]], + min_sizes=[48, 100, 150, 202, 253, 304], + max_sizes=[100, 150, 202, 253, 304, 320]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2])), + # model training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0., + ignore_iof_thr=-1, + gt_max_assign_all=False), + smoothl1_beta=1., + allowed_border=-1, + pos_weight=-1, + neg_pos_ratio=3, + debug=False), + test_cfg=dict( + nms_pre=1000, + nms=dict(type='nms', iou_threshold=0.45), + min_bbox_size=0, + score_thr=0.02, + max_per_img=200)) +# cudnn_benchmark = True + +# dataset settings +dataset_type = 'VOCDataset' +data_root = '/workspace/share/datasets/VOC/VOCdevkit/' +classes = ('aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', + 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', + 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', + 'tvmonitor') +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(320, 320), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=320), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(320, 320), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=320), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=80, + workers_per_gpu=16, + train=dict( + _delete_=True, + type='RepeatDataset', # use RepeatDataset to speed up training + times=5, + dataset=dict( + type=dataset_type, + ann_file=[ + data_root + 'VOC2007/ImageSets/Main/trainval.txt', + data_root + 'VOC2012/ImageSets/Main/trainval.txt' + ], + img_prefix=[data_root + 'VOC2007/', data_root + 'VOC2012/'], + pipeline=train_pipeline)), + val=dict( + type='CocoDataset', + ann_file=data_root + 'coco_format/voc07_test.json', # 注意这里走的是COCO格式 + img_prefix=data_root, + classes=classes, + pipeline=test_pipeline), + test=dict( + type='CocoDataset', + ann_file=data_root + 'coco_format/voc07_test.json', + img_prefix=data_root, + classes=classes, + pipeline=test_pipeline)) + +# optimizer +# optimizer = dict(type='SGD', lr=0.015, momentum=0.9, weight_decay=4.0e-5) +optimizer_config = dict(grad_clip=None) + +# # learning policy +# lr_config = dict( +# policy='CosineAnnealing', +# warmup='linear', +# warmup_iters=500, +# warmup_ratio=0.001, +# min_lr=0) +# runner = dict(type='EpochBasedRunner', max_epochs=120) + +# Avoid evaluation and saving weights too frequently +evaluation = dict(save_best='auto', interval=1, metric='bbox') +checkpoint_config = dict(interval=10) +custom_hooks = [ + dict(type='NumClassCheckHook'), + dict(type='CheckInvalidLossHook', interval=200, priority='VERY_LOW') +] + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (24 samples per GPU) +auto_scale_lr = dict(base_batch_size=192) +load_from = '/workspace/share/long_dir/ssdlite_mobilenetv2_scratch_600e_voc/best_bbox_mAP_epoch_30.pth' diff --git a/configs/ssd/ssdlite_quant_general.py b/configs/ssd/ssdlite_quant_general.py new file mode 100644 index 0000000..5ed7516 --- /dev/null +++ b/configs/ssd/ssdlite_quant_general.py @@ -0,0 +1,40 @@ +trace_config = dict( + backbone_detail = dict( + input_concrete_args = dict(), + preserve_attr = ['act_cfg', 'arch_settings', 'conv_cfg', 'bn_eval', 'is_init', 'bn_frozen', 'extra_setting', 'frozen_stages', 'init_cfg', 'inplanes' + , 'out_feature_indices', 'out_indices', 'range_sub_modules', 'stage_blocks'], + not_duplicated_prefixes = [], + further_detail = dict( + exclude_prefixes = [], + removed_quantizer_names = [], + specified_general_quantizers = [], + last_8bit_module = [] + )), + neck_detail = dict( + input_concrete_args = dict(in_num = 2), + preserve_attr = ['init_cfg', 'is_init', 'l2_norm'], + not_duplicated_prefixes = [], + further_detail = dict( + exclude_prefixes = [], + removed_quantizer_names = ['getitem_0_post_act_fake_quantizer'], + specified_general_quantizers = ['getitem_1_post_act_fake_quantizer'], # 0号有负 + last_8bit_module = [] + )), + bbox_head_detail = dict( + input_concrete_args = dict(in_num = 6), + preserve_attr = ['simple_test', 'num_classes', 'assigner', 'bbox_coder', 'cls_focal_loss', 'cls_out_channels', 'conv_cfg', 'feat_channels', + 'fp16_enabled', 'in_channels', 'init_cfg', 'is_init', 'norm_cfg', 'num_base_priors', 'prior_generator', 'reg_decoded_bbox' + , 'sampler', 'sampling', 'stacked_convs', 'test_cfg', 'train_cfg', 'use_depthwise', 'use_sigmoid_cls', 'async_simple_test_rpn', 'aug_test', + 'aug_test_bboxes', 'aug_test_rpn', 'forward_single', 'forward_train', 'get_bboxes', 'get_targets', 'loss', 'loss_single', 'merge_aug_bboxes', + 'simple_test_bboxes', 'simple_test_rpn', '_get_bboxes_single', '_bbox_post_process', 'get_anchors', '_get_targets_single'], + not_duplicated_prefixes = [], + further_detail = dict( + exclude_prefixes = [], + removed_quantizer_names = ['getitem_post_act_fake_quantizer','getitem_1_post_act_fake_quantizer','getitem_2_post_act_fake_quantizer','getitem_3_post_act_fake_quantizer','getitem_4_post_act_fake_quantizer'], + qloss_flag = True, + # specified_general_quantizers = ['getitem_post_act_fake_quantizer', 'getitem_1_post_act_fake_quantizer', 'getitem_2_post_act_fake_quantizer' + # , 'getitem_3_post_act_fake_quantizer', 'getitem_4_post_act_fake_quantizer', 'getitem_5_post_act_fake_quantizer'], + specified_general_quantizers = ['getitem_5_post_act_fake_quantizer'], # 0号有负的 + last_8bit_module = ['cls_convs.0.1', 'cls_convs.1.1', 'cls_convs.2.1', 'cls_convs.3.1', 'cls_convs.4.1' + , 'cls_convs.5.1', 'reg_convs.0.1', 'reg_convs.1.1', 'reg_convs.2.1', 'reg_convs.3.1', 'reg_convs.4.1', 'reg_convs.5.1'] # fold不会影响 似乎 + ))) \ No newline at end of file diff --git a/configs/strong_baselines/README.md b/configs/strong_baselines/README.md new file mode 100644 index 0000000..aa2550d --- /dev/null +++ b/configs/strong_baselines/README.md @@ -0,0 +1,20 @@ +# Strong Baselines + + + +We train Mask R-CNN with large-scale jitter and longer schedule as strong baselines. +The modifications follow those in [Detectron2](https://github.com/facebookresearch/detectron2/tree/master/configs/new_baselines). + +## Results and Models + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :------: | :-----: | :-----: | :------: | :------------: | :----: | :-----: | :-----------------------------------------------------------------------: | :----------------------: | +| R-50-FPN | pytorch | 50e | | | | | [config](./mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_lsj_50e_coco.py) | [model](<>) \| [log](<>) | +| R-50-FPN | pytorch | 100e | | | | | [config](./mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_lsj_100e_coco.py) | [model](<>) \| [log](<>) | +| R-50-FPN | caffe | 100e | | | 44.7 | 40.4 | [config](./mask_rcnn_r50_caffe_fpn_syncbn-all_rpn-2conv_lsj_100e_coco.py) | [model](<>) \| [log](<>) | +| R-50-FPN | caffe | 400e | | | | | [config](./mask_rcnn_r50_caffe_fpn_syncbn-all_rpn-2conv_lsj_400e_coco.py) | [model](<>) \| [log](<>) | + +## Notice + +When using large-scale jittering, there are sometimes empty proposals in the box and mask heads during training. +This requires MMSyncBN that allows empty tensors. Therefore, please use mmcv-full>=1.3.14 to train models supported in this directory. diff --git a/configs/strong_baselines/mask_rcnn_r50_caffe_fpn_syncbn-all_rpn-2conv_lsj_100e_coco.py b/configs/strong_baselines/mask_rcnn_r50_caffe_fpn_syncbn-all_rpn-2conv_lsj_100e_coco.py new file mode 100644 index 0000000..a40d6a0 --- /dev/null +++ b/configs/strong_baselines/mask_rcnn_r50_caffe_fpn_syncbn-all_rpn-2conv_lsj_100e_coco.py @@ -0,0 +1,80 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../common/lsj_100e_coco_instance.py' +] + +norm_cfg = dict(type='SyncBN', requires_grad=True) +# Use MMSyncBN that handles empty tensor in head. It can be changed to +# SyncBN after https://github.com/pytorch/pytorch/issues/36530 is fixed +# Requires MMCV-full after https://github.com/open-mmlab/mmcv/pull/1205. +head_norm_cfg = dict(type='MMSyncBN', requires_grad=True) +model = dict( + backbone=dict( + frozen_stages=-1, + norm_eval=False, + norm_cfg=norm_cfg, + init_cfg=None, + style='caffe'), + neck=dict(norm_cfg=norm_cfg), + rpn_head=dict(num_convs=2), + roi_head=dict( + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + conv_out_channels=256, + norm_cfg=head_norm_cfg), + mask_head=dict(norm_cfg=head_norm_cfg))) + +file_client_args = dict(backend='disk') +# file_client_args = dict( +# backend='petrel', +# path_mapping=dict({ +# './data/': 's3://openmmlab/datasets/detection/', +# 'data/': 's3://openmmlab/datasets/detection/' +# })) + +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +image_size = (1024, 1024) +train_pipeline = [ + dict(type='LoadImageFromFile', file_client_args=file_client_args), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=image_size, + ratio_range=(0.1, 2.0), + multiscale_mode='range', + keep_ratio=True), + dict( + type='RandomCrop', + crop_type='absolute_range', + crop_size=image_size, + recompute_bbox=True, + allow_negative_crop=True), + dict(type='FilterAnnotations', min_gt_bbox_wh=(1e-2, 1e-2)), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size=image_size), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile', file_client_args=file_client_args), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] + +# Use RepeatDataset to speed up training +data = dict( + train=dict(dataset=dict(pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/strong_baselines/mask_rcnn_r50_caffe_fpn_syncbn-all_rpn-2conv_lsj_100e_fp16_coco.py b/configs/strong_baselines/mask_rcnn_r50_caffe_fpn_syncbn-all_rpn-2conv_lsj_100e_fp16_coco.py new file mode 100644 index 0000000..31824eb --- /dev/null +++ b/configs/strong_baselines/mask_rcnn_r50_caffe_fpn_syncbn-all_rpn-2conv_lsj_100e_fp16_coco.py @@ -0,0 +1,2 @@ +_base_ = 'mask_rcnn_r50_caffe_fpn_syncbn-all_rpn-2conv_lsj_100e_coco.py' +fp16 = dict(loss_scale=512.) diff --git a/configs/strong_baselines/mask_rcnn_r50_caffe_fpn_syncbn-all_rpn-2conv_lsj_400e_coco.py b/configs/strong_baselines/mask_rcnn_r50_caffe_fpn_syncbn-all_rpn-2conv_lsj_400e_coco.py new file mode 100644 index 0000000..1211925 --- /dev/null +++ b/configs/strong_baselines/mask_rcnn_r50_caffe_fpn_syncbn-all_rpn-2conv_lsj_400e_coco.py @@ -0,0 +1,6 @@ +_base_ = './mask_rcnn_r50_caffe_fpn_syncbn-all_rpn-2conv_lsj_100e_coco.py' + +# Use RepeatDataset to speed up training +# change repeat time from 4 (for 100 epochs) to 16 (for 400 epochs) +data = dict(train=dict(times=4 * 4)) +lr_config = dict(warmup_iters=500 * 4) diff --git a/configs/strong_baselines/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_lsj_100e_coco.py b/configs/strong_baselines/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_lsj_100e_coco.py new file mode 100644 index 0000000..4a15d69 --- /dev/null +++ b/configs/strong_baselines/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_lsj_100e_coco.py @@ -0,0 +1,22 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../common/lsj_100e_coco_instance.py' +] + +norm_cfg = dict(type='SyncBN', requires_grad=True) +# Use MMSyncBN that handles empty tensor in head. It can be changed to +# SyncBN after https://github.com/pytorch/pytorch/issues/36530 is fixed +# Requires MMCV-full after https://github.com/open-mmlab/mmcv/pull/1205. +head_norm_cfg = dict(type='MMSyncBN', requires_grad=True) +model = dict( + # the model is trained from scratch, so init_cfg is None + backbone=dict( + frozen_stages=-1, norm_eval=False, norm_cfg=norm_cfg, init_cfg=None), + neck=dict(norm_cfg=norm_cfg), + rpn_head=dict(num_convs=2), # leads to 0.1+ mAP + roi_head=dict( + bbox_head=dict( + type='Shared4Conv1FCBBoxHead', + conv_out_channels=256, + norm_cfg=head_norm_cfg), + mask_head=dict(norm_cfg=head_norm_cfg))) diff --git a/configs/strong_baselines/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_lsj_100e_fp16_coco.py b/configs/strong_baselines/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_lsj_100e_fp16_coco.py new file mode 100644 index 0000000..7b97960 --- /dev/null +++ b/configs/strong_baselines/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_lsj_100e_fp16_coco.py @@ -0,0 +1,3 @@ +_base_ = 'mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_lsj_100e_coco.py' +# use FP16 +fp16 = dict(loss_scale=512.) diff --git a/configs/strong_baselines/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_lsj_50e_coco.py b/configs/strong_baselines/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_lsj_50e_coco.py new file mode 100644 index 0000000..922579a --- /dev/null +++ b/configs/strong_baselines/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_lsj_50e_coco.py @@ -0,0 +1,5 @@ +_base_ = 'mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_lsj_100e_coco.py' + +# Use RepeatDataset to speed up training +# change repeat time from 4 (for 100 epochs) to 2 (for 50 epochs) +data = dict(train=dict(times=2)) diff --git a/configs/swin/README.md b/configs/swin/README.md new file mode 100644 index 0000000..2136134 --- /dev/null +++ b/configs/swin/README.md @@ -0,0 +1,41 @@ +# Swin + +> [Swin Transformer: Hierarchical Vision Transformer using Shifted Windows](https://arxiv.org/abs/2103.14030) + + + +## Abstract + +This paper presents a new vision Transformer, called Swin Transformer, that capably serves as a general-purpose backbone for computer vision. Challenges in adapting Transformer from language to vision arise from differences between the two domains, such as large variations in the scale of visual entities and the high resolution of pixels in images compared to words in text. To address these differences, we propose a hierarchical Transformer whose representation is computed with Shifted windows. The shifted windowing scheme brings greater efficiency by limiting self-attention computation to non-overlapping local windows while also allowing for cross-window connection. This hierarchical architecture has the flexibility to model at various scales and has linear computational complexity with respect to image size. These qualities of Swin Transformer make it compatible with a broad range of vision tasks, including image classification (87.3 top-1 accuracy on ImageNet-1K) and dense prediction tasks such as object detection (58.7 box AP and 51.1 mask AP on COCO test-dev) and semantic segmentation (53.5 mIoU on ADE20K val). Its performance surpasses the previous state-of-the-art by a large margin of +2.7 box AP and +2.6 mask AP on COCO, and +3.2 mIoU on ADE20K, demonstrating the potential of Transformer-based models as vision backbones. The hierarchical design and the shifted window approach also prove beneficial for all-MLP architectures. + +
+ +
+ +## Results and Models + +### Mask R-CNN + +| Backbone | Pretrain | Lr schd | Multi-scale crop | FP16 | Mem (GB) | Inf time (fps) | box AP | mask AP | Config | Download | +| :------: | :---------: | :-----: | :--------------: | :--: | :------: | :------------: | :----: | :-----: | :------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| Swin-T | ImageNet-1K | 1x | no | no | 7.6 | | 42.7 | 39.3 | [config](./mask_rcnn_swin-t-p4-w7_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/swin/mask_rcnn_swin-t-p4-w7_fpn_1x_coco/mask_rcnn_swin-t-p4-w7_fpn_1x_coco_20210902_120937-9d6b7cfa.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/swin/mask_rcnn_swin-t-p4-w7_fpn_1x_coco/mask_rcnn_swin-t-p4-w7_fpn_1x_coco_20210902_120937.log.json) | +| Swin-T | ImageNet-1K | 3x | yes | no | 10.2 | | 46.0 | 41.6 | [config](./mask_rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/swin/mask_rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco/mask_rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco_20210906_131725-bacf6f7b.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/swin/mask_rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco/mask_rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco_20210906_131725.log.json) | +| Swin-T | ImageNet-1K | 3x | yes | yes | 7.8 | | 46.0 | 41.7 | [config](./mask_rcnn_swin-t-p4-w7_fpn_fp16_ms-crop-3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/swin/mask_rcnn_swin-t-p4-w7_fpn_fp16_ms-crop-3x_coco/mask_rcnn_swin-t-p4-w7_fpn_fp16_ms-crop-3x_coco_20210908_165006-90a4008c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/swin/mask_rcnn_swin-t-p4-w7_fpn_fp16_ms-crop-3x_coco/mask_rcnn_swin-t-p4-w7_fpn_fp16_ms-crop-3x_coco_20210908_165006.log.json) | +| Swin-S | ImageNet-1K | 3x | yes | yes | 11.9 | | 48.2 | 43.2 | [config](./mask_rcnn_swin-s-p4-w7_fpn_fp16_ms-crop-3x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/swin/mask_rcnn_swin-s-p4-w7_fpn_fp16_ms-crop-3x_coco/mask_rcnn_swin-s-p4-w7_fpn_fp16_ms-crop-3x_coco_20210903_104808-b92c91f1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/swin/mask_rcnn_swin-s-p4-w7_fpn_fp16_ms-crop-3x_coco/mask_rcnn_swin-s-p4-w7_fpn_fp16_ms-crop-3x_coco_20210903_104808.log.json) | + +### Notice + +Please follow the example +of `retinanet_swin-t-p4-w7_fpn_1x_coco.py` when you want to combine Swin Transformer with +the one-stage detector. Because there is a layer norm at the outs of Swin Transformer, you must set `start_level` as 0 in FPN, so we have to set the `out_indices` of backbone as `[1,2,3]`. + +## Citation + +```latex +@article{liu2021Swin, + title={Swin Transformer: Hierarchical Vision Transformer using Shifted Windows}, + author={Liu, Ze and Lin, Yutong and Cao, Yue and Hu, Han and Wei, Yixuan and Zhang, Zheng and Lin, Stephen and Guo, Baining}, + journal={arXiv preprint arXiv:2103.14030}, + year={2021} +} +``` diff --git a/configs/swin/mask_rcnn_swin-s-p4-w7_fpn_fp16_ms-crop-3x_coco.py b/configs/swin/mask_rcnn_swin-s-p4-w7_fpn_fp16_ms-crop-3x_coco.py new file mode 100644 index 0000000..15d50a0 --- /dev/null +++ b/configs/swin/mask_rcnn_swin-s-p4-w7_fpn_fp16_ms-crop-3x_coco.py @@ -0,0 +1,6 @@ +_base_ = './mask_rcnn_swin-t-p4-w7_fpn_fp16_ms-crop-3x_coco.py' +pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_small_patch4_window7_224.pth' # noqa +model = dict( + backbone=dict( + depths=[2, 2, 18, 2], + init_cfg=dict(type='Pretrained', checkpoint=pretrained))) diff --git a/configs/swin/mask_rcnn_swin-t-p4-w7_fpn_1x_coco.py b/configs/swin/mask_rcnn_swin-t-p4-w7_fpn_1x_coco.py new file mode 100644 index 0000000..337e858 --- /dev/null +++ b/configs/swin/mask_rcnn_swin-t-p4-w7_fpn_1x_coco.py @@ -0,0 +1,42 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_tiny_patch4_window7_224.pth' # noqa +model = dict( + type='MaskRCNN', + backbone=dict( + _delete_=True, + type='SwinTransformer', + embed_dims=96, + depths=[2, 2, 6, 2], + num_heads=[3, 6, 12, 24], + window_size=7, + mlp_ratio=4, + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.2, + patch_norm=True, + out_indices=(0, 1, 2, 3), + with_cp=False, + convert_weights=True, + init_cfg=dict(type='Pretrained', checkpoint=pretrained)), + neck=dict(in_channels=[96, 192, 384, 768])) + +optimizer = dict( + _delete_=True, + type='AdamW', + lr=0.0001, + betas=(0.9, 0.999), + weight_decay=0.05, + paramwise_cfg=dict( + custom_keys={ + 'absolute_pos_embed': dict(decay_mult=0.), + 'relative_position_bias_table': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.) + })) +lr_config = dict(warmup_iters=1000, step=[8, 11]) +runner = dict(max_epochs=12) diff --git a/configs/swin/mask_rcnn_swin-t-p4-w7_fpn_fp16_ms-crop-3x_coco.py b/configs/swin/mask_rcnn_swin-t-p4-w7_fpn_fp16_ms-crop-3x_coco.py new file mode 100644 index 0000000..2be3114 --- /dev/null +++ b/configs/swin/mask_rcnn_swin-t-p4-w7_fpn_fp16_ms-crop-3x_coco.py @@ -0,0 +1,3 @@ +_base_ = './mask_rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco.py' +# you need to set mode='dynamic' if you are using pytorch<=1.5.0 +fp16 = dict(loss_scale=dict(init_scale=512)) diff --git a/configs/swin/mask_rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco.py b/configs/swin/mask_rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco.py new file mode 100644 index 0000000..2612f6e --- /dev/null +++ b/configs/swin/mask_rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco.py @@ -0,0 +1,91 @@ +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/coco_instance.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_tiny_patch4_window7_224.pth' # noqa + +model = dict( + type='MaskRCNN', + backbone=dict( + _delete_=True, + type='SwinTransformer', + embed_dims=96, + depths=[2, 2, 6, 2], + num_heads=[3, 6, 12, 24], + window_size=7, + mlp_ratio=4, + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.2, + patch_norm=True, + out_indices=(0, 1, 2, 3), + with_cp=False, + convert_weights=True, + init_cfg=dict(type='Pretrained', checkpoint=pretrained)), + neck=dict(in_channels=[96, 192, 384, 768])) + +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +# augmentation strategy originates from DETR / Sparse RCNN +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='AutoAugment', + policies=[[ + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), (576, 1333), + (608, 1333), (640, 1333), (672, 1333), (704, 1333), + (736, 1333), (768, 1333), (800, 1333)], + multiscale_mode='value', + keep_ratio=True) + ], + [ + dict( + type='Resize', + img_scale=[(400, 1333), (500, 1333), (600, 1333)], + multiscale_mode='value', + keep_ratio=True), + dict( + type='RandomCrop', + crop_type='absolute_range', + crop_size=(384, 600), + allow_negative_crop=True), + dict( + type='Resize', + img_scale=[(480, 1333), (512, 1333), (544, 1333), + (576, 1333), (608, 1333), (640, 1333), + (672, 1333), (704, 1333), (736, 1333), + (768, 1333), (800, 1333)], + multiscale_mode='value', + override=True, + keep_ratio=True) + ]]), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +data = dict(train=dict(pipeline=train_pipeline)) + +optimizer = dict( + _delete_=True, + type='AdamW', + lr=0.0001, + betas=(0.9, 0.999), + weight_decay=0.05, + paramwise_cfg=dict( + custom_keys={ + 'absolute_pos_embed': dict(decay_mult=0.), + 'relative_position_bias_table': dict(decay_mult=0.), + 'norm': dict(decay_mult=0.) + })) +lr_config = dict(warmup_iters=1000, step=[27, 33]) +runner = dict(max_epochs=36) diff --git a/configs/swin/metafile.yml b/configs/swin/metafile.yml new file mode 100644 index 0000000..6c07f17 --- /dev/null +++ b/configs/swin/metafile.yml @@ -0,0 +1,120 @@ +Models: + - Name: mask_rcnn_swin-s-p4-w7_fpn_fp16_ms-crop-3x_coco + In Collection: Mask R-CNN + Config: configs/swin/mask_rcnn_swin-s-p4-w7_fpn_fp16_ms-crop-3x_coco.py + Metadata: + Training Memory (GB): 11.9 + Epochs: 36 + Training Data: COCO + Training Techniques: + - AdamW + Training Resources: 8x V100 GPUs + Architecture: + - Swin Transformer + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 48.2 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 43.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/swin/mask_rcnn_swin-s-p4-w7_fpn_fp16_ms-crop-3x_coco/mask_rcnn_swin-s-p4-w7_fpn_fp16_ms-crop-3x_coco_20210903_104808-b92c91f1.pth + Paper: + URL: https://arxiv.org/abs/2107.08430 + Title: 'Swin Transformer: Hierarchical Vision Transformer using Shifted Windows' + README: configs/swin/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.16.0/mmdet/models/backbones/swin.py#L465 + Version: v2.16.0 + + - Name: mask_rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco + In Collection: Mask R-CNN + Config: configs/swin/mask_rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco.py + Metadata: + Training Memory (GB): 10.2 + Epochs: 36 + Training Data: COCO + Training Techniques: + - AdamW + Training Resources: 8x V100 GPUs + Architecture: + - Swin Transformer + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 41.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/swin/mask_rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco/mask_rcnn_swin-t-p4-w7_fpn_ms-crop-3x_coco_20210906_131725-bacf6f7b.pth + Paper: + URL: https://arxiv.org/abs/2107.08430 + Title: 'Swin Transformer: Hierarchical Vision Transformer using Shifted Windows' + README: configs/swin/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.16.0/mmdet/models/backbones/swin.py#L465 + Version: v2.16.0 + + - Name: mask_rcnn_swin-t-p4-w7_fpn_1x_coco + In Collection: Mask R-CNN + Config: configs/swin/mask_rcnn_swin-t-p4-w7_fpn_1x_coco.py + Metadata: + Training Memory (GB): 7.6 + Epochs: 12 + Training Data: COCO + Training Techniques: + - AdamW + Training Resources: 8x V100 GPUs + Architecture: + - Swin Transformer + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.7 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 39.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/swin/mask_rcnn_swin-t-p4-w7_fpn_1x_coco/mask_rcnn_swin-t-p4-w7_fpn_1x_coco_20210902_120937-9d6b7cfa.pth + Paper: + URL: https://arxiv.org/abs/2107.08430 + Title: 'Swin Transformer: Hierarchical Vision Transformer using Shifted Windows' + README: configs/swin/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.16.0/mmdet/models/backbones/swin.py#L465 + Version: v2.16.0 + + - Name: mask_rcnn_swin-t-p4-w7_fpn_fp16_ms-crop-3x_coco + In Collection: Mask R-CNN + Config: configs/swin/mask_rcnn_swin-t-p4-w7_fpn_fp16_ms-crop-3x_coco.py + Metadata: + Training Memory (GB): 7.8 + Epochs: 36 + Training Data: COCO + Training Techniques: + - AdamW + Training Resources: 8x V100 GPUs + Architecture: + - Swin Transformer + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.0 + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 41.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/swin/mask_rcnn_swin-t-p4-w7_fpn_fp16_ms-crop-3x_coco/mask_rcnn_swin-t-p4-w7_fpn_fp16_ms-crop-3x_coco_20210908_165006-90a4008c.pth + Paper: + URL: https://arxiv.org/abs/2107.08430 + Title: 'Swin Transformer: Hierarchical Vision Transformer using Shifted Windows' + README: configs/swin/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.16.0/mmdet/models/backbones/swin.py#L465 + Version: v2.16.0 diff --git a/configs/swin/retinanet_swin-t-p4-w7_fpn_1x_coco.py b/configs/swin/retinanet_swin-t-p4-w7_fpn_1x_coco.py new file mode 100644 index 0000000..3315093 --- /dev/null +++ b/configs/swin/retinanet_swin-t-p4-w7_fpn_1x_coco.py @@ -0,0 +1,30 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +pretrained = 'https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_tiny_patch4_window7_224.pth' # noqa +model = dict( + backbone=dict( + _delete_=True, + type='SwinTransformer', + embed_dims=96, + depths=[2, 2, 6, 2], + num_heads=[3, 6, 12, 24], + window_size=7, + mlp_ratio=4, + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.2, + patch_norm=True, + out_indices=(1, 2, 3), + # Please only add indices that would be used + # in FPN, otherwise some parameter will not be used + with_cp=False, + convert_weights=True, + init_cfg=dict(type='Pretrained', checkpoint=pretrained)), + neck=dict(in_channels=[192, 384, 768], start_level=0, num_outs=5)) + +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/configs/timm_example/README.md b/configs/timm_example/README.md new file mode 100644 index 0000000..4374855 --- /dev/null +++ b/configs/timm_example/README.md @@ -0,0 +1,62 @@ +# Timm Example + +> [PyTorch Image Models](https://github.com/rwightman/pytorch-image-models) + + + +## Abstract + +Py**T**orch **Im**age **M**odels (`timm`) is a collection of image models, layers, utilities, optimizers, schedulers, data-loaders / augmentations, and reference training / validation scripts that aim to pull together a wide variety of SOTA models with ability to reproduce ImageNet training results. + + + +## Results and Models + +### RetinaNet + +| Backbone | Style | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :-------------: | :-----: | :-----: | :------: | :------------: | :----: | :-------------------------------------------------------: | :------: | +| R-50 | pytorch | 1x | | | | [config](./retinanet_timm_tv_resnet50_fpn_1x_coco.py) | | +| EfficientNet-B1 | - | 1x | | | | [config](./retinanet_timm_efficientnet_b1_fpn_1x_coco.py) | | + +## Usage + +### Install additional requirements + +MMDetection supports timm backbones via `TIMMBackbone`, a wrapper class in MMClassification. +Thus, you need to install `mmcls` in addition to timm. +If you have already installed requirements for mmdet, run + +```shell +pip install 'dataclasses; python_version<"3.7"' +pip install timm +pip install 'mmcls>=0.20.0' +``` + +See [this document](https://mmclassification.readthedocs.io/en/latest/install.html) for the details of MMClassification installation. + +### Edit config + +- See example configs for basic usage. +- See the documents of [timm feature extraction](https://rwightman.github.io/pytorch-image-models/feature_extraction/#multi-scale-feature-maps-feature-pyramid) and [TIMMBackbone](https://mmclassification.readthedocs.io/en/latest/api.html#mmcls.models.backbones.TIMMBackbone) for details. +- Which feature map is output depends on the backbone. + Please check `backbone out_channels` and `backbone out_strides` in your log, and modify `model.neck.in_channels` and `model.backbone.out_indices` if necessary. +- If you use Vision Transformer models that do not support `features_only=True`, add `custom_hooks = []` to your config to disable `NumClassCheckHook`. + +## Citation + +```latex +@misc{rw2019timm, + author = {Ross Wightman}, + title = {PyTorch Image Models}, + year = {2019}, + publisher = {GitHub}, + journal = {GitHub repository}, + doi = {10.5281/zenodo.4414861}, + howpublished = {\url{https://github.com/rwightman/pytorch-image-models}} +} +``` diff --git a/configs/timm_example/retinanet_timm_efficientnet_b1_fpn_1x_coco.py b/configs/timm_example/retinanet_timm_efficientnet_b1_fpn_1x_coco.py new file mode 100644 index 0000000..6500116 --- /dev/null +++ b/configs/timm_example/retinanet_timm_efficientnet_b1_fpn_1x_coco.py @@ -0,0 +1,20 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +# please install mmcls>=0.20.0 +# import mmcls.models to trigger register_module in mmcls +custom_imports = dict(imports=['mmcls.models'], allow_failed_imports=False) +model = dict( + backbone=dict( + _delete_=True, + type='mmcls.TIMMBackbone', + model_name='efficientnet_b1', + features_only=True, + pretrained=True, + out_indices=(1, 2, 3, 4)), + neck=dict(in_channels=[24, 40, 112, 320])) + +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/configs/timm_example/retinanet_timm_tv_resnet50_fpn_1x_coco.py b/configs/timm_example/retinanet_timm_tv_resnet50_fpn_1x_coco.py new file mode 100644 index 0000000..0c5b7a8 --- /dev/null +++ b/configs/timm_example/retinanet_timm_tv_resnet50_fpn_1x_coco.py @@ -0,0 +1,19 @@ +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +# please install mmcls>=0.20.0 +# import mmcls.models to trigger register_module in mmcls +custom_imports = dict(imports=['mmcls.models'], allow_failed_imports=False) +model = dict( + backbone=dict( + _delete_=True, + type='mmcls.TIMMBackbone', + model_name='tv_resnet50', # ResNet-50 with torchvision weights + features_only=True, + pretrained=True, + out_indices=(1, 2, 3, 4))) + +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) diff --git a/configs/tood/README.md b/configs/tood/README.md new file mode 100644 index 0000000..925f0ed --- /dev/null +++ b/configs/tood/README.md @@ -0,0 +1,40 @@ +# TOOD + +> [TOOD: Task-aligned One-stage Object Detection](https://arxiv.org/abs/2108.07755) + + + +## Abstract + +One-stage object detection is commonly implemented by optimizing two sub-tasks: object classification and localization, using heads with two parallel branches, which might lead to a certain level of spatial misalignment in predictions between the two tasks. In this work, we propose a Task-aligned One-stage Object Detection (TOOD) that explicitly aligns the two tasks in a learning-based manner. First, we design a novel Task-aligned Head (T-Head) which offers a better balance between learning task-interactive and task-specific features, as well as a greater flexibility to learn the alignment via a task-aligned predictor. Second, we propose Task Alignment Learning (TAL) to explicitly pull closer (or even unify) the optimal anchors for the two tasks during training via a designed sample assignment scheme and a task-aligned loss. Extensive experiments are conducted on MS-COCO, where TOOD achieves a 51.1 AP at single-model single-scale testing. This surpasses the recent one-stage detectors by a large margin, such as ATSS (47.7 AP), GFL (48.2 AP), and PAA (49.0 AP), with fewer parameters and FLOPs. Qualitative results also demonstrate the effectiveness of TOOD for better aligning the tasks of object classification and localization. + +
+ +
+ +## Results and Models + +| Backbone | Style | Anchor Type | Lr schd | Multi-scale Training | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :---------------: | :-----: | :----------: | :-----: | :------------------: | :------: | :------------: | :----: | :------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | pytorch | Anchor-free | 1x | N | 4.1 | | 42.4 | [config](./tood_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/tood/tood_r50_fpn_1x_coco/tood_r50_fpn_1x_coco_20211210_103425-20e20746.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/tood/tood_r50_fpn_1x_coco/tood_r50_fpn_1x_coco_20211210_103425.log) | +| R-50 | pytorch | Anchor-based | 1x | N | 4.1 | | 42.4 | [config](./tood_r50_fpn_anchor_based_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/tood/tood_r50_fpn_anchor_based_1x_coco/tood_r50_fpn_anchor_based_1x_coco_20211214_100105-b776c134.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/tood/tood_r50_fpn_anchor_based_1x_coco/tood_r50_fpn_anchor_based_1x_coco_20211214_100105.log) | +| R-50 | pytorch | Anchor-free | 2x | Y | 4.1 | | 44.5 | [config](./tood_r50_fpn_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/tood/tood_r50_fpn_mstrain_2x_coco/tood_r50_fpn_mstrain_2x_coco_20211210_144231-3b23174c.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/tood/tood_r50_fpn_mstrain_2x_coco/tood_r50_fpn_mstrain_2x_coco_20211210_144231.log) | +| R-101 | pytorch | Anchor-free | 2x | Y | 6.0 | | 46.1 | [config](./tood_r101_fpn_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/tood/tood_r101_fpn_mstrain_2x_coco/tood_r101_fpn_mstrain_2x_coco_20211210_144232-a18f53c8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/tood/tood_r101_fpn_mstrain_2x_coco/tood_r101_fpn_mstrain_2x_coco_20211210_144232.log) | +| R-101-dcnv2 | pytorch | Anchor-free | 2x | Y | 6.2 | | 49.3 | [config](./tood_r101_fpn_dconv_c3-c5_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/tood/tood_r101_fpn_dconv_c3-c5_mstrain_2x_coco/tood_r101_fpn_dconv_c3-c5_mstrain_2x_coco_20211210_213728-4a824142.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/tood/tood_r101_fpn_dconv_c3-c5_mstrain_2x_coco/tood_r101_fpn_dconv_c3-c5_mstrain_2x_coco_20211210_213728.log) | +| X-101-64x4d | pytorch | Anchor-free | 2x | Y | 10.2 | | 47.6 | [config](./tood_x101_64x4d_fpn_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/tood/tood_x101_64x4d_fpn_mstrain_2x_coco/tood_x101_64x4d_fpn_mstrain_2x_coco_20211211_003519-a4f36113.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/tood/tood_x101_64x4d_fpn_mstrain_2x_coco/tood_x101_64x4d_fpn_mstrain_2x_coco_20211211_003519.log) | +| X-101-64x4d-dcnv2 | pytorch | Anchor-free | 2x | Y | | | | [config](./tood_x101_64x4d_fpn_dconv_c4-c5_mstrain_2x_coco.py) | [model](<>) \| [log](<>) | + +\[1\] *1x and 2x mean the model is trained for 90K and 180K iterations, respectively.* \ +\[2\] *All results are obtained with a single model and without any test time data augmentation such as multi-scale, flipping and etc..* \ +\[3\] *`dcnv2` denotes deformable convolutional networks v2.* \\ + +## Citation + +```latex +@inproceedings{feng2021tood, + title={TOOD: Task-aligned One-stage Object Detection}, + author={Feng, Chengjian and Zhong, Yujie and Gao, Yu and Scott, Matthew R and Huang, Weilin}, + booktitle={ICCV}, + year={2021} +} +``` diff --git a/configs/tood/metafile.yml b/configs/tood/metafile.yml new file mode 100644 index 0000000..27a0f8d --- /dev/null +++ b/configs/tood/metafile.yml @@ -0,0 +1,95 @@ +Collections: + - Name: TOOD + Metadata: + Training Data: COCO + Training Techniques: + - SGD + Training Resources: 8x V100 GPUs + Architecture: + - TOOD + Paper: + URL: https://arxiv.org/abs/2108.07755 + Title: 'TOOD: Task-aligned One-stage Object Detection' + README: configs/tood/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.20.0/mmdet/models/detectors/tood.py#L7 + Version: v2.20.0 + +Models: + - Name: tood_r101_fpn_mstrain_2x_coco + In Collection: TOOD + Config: configs/tood/tood_r101_fpn_mstrain_2x_coco.py + Metadata: + Training Memory (GB): 6.0 + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.1 + Weights: https://download.openmmlab.com/mmdetection/v2.0/tood/tood_r101_fpn_mstrain_2x_coco/tood_r101_fpn_mstrain_2x_coco_20211210_144232-a18f53c8.pth + + - Name: tood_x101_64x4d_fpn_mstrain_2x_coco + In Collection: TOOD + Config: configs/tood/tood_x101_64x4d_fpn_mstrain_2x_coco.py + Metadata: + Training Memory (GB): 10.2 + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 47.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/tood/tood_x101_64x4d_fpn_mstrain_2x_coco/tood_x101_64x4d_fpn_mstrain_2x_coco_20211211_003519-a4f36113.pth + + - Name: tood_r101_fpn_dconv_c3-c5_mstrain_2x_coco + In Collection: TOOD + Config: configs/tood/tood_r101_fpn_dconv_c3-c5_mstrain_2x_coco.py + Metadata: + Training Memory (GB): 6.2 + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 49.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/tood/tood_r101_fpn_dconv_c3-c5_mstrain_2x_coco/tood_r101_fpn_dconv_c3-c5_mstrain_2x_coco_20211210_213728-4a824142.pth + + - Name: tood_r50_fpn_anchor_based_1x_coco + In Collection: TOOD + Config: configs/tood/tood_r50_fpn_anchor_based_1x_coco.py + Metadata: + Training Memory (GB): 4.1 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/tood/tood_r50_fpn_anchor_based_1x_coco/tood_r50_fpn_anchor_based_1x_coco_20211214_100105-b776c134.pth + + - Name: tood_r50_fpn_1x_coco + In Collection: TOOD + Config: configs/tood/tood_r50_fpn_1x_coco.py + Metadata: + Training Memory (GB): 4.1 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 42.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/tood/tood_r50_fpn_1x_coco/tood_r50_fpn_1x_coco_20211210_103425-20e20746.pth + + - Name: tood_r50_fpn_mstrain_2x_coco + In Collection: TOOD + Config: configs/tood/tood_r50_fpn_mstrain_2x_coco.py + Metadata: + Training Memory (GB): 4.1 + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/tood/tood_r50_fpn_mstrain_2x_coco/tood_r50_fpn_mstrain_2x_coco_20211210_144231-3b23174c.pth diff --git a/configs/tood/tood_r101_fpn_dconv_c3-c5_mstrain_2x_coco.py b/configs/tood/tood_r101_fpn_dconv_c3-c5_mstrain_2x_coco.py new file mode 100644 index 0000000..c7f1bbc --- /dev/null +++ b/configs/tood/tood_r101_fpn_dconv_c3-c5_mstrain_2x_coco.py @@ -0,0 +1,7 @@ +_base_ = './tood_r101_fpn_mstrain_2x_coco.py' + +model = dict( + backbone=dict( + dcn=dict(type='DCNv2', deformable_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True)), + bbox_head=dict(num_dcn=2)) diff --git a/configs/tood/tood_r101_fpn_mstrain_2x_coco.py b/configs/tood/tood_r101_fpn_mstrain_2x_coco.py new file mode 100644 index 0000000..d9d2c32 --- /dev/null +++ b/configs/tood/tood_r101_fpn_mstrain_2x_coco.py @@ -0,0 +1,7 @@ +_base_ = './tood_r50_fpn_mstrain_2x_coco.py' + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/tood/tood_r50_fpn_1x_coco.py b/configs/tood/tood_r50_fpn_1x_coco.py new file mode 100644 index 0000000..35a77a4 --- /dev/null +++ b/configs/tood/tood_r50_fpn_1x_coco.py @@ -0,0 +1,74 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='TOOD', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', + num_outs=5), + bbox_head=dict( + type='TOODHead', + num_classes=80, + in_channels=256, + stacked_convs=6, + feat_channels=256, + anchor_type='anchor_free', + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + initial_loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + activated=True, # use probability instead of logit as input + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_cls=dict( + type='QualityFocalLoss', + use_sigmoid=True, + activated=True, # use probability instead of logit as input + beta=2.0, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=2.0)), + train_cfg=dict( + initial_epoch=4, + initial_assigner=dict(type='ATSSAssigner', topk=9), + assigner=dict(type='TaskAlignedAssigner', topk=13), + alpha=1, + beta=6, + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) +# optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) + +# custom hooks +custom_hooks = [dict(type='SetEpochInfoHook')] diff --git a/configs/tood/tood_r50_fpn_anchor_based_1x_coco.py b/configs/tood/tood_r50_fpn_anchor_based_1x_coco.py new file mode 100644 index 0000000..c7fbf6a --- /dev/null +++ b/configs/tood/tood_r50_fpn_anchor_based_1x_coco.py @@ -0,0 +1,2 @@ +_base_ = './tood_r50_fpn_1x_coco.py' +model = dict(bbox_head=dict(anchor_type='anchor_based')) diff --git a/configs/tood/tood_r50_fpn_mstrain_2x_coco.py b/configs/tood/tood_r50_fpn_mstrain_2x_coco.py new file mode 100644 index 0000000..157d13a --- /dev/null +++ b/configs/tood/tood_r50_fpn_mstrain_2x_coco.py @@ -0,0 +1,22 @@ +_base_ = './tood_r50_fpn_1x_coco.py' +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) +# multi-scale training +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 480), (1333, 800)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +data = dict(train=dict(pipeline=train_pipeline)) diff --git a/configs/tood/tood_x101_64x4d_fpn_dconv_c4-c5_mstrain_2x_coco.py b/configs/tood/tood_x101_64x4d_fpn_dconv_c4-c5_mstrain_2x_coco.py new file mode 100644 index 0000000..47c9269 --- /dev/null +++ b/configs/tood/tood_x101_64x4d_fpn_dconv_c4-c5_mstrain_2x_coco.py @@ -0,0 +1,7 @@ +_base_ = './tood_x101_64x4d_fpn_mstrain_2x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCNv2', deformable_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, False, True, True), + ), + bbox_head=dict(num_dcn=2)) diff --git a/configs/tood/tood_x101_64x4d_fpn_mstrain_2x_coco.py b/configs/tood/tood_x101_64x4d_fpn_mstrain_2x_coco.py new file mode 100644 index 0000000..842f320 --- /dev/null +++ b/configs/tood/tood_x101_64x4d_fpn_mstrain_2x_coco.py @@ -0,0 +1,16 @@ +_base_ = './tood_r50_fpn_mstrain_2x_coco.py' + +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/tridentnet/README.md b/configs/tridentnet/README.md new file mode 100644 index 0000000..b972b3a --- /dev/null +++ b/configs/tridentnet/README.md @@ -0,0 +1,38 @@ +# TridentNet + +> [Scale-Aware Trident Networks for Object Detection](https://arxiv.org/abs/1901.01892) + + + +## Abstract + +Scale variation is one of the key challenges in object detection. In this work, we first present a controlled experiment to investigate the effect of receptive fields for scale variation in object detection. Based on the findings from the exploration experiments, we propose a novel Trident Network (TridentNet) aiming to generate scale-specific feature maps with a uniform representational power. We construct a parallel multi-branch architecture in which each branch shares the same transformation parameters but with different receptive fields. Then, we adopt a scale-aware training scheme to specialize each branch by sampling object instances of proper scales for training. As a bonus, a fast approximation version of TridentNet could achieve significant improvements without any additional parameters and computational cost compared with the vanilla detector. On the COCO dataset, our TridentNet with ResNet-101 backbone achieves state-of-the-art single-model results of 48.4 mAP. + +
+ +
+ +## Results and Models + +We reports the test results using only one branch for inference. + +| Backbone | Style | mstrain | Lr schd | Mem (GB) | Inf time (fps) | box AP | Download | +| :------: | :---: | :-----: | :-----: | :------: | :------------: | :----: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | caffe | N | 1x | | | 37.7 | [model](https://download.openmmlab.com/mmdetection/v2.0/tridentnet/tridentnet_r50_caffe_1x_coco/tridentnet_r50_caffe_1x_coco_20201230_141838-2ec0b530.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/tridentnet/tridentnet_r50_caffe_1x_coco/tridentnet_r50_caffe_1x_coco_20201230_141838.log.json) | +| R-50 | caffe | Y | 1x | | | 37.6 | [model](https://download.openmmlab.com/mmdetection/v2.0/tridentnet/tridentnet_r50_caffe_mstrain_1x_coco/tridentnet_r50_caffe_mstrain_1x_coco_20201230_141839-6ce55ccb.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/tridentnet/tridentnet_r50_caffe_mstrain_1x_coco/tridentnet_r50_caffe_mstrain_1x_coco_20201230_141839.log.json) | +| R-50 | caffe | Y | 3x | | | 40.3 | [model](https://download.openmmlab.com/mmdetection/v2.0/tridentnet/tridentnet_r50_caffe_mstrain_3x_coco/tridentnet_r50_caffe_mstrain_3x_coco_20201130_100539-46d227ba.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/tridentnet/tridentnet_r50_caffe_mstrain_3x_coco/tridentnet_r50_caffe_mstrain_3x_coco_20201130_100539.log.json) | + +**Note** + +Similar to [Detectron2](https://github.com/facebookresearch/detectron2/tree/master/projects/TridentNet), we haven't implemented the Scale-aware Training Scheme in section 4.2 of the paper. + +## Citation + +```latex +@InProceedings{li2019scale, + title={Scale-Aware Trident Networks for Object Detection}, + author={Li, Yanghao and Chen, Yuntao and Wang, Naiyan and Zhang, Zhaoxiang}, + journal={The International Conference on Computer Vision (ICCV)}, + year={2019} +} +``` diff --git a/configs/tridentnet/metafile.yml b/configs/tridentnet/metafile.yml new file mode 100644 index 0000000..2536f97 --- /dev/null +++ b/configs/tridentnet/metafile.yml @@ -0,0 +1,55 @@ +Collections: + - Name: TridentNet + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - ResNet + - TridentNet Block + Paper: + URL: https://arxiv.org/abs/1901.01892 + Title: 'Scale-Aware Trident Networks for Object Detection' + README: configs/tridentnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.8.0/mmdet/models/detectors/trident_faster_rcnn.py#L6 + Version: v2.8.0 + +Models: + - Name: tridentnet_r50_caffe_1x_coco + In Collection: TridentNet + Config: configs/tridentnet/tridentnet_r50_caffe_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/tridentnet/tridentnet_r50_caffe_1x_coco/tridentnet_r50_caffe_1x_coco_20201230_141838-2ec0b530.pth + + - Name: tridentnet_r50_caffe_mstrain_1x_coco + In Collection: TridentNet + Config: configs/tridentnet/tridentnet_r50_caffe_mstrain_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/tridentnet/tridentnet_r50_caffe_mstrain_1x_coco/tridentnet_r50_caffe_mstrain_1x_coco_20201230_141839-6ce55ccb.pth + + - Name: tridentnet_r50_caffe_mstrain_3x_coco + In Collection: TridentNet + Config: configs/tridentnet/tridentnet_r50_caffe_mstrain_3x_coco.py + Metadata: + Epochs: 36 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.3 + Weights: https://download.openmmlab.com/mmdetection/v2.0/tridentnet/tridentnet_r50_caffe_mstrain_3x_coco/tridentnet_r50_caffe_mstrain_3x_coco_20201130_100539-46d227ba.pth diff --git a/configs/tridentnet/tridentnet_r50_caffe_1x_coco.py b/configs/tridentnet/tridentnet_r50_caffe_1x_coco.py new file mode 100644 index 0000000..d779f75 --- /dev/null +++ b/configs/tridentnet/tridentnet_r50_caffe_1x_coco.py @@ -0,0 +1,55 @@ +_base_ = [ + '../_base_/models/faster_rcnn_r50_caffe_c4.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +model = dict( + type='TridentFasterRCNN', + backbone=dict( + type='TridentResNet', + trident_dilations=(1, 2, 3), + num_branch=3, + test_branch_idx=1, + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron2/resnet50_caffe')), + roi_head=dict(type='TridentRoIHead', num_branch=3, test_branch_idx=1), + train_cfg=dict( + rpn_proposal=dict(max_per_img=500), + rcnn=dict( + sampler=dict(num=128, pos_fraction=0.5, + add_gt_as_proposals=False)))) + +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/tridentnet/tridentnet_r50_caffe_mstrain_1x_coco.py b/configs/tridentnet/tridentnet_r50_caffe_mstrain_1x_coco.py new file mode 100644 index 0000000..c73d9ea --- /dev/null +++ b/configs/tridentnet/tridentnet_r50_caffe_mstrain_1x_coco.py @@ -0,0 +1,22 @@ +_base_ = 'tridentnet_r50_caffe_1x_coco.py' + +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode='value', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] + +data = dict(train=dict(pipeline=train_pipeline)) diff --git a/configs/tridentnet/tridentnet_r50_caffe_mstrain_3x_coco.py b/configs/tridentnet/tridentnet_r50_caffe_mstrain_3x_coco.py new file mode 100644 index 0000000..0f40282 --- /dev/null +++ b/configs/tridentnet/tridentnet_r50_caffe_mstrain_3x_coco.py @@ -0,0 +1,4 @@ +_base_ = 'tridentnet_r50_caffe_mstrain_1x_coco.py' + +lr_config = dict(step=[28, 34]) +runner = dict(type='EpochBasedRunner', max_epochs=36) diff --git a/configs/vfnet/README.md b/configs/vfnet/README.md new file mode 100644 index 0000000..a492bec --- /dev/null +++ b/configs/vfnet/README.md @@ -0,0 +1,48 @@ +# VarifocalNet + +> [VarifocalNet: An IoU-aware Dense Object Detector](https://arxiv.org/abs/2008.13367) + + + +## Abstract + +Accurately ranking the vast number of candidate detections is crucial for dense object detectors to achieve high performance. Prior work uses the classification score or a combination of classification and predicted localization scores to rank candidates. However, neither option results in a reliable ranking, thus degrading detection performance. In this paper, we propose to learn an Iou-aware Classification Score (IACS) as a joint representation of object presence confidence and localization accuracy. We show that dense object detectors can achieve a more accurate ranking of candidate detections based on the IACS. We design a new loss function, named Varifocal Loss, to train a dense object detector to predict the IACS, and propose a new star-shaped bounding box feature representation for IACS prediction and bounding box refinement. Combining these two new components and a bounding box refinement branch, we build an IoU-aware dense object detector based on the FCOS+ATSS architecture, that we call VarifocalNet or VFNet for short. Extensive experiments on MS COCO show that our VFNet consistently surpasses the strong baseline by ∼2.0 AP with different backbones. Our best model VFNet-X-1200 with Res2Net-101-DCN achieves a single-model single-scale AP of 55.1 on COCO test-dev, which is state-of-the-art among various object detectors. + +
+ +
+ +## Introduction + +**VarifocalNet (VFNet)** learns to predict the IoU-aware classification score which mixes the object presence confidence and localization accuracy together as the detection score for a bounding box. The learning is supervised by the proposed Varifocal Loss (VFL), based on a new star-shaped bounding box feature representation (the features at nine yellow sampling points). Given the new representation, the object localization accuracy is further improved by refining the initially regressed bounding box. The full paper is available at: [https://arxiv.org/abs/2008.13367](https://arxiv.org/abs/2008.13367). + +## Results and Models + +| Backbone | Style | DCN | MS train | Lr schd | Inf time (fps) | box AP (val) | box AP (test-dev) | Config | Download | +| :---------: | :-----: | :-: | :------: | :-----: | :------------: | :----------: | :---------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50 | pytorch | N | N | 1x | - | 41.6 | 41.6 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/vfnet/vfnet_r50_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_r50_fpn_1x_coco/vfnet_r50_fpn_1x_coco_20201027-38db6f58.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_r50_fpn_1x_coco/vfnet_r50_fpn_1x_coco.json) | +| R-50 | pytorch | N | Y | 2x | - | 44.5 | 44.8 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/vfnet/vfnet_r50_fpn_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_r50_fpn_mstrain_2x_coco/vfnet_r50_fpn_mstrain_2x_coco_20201027-7cc75bd2.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_r50_fpn_mstrain_2x_coco/vfnet_r50_fpn_mstrain_2x_coco.json) | +| R-50 | pytorch | Y | Y | 2x | - | 47.8 | 48.0 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/vfnet/vfnet_r50_fpn_mdconv_c3-c5_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_r50_fpn_mdconv_c3-c5_mstrain_2x_coco/vfnet_r50_fpn_mdconv_c3-c5_mstrain_2x_coco_20201027pth-6879c318.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_r50_fpn_mdconv_c3-c5_mstrain_2x_coco/vfnet_r50_fpn_mdconv_c3-c5_mstrain_2x_coco.json) | +| R-101 | pytorch | N | N | 1x | - | 43.0 | 43.6 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/vfnet/vfnet_r101_fpn_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_r101_fpn_1x_coco/vfnet_r101_fpn_1x_coco_20201027pth-c831ece7.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_r101_fpn_1x_coco/vfnet_r101_fpn_1x_coco.json) | +| R-101 | pytorch | N | Y | 2x | - | 46.2 | 46.7 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/vfnet/vfnet_r101_fpn_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_r101_fpn_mstrain_2x_coco/vfnet_r101_fpn_mstrain_2x_coco_20201027pth-4a5d53f1.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_r101_fpn_mstrain_2x_coco/vfnet_r101_fpn_mstrain_2x_coco.json) | +| R-101 | pytorch | Y | Y | 2x | - | 49.0 | 49.2 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/vfnet/vfnet_r101_fpn_mdconv_c3-c5_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_r101_fpn_mdconv_c3-c5_mstrain_2x_coco/vfnet_r101_fpn_mdconv_c3-c5_mstrain_2x_coco_20201027pth-7729adb5.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_r101_fpn_mdconv_c3-c5_mstrain_2x_coco/vfnet_r101_fpn_mdconv_c3-c5_mstrain_2x_coco.json) | +| X-101-32x4d | pytorch | Y | Y | 2x | - | 49.7 | 50.0 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/vfnet/vfnet_x101_32x4d_fpn_mdconv_c3-c5_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_x101_32x4d_fpn_mdconv_c3-c5_mstrain_2x_coco/vfnet_x101_32x4d_fpn_mdconv_c3-c5_mstrain_2x_coco_20201027pth-d300a6fc.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_x101_32x4d_fpn_mdconv_c3-c5_mstrain_2x_coco/vfnet_x101_32x4d_fpn_mdconv_c3-c5_mstrain_2x_coco.json) | +| X-101-64x4d | pytorch | Y | Y | 2x | - | 50.4 | 50.8 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/vfnet/vfnet_x101_64x4d_fpn_mdconv_c3-c5_mstrain_2x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_x101_64x4d_fpn_mdconv_c3-c5_mstrain_2x_coco/vfnet_x101_64x4d_fpn_mdconv_c3-c5_mstrain_2x_coco_20201027pth-b5f6da5e.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_x101_64x4d_fpn_mdconv_c3-c5_mstrain_2x_coco/vfnet_x101_64x4d_fpn_mdconv_c3-c5_mstrain_2x_coco.json) | + +**Notes:** + +- The MS-train scale range is 1333x\[480:960\] (`range` mode) and the inference scale keeps 1333x800. +- DCN means using `DCNv2` in both backbone and head. +- Inference time will be updated soon. +- More results and pre-trained models can be found in [VarifocalNet-Github](https://github.com/hyz-xmaster/VarifocalNet) + +## Citation + +```latex +@article{zhang2020varifocalnet, + title={VarifocalNet: An IoU-aware Dense Object Detector}, + author={Zhang, Haoyang and Wang, Ying and Dayoub, Feras and S{\"u}nderhauf, Niko}, + journal={arXiv preprint arXiv:2008.13367}, + year={2020} +} +``` diff --git a/configs/vfnet/metafile.yml b/configs/vfnet/metafile.yml new file mode 100644 index 0000000..bcbe576 --- /dev/null +++ b/configs/vfnet/metafile.yml @@ -0,0 +1,116 @@ +Collections: + - Name: VFNet + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - ResNet + - Varifocal Loss + Paper: + URL: https://arxiv.org/abs/2008.13367 + Title: 'VarifocalNet: An IoU-aware Dense Object Detector' + README: configs/vfnet/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.6.0/mmdet/models/detectors/vfnet.py#L6 + Version: v2.6.0 + +Models: + - Name: vfnet_r50_fpn_1x_coco + In Collection: VFNet + Config: configs/vfnet/vfnet_r50_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 41.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_r50_fpn_1x_coco/vfnet_r50_fpn_1x_coco_20201027-38db6f58.pth + + - Name: vfnet_r50_fpn_mstrain_2x_coco + In Collection: VFNet + Config: configs/vfnet/vfnet_r50_fpn_mstrain_2x_coco.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 44.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_r50_fpn_mstrain_2x_coco/vfnet_r50_fpn_mstrain_2x_coco_20201027-7cc75bd2.pth + + - Name: vfnet_r50_fpn_mdconv_c3-c5_mstrain_2x_coco + In Collection: VFNet + Config: configs/vfnet/vfnet_r50_fpn_mdconv_c3-c5_mstrain_2x_coco.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 48.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_r50_fpn_mdconv_c3-c5_mstrain_2x_coco/vfnet_r50_fpn_mdconv_c3-c5_mstrain_2x_coco_20201027pth-6879c318.pth + + - Name: vfnet_r101_fpn_1x_coco + In Collection: VFNet + Config: configs/vfnet/vfnet_r101_fpn_1x_coco.py + Metadata: + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 43.6 + Weights: https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_r101_fpn_1x_coco/vfnet_r101_fpn_1x_coco_20201027pth-c831ece7.pth + + - Name: vfnet_r101_fpn_mstrain_2x_coco + In Collection: VFNet + Config: configs/vfnet/vfnet_r101_fpn_mstrain_2x_coco.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 46.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_r101_fpn_mstrain_2x_coco/vfnet_r101_fpn_mstrain_2x_coco_20201027pth-4a5d53f1.pth + + - Name: vfnet_r101_fpn_mdconv_c3-c5_mstrain_2x_coco + In Collection: VFNet + Config: configs/vfnet/vfnet_r101_fpn_mdconv_c3-c5_mstrain_2x_coco.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 49.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_r101_fpn_mdconv_c3-c5_mstrain_2x_coco/vfnet_r101_fpn_mdconv_c3-c5_mstrain_2x_coco_20201027pth-7729adb5.pth + + - Name: vfnet_x101_32x4d_fpn_mdconv_c3-c5_mstrain_2x_coco + In Collection: VFNet + Config: configs/vfnet/vfnet_x101_32x4d_fpn_mdconv_c3-c5_mstrain_2x_coco.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 50.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_x101_32x4d_fpn_mdconv_c3-c5_mstrain_2x_coco/vfnet_x101_32x4d_fpn_mdconv_c3-c5_mstrain_2x_coco_20201027pth-d300a6fc.pth + + - Name: vfnet_x101_64x4d_fpn_mdconv_c3-c5_mstrain_2x_coco + In Collection: VFNet + Config: configs/vfnet/vfnet_x101_64x4d_fpn_mdconv_c3-c5_mstrain_2x_coco.py + Metadata: + Epochs: 24 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 50.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/vfnet/vfnet_x101_64x4d_fpn_mdconv_c3-c5_mstrain_2x_coco/vfnet_x101_64x4d_fpn_mdconv_c3-c5_mstrain_2x_coco_20201027pth-b5f6da5e.pth diff --git a/configs/vfnet/vfnet_r101_fpn_1x_coco.py b/configs/vfnet/vfnet_r101_fpn_1x_coco.py new file mode 100644 index 0000000..b296a07 --- /dev/null +++ b/configs/vfnet/vfnet_r101_fpn_1x_coco.py @@ -0,0 +1,6 @@ +_base_ = './vfnet_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/vfnet/vfnet_r101_fpn_2x_coco.py b/configs/vfnet/vfnet_r101_fpn_2x_coco.py new file mode 100644 index 0000000..27962f3 --- /dev/null +++ b/configs/vfnet/vfnet_r101_fpn_2x_coco.py @@ -0,0 +1,8 @@ +_base_ = './vfnet_r50_fpn_1x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/vfnet/vfnet_r101_fpn_mdconv_c3-c5_mstrain_2x_coco.py b/configs/vfnet/vfnet_r101_fpn_mdconv_c3-c5_mstrain_2x_coco.py new file mode 100644 index 0000000..e438c24 --- /dev/null +++ b/configs/vfnet/vfnet_r101_fpn_mdconv_c3-c5_mstrain_2x_coco.py @@ -0,0 +1,15 @@ +_base_ = './vfnet_r50_fpn_mdconv_c3-c5_mstrain_2x_coco.py' +model = dict( + backbone=dict( + type='ResNet', + depth=101, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + dcn=dict(type='DCNv2', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True), + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/vfnet/vfnet_r101_fpn_mstrain_2x_coco.py b/configs/vfnet/vfnet_r101_fpn_mstrain_2x_coco.py new file mode 100644 index 0000000..eae69a0 --- /dev/null +++ b/configs/vfnet/vfnet_r101_fpn_mstrain_2x_coco.py @@ -0,0 +1,6 @@ +_base_ = './vfnet_r50_fpn_mstrain_2x_coco.py' +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/vfnet/vfnet_r2_101_fpn_mdconv_c3-c5_mstrain_2x_coco.py b/configs/vfnet/vfnet_r2_101_fpn_mdconv_c3-c5_mstrain_2x_coco.py new file mode 100644 index 0000000..815a36e --- /dev/null +++ b/configs/vfnet/vfnet_r2_101_fpn_mdconv_c3-c5_mstrain_2x_coco.py @@ -0,0 +1,18 @@ +_base_ = './vfnet_r50_fpn_mdconv_c3-c5_mstrain_2x_coco.py' +model = dict( + backbone=dict( + type='Res2Net', + depth=101, + scales=4, + base_width=26, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + dcn=dict(type='DCNv2', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True), + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://res2net101_v1d_26w_4s'))) diff --git a/configs/vfnet/vfnet_r2_101_fpn_mstrain_2x_coco.py b/configs/vfnet/vfnet_r2_101_fpn_mstrain_2x_coco.py new file mode 100644 index 0000000..58022e0 --- /dev/null +++ b/configs/vfnet/vfnet_r2_101_fpn_mstrain_2x_coco.py @@ -0,0 +1,16 @@ +_base_ = './vfnet_r50_fpn_mstrain_2x_coco.py' +model = dict( + backbone=dict( + type='Res2Net', + depth=101, + scales=4, + base_width=26, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://res2net101_v1d_26w_4s'))) diff --git a/configs/vfnet/vfnet_r50_fpn_1x_coco.py b/configs/vfnet/vfnet_r50_fpn_1x_coco.py new file mode 100644 index 0000000..7de6429 --- /dev/null +++ b/configs/vfnet/vfnet_r50_fpn_1x_coco.py @@ -0,0 +1,107 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# model settings +model = dict( + type='VFNet', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_output', # use P5 + num_outs=5, + relu_before_extra_convs=True), + bbox_head=dict( + type='VFNetHead', + num_classes=80, + in_channels=256, + stacked_convs=3, + feat_channels=256, + strides=[8, 16, 32, 64, 128], + center_sampling=False, + dcn_on_last_conv=False, + use_atss=True, + use_vfl=True, + loss_cls=dict( + type='VarifocalLoss', + use_sigmoid=True, + alpha=0.75, + gamma=2.0, + iou_weighted=True, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=1.5), + loss_bbox_refine=dict(type='GIoULoss', loss_weight=2.0)), + # training and testing settings + train_cfg=dict( + assigner=dict(type='ATSSAssigner', topk=9), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) + +# data setting +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) + +# optimizer +optimizer = dict( + lr=0.01, paramwise_cfg=dict(bias_lr_mult=2., bias_decay_mult=0.)) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.1, + step=[8, 11]) +runner = dict(type='EpochBasedRunner', max_epochs=12) diff --git a/configs/vfnet/vfnet_r50_fpn_mdconv_c3-c5_mstrain_2x_coco.py b/configs/vfnet/vfnet_r50_fpn_mdconv_c3-c5_mstrain_2x_coco.py new file mode 100644 index 0000000..24d2093 --- /dev/null +++ b/configs/vfnet/vfnet_r50_fpn_mdconv_c3-c5_mstrain_2x_coco.py @@ -0,0 +1,6 @@ +_base_ = './vfnet_r50_fpn_mstrain_2x_coco.py' +model = dict( + backbone=dict( + dcn=dict(type='DCNv2', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True)), + bbox_head=dict(dcn_on_last_conv=True)) diff --git a/configs/vfnet/vfnet_r50_fpn_mstrain_2x_coco.py b/configs/vfnet/vfnet_r50_fpn_mstrain_2x_coco.py new file mode 100644 index 0000000..6078bb9 --- /dev/null +++ b/configs/vfnet/vfnet_r50_fpn_mstrain_2x_coco.py @@ -0,0 +1,39 @@ +_base_ = './vfnet_r50_fpn_1x_coco.py' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Resize', + img_scale=[(1333, 480), (1333, 960)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +# learning policy +lr_config = dict(step=[16, 22]) +runner = dict(type='EpochBasedRunner', max_epochs=24) diff --git a/configs/vfnet/vfnet_x101_32x4d_fpn_mdconv_c3-c5_mstrain_2x_coco.py b/configs/vfnet/vfnet_x101_32x4d_fpn_mdconv_c3-c5_mstrain_2x_coco.py new file mode 100644 index 0000000..7efa051 --- /dev/null +++ b/configs/vfnet/vfnet_x101_32x4d_fpn_mdconv_c3-c5_mstrain_2x_coco.py @@ -0,0 +1,17 @@ +_base_ = './vfnet_r50_fpn_mdconv_c3-c5_mstrain_2x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + dcn=dict(type='DCNv2', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/vfnet/vfnet_x101_32x4d_fpn_mstrain_2x_coco.py b/configs/vfnet/vfnet_x101_32x4d_fpn_mstrain_2x_coco.py new file mode 100644 index 0000000..49a4312 --- /dev/null +++ b/configs/vfnet/vfnet_x101_32x4d_fpn_mstrain_2x_coco.py @@ -0,0 +1,15 @@ +_base_ = './vfnet_r50_fpn_mstrain_2x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=32, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_32x4d'))) diff --git a/configs/vfnet/vfnet_x101_64x4d_fpn_mdconv_c3-c5_mstrain_2x_coco.py b/configs/vfnet/vfnet_x101_64x4d_fpn_mdconv_c3-c5_mstrain_2x_coco.py new file mode 100644 index 0000000..7e1ee42 --- /dev/null +++ b/configs/vfnet/vfnet_x101_64x4d_fpn_mdconv_c3-c5_mstrain_2x_coco.py @@ -0,0 +1,17 @@ +_base_ = './vfnet_r50_fpn_mdconv_c3-c5_mstrain_2x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + dcn=dict(type='DCNv2', deform_groups=1, fallback_on_stride=False), + stage_with_dcn=(False, True, True, True), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/vfnet/vfnet_x101_64x4d_fpn_mstrain_2x_coco.py b/configs/vfnet/vfnet_x101_64x4d_fpn_mstrain_2x_coco.py new file mode 100644 index 0000000..e51064e --- /dev/null +++ b/configs/vfnet/vfnet_x101_64x4d_fpn_mstrain_2x_coco.py @@ -0,0 +1,15 @@ +_base_ = './vfnet_r50_fpn_mstrain_2x_coco.py' +model = dict( + backbone=dict( + type='ResNeXt', + depth=101, + groups=64, + base_width=4, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://resnext101_64x4d'))) diff --git a/configs/wider_face/README.md b/configs/wider_face/README.md new file mode 100644 index 0000000..1904506 --- /dev/null +++ b/configs/wider_face/README.md @@ -0,0 +1,57 @@ +# WIDER FACE + +> [WIDER FACE: A Face Detection Benchmark](https://arxiv.org/abs/1511.06523) + + + +## Abstract + +Face detection is one of the most studied topics in the computer vision community. Much of the progresses have been made by the availability of face detection benchmark datasets. We show that there is a gap between current face detection performance and the real world requirements. To facilitate future face detection research, we introduce the WIDER FACE dataset, which is 10 times larger than existing datasets. The dataset contains rich annotations, including occlusions, poses, event categories, and face bounding boxes. Faces in the proposed dataset are extremely challenging due to large variations in scale, pose and occlusion, as shown in Fig. 1. Furthermore, we show that WIDER FACE dataset is an effective training source for face detection. We benchmark several representative detection systems, providing an overview of state-of-the-art performance and propose a solution to deal with large scale variation. Finally, we discuss common failure cases that worth to be further investigated. + +
+ +
+ +## Introduction + +To use the WIDER Face dataset you need to download it +and extract to the `data/WIDERFace` folder. Annotation in the VOC format +can be found in this [repo](https://github.com/sovrasov/wider-face-pascal-voc-annotations.git). +You should move the annotation files from `WIDER_train_annotations` and `WIDER_val_annotations` folders +to the `Annotation` folders inside the corresponding directories `WIDER_train` and `WIDER_val`. +Also annotation lists `val.txt` and `train.txt` should be copied to `data/WIDERFace` from `WIDER_train_annotations` and `WIDER_val_annotations`. +The directory should be like this: + +``` +mmdetection +├── mmdet +├── tools +├── configs +├── data +│ ├── WIDERFace +│ │ ├── WIDER_train +│ | │ ├──0--Parade +│ | │ ├── ... +│ | │ ├── Annotations +│ │ ├── WIDER_val +│ | │ ├──0--Parade +│ | │ ├── ... +│ | │ ├── Annotations +│ │ ├── val.txt +│ │ ├── train.txt + +``` + +After that you can train the SSD300 on WIDER by launching training with the `ssd300_wider_face.py` config or +create your own config based on the presented one. + +## Citation + +```latex +@inproceedings{yang2016wider, + Author = {Yang, Shuo and Luo, Ping and Loy, Chen Change and Tang, Xiaoou}, + Booktitle = {IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, + Title = {WIDER FACE: A Face Detection Benchmark}, + Year = {2016} +} +``` diff --git a/configs/wider_face/ssd300_wider_face.py b/configs/wider_face/ssd300_wider_face.py new file mode 100644 index 0000000..98d820a --- /dev/null +++ b/configs/wider_face/ssd300_wider_face.py @@ -0,0 +1,18 @@ +_base_ = [ + '../_base_/models/ssd300.py', '../_base_/datasets/wider_face.py', + '../_base_/default_runtime.py' +] +model = dict(bbox_head=dict(num_classes=1)) +# optimizer +optimizer = dict(type='SGD', lr=0.012, momentum=0.9, weight_decay=5e-4) +optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2)) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=0.001, + step=[16, 20]) +# runtime settings +runner = dict(type='EpochBasedRunner', max_epochs=24) +log_config = dict(interval=1) diff --git a/configs/yolact/README.md b/configs/yolact/README.md new file mode 100644 index 0000000..9eb51b4 --- /dev/null +++ b/configs/yolact/README.md @@ -0,0 +1,75 @@ +# YOLACT + +> [YOLACT: Real-time Instance Segmentation](https://arxiv.org/abs/1904.02689) + + + +## Abstract + +We present a simple, fully-convolutional model for real-time instance segmentation that achieves 29.8 mAP on MS COCO at 33.5 fps evaluated on a single Titan Xp, which is significantly faster than any previous competitive approach. Moreover, we obtain this result after training on only one GPU. We accomplish this by breaking instance segmentation into two parallel subtasks: (1) generating a set of prototype masks and (2) predicting per-instance mask coefficients. Then we produce instance masks by linearly combining the prototypes with the mask coefficients. We find that because this process doesn't depend on repooling, this approach produces very high-quality masks and exhibits temporal stability for free. Furthermore, we analyze the emergent behavior of our prototypes and show they learn to localize instances on their own in a translation variant manner, despite being fully-convolutional. Finally, we also propose Fast NMS, a drop-in 12 ms faster replacement for standard NMS that only has a marginal performance penalty. + +
+ +
+ +## Introduction + +A simple, fully convolutional model for real-time instance segmentation. This is the code for our paper: + +- [YOLACT: Real-time Instance Segmentation](https://arxiv.org/abs/1904.02689) + + + +For a real-time demo, check out our ICCV video: +[![IMAGE ALT TEXT HERE](https://img.youtube.com/vi/0pMfmo8qfpQ/0.jpg)](https://www.youtube.com/watch?v=0pMfmo8qfpQ) + +## Evaluation + +Here are our YOLACT models along with their FPS on a Titan Xp and mAP on COCO's `val`: + +| Image Size | GPU x BS | Backbone | \*FPS | mAP | Weights | Configs | Download | +| :--------: | :------: | :-----------: | :---: | :--: | :-----: | :----------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | +| 550 | 1x8 | Resnet50-FPN | 42.5 | 29.0 | | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/yolact/yolact_r50_1x8_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/yolact/yolact_r50_1x8_coco/yolact_r50_1x8_coco_20200908-f38d58df.pth) | +| 550 | 8x8 | Resnet50-FPN | 42.5 | 28.4 | | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/yolact/yolact_r50_8x8_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/yolact/yolact_r50_8x8_coco/yolact_r50_8x8_coco_20200908-ca34f5db.pth) | +| 550 | 1x8 | Resnet101-FPN | 33.5 | 30.4 | | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/yolact/yolact_r101_1x8_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/yolact/yolact_r101_1x8_coco/yolact_r101_1x8_coco_20200908-4cbe9101.pth) | + +\*Note: The FPS is evaluated by the [original implementation](https://github.com/dbolya/yolact). When calculating FPS, only the model inference time is taken into account. Data loading and post-processing operations such as converting masks to RLE code, generating COCO JSON results, image rendering are not included. + +## Training + +All the aforementioned models are trained with a single GPU. It typically takes ~12GB VRAM when using resnet-101 as the backbone. If you want to try multiple GPUs training, you may have to modify the configuration files accordingly, such as adjusting the training schedule and freezing batch norm. + +```Shell +# Trains using the resnet-101 backbone with a batch size of 8 on a single GPU. +./tools/dist_train.sh configs/yolact/yolact_r101.py 1 +``` + +## Testing + +Please refer to [mmdetection/docs/getting_started.md](https://mmdetection.readthedocs.io/en/latest/1_exist_data_model.html#test-existing-models). + +## Citation + +If you use YOLACT or this code base in your work, please cite + +```latex +@inproceedings{yolact-iccv2019, + author = {Daniel Bolya and Chong Zhou and Fanyi Xiao and Yong Jae Lee}, + title = {YOLACT: {Real-time} Instance Segmentation}, + booktitle = {ICCV}, + year = {2019}, +} +``` + + diff --git a/configs/yolact/metafile.yml b/configs/yolact/metafile.yml new file mode 100644 index 0000000..e7019ae --- /dev/null +++ b/configs/yolact/metafile.yml @@ -0,0 +1,78 @@ +Collections: + - Name: YOLACT + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - FPN + - ResNet + Paper: + URL: https://arxiv.org/abs/1904.02689 + Title: 'YOLACT: Real-time Instance Segmentation' + README: configs/yolact/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.5.0/mmdet/models/detectors/yolact.py#L9 + Version: v2.5.0 + +Models: + - Name: yolact_r50_1x8_coco + In Collection: YOLACT + Config: configs/yolact/yolact_r50_1x8_coco.py + Metadata: + Training Resources: 1x V100 GPU + Batch Size: 8 + inference time (ms/im): + - value: 23.53 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (550, 550) + Results: + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 29.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/yolact/yolact_r50_1x8_coco/yolact_r50_1x8_coco_20200908-f38d58df.pth + + - Name: yolact_r50_8x8_coco + In Collection: YOLACT + Config: configs/yolact/yolact_r50_8x8_coco.py + Metadata: + Batch Size: 64 + inference time (ms/im): + - value: 23.53 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (550, 550) + Results: + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 28.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/yolact/yolact_r50_8x8_coco/yolact_r50_8x8_coco_20200908-ca34f5db.pth + + - Name: yolact_r101_1x8_coco + In Collection: YOLACT + Config: configs/yolact/yolact_r101_1x8_coco.py + Metadata: + Training Resources: 1x V100 GPU + Batch Size: 8 + inference time (ms/im): + - value: 29.85 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (550, 550) + Results: + - Task: Instance Segmentation + Dataset: COCO + Metrics: + mask AP: 30.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/yolact/yolact_r101_1x8_coco/yolact_r101_1x8_coco_20200908-4cbe9101.pth diff --git a/configs/yolact/yolact_r101_1x8_coco.py b/configs/yolact/yolact_r101_1x8_coco.py new file mode 100644 index 0000000..532631d --- /dev/null +++ b/configs/yolact/yolact_r101_1x8_coco.py @@ -0,0 +1,7 @@ +_base_ = './yolact_r50_1x8_coco.py' + +model = dict( + backbone=dict( + depth=101, + init_cfg=dict(type='Pretrained', + checkpoint='torchvision://resnet101'))) diff --git a/configs/yolact/yolact_r50_1x8_coco.py b/configs/yolact/yolact_r50_1x8_coco.py new file mode 100644 index 0000000..dc11613 --- /dev/null +++ b/configs/yolact/yolact_r50_1x8_coco.py @@ -0,0 +1,165 @@ +_base_ = '../_base_/default_runtime.py' + +# model settings +img_size = 550 +model = dict( + type='YOLACT', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=-1, # do not freeze stem + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=False, # update the statistics of bn + zero_init_residual=False, + style='pytorch', + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), + neck=dict( + type='FPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + start_level=1, + add_extra_convs='on_input', + num_outs=5, + upsample_cfg=dict(mode='bilinear')), + bbox_head=dict( + type='YOLACTHead', + num_classes=80, + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=3, + scales_per_octave=1, + base_sizes=[8, 16, 32, 64, 128], + ratios=[0.5, 1.0, 2.0], + strides=[550.0 / x for x in [69, 35, 18, 9, 5]], + centers=[(550 * 0.5 / x, 550 * 0.5 / x) + for x in [69, 35, 18, 9, 5]]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + reduction='none', + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.5), + num_head_convs=1, + num_protos=32, + use_ohem=True), + mask_head=dict( + type='YOLACTProtonet', + in_channels=256, + num_protos=32, + num_classes=80, + max_masks_to_train=100, + loss_mask_weight=6.125), + segm_head=dict( + type='YOLACTSegmHead', + num_classes=80, + in_channels=256, + loss_segm=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0., + ignore_iof_thr=-1, + gt_max_assign_all=False), + # smoothl1_beta=1., + allowed_border=-1, + pos_weight=-1, + neg_pos_ratio=3, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + iou_thr=0.5, + top_k=200, + max_per_img=100)) +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.68, 116.78, 103.94], std=[58.40, 57.12, 57.38], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict(type='FilterAnnotations', min_gt_bbox_wh=(4.0, 4.0)), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 4)), + dict( + type='MinIoURandomCrop', + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(img_size, img_size), keep_ratio=False), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='PhotoMetricDistortion', + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18), + dict(type='Normalize', **img_norm_cfg), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(img_size, img_size), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=False), + dict(type='Normalize', **img_norm_cfg), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, + workers_per_gpu=4, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='SGD', lr=1e-3, momentum=0.9, weight_decay=5e-4) +optimizer_config = dict() +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.1, + step=[20, 42, 49, 52]) +runner = dict(type='EpochBasedRunner', max_epochs=55) +# cudnn_benchmark = True +evaluation = dict(metric=['bbox', 'segm']) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (1 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=8) diff --git a/configs/yolact/yolact_r50_8x8_coco.py b/configs/yolact/yolact_r50_8x8_coco.py new file mode 100644 index 0000000..41003ab --- /dev/null +++ b/configs/yolact/yolact_r50_8x8_coco.py @@ -0,0 +1,16 @@ +_base_ = 'yolact_r50_1x8_coco.py' + +optimizer = dict(type='SGD', lr=8e-3, momentum=0.9, weight_decay=5e-4) +optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2)) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=1000, + warmup_ratio=0.1, + step=[20, 42, 49, 52]) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/yolo/README.md b/configs/yolo/README.md new file mode 100644 index 0000000..c9eb8a6 --- /dev/null +++ b/configs/yolo/README.md @@ -0,0 +1,55 @@ +# YOLOv3 + +> [YOLOv3: An Incremental Improvement](https://arxiv.org/abs/1804.02767) + + + +## Abstract + +We present some updates to YOLO! We made a bunch of little design changes to make it better. We also trained this new network that's pretty swell. It's a little bigger than last time but more accurate. It's still fast though, don't worry. At 320x320 YOLOv3 runs in 22 ms at 28.2 mAP, as accurate as SSD but three times faster. When we look at the old .5 IOU mAP detection metric YOLOv3 is quite good. It achieves 57.9 mAP@50 in 51 ms on a Titan X, compared to 57.5 mAP@50 in 198 ms by RetinaNet, similar performance but 3.8x faster. + +
+ +
+ +## Results and Models + +| Backbone | Scale | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :--------: | :---: | :-----: | :------: | :------------: | :----: | :--------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| DarkNet-53 | 320 | 273e | 2.7 | 63.9 | 27.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolo/yolov3_d53_320_273e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/yolo/yolov3_d53_320_273e_coco/yolov3_d53_320_273e_coco-421362b6.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/yolo/yolov3_d53_320_273e_coco/yolov3_d53_320_273e_coco-20200819_172101.log.json) | +| DarkNet-53 | 416 | 273e | 3.8 | 61.2 | 30.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolo/yolov3_d53_mstrain-416_273e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/yolo/yolov3_d53_mstrain-416_273e_coco/yolov3_d53_mstrain-416_273e_coco-2b60fcd9.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/yolo/yolov3_d53_mstrain-416_273e_coco/yolov3_d53_mstrain-416_273e_coco-20200819_173424.log.json) | +| DarkNet-53 | 608 | 273e | 7.4 | 48.1 | 33.7 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolo/yolov3_d53_mstrain-608_273e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/yolo/yolov3_d53_mstrain-608_273e_coco/yolov3_d53_mstrain-608_273e_coco_20210518_115020-a2c3acb8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/yolo/yolov3_d53_mstrain-608_273e_coco/yolov3_d53_mstrain-608_273e_coco_20210518_115020.log.json) | + +## Mixed Precision Training + +We also train YOLOv3 with mixed precision training. + +| Backbone | Scale | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :--------: | :---: | :-----: | :------: | :------------: | :----: | :-------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| DarkNet-53 | 608 | 273e | 4.7 | 48.1 | 33.8 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolo/yolov3_d53_fp16_mstrain-608_273e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/yolo/yolov3_d53_fp16_mstrain-608_273e_coco/yolov3_d53_fp16_mstrain-608_273e_coco_20210517_213542-4bc34944.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/yolo/yolov3_d53_fp16_mstrain-608_273e_coco/yolov3_d53_fp16_mstrain-608_273e_coco_20210517_213542.log.json) | + +## Lightweight models + +| Backbone | Scale | Lr schd | Mem (GB) | Inf time (fps) | box AP | Config | Download | +| :---------: | :---: | :-----: | :------: | :------------: | :----: | :----------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| MobileNetV2 | 416 | 300e | 5.3 | | 23.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolo/yolov3_mobilenetv2_mstrain-416_300e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/yolo/yolov3_mobilenetv2_mstrain-416_300e_coco/yolov3_mobilenetv2_mstrain-416_300e_coco_20210718_010823-f68a07b3.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/yolo/yolov3_mobilenetv2_mstrain-416_300e_coco/yolov3_mobilenetv2_mstrain-416_300e_coco_20210718_010823.log.json) | +| MobileNetV2 | 320 | 300e | 3.2 | | 22.2 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolo/yolov3_mobilenetv2_320_300e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/yolo/yolov3_mobilenetv2_320_300e_coco/yolov3_mobilenetv2_320_300e_coco_20210719_215349-d18dff72.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/yolo/yolov3_mobilenetv2_320_300e_coco/yolov3_mobilenetv2_320_300e_coco_20210719_215349.log.json) | + +Notice: We reduce the number of channels to 96 in both head and neck. It can reduce the flops and parameters, which makes these models more suitable for edge devices. + +## Credit + +This implementation originates from the project of Haoyu Wu(@wuhy08) at Western Digital. + +## Citation + +```latex +@misc{redmon2018yolov3, + title={YOLOv3: An Incremental Improvement}, + author={Joseph Redmon and Ali Farhadi}, + year={2018}, + eprint={1804.02767}, + archivePrefix={arXiv}, + primaryClass={cs.CV} +} +``` diff --git a/configs/yolo/metafile.yml b/configs/yolo/metafile.yml new file mode 100644 index 0000000..22c35da --- /dev/null +++ b/configs/yolo/metafile.yml @@ -0,0 +1,124 @@ +Collections: + - Name: YOLOv3 + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - DarkNet + Paper: + URL: https://arxiv.org/abs/1804.02767 + Title: 'YOLOv3: An Incremental Improvement' + README: configs/yolo/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.4.0/mmdet/models/detectors/yolo.py#L8 + Version: v2.4.0 + +Models: + - Name: yolov3_d53_320_273e_coco + In Collection: YOLOv3 + Config: configs/yolo/yolov3_d53_320_273e_coco.py + Metadata: + Training Memory (GB): 2.7 + inference time (ms/im): + - value: 15.65 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (320, 320) + Epochs: 273 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 27.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/yolo/yolov3_d53_320_273e_coco/yolov3_d53_320_273e_coco-421362b6.pth + + - Name: yolov3_d53_mstrain-416_273e_coco + In Collection: YOLOv3 + Config: configs/yolo/yolov3_d53_mstrain-416_273e_coco.py + Metadata: + Training Memory (GB): 3.8 + inference time (ms/im): + - value: 16.34 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (416, 416) + Epochs: 273 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 30.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/yolo/yolov3_d53_mstrain-416_273e_coco/yolov3_d53_mstrain-416_273e_coco-2b60fcd9.pth + + - Name: yolov3_d53_mstrain-608_273e_coco + In Collection: YOLOv3 + Config: configs/yolo/yolov3_d53_mstrain-608_273e_coco.py + Metadata: + Training Memory (GB): 7.4 + inference time (ms/im): + - value: 20.79 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP32 + resolution: (608, 608) + Epochs: 273 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 33.7 + Weights: https://download.openmmlab.com/mmdetection/v2.0/yolo/yolov3_d53_mstrain-608_273e_coco/yolov3_d53_mstrain-608_273e_coco_20210518_115020-a2c3acb8.pth + + - Name: yolov3_d53_fp16_mstrain-608_273e_coco + In Collection: YOLOv3 + Config: configs/yolo/yolov3_d53_fp16_mstrain-608_273e_coco.py + Metadata: + Training Memory (GB): 4.7 + inference time (ms/im): + - value: 20.79 + hardware: V100 + backend: PyTorch + batch size: 1 + mode: FP16 + resolution: (608, 608) + Epochs: 273 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 33.8 + Weights: https://download.openmmlab.com/mmdetection/v2.0/yolo/yolov3_d53_fp16_mstrain-608_273e_coco/yolov3_d53_fp16_mstrain-608_273e_coco_20210517_213542-4bc34944.pth + + - Name: yolov3_mobilenetv2_320_300e_coco + In Collection: YOLOv3 + Config: configs/yolo/yolov3_mobilenetv2_320_300e_coco.py + Metadata: + Training Memory (GB): 3.2 + Epochs: 300 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 22.2 + Weights: https://download.openmmlab.com/mmdetection/v2.0/yolo/yolov3_mobilenetv2_320_300e_coco/yolov3_mobilenetv2_320_300e_coco_20210719_215349-d18dff72.pth + + - Name: yolov3_mobilenetv2_mstrain-416_300e_coco + In Collection: YOLOv3 + Config: configs/yolo/yolov3_mobilenetv2_mstrain-416_300e_coco.py + Metadata: + Training Memory (GB): 5.3 + Epochs: 300 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 23.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/yolo/yolov3_mobilenetv2_mstrain-416_300e_coco/yolov3_mobilenetv2_mstrain-416_300e_coco_20210718_010823-f68a07b3.pth diff --git a/configs/yolo/yolov3_d53_320_273e_coco.py b/configs/yolo/yolov3_d53_320_273e_coco.py new file mode 100644 index 0000000..d4785e3 --- /dev/null +++ b/configs/yolo/yolov3_d53_320_273e_coco.py @@ -0,0 +1,42 @@ +_base_ = './yolov3_d53_mstrain-608_273e_coco.py' +# dataset settings +img_norm_cfg = dict(mean=[0, 0, 0], std=[255., 255., 255.], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 2)), + dict( + type='MinIoURandomCrop', + min_ious=(0.4, 0.5, 0.6, 0.7, 0.8, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(320, 320), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(320, 320), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/yolo/yolov3_d53_fp16_mstrain-608_273e_coco.py b/configs/yolo/yolov3_d53_fp16_mstrain-608_273e_coco.py new file mode 100644 index 0000000..4ef2422 --- /dev/null +++ b/configs/yolo/yolov3_d53_fp16_mstrain-608_273e_coco.py @@ -0,0 +1,3 @@ +_base_ = './yolov3_d53_mstrain-608_273e_coco.py' +# fp16 settings +fp16 = dict(loss_scale='dynamic') diff --git a/configs/yolo/yolov3_d53_mstrain-416_273e_coco.py b/configs/yolo/yolov3_d53_mstrain-416_273e_coco.py new file mode 100644 index 0000000..94325c5 --- /dev/null +++ b/configs/yolo/yolov3_d53_mstrain-416_273e_coco.py @@ -0,0 +1,42 @@ +_base_ = './yolov3_d53_mstrain-608_273e_coco.py' +# dataset settings +img_norm_cfg = dict(mean=[0, 0, 0], std=[255., 255., 255.], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 2)), + dict( + type='MinIoURandomCrop', + min_ious=(0.4, 0.5, 0.6, 0.7, 0.8, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=[(320, 320), (416, 416)], keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(416, 416), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/yolo/yolov3_d53_mstrain-608_273e_coco.py b/configs/yolo/yolov3_d53_mstrain-608_273e_coco.py new file mode 100644 index 0000000..58a9387 --- /dev/null +++ b/configs/yolo/yolov3_d53_mstrain-608_273e_coco.py @@ -0,0 +1,132 @@ +_base_ = '../_base_/default_runtime.py' +# model settings +model = dict( + type='YOLOV3', + backbone=dict( + type='Darknet', + depth=53, + out_indices=(3, 4, 5), + init_cfg=dict(type='Pretrained', checkpoint='open-mmlab://darknet53')), + neck=dict( + type='YOLOV3Neck', + num_scales=3, + in_channels=[1024, 512, 256], + out_channels=[512, 256, 128]), + bbox_head=dict( + type='YOLOV3Head', + num_classes=80, + in_channels=[512, 256, 128], + out_channels=[1024, 512, 256], + anchor_generator=dict( + type='YOLOAnchorGenerator', + base_sizes=[[(116, 90), (156, 198), (373, 326)], + [(30, 61), (62, 45), (59, 119)], + [(10, 13), (16, 30), (33, 23)]], + strides=[32, 16, 8]), + bbox_coder=dict(type='YOLOBBoxCoder'), + featmap_strides=[32, 16, 8], + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=1.0, + reduction='sum'), + loss_conf=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=1.0, + reduction='sum'), + loss_xy=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=2.0, + reduction='sum'), + loss_wh=dict(type='MSELoss', loss_weight=2.0, reduction='sum')), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='GridAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0)), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + conf_thr=0.005, + nms=dict(type='nms', iou_threshold=0.45), + max_per_img=100)) +# dataset settings +dataset_type = 'CocoDataset' +data_root = '/data/dongzhiwei1/dataset/coco2017/' +img_norm_cfg = dict(mean=[0, 0, 0], std=[255., 255., 255.], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile', to_float32=True), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 2)), + dict( + type='MinIoURandomCrop', + min_ious=(0.4, 0.5, 0.6, 0.7, 0.8, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=[(320, 320), (608, 608)], keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(608, 608), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) +] +data = dict( + samples_per_gpu=16, + workers_per_gpu=8, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='SGD', lr=0.001, momentum=0.9, weight_decay=0.0005) +optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2)) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=2000, # same as burn-in in darknet + warmup_ratio=0.1, + step=[218, 246]) +# runtime settings +runner = dict(type='EpochBasedRunner', max_epochs=273) +evaluation = dict(interval=1, metric=['bbox']) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/yolo/yolov3_mobilenetv2_320_300e_coco.py b/configs/yolo/yolov3_mobilenetv2_320_300e_coco.py new file mode 100644 index 0000000..477d253 --- /dev/null +++ b/configs/yolo/yolov3_mobilenetv2_320_300e_coco.py @@ -0,0 +1,53 @@ +_base_ = ['./yolov3_mobilenetv2_mstrain-416_300e_coco.py'] + +# yapf:disable +model = dict( + bbox_head=dict( + anchor_generator=dict( + base_sizes=[[(220, 125), (128, 222), (264, 266)], + [(35, 87), (102, 96), (60, 170)], + [(10, 15), (24, 36), (72, 42)]]))) +# yapf:enable + +# dataset settings +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 2)), + dict( + type='MinIoURandomCrop', + min_ious=(0.4, 0.5, 0.6, 0.7, 0.8, 0.9), + min_crop_size=0.3), + dict(type='Resize', img_scale=(320, 320), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(320, 320), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img']) + ]) +] +data = dict( + train=dict(dataset=dict(pipeline=train_pipeline)), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) diff --git a/configs/yolo/yolov3_mobilenetv2_mstrain-416_300e_coco.py b/configs/yolo/yolov3_mobilenetv2_mstrain-416_300e_coco.py new file mode 100644 index 0000000..18e0622 --- /dev/null +++ b/configs/yolo/yolov3_mobilenetv2_mstrain-416_300e_coco.py @@ -0,0 +1,142 @@ +_base_ = '../_base_/default_runtime.py' +# model settings +model = dict( + type='YOLOV3', + backbone=dict( + type='MobileNetV2', + out_indices=(2, 4, 6), + act_cfg=dict(type='LeakyReLU', negative_slope=0.1), + init_cfg=dict( + type='Pretrained', checkpoint='open-mmlab://mmdet/mobilenet_v2')), + neck=dict( + type='YOLOV3Neck', + num_scales=3, + in_channels=[320, 96, 32], + out_channels=[96, 96, 96]), + bbox_head=dict( + type='YOLOV3Head', + num_classes=80, + in_channels=[96, 96, 96], + out_channels=[96, 96, 96], + anchor_generator=dict( + type='YOLOAnchorGenerator', + base_sizes=[[(116, 90), (156, 198), (373, 326)], + [(30, 61), (62, 45), (59, 119)], + [(10, 13), (16, 30), (33, 23)]], + strides=[32, 16, 8]), + bbox_coder=dict(type='YOLOBBoxCoder'), + featmap_strides=[32, 16, 8], + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=1.0, + reduction='sum'), + loss_conf=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=1.0, + reduction='sum'), + loss_xy=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=2.0, + reduction='sum'), + loss_wh=dict(type='MSELoss', loss_weight=2.0, reduction='sum')), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='GridAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0)), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + conf_thr=0.005, + nms=dict(type='nms', iou_threshold=0.45), + max_per_img=100)) +# dataset settings +dataset_type = 'CocoDataset' +data_root = 'data/coco/' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict( + type='Expand', + mean=img_norm_cfg['mean'], + to_rgb=img_norm_cfg['to_rgb'], + ratio_range=(1, 2)), + dict( + type='MinIoURandomCrop', + min_ious=(0.4, 0.5, 0.6, 0.7, 0.8, 0.9), + min_crop_size=0.3), + dict( + type='Resize', + img_scale=[(320, 320), (416, 416)], + multiscale_mode='range', + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='PhotoMetricDistortion'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(416, 416), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img']) + ]) +] +data = dict( + samples_per_gpu=24, + workers_per_gpu=4, + train=dict( + type='RepeatDataset', # use RepeatDataset to speed up training + times=10, + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline)), + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +# optimizer +optimizer = dict(type='SGD', lr=0.003, momentum=0.9, weight_decay=0.0005) +optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2)) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=4000, + warmup_ratio=0.0001, + step=[24, 28]) +# runtime settings +runner = dict(type='EpochBasedRunner', max_epochs=30) +evaluation = dict(interval=1, metric=['bbox']) +find_unused_parameters = True + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (24 samples per GPU) +auto_scale_lr = dict(base_batch_size=192) diff --git a/configs/yolof/README.md b/configs/yolof/README.md new file mode 100644 index 0000000..e88da02 --- /dev/null +++ b/configs/yolof/README.md @@ -0,0 +1,35 @@ +# YOLOF + +> [You Only Look One-level Feature](https://arxiv.org/abs/2103.09460) + + + +## Abstract + +This paper revisits feature pyramids networks (FPN) for one-stage detectors and points out that the success of FPN is due to its divide-and-conquer solution to the optimization problem in object detection rather than multi-scale feature fusion. From the perspective of optimization, we introduce an alternative way to address the problem instead of adopting the complex feature pyramids - {\\em utilizing only one-level feature for detection}. Based on the simple and efficient solution, we present You Only Look One-level Feature (YOLOF). In our method, two key components, Dilated Encoder and Uniform Matching, are proposed and bring considerable improvements. Extensive experiments on the COCO benchmark prove the effectiveness of the proposed model. Our YOLOF achieves comparable results with its feature pyramids counterpart RetinaNet while being 2.5× faster. Without transformer layers, YOLOF can match the performance of DETR in a single-level feature manner with 7× less training epochs. With an image size of 608×608, YOLOF achieves 44.3 mAP running at 60 fps on 2080Ti, which is 13% faster than YOLOv4. + +
+ +
+ +## Results and Models + +| Backbone | Style | Epoch | Lr schd | Mem (GB) | box AP | Config | Download | +| :------: | :---: | :---: | :-----: | :------: | :----: | :-------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| R-50-C5 | caffe | Y | 1x | 8.3 | 37.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolof/yolof_r50_c5_8x8_1x_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/yolof/yolof_r50_c5_8x8_1x_coco/yolof_r50_c5_8x8_1x_coco_20210425_024427-8e864411.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/yolof/yolof_r50_c5_8x8_1x_coco/yolof_r50_c5_8x8_1x_coco_20210425_024427.log.json) | + +**Note**: + +1. We find that the performance is unstable and may fluctuate by about 0.3 mAP. mAP 37.4 ~ 37.7 is acceptable in YOLOF_R_50_C5_1x. Such fluctuation can also be found in the [original implementation](https://github.com/chensnathan/YOLOF). +2. In addition to instability issues, sometimes there are large loss fluctuations and NAN, so there may still be problems with this project, which will be improved subsequently. + +## Citation + +```latex +@inproceedings{chen2021you, + title={You Only Look One-level Feature}, + author={Chen, Qiang and Wang, Yingming and Yang, Tong and Zhang, Xiangyu and Cheng, Jian and Sun, Jian}, + booktitle={IEEE Conference on Computer Vision and Pattern Recognition}, + year={2021} +} +``` diff --git a/configs/yolof/metafile.yml b/configs/yolof/metafile.yml new file mode 100644 index 0000000..9436fee --- /dev/null +++ b/configs/yolof/metafile.yml @@ -0,0 +1,32 @@ +Collections: + - Name: YOLOF + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Momentum + - Weight Decay + Training Resources: 8x V100 GPUs + Architecture: + - Dilated Encoder + - ResNet + Paper: + URL: https://arxiv.org/abs/2103.09460 + Title: 'You Only Look One-level Feature' + README: configs/yolof/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.12.0/mmdet/models/detectors/yolof.py#L6 + Version: v2.12.0 + +Models: + - Name: yolof_r50_c5_8x8_1x_coco + In Collection: YOLOF + Config: configs/yolof/yolof_r50_c5_8x8_1x_coco.py + Metadata: + Training Memory (GB): 8.3 + Epochs: 12 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 37.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/yolof/yolof_r50_c5_8x8_1x_coco/yolof_r50_c5_8x8_1x_coco_20210425_024427-8e864411.pth diff --git a/configs/yolof/yolof_r50_c5_8x8_1x_coco.py b/configs/yolof/yolof_r50_c5_8x8_1x_coco.py new file mode 100644 index 0000000..d0b9649 --- /dev/null +++ b/configs/yolof/yolof_r50_c5_8x8_1x_coco.py @@ -0,0 +1,111 @@ +_base_ = [ + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + type='YOLOF', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(3, ), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='caffe', + init_cfg=dict( + type='Pretrained', + checkpoint='open-mmlab://detectron/resnet50_caffe')), + neck=dict( + type='DilatedEncoder', + in_channels=2048, + out_channels=512, + block_mid_channels=128, + num_residual_blocks=4, + block_dilations=[2, 4, 6, 8]), + bbox_head=dict( + type='YOLOFHead', + num_classes=80, + in_channels=512, + reg_decoded_bbox=True, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[1, 2, 4, 8, 16], + strides=[32]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1., 1., 1., 1.], + add_ctr_clamp=True, + ctr_clamp=32), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=1.0)), + # training and testing settings + train_cfg=dict( + assigner=dict( + type='UniformAssigner', pos_ignore_thr=0.15, neg_ignore_thr=0.7), + allowed_border=-1, + pos_weight=-1, + debug=False), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) +# optimizer +optimizer = dict( + type='SGD', + lr=0.12, + momentum=0.9, + weight_decay=0.0001, + paramwise_cfg=dict( + norm_decay_mult=0., custom_keys={'backbone': dict(lr_mult=1. / 3)})) +lr_config = dict(warmup_iters=1500, warmup_ratio=0.00066667) + +# use caffe img_norm +img_norm_cfg = dict( + mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='RandomShift', shift_ratio=0.5, max_shift_px=32), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + samples_per_gpu=8, + workers_per_gpu=8, + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/yolof/yolof_r50_c5_8x8_iter-1x_coco.py b/configs/yolof/yolof_r50_c5_8x8_iter-1x_coco.py new file mode 100644 index 0000000..c95c02d --- /dev/null +++ b/configs/yolof/yolof_r50_c5_8x8_iter-1x_coco.py @@ -0,0 +1,14 @@ +_base_ = './yolof_r50_c5_8x8_1x_coco.py' + +# We implemented the iter-based config according to the source code. +# COCO dataset has 117266 images after filtering. We use 8 gpu and +# 8 batch size training, so 22500 is equivalent to +# 22500/(117266/(8x8))=12.3 epoch, 15000 is equivalent to 8.2 epoch, +# 20000 is equivalent to 10.9 epoch. Due to lr(0.12) is large, +# the iter-based and epoch-based setting have about 0.2 difference on +# the mAP evaluation value. +lr_config = dict(step=[15000, 20000]) +runner = dict(_delete_=True, type='IterBasedRunner', max_iters=22500) +checkpoint_config = dict(interval=2500) +evaluation = dict(interval=4500) +log_config = dict(interval=20) diff --git a/configs/yolox/README.md b/configs/yolox/README.md new file mode 100644 index 0000000..4890fbd --- /dev/null +++ b/configs/yolox/README.md @@ -0,0 +1,39 @@ +# YOLOX + +> [YOLOX: Exceeding YOLO Series in 2021](https://arxiv.org/abs/2107.08430) + + + +## Abstract + +In this report, we present some experienced improvements to YOLO series, forming a new high-performance detector -- YOLOX. We switch the YOLO detector to an anchor-free manner and conduct other advanced detection techniques, i.e., a decoupled head and the leading label assignment strategy SimOTA to achieve state-of-the-art results across a large scale range of models: For YOLO-Nano with only 0.91M parameters and 1.08G FLOPs, we get 25.3% AP on COCO, surpassing NanoDet by 1.8% AP; for YOLOv3, one of the most widely used detectors in industry, we boost it to 47.3% AP on COCO, outperforming the current best practice by 3.0% AP; for YOLOX-L with roughly the same amount of parameters as YOLOv4-CSP, YOLOv5-L, we achieve 50.0% AP on COCO at a speed of 68.9 FPS on Tesla V100, exceeding YOLOv5-L by 1.8% AP. Further, we won the 1st Place on Streaming Perception Challenge (Workshop on Autonomous Driving at CVPR 2021) using a single YOLOX-L model. We hope this report can provide useful experience for developers and researchers in practical scenes, and we also provide deploy versions with ONNX, TensorRT, NCNN, and Openvino supported. + +
+ +
+ +## Results and Models + +| Backbone | size | Mem (GB) | box AP | Config | Download | +| :--------: | :--: | :------: | :----: | :-------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| YOLOX-tiny | 416 | 3.5 | 32.0 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolox/yolox_tiny_8x8_300e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/yolox/yolox_tiny_8x8_300e_coco/yolox_tiny_8x8_300e_coco_20211124_171234-b4047906.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/yolox/yolox_tiny_8x8_300e_coco/yolox_tiny_8x8_300e_coco_20211124_171234.log.json) | +| YOLOX-s | 640 | 7.6 | 40.5 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolox/yolox_s_8x8_300e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/yolox/yolox_s_8x8_300e_coco/yolox_s_8x8_300e_coco_20211121_095711-4592a793.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/yolox/yolox_s_8x8_300e_coco/yolox_s_8x8_300e_coco_20211121_095711.log.json) | +| YOLOX-l | 640 | 19.9 | 49.4 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolox/yolox_l_8x8_300e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/yolox/yolox_l_8x8_300e_coco/yolox_l_8x8_300e_coco_20211126_140236-d3bd2b23.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/yolox/yolox_l_8x8_300e_coco/yolox_l_8x8_300e_coco_20211126_140236.log.json) | +| YOLOX-x | 640 | 28.1 | 50.9 | [config](https://github.com/open-mmlab/mmdetection/tree/master/configs/yolox/yolox_x_8x8_300e_coco.py) | [model](https://download.openmmlab.com/mmdetection/v2.0/yolox/yolox_x_8x8_300e_coco/yolox_x_8x8_300e_coco_20211126_140254-1ef88d67.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/yolox/yolox_x_8x8_300e_coco/yolox_x_8x8_300e_coco_20211126_140254.log.json) | + +**Note**: + +1. The test score threshold is 0.001, and the box AP indicates the best AP. +2. Due to the need for pre-training weights, we cannot reproduce the performance of the `yolox-nano` model. Please refer to https://github.com/Megvii-BaseDetection/YOLOX/issues/674 for more information. +3. We also trained the model by the official release of YOLOX based on [Megvii-BaseDetection/YOLOX#735](https://github.com/Megvii-BaseDetection/YOLOX/issues/735) with commit ID [38c633](https://github.com/Megvii-BaseDetection/YOLOX/tree/38c633bf176462ee42b110c70e4ffe17b5753208). We found that the best AP of `YOLOX-tiny`, `YOLOX-s`, `YOLOX-l`, and `YOLOX-x` is 31.8, 40.3, 49.2, and 50.9, respectively. The performance is consistent with that of our re-implementation (see Table above) but still has a gap (0.3~0.8 AP) in comparison with the reported performance in their [README](https://github.com/Megvii-BaseDetection/YOLOX/blob/38c633bf176462ee42b110c70e4ffe17b5753208/README.md#benchmark). + +## Citation + +```latex +@article{yolox2021, + title={{YOLOX}: Exceeding YOLO Series in 2021}, + author={Ge, Zheng and Liu, Songtao and Wang, Feng and Li, Zeming and Sun, Jian}, + journal={arXiv preprint arXiv:2107.08430}, + year={2021} +} +``` diff --git a/configs/yolox/metafile.yml b/configs/yolox/metafile.yml new file mode 100644 index 0000000..845cb0a --- /dev/null +++ b/configs/yolox/metafile.yml @@ -0,0 +1,70 @@ +Collections: + - Name: YOLOX + Metadata: + Training Data: COCO + Training Techniques: + - SGD with Nesterov + - Weight Decay + - Cosine Annealing Lr Updater + Training Resources: 8x TITANXp GPUs + Architecture: + - CSPDarkNet + - PAFPN + Paper: + URL: https://arxiv.org/abs/2107.08430 + Title: 'YOLOX: Exceeding YOLO Series in 2021' + README: configs/yolox/README.md + Code: + URL: https://github.com/open-mmlab/mmdetection/blob/v2.15.1/mmdet/models/detectors/yolox.py#L6 + Version: v2.15.1 + + +Models: + - Name: yolox_s_8x8_300e_coco + In Collection: YOLOX + Config: configs/yolox/yolox_s_8x8_300e_coco.py + Metadata: + Training Memory (GB): 7.6 + Epochs: 300 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 40.5 + Weights: https://download.openmmlab.com/mmdetection/v2.0/yolox/yolox_s_8x8_300e_coco/yolox_s_8x8_300e_coco_20211121_095711-4592a793.pth + - Name: yolox_l_8x8_300e_coco + In Collection: YOLOX + Config: configs/yolox/yolox_l_8x8_300e_coco.py + Metadata: + Training Memory (GB): 19.9 + Epochs: 300 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 49.4 + Weights: https://download.openmmlab.com/mmdetection/v2.0/yolox/yolox_l_8x8_300e_coco/yolox_l_8x8_300e_coco_20211126_140236-d3bd2b23.pth + - Name: yolox_x_8x8_300e_coco + In Collection: YOLOX + Config: configs/yolox/yolox_x_8x8_300e_coco.py + Metadata: + Training Memory (GB): 28.1 + Epochs: 300 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 50.9 + Weights: https://download.openmmlab.com/mmdetection/v2.0/yolox/yolox_x_8x8_300e_coco/yolox_x_8x8_300e_coco_20211126_140254-1ef88d67.pth + - Name: yolox_tiny_8x8_300e_coco + In Collection: YOLOX + Config: configs/yolox/yolox_tiny_8x8_300e_coco.py + Metadata: + Training Memory (GB): 3.5 + Epochs: 300 + Results: + - Task: Object Detection + Dataset: COCO + Metrics: + box AP: 32.0 + Weights: https://download.openmmlab.com/mmdetection/v2.0/yolox/yolox_tiny_8x8_300e_coco/yolox_tiny_8x8_300e_coco_20211124_171234-b4047906.pth diff --git a/configs/yolox/yolox_l_8x8_300e_coco.py b/configs/yolox/yolox_l_8x8_300e_coco.py new file mode 100644 index 0000000..dcbfa18 --- /dev/null +++ b/configs/yolox/yolox_l_8x8_300e_coco.py @@ -0,0 +1,8 @@ +_base_ = './yolox_s_8x8_300e_coco.py' + +# model settings +model = dict( + backbone=dict(deepen_factor=1.0, widen_factor=1.0), + neck=dict( + in_channels=[256, 512, 1024], out_channels=256, num_csp_blocks=3), + bbox_head=dict(in_channels=256, feat_channels=256)) diff --git a/configs/yolox/yolox_m_8x8_300e_coco.py b/configs/yolox/yolox_m_8x8_300e_coco.py new file mode 100644 index 0000000..3048c95 --- /dev/null +++ b/configs/yolox/yolox_m_8x8_300e_coco.py @@ -0,0 +1,8 @@ +_base_ = './yolox_s_8x8_300e_coco.py' + +# model settings +model = dict( + backbone=dict(deepen_factor=0.67, widen_factor=0.75), + neck=dict(in_channels=[192, 384, 768], out_channels=192, num_csp_blocks=2), + bbox_head=dict(in_channels=192, feat_channels=192), +) diff --git a/configs/yolox/yolox_nano_8x8_300e_coco.py b/configs/yolox/yolox_nano_8x8_300e_coco.py new file mode 100644 index 0000000..d33ed04 --- /dev/null +++ b/configs/yolox/yolox_nano_8x8_300e_coco.py @@ -0,0 +1,11 @@ +_base_ = './yolox_tiny_8x8_300e_coco.py' + +# model settings +model = dict( + backbone=dict(deepen_factor=0.33, widen_factor=0.25, use_depthwise=True), + neck=dict( + in_channels=[64, 128, 256], + out_channels=64, + num_csp_blocks=1, + use_depthwise=True), + bbox_head=dict(in_channels=64, feat_channels=64, use_depthwise=True)) diff --git a/configs/yolox/yolox_quant_general.py b/configs/yolox/yolox_quant_general.py new file mode 100644 index 0000000..fe68e91 --- /dev/null +++ b/configs/yolox/yolox_quant_general.py @@ -0,0 +1,39 @@ +trace_config = dict( + backbone_detail = dict( + input_concrete_args = dict(), + preserve_attr = ['arch_settings', 'dump_patches', 'frozen_stages', 'init_cfg', 'is_init', 'layers', 'norm_eval', 'out_indices', 'use_depthwise'], + not_duplicated_prefixes = [], + further_detail = dict( + exclude_prefixes = [], + removed_quantizer_names = [], # 用于取消某些算子的量化 len(set(x[0].flatten().tolist())) + specified_general_quantizers = [], + last_8bit_module = ['stem.conv.conv'] + )), + neck_detail = dict( + input_concrete_args = dict(in_num = 3), + preserve_attr = ['in_channels', 'init_cfg', 'is_init', 'out_channels'], + not_duplicated_prefixes = [], + further_detail = dict( # 'getitem_post_act_fake_quantizer' + exclude_prefixes = [], + removed_quantizer_names = ['getitem_post_act_fake_quantizer', 'getitem_1_post_act_fake_quantizer'], + specified_general_quantizers = [], # 输入全是对称的 + last_8bit_module = [] + )), + bbox_head_detail = dict( + input_concrete_args = dict(in_num = 3), + preserve_attr = ['act_cfg', 'assigner', 'cls_out_channels', 'conv_bias', 'conv_cfg', 'dcn_on_last_conv', 'dump_patches', 'feat_channels', 'fp16_enabled', + 'in_channels', 'init_cfg', 'is_init', 'loss_bbox', 'loss_cls', 'loss_l1', 'loss_obj', 'norm_cfg' + , 'num_classes', 'prior_generator', 'sampler', 'sampling', 'stacked_convs', 'strides', 'test_cfg', 'train_cfg', 'use_depthwise', 'use_l1', 'use_sigmoid_cls' + + , '_bbox_decode', '_bbox_post_process', '_bboxes_nms', '_get_backward_hooks', '_get_bboxes_single', '_get_l1_target', '_get_target_single' + + , 'simple_test', 'async_simple_test_rpn', 'aug_test_bboxes', 'aug_test_rpn', 'forward_single', 'forward_train', 'get_bboxes', 'get_targets', 'loss', 'loss_single', 'merge_aug_bboxes', + 'simple_test_bboxes', 'simple_test_rpn'], + not_duplicated_prefixes = [], + further_detail = dict( + exclude_prefixes = [], + removed_quantizer_names = [], + qloss_flag = True, + specified_general_quantizers = [], # 输入全是对称的 + last_8bit_module = ['multi_level_conv_cls.0', 'multi_level_conv_reg.0', 'multi_level_conv_obj.0', 'multi_level_conv_cls.1', 'multi_level_conv_reg.1', 'multi_level_conv_obj.1', 'multi_level_conv_cls.2', 'multi_level_conv_reg.2', 'multi_level_conv_obj.2'] + ))) \ No newline at end of file diff --git a/configs/yolox/yolox_s_8x8_300e_coco.py b/configs/yolox/yolox_s_8x8_300e_coco.py new file mode 100644 index 0000000..97ff23e --- /dev/null +++ b/configs/yolox/yolox_s_8x8_300e_coco.py @@ -0,0 +1,165 @@ +_base_ = ['../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py'] + +img_scale = (640, 640) # height, width + +# model settings +model = dict( + type='YOLOX', + input_size=img_scale, + random_size_range=(15, 25), + random_size_interval=10, + backbone=dict(type='CSPDarknet', deepen_factor=0.33, widen_factor=0.5), + neck=dict( + type='YOLOXPAFPN', + in_channels=[128, 256, 512], + out_channels=128, + num_csp_blocks=1), + bbox_head=dict( + type='YOLOXHead', num_classes=80, in_channels=128, feat_channels=128), + train_cfg=dict(assigner=dict(type='SimOTAAssigner', center_radius=2.5)), + # In order to align the source code, the threshold of the val phase is + # 0.01, and the threshold of the test phase is 0.001. + test_cfg=dict(score_thr=0.01, nms=dict(type='nms', iou_threshold=0.65))) + +# dataset settings +data_root = 'data/coco/' +dataset_type = 'CocoDataset' + +train_pipeline = [ + dict(type='Mosaic', img_scale=img_scale, pad_val=114.0), + dict( + type='RandomAffine', + scaling_ratio_range=(0.1, 2), + border=(-img_scale[0] // 2, -img_scale[1] // 2)), + dict( + type='MixUp', + img_scale=img_scale, + ratio_range=(0.8, 1.6), + pad_val=114.0), + dict(type='YOLOXHSVRandomAug'), + dict(type='RandomFlip', flip_ratio=0.5), + # According to the official implementation, multi-scale + # training is not considered here but in the + # 'mmdet/models/detectors/yolox.py'. + dict(type='Resize', img_scale=img_scale, keep_ratio=True), + dict( + type='Pad', + pad_to_square=True, + # If the image is three-channel, the pad value needs + # to be set separately for each channel. + pad_val=dict(img=(114.0, 114.0, 114.0))), + dict(type='FilterAnnotations', min_gt_bbox_wh=(1, 1), keep_empty=False), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] + +train_dataset = dict( + type='MultiImageMixDataset', + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=[ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True) + ], + filter_empty_gt=False, + ), + pipeline=train_pipeline) + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=img_scale, + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict( + type='Pad', + pad_to_square=True, + pad_val=dict(img=(114.0, 114.0, 114.0))), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img']) + ]) +] + +data = dict( + samples_per_gpu=8, + workers_per_gpu=4, + persistent_workers=True, + train=train_dataset, + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) + +# optimizer +# default 8 gpu +optimizer = dict( + type='SGD', + lr=0.01, + momentum=0.9, + weight_decay=5e-4, + nesterov=True, + paramwise_cfg=dict(norm_decay_mult=0., bias_decay_mult=0.)) +optimizer_config = dict(grad_clip=None) + +max_epochs = 300 +num_last_epochs = 15 +resume_from = None +interval = 10 + +# learning policy +lr_config = dict( + _delete_=True, + policy='YOLOX', + warmup='exp', + by_epoch=False, + warmup_by_epoch=True, + warmup_ratio=1, + warmup_iters=5, # 5 epoch + num_last_epochs=num_last_epochs, + min_lr_ratio=0.05) + +runner = dict(type='EpochBasedRunner', max_epochs=max_epochs) + +custom_hooks = [ + dict( + type='YOLOXModeSwitchHook', + num_last_epochs=num_last_epochs, + priority=48), + dict( + type='SyncNormHook', + num_last_epochs=num_last_epochs, + interval=interval, + priority=48), + dict( + type='ExpMomentumEMAHook', + resume_from=resume_from, + momentum=0.0001, + priority=49) +] +checkpoint_config = dict(interval=interval) +evaluation = dict( + save_best='auto', + # The evaluation interval is 'interval' when running epoch is + # less than ‘max_epochs - num_last_epochs’. + # The evaluation interval is 1 when running epoch is greater than + # or equal to ‘max_epochs - num_last_epochs’. + interval=interval, + dynamic_intervals=[(max_epochs - num_last_epochs, 1)], + metric='bbox') +log_config = dict(interval=50) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/yolox/yolox_s_8x8_300e_coco_quant_w2a2.py b/configs/yolox/yolox_s_8x8_300e_coco_quant_w2a2.py new file mode 100644 index 0000000..8a72879 --- /dev/null +++ b/configs/yolox/yolox_s_8x8_300e_coco_quant_w2a2.py @@ -0,0 +1,169 @@ +_base_ = ['../_base_/schedules/schedule_qat_w4a4.py', '../_base_/default_runtime.py' + , 'yolox_quant_general.py'] + +img_scale = (640, 640) # height, width + +# model settings +model = dict( + type='YOLOX', + input_size=img_scale, + random_size_range=(15, 25), + random_size_interval=10, + backbone=dict(type='CSPDarknet', deepen_factor=0.33, widen_factor=0.5), + neck=dict( + type='YOLOXPAFPN', + in_channels=[128, 256, 512], + out_channels=128, + num_csp_blocks=1), + bbox_head=dict( + type='YOLOXHead', num_classes=80, in_channels=128, feat_channels=128), + train_cfg=dict(assigner=dict(type='SimOTAAssigner', center_radius=2.5)), + # In order to align the source code, the threshold of the val phase is + # 0.01, and the threshold of the test phase is 0.001. + test_cfg=dict(score_thr=0.01, nms=dict(type='nms', iou_threshold=0.65))) + +# dataset settings +dataset_type = 'CocoDataset' +data_root = '/data/dongzhiwei1/dataset/coco2017/' + +train_pipeline = [ + dict(type='Mosaic', img_scale=img_scale, pad_val=114.0), + dict( + type='RandomAffine', + scaling_ratio_range=(0.1, 2), + border=(-img_scale[0] // 2, -img_scale[1] // 2)), + dict( + type='MixUp', + img_scale=img_scale, + ratio_range=(0.8, 1.6), + pad_val=114.0), + dict(type='YOLOXHSVRandomAug'), + dict(type='RandomFlip', flip_ratio=0.5), + # According to the official implementation, multi-scale + # training is not considered here but in the + # 'mmdet/models/detectors/yolox.py'. + dict(type='Resize', img_scale=img_scale, keep_ratio=True), + dict( + type='Pad', + pad_to_square=True, + # If the image is three-channel, the pad value needs + # to be set separately for each channel. + pad_val=dict(img=(114.0, 114.0, 114.0))), + dict(type='FilterAnnotations', min_gt_bbox_wh=(1, 1), keep_empty=False), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] + +train_dataset = dict( + type='MultiImageMixDataset', + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=[ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True) + ], + filter_empty_gt=False, + ), + pipeline=train_pipeline) + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=img_scale, + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict( + type='Pad', + pad_to_square=True, + pad_val=dict(img=(114.0, 114.0, 114.0))), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img']) + ]) +] + +data = dict( + samples_per_gpu=32, + workers_per_gpu=8, + # persistent_workers=True, + train=train_dataset, + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) + +# optimizer +# default 8 gpu +optimizer = dict( + type='SGD', + lr=0.008, + momentum=0.9, + weight_decay=5e-4, + nesterov=True, + paramwise_cfg=dict(norm_decay_mult=0., bias_decay_mult=0.) + ) +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=18, norm_type=2)) + + +max_epochs = 18 +num_last_epochs = 6 +resume_from = None +interval = 1 + +# learning policy +lr_config = dict( + _delete_=True, + policy='YOLOX', + warmup='exp', + by_epoch=False, + warmup_by_epoch=True, + warmup_ratio=1, + warmup_iters=1, # 1 epoch + num_last_epochs=num_last_epochs, + min_lr_ratio=0.01) # 要让l1启动时为4e-5 + +runner = dict(type='EpochBasedRunner', max_epochs=max_epochs) + +custom_hooks = [ + dict( + type='YOLOXModeSwitchHook', # 这玩意注释了有效!可是为啥呢 + num_last_epochs=num_last_epochs, + priority=48), + dict( + type='SyncNormHook', + num_last_epochs=num_last_epochs, + interval=interval, + priority=48), + dict( + type='ExpMomentumEMAHook', + resume_from=resume_from, + momentum=0.0001, + priority=49) +] +checkpoint_config = dict(interval=12) +evaluation = dict( + save_best='auto', + # The evaluation interval is 'interval' when running epoch is + # less than ‘max_epochs - num_last_epochs’. + # The evaluation interval is 1 when running epoch is greater than + # or equal to ‘max_epochs - num_last_epochs’. + interval=interval, + dynamic_intervals=[(max_epochs - num_last_epochs, 1)], + metric='bbox') +log_config = dict(interval=200) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) +load_from = '../long_used_pretrained/yolox_s_8x8_300e_coco_20211121_095711-4592a793.pth' diff --git a/configs/yolox/yolox_s_8x8_300e_coco_quant_w4a4.py b/configs/yolox/yolox_s_8x8_300e_coco_quant_w4a4.py new file mode 100644 index 0000000..ac07886 --- /dev/null +++ b/configs/yolox/yolox_s_8x8_300e_coco_quant_w4a4.py @@ -0,0 +1,169 @@ +_base_ = ['../_base_/schedules/schedule_qat_w4a4.py', '../_base_/default_runtime.py' + , 'yolox_quant_general.py'] + +img_scale = (640, 640) # height, width + +# model settings +model = dict( + type='YOLOX', + input_size=img_scale, + random_size_range=(15, 25), + random_size_interval=10, + backbone=dict(type='CSPDarknet', deepen_factor=0.33, widen_factor=0.5), + neck=dict( + type='YOLOXPAFPN', + in_channels=[128, 256, 512], + out_channels=128, + num_csp_blocks=1), + bbox_head=dict( + type='YOLOXHead', num_classes=80, in_channels=128, feat_channels=128), + train_cfg=dict(assigner=dict(type='SimOTAAssigner', center_radius=2.5)), + # In order to align the source code, the threshold of the val phase is + # 0.01, and the threshold of the test phase is 0.001. + test_cfg=dict(score_thr=0.01, nms=dict(type='nms', iou_threshold=0.65))) + +# dataset settings +dataset_type = 'CocoDataset' +data_root = '/data/dongzhiwei1/dataset/coco2017/' + +train_pipeline = [ + dict(type='Mosaic', img_scale=img_scale, pad_val=114.0), + dict( + type='RandomAffine', + scaling_ratio_range=(0.1, 2), + border=(-img_scale[0] // 2, -img_scale[1] // 2)), + dict( + type='MixUp', + img_scale=img_scale, + ratio_range=(0.8, 1.6), + pad_val=114.0), + dict(type='YOLOXHSVRandomAug'), + dict(type='RandomFlip', flip_ratio=0.5), + # According to the official implementation, multi-scale + # training is not considered here but in the + # 'mmdet/models/detectors/yolox.py'. + dict(type='Resize', img_scale=img_scale, keep_ratio=True), + dict( + type='Pad', + pad_to_square=True, + # If the image is three-channel, the pad value needs + # to be set separately for each channel. + pad_val=dict(img=(114.0, 114.0, 114.0))), + dict(type='FilterAnnotations', min_gt_bbox_wh=(1, 1), keep_empty=False), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] + +train_dataset = dict( + type='MultiImageMixDataset', + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=[ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True) + ], + filter_empty_gt=False, + ), + pipeline=train_pipeline) + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=img_scale, + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict( + type='Pad', + pad_to_square=True, + pad_val=dict(img=(114.0, 114.0, 114.0))), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img']) + ]) +] + +data = dict( + samples_per_gpu=16, + workers_per_gpu=8, + # persistent_workers=True, + train=train_dataset, + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) + +# optimizer +# default 8 gpu +optimizer = dict( + type='SGD', + lr=0.002, + momentum=0.9, + weight_decay=5e-4, + nesterov=True, + paramwise_cfg=dict(norm_decay_mult=0., bias_decay_mult=0.) + ) +optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=18, norm_type=2)) + + +max_epochs = 16 +num_last_epochs = 6 +resume_from = None +interval = 1 + +# learning policy +lr_config = dict( + _delete_=True, + policy='YOLOX', + warmup='exp', + by_epoch=False, + warmup_by_epoch=True, + warmup_ratio=1, + warmup_iters=1, # 1 epoch + num_last_epochs=num_last_epochs, + min_lr_ratio=0.1) # 要让l1启动时为4e-5 + +runner = dict(type='EpochBasedRunner', max_epochs=max_epochs) + +custom_hooks = [ + dict( + type='YOLOXModeSwitchHook', # 这玩意注释了有效!可是为啥呢 + num_last_epochs=num_last_epochs, + priority=48), + dict( + type='SyncNormHook', + num_last_epochs=num_last_epochs, + interval=interval, + priority=48), + dict( + type='ExpMomentumEMAHook', + resume_from=resume_from, + momentum=0.0001, + priority=49) +] +checkpoint_config = dict(interval=12) +evaluation = dict( + save_best='auto', + # The evaluation interval is 'interval' when running epoch is + # less than ‘max_epochs - num_last_epochs’. + # The evaluation interval is 1 when running epoch is greater than + # or equal to ‘max_epochs - num_last_epochs’. + interval=interval, + dynamic_intervals=[(max_epochs - num_last_epochs, 1)], + metric='bbox') +log_config = dict(interval=200) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) +load_from = '../long_used_pretrained/yolox_s_8x8_300e_coco_20211121_095711-4592a793.pth' diff --git a/configs/yolox/yolox_s_8x8_300e_voc_quant_w4a4.py b/configs/yolox/yolox_s_8x8_300e_voc_quant_w4a4.py new file mode 100644 index 0000000..786b6b0 --- /dev/null +++ b/configs/yolox/yolox_s_8x8_300e_voc_quant_w4a4.py @@ -0,0 +1,167 @@ +_base_ = ['../_base_/schedules/schedule_qat_w4a4.py', '../_base_/default_runtime.py' + , 'yolox_quant_general.py'] + +img_scale = (640, 640) # height, width + +# model settings +model = dict( + type='YOLOX', + input_size=img_scale, + random_size_range=(15, 25), + random_size_interval=10, + backbone=dict(type='CSPDarknet', deepen_factor=0.33, widen_factor=0.5), + neck=dict( + type='YOLOXPAFPN', + in_channels=[128, 256, 512], + out_channels=128, + num_csp_blocks=1), + bbox_head=dict( + type='YOLOXHead', num_classes=80, in_channels=128, feat_channels=128), + train_cfg=dict(assigner=dict(type='SimOTAAssigner', center_radius=2.5)), + # In order to align the source code, the threshold of the val phase is + # 0.01, and the threshold of the test phase is 0.001. + test_cfg=dict(score_thr=0.01, nms=dict(type='nms', iou_threshold=0.65))) + +# dataset settings +dataset_type = 'CocoDataset' +data_root = '/data/dongzhiwei1/dataset/coco2017/' + +train_pipeline = [ + dict(type='Mosaic', img_scale=img_scale, pad_val=114.0), + dict( + type='RandomAffine', + scaling_ratio_range=(0.1, 2), + border=(-img_scale[0] // 2, -img_scale[1] // 2)), + dict( + type='MixUp', + img_scale=img_scale, + ratio_range=(0.8, 1.6), + pad_val=114.0), + dict(type='YOLOXHSVRandomAug'), + dict(type='RandomFlip', flip_ratio=0.5), + # According to the official implementation, multi-scale + # training is not considered here but in the + # 'mmdet/models/detectors/yolox.py'. + dict(type='Resize', img_scale=img_scale, keep_ratio=True), + dict( + type='Pad', + pad_to_square=True, + # If the image is three-channel, the pad value needs + # to be set separately for each channel. + pad_val=dict(img=(114.0, 114.0, 114.0))), + dict(type='FilterAnnotations', min_gt_bbox_wh=(1, 1), keep_empty=False), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] + +train_dataset = dict( + type='MultiImageMixDataset', + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'images/train2017/', + pipeline=[ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True) + ], + filter_empty_gt=False, + ), + pipeline=train_pipeline) + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=img_scale, + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict( + type='Pad', + pad_to_square=True, + pad_val=dict(img=(114.0, 114.0, 114.0))), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img']) + ]) +] + +data = dict( + samples_per_gpu=8, + workers_per_gpu=4, + persistent_workers=True, + train=train_dataset, + val=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'images/val2017/', + pipeline=test_pipeline), + test=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'images/val2017/', + pipeline=test_pipeline)) + +# optimizer +# default 8 gpu +optimizer = dict( + type='SGD', + lr=0.01, + momentum=0.9, + weight_decay=5e-4, + nesterov=True, + paramwise_cfg=dict(norm_decay_mult=0., bias_decay_mult=0.)) +optimizer_config = dict(grad_clip=None) + +max_epochs = 300 +num_last_epochs = 15 +resume_from = None +interval = 10 + +# learning policy +lr_config = dict( + _delete_=True, + policy='YOLOX', + warmup='exp', + by_epoch=False, + warmup_by_epoch=True, + warmup_ratio=1, + warmup_iters=5, # 5 epoch + num_last_epochs=num_last_epochs, + min_lr_ratio=0.05) + +runner = dict(type='EpochBasedRunner', max_epochs=max_epochs) + +custom_hooks = [ + dict( + type='YOLOXModeSwitchHook', + num_last_epochs=num_last_epochs, + priority=48), + dict( + type='SyncNormHook', + num_last_epochs=num_last_epochs, + interval=interval, + priority=48), + dict( + type='ExpMomentumEMAHook', + resume_from=resume_from, + momentum=0.0001, + priority=49) +] +checkpoint_config = dict(interval=interval) +evaluation = dict( + save_best='auto', + # The evaluation interval is 'interval' when running epoch is + # less than ‘max_epochs - num_last_epochs’. + # The evaluation interval is 1 when running epoch is greater than + # or equal to ‘max_epochs - num_last_epochs’. + interval=interval, + dynamic_intervals=[(max_epochs - num_last_epochs, 1)], + metric='bbox') +log_config = dict(interval=50) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) +# load_from = '../long_used_pretrained/yolox_s_8x8_300e_coco_20211121_095711-4592a793.pth' diff --git a/configs/yolox/yolox_tiny_8x8_300e_coco.py b/configs/yolox/yolox_tiny_8x8_300e_coco.py new file mode 100644 index 0000000..75931ba --- /dev/null +++ b/configs/yolox/yolox_tiny_8x8_300e_coco.py @@ -0,0 +1,58 @@ +_base_ = './yolox_s_8x8_300e_coco.py' + +# model settings +model = dict( + random_size_range=(10, 20), + backbone=dict(deepen_factor=0.33, widen_factor=0.375), + neck=dict(in_channels=[96, 192, 384], out_channels=96), + bbox_head=dict(in_channels=96, feat_channels=96)) + +img_scale = (640, 640) # height, width + +train_pipeline = [ + dict(type='Mosaic', img_scale=img_scale, pad_val=114.0), + dict( + type='RandomAffine', + scaling_ratio_range=(0.5, 1.5), + border=(-img_scale[0] // 2, -img_scale[1] // 2)), + dict(type='YOLOXHSVRandomAug'), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Resize', img_scale=img_scale, keep_ratio=True), + dict( + type='Pad', + pad_to_square=True, + pad_val=dict(img=(114.0, 114.0, 114.0))), + dict(type='FilterAnnotations', min_gt_bbox_wh=(1, 1), keep_empty=False), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(416, 416), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict( + type='Pad', + pad_to_square=True, + pad_val=dict(img=(114.0, 114.0, 114.0))), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img']) + ]) +] + +train_dataset = dict(pipeline=train_pipeline) + +data = dict( + train=train_dataset, + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) diff --git a/configs/yolox/yolox_tiny_8x8_300e_coco_quant_w2a2.py b/configs/yolox/yolox_tiny_8x8_300e_coco_quant_w2a2.py new file mode 100644 index 0000000..19a2eca --- /dev/null +++ b/configs/yolox/yolox_tiny_8x8_300e_coco_quant_w2a2.py @@ -0,0 +1,129 @@ +_base_ = './yolox_s_8x8_300e_coco_quant_w4a4.py' + +# model settings +model = dict( + random_size_range=(10, 20), + backbone=dict(deepen_factor=0.33, widen_factor=0.375), + neck=dict(in_channels=[96, 192, 384], out_channels=96), + bbox_head=dict(in_channels=96, feat_channels=96)) + +img_scale = (640, 640) # height, width + +train_pipeline = [ + dict(type='Mosaic', img_scale=img_scale, pad_val=114.0), + dict( + type='RandomAffine', + scaling_ratio_range=(0.5, 1.5), + border=(-img_scale[0] // 2, -img_scale[1] // 2)), + dict(type='YOLOXHSVRandomAug'), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Resize', img_scale=img_scale, keep_ratio=True), + dict( + type='Pad', + pad_to_square=True, + pad_val=dict(img=(114.0, 114.0, 114.0))), + dict(type='FilterAnnotations', min_gt_bbox_wh=(1, 1), keep_empty=False), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(416, 416), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict( + type='Pad', + pad_to_square=True, + pad_val=dict(img=(114.0, 114.0, 114.0))), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img']) + ]) +] + +train_dataset = dict(pipeline=train_pipeline) + +data = dict( + samples_per_gpu=16, + workers_per_gpu=8, + train=train_dataset, + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) + +# optimizer +# default 8 gpu +optimizer = dict( + type='SGD', + lr=0.002, # 确认之后,应该决定0.004开始 + momentum=0.9, + weight_decay=5e-4, + nesterov=True, + paramwise_cfg=dict(norm_decay_mult=0., bias_decay_mult=0., + # custom_keys={ + + # # 'norm': dict(lr_mult=0.), + # # 'bn': dict(lr_mult=0.) + # 'quant': dict(lr_mult=0.04) # 还真是这个的问题,破案了 + # } + )) +optimizer_config = dict(grad_clip=None) + +max_epochs = 16 +num_last_epochs = 6 +resume_from = None +interval = 1 + +# learning policy +lr_config = dict( + _delete_=True, + policy='YOLOX', + warmup='exp', + by_epoch=False, + warmup_by_epoch=True, + warmup_ratio=1, + warmup_iters=1, # 1 epoch + num_last_epochs=num_last_epochs, + min_lr_ratio=0.1) # 要让l1启动时为4e-5 但是hqod一来就得更低 + +runner = dict(type='EpochBasedRunner', max_epochs=max_epochs) + +custom_hooks = [ + dict( + type='YOLOXModeSwitchHook', + num_last_epochs=num_last_epochs, + priority=48), + dict( + type='SyncNormHook', + num_last_epochs=num_last_epochs, + interval=interval, + priority=48), + dict( + type='ExpMomentumEMAHook', + resume_from=resume_from, + momentum=0.0001, + priority=49) +] +checkpoint_config = dict(interval=12) +evaluation = dict( + save_best='auto', + # The evaluation interval is 'interval' when running epoch is + # less than ‘max_epochs - num_last_epochs’. + # The evaluation interval is 1 when running epoch is greater than + # or equal to ‘max_epochs - num_last_epochs’. + interval=10, + dynamic_intervals=[(max_epochs - num_last_epochs - 1, 1)], + metric='bbox') +log_config = dict(interval=200) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) +load_from = '/workspace/whole_world/bdata1/long.huang/temp/pretrained/long_used/yolox_tiny_8x8_300e_coco_20211124_171234-b4047906.pth' +# tune_from = 'work_dirs/yolox_tiny_coco_w4a4_LSQ_LEGA/best_bbox_mAP_epoch_16.pth' +# tune_from = 'work_dirs/yolox_tiny_coco_w4a4_LSQ_HQOD_no_correlationLoss_LEGA/best_bbox_mAP_epoch_15.pth' +# tune_from = 'work_dirs/yolox_tiny_coco_w4a4_LSQ_HQOD/best_bbox_mAP_epoch_15.pth' diff --git a/configs/yolox/yolox_tiny_8x8_300e_coco_quant_w4a4.py b/configs/yolox/yolox_tiny_8x8_300e_coco_quant_w4a4.py new file mode 100644 index 0000000..b46f0b9 --- /dev/null +++ b/configs/yolox/yolox_tiny_8x8_300e_coco_quant_w4a4.py @@ -0,0 +1,129 @@ +_base_ = './yolox_s_8x8_300e_coco_quant_w4a4.py' + +# model settings +model = dict( + random_size_range=(10, 20), + backbone=dict(deepen_factor=0.33, widen_factor=0.375), + neck=dict(in_channels=[96, 192, 384], out_channels=96), + bbox_head=dict(in_channels=96, feat_channels=96)) + +img_scale = (640, 640) # height, width + +train_pipeline = [ + dict(type='Mosaic', img_scale=img_scale, pad_val=114.0), + dict( + type='RandomAffine', + scaling_ratio_range=(0.5, 1.5), + border=(-img_scale[0] // 2, -img_scale[1] // 2)), + dict(type='YOLOXHSVRandomAug'), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Resize', img_scale=img_scale, keep_ratio=True), + dict( + type='Pad', + pad_to_square=True, + pad_val=dict(img=(114.0, 114.0, 114.0))), + dict(type='FilterAnnotations', min_gt_bbox_wh=(1, 1), keep_empty=False), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(416, 416), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict( + type='Pad', + pad_to_square=True, + pad_val=dict(img=(114.0, 114.0, 114.0))), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img']) + ]) +] + +train_dataset = dict(pipeline=train_pipeline) + +data = dict( + samples_per_gpu=16, + workers_per_gpu=8, + train=train_dataset, + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) + +# optimizer +# default 8 gpu +optimizer = dict( + type='SGD', + lr=0.002, # 确认之后,应该决定0.004开始 + momentum=0.9, + weight_decay=5e-4, + nesterov=True, + paramwise_cfg=dict(norm_decay_mult=0., bias_decay_mult=0., + # custom_keys={ + + # # 'norm': dict(lr_mult=0.), + # # 'bn': dict(lr_mult=0.) + # 'quant': dict(lr_mult=0.04) # 还真是这个的问题,破案了 + # } + )) +optimizer_config = dict(grad_clip=None) + +max_epochs = 16 +num_last_epochs = 6 +resume_from = None +interval = 1 + +# learning policy +lr_config = dict( + _delete_=True, + policy='YOLOX', + warmup='exp', + by_epoch=False, + warmup_by_epoch=True, + warmup_ratio=1, + warmup_iters=1, # 1 epoch + num_last_epochs=num_last_epochs, + min_lr_ratio=0.1) # 要让l1启动时为4e-5 但是hqod一来就得更低 + +runner = dict(type='EpochBasedRunner', max_epochs=max_epochs) + +custom_hooks = [ + dict( + type='YOLOXModeSwitchHook', + num_last_epochs=num_last_epochs, + priority=48), + dict( + type='SyncNormHook', + num_last_epochs=num_last_epochs, + interval=interval, + priority=48), + dict( + type='ExpMomentumEMAHook', + resume_from=resume_from, + momentum=0.0001, + priority=49) +] +checkpoint_config = dict(interval=12) +evaluation = dict( + save_best='auto', + # The evaluation interval is 'interval' when running epoch is + # less than ‘max_epochs - num_last_epochs’. + # The evaluation interval is 1 when running epoch is greater than + # or equal to ‘max_epochs - num_last_epochs’. + interval=interval, + dynamic_intervals=[(max_epochs - num_last_epochs, 1)], + metric='bbox') +log_config = dict(interval=200) + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) +load_from = '/workspace/whole_world/bdata1/long.huang/temp/pretrained/long_used/yolox_tiny_8x8_300e_coco_20211124_171234-b4047906.pth' +# tune_from = 'work_dirs/yolox_tiny_coco_w4a4_LSQ_LEGA/best_bbox_mAP_epoch_16.pth' +# tune_from = 'work_dirs/yolox_tiny_coco_w4a4_LSQ_HQOD_no_correlationLoss_LEGA/best_bbox_mAP_epoch_15.pth' +# tune_from = 'work_dirs/yolox_tiny_coco_w4a4_LSQ_HQOD/best_bbox_mAP_epoch_15.pth' diff --git a/configs/yolox/yolox_tiny_8x8_300e_coco_quant_w8a8.py b/configs/yolox/yolox_tiny_8x8_300e_coco_quant_w8a8.py new file mode 100644 index 0000000..1b6cc4f --- /dev/null +++ b/configs/yolox/yolox_tiny_8x8_300e_coco_quant_w8a8.py @@ -0,0 +1,90 @@ +_base_ = './yolox_s_8x8_300e_coco_quant_w4a4.py' + +# model settings +model = dict( + random_size_range=(10, 20), + backbone=dict(deepen_factor=0.33, widen_factor=0.375), + neck=dict(in_channels=[96, 192, 384], out_channels=96), + bbox_head=dict(in_channels=96, feat_channels=96)) + +img_scale = (640, 640) # height, width + +train_pipeline = [ + dict(type='Mosaic', img_scale=img_scale, pad_val=114.0), + dict( + type='RandomAffine', + scaling_ratio_range=(0.5, 1.5), + border=(-img_scale[0] // 2, -img_scale[1] // 2)), + dict(type='YOLOXHSVRandomAug'), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Resize', img_scale=img_scale, keep_ratio=True), + dict( + type='Pad', + pad_to_square=True, + pad_val=dict(img=(114.0, 114.0, 114.0))), + dict(type='FilterAnnotations', min_gt_bbox_wh=(1, 1), keep_empty=False), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] + +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(416, 416), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict( + type='Pad', + pad_to_square=True, + pad_val=dict(img=(114.0, 114.0, 114.0))), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img']) + ]) +] + +train_dataset = dict(pipeline=train_pipeline) + +data = dict( + samples_per_gpu=16, + workers_per_gpu=8, + train=train_dataset, + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) + +# optimizer +# default 8 gpu +optimizer = dict( + type='SGD', + lr=0.0001, + momentum=0.9, + weight_decay=5e-4, + nesterov=True, + paramwise_cfg=dict(norm_decay_mult=0., bias_decay_mult=0.) + ) +optimizer_config = dict(grad_clip=None) + +max_epochs = 6 +num_last_epochs = 3 +resume_from = None +interval = 1 + +# learning policy +lr_config = dict( + _delete_=True, + policy='YOLOX', + warmup='exp', + by_epoch=False, + warmup_by_epoch=True, + warmup_ratio=1, + warmup_iters=1, # 1 epoch + num_last_epochs=num_last_epochs, + min_lr_ratio=0.4) # 要让l1启动时为4e-5 但是hqod一来就得更低 + +# NOTE: `auto_scale_lr` is for automatically scaling LR, +# USER SHOULD NOT CHANGE ITS VALUES. +# base_batch_size = (8 GPUs) x (8 samples per GPU) +auto_scale_lr = dict(base_batch_size=64) +load_from = '../long_used_pretrained/yolox_tiny_8x8_300e_coco_20211124_171234-b4047906.pth' diff --git a/configs/yolox/yolox_x_8x8_300e_coco.py b/configs/yolox/yolox_x_8x8_300e_coco.py new file mode 100644 index 0000000..65c0b75 --- /dev/null +++ b/configs/yolox/yolox_x_8x8_300e_coco.py @@ -0,0 +1,8 @@ +_base_ = './yolox_s_8x8_300e_coco.py' + +# model settings +model = dict( + backbone=dict(deepen_factor=1.33, widen_factor=1.25), + neck=dict( + in_channels=[320, 640, 1280], out_channels=320, num_csp_blocks=4), + bbox_head=dict(in_channels=320, feat_channels=320)) diff --git a/demo/MMDet_InstanceSeg_Tutorial.ipynb b/demo/MMDet_InstanceSeg_Tutorial.ipynb new file mode 100644 index 0000000..7d08f8c --- /dev/null +++ b/demo/MMDet_InstanceSeg_Tutorial.ipynb @@ -0,0 +1,2087 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "aGYwt_UjIrqp" + }, + "source": [ + "# Instance Segmentation\n", + "\n", + "In this tutorial, you will learn:\n", + "- the basic structure of Mask R-CNN.\n", + "- to perform inference with a MMDetection detector.\n", + "- to train a new instance segmentation model with a new dataset.\n", + "\n", + "Let's start!\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tJxJHruNLb7Y" + }, + "source": [ + "## Install MMDetection" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Wi4LPmsR66sy", + "outputId": "76e1e1d7-5a14-428f-de09-ce652480a5bd" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "nvcc: NVIDIA (R) Cuda compiler driver\n", + "Copyright (c) 2005-2020 NVIDIA Corporation\n", + "Built on Mon_Oct_12_20:09:46_PDT_2020\n", + "Cuda compilation tools, release 11.1, V11.1.105\n", + "Build cuda_11.1.TC455_06.29190527_0\n", + "gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n", + "Copyright (C) 2017 Free Software Foundation, Inc.\n", + "This is free software; see the source for copying conditions. There is NO\n", + "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n", + "\n" + ] + } + ], + "source": [ + "# Check nvcc version\n", + "!nvcc -V\n", + "# Check GCC version\n", + "!gcc --version" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "gkGnB9WyHSXB", + "outputId": "c36e9f21-ae04-4c91-f0fa-b22d7ba8a439" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in links: https://download.pytorch.org/whl/torch_stable.html\n", + "Requirement already satisfied: torch==1.9.0+cu111 in /usr/local/lib/python3.7/dist-packages (1.9.0+cu111)\n", + "Requirement already satisfied: torchvision==0.10.0+cu111 in /usr/local/lib/python3.7/dist-packages (0.10.0+cu111)\n", + "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.7/dist-packages (from torch==1.9.0+cu111) (3.10.0.2)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from torchvision==0.10.0+cu111) (1.19.5)\n", + "Requirement already satisfied: pillow>=5.3.0 in /usr/local/lib/python3.7/dist-packages (from torchvision==0.10.0+cu111) (7.1.2)\n", + "Looking in links: https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html\n", + "Requirement already satisfied: mmcv-full in /usr/local/lib/python3.7/dist-packages (1.4.4)\n", + "Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full) (4.1.2.30)\n", + "Requirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full) (7.1.2)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full) (1.19.5)\n", + "Requirement already satisfied: packaging in /usr/local/lib/python3.7/dist-packages (from mmcv-full) (21.3)\n", + "Requirement already satisfied: addict in /usr/local/lib/python3.7/dist-packages (from mmcv-full) (2.4.0)\n", + "Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full) (3.13)\n", + "Requirement already satisfied: yapf in /usr/local/lib/python3.7/dist-packages (from mmcv-full) (0.32.0)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /usr/local/lib/python3.7/dist-packages (from packaging->mmcv-full) (3.0.7)\n", + "Cloning into 'mmdetection'...\n", + "remote: Enumerating objects: 23075, done.\u001b[K\n", + "remote: Counting objects: 100% (6/6), done.\u001b[K\n", + "remote: Compressing objects: 100% (6/6), done.\u001b[K\n", + "remote: Total 23075 (delta 1), reused 2 (delta 0), pack-reused 23069\u001b[K\n", + "Receiving objects: 100% (23075/23075), 25.84 MiB | 13.75 MiB/s, done.\n", + "Resolving deltas: 100% (16145/16145), done.\n", + "/content/mmdetection\n", + "Obtaining file:///content/mmdetection\n", + "Requirement already satisfied: matplotlib in /usr/local/lib/python3.7/dist-packages (from mmdet==2.21.0) (3.2.2)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmdet==2.21.0) (1.19.5)\n", + "Requirement already satisfied: pycocotools in /usr/local/lib/python3.7/dist-packages (from mmdet==2.21.0) (2.0.4)\n", + "Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from mmdet==2.21.0) (1.15.0)\n", + "Requirement already satisfied: terminaltables in /usr/local/lib/python3.7/dist-packages (from mmdet==2.21.0) (3.1.10)\n", + "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mmdet==2.21.0) (2.8.2)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mmdet==2.21.0) (1.3.2)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mmdet==2.21.0) (0.11.0)\n", + "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mmdet==2.21.0) (3.0.7)\n", + "Installing collected packages: mmdet\n", + " Running setup.py develop for mmdet\n", + "Successfully installed mmdet-2.21.0\n" + ] + } + ], + "source": [ + "# install dependencies: (use cu111 because colab has CUDA 11.1)\n", + "!pip install torch==1.9.0+cu111 torchvision==0.10.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html\n", + "\n", + "# install mmcv-full thus we could use CUDA operators\n", + "!pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html\n", + "\n", + "# Install mmdetection\n", + "!rm -rf mmdetection\n", + "!git clone https://github.com/open-mmlab/mmdetection.git\n", + "%cd mmdetection\n", + "\n", + "!pip install -e ." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "6hD0mmMixT0p", + "outputId": "3fdfddc5-9314-4d11-ed2b-2833795e1cb6" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.9.0+cu111 True\n", + "2.21.0\n", + "11.1\n", + "GCC 7.3\n" + ] + } + ], + "source": [ + "# Check Pytorch installation\n", + "import torch, torchvision\n", + "print(torch.__version__, torch.cuda.is_available())\n", + "\n", + "# Check MMDetection installation\n", + "import mmdet\n", + "print(mmdet.__version__)\n", + "\n", + "# Check mmcv installation\n", + "from mmcv.ops import get_compiling_cuda_version, get_compiler_version\n", + "print(get_compiling_cuda_version())\n", + "print(get_compiler_version())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gi9zw03oM4CH" + }, + "source": [ + "## Perform Inference with An MMDetection Detector" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "3pFYLerc0we1" + }, + "source": [ + "### A two-stage detector\n", + "\n", + "In this tutorial, we use Mask R-CNN, a simple two-stage detector as an example.\n", + "\n", + "The high-level architecture of Mask R-CNN is shown in the following picture. More details can be found in the [paper](https://arxiv.org/abs/1703.06870).\n", + "\n", + "\"mask\n", + "\n", + "Mask R-CNN adds a mask branch based on the original Faster R-CNN. It also uses RoIAlign, a more precise version of RoIPooling for RoI feature extraction to improve the performance.\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "j4doHX4exvS1", + "outputId": "a61a514e-6408-4972-e78d-4b4ec70ec918" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2022-02-13 11:40:48-- https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth\n", + "Resolving download.openmmlab.com (download.openmmlab.com)... 47.252.96.28\n", + "Connecting to download.openmmlab.com (download.openmmlab.com)|47.252.96.28|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 177867103 (170M) [application/octet-stream]\n", + "Saving to: ‘checkpoints/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth’\n", + "\n", + "checkpoints/mask_rc 100%[===================>] 169.63M 7.40MB/s in 23s \n", + "\n", + "2022-02-13 11:41:13 (7.28 MB/s) - ‘checkpoints/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth’ saved [177867103/177867103]\n", + "\n" + ] + } + ], + "source": [ + "!mkdir checkpoints\n", + "!wget -c https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth \\\n", + " -O checkpoints/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8M5KUnX7Np3h", + "outputId": "ef343a81-a46b-4041-8f6c-a4049a5c8a4e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "load checkpoint from local path: checkpoints/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth\n" + ] + }, + { + "data": { + "text/plain": [ + "MaskRCNN(\n", + " (backbone): ResNet(\n", + " (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n", + " (layer1): ResLayer(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (layer2): ResLayer(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (3): Bottleneck(\n", + " (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (layer3): ResLayer(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (3): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (4): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (5): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (layer4): ResLayer(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " )\n", + " init_cfg={'type': 'Pretrained', 'checkpoint': 'open-mmlab://detectron2/resnet50_caffe'}\n", + " (neck): FPN(\n", + " (lateral_convs): ModuleList(\n", + " (0): ConvModule(\n", + " (conv): Conv2d(256, 256, kernel_size=(1, 1), stride=(1, 1))\n", + " )\n", + " (1): ConvModule(\n", + " (conv): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1))\n", + " )\n", + " (2): ConvModule(\n", + " (conv): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1))\n", + " )\n", + " (3): ConvModule(\n", + " (conv): Conv2d(2048, 256, kernel_size=(1, 1), stride=(1, 1))\n", + " )\n", + " )\n", + " (fpn_convs): ModuleList(\n", + " (0): ConvModule(\n", + " (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", + " )\n", + " (1): ConvModule(\n", + " (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", + " )\n", + " (2): ConvModule(\n", + " (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", + " )\n", + " (3): ConvModule(\n", + " (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", + " )\n", + " )\n", + " )\n", + " init_cfg={'type': 'Xavier', 'layer': 'Conv2d', 'distribution': 'uniform'}\n", + " (rpn_head): RPNHead(\n", + " (loss_cls): CrossEntropyLoss()\n", + " (loss_bbox): L1Loss()\n", + " (rpn_conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", + " (rpn_cls): Conv2d(256, 3, kernel_size=(1, 1), stride=(1, 1))\n", + " (rpn_reg): Conv2d(256, 12, kernel_size=(1, 1), stride=(1, 1))\n", + " )\n", + " init_cfg={'type': 'Normal', 'layer': 'Conv2d', 'std': 0.01}\n", + " (roi_head): StandardRoIHead(\n", + " (bbox_roi_extractor): SingleRoIExtractor(\n", + " (roi_layers): ModuleList(\n", + " (0): RoIAlign(output_size=(7, 7), spatial_scale=0.25, sampling_ratio=0, pool_mode=avg, aligned=True, use_torchvision=False)\n", + " (1): RoIAlign(output_size=(7, 7), spatial_scale=0.125, sampling_ratio=0, pool_mode=avg, aligned=True, use_torchvision=False)\n", + " (2): RoIAlign(output_size=(7, 7), spatial_scale=0.0625, sampling_ratio=0, pool_mode=avg, aligned=True, use_torchvision=False)\n", + " (3): RoIAlign(output_size=(7, 7), spatial_scale=0.03125, sampling_ratio=0, pool_mode=avg, aligned=True, use_torchvision=False)\n", + " )\n", + " )\n", + " (bbox_head): Shared2FCBBoxHead(\n", + " (loss_cls): CrossEntropyLoss()\n", + " (loss_bbox): L1Loss()\n", + " (fc_cls): Linear(in_features=1024, out_features=81, bias=True)\n", + " (fc_reg): Linear(in_features=1024, out_features=320, bias=True)\n", + " (shared_convs): ModuleList()\n", + " (shared_fcs): ModuleList(\n", + " (0): Linear(in_features=12544, out_features=1024, bias=True)\n", + " (1): Linear(in_features=1024, out_features=1024, bias=True)\n", + " )\n", + " (cls_convs): ModuleList()\n", + " (cls_fcs): ModuleList()\n", + " (reg_convs): ModuleList()\n", + " (reg_fcs): ModuleList()\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " init_cfg=[{'type': 'Normal', 'std': 0.01, 'override': {'name': 'fc_cls'}}, {'type': 'Normal', 'std': 0.001, 'override': {'name': 'fc_reg'}}, {'type': 'Xavier', 'distribution': 'uniform', 'override': [{'name': 'shared_fcs'}, {'name': 'cls_fcs'}, {'name': 'reg_fcs'}]}]\n", + " (mask_roi_extractor): SingleRoIExtractor(\n", + " (roi_layers): ModuleList(\n", + " (0): RoIAlign(output_size=(14, 14), spatial_scale=0.25, sampling_ratio=0, pool_mode=avg, aligned=True, use_torchvision=False)\n", + " (1): RoIAlign(output_size=(14, 14), spatial_scale=0.125, sampling_ratio=0, pool_mode=avg, aligned=True, use_torchvision=False)\n", + " (2): RoIAlign(output_size=(14, 14), spatial_scale=0.0625, sampling_ratio=0, pool_mode=avg, aligned=True, use_torchvision=False)\n", + " (3): RoIAlign(output_size=(14, 14), spatial_scale=0.03125, sampling_ratio=0, pool_mode=avg, aligned=True, use_torchvision=False)\n", + " )\n", + " )\n", + " (mask_head): FCNMaskHead(\n", + " (loss_mask): CrossEntropyLoss()\n", + " (convs): ModuleList(\n", + " (0): ConvModule(\n", + " (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", + " (activate): ReLU(inplace=True)\n", + " )\n", + " (1): ConvModule(\n", + " (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", + " (activate): ReLU(inplace=True)\n", + " )\n", + " (2): ConvModule(\n", + " (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", + " (activate): ReLU(inplace=True)\n", + " )\n", + " (3): ConvModule(\n", + " (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", + " (activate): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (upsample): ConvTranspose2d(256, 256, kernel_size=(2, 2), stride=(2, 2))\n", + " (conv_logits): Conv2d(256, 80, kernel_size=(1, 1), stride=(1, 1))\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + ")" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import mmcv\n", + "from mmcv.runner import load_checkpoint\n", + "\n", + "from mmdet.apis import inference_detector, show_result_pyplot\n", + "from mmdet.models import build_detector\n", + "\n", + "# Choose to use a config and initialize the detector\n", + "config = 'configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco.py'\n", + "# Setup a checkpoint file to load\n", + "checkpoint = 'checkpoints/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth'\n", + "\n", + "# Set the device to be used for evaluation\n", + "device='cuda:0'\n", + "\n", + "# Load the config\n", + "config = mmcv.Config.fromfile(config)\n", + "# Set pretrained to be None since we do not need pretrained model here\n", + "config.model.pretrained = None\n", + "\n", + "# Initialize the detector\n", + "model = build_detector(config.model)\n", + "\n", + "# Load checkpoint\n", + "checkpoint = load_checkpoint(model, checkpoint, map_location=device)\n", + "\n", + "# Set the classes of models for inference\n", + "model.CLASSES = checkpoint['meta']['CLASSES']\n", + "\n", + "# We need to set the model's cfg for inference\n", + "model.cfg = config\n", + "\n", + "# Convert the model to GPU\n", + "model.to(device)\n", + "# Convert the model into evaluation mode\n", + "model.eval()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "pVqDQAOiKkJK" + }, + "source": [ + "From the printed model, we will find that the model does consist of the components that we described earlier. It uses ResNet as its CNN backbone, and has a RPN head and RoI Head. \n", + "The RoI Head includes box head and mask head. In addition, the model has a neural network module, named neck, directly after the CNN backbone. It is a [feature pyramid network (FPN)](https://arxiv.org/abs/1612.03144) for enhancing the multi-scale features.\n", + "\n", + "\n", + "### Inference with the detector\n", + "\n", + "The model is successfully created and loaded, let's see how good it is. We use the high-level API `inference_detector` implemented in the MMDetection. This API is created to ease the inference process. The details of the codes can be found [here](https://github.com/open-mmlab/mmdetection/blob/master/mmdet/apis/inference.py#L15)." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Wi6DRpsQPEmV", + "outputId": "8670eb7c-7e35-4c6d-edf8-9599c296fd01" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/content/mmdetection/mmdet/datasets/utils.py:69: UserWarning: \"ImageToTensor\" pipeline is replaced by \"DefaultFormatBundle\" for batch inference. It is recommended to manually replace it in the test data pipeline in your config file.\n", + " 'data pipeline in your config file.', UserWarning)\n", + "/usr/local/lib/python3.7/dist-packages/torch/nn/functional.py:718: UserWarning: Named tensors and all their associated APIs are an experimental feature and subject to change. Please do not use them for anything important until they are released as stable. (Triggered internally at /pytorch/c10/core/TensorImpl.h:1156.)\n", + " return torch.max_pool2d(input, kernel_size, stride, padding, dilation, ceil_mode)\n" + ] + } + ], + "source": [ + "# Use the detector to do inference\n", + "img = 'demo/demo.jpg'\n", + "result = inference_detector(model, img)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 474 + }, + "id": "UsJU5D-QPX8L", + "outputId": "61e8ec08-2e3a-49eb-fb15-67af66657f7b" + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqoAAAHJCAYAAABNDRsDAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd6xm6X3Y9+/TTnvb7XPvzOzM7M4uyS3cXXF3SUmsKqRkUQWkLMmO5NgGKEBWYCeRECQRIoQKEMRx4ACxkYYgQID4nxgIZMWKbIeyxYgqK7Nv4fbd2Wl3bn/raU/LH+eaEoJEiBIpXFDnAwxeYO5bzrnveZ/3154ZEWOk1+v1er1er9d7p5Hf6gPo9Xq9Xq/X6/X+r/SBaq/X6/V6vV7vHakPVHu9Xq/X6/V670h9oNrr9Xq9Xq/Xe0fqA9Ver9fr9Xq93jtSH6j2er1er9fr9d6R+kC11+v1/l8SQnxeCPGZb/Vx9Hq93rerPlDt9Xq9PwVCiL8mhPidb/Vx9Hq93reTPlDt9Xrf9oQQ+lt9DL1er9f7k+sD1V6v921JCHFDCPHvCiGeA1ZCiA8JIX5PCDEVQnxdCPGxP3LfvyaEeFMIsRBCvCWE+Onzv/+sEOIf/JH7XRNCxP9z4CuEeBj4b4DvEkIshRDT/3/Ostfr9b699VWGXq/37ewvA58EAvAc8FeAfwp8H/A/CyHeA5TA3wOeiTG+IoTYAzb+JC8SY3xJCPFzwGdijB/60zyBXq/X+/Osr6j2er1vZ38vxngL+BngN2KMvxFjDDHGzwFfAn7o/H4BeEwIkccY92OML36rDrjX6/V6f6gPVHu93rezW+e3V4GfOG/7T89b8x8C9mKMK+CngJ8D9oUQ/+t5pbXX6/V632J9oNrr9b6dxfPbW8D/GGNc+yN/BjHGvw0QY/xnMcaPA3vAy8B/d/64FVD8kefb/X/wWr1er9f7U9IHqr1e78+DfwD8iBDiB4QQSgiRCSE+JoS4LIS4IIT4MSHEAGiAJd0oAMDXgI8IIa4IISbAv//HvMYBcFkIkfyZnkmv1+v9OdIHqr1e79ve+ZzqjwG/BBzRVVj/Hbo1UAK/ANwFToGPAn/j/HGfA/4nuo1YXwZ+/Y95mX8BvAjcE0Ic/5mcSK/X6/05I2Lsu1W9Xq/X6/V6vXeevqLa6/V6vV6v13tH6gPVXq/X6/V6vd47Uh+o9nq9Xq/X6/XekfpAtdfr9Xq9Xq/3jtQHqr1er9fr9Xq9dyT9x/3w6of3oo2BNM+IQmIbQQwLZDBsbhbMy7tUVYOtA64BHyHG7l+9FgZkkIQ2oExOng2JziO0JChLDC2Nr0AM8G3DM48+yuLlfW76U/Sa4dOf+DQ710fMTr/Ol7/8IoffKFCFRFQr2v0Vw2GOuyK4caPivU88yCD1/PY/vsUj3zECo6jiCTJpCXWOSQYc3G1Yu1Zz76aHaY6ZrBAhZZAEGidIR56NUc7bN1aQZjz8rifZNCOOT94gRMXadspzL9wmGVRIanSUtFVg5aB1AoioVNBaAIkm0kaNn0E4dAQbkKOE3auBvHC0PicKhwwZZ0cL9vbWSIZL9m8qqlKQ555YWIpxShIbrJRoPcaWMxoDMSiCEzS1JcvgoQc3mR6XXNrbZb5omc0cZYwIcopsRFmtUFpjTEJd10gREcKhg+HozVtoY7DHLSKCMiBGA+SFCbbxDMeGK9sb+Bg5OTnCTo8JypA3kqaU3LtbIUKkWGvRa0BlqE8FTYAgW95z9QqVWzI7ndPElGwkEMkKrQLtNGE1k9ShJck1k60JeuwROqNtZ8gKRFYQjWEwyDidHjE7KgnOARIhA0IY8kKQ5i22TbBLQ5ZX+BBIWoNSjtpEZJLTzGtkUDjjwWka77iwrlitchZ3Gi5cEwwvOprGYxKF9Z7R5ojj18AeB1ITEVFQ+oC3QACdQGbWqOsVIdZoZQjeEPFAxHuPlF1OKIAQHArQMRLxROkxqSTNhyyWDdY79nZ3WMyWxCjx3qNEZDat+cTHP8l7H3ucX/vHv8bh0QEIj5SCtnXkeU5EsFyuyHKFcApFBVKh8k30sMaFOYtjRVXXiJAwzC1bkwTFhKqJbF/c4L1PPMbXn/sGr716A+c8xhiMMbRti7WWEAOtbwnBkRhD8JEQAlmaIYTA+poLF1Ns4zg7FqgkRyjITE5bl6ytj1isKt599V1gBS/fvEHZtjjbkGaR6/fvgQjEkGPEGm0zo27POJvWaJOzvjFiOJRkA030S47uTjk+sRAUAI4aIxRparCxARRSOkKwrK9dYLI2JE1SlmVNkiesr13gxo03OT25R5IYbOuIwRGjIDEFNjTovGGybUiHOSRwfKtmeldz8fIFxiPDzbfuUi8bjFE4F4ihJYqI0glFkRNxpBmkacJ82tC0lhgjzgaUUqQmRQqNbR3WthTDlCzLqFuLEIIYBS54bNPS1DVCCLJBzmh9DF5x99YhRZIyHK2zalb4WKKTHBEj1jV477CtReIxGoQQKJGgtKEsK4QQaJOChKapkUIgBQgECIGUkJqEEMB7363zAZx3hOhRSmGMwXvfvQe+RWuFRIJSRCHIBzlXHrhMwHN0fAIyRQjJlcsXkbHm9ddeY7WqGI4HXNjdxIeG2aJBJ0PWJjnDoeDo1oqzkwXRJKwNh2RJyeuv7SNjRgwegSRGQZ4XDIcGF8/Y3lPMTz2H+y1KGbRK2dhJuXh1RFmvcXDzkNq2SBuBBd5krMolwXsSLclTTVNFXCtQShJCZDAcsbm1weHRXYKXCOloao+QgrquSHSBMYa6ciBrQgikaQ4EfGyJURNjShBLhsMhSZpycHiKDzAYFqSFQMrA6eGKne2C42VEa0umBNU8sjFIKBc1jcvwviZJhoTgUcbiPRAVaappAxiVEkWLyRpK27C+s4ZwNQc3LDiDVA6pIEkSFvMSlODSpT3mizNsJbCuJAaQShNFwLZgTIY2wPlnP00NzjuiEKSpoa5rnHO4xmGMIYTunyXO85wQAs45sixDK4NAkCQJbdsCgSTVNG3bPZ+D1tZIpc4fU9A4y9bWFjF66nLFZKIYrcG9O54ohlh5SOscgoRRsUmqE44ODrG1RUkJEaRW3bqaGKSUJEoTY6RtW6qqoshTANq2JU1ThOyuq7qumUxGDAaGqlqijGQymXD3zhFN1TIa7OGcJckrqtLSOk+UiiANOho0kjqUBGHJoiAGRSJzrKxpRUZgzjgfUZ+UfM9PPsXsnuXwpRvc/8MTXr5jyZqLXH6P5NW7zyLu7QGC4WAPpyyurdjcHXP25uvcenvJ1qUh83JFkSpWJzAcBZAtizmEAGmSYgnkaXeuw0mBdQMad8L6WIERvP6bJ+JPJdL8/0h99rOf/b/94X/+9/+jzxZ5gYuRum2J1iOx5EaymB/hvMXZQBSAFFgHSWoQMiLgPOgxhBgJLiKNJs8yjBA4bxmRo4oaHQ1nhyfc95FNioHk+LkZqpIsTi7w5X92zP6NFbb1TJtjPvWvXeZrz1VceWaNW/eOCIxZW9PMbpWc3q65/phg5xoYU5CuVey/aUiySJYnnB0s2VxPKcuKqBJa0SJ1gVSS8SgyO61I0gGuKXntS7f51A/+FH/rb/0M0QmIBfcO3oAAUrQYUjICMUZ0Zqh9IAbF+dKOJhCIROVYnyQMBpJL903Q+RIfYDQGgSMRnmaqqJYtg4lhe8+RxJzFviUdC9AWaokZCFaxwkeD0BG59LRtoMgVoyJhOV+wu3udpoV7J0tiUpAPtzE6RwRIjSHKgPUeKUEJh5YpXkSyrTEbly9iFzWyaSkMNKZF1pbcBqr5gtsnJ5ikYmfrIjJfJzSRSoJiyXhYs7XhuO/BTZy0ICNOtuhyQLlqCDLhbFqzeXHC2rs0DB1yCAwNxUDiFOxe3CaclviVI8hINoR5ucDWmnSUE3zLanZMMgRnW4I1ZEYzGmkigqYWZFlgXESUiCiRQAJ+5aFNEJkgqIBrA94GfDR46RDSEJ0HAX6RMBoWFJstUWlaH5BEjJKIdkR9Bq4MeBtBamKISFJGgzWImqpegIgIFCEInLNIKZBSIgTEGAjRkSQJPgQigWGqGKcKrTTzqmHVWIiCqmxwvnu8Dy0mNQyGQ+bzijfeeIt7h/voJCM5DyCbukUIwcbmJsPhiPl8Rh0aHn/yaWrvWVTHnJ3MCE6zNUkJ1uOsRxlFEAXLUrC+tckHP/wRtB7y0osvMZtOkVKB6BZo7xwhBJqm4bEnn+DqlQdZzpZ4b1FK0X0XRdJM4Z2jaRwhdAFN9JYIvO+p95NmkqPDO3zyxz7NJ374h7h583V0DPyNz/wMAkG1gAs72+wfv4VjRWISTmfHYBZsXdggSVKsc6TJJjFR1G6JROIlJEPN3u4YqQKn8xnOt6RGI4TChcCiqvDBQ5Bok/Ho40/hnOLWnTcQyuKcJwSB1hlSDaitxYsWKQLN1DLfh9N7FltWGNXifKAoMoQIlGWN0gIfIy5oQugSEyEU3kfKqqKqWgiaGCQhQAgRoyVIR8ST5yk+eGzjkMrgg0ebBKk08/miW2+kxBhN8J7FdAnWsz4uaENFU88YGklmDK5tsHWNaxu8bZmMh1y+dJHJZAJRsSprlFYIYpdIyQhSIKTsrs8IWhuIAd8KyrLG2pYQIEtzhIx4H0hSgw+uO1alkVKipCJNM4gS6JK7umlZLVrWNyYsV2fd70G0HBwcslrU3X2dRgpDmit0Hsk2cmQTODmcsjirWSxXbO1usD7IWB7UeDFguVxQrkqEkCR6QJpGdi4M0EmNxzNZS1kuWoLTaBNRWlLXK+7cWHJ4Z4kzS5yr0KIlJpEYUgoZGeZjRNDYNmDMkCtXrrJYnqETTesgRE/glHIZELFgNC5YnwyRpAQX2dzYwMcVPtSkqcZ7SVNHtNQIYUlMRDOkrSyrVYOIgizLMGlCPkgYTyYU60P0fM52tsaDF9/F7VcPKdIBu2ubXL34EA8+cp3lsmQ2OwYcbePIswxEF4wEH3FEfLAIP8QkA7KhxtY57UyhEo+SBq1yBIokSTBaMhoVnBwdo0R3DUjVJdxG5qSJxqhIbkbd++67REUAhHj+P2UIQujiANs6pJLk+eD88xXJ8wIpFYvlEqM11lqstRitaFuL9448y7GuhS68YG1tgneOtumS2qap8Q6iHTA/CzRNS+tqimzCZLyNs9CUFVVVQQzEELq1WIJznhgjIUY2NjbwMWDblslkBMTzJFOhpEQphffdeSaJQSrB2ekpaapp6pa7t2fEdp3xJKd1p1RVt8YHL4l16PrWIYILROEQAjKZ4VtNayxaBmoBAwy5H2JrRTbQfP93foQvfvVlPvSzF2is4ud+8pcYhJRnv/Qsp7MlLuSEZEQeF1SzSHN8QD7wFEmLS2rauWR9mLCcr5ACpIlEKVguuzXEW0hGGUpFgtTgh6QbkfseaIkLy8IP+MW//ou/8mcQd/6J/bGB6t/5+7/0WRdsl324gJGaRAo8XWVU+IiRkhgiPnQLcl07jFLEGMFD1F02nsiIKQpc4zi4cURVWharFrmIZGPFfFrz+henLA8sbMK92T7D5AXS9ITttU2uPnqB8WDB8eGKuorcnUesDdhoWRsI4lmC55RWwGrmOHh1xa0Dj/ORpm7Y2MyQIePwVonKBcE6hBBIqdEyARfY3LzA/r0z0ixnb3OXyc46jz3xML/6q5/nC3/wOSabEh9qjNCEpiUzAlUklC5S14EQIlJJhOg+oAqBVQleNeAM+2+XFENDFJCuJzhjsDJQXHAsfOB0ZTguW1rRoEYBTjRr2wnJeiR4gbQBCIQ2QoBRUWCMoK5aNtb3ePK9H+alV16n9YKsGOCsw7kZUrcgJE1rSTNJkggEhihbomrIsMz9imJrgDctAcdWOiASkVXg0lZGEJrDgznl6Skbly8x3F4npoK17U3Wd4a0heNwuSSGAflowOZeZH03sL6rsEnJeE0x3BnQ5oZmuSKNhiAMJh+wtb6LzCXySorZBL+QlLMSPcyJQDQG6yONXWKdgxBRXiFCJB9KhLKE4NACskQTvesubhlJdKRpIoP1DBctvo0IBUIlJEkE2T2fzlJS1bC+4/GJxYcBRmqMBOssyUBw3/U1Nve2uuz/1BMiJKkmTTRSBrzzaJGhZIJQkRADaZaxe+ECTdMtuEIIvO+qDK13DBLdfYZEQtQJMYKSkuFwxNbWhKJI8d5x8eIeW1tbVFWDDwGpI4NiyHg8YTzewHmwbUXbNiiVAIq2aVnOFsynU7x1pMkAISWtragqwdpgg2I0Ih9vEoOirmuef+EFfud3fo/FvCTLEmL0WG8RRBSwMVkHITg+mzI9m9PUNSF6tJZEHEpFwGDUJloNQVgQHqMlSktOz+YsZgug5c0bd3n4iQ/z0z/3Czz9vd+DKTb46pe/RnQrVqsVs+kC23qinJENGkKULFdTpIrsbF8hGyiOp29jsoTR+h62CSRCI0ROEPDEk49xae8Kp0dn2KZBJQqhYTGvmJ3NWdUVB/eW3L1zj6qeEqMlOJBC4hw0dYsUEsEYQoFRA5K0QBUJ2VrGYKxwbYUUGmMyyqXF+wgqEoQgxogSBiEMQiYMiglpNugCeA/BewKOQTHkgx/8GNs7Fzk5OWNre5vFcoGPnigEPkSs9XjrUaIrcHjv2Fjf5Ed+/NM88vhjTE+mXLh2hcHGiGpZsiwbnnzmaZ5875MU+Ygnn3gcayvquiExOWmad4mQUnjrcLar8Lauu9XGkCYpSkiilzz44AM89dRTHNw7pm0rnG+IUSClQgiQsquKadUFHUmSk+cZdd0QCZjEkOcD1jc2WFUrklTT2obxZJ22cawWFRFH8BJ8RggBrTKE0hgj2VzfZO/CdXb3JmzvjJnPWs6mJWV1xmCYsbm1SdtalFQkqWbv4jXeen0f28DxQUmerCMU1E1DkVxgd/caq+Ye+bBBiZb1NcFEKCbDEkzLcqooUs+iXCJFToiCs/kJddOeV5FbVqsVro1IaTAmAxwheBKVEELg9u0jUqXZ2R7S2oa6hMRkGEOXAJIQoiPNUpy1GJUQo0ChAcXitCQcRKoFPPLYd/EjP/5plvdeYiOpyMebaDXi4M7bVPMZO1tDtIgEq7G2S5IjEikck/WUfOhYzhtsrVjNA/USvJ3jQkOS5GiV4n0APFW94vR0znCQk8hIVVqc6xJQ5xuUHCJFhgsLnI/n65oEBEJ0SQqB7npVEq0VMQq892itMTpFKU2W5gxHA3wIZGmK1n/YUZBC4n3AWkeSGIQQOOdp6u49FkhC8Fhf0zQlqRqRFQWz6YwQJbPZEYoELSV1VRFDACI+eEII59etIMsH1E1FCAGTJpRViXeWSCBGjxRdBd2HSJrmJGZAkQ15+qkP8OYbb/P4E4/zwz/yEQ4ODvjEJ36QC7ubSOWZL06oVpYYHVILlAukaUYbW0yMuLIi2RJMhorVkcGsSxIdSQpHOljxH//d/wKnHZ9/9gt88JmP8sbzSy4/fp033vot3nj7G8g2YXf8EFfe/SDXr55hzC2ahaJpZ8zOFFWlCacTfL1ikA1Q0hCipao9UqTE8zVZJCmhsQzGF/m+j3w/z7/2RQopsIcQBrv823/159/5gep/+t//ymdVrhFJRmsjUioCGpSEJCPTHkFgUuQIG9kYbPDAtfuZLmdI5ZFBUTnPpQsXuP/qNWazFb5xuKpGKkMiPUsHYanxRpCNPKSeDENMAz/8A4/x8Ps3YDTlnz97B1qPKDVGa0p3hvOexnoKvc19e+vcuXOALuD+64GdMVRngWUSkFYjpCUbT0isQNqagRTk2uAjKJWS6ZQPvP/DrOqWVbPkoSfu5/p7dvjC//4qX3/ua8j0kEANIZJojasdTkWWLnAy61pOWgiUEkTRlfRTHWmCQ0ZIvUFGyWRToRMYb0pOb9e4RqI01MtIaBzaKWjASInMPdNDR2ILNPa8xRsxRiOCYHPPkOQS61seeve7Sc0mB3f3kbYlNorhUOL8lEV1gtYZqS4wShOCJIgMYsRpjcN04xlaEDNHvj4gGa+R4WkGOS5VFCickvg0cPLKlM2NK2yvX+SoWlKtKrxdgm2Y3rDs31ZkzQgrAt5AccHiyoZMXiTJJpisQKUDdDLEZBsIlZCOMqqoiB6WJzVKJ4jhkEGegIjk+SajwlCVFTiDQIIWRN2SFJrhOEPorjLqIggtMD5FpxI9crgY8JWAKPA+EpVH2m7xkCpipSXPI/lYEnRAJw5VtJhcIHUE0SJ1jStKisuO3Us55Qx821KuzmjbkmExpm4CAfDBobXBNpbjkyOUkHjniSGglMb5gFRdZVWZhNpGVrVFK41WChsi3nqSJOXS3iWUVLzy6hucnc05PTtjWc6xzjKZTEjSgrZp8WGFCyXW1mRZxiAfUjUlrm3AdwGFsxbbGMbDMeNMsbO9w9lqzuHxPapVRYyO8VpGnmYIERkMc0IMeO8RUSAQtLbFOUcUFeCQQhHxSNlVk2NUXbfFVUipULpLCH2IrFYLykVDFJHKHvPlr7zM17465+aNY/7F//ZPePH5P+A73vcIT73/CY6ODjk7PcPHmhAd3ibUywQlhngfacolici4d7Pi4M6KYB2zs1NMknFhb4f7r14jesnNm7domva8fedJTEqW5DjfsixPiLHBKEOwHmu7ym8IFlwkBoejxceWYFukV/gq4E4bfKNYNJKq9ugEnG1wtSWRIGNARI/zDiEiSguapqZpaoTwXZtWKfI0JzM5zkWOTs6ISN718MOYLOXg+JhEm/PVWOBdN0Lyr6pXIWZU9Zj923Oe//pXuHvrbUIj+MDHPsZD73mE0WiH7/3RnwCTUVvLG2+9wZ07t6mWK5xrzkdTJNGfv7/nrxECaKUxSrOxtsZkMqIsu+7Z2fQIKQ0xdOckEITYtfuFkN8cU1BKIaUkyxMi3aiI0poYPa1zFIMcZMvp6RJlDEJ7iqHBWs9qZZEi7YI+LONUUlQCFySlkQQVaWpJjBItM4zOaW1Lkqa875mnefr9H+SNt17l3vFdjOzuU+QDYpRk6RhPSxMWbFwIPPDAgMUssHNRkAnJ+vqYhoi3LeVcUQxzhFCE2FK3FTFq2tajtejayD5FaYMPK2wTiV6S5prJmuZd7x6ytQneaxYzj9KSQINUuhu1UBIfHFVVEoLHJAkScG1DW9bYqiZSMVzf5mRR8qu/9mso5xkMCm6cThlu7fD4Q49w586bTMbrVJVHKNFVwZUmzQVKVzRzDV6DjsRgyZQl2hJjBkhpwHcJdGIE3/mdT+Gd5YH7r9OUnvFgxHCYs7m5wWp1ngSL0BVjpCBNs656GMJ5655vjgoJIQjB4/15NVanjIZjpJSsVqvzgFHgnKNtGoToxkzaxmJdS5okIBRKKRKTEmN3bkolFEXB+vomSWZQKpCmmmJgkabBB9jcmJAkmqqs/3CURYrz67S7dc4zKAZonXSBdhSEEBBSIIVCaU2eD6ibFiEkg8GIra0LjEYT7tzeZ7lYsb3+KJsbu8wW9/jGy1/lhedfoa5XgECrgkpapOiKFja0CKmoG0W6mXPtfZr9l1eIwYSr79vi8ruHvOcvJPyVn/5LtFXKogj80r/589w9nvHq4e9S+5bf/Ce/RTpc45Pf+xcYJxtcv7jD7/3ul9m/LVm/Jtl/2dPW6zz50JPMju+CMPg2YKsWIaCtPM6BSiXFaICWEd8ERpMdptObhFixUUz48DPv4re/9hV++d/4D9/5gerf/q9/5bMIiS09BMF4nOKcpW2mpEqS+ICvKwQOZx0iajY2t7BthXclUqYQI3XVdrN3rUdrhTIwGCrEWJIlgnrlCD6g065dEWOKQvKlLx/wwnNHqPXA1lZGUwYoPemu4WTqkD7gnKb1c65fe5JPfPwT3P8eePvGTe67pqnmIxYWCgNCpQTXcG1jg8VR4KHrE/brOY0QpEWOi57nXn6VJE+QScXxbJ8v/fZXeOWF19DmDKMkWS4RMSGEBhG6z/5ZCTaAEiC7+h8RiUcifEKqLc3dhLBs2djzRG0ZDjISLVguwRNZlV2Apckw2uM8OB/JRELwmrODiuJS94Gdv+bxAnwWiFU8/1KVeC9RQjGf7TOfnbCcThkORwwnI1Z1g3MRoxK0SJFKYjJFlgoSFQmNIFsokjpCYhBnMLu1wC9nNMOG6SowSsbU0aG0Ry0sZ7fusH19kygdzXzOar5A1FD4gsWyJtEZ5XHF2VGKHgkIgtPZiqSoiSqlrgWJHpGuQVJAszjDHy64/dV7GJlSXBmTDNeIq4Q0aaAWLI7nJKnEeUtUkUBLcALhINoWLQER0EagSFFtSkOFyAX1yuMbgRCGeL4QCadYLlqKNMPGQJIosqHAi4BRiupeQbU05ONAMYooAkkW8QZO9wPtTNG0FYlJMUYD3bySlJLxZJMYuvktrRVSCLRW3XxWCIBASEXTOrwQoAxKaYgQQ8D5gG09p0dThsMJ1gba2hK8JMsHRALOdjOjR4fH1E2J0jVJFliuaqyrUTqi0wzvPc757stIakL0bIwXbO/W3Ly7z717S7SRTCYFWnfzZHkxwNqWLE/ROmG1rKgaS912gZw8/1JR3zxu0bW6YtdRiLS00REDDNOcpqrZ2bvKT/z0X+d7vu/72d3axFaS46ObNNOXeebdVxG25Oje2zz2+PsIFDz31W8wn88YFXsgCkZjRZ7llNWC3csDNrd3OZ1Ouf/qfTz6yBUu3b/JpetXefDBB7m4d5k/ePbLbKxv8tGPfoyjo2NOT85IU0OILbNZjbUOrQPetljbIDEo2a1xSmpkCjIJFGlCJjXYhkBDzAU+0eAVsYk4C1mWkucG13pCDIQg6PoqESm7iiNCIgiAI8bQJY9JgXPdzN6yXHLv8IDFqqR1sJgvETFgTEKMkbouGQ4GXLt2jaIoSFPNux68zLCAYpTz0MMP8dijj3H58iPcfuMmv/m53+BffukrvP7ai3zli/+ScrZkkGXE6HEuQFQQI0rKrjPpA9okrK+vkScJRZ7Rti2np3Nms1MOD++dv78epcF5iCFiEoPSCuc8VVV1XQGl0Eai025utWlbYoys6jnOe4RQXHtgF+9bAjBZLyiXjjwtaJuafFDwwLUtQnmCFW1gt5cAACAASURBVIKjmwd44YCE6e0ph0f3OD4+AS9o2yWbWxPqEuazhpPjGZfv26Bqj4hUnJ0E0rRga3uN2WLJqjmkdTXBGu686Wj8GFtvdEHehmK6mjEaSKzNEWJA2cxZljWDwRrFIGU4HOCspGks2jiIkUR3AVNiEuqqZjTR5MNAcDnBC2azGfkgZzBMyAeKVdlgW9GNV5huTtLbFq0EIbQkiWIyWUMmBXvbFwntPVQzY2vrEnsPPcKdO/tsbl/k3vE9bt4+IEpD4y11W5MVhuBaggsIcqKVKKnRJqNuAip07W/QxGjJsoxhMaAsV+zv3yFGzivCtyEEdnfuZ31zQqBhPl0RgiKqrjppW9slrbEbH5Gym6mv6/qbgasQkp2dHcajCWVZUpZlF3xo0VWlnetmZOL5PL9SpFnetevP972AwJiELO26SHk+YDJeJ4aCatUyGBhUekoUHi0KbA22tRAjaZKgzmdcO+cBqejmrUeTEVVVs1zNeeyxxyjLiuVifj76kmGtRxrFslxSlSvu3r3JYnnKhd0Nlu3rfP63fpflYoXWirpZoVVBDBoXKpTMMaIFuYlMKmQJV9+7x/f+62O++IV7bK6vc/2966z8iGc+NOSrv3ebBy99hrdO/jnHh/DVN2/zT3/9v6WYjHnupS/yE5/4MX7qkz/Ds1+6wY/+7Kf44ud+m2d//0WKwrJcDBkqhyhW3H39AKMkTlpm0zmbG+vUzQobBEEokjzj/uvv4uT2fpd4JkvaZsUwhwtbA65dvMJrt9/iFz/zy+/8QPW//B/+s8/ayoIPFMMBNiwgCh68vIVuAqvjhtmsIc0SrJNYbzg+OMPXFThHK7pBmUDABUeeZwgliDqitSAfKIQMqDHkRiCcIEehcoVSmmBq2ipQnwgm4jIffPIZZnctVhlE7alD3S38QTE7c3zmZ/8t3nxN8OKr3+BkKkFH9l/SyCSgU0khDA9srhGmnmUbkcMRWjnaRU3wATNusG2Nrw0oRyG2yfNu8rjIBwQHIXji+Saa4BV1e97+kqGrcvhu7gzhu5afs1T7kmvXtkk3PEoHkJ7WC2TusU7SNB4lNF60+ChJh4G8gNUiIFNHnoDQE+rGkSYeJyJrg5wkDyACi4Xj8u79nB3WSARHh0tWS8Xp9IRIy3BYkCQ5ShdoI2nbFVvrI4RLaFzDW/t3aBtHeXqPJIvUJ1MWbUWxk9EuUvISYtoQbMrZa0s2L+dcfiblaHqEcIpkMuK4LllFgRk7xmstemBJtgLruyB1g1QOMZbIuERULbPnW8RsSSNPKc9Oqc7OqIolMhpkKRld3KE5W3J2a85oJDm7vaBZNpixwIn2/MtSUJ8KPvGhH+ThB69z8+Y+2hhitOAsWhmSoSfKCELT+q6SZbQiOo/JQZJAOSIQmYwseZEiZIJ0OUcvtMxuB9Y3xzCIqESC8OAlh1+PNEuJ8zUiKqToMnSlJbuXdtneuY+9vT2aqqRpKiQRKUCbhLZtumDGWhACjzjfvCJorcUkKXmeYpQmMYamqmjb+rwiK84X9q6NVtcl49GItbUxw2HBd7zvKQaDAcvlnNA02LrtFlppUCZQ+wZH4L77h5hCYswatha0ztO2trv+rcM7hfWWPM/RImEwXOPp7/punvngd/OhD3+Is5NTjo/nKJUgpUCgEOjzxd9RZGOQpqustgEfAtPlnFdevsl3f+BD/M2f/5u8/cYrvPTSCwSh+do3XuHl19/Eu4bnnvsSX/ny17sFSmk+/Rd/hu/8ro/ywouvcHp2zOb2hMWq4tU3bnByfMzTT32Y93/oI9y8ecBrL9+mtlBXljSRPPTQIzz+vg9wcHTA22+/Rtt4rl9/hI//wA8gleLkeEZiMoT0CKnZ2t6jGBkcKwSeXGckaUoTPEk2xJgcX63YlA0XRpDmEecDy2VNXXdBvBAST5dsRN9VHY1JkHTtRqkiMXQbc7yvWFU1VdUSfLehpVwusW2JlgKlNKlJ8NYhEJRlyaVLl3nPex6hrmuuPPwQa1ev8cCDj/HQUx/iyuMfxdcrvvC5f8iF+y6gfY1dTZHenl+jXWXFeeA8edLGkCQJUkm00Rgl8W1NDIHlqjof3Ui6SpOMmCQhCokUoLSibVuc86RJ1q3bweN9F8Cs5ku8DRAEMUSEUGxubbKzvUWiM5TU3Ll9lzzPkSgWsxnhfEPWZHMdORgSRYavK5JcITPB4e0F1dkCjQTjGQ0nPHD1Ed584xZHR29zenaT/Tv7jAZ7PP30h/GhZH9/n+l0yWo5RWmJUQWzuSMZ7PD0E+/DyYbjkwOO7q4oW8GqTml8YD4tsc6SZ2OCi1hX0TYVaVqQJgWSSAgVUkq0ASEjTduymFfcvFFzfBRYVYJyFWibQJENISjOzqZo020eEiLgXIMUkKUZShkECUam+PmKOye3aNvAejEEA7fvHpL4hDu33+LO3RsQFVVTdpuOpMa6FiECRT4kRk/AE4AYBN5WONeidNZ9X9FCjFRVTV2358kLtG3Nd37gA/zyL/8dbFzwj/7Rr6NEhgs1UgUkiiwr8M59c7OoUuqblfQY4/lonSJNU7TqNvHW5xsBTdJ9FoxR3WxxkjBZm9DUdfe71Jqq6jah/atEu6pbEIK8KJDGsCxL6nrJfHHIaDgmBs2lS/fRVI7ZdEoIFiEUw+GwGztQBim6YDrPcwBa2zBZm2Btg3Weo6MjgvdEESnynMWqQuruNyVl1z1ItCZJDXVTs5hHjHFEDEKk7O7u8pd+6i/z7LO/DzGiQ4OSgsq2EA2BiDcFqzLl8uUhH/9UwR/8Lzd55OH380M//gwvfv4m3zj+Le7Uv8/pzQU5L3H1qYrV3QXhrEaM3s3R2Ql/8JUvoeSI3/78P2T7yoTNiaA8WaJjiikE6xsVbVxSrmAwXGe+OiOagMkTat+ydWGda9eu8Przr3Hx2v384I9+sFt3qpJvfGWfF54/Qw8Ev/CZf++dH6j+J//Vf/BZZyNJluOUgUQhGTI7OGF+q+RsGUgSQ7mscQ2ExuDd+RC1gUYGpAioBIL0BOdIswxMipIZNJbDA8/u+hbDNUGapcycJdgWX1kGgw3yQrA7WmPjcoFdbXPhoYRZe5vp7SULYRDeo6ymrle8efQFlm7FYDTheHqX3YHCl4EqVtjYosYt4aRF3DyhGldcGq6zKQrevX2d0HhkKrl48RLlrKb1NdPpAp1otDa0zjFeT8nVLnV5ig6aauZxSNroSTIoUkNwkhjB6IgnkiSBUbLNZGNEq4/QmWS5ErS5xVmBrRwmpuAsQnX12CyFYSrQiSKkATPI0FVguV/jlGT7miQZOmwKB0eeohhjK89zz77F2sTg/QwjBuRrgXzQ4MOS2aylrCNpkTJME4Z6jWG6RVNN0bbCaMnWhTEHs2PkIGcVPc5CupZQ+RntsUYbhdkQ5MMdKrUHzZyjOzcp3ZKxymhXDQvnyYUkzxKEcFQBnLIoDcpmsJ+ynELdrrClQ6GRE0edeIZGI1aKptFMT2ZM3zpmMhTkI8HhnRnrW4FWeaTMkY3GCY33jkevP8N7H/4IX33xi1CcIY1AiQGzaUmwgbyQNFawarrF21cpifFYadEmkIaIVopQJZi0IClaFseB1kvasmVSGMZbkixL0VqyeV9kZ2PE7ddrtFa0ztK2NVqltK7h6OSEo+M5REdVzomh28BWVSVaKdIso7WW0SAlSbNuxts2hBBQSUpRDEmkROlIxGGMwHsLRISENE9IM4UxCU1Tk6aGIh/gveLwYM61K+/m5GTKsqoxyYAaT4wWJQQ2QrSG07uW6SxHqzGr1RznHYiE6CVKCnTSBfVZWjCfLqlax/7pGe969FFMlvLSiy8yXkswiaKtXTeHJlqcq/E+UBRDlO12zl9++GE++am/yO7GELs44YWvv4k3a5wujnjjjTdwFdh6wWSzIM8TtJIYHM6uCDLw2hu3eP7FV1CmZWfnAvNFC2bG9rbD2cDxkefw7glZonjogYucHdzlvvv2+Mmf/BTWaYJUqNRx460bLOdLtEn56b/6Gb7v+7+Hbzz/HPv7++dt68iynONVxdalgEgc02lgPNgilTnzkznOWXb3tpiMMhCBh9/7KB/44HewuTekrE5wTbcWKhQSff683UY6pTRSgHUV591ylJZIpSirFVoLRqOCRCtEFOAFwXus7YJLrbtq1cnpGauyYri+w86DV9m+v2BWHXN8MOXF17/KrcM3aRYlUgekCiyXK+qmJMu6gMBaz3iSE7BY67qRIvd/UPdmP5an93nf591+61nq1NZdvc30zPQs4myc1RIpUQtpk5EjWRJExVFMOYkTOHHsJIBjx0gcMFe5MJKLIFdG4gsjCZwYShBbseRoMSkJ4iaOOBxyODM9Pb1Vd+111t/+Lrn4nWkJ+QuYBgpodHUVTlef857v+3yf5/NYOterwbapSLQiOEfXWxDXyX7ZbwScIxAwJsI7h3N9QEYpg5Qaa3syhBQKUATv+4uMEEQmZXd3G2M033/7I5bzgtFkhLOauqrQwuDaQGtryiqwqixF2RGlYzySw+OT3j85mOBMRdcGBAOqlaNpTnj6xkWeeHyPuggs5zWN1zz59HW6rqEqViSpQXiFcw1ZkpLljrOTBUV7RJQ6QtRi24AtwImWtukQIkLKfkgVxBgT48KKJA3YpkOrAVXZYtQQJYcUS0ueD4gSi8Vx4dIQYwJd23vpu2ZJkqS0lQYCXdsHh5IkoW4qhBRUdYUnsHv5MmGoUYVlM9/A6ZTti5f55b/8C0g6ZkeHDHKBEJ7O9qo4IULLeP0886wqgTQWLQJaJaSDDASIYKkriwCcb8nzhChWbG/vEEUpGxtb/Ivf/irv/uA9qnpJliY0ZYvAkyQRkj5E97Ga2quUgizL0Fo/8qT2FoCAMaZP0AvQWpEkyfpSY3HOU9c1PoT++eU9aZquv9ZijGJjsoHtPMuiZD6fM1vMSTIYDyY0paBtHA8fHLCYt8R6Ayk8UkJTN0B/wXcukCQxdh0MjRNNZ3s6i8cjJERGo5QiifvzPE37jZlzjra1KBUjhaSuWzwdqECkU5R2tI3nm19/CxM1KB3jmhaRG+I4Id+GvU9GjLYryuKINtP8yAt/mf/81/4Gi3lFdeGY4e4dhluW55++wKd+9CWGkeO3fuOM4XAXnRimR+ccvvcBjJc0B+9zfm9JF1tWtSeSmulRTbcUGK1INi115RmPJ5hEUlHTBk+QgcFgyP17R/iuRaeGm3ceolSgLs5xrWV8KeBdwn/61/7OD/+g+r/9r//NlzutqXTCYKDIQsDKQBkq8C3RxBIniuA0RnSMt20vKdJhG4+MQAwDsRkhmoYOEEYQhYgoapme1LRN3adXVyWXH7vep51ty2gjQpaK8STi+OSE2ek53/7uexxPp4yTp5iXpxTLBp0LhHBERnL98nWKacH5bIYtT0k3x6yk4ui4wnuJST1WW8SOxEs4dQvycsKmjojihNtn55SiIYkgHirqGrSw5Cog25bV3FJZS3UO3UHvv2w16CyQG4ESnjZoyroP9kgTQCmcKumac/JIkW0K8i1H6BKCavEBRCdpvUf3Fkp8C84leNdilGZn9wKzskbmHWmWMxhZvNPM7xlsa+lkTOiWyE4i9yJUIclzhUgVdZvQtTFdVdOUHctVzZUrFxhmmnrR8NilS1y7vMvh6REi22Bz5wohBEZpzkAolm1NiWYwyRBUOCGROkNbx6yrSSKQzvY+Rtuig6L1AhM82hhs04GTBBRCBLoQKJeeeuXQpBRdhVpKci2osoa6FnT3PKKKubC3w+gZSVk5mgXE22BxaCvoZIcRjuE44d6H3+e9H7yNHJ4RS4ntHL4LvPniq1x/7DLn89N16tQyGjpSs4t0CU2oiGNBpiWzqaOaWnZ2NGyVLO8lGDumbEtsiLj6WMz776zwbsjO5gbnc8mDD+cEK/tgipW0nespGM6Bb5jNDkFa2qYmjjzjcc54Y8BoS/crf6/6G74QRJHuqQCuoW0qirKkrDuCCygvSU1E07UEFfXbjSZQVnOUEjStZbFcsljNmc3PeO/971GWJUJotNRIJ8H3qzoRLFJ7glSkSYLt+vBE8BJvPVK3pHlvF/AhUNUlXWexXUNbnXPznff4zjfeYTE/Io5zuqYPh7Vd0x8aQhFQ1K2l6RoEgvPpjLqO+NVf/Xf40q/9Ff7SL3yB+XHJ/VsLjo7uo0zHtRs3kBFc3N5hczzGCoGXKc4JhFywOclIIsOqmFGWC7rW4WPJZ37q83zxl/4tDAnzec3hfM4rP/ppfvmLX2Jy/QmW5Yx21XD9sR9henTGw4f3KcoVZ5XHRCl2Mefk7IzWNyjRYb3CVgnVClZLx+7mBZ64cZnHn7lGbCJO94+JzIA2aM5XistPvc7F6y9x/+EJp0cHCKFobb9KD4R+A9PLrMSRBm9oa0kIHtt5vIv6cIhsMUbSeUPV1ARv0VHUq21dh1ISIRUq0jjvmE5POT2fsX93yd33ptx85w4fvv1djn7wXR6++w6nB0dUy4qLOztopZnPWl5+9VluPLvH6dmcvSsX2d4ZMD+rEOgeI+UdKvQqdpInSKMIvvfzfezdFeuQmNa69yV2HQBR1OPYOtuipFwjfQQuOJTsBzKHAxmYTafMZlMIFttKhIO6KOjKljzN0SqhXK7I4ojtrQF1ueo9ik5weP+Yi5s7DDJFtajBS4pixnR+RNtZqlpy5doNPvnq8zTtnIf7t7h954jNzS2efuY6d27fpu4cTW1IkgHSJJydPCRWDXXV0tURBBC6Q3gJ3tB1vdIopUILye7OBa5evkJbOYqiIRCIYo3zHdkg4vLVXZxvkFKyNRwifMpqWTPegK3thqt7A0LrKJcdnfO9p1QqmrbD2j5wlcQpj1+7jkMR1bDqun54yydMNgdcufgk6XDI9//4D8hNRNUIrLBc3N2iaKY9GM8K0nyDLI0pVyVRlPQqI726HUURl/d2KGuLd4oQWYTX2MUMjOKdH7zP+ekdXL0iNprWdly+egmt+9da44r+PAngg6K1ga6t8XVL6x0tkK7/LZubm3163jvKqsDaFucsTdMQRREQaNsGY6I+jGcMk8kEHcU0bUsUJ0wmEwaDAdZ3VFVFmiS0ZUee5ygTaG3Zi2TSE0SL8w6leuyVVhHO9YO0EH0Qq/+9IjiPtf3zeJAPkLIfQltr6bA467FVh+88wXfYrkGIXglWkUGaFN+sMDrG2TnLWUHZerzr2Ly0y6WXrrL99C4L2aJGJU3boLTm7octp+9Z2p09Lr+0xere/8XtWy1PXnmW4mDMa5/8Fb7+la/x+//8Dt0AHr/yGv/BF/86X/i5n+Xtt7/B2fSQ+/stTnhs0xHbDfJUsXW1w8eBsoQoksRxTxtwGLJ0iK876rKkbleoge7tXWZEvlFz8INzSEasVh1VWfP3/ub/D1b//+0/+gdfJk4YxBmuCFQrwzjbIAo1tqsxEdBpgm3xnaJpweERqacoNb5OGA4Vi0PPlce2WdYNtqmIpCJELZEB10qqukbJwOnhrGfhBYetA8W0ZlUGRK6pKsswFoSo4ng+58KmJh/2CkGxDDQoKrvC1p66PSFONEp2zM8lTWOZ7HiCHxAax93vSWRkSAee8mzKwweeebkkG0GnKzoT40OLDoJYaAwWozzjzQs8PChRpibUCWIDFhUkiWCUZeTDnGVZEBnYUENiA1J5VBwxGEd0tuHihU1kXFPVHXUFXW0wUtB512N8giBWGqFakkz2L37nqKqCNNEkg5YgPcuFY/bAk6YakhoFJK5lc2/AdLYiTT1JkpNnEUY0bA4nGJUyGiYUsznXdp5gMNjgz33qx1lVGmdjyumc6rwk1yOaeslpUbC3t8NGNgAXI82IVdeB9IjQUS1bjBJcvrbHzs5FyvmCoq7RcUyeZWADUaqpmpbGeoJwRDkMt2JULlhVDi1S2lJTtE3PjI0sow3Noq3Z2+0YZYrlecPytCQdSqKhQySK1llsCxtmi0SMCfGCbOIJSuCtp3wQmJ+mCBFhw5Kje4q9SyPSQUuWtNTLDB/6YUpWOaEVdE6yNRkhXMTDjwpwHUnc0paC+VHE8hSO7zY8+LDBlwZXOiIToVXUKwZRxGCQrQ9AQWQSbKsYDmOcDXRdxGJVcHKyWB+W4KzHOXp/pxc41/tDn33mWZarFV3jwXu0SbBBgPJUdUUQDUkqCQS0iTDG9KGmIFAywugEcLhQEXC0ne3JCNqAj3GtR2uPMQrn/drHJbHW0XVirfgFrGtxrlsr/THSWKwrCBiqoqZpKnzov7f3bm018wipQCuQglBX7IwG/MQXfpbrb/wo8fYeL77xAq+/co2jh+/x3T95l9VpQzmdcny8z4OHZ3StJY46vKvZ3tplc2OHjdEum5t7dM4z2dqgXnoev/YGL7z0WTYmezz1wnNcuXCReJjz9q19Prh1zrPPv0xqUkyaM96U3Pvoe0zPThnGCZ//i3+JX/4rv8Ti7IT33/sALyAiwocG6x3GxAgtiBPD8y++yKWrVyjbJZaax67u8OKrz3L92adYLlb88R99A9848qGiapd4FyDYNQVkvRIVoExFnBdoo4iMZOeS4emnL5EYzbxYkSae8UYgziRd3VDXLcZopBR9glj0fkgpwbc15fkh05MDLlxMuPpYhhTlmncq0FpSNQ1xHGFMSVM1PHn9Cd547QZNUXL31glV069yoyhC65i6bWi7jshkaJVS1iXWuT70t6a5/H8/+uG1T7JrrdFaP1JuQwg42/REFBmvrS0SrSOqskNJ0YdUVUtAEOgYbgiaxtF1ECWGjdGYrmzY379LkiakowHT6XnPuw39YCKlQxvJ7t6Qk5MjvvaH36OuGuJMc2HvGjtbT/KV3/tDAo4Luxd49tkrRKZFhRxHRxNSOgu+8eRJSl05lnNoWovEYDsYDDLSJGEwGDObLphOpxRFiVI98SCO+8BPURQsFkum0wXTacHp2QwTabqyITQeWzbsToakSeC8DIg1Y9kT1oFHS9t2zOcz9u/fpypXLFyJVgaSmPv3bnP75n1u3nqfabmg8ZbTZU2QOeWiRWEQIllTO/q0uzGGPE9ZrVbUdY3WmqapUdIzLaZgO4ZRTtvV/Htf+hnKg3vcPixJ0ghHoK5632pTN6yKGoIlNglGa+o20NkCHzqQEhE66DpkcGuBoveEeu9ZrRZ9cG9N5/yzn+tZ0z3Oz1pLURREcURZlj2/2Xvm835G0EpgncO7sMarCcpq1ZMDuv6cE0LhbB8CV0phdJ8BiIzBh35obduWJE3RUURV1QDUdQ30gUCCRgQFQuF9h1Q92ccHS5Dr886X2DYQdMLFGxtcvfEYb/70q1x8XGG3ckSW0RQPEKbA1iXVwQaPX/8Eb9x4imsvdGh3iwvjLU5PZgwqwZ/cOaDY3+Jzf+GX+cbvv8W7d27yxI9c52d++hd5/c03yUTGv/z1/5upPSK4fsMmhCeSHhlsjwlNBHEk8U5gbU0IkuH4IiZWeLckiIDQAzY3J8TJdcY7gnJxyNm9mqvPXeF0f0ESS/7uf/Rf/vAPqn//v/v7X1apQdmI6eGUwcSQDiXW1iwKR1dKtJREylEtBWnu1kELTdtYdrYj3ErgK0+SpUTJmNh0tM0KYQxxJPsbtXA950sIpLLkqaKtHCJLUKpDdB0qBTsIuGLIP/wH/xMucgRhuXx5j7P9Yxye3Ysdwp7hlaUNKZGUHB7PkCikcf0TWPieHxkpRGX51K/FrGK4PZ2yVBaLZjmtsac9hmRrYpgftlQrqDtL0dQ4p3jmhT0aJHWnMTKlKT1l2aCNQdSe5kATCoWULXGuEAoyHfPBNyrO7k3QpkMqj7ceWztUDBsjUFHMamYZjkBFfUChWLUoTZ9azR3zuWB+FpFp2Qc/opzYaHbTMdZZGjpWs8DpfMFsvkIbw2iUc3J2Tut6csDj156g8Q13HxTcevCAw9N77Gw8xovPfZJVe8KtB7dQ2rK5cRmjN+isR6mIYTqkbApULtkaG6I0UHUtJ4cnbI0TTCrpnKCuFMEoLBHCZMRp1q9hmpaqbsgyRTxpqU8MeTykqRoiBEne0JqW8UXFIDLEuuDkQGFEjE4Fq2PNaiUZZv1KO7cS21TYLlCeQD5p8UJTH41pm5p79+5TLiTzk4K2FmRxRBYNifWYEBqCaOjOQdDRBmjLivlRTdcGhvkQbw3el9RNfzgbIQltw9nB/BH8vqr6g38ymfQ+q659xBx13mMdJOkI6zxNt1YQQoRzFcqANgrwONcz9pqmZHt3g82tEUnSKwkHR6d9mKlrsNbjO7v2kykQmsik/QrNW3ywIDxKZGu+Za/ca61wXUDLiDwTXL6yQ1GW/cEsXP/3XEACIXSE0F+eEJ40lQTRr9pD6B9vFClG4yFK9ZD4EHq7gA++/9m40IdqhEES8fqnPsXWY9dZYWmRDHe2yJMhn//MZ/jSr/0CIpV8cOsutu1AdLgOgoXJeMJiseTw+IgHh/dZFmdkgyGJHvHgzildMmLlPe9++ybRSLFxOWU6v0uz2uf2D+7y7ru3WTUte1duMH14yt277zOdT5mWFrW7w2Az4+TeAQcH5+hIQK9jkeiMYtEwyPe48eQnuf3BTfbvHvLZn/1Fbrz5MudVhbMaJSQnD+8zPZmRZDFt67CN7ocwr4B+5W87uLCXsjGJKRa91y6JA1FsCEFj24Y4E8SZw7UdkoSu7f1+rAcOgLIosJ3l2hM3eO7V59EDy3zVcffukqLuL71tWxOEoKga6jagVMyFS5fJshEffnjE++8fcHB4ihAxISguX7nC62+8wqpY9R5bbwkSqqpZB/HkWpHqrU09johHq12l1Bq95v7MRx800kr3QcLgGI2H7G7v4Z3E2Q4hLMFHCJ8ilcJEA5557gZt13I2XTAYjdgeT7j30R0QcPn6VYqqZjab9hdE160fk2Q0StjeukBTNwRKkB349AAAIABJREFUXCewTrFcdSyrU4I860tOYs3FvUuELuG9H9xERSmdb/tBWxnSQSBY2BrvcunyBWaz0zWKTuGt5/TknMXqnPAxI3a92l6tCtqm699fVM/U3t66QjpImS3OkUYjVIrzKctacDqvqa1DKklnLVJK4iRhPN4Aetj8ZDImSSNG8Zhrly9y96M7iNZyeHZI8JbR9iZaD3j1tU9y+84HBCeJ0l4UkVbghQUCq9WS5XKJMT1FouscWZrTdo66qsnjhHplufrUk7zw9BYfvPUOi7DNIIIIw2MXJJ/YS9FFS2Y0w1RRz0takYEv8EGhCER4hMlxkUYE2fvXJcwXs/XQzFrN5FHwyvv+vOh/9Yp9r4ZK6rrEud5a1NY1SRzjg+svw4T15UhhbUfT9Or2n16eAnGcIIQiimKMidbna7/paduGNMtwzrEqC7TWWGtRSj96fqdJgtGKOJF01hFFQ1QEbduB74OZKkTE44Rn3siojaZJI65df5KN3cvcOnjIeNxxZdMyHCj2b2VMNib8+Gd+iZ/7uRf5V9/4HV7+cz+LrQzNQPLh945YiNs8uFPzwk++xuz9Dzk4usXFx7aou5oP77X85h/8FifFV2iKPusT7DZZbtjablAyYn6aE0WWSEc40aBETAgxdWfpmsAo36FuO3YubxKLLRqvifOCtjrg9Vc+g0gEDz48wRjB3/1b/8UP/6D6P//jf/RlqQpCJbi8sYPUnkYplAnYqkDGjsgI8jQwP/JU04gkCoyHBuNHHB9W+K5niQ02IqI0kEaXUMmC4AzSdNjG4jqBNp4oBecEUinSgaAuLc4DSYINQC1plpZZcQpiwuKB5XOf+Sxnh1PynTkvf3qTB3cUo82W1cPAw9uKaBho2g7hwaSSze2Iq09aFrOIeENy4RMX2X/PkfkBrmwQXZ8M9E6gTEB6R2gTVsuOugo9RqgIWFFwetKws7tHmo5YzTuKcoHRim4ZaBYBu0oZ5ynBdcRpQ7vwtNMB5WzO7EyQpzGHN2O0lGxcFBTnHhUbtvd6UHNdaeKkV7KVDmS5R2g4PQIlNcK3pKOkL2KQNeVh3l8SogJpJUUbsE5QVS0miliVDdb3QO0rl/f44P4+xeqcSWY4OrjP29//Lq0e8Kkf/4sc3Dvm+OSUk8MpJw/vc3JwwuUrF1AJTOfnaDLiXFO0FdZL9rYuYoxHxz1zTgIulBitcK5FiBYbGoQSSCOxosNoQzsv6coSKT1d0ZAMElzkCc6AbFAyo6ljImIckh3RYs9rkoHE5y3MLE1lKeYdyxPHzqURZ8cd5Ymgqhx5HqGlQUlJu9IU5zH1QnH8cIqgQ2twy75JpxOCQZTgG4lMBGhB3Xm86n9+xvQrI0/HeDxE6l5hiqIIpQSIwPHxMU3TMBgOqLsC5yTWejpbo6OAkAHvNNa2xElKEmdUZU3X9gpekmRsbW/TNA1PPvkMr7/2BpcvP85wY0hZF/2a0QjSJCWKeianc4GmafphWvRvDEIKui6scVi9IqC0JM1SiqLkxZdf5Fd+5Ve5e/eAk+OzR54trTXa6D40hgTR49CUMnSdxXkJXvaBwKZeN7dERJGhbe0aYG8YDUfIdYpXxDGz1RnSOl5/9Xm6VvP9t+7QNYZXXnuel157kSgZ8Fu/+bu8+4O3kdoh6ZXktnH9m5yssLYmS3PyPCVLNlEy4vJWzJOXtnh4fMzX//C3+dq//A3ioLhx7XFE6Jif3yOVBU9cucRsWnPr5nvMV4e9GlwtWTWnTLZSIuE5eniXxrZoGbG7vYdCEkTHk88/TZSOufneHVbzMzY3J5R1x3I1YzIZURUd7793k+OTQ6xr8K5vtlIqBuEf/Sz3rsS88MlLVIXmow9mNG1FVXXEZoetrT22tjaIoh0e7tfMzxwBw9b2BhcubCGUo21KAh1ZlhLHmoOjc+7ePqJZlMSt4/reFoPIcOfDOzSVXYeXatquJE4GpPkG79+8xbvvvUuDw8QRwfWXkytXr/Haa6+RZiM8huPTcxaLGXFk1sxP1opheNRClWX5OpXdq1Nd1z2Cv3/cRCSlJNIxSZqgIwlScD5dUNUVcdxbU7rWEkQgiIrWthwdHfStcG0g1imHhw+p24q9KzssixWz6aK3KriA4E/VuM3JHs71xA4tBVVzRpRorj25STYqWRbnRIlBiBGLORyfHTDeSdja3EajidQ2Ii4pq5rYZMSRZLGoCNRcuJzQNYay6giyRsmIIDqUMVy4eBFB/xqUos9ajEYjqqrChxa5zh5YbwlSUNmOs8WCNgSM6csrlO4LInrvY9N7TZFUdUue5PjWUyzmBNfx8idf4s03X+HWzQ8IC4+Jdvj8X/x5EtNx59ZHqAiC9CgF1ttH/uKAhyDWFw2B1holDXSCxlXIRDDOt/nDr75F0QqSjQFDZ3n8+hO88eYXkGaXsu1447VXmB1M+atf/CWiMOODu4foSBLpIXWIcaIl05rGtnRt01ua1sPpx0Plx+Grj58v0A/PH1tK+tChRAjJcDhgmA9omqYPVnWWPMto6prOdmR5tvZKW+q66X3haLyDLMuJoghrLbPZDK0N1vakA2MiAn0blQ+BPM8JITwqH7DWYtsKZKBp+uBr4OMNWMDoiDyNKMqaH/vXr9LpFfPVBJkqjvennJwuSOLA1qjl0mXNH//BPdJxyjOvPcXi7CErX/L5n/gC792c8vDkJsNsh+OzD3F2xmj4Cv/aT3yGg9MHfPWr36apLN/4rbc5OzqglB8hkhWjC5rj9z2+AylbBsOEYtlSLA1ZDkIJhNRoHUAEqhLKpUPLiM56Xv1zP8mzP/Is9w/uEThEi5RnPvEaZtDxwbfuoQY1f+9vfvmHf1B97MblL0/P5rz7wfcoQ4uMY8gidJpRz1e0tSG4wJPPJFx7IuH2Rw0uQJJGZHlMUXUkA0+SK+bnlr3HNagU6zKK8yVlBXEkqQrLcJRw5eo1BoMx0hRESUw2TqnmNViIEoULHTLyzM7P2RguOD+f8/xLT3L/1oLSPqRTCY1c8uQnJBsxPLjjYdBhfWBzDJvbCTU13kdMJoqj/Yb3v1lTLFekW/1tWQhPLTyZ0gij6LoWZz1CB5AeW+WAoyzBtZ4gBEmuSAcRRq3wrmM0FsS5opUBLRKyNMI5ycP7Htf2oZMQFKsTQegaBhsCEte3PbWW4abBB9tbK4InjQ0mcpgkUK6grnocVpRLFkXHzshghOP+foNUDZt7GXQV1sUMxxGbG2OkjxlkG3SuJU9iEqmYZClP3Njh4ekBSiYMcsvx/vt877vvsGoWiGoFymMSheo8oRJs715kujjE+4KqsnS+JE8ijFCk+QiV5GxtT8hz2ftc6hLrmn4tbQMihL6xjASpHMOhJskyqqomHsTIVCPiliRWeD+iCktsK4hshhoYrugVu1pyUmniCNq5JYgMbRQ+eFYrEFUMTrJ9MQdZ88pLn2JrssnhwX06O8Pasm/CcYpY5rha0OJROifWGZvb2zRd/9ida5BCE0KEDyC1IXiPp1uHCBRSSYL3VFVFksTEcb9y61qHlC3K0IPPvSRJUkKwaB2jVNSjYQZp/8bctWij1rD7Gfv3H7L/4AHf+Na3aJsaFyxaGYLvm7hc6NuMQnA47/i4ZkLJCO9ArNuOvIfOWrI8R0eGuqqRMuX+nQNu376N94LJeHvNQGVdWKHXCqlnY3wBfIy161Yz3fuAP1YdqqpiNBr3DS+u//Pr15/Ae8uqWIHQSDQP757x/vdWlMvAb/+f/4R/9r//Jj94r+Bbf3LMV776Pb7z7T+iXk3RQlM3gcefvMozzz3FeLTDjzz7IpeubHF+NmN2XjJfHHLw8B4iGhK0YTE94q/927/KJ25cRwxSnnvzz3M2L7j18AdcfOoTPPOjn2bRHaKlpVqUnB09oC1b9pLL5GbCoqlZTZcU5wuk1gitUHFLOmo4PTrh67//Tfb3P6RuKvI85+UXP8HF7avc/vAB3/6Tb4EJfPonPsUgHXB0cECa5oTQV9t2rSfLIl599TVeeeUzCCKuPr7H3qVL7O+fsljOWS6nJNmExbzg+OQBcRahRMRjjz/JK6+8jvdwenpO1wWcA2sDGsEg0kwmW4wubFIpz2DrEo/feIwnn9ojEjGuBaMiZqclD/Yf0DQFWZaDd3RNjZISE2uMTnFWceujO73HuVohpWSyMebixQvMZrPe/yf+lEU5GAwA1mUW4dHa/+NwjdbResjtcN5R1x3KSJ557gnyPOHo8Lj3gyqL0A1NI8jylK2dUR888wrXOCyW5156ASsss7MZtJ5YqvXQ5VBKoDRoJUnihPlsSVVaZFB0ncNEWxwfLUjTnCwbonWKdZ44k2xduEBTWZbn5wxHS/Yuj3j8qZyiOqUNC44fNvhg0VGgLkAI3SPKQr9hMMYwHOYsiwVN1SCVoq4rqqpksrmBVI66rNgcb+LaDmcbcBYtNEpodGTW2KSe85nEMe3a0jAY5DzzzDOsihnH53O2Lm6ysTNBxUOK80OC1+RmQc0Zv/l7v8e9+8eksUF6ECKB2KOFpm371rrhcIjREePxmJ2dXZx1fUDKzfABxuMLlItjdFKz9BaahJ/+4hf523/nb3H18oR7t+4zPT5mMBGoYUKyfY3bb32TzpUsnaHxLZlukSFQdQ0J/euo63p6SBzHj3irH6vvIGma9lHYCsDavtkpzweP0v/B9/XDeZ4zHA6ZTuc41wf7sixjOBjQtn2zXF880PtPre36kJbvEXLGmPUGrKcTzBeztS2np3OINddVCIhM3IdsAWOGVNWSl199ljQZU6walFkRnEZFGU//2DbW7eGbDNdaLu9sUzUr0mSXYA+Z2nMuP3GBn/ncLtg9hnnMjatvEI02uWQbRvke8/oud86+ynAw4rnnL/H8tc/yzd/4Gn/0lbfoygB1zWhrhZ97EhV49gvbfPTVComlLhvaNjCeDDl8uCCKFNFgif3YNxz6jY5tLV3TIMyIZHCZa0/vcP+jtzl9eEhLysbGNSajhLe/9jbprubv/vX/6od/UP3UZ1/5ckLK5pWahSvJsx1Cs8B0GtW2FG1JWTpWM4VMW5INhRkmTFcOPV4wGnmKlWD7msMHx2wm2L66QZyMGEaKBw9P8V2fzBuOU/J8mzu393n++SeZnzo20i1UpJielyR56DviFwJjM17+zGscnDzknXfO+ORLj5FtfkQdluzd0Aw2xiyOAmcnK2oXUPSVkXHuqSrB/k3JbFojBmBiT2oUna0JMtC2AYlnVbj+hmeg7RTWB1QEtuybMcYXBLEMrMoaK5Y07TlZJtjYiNCxo+ocKoqwxSWidIZRkuWpwTNHaw2hxQhBnsdcuZHisgphNVEuIO5QPkdKR7E0RJHv4dJCUFV941c2UNSdR2nYzDJsA41wKGHYvDBgelSTbimGmzFZ3g+CbXDINUB8lCeYyYD3v7tEW831p4aI1HA6ayAsGEY140zSBEEdJNpJVicLmrpERJaWgiTyGGWRtqZpS1ZdRQgCgUTGYOINrHNI2SeICYEsivGNQ3sBkUWlHkxLOgHyDqsBkRI6iOMKrxSTYUyzXHLv/oxJ4hkPHbcXAi0T2sYRvKWrITIRwq87obO+R3x76yo3nniWO7cfoHWgrQ1aS6JEMMh2yONRnx7NR6Q6R0pB7UqWyxLXOBR9oKRrCyS970/rNfrKxHjXq5YfM/o+rhg1RhMnuv/aOuP64xdRpma1DBidcGFvB2ctq2KJ802PuRI9YzOKBEpagizpXIU2NYfHpyRJQMiapm5x3uM9jEYjmq7BrUMZzjmSJCbPM+qqwegIqfp2OHxAS4WJNMfHhxwd7TMcGYwRZIMcpQx1XSFlWEO6O6SIKMua4XDAL/7iv4H3cHB4j0Do+anQMz7blvlyQWf7xq6DgwPqcgnaEACjWzAdt/ff4ttf/1fMTh8wO/uAP/naP+NrX/nH3Pvwu+xuZSi5ZLU4wTeWLNkmScacnh2x//AOZb3PxmaCCBGrZYXQisVZwUfffZfTkwe49EkmT71CvTrl5Oj7HN+7ycF37vLW77/DV3/nD/nOW2/RBkA5zk8foEXMT3/+C1x/6ROQRNTFioP7D3BYiqJkOa3weLZ3crYnQ3a2NnnjzZdo2pb/53f/BMmIyUbO0ckDiqohiy5RzlpOj+/2gTXVYCJLkipGgy1EGHP/7hm3bu4zmezy2hsvUtsp1s0QquX4qGI8GRJnnmJZEumUsm754IP3uXnzJt6vNylCYz0oE2ODpShWzM/PWZ5PObx7hO9StncvYDL4+V/8eT71mR/j9v67fS2qlwTb4BqBJO2LFKxgPl/x4c0POTjYZ2tngytXLrIqFxRlxXK57JP76yCKtfaRetr3vMekadpj1x55DVlbWURPlxYwGA3Y3duh7Vru3P6ovxAJ+kKNIAlOr+kZmq3tDQiB06NzZKJIBhnHR4e0ZYNvLd72FhPn+9a+QT5ksjWkqRvOz88QOIwaY1LJ9lXHaNPQlJpyFaNijzQrcIbpWcV0esbu3oiLezGHdxeUC02yveT41FPPe5pBW8YoHXCutyr40BGZHGtb6rpcD+45bdOtPZaO5bL3Ku9s7/TDvBA0LiBNTOscUveXUil71FfvPVZ/JiEfkaaGRVXgq5bX33yV61cu8Xu/+dsURcl4sMNzr/0Uj127xL3379OJBDPY6H2KVQ14six7NBRa23tfu67//2vbhuXijNpJhvGE0FkivQAXuLB7lRdvPM9rr3+Wn/qJV7hz54TP//xP8f7N7/I7v/Ft6qZjVpzghaJJdijaJQbFYDAhz2JEkPQLdruukRbUdUVd14/KAPpQniFJkjXKqldZJ5PJmg7Q+329dRhjSJKUpmkZDIYIIRhPNnrV01q0UpRl2VuN1pWsENCRIYoj8kGvun5sC0iSfjsglVorvr7//DpwpXSP2kP0dpumLRBSMJu2FMWCjUlC1wqW05ZXPpdxXjVc3H2OK5eHvP7ym/zkZ16l6QomG5pidY/B9hOIXPLU7rOMzXXe/ImfJFMVv/7Pv84Xf/bf5713f4s/+PB/4fqz2wxGlpWd8d3pP+N7b3+VB0eSjSc96DF5voWMzwmt5aO3HbLJOHnQkGUZu1ciTk6W+CZFKUU+6a2HeIHSEbN5SRINGA93GGyMqSh4cLqPPQ8spw9xUcrlvefIkorv/fGHjC5N+Nv/7n/2wz+o/sN/+l9/+Wj+EDOOEdEE6yTBnTI9O0HGEm0sUQyuUxR1R+cEXjik8gjp8SHi6evXaCtJJzwmqyndKU3tOT8+ZjR0tGVAq0CWW6Yn55Qzx+m9JavjOctqShobatsSrMXYgBwKLj2V863f+AgTLZlOT/nSX/5PODy5yKL7ATExDz465XxfIYynqSR5YlHKYPEYBBtjS1GDrxOiuD9MDZ7OBXylUI0Eo4mNIo5SitIhDNRFYJAotJJsXzI46SlWns2tiM3NDBcarPd0PpBmE65evcJoe0hZRZw86Ei0oq4LvI8Y5RdABGynufyJmCauqeaWyZ4mqL5FabQFy5lFRR4pYxbLjtBTGfFeUjWwkUvqtsOHjiTLaQtFNA60hSHfjjk9n4KJWK4Kyq6mbkLvH57k7N87JUocr775FOPdLVQ0AOkYDBKWyxZvMtI8YqA1wglk7CkoCDKQqpwQOoxMMCZBGEmgIeok9bTCSyjOLXQG4ROSJEdFGZ2L8TLGS4Xvkt6UTkLTRnQ20NKBbEmNRKgeU/LgVsfu1tOEkDFfBPygpWgB4YlNysBEyKDWQY0UlcR0tkSEhLJc8PVvfo04q2m7QN0ucDbQNj0SqO1K0nGOEhKNpO0K5vNzFLLXJ7VAqwgpDISAdxIRNF3b+/SSNCWKYrIsXzP/+o8oiskGEQRF2zSkUYJREKghGJraUpQV1jpWq5K2cRiTEjwkkUIrh3cpqyU4a8jSAVXZkCY5TdOzO7WK2dzaYblYrtOzhrZtePmlF3jjjVf7DvWyIE0TBmlGXZT8yDNP8cTjV0giT5poTGTwQTCfL2nbmo3xRl+YoASCBGfbfiXbdrz9nfc5OnpIEA3wcbDG41kjZUKfcjdGr1VmA1IgdYtEEOjDZ2nmcGKJSh3pJEbGngu7A1559S9w5ROfZHSlf20cHt7m8OE+o1HC7oUdmtqgRIITJUonjAe7/NTP/3meevFZ5tMp3/nG7/Kdt/6A8cYW06Lh3Zsf8GD/Lsdnd6gWDwnLJacfHVLMS0wGVV1SyRFyPKJZFNz8zk1Ozg5QkQYXGA0SnnvpBs+/8iatj0FFxGbEzXdvcrR/j8/85Kd5/vnn+e5b3+LocJ+7tz+irg649tiQtvMUpScg6ToPKuBYMl08YFUdsv/gAe+88wEP7x8zn1q6DtI4pXOOo4NjtifbTLYHPHhwh64rgQ6lBVlmsK6hszXOWoQK2FDjveGnfvxzfO6zn+KbX/t9Htw5ZjK5xNFRxW/+i99ntljhQ0OWJzRNADxBrHBrWLs2EhMJ4jhCBENdNkRGk+VpP3D5/rLcD599iLWu60erW2P6dLz7M8OAlAKpBISei3nx8i6N7bhze580TVCqrycW0hNFCVevbbJzYUhdWfJ0wPRsRrGqGI4HLGZzXNth6w4tNUIJfACjI6IoZmfnApHJmc2OaZoCoxO2dnOCEWTDEctln4NQKuA6SVO1HB0f0rUtaWbY2jXcvTXDtznTxZR0kHDjuU2mBxJJCkI/ssEYE/fJ/CTi4t4e0+mUJEn7qk3rSeMUpeS6Ucngne/VcO9QScRkZ4SIa5Rpyc0Q21mU7Akg0TrUE0KgqStOTo5oKsnrz1zi++9+xOFHH/D0Yxe4/sSL3P/ofS594iXaVcl2qoi0Zf/oCBMLZPB439sImqZFSU3wH1MbPHVdEUcJzhlUpFDaURYldeOQckTXWYqq5uUXX+Cje3M+9dk3+Se//lv80//j1yGdovUmf/VL/yEf7H/IanqAEgmLqumFEBHhQosWtg9V0ltAjDFrxFlASs3Ozi7BecLaex3H8SOvc1VVFEVBbAzb25uUZfHofDs4OsKvg3xSQlGsei+r7f24Wqu+StoosizvWdBa03Ydo/GY4AMhwGSyQWc7iqIkiSPgT6kWaZxg12SAXoRwGBXTVAKoKKo55bzl07+wzY//Qsy3v7Hg9GjMq6//GK++eoN37/8uH977ComDx668wBNPvMDRnY7PffoXePzak1zeeZyvf/M72JMls8GS2/f+R/KLnvs/KKAzpJvAxhlyLrnzTcXlnU3EMrA8nNLJhHSQcPpuxfncI4ME2XH9uZSDBw3YmKtXL1EuIpTySO0QUjI7d7QrSds2NFREGymthWr/kMX5isFuzoXNXb71rT+C1rFxYZO/9aX/+Id/UP3v/4d/8OWdpySrqqaeSSITsZyWaAll2+A7QRzFfQov6lskFII0ckQ+ofaOJ3Yv82/+yt/g7sMV89U+TRN4+LDAKEG6bmYZZIFqZRmPEnZ3wBUdUfBcu5FxupjjXMDX/y917/msa5aX510rPPGNO599uk/snGZ6pptpJjTDMEKCQlhSCckuDEjCMq6iAAXLpZIKFSOX+aBUNlVW4bJchYRs7LKQkEFkhhGMmplmQs/09HROJ+689xue/KzgD+s9G+k/EOfzObv2ecOz1vqt+76uhPGmYHnq6QvDxk7Ctd2PcOnSBllS8Ou/+jn+4Nf3eP6p70YgODi7w3QzZz2/yvZkl1dfP2C6tYadeR57Muav/O2H+O1/ccAozehzRy8dXZlhko5eelociXR4b4JHHUsSQb8Y4G1P1YJPPMJ5sJZ8oIlHZmUdgr5rQW4y2b2frctTKvcaG9uGbJxT9x2LZUFremRSs/VwjRwkrI00Pmppqow8axmt5RRli/SSpu3x0qPu5SSNRUjPejJm3nQkucc1hvHYICcwnxuqeU8cS9aGU+YnNV3TIb0gMp5PfsvH+C//9Me5fu0+7txt+Nf/6vOc7s9QDja3LrB1aSO46hPN6ekpbW+ROkarFB1phusCJ3IOjxe0vcEJQyxSZm83nL5bo+IhpSnofYMTFuMkUZSSphE6giSKkc4jrMSrhrox+F6HgL2PmWYpvQ/gnOG0pyw6YjvmYFmzdJrECQZpjO0KYpHQqxqjoKo9hhY3tzg6jHVkucLrBnxK1xmsD4gWLT2DSc50bZO10ZTF2YyqK7BG4noPyq6u+hqiWAYUmw8MSYHGmACids6TxPk5mDrLU+q6oW09OupJU0Mxq2mqmjh1SOWZz2ocBh35FZ4ltKYlhvFIoXSH9YrRcIQ1MvD7hMA5ydrGGoPRmN4Z9g7u0LuWKImwJkzM7tzZ55uvvMpwPcLTMjuqydSQa1c2OD6+wd6dfUwrmM8b6trzyEMfJktH1E2HlClt09E2NVIFkgFe0bQN1pco7cKCI+RqgXEorVYtXrEC/vd47/Bxj/Ae2SvwEVpKEKzea4H2Omy2vOTsaMlLX/4PvPKVL3O6twAvUBjiSGGsx/aKLBtQ1CcUdRkmvqYhFgPef+cWp0dHfPwTz/HkUw/y0he/yFd/63Ms9+7Sd0t2t7e4eP/9yCjB0lF3M+zCYxuD9wXjJKY5O+bg9vvUZRkIBt4xXt9m576rdIVnc7jF1WsPc1xUzMpTskHKu+/f5vO/9yJHt2/h+opISfJM09uGKEkZDNZou5ps6FFRz3JhsH3Co488yaX77+etN9/g2z7xSf7iX/w+bt/c42xxjFYeKX3IxBdm5TVXPHDtEdan2xzsH7O1uctwOKFaLvGtQ0cjslHK3t4xL33lNaqmhUhyfHSXg1tv0zYLbF8wzDPGww3WpilCNpRLR6QHKB1KK95DFAnKckbXdayvbzGeDDk7OwtFPGPPDyfG2JXOMgD+m6ZdkQn+KMPqnMfYHut6nPdUTc9iuUQoz2g0pO88CsV0OuH0qGY5MwwHQwaDnIO7JW3X8siTD3F2fMz8eEZvRnNKAAAgAElEQVQswmard5YkT9FRjHEtO9vrPPTwdeaLU46PFmgZgzAgNK331F1EZ1oGg5gkCVi3tgDtE3TiGKaCo4OTsIFPMh557EPcubHgvdePMJ3D0xNFGu8szrrggZcd2craVlUVWmtOjmdIqTB9T9f1eAF1bwJFQWsEDi08s6M51DGpGyGjMGmUiKBBtn8UqXEObAt5lnBwOqdoS5588jJWKIrDGwyHE37/93+fg+MzLqxfYC3yZEpS1j09ks61aBmdF5eA1fsSsuiDYU6UOhKvKZoClETGCiM0QkT8lR/9G5zN3uMf/c//O22V83/9i39CXx2R5Tt0wvKHX32Z4+M9xsIyEWdc3R0xGOYslwXlsobVaxathBI+cNpWzFUfXjelqMqKfBA2lGVZUlUVSZIQRxFaBUB/XdfnMoHxZMRgMKSs61Vh0QV5hdLn0QIpJXGaYLylXJZB4RpF53lU0/ckSYp3Du+CUVJJuboNCzdT1jukylaHiGB0E6oMdIyq59mPX+FHfvIxfun/nXN4UzLYSvBRzK2Dr/C5F3+Vjz7zvXz6uT/JhcuP896Nd9n023zk+T/Fxd3L/OL/+vMUfsC3/bmH+fIf/m8c7DnUJU8+FBy8WnD0TsLVZyfsvdEy1k/yxDMP8sWvvM1gWyP1lNl+TdvHeOXIBh19K3jwySkQsza4gCLhrXfeoms9cTRGyZiNtQ2atmB+VlAbz+Z918gyx+L2+1TLmGgomR0eMFsW5Jlm99KAv/oX/hhsVP/hP/0fPzPZjGg6hxExXrQUi4bi1DNMJLFyeG+JU0FvgrtZqojWGAwOlOXwzoJvvPg15vsNLQE31c49uRYsCodSPd4IEANkLJBJxYULabhStQ3DDPIUmlIzHcdMx46UC9x845SHH36CH/yrP8j6w8/ywudfIhUnXLx8hQevfwdZ2jCv7vLqC4Yf/+t/jWQCb77+Dl7lDHY1H37mUSrneO+NGSkr9lpscV3IT2oE9p7qUjm0DBM0mfYkeYQSHUmuaJaONIK9dyGX62xsdDSNBglnJyccv3bG0d4BCztDrvVs3Beznmq61lKeGHavriGThPe/1jB/N2F3N6KTYUolI0lbG2wPwgv6RhBph5Y5dDlZLhDaBui01xgvsFKTpRNkJGi9ZLI2pWoLZvMKKQR5rBjkawzGY574lk/yG797k+uX1jl46w3ev3GDk2KfO7du4fseawyDZA2Noq4KpNIYaqxoSZIBvuoYJENi7YllTj505HnHsvCQeaIow7kO5zq8d6GR3rfYvsKYGssCb8JnIRYmnIidRQuJijzro5w402TJCDudo9M5sm2YHzs2s5zpKOX4rGLReryLSZVinCtE52ktWB+yRt5pmlLQ1HV46BCue7yERI9xpmN39wLZMBidkijCeY8QnntueC1jtEoCU89YpBTk2QCtIqqqpesNSZIymUyCNnQ4IJYR3sW0PSBBywwpIqQKBahIhwXVOXFuUOk6S6QjvIfJdAvBgCgv6XqD9Y6qbsnSMeVywfysREuJ7Q3SR8RxhJCWfDBka+d+pjtDLuxs8/zHP0pRn1FVhrb0jKc1ZWvJBlP6HvYP91gs5lhrmC8PiRONjhLqJrAIjTPs3neRwXBAU9ehpCNlyHmtkFb3cnb37DTCO5wPG1SpQKqO3vU4wiYlzxNsC13d4oxHRZp0IkjzDlufUBVzBBrrV4gsUWHVKcigOs2TMcONDb79k59iMx6ixYD7H3icV156heXxAVcfvkSvNTob8cxzz/LwIw9x68Zt9g/2iGLobIWlw3SWOJnygW99jg888xTzxTFHpzeQwqBUSpQMycYT2l7w4h+8yFdf+hLLcomzPbYu0bJg52LE2mbIuXWtpuscXdfSFBW2sfS9JB8rsjXPvKw4PpvTmJrJ+pCToyVf/sNvcHh4K1yN1hLnNMNRysWLa4wmknlR8cxz38YP/dAPcLp3l5fffBcRJWjlqPoubJycoyjnVO0c53ucaYAetCLLBxjb0bQdKhLEyYDT4xJBz2AUYW3A2AyGaaA/WItSmqJYspgtwa2efSJogoPOMhw6wnQq5FPTNCOKAq+yb3uE8MAKzyU1dVUjhSJRKbGKiaKUZVFTVRXj8ZgkjSjqgiQfEY8yHn36MfL1nOvXrnPj7ZsoGRB33mtMG7KQo9Ea+WCE94LT01PKaoHHoqOYputY25gyGSTEYbDH7GxOMS9I4hhvHLFPaTvBsvAo6emrhtnhAaOBYJCscXYyQ4mcLE8ZbRjSgeH40IDJ0GhOD48Co9iAimQQAiSK9QsRfQesJtZCSKIkYTxdpywKpBI0Xcheah2T5ilRHK1a63YVmXCIRCFai3EWl6Qszzq285jNSxsc7d1lc3dIVVrevHGbaLLJhUvb7B/cwBqJTnKsX0Wv8MRRtGq1h+txgK7pqZqK6XiK92B7x/bmFoNBjqkL/t2v/A5bazlffvG3iZOEou4p6oaqrHGuZZhmaKswccmV3vDyjVM6OcCrnoH09IiwlmnIUo3WAh0FNFakIrx3RJEMAyETUHhJkrG+tolFkQ1HSJ2Q5SNOz+YY4xgNJ4yGY9q6R0rD5cuXSKOEpq7PM9QAblW8klKErKk1ZElCXZbEkWa5XOBseK2ts/Qrlav1PtwESYWz4eDhfA2iR4oE1w/Jxp4f+G8+yf/zcy/zjc8e8sR3Psfy/YLh5iEvvvgCtkhxx+t86ju+hzfffJvTw4LL1x/i4x/6CF//4td5+eQLPPzB+zmqf4n3Xzvj8J11rj0+o1lEPPihCX6w4J3frejPBnzpP7zHW6/tMUwTTKNYnB3SObCyIUkm6DSGuMX2Qw72FhjjOTg8BCDJUqpa0tmM0XDK2njKyfExrhcMVIzKlpS3lhjTMbwQc3RYQOMYbgy5/PgFfuC7fuQ//43qT//M3/tMlqYMxhrXp6RJzGI+oy1hPLZk6RQVabo+nEK8F+B7shQUEIuEOG44PlpydnZGvegR3ZALF1JGU0lZ9DSVRSEZDvPVA7anqXq08DiS1ZUZeCU5OZGsX5IMtxKeePZZZKz4+Z/75/zmZ1/kkesbPPTgdRZNzNYk5fVXWg7rm9x465R3bn6J6w9MiOUCT8Xr3+z4lV96n3xYghfUdY9zir5zpGkeJgGiQ6BCUxsdSibeEUWCjc0U6xWQ0okWQ8JwGnHrHYMmYueSoLOG8RAaURMLQXc3YfG65uyWR4wydp6IuHwt4Z1XFhy+GUPh6SrF4OISlSls7Tk77rANwf/u/ap17sHFtH3DYGioqx7hFXGk8c4QZzFSCxwVkiFuVfLRKiHLE+I0QYiUuwd3+Pd/8AovfeOrrI9TPvTBB3npa2+SjyxJYlkctZzMSk6Oj5lMs3Al1YQJY5B+hswVuiIfSKIoXKckuSabOIq+R6sMKTRShQWu7yxdGx5wUnlUBOiexllkHpFNFTrK0H4b20gOF3PqhcJVEiF7xFCxcUUhbcv8TGBMmFqoWCBkSxTD+voIYx1104TXChAIgkya1fWTWp3uIUngbFawt3eAjjzHx2f0fUuaxect59BClfRdv2q5J2itKcuCS5cvMxwNcS6E+kPDtKdtg01otjijMzXTyQ5SRnR9TRSNMNbjMHgvSeIhzvc07QIQIZLQEt5/X5MOS9q2o28lWkecnZ3Q1I7RJMNTc/nKRQC6rl05swV4h/MRDz74JGV5ysHeMR/7+PN893d/N3t7S+qupHML6qpm9+IOUhkWywq9Qrg4HyDz3jnyLOPihQs4a6mqCu9Ctuxe1MEDQsrVVDW0jdM8IdYQ60ATUEKjhWaSrPPdn/5u8J5HHnuEZ595gt6c4UyJWfQ0C/AqR8sMnENqFw4MaLo6oq6ga+G7/uT38exTH2OyeYk/85d/gOc++gF+65f/DV/56ufZ3dlESEPZnVEXHTfeOePVV25xdHKI9QXbmxusTbfoO0Pf9pzOZiTJBN/l3Hz3PdquCnzfZcnRwR1uvn+bt994lZP9m+yOhjxw/yaanmpZBqOXFOATulbhXCjOLWYNKlIMJxqPwjpF34d8cVO09JWirSQHe3eZz44QKw6pwNM2Pc7Axz7xPE9/y7fw1rtvMDtuuHL5Cba3N3jttS+zODugbtoVSkecZ6TVKnM3yHIee+I6G+sJt2/uM8hGXLt2jevX7+POrZsU84b16RZ4WCyWpFlCkkTUZZiqKyXp+3bV0BbYVRYwmLbCZlWtrnXv8VTTNCXPc2azGUqLc/2llDIYsFbA97ZtaZoa07chTmDCs2v38ogr13c4PJjjrObw4IB8cIH7tp7izTdfQUcWrYfEcUKSaqS6l3V0OBOKe13XEUXxaoIX1rHZ2Yy+D43wQT5kMlqjLlq8syRpxeaFhvGapS1i4kgxnERs7jzApWv3c+v2TYaTjO0L61S1QPi18JlXS9o2INgm0xEysiwWFc57rG+Zrg3Ic8UgHbEsSrI84OPKYkkUhWvoYJZrAxs2SwEoy/I8BzyZTFBOUfmK3mrGKuFi4jFpRpxvM97e5PbtUw5OTsiGEUcnJ5ydHpOkGusVOspxtqPvA5lDyT9SnEoVGvjL5XKlA61XsY1QZkqSlNt37qCjEIFam445nZ2uxBOCOIkolguarmJrbZtFOWMSZZwgmDUtrm+J4hShJabr0Epy5cpV5vMFXWeQSASS8XhCloXsaVEuESiMdSwWBVGSMBpPgsHKWtouKMJPTk4oigJrDRvra6uf2eFsiBrci59orYni+PzfN01D27YURbnSqCZkWU5V1wH4LwRKy/MoQlg7erQEKRSSBEmEZ0aaKz77669y582OC5c2+caXX2F7WrH95IL713d58PJ9/ND3/yjZVsO773+Bqw88xvOfeo5vvnCDf/JPf5wn/3TBq998gXjY8NIvLnnrZsv6Q2PWtktab7l6ZZt/9b/MufmuD8zlOGE4mFBWs1VURuK9QmvBcjkLAxgV01QdVdUglKc3bZAhKI2OYqp6wcnhPtZ4bG9ZnJ2xtj1geVBhrCOeeoxpA/9dZ8xmhr/+l/8YTFT/p3/89z9TVi233u9YWx/ifEldtOQDj+0hygTFooJV9sdbj3QZsQ7NZOc7ZARxnNP3Mc89+yf40R//L/jhH/leXn+l5bQ5wOMpW0NjWrx2GC9BKpKRD/kp6el7CRI6K4gyzaw6RccxKlry1nvvspNe5Du/58O8+nrJ5ihj/+iYt995jf3DA1zruPRAStVWfPXzR9QnPVL15LmnOI5YlC21ERgTdH9pZhG6Q0uNFpY8gSyLaBtLlCom25LGNiSjEYNkg6ab4ZxB0jOKx8z34Hi/YXs7oZcdo7FmNK2YfqAlXx9Qviupjg233jYYD1eurHF2ViAiR+MNVz84wOkaW3mUDyUYLcLDBWHxPiFLE1Rkw9TKgBYJs5MGKSHNI3QS01mJtymSaPVlTchGGUgZTom+R/cHrG1LbuydMN28j9Ycc3y4JMtHMKzJ4pTRYMjR4dGKgxhUfVK7wLh0iqruGcQxkWsRQtM7i0haoiSmqRqE1zircdbhbE0UC4RUOC/xImCdIiXoG48UEUJYOtOzrEpsKSg6Q9k4hDUQtXhlGCVTDt7rw+FBapo2HDRinTGbFXR9wN3I1SIukCRJTJ6n6EgxGA5x1tO2NUIahA9MvbJcIoVY+asN3rPKiwUIN0Caply4cIEoilgullhnSZKE6XSNzc1NiqKgXC2YH37mw/z5P/8XaOqOuqmp6xbnwLguTJl0WOwjrVEa4lihZIQ1knywTpxK4sRjraCtJaBWIGuBUlBVNWmS8tijT9E0ZsUcbGmalqqqmEyGnB0teeXlV7EeLl16iCQe8Ydf+Qonp8tVS9ZwdjanrlvygcNRBXanDRMXKQPGZjGf09QBhH0P0m2tXeGwwnRVSI/HobViOh0jM0FresaDQchjezBC8Nobb3HrxvvMZj07lx7nyoOXWFsbcvG+y5C2VP0pnW1QUqAESBmuXBGedADZCG7fPuaRD36Ub/+e7yIa7TDduZ9nP/IhdrbX2diaUraemzf3aOoFXV/TdhV5HvPUkx9kOt7iYP82bTMPUzp6bt64ycsvfYXl/AAdBW2jEJJcD5DOMFmb8PBjj/Lo08/w6OMfY7o1pugP8b5Da89yUSOlI85bhmuKdKCpmxYH6KSnbXpsnSFdjkRjbA2iYjLJUFJgrQ9aSwkXdneYjNe5e3fBnbtL7t6+w3JxSkuNjwWRhDSOKdoWa+z5te69P9570iRlkE+Zz2rmswWjYU6ep5ycHHB2ehR0um1DWVdEkcLYDmN78BJ82IxM18ZsbGzS9x3OW/ACKSRaBfxY3xmcNSgpQ23GWoqiOM+n3uOrOsd5JCBJYoQMgHbnIM+G6Egymayzs32V+WnPrRt3KZcznOkoF5Jy5un6Y9p+iXcR1rUrGgsMhtmqIBQ4msYY0jSlLCusC3rSumpo6xYcjLIRwgrKRYmO4OLDKU70nBxCU2lAgRxx484eb7//FpFIiOIMreFg75Bi3qIjx2giKJue/CKM1tcYrWnuvzIkkQNin1GeHtNXlpPZcnWV7FbRCo1SOmR6TY9WGoFgPgvfr2j1/dZaMxqN6LyjbnvWo57HN3PSaw8gR7t89Uvf5MmnPsp4LeW9G+8jlFwhnSKaxiIjTWtLsME0JglFz7IsAzJt9TnJ81C8CeYxj/OORx97DAHcuXOLLI/Js4zDg8N7Z/0wSbc2rAnOsL25S+ssJ7MZtRc4rRlkKXXbIHBsbKwzmy2YzeaYzsBqMxyu3AMuq2lqlNJkg5zRaBQ+v6MBEsXt27coigKlQqF41W9CCEFRFOca4KarAwZLgrEWY4OnuGkaohUjte974njF9XWWfDAKFAIZ8Gpah1xx27QoCeDxVoAHZ4PYJI4UVdkTywnDdY1ZNFAadh7a4lN/5lsZtle475HvZP2y5Q+++M/Ru0ua04LP/fI+v/Avf4Grj3j0hZqdC2BuXeLzL9zl+NYBb352gRoOefDJi5y+2vK1F3vWpgPavsJ0PcZWNLVFiCHWdUQyR+tQGovilEjlCCLKMqDfgmZbYWwQj1TlktFwQFW04CVKarQS1HOLJSLOE7q2JU6D0GD/zhGf+Zt/DPBUP/XT/+Az1dKEqxZTMUhHnBxWDAaKOIlBBeyBcwKtJEkKTWmJ1QRjLGrgiVPP3o2cH/7v/hI/9N/+BaL0Pl5/c8Fv/ubnseIW3mmcW7Eg6zAtiSOB7S0eGTZekcBbi3SG8jhifU2ysxnziT9xhfH0AQ7eusut2w2j6TqPX98mn+bcuH2XuukQxnNwp+XGW2dkJoVmgNMNTumga10hfTQ9o9QhtMOvFoyy18wLR9kEE0YaK4QzCBNxsl9ycesirhtzOj8jGyjUsGTrkoNKM3/Lko02EOOeqodmNmZ5V6JMgrEFI5lzdtCwOCtJkjG2bxmlE+rZgLWJwDioComOPN5rUAYVQdd4mrpFIrAmLFDCe7rekQ+zYAZTMX2vUTpiOJiQZDFdV9N0NbP5nGUR1KEqS6gwWNHRLBq+/Vs/wje/+hbLsiXKNshkg3BBT9utFjLvTZhExGkoF2jBMGnYHiVI6Wh9jTNDtF8Lpi0cSlmk6omilL7XCBkjZLBw4RTKaRKtkN5TLjpimbKzNSFJPSKW4CuyeMAk36VvDXJcMhnHHN9u6XuJ8wrbC9rGI2WGcxKhVDi1rxqedVPhcQwGg1VpIaXrKrTK0JFFKoOzkKZRaII6SZ5leA96tbAIIdjY2KCua/b391FaYo3h6OiIra2t89a99wTGXwdbm7u89fY7nJzto7UIAH5f0/cGCNPmrqtCNs0nFMuWi/ft8mM/8WPUXUNjb5HkJV2bhvZx2xIlBikjhiPNZDrgjTfeY3ZWnrdX4ygj1gnzszMODu4ynkSMRyOuX3uU+XzB62++zvXrV/jE89/O0dEcIeDSpasEMEPI4I5GA7RWIRu28nh3XYexIY/o4N4t8PlETWt1zkGs6xrfW/oSHn74QS7ev06xWNBWNX1f47znws4W87O7fONrL5PFW8howsnxIdOs5eqVdfpOUxQ1QkIUpRgT4Zxgur7GJ77tk7SLBUk+xg6mfO3Vm3zzpZd58bc+z1f+8GVu3NynLcNUO8sTokhRVTVV0VMVHX1rkUKtoiEO5zuSBLIkRUYCLywW6F2E7S2feP5b+Us//CO89/YNfvXf/gIXdjrixHBnb07TGaq6pa7ClXM2NBhXoWNFPgwQ+VG+TaxiqmIJwjAYJKTJkNnZkqrog8XMOHZ2dvnxH/sJnn76SX7t136J2zffQgmIVMT61i5PPP0sm5vbRDKjrHsW8zNgxatdbQy10pjesL+/T9t2xImibioWixJrDI8+fo1nn32YybogG6hzveRgqNjYzmi6ZaBp+BDrcMbSd91KWhAOiM4F7eR/fJVsjMU6859sUrWOz8tVzjmUkly4sEPdNIESYPrwHEDw9jtvcnR0lzRRTIdjkiSlriuq8pS2OcVas+KBWmzvWV/boG6W9G1HmmQh2qMUQgqUkkghVz55Dz4wSiWStm7o2h7bOWanHcvjDFOE6Rmmoq9qcp2QCIvtDabtKWaGNE6BAtMSSsBeogo4uTNHWCjKmrOFQaSKJz/2CCQxiUiZz5cr1rIKOmLTBYGCceflHSnl+Qb13p+qqvFGQWcY50MqEdO6mDwf8dyHPsiHP/pB9vdu88Yb7zCaTFeHbOh7hxMWT3iWJnGyeq96dKTY2thEa8Xs9BS9UpUuFotztNh0OuH9926EKIA11FVJvkJFhamjCsVSb5EKqqqnag2N9/Qu/D8UHqE01vZUVU14XMjVdL0/v5XqjT2XjuhII6VmMBhQVgVpllMs5vRdy2g4YDQZs7W1xWQ0Xj18QEcRzhqM6Yli9UevsXXn5ACArm1X2ekwcQ2SFc/m5gXy4ZDFYoFzIadq+j48FzwokSGEBgRKO5AGZ1MSPcKJGcYIyC3VouM7n/8O/sHf+Wd86PqjvH78//GlN/5PPv9/H/L8f7XFz/7kb/LFz7/NvD4i1QnPfs8G7ijnl37mFkflPoM4Z/fSmIOjBYfvb3L3rZjmzgwjF0RiCkJgXEWaJKsbVoN34aCqlMZ2wV4/na6HDLltSdIELQReKHoT9jBZkrI4K1A+lIPL5ZKut0FUhMI0EiUl2UCD6fi7f+2PwUb17/+jn/qMRxFFlt446tLgrKMoA7+sqTSmV1RLT9P6kGtrW6TKGU+2KKoTnNPBY2xP+fVf/wK/9dnfZlEf8vKrryBVg5AWY0EIhcchVwaUyboG7Mo57kh0ShQ5ipkiieDsqOT23YZYC3w/YnEiuHJ1kw8/8wQvfelVPv+VL1EdneKsId+E6WXJcL2nqHqSsaOrwQlFXTu0EMjacf/O/Wxf2OZ4OUMmmmIu8MITywyBwFkoF44kDYvzomnovQgnfevxSEg8+Ro4Lzh5tyKfKCZbKQdfq+lvaaKBQEc5i+YUrfvAN+tCPCARHWd3I9CQ73qa5p6POEHIDmcm9C3kuSTLQ+YTgtItHwf7lXEaJzSWUGCQMsHYhqpaYvoO07akUYyUDq1jYmuh0PS2RsQRrV3QFiWbSReYpxiyzKOUxxiBVDGIkE1GevJ8wijTzPY9TZeSDgRVYVmeWbJBGh4cpkMqixDmvCgAHuE1OlmAbrFILB1ZoqhPDMfvWaSK2Brcx9Wr69TCs7X9CB984jnmxzV9VdAtU0zfg7Jo5UC6cHJ25tyKFADO97JPAfa8v39M1wUXd1lVjCYxa+vDEKB3FiFihIio6uAYl1KS5zlt29K27XlY3zmLsT1xlND3HUdHR1RVRZqmSCGZzyteffUVlsXJqlTgMb4NLWJcmNwaz/VrD5BlE4qlYW19yk/+1N/irbe/yZdf+SzZxilJLqhKR1V41jdTLl7KqasWISxtW9J3DmskHkjiiDiW6LhnfaqZDAcMBmP292acnZQIaRlNBow3FHsHB+zt73H9gWt85Fs+xt7eHoviCCHAWIk14bqsLKvwEDOBhylUyCfew8nc24hEUUzfGUxv8U4gfFC6np6cMZudkA0G/Pnv+68ZjIbcvHmLJ598mh/8/h/ku77rOziY7/GFL/w+ru9pGsHstOV7v/fP8tQHnuTOndvUVYtUPXVdMcouMjtR3Lx7yEl1m8/+yi/yxV/8N7z5B7/Hu2+8xLI9wqkKJfzq9w48WSEcbTfHuhmCnqbr8YQJitQwHq6xNt0lzlOquqaqW5xwXH3wUXavXOfWwR6PPHKF7//BP0XdG774hVuUy56dC0MuXbqAdY7losKaFC2njKcpOmoZDhKGA81iuUBHEaZXbG1d55Of/E4m03xlgwqHmLIy3LlV8vrr73BweJM4SsAJHB2xjnnuI59i9777+Y1f+ze8997r4Dm/Xr93YFCrCMHWzjoPP3YVIR1d33Dp2gXuv7LJxuaE61cfwhpJ21Ys5hV1HViWXQ9xNCKOB2TpgCSKmc1mDIY5m5tbRFFo+xvTg3crf7sLnwEpAlxeK6QK8SecW5Ws3PlBZjQcMR1PSGJF27UBpu49UoUsYaQUzgbOq3MV1hUIBEoocI6+6RkNBwzyAWW9ZHNjk67tMKubkJAphDzPMasNfFCGdiwWC4qyDJs6C66JkMKRD1PQjiiN2doaEUU9feuJB5okj7A01E2BlpJ85Ln0oOfS1YyrVx9jMBpx+/ZdulbRNS1N6aiLho0ty90b82D2QqzKaGGyao1DyoBA6vuwWU/TjM3NLba3d2ialuViSexBJ5LepxxVHbY546MfeJIbd/ZIxhPOjue88cbrpHFE3wXboafHWYckx/sQtUjTsGmL44iu78PBQ4bveFkURDrCWUukNcdHR8RxwMohgmmybfpVUXQQppZK0lQN1lj61tB7B1qhfDiwRFLS+/68QBVFUdhguYASGwyGdG3ITUdRxKXLl9nc3CKOY/5HwKoAACAASURBVG7fvk3XdVRlgdKQJBHzxRmT6ZSmabG9CzGOwRCtgx0M/MpYFZBTQRscnxe5kjg+j33FcWBhe0JZSqtoRbFoV6KKQF/wLlyf6yjG2hBvyvJAJmi6CiEtAw+i9Nx37X5+9ud+hrbb4oUbX+B3vvjzfPWfLVnO1ti5oPnNf3Wb9QuO+eGCD330MZ77tvv5Bz/6AkdVyfrwAvFgDTEZozvN4Y0Ze8cndPUSb4a03TxEcITG+RalA6au61uUTJBC0bQh3uGc5fTslPW1dZq6RQhPUTTsXtjFGcPh/jHCa7wVRFohvEDGgvFEIwBJQll2xCrGd4q/8zf+7n/+G9V/+LOf+UySOaQINqq2syA0UezBR3hv6DpHnHkGk1VgPAbhm9Cw9CnWGyabLfPigKba49Offpb33z/kxt57pLnEWIkxgafnUSjtGIw9Qgl8G4cFTzpk5EA46gaM12RrNQe3Cg7uHnP7vQOe/9ineeYjD3DtyqPoZJt//4XPogc1So3oaOiMJ4lBpY5kDY6XHrvwPPHBCZNxwumpRyWWzd11yrmnnC3JtENaD86SJjFZPkLHCcZLdi9fZBCPOFns07cRG9MY7WRQPzrLaJpAOaK4a/DacuGRiOHlFqEbiv2KJB5gzIRwUrNIMaGyBVEasVj0bNzXYpxBSouKOqII5qc9zkmGw4y+DadUoQU6zvAiprcxngSQSCWRWmG9DHlFZ1ZFl2D/iBONAvqTitP3S9rCceutQ6SUbOx2gEOrKJx6bQ8CekuwgHiDjjReaOaLHqjJxh6dS2TSk6YRbZfgvEEQE+I/BhV3DMYQRwpvBQJLPgghd49FxAIvHVE64ORUshkl6OoWkbOMRY2lJtveJKq3eOOLBzR9jdIeLUPbXIig7ItWxijn7ErxCEI6siwgdEK+tEHKmCgxqyttj/cGfEyaDkKD1FsQkCbJ+Qb7XkM/TVOSJKaqAuRbCkFdV7RtQ12VrE3X2dqeYm0bog1djdSeJM7oW0dTNyihkTKg3LquxTHn45/4CE9/4JP8u1/+HLcP3yCKc7oyYjxUbO9M+PCHH6Oqlty3+zCuz5mdVqFhjCFsfsP3cH1zhPSS45OWnZ1LfPo7nuf9m29xMp/xN//7n2Y62eFzn/ssy3aPdFTz9ruvcXB4RNeCtzEOBwQk0drGJkIrkiwJTNRYoZTAeR+u5L0njWOyLFvdsITFqfMOoTxdY3j4oSfYvHCRfLrBkx94jjwf8NZb7/KRj36S69c/yCsvf5XpSCNVzvF8TucaTk8qnvzAh5BS8d57b6O0IEkiZrMzJmuSb3/+wzz+wBUuX9rikUd26Ot9es4wSOqlQKk4/I7e4oxHqyHDfEIchQmJ8+GQp0SEMYo0GfH44x/g2Wc+RVN3YWouJIM84+q1R/jQU88wHO5y492SN169wdnyLkJ11IWgaxLqqqe3FTqSSJEzP7XcuVGwf7tlcWYYDac0lWW2nLOsF3zzG+8xHm3y/PPPUSwrjk9P2dzRVP0N3r/xdtgAqh4nfIjDzEq+9MLX+a3f/G3Ojm6SZQqLRK2mcPcYplIKokhjrONkdsJoHDEYDNi/u6Cthmyu3YfShrI6Y37WUFY9xnia2qHEiEiNWC5Llss5TdsiJFhjSdOULM3PHexytUcI6uswZYviiEhH6EgjVpPXe1OtMIW15wYzKSOaOgwjhLJkaUykM4TTmD6UW6ztUcQ4qxA4cIJYZ8RxIBXct3sfxjiWiwXOhQO0Wyk4i6o+99rneRYW+0gQxRFtH/Ltq6Q4TihG61MmOxssmp5lDelwxGRzwsUr69x/bS004yPF+s6U4+OC9163tJ1CxzGnZ3OUCpEsrXu6yrE4NvTdatMo/0i3KldRiThO8N6RZRnj8QSt48B+3txEKclisQgDBwneNiTKM9nc5Oa77/Ly62/yxjducfvOGwwGGd4plos5Ah+c9oRcpdYr5JgImX7n3Wqz7MLmP4owvcFay3g8JssymqZZQfmDWCIofAVegMNRlEX4GS4MO5w1RGmE1BGJToPlDo93Qal+L36FEKuiaMj9F0WxwmZ5sjxHKXUeHVEyfK6KYkFvQixhvlxwenS8Usuuk2UZi3lQs0opsPY/1bAOBsPzAUNV1mxtbSMIumcIw6b5vGI2m7G9s8VisQg3wSpkqp0zSO3xQqIjjYoEG2s7VFWNtV3I6cuYuawZru1w+F7JT/wPf4t//S//La999gg12kVZwxtfLihNT2QtXsTc//iYX/k/XmD/pmDjvos89OQuVWu5+8YtlsclTdMwjEBlE7qywdOv1ieNIEGQYlyP1hlCCrzzoThmDVmakacptrdk+ZCmLuhbQ6TCBFWhyZLh6rkdBiXGQ28acIK+7zB1R9+2GBPx9/72H4ON6s/94j/+TJyAk4auBanCAtUbi9KONP+jBSsfgneSSAgylUMHRrZ4VRIngkhDng55+82SmzffDWyvzodpZvgYMx1oYukZZ3EgCgiLE+CQ9NYRZaE4c7KfsLHjGU8Mo2SXT33b0zzxxBMc7Uf8xud+ja+++g5vf/OryBik7zAWrM/ojMG7YHYaZDm5V6huyn3bDzBcT1DplLt3johEi2jzYOPSCSqxFEVHnDgu7qxx8P6c1I9Zj6FhRu97lO4xViC0g2bAwTfhrO5Jk5STOwrjO9KLLfFayii7wP7bZ6RJie8Vwjm8cLSkxAp0H6N1y3DbkqU50gmWJwlKRqRpgqMMr40L+R6pM7wcIqOc3oXTuVY5QhlMHx7GAokQms6UON+T52Ock0TSkK1lpJua0XpBXzmaZViYWmeZL3t640MLXkcI6UjTCGcVadwhhcZYi5OOedGjGFGX0DtN27TUbeA3euHI8pi+q5DSYt3qYWEsygsiGSHMFOFj4gT6PkU0Ay4/fZ3TOOFjV5+h+8qrHN18mWV7i7I0LIqKSEUIERPJbHVKvLcZDU1jYwxRpFCr8oCxPbsX7+P+S5eoq4I81wzyoDE1xgcUVN+t/PZpmLoW1XkGLs/zcye0xzMeB7VfsD2Fa6++61BKhuKUFngjcabDWUfXeoaDmOkoZ7oeNtCnJxWnxxVZPuTRx57md3/7Bd5592vkeUy9dEyHY+oFnBwdc/vmKVevXafvPXduHqFlxObWVjBTeUOkU3AJVdnT9+CE4M9935/lkUee4Otf/wbxMKd1Oa+88zvI8V2EsjgkpnfUhUMITdu3dH3QxuoopjeW8XQKEtquIYokgyzBdiHmEPJejqZpzrNuQggSKZA4pPYUyxLT1Lz+8td57Wtvcnx8QLG4y+/+zuf4tV/9FerZHrZvSeKUSEi86/FKIFVgZCZJxGx+gjPgrELrAYvC8sLvfZ3XXrmLRuP9AUf1jEKmpDrB25rOhelZpDSjQc5wkLNclMRxytrWFmVZU5UdXsQsiwWvvfo6r792C9O1OLOkszWzk1NODwwu2kKMJAfNHQ5nJ5wdHeP6mulknaO9GWWxRCtNWQBCkA4EaxsTnvzAY2RZxq1bd/FAliVEGhw1R4f7fP2lN9jcnPDUBx/k5OwAYys21oc4KylKi1Sa4Wi0OtAcEyUtQsXUtQVhmU6nJGlKXTVIKQCHFOB8iFLNTyuKZUvbtThnWVubsLu7TRQJEB0nxzWzWcsTTz3GB55+iLPZPlVVrm5kHFqHaW1RVBRltcL6hMMIPjB0lZJEscY6C8KfywAEnKsynfPEcZjsVVVDPtA8/OgOp8cNSZQFikFVrDaUDqUMSkQ4GxrY3lnwjijSNF2DijVJlFIURZiiuh6EWxVlcro+FN2EFPSmIxtmjCcT1rc2Wd/aZjAZEGctTVVQnYHvHaYxzI8bmuoU5zrSfML6bs/xfJ+mFfSmZ3lieeqDTzPdijhZ7GNcR981tG2N6Swq8ujIAIpIK5z1iJWDXim5OjgLuq7jHvQ+SRKU1CyLkr29u8xmM4w1eKGItWQwHNI6S3dccNaViMTj+jNk5DGdA5/w3HMfwguYz+swiFDhdYuiiKZpUPo/asQ7j46igHWKI5RWXNjdDc9yH+pEvQ2WJ+9D9hw8TVutJpJ2xcAWeGcRkSaNE/quIc0Tiq5eRWHDAf+etlUpxXJZcE89nabBWFXVNfP5nLIs8dYEs1m0wnSt/q5HBPGNdxTLBYv5nCyLzrWsYhU5ufd8juJ72eBgnYqiiDwbIGTItjrnyPOMtqmQSqOUIsuS1SZ9haxSYcrYdxXGBLvgcLCG7XtcwPGwJmPqxYIXXvwDvKtInCOVkrJr0KKhavpA6+klLsvYPyg5erXDZY4Hro25dP9VXnrxLvXihM2LErxgoidEUrMsZ6t1SGOMQ+mIfJQw2RhS9iVdVRGSLX6VqXU4+/9T92a/nmXned6z1trzbzrzUFNXV/U8sjmLZFNNUqFE0pJlUbFiJVAGJEZyESS2EkGSbbGFQB6QxIiuZCQwAgNBBgeObxxIiuJAEiOxKZLdTTZ7rO6u+Zw682/a45pysXaVlP+Aqsuqxqk6fc7Z+/u+932ft6OsAyNZdy2RTDg9OmU5XdI0NdZCpzuKIgXh0S7GNR3CSzqtkT7MJDJR/L1f+bs/+oPqb//T33y5rELvelMrnDCo2JHEwYfmnQTlcB6Ej0jjmCzqqM4s1alhJhzTI8vmBqyuRxwtWo5Ol2SFZnOyxnCiaFrbe0JdL8+Fy22UqMDf9AIih/Dh0jMcQnkCV69scfmpc4ztBt/4r17md/7Bd9i60HJt8Sav/Mn/w2Qg0RJE50l9hJQdkRMoF+G8o2sdgzXNMG957Y/u0lYRedGxPtnGiQKf5Bh3hjYa3UKaFXjX4Pyc7R3FfHrKNJ5RjAekfohYGEaDLWozQKaQxgV/5aUvsrq1yt13b9OetYzGA1pZ4kcCYRzTEwWRxxgbOqgjgbMNSMvukxOaumV6oKAtuPmOY20LVOrRrgm+4EiATPEyIxlGGF+CIGxaHpDhatF1DXFSoKIE7UuK0YA4KahsR2QNriupTEtnFD4zVN6jvaLTEQ5BlAiQAmvD10sIT17EFAQ53ztLVUm8KOgWDdJIjNAIGS7CnQ7dylEkyAuFxGG1g1jjsWjnSLKEo72W+Z0cfeiJFgZv5iwai4kFqd1gNTol3d7lus4RwjA7qsmSnKausLYjyyOcN31towIEsZK0XUOWx8RJRNt15HnBZGWFo6N9nBEMBhkeibWBlWdMh4rCw9qY4MlMeuloPJ4wmawihCRNErI0x+iQbE+SpLdqCNq2RUgP1iN9RJaM0aajbkrGwwmTsQc0i9McYwWffvFZPvrRT/HHf/gKxs4ZjB3WVHg7x9SKam7I84LLV3cZFuf57nc+4JlnHuWxxx7lC5//GsYqjo73sK4mij3jccp4ZYiNPBcvPc63X/k20+WcYi3nzVu/jxy9T5w45lPH6VFN24Z0d1t3rEy2eOjSFdqmZr5c0HQdg9EQbQx1vcTorr9KKPAS512f+Pco1WN1JIgkJikSijwB0WJEiZVwenpMNZ+SFxJBSzYoSdZajmclTS3J84yqLpFJxmCwRpKkNHXJ7KzCGogiWC6n7N+7Sd0cMz+5yVs//CFHZ1OiuMYbw7K01E0YaqWUJEnMcJijVEJdG4bjIdkgZz6b07ULZFST5oIkFdTdIfPpQagaFIo4z5gtDvnhd1/h/bffYSRi3MmCo4P3WNtJkeScnc4oBhnD0ZCqamhqS5aNOX/pAnk+4Oho2Q8fLbrV2E4gfUSkPKZrmJ7MOdyfUy66wMu1+gFjdjjI2T2/hYglzdwAGaWr8EqjemuDNSEgE+R4SRxLpHRkiUTJ4MOVytF2LWtrIy5dWuPatXdYzC1to3jyyed48XOf59atu/zg+28ihQRvQjo8DqHE0MaWEUUxMopI05RLly4RRTGnp6cPPNKCsBxL2bdSedfTAgRSRoEXLCJ0Z9nfO6FpSpBNXyE6wDjNctlidcR4MmB1fciiXKBkxtbWCtvba5yeLYMNp+mw2oQh1Yc64cFwxHA8YV6WJHkGQjCajFlfX6PpQilLozVeWR792AYPPap49LGcux8eo2vHoHCMiw0imTKvzlgsSgbFmI3tgu1zA6YnS7qq4+xkijYJT39kl0tXU7J0RNd6lPCYLqHTHmfaYIX4CwGzcB1zD5i0bduFRbFuaZoQWLQu+ChDhlZgvCUWjkp2iCgicRCnMc6mrKwN+cjzz7CsFhwfH+O8RQBdG0o2XI/pU1GEigK7uK4b0jTFCsmFi+exxnLn7l3qqiLNsgfeY9s3CnocTrp+8Hf07QH4nvThhUA4MC6oY7U1ZCpBSIUQ8kFlqfNBqQve3BAWrvsQWZwECkIcRSAczoWClQD3J1iOvEXIfkEyHXme472naRrW1zaoqyYEN00Iw7Zth7UOgaIsK0x/cIhjhTYmWLfSMLDf//poHSwAHo/Vcd8aqAgEPo13Gt1orDMh46IUrW1JsjHC+BDO1g5ZW2ysKOcRm6MxLrYYBA8/UnO66FhZHeGHmuPFB8jygE6ndJGEJqJul0xdQxbl4XshAeckKq9Ihw1llZIPc5JY4PpF8f73mPOG1dUVynLR205kUDsUZHlBXZasrq2iEmj6QGac+YChixSijVDK0QEv/+rf+9EfVP/hP/mHL9ddh14qtO8YJAojPaoH/ljhycKtLjATbYt1kiRKqQ4cvmzJipy9fbh0eUSMQdqAeYqU59zmCBWnaNPQmXCZzTJFUYRUHnGK9ISGIgFxFKErzfbaY8TyHF/46E/wt77xq7zyvTPuvXWPr/3NT/N//a9/ysHJHVZWItrO4WOP9qByj44FWSpRnSMZedIMPvqpj3D7rVOEnfOJT2bMTk5YWd9ifTzGWgmuRlgfTv2xYrkQaAvblyT1wrJ/A4bDIflklcaVxLJgZ7ems5qbbx5xNl0wb5ak446DWx27ayNGA49abRnlOfNTSRwlGNuBTomEI88Ux6cL5h9OMLMJ05OStbWI0VqN7hqUFwgtiLxHeAXeYts5qpVk+MAxJAbriYohre5I4oRMxiRxgbUJzoBYnmKdxwiPMT40iHV/AebkDCqOaLWk0ybA361GGUGMYXkcodsIVBwGZClJijE+zmi74F8jDlW0w3SFCxe2WVQnYSPvAmFBmojOO2ymyZIJap6BcVglkV2HrRdsxuusryWkaxd5fWopY1gsSgpV4P2c8ahgMhoxnS0QxOHBqDRCWnCQFUO8aIkJvrTFrObw3h7OFL0cZcmzHN11D14g1vtQE+k6kjRCipiu9UxWVojjiMPDY5yDs7NpbzsQaN1/HB0YkpFyKBzaeJ7+xEco7RzTakxrODytaU0KkWBty2BMwwfv7XF8fMjstOTsbEqeNVx6JCUpJHEUUyQFESnT+T0uXbrEJz/5OYyJeP37r/Lq975DuawRLsF7g9aGtluQpfD669/j3Q9u8dCVq+R5xuJ0wTjb5NZbNbMDQyxSgr4oEQTkkDOWtutwHqw2bK5sMilGLOdLnHE4EyTmNItJYgIfUQl0Z4hURpxIskIzGkUgDNbb8PFteKEFrJIny8aBQSvX+ImXvsra2ipV2XB2uuRof8qtD2/xwXvvgg/NTE1bYpxGKtEPYKGScm17FSc9zid4I2mWJdI5EhWuMF3n+MznvshLX/gyl69c4eT4kNs3bqIihbaWJMrIU0kkdV8zm5AVBVImOG9Joo4rD+1w7uIuajjgYy99jKuPj3j7tXe5c+OQtY2YNI1ZXVnjkatXcKZjdnrK2fEJx4d3qZYzPAahHHEaIWNIU8UwG/Gxj32Chy6f4/r19xiPMoRMOTptQUZMVjKkhPmsopx3wZIhNcoLlAtynu6Zx5FKiCNFlnn6dls8gjjOePjqZYrRiIN7R3St5vBeyc0bMzY3dvmrX/83kErz+qs32N+/x3x+RFGE8A/uzykPzmmcC2pDFMc889yz/NhnPklZLnnyqSfotKEYDFkuKiQKaz3GGUSf+BdKEg9zVtbXmE3PiBU8/fQjRCri9HQZbDGmIY4jdre3WFmZoJTn8Sd3SGJJGq3yc1//a1y7dp39e/cYj0e0VodFXCZ4HX4O04GiGA6R0YCVzYBw020fMrKKri4xzRJbVxzeWZJMBizqmrsfNCRRFCD9tgYtiSJozzzO5Tz67JMsqxPOXxxgvGFZGx5+PEGqOboVXHtrThILhFNYbZEyMF/zZIy30HVNaHxTDiE9wimc9z2EPwTRwgDoQsWnc0iCd1d3LdpYpBeYViPjGOvBe00cpbz33gfcunkXKaJQ6axNn5IHQQjFZWlGlmZUVflA3rZOUGQDnHVYbQNIv1ySpSnWGDrTBl+6pA/qqeCBlipc1V243CdxQjEo0NoE/JSXPYc8lIJIGWF0R5pEjFdWMEYEFUA3bJ9fR+uapm6IVEycBqZ0WdU4H2RvIUAJgRQCHNi+tMA6TafbwBLG9YFfj5LBcwuOOFZE0iNcS9ctiWOHd12QyL2g05rlsqTruv4aqx/47qX0/fGBXq2gLzgJaqbpAqLMecFw0A+VsrcbSYe0CYnS1E2NsYIosRQrkiReZWNzDa0T0kLh8o7V8QWaWYaxS1Kl0NYhpCXKoOs8ohNcuDhk53xMrLdplcNVHdZUJCoiVknPo4VOe2QCo0FBWQWGukpSrAuM2Kpckg8GWN8Fv7KKcA6SOMYrF1rUPPzGr//Gj/6g+mu/9Y2Xhe0behShI71L0JXBeEGSBU6EUTkuAiUtbeuxSrF2EZqp5cWfXONnfn6X3/vf7iC6hOGKpzUxjW5pjjqStCVNPVnqkBaklrjGI40ll2OSgQGnkFYG3FURU9WeTz7xU2w/8ijfe+UH/B//8l/R+CMqb3j1B98m3wmwcE/Eysiy2PcgwzyVtDEP7W6weTlGRVu8+XuHHJ3N2Vov+OyXH+L28SH7377HoEkpHrocmIZRiY88Xii8Ci8bax15skJVevI0RckhHkfrZkR5w+b5miqac3J4RuIFQscochYnHcOJIi4s8bolahWzI0OUDUmyEuGGNE5RzSyDcZC/IrlCvlqiimCkxmVBjsdhnEUKiyLF+RLrErwPPsoI6MwS58MlXKUJQkSobkZhO84NR5TTBVY7oqQHHQsfronO98qeRMieS3efqzmArNAhrZx7tO2I4oQ4yXtMTY0XHaPRCl47CiW5vHue6d0pEYLGVtTCkyUpSIMxoW6zSFPa05JESDrRYFMXANrDFRbWsuo0t+68g59pqsOSKPLo1oADKTKMq0nyhqyA8SRG6Aw3qBgOavIspdMK2hAcS/L+RSA9eIfuXGg5oSM8X0M4SckMJRI8FhV54lgxm00xpsb5ChlB1xmydNBfch2jcczqWgIiQcYaGZUsZ2dMhjH1UtNqQxSltLWjyBW6lSzmJaiONB2Q5AQEzsaA+Znn/Tc1RwcND115il/5tX/EV77yS7x/7Rr//H//X3jjh99Ha8H5hzIQFaYTRLEjzRJ0p0DEXHn0EbbPbTFfnDI7m3J0sODgzgxnwoOpqRucDTWWwRrTsiyXPPncU3z8k59mPpvx8OUn+IW/8UscHx5ycnpAnEGcWJQyiL7KNs1y0kwwXh1w+cpDxHKVs1ODsznGRLS1wwYrbX9lsxhbYw2sb2ZsbW8wGq6yvr5BVmRE2YLhSsf62gbW5Kytj8kKR1U1geGLxDtJp0OYaGfnAk1tmM9q0mSAVBYVhQutjOCttz/g5o3bGNNxcHCP6fwU6zogwOxXJgV5HmOMJ8/X2Nm60tdu1lx5asjqRUXdtLz9/Tf47ivfZbbcR8s5yWDIzqV1Hn3qIlcefo69O3MODvdDW11hULFA6/tBo6i/zmhao5jVLbXJmFUJS32GEQ1luSCOJFkaMR6toJTi9OQMZx3D0YA0i0PPvTGMhgOKQW9d0RolBGkyQMksXLv7gorFoqKuKuJE4rylqkuUgDRTtPqEN9/8Aa9+74fUTclwmLG+vo73lq5ryQvVXysFWZ4Eb6y1zKct9/YW3L61z+nJHOvCQNGZGm0bVCTJskEI6jiHdR7rBZPRhEhIutYEBJPuKKsytAUlGVEPgg9oNBFKHqIWfMo3/+jPODi6Q1HE6NYxjCWCCCcNVhjiNOUnv/YJXvrJJ7l1+yaPPfQIzz93gaefeJTRSGG7JdJCOVuS9g1Jy3nFxuQCbWmplhVpHoIqUhqM7ojycNm0OuWrf/WnOd4refVPb/L8jz3FV37iqyyrGW9+f0GSCqzTtKalGAzZ2llnUc6IZYS1HQgP/WU5ibNAK7HBR3+fFiL7JqZQJSpp6hB8iuPe9yvCezggVcJS3bYdeE9RZGjT9iHbMCJKBdaZXk1qaLtguQqFAuH9PZ/PAppPCpqm6Rf1YN3Q+j7VIYY+EBYCfOEdmKUpzoWEfeDjNujOIKToSSnQNIYkzonjnPFkLYD0vaZc1njX0TWernVYI1BxsDBNp7PQTicFSZripUAKRVu3JGnac9s9bdf0AankAfkiiiK6Tgd+aBRTV6ECWkjJeDjsP/eQ37DOIUWwh3hPr/z1y3rvr77vsQ5DrGNjY5O8KAL2Kk6x1jEcjVhbW6frNFEUk+dFmBFyRRIXtGYKrHD+Ss7ZiWEx9SzOlmxuJYiiYr4Pa+s7qKzi9NaCYjKmGDeYKCZlhPaGx14Y8NSzP86nv/BFFtWU6x++QdPGDCcDrHfo1uBsKKMxTU0iIopRQZ5nWGeIlMJa/eCynWUZm5ubzObzgEtUEUEVk5i+We3lv/ONH/1B9R//0998WWpwKkaiaLXh3/vpX+Tf/w/+Br/3B39AlIDpBCrVCBWhG09RxAivWFtXPPSxjFtHDdOlp2ta6qWnKSOUtCTSUc4SVrcFbTPC0BDLAR6NUo4oVXTdktFQUE0dIjWooUJ7ye55QzWP+eonXuSzn/80R+/fozy4S7ZZ8/pb17h4oSNSFh85aBzdcUIcpTRW45RFRg3lPOfTT3yWf/DfmNItBAAAIABJREFU/ucMNpfcMu8i45g0d4we3eTsWFPNG4rC0JVh6/WyCi8uD77LWSxq4lQj3QYbG5tYk+N8wt7dkmKcMLwgiMqM4w80wiUQV+RpyuzemNE4Jl2pGE0s80OQNgMvyEYta5MC3XVoH5H4jOFQsHJhSetT8BFaN6BckOWkQvVSERE4MoyLUAIoLNIXSAvaLqiaCmdqsrSjXSjO7pzS1I4oSzEoGi1AhBCEcAqkxDoR5LQiR8UaYxzrGxltZwKPLpUgLUkMcSJpmgCn94hegqowdcfxXUdqznF55yHK+ghVeHSrcTYhFRKFZrKSYmtBezRARTpseJHhdHnC6krCpchx8/QE40JDV1Nr0jiiqT3LsmR9I8dohdERQjiWtWOcjHBWYG3M1u5lpu0yYEicIcuLPoTUksYJ6+tb5ElKXdUIHCp2ve9UkqQxcSSYzZZEUYqSWcD6GN+38zis1bRdTRQpqrpFa8e5Kw+xnDc8urHOhdUBZ0vHUmd0ukSiefLZc0Sxoyo7Nre2efHFH+fnvv6zVO0xd+/coVkWpGlBZ0p8pHn73bf4n/7ZP+f9D79DnEnWV89hdMfZ2SnOW7bOZQhpuHzpUT7+8R/n7v4x779/ncVsQde0odJUAEajOx1Yt0KSJDltq4NHSYbgw7LsuHt3j9PTE9q2ZXo658at9/uUsMQZiRIZcZRgXV9liCCKJmTpGovFkqYNL5I0SZmMV4iimKquwHmMc+guZnUj4snnR9y8eYe33/qQs+UexjUMRylZvMLx0ZT58h5N01GVGhm1CCEDjkwFWR+hWC5bynnH+voWa2vrlEtN2xiMbhkUA557/nGktLzxxg9YLM5w1hMniuGwYGW0zWc+/WUGxTlu3bxL08w5Pb2LoCSVioPbniK6yMYkY3Fyj9lRYOmtDlPWxgOqhebN1/a5dfsGy2Yf6yxFsRI4v13bjwQJ3kZkORTDGGyEdI5qtke12A81nQhimTDOJtgODo4OMdb0VaWuryBW6E6DS7h65XGefOoK8+mUIhsQxYo0VWhdB/5pv4xZY+l0S16EsGDTdmjTspjPOTk9CenoNGK5WBInMVmWYY2j05rJ6ohBMWQ+XyL7xqSm7lguSw6ObtF2S+qmpCyXfdVl3Cepg4RcVxUCQZYVSCWJ4gSF4ujwmNPTKZ3WgGM4HCKE6kkTS8qqxBM64oPXM6KqqkARiWA0mdB5QdfWSBPwU1vnJqhMkmUTNrd2uPj4eZ77yItsXVjjvRvvsHX+Iitbm8zKFic1pmypF55qJrFmwWSSsbKaMRit03QO5wXlvMY4T9dZFsc1r732Pcabgsl4wp/+4Q1e/fYHdE0gjURZR1oI2jbG4YiloKk6hJQ0bReuynFE01ZBHpayD1rJB0PRfSi/EHD5ynlW1iYcHp2QJKqXw4MM3FeD9XaPQI3IshByS9MU54MdRAiB7huynPe0Xfj3OOdQkSAvsmAV6FpkJB8g54QM3s5QDW0Cmec+CgDxALGVZwVVWYeWLRX3/tKYwWCEMY68yGi6FusNo0lBnEQ4A7PZKXkW0XaW8XiNzd0BTe3BpUQqoyg8xoRCkbYzxEnGeDzh3O45mqbG4VFCBf9yP7Q757Em4L4Cc1qRZnn475SibhqyfICKQso/KPeBZe368F/bBq99eG7FJHHSL1oO2ZcmeC/Q2qCNIc1SrLUcHh4yGo2CEgF0TUsc5+RF2mcbYrSpaCvDZDzi0hXD+UsRWXyewSTnw3fOGI1XWNvRHO+VNK1DNZ7l4ZyPfWYXbY659sY99u7c4Tt/+Ca5ixhOJMMiRndzimGGccGmYb3DOMnsZEFWJFhtQiEMoLUhSeP++h2420pFD9RA3XXhEi8E3/j1vwSD6m/99m++XBSBhyaVoCgs28OH+I//o2/wu7//++zPD8mSFIlCiY4kmYDXjAcN09uavXc7zl0ynB62dJ1hshqxKF2QggTYzjDZNBwf17huRNN0DIeONI+4+qQgHyWsXO5YPz9g/8OOZ556juNlxfruChubp3z7wwPefK1huAZf/KWv8Yd//BonZwcMhgKtOhot0NKRrVhsB8YIXO6ZLwDd8fWv/zinySoiW+KWp+iqoz626DJm+MiQR57IePiRC1y/vce8LBGxI1ZQz8FWoaYzLxRJVnL7xhRtZ1g0aeZY3y4pRp72rGO6l1BMMjQSJQvwipM9SyHGXH1qxNm04vC2xfSd0IoGKRWLCgYJxCpi0WkmW4K2dEgbI5JwSYzIwwNEdnhRYIgQUUYxHCMpqJwjThVRA+1ySUPLooS2rnASXKpoRfAUgUfKAHMODSGGOErRnSVJJSsrMVIapIrROgbvgtTRb5pd2+GMQUhI0gTvDHXZ0dUR1jpm80Pu3jikXQjGSYGYCKalQymHyhx1UpMNFM08BMKkrzClJp0MqAYRS5fQDApKYVnZyWkXJdXS4kwEaKrS0bUKIQ15tkrtBLlK2drZIctjqrmhNEtWxxcplwtC25cizxRV1VKkA7w1WNMhpQv+X98TKXofVF5EoU5xtEqWTDh//iJtW2Jdi5SBQahkQqQKmqbiuSee4MmrH2Pv6BQdjTg726denvDZz/wY69tDjk6mrK5ss7KyyYcf3iZW60xPDLf33wZn2LioGaw7TmeOwSDi9OQ2Mj7hbFoSqTE/9ulPsbk2ZmW8zuNPPsHpfMrJySkff/ZzlFXF+9feQesmeMC9pakbdGtoa92zBxMiFWFNCFHcB/pLKfBWUM5KpLSUiwW3b3yIbkokPAi5hMCVZ219iFSgNTz88NPUdc3J9A7GLqmbBUJK2q5jZ2eXR648QlVVKBkzmoTrysFeiZCK0XidJFnl+vVD3nvnLgf3DtC2JB8qtrbXkFKwXAZ5S0qLC2XNJHF4WQgZ0s0np0dY16LigNQbDnKMceztH9J2NVIJNjbXeOKph3j+ucf5yle+xksvfYHhMOXm7WvMZuFq7KTEoGnakuVUsrPzMOcf3mDRLNjfq5nNVQiSjATbu5vUleb0eEGW5BitaRpNnHjSvMPoui++cLS1D2E058AFnmueDFAi4exsRqM7fI+cCml5gzEhsBa65WPGkwFZllItNHU9I88jxuNVhDDkA0EUC3TX9Hio+xKzY7Go0Z0NQVhnaOsIfEwceyCmrirOpidUdUeSDUjTAVLFKBn4wuWyRYqEJI0ZDLMQ8HQW5yxJooJEKkMYJYmCumONoWmbMDBZGyRcPEU+YDgsqOsKKQVlucA5x2g8xJiOZVlydlpTzh1NU6GiwI9O4oQ0kfi2xhiHkxbnYHNnhSgd0PoLiPFFvvPuh+ztHfP297/Dq9/8Dj/89ofcfO8mputwOsEaS5HHLJdLsqGgqiyzs5qutUQpPPvMOhurhpPDFt8K7nywx+72Rda3Nvj2H73NbHbAcBjS/m3j8T2SqShSXvzsV9hYXeXDD25CHzqUkSIrYtIk4BjjKDRSOecfXO7iOH4waD366GNsbmxy+9ZNvPXEUdwXLHjiOCLPC0CQ53nvtbchCBkFHmndJ9yB0N7kXEBFQT+QBuZxUCh6hJbzpEVBXbe9FTVcnu+XNmRZ+Dfr/gIuRPjYtmcsx2kKCJzzDLIRcdZR1Q2T1RFx3nBydIxpI4QwDLIdjLXMy2NOD5ZoZ0izDJiH8BwRrXFMVtZZXVmnbjpWJissqxKBJ1KB/RpHCXgRLAw2kCSSJCFJ8rDkeUvTNTjvSNKUPB+EBicZnu3B0+p6nJZHwAMmdPj6gEQRxRFdZ3ovcfh1vwkr2L908ExbGwoEVIL3GnzKcJQwn3q6VjM/1Zy/ULBcGK691XDr3jFpGn5GtYa1UcEjz68wP6rxUnP+mRGXHn6MxXTG2fI2q6sJtWsYraasrm8yHA/xaOqyI5KB5KCcYnN3He9Ad22PsROkaUrXGqI4pus0VlucDfbKJEmQShAnKc57fuMvg0f17//2yy+vbeU0ZUsUW9bGBX445Y0f3GQ632fazvGiwxtPU3lk5LFasrk2IFKSZy5+lZ/7a/823/zmK0hpiVJH5z0iSqi1ZryW4KSl1RGVbmg6S2dgbTfl8GBArMZMm5QnPqaZ3hhw962Yy1dXee/de1y+fI7rd17h1e+9zmPPXuTlf/A7RPIuW1dKxpMJh9MzZqeeRgvOpgKwpFIgbEwUWWwV8dpbr/P+tRu8/u7rvHttya2Dit2NiAsywvgl19+6yxMPP8+XPv9lvvXKd0OSMrUYB14qVJxSNy3jwYAkjVjMKlS8IItWaKuWtfUNHn9mk7JuuHOtJYoahFNs7YzJC8fdW3PKA8Vzn5yw++h5DvcbmqqjbQakqWWwEjHMBIuZpTQtK1ua6Z7BW8iHMIzG1K2mdgYZCywFUhbE6QCNB5YIYem6mkhBqgyDyJBIj4gcWnmcCheXNA17srW9v00JhJJ4bxG+R5vYIN+dnWjaStE2HW0X3EFZmjzAg1gLWTpkflb1D++YNLWMVh3Ehqb06FNBFmesbRmqqUGJCBEJZjfH2MOILHPoVrB6IaV1UJkKcompYywavegYJ+s0lcbLDmskf/uX/zPWdxzz5QneZVTa0g4Eh4d75Kkjlh0j19KUM2rdPTDNN3VLonJOT46RcdfLqg4nQotUFCmGwxGbm1sMh4PQCJUNiRPBsjql65rex+dJ05TBMCNNw9Y9O5oyn804LA+5fueIy5fHDIctRXYRH6doH3Hr5pRlOWVjc8z+3QNee/1bASOWjtE0zBcGayXnLgw52msxTcJkkoEveeONH/C5z30R3Sm++93vce/uCcoPefvdt3nzzTdAeJIkbMtCBDmxaxt2dnZCuKQKlxDrfA8ED+bGwKRsUQqE9IyKUShAIFSrKqGIIol1hq7rwqW/BUSKinJOp4c0dYlSKc8+8wKrqxscH53Q1DVrqyvormVZTUPohwxnM06OK25eP+Do5B6Oht1LknOXYna2zxHLDe7tLTk5WeAdqCiEgwQC50Wos3QWpUL9a9P0vd8uQWCo2wXLco6MAr5LioSrjzzG1sYGpovwdsSbb37A+x9+wMnpAWcnx0iviLwijwbs7GzxmRef4ad/+sv4LuPaO7fZ3V1DRYL9vUNODhqyeIWdrV26xlGVC6pmyXxWUi1adOPwxuMMmE6SxpI4FbTWYhUYHOWyZhAXPHL5MlIK5os5KorR+s8RR0JIlFQ4JyiKlHMXhljXsH97zsnxnMXyOFRmJgWDQYGzjqpsUPc5q04S9U1WcRKzMimCz1ekjEcjnPE9KSMNnOV8GIDizoeLe6d75JBEyhhrYHf3AlIo5ot5kKijsOTeZ+1678J1TwAIjO7o2roHk2ustQHj5DVJqkiScGUsBjlbOyN0Z2hrj/Ma3UGkMvI8oWk0URGa3JxznLt8kUtP7jBrDnHNkvm969z84XusDVJ2dja4eXufbJiilCYVgiItiIYZeE2W5yzKjjQeMcyGxJlg6+FNtj+6SnGxwDiF1jBYiairOXvXD0jiGGRHpBzeOgQNpg2sULzg1ofH7O1dJ4szjNF0ugf9O4sgpNED0aC/jkKPEJQB0G8NH9y4zrV3r/XlKtGDYVNKSZaGWs26bmjqFmsNkYr6C2C4nOVFHoKeadI/A8SDxL2S4Rp535px/xKone+lc0We5QE31cv79wdCgaTIi344M3Sd5rnnnuWzL36WH3z/B6RZFtikdUdZnwUVKlasrRVIkTCfthRFhPEdKo54/Mmn+Vd/8C+YThtee+3PiFSB7nRfQiJIkoK1tXXOTs8YDUeBt+4s6i8wrpu2CkErEd5dQoY6anW/VtUFYoRzYZi3NrB9lVLh/2sfbhPwYGm4X08cx/EDkoR8sEAGD2y4igcPqzOm97KGApQkFdS1Zb487RfOhvXVDbKkwDYTLl1eZ295A+VjtHDsHe6xkq3w9AuPcf2De6yf3+Tq8+dZWXuC89tPcG/2PoYYR8eVTw05uyW5e3NJpBKM6Whb19t+PMOVAmvv5wGCtaHrDIJQhJEXQ5SSWOeDvcIHP3F4l1mkVPzdX/k7P/qD6n/zT/7+y8VKy+76mP17Lds7Cf/FP36cD+7+HhcezXjk3Bpaz/jCFx7jE59U/OBbM2IMB7csH/v8JsnDM/7H//mbpOMqgNxLg3MJiI526WEuWd+I8UbQLB1rKzHVzLK7k7C1LanblHLm+eAHDcJGzE9mvPf6IWvrQ3YeGpBFHTcWZzTuHpE5JbJnzMsUpQWLuzVV5eBQ8lMvfQpkwv7hKeORJ449MnZkUUK27YnFJo8+OuLc2ohOwIfLiry7yoXVbV575R7f/uM9tJ+hsjnOxcynjkgqRGSJI8fsrGV9bYXhaJXp2ZQ4BdtF3LnXcvHSc3zqc49w6fw6ril5/NFLPP308/zwrbdpRcvZ3ZLTA8fVj2/z1KdeYP/2EdJC3YESLSdnC7IhXHkOFlODK8esb7e02tHMPUQOYvBihMcTp2PyIidJIjorSOMBXTVnoCTVHYE5hdUVj5Whf136GG8cWOgawIV0aNOAkh5jHVIEN9Ny4bGGgLzyDm8S7rfXxBl9AtH3fx5RpDF5qkilBmvwMobcUawoqmXN2b2KtMjZvJhTFBfI1Ard8pDZYYdILJVxbDyzjU2gmzryeIxwLQeLYzYmm1w5f5lbN/e5cvUCn//xz/KtP/0uVX2CjCsWy45JVHNuR9HWOcM1S9tGoCTzUocUqw8okDyPEV6QFcEnKWXo4s4GER5o6o6nnnqSy5cfZjFv2No6z3R6yu0716nrkjRNwoaqEkDSdbpnF0rOqpb1rXU2xwWumTFfajbOPcS1D+/gWGc42uDw6ICyXNDVIQE8HEVYnSIZYqsIX0uunD8HFvb3T5E2IvWCL33hixSDMbf3Z1y78R4H+7doFyVd1xJlnvFwBD7CWkGeD/FeIpXCuI6NrXWUjKjKqq8FjFCR6jvjfe/jAisc2hg2d9bZPrdNPo4ZjMZE8ZC6KdGmRghPXQc8TGeW3Dvcw1hNpGKs8RwdHgXPGaCkYH9/j7pe9n9+v5tbo7VhZXWVtfUxKxsWoy0nhx1dk1JVMJ9PkZFGRQ6lPCoKFz5vA+Wh7Wtwg3yagg9hGCWigB3r+mpc5/C+Zbmo2Ns747133uLbf/ZNrl1/nXSg2dnZollayrLCO8izjC/9zNf4t/7Dv8X6xmX+4Pf/gHSQ8kv/7i+il4Yb73/AeOw5Ojjhw2v7IW1rGyBleyfnwmWPQNJUKVkWceXxlI1dwezM0C0ipBMo5Xj8mSf4+r/zC/zCL/48F85t89471+iM6RPTAbcmELRduHQZo/AmR3ce589YXY/DwtAppMoYDCesra5jtKCqK5QMwHwhw5CfJgnnLqyze35ImhTMzureG6jwNoQujNa03YK2aeg6Q6RARaEqtdUdKMNieYa1AS4upUDJCLxCa4vWYWHIsrxv1QnYN2sN2nQ9gaXrh3Dft6BZqqpGSsVwmOKpaKowPEsJw2HMcJQxOzujiO63zimiJGVz4xLPPf8ZXKTYOL9NPHR85PmXuHHtNj98/W3SLEZloPIhn/jMS3S6Zf/OAcYIJuO1cIlWwcbjTcbN759w+80FfikYREOEV0RZQpLHON+hSGkqh9MpschxJgnfb42k7Q57yV0QRzI8XFGMJit0jcYbGXBQzvWqjQslIsb06CpHkirSNADppZBBaRIRUqbUdbBVWOsYDIYP5OlwOYsQSNquJY7i3lNq/39X1YBh+vOBLAxSrj9QBHC+6RFacRwQWkmahRxCX0d6n9sLntFkzPvvv8/G5gYAbVsjFUAMRJjOPbjGp0lE2wWOZ6OXuOYKy+NL3Nx7hRs3rhHLIUY3CBmwUc4Hr3VdVxwf3mOyEqpPmzr8HUWRB0IB4bnQdW1voQgeXSl88Ota86CByxiLNm3w5Pb+VudcQDFKSRSH4JgxwUud3Q/cAuB6Trek65pgjcCj+guvEOFyGakYT4SKLV1raOqS9dU1sgGcHC95681bZIMBnpjp0ZI4sTz71BNgBqTDiN1Lm5weVaRkvP/WKxydNCAKhmqdk9MZqlY4DSeHJ6jQN03XOVY3Nzi8d4hAUFUVSZKGwoz+a+d7r3TbNhhjH8x81hoGg/wBpeHXfvnXfvQH1f/6f/iNl71OuPRIxud/aoff/ReHNIuUL/2Vy3TC8cK5v8ne7Rl/9H++y8Q/z+/897/MS597geefepRvfetN3v3gDqOxpUg99SmMJ5bDfcuwgI++MOH29Yp8MObilfO8984Jo/UILwR371qsF0jXMVkbAznTg5LVzYztqymzquYjzzxOMnJ01yvaaoHOWvbeSZisGa7fnjI/9WyNUnYHki+/9LNcefJTvPr9byKsJFWS9bUhtpIM4vPo2RnFsOTWvXvc+N4pZtrQrbeclRGPvLCFmpzw3vXbCJXitMWUkkh4vAoYkDgN/ePDwRXSvKCuaryYs76W8cNX30eYCVvbu/zJH32f47sl7197j0Z3CLdKlLa4TnF04FG5YXbgofZEwxLbBoj+5sMxJBWne57Yw3BF0bSGtvOMJilOaqxPUWlKkedgWtAtg8GI02aObiyTDmS9RE0UXWqwbaADOCse+IBCStQHFqEI6f/xKCaKPN6BJAEE0kOsFEJ2yEjggKYOP+BpkoTK1a6hrS04x8ZmzmiSMF82KDUkywuiXJKKhLPDDqEN6yuCy+eeZjK4QKWPqeaQCsG9OxVdGSMSmM0aijRlZRzR3C54+smrHJ3eZLHQ3Nuf8sF7Nzg+mhNFoV993nSMswn5asFsqUmTmLNjz7mVgiurObWLyPKcYpjQdZrNzW0QkuPjKVXXoY2kbRyTySqLZcUbb7zF/r0Djk72yEeOj77wceazBbPZlDRLUComjlIef/xJjg5PiSJLGsPp0Yyyjjh3+TJNHeGtpOlOODg5pKk6skwTRx11WYfErrHUdUlVHVKkniJe5cXPfoHbN49DSUKh+PVf/S1e+NiX+Nd//C3eu/mnyLThP/1P/kt+6qtfYr4sOTk7Q4ogX2nd4oVmPBnTNA3OCKql4PDeIc50/cXLkiZJD/m2oeCg985J5Zkvl7RtiQDOzmacnZ2F1HJ/8ZAy7n14LboP8AS5SfcpWkvXhkYjge8TuRbnQ5DOe4GQFt0ZymXLcm6YzzVGC8qyZLE8BSRxNMAagdGSOA4yVYDHC5IoeM3oqx89lp3tLZRSnL+wy6d/7NMUxUp46WnHdLagqueh0CRKeOypq3z6xedp2pr9vUOc0winEbLlYLrPH//Jt/m/f/dfszrwnNvd4LU3P+Ta7Q8hEVgPH//4C/zcz/0M6xsrnDt3Ealijk/ukeURcQxda8jzCaPVIXXjUHIS+J/GkuYZmw9d5uKjL7K58xyzxTGvfOubfbjF4m1Icmd5xs7uNkJAVdYIKVhbG7KyMuLstKJtRM8YDc1w2ji8Cx5V2bdfhaCSpO00urNMxiO61nB0cIJzAkFEnMR4R7iEekskRWhpEw7nW5I0Dl9zlTIajgJTkkAG8N6GpLru+qEppLjzLA9Sow24qoCu8mR9OCbPChAyeNx9CHLGcY42NdaGhSTNYff8kKrqMFgWvsRpRx4ZikwwGGxQ1nOuvfsdvvP/vk63NOzduM67b7/KaBKjncZKRzKCw8OWmIytjQ2eeuoqQiju3r4TAkzasZgvsY3HO0NrDPP5Al23NBqciCmSqE+AO0bjguEgxboKr8MlcmUyYbmsiFREVS/7QUj0y6AgjXOctz0lRDyQrMNJL4xDVodlOkvyB/ivJI3w0rK+scLFiw9R1RVJnDEajanrOlwalSRNQ4tY27Z9MEpzv3AgMESL3pPZcr/VTPTH3SSJe2k9/IaUgTyS97L+n1fkhr9HyGAjOTi4R11X1PX9BSUs8fgg0+MkujNUVYk1giRJcK6jM6f82ff+JQd7ezzxyBOcnZ6S52C0AwXadIwnA+p6gbOaKFIsFnOGwwIpJfP5rPfWB0ZtksRhWO3VA2ODvP3www+F+tjp7EExhu8H09CuF0Ja9wsanA3Sf2gbDNfXtm3BhWyCdY4kSYlVjO9b4tI+YBYu0YLOVBgnES4mVmOM8VRVw2Bc0LkK7xtEnLCzlvLxT69SNge89b33+em//jVe+bPv8+br75ANBEnq2NhZY15OuXPzmAvnLnL1iatsnl9nuSxZTCsiGQVJUwcikHYdSoq+3thRV034XKWgaer+c73P+XFYa4gT9QAn96t/+y/BoPrf/bPffHl1qLj2wZKf/etPYr3i5usHPPkpuHNyhosOyYYFx3sfsL054ud/8d/kysXPc3H3Ii88+1l+9w9/l3ykKEtBoy0ru7D7SMrFyxkSyd6HGpUarl8/RqqIzd2Yk5MW76GqO46OOo72SpqmpnSO49KTjTq8ain1jIsPv8Dbr3Q01ZKrn+yYd4b/j7o3i7UsPc/znn9Y0x7PPFRVV3V1VU/sZnNokhJJ0RRljZENObqhLCuxA0mxEMBwEjlIHCcAYQMJgtxkUoBMgC3FCSzFlozIskRHNBU6lCgO6m6OPbDm6cx7WuM/5eJf57QcBLmNVDcNVJ3q2vuctdf6/vd73+fd3BohRcbDA8OHX8q5+dI1/tHvvs4XX/sDtrMGDvOIvAoD3Nmc0+YJN687Lk3mWOPZuhw/gAeLFc3hMQ/u3KGuZgjl6DpHVYdIAFAB24JAMZrAxr4lGZ0RxBDrSppGUz7sGKeKxw9nLNsRV58fsjysMLWgdR3aGQZjcDKFTuDPliwXD3FCk4s4IBQ7DWtPOar5Gge3LISOIBVkDhckWR4w1iGSBKnWEbrDVDP8osVpTe4LsCVLu8IMDINNRWcCdRewNq58HQIToh9Pq+h/8ibeKKVUSOUxRvQnU48ggFco5fEE0iwhyxXeecajHNlzApXKsb6jajpCmjFem+BLT7P0jCfbpFspisDiERH2LJ4QphqRSfAdwVs2ti7jfKCVZDibAAAgAElEQVSpG4JxzEQE2X/o+lUePZpxeHyMp2FVLhmPJTptyYsRzqfQwsnZAtEtqOcNzli0XtI4Sy0KZsslaZoBgSwfgoj2FaVzFov4kE0zGcHWQTMo1hgMC3yIffVJGh9Aw1EW/Z9NTZomPPvcDR4+uE9wLUjJbD7HtguKNOXpZ57m1t03QURAeVcbvDEokbA23YneWBEZhW0DN198jmyS8cWvfJmkGPLjf/6neeaFD3Hv9A7/3S//F9y6/S2GeaBZenzY5MHhkrdvfYN63pCk8Nxzz7G9d4mmNRwenNCZls7WaO1ItOLatafJ8oSmrlBaxpaTEG/C3loEvac8aELXI89kIEscUhmGoxylwgV/1uMoBik7+7H603aKohjgQ2B/fy+2V3lHUeQEfN8AE1doInIqohdOpFEl6tdxeZ70gZFYhRph5h6lI8LlPFWtZdo37Vim4zF11TCbLZhON+Mg8vgewXuGg5TpdIMPvP97eeH5G6zKBYtVgw8JWk34vo9+nOnakO/evYNxgdFawKvHfPC9H+D7PvpD/J9f+AO++Pufp1pFpmawNd5knJ6suH33Ng8ePWJZzmgby+ETz+mJw3Sa1nQsVkvqBqpFLOgWWmGdoFlWfOdrX+E3f/U3+dIffI1ldYSSkdebplnfQGNI0hhUDMIwmkSP8Wx2RtMtUIlDqQxrFB5woWW+OGNQDNna2iRNNVUVweVCCLxJWc49y8UcJaOqCBLrW7TKEAFSnaOkjlQMH/3ric7QuiDLNqnrDmsNeZZi2hjSiyvSWJlKiL315WoVH4c9VD5NUwSSQFwrO+cp8iFdG9mW+/vbIAJtLbA2sqN3trfZvTTmwd0ZWkwxVYlwCh80Zet48PgBh0dPSLVCCRBJwdb2Lk1XU5kVXhoSlTIuNFo0HD06oWssJ4fHPHlwhGkDxlg2t/eQ0tN2JRQCYxqUV3S0NE0FbYdpaxobbUJ4gQgSKRVpKmIltUgIQcYikkSjE9WnqyM/1DsX65596Ic+zWAQw0ZxaNL9vSDQdW0faJI4B1rneBdblubz2KjUtVEtJbjoOXc++jb7ooELbypxoGrahs6ZC4zVuWc1EBVK731/z4yvp2mbvsAhWlC6rsOYDggUwxjEyfM8Kq09V9kYC8IzHBbRo+3biJPykezgfEeeDWmqjkGRMR4pylXJeDigaxuCiKEu6w2rcokIHiECXRvLK1KdMBoPqes6ekqdp6rriwbB1hjSJKLWzvGD3nvKsiJNitg+pRTD4fBCIY5Vs2lsXyTiqLq2i+HCruvbC6KVRfZ2iUExwjlPkkQxR/d2Cu8tSEtAYVwHvqFpV7EVTXgEllUruXrF8/T1gtlxYCDGVK3na199i2V5l73JNY5XhiA0W6MpplV0/oDtrR1OjwxtveDo4Rn1IgbcOtNQVQ35YIQPXV/zHVX1+JrlH7vnCrx1sazDOZJEo5RktSpJk4S/+Yt/MpqpRPQl/L//eu6HRHAmQQhDtRjwM3/1BnU7Z++ZgllZMcyhaRWFPsNUI8bhxzn5xoSPf9/LrNIpf+c/+xs03KY6TZDB8dwrKRvP5Fg5485nPfVKMZo63vxmBNHuX28IynP6SDHdcMxWYOoMn7UoAXYlWL+syCYaIcdMh0NA8OCbt3nx5TFHZ57lzPL9/9o2X/ylQ0SmkMWYtmmYbi8olyNYSuYHgXq45Op+AarlYz+6zff+0E2Wjee3f+0+9XHDdrHDwdljjk4WtF5Qto6yiYlLJUAr8D6jlR2pkYz3HEWhyY4KRi8Mqc405XFgefsRSieInRHPfeBprj01ZXUasM0T3vjDt6kPwOqMhBHeluhxyvy4ZFQoNjYEal1S7Bfc/4pBtEsW1jEZjpnu1MjUUmu4PLzEg8YyzjXGzAhLSzbYoJ7uIqsFSzenmp8hXGBrf41FOac5Dj2uIsr+QgJBRTXKO5xRWOMoihQpJXXdRF5oiAc2KeJNV6emB+MHNrc04xEIC3XlaHxAeHAGEFDkE7a2plTtEfNZh3UF3cyju4DrAtO1nI0bHXVqKBtNGkZk9S7HZ3OmY0G5bNl4ahOaJe+7uc47d05487tzXn7he6gax907X2GiC6ZbgsVxyemi48pLBd0M0o2StY0hx+84RJLj647jw0Be5HRdRVUaBBlSQZJG1UNSgPBYV7Gzsw0hYbGsWK3KuKZUkOcZUnvqqiPLE7qu5ge+/0e4fesxnY1A+6ef3uW1179O8AFFjpAmqo6dJRtoqkWF0HHN3lax/KFcNNy8+Rz7l7f55rfewJga76GtEpTOGW8YUiUpFy1NY3AuYLpYHZmmsfLPx3ZTkJFZ6HpVJfQeNxVk32BkGE4cxUDRlJqyNDFYFSLGxauAIxAwBOcZZRk3bgyZLzuU0iQqYT5rMJ3HeYUxHmsh0OGdZXfnCoPBGJkITk6PKFclRT4g2EDXVgRalBJk2YAkKbAhkBQJ1jTUZR0rMSN3HGvdhZ8uTRISHUh0bNCxrcS6qOR1zqJFfH9SSYrBhKZusd6wt7+HkLBatIyH61x7ap/OVJwuFzTW0naW8XCCrRcs509oO8PW1oDd/XWmG8/z5MmSN9/4MqNRykvvey+dMbzzzj2a2tI0S4qhJs0gLzTOBZra0rUxRHVeDKGUpixbQlAoiCvv4C/WvE3bYJyN6W6hESqGJ60JsRRESLJEsb7ucGisWWNjbYQIgbq2qDwDGZidnhICDPKCoijQWrJYnMWSDGt6Z6QkSwrW1zYoBkNOT2cIKViultBjokLwFx7mug9FZVmK6AtUQvAXw0G5WiGVulCnYvuS7hPr5x44TyAWAICJ12kQSBVXtMVwwKAY8OTRAVkyIHiL0p5BMWb30hoPHxxjfY3pPONJzovvm3Lw+Iy19YS772gWiyXT9Sm718acHDU0pWA8VizmS8qyRWsDPmE0HNFUJaYLKJXSmZrd/S10knF8PGdRligb1c4gYyhM4QhBYrxnUORY20ayeCiYTMeslscIoek6F61ZQSBDipCGNNFIpVgulySJRorov/RYWttR5GO0lpycnjAZTREh4tikjMNilhY4byjL8mK4jZ8HSde1F0PWeRMYXiCV7YcijZQaH86/3/1h5Y/hrAQysl6F6K018f/XdR1KKareWpPnWRycg4r39kG8v7Rte9G4lSTJxTVRFEMWi8XF2v2cdlCW7w6VxhiKIto72i7WuCY6R+oc0y1QQhB8hvHRchKCpshTUqWpqhJCwPfsb+ccUqdIiEMjYEy0VWR9k56Q8f0651BKXXhxi6JASknT1hff41hEEFVTawxSRC9/HO6SC6RYlmUXiK+2bZFaEUPKqg9sxXkrz3OKYoBWmsFIU/tTsqFgbXONzjoOTkom65v88Kde5bUv3ecrX/kK156ZcP/unPFmRt21PHP9/Xz4Q0/z+c99no3pGt98/R6bW0PKsmRte8rhwYquhLatIjXDS5wxJEmK9wIfIgVAyQSdGrpGkGZxi+a8J8s1y0fNu3Vm/z/++v9WVP+nv/OZvNBY63jqBly9nrK1r6jMknwwYrTdMd3axGcbbO9u8p0vHvLb/+hLfPRj7+X3fufXeOONL7N/aQ0rV3iVcnw74ezBkrYWHD1RCOmQWrG1r8nGgmVpsT7FS48xgVSkVD4QWk8WJwgyBUWhscJQNnMez1ZUTcLmeuCnf/JFvvmFMz74IxDSTW793gmDcUmx7XBCUp7A7FGsyPyJv7jP1lMFs+WCIrnM535jxje+esA7r9cc3wdrV7zyvc/zxtcfsKzjKVMnOdbEwEaSZFSnbXwQ6sDCQlgFjt42+M5T2YSuPgKZMN1JEGlLVQqczzmuSw5lx6sfmVIaw8mDhtEg46xc8SN/7gexTnBydERVO8abE5b1ivndlkEmCFJTFJ6B3sYJj8wkyycN47U1Hr55gm0D47GAdETrPAVDQu3YSgS57hAVrOWepgs4H3q0RyBROQiDUAFFAli0FggRKEsTsTReINGxVk4FhHJYA6BJUk0gpo1VEgghwwkHQaNThdQe62Kl6mCQkqaBzDlSl9CKFj3NyXRJu5RMphtMB0uMrXlwv+L0ZEXIMnauXme8ljFd32YktgjDBhF2KGTBG1/9KvP5irUtwXjP8/CBJ99I2d4dMj/JsZVmkMgI4+4yvNN4lyBFgrUR6yJkRPhkWcLGVoHQC6QSFNmU5bKKIOyiiCGV0BGcpO1KTOuwnUCSMsjX2Vhfp6qWpKnm8OgRn/6pv8QH3/sqy7M5Z6cLitGA+aqksitG0wRpHctZTZYM8cFiXMXWxjYffvWjvPmdb7FYzABDnknSFPJCRq9wJ9GpJCiHlx2jNUVaCFAaeb7CElF960wcGs8Hj3OAe3wQJRErJyS2S3E2R2kIKISUKG2j8mczUp2QFB2zZc1q7lnOGqrKIog+WGOIcH+haW3PWW4aqrLi4OiAyszRicV1FXVbEaQjyL6isQ+22dZjGovpu8mtO/d+cZHCjYOTRQRBlmZopTG9iheTvgpvPW3jQUiMrwky1lWW5QohEsajEU2z4O3bb3OymINKCEjq5YrTg8es5nNWbYMXYDroSrjz3Yc8efKYn/2rP8u/8bN/mbJacHL2gKo+xXQWhMOFgNZpDx2PQ6oUCVpnMblfG8qyjTgjFeHhzhqcs2RZHtUpF/vXlRaxhTJEJUuriADSOkOJhBAKpJqQ5QkQKBeBQAuiYrksWS4WUcU0FtuZ3gKg0Srtk9wRfaWTONzNZnO2tjcpioKDJwdkWXKxxkySlCRNGQ4HbG5u4F2gaVpGo+GF/zGuruNWyhjTq4Dioh1MCHlRtRvXyT1AHoFOZN/9LrHGUldlTIALixQpTWOj7zhRzOcr2q4mBMlwsMv1p5+NrOOwz4vPfQ937r3FZDOjtTnbe2vMl2dUHVhSNi8r1i93WB9wy1g17bynXDUQJF3jOHh8ijMGEWJDHFhscBAEqS6wrmMwyiOuUGqybMAzz1zF+0DTtuhE935oSZooikHOYJgzn88JQD4Y0rYOEeLhMlqvkn5V36BUgjVtvKaIHtAsyxmNhvEQLSU7O9usVqsLIP0fHwDPfZLORguMINpzrPUEby9oEsZ0KC1RWpNnA0BeUBxARkWceCBPU02eZaRpijGmr0AdkCQJ5aqKAToiGqvrOoDebqCoquritTVN07/GGLYzJoZw19fXmUzGUbUXsDZdQxpLFxakKkMIhQklQgsIihGe1lmM6S489VKJC4/uu5Wr0LVt7LuXAm/P74GBpuk4L2wBLhBh56irGGLsA27OkuiEPMvoyV/xPtPzVrMsQylFWZYxAOk9xhrSNLv4bLzrj7Wx3KSqOTubk2cTjNE8uX8GLiXVGW3Z8sU/vM3J2QwfPOVyRrMIZCrn2pV1Rsk2x/MV69NdTk9qnjw8xBqYrg3Js4zZ8hQRXGTDymFsEu1tJRcoQZVQDJJYFBHAB8tgsB6fMQ7+w1/8UxCm+q9/5TOf0SogQ7xxLI8nvPTBfdJCE7TjO38kef1LZ3zh7z/hS7+x4rRdkjQT/t1f+DR7L17ia3/4O/hhRzYI1I/2aGfHXL2puf/YkilB0wWODgV71wI2WE7OAmUTT3ROeBalIwRPIhVGO4S3FDqlTgSFLqiaDmFbholj+3LGj336BX7o5/c5O234rf+lROYatREoncHOJc1hx2gk+Fv/1Yf4C3/lI3z+t2/xjW822PyQtR3D8d3A5a0MoU/48z/9Il974wHzVc1gMMa4eFpLU4V1ka/3iU++yHJpWR43JAPJWAfe8yHBoBgyWfc8fgiruma86cmGOYIMbTNkXTFC8NbbNVdubjFNco4Pj2jrlNPbB5SLmny7RmYZ092OahagcmRKU9aGna1LHD45JRlqVB5QJnDwoKE8ari0l9EZQYWApCDNFSu/JM9HmIEl057yRDBrAgGJ6CtwsyQlH0Q/WzCaNItNQuBj7akEYyIeJaqMgWExRSUGlTisEZhOobQjK0AE2Zv8U6yPepxKARJsJyiShDAMFLsFjdM41dDlCWWbcfqwZWdjwvauim1gpx6RJFgXuHPrLvfvP+Hn/uJf5+mrn+T1r73JO9/5JlVZkU8Uww3BomrxXtK1hkdv1aw6y/paTrVoWNQaTEuWFiwWC4xteghyrFKVKqGsKtJcsr5VMB5NqUqHNR6t47qqbZuIFRIgQiDRFiUCu5tPs7dzmf3LOzw+uM/x4YKyqfi9f/4HrI4WPLh9i1W94IX3voeTk0NsV3HypOW9L73Kp37wozx68hBFYDzJ0DLjycFjympBvYx+zp39Qexrd4KubdnY3IyNL86SZRnBS5yTKJ2wtbnL3u4uxpmLB4j3Hi0F3lmUFD3axaGUp64dwWWkmSDQ0bUW06/pBBKFZ9x7edGS7f11Mp1TZGN2ty8hhY+BsK7FulixmmjJeD0jG6cgNCpkpCQEJyBkJHmOIzAarzFd26Q1js52GN/iRYdQEeqvlML1w1JU586HG3o/bBz40iyu/trOkiSaK1ef4uq1K7gAy4XB2XMuZEBrydUbV9m7cgVrO+azM7JEsz4d0dQlBMt73/8enn/xWcp5RVO2kHqMqlBK8f0f/kEu79zgH/76P2N39yk+9Wc/zL17t1nNIuJlVdbMTiP1whpBXRtMZ7EmfhbSTPcYHoF1DqkUgyKuW5erEh8CUsXmnfFUM5mmdG2N66JK5lyDyjwqFVjfsrW7zv7eNk8eHmC7jnJV0rWB8WBC27TxwRk8WkvyPMX3XtXORJxSTD3HtXFZlszns/4hHNVqKRVN0+JCbBlCqjjkSEHXtbRtHD5c7+k7X6GeJ6u99xFGLgRSy4sDslQybmaUghCQIsEYjxCeEGxPEYjPhCtPbbNa1hgT24ikisOttS0P7i24f3vFwZM579x+izQXBK8pz0q+9bVb1KuKJKkxbUu11FRLgWtS2rKNFaYtKJmiJHS2QesIRxdB4jpwNkWnnizNyLOE6XRCWS0Zjwp8EGRpjpI5x0fHFEVKa+qI3SPFGMuzz97guWdf5s033yIf5EzGa8jE4Ex8D3k2hCAiSlBopFB0Xd1jrTRpmmGMjSgpIEkUdV1TVeXFwTME15ckRBVQSRWH935VL2TksJ77lJXSvRczetKDl1Fh9DEARlDkecp4PAYCi8UiKog6guGFEHRtDFEqHQedNM0QgovhM8uK3pPLhZo4GAz6Suqosp//XpIkVNWKwWDAZDKlqitWTYOTGUKmdCGghER6QYekRSFcFzdVSiOV7DdICoQk2PNwmuuvSQU+9Id098d8tvpfmnvOD2bn2Kn4+TAQ4vtKswxj2ugDTvOL99Y0DXVd07YxyCWk6CkO74ZUzxFfET8W64S9E1gnqecGrKZZttjaEKzDN8c0sxXtrCPRQ7qV5Sd/6qf43k99kLduHXDr3htY1/HWt98hzRS2SwDF8fGCybjAOUmWrOFcwGMQsiHNI4P9vF7aWBvLOqTCNLGtTEiHdfAf/Xt/CgbVX/p7f/szMU/hSdNocr9/Z8HNl8fMZw2T8YjP/uNb/ORfGXPrdcVr/+wJO3tjfubf+QX+3j/8DSr/DWqrmN/OefBazc7mkOk1w/HMkfgMMsvGRoF3ggf3IxtRSHBeIJUkkdAGgTSCfBrY3RtDnTDd2qWpLZNJTp7k5FnNyf0B/8f/9ojT1uIf7/LaP79PPrGEUUC3A8QyRQ80e89KvnvH8Ev/w9eZVYeMNxxXnknYvd6RTS/xoe/5NG9/Z863X7uDQZDlIKVmdtqgJAgde5OtCbz3A7u4QYOddVQngmee3uXVj91g+gw8+2zBYpHg1RBrHFIl1MpT6DVGScbmtWf4wPe+yOJkyYM3j+lWNq48TEnnaj768T0aeUZwgtkDTYLDGokThrYz2EYyXdfkA4+rMmaHmlGi2H+qA+nRkyFaJDHlm+eoIqHBoDrL0a2AnnisCaQppDpB0JHngUE2oi5blIiNID5Y8kFEVsVVsooGdwLOyeiXw5EPIhC/WlkSmZPlHcFFzycShJMIJQhuwFp2g9QJgrIUXjDQKbYcMk43ubx3CecMy9MlwzXNcCIYDdbIkzGLsxMGE0WaFxw+OeC3f+PX+e53v0GiS7Yup2xd0tiuwdmcQSbJpEILj8saqlVHkiacrQLCQb3KqOpln9wERGC5NAgJOrEEn3Jy2DA/C6yWHUKBUjAYDPuHeqzbS3XC1naKd10ccBDkgxQh4ejoLkoH1kZjmuodkmLJqrU8fjhnlLYktmVzZ8qNF1/CSM2Dh7fpVi1rkxuMhlfo7AzPkk9+6vv40R/7Ub7xxl2W80CaCj7ykY/RVEse3H9ItWpQaJpVIHiFNw6tNNeevkYgUFVVXFlKeZFuDd73g4vCe3A2slMHI0+Wg/eO4FT0IwrNeJST5YrNzSk7O5f5gT/z01zZv8Hbb77N6fGCJI3BkHiN5KRJgfCel9/3EtdffIbFbI4vW7zraF2D1LA2Hsa63K5jd2eLwTCPTWsqRYq8h/VHJFLbRoUm0hQEpjN9WpdYLSkgzRSJjoeqpm7JiyHjyQbL1YrBUDMaj6ibBq1j1eudO3e5e+82VVWSCE1b1ZydnmK6GqUDQgyp65SynONdSYomFXF4+8OvvcWXvvYa001N1634+mvf4vH9UxAejycvRqyvr+OM7YeAuFjVOkGrWMkrZaxrPO9V9+eDIzGkEQ8JguFgytr6Os66Hp7v4hDiEtI8J8sKTo9W3L9/D+eqGJbSKVefusLly7tY19E0FUmi2N3dZTpdZ3a27HFlgc5E716iZd+jHpWiweCcBRtZrBGIHliVq/h7SiBF6FWzOCQopftWJdGvUSOmyEUvSFTSfBxQiyIHJN6GixWs95asiPWyvgfNeyPZuzzmA69e57tvP2S5rEFaREjI9ITOLlE6MF1PYxOfaNnc2uD973+Oq/tD1qYZw2yd5WmDAqajgraymMZjbd2HAQUIh3UtUvnoIfWetPBs7oyYbma0rWBtbUC5muM6zQc/8F6cyaK/Oy+ZnZ0xHGscK5aLeK9UOpDnIx49PObu3dtMNx1J6jg5qRBobNextbWBkjpuTry/uNYlcQOQZdkF1D5J4jXTNA1VGT3xQDxsK9EzTc27h4Ag+8BXiGKBEhdqporsuTjcqpRExxajpln1wxoUg4TZ7CzeQ3o2aNf/vE1ncc6jkvgzP1fKx+NJ33IksJ0hz3LSJIVAFDpCFDyi8tr2yqrorwcoyxWr1QpjDdO1NZZHp9jKUHhJknqWbUcuEnzTohPZX5fghbwoOQg+9GEwhdK699nKCxuKELIv0Yih4hDePWCdH7LOr2Nro0/3XA1drWrSVDEej2lNFz23IXqJozoL9DmNLM3JMt0fJnoPqNSRs9oZvBOkeWSSe9eiJCQ6VvB6G0iHhiLd5Id//OMslscs2pKqLvniF/8Fb731DtONIft7+3hvqVfLHsVlSRKJSg3eR+ZrZ1akuSFJY0OnMwHTaQKmt+8YlEoYDFOsNf3BQfLv/9t/CsJU/+3f/U8/I9AI6Ym8MJifevZ2thmOK44WZ9z5Q8udbwrqmWArbTEBfvfzX+b0zluoKwd0peY7v2fJM43Tls39QFU5MAqpYX3TU61ivZd1gTQTEGJHu5aQDkAbT2DA/MySU7Hz1IA83cPWnmxdoKYlZplw5WrF3vMFn/vfv814LccmCq8r2tOOwiUYK3Ci4ehRjU5X5EPwQTHcAF0oOn/Mt771ZVBL5mVLXVXxRl03KCFwVlysw52Drq4JMuPSUxN2djJ2L1/j1Vd+jDo8i2MAZsH9ry/Z2N/DDJeMyXj7y4dcee4GZ6bmye0zxvoKV5+5yp037xGsYqFqvBQc3a1JsynSDWkXC3IVaDrQ6YiyrvEOsJZqkbKYL2ibmr1LGVeelhGO7TXCa9xqwWi6hhKBTGZ0JzW4lnwqWBsOKXo/02RNRAi1iUlu4XOEbi9qcpM0oW08zp0/cCVeeKzrvU9CIETHuBggbGBYjCgKyWIRkMKCl0hS8mKCttucPTykXlTkWYHMV+TDKVJn7F25wtXn3seJn3F6OifRDcPdjsWyYz4TbFzZxHYJTx7f4/pTC3TeIqWiM5KtacGLNyeYzmCrMWerjs2rGRtbQ5bHNaZp0ElKOtCsylNwMaBjjCXPphjbkecJ49GU1WqFdzGpLaRgMs7Z2d3h2pVnWS0tRTHCdh5YIaVjWGywsa3oOolUKUHA6ckp3rWYleFD73uVbLDGooOuWnJlDTIl2Nt/H2ezkm+8+TVsC6kc8dT1yzhRIpTn5s3n+bf+zb/F8UHN7//+F3n/qy9x47krvP7619nZusJPffrTrMolR0fHuNBgnYEQG3weP3nMyekppjVIztPxEq00WmlUr46LSL0mYMnzjNFoENXKxpNq2Ls0ZDKdMF+UrG9s8MrL38MXPv86X/i9z+FcS9vF6kRrW0KQQEIQAucVs7OGJ/cOOXlyQlk2fWNZ4OZzN1jfmPDsjRt4K2iWlr3ty6wWFeVyhTNd9FD2Sd64Ok77wERM8HofE75CvuuD1JqY1hcx2Xvn3m3qqmQyHdAZQ1VWaC1I05wiHZGKNLJXhcHREbxDS4lEcHZ8xNHjhzjb4WUAFVBJwBqLCCWektl8ycOH9yhXM6YbKeubE/JsE+80dV0xHBSMRiPquupVpvhziAii9kLZicpNrzoJgZBRdbQGypXh5GhG1xoGgyImjL3Ge4EzHUpKklRTDBRZLljfnrC9t0ndVFSriqapGQwLWtMxXyyomgaVJDh8v8b0PW3C9MpcPIier5IjxkhSDAt0oplOJ4wmI5qmwtru4utiYw8XvveY6O7T5oj+z+PXBuJh6HzFHHxEN2W5ICs60kzhncIbSQiap67u4EPNw/tnWAs6AaUExSDhxvUXePmVZ3j8+Dj6pO2A8XiK8BOePATnE7QeIrTA+I62sz1eKdp3Ah1Ih9IglF+Gye4AACAASURBVMBYASjSXLJ9aZvLV5/DhxFCNqzKFXmyzc/+3M+wvrbN5z73BbZ31hmOQmwFEobxJKNrE3Z39+hsRd3O0SmkiUYngJd0tYhUkCwleMHZ2Wk/4CiuPf0UVbWIdaU9TuicazocDi9S+mmWXiTvheRCqQMuuJnOxoE7qtgerVRsj0LF7RmQ6B5hlw8QMmBdrGGNP/t3W5rOqQHnP0cEZHksHEjTjDRNLtL+Fx5NIWjb9uKaOG+5cs5RldXFgSUWUSz7z0FcpSupqFc13/8X/lX+0i/+NYK1XHvmOtMb+xweH/HJT3yKg0ePI9mCHt3Vp/V1vzFCRNpAfA324h54nsw/X8NLqS5e9/l/IRJNovJ8ju9yjMYFaZbRtLGYB7go0zj/++efB6XkxcB7MSTLeGAdDAbxcOYM3reEYOnahp2dbdrO4IKi8i2XLr9I2VRU3Zwf+bHvpeuWXLm8SZGMmFcdBIV3DXVVkmYBgsS6mr39NZSK6MDBMCNJNfOZZTqZMp6MWcxXJFpEcUF4tEoQIhaBmK4F4fibv/inAPj/3/+vn/mM1DG84G2CDJr6TPA7v3bI9vqET//cB7nzxgnf+SczsrJhuAPl3HPntftoccbu09tka4ZUKR7e8eQTSTYYsVpZBpmn7lwciBAELG0bHzzGBJI00AiBbeIHYyVach3ABg5WC5q2Y3OiUMqSy22kPcQj+c7bLYkraNqAAxKXop1BMMIXDX4YWHvasHUpQ+QKs7LsTgVXr+bsPJVCKpkvKkIXkEHEtYIAHwIbmxOcAe8CWRoTtZtqk6PTgvU9yfv/zKscHMx4cOeA8doGl64MaQ/mPHp4hGss8qilO+x4+613+PDNZ2n9A37/n/xfHB8vQQlW81NGqUZZMFikN/HfbjucT6hqCcKikhQhDKOBI/iW1SKNCdvMMjtRFFmB1YZycUq9tKzvTxCyRegzDm57sjAmzyzLk4a2DGxtJ2htmZ/ZfkUKPrTIJKp3gthV3tYRUi1FBK4bG9tRBBbnRGwxkR0uWI4fG3b2BqRFQGeOVEUEksob0nTOQAwYpDtsXtql0CNCOGTr2gZ37s64/fUTtPTYpiIJA5JJgvWWQb7NvQcHzB4vcGXLjWsFnU148sCQiAG7mwkpipPThqprqTvPWSVoliO0BBBcvjKKqeRTjVAOqWA62URqxWQyZDRap65C7Dr3Gc7BU1eu8lOf/tepq4Zvv/lVpO5YrZZAXKXGxK3C+po83+Dpa88zn884OjqGEFCkrG1s8/DolNPFgt3tlGv7goNZgDRQLu4wGYyYzzo+9YM/wCsffD9vvfMWx0enKN3xD371V/mtf/pP0WnHpz75r1DOE+49vMXHP/Fn+aEf/nPUXcu3v/0mjWkRWsXEW3+yDuH84RTVgLT3rkb1SuBdF5WXnn9ZLl3f+pQghWNvb5O19U2OTpd0rmE2P+NrX3mD5eouo6kmLwYMxinPv/gMm1u7rMoG503kF9Lh2gpTlTgZyEY5a2trJGnKBz72UV7+yMdZtYHvfvcWOlNs7GzgQvTr5dkgcly965UfekUnBh7O4ffRvndenRitOVkWO8Z9cIwmBdO1Nc7OViwXdbxeJZGj6xqMKftiA0GiUpRIaBpH03hkKtA5BGtpSkvwgiRVxLBBQms6ylXD9q5kOLLcu1UyOyuxrouKUBsb+U6OT/DOkaYa8CAcSRoPe6Kvzry4Iferwji1gtKCJIn+xSJPKDJB1xhcsCgNiSpQSrC5scmVS9dxLiXV60ynOxwenLKYL0FKyqrCGNsPNQHrOmQ8n6CVIkmTqHYRvbAheEzXIYRifX0d6xzOO0ajIUrC7PSE4Bw+RE9q8PHAd/4rttXFgUSr6EF9N2CTRMU+xPuJgFirGQJpAjv7A5SGcmEJXsUCEqE4OSyxVtF0LVprEp0SvGQ2m/Pmd+5QrxyTyTrGzVktO+7dv8fR6RMeHTzg6OwxTdNhOkFTu1irbGIo1AcIIqc1DidM9H1rx+Vr66ytXWUxEyyXS5rVimeuvsB//l9+hu/5yEf45V/+FeaLE4QghinTHCUTbAdSOAIVybAhSSVd6+hahxQJqR6yvb1LWS57dJREZzEshdBcv36Nvd1tHj46iFW2LlwM/E3TXHg8z/mrSqseXC/jml9KpIpYq1hzasmyBKUFxhqk1Cgt8RiMNUBkriotsLbrMVnRx/lunau4QGhZaymKIaPRmOFwRJqm/c827T3I9YUCmSZptCX1A5wQItoS+uCRs5ZyVcZrsFdbvbfRVx0Cxgvu3znmC7/3OR6/9SZl5XF5wtG9eyS+4OjsEcbEryc4grP99RvwwSN1HDKjahrVzlitGj9zvufOCnGOaOrVdeAc6m+tu+C0KhXvq7EcwWPduygwH3wfVBX99072FhLXD8Pvfs6lEgyHA/IswVpHVTU4F0jTHCEVUQ8SjJJNnjz+LgdPDvj+T/0gL730EY5mK3aeznjtW39EvfLIEAOWTdmilaKt40Z6Meto6yi2KK0Q9Cq4DVRl0ydtIc0j7SfLUhAOQcr1Z/ex1vI3/tp/8Cd/UP1v/u7f/ozHkxZgmyHTSWD2cEguBIvjBUmzQ+lm7N0sOLjdQhMIiUJMBzx4XLKznqG3K55/aZ07bzRsbm1TDK5Sm45xnnLjlUC5khw89DSlQqhzU3iC6EMW2SDFWwMOlB6QBIl0gS5pCb7j8e2Ke6/XXMlvcmnrGgffvo/uNDJtIS0ixD5JaVXOwi3JCk+mCnzXkooE7y3TXcnW5ZzFUc78qObxHYVDkCsQKuCCIE1SBiNoy46u8mxv5eQ7nsXjGXv7OUfHCaflCVv7GcKc8Tu/8y+Y1bfYebGge6J4+NU5AYUsHNNszOvffosrTw94dj/j8M3HiOBBOWTQDHROCIZhvsF83rC1lTHaEizmklT6mAbuUtY2c7QQLFcNg2JIPgncu1vTlYLh5oBmUYIMqKRjcXfFaKKYP3RUD1eM8g02xhucPFkxGqV0XUtdCZSKytNgDHmRUteOtoG2DoQQVytKxapV5+jDOApE9CRZJ9BJjsoUq4WjcQ1VKWOtaJKwbDumU4kq13l49BhXC84OG6q6I+iSurZUyycsHz1Gak+qL/H4YTz1l6slwywhEZYPv/wqL954hbdv3cW6CqU8QVZc2rvG2WrB9t42iRuyrDqSzJDlHc4ZxuuW4VCTWE8+gc5ENc2Hmtms5ux0BVi6VrBcLbC2pmkr/uiPvs5bb93i53/+5/nEn/kEX/nK61TVDCFSOmNZVRWCFOMCJ8cLXnr5BR7cO+bylT10Fjg4OeXw8JS2saQ6oWtGPD4t8apCi479vWuUzYrDoyNu3zpB4jg9PmKxWLKxsUbXrbCm4/XX/4hvf+cNvLd899bb/Mr//Pf55je/hVAC7yUCRRCuv1nKiJORMtbiJTo+qJQkEPDeoGRC17mImBKGpukIIWFrc6tX4DxnM0tZxfBTlmte/dD7SdMpJyfLWMdpGo6PT1nMOqwJtG3Xh3biw6cYjRFJxqUrT/HSK6/wkU98H4vOc1LOML5idnbMaDji9HTBwdGMqjb4wAVUPPSpcnrOYUwJR1QVPZ9R9JWcURkmeiGFwPYHzu3tnCxNqOsW5zu8T7BBo5IUqXKa0lKvWkajgve8cp2PfPIlLu1vsjZc4z2vvsDHfuwVNvcnHD8+xTUO7xS7uzu8/PLTZHnHzZs3+MQnfoCqqXj08EkcRBOJEI7BMCFJo4LlXEyXE1QfzPyXVbA/rsoUuWYwUDSdiTzfyYCdvTFCEocr6L8/jrZtePDgEcvFnLbpqMp5//dzijxnkBdkWU6WDbDGo0SC7geD4D2JThgUw8g59THJHIjczz6fT5EX/aBUXaw3z7PihOgnlkL1QSL3rjcR+kE1qrZd1/UqboTKJ6kC6XAuMJms8dGPfpDBMMV0ntUqHi6cDRwfL2KRRG9Xif+uI4gSpTuC6EizQJGts1q1KBUoMs0gK/r6UYkzFVoGlARn6t4fnNDaBpV71rdzBlPFjReuopOM6eAys7OKs9MHaFJuXH+Z69c/xu989nf5zd/6x2gVQ2yDwYCdnS1c7/dbLpe0jSEIKHLJ2saI8XBIXXuqMoL5V8sFAUiLPHqAe37s6dkps7M5bduidXqBhzq/Rs49lee/71ysrU6SWFXdtR2uh/orJSBIkjTvQz3xwKWTwGgSQ3RtEwforlthXUcIEq2z/sAXh+C6jszNLIuBwDRNGQ7HiB77dH4dN03DcDhiPJ7QtR17u/t9OMszHA4v1MXRaHRRPhD9qkmvOEbv5vk1kkiFCAsyH9FPx0cPCIuS9730AV77+pdZ2x5iTIdWmixJCN6RJSmyDzkleT8kS4HkXCnt71H94Pn/JBHE+S1er9Ef3NMriASRqEDHwFcMZDUX/vlEJyRJchGccj3+63x7oHWCMZaqqns11ffXsgQUSiVUVcXW9harasnu3iWyQrGz9xQvvOcmn/3s53jj66+Bj9SkrnU447A2ILzGGk+aKuKrVeDpSRrxfTnvIaRIMSDPxiSZuHgfu/v73HzuGY5OTnnuheusVhV//Rd+8U/+oPo//oP/5DNKgXWBzd2M1Wng4I4jl4LdtQ1++9e/TpF4BlcV+dp1Hr1zgJYWrw1UIygEaZHyxmcddJp0mHBwUGJtznyVsnkp4cYLA+7fbvCuQBUVxijSUfQKhjplXQZuPLPBIFeouqF8YhjIXYb5gMn+nKu7moN7NTde/BA/8Zf/Y1774lvcu32IGrYkhQOR4BYwHkjW9xy538a1HY/bjgEedGBZK27dbnnwwDKfd4ROITAIGZBaI/pkeNd1ZFqSpwmrWYN1iqAFwlZ4NcQtLW+88WUChlfe/3Huv1UxuRS4/vx1Tp+cMj9dUUwyGm8pLDz+bkk3DCyOOm4+PWRjusn9BzOMiqe/VDlaO2Y02GG28DjjoAvIxJGlmrNFR1t5RuMU29RsXR6SZmPadkEnJS6FRngmepOTb52yLC3dSlPolpVR+HZFvYLjw5ZiVOAxID35IA4F1crhnaRpAlLEEBlAnqdY66KCqnxM86o4IAWR0BiHkwbhHXUb1ViJJx9b8ommLTN805C5mnlZkqYG20JpHdtXGibjAcXGNXavrXP38AFN3XJ4uGJ57JEB5quKm9ducvbAc//h26SZorGKbOqYLU/RuWRtNCIvGo4PKxK9YiAkZqU4mXkOjmqU1lgnSNLI5NNqiNYwHKW0raFpa4qBxvtYnzqeJCwWJfduLfnDP/gGs8XjfnVWo2RGlkdPb1MbmtpyNntCZ1dU1ZK6bVhVdQRMy4xVteRgPkeEwGLR8mM/+hOsqsDh8SmPHz/i6PAx9eoEF2qG+TqrRcNkmhEpLo7xeIQUluBbBoVACtczTx1SeKSXBGt7T5rCO0vbxhWe1rK/YSryrMD7QJJKglcURc7N57fIC0ldS1Z1hQ0NZb1kZ2cdKTTra9fY3L7Mg0cPOTs7I0k9OnOMRhOKfIix53iaBqkCJnR0pkY5xf7lK+iNgoP6jKcuXWe9WOONL32VkZTsra3z5MEjzk7OcKajqVdY212s5Jz36ET3LEiBVuqPgarjui8mzz2JTkkzhZChX1umPPPMM1gDJ6cR9N11Fmss48mQS09vc/n6BvtX1xmOBhweLFidep5/z8tsXpry5Mkxki02Nq7Q1HNmZ4dMpgWTtYT79x5QrzJGxdPcvX3EbPWYtU1H13iW8/PkvuK8cQj6WmIZ0EksOjh/yJ0HLdama2R9krrrfD+sxNrU6XiXNBmxXCx75Ty2xRnrWN/YZDwecXwcA1VtHQe9qmzwnr4yM4aptATRK0Cuf1iazlyEiM7HS2OjItO2USWuqgr/f1P3Zr+WpWl61++b1rSHM5+IODFUzlVZmVmVVd3tpt3GchnL2BgPiKZBQjKWumXA2HABksWFRYHEJVzABQIhuMJgyUhICBojQEa2bNOmu3rI7srMzsqIjDnOtMc1fhMX39onsiX+gPa5SkVERpyz99prvd/zPs/v8QElRFphqvRwhaRa7VTZ1LVukGN9pR9rKHdDC3BjcXBuQAiHd4FMV7zzzptUE8V6veHVqwVlUZEXgjt3TyhKw3q9SjWlJJLI0Esys0eRV9QbS98HpOyxdhwE6FBSYQeH1G4c8CHLJaenh5hC872fO+X+WzmrdUtRTfBBsLqCdn3NcvOE4/0Dvv3eO/zDf/QP+dVf+xFDGDi9VfLwi0cpYOs8zRbs4Gma1WtKg3bIqNksHetVw9AHzs7uIPTAar0ZB5tUz1oWU8oqo216mm5A65TK3vFPd4pkVVXArp52DBeO15i1yS6T1rjgXJf80CJPwSabajKVdpzcnuGdZ3Hdkmc5gXQoVLJEoJAqqaQpeJVW3K99yIa8LKnrOkHvjeHq6oosy1itVlhrRxrAlqura7zftW3tVu2p+rRtmpvwknNu9NkK2ralKAqE93RhYJblnLcbvNIclAdMj45pV1vO3j5ksViksg+VWL8xePK8SAfbPEcqhXcOreTNZ2CHi/LeU1XVzQFASnlDqtjB8HcVrQl5lQ77cVS4kRI1rvn9GBbchad2Q7H3KXmffi2F2KbTCX0/MIxV3umM7bFDh5KJF1xvt7x8dU5ZTJnOp3z5+Dd5+uwpZZHx5PF1OoSLdB1riuRtjpogG0CQ5wUiRhCR6BUhmJEJ7tFKIGVH4wZOTu4xmWes1y1XiysikcE53nznAX/xX/qlP/iD6n/1t374wyAChpLtVc8XvwlFUIQuUJ7uUZQB2TmuHw3UjSE7kCzOOyo5o2eLsBnf/JmSV+sLHv+W5/6tBzR6w6LpcX3No388cPEc3nx3n9l8hvUbpPZ0vURmMJkJtp8bNheKo1t7vPq9BoVh6yzvPPiIf/pPfIMvPnvF5mLCl599wv/83/8trB0o95ISUxjQsuVyAf/iv/pnySvFxdWavDwmCyWrlcOHgvqqgwtFKEa8RhkQiWmPyQKZ1gjvkEi8F6jcIjPQAjIRWHeBoV8x0RV/5E/+FLV/hd+uiHbCxdOXXH5xzQ/+uZ/h2dNXmFVNdI5aKCoFq60jSs+f+Wd/wO/++JrLq4Y3Twxvnwy8WAmmkz0ePDijiy3tZkP0giZYhFUUk8R1Q0SE1ixe9eQ6sndPshUWYSNVKfDWo8noznukcAQNBIcpciZFj4qRTGeoORRK0COxHkwusV1kOoPB5gQCegQVW5lUktT5neoPtZIQHVKl/1YUTKTHlZKD0lPOMnKjiE7iV4piJukHjRVQ5gV6uSGXGrk/pchuYYqM1dWG6WTO/nRCoQLtEJGy5PrpU24dL3nv7TNW3SGideRV5PFXBuUU2cEaN9Ts7RXszzVFeYCLgaHzYAvaruf4/jGqLOmHQLAegaTzkdYGhE8G/ywfu6EHi8CDrLFuhXO7h3kcawJTw1cIkTtnJzg3kOWaoe+ZFhMybdBasH98gPUD05mnnMVUGlBXPHz4ivV6wbff/x4nJ3fYP9qj7lZYP+C8o64blosWPxg2mybVHKKJ0dB0lqbrcT55hv2OnYIYeYESRGLkBg/z2R4xpqCEjwPGwNndE6oq4/Kqpu8Fs705eV6QCUXf9dx58AaqyLFdw5effcF6uULItHo0KqNr7KgiJfC+lJFMGRQK21uqyYwsL3jx+AkvvnrFdjOwud7w5hunnNyZcbm6pu0bvI84Z1GakbGZUsoISWZKtCpQOuHOkqczecaliNw6PaYoMpqmRamCLNNoExhsy5c/ecr19WK0BAjyQqFUxnbTslwusV4yPz7g5M4x3bbn4Y+/ZLOpufvBezx45z4XXzzn6cMF9bKha1ccHB/wwUff5sG7c/JZCwIeffWUZ09fgJ/yxhvvcXg0Z7la0dYDeZZhlKTMKw73TnCDu0nK74IXuxRw3/e44JNKHh1GKzKTkDVdM7BYvEyDeJSjt82PGKSS+XxOJLDd1uS5IkbL0LcQPW23xbqGYWjph3RwyrP85uFsnSXPcmD0EtrkyVNSIkQK34kk/iKVpigmhJg8bin0k+HGgWTHltylw/cOj9CFJtCitSQz2YgVShghYoYZ1TSlJINtePjwFdttj3Weph0IXtC2A3XdItU4bPjkn98NOM4lO08kBQaVimN9qMPH5BFOSqOmLCtUXoBynN19k4vLBpMnBu75szV+GFITVd2Ta8PzxxeURlMWgYvLz4lyRb3t6dqINgV1s8CFtMKVUmOdHC1TEkFOnk/JTEGMnuvLa6KIGGUoixKiZxg6yqqkrIpxY+Vw3mKtpe1adhWdVVURYwpJChmQItU2O+vHEFha3Vsb8U5RTXMevF2QTVZcL1YIBEcHd2nqhouLNXmu0WbniU5/hw/ptfLepVYjv7unxBsLQNcMrNdLZtMpEFivV1g73ByEtTYpnIckz0um0/nYutem1rJgyfOSutmMBIc0RDZNqqUuipw+WGKAfFJR6hwVItZbVosrjDF0G5fseDHyrW9/k8EPqWKYSPQR26dSlaqoRi60RypJVhZEITAyERZiACnAOz++zmK0YkSsTfYoYyRaCYhhtEYonB2tBgHyLKeaTGi7LtEujCaGyGw2v2lbk1KPB1I9UjL86NmO45YrYoqSW7dv4x3cu7fPl188Ji8liBSm1CZjPpswNI563RNc2px5nyxFImQQJW0zoDONkIrBDkhlcKP9JAQ7Pr8j63ZA+ZyyqnD9hkWzYXHekZlj/uov/+U/+IPqf/q3/8Mf5lKjguLioUAOPSFmWNFjvMcUisurNaaYsVyv+Nb7Z9QbR9Mm1MHViy3z4wl71W2++uwSsEwOZlgHhICZBvou5/oyZzorMMpTb2r2JhlH+1OGc4dYZXRdj5pZJrNAXgTyecem2XD9FNZXC+pFy9FRThg6ZlUkL2rWF2BmnrLKubrsubrecv5qTWuf8+bbt8izCXa1oaxKJvuW2UkACWEQDE1kUlWgAqur1LDjnaco5vjQJoxPZgjKghbs70+4f7qPaxc8+3Jg7/QWkwfXHJkr2vWEuCnobI2qjokXnsPC0peKIAeE8HRbwWz/PkN2Se+WFKXBlHu8PI/8sT/5x+mblqifsVxvEDFPHDySx7AsSrTO2Wy2TCcVQ2+JmcfnETt45tMKu8mgd1QTiFEjyGm2KYSUF3P0IcR5Qx8Ctg3kWWofMkTqAUIsiXFAFSlJKZxAWYWPIfmerEPrlHbWRqDkaOGQcOU8RhraTjOZGGZHATUXnH/qubzQXL1sCL3geBr4xn3Ho59YfAzcf+s+VXWPg+qExfkSpaec3jsiMrBabIl6y9ndj/n0swavlvzyH/7TPDgfuPuzb7O42rBpPN7lnNwWbBaeixd1wqb0Pd3QEwLsHRzS1h7rLPP5BKyivWoJXWp18l7SNA0Rhzapv3x/75Ck5DREBpROSs1kMkFrycHBnM1mzXK5petaTo/ucHx0gPee1aql67rUYiOSuuAdNN0ls30Y+sh3v/t9TOH44osv2S57PvrgY+7fu8v3vvcRB0d7VPMJH/3091FlldZiwHCTxBU3K3+lX6evd3gWNSowu9pEKRgbWZLC0bYDXTfgQ6rn7LtA2zQcHe+xd1Txznv3qDdLlosVWhmUgulkgjFFGmjUCAuPARElNg54epTWEATNZkPsB+g7ihDZmyuaesmPf/sRr56/wIcFdgjEkKP0WN0oDNooqipHaUGMjhgiQ5fad3bBn5Tg3SF31MjpjKnbXZnUP4/Ax+RxnVRTzu6fog20q4bYg28Md2/d4dsf3QHT8OxiweJyzVQb3n3/Lb71/nvcv/2AetjQDA2xP+DzTxd88XvPePSTlwy94/adWxid0zaWofNjZahj6BJzuJhEBt+z3rQ3UHw/9r2/VnTsDWYojnWv3juk6kF0hGDHYSDB9gWpYa7vB5qmpu/TUBN3KWu4WVVaNzCZTDg9PaVtW7q2Q2vDMFisdXjnyUw2HgBS6AQYLQmMTMnX/eu7r93adNcQlMgSEe9i+ntMie2SWgSavgsIpYkitRj1Q4fJQQnFxcWa66sVV1cr9NiU0/f9jT/zpgZ0tC3slEbnHIjXeCExeme9A+8FWhXMpvvJAykDbT+wbbbM5lNCMBgjWa1ekKk5oZ/i+4x5dcxHH3/A3v4xv/u7nzI7yBn6yMX5NcvLga6JRAacdWR6itZqtNik5p/gIVOpfGNaTblz+xYvnj+jmlTU2xpIFpemadJQNXpEw1iDOp/P00DWdyiRhhxrLW3bYoy6GSB3K3rnPWdnd6nKaVIay4C3EwSOu+80XL+c8e4771E3Sy4u12SZoihSK1jbdsQQx+swWWl2AaKdj/P1FkMQxpKHYRho225M7pfkeVJv8zwnz5JdZBgGDg72E0nCpTa6Ii/RWpMX2Y0NIMbIbDa7uU+F8QC3+z4Sq1Sy2Wyxtme7WTMpK6rJBARcX1+nWuKQwl5KpU2XUrtDE6lBzweKsgQfR1tRuo8kxmhqDJNK4l0q6rhZnft0j8myDCkUchdEjSlQ9ZrBmlqfANq2HTcLqdlqVyjQNA1aq4S+gtHXqomkQTjLcl49X1BNpvR2ICtSZW9mkqWgbbepYMVZskwnVnZIB4m261BaUU0mOGfxweF8n95T78iyIjG228RR7uMW23u8CBiVkxeWy6dX/I1//58APNV/9t/+Rz9sa09vA/szxfrJFB9D6krOYkrbasVq2+M7aOo1Op+y2tYo4cBHpKy4Pu9oNx1ucKxXWybTiv35DBemOF8TCZTGIGzkjbcO6GuBb4+4euzIJ1ve+ynFdTPQE9g7gTxLb2TNFfu3C1RhaH1HdRgxU4WZaUSWsXdQsV7V6BzadoMPLeXUs22uaPpznOvZXgvaTUSWAUFA5SkoJWVgehxZXDgyE8irVCmp80i9Sck4IyNaRbqtZutr/uW/9gZDXPL5b7zk018deFZHjmeCy42iOtzjo8v/DgAAIABJREFUvduKlw9fMQRwnWfpIAsTpPS8rB9iWdEsNCGUXG9bTm/dYv/kFs8ef8Fy8Yrp/oSLZz1HRzl7R4bNOqWUs8wQCEjt6PtINgMKj1Aa0ZfULwXOOspSo43F2hbFEVF4zEGNmvZ0EaoCTo9ndOuBvIDBQ+dKfOzIEPRt6oIupwDpMOJD2GHrEIA2cgxoZAzOMgs5QQyo3GM7z6Q6JO/g6RcW2w1MtabZ9tx503K+mnH65hnH1T627hHTGVJq6u0l6+018/1D+r4mzxxRar74vZd8+/27vH1vj3/wK/8ne87TZBM++fQJxEi97VktBNVEkpc9y8tAcKBVQZEVeOmJcSDTOSov2WzXfOvdDzg6OOPV4mpcUabTtXMJlSSVoOu26QErU4Asy3K01sxmM66vr6m37c2DwxjN6eEDrq8XfP/732M6PeDy6jneCoYeul5jrcY7ODq8w1ePXvHVV18SgaPTu8z2j1Cm5P33v8fh0R1+4zd+ixfPn0EIrJYLrpeLlA4eod+7Yefrq2QYgwExIlQCYIdx5auUgSBZLTd4DwRB11m0MfjYoTUIqSmKOddXax4/fIqzlunccHrrFpkpaJp2bGNJ9bp2sHgX+PCtb/HTH36HGCKb7YaoIy4GDg4PODo4oW8C15dXSNFRbzZ0TcBZwzA4EAPgR9WvSApRn653Oz5o0nCX2JB9P9B2PV3fj/ieflRBNCKKkXsrEmTfpEDUYrGmbhucD0itmOwXFHsZpqw4vnOXe/dPOT3NCb2m0Hf4Y3/8z/DhRx/y7Nnv8ukXv86XDx/z0Qff5Gf/0MdcXWyYlKdU5ZTLiwuePXnJalkTRURqT4iOo9MpD97aA+XobeJPpqammMD+pKYcM9YdhjBgsgT4T5WbFoGkKGbMJtOEsRm5kLvgTEKEWYzWaG3GoEe6Pk1mRqVTMJvNCT4m9elryWep0rCz85fqLBvVOXezukwUBsYUdRh/3xK+NjSmO0QEGQh+YBhapAwUuUZqxWAt3dBDSKG4/f09bt3Zo24ari42bLf1OGQYtFbsoPfpQJQOYPJrKe3dNb7z+aaUuSAiMblHZwKkoOkakJ7JXDGdK6RULK5XnL9a0HY1p6eHnD/pyWTFndMzts01MZbcf+eEj/7QMZ/89ucsr7fIWLF/kHHnwYz1qkEKjfUtPqSDSXACSUGq+03Bsu1mw3a7oaqqGyD+DYpqDEAprUbPo705GFjrkhUszzE60SS+vo7ftVZprZjNZ6xWK1bLFUCq9JRbrB148pNAkU9Yb9ZcXq6QChw9IcLgXNq8jUNYJCBlOmjALrGu2OX+lDLsWLi79977MPqgC7quI4Rw8z62XYMdhnSIEgnu3zRNeh1E8ocaYzg+Pr7BYPkxwLcLazlnRyVTjkHRyGQyGd/7wKuXr7DDyJSWAqHkDb3Au3R4Kcoiva5CjZuCMbw1zt83wcZxyI1hPKQBbrSSeJ+G1909dhfuvBEApMS59OecszfNWzsu684Xm0gKw839OjGVLSKKRChp60SjKByBgabpETKpt/W2H8knciQrDOl+EvzN6wOBqDzKKAbrIESKIl171ll8sERrUNri8QyXLZO9gmhTE2HwHX/jr//wD/6g+t/81//xD/M9iao85b5j73bBq5drfKspJ4IsL7B+S4yeYBVDD8vVBiEjSnoQkfWiZbOoRwO4wPaBrm7Z399jfnRIXgVC7Fmc9/gg+IVf/AU++eQCLy137h8h97dsbEOUGjXLMUIhoqNuExdydTUgVcf+oWa7nKPznryEQIvzEu8ypPbk00AMEikzlIF8FsimAjcMECU2dxzmKUgkZUUXJItrByGjrR2zuUqhE5PM8QCB9ICospSU/s3fWtMucj58/4DBZqwWgnq74Oh2zrMXzzi6+xHvvXvCxU8ec+5k2sZuunT6U1PqC00uC6LYsF5Z/ugPfsDnX3zG1fkTtJKc3X6bjz58n+dPX6F0YLnsEwONHikqlPIElxN1z2x/n6g0NJLuegMh0jSpk/3oyEBUTL6xjz48ocwCcuLIFLhoaSN4kwEe16cUo5CGv/QXf4G2r9l0DdnU0271GJAAQrpZhhioigKtJnz/m9/jwAeW647gIcrA+Zc9l59nhNCiKosJHj0xOJuzXbTMZwUxFrwSFicC59evIFimU8lXX10go+T73/0Gz5+16Fwxl1Om+QnHH7zDrz7/kkWzYv/+Kav6Emct66tI10j29iqqYoZRVQofCIeKhrncQ/SRvekE5yLlZI+u37BaXUH04w1l7G82AufbpHgJiZT6xm/nvWfow9cQXlBVOdYGHj56xP7+AT5ELi7ORwU6x7sUgGjqhp/9uZ/mT/3pf4btZsvDnzwhzya8/a1vMpmXfPrjz/jff+X/4ke/8Vt0/ZbtZknfNYSxtzoZ5/l9rL+vP7x3UO1d2t86l+wARGzf46xDK41zAecCJktNY3bkl+7tHWJ7z5PHT5JqKTXTsmKwgaurS5zvKAuDQNA2if0pZCQ/OqJVhovrS6K1aA+Hszm3Ts949NUzXrx8SZ5VdG2H9w6tS0ChTAp/RdLDpe87pEiBuhA9EFOLkZJjaMenIWtExTjnmUwmfPe732U2mVLXS6SMBB9To0z0iChQAqqsQMsMF3rWqxVd7Tg6uEMh5qnNSXSgIrnRBJHz5Yuv+OrR32Nx/Yr9vXf4xX/hl7h755s8fvyI5fqC58+f44PnG2+ecXbvFsPg2G62CCGZzmYoPeXyfJPUZ6lp6pFHKnf6CzeJeKU0AkPEIZWlKEoKvUfwgqZucdZjzI6/2qe1odYoyaiii3HIGxu9hBiZj2kAqZuEl9op0alNS0FMDz7r/OjRl3hnMSapX0pHqipL37NIg+ZODUsw9TBej2astE0Pz8OTQ/YPD7A+sFrXBC8wKidGmM9n+GDHWmdBUeVEkTYZznn6vmen5O3+na9/pWtejio7N6vVokhBnelsj5Pbhv0TT9c7mg0I4VONcV4igCqv6LYCEQzf/c57XF1c8OzZU/KJRcuK54+3LK42ZCqj7beE4MjyQN878kKnIhQrIWiqskIIKMtiLC1IKmXf9zchOKVMSn4XBbsa1OQrT+q01oa27fDOY0xOUebozOCtvQlUCZHS48meNKSWqxjJsoyTk2P+yB/9kDff39JsJNeXAzF63nhP8+CdnuePLVmRkRqxBkCOhyKB88mX/PWgUeKQhvE9ToPV7n03xtyk+1/jrNyobEaEiAxDT9e1iJ0liXTg6doOqRJd4vLyIlkaxkPI3v7ejUK++2wku9X4vYikRNbbhqoo8WNFr1QapEAJPQ7UIIUkBoEQaSuw4whbl7ZRu+1GFIy+1AEl1Q2OSyk11h+PQa3xz3+9NCAN9K8DcIJkyxCjZ8YYTZ7nyfrg/c02ZVeukbBZyRJmrWN+mPONtw5ZbK7ZbDvatqdpevo2hVUjjP7WdP3HEJlOJglTKCIIzdAP3Lt/OwUWbY+1ASUleV7hveGNt47Y39vjp7/zIb/96084vC1ph5Z33/kmf+WX/uof/EH1v/gf/oMfCgVKCmyMlKeRQh2xeFoznUyIIg2kWjI2nMC0KEe1I6JVhhQS533qMo8OJQQBQVnNEFWAWDCb7WP0PoNbc3m1RGWG++/u0foLVt0W21YIFJt6ixaReb7Hpu0IveDF48DxoeDkNGM2kxQmx/YDCk2UBV5s8S4FgrouUG8FQ6+ZTCR7dyuODgYODwV7Z5LloidmOc3WcvHCsllkTCYKokeKiNYFCeib1mh9l+F8wEiJVgERNF/8Y8uP/u+Ob//U9zk8zmm3jmg0t8wxv/l3PuNi3WNNxna5Yj47wEiDCxU+tmRCYExBiBmnhye8860P+O1f+3scHue8elGzufZcr65YrrZMiinrbcOdW0cMrhlZtxrvB45OC3wsyAtPc9FgIjgXqKYFXT3gbYGnI5tWdO0hw+MrXBuoXwjmZYkoLRMK8sFwmEdUCUwtw3ZCW0ea4ZLpJNBuIj6MPjetEDKQZ0kd9NbxnW+9i2xPWCwCsbHU1z1VMYE4EAaF8IJ/6lslZ7dnGAz7RYdzDZ3VfP7lBf1GcPvsgHrV8uKrdAOb7s/YNCsGJzBS8vLhIyDjD//Mx/yjTz6lrA5YXVmGtkXKhONomi7RCXJJ8IG9vQypJYIJUuUIFWi7mt57nl1fcrW9Yn+/hBjpe4sbLAiBNqmJKq1kScxNrWBMpTvrUFpS5BngWK8b+r4jiIG2b3n81XMuLxfpAR6GdEp3gem0Ym9+wHx6m9/53U/49nduk5fw+CeP+eLzT6i3V+QF6HwgiJYoIkGkh2H2taDFjrNYVRVd192wC3cw65FGMj500s8ipEQbc9Nz7ZxjNq2YzaapblFE6nrLZr0i+j6tVNE0TU+9SRw+JSHGNOyenJwiSb/W1zUXz1/iB0c3WCb7B+yfniBMhsok1rf0tsGYgrYbaNo13g/jDV4RQxpGy0qTZeB98nkpocakqwOxQ+ior/2syVf25PEzzs/PyXJBZhIVQcmcSGI8ZnlOXiiCt8iQozB0bcvlyytevbpAyFRnenI2Zf94wssXjzlfPGRw1wxbw/7kDX70a7/N3/yb/x0vzx/R9WskCudSi9t0z1DuBbrBYZ3n5OQ2k+KYq/MFfV+TQmCj6XNM1subsEeyPjgXKcoSbRRdGzE6R6q09htsqjkOo4dXKzOqnJ5ICqCZTGNMRts29H1qNfLO0bYdRptxKyDGcEkYAx6WIECPw4fzLqF+ZALxK/X6HijEa37k7qF7A0snKdhIKPYqLB6ZqbHSt6UsCrJMcng0wVpP1w20Tc/Qu69du34MrrhRYUyvzS5lvlOjvq7mGm3GwUEihMaFNctly3adKkXzLCd4g7MSERO9xHmfCia6SJ4PeN/w5MkXidcK/N7vPmWoA8dHEy4uVrgYqOZTtqvkgbWDgFAxmVRok7YAQsZUzuJcsuLolLJv2yROpIFU3GCmYky+xq9bGTJTjDzaXV+8JY7oqDTwpIFESMF0OqHrujFB7+mHnqGLrK4tn//OkqIsEELSNi3nLzXOpYG+bXp8D6cnp0yq6c1K2pgkRAS/s9SImyE6rZjlzQD39aEtvW+RySTdR5qm4eT4CO8t9+7dJUZPs92kUKgUlGVF8I71Zp3qWd14vY3sVj2m7Pu+x5jX4bJhGAjeJ1yXSMqiyTJ6Z3HB3wzJMSaMWmbMeOCJBJdsBbsD4e4a3v37zrpREXU3h/7d9aa1Hn3zaVMjeF3tnMpIXNrgjKUKeZ7foPWMyW7wb2kzkOwIO9VdyoQKlEKijebO2QOiCFxfr1FqwnQ6vVFvbdcn648Qybng/M1BxxgNMTKblSgpuL5cIqNB67FeOjgOD2cwBJbtJbad8pf+jX+FH//4Uy7Xa0oj2Zsc8Vd++Z+AQfVv/t3/8YfbZUuQPeW+5Kv/V7J6siY3mn7ryCcWgcJbSYjpjdM6DSpKRkIU+DC2roTko0JElPIIAvnBGds6reaVUQgxcH21oO0u+PzHD7GtZTIxuHZNaEHrPbRuWF0PhJjTdYHDW4HjuxltBzJrQGhk4ZBG0vQ101mB1EVaZQ+CvnN4G7k+98wLwdvvzSmOGyYnAh8FXe05OjRo6VkvYW9f8uFHZ7x8ucJkgHBkeUYUHhUF1TQpq/WgyCaSo5OBV19aSgRvfvM9lqtLrpYrtv1ANt9Q7LV88PGcx5+1tE3ETAJRagqTwjgmz2h7y7QyXC+3dNuXCBOot5rtumGx7SkrxXwyR+p0iOiaAWEsdjAUVaDIFM+erphPDbGbEB20TZfaXKSn3lpiVNSbmqvra+K6wfaG1cojhaea5/TXLZnVbF6CrjTFgeP5TxYcz44oJuk13G4ttichd4zFFJHgUg2isz17h2fMqzPaxUMG25J3A74TzCpQWeBbd0E7yXU85IVtOTopsL0GldFZxdXTCwgtWkQWFw1FbpgeFKh8j7zQvPd+yf239/jid55iX33C3p7H+i2uP2deAaLEh4GT4yPO7u/TDwNN7fmZn3sT2+UIB9U0o8wr3rz9DfYKQ6EiRmX4HvreYcd61SLLMCZLKz47EIJDGzBaJqVdKKoyw8eeLFejl6ikmhik0rStxZg07IaY+r210kipOTu7y9Onj/mNH33CZrPl7O4Zzx6vuX3rNnmRMFlSRiYzlXiTzqDIxiT/69UhJFXVmIxt3ZAqFdXXrACgtSIzBjXinHaqT/L8BbRRuBiwbkCbwO07hyAEXdMhYgqupLVYwGjGdROpxlRr8kzdrN67tkOQHqq3bh0xnRQ8+eopd26f8v633sWYitO7Ei9qNusOIcWIRPLjQ8Lj/UCWyVGBNBAEQz9w5+yU+XzOYP3Ng16IHb5nrCiUelR3w4jaSWn/ELgZEJrW0juHF5Z8kkIlAUdeauZHM6b7mqaruXjVYPuWvcOM5WLLlz9+yLOvHrFavyIrBpQCoiYvNLM9jc4Ee/v7CJFxdblF6ci2XhNcx8npFDs4utqiRv5lJFkzpEwP/RBDuqeOr9/JyRHHx0cUFUznOUYXaJWhdWImxsCoJqVDyM67mGUJMO7s678rBSDNjYfVmGz0tyYvXYLxJ7HBucDQdxgtMEaQFwm15YMj+EjwjOnp9O+loJK6WdUKAdWs4uj0gNlhavLRCu6cHtK1Lc5CZnKauh1ZrDu+qks0ivE1SXir1+zLr6/4d+zZXUo73tTtBrq+JoYEs8/ygm6r6BpFlmlcqLE96bA3IgjzIpKVLavlkjwX6V4fNZmacXx4G2Jk255zcueI99//Hu16zdB7lCrS6+J7tNEJedWngKH3Aes8LgS6vkePg1EI8SapD4K8yMcgjh+vUYk2Cu9CQrERcP0wrppfY6raNiXnd+n15BNOFI/l1YYXz2p0PmLERFKUQ0jNZk3TIKNkNpuTZwUJ1N+lw06IN/YUY7KbQTUNowl393XWalEUv29g3R2Wg/M0dc10NhnVz3UiCiiJ9Y7B9uyYz7twrlTJ77yzeezubVpr6rqm67qbg/mu4coHnzzNOn3uQ0wlJjE4hIwMfQekYU4bTZZpgoO+G9Amhb/sTXUqgLjZ2mitbw4GNwg5XoP9d0pzopRAnhe/T/Xu+548z9Phpe/Z1QqnITX9PyFEhsGN712Fd567997h0aMn+JjQY8R0z05BxHRYMFKNW5hIlmls3zOfzwg+MPSC6MdhnXDzfCDAMHgOj0/ow8CkgF/5lX+A75eoScCIKXk+56/95X/rD/6g+n/86ic/9DHQxRfMM1j/BIZVIK80gwUpB6TOiDGDkGonmz6dxkRM3dJRJNZmcDKl02RgOs3BO+rWU2YZea4TyJ6MvoW9vT0Ojwt0BOs3nB7fpuvXRGVZr5O6eX0RODzUzKsjHn02MK0ylNBgarQKKCXQOmJdxNmBalJA9FRlQDhFXwemq5z8uKc4UxzuzQktdOeR3lqKg5JuHem2lhhXCJFWcMqAwKekoQr4PiJJNWjOCvK5oW806+cLfvT3v+Dg+AF37x9QbxegGy7agaX17B1VrB9vCSIm/0zfU1QFHkfwW7Qsubh4SaElqBnb7ZqzN8+49/YZl88WNF1NWVRcXSzJswqpkqJJ9Gw2HUZPmasJq2XL4dE+xEiRlQidDgtVVTLLSlSAYiKZTxxSBkKvUT7DLjzBR0R5iwfvvkvbLTBG8PKxpW9KTDVQmAznUve3j370M4JWEkHkww++RzMoLj/9lEUIFGVPFUsGnVHqCU9XFZ2Z8MXVC7YS6lDy/HqgFwWtH5C+J9iB+X5B3XYEB0RH2wzICL3t2OiWftMzrfZwpqfd9gQ54fY3Cpq6Zug1NnRsNwPOSga/pm3A9QKV56ho2K+mGBGTX9A4dAnLTZ/q/XbexpD8cc6l6julNFleUDc9wQkG68iLHKkkbnz45FlI1z6B4HLyInJ2N8N2Bq2zETbf0fcpHKGNQCnB+fkr2m5DO9Q0fYOSJX2f/KXCS3CGIjPYsRVo98BOHMOefhjQRo8p2tenfSkYfU3JU4VMQP10800K1q7lpu97YoDBe9brLSJAmSlidPjRt+VH1SLPS7TKaJuO5XJNjHD79h0m1ZSf/yM/z5/983+eD7/7AW+89QYXr654751vUumcX//Rr9L0C/rW0zRDWveHVKghhCDPDXmeHvhd4wg2qRVZZnjw4D5FOUHrhM9Jq7RwA9YWo2c3hoizMfkz86RkEBJn0A89KkJVTtEy4+z2MblRDK3ljTePmc4z2i7QbBsYHNZGHn15zvlXF9h2TcCRPv274ShtlW7dusc3HrzLdtvx6OFXDMOWsgzkhaecRqROB52hTyv4oizSMOLSw2YY0s8ikBBS8v/W7WPeePuU2b7m7OxNFheRxXJFnlonsTYwDCFVM1pLVU64dfsWSiVY/W69mXrZTfLbjddNKksIZCbDjOBy5yxKpnIPMSrUiDEc5nbcTUcMr9fsX2+euoGj24izgbIsKbKKZt2CDRiVUa9bnIfgk82j67tRNU3FCmWZM5/vJ1UWeePF3H1JIchMaiqTQpLlGWWZFKN+SMPAg/v3AEnTbShykCrVtPZdj4x5elahUyI8ekLsmc4qpPKYTOLjQDmRoHLqdsN6e05Z5ty6rbh8dc2LZxfJ78sWIQfqJhCDxrkeIeJNwCbLMiRqrM8MBO9ufn3HBk4BtTSs7JQ751zC542e3J2alixXDudSoUeMkbbp6NqOLMuZTKpx3e6oJtW4hk/ZgcxkhDFgqVUaXMqyGj83vF5DZ9kY1hM3ftTdQHZjTRGCHed4FyhyzrHZjHWezpFlGdPphKZuWVxfkRcKo8DaNv1MiJF9nA5sbrSPTCezUfX8/Vam3WtDBG8T/q2sCmxISmwKDlkIYPtUtHFycojAY0yGs2EMBaZDAMSbEGraLI0BwDwp0MNgMSYjy8q0dRocglSsIMTOu5s2GzsqQ55nxAjbep2eidqM92hBUaQP7c7i0/cDSiVW6w7fdnJyivOeoipAKJy3yeKnoKxy+q4lRhAq5USU3oW6Ai6M5IcQUVLgbApyziYHDL1j6G2inuiIqUouri7Zm9zipz9+k288OObzz66YnwSk2OPf+df/CVBU/5P/8j//4e07b+EWnu2TJUbP2LQtwXlENLhaoGeGIAekt/he4bRPQ0uAKARZPsXaDg04J0AmVaevI+0itSm0dct0PqHtW6Lw4GfIYkE5hbqNXCwuEVoRlUgp5WFgXkG0E9YLwyQraTYwP9wymxum84yhz1I6uM0oKsXyemBoCk5vCWR07E9L6tqSTwLXjwL2ZUaYRZaNJSs0ORIpHUMbqaZAkKgsIKRCSEHflGhjk6VBKaKwqBjR48+/PVdkwbO63vCdj38KW6TT1OFsQuiOePXblqwLCK0Q3qUwRCYxlBjhGYLn6NbAy2eO6eQOtpcc3a+o9gue/+QFe7c0We7wziFUhykEp/ccvg88+MY+iECzWKLyjFevtiNqpibLZgRKijyAzvCiZy3AWIOz0FvP9z7+CBcUuJaz798i5Lc4v7gk5HvUjWfzqkfHA6xtgZSQhCwlKYuk6LRbwby6T/QFv/Y7n+AwhDBnGw290myXG7yOVAcT7tw6Zb3oqRcOv/H0zRKCIghNpg29dUSdU5iKelnTrDaEPlDEimevrjnYz3ny2TV3zh6go+er50vqlaPZCKQ0CN0xeEvXKaqypF5JJDnBK06ngrmo6Tct29azri1XizV1V6fB3QukyBAxWUBitGOCU9J2aTgAyXQ2p+8DwxBp2i5xgIcEY3cu0NaBLB+YTWFxZWmaDiEMs7lg70CRlzmr5ZYPP/iYH/zgBzx+9JR6c02ZG7QsGFzE+hapDYMLbLrVTbL669D4ECLVZIKQCmdH2HRMayjJ66CLGHEocuzCvhnsBIAc1TKJHBmZmdTEEWaOVInaofN0OhcxJbwtOJsOmvfunfHh9z9gfnDMwd4Bf//v/gP+p7/9v9J2jnsP3qKLA0+ePOT6vKZr0qA59CnUo9RrlcbagEBhTA4EjFFMJ1Nevbji+bMXbDdburZNw7dOA85O7RAyhVGIaTDNy4TN8l4ihMJJT+tjUvFcS7tpOTo65eBsDhPD3uEdpBPU1zX1ekvnetra0a9qJBGkwbs4hulMClA4T9O25EWJGwKLxSVaC0Axnc7xQ4aWMw4PT1gu6xSSyTKstTfK2k3fOAKldRr2BsPprTP2D+e8fLFk22zYP1BMq0niVdYtITD2uoNUiumkYjIpGQZL1yVwvlZ6TBmnrnNGxFxelnRDOuTshv7oU+94nhuKwozqb6JfDL1P9owxiLXz4O2Gil19ZJFr8iyjqzfgPRqFBIauxVmL8/24eetQOiCiQYicGCTTyZSIZ7ttbpS23SFLjrVa1qbDmtJpUO26/sbPmLBlnmFocS7inRjLA1KwBDwxeAQGhE9e3z61TN1/c8bQO1bXmtn+Me99dJdstuHZ4w2zyQScYPEyZQOCtzgbaTtPURmm05LZdE6W5bRtw/7+QfL82rS2z/MMrVJ4qKwmzGZT+r6naRuEVDf+Rq01amQG717XLMuSato0MELdd9aepPolNjKRcS0MPqZrw3s75kcM2gSCT9dYluVsNquReyvQKtXmNm2qOE3K7+593Smq6S4ym00pipKu61mvN1hrmUwmzOdzDo8OUWP18eHhETEGvBvQMuLDkNoChca6YQzoKYRM96Pko/ZpDT5uhPo+MZp34SRr06FJaYWPnum0Yhj69H2S/MpaT4GIMQnP1zapedE7kVBhIZDlX7OvhEAInizLR+8wEJMlT0mFVtnN9a5k+mzA68phIVK4tmlaVqstf+7P/RmWyxXL1YI8K8ZAmGcyqcaNw67I4bWNZTKZjAO0oPdbiBk2tLi4HEstBIeHibnbNJZymugJO8tXEoNThW637m/uI23bpuFaihQkkzLNN4UGI/kL//zSjRziAAAgAElEQVSfwinPb/7od5BGE7uBf+/f/ut/IAZVseu0/f/7mnzzID64e496rSnsl2w2W4q+wgaL9Z7eCuaHGSF2iCjp+wSODiFglESKDKki26YniEh7lfEXfnGPf+3f/DartsY4yezwhL/x737Kjz654NbbR+g8Ipmj8wtsXCJEYOjceKoHZSTtxrB/JFi/zNH9QBErqoOW6u4W1RkO3zZMJg1PHgu2i0gUYCqD62f8iR/8PP/b3/l/mJ1d4m2OjAO59ugThes8koIXn2X8/J8qeProil//x577d3OyXOFMkywEW3j8peTsbjLA4yuEGBBZxEvLtICHv25YPwmIGPjuH/1pbn1wn+X1mvPnX1AVgXYZaS9aFq/WZChiBpaACAqdKZxIq5Fm0xFtifcRoQfyIh8VvYEqlwg5oNjD+g1ZnlKeD96puHoVePawQ+qA7aHIZ+SFwPmBw4M7mMzw6vwR33jvHo+fXbBcrrl9/5AoDKI3GNux3G6Zn9xitdwissBy2aAJDCpn/0hjr5bkucNXkXaQqCApS4fMAa/Zy4+5dfQhv/njX+Pw9A55obi4eMV23XF8sI/cB7vcUFWnXNeXbC/WzIsDDk72uTx/QhRw++QWIitYby7wnSV2OU2/Iao5YqgJmeDbueTkzY/4+Oc/5n/5lb/FTz67ZFZVyKyn7zy37x1SX/fYtkDkjmquCLMp6IG5n+N6RX6yT4g1548fY7sNXavJxJRuGHDCp9WpdSjGNGkyvYyfokD0KcRyMMv54NDy5NpwKdKNtqsHJtMcIUpCyFCmI8QVzSYlsuuNo2kGDo/2eeuNb1K3DV89fojQmzQAdzl1uyXLUmVwUh0tWhYoZej7blQ00rV+fHLCMAxsN01SurTEDT1+HITi7iE2VqemKs+YlCmZOrOFVISgKIqCKJIaY1TO3t4+69V18s2aKcHD4AaUTozB6AIn+8coBJfLNc0QCXhUFonRUeQZeV6yWvY0w5ZqopAykBeCGDRdm1b4UmQgJN7bm+9LCMHhwT5VWbJcLtms66R0j0qK1nqcoR3J86mJXiKFRyjPfDajKA3dsKHvHFpNiAG2tcV5eOude9y+fcjDLx+zWTXMj/YQWhKsp1kn/2RVGaoqo8gDPtRslgNlccydu3e4urrk+auvUJnGDTlSGUyR1nRt23N4eMLhwS2GrqNrEtPUuR47eECNVgdHWk+mNajJ0oCeqynvf/wBt9/NqOtrMjFH6woGuHh2yU8+/y18BOfTelLEiBYZJjMIHM51SXlRI7cUkpcOOaK80rVYFInisNnU5LkeV58WYxTaJG92GANSzvmbFHgKbe0e1uP6VoCS+sY/rBREHC54sjE413btzQM+8TvHaOA4uHiX1DUxeiHjSEnYJapNpslyAyPntR8CghwpDEJEjo/3WK4T77QscrwbRvULCAZj0gALjnv3z2hbT5ZrlqtX+Oh5/3vfQRvPl19+yeZK0TeBEGqKvKIcDyNSOqzfUubHlFXyFjdtz/n5c6aTGR988BFfffWYeluTGU0qfEiqV9t3KUDjI8NIUYARN6U0Wmqs7W/sDsYYhmH4Wrgo1ViHmBBHVTVJa3Dv2d+f09SbxIn2EaFHf6+URA8hjJ99kQ4rZVnRdZtElxAKN4S07vYD/x91bxJjWZaf9/3OdKc3xZAROVRlZo3dVc1uNrvZJkW15CYBkYJtSrZEg5IILQzBC21kArJFyTJtNOyNF156YS9lgYJkwQMIypBIT7IMUjRtiTO7uos1ZOUUGREZb7rTGb04NyLbG23dSiCRucjIN913z3/4vt83hhxTWhclWmZqAyJzmbXWtH1uJrTOzv2maZBCsd29oG+zttoUI95lbaVQw6RvLdh32UyVkkAXhrJ8hbS6Xp9fY7AAyqK6+ftyueTy5cWNi558FSIF9HZEpmucVp7Uex+4dXyClJL1en0jv7g2R2W5gcE5l9O1hoFxHKmqirqZQxIM4wgi4txIM6/RSWTKgRGY/UB5csB2P/KnvvFvMD+Fv/d3f4mYCpRJSDmimCOkneQAFcn1+JCIKm/f8JJZdYAwiaoqWO9bqhU4LwFL0wTWV2Ea7nkOl4dsrrbsNvvplUbqqsoN+GRKSymbxMrCIHVuJEMMuGRpqiXWpun1KITMoQAxRrYfh1crjP8ff/0LJ6r/4J/9wjffvG8IQySaGXE/MPo9PQFdFXgLRWEojCREN3Uf+YJA5OguNwgiWZPY7xN/6Wcbvv6TPaIcOTi55M33j/i/fq3ng+9EmlXO+CZOKUihR6UMVU9RUxlPt4kIFZnNBajE2GuEGzCrHj0rUERe7h3CH5J4gx/8wa/y8cdPETphisjHH1yxftHgk+PwKCBKcFbgx8CiNuwGwbd/o2N/NZLSm3gxsn7ZU9dgaoURMDOSi8cFi0awnBeMrkMtAioZRGdQCIojw/qJYuYaNi8fc3zvFj4ETg4O+fTxd2ju7mjPBclmjYxLUJQFWhU4PyK1ZLac59UHLUI6ClPQ7jsKlXUns6ZAKocyltVyRlUuGIeRF89bdmuoipKqlkiRbw7LRcn911/jww++A8GTlOXJ8xafBPNFgXVgXdYezhuFKTWPP7vg9uo2VT3j8vwlB7ePWBwfMvRrJIp+L1CyRFce5yNRCupG4LclX3jvy2w2nquXV+y2WzZXl/Rtj5FgrSMOIFRijDuiryi1Zj4TLBYl5ZFhDHklvnm+xhqdV0LTgaa0Zow9dSgI1HzlG3+C80+f8IcffcbqcM7ssKSer1jMJYpDNjEw6BYXBNY4duOWmAybXctL17IOe/puZNxvMcwJzrPt+syovElNUSQhGL1HCYk2q1yqKo+SBSlqkoR7t+cMNjIk6AdPCgptYLR76lnWwPlBMHTZ0FA1htfv32Y+m7Pebnj02aesDmb80B/5AmdnV7iwZ3WYGHtL8DmJSoualPLkYzarc4qLEFRliXWWfdvf6KrGMeOc1MRdFQKiyIgZrfTEAsxFd1XWKFXc4J+KIkfEhhD54//qN5BScn72fFqrS3yIORUnBaxzlGWWPxRFRVlV7NodqEg9qzBGTgk+PUkMnJ7e4vbtU7SWOCumJKGAVnVmj479DQYmu/9Hdpsd2+3mxnjgYzZKSAWIbPjJmi9FzLojkH7SOepJiyZIURGn1KUYIjFlbmXwgc1mjXOWRT2jKQqs7RlsT9GUzBcNy8WCUhXYfiREyTCObLZXDG6fL07K7DpWkUSYHLgZb3Nxfslus8kYIx+xQ5rSgsRkssghBloZCp3NUVJqvLMEFbj/zl2qWcHZ+UvWm5fYbuDl2Ya+dShZZA1uiJSm4vT0NiF6xmECwyuRo1dTloAkuNEwW+umaMxrHFS4MfWAYBxddgoX1Y0m9VoXB6/kJdcu8ZTSlDef6QOLxRyhBKPzvP7aPXyIdG02d8V0Hd4woX6EwCiNzuR+SBPbc1qvXj+WMQZdliiZMGUFVCilKUuJDxmDZIdAu2+JKRdaRalwoc+peiJNBaPn1skRD964x9Pnz9jt90hZsu86zp6d8+TTM3ZXLSIqCpP1rUrDbCFRemDoe+YHif1uZL3Z0vV7Nlf7aTUOjx49ypNfssPd+yxfcS5P5rwP2cw1sUSvp8YZJP8KfeScuzE9XoeN5EQkR1WXGKMYxyHrgpua/X4LKUua6rqBlLIefdJMAmgDCM/Qj2jVEHwkJTd9vwp0IbNByeYCv1AFTd3Qjz3Oe6RQRNKNflSpXPAKIfJ0PxWTGcwz2p66XGCdx6d+0urnVbibGpKyavJrDHlLI0T+nGOMN6YkH3yWCaQcXxr8NYos3Zj6rHX5OozpZqUfQqQwuZFr23bS1NY3/z5fx0zXfX7smCLKyHwPjZauH5gvZvm+OA5EF4nCEZLFS099OCcMkT/2r/wIj9bn/Nr//hugBpQ01KUiuUgIu8nAmj0+gpCvg5jxdHWRk8eKUrIee4oiUoiBuw81W7unT4myNOzPIoESN45UNbg4TDrVMnO15TU6KyFVNjWWVf5++uhyoELnJhmKpzAS5wND76bvV8Hf+Nmf/56YqP6LI1T/h5//5umtI77z2x9zePsUox19u2MeKkYEKQiG3lGUgoQjhYwS0TrlfFzUtDLwlLph3Fv+/E/9JG88PCSyYXk6oywVv/C3P+bsUnOwOqLUAaUTnQ8YvUW0OflBN4pSesYrTaLOhpC0QhYJ+3JPfQei9DifcKpmu9+yuFvRVPc5u/iMJAYUEMeWYTdwcntOuRgZxYiWoF1B/1xycBu+8qX3OP9WYmd3LA8cRnuKEhZHkiQgjoe0w8hwCacPBS4kFDqvaNTAGCO3TuacfWvHg/sP+fd/7q/zP//Df8Dv/NrvcXr4JicPT9m5c9zG8vJ57hYRaXrvBM0i0PWSq13L2AfuvXbKya0Dtps9y3lJCD2SRN1EjGrwVnK4eIvLFy2LpciRfi4jb5RwpGSpCpNjF0OA6POUqTF0g+DW6YKYPFovWS6XnJ9dsH45osua7b6jbCqOT465utow7na0u4FZXVJVDevLkbKeUdW3ICkQA0Mn2b/Q/Gv/+p+mbwOffvIp7W5LaRQyKmazghQESEv70tFtPV03gpK89vopT56f0ywFJI1ts6DfxJIQFbdOGows6NsRIyXOBfaD5cmTj7GPf5MH925zfPoGYf2Yy03gfBc4X68pjpZUywWHy4rFfAHB4C49905PaeazjKmJkjgEfG/QAfSsJHmPUSajTqQmKYXUCoNAiP7mZlhVEqMFu27k0/M9nZLEJHNBEARKC5bLgqGP+FFS6BltP/Bv/9k/x1tvvsPTJy/QRjOMG5TJuKHPHl9ko5r2aC0zMmZIKFFOE5VIjP4GB3OtC/TOU5qCWZNdwP3QA4myKm4OvRASfqJziATXKWPApBPMN7R92yEQBJ/4+ONPOHv+DOss42gZrceFLNKfzxcURUHf9SQkm/2Ou3fv8v4X3sYlx3bXEn2kqoqpwAloXbBve3bbHd7HjAFL2eFrjL5ZN363kxyy618gGG0+4Isy6xnzCg6qskSkXFylFLJTXRb5MErZGAIqyzrIK2qpwoRTYoo0TFT1jLKpcUNHGC0GSD4XhLrIhYy1I1IpdCEpaklKkhDylG+5akgp0vdd5uzOlxnwPXQIYs5Vx6J0zEQJOUHKpUJJg1JZv0i0pOSJGIIvOH+2ZbfuWC7KbPrcXGXGr8jT65gESpislw4j1uaC0DmPjxEpFFVV411Oo5IyI46UErTtPrMnJ6OM4BXizPs8yUyTm/laVwncTLyvpQRSKqQAqXK60TAMlJXhqz/4ZYwxPHn8FLKAYlqH+un/uYbKvwoYSCkXr9fu6qIoqKqKEANS5Ugh6y3Ot6SYzaJ2zNr5sqp586036Po9R0c1ShSIMKPvW4pSUpZz5vNDrG/ZD2tenK0xhaCqDPPZnLHbo1NJXTYYLRAIvAPnI1IGUnQMY+ZO7zYWKSQuDMSQbvi1RVFM8g5PXVU3kZzWu5v3MUyF6rWEJ8WIiJFhGL+LI5rfI6VeYaG8z0ahTGLIg6MYPTFlCLwxGlMU1FVDXTdst7vJDKkm3mt29v/I179K1STOXjxDMKPQC7RRmNrQdh0gKabGNmtjczGDyAVzxnDpzDPuuyxpMYZ2v0GrRNttSSkya27hvckygJgm82S+7oWUU3CAvLkXxZT1zSEE2rZ9FZCRIkIKDlYHOVXNZQRUnAyFMcTcjCBu2KfX4RdCKA4ODrI3oLOcnt5h1ixo9z3Hx8fs97us7U8R66GZzUhTQ1zVBd6PKC1zAiMQpSAqg3QCNyqMNJxdXXG1fgGuJyWJ1BopS1AJO0biVCuVVUE0ki4CukTFSIlgfrBk7feUM8nyqOD4zpzDo4KLpyPDuqFoEvfefkCpoG03pBQ4PFpRNfnzCi4hVQ3XUfBSYgqJNlmaZwpDjAHBFB07gdAFgVlTUZia0Sb+5l/9m9/7heov/dP/55tUDad379L5itHP2F1eopxlUlPhHTRzQ8SS4iSmV9lANfYWrTIT0UVF2zmCiiwfbng5bHj6aEDXiV/8e4JNGwl+JPYR61vk4jluKJmHkv26xQuDDhVFE8AIki+wzpK0oogReRTwIREQeOUokuSguMNnf9Dhx0uaxQgpw6ZXdwK+cCyYE5SjkCWhiwRvOO8S633H6nYimBYpP8/r929z+fIFRTnno99yfPrbI3Ot6Hclskwc3Z4hRMvlc0NZrZitALEDecQPf+UH+IPf/ITvfPgIO7Q8+/gZJ8e38ipKrHjx2Trn8SYFwqPNDF2VSKmZzSuCD/R7h0glZVER44hWklLWbDeCvoOyFLRtz2azwfsBbzXRS5IPxJQTeoqihKSIgClLoohQ5QLs4vKC7TYRoma72+Spncyd/K4bsUSqqmJ7dYkMAT8mUtC028w2DDjaoUUMkkXd8Oabd3nv3S9yfHTKetPy8UffpqkqCpMNGKqQKFXgu8CBNHztqz/Em18MXDw7p9sHjm4fMtcF3SZxdFLysrXUumGMsCwOUUUiyh1FFUhVSbVMXDze8hM/+g1+5t/5aX71l/8Jp/VzDsqOq8KwenjE7vkVOJjNDfu1RRHZicDLYUu1XLDdt1jfI8ucAtLoBmEgjNmRGgUkn4tmHyIKgRRZC6nRhAgqCCrpmS8PwKtpIjBl1OssoO/aQNfCyekRt27N2W5HPvjWR3z22ZMpEnFktD3XufXBJxCREGTOsJdzjC4pzATfFtwAsrOrPesLs1YvT8EAQoo5sEKbmwMiK9SuIdfpxul6Ld8BJoxOnsxKLbPBRkqcv8arCOazGcWEkIkxMYwDXT8ym89xMfDixQVdN+BsoJkVHB4tEaJmv+/xwVKWNcFfP3eP0RXHt26RUqJtuxtnb1VVzOdznM3OWz3B60P0zBc1Skm6dsjmRJsz3XPsYQb8x+RvDA9ymqSJyQEstWS727NarXjn3bfpe8vFxRXeWooi3zd2XU8/DKxfbvDDiNa5MCQpvM8mxbKoUdLkBiXl6yUlblKfxLXSKiWE0BAz0zjGzHnNRTPE5HIims5g8uQDYzfy4skFru2phQZXI8WK6FKeXE7XQgqZWdm2W/yUua61wRTF5KzPZpAYr2Mb4830/VUiUKYQhJSwLkyAdDW5msVkYMuTt/yz1c06/noN64OnKDRFmU1Lb731Fkorfuu3fpvgM+vVT2ZFo/XkIs9YpMIYtJQ4m8MLYgg3U0Ah8msYBjvxgHPhVldzvIdbJwcc31qyWa/pdo5uv8Vbx3ZtKasZhycH2GiRWtPvc/Kc9Za+y8W0FGUuKmea4AdAo1WOnSRF9vsBN45oUxCjYhg79vuIFBXBW1KSKKExSk9UjGyQywglOa3IFWIyDxljICWUzChHySSD8H76XsYbV/y1xCfrVQ1S5XTAotAgYBhGUoKyKoCUjTQhB4IkEu+/9z5XVy8Z7cBsVnLvwYz12vH6a19gtLDbtcSQMCUgBpgYuQqJlooYAtvtlrqpbp5HWRU47xiHjH7KWKvEev0SH/a56BkiUkWamWF0O5SeNLtTwRpCYD6fT1KTeGPuhDSlcBmqqvr/SACEEDR1czPBT0lMTZS+mVRfa2qlVJOhaWpmq4rdbkff5XCWsqzROj+GkIIQIocHB8yXDcPYEZLl6OAo03OSJgZB8FkGEIOmmTWY0HF4UjDaLfthj3SQtMc6gSnTFBE9cHhySii3PHh/Qb9XpH5gpkp0TJRF1hX73qJCIu490TT0ZeTsakvsNHHIJt+X6w2LhaTrerwHb/NE2JiJ6esdUmaDczHRWq6/K0M/4l1AiFzYD70lpkBZmhtpZ103/Nxf+bnv/UL1v/w7//03Xzze8Ox5x6NvXXH+/DmVHgmMFGhCTHgPzVxTVhCCIiUJBEgCqU3WKYkKaHEDfPHL8Kd+pqepDaqEaqb5xb/b4qLg6FhxfrZhthpBFATZU41LfuhrP8yQwCdPUY9UM4EOJfOjUx492XG4aikPNOOQ87HrUtFIwf7M0K33XF211M0SaRzJeWI0ubNJHckIpErUq4LLi8DeR5LwPH3RIkSkt5YXZ88ZB2h3jnHjoYNxEwjjyPYCyqrktTdKrh5pPvina46WR8xOBCdvHnKveJdf/1/+N95453V2HsY0sjnf0j1KdMMlQnlef/0IpSMuDoSk6boW0ogbI9FaZtWS9ct1xmNJgRIKqUAqRwj5QOm6gZQUJIMdPZAh/YlIUVaMNrJtR3wS2OBwUTBYOU1eDabWjG5NsJFkDYe3a8oqsd/2hDHgerDRMooRIfQ0sRhRIq8p53PJaqXZrVvefvA17h5/GRf2bK52PH32IQjJODrKmckHn9GMg2W+XPF8uOTgzQrvJKvjmp2LqPkRzl2iyghDzfHqCO/3dH3H6AIPvlAhzQy7tgw2UR8kbFHyi7/0OyyH57z5RmCxKHnytGTXRW4dC+49fJPdHg6agg6LCwPeWcaupYgS345kX9vIreUhdmizCGtKOZEI3DDmqY8QxGQgZNzJKCU2Bj73zm3GkNjtOrwfGAdPUSmaasVoB4oyoo1jGCzPnq85e/6SO/ducf/BHa7WV4w2axYLU3N0qyakEVMYKrNg6AYkBT7kXHClX+kLlcqYoeuYPikls7ohppQPKjKbbxzzCjKkhJb6BhadU4z0dznnc+edC5d8s0sTVByyvq0wGkGiKsssLRBqOihyws5uv6PddRkcLyNVqdBScnR4zDBG+mEPBLp2uDESVVWNVIL1evNd05WMQMpRjT2JPH2J6bo4zBq9EDxGKWJIrJZZy5q5oolEyGiwGJHCMJuVSJNX/j4GnI/UTYmPI8+en2Gtp6wrhNST030y1QHExPHxiqOjRc4tt5GqmtFUc+pqQaEFfd+y27ZYO1Ka7LQmQQpZIZrd4BEfB5QWE/syS2JCzAWeVArvLEoyTZsDWiYODgpM4fnkD5/x6NMzNldrxqHPrMiizHo08kSxKAymqLIOVkqUKQg+FzBCCpqmvlkrXxee1wa7nHiVpusqP+9rvel3BwnE+GrFKoTETeD5qqom57hgsVyx37d8+OFHXKdopZTd3q9UhFlLxzWTNWVtY94A+Ju1eL4mr1FEhsV8wWK+YrfrUdLwAz/wJY6OD5EGvvEn/yiffPqMvs2ylP1uw269RUZFqRQJgbOKxarMusgxUyNS2rHbdGhtpohZOyWiebSRPHj4GkcHhzx+8gylNZIKKQ1FUWYGps6xvVkSlyZzmSaRcjhDCvR9iyk0Wme9IDKbvZiah3Iy6VmbDWPXjcQ11N4Yw/KgzoapCaEkxFSYTWl6y8ODHK2ZEvu2x8fAg4cP6WzPtt0z9Nlc9NGHH3J2/hxTCFwcJv2pYN/uqEyJEvKmUK9n1QSrjyReRZwKQc63Z5KWJJjNDhlsh9Ia7wUxwDBuWB6UuF4y+hFjNIeHBxPO6hoPFaeGR99sgbKMaZwQS5ku0PfDlOSVm/CiKKaGRjKfL6jretJSy5ufU0rRdQMhRJbL+Y1RK393wFlHUeYp91vvfp4H9x+w2+6zxCDJmwbD2pHFicJHT1MJTl+fsV8EktXovsKoBUNwzJuaQkdEHBFxia4TB69XDGrPi0cOJR3zmSFJT4gWRTZtlY2hnGuigtFecbC6S992CDWSvMH1DqXE1ChHUlIIkcNaVkcVzTzS7iPeJ5zPFIc0Gcq0Mhn8ryXIOJlQwYW8dK1rjZADP/dX/uPv/UL1P/vP/9Nv3n9QYaJj/9klyxPNspC0u/0NGy54gVSBeqbw7pXeqjAFWktUSgxDIGlFwPD8xZY/+edus22PKdWOorjD3/9vzolsubjY84UvfREvLhi3ELWljCU/+Rdu8Xt/sOb5iz2y7Og7zefffpfhStOuLU2zRZiQ2WshoXRCi5pbh6e07ZbtRrPbKeZNpFKRsK8oTcCXic0mcrhocB7OvlPy4tsDr90+5uS4hBjxqSWMioSnbMgGp/OCokjUWhJGycXTlkrO2L0YSYPmyUc77BbSueDFs5c8uYrcunuf73v7lMsnZ1xdjaSyY1GW2EEgRUW72zN2khCgVA2r6gglNSJ4ykKR0gAMRJ+diaZ0KJ0ILhGCIGCRKjGbNyglWa/zgV5VDf1g8UFQ14ckIUkygS5xtkXpjLiwKXBwcIrwiqqSbLYv6UZHWVUc3J3hnUeSc7MNirIyJGnAesZ9jx0CD948xcmB73znMS+efps/8vWv8/z5Oc8vPmToLYeHx6hCEFLWSM51Yru2bLd7nny247X7t5nVjmcfX3H5/ApVL9lfCIzZ8me+f8/uactWnGLme3RdcXW1xw6O2szxA3Rhjz5oOb4teXKW+NXfHfCjZOg8fVCMwTObK4LrGLymFoZgIckMCa9V1hG/9d77rNsNYejzDdMoiJnpaYxCkp2ioggIkQ/UxmjuaMHnKomynhQiQQhCUmgl6XtPVQuqOne2QhWUdU3TzCAxQdkH+r6bHJuShCMmKOWc48M7jMNA23XUVYWQgX4YqKrmZhU7n89vNFoh5LVOjHmlmMgA96qsbiamMXgi+fOPKfNd8yroOuHJTeCYQJoA18B0SCpi8JASXdsTfOC9996jKkv6frgpoJ3Pzm5jAkWR9U9PHl8ShWO+LBjHwGKx4sHDeznhLOUVVca1QJY3xGna+spU9d2Q+etDTZCna0pqbt06oaqqG6akmlbQUmhCDPhgp+CGnCykVYVSEmtHvEucnNzh9r27bPY7vLWoINmt94RpVS5UxBQSUp6YOZfXiONg6drdhK3JyJkYMg3AjTmGdzabcXh4QFFFFiuB0mRywXSgXqOYClPjrMfagUAkJlDa8N6X3ueNdx/y/OwM73IyYF1nRFgMeYrkbCREgTKaqqyBjC5zzmOdZepQJuNapkeE4PMkNSbkxPi11k1Jaobl6oC6qmnbPXbMTm0hRMYQTVpirfNk73oiZqY1vbWezWY7rcXVq+UAACAASURBVGWvma95vVoYjVaSG/YqWeuqphCCXIQZTk5OuH37lLZtb9ip1xPrZpa3TW2745NPnvLZo+fEpDm9+zZdt+Hi7IKiqvnc+29ycq/g+DTSdlt2XWRxUFPPDaujQ4R02CFNWmlJUpCExTsHQiKVyg2rdTw/e4mUiqpakIczmSmNyo58oaCuZzfTwMzODHhvGccBU+SiaRxHlDHTNjLv8KcdB0zrfK1zJHNVlTfXvzaKg8MlwzAAObgBITBVmRsVnXWPbdfnNX5h2O9brHM0zQwfAsEWmEJweGsOKjJaz6I5zJ+DChNaMj/nmEIm/OjcONZVM6H7cnMhyZQIQcJ7m+V/wmHHjE9zfktZasYxQoqUtUErw3K5ZLvd3rBRi8KwWq3Y77c4F24A/845xsHerPJf8WjjTZN0eHjIarFk1mRpS1VX071jYo6agrKsuEazZclJ3nwopW5kOkYXXF1tuLoc6TvHvdt36boeJQRSBhaLIv8+rHj7/Rn1USI0C156y+FpyUwL7GWklhNrOCX0HMZomR8c4N3A+ZOOw9U93v3qmwx1NmMJD3bnKY8WmDslu9EhUsBtA+snI3HMDFuXHNWigJgRiG6MmZNqrnWogb53KJU3mUppnA0IZJYAuUgza0BOBsuUiMByeYhzFh9GpAr8jX/vX4II1X/yO//jN2+/8xp4w+KW4cHX7tJuFetHZ9BoXB9QKjsui1LgfTZ7ZCODJ0QxoWGy0Sp6y1FT85f+8pLLz17w4POBrl3wC//VS/7Yj77F+19b0pxKpH+LJx9c8MabC3Tl+ez5Of2gWBx4gpOk1BPcnJ/6N3+co9lrPHzn86Rxx1W3o6g1MiqefCC4+tjS71s2m5bFiabroK5qotxQ1gViFBTa0q1H+haOjjpEZXh5aVmejlQzSZSKZqYAT1WtOF6UtE8tBZLBJ4QBEQP788wX9WokJU+6nLEfe04LRXc58hf/3b/Mzg7EUfP48WNUoRA+MriRocurOwEIZSlk5HjuUXUWOksSZSWYzxbYocjGCQHjKIFiQrtASHD37j2s62hmBh/zNDWEyDgGiqIihpGQHFoYDlYHKBVQpeH4bo74FF4wjntMsSSJGhdHTt9aUpqaODh0MmggiHyAfeGdd/nhr32N2YHkrXde58tf+wHKxlBwitQFbdcy2DVNs+Dy6gpSyuY7H4lRkOipy4Y7rx2z7Z6zuYz0m5Y4RLwIFMFAaXnfSB6/sDwPnvnBIUl6ytpQ3GnyFHLnaA4a4gz29YgvEs3xIVf9gI+A9xRR0nU5M9ltNrQ+EKQkypxvP3Yjq0XNuLfs1xu0gMXRId1+T2U0qimQRiFiNmHUZUldl7jkSUPgqCpZzix95XncjfiQE2L60RJ9oh8GLi/6vFbTjiQUw2jpe8/Z83MSOXM6hYBUgrKo8aPC2UA3rCduqs968JQ/06ZpMNqw3bS0+/aGZ1k3NUYr+nFA6bx+lTLrV6/z3aXMk4HvzqAWEzA9m3hUbjZ11k+mEPL6V7zia14fruPo2e9bfvzHf4Lbd+7w7OwZztoM3CZPe4KLOJcndPW8IgSwg+Xk6BaFabhaX+F8nobk4kTePM9r96+col+Vyi50IXOxFELKKKuUnb1919N1PTEGlPYoLSBqpFBoozNeSWiqsiQlMTmM8hTJ+8h+t2N3tSFZx9j3zFcLPv9975GEYLfdc3gwpywl3TDiQ57sOtcT04ibYl1XqyVGa4Z+QCuF0YqmqXHesb5a41xAqxlVsaAsmrz6nybFzlusHwCHlgZlmqyRTpEoJOvdwNnTCzS5EDV6RkYVeaSWhJgoyowy2rcd2hiSgBA9i+UMow0pRlKM2HG8WfkrbSjLKk8JlcToVxOtvuuw43BzrRitbyZgSmf01fUaVqk8VZzN5jTNLBeXUjEO9qbpyPiqcjJJ5YbjGiAfr6N+hbqRmGhtWK0OuLi4zFPIELE2MzPXV3uiNxnuXwsOT2qCt3z4Wx8Q2j0HByU+RQ7vHuGMpTw44Bs/8aM8fOM2b737BnfvH/L0xScMXaZblMUCQUXTQPBDPsxjRMkSpeusJxUmo8dETgKq6mwkFGrk8PgALRWmmKGNoZ41KKPYtbucLEfCBZ+B/jFMHgU3vS5P9DlhTEp1M0m9llnkSOvckPWDpSprVqsDrPeTQY58FgdP21mUyJpXZx2mMEip2Gw2OQEq2Mn9X+bpGgHrbDbWmSrLRFLuUeeHDfW8ZNt201ZJUhQl+33WBue1eZpiYiNNU9HUM0LoUELz+uuvc+fukpPXoJp7Ls8tha7ou4FEXrcXRclyuWK/31NVNcYU2DEjAefzBcfHx6+0uZNu/fp6TCkyDv2NrlcIuFpvp03RK+nItSEtT6kLQN5MhZ2zDGPPnTt3iTHSdTu6doOzfZZnKJ3DOgZHVdZs1pbzZwOqXnDrwQHYLU7kZLLhxTl1XRLLgUFBeVCxek2yb1sK3XNrcQ8rE+vNM4bdluQF+IwGlFoRGLH9yMuXLTYohHJEOXB4LLjzWolRWeqh1RTHXRicH9jvOwgS2yuWhw1tu2cYLMFF/MTvlYr8vmomJqHEqMy0D35AItGy5K//7H/0vV+o/v1f/p+++fzsnLbzqLt32e4Em6eO4cWnFDpix6yz8cGxWJQoDdZm12oIOU9cqzzuT0JQlgW2c/zZn1ny5R88oKhKnj2t+Nv/9Uv2V8f86Z/+KX7j93+d3/xnH/DGnRm+t8jlyNU25xR/9fu/Qq0WWPuCdtwzjA13bj9EzW/z6e9/ghVrjLYMjxRF7wkpP7eTNzQP3l3x+LPAvbsNMe5IoeK9H5zzfD3iQsHVdkRIOHxQcXgHvBiQe89urajKvM5oFiuEKzh/vCUJjxUS8Bm6bRpcDIjgKKQkKpGddMnj7I7f+/1PCbHmw0e/gykifu9JQRBRJGX50vffI9oliwXcvW35oa+csB0tm8tE9AUkz2Yz5BSw4DAqv6dMq2BnJUbXFGXEuoCzkSgCEk1KMPZZ4F/X+UJMDrphpKpK+hEWt2pSjFw83aLkyGxZ4qNDuMh6fUW3DujS0KceYyBKEMHx9R/+MVbHd7h9521+9zc/o6nu8+mnG7717d9js80axPPzpyAkbrQQJEQLPrFaLQjjiJiVOKPoLz3KK7Ra0VQLdHCIWuLahJ8teFYafGwpqyVXVwPt2RVXu8DJwwXz2pG0Z7NrqWLFfHXAvdcesr7aYq8sy/mSYRzwm4iIElFpylpQykAhTNbRlXvaviWEHuUSvbNc7TbI4KkLTX28ImpJo/NUI2ExSlHUFcNoOetHLp3kbB9JvkFkqNp06GcdWjMrefg5OLzVcPlCcf/h/akDdmiddUZZUpZw1oPMiWKzuaasHWWpCL4EEdFSYwdH3/U8ePiA09NTjDF0XctobebbCoFQKk9qUpoi/8SkWeOmsBUTTBwm1+tUhJaVoaqyflCIjJCJMWUNZcrO8Jjg8OiY/+Dn/hpvvfM2v/Irv8Lz588oKjMlJkFwAjdmMb8uEsMIQ+dZLZYMg+PsxTkhWhB5enq9hr7mSWZs1qt896yPS8SUV4xZ6phNPEpInLM4lykAs7lhNpsxDilr+PB4p3DjBPY2JUJEggMps3takKdEKQQKlTBSoEVOZxrGnpASVZNlNs5mqYMyFmUczkFVrtBGYcceNbnXlc7IJsgnfwyJoR+p64qmKRmGHUKmyfyQ+ZZlVU96WksKDp0EVy83BNsyq3LEarMQjENPMyt4+MZdhNB0Q0bojKNFTLrIw+ND3v3cWxweLPHBYe2Is45Z02RndkrT42WahNJ5Sn+tsSyMmVTN3BzyZZVXrXG6rq6Lh2KaFnrv2W7XuZCAGy21vGHliknbnFFX17npwXmcDTdg9jzt6nn27BlKZv23FBIpwWjN6mCR19bO5vVyn+HoehZIwuKcxAbYdZe4MPLxty75+A+27LodH370IR89+ghTu9zsaI8bHWO/Jbr8WpzNU11jakCDzNr/1+/f5a2375JiRT9000Q+QjJoVXFyespiscwc1akQtXbEFIqiyHrca/1pLpoEzrncWIpXUarXDcD1368n1ylIVssDnPX0wzilK43oIp99IhY5gSn6m+bBW5919jKbPY9Olvl5OEXfDYTY5/875vsMAqQWRGG5deeI5eEcOzpImZIRQkCSU5FIoJWaGsBEJZek6PHR4oPl8WeXaH3Iu597j81+z9X5NmuVnaeZzbHWYa1jtTpgvd5QmJKHDx/inGMYhhtjWQjhuwgIr66bwhiGoaft9jnowmW5UlmWN6bM6yIVIlIUmCIXspAHBCkluq4lxoBRkpSyGbBpGs7Pzqf7euLqao1PllqvuHh8hSNRqYTre0TvaI5qLlrP/S8FohBs9x11uSQBd9+4z35I9H6N944vfemHKIoFMkUEkSASFIK7917PxmadSMLhvEDrOUoYup2nLGf0/ZADZLzFucCsydSAuimYzUvaruPW8TFVVdP3/WSmE9SzghRNpg7gsrRrdATH1Jgl/sO/+i+B6/+/+G//1jdv3z7i0bfX7F7uefnxGf3uChU9Uo54kbCdRgjDfKHzRCKWuTPWiVI2jDEiYkIlR1QlLztPsxj46tcbkh549FHBr/zDns0w8vjRlq995YvMDvcc3Hud5lBz8emWqE4Yuh47dkTRUMkeq3esLzZ88p0P+D9+6R+zubjkVqOwW03bKkTyJEZmS40Qh5SmpCqXJJFYHBxy/uIly1PD8UPBbtPhbU3XeYRzWF2x6xNqmyiKBqd6KhEZ9iNPPt0jWwCBThFBjtWE7KSvo0b0kXJR8yd+7EdJmz/k+KjmO+eep48+IIge35FF6liCgoOjGcLBZ4/W3HnziLfee5P/+9cfcXZ2HcmW4yTtOBLSmG/eusyHQRGmLl7lhJtE7v4wpBBv4vCkEiDypKcoKpz3oBJSGYLzvHy2od+OlE2BTTBfHTGODuscyeWDoe96RJTEJLh7+x4jgUefPSIZyf/5j38dUzu+/cnvsj1/xP1bFadlZHlwjz0dyQaOD2qCUkQrqYzA+YE+KqqDhnHXcu+1+xzfOcXvB56vX1I1c0IINMua87anXkTadcnmRYewgXtfeotxa+nPHEnW9HtDe96zOqzZe0e3sQw7C2Q6hQsaYTSjG8GD8J7tGJHBUCro+oi3Jk/wJFgfWZQVtVSIlBi7nnbTMvQtWqbMqI2eQmlizOxK7wNaGRA+N2sqYEqdE3ic4fS1I+6enPC5d97i008v+OzRYzZXW5yNtPue4B2JhC4yDUIrgZSeO/cddhSsL6/XrYYoA8jMuzs9vctqdUo/eq62V0QCKfjMFJQTS2+KZSyKAmKe3mmZD8DZbE5VZ7yNFBKRIs7nww2YDA7cOPEFMjvMiSAVo/X87u98wD/6R/8rTx4/QUifV+w+H+jRB+7eOWU2m7Hd9BAjZS0p6po43Siz8XvKE1cSaa7jVCeuX5oMX4IcG5pkXndyXbjmdamP2UCShKeoMqA+xYkYoPXUSLuJVRoxVUSZXPiGEIgh8z+VhJQcPiZ0YajmLuvCfQIchVEELxgHi5CRkCI+iHxYS3AOVocrDg4WbLdrYgw0zZzCFNgh46K0yWio9XqHDwlpDEJqnIsEFxApYAxoLRBJEaIkkpitGg4OlwRnqZtDivmM/TBwvt6y3W2pCkX0FpJAJw1R0tueJ8+f8ejRE/rtQBgj1uUJbEZJiYwbCinLQvzIOAx46/I1cX0wTBMsrSRlKafJd7yJ3BQyfxZaq8mFnn8sT74D11Gc19ri68lhLsAKRJqmdUbfTMquI1GzOUaiC4kNAzHlg9uOkavdFSkmyqKgKMGOlqFPDIPAmJoYEn0/knxktayQuse1V9QGzh4P9PuC1UKyqDOrdYxZ6uVDgiR4+OYpIXV03Y4MOwisFof0LTx48DpPnn5K262paklZNdhR03eJqoazp4+5vDjH+QHBSJKBFHRuZKUhUZKwpAnWX1WrHH4z4ZK+u6G8/jPERAqKrt/R9bupUVCUZZU9DBJiiBBLjEnoKXEOmYsyoQJGz3E2M0HHoSfGrB+OyVM3FSIp+n6PIkI07DY5fS16x9BJZJUIftKtezAlCB2nTUvEj1uMPsL6HjtCkCMpFcwXBV/4/PdRmcR2t0Uww/mOFB0HqxOsdeiy4MG9t/j4k4+JKU/ht5ttph+IRIoZj1UUBSnGjFgcLfWswTlB08z4C3/xp1mtDN/+1iPKqsTomqo6JMo9UkPwjhCuwzam2FqdY6DzlN8SYh40BLnljc+f5DNfNihlIWpE3NM0NY0+oiwXHLx2wureEXXZU9aKNCzw0nJ0tyCNPgcJJM3zRxfMFwUnDxqsGxm7gXZ0bKJDLoBYQqpYb68ylUcaKlOx23S0O0e7D7RtT1PPcWHHfJ6pDF2XzWcpKuaHC1wceP3+GwSxoWoUCIegBDx+jIBByEhhmkwMKQQhCHxw/Pxf+0++9wvVv/XLf+ebH/7WYy6erTHFgKxK+k1LYRSEHUoYgpek6DAFVNVsWhvmnODsRiyJQVCZhpgUQ29Rfsa/9ecNmDmPPjb84n/3ksPTA16c77hz+zVqXfLPf/U7LJZfZP3JGafFnMNyycXFyAfP/5DLfYl0iSB76irQHBn2LuZJROzxNmF9IqExes7mZQcuIkXg6mIgMnJ0u+DqbEuUI2HbUC0km72DK4HdOjARGRJNc0BUklEMiCpQphVhHUhCIYwiTDoiVMoTJxQ2BFwa+bE/9kWenF2xe9mz3cPhwYLj5RHnmzWzRnNwVCCNwA6RFCLaFOy7ng8/OOPk8D4HR0fsdm3GsMhrDExeX47jiPMDKZbZterClCUcGdqM+LoWnl/rBYEJ2ZMj3UDR9h0xBmaLiqLShJQQMn9OQ9/lVap1GGXyAaI1IsH65RXKJVrXs91s6QpP63aEsMXUK/R+z5fnl9jmLueXa1SKdKphlCN1M0OpBWJwzIuG/S7D7A+qJR996wmb3YamkUQ/MnSBu6+XfN+X73L53NNuBqTaUZeSYd+BM4TeIQfN+2+/xp/56R9mcC19u+bs6Ro3jMTRsd/2VGVBsyiJRPrRk1xJcppqFpnfahh3e4QP6GqJkJnbGohQalRh6NsBERMSyXK5JKmSYYyMNkGUlNpQaElTlSQSgwOdNGUEay2iCvh94tFn55y9vMSNnhQcadJZ5VMpfzYx5KmlVBIhKt56+P30+4KuG2hmEjtaoqumlTK8vLwkxhFr97TtHqVyNGgMuTtWMic1FaUGArlSzyigkFLW1pGfQ15B5xU5KYPhgw+TySqvIoWIRH+djBWJydH2WyIdUmfdVxSBpAWIEiELhnHAest8NSOS8nfFWvzo8XbKha9qdI7TIU7SISNzEywmZ7SYppKZn5huDheYol1DXmHfuXOXxXxJ2w2EmIhTxOPR4dFkGgvMFzOappoMW4F0U1SlSVqg8c5P8bkKo2bMZwsAXBiwdsyJWs5hBwGUSJkL2eAj7d7S7UeGIfHOW1/hR/7oH2e323JxcT4VnwJJQisxcW6zM1wrhZJACjcxlnHiLKYIy9WKdz7/Fv0wcPb0CSr2hNYzbge0ELlYMTmSM4ZJ3hFzMWkm/WdRGGbzOePgb96LqtKMY4eUOe0ppYz3gdwcrFYLVgdLdvstpshyhhizXjBr3eKksc7F7CsN4XWaEaQpMSkbdq5xV3q6t8mJW+xA5sjcGJn0vkx0gYR1GWfWzAuahWV1lCh0LkS0yVSCg+MZxSKbwJxzWDsgUVT6IBeJ3lDIFYuThs9/7gsM24FhJzh/EfEehl1+bFLi8PCAslRcXFyipL7BCb68umLX7bnoPsIsemSVJRZlldjvryDmKWg/btGmxOdsB6RSNIs8WR6GgCBlHbUTaF0Q4wAx3BA58hQwTw6vzZKFMXiXBxF1nZFXbjLfeR9YLlYYU7Bv15BCpncUDVU1pyg1dT2jbCymkOz3fTYOAFpXkCRFoYiuQ8gaJ8CnET9Y+m2fmzIsyQpunxqqRuNFDhUWKaJdIqwjTkiUkZRzxeBapPQoCZv2kn/+ux/w+u173H/wJk+evUArj3eC5bJhefj/Uvdmv5ZeZ37es6Zv2uMZa64iizMpSqQkUupuy7J6cLe7ZXfbTtKIYQcJfJGbxLCTdqcN5EJXAQzkIgEM3wRBfBEYiYMg9kWn20aP7jFKSy1KoiiKUxVZVafqTPvs6ZvWlIv1VSn+DywCvOAA8px9zt7fWu/7+z2PJi8MH3zwAxAdzgmMLgmx5ZnnL2FdjY8508mEKAJFoanXkohHikT1+PQrn6fZptjPgwf3qMYwnw8xmxAJriDGHx5QH0dSUuY35aS1kvQ2xQY+98ZnGI8LlouWzFTEaBFoEBVSRLrakk0su1dyNouI8zk+V7RecHjlacajG/SNY7Pp2G5gPBKc3w08vLOmyAy3Xoh8dOchys7olg3bk4au69jZmdDU6/T/GH72MXqEeUxq8RBTUUqq9L5o24Yr13NOjxtE0Bw/fERTW5qt5PLVy9R1Td9LpLFUI8PB4Q6npwvkUKidTA8xWcGv/r1f+ff/oPo//ON/+rXxgeZi9ZDKZqwXLWNtONuu2ZEe6z1CKCBQlSmwH/HDDSs1HpVMGJTObYihpWsir79Z8Dd/OaMH3n838ke/U2FKaPuaux/ep9lsabpjlDrG5CN+8pe/wCdHiouTu4z1hNmo4ItPvw6mY+lOuahLbB+YSI1QEYRC+4ymbSnzEmdbjK44e7RkcdZSZjvM5hmXnurRVcXyrKYPPdW0xG8tRhi20XPpUs5f/Mu3ee/dLdAxnRnsesvyfoYuoLEWQzIUZYAIgm3nsSpy5co+0Z3y3tuP+PSP/xQ/97M/w40bh3z3nXusG4dRDVlmUiu6d4OPvERl6SBZZPucnZ1gnU8P201DiElbWRTFsP6IdL3DWbh6/RClJA+PznDWkmearnNPUBVK/7slFGNy+q5PZiKj0Jmmbpq0Gh5A8qToHZnK0wMS0jRFJFTJNlqiLsjpaPolV/f3eebWJe5u1tjW8fzNq5xIzSf3L8ikZ71esFlsiX2NsAK8xEmLEgaQrNYn5MbT2gbrW6pJllBUONarCCJjuTnFOWi6QGw0XaihVFx5bsy1Z27x8CLw8YP3WJ215GMoJoLxZMx8fshisWS9WSJjz+5cYirLdrNhf3TI7nyX4/MzQoTNZj0UPaD1Hl3m1G2LjGCEQuuMxluaPuJiRBlNJjNyBFl0BN8Oq6X0IPfeIqUhCskXXnuGpnYcP1rie4dEJloD+knDPcvzYR0VybMCo0ecn3Y0zZYQEsxfKMd8N01fQKZsUWhp2z5lSOPgwnYONQg5UoY8NZfTATiBreVgAbDOIpE4+xiBk1Sj6esarEQhrdOzTKN1oiK1TcDojKJI6stMF+ky5CXaCXzXo2VAifTQzosKY3K61uL67gnLL8tVQtUQiSJFDIxSaJW+TjVEErRSKVcl4hOOY/pDPMkyPvaQb7db6roZNKLJ2NO0LXXT4IOndzbxDLOSosgQIuUFlUoTxBDT5CmKgLPQtB3L1QUQGI1MOiyH5HO3riZEl/J2VpPlkmLkEbIjLzQ3n7rFtt3w1lt/Towd3nliFIgnpSaJtwERIc/SBQSZpmRKps1NEjGknPFiveGisZhizHhe0rQ9bR0G6H/K+KbXJ2WORcI9ELwf8EaKnd3JsI5OtqO62Q6XJg1BDeB0eOx310aS5walwbr+CbIK0jQ7hjj8bqXfERBPohyPkUrpoCqG/LEaIgIpJ+2DS0pN4hAfA60lXd88WfWmS8OAopAGEXM2K0tTp9Z052t6CyYbs7O3z3g8IYaI7RxVkTMeC4wJ9P2WhgtQgnoLbd/g/YZqLlC5TWvyTlFVGZPJhNXyYjhYB2Jw6SIlBC4mZrKPAlBIYQZFsifPDL2zSGNQhaOcapRJxrLJvGC1TPi6GEELg6BHqVReikECP8QMxfhYwmEwSiX9q3BDVngoQkpBUeYJk6Zzdnf3Wa2OkVLTtYOUR4gU7eodwWdoHbB9QMaMQAOiQwpB33uUMYlqoUFLiRcaneVoHSlMoJoZmsYhcUgMRujUnpeaz/zELW6/cQOTeU4fnREZSnc2IjEII/n4gzMeHt9BGRjPRkSvePaZ2xwfn3N8vKDMJUqLoQQEXesp8oJLlw5ZrZeslw0xZLz4wqe59+AO9bbG2khVTGibNd95+zucnh1BSFn0rok4J6gmhuVykS7wIpmlHhc1H/+ZtisJZ2d0xtnZKY8ePWSzanE24F3amrWhI9NgyHBR4HxNjCuceYAut5w/2nJ6vKLddshwweHeDqul4dbNyzz1bM5qtWYyvcZTNz/Nt9/6PppAtC3PP/8K682G7cWGYCOuE0gMcdDDFmWepr5OoJXGupau8+TZaOAXe7RKE2+tE75LF4K63TDeyWl7j7WKtvYUxQjXR7o2MWKjiEQ6fu3v/6N//w+q//xf/69fu3HzJoV1jA4CseqpVz19X2DiOZKB3iMFWZElU4WESHrxhEqNUqEVUpbgHSEoTs9q/sNfvsRoEvjztzRf/2OQGgozZ3c3w1RLdq7P2ds95MM7SxarwHfeuoeSPbv7l3jwyYr/5r/+7/D2gHfe+QPyPNC2ggzIdWqtLs49mkCeZdRtzdXrT/P8c2+wXN3l+N4Wiefa8x5VjNnWGy5d0jRbie0miKJnsqfBwng3MNb7FPaCO9/pkb4CH7F9i5KabAgmSy0QTiJUjoyOQyUJWclLleZhveDWy1/h4PJ1/uB3/jV5JgleDw+rHIjoPOW0vOvIM8knnzzE2uStTraQlDfTRqZSDYGm7clySdtajA442yOiROlIkRdIqZ9oBh97hLVKh0IpNWWpaJuWoqwQaAQmGaOCI9MJqh4G64fWmhADkoQpEjGSlyVKRlzoKbIxZeUJWUaMGVVR8MUv/8fcv3/B9oOj+QAAIABJREFUR++/w7gYk+ke10VmxQiLo/eRdbdhMt7Biw7fwfKk46mXLlFmmuWm5dL1Mddvlzx6eMZyWUOoQGq0Tr7n2W6G0ZKDw4oH9z/gB+98iBQxoXFyTZ6PmR1O8PmGYlwgyWlWHfQlyhQcXB2xXrd8fO+ErDRokZHrgl56RJemGHXbENLLQJ6XYCTOSDCRbCKQxdBSDgIp0so7yyeMywofO3whiLIgek9ZXqYoBb1rCV6mnJf3uGBBebRRQ+kpTbGsTT/XxcUFIVi0MUwnI249NSPLI33n0lXJK9abJmWOhKbtGtquHQD3EiVBKwkBtMpQ0iDEkyI/ApFQQiEync4oivQhmLzvw2RnyKfGYfqTLCiGGzev/dDU4jvGoxEiKuq6QxnNZFYhB5c6ATarTcpMx/S+UZkiKkkUgzP78eEnepAWhEsYFjw+JO0nUaYPadKEW0QxTKbjUBBztG3zBKcF6Xs1xgzvhVQQS23qkqZu04rTxKEFn0pZSIka2vtiWJl6KxBSYlSBd5Kuq9EGxjNNXhr6TiKRTKYa72C7scx25lRTycOTj2ibhkxrguNJ5tf7kFbvMk3Q3EAXSPlck3K+Lk3eQgj0LrBdt9htIFMZk8mIQMflS1d5880vImXPenVOplMDWGcDA3WYzEYGta2KhJAKUQRFkRfkeUbXeqQyjKZlmtoMmWDreuq6Hop2OmGihoMugBi+fiHSa9RZ+2Qimzip8t/hYCYjln9yCEv51oQRSrnogDGKssrQRqCNQCo5cH1TS1uqpFq1rkVrQzWaYHKByXK6OrBaNGw3Nn3mFQV951MDOkpcp1mfNJwfn2G7jio36OjAgykK2jqyuzehabe0TQOIJ0MCrQp8sGQqgz5HWINRqayzWVtC0BgFWVHR+55s1KKK1Jpv25amTpzcp56ZYLKOi7MWJTQxpOFBgrAnC5G1lmpUYLSE6JAqXdryIktlLNKEtygqbt56mtPzBQ/vH3N+dsZorAGJQNL1jqwQWL+lHAVM6XFdoN4mXmtRFASX+OjeW1xvEy9WWbTOiT6QZeny09tAZQKuGSEldG3Hwf6EfKdk98VrPP9zVzhenRLqc07vWJpGorOcKs8ItiU6Rzl1CO2ZTiqqcc58co13f/Ae5+cLdJ4uWK4T2D5N7U2m6bvIx3cf4KNjXE7pui33H9wjRMdP/tRPMtvN+OpXv8q3v/tW4pxGP8SWLCF6urYbtgbqSRb/iX41xicmrBRvUUN+OkVjbOfSxS0+xrVBPtZsVjVKKLwVPLrf0G8MbjMloJiOCrLRhslkyurc0vgOn2+hrNm0Sw72Czbbhj/7fz5gbz+H4GhXJePLDik6VqstIabLn8oDWeExeTq0ZzpHCEXbtZhMoWRBWZYJS2gzMgObTTP8PYHOHd5pjCqZjEc0bfpcbrbN8PkeAMl4MsVkhn/4X/wITFT/8T/9H792urzASIutNMvjlu70HOsdXkkqbXFWoFRS/CW4sRuaiwkpLqMAkaUcTN+ii8h2M+XHfsry6tMz/vhPDf/yXxwzvzal7ltySqpqh7U65Rv/5i4FGx59coLcNHTdlm19yu3dWzSjO/yb3/1DppMJ2eiM3fFtTPD0/TJNf3owuqIPHVWV8fHHD9Gq5KVXbvHBB3cSWH5vzsmdntf/4ghdBc4fRA4ODnBOM6s0PgS+9Y3I6p7l+WcKlmeeD78dmM1NmkYGgck0VnicSoUO30dKH/jiM8/y3Guv8cFbb1N7ydFpy8HVa3hXUcxmPLpzh2Ks6DuY7YyIIlJvW4wqqbcNo8mM6CzExGtru57xpBzanHZ4wKYsVzVKGcx625Hn4KxgNBrjnKNtu3QjHU4kUiS8RQiJNJAeyj/8ZZ6MJkM2Lg6A8MfYmrSuk0rSdS2vf+ZVXnvlRR48eISXQLSsmoZNGyhCx2x0wMuvvsbRgyM26xWbbc9FtyFKSUaHdwVtv2VnVrA/forGnfFjbz6Ht4LrL+ywf9CzXNRkasLu7BqLsy22FUyqOcGtyE3CbFVljrCKzYkjj2OM0rTbjs2yo75o6boepStCyNi0WybzkulOxfQwZ9m01AuPyjVRC4RLQfa+j/jgMVIiB7tayt5Hmq7BhYALCSOmpUmt7iAZa4mOHUWejgGrtsUXllx5CBbd54znO2RSsjldU4eaIByz+ZyqHKeMpoAYOmzXD9k+QRQ9WQ5gCN5hTKQaS47u14OFx9J36WGUFxKTRW5cu8HVy1dSe7zv02pVPM65DQWVASouU3GZVORwRBFp+wZEOuTGGOl7x2N71WPHu4/w0z/9c7z+6Te5+9EDlhdrlIo42yCj5/qlXV546mmuHFxldVFTFhXjaZk2LUYTRMS7DqVS4UsEDwNCyogkChEqlYu0kRSFoqxyYoh0rkuWJYaSWIwURc50OgaRJnNKgckU2gjy3FCUOdY5+q5PazKZDq/WuicHrulkjtF5KosgiQhiMMSQDmUhRrrW4T0Yo1ACnAUhdSqP5p7ZrhxkAA5rBcElfWjrznFhhdY5Wk7SxDs4hNBolaX3tQGlGPK46VAqZJpMxhhRUqSSbhRURcnetEIIR54bPvO5V3jm5duIHEZ7Y9quobnYIJSgdwl15l164GuthjKXo25abJ8yu6k4lXLFUoWBE2sRpJxkkiwM3MbwOC7C8GBPmVLrHrMwGVBLyTSVDt4ptpSmo/GJdtMYTVnmA8IpPPn3pDRcu3aFPM9wLq09vQ/46JFKU5ZTRqOCrlsDSbWdVzDbi5QjSd806cITHTH0iUbjHZ1Lxh5UoChzhA54AS56JtMRNhg2tWU6KhEy8XvThS3FbtLhmJQjJTDfzcmrQNPWCa+Wp4OfFBpTFJQTwareUJTJ1pXpHVwvETHy8H7N+UkPUSFkAGzqJfTqCbBd61Q8C9Elwou3aCOf/B4mXz1cu3aLrk+Hj2qcbFFNnZ7NxhSoDLrWEqMgqwLGCBbnAd8D0uP6gBz0zMSIziNaj+j6lhgd2gSyDJzTjEY79AhWfUvtPFqP2K46lqdb7t9Z8v0/u8e1528yzxtOPrIEkQ7KXWuJ9AhZcvnmAbNpRXQjHj3oWC4uEKpJKvG+H+IuioSQcsPBUpDlScrQd02iIojIl7/0s/zqr/4Ko/EuEcdv/MZvMR1PkkrUOxBhiAZZxBBxEuL/l9uHJ3GVpAJ+zO0VQ6TCQNTDBT/S25Tj9r3H5DNMDlJYRuOCrr9A1pazZSA0CtfA+sJycdwynY+Y7EpyU6EwfPK9NVL3TMaB/b39VAatGy7fGHHj2RGO9Fmsc4WUkbaNEDSZGWOdG6x2kr5zHFyesamX9F3P4eGcB/fOcD3Y4AZ2c0/0OSIYMlUy28tZLheUpUKpNHRMUiBF2zQ/Gmaq//k3/97XpocdsmkIsqQ506xqxbjaIxcOFbcQ9fCDdEn9pyMxpLWFEqmw0/eBGB3BC1A5ddsQBfzyX53xh19XfP3PS/av7dL0ikdHR0QbMOUBt2/ukM0q9O6MW7dvc+lZz5WrGVNR8v2jM6ZXlzRdwCvL6SfnnHxsGe846tozFhN6lVZMwivK0rM4e8hq7RjtGpbnNSqbYRrPy19uCFOD7TtWpyO6Zkv0kvFuifZX+OCtO7z643vc/vQeJ/da1ostJi+Igx9dCFKuLmoQktZ39KpH6xFnRw9o+yWrswf86Tf+X/quYXv8AVEKojCYKufHv/QXeHBvQd/UQ6FEp1yoFsMbLK3RlBLDAVUn5I8yON8N9qEMY7InlhLbe8bjaljHQl23OOefgJlDCMlHPjSkqzKj2W4JPuCsR8tk/gqDOSaNjdMtXoqI7Trq7RZferanjlJAQIKNrFcbbIBPv/5p3vvouxw/POPqrcv0rcMIxcGtKc3JBnykmO8xncxo6iXzmxlmFtkuPXs3D8lzC9piXcYLL99CmRznIpk2aLNFqoImbgkahLRs1i1RTpjuFQTbkU0i1aRCALNpxu50xqMHLR7DjRfmKO3p6m26GceYBAkGtPJkJiMqRfCpXZ+bbFjnizTtCzEVqmQkzwyKZKMJHqSasN5Eqp1Dqq5jpiSHJvLK9ZK1lLB8wBuvv871Z1/m6OiU3BQQYTugs0aV4fKlWZpqDbpQ7zxZlg5XbR0Qomc6hbxMN/0YUlQhLzTe97zy8mf52b/88yzOF6yWq3TYkGI4BKWHHTFibYLLj8clzg1GGOmIMv1uZ3lOWWQQk3KV4fCRJhAZZ2cb3vr2t6nrMybj9HvX1pHd+SVeuv4UO3lJZUp2ZnN613O+vsCKSOstlVRcn+yRa421PSLAbD4lyHRAzXJPPkqgfm/98P/UdG0SVQh4YsqCNB2tqqTW9CFlz2JMIP/HUPQQHiNa0qVNSkkUjtlswng0JdMjtMroXYtUCaEUQmKbCqHJMs1kJznjtRYo7XE2HYyF8vQ92D6txqtxzuGlaxxc2sMUHYElk8mMtlEsz9foTCCNpqqmXLlyhaLK2NZLGGD9RAHyh9GGGALWJhkDQtI7RzUrmV+aEUyOVxnn6zOOHqb1ZL3e0rU1h4eH7Mx22aw2w6ozTVGFBB8iSmUcHu6zszvl/HRJDBqjJSYTaJlsPsmoNJTyhqSFdSlv+Nhelj4LE00ihLQajSGxbx/rWI0xwzo1Wc4IKcpRjgqUThPlSCAMkoo8L+k7x+npGV1nsQNrtshLTK6QKuUXf+zHfwKlch4dn6K1oWkC63UHPm0suqYjzxLdICs0QoLtA7QOFxzBK6QTFBlkhaZvWwwKYwR1vR4sc4lgk2UVUii8B6TCBUE2KZC5oHEtkHHz5jVmc8PivAXZp1KOi5Rml+gKXK/pGkewAd8nAsCV6xP2DsecnWySitOkZ0wYcHUu+CG2kbBhzgWUzogEettTVRV13XHz1lNoo7hYngGe4NIFs+sszgesDzivGE8n2L5is0q4LKMk48kIkwVC3KKMwkXItGBSBdrW0fYRR0AGzbQacXG6IdewOxkhMATlQfVEK9G2pF8byjjh44+OqeuW3fmEz3/2dZ5+4TY3PzVjvpPT956TR2d0tcfGNTp3EAyhLwZSwQ8B/yDxIdC1lhs3bvPa69c5O1/jneDV117j/v1H/LP/5Z/z7e+8jbMNSveUeUFejKjrRGTIMoM24Hyb4jQDhxV+qAZOFIDHODyVtgxdm7aUvh+e/RJiQJDT9g1KF2RqxOnihC9+4RWmec22q7AbR9cENILMKWJdcPaoZXvWcP5ow/JRy3OfeYP57oTF+hNc9HTnHfVWsWlhu/R0XaBrPV0TIco0FcMScAQ8o1HB5etjmvaCvktRjrar0SpnPKmSJCBaCAIpI7arOTvesru7B84PlqqI1jIVF0OHd+5Ho0z1r775P33t5rXr2PYKZ4uco6OzhPIpx9TSU4UNIcY0XSRDSs14LHGuxzmRigBZTKs7N0JnqeluVOTuBz1f/RtX+M77Hb/7Gw078wpTBkIjiB10IVCN91DxAGXnbC/OeeX15/mLP/0lrt0quHv0MeszRxYFQbRMDj3rE4HuBZmsuNiuEMqkQ3Qb0MphMsVma3nh07d580uv0apjPvjuMbdevsTZccF8Jvno3Q2T4grjnR1OH63QmWPzqOP8JPD2tzdM8xKdeTYrl25QGFRI0zgf0wfG/PI+l1+9zUEYI0xgfmVEtl4xzaEWNbN2gQ6ObGefH/9LfwWlJ7z3ve8T/QajKvIip8wdXdOzs7vD/t7eoMYLGGOGJm1SbEoJfSvQOuW/2japF6VMq8vHDER43GjUaJMeHFFEtE65Jq0V0Tu6tiUzhiLPKfIC1zu00In5p9PaNLiUvRqXmpXtadY1o6lmsnOZvq6xfcv+5Aqvv/4m7377uxzd/4i2t8jOc+XSPnKScf35EbVf0XjP7MqWa1f3WTQtp6sHbE4jfRxx/5NzrPU0nefqzetcLNccPbyTpjHOst7KpIgMBvqAdw1VWVFvHaOZpAuGIDRZHlmcrDj6qCZTkskscvTggh978Wf4hV/6S9w7vUu9WjGdlrRdD9ajxzmI5J4OLskOpBBP8ndCKIKRRK3QxYjaWTauY+McdYC1dTyzd8jhoeBSFSkDxK6lVwU+H9N7eP+DY7bbLcEtyIsGcPiQUE7OaWKwRGxqHQeDlA5jcqqiwpiOaiSZjNMBIWLT9EaVNGt49PBD/vhP/pCjo4eJaxgDUqTVFtGjtESrx8rKhI2CVLarRoaiygghtYSlEk+YmUImzFyC7AeUanBuhe17nIu44DBZKm01zvPK5z/Pp978LK//2OdZdw0/eO9Dui5B3V946hk+98pr3Lz1FD/xlS8jlWZxcUETWjbbFa4HY0o0Oa4HZy3WtiitmM0rhPDYx430mKxGXd9hbeJF5nlJCHGAtacDXySgleIxbN4YjVTpv+36wGbTsK3XZNnjQ30YaAA9IUKWS0zuh0uLe5IlLKqMpon4ILh0dUxwEfwe5WjO0cOPWa7OuHHzOl/6ib/K5cNb3Lv3EZvNhkBamW42G7y3EAd+6BMMVBjIDcn4RRT4EIbtVcD3nnI0JkTD0YNj1hc1WciZ5SMODnfZvXpIdNCuG0pjEDHFJ5Q2pBxoajx3XUPXJV6oiAx8VDf8nAckUPAoKcmzwTgoH2dgf8izhERWSF97WqPKQSrweHLlXBIfpNc/HQKI4QnXNUU4EqHEDxcLJZNtKcuL4fKWUF9BOBJmCI6OjqjbLUIIjM7JyziA7ku6toXYJ3mCTxcB7z35eMTVFw35Tps4s+Qsl448q5iOC/quTt+fTJN8az1EndBPUiaKBIK6Bu8lWaZZX7SU5ZSyMiwWG4pKpCa2zmm2jtVFjRAOQkT6SBSOvDDM9g2HV8YDzqtACIuSeohqAKQ4Q98Hmjq57Z3v8c6S6WRNs33PyfEjTk4e4vqUk5VCpqEDfoj1CrJSMZnO2dZ1yiVKk8D6AbbbFikDRSkwUpKPDOQWbzWhVkgSqut8vcQUGrxgu6oR0aQJulQImyFjy+r0nELtsbe/y8svv8Dlw0t88MEdjk5WeLPi3scPePcb9cDp3RI8SUzDmtFYEpFs1w1NnbBct566xu7ujL53XLt+m9feeJX/9O/+bb75rT/nc2+8zu//3u9z9+N3cN0WYzT7e4c4FzhfDN2NQrG/P0+XnkEl/Bh99riolnLA2ZC9TkId53qUfqwozYCBbECF1gVKOkLYsnOwy3/5X/0KVTXm7W+9z6qTeF+zc7BDvXX43oLu8V7jG41UlqqYcV7X9NstSlRsG4ldt3R9ZLloEAi22xYlBN5FJpMpWZFIM08/d8iomtP7mtFEYvIRCcKgiFajpUnSFeuoqpy+C2gl0Krg9U+/yXe+9VbaXEmDDzbxjSkgJsTaf/urPwIc1X/2v/321/q6YrFQLO8+om0cXjboKjLRY0R/QQg9AoEKFcF6dNEhZCC6gugkTkkyUSKdIwiBjx25UZw8EuixYHxpzu/8X+/jtgvOl2syOWJcKVQxobeCzfqYqa6oyhqH59d/4w6n6/vEdeSD3zsDteLg2Y7Q7jAWgvnOmFV7QaYLZLBE31EUGflIc3HhaZ3jk49OqWY9N26/xO7ujLe/ec7Z21O2DyV5CZmeM9u/xPffesBqvUJtoT1rsLWj3tQE1aNCRhQeTwIvRxFxQIbgmZs3ObhyyHvvHLHoDE0/xakR682Wk/NIQeD6zR1O25aLxvPh3Y/ZLpZUGezsT/FxS2jSLddZy3qzpW06/LCebJp6mGoI2iY9DJx1NG3LdDLG2gAy6UCTJShNJ/xQBAghEQJ2Lk3QRuF6R985gk3rfqWTOo+giD4p2HSWGH9EQd+1XN4/5IWXnuXuvUdEkZi1fVcj0ezt75GR8/prn+ed777L4mJBWzvqek1z4Ticw+SlnJu3X2QmBa3PuFgLdHfBjWuHaDHn/rs/4MatKbpYsd5suDgd09WRKousTrZklOg8MMoCxAZZjtDVFN/1PHXtOp1rcO0WJQIilDQNPPX0Ll/5mc9yerpA6wl/92//fcbxBX7zN3+b3X3PjWuX2PaSYjRBhA3tpk030EELmQ75Cmk0QUlC34ON2LbD2i41zwXJla0U227Nve2aB7VkpHcYZz13zh2LpWezfkBQ51RVy/VrGWURqWtPDCUBhZSGrusxOufgclo/GqMYjSqKsqdtHa4ZsV0JlosebSLBC2bzittPX6dttrS2piyzIYPohrV/urgkhurAo5RxQJol4HcUFpMrCGnNypDjSm5xhbV9OsAIiZYaSZIAeB8SA1ZBFA2L9TkPT89AFjw6vuCTuw94+aUXuby/x8XpGYu6ZrJ7wKtvfIEbLzyD95bT4xO6fo3yHhllWnlphSIbEEUCbxWuD+zv77K3v0PbJpD3bDZBCEHX24TuiWnal+XZoPJMWds8zwbweTr8aZW0osT4ZNLio0PrDC0LQDzhtSotk/zCJ32sIMNZTQgKnSmuXL/M4eElAj2tqxEyYvuezbJnu4KT44bVakO92bKtazKjyY2mKLKBsSoYlVX6nvXjWINP5A+hhjVoKnnFECBKFIZRXlIU4JyhQyHmAVd4hMnIouHRh/fYnF9gMpHUrD4Qhm1YsjulUt+VK/s8/ewhTbclhvTPwpOijkyHaZEwUeHJRumH/NTHjX/gSXQh/XUc8u2PsWeKqiyT6Uelg0D6xEvT1DQ5Tqv1NKwNFHmBGnSjbdfgXGQ0mjCaWo6PFzgPWRHAp+a87QOLZY+1keBSu54gcNamvK/QlPOKq9d2cdGxqRW7OyOeubFHrjSb+hRnIzFKvBOJKYpMZiXSayB0JMtAxR4VHKG3CdiuDBcXW6xrsb1DMESnRFI7F3lGCB2jLOfS5SnSCNYbx0c/aMhNlYo6vUv5XpHWsUVRpgJt61AiKTBHo4EdLA1FlhOCRan0tWW5IcvTITUSKCpNVih04RhNBBcXLUpWTGbQ9Q3BZfRdB9I9MR7uXgk0qwzXBIzKCTKkjwlyqjyhBnUWCUJTdy02evoWUD3COJzXWL+hXnvWFxdstgvatsUogejGnC9rbj4958WX9nnw8YLnX7jO0SdLujpy+/Z1nnr6Fs/cfpZf/KWf5T/4j34BISTrZc+NW9eZ7kre+f6St9/+BGNyPrl3h9XqEbb12NaiRcbFcj1oUwXVqEBrwXK5pGsDIiZBxuNL0eN43GPuqnOO7bamyMeE2CNlpCwqJpMpy+UFxiiiaNGFRHQZOIesDvjSV36Rf/JP/nuOHy0I/YaRqeiaNX1j0EJTlem1NRJ8B4XJaO0F9qShPrFEBfR+4OimwdBkPGazbRmNS4wxbNZb+iZweGUPBGzXHesNSJGlTadLZJdu06E0HOxd5cq1A8qi4vhkwZVLt2iaM86OF1y7dsC23jDbqRL6TyjqpsGo7EfjoPqv/vDXvyaLnLNzn8oBhcZ1jt1L+/hSQttQ2BXOa9AJmB2VwCg1KNMiOIcPEffE7xwIaLrOcv8Dy+4tw1vf3KBGcyqTE0X6AA55emOM90u8LxlPexaLh8h1TbQt/Ymi3S5Ynlmkzfjwm5a/9tWfZD6teO/9e+SzVEhxdkw1y3jjS8/w7ncuqPICo2BaBfL9ClvNUNNzTi9O+ejdU7YXkdNNzenphlJK4tbjmgZlkoYxy7KE5IoBKMikwImOGD2qFzilyfKM5p2PWZ+cYndHnL57j5//T/4GerLD+z94m2w2YVuUNNWMu0fvMD8QTHZHeFFikThAjwpEEEgtyLWGaEFB24GUESMEusiQMufK1SuMxiOadktR5kQnEiNTpwJGMpuExNYUyV+qMPRaonxOu3WpzKMZQuMx5VVMhlApGxbtFh0VtpNcn5f8nb/+eWKxT3/eMR8LTk5WjKuCPvQsLlqm4ymvv/YG73z0PkcffMTn3rjMZ778LDc+s8uGkvO7njvf/pjTky3bC02zbdh0K7o2MB7vcXHhOD9tGOl96AT9as3+TBCdZtvW6HHg6U9Bu8mwraDzlqAaTB7pmgypPD6mhme9aYgxMjuccHJWIww07ZI/+e4H/Obv/J/U2yOi6nmwaGm7jHG+i5Ewn85pmhaTC6RJGTG77clkTmGGCX2dpgE6MzSbjrKsODyc09oNF0FgvISgWOpIORM0NpLJiJSecTllby6ZjQoWZ4JtlySgmdEIXxOcRecTbjzzDE3bMQ7Qh5KuldBbrt2KTCY9de/Ynd0gcxn7Bzf5O//Zf07drXn06AH11mH0GKXME5h8Yi3m6XAkwTmwztM0Hm3ypCZ0AWky8jJFTnCaaA1KGsqipCxHKJPIErdu3uDG1at0TY0PXVoB+ogQga5ecrFe0EXJ3v6Ey9d2OXpwysn5fQI9To5YrgNCVSyixTlL0a4JaoPMJZmSlFmOFGmyGVFkecKzWNeyrRv6dkDEycB0JyPPFX2TPPUCz3w+ZTTNUzGsB4FHy7TS90EnGHzX4kKP0QVFNsboMVmWDxlZIAiCE+kzDkU1qiiLDNc0dK0n+KQGrbdwtljQ9BsEIV1kGvCuxtuGi7Nzzk4e0LsNSmbEKHCuwxiDVokQ4YLF2gikMiSPubUhMqi4SJpThY+R3rYIBZ4CmWUURaRdd4l8Um9ZXGwxZUY5KsgmJdXehLZ39NuePNN4kWD8wkdmkwlPP7dPWXqW5wucVUSfDqxSJ0KE69PaM7nlw/CAf0xcSAxKH+wwAQ4IIdMhWyikVoSQWJJKpWKoHOIbMQpiVEliUFWEIWoTI5RlRVFVtMP6H6FxIiIyyfVbh2zWK/o6oIUnBvXEuFWVI8p8AOuHHoRHSIlUmjzTKA93P1rTtoGrNzIuTjYsFzVtHdKFP0JvFSL2CGHpgqLMJ4zLEWhB0yfMjyokk70CL9NBdrNaYTKY72YpWjXS7OxO2KwdnoiPfbroNBlt29M0nvHM4L1juWjRskergkAgRp3eVyqVK6fTgjyPXLp8DWFy1psGIw3IYSvjBV5G2j6msmnVt/8ZAAAgAElEQVSlsNFjSpBZQMmCg73LTIoZR49OkHRMqxmohmqu2KxBSAdWM5pXRAnWFVhfk40FWQ7tNnDj+nXqbcOmq8lHOaNRietrhGO4ZBZUo4hCEFzN8fEFZxc1623D6qJhu6l59rlLPPXMjO997yNe+dQLfOr1m9x86hY//Vf+As996kWm89tMZnucnl3wB7/3Df7g3/4eR0dHnJ8+4uT+kgefvMfdOx9y/PCUk+NPmBRTbNszn+8gjMPkBme3w/RUUW+3gAYUUQaMkoSgmO/NyIpiIOGEZK6THk2FlB0CixCaECTlOCeERMkIXrIz38GRBnHRt/z2b/5LYt8znUzY371Kbz31pkeJiI8NTdNjZOIFjYs5ZDA/DFgi9TaC3xAFOF+RlY6RmlLMBLa2ON+zbTpG1YSnnr2GN4GTowt25hOa1YroUqmurHKQBTev32RnR/Po5IxitMMzL7/Cne9/QB1qurChNDl1d0FdK7JcUVSaxXnD9RtX8bHh1/7Bj8BB9X//rd/92rf/+C0+/M7HzA/3+fjeQ0oRKLM548s7KN+yOjsmLyv63uOtBxWZjCva1uJ9TE1xKVHSJKi0SE3q4CN9G9DjHdbrkkz6xKDzGcqUoAyzvMB6Qd827OxeTpnO+ZQXZjd5762PaETgzTdv8t7Xz/jiz13nS3/zdf7ot+6yfnSEtIZAhhSe7ban2jVEJTh9cIGkBzlhcnPKJycfkucO3+S89NxNTo9aqnHBJBesLzaE3g7sTEUcsp0MWJ8QOxQJh+VtaoR3NIyzwFUdyaZXuPGpp/nFn/9JXvv05/mz3/8ux+fvMdId573irG55/qWrPP3sDe7cPeds1VDtF+xe38GZEnLJhW3Zu3pA35V425IVjiJX0Gs6n96Q8/mUrnWs1xtc3yRXr3WYTDIa5XjfIlVqj2RZjtESqSOTcsLmfJMeQkIkQLSI5CaV44LomY4lo/mUKt+hnJWs3JLPf+5VvvjlLxLlnI8+vEOQHZvOsr93jboRtN0FB+NdXnz5Od75s+/x6mcyxvsTFs7z3tunfPzNI04+WSCjpO8Cm+WK9dkCLQpyNUIQef75A8Z7ko/vH3Ht1nWyUUs0His3FFOPLiDYnNLMOT9ZMd3LcF6RGciKSJ5D0xtknh5MPvREr1kuNuAztsuO9fm7jMsalQk6GzjYy5kVmrZesQ0rRqMCqSMWy+7uiOdeuo3ZrZCVpa5tMs0oTTkqkTKxK3ub1idCZijrsF7gg0dUim2E2kh29vYp44Sdw+dpfcmdD1YsXUfEUlaR8a7hog6YXLKnJaujFe2jJXlVEvNALhXTmWavbNDGojOJbTf02w3b9Ybf+rd/wJ2PPkFriXcx6fOCSxEcndBizva0TWC97iEmOHRRZBgjsL5L0RAl0KUcijRZWq13NQLS911kNE2LFwlTtF00jDLNzrxAackrrz5HEDk7OzOuXpkznV2jvoh89P73Wa7XaMbUi5rN2X3e+vqf8u533mGWOfKwYnHeUTeS4CW+z2iajul8ymQyJS/S4WmzsfR2eD+iaFvLetWmzY9P1iqtMvKioOt7+jZ508syRymD7yLtumF3OmM2ntM1LVkmKPKcm7du8cxT1/DNhn6zRRCwOLro8K5HeVCC4SBhiMHh4wYfaqClzCv292/ihaAPW7Qx9F1al3svB3xWKgzFENKK2wVs31OVE/Z2LyW8XKbIjB6A5MOhcDBwgUwkhRjQJufg8h43n95nPNP0tmZ3d4YR6dDW2YDKR5TjOcZU7EwmKO2puxVGG4iJQDAZj9nZKZFKUdeOzbpFiFSSMkYNLncoq/IJVipl3hOv9YndjHTplVINuuSU8cyLLOVEM0PXtcM09rGwQQ42sjQdh0hnI1J7skrgo2O53AyrykhZ5VSjEi0rXnr+JS6Wp7Rbmw54sWUyr8iynLpZ03U9ZVmSpAEqRZ3wZCYnKwxN3UOQlLrCdhbXp66Fc+mAI00PStO1Ah97UCGV1GqJCwGhSvJyh/WmSa+DEEk6IwZaRFSsV6mUqKTEdwJvDVp56rZB5QadD1GurkXLQN96Ip681GkCPhSnvA/U6wAxw4VNKo2xJZBRjhXj6jKbiy2ZtmS65Px8g85FEkWMp4nN7QN7+5f42V96E5Wdsd4syAqFySSRHiVz9vdmPDpOWx0RUrSnLDKywrM6t7QuURC8d1SmICDpnCPXmiAdQjokFQd719nf3+Fv/a2/xufffJ7LV2fcunGdGzcOePW1T/HSy5/liz/+FW7eepH7D5bc+fCM7739Pb7x9T/nj3/3T/n2N77F99/5Licn9xmPR0kIkjUok37RJnsS9JboA33rcGxRKqes5kgBbZum+l3XPsE1CplIE5nJ6XrLL3z1q3zhC1/gu995C+/Sz0EgyIsk3PGO9DkpIuvNknE1oa09eZ4EC49jcel3OyOElKlfbRa07QqpQiouE1FmKJsLgyxyDm4eUB14RgcNV67u8/D+CukNRvesGg9ZKnGORoogDdZbpEgWss2moXeO04sLHFAvOwyG8XiPcqyxmWSx2LDZtFi74u67PyBGgwyRqD2ht3QNCFFiu8DObo6LG3JTYfueX/sHPwJlqn/4j37taw/uPGBSarr1iulUs391zMHBZa5enjHdmbE4PmKzWhGDQgx2ESM91qV8UIweqdIaSww5Me/TBGSzCgg1Y7Q3YVYZRgeRZq3JqinTasp5tyYuz2lqgdGRzEBoNR/fvYttz8jGkTd+5ie4/so+zfV3+frba8SFZH3xCMqS4GomStFsPXvXJ/z1X/oKf/I7b6NNZLJTcf7IcfNSxYd/doqOmtfe/AxXbh/ymTdv8a0/ukfsG4L1yPi4uZpSbkJEHkPHjdDDJIBkWClzlFS0i4b5red4+sXXuPf2R/zfv/5/4E7ep9Ata18ixhJVCGwDF49WCNfTbVdU2YhRUeHsCuuXyKzDtpZu3fLSc5/CeUsbHJuuJbr0AFtcPKKuG3Z3ZpSlpGl6JDmzWUVRGvq24eDwgLru8VEmIHWVoXoLWLxKOS9DSIdgEQh5xlgLhHcszjo6ocn3I/tPlYRM0BcFj+oNfb9CeMf58YIHDx4ymuzQNS2zMuPGi88j3ZLXvnKJD+4c8c3feh+ahiLLKeY51SRnvarJS9BlRlHllBND6yKf/cJr7O/vc+/oDst1Q+c1nYvML3n29sbkZo/1QrBdnxOcog8O52MC3DNms27obYft/f9H3Xv82pam93nPF1be6eRwY4VbVd3V3dXVid0UmxQpqUmKkmhKBG3LokDaECcOhAFJJmAD6pEBGwZseWBDtkceeuIRYVkWSNtkMzQ7V4fKt+rmE3dYeX3Jg7Wr4D+BGtzhucDe+5y9vu99f7/nYWe+IC0CdsvozKaS2aKg3HQ0G0uWTmi6gcPTHVabmlW9ZmevYO/EEycwi/YoK0vZtfi2pu8dvRuxJ0rHW8/8iNyJ4wihBf3gGYLHBosyhm7dg5gRuYbbc401Ka++/mXqruPB/UcE1/PS8zMGa7i8bklEwV6ekwZDoOILn9hn5TTrSuOwROnAoRL0TrCqFRHHfOkLf43L5TXLzSXCQ5rFSKVoux6lxtyokoooisamezAj99iNjVal/bYsl4yTRmKyfIo1itWyZDaXpLmjbQybVU/ddNv86oyToxvkueHuzRt8+Suv8cKLd7nz/F32d0946cXPkMYZZxeXvP+Ttzk7v0LIGNs7rK05PFiQpTF1WRLM2ECvO8WNmy+RpTujuUaOBSnjWsqywtgWIcRY8MJu0VYjGD/S0agr1dAPluk0Z3dnTltaimnKrbt7NM2oJn7hxTv86q/9Hfb3D3n3/fu4YCjLGqVS4mTKct1QdgO9NQQf0IyHOuPGYorziq6x5EXO0fFii9GyFHnM5nrA9YJ79w4RIpDlBTdu7lNVJWkak2UJbVODGNmmY4EjMJvN2Ns7JIpiJrMJwVvartpePCwijHEj5+z42r3HO0ExTXGi4Xp5hVYRcTKh7R1VuaLvGuaLjGKqsL7HS49MPFIGhtqMcHmpmM0nTKZqW1yCatOOaJ/gUWosPhk7Gs9GhJYExLZsNBZdpBRbBi9j8WM7fZ0vFiNBxDn8VuFJCON6O7CFmcPu7g5JptGxYr2pSNIcQkLXeYpiRpYXuGDJ8gQpLb7XuG7O9fUZOu7pzRjCstYyDJYQLJNJDmK8vFvrCUERvKRcl0hpSeN8jKgFT9802N4hGPWlUgmm+wkyiumbcTI5P4pQaSCZDgg14MxAs67xxlDkU7LplChJwMYo7fFYlEywth8ZosITQk8/QJREBDUKaerNgLMjFxnhQQb61iFljFJqLAkKS14IdNwirQUUydQjIs/B4Sl9o+nbEtNEWN+gZIYXht29I26cPk87rEA4NlVLPYz2xqa0mH6cBk9mCqkHnNX4MBBFAq38eGAXCusaimnMdCZZrjumWU5wls702ABCGLyEPJlg7cCmXHFxsaQsc5CH3HnhFbL5ApVFfOub7/Gdb97nz/74z/nDf/mveOdH7/Pk4VOOX8iYH62ong4kSSCOR0Nb1xmEdOwfZyyvRx1oPwxIEbN/XNANHcGNU/myuqJtK8IW+xbFAoHe5qNBiBEN6YNjva754P13OH92MZZbxYCO4rE4KjVxnG5JFoY0S1ktNyihURrKctTAah3RNM0Ya8lz2rbBWECk4MU2upcQ6WRrYvMMrqSuAl1nuLocwI2wfhVNcWJAqgQjIZYDKgqUdQDvMLXEhkCWeiaTOXjL0EheePEmz72keefNczCCq/uX/MIv/ixf/sIrvPb5l/jy5z7Ds6vHnD20fPozB8i05/IpTOaKZt3yla++xmZTsbyqKCYz/vF//G8Cnuqf//dfX5wcUfXXCKP56i+8zuK5F4jmOZcPnxHnCe1qQ726RokCgiN4SZIp+mEg0qOlI2xboR8bZdyYH7ODQsQZQWvyeMYrn/e88+YF8WxFlhjatUWQkBaCL//VhMM7ik+98iKT44zlhw16Z5/zZx1J25CowONHT6jPN0Q+IPsWT8HK98RKY5uYneefI5lMOT5dcPrZ5whxwwfXS/ZvHnP0XELbBn71b/46l2fw4fuPsE09pqdDGLlp2xXVtmQMEqTWmO0XrRQgs5R455CH1yWPN9c8ffaM66s1S1uzkBXT3Tlvl5K0aGhtwFlBuWqpqpJikjMYx6bZcHiyx63927ihZ71p2DueksQLuk1DdbUmSwRpMtpIknj0Pg99Nz70rCBNC9q+pe/GpmSWz9lUHYMPLPb2kFoRLSSRNkwlZEVGaVoi7ekGSyRiit0Jg4bZNGFxZ07t1rjS8fS84sc/+Alv/fg+r3/pVW6+eETdOjbnHmuWtH3L7PgmL9/9NGrHUTrL6eKUsyclei+ibhpUb1g2a6ROSJMFQg2EoJCx5PBGYL0x/NH/9X3qTTPqeDOYTwuky9lcKfwAbdeQRnOkkhjXk6QJBM1mXdEPUKSSpiyxrmEwPVVbcnrnhKZb09aKfD6n60r8ULLY2eHhkxWbtWUSTxnWEMION24eUbGhq2q6ZYdOPPWyQeuYYlLgzIgn0tuykQ8WLx1pnpPGkiLJufnSPp/7/OfIFhlaVVy/c41QM+pu4P13v0/XN0x0gosEG+MwG8HdAw3a8GEpiPIUphPqMmazWeNMS2hSEq24bATVIMfCV5SRzxOSSUecSobejZxVyXaKAEka4ZxhMA4XBFolJJFGCPfxodUHQ5wppB65l9ZY+qan2rQ4E2GHcfUdZyPfcbNaU5VLvviVl7lx+xRIkGHKatNTZDlD54miGTvzCfff/QnrsiIIT1WWHJ6k7B0fkU/3scFRtS3rpmU62aMoprTDE7xYY4zDmB7nDNPJLnk6p+vGw7ZSMYII6x0hOEKQ22b4eCivNj1dVzGbjxYtZyOqauDWnZf5d//BP2JVrnn05D2iOHB5/ozgA9N8B2scZ1cP8dIwn8+ItScYh1ZAZNBxwJieKEo4ONgnTXOqaiCEiJ3FMQyO7nrD1dOOi2drimxOnh5wdbVhvVkhcEwnBSfHx6RpStfWo/oweNbrFRcX5zR1CcITx9sy21a84LbudinGnLF1HqkU88UuSsRIEUMQtGWJDJ6dgwU7Jzs0XUOz6dksB5J4SpEtMP1oNJNSM18U7O4nSDTWwGbTYIwj+DErGmk5TkjDRza1kfXqrB+ZqMYRJ3o0nm2tU4QtZ1ipsaRlRyIDWxblR952tvg048fSHIxCjSiKt4VAt8WTOeIoxQzQVR5jex49fp8gPGbIODg8opgPGDvQtd22WDpeYo2xaBXhrcN7S5ZNydKIxbwAH2jqDVKOLG47KJSU5JOcLkiqvmaSpRQ7Odm+RceSREb0naaYLEBBns9J45xqs2ToWoauIVhBnhzStCt29wrmOxLBmDENAnSUkKUpbddsRQYw31vgkXijEcqjtlB+fEwxE8Spxw+C3VlgeTXQdJ7BSgbXgFphB0kIPYTxghqn46H/0eOnqMQRxRFt57HCMPSBR+8LPv2pT2ONY7m8JtIz6o0e5QK6QElF362xPfSNREjNem3QkccYjc8bdnc9rvUEleCsGjsPsidW6Vh2e3afd959g+/8xZ/z/e98j7fffpv1xUPqzVN8WDOZJmRZYHAd+0eHbK56Vk97dBxhjQChmc4K7r5wjIw8Tx93aAmegDMxg+nAa9p+YD6PybKcoe+REpwfZR/DMCrER3qL3vKBodxsqOvRkOi8BxXojMW5eLQQBoPSAes+yo4KhPAf88nH0vKYYx+5rGNsR8mACGOkQ0ceHY2FLaUDO7sZV1cVUdKxO9vj8btndKUhjXJqs6KzAS0HTG84PcnIJineKULt2D+5xb2XMxpTcn21wpnRWHn3xTusy46DowW7hzHruuJLv/S3+dVf/BX++f/8L/izP3mD6tIjdz1X7w/81u/+Hdb1isePLlkcTnnw4IK2bfAhx8vA7/3uP/3Lf1D9b/+X/+nr82lG39TEyYSXPvM8b/7kCe++9RZPHlzw4QfvIowndhY/ioxoq5Yki4nSmK7pxrWrC6OPNwRG9vOYtzKDRSTjDfL8uubkdOBv/MY+l48Vl08b5tM5T6/WHJw0fOITr/GpvRd5//KM2a1dbh4f8r03vsvd5+7ys7/wVeb7+3z4nR5z2RKkoR1yvApoL9CJ5Pys5q0fvsXOnYL4VPOTN7/Phz9Zstn03L6xQ9vFbBrDD99+h7fvv4f0geryEsK43kNsY3BqyyTdMkWd3RZThMQFSzrNWHclKosRUUy5vGKZLzGFp7xybJRmEClxHLPeNOzvHrIz36HvHCZ42tCyON7nuhpXOUMVCH5JP3hWyyWzNKbZQIfn6Cil7wbm8z2UyMZJXzfgHCQp421scBgTOLtYoxPNdGfKst7gA8wPd8ZsXtPDYkrINKkPaCURJtCGnt4K0kgj8oB1ivqiwXmBMBKdKx5fLfHxPu9+cMYrn5lyejjn6XtXHM8P2H/lBuVlywfvPcTPa+Kk5+zdDZ2VKCVI9Iy+67FuhQSG1vPKJ+6xKWs+fP+MKGpwTiGjCB0Jur5heWmJiJnkCdflOd53OD8gtGWwA0NnPi6ATXdyZospQhTU1ZgLbTeeYaNwzcD68oxMw3QyoW0tmSx4+e4uER1t7XAiotjb5fzZFSqOx9JNb0kWagRQ6/ESNvSjLjNJMowdb9wq0vRBICycLy9ZG41POyZUZJueYCMal3J9fQ55j0JiipSNSInsqAqtLPTe0VvLZOcWr33mNVzXUA7XDFguNgN1p1Fo9ncXVFXLctVwfb4inUxo2wFnxkY0wSK2xqXxge7wVhK8Js0UUeQIXjOdzdg/2qMfOtwgmGb7dHXP0Ncs5jsgFIPrOTw64pWXX6QqG4zpmc12ETJDqJg419Rth1QRaZGitGW1OuMv/uL7XFxe402FC5Ljo1Ne/eTznJ6+wMMPz3j29CEvv/gy+wdHDH1L1Vzh6EBEWAtJLpByfFhrrem3D/YQHCqyJGmCFAIYSOIYJQPBgRIJ00lEUQis9bSNZegMDz98xHtvf8DF0yuePHzM6nrJ3mKf527foSqXrM4esptG7BYzDnZPkDql6SsGE3B9IEs+KhvFOOep25Iojbj73AscHz/PJJcU+TXd0LB/cIOj010ePHifzWY04gz9KFToB4sx5uOi48hNbpHSE6fj4a5ve6QYNaJjqWxscyuZoaME5w1106KI2ds7QClo6grT98zmEw6P9xgcxLpgbzFn7zBDaYlzKXEuMbambwJxkjDbi5FCYnvPalUzmPGBrOVYLAyEsfEeKbwbdac++LFctd2axfH4GXkXPqaPfFSaipMYGB/6PowYK4QkimIG60Zz0nSKc2PExLvxdzdJs/GAN4zDDudH/FVwnmgLhw/eM13A3Rdznj3eEFyGjiRKgZCeJFb4ISBlSpplFNOMSEv6rtu2zs14UBGCJEnY39ulbjuSYsFkFiPCMNroMkHXDqzPPZtrh7UjQrAqK+qmRgYQwRJJhXfjYSZOMvYOZ/jguLoqwU+5cXNOUzVEkUfJMet+fHpAZ1pUoug7TxQHkmycjAQikmxczxvn8QGQMRaHQuHanGYjyQqFcwO4BB0bgrII7ZnuZOg4omkdwecM3mxZvSUPP9gwnUzZrC12cLStYbErKSYxT8/O2dubk0QRq1WF9WakUQRNOlX8yj/8MlnUsXxgcFoQCUesFZ2xCJmS5GOsKE8Vs0lKqmOySCHJSLQg+BiHp60C04MD/srXvsTnv/wl2pXhwePHxHmGEz1JIXAMXF+vUTLFYxlNcmwz9pq9A0nX9ph2LAmm2wu1kjE3b99kuVxz8+ZNDg7nPHl8QZqmYzTuI9FfFPBCcu/VVzg62uXq6gIlJVJr+n7Abe2M4zBuJFwkSbplCY+fdds2xHE8boKcJU0lzhqUKra5c0uU5MTzcYthXU21bvnUJ19meX3G0AaKLKbrLAL4az/7y/zm7/wHFNOGs8ePWbcVh8cnnN6MGWxOMvckMufd773P1cOGat0TTVLqsuLmc3f48M0/p7o0/Pq//Xm+9Yc/4tZnTkl1w5OnMTIq2VwLuqZHR4bJYuD4dsHQwT/5j/4NOKj+i//1f/y6ciW2dgQaNpuSbl3Tr6uxexoCpu3JhcM7gZcSNxiUVnhhsHa8vTo3YmBGe4b4WLknlKUpEyaTguJkztWjBO9OIdQImRK7lp/7W8fs3THM8psQvcK//sPf5+JHK776yz+HEwNv/uQ+P/zwAT9+9B6vvvZpDvdv8uMfvUsy1YiuIlExIgQmsWCSC5h6pkeBUFvu7h0SFxkPHlxSritoO052Utar+yyf9pi6/vi9kFulopQKRNjiQiQKhbcGZECnKXU30NcW11i6pkLFBUe3d1A6cH01sNlUpFFGte4AS0zO5bNLXrl3l+AspgnYzjFJI/r+ikmS86UvvMyjx1dIHLPkEGtakrTF09P3INGUZcUWcjmabkIPhK0zPhBlEUE5iANSgQmO68cr1vXA7Xuv4Hdm1G3DrcnuiKfxFi0N02QHrxKulzXlpicuJCEMIApM7WmWa8qLR2SpYO9OysXa8IWffoXXv/gasd3hsvkAL1oePrzk9NaC0AWuzjeoqKdsAiqWRMmYS3ZC0pk1s11BnA6EkFLMI249d0BdDpTlBrGdulxcXKB1wtFJSlUaAlCuB6QbrUDOe4yBnZ2cphqNNXaQTLM5RTwnVQVf/PTr3D19gdXSMZvvoYQk1Smz4gZpvkfTtawfX7G/m9L1G5IptIPGt26rdBwzT1E82n+EjNA6oS4rhtagvMPSQQ992VBeX1NWM6YHM6JU0nSOdbMheM/tBWhjuBZgfKBVgtprXAi0jWN/MuHe/i6Pz9cMQyC4AeMGiijC28BmYxh8wMuOVFq8dQQR48MIiVbKgduW5OQI0Q7BoZWgmETMFjkvPPc61sY0tUOEnKzosUPDZtWOZSwhadoGYwxl2fL4wye0TQdKY33E40cXmAGOTvdQxUCQHc4ONG1NY2ruv3ufEGJ2Znt84Us/A1Lxxvd+wg++9yOcaUmVwFtDbzt0MqpD3RBRVZZ+GCjylDSJiSKFtaM3XIqIJIMbdw7I84KqatAKkkRuyRierusp1wZrGVv9FoZ+fHhY23B2dkbwipdefpXPf/ErvPTyp/ipn/kpfv6v/hSf/MSr/NRP/zxxusOPfvxjfNhsc4Jyy4wWDMMI6EfCweE+Lgx89/vf5Nn5BXsHL3Dz7nPEWTaWGdUFUSyYTXYoipi+d8xnu9y4eZPJZIIQktlssc1SQpqOOLqPkEwBMTJII7mFwY/GLqX9NqMXuHF6k6OTQ6q2xBHAaXCaJw+vKNc9h8dHCK15+uyCEAyLgynzxYKrZxumxbhxCi4wdI6r5QZr/Pj9J8MWHwXGuVEUgcAH//EkSSq2RU6F1tEoQXHjA1wpsVWg2i3PefuzgI4i0jwnyXPWZUU/DKNxKYyA97b1eCsxxo+wfiFR8iMUYk/XOAQxWsN62bNcNlgj0ZFmGLrtpUyh5SjGiCJFMUmwrsGZnq7e2jYUWD8qWoUytG1FP3jiLGNSFDRNBUHhbUJTl1gnSDOFYiyZxToQRxqEGg/03hJEBLJntltgbMnQj0pUa2BoW+q6o5gqhFLE8YTZfM5VuWLnYEIcgzEdSRZRTCMG1zEMAZ1odOYYQoIjJs0VMhQQDLZz4B1RIsYJnOyJYk2UaoQSeK9pmjHLbUNLtVTEugBamnKDNQNDP2KRxkLXSJRpakXftwgPUVTgQ8Abx2R6SBfDxeNrlo86ip1xi2F7R5QkBNFiRTf+rliBVAGhFIMxGAkKTxARngAu5u6re/SThun00xztKL73xhugHEKPl1LvJV0tiVPApzg/4JxksRfTmZ48Hw1auJF8YGyL1gkvvfQqk+mUy8slL730Emfn4/dXHKUg7Ih8zF0AACAASURBVFa9rEbxgVf88q/8MlovWS0rNqseJVKMtRweHbFab0aNbRDcvHmLsixRaiypdl378WBuaANajRdsITO8jcimGp06NmXP5z730xhT8/DhOXfu3ebsck1nIJ12HJ/MOLqzoK0tTZtwfhnzmddfJtCwrFZUxnPvtX0m8z3uvXSHvPDsHbXszPd4+TOH/PCN93FmQrADu3crdue3OLzzHNmO4ifvfUhQmqf3P2B5URIpxa3nUpJs4PJRzu5exPmTiv/8H/8Xf/kPqv/6m3/09YvrMy6uKzbrNX0LaaJZL3tu3T6hrFuUFKTB03Q1vZVoPM4JJotonHSoaISmawmCEV+D3GoYFaZtmexMyPcnDL3g4klJEqd8+gsnnFct+aDZOznm//k/v82//P3/g/WzNV/9xdd59+0N3/rjtxjqFWZYI9eee/ciqo3m6Vv3mU2nOC/BBRrfEk32+c1//x/y7uMzOq5JzQHHt57nrbefEXkzstp6yYsvPc/p8R3e/84H23UoIEcEy0cj/wDYEBBej03kMN7khIqBGKUi0iwb7Ukx2KXDrgU+ROSxR0Xj4dEiaYcOIQLL5TVdZ4h1hO07qvWSnWmMkCnRtGA99Ex2F3RtTxrWvHwoGeQ+dWnGNmsYG90jyuX/Z7EJ4yrO+rFtGscx09kUZy1apyQ6p3eBq6sruq5lcbiP68eJjQk9XlgqerwbRQ82eLT1aJ8yNDXHd45Ji5wbRztMM8HFozWHR3MoYnR+wJ/+v3/B299/A9s1XJ45ys7iI0u2EMQ51LWk2FFYsSGdpshkIM40iBzvLHVTgkuxQ0RdrZlOYpqmwjrDbLbPwe4pl2cNxllwObEUxJFDxxGxlmihAUuStjRtgxtgeVnzt37pN3jlpc/yJ3/0fZ49vWQ2m3L71j3eefOMeuPZbCq6qwadKPJCElxEksc4SqIoQfWS2zdfROsE43qm8zGG8dFDWaLonMMQkUQZxBG9bxCxw9YN63XH4e4UaSpy13GSK4oYVk7gJgGVGhgGUmakC0len/Ponfs821R4NUf4hlkBWTRFxwm1qZjPd8gLQYha2lZhw6g5Cr5HS4dEkGhJpMGZAD4Q6QyhAi4IvE/phn7L7AXTD5TrdkQ1xZ7BDRTFhCxPMaZDBIHUEU4MmNARvOHy/JzHD5c4N5IS9hY77C4O8Epx++5tsrhgtWl4dnbGo4cPMHYgTsZ8qbGO+WKC9wNPzs+pq47pXCIjyzA4usbSVQZnO4rJFHxC3w2oCNrGI2TEZJLQlI6m6pHSEYLmE698mrvPPcd607Apa8IW8N22BkcgKENnKi6un/Dd732Hy+sNxeyQH/3kPX7/X/0B3/7xe3ilee7OMYlQlOsVvXcIpQnBbsuVUJUdzgju3r5LkSVcL89YbkoePjrnevUQ7zdk+oChUTTVEu8MaRpjnaOuy22hX1DXNaZvkcITnIXgSZN4m8kdv5PG4lLAh2GE4wtQQjIMhqZuxovaMLCY71BMFngFQXVM9xVB1VycP2VnNmWxO6PqesqmJRAo0ojjgyld11GWHeWmoR/cmNAXI2JJSDXKE8I4+bfG4Xz42JU+MnsFaRJvS1p+LHjakWf70UHVhS2qSiuklgitSLIUL/zHU1dwdH1PEB4ZWbKZZDJLsSHgvSNNB+JYEcWCLItAOCKd0rWjjc17SLMU/Gj8iqLRgS6FHp9JIeCMIXiJddtuhVLbOIncvqaIvqlpSstnPvs5TB949uiKWEfEKmW22IMop3WOOI/G19j3BDPgACJDlAWmC8eTxy0iJGgZEyUlXRdwLkZqwabqtqTfnrruiaMYqSXWD9vM5Pi+WCtJ032iaIrFjKYi2eBChzECGQduvGTYPZyxvGjpTSDNE4TKxgvt4EfTW5IgnMTaHm8cSRRvjVgCbz14jXUtewcLNs0aMwRs68mSKUL1xJEizyNsZzG+5ad+9nV+57f+Q771p99lvn/C5z+/S3OxRvocLRLs4MZikh8ZdiLySDzSCZwSVEOJd4Ld29BH5zz44D2+/cffo2sDOooQUlNXniQX9J2hmCS4kHFwpBgGx85BQRSnrDcVk4mkaz0hDNy8cZe///d/i6KY8ebbb3J2dk7bViyv15jBEbBE8cihlUIghcJYs7XWVbz95gMiWRDHEcPQslqvIXxEjogoy3JU3Ob5qEF3o52zKAq6vhuHW9LS2Q5kxOmdfT752l3aoeJH33qTvfkB6/WSyTTn8vqKF18+Js0tVVVzdLpD2dQ0/RPe/vE7XJcNN46mLJ88ZnZ7h4fvXSDcAV4PNM4SMs97j84gVpw8l3NyEmhLuHvvFe594iZvvPEud07u8N3/+9s0q55iMkXpwNHJgr2DnItnAqkidDzg+oJ/+p/+k7/8B9Xf+y//2deH2tK3LULmuN6wubyibwxBDVjGaU0aPH3fYIhRfsBYKKYaxJhZ9c4j1dgqd06MNzHvCEKge4FRCdPDKX2A0NVUdUySZDT+MWl0TOzv8PjZj3hxesRVZ1kKzwffeJcQf0jpalaN5LjY4ed/5YvcX/+Ai7davNiACQwqw/uOSBe8/rUv8c0/e0DcbZgvdnj1pZ/hT/7oGyxyjwoTNs01508bEjHl+sEFRB7PSIRxwaHEWBqQWo0YLjE623UU4bwgiQq8dMxu5Nz83Ant0tFXG1ofsENHEAKnIRIJloDvAmkk0SrQdQ0COZY2cKTFmKNZNgPXyxLXeWQ0o0nOWFfjH+Fg1LiKcJbgFQjJfJ7Stg3WexQagkPHYvs6EpJ0iukHmrrEiwHb92yaNTtxSqoEZ2VJXdVYPIs0JyiFERHWCXYPFpTdNeONQ9D3HXqSUTYtm+WGzaXm577yGl/67Of48298yMHkBnHRc/cTt7i6Kln1PZ0a2Ck0cZbgWo8IBu8ku/s5eeG5efI8beV5+vCMEBTCjRNKyQYVNAJHFEmSOCctLJeXJU3ZMwwBwsjnaxtPnETkiwSPpMj2uLwYmOYTFsWE3ZnmE8/d5Rt/9g3ee/dtlOqpq5bLJ1f4Zs18WlPEnqoPzPYVle+oQku5UezOFoTeIJgwtBHeCTbVFZ6OJE3w1hNJCNagncCalhB60lgyTzOKfMp0SMmnMQeLOS8WgVt7DfPbCVcyYdN4LBrfjOiwQYB3MJUp3ghUNmV3keL7HhMsVdehhSRWHvqOthJcmYgq6hmsRcqIWAdUcCQy5mBvB6kcddlzeHDMwf4N6qZEyBihJL2pqco1fVsRgJPTW0gt6U2PdwJrx6mI92bbfA444yiygiQtSLIU6zpimaOZ44mQaaCqluSTE/J4itYlDx59yObqAkFHMZmQ5AmT3YzD/VNcI1hdXiF1g44MZWUYOk8cjaxTb+R24tZhjRsjL6anbTpefvkOO/MZl+cr+s7TD47nX3iBo+MbXFxeb1v2juAj5otjAnILTJfjgzRAXV5RLq8or6/wbmA+S9BJTT6NOD49RoiB9dUZ3kIIKXYQ21jFuJwNDqpVR1d1SDmQJD2Hx5o48lw8XdO3hizXqGgYL5lybLEHDHmeEQLUdYXWYpt/Ex8/AD/KfYot7ikEAejRihc8Wo9w+cENHJweotKEsllSbi6JtCGfSpJJxs7eDnGmaaqOpgMZS5AtJ/tTTg/mXC6XrKueoXMMgxlb/Vvbl9YxY3zLQRgB7x9xmkeNqkRpRRLFY8TLjEpVHWmUltspsCAIQRwnqFgTJxFJllBWJVme4YKj7TuMGQ16eZGTZDlSx6goIYojiumEmAnexcznCwSK66uaJI23ulNNlqdkWUqR5VhjsWarzxUB53qsYfwcnRu/41WOTjx3br3AND/g/PyCkfTuSJOMOF/w+NETlHeoSPPq517l6rKnbnqSVI3vR1Ag7Dg5jAPFLB0xZ2QYY6iWnmAEUmhkJPFesNjVDKZnDE4MY2nNl9hgSOM5aabRsSWOY8q6JcpG0gIGhDSEYIkyjSVCxinpZMbZxTXKpSiZo7RnXVbjunwrK9iZ7yKCwHvFZCLJMkFXRXTVBm9gZzHl+MYek52UW/cyPv36AXmW8eTDK+LEMvSaxXxOrCS5XrB79xW+963vcvnoffaOP8mrL93jR2+9QYgcOhWUdU+ezdCRousNOtZABP0YDcEoQhu4+cKc/Zu3mSan+P4RbdugI0dTObJ0ymK/IU4V1aYnmXqObymkNrR9S9MJ5vMZPhiEH/FRr37yK9hB05meN9/+EdnEEyUBgWY2m+GDJU8muK1xSssEMDx++IzHDy4JPkUpwc1bByyvL0BqlBw3xKOcwpMkyVYWMNIExqGFBW1wNmF3f5fXPvsJ3nvvQzZVjwmG6c6Uz732Og8e3Of0aI++XXP1qOXenU+jRAvOkKU5IY6Q1pHrjsfLJTNtOFSCS+/IH5REqqfqHlE3jssna9YXHdVGkhYTXv3kMb/29/4BzdUZD86u2FtYunbF5fU1Mo8YBkljKjZVT2dyfuFvfI2yfcZyXeOF5z/7T37vL/9B9b/5H/67r2/WJc5JsA65NaRYM1CVHZEQ1OsG7xomeU/oBlAp1nqKPEVKh3cKrfSYKbIRUkh8GCCMWQ4TOVzd4fqYSZFz5+4h+ULz9MNzUh149PY7ePmQvb277L2wx4fvrli/fx8zcXR1AoODTvL8nbs0eeBs9QRzVtE20HlLpiXCSFQG5VDx4Qdv8dlPf5FNX/HjHzyicxVVFbD9uApFDzx+8AA1MldGhIVS27KURGrFMBhEECOUWSuikKBlwO3EdHLE/5xdrPGRxfcS7TTz2YQkkfR1O5bJxGg7CiGMKjwZMXbSA1JrlIrph4HpZPyyXa16hrZkGu3QN4JbLz7PTAfMEFF3Pdb3KOfJc0lSBIZmnBpFSYINgbY3xPEoXGgtxIuCeFIw3T1gvpOjIolpE/rNQKRBRxNCUlB1bgTfu8Dmao1tPEVeYGxLXOTgA72xdNUKbSK++JW/zv/2v/8xwQdu3bjJTx69yex4xvlmjdc9ojO4OkJEgc0wMMsmFLsavEL6gboSBOOIpaI6N9y+eYPl6hLigWw2rk8lCaZztLVHxwmr8xoVGqSa0jYJwhuiVNI7w3q1wbSOLElGDI+TFPGEZuMZhpLgJZ/9zGcwpudqecVkMSGfTHn2xGB0IOie2d6EdVlx++6co+ltzp/0WOVpuyvKaj2uXTFYo+i6cVOgYkk2n9AFhxUKPSQYDb1tOdACrSLOHl9zUZc8qjXPNhnvPfO0rac1LfQSGTTOWvww0NuW527cYjo7InQrrCk53tul6QakjpkmEbtxD2nAT3Nir4hCzOAHprMF+2lC4i1l1dGYjt5BEu8RYkXdrShmE6S29AwkhWJ6sGBwgpu37xIJyXqzxuLovcGb0aCkBMzSnERHFMU+k+mEsl7R1QOr64rF3g4vvfQiXdWzqgxPLpbIheL0hX1ODjISNRY6qrLB9x2Bjg8fPiPWMc+9cBPpLeWyIwqK0wImUUQUxURKoCQo6RFSYgLE0XZ6R8znvvR5fu3X/i1uHN9m6Evu33+Pd97aGrGExtiAl4HpbIfT02Ok6ug7y+7OKXGcsFlvODo65jf+vd/kt//Rb/P3fv3v8tnPf5lB5yyNxQwNbrB0ZsC6MWqAlxAUSkkG27BaL6mbFu9j4iwjzzOOi1vs5BPWzZraBIppik4HNpXBCz1mnHtDVdYkWcaLL9xjb3/B5bIExsKP6QwmjIYh7wVKiVGwgEMKj1ZyG0OIODy5gRWW1dUZi2KClBkySum6gc26xPYFV5fXrMqSyVQR6UCWLDg5OOLsUc31dU3XBsww/t+CsUQzDhwM3ostVsrCtkWPcCg5xhOiOMIHgbE9bssa9kFibMCFQJrnxEWORxInKUjNYM0YGXAQSYUWiixJiSJJ3/Z4o7CDGv8u/EAAjG8IIrApy3HabAAHzvbYvqNvWpwb2+sQcGaU1DgntqYvRz9YnAUbxu2RlhEn+yc8eHIfhCKOU0w38PD+QwKevCiwnaHZQFN17O5OqNc1aaRw7hqtDEURkeSKqkwossD8YKCrJdJl6FTRrB1Hp5DPBpbXklgL8nxshRs7sHOcMz/MKS9hXVUEq6iegGPCK5+9xfLiATLRNA0gFV0DkcjRceDk1ox12ZGmCTY4NmuDVgk21AihiVTEZlUzeMP+Qczx6ZzLpytso0iTCWjL4mBCEmIePLrki7/0WbKjgsfvtWzOV+AUwXqCliyOHMc3Mh688wZnT99GJYLNZYsxPU1T0vXdGAFAo1WEkiCCJ48nWKlxtsZ7QRRniEyg5wsOT+9y/92niDhw8bBjllvKWiIPHbGC/bszTl6YsL8X8e0/qYmilL7xSDfl+uqarlRotYd1nk254QdvfJt33v4h3g5EMma9qmgHw968wA49BE1gZP86FI1peelTL4xMWCzO9lxf1AQcOsoI1iGCRBBASYK3KFKk9kx2Uk5v59RXjsHB3k6CbQN7h8dsynOwCTuLhAf3N2yuLbvPRXzy1XsU00PufeJVdvJ9br14j5uvvgpe0JQdddPh44jOrlm3A5Oj2zDUlFmHL3LwEfODhGJXMc8i5nspKg+cHB/w7Pw+D5++jbVLtJIMfcHe4T4HJ9A0DXuLKV/64ovUy5pv/MF3cG6gyCak+Yzf/Z3f/ct/UP1n//V/9fWICC2jcd3TDUQqRitJKhR919B3hjSWTHIwRhKIcdaSaPDCjGUkD03bjY05NfrinQ1EsWLEAwqssDRtQx5PmO0sKKYJphd89lMFn/jiPZ578Wv8+HtnuKFmdxFTrlaoOCFKNEFYyotrvL7k1U9+nssfl5hmbNAa344bJC94+4OHvP7FzyFFwup6xU/eeAPbGiIhQLTszBa4SqBcQEuL9eP91vsR+i2lHLV+zqGVAgaccERC0Q0tO6cnREnOJBVMd2PiSBNHyejYFqPeTukEkAgPgxlQavSN62hEuCitscYymU5Ik4i+dSyvaiaFRqDIogV1ecHqeolpBL2SNOuK2wfHpLOccmjY21mAc+MUNRpbzkWeEyWKJCnYO9rFOk8iHBERfRsoJgWlueTuC8dUdUe57CirGm8dWkVoNeJeHA4vPdOdHBEJTo73EXFgnmhe++kFjVjRn52jg+H49iv88Ec/4Ad//k26sw1m09CtavpmIM01z988oFlG7O0ckEUZbWXGfGQ0sKlavAkoGZOlkr6RaKXIZ5a6FkSZxPYpfWvQchj95HGEdxHObteQWwuNCClNVbN/tGD/8JCL6yV1VxJlCus9ZxdrOn/O7MDw9FFLUzkWO5pm0zI0EZtnsJee8tUvfo1nTzY8ebqhaVrm87FMp5TmYH+BGQacGbE9EBhCS55m5JOeLB9h9X3fMs8l+VyxXm2w1tJvHHVjiIoJg3QkTrI3nWFTg5CWWZ7SRppeZ7yYCurVBWebUb85K2Je2NOUIbARjpVzlCYem+DC40zPXn7EbpphmiWznRNML3B9h4oE3q+IVYr3U26ePo8xgjiZIHxMU9X0TU1ZbRjalliAcm476dMYHxikJY4j7t28QVcPXFXX+NAjcDx78gwVYk5u3SZNCoSXrJ4+40//4HtsakfvIgaZIgTszDq0GJjoKUpq7F5CsQNR32PNQJYmeJHj5wXxTkGWZ5gWkjhhbzehWVn2D2/xtb/5S7z62l9hunubo4MbrC6XPHzwIUqC1g5jaoLv8daxvFpRbtZEkQc6mvYSRE2cxCyvG77w+S/xi3/77+LiOY+eVFyenUHT019azs+uaPqGSE8RQY94rCCx3iCVQWtFkkUksUJ4zXw2Y8Dy5PKavuuwrUF6SRxF7B/OSZOUq7MrbN+ixKj4zHducPPuJ7FVT18Hdg5vETT4YLGdG1FojKB8+REOCghbbJc1hjxLmU8zbtw8RXhNuVzSbRr8YFgvl3TdQJ5kZJFGeoUWCUWmeeu9+yzLCtPVON+P/OvtKt4aO2ZSfRj/bUkuo5p0tH2lWYKORhSQtRatJUIEjO3xwaLigFAeITXOaLpmIE4S8jzDOU8aF2MeUo4osKZrSbMUay1tUyNVIElGfJLc5lWV0NtpWEAIRxTHZFlKkiTbdrfEOzfazVzAWMPgLMJp0jzmxvM3+Hd++6+TpA3vvPmAJ+dPiGYaoRWDETjrOTpa4IWh73vSOGddXxKEAbEkmxqEaimKjHJj6RpPbwxSWQ5PC2aLhPNHkp0Dyc6Bpx968iJG6Yy948BqOSBDThRDb3qiRFNuOpRPuL4OBG/I04y9k11kpOnrlizN8WE1MlnlqL5smpazR4ZipkgWBlxBuarJ0hjpJ/x/1L3Zr2Z7fp/1/KY1vOsd91y1azx1Tp+hzjk9mw7GjrENJokjIZHkHhBXIGMGOwoKUl8BQVGQUCKuiAS5BS6RQCGRLJvYbrvb3e12T+ecqjo17vEd1/QbuVjbzb9g39Sumz3offde67e+38/neRCCpneIPDKbHXC4rylLRYqG7XKLjJLptCQzPc8+vcD3gVE+5Yff+gmvvl9TFoI+De/1+1/qyUsPyfPy85Zmm5hO9inHAZfWuF6z2LtNjIl8JNg1NaR8iIpknoyI6z1ZldFZSyE1q4trfvz9z/B1R399zd5pzt33ZqiQ2O8zZCq5ON9R9zkvf7iiXWucdSijWK8airxCZwmp7bApSJ4qN3g7FMDqpiM6SF5Qtx3T2Yy6bQZ0mMywVnB0fMRb75ziOsmbNzWkhEGSVKLzHUp6bA+ZHhBmPgoEGWhFGywP3j8lCcFutULKjPme4PLNGTZKju6esFpd0V2t2TUtWhdsri/5yY9/jE4HvHz+KV5csGkKXp3/MXrcIzIosjH7M8jljG1nsCOLXUM0iYNFgZKRrrFUoymL+QSt1jSdpescsz1FTHB5veXsZcfR3YwuvOHttx5yfSZ49uSS81crurbj6JZmW19zdRH4+7/19/7iH1T/wT/+J9/MZgMPLjeaLvSkEIgeeiRFCjgE43JEdDU2miEsHSDEjrwcAsX+BmYtZEKQ0DofFIBIiHpwKAuHlJqz5xes1mvmhyVHd+Z85aOv8fRpw//1z/9vTIQii9gucrVaoSwY2eMazd5C8+jD23z3Dy9x1zucsvRbi8gZcopBkVc5W1tzfXXNarlllM2YFDOqcUlejNitekyIGOHp/MCW/HPLstJyaJO7wS2ulUYLgwseLQ1KabooWK9bikywdzijWXd0bRgu4r3DO4vKM6IPKCJIdVMo8EP+zPubjFe6sUElYGiX217Q7iy73RW5yWi3Pe998DHtxQW6tXzpS18mSsGzZ2eQFCIKlE4YI1GyuNGoDm3WTb3Fp4gykslc4WNHVmXMjsa8eXNJqjWy80ilSAHCDVQ9isRif8HhrQM29ZrY9kwWGikCVTXi3kcj5ocP+Wu//neQ2ZRt3fPi+XO6esN4PGU03SOvCkSKZLnABo/PIq/fPGO7WjE7yKj73ZBJswotInV3xRfe+QIiLWjblsl0D+cydjtPUTRIL0lRsDgYYzT0dktWgJaQvMb3YjAvpQ6PJcqEzD0iC2RFSVKWdb1kNCmJCaTOObo1tEBtO6xkN6sNb93b40tf+ojXV2/Y2nPq7YZiXNFYiw+BEAUugPMSZUqkEfiYkNEhkATBYBcLJZ6C7SagG8dJZpmmwMiMEWVGqoZA/rZ39F0g6w29ToiUWK+39P0aPBwfH1LKjumkZ8OI51eWlhzrDNFtkEJiGGO0RgtJHhq87Mj372L0nNV2Q64S41wwX9xHmQUXF29YX71ExpZZPiLalna9ofOOclZSzQpGowIfgZgoisS9t95hcXBC7SznF6/xa0cmNOghEhDwVPt7N+rPwO3TjFt7OWcvrjj//Bmyu0Q6R05FhuFg/5Bd7diuOr74rz/i9KN9soUh3ytZrnZ0zlMejXF48lIzXpSomHH/9A5f/bkvk4sp/+pf/g5/+Hv/gouzM77w/rs473n2+Yubg0qkKA3GaIp8ONTstpbbtx6ymO/Rdju8jzx+/CF//df+bWTSfOv3/4DtxWsmVcX9995jfDzj1csnXJ1dsd3WwyYmDXiogS8aB+FAAKEEBKi3G67Xl3TWkmuwVnC9iTTbRKULVBRYJ1ic7JOVE6J1JL+l7z33Hr7H4Z07NKnHjCWz/TmuDXRtTwz+hokrbg6tN/rSOGQ7hVLsHR+xqTua9pzpJGO3sdhu2HYl71mutjR9R5KCUWmQqePsxRVNPWhPEf+/XlJKcSNv0QzzyeFfKYcboSCRZZrxuAIEMXADN5eEmNBGU1Q5Qg7/T0mRvEFrQ+cakgiMRhXORjabFc57Ykrk2ZA77fsOCDdDgAyjNLYdbtCCYVJXFjDfK28Urwpre7wfVrIxxBv+7RCpKKSk95F8lJGZkqr4kHtfeAwm47OfPqEQOa632LZDxMB219H2AZ8swQWU0EihKSpD19dYG2h2nr6L5GXOZK/g1umYv/JXv8zlm5aLq3N0NWjE1xvJZGZYLlt2TY+SGud6igKSTOy2fsiF2uE1u/fOzZZSGcrRiPPn1xSFw3YSISyZGpFlHqXAWonJFKe3jiBtUAqWV+2N/KQmlyU6GWQUGJFxMD9CihHX11uED2xXO4SaIETLeHLEqxdndNdbFIL1tiEGxeF+hXcF9WrG4/e+wY9+8BTnBd5KQuzxcQvJ4OKOlHom4xlal2y3gwBju+4Yl2O0yWldM7Q8fSJXBnzEBEtGxuH8AO3g4cEddBdwncKeB5ptT/KglaMoDdNpTvBD7nJUaZLcDQVXIVA+YW1PEkP0sMhLJnlJH4bVfQhuyJzmo0E4lEXK2Q67s4wPJEZ6slQSgiPLDClCriY0fcNoNqIoNUqEG3lGTiZhVoxpm4aud+Sjku1uS70JXF82dO2aQlfE6LC1ZDGf8OD+jO9+53vUG0s1kfhiRSkjMRaMZg7hKiqzwLmEUxm+7Kn6nrNLOD4cDwSOMOL4ZErbbyhlTmcTzcAz/wAAIABJREFU7U4wneVokTEpTzAG9o5adsuc1dk5P/6z1xiT88EXTzi+P+Hpp5e0O0NVJf7ub/4lMFP9d//oH3zTSIMcj7AKXD1YaUw1xvaBXEvmt44RKaGFxXqIPg6twFJQjAwxBWIcAspZNoDxtSxuDqqa6N1wEVQFRuZkShBF4NX5BX0v+elPL1lerfj441OePjnn8yef0dRb6uiYzkbkYoKuAqfv5nQuR+wi3fklwSTwBUIJlFCkKCATbLsaozWb7ZqqLMmKKUIWtLYh9B3R2gHZIYbPGy7CEq0kzrnh4lbkA0cNhSky2l3LqCroCdTrlmAtbWO5PFshZEZVVDR1Q5nnKCXwwSKIFGWJVDccwjB4s7XWtF1HWZRUlR5UgWG4IWkpUUKxXXdY26ONZpE6MuEgG3F2fkaed1jf4m7c1DrLkUbiHXgX6YMlJMHx/X2iqsmMwTYSZQome5K9vQljtYevh/ytyYZWuZSDzaUcVWy2G1JKTI8rLAnrHV3oWT4PfPr91/zL3/kOwWUcHe3x5NNP2W7OWexNB4xTcpA8zlqSzBBhxzcevYVSnk4uMXaEvTSMtKasCqTueXOxom4DUUX6PkMKj0bQu0CpKowu8FHS1R1lsSArNN3WMiQGLRGLyTR9H/ChJcaG5XXLcnNJ3wVC2rJab+hdZHGk6eyKi9cRnU+o+5Z3PrzDwcke1fSA15fPefnmE+7cG9O2LUoIClOwud5hhESJbtDtpYwsV0RrsLWksxojDClEVFlQFQVCKKZac7JfMr9Vsawdq61HFdA7T5IdVg4ZPT3JyKaSuhcU5YLD6hC1W3L+pufycofMEjEIkpQU2QQVFCMSXgSiklTZlDdnO3oU01lBY5fY0qMWh3S25PrsCc3uJVJ0g22pUpjFHlZ4bGzo+qEJG0TEh+GmPd2fowvDm2fnvHn2hg8e3uPksKSJjpjkjbseDuZzThYFb71bcvJ4QnSa5KbsLyZkpoM8cHhywmLicP0ZdbdDBcnJnUOY5Ny9d8zt0wO2yx27bUsvFPvzOd11w+6qJleCtg/85Mnn/OCT71LqSKYKRtMFx7dvEYlcLa/xcdgyRBK9hXcefcBHH31EXW9ZXm/p2p7Ndscv/Pwv81/+Z9/k53/xl9i7M0ePFFebK1Kmubh4xe//7u/R146vf+Xr/Nq/82tkmeLlyxfDOj4JYNiS+JjwYfDKz+cLDo8OCdZRaH0DKo+UoxylNUEIirFhMj7EdpLV9hK8wzcBHzO64DAjRTWr2LY1IiXa7VAqHNbvw4st5LCOHAxHFqRkvjdhubri9fnlDTtyONAao4kkVC7JRyXB5xSm5KAqwe3YbtbEmJNlGXmhcdYjpcT5gfKizU1pc7hMkqJASNBaUZTZAPb3w6S17z3h5nsqLUkiESMQB5qE0glpEgg/SE2anqIcsHTjyYjDw0OUHPSdi/2SlAKb1Y5u5+i7nq6xkCLTqWZvf7Av7XYNMQy5ZnOjBfY+QAJlDOPZjHxeIrMcGzzzg4rl5if86bd+xCd/9jlSNYgY+fBrc05Ojrk8H5rd04Mxo5GkbTpMBkpC17bUdcBZRfAgtURnCaE9MQo+/emS66steVFwcJJDmHFy+y7L1RVm3CFiQbsd1NdJdqSomM0meGfY7jaMF4oUNc2up+56kDtwlsIsECJnMT9EaU/EUpSCzjYolbFf3eZgccT+3gRkB/Tcu/WQx+884sMvfMTJ8ZzHH30Bk3KeP73g7HKD8JB8ZHRc8Tf//a8wO8x5/4Mpq/UGRMa9t+fcum9oGs/zpzvaXeL1qyVCWmaLCbt6Q9dH8kLRW4+3jhBgt6qxXTfklMVNLI2MUSmJQLiZeiclMTkIq+hcjh9rDk8EXMAq1ChdsFp3pFIPiuViglE5fT/0SdbLHaE3eDeg0QqZQRiKUlmu0EbivaNrWogR78Ig6xGaECNdtOgK3v5owcHeu+RTSd+3vDkb8vQP33uXWMD1xRm3bs+G7WgDIgm6brjvvP/4EbPFhNW6p14n2s4T8RgtGSmJkppt36CFJvqGi4sVtvEomVGUJVpFZncTl6sVUo4pshLnPMZkJB+4cwj1045xlXN47zYBELlHjyzT8R7nl1tkscBuarZXBt+VFGaP4CRZ4VheJJpdy5uXO3Izoa09Tz89x3YRoXvKkcJHzd/7zb8EZqr/5h/+w28mFRFNy/r5OX0fmExnlGOFmkPfS/S4ZLdeInxNpiTO9UipUZkEBvOJlIYQ042ZSqLk4D923iMBFyJKjW5Ye4GQPD6VqDCUIdbLLc7n9Elz/+EMpS22y+hdjdKex199wLK/ZrXbsl+VLF/XSBPZbXvyLEeg8MlxeP+ETBdcX6yhlJwezkiZ5dXZK8amotttkFrgfLrxUw83gCGuMJinjDE3GtiIMZFEpGs9e8fzm4NUT1WWCCHZrDdoBK7vcSEOZSrrh7ZlVhCCvUG4RFxvMTf6NSmGlbXKJNPxgjzPWa2v6RrLaDTl3sN9ml3PZrVhawN5MeFXf/mX+d6Pvk9SFiUHK5LrhkmIjx4wKJ2TJAQlyMcRGQoyci5enSFVYrnesWssl8sLVBbRIsNZN1h4vAMBTV3jXWBWzWiCwjeO2/cnnD2/5q985WN8F3n+ySuODwe7zieffoY0jrrbYFtLvV6zt7fP0dEpbtegpON0b46MGWerHSorcXjwYsiuZgpdSjb1CpUJyjKnKCDLIn0vCa7Hhoa2rwem3zgwnmouXvSUMzAlGFNQlgqjPPUyEluDBjJtIeibzHFJSC0m97jO0Ow0Xbfh5F7g/a+PKWd3qFuB7S9p2y3rreNqvUFIg9Lw+PH7bHceHyPF2BBSQksYVTlHBxOkTpQlqCRIQjKtDFe7RBsNne+4IKeOICroe4fOFDqfkGk9tEaVxm52+K5nHhvGqYeZQFcjigLamGjJSEJBciRlSEnjvQQlWHdbMtcyFTXb9ibDrSpiPiLWG+g25IDOIkRHXih2bc+6boeHPAwogymy4fc2G4w661VNt2k5XJR8/MUjbp9OuLjoWW23Q0NcGd774j3e/7k9sj1J2/S8/M73eP3DP6PZCULIWW+2mPGY6f33YXyHw9P73H5/D1/0NL3i+iqw6y2z4xLGkulsRhky2jfXrK52TLWia3a8vLqmTJpRNePF2QXf+aM/5k+//2325wtGozHr5TVZMXjTfbBEHMvVOSqzN6pESVUVlMUBP/j+M37vX3yHq6c1zeWWi+tzXrx+ze5shYyJ8ckMXSqe/fQFn37yKd7Xw8ErCYT0xOgQKqCkQpFxcHDMfO+QxnpiklQigg2smw6fejrXYG3HbrMmxobxRBGEHDYBuzfMRhm3bp8ijRpKTERiGkQMJjOD+Y8B/yTV0GaHRLCO3aplVBqqKqdtPV07rG0RCi+GrYFB0jUd0dXMb3BlSUg22x1lkbF/WLBa7gg+IRCkKH5mpkopIuSfT3QjoyqnKHN88EgZqdtmuHbmkmoyIi8NMUW8B9+Ddx3WdozHexwcnrBaLambDcE5Qp/oOwtojMnp+sE4l+cjYlQE36ONHEQJ0SJVomsdm3WHlhlp0Gr9zIaV4oAS8yENeKQbkcFm02B7z3S8x9uP7rBcv6GoDI9//g6//rf+Pfb2H/Htb3+fvh8MXkdHC4gC62uEjkgNZZWhs0BeBspRQmeGxWHGZtNSb3ZEhlJaoSpc9Jy/viCmnjtvSV6/GIqB2kAMA5szpJbRvGAyPSQbR7brHeuLSNdEkg/g4M3rHWVxwGisafsdde0AT1FU3Lv/Fq3bkZJkOqm4dTRjf37AYvKA07v3MEWOqSp6W3O5/SGjqWR51pB8x5e/fpskOtarkovPO7qQcevjQw7eURwe5rz60ZaLlztgOPgEnzg8PL6ZVrdYG+kaSV4klBIE5yiyEW1tUUKTkqWqcpb1lhBqlFQDUgqFixKd55TlFBETTiQOiwMm6T4XteXdh+9xtbpm1yxJyZJnFbu2Rgg/WPZ0pMjN8IAiDCIJsiJju938OXaIzjmq+YzjoyPa1lGNK4qipO9apJIUowKTJ378Z9f89PuviCGhcoWrLX0b2aYtD472eOerX2bvaM6TJ0+JBGIyzCaH5IUmyYZaL4mscLuIkYbgPUoZrO/JCoMxkhTA6Al91xHi8CDX7hLlbM50/4DoFbPpmKzMuN6u2K0DaQdxJbn3wOCDIdQV1Sxh15b7o0fY7hWX5557d9+maxumsxn5ZMfr1y+YL4548+aKvnNII2jrnmA3jHLN2fMdKeUc3F7Q2Ia/9xt/CfBU/+if/c/fVL0k9jCaFpzem/PhN95ndDBndVaT8owkA4v5jMODKfXymiI3+CjQmSRFh5QKIQaWKjCUkqQensS1xEhDHwR4z3ha0iaPd8NEBJ2QaWAoXqwa6vWW3Ix5/PVvcP/ubb7w8C3KvURdB0JzwLgyvHhxjTFT2t0GSGR6iBZEFbEi0jcDa1AVGY9O3+Fv/Z2/wXa14sd/8hmTYkSMg83DAOnPywnh5onrJkvqvUVKgVQeHwSdk1SzOSEJSJrg+xv0T05VFHRtT3fjhU/eDsWHMiPZYdU/Ho2HdaGPQykEbiwaw8fFYoZSCts5qrEhxp66achHBp2X9D5weHLEqxefI2zAoBBJkVxCZ4noNQmJDQ5ExnRRIHRit+u4vqoZj8ZMJxP6PrLd7lgspswXc67PVlhnMcagM01eGLxzGG1odpawteQ6oW1kMjvizkcZo8mUgGf/6DaT8oDvffdPad1mwJFFjVEZKRlsk2jba7Jqj+dv1nTWo3WODYHxfMJmWxONIyVN31nGVYUg0LYbQgpkxZBtjFbjk0ebhO0zvvTVB3Rt4OJ1z2hcIXXEGIlE0NWO+6d3OVzMmY3meJfo2gZBpG89AkO7M8iUQwyUTNmbjdl1KyweaWo2yzVvXmzYtRGZIiJAu4JJuUBLj+sso3zOtCpJ1Ez2BRLQcpjAyjgiBoGUjmmhsV7j3B6NFqh9iTYlQiRCDDSbwUijkkOGMCgNQ2Jvvs/U5Hz6okWojHpasYzgZE6lDSZF+iAwZY5EIFOiDZ7xSDPPBFe2Z2vAuoTuEnMckWbAVqHZGx/zV7/yiFszxXq5w1mFzBRCJ7QZI9MELzRFlfH1x494+70Fswclx8c53XrDp88vsH1gVBoUAZOVTA/GiKR48ydLnv7xp1w2Gy5sz+ura06OTvBdYrUL6MmUfDqlj5ar7YbrdsvWXXJxveXNZU9UiXFVcb3saa1AlYYkJaPplL3JHu/e/QKnd/bIi8DBXs5kZLm6fINtA8FH6t2O6AOZMmglqdst11cbrHUcHx+gZIHtLC9ffcYPf/QdxmNPiq+5OntCu73k5atPeHn+OZt6ycWrV/zgu99js1rexHOGkU6Ig1t8EC8PjfiLi3NePn1Jvd6y2dbk2YgHb93nwaNHLBZT6mZFsxuA+bdv3WKU7XF1cU1eGmaLBYv9I2DE5es1yee8fe99Htx/yPXyit12S5bpG4D+ANEf8u6DZaevPd45Dk4mTOZ7oDKatqZrPK7r8Z0jhoAuPJO5YLE3pqkDy02DMT2jkaaaKDabBu+BJIhxwA3+eXEqxgFMrrVmNMqRCmIYUETxZoK52N/HFDlCafKyoiwmpJDoupqqmvLowceMJwuul2ekYFlMxz9rULdtQ9vuCFhMNkysnXNEx5BTV4lqlNN1lr6zpCBQMgMCKSVSBB+GB0mpNKPxmK7pKWNB17aYLKeQI149XyGyBXffT9iwYXN1xMH8Hn/wuz/ixeefU00dCEdvO4pcIpTEOolzCueHaWZeDp0G2wuKsWAyNwivePTuPUiaq7MNLga2y54UE+cvhqHIqBoBbiBA+JIsT7StQhc9SI/CMJ4YTB5ZnxlSbxC5Yu+ooAstRVGyWl/RNpqyzNjttkwPC6LYcLl6w/W2Zv/kBK9bnr54xWpzxrNPntMuV+TjCeP5glv7U6a3M979xgds6yXjItFc7RDCYcY5UWi+/Tuf8frTmpgpYoxM5yOqaUZRFAS2zPcKJnPYbDpsl7DWc3xyRNd4rq9blCkRWpGEp5oqMjkiKwY7XpYAH3FRITLPbDEiE4JyU9H4BmrLnZMTzlcXXG6WFGVJ3bSDVY+hLCmEpiglzkaUCCgt6NpmgPHHiFQZdZ34j3/jN5nN53zrW9+mnIxodhuMMiQfGBdTLl9uWZ2tkBZmeY4eF0wqyfZqSWc9Yz/mz374nLNnz8CDySImL7AxcHBnn1QGNs2ao3uK01uPGZspL5+/QoiCqB197emtYDyv0NIwGlVobXDuGi0V9965y9235ly+7tnszhG6o6gCKndcXGSUizHjwwyXSzonCcoxGlv2RxWHB3f57MUnoAvuPio4uzrDx0TTr7m6bjm6dcD1+nPiRmG7yOHtOfsnmunBCKE7phNFbAv+i//kLwGe6r//H/7xN8v9jPd/7hEPPnrI9M5tuk7wyZ/8BGEDB6e38H3NdLZPZhT11cXApssLNB6hAsHL4YslMWRSByY9WuVAxLlEBJL3zA738WWJ6wK5EpSzPVpXMzIF09mUTCk2a8vWS0Jo2KUWnS0YmTn9VcHrp2dMpzmZksTVcNPwyd4E+SUyG0L7wYHJDK9fnvPpj16wuaxZX19itII4ZK+M9kOmSg/q1yzXN2stidZyYGUmTddGVD4lkAYvdTaUlrJMYfthraYyhWt7tJQU+eAHttaSKYOSEtf/OfZFY63F+XADtFakOEwxRVQUpcK2lstzy3hscFi0qJF55M3lmth2TKuM4AOxT+QZaCmw3pBlI0JwIGFvf8FqtWG+N2e92hEYLuJ106BICC84e3lJDIPgIMuHlv6u2RCJxAhZXuBdx+G9ffp1y8c//5hPngT+4Hf+hNO3DvjiRx+zurZ8/tOnNOtrDBLjJUZpXB+wmx19UrCx9DtH6yTJGaYyo7mo2dYK7w0x9Ph20ERGH8hzAzLgwqCQRCnyPJK8Jq8UhwenvHm6wdoN210PSVKWI7JMUZkJx3u3efvtt3j48B3efvQlXrx4jbM9RTFMDUM3o2t2aJkzn40ZTXLu3LvDi+cv6dvBHrK8HuIqtusQIqKzjOVqCcLhrGS77ammg23o4syxq3dsmxZvE8FbkvCU+Yy7t4+QMUNkEkJB1InkNqzO6+GBQ2vcrkHbhBYKjEDFhFELbh2/g7YrpF7TSsvotsIIgdso6m1iOsoheaIYfl996uhFokmCnXTo/ZLZZEK0NSHuUGWBTbBxksYp3n3/Q0azW2xa2DX9ENuwPaHf4eyWJBIpSTYp4hF8dHrMOD8mjd8mpDGXZyu6rh4ydtKgxznT+YTQnNFsz1juYHvd8uHjR/z63/7rBGno+0Q1nhAI1O0V3nX4PhGahNsmXBsQreHqvGPdJ6ySBKMwi5LRUcm/8dVfZJzv8e3vf5sYS/YWd6mbmvWqATQqsyjTIVXEB0vbWWw3TCKVlGzWO9arCy7Oz7l/95ivf+0tluszni/f0As3rLizRLanUTLD1z0H84xbx8fEmOj6BqWHSXZKApIhIYgqoBSM85yHd0/5pV/+FX71b/xtvvj1X+T27YfcOn3Ig0fvM5nNuXt6n7PXS549e85iUlKoHKenTI9OGI/HTMcz9vb3kAju3X/IeDrnxfPnODs8PEfSDX5pEKskAVF0dL1lufQYUxHo2dkdZWEY55rJdIRSGRgFaCbFmN1mTVFm3Lt3mxAtm82Wtva4fnjfE8NUVghIxGFblkAqRTXOBnaqjQOf1A3Z73JcERmmmd4NsoS2bgb3egxcL1fUzQrralJKlEVJCIIQE6YoGI1H5KZglE/oW4v3AZE0UimK0hDjEDMjJhJDbjjGgdUagSgYCBnzKdV4xHq3pQsBeYMHs7HD9h2r89e8eram3ibsZssP//T7fP7Jp4wyRVGUWC8xBoRqsDdiEYEZ4l+doyjGKFlwddEipMLbwOVryLM9fCuGdb8a7jW7VSS4xGw+IoRE27jh4dR4RJJsVhbrJCkotJKMqgwhLU3dY8zw3iahOLl9wKjKOHt9TVUF2qZHKeiajtXS0QfHvXdvsTg9QpQ9s0PF0R3D5L5FzUuCmPLqyZJ21aCyjJ/84DWTeIoKGUf7J5zeOSIazf5Jor8KXL7YoLRkNM/IR8NN/c7pffrO8vzZGdVYUZY5ImmMzonCU84jD947Ip9AKjpOHlToTLNeNUzmU4SMaDEwd1MSuH7LpKiYHZVop9irR3x18TXa4Hm6eg5lgYwepTUoi9AGITJMZmjantn+lKg8zvXon2nPJVIbYhTcvXOfP/zWH3J5tRwQlM4To2L/YM7+yZiLyw1GlXjd0+x2vPXR1/nyL3xM6Gsury/xUfDxz7+Ntzt2ywFLVxYl7aZBuAzXZrTdjOUmcf/t99hbzLg+e411WwSGg4M97j8u8MGxuWrIMrheNVR6QlMLzHiHmoypqsVAYkg7ttee6CTGlCTl8Mlhph6p1ngrkKblevmKg4O3Ob6dWG8Un32ypLMX9L1lu5IYZVhdW1JwzI1mtxFEBOSe3kUe3L/Ldrll82bB3/2t3/iLf1D93/6ff/rNx1/+kKvG8vmLC7YvVvzkj37A8mqNUCVNtwZrud62jCclmQ20fU2Uijz0oCXO3rTmhUAkMxTwY0BJgxBqaMzhED4i8pLq9i1Cb5F9z3QxIRiNCDnFKCPoAiU9fedJPqJHB7j6jPXTwOWr14wnHTrraOoWHzzaFYgMYoqIqJFKMpoMk7hcahgJLp5fsb1aUVYZre8Bj5KAGFb8eZExGpWMx2Os7YbPLTKs7VEU1G1PUZW0fofJJE3T4V3LdDJiMi0Y743oQ4fwiUwYpBqYpiloUgw/y6YKBH0/UAC0HibOUgiMGTAYIEhBEnw2RAdiyZcff4CejbEuQwfNcrvm8Zd/gYuLjiR2lMIOCBaV0XSJhEdIx3ZrsX0ktZEUEsoYet/fgI8HRMzxrVv0O0si4mOP0LB3NEUXGqXNsOKRFldDHxw/+elrXv/0c5StycyMzBxihOKnP/4hqpD4XEFh0JUh05qJGJSBMnhccri6oV8HlrbDJYEKAk1kNrND9CCBT4LeWkTSDEiDSBAOiIxHBTL3PHvyOf3WE4K5KYL0pOAZVxWud6yuLU+fnPPk2Su6vuXi4g2CEi0n2N6Tomc8VlTmmF3YcfJoSrNNnL94TbSS58+XlGVG7HtkEoiYIaOiyAr6GoITKDEcqFU2yBtkLpBGUOYF+ahA5IFqNOXqKnAwPiFiub68ILSJpg/IHEAhjSKJRCgNdR9QcsgKB+dZ2RV9XOIchIMpeTEl8yU6CUIEmQ25LNs5WtuRVx6ZCbpMsX86Jy3BX0UQml0M7KygRpKUAqX4/LzhsydndPWW1teQS2RukFrgUyD1CYWkF5Kt6xjlgjw74kdPVkwXlkz2rK5rfEiIEDk93WM01vhMIRYTJsd77D2c46YVb7/3ZY4PbrPpW1y0jLTBRsE2JdpdT/QekRRd02FtSyE1IkRs1xP6CCpSFBMeH98h91tePfsJm1dPePn6FVfNltb2bGtHY4eISKJAKIN1Dh8sxkDwgSLTjMqM6WjE17/yFb7+4UccjjSjkSKVsN6uqdeJsZgzywRa1ozyMW3t2W5WCClvWt4JcSPbEEQUCmIiqICXcH3dMV/c4fbbjwgqcHF2zsX5io++8nX2Tm/z8N23+fjDt3n57HOWyzUffvCYL37pG6zrmq5z3L5zn9N79zk+fcDh3jHb5ZIXz58yGhWDjCQGnA/IBEqkgbEcDSL2bK4uwcPB0SEiB1WIYQ1ee/LMoIRBBdhtN2x3DWevLskyw2rZD38faThgIcNQjhXiZu0fSUjyPKccZYToflakss5h8hxlBJ1r6PpmaERva7qmoygyskywfzSh7q6o6x3JD1isJKGaTJgtJownJTB0B8ZlOaz9tUKZMNxH7JB7jX6QsoTkCTdRiLKqOLl1G5Nn+OhZ77ZIKckyjRkJfIBcaTIjEMbjPDhrKEczHr53yGpzRoqDodCHwHblEUlTjM0gODABoTqMETR1h9KB8bQgIjAiZ7JX8vzJKzbrHeVYEDpP2zmqsWY0tdS1w+g4UGFUoMg1Ug6IRGUy6p2jXUtClAg1xMWCyxBE2jqxWXcsly2Tiedgv6KtLSH0WOtot9BuAkWhabsVUi2w1EwPMr7/rRe4ETz76RO6yyuoGoppNmwcymETeLXe8vzJJZcve3SouHp1wXbVoMsJi/0FX/m5WzR1T7OLvHj+hpQEfafR2rBdDwOfprNkkwl6DNW+IJ/MeHPRc/ygwLmapnU459BGE9GkBMoWLOuaTS0Y7085rg7w45yX7QVe1XT9CiUl49GckHZ0vcLkGUk1g9ly5KgmC4yUqDh0tZz3JARG5Vy8Oefy/JzxqBqUwT6AKDi5u8eD96ecrS5xK4+aTNFeMbt9l6/9m7/C5sUlT5/8BDMu+dov/Ls8/uA9vvV7f8jtB8cED33T0jUtm+aS8vAWdqc4PXoXUXg637NbrfCtY1Tl/NKv/gofvP8VvvP736Vuav7D/+g/4KsfPeD3/tUfM55OuPvokINFRammnL9e8ubVMFUVQjGdlIQu43K5wtAyKgx6NELkkh/++AmvPwNnA9Mpw6avMMTmhC998WOa7QuadYsLYugcuIppVnH79pjr60u2O8H1VvBf/9Z//hf/oPo//u//9Jsvnlzx5rM3XL16Qepa2s2SxWRMTJ6j48MB2Jzn9F1LXPdI2+P6gE8K2xdo0wMM6lTlbtZhOSF2pD7QMzBEVRjc1KrQaKPpdz2Ns7iuYT4q8K5HGYXykSmQZYluE9GpQOE5Pjygc568OmS2UGwuW2QmSTGglAApSUJhXbyxfpQkmxBEpB5Ww+oGt8JNNlUIzagcsdvubjAsYN2g13MuUhCwQiFGw6GCJCjHQ7u5Xiemx4nNtmVSHFKae0QbAAAgAElEQVSORkQJeZYhRKLMZpgoyLUheY/vWzIjIcWfWTEiDpllBDGYrASJSZWjZCKEDofA28R2tRlc4THy+tUrdrs1ypQkUdBHORz89HDxliobygxEskyybTZMJxWPPnjI8mJDjJ7YDdMrH92N03lY3bk+4G3CtX6Y8CWByTOmswl2vaaYj6iyitefvOH2/m3Gh0f88NPvY91uYNH2PSo67h4ueJCNOT0uOXwr587pKd4cMJ0ZrO+wzoIfIhAxSmJvIEYEiWoCPgpm8yl97/F9wLeOZhVxu4hOkDDEoIAejMRnkSAbyqLCWo9E4m3Len2B957ZdA+pIinkxBjIs5yskLhtx/mzFbvacu/eMWefXA9rxzRAyyWGPAtUeUWux3R1RxIe6xPWJ7JCoHOPKQRCFGx3Pa3tmM/mkDK6LZxfvWC5XhJiQGsYjTQmT/TJ4q1HCY3CIIIjkxDsAInftFuaqOhVhpElm8ueixdb3BYyqfF0aCnISklSPSYbvOzFaPh6e/MDRqakaVqigpA6FJpcS1TyfOHeWzx4dIu9yYJ5WTHO5HDodW5QRGqQRnA4KehDy/PrHeuu53Cv4KOvHvPOOwt8L7i62NC1NY/efYsvfuOLlOOSMbd59eMVVuacPjjh1vEpOhnWF9dslx0qhyA6mnpLby0ORTXJyTLBu+/v8fB+weq8wWQFygiuV1tmRcXHdx9ze3LCdGyobcfVboOLiQyo5GBzErliNJmAyilFwb3FIfMRnBxU/OI3vso3PvqA3WbHatlwtLfP3nzMbJKR5SVCQpXBYZVxsn/Irf1junpLItE3lk+fniO0Y1IKolc0dtBFamlRQ6cHbxP0nirLWByeEoTiO7//+3zr//1dlCmYThcYaXj2yXO+9+0/YjIt+Ll/7d/i7tsf8vSnP2RvPObOw/tU+wuaPnFxeUV0ns12xfV6Oaw3fcAIgw8J5xNK6UHhKIYyq7MemRRS5ay7NSJajCggDiKQ5XVL23g2y4a2tUip6fsO1w/6yhgHI1XiJsM/uKURgkEpbAzOhp/lQkFhlIEUIQUO9w8IfaLZNoAnMzmLvduMZ3OScHgbsb2/caQLpAYpc9o2kGU5Mcnh57rRWrvWEX0khHhjzIpDjjZJQCIx9K2l71s6u8EHS5HnZFlBUoo8KzFKIRI450ALzDijnOfYxpJPZ9x7+y0a22NGBeMqQ8pAOSsQLt7E2Qx9nRDkCOkZT8f0vcLZnvnigN3W0tUWQcLbhHUBkyekiUQ3YlRWxNTjegkhJ4WCvoe2S5A04uZ1d32krwMpSIoiQ5qI0hJnHeNqjHMRJQva1mOyCXKUkFlHbjJOj0+o5oqL6w2hjzz9wStCm7h+uWNvv+DO+xnVQUbfZ2hRUhYlyWeAQAZJvW6o6xqhLHtHmnIahmuh6Xjxecv1RUNRKnrXDoXJtsP5Ht8Jqv0pQsHnf3qBi57Lix1Fr3G+Z/rWGLlL+DeBcjZDdA5pNMkHcqlodw3b2lKbxFJumB2NsL7j4uIcKjWowZVCkJhNZ4QgMLmnGAtilcinOW5rEZ3ARYtMBoNj1XZE7+lTzbjK8UJQ5prxwZzPPnnNB+9/kYfvfAElLsjkmOO3vsCt02N+9//4P9l1a0TvWJ97qqMxP/nOd3n38dfYbFdsmmtUHpFWkuUjvA/ce+cdNp3H6Jz7dx5y+tZdfu5XfpXR/JSDowVPPv0RoR7z2//pf8X/8s/+Vy6vz/mbv/7XmN4P7FaK2/tf5PAost78gKqcY0YtNkom04ysELgISU5ptwlvWwo1YrowFLmlc4L96ZTz1z37+zmXry8RuUUJ8KHnnbceUs48ITfcf++YF5+/we/22dU7/v5v//Zf/IPqf/tP/qdvEq4oNag4pt46vE90IXL66AH333nIpm3YdR319opmvYIY6OMAdB6qaJEsUwgRB4zKjWISJCEGwk2rPnoPImGywfIUXRjWZl1gu2mY7E9IUVEVFTkVo1H1/1H3Zj+Wp+md1+ddfvvZ4sQeuWdWZu3dVb1Vj7tttxvjGWPDaISHxSCBDIPEiAuQACELJMMfwL/ACCTA4gLQXADyGDNYdnvrbnd3dVXXnmtkZMQ5cdbf+m5c/KLKXPliBNLMiYtUKqTIPEdx3vO8z/N9Ph+8cczOXpBEEXlSkGQjhIyxTUuz3qKUwl2NiKM4ojWWTVkx3d1jvd4SKX2F27J9kPsqW4boHdpCgFbqKpcZUwzGVGWDtRBHCdZAsV/gVIq5chg3raNIp7hQI4zEVJ7BIMO2Pcoly3JEGHL33h2Obg7ZuzbktS+9xN/4xa+ye7iDD469gwPKsu2FCKYHNUskvnN0lSWJErwNbLZbqrLsuzXOwRVLMY4jmq7FB/q4heoxWEprjDGoSBPHPRfVuIBAUjcVzbojThNiEeFMj5opiiFCSsaTMVJKym0ffDetwZiGwc6QbJDSdi16kNKUDUJH3L73EomQLBYzgvTY0JHKhF/cf43XyhQRGuK9IfHKI/KbVNGbPHj1mOxaw2ZTk+g1jXW0NVe2l97MJLy4uqQIuo2hLQ3tJsO1Md4J2kbSmY5AjVIClQiiRKOUJzhBrAc0Fewd5OTpqO8YW8m2XJNmHqkiqq3FW8tgUJAlMT7EvPP1b7G3NyEuYDGryYoRzjoindEZjUgs04O+666lYJBKFtUlnY0xtoeL58OkL3YGEYPBiO1sRbmsydOc4+MjXv/SAzw1ZVlCcOAhiaM+fhIUrtNXJIsEHcUI4dg/2ENlnuE0Ze+kANmxXHq8d+gsQ+sErQVCejrT0DQdy0XFYLzHves3GQ9iZhdrtIiJhWZnuMe/8hu/wf17d/jaq1/nxrU7jPLAnZMBi9WK83nZZ8ijmM4EDqYZX30t53quOUpSJnnGtopxcUyjDCd3ThgfDVht58xfbHj2vGJ9vsX97AOSzVPIJxydvEZddTw6O6XyvRCj7Dp0oknHCts1bNclURGDljiZkuxo9NDgOo2OxwwnO1yb7rA7LjBa0MmUMiiWmw2HecHBKMUoQ2cFMSNCA19++SW+/c43ePZ8RT69DmrCh+89QtISScM43yfWQ06XK55vSlqfkuc5ZbPk08cLZhvH2m6p6YhzzWiimExHjDPNcCDI4hRbOzorQcYIHWMax/HJDb71q3+T26+9Rl2XPHr/+2yfPmXv2g0OX3md2lkSDAMF588vkEmBmo6xWUSSTaBTuNpj6pq2vmT/+h5Iz8MP30fTDxu8vMJCEfqltiv9MwKMc1RlTde2pGlCpK9+R0NfWK6XW7yxmPYKxaclTdtirSf4fpFK9CyoPv8JVxctTZ5neN9nQj8vHIUAJEgdcfvufb781tf4+JOPUFL0+C4tUZFiuVxxOZ9dcasdWa5JkpgoTjH26v/cWNq2Q3x+HtZ9TCAEUKrPTALEsUbHEhVf6WZVRDZICcrhCfig+mVDE1BSsVlt8a5fFhaq54ZLoTG1odm0ZNkuy+2Crm1pOjBKkg0m6DzHKUXra2QEWa6QSrItK+rSMx7tkeaa56fnBPf5hSEQRf0ymI485bZHSsVpL7BoraHtHE1r+pG0s1eCh3Clxu7P8RD6aZx3PavcOUsSFzSNJckFNmyQpEjV0jWWs6dLoiTnza/vs103jIYQR46jwzE7u/TqTDFkb38AouNysaBaWcZphhMVZVfTloHbr5yQHyScP99iXcflc8ducQMf5iR5RFtZXNvjJ512xMUQFZdMck0exywWDbtHYx58fZfalUiRUz6FnWKA60pMa8GWV4i/Bh0BwXK5mLFaLbiYnbOta1yAymxI4pgQJFkyZjgaIaRDaYm1mnE6YfdoD+86FvMKlUY46/ooWezx1uCDJnIR1sIrr7/FO3/zX+Lkzsvs7B9SDHaYHu9x49U32B3fwNgt6XgD2hFsxutfH/En//DPqaSlrGfY5Zo4TolNzstfeYtbb17nV/65X+dgZ8LBtOD68SH7h9e4fu9VSCNiGVOkmscff8Ds9Jzv/8Wf8PHDj/nur/06k+MjnpyV3L31DvFoTW3WDEcTVssN+5Mb4Gv2DvZ49MmKwShDqyEHu7cZZicIaVnMauJhiwsNFxeBr7z1Ld58+xoPn32MsTnbruXaresksSDJNF7POX264pWXjqiWltlpzX/+2/8MFKq/+4/+h9/pNhHbhacqV7Tlmlxr6m2JqXvrxcfvf0JXVuwUEluWQOg3jYNF4PGuz2TGaaBrXW93kvSsT9Vv47Vd22+rCoF3nvFkhxaPdI5hljOaDHgxaykGEQd7E+IYdChoujXD4YAkybB4zBVwG6uZPX+GD1dbqQS6riNKMnb3DzDGs7Mzod5ue8+z84gA8Hkntf9Tqd75G0UKKQVltSYEg4x6E1HwguFhhPOSroEsFxhTEazgzq3rGFtTjPpNW4iIlGA5XxMJifQNZSOYnW+p1oGP3nvKpx88Y/ZizXK2QXjBcJxS5Cnj8YhIaTbrNd5Z2qYmBI+WCtMZtOo3JoXqQ2NBCKb7e0gVsa1qjOkXHXqzjLhSMIo+z4XCtrYvsHzv1zbVX3mye0pioKxK2ra7ej0FURQjI0Gc9NpDYzqSQUHTtNjO89ZbX0HKlPc//RnJUPH6rZvc37vGweSI1bYkPZ5QvJ2xeN6gfESTf8K6/UmfZ40CKsvpOoXSLWmSEqzH2Y5mG9NsJLYB13iG+YCDQ43zG5TOkXGgGGvSQoP2mA6kdEQxxHJCV4t+Q1iUvdNbxMwXF2iV05kGHXm8EdjOsDPeZzjMWS6W3Ll1hwevvcyTJy84P50xHI6JdIIzAud6j/nJyQ3Gu5prd3fJdwYM93sslu0kXVcjfAReU25a5os1R8cjpMppfcNgqpjNVpyftRztX0fLhqbZ4LsBXQ14gdYOZItUksluipewbQzWCzrrqcMWEsFkfEAhNd71usi6NhQ7I9LhgHLdcfvaPQgw0AmDbI+yKWnKLa+//BqRhgcvvcW/8Zv/Ju989R1G0wn7+w3ernn3vVPWZX2FJ/KkUURdak4mN3nlziFZEmiqDeV8zvJ8xunFBXVlyLKc4eEAVWgGeUJoVyRcsu1qLr3k5PotcjJW2y3rekkWJywvN2yrNQf7Q3zjaVYd+IiqNTSNQ0cxIUC36dhsV2g8bxzf4HiQk0WKQZRjVw33bt9EFQUfPTql2pZ0tUXYFtNUaJ2S5xGrF+d0szN0vaA8P2XvYMqX3vk64/0hK1fzuLrgeXtKpwyd8awbz8p2zJcv2LYzjLDEMufw8A5CDnj8fM5g74CTw0M2y4qyrZGRR0hDJCyLxZoqeLLdAet2wfWTE37+577D0bVDNptLXjx/zsJ6SAra+RMWzx/jbEDhWTx7zs2ja6TDDBElFOmERA+4e/s+TVPz8OFn5HnPh/U+fJHT7N//fBEpklJgW0MwUAzGRGnWxyHajuXlJbbtAAhX56e1Fu8g+D7vH4L/q8kTgiiOGAwHPT7n6oLdF6oBFStUpFE6ZbGseO+9n/V5xARkFJFmKTs7Y6TyNN2aNFUoqdE6wVgFIcY7ixQCgsTbFkm/AKakwLl+YaprLQDZIEdpCcIjFJS1I8ki4iJFRBFpXpBkA3wQSA/O9rIZoRRZkZNmKXmWIXwgL1KCb5kvnjOZTJBKYYUjHRQAFMMB6UAxnG5ZryxtEwjW9gIG4qscr8V6h3MGrR3eBYwJFKOYOPbEcYzzLcNxAgLSLO1fW9UXrlHUA+2llF+QHbSWfVHu++LXBYNSKdttx+7uBBm3JGlgc9niTEGSBaK4NyKulp6d3RwpLc3GcPa4ZG9vH2cUZ2fnHJ0MyIoepdhuYLnacPZ0gUbjbM38fM3j92d0pcY4xTBK2d8ZMj2KeH72AukikiRmtJfRbgNHdyX7OzskRcze3QGryzXb85Rrd/a4f3OP+SfnPPn0ksHOkFe/dMD09oioFWy2DT700T3n3FWu11I3Fa2paZ1BkmC7fm+inxj0iuEbt66xrRfAgHv3foHru0c8+eATQOCCILjQ0wBCjAV0FBFHiihyXDaX1MbQdJ4k3yHoATLPwLRkxRARFahRwYM373O4e5v57JQkLSjnS7ZVy8mNW3z313+ZP/j9PyAWt/ny21+hMiuEyEFKns0/RscFR7s3sXLCIBkxe/qYerNgsT7HRZJf+9v/Ondeuo+xgk11zg/f/32y9C5f+tK3idLAxYsZy3PHg/tvcTF7ho4HjEcjhoMBbVsyGubMLi7pguDyPDA6uMmqes4Pf3DKyfGruFmLL2esNtu+tmvgxo3X0Nkl5cpy+tyw3uT8F//ZPwMZ1f/yv/6vfmd7UbO9uMTWDaN0hKlrdCwpq4bFi3MiK5CNYycPHEwnzGcLlEwJzvZB+6DxwTAYaazxKBVdnZiSNE17U4gPCKXAe1xjEVGEkYKm7TjaL7hxd8CyLLFtQxaNiTON9LpXhEYpzgtCf09GaI/oUqrVOVEKTdP2hyrQGdvDmk3AWYOtG5x14D/vPPRdByn/Cm7d46h6BqkkRlxla6vGsHMwIRln7BylNO2GtlHcvnOXyV7GdDzi1oMDLpYz1utAMRzRtCXOOZJEUm62LNdr2rrl8mLGerliMiw4PBhxcn3C7bv7bOqW6XQPpKAoUoajAiEhyWKM77DGkWXp1evcP0cRAsZZmqZBCEUxHABXuCshQIoeUUU/5vLB92NJ6bCtII0TkqjfnvXO03YG7zw+9PaqJEmoqhopZD8+i2LWyyVxpDnY28dUHbY23L1xBy8knzz6kMa3jIo9dhkzX8x5d/WIa/ducHT3hLlq4UbF/j1Qo5xVFUhEwWbu6bzlzv0Bk8GYUTGlrtcE0TEaK2TUEauMWy/l3H0l48bdEecXl0Q6ZXqQ9bQJBUU2IpaSYTGl3FjqzZa2tvy9v/eb3L1zkw9+9gllXRKI2NnNyfKEndEUnGVnOiSNFN4FJtMpIpXU64bF/Jzp9Brz+Yy2W6FkwHYxLy5eoGLJYlMih3MmOxJvNdtLRaJjbOtJooBtA9ePb7I/3COWnnKxZXNZsd2sMK2h/nxD1cWYzpLECVHUd0+CHeDR6Fhj2obG1qhCIGVHWwakjxiMHN6X6KBRIsK5QGsd26rBtg5Ttdw4PuZvffdXKbc9e/Gb33yDu7fvcPell9jdPWA0OiDEOZ89OiWNPSGCP/rjn2IqQRwlVFWJoyHZkZTbhmbjiLOELgSkCuxcH3Fw4wYyyVg2Fdu2YVMZnp8vWNQ1w9sHlGnB5bLh/u3XGeYx29VjVsuGmBQvDE2wbFYV9boiUREixAgV49oWs3bEDBkOM7y37I1GvHrjAUM9RvgIFeXsH+1xOB1x9uQhsbe888rLfOutV/nlb36ZW4dTns/W3LrzgG+89Rp3HrzC3S+9TT5OyCYp2e4YJxznq0vOtzOmuxNGg4TZi8c0bUmRZ5zs7KGtpNsGjvYOwGgefvqEy7PHFGIXbyJms6cE05GrpF+AsL3Yoyy3iM5RxBnZeIfxtbsMJ8dsNzWffvg+i9PHmLbBVA22rhgd3CQb7LK3O+Lg9k3WxkMErm3Zrrd47+lsy+XsjHK9Run4irjCVccxfHGu9+dbL5EwraduOqQWbNcl69kS4TzWhV6RCl90TYMP8HleHv+FCUtIebWxrK+EKP1zdM5z5fYjAElacHBwDCKwXJ8T8GhVYK0kjgr2d/dRKtBUAeciIO2XaozHXl22ZfBoCQKLCB5nDN6FfnJEjy5L8wzrLEGKqwLZIyJBEJo4HRKnQ3QcEelAHEmUFmRFSpQowGNtg61rkkjRKYdOBLG2rFclDgHCQWfJc02abrHdgkQNWZ03FLmgrh1NR2/ayjR1W9F1BiUDRZGiI41OBFEi8GHAelOhdEzTeNo6wXR9HCFJxVWXuLdsJXGCNY4+8ADO9JY4Zy3B9oYypT1H16ZsNhs264b9/YQQtRwcXUfQE3h8SEkKhZAJm1lFU/e598Vszng0Yjnv+Oj9Da6NUcJQ1ZbQVUwmCecXc9qyI5WCKAIpNFVV8fZXvsG///f/Q/7gf/9LFvNLipGnGOXYWrFaVeAEnbacbltu396jejHn4XtLtEuoXtSUtmI4zbl1/xAxkkRdRnlpccaj0CjZX4Y62xLHydVnWofwMbYLBAumMWxWHeuVo9xYFJqTl15hfPCAQZby4tGnrFeXffQtdGgZ4SJDaPtsbHSQs4m3LBZnvH54i+88+AZn2xnr+UNOpnfIJ4dsqyXVs4eUds3e9a+ymz/grV/8NnuDlKePT/mNf/e3OD9f8Et/528zHGk++eHHFLtTjl8+wfqIdJD3E7VsyuNPP8WFFpVqrt+7xauvvs6P/+IH7A2vs3/8EtObh5yd/oAX5w+pmjWbckHVXbBaranaS4rBLm1dcb58l0FxRJCWTx79JTZs8MFRDDUiHEDd4JsZbXkGfsrNu3dJREy3CWQHCUIUDIc3mJ9btC+gG7OceZqy5Lf/0386Mqr6r/1mI7lxLeEzuwS1R9UYDJKok0yyHDVMaRqDMI7RsCAERzrIMW2vr/z84Sx4K0lSRdd6JAqpBW3bIpxABnF1lPWaPWsM8XCCyiR143j4ac3JtQmhjlGqty8ga6RIqZsWFWkkEhEgdA1YT55IDI4sK7C2w9N3bIfDMUlS8PDRp8RBwefYLBGuOo09Q7XvqP7Vy6P15+NwqJqag+MDJvsRjU1o6xWDYYdrPHneUQwNzXLL5Szw4umG6f4eQXTEeU4xHuCMRkS90jF4w2R0Qp7ElOWGbNwfos8XlwhVsFjXpEVO1RkIiuFkByklJ8UtlrMZz0/PACjSokcn+tBnMI2lbLc9/qooEFHcL2/1Em2yPEPHgqZtCMYiI0Eq0x66HHpOrEAQ6wipFZ0zeBuIUkmR5Vcfgoq2sSjRawCXF5cEG8jihFRrOp0ySncItuTs0RPEcEMxzqkiz+W24+P/7We02QXFjmL1RGC7kjtHCQ/ZoiYxwy4QREznPMZ2fPM7r/L+e6dYH3Abh04LPvxsyU9/IhhOUuIiZTLMqcqSpmwZ7o+JVcb82ZZOSiJS4sSg9ZB6Y/jRj3/MfHEGPqcYKf7Gt+/z6MMtbSnpsoosjYjwmK7v/l1PcpptS1caNqsV1ji6TtJJQLWc3BwRREN5uWJ9Cc+ifrQofUxtLM411HUgSQdEsUCOB9y7e73PSnWe9XpO07bQgLWS4HsrTrm+JM9TokSjU4uILDJKodFEIlC/6CBJkFGESDLKEppVjC0NhBapA7GMiDzkSYoPgsefPOO/ffo/kuUxKMXZ0wWn3ZJtZRhPP+R7f/SXHN28h6tbXn455ic//hOCh3d+7nVWqyWoV3jvJx9SLbYcv5Lz1msvI4NjXZa88eaXebh6zF+8/ynPXyxoyoY8SUlzSRF7BsMhu5MpbV0SOkvXKsyoIY4qUtmb7FQS05aOsm5IRASxREQKYxq8c7ggsIsVKobt1pOpji5s8SrHWYfUkjxSJGrAr/78z6OVpBhmtKZfCguDZ7iPnvLZsyc8uP9NxkrjcLzy9tcIPqXrSpzvaHcinq/nnD9dkw9yJtMTxuMRvolJbUrsJc48Z7Fe0hoNsmRvHDHdCWSjiDeKVynilocPn/P4RYPOVV98uIr9/X3e+YVfoawkphV0wpGPM15+8x5Z/Bq+VVB9mc3qgo0sSAcph9eOMTKw2VzQbrakac71Oy+xWlwwu5iRRBrUVaZdOJzvEXiE0E+tpLzqgkIQfXnXVg0vnqxQQSO9QPg+DuTpzxPjHEr0o3wRQIp++fPqyO7PeOcwpaHrWoo8I1z9e0r2tq4QxJUQoWW5PieKJM5Y0J5Ix9S1wfsBkTqiM0+R2mJ9i0IiVUCiIThE8AihcJ3He0NA9AtT4qrxESTWCJJ4iNACpCfN+46wExqPwhiHkP2iGxJkKvHGo1HIAL5zyODxpkOnGfWmYxjvIdKKremQKsVYi2kUhzeOmC3OODt9zu6+JtIwnkZ0ztLW0FUSoWNi7RAiJc9HBFGz2W5Is13ywRH5cE1TNZiuoWkDtrU426ATg/H9BUN6B6LXj/eWQVBS4m0AVK+5dQ5jJRcvNggdkxcxxrUsLxVFIUgLwYvTLftjTWcdo/GI1bZl/3CX+dkF1dYxf3GJsQ3FOKFkTZEc0qxrnIhZt5Zrt/aYHue40HL2aI7uDMOb9/lX/62/D/GGV944YLzT8dEnj2i6JbVTaBtjGyjUgOV6SRilpIOEpnXMNxVxmnLv2iF7OzE/++ljFuWWTAru3rjPtix59uIZ267G4dCxAtdTUOJkiKcjEPAWpIjwvkMJS71uWZwHxrll9+SM/HCPw5ff4snpYwZxRFCS1hviEGiVRESwayuKkHLv+ldJTkdMDkZ8ffoqD3dyVh6GoWOQ5WS33+ZooEl9zLxeYBcjRtfv8S//27/F7rVbHE7vspy33Pvad3n5pdfYmBH1NhBMQIqIRB0CETsHA4RXCFKsSMinA37zt/49RvmApVlydvl/8/7Hf8KNa69x89ZbPD//iJ+++6dMhy9xdHyLy8ULnGwJfgx2lywac+fmHt4MkKqiqRyTtCDbG9CVF+xfexvr97l4ckaaekbTfcqmQ8mYzbohhIbLc00S17T1VXTzn5LHX9tR/e/++H/+nboR4FJM0+DaCmcsw/09kr0xepQRkoTJeEzkW9bLTX+zrw3h//XG8qE/qJJU0jbd1cZ/P4LO4pSuM7jgIYj+Fq41o51dLDEiRIBiWy4IPmKQjVEiwVqDQ2CEwQmDsx6I0HFM061p21k/Duo8tjMIBQjJrVsPmJ1fst0skeHK5iL6DkP/l77jIIQg9LFPICBFj3wxtiUZKL7+rS8TwpiL+QVR7nj1/htcXlhquyAuWrJ4xO7RNc7OLmhMhfeeLJtgjKNra1bbFTa0RGkKKKqqYVk2dE5wuSpZblsUisV6hdb9hnJVbftOG70GbjgYcHBw1GfHXOhv20KhhboabY0D/KYAACAASURBVASSKMJ0bZ911QqkwOKwwfZe7qhfVshHKbYJWCy4QF03xHGMjiKauiGJY0zX9hIDFWFaw2BnQls3CCHQUUS5WCOlpiorXnnwMgLPe+99QN0ajgYjRnHM6fKCZVfxpH7BUj5nL97DtBozazg4GmB2tjRdRF5EVFtDUwl8iDk4STm5PeajT2bMLwMmSBrjSHJFNtAEYSgGEqmgbQwgydKY7abFbS1JOiCWObtZhLENT0/PGe8OaV3HYlnx9ttvcP36ER+9/5jTZ88p8pjhaESiE1554zoP3vkG0uc8+uBjlBQMxwWbbU1rtggk+SDC2i3VRvaRka6ls4oohb39IV3borTAC4uKBLW5xPslTz95ga8M00GBDDmIlOn+lKA9ZXnJl958i1/6pe9wOV9hnCUpHEiP9TWlNUitKJKY0AWqcontOkSruLG3SxFnFMOctmuIpCZWMVL1SKFxPuFg9xipNNYGVsuW7dpijGM2XzG7WPDo4w/57NGH/ORHH9Eua/Z29/nWL/4L7Ix2WC1KdsaKybTm1s2Xeeeb/yJRNuVyZfno45KnL1bEwwTVlviyRmQ5+e6A0ThiMBiQDYZ0psQYz+1br5HIwOryjOXW4lTCarOkWV6SBYuvO7wRRDJB2L7DcrxzHWs821XZL79Fmpf2dtnPwHVrItGgg8cYSYgkQQZ8bfG2V4UqKciV4O7hLod5QVeWLKoF880WEwTresVqMyNIybatma3mdKG3lV3MF5w+e856tkFEmsH+CINhtakoqwqZanaPxkx3J+xMR3ztG3c4urHL6dmcpi2RWlJVJdvLjiSdkGcJrtpghWcQx+wkI6xPsUIxObrGzo07PLt40k9d9o7QKub8/CkfffYznjw7Yzaf4X2H94ad/QF5ETOfnQPuiisp+7x6gBDEF91VKQU+OCSgRF+ofb4kZa8KJBH63xel+k1sgfzCghXgi47tX4kGPMH3cYPgHd57oighSVPAUzUbnG2Jr+gmCH9VQGt29w/YbC9ZrRdEcc8WVTJCeEsI/d6CFP5qQUvgnMEaRwiSJM1J8/xqBCyvjFmqN0SplCQbIpTGBoO1LXHUm7aC6LneUlxdvFuDc4E0zthsKjZVgzD9Ei1SI1C0xoOMsA4Gkx28aiFaMtnJePbQslnESBGTZwWrecdoNMaLGmRPu2naCiQoXdC5Pk85GIxwrqGsFqioZ/5aZzHBo6RAXn01dYe3njRN+0aKiHGuRalAFKUEF+M85JmkqpesFpJ8MEJHjmYDyB52bww4EzBt15sleywu5abjYH+P4BuCjXC+Y3m5pmsrnA+slw6lE6zzVKXkzfu/AKnkH/1ff8RmteB7f/jHtI3m6Nou0/0Nm43Adg0y0eRFRNxKzHZLbTboRJLICC86ZvMShebsvKFrPNEwcGfnVVaLOZtmA5HHq9705p1BCoekx5EFH4ijCO8tkYZI9Q0vLQXlecXDJx/gak97WTI7fch4MKRzlkCMRhIkXJ8MeF0OecWfsFeecLT3Ck+enKMuHUEK7MEOphM4JXAqIhVTus5yvnrE/PQjQlxwuHuL1byBSOGxmDYn6BitBgRjGWRDjLOgwdnAKM9Jsww6RXJFz0h2hqjxkCAd7777B8RjzcXsOduyQgtDUxoirRmOYqqyYTRKWaxKOgNlc0rVzlgsT9k9lLjQUq9WPJy9i0osIhmCrqkvVzx+9CmmfE69PWNTPSXoGZtlhYzm5APFcuVpWstv/yf/0T/9HdWLx0uWzzdoD2VVEoLi5KVjxkdTns1XDIiIBhHb+YYMCB3kaUJXGUJQ2C94dpK6MuRFio4geE8IEqEEm2oDQqIQEEt8CNRlybRp0XFG40peunNCnB6DqJBNh992SEZsuzWd6/pQvhNYOmwbUdcVy2VKlq/RKkUEiXVVn9lclSznSyI+P3jFVXH6ORtQfDEa06r/ng2uV7ChqcqO1x68ymrV8PDZkmQ04eT4GoPBbZxYgPTkwyM+fPcR+6VgMC7YrFqyKANjoANvS9IoUNU17bZEioQsLlAqwkpL3W17c4uX7IzGFGlGZ1pUANc5kmFMXTXYqu8Ga5mxf3TE5WyOJGBtd4W4cnRdBwjiOMZ713cdzJVXumkpJgVdV5FlKTSgg4PWMxqMr/S3fRcmuICWEdkoB6AxjmEaIbuEalPTVg17gwmdAKNMzz/UAh0EWgVKtyWYlrKu+tB8AqVMWG83ZNWI0VjjVaA81ewNYkxSkdxN2a4sm/mS+RZO/3BDZyVx6smyjLIsiZIWa0I/AjMFi23Hzr7DmJj1smI0HJEOYxySrt4w2ptQWXh8/pS1W2CNZGcv52J2yaf/8CnbzazPjIWADZbj63eRseHg/gPO3n3M7TsnfGLXnL2YY10giTKCa/C1pFw74jyQTzSdy6DtCJ3mxeMaayKyPGU87GHrzmhU2l9QqjZQnm3pfEmIK1ypgUAxkhydnLC/8zJavY+KVxhvqJoOgiL4Dhckajpg79qAL995nScffkRVLzHB8NV3vo6xnu/92Z+z3W5J0qjvTPmOa9cO+Nd+8+9yePOY2nS4zuBMoLUdnTV0TUe7aUAG3v3xT3j3z37ARw/fZ7h3i9/4O7/OBx9+RgiOr795B99mbC5rXswbfvDepzx9sSQfaKaDhpQOESTz2YbVypIngspekE+eIpVDiQSlBcqDlhp0gpIxGkdWZBRpQt02bGtLuW5IipwoFjw6e0Zwjmt7x8jIoaMEqaa4MCToBiegdaF3wgsw3uPj/kNpuTVUNmfv2uuEVLIZ7xHRMn/6E9ZNTaJavN9CMNANKLIR+8MWbyrkZkZkWwaJIhOStlpwcWlRPmVsBE50vPL6S7z16qu8/+FnGDvDmjGTnX1Ojvd4/nxBWiiyOOPsxaf83u/9Lj//y3+LN+9/hSQfUdcVp4sXNG3DZJDS1Avm5xsiCaPdgk8/fI92UxHcFudLpoe70M352U8/QCSSIBxOSXYOdllcXPaIss706mqt+26ks32+UQiQimD7BVcf+hG70hItZc8fFQLpe9aslqrPvcLVSB8I4YtcoJSaJM/YbvpFVqkUPniQgeFkiA2WuqnRUYKzDq0jQPeCGDRSCwIdRZ4RKU1T1hjX4azrtcR4vOgzmj0f1eGDIkkSuIobJMlVRtb2NivvQCuNMwHnLVJ4jO9wRiJCn/M0xpAmCV6A0jEmGCrrUFmOsr4ngqgWEyQqKLpug0pSojjhybNn5EPDgzcmxLphPcv47F1D1zrWlwrTNmw3ETqNENKyXG8xxlIMs15qQodWoESDFJAVGQGLFbp/b0tHmuX99nvZEMcamUQ459CRQGCIVQxB9/SctGNnGhOCo15FCJUTLGwuKlwHBsXdN45Jsh6ZqLVjMesYDzJC6EBYVqs1ddUSKd+zjL0gChntpmN6LUfoiuWLBVFRcLr9jOX6OcIXNOWY8xczdJIym7fs7adcO+kw3rPatNgm4XDnJkJvsXNDsJ5msaWmIskOOJ8ZxlNFMYwYjnM+/PinrJYtrfcELUmSnk8cpOuXn3UgdF2/gO1KfPB4J4h0QSTB+JKgn+NnBe/94z8kjxXTnRxjW5zvEE7gZEcSSda+4aPaMzy6g95UfPjp99kUmvvzKXI0ItVTrO9jiuSKYNZIWXHjeI+ZEhQ6pqoDkVa00qPkgMxsaUJEJFriyNP4BSQR+F6UYTuJjhRCCrwK+GARTuGcRMgBb3/157m4fMa7lz9lf/IqQT0mWlRU5ZaqTNhcBmbnnzIoYtpuRZS2tK3vqTCLjOFgn2eLz7h1cpv15ZqEKYqE63fGbJYPGciUbTnE6Q3GV0ymQ9rNsseDGojM/z9F5z/J468tVNt5R37let8/uXEFtI6x28BBMcHVHaUrGYxH2NmcbdWyM8jp6G+qIvQbp1KqfgPQ9py9prYIel6cjCUa3XcanUVoQRoE86fPCJM9podTVuuKqHXcffkGD44n3NrVnM0fMYzuYVGU2w2ha3FhS20kWfESv/sPzqiNARnTNA1J2kPjnzx6ius8SdKzQHvdAP3CgezBxbIHcPYtCNGrX4UMNGXJ0fGU3f0BW7vkeNpSVp4XHzzn+0++x97+HsqMefiXZ8Rhw/t/XhMnmkhHbDYNQW5AwmCwj5EdA5UTnMcbi8T1hULT0nSW1liWZsXR0RHzi9Orkb4giVPq7aZfmnIWAnhjiVXaQ7uDw7iW9WYJzpPnee9U7gze9w5nLSTBBBQRTWWomxrigG0jjHPEoR+FmWCI4+RKk9iPW5SQdJ0hUjHaG8ZxxGik2XrLbjpiVm64rA1plNECXdKRYtg62AZNPhziTMN606AsdHsZfujxgwqzVfgNSGKePm1Jhn1xXNYW042oty0Ej44UgZJIQ1c5FAoZC4xpaVrDaq2pm47deEBwoi/WEwtInJGoSJMMUupOIoIDBE+ePqFIR7z2+us8f3LBfH7BaHLCcJLw0adzdlYVl8sZ1gjSrEDHNaa8ZDCY4H3CZm2Y7IxRylK+aBjmFi16qUMyhc3KkqaKpgrsTSYgLL7qON6dcrbdsF4vKKYxZRMo65JIJURRznvvvccnHz7m4vIhTmyx0vXP33lElaCjjur8OaEaM/25XyOKD3n08Kfcu/86d+/f5Q//z3/MdlPiQkvXtQivGQwmPDo750cfPuLbx29ApNFxRxQSUiUQWqDpL0UH+zss1xUPnzzk5nTIj374Q77z7V/gV37lu/w3//0/4C9/2PHVt6c8vTjlT/7iXU7PZpSV5Xg0oIhh2QRWbc9O1qLFhkCmYpJuxKrZYitLVVmKqcSi8K4BW6EjxXZZcbnY9mzaSJBELdJuiYe7yClYI9jakuVlySjN6O55UCNoBCoWDK/MOV3d0liLU5I8S1ltznn26DP8pmXn9nWmBzvkw2NuxIEPTn/IbDMnWImILGnsuVxukUFy/+AOTVWyCS02T8C2jJzk9WsDpodDJtMp14/32T/a4aPPFtSdZzetKRcluycTvvud+1yuVnz8aEacBpwVbC8vsGWDznI+/eh9Nqs5Ihh8gNNywdnsKctyQ6JyXrv3gGvXCxaLFZfLNfXlGWfP5hwd7rOzd8zZxVMW6xXOtCgJcZJRd/XVxVshZX/cC9GjjpwNKK2JIo11BodHJArnPN5ZFAIbeqKIM+JqAbO/uPY/h74RIQQ+eNqrBSzE1XkqJEJqPJ7ONkRpgq9BRxmt7fBeo5OoX46N+k5uEBrTdkjVEdwWaz1SKJToO7XO9qrbru0QIiHJUpTspxgQcM4QCBRFhvMB4wNVvaXrWqK0H8lLKbFdb020riOLEryzfZPENCAEOk/QQmI6i5MCGSTKW7QKjEJGuJqyieDZGQ1x9Zof/chw/tgS5zFCeqxVKJmxWq1g43FOg1DEScrqsiPNC2RsaLsa6c1VBtOjNKTDGJ3ErJYVWvdLs53pkEKSxBpjAl3b4PFX8baW4GqcD5yfmn6BViqS3LNd1Qyzgli3HF5PuX6r4MWzLe2qpWocplWIoUAqzWCUomRCU0riFLwxTIscIsFq23J4fJ0bD0Z8+uRjLl94ln7O66++xFdf+g6PnjwnSRKcNygRsdk4rDTsX48JWLSpGQ4cF4uOm9duYtqKH7z3GePJlEgaDq5NKHRL2bWcfVCy3rRU246dgzFNu6WuWyKRoJOUrusQCvJcUpYlg8Fuz1X2DS6UaJWQqJzOdojg0Tk0yKtLUd/cQXiCjICIzlj8uOP319/j/tE3mYibTNeSPz//CW/ufJtOeJzoSMUQZWI2/jO+96d/wKu3Xufea1+jWzts1CKDJBExynZ0kUZ7CMFhgyDIAmU1KjiCMPgkpgsOLSUOh6RX/nrnUFHHo6c/5fnpzzjc22c2u6TYETRNznCccXq+IEknvHTjK3zyyUMi2S9Vt8FRrSVLuaSrDTdevs1+GuP3TzifrTm9WJCrhDv5Da7Hnu+3HxNnKV2YUm876sqhokBtQcjs/+t685/48dcWqsE0BC0hTyCWJLJgWzfMV+u+YDqf0zhLLVPGassgcSQWMjIMDRbbG5YUdJ2l3MJ4J0XpDtd5lPNEcULbGmzw/XjJeEQIgMN3FeW8I9k5wYeSri5ZbW7zC3/33+HWieT7jyo2xnI5X5AmBteAaD8jqtb8H7s/YvNsTdA11nkyWeCDxdktoK6UrpLg6REpwva5TJEghILQgkhwoT+Q8DEhpPwH//E/z7WTA6rSsa4X+Fpw+mJNltzmo08+4+GLlk/fn/HlVwdcG6fs7O5z/ZWU4AXlwvJnP3jGclkxf3yGHA1w7Yavf+OE1948IVTQEjGMEvLhDi1rXFNhXEsqJlRNSW1afGOJ84jSepIQo5Qmjz3eTOgwHOy/jowt2+2W3/u9H/PsiWWYgoxTvK8p4inWV1SqLzhlXtCVLd5oFIoo0ixXS7RK0HFPZujs1RawVSiv0Fow1GNa75F6Q2pG5JnCA2VWokVgaz2x0zgRUElMpjznT89Jdor+UFlJxsMh0rxg3SnWrSVysLhcMpwWbFeGdqMQLmJdzohlDNZD5HFCooOkURGmaglGkY5akkTRlo6R3eHO8T4fny+pgyPeKvJ4jA6K0BnSwZTlfIPxkGhQWczO3i465IwnQxIZYcslH3z4EC8TdNuRpillGsiKlL39PUwIBFFS9uIjdB7IckU+GrNdeXTakWQRRZGTFoLxZMhydYGzJWmcMIoTFssFW3+JiocMBkdU5UP8wmCGEkRNU5fcuXWDlJqHs4bOdnhjEcRMhpr9nZu88rU3+NO/+BH/y//6P7EfFUhi9IOI06eb/4e6N42VLD3v+37vctZab9219+nu2Yec4XCGpKRIXCRKpG3EkAEtthUjjg3EgZEEAQRHTmLBWRQZ+WDIBvQhgOUIiGPDUAxZsRYqlERZ4nCbGQ5n4yw9vfftu9W9tddZ3yUfTnVPU5QoW0nk5AV6qXvPOVV11uf9P/+Fpy4/Q9tlvPraK6hki1BrDu7e4ns//Wme/OATWOdxhcNLseL/OTwVkpSiKpHxlOlsSj52PPex7+X23Xf4/Bd/mycee4xOepr5dMT13Rm3d3cJ2y2efPpZ8vGYoJozX1QM546iTFHKUleQVxVBCLPlhErmRC7GFg5qixIVUioyC0tXsb7V5cxaijJz+jspO2e2GR5Oee/aMfvHlmUF7VaODBdINHGQIfQJIpAYUVLbirqCWickOxvIrEDmC7QviAKJbbcxSjNezDiYTEAZ+tEGwzvvMV8WqEgx1kt05UhVwlgp5GCHuCzwVcWlC+c4t5lw9vIHefSDz1BlJ3hreOett3nx5Xe59NgTPHV5E7G4ibGGa/t3cKKmHUisa6yB8sWMr//eV2EBxiwYT4bIIKDWnlJ5svmYejHD0+Z2UbNc32JeZFTVDGUXmGrCvGoRBm1m8ymj432ME6z3+8jQY8yMdBXLnLsCHGgCaiRCNAVpxapNbj3OOIQXNPLSxiGgcQu4JzRtIn7uCam8W5FUESvRliMIAsqiBBw60CA0WV4jnKHWiqIuEaqhHTllsAbCGJTy1MuMOlsgQ41o8P8m8GGVEFg7S1VanNCkrZg4DRtng9qhlSYIBUoHOOGaIto10q8oDpFKNMLCMkPrgCSOSWRMbRpbwjzLKKqcbreLVrJJ9apLjIdAN2JgKyUI3yjRqxzpEvbeW/Leq4Yk2aQz8JR5jtKaKq+pqqwBFZwiSsJGiyFAySa9y9SGTtLDlpZskVGamv56ByGa6NgoNgi9JE0jSmMpZ014hHcFuKa4rExNEGhs5lnrRZy9vEncFYyGU9579Ygnnz/HqUsaZ0I2trsYv0SJdYpORm0qbl0fk5djitpQVxFJy3LqvCCbC3yXRugsMjotxd6tIe2O4vzWJuXokHrpUG6dvZOc9qmIRy5fZjybUFcZ2TIn8OsoN2nQPL1G0NVEZZuiWHIyPOHimR0EGiUlxcjQ3zlNMd5lerxAKksvCWiHFhGkyOkUa2rqGMCQl6B1jEpjZuWCdishVj1MWTRBKxi0TJFhhK0roriiMBmCuPGlxaIIca5kbT0lP102yVjJEXJ8lqGYU/lbTI+22Tp9lqmI8aIkQNDyLZ5+6oNs9i5TLQuEUmivcI5G7yI10jZ8aiFUA4I1isQmqwaFdLZJdMOA0SAESlaMs6tI7ZktK07tbCPcFgcHtzGy5vKZ06wn53jz6jcoxIhbe6PG9s5alhNLp5uQXgCTRUwmd8mWc3oXH2b9XMHV9+7y3COfQsQFN7/yBtvrCe2jFlfJ6bcSopHC90LWN9sc396ljNr/jxWa/3fHdyxU67qGMMGZml5vjaIsm7ScXLIsC+pA4OdziCXhw+cpl3Nmt+7gc48axJCFGLtEBw5wOBfgrAcfooIS7+XKQup9rtM9vqi1jn4c4mPN8XRKp7NGUVe8ef1V/sm/+DV+9r/+T5HZbX71X36NKinZOr2OrGP6689x6aE1ovXfRR3ebUQo2mNsiXU1SdIicw5jTKOAdxKp1IqDtWIPO4+QTUGG97jaY6uCv9f7czz6d3tAudpDHQCeoTmgn+TM+zvv5Qd25AswvmSp/nabT395zNlpDL3V72Lg9dWfbxuD949FC4Llv9Ex/ZbxozwCIStzxdUPDXxDH/A/qN+nKkrCRBDJmNKCqxsPTikEqABpg8aSS7XwXiCdxdYVpy6f5olnuxTFOqGvEEKzzByXtePRp/ukW4b9WyU95zj2c4rDjAsXtvjuH36eV76yj+p3ePz58+zu3uTRy2c5c3qdKNzgpffeRO145vMp/q7m7JmI0XDKMo9Qos/seIEOEpJWwPxgxCNPPcl3ffhD/OZvfI6lnyBDx1rcYitU7HQEkWxxMp+QlxpjCyQLYlNz5+aQ0PdwuqB0BUHY4fboBvGFChWFWGE4Ho0I4zbdrmT/vffooBgdHnDlym28b7G+1cPJmm7fYUxCGEYsl0ukD5DCY21INgdTenToKLMFgd4i0iHf89FnOXNuQDGdUuQjZkXF737+JTaCAae+63GOZ8cEcUg33GH/cMgkc2wMzjAohgx620yKGU889QG07LN75RbPP/QYjz/7DK3OOnd2b/Lu1du46hp/4Sd+jGc+9SF2Pv95HnvqSfKq4ptff5mPfuL7Wdu6zHQ+bfiAhFhbgfcEWmLtEuM9ZelY762jhGNvb5fHHn+Kd996m2+89CpZMcZJGM0Lult90o0uQgdcvniW6f5NJjcLOrFE+yVlaalsjYobsQ/e04lTIh8TBCFW1BjpqGxOK9rCLAtOJnvEl1K63R46iBkXgr1xzXhpiLqSpJLMxiWzhaQ/6BC6AFWWlFWJlAoZSowvMUGfo1ygZyWnogAhU0rXRVqL9hF39w+ZFDO2Tz+ElB3Sfp9Zccwyq/E64MK5S+xs9rh7/TbWClr9AVRT9keeTAVcm7zH19+aYNyc2zevcXfvmGWRceP2Cd94aY0zpwasdTWzIkYmA0yYNQhhZUCHHBzf4fVrKecevkC40QEJk9mUclbT7a0h4xaJTNk6d4bKVazHA4RZ4+hoDwLH6OiIk9kNal8QtzoNiuMcKg5p9fvMJzOCUKNlgjcW68vGW9Xr+1ZS9+69jaqgGeJ+NdqIpRo7u3tdMvFAy79BM/G+sWVS4ALdULoCicXhhSeKgsZCapWw5u4VmDpEIrh17RrT0ZhAiSZ4xDXbD4KkES+ZGusb94C028YLg1IhgZa4wFPmBVhHaW3jCRoKlITaWMwqBEFqRSgivG9cZXBNZJFSmigOCUKNNTVSxKhAQRqR5QWBgiCIqIoCY2qkltTGMZpPV10nhdfQ6bXoiDaLWUF7LaYu5kzGMzwCrTVKSfI8b/aNVFR1xTSbI2nI41poXO2p8oL+Wh8dBVRlQb4oEV6BqDFWgW9QVWEl7QjqXNDfSnn2e84jwwWHdxecOr/O6Z2EwZkORlf4qofNLLvXM/qDNlaEhJEnTiRaJ3hREyWCtUEMteFkOCaNNlYC5xIlJWEgaKd9hnePGQ0l3Z2Yl979Mh96pMNzDz1Bmf8+ly8+xN7hHWobkra6VIs10rbnZDTl8DgmDiVFadnavMDe3jFxLOisBVT1gt3bxyzzY5J2SL70bHQ3EdoyLeY45UmSNdbPbHO8dxPnFmSFRWtF2o4wviZKNTKOaek24MkOx9TC4aRpLMcWJTioMUhlESwJVEg2Feh+TNytsPaEZbnLvJKcnC2hvEZUfZgw2kL4kryqUFGfzVYLVekVWVs1PubKYb3DiCZgQwHi/vVkVw9hiZDNBEr4hkPuhSdKIoQs2L/+AifjMev9R1nbbPPyi7c5fb5Hp+twi4tsnDuH3H+N5fESEznqWrO2rsmqMV5uEgQQBI7O4DyJvsiZsxcYTvZptwuGw32e/MAzzDauk2VL6qiDHpY4UZHLnMAFzKZjLl1+HKfuTUL/3Y/vWKiaIKSnE85fvsg0WzRq5smEwcYG/fUu/YfanAx3qeuQ6byk3dsgejSmHs6Y7N0lacdAjEAShDXOFjjXWAeVZUUQBPdbSVpBbTxaB/gVh6qY15y7dI65NRQzw93bhxjv+Ue/+AtQZvzMf/NTPP14l9ffmfGlK68zWlzj4CosTtaZH+0TRuJ+e0pKkNoj8U0hJjVIj195r8E9H7bGykUgQBtiG1JIg9UB/+DuF//ke/oV4Mfglpn8iVavjs2f/L3/iOEf+L8Q77/O7v+ypIDVldYsIIRHe8XbX5rz9pfe/ZbtXdD9B169BzQn2A4Nr3V2MuUbr0wRNJfrWy+/hQk9n/kbn6TTGlCplLent7l5NMRmEULW9NrrDFobvP7mbRb5HONrfFWRHUuyuiJfBly5kaPXLsLRLZ544iG2LzzMv//JjxPaN5DTCafOr/PlVxrh0vd//BSjuqBaWI4PNRvnNDrJePubQ26+d5cf/OT3cHd/TO0WSH2+8W0sUg6HI5aknNkccGpDOwSlQAAAIABJREFUknYlhY24eUMxHC4xVU2V51gDwsum9ZpETbSkdQgjqV1NIDMklm98/XVG4w/y+FMf4uxDa6TtLu9cszz9gQtceuppXv7qVyhGc+rckgYL2rMxD104h3GWDz//UcJA8jtf+ALP/Hsf4JkPP8taZ4dCS7L5ZJWQI7BS8Nobb3P+/GNsPv0Rro+P6cgW3/XZH6YwCa+9dot+T5JESRNwETaTk7yWSGGpjScuPUdHI04mh9wcHrIwFdJJju/ur0R0mjJb8PSTj1PJgNG4ZD4uubs75HiSY+sSW4GxiiAKEBGUZYYpFUmaNgW9W+AdYEAYjwphY22dbi9jdDTmytuCTqeNDguqqiTRCdNZznzauIYEJajcoESXID6NZo4KJFKHRD4n6fYoTI2TEZVSZPIYI3IEBZkVhMkAb+dcvfs1bGnoJps8evlJjk6uMh4PMeNDRAA2W3L18A6D0TpnO2vsH09Y5lM2t1t8/Y2vMhvnBGVNWS8JkjW6p87gI80bV/ZZVFNECtYLgsojAg2EhFJS1UuuXf0mnY2UsxfOMR6N6LW61LFhrduhzGqS3hZBe4NyPKTIPLqSbLTOc+ncw1y98hKzkxGtzhbbOy1EkTM6HlEWljAd0FnrcHJ0DIXHi8ZNQuARGqgbD1JrLWoVDHLPyepBS6v3La7uoanyvtF+gwq9z1vVSt1bqVH+K4nJK2Z1iQyiJk3KVkgkkQ5QHsbHR1R5SSAEddkU0ipU4B3LrMAJgw4DOukaaTvA+oKiqJswECkRShK2A5yvUUJT14Yyq1BB0Hi7SoldfYdGWBoQxwl1mWG9pygypNRorYmipEEzZUSn1SKKQoq8Ioki0ihiOp1SG0OoNGFHInxIni+Zj2uMqVGJxHjBfDql12kTdWJM7ajKmkiEREFElmUsygopGtuvdiuhLCuMscwnS5xzmHKMFwpJgHcWKQLiUGKcIwg1zz97kcnkgKuvj3j4iQHnntqkjCa0k4j2WsjGTsLh/glvvTXlwqWzFMUe07sFdh5z8+gQH3dJQwjDFnVlaXda5PWU6bRitL/E1SHCT1G+cRwRWPK8YDIasVwsKLIas9skHO7v7fPuOwknJ3tYGqpIJDyT2RBrA+JuBkHB3aMMJSDRPaimDA8btLjT05RVwWxx0lAyXEG718cimnRJLYh6mnJZE6gmdS2MYoRSTfqVq0mSEGMNcTtFq4Bet4+vDYvdEWm6hiBA+rJ57nsPRpFrR0RNlXnykUIkAUsb0Q0UaW/J1M24fOo5QhXh6qagC5OkEX1XAkVDh3MNr67hetOgpypQ+Nrh8Pe1MGIlMG+sMJsHrxCesjxmPB9y8+ZbuOCIyfSAMhNMZ5CVU8pacPLehHbU5907LzCdnZBE6xg7ZjzKSFvrDAanWC4zyqKg2xlgTMo0O2E+e4RB/0nWnnwYZ0N87anmhmSgOFks6boYrTRju4RaUXjJ7Vu7BOr/J61/vShxaYvbV28wPhwiAsX2udNNJn0asKwzTBCSxB3KaU6xyBmsb7I8LvnQs0/wxjffaZSdQBBCVdqVGtPjrEYEGufs6gAqpHB41yRUSS3IqznzxRSZtml1E1Ld5tT2JmtPK/L8mC+89mU6xWm+/BtfQj8iiGxMmA8ZbCYgiiZZKpAUhV8p3iWmqhp4nnsnjKRBez1a61UKECAchTG4VoxcBrTj9w/aRJkm0SWMKEuLVM1Jdy85xIvGLcAZy8ns5Fv2acW3F5yP6A1umDHmW/wg7ilr/bct///G8N/pbfz9v5oIxj/Ct+KKOf63ek8BYOC//9kXqMsC6y15mZNlS4RSSBVwvRiu3rrhkjrXuEg0e0ZwdfoVbr76dUxdYazFnCx440tv84Vf+hxxqDDFkjiKKEtHWS75lc+FjWuCdRS5JW0ppPSNuE/AD/x5yU5rm73rCdtnNzm1vsXxeERxa8GNW0ueePgc6foW19/YZ3f3hKPhHGNXKuBKYkxGEFoQlmWZEeqAcFUAhMRUNRRFTZ7POPnq7/D6N75KIPvoQFBYzyumx1s3XiCVM+Jac/F8yjPPn0YHDS3FGQN2DDrmL/z4Y7x37V3yacDx4QHXbx0S1jknR8ccVAviyPPm1+/w6ktfZFpaQqV45NQ5psM1Jscj+oMBLfpUVYN+iTDAiQ5QI8gpy5J5lKKqCWc2U+b1jNnRa5iyJp9VCJUgNQgREpgIWzvCPCdfHjPdv0m9rNlZ30IPPLNZhrcheZVRlRJlJdODglA2SJ2ON4g6BTLcxRiLWU4RiWBwqs/B8CY3buyxtr7GdDwnn1fUtcQArVQhpEOFULucupjiyoy6lMRRSGzn+DwgpYXSjk60pEfF1AkKo+il25w6c4m1vM/+aJfJfAgYplnGoHeRS6eeJiBjOTkgy6YsqxGiqrnYatPTklgKZpMluRD0zmzDaIyfCFTQ49S5J7j82MOcjIa8+sYrHJ3cZnNrk+xgzGKRNel2VYmy4KsFt954HW09g8E2pavRSYuwtUGcWuqiIsSRtmJMXTPo9VnfXCdJBF5mhO014lab7toOSnhufPM1ju/eYuN8j/baad67ep0rb7yB1gotwWJB6Ae6WKskq3veqKtJ+/ve0o3a/565fsNBfX89peSqUhUrkVSBQCDvgUg0aKGUGoclCiRlUTY80jwH5wgleGOAxsqqrizGgY4craSDJ0QEBhVpvNFIZZrIYmtBSpI0RiJZzJdIAtJ2i7y0LPOSKIpQyhFGAXGqmzjSqnE2cUC326UqDXVZNimApuL4aEg7SYmTlDBMiJMO3nrqaspi2aR6tVJBtlwiVpZJi8mC1DXPBhk0gTHLZUaoArxzFFlGoANaccpikeFoDP9ZhbA0IljfOBvU4EWNl55ANTn1UjaCOBUG9LcSRBTy3Ped4/ylsxTBFKcTJiNLayC4cuMqxsSgPF/5wjUGa218rcHU1HaOLCUuVESJoswXKB2RJmvMxnNarS7eNHGcUGOrAK0j2m3BaHwAynPqLIyPFHEkmRcHzOtThP0E1fXMjyeoWONrgY5mhHGbzkbCbDHFFYLFeEEko8aBpLeOMwJ8THtQUC5TolRRV55FOMPWiihuE+kaYTw7W+scHQVY71AGAqdQKmz8vh0om2AKydG85LHnf4jB+nvcevtNJD1KIrAORYUQBYkIkNYR6AicoPILCtmmDNpMl9ep44D+2gcJgnWKag5eYXJLGkiEVSxlRSA1KBDO3xdoN5ocgZareuKBZ6mnuSY8Au8tMvKU1ZI3Xn+ZIIB82mEtOU1ZnzC8vsAGknfePGDQ6rN+ekQ1PSabOko1RYiSOIoY7i9JWhIdVAgPkzIjSaDdspiqxtYG6WPiKMWUxyyGNcn2gJ31A05mMFsuOLWREEUBo2GMCGqU/Y7l4Z/q+I6fJE8ULJYQKNLtAfloiitqBtsDeoM1xpMZfpmBgKQVkmWO2cGYIjN89kf+MsOTf8bw5CZxIqjriDA01HWFRzQzD6sQaLxrzKOVFI19g2DVgHIc3Tigt7NNe6NFVXmkafOZH/gMt+4c8sJXX8BPcwYtgar7pKpg65GYoA/nTl3i60fvIcUD0jW/ymeSEikltS1RDWKPEPI+/wqxsltB4KuCWV0SxS3ie71z1xRMVWUIhcSvFKhCCUxtGpToD5hsAwgteb9OFXz7aFprCsmWbJOKAIdn5guOXfYtS/72xn/MT4z+GYduQV/E9GWCWpkaFr5m6JZUf0hB2RMx26rNxOUcuSUPGHN926f6ty2R7637h633B7/tg8vkRhGHbf6XySf5T/g/MHFFVTnq0t3P7VYyQAqBxeJtI+CQAoxt0BGpFL625PMF29tbWARKSFTURsgKYzK8dXjbWL9IGTQosm1SX5w3SCmYHRRgNLJ2zA8Mx9dn3D24TmUMUnU5GWb8+q9+getX7tCJO2gFiAxkSJkr4iRiMZqglEeEAUs3J/eQ5yXONsV3t9clakXo0BHJCssJlS2wRcFw94j2YoPL3/d9RCpkPtwnUBeZL28xz0a0+m2WZsz1tw8ZHszZ3b0LWlDMKyazissXTtPdSVk/jpu2ks8YFSNcaclsya6eU7p1qmrBzB6yqFNObWxyaquLkjHL+YidnYBQFVQ1GDnjsQvb/MAP/VkKm+HqlQ8oFZkpMK7C1oI8OyLLSx6NIzppj3b8Kb7+7pSd7ceIWwOGR3fRxZwqd2TTRshIZPAq5+xDW+RVQFElVMahpeO7PvZxZosFo+M9PnJqnXKzYJqNqWUbvRWQFzV11YgJR4sF6+0u3U5M0DUEGBIfUJiccTGnpbdIA8iNoBYxOHBWUmnF3FfUB2Na7TUunNlh+tpXmE+XpGmGjJYE3lDhUFGHjTMXKJHMFnNm1rK5s4nJLLu7eyyWGdsPnYKuY294QqftcDLk5t6Qyi6wrqBcTHnkqQ/j64Cv/P4XiEWADuLG77S2jEbH+Nff5OITgmC9R2IU22s7ZC7j4NZtbh/u0+m26LYSJvWCO9eOEc4yXhxgyhK/rDiaey49cpozF89y5/ot7h5mPDFI+Z5Pfoq02+XVL77YIJBRANauilC1mmS/77N67971YJF6rzBtumD3XjcJWM09Fdz92FTR3G+FarYrGoAiiDybW9sIYTncP2oEnXm2Ss8SeCGxQlDWTYBEr91CBSVVbagqSyw11tZIGRBFcSOGVQoVRKhQNW15qaiKGmcNXsmVuMtQm+p92y0UeV5ipKW2FmshDENanQ5FliGExFSGaT2jqg0eRZ5XtNM2URRTVjV5VeGFx9kajGCw3sHrlDwviJOAsvCkaUw6iJmMZ7iV32FVVpS+Iowab+u6ronCgDAKcasi1VvfoMU0dmy2cjgbYIXHK8P26W3CGLK9Nu0B3B0d0u9Jhoc1JQYVSFqdNbKF5dT5AQ9fFlx5ZZ+iXGCFYn1rhzLLMXVNmRvarZQsX9KNBkSBxooZYRASBQlaSZaLiqqwaJ1ijMQJR6sb0hqUVGWG8AOoBUW+RKeaqKdZzpd0+wmVDZmNobsRIoTG24Qir4haJUEYcHxygHExVhQkaZvaVrTDNRCecDPDZIJiUlPkCWm4hrCQ5ctmQlt7ut0+eIk1FZ1OD2skQiacO3OBTv8c577/IpKag2s3QRlEpFBlo+CXtkbqFrW05MOaJz6wjcsUa2sDZOcUg9ECXUoocxJhuXnrLp3+gPjUOmUNgRCNhdvqWvHOooRCrwSLXjYev/cNhx94IjboaoBwBf3OGb77Iz9Mr58wmYyhTkDe4cqbNzgc3iAvr1GGGe9eGWKqJanqUAnod8/Qaoe4Cg727xB3UlrhNnXtqacTFkXGkbmJGqWEKuChy48Qa816r8OtGxPqoqbudugmEYGsmc0nCAZUIgf7/x0j1e9YqEaVJVprUSyWmHlBUeSMpyN8KMjKgsVoydpWC2M8+aKmLgxSK/Iq4+q1XU5fkFy/YYkj3Xh2qoSqyrFG4pzF1M3N4V6k570C0uFwxiOsIShq8qMhHkEUe/bu7vHCV17m3OMtrl+/xZl+yOD8s8zNEumHHBUZk1uwv3+FOIqxtnGlds6DaIrjsiyIIo1SAqkaNOC/8p/mw/XZb98JzQQfFvA3+WUA+l5B7oDq/mLB6t8Gd70XWAgPNvq9cQ+++hY+2L2fAezIDg7PDTtGAmdUDys8Y5//ocdp6SukE/xn7e/lueAMBseXq1v8/cXvfcv2NZI1mVB6ww9Fj/Lp+BH6IsHhuWKO+Zf5G5y4DA9c1ut8JnqUh/QAieCmHfGPly/xpjn4tvcPVh5/NXaFczb7IETxYEnqYbXMg98WjnZvAp6/6Ufc9hMMtuG+ecOWbNOiKdjnlJz46j6iem8f59WicSXQmqLIuX37Nls+JSLgQOVUsuEkR07SnkkixMruxjOVEzLqFXLt+Yc/9yv8rZ/8azzy0Y+xN5qzf/eEh595mPnUcn3vmFY35VOf/cs8+5F9/vVv/jpKKNJ0AEKzCBccH5/w5BMfYjw+ZjqZonxAUWR84KknaXUibt64g5IBvVabZTVnOp4TxR7pBE47+huSsPa8+MLvULomgap98Vk+8uyPUV75Kr/+Lz7HsBxRZjmLxZR+K8JjyLOMndPnWJaGb751hbrwBB1Na/s042GOrZdgPOODBXf6c4yskQYunt9heTEgrzXlfMRsOma2HDDobVAXS2pZoGTD60IZsIIgCnGqwpaOQEvCCLAlkVKYyuDSgOu3J0yOF2yu3+TWnV0KIzm36UiFw7cVu7ctF05FbG1Jgqjk8J0T9u/s4axr+GMJbG31OPOQYU2XzBceoZ5E4JhMFuigRZjAcjYjq0vwIfsL2M89QaSRpSUJW/Q3thiJiKPjE7SR5K7FLNgk2Q4JyiVR3GI8m+N1yKmHL3Nm8ST7d28iZUZvc4d+Z4fR3lUOhndor2/w+IceZ+/2TYSs2Ds4YJEXWHL6Sci2jDkpxpjaEiVtCleQL6ZIW+CLjG57g62Nh7mw9QjtKODFl18kWywIIoXSIb6G8eSE6q1v8ORHPsbFy08gRGMU3kq7OAJc7TicHKKV5Hh6xLXrV1BhTKigri1eD8lLw3Yr4vzjj9Hd2UQHKS+/fpPzDz9Luzvg5d/7XfIyJ4pCXFG/74O6UvPfa/P/QeT0wdHcq5sJ+71kPO+hNjWUzbaqupmVOypUoOj2u3QHHRCWbNmEFWSTBWLlMiC8bARL3tPuNwEHVV2TFY7NrS5ZnuGMxjtJVedIlWBdExzT7qYslzVVWSB9E8HqfEWrpREE5HmBUhIlBWXZUAaUTAgiRSgb3uhsPiXUATiHDkJ6vT61yZDao5XCuoq8mBMkmkHSZ7HMyPJy5QqjKVdoc1lZyuEJsY6olcK7prsm7vt2s5p8K6RWOGvJlxlhEpO2UrIsQwgw1qC0wlqPcwYdgheWMGixe+OYIFDodM6icJR5zd51z2Kas3W+w8FNhSsVnbbn8O4SUxhqU+JNQFkohlWOJ8dUOWnaodttoVRFPpsThBAEisWoxBrQMkQISKKAsjAYb4laniK3JJ2yaYPXGo9C4CjmBfk8oq4kcsMjw5rC5Ny4FjDYDCmrGcK3UWzg3Qmdbkq7EzGeljgkYdSnlZ6m9ifIQNFeUyyMwskIVwnmiwrlA7AepSNcDVlekrRSgiglanWRQUpr0CclYEHE09/9Zzi++osoTqgBLQSeiCooiUINfopcJLTs0+ycP0XceozErbF+6TGCNCWXBVrHbJ09jVKesjRN9KoPmnNeSZQSeOswwqJlk3JmDTghGw7zAxRDISQChfMlxtSNy4uKmYxLIEUHmvliQe9MG8N5Oq1trILxbIZKXiXWLSbTlOnsgFCdYX1tE+1T2vE2sU6R2rHIDhlPFqRJl8XSoqLGMUYWln7bURYBd4+62FZJuchYioQ43sEWJ2SFRLo/nW7uv8n4joVqe61FPp9TlyWBDAjKmuXdI0Re0dsYUM8zZi7DWM1sNqHfGVCVS/q9LieTMZeeLJjMI3avKZJ2jqsVIFEqRmtHnhXUxqHkKj+a1UW8ElZJ2WRWV9kMO1XUtkWxDPjN33qBj9YXkcmE4UTwjgho9ROsK+j2FDdfOmZ4METFCk8TvVeW5YqDpVFKYV2NVgGskNtfmLwIvPgdd9Y9fmmM5ifSZ/me6CG6IubYLfj5xZdZlyk/mj7DjmxTYPhaeZufM1+8375/SA2YuoJUBMRCc+gWLHx5f/uepuhLZcBNM8bhsMDIZazLlLHNUYgHSr1m1Dh+qvMpMl/zl8b/lDOyx9/t/iA/nnyIf56/en+5bdnm2C3py4RX6z3+VfEWc9+kv/zV9Hl+svMJ/sronyOB58OzfL58jxfnt1n4ks/Gj/H3en+Gvz7+JY7c+6ou+UBR7h8gKtx7tJV/CKr7B1FcXa/W0/Aba3+N/2j0Sxy5BVuqhcVz3Y1QSM7ILhbPiOwP3aBdeUO2veZBhzFrm5ZMhWOockpr8N6ToDllW+yKmhp3/1sMdja58NjHORvAO9dGpFpw98abzFXAay++gWaNdi+lqkO6nYhu9wwHB2MuX3yYH/+xD/P93/8Jfv7nf44Xv/Eq1tfURtAaPMzDD38AEb1DVY1oxYrPfOzjfOnVK1x56x2WoysEyrGlUnbikBNbkZkZjz36DNnxbX7hH3+dfHbMfHJEXk3xdSPQmmc1MgipVJe94wkfvBDxsR+4SCy7OCxf3j3iyUGfi2s7ZCXkeQWtkLKq8dQ4UeCrAw5uj0ijNutrAYvlgrt7ljMbAQQz6nqCDkKk0kgbUORzhK4JZEiRO7KpoChACokKPAuds7c3I1UdfFYT+ozJVDDXnlBDviiwlSWfhGSxor+uGx6hkgipMLVjdHKDerokilJMV6J0M6F0riDo5iAzkJJ2RxFph7CGcOGJvcApxVsHe7RUjXA98v4FNnYGlLfe4+TOEfN6QbVwKBUjMOT1mBtvvsN716/S7rQJg4Cq1BwfLBkeXKM0S0rZJj+YU3QLou0unbDP/GTB/uQupjJ00oSlqrCdHutnN1Cx5eDoDv1Wh/OnTyMKwauvvslyZnj6+WdY7yqOj4557fVXkMrhnMTUHhVKXLHkykuvMNi4wFMfe4SrX/0ifjTk3IXz3J2P0L5kuz1g0N2B5ZDxrOT557+b0ha8/s5Vjoa3aUfnKCvP6M4xOgmY5SPyaoennvsknajLv/4/f5Vlnq1EUasAACERUmJtU2DeQ1Ef5O4D972mpQSpJN6JlaiqMS13q0jqxkWlSfhL05TNrdN44ZAioLPR4trbNynyCrBIL3HWI6QgCDQ60bjAIbSklaYEYUwLyXA4o3CuQW/FHGRIFEfgoMwrlosFkY7wpokozZcFVbnEI2l3UqARctnaYy0oqfHS0+m1absIU9cspnNc5YjThDQJm7QrazC1w5lGP6G1ppVGaC3IphYh71EnJFVVor0jjhSh0Owe7qODCKRoqGjLHCU1ZZmTRBGtOEEJSbfXZZnnOOPu09Dq2qyoZQEei9Zhk8QlLbeuHnDq7Cm2H5qjjOZkXuFFxHwkefpD57hx5Q53rowJwpg8h1hpTGUJooqTwwVx2xCGmqKsWMxzkrTViLlsATiEboIAwkDgak1ZWzwWJTWhbGFtxnjY0PR0InBxSHtzg+6GZ3HYxdc9KrUgCtcIQklZCvLlEWlLE3gBfowMJGXtWeYL0lZMuys5Pq65efOA3uYCu6yoshBtNvCtKadOD7h06SJvvPkK/TWF9aoR6PmGH1wWJSqwBEpR1558NqNWLUSdMc8XiEghjVqh/k0crysyAg07mxc5c/kTiCQmlxGx3mADT24cTjmEStFxRByC9wFO1AQuIEpTZKAQSjXdCtmkO+Is2kmU0DScbgvi3sRPgxf4oEI5mk4fhkh2qOuSdiS4e7LL177xOo+c+QgXHu2ze/AOahnT6Z2nXDoG/RaObcKgx2iySytuU7s5i8Ud1jdO0+5eJOnkRMkaaS8gUApjNbKqSAOFVEtcWNFvR2QnI0SsqC1NgAYt3B8BjP27GH+M6r8kTEOstyQqxK1aE9OTEfP5jMBbFpOAUHVRVUGeDcmxrK1toH2N00M+/ucq/td/AIEOMB6MEVSlJ21JklZEURRI3bRxbW25B5ELIahliSNA+BRfWyQeEWpkAN985S4ffLLHnfkxu9eWnNvcIBlE3LjueOUr3yDqaKqyRirRRAVK2cz4q4bc71cm/0La+0gCwE01vs83tbVnEHZQogkHuNe2/88738u6TPnb889x6BbsiEb1H3nN/zT/ArfthB3Z5b/t/iCbssXQLYlQ/EjyNB8OTtMSIUO35B8uXmAgU/5q6zkGIiXH8HJ1h1/L377ftv/f1v4Sv11c4aPhec7pPv9w/gJfrK4DTZGoEJyWXZ4Lz/J3pr/JadnDA7+Sf5M/nzzJL+dvYPH0RIxAkPuaPglHbsHMl/fLTCUEA5mSiICpz/lc8Q7rssXMFygkv1q8zV9Jn+MxvclRtbz//usypS1CFJIax6Gdo4ViIBNCFA7PwlcM3eJ+cfrHFew1Bo8nEQEjm/HT7U/zXHCGGsdXvgUpfp83Cyuls5BsyJRdN+VnOp/hufAs/8X0X/GmOcACH1an+JH0g1zS6ygE+3bOL+Yv8lJ9F4Cjowl/56d+jmX+9/nx//CnmZgxa50eUVhxsH+AreZMJ+8y2ovBF5SlYH1whp/6L3+aD334Ud547T2yhSEvMiJpqYzEVYa9vbcoykOOjo6R3nH21CZhmPMf/OjzfPE3HL/12zdJUk1XSZI2PPvMR3nie78bsX6KX/nlz/PeWy8xmd1BCkcnCvEqIFsqopZCyZoqzyBOuDmsOR7mJOGCsNdlvnAYYZjNK1QYowNHWpV0UhDO4ny0sl8rcZViZ7DGcLrP4fAO584+igoThHDgPcZZlDQESqBEhBSasB3hfIAMapwrMZVDiTZKl3hKdLhGN4wYjTOUiNFCkoQ1D+1EpF2DDBxaBghrESbHlUuU7BJGEeVizHi+pJd2obAIXxGEHi01WjlkEVEsJHUrJ5aWtra0A8/JsqITxZzd2CRwhpO9E9qnelzYOc2Zdszu0ZS9fEjpPfPpMY89dpHHLlzinavXGO7fwApJ2m4h7YReEpHNl/g6Z7AxwKiYbFIjpKWuHKHypCpkmbX58n6GEBl2OaRVjNHSkgeCCo0NUtZP9yCpOZlPKKocH1QILZG+4TIKJQhWqc7z2YSv/dbvMBpNCfpgOoKb8zF+Kdnc2OBwvI+Wjh/+s59kWStmM8X121cwzJmVsDcdMx/uEfgmWSd3nivvvslkOOEjH/4wf3F7wD/9xf+ZynKf8iRXgIETTbKPlHIVEiCo63r1cPffEorS3KtZpV41RaCSUBZVs01nG3pXqVlvn2N9c42333qbO3evNb7ITq1SDBtj/to1yWsy9Fhh0EFIFARkeUEcpAiXARKtm8JAxyF1XVLXBWnJ4PF3AAAgAElEQVQSkkR9yrzGSYe1hnzucRbiqMmEDwIIA0VFExowXyyJ05DS1CRJQCuMyPMlVV5R14qyqBvUDlCqEUJ55yiLklmxJNYhIZqtUwOyvMIp6PdaZCcZg+6A4WzS8BV94wfb6nYYrA+YjqcEWvPQufOYsmI5XzRFdZ4jAbs6HkGo8L7GuRopJM6uBMhhTVkYDnaHnNl8iNtvXaV/usU8B2sko7sZwzsztrY3uPnuEd1OBxXWlMrjqpoLl7rMlzO8T9DK4+USpKSoMrwwBHGIzHOSMMaWISrwWF+ADwh0zGJeEoRtWqGjqGYoLfF5zuGtisXSUWRzOu11BhsxN6/mJC1PENWoQOJJieIIkxk8Fd7FhLEEuWQ+14gwY3QwR8QB5x7yTI7mjG44Hjn3CL6ecfXKm1S1YDpromO9FQincGXNJD9gNhmigpjZ8Da3woTe2mnMbIKTFiU9oq6RCKyocQXEiSazhkjXHI6PuPbiIa2ewJeSUCSEMiFb7DLa26cT95sJWhQiAoepFTpJsFJSOYGOQuI4JtAN7KGCACWC+0JFqSRKNggrXuO0IpAG4TVSSawEY3OEKekP1jh72nLl+tu0NtcZT29RzraRAja3O9TLECd7REGbO/vXSZI1Wq0ui9kulZrQ62yhWaeo6mbSFSo6vRai6JHZRsTlpWlEerqNEm1sq+B4LJHGIUX4x1eQf0rjOxaqwiuEMSjpaPdTikWOUBopfNPq1glCWWoqnFQI6wmFxZUVMvTUmWLwlOehRzV3r0GrVyPLDtbOsT4GX648UwPwijAIKV11fxYfiqixyJIVpjBQBExGR1w89zBhmTLaCzh//hmECZgeT1lODbt3DqgKgxMZ1gqkCpCiOWHKsgRRowOPMWCEIQ0ihHkf9XOuYTs754iSBI3GrQ4qNBzPT0SX+BvTX+bQLQDPgV8AsG/mgMcJz76f8Wvl28SiIQX8ZOcTnJE9/rvZb3HNnnBGdgFIRcAvLl/iy9UtNmWb/7H7WWzseXt5dP8zfSZ+jH+UfY2vlLdoCAfN572HYJ7XfRau5Gv1bSI0qQh51ww5pbokIqD2lr6MuWMn34LGfkBv8zPdz5KuTshfyl4j9xUeKL0lEJKmSSW4qNboiZjrZnR//R3ZQQnBHTvF0kQwQhNMcGDn1FgCFKdUl3WZfgvPtidj9uyUEnu/4H5wtESTDvW3Op8kXyHFG6LNz/Y+y19cIcXvN//fH1uixcTlfFdwjta9C837+8u1RchXq9v8k+wVKgwfCc7x050f5K9P/neGbrlCZj2mznj11V8h6nc5kBpjagSWePB/UffmUZqld33f51nu+q619z7T07Nv6pFGEhppxBIpCCNALAYLgmVjOyT4YINDYp/YRj4mQdiAjWICIbEwmy1AtgQHGYGQkEZIGkmzaZaemZ7pfamu/a16t7s8W/64b1ePkJCTODmQ55w6p6verve9771v3fu939936RIv9bCDAra3cZFndXuVD334oywsL/LUqcvMH1zEewUqoS53OXhkgYWFRXzV5F/28zYLbah2nufltc/x9W+6k9Mv9qgreOM7Xs8Lz11FHThGFS/z1Ec/wxOf/F1MtU07iaiKkvHUImNPojXWwXhoED4larXZ2Juwulti6hFRJ6Ld7XJtOGVaN/KGxf48WSSZ2CmysIgYKi2JjSAVJUk7pdftgJ6AV3STmB1XI1wgEzW1U0jfIZYCKQy5lRS2IvKK2kikiIhcjKsg7/TQqsPe3hRbeFrRPFnbI0XJ1Fd4LJOJIY0NIUiQChdiQlXQiTJ0q4upJapsESiQuWvCxPdiqlAzjgYYL2jPOtTLnZgwFeztlYzLwKjscDjNKXZO8/iFR7jjyCG6S212jWl0yapgbv4wK0fvZXNnm6vbX+Dc+cvML/boLi1g6oKLG6scnluh25vj0uYaY1NgfUHlSrp5FyUinDZknTZBzbG7MyT4BJ8KNkZrrBw6wUJnnsHVTbK4R5K02dkZM1rboddd5sDykPWr1zA2kOhAKZoM03akmIwu89QfX2Pp5uPcfP+dSBfY3V1jN46Z69SUpefqZkU7X0G6HQbXXsDXhuEeZOmEdi8nsyVFPWVzb8rSwjz33nuMNI2J1SK3nzzJU595nEhpamHw0iEDQNMaqDVoJWYaVPZbqa5rVq+fg3ywCCma5IagZ8UCVSMPUBE+KJTuMD93iMlwj7Ura5QThyDgMQQpmviy2qFi6PfbxK6LiSvyOKdyUNkB3kPSShBOglBkvZpYakoZ2NrZQ0lJnsbgDc4IdNxBRTVVNaEqxzMG3RPpNipkqNSRphHOeeoaBms79PptYh1ReYMpm8TLYAPWNfm/BbN2v0pSVY7gbZPkoFIO9+c4feYl8nbCXbccY1qM2dkdEGdtZHBgFd1kkSNHl3ls+3GEUlw4e4FOW+MrgZUBJyTCOBZXugz2Js05znpykWHqAqccUQbS9/B2SH8pJV2yLB5tJHTBNaHOo2lJUUpGkxofw9TX9KOcVuSZ7DmKqcTbnNKPOLB4kP6iZLjnyBYSpmOLsxKCQoWYuqpotzVlmeJFwHlJEmfoSNFfgZ2BJ2pZ/LRiMhjhyxbeW1ppTRRaLK5sU0xiunmMVzHTqiZuW7zJMaHAeUOgR5AV3bkc5xXCJBSTCTtXHSLktOYy6mkjCTv5+tv53GOP0crmGm+JCFTCEkyTt1tPPapjGVVrSKOYW8jATmfTWg04rDEQCSDC+QLlBK3OCod6PT7y5PtZWF7AGcfuaMr9957kaFdRigFZVBAqqG3dmPsQ5LrHc8+/SFnWoK6nYXggNEZPqTHOEXwP1KTRH3tLJPrUokSHGI/FCkBY8AlEY97+V+5l4ifkrQkbV5vyoMX7JEHWtGPHS1dHFHqDdtyhrBImo4rx9ojdIsGJLXZ2U6JynoPHDvH8089gXYxzF7i1PeRwp2RnkCImNWY9Ri5JajEh287o6h5rYYCM/v8CVF1zp3zLnXewsbdLemABuzOk2h3QiRJ03mZiR0St9iwDTjDd20LrCGsNPkwJLuG2+wWXX66JU4kpanyIqStPpx1jjSF4hws3RkzXV7AOJSJAUBQli/NLHL/9dqypefVr7mdv6wpnnj5DYccEJel1D3P5yhYiGELZZLRaI4iiBiyG0DTkXH+NXMXgrrdT3FiNBEHRlxkChbW2yRUFVlTDnl4ze9e53/3fOxkd5p35SY6qHhEKKQRP16v0RcrXJSd4995HZ+AWLvpGRrDqR9ys5wjAqh/ykepF3prc/iUA7A/Ll7ji9qibRMIv0Xh6ApmImcwApsExDhWpaA5tLiKUSNj2Uwyv1MjCc3adb9/5Vdoi4XuyV/Gy3dwHf372fyUNOH939618oHiGq364/67bMmbNjviB/LU8nBynJ1I2/YR/Of4TFmWLd+YnOSA71FieNtf42dEjFDNa+n/uvo3fL1/kZHSIO6Ilfnb0KVb93o39D8zLjNfER/j+nfczCQYfxvxR9RJvT+/iA8Uz2CYIZH+1RIwWChdq/uvW1/ALk8/yE9Hb0E0EPjWWj1dn9rc/FzHrbsy3ZHdzj1rhU+48xhhWr64SQuBzn/jYKy7IN450d2EeWxvK8YiFhSX27EUeWTvHY4/+DoOdIWVdMxnvNSNAFTMZjLl6aYM4y7DFhB21xtmzF/B/rHAO5lqfZTwaU5aO7Z0harNA/PuP8gv97+Au4Ht5HV+2pl/+I3b+1Pfbsy/gi3qdfx49ThocIdPUOxYvx0iZkM7PE1eOLAiMV0yLDrme0m1FLLQTurFE5ynWesoiItERVhSgkiYofmDIs5iD88fJ5ALCOWw9x/zyAXpxh53BC6hOn8FQc21whSqW3H34JPOtBaZulyjJ0NFlpBLEiaQOhsKUZD3N6uoG59Yuk+iyCWyPWoj6GlEFrV4f6QzFzi6VG3Fk7iZWOouEjZikDPS6LVTkWLQJB3Wb1c0rPHdqjyP9FeoWuDzBqYTHH/scl9bPc2z5EPccO8KlwUusXnmO2MVo73HlHlm/gxMDalXT60hk0Vwc47rF3OIBXOzomA1OvvoeXrrY59rVCxzqpygrGBY77EyvMK0rLl0+w0qnQ7+r6S7M8+a3fhNbly7w2c9/Ch8E1Bbla2TWjOCEd2ydf5lye4ulm46RdjWUJZnKSKM5httrXLq8RZ7kSJ0Rec90b5OrxYDFrMVdh1ocWZlnb+p4+fRF1i6VLB5Y5N47j3LT7Xdy7oULbO9tESsQzhNU0yKo9keU1/NSwyt8BE38lPdNs991b4Gb5VA3fgRFwBEoEVIxma7z0Y9+sAEIM5mNMbKpaAXa/TluPjZPKytI+ynnzqwz2TDQUqi2YqGzTDkeIZOIsjYYs0vklojijMmw2De3TicVWgmUTDF1TZpG3HTiHi5fukRRjnBOEpKSsh5TlTVp1CKJUqSS9DpLZImmNiNQMUiFMRU6Ehw8fAQhUy5fWUV5STGYkEcSZzyYQIri2OIBqA2dXka/Pce1tSsszfWwKqasRlhvGE62efrUBbyr8WVAkrE7HNHJeiSZoqwmpHGHleWbmU7OEFUVhQGXzKQKIiCsxMsxSRqw44ity4Zeq82Fy0P2NgtuP3GAKAdf7jHZEywv9hiN9hjvNuxZVVicGQISYxW5OsTKsuXC+WeYn++CL5mOBdQxVlmc0+wOLEp00KlHao8xDUC/dM6Tpov4OMXaEqk8Tni8KCGqmPgpxBJlEmo/YXe7JJZzKGUxxhJMQpCO6ajCy4zdbYeQlnoqkaSUQ421jjiO2F4f0u11uHzpEr2+Is0k01EJWLq9FpNxgdWOPFd4DGZUE2dN9vZkY6eReQiHUB4VC5zwTbuYaAo4sqxNWQ+RsqDdaXSicS5ozXUIoUb5BEVG6SxCKRSCIAymmqJloNVqiDU/M/8679EqJYQxscpxTAjCEpwCMoLeI1YR3lm0rPGFRckODkN/aYXBcBM7TLj5jmUuvLjGdBdsvUfeSjn90iZmS6L7Y8RcRq4k09GAKxfOkKoul57dpdfehrhLpmsuPf0sg0GBsZLe7cvcce8xfL2OCzFiKsmmOVmm0HHEoK7JdIx26itcZP581lcFqoPhGCkh2dohKEVdVRRliYg0RjTdyUnemgXnw2g8burv5iMsjiSNKKuACwapoTKWOLW4ymBdjJQapTy1cfsCc2A/VsqE5g4K2bCrq1fX+K7v/qu85mtez4MPvZZeEIzLTQqzztPPPsNP//Nfoi4nxMKQxJ5A02ailNo3BVwHw0oprLNEeYu8FcN2A8xSr/i+9DV8bXKCjkjYCQW/Ir/InMh40pxnpn7kLr3MKbu+D5SOqR7/uPsW/n3xDL80fpR1P+brk1sBWFFNMcC6HyEAOwOBAXhVdJC/0Xodi7JFhEIJwdjX6NkoHRqNqg0eR/gyBlEiqIOjJWISbnywWjMmtwiGZdUmCZpFWvu/kwpNojRX3B6TUPPJ6iw/03s7V/d+jzNuZ6Y9hb7MeE/3m3iivsr7pl/Y15deP1bXZRD/w95/5JofcUh2yYQmEz1+bfIE637Ekmzx37Yf4nvzB3jf9LH9bfxL6Z38+PAPOeO2iVHcrOf2HwvAUTXH2Fdc86PGsCUEl9wuK6pDS8SMQ7XPEEsEy7LNVbfHj3W+lt8pTrG9z+B+uRkk0JjQ7o2O0hMp5+2Xorzb9SIjYRo9blPNs3+svQ9NNiqC8XTCpLZIHbE3LvC1Q0WNdKWdaNJE4YKnMmVTracjyrJozISzYPZaxyDABc/u7oDJaATAD+1+8Mu2+z9rzZdsX9qhNh41O4ImQHl+p+nODoHVU2sgmv7pzz/yZDNJCALjQBJoMqAbLaG1qnlcBggaZ5ojkWYZ1hmUllR1TVFN8b7RBd/18H3sbU5Zu9tz5223oaxiaUFRmpKpKTDekOSK82uXcbsj1vYGbO6NiLQgVQm22ICiRAmF9ymdSHLizoPYsWdnZ0Dn9a/h4L23kQ/HHFlZZqm7SP3UFzhz9gVKl6DThGv1mO1iC0aBa9sVRhqC93SO3k2/lbG5vUo/CehEk8WeJC2oQt20FRWS3twcug5c2ZxiI0tHpggZGOxsI+U6up7Sp6SbJVT1GpfP7LB29iytbodOXqPsGrXJ8aMxC4s30zp2kJcvrDABVF0TJiWDSYESBmcFyJThcMTe008zv9Tn2OuPs3DiEIeWH+DalSs8+9QHsZEi7naxQnP70QO87evfzImbTzDcfJ5LaxdYqhVv+4aHOKwFp8+8wHBvm4WVRaJcIbYVKs6wvmimT9ISvCd4hfVfClJvLMH1LFUx+zQJ6ZEy7DugnQUh0uaErgzG1gQfI1FYY7HONfpGrVmaP8Bb3/Z65pYv8cKpa9x58+1cuLTBsy9uMykynJBMJgKdQ7vfxluJKQVjMyYES6udk+o2rnbsbG9hMSgFxThw6ewVhEgRpmGMR8Maa5qgeGsqKjdFaphb7GJcIEmjpqLVeZbnD6Kl4jX3PECWpTwZoNed40wlGOzsEbUEUmpioRHGcWhhCeNKzLQgVhHFtEL3NGme46KAiCWy1lAWJFpxyx0rbO2mtHXGfD9jO8B0GlBBUE3BTCJ0u6QsA0JkiCRQ1SVCBGKVUOxsEW4+zNy8YGIijhw+xvbVEZ28xR2vXmK03RiWTVVTlQ4nLHEmqK0hjtvopM3OZMqVz26yvRmR5jlxnuPDiIm1TAtLCJrm5sLNJpQSa2qUEjiXsrc7JWn38E7grEZlzVRAJ/NEOmX14gX6vabEJ2sFklBT7ml8UCCaqtfgPNYYjA3ICIQ0tDoJ9UTgvaOuC6bTNY4efS2mkNhJHysjdJ4x3auZbDgiKREtR12XhJDi64ySPa4MBmQyJU0iCu+RspGLCCUbrwoZzhpas/zVPO8hVQTEJFlMd6HP+Mq5ZgJQGzw1lalpxxonFONi2uQQR00zo7UWP6v1rY1DS9B6NgENGiVzxvUYKwXSabz0JCpDyhHClwitGWxPee7zNeXYc/qFa+QW2pVkvNVi4YEHuOu+nNzUjMwFahto5ccRIuXILTukmUKHZZK4cfrrXHPw1kMIldLpp5z/1KOs7hiECtS+IkvmiCpNXRUkfcGkHDAZ1rTyPn9R1lcFqtl8n8h6djd20UIyHYxRIRBnCQSHkJJIKmKVMCknZEqT5d1mJEbTBlEaz9KBjOP3FJw/Df22oDaCIAPOg1ASYRuavHGQCnCB4APKOYRsGE8pFF45/u1v/QqvevPX8vuPPM3WWJGGmnpzyFOfOsX6uQ3i2OJDTBlq4jjeD9YVM8a2MWQ08SoRniyKMNMJ8cyv/yP5mzmgu/y0e5R1P2EpZAghSNBshClXw4hP1xf4gdbr+F+nn+Vlt81B2WFZdIiQrPsxZ8KAY6rP27O7eMpcZd01wGNZttmZueqboYPkx7tv5XeLU7x/+hQTDO9I7+F7spMsyhbrftwwfzJiNNOT/ukVIVl3I9oyYX42Xl+UOUdUnzU3YhoMF+zgS4xOB1UHE9z+KD4Q0EKiheKA7HHW7ZCKiK5I+Ue9t/BodZFfnD66/5rXQWpbJHxdcoK/OfgAa36ERrLtJxxVfb5gLjPwjRh7EAoeqc7y6ugIv8oT+8/z++WLXHK7KOSfsoc18oZcaCahnl0SJRrJyDda1lRoimCaPEggERqN5O3p3RxX8/z29Ol9Frwlv/IIoy9Sfrj9Jj5cvrDPFAPImTv3GF1iJFsUJELzd/KHeHV0GBM8H1fneZ/4HMYavLVIqcgzhdIeLRsRxMn5o3yPvYebzDxOBc6KLd6jP4nRgURIsrS5yL9V3spfFa/j13mSjyUvcN2qVq3UOOcoa4GoFFoolFQIqQlBY4zHewvMxqihYQhirZFKUBnDCMOROgXg3/nv5V3lBzBxSRwplGgivwpTE5AkkSTSCikijDHUpSGJY2IlMKYkKIXWUZNZCAxHQ7qdLnEUsTucJS9IRRQ1ALYyhqooqaopJlgIgtWrq5hyxMvnt9kZP08/OcLJu15HpFMinaIVKC3YnUzY3V6lqCa0nKLYHLNWOayQUDhWljocPtYjzTWXN7eop2sUxZiqKnnDfQ+ztNCnlUtC1Fxc77/zJEn6AP/hw7/F6cuXkZ2UajLC2W2mVYWQMRPzSZQHFSxxV7E12WV8taIfazppxGBYsTR3gKMHj7ERrbK+O6HwU6qh4ND8cWz3IC9uD6jLDea1w40dq7sv0m33kbFmezxleW5C7BTjzYhra+vk4gJKliQdj+5p5vIW3bHi3ItT1scKqRwuTDGxRPmEvcEuH//kMyTtI7z+TbdyceMKo7qgly7StoHV6YA4OcHeXo/nLowpojbbo5hc9IijPmb5CK+75yEun32Cj33iD3G1oxU1AeuoJpqvyZGWOOuaeLhXRFPB9VSAGXD1N9TiTWTVrABA+H1ZgESDbaokgwPjKgiWJNYoFZFkbXoH5hhNa+QGHOp3eO1rbuHcRhcrWzz13B7TcJUQZ2jZw05rcBodII09PR2jZUa7vcja5jatvIWt6ibcn5q90RBF2kgSnCMKGhkkwjq8DcRRQruVEwnNzvo2nW6b24/fwXx/mW/69ncyLQ3jqePB15/knT+koS5599//MTY+8wW0yBv9qVIYZzHOIiNNcKJhfkND8KwsH+Deu+9me7TLgaUlXnPHfdxx5C4e/8LH+Vf/5pdp5z2KOmO+28OrirgVIdOS+7/mAP3uCiE4nnlslZ1rioM3HaSuDYOtAXe/4SRv/Nab+fxnP4WMUhyOLEs5vNjB2JSqGnDtygbeKESAOIsIQtPvJiADk+0pO6sXKasJyseYXUPUDuxeq5BCQ1QQZc3+qQuBEBprAvi0aZVUFghkcdpIuJRABo3WnlhbpJ8w2d5gul6Q9jsIHdHNLUmisKLGOUuk4mZ6AGSJoLSONMtnumcDqiCJ5hB0sZXFakldeRYWc6TIka0RZT1GeUHtEmKdoVJJ1Rb4UnP7zce5fO48dXO33ZwzRbPdkdIIYiQVSQpFUVIbR1Ce2hZMRp5IJgyLsjFlWwfSgA9YR2N+rJprkjPNtSrWmiCaSa7SnlgmWBea8iqX4Ovr8Zs5KhhCcNSVwtQRaWYgKMrpHku9I1g3Qu3U6Fwg0xaVs7z09JNIITGqprPkISiuDAYoEtIsMB0bomhIlCqUyHCqRniBiBVR5jBrW4SkhUg8kUgwtsQlGVGSUI2mPPjqh9g4VrOxfUN++Oe9vipQlQG0ipgWBaUpyPMMiWBaTvAhkESgQhPcPBwO6cz1kE4x3NmmpQ4TZ55iAoMdw9ETcPVChvcJQgRqYyhL31QdzpynTbtDs0khBCoCURwRgsOVhkwoxlev8ZP/3Y+xVyimewOEqBFURLoiiqCuLVJAmiRY54iiCGuak6331+MhmvcnlGA83EZFDdN4HXj9g/KPWLW7CKnYEM0FeD2MqLEIBD87/hR/M38tP95+Cy0Zs+HG/Ob0i/zy9DHelb+GH2q9gZfsFp+sGtPTIJR8qjrH9+Wv5r3jP2HHFRyUXWKhiFFMQ43Bc0z1+db0HjwNW3eLmkchqYJl1xdoFBbPimy293oM1F4oed6s86Pth/nVyRNEQvFfJLfx4fJ5gNmI/EslA1+f3MrHqpfZ8hM6IuE70vuwwXHabpAScZde5kfbD/NH1cv8m1ewoM3vN8+VzT4+a26IRhKJhj0UCO7Wy3xHdh/HVJ9YaCSCgS/2mVpoGGYAhfiyEgEbPHu+oi0SFBIlBHMyw81kG+NQ7QNmuJEd+13Zffz48A+54AbcopsK2qEv949vFSw1jkWZ89Pdt/Oi2eB90y9Ne9Cz570UhpQYDoYWP9j+GibB8L27v8mhuWX+kXyI3ehefledRWpJXdd4HyO1QmnFQaH5seJhPqCf5eeSP8bYmmMs4GxNpJtxZ5oq5l3KN9Z3ccHvzNTAr9jPZQcJZAKIQzMaRmKdx9kaGSziOpCYRQB75wheNs2Qjff6S/+mBZSVpyocPSn428lDPKAOYZTjY/VZ/oM7hQ8l1nqyPENHOSqK8KXnG/2tvHV8M+0QEwicDTt8yF1gkDnSpObYuMWP8yaqrRvymgthwH8fPoISTaFCOxYMasf2oGB7d5WlzphX3f4qunmPPMmoywotY4bjIUXt0UlCHnJWOjdTLY0ZmE1WL+wymlRcubaNVRKca5iaNGU0GHNp9Rp5u0WsWiRS0coVlbe8dOEsa9tr1MWkCRgXnmA8MiSIVkYpoJ5MiFVCtOvZWBsxHhZEyx2WlvucOLKCRHNtbwsXQTqnqIZ7zGeLLErJ2uUtxuvbTHolUQL39wIHb2qx5Q1XdwZMdg2+J1lsBy5ducD2xHE8xCR+Sqcd45NAJAR33BJzSzfm418s2BwqklhTjGqCqRFaUY4DH/vw5zn/7DrdhZqkoxiOtumm88iq5MzLT3HxpafJ0hYrd99C1k3J+h3O7Z3l8qkniZM5HrrrBN/8hm/gg1c+wI7dJouav+Vagrce5UUTpzTLg2xqU/+UPjUwK0xpph2NSNXDzKiqtSDQkA3W6iZ/OtQgHFJkmFLg8LSW26iDyxhnuWk5xtk5qloz11+h1R1TujUymdDyguU4Yzi2CAVpFHPn7bfia0vwMT5OGRRTOrFAOdjd3kPgUSLG1BVSBggxXhisL9EyRnmJt5Z+p4dxNbbyTPdK6lbJlfXz/Pq/+HlQmqLS/O6vvJ84jvC+4vKV0+hEN05/3TDPTaGMw5qaRKcNWIkllXeMdna5cHoVg2Ay2GJ47UVeWNphMD7LsVctU+96pjsFc+2ESEbMdQ7x0EOazi0jhPJkqWJcDijHJb34IKt7l7Eezr18nnP/4gwLx3t0++CrKelCn82hpa4t472UstijnYGUFiUUzmpGWzVKS+Jcgu9y6PAt1KYgitscvBlKd4HR7ogjR9sMNkqGwyFa9IliCMohIoXwniwTs5ITQVlOcG3AuLkAACAASURBVK7Al4E4jhCuBBPhppYkrdAixVYxhZd4K1g4eJjJjiW4ht0djZr2yDRpoVXEZFgTRQHpW3gn0ToiyXLi2NDqqFnFrsWiyRc6aF9hCkexUxKVEHczVm49yX23nuD8Sy8jI9lU5gaPVjfygr2zGBOAuDE0xjF17dFaISWEsqQcFjhfE6s2dQVx1MK6GukDrrbESuJcwDqD1BEI0RAYwiGjDKkCh463uPxSgY4jRAVKVPigkV4gc0lr/jBluUM9mpLELbZ2BzgbaCcRNtTEShBHhtKNEHVGIh32WkKcCKKyIvgxtpQkXqLdBDP0uEThXNXIRbxkIh29VoeJqhmWJUJKUqkQIqGuDVGtWL+0zenVnRtA6S/A+qpAtaoqauOI04Q0z/BFRRACIwRRCJSqSbp1xqAjSVFMiHRMJ2sRpEeIJlvs8nnHfScldz1geOYzjigJeBFRlYY0VV+2P66zoFmcNDluQqMji3OBJG9x7vyLhFgSa0cepQQ3JYSANTlKxsjIYp2Z1Tg3zVOvzAYUEoQMGC0RHpw1QMKCbKo+LxVbBCnwxqAjjZSKe8Uip4Ulmtl+fq94nt8pTnE5NLrKo6LHrr3CB6vn9hnTEEDN2LmfGT/CX88f5J90/0s6MmHdjfi58Z/w3vGn+eut1/LO/AFOm03+uDrD29I7WJ0xfBbPMFQYfAMGkezOmEqBwOLZ8VP+p+HH+NvtN/Ke3jdh8PxBeZrfLp6eGZzg77bexLJq8z8O/4Arbo+jqs+/6r2DlowpguG02eSnRp+gJ1O6pLw1vY0F1eLbsnv4tuyefQD13vGn+Vj1MgF43jZ3XK+OjrDhx/uu/20/5ef638oHi2f5X0afYRhKvi27h29IbsXtx0CxrzD1X8anNutJc4WWfBMPRkfY9BP2Qsmdeplrbsg0GA7IDhLBVT8k0FS4Lsicf9b7ZoB9g9ZPdL+Rj8z2x4LqsiLb/Ej7YZ4wV/mlyeeYBrN/XL80/iswpOJWOc8D0WHetffbTDGsM+VD7kW+M76TD3OWVpYRkgwPVGVFDfxAdJKnWOMPwmUS2UVElovKEOoYZo5jZzzvcg/xwehpHq4amUjwN3TEZSVnGipB5A06OKogsEEgkHihETLs51kG4RrNoIqaMbWzKBmQtdjfx1pqpAdw/P34zUyD4V3mQ8yR8G79dZhI8GF1jihAt99BCoFSEVJqTqkBp7pDJspSjKa8cbLCD09fxbvTxwhBUNUVLvJ8f/U7oD1lqHC+KVKwzhMcFHWgleeURcm42kYv5iwszWMqgQg1YBpAHgQ3pwfZnGyzXm+yZXYoNhWqI8n7KT0VsRR67IwK+gsZSSYIokPWjri4c5bpGcvKylHEzjqffeZTPHv2BUZ7E6QwVK5gtLdLf2meqYuoplOiumS3bEaqc70WRkFdjsmUIFCxujkiKQX9hTYZjTM3yzS20AyLCetqxNGjlrnemEcvDolpszRnyNSQwTWPCYKVw4Ksl+E7GdnykGh7F1OP0aqirVKCjjF1DbXgyOGcB4eSTzzq2Ks8WRzhhaf2ligTjMpVnj61Rpwq4izipiN9Fhe6XLi8RzEdUo4qSj2mLA3JQo+Tb3wtJ266leHOE6xefZpH6zXe9V3fxz999YO85z0/yXPPPEucRoCZVUzSkAj7zv5Xsqo3IumEuN5s1XzfAFn2W6qcb+6gBJ4gXNPsYzTeVSwfbnHTbcvshpRhETh0cJk3fd29XFi7SKJalHWF0znt9lHa0nCol3FkqcNFVZN25pjvZJhSYrymEpLDh45wHHjsic9z38kHuPkWydUzFznz8hnyLEYJifUC6yVKJbgg8NRESqIjgfUBOQtwT1REnkm83EM6RyvSYAy+llipSPEYocA1BEtdG4ppSWWqpvAFR1FMERhaxMjJLlZugHBMbMFOdYr65EHUYcFKq8vmiyPyVkI7kbQPd1i5OcfqJZ69eIXeXM7g3FUmleCtf/kh+lmf8+e2OfP8hCuXd8njPvJQj3p7QlUrnB4zuOyJWgnTnRG5bhMqj1RtnPE4bxB1wCGxI/BuSLXhsWqXJOmytLSEnY7J4wRvm/NVmmsEqsmsbaeUVYkQBqklywdSktxhpzFpv0MctViaO4CzDhl1WT56E7F2jCZNzamSjflzob3CZnSVqakJAoyfkuqm7VEEj7MTnNNIcrJuRJCGxZWcvcEYJVvUhSNJWyA9WoOdDihrxWtf90ZuO3GC17/5G1gdFVx46rM450jbMdPptGkecwpnA0kS8KFC6Iwk7zO1W8SdkijzRNqxtTVCSk8kU6Z+k1CXCDTOlghtCU7ijEWExngYiLB+NuXLUmIRM6wMSycU6CmCCCEjkGNMKdB6SitPiVtdDp04xKnnNpHComWExWMYE3cOosoYEsPUCFLZpn9UUwwcZeVIVI6XJSZ4nPd4JLWHoBWpjciSlKAcWiW4YIi0RAmHKgMTW9H1GXZcIXJPHudcm9RUdU1b51/xuvznsf4TQLUgCQphHB7HdDQm6bY5ePwYxXhCutAmsoLx6g6lNbSyHqWxJK2cMlQkU4FXcPwOgYo8t96rOP+cY7KT4Jxpak2RBG7k9vlZDRmADRat08ZsJQMoRR0sOgIvK5RJMcaiVYbDIeKGOxRWz6rmDGEGVq29XgnlESIQRRpvIdIZgqa96rqm8Wgyz5qY4JzFOUesND+SPsT3F7/JmJpAoEMyi3y6sV4ZQ99k0t+w4EyD4Rcmn+NfTx6jxu5DoRfsBmfcFufszr529TeKJ/ef878avH//39cfv748ATfLWt0IE949+uiXHcPrCQE/N/n0l/z8veNPU80yZr8STPyJ0cf5idHHv8IjN1Yz0j/Hd+b38XOjT3PZ73JoxhRrJOfdDhf9gONqnofj4zTpcZIrbu9LwOmfVRN7zY94or7CN6a3897xp0lFxPdkr+I/li8AsOMLquufHeAFs873zfZXhMTief/89/HT40d4wWywG0o6xPxI+2E+Vr3Mr0wfn/UwX9+OZp/uJxAIQQiCI7rPxNdc8yNA4IEzYcAB3SGpJc7ahl2STZOMJOJ+ucITrPFu/yYOFx3WmfCh9CyPqUt455DS8bXhVqpgeIyzPBxONHsi3GCWEy/4y/FtPKgO0iVmO0x5X/lFeiLjHcntLMmcKjiesNf49eoZSukhSP559BYe5Sq3ij7HZZ9/Fz3FE+YKAEa00JHnoO7wanmYv1F8iBE1JILf86f5dnM3vz5+mkg3TUNZllMFw7QquBxZ8ihHhxgQuBCYDyntKKU0N6QpMg4YZ/HWznrkG9e4I7Cxtoewgc6C5pZbFxHOcv7SJXqtHlIIrPEoDN7WvLixzaga0+tqgg9Mhha3V9DKJIsHb2axlzASW8j4CIeWTuA6BZXd5eUXLvPsqacI9iJLRzNsf4vFAzWdNkh5qIlhUdcIyoGfUlVNvSsuYHzFZKrIdItMZchEkrb6TW50qLl85Sp+bMgzSNIYYTOGpafQ28z3WlSmNzufGITfIC+HpEVOntzEsJry9OU9NivDYLMg0jlKemyhSHXOpHJkOtBtO6z33HlnwtL8lGdOFVzezdnNc0JdUoymJKrJgzZOMtqrqMMEE0rE3AG+7ttfw90rB7HVkOF4m0sXLvD0Zz/LtdGYA0tLLMcJu4MJjzx5ke9+21t47Rse5pnnnkJoiTYCYwVBCMR+bNWXZ6leJxMad3OTTyWVJIqavEgfPD6EmdkqRkWKybikriV5q80tdxygt9x0q3eDoHZjzr805jdGFeu7A4ZrzxJlbV68usfNh27jtgNdbuoqLrx4iTuO349jj0zG7BSWp849y3ZVsryzRSpiVuYOcGjlCE5KEpVy/LbjfPGJx9nZ3CZJUrAOITXeWaRM0DpG6xxvHDppkcQJIUhaWYskzpCzNizvK1yoINKYwTalM2RSNJIbrWl1uzARaN3cSC7MLzJxhm7eZb6b0Ur6aBmoJiOSfk7/zoQvnHqZYuI5dniJ9I6IJLWUfsATlz+NkClJljHc3iVFsrptONd9iVhJBmtThgPDvfcdYTza5uUnzqOYItpziMRgRyPcXoS0NUmckKgcjAZh8Q5inRK8IoQCGQNugiZCC890tyIRi1R1ydplT561GY0HtDuavN1hUozxQdJqt5iORzgXkxSC5YUFHnjojURRl0gGtkcXUZHn9geOUAwi/OU1jB1hnGoSQ5L2rGa0T20knfmUTi/m5ed3iBc66ChQTAJpXpN2oChTOnMpFy5cpiyHLC7Mo5EUxRQ9zYnDMX7wh/8Wb3joVTz73Ck+98KAdldw4dxllGqAtlYRdVmgtEJLgXUCFUva/TZXNq5Atc6R2zO8HKKV4p65B+ivtHnp0VEz0peK4CuSlgCToKRuyLDZya9pZ7Mw+/tw1tFaSFk4KNi9LElUYFJZpsHRnZvj2HHNaFSwuerYuboLU0kqu9hQsry0TDqfk2aKjefGxK6PTj0/OLqfO07f8HOw91Uv0//ptQVn0gG/oj6PyQ8xGNZNfY8d/Wc+8f9766u7/usm525aVBhT08pbHD9+nKEpiVsB7xzTYUFRFEgp6c/PMZmWuNqQ65iicFy5Jrj9bs3llzxSG7r9mOmuR8hA8E13tLFmdieuv7R2NASUcNS2BiFIUkVRV6igiUwXq/bQunHXKS2xzqEQKAWNbk9R1w0Iresm9up6qYBSAi1ibDAUtqZNM05+tL7IX0tfzfvMk2wwZt4lxEaj0yYLzwdPJBRdmVzfxNnOur7NM+B3vUP7lW+HQGPxkvsB8wrJji/+TFbxL/r6mfEj/LX8Qf5Z7y99GVP8t/LX86PtN/OS2eTjM6bY4verXq+v6wD/T69A4D2jP+ZH2g/za3PvxOD4g/I0v1U8vT/W/rutN7Gi2vzD4R9Q49nyEySC6BWtWFNfMwk1MZK/kj3Akmrzjuxe3pHdu/9aPz/+DJ+szrKsemy4JplBAD1iciKK8MoqXvZzXxOnmDjbfFbDrE7XGbokvCkc4afEZ3lZDHiIo/yd4gF+qLjKlixZFm2+Rd/DP+YjTApPmIHisr5x6/PfpK+iT8pPuSdYN0MWbYSSkOmYXzRPshqGLIWcv5e+nu/M7uS33XOEmWbwTeII/7L+HF90q9xiWvvP6ayhCoYjzDGODHupQNUCFxxnGbAiG8awcBWljXCTpgWoqAuquuRomfIP5deQEYGAj+hzGBVI4hgpHUpIfoFvRmrBy2KLX3OPc8bv4nwDeDrzgvF2jSw11SAwrSsqV5K1DiBFhgsRaZrBZI/hcKO5ibWNti3v1EwLT9zt0Gr3GU0NI5NgxmuMLgwZjCzDyR5UhofvvwPFLp9+5BlGtqJ7oM38oRaTaw5bxUiTIoUh0xqba5I0xlQRo4lmVHhKN4Vg0EmMqzR1NaEwA6bbuwQXkaZdXA21d4wG20TDPbrZIdK0RZJOUKpsCkfyDjaNGWxssTkdgvUkTmFdQeE1u2GeSHh0qOnJhG4CnTxmPIowdpelQ5pvOdhhY0vyyNNTzlwzKJVgfADpCM4TC0s53uG5UwOiJON2HzN/x0lO3PYgWV5gh9fYvHaJ8xsDyCPixTu4mK5x6tQX+ImXT5PaHdKsi7IWhG/SAq+3Ur2iEOCVIBWYGVRntiohiSOF1pKqqpppmpRN/GAA5xqm/8TtN/Ft73g7SZrx+Befp93qEscRp3c2GNmC557d4PzqOfaKVdLeQXyaUo6uMtABU8ZsFiXLuoPwKbUaMwxTdFLTTSRJIjh534OcOHqc3Z1tBtOSxTfcy82HDvGar32YX/7ffpGt1W2yNMG4Chma8bHHI6JGtpi2YoJzmFBRmkBZTIniBC8czgnqugZZo4mJ1HRmuoFJXVNYiyE0NeEOghQs9hcQBCobUTJBoPEuo9OJ2Jhsg9b0FzuQBWwmmFs8yNnHn2JSGNI8Yv62ZYqyzYGlDMR5aufZ26tZvDnD6YqbTrZZOz1hNCk5cHietasCEQscCb5yhDSblQUE4kxjqkCc9lACpPJY30eLuAHbKkEmERc3duksCFpiATXVxHFGq7VIUY6wppnipXmXsphgTYSxkvZiis6WqCa7VK6mndSM7AizNyaKupR7FaPJBknSBZ3jgmNzZ53aVEilERqiLJC2DcsH28Qk1GNJljU3QJ2FgB0McWKIc57l5SUUEdN62piyCMytLHL6YsmFq6e569Z55robfOaLn2B79XmSmMbwJBK08hhfN2kVOmCcJMQ1nYUeu1XF+rXzpG1FLHscXlJcGjyJyAe48QRb1ywf6VBWI8pBF5UbjLMIIbDeYZwly3OiNMFZi5aSxZtTtgdDdq9JDixqptu75PowR+7xpG3LRj0hX9ZsrF9qMlWjNsvLPabFLpQGrOXAPSk4iVMT3vv8J/5vXKH/r6+1vRLvt6msa25Ag0QI8fj/Jy/2Z6wQwoNf6edfFajGUYQMClsY0rxFMtdlbArwnk6asrU9gNLgbUVnYR4ZR5TTKQc6PSQjunNgbYLwhnYPqlKS9SwojZIpVTUminME8UzwBFKBFJrxeAoIvAahY6SQTR2ZlQjhcUyRIUKICKE8UoEzTcOLjGbBURJESPGhbMxU0pBnbZydYk0gyApXB+a6C/tdpz/PY3y/u59/ED9Mm5jtZMpv5C/wG/4U/8fCd5OjOS92eUFs87A/yt/Tf4SU8JPlW/it4mk+XV9EKTnT3ULXaS77ITa4fe3Wks9JhSYIGIuagajQNC1ZCyFDB8m6asb7rjaocEPDeR3Q/dr0CcahqXD9SkqSVwK/r1SB2BYxxjsEjU7s/+kqguEXJ4/yryefh1doTU/ZdT5SvUiMxsxitf5t8eQMQN5giuMZfyngFS79G2s3lPyT0R/tA8/rrLJC4gi8d8YUv/IdesI+0/rWrf999joai+enx5/kp8ef3N8/1wGvRhEIrP6f1L13mG3ZWd75W2GHkyqHW919+3bOUVIrB4yFRgLJsgISYQYjYxgswoPMCMvGYM+ASWPDAEaDZzAISwgEClhILSSUQ0uopQ5Sx3tvd99YVbfiqRN2XMF/rH3qhm61NB6Gwet5TqV9au+zw1rrW+/3vu9nh/v7uoQpTrDHkJKWjBr0uQm4ZBDflcIgkQgZZmyHQzpHLmq+6td40K2jpOJj+cO8IrqcZ8oD/EX5EG/u/j3+nEfZtJaiFPgk3LNh5vctwZ4jV/iZ7FOs2gHg2aAkjSL21FYg7SPpi5JPc4LnR5fwwehowxuEz7pjPOi2qAXn2ZIJ4cHVJHXJWFdkpcFJQVlV9GUGGnpRQmENdV1QVME72YtQOOMRNvmJzkfoSMmt/QNUOkY0xvBn9JAfzz7EYEqijOUV7jL+bfRyfjT/ANs2wyEwI0h0i9pH7G1HdFTMtG9R5wVllZMqRUun7GBpdVqISGJjhfWW3lyM3crZ2dnlrvw+TFFgyjogHXYXIRIEhuWFBTqzhxhncHDhVsa55dEHD3P/5iNgY+anLgLvWVvdxmFJ2xFTUxoVOUorqXMRKgJ5SZkVFKNVunsd0J7ZuXnSlmL7zJhstAuEtGDla76+exKFpvQlUxfP8vW9NtmZirzUeJWTIJme71EkKePSoVqG7WyIrzxGVmjhWBRTbB+LiSK4+dAKvdiw3R8TzSRcfOmQrz62jjWeNI3QCoQ3WCcQJAG1tjUPPXAfR7/+EK24hYxjLrt8kZe/9Jk8/5mX0euuEKXztLvPZDDYZGtjm3vvu5uT90rGY43SNcKDtQIvQCCDwOoC60DXVGHyhHrmKkpotRWdbsTaaYMUntpVICUyjqlrS6czwx3PfQnTB27m0cOHyUpJMk6C+4W16CQm65SkC55L5m6kX0p8rJh2go2TxxllHaYvWma3sMjxmK4p6AjLgZkFiniaJJ5jtDng0f5RRsUeWV4j1nap9nJcInj2S17GZz/+QdII+rs1RktiCUkkMRgyATZpY/bG7A0yolmNrSxYR6uVIp0liSJyb8mrDFPWgW+rJLaw7GVjsnyXdqcNSuE9aNrU3lJUhmI0RgJeKqozEXbPsLs5RMgxj2VDetNTrE5vsbm9h6kdc2qO0XbJ3IEuA1MR9y5i48gqHd2m3MxYmU8ZDzKcdtz8ojbWdVldq1FlyrifI2SC85Z2LInaErqe+ZWEfFMz3K6xuuKiQ8vMTENZwfruNnlVMDWV0k5GnDox5ODSdVy0OEVZ5Ty2OmJQjpjqdClHY0xVBDGSbNHVHcpqBxUV7I7X2NweoqMKnVR0epKoU9NZVGRbBYPNmjTucmZjFWcBV9KbE8hZjZ7WzBgYrXt6Mz3GhcXJmsyPMaliq7/Nzmaf2fkWZWEo6pJ21GWmM8PecJfhw1+nS83GX63RuWgWsbzBzsY6kZc4p0OaXygiqbHWISKNLCt68TKXXnUjne0O4737yM6M2HY1ef/L6NQRtzTLs3PsDCuyS4ZsnR6ztJygOhX9oqTMa6pC0pqOac0KZlYE62sZadKl8iWjMxArgWxp6BhinSHjjNPrNZGTtJYMdSnZOwMriwtEcUUv0jjdxnlBLQ27uzvML7WZQCZr3YIZ0UELQRSngU9uHbW1VHlGXZaAR6oJn/dsP1ZKkUSKrKqY92Eue3/yffxQ/kFWxeB8P8a/A+1pA9VkpkcxyALa6QHjyAeh7N7qmZMIDNp7Yh1RG8/p1XVaMx2kVowqS0fB5deWKJHQ6lm2Vh1XXiPI9hzHD+d4H3iw7XYc6uUS1KS1CaIqoULleOccSjW+fdagtMYKRxwFVHMSiCmlUAFOxTZ2VN6NUcRIkYAqqOsReIFzFa7QeKdYXGoxPBkENzmG3zVfAfsVnPe00g6UIZi5Uz4e5C4NMvtn+jDeS6SX/KT6BLnKaGtJFEVIKSnLirfPvJa3ZHey3q5JWm0cnvZaQOzyg9MkQnCRbIzyJ0Cjh0saaY2QokFnIXgaBsXgFxmxwhXQcBhDgBLQCyEauZMPfLF/9/bfRKsURM3iwjKDvYJPfOoD/OffeyfehpWg1pq9vV3SNKXbnaLICipT4axHKUe7NYUQmjNrx/nBf/SP+NQnP4W1llNPnATX+K3KFm0RIRHUODbdiJaImBZBEVp4Q+5rphqzf4vnYjXNthuT+Xpf0S8IfNPjpk/VBJwez5Ls0hYRHhj4gm2X7felc/mq59IZ4kaAdkjPcML0Mbhg6dUE1BqJxbGsumS+Zsdl+8/TSb/HpshYswM6ImZZ9jjjRriy4nLZY90Ngy9sGSxUpAwDhffwuNzBS99wN6sQ+CQyiK2M5na1wlVuju+W1+FbwQP2GjXP7XKFt1V37vv1rtvt4EIgZLBpqeFmv8Rr9HWsyOA0IRAMfUlZlIHI0IL1ehiC+gsWKd7VJIlCyImFWTA9E0LSCWU8GJRluE5C0pmeI68UthwhyfDGkxeWUjn+wh7m3cUb+OXtu9lRGWJUogx0t8KxPs0Rvq13Od/JNdxljwPw9t3XPnmg+Y97wB7PpQt0mz/e3Lz+G9oucOTCPz6jeQGrF2waAmeeZn81Z31rT5y/6f5knd+e/wJaKryA0uZ0O4qyHvLA0T6CDq1Wjyju0ptWjLMxg9GIrKiwriCNBN1uioodaezZsgU7x0dIYWm3puheNk2uPLUVxDPT3HAtJM5y36Pb7HlB0pZopfGFQDgTFufCgJCU9SZ16bjvvjUe+NqjtFstklaP7twiN95yC1dfdx2XXHaIletHzBz4IoMjm0QiwhiDRYIUKO/2+8O5C14hg3ZKijBO1XVNnKTEsW5EqyH7JC1QGDwaLzzrq2ew8stsnFnHesH8UovHV08SRTDYG7CzV1CPW1QtSa8jGJUV470MY0YUXrK7O0BFCbHJSdKIkcnZHJeMR6t09BkGZwSbOzk/NbqDm8qF8GE//vjkU/PjvPrszZsMFBXw2AX3vOTpU6riDuhd8Az9P8mUrj/F3zYv+H0VeODsrw/NbPAH1+9QZhVWDGl3Ftk9PabWKao9g85qrr/WsLWTc93NB0l8yu76Do8e36O3NIdIHcMqh67FFYarr1xi4eKUvKzQeGZiixTT5MUIF2t6i46+OUU8XiQb5hTjDO1q3Fjgc4erHYWzaG3wylKZU4zHZ6hGBcJL5uY7jIuCsdumFgVaC+LUMzfnsK4M/GVR45SiPa8ZqyF7eUXcSXBxxt5awfRKysIBQ6VrhluW/rYj1pLxMMc7QaQkU1PT1Nrihha5dwzXgrW9M0TJFrNzGuPLYP2oBd56XGVBepTSqMpjvCbuOB760pfoLB9HJh6ZzhIXI4qqBOO44sZldkcZeVGhM0OpNKOFESJWtA/FeD/FwRsPkbdG1O0zmDJGtyLa3YjMWNKORtQpo8KxvHw5U/OLeDlipSvYHJ6gzjy+sqwc6jGz6IlVTD/TwYrLZbgoY+nAIu2WoGieh1k1TaIjvAlUwrIoqYoSU5foRtRrmm2i6aeeUPZYKwVeEkvNuTpmY6r9EsozMuVnpr79ypui5anaO/fp8rGt3xp//vS3kvv9t1Mvv+I58aWzb9u789Gv1KdGAC+Jr5h+fevm5YNqpiUQ4rTby39/fPfpyfana08bqFLUKANZWTI3P8/cwhzrO5sgoT3bY7Y7w+72GtlOn8gqhLDYaszjjz7GbKdFbSOsr8FXdHqa0Y4k73si1SKJM/CasjTEcVCKW2vRKiUrK5JWCylDyl6pUJvXWo/WYSBMkphwhQU6OscnFc76/iFxCMoqQ4ga0dRA8iiE9IzziGd82zLP/47b+NBXAzJ3ILvAyqj81tHGWZr/tQCOtLm8HSOZ7Vvonz+SbW2sIYRENJIF51xQzzYTgtyfFyZ8sFCKNtQTPhu8gEeIoFCkseFq4lqkUHzh819H6gitBHG8yqgPl15xM1dccSVHjzyG1rpZZUUNR9g35HZLEgukT6nKnHZrChlLMiepLRgncTqI4SywQ8UOFQJBVYbuVHvLkHLfqKvjTwAAIABJREFUeUAg2LU5EQqP45gNaveJP+0EKZ4iPe9aWRxrbrCP0Prm/CYR6ZYbQ3OHz+WdToxADpuAQk4Q3QvbKbt3zn/QXH/Jom+zacfcU5/mh1t38O9Gn2Pet3iNvJ6P1EeoakOSxCRRTBRpahPQ4w/Xh/mp5PncWR7mWDzgufoSDogu94szOOf4J8UH6Pa6YaEB/GhxGw/aDT7VPgl7cKahH8zGKUfybZyD+aRNhOCn4ufyx/WDfLY6SWErXqYu45XJtQ2PzuNTT+EttTF4ecGw4gOKflKN6RJzqZ7itN9FCrhaL7HBGJsIYqfptNpMdTu4fhArJlErCAa8YDgo8A50LJgpFKcTw0bRf9J1rbxl2+YcN2Hb37g37N9Se/vMUwTYwK3lAYqxI041VVkwtCVz85fR6abkxTrlaMDu+i6dTo9OO2LUz7HW4qXDOstICmpbkyhFkTiydk6ZW6pqzN2PFmwMZhGuwJeC/pqh6z3Pur7FFQfnefixEceP5WxXJaojaQkd1L0enPAY0djvaIkxBeOioCiHbG4e59jRB4g781x86VUsL8cUhURGAic8SmuccdR1HXjXDQpzruI/tMlCyKNEEMAVRVDXWztxGnFIPFo5etM9nvPcW1m+eIrHHlPsZDk6yWh1PGXtiSLDzByUkSBOCrzPEKXERCl5NyJnF1sM6eg2O/UmJp6lX4wYFiXECbkWTC1qlrqet3/qs38rz8XfauvD8TN9rnnBRaR6hcce2WPpYJfuVMR0a4bYj+hcv8DA7TLVmac60+byy2forqxxfCPDx5Zrrrgc4YuwSFjuofYqHn74GCrpUZYGqWociv5mzUXLHerYUMWnIaqZVjHUbTrdGdY2tlhZ7DCdTjEsxkStiCwv6fd3iKMeuuPJ6orx0GGsDyubBJyuUbOatorZ3aipjUBLye7pKgR9MzW7u3sgOqRzOXMHE+oSRoOEmVmFqxzzM4sU1RhjSgyKtJWAqIlWrueKFz6P2dYe7/vd/5ubbv8ONod3IzW42hEJ0RDuwvxmraWWEXHkGI4yLr0yYZBJyjPB/cOWFcO8ZuHaGfrDU6w/kbGwsogVlmI3Z6hTfA2xiEmm4bHjhxGzHWYuUmS7OXHcYWNdMrvSQ0z1qfsRcwdm6HTmKYxk8yR0uhFVvUk26jPVWcEle8S9kv7qCD3dYWd4mm6akopZylHO+skdegSAzhQ1hhKtoMpF8Ko2NQHQ8lgT4ipv3T7lcTJxeuewOMrYMZ2fFdtCsyD1nre1Xozzju/deffXZmVL/fLUK655k7/D/n5291Mts/bbdyRXz3RF8qTYsicT9cHioY2/rk4Mx76yr2/dsvhvpl529Q/vvveBNTeon2pfk/a0gWoxGKGiwFvpLMyQ2ZKZuWlMVeGNpagLamOZnVsic5Y06VK7mnYiuebKRdzcUayFqoxQyjHYqVGR59C1jrWTEQiJx5JnFa12G0Goc40QxHGwexAiBLBS6qbmcYCtQygW0CDvBUIEOwlBuBnOOax1RJFGKo1zwaJBt2u8j9lZl6xcBre9cJG9fIsqdsSVfLrL8d/UPlw8fD6/sWl17JmaCQ/cBP0Nwi6B9xLvJIhQ8MA3nUsrRVnWZFmOsZZYQ5LESOXxvtoPBL1vbIl84Eltbn8qVIpphDq2dlR2hrIaU5uKOE6x1pIkCePxmFbLhABaKIw3xAjwFmMq0qTLgw/fy3XPuZlynNHf2WpQZgJS7X0whLZBSOMRzNKi0+jqaxybPiMWkjmmAtKKIfeGKZHwruJeECEw+NG99/OE2z3vuh0SMxz3e0GOJsAZi0aiEMzIFi1x9jgbbkSKZlaee5yaKREQXaBBdDMGBDQXD9qH5+Biepz0e6wy4lfGn+Yn2y/gj2e/B4PnE/Zx3lt+DSElSmt+RD6TJTr8kvw8sVZ8qT7FO6p7eWvyQroi4VSyxy+Zz7Hmh0gt2YstLgoqTSkUNZ4MwzAKC6M9X3BPdYofU8/hP8uvskPGou2gUURIfF3SqgOy+4rW1UhgxgZEVAIzTnO5a3Ehq6OVxAxcxbrt83V1hn+S3s6v119kVrZ4nbiRz8erdOIOQkCsI0xVYasxxha8Wt/Mw0mfXUpmZZtXV1dR41hthaD1lmiFTTviJHskIuINrVuYkSl/bU9QybBKP5buhUWkkCRJQituk/oY7cLg6JzDWIuzwVvZW8870n/IW6tPsi2be9SozEMGwYdFbJOREXAeiDzJNvj9rMTZAXsfaWgWhw1uiBce6xxjWzB2IX32A8sfCSVGtYdakRUl7+2/prmmmt2sINEa4TWra32mOjGVzanKjLwMxTpqF1PVFUWeg6yJVYzUEXVWomSCqxohqfFIrzE2YmM3x9Y1Fy9czPxBwfqpU7jFA6h4k4Ol444bOjy+bfnaozVbGxntbhgPrClCFaYaJA4nHZPBMdIRBkM5WuP4/Wc4RoRTDi8J9m8etAAdRdRNP54AARPT/wkYoKRENMVfiqIgTgRBsCqC24MXaC3RKuaiK+Yg3uXYyZOIVLLUU5gip9M1DHcEXhhklNGd1eRlwWAvJyty2lPztOditFR0W3Pk4wwddcKxS8GBA112BnsIWhgUtM5WGnxcDxAyfBbXnFu48c2oOkEAfLj2kdR0XIxsnlFrbbOYDBZ57+y8nrdkd7Llz3pQe+/3AQKpJsF8CAYCZXwiEPYXBPr70lvOzbMKIbDCsFUOECqMp5ebIJ6RQrG7PcCOhqSRpN6p2TkzYDhbIGxOK+nQ7c2wtbOHz8eoPcHUoRlmW456KFG1wGrL7rACmdA2Aw6s9KjqiHi2x6CfIzTcdOV17G6sU1YVRFMYu0lpLPnIwdSA6UPBgzNSinF/QG86w1gYDCoWFyM2N/rorqXXizF9hS0gjVMqoCgrajsgJiZSHhVL0p7EWoet2njhEJEhcTNsbQ3J+wIRpXRnM6YWV9gbVGjtSJJ5iipjMNwOlaDGp7jvIx9AOEE37nDm8YfJ42EAd4ylNiXeNtlZCcILKg3KCqLY8PiZexG9NstLHU6fGrCbW5SPiW2Lql/QiVKEgY21mmrUIi9gY3dId0qz0m0jpOJVr3gj9z/wUba2nqC1oNFzJZUokKKCXNDfEHQvnqc0Y7JsD3SXqhTkBai6wNUl1bTg6kPXcmpnlU4nJtExcRRx9NE1hIr2gXxZGb67dSN36IP0ooQdl/H75VeYFS1eFd/AkuxQesNXzSp/VNxL6QNc9FvdV/E5fYrr/TyXuWnebc6KbaUA7zwraopnRBfxQ7t/emroSzu0pX1//sD6d7duWXm6QHVWtNQ/bt9x8GcGH370D2bfeF5K7EPFw+dV1XlPfv/mG1q3XnRTtNxZKwdPRjnOaU8bqCpd053qsdhbRCYKYx1CaapxxmB7DzvOmF86QK/VwZRjIp1ga8nMUgqtLWaXoNWFKg81nXszHVqdMbPzggfuKdk+ndBp9yiKijTuIZVkZ3ebONbUdQFE53AqGrNhY9D67MdWKpT4UzIMmtZalKIJXhVZPiTSLeI4xlqDEBGDYc7l1y7z+h+6Cas1RQWv+8Xn4qnJrUCrBOkEorQN/cBivUGpBIRG4HC2xnuHdSCVDgGHbnhcQiFUhCtLSg/P8zejdCgFhxBEWqMjja+gshadCIqizXznRZxe22A8MlgvEa5GaIVSgrnpNraouPMDf4FUe8TaIqoxM0uzvO4HnkXUNoBA6QhnbLDp0oLajDG1Ikk0zhmEl3hbMDszT/LlE/t8lbKscc4QRdE+eqIFeJviE4OtBRGSuvbceutVXHFjlyIf8NBXVTNIh4HXelBCMB43gYHw7PjsvOqeQoZs6pjAsZ2YIwxEGcrSAe8q7mGLcUCJJ/AwBJqBDF4RiIAc1VhqYN0Pzyfnesip2bX52WML2PHZfjRzYSCMgKqJ7k76Pc74ESDYo+AXxp/Ae0+n10MgUHGC9448z/lNvoAgTORKK9JWm89wmk/7k3Q6XaRU1HVNUqS00zbWGobDEVprpJL8avoVIh2hZBoiTQfvzO7hVa0beEv3xXREzI7L+OPsXv4kv4/XtG7m+9rP4ITZ5e7qJM9PDj1dV8anAUnutRJGrqbbSXmXfJA3jm7g98QrsTi+oE/yV+kRxNhgHXy/uZUF1+JX07sx3nGln+K1+TW0vKbAcFhs8yvRXew0HNor1AHe0n0RUzKh8Iajdpu3jT7Clh/v3z85oalITWISUq+aaleTeCH088BVJwRYBO6vDaWv6PqYN0U3c6NYpBaOz9hjvE88hN/fx1nhD3hir/ju5CaerS6mJSIeddv8YXUv2z4U35AIpoh4g76J2+QBFIINP+bfu7vYEkPGtsCbCmdr8qrGEBaXkza31GbvdIX1hlhrbJ2zuz0kTRO06hHrEmtqspHBW4eWMRBhrUVojZKS0pUoKzC5I1IxvZkFhFRs9vtIaZiuo2BLs9xl7qKL2d7ZQknBxddMcSCaYmrB8PX7TnLs+JDS+FBGVBEKOyDxWuCExZkKrEAKgVMCLxz4AoENC80ahAxcHoEKY0AzHoT+E6hYzlm0CmWibWPHk41zrNXoSJFnNfigc7BCsTA3yy23XklRbVHWhtp51FgglcL6PdrRFEVVsLGzRtLqoZTFKolO2sjK4StDLgxVOaKsLFoqqnxI5A31COZnU2yksE4j47NZE6n2HwOctQ01SjYLFb/Pv1UousR4C7iABVvhg11c427gmjHDGEPtwrM4JVJ+uPNsblJL1Dg+Ux/jT+sHwtjkHHiQaiLsFMQo3hDfePZZtFv8QfMsTgao79RX8ff1FfTSEHz8F/MQD5i15jQcSU9y8NoenTjl2Okd1k73cVIxPZ0S6Yi1w31aSZeFFcnJkydRgynSbszexhmK7T6d2TYXH1xEOM+J7QEXLx2g07GMBjlT3RaRVuTFDtujkiROkZUgcglG1MhWHycTsq2SnX7OaLqiduAMTHchFTV1v8YPPdIrRNIiSSJ2sz71YEw7bVEMCyKhcGULTIGzNSePb2FyT7uXIlsK53O6scWMFXPTLda3Bxy6Yom6rBjnFVJ7quIMqUqQaQePYP3EgzhTkGVdFm/ocbw6zHSZ0IpbeCGpbR08qH2NNQ4lBLEx+DqizBSDMuPgnEZZx8J8i2KckcUZvdkYK7tIXZJlOVundpnpzbAzzJB5hI0T0sUZRtEGn/ziF4nbO+hWyAJ2Ykt/R6BVi1jGvOAFr+U5z76R9f4G/+WPP0bfrWKriigR1DYjMhE3XPlsrr32ctY+9C5m9SytjmJzMyOK22CmmHBSfqR1B3Oqxa9Wn+BUNmZFTwGeSGr+Q3YXa37Ikujy0+0X8g+TG3mfeXA/g/die5BfzD/N0XqHK/2EbgU0VeYuV9OMfMVx2y8nWx4xG+MF1Ym7IpYjXz1lqvmf9V586Z3FI2dO2r3qG0xF++1avdjqilgfMVv5N3vv0waqFx1aJG31eOL4KnHSReqYQTUCpYl7M0iZImXCiVMnaC+0SNIu/cEQ31bEqeHr91hGe7B0ScXMXIQ3BasnUmYXC66+DdaPWZwr0VqT5YMwYGhBbWqSOA3pI2/3J3lgn4MqBDjvUCpCiIA2TqIUKSUqFpRFjpIpxlVE2iCcor8tIbFcc1uHh04NKIpQOSKKLFrVCJ2iVIXCEyUd6ip4xGqdhjrLriDWKYIeUnu8MU2AYlHKYU0dgmYEeRRqYEc+BLNShXPx1oMTVPSRukWrlbCzscsXP/QB4qhuqsFIZKoaZBW2em2OHz3GqL9DEoXJzYk2m6t75MMhNQbrNMZZlFTYWoOqAE9VCLS2KCWY6RykzGOE2GU4HiG0bPitgiRJGI1GFEVBkiS04xbjosa4wHmrbIU1grrqgxjhZMQPvPXbSNQ0rs6RqqbEsdRd4pf/xQcQIvjUTeynRCNYCshXCEmFaBTFrplACOjNx8UTdOjSaRKIk328PXst/6z1EUY7ObqE4/5pF2JPbt+iucLbZ17Lm3b+lMhdiLILVsYTxOYbdJ8SGJ9jB9EPtaZiaIrYurPbsM2rhgn7yE12Y3hv/jXem3/tvN0/Zrf5QnXsvL99pHxk/+efG3z0SR9JFBZSaO14ZpyAnZIhJb/HXRecHUw1P7+PIPicAWZQvId7eM9TnO7Ebe/PzYP8efHgk7afS7e4NJ86Z4s7e87Nsc+92hMaBzPQKgwdF1DZH+88h9Iafnb4EVIZ85PdFzKm5i/qR/dxKe/OUk2+J7mVQ3KGn80/QekNb0qewVuS5/Oz+V9Bs7B6a/oCjtod/pfio2Si5mI5ReENWkQoYRhs5USJxqPBGZL07L1f3RiiZHAd8VgWZ5cCOioMaZLiTZ8sz9AyQkWSqjQ4b0GBEBotI5ySgd/pC8bFkLTToiunGQ5CMHnaHseUlnwH8jPrLM4q2u0eg6rH1Ve9hOufcRPX3Xg3ZZnw6CPH+fIXPsk4y6hLw7h2GBdcVeJIE0URQoaqZg4Q3qOEQ0mNNaFyHwq8C6rlSfMNej3JzCgtg2do87wa4zHjKhjrEyqcOeNZvmSOl738OSzOz5DXFarjqKsK5T1WWIQoSSIfBFpOMtjL6fQ8SkdUucFqEXjyaUI+qtEO0BXtXoo3JYMzFb6OcUogMaTnZLCCXZDHNpke11hnKSmD1sA5FJqOixCOgKyKs89QeC4FSpz1Vw7eLWHbT3SeRyUdbyk/Smok/7z9IjJR8xF3FKUkpjacdYDxfF98M5fKaX6u+BQFhh+MbuOn0xfwr4pP4Dw8Q63w2ugGfqX8HEfY4YDs8IvxS/m/6i/xiNmgKi1T7QOc2d5ib3cXrxVSOIqtjKkqIZ7v0OnukY0y8ryDbSmKUc3szBzPetEcZ9bXOfrgLk5JBuMSO3LUO1tMLwr2RhVzswn10LC5mmFEzcGrD2KdZHs8Ik49ubTUTtLpRSRdwalTqxRZxKUXJeS5YXapjaRkq1+gyzZFPyeNFdOtmGGxg44iklRj8opYhTK3OHjNK1/NVDrDYDjig3d+GJlEjMqaXi8Co0hUhzhWjNY9adyj9DleZTgRkUQp2hn6eyMMAmm3SUmIRI/LVlZ4YvsRsrJCaPBeNtmBMP84Cz4y1JVFtWNsnuFUC+XGpLbD1CVtXGoxuUeNLX4D3vya/wkzPsPpM1t8/DMPISnY2Nqjdp7SPEbiM3pTbcSUYevRjKwO82e7rtgdeO78+Oc5fuoIo9EGInWIwuEJXrJT3WW2Nods7nwFqSTDfJ3HvlZSDi22LsH1WWCarkh4fnyIt2V3siXGgGfdhmzVGTfat5I7TZ+Plod5cXw5H5RxiJsEfNI9xkPZKp3uNHVxNuYM18bTFhFjf36sOfCFBeiJRD1VoPrS5OqZZdlNfj7/6BMXbruwzcu2/vneS6/8cPHw+jG7W36z9z9toNpeWKAsDHPLy5SjmlF/iDUWUJRFSdyWjLcHKCmoao+pDFpJ0liCKZiaEZhCg6tJY6i8oyhKzpzWrFzqgRqlIzyGJE2wJgQxukGqrKnQKpRzNNYiRJjwtG5qTItzoBhAKdlwOUM5SaU9rpZNbWKJqQUHVi7ie9/0GnqLMYMahKjIRsFO30uDMzWeAmtrqtqQSsfe7gBTVThfImUekC/aKAQ6Vijtw2fSEucUUihKVxMTI5wIqUwlkCoIgYQWgf8ZLVJVltrlpC3N0aNHSRKoqpp2q0eRbWCtAgtCGuaXZqlcjncRfuwQRqATQdzWWFEF9a0C7w06BojDhOQLoqgFvia3O9QIuimhXrv1uMaOZpLOs9YG5DpO0NohdJuqzLDGYOqarZ1trpNXUNqctJ1SmwqhLEpECB9R5tMBKbF1KB3XVE0S2EZJPAk8RagUQpN+dQ3xG9GgrI2Qwzc1m4TjA9GDjKk4PQ4B6kRs9TfZPIEru+OzffeAc9sRs/U3fsynahNe539vLQjrUtoiRhJcJbZdhkbyL3vfzrzsUHnL1+o13pd/bV/Y9gtT/wN3lce5Vi9yqZ7lj7J79lNSkzYv21wfLfPzg49SYCic4UPmUV6tr+ND9WEm6dVgqxREYs+JLuH3yq8yogIB7zcP8RvRK7hGLvCo3eQF+iBtIt5R3oMVYRF5mkEjZBR0VMrVU5fz1/1HSFuSJE7PJZCTZY5uTyEd1NaSFyOKcY2MHHmdUzqDbfwVvYO6KkHZUMyhhpoKFWtsZXBWkMbTaFrUdUXpxjgLJs9JU00ypTmxucHJbcHCUoeR72FVj0qd4YnHHNfcdAW+l7F8ydVcstDjec+8gX62y6nTG6yvbXD0iSdYWxvzc+3v4Nn6krM3bNLOpeh/MybUJI0uL/hbmCLOtjXgDyAsTCZTzrkHOrem+OXf5KDfWnszgQt9dT7Ly1rXclt0MdMiZdOP+O3qi8zT5o3RLRyQvZAerU/zzuIeShHKEf9W7x/w6fJxbtTLXKnn+I/Zl7mrOn7OeQtWomlu1gd4a/kxhqZgJAQfsUd5lb6GvzSPNehtI2Bpvt+hL+Y/lfew5ws88N7qIX6z8wquZo5H/RbLtDnu9jhqd2kZyHzGanePS9Q0j5gNrrJz/O9feuFTn/QW8Pg5v5/786OTH24I3y5M3j5JfNi0tW/lagNfhAd6LX7n6uPEbcXBVofdVY8TNRtnNtCRZnp2kf7WiEhE9OIUVSlGPqXXWeSFL3kNX3/wGL2WoXZ3IsqSdjqDNC2QgrkFz2Bvh8j2mJ1uM8otslpGu4xytENW5fzmyiu5atgshJtbFcRo1zz9ZzfNq4DzUn8Ah5vXue2dAAeBg/yYvh0GhBfA9je5Th+elCU91LyaNpETDYH9IW/h7HbNftd5c//9+8WJRlVJh5SODO4umbTcrJZ5TXIjK2qKKHjSMPAltnYUacgmbKuS6blZpBTnYgU0eQYyb+iI8/U6UyKk5Z4qSJ0RqfqRznMO/tzgo0e/GRa0LLvRr01/1zX312uD3xp/4fQ3efv+6X/D9gP3X8Yt+exTb1TAuXHwuarHIU9WUT5Fe6OC/TjgqeKNyWAXNa9z22SeqC74/o3aZP87wL9/KpHZuScTc2Re8+FnefaGGywsdfB6m4WFLu32YuCUygovAxdJNWiusZY0bWMNSBKcrFCTCU16rLM45/ffq6KQDHJ1RKRbWBMhWpY4STBOgY4o8xFahApFeVGBjLHWoaTDex3SaDV4UnScBIJ4WTc15y22dkgfoYQGpbHeoyOFcSn9vdG+eEspRV1XTUY8+CNWJscKSJXGIolVjI72WFsfMso7uFpSFhprw3kal1BrxwOPjnjRd7+e3dWCyy6zzB0o0ASrFK8FEQ7jg/I8WIeBlBHCW6RMkCLC2DxMa1rijUa4iLQlcbbk++1N/MlPvw+AYXAa2heQTTiJQXV8lhMWKu3Ihk82CZQdopllJ4jtu/LX8+rtd/Ce7H5sJIjc2S5yfoHT5iEUnM03T36n4b1NCNPN5/rwzJt40+C9bLgRmKav60lKdf+t+6DvPjpIUxq1MVWX4qzB9IXN+yASmPAHz33fu4v7qGbj/XKXjpDaDNYlTbUs76kqi5QROoqwzjByBZW1COExBtJWRKcTodSE6BlQ+ckAO6vbKC846fcwOCIUUknwnt9xX2WDjANqmh9PnsHL01t4P0ewLuCfz08v5/8w93DC7BHFEhMHUV3eismFZcHPMfYVj8kh0w3a/Vi9y2LcoYWmEKZJU4vAc23uh5ISSRikZfNMXCZneMRscr1cYN2N+JHkWdyiDzD0FZ+oH+ej5ui+2PHblm7B+pJ7R8eQyoE9e2HrqmSQKaQXpK2UuK1Jk5iqDBQBJQXS1whq6tqjhAyK41iB9BSFQVSBM6l1QqpjsnwYUJjuFAoROIcOFqZatJd6GEKxD5HC1nidRw7v4MsxRT7m9Ml1EhHTr2oOrxYY32Jx5RZuuEnyrGyNhx4+wzs++GXewfmlg//ftr8rC6uJYwjAgmzzZ9nX+G1/FzV2n38eC8Vd/gmMcCgvOSC71N7Q9xl4+Nm9v0QA73JfpfSWRd3b70uh4qLkkJ5h7CvWbUCwoijiOHssig6RlRSYsBa3NgAoLiD8gkCVkgQ0H+ByPctjbpevsMZLxOXckCzxhfwwN+hlFmSHjxdHOG7/jgsS+/DY+gD8iDRReAdl3lAnRM7o9Di4RAhPdGiGflM+NclL3veev2CrPwYxxlUl3V6b5QMrRAqieIicqjl+ouSaxUXm29PsPL4OPqb0kjiWdJTi149+/P/vKwD8f9MPDumzi7njpk/fhujSeM9Je/Z4Avip+Rfwn7Kv8LHyMKU3vCq9gdelN7Ga7SAKge85xkXGsB7gvWd0TuxlTI31NUf9Bt1OzIqcumHNDTzApWpWb9lxNfTl+fXOgWv1UntapPGvTn3neauCn++99KqPl0c2JwHpJWo6/rWp77rm7vpk/zdGnzt14X6+UXvaQPV31z71re7nv7v2jVS8k3b1tuTzn3gfhy6d47Y7LkPrNpmucRa0kxjl0EDj9d4MPgJjGhRRKKSV5KVDRwm2ckgUxgaUWHpFbXSo2a6hzEvQI2ZmVnDOstvfRnhP2kpZXlpiMOhj6ppI+obrKgkQjiYfO+JpwXhY4pXCeQmVwmCbgUFQjCU6Bust3u8hfIvRqESqODyctt4fbMvSQFNmTgmDqcdEUQdESdpLOXa0z2hzTDRtqEsLssBVCu8zlBCMKqjLNggbPN1qQ+HGaN0GI8iNYeKE6jB4b0LBBmOagFUjhcILgSstgpCukTVoHUR4k+YaRBbOosKIs2KPUDln8t59HLf5qkL679xA85wmXfiUc6JFC40HRlT0uSBTsS/IARxMk9ARMVJAiWVXFPv+rwLoEdNTMTMi5Xvbt3N9tETlLX9VHeEPy3u4YuHicD7Nl7IsqKqSVGjekN7K7Rygheao2OVP5CPsismSWPBCexHf7g4xTcKmyPgz+ShH6COAz7HJ73z/LzTcQklw1F9gAAAgAElEQVQoimHxwiB88A1FCM6cPs3pEycpipp2b4pKWFbXT3JkOuNIPqI7HfPi77iaqRlLJDVCxGRmzHt+6kN0RcKvTX8Xb1UfoyCirAxCKaIaEifZ0gWJTtiTFZ+1p3i2XcFM7pGAz7iTnGAP8NTeNoxlUBKk9yRWkKuaJIrAhPGyFCHVm4qIQphGNBMEUXi416zxneoajpgdCm94bXwDzvt9V46eSLhRL/GHxb38n/ndHFKzvK39Qoa+4C57Gge4SvH3F2/HW8NX86NEcWv/9mslkUaRpAll5hkPRnTbMVXhyPIMJYOgKIk7RMpTlCUWA17ijMQ7j6trnLEQQ1bVDPuGdqdFrDzGVkQ6wlaG0WhAUVrG4xKdFyzR5fJD01xyKKa/uUW326Y75ZGVoRxZTp94nNW1dfo7BQeWl5lfWKA6J8g+LgdYZ4NoiAl1W5zXFc5ZQ51drIlGuMlk4QcRmg8v/GO+f+fdbJChRChR/XR8G3HO12/ULlMznHIDjHf7C0onPLpZqNTK7vsHAxxP92AUgsCOjFm1A2oRzq8muF5MRJ8QnEkGvqQr4vPEhwNfUnqLAAx2/1NKpYhUQksm5Bi8sygV0kZDW0AEqdfBug7RLAIDDew+u86r4mt5otqlxPL6KDyLrcZ2r+8K7raneat+Pj8z/3wAfjf70n6QWgrDUbmzf5+0hB5tkqRNrJN9GyIh2C/WUNfBMWeyHP/D6Lv4l+Kz7BK8i+va7N9z72icHib3TQQ+r/JkKiPLcmicIJwP1ArhJYeqaSD0Be9FSKl722Q3wDdULylFKIWednnZy1/Il/7qs+jZmMsuO8j2vffjlOLA9BRGQdY/wsLC5fg44tTqCJen9DpdvIxwLkIrx3g84MDiZSEgblbKJ/WQzlQ7GO5rwWAwxvvmPJpqaZPzmpxz2p5hMekGQZcN9zpcYsE7olfyz90nWa8aemKksHWNdwKdaLy1VMZQtiSmKvfR1Vq6feqYUc2T6z1y/9hiv2+F44kndQXh/H73efvMa/lXg7/kOH32fMHnyyd4c/d5/Mbwc2y4ESuyRywUEYqxKzHOcpma5R8k14dFsAVs2J+0HlU/uV9O3HfWbagK+T93nhP/2ujT5bRIxRvbt0YfKw9faO4HwL316dEP7r7nPI7aO+e+95bfHn/h2F9XJ4YAV6r59FemX3HNp8vHt35nfNdT7ucbtae3p2qam5sCXBA3OHA+IILWTERFPkwoorFREo6itYfSdv8m6AjqCpyFP/M/wk/G7+ZENqLMBRKF843K10+GLn+OOCIMKmfVu+K8gfJsib9zuGkiTABCeJyHKIrx3jO32Abh+fM3r/Ge372bRJW88Z/egalX+O1//S7e9OaX8b1/dBCAS6+cYWVmmfmFNqdWd/HtNASL3hGJNkbVGA/ae6w1KBHKa2oRbOSdEURCYSuDaj5/5DTOeSIVUZQ1OtIkUlAqAWbE9s4auNBZJgPp7u7uvk/nxL0q1PStkMQoocA56twiI4GOBNI4jFJY7zA2eNlKb/GmIlIJ/TODQLXw4Z7GUUJR5AgiTF3ik6aD1RA3pRRr41EiZdAfcvr4Ltc/62LyMpQL8BqwHklCpFKSKKLoD1E6JtIxZWWwTjYZU0+kg6m4EgneR0ih0co3E6EI98uWzWAY4Acpgw3ZU89rDUoq2FdyCwh14yfbm4BokrEUjb1XqNAcI8sLcp1CsEDwvj3FEIVkiTaeIPw67+jNgDJLSoxilSHewzwtln2bk026IfWKyCdsuBFv7j2PGse/6N/JWBr+TfelDH3FfaLf9JswpEZJgo5j3uiu4xLf45fElyi84fv89fyovY1f8Hfh8dzul3mluIpfd3/NafZ4IZfyY/52ftZ8mh2fgxAcPvwY3roGFXLB6kxpJIJYK3Si0FGLQ9fdQCQShPbESnDzNdfyzGrIqdVVPr9zmHpHU8k58tqQl7vE8yEQmKSkdhKBL2OccMSVJSXituQSXimuYtl20FYiPQyo9pl/Htj0GeBRTZ+eBB9aSUxhyFxJW8S02ik+D9zfuXZI941tiRWNJUuj4vbe8478Xv7H9Fb+1/TvIYAPlYe5Xa+wZ0usdWSuZttl/GVxBCHgmNvhLnOCZ+mL+bJfRUpJJ1aUJuLQpddxeG2XYnhWhKeFQksVikZ4C6WhyIMFkI4jPI7KWFQkEUJi66KByV3IGIjgUiGUx/kaZyRKC6qiDKWoE0msY5xx+ErQ6SqW5jos9i7j5uuexeZoyPEn1kl1QqcDQsTUVcxMr8Oz77iNKInYGZykthtM95aJ1UW86zP3ArCwMIN1HmNrirwgy866X+xnB5gEq83EJiYjNGcn3AvmPNEM3tOk/ET3BdweX0TtLR8rj/AH47sbCtCT2/e3bud7Wrfu00EAPlc+zn/IvgjAHdFBXte6mSvUHBLBqh3wR8U9fKE+PmGAEez+7H4FPOUF/7TzPF4UX05HRHy9Xuf3srux3gYvEhUWK69p3cRN0YGmWmDG/zb8OH2RNwHO2UBYa42UhhJLi2Y81wrn/b4XceFrEGHMksLuj0l/VN3P98Q386/jb0MguLM+zO3xCns2x9SG18U38Fx1Cf8y+xgP5qtcqmb4+amXYly4dvjA8A8BjGdaz5DGHRAS6/4rb+8dZdlR3/t+qmqnEztNT86jHEZplIUAgUAYJHzJAkwyNjbB1/g6wOPacK8N611sgkjGGBAGg8nYIIFQRGGURqMRI2mkyXmmu6fjiTtV1f2j9jndI7Dhj7deraWlPj199jl779pVv/AN1l14Y/p7Z09Jw/ZvijuJTpzStjHWaAZExNuCCzhbjpJhuC8/yPfNDswCkqzJoCqqRJ5HR8e8NdjElcpdz6f1OP+ePcWMddfKaMvLg9P4b945DEdljpo5/jF+mCf1GNYarIGBcA0bVp3Gw+Z+lAx4cs+zxFkbaSSVwRprNqzkgktOJT2e8eS+J7HVMlOzEUmzDZFmeGQAnXaRYphmo02czfNxgkiSpTFSUATohYao6BUkFiRfViAFRKkhFRlGW6QSDkbI/E3XOi/2YI9BVeKN4iLOYhE5hgfUIb5jnsR0LCWvxBQnG9cI3D5QxXWzYnKm6PaLF0MiYkCEJ+VzUrh2/bh1+0avSns0b/Thbp9o3ccfVS7jHwZeTkWGTOoW/9C6l5taD/D28ibeV72SndkJ7k728NLodDI0I7Lsii+yxCJZZsK0yRcKqWJZIipUZci/dZ7gxvL56ttDbypnGG6Ld9qbO1uGgCGA91efFyyRVfGBxs+SFF1YjJ88xnRzRcM6jc9Xl84NhmTZuy46fdl10enLRJHGfrH90MHnKgI8d/x2garJUcotqEmakCYZWIOUAqUECLmg5VoAcqXBD1ygkyQuKCmAivTuf6UqyBKomYD3la7kAm+Fqyxlu7k5dk5HQhQTrMhMhYAQydtLF3OVv46KCHgqH+Oz3c2csO1+pvk7/hm8KjyXEVnmmG3wdZ5khziOED7Wwl0/OchrbryMfTuPcuhpgSc1r3jli3l6+xgOfwKveN0L+cEX72dTvom1awfpdCQlr8JM9wRZGmBNCylACh8rNKIQk3c4LQGeIk9ShJBuwzKQ6gzlKTJtXUtfS3QKnvTwAg+jO1ij8KRX2E5K4iQhCH2Ecr7yQCH/EoDxwAoUkoFaDS0M2mSEUYAyllYrxffKhJGHRRJ4ZZYtqfGjXzxKuVxB55pup41SJYyxZDbrt4/DSKK1h1JeEdA5z3Xfh8cf3smpG1eQ5xaND1LheRlJ6hIYz9dgFGlqaba6zqUGiMIQqy02NQiRoTwPjEQJD194GK2Jky4mzRE4RQJjDL7vozPt1BUWbHGB8Xh1fhaXmOXUCJkWXb6sHmdYlLkhP43FtkKC5nF5nG/624mFs4e7KXkZ96oDnGUWs94O8S9sZ6ucOGmxqOLzpuh8zvGXUZcRk6bNVzpbWClrvCg6jaWySmxzHskO86XOFlKRU7EBf1t/KT9Pd7HRW8Zp3iK+1dnGROpAYiU8xmgxJEpcEKzgHbPfQyFom5Tvx0/y+ug8nuBRpHDogDzL+wzzC8QSvpo9wXg+i7WGb7OdmyovY0Un4Fl9gguis7nf7GdneoxSqcSd2W6uC9dzab6EHyaO5PTUlof6i7RLMN3GB4IgCFh7ynqq1SoTE+OkcQJKEZWqVGt1qvUK65edxqplq5nYfZh77t/M0ksWseK0EXZPuMCt5y5WmtU08i4lDIHyKYcl/pgL+RG7eIAjtPOcF8vVvFSsQ2HQxiKUS0oC6bR5e10KDKRJRp7lHFFNysKnmoY0cYHqClPlBG26Nj8paab4ObYZX4239itFK+UAZeGzV81QKoUcky1OESOUylEBC3BsdIHA813g4UcBnUaXM+Qo3eGzeCDf1jcBsLl0ZE8NI4uHSNKIsbHpAmKRoQTYJCNLGygV4BXdAp1rjMnceVqBLgIKz/exwqB1jrSGLJbkWUbgB2TSZ/HyUTZdtRK0wWYtJg5P0+l0UGXDzKymG3cIZIaNOuQj48gylEcyjK0jJGjmg2ztOba/HypQAXGSYbRbZxfGnvNBqXvdfwKL7sXCZ9L9qUs6/6r2Ajo24/dmvs2AiPjb+ktpmoTvxdt5zpH6Y3s2xoeat/Vfr1Xzbc+qCLgv2csX84c4ls9xXXQGH6hew/vnfswe4wCCWhtcv8A9N79fvYQ1aoh3z/6Q1Oa8r3oVH66+mP/R+AlNUjwkn6tdwwE9wztnvkeThEu81cQ2739Fz/f6nAghJRbBITPnjEBUjROmizWWlarOhGkRk6Ok7BdOrHHdrbbJ+GryeD/oXyHqvFmcxzNmEqkk67xhtupjjEk3uQ7pWR5MD3FJsNoFqrhCCBZGSoMEXlR0EJyMFtq61wtuV6+PJA19QpivgMwVP/7Iv5iYnD9NbqNKwJ8HV9Am5dZ8dx9WJaUhTzSeF/HH4UWsEHXe3fohqdK8N7iCd1ev4GPNu7AWnifX8Wb/Qj4U38aBfIaXeqfx0fJLeWfzB5wwbo8eGB1k77F9NOM5aHp0myUGRMjhfXsI6qCTkAPHFzNciqkPrKFSXU7Jb0HokWeSmZk5SoMVTDcm7iacdtZKdjztALX1WsVB7KxFKEncbRVdSOjZmtv5iwOAKpaMIFD4vkJnuZM5NKaPwbYFxPr37XnEZPxp92dURMhfRlfSCXN+pneTLoBv9mBnQ7KEj+IoDiIyIkosFhWO0UIADZEyZ+cLHz6S5bZGq/CgUgisKrqGSjg2FI4H8M3ONj5p7kchWK7qNGzC03qCn6Y7+3EW1vKv3W2MygqhULx59t/wrGRQlliu6hxaAB1Yomoc1XPs19MYLDsa46avW/6c8anW/f8l4PLFk186KWL/eOsX6cdbv1j4nmf+q/cvHL9VoBoFPnGa0253sCbH91Wha0of29bTiXMYsAVtIeEkpLS2BFL25WbcfLF4vuSv5Avo2Jy3tL5N1Yb8XeU6GkHM95JfOivS+e4u1sI7y5eyQY3wnuaPSMh4b+kq/nflpby7+QMslqv8dbwluogPtn7K3nSaV9bP5YP+Vbw3+QkTcRcpBcNNmBhPmZtVTI+1ac1Mgmpx5Fi7j409ctDSahs233WY1asXO03FIgvNu+OsWltF+i6oVFI5Lcdi4XbyLoJqrUyeZgjhdJX8wMcK8D2Bsj55pl0gJjwwrkXieS747BHDlHJ4HxQnretKeXQaCVmaULIeJk/J8wyUwSgfo7UzZtWGdncWhCIK6xwfb7BnzwSh55MmXZeEWFfd0dogpNNF1FogpEcSZ4Ql0BqU9KjWI44dGmP3U0c5b9MGjo0foVQaAOOqGKHno1PjsKcGIuEReZY4zjDW+cFLodDSIvJi/mjAJkV7XuP7ITY3KEOR2QvILZ7oaei68a78IoZsiY/59zFJlyWiirWGkvX4vPcoR5ljiajyP7IreWV+Bt/xnupLF71Qr+ezPMpxOoTSXfOF40/LVzIqq3yofTtjplk4QSlGbZl/aN/PITPDUlHlb6ov5sZoIzfHW/vvvS48nf/VupODepb1YoBgAeNECME6NUzLJIzTZoWoEqDYradYqmp4GeS+deS1wiUkS1MILXmakGbu+TeFAsZqUWOHPk6vVmytmYdBAGvUIL2KsyMKalBO/1UV2Ok8MzRbhtnpKrVKCa1juskc1ggmjx1GSINUCqXKDC9ZyvJVy7jhjBejW00O7p1k7Lhb7Fo24RFzhPf6m/iaeoJpuiyWVQJ8PARtk5DajFWizIvEGoQQRJ7vNpHcVeassS6olKLPvE7TBIFlwrTZkY3zensq/8pWKjLgd+x6Nqf7GfoVhQb3ekSWyayhkccskVXeEl7EQ8lB5roNSsBjYj+/Uz+Fl+SruT/dx3I5wGXVFXy3+wRB5tbV85+OoRDavpJTeC+n9D/le+nr3A8ZcIBfPxbIJM1PhOe87n39/1L6Griz+K8YL2TJc/5gAa/god4PC4kRKf9W/DR6zOPl0Zmc76+gKgMmam1uat3PiCzz+uh8lqoasc15ODvIP7UfJimqL1+rv57bk12c5y3jNG+UT7XvY3PhPiYRLBJl1qohLghW8MG5n2KspUnCHfEubojO4uH0IF2bMW27/UuwUtaJhEcgFKvlAFO2Q7vH4C/+6IH0ACtVnaO6gcZyS/wMN5bP51xvKfvTabelFuVdbS1tk3JVsI5Pt++nYRMCFP/WfYKvDL6W07xRHsuPcl14OlUZ8q3mNhoF2eGYadAlo7fgSqnmA0Dj2sfjusmT+Rg3BufyT91HKeNzfel07sn2AbYgHjvjkN7Tt1iVSa1lji7LRI0/DDZxX36A40XlbFc+yfP8tdyd7GOKWVapAa4IVrM5OcAK5fSg/7pyLV81v2RU1vgdsZ5RyiTkbLMTfIunSYVLeD7pvZD7zGHOFCOsF4N8VW9nqxwrzsGtEaOqxjlqMX+R3EGHjFhqbtW7eaU6nZ+ZvVjhMNVCKJTUZFnOZeFqvpw+hu8F5F7O1zvb+MbA69mgRtiTT3N1aR13Z3vZZ2ewwvIzs5PX2fN4SXAa3863Ya1l6shR8kYb33PVLJ3EpHKa579oGS3Zpao63PGzO7ns6gspDYS0Jw2Dgz6Tx1uUSxV8L6QiB9BhgunGrqPVm+lW8d/0WVyol1FLI05ELT4XP8iIKPPaYCNLZJWkN6fjR4lNRlNqbvZexGaOcroeYq0c5GbzSx7WR8ArOmYClqkaZ7GID+i7SJUmtR1+pvfwCnUat9o9rnBXjJIMeUt4Hs8L17tny7T4TPtBlsgqbyydx7Asu2crPcyXOo844q4QfLn+ajanB1jnjXCat4hPNu/j/vxg/76B2wfLwueAmSk0KAwzpsuwLDO90IrcldIBl+RNmDbaWhROpnGtHCISXj8pUwhmTdxXXEn5FTgqvSMukpWgJkIlEaJrMz1uWmnO/I0YEJE3JEu+hxQZ2kzodtYl+/UH/A3jtwpU02bKDWzgktIK6iJkynb5avo4QyLi+uB0FosKCTlb8+N8M/kluXAYj091buQXcidn2eVsEKP8k7yPh729oOlnaktElQu8lbyj+R3aNqFlUr6XbOfG8Hy+m/xygRVqL1OxXB2s59Mdt/AIAV/vbuUbAzdyllrK0/o4V/sbuDvdw958ivpwiVtaO3iNdw4viU7hO/qXKOVz1gUhv3z4CYaGq+x5ZhqrBavWD7BqpddnOj5x7z2sWpPx5MP3kR8bRlQU7XiWq1+4CbG8AkWA55hcFiENonC9MsZhUsk0ZBlCeq6FXWzEVhus74HUOPBlgJUKU+AipQSMLcwOHAkoz3OXCEhZYCIkwiqU8Am8EJ2BkoFTIsihmcwyWI7wfIGQVazKGKgNcOdPnqU9PgfDNQdHkKogeUnSNMH3fcCSJiCVQQq/gF7EbpJLQVSqcM8tjzNYDjn9rOU05hpkmSazEptZ8CRWJ5RUjZFoiMATpL4mtzmWrHhYqmANVlmH8bKObGaMRWqBkQHaaELlYbUlUgF9W1mgKkIuM6v4gH8nUzJGIJmggxWWE6KLQCDxOUGXO9RenqfXgAVfhggED3CICRUj8ehqc1LMMCAirgjW8uHG7f32y3HTxEMijOEILSxwzLS4JXmWFwUbIIYOGRLBbcku9uczjIgSqZ2vAsdoKvjUREjHZtQJUEiENXQKOZCS8JkzqZNnKzQd8yzjcXmUG6Kz2J2fILY5rws3YqylLAOEFGzLj/Gm6Hw25wcZJ+bF/gYWycq8XAlOmcNJu2VIz4AnManGGPeMNaanSEdHGRqo0+52KNVLlOslfA98H7rNDieO7GHs0F4WL1vOqrXrWdupUl27jq/iJLK+pZ7llfZU/lJdSQWfaWK+JXfwbfssr+IM3izO4aBo8JgY53KznCTLXMLmu/PMbeKgO7bAIJdx7WUpMVrzd427eG/1Cv6u/jIyNHfEu/ha57H+/XtP5QoWqyofbtwOwGK/xvuqV1GXEQ0Tc1eyh291tvXdWA4yy980bucPKpfyu6WzmTIdvtF5nFvj+YT//y8Cy2/Czv9/Pd5cvogBGXFT+36mTAdblnRNQkl6/L/tezhsZlkm63ykei1vLF3AzfFj/fbpy8LT+XDrDvboEwQLsuhFssKs7VIVIS2T8HTu/GklgifyMd6mLmbOJtSEw2nP2rjfjQtQrPeG+T8DL6drM57IjnF3Mk9JD4QLGPPCY2iNGqImQsZN00GgMHh4mKI92tu0R0SFdXKosFB2GcHZ3hJO6BYX+Ss4rhu8vXwxZ/qLmbMxDyYHF1R9i8Cu2IO11g7rbwyf7TzIO6OL+VztenIM9+UH+KnZ08cfvtU/n0WyzD8km7HGslzVeVt0PjUR0rQJ92cH+GGyA4MLHH+in6GExwfLV1OtBDRNwtb0CD9PdjJh2iRC88n4YZCSwEg+J7ZwzDYZpcSfR5fzCruO7yROU5iK5QViFZ/Ot3BENN06WlxonecYbVghyrRtytFkBuW5PeqgmWPUrxBaRdfkrjItXDvaD4oOg/SJVJmqr6gUx1ypBiEVrshi6UOMHIkMNngjhH5AmuRc+rxrCaIujz76CAPDSwlElTM3DXLmmSWOz3YZDEIW7xjn4NFprr5oJYuiDq2kQdztkDVmEdogAkOU1MlkQqVW6d+rt6cXMmhLfNR/gIm0Qz1VGDQlAj7e/QWH9DRLZJ2PlK/ljeF5fC3ZSq5TrLVcxQo+lTzMATODh+wVL12xOs8ZjQPa5ZSjySzKc7yFvfkMo14ZlVjiBYHd+0tXMiJKfKp1H8/qSQZEBMIFjDe3t/B0PkFJBHyk/mJuLJ3P17pbEdYVuK4K1/GR1p3sTMfds9WLf4sqbYhCW4fj7/1jYnN8IVFCFknVghYIC/Dl/UlNcSyPHMOPuk8xZ2KGZImKCNAYZk0sZm33Vwqqo7IahMKTB/VMbLB2iawFK1Q9PKhnY4CqCNWILPtH9VySoM2AiLwVqh4e0DPdhcHsbzt+q0D1bfIchlWZj2cPcjxrsJgSQgpCqfh8/CjH7JwTlo2u5HeDM/l+/sv+9XmhPoOPmZ9zxJvC0x7dxH2qkK5auJZhWjZxGWUhLL3XnGCpqlHBpyt0nyAjLM5JhHkcosX2Wbwb1DBPm+P9mxCVQirlEq2Gmzzr1TDVSgljYOOVZ3Lh889k4lCXsal7CSOfa2+4gsFlc/DX7hDXvOFMatWI1ncfZ3BRnXNecAozjVmkF9BNDKr4Up5SpGkCBkye4XmuYmikJjUa5VlSnSBtQDdLCZQiDCSdvIOxKUInKCPxQ4XJXQvQwU5NgYeSRFFEmqakeezO3QqsiZEKup0uYSIdvMKzeJ4l9CWl6ihZ6swDGpMZs3Mz1CoJ+/dNEpUD0m6KNRav7BXtI4GvHETBgiNapXHRPnDEI61zUBrfD2i129x6y2bi9tUsWTLA4hUjzHUSEuEqdrnQiECRosnjHCk9jLCkRpPnFiGd/atUFl8adJ5jhUV6HsJT2FyAlX2ile6B860rT/XwkGOi2YPK9efGOXqU383OYJmt4SMRCJokhLHntA0DmBYxWltMcVy5oMK1RDkR5BOm9StFsDO8xbwnupKVcgBfOPmPWeMITdM42ZnUZKwQNeZIKOP1mydtchJSfKGoigAfRVw4htSEq9glQhcKEbpoGzoFg3/pPM6byufz0fp1SAQ/iZ/hIlbSJEN4Hvfrg9TjkPeULqcuI7bmR3lKj9MiKap3DkMdBgFBFGBIyXVOnjoct1CCbtyh1W5SHRyiXKuCglJ5ECEU5VAxsliweHXOifFJJo8eYXp6kpVr1rGqvqF/jXJl+QG7+Z7dPY8VNfCsneFu60wmREF4+iHPIKxBSfh/zF1YZRHaSaT1XX+Ke9vDAc/ZmI827+5/nhb2pE7DZzoPurlQVCgfMYd5pHnEARx6N1NRBBPujU/aCT7RupejtkmOI+cs3B90pVcSLXB7AmTTBUOmOh8A9HD6C8ulvW6Tk82zhWC+cyXTRtPVKYnQeIHHu4Z/gqcEG9aO0pprY1C04oQlSxdz9YvOplRx2spp7gToBS7RPLR3kmd3TnDhpg0M1cvcfftTCKN4+Ssuplx1hBpjdKE7LeDdLtG7KFjJ/4zuZrrlArqZIGam3eR43tPbgaNmjp8kO7g2OJWb4+I8LfwsfZY92jnTpYW6A0BFBuzOpzhbeHRs1neR0+TMWYclDISiaVOqIsDaeX2c+9J9fD9+khOmzRJZ5d2Vy/mjyuX8aeMnLkln3u5xQER8qH4NP4qfdi3lQsZuSFWZwlX4DfBIeohrwlPYnB6ga3PeV70CYy0JmgNmhgDF2f5S/rH9EH/bupN1api/q1/HAT3NPeleHOzMInquXIXhAcIRrj7VeQDP94vkqkeacfvbV/RWeiojAthmjrAtP9qfD65S54xCpHSk0W8n2/lOup3ZpI0SgpVqgBOmXZAOLRu/Gt8AACAASURBVEezGQSWY8VzIYTkhMi4M9vLVd4afug93Zuq3Jsf4JCZwlpB12j33Ckn5aiTjHKg6NrMuToKgdaGdkEWLVlFl4wec0AXVdgn5BgvU6ewK5kiyw2v88915EThgRA8og/zh+El3JnuYb+e4vroLEZFlWOiSRJnCKE4sO8Qx8cOIcs+zc4M+lCH615zFTkzBF5Aachj1UrNY3vGOTyxguH6MLn2GBvb69aLAOamTyCFhxXQTUeA+eLF+7Kf0sozqiqgXRXMzTU5bhtunxOCMdPk1vQZXuSfgo0fpycXfE+2n/16ynVyZc/cnD6XoeL5dG2O5zl+g9GGrufmb1V6xAUbf0BEPD9Yxx/P/JC2TRkUEeO25WB1VlMhQAjBmG1ya7yTF4UboAsV4SOAn8Y72Zs7KEuKdh1XYJmoUlKKTcFKbojO5j2Nf6cuInwrGJZlPjbwMt4y+10mTQshJStslSYZEYq3li9ikarwkdZdLKHMDaWzeX6wnm92t/FQeoD1apgvDL2Kz7cf5N5kHxu9Zbxv4Erxj+2H0juT3b0I/BmALw6+6rzPtx/cf1jPzrrlVAZfGXrduR+c+9nhLdnh1gdrL1w/bTpzn2jddxjcmv1P9Vefe0+yZ+afOo8cd+ui3cRvOX5joFoVIZf5q/ir7u0czeYQEsZpgRaMmVb/gRgzLW5PdvO8YB3krvEPcLd8lqP+FEoWuEcPJxVVoOlD49OxmbO4M25BaBWVpYoMiOk6mSHm0fePZId4XXgeO/UEMZq3RpsckF2EgOCR9CB/WL6crf4Jdswe54boNEZFheNZw7nMAHsPHmHR4lHuvO2XnHXuUqKwzF23PcZr/uD8+YvjVwiDKte+4iK+f9PjbLxiLSODg3TiDOl3UNYjNymZBBtopAgIpQ8mcQz2sAzasZAlktRklGslTNYlzbv4UQkpy3iej8jLlMsRJoMszfGVApP2q6me5zmmZZ45HJLO8VRAojtkzFEdiTAmoJ1kTDe6NCfbxI0xZk7MkXYUjbkGOlMopWk3Y8o1nzztVQgSlJJIafD8+Y3V6BzXlc2dj31mHVlEWvxIUo0kcWa57c6tRBFcetXZDC0dQgUVEqvpmoRW1sZLMgJl0bkg187QAOsjrXEV1cwienRbAYIEMgE2d7iu2H2fPMsLdq2bCD085KgpcUw2AeGqsUbw3/VlfFs9xUP6MFYKrmEd15r1hCoiUA6W4IJTwUkN42IfHtdubi+VNY6aVh/4XsbnXZXL+Er3MX6e7CJFc314Jq8Oz3ZEgqINM2m7HLYNfCEZERFxIVZvscxZVyV5T/UKfKlQ2jlfnS+HGdNNEl9jUtNvNRqjwRq6GL7c2dLHt62Udd5avoin0+OYAp/542wHt2Y7CaMIk+d8qvQ7/Cjd0Yv0sNYQJ7FLppSHTnJ85aGlxlpJlqbMNRqUBwapRBUS46r4fuCRCEWagM0N9SWLKdeqjO87zL4dO2hMzmPhk9TQY4IvhCD0L24PANkjUBYMYqMLGEixIfbJO+CYxKaHp/1Nw/YxaA7/efLtFf3vYJ+L9ije40iLCsEQEREef++/jIfsEX7MToztQZ0KDKNxn+Gj+F3vTC6Uyyjhs8tM8s18O9N0+wd/gVzHtcEGBkTEhG3zPfMkz5rJfofunUNXw9oy1UtHOTY2yUyjy3SzQxiEiGyUsiijTJcoUlhlybUiCEL0qOTE8ZTlwyuRZGA9gsAjCiJIDTK3SFJsbvrn3Ev0xmn11f+kVAghOV8u402lC1ilBvGF6rcEF9xFxov13/au54KRWU3XZpSF37/wofBYIx3edIQSsch/Bf12UM/21/9x0+Iz7c18Y+gNLBU1jtg5DA4POyxKfLR+HY+nR/lGdysrZH1+vjxH5fFL7Ud4e+Vibhq4AYHgB90nudRfzZxx5J+OzTih2/xH1wV4u/NJ7k72cHmwhl+k+9yc6EnbQR/S5gorjrLlzGkW6PzYk+e6wys6q4D+iiOc5ar7cZ7j4Q5eEMGK//eUMaSQVCplhISzWcwrxKksFVW8ok7cJCWMysVRBNMywWqXWSkhEGpe4DYIA1LpOjju/Nzvy0VY0LU5PRk/o13CbIsO5hvD8/hI+Hwkgp9mOzk/WEbbplgMd6d7GSbiA+UXMiBCHswPsk0fo2kTsA4K+OxT99FtlSkrgcg6yJrHQH0lWtYZqWWEnuK0tfDUngPsfvZRrBb4NqJeLTN7YhKkxlNDBAMWbSOe3vGEm1fFnM58QUWVnKVtmtFSinNZzOvDjaySA3i9OV3o2fb4L9Oi27do17npd++kVPi+R2xyysJz0EbrUqaydXO8Y7P++tQrdBzVc1gsA6rMClEDBKu9QV4fnccSVXU8lV67XULNBhjc/mMXPBqLhDuvCdPmmGmwygxSFgFWCqZVQhonRMWz5lsBPctgoIbPOB0+0XmAPyhfzE216/GF5PvxU1zKKro2w1hL22ZM6jY/ip8mRHHMzHFPsie/IljjLQhU+3NrYYW2p8J5mreovCU73Dr5X+fHOm+k/Gt+/RvHbwxUezf+uG4iVW/jAbCcK5fwquAslss6nnB+63M2KTCaFnIYt01yQ8Hind96tHE4zlgYt5gVJW+DpVpgwdomLeLZXnXCnfoXOw/xB+VLuan6SrfwpE9yKauZszECuCPdzSK/znvFJdTCgK3mGE/bCWKbU058OkFOc2Ka/bvGEKZJK46hFDG62uOhR3dwOZcA8NCjuxBxTKk2SmVxwgP3PokcKKPDDr6uMjTgE5UCrLQgFZ1Ok1KlWgSWCtlN8ZWk0+rQ7MTghUATkXdZt3Ipc802SgaUywpSS3OuhRIKYT2yDIR0lSVjDM1mE9/zMNqgLASeh/AVpXKNpK2YOJgzNd5i7Og001NNvFQhpEZ5AqElFavIpbOkHKhXsbKNyQQ9gf/AD+nZ1eY6RSkPazwQubtvRuB7AyR5m9x08FWAziQ6cg+zUIJtjz1FZaDEuRtfgNEe9XCQqeMNDuw7QhgFUEAaIk8ircKqpKgiCNACJT2scHa7QoJUBVQCF6gr6TREe+5kLZvwEId4W34hX5SPMGZaLBcD1E2ILyTaCpQKWGqrvMCsdRNPCiReoYMpkVKd3CEpNrk5G/NAeoDXlc+j0YnZaaZZLusspYKHpGUSMjSr5QDXh2cseKDmA2kfySLKNG1KVhxYWvCsZNy0eCI9yruiS/l622EtX1vayG3pLmxo+9ULZ1npnrlRWSa1mlkbs1zW+aPK5fwi2cuxfA4roITPsIwYo0MNn1cF59GxGfdmB+gRk1wlEzrNFspXhSqC7FcajLF0Oy3yNCZQimbcIbWKdp6TmC5KQr1couQH+IMRl16+iomjR9m9Z14V25ocAUXV0FVO5wNWW1hUMh9Y2AUXvncjekGmhB8kO2jpFPPcCKT/gfY5gdL8cfu1rJOC5ZOX0P4r5YJl1+oUjIoqFstRmnw8uZ/3+pfS1F1uy3Zhje7jjtM4wWB5TXg+q2ydD7V+Tmxz3hZdxHu8S/hg6zashUv9VdxQOp2Pte/hsGnyomAD74ku4y+7tzGNw877tk69USF6RPPMsXF+fmw7+D5WGx59dDtXX3k5z7/kDAarYHSGTi1epJj2AkJPMVipIqXGUwbIGRqsE3gGkzqfS6MNeSFF1Uv0llPjREGwUsonUD4fqV7Ll7uPcltrJymaG4KzeE20cT6sFBRBV3G1F+6qxdzfp6epypClssaYabJYVFgia4zpJrvMFDURuHbor965/itje7JubsakNmeRV+HDlWt5KDnIVzpbKMuArNAFdn978v3t2IzPtB/ov14jB3mXvIztmeu+7cunOM1b1MtgTvouveqo1g5q8P3kKdoFMbSnymKtKa5DT53G9hOP/izvXx9x0rzvPxMLzt0uuJY9QpgnZHGOkOWOiPvu4CK+mz/DfeYwWlqukWu4Tq4nTTMHD/OcQk/oBxidE6cZCAWeKxoZbTkgZqj4AUM65IRxlsKrvAEmTItmz3ra9q4/CCuIpeHm9HFE5q70clHjTeJ8duUnXIBnNd9Nt/PddDsg8JD8S+11fCt9AmMtWa4RXoTwO2TGQuYjteWWf78Lr2SpV0p0TMiVF23keafDYzt3MLSkDN0cqX2q9SpJDpYUm3iEqkRYHmOK+Tm9hCpjeQvPQtLtYvKUD1VfyFfjx/h5upMEzfXBmbwmPBeBg7eBwArH/cBqkjhFFIlEmqRYBYeYpSwCBjKfsaJ6ulLWmDAtGlm3bzXcK3QsVwMc1rNM6jZCSjwEn6newL93n+Z7zado25QbSmfx6vBsPCuJhIctih29IRBOOm3BfNidT1KVAQNemRPCkUrXqiEmis9d+Dg2SUmtJhOam9oPgoB1YgApFe8UF/N0Po4Rln35FKd6rjJtFnz2r+vTb8uOzr22tHHp9ux4u21T/c7ypSuMtZSF8y9+JD009/byppU/93ZNPZNPdF9b2rhoWJaDcdP6jS5Uv278xkC1d+NX+IMcNY2+PJCy8GelK/lO9iT35QfJMLwkOI2XivV9LTeYr4A4vb15nXOrASnZb2eoipClos6YnEPkgg1qhDHTpCPyBWtH0W+zlg4Zn+480N+b1sgh3hVdxvb8WH9xuS3ZyV35foRQ+FLyifAl/FjvwpMl6sDz2y8mTps89ZIOM8f2MDm+n4H6IqYm51teiZ7EdEImO5MMrh4mz+dIx2JkWZEETZKWJQgibJLQ6cR0bYZMFM2WoFq2GAMDgyVymSNjQ5IYPM8nthmThyexmU8kM7TwsHmNel3je6496HUS/JKilUE19MBUMLqNHAiR5KRIvCxHDoTs2L4X2hpRihz+UgsClaNsRuqFZKpDKUpYsWg5M1NN4o51kkQ1n9CTSGWIO5ok02QmYKiek8YSaStg2jRNjjGJI5H5IDQINCqSeORYZUFYFJrcWDKt8LIUT0lmZpqcmJwm9EDJEOnFaA2i0JQNI6fjKqVHFJbQ2hKFDislvARBGZ27DctoJ9ruefObyU3Zg7xRnsdf22uoEzJNl297z/IdnuVV+nTezNkcFA22ynEuM8vwlIMBoB3DXEnxa0KX4tjdzfxedAEfqF5DVTjf7X/uPsrnuw/zjvIm3ieuYH8+zZb0CFcGawAcRghHJlkqKrRImVnA6BQIFosynpL8a2cbbyifx8cHX05W6Kj+IHmSVZWlGGN4i9rIIlHm/5h7AcsqNcjbSxdTlw7fdm/i2qS9CllF+Ly/ejWjqkKO5Ql9nI/F92KkLTbF4ikqKphZlhOVQ6eooIXTU/QlnXaHpNMlLJcYrA9QGxlBFzjxzGjCcgXfD0gaHbIgQi5aTqXd5QvJegA2n6JZsmgpe/0MM9OmPNtFakO5FrBq1QrSxgzP7DnIdDtFSem6BfSk15xcnbUWP/LxPEWr2eal3QFkgSG4Z8ZZu4YoXh6dybn+cuoyZMp0+HLnUUZlhRtKZ7NIlJ3rUH6MbyVP9AkDn66+gnuzfZypFrNBDfPP3S08mB3mCwOv4n2NHzNp24yKKp+pX8+fNm4hM5ZD3RPcqndwfXQ2P413FDtBT4czxwonnfSV5LE+g/cH6VPcVL2eM4Kl7DKTXBau4SFzhCOyjbWWO7O9vCI8nef5q/lRugOdW/Yd3oM6KKlVBlhWH+L3Bi9jW2cvD8d7WTS4lmWLqoShZXZ2DmsDsiRHxQkTM1PMzjY5cOggKrAsXVZFoTl4+BBR6DzgPeV0Lxcmeo+nR3hTfg5fl1uZNh3WT5XwqOKjaBUJ1ho5yCujsxfMYeajqr401fx21jYpo7LClOmwLT3K75cv5rPtzSySFV5ZOoufxTvxkdT7Qep8oHaJv5Kt2VEaJmZElnl35QoO5jMcK6Rvlsoaf1a9mgeS/dzc2YInJIMictW6YhijTxJIH5FlTtguszZmhazxx+XL+EW6n7bUDIoKj+RHeJ08jzdUL+TOdC9r/WFeHJ7KN/V2lldH0HnOW5dezvhcQuZLrh+63Ekf2ZxARUShT6s1R55lReW0p+BginXFKTy4B1AhhEV6bt77vo/JNUmSYC1kWeb4DUKwueOSv7dVL2aQiK93trJfthm1IZ5xAeBc1qadt1ipBrimtKYPUegFTNZClmfOMMT04Fb0idDjeYMn8zHeGJzLl+ItVGXIDeEZ3J3tnQ9RFiaB1rKIEonJaJCyyh/kncEmHkoOMm5aTs1HBIzIMofNHIOixNvCi2jblDuSXS4OkGCFwpoMmfvkxIRehWo1J4lj0jgl70pq/kpOPdejZbpUqjUaM5qDBw4QlUqYzJDmc3jRMG09w5lnrGNq8zQtm7BFH+ON8my+6T3FpOmwyEZUpCzmdEKKZo0c5IbgrP6MNsIlCFobsjwtpKiKbhZF0o1mQrR5MhvjDeFGvtR9hKoIuT48k7vSvX0jFXCFjvuTfby7ejmfbW3muG2xWFYpCR8fxbTp0iZjtRrsFzqqBMRWM6/2/etCRDcm6LAtO8Y7gwv5RvtxBv0R3lA+n83J/pMUOCzz1fjFskpqNLPCkUrfUL6AO5LdHDENRilxZ7Kb15Q38srwLG5PdrNCDvCCcIP3udbmXwkuP9W6//CfVK9c+bnB3z1TIPhx9+mxC4MVg3M2zgH+I356akSW/b+qvXB9VQTe1uzIzI58vNH6NWYBv834jYFqyyY8mh/l97yNfDHewkTeYrlXx5cePpKWzUiMZTk1rmF10fIz+J0QfPA8Qzlw+qnGFkY8XZAKsIbZIOPx7ChvjzZxU3ofFRHx2nAjP02fKSoibix8VhbLGhmaadthlRzgz8pXc3uys+/QUBE+q9UgY6JLzXq83juXjs34RXqAXFhEDp3DOcqvcfZTo2RiMUf9Ec6bOIyy862RV4wNMh6nrF0UopKUmWyYRCrmopRzKiOMzTWYSnNatSqLB1YQHZ4kO73OdNUnyBIIfQIVUg0l9TBkFohbHUwKtQGf2VlF5s1RwmNYlLju/BJpGJA0DVnZR5RKTExO0z08ifAVaaWG8CRrA0mtNMCM32U2jhmQFco6ZsxoVO7Rbcww282Rpsqc1iwxFZphhWYek1cyUCWM9YiCAK1TYh90CLpjaJVbVFWIDALadFAiZdAXpJnHLJaSFpTx6QoLvsHaAEyMEVVCz+BbEL4gyZzpAUgqVYknAE3h6mUJwxJDUYlqpcbcXAuNJTcJWmi6uSLLLcKkRL7pdWnRWiKFJknnW2wdk/EN72lu8Q4QyUJCRsBBGjziHT+pgHa73Y8qcM3/O3xwQYPt148uOV+Kt/CleAsAVgpsYWx+W7KThfvzP3fd33Rtzu/Nffc/PabGcNy2KMQv+OvWHf1KtpOB6VVQLV/X2xdUXQSPZ0fZmhWOc78mup6yHf68cavbAAMfbS0o4XBcuKqQxoLutbQEuQYrLVFYwg8FrWabJE3pJglhpYTNU+ampgjKFWpRBV/6xK2Yru04HV7p0U40A8tXwQHHKD62dy82SVmxZhXB4lEOrrUMG5+hrkR4irgTozOLsgK0dhtprsE66bA+S3rO4Cnl6gt5DlL2cYIwTwT6u/ZdDtMoKnjSYzis8TX5JEdoM5j7/Il/Ma9SG/mBcWQvIQTXBKfwmfwRDmZzRL6i7LmgyfcUSivWyp7rUMPVwITkkJlxEi94xAuo+VapPmYeAOmc3rwCV7bOG2KPnnHmG7boLvU8xxGsUcN9nGJteJhus8nEzARBI2R00SiXVc7GZpKd7SaHjs+wdt0KKpUqcbeLDC1+UMITEZWozNJFiyjXLCtGhzC5wogcbI41bbS2aCHJrOjrMn64cTsDskRZOCT3Ud1g2nR448y3qIuIdQwRm5w/n7uFuogw2k34v278nEnTRi801CDn3bM/ZH8+jQvjBX/TuJ1hWWJQRJwwbf5i7lZmjXOdO6xnGZUVRkWFY6bBUT1HbDPqImRQRWgsn2tvpmmTIsmwdGzK/2zchrGWFWqg/9mJzcmLROQd4UUsDkp8vv0gAMtknT8pP4+6CGnalM36IN/p/LLf1p2iy9937uPN0QXcGGxkTiT82OxhqzqBJz0kllDlCNtF+TW6SRsTd7FG0ZFtgtAnCoNCbsy53QmnW4j0nSJMuaLwA59yqeS6BcIRWLXOmZudQxuNRTr5PSlPClG+2H6EN0fn8/7q1VREwKRp88+dLXyl8xg3ljbyTnERe/U0m9MDvCDYgADyXGMDZ9ubpilYp6Rhimq67rm2Wcs/Jo/y9vBCPlu9ntwa7s33c0shbwSCd0QXMSLL/H33fqQSLKfK2yubioQ55UFziNu7jnhoraCEz4fK17BE1sis5tHsMH/RupVcWExuXNcwzZ3ovJJksaUSVRkdGSTuNvCUz8DyUdpzk0xNjVEpS7J4hizxGKwvBpHTnD2B1gIT5VTDGjKe37e/0HyIN1TO57+ziQoBk1GbT8cP8IXkId4RXcz7SleyS5/gnnQvLw1PKzpNBQyp4Ab0ukC9gpuQEmMsQsDnug/x+6VNfK72SnJr+EW2j1vSZ1yRzFiGZQlPSD7Zup+3ljfxsfp11GTEtOnwr+2tfLWzhdeWNvL2yiZ25ZPck+zjpeGpVAmYsj3G/n8epArc3Pp4+xf8Zfn5fGLgFU7WM97F95OnqBMgLLy3cgWr5QD/q3UnAlirBnl31fEXOjbljmQ334i3gbFIVWbGdPlI43beWbmEP6hcwpyJ+UZna3pPuvdXgsumTfRHm3cf7L0+zVsUvVVsWrU1PdIXU/1qZ8vYVztbxgB8pPjW8JvO/V53+29rynvS+K3IVP/YfpjXRufw16XnUxMBk6bDV9LHuTnZxo3BOfx+cCH7zAwP6SNc7a3F80KsBus5SaMsdQ5OztXB3YAgCcn9DkIo/j6+j/dGl/MvpRvJrOH2bBffT+cZl+8rXcliWeVvOreDEKxVQ7ynfAUDokTDxtyR7uIbna2u4ApURcSfRFcyKivkGJ7Qx/lo9z4y8n5lqdGaReUgZn3CUkh+6ikMHupi9LzMVzhWZh0Bp/hVRrIW9491WDNSZrA7wMx0g/U24ZLlFboiYPrIFPp4h9GRZSSeoZIFHJmwiErGaQwyO9MgXl1haE6w4USHOIs5VgrwRjTlEznepCYIu4yM+hzOBHJpHamaXMswJ4hpri/BXI1hvwUHJY0TKavPC2FwGLHtGPmAZmggpGMy1kwO01AwLuZY3MlZ74/w7U6DwbzLeV4Faw37B2H9oI/YrxkPNU+hOXVJiTDu8IjwiXx4XtXnyKzgaTNN3YcXy2UcwzKmDL5uM+oFtLuaTrSYmk4xJUkqK0gNgfRIiJFKocnwVAWtLcqvUi55bk5k0G7F6MxpDXoiRAlLnmkiqTBCYo2H50sC3yPwQywZo0sqbLvfBR2B7zPslwmlT0/kvzdMr4LY+0W/q3xyxgm9RPi5i4MtWPcgPeUOuCA6FeCqmQve1teffE6V6T8bC79vL9DRumf/6joRplcKtf/JG0/6ZeHI1TtTIXA2oAKEwJcBRtoCq2jRmcGYHJs7FzRfeeQ2Je60sYMD5GmKzjKyLKZ5Yhw/LJHlGWGlTKPTptWNyLoZXjQvfzS4cjlxZw4zU0WV61xYXYI322WynXFMzzF5dJx2p41RCq0zZyXpKZfYWNXv5Avcxqp1QUQyxmlIMk8E+tvGHUzZDgLBrEoplRTPeHNkxsGLTsiUX9jDXCFX8B9qX3FbBPfZIxyWXUIvQiqBV7R6/LBERUmGbI2YnFKphLAWz0JcVFdKeH2FBsBBKIzlifw41wdnsi+eQUvBa7xzHHZeOmWHX9pxXq/O5kF9iEPM8nxvAyOizLiYF8r2o4AwGsYr+bTmGhybPMZgNsQlg6eytjnFkW0HuU3EnLJmOSP1KrnuULEBKYLE5u57pZDGBqRFiryYRwohFUZbtJkPsrUHMyZmptfmdd4eJFb/inD5wtf79a/X5/7C4Kt46/S3OWoaCJwT1DHzn+ttjS0QCc/QJ73ujWDBNjVuWn1sbG889ym7OdlKNZtPaJ7Kx3igdRgppbOZzlKssP1nQgjYkZ/gQ+07CUulfrWxl3fkuWaik6KCEJtl2CR25i7CoslJU42QFuEpBqtDhGFUOAICBbQqzzVZrJnpdMjzFIsuJAALSJDyybKcMHQJ00JHvdjmfL+7ne93tzO9gHi2U5zg7nwfUjgIk1SSW7L9fTjB+7s/xxTWie556jn54QIynBb6rO7yyQXQCOgVhtx68pXuFpcXC4HO/y917x0k2Xbf931OuqHTpJ3Z9Hb35QjggQgkAOYgRkmgTZuGYFOgSq6iSyhbsspW2X/QlmyrbJbLLrmKUilRpEQSBCWQNAgaNAnKIAiCINILIF5++97bvDuzM9PT0903nOQ/zu2e2QeIfKKsMnSqNkx3z723bzjnF74h8kS8zlPuY3jvUUqjtWLQpfyZERzKhr/afiy5VhGS4k0/sqoznNeEqJIDYpYR2xatFCaDk6c2iKFHDBqJRqoxJ7dG3HXXOsNByS9/+F9ye9uxubVKMgHKqGYVZ07dw/ve916e+kiyBK6F5efmn+fnokjdGgk7dsJzcpvfbJ8/staO8KHmSZKWZOC/mHyUGNM9IbviwQJDvFDhkVIypeX/qD/LspLWdYIEAhcdex2W24vAP5p9jn80+1wqcgBCRIKNfKT6SkdSTpv4UPXk8tx/YHxnoSNyxNtRSAKB3AnmwvIPZ5/jtqiYuwYjJJtq0B2T4Kfnn+UuBosD5PPuGp8//AgAdzPiKtNkCBQ9s2hZFSXP2Jv85wcf5axMmqx7Yf61zO05p1ayJvq4Hab2PrVR/FeDb7/795pXdi/63RpgKHJ1Ug7My363Xpc9/cH+u89W0fpfr565/bW29yeNNxSoxlzyz+Oz/PP2uWVpUyh4NR7yaXuVBXECIv+nS+2K6BX/ZfiN1MJTI3TsmLRCQAG+1ui6xwGWSMvfrn+nw+MBS4PUHwAAIABJREFUHTt2sXD/3eYP0uRBmlw+767w+ckvd3uMy39lV3rbjjP+xvTjLGbdyGKxZgkjmM2StaFyLc10Qs8a9kcZ05vNUpXwo9ef557Tig9/OfKwa9lbz/iOU6s8eXmf29rzaFly5fld9u0B/ccU+X0jtj/xModhRjXyPDAa0Qt9XtibMhZj/DWF26t5NcBrLuOevCYrT3Pp0h7V+cjGQPHsl27zgtecKV7jOzYGfOkVh3ugYXb3Gidf8ty4OmFWO/5wNuU9/QFnXoYq69N794j1mzs8ONM8+eSE1WGPt53rMXSC3ZnnLWWPb9k6wQsvHhJ95PFilXg18Puv7PFNj7yJHyn22LeGpgmczyMnVwvOzyuenQQevGeLu5opD/l1XppVfCa7zWMbG5yaCV65t8+On/Ct9TqhgM/s1UxjsmbNhOfkRsna6iau9VTzOXVTYWuBFBnCZNS2ouhn2NbhbKTICzINUkZMNqSpfecKEpjPK6Q03Lx2tGCWzqB0cuBKc0YyoZAd3lLIRF2IXTYMC9eidH+1LuB9cjCTUvExLi6xbiEkUpDQatErW1Z34XWwPLF47WjyujOaTKLLiXBw/NW0oUVAHWNnmHH0ZrqHlztd/CWObeEYvIYU5QmSxzhBIGRYslYDiRAhlIAASiq0NljbUs2r7ntCPZ9jXYPQhlxK8kGPIAJBBGQr6JUFUgS8EPho8OGoO9Rb36IJERzcvHaVKASlMTTXryHGLa1taYJFRt+RBiO+bYnBg0iQmdhVgLTJ0EsiHyDTlLUkAoVEOsi0pleUoAwP+A3+rLiX0/IYyURYjFZIAcLCgajJhOg0hO/ECfoQaVSkjCZpzQJYt7RcrYK9Ay27qDL+gn2a9+k387fK70YKwW/6l3krp5iEhhDg97nMiJyfMN/IUGR8yV/jGX+LaWzTXCcEJsvRMpGRnBA0hzPG4z1c23B2Y5MVP+cLn36RT772ClsnN5nbKXdd2GK6a5la2LUV+6HCO4FQERE8xGSoIVXiCfjjpJ8/weL033SsioK/OvhW3mbO0uL5rfoFfmb++X/lHt9bPMYPl4+xKkoCkRfdDj87+yIv+qP17R3mLn6i/y5OqxHX/YS/P/vsUaeB5Fe+0LxdjKXWd2u792FBphMkZREpVfdeJHYOjDEkAqkLCh8i3jdIpYhRIjXITr0h+ABC0tQNztrUvXAuCc0vW4PhWICcEjJiSnZ9OFILSPPA0RmKx+42k2XdoYeEL48kcp/3CQ9Ot7/uN5OES5ojQggJfwmpqBMCsYPZvH7Er5pnFq8HpFRkmcHZFudDsuzuxsmTG9DprkoAEdO56jajjWY6nXPr+jVWV89Qh4a2aXjTY4/zH/9HH+TVVy7TM2v0+wq8xXpHng8Bz4d/8VMo1TKvJwgRWFtf5cb2DTa2TvLww29bHkMiycplchu8R6ojtzqxIFIuO+zp+kipUuIQ0xmPpNfu+P7Lv449NfFo9rjzVB6duwWE4I65Px4VTeKxDS9qEssODbDjEw51S/bJkDgie6JiN1asxYINVdDimWEZYO64bOJoenvdoR3NeTfDlNNiwFm1QiRBF/bCkdvXlhxkBimuhQSNvF+dKP+zwbvOD0Wup7F1v9tc3P0Hsz9c2qIORC5/cvQ9923IfuZjiE/Z6wd//eBjL9S4P9Vk84YC1UTsOO6bHo8Fp92PHPFx46KU7tMNbHSBD91N7SUU4KwkRI2VLar73eOFI7moCsXlUr3c5yJgff09sYgR6BiUMR5/aGVy+BUChMRWkdhzZGiigl4TqUTO7mNr8HvpN37sf3ovp06f5cb1A3pyyPqZdfaa60yeu8RqdpoiK7n1yjVWMsPwwSH1gWJ++hCp9jl9ukftKg72cqQPrA8fIL9rjcsvXqY5cJwYBIocXrp6iLnnFFvfusnerOXVuIfbm3DmGzb5/CXH08MbvPWRIS19ns9uccVNub3vGLx9lepNq3zmKy8g1+7mxAXBtbli/PQhe8x45/2ay6+9xoHvc22v4tHNE3z06g6f2a548FSP3nMT6sZyUO0zfvl5vmG95OcvXuWCz7lnrcf4Wo/PNRXtdM6j+jT9quWXqov054Hvu7BK3wWu7AkevO8C72RGcXGb13Zv8tZ3PoL/5jfzxEtXee2JW5Q9x7yeMp/v08uGjFZKnBMQFD44cm1S6Z1AFC1WtOgsTxhaCdp04acwKBWIsQGKpd7k898+4KGth/Ao2mhRwEpZ0usZpi7QtB4c5MJBFOhc0VqHdZ4q5Owf1Ezqw+Q84wIqWD726SS11Lz3EQbf+RiPfs9bmP/mM8yv7+NdZFrXxLalrisqC3XjOJjsMR5PED4iAnilUWWP/fEBde0S7hL4Cd6BEvBdV9LE9dzjI4aDgvvuPs/qiQ0uXrrKtUuXaXzCSSkRGe/ucjg5wDbtstoTYky4MxZrUejgEZ4zZ8+yurbKlas3qNoGoRWhaQlti7NtV0USnaJEwPu0cIdukpYysf996+kNejRNw2w8IWpN0Ssw0jAeHyJ0oCx7jAZDTAZ8OXltn97aYCbBVnNEbtgZ77DSX2F0/gQ39U0GNww+5rQmOUdZb7v9pmdXdm5kwXu8bZFGJ2yxkEspugV2fksOmOpAr1cShCR4+KB4K/8ivsin41WcCHyPvMD3cjdaiWVCIJVM7m8+afdKKSEkq1aF4CqH9DCciCVjKrz3nJer7IQpc+wdlXSpUiLTkEgm2LQgn44D3q/fzDNuuyNHRH4jvMhviBfTMQT434rv59eaZ9O8JJMTTpuYlJT9AXmW4yZT6sMp11rPqc2TvLt3H1+4/BzPbT+FyHJ29/fxc0dpRuzsFeQrAW8zQhT42CK6KrUUEF4v4H08r1pMpIsv9sfD5O4YiiPZqOOKxP/N8LuoouUv7P8iI1HwP6/8AIex4Zerp19/GAB8vr3MJ5uXmcQGjeSHy8f4m6Pv5f37vwgkjOp/P/pe/s709/hU8wrflt/L3xx9L//p/r9YVlq/ls2y7MwjfBekLt5eBIXex9RZ6J6vuIgg6QKXtu2KHQpkJDc5vm06RRq6eyhS19VyLVwo1cQY0smPySI8CIGISQ1GxFRECSGghGA0GtIrS7RR8Myzd5wbAKlzhADX1qla2h3/6wObReAjpDgW+Aq00vyafY56qbfwurX8q8axgLmLwrTquh5Sg2s5frLzbLiUkDxa0GXCpYaIj4mnMlxdY7hSkp+4wD3r6/Q37+VnfvFzvPjCq4z3xrz3z34z99x9ApoJ0+kV9vfGHBzMKAcZVTMnCkXjaly0WAJPPPXU0XGGlEBDqmAeu9IcRZVdiXlB1usKG13duftoOje/7l+gEb5Ldr5GUN991+Pn/+id9Fo4Lj0iBLKbQBbugIuq7PI8v243UQt+oXqCF+MuNW752Uak4HRJ/tGSA9Esr8g1psuvenQdX/eDSJC0nTBbbvP1+98O0ztcqD7ZXjz45N7FP/qqk9GNG2FiP7D/y8/8q97/1x1vKFB19vXV36Psb/HzHT/CIvQkLv2CZacH6flI/ZWl44g81itdZBiJ7BGQQi2zyaN2JohO2moR3MLiNkw3i9IaGRUiJhLOQqhZykXlKdDvCZBJg02iwAnabMTNC+eX32ES72W6ZxDFKa7enHDj2ctcuvgVJrd3yTZ2ECbDNXN6eYG4CMobskEJfo6eWNrgWB2UONmgxoqsrdBxFUYZ7YpgVw9xD1SoXuTWrYbgNOfecTdFBN8boLYC7/imFnLPQJfYdcHmN9RUtkblil6xwdqPvoXDgwpfZ6zd/yi9M4ec9Z4TJzc4vDVGHM7oS0vpCw7qKQ9Jx70nTnL7Zo2ttrlLC7ZObPLq3HLv/VsMokCvbDIeT7i1O+Oh0wPmBJ547SYHwzP0ByWVbHhx2lAPLPv7V5jvHOKnNXWt2doaUV/6Mo+c2uTcN2wxm+0yqTcp+vewt2fYPbxB0VeEqJDWQkxMY5flS4es1qbATumkN0sUSFnSNpayXMG6o2fmzY+8CTUT7B/OIU/41Np7lCxxOER0aQlVCiMi3rVIrTGqZHu3oWpmbPY0uYooZRiMVgiffgWAcv0MJx9/jOoPLmF3q1SVMrCSaWQIBFbAw0svvkxsGh598H5WV1cQEmbTMV/40h/RU4pzd29SlCWuqcmF4OTJk/grqdXzrre/GZNriiLHedBE+v2SLBQpuImB/nCY7uWQZLVCd18T/dIQYIFr9Z39pVSSe+4+h2st86airitcV01y1mF9ajsG32LdohIgoAt4a2+ZT6dolRzXxrt71HXLyuYmMUTWttYZra5DlKkiZY5UR8yghxvvMZlVmEIjrGN+MMEPC0Z3bYAOjG/MsLVbVreSJ3p6ioPzS33ItLRItEo6lYuK0III9L7eW/kF8yy3wpw1V2KEQgvJHEdQgnNixHfG88s54nglWnQLhQ8h2RIufDQE7MQpz8YdflQ/xj+zT5KFkh8oH+Z32wQfCMcX57LAW8u6y6mlZRwrTsY+f9m8jd+zr3EjTBBSUqJZkz2ux0MGGH40exMVlk/ZVwgiYRsXRQGEol/2MFlGWF+nHu+zf2uPmzs32DyxxjtHD6PbizyrbzCuK6TLsDFybe8aPeUxuUGLDKOyFBwFiVZZgleIuCQbRSn54eIx3q7OMJAZe7Hml2ZPsCpLvrO4j5PymDPVPDlTRSL/bPQ+fqt9gcf1GR7qnKmuuoN0QhT0ZMZDcpO3Z3fxNyb/Fxt6gBCCTzQv8d7iMT7TXlp256ISeA2hcSgUIzQjeigEQ1myqfrcrzepcfxw8SiX/T4v+F3u0etc8WMu+X1+ZPBWPupfwDvLD+YP8/7sLXesWJ+915EPeogm4KLlxrUrHO4fIoUh4FNxBdlh2FPlUwI+pEDSRZ/0O4WGYCnzjCpYrPcJUtEljojE/PfBs5DwWehSL0qoQgmOunxd8BQCQkqsc/R6Jc67ZTL+C81T/Cd5kk387bMBowLj7csc7h+glcGFtE2poOwNUjW4238IAhE8EU+Wjzh55ixGSd63t8n2rW3KYT851cXUhaILbBMUvDtGoZAa6qrGu8i5ey5Q9vtUh3NuX7/M2Qfu5W1fSev0+H/4ToI2uGgpdGTeKMpCcvnadX7nX36ZGDPKvuP5F55lXs9xleD2jV1+d+f/YW8yQ5tADJabN5Nlqq0tkZrXrl1iZf0EVVUxnTcoUTKdNRjVIzT7fPELT91xvrTKCcoTvOBzK5cY9VuCFcQgaJsqPedBErxDKMhLiZkM+bb2btTCiSpI1rbOcv7uLT4wOcerD2gkjjxTSCnQBpTPMT3N7OCQ2a++jPOKHysfAeBD4jneH9P/f/bf89SNBFFDiGxIxd6tMWuf28W2gc1TJ3nuAUO/V7L5+WtM9g4o+gN+dz/FgttDwa/E11g1q2yZDDrzkxhT4iD2EmQmrPUXALBjCYgAfFdsTPfb35M/yH8bP8mV2W12fI1QgQtuCMBFMUmBNwLn2jdsc/pvc/yxgeriwv8SnXB3SosQJAYcPibyCovM8CiDFEqQ6Zy6ibz7PY9zMN7l+o1bzKqIMJo/H9+N0IJf6d+gF27SNtsoXZLJAh8krZ1idKrmBNLim1rAdA9iSD7wXVtYANY5st6AtZP38kOH91NkCmcDjbVEwLa2S3IidV0jlMBIR1kUVNMDrk8dn53d5MfYTN/7534LL1v6RcHe/BY5SSR5d1LTOxxTZutkmWIcD8lbSSg0eqLJ8Hg/IwjNLW4TdUFTTdCFIW81TWiRecawJ5hbqJqazd4QKw2zaUVQHhOTI5UmMnc1q3rILIeN4Qp121KPZyidkeUS21jsVxLOjzwQrGald4VMSubOoHuCQlhkb8BsusPtZp/c9KG3xXY149JehQiSQpxmuwhcm9WsDE+RjSyXtCcvClRxinMrK6ysGm5oRz3xjFZLjMvoxxorepStI57vk+1PeOTu+xg+vspg2GdtdZUXnr/E//3xj/PQgxvYME+CyUIlJQHXQkz4SYlkNBoyn00Y14L+MCPEGh8sShuIGSHYpYXk+toqtZ1jW0vbCmKwaFEznjfIqCg1KBmoKiiKFPx4H7lx4xaHO2PuvneNrTObRGFwQeCCOGq0vfsh9OoK+7efIzYW1QVOOgq8krgIWsCZe85RiUCL4rA19IY5xVAgoufu++7l7Lnz5JlGdQ5VxhgWjcrVtVGqdklB6zzlyipDLXFzi1u4ZaU+/hIHdXz6WZJ4Ukmle07SZ1UnWB1iZ+Dok5sOIdA4h3cOGTzOOVrnlr7kzqdWYqZNWkaLPsPBiBhssr0NkJsc2USk8AjpqfePWv+Xn3qW2XiMaxpEkdHLc8q+JvpAW1k2T5/m3IVzaGWw1rK3v0e/NwARGe/vc8lUvDy7wa39bc5UJZvzAkuL1jkmOwoQf37+BH+ufJS/pr+RHoZdVfFz9sv8U/80/4F+mL8YH+UVv89n41W+VZ3HurBUeQikIkRq7x1v0XXY3eD5xzzBX1SP87+YP4PVgU/bVxLGTSS48l8o38q67PFT1RcQRE7FAR8oHu9ch1o+7S7zK+0zXQIeyYTmg+adbIoj7Pz/OP8Ulk7XF9BCEI0meEFdBZz1CK0wK2usScX+zW1u7e2xsjLiAXGBgdzg2mCX61d3CMoxu3ZIe+DIBzlCaJQqiHiUFFgbCCG53y3GXyrfzqool85UK6pPFiGPmp+af5LL4YBTYsjf7P8Z3l8kZ6pFu/IH84f576a/zUW/SxYV5+UR014gOKdWmMeW27FKcndELscJm2pAgV66+AhARbHUDH1AbfDXBt9C0am7frx+nrrTrD2nVnnN79+xTl0KB5xXq0SfvN2V/uplTZk+5XALZxpUaNH6JiGmIAVvESh8lF3CIAhRJIxlV2RZkmqMZDBYJUZBfzSibB37e/tLeFAMMW0jJgc90T3bUgmETBJIRifdUqHkUj5qPp1T1RVZWRCUoprNSJZskOeD5fc4vPkywYMLLVlWEmWSAlPa0O8NyIo+EHHR452nne2jdE7d1AQRMHmG7nDrENI5C6n+2+D5rNhJMpTBo43GRM+729NU81Rl88El9zjncd6yvrnO6bNn4Cupm/LqzSsgcmwTmc3GVM5gRMtkus3N7YsYM8IcwMHeFGEEs9ntxAuRAi8k2UAhfMa1KzeIVc3hoUDqhvFkhlaD1GWSmqapGGQ92rZBOc10e8wC7vH75gbN3NLGFlMYBqMRofXE6Gltg5TJ2CDiESrDBY9GstPu8hvTOT9Y3kcUEhEFB/tjdnqGj+w/x8icxfo2dWN0jswEUvTJC0VpWp6ML/Ld3LO8VosgFeAv/doCQlAeuytPgjqZXjqA7/vi4vV706WP8LukQHXrcFGmsyw8lr8mEVikxF7E9CwQA86lWCLJi6Zg9WPxZSrhjip9d1RQj1ehvz7GG2v9+2QRKruWYxRJJkh0kpFRgAwRHyMyJtkMt2gpBkW6wyOEiK1nRCcIMceLwLuqjCcHLVpqbPBE3xKCRsjk9qKMTvvtBNOllCAFrnHIKDEmYWVCSMGylJp3jzdobIMxOUJlaARaRQSOw8kBuTHM5pbTp7YYFj1c9FShRorIUB+1xnqrkv7gBH7c0PT79HqS3Ru3GQ0ipx7JOTnKULLgYNdTWYNrG7yzWJuR9XLa9hA7953g9iEh07QuTT7VZAfp1miiQzaBMXOUEDSzFiE1hYSsHDGebYOAA10hvOTy3kXwGcYYegrG+y1t3aAKRTsLFLqPElOuTWrKQQ9f92hv1RgzJfoc7xpU1kvtGT8jxh55KXBB0s5r1jY26OvIXn0TDJSywEnBdG+OMALRg8wbaC1eCawyZCHiApTaEETDrHZ8NP88ymRsrA05vXUvO9f2OXluxuqJNWLYgmixPqC0IUaB875bFJJzleoPGZo5iDkSjZJDRIiYrCD4Hgult1gHBqMeJ+0KjQ+oaDFCsF9ZBqVGGUmMij4BpTKEgKayrJWRe996F6o3YL8qsHRQEa+WU8m13X3sq69RX75JuDGlN+wjtekcSVKtX4aEbxutbXKwd5tZZem5DXq9jDe/81tQWhFVgUVhZWpv22MtojkSQ2B3e5+q9WxfvcH+3gHFekmWl3jrcSRHmShSi3VJNupsRmUnidNFrqlVGXyCT3SvJ6yuQqBS58Hk6AyUSC7w5bIHQnJkiWkidKRtGaESVEAkzNOy3ciCLXs0bX7zqwrYWHzBY2PRmbmji8QpAFJF4AKGxzHACHgofcAc+7CFT5BIEw1HJJPj4xrwRV6947VP8MzyCH6S31y+fsdkvwpm1mI6MkSN5R/yB3dsp0CzEFX6pSq1G61MNs9fjNf4QnOlS9jVEe6sa+XtiDn/9fQTnQtRglItGMaQdITP33UB79J8VjU1jbVolVQbQp5hegMO98bsbt+m7PU5GwY8aja4deYsr+QT3vKms8Q4Zd6KTtljgHcR5wI2OlprkcbwMi8zEDnfaM7xk9PfXkIptuOUPAh2wozLIlVIb4QJv9E8x/dk9/Ozx4RqPt48z0W/i0DQiqN5U5Bwk4bkTAUd7loIqm6RLYRZBqpBgjdg2vRcvOR3+eDBRymF4VvMBfbiEVauQFPFO8lZs9hyFyvLjlyWF/A6/tbBzjaz+ZwQA1pCXc/SzR4iUUokikwqokiYVE2qSgXiEcZPdItdEBhdYNuKeTVHGNWRihKxKDNZR24ySCWw1nYW4AJtDFLKzpUsEd6CiwiliEKi8pwgBVEd3ZnWtcuVumlrimyAGGi+yA6tc9hYo/OcrChoqoq2cQQPuY+8s93sqsQS6S11XWOUw7kWozNMX/Kl3g6ESF7mnBxtMOj3EDKSZZpc5RxWLS8//xIPXF9BUmIbSa+vmE2nnDi5wbMnGk53x/rSi9do63kikHmNUg6hBLWuEJsZtw9v46dTYukI3hHNDG1kcsuSOV54vFXUbSArFbmv6ZWrHEz2mM53OTw8YDad0Ov1KfKC8XibrfNnOX3+FPzmRQD+vvwBOIrtl5bof+yYkCbC9a/x3nX4dt4OL/xxG8gg///e/vhfx1L5dgFfWm3JZE7bBN71jW/H9AW5hhf/6Cq3ZzUq9+iQkqgfN49z9ZWLfCi+jJAtf2/2XQC8T3wclML6wHj78ht2j/q3Od5QoLpoWYQEpFi2bJIUUKejJ5IrYXr2U8Ca2vdJqsXHVIGVMSC9wtEiYmTNghgovLBISmKUWGsxGbjoUErhnO/+PYIguBAoMoVU0FQOJRUqk9imRk3ntKLloNKoQmOyHKOGmCwn1zrhjWJkvDfhUI9pWkfwkeFoiNZHd7iJglgHDqoZUzunamZk6w2PPHqGBx87T3SgpEaJU7Qh4toGqWRHCLOUxSjpsnpBlp+jtQ3VrAEhqasBUSict0hSlSMzGSIIMmOYHhwyq6ackANch3nr9QzzNrWVyrLAzwyt1RT5CpWdgQiYLAnxO19SliIx6mNBW4NtI0b3mE0rnPfYWhB8TWn6KJMz9jUCS+OhcRYjSiocs2rGbHrI+toKshEYpVBGUxOwbc14OgXhsHlJPZ9Q1TWj4QouBA62BS898zRKBTbvepDZvIezU/I8RyGJNuBjYpwj0n6dtxhjWB2sMK+mBB/Ic4N3Eu8DKgvQ2TXuHHiyTNFbHeEOZty4PgGpESayf7DP+vqIE6c2OoKRorUBryLDwQqHc5juN7R2AgSC88QAZ7vrv//sE+gX+5iDREzav72PMYpepsgzRRTggodGYCQMez1a7wjVPvO5ISgDyjGd76F0TmYMzrcQ1TLYOZg4JuNdLl++zokyx115kfrKVSZ5gT51it7WZlrOnU91nY4kILpWcUR0+LuuyirSYu1DJw29CGJDgg5IKZCdXSJdkHuErTqGo4FOJqrDpkeQSrNw80rx75GbTYyO+VpOb/9Ppef87+zwRJKXTNdNEnIpe7QwK4kLodtFq7tLCpAiVemDWNqqVlWLKXNUplkdDRAhULWe1jny4SqrW6c5vHWLW1euInONEoZ1tcn9G4/wYDPmUfUg8lROfGSdxrqOWxNTVUV1up0i8ns/86k7CGmLhSDxEBQP6y3+SvEezsmVlKTQOVMdq7wcOVPdCWiLgJUx2QcLg1Jq2fouO/ecOrrlfRYBJ9PZXNiwAlTR8jvty/z0ynu5fjjhRjhMSgzC3LG/vsyocEtpt3C8ZNyN3Z3rxO0FPCx15xCCvdDyh+E6ILrjDKyQ8S5xaolRDJCk0RAEl9zyRqMee3sVSiocHqMNUikOQssX4y0UCX4W6qSR2jQLk4BI9K5TMVHY6ZT3hLMoFEpq9nf2iS4yyI/IYB+rnuf9w6T5+UmucP703bTB00iNR0BQRKmwWkFRIINDiiQP+FIwzG6PefxgiPaRYGtaL2i0Zv+b70blns3iBJkyKKWTK5PSJCZ8JNMaLT3vuO8Cn/nIJ3j0dmR3+zrVbEKx2mf67XczdrPlserhkHJtlSjT2qhlkiNsg+PqZIc4nYERyCJQVZ6oluCHZDwTFEHM8Fqzcde9xP0JK6MBz7/wLFjHYDTkcDrF1QG5JsmyPsONTUQ+Yu++AesX71SE+HoYe/cNeOZH7+s4MwIpUycxepkw44saQ3q3a+snCcFv+6mE5X72u06yGgasbA2pD2tm+7vMpp7p4Q67e7tYV+FjwO8EYhBUbeS1SydYO3+OFVlz8fknOWgdUqa5XEQwueb3BzuYqMAdCwVFwnOrr5+C6hsMVLsFUkrBglEMx/Ch3eIlpOw0yeiqOHJpPbkYCV8HsfPTDiFgnScfaLxNzhBSHYGbm6bBGL2UCpFS0jTtUrQ6+IgSC3C3IDifNBdFxEWL9BJb16ihQRaKvDdidrCPkhHrWhobEq5IgXOOU3dl8FLa18kzDhsOGG4qohwhsz4r6yUX7jlLiB5PktRxMVL0Ssr+kCh8Eo2Nqfq3piVGG5SGup1zusxSe9UFGlebiQhSAAAgAElEQVRhjEFJTaYz2taSGU10nrZdochLQgi0bYsLMVklxgjSk+WGZmZTwKcVh9Mx2qRqWWZ6xChoqzlCCPKsSMFNFDjnCN4TYqSt204EOglS59lZ2rohU4aqmlMfSqzzWJvh3BClNEIky8ZqVtFUlhgDzvUhKkK01NWIthoyGPRw3mEtBBS7e7d49oUX2JmUfNN73oYpDdO6Jgjo9XrsTsdoo4kmIktFE1tq1xKzFqXyZDQgIiIs5HXS9R/v3kKQgdJM5zPmNiJkRAedYBqvXGFuDS4svKx9shGMnno+T+cjeERMAs9pMkmjmmwT4wrBDbA+XZut02soFNOqhajJTMTohPsb5etIkZIxb9N9bn1D62E6q9gd72GtRym5rEDcuL7DZHIbiIyvvkqYXKXsz8jjjOmlKbf3dhmduwuhdKrwCNEROPyyoroE48dFENRhPf0iUUys27qaIaUky/KuyLd4ko/Q9sugtSuvLv3LY+xkcFIi2dQNRa/EmHQ/hxh59b4CJXtJHNs5IMFzFracQqruuQ5LMpfoAt6FUPrRfJOqnSkIT/VzqRT5+hD+ya/eOT2NCiASfeiqvYuAq+MKaEkUgrgQXYclLv44keTX2+eYKItTIGRKRLyzBGdTwHk8ST+2e9kFNMsR7zyv6fos6tXHMbKp0pX0udK5GTQO6QVR2KTDqSX9CHmUzKuWuq2RNqIDHO7tEYqSsckwTrDR79NenqN2PdkNwTA3CWt5ZkjvG+7BWkdtLbEjdiwJaaLPHinYUJ2l70/038XPtF/gE9VLNNHxQ/phfqR489F3XFALvsZY3EOvhj16ImM9luxSIaTkglpjJ8yohV1ehtARjVxHYjoerKb0UrIp+1z3Ey67MY/orYS1607lBbnKc+E2KQjoxO5fr/wYkzXvfqx5Qm2TlTkxepx3NJ30jxDdeiRqPi0bQFA1npEoeBdn0vaVJC8KdnZv0zY1OkW97NVjnh0ekPcKLBVOJN3NVjiyUcZqf0RRFsQQUVIwGPTJi5zDgzlXrk+464pFSYkSUGQZrbPQpbNTddSBmGWBV8Y3aF3CCitAhEUzJUkXBZJclhSSiTqkthXX6qtIqyhsWtwcHtoewaXvpBaIWilRJsfoDKkUpp9UOQZFTrNW8kdmH5MfonTJ1um70beuc/LkyeXxTaYtMQR0liGEQyiDlKkNLUSOD4GqbrDNjBDTM227AtQiqVNKMK8b5i00VnI4rdndG2OtpQ4JilZoxXw+ZTRaR+mMqmp54r0XOrhGujHa1rGy0eeTv/phnn/5aTJt8G2g8c2ir4SPAiMFLmr+8l/56xSDNZqq7siNSTEkLCQKFzrOMXUMCOHYHMqyu7WYf2OMoBKUBJ+ulxSiU5KQRBFQ8tiUFCOIgCCtYceHmbTcnm1T20B/ZZ0T50rOZTlNcxdtawmhTcop1lNXc+rWJ+7HeMyN+Q6bZ/qczkqiS1Cvhab2xN3AN47jT3MkLK3bv17GGwpUjdEcpyLEmHx/F5jUhSViImJ0No0iZZ+CoyAzEjt28tEksyBQaK2p5xbVLWbW2uRglOawJSNPiNTuF67bl4hIqWm7amaeF+iQiBcET3CplXMw3mO4PqIcrjGvG2hnCOkRXi0B8LYNvOXWUe3/Le+4iygENjSgIIoU4CWWtKJX5oQQaNoG31YIo3G+xbUpgKzaKomZy0QU8CGA80yrOdZatNe0MlAUEotDa81s3iYShUj4WikFWit821DNZihTpJusaZm7ikk9I88ynPdEm/AzLiQcppRpwW+bZI1X5BktNcJ0uKmySA+eD+RSIEWkiIYT62tU8zlV7QmiJUSbNFBVCVGTFxltO0cLhW0tUgqyLMO2KWP0bQqitFLM5hXGZFTVSQJNqlqYyLwNqKwgeofzPgXcaiGC3h1fzxBDD0FB7EhRCI8Px8OEFBDJYBChQmmTZGScQ0lNW9dU8wNch9tZqLX4tsWHTmMy+CRvFUIiFiy2vNpjOO8zaz0hepTJ0Urx/Fee58rlm6CSS5aUiYkrRSDXOXmZYYphl0QEsjynKEt6vcD0cArHguHZ9Db1bJ9cCg73rxHtFC0CuoCssVS7u0xNRu/UVoediwRJF+L4O5LFIwZpmiy9S+zx6CMhdoL6PlBXHqOzFMAR75AoOj7xcpzoGAJIietEzY0A30yJTiG6IIvkMr+ceYUAb12KGTojhoV2ZYydT7pMZLk0yS98zyVKyQ7XuMDkCmzbYm9WX9UOu3XKIcqC0DRJ6NwmHJsuM0xuUHmRFkXbIn1iBDsRk+mC9Xigd88Z8hOrfPf0gOmlW8QqYn3F9PY1QlVjXEwyXr0+zmSI6LvAVyR8Yq47bGQnYeYSsUbleUfMiMTu3IUYCDZdi7TYeRKBR7D/0gtIadBZhhQK4QNCQsgkSmXkTUPY2+GEd5xYOUG5msxX/KyhsXDzsEFKjSwMujQoLQnPSPQXX0aqSLuuaO8fAYmQ9sV4jR8r38bPz5Mz1QYlfWnQSOaxpcVzTq7y5/NHu8Slux53Ft+/KmiNIXIzHvKMvcV/WLyZf9o8QT8avj97gE+1rywTrJBJfD+jbSoa0fJD+cN80V9lL1YMyPmx/HFaPE+Lm0yylt8WF/kB/RBvMqd4ze3yNnOWu+Ua/9g9maAU3jPP3Fe1/j9aPZdgAf2CtfMnKcqi4ywIFrYBad5JSZPsZMv6rkVFxTM3Jjw2HxGDZHywvwxIGmvZDy1fMnucPH83PnhWxHp67kRKfIWQSKWJMnUHGyJNHZI9t+4xW7F85dKzlDPJt/l7eenqjM/lu3wH3wLAx3rvW36PD/k/B3+aouHK13jtqyVr/4Rx4c4frwFfaIEry5cSxEFS113wrwIyeoKwGKWTnWsWkE4TJB3kS3TV3JKs0EhhmE5rrl67SdsEJrSUZZ/D/X1a75L2cm5obUMUOQcHnW5yTNblosMkOuewvqauGohJE9VjESIlC03rUlyRJbOL6eGUEEts23YwJ52CbblIOI+SWqUUWomkYkSnV93Vho9LZorQ6WB3T0qabTpsthDYNsVTQsalCstCseh4Z2BSz7DOIuaCw+mEcZ7R6w/xuG5N8+AFMUhGKxtkwtHaVEEXesCZjYfxrcJ1SiAAITRw8QWI4Zg6QhqSr871/v8cb0xHNYLodCoX2LQYI2pZfelaWjEu24SLiqjREiX10q9cKY1WGht9wtuF2AVBmhgTCziE1G6UUhNjwFrbVVAlTdOk8vixfUCndxZD2n/3ABgUTpMqcCEyH4/JyhUGKytMbx2yEPolpgfFNZ5hcwR2NmKE855S9YlEfOecI1CE4GlmSeLD6BzXWGSA4CSKjCyWVIcVfd1HWE1AoLOM0AZE6NNf6dO6FucjSimM0jRtQ5mN8NYBGc47iiyJR0dRI2VLbjKsCiipwKfFUaDIioy2rfHOYUTWVay686Ikzlls7RiWK4mV6i3IVIm21mJMnpKFumbnRiCEHJk1xJgwbsGFFDA7RzuzGD3A0xB9SZSaqgoY3SNGS3CHKBVprKMwBdFJSjUihhaFwI5bQrDEkIhFtWvRUmGDo2lqenkvJSpdlbx1Dd435GYNayPz6gA4B0CwnitXb4AwOBeo23mCU2iRCFAKxuNdglDIKBBSoTNNDJ20TAgJ4xyhaV1i9XZDPH+LW/vX6V+4L1UJfeD29m3Ge7fI8hqlsiSSrxXO1imTbWa0VhDGtxBRobQEbZAmZ2NjE6XSorwYbVvRKzKa7Rvo6TQ5RWlQQiKJFN7R3N5FrI0g1+gYiWGRsR8RqRYJ5JFDUkcKkynwkyHJBgViYomqRUu/mwzDUeSxqEgsKgPJv9shgkxy095ifVcByrKkmtHtcxnmHgughZSp1dUdX2LceoJUoPVSGsov5g9iwsZ2WHglJMpotDJHxcpjo732CsYUzGLklreoXkGel1Q7nqqdE4VfSjQpkSA2pcnTAikEw94AuzsmzOfgG2aHE3omo6chtC3KJzJCFVsar/ESZAQhFEEktzLZLXqxqwx65/CuJYpJSq6lRnXBehQsNoCMKgWyEVj8ngzY4ACBiilps3WCTqkQEDFBnUTtcNv7oA2YDKdqdJ4lhYRa46YSoSJRCfRuQd7ro8cZ7aWl3CH/RD7Nv+8fXLoe7YYZH54/xYerp/jx4h18MH8PL/rbfNJe5PuyB7vK/fGLII6gDHesGWmB/gezP+QD/Xfwv/a/H0vgM/YSH6+fX37ux/O3sR4H/G31aYp+jwfVFu8Tjyf3Oywvxz3+lvsUhwUIcm7Gmp8Kn+HHe49zSgy5HWb877Pf52acgEwV0cHqCszuPJ5pFpIaTF8znU/Z299DCoG3vlvTjpyIFgFCiIHgLM5H8IHLVuODR880eZ4nwf7QEhDsz2p2n95nUUzRSicdYK3QJluqCqA0CIXRGqUVYyPJM8naQ2fRMfKaEMg840TvDC9fbbl/L+PflXH1jEHKLH13Z4lCJLKl96AzTp46y2BrlWgVu7e3Gd/eZ3z9KtF5BOBdy+HhHClzVgbzBEMQgXo2p6pmDFeGTG/dBATzukJr3ZG6PK4jCVnbBYlRIISiqWuqrrO4NA3ROhFLYyrCSZmKQtPpFJ2t4qzDaN1JSh1JnQmxmHfBiUgrAiFw1B1KH1p2iu6sUnKE7b9jnu7IjT4iVeze9wh5DDIEGN/gvaCuKyQNs7qgrVpQCX7mnSUEUEKTlwVV4xFSo8hQUmIk3Lxxg4lvkqatAxEPCcElot+xfaUqclhKAX49jDeMUV2eciE6Id+F1MGx5el4UC5ASo0SXYs+dAurVMuLuxC5/jZ7gaf9q0lw15GaPZ0guYssfYullEihlxPJovqlRHIcsaHhB7I38cD5h5jNZoz3DjicHSZNOgveWuaTfdZPbNBog4+CiGUhzROxBI5wsF4EZJZBlLQuEDyYPEvs6Oho3SGZyaDLCGMUeB/JtKGqA0oP0+/ZiJCKqrIUeYYMksnujJYGpQ3VvCLPC6bTOb0s7xw/EmapinViowaPdQ0+TFAqSXAJmyq7InZl+uDx3qN1d45i6DBbC3UGQb/vmUwPqeYVG5snmRxO8MEhFahM0dQz6B4YU2YEH9BK0y9y9qsKjcLNJblawckDWtvS760zGVdkuca5lqI0RGpoC4wWlL0CHyxROJRJD6CWOUoZbOUpimFqXZn0QGmlKQtNJg0mC0gtKHslWTaibQTReyAB5++6Z4tnnnqSm7e2CdEktdwYOxkjh1aC3Rs3QEhCcKjM8ODDjyTsWYzYDv7gieSZQR1jgBd6CH2L8y5dE5moSM5apMgph2sMV1eJMTCbzsmzlVRZDYHYtOhcUA5GRKE5nNWpuqyazq6ve0x8xCjJ/sGcxkpocwQNtUgtYaUkMThCO6fICgRJi3BRoaS7d7tC5TFtRkEUSXZJJiwN0iRx7+RcahHIZUcjHgsSuz7iUTIYU1s9ylThz3KFibL7mECwkIA7BiHgSAcZ37FQF2QUSD8TCK7pFrTEUE26CqnromJEIPEIvBd4kRFeh09ME4DC2gYbI5kw9FY2MIOcUiuclNhu4nezpusUVIgYulagZbqzzXz7Fk5EfAwEo+k/9gi21NR71+jttcwijIXAtQ2iqpBREJXuPEXSsxcFSYRdKZTOEmHGO5SQycq0m0sFgEwwp0jqKi145TGmec2FFu8DRgiMVAn6EANegTcZIkhC0+JdiwC0lCl4RSC1RudZItNlBabIELqiyuYU8xG9QXF07vZrfpUv86vcSUi76Hf5UHi6SypSledD9VPLaf4DneEKHeTk9UMISYiB3Tjnp2d/sJzvF8E8RFoR+bv+C5iixLYO21r+jviDZedg8bmF+u1ivfmcuMLnuMwF1wfglc46O3Wfcp4rI+993fF8LP/R9J+q+/NGh+z+GKD4Ez77tYYDXq/u+G8wfuaH8868JEFpQvfISSERqnvcuuuRtDo9SiqkNJ3ofGpRJhx1SJ3PztiEY3j1IwiFS+tyDN06nK6hFJGAZzBYxVpPXdfkeU7mPUKkYDAQcTFtRyjJ/u3bvHL1Im7qaGeH4CLeWbz3yK5jI/HgLc7WKOExGmZtRV3XZEayeeIEk8NEhFNCIrKMoijA2iX0MMn0AVJhTFIpkiISg+3mM/A+ok2B8w1Kpe+rlMJkmhCTa1fEHXWDU8MIKXQXlKZnNgS7vC8XU7FfdI1jXMY/6f1F9i6POhMikc0S5nGBW0oFmkURDqBQkVu3btJgMIVCqiIR02M6JiEFPgTWT2xRlhlV0+KcpOxH6nkiZNbzKTbWZEoSvcaHlqLMqWbzZLbSjcU5XMArvx7GG8So3jnSAnQ8W3hdwNr9431AmA6fRofBiF0GLgWhk7daDSXehfS5Y3eGEJFeUSaQsPdLSSoA27YIY1J2sMiWfGBN9NjY2KC1jhOnT1EeZOzu3gah8QR8U6GCAylo65Yky5gWa6U1x2IIDg7nKCURWjKdTSmLnMNx07XCLYXpcTib4KwlhIBzLklKKU2wgTzvUzUNWZbR6w1QMqNuWmbTGb5ja/Z6PWxjCaoluoAalri6pRz26BeD5HTiI/3BGt5FpAxI5RN42kSih7XVjaXepVIKBCgpyU3JfD4n+HTemrZFCsnJtYhzFq0lp0YbqbLUufZIKTtLyICLJS7O8WGG1hFXC1aGW+RqwNrqBsYYtNGU5ZAYkzyLFIvqWkCaVA3Q/y91bxp0W3bW9/3WtIczvcMde1S3WuoWgpKFMAZMmYoItgHbwaZSwYR8CGVi+0PAlBNXINgpUlS5nFCJnVChCIVTGH/AUBkIkIoCBrtsQIAQJQnRINFSj7f7Du+973CGPa0hH56193lvq8GyCyN5dd973+Gcfc4+e6+1nuf//P//xzkpTagktA1dAMKbDMFTFAWk0UvTEnOgpaPHGEsMkt3GFNBZOf8K/wCAqGe8/R3PEGJDs1nj+0Q/DLRNTwj7zT/lgOrxJ9+G0ZqYoLKag9USZ10uG1mcK+A3ZeOrlgtspUlBo3Xg7OwB3WaHHyJ2rnFFwbxesm02dN4Rk2Y+U+iYiLqgmDmq+ZIYPLWzrJZLtts155u9FL7bbXj1pU8Rz85JREyMlGFEJwXp6W2QkpHKvsBKCy9SyR8JJrhU8cifXxJfVazZb0Jao5MGLcnMROEhH2Say/nvNDYGuLwYp3G/E4w2SZr3cMKqmNrRpJAPeOk4ScpiJiOsIJ2zlM6b7iXP44luRIdSn1mQ6rU0h1DB47RmVjicdvh6QXnlqrS/1cLnbdYPuPPSp7BtYjWfMZyf4y+kAw5aeqMPQTMMDcujm1zUB7wcz2lVQkfNzFiM1SLGSV72+hRRIRCT2OmrYNBJxD1Gi9tIAvGoTEiJOucDJsknl5KajNJVilii+F8GSdaTjiStSdGQvJINMAl9QaWEJzBEL6ihSjSbnXAXTcF8sWB5fIjvd9x+6R6F/VejdI0Kkx/oaBa/H+ktvxzHkxyyoHjYUiFdui/U/hcHDdB4JBJ8iyTksxhvN3tbLAJ81ws3/42O8/k+7j5ZcvOx65AQsWTK1LncqEOSn32gaXI5egKU8hoQQsye1UHEWLmRhhpRQfaBqkJ4pD4EQYRVnp8q4eNAXS64/cYdjo8WLJZz+r4DUrZ5A1IJQ4cpDPcaQ9KeYD3BDDn+t1IejyF7mkYUHqvhytEBg/d05/eAhA+epmnp+57lwQF+1zOb1SxXC8LFBm0NNu9/wSeiguVco5RUWhMWpVIO9LMrh5bkfYjCM1R69JCVBg4hdCg9JvQ6B3Ra6DXaYHTOZPItLWtimkSql+MJLl0H+TbhY4u1BTHsEw5htSouGT/QqJLH3vE4r336FYbGU80CQ79mt24wViq8wSuhTZzviKFD20DfGbAlukhstyecnW+wzuK9YrmoufrIFV7dbh+K53yMFNbuY7HPg/FZBqpvXo3ygvomvlIa0RhGiFs6vSTC1GkGkmQiKWdzSQQQOsP8MQ1Er3E2d6eJga7fi6dGFFVrLehhYegGT2GLLOKIkr2dneFD4PFHb9K0LdttJ5QA37E5P2e2WFLVgbZvM7VAuHyzeq/6Py6uU80LrNU0RYuzFSlBUTgKJ+XcvhdnAmcFaS2KgjD0xBDpQsvF9oK+79nuWmblAYerY65/wQ3qeiaB+GwmMyOJF56zBd57bLbnSkqCe2sL+j5itUabmLNDUWcmH3Nv4jBl1EXhaLYDRSFKTinFSZnEWE1MsvCIN6lkfmPruRCjTJjkcVYTUmIYRCWrjcIPg2Se3qJVQVlboVBEJ92mqhIVLQOi3s/y8+kaxRgx2ooVjB1VuCE3gdFoBAX0oUHpCp9J5sbMhDR+yfPoV37pgzyyOuKr3v+1aBWITUvXNdw/37JpO4Lvpww2eE9ZzQj5ftO2xCeFH6QMtG06YugnOtetV064UdcslysIEDwEozFGYV1J0qWUW1DMnMUnI8KqKFZbs9mKwpWcbm6j8FxcnJOi3nduQVDk40euko6XDH0PXYuPUQLPGPEJytLhyoIhI+Q6CxQjHpVbMqopS5c5JfNPEcJATIGizKKn3C7WapOJAPuy8xgYPzTzR9FANiQXkGv/GDXyTsf5nyYpAWkUeYxBZ57zIp5KkELmb5FLXYmu6WjbDp8TV2c11WxGUdbEoSfEHW+GtoIzpF2D9xGzrCitUGn08ghTH7AowJWGZDX3/Q49RAqtqbQlBBFdRp0wSdCQ8ugIqzV3XvgUF3fvUSmF0olBBUIaEKhbustEHwhJKibalcyrCgUMXZv5iWOEJsILEWTt2z1PvE+daQG51a/JyWZMWhIYBF1OGJISr1eUwWhQUQR8XiXMssYtZmzvneIGKMqSECLvst/B9fKLJxvHHym/lD9oFGRa41uaNf7+4wPD6wR3k+JzyHB78tkf+n1/d/vRl/nV939gqqhIwEYuJOyDOnLVIihBaoXPvv8whPqmpTqSBTIKM7anYTR7U0gHKq1lbY1R1hplFCEmrJIrK9x8RVI608ukfOxVnwVY0pntShKP1hiTdHDzgsKppIgS6eRziOg0ViogaZVdPy5FVDDZZgllgSkpydASMQ2QLMoWpNiD6ZGKh6GkhLxv1PWMyknXujB1e4IUpPpnSkvtKoySNTKaAh0h0GdakIh/kgY/RNqmZTGbE9LAa36gcI5+6ImDp+s6bNeigyC3hweHQhMzQhOKKRCy13pVWXzwE/d4FEQqFUSUbbPDQYS6qqirGovM96gMKhbTZxPHfJ4EQdwb5HeXOmWORSkt1Lt02YFiXPfj2O4b6qLC2ZKukwqK0Wq6e8KltXhoHEePrnj0bXB+dkGKgUZFbCEw+til7OzkFT78q3clwVcWkkbpAuM8m7P76KTEKnHwxKFgNZ9jlWZ483xVCv8W7hmfq/FZlv7f+gdvqQqb0G25KGMv7WkrS1EUtXkyjkMr6aahdQIjmU0KSYLI0U1AKZyztE0zfd/7Aa2lLWZRlHjveeP2bWaLBZsH99FlwZWbj7B94SVBb2Jiu9tRzRd7HDjz61JUHH/jn4Tnfw2Ar/iybwAlRQBrLRqXd+bAmCrJRqvF99WHiRvK2OYyeUJqGUIg+ETfeeqqpO97SI6z0x7nHF3fYfRAVUFd1/RJLKmMsRhl2WzXrFYLhn4ghYTWM7CJ5COussQgvBq09I2OSVEtCqwdqReRqiyIPsqE73sS4gcYg2ScfT8wm80Jocc4h44wROEVzxZzyaq1oigUm80Wa6CcOUKI+BBRekAlaNseRUdKmt2mEYK71rz64BWOr1xBWyvtOrXDuUJ8Oq3G5sVYui+JeCkwoIwWuUnsJdjy+/vm3X/lK/nFD/xLjj/2Bi46lLIo5QhEVEo4U9J7KWNopTk/XzOEyJAXvbbvpBtQHLmYiXdmD9Dr1+ZcLxdsd8LjSTow7Bqq5ZKjo2MW8zmzRUFaGI4PA36I9EOkbQeiUWhnCUpj3JK2PWeIHTEIb3uagHXJfPk4WmtivyN0DT6JYEACOZlTKuWw0mRUTiWcKgg+i/l8n02sJXA01uKcxpWO4H0unRW5B3Yg+GZaOMeObmPlfpzWlzeukR6guVTCEihVfpvnECkJep2pA7J4p2nxFVQ1CCdWp1wl0Wx3O05O7rPbNvjsmDAGudY6nHPU9YLl0WcaHap3vAN79zbuwRqlS1wTMDrSbTec7Tacp4AraxaLGbuzc3SCg9mCUhlO+05MvFVW+auArWtivaC5fRfVNcxy8JC0yklCbqupEskKz7SeLbFFJdUAq9G2pNueE2InAGKKecm4ZLY+pgoJyN6GY8kwjmi0EqhlagnJkD9XhdKRaOPkOmAS0He0pwOFdbjSsRt6ztoL/vrv/tWHPrOd6j/DkeUPY/xkePFh8PVzML7mY3t3Aotmli4hyB+Fs18/Acb7WH3G2/3O7/oeRpcLo/QUREpb7/gQUpaMkdJ1tnzTKU3rlwIIGjseQymMKiSQi2AQ9EyniFOSkEQCWEOMUs2wUZxlFLlNa642GZ0RO5Nt6lKmSyikhIxCTYCDBLopG91rBUoLNSNNVY9LNPU87yXxNaACSglfQiFgA0aAEWsNIfTY/L0AUdlvWSmCFnBFGQ0WOt8xtJ6u2WKCvI62YsfkvUdbRVXNGIZAPwScjeJsoBTOFXjnKCuHMYqm3TEMATvaao380ATGatJIUYjgCgGVJEkA3wtgI6iF3LLWFoJEayNxixI0dvSLJzcess7ismfuiFBLEmCmRGAEZGLIc1rta2Rjq2qFopxbqrKma1s5f6Xpho6+bxn83upvc3FOSh0xRKp6gS0ch4dX+OhNT+h2vOOlQfbhPhKSpxt29L1UfWK/pd8GymoGQ6ALg1Ah6IlBgvDL6KnW5q0KJZ/T8dmJqfK/CvLmNu5AbyoJjShB/lWKSTiJQQI2JAZFHB71paMblJYWliH0gkKoiM0lh7IoJSBVgrK6osj2N2tg9e8AACAASURBVDpv5IlEkNJYiGzOL7j55FNcv3kNpSvqYsZt95oEec6RYsyiLGk/VhpH17csFjVPve/tdEigqk2Fyq30SKCtFWuJqPLHkMQY3RgKZ+lTL4uIkUBc53+VltZkWjtISiYRYpUj9lzyvK7rIInwabvbCpoZoSprfuvjH+fZZ59ltVpBAt832CRI6XbXklKi7zr6oce5QgLOoSclsbXa7XbcuXOXxWKFGu2/gpeALQoVYLvdUlU1wzBkZNXjvfQVLqsKhaFpOrSxdG3HfFFS16Ug3lrEO6UrGYY4+fFtthuc1RRlydnZGcWrr1KUDu+FU1SVglJXVUVRVNhchldKozyS0WfmYtf1gsCjOMp3T1853v1V72XxlYbf+7F/zq1PvExC/FadTXzpl76Peyen3Hr1lBs3HuHk3h3WF6cUzvLcs0+j9Yxbjww8GM4zX8nAP5Njd03D88+/xuG1q6yuHuCKkroQxCwGh1YKqzV1NcMaCWJiTNIBKMWs9NX4RcGmXXD/5D67i1PSJWTm4nRHiMK3SqFF00MaBGXIXdO1GgUrIzIpC2HfBdbrDbvdjuCzA4Dal5ecc9RVzeHxiqIwdF2DtQVGO4kpL03w9OagJTGhneN9ajKvMqZRDCAB0wiy7pscC5o7rg2SBIxLxNiude/rutu23L59wsVmt09qU8plOi0iuWbHbrtl17aMQrpx3Lp7i5tXrvLYs+8iDh2+7RiCoj1/QNs0eJ/wUXFXK6LvqCKkXUczbLAhUZSVfL5DoKrmlFrTn5yQdjtwmiZJi4KUslWWYhLH6JCE6tEN7IbIxdDhtSQjBQkTxVkhXaJXSOVpxK9zX3jxFtt/gvGSi4NO+XqNNAgl5Uwi2etvQquJARUFDNilgbv9lv7SrvO/vOt/50du/V1+4u4/5o9yWOV4e/Usn24/iX+TYf84VuaQlT3kte6lP9TXTlbubZO9IsPth0mjN24+8vATxrLt9K0CZXJgO6q8cxvjKOVajexz+yROgkGMhJ9ivZSvoR75urnIq0fLtizCyZQYH/3UrUuAlHyNc9ULn/mXIzhBnnFJKo6S4+59Y0dlutBRJbnR+fySknuOsQAwPlfLuWuliFpQY5M1EEprAUKSFT2KAYXY0cUk70YrTVKBpDSVWfD040/TtA3N2Yq+he3pXdpdj3NzTOnwMWBsBcrTtC3zpcHHAauTIK3bBqs0NAMpRMpqhisBNWBcLY5DqchFvB7jdW7akLUNWlrNJh1JXnxt0YagDKWtWS0sjYZEILKhcjVNewG6x6eOzWbN8dF1ivqYk3vn1LWTfRvNcrECbSVxUfkeMZG6mlO4gt22IcWANimX9i0m9ezWjawBKWGs4fiwwnvNdrdHOX9q/evcqK/QDQ3teiBGw9AELm5rjAl8eDeglcOaOWU1wy4SSUcKPcc5wzBspPLpK0FKVaAoK7QJ1LOC/nwfFCsEtb/Mr/1cj8+y9J95bBldGVEWWWBzuDquwyMQoEbrKOF3TBMnpVxC3CM1GkVRFrSNcCyDzwKgzBuchtqX/mWv8xhdMvQNMQ1oNSfFyMHBivOLC1bHVxi2A2WlqOoFQ9eAStTlnC4OCN1EsuTjowO+8nu+iStXDxg1sbNZSUyBFKRE5H1AGSVtXJNE3UYbYgjcvXeXxWJJCIkQxEtu1+2Yz4UnCpowRLyPbHcbqkpU6j4M7HZb5vM5KUWMLri4uKBpGhaLgrZtWSxXLJcrXnjhU5SleEaKH+joa+nFBitzUWezmdhFdT1uVFWjabqePpwTSZmiMOBDIGaLEHQhfqPWAIoq22/tvS8189VMXBoKC0mxawaUkiYHxlrW246hH6bSi9w+nhQv8CGwS62gzEi26YydWn6mvLj3vZDerc4WI75jVBGnKPyjP5Ov0S//8q+Q8MxmJbzvEF57hXC2IyVoB89HP/oxZrMFITS8dutFdpstfmi4eu06Z8861rFnmBVU5ioh9Dk0lNFsNtw/O8HWlmpVYaJHOUMMkU2zZbvboe+d5/s4Ys3IrxxbJRpc5dAqwBDpdjvplN7ufRGfePwm1hacnp5xftpzcd7QNbtccbBIlSlTZ3J3NkkyIl27I4SMEmSetlJk8ZyU0Jpdx8V6zbVrx6wO5vma5CpF3nTfXBlReuT2xum4QPbf3CemY/h5icgwfbOvoKTxq+kXMYloyWiF95H7909Zr7eyqWnpfy4dtWTzjRIdE2Ngsz4D93Cg6vsd3baln/fYoqBYFmhnKdWRrBRKCSof87yJUdAmH1k1Hf12S9jtsJuG2pXUq0OKqqJ1FfdmK+6d3EN3HTqlad4D4tvqBf28N+y4iJ6IkkS8T1TasNKOKmVv6SxekSB3fGvZd1GNHtOyiAqdw+TPP2bByz5AzjDtJJBJCiIRoxQmKdrQcZ48bQpvUulnD8jxGsZeuInjVHVSnv72L/zf+MTZB/nAqz/0EFDxVkW0Nw+lFF/75F/j6eV7+eFPfHu+d3JlRwfx+cx3yP/05R/lv/2Nr+e0e+PSjTRinTAzS665mzjlGFLPveE2u5Al/WPfWf0wYeVIX+FQX8EqR0iB+/EO51HarhoM18xN5nqJQrGNa2ZqxiZdvOV5pLRPzPb2QfJqWhsRvCQypYZcsRithsakTILLcf8T20C5fkShfcicHQPk7H+shBImAaoU5KW6IirtqdwMmS4iH2CMYwBtUJcS1713sbp0fqPIUZNGJPah2yVOAbVVOReKAZ3NW2ME5xzO6lzq1lmN7zOCHAg4CpeobYWJM5SPMJQkLvBBwChtBkJKtF0ktIHSBmxp0Ulxev8UrSybzSmtF2qZ14rBKBb1itLNqIoaV87kHg0JtMW6gjIEfOhJURo1BJWIwWNQonlwCq0sVlvu3H6RNn6CzWZHHBRDaFhvLkgpUFYFXdfgvc+QgRaOqrHZNceRktB1nHXZsjNyttkxny9Z1HP6vqUqC8Z4KoSIMhGSzkCV2Akqreg7EVp/MY8C8A+ar4SX32KytW/xs/O3+NkfOB576DtlZHkZq+KfD+OzClRHxfiE1qD2G9glcHUSVQlIKplF9sYEptJkyhyN8bnee4ZeyqJGWwbfYwsn5V/UpIK/LMRIKWGNxQeB/gcfcIUl9dIk4Opj13nt9Vfxa887/9gzBIK8ftey9RFM7ntsLB89XvPNf/nrONEtt37113g6n/dvP/98Plfy+xeO5xi8STs8hfcDd+/dYT6fTSdVFAX94KnKkn7oGGWDSmuapmE2qyb7LaWh6xtpbmBLlE7UsxKFpp4t8T4BEedKUSvmkoP08E1YW0rpJ+82223LgwcXslBpxdD7yV6pH3rBsI3G6ETTdJNITWspr0jgG7BaNpeLiwtcIbZikpnr7DsaMp9W+MLOOYIPxPze2l1LVZVYo6YEI8aYDfslkx0tOxSJ4CUTHbxwhkHlhUHQNRHUjX6bglK/9soLKAWusCyXC8Ifv0r1m/cZzht8MGwudmzWu/z8SOFK7B9/kvl7HmHtHMosqHVGuPW4PYqY6ulHnuZotkIHxaxYUJTSKCCEgFctISRxXPBReFFDZAgJHyJRaVmsUgKC8JCVxhl7WUtC6w2+Gdh10PaakBzJVECUYC0lgk/CS5S7HwV0g3Cr32K2ikl+rjKA9Hi/d/c+XdezWNZUVSmI/9gWdZyM45wOec6P5Xshv8mkzty5fao6virTT6b2qmMgkR5GmlIUFwFtHJvdhvVmK3xWo6QsqWQD0ErWlJggDClz2T6zXP263lK/cZs7r9/BagnwkrYitiwNyiqwGq0LFJJERMBoRWEMJmkKV2OPZaPb7nrOLrbstjvO1he0bTfixiQN1mZ6SghordgQuVCRUJiJq6gSNDFAlIYVlSkEYcuK4ZG6mi79F9NYEpSSs8rnr5XC5qB/7EBG7hzEWL5MuaSLIkTYENgQmc1WHB0u4ZVLu9zlqO7Ne1EGwt/qx/864+df/4c5CH/4+ULRVRmW/swXmNkDvvXp/4HnDr8cH3s+cf9f8n+/9Pe5CGcszQGPFk/yUvsCPvWkBH/q5l/mqx75ZpbumJgCt3cv8MFbP85vbX6Zbuj4049/G3/98W+99DKKwtT8i9s/zk+9/P08Yp/gu4//R77n/rc9fL4jlWX6Gh5+wxK071vhjqLECCpbOKLQ2l1KBNNDxxXBUhbFaXMJydy73IAiRpnTsA8yjRYkViVJVrTJn7VSiIu8VPpGUEVpk4/BFJwqLbqFSdwTLwW++V+jReAWMwdJawhaYUyR9y5PGDqqwqF05soGqYYqpRiSIiVRnc9Kx/r8LhfrEzana/ohYofIrChEHBZbrE5YCnTwGK84W9/n/Pw0UwM6ChMZujWucKjQsGsHWh8IStPutuLvbSxt05J0i9meEmOLzg4qYfAkJRUvYxTRS1dMZQZef+OTnG1bYu+wqsAVgTCsRbC1cDR6AOUgSWIhCUTEqoQxiaYRL3VnFd2uxTlLaTpiH+nSjlldYwh5P9bU9QxbBIahI0RYzQwxJdq2w2nplPjilQuevr/6/abZH/r4iL6bEVWN/XctUA1hnwHL2KOhKe2zREAyxxRJQexnbEb0Uj6OTBoYkZyUIj8XPs2xtRgtJv5FUQgfJyvytJbScdu2k41E27YS2JqEThaUIoQelEIrw+pgyf0P3ecL3vUOVocHNLuOazdvcnSlpvsTV3j8sRt41aN1yZOlRi9rtrlMPY5Ns5ObMgmH0TlHiJEYpE+zyiV3rRVlMafvZJGKQcrUJEW7awghZB4kU8n7/GyHH3qhB8Qohv15kwrZ9B7lsbbIpYV9BjwtipPHrJ26TYAgYd4njFX44CmMI6YoBteKKcgtnKbtOuEBmoK+7yjLkn4Qk2OjFP0wcHFxznK5wBVFbmMrpXlNvj4ZLRktLbQWQns3RPqhwTpN8HFCTovCiZWKH8SY3xiKosBo4SpbJ5zEhHQtEeGaES/YIeCy9RTAt/3CmzmLS8YgljdXLsZL+xHgIx3wB7f7fPQXXsr5LEgz6D/8cevFT7PZrBn6Fh86SENGcIx0uRoROJ2w47wJMTedkHk4KXTVPsqQYNEQskfh0Ace3D9Ha3DWoMtyj6zojNZojZpcG5Q4BKg952q0uZoSVfZJqhyIqTtWfqe5pCjJm5IaNSCt/Ix1dP0FwafJWsZIaxl88KQYUFq6JTkrlYO3olV2qid4h/dkoZFUEARxikQtGxMhYfLPIzGLTyYCWkY7mQLCFEPeyNNkJyWff5i6YLU6caESQRtKY3G1JM99OxB0oouBJnl09otOGS3eOySMTRrGoHwM8vePufToaQ2Y/lMifBEenHQYCkS6FLGFY7mcszo8fChQfbR8G0+UT1Pqij623Bleo4/CQTzQRxzZq9R6wbG9xtys2Aa596+5R5npBU3ccmSFx/3An3C33/uyVrrmZvE4lZmhULSp4TX/4vT7mVpybK9Rqopt/EzH+a9/+3dyPtznez/0Z3msfjvf8tzf40tvfgP/9NaPsg5nHMYjVvaQB8NdAJ4//SV+894H2IUzrHX8xUf/Bn/hHf8VH/rNr0Fh+PnXfoSfe+N/BRQuON57+O/xH7/7v+dD936GkDz3wz2+ov73uaYf4W6Q8xiGIcfr+e88T8JoqZnLhymmTFOSdqFjIKqygAmNUN7yddNmv+dB5rzGMRE3jDD7OLNGKsDklyw3jAA/akRJs8J/rFJmVDdEcdHAaEkMUmIvamRSpcc0Nc+d9vI9spsIURqnqJTFmRGS0pIbJY0OmhgUMRlS6EnYnI0EQkyoVIoweLDURYkzgdI6elsSBk1kg2SpSfZIDGVZs7nYMcSO7WZLNZ+z22wpSkc/NBgDTbNhtVqxWb/Mz/9/P0FUsre0zRqVEoU1aOuJuwZnE96Ln7okFwa0CK+1cYBQKEgtRnkWiwWlq0l02GEpwENr0KGm2bXo3NVyVld0Q0uzaykLRWVnqGgo0gJlCxSao1lN3/c4ZahUQV1V9GZg6D06aLRfYGIvaHhMGAXlvCIE6PueX/jyu1hzn3pW4ArFxabBqgqrDVoNNGsPyuPxzOdLqnLJ0fKQeWmpKsPZZsu8XrJcOGYzLQ16lGKxOODFT93ltZM12+2WO3dO2O0ahmHgXeYJjLJY+2/mwvFvY3x2iOplvCRnxPviTMo9wcd5JmV7lHiNGi0kb+/D+PBpQiTkwtzxG5ZDSUqaru3hUjerEMK+NatSoOLUilGpRIwWa8DoRMKRYqJpNsSQePTGkzz7nud48dU3GLqBxx6/ifqax1hHz6tb6JMnJc/Qe+7YTT5e5Kl83p/6vd8bQwFGsZHYPykGH9AZMRMuX7bkSFJyCTEyGeglpo4+Y0lIAnhZWKR0UEzlkvG8xQnB0HXdFIwYY2h7IV7X5d5zNcUkKtJsKyHXTOOHXlq6IgGs+L6Cc0Zsk+qSrhMvubIqJWhUufOGdZhhYL5YiEpeawon/pDTYpYizjqsK3IQIsGqAMjC6xJB177ULN/LJ5uSGHHXVZ3PcUSqswl85kYqI4x3PwjXef3s77H85L+d4PGPauwOS5SRTiWJDqMkCbACO2ULmj0mlZIE8b0PpCDlxJFWI8nBHpUbvf6sFWrKGIA1ux6tG9R2QLtCeEo5IZT/RGs6+jKKyFHEZ9a6iX8NiN3Spfz1IUK+Ap32wfNY7lbIfaqUASyDNHcSW5ipuXSkKi1GF3RDzzD4bBNnUaNJ5KXhU4nJiI40gYrETImQCg6QNMRIH33mc44WmQqSYmyGmBTEMXaVyquMtGcJSzwgsqotkVYrlqsV168c0w8d290O6zybizVRQU+ilsNlHmFipDWojJqP4LMi7/O5reglyj9kdHk/soBq/H2MRDQdEkCREm3XSIC/v0r8xRt/hR964+/TxZbrxU2+6en/hrcdvpeFO2bTP+CffOp72cUNQcFfe9cP8NjqC1n39/mnr/4wDzYvchFO2aieb3rmb/Po/FkSiRcvPsL/8em/x5FaceLv8J5Hvo6nl1/Mj37ivwDgv37vT/PC/V/h5uI5bsyf4Sde+D6a9ScunUrisLjJU6v38n0f/vO0YUPTn/Err/8Ef/LR/4hfuPWjALSxpVRVPhN40L425Uk1c0iJg+I67yq/mCF27OKWu/F1AqLQ/qKr7+f13Sd5ZffbOemS8c7iC7nXvgEgotQ33WZjFW/0d50sn3RuYjMCHGks68vVNFpPpXiVqR4xo+OkNHXAGucgI3Kfk34JUtlTLmIGhcYyf050tDFZ1LOvDCVG1Dq3XfaX121ZW1Eqt/RMl4LU8fny79isZ6T/WZNRYi1m85u2wZYlg4/YokQD3bBBGbDpPFvDdVR1pCpLvO+JM4+yW3RfZPpSpCwcbSvVgeXC0u7uMWxO0MMaqzpmZeT6tRuE5EkqMVvMSSEwtLfEMYDAYaVZzuYcrlZstqecDB3R94IsI5+z9z3WZqqD6tB6xtAmrhxf45lna9rdQNcm/GBYLFY0jYibFrMZNgtAZzjKsqDoKw7mmqqs2TUtRVFilabQFuekY+a8nDGra4ahRStNaUusEkuq4MWdwccOY7OP7ABWKcLQsjAFWgfKGCjCnNVqxaKuqFxiXhXs2h1FUeB7j7VyLfvhgkUxY1bNMTHSbE7BHoEuKE2FcZEUthi35e2PO8rqUU7uVmzWW65euULwkRhS7jT5+TE+q0A1hpBLTg/PXpVLHFNXKFTOLkVQpDA4l1WRWu9LXXEf3IYYs6G4giRlSOfEOB5kAiZE/T9uhN4PgJSyjR05LgYfIr+kX+GrN3NeefkVbjx6yKb1fPp3XmVeaF5+ZMfZC8/TqYEiFdL5Rgs6a6yhKIt8jrIQ3rstC5cavdb8gLEGksqepAZrc9fgrLiKIVCUJQro+4G6nhG8cFxl7QpEablEUCqXI4CYsE46SkkwLMp9qx22KClcgcnq+SVSBi9Klxc5Qa1jjGIHlRcja0uCD5CYuL7O2nzNtCQSY9vSjGRN6lQjPFUpkZjJqNsYJz2Eg0dpCaitsZmbJfwt7cRaSxZm+VxSEo+3mJMUkqi9FVl4qTU+RnxK+GAJfcRp4SeqmB+kIEUJfl78T79Q7oms0hwbGwgQKNxhZwxGR7xv87kg2TGSOGg1otiyIYzl8i/7vo8D8BvX7/HUmSfqks2Tj7J2YmcUtCIlj8ahjbSpFO8/KWnH6BmGlq4Z6LqGGKCsFxytDlnMa9ysoukTd954jfX5faJv900A1J43qtJn8kfJwjdxyNDonDj5KNfZWLlXJenRWQ0Lo5dg0zQI9cOC7jBmlznjKl+bfB+nSeaDGudcTiTGgHO0/RpRpstf68x7Y3p03thV5pmnKLz0rsvlbTLqo5nNZ8zqklld0bQ95+cXtF2XhRlvEagOUk3wWhKkpA3aCnqRfGLoeuGt5Ta54tkY94hYvByEZEPa7EmZ0hhckr+QMzFK0aVIS8K5EqcNhSvph56u61itDlAJHlyciQ9qQKyIcrKuUhKJYEbGxsBDjS6KOcBAXZaokYOWMai4hPplpCgC7TCgyoL5YkkiMoRLQgkFP3vvx+gygvq1T30HN6q38Y+e/5sokUdzEYTP+b5rX8dPvfB3eeGT380XXfvT/KW3fxc//LH/jAfDPWp3xM+8/D/DsGMTt3z9U9/Btz73/fzkJ/42J8Od6b7dpU1G9ODdV9/PP/ydv8mnNx+lMBVzNc/nLOPm7Blav+V+e0vWfqV5Y/dJrlSPUZoFXdgQCRhVPnT93758L3/13T9AaeYo4Ndv/1+80H+c5BU3i8d4xD7Ba/5FlDI8d/yn+Be3/jFGtOQcm+sAzPViSvDrat+dMGWlt8SQ04LGiKiO6+NESxstTbXGBw9BvKDHtVWADJ3ti8R/M4UxMMzHTXGiSPiYW7DmvXW6T/JcS0aqD2RBps7Z1oi2MgaYWSsi8XGcVPJic0hGb/VEuRpbeValo+satDHUdUnfNzTNmu1ug7WW9faMw2WP4QQf10hIkViUga5rKFyFLjwWj9WOg2qBHhTKKdrNDh89KRkKM6cNgRg6vB8wGj72sd+i8OdsmgcURUFZGJp+TVkVRCJn53dZFjOqssAZw9Xjq1w9mqOyg8uivIY1kY/5T6NsBXhiBGsc5NajttBoHaXddCgwLNmtT3GuQqvI+iwwny3ANMQhsJjPMbogRiPntgr4vhez/YNVdhvwPHhwSlnMWC4yAKM0KllSiFRFjXJG9lLdE2Ogqq5QVwWaRAoeFcFaw9FhjSJy7+Q+s/oIbRxVVWJ05HA1Ywgth6sjdustvu+pa0nutSvQruBaf8RuIx6x9axGKYNPA+v1Gc898xxloYg+8QVPvZ3zszMWixqVYOh6qnL2GWvt52p8VoHqYiELw+jlNpbzM4VxQsistVhree2ZiHMFyhu6Gzd4GcUnw5Zf/t1PkghobaVsbxUxBKKPDEMgxrFPb8zBqgiGRquHMcv03mONIRlLHzpqV8sEjC1v+HPq5ZwnHn+czWbHRz7021yc3MV8tWV2w+AahDM5SL9yrRRuMaNpWpy2D9kGLg6OhR9mRfAzOvBaY4kp4Yq9Ka4rirxIidqapEENaCtc0wxGS/kn7k2UpQWqiEoK54gpZeqDlB2tdcQgAXBZVfi88IUYJs+8mBG0caMfg4XR+1IU2zmzV3oqDRnt8N5TWqEGjJy4/L8E0Zn2YfIxSeL1p80YJJNt6JJ04bGOiKhQ9YRYyBLsgyBp4wYb82YLYjIcE5M6OqHwI6KUu5uMiENKSOlE64mzF0LEajNxcZOGvk+IvY8Es34Quxbxvc0l6RxIm8yzvYwQ2icf54G6i28Hbt9+lSbzjBMKq0IWQUgXNWWSqC51gS0sRVWzWBxx89GCV175FOnOLdzpfbwyBFNyXtScd6ekJPeyxmQObhAUZSxRj4Fj9l/0PtD3/X7TUio3TXAsFgsJ0o2h73vWF+spoBVkJAfrg3B9jVGo5Cd0ZURO9puyZuThjQKciHw/iYPG+4L95km+vnJl9HT9YY/ChxAJvbQJlphX5lZRFhijGYYevZgTMvUjxUTf97wVbWpmNcv5CgeENDCQ6JMkijEEwjCgpmurxL/XyBTVGWlNMWJCwiZIaGKOTuQpOgfuaQRaSSrR6YS3GqMVTbNjt9uhtWW+WHJ8fAUVFacXF+IEoUYUdY+aqenvfZVJSrdM3Z7SNBvUVJHiUil4yL9NCumalhJ9itRlxZNPPIm2mvX24RL7G90rsr65I9537Wv50Y9/B5v+hOPiJgQ45pCZXvDpsw9x1tzCKssv3/5J/sO3fxfL4hps4dbukwA8XT3LEFr+n1d+kL/zJT99yY0x3xNpf5s8f/LPeGX7vLzv0BFtPT00AaWZ0YftdL/EFOm8BNSVmdGFjcyTN/GUX1x/hO/+ta/iSvEI77/5zbzc/S4ej0Jz39/lyfIZNJo/dvVrUMrw8Qf/nKfcO0kp8SCKVdUotkokopfmGuNakNSIbscpCRvvaJP55Gp0UDW5C2BSFNpCsojYVNZKPfmBewERlM+JiZrK8SPtKhEpciJKyutpIgMLOXrWERtj9nYW38xxTUwp4Jx4Fk+NaFIiBNmjZJ/JXsyy+MvtlednipG6MISilsfoSGUM83LG4dKhSNy4avjCp9+W14iSFC0pJJyKpEUCDA/Wd5nXK+auZ1H1uGB4/OCI7dWS3c5z587rqNQyoHiw2VGVNU88ep1lWpN0w3PP3ECheOc73snHf+u3uHJ8jHWGuqo4PLyCsQmjCqqypHSSjDtX4GpLUSdCLzQIrS1oi9KRrm8wZkaiyzqXAkXi4vQ+24sLrl+/QbfZUZpSGulgqes5ZSUuNXVd44NUWM28mnzeV6slg29ZrbLOQBVYk8VyqUSRKJwIvVJUWLfIa2XCWcdiNqewmuiFInFwYDCq4HB5FaUTPiTa1mOsISSwdo4xBcq0zBYrnKuISSzxLs7XKHk9TgAAIABJREFUtH7g8PAqKQX6MKApGPoea0s2F2vWxrFcrtisW87Od+x8pCqd2G+5z5/2vZ9VoHr6nhqdA9SUhKspbTphGDzWWWIIzGZiLxTLgTYlmj5wdGDZth3NQmEfPeLu3dcY+ig3TeZlVlWFcyW+l83Oe491YitB2JfM+76fkEHh10SMKSebG6MKAp4PFre5du+EN25dcHH2Gv1XXeWL/syfQG8XHJcamxLKapzK5tnZpddaR2kL+D9/CYD3fMlX0PXdpLj1MeTuRZI1hhRIMeZNXpAQoQ/ts2OxpBK0MiUvpZ4gma3T44KcUCFhncvPEtWnjkEWOKvRNqOLVgyVY84StNGoIEIxndWjxogyHfZhwhBitvfKZUE0gw8YY+l8zEj43u9PKfB9NubPpagxWIyiaNr7dka1J9L7MAlGUhKUNY78KC24wcj7U9lGSmfhjsqoWgoxc64E+ROf1pB5mJoY9kGqUnIMpTQ+5O4iSs4/MSAYVSIqQeRDLgHF6EnKZsTKo7Pf3b43C7Rf9gxnZ6e0bYP3oIx0H0pBMYDUibUihhENS/TKkrYGiJwgqv9dc8HxbkvcbTAJDAVxVlHMDVGLRYoyDqOETB+il9aCU/Ao3G1AbKjyeY9IjnMF165do6pL7rxxm7ZtOT4+5vBwxenpuQS7SktL1SSUAln0FGGqc+dgKcQp8Ey5CUAMmaNq8n0c4v45Ag9mtE/nRGfEYuUR6tJXKPGqjSkSBxEMaJkEGGcwRub/Yj6jKEp6/4Cma6RrXEj5tR8e0WrWTZ/5pxlBwmCixumErVxGgKUsK7Mz0nYt7dBTzSoqFHHTwFgmzx9DQAIEbSwxB+ImJvrk6UQBho6C0jdDx2K+YFUcMjbrKJ0lDT2DSQQNGpM578JDj7nyMKLYYyATiWOUCuN7z9eImIV2KlMqlCzkVkiRGBRDN/Daa69TzUqK+tKGk4SjCnBcCgN73d3DpwEfe07iHc6GB+zihpd3v8Pv7D4yvgkACiPB5dXqCb7x6b/FM6v34XTFaG92WFzj5fYTeT4gqvb89HV/cum+eHgooAs7CjOfftallptOOOhdkCYfpa7Yxe2lZ+3H+XDCx+79HN/6nh/k5e1vc3fz8kO//4ob38iH7/2/vDJ8cvrZQi3pUsvv9B+Z7lNjM0o9ltdziVzaMu89Uo3RRBpCGChLR4g9YyLddS3OFRiTlfbZLX5si1nWgvjrVMpxkyB9NleZdK5WxRSIXkSr2ohNFBPFC5SSNp86i6W8D+IfnVXoI3dlfN0xB9WZloWSKqLcapJmKG2krSeKIes+BGVVaCXJ5aw4kL1Ha1IoSPT0w5aUIrvdBW3cce/ubepKE1KgOUugE888dp1FVUA/UBhDXdbcv/8YSsFstiAlQ13U1GXBclYREVeBwQfqasZzjz/CwWqFMYZt09DGRNtuqaq5uCTQsjpcEFCYynD3wRt4H6lmJUMXIFtcGlMQArK34ghh4PBgwTveseLe/ITVYsXbn7xC2/WkqCjrmvl8QdcPtF1LWZdsNhvquiBGaJtuoh9UVcW8rjm/OEfjmVUlIcCVo2N810oiYoQO5/uBzWYtAa8yhKElKYs1CmMj642iLDxoSd7bvqWez1lf7Oh7S+l85ghrtLP4oQMdKYxj7mbMZwY/BGyh6HrP2faC9XrD8fVDHtw/ZVY4+raf6Ex9F1hfbAGF93f56reYq5+L8VkFqt/64Sf/NQ97ORI/y/8+IX9qpu4oD43X3+Jnl8fYn/kP1r/IGd0H7ntgBuZZ+CDwwRf+FU/8zPGbz/8eRgnPz+V2rc45qqqiKh1aRaxxYo1RlBRFRUqJtm1pmgY/dLnMLVzDlERQMS5m2cpu7A/E4L0Eapc395SkF7HSYqq/LxBJMJh7rOvM2yWJhZNSuZwbQWEmdEDnnUL6NUtwNSEHl8rMKTGheTLUaNkor51Gxeuo6M5q65Smp4wJwAgG7SGhHNDE8TNIXIayx2BY9uSM0ajE2HpyCpbJgXgaP5ERpRo794zvPEM2KEadgxrLAewbT0iQs38j88eOCe9/Dv+Lz9O//gDlE9YW4DSk0TO1z2W8zPNMfjo/hWJ3Idzs4tFH2AHRe4au56LvCIMkGj6b3pM/8+AjfoiXxHH5OqjR1PuS64aC1cGSmCJVWVGUFU3TURQls9kBXe/F+kmPCG1OjmKaUEwpNQo9Q0znx/LyHmEZS9+J8XOd2JbjW9snJdNdsw/gBTYbzydlRX/ISaA8wjrHlavHeB8w2rLLnr3L5QEhevq+f0uL+rc99RQnH35JePD5TatcBpXOQXuOu6jtBQHzQFKaWbBUSoPVKMwe2RoTp1z/H7mBUQkTxaeA0oYbjzzKfDGn68WTeL1eo7UWVMdahiGQlBH2bxZmKW2ko5RKYHSeFVK+FdKURqUJb52CPZ1LtDLvozh9KIWJChMhS3MIIbJer7HOsFwsHvq8/ty1/4QfuPXf8aATatNR/SgvNc+jleaKu0Hjd9O8mZkFIQ108WEfnG9+x/dy3t/lRz/+Nzjpb2Hdkr/zJT9NoUqu2hvyoKSo1YJd2oxnsT/A5Rgzz83bu09R2TlXyse4393iwp/x2OI5Tts3aMOWpTmg0jW3+1vjHfXQ8Xwa2IYNVhVcr9/Gvc2rHNtr7NKa6/VTPHPwPn72xb+PwRAJlKrmmnmEf7L+QbY82B9Q38ZazeAHkhpdvxViZx/BJPquJWTXkxjBdgaUl8AywuA7XKEg5A5FKOkkrC0JRVUWrDuFDo7FbEVdLSntDJTJwaZFYbDasTgW1bcfxG+7cMWej6JUriaJPVTftygU1hW5jajMB+9jvgIxO1bA6EIz0nHiWD2JwzR/rS5kvQWatp3Q1yF6dpsLmm7NZr0lRU/oBkptKJ1nPtMc1oaUeta7C3z0hJS4dnDAlcMjaltyeLBiiInl6gDrVJ5jlsVywcX5GQOJmDRN32MUbC9OKWY1ty9Oca5AG03TbdFWEXRHNwiVrizLnFx3PNhtiZSYVEPYoTX4nBD2PqJ8xFaJIbTMFjOOjq4Se8Ph4oiyMkQ/TACdVPsiF+sdQQ30sSNsA5GOzaZlvjzEb9eklFjMj+hC4PrBksV8QWELrDb0KbA6WLHZtPTB45zj+s0beA9tO+BDFl2GSOgTyhX0XYvNrV+TKjg53YE1zOoanQa6YUezGSAdYotEHwMvvnbC4ZUrnJ9f0LUtKgWqwooeZGnpQ0M5cyRdsF5vQMNivqIPAVVbztfnxPjviJjq+dmOd+8+f3gKf5TjjccdzuV2ngaUzjzO5MW3NXS5nCIdNNSuRastIxcpBAlQVEZaR1Qyk5Rk3x5JRGmvwswh34RgjkOCq30IMK7UY8D2kN9l2is3p6H27WrHoS/VUS97600/03ufvYc2GXjotYRmcOn7lB4+zvT4S3rweDmgmaLih45/uce8ztGuSkxde0b0c3yph21kLpVLp3dx+fjj4x7+2aVYnWbTUT1yk/mfW1B8+FXS+Y47d+6JXZcr0FocDLq+l4U+BBIioBibPYz0gvvrCxRqKl33RPyuEQK92uu6xaYlThyx/fva97xn/GxiZD6rid7zYH0hpaPFgqIsWRysiH6gqkqaXTNx45JKOUnJwY7Kr5PvxZj2QX1WIU3vRdwB1CQoGT9BNd7HPHy/qTR6f5KPk6aLJQHzlEnI9cxc2fl8QdcNbDYXWGs4ODjg4uKcUR385rFcHXGhXiJOKZ8o9q3VlFVJ3w8MQw8oZnXN0eEx62PNSbHl/PwBJ/de5dq65Il0OPH6xjemEeGhThA7j1Wa0hZS7M0eU13v0U3P4HvxWw49OhmKUtrUOm1YFHUWb8VJtY2SKk0/BOHDkggKrCsxWgSSKV9zaYsbSNEDIs7JfvMkLUpxjWJQgtyiIrPZjKOjo4cSUBT8zMmPcd3dpNQVnzz9Fb7i8W/h05uPc9q9zkH9GO8uvoyZXnDF3uCavcnt4bXPmD+VmXMvNHRhy8yu+LNv+88BeLV7kYVZcWyuUesZx+4qTbfl4fEWmKqCs/42L118hL/w1Hfy4y98L3N7yHuufx2/ffKLvKP+AoY08Hr/Cj71UwD/DU98O79x8gFutS8wd4d85RPfgk89tC1PV+9kFzfc9rf4Dx77L3np4mOctq/zVPFONMLVO4sn/KP1919C/RP9cJcQNZvtGhGDWgpbgoLgPSEGBt/LeqQSMWqGXuOcxeiEdQprIl2/Q+OwRYFC0ceAVlC4EpKHGHGFYfBrhvWWtinou078PZUECVpFyvM6Jzweq4V7PHS5pauCWb2i3fQopZnNFpRlgfcpt0/10lY8Jy/GSpWrKIq8Xkk3I+H6qyz8srnUL/c3SkEMGA3WGYpCPE1PTl7HqgeEpoXoKW1JbWdcO1phtEJXBdYlBn9I0lBUJcMgrVKvXbnGbrfjwdkpPgSG7HzjioIHdy7ohpaQBjxGmqEMPVVV0Z2eyjrRQFUUqGCwytJsLkgIsq+6ls2m4/hazWbb0A+CRiutRPlPyu3OLSpqYjDYombbBPpo6CKcbHfYXhavuqzp+lb+dC2DHwhDyxA9GlguD6kXlkTHrj1lNlvx4MEJh8srbPuBoHpmlSN0W0iRLl7QtjuMdZTOcHL3AfVsgbYOpQ2LK9fYrjcURYUpFM16LfzzEFBW8cbtN6jnS4J2xMIwhJ7F8RFnu4bzk3P6FGmGgft3G043ZyznMzbnZxytjrCmJnipiO6aHUYjSHAa2HQNISlibNi2GxSfP7HfHxio/q3Tn5UOP85KW7Rc/hvLGYUV/syoRpevFdZID/ldG/jzf+nrmDvFxz/6MV69fZeqWmCAqBJV4QhRNo/15nVee/kVjC6AHmPL/5+9d421bb3Pu37vdYwx51yXfTlnn4t97BPbiV2SOE6cxk4IbdPQqkUoSKhIVWnzKXwAJAT5wB0plAooqqAfKlQJUSEhpRWXEgSoAiG1tLnQJI2TOnEcHx/fjn3ue++11pxzjPFe+fB/x5xz7bPtUCTqVOqQtvaaa83LmOPyvs/7/J//87TyZ8ZaWdUtjRBL45B1HSFOdM4TYya35qAYFH/6T/0UZ3fvE0KkaoUyqpXsASXlbac6lu548bxrzJoStulFdezEVKoBt1JOJmnpRi9Kt32TyXBhY4RdOmG/lg7uBXydaJ2W7RTgHcznF3ByKMnW25MPR+ConnjOAfCq9rtSbz1n+f8WqH3idwf28sDA3f6sb7b/p5hiwT7HR1Xi+548ACePy8mxfvK9pXz/no9/6lud+p3fOi4HoHtyzNTxTUsN5AB2M1A+8QEuVyvu/83PcvMbn2O/21FLxXee1TBIU1Ap5JQoGVQSxKO0xANKZK6sURYLL4VYpKTlfNYG4E6O0wIChcls/ooH7a/CGsduu2Mx815Ac5hnrq8eiwG1sy0+sLGNVZwpKqXppY9NFgp1OF6KY9POAphEwkJjyRVHqYQ6LCwW2F31yeLlcD7ee82Ip6tMkm+9+TbW2caKVDrfs9vt2/7LJMkT9rE3z3eMdx3d202KkzOXF5esNxtCjMR0dTh259//YV76p76PPFheJBBi4Ob6it1bj9D7gLNGGp10S44xjs35mlQi6suPiZ9/i7dff5OYMlmBV5XHj97l4cPKnTt3cKuB9XrNer1mu90RU8GUxH7aiQVNRaQ3zQ3Fesvmzl1c77m6VNw8sGTvmodhRVuLdRZt2v4o3657iR02xmL6nvr1La//n7/B9fU1GRnYh25AAd/4xrFc9S989hNYa3hrFpbzq6/8NH/8ff8K/+r3/hXW7pKH8zf42Vek6/+d9AZfmW9Xot4IrwHwP7z6n/AnP/Iz/NCDn+DR/Dr/x2v/Nd93/58m1pl34ls8yu9wWd7P1+evHE756+FrkkrV7rfr/Jgnt//t1f+CH3n/n+ZnfvB/J5XA//3mz/G/fOUvHpa4f+JD/y53u+f5y78lwHjo7vIvffdfojdnzHnHV7ef5S999qd4bfxcs2+QHoofvP/P8j+9+he4zo951Kytlu1BvcNx2Sw2h+MY6DovFmUlQ4lCTHjHfh+leuE82koFxNke74a2kMhYpwlhbhWgdl/1ihRz86pucdBlS8owj5HammEVHOa8Uie2+0LX9ZQCKVb8thdwURQ1J6mmVUUIM5vNmXgCG8mQ1zrj/QrvVkJMlNbYozLTvMVbT9+bNm5pkXrp5Whoqk4oKkYbwEnHf6mcrc/4jg98CMpLKCylTlATNcvCbhz35AxOVbJRzNOWXmnG/Q6jNDfba1JOFBw5ZpQWX+4SI7pkTBFJUKcq52dr0uyYY6AfBmwn6YCPH1/R+YFSAjGMpBxINWG8IQNTiMzT0oRdQLeErnZvlSyRpc45nKu88/Ad3n7oycxc3zzC956YDZuaJLVx6BhLQHvxUQ67PdoUQs7EEkFFutUlaE81W672b1Fsgf0NJWZKTpyt7zJ0jqoSthjizdtUNI8e3pCJVKV5HLbk2CQmFsiQYxT7yJXDXvbcTCM5WN6ZRlLI9NOeadwS04iyoJxlt4+oIlWmyzv3mKdEiCNKGawy0kdkZOFrjSXERElQDaw3a5z5h+ff+rtt3xKo/qEf/2E0iOWC9mhtsNa2DnZJdFjSkYwxollR4hdnjGG7C7zvpZd59Tc/x7MPXuK7P/kjzW5IMuz7TrHfT9y7d5+/98t/h9/53CtcnHegnXRxZ4XC3lrtnoKk0pogQgjAYjovSRGb8wvO7lwyTxO0SYcmcl/slZaatFSedetUrhx5P910QHI8hHoX1echr/swq0tz2a1JuZVbF/BauQ0Ib5fanwL+lsXsaX21bU97n1NW9XRbOvBPt6NNyXtB6qGR44S8PbzPCfO6+KI+uQ+qDc63dqUd59PkspqW4If37nN7yZFpPdCm8l9rwD5cG7e/WzunCyN8St5VRGuolHSHnnyfIzvYnqvF4zaWRD43bFeKd7/rgvB5Q7hJaCXdkbWIn21ti4l8yqg33XAFbPtZDLpN8yYUeYNq+ltOyrxUab45uVQ5NM81erlqsN6z3qwPrKnVhnG/Y3tzw507d2QRWQNLIo4xRm6FIizLwT3BtLjP5vBxvLZPgOpiSq/avcPSKV+JqZwsNI4cvFqui+ZosDyuh+vveH5iTHRdLxp4VRjHWbyCrTgODMP6PUD12Zc/SHnpLa7fekXK4kqxHUdizuQUKSnxSnyb9PyGF/+JB6S7A/vmydzbFf36nPsPnhOvWutbwEFGtyZBtOjazz/qeecjr7H7X38e/ZVHaG3JWSaUznesVmvGeWZ7s0VpzzQFzi8uef6ZBzx6911ef+MNvpwe8YXyDqVm3DDwPd/9Sb7v+z5OVAajKytfG0uXDudjygmlLEpZrJEccq3F5zDmhB467OUZj9/9Al965Su8ZO9y50YaS1QduX9nJXIooK4UunMg1X3mvOOvf+XP83Ov/KcAZCuT+V/8+z95ehcC8C//7Y8dfn715jP8ub/3E7fOwy+99dcxyqCV5W987S/fevl/+Kv/DE+OYU/b9umKv/LbP/1N//7fffHP3Xr8V1/5mfc8p9Lu/fY4MvNv/+qPYJJ/4hvJduzalwtxPaxZ9evDIs7ZY3peKYX1yoA2GG0kgMVIFWR3c4O14gQTcqWkDmMrKQXxyaZgtCHMI5L4lEDDPM+UnJtvpehcc2kpjXFGO0PIN4yjXLPzXlIAc85iY5QqfTdQSmY37ri6EScWEPkJ1TYgLSb9WotTQE6ZzfoCZz032y3jfmKzOWvBMhlnHbVKid0ah+/WLJKmkg1G9yQsRq+xVlHqjMaLfZNPLQVOYUxltZqIcWK9EUYzp4jpCt5opnGHdxImo5Wil4GfGCOlJmrRTOMEytLZNSVLVcIUzThfSz9LjeSY6bzDG4+J8MLFfX5DrXHOMgeRrlSlSTFiTasOKVDGUssMsfD83Xu8/tqrnBsFqbAukK+uuDf0lJDp3IAyEnd+dn6P1EBe0koY3aqpJNZnA2FWdN2OOGeqjYQ4sk+Kqnsomc1qQ0I3aZDoilPOPH70lswLNVORdDHvNMrqNsbKuDmOj+j6c6yuhGkkzjt63x98zAse0zu86zHKY1fgvcVYxdXjG7SVCKoUI8ZaOtcRamV9Jtrqmp+m0fz2bN8SqP7wp//IgZGT8aVp/BrLCPYwuS8dv/kkhPJBjqzX54Rd5PLOXZ577kUR7iojZQmdMG7FanXGenOPUhXGgtKWEAIp5VvNU6fl8ANQrWCdJaVy8JNMpRBixBrPrMOxdF2zgOs2UqVDKod0RtYGShebLdW+Z25asaMR8jIYHm1J4Dbw1FoiG5f3lDH6iXJ8294DFE8+R9izcut5p8fhaYzjU8Fq8x66VbLnvSB2Oc+nrO1BD6uEBSrI5y+2Y0uCEnAAH+9heE8A58LQHWWkTxyTuqheT3FP5fBCbklav+nctySgPbkvRyB++9y9l6Vu1xmKXGG7C3QvPMMHPvIyYf0uD999SJjjreNeGpir7Zpp0TDyXRadI2L35KzluQcP2Gw2fO2119jttofrXECnOgDYw2IJaUyrCIgyznL/2WdwTpjVcRzJOdF1YiNG865FKWFNSmnWVXLfrNY9xgySJDaO7TSeIMd2zBct8yFWtUgTom6gt+t6rh5Yvrh9E995PvShD1FrYfWVPfbdmZgSMcZma7acPSln0xJ3pCHTc3a+xjsn1RBmtHESmpEzw9C9J3uh6zXPfPojfGH3ddLn3+Q5vSLlRBoTqio+H9/gnWc0f+iP/SgvfuzD0i27GlBVolQl1FMCLEqQyk3NEkOakDjgGBPz0HPjEl892/E182VeKud8WD3gbHPOxfklNWfyvOfOxcBmMOS5EO57vvhg5N1hT36xY63vcu+dwNXDG+7e2ZDNu/zWF34BpUQTeXa+5v6Du1QSxnlSqEy7ka7zdL2TapZSdH0nDYBU6l6jnOV7/8DL/L5PvcCgNHpOVAW9W/Gsd/BnvwxAv3G37hf1HinF0x6rp/z+9qZQGGU51Xg/8YRv/hbtb3OZuObxcaX5u27LF3nKePdNnrn8bZFjAU063YgEKqpKolOYA6vVmloU0zRTSmquGla8snNl3EeMlfCUEAK7XZSeAu0ga6zN4tCioOs65nki59gqcwXrPSWJG4qwWkEaSUsWwBh7VBVSRFPpvBcJSK1yDVQLXkEt0rQ07qgkQpJ7S0WLNR0ueULuySlzfX2F954KbMeHpFjYbrd0vSOrC7nvqixYrBN3l873aCWhGgqNH3p5fzJWn9H1Pc4bau4oSeGdaO6t6yUkpmacG9BuQ6ma2nOoaq06aZqdo1SdFk9j2xeqyuQYOLMJY6TRbQ4juhZWZ2dM855aE6uu4jei1Y9zwAFWrXn8cEIpg/NewC7S+FtKavaJmhQyZDDVUEaNSYY7Z2fstgmjEuM847tOwhOUQVtDr0QT7G1PCBNoz34MuE6BsaSsKM6wvYms/AVV7SX8oWhSSGgN424UO8aUMBZyMtQM2lRQhRwDzgxUlQgxYV1HHAvGipNASIG4vWbdnxFTpB/WbIZLUorkNFGtXNNlriQmiYWeAiHMxBhYrTumOKK15frmIZvNBcoorm92aF0x6uz/xT34D2f7lkBVOaHYTbNXWOw5aKWAWlIbAdRh8DOIpypKVi/aaUqOIgmwhmQMxRhEmS4MAdrS9+ctYlDKoTQwtJT5l6FHPD0LpUiZtOvk5tPGoJAJxShZ8VjbUcuEMvowMMkKSh475U685U5BGRgUNIZUN4wkLBCQj2zRLR3pE2BHqxOgxm32Djis0tUJuBNGspWgisSRPgmgxKKkHkzcn9yW3y1pF/lJILcYZh727WTIP33Q9vVQaG5AVVfZB0NrTrlV4z8BhU/ZN7V84JMAu+3PYT5bHn8TBvrIHt/e4aeB5Ke9/mnH7b3P0UCkEJt/qEGh8J/+MO/74gPcb77C1776GiHGg6500W/6rmnAasWcnGOQ875ar/noxz7GZrOhfvx5fue3CuVXvoLfiqOB9555DpQs+e2ok4lVSgCiU8yFOM9cX11JpKLVnJ9d4JzFOfHzXezdnn3wLBcXFy3WuNIPPRcXlwdrlVe/+CVe/8brMokWcbWAekKENa1bFYeMBz/2vQwv3yenwmpzhr17xndMW5TSbM7OMLWymqCOEW0Mv/6Zz/CL/9ff4oWt5/3uEpAUOYV4E+dc8a5HVcXDh4+Yxpmz8w390PPo4SNZjH7kWXjz1MC+LSDu3eV7fuxH+VX9d/hbn/ks0zQCmlIhdoWXn/8ou3Hm7/7Kr7WkL0UJhRwyxkHKiTBLs4i1inmauFifsR56bm4ecXmxZnX/Dj5v+fB3P8uzL3Xcs2teOHsG73t811HJXJr73L13QUqJ1fac5wbH3mZeGM9AK85WK3IKzNOeobN0vW8aMQkRsd7hO8sUhQHqnKc5z1GyLPi0kapVzllAjGoJQmbA23MUmlgSKBlzNYr/8eO/DMAv/pl/B5Ti3//p/xkAfe9dKtB9XY7p22cT292+EQGyQNXN9u2gM68nbLnSONOxNheszdnJeHha/eE4xioOYy7Az7/51zjv7tDZ7rBI3nB5WKy9BygfV2y3xtZT+r6WirZQU3NRufsOoLh4VzLNr+59nSUdCuDf+Df/DIrKNM8Yo5lGcQtRGInirJlxv0MpYTpLm/9kcZEZes8UFUKQVrFDs1ks8UJAKUNRiu3NjXhhV6kUGi2xEZ1rsb4JnB6w1hFSpCQnt18xKFWwGtJccL6nlEycCsYUaknCJHpHShbnnNiy1cwY9pScMZ1mu9tjrKaozJR2cl5jYpp2ZF2oZsOUrpminP8YC5121FoIo1wLc4gyx241fedRtSclzbDyQKYE8Qu1WuP9imoNpSS8VtRcWQ/nlKzQWiql2vbiRJMq5xeXlJLIRawaa6443csCyLUAA2A13AMKpSucr4XBrDpSipOUZ09TAAAgAElEQVRmqZKY5oTu17z51rU0sJVKiSK7qUVhdYd1VlhmWmBCtTh/j2E1knVFOUXXG5SfmebYHBkqBCnjK1VIpjKOO842d7h3fpf97orOrdHGMIVHhJLwORNC5NJvKNVIgiaJND0kp0hVkXnOGLNmsz5H2cT1zSOst+SSZAxLmu00YoxhblIobRy76auoMjAHkR7VeEXMI85qclJ0XXdglPthQGtDTIFaEiOBFCNdt+LxzZ5H2xmjPeO0bfPW/r0T5Ldp+5ZAVZva0m5ohsFycUmHoD5McMdy5eI7KIxM1oqkKikH3MqBM8SbhO09UETIXELT7Vmh81WhVDFjlrdZwEg9lHJzrs0ux8sgUBNWGVKMKC0T8zzucc5gjOTAgzA2+WTAW4ZSAYbl1qpbA6ncZkGXTvSlfFlK6/B+CjAqpbQ4yXaE6sKungLPE/B6Ihko7Xea5o3ajkU9GauVEnr/PcjyZNC+1Yh0MpIfuvWfBiRPwPSiTX2ysQuOU8dB93jCKh6O18IqnuwLJ4+rOvWSrBzFpCK/0JiDrcrTt5Ou+MP5rAuB+K1ZmeUjl31vcaW3Pk7NoAoWdfJWmmnjefe7Lrmze4E33nyTMM8spPLCpOYsE5U2+qCbXI55KYXuhz5I/YEP86gU1N2OD9//JObj34OOGWs0Q9+Tf/U1Pv9Ln+Hq8RUg5T75egvLKQuzx48fs9/vGdYr7ty9xziOvPPOu1yenYsUIQvAfP6FF3j2wYODFAHVUmkQD78PfPCDTNPEO2+/ySF9CtW+W2vgAr5grvnuP/zDvPhjv5/kBEAprckpc2e1PnzHTGG7Ar12WG344Kc/zvDyM2yS5tXPfo7dr7/GWbPyknFFsd+PaA3TuCOmCHVg2u/5onqL3fvh2ff3wPbWqfzB//jvH37+g3wAug/AbU94eKX9O9iHPG3zT/l5BlZysfCw/e5e+7dsof1btm/1GYun6ZLO9rtF+T7ZiPT/cftO+e/Ff0++w7/1if9efv25/1z+cCn//Ucf/3l+5/NfkejmENFK0/drcirs9+NB45dyoe8GfvBDP8rH9R/mLL/EeX9J3/fC1i9zQxuraq2kGI8hFSzjj+LHv/OPU0o+NiEWuX5iDBKlu/jGqkVyJePXYk6fc2RJcFJKEebE+kwTrsV9QP/kf8s87vljP/sXAPgbf/JfJ5fI0K+JORPCjq7rOG9+mHmxRFQiGauVxiBWUF3z/pXF3/lmQGEkstq1ykBN9L2j7z3jfiI3/+WQI8oo8U8tEp5SFVCCjPNaU6pqGtLKHEasMSiVmcMkfstao0qFXMkpUZv3cgwB53q860gxUnUm5knmvJwxWqRJNVec6clFmvwyiWF1Qc5i/B9TQiuJV/a+YNSA1pWSY/u+Z6QkfR9dZymp0HWKGLetStMxjjd4t2K/G1HFYExl1hI6cxN2bPcTMYk0IDuP1lZSkL5auXN5Tue8NFhNAeUtzjhSKNzcTMSQWa3O6bueVT8w5x3n52vmNGHdGcY6lLakpHn76pq33r6i73uREWSZ4402mJawmGaN6xxKReZZszp7id0E1hWU91QD2kWGFZSUsbowTXtcL+c5q0hOAzMD2+st2+sryjs3dN0KYwybbs2diztM84oQZ2FkO0WMEw8++DzvvP02KFlI5KqoxeK8Ya0snbVMKTGGTCgZTEXrwm4umPUalCWtLY8ePcZWxdU7b+Gtb4vYIgve/WMmNKthw/XDx21ez0whY7UnlRF4l5gCuUDfb1BKLM6suU0IfDu3bwlUrV6i0paIVEWtot1ypvlxHjBQKxceVrwVo3qsscRpxmmLUZbBDaSqcUpRjNi0GA1dN+AaW6pVJ7ZKOjcmUrotl1W+gFhhYkUbuCQqHc2Nr68eL7sh5YTFk7LZa+QSETPm1oHedl3SgMQX8dBl31b3h8l7YbgOFk9LfN6BYGbxkj+u+mks8ym7Vt9jYH4L8HEkPsWjtUkVDrKH24D3PWziCUsJ6uA3uxyYW2BzeaenAcoGPNR7PveEiT75/wjuWxHniYQldXKN1PYll9cdABQc0li+WUMVy2V3OPjyuVrdZjBP93V5/ZGpPwJzmQSOzVTiD9zcA3Rp5xMUhr2C1Q9/B8m8y/QLr9BNzVS/SuUhtTS3mm4fl5IzVy+v+dinPka8GAgpoXVFGw/PdtQqFkNbpeg/9QHuvdTjH18x/M4j3vnC1xj3Y2vEApSUGzdnK9ablRh6x8j28RVhjuiLS8IsGk/fdQzDmsfvWzGfe5SRBDN0Y8eVwlnDB3/oRR7+8i/zS7/4i1xdP5bjWto5pFK15sO//wfoP/wyr751RcqlTaAiUZH7oUCzTVJo6VZFYo5X5+ecn284rze8Nb9GSDcCCKyj8ytqF8lnimHoOHN3AEOKgQ/al7Bna1aXE49e1tz50u/SSfePt3/g7eHLlUePb6gIKWGax3QME6UcJVc5FYxxvPTSB3nm7CUuH38ArbqTypTotHWTjSxOcEqrw7i0iHsO/QDqOMegRCKjtYF8GiFwHOeP0qfWqFSbprqNFyWd3MfKotxx5XL/8g6oCEjoirs8p+9WxJRQGEIM5NQqG85ijWTdlyWitM1JpRS0tdQqi7SYJlLKOHsmIDpnyJnOeqYQxH85TEJwlEq1qYWgcJC2oKX8r0wlhBmtDFpVSoqMU2r6ZEmLnOdARdN1Dq3FT3Qcd2LvbCCmSRYWyrDdzjjr5Lxg8L5jngMhz82ztbQFhXSBhxBE96rGBmKP44D0Yxj229gS6wQXzHNiNXTkUtiGPSUZrO7Q1jGnmVwEIyQq+1msG6erG1DiKRpiZLd9SN97rHOMu4kQxOMzxUxMlf044bquRZE6ilYCpIn0roFoFOvVBQ8fv840BnxnRe7UriJnPbmK37gzDm0K2sFXv/4aNzczSq2IaY9WAzlPaCONncaI60FvV2KJVTMeRd8DNeP8Oc7fF3251+RkUKayq459GqH2lJxIY0TpDV97c6ZMPdvdNRf3O9CJcbdj6Dacr+7hbWGlCrWDilwfOQSGi2cIKTKlCbjg+e4Oj7cjoRScV8xTRqsVtRbmOpNLZP/4hpUT2Y/SnsEXUskkJYsCpSyJgk4V55ud3++dBNVvDVRDlAxeIazUQauqtRYfQAzmUA5uQGoZfBSkNHGxfkBVBm97as5oo9EtIak2oBBTbL6DawozKc/UIulHpTRvuppxxqK16FGpkMss3nTQGCuF0RWtK+++866wlLUeYu2UWsKlFKpKc5VWitQaJ3Rb+dOAr24yh6VefQBfjUXUS8rSkTaU/xBfSnhCw3oin9At0mnxUl3A59IIr5U5sHgiEWiDe1XtfZfPUYf9hSOQk/SSZSpoO6jEbF9K/4Wq9BFkH7b2Pvq4KJCvdvweWiMG/0i+tMgxjo1Vy36UIjGrQvIewehSyxQvVn0AwwtTnKvYDNUD2FHNgL11lnOiAeV2KZF2jpVCVqitxLcAU2OW0IIWvsBigyX7qA9VAjkHxnIE/O06KKXgvGarFR/5gz/Iu29E3v6tL5GTsBLCzC7euRlpytOUknj3RcsP/MQPc3Z5xpjFRUPBIQJVt1WO1pr92jB85/OseZ7zTxh+/a/9HPa3tlyW1oSkNTFGpilweecSYzRhDvjOce/+PWop7McdOSfiR1/g+vtfYF579jWSyyT6qFCIIRKnPTFMhP3Im9M1u4uOPZDCBFhpgLQV6yrfePt32P3NN1ltOvqhwxjP2fkZm80Ka7XcY0qYoWGQSTTMga7rOdusiOEdXnwe7v6Rj1JqxNoBjYj6lVI4r4l5RAHW9EDPeS14tyamkd/85xLWej71n8m5+tv/2g207l2jNarqZp7uSCWSU6LrOnzn0UqyvmOaZdFWK53r6bx0YhcqSluUck2Dnqk1Q5V0G6ttK3d7jBJfXKWMGK4bTed9W5VqOmfJMZCrLOr340jKCd91TcsMfdehTGWOosl33h/uE6OM6O0MDH3XFj0ShThOO66212Q0KJE9eS9BJKLPHzCmI6aZnCMv/VdyTX/9zz8n4+5/I4+/9GfX4uTiBr78tbcYf3YGnck6kkvFGk1FE3OiAqkI8nz/S9/BR+5+kvdffT8U29wyloWyOHJo66Au1lq3be4Oln3LuEVtVaJ6WJgv3r/SF7G0pdbFinYptC3lk8MYWUthGo+Tm6rQ2eN97U3HfhIXjIUgubm6QmlDzksSIRIaEhNRF8Z5lAYgY0g5suoHuq4nzJpcxJpsTgGKJsZJYpVVoSjFGCZSjs2BIuGtQxsj0pwq+21UYko7VC3kkA59AKnOlKRwXpGDVHy0ChLD3Q7AfhcEMCpxyClFjq7ShVwyWkvFZB5HeWw0+/Ea74Qlnos0bM1jZhoTvhukMVhFcowN/IvEI9TcKh2ZEPfEJONpCIHdfpTStVKUmDHGU2uiHxzTvMPbFVYP1KKYw4QzkJPCey2aSKQKt9sHIEp6Vi+AejfvUdpSdKKgWhS2QemeGGfQM7tph6py/4S05/U33sAYS4qSlLkfJ3HJcJ5VNwhxlRMlW/puxc3NW/zab/wiMV3jbI91Hme7JsOascax6nuMdTgnoN+oHmuVJJJpjx9WonzUGkkhVyQKfrNG64p4R9dD41jtNWebexhnKDXgN4kpZOadsNslS+XUe8887UmhkvNjbraPWW9WpLBHqUzK0gMwz9Ksttu+wTzvuLhzH6o4UTjj0NpSYuZ8swIKnXfsdjuKWnGz3RNrgWTYzpHN2T8iGtXv/K4PkVJiDrNMZjESYiCEwBwn6RZuYMxoMdhe4lRBfs5pJqaRfnDt9RnrdUvxsNSaKehDl+YCjCtAFUAmmjqNtraZAjfz+0pjXgs503LoFaWObHfHKD5YyrsL+Coomu5KLz6WxxtfqZOO8ZNSeIOQJ0doAXG3WcYFzCqlmyvOYk/VOuFra7pRt9m2WksrEwGqyICjj+B2AUr14JSfm1WNbkypOuzL4XOR551Qjwc/zHqy/6ffR74vhy7xhRGVcptq2fCNETYyIFJzY0zkb1ppVCufLib78qD9JI5ZB4bEWnfQIgsYEONpkZeoVg7MLTWmldmX/dWLL2tj9VtOu0VJ+siJbu7Q+Kf0AagopSlIxGYtx2Wkbo2DAmYXBwFh8wVcJozWvP8nPsXlasMbv/1Frq6uJBWsiq5sCc38lfgNXvyel/nkH/2jbJ57lschQRav1aM9lESZxhTlWoiivyopsFutOfvIi/zKq5+j7ESr9LF0n7tqRZhGdtdWJhht8d0Z4xzZXl/xmek13mbH+u2RV/6u6LV85xjnvcgCYqbvHdZl+h6MKnh/xfd9fM35ne9FGxjHmWFYY20WC7aq8W7AOI3vOoz2dP1A13WNTW0Lh1ypNaBUJrgkg7lJZFWwncYrR0oFo2e51htTo23FKJFOmCqgx/kV1ni89WSXgGNZ6sEzL7b7oxLmGWsdznZUCqVKJcdoQy6xlVUNxnh88ytVqJY41zSNVRGzjGklLbImaQD1TmONbouRirIdRtm2MM882t2I36V1WOsOgCyk2OyKxK6qVmH6JAisiPeqMYQ5EEI8NO2klBlLYj/NdK5j6Fds50SphmFzyTxPTFPAGtfS2MRrs2YFNWGy+HUu28p4XGeWpn/W61UbGy3TfkcIAaMdOVYhE1RrLqsQU8R7zwsvvsR33f0E3/H4U6zTXbRTzZtXmuyUaQ2ALMlbJxWUWsVNo1VA9FL5OGib6pFdbSUMiXKW8XJhT5cKz7FvQl4uDhrqZExDEt/y8XrZTzO7aWToV+Qshv0xKrSp1JqZpkhp80lB7vHFKaOUgrOOaZ7Z7nds1udiZl9kIYOWFKFxnskp47rVocJitEIt41xVhDmAMVAzOQcKiXE3sloN0geAIceM0QO6ueWIU0dqfSOyELbOUZE5UMbrSkqZlANoQ987xinjrWhhY8rEVAhxQmWD1mL5tt0m9ruZSiDXTAgjIWSM7vC+o5SZnBPDynNxfk4MmlQiq5VoZlerDaUWVv0KOmk2Rnds1j3cQApQtTSqWd9BS8LqNp0cKyyrYcV+L01PopEWDbkfZE7ohzXGmoNuWxvLOM24bqBky+6mMAyaeZ55+G7AOc3Ndse9e3e42cqY3nmLt4ZplijqYe1JCbbbkS+++tu4ftcSEzs57weSzmDaQlUpRQyRzfoSrT3WiKWeFrTdiCZF53rW6xUhJ0oRlnwY1nRdj0KLK0TRpLmQEsQoRHzKhZRFLhJTpuRADKHpxT0xXbK/bi4uujb5i0hLfG+pZoueV+SsRS+/XnN9PWNdbbpri7UKlzVdHbBG0288cw5c3YxsTI8JtyuS387tWwLVt998G2MM1jk617FZbQ4nrlbRnuaUGYOUF8M8U1KUjv0Y0cax3e7Z7WZurnc898wD4jxhtKMUBQYZECl4b8hFupF9Z8lJSkyLsblShjCLBx0qo40MTpnSyiYFYyRBIufEdrs9sIzAe8rcuhF7S6bzadn88LpDpnYDq/rIMN563lM2eb90YKFbRayVwVRjEtq+aFgA8sIsQm3AD0lZOtmaiRBLg5ZSktsu+3TsGD8AhiV5SdUDs3z8Xkresd4uswswOwXpSxjr8npacpIMGjL5G47yDJrp/ZFlli72RRKAHJRmaVbhALaXzbbIwloqyiiq1gegK/tkDuX+wsnEhUIVqCTM4pnXDPNLThgteuhSZXJNKQtTEjOndlef+A9+5Zue36dvL4n00Lz3L/9iB7wK/JdfBr78D/i+sn0a+El+/HjXngaH7DlYDh23B/zzrokT32r//n/dbt8f8rPj9o7CcbHnua0LPd36p/zu1JfqeJDP12dyjWhF7VaUWok5k5I0ZUjOk8ZYuaaM6Ug54ozHO0dMsgi31uGcl2QgxDpoAbYg13sshaIlbjjNkZoVRue2uJCI3VIrqUJqTXbUSkyJisgkVJWIQxSM40SpEWMVOktKmneWWgshTOTaSt4pE9Ke63GHdR5tLUZrvLV0PaSYiG2NpZXoFkMKSIzw8VjNJT6xGLP0/YZcCyEk5mnGdU7OZbPBKkjJe7M54/nnXuR9/Uf5yPUPs4oXGG/bGCSL7wqHhi95/8Z2IovHWwwox4fLuKXUUoI+0dBXkUjlUg6yl0XGJPUiuZ5ilPv94nzF9fXN4Tsa3RpL21ZyoHMWpQpzCGglqYMpzBgrYFfrJc5UtQXM0dNYIc13KUdSbossNE47UtOFjvtJbIEyaGtQOhNiwGkF1hzGf11rM8fvUJ1npwz9sCKnRMqZ9eYCsM0gXsa8/RgO17VSze0GwAmJUEwmaY2rjqG35FSwpjL4jqoc0zziqsI6RwyROWb221k6wueZ/RRkgYbEcpYiHenOb9B6omRLmFfEkMnZsMuaUj1FNUu1pt9VKqOrI02ZWgZyTuJmYAzzJCx0TopHj66FPFEVaw3GWKy1EptdwTjLc8+/eND5p2anF+aZVAvQcX01kmJCYxn3hXff3ZJjC0RYrbDWs1lvMNbQ+U7mqFKxzjJNI7Vq+n7Fl7/8Ve7e7wlhh3MbCoF+6BthkhmGntVqAFXRXSWUgLcDc4ESPSpWUooYI42MVZ2xe5hJuRJCIueKwtL3K7Q2UrWwInWgyH1Q0MxzxHdeAOu8BIJYAbNFoVRPVW25ri2FjFFKiCRjcfoCbESVwMpIfHZmluSpDm6CIu0Cb6YZbwxaJ7rOglbc7Cax5HvKPPbt2r4lUN3e7G4DtbaysFY6Hr03aGOwztP3K+ylbV6REgUa88jnPv8FvO+EhSOR88R2O0HVaNsaS4qUQaw1aC2D6NL1KYOghSIr4kUjmbJoVo0xpERjIDQpzUKTh4mUAgoBrlLFPmU+I9oeS9ZlGQRPtI2KZcUur6jlWFqXTcL1lmNzu0N9AU3H7wFHMFb14pl51Jcu5en3Wlgd7b+ox/eQcpm59dnmkLfe9kOf7tdtoLqwvsfPOAL243mvt/bj8JMSq5BF86qygHDRwNA6W4/vUUr7/kqx5C0vVksHYHvwGS0LSXJ4H9ERS076AkhVbcBSKWrzIl3Yo1ZZbYC7DZytxL+Ah0ICbSTRqBTRYld4/KFzLr/4hAfSP95+T27h93V4I24cOVdhcYzG5gRe0sNyFm/YlKSjeLmmSi5MeZIEq84SQmYat8J2Wk3NpZVURXMpAE/Gv67vSaXIc0omBGFnSs3kUnFWNdcSubZ7K/tSmqWbs1biEhFQWYuCmjFKowzEEEhZkq6s69uiTeQ8c5gISeG8IxXFPI/UmlkNG8BIrKopUkihx9kj6M81sovHZq/tbscUZ1LOfP0br5NLxGsDubF3tWCt59ln7tL3a+7m9/HR/R9gle9IedNaKe0jqWoWaVy97cpxID2P5f7l/m4L2wqUWtBoltjkUlvDVD3Kr5YFPLke+gAWm0IBOg7nDSlONIKcXmW67rhYGoxq1S5DNPIZOWU6I6DbDWuRaDjDfpwpc8Y1m8QYBbioZp5fcmTVDUzjTK0Z3cD6qh/ofE9vBXSV2hHjTKWyWa/Z7STWOKWE954YxfpqfXcApEP+6voKlaNo2J1FYInG6zXjdIXJVlj4aZQxGydSpVIgZbztybMizBXnBtIsUiaLReuCVQ4/ZFa95mKjGMeROc5oI6xnDAXXDYzjSK0KbTTT3EsXepgJMaC1OB9AZQyzZNa7zDxJVcB5xeMdDegVcknkHDHKin1jEvsS6RVJGGcpeWQcR8ENRWM7z+PrUWRdxhCm+eD/XHXl5jowTxFnNDEUckS8V6cEumC14uGjtwHQxXNzc421jr7rKVVTykRJhfMLTWHPm2/esFobwGK7DjCMY0BpSGVCW4/3YpkXYiUTqDWyn7aEkEhzous7WbzxkO12KzHZ1mC0a/yMkQXtlHG+wxrTGnk1tWpCKpyfn+GNpe8HjPGtimrIIZJzIRcoGEprJswxNGs03cIbPFVZYlXUqjHWU6pI3jIF1a0oJjJXjXeeXeuX6M42KCNRvr9Xtm9tT9WYvmWgqBRShmX/58ksQ8dBU9NZK6sirVmtfSupBx48uMeHPvQRrq92pBzJKTLNQXwfy8wU5ub7GFupeWEcBTzkXA5awlNA6Zylkg5MZK2lGedGUo6tRCcDqW4r/4M2tK2qaFpOWol3YQxPQdpRQ3kEnbXqk5/l+UtZWfb7WG66jT2rsJCtq/0UqIo2q70np4DyCFSX30layAJil4yg216py3vITtwGoiemDYd9rChqVkeWs8X0LT6oBzstEDkGDVyjJQlGycGoKHINRw1qO0ji4dlYcg0lLhpSc8i2Pxz7SgPdUko0puWfN9H/bZZctWNjWmlGAPtyDSgtWjfTJgdjLQrx+FtSmkpJKApf/FPvl9+Tlnh6rDU4Z8lpZpz2GK2xrrLbXZPSzHZ3LZnQOTH0FqUyRvd0q4jVGYXBO4NR0kFeC2jXyd0x73FevIOVMWgjuu3OOkqeZX+NAKOuc5QKRjtiHKFUOreWlBwjjLPzPXPM5Bxb13Dl5uYaxXIfObpuIKaROUxiFdPiEp1dobVFazHZVnrGOkMKRkrZJkn3rPKomoFMRdwnSpaFYOc6hqYBKzlRipTCT31ktXKy8GhRp1pLfKvRXVuCzdK9XCrO+VZ6FcugkCZKzRjTYY1Dl8LcDPxjSuKKalpjnXEYZ8ipklJpDgiAyhQsORd2e2GotPYNpFqcb4072kDV2Kox2hHixBxGKlICFvYjSJPFINdTybDZnJNyZD/e4LzHWGncIUFVirFEjNH0K0/FtMlFxi4NaF1Zu06uqSLjidZVMuQ7i2lG4TJ+iV58ikGOc5bs8loLNRrojtRI5zu6fn3wJSgqUSjc7DJffe0tqpaknRQrw9DT+Q3OrChZsdo+y/f0P865uSfVIS0pR6k1POWlgVC3MWghBZYxsyIOGK17X7XxtiF8kfeochjflnGpLIC3cljIiw5QxqsYA1S5P43RrZp3okm1it4dgepFv0IbTYyFalcy3jhw3iMl50LKEes0RmVqqsfueTI5jPi+wxnD4FaUkqhGPIqt7SjAnAKKiCqKmmTu6K2TJCQ0Kyv2dd41zfS4x1mL9T3jNFGrwioggzP6kDPf+RUoxewqMUi6kHWXTb4g52S7e4zb9ExT5Gq7QxUY/HBY4PfDQJjFgmuegnSvl0KcAkO/wlrHzc0NvdaE3RUWRYgz1Tp0EWAf64xSEec7rq9viPLhjDERiwThdN6z348425NSpe87QphknrFKQFeZW0XQMM0TDtfkIQptNTEEVIGxyQGcs+SYyEk0+rp2DEMBlentwKQDqtfUAqu1A+NJMbI+k4AGYxzjfsI6h9EWbz3d4MlJg650vWW329KtLE5fUm1q85GTBQeF7Vbsu1KSqotSiv1+JwvNtq4yW4+qimIlilfbJgWrwrSWktEocgqUmyxjbtNo59Yb8vDGMPgVXd9jjSPOEe870cem3ObwAaqGqpnnEe8t2lhK0ijlsUqTS6brBlS15DCjrG3jp8HogqrS8Gq0PYRQa2Uw36zY9W3YviVQLSWflIIXBvDYtBNiPOiMCgoK7OMIVVbXq/2K3g/03ZqrqxteffVLaCzGWlZDx/n5BZeXd/Be89wzkt4RgvifGmOY55Gu66hZStsLUFxY1WWVJv5xqbGjAlzCHKgUSVgoNJ2RbtT7CXBcSs/1OJgarY9l9wMDe2SVD2DtFOAtYIlT1rXddOqodT3tyjfK3pYnKGFaDw1RLJnuixpTU1tIwal+9vb+cfv9TrWzbbxXLBYvi48rTffVYknrUdeZT5u0lHjQHRjcpoddTOBpQnHZ+aXk34AxrVTf9LJaW2qRm0M1w/dc5ObRqgpD2jSLAozk8w2i28250FkvZtpUiqroFn+qDwsWS0XYLtGiZawydN5gTCaGma5TVAoxTmgnRz3Gmc5ptM4M/XBgoWutJDNjbJTmO5vRVjSbd+9e0nWeGOZuZBcAACAASURBVMXQGyzeDYzTjLUrciqMMeCMoiC67TQW+q6j1EScFcb4pr9OzGEkTqHtq5PwC++YwywDmimkGglxJuTIwBoTLRTNfhtk4sqzAFAFMUnwhRKjQUKKONciE6ssnEpKqBqpKTOlGa0NXSd/L8hCr3OerEVvVZJCKQkWyDnhnKLzHTkmapYGBr8SjV4MSSIivcFYSwwFgzA3KQVyhc731BSYJrHioRS00mhVyWGkFIX3A6qKj+EYEqv1hr7zssBSCqMdVGEulSpknahFdIjeeaSpLTZGzVJqpCYlISTG0rWu6hQDaDDeCyObqiRyNtCQa6HmKJPd4A8OFVAPqUEpRCxKjKhSoqZ0yFdXShGS6FH300iphc73rFdryVzPCZ0Vfb+m1sI8z6JDbN7V4xwJIdF1nmEQ7eE0R1RoFQWaBy6aPE+HIeDth4U3vvEuL7bH+52i61e88/bbPHq8Zxju4LsVdKaxvpmbm2vu8wIfH/5J7tv3szREGWPkuNd6WJCWdg+fNkgK1yHjxPL7ZcFSyknEM7RKiTDeSqlDKMjtaGHVKjFZZBpKoQ1N612YRmmeW5QixXqiOk511XpRRxpwWpj4lAraVKZpK011tdIPgzTZlYg9hGdACAFve3zn2d5sqUTu3r2gpEKIwrA7a9jtt2D9oWqXCxhnmHYTvnNi4q4sg++5XJ3LHFYrThms9fhBIlmd86QYyDnQubWUvs/OiFHjO4c2Iv2YJtE539mscc4zh0QqiZSyiC8aQVBrpQyZvh/YzTO5BLRV7Pbj4Vw5JoaVx5tLKpU5itp+DHtyUVzfWGJMFMCdn1NKxTrHo8ePKaUwTTPeapy7S04ig1PF4k0HSmFasyI2S/JcNZhSUanQdz26czhrCaoXzXMVSYDI/BR955jGEW0062Gg97aBLQ1KmO7Nece098SoJTiokRx3LtcopRjHCatgczawHyPW9njvGIaeysw8zcQwiQRBG6Y5YawRSU6peO+IJVOLJoTE4DvmGBrRsG99GiINqiW3FE/FPM0MXScLtU4CB5SS8UpKgRljNTGNhDHh4g6tFVZrplwpu8xq6KkU6gydF7CadSUrT8qaWizTPrLqXCP+ZNEAgpvONheMU2qSSen8l0hVSywS1ODcPyLJVCVznNyEjuPIMkp3bm36oWUVJCbpFYpM9IJ3NNRCTHviHKnKMO77ZhWl6QdHmivW2oOmMyZhHKzVVKPY72ec9S0uVcCqdeJ559oFsDR11ULz7FOYzqJSbQk6Mmpqli7wJCvvWkHZk0K3bgPvEUTeAoaN3TxKE1joyPbck2qVOoI84NDlKu9RD7GtC8JcmgVkLyri6l4oYrh3mBQkgm/5ucktUOL0oWpr6DkyqlKE121CbeXy2iJiEZanlCqfqaQB4bAoYNHNyoRRSwUt3d2lFgEUZgHdzQJLQynis7dMYhrwTR+qALQ0Z5WcWjNVpZSZFGacs6QU6fwK7TTzNKKQwaHzVgYZPUKegYw1BWNqO6ZSstXFYawBFagmy2HWCmc8ISScFqPsTEXVSVbrJVGLsHO5BlKZoCpSKk0egjQh6EqNlRQL62FDXJoLFfT9iv0+UItF1RVK9ThXoCQ0Ba0Nzg7UKl3VpWhiTBKpmgsGTWc6qoaYhF1zvqMWI9nenSFFGNwZZ2eX7VrShJjJObWYYkWtUXwTnaMohfcW61xrUtBo67FWfC9LnikuN92bxnkvndVKrKWqraQ4EeaEMRZnHUYpmUCjLGjX67U0LRHZ7W6oFc7WGzrvMUVhsLiqKHPCZYXximo0fTeQi1yP2ghorq1JUJrexNRclYrtNUat8BX6KtrkOY8oL99TaSPNSEVY1Yo0m+QiTZnOemKapQxbK916oFuvpMGjuVeUUtFWtH0Gh/eaYuXYaqOxq1W70ZVo3ZtEyKAwxgkILpLRF1NmDkGM3pWiZgGbixG/vL6VsZWWVKBS0Aac84ythJpLbkldqnkeSjm6c56cKjGOskis+tCAmXLBWiVRiW17dPUmv/ALv8af4KcA6L5+h8f3XufrX/8aNzePMW5FmAMlZ3ZbWWg+q57jk8OnecbdP4z9wMEPlROp0LJQzbm0+eC0PH8qI5Ixr56OKdTD85aqmZTYG9BtOlZjZaG6+J12nXR6L7KKEAvDYIgNqE5VsZ+OXrVvXD9knmcZN9NOSuba4r1lnG5IcRaGdj9weXbRgJ6WcJksMai7MbKfk4wLaOI+EkNk6AfxTVGKy4v7VKVbo7E5ObcaXHO5KY5iFJki10BFAK31jHOCIh3fpQZy0dzsRrQq+M6jtGI/js2v2WCsLBCGQXTa67VlChMpJy7OLuRYzHuxsWvM9J1+DYjzw/laFvQ5ZS5WvZTelca7DXOcCHGkcIdx2jEYT60STlGBzgsgzy+9j1ISV9c3+K7DaQ9KcXV1Q86FaZpQxmKMEzYXjV2LHda5W4njxjLzlYKxBWct+5zYbM4aKSLJfrkXjW2IkU23JuU9xSpSdJhuzaor9KYn5+GQBKg1eNcfNLA5j3jfs9lUcpbFREyFmCzeZ+Ic0Koy9B1hlmtWdwMVwSu+iD5dV7Hf00pwTSkzvhd1fG96YkoyDpdC34usppZCrsJ2V6o0YUJrCK9441qEdpKmTyP3VcmphcxkUsjkVEQ28/9Q9y7LrmXpdd4372stYF/OyQuTZBUlSnLYClsNhx/AD+EH8NO6647VcIRtUSVSVVlVmefsDWBd5t2NfwI7i41qiiQiMjIyc+cGDrAw15zjH+MbWpOLeUyhukmsWep1U5Y1nNbp2uCmwPI0E68bpdxQuhD3yPPLJ9bbjawChGf+uTz+PEfVKj5Yog3uKfChWKEsqknzTqvtMULtRmFax9qJUm7cVU9rPa1o+aKOjVZrGaULaa8y2n2M3e+bHv1QJVH94SWV4FQbtoDBqGzSDqQx5JREwvcLpXV0a+iRFrRG0nudj+arX2KdPjapf+om/sf8UAFOw11pvv/nPvBBnQ/8kiz57Ze/7KFMyGbfPJTJe/r9PtK/w+iHu2AYz+9+TPndxspraeM5jNUDrzV8nvfRW388K3fGZa6CRhI18662MkbOMt6rVTAlRrvH2KNS5TVrjQ8yXq3jhlNqZp5EUfbekmMEGmFy7Iew+ay9y7cyFso5imWjrJTacX6h1gu5VNbtxmmZKUl8OpfrV5yDGA86EpJxVpiHzhhKyuAUcY/cUVbGOIxy5LRTcmNyjiMWcsk0KjE3FKIKHTHJJscqcu6SIu+dnAUBo7Qi5UQIjpR3vJOO6+ttZzkptJOGI/Ao23A2QD7QVLybaFU2+dJMojHeY7UbSnNntobWKzFuOO8eZRvxUBz7yr5F9NMrp/kblHHEGJnmUf14ROYwkasoU/fNkx2w8doaU1gG37COsaYEZmqRxhPrDCVLbaGQHap4/rrHu2VYChpldMN77/F+pnfFMltOpxMlJfn3LkgyVlusU2zHRi/QrSXlSEyZ/diEXdxFMW89o7vGaosxMM8z1jiiEl/YfmyixOYiXmPVcNYzT8vA0TW8FguQUhljAikn1nhQapJxa0oyih2v25hhAeodZ2XutV4utFYJ3jP5IBOCoaZ4H6ilSVLeWLRRNC3rVutdFLs5oGsVZVgrWXusppRM6515mjifTkI+MaKMOmvG9KdC7VgrI8GciqhFrbGuF+kCb9INb5RC6UoIQgrQWl5fzjzWAYBvvrH8jz/8LfxO/vlvy3/g7fd/Sf7xL/hf3bc4LyB0ZRXdyQH1yfwFf+n/PUqNNRcJYYmXUXaiaggA98kMWprr7t7vcWJ+rHcfa2lHayuIu7EJod/X+Q8LFIyGxM5Yn2R9dO7jgFy7rGqtdfrL8QgX/vT1y0MoAPjp9jOdPlQ0jSLhrcN2La1SXTFNjq4r7/sbSlusC2zb23gdhhKFfjNPZ8I8cWwHR9ppZrzfIxSjWh/Vn5ojZ0or5BIhivL+9p5xVnGaPbSCt1IwULZNGqryQSod4zLbJkFkbRrHIaFQrTolix8vpU0Oa0b44q0lnLWcl9OA6BdUU2irBgC/Mp1mWlOs647S4JxG6Ya2E1SLnjqxrHJ/wDGHCacci1sQbNtEzgmjDKULZrKphj/LZ0oFbTXLq2w+jTbkWsm50J87pZ8JYaKUyvW24r3weOMR6R20KXQ0L/PMfDqzLAv7vj4mV7XJ/R8CpZwwphBzp1aN0gmUwUxe7Bm08XmL+u6MxvlvQHVyWVnXSiuFXG60bslJbGF+EnrHNE1yXRo9LEuG1jTBGdzzMzklOrDHCDiCm7Fd7snOerQW8UeENMFTHWXHWy9HvyLfjTCdxv12/LASO1JMCd0UKEc9MrV3dHOkXaY/1lpybRLEcxHvFTEWWi14t4gIojW9Fn783Y+8PH3CO1C6E4zhND+Danz3vNCbJsY/LVb5p3z82Y2q+0Vq+y69aWMGA8wKh9PIxaf03dB+/381JnhIEnpy04RW5rH5VUqevHeNdQ5VyqMOkNYx2o7NjBscUfFw6YEKuZ+wtTZD4bu/auEK1p759V/9mu9++MyXrxutNva0klMj5URM+6Or/v73e9OWXDgajSixrbdH3Wm/p8W7bKXvf946fFrGaBplqDl6jH2GxNo1CkenYGyhM4s9QclG12hRR7QqQEJraQi5j21GRRi9ysa2kh+qRO+dWtq4YchprzYJd2ilaNXIJqzH4eUSv0qwCm/G4luO8WfwoAQn5KxhW2+4oAYI+ga9EbwmlSvOKfEcV09XilIT52Wh6Aw903qlFAGbyp/Fsm0/AZUjFqy1WON5v0bW/WepzsPSWkKVZ1Ic/fBAbTOlwx472sgYLShFqQWtOjHv1O7YdsE7zeZJqiUt9CaQabqR9hKlObJgYjqFMMuC65ymVjnxKwxOW9ykKHmoU9rRUbigKNcqnkI3yWjKGaz2whI14n90ztCVtN8YLc9dR493zoUwLaDuHOA+xpedfbsyzQvn0xO9NUqRznvnJJxxWizxiBxxk2tXN5ZpRvUT1QbmyZKyA+VHm1Bl3wphMoKOURDTLteC1ZTiMeZEb42YD7QyD5i2HHLuPdmOIx20lHBefFvaGopq1LpjjMc6S4wJNzmSUlz3K1obpnCml0rKO7VqetQCJe+ZL29fcM4SpoleQBsJL/WshQGJ2E5KraA6MUZSPEAJMcQ5S1WGLRUZjdLITfi0vRW0ks51CfBBa5luKkobtHWkVLhedqbgmGZPbIWUMjEWnPU4HYjdjJpnx94N+1EHkLzJTatIMKrk8rA/1Vow2uG8KHala2yzEuKrwoo0A1RfaibnRitNLButk+KO9bKO5NywJgBNcDQacs44Z/Fhgg7OB5zXY5IAjcgvvfKfPr3yP/1339HGRjV9/RU6fsvL+i3//unfgGqD0fmxuVU4NLKBaGPKpK0evvL8UFMZVqPeKigz7BcShLxPoYaH5uO+0jsxR5ko3Cdz6j7xknvFHWXVRnahVgketUeRyIfNSBBdiuJ+oaB+/QnvPwx3f7zepEZyWKBqk/fwtu5oZfHGEUIkBMspOI59HESUVNeWLC1P3k3cbm+8mGf2dEhDXI48PT0LzjFecWbCOc00eUqStPoRC61nvDNc3r/irOXT+Vd0hHSjtMJOju3YUVpjnaIqQ6HLiP6IeCcHyFQizgaxBzQHxpFTITgP3fBl3Wil80mL6uenhZSu3LMctSSsnbDWkHMid0mnW+NovaCSHMRSzFjryTkLkN97jFXE2EVFLhV38nLtK0Uqjn3bqb3INdsRjrG2WOcpubLFg96Rg7jpWAezf8Fo2Hc5FOSUyU1jXaL0jtENYyPOLsR6oSRG5fGO1SNUWTbcNEnY6RDLzvPLPLIJneOIpLyhlWGLV6zWaAPBGbw3LF3ErZgauU7sozTAGM1xyIGs5gLFCCM2HygjSEarLSbI99U7C1nRlWzgVZdSA2e11Lf6mVAdz89PItIss9RIB+G2ymFNaEhaaSYTmMMi6LGcCJMnxUxHUGPHdicfwHl5IkyeZ6fQ2gsjvjXoFuc0x7HhKVhEtdVdMzlPLgXrLFBx9vTntof/TR9/dqMqSsy9X0gUQQk1DH/oGMko+kBnSChGEFEVZeU0WVphXhbhoPYykC8jsV+LcDO9FY+esdTURthCFM8Yo/y81tRWpK7OCGQb4A5TN0ZGqNooYtr5+//yW7759gWN5fQ889m/0quMd7UWxfD+17atpCPSkdNcyYV7orwp2YBqIz4Z02Xcx+jbNtpgjacOlqBSHwGhUuIQFBS9jcIEpeldLgalxLPZWheIvu6j/3yio6ll3GRaQkb7GoUhxoPgLNaKWdoagz3Jl7H3Rm2Zp1kUJZDFY5kXjq2hzU5XmTXtWG+kgalA7SvGymLpnJzcS2mksqKbYnGeI38VH2DVdDI5QVeNfa/U2jHWkfNGb5UjXsi54H3gdHqRMVnUONdkA5uLsAStqCdLOFFKZZ6e5MbWGyFogpImEju8f90gsO2UsdbKJtA5rPEDjSPJ7NIU03wmxhWlFfMyoRHPJapzms6ko1HZqaUyhRPGNtIBy8mQy42Yb8zhlRQL1hnm6YnbbaMrzxTEViF4GyOq23wixZ1peKu9C6z7itaJp7N0oa/bhm6K82lmnudRmFCYJs9tvYnK2qUDe3ILXRXWm8Y5izZnSs5M88T7VeD+OafhwRr4JeXkeq0DYabFv9jRGBdGg06ndk06MkrVcaCJtF4o7cC7mRh3mVw0R6kbd6WwVrAWju3KnRpRSoFhzXAuEKN8x4xR5FylirnePciWbV/pFJQRH6pxgdIyeb2O77XC2pne4Lq90cmSXleW1grOBsLyTC4HuTVUk4NZKfsoXtBctywbr1YpRdYz8R3OaOupNYGdwEzYUFlMkJGyMljj6GXD+Izxni0n0iY+3zLKRVopbNsNlLBwBWFZSfHAWoM1mpQqrTpJx7cso88uiJwpzJyWhevtwrZtfHr9TG2VH3/8Pb3BNAeOtBHCwjyfKCUJVaBK6tfbCaM8StXhz+74MLMsZ3rXvL1fMUZxPn+k/v/z3//IufzVY+H/zd+94YMnuM988+nTsBnJRlUO5ZVW+2PM3sfdQGsJLbVaR3nBR+2oTGfGwV3LGq70x/SptvpY/0E22+u6spxOIzz2QQWgD9qCuntg+7A8DbZyvwsk901rRenGUf/IxP8AwH/98ctDUAD4zd//gZiEDqMYB+3eOFJGayls8NZgnRyAWhXvfvBOfvcdHG8s1MY8QnTHcRD8zLy8y7rWhbk7zxYz+rRPyxPHvlJqxDqNNzNKe358uw3/sijUpRdyyhjlCeHgt7/9B5bTwvPLMylFnCvEGAU1Zd0IU1VakenR0/kJreC2X9m3yjfvJ4Ix/M2vfkXViqwbNjgWazhixDsJDbZW8LZjzSDaWMsyBY7jYF7O1CI2HGucIJFcwztNdx2nNc9PZzpQW6c8z6Qk7N1GJ9cy/MiGXUXOXrz7yojYcFrO1JJxYcJP4o1NJZPKjlIyxdq3neenF4zubFsg6840TcMSKNdDeRFcUy6NOFXmJVBrwlSD9xofTmg9EWOm9Ya3jpxHuMgYYjb44NmPnRQT0RiUkezAsjiMNlwvG7olPocAwTPPJ/YjibpNwDrF+Xxij5ljE0SWhE0nUZO7ZCOq8agUMS2zhMCxF8qeeJ3lfSy5gamPrArN4JTGngLozoyRith08PTXT8QkHv9pEmuZUY5SOso0aq8YM6OVIgaPNdPDZtmaRnWFNSIMGisHsX8ujz+/UXXy4YmjUCMQc40e1aOoDHe80TjYyuFaEp1WKamkfARuGEl1uN/0es9I+F4WH+88sVZK/hiDywjaPFRL68ywHuixea3iORmg9DtL9bf/9bf8zb/6ga9fDqy3aIdAfLWSIIkThep8OvHy9Py4UMvYHNaaiTlzHDsxJfbjEJ5hyqLadEGzCLtMYbSh38fyIAxPO1A4TdNUBSXBDpSDLiqyUhqtKr1nCWGMJLxR0nQzTZ5l8cS4ktpBI+FPFcWOt5rr21c+v35DrVe0rthg+fnrF3puUmGbM/G4gD5Te6ccGaUbX95+JqTKMp+oRUz5cduwxrMdDpQo59ZaSk6sa2IOwqAz4+QuqV2gVcIsEONeBZJ9Xl5RCHajFfDOEdMOVJyTakzvDfNkOfaM0R4/C+fQu2dSyuSUeH19lYWoweTnMbYVRuXda+bchB7hnHkO3K5XUOJH6q1jjZFmM6XZtpUQHF5prNfEHOimc54npskTXWGZTrT2hFKNdbsxvXiUkjYiExxaK87PLxjtUVgxycddpgNhotREWBZcCKhWOH/zjSgYtfJ8OrNeLyzhjMZwnk7iSQoey0zJhWU5sZfCfmS+fP0DuTS6caiu2Y9IxWB84EiZmBJ5vaC7YQ4LzhmOBM7KYquNIUZR9NY10WjUehDLSi4HvQscvLWMsYZ5nslxF7xblQNITo1W7x5SRa6WThvBtiJqzLBFLMvCsR+PMKRWjmlaaL2wbyu9Qe0HSjdUk0mC7EXssH5sKCxhNmjtyShAGum0lnR1boWghJuYcyXlQi0bMW901bHGo7HiAR71dakkrm9XjAlD8U44O2GMJ8Zj8HU7HVFEt32nd/EdxxzHVEWUJq0bYaiYtYqq0XodN/I2eJCakjs5a6ZppvXM9XpFIaG3luvwLEuFdBns+q4at33nj29faLrT2jsKO5ZasWqkXKE0vNEjbKgJYZYgqBGP+HHEcV1p/rex6v7H//s3/CrP/Ovxz9fbil53tFEPwofijm+64wilEAEYVjB5PNB26iP8dD/Q619YsX7JRZUDywdCTj08/BJSstY+JkSAgO/VKP3gHhQbvMl+L2P4sFoJxq5ypPcHiffLly8P+wDAcRS0tsSjPGxWTY2beqoiXmglgUl9FxY0WxtkEKXGlMKgnKK/NwkWI4FAe3kfBzXJRTgn5SVWWZSyQw1Oo4DCoLqghJQygkHrYrW7b+RRisv7O+fzGWt/R8pRfMFaDhMlV3wIlCJ1slpp8VvXgg+K56fPfNkO0rHxFiMvz2eUati9UVJm3S9463k6vaB1p5YDbx1pFzvF8/Mzx9GIiFcyp8757IlpRzVH6Q6lHXaeue07l/d3CURpjfWG9/XKMi8YLYUW3sHZS2mCMhmlIfiFbAvaDsxgd2ItKBllIB2FqmQzV0vjqFeMdvizhHjP3g+/smQOrrcLHJnT52een1+4re8ceyZMlpwNy3Km5I414huXPYMckJYaeHp6Yd1WUtporcimtjXx2xtH/+4JqxRGHVLnGmZQZuQ+rNxfvGPdVlS3WO0oNWGN53aTddF5TYrCo28loZRm23amMGOtKLiX92NYRyypCJ5Ma0PtBVQXL/O2k5RmdhNP85m8ZLGApcTr8ytKGbbjwp4Ocq4SHMUimV+hg1jjQCVqkjZJrRTPT/9CwlRSVffBphQMwkdneRvjXHVHLCFpWLqkKGdtRmWhVB7e1VeJcjZ6seN0bon5kE1OFxRQjILouD/uqX45TX9gjOogE9z9nVrrgaYBweIouRiRJKK1HWplVw2lvQQPWpMRtLUorWT0rxST92PMeub11cnoR8lIl94oeRcbQTzYto1SqowV0hh/jAXfWgOqjUXZ0KqowaVHWhXEV2PFWcMUnji9nHl5DXgnpvGffv49R4y8X/5IShdQmdN5Yj5/S44bt+13aP2FZZqoHVo0eJd4u3zBWce6Xdm2d7r6nt6lgcdbw+kUqNw4jhVnnkh7prWM84sEgXBYJwurUfaB83KDfbr4E9oorNPs2z4SuKIsyhc/U1uSEVHKOHPCICqvC4ZsHTk3ct4w2uDcRE7iPaRNvJxfKKFCBdulEcR0uWns+4ZSmlNYpN4Ow75G5nnB6wDlyhw8vmmW5YWSChZDL5W/+vw9yzLLTSlVknUYY0ZqP/E6n5jCjGImhIX8FJHGH0dvlev1K+flCedE4cupUHtGA9Z4gp9Yt5XeK8e2c2yR0/xEqoWUkjTPKEOumZoiqWR8mHi73jj2Q/q/v95Y0zspR67XK8vJcd3foYsl5rLehldZrCUxJoI7s6eDqhy9Gvp+o5Sd3DJGL7RcKCWS60ZMm7TuWBl/ti7jSKqiVTlQlNLoHOLV1Qu6e2rbaUiSPucyXoManGI1Sh6kMca5BcXY/HWFUoHeK11lGScrh7FqbE4b1mk6DuNlbL2nG9bNMhouBbqjVoX3DihscSf4CaPCI1SVmyzme17RaIK35JoouVB7GYebMlBoDWdn6Ib1tn3c6G0F3dnWPFpc2iM4VCsYp3Fe492Es4Haiozu8i9QaPf1cpA/0G9imyoNa8SiU7Lgz4KfaLZz+fknam2clzNVW1JdyUdEqYHiUQ5jvCj1VuNmRxis2JyE5Yg25NJJuzQsHfnAxo919LLv/Kb/v4+NqhoqVCu/LC8Zo3x+sZEUAxKP1iiQ16RFLLhPv2q982PNmHrZgbG6AwA7+PDYnIpxXp71drtB73jnhKrQQfU+yCP3zYQotx8S6S+2oA/fq9i77o+Y96ESy+NOwJDQ6z2RX3lwpbsoXlpLRbgeiLKOGjzbPlSsQooF7wLWOmLK9ARFFVqqlF7oppKiBGFpihglJKwt9C6ff2sQpoVSpIrUO8sUHIyAldYWExyxZHIThqmxmpoKtcl7krso3ff6ZbIcmEy1XLbfoZHfZ376grMe4zo1a44cAVl/Zvc0iBM3WpP7iA3w9HQi50LOleAlrX5+OtFyZL8e+GDx3jNPE7lkttuNKUw4a/GTiFOnKELDy8szvQjGSUKO46oYhI9cEvu+YXUQT7freGa0jmgVOJ3P5JjI0RAmsR+8v7+zLCeMsY/rajaefHql2ZkpyCbWqMjpeaJVsTlY47GmE+PBMs1s+zqYt5qcV56eAikb9uOK98KKV+Tx/ZulLUo58fUHzymc6U1jscxTkMmYFx/6PJ1oWjaN9gAAIABJREFUWb5r33+WUOI0BVpulJLQWkLpOSXmeZb1oWbaX4ko15US/2lFpgt3KhGN9baSchZ7Smcweg3GnIHCEQtPi8fqhn2S4FaqSayGWq7nXhTz7Il7xnnDvHjyL9aNf+rHn92o9hGqafeN4NhkCrS9DRizjIPuiCH6aH0yGmMVqUTKwC1grJxEewetaUb8Stbc+9kVKUWMGf6Xo3IcB20giEQ1ldF2CNMIt2TuXfP3xGit8jPHvmGspusuni1t5TRCfQSm7kGqXMS3qrXmUMO3ihuKbRuKw53RKRge8dxonp4+8/rpGxkXIl7RXLKgTlJjXW+UHElRihCMKVwuv6OYn5n9C95qfv7jf+Lf/Ot/x/PpjNM7f/f//Z/87a/+hiNFbrc/cl0vhMngVOV5npi1xeVGrp3z999TWhNEkxYmI9rwFF5ofUfPjuf5O5wVxErJBzF1vD4zzd9Sq/D/iou8vnzPl58vnM9BNt57xPlZ0vEtsh83WtNCYXCeaQ7jdDZqHFtDI/7RrDJBC/pi8QHTlOCtzITthmA7pkv1boo7p9OZ3D3NNLTy/Pzjj/zwww/QFcbP5JTFjkHlL7/9C97fr3jjmWZR8b49j0S7hu9eP3GaAs5KiM8Yw7HvtCajOu8CNjjeL1+ZJvHQplgwaPb1xr6+MS0nbpukZjHiMdZG8X65cl0zLiyigJciHGCrqK0QvBdeKdK0klvhuq0cw3f09e0rITisX0g5cbxf5MQcIylHmpJAVy/imZu9wSvPun4Zie6Ks4ltq8ynGecs03TCmkDvhcv1DWefaG2lk9j3TPAQzEJuB11XrPO0rqktP0a8qEapB+t2obZILXGQOILcrFWXJrkmwbnWwSDIN+PkO9uBXCreL0z+Pj0psplLFa3F56q6IxfFvtVxuOzUVmhd0yt0lWk9c0Rp6Ck1ySgvFuq1odVEq+JXXOaFUhNHSo8NijFQWxJrTO3kJIQJY4QK0lsj58Jx/CRTHiXKlISi+hgJQ6qjOngcolM6IGlstLIx7JtYe3obyoSsiaUklPJoXWnIRlYqnkUpMnocXI0lp84t3YjpgA7X/YZSnZx28aMbDUVR6y6bD2sIzhOzYo9RgphNsFd1kEx6h1gjXdUxEZPHHiNH+9jE3Q/3DD+9ECn8WEMHPaDkB/mlj4Y3SePXMUW7bzo/fuedJ/0oIhktT4xQ2T1Yosdm977h3Pcd56WS0no7cEMj6Dog77nIQeMuTtyV3f4Ii/aBiBtXX/vTxrmUszyPc2OjOiZgxmIGMeEuSMQigTXnArWPNHXvmNrH9KxjncY5j/NSxytFBZ1WKsZKuK03RcoFPUI4bkD1jfNYG8i1UXrkvMw8nRe0qoTRTHR5v6G7HqUDjUpD984eN2KUaSK1YUZbmepdrHBWqn33/UZJGkyTal8dQGV61+OeV9C75WsXv6ZSB7V0Jv9Kixs/X36m9fbgeNZaoNfxfXJYax5BI7k/j/BhmNBjqqX1TYqCfvqZ3gvzMlFyQsXM88uZmMQz2qp61B3XWunWEo8D5yY+vz7zdXvDGwkfbalIkLvNg+nemSfPuq+8v1+Z5kAxKz/++HtSjjyfv+H6LmxnxgHf2YnT8o1kZmzH+dFCFgSjZzkg7fgwS16gZ7yZ8GaSNbJG+XmjaE1hjcdYR4oHxhue3CtGd0LwpFagwunkB78bGpneR0EA49CHWBydm5if5gf3ddt2Ys5YZ9h28aNa53h6WkYVsVhtzudJWqqspbTIugpxIOdEmE+UfJDLgfcnbungNAfSXtCqMX0nQa4wW25v/2I2qr9IrrePthGNRinBOUgy340xhIRc5O+Ws9LUdWV7v+KMoypFURplDLFGJiE206vUf4nZF5pqaCsjp33fxe9l5bQkX4R7+OSD8Sl+0PIIWllrWNft0VAxKUtXkGJGqTYq4vr4eTnVKjXq4rok4nPLFDS9VVq5jyRkQdyiRa9CF9BG460fHcRaNrHO4cKJ85NjOXvmeeZ2eePv/u7/oumV00sidEs6/sDnlzOf7BMzO9uP/w+//vVfE8oX0nbmervx8x9/x2W7MU8T3z4/c3InglKoAjFmulXsWbAfuSS5ce8ZpzWpgDfzgJVH5lnzfPrM+/vGFCaCc6ReeVqe6S1husORsDg6mfMSmKcTWitut8I5nNmPyNP8TG47+3qlT0E+i9bw1rJtF56eTxg023WnVcXz+UkOHKVKAnUvmF54Xj6xTBNHvHKaJsLLZ0rJ8tf6hZ4j0zSLWuwdz88vbMeG0jBpJynlWlnmmWU+y6iFzh41p2Vmve20njkFT+kVtGJPiTVmco60FmVzhPgNWwPrBDulbrugniygO61JmMZ5yx+uP6HepHDCucB6S0zzzJEurHulNfBWgP7WeUovI/AnCJTbcTCrgTbThZgEYt9VRqlOqQeoQ/A1LaCJnM6v1J5QutGaYjKZKZxQXVrgtB0pd2QRaypjjOP15VtcCOSSSPtVLDjqBK2ToyiGpQmFobZKMxutJ8CimOnNje9cZtv2YQeRRTWXMqYSVRLJ2tF6J+Wd4Lxgx6rQJEpJeD/hTJD65XaQ0v3mfyCWkIUYpXXFGAe9E7wFVai94Zx8Vpe337PeBMq+7rI+lWLYjp2YpFFPW+i60YpC94AxGmcEC2WsAj3KQGqTcT964NZk3atUtNO0AqVGUBrr79xQNQIo+aHWtd6o7V68oahdSkfutao1V1rckBZNJ958k6mMETDChS75GDanPg5QsnnyXhMm8XDGJGzPGHdirNRSMRaUllKNjqjaoso9kqasN9n8Ph4P77+8RmeEcy3e9nvoST82nW2s0dZaWhUwPuqOofrAVN25ygxFVu4Vj6fkodgiai2IwFGKWFmU4uEDdc6Nzew/4kLDQHK1ITpIha22RRBT47GtN6moHI+cd2pN5HLQqDjrH+9Jpz24zTI+rx/3FaVkTG8lUByCxxpHWdPjergr0KUXwRSVe2e9Zp4DxwGpRLqyQo4IEyiD7uWhVvauOVJ+hOByFv+3MZZSC+smbWpTWPDayEFCaVoqKKswqqOaiEBFZayzMrIvEl6VQ1gjpR2rHNu+YnTFGkUzABJuc/5Eb7CtmwhMIkHACLT5SViqtsORN7RSIxTX2GNmKcIzr/UNYz10Ua6VRirTa6FXmH7yeD+yGdVzPi9YL8HE/Xpl2y5otXCLKykeAudXEWfPtAx3ZnYtlU+vL7IGxIjSmpwu5NSZppl9E8xXyQrnpTL4NL9Q8heZ9CCf8zQFShO+6zJPYo0q7yxTxjmDVQmtpQ3OGcU0BaQeWcqOVG5oHailYxHLlOpyQKm9sh9iH7muF0DU6PctobUhbsLC9c6RjwObhWV+Ok1kZUk10nSitELMwpvWI1hurGbxM2CofXC2Y2E+ncXC4hrWVFornPxEzZrn00TNick7ek8swSDDlcLT078QPNVs3BgCKaoarQs0tJJTtVXt0fyTU6INbEtX8qapePBv/8bz9j//ml7f6CrQMeQCyll60vSm0dZQS6bmhp89pcqNT5Ax+qGU3jmrpYhvzlo5id83sKKsfnii9m2VbnfVKSliJ4F5Oy2BKrpC9T5G1qCdoZYqne/qPtIsMh6rY0bToSupMawlMc8nYizkYxtLr1S2yXi78nb5HV++/AOfXl+YJs9xXHh+mmmps8XAFKx0IRfLLQnu6Ovlj3z+9luO4+ByvbBvG/t2o+aDYDpPc6BbRyKz14P9OCitSY2ttry/faWWylEPUha80Tw9UVLHh4mUZSHct6/Ms8O7E7dL5HZ9E6uCCeTY+fr+xrJIovN0ehajd21M04mUknxuUXx+ugsSJ+5yk/3555/55vUzcb/wdF5QfUc3x198/gEUxLgSN3hyjvM089fffUOKCWMcl/fE+Wlhnv4Vp9OJPG7KrUuN4GkWVFTcd2qRRGqvnZQEAC6YM8OX9wvGWFpNrF9WUorS+BRmUJZ9fxcVzJ2oNVF0I9UDrwJuWuglQqu04pAWJJkQ5JzGTfHGsVds9hypUJVH2zHSivlRKRjzldv+hRAWSXQzKAhRrrM7deIeRFRK0QfVQLZMhhgzSkWMdVinOPaCnxS53oT3qaDWnVoPOsdIexvxmpWNXA+24yulvWGMWBxaFRVzzE4kSIIoJb1Ir3TqO7Ve8c2AMpSa8V6Dll5pM8Z3ezyAzOvri3BqY+aIK6ZIA5jRE6flM71rjJEbtHEdZxopd0k4qzawKJneYS+VeCRq7+xxJeZ7er1ybIljz/Sj4r3F2YkY5fPvhcfI1FpFAVrV1NJJPT181x3xncmNW8onrDF0MowqZ2vVUFkZbNc+IOqFO41eK0Ut5RGEqb3SldStai00gN7aSI6Ld93oUX2sh2KprPistcKYLjaVBjXV0WqjcUahu4SRDAhargjGx3k7iBFiv8lRGr+MtZQPAXVM2385LlejDaeN98tRannkAe60E8Zk7VG+gQgZtX1A/Rnc1P5LtFQX24Ksp/qxSf2waoka24e1QPyrcuNNVQKtx/7hm4V7LbK8ZvGlIlay4Xn1d+zdeDhnab8gH+QS6bqLoqc7tY1mvCbih3H6EbJtGboqwmVWemy2DLnkQQuYMUbeAGftQJWZ8ToHD7QK7qz1RhnNRZXOddvZDvGmg7xvnU7drrRa2faG9xPGiRXtyKJyT8sZ6yxWG7CG0LtcU+M+yrAzlCoHGGs7pXfm6Uwq8j0VRnrD6sApvJKr2PNaL/RusHpMoFRDjVY+a+yD1aoxw/KVyUdkDotYoEaYtffObd9ptVNSwfmOt4F8RKzVxCztlMUZsuq4Kt9XSuGWd3yAGHexH2qLJXNbD1Rv0CvOBpZ5oZ/LqC/uqKq4HBdKlfazkhIlyQEr18Qfv/yWPV7x9jwwVY50ZFKMlFpovY52MCPgfq2YphnrLJe3r5xPi3xWTZT0kqv4zZHp8hzCEPGGVaYLTF8pI/slK98B72USpw0oE5hmz7HvlCKEEaUlaHgcK86dAfB+Q5uGtWJrqNriTy88n2eOKPekXBLXNbGcZrZ1R/WOnQLaKbqS4Ooe1/F8EWMDzo39XSk4LyShVCO5JZxe/tz28L/p489uVL36DSmPXt2ScKPqsCoB+ZexcNsQSPlGyQndA701lLd8JTE9B/7D//IDhf9CSQ6LF7WidmIxdNVZ/GdKvVHqSlBIaKs7nJMPPKXEB+9U46x4PMXYrgdO5cOAf0+U7tsbiog3nT/8/HueXha0kqYR7x37vrPvBy8vz9TWOW6ReZ4wgxfr9cS271hnCc6M1zKQWWgacA6GYuE0ibJVS2SaLPHYcOHCrCZe7A/4YHl6euK0/Du8XWi10w3M0xklwoOMJVH0wfxrufP5+8p/r4a6cx+j6QELt7K43rt+6QrrBCHSlaKWy6AnqPE+AWhKL7ycr6QIYer0bqjJMoUnjBF6wr5tnM+fhvfQ8365sUVpYelJVMx5mllOZ44j4U2QEFYVr+rXy1e+ffnMt99+j26N83wip47TlZQzT8vC4h2X60+EoKl5Yd+FBWr8hHRQZcoIbMW0oVAs8xNfv7wRYyS3gyMdA+liUFrSrwopPuhd8+nTZ0pMHMcu4QVxRVByHHD4HUYb1HI60ZuDJv4ypTXdFUrK9CYYaqUr27aidMU7R8oV1QrGJbpuzPMnSrYoAkbvosbWsRkokZzkpDOFmU5mPz5610sR9eZOmwjG4OwknkDfRvdyIUXZ0B1xpVbHHJ6pJaKapzYDSuoZtZrY94hSiV4dtWa8fxIfIYqmN4wfveoNlDaCVFEZbQKdA6UzwQsurPWGcWVcox55k8cYuHcJCilNsF56ww/xDDuXmKfGy8u39KbpXcl13x3KJ2rZmP0LRyxsV2leCpOnNwkYxH3lcr2ybpHeJSiilRQS5NLJLVDGodlai/UvgoXrinYg2JVeSHkTyoCxaKsoGRpKktlhQmGEgaykcUkr6a1/pOCBVhWqW7EKjNBlb50yAhllpK57A20cqikJrLWGUoI8yzlTkIOt8w6jjNzQ2y6HFGuk6KTV8TnK5qzWSo5lBFeFWX0PuLYma4M2hmWZcLZRS0Mj1xoDiXieRsTo67jolHhN/RjjaiNoP+dlVN+aHoxdEQrUYLre/Zzef9xCHoqr+ceBqzv3tD+eU49pQleCY5Lwldh2nDYjcHTfbErqvldRl8QnOxBevY9JxYfX9cJP/Ef1f/A3/O/j89Hc65mBESiRyYZUaTN0XdlIS2hPxu5t2EWEnKLR0o037GuG0gu1Cn87lkzOcg1+0Ank9xtdHhYHpeHI9+KaiMvmgSK6v0FGO0rOGHtQR4injYCVs45ShcZgtCjOvVZMVSOkWlCqY5zFG0uuUQ5e2g2M5EC1qUg1K13J5t1bmL3HaE/JYo0pWewsWsu0oaQiEwJV2VOlN5kMCELRDNqKZDRUG55kI59zUZluO82Mw7gyeCPlGKVa8hFBFbQBnzyNiteOFKG2jd4i5/NCrRGN4rp/oZRdWMgPXJocPHuHrjQxgaZJNajqzMuM6iJItZKp6sBay3bdBNWnDbd1x3krB/DjQEcnIVmj2PaDMDlaS6RSsdpLFmHdWb0fIT+wo/7VOj/eP0WKmVYb0yIFI8YENOUXhzoRiaZJ7FwpRZzNlFKHZS3ggyHsUsRQcuc46mDmNvZjo/fGy6scmlqr0BLxXVBWuRZaU8RSuVw2zqcTtkROy0RvggtzVlpGU4df+rr/qR9/dqOa0j/gjAbVCN6KYpYEZXFePEd07MfBdBKm6tQmWpVAjpW8A7TEpydP5eBIt4Hc6Fg6i/WkCrr/kVwapa6kajBak5JhXqzI7qN9qBb58jsXyCniXIDB1nsY4e/Ae6NIx4Vgf4ftX/nhk8ZNG3HN9LoxcUb5Dd0qT9MdAfUGTXNaXvB2wSkIakNpqX+cwkL14r2tvWIV6Jbw85nvvv+G49g5kkcZxzefv8OqgvlLgQKXWjGmEexESZXWI7k2dJ1RXdGbnNhjjjIyQjNNE8HZ4WuVBV86srXU9HUwTtSeRqMXURX0eZitR+94a3Ladt4S0xj1lkTDEibxYtVYBfLeEkoPLmwTjp20vew08sM7pLQCVTn2ndt6YbtdybXiJ0fZIy/Pr+RDxmNaSyd1J7Ht7zhrJRk6PTFNUq+7b1I88Kw103zi2A62241mwM+BY4/kmHhOmcvlwhY3mhJ0Tx8nUBk5J1CFljOaiev17n8Tf6T3Tm4yvVHbgfOGmG6gAkoHQTMZQ6k3GqKmdd3QXoJkdPj+83ccx0qtkc/Pr1Kn55w0yzRL3HZaB+8dRnfhEVep+T0vAlS/3d6wTmJ0rdbRWNZxVlOLvFZ6GHWOYnAHWey8F4VIt0CYzlgjhxNRk8cGkkxwz6S8UtpOp+DNCd2V+MusYbYyujNGvke1S0lBIwvDMgjWxdsTpe4c6YIdlpzWKtu6y9jNd3pLeDtzrJVs9rGBmolHZb1uvOuD29qG6pQxeqKUneslsa4HtUdqkXYq8ZY6IBHzVQKA/czZT8P6Iwuo0TPOOUqFWhW9lMeGMUyTqEppI9WDjsIoL8ooUlJgnEE34K5i90YuRVrglLBcAWqRUGnrMo7VinED9zjjiTENVU7el1o7KDu+f3EEoQy5CGbvnoh31lBzI1XpXdfoh6IYghuvqaKsAqxsBIym5Ear4MNMsJWU2uD8Ooy7K5qeNhraUB9q4p7yn4zP5Xss8HljPLWIsqSNHodnJS1zSVQ65zStyYZcGyXFCIqHnxUERSXX88eG9U8g/2o05Q0ldZx2JMgjPz3ep9Gsh7xftXacM2gDtcrBCiXJ/06n5U6vnZ2d/7T+5wdb+6cvF7F0jJdz23Z53j7WRi0WNlF9ZZSstbxnDSWbH8VovlKjLMaQaoPSQcmYWl5nJ9c2Xm8b641gGD/e83uNrEVa78rw/SLKfAdjxjXRIJfCfhyoUVZzt5K0B11iBG4G/abWiu6iBjYMEMc0cB/tXnlYYxTKi3f7bD2nk0MbmaEeMQvoR2WUncSfndOD94wST6YeAkjtuwS27pdWVbgg5whlLAKpEM9uLuIFt25Cqz7qlRW187APlHIQpkAepAiUrHl7jGitKGVD1wKZsZ7I5lMpJbXrCJhf6lsbMVvB0qlRqx0T0sLXsHTcMlNigoGe+/nLV5ZlEQSclavyOCq3dUXfFMYJKxssYQpMQ2nerzuvry8olWhqQ6lAZdgGbReUY1pR2iHH4UraEyF4vPHkCm1v9FWoDm/xK8Y43GSJ64reLH5wb1PZuFyCqP1aYUygtUYa9xPnAqUlSr7jRWX64b1FW0usO6UmrtvO+TzTVOGIK6flO+h5FJD883j8eUXVOiZvMHS6MijlsUpLi0ZNQGRZFL1mWmx8fjlzffsqaVijSU3TamGykMc4KDvDvt44nxecsRyl4FwmpyqJWqOoZafURinzWPyGh2mMlqQmskIujy+qYHLuyU0JfR31YF4iL+fMFJ6IdePZW65rwoUDQ+Q8aZ7PkfW287wklNaEeUf1xDdny1u/EJwhxsjzYilV0dpGoWCdx+kCbeP65Q1vZ/LtgnWBeFiuqfLy+onSFGE6E/eKCtKcpdSENqJ26W6wZsJqhZssKbeRTIVWCt4YahLPGEqwQ7o3lJmItVCz9EEbnBjFKdSacdozBA1Kr+QjYwc+S2ExSkMRBYxFTtBGzyil8EH8csHLjWCaniXNbNQ4NTZ5TadOej3I6RDF0iAp/MG/PfYVTOcWK3GveO1Hk5nm8n7BOsuxRXadmZaZ63olZulZtt5w265c3/4gIxk0S/Wcnid07uS1YZpHOuAN1jsm60Xtrzu5NF6eZZEtRRAutTZSzDjr6P2MsZ6Wv2J9oMRKsB6rOt6faa0wz2fiISnh2jPBOhbvUaXR1cTL8zP7scupfN/owOeXM7UWTqdXOQiUPipYK5UozUjJEIKwT+/FFTEdEobxgglqzaCtBDHWQ0z7pRaO7aC1xCl8JsdM7DJZ0IPre68X9pNB6Zm8SjCjt0ZJkcmfZJHWBeMqIcwS4moRNDhzIkWp8SxoUWwoPJ0/ESZHbYl9S1itqLliXMW7ACdJ16ILNE9ODaUTt1tk21fWP2yDzVvYt4w1kI7Gug1eZxuKpSo4EwiTG5uQQo5qKL6Stlaq4Z2l14k9JXqNWGS6Yo3GNFFXvJlAVXI9AE1NgtXqKoPqch1UWPdDbsBdU4tszqR6VIni1qGTMUYqCO/Q7xplA9VaEXuUFRYhXTy5qhtUc6J+kqitUBH0UVVQSxV/XAe6hjbKGPp9o9doDpwVj63WI9hpxDdbUqZWubmTNxmJ1y7rVJXg60eDHlzX258WpIwpjbTgqTEiF0rDfRMpoSfksD3qWMWTOprw2sdGtauDUt5k3M89qPWPnkepgZEK6P483nd5z9WwBdxtFPTB5CyymdYWRtXKA2k4nAlj3b9D/NXjzyje4fooGoxjY6SVTMnujUoly59Pj9peKW+R2U4ZCLBcKtXc/ayCtFKa4YeUVitlRCFX6KHwIRvZkfEQq8A9zPtxSGKMg3uXiQ6oxxlDWwkM51/4gq21kvbuYncqrci9xDmO/cD2ivVa8hJGbHY0jXWn4bvMhFkU9xgTysjBudOYTgbvJ8r4HpcMuouYkHIfWD5DVZGSK7pWFE4mCRpUV1QY7HD7sJIYo0jxQGHk/uksKRahd3gnlc/eozpsaxRiDtBaQutGixmjA/r/Z+9dfm3LsvSu33yvtfbe59xHPDKdVYBNGWyEMNBHgOjQgh4SEkJCQqINDbruucO/gmggJDogISwkC2QERiBcrgJTrozMiLiPc87e6zHfNMbcJ6KsIhCCcqaQV3RuxLlx736sNeeYY3zf77MW5ydsMKTPT6z7iupKEIBDwqGNwjmRNB3HQON10cimYRQFKLuQG7z31GFEs9aO7rgWP0tvdMRg3Duoaug9M3lNKhIEobXBupmSJdwghBPHLsbsNIyktSok4U2NqY0B5TiOSnMVekM1SYEMIUhaG5kjRXKKgGWZGpLEJwll+35lnmbox6DKiFnL6DBQuI6cD3kelUxdpnmilIYzig8fn/jiq/d4N+qmTy+gG1ptP1Ue/gO9frJQPZmTsFDH3Sd4T0uqcqJvKWODpuQ0sC/7GJsYSqsD86RJpRFzRVuHcxPPeeP6kpgmjz8tTEFj2Jn8A0Ynmi7YESEoLlNZcSTRSjZj752MQscGTZPf/2N9UNw20vWFqRamUtG1oLXDnR7p1ooIHphixKmOP71hPTb25ydiSRyTZU9X0BPKKp7XD9Lx0IKguR2FYL2gLW6Rr774mlw+cjq/4cOHj8zTiZxf2PbO7dnSesXqidPylnV9kgSIXpkmhztduK6FefkC7xahJjiH1QZnrXQMmrhe0XJ40Nagyv20X2Q03TtWWVpp5Jql61zBak0tiCkMRXATyqjRXY1jA+mj28jglNYBfB9dhg6jvyF6OS9wbOc9UQvxwBmDOgEdSlcc+4afDJrOcRw4Y+k189ArR9nJKeIXcYXPy0QqB+u+CjJEzeRUWa8rbx4fJDIzDbB4dyz+Eecc27aJ9EA5ao3kvTBNj5zOltP8hnXdyPHGvm1iNqmiZ86xSHzoEM3HuOKN5zh2lnniNEsAweQEnrzFjPbSgfZhYvKC9pAIvkSpkTAJm7cjAvqWPM5qctlovVCbaDy/ev81pcghrORMbQXvOrVJkpXSCt2lCKdHnHeyWfZI6wrtHF0Jq7FlgcD78xvowob1XpA63p14vEyUdnAcYiqRDPZCq1nMT5I9idGBaZ6lyGhZigVdSOUmG2m3lFyxLkhnVXemhxPHsVHbjvcBaxZxTLdESnJYmGZJvnp62rF2wljNvt1Q3ZFSZdkySjk6kU5mDm/wbpIJRpWCrBaoVYIycpGQAhRs20FTlaAUtXqOXRiqzmqcFv5grRmdHU3dkWlNoP1UlDHmVS/aAAAgAElEQVR459G9jghPQzMivxGovxrUkcrkHc4J5ifGRClS6FoNOd8LF2nLHUcUacA4Z59Owlnch+lEaUXJCeflgJlzHsEH0jX13qLNPWpVYN05ZWQyABpNKU1oH+1uApIuXG2KUtJwsRsZ+0qdwPk8S9E29iA9dKLClZXPwI7ukOAB7xuqFGutKaxV9AEtB+mmfa9+n//N/S0wjdo3Kfq0IYQwDl1Vyt6hYe1atNeP/Xf5p/jnXotWiRAehRuy7rSqoMskS7Sod4aodFCVuVuy5PW+zvPH5YzFWfP6GZhBntDaCG1ioLlqFa0nildTndbq9flQWgg16FHIN0PX0hWHTqtSKOUkPOLW7pzWNvTnUjzlkqH/sE+BxFAbA6g+TIdOEuNGM0ZQahI4E5PobpVSNAc+OOY5sK23Icdw5Hpg/Eh40wo/eyETGI91jpR2aksccZN70kBpQtDZ9wxduqC9N2LMpChNoFQytYNzShoSpuCCo9IwSnTX2ijSntHGoowfUwIhogyFGn0E9+QcKYVB3NA4AypYjJL7bJ7lsLptEUa3tRvZT+oWWaYZF5zcZ12QbyCIrloq+Ls2WtNNRlHRyuF1GGi8hmoiDihN9gXVFafzmXW7keoufHVr0Lozz4Fc+9AwZ7Z+RWczTKPSJd/2iPdGdKyDcqSNoReZ/Ig53KGUZz9uOGtRupOyFMTOOETsJ8zTmNNAAsr3nmuhlszeKxVDcIF9rEdaaZ5vV5yxxLgzLTOuN1rJaG04cmHfd0KYUMYM6Yxm/aPvMCYN7viV1jtT+JMR8r/J6ycL1Vu84bslpUOKIqM5cqHFwrJM5KbYbxnjM8o2Pm4HLjiOuoO2tPWGHUzTUio5blgXKFoy30u/cdw2brGQk+V8mYnHJhm29/EzP4CNZSRiuMeS3s1U/UeL0r1Qba2xXVfW5xfMUWl74/RoyWmHrnl++R6bKqfTTC0FZUVvNC0T19sz3ih6SoIT6bLYqB5l3K88znq2VsjbLkL1oNB6x5rKvn3izaOW9KS88nheuL3coCe8EdzFbBOqiLv2+Xbj6YPGL+8o5Znz44mYG8dV8/jwhutNsCAldznlZpE5NJ2xdkLXWUZOZTAXu8f5M60lelPQ2jBLqNFtyaQs0omuZGR4JMGAWW1Glr24hlsbsoJuRHKQKo07o5YhEh9c2FqoIzXMaEvQGncyKCviemVO3E0ZOScm/4bL2dLr6MwYiTNU1ycu1rBYxcObzJdfJrzz5D0SnGFdnzFW7qvaDrCV67VyOk3UXol1Ja2Z/Cny8vQ8RrGKlDPWG1KW7pmfztz2F/YtcXp4i7GdnBu1dV6uL5xOZ7btQCkp2EMQbdG2ZSlCzhO9CYs0xoM5iLM17SIT2Y+M0gk/afZ0pVZD61l0pB1iFGmEQjY45+R+LqWJ5ix4cq1MbiKEwBETKSZKk+56aZEwTdjUyVkSm3q3OLtgbafWSG8FsPRWBXadIjFnluUkgP1cSFlc5zHtQ1cnr0k7jW5DntCkDMglomJkmS8YIwlOxyGbfbOVmMR8aH2TtDRzFlRPt8xhmBR1Q717L3rxnDnSSmuNKZzw3ooDuztOy4naiwQ85ERrjpINxkoBcd2vbHGn5BOtdeKh+fzpSimZnNMwWDphNpqZVCrGVNm8cxy6R0PtCq2DTIaq0AYE9m7Qk3RVpXMnrFmjZGRrVJds8sF2bq0NrqymeYsZvFStLc6Lxj6EO+prxDZbI8W/lcLJakkDLK1ByzDkBzkl2aRpg1uqxMihNOiEMQrdnaDmjMYFJ8zPezdx0JpqLz+yGTFkCZJ211qk1kKrCmuHLnEUjWroQIVhOuQ0StbbriGaj/zS/U+vI/aMZNErqVKli92ECwqdVCSf/GT/ANU+8k+UfxGvHsZ4cuhVlUwbWlOC6BpF6gAR8KoaQF5SU/La5DP/k5pUpfvr6F+kohXnLUpJzHFr/TUeXMb2FYqwa3sXc3DKiRCMaC+7FQxhXUU60hWKPoyRSjpjSnTKMuW4P0fjc1fyuaPLMMAh4/TRFLJepB8WebZkzKzGIVumHMexSwHWFTE2Yjpk6kihI93Z1gslMtKhkpgeu6yBpe4jC77iR1R5rU00vE0DdvCLGf6QH/bi27rTGiTlcFYRZjmcay2MYaOdhNg0ucfC5OjIgS9raYT08Q9q4O20FS/HeRpeEWgc7Fukd/86ZVRa3he9UIrodR9Os6DL8jgc3KU8h6LmFbpC2/b6WfeqsF1TesVPgV4auVbKwCuu1xcJGWqKrqQ7v6c0UHbI82s6KJnu1tjGd3xIQZg61ogmWAFOKXJp43lDzHxd5BWpJDmEOEdwYnSFRm6RkiXeVWnDvieUUcS8y71UwVhFbhJW0JH7p+RMNgVrJ7bjBseYzHqR4TUaMUdaQiKBW6UWy3yCl5cMqjLNZ7r6kQvzN3z9ZKG61pWna+J8PvFyfZKNyVm2/UasDqUmMdJ0yzI58niIStupRVN7QddGjsf40ivbUcdDE+lKc0SFpvKy9sEFm6lJdD9qmAhQgFbkLC1vY9UoYmV0A/DqRB0LoTGa2xYpGM5vZ/KheBlcyoZB2UYIkssbSyGViNGeYDxf/s5XvH18w6dPK8s8C9PMwuPlInSDotEo3j08cMRDupxN8fnDdxjVuEwnpmmm1INaIse+EbTFTu41tWXdK9ZW3r69EHbLfuycz2N0tmdaPlDbQSwTU5jR1QvU/pqoFZzzxGgpyRIPxel04tvvvuH9V28xesKZGR8CILGyxt03SItx0nlwTdyQrWacVmjrRbhdxUWvrGiiSquU2tBmGt1cg/hMpABuTXA75p5UI98EXYnm8I54QaAJUsB4R+0S+dm1GE1iOphDQJ0ueGswJjCrYaroGnVRtJKZli+wwQ59VCGlg5fnFwFlq7c86kZvnWOgmFqXUImUMo1CWB6IKTK7wGVZ+JA+sz09473juG4YGwUBdNzQWh78eNzQSuGcl42wZZ4+HRhrUaqPCD/5XuZ5IZdGzjshGFIcMZra8HB+IKYbMd0I4TQsOqL1iinz7s0bYoxs20ouUrwrLLUIow+r8T1QW8X5Ca0dfpGNxxgjKCbTOZ1nap253a7AgdWKGJGCzGQaleAmUUnVQu7SXbxuz/K6J8+sLrTeCO5M1TKKKmUllWMUNJrYDrQKTMEL5DoPNJebyOUYKW4SsSxTEEljc1bkBNZ23kwXkYzsoLrB2EyOmX2PHMchozwS23rletuATuuKlNJYoKuMyapimSrrurMeG8owRnmKXAT7o7oV96yrgMMQpDvWZdry6nAfKURaKYx10tWsEjrSu4QPuMmhVBTSw6Tkz7NCNYixyMaiJWyk931oRxmFXx3Fnx6/Z2gUexOjJTL+M2iUajRV0AMfVvpwB49OpVZ9IMLUqN9kTF2adPDvayMw6Aw/dEqUzK2pI5HLGNHfpsGdlQK9o4x0LqXoUq/Fbu+dD/2P+Z/b3+BIG23czzINi9AbxsrmzChAhXUqG/yND/y+/ps0Zv7p9q9jRxJUQ42pgh7aTBnt3w9MqLvubkRLjr+ZoXu9Q8IAnBc5xOump61EeuaI89KL7XR8MBItXO4ND9HjillodFd7Qewmo3OrpFPVx6i/9zbGxkm6aUWqaa0ZpAk5oNDUazGltR7FCdLpNZ4jVgHJo8gp49zd0CffS+8S8tG7Ytt20ereEWNODJkvfWcoCshJ4TyAEc21Hl2+JrroVAxKe/Z9RQ09dE75FfMlRi+5V7R2Ysak0RhRtq2hKNRSx2TFjnjbhoQnqPH9ixm4qAZdXpPK4mZf5vA6jt/2G6dllglHbcyLp9x2rNdDdy2mtuMQQkhMojsdZxdySlJndEPtEVCkWDEGWk8cexJ2eI+EIJ/zq1RlHIa8Fe9NA46YSSkxTyIlyzmjaBg3KBApcTot1JaAKtKf2mQaDdSex32psRiRWvWCM5oj7rQe0KUMjbh8HjlXaldMzrKuV+y08Lx+JuWdy/lMTIWFWZ71killJMhpQ9eKqhS5SdSuVUo0RRSMFe1p3CIycO3UBq1rrJ8p5UbKER9+HALym71+Gk+1BHQyuDDjs8DqrTUspzOpJAw784Oml4K2AWOE5We6w0+GvTSoHW3lFBb8RFEyeq5ZY6YJHRL+1MFG1uMz7788scdELRrn9DD2tFfH5F3YLlgfGakIvL+Pn0vr33lDXKVA8JMHrbhuO5ODchxMwYrwuBSUMsxuwk6eXBOxd7aYsE5xUhMfP33gfH6L0sItnLzA2UPXXKYzt7wT9x2lEsvFU2Omj9drjOLYCtpowtLpVHyYOXISfEZ1BD+xTBdK3djXzzjnWayhTp6UIoWGMYI96TXSS+VIjQf7yO12w+RKqQ4dn+lbpOnA5y2jrBr6TcExaWPYjsh8emBZzlyLfHbOicnqfD7RBg7MOk/NGyUn0TKFCWuG1pJRwFYwA6PTasM5D4jJojXZcGsWuLLRGm2Hk7hWxLxQoVZBNimNNWIomcIiWpquSTnSGQlpWjiWuokm2WgPCOA4TItggACtRLfc3smsT1iXMp7LNUkELw2imEO+eJ95vn5PTpHTXAXZoSzaOvZjw9lKzol47FJ4tyRdABqOIjzAvGONY3YT5xBYbwemauK6Yl2gpoxbFDXvpLXQqsG4LPilpvDhxDQ/cETFtgv03xpDK1LoayNuUmc6U/CUXDl658PTZ6Yw43zg48dn6DBPM+u606tlmgPnixxAUhTGbNcKrZyM93KSxb9W0Tn7R45jgiacZGtm6J7e8jAmGHozGO+ppeF9wPsAvYlmcsSJGucEwF9WvDsLzD9DbdfhIn8ghDDwc4IDUkbiPo2VLsI+9M1KN8nK1jcYkp+X5xXtNKeLyDKcNTgvgQHbeuHhcaZSOXLndo0Eq4Qn6YRFGaMdOssm2Ko80mGMOLZrvaOrErrfD8wjiKEr2fAQjJN1hikIhkYKj4ZzUFsg17vjXDA/LUlXVCuR5qguBX+rjaoQRFhXWCdjvtoaEvU6Swe8iA5TNiYphK2W2FLrIB533uVI8qMNeoFcuRUhOwztoxSxAhjvXYgLxgo7NueKcw1rpY1ljIQitKG77MPUE/rMm/6eb/vfpVboXZ7VVhvODGrA3eXfRd8uRaWGZnguV77tv+SfGfB/rbQELCBFkZ3AukbOCaXudiuGSFYJ3cCC6nrIC+Q9vW5yTr9qJEFeQ6lldN7tSDqTxCdtDM5P9DHe1bqhzMCL2aEFHjpalBTJSv+QzNaacE+tDaLNbGVoXl9FwbTW6K2gmh6a/3vwjKGXLiFWrcr91iFnaeI4L9HN6d71HeZBMbk5GXG3Ts2jaTOwd6XAVqMQSJDQFR8kCthoP0xQIqma3ETOCaMcNgSyuk8wjYiqu4UiY/VpPpHYxASYpDM7zY4cI9SCdXrcJwzijDw/Rhm8cRI3XDPeWVQvpGNlLYVlDuz7xtWZUah2wuyER6rMKPLldWkt+8z1dsMO6UGlkXLBOC/rvJH9pbU+gPqdrivj6SAmGflbrUkpYq0jTJ5Ysxj4hsRLSnEx19UmZqoSx2QGaXiJLChirZe0uCoGMmPlQAqNru68Yflec63kXfaPz9sLjc7btw9S41DZb5tMlG1BOwksqbqjgxG8YANlzej2akFjak9T4KcTxgVmP6GUZt93uc+UIsyGWg9QIoNqzQzJkCYXaTD8tlw/Wahu6QVtHL/6/huMNiyTJJbUKhnt63bFKrBm4rrt9CbQdFSQYrRIrCTmviYpcgWnNco7UnGSzR3EfV1qonSPtpbWBEBrjRkCZI0xfqTK3LuovArU76gYmQVJAZtL4fPTxs+/GqasHsSxbu5ReYKLMSjO4YT1Ex+fJf0nHhGjGzHecE50Q61Ucq4sk0KbwrquKBK5FropTPNMboZSOy2u1MbIs5+pMXP9LN2hI33EB4vrmZdvP1EbhDlgtGMOJ2pJwpPcC7U10r7jbBkLZZIx9nHwuSYeLyfUIkzB05/7kool553HB0PJO/FIzKZyvW58+PiZ8+WRj59+xQel0X7hNM88XE5cnz8Rn/zAZ5wIYSK2yrbduN2unC+PvHv7M1qztK4ozWLgNelHIUB4eiceCTd5rLbCxW0DgdSVoIFMJyVxQ7cm9wdKi2O1ic6m5CKifG2gV3Ee04ipitM7S2AAlFdnpxsRuBJOIeYrepcCZTB2fzA8d6p1NCqmVd67R2o9ZCSnPUYrSoc5HVIktkrJiXssbEo7qhS06hjbWderdMqs4mXbiPfTd3bk2jhiIpaDnCKtWhm1LFEOIkURkqYUzREPYtyYFk8vGZRmmc90Z9mPF3JNnM+yUVTV2daDTx8+k4vm48crCvDOkpMk7pzPE19+/V40tqvIO9b1hrUWH2aMMTw8LiNNpwjarCtyLIRZk3MkHiudQuuRUhIdzWkuo/OUsPYF5y29i3xAW+nilaLJWfRi8yxj6ZQlD9vaiZg61+vOka6UejBNF1qTDq91hpwaKUkWuH3xpHIQwgLaYqfhmjbSZY89cVsjx56kmO6K9VaIKUsHCi3O6ShaxGPPQBvpPTKZkfujjlE4GEkMEJJJlUPyHfdWBxapAaoqapGNopTMnhPSpbuHmEjqEE1QTMs8Y6zA4Gd3oXfLtt7EMKKkq3O5BFzQwyQaOFZNKYrL6QF05bZ+JucitAPMcGKDDzIKFqPN2LD1D91Fa7tITAYPX7STSJGqu5i/tAVboBVkWTVYK51VEEQUg1xQm2LixNv6NbllYMiAsmza3djxzAkRQDb5Kq7pIXXAVEmoQ+gIWotetldxfBv668hfDOdq9L/k53IG1UObCkaZYWiT97hvWX49GskCK6oY46jVUOsw4w7tsugxuf9mYs/DLKPpzSP82Da4mFIUa+CeTqZHLKUx4iq/x7W2WqldNBiSjiSR0LXJSJs+NMCvNXZHGSuGICWaVK2kkRD3NJK14qv7/y6DYHRpxf+gXzW0Psy0Wtn3jXxIUY/pKCM60JQEaK/RpLTJ30nAWZHh1VKlj9oqOUZUr2SVaC3hvRSR3YreVEyEoHUV3XFptJYpOeO9x2s31Cgar+Uw3nIUHXHtBBvoVSadqjuu+yoFY2d0s6uM3XtHdQniaYPMYKw0RdLwXkh6pXxuQh/IKKuBisHKQTd4ehPpQy2RNkgOvUNJ8lnjNC/bjVokFrXdpzUDSXYbQQx7Opi0RjspCNsgzuQqrOW4FZx2oEDThzZe3vr12LDOssZD+vxdZEDLMpOqTO5cOLEnmRp2o9FdMHQly96YayRtkSmcqEhXr/SOUV3kb0bWPRc8Jiuqku+drohpFzmaESLGb8v1k4VqaSu9W5oqeL8Qq7S1c4uSitQy9JmaZVGZ3UJpZcSCjZNHF+Ko0lqA5LqhreNpv+L0mfVY0ZNBqUBrnnRIQZq1GLSMDvQex8Yrp8ZaRXsmOpUBfx5gapncSQejtMI333zHX/69t+QUmf0JbRIog/YBn2T8mOpBVhIhGVMmBAMtcr1lcknYoFn3KxovYPEE4Fi3GyFIfKZSirQr4p7xxrHFF9w00UoC22mli8ZNd454MJ8vqBJYr8/4yXFbN1Q3zEESg7zLbEcU0LJ1bPHGY3iALGEIUNlL4tGeyTmxHRtvv/hShOs9s8eVXA+892zpCesV778IvHt34sPHz5TS8bowsaOOZ8z+GVM93hjYnki7JpaKouLrxtOv/5i2fk/vgTCfADGTXS4PtCqQe2OF/dd7xZfAsnwhI6KRGtM76FYwSsaZGpF11FLpqtCQkVXvkpbTlZzSxRsh43srrXQMDWMbvVkUmtqjSARGWhpqpzUrKKDa5GHWwqZU98W+HCgsvUsHhB5Ay33UehMziBOTmLYBgqRr6aGlbVVMKK1llodIa4VShaV4epDuZ6mF/dhZj2eenm+8PO+k9JmUCloZtm3jdJqZ5w3vDEZ3JudIJfHtd5/Z9oQyjjDPVJUFXwaUUvDuQio7rWUJcdgLnYj3cF4eaa3w/YfP3G6CJLujxXIS/JDVAoT/8L2XA0eHmKKEbTRBjfUeaD3R+jZGbppgH3npn8l1w5pZwOi9oPVErYUwdeAFpR2lHKCu0vFBkcuONQbvM+u+su6HuLprAvVCSnJ/WyedlJRlrCmjR8U8n8TFGzcgD16hwPWtCaRUKPUZY4Ug0Cqiv+xlhJP0MSqrtF4xVZL1jBldsd7QbhisZBiI1p6cC7GNMS9ddO1GYhZpmmMTLB8IEqr3Osw/GtWbBGJYjTWOyXmsBTMFTtMjdMtlCWhTxdjTG6ezkW6pCRgD21So45CeS8XoE9txcByVKcyDxJHRvjPNHq0cORtq1aT0QzfxZ1+/l67Y7f5f9JA9dLS11CyFpbENqxQldekiKjNkANI1lO4oSHS2dLmUuqczSUIhKDF5DvOpQP4bWnec11KU09C243pHp3vzQQOaEATlFuNKKoo7fUCMTHoUhXIgoCuMFkmIFIw/RKjKvfPDGNNaLxKYrglBmKw5x9fEKdE4yhRHGYduRaTAyoijvzecGXSZLrGVXSP/f8sinWKgAoeeWGg19/jx8T5axygrhAEr1AHhyzZai3TV0INgo4ymVzH/3LuivSlxdvdxlh/xtOI1kM+nxDG9wmKVp1DwVmRI3s2kFGWN60NmYrpgIAdL+E7U0brL3tBGkMEyDlHdkqIkxtUqHdLWCk57uSe0xSj5XLXSzN5zOp/Q3XDNV4I/garEnGm5cF4euL2sQ4JTh3t+olSN1hVnBJOJgiMXjpxRGKYwsx3jO+8ddKepRo4VrT33FM2OIiVpsKAaNUtYwLrmoXuWw0Yqx8CsiQdjO3aRagA1FZpKQhzCoSwc+QoajJ3RTQD7VZXhu6i0mqi9DQqESB+Mls82pYPlNIlUxDW0h+vxIh3YNiQZsdBVEo+AtUN3Xend0lMmpxtGeUyJ9HqgEZPuEROXy5nWRC++7TfRqhY5KKZYmU4OFzTxaFgnRtLaEulHSLXf9PWThWrWSUTDQZHZ6KqPbtgGrUsUYhTDkx0xnjIu8pyWmaNFYiygHK0mliVgqsGYTlWaz+v3nJbA5B3rnjnayhvtSFVGq3LzFzktIycX7z2Kyt3hF6ZJNF2Dhai1plZZ6JqGWBSnB0c8Ct5bnq8JExT9yGhnOF0eWOx7YirsKVKNJg1NFKqjVOO0zBRneHlZCZPC2Jk7ePyyXMREQ2fyJ747viHmA+dnWj/AFML5wtPnDWs7y8Vxfv+WXKDbBtXSneXzp8/8o//IL1ivK1Z71pxoqhHOntNppn0q9FZ5eFy43p5EbJ4VjcR0mrHziettxTjDaVlIxwumRZwTTE5RleXdmemt5+vLFxzpoO+ykRSVce8CIZyopVF6FWPbyxXVOvMy4YqFtnL7/D2Gt6Sj8PTxA+kUcEFy46f5zG3dmJcT/u17Pmwr58sbjAkoPVyfrQnEvg8tEAXtBa5es5JFzvbXzVIbRYnicDbDGSsHlS4u5xZGN6nTm2BbUs7CwGwTdbiaa4OcxdyixijOGIbp4a7dAZQanRJDzRndxjiRKj0yI1nQxk6EIC7wmBPTcnnt7DsrbkpFI5dMp/LmXWTfxfDw8vKJjmCF9m3DB4smo1Xj4TRDFbxYmB+53l4oNXLESEyVsm/scROqBZWcI5eHE4ub0e2gIYV/PArWdYxupGMfzlOFbh03uje0SkuNI8bRcehyWNAdaybKIYWX0n10KiV5rrZECJq3b75Aact1vbEf0hr3xqEq7NtOaZHcRDJUsyCAlLOkklE8y1hQgbKi5xIMlGjfSrWUlCWieESh1qrJeUWpg5QjSjW89eLuReEt1A4KT8uGrgtGNVquNDoai1NDM2oaHTuK0c5kZ6wx5ChTHH8fG1IwWkugh4J9P0i5U5SkE/XeUEaJtrFWjJP9TmuL6kaMKV3h7Iyuil4VqRSSrihg47MUBFaJ8RQpZp+TaBxr21C2MU8zpkviWa6ZoxZKM+RWoaRhXNKkY2e9RumOoVl8YAo/JMyU543btr7++x+5/4VfHL+H1mJgoyu0qQMvBdqLcbLmjg0ixepNnN29SndLAgnM0PtK4WZH0tpWDikilaVRaDQhMigzQhC6HFybODPVGP9770WedHsehpQhj6ji/Ef1UTyqMVHpgwkrmvbMD5uscsO78KN9V9FfY3Hv+lONRtvB2lVdzGgoSlVDX6xlZN871rpXsMCdfXtHTqmREGatk3CYKqlb9yZv6w1rgoyMW8faSSp0U4S5mqoUyOpuGhJai7WBmA68d7hTIOWM02JQFYe54LHocp8pZampUGvHOoaMK1JrwpoJGMa1EZerjWDBlBa8nXMywUwp4YyQRJyVqaqzF7Z9Y/ae4pV8t7XIwbEoUAWFBIhoJdjAXHa8tTycHjFK8/bxkbjFEZHcSDnx1Zdf88d/748k6WkK5CrmsCk8yH028G+ldGLyVHWPSlfEI9F653K6kOuOMo02B5x3HPuG0p5pNtxuFR/OKBvJe6R2y7quGCM6Ym3vBm1BZ4GmRInADl58Lc45UmzkLqPyUjV0qTHuvgnwGF9AS9Jgb1Wik60hxQ3tTtTRcXdzEw0tEk/vjOOIK3Qji1rdUVq09qXKpEgpyDZR8yHPrFLkLHVTV5WYKko7KoWXbZMUtbBIaldPqB655UxLj5iayKnhXIWSSVnkSb8t1093VGvG6sBlecP3H36FcRmnJKHHqhnrPFh5gDWO2+2Q1rtv6Cbjssk/iAygei7Le9JW8WHi5CKTW3n//oLuB4tXWCUpFb2CVUb4dm2c2Ie+5X6qrneUxBhBaX1PFSnU2nAeTNPcnmQUU1NiKx8wRvit6ajEfqW9NM7LG54/fwLdefdwlmSappnP0OoZbS26V7A7sUVohuXk6HXiaHHgdjbeffU1l/6ep6cnzm/f4J0YHKz1vPGaUiPT7DHGY7NoWJfThaeXG84FtPUsF40h8PJ5xX6KegcAACAASURBVHhFrIm8ZrrRHKWgq2IriXkSzenROkcqOO952q5cHk7k7UpW8PDwBusDqiS++/w9cb2h5wsdxbrv3KK4REVX2KnrTaD12nBKjafte3ERW0kBckbRz42Px/eobpgeO/PSsKaRU6Hlz7yZFfSCzZq5OeL3H0B5/DSjR3TeVmCaz0zzI41CamB1IMaNfXvidDrj3Wmw/5CkEhXINcu4QxeK6mjlscaitUFpQ++J0mDxF+m0NNmErBUNZq3S5UgxiQ6sS2dN3M1FTtOIY1hrhTVdjEytvZpAjttBKZkjRvb9EHMdEkKhjcYayzIHnLGE2aP1iEVsIkWJEWDGGEmcckFO0kYL3+52wL7dOI6Ete8I5/eYetDsC7jEo3vHO6tQOnGsnf1Y8d4QwsJSPfv+QoyNI95QmMHRlM6PNRY7zRxJeHu1bcQ9ifnOzmjlUVrjPATvJQO+VlJJTMGitWWZH+hdsSxeDA65yGHNB1rVOGc4oujpygjoULrKKJeGapXaHU0bWkeKsZ6H3qugjaXjUMbStSFpQ6qSya4sMkptMHk/3NudaV7QSsxVRgmtQljsfYx/2+BvKnLMtK5QVqPvOuDaqbnhmDF0LBCsx3lLawfxOOhVUFD5yHJftYruHasH63XIXnqWQswYJwa4JkYnZ4SdWIoo49AKqyXMo9RMM4rUGwZH8MKATamQcqHrxDZVjLJYI/rP0pwY17ZGRKYxThkezxce337BFAJv3rzj/Ze/w7ED/5Ws6f/av/pv8Tf/h/8Wfl/+/W88/ed8Zb7m3eMD79vv8kX6At3AMVLpGCk7uZFLQytDHTN1QeZ1tJ74sv+T/MX+DX9H/49CgKAzTRNTuI/sG866kZjTMBgwTky25RhhLqLjvevmnRUqCiAO8CJpPBJT3AeZQXNPreqDKKIUKNteC9OcRNJxl62mmJACtFLboDsgVBtZX8bIU2nKoEPcPRJiEAKt5MDl/B1S30mpYbTDOUPMAuhvrb6uHUp3Md4CdCmAWquoJmP93sZh0gqaTuRqDWWMFJ7IM2yMHmi6jjF1jPvFQKw6eC/Jh8H717hnmQIltFHMbhEpVM1MUxgHf0OucuCTg5Uj+IBWiWUOMsYfbOCSKnHLnB8e0CYO05Ek3ymtObmJuO94b6iIXM6oPhzqlaeXF+id8+VE7JVUpAM/nRauORIeLzhr8M7QdzFL1W7QRuQwMR6UWphOE6fHMx8/dk7nCz+vX4ucwimaTkyz6M07Ozm/YZ5ntC5s+wEolM30KntArg8iaUiFd2/fc8RdTGrd0pvl44fnYaHr+ODQSrOuKzEmWnGEOTBNZ5TOuL5RWsN7g7GO3ivz4ti3yBdfvOdytnz8+C0xRtaj8Pb9jLeaMCuuzxGtNA8PE9uW6FhqET3s5fLItkVqjYQpUosh50JOCeflwGF1AB1IqeK8R1vFy7FRW8KpRskd6xzxEFxiMIHrtklDI1YJauoaYwLZxv+n9eSf2fWThaquC7XA0TesMkwu0LtsqsFP5Cg6GK0ty/TAw/KOUjfivuGZePcw4d2ZmFZKSSxT4BwUx1FQFr56/Aus2wu/+Pk7/jCsko40Mns7maY6ZpxuX3Uc9Ud4laFPlTHL0E8N45WMwgrffvuEsoGqNfMlUEog15Xvn38tYyuuvHvXWS4L3338NUdfCdOZWuDN24l8DDivVYTzhZQOPl4TSXUW78RA0h1mWfi4PmHmmTd+Bt0oWlNrJ9XG8uYBrRpGaVrVzMuCwXJ5eGBaPvHzn/+OaHnpxP3AHTt+9tJJ6grlA8e+ib7r/MCvn77FhZnT8pZ9e6KzURVMesZYRaqVp7JC22k0jl7wyvDrD9+QC0xWXNnGKD5++B7nLNNyFkYumpfrjVauhHmm0bmum4zsnCERCfNELwY9e1QTnU8vGTVbWm5svaPZJVtaaXqa6IcmJUlh2ctHSpwprXIcsK47xkZKWTlub/D+gvcLxjjsNLMsXyEjfUNXmt4UrSv2tBGjaCeV0aQk7tjSEkrJZhfTxvP1mVo66+0Q5l2TkWbOWTbUWToMtZTX7GdUElZiR8aqOGKUxTznTEz7+Ht/iD50xooxTAsrT5Jz6mBiCmqmqyobVRdNXmmiLXLWcsSDFA/pzPqJMHkZBXaFMWeM1fjg0bqyBOnCxSxj+UkLFF+ZG9Oimd2JVguKTC3y/QWn0c0xac/lfBaeKZ5SNF+8/5rr7RO971hdyUVE+VSDbmGYVxpWG+IRySlzmhyTtqwcaAoKi5sVQRv2WyZFMRyFENADt0OX2D9tNX65sK4HKRXMrHAucFsTR75RTMNPnkkFSi4jmx05fCmHptCadG6UMhTdhtlGuLzBOwyG1MesGgv6Pq41aLJ09pSmZkA3vOsoXUjphdY83rmhPa0Saakk5U23LicoBOHkbR2SHI0Z338IHjPNglYaa1T3Q+uoGq2AMwFU/QG038SVbnwgBYVyjuCg5iprXy+UVLAF3rkz5599zem8MM1vuJzf87Of/4KHxy8pFazzbEfkr//Xf/11Tf/Lf+lf5t37v8RtFKpf/q7n4+c/4Jon/mj7X/mL5nf5x9U/SydAX+gDqm+NIqeGvt/rw7wqGlLHpX/F1+oX/F37t2QsDaQcRzGlB3lDjzW8ixFTgLAoJYWpijKONFo05SkneitYY4dJSzqDnT4QWiIzEKiBaBHu+4AnvL5noyQ04PUasHxxvUs2vTNONMpIl7OOdJ/e2tD+BTlYFZGhNIMcXqLEhYra7Adft8KSjoY1oIc5pdc2mK0iUyj1HqP6w55FFzlRHuYk9AhiaI2S4ygw2zgUG5RK0KT7a52j14Y1iq7AWSOmTSOj8FqR59NM0sl28rntuxhMJQ1OOqfWWqy1zJPcx/LnGmLcx7TLcrpcxqTFSbhL3Hl8fGSaNbkczOHE03Xler1yu24EPUFXHGkFFOtTYj1EQ15qeiXHiEFdutLOGIxRrDeh8rx9dxJMW+8YW+HTEylF3uTO+fyIdYpPT8/4ybCmhOpwfhDCTMMSU8K4E/PiiGnF2IC5dErtqCbdeqMc0/yWaV7x1mD1RJgmLpdH9uMm5kZn+fa7zJfTe3qTA83jw5mX6xPT9EA8ZJ+wWhPTweRPPLUV0zQtdX72xc+ppZKp5LIzhZNITqrm7dsvyfkZZQIpJq77hrdvsbbzcJHkyzBN3K6JI3Z690xTEL5x69RiWW8N1MHDQ6BmzezfoXSi2ZFixUzKB7Uowgm0OZgc5FSgi4Rr3W78tlw/Waiq7vDOo1TH6glvZxkVt4RWnss0A02cZ70JmiI88uUXvwDaqP4LD5cH1u0zOe988e5nGLey75lcC999+Mg/9hfecNs3cAI771qYkNZIPF9DHJDa6pF3DiDiZG2Ea1ZrG6YB6WDWUqha8XSs7Erz0hzaLqxHpePxbx64vhykdPDpV/8779+/p/TOL3/1Ky6PC2Fy5Oc3HBtYp5gmz8fP35DySs0Ta154uDhKieQE83wiXm+EMIkr3qkRCdkkjzkdtJpZZgsNrF4IZqY42FoUjmtuOKXZSqRNmvO7hXUXZIWZOs4GtvXgfJkpz53eDky5YX3n5bqTo2KZNR8+PNHpnC8z86QFaH+amaeZWjPbukNPnKYTpRw8niec1Tw+PBKL4vPzDWscfrGoobPSfmKaPEfa8ZMkZoTLhVTS6IgI23bdK3O4oJzh04dvePN4YVs3XEpQNcF7VG9UCjke5CwdilJunOcLbrqg6FyfvuPwjvObR9J+8PH5iduamZYzz89XQXdUMeooDSF4nJvJpfP09JlffvNHKOVGN7RRWkdhXk0XdwcySOFhtNAIlBYXcS2Frioly2GInlDK4Eyg9xF5qoeZYnSkldLkLFnhrdTB47xzKJVoq0D0i2Zo2+iUUlm3yr/xzX/A793+yp/h4/5/c/3Bb+6v/q24fnuCWP4/vf4l/p3XX//5v/ov8OeB/8L8bQD+o+/+Y/nBXdL5fyVL08D09/23+/nsviT3fxP+36IX/7S98T6B/Pt3q/yjX99/Nl7Tvxf//df3+J/yyx8TufjP+OZPvs/KD+/hT/vz9Y9+fjc63ZtN47X99+q/5K/5f1u6s0qjuxlaT9BGZAo0hdEeOzi9DCbZ3Vuhhz7XakulyiTPaGoRNq4296joOtzrVgx/tb3++c75kU6IBAsgyDyBv0pHTbTWCuvkwElXxKOSjUgvrIUjykh7PSrOCgQ/TF7iTgeM/3l7ohRxwOecZTJgJ/SeWU6e2/OV/Ygc5SD1MiK1g3BBleLIhVoiISwoDNfbFaPkUGitxOMaKxr53oVjfHwSfivdkMsBXbrR331cCeHDQEltMhFyEpts3R0b5mg1czrPnE4nXl4+cgozKEhJiDank2O9bfiwoHTDWUWvhlIa6/WF3DZSPDDGse+GlBqtb1A7xia2VbNM7zktCWMVbx7O0KAWxbs3iT/4w79Nb285TW9xU8apjadPidw1L88bTcG6PUvXXwud4XIJGNepfSUdYorTyWNsYzGBeXZY67FaYT3Eo/HwOJHLM+f5DQ/nhHWe56eVy+VL0W8rRU4dTGcKZ/b9Mz/7+mv++O/9ISl2ctSo+pPl4T/Q6ydfiXHg/YSzJ5wpLCdPbYlt32gFHt49UnLh09MHtviR1qFdLZWfCSJiX6ml8nB5S26ZfTso9QNaS1zn0+1XNAfffPw1a0nYaWYgrbFuobc8TszisgT76uSUln4b8ujBpBsd1rt43TnHh4/P/Pr7Fz7frqK57QJ3fnz4c6B2Xl6+R7Wd6/5ZCgktN/p2JD7XDa09Pij02shlA1XJTWJPX/aDXjrbvrEeK9M0sd+eiHlHKZiWC0dcMcbj7ZlaCu7I1FIxeuGyvOPD8ZFcMtO0oND0WjiOK6eTZ8ue67ax7je4ZmKMtGJw/ivOy4mYV4zJzNOZYGYpniy0kimtcXtqBPfI7GZu+41vP/6S08mjdSceG05vxCNxXs5YfdfvFb54mFm3A9cDSsP1JjGyi/Wi6ht50nRNiSvOwvksMOGYIsfxhEExnyzaC/dTa4mhtUENzAwY7XnebmjbePzZGWcu5L1QauQlb8zukU/PNwqRT8+f+Dt/8H+A0hyHpCq1LviXy+XMFBZ6d1gbJBt7X6FbIQ6M+0EIjGKwkqSdJFzbrEbCkBhjJIbTo03jPC8jZWZn2w6MdoNAIUDsUuWgJmk+wlx13tCMwZqRS15GXjUDg2IFO1bvurrRafoP/5t/98/6ef//zfWf/JX/7jf9Ev7h9Q+v1+uf7/8KGilOaz7QSrPMDqUdrSdO00KMWTTuStFbxlvB693xinfjlVKaOox6EkTQhZvbJHigjfhTax1azZKUNcb7IlqQhk1KGUXH4V9NqVqP8ANE2yvGsgZDAhWzdEaNEeTVkUVrb63lZZWTXKp1FMOS2tWQ1LBO5far79Gqcr4spCic0NYbRxTXeWsZ60eX3gaMLVhncd7RUNQsbFo1cHAdO6RRYaTTDYLMgPM7L/rcWitpu40Jq4T/qqyluI2Z5WRpTaO74rruqP4ZVGF1jdIynUKMB3bIyY70CW2F9yz+CD/4ppbWKrXdcN5QX9bhCdh5fMlQNdv2DcEZpkWTszRnnHcY3/nqF2+5LF9Ri0GZxONlxvmFfStsR6QSqayUJlKw3qcRtrQTU+F2a9gEvRlQjYdzICbxAlnteTsv1HplmiZU9uQcePflG2rbiSXRlKZ1xzQ5/Nzw3mL0xNu3E87N/OIXv6A3xbYV9qv7TTxKf+r1k4Vqajvb9SC4M60atkNhnSbGVVJs6PSeaaqw50JrnZRvbN880ag46/F2YX9axeVY4LYdIye48n9S96axtm1ped4z2tmsbu99uttWZyh6GxwFDM4PsIksJY6NTYglSFxJDCgEO9iSjQOyE4kQrMjGcmKBHAsLsAVBiAAJBqWRDSRQ2AEMuCi6ooqq25x772l2s5rZjDY/vrnPLaK4/sRBeP64V+eevdfda685x/jG973v857SgEHz8PE1V/sFLo3gMXSBVNKCGhIeqMrCT6NKHq/6uML0FllS66KLU4Z1q3ny1lNef/UtjD8wDSuUTpLQMRqGaU9molt5YpxFpO4vqDUxzROpzlhvxc2ZDN6JSFtrQ86VagIxVlabFdM8cRwnXGNwbUuMkimvqkTMGjUQYySETKlgjSaUNxbkiOjw9MLBo0oWeo6GeRLu5OF4RdtrnOsZjiObdUNVMl47Ha85Wz+gaRQhj1zcOefp5RNiGkmxw2BxxuKdp237BTYcmMMNWjeCAUqROMqoyjcW4onV+X1QmRBEZzgcb2i7FTlmVBENs3eO9arjbHeXaYyYLTx+/JiSA+vdVvS41qCtpRoIOWB7xzTOWAJBTTJSzZbDHChJdD15ayk2cjju8U1LKAd2F5YYJTJwGCIhRnKcmULieLpZCBHCOvTeA4pUE9YqjseDaK9cSwwCpW59T5wWDEmzwq82xBjJsdBttig1oQlLPO+M0bcdjboA5JekFIU4vctt8slt9rNoyry3sglhFl6ijB7tEqBRKzhrgQ8A8G2f/oN8x+V/w/92/AFQt/GQsrmIcYLbPy1uYumgyIYnzE+tP27LWrA2tzi3W4bfbQrQ7eb4wL7Ed9/7Kf7048/nSXnjty8Gi9zzi7sv5d/s/l3+8uWfklHp0oWWr1nkOQsAvC44procJq21z0DsWn1cqlyVdyepKZVS87NuN/D2z621FAIl82N/8n2iNTWGKvYl5jBLGk9OTNNE0/a4bs1wOjIeLwU/U8G6VjipdUIrL4iiUjgeZjFJOqE6DMPMMF5TyajaipnENYBljkeR8pj2WRDJai3xsYfjgLGOtmmZp1Ec5UZzJ73Evfk9aAxd3NHPZ6QsI16tLKtuTdt0dE3P2dkdVt0WLTmYvPLqR3nttdf4pE96Ly++/BLzAojXwEc/+hE+/OHf4FM/5TN48aV3chqGZ/fik6dv8eabH+GPzl8DwGuf/2vyWf1f8rv9Qb6DzWbHZ3zGZ0EVxFzKgf3+msePHmNKhdmRQ8dav8icIqEEnNfEOrMPe9rWo3TiVX6Of2q+Xw5nRQyJxliUNqQi1Im6eA1iTCgFzsI9Pok/kP40d9sX2ay3TNMklIV54MGD5zjaS/5J+U7esP+Em6s991Yv8qnlC7nz1ueQwpbV2hHmRIoKrSvHcsnrux/n98//OQBfdfaZhJj47pO89/dtPx1BjIkMKaXEcDpJWhs8Q17FFHHWSrJXrRhrn+Ghak3LAVbxffNvcXujmiUUQetK01i0aqjVSJJe1YsxeOlcGrMQC6T7couZmueAQaEXqoJxhpLywtSV59toIzKlcpQgjpKwGFItS5KVTI+UztSiyEky360T/qjRhlIWtqgxaGtknZ4rpdxKNBKqOhQQJ9GfguDCRKogcpbWWbQtxCwR38oYDldHFI5sJda8JgMLoUN0zVCdZZozIR0pefEHKEdF5A3GasjCBU4po3HPusDCL15oHUX4x7XeroNiBBtOI9ZVnJP6oZJJRUMCayR+/RRmjHdUhC7CErea0oSzHbFEUknMcURrx5wWaUacCLliTcdSszPNMyUXYjFE33AKmeMkhte2XaFRaFOY5hPX1zd4X3nxxXvs9ydyMAv20WCVQ9nIFCJDyJQy0XqRne0PkTv3VpzGI6psiPMJZWaJV7UrQoRxHPFW6iPvJ66eyO9b1Y7hMKEUhHHCOsWJHtSe1aoS5uslsr1j1a9YtZtPVB7+jl6fsFDNNZNIEoFXlkzjsdL1Dq0TUwzENGCthAKkJHq4qjNGe8Z5pipPieLSbaycSmqyKBNBe1LNhGi52Q+iVUkS41lCol1tiHEWFEwxi6ZPcnkFwG2XTVctUG0FVUYltxDwcYp88Jc/yhd80V1unkqBptzE5fEVORXWyjBqqEZShOK8FMHgfEdKgRAym9XzpJjoWseMJGAY3TDlkWnOUC3aWEIQ52PJijCfljFHZkgyK0pRjDdzHNEZYZ3Vys10Q8mB1jm8d5xOM85FLA5q4s7FHZp2xX5/zRSOmJMF42kazzwdMI1CO3GMal1Yry2nY2Q8HblZ0jvWmy0le8lypkEXK0YRO+OtQxmNcw2Na7l73uIb6aBv12uGcRRObJYC3DnPeuUEJaU0JUIMlVwUtulRyhBLIVVJDzLZiMZQVYmdnWeynnG2EiYB6vvGkpWAz7ObmYrires3cA7GU8V3ljmdsK2FqVCZaHt5+H3jyTkS40SaR2xZMccgp2TbMM+R1WpDSQM5DmStOQa1SFsUKe6J8UTJFd+0aF2JcaBkizJaEq38Bu81KYs+NkbBPYm+TZGraI+dswJ7rhJdKNgbydEW53Bd/r8yGZjDzDh9/ByzLkgvmSaUW1PQbdGqZAND3yJ7zILkqcvAQSgZt6BxY/Si+RJdoRR9H1fMLs+QFccRxgjKRt1Wxahnr6+VROlqLdGkF+4uX7P5r3iP+3QemJf46zd/nh8ff2jREYpbuyIpTyDaOVsa/tzZX+MPdv8WAO8ff5Rvv/4GQp2l064UX7r+Wv74+qtZqx2/Fn+O/+7mL/JGekXGo1rz/PZM9Nuq4l1H03TLs3xYdHQtkUK2lW23pr23Egx+VSjrmcOJU3hCpcHbM4zV3BwOzCGIOa9I8TOHpzhbMarDWEn2StmwP16SU6RxK47DRMyJze5MZB+1UKvGO8vZ9g6b0wPOji+yMXfY+DsSXVwhp0TjGhovyK3jcaIUePD8S6zXG+nkWAkXubq6Zg6Rfr2RtJxapUAJkXE80XcN6/VW8EW3RX1ITNMIHwf8zzkJVgkvd1oxnJ3dwbcN4zAs95qnJMU8T2w2a5qzlvEQKNM1q7xFqw5TNE77JSAhM9VL1nXHO8pn8tHyAXHEq0IOmZjC4iZfEszTEkOrFRvu8Wn6C1jVc9qmXTCGEmG63Z6x2615ePPzvBJ/gc7Bqu0xfeBN/fPkWLj71hcRprx0Iytt1zDftDwoL3/ce56eaVcBpukousuFAyuopmYxxkm3D73MX5xm3bYcDwchwRRJaAPhqcb0tmag6/wC/I+UAiVVXCuBC6VmulY41aUUmlbMlH3bi5wuSsDEPM903jLXgnNODulzIC/GNYkIZYnRBW3SYhKVEbxSBq2RsBxlyVnWXK3lUdbI/qm0WlQMgm3qOk/KGe9FX2uMYTydMEYTohzmnTMoZam3+y+CbgIl+2rQeO0lDCbOC5O0YpTk0UNd4pqthFBk0TeXmBbdrSEl6bDq5VAeoxiFKAkWYyoqSXQxaWGzZpq2o+IEg6WVTC2NRSuREZTCsn5ZjHVoI0Yppasg1FxDjWC9o1Boux5lDOM04ZyjlIjWeTEee2kI0FGLxtqK0T0ViLkuZs1ATpGYNON0wg2BOC/rtb2WAz6Gq5vCcNqjq9Bk5EDfgAuUUslpwFrNdJIptNae8TSS84jVK4ZxeOaDaFvLK6+8SeMcxghKz9vC0ycHnDPEeGSeAkZLcpg2hVhuaJuea1ugGlpv8b7QtonGrT5Refg7en3CQnWaF5h0KcJlU1JE5liwpkMVRWtXnMYDsQykDCFXppAlzSRrZpcwypJiYCKy6jaUAmESOsA07QmTZX+Yl0Uv0vUN+ynwjvsvc3X1hEPZL5udLCq3mfYgpx9A4jkXjU/OsrFnDW3f8MEPvMq/8cVnzPGKttlKYkwdsTiqFrHBPGfKUbPqtwzjRNeK+SUElhvuxOk040PDFCLogb69Ry2RMCOdFiVc1xSFnZaANA+0XYNWLVYbtE4orRiGiTubM5ztmMYoSRYkYo2Mp4nGd+Q4Y0k02jOPlpQzMQv0ew6VNN+wNRd450n5yDgmTscj1EjftuSYyDjOdufs95eoIsw5d5sDnxWrbsV6tcEavYj7M84bXPXc7C+x3mB9S289FcfpcEB5i20tvlGEOaG15tGTNxnGAes1yjmgoczidPWtES1rFRZhLBnbarp2zTAmQlG4xuJ9i1KF65tLTuEA1eLXA1oVNm5FiomVmWibjvXZOW++8Qq73YYYCl2/5q0336JvpOleQqTrDN63+MYRA1hbOOxP9L1ivW5RC4YrROmGWjtwc3Ogac8kBpgCumGcZmIaGcwNJUs+u/PC5ptHCXRofE8pSk77ScT+t2xfScFZko80bDdb7t3doZViDjNX14EQf7vDstYqZgppfkrHcWnfyhRhEf8DtyD0ujiSa7nVu0lGeilLrvgzXS7cdisrS64tisFOAAzjxFDk5H3bkb0tbm8vvRhYlNb8Uno/PzT9Pf7S5m/JRmkE12bMbVd0eRPLD/tn19/My/a9fPXTPwTAXz37u3zV+Tfz7ftvAAVf2PwJvnT9tfyVyy/nYfow79t+I//F+d/na5/8Yaoqy3MvKT4XuzM26zWNk47K3BoqO5TSXB5uOKUZawp9MTS2pzpNqpXRajbOEJckFudaelWYRkfOC7LHgN2c46xhu97hnefqauI4Dmx3G2KFKc4LQaFydfWYmMRRbk1DigPr9Bzvnj4He1qJVt23rLodfbfFuw6tDM53jOPEq69+EGU07+p6KUZ1QqtEjAPeJV568S7b7RqtFN44NJp5nsll5vxiR9N2i5ZfcG8llyXjuwX5aJeY47eLNq01m/VWDEzWCn0hJFkf6oxS57TNDuoIbYB+wEwGNfaoaun0hlwTHog8ZrKKzeq5hREsh4YUxACb660hrEi5VCobZdg091HLszpPMyXLNO7s7JzfuvxV/tHD72XeZHLQVDzJdUxdZj5/SnM8Muz7JXpTumvSqX87mUobQ+fsMw1y363QhiXcQtbj9Xq1TCPMcoDMtK1BmUrberwTXnSci7jqS6btPIfhBsZlC8pgjAMrB8SubUg5kFPGWst63ZPyTJhnKtIpNAu/u/GWEAI1R5zvEXlpxmkFVhNqxVtL3zeEJEmHFVBVP0tHkwOpXuKchXZS2dIUOwAAIABJREFUa7fIpIQOYJQXw6WcZRfjlRKyQw6SwGUsORSM8jSdRjKcwDWGnDLNgmPMJS/7BoLEqnqRTIHXQuRJqZCWWFVhG890vlsO+AbTGmp1QBECiCkYLwbWkIK40FXGOo9WlorA9b13jLNMuW4ZzbeNgbREkTrbolQgRdFu1qSXLvMycbEtISlKHWldg3N+IR15nFmR64yunsY0OO2kgVUNYOk7aUbIomqFKlEV1lZimgnJopRlnhLOdNQiz5RzPfM4i4QgW/b7gVoNioRBS+FdEjqJlyKXRAoNLLpi7xqGo/hEUr6mVE3jVsQ0ok0iZVnPjCvkmjidZMqUs9QcXdtLZz4mdJaOelBiKrbK4Y1hHCOnY2Ddbf/FxeHv8PUJC9Vf//BDOeEuwGfrNNtNi1JJUoSCo9bCHAI3+6N0WYxlnsJS4IJWhVXXLY5Fj3Pi4p/mEzhFmG5o1JrrpwVvK1ZJRKJtG4bTkTBHtusz5lGiPG+h0iEbyhyhLMw6yYdbzFbSRVIKnMu8+eaR6yuDbitZTaRqmUMl6BFdFeiM9g1X+ysury/pup6qDONpQhvNNM8M4U0urw60fs0UE95njIrEfM29O+8mhsKbb32Ms93zTMPI+gxAUY0mI07wKYz0XcMcJI7NWieA8hro2xU2G5TSDOMNRXtKmpnTAN2OmkZSGqk1k0+GVX9GyoUhjDS+oeTCPJ1Y9y1UT9esMKqhazu8aelsg2sqc5xpW/neOZ7Y9GuSIOJorGKeBqaTcPggcxomvFtTrTxM2oCzAgk/XE1yaqUSS6bfrAl5wjeOWipTjEvnoDDPsrjKIinxiFULUFuZxDDdMMwnUqoM8UDIl4BF2wBKC4/OFTq3AxVZW9iev4daA8fDzKrriKEjxpFaDbWd2Kx3VGC7W1HrmsNhYHPR4L2nbVdY3dA2LdMoaRwlK7q+XTTUkTRVkROoEWUP3H9ux/XlkePpxOEIMSpCGHHO0/iNbDxGOgzONVArU/Bo5QlzZL32lDowzU8Y54GuaUixSmTqLZQRuW9e8u/i77zzR/nk5jN5JXyIv/7WX+LXwi+hlOaPbb+CL9t9FfftCzyMH+Pbn3wT//T0E1QqX3n36/ns/vP51ekX+KO7rwDgh2++m++6/hvPpDLvdp/K11z8Vd7b/F6MMvz69M/5869/GWGBpH+W/Tz+/fP/jPv2BT44/zx/7cnXcVOfLJKXshThYkh7kh/xI+kfAFA2+Zn0Znkbz0xrdeloNDR8Ufcn+C+vvpKn6SnUynfefCvfdPH3+LbLbyKpwB85+wp+dPgefiP+GiVX/vun38IPvvTLvFd/Hh8IPwO18oHfvGJ/dcV61dA2BmuEuNC4Fmc01klCV1FRcsW1wqx4NlK96Lbo1YZxPnEaR4bjAac0rZXo1aQyKc6oXHHaYbOgx1qrKQ20tWOYEjEPS3JSJM4jKc+sVyueK+9gd3yJdb3gonmO9s4ardrF9Ghx2y3KWfk9VsXN4Ybrm8c8/8LLNE1LThFvJQUu5pn11rDb3UFrKwbNBaUU4sRm23K+vVhc20r001V4natNx3lzBnv5SMzSAbstVl944Q6rtSCKbtfQnCK1arbbC3a7M0mxKZ7iMsEcJaQhw+58i9FAmtAxYufKc9M7uJ46fn3+RdHEFZbn16EoOF2xS+pNqYVen+HNBW0j1I1hOOKsp+ta5nDkN17/WR7mD9NNDcMxU2tmOl6xPetI/iOY/ie5uPk8VL73DHavFJwOCTp5z33TEua3i/PGdsuEwuL9AvbXilwzzjb4xjINx2W/smzWDu8cx+OBslIoGpRSrNdrVusGruR1V71imsTX4By0rWYcMrlEDB5nhS1LMeSa0GhiiLRNg9WGl55/nkeP3uB0GnjHSy9yeXnJMBwxWrrz2hiMsxS10A2qWn6O1dLhlKjlimccB5QpUDTWOXLJsnZ7s0yDZiGjVCNUnZIXAsuMsx5nJYJznqsEuhgrBbdTxHSkadakaMhKOrosXducJqzxSJhCi7USptB0dTkEbDA4DvNArSNt24l0pxaMLiL7KkLlaL0jZUVKkZw1XefJUWF0otYBS4NvNCFMlBKo1VKzlmTHWokRXCPNK1UVzhlyTDjXkGJLpeJ8Q9u25DzSNJ2YsHPGmB6NoVhJiytF4XRP5w23SXCpSmR0KRIgYJRBK4M1FV0cpUqynrOiS9Z6MYgZR6kZbYSxrKo03HKR1DZKWCRG4qXIC+VB6SqhK9WQA2AimpYUZlCJMAkzN8eM8g21JEkM04rGGhxntK14LFCVMEdQlpgC3raAIcaAVm7RQf8rAvx//eFbKOVIUc5U1gqI2TdeosIGyWuvwDgEWreGcqJxlhQrsSRSHui7w9Ly94QAvm0IaZLTLIHedExDpnXmWUSqt5ab6yvpOBiHajWH47x86BVlGnTVkndcsnzfrVSuFoRZKOOY/SHyM+//KJ/5rz1gGAPzfGQcI3fub0hTIcaBdd9yvT9xPN7QND3rTUNNhm5lCUu+s24KQ3rKcTzRFE2ePeudY3/aA5rr01MRZudCtzlnu7ngNCWGaUIzoapotA6HyJ27FxyPB4kEbRuOxyvJXCbjfCPd3DjRdh1BBVJdWJQ1cxzeIJaK94ab8Zq+tqz7nmpEghFjJFHYbM7QqpLCjDaOlJYFh4rWDRe7NWGeOOyf0viG3q/xtpFTfWOw1UGJbLzlFCfO12c4I0D50zSTqjDZntwc0E5iA/fDwErFRRyfSVm4iSEGyBHvPKUmYigch4OMB0ugqEwImabpmeINm+2KWjXHYyQES9+uUDoSYkWrlnne07g11iraLgMz9+6fM82O+/d7qhoZpxucMzSNEtRQ40h5ZJhmpjhxOl2z7nZohDfoTEfbboj5SBgCp9OEs+AaRefWxJi4f/853M1TTscTwzBTVUarmVwEB5SYcdbQ9GeEELi+GalFgPDXe3GuojL96jGbvmccMjE62v63j1m+ZPc+vvGt9/GR8Gt82e6r+daXvo8/9bHP4w+t/zhfcfZn+Stv/hk+En6Fz+2+iG954bt430e/kNeiaOU+u/t8fvz4I3zJb/1ePrX5bL7tpf+Jn5v+D355+lku9D3+9gs/xPdcfxvf+PA/JtXI56y+QArKIsXyF63+GF/zyr9DIvKtL34f/9HuL/I3nn49atGg5VIYxlE2gI8remqthBAZhoG6LLJvP4+yub7YvJtGtfzq6RfIiI71V+Iv0N7teFBf5sPTr/Bu+2l8//XfIQZxpw5l5LX4Ed5tPo1fSD8NQKke264ZYuA0Z+lmqULjMlplmsaw22zomoa2NUQ0x1BQc4YKYarUOhNL4GY4sj8c6NuOi80Zfd/imzUpyj2JsQxz4M3Lp7RtS9duSDGS3SxJWabjpeML+HCHUAc6Os7My5xvX8Y3Kxq/xduOJ0+uePjwY9y7d58HriEVAesXZMJxcWfD888/QCkxoBgMJWdCFCZl260QHFZ6phEsOWCdSHa01qQq8dGCMxIQeN/5Z/eV0sLavP3M7j84E1d4hVs1cVWaftWzO+vQZr0YESsxRVRM2CZh7MzsoF9v2HYN637DS/WMT5vew5PDW3za9B4O+pLX/W9ydTgyzpF5PEpUJlp4x3rHc+6zaPwZbdcxTjMpFdrGElPklcNv8mvl/TTNRvagXFDKYXQLdFyNe07lZ7jwA/fHL+C55iWUMuy55P2P/zGf8o7/AIA0Z8zH4aoaCyULo9UoEHxooSpFppJNRS06R6M0wyFTOvCuI+XMNA9413A8Xct+tFwX5yturjVKefpVSymJ8+0FOYvbPoUoevIiMpvGd+QkBYvRlvOzM7SZ2d80PP/8S2idiWkm5UIIgZQkIEEh3WDrHN5qjJbpYspCHnEOSlrhm7TEh4pW2DqNbx19vyalmcurR0yToOOstegikyDrLE3jCHOVQALXopVlHAPONoRxIoSZWsUvIpMijVKOeQooLbGmt51k5QyqVmoqIgEomrYR7J42FVhYs1nIMRRBvikd5XPTmlQSOY6MQ2K3WxPSHmdatEo4Z+UAqlpqVbReoTTMs4SMZFNQLGlgJpGSQjuhyzknaEWNI4SJWm4DYRD5jpe/t7dMb+3QWuJZ26ZnilGMtEUtEeBZ6Ei1omrCGAlPyLng2zU1Z4oSIqs10rRJc6IsB39nHbXqhQQo5AfTWOaF/VtIIquLica0TDGgVcZ5odWUGFBWDGFFKUoCcqbte7KO1CyJeRoLZsGuOY3zHTFCVSe87Yh5xrt/RcxUVvXkmsXwUCwxwXAYcE6MU7mW5Ua2YnJgxrtKDhPzVDgNI01rydGgteewP6CsxceRXCdM6Zc5ZaJ1K0l06jzjMOFsQ9YiDB+HST5UFNMkcZDOGuk6+AYVFeMo3U/1rJu6aOuKQaP4wC+9xpxHmm5DTEeeXl3y4Eo2hTkcsfpEyZm+b7m8GrjZHzBqzWbbLkiShO8K8yixhbVYVNGk2PLG5TUXFxc8ePAuTqe3aFsFpcWYDqsz+/GxFEy243BM3BxPmKbFVsWcBkxMxHDA+4YQT2zXFzSrjlQioUCJSTLTlZOUFl+4PL7GnYsLjvOBVDtimXDG8db+MSWDdw0XG0FrSMJX4OZ6pO16qs5AQrsNWXnmUglhZIga5zzeW6IyxFQZywlbO7LODHHPGBMpK66nI5mI7jsCgRJmwulIIRBuDG2zAp2pGqZxlJG5K9wcBipxwUR5KonG7ZjSAes0aiEvOL8iB4Uziabt2e0uOA6PUHrC67vMc0BlyxwHpnHCm47VakPfbZjjJaUarD3Dt5YY4HiQzeA0DPjeS0cnO5xrefLoBsic7Ub6fkUMiXGe8b1Hq4L1npgDjx++zgvPabQxKFvYXbQ0MxitSFEe6ra3KAUxPkUZTb82rLoNw3BiGqeFodvS9om1DzS6MowR9dv4OJUfO/4P/Hr4RaiV77n+W3zJ5n38wdUf5svOvorvuvqbfDj8Krlkfvr4v/PPhp/iizd/ku++/JuA4pXwYX7w8jtBKT4w/Cwfmj/Ip/jP4pdOP8MXb76U1+Jv8b3Xf1sAk8Avhp9eNj0paP7B/r9ltEcU8OPDD/Nvb74ctwSQGyshAjJqXUxe9dagtaDMtGgoxSjFooeVJLKNFYF+MCcabRcFgsge7nTnvKEber0m6EG6SIsTelQHds05bWxRCv7A534uWsnYzxjRv+UykdIoGlrlBayvQKtMzTKa00iS0DgeGY/XKO0wrcEljbE92p6L8U9lsg7gJGP74eMnPHr0hKbteNH+Hu7Gl2kN7JCYSnfasan3MK1DaU/XntG2O3JR0gEpcHl5yX6/56V3vgvjLWnKGKMXtFvh7t0d681mkXaIqDDnSI4j1nqclYQpVRWgyTkyjyfSHMhVQi9UlohgKszzkTAN1NXZx99aLL8FeS0tsgfpgt/q/RPKJNq+pxRxPVvnqSi8L9x/54usestvfuwRQ0ik6snVcbbpuHPfcufuPX5P+gzUKrI3b3EYBvb6huHeaygdCAGurwaGm5mz/R36Rw21VOZpfoYl+ujVr/P+8QcI55eYJKQS6/0iWDFMg6SnHdORk/sVXj28ySbvWBnHyd7wWL/67C3Pk/Akb6/Wd8QwY9YS7RlCwrcWZQyn48iYwRiFVhVNICfLNEikZilihklBtKd+/Tb3qgTDxe6u6D2TFKfOe4w2nIYj8zyKa78I07RtPKqVhL1aC68/fI1x2pNT5a233kShWPWdyIJqQiuIqdA5jzUF5yS8QFVNSY6+W5PrDDmyXjvads08T0t0q8E3Fmcrq97j/Zrdrmd/3NP3PdfXeyoa38gIXWlJqBJJCIQws9r25BRZrdbEPBPLiDI9bjkYqQrWLeuCymhrAJm+ppyQKLMZ6wy+gtFWQpdywRgvTF4DXSOeAqUWDXTNS/JbYLXqMEZjcegKJWaMdrS+FYNcBmdbOUwYhSSfLR6WjKRa5cxmuxId7hApOVOzppQRZy3OdIKgsoZKXtY3UEYMgcdhQKmEsx1934h2OCWaxjEF8ReknJZ0rVZ8AkqMplhNRQp3mb5VlJXC0zmHNgqrFbkUicm2HudF96u1yDBRRSQmSuNsi/cLr7tk1r2subUoMfIBMZ0oVSJjKxpl5BlqWvGSaOTQXtHUqtC6xeu314jfDdcnTqaKikwmxEEWUzylSK5xCIF138qYHo1xoOrI+XbNcZ+Jc8XnhrZ48piZSyaPmtWqI9yc5AZVwj6dasRURd9sBGivHDVXtCoM80DJchLTKKY5UWoWd12MzxZYyVyXtqo4M0XnlKI4N6+fTrzxGvTrymancdpw/XRaXOIzUFh1K+ZTYhwqeumUHW4SxjhCGlFGCuYwOeq6I1fF/nRYwPOZ3XZDCI7sKvFUGMcrQV3NRzk5Jr+cZODmamCzPucwXJLqpYwkvGbVn7EfRkwaaLRhPt7QNB2palIcWSbL4nyfB2JJmJpQyZCqWmIHB5QxPBlPS5SmARM4xj3TTeXevedQzMynmcZ3uPU5x/FAVQNhvGLFlv1pkMK/RLLxGOPYnyaU99yMR6KCWjSHeQCrSfMIRn7+65sbDAWrHMM0E+JE49dUJWaKcRrx3uIbS4wVSln4cSfuXpyx291lnOZFN2ppGoVye7QN5DSS65Gm7WjtmmGK9P0Ga6y4H5WmMOFcT7M6BxU5Hh6z6s7Zbs85TgbfwfEw8/yD+zhvOTvfknPAt5VpCLiqWdcN++M1pRR2zRlGGbpUmesl05jYH284O1/TrQ0h37Dd3iXHBm1HmlZzOk3EwXJ+Z43VLfcebJmmPTlA04nY/3yzJsXCk6d7MS4tlwLeiL8luqaS0aryVnqVu+YBz9uX+Qv3voWvu/vNz77eKMuj9BC1cF2f5kdLtnoVN2o50akVtVaedy/zaviIANDrYopYEt5ur6f5LVm8K5yyfG/K4s7PKQv1IKa3dbHA23nm4k6Wcf8Sa1zf7rqeisR3NmXNxBFlFBslWqhTHahKMdYjLVtykfG1QtGrLcd8ENpGhddeP8qI3yqs87LIWzE4Ot/IGsKyOWqNcpkwF2o15Jo5FU32K1ngdcLqmZjg6WzIh4k5HDmMR2KSbod5vOPezbuhalLcccxb4VQW2G52nJ/f5/ziLk+vr3jj4WNeeOmCtvOkIjq6GAIpDlxcbNjsdgv9gWUjCcQwYp1ekrmEDFFRhHlif3NNv1qhTQNqiQEGQhgZDzdopzCuve2Hom61bnFEUzHm7QhVrcz/Y/9xqIUh7Jwlp8RwuuHx4zeAl9id7Sh1lu5ukcPHMB5Bt1jrqRGBvU8TV0+vIA90vafr1zQnSy07zpp77PpMnN9J3Qw8XH2Y/kyxWu24sPf56M++xqsfu+bu+l0kc+RR8zEe9R/j/lqT4wtM00lGoohHoWksJYlmT9kd1mfmcCDFPaozuHDiX/+kT4GlVn3PJ7+EdRUeyZ8/87Pei7VpORAI2L6qxPXNNW+++QSlNdM4Y0yLU5qLO3fwvmGaTsQ8E+YzwDIMM/fvXzzjD9+9eI5+3WCN5smTK6wx9H2LQrNei/wnpXkpPLWsy1oTZ02Kkc26wznNMJzIeaTvt6Qoe2TXaMzKUsotZUSigE9Vc36+5vrmiq45Zw6JddcRQqBvPH1jOR6OVGNBg3eG4XhDbnogs12tMMbSOLvQBqAsVBBFASUTFFTBWhnfoxWtWTGHGauXQJSiRONsxWQa88y67cgpyN6sKvM80fpGpmuqgnHkkKjFoQxsN2uUEhpC2wRSEqPXPCest2ijANHimtBQiqbrNvKslMI0Bbm/qxikjNU0jaFSiCmTkzQZum6J/NUNxiS0U+S5YkxL33WSwlZmavEYI5G4t5KaSmS1FmKCNpVaRRfady3GJjqtuDkMi4Er4lS/mIgVJQYJl7Air1FKGl7OyeG/6zrmEMSsVyshSGhN45wQZ7ST9D2X8V6Me9Z0eO+JKTGNR5q2JYRISZXGO2wn8gmUJKEZq4AGY+3SLEI0zEXkH1ojBmRXyGX6ROXh7+j1CQvV4TTS9I6mafAbRa2GNCu0knhFbytdY/CmwRmDcxO6aDxrLu5tmaYZpYW7djrNOM8yTq5Y2+Pahrb1pNlQk6Vrt1xdPsF07eK+L1iT0c4sHSdN21jQGq0Vje9IWdxwbeMXXEahaUQUbbQmF2FVhuQIJ0MeM2VSNM05qVZKrtRi0drRtD0xDHTaUetMyYp0ymi/IowQC5yfb7FG3N77m4qyEv94Ot5w+WSPobLqFU49pDxSkiTUZxpnIVpW6y33HpyTM8yDYtucsT2/4HgYGKc9vjaEMLPfP+Fse4ecZQHIpdI0a0mT0hZnzii5ilOzWxPGyKuvv8nzz73Maw/fYL1ZEWNGmZHN2QpjWi5vjqjqGB4+opaI04X1eg04KuAbyXXfj3vmNEMJqLJG2REdNSUbWpOY84EwZ9puxxyLPATGoLXjNEds15F0pOvuLMlLBkxHLrNArH3C9y2nITLFPYYTTWu5unmCb+TEfHU1stl6qJrpuMdHRZgL1Ib9dIUzG7quYLSmlA1VF0Ldk+YJozuUakglsFqt2WxkIR3Dnn61ZZoGGt8wDCMuV9p+xTQlQpp5en3kdIgM48Q0H5ljIJbAetuw2q7wpiGVSL+RkW1VitWm4eJsQ40bQrpB6cru/Jxt+yKlHHj8aE/TO6p2TCTJrscTVCX7gNtZ4vh2oYiCF/07Ja0nifbrgXuZx+khb8ZX+buP/mv+8eGHMNYsXD8JDVAoKcxqIeeZ2w7ZLRIol8Qb8VW+aPM50plS6hliBgVpwbvknJDox/KsYL3VK91+fYzp1o+1FKzi6EoxSbebZ6CC5YvkXx8Kv8pcRl6u7+WfnX4aBXxy9zlMZeDXbz5IqDMfmj7Iu/Wn8Y+m/xmAjhUvmnfxwcMvMkwTVPjnH/xVgZ0jXEgxkpjF9ayxVtM1jq6RjoRrDbVqppCJRaYyNVtCyMSUFz1ZIIUgmegxUUvlLDzgTnrAOm9Zx4vFYDkxq0zXrtltz9iendP3G1KF1x8+5XA88o53msWhLMlEKYu+7/6Dc9qukVEfcphIKVBywa82qEWDipIEp3kWc553a9H+LUVsqZkwjRhVWK922IWoInnzkgdec8KbFus+rlDV9lkiEsBv/uKWZ26gZ4T7+8B9Hl7DQ+C3k/7/xQaL2/r3cIDD/+tX3F3+/emAsP2PyMDqheVvPNDz+3gAzwrL/6/X9mJD/Lj3fO+FLUZXDvuR/c0V27MH9P2a7abj7sUFXd/w5MlTjseZTX9Gv3JoWu7cfY9MnoYJ5w374w1N18JPyeu+65Oe43i6wZqee0b0hH274Xgc8U4YzX3XsVpLkRGCNGxqEU7qc889YJyk8ypoLEddRtJawzidnpmHYlgxjhP37vbcubPi8ZNK315Q8n36lWW/v2a76zFGcX0t05A5ihP+dBpQamKaA9OgRDZHxSGmVwDrDKFmfKsZRwn4qSXROCd4t1TRrkGbQMkSBT6OEv85TRMhWNIcKVXjnWOYR3LMVC8EEm0qxoIrmlQjvmnw1mOdxJR2fkNKlZSPIhXoPBhZx4ypOOfIGdYrT64TwzCiNWxWK1KeWTmHQtM0txMumUq2rRSneTHd0S4pXBtJFNNa4Ryk1CwdccM4HinF4JxjDgP9akvJhnkeSDnQuE6ev1JQVpO7VpBctS4EBLNoUGXalGLCLftcSlK7TFMAZFLceCdoPwrOdXS9ZRgGqArvHNqqJXSgpapEDGlh40ZBk2mL9Zq2M5Q84RQonUgR+s6Lwctrif9e1m5jHCXNlBIwyhFTJqXTv5wH8F/C9Yld/6fIPBXWmzXjmEBFVr2kI2nVkwPMeeRqGDDKsts4SJYwada9pes1p2GgpErf9NTGoI3mfLfCe0NFXN5TTQxJ3JBliSGkVqz2GDVDzXSt6E8ab5nCEaUyIYmGi4pskimhF55qyfKhy/gBlHIcLk9QM8O1wzolFAPj0SbireZqOtE4hTZWkFtek+vEetWgtWKcC+MQ8a0lzJFwjCgbMEZhrChIdO3IgyEzEpLFNRBSxW5aerclB8d8hJgLN5dHLu71rP0d+vPIYX8NSjPfHBiuLXGIONcQg4zDcp5pW89mfcZrH51oehhOkdPxyP76hkePn/DKq/sFySSn765X7C4S3lUuH2eaRnE6PUQXi2szTXOk1kTfy/j07HyHtmoxdCTQR/ZzwFvPFBJr1RNLYY4Hmm5NmGWkrpTiNOyZQuDeg+d59PiaYbikb8+grnnl1aekcmCaZmIOtM2G/T6g7A1t6zEmc9yPzNNboDLjSbE/rAjzyDwPtI3gO9pmx+F4xTg+peskLra192naCW339E0PqWDUkWblGOdEDJX94Yr9/obGr5mnwmaz4frqhLEyVhrnEaUUN9eTFFshLBISw5N4JOYk3eo4YLTGuRXDqRDdTNutCZOFeiLlidN1Yb0tpPGSKVxjTMPl9YnhNHK4kdQU7yyvP3oL5xx9t5HO8nLVCn9k9eX8xP4f8mF+hX9v/Z/Q0PF/Hv5XPB1fdf8beS19hA/NH0BFzWe0v5/L+piPhg8tI/f6DIwtr1eXojPxY9ffy/su/gJffvaf8j/uv4OQZn5f8/n87PATZLUUozL7k26jvMIz/uuzylM9+wdeucU4pbDa4ZUn17RosVi+TzbDuY78L/sf4CvvfD3f8Pp/SKXyZy6+nh+7+X7GNICCH77++3zd/W/ix/f/kI+FD/GV9/4yD+Mr/OLp/Swhl5yGPdpIkITSGYWgsJSyz7BcBy1SoFyXTWBx9ipT5XmKiWmciKlQlt8RVGopnM/Pczc+z1m9w7pcUKpoJK31wjvtWi7OL/BdJ/pxo7l++pSnl485OzujX60ptaKVaNtEK9iyWm2XAntJR6MynE6MU+Ti7ga9uIuBZSw90nUrNptzIT6UAnqhqIwjCoWznRzYbsOXp4ZNAAAgAElEQVROQIxdIdBtzvD+7bH33Z98BwBv6Nd4qn73bET/f1136oo/95M/8tv+229+5E12u555mnjjjbd4enXk4mLHerXCakcIhbt377FeBUKMGGeYxhumyaGVp21a2s7RdIbT9Pbv0DrLZrOm1Ey/OkNhsEbT943EI0+JzXrDnbs7nl4+4TTImBkUbdtTa2K725Cz5+rqktWqwXpLjMJWXW93zPNI23QYc5erp0f6VcPL73iBppE9dZ4SvoUHz7+IVo5xPLFae2KMHI4j3WrFPK+R8BzDdDqx3x/YbnccDgPt6PCNZ55ntC70q5bn7m04nU40jSItPOlphONxpu8t/VZiTfMU6DYb+m1DzFGKx6rp2waVJlTf0vcbvHfMcaAQMb2YFwXz5PBOOpdOd3Tdily2HA/XKJsYx5G+P2eeC4ZKsxFe7zyeUGT6ZsV2t2IYExVNThIp1rYdq07G695p8WvExDQWIgVv1jReE0JeDFGwajcM7DG60ja9mIEVQtNIgoMyqmHV94huXKaCWmuKlamub7zI39oW5zwxREqFGBftrgKlpEWeU0EpzXotBIuSMk3rafxKAiNWPTVLhLn1MIxH5ilytjsjhJFcAuuVYzhJvGvOkZIDlGnBzO3wKy1d/TxRak9VE9Mc2WzOxNTXWVCJeRSplDOa3y3XJyxUuxamMTIdRuZpZBgHuqbD6pZVZ0hW4ZsdKV2TysRlzLTe0zWO03hN351RqqJtG9qmIxfNNCaca+UhGiaub54wTRFjK2k+sd9f0TVrtBbwd+s9ShfaphHsFJCrBxKqWMI0s1mtKbUsnLdFx0ql8ZZYZmKseO+pWKiZlKQLWws0DaAiM3B9eWKz7lEqYC1stj39pmM4TTy5fkzTOaYpMowyKqq1Qow4vaZ3Ft9AnHtAMccIqmUOhXEqDMeBlZeN6+GblygrQQCP955XHx5pOsU8zFQdmULhcNLUMtN1RRAbqTLOezabHquODKeE7wzzfFqYdVKQaZPQRlHrRNsYxsHz+K0rjNmTM3ivgQRZU/3EPMtI1ztNTJmLO3uqTjR+Re86rI+4viEOmf14Ym1X5FKwduTp1RvEADFBrYrrmyuMs7z+RuE0BGK9obVrnOt4+uiSWPfEGETbXC21KowNONPQtXLSPu5HqgqMQ/6/uXuXH2m6Lb3rt+8Rkdeq9/JdT3dj2qZRS1hMGMAfgITVDJghe24PQDYTJrSHeIBlCWyJWQvBBCGgJzBCIFlCMlggpBaNBcbCp5tzznd5b1WVmRGx7wxWVH1ft8QRQog25Oytt6qyMjNi77XXep7fQ3v3ntYiaQXLyPHkUaqQ60IqN95/7Kxr4ny8oHoh5Znz4Z6yPmHMyuF04noT7bGgogzOLdTWeHz6iDGOHmXx8IOT/HAvUb3W71gXiUGNaeXddzecn8mpMvgd1irWZWUcB2rO1PINqITWjdu1cNgPTNONTqEUTS2OXBZqaqSoQM3UvFLKDR8Sqv9wK/be+d2Pv8O/cv9v8meGf4o/SP8rf/mn/xIP8QP/afodYo389uf/Ll/6X6X0zP+y/h7/9jf/xnZg+/Ed3F9MTCA15vfp5/zF/+2f5y9/8df48/f/KnT4e8v/wH97+a9eggNyiuQqJALBCW1aOLUFG/TNfbp1BP/Ob/7Q+vrtL/4Wv/3F3+J3Pvx1/r1PfwOtFf/+13+b//L6u/wHn/4deu/8zfd/lX/tzV/jP/pTfxeAv335z/ib7377pUP7X1z+E964L/gbP/kPOegjv7/89/zrP/sLMtreCmSjLK0X4RqWZ4xWxei6vQXSSaZ1QLqjmkW4tnrrdhrRCvb6jDUSE8ar8hW/mn6TYzsLnL5EnLW8ef0W6zzfff892mpMCDQUpXWsgpQy4zjy6s1rMIbaCkZLik5cI6VqtJm2sAOJvWxVdO8gmKq2pZsZY8gp8fj4iNZgrKe18jKGFQRPpmLo2stH39pLfn2rkcEpxnECpVnvZoZPP3RW/+n29f/FLeL/X4//cfiv+Qc//RmfvblH60Zqjr42lu8+Mg43rHZoo5mmEbogtnbjHu8bf/Cz/53T4V4+h48C1a8/uuHef3/Bh4D1naah5IZGCodSpQv4dL0Sc+a2XLher0yDohZDKo/4oNnvDqS8sMTMst6wXrPMkd5h2o3UKi7uFiMPl5lYLMdHxXVZcFXz8PED+/2Osz4KIWHt7HY7Pj18ovcdzt8R8yO5ZLx32DAyHTXKeYa9wg4B6wz7vsMNFoXis7efMc8z46iZlweGccLZwMPjIzQv4SZIvXB3PhG8oylYl5WgR4zVfPtd53w+Cy/VKpQeaVTG4SzFvqrkVOVerIlxEgpQzZbx9R25XgnW0NDEJpjMwVe++fYju73H6kYvhpYzqsl+H0tl2ntKTlQ059OOZb6iusFqz6u7HQ/X98y3GcNAjpGqNdZM9GdkWJ5pzTKOAW0EyTUMksx4PL8iRplG9MbWRQWNHBhDGOia7QCsNo9N5HQ+kFMUrwPSELDbKN45YaPntNJpjKNjWRKH44Hd4FCmc3c+olTh4eGRYdijtRIjWIfHxyfGYSe6chuYBs233/2C0/kV1kJcJZTJ2UAumsenC7uD4btv3zPtT7Qu33N3PhL8PzrAf/VjEPIff/zLf+nP9OttoWZFTYbLU0E1x35/oJVCMxXvdnQ9AystT/Ti8A56E/e60Yo3r+857A48Pc58//1HbrOw4m7XCzFdGKYd2qyouufjp/c4FWShYOV0PrGuCylWHh5mrA0oqxgnj2rw+Pj40kKfdjtKqaSUBKrsHKkulOKFTWbESUiTMXQrz7D0lY4kBbmgMUZi5bwf2B1Hcmk83p443klXd5kl9UFZhTMN1UacaxjXyWmgachNxvhddZwTViddzAJrrJSWGb2mdRGLW20ouWKsJtaFhnAijZM0JNWtOC1VFiG2NjTkBKR6obVGLeDcIBDjljjfS6LYujZKybRWsNZjlKXTKe2C0YFWDSVlupZ84tqgoRn8gOkNNxl6KqylY5sCpwVRtQGmY8mUIg7uMEjsai6JprMsTErh9AiqUmqnbRF5fZNqaDqjHzEGlM7U2khJbxt2J84a3T27g2KYQCmPDZmUnpgvkgcdb4IxCX6g5k7rkgbS6g+g7GkX2O0d2ki4tzOeZU0o7fHeYK1jfubOFcftsqJNp2QlrNWe6FVhdUDbFe89KWqMEniyNZbgRlJaOOx3nO8OWA8f3l+EuOAiCk1cLOu6YnTZRiyyjD383TsAfqp+n97bj3SjP5iV+NEo/VnnKC7Vbczfn3ugomN8vr2fYxpFZ/hDwffyy7bvef4dPy5un/WnAL91/vP81v1f4C/+w3/hR8+3adf4wVCltgxzlNrwLj8Yq354IVuK3I/+lOekuWfu6/Pf9yIv2H72X/ytP0dv0gExxr6Mw3tvzwMZWkUkQ11c0WzvlYQlSFdVstUln/20vuEU33IoZ6Z0pGw8z9P5zOl05LA/8O133/L7/9Pv88WXP+HX//Q/IRpaJQXnd99+y/X6xNc/+ZrD8USpEnmZY+QXP/sZMSa+/MnX7HZ76YwaTVxWvv/5L3De8cVPvgKl6bXhrONyeeLnP/sD9vuJzz77Gp5TxbRinRe+/fkfiCzkq1/Dh2ErVDUxJW4fv2HQM37/lu7v0EpJ1xW4PrwjL+/ZH96iwpHeO04WbR4/vOfh4Rec715zuvtqCy+Qgv7Tx+/58M1P2R932N09pUi3uPVCyQXyE94mnmIAs0dTUMYyOE9eH1nXC2/evKEzM8+PlNK4qgs/HX+fP3S/R6+K0/ENqMK7T98x7nZUinC70ThjZVP3jjVl6ZYn4Wr2rsglykZbbvRuUMrT2gLaYOxEGEdu8ydaruyHg8gnaoRucM7ijaM1jXEa5y1aGWpeabVx3B3JaWYIkniXU6E1xfF04K/8nd8F4K//M3+OWhrjuH8htPQO02hIMTGOgRgLKXdKL8Q14axGEbjcHtkfJloX/JI2jWVO0KWLB1oc4EaYp5fbhWVdUXrifDyhzAwq07JjCBPeKTnQZE2jcrncaE0z7Se6ilyuT2jt6aWins1QSuOc3SYpEkxgOux3J263md1+oPfGMEzsdyO1rlwvDWM64yhNBGc0wTsOxyMPj48c92dSKtxuC8fjxKfH98Jj7ZIeOboDjYVcVuabhG3kvHI6HdBYwVEZjbGF9x8+4L3h4eFK8EeMn/n5H37kV37lax4eH/n44ULwE2EIaGOIKfHlVye+/eY9p/OZYVSsy5WUOiEc8H5gWR549/4du+nEMIzEGNkfDihE0/nhwwP7w4lh2lPKytPlI29e3bOumS8++4r3778HBberHIKtddRaiTHhvUwh11WCPJ5NdM46UkkbrqqS0sowBA77Ix8/PnA47ak1olRjt5vIqXJ/d2Y3DWgFzgQxHfbKsjwQwkQuHW0U1+sju92B3XSGHojxHTGuaKNEZjBISMHttmCM6KE7il988wsOxwO365U4T3z1kzc4F/i3/up//CNN2p/c45d2VE+7M6/Or9Ba8/Bx5bNXo2wiunK9SnastcJRs2YPYcc6JymeMBjTMCpsXaUFyLy631HqB4yZGfaNSe/xwdPRHKYj+5MgFfb7A0YvnO/uKblIAWG/Q1vH3at7rDG8un/NN9/8TG46pQjDyO0249yeZVmwypBLkNFJ3iDLRtzm1gq0OcUFpUeGcRLY9SYo7kpQIEsVNJQLE2vMaC0JTlpLwkfrTrqga6LOld5lYaxEliQxZWoR3mhnIRVNrZraEnPveDeI5i8ptLZoI1DilmX6SreknAleRhZLXHAW0f/2gHFgHdTeUNZT6Nvio7hck3ATlQdlUaaTS2NOEeMKWnXYFlPrNa176aopybtf1oxpsKREsIJfak2TYqJUJz2rViT2korzltrERQlAFXYivciGgACn85o2YbxE+w3BSWeXSmMWZp3bgQoCix4svUKjiTe+NA6nPcdDYBlkMS7OyMhzjcQeKcUSU0PSD5UcMJb04sgMwVPyzNOT4KN8cGi1HXimwHx7Yl0S2sAwTng/kJNgSlQHbz3TOGJ02YTx8jxrWqml8enpxnUuGNuESKFEM+RsJ6aVUiprrhuKROHDj8YszwXVc3H6bMjewPzPVaPe4kl//A3PBSpd0ZVoJBXqxQgDmwN/ezwXxM+xqupHxeFzmIbeYm0UyP2DxMNKF0+eXsjAW4H4ontV28tR2+vhh5AC+S38UHrql6/SodEFo7T90h9e4fY6lXQPrbEMQ9gYolCyIOB6Z9Oni8ErF0mbEyqBxVqpZmur3MfPeNu+4NzfsFP3YCvKK/wwyiY1Cqey9Mq79++JKXI4HDBGDnjGGkrNclAKQQD7zx9Yh5wyMUacdxLtux0EVOvkuFJa5TCe0EqmGmZzl8coPMX94QxaUbI4qFXrpLiQS2V/PMqhdbvnexNzYhh3jOFI0yNaG7SW66RXMWLuxntgIDVZ52qRKNdSkowcw+6FnCLXWcUaw+m0Y78/kZSnd7kje5VP8nAcscZzTVDp4jDukGvE2cbx9UQIO8L4mjC8o7WFN+3Eqzrxq+5LlvGBj6ef8enW+PzVawyG0gt6yuKonoUh6UfH3TmwrAuqDbSq5d4ElG3c+VekJB3rOWbmpaFaw6KwytE3LNAQNEFr1kUYo7d1RivPulywfiD4EdqK6or1Q8ZZkRDlZHDekcuVy+3p5V7KueCs0BiutwvWCBy+N5G1lSLJSKVmbusTEtXZcK7STWXNQhZQVjjfygXWdcZaOWiphoDateY6y35qjOZp7iKFqze8OfBwTUISIOFN4PH6EaVkfdRPorVMaRUzHDIhGYc9820W45ASnucQDhiVWeLCsmTWPNBqx9pZpDZa07rCGY1+0DjTCIMhrpk3bxvz8sjj01X0lHpHU5U1VT5eHtBqxDnLoiuoldYLRvtNC29RyjOMnmVOGCum2refv8ZaxZu3n5NLJpeB3iyvPz/z6u0dX/8ks9xuOBewLqB0R9uI83ecT19wW3/Ol1/9Co8PK9YJ83pdDnzx5T1KBXbjKxoXrrcL9/dnavbcv/4OYwIVRS+Ozz87sJt2LHNknBTGfobSmTV2crnivWM3nMh5IbgjD4/fc7uNKCuaZGsmtBJT5O16wQXLsmim8cyb128YfKV22dP82MjlCWMGQhgodWEaJkLwWKMJ/owxMl3WFtY800zm8faAdgP7XWC5rdQu137XiVLBasHR7fcThz1cLpmvv/qK02nP9fIIePxo0OoHrN2f9OOXR6g+WV5//pZOZeUTqRpiLtjQac2SI6INTQbtR5Tq7PZWUAhNb10yRxj2xNgxRnE8etww0XrjcrnS0Vuai8NYw+4w4YyT7Fo3EVPCWse4H3nz+R2ldQ6nHeuSqa0y7ScwDW0Esl56YZp2lF7wztHmQswJG4xEWfbttOMcNSe0h3HcM4yBXCujcaScibEAhZxXtBWXaXvGa1jZdFtTpG4k57hI6oro5Qy5RiyO2hs5JrwfKEW6cMY4tOr0regzJqCUZMjHEnluCRlrpOAX2w51IxkYC7ZZatYYbekti4tSSXHbOpTSSHGVjTrfUBrCoOlNIOPGdUF+UFA0/DCgYOMCarSueCcpZEM44J2YUZaSCFZhQyelhnWBdY34wVNbIccqHMcu41aUxBDGtArRQSd61SzXiHFSJGUMUCklUvuG3nguytB0LZteKo1ybaIRomO0Y42bhaNJd69VBUa6mrUU4LlDh5hpooCgxRTTN5G8OHDDYBjCnpyKgJqrjIlrzVI02ABNaBO9ORRbrKBpYj6qhZwbpUIIijVF2pKIaWUa98y3grPCHXReoRlIMRO8/SNObPWjAu+lEH15P5AC8KXjuhV+L93GraRTz51T9fI7O4LSev4ZpSSxRG/mxGdd63OX9vlnpNiVv+TvL7/Hf/5chPYfOq7PxW/b3P5/RIegnlEn0vXcvvhDcYuEdvyR/m5/+entFSlx7z93d3un9kJtidwTCnGz242LKHnnepMDdTSS2lVzBV05x68557fU3tmnO475SOud5ArjNv483d0z7vakJBGPaXO3n04njsejdBthI4dkUlqZpkkK2FzpNLoWt3NrnXGcsNq+UBHUFpnZWhPucBV9bEeRamJZZsqmizVbvCRKpATzPCOcx4HeJNrROoexlpwyl8tKY8cwWUzv9K5QutNrIS6ZHgzOW8xzxG1tlJSZ5xvKdNnolaw+yggmi1YElWMDrVuKzqgtkaiphnfbKLNLTKscFhr0xmEc2O8U1yWBnvD+Ldoken7iMFeO9S2pP/CL78/s1UL68he0tGJcxoWAtiPr+ITRW/ynrawexvHI7RLl2jYDysD19kgq0vnL+TWfPl1Idcaqxt7t0d4yjA43LLRi2VvHsizkujKOiuPeM8+Z0U44d+LuvGe5XRi9J8XKp0+fULpwd35Nij9A0V/f7+WQogrnO8P1krfAg8jpfCIlpFDoiqA9Zgt0AMNkLKUkjueBjiJfGtaOqLaCkdFwyU0IKiZgvCTV1RZR2r/oHJdyhRZY4wqsNCuHuhi3tUojTRGjMLZTs2Icgjj+naKR6D1tfFMvKXta2L23Wbika1q20bIHnaBqnNnRayKMwsheS5OIzhg3JumFjxcJzxH5+0JrDe/slqYEp9NZGkzW8eHDR/aHPU8PM/evD6Q1st+PKDxaF27xA3SNUQM//cNvOJ9fMQWZYNZeJOjAKEqr+GHEeYNvI8HdcX+XUXqLWVcDLohDf40Xhkmz2w1CgfF73r76nIfHJ0IYoCecsfRu2O8nHh4+sNufKUVLFC5yLfRmuDudmG8rh53j/vSaOT6htOJ2zQyDZzftuF4Cw2EUqWKz7A8TvxZ+lYeHj6BkT8/l+UgPSmtSjjg7EYKm9UypDT9okTTGCLqyxpV3n77jFh+wZiClGyVKnKy3elvnGykWhjEw7gJhgt3uzNs3P2GJT8Rc2R/u/08qw//3H7+0UHWMfPxuRumOVSOld9ISOe7vaGYBH0ULOkxbiofCeVDKkJPaIgMLa1ywxrA7SMyhHyVvV2nDw8OjtGFUZ40zSjVKiUzjHm0NpRaeHi/knCUqTWvevxdd69PThdIipW3/FxPXZUZ7h7KatXQylWoqpTXUFhmWW6XHK7kIr/W2LuRW0bZTVhFi324rvVfpkgz7Lf5sRCnRHPZeqMUCCZ01nUpXfUs5aahNs1JyY5gGShKItES8tq1oQ1zwytAp9F5Ia5JNRUFdm9wcXtMTgsnRipISRlmqzuRSxYFNByVO75K6OOR12XKKO9CQbxMtZqltM6I1nB2oTVN7ZJomcmpo3VGuo02jtcyyNCkG2FJMUhVQdm+So9wq6zqjupdRb82AwVlHKVK0GuUoqeG9xWiNRhO8JHCUktHaSuGNIuciC3nL0rWuMiIReLXh46eFVpMURsioCiTZJISRYkSQ7pyllCJmmboVblozrysK6cJ7r1FKvvd02jHPN6ybiHPfulvSkdtNo+jFqt2SWhStdnHnVkXNDY1lN3pCcFu30hOTx+gNuYZ87nUb7xolDvXWGr/7Z/87AP7S7jeorWOtdHn7Ju3oW/LVc/fTbKL9mCK1bnnnCJ/wuXNMB6M9Sll6jzhn8HZ4yRzvXWIHe6+kkl66q87J5yCJNlqkIrliTeJ9/m/45+yv473fctnLJqFR5FwpuWCUwjiLsYFamnTqvEepjnUIsqaA1ds1VYsU5lsRZ+0WhdiqpDcZzzgc6JurPcUHjLGkVLDO4VxgnqVL5EOg1IYuUJLEyALcrZ9xTK/QWrFPr9jXM8YYKdKo7A4Hzvdv+PD+HfPDA7vjncDaa8E5T8oFYx1vTkd8CC8JXK13YhLnfgjbhCSLBq33xrIs0CGEAaWhl61ob4UYI8YYnLWC29twXDFG5nn+gVm7Ve2tNXLKLMsKCpwV2UNtFdUMvVaWdeXx8QnnPPuD3igCVmQn8crHDx85HI8cz8LKVFq+p5REjMKq9E6c/s8Skd4Uy3Kj18y0c1hj8FSaVpLmUwrr2ujY7UiyvTdIYV1y5nZTpGrpKhHaM41AoXojOE2oin8s/Vm+8pnHcuby6h/S20zH0bHs9zt2k5hsSr+KAVE5lhBBKYrSxFy5zg90vRKzolcv93cxaAa0LkyTQnCtmkbGB8+b48TDCNO0JwwnvBtx3tNa4P5V4HqdOO3fUnLhunzPPM/sd28YBgP/s3w296+kMWPdAEpJ59GAUoNwmZ1ntANPt6usAR1yTPSeBbnVCssqcqmYZkpdSUkKPtFnG1BCvXE20HpncBZo1NpEdpQzfkvF0xoUltN0x/WyEoIVkohSlHYl54VpOnA87nl6XNgfJy6XB0o1lJIY3Ei3kdY0yiSUcjjnpctrBMN1WyOaLbK3NFils3+9PuHDBsvXgVivzLNEjB8OB5yxXJ+yTPKSJZXCdVkodUXbzpoW1veRmjVxCXz6eBPJHTK2HvYi9QjuNWteeXj8FqtAIUlSzg8o2/DOczreM5sFrXdcnhYOJw0Y5tsDTp/xBq7xAa0aedmzm07c5gt2TNANVMtumHi6XMlxxllJOlMael2x2pLilf3BkUuBmshJYV1lGu9QfSQ4hxsq1Pc4p7BaZHroyt3rO96//8Cn63d4tWPYjYTJ0Mueliunu4F1btQWcM5KEENXXOdHclux3ZFzQWk4ne7Q6iom7LJg7I79tMMqg7N7nFGcjnfkXCgJtLEMIyzritWB43EkxMq6CmryH5XHLy1UzWj57uczr17vNhj7wmFv8NoQjCIhuItxHMi1cDjscF6z3x9Y5sqHd+/RxvB0/cDrtyNu3HO9FEqPrEmhrKWqJ/q2Uc/ziveOdZUCxDjp1FzmK7UWQg9oY3m4XADDEiUGznnLEldqbawp0xSb4UOLrpOGtpvOR4PGEIsUz2ioNXNbIkrply5ACIEY20vHyDrBTfTWtig4RdNNdJUIoNdYvSVUKNwwUYrgMDoVTNmiA2V8JUVTg6qoppPKbRsfgzOe3mSEWUrGaIPSYiCpJW/aOoUynV5FW1RzxgfDsixo5aTA0rLJGW1Z1yg6sk1TGFPGGk2tz6PUQu2wLBJTm3KjVoX3ita37GTjKS1LTGGxYCspJ5SGZV0Ec6FlARHGnGByWm8YLUBn5zZAtm4YNaKVoMhyLvhgURqskbzqGOXwoNAy6nWeUtQGLLY00ov2ES2jbkWnbSaWbjaNpJH87loqdhtNty0FpTXDskgEb06Z5fqR1uSmH+xIr8Kqs1464L0ltAZrpWh8zryX8ackhFgr8guJuwRvxOVdqXLdFMgraF2F/6nlmnm5KZ2jF4HBG2NR2kKXZCAp6gvWijaz1s3OoSqlVlS323UpHUUQbWLOSYx0qlFbkY6r6hhrSSUKlsX7TfgPtXdKkbl+rhJfbI2lakNulVYaxjv5v1pQXW8ddIX1GqU6xomxZ4kz3mlx22/2k1qF4eqCpzdD1RpFlc9cG9CNUrNo9Eynq1Wetyla6ShGaApageJBO6zOtKIpagC1dd7cgMZzF7/kq/VPsy8nlDZo/bxhV8Zp5O78iuP5nkrj/d//gFEG74OcoZVMOFISFN2024uu79ll3xtxWQSZF4Y/xiQsrMuCMWZjH9YtI91SciHFiPdhg6JLQfKCysp5kxiIJKVuhJNSsiBurBUpAdJtkWu8ENcVrRRDGDDaUrZDTG9duNJO48PA89FTdbXp5yq7/Z7D4UTfpjovWvLaGMdBoiWtjFVrkyx32fahY7itVeQZXUQaCmi1CCS/OZS7o/SGKomuLArDskhBHLxnMJq93XF4+ie55DPZPvBh9/doFHwIjHqPa4N0sHxjmSPadW6LpHDp1nh1fM2crnz8+AnrCvud6NydceRcuT85lLJ4dwS1oFXgs89eE9OB3sHYznH/SrCGCdArRnnGQZOdQjvPOHNTIM0AACAASURBVCo0itdvf8B1xbWgTce2wBoXlngjBIcyiut1ofWKsY0Pnx6JJclEQWesgbKCNzuRMeSKMQofOql0YrptRr0Dxhput5UxBJFROEPOhpxv8mZXmeJpZPKkbSEn2O09wSuUchijiEVxOt5z2N1hPVhr2R/2hGCopRJjxJo9t/kDWjtOp5MQb3zY6AKbSagH0CtdJawfKVljnaa0yPXTo3BOUyfWGT8EnDVcryuv7jy7ceT+fs/79w8oY8TQGiNhdDh3pOXO6XAnyV3Gsd9PXC4XSo+c7wY+PiyE0TAcDlwvsp8v8424JvZ7I93F3ojLe+7vXkmntD0Rk2Y3nrnNT9wf7pnGiRwLw2RYZ9DdMPkTY4CcF4YAJT8xOEOm4qxM7k7nI48fIq9f35PCFaU6YRh4fHqiLpbTec+aCprNQxI7w7gn5hs5LjzeEnt7pCEIrtYjS75wPt1jtOW6ZpyBdb1KlGxWHA97arkxDMLl9a6+eA6ccdyf7vBm5HA48HR5wOmJ+7tXGFOYL43DwWO1TCqVsugMbkhclOV0OONDowx71tBp9f8jrv8v3p6ZzJHj3UTtC70fJP50Lbx+e+TT5ULOgmeKqbPbe053Z5xzjLvEMNxTyYRJszto5uvMskZOryYeHiraZLANpQxlbRSl6AVSUbz/eEG7jNGOeV4Zx4naLb1pWofaMjk2tAXLcxRZpgPzspBzxg/jVlh1rFUYI0VpbRmFQmtHbZkweOGsJdEC6a2jVGoVXZmzrLGitXQRrVcCD9YF6xV9yzq2VlifJVeG4Ml9RuvAbZY8+JrrlrzS8EGKp5giTXfqc1e4S7dxWbN0UrcCxXu/dbs0zhsxTtlA14iGyUkKx3R/ltNSbmg/bMWOpEKVsgUjVGhNBAXG+i1GTuIixZGfQTlKV+RVnrs3TUX+Xq0VCr11EzspR2oVMoPznrzIjdfp5BSxzm2Rj7J5i+NZ3MsxzjREbyiZxtsItCuUViglo3Zt5NCinME4aFWhqsHbIN1Jt+ljc6X3LH+b3oriJrIJa610e3snOI+2wqorRToSoMgxb47IgpukQKBHtJFM6doqVlkKDbNlNQu7zmBsEN1ZLqR0RZiegi7rvYiBpjvUxiF+Ni8Z7f5YrrLe0sQanYreOuyticQFDX07jMWYtm6ylAWtbbo3v+GYvHTSUArn1Qv6SCst91DZDoVoupLuaspZIho3Y0CtmVrz1qHRch+1Sq6FOUZyjhhnsVbYhcoIKq6kG0Zr0UNbR1eFVsqLecwFKN3Smt86qYlGxNgBtCcMHq2k8xRz5XqL2+FAJhhiYlopvWB1wGtAd3pfSDlhgiE4zav0FZ+vv86uHelqO9g0hbGB86tXHE/n7b3yfPr+W66XC19//SuEIZCyIO9KKcR1RmvFEEbR59WKVnqTCkkynhh7RPdJbwL6LxJTqbWhlCoyESVd01Ire+95DkswVrqwz5DwYZTEnWf03nNMbW2V3bDDWveCwQKZbLRamKaBEITX2ftmNBNoIsfjbrunn1XNdcsQh920w/tA60W6SXSo8jq0cYRBAPY5R263G9YNKGSqYJ2lLYICe1aidETXHcKBvE0gWhFNnW6C0Xp4+kDXJ/bHz3l6/BaVZgYzchf/FAwLmkz+8luMHci10tRML45ljnhtMdpxWa8cThNtmTnv35LqnrMbsdqy2zsuTzd60xh9IgTP/iDva2pXFIH74x5FoHeN0SJnuK0P5LlgXMcbRY6f+PTwwMPDOxnp98Dl6cI/u921T58iy1wwQYlbvMq167wl58q8PkgcahEZTa4JP1VU98jbnbcEI0Upiv10wttPXC8zw2C4Pj0wjRO9VWJcMcYxx0hrllYr1hmckXAJpTrBe1KqLMuV0/ko13GOOL3D6x3eHGlN00oTw0+Xw7H4IitKSVxn743B7yj5hrUGrRy1SITqoDKliHO9NZkqKiN+A2Mc1noutxk3DLTmST3hVSCnBqWS1s48R8IwABajBmoxDNYz7gZevXolQP0ps9t7kSTohnEwTQcOBw+64YNlCjvef1/xruD9SMor3o/ksvDp0xWlHJ2ZHAOLk/Wh9c7j0ydq8cSbEz29WRnCAGS8AT05Su10pwhuIPiJJS4YZdjtHc4O7PcDaU3MyyoHSgVLfuTxeqUVhwLOpztQmjVljKtoJ/K1y+MDd8cvSFmDK2hl0c1xf1Q0MqVdQa0YG9DaM46bnM0AxTJ6IRIs6wJVcRiP1FjpUREOI+fTmXfff8PlMXF/d2K+3lA6Ys2OoDOtekpZJaGuZuKyoJTlNj/83ywr/59//NJCdRg8408MSlmWNKP1HudOhGkmp8ZeKVKKzOsTtRceLo+YMFDrE+jMOOxI65VxP7LGleu8EFMnLp7bdaWZlcsio460Jd2oLm67NSXy8sQ4HEi5k+tKSLJRN9XJNW++C1nwAZwLGAU5R4lW1A3vnTBPU8R50atZq8XEojsGA11JilVZsUZOG7fLzHgIWxETRb/pkI6pUZQsGb5aS7GgDdviYMglYYxsVB0li7gxMl6v+aVTVluSoq9XrNWSZlH6Zs5RmK272Hql5ozxbusYNuiyKaY0ixPUW5Y5MU17WlvQphC3VBDrPAcfuN063ltKyajuwQjTTesmEa2mY5wmRlCqQk/UUikVcdB26eZa3YnxhiFQW6K2hLc7WjVYZxnUQC1sgn2L0oaU80uUnkbG2kYrlnlBO7NRCyRve10WSRzyQcx5GKxlk38EMaZ1RamAVTQgVyEE6K5IS8Za4cKCbIy1NqyWz0ahZFOlguqbbnPrUmvpfDkvXSNrRcLSWgXVGJzDuxGahFBorbHeY40TM9Wat9vKYQxSwBoj6UCbe3pd0sa9RJzMmJdIUhB3qLHCxcwxbZLSTusFh2iIe+eHThkbvaIp2BLanFeCgdOdnPPmRK0vEahpG6srEaBK7nyXMTCwOb0zKYsm23sxgVgs3j/LSQqoQlOZVrIYbqxnifWlm4aVyFijHb1VtJf3s/eCUhVjIlotGO8kHKI4Uk70bjBOiunaxNyY8opuihACpQt1IvWCVQ2rHTS5bq3TOCPFxuH2OV/GX2fIO1pLm5M/4L1E7p7PrzHBy+SiNm63G95pTqejmPBaE4lBXLndHtFaCZd008nK4SZSchaEjdYbeH+b6uQsBJIgnfNnykFrlWVZUUoTvDx/6w2rzGakimit8T5Qa90OeVIcr6sgcbx7LnDbRlOQz0wpGMcRZTS1FZ5Nb61uWn4jRRrPGuTeXpL+tIHQG71VMaMpmQ4s803MRsYxeAmA0NrIukaktsYaCyj1Eg3ZVYfaMRopVOuWda87RWtUaeQiEzFlPU0N+OEN1+s7YlzYTSNqdkzpN6j7E5+O/4A1rhx2E8bAYQpMYaKRGbzFeofrlmlyoI+o0z23eUUpQ5jOzPOFcdzhw4i3Bm0aI4ExTIx+pFWRpzineHy8UrsltopXinWVw0CdV/raSbGS0kJ86i/3bXxamS8LYdSS+e6la5eM6O9zkVhO1xQog7eOnAyxVnbDxHqdpVDcqBllLehqsc0RtJcEo9oYrZNDY8tYbagIHWDygfEcmG9RkslN5tYq/hgYnOO434l8Sg2k7LhdV4yP1LKglWW+rGgrnfeUE9V50fwrma7ZTZ5idNimAgNh0KRHhdJOvuY0a7qgteF4eI0xmpgj3k+UoskpsjuMpFgp6Ur9ZKm1Mc+LNAecpcjIipwbD48zYYDbbUEbWQcOxxMxr4xDQGHJOeLdQMmdYZyYBsM8Zw6HE7V07u5P0jCxjlwta7wBjvvTgZgzpc7QKo8Pnzifz5yGxu36QLBHRjPJtbg/8HR7jzWWGAslC0lmnHaUBtdPF3bTgUbBhR3WG9BXtNK4YBm8ZRw1l6uEQKAS+1cj3k0YlTAmMWi/TVtXQjgyjQNNFR4eMp99fsd8LRjtGA+O2+2CpuP8wBACqITRnutl5ngQ3m6OhTY1Hj59EnqC1jw+PjGEkcvlifl24XjUDMMrHucr9cPPUM0wTYF1Xck/OGv/xB+/tFD9xeUdp/ORD++u3G6P5DQy+iN+TJSo+fT4iZQKyyoC/Noq3354xAcZW1jtebx8ZL8/UasizjM1Oz48fGDNT9QucP/e+rZoQ/CO6+WG6hobPDFHSuvUslL6irWGaRpJpbHfS4xha40Us4z7lEZrQwiipZHF3mCbwnq3dbH6BsWXjpYI3kU7552W2Dor8YwSCSkFkjZSzD13Bp0VJI+1z9nQChsMpShKiS9xhSEY0aMGTy5QckI4ooKU0Eqi/NIi0gcXHN4PGNOgV0IYyDnhrCGlGec3vFROtJbFkLLlqZdcRT8HpFJAGUkRMZaSwLnGbm8w2jNMjsv1ibgmjPO4oqklM/qBXCIxXrGbsUmKahFi57aNeU0j5YXgpWDvtXC7PXE47Zhv6xafZ7DKknvHGYNRmriuOGspqW5Zzk16gka6U+gum3oVHFrrmdqFGFBS2YwxhpSKaAG1pjfJVvYm0JqlV0dtK62VTZKgpftVErvN8JJy3WaTmhCCGLSM2opTIznftTOGgRgzrlbsZjzqqtNqxSgpOLs22/g805XGhTPWZkquODeKjrV36IZarkCVEaz3pCT52c8PbQy5bgivjcOnNVtHLskEorCNpz3WyLWUe940d+IuVxjW9SaFHx3VO7lWnNUS5af95gCWaL8QAjmLQcZYQ04Z77yM8krG64DRhhTzJscoAsT2kp+dkuh+c5JUHe8CWnWmYSSEkdt8obXMfi8JMN7t8E6hTcHogXXRzLMit0cqC41Aqkr0thTCTpzcOV/I6w2lHeiOQ+7ZlsE5JVnofuB4+5L76z+OUXtSj+RcOR1eEcKey+XGsBONeKlV9ORVCsTjcc9+v39BeYEcutZ4ZTedNoJH2wxrbTNLZbyXOMdnnWlrTeIyaTjn5ZouW7LUVhhaY9BGtPjPhwTpYpeNZmAppVJKxRg5rAlmxmOc2daniu7ioixZ7gPrHLU1OUzJAkHOiev1wjRODJPaOK8KtXFx53lmGLzQB3KmNYXRiloy67psLGItWnxtGIeR3ppEWveGaupFQ11bpTRJOBMjaKe0RteGVqEowYb1VjmeXmFc2MgIE4fzFyzzE7coiTs67lE//TXU20h98wvmPKCTw2jL05owzpJwvPv+SoqJdx9/JlPw6rjFVdY341jjjTAM7PcHUi4izfID9/eNISQ0EHximgJPTx3UgNee9XpjiYK+yjeFUzu006hSiesPwRotLQTb0RnolmFUeNVpFYJ2KJXotRFXmZ4Zq2lNsQsDwVpKU1Ab1mu6ypT4hO4Dp90Z7wJhNxLTvHXPRWaEGpnGHV1loHM43KHvO8tyIcXCLnTG/ZHdeE+n8unxA61AM9uBqRcahcGPghjc1mKtFTEu1CJ7m0ix4nZAqYQgk6+UGi0bqhbNpqzJmv1eNM61i6Trec/U2nO9XlG90eoibvquSFnqCK0Ux+OBWjJaacx1ZhgdWlnMkrlcI69ffcblekXhWedEaQkfDDlmkanlRIoFP20FtR1Y442ff/MLxknzeL3xeI08zZZWC94NWGukW3574G6d+PDhHefjl7w57ni83Hit4DavaNWxNuHsjnm5cl1nWntiXp44nfdM057aPWOYWPKFnBv704GYb8TLe54ukfPxFTlVcr0R7g4M4x3aFj68u3J3uqP2G7d5IabKsFM8PVW+/OI1UT+QywJUgvO0LCZurQzzIvXM4CfCMFJqIibHbmd4fHxgf9jTeuF6e2IY9dbZ/UjId5T2iev8hNIVqyfASqz0j4JC/qQfv7RQff/pHfPS+PjwyPVxJaYnhvEb1lgY3JElfuJ2KXQMxskIqbUbLnhQ0jm8XiP204Luwj11LrLEgjKSJWyM3zLBxcVIk8VrN41gNZenJ3LN0vJXfeP6jbSuURaJYzXinsxJnG/DMLAsi4z8HWgjDn1rHbVsucVOiS4xZxklWBGqh3FA6YQfxFWnbcUpBwiDVG3dQMFbKFrVTKMjbyesWhqtOdalcDwN0uXS4KyM77xX+CAFbms7aqms64rTgZoLYR8wRlzuzshi7IODpUq0GoHdPhBjxvSGzoZh8Cy3jHejGMHWFWO6/LtDjAnr2gtHdn+YUMpirMFowxBkwxumkWW54XwX5FP2tGrFta2g9sq6NuhWsoeNZj+eaPWHYrnmTi+KXiv7MVCRXGMNLyNX70Z67tRWaFvWkLWOlGUj9N7RSqL3indHOqK50ypQSoSydV9zQWlFaQXvPM5aSe+wGsWGDSqN1hvDMG7suYbz0nU87I6kmMlNzGhGw3PWsbOeMYihZ14itVS8s9SSqBWUsuScNhSXld8bLMo9d9IzsSyU2kErlvURAG93+CDO79oKpQp8Pqb4ct91xMXtvN9oAGrDABW5/rTGGodCjHjPsZk5y+hcaUdZIiVpSkn4IGN5beVA2EvGaycGNiOfrd6kCFrLQUIOfIghgkLvIgXorVA3BmDwXkaZNTENA1YnnNPsxx0hiE66947SFZQUva3JuM1owzgdcM4zjp41LswPH1hyoZlAI9J6RnmLbhJv2LVA9Ctb4DkJWqdlSyajUdAC6Vb5rH3BV+U3mOqBtS1YG3j9+is+e/sTfv6zb3n3/oHz/dvNTJUxyrKkhZRXpv1eOpmblre2xrLMtJ4ZBhnhP6dYScypRFwOwfNM57BKpCzrMmO0esFSCc5AGMG1yHuijZg8X0b7MZJzZhiGbZ141sJ2chJZRggOZ+2WmFVBS7rWMs+buVIkLr1WnBZIfFxXrreZIUybeSqDtajeJIijZozdiZkxpU3GIUVEKkVScYyRbvqzJuNZy6xEJ2swWKPIpdM2/JjZJiq5tG3dFwlVbwVyBe+EM1krRWdsCOz0Kx4+fCCuEjGpFsf+3W9S1JmPp2+5lE5NhbIlGcbUWWaRI60rUDWoSG2ZuK7QI7Xd6I8Xys+/E+lRNzgf+PaTRzfDYTpt2u9OKQbjxPgoa0im07jdFGy81dYDpT2+3LfDsIftvdNG0Wpl2CYm2iqclaAGjUcrI3KZXPFG0dLKoBXajBhjiXmmFwWtMo2jaIhTwSkx1vXe6AliLZz2Hm22qNAl4qxmPx7wp8BtvolMQGlutysUtx04ZkChGuzHESrs9nseHp+gVXrLG+0ibJSACl1hjWdeZpyTmNB0awzjhNIJVKVVh7MTWls52B33xNxY0wKq/R/MvdmSJFeWZbfurIOZDxGBIafOqq6BLeQTmxT+/39Q2OwqZiKBDET4YGaqemc+nOuO5AtItrC7aBABRBBAhNukeu4+e6+NViu1J3IqQCPtz1i90Jv4xjuF23YlporC4V3n6aUwhTuuW+R228jxC9ftRi03apVtq4RFQelKSUIkyJ+/knbxul+vV7bjgn7ZUe2BXA/ak2xC6XY0RTlejy883VZKbfz89C/8FAzzemLvO51EL4XH+4+8pC88vX7B+s4RRSD7/PSZjx++ATSpb8R04cg7er/jhx//Sjc7p9Md//LDDyIqlcJlb9zf/YZp1vzph7+y7515Nfz0l69o03i4P5MPzetr4XYrODfoKEUDaXw2FVp7cn6rhe7EXFhPpxHylmrl6/4kqut2obbOsgZyrBR7Q6lC75pSb/zw41+4v/9GNiL/P3n86qB6ec5s6kIsB3RJH99uN15eC/Mk/omqOtM8k+JOH367FOWU6e1E2iOKSi471gWC8UACRClQqnFsO9YotAmUVJiCI/iZWywEcTRjvcj8rRWeny9oAkfKEnBgtHUgXMrWxCvqgyL4lf24sO2JVVtKEeyTMRq04GwkKNVwVuOdp+QKdKx2tCo3q2kKOOs5jjaSykZwFKqO9b3FqkrH4l0T7MMccVZ6uGO+sV0709yxXmFdIR4Tx83QueI9TOGRMHVu1wPrEyk5nBdLQicT05XaMikJoqe1hPOdx48TITi+fn1FW8ftVjG24J0hZ0H0SEeywulASQpFoSYNxeGswarE+eTp7cBaxfk0k44MOLZdECjbkVlmNwJIO0YjF75csU58h1OYOfYdbxx3D2e2fed22+i9cBw7zkjK/4gR56GVNl6/Rk9CVtANUowY5zC6ovD0qukUjKo4N7FXsUKg0gigCR6t9USrRep3tcN4834T1crAYKUKAzbTekRrsVtob+ldUEoxHaixVq1F4MtTWKl1pOKtxduT4MBao3fhIAqKyVDbjVKFe5l6JVXZGKSUJdFeN469MLeFZVrY8i/t6EfOpHbQSqZWAX5ro2lKYcdaUGsnqX6gxiLWEa+HAb5Ra6djccELg69Jqtv5RdBlZRfkUJIVtXgWu/RXt8gUZsCJ2t0PrOv0Jh5D78XicTrN0B21Jh4+LJScud4yxs5Mi6zHS87EtHPbNk6nhRACrSpyqby8XqEbpnlhP3ZuUfBkpRiUngSTowZrVQNNLB/O2wH5lxt2bYXWEihL6fC4/47f5/+BRd1TEWD5d9/+nsf77+hN8/WrcCXX9U48mnIdZ9+vxHzjfP4Opc24octWZdtu9N6ZJuGSlp7H80ukKN5VY8YwKvU05PFr0zTLYbr9UkkrloCC88uwQgwOKo2cIr2+HSLU6P2G1hu55EFZmKSfuwv+qXexBaTxGnaUWClqo2tZ1e97xCgzSCBNkvm9U2sbwy0yiNYqYUPdoUnrTUmZOYjCUqoEOOS1b4M4YWjDV26ModEwTaBmzilya+TaMaOml7eNRBeihkFTjUVVPYY5UeNyLoQgaWpzDUzHb3EfCp/Xfx11wdJkVDv05uld46YTvWoRN3rGukwtndZ3Ss6gE24EiGpP3I5EzYkj39BGkE808VobJZw05ywxHhIqDMKQ7V08/m8PY2eMknYhYzUli3XIGkvtmbmfKLUxTSdilHKK15cXgjIYHzCTRhlPzhWF8K2dc1B5Z09ba+Qae+xy/1KN43ajNZjnhf22Ebzj4f6ENg5VMzUVnr5cuW0XYiq0XgmTpSaNs4YWtRQZ1EKJohZOxlH1C6l3WtHUXHDGMnlPOiItZ5racV4RvGG7ZcIUCMuJ45C2P609qnoUFUMV64NphLCg1S52PxzKyIG75MY0eUAOXzlW+mLIOXK9/szpdMe+b+x7lHKH2kfO46CMCtIQnNgmWuMWC9v1ILUdrS0+TLxerxhVmGfZyq4nz+vlRkoHzq/UEsmtEeaFXDcuPycee+QSRVAwGCqer19+5nbb0K4K+9h4bpfMzz8fGAMPDwupHOAq5uuPfP36RG2R06nz/PUZFywpV87Ljfu7C7FceHm68Pn5mWlyvDxtOAc//BT4+3/3T7xcXnl5fuK0GPp0R61ScVtK5/PPL9zdP5LalS9PP3BXF5QSa+PL644yQlTa9ivn0yPPT8MuaD2p3dDV4oMm5osEK4nEdEMx/ZfMlP9VHr86qG43hbWZfS/4IGrkHqWTN5VEa5ppcgTvBJlkHNMkRnylOuSJuyXjvKLainXiVVtmhTKNY4cpLDgtfr8cxWMVQhDGmk90ZehMWBdwdpKhpx2ERSrO4pElvJEjxmROpwmjDQ/3HziOK/fns1ws3BVrNR8/CVLnet1xzqKNHWs2h3S9P4mSoDS9W07rHSnHkbAueB+IhzQMoTulJIqBkhq17Vg7o01iXgLndWFdPdPcqN1Ry4mmbry+7rigmebG3Z3GhRPb1vjyY8dPhZTlJnW73XDB8FYd2Xse2JKEs56uJbSR0gvOT5zvOsocBH9mPyLr2XB56eRcaa2whBM5Nm5VcFHWjkR8M1gdqCUJkzF6gg2UJJ5FCa1ZVHNY5zhKxlgx5lsVaKVig6VVubHVUgmzJ6fKdt3Fp2MsOWZQRQgEpRLsGdOFEWfRGC+d2M57vBYfqdFwbJ2yZ+ZVuKxawToHjJ4l1VoOSpagmXczdZyq31iavYtiW3InRTCTxWrk5pXFZ9haQ1m5yUx+4jh2Whukhpolme8MrXtBShkpaFC6oZSjddj2TGlvZAVwdsJ5Q0oJF2ZS3lG6kHUnt0jRjaNFLJamfglTVS3p/lSz2FBMZxoKRq3ibz3KQe0Zj6MpSVo7E6jFklNinhaM9WhjoGvqkeiqicqpCqiICxrnYAoBTSfHAl3Cd2/BiNZEyTZGo50WcoITtJxzjU8fZu7OH1gWz+0a+fnrleeXxPXleMczaduZF88335zEZ1k0z09XufHXSq6RGIV3LOvQTkn9nYYgnfdRVtHGDj+3QilLa1BTBWX5pv4Dj/F7PrbfcW4fqXS+/ea3fP/9H5mmFaUMLy9P3LYr93cPhBBkPT6KE7btQmtFgh2jTctoqTre9xtaGZwT73PvHY0ixch+XJjCYCHXhhrDas6J1go++IHvQg4yfQyjvY7wlaxaGUNxTlEOlc4PFFlFSjggHju1RKy9l/++iB9WKU0boTcXJvRQPrXWYpeIiXTswwutRnOSbK9qreJPHTSTtypd8Sn38Wtq4OIatYgQ0enj92koJXWb0ig22LzDW62VplVRoFsTckFrHWrFDbtvq28Dr0O1Rh1efGcdxjhKqeSSMdXy8ON3HOcbfz39qwyLxggdQjH+bEPXb6+1Zl5m+TP7eQTWRutZH6G/N7zfeF+t6iMXUMRiVXYqnf2oxBSZmlw3ha3s3r+3L6831jkwEMPSOGhm1tNMyUkyCLXhg6ctncvrK6wr8zJj7Yz3jhgjUWeWOZBSwTjNcSTs4oe/ehBdSsVPAaMr5RASTdmhJU0qik1HLs87xmt66cScqFm43dAweKyeabnQm6ErzS1dcX1C1QlnwakddKdqTYpVeNGl4K1FUyktojHDj25RNaCt8KW9m+W9rg6vFLVX7KBo9GqwxlNbArVijQUtWDWdFVDkOmcCpXayhCTIOdJoHKmQc0IZg2pCV5lmsZSkVPFBEQeNRnvFZTvEpqI1cGI/Kr1ZUlaopik50Gkce6V1+X7HpczDmQAAIABJREFUtOOtpdXAy+shzNkCwQdu+09styu9a16/vGC1wblM7/D6+oJShnhUKcIxkVblXtJa5enLT/Kx3DZRrI+Zr1/+hdrFXrgfN7583XFOs8fOETNhOXG9vXJ/t1Bvke1oLMtMK4WUXqjNcssXlG08b38Fe0+wjiPmQTVSzGED5LUsraGt5nrbCXNn33emSWqygw9YM0s1bLv+F46V/98/fnVQ3ffINHUUXhSaDqV2wsQIp3isltag4Cdaa5Sa8F4k/JJ3Hh5X9mPDGFG4BBHlsEZjF4fVMyYYrDW8Pu+484T3M7U0wqK4XA6W6QP7npmMw51WymSYZ0NtMDmPdRnvO1O45/7RokylZ0PD8/AAD/EO6+94eX1mPVlKOfj06VviUaltY13n92rHnDbuzt9QsuV6bVjnAEU85ObRWgLd6L3IzRLN6RS4lA2vFa1HvEdSk3rFzaBDI7gTrc60bvn8+cBPMx8/OubpgX2/EqbIdr1w/2ESwHZxdDKdSJhOAz1U+f43H0dhQcDPAvf1Tk7hy2qZwkwrJ1JJTBOcJs3nz0/0rgnOUKsm7rtA9VvDOugZSu/QOrOb6TWQN41TZ1JM1NjRveOUopWMVYVltvQ6M00zRh2skyFHTW8Gayaoing98MoNtdowaUHynKZA7x1nFpo5Rq9yAC+IHe89Tges6dSWCCfDxs7kLcYug6vZxJKhDFYnVIDWJpRyoAvHsQGgEP6gs5ZWCs56pmnB6o63huw927YNr6ehVxmGJx8GmkzCd3q0BdG6eO+q9HEpJWpkaXKhFc1MiAferegi/mltJ1COriu1Z5Tx2CBMzCMnvP3FD2SCxjLLwt93etdoO5RUa8QfSZWmmgboSu2adEToVbBjqtJaohbBrYmVQIlaOs9M0x3WiMosA1ehdo11ltorOUt6XmtDcMM/q+KATM843dBK+sdDmJncgr27w7oA+gsprex75HrbmbWX9S2OXhvGVh4eF2pRHHHjOCopFXpPoJyoHbnRWmKaPbVIO1tXma4VXTlyLaJqNcMRM9/XP/IP/T9y3z5KWYgNfHj4jt98/3dM83l8ZxTX24XWK3cPJ6wzgpUbKvvtdsFoyxQWai1jYDPs+40j3VgXaSiTBH2jodiPjePYWZeTbHV6ffenHuPz4MNMH0Oo+KlFbdXjszPybOP6kzn2myDQjKS5Be8mn7+SD7G1GGEyd7p4W5V4SXsTdrK1jo7YCVCihNMF8dT/Lz5a8af2Vt/JIsLsleKGt/phCY4a8qAWvLWWyWskQ+hAFI9wn3jCxc4gnFajGUostFYE5+ZmqWzuciBTZkTlBf08aAKy2r5eX6m9s9o7frf/M8YZPp/+dVjHOm8FGdJyNJB+ZthP0BjzhhtTY1PQMTrgbRuBNfHbSiNgp1nxlzp/R2sZe77H5w1rDakclCrYoLdHKpp82eUHV3UcRAxPV83kA+d1peQqZSLO0YpA1oW9KwdnCesOVuripBAgSLAyMAJ6MTE7j2odjXTBr2ugxsoyzYIhSxLIrUcmjprMkz9juyGXSImNEEQiaLVSjspkTjSrSblhjMJUwd/NfqEYT1eFXqWavLUqHTPdMbuF7jtaOawyTC5AqTh5w0dw1mOM4q2OVxuHNZ6UE6k3vPf44Ck1MYeVbbvgXZbQJYPfGiVwZbQHLUUBehyKFHqo3jcUosJ2KpMXFXu/ZXqzlNTJsdKSXIepC7U7lBKUYipSc656pU6KnoV+o3WXw2IDpTJxcFSNXiRQWKRoiK6JsdC7WIpibNSmRkjO0Jv4x0PQtHJFY9iP8b0scp+xesJ0RTp2KoU///k/87M98f23H7k73bGsV748PdEbfPjQpSRHZ7bblf2W0P2glM+sp0CqmVYWHh8bvTvKtXJ/F9j2F66XDX2ztBYpdRxcOIilY+0C/OK//rd+/OqgqlQhHvm9A7fWynffPXK9XoGObo2SDnqxsnY4DtKRaaVSesYbSymaVhLaWFJugJE6w2nCGkNOB003UjokHWzA2EKYZlSfuTtLOcDiJvxsUWZj2zSteLSuGC3JR2M067zSSmaZFZetYL2ltIPaYPUPPNwHQliYlzupMesLR/6JdfWUZOmAc4VPn37H558ixh48P79KDWeT4EWukTDJWjDlG99++h3BG4yppAzGas53J67Xg6bl9HL9KsNKmCMpVUqeKbXy1x+vTH7hek24+ca0VuLRsDbIf29nSjaUpMhJCgTEWmDFaK48qjVytOOG0zHd0WrGechbJdjA40lCHrV0mlJkNMEGoGAYqkw3xGtlPTl0V9TGUN/gfj1hjLSSGePQWpRKqcHzBF0xunA+z+Q8ygpqonU3hIuhpChgKCjStNJBeY50oLvCWEfvhXyIeqW1eNe807RZAnLpkJui7oX15FmXidIs1mkur5UjSYd6mFZ6RdRpNZL3i8Y7hfcdRWE9TVg7c7nIEChKYqGUzLLO0ETpEu+m4XbbqDURZkEQ1TI4jqYTJscRQRnFvHhQBoXFuQ5Wnr+fZi7bhdakrcsay92dtC3lv2m4kRCMtBC5EARz04o0aNlJkrdKi++XMpSsCaULtUXCfBa1Mkl5RS6F1jJVDcxVjNTmkW1fZt82jLYYLYHBWgfountqjXT9wseHj3i/8OXnF1IuVJVpm0X/tPHh0ZFbQetAqhN2WnDzRCqN2i80NMo4lMl4J4QD72dul0TvgVJ3UOJvVbpSqtiIrOugIqUqrHFS0dsrpdWBXZJh5/v+d/xj/o/c8QlnA9N8QjOxLh+xZiKn8o732vYbYfKcz3eyVq8VjPhyt/0qhyQrSfveGl1ptu1Cygcf508YK2tzraTgYT9uoKT05K01S2lNToltv6K0HuoSQ3mUdXzKSRjH1snBYwxTOWdyjpxO60jtV1mjdkVNkRI3vBOSR+uiir6ptTEd0GVFq7Ws3wHoo1mKgnOrAP6rPAcGCqvWLKQAJUzoN3WxlEptbfCPO7VKOFEJukA8/sgwzEgJS1xV2uAk+CO/ZqzYCvrwWEq4RssaHMQHqQWJVHOhljpCaEZoHNMs1obWmc2J3+//jPOWn0//h1xn3kos4J2GIWFKxB7ROu0Nm9XFS9zqCLeN4FxrdQy5Gk1DG0aOIqBQzDzItq9mlrlRaoMf5Pe8f/ijtAQiyD6tO60d5JJIxfD8mrheXgneyjCEwvROef8si03JOkVrllriuzpeq9SI9trofqbXEeo1mj4GHnSTzctAPmoNJSWq9fId6p7ZaiYb6F2hsSPMeZMiEBeIseCtbBns8pHSC7V2wnpHyoKw0tawHRumaqyZccpSY8W4hkPsdNftlfm0chw7pXfCaHNUxhLbGKJzodcIrGNwnqk1MLmFMiliujL5mdYMNDVII1q+g7W8e+qF193oOQotZ/CtY64U1UhJamKbsxIsRo0Doxltk3JQ0kZBRq6tSqGaoqqKU3KtbiP4BY6ONFAukx+0kopmoXdF8KCGNYY6obrQS0zwolRrh6qFYDQxXljnM6UUUt0JLmDUhEHjbZMtWT2o5eCvP/6Fqz84nT23WyQeieN3d7Rm+e43j1yen4hHo5VNMH0KPj99ZR1b2WUWTu3HDydSLFJR3Qrn05kYrxgfOPZKb46SYAq/MIL/rR+/zlH9TmrAlM4YA9pMPDwE4u2Gto1gNTnLkNmqwahKzIlWQI+6NhlwodfO7fbKer6DJitNuqfmRLeWXG+C5TEG3SLeS7AqTAqrG9M5UHsm5YP9FunVoH0UpaEqWlPEmGlHgb5wfd3IvXG7apxVbPuzJFq1xtfAljaWacbaidfXhLf3CLb6ypEKt/2GNXDsL2glfL0y2JJ9qCbresf59EDOu/BDi1zQOxrvz/Sa+fq5sm+F/dg4n2du14Q2ga9/LTx9vTBNVVTQp8gUAjl15lnTs6cmTa2dPd+oreHnidenY5xkFT4EahXjfZgMOVqOS8JY8M7Rc2eaK6bJhddo8T8+nKVxIh6Z3jqTl3VHK5p4ExC+UpVYdpbFMS931FKZvKJXR+tSHmBDxfTObFZKO5j8hNVNhtpYaU0PnImRL7nqhDCRsoSfvIukXJmRG7nVss5NLaJUkptHU/J6Bs80y3BtjUHrwHxauLs/8fVLwuqZed7J7ZnSwKgV48RzF1PFewkReG9oXSwOe4wsRszypRTx6tqJ2jLLOtGSIFliOuitsaxBmMCnIOUELbFvkdP5xDw7nl5m6YG/mzE2EGPFB81t89RmyamzHRe89figKLUzzQGtK63/smZRjJVkLWRT8W6S5L4ytG7kZuImtAHrZaVINTQy0DBBUuAKYSm6KmGTRsUoqXbNuRGjVN3mHAlB0VWjF1HQjBaeojKKvew8Xy9M4YG9dGHE1oQ6FK974vkmg1VvSVTlrkG/kPZI6ZlYK6UFsB3lIFdF3A6xV6iOtmCcNMblLHi52kQlkVYujdYnoNGIQBZqRoXv+t/z3/X/hTv1EaMc3376A705fvzLXzmfJUkviClZe+aysZ5mOch0BokBtu1KyZH788MIS4lPXRqXbhgD07TQlah2CgHvx7jhnRNPb/8bSkBOxHhjniUc0/oIgKlOSgcxb0zzA6CoLWNHc1k89kEQmN4DF8JB7eR0UNLOND+gzQjFjL9KlffROoMb2CpGGKI1iMc2LAMWKQxh8DrbsGCIOvX+GRxFBlKdWgei7RdWpkY8sbVW+T4qC12NwVl23wqkBtpodDOY8e/eiCHeCUs654Iy8hx0U8JXHbxmyRMYoVWM1XHcN0qp2OJY+yd+cP8JkAH57SmUEbR8q/T9WxxX728WIvERief77bm/rfI7XelR8KLeh35vJTC3mhWQIOfbY1nPosq2Tpj6sFb04WPPtJq5e3jAGjWsXJVcEtebbCKtCZQiFabWThjb0VUIKb3B5fLKHIQEEWPi/v4OZTraWkFd5UGXUJp5mmTbFixdK1JqqO6ZvZVgWK/UApNdMEp+vn1LgHjAW1UsYQWV+PLlC8bPnOd72c60QrOaWA/mIIeb8yLV060I31jVSto3Skrse8L7INsp7zFN4azBhJl4eJw9yXo/FWYf8Nqx+gmnCr1aSopULSt+bRQlRZTWBDuTi9zDlmXh6esXeod9v4mSqzUx3QQPN9r3rDF0I0OvNYFukli1lLy/xiiMEgReLRl0xtggn+Mmn13VwSqHRobZXKS+uJbCsSemeX1HOlqK6JKqUUshuHUIdAmDQluPYaa2iLcFeiGljnIOYyumf6KZFxRilbtdr6TDDqtP48efhAH7/FSwThPCxMttZ55nrpfI5QZ1vnC9Gdapsk53/PTDxjx9w7JqPn3jefq6cffhDrrh+fnCHGYqhbin/7v58b/Z41cH1XWemLwXTM3kkZNx5+HeYP1MS3Jyaw32fWOeHM4VGh3nHMdxoMeAcn8+E5xGGU3WIs03Ba0rjKrYceH1QRL8JUWc78TDgNXc0hepD0tQs8Z7iEeE+kCuL4TZkaNGKc/1NYqsPTVyWtBoYryxXwu368ay3JOreF3X08xxVJy5crsdxHTgQyTliFea87ry8nzjdH4kpcR223Becz6taGP4+vWFUhKtR4JbSUcZFwVD3CutKoxxBH3meFX0olFTg+xZlwd66/QKOVryVrB64nLseDtDq1jdOd0Hpnmi1IbRZ27XG9u2YfH0amnJYfyMMp19i1Sl6a4wuxmKsEWvL7usGRtMI0WKlbYbo4S7iZtQTOL5rDvL7FlWxzwFrrdXztMJxYQZgbPKLg1KesW5E6hC99DRwpfNGTf5oVRI8AKlMdZirKwZQ1iptVN7QilNOgrzfAcqknKXFeMoyChVhmBjpZ/8+fLCZfvCdot4s9I56CrSqqG0DHYEMWqmVEZrmDRQWauJ+SBdRHF9U7r6UQmT5+vTlZaRetuB32m94SdDvUR8Kixz53x/wgdPV7wD8rc90SnUCrUHWhWFvJREcAHVHI7OkW68pk7wDpp5/94ZAl0ZlGnkUkZzm6yFS8njn2KnyDWPOsiNfd9xwaBMx88OlCCNlFZ0JdsNZy1GS+iwA9ZM2OCGFxJyKxQauTR0L1itaMrx+eUF+kVSsmRsD6P95uDz1yderwc5P8tKV02IabChVecosB2Fz18GFL5IqM0Z8E6CF707tG20kmjNAeKre/v+oCol7yhVMMajVOW7/kf+Kf2PnMsj3s988/H3fPr4e/63//U/sW83pmkealmRJHWMHMfG6XTG+REoGoGsbXuVG1qY3gcwpRUpJ47jhrMe7yUt33pHgzSqpYMwhcFF/oWfmnME5BCqteE9RtU7Ke20loY620VtVdIqVbIQBKzzckiTXTW1VkpJWKtxPoDS9CbePVmnimrurKiP8pCBrOTMcWwYq7Am0DojTNhG/WkayLI3P/wvA2tOkVIjEAYKa3hNkQY4kJIOeQxLQWsyI/cmQ9nwt1LldavUseIW5mxtDWv6CHEpmlLvz9VaWeHTlIR1jUUpw/V64bQu+Lzw8fIHvpz+NF6LNl5TwWUppUchC2BkS4Tuw0PaMUaj1Jta3N6JDm2wZXl7rboeJQ9NikVaEpVW/Q3/eBAYfvHt/q1n16CNxdm7US4iQ3+whVZliyEle1JI07rBakPJhVrEN3y5FF5eopAIcuLIVdoItwPnNMZ49HZFNS22khCIqeC8HsQOg8ZK01mOOCfKbseSBUs+1tliI8kxMS+O83pmv+2ctKzDciwoDN6sqEEteTx/Mw6CWRRgW7ldXiklQXn7HAsmsGMIeGbvCQ20tuSeKA1cN5zDTL5emO3E5VKYfJAGvdywxnDUgtNaqr4x1JzpRUpcYozEfcc6OwZKTTiJ1cwo2VZ1Je+VDxPdyHq7VkG/TSHgrTT0iUUnMoeFXhTzNEgpKCyiVpcuhwylq/g7XScer0zTLNXdbbC0nRx2rAbVK3OwxCPiwyIEm9bkWuzAW+i10qsh5tsIkIptTxlL7QqlI9r6YVHK3K47xmohdKROTo3aC7P7gNE7+61Rjx19Z4iv8HD3yDov/JQSf/7TE//hv/8dxijm0KVqd5r46c/H/7Mp8r/B41cH1ZfnnWn25PiWFJXK1HWRi+/r7SoDmzb0kgmLZ5k91jkulxtusaIknmY+fFi4XQWlkKJi32Vgul4yVje8Pw8Pa6K2abRqJOLRiGrDhYZWhuAC2Sl80Hj7yHbt+OleVoQ5MYWZrhLrtOCXyjrLuoi20tiohyV1xXZ0jriTdlFttE48P1/wbqElzbLecV4Cv/3uzOfPP/P48RN//tOfCdZhvVgdnl++YGwipcI8ewyOriw9y6pNt4nJdaZ5wpqJp6cvmG75cDeRUidlTecQflmbiDEyuwllFTk2zqeV893M48NJ0owoOoaSK3/+4UdarrzuldVbZuuZ5pWL+Yx3C/noMpQYKV7IR+d227h/uIeuhGk6iRe49cg8LXh3z6eP3/F6+czz68+ovrAsCrDyxddwdz4T5kJOhSNXrA4Ed8/d+Z6vzz+RUgXlwTaak5Q7SDCKKr3txhiUhVaM1MISqb3IhaFXUV+sFTyGaVQOuYkV6Rw/YqT2TMwV6wXxc4vSCLLMFuGNXzFWoV3n7AXSHI+CtjMqV6nRVABNUsxNkRWUmqmMC0CpMAIi3k/U0tmPRopi1Pfe4G3FaOldz6MxqPZG7Q2FxZhCbaIwaS3NVK0aalHS112hZE2tvyQslTb0muhNo3EYJT9rrZWWpRAjHZFiNH0D7xu9v6J6oJeVXicJgJRGzQPz1BWWCY2habE3UA1Gy/sqoTCNQ0s9aFXDjwow2s1Gr7w1clDRSgo2MCNEpoTXa23DOZkMcpEQwm1LPL8c8npqi7UeZxTGRJTqOLsClVQKKQvqzlgljVZdlFStOwwl9Tf8e/4p/0+cywfmeeHbj3/kw+NvKany+vrMsq4s6zoarxhd9VdyOQjh01AThWOaUmTfLxLks0Hg+63hdCDnSIw787zK+9XaGHA1OR1AYwrL8HsK01C67SPeGaZlERZurSj0aKZKTMFjrNQKK6TKteREK1HQXta/K3IMRJIUaBjpMR/qoJJJWzZTFKxbJYk+0uoKJRgo3Uajlh3e0wZV/KnQCUFKSfqby3qs7GvN0IscbJX4sxUaeqWWLJaSOkAHVnzvvdXhqRVOq9YaqwxKVd7dCE1akGrt735XGTIbpcigZ42V4bANBVTr9w42/RZ2i4Hf2/+Ac46vpz/Je2r1e7irtU7Tojq/Vzo3GU5aF3/vwNeO8Blia+qKptpYqavhIZZSBTrkVPHWyfvz9r2l472DbqmtDH/wUN+r+H3fmLN9lEUYE3BO0dssw3F7qz4eft4mDNLWC97dicDThPzQ0eRsQQWOWFAjkFnrTj4iyzLx/OWFaTbMs9A2am3Ms0P1xul0hqVRqhzkVFCjsCISJk8toJUwmWsVS0Sv4K0j1cIUFlIu5HgwO4vundlL6NNgUE1TSyInoWXkfNCTPO+uNXs+xHJguwzlfWEyC6EHFn8C1ZgerIRFe6PlDacM2oparLpmmmd6bpQjM7uZYDzG2sE2bvjgBopMVvUhOBqVvRaC8xK4srId2HojTA6tFMeW8UGLB7UPjKM1mCADsnKe6ix7ujKrmTKQe86JuVrpSMwXaAveO1QXDJnqjdNyovYNqzq5FOZgpXCigbWKh8cZpWC77OSeSLGhjPxMp/Msa/9UWBZP2jNKa9bVU9m57he0Clhl0Krg3QlUxhmN0ZZ9u7H4idfXF3pLvLxkUsz85//9L3i3EIIiTQofDbfrL8jEf+vHrw6qvXlaCcR0Y6qW48ho3UTV7BGq4vq64VygFQ3V4rQhR4U3D0yLYp5OaA37LRL3yvn8gNca1Q6MbgTb8CbwcHdHPMQOsKVXUIZeNC01KpUQPDkqetU4MzPZTlcz7izBoFZXbvXK/WniOBRhVtw/nonHTikNqy3TLBVmynTSrggm0HNiPUmT0rcP35AGNsYrS7BndHN8+vANAHMIfPrwiZTkRLmGhAuZqIR1V5KodbO7w84FusJqK2ntknm8W+ltJvjGZALNd7EIqMLNNOwHDd3jp87r65V1mbhb71jdyu3ywhQ85/OJW418OH9DSxuT7lTzgnUz83zP5DNWTzzXjXk9cXcvPqTT/Mjr9QWlO6WCsVDihA1ibA9+pndDyjsxH9Qq/fJHlHCHdQ3v1fDmCgUhqEVSsW0jN4cLUFFcbxu344VUGpfXy0hq25EobuO9jKhu2OMVdKM2SQd33ahdbn5lVEN6H6gpU3MDlZkmwx49d1NmXlYAchH/sxS9ik+va0UuRRKSrQn2RRW812gr1bdaK3oTA7zSRr7QTo3BXNavuWQUkqCupaMM4vvMilu8iXKDE8ar3EZRVuDusI0q3gnVZdMAAqfXZhFfac2yvh8Prd+ULkXwAUVj8o6YKqVbCSG0KogSJVD23gzWBlrNpEPQPs45Sk54KytLzSx+LJ05ykFPBu80Xf9yA+5dsYYTp/UjLy+f6URqK0NNVDg70Xvnaf8J689oO+NDlZVcllCU0uLra6PFjVZoRri40swkgZraIUVJa7ceh2InrU2lViwWraustA1YE/iu/D0f22/5tv+Rc/6Gu/MD33/798zTI1oZrtdnjnhw//CdpKzHwFByY9tecNayLvcwbAUg26BSEvO8jJWaUBRq65J+7Z1lOomFZSCrWm3EKP3i87TAGFSVETJCbYVpmoaXVCgASsuqXfXKOs24t/a0DrV3Ss0oVd4RO29oPIWmFaFbWKOwTpTi3qR6mCY/S+vig1Zm1LgiByTxoCb0fKLRqWMQ7K29D27WWLEa9DHYK/F89i7e6DdfqaT3GVSDCBwo3elN06uolUYpacLqFau0HEwwKGTYbU2BEaRazrKJkMOSjIO1yvCnjJIAy7BTaPW2HejMyywtRrlQL53v+QeUgp+XfxHiDB1rxdtpMO/hrg7jsNDGofKNqMJgqOp3RVkr/R4se1PfoeO0xXaLRmHaL4GTPvyx0ioojYfwppZZqT5GPJzA8MXK571VqQUWH6Yk35WydKT4wypDCCvG3I/XcFg3shwKUEjrnpIih1rEY416FBGnRZQVq8J1z+QYSdWxZPns9NbHZ1bW3N692d0itSXmeR4HDlDGYCqEacLmhtVSFpJS5rycEJyjZ51nrFF8/XIZ1JxRLqLFwrGEE2FyxOMqSnssbOlG3g/0CP6CqPi36xUTNE5pqWAuMtS1JFkYrRQtN9b1LBuRgZ7UpqGVlKuoLu1w82LZjoPeLLUKiWGZBC324cMHLtdXmVto6CY/x7qeqH1HqUpuFWMm1vOZ9gxhntj2bXwtOsYqnJPDgdETtMLHjye5ziXP+TwxrwvX24ZRQtLwXhRY58BaqUB+sR1jH0E3nA8c+87T8wbNogk83k+gCj9/fububqXUyLzMXC87p7uJWioxveC8wbhCOgrdWLb2ilUTzouI5WfH5bJzbDufPj1gd0hpI8Vf7kn/1o9fHVSX9UzJgpYJduUaD4w9oHpakRN6jAc0qSXMuyK3TO2GZV5wSBjkenkFLF6f6dkR/EQ2nd4jp3kmhIlgZ9ykiSnT6iu570zTRDkqwa7YbnHGy5ooGGav6WWme/HeWfPA7GceHmaevhqck87br1tm9prT6gjTjLWWPW6EB09wd2gXaarSitRNvl5eKDkyhYnjFmm+UJrw/Jy29NzxOuC9w6KI+RXlND0ZTO3UenC+93Qc1naclZaNPWdOs/RJa6M46sE6a6bwSK4784NnXjxPL8+oHvjwoARiry3bvvH8/IKzitfXjRgTxhruTisPj4HXKzSk2lDpmWMruFAxrnAcgqdw3vDh4z2fv3wGJRzLWvWA/nuOGHl9feavX+IIQMngU/dEawrVNbEktLmheyFMTSrpUiSnK42N1ivXq1TlbvshdW+LJZWCcbDfLnizkGui4DDKUvqO7Z7aZZ1IV2gBk7PTAAAgAElEQVSjx7q34F0QryIgmMqCMpbgHHcPFhDwvlIRukFph6agjWM/sqz9cxxrvcBxCLjb6yAorSbsW5TCKE9rmZ4sZSSHm1Jo5Yg50pFwlgwsGWukZ1y4rEIBkNWfYrYntG40JPCT8k0M9kiTVCmRfNMoLWtP5X9RVEtNQ90xdDIlS8VvsIE5iN94mqQpx1iNt4KlstZzxFdKOVAGnO2sc2CaH5jDwnYpuCC1o33PuHWhpEbMFUWn5gMw76vTMAVZf6eEdZ1SI0pbafLyCyhNrhmHlEK44DAWji2xH/L5pQnCTeI1AlA32oqSWSIxbTgn36veNFrJWl8BOUuYqiPq73flD/xz/Z95bN/TO5zPH/jdb/6RZXoglULrnW2/YG3ndBYPYa0FbTQ5H7R6cFpXgl9QXQbm2gTKT8tMfqW3UQ9qpTK25oMlOOZZfr/eJYSUS5Y6SmtxLoj3EflbLQV6I/gZo4Ub/BY26i2L1cl5Wd93Udk60sRmNFgX6MiQpIbfs7cEVJSx0sj1ZgJFBp0chSvZlRuDcUMZ+d7EfZOD4fkDrSMDMH8bHqpiW+l9MFsFKyZ1x1XsLk0G497kettbpdWIs7J1aEgznemaZuR7alR/b++jd2lx06D1aBHsla4szg9PsBLQEVUaz2QwlJWp0lpW2l0Yr84ajLFo63h9eUXdHN+pf8Alz6Gv/Hz6E13V4XPveKvopg3kmdSCl9bf30+xNMgL+jaYlv4WxOrvAbq31805YXpr/cvN3BojXscumYzexXKQc5baXZBCG+Qap1qDwZ3FKHqXoUVrK2qmtfSW5fdBgm81J7S1iH9DoXqhVf1+zey94d1Cd/L/LOsjrSdyiTKQN7FVlBEybbWgzEztCXQhFjDdskdhQ6MaVoviH+MzNUvQtBQpBcCA9TJGhBAoVbzd3kvoVohsFh9mtPbcGUMfAoizDoMm7RFnFNUI7uzYD3xf0MaxDQ5x8OJPXfzEdrnhtcdoxW3fWJY7tm0TO5NTXK87Sk2YaaLEnWY7Kjvm5cR1e2aZTgTnqLlQksJ7xewDHx4e8ZMm2C6e03xgYmW+v0fblefnr2hAzzs5Cx5znU4Yozk/zlzjlclYUr6xrDOTXvGTIdUr93d3rNOJXjNhdUwnw2OZMR3oM0objnhhmtQIGUesV5zmmSPe+PQ4Ue8bvRa++XDH09Mzf/jDd3yz37h+3VimzvNfXvnum99z/93Ktu0s7sSenyh5ku+Q01QOsQ/UyjXv5NZRGErrKFu5bK+0V0OMN9b18f/FKPlf9/Grg6oMIY37x0BJUmlmrWGd7zkOyzRZnJ3IuTJ5R0pZOHNToKZEHhdbi2Vd19EQApbONHh+xhmmaSFHOQFVU3i8f6SUKJy4brFaAON+hH56qxhlCcFTu5Ukp3IEL93p337zgVpFsT3PdyhtWGaDUg3nAg6PPRkoZ7RPvG7PoCc6O7NbwM8oq6VpKiUBs8+OqhQl7nh3T08d1TSTeRjFRAKbn6YzqEpNTVZDdSi0PgzPU+fu9JFen6A24iaD8rrOI5l74N2Cn8JQ6QqX6yu5FhqO/bhISCBleo/My0rKCutgOzZZK+mEdY5UXrBmpmOpXTNNC3f3EzEf3LaCX0R5KT1LdetUuW1XpjDJza8XLArpfpnZrhe2eGC0x+2djx8/Yr1FOwmOUB1HuqBMZZoFVI2dwO742ZDShHMTqW2jSSyhdIYqz9OYjlEztWhqEUWoG8V136ktc1pP9LqSk1y0Y5KeaIH0T8RDkEXOGgkL7Y3WoRrB4NCkYrZUCQ3RQFmpk8slo3SX92hA0lORWkXnJYhjvBjmlQFv5GbhnQfDYOxa9iML9qhGtLKiVDknFbhOiUJlDdMc2DcZSMXn/csKsZQqnetevJkahzVBMC8SDMZNjlwlONebIR0W5yy1BXKRat3tdkOtBqjktLNdN+YW2FPkdnSM3tj3jTq+T1o5FJ3t9srr6zPz4vFBS8nBKLm47Rd5jf1KSY3jeKG+YYRskOBLibJCbmKpMFrUxFZgDquoKxlUa+KvVY2cCs4EZK6RTcSR5KDxO/WPfKv+Hb/t/5779hGjNevygW8+/R0h3IntQHdKFZX54XHlfD7Tunpf56Z0AJVllj+/DR9lK51WE07Lc+hIg5wzWuwfKTI5j/dDGeUtDS/Dlg8Bpe2Az8s6uY5B0NkJrey7R7L0RutJKnpdGO/9WN83YavKcOp5l/mGkpnTQW2ZYJfBpxVcDmNLkdMBRqO0fyccNDS9FGqOOGNQysn3RaKNckhrickptHbUIQ5qrf5P6t6jSbItu9L7jrzSRYgUL+tVFVCoRhusSbM2DEgj//9PoLGt0YToEk9kZmSEqyuO5GDfiIdR0TAAyfZRWcXzDPdwcdfZe61vbRPXSuOF0lCSHM4ogsMpJeE2P2NIlVQrqkaUsUJ5qJHWiHgLVVytWustrZ7QyMbptc1KIyt6OSVHnKlITS2S0ka9reBNFX9rrhXrPP1ux+X8Qlc9H9LfENQNpTVPuz9shwfxv8ZYtsMBW9OdQZstVIXapugyMddV1vWvAazNwSmZC4CisdqQ/9VEteRCSjPOdeKNrWKTMFqTk5R/VApKy3TZWE3eJr8awTYVpbBWU2wjQnTDR8nT2LzIKW2hNS2T201gGy12m1eOK8h7n+pkw4QUQdTaUhGrUkyFXevfbBel1M2jHbZtkyBvcs5gPCWvhOzFLhPmzRurmadXssaM0aITpnnCO82yrFhjcc5ISUsttF6RQiaplbv748YsFXF9uU2Snm8b7nRLDJ67/YFv357Ia2bXjpRkJbCWFL56zvOFlBKdiagIVsN6nsBCmhSrzkyXK9pZND0eeL79RIiF3TCikyLPiZfbleNhz9AM2GGgz5BcQ6Rh96nH64bL/JXXtrhG3ZiWwK8e7/nxy4LrR7TqKK0iO8c4eKp2VKVorGH36AlppVENftDM8xOUhvv7d5wvEW0mWjsQK7x/36Grk7xDinj3wHfvD4wHT9cZ/uo3v+fz5z/x9/9zQ3XfsPUDh90jv/mrj/xf/+0PkmWIlpfzmbt3e0o1hHiiae8wVIyLWBvIseC6lvuh5/nbiVy9ZEb0/yir/xxpnCeHSlwvNN7QdkcUHq0DFUUI4JynZM3x3hMXgfJb07EfRpZl3to0PDkkrLG0rqFzLdM6o3Sl8Q05LNScaZ2j2+94eXkRnIKFGCe6zuKcZ7oJuqZzA7udJqWB02kBc8WYTOd3OG+5nOWU1uwatGpYwhVrKyVGGteSykpKV8K6SEEBgZRmaoZMlA8dVtA2GKpaqBi0CczLDW9bcrywGw9yMjdK0EhUnr89s9sdNnEKuhZpDCqCbZpnETEozTyfxE5hFkK5cXc3st/tmMMkVovqcb7b+shbmm4CHCnBbVkIORPCSssgrFUd0KYK77aHh8eWkitatRij8BjsohmGHdq2zNPKEs50w4BtJDFujEIzyqS5xm0ymdDGcptXtMrYoIjpM13r0W4hTCLabNtAimQ0IShSkEBMzYGuOcpqRDt0tQSl0bqglYdssVtNn9JyonO6I8VERSD60kUthvxcIi8vcWOcWqxpULpQc2WaA8YW4ioXA++F2ZdS2oSTR2tPLtK2k4oIzW7oWeaCtZpcM95K3ee8LjLtzYlXOZlLQdtIRhKj1klg4RU3tIZZ8FbKogp42+E9ciHE4GyL3UmlaEpF/JfP8m83bUfOUjYARg5BKuIbWXeWnKlJvqRDXMl5JcUoIbgUiEkutkaNrKvh6dsXSokyrT77Dd7tKeWGQjAvCTH9x5hRuqBNYp4KMRi08ZQi02ulFCFcQcvqrPUDKS3EXJhvV+mOR1pRlhBR1TCOHij0XcPQdazLQiyJvmuECFsLWUPrPWozMUpFq+K4/I7/mP433tvfbrioQt/c4cweqt8clUXCUrMkpoehExuE7EcpFVJasUbTtRKurFmmlSkESgoyATJ2u5TLhT7FQIyBtnHobYq5aUfWsFByoutGhNQkj7uULBifIsQBOViXDcAvHF5tLQXzFtRBKVLKhLCg0WgjwdVasqThU2ZZpm1a1qG3elYRsRCTvPaNkwasWjfxVCGlICzippHVd8lvpAPR3REZ2iphnha1DUCFCWutFmyZlgtmUVvyv1Sxx1AoRdL1qmaBpSmNKolCJmy98lCpKoPaGq1qBu0xStrGqpL1bd1A8qVUVJHKauGxiqmnqow1ZauZloKCvmuhHricz1hr6do9v7r+DdYUnnY/buB9sTilJL7RWgKVSqgKYysppo1zKRgopRVOabQq4uutapuq6reBg/5X9hG5XlZyqhhdNtEo772KTKNLeWXQQtn+3lpveQYrnxmz+ea11vIdYyxsqECxH1jZ4Gz3NXpD71m7+Xh/Ce7lnDb8ltneu6+M3E10e4O2FWPKhuNygvLTInap5a0w4lX4Kq2I0n/LMi+kGCSUlzM5xzfqgtKVpiqGtkExU6nEkKglSWWxMVKc0hr67rUso7Isga5rcb4VdJw2qOzp+kLbtMzTDa0155eIswvvDh+Jaeb7D98R48pu2FGK4nDo+fr1K953nJ5OuH7HcTfw5dsL83niV98dCcvAw66BsmKrkmCk1+gl0zSGfTdw3+344fNXDncDx4cOkmedHU3nCeXKN9Uy18zHu5HOBWw3okqhmMh1Wvj48W/xJvD09BnfdRi3UifFzj9i3IXn5xs5OIzu2O8eMW7h+euVrruTQKVaOewfWMINVQZsX+g7y/ffG2JMaBp+/x/e8+OXyNi947D/wH488Hf/8ciPP/9XHsrA16czuMjlAt+9+8TtJfDdrx5Y40kOgZ1nNx7JecH6jlpbnp9ncn3+N0jJf9/bXxSq7+5HajLMc8I2wjJUuiOllXEUfliYZZU19COfPtxzfr6hS6VrR3b7kbMWP1Ctmf1h3FKpWppXPMQIrW0wY0argt48G4d+4PFuxzJNaBqM01hr6Q3bibewPzSERVGyQlmDNY34D01i7Ae0rjRuh0LjF2nXSknSs8uyUPVMzZXDbiRFWBdpZ1jjmdbJhMk58fQZHTju77lNC+8eBs7PgX7fsd/1vJzPGOeIzwXvW16en6m943yShg7XROZbZb/fU8msy5VSArlEXONRSrrhc17IuadUx48/fcW6QuOPFD2hXKXtI6iM0R2tUoQUKXrG94qqArudkVo903C9zuwPA12vqcUyDDuen7+QUsRoi9SERqqSVfPtdhHGnJYvjlp61hyoRXh/0zwLly8mjFVyeIkr8xwouWC0Q6kbxmVSSawrpCIJx7paSk3ULskFEYvZUr8pyYXCO/kiLjnhvJELbhYwdlZsTMkFELJB24jvNMSCVo6oCpUkk69YCMuEri3WSFo35ShrKCM1uda2JK1AGSS5LBcn6yxxQ8Q41xHXSAiBYejfUDbUSipZ1jYFUFbqM5VCKxHUzni0lfavsFTpqs+V17afnCLGSvDE2g5jfkla12JIad1ah6TWtZSVisbbiKpglCOsmpSrTNiKEl9rrdRiQFnaYWQNQR6X1cSoWaatOStF+nbAO8PlesY5habgncLYbpvyJRHE1RByeOPFetMLIu2N2uC2xiMRhAoBZKcYJIyhHShoWk/jK2xT5WoMS9Q4bbBO2IVWm2216vmV+j1/Y/6eY/1OeqyLYz+84/ycuZ4vHA/vN4RTxiKhqDWuNO0BpYRBKgnmLD68ivjjgFozmu21zgGjHQW7QdRFXKYolgXbdGhjN6Es25OwzKQYUBhek/dKQU5ZvMpVPNPbL5M1eyoC5dey/jWaN/9qikHwUd7ICjjLej2jWNeVlOLb1PrVgsDrijqFbZMgaKKyJc6pUFIkpnWrahXerSy3RTyta0Bt5SuVshUBSDPZul6pdkXb3ZsgKiVB5k1waF03akOVaWkV24bKK1nlrUBDHqvc1MbTLBu2xwge6XXtXjLaZIzTaOPY7KkorVBVKmatLWid0GoQUay0fLdWuF7OaA1d0/Mx/JaT/hOrSWQLVjcYK5W/VYFSRi6ACl5Zs8YYlJaiBKMUVMGRoRXVGhH7VSbgStXtUCE35xzOi3hWCoxtKVVvk/Gy/f9q8xdv1obt/ems3WwglZxEECsjlBKZ/m7JedjazDY7gpbXu6bAa0tXqXWb6JbtkCSPT2+hMmsMxrjNSyuHK2s1zvq3zx9KWqiUtmit8J2X0g0UpUrYMvaF8/X01naWYnqjHVS1DRWodEOCkgRxqRLCti3oWvDebnrAMi8L1hVppdrsITFrqp4o1fPxuw88f3umlkLXZWrt2Y9HlnDGGo9zsrEZuiPWJi6nB0bneHk5Mw5HdseB//Lf/omn8zMfv9vTDpbe9liVmM43hrGjHx0v5xONbxmaHkPDsWloi0adIvuxozYda1QYN/D+rqU57GlVwltFUoq8VIZdy02f6fTIw51heRHKh29Gkrnhm57z/EwIHUt44vTjV/6m+V95t3/kqa607R25fqNpesIKXbNnXp5pe481DfPkMF5Qduu6oip4u+P+biQuhq4x/ObXv0Flxcd3lT/88Ad6r3j3ruepnDgOj9yWQK2GcTjQdwdOl4Xx3Q6jW6xfCaH8m8Tkv+ftLwrV33x4YF0q0w1SvdC0HedT5nDX0fQGR8PDviXGxN3hnq4b0AEe94PwRFUmR0WpmqZr2Y0DsSSWdcF5w35ocLbZQMINVqftZAZ3h/foAmbvGLtRIOMswI7duOPp6c/0d0eWOfD4YSClwu0SQEfatuVbFIZcTnWD70pq2jUWbYtM0bYv975zLHXi4eORnz5/46E9YluIS6RvdyzrlfuH9zRuROuPOG/44x8+c7zv8b7n3ceOkBbu7lpy8AyNY12fuUwzdw8NKVXGnabrK7k4UJFaPFO44dyAcZp1XtEucJ6u3JbEy/mE0hOPjwXbTpzOC+Ox57DfUXNHrjea9cLd/R6jelk3Ad3g6DrL8/ONu8MDy3reRFTBuop1HV8+X1jWmVKcVOuVTFQLt2ug7QyNd5xfvpCK8OTWKTBfb7TtViZgYA2RvtsR10hJDtUYQliotRKL8GZjjhgK3lW0MsRlxpiOkCrkSCzXbTU60XhPWtPWXy/r5pRmvD9IYMAL87MWCGumaTTaSKd9qYmm9YRYBRViClZJf7RtINWVkmViqAwUlQlJ0rPrJOJXKc3tJkUWeYN+55AxGPqmw7tG1rtKCRLKNXJB0xZVN8B6SSzL/Da1bXq7rZZlSp1jIuZESoXGO9ZUuE0nvF8x5pdmqsv5Qs4BpbZqTRzTFLhdz3StYex6vHbEVbxnznlSqjjvyAU0lpINt9tCLiu74UChcr0u4AolRfFXNdIsZ4Y7jJNpVtu1lCJ4E4UTAaYVrm0pNbIuC1Z7GidViVonusbhXYuznjXcMFqzrgtZycRV6UqtFqssBkvnFb7tmONKLAG1NR5VBdY7qBqjHQ/LX3OI34FWWNNyd/cJzcB/f/4vtF1H0zbbIVhRCoR1opZC4we0kYmUJKMD6zptE0xZgZZSKSqxhomYhFtaqwQIKxJmi3EhUzCuRSmziVG11W6+CnK76ZDXsFSSFjBrpbACNqFSt6aaCW0rrpElsqTA2RB3EZSUXKCSTGo3iD2qbNaPRpistWx0hkyIM9pqmqbf2KHlzToQwsISZvp+JwHVIvBzVaWScg0ztjsAllREmOuyAfeLCLpcoCoRRcYYTM4y/TOJ19CZ8KjUFpaLEpJtLUuskPMv6/WaySngG3n8FSWCT+stQV/pB0/rLSGJACqwefnEL9kfWmKFJbqtN1Wm0sPYc375xjStONvS15bH8wM/tf+EURZvNK23xJSYU6AfBzqjmJeE6iyXq2y3YoiMh5FaM9Oyrb21bPTyVoXpvQhU9a+aqZy3WyHCVmpQ1FthSK2yptcbYuCtUrZKGKqW1zpaNk2vMFrzSjgA3u5rtul8zvntf9cqU95asohcAKVRzrxB8bWkFjHGvAng1reYrarYaI13FqXAOrESWIT24xrHvCykUoSdvmaSET+rVoZcKhI5NTRNI5zTpsE2ZjtgSWGLILA003QjhgBFBglKK5awUGokrpNYyWqGojidz5RsOJ1OvJy/4UzHbtcLhrBGYpJGtL4/0Hcd+93APM385re/Q5XE4f0nGhP5/PTCf/qffs8SLiTb8Phwz8vLhXd3D+isxUKTFgqWxo20jWPsWnpriFNl3/ccxgPz/JXPf/7MOUrItZqCMg1xaRm6hkLFp5bDeCDkhdvTiqUlTDO1tmStUD6xniLH8QPn9YpSLSEUSp3R5obiyLT8yLq8p0QPVeGawhr/Bd+NqPprWl85bw2E49Aw+g801qCdw/rAOP6Gpy8/UFvFp48f0NpgdGb8bQ/Fczj+hq7xnJ4nrPLcHe6xHuYp83B8RDCB//+4/UWherffo/aOeapc5oX9ceCwsxzuWtY0YWoGdhi1Y+xblqVw6A8Mww6jZeJ27Ftc28nKU0sF5G26ggavHM4pQpRTrNVF+tCV5bDbCfjWTMR1RreWZZ25v/9A344ktWNJicP9nsOh4acfn0mx0HRGkrAvT2h3ZAkXjG64LSdMDozuQNuN+L6iKJxeFu4fDSU19L1jf/eRdmhYU2aaThyPe3J+oGksy+R4eDhym8789e/fEcoJTeT+7jvO5wt9F6gJ/uavf88//eM/8eg0jx86/vDPX3j3/Z7r9UotnqYvONMzJ0ihig+Qift3LevquU4Xvvu+4eUpMOwS796/w+mJ9x/vuXvoSGvD+ZK5e/eex/vvuZxnuuZAWCuoiNKF+ztH3/aybq6J23Rjvx9QqqMkx226oJThhx//hMHR95aSCkpFcl7BXFHZYrWlsQV3aBnHgdvtKtObVnxKpUbsNq0o2qBNRkV5W7U0YFZut0Dv9+xHS8mOc7qCrUCQlC0Ft60tvTcidEJkmSV0oM0rSF3aVoaxe1thOtttnqyCNW5jPlZ8028p7EqJiVIhLAHrDKUKV/c1hV9LphRFdcLwVcgXuEUeS66FJQaZUGWoRVK21ligbsgYcdLFUPCuEd7fHMlJEuIlLShVmZeZnAuqNigqKVaW9YKz8e1zp2oSbqQSGHyKlRQKZEXRFtP1hEWAzMoouXgkSSk757hOKyUrtDU4Z1BZVrqN9XgD66TYDz1OG3JIvLu/E1vNcqPrW3KOBLtuU16xYngv4aIZC3XzDZoiSBYjoanlJi1N2lmcbtjterztkDplCWqRFaYabG2wOeGKRmGw1uONwxsDtXC3/pZhfmTN0DQtd8fvuNt/4scff2RdJx7fPWKNe0s/5xRZlwtGa/EjiwyEre2p5EjbtEIj2Nb3NWem+ca0LFg/YF5X4wpSLMzzLC1hxovBoAgiL4aVGCVIpbWTdPWGkkoxCSVBCwtX8jIiNNIWwLKqwRb5XFYlns+cV1nZb2KmFnGGS5Awi99R90I4KZmKrIljKcS4YqyW+lo2bJMWv+U0X4l5RRm3TeG2z9IrzF+Dcq8/2ziiWdbUXd/QNIqcNFJyIgdOa0R8jANcpwyL5rVEoOaKUoXdvqHxhstTwW7PsRpDzoEYZ6nhrluSXwlrVfyTla538hlD/+LV3X6mKYyD47pqlmRRSmaxOcvf/+4o5IbbdWHXjvxe/x2Mf6JpOglamkJRBeM8RglJpNeWeV1od8KhNG3H+8eR59NX4rpyPI4sc5CsgbZUpTBGsSyBlH7xqDZOERHRZqwhbwfyDWJAqVFatpTeCjU0VpfNclCJZGpBKm5LolZNzuZtkmrepp3bwQje/KsKec3rRkoBhBxRhQUtdbKydRGPdXo7CFujMc6jncF5T9e19EOLtZrOynfcazAxbvdnm24rrTZvbiYX8YlrLd9bXdfBRjgwxrIsgVqVeKFLYd6msykLkQXVYkxHqQ2N2tByZA7myDwvsqq2B9A9IRmW9Uy+zixLoe8VVa3c1szPT1/RquU6BbJyWJPw1vL16cIxF0LIxLzw/W9/xXFnmaaJXbOjlEgp4IwXEkAzsK4ZU1uGg0O1hW/nmZwVIRYJ6K2ZkC/odsC7ll3fE3RhNQ6s57i7MQXHMPYs8xcu18Tufgel8P3xHVlXhuXXjLsDNQ90pvD++AA10Js9t9vMw+ETuX7F2oHTZPj5x//O4B/o/Cfevy+sU6AfP5CXwnQNW5GR8GWtg+tpZhxbjof3XK5/ZJ0ru/HAMIy8O97xj+EfhE6i5XUI68yw80zT5d+qJ//dbn9RqPpW1pmprLzbj9hG8/j+HuuUhDGqJK2NdnSNwbfyRK2XFazPhq47Yqzb0EAG33jMu3uu0xXnG86nM6jC8dAT4sJO7ZjnGesKbuh4OZ04LxeGcc8tRh4az8+nL6zLjWVd0Q7ckoj5xnj0zOuErpr+kNBm4mHYk1KiHXva9ojSmq6zlGoxGsb9wHe/uicsK/M8MewGQoqgenKzoHTC4LBOM449p8tX2mbgcDewxso0J06Xb/imo+kbVIXGtnz6/gPVanJd+PDxgWHnWMKZ/b5HaY/VDdocSEV4a/fvOrpBczt1/NVfK758/TPv7+7pBuj7keF3j/h2oB8qqvM4mzjcfS9Jx6FDq8I4etbF8fT0wjC2Uo3nPWFaUEpsCd6O9N2OlA7MU2AYLcuSyUWmqSEYvO/oxsz1lLCmgjIMwyBTSdMDSFXqfJEpXs7omnl816PtQsk9McDpcuH+0PH4uztu54VmOPL5W6C1hcOxZVkdyyyd8cfjHo3m3ft7QkikFHh5ecE4g7kWztcb1oj3UCmIcUFvqCbvHS+nZ5kSaAVY4lowthLWIOxW1aBVJawiwNY1UlKi63qMFqB3QcgAYVkIZPErWiEjTNOyBVI0Yd0sG9UR1lk6opcMxUrQTDushmmZoVoa37JME6paanLkvLDMM8ZonO0wJEHWTK8fSgnbaA0ozZRW7o89zjiWeSFHgYRb42naVi6WFX2py7IAACAASURBVHIIEhApkhy1VokvehV8lFVISr3TlCCf/qEb8NbStQ2N09tEPNMNg7BmjbQS1azANuybkWW5bC04LRotTUho1hIoNaCKZmgPdI2XaWeqKC2vUy5JDpLK4nD0ZiBXcK6lcY5aInfxe367/i8M9R7f99wdf0XXHEi5cL1eqEgTjYTQEtoImHtZrxhjNzFXUFXW3yEs5JI2z5dwOc2G9slJxL4yYoepJVO1JiUBr1vvJU29hajqNqVMJTJ0o0w1q/hFZQ0vglNpaWp69RuWUolxJuWIVyPAW3AnpyTNUSWjNq9mzFW8o1XwQTGt9OawiY9fEuo5RXIJOCclGmVj9r4yWI2pjPsR67Za2Jq3xyrexGFw4nuuBarA7yXRn8BUSjWgDGoL75QsHvFxaGlbzfN5RgR1eR0EohCf87waYvIovQHwa4WSOOxb+tHz/ALesYncbSWuKkpVcrWyVlcapTYAf804BapaUlYoXd98lLkqSsrcHRp86/nTnwqna+S3nz7xt+N/Zjr8C6VabuVG0zc8HPe8fP5KqJnhcGSajaTCLxPDsOdw6Ni1e479lXeP93z5+fMb89W4Bm0chZ7r8kt7z66DaDXajrimIayFHGdARKPS6o27qrXepvNy36oqaE/aJuyvU2+tNzUPOKt/ub/byA910/KI5aKk14pa+XdLyZS0sau1xTuZblppCcGarepWv77fBKEW1oLRlrjZAIyRjQu1ENcsOLK6WaGUQWnhIlsnDOSywhoydZH7GR2Z5gU501W0UTgFscyonCgxCfXDetbrTSD4VLIRGL9pehrnafp38nuBantszQyjkgAzijVK7W/JlevtQtf3qHqjVGGOXm4/karlfj/w9emFT48jz7cbP379gf3+wKdffcf5fGOeAq4qpjkT4wR2z3I+s85VQl6PH3l81xOmIO/PqFirDJ2UBmUtd3dHBttjrhJuHtodfaN5/H7Pl58mWqeY1xP79ntijaSy4ErPXfsdWkdyd+DaTtzvD/TjyOl05f3jkR+//MDL6czLtwbjgoRLmyOn6Zl1STjdMc+Jdx8MOSWm6yrEnFI4n75Rw8hvvnsgpJmwRoZhJETxsc/rib5vuV2fGcZftnz/X9/+olBVbRZf03xDmUpSibVc+PZ8wzWGRiucdzi3cpuv5BJY10QsKz63aJtJMeNVi9aOtu2ZpxO73Y620eAUti3EeaFqKQpIKYOpNL3mNF1ZV0XT9ljfsN995HSdeD7/gHeWbtDM8RtM97R9h/WZWDXaKI7tEZSmb/YYbVnWC33fcz5dBMqs1NY5rkhVcZkSVE1aLyhTWMNKyoVctPgJs0JxYY4XUim0GFJoyCUxzc/cdy1tN7LMC+fpTLuzLKFQg+b9+3fc5mfGXS8TLjRt5/BmIBTYe00tO9bwzGE/8HjX4ai0bcMya+blyjBCTDe8uaeqTNd0rJM4PsOS0W6WhhjVYYzD2YaaV+kQDrIeebj7wLou3G4CRO/aI873rCHw+etPHO47nPmO02lCmczspKpQW0NRlcs00fetXJBXGPaetjMsk1zwu9HSNgNKtWL50JHvPmj+979/jzWZ/+MfDM/Tysd39xxGz9NpkeS/knWpVQ3LIkxL7x2+qfjGMy0W54SBV4pU6TnXE+OGLkJjnUZpQbkoHEoVjNLMs/AIbdMytC1P3z4L4kw5LmHB2URWCbDYRji4oFiXwDVFfN9BFIA/sQh8f/OmTteF6+XKbrcjrYF1XhlHR9aZmgt9tyfGDSCutYSYlCCtrJZaROstVW0lBdvN6RaMeMyaZsAZjXcVbw1WW2DG+w7vdjgvU5XbbQKt0SZjbUsIYHzFOUWJeQtbJAkj9S1WezTS5tKYhsY6tBfhFyMSPquQ64yuwjOU6kcHtsGqKniuN0auoXUdy3rF+xajHTnPwkQNW/880omtlEwi+8ZgteNynaT+NP+Odhm5C9+zL+/xXc/x+IG2PVKKVBhPs9SS9v3Aa1CpaglCUDONH9/EFkr8f8ty3bq8PQURf1opUojkHLDeoO0rZH2rK00LqEzb9JsvcfPebRNMVMF6v61VZY2bcyFEIR5Y67dDk3BJS86bYM5UDL9sy6WmdV1ntJagYS2/eMNyzqxBPhMK8WOWbb1bt7R/TAttuxMfLZJsB0XJUpXZdS3aSDBUPh/Sbe4bTd/tWBcnWKFaKSltojBQy4JKHdYYFEWW8EqsBXVrL1sDsAHsKyKarAVlAreLI2cJMcprlbGqsN81gKVsrFWZisthUVM2coSslGXiuv2NS8GZSsGT0b94fOWVAxJdA8Zp9oc7nr5+5ucfPB/s32KHTP3+CTUvHO7u8NrgB+Ep97vKw6dHGrdjnhb6RuwBjdvz4W5P2zhskqrRNUQwFeM1ucC7u+7ttbrfZW4z+M6irCVYqFkm29YYtJFwXan57fCSk0zIYROIIW5MBt6CghKc0m/iViHrfyq4bY1vjITfcsrkJMGpWgW19voX0lsaXylp5BJvq6KoKoOaGgER1sZouq7FOoO1Gt8YBNlbCSFRMuRUSCVTctkmpbJhyRtSq9SyecILGgmplQzOGfqhxTuPUYbOAz1vr+NuMMzrwrwuEhhNEbCscRH6SPHUmrDNiDEWdKZumweF3prrxOfbdvJZyyFQd/dohWgPnYghcLkmCp52d4fvB7K2uLZHm5Zpmfn+0wPnWWOUZWfuubmE7S3eNJQYGA+PFDMxf7vS6577hyOfP3/h4+MD+8MIl0AN/8wSHHa0+EG84mFNgGfwI7rRfLt8I5eAUQ1ow27nWZdK07bUcsWpOxobeTi+47D7yD/+4b/y9elMXeDjh0fSqjCq5/07xfVylYFLkIGG9wpnNefTE7v+jlVpwrqyphM/TVeUsnz9euPj9weGXcvT1xcu1290/af/RwH5/9btLwrVVCJFVWxTSSWQ5gCqSsOEcihjKGSSnLWIOW+49cgyr7SDBaOhRpblxMf9rwjXyC1eNjj3M1UlxsOO6xwYdx2VlZoroWRu04S24NyephG4/BJudF3Lbj9gTUdYAxXN7rjj5eUzx/tHXk4vtJ0mR4d2kbBRxa/LC67rOJ8D3ltcqsRyYz5nrstM2zTUeqExFqxwRFWrCNNMXAtKJbKqzPMLS3asVxgPnrZvSHnl8+fP20VrkhabqjBOLkTeZcb+gZqtEAiMkUmI6XBNS0rwcrpxf9gxTzPHwyMKEflWQWWiqoLBoozmPD1TbEXjCetKDjOFzPVlISwSHBLkgPQ/f3s+c+sDMc+cTifmqeJc4enbN5RWfHu6ss+eoYfbdabUQFgUWkdpRFkitURiUOSkiDEy7FqZ2liBHF8vz+j6AYWkdvtGo9XAP/xzZLc3fHl+EcN7P3KdZ2IoUCXVej5f8CYS40oqM860xFRwS2SZBYi9roVUg3TQqwZFwGBJa6GgtoDRhKoFZztKMuRoMHYDtIcVpQzrDIfjgcP+A8s68fTtK9okdBNZ50jrPSkJHLvVihi3hiijaL2m1z0xZiJJgmlF4YwjmULTNAxDQ66Zaj1KF9b5BW81ViuW+UbbWna7gbgYXKNZw0xcf1khtq3d+u4VJQVar6k1UEvCe3kf7nf3kD1aZSI39ruRfnRouxJWTQgV7w2awhoj1noa75hWgT3f3+8xWhHXSONbGt9v4kxauFR1TPONUtUWNEmoKnWm1jZoLTQMZzzGSrAkZ4PTDWSZ9AmsPArXtfQo/DZVNoQaMFZ4lP3Q8z7/jr9a/p5mHsk1o53jcPiA90dirBgDy7oAkfuHI23bbZW8lZqlZcpYKyvebeqolSJGmc4bY1FGKksr0uMe4xZCco14pbeRYKWyhoWUI8Z5EUqyQ5WwVF6pSm3r9C3xDuQsQRDZWDtELMqkK+XMGmZZgbNN1lSREFwWmoFxDm0dm1UTZRSlRFJe0VYmjIJbYtt0Fda0CrVEy++r25SWKhWv1+nCzvb0rQZeE+pqoxIkjG4pRVBPFKFmQMW4TNtZUvLUvCGZtpYlrSpFFWLaDi6vJK36yhgF7xpyfq00lcNBoWK9rIuv10zKDpPTJkjFv+qdpW09ITooddPcGoXCkGkHTVYFlJOAVXktL6h4B+1gmSZomo79fs9PPz7TuDs+3v8H4v0Czwsmy5r84W7ky8/PtJ2laRWKgu/Bt5rr043OH7Zmw5nDw0ApATMbUi1iScoVuwk7gA+HgclfCUh99wzcjaO8H2rl+fmK7zo0lTWA645My4WcRBDWLDB5lRVKZ0H4JXm/lppkwpgrqgohpRaZvhtn6ZttwqqNTBtzJdZCTSIq08Z1NXbju6Ko1b29ZkqSbYLbqpDzyjzfsMZtjXRIVXR5DV9tWwa1biK1br9zk9ivxRFabCrOGGIQQb5mmKNkA5z2WCfNl97JlPfh+CAV2IAp8txD0KR0lWKX3DKvzyg0qejt55WUKqVqYQGbQs6JaTa03V78sUpCZJpILBFtE5e1YGyPby3Rar5eMkaJNzOrynkqKLtDG6ntjUlTo+J6u2CVYThaXs4TKUc6B2uCXAxhTvw8fcUpCU9eTxOH5oBWlR/++AMvLxeUbfn1hyM1a6zq2e+QRYm2VNXQHwxpm9jnNKEo/PmPTwyHkbF/JATN+TaTk6ZvOm4XsU0KtrDwxz/9DCrz8O5I41tOz1c+fHjPt6cT59M32s4xLVdu14mQYJpaur4nxy8c9g3fvv74b5CS/763vzxRxTHfJtpuQNGyLBPHw5H9znA+XTfPEtxuE323o2k0l/UbBi0p+KJpWs31koh5Zs4za1VYI6ewOc2kvND0e2q0TLEIOxXFtCZCLuwOlhQMqRSuy0+M4z1NfUfbWZapbgDsgGsdBc/pemVaI9Vl8ioVjJ+//My465jmCw8PH0l1YZ0rpmZ2h4Hzdca4SIw9vukFuKsFUL6uiSWs7MaeZdlwO0NHLgvWVXIsdEMnXc1JTnXOa0JaUUoJjD0vDN0OozpizYxDS1UV1/Qo1bHMz2i7YLHEWaaT1IRRDbXcaLwmZovxlWU50/kdOSZUUzmfLhjTMk2RWGduF42umqfnZ4yy3N8faVpHWAv/8od/oOvkecy3K0qfeH6+0XQWqubp55Vw+EpJEZSmsZ5xZ0lRQ22kvSp7Yi20e0/rDPOcaZyhbS2XcyHMAd846aNOC+fzyOmb4uXyI8YXuvGeabqSQiWuGQ3U7CjIRdeqHnThukij0DLfWEMi1iQlBVVTU2aNE2PXkWpGo4h5QqHJsdK1BlU8jWvIrlKJkuIuhWEYJNxRDUO3k8S47ShEpmt88/fEJB3TJayo7GmaBohYp+iagZojxhvu9w8sy5XGt8y3zN3Djv1+4DbfOK1XuQ8NnR1RaL5ReXi8RyvNc1po2wZrKquKsG0R2x70oskZvIemscJ0rBlvoG06Of+RGXpHocHZDu9bnC9bLatMlHOIJCPetcf7kdO5pybY71qgYnYNNRtSlMnNEgI1K7yzWKPFf1qNkBfQdF0PFGKaoUqHuTGGNcyUbEBtUw3t0NYSstAifNNgzNbYowwqiwA7Lr/mU/mOx/hb+nVPJmOMw7sdRve8FvVUpEK06zSHwyC8zm2KV3MhhHmjNjRvKfuqRaxB2WpHt0Q0AvoPaQWVsWaUkNXr76r1jQVrth578UeKz3QJk/jzlNmEowi5mCOprDjjAEGcSThLqBO5RLSxgiwT2QFVwjDaKKz3gN6es4hNmcAm2la+m6hsYZmtdjUHrHdY24mftYq3tVZY14VlXRnLUegExI3mIHirdV1EeNTmzbcqV0pF03Y03pNTI2EpLQcWtfFHX/2SWq/bSltEiNThamrxxBg3i2l9Db7TdY6u93x9upGSFiqHUhgURheG0bNl01FGb2NnNuETqK4Q1oimpciAkrL5a43J28BERPtuPDBNKz/8cKF9HGn/+B49fIMQKRVa23E3VlrbkWMhhBdqDeRVkdeVpttJFXTMmM5QErRuT6mFlC27tiOuX96ul7vDI63LxKxxbWWqE8PY4lTFKUNbK6ZN5Jh4mm+M/kheIBJo2lHEq1IYBtCZHCPGVmIqSH4ejM1ovAwuiqHUSMgraq5QKsVAY7f3l944rd5tQrRirWwNcoki/VOkFANefKylSCSqZvHNppJIeZXAbQ5QN5SXlZIUts9rfW0WrPnt9YoxozaFkZJC8mPbtHg7MBolRQQUKQlwzvL8POG8xzpL4wR/2bSOTnXEOGO0YkzvJLwYCylmrtdJpr1JxP4aEnGdSdkQ50W2IbzyoEVE+6ZBG0tOimXNUplqHI0THpfSLT+d5PGVGvny9cRuN5JeFuZ5ZrcbWfWNL19mGu+wl4k//3xlHFp+fvonGU54hdOWsK6Ub2eULrycX3DOcr585SejePf+jrAWju2BWAMxRkJouM1nxmbAuZ5cItM08fIyocw7fGtRKuFM5nYO+ONKzhfCfKRrO+ZwglqYlit3+YAplt62zOcbpnqWtZJthVxY5pX9cUeYJtKcOXaPOL/nh+v/IELVWCVvmA1XY5ImRjH7Wy9Qf2s7TFCkIO1HxrQcD4/krHm+XTF1RTtZM0/rwpI0KmTOpxnfKtYEL7cTRrfcbokOResdMTiUndDWst5WUpF0a8ozTdPjXcefX/47Q7+n3xlu80SumuvtStu2b+nzeYWmPZBKxPs9X75+w3tHTQXdFJalQnXs+pHTk6EaRz8oTqcr2ihyVOhqJCwyzRz3d9wfP/D16Z+lHrAUdIK4Rvb9PVklqorEZUYbxBfnJnI9YK3ldjux3+/JZUWVzLqeSHHGWM2Hw6+5nG8st4tM6Zph4+6JTyuXFaV7bO7wbcO0XlHG4n1LG2biBLVEfD9y+3LmYf8JVOE2XXGmxTZJeJqq4JpCjpH9bmR3NOz3mRgqh8NAWCtNZ7hdFo53O56/vaA1aN3izMj5snC4a1jDxG6AZQ4cdh13u++IacJ6TS0yoaBKZ73RGmd6rNHEPGNp8aah3SmmSxWPYpPp/EDKlhJm1rByuX3FuR2qGBoNtXiWJWDiinZyarY+46xgytrdKKfn0tAPDd7CGheMUTIJVDD6jLGOlF9wOvNw7Hh5DtRcudvtMMrz+fwF13gar8A4ht5zvlwpscV2nnZo8FaxaEXvFeOwJwwFYzMOha0w+JZsFNU0tH6gbVua1vLhwx1PX59x/iaVnt2el/LLBe/+7p4YJLzSNe0mmhIaLYEgpUlrYbgfsUZjbbethjcsltcEExi7AaMrz9czpUY+PAz0vqVm2Yzclq13PEm5RyGQ4kIMEcVK03Ro7bB6RBvNtLxgnfAmUxbvmXhS5fOGluSz1LpqYi6EUPDtQNuLMC65vpUm3K+/5tPtP7Mvn2QiWWXyuwZFUEJ+0FZ25KVIRaTZuu5BhLpW0oY3L1epbtX2Fz9pqazrRMwrTddtXFNZX0sV8ETKYfu3kCCYkhVsJQiIXdu3MEutihgDMS547zexVt7g3zmtxLTStK0EZDZKQK2VEBdiinR2j9b2rYWNCjGt8jNG8fxR3gRezlFKU4zfnlvexJtUXuYcMEq80RKy2fQDhbDeoIDV/Zs3sBbxLacUCDFISYNVmyVgw2hVWeVCQy0b7mojG0DFOo1vBPIOVhqItmm0UoW2a1DKCi/TqjfPpNYwDC1aK+ZZanJT2oQDCmsLbW9Z10QpGueMNOpsE7pSV9awElcJTFEl3JYpwkU1C9OqiKXfPK+G4/2Rn378kX/+P2d+k97T/t2F+Pgzp9uZ4O5o+j0v0xXvO4wxtO5AChfGtsGqiDat4L9i2tawDuuAGKk2UKP+5XrZFrw9ykHERIbOUaonrzest7x7HAjxxpwix51F1Rcex5ZcVmK+yHf17cbChHGeEMS/H4Lg/0qtWCeHguttoWktqkJMC2uJsvZXGVMMGoPyUlerK9v63ZLzSska4ScLelBpI2JWy3/njMVYI8G5FNCtpmqgFozRpJS2GlFhn24nSUIMb+/XmJL4stdKjGl7U2q0Mm9iVWwQCykmsXU4yRjEGEXEWoOpTrBfjfCyFQrfOBo/oExBlbTdRz6vaLFZ5GqpdLSIfabUvLGHxWOlKpAMxhbWZaXrBhojE+Wc5HskpkyqekNWJuL/Td2bLdlxpVl63559OlNEIAASyWRmVner1a0HkJmudKP3v5RVq6s7M8kkQQAxnOPjHnWxPcjSTUpW6laZjhmNZiCBCJw47r72/6/1rdKwBMO6VjTW19fM9TqTc4t1NbiqJKRF4WOPMJbbLdA4USkWaJJPrGuDtgbbFj59fsa1itvtynRdsY1Dqo3nr5/xq+D+MSFEwTWWZd44DA3JTzTtgW/uHilU3vUyj/zuw0fOd/f87acfydFzfHePlu9JXsJm+fj+js3PfHmacFbgwyvJw2m4w8jIPC30TcP9/R2//PKZu+53/zJV+d/h9feFqolYKUl5gyyY1xFU/bBKpUg5Ms0rAKmsaFqOhw+U4vD+hpSJbQ1oWX1/y+yxjSMlz7b5immQDatPbP5r9fFNmeBaSnYok3l6Gkk5cWoPIJoKy9eRaa4nvHmpa7hRjIzjStcNFCRbmPAxI6Sn6RpitDjbsSx/q4xOBc6duL7+wtC3qNJi9Er0G8EMSI5oWchhY2gdTg90biPnjfF2Y5kXRLB0545tDmQ8WnvIhnF9Yejv9qRooBBZy40sFahAjAKpGqZlBhZSLERvaE6BxMLhdCGVkTUGjgfLdF1rl7dMnI8XjHYchgPhNdP0klafGGQgbI7ZRYJYOPcd79+9J4ln8IHLg6Fr7/HpM9N4qEEe0XI+f4c0M9fbFa16nO3JUbGEH7DGcjm+49CdWLcbOUPb9Dw8OLZt5DAYpmmiNYbWnmn7gg+iriUT9O7MtHzm5cvM+TiweAElInyPlJJj36FtRpWANZbh0PD+/YWnL2P1l64O2JBiYBwXDt0BZ1u+fP4FW468v++Z54mSC0N/Jnp4fHzP16e/YVqP0QKlNk5Ng7E1CWyV4f7DEYrm69dXhC7cHU+0UhBT4Nw7UlAYKXESvvvwbeUF+4WwdvRdh1GZxrYoWcBlfFBYq2isq9iv6BnaBpfqw34TG66VuFZwOt/TdZa0DVzOAzkZnFHossHXet0d2wOqM1hT26ZeXr9WT3YzYFRtj9JS0A4ty7wRvadzhof7Myl6itBMy0Jne+4uA+/TCUSgtQcGN9K4jhAMX58XXscv+LxiVMY2DcfhntvthVxmlPB7OLLl/u6e/DSzhRekEhQ0BUkuGzEktIFcFCVLUgmENOG3QBYWoSzLVgkPCPZJmOAu/JGz+AahqtWhcQdKsjx9+Zm7+x5l3uDl1Zu8+amiimRbfZ85IaX6NSzVuVpF+NbPnnZ0U4gbYn9IFurkZ4uxTlSlRMqK06FU/3N4m8KaFiXfEC1vjVRb9Q6/TWjfAPqI/UCR0brhrR71Tahu68KybHSt2a0Jkcp6zazbTAihNoPtmDO52w22bSP4jdo49OaHrbWiMXi2bcU5U2kGOf9qQyg7wqpzDUYbcnn7PvdmKBUZOocstSGLNydjqcEaY2tV6xsftgKD61jUuoRtCrdbZcUqVUDI3aIhsE4RQ0FIXVf3+a16NuOsqK1xWyGrspeUCIgFbE2Oh1AFFOxeXCp+yTWVpR2wv3kSy46HKhnrIGUJVHRUEYLGNVwuZ376+Reef7zwsfk3LOPMy/kTqJ5lWZiXK3p1NK6jyEsNX0qBFgmXNtg9l0Z2jOtC71qkk3ug87fnpTMbPhaS8EzbStv0HKTB9RfWlChSIffJ8NAfCCkRw415hhI32jbxcv3K4gtGF3TzgS2vBL+h7AMxRIRVhCCJcaaUeng93z3U6bY2bJuvoPxUKtIvRuZ5wdhIjgWpEk2jKXF/D0VtDxM75ksrXQNjuoaku9aRanNJHZogqJXGNTwnZZ3gVzFRxWXOGXxAK8OyeKRI9ddTqfnC6kurB7FCvVayQEiQStKYBiHqoVfHPTQnC1L5KkJjrtYh5Sr3WLETVLb9sFbrzrWxvzJkg/ewFyJU6kr1e5MLRog6BAlbrT9WCuGaGqj0npIyVkp015Kh6gHXYK2h0fUA0XQNpYCxjhjrtsJoiXZbvV8bResqoaZpFqQMPPSSp/YJrQ4c+yOfPv2MmgWX+yPL+JWuPTK+hh0/lZBB4lzLMi+MYaxtllJyaC2yQOsObHPg1PVoBH174jg4UkiENXM6HkmlRWBouxNF+n3zKpAqsvYX2uZI18LzV7jc3/8/EpH/X7z+byaqCikF0zTvK1LQWoLc+YFCE3KgaTTblmiVIyW4vT4j1Mo43hAy41ykZM22VpYoItC2HbfllWX7haYZEMVhXYVbz9OIMSBpuN0mjJG4rd7sYg4sa2YVI1IlipzxQeB9YpqvCFGgNEhV/ZTW1FaXw3BhGmeG5p5D3/HT9Qe6XqM05FRP0tdUGzRiEKQSaHTDPC04oYlB07gj0/KJdXmudYUYtpgQoqfvOlyr8c8OYxxkzXx9RZ0zMRqEnohrRmKZ5meG/oDWjtv0jKImBZd4xXPDdo/crgLvJw6nFik7tBb0B8c6e4yYaRqDMy1ZFKRIHA7VJH2+c3x6+ZFvHx/pDxLva/GBaQpSBXp3ocTE+XJBoWoXse8ZBs26eFK0CBEYxxeMPROSxjaCprEs88rjwwe0avhP/+kf6bqOuD3x4f0FlS+8jP+Z0/F3TNOMMY7D6R1JXND8mdbc8/n2BKXgg+R833H/8JG//PCPPL6zlOwhO5yTnI/HmkQfOqbxPf/ln37i7u5QWXzWcrnTLGPh48cLy/aVsGq6znF9nTj1A/MUULoy+s6DRQjL6XTAdzNdc+Du/sQvn77W1Pmh5f3jA/7+nnXZGA4Hnl+vfP/9eyzweG7JWRBDQ2sVh6PDOsfL85Wu7dGD5vq60Li6DtW6RYrI8XDk9nzDWoe6PxPLXjMpgZC5HI70ffVYRBKYKQAAIABJREFUh23FvXuEf6rXnYyetm1RwmKV4tQP9aboOoyprUVSZJSGd7/7HSJvtE5yd34gxpWYIvPqyb6m4w+XR4QshC0wjRptDEq1NG6he6nhmZgLtjli9Htu0wvPr39lma9YIVE6ENK1toDpgZBm2r5Ozda1MM++LmtNZF0zMQUoklAMUoMvpabIEyhdhc/99geacKmeM7GgtOVw+MCnn7+ybBuubfZ2noRSteI2hKWm25XdhWoVWJtfUapWBL8JWLFXoMa47T3oNUHOvpqM4a3auKkPvJ3zKZDEVDvetW4QwuxieS8BiGHHM1UUFNR/VVFcA09GN1QP4C4qU2LdKnfVaAO78BKicjdD2mq7mm6rECgVq5VSqugpZbC2+1XEViFaH74xBLp2qO8J+ddpcooJayxdY3cofNrLBXJlDUtB0xwJa6V2CFF2sQLGaJrWMI4bKdv63ojaHoXIIGL1i8fKD06wWwJqg5KQmWWtoSgpazuToBIIhAzMcyLG6tGNKdavWzIQ8VtmW5tfiwRqq+qO3NL1ZwJ2DyD99velBJyVxGwRmIoEE1CQuMYhSuLL5xvDcM9Q/j0B0KcZUqa1dQU+3a4EH5EiQwnE3CHGK1DpGIWMkpmSKn97CwtS/pb6X1MgFIFmJfuRKCWhD+jiMNZVy1Q7UDAIrTnoym5FGrTukHpkXY5chMJ0hRQkVuq9sWwmhEx/ONS1LQ3aCpruxPF0Ylw8scC2Gtq2R5DRsiVkT0qJ/ii5vmw0rUVieXl5RoiCD9VPHmNtKAubBxQp1PTJUgKb97tfeqcKZCi5XidSVHuMUgprTUXB5VrAUWKm0Qq3i1eh6/RbSFmfszGiiqRxtl7LOy5QG1WDXFJy6h3GKNrWYaxEUq0e0Wcoom52Stq5tPAWQUPsAdb49uv1mksxVFZ7zDtaTO22krK3aGpSSPhSf66yCNRueRG6oslKybWkIkWy0CCrjVAISasFKMWxqdtD3fSkCEY1SATaSJrGVE8vguP5O0RuEESG80dKEhhjGE4LShrimshlRetEUDPWWRAryzoxzZF1WeohrrX8+OefCCHw8dsLOoH0guk1YK1kXVa2nz3GCi6HMzFptGr43eOJ5+cfca5nMHq3f0x8882F8v8XjuoyZ4zWFRWRa6IvbJ5cqvm5H86M01NNhW+C59cXYhT0/YFSDPM64ZzAlgMgOZ56np6/0h86rHU0aWBZninJ07gDTg/ctowzmnWZdkhwi1KSeYoIGVjWhZKPnC6OcUzksiHUkewTfTPgjGOdNP1wwioIfsIah9WOp/mJrjkRtgxiI8YbzpwrtiisFAIxRNrDxDqNSHkAMt575ukLw9FhbMsyVu+rsIKIxRlLSAKCZwua4/GB8bbQdQ2iSEqUtUJVeAq6ekfmV4bmPSRTU8fS1XYnufLTL3+h7H6feVnR8lxrS6VhmV/JaUFwIatEPxzYpo0kJFveCMsLuSQe3j0iNVh9YloTIYzkvGDV7xHyJ969e+DHvz7xPP6ILt/TdJYQn1C6YY1fIbdocYCSWZeZ0+HE0xTJZ0sW0PaadQq05oCRBr96CA29eUT1I5tPyFI4Xb5FpUIJDtdrKC2EQHd0uObAdvc9TasRcmFdA9u00liLFo7TZeB0KAhm7t5deHmeoUiatmGeX3k89ztk2zJPI+djgxIOa39fp01TQKlCipLv372jaSXbGhFF88cPHxncF6xVXE73aKVAgLEtP/3yI0obZIK2lTw9XemOF0x74HBsyFnzX9bCcehIeUP1lpgiQ2eRrUYUg9YZ0UpOxwPSSr4+j4gkiGFjnGZO/Rm/rHtSd/ltMgQ0jaSxNTW+TDMpgdBgTF2j+m1Dmo1GDjSuZWgPpLiwrRFre5xLlLySReL5ZeQ2vdD2Dca0+FCYt1DFnw903YBWhgTkfRp5PB/I8g7kStsMCFrG5RnbWKQ6Ms4VPl+KIs61iEMWC6lWx87rFWuGHQ5eV4zWKWLyGCR3y+/5OP1HDumeUDxGtxyHb9C6ZZpuNRTVdFSxV0Wi9yuIjHV1WlknmeyWgBooqg+dOvlRqgasQtrQ2qK0peQq5eS++i4l7ramtwpUsT9A6wRN67cq03rAiDES4rYHyhoq95MqVN+4vqbZg1R12ymEIMRaZOKc24sIago+7wSBlAKNq9f/W/1lKezlF4m2qTxa9sAS4g2FFbDGYM0ucPcJJMC6Lni/0Z3O1aqxm33LPm3WSiOxlWm50wegigApCzlvbOta71f7OyP2r4IItWgjaYQsiCx2X3JN/EsJwVckEqKur4uEplEYXfh6W8lC/Go1iDmjRKFpBEhBTAUtMqLsDM9SCQYhrsitr4EZ3iwhFSkmZPVYR6/qD0TmOrHebQf3dz3bmvjhh1f+5I4ctn/Hyl8I39Zp++HUsW2FZRsrbCtFyrzi2oHb7QWfE/0OzZ/WBWfqn4/87WHuN4+zHQLJ/fmBIiU5esZlohkEWUQULVIqpJW0w4kMfHy8Y4uesDmUOhJDJmhJ3hJ3nWbzN5Zp28OUkTjfOHZ3fPPNe/pjw5cvL7S9ZVwD3zweUUaSkiSFGdsNNM1ALoLBVXxRYy90LpHLgl8dWwzYpkFIxevzDVUEjdbkGNjSSkypYg59qLPTXCgpk8koXetljTFYa/D7oVEgCL6GemOq6/+Q6oE4xMziQyVelIikTlIrFzaSRGYaA42xzNoiQybhMV5jtaJtbQ3zhVohnmItCZKiVuDWbzJhtNpDkgXnGuT+mdO6bkLqFkMRoq90nLbaZ27jQhHgw1uLW9oPqfVnXlmyteFrKjNd3xC2hePhgMi1lOI4tLStAwkxUcOfqdaBl5JohhaBwkdwpsf7jWH4jrhvUZp8QKuOkFMNjZaKkJQy08hCG3M93PqJ59dPSGn2gOvC6+uCVT3XbUMYgf/q+fLlidOx5+6+Z9tGnl5uaJPo3ZHnpy8cD++AlVw8xjaYpmOafmN7/2u//q5QDdue9JWaHBPa1LpCKRV+XuuNe631aELkunbEkHNg3RaMk6AqPmheR47nDjOqPZUGlMDD3SNSGKS0CLHRuYbT4Z5XXmBP4tqm8Pr6wmEY6sMpaWQ5U/ICQmPkgTldORwb2m4g+4SzGSvveHpecH3HOE40rWX1L4zLtoOt437jlby+3NBG8Hqb6aJDCUWMN4xpkRi0jjinmWdN17fEVIh5JWaJ7TMv4ws6BhAH1vXI5jfaxhK9QshIY498ffkbnbMUAjkVpmnCOVt9dr5UW0TU5ChoB8n1FlnniGVlWV9B9DjXs8Vn5i2ANRin8Ivm56/PBD+x+VCraI/fUvKG0mBkX306MXB9vdH1mmW5MU4z3XBhuo68ThPGCKyaCWHkm489ty8ZC/TH96QgIW9cxxdsW7jcP+Cd5/psma6B4K+cDu9I0fNwd89PPz/ht2fmSfBwvkcmj5l7zud7RFxYs2fzI//hf/gTMW74sDHNv7CukdOpYx0lg3NEGxj++EjB0amWplVM0xUrFOfB4hpLKQ2TNfSHI8uYadyJEFaE98zTjdYdeXx8ZJxeUJ1DSsfpdOHjrce5mlw3RoOQeA+decQ6Vz1KKVKy59tv77FNwfuN27jx4cMDMm7EBMOpIWbB5e5Y08sxE9OC7OqEOCMZr5J1Wnj3cOHH208YsSflo0eWiDW/MesOXUeOmaZRbGuuzF0ijS3krFjmQlGRZV748vVnbrbbf9aRznVYU1upwla4zrca1nkWuLaBvOFzxtienDzGFNLm2WJGO0VIV4RUTMtUg2qWinOzLVprtg2ariVlT4wrulG0siKhfAgg6z9LeEVI8KG2QylreYi/47i94334B465YtaapqXvvqV1d/htYVkXnG2x1tbVLrWswIcFRERrS8mCTO1MTynUNSh7ZamQIOpE1PuNGD3adHW9uIut6qGrdgGxry3rbaAifn4NUsm3/vnKz6ywer8L0LpTfFuN1x52gdZm90+yr6wLPngg4tpaO/0mNsW+hq8r173+dKcEUAoxelLesE1f2bD7+l6ISmGQMtP3Lc66t+xVnXzmOjnVRlYaBvLXgow37FHTCrRJtT1pD5q8DaWsSQgq3ifmSh+oXtxqY1I6VxoEchehVahS8p6el6RYLWJQGwAlkqaRGK0Ivr7Xbyz/nArIWiPqfSRlhygZWSpGq2RByhsxreSloXJby69T9ZITxta/m98qWYBS40eiVJPANx8GXq4Lf/7LyI8/Sb750BD/eub1/s8styuPQtN3R7b5Rs4BKzVExd3xzOt046enr6RfnjgfOzp3hjTSNw3D6fjbw1RIYtrIMTPcXVjCTBwTOQSmrz+hXY+QgRQWVKi0hWUa6bsLXTfwZbyiG4sPX2HtOZ0u3LYnli1zuvyebb3ylx9+xqgGtsh1zEy3z9yurxzvH9Epo+KElgpnHfP2jGPFZcj5gHaRNQWsWRiMYJpXbGdoheN0/56Cpml7yAmnBLIk2ubI5iPKGPy2Ya2GnJGyMC0jVhuEqLXoldFakWyVDbwSctyfdQubT2xbYF4ibq1867r1SMRcfc6RRPQ10BWy5Gt4pXGaFFuM8nRdvYZySSht0bJe60pJvI8oLUkp8Fah3FgN1ACutKa2Zen6ua3/n96LNOp1nslM40RKhc37injKqVaIC10PaNlilKNpWqSsuD/kLtaNq4UHJbFFXwkOShHWan+UytUtyhZROqFTRoqAjHVSL0TESUhIrBGkvFC8REmLNbqGWEUtJZCywx2PfDi82+kjdUCRUiD6zLJMuFayTgFpvuHu0rGFV75+HRHygOthXSbWTWAVdEMN0L08L3R9w5bH/xfS8r/t6+/jqULYk3zsJnyJQtC1DdsaeX79zDAYjIXbbaNxR4Q0xLgiRaIxBrAMnWUen5mvY01qZ08KN5ZlYzgqJI8c+keeXv+xwsNzQelEzoXG3hHyV/quQcsjQ1/rxNY1gMx03RkpJa5rCOlGS0SbOtmRueN0fCCnyLrdUKqgbG0Z2kbB0Elimsi5R+sDL+MT2jhi0LTNAcmKlIIYBFbX9p1lmTkeLSlXmHNInpwV4/LEIHv6TpCywMeVsgVK0hitcY0hBvB65Dp+xdmeRc30XY8PgXUOqLZlWQJ9d6i8zPzMusK8TcQ4knJlD9recp1BLgI/fUaKNzBxxF8FoniexDPP11dOlzuG4YhTknm7UcqMoKOUCHIhxZZx+aGicWLLdforKUwkf8Rnie4cxh4Yr898eN9gbQ2wvLv8iVvzQliAkrk7K6xxKK04nToQhdvLStco3l16yqrwKXMaFGnsOR8fmdeZu/MRpGeZA896pv/wQGuPzIeVxnrWreC9w5gDzaNBqpXXp5acjzR2oBkc47zx/vF3aCv4+vkz7+7uWOZXTkODX6j4Iak5nQa6oSboQ0pofaDvOkJaK9Bfd2ThOZ0PGCvZwgrFcrn7nr7vCenG8/OMsy3uEVzuSNmBaIg5MRz3lW+OpKgwAowWrEvGfHvmfGy5u7/n2AucbnidnkgZWnP+vwjVx7sTwWd0X/vCD+09MYxYm+mHDgT4HFAqI+wMBk6nltfrE1FCiYoiF5IIdBcFueHl9oLWHqsa/BwQ+obuJEVm0lZoupYsAnG90rgBs3lM0+OGjFIbtu9IKZLlAqYGExwNfXdH8JnVv6BjRDuJch3zXNFPbTNwXr6jn888+j9xjA/V/lAyWvcc+m8w5lhrFZeVlBKn8xGj9a/iL6a6ObFGod9A5xSElETvyWXFWoNSuq7UZfXCxrghRMGat9X+Lr5i9a5W0VeF5ZsYrRWoHq1qp/abN7UU9irWhbbtqvWJDLIedOPe2FNDVm/T8TrBTMlX3JMbkKLC9d+8q0oJzqczjRv2CW1GSrFPoirMX+sTSqv69faWq8qFLdWfKn/z8pZSMUFa1wOFFBUpJH71p9aJqNKJEAo5u+q13oWqEhlr94h+drz5DwVVVWoNTeNYZgGYOnCImSIkyEzT1BVxyaomvsvezCVlZfqmUkNyu19Z7IJeyCr45ymQkkQbSDnuw16FEAlEJKeKeUt74EvsFgmlN8BQiiTmUC0IRVLYp90y0nYC6zTPTxOno8N1A+7LO0bzVFnT/uvOz97YkmJoDH7xHPoD8+LxIXAdZ/wiMbIQ/UxR5VcEaEzVrrAtCTPOZFWQxrKEV6bbiAsK3SSsru/jy/SVeXlm+0Xwu/cf2EqAUmgOlmP7QJKe1SeOp4Hz3ZmUW24eHh/vuF4/s8kFlSPdecD0GpXrVDcLx+lgIHaUnNnWkaG3bClwOnQs6xfWsdIBjJUIkdie/ow1LX2RjJvHG820zvRJcTidiQlKo9kKCJWxThNjJqeCVAZFfb4ZYJkXSqo4rW3zWGt528ArIWltrbMtSHzwxJCIuX42hdJ4v7fiFUi5YK3EGYUU9aAZY6DrHNbaOlVU1ZoGqTaylYrxosi90rYWoAih9murCm2tHQqH0NQNTAoorejbnhTq/cB7j9IC7zeMMfutRyDZBXCpk2Gpah0wSIQCpUCqAkXtVbeSbQ3kWNDakEIghQAJgl4RVOKHkGm3UFSPuvAZJwx6t++kGMglYlQh+o2YLUopjG5I2ZNUxJgjUQsOl0zMiv6QuUSBVIXt+W/05wvWNgxHS0obwjyTY0B3ApE18/NndDox++u/RFP+d3n9XaFakme8ekKYeLh/V0HCOVTUQkm4xjGcBasfmaZq+B8OHRKLth1BFHIAow29OzFenzifztwfzvz084xRla/mlxHKHdFD8hsivbCtE4djj1GR8fqC0oplCyAEgrqyM1pTyoJPS62sC2VfV0lKNkg9IssJWRrgmWVdabsehePQa3Rp8WFF2YiPNwSBxt5hTcU1hVBYxxnhMmTJ568rOQe+vv5MCYJtm+j7R6ZpJWaBlqfaL14C2qgaKpIr480T8gREXNfhnwXz9Ilvvv+ez68vpOCZxkARhz1ZawhR0ffvmV8D1+dn7u8HjFAU0yEETLdCyhOtXVBGcjgc8OOZyT7R2Hv8dWYYPiI58fzpEx9/d882rwgVWRdFN0iyUBAXslR8c/kABda1cuDmzwVtDDpGnp//hukFSiTiuvDh9I6T0nilOR0Mh67l1DnmbQFjiNHz/R+/5S//eeH9hw9o4XHNhSg0GkUImaEZUCagSoXjH48WbT5waE4cuxOvtx/Z5q+c7u+Zl4DrOg79wDw/06ozMY9QFA8PH3i53ciqPrAeH06oYrDG0A4HFIJ1G2ldh3IHQnkl5A2pW8YwUqIhF8ltS5wbWMON0+mMsQ1rmLlc7ujalk9ffmJdbjS24+HDe56+/MLl7kKWDescuS0zwkTWpX5f2mpEVkgtEMpzvmt5981ASInT/Tu8L7RrwmlH1xxY199uCh++fSCkCdVo5mXDSkfYJNYVmtYgbMe8LQzHjpQr11KbhYM4kmODcY64ebRbOZ4fmKYruiRO7x7JydPqmoTPRWKVojvW1bIQGmTEOcPQv9snDCsl63pYc7Wpa3uZkMoRvCAnjzQRWTxxqyEkZzuM7ljmKx/yP/DH/D9j1+HXFbMU1WvYNo9ofax4oVIDCIeT5e6hCtdaBapJweOspO9OaGUopU5RMpDihnUSZ9pfJ5kIQUmZQsQ6g7VtRUkVELJORmPcage5aviNAQopRnKKONejpN39ovW/1zRyqi1ie8ALsafaRWI4OA7DQN75oVLJfdqT6TuLNbbC7WUVb2mfoPSDxihLDFWk1qlvQUloW71X2e7EAti/zwAi4NxATpV0QKlWg1QSMa4onSnqbdJaV/AhJ7TOOC0ZN00uErX7QKGu/Y0WpKzIZQ9D7V9XSoG1ksZ2+KX+DiFKDYlSxZtzAu8LZWejVhIAaClpG8XmA6mImtDOhUSpq9DG4BrD6y2Rkvz1kFJKrV0VsgYuQzZ7IOdXI0K1cKiEoCWnuvZHCISoDM83f66UHeej5ZdfPvHLLxN/6M80P37L8B//Rt8feL39grWKbapTwFIK4zgipUKrluOhI5cqLg7HA9t45fXrK+/36zbllZx7thT4/PIzDw/fYY65fk9NC1bQ9h1KKJQVxOkLy/bKtllUnmmHDpkNxp7wLEy3VxptsG3H5kf6g+Pb3w94f2W4a6EYenMi+0jTtLjGImlY/Y2QRhKS0917yHC7/cTt5QVrB6blheVmefeuY3n+gnMtT5/+Rtc5lGl5HQPSdsS0UJaRHO/YosU0DZRIjILj8YKQlVXsfaHpDLlEUggEpWr5zG7X6IYebRPa1eeOpCC0wshMEWVvrmMXh2q3vNTAYfIZpUxdz6eI1TUE1TVtbdNSYj+wiBoEk3WgJnJECUFWhpgTjTO8IduUcDWUKnL1SYdUhSF5b/STSKuRReJsA0LQ9zVMWPbJbwrsbXNpvz7B2YYYY7Xj2MpJz9RCBkTZNxaVhKONpBRNFAJpqo0gpcqBRUniVj2ySlTMmzTVp+9sRy1s0EhZ8YE+bMS4QKk5Iorf66gr3UTIQhH1YHc63CGOmrDbGJQZOL87IYlQNkI8cH53oLFn8vpbmcW/9uvvClXnNCGsdYUvaiVkTAs2tyzrzHDs2bxiGiVDd8S6giyJxjbEdMNpS9b1FND1LU2fIeranICiaxytPVLiynX6ESgoocjZ07mezrbc5mdKEXgfCXGs7NGSiNGzLVDKiA8bkhZrNbfbgtSCUjpCumFVwqgTOSWMHkg+4nTLoXMVphs9W0r4beJ8emAaCzJrbssVqS2vLwuLuNG5Filbgg+0Z4uIGnf+PaoMtKfEOFu67o6X8ReW8W+8uz8zT5nX+TMf3v2B55cfOd2fMNZh1JFQRsLNkNfqUVnSSEmBbYlcjo972ELRdpmyappO8vHhglQX/uvnT7Qmcksz7tiRY0vfGN61H7gdNFofuW+PnL/7N/zlv/6Nv/7Tj7S6oe8sqwfZKpbbxONw4mAbmsbx0A9kLYhrh8qF80Hy05eJR2fwncUMDuFXopcMjWNZf6KzLeVec2kcd+2Z11ngS+Y6Lvh5xQqBTguqaRjaM372XKcn+mNL2xt6+Z7rly9s84RuW4a+Z7z+wv3RcTld+Pn2SusMJRuMM0hhcc09rpEsXrItC1sEZTrm5StKtLjG8PXzF46HniQa0JH1FrCd4enliRCf0KphGI7EAm1/YFs3miaQUqDrWlpndx+hRIgOUfS+3lK8f7zncNczvmqmeSSpQIkFdCKXyLZdgRPKZIpJBAxFQxQerQzzNqKEwfYDh/4dRji2bWEV8dfrLrpECjVJ0hxaslcUJnTvmMOMbAqSSNFALvg445fMw/0f+Pzlhev4C0UWchL0KKSTnO8faNozL68vrGFGiIiIDb5kFIHoJxp7wemBGDaU3tPYxVWcTNkqY1FYnB0o2ZLSREyghUPJFm081rbEYIhR8C78kf8x/G+ch+8ow0aMGzmFGnQKDiE6Uqq+Px8C1iU+ni67p+43r2bKlSpgjYG9+7yUarEQlOoNoyWFmhBWAkJMFdCuFEq6feVeBW6MGwWP0RUjhRS1IpbKXc057g+9N7sApN36dP9wxuj2V+8se+Vk00j6oYWkSAGk3kVjqnzG3h7ZVkvK/8w2kDNCJqRKO4auTovf1uHGSJr2gBSuitdSR5ApFoTM9K3GGMsS94f/P8NWIXzNF2RBrh8TakobrJYoISDVlqJKClBAQar681iX+h4LyY56Aoqoq90iKEmiVKm99+h9/Z9QewObVAolJRRJzhFjwDnJ60sg5tqQVFKuXfUl45zcUVZ6F4l1qFsQ5OwxOqOEw6Prur/sxQ0l7+vX2uSTi0CU6qFMspD31aq1mnVyHIeeaZm5Xm+8PnX0f2jqtF1KmrZDA8EvmNZgdWHxE7LUyVnOCd21NEIjbZ0I5vRbUQcioUva35eNtM3MJTBvG6ZpGM73NK7BygafVjpjkXd/wLgD29MPtFlSROLLp1eKywSv6BrBON6QKpCFZ5mfeHl9IRZLP5zQvWRdXurk3V1Y/FyffwnmdWLgnjUmohRkak1wiLWqNpMYlwntetrDQAwz49Wj9AFnBa0TyLBxffonptnSDQ0CT84H0IKSnzHWcr15jLzbS2ckzdDUdrw10nU9TTeQi0RaiySRI0jb0qqItqXi7cSCkTXEpbQgpFx948UTfKLIO5yTGBIlO2IJSFFDeSEWYii130YKYqn3PqMkEovcqUPV15xRpl6XOWxkESrzGY22GlAonX5tjyo5VE90ynVKC9UPv/unpTF7y1ch7aUWIRXiWlFd1TNbSwukkGjz1n5Ym9gEolosLXjvgVo5XXJEKoFSAilkPUAKRc5gtCPGQBaZnEKtHC8B62zdoJSCkRmZNb3JKKWJMlY+s7bViiMSiERIGVEqSixnQds+Yu0D3m/0p8O/WFj+t379XaG6RQ8qczl/g/cRoWvLiJQWKSIiZ5ZXwaF5QHe+IiB8QzFlb3mqHcyQON11LGuL3wTjfKM5DIgCORgEFQTedxXWLagfmOenSHcy+NAzr56UBLokjO54eanQXO8N27pyPg/0g+b5+cq4fEKJIxmNs4GSa8OGlg3PL3+lcz02SOI6Ms6vuPZc8RabIoSZcQwUGRinjDSCNBWe55nff3PPlArLLWIQfPe7P7JNnhSuvL//yG1aOPUfKOHPaGXJqbC+SD78+z8wr0/c3/+eH//8jxzbYw0cXF/57sP3aOuQ+SfeP7xnfB55P9wz3r7yGjL/9o/f0f2x4f94/t+RrsGPr6iyYdvM0Dja7sjty4IV0J4b5p8Tcnnm2//wb7nNI7r8wje/P5LYuFws11fDqTEYN5O2DaMPHOw9VkFpO4TV9K2m5I1pSFzOB9yh5/Y8ceg7zINhWxKbv9HYQmdbdCkIIzhd3rOMr9hhxLHS3h/IeWNQLfP1MyGsxBB4eDxzaDpKKfw8fUUEz8vzFw5//J6wXnl6eUGbDtt0aAlGZkzKKJHwW6LT6nreAAAgAElEQVRo6LqeuEzcrq/c5hfO544cU101NY7WnXYkicC1HSmu9K3l6yuk7GG6Yoxmut0o0WMlLIunGwbmtTIo7x8ekKphS7XariI9JH4MKFMovh7CKAYIFKk59I9sQSFlwLUt3muShC0sRLXhU8baRCorzy9XtC4s65UYfnvgJZnYMoRxRABKBIqceBknKAekEcRiuc2eGBON0xhrWPxKYsGHEedqon5dM037QOMcy3LFyAFZTvRdnS7mEkm51GDAekNpCLHU66JRtE1Tk7My1HVtFhjb1Xy8cRzlQIqSmGfOl1qDnJNkWQP/oP5X/qH8LzRuQKj8qyVovI387adnUi40DkAS44ZrFUNvSVHXcISSO3IpokSmFE0pilLq9COniDaFxjW1zrjs62QEKdZEstYNEs1bzWnOaRe+Gm1cZRTDnnivPEalJU2zs1pL2XFrFenUtS0l76J4R1ClFGnayhddtlxhAOItBBSROu1c1f33UIVozoW2dbQtbLMmZknZDyw5J1yrOBwurKvdWa1QW5oSxgia1pDi/rnZhWi1MwSatuy0BHZvq/iVkqBtDRmFtwdvromqUnIVWRS2rbpbBVW4VvZlQMhIiIWUbJ1uk8lC7G1F1aeY/PwryL+mr9OOsCrEKBHoXfwKlFAgC22rSLEQfLUCpJgRuvqNpYLh0NZCiSwpsv5ZJaffaABGM41VKMi98CHnmixvXfUi5yJRVnO5HJnGiS9fRs4fzxxevuMmfqZpY8WxKUPT1kZAkzXWaMrzStf2FKfJYa1FK0aR/W/XbVwgyxpijH5mip9AK4KPFVfUClYf+HA+EEvg2H9DrwZCvEJ/QjVn1uWJ5/EXXDlAkrzKiVIM1nmWl8C2LDxfXxjniHr5ge+/+Qec8kzPI1jBl6+fUNZyGAYinp8+/5klCL79+C0NhtY4+vtHZNEIZoIwDN1ASZFNBgZnKKXj3bsjX56uuPbE0cB5OFHSwsv1lfF2o++gaTXSe8r6lcjCchtpz3fI6YUsNc8vr3Snj6Q8EuKGRmIbxTWMxDkQ25a8eSSGdVuxGqxqUDIzLS8IqbGd4tNPf+by8Cfc4QSrR6CJZUVskbAVUKDkLvBk3dggFQGF2X3MUhZKAms7lE54NpSx6EKtOxaVVpGCIfrEFhdAsvq5Dimoh0tjajMfuyWy1toWxnECCm3bsfmAc4aSK/MVAWr3poLYQ2ex+mIzey1zDXRpbUip1s1CRmmJzLVhT+uddiGqzzyGhNIrRWRS8Ni+5XYbkcqQqH8fiAjhySnvNeR7Nbep1b2y1HDZuoV6jfuI1aaSKMQ/6/X+V379XaE6TQtdZ3bu3Va9frRINEN/zxqeSXGjaTqWNUE25AzT+sKBc61nbByb9zSt5OlzZDg6BA3eB0QWpCgp0iHQFCIv1+d6QyhpZwRLQo74EOn66lcd5xVrTzw8nvj0t4mmFUhpEKpOgXxQwIIyF+aXlXW58e7hI8v2zDhNxOBxxjGtMxENXnI8HvCrwCrH8WBo+4ZPTytj2ri/PLKEwHpbGS4n/vLDTxglsAWyapjGK5d3HeN05eF4h84fGacr3dDwJ/s/8fTpxrm/Z34OPB7fw9ZzfzhRwpVv3n/H08vE5XjPxw/fwl3CUJBBoUzLx7sHLidNdH9A+0zoPCLWgNbl4Uy4Gi5dousa1jgxOIdg5vblL8xbxuat+pDKymVoKeuNNjou5wvXPEGSDJcz8/WZvHm61jBYwzgFBl1YtoloEiVF4iox3QAyoHLmYhzzbeHFP0OvULOjMwqBZLADqjeEsDJ//YXrMoJ2vLvco4vj+Yf/gmtBxJXGtpQYCH5iGC4o6fj0w194/+GE1LXeMMdE2yiCvzHPMxTodfXYZDUxmI41rpQQeTgciT6ACjvSJzBNN1zj6JyjCBB5I6XEl9efORyOtK4F7/n69RNtd0CKDh8z8/UnYhrRpbBukMtGq5/Y4saxv1CCp0hF3Cy56Mqs9BsSw7JpltWTSiDLOj2KSLLfuF4ntjBy6Hsomcb95lH1G6RYb6DrNlP0iKZjXlachRhqbWFOoHVNQc/Lxji9IoWlbR7wfqGIlXm9gmyxJnKbPtG5O4a+R4hEipFuOKKUYwsbmYBUiuw3ILKtE84qrJN14mnuKSUR0ysFsMrQuoZ1m+mMQcsLPpRaavD8niPfs25ACTuo//B/MvcmP5JlZ5bf705vtsmHmJLMJKuKLaJbLRTUC+30/wvQUi01mmIVi5FDhA82vvGOWtznkbUioIUgGpBIBDIt3Nzc37Pvnu+c36Gra55++e+Mw0LZ1N9CUAKR11ZCkv7dwBlTJMaJ0kgUdVaDVjXN+1xMkFL+0BDiLSyVqQDGqJzCR7L+D1lhk5FN16FVC/HXAc4Hl9XPzZaqrN6eAkBKAW3y92Envq3aYwIhYla80Pm1kwfGuHppY7IsSyTGzYrP+xWtVZYKrRRTFOu6OxsuEgGtRe4yJ7dwCbHGiFJCCA8p4j0gVsYquXxAiYRWYF0ikZXkt3R+SiBUwq9on7XfkxgiMWWVJceQsnKtV79vDFmBi8x4X5JSk4dv8kwuyJXMMWbcn1KSJFbFU4DSkbC+3qzOvnXYC5SSlKXCOss8B0zJekCJpAiFjtR1wfmU1vBb+pVSEANS+7WKVhNSQqSMLopAip6m0jlRnnKbUlU3dJsN1/OJ048b7orfc63+O8t0ZfaKtt6DExx2dwgsxhQM54FdfQcqsviAFSC14Nz/mowulOE0johKUKgCP1tK0dKZlnFeGM9HkgIjZ5aU2FQbgr/g5z4X27gAydBsN4zese1aRnelHwK1zHzwyc/IomRbSZZlYgmBqm0YL2eG6cYYRqR1pCGgdMnx9IWyaLjeyrzluvtI0gUxOpZ+ZLevGG9HjtMZ02lMUdCZmqKRXD5PyGaPKkoac4cpAqlOiNZh6ogQmQE8DWeefr5w//Ed4/ALf/2XKx+/u+d0vDHMnqFv8B5as2cpO0wjubz8xHb/BwiRvn8FCePUs9CgVcH5ckSqgvviE1X1nkTJ+dpTR8O0LKhGkHxCajKft6qYZ0eUmTHNuqJHLkgkWkVkAVpVhJgVTalqZMp2A0Rag5kJkfJB15iCuuoIMdfQCrl6qVHr2j8hpAVysYj3ORyaUsJ6TwwBJUNuOnQur+DzaZKyzKOXtTEjP0mUZfFrGHMNWqYoMzHBBUJYSw3I733TFmidNz/WWuraEOOKzUv5Ghn6fJCSIm9AMvLOUjcVhTIsDkiSbVsjhcIHl/+uQq2+/r+Px9/2qApIUjItM6fzK1VdUciaKQ483v+GwY4IM9PPM8YYhEzMbmZarhxvA23VUDnJNM/4GBF0OOuY+gVpFCEsKBnwgL/22LAQ4oKpNKRE19a8HM+8no9oWdEIWGbJNI3stzumUSP0hPOW0/lGEHkdo+WOeZlpmz06eWqjacsD58sTnz7+wO1yZB4dzaajLDbMY6LQFVIHjKppCwO+5u6hQkpHWCymUaTXQG0k//j9dwjZsGsb7DTQdVuKyvDb331gHH9BUCMDVNLz4fvf8PkvP/Lp/hOX45EPj+9wg6YsInG+o0wQjeL9h+/pCkPUiegEXXPPY1sSrldGFD/sPuLngXlbU8sXJj/QVDuijYiqpqoluxS4bTZMlcGeBrquZLe/Y5heKIzEyB2NurIsM7erpSzLnI6eZ2TUBOs5Ll9pdvdApCsbkipwi6NtFH7IZnCUpy4LimrDvHiSF4TJwuyZpKLstpxOV8bLK6YpidOA0Jq6FDRmIUZDSjPMhv3mgDIN7z/9QDKCyzhg3YmuXIjWMnpDWdcoLThfjygV6Icv6KXg07t/ZBpfMdtd/uBXgfk6UJc1wzJRmkSUghAgWJjiC6IweNfQtSKzLaXEhoAIFh8t1o1gJbJI9F9PNEYQhEOrnND1Ahax0G4esH7BWY/pJPbmGe3Cvm3WdbXi9fLM4m7s7/ZIafARptnh3UjwibKSVKZFR0lhqm/X3TxY2rbGlAqjasbxgo3kQ6KU+LjkAKEukTLfyHyweCdRoqSsBIkzWkuiGJmWGWsz93Qce7TJHe9Gbwg+4txEkhapQKmK7eYOLTXzPKCkRmiPlBq7BEJcKIsSbRQhKFL0xGBxUYKJCAz6+T2bz/+M6B9YlM94O5HVw8vxlT//338GLam7OneLIzOBo0xrEAdIeWALIYCwOQQR1jpTQl65B4+SlhCL1SqQG45CCEiVeaApSt6apQQKHxakXKhbRfQaO+cEu5QyW5QaQ92WeKsyhHz1oMbkKMu0NvOsa3aRm7akSEjl86E7vfE7c/peqpgHQ5+DP2/4KUQEafHRIWxDWqH4OV0fkCpX/05zJIS3Q8ybAhMQOoBQQA2s3lzygJwxUQYfypz5F+t7IxJKQZKOxSkQGinfBvj8ziYiPigSZk3m51rUKIDkSMLjfebY5sMEfCsiEHH18eb2QinJq3EBVamJ0WGdyI1GKft75TpUSxmZl4APAp1yxa2IOfmviqyEk34NxWV9XJBCQOrsMXReroG0t4athJSRuixxIR+IctOVZrfdc7ue+Pr1SH2/4W76LX+6/m8EXbEtPWoxGLOh0DPTMHH/+C5XiTtL136gabccn37kEi6/fmAaS1MEJhuodzui9JnhKwV0VT7cVXC7fkGogpufCUnRmYKYLNE7xn6inydep4nBJyKOp9evdLahabYY2VHWC1VdkeJHxmXCnW8ktfB8tWijkUripUaZwBx77ALp9Rc2heZ8LeinhaJM2DGw60qG8RnTaaaQ6Q+pDIxY7r/7hJsnEJbL8JlO7Si6jt993DNej7hp4DadGMcLetsh2xaVAq/HE822JNrAeXjm62fH4/sPBF748cvEP/3xP0E44u0RM3/l+V+f0dWGdg+vpyub9hPej5T1jBtAiA7FwuX4jNn/hsn2GC3wIeaglSjwFEx4tDLEkBCRvNVVHpFqJD5X7IZIjJLFLpAsUmpIeSiLcVmtAjlcGnyiKCXewxI8Eo1IEuccIUSKoiSs12XXdVnhlJpC5/pkJVdeavI451AqH0allOtwCoiw/k7nIpI3tJ61lvTWpkUmr+QNQbYxZFRWIHiZN12pZOgtQmrS2yEvOHSRTeqFMZlpHFc6CuB95s8KIQjW4hJItSK8lFiZ3X8fj789qJpEEDnhHk2AIuEYsG7gPJX0Y48uPIWCsCZCffT4ZFe48Y7hdiWRGIYFHwdYAv1V0e2zJ8o6zzRlntm0TOwO7XpaWYgxYm0ONXkCw3TCL5LTa8/DQeJmQWFK5nFg07QUaUcSN4If2G9+w759xJuZd48f8dZRSsH7D3t+Dj8y9zO/f/cd0xiotjXDcCWUC846CqOZp8j9tqZsD5xsPvEd3n3E6p7Dp0dejxaVPHUR+XD3gCkb+uUZO4/oFHi/a4k+sfRH7vctFQKzrVimwOFQM7yMaKnQQvD+sMGYhsXOmDJgo0WbRFfVOCK3y41tB8fnM0tpGKaZfjlDYaj1BqkSL7eeh8OWGCwqGdw8E52lO2wYTgtUHaBpmo9IJioVSKVABMPiHL290ZmK4CPBCIbrmW3ziHMjTVniwsgcFsxQEJVFBM/gPLEouTMPeZXUVDxfjnzYK6J1JNfjnKVsa2ShIcI8LIhK0G63bJotNiq+PH9Fx4CRLbfxKylcaEyJC7DME4O9IggEF5EaluDwomLwI/3iCVEjtMPHmVBIZiKDnZntCFIjZYmVE0Zm9mQ/vJCUpu32hH5mmec1YZ3QdUk/3VCpx8SStr5DmJZb/0oIPaoqMs7DJaLuGSZHZfKHrl0WzN2OFBUuLDg3ZkxV+oh3ipCmDBSnRsmI0Qbrcstb/PfXnYiwpl4lFct8oqptDnVojUpbEhkf019vOaRQFwwhUdcViQWlamKUaB2RlMyTJUWNtSPauxzKCoFpmRAyr5WEJKc/ZQdSUUiDc9nrKKRgtKccuhElqjTM04T3LoeAVMLHZ5SuqZ//C/L0niASKc54JEprlsXx5z/9iZ+/fOHx/Tu8z2lYUsT5ERUmQOUmI/Kg4dyC1gkpDCHCGyc1n6I9xuRh1vu0Nk9BCBZTQFEXLJPK4SbyUBVjQBuB0ZrZvgWNsqqaCEgVv6nVb4JCCJGUfF4fpnUYzU9b34/ssww+J97zxuxNIc1JZEGxWkTWn3HKQyz4tTK05K2BKYS4KpsO5+QaEEpreCjzUoUMxLgO4jGvvHMeKgAeqQxClFlhFGL1qEaECiQ8PqhMQFjrdIUAJQRFoQleEqNCKbGGqcivKy6ryiO+IYmEeBuwJVKRyQHKIJVa6Q7551TXCu8c3ufGI7GG13KTV/YOjmMEWeaAS8gebSUiMSw4K0B0fMMNJ0jrEFAYgXcQwqr+xkQUibDC/KWCZUqEmBW4NzpD0zScTxeef2z5of0D2/v/SrU9cKgqtBJM0fOw2zHPCx/vvkeUiv/2p/+L9++/p9nsGPpX3r37FU8V4sJmtyeNN27XC1XVYYpADJIxzRhpEEGjjKHwkf7SI2vD5EacszR1hfcLL5efeRkmbj8vHPYG5x1idLy8fuHu/h236SeU3CL5QFl6DpsKJQXH2zMPhz0vL0eKesvjfYfzPbdhJh7u2O7f8fT6TEyBWhteL2eeL57H/SMKibeepC3TkDiOlqLS3K4nlLBUheHp5QS6QmrNYCfG8YifbtRtw/6HDZfzid//8Hv+WQSOr0e0dAgEjQoQJ5qN5MMh4KfPvP/YMl7+wrhccPGZ/nwEWVFIzy9/+T95eLinKCI//ctf0e0nCqXpn4/sqj21GXHXGRsLTKt4vfY8fvoBUXX5ClkvhTF6CAKRXG73Wn9flQokmbicr3g3UZUN2809plCAR+uVzxwsycW8KU4BTbH+7qzYzFIT0dneIyXUOdkffEQXKpcoqEzoKKtfaSDamFwjLcSK0wrroJzDnCHkzymlZK57JyuiRZHxbYJcJ+td3oJ4N2K0xq91sm8KbUwZDejX1ydTtlKlJFhmlzmxKX+9oiwy61ll8SOEQErL/5tZ8v/Tx98cVKMoSCoR04ipcwOJjxafLC/9j9jFYYKiPhiCSwSfUQxGN9wddsgkiGJhv3/k65cnevsZbXb8y58n/sP/WFGKB2JIGfdTlkgJXb1l6C9Y66nuS4Sz3O/vcdaTgoNQU6s9XdVSlnckWvbtlsq0GF3z/DrRmpb7XcemkszJcOjg6Zcr//D9AyJ1fLiz3PQrdRBoBfuuQtqewblccycFZSO4a1ti3+PqmrKO6FkRk8XOI8F55ksgeYubBJfXr0R3pA0d47ggN4n7/Tu+vr5Q1S2X2ytNUzBbyW2aOd4ubKtEVb/DLoLL5Sub7YZoS15eX6gbwy83j2o39JcRlyR/+fkzxcEgPPhgudx6ZjVRS5jGhaAFiwAtIuiFZfb0r18ZbSK6iIpnVJS0+z3CLvTBcryMvH93z5evf+YP3/3ARu14PZ6QBLxz2DlX/F3lTFUWcH1FKEnXVAzjiJssj/c7BIJrv4BKPJ2fuF1H3n/4DdZmO0ZKAzZmBm4dE8s4cB4m9rsHbtcLi1+I6ogNM0oprtZRdp4FC37ATZ5tveF2W5Da4D0cz6/000KIJaacUSqyRM98fcKOIwjPZnfg1lukCbk/e0wI3XMZAl5aopipSkPwlml2FHVD0WhEiqgiMi4J/EI/X9BllQH4UiCkJoiFJOE2jCgJMikW55nnGV0J6rrGBI2IJYUWjMuZFB3ddptDREbjokdKR9W0v153UpGE5jaeWCZHFImIIjLg5wlBuQZuZkiKZfq1b76uDc4lFiuZZkuKNabIpnwbLKYocF5g/cI4XpjGQNMqqrJguzlwPj+zLFe0zoPqvDjMrBAiYhQUsmAcZ5y3WJ9vet7HnDCNM+bpPZwPCFGsYawchlJa8eXLz/z0049Y53A+YK2nKLMCIMRCwn1bna8hdIJfMEVEovAZj5lX5yEgRaI0FTFlX6xY07chBDQLefmbsS+JDIdnbfQKIeRhCHgLMAlJDvRESa4sXX8eMQeblJTYOX17cW/KXVrrUEUq8/NYV/8xoHREaYN35k30zCplEmitKYrIlJ0sa3GWIKaEEj6vzkNO1Ge2ah4YY1pAOGLUhBiR4g1OJSAFXBgQVhFCm59E/MYsBZ89opSr6vmmMiaEDAgRcC4HvvL7mYf4GBxKBcqiJrl8kBF6ZQWk/HWVStglf19SreqxTOtrtzgXkapesVRyZaDmkFXwnnkiH9pS9seGGJEyIPBYp9d61NWmsKrtAk9dauZFkFa+al6b5gHe6ESSEJLJ4PT1RBhTpKobTH/l9HLj/fsD//TD/0L67samahmmIy4teNtkW9gw413gNvds7UJ/PuNDomt3365bYzrq+h5V7DheXvBxQqWOpqq5+omYRm5Tom5a7jb3TL6nqgXn15+RVPhlod1v6P/txPHpGSsdtXpgu3lP9Lno4y+f/yshOFS0dM2Mq3cYUXG375Bpop8GLpcTxeAptObrz8802zuGW8+p3PLzSy4z2Yc9/e0XplFyv/st0zAiJdzOR4rdjrjMXC4XrtOEVobNd5+Ybq9Mw4WyLBjmhdlFPr7b8KUP/PI0UFQLp8sr+3craaQtaHyCSVJ0msf3H/n+Y+DPn/+FGHcorhwHx+Zuw1Zopt5y2NXE/ZW2CQTnWKYB9IKbR4w489Nf/3fu2g39cSQUBRu5YzqPDK1CtDlkZJIBXTB7j5gdptD4GJmWbPsIMSFVS8BSGkPbVUhVUNUl0zQRhcC6yOIXxtljtEbpRBCBEB3Bj8hUkWS2+wRniTGXI82z++YzhWyFmReLMWFlrEqcDfgQUULgo8/ecCky8jKsFcdSopRGyVxC4Nfygcyynle/ekJJSYxQ1oZKlLwh73I9bcAuK/0ghoy3CuHbNaAUeCfzIF1WOfyVAsZoYvTfmur+Hh5/m6NqHafpRlklXp6vNNWObrfn1ltm90xd10i1ZZxH9rsHTq8LIWS/2MO7O8bpQtI1QflcHyk0RjbsOsX9bsPxeaI0ZU4SBsd+W7PfdPhpZnc4oGtHXTSkmGG03iUuLwvfPbznfrdjnBdiiKiU2NYtTSt4/Qof7z/SdXsKyED42VNi2Dctp9eFu25DoxTLONJsEtb2RMZsqjYlY+8RxcTXlx+RIlBvW+bxRBAZT9MvM+8+PPL68xPTNDDZK7VuUb5AGU2sSlzy3OxIWW/p5xPJWPyiifGGcppZXShCx2UesH7BmIopWgrdMi4FPgVmMdN/udIULdrO9PHMY/mJAseiDEEEilJwfH5Gm4pSlRwvT1h7JEwjh80Dm+aA7GrsMFLfbbgtz5Sy5bJMJOkYwonLEFAIlmgRyjC8Dtx/3HMec82eKkCkAq1zE5Ml0hYavyxM48StyC00zmtUiFyvz8xJ4sQ2J+rblhgVolCcxoEw11Qq8NfjiZfjK0oYhnkhmsyesy77+vx0WVu7aqab5/ZyZNttVoxPZJgENo4IZE7/x4Lj6yveTey2BUpVRC8Zh5HtfZvbeZJHCQOiZJ4X6qZDK4X32RiqosBUJdM8M4eRl6GnEhVNp1F15sRKF9FGY5p3WP9Kf7tQ1xGtIi66tbO6oqok1p7zTaqs8L6CpqPrtvTDgMytF5yOZwS/elSVyiikp/Nnpnnibvcb+nkhMXPrr2zbj7nhyI+UZsPlekGMC3VTc72BkAWRwDQPRC9plcrMVcw3Ba4sSxYbsf6Isoqq7HDLglty6Mk5zRIduvT0Q4bFd6VClYK22nIdR5KAEB3O5lV42/+O+5//V9r5B4q1hWmlOzGOPS9PX7DOoozCuTyo6lURLcuUGcohV4zmxHwezMpKolQO24QYVj9ZoCgCTa0Yx2IN++SbcFpXvnmoWStJE0BmkcZkcV7ya2A7ElOGhkspiCGrpimXgxJDpCgAcjHHtwRxzEN4UUikMFifw0PZv5pVQqk8iUCM+aafWBE35N/h7MGV5OE3BzOkSNlfqzWLU9/W75ByF7n0mFISvMzqiuDXVXjyCBVAmJyAF/kDkzX4pXVCyvw+KykQxuQiUuFATIQ05US/zCGQ/Mip/6YpqYqKyZarmpoDY4KMgoJAikXGd4lswyDloKxSOTSi9LpmDWr1rwoKJQkukOKbQssaPkvZi9eURBQ+CNTq88u+wUBZKratYZ4zt3PVuld/q8cUkJRgsfn7z0p5PsJUheH77+75648nnn7y/KdP/zNL+38wP4w4obiNF34Mgk1j6K/PWB/4/nCPjDM+VRRVxTL+GqYSqoQEi4Vu94jRF0zsiAlMUbB4h3ORTVETjWFz2CC0Y5wjD/d3lDLSzwMyFnxo3tO9qyAagjWkYPjt3YZ//Xzhh49/pBA1iIBXDafXnmgjUhbY2wWJwYgNp9dXGr2lUTtOL0fkJBF4gne099+h7x44iQWhLUIEZIi4ZeIvn090XUFYZmSYiHSUzR1q6ZkvF4bbgAseEQ0+CZbQ472hjorh9IIfClTd0FRQmZrrMNNqgw8Lt+CpqxI3z7Rdy/PxRlt3+ZpymUf8hz/+A3ZRJBlAB/phIMaCT9994nobcPOFZqOxKZczSH+l/zoQTMGmqQizo9zscUKzVRKCoDYdfo5Mw4I2JaVpqauarqqJ4srr6QUXdnjvCWNEywZTFSx9pDItRb2QQk7sn69PRFuzSZr+Bt99+kjwHiUV3dYQfD5ISalIkbU4RAGKGMj2mJTw5O2Z1hLn1ntNZPWoilU9jetmya33J5ktAt+weeRwV8o+detmQhA5JJuy39ashz+5CgfaqNX2lzdEOfEf1m1ODnwJqXD/Lij4//fjbw6qMsHcT2hZ018i0c5sdgIlG/pboK0Nhcm8RK0zv7QsW15ej3z+6d+QpsAvnuX1yuH+AzHsEClw+B80G6M48TO73Q7vcj1oVUj81FNKw8Nui405XOOdo9kqjGg4c2SZBt7vKv6tH7DujLBguMAAACAASURBVFKC8Xpl19Q8bjdMU2BX7pjGiRhujJeZykj605n+cqTr9hy2O34Zr6iyg1SwuIAxNYf9PbfpyuJnbheLEhEKk4Hks+Vwd8dxnLjeBkxbkvRMLRt27YHT8RVVZH+KY+L0/MLD4XfIcuY2zUgh2HaJsnlETiWLrJAGnLSYbUsfQLmJ3fuW4/GCLh1SOLrdlml4YndXUdQd3r/kZDMDWn1kCkAFuIQdLoRl4TIsvH9oqJqKw2HHl58zoF5stwyXK0sYOWx2GD/gdeL94cAw9HgZ6DYNojA5fdl7OqUoQuYHmm5L8AvD3FNacDHydJ74+PG3pBSQMfGw32CLHafpQtNpFjmjU0UMkdPlhCstVWVQWnI+XdhsGhavqYsWt+QqVbTFy4RaJM12T28vRDdShpayavFhwboJ6wa8dagyEUNNCoLKdEglWKzH2ysEi580zlkKrSFWmKJkdFeUanFLInlNoU1eNVpFCp7ZO4bFcf/uI0Lc8MDNDczWIUwguJbT9UJII6ZsKCrF4iyF6rBLVvSULvKBYJpp23vUnP2UQmrmaUGrXMn3ejx/u+5CnBivV3y8MS+BZRlpW8Xl0uPsQqgA6RlnR99fmJcJpRNl3bC4mXEYqasthSkzqNpqnAs05R2LnUlqIIYCt4jVVyg5HWee3Znd7gCxxk4OISJV2yC0YxiunM49qdO8e/jIhoolXHk9f6Gp79jb37D98p9pln+grJrMdJR5oAs+8OPnlzzsdh3TMuOCY7FL7q4OnnKnKE3F5NYaRDJ2RimRPYaOtb0mD4ExRfZ7Q9uEXKUssuqb19KZOiJkVkcTkQyGzyt1oYBYAHr1WqY1vBlWQD8rsimtIR2HFH79sMnPyTaCnDBuGrNWrOY/v4WwBJEQJqKNpNi+6bCZGxsdKc3rB8X6OtZ5Vcg3LI2BpEgpkMjorRg9QvnMnQxZ+YUcSkoxB8LKUqB0uRJa1irR1Vdb1zmtn20IbzgvvRYIKIwpcKHMXjfxZhgGrRVNWwEFIcistoi32spsY8g4Ko3SkrezQSQANoffgvgWFMmIroRWkqbMzMlsx0vffmYpBVycCVHhg8rcWViH+6wQVWX22zmfB+Z8UlkbrVJAGZinsA78kKky+WEMfHrcc+0Xfnl+5e7fNnyIf+B4+m+IfxgolGKaF5bgIViUNMw+URXggsstiN90cpiWkaAUl/5C22xQbYNDgqpomgNFVBQ6Q+yv05VlCDRdQV3vCCmwPbzDvxr+8Tf/gabc0D50HL/+xDLPVNyBWejMf+TDb/+BYD0vzwuxAhElKXgKU3A5OoriwG634cefv1KphtPzxKHb8un9gZeTwJQaJSXt5j0indEicJmv7JRh00ZeT2cCBcFK7rY7QogM3iDqDqmfCGmmahtu55HjLWKnyPZuQ7ITulDMk0cYTyPInNFNDm7dThdU0dFuDvTXI7o40DY6FwYI2G5G5skRo0FoRdO0BCYox8wddpqH7SeWdqJqBNMw43ygrBxtC8oYNrsCvwhCHEn9wiRyeYSPV6QuuU49whY0usUrz7LA5eUXtKxQ7pGgCrbbjqQCRdlQx5zhME3B7ZY9wF274WprxuFEiJqq3qyrekXAo0JEEuinGaOztUUjCGHG+oiIUJQNRkZsmEkUGKmgMDCMKKMJiLx1S5kmUpgiizizz02eWpIELHP26S4uZwUg4n0WsKTKntp1X5PzBiI30WWnkAAZ8mfK2jhaFFUemmPG4P29PP7moNqU91zCRFffUZeRumq4nq9oXfLh40e6smTTSQq542H3iep9wdQH3BiJocc5SdPkG6NKku3mAaUtw+WK8NCWhkJENl1LpXdY2zNPI1iD8CO1UbRKsLgS1zuMieyLlqfLF+K80GhJUVYoWdOfLoznwP2m5efbCSnOLN5jjCM5MGW+KUutOF6eMIVj97jDRYUUhnZ7AGFYArT7DgaNEg4tS8Zpoqo7QuFR+g7Nz5xeTnR1x939hvEaWbxHNYLZW1xaSCLSdAbHDbTIAQx1RZZbTv2VkALtJmKXGakNvZsIzjPdevb7Cm8moh9xwjPMv1Dqgq7cMg5nklZs6wculy/cLj1td88gPaeXz5QioKs7Pjz8jiZtsONM1+woTcnx9MS7dx03/wuVqkBodu17RiVI7kgsFXUqiVLiVENKOdE4Xi3N3qB0wbxolJ9IyWGqHbgLMipkMDjfY4lsuwfwgtlGtrst13OPCBFJ4m67yafJkGiqBo0iqh7roJENzi5Z0ZKAKFimmaAvyGKg1ooYF7ys6KeBQq4+HwV2uuHdSLetabsKYwpOl5l5Wth0W5q65uwW+nlis70DaYheMkw9Igq6tmJZEi5pClkjYm5Uue8a6qbgdO2JoiJi8MJi4sLx6RfmJTd12ckgq5zsPw0ntI4UhaZpOvr15iOD4zZOVMHAasM/ns7Zs1b8GqbqbwPWLlT1Hc6MuDlRbDq0WGjLPdM044cLIUBTPZJGiTF7jNoi5USMM4udc597URBDIPiEaiWVBqlalMxJ1KowaK1xi8AUe1IqII1sNxofA8EXhBjYNB1zLDC6RUnBpqrQPuDbd+zdb3h3/C+k5SNlvaFpmm9Q/MJofvz8Vy7nC1or6rrGrj4s5z3WWgoVaWqNEJrocyCSlPDBUysQMWGXHLSSYl3TIzIeKUAIYjWUrooEeZBJYVUVc7ope8lURr64JSt8rL7WPByvvMWk1ljRGl7CAY4Yi7xSTmJN54MgIGVY9/a/dtDneTqQkgevM1YpV0SBEPm/RbcOsCvEXqwL/AQpOrwXxJArGZN4y0ulNUQhSLHIfxdkz2eMWDsT5bK6WVcVMbEOdkse5kP2rL6pj6woJ1QADKRffxffwksZji6Z55hf4xoAyW9tRKqAVgUJlYdtIbNSmxIx9kxjxIftN79s9ttGtIa2KbjNCR/DqhxnhZsUScKSKHAu5kOEYMVSvdXWRvpxwfrMxI0pPzcfPCJaKewicrq6yAGtjGVbWZMmsttt+fL1ys8/v/D+/iOP8j8zXf+N+PgZHwBd0pqGFAK3eSEp8HHi9TQiDN+aqT4//cxm95FtI5nGG4tLlKUjqoK7wyO3W4Aq8nq9UGpDsIoKyePDPeNyJSJ4//CBQgdsMgS2HO4Ssz+xb+4YpiuqjLxejhw2Ww73JZfpzN32nq6L2MnhVM27/SNSzZggkEHSlZrvdnvqIlcRm6Lm9PLMh3efEEoxv76Q4sxtgnbX8N2HR16ON6KuqHcP2MuF2/SF0+mJvSmJcmYYFXXTcepfeHnpqbsNfX9F7iqSsIRxpC3e4cJIEBnGr0tBaSpUWyNGSMJTtkUOWguDVBnL9HI6c7i/53oaqbYdT+cXhJFMy0AIE939BhscgQpdw+7+gDQlm6IjCI86GManV5gHQnmX54wkoJQUm4rzTy88f/5Xto/v2LYV13FEm9xWN+mC94c/YJlwF8ntdEUgUcUd/XHm0+8+ZquR3VLWBXXX0vcLMQqEEdjgKRKUMjEvkVgEVKmJYyIqjXUDGkmM2VccneW6eA5VgVcCJRIpLYRQZO+4hKouMbrA2pnCVNgloAvD7Kd1zb96+0VAK4mSuQkzRYHQ8u3WSAwh/4MkJb+WAQiCT8h1iAUwJp+Y87//Ph5/c1Ddb+6YhoW2bPnunUKICuRIt90wDD1dV9N1iX3d8endP9G2mr/+9UcedvcIU6GKDXXZoqXjdHyhkJq2rvE3gyKxLxukF9RtrlSTaIQo2O02VG1imANFXXG+jqjSoasNS5hoDweOw4IxiuEWUcpTNYYQDJNP3L3f8nq+Yj1EGShNy5IcgsjoBMLAcehR9Yb++kpd1egihxZutwtlnLN/SdZAiYgeK2DzqDmeBlwC02rGaPHDwHCDx/uGJc7EJFmCo2sL5hSZ0gt2kiTj2Ww2XHtHiM9ZdQ0O7wpwGkJiGkdUgtfjEV2uH/ZigmJgniW1bnDjC1JJegt+lIQKum4Hs2PWR97vP6J8Q7MxnJ8uiBg5PYF1DiEGljGxOeywg8dPN2K5RTkBas/DXY1/ORHrhilETCypa8E4DpjCIEUOchkzYnvBZBxl3aCDwruRZXFEBZfTRBKSQiSEM7jRUihJVdfsugN2DizzktPJzYYpOSq1EEKP0AJFQRQLKY00rWayC0XRYohoreiHMyF6NtuOFB1a1VxOJbO/UFYaWc64oHl8/zten18IwqLKEpckRb2j3W4Zpit11TBPC4vvoSrx3mBUhypqGiMJMuVGGRaapub5fEawAznz8noGJNvNLp/GMSQb0EJh7c8IWeGDYFkc18uNqtpxuz5nn13q6Idfskq/nBDOcF923667GCLzNKHkA1UpmKfAMGqE2uLtnCsi1Q4lQi4NUAtSKNziWfqJuu6w/oiQmqbcU5YGbRK32xXEwmH7wO3WY5Ris92htWYcAko2LLOnMIq20UzLgpARJSRdeWBjFO/ffWCaJpSW4EvehX/m3emPpOsdQXVUZU1VF2hdYLRhmka+fPmKtRYhS5Y1MStUXvPNk6XY5LR28NlHmoRCoUhxQRaWvDKTeYAUWSmL0XHpR4oCQtzkGS8KUgwoEYhhyXimpNeATQaImyKhhMTG7P1MqwKX/ZuRFA1vTTcircMlkRg9wel11Q3roj0PT9EjhF5DVpFvzVIiUbcVzhoW+6ZskNdxWlFVJTEqQkzfsFVphforHdeVnM4rO+Iqbqa1mtFAzDYJyM8LMSBURElDCuuKnbB+b3nA894iRMG3MVXI/H4mi0wWQZcH59V+wcpflTJXRefQ8UpDWC0QKb55W7N9Ia/sJSJlG0PdNmgdGadireRO34JjUiWS8PnekbKN4ZtzIiWaLldQX91qkyDlATZlpTuH53IyO4u0efBOIaKER6DwrsBal7mnSGTKvyfbbbXWxxraruV8vPLjjw1//OMHln/d03d/glLS1hvKpuT0+spuUxPHgcXBxTqKWnLP2/srKXWBcz3IiBQK6x3WjZihoL+NNHVDXWVIfNfdoQiYClSoWeyETROjj8zLzEYP1BomG/HiCRkDt+nGODtkgqaus/8Sz2a/wWz2GROXDNYGPu3vacqWKAtKATqW/Pbjfb736hY3TlnE6wP7+oCoJKlo2JSWp8uNukpM/YjWO7TsSfNI8/B7rsMrw/VCPAhennuUlnz+/CPLHBiugW0rmcaeSh9IYuHWG77/7o5pvBFSoh8uuMUS3IX2bs/LlyuInm2tEUrTdRuW6YQKDaWuaLXhfDqjSpVJO5eFZSGXvxQJ6UrGecCOlll4iqAYzxNG13z/Tz8Q3UJ/GzCyoC0Maj+y3HoOXUQOF0rlqNt7jEoU5czrlz9TVRtUGJmfTuweGtzpwkZs2baRy7lHC8FuuwXhidHzchzZHvYkH5i8INUlWo0Mk+H+fcMvT6/s7joe7rZ4EUhLYI6SwmwpWAjCM4yWjS4gRUSwCBTORJbbJVOJkgEZCMkS5oyBy5XtHlCEIHN1qzRZGJNvB760hrT8NyxeEHnT4q1bvfIlb8prXv9nH//fy+NvDqqbrsTfP1BX8Lv/6bf8y59/4rD/LU1b8yy+IFb/W1XtOL+8UhYdUlm2dyWmEOwPjzx/ORHcjaqwLPOE0XuECFR1NsenmDu+m4cD0wiWwG7fZDN2VfN6uSGNxFQF1huiBFnecRlvyBA4Xs9UbUXXVowpp9g2Tcft5rHjyDBcub874OOCKa7MViPNzBRalumvLMuVwjW8e/+J2VlSEXi6PFO7BhmKTCSQhs0u0ruCyzJwf7/jly8/oarIbbyBeM/z+CNl5dHxnmk8UkbB8Xoi0YMvV4REyzJZmtbgRcHx9UYlO+pWogrP7XalLLa0zQOXYUGWEqECdbvjNEJBZFttiSJwXS6UeovpDMLMNKGmqR6omxrpAs7O6I3gfHvlUFgGCh67LcN8puk+QXih0RKMI82Wsrmj2h24Pr8Q7EhIlqLcYJ3HVIZ+WqgKxeIHSqkpSsVoR6q2xjvHaG8oWRD8wOIWdg+fmOeFKU5oDYWMFMKBFdSqIMkxg43LDcJWNEYyzwvdZo+3a/HCciWaAylJQlxIRqBNg/EelSIiaZxzeGfZ7jZsDMxzAqHopwVpespGcL0MlF4TZa72Ox5PxDTj/Ew/zAiZOF9uhKSRZsSrhcJUKKlZ5p5pieiixuiZxY5UpsEScFGzP3zkbrtjuPTMvSc4Ra1vFDphvcFTE9zMbRnYHgq8tVwugdkNJCL7/YZhHPH+1wpVozd0jcROniQj+80jZdHgpontdkN/nfn48ffYpWcYBrqtJqWFcbCQJCIpSlOTCIzTK0LuKMsqqxqqzElPlyiNpCoqnPUo6Qnxma7bURd7kp+JIqLWCGwKYa39FFifOI2/UF4e2R0/kfqWeS4yAkXlwaIsCpTS/Om/f+b1eMyBgLWQIaWETPnPTjhA41zCLipjV1QOJ6WY/Zg+aHwQJPyqVCZSsoQUsb4kxjVEs66ETREzSD6+9W+zzoiBspBoqYkuS5SZ9ZknufyaDdauS/qYB1FjJKYweCdJMQ+SiUiKGfckSHgnIGV4fSIfNqTyKCUJQmX1L5PIc8rWZN7sNK6DnczqRfaKZe5piDnFnofztGJnPCl5vFPfLAb5K+byhqKUNE2Hn4tvgbQ39bMsNW2jGcbV//k2FZIgZaSXVi1eGHK5qVwpCysnNggEbbYhvA2qKSvYpZEsViLyG7K+3wkpoW0afAjkNp8VL5V8/tms/MpxcmTUVrZ1EBNaJJoq21bsokGFfCBZ7R8kj9KaGPMAqlirU8lDf1kJtIS+z9zh4B1CVt+G3a7NrUUhRXa7PU9fRr4+DXz/g6fc1KinB253PyIoKY3J4RQ34eyM9VB397jw9O26/fjdB9oaXp57uu0GReD4MmC2B079QAgLnWoovGKcZ0K80lYFo/Nc+p5ZW6RMFM2WWjuEt5RFw9bcM9kb8/wKquXx4T0JwdKPzDF3x8+LQGpB3e65nY503R27w4bb5YVpLuge71lipC5blqXk3bvfcTr9iPWRaEqaeo8ynufpRrIN9w/v2ReG87nHbDYwb/iPPzzyfL2BL2lqz2IXHrqayUaezhearsVax/7Dd0i7MF5+oWwfICUkJv+cx1dmF6iTR8lAGGewNwBkted0OdL+P9S9R5Mk6Xql93zSVahUVVndfbsvcIHBYMxIGo1LbvjPuZg1zTi0kcBV3V0qZSiXn+Tii6wmN+BywNhUWVllZqR7eMTx9z3nOd2Ol/0jd1e/43R4RiVNmssGwohrfJAonTj2z5gzvL/b4PYHRgSucty4HU3bkdcVk3f4NNO7F2Q/sr5ao2zg/v2alCaWOKCsx7Hw/Q//SNs4Xr78irYSdMd7Ako4gtA01jHtf8amlmP/wuP4jDKSw35mSpnsb2gqyeEsub3fEMevpLBBxw3WKoSaEMGRmwrhBE/nM9tujRcZNziEUpiVJgPKapy3kDJD/5H98hUh4XAK3L37jnW7kL0hRIsxNSGkiy/dk0n4KKmsIPt8scoUYfqGxXoToUrpYosKkRDD5YY+8lYd/a/l8S8KVeRSkp5VQ91Ct/ZUNhF8z/WV5Pjiy4djq1m843QeiHFES83t9Q37vgfj2D9/RSSLNS22qjkxMfuMqAubsV96jOsYFk8/Lai+YI3eX2/YP75gZalTffiyZ7WKoAVODvTDnmgEojWobsXheKKqE4o1s4yc52dcnNBhRtFhbIXIC6/HR5TsaHeC/eszTey44QoXM9poYk58+XKibko6WcsKJx39KVNXLVF0LD4Q/YmqqqlqweBe8bmisQFVJ4ZlRBKQtNi6JsaIGxessSUBLBLL0pNwbHZbRjcghMbaK5Ts8GFP8B3r9YZxSNSbltP5F37c/T2Tj8QKmtTxODzx/Xe7Aj+2Lc/9K0ZMrKp7fAbR1ARjC6g8LIglMbsznd1i9cIpByYGFB2fPv1CLSNCKLTRPL5+ZRwXfvzwHad5xtSJOcz4UXJzVSOkYYyOnBxMgm51gxsdkUSAMuLIkXW9Yj49IbVknDxVW6NsRRIQVOLcn1HC4eeMbiJKaxqzYZgDzglCnqmtwAcYT8+0rcXNjj7PZQp+OnJ1nbhedUzjzDJqUjpxPL+UvLSC8ziRRaKfnlnmCS3txYPnMaq+1P8JFgT9ecTINe1qzWHf09UdhJm6ukKKgF8mSBUiBA7Pz7jjRPKO2qwgWerqmsn1jIun3raIuNC0kaZV7I8vaFWzXb8n5YybPI2tGYffUCAqbTF2i+VIomK3eoetLUPfs1rfYpiwUqPqmmk+kaIo7Uw2cHW1w7mI84nMQmJgmjJKtrg5E2XCzQtGrelagbys2ZOXCOnQ2lPXq1JlGDXBKapKErxDScs8ncnijA8j64c7xNjikkTKCql1qSRFopXm8eGBn3/+K945lDEs3hU+Zunl/Dbh09qWKYCHEMtEFFSZLADLkvD+skamsEuVgqZe4ZwuiX8JWURiDkgJUhQBky/OxSI6I0omFAaSvPhQC3dVKWiahhAhxlwamnIiRl8Ej7a4uaytEemSdi8101JFwsw336X4ptQCbplYFgmi4i16n3NEikgKmRgFQry9DRfRJlhIOeIv+Bl54TzmHJHKI2XCuVIVW76sBMaEKKJaClXqVt8CFxRrg6lKIj9dAq85v9W1lomoMfLCyi0rx5QyORbhrFSZdscovnmPxUWoQlnZTvNFiF6cGCIJpJJYa5n7mQuvqpALSEgEbVVa3aJ/C5RdOtVJKJlpa0PIhSiDSHBp0RIJtErUVjJPmuIVuny4XlaYTWMQZBYXybmEcYUupQpKBFKKnHsPqqGqJU1Tczz1/PrxwO//pkX81w/o30/wh5HxPGHlGmU8Z46MMVMtA1X7Wx96kjX9fEYZDalj8D1TPNCoCiksohKENLC4QmSJeUCx4FPhjK/tDm0hCoFQgewjS474qFHVCi0ctb3nH/7N/4ZSM6+f/iu//vU/st52HIcDudasVxVXzX1h93qPGhW1CqhGMp/OKJdJaYIYuX93x9ODR2801ArbVOgwImYwZocPCVMFJIKnzy+0v/8dVky8DAO7m47xPHKz6xi+fmS37bh79x05OhAzV1c39McjVbOmXgnmacTKBlWB1AnhBqrGMvsJIWemfsbXK5q6oR+f8Enw3D9yPA784f49VsEUM/MkMFkyzEdcVnQVpMnTrnaM/UicM6mTbG/WfHn9E3/aP3H94QaMZZonDvuBbavZ7lYc+olT6NGbHatuxTA/E2PD7Xc/8fDylf0+8+79d4hjj1pv0G5h7HuU3UCe2b9+ZT5JTuPMj3/3nnn/Faci49IRVp4weg4v/w2Ve9q2QSx7vvz8RPfjH8jnkeeHPXy4pVqvUVVCek/drDjsJwQrznGm0x3b7YbDa+Tl9MDgBe/tGtNETKWxtr5gsBKzu7y3yAVBh5snhNBIIamq35ioSmlCCIQQ8D6BfBOupWVPXm6ov11P/woe/6JQFVpTrxWmspz7iW7dkmLkfOrZXtVgHS/HgSl4pHDUl5KOTCL4zC9fPnK9u2V7fU8MUJkNVXdFNQiSOIGyWKkIShKF4Ty9sr3a0I8j221HPwSktjjvC2qiEryeX5BWMywD/XLkdve3dKuaSKafI8fpQHd1w+vhlRgXmnWNrEHkhtk7jsMj682W5+cDndiRc8Z5x7nfk5Li6+dXttt18XKkkpqtW0lKFYkD82w4HE7c3n7Hw+NEcALSwmb9nnE8Mc1n2mbHODrWqxprTTExZ8H5PFC3Fh8j0+DpNisqUWOrhsfHF6p6A1Iy+xlpBEpWGLPCp0Q/ngnJE0zmdFyI2tLUGTcG+rl8uPul5/l84P6uw2nF6/FAzoF5PNPtNuznA3frDc/TyLpZsbjAkD2HMOOXZ/phYt1Z1qpjCR6MRdUTPkukVYxLj9QG50+cFkW3rVnCgASGIRDNEVRhRT48fsK0Da1ZcZoPKFNzjoIJz7IseJ+Rbc3oJs7eUWnJHDx5OGC1wYqO9e4WU9f88S//Jy6AWyRpSZAajFkRmVF2ja4r9seZkA05SoZxZI6fqapbpChMOp9alKwQSFZNy9TP2HZLpde45ZGqsTgnWJzjPGSUPhNSwnvIbWCZBDm74o/zgU+ffuaH+++Io+B5+UxTG9btdyxhoZ9nZmdwzjPXEyHNuKGn7u4gljTp9W7D+bwQ/B5jBMf99O26M7qlH18wNlJXDZM74HPNenOFDz3tKnM8f2KY90ipWeYGaxpyjszzibbZIYRlnGZWzQ3LkgmhtIxVpiS4/TJR1wqyobEd8xjRSkPW+LAg0SQf6GxN20ie+xekSSRm6s6g93/ALDtSbBF5DULy1gkvgGka+fNf/sT5fIZL5324VF6+jdxSSiQRsbZUaXqfyvo6S3K4TPpEJia+FQEImS8TSUXyGe8KwzOngvtPuUxkY1bFw3kJS6WUCkJMisJlvvTFk4sPVehLeMeLi4i7TDFzwugSRCC/TRLjBWGVqCpFZWuG/oLyv0z7ci5oKikVKWqEVEC8oGigrjVKFlzb23F7A/4bmy/0gfLcYkpICgOxbmRp+5sVWchiTbuIfikzdWXIuTTnFOZoWd0LmdEqMw0zIawoK/oyVckZrJU0dc00Xv6B31iMgkRlFVpZlnzxAudwQUwlciy+8pT02+H+FgyzWmGMIKaLF5h4WftTEv2NKfSDVNhj+Y2VmxNCJ7QxzBM4X3i05FRuSkKiaUthQPEvlyn9t1OQIkJmnCtoN4QsXm3hkVJhLl7lpQchNNpENrsd45evfP1y4Pa2ppYr9NNP5H/3M8dTjwyBn358z1i1DG5gXvZY9f7bdRtCoLUrpNVMc2TODipJ8o6rZsXiA8ZUDMLhvccYRX8eWcIJv1huNj+QGZinmak/YKVkyZl+NKQlY7Wk0pGn1/+CW0YaMaNXBrNak5cJ0UpyBZvuHf3wejQ3bwAAIABJREFUxDgFmu0NH253fH09MefAyjaIeuQ4PnPdbNCNhdwwuQlhNyi1xfkDoxvYzw6jBaKPZNnz8vLE7374wJeH/8DjYcaNHpkdpvakRTGeHe8/1Dx9eWRVXeNS5OHhr3xo/0B//IXpDDfX75DqTKainzy6sSQhqKuOGBxZKHKKxBx5ODxT6xuESixhwNmKOS3UWvP8+Vd+92/+F7ZbweMff0atb9h0libA58ML5+mMmjWiUZzPI0Zq7I3l11++EuMtux86rCxouOPpzP/8t3/H86ePbOcKn9b88usr0yzYtDdUTnI4/JX4JFiE4e7HG3KqufvdPcvzTBNK05+Wnuf9wv13t8R5IBNhPuOGA9P5M1IHpBP44cy4P7O2nm218K5eEVYVU/9KPD2gnCBZRxsym60iuMR3dz9we7tjiCWA66aZpq2Zlp5liZjKIpWiqrcs01iKSEqDCwiBMqa8Bxf2HG8IvZg8dWtxi6euK5TWZDK1bQph5F/J4/9jotpQdaUve5hGpKwZx54lLyyhYZwXttsrjv0eWyd+fXiArOlWa4anJ1xcGKaFtjFkBaOfOT99IUWwlSptN9ETkiAmQULRdRvOrweWKjD7xHa1Yxi/kEdFP44YPTGMcJ57VqsVWtd8/vyZjOM8TGy2Nfv9R6wZ0fWOblWRZGA4L0R/RgrBv/vH/5V//+//d4a+L6xL03A4HtGqwrtE1+1Kj7jOTO6ZnBRN3YBcSL5CSo3Ske3mlmk+IXJJ5e1djzVbmvaWaX4lJoEPkjk5fFhAZqYw4j20mzXLeKJqa4ZlIUnJedpjjEHJjjnIchfZwx/+4Uf+9M+/ktUdD8cDLnniEsm0bDY3hGR5OT6xu1ohK8XZOZb0SDYDWcDsz5cmjcRJCx6+HuE6oHJFtpIQPT6MbHc7FpF5Hk4scUBbiWkNL8cXgggoEi5m2kbghGM8lqaolemou4qkI85FNBrEQiWuMaJmEIIpwDKPNN2KacocXj9h1itCzmQkLgoae0VYevxyIFhJUyWen16RSoB09PMZw5p51uyuDIdhoKIlikgSgsfnA3c3N+QU6OpVEf3zQAyF/xm8Aq3x2TEviSiL8DQmY3TL08OZqlX4JbJd3eKXibbrSDkxDAEhA0ZFlKzYbu+oqjvu3//ItHzB+ZHXYWKc9qAmKtOiZUcKnrortb6r1Y7TeSbEV/pzJkXF/f0Vy7Lnarv7dtnZxrE2kiVk+uUMwmOSpKk3LK4nLRmhDCktBdTPggvPNJ3Eu4UQF0CSo8G7Uq+bomSzaUh5ZJkiIkds3XI+n9CywqcTSrRI3XI47Vm3HVFoxjBxfBk59Se6zmLoEF9/YP3rv0XMWxIdEnNJwf8m8F5ev3LuD3yD6edEimVdLqW8hJvSBY4/0g8T02QRqitYq5iQwgEBH/RlHXUJBuXS9uT9gvclwCPIpFD4pEIEfEzEVF/wTOLiTxVUtuLch8JSFJcQVQIpIvMy4l2FELb8HjEVAagyIYD3BTHz2zQyIZUsns54wSOJN9B/oql1Sc/ngsXim0CTGANC5ILIEpfJZ0kBUToQFDEohCiUAJIok2ShqUyDvnAXZRIgi6iUlLpSd/GKCn5TbsV3bBmGqeCwRPGw5VwmpNaa0mCVC6g/59JklVMiZ19+RDIIociX+tJiKYggAj4YYi7fV148vilnYpyY54T3FxuG+M37Sg6EWK4tH8oHZCE6XCwFIhKjZxgSPpZjLC6HK4dYuM4ZprkYVFPBHJTzIjJNU2DspR5dkFIgxOJMrlUmxEhI5nIDAlXT0rYNp9PAy4vjb/72mj4E/OdrQvuRVZNx8xmVDat2RUqOYeq/XbdKz9h6R+8Csz9CTkhncGT2wiF1R5wlyzBBDMQ4o6TCqg1BjkxLT55ntC4tQuiKEGZGv8fPEF3mJipOT58wGlZNy+E4MLkH6rZiWg6MPZANAo22CqFrjqPjZQg0tSVKSbvdcTzsCceAVZrz0BNypooZ5/YsySOVo60FSSpUjNzdfyAJzcvLCV0ZDvOBRm9ReSHMpRTj6+MXVpvf03XXqJTREkLsmc7PWAlezbw+f6S9qzj3R8ZZIjcNu2ZH22mWcUEjqbKgzhEvNfiJp5eBaUlEAj4ceR4ju90V0/6RTt3g8kw+n/jhb/8dLr3C51/4418+8e72D7y7jfzH/+s/8e7dB3Z3NUYolgBnv+D8gEkgw8zw+szgp2LXkS27qzUbK9mtM+dlplKGx+GRwdSk/QqjPYMTbK9uUP2ec79gbUbZhmF8YEqZYR6o6pove49kZNtVbFYbfvn0EVzDv/n7HW4+8p/+2z/TfPcj17uGHHu0soxu4MPVHVkcOYyPaDvT2RkRI2nJxNgzTGcWC0Z3ICTKKJSyBIpdMmcLojQvogoBxSdRQlYZpLJ067LtRWpCAh8KP3X2M8n//8SjejifaTrFOI9sty2Hw57TNICc2feKpEE2kGeFMB3H41eEFHgB8+S4vbtFCYHUmqfHPd2qZg57pnPiVr5jFiPn8UQmEXtJVDOH/oCwmX55RagdLnjO8wmnGk6nnn/8hx/4+PET2gqqpqOfPjMvjqrNrNaWruvYHz6y6m5Z1e9pNxW/fP2FJZxpbIUWltf9kW5bo0zG2JaqqXl6/pWKmu++/4nF9ZhKM08zbdOiVIc2gWmRtO2alBRuiXSra2KuaOqMjxPj6Ln+sQK5YKwlpbJGiyngY0DLmv6cWa9aKqM4BcdhOGP1Gm3bAuaVgnN/xtQ1+3HPdnfFcXxFqkRla748fEXbwLqu6F2kUQpTd4gKzv0eY+DleKCWpvhRdCHxzM4hZcXz8UzKgaOLpPRKpxpEksw4/LzHCUNMEyl7lv3AdnNb7tBUoKsBkZmdpOoczGsCklkkNpsWXXWcv/yMbQXS1GRZPIAxCaZlYI6OKu+QOtO0hsDMultz6AdOc2DVVPhpoKoCMs28fH3k4eUzP33/PZvuimPvmUeHFiueDzOnY8+qa/ExYBuJiCU5vNvdEmPDnBJdt6I/9tRNQ5ae47gnJ0Gz3ZKThuwZ5oywC2MIJFfRtJqrzT1COoSOnPqJYXrCWqiqLc5P3N3fIzIcl4+lI1pk5viCsI7rqyuCyzh3QuSKzm6omjuQiW6b6E9lHdw0W0gWQcXd7c236y6LkfWmYXmdyQx41zP0Pam7oanv0JS05tXuPSlpUlqo27IVlSqy+CdSNGXiFT0pFWG+214TY8089tSNJpEYxpEYT9S1oltdU1dXDMOEi5ksI8syEZwnXrYeflnYfLqmma7wYkVMHUhxCbUUjNJhv+dweCJmX1rtYr4EmuJv/kJKiv9yw880eZwrXm2RCqPU1mArSwi/ge1JipQCKXuENGSKVUdTpnGCgLWWEDUxFdIHlwkbOZGiJl+QLSXXD8VLWSZ66cJhLSvqMgle3IhWihRbsnwTo/lbQj2GcrN1Mb2SYsYogTFl3ZxTEXcX2yY5hwtEX3MZib6F7xEioE1GZHtppIqIpC6loQGtAqTihy2hpOIRJWe0UWgN03A5xCJdkFoCcCidkUJfsDT5zZ1a/Kmy3ECkS5VrIvHmb9AatFIs828IqNIqBWSPMomYSjuhlG9T6kyKkZDPeKdIeX35/79Nc+SlhnaaI85LhFXkmC4iNtI0BqU1wzQQkoKQkZQWLUnCWIsLgcUlokwXWkI5FkplrDUM53zx2HLBgsULEQBi1sxeltenLASI9WbLNH3h8enE7W2HlFvqvwjUP/yMbtdkFEoLdNTU7Ybn8PzturVCczg/4bwEMePPgpA19XbN6AN+PqPEQvYeJSuyTIz9gjU7mi4XWkPKhNnTdGtOgydNjpgCjb5DrSUpBFbbG2QasbpmpWeCP7MyK4ZRkFg4nb5AbmnXlrAkXHzh8ekLf/Pj36JzSxKeedkzzxGtKqapp15fo6TFVh0hDvgloq3i+mZNJRVjn3HKsyxnlO24v96RTj2N0TwfjyhrycJxOJ6QOfPd+2u03TAcBz4//czd9h3d9YpPn54J8xpRBWQynOeBGGbyynIaPN+9vyU6xw/vfs/D8SO/fHqgNWt2uyt+ffyI1AVjZ6vA7PaoE9i2QYmaiAKz5cN3d3z+/Mw+PFI910Qk1mbyaWJlLV6MPD6OdE1diDhVTVxGTlPPccro7R2pK5/bn8YHYhJ0uuP6px/An/j11z/SbFq0BHbFZz05h1lnfDzy+HVhs/pATDCwcFoy26YiJcHXw4EgNPUu8/XzI8om9m5ChIFxP+NNQueJ4XjCih2SV6ytGcc9ehHInJHileg84zygA5ynF27e3WPbGRkjyQ3s7hQ5Nnx6cqXeXmtSjGQMIRVueM4JFWGZF5qmYZoKpsqYcoMn/vVs/v9lobo/vtCPks1mSz9GpFI0qx3n8zOb3YrPjz8zxTNVvSnm3brFGIE1Hf0p4NyEEIpxKr3V52Fht2tQFEvRMJZuWjKYKrKEmcE9Yap1GZOLQJKlhzykiKkEMVnabk2cy0rQJ8/vfvoD/fBKCD0xNPSnmq7VCOVI4Zq5Dyi7IFSNUIG/fPw/uLp5h5sqIgshBrbrD/jkUXZg6id8PGD1lq67JlNxOL4CmnFIWCOJlEmlrcoFOpwDtzd3CDz9+YRUFVXdcDi+sFobmuYKP0tUs7Bqd+wPX9lu73l9+YRsVyi9wgXJEB2LO7Gub1A6EcUrf/rLL8jU8uH+msSMjzNZaKI4sjiLD2W6c+5PVI1hmRe67RYEuHGgajuWcWYxCYHF2pbWrhnGM/O8EGOHl4JKU4IzKWPUimh8qV/TlqZrGM+vtKsdx+MrPmd29TtO04iTPRFF7Wt8iJzGM6pSnEPi7BzjdGLxM9M4o+URqxNXV98xxJn16oZTD029YKuaaSqJ0a19h9EbNquAyDuOpxFBQ0qRw2ni9Thy/25DSuBmwdX1DWP/yMvrI//4d/8Tf/znT9hqQ7OyJBzWDKy2ln0/oc2Km907jG7oxyPSOrLItE3Hh/ff4/1EVVu0aTicPpPyiaurDedTz/H8wm67pWkkwc3s989U9RWoBEoTs2P0Pcs8o8SMJBGzvkyO9iA9ddUhs8KaC1NSJZr1b8w6v0zF9xsCq7rmOPWEHoTVaJvQ6DK5XulCMwiwTBMxGKraINXM+ThdVt+S4+mAtZaYPKSWupoRasJ56LqGoT+zWb9DyppT/4IyEJND2wZrWkTSSGlo2g318Zor/TuMviHlFqkMKRdovxIRN8+cT4/4MLEsjhAKyPrNDwnfdCo5RbRR2KrCOYGPiRw8WmeiLzgtpXUReonSkncJOLVthVb2Mq29IFdSQkpPScBefJuUCUKmwO6dn5nn8taXcyx4qlwakKQ0F6H25r98mzoGYlRlLUl57inFMl3XiuDyJbkPb+gmIRIphmId+ZZ6usSeVCTlwOIFpTmryOUQA0pmmsqU6tSUL6liSEmilUOZQMrmwjItTyZdaACVkVRGcno71pf1f8qZzKXmEUX8VoAgL6K8NDzF+EYuuFgcUsn1r1YNTS0ZxzfP7//Dn5oTWotiYbh8XTlH5fsaW9b24WLlyOkiJgGjFFWlGYZESBl16R2/xNHoGotRGufe2KniciwztYKmKvXPPgmkLq+DjISUMUYgCMxLmUjLi6QvQTeHNbZ4rpdA6bRSKCNZrdYc9gcOh55Pn1+5f1/DuFBLePzyheV6C0YRUgHst/a3RjktGvrTK2234nxeEMqidcXiC0szi5kcC3kkkHG+x5gOXSWyksSY6WrN/jySvMJnx8pu2NTXiKQQRtFPJ5IIaGN4eDxS14a2MoQ4YxqDUJCCxg2C+mbD8/6JttHcXXfUVpLTyMtLz/b6nr6PVFaRF8V4euGoGnxY4WKPNRv6cWC9E5yWkb5faFYNspMop+mqW6oPDR9/+TNBWu7v74mfvuCXF07zRLtt8OOMUB2H8Vc8ivvujtlq+tPI797d0C89IghEShxPZ7wwHNyRSm74/f33PPQPyK7iHBIfbm5Z+YHvf/ieLw+vLEsm6Uy3SriDwLbwPD7j08BxmdC1Ji8ZpwPvPrzj5nrL9LjHuUCqDSGXYoZx2ENdAQs/3H/PcDjz/PQr43nmh9/9QNYQbaYPe5IMOLewXilUDSZ7RndCJ4/UiSVmTCvRsqXqWvARwsJdLanliml5wXZrtG3Yvpcc/jLRNSvuftoQ3MTTcOI4Rm531xyezjzt/8T2WqDkmnF+QaYtd7cVSgaUWBE5Ec4TRjScHz9ir7bkuMcPC+x2kD1+1kTn0cIzT4UcYmWZvkZVAskiR/w00bQNUx6ZljNtfVWCtP9KHv+yR1UGcrbM7szxPLFZ3VLZllE2+BAJDrpmXVZuBLrOXgz3ntXWMI4L6cLi7LqO/hyo7Afmsec0DSjRUjWaZRmwRrBd39D3R5qVIiWLDz2mETR1S8wj2+2O1/1A2+2IWK5v3vFP//TPiBuBFImuWTNNkq7Z0TYtPmReXv9I1xoQ10zTidXdLV2zxjuHoGMaHEJPbNfvOZ6OnMcHknuHsZkYJMPgWG9alNiitCOSUcYzTY7NekMSC48PR2rT0TUN3jmGcUTomVX9nhify/dYL4RUgUy87F/Z7bbkXKErQRALN5s7/vrLZ6TMbLaGxq7IcSKFE1a1zIticZ7tqmIOI5MrVW3jkGjbM1beMPBEyprFnTkvnkxFIyuGYY9SFivLdHgJr0g1oa3FhwmBwOqWplpzODwAmVN/pu069i8Dv/vd3xBj4jwcEcoVH+NoeHYPGFOhjODnT7+wXvVUdeDjl0fe3W9w/UhlA6iB18OR6BRT/8xqDdMEyiT6cyyd43NENgplLWOvcD5wdWHbhiguWYmGthGoFbglEHIghoWqadh0tzy/fAIx4cLM9uqasCROpxeWsMd7xfF1oWuvUboh+alM/JYT285wGkrC+P3VludnQRaRl/ML47xntzVYc0/XeIb5meura2q15hROBJ+xVlDXDUTJaXghp4GcNEZD9g6J43R+ZQkHtBZs23uUkOA9QkdSmvj6+Ff+x8t1V8sa70Z0Ahkqbtb33DQRqey3NaYQEP1ESCNLmMippTYtizsgpSkCJzuMtixLpLKW2hriTCEnmBUxVUQ5YtB0Tcu+f6EfT6y7LUIFpPJUesMQAkIbqvGOu+f/gXr5nqjWWF0hssB7X6ZcUnN4faRpFlwsNhDyhQF6UamZsvIuYzVJbRVdIxnOCh8iiEQIxT6gjSLEEqQiS2Iq0zEtJcYUvFWO5Viky6S2TM4EMZSZ6duKHjJKxosvS8NFjBYRVyaKKYkLlP4ilVIi4y4YKlOW67mEgEggbQmDzXMu03lZRFS6IK0kihgzkfT/8k9aKzFWMgyldUZxEZMp0dQVTSWZZk8CVIacIyEEtCx+0WkOxFQVi8A3lFNCqQhZlqpZSitN4YpGjJIXXFL6FoSCYr+wSlBXAhfFN0RUzvkidCPIhHeFEalUaQGT8oKxSREBeH9hq17YtOU4RaraErz4Fu5Kl1aunIvPWCnBNAcy6lIdW+wdRkm62uIXz+ISyNIqld7arGpN0xqmV0GIGZvib+c7QV0bKmuYnS/T6pQuUlUhhaC2kmVaSMlgTGFNSpGRxlDVLe504LDvub4u59WcbgjigYeXEV3VSAl+Kvawt4dtV1RDjcmZWq3Z3l8zjTPIgimLqWKeI5BYNxXHw4KWmvW2Yn/oGccj0dWgLCnN3N/d4KaF6AzaBqblXLz+xwPeBZ6fjtzf3nI+RYQ4Izq43q2IPuKd4/XFkaJj9oJtd8Pj0wM+ztTNBqVv2W4F7vkFbTKbxjC7E/O0MM1HVusV4zRzeDW4JbDbXZFSpu9nQoz49IXtrnDI1zc3tOsbrraBLAaiLpSYuR8wraDbtoTJ8/w6omxNOAO2bCuaZkUrFZVVCG2QKjLFhf/wT/+JdVVTtRlpNsim44ff/4GcFk7jK2FI3P5whwuCx/2BtN9TtUesdpxHx3E+U7Mwmg0GeHk+QVyIKRK8IhB4/HRkfVUxHzzbH2+KtUW1WH1i1pFpcPz00/f858//hYgj5YFxSHTrNUoKpjjRqpooBblKeB3p7q9YqYboO8QSqa0lnhdeXx/pWfjD9oqPL5+R/Rq7gyEPnE+viLnCVwJtOx6GEWmhqeA49MynCWlc0b3KoGNNbSf6aWS3W7FZt3z+9JXpLGjrmTxE1jfXxHikkxtEmlhLCclR6RYXJ7rqlqwjuIzezgynzIerHa+nyPOxZ//q6brf7Gj/vR//ItHV+TNdu+V0mPAucT56/FI+kIIrzEmjK8axR1dL8YNGy+ImtjvN1e57Nqt7fvj+D+TYXjq2Bbbq2Kyv2WzX1E3DEkb6fqSuWqRSTPORlCRKVng/0nYtWlmkEggp+PT5V+ZpwmiDNRV//vN/xWjNu7ufCPGM0AeW2TFNjpxhu75Dy7bcac6KYRjohyOzG6mrLTEIfDxBjiRvMGqNlTcIUXHYOyprsLo0XkVesZVGSYMUNf0w067aUiRw2HMejlhrSUlz7s9st2sgsviReRnYbGt8mHB+5Hx6pK40kz8Qc6KqMkoIlGqRdU1IY5kixAay4PA6oeWO5GpENihWaGPQtSRkaNfrC/MwotTE4fzCkvcsaWByC7PrOfc9ZI2LLyA0TfUD0zKXFGoMDMOBqT9TVwGE5DyceX3t6YcBVQUeXz6jTIM0kvP8gs8DRm/57sP3QCCJER9mToeEj5FhOnMeetabNfcffmC1usIYi6lzwcOoSLcymMrw9eFXtBa8u/sd0U8s/oTWGlMpcjbYquX69op23WIaAcpTdYZ2bVjiSNttkBJeT59KO1JrqZvMzdU1LlQsyWLUhuvuDj+feXp9olIGMRu6qubmXcfnh18QLMxjT1h6wuwgSdwMq9UV7+4+oGSLEIq63dF2d2ThSalMpVYri5sniILaNuU1lQe8PyCyQomaxZ0QIuHdRJhn3Gkkjr+FqWqrqKWlsgolA6t2TdM0dOuGtmuwjUVoSoNJyhjTYK3B+ZlpiLjZYFSDkpn3d3fc397T2TWd3iBTYjwGVNiSwwUQD+V1QWS33RWRlg0py1JhqxXX4UeuP/0j4rBDyjVV1WGtRmmN1orKWqahZ5yfUNWMW1JBNl1CVm9J7N/+WkTd7dZw3SaSXwghEVMqFYMpoFXh/70JVyiTTGkSkRnnl4sQvTS850xlTUn8R3FBK70J1YitLFo3l9W/IAt5qSyMRXgFLpzBIvRKXWvgrSr0NywSSArRwrkJH4rl4dtX5oQk4UPEh+JpDTGW55kKx7UyK0S2hUZw8a1KqahqgzYG78vbsxCKlCAEd1nPW9zC5XcW354SlJCR95fa2ItoK9NEqK0mBYFz+du5eJtyiwv+yoeCd3rzGYMgBc/kemZXQm7kSIxvq/9EFvPFMlCeZzkP6bKCjyhZaAhv56j87PJ9hPD44IipNF2JC68254RRmq6rmWZ/IT4UkRtD8a3aSqGNYp4iKaTLpFYWy0GOZJEYp4hbClUhpeKLlQKs0WgjmBdPmSoD4o3NKqhbzc3dFikrFqcx7Jj/6R6vLVlr1k1NExViONMf99+u2+nc01aWQz/S7d5hbYXPjpAdx6PjfAJbaZI4syw9wSWqVqPEmml0LMtMToa2brHGME2OJQt6f+TYL+yPex4fHxn7mfO+Z9uusLkwsqepx82ecEw8fX1hWSb6sS92h1BeP/vXBx4fvnI+Hfj1l18xqsbPjtktvNveEcKAast5PZ5eqeuaVXuNVQ3Xm+8gKbSusbUgCsH+NNBdXyGMYt87Nh/WiGrN3c1P9GOPaBTOncnqnu8//C0hg5ALtRa89gP1qkbbyLAcWW2uqcyKbXfFqrW89B+JSvP+6h3vb76nWTWkLPjrr88om6mrSJosv/z8GRcdMZw4Hp7Q0hAnhxISLSfGEwznPR8//hGlNFkJ5tBz6F9x0YFUrNZXPHx94c9/+iv754H+HPBL4uvXV/avB4bhyNPDwGb9Hh8znx+eedg/MTjH8/GZXz8/MKuKJBRtt+bse0gzV6sWozNz9kQ5c/t9h9EDiDPLuCCrBhXH0iDVZt6//8D2SqDbiva6pl63SKlpN4am7dhuLYfXgcfXPed5wVSl+fPPv3wkm0RHZlfX+DzT7w+o6FiOX1B5RkbP7UbR1gPNeub5638hPP2F89d/QrgXxsNnTs+fmPdPmMWztjMy/mZr+e/9+BcnqsYoFn/k6uqG83kk58TiJvrzxI+/e09VG/rhEaUzm3WNEhum8YHVxuKmDdZI3r17j5sz5LHUDKaZdrWh70vdqHe6wI+7a/rzglEt5+EJ7KY061SZGMsMoB+eqasdts4k0fPrr3+laSwxWqZp4svXz1hTY41i/9Lz4Yd7Uiwf2tutZJom2uqG18NXYpb0/QPv7n6gyhuGfqDve97f/B2VWZGYMNYy9M/88stXNtuqJORsQInS/jCOPTkmrq5uOJ1GlsGz3das1y3TU88SviB0h5SWEKDuLPOoqaua18MLWlTMfaDbSB4e/gjSE4D9PjP7j4RZIH3HOBxIBJr6jtVqzThkpJixdo1QFcvyzDh+pGt3KNGwqgMqedL8yJQXmm7LPA+cpoRbAklK6lZzfB6p60BKA6/PHqMsXXfHl88feddojocHVquO4/FEt7as1lckFpQFrQ1X9idCDCyT4vrmCiUrhvlX3r27Y5kUu+sV/XnCqoabm2uksOy2FU9PT+y297jJY42ksXfo6wpwdPWWlEdqXRMXR2XWSA3zdKKqUhGBSNbtLW2dIdfYSnN8fUDLTFM1RDcy+Iy1HbVRyLRiwWDrwHieMasEPuLcQHW9hrmjFnA8nkpzy8rStIphdCghGPsZaysW/4gyGZk7zv4rSq6o6y3WZPaHhyK622ty1ZBixsotsp0IcWCzqyFbtGroz8/MM9TVFVontNIo9dsKcXTPuClgqhVCCfqpJ/lIZSfu4ZUMAAAgAElEQVSmpUw5Za0RwtBWG2ytOZ4/E0OmrXaEOFLblt3qlrruCvczCNwyl9aSRoKZqaVkGTJ13XIa9mw3t2w3Hc+vX1kWSVvfMM8O+XrF5uXv0cOOytzS1FdkVbx9Ho9VFefDiWV6wVYzs584HsNlHf62yr083rCmuUi7qpa44OiHqRQuGEHwCqkhp0BM4jIhjAXUnhMhzziXCMGWtbeEt6S9UKVCMITCB+RNFJOQSlwS8YksxDfRqZRASlnCdpfEf8pF8NRWopRmmotYEhehlfICwl98j5ffiXxpwgJtKCHAC4orxfjN7iAo/OgU0zdhJ7IsSf/sCUEBBil1EVCFiYUQgZgCIZbpo0jxAuwvzVBCwDzLUkWq3ny2oETxzMYoyOhvS/A3Ly5EYox49/b750uwCYwxNNUbXcFcfMDx0ieeMDqSsyamt0NdxHNKCYEH3tBi4mI3ePuzILFKfaz5FswqlgVQIiFkCW+mck9Djm8sWYcQLSHCMIXi046xHC9y8QCT2B8jOXflFOTy3FKKKAuVNUxDqTPVlxCcQBBi4Ob6mvfvb5nHgNYgtUfKjNI/sWoq3LinkSV4M/a/YeWev3yCtmMOFcOyEJTkeHym7Sz7/cI0SP7uH35C0HI+O1KCJQbieQSRubr+nuubWz5/+TMZyfPrmffvv6duZg6vJ6xumceRTXuFzhMiR6rKUq00ftRU7Y6nL3/m0/GR+6u/4X7XEkLCh8yynFAoDA3LuBBZ+PMv/xljGlRqOU0D5/7AZvcdu+vvOA/PNI39v6l7k13JsjVb65vVqpdVu3L3iDhl5kndJEnRRAho8aI0adCBHkI8AEKQVyQJN2+eIiI8fG/fhZWrnhWNae5xWkeiuLpgHZfLfRdWLLMx/3+Mb3A5n3h7e0YpiMIiokIqifMQmVBeIiWchx9xNlFohD4R5Uhd3zAvJ7pRU93ckrsThTFIZbjMPYsbqLOSECKnYU+IHiFXhJizXt1gcsPcGbybwAp0Hshzg3IrvOp4fXvj7E6URYOaBVmtsMtEmynyzBBPgqptyUrFpJOn+PDyisw0RmSQzwz9md16C1qiVKDvelqVXudVpfjjv/wjTVHzcHOH9z3TZQSdbDYiKIKd0HjcPCEGgcs6zuczUgem0dG2OdpoykrTVDmXtyN321v8VPDw8MAf/+mHRGWJCxvlUUpy96Hgh3974nZXs76tcFYzTSdqnXE59GhZA2fauuWP/+aR9nZL06y5zTO6uWeOimkaEDQEe2ZaMtQ8c9fccD69sV7fMqiRuqxx9kRccpap4/e//wGtZtbNihgEH9/++H9FS/47vf1FoVo3OXaK1Os1fTdwf79mmjzr9RaTR972HevNjmkCv+QM04S1C+NkyeSaGCeQ8ONPj4TgaVYlUqf12/lypAhg5APBS6YxEqPBu4jRBcti6ZaZ24ec19cRU8xoDctiKOsVzo24MWMc39hut8y253X/I/e333B/+xv2xREjM0QWuBxHdBZpmpa6Lrj0BuE0RimmMYHni6Kh2G5YJsWqKfER+r5H64nDPqRTDwsqNrw872nqFcEbNBXDJSXkHm6+S7+Lm9ltFH1/wrqeGEqc79A6Z+gCq22BixmH8zNGwHkvadsNpjT0w4kwK2TokLLFY1nciWmy3G6/Sb7bOOLdGRMFh71n8i8QJfNQ4paZqtQ8Pw/MJ8nmdkUEhnOHxnL7sKMbLS+PM2MXqb7JiEHSXQY+vEsTp6ba42aDwvOL735NfwEXFozSbLee/nKhLFcIv+b+dsf++Jnz+Y2yysjjmrap6bqem5sdMbzQVvc4/8LsZ3K1pl0ZYrT03czizwhKou64u2s57S1KWYSY8LPDmFu8G2nzku2u4nC4YK1kt7tBhsR3LMua8TyhRM8yDQRXo7MLTk7gAxrIEax0TbUqIMyURQFdR9cvrMscpoHl0NHcZvTTC7PrCC6yWa0Y5w5tLArBYh2TfcWHmcoUFKZECY+whjyL4BXb5pfIbOZ83oNYmCZHloPJFrxXVMU61V1az+wnMJoo1c8XntRMfsHPHqEjIc4Y3TC7gSgD/TRTNRukjyx2INNrSr1CZj1KTFixUBUNSuZcLgNVYzh2Hct4oirXvPv2jnEeWOYFZWqQLUWZ0E1FVrNbveNw7lmmGX0ouHv+VxTLPYIWY9YIZZBSIYJHZop+6Dgdn8izCVOkGlN75fIlhfFnQpWfp59SSgYb+WnvOA1J8PkQ8D5QFhl1VXLpPdZ5lJDXKWFihWqjsJNJgvdrbWZIqKMo8Ck7hZDJLpBrjZKRaXbX/5vCVIFIrmTKyEfBF7JAEtJQ5CaByZ1MgkmlSWvyfHqI6mdfa0yiXMrUIx8iV05qSsh75xB4tNFYNzHbiBD51/sVg2exA92g8L688gwBJEqC0smvau01KBauHtoQETqJvHkhre8hIZmCR8QZ5yLO5aTWca6CNInLujKUVc65TwL1i9fWx+THr8uG02wJMQEGRBDX1iyX6mgXCC7xMb+aCqInMDNMntlqhIiIK2PsCzVBaYF3GmtdmrpyfcxC8vAO40A/hSt/lTQpJT3PPk6cu55hCviYnpPrTJYYHXmucE4QpUoYsBjw9lppG8Ha5F8VQn4tYhBSorTnw4fv2Kw3+LXFu8BiA1Vzz93mN1zqz/zX/91/yX/wtxXv7wVy+Pm1XW1WLEJw1zR0xz0q1uS6YRkFGihLixTQ96CEwDMwdIJMjuAUStYstmPoj2jVkueGsTtRVTlV0SOEIMslZZNhSs/QX5hchx0ddb5G+gu9e6SoFc2N5u31RzK9RRkFQpOXqV66G3qC73EjiFaiPXz8vEeLDBEEU5jxbqY/d4yjpcgNw7jHZAUBz+n0hlQqidlixWr9Dfe7lvN5T1Qzw9CRlwU2BLKqZG0Ep8OeQloK2eJUzU0huRwuzPOFvk+pyru7hmBHnFVkVcbsBJnKeDk8oqpbltMrufQMF0dT50gjqfQdPiTWsjY5SpW06xWxNRzGz0QWJBm5afBBc+4uNM0dWZ4KJIpccj7uaRpFbgRzHNEKqnVBUZSMoaQsSzZNzdPLG4VW7O626bUVFHc3dwyxw0dFoQ3zfGQZHPK+ws+PdJ3FiIr1/QPd5QKypdINb/PIZf+WCk5IZRQfHx/ZVQXLy57FOsZgqTcFdoqU+ZZKBcyb4O7hlsfPv+fy/RNPrzPVbsV+PxOyE3/6/Am9uaWbX3l8E7x7vyMzkdJIXp//yDJZTnNkffctUcw0s0eqlvrmzE9/GNFEpvnAj08XZvn/nYnqX1z9a6mosjvOxyG1OMwLfTejlGCaey79C1mmmafA0DuGYUCpnHGwCNVh7YmPH79HSIdUUJaaeXQc9x1FtibYjKlzLLPl6ekjIgqc1YhYUlU5QjlOx1TN2TQtRbEmxpqhK7A2J4rUKjQvkVXzQFOnFiPrHCZP04o8q3h5+8g0p1XG6TilFg6l+N1f/T1aV1y6MybX5HmByS0uDByOL0zTCaMku80GnKEqWgx3ZLqhO5/ZrFqICucW8sIRmXh7PYBPgGMpSoKHrn/hct5zPD6jshRgcouhKtZsb2q63mLngko3GFfi5gE7d8zziWkcMEaRmYL924muP+Fih9KGU/cjjhfKYk1/KnBuIctSYKJttry7/TXr+h06rpC2pCkqmtKxaSTDoSMrMqyXGN1w/3DD7c0WQaCpDQrYrFdMo2OeR6blBWtfyVXJzfqeeeyoigW8paoiTV3j/AWi5XQ8U1crhn7A+5GwBDQN3ipO5xfadck0TjgXKHKNdW8s44AdZ6LztOUNZaaQQiFEQkKFRdIU77m/eY9SkkybNPGfZ45vI9+++1e8v/8dkoo8r1BULHZE5wUqA8FCFgWKwDDNeFnQmFvCLDkPB6zQ3L+/Q0uBHTv2b49E39NUFVVW45YRFTXClxgDUkrKXJEJRa4FqypNMJuiwNozRpE+qIeOeXQQMrxVHPY9UJJlJYu9MNuJKHPCn50ZZWwoy3dUecOqXnGzvmfdbFh6wbq6Y1Ovmc4TYZkpTQbWkUtDW9Rsm5ZNvcbIiO3PFEJTyjW5qpjn1Kx16XsmawnSEyIcjgestVg3YxfLPFoIAfFiWH/8FepS4V2J1juUNkBMqVAliC5y/PwTUh7JioSyU+wQoULKNCX8AoDnOrUSV1GYGcgKjf+ScL+KGLd4jEqiyC4R7/11cpmCPnmmEFHiXPp7JFkGkg8ViJIQ5J+FtgRFnmG0xDn/ldkprnzVFAASWJtWxsA1SBTItEKQvLKJ4hHwMfXFK5mml/4rZ/4q0sIV9D/66zo6fW36Wf5aJqCI8Sq+v9IHUvtOIgrohJBKo8DknyRi5yvKLwZiENcmGYuSHqM1Merk1/0SSQoRKRKa64ug488m3FoKmipHq4IY9XXILNLUNwbm+UTXvbHYa5VsdGkaTUBGj5bpA1tIfW3Jutacii+d4Ve+6rV84EufuNaKqsoQmIQpE18qYxPFIMsi8zJyuoxEErf1C6BVCkWeZ1jr6MaFKMAFh/MO7yNSSLQyCFEk4LlM0PP0WAqKvESpnHlJ7VxfeLoA6/Wam90dxMReRUq0kagpQ/9zzR9+/z3/zX/7P/CP//SMzyuy3errY3maPVlRU2jDulqTiYzt7TcotaKq13x4/47ueMCNHZnwVNqQG4XykTbPmPuOsesQzqFD5OFmxzC8Mg9HjIwsQ8/D3Zqm8IznV5rcIESG856JEedHbu+/4bfffoMuZgIKx4yQAq3ktQceEos2cZkLHMN4IVMRawXKNAjRM3QdEk1WZShT4aNhvfqOssoxxjFcjvhB0V9GurdD4oPO0HWScYJxGjGZhYNnZ7ZoERlPjmWxBG1ZZqjKB0IoiHEkUxmrvCWOjkJoYrjw9vyZQilwUFUFyzySl4Yiy8lUzXZV8ze//B3rvOTb9ze09Zqb3TuEUnR94Je//ZauPxIdeBfQuUEZSfALVVbzzcMvKM0GwcLr60/4xbNerdhuGmK0XM4nlpAhdc5PTz+yajfc391AnMhVye1uTTSecbGEYQY30uaGm1bimQgUjNbSDz06LxEhUNy19PMzp/kJ68+MLl2OMgq0KumHEy+f3rDzkePpxP7U0c8zeXGL0xNWFHz7Nzfkm5b63Y6whqAVTnZ8Oj2imzXSSPopoltLXE58fH7icX9iHjz98czldObT00d+fNojVw2z92Rmxd/+h3/D5j7j6fMRRE+ufy6z+Pd9+4sT1bE33O4a+v6M0UXiLwpYrWoOhz03Nzu6vqOuBZttwzzVZJllcQKTKYIrkDLjZlfSdyCiZLwsDOMbq7XEyBWWkC4iHeguHVpVrFYPaU0XPEPveLjdoGTH+ThRFjlKFZwuHSGcWG++SW92IfV0O5vx8eMjQs5U5ZbFWqqqJMtTYryfTpRFgbMeu0S6k6SqapZlZBp7dtt7Bvsj3TSxW1cQKs7nM99++x3RF8RoqZuCH/60MIwv5HnG8dyn1ibbMw+CrHh/7S23KNni/J48bxDSMc0DzqZ124eHX/Gyf6asoO897RCIM9xt33Hqfkr+3cWSlxuqVcmyXKd00nI4OoqyIDjQZkVdTuxWLVkO47Bgson6RrF/OpOXOe1mgwyC0/4MSlKqDVWxZu4nqipntW45HDqQmrr9ln58Y5x6qvoWoU4EO5PlOWWRQbAE13KzWWGdYxkXjHoAEenOP2CnGdXWDONIoSvwHVW9o7ssZCZw3nvceKEoVpTVmnEc8S4y944qr5n6ibq8R7Mg1Zw+5H3kuD8jjWW7zZmnASVgnDseP/6RvnOUZYW3BWhB2+44XxQyZlh7oc43XC4nrLfcfvvX/OHxI02uEGpB5oLZBoRWLIMkQ1FVSeDO4wtjF9JaNp/ABrJa4JWgOx/QYuTudsvdruHSJU9tkU0466nLnDpv0tp96YAkNsqiQMiEKDK5QitBtOLrdXfcv5FVFT4otKqoyg1jv1DogtrcIWVkPP2EDIEq26RiCtJG4n79HYfTC0FaonSMXcfUO6qm4nZzgyBHWgVuwsuJIiuRjWB2C7gG6xbmpSc6z/3lb8mmLag1xtygdEEQsLhkf1nmmePzZ0Q40NYGnZeEuNCf+lSPqzUuJL5oCCkEE0keydQSZTBRsUyO6DypKjeJOiUl1nqmaSH4SLhOZoN3iBiIIflQU93mtZwDS/ARFyAEhxRJEBJB67R2t/baesUXcZJA/yHqRA4ghYiCD2jlr9M3QbgG2NLZXkJ01+4WQ0R9sX0m0DZpcua+tF/FJKdT4ExeEVE54L4SBr4UEuS5IYTk6RTXBFaqahWUZY51LmHAhE8COQLRJ1ROVDgfUdc61qQ6A0oLhJJY/7NwlVIT8GiVeJfjcK1IVQm3E69CPs9SmYL36irqIHyxTWARyhOW6+r+KqrDdc1eVwV5LhhHfT00qKtYdKlEQXmGfuRLYxVXwSiAdVtijGdeQrpqvpQTENFaUtc5IQSWJVkEECGhvFBIkzYfy5JdJ7UBbTQQcLOnLAvyosb5icS3lWntHCU3N3cImepopTQgA8JbiAI7Bf7wr3/P68sT//A//8B/8p/9R2Tlzx7VSir608QYJ8pMMYvAcgFhDNvNLVWhCD7QFgXTeElbMOFpM8Oy9ETlyaua1XbHNC40Tc0vbtaMQ0+cI7brKXffEpYFbEmRlZzOA7nZEeSFl5eB7f0DzCekbMgywfnSI0QijpRlSxQgpCbPc4RKRRvlzR2byvP2OrO4mbZYUf0yY54046UHNTNNB+Rhze5mR1Mv2HFPlUWiEjjrwC34y4l1sWLOJMIFqr7n5R//yOp3BntTYig4PP+IbNeEvqesb2nzW7692+FsQ1GUnJY9YlFoOdF/PvAcFqriFpVlTLOiut+xuem4HHuEznn8/CPLtOBDg6hAG41Qkvn0xhDv+O7Dt0Rrefn8RN4K6qpCCkFVZShRsEwjRWHoOgtGs16vKSt4enmiO8/YIDBVxiJGfng80DY7tJYs08ipG1nCwDjmfLOreX554je//I5VprGMHM8TulBcljPP5yNjf4Yclu6Vy+Tw6teM3rNd3+APC3Uu6Q+W3GQM5wvVqqc/7+kOkqP5SN1Au33Pjx9/wAbJ6m5HdTfzzV9v6U8vLOs1x1PAmIgn5+bOYB//xMVaLoeJX+3uOfseBfTnPZt8B1nAu4XteoMWGYc9vHvYkTWCt/P0f0dT/ju5/cWJavQl03Tm9q5lu7khzwruH3ZYt1DVNbfbXzJPCShe5A1N09K2JSCYpgFnPUaX5GbDzfaB7ryw3dSsVgWrdouIivW6pqk2bFY3LHaiqAJtu8YtkvvdN7y/+wXCC6ZuBi+pi5yhP7BuWspijVs0VbElxpxxTJiUZYkUxRrvIqdDz2ZzR3exDNPIelPQDx0+Dnz/8R84nr/nw4cHoi/o+wO///4faLcZSM/szhRVQYiCl9czb4dXDqc3QrSYHC5dj3Uz8zLw/PxK1830/cjn56cURDot9P1IU6643f6S7fob5jHS9WekMjw+PnM5zUz9hJIFPmhUocjMLd4VrOodq+YWZ2GZoShaqmKNMp6yqhiOOXOveXn+RFUIjGzRYkUMOQhwBISsGBdJNIbBelSRszBz+82O9aaiqRVZBlkmeN2/gBrJ8gT9rpo1RdGgjEbrgnF+YZpPzHNP9I7ToWNeekBwOD3TnTvqoqUyGhMWSlPSnV/x7kx0C8IbtChYxoBAUlbJW2zngIySuigp8khdKwQGLQPRLkwXT/QDz5//hdPhI7lKaCC3WGR0VKXgePyB17d/RqmRzEiKLKfVK4oAlc5xwaK0Ry4edxnJsjIFZXQgLzdEFrphgaxGmJImW9EW6zQNDhmNvkV7gWaiP11QMSdEcG7g+emJ83GPnyembqTOG5q8JSyCpljxcHfDdr2i0IZVUyCFpNBrtFlR1msIiu78Mzh8diPO77mML7weP/Pp+Z/5/PYjJpecT2cOhzd22y1a5pwPJ7rLK6fTG/35gp0d8+iws0VLT7Azw3gGAdvdlvX6hugz7OwRDkqpualbbqodZZYzTM9EMbCxd5S+gbhCqweUqYhSXkH6MC+ep5/+hHOvrLcVZdlASFLPpiQQSmuU1CipuA5Ur1PH5DXMMk2R57jZ4zwQE7swEDF5CnMtc6q6jHhcsIBLITOhv67or+9WqU9bKKwVEL80K11T+GJJPkzHtTTgCtsnomS4VgomMRSuYSIhIsu8sMwRQeKRSgTReyQeI2WyBPh49cgmIVgWGevVCikS/5WvEz5xDXsJxqEH0uo5CfeAMYqqKuFrpWq6H8lOEMi0JHqBc0nY+mCTaA0RdW0V8z5cDwbXYNh1Kut8vE5FZfKRwlc2K8ETr9NqxM+xMCkFhcnxVieOqUiTcHEtdgjCXdvABFHGK7kgpmm8cEgsy+TwLk0uheRryKvKstSONyepiBBXq0NESUFVVmjZEOO1fOHqt03TeQfMLJNPjWTBE1yyjThvE7TdCEL4guL60oaWMFZB9CkB79LBKT2GgTzLUtvPNH0tcgWBVBqlFP3rwvg/Kn5b/w3ff/8D//C//O8M8/HrddtualShmPHYODN0RwgX5vHIcX9gni1FWaCLkqhyLJ7ZOXwIKJWTV4olzNzsvmWaJi7dic1mRYwBpSq0Lvjhpz+yP06Uq4LZOaQWrJoGJslqc8M0LkipmC5v4AL3u/csiyUvG5pNxWQ7MJq6LSlKTa13lFJwunhW25pxfiUgQRhGN9BNn1j8SLOumcKBz/snhnlmd3uPKT2ZNlRlTiYEd22FlBfqVU1Trnj54xHTVOynn3DTQLQjfpqx3cRPH//Epx9+j7OWXKwQHqZuYhqPKDlShJaH9oZVU7FtCi77TyzHgfNTxypvENEi8YzdhbY0BHpyE/GLp6kb3m9u6U8vlJnBjT1+mQkhBfOaZoXSM+duT1EZlFZsb+5p1zU2XPhf/+mf8KFAFxlFodmff2AcF55fXrAOvKvwcWacHJfhQpgF0ZTM0fB8HDn1HuEsTWvQTpMVgrfDnm6e+fzpwGLT1ujp5UzWlDS7TbLzzK8USnN3d8fd7S3vtppL/4ZWA00DWSUIauD56UKWOZ6eP/OLX/wCISU3uwe2D1v6qcMzolYL4/SG3tU0W4ULlkUH5izyFo+co0WXJVZceH3b8/L5I4/ff0zvHbpkCYam+nlb8O/79hcnqk1bMwwjq7akyDSnYUEKxzhYssxgpKHIC4Zu5PD2gvM9VdsyD5K8lLjYsUwKV2QUtSKEha6fgYxN84Eyn5nnhbZq6IYTdXGkbQ3jtGdeLIQaLSG4haragLfs948Mw8x28wEhCiDD2oWht2iluHQntrsdkUDd1FzObxzPz0BAihuWJTJMJ9q6oW5WBC/ouxR4qSrNfF74+P058RbHnmkM7A894WXg5i7jdBxxzhNFz9BJ+tdHitrz+OmVTC1o1TDNZ5yT2CVSVysyU+IWwfGYOH+r+hvmYaLrD7Rrzzor2NRbpJmZ3Jncz6zWW6yzVNV7/vD9/0S7apiW67rb12xv1kyHhaJyaN2wXb0DOYHQLG5gVdfMgyUrQagSGyeKW4kpJH2XU20E3eVMu8v4/PiZaT6lw8TpJ1Zti7QjjsBlMBipOJ9OSNOxzb8jk4rPp++ZzcT25j1t+45x+onu8sa3775F2nUSgjFSlxUfHn7L09Mjuc6QQpOVkWgNTd1yPp8pm5roARmxi6UwBdN0hDCmjmwHVZmxuAU39SxdQ1FFrBupTU1+W3A+9wQx0zQ5Wnqm4ZXcaJRamK3meDmzeXdHpSSnyxO7229Y/EBWK6bF4cYBdERnG2almd0IwXDcW+qiSq1MecbxAqZYMy4zWipma3He0+Qbdpsdp+6CnWG7WxE2MA0julVELNM0kZkGOyoaY6hWNcaAtxN1m3+97lZthY8eWeQ4L3m7PGJExlZs8fTMbqamAl/i/QEhjglkHzL2508EEbHLgPMz9foW5RaUMRRlwdgvBO9YlQ1SgkaRKUUMCa3l4pl2uGf96a9wb7f4cIPUJc55hAhIrfDOcnj+BGFPvS7ReY1WAtu9oXV5FXUjSgaiSt7b1CUdvgarQoyUhcYo0so9UY2ILqCkINOC4El99z5eQ1BgFBD9lTP6JSwlCcGRZ5pMCToXU5O8+FKD6rDOMi0C581Vfvwc6CrLDOeTrzax99OkNtOGLDdXpNOXHFgkBkeeGeqyZL4KX0n4Wo2tVZqCXvNTadV6DWDWVU6Rec6XEUSWhOqVr5oZiVYppR35Es5P1oYYLc7rK0VAXa2/X9qx0lR4HFM1ccJkkcJlkCwP1mOd/Dq9/FK+IPA4GxknRSRHxpjKCSKp6jXPiHjinPyfydjqAYcSDm8DLsjr/fz50BDjjPcjds5JbV4JPfbFcmG0QAmD8ykwJoUgyoQG0ypipGQeHc5d7Q9fgnkBjBKIeK01Dj8XMOAh4tBGkmea/RLwPqJVmnRHJFmu2W5qnh5fcT5HYfA+4QratiH45JE2xlyDaGn6LkTkh++/J3bwH2//C/775b9ivVpR6Z871A/9BalypJZkuaKeJ7I2Z54u9L2nKCWLXTCZpreOosxoVI5xBUrD6/GNvCrRSlGXDcfLK/tLsmCUCPJ2x3j+iJQOozJme2Zz03LZv7KuW9rtjvP5RJa1vP30z4xLzm3VJD97FMy9R0fF0b2xomVdtFx+P9PNF5Y6IFVJmeZMHA8DWVbx4f0D01hQ1SXDfGQcey6nV3717d8gc41xJd+8/0CYBoRoWaLBmwZtAvU3v0LkLarpePt0oskzlGswZs045cynN7T4E41U1HWJnUCbhtvbb9kfXlnd3lEVinkZaLKM336344e3n3hzW252zXVLccPiZgIL0WU8vjyyagpKk/Pw6wf2T68Q4Rff3SE0hDAhpSMKyefXH7jb/QKlI9ZOVFnFp4+f6brAqq6oVpIQBbRTnAsAACAASURBVPOkyfIMo2te3/b4uFCYlnads8wNd23L22FPs6o4Dx3jPPJNdY8uMrIg6OYzhYjY3LASOX4+sFkX7Pffs1rf051f0aalNj1aZDiRU1UlwU2UxXsyLcEI5mDxy4VljvTujbeTQ5nI29PMzXqNqUuqpmX2jsaUZFpTFxn7/UhWRua40MWRUlfkK8FFnNl3ME49biz47W++4/Oz5eF2hxVnivz/J3iqtqkIVtCfF/BQZhVGCXKzYhw8P338iTzLudnlVMVn7m4ERSlRJkPLCoTkeHpjcR2vrwcy3dD3kfNlZJ5GjMmYZ4vJWvphwmSS7jwyDkeKwjA7z7F/BDXjrGMeJ7QMrDYF0zwxDBdCGFncBes7fDhejfMglASV4aPnfBowWYmQdfIlaYdbYOxEEghBY+eIEi25WdGfZ4Zu4XwI/PinNz5+/wryQnexya4wG5wzOKuZxwm/SOJSMQ2BVf0eEWqiXRF8Tq7uuRwDYz/w+dOe6DSFvsHOEaNAi4q22dIPJwqzRoctwXuGQXO5LJxOPW3zAakXdOaZF4dfYBzOaGPxvmexHZdhzzAdOZ4fWeaeYThi/cLx/ERWBtbbLUTF0HsyuabQJXPvwUmMUrg5eR4LWSNmxSpvKHyGDhI5LVTO8cvN71BLgXaKWmXUWc22veH56QW7WNbNhsu5Z1wGnk+PDOOJorjH+4zMaNarmsrUuHmkyCNDd6LMcmKwTHPH8bjneLjQ9ydyHfE2geeVmUE6lmjxztCfJw6HN6oiTxxNJMoYlDZkWc40LZwur6kZZBaMy0yRGcZRkLUtUeacXh/JK0nfzby+PVNVCbOyjJbZLpzDiMVTty3FpqALrzgN58GTmTW79Q2b+oH7+w/84pd/xXr1DVKscEEgpOHcnSiMJgbP+TgxDoHtNqXwpRAcDo/42TKfFoSbaUrz83VXbgkxw2QFuZLU5YrN9hYVQCJp1zdoYVKTjZ7RqqEu78iKgm554zKcUNqwxEA/nNDGkyGIg8JEwc22RkaNdyE14czXSamfeVh/4Bf9fw7739BPawar6ceJbhiZlpmx63l+/JFl+kReWBABrYHo0BLmeWGcLVEIpEjeOKV16p3myoCV4jpdFKk1a/FXjefT2l9ApgOEJDScDzgf8Q6U1EilEic1iKt/MX3futDkV0h1FF+CN0lEqmvq3V/xU4IUztEqBVuc58+mhWnqZ4ykKA3IK3opXn+WkGRGIlGEoEFe1+VpPkeMFu8s3n9JLCUfKiKiRGpeCjFL9/nK/RRCkJl4bVfSX2LuSdpHUOLKer2m5kX8wgwNSBFQMqZDU7im+WP46ketSo1Rmq9tVl94ptcGLR88w+Kv5QBfVu3pOY3RYkMKSaVEv7j+ThETPMKGZK/44nu9MlgzI6mbAqkVi/fJfxoDIiTPstQW5+ZrUcT160UKsJWFwWSRU3+64sMUIlzf2KOjMAoVIsvsEjXs6j39QkcoswK8YFnC1+n5FzuDkZJMlijZpNBWiHifqnCzrGCalq/PPwhQEaUU3aXjD3/4F4RMxIXVZsPf/f3fQ/j5upXBo1WgG184up4plzy/nVI7oJxYfM/j8yv784DOcgIeO08oo+hGx3CZsZNj6M4EPLNb+Px2pKp2ZHlO3VR8991fs13fcX/zgaZa4ZbAerclbwuG8UJk4U8/foayogs9L88HRCyIQYHwrJoKozT2NHP5fkSXhvbmA7c3a+app8xbwgJh6cBCqd6zW++IQaGFpG0abnbvccyMU0RUilFUjEj6JaDUFrxAxopvfv0rVLWka9qU1LcPdKFDZQu/+81f87d/9/epiKA1jP7Mp9fPjLHl/W/+U8y25oeXzzzu95xtx2t3Rq8rtvcbjraHIjL7hXolmb1BKck8XJj6DhXTxuKn54EQNd3kUZnmdHgjhBPWOp4/D7TFjsXOWB+YF0t3OhOtZtXc0bQN62bHYi1vn9N7nzCSolU89090Q4eLFr8kmgh+4eX5idkODHPHaQwIlfHmjrhJURtQXmOkRzlDXqzRURInz/D2CjqRj6bOEb1ntgqV3dBkLdGXZJUGV5AJwzh94nQaqMqarnvjh8c/8HLpeHp5IciF4+mEtJ7nzz1eGIzIuLl5h43gbUCFmeE88fr6ifOxo91uyFaC18szWVuQrR15U2Eq+/9EW/6/evuLQvVyHtBacdh31FXDemOYR8GqLfDO87o/IJTn7l2Oc+Bdw3Be4eXI6C+M/YLOCvqu4/h6oG42FEVLWZQ87Z84ns5UTY2NFhtmqqZFiAxrI1mumZeBZZkoipwoAk3b0jQVMU5oM+PszNv+E1IIJAYlBW/7Rx6f/kQ/vvH7P/wb5vDKvET2h57T6YhSGdv1L7j0A2VZUWQtwRtkXDH3DYc3x9AveAtaFNhZU5cfuN294/i6IGVG21YM54zLAc6ngaefzuTqlvvdryn1e86vBj8Z2uqBcRxYr9okCq5+OKMzMl1SlwVt+Y5MtAzDG3bpKArBPKXUZdo/DZQFGNGQa4P0IOJCLiGEhWE4o7RjHPe8ve2R0mJ0QVlWDP0A2gOWaBXe5xANTbECYWjqNdiC0jS8u/ktdZVRlytCCJTlLnUwB0+pHN+9/xXr5obz6YTOW1bbHXnR8Ps//ltO3TPjeMTHhfPlSBAzOk+g6W4aOY6POLGwPz8z2B6ZR4Zl4XTuWbUleVToZWKV5YRlwMUzp3FCmxwhFMp4nHeM80Be1mR5xrjMnJ3n4nq8dinBmZW4WWBkTmlWCL3w+jbwh+/3uBgIbmbszhiVMc0jo1sYx5l5HBG5J6/v6SaP1jlVdY9fCkyWE8nop4HT+YC1HZO9oPKKYUms3+4yJDbf+QWiYb2+5XIZ6A4TRVYgY04ltmyae4oyo6ojk51T45I3NLJluvyMuanWd9RlRmUEZQF3mw/s2gdCsBRFRbtaocvAalfjRcS6a++7CpSVYXdzD7EmNw1Eh7Mdwk3YS4/2HiMUo7dY4RnnkctwYprfuKkaVv2v6A8b9kOG9QbvHcsyMS8Tl27g9fMnsM/sthIZAoqIwhN9oMxK/OS+CgihBEJKpJTXtqYrUzWSoO25ZHGWaU5eTYQgepEmeUXEh4nFppR+COk1oJXE6AKBges6Psm3SJanw0oI8uo/TWt5pQVtVWCuhQmENGkNPk1vpRSJxfklBk/6Q+n0Pby/ilsprkGqSNMWSC1Z5uXqQRV/JhyTgHb+uk7/QhQIAedG5tnhXEq5Rzw+OIjxunEw+Pjz2pmYPKVlnmN0iXM/B7CS+IvkmaasCrwH58JXu0PwIIVFG08MihDU11BbGimnfECeVwiRCArh6icmBuSXFbv9OoMGUk1xWpXnKJkB1/tyJU/FGMlNOjRExHV6m6aWgSTKTWaujXoCpbj6U9O/aaOIwjNO7vrM+qsYTWeCuqqp6xZrk4CO10FviAGtFE1VElzyO8foksf5Kt7zTCOEZJpsIgE4i3M2FXYA8zxdqQPp9SCvFIMffview35PlhlyUfDX7e/w/sS4LF+vW5MbejtgZ5uoGnph7HuiTRPxaYkUVc0yThiVkZsKP428Hk7AQpNnFHkDSvD4+EJ/mdmtcvKyoqhviUBVt7TbLSrztEWBUTnOOoZhZPE9Pz0dWKxlGQMP63tKWRCXBSU093cPzHPgV6vfwDxymA6YDxnncGJxkmgDdhTkpqAuN2SZpx/2TOOFw3OHomZV16zqewiB7a5Ba8mn1/+DH57+wLkbOZ96vOt5ef2MJbDYCSEEv/nNrxHKUrUVeVNz/8uC9r6lfbhH3TT0euA0fubl9Ef+5eP/hjQ5y2TxhWWOI6MfOc4jU9QUrWF/6jmOgafXV8Ssud1tcG4iHD3z2VLXDcvlyDBMRAGv5wtzFJhixY8f3zgfFpZBcTqdeHk50a7fQa6RtSVbaUZv8RLKvOTurmSeB5pmQ1nW7HYrvv3lDp0Zblc1XXdIVb6jp8ob7ncP9P2Zl1OPqRSlyRi9RftAleW0+TuWXrJb3fF+s2LpJ5QaWWJkFguTn5hdZLaR8/kELrCcHXHS6MxiveH9+3s21Y5VsyJYBz6yrjPmznGzrhi7V8b+kXkZaEuDVIHL8ZH3mzUizOTOc79ecV4ch67H64E/ffwRUVr+5ad/zXno6cefP5P+fd/+4up/6C0f3te8vcz0vcXklrJscM4SneTv/+53vB1fOJ0lh0PCDh3PF7wd2d2uObsZoRXn0wv323estxXWT5TFmk9vj0xvB7JcEaJnvW7Zru948y8IWaZ2jGrH/jAwTYqIRAjHNFu0ynl6+kSZZRRZwfl4YhwtVSMIwfL8+BM+3nM+9zRNjpAB5xVKjby8nNmsdvTnyLHokDISfcY0BaZ55O7mW4pshVAzw3DALgd++6u/R2tL2zrOh5623hGcprsMFPrX2LhHKcG7+w/snx3b9ZbNukRnFVJ7gp/47tu/4uXlzM3tisPhEz52rNc7zt2Bpq0oWsn+/BltJJkynC5PVM2KqBaUjChf40PP7UPN/mBZtTdkSjBMGVIWOBGQambVvkOtao7HAzKO2LhQ6BXLMFEWkrpukDHQjx1KSZQMrJuGIiuom4bz8UKIAmkiS3DYaaTMG+ZFIRfH7f2O0Q1En3xYx+6Nm4c1b28H6qomyxumuadocpCRoe8Z+zNtXdJ1PUUZmJeJuixxQNAJHi2y5FUryppp7GhXFVqH5LXzAbtE5gli5SjKHcfRcbg8o3WgEA8sy8TojuRZhTEGpQIvlxP/8sNP9F2gaiL1+4rRB9a772gfvuV0+YQ2A2UWsdM5/S5uQImA0g0uCOZ5YVleMWXkOD0hdEM3HxifksC6XCzSCzabFUpnMEf2zyesjSxYYggUmWEh8IdPjzR1xdoYbnc7jpNk06zZlIL4cyYDjWJd3CDMBTtXeGFw1w8bKSOntz2Z1JTNBtwKpQdy4/EuBwsP9x/445++ZxwH2qIkLyKzPZHlFZOXyDHS1CUhLLh+ZFUY5lgwP295++df4M8rnFAoQIZIUBCWhem8Z7cWfHjYEJxDFBKdGbyzGFMghMGHmXBNsQvCnwH+vwRwBISIFoI8y1JtaZREUtVqCAGjDUYLzheLtT6FW3x6LeS5RqkM6+frejy1SwkRWJYR79SVDvDz1FFrRWY0y+wArgn0JCy1kiglr0D4+KXpFK7QeSXzJLS+3AUfkQKUTu9bX/ihSTSSQOMq4Y+sj0TUVyFlpKKuJFEk+sCX4JKI11YkkapjFxeSTzWCiAGjJEbHtApfQF4DQl8aporCJBLL5PBBIa9tUcnakA4B86zwLoICqVJ1qlKCqtQgNM4n4SZiwkiJCGWpyLI0iebqK45XbJWRgaYtGCZPXEgEhatHNV4nyeO4MA6C/5O6N+uRJE2z855vsd3Nd4+IzKzMrKWrqzUzpCBSGIICqFtBf1Z/QBAEQoAocaQZcoZD9ExXVVdXLrH7Zrt9my7MM2uuGhgCA0J2lcjIsPDwCE8/3/ue8xyt8qnhiklMChGII8U4mum3XYnPSLFJRweMHadQXHBowcXXDEoK5mWODZa6GxAqugSiJopCFEnyPObxYc84KqLU4oIiTAZZYpWRxAuG8T2BqbZW62m1O44DSinMaJBCopIpiNd2Dd9///3l1SmZyQVfL/5HpH8kVL94VF0YeffuPS/W28nClESQzSAIlvOSp0PDbLbByyNFkpOkjuZ0Ikr1hEizUyp/fzgyT3Kurl/iRT91sKsY4S0Pj3fkxZJEB8Iwki/XPD2/m7YY0iJUzJuXSz78/vfMsy1hG5NKwdgLRC+AlERKRhcIpaTtDYfqgPEZeSJRwYLrSPOcEUd72JMmGeAokgXV4QHvMoJ2zGYZ7b5Fx3Dz5Zc0hyNVI2AMyOBo254iX2FGg/cghefN619j3YgZO4wNIAz18YwWKdl8gdSep+e/RyuPKgzepbh+wLvA4XQkShXeGppGMF/OcONAnEiC02g1I80EWgva9kQkBGfbkCYFeV4QBcW5qqYNRGRpOsP2Zs2pPbDabXi4rVi90Aym5tw68mLJ9voVTfYRd1KEMcGOgm+//JbYBapKkMwU1eE9y/WGb755w9PjLVGW0/U95/3Ar75bcWqPjFHK1SymHT1Z4tFn2F1tSCOF1hHSGU7Pz+xPt8R2gxk8vsvY7a44Hh7oT1NhiTeK5WpDGm+xwWLGMzdX12TRHC0GUi0pc8XPP//Iqrzi+f6Rcp3xdP8OMXqiBQwNzHREIiJaExhdxxAMeZpw2DecqkA3/IjvI/7N//RfoCr/Ca4/zlEtIq5vrmmbB3pTMV/sOFctT48H8mTOzfYL6rMgiixJaZGRZz5zhGNM4ktWC82hrtmu1sRaMY4NXVuh5YxytuB8buhNRX0+sFnsiLhiWSzoTMVgLYNpMMbQjtXEuvMx1bnm6npNVTUkK0GZv+TQVxRZzMf3PxLHBcv5jL/7m0fmm8D+sWZ3lfHlm+/4D3/1H+m6mj/57r/l9uMdUgR22y+ozi1JDttyxzh4vnzzJ9TtE88PJ5aLLfOy4FydKNIdY9cg/JztNsFZxXJVkmavsNbQj44Xr65xQJosSPM5w1izfxp59fIbPty+J049+UzStI5FucSYhmGsaNsjWbLABYFiSh+qpMU6T0BjfMNqXnKuTpdVYY6UPavlDVJmjKbBc0JrjQyWvu3Z7RYYu2K9LLDpSD0oFkWG8JCVK47PZ+r6Hu960lTy/ByomiPlfMm5qXCym7q2fcRATSo9SkSMZkB4zegDRZkTRZosW5Kla6wyIANdPVV44nuEm1Gk12jZMrgTVeWYzTQMgUjOeRjeEZRjvt7iqyM6BGb5AmP3aKUYXEQUX9ZzaYS3irLYcTh/QMkM2ysiqUmLnDQveDzcAhCHBd98fcNitiUgSGc3/Dd/+q8p5y+Jk5TDfs8Pv/u3HO6/x5kRaxvKHLKsQAfF2TToaAqmSa9BJCASBIa6fSCK54xdTaI03RCjZED6KZQV5zOEajHKYVRDmlvO54quV9zMXxOHDqkalmVCN7Rkefn5ddfXPcYr/GhwSMpZiggw9j1u7HHG4kJBSAOLcoexH2j7miyZoaKCffWEVwYRxwSpUUgiqYnTGU/Pd/TVM8VijpYKTCApFOH5S/rf/Rpz2k39zzIgkHjh6fseugPr3PDVmy9J8ozqdJwEn4wRzoETGDvStJbROj53wV8mUpMAmeZT/oIuytMUwiWM9Mm76qcwTQgKY6Y6VBEmLJRAE0VTUt/acEnKC7wT5ElKkWc07YB1BiEVQUxYIyGmsE3X+0kMyU9xIYiSiZ9pLyvpIMSU3BeCOFaXgNTlH18mp1oJCI7hMu0Nl8R68IEoVqSxph0C7iJ8JeC8RccSrSVNb3EhoPAQFOCYbA9hAul7QE4y1DlPEgmyVDMaO63Z5acp7TQllNJinJgsFP4i+KZeWSKtiFRC5bgEq6bVtXeeRE3V11VjMVah9LRgmyaJU6NV33msu3TI+4CQ8hIA6zHWMdgM5wPTU+J/oQpocEHiQjRNyvkFAaVlINaCdpSXnV64cHktCMizlKJIcK763OT1uWVLCHQk6cfA6BRaxwgsU7MUCBzGjIzGY71AX+pkg7AIZxjHZx6fKkbr8GFKrM+KAq0U1jqUuvBcfbi0a0nef3jP/f391DgYBFJItpsl69mBD7+7//y6bc7NNDzJNIkpyYKG4p52qBndDPyE39NxjjWT1dcZRxSN9O1IHEnKIiPabGnrPWW5mtrnQs3pqSaJUvLMc9o/XOxiNYt0x3r3ktt374hEgkMiBsNqVhLJmOXNDeO5xpuap8ef6EJKT0SPII6n6vEX10vs4FA+IktzRjvQtB1eKbJsQZ4m5OnEHI2iLU3TcftQURYLtDgD1wz95BXebZa03RPxPMW7ARkl7PePmGEkTsG2FTqSGCMxxlIkk31uvphTnwXb1ZJxHIiTydLlvJhqX/UVgzqg9AzvDXEcs9m+RIQF5+Mzo4Ei2bH+NseEjvf3R5K5ZhmviXWKGwx+8KxWOZEu6YcWU46kM4WNUx6f77E+UKRwf7glFtc0tWa3WXN4GCdUU7AE7ynlmv50z+33P7N9+y1XL68pE03dNJybloLAdfmC9+efeHqEKE/ACbx0mNaQzlOka+ltSwgxaV4SxVDvK2SwmPoMQZNEGfOFZBwVp0OFGx3HpiebxeyfT8RxMqHadMnLmy3n6pY8VZwPe9IogwDW+AmXWTfMl3PaU4Npep6Hml1QhHBCMbHUfYDq1BE81PUBGX6xtfzXvv6oUD2ej5yqDUEqdps1KEnbnxAkFKXk4/2Rvu+5Tpcs5mf292fCOLBdrDgeWvKlJ0vTqW5UKm4//owzhuf+SNCaqqnZrm+IS00YLF11JMkyfvt370hKjdIw2h49CopZhjEjQgmO+wHFnGDWVEdPrGcQIs77gSh1vHr1Nbc//4SUniy+JgpL6tOBv/l/fuD16+UkQp4dy7JlNXfM5wmvv7wh+II//OEPPDz8zNu3b9mvX7PcKCSBx4dbvn77L0mzn9hcKeJozWq9oe0fePv2DT/9/hYpBxZLR1U7Pt7+ni9ev+Vw3FMurjhXFUpNPk1Ch5SerjXUTU0SZ2iZEuuEcpYjvaauRoIwDONAP1ZoFRi7gqHp2G5e0bfNpWnHUs5j9od7kkgSnCHLE17czNDakhULlBg5NXuSdAcuYuhPBBFjfE2aR9RnQ9P3PD/vUcnI47EhSXKkkuRJhjM96Qx60zL0AYdGupT19pqZz9kf79guXyCFZPAVi0XO+aiJiChnMcGmpKpkfTXn43PLrJwRMBTF5J1KszlRHuEjjyokzckixifii5qI4gLCyGIFBE3b1ahsRpbMmZWathpI4hKpR7I0RavpEJHnMMu3BJ8h5Awhcqq6ojW/p1zOKJYvuHnzHfunO0x7S1Y4VDKjnG3o655YKbTOyRYLrJlqZrWMsNLDbPIZiVhNyWyZEvuEcRwxvicJkizTZNGcsa5Jk4IvNiuGMZDGCSKRJKlmfzhR9Q2Z+iVMZYd6Cn47gVEtmhLnAsZ1zOKE9CrHNANSGGINsVrQ2EncRapgHAbSNEEGifIGGSRaRpg+RrqUKAwo6ZBYRLujbV7T/vgGc5xPNZkAQmGcxwwntGl5tdOsVuVUw9l5kJJgDW4w0/qVEecMwzBOXEx18VJKdUltX8STkOACWk1sU2MDU5blErQSgTSL0DqaAlNclvteXBbMI8aAcZ/uOT3eNNEkqeLUuIsI5MJW9UjhpnWoFdNBMICQE1wq+JF+DBdslSAwoYmyNCJLI7p+wFoLQl9W+xOrVUo/sVUBJnjVNKWUk7eVYcIhfbomNJXHuoF+mHBYwk/T4uADUk2Pt+k8PmimdOE0LVZy+l2ywX9u+5qqXsNU/yoUzipGY7E+gNUTBovpd03LGOtGvA+Tn5hwsV8EwDGMIETMJ0qCCAKpBFpLus4QyLiUsnLR5Gg92TqG8ZOQd58DVd7baZ0vFcaDZ/LKhouvQquJpdsP0zMn5YRtkmI6RGSJRiuNswIl9eUMo5BSoJVDSKhai0ehtQQvL3cPxLHAuoFu8DjUFOITE9tV48lyQT/UjOMliCUF69WKSGuEECipJuZqmJ7nvu/53e++/zy9JoDUmuU8x5uOtEw//4zH1pPPSoIB2xmsElTnimNfM8sUpmkxoSHZFtTNAT04sjRlFhc4N9C5Hjs6dusFJz1w/3TPfD7jarWh2OV8vH2gKFLKdGLJOmVY5jPapkL6lFkS41RPoko2b5b0fYBu8jh3tsE7xyxPaTo50S/aml74Ka8QPEEEGjtQFAWps9x9fOSb33yHMwNpEtMNe+yQEEcl23VACU1vI4gVdTuSKoWKA4yaLIsYrEILQdt2FFnO6TlMOQs8WsbkWUy5mDM0PfiYth9AOrxtGGyM9HOM8BSLV9xc3/B3PzW4MSDziPlsTR86EgzD2CO0QiULVB7T9jVWp6wWGUJFpEnGw9M9KslYrEu0igiHHt8rDoeP9CZBEvH61Q3PDx8IQ0yQA4Or+fnjTyg5bVzKVYKzjtunA7LvuPlihwgw375hlcIffvgPvPnyOyLnKKSg367RUUy0LOB0YDZ7SbCPJNmGeClQeQG2wwhH6FsUmu1uhxcxx9NIUs6oj56bl1+Agln6CucqzmeLEwOPj3te3FyzmAeM6YijBBksXZ3y+tU1x2PDarnhcLgnjhLWixlPHzuEEvRtT3ST0Zz/wGDnNMNA23vmu4xIQ6w3+PALiea/9vVHhWrd7vlwpwkuZnQbglHMFyWJSpnNcqIswjnJ3fsnTvVHlI/I0zljB0MYOdztubp6wbuPP1POcg7HJ7SK0CpGuZTDwxOJmIGbWjDyJCdUzwQjufvDGT1rkWRIr5FIsnzGukz5+9/esn+u6HaSYmbZXC354fsfKcs5TT1y2rekSUQUIn7z6z9le13wt3/7F/yLf/GWN69+zXaT8t2332JtxdPjPW/ffs35NOB9h3X31O2ButYo6ZnNch7vDwhlWawF9/uGqjvxYvkN5mypqoqn5weEMiSZQEeQpJo483TDA8gBx4FjNaKUY+w9SZSjZym39z+R5TmRmJHqgjC2vNzB9bbh4aPl7rTh/HxA+pg8Az8aFrOE3XrD/qljd7XD+DOBAWRHUwvSKON0egI/kiU5h8c9q9UcFaXM8vn0JipamqrCeEGeLdhsNhwPe6SOL143i5QKKSOGUeOtYTGf4WOPGc603cD2eoGMPMpGSJ9SZDnj0OGtI08LbDqgZYESnmymiLQFOZDomJcvllh/mqpoE8echNF2MLaEwRLGQLEoMKZjNIabzUse9u8hcpyrwCJ3nKqPpOniMtU5MzqB7wzWrVFuxnKRkNgWNUqezresNm8w5ol//3//J0ZvuPniLbvdDaMxxHmKdQVt3+KUBNkRKcVm94LDU0eeLNBFQdcPkzcwCI5KNAAAIABJREFUKOIhJS83hCShrjsCmjLOeKxPZLkkTxw5CZEoMJGc0EjOE6mpRnhoRqwBGaeo5kSsf3nDy+YJ0jiaQdGeH3i2IH1CUpT0KNRgSNIM7yRRHBhHwXKz4uHpTP1UUZRroijBmZb5fEGZLxnbPVJ2rIsFstsSD1ccqgH3+2+o9jtGd8kEXRLfduhxw4mZ6vjq7Yr5KqfrR4Z2PwUWhcUNAw5BkDFFlhCAwTisAS0+2d+ndT58EofiElSa+tbrdsBah/xl505Z5kj1qe9+kjfeTkIvjhXOB4y5rHs9l5DPyDg6jPWf8KETe5VAoqc3mtFyQSxNH4cJwWTMFNaa6kh/SeqH4LFuWktPz8v0vUxBm4hwCSdJdbFYhgl1ZZyh7ScuqVSTxPMeXBgYncX5BCEiPvlrrbMUqSRJE05Nf5kMBtylylUIQRQpYLIbCDH9rDyTmEzTCO/DJRA2ERa8d9Pdg8SMkn5wOC+Q3iEvlbNCWIIMjJYpiDSRsvhUrRrFkm5Qnye88hK2wlsiOT0e6y5+2WnNM1FJRUBHGnfxoE5gg+nnG8LEbRVeMI58Fq9CSiQSJUDrQNN0GAs6kkghcBfhHunJWjGODu9BBX8JnkmU8MyyFKmgbgZCiCfvthQgFIFAmhaM1mBMg5CS1XLJYj7HWouUEys3eIeIFFpJ3n+85/bujiiOL5P/yUMrGTncPrGKt59ft7GyVMZhmJGnMbHvWaZXDIMmdgmrsiArEoKEeJaQlYJOK2Qw5PEM5SSJhkgL5umKxp9QXnB67oh0jxANRVpS6IJiuaL/2BCZka76SPAGazM2V9lUJ5uUCBxjLyhmrzntOx7fd3z7mzmHsafIEx6OD1zNl3QGpE5JE0VzPiOcRwvFYlnQDUfOx5aX11/jXODj3Tt+/e2fYn07fR21IuipnGM+32FoCVGMU4Gm7slC4ObmiiKTDFEgLwuO5wOL7Jqbm5zT4544VoymJtY1P/6+Yrl9iRaOY/vIIl+wunrFud0z9D15CVKlRNGKtnsgqJFuGFjOr/ACjl1NnOXItEOqkjLJqIaaKEmwVvDu9iNj1zPLU6qjweueV1/8GTCiIktAUsx2dM0Jj+Th8Yntco5TktbCOFq8ithdrbHG4TpPJBTl6k/5s3+V03dH2qeBtLCsQ4ftJavtko9VhZcJWkZkaYbNc4QtOJ0+UPf3REPCspzR+cn3HDKFURGJzhkHB2bFf//n/zN/9Vf/J3cff8vu5XTY77qePE354fuf+PLNC0RwpEmKUhmLecbz/g4tA0UZc3p6wllJWkTsVgW9aZjPrwg243B4oHcnkj4nSgXFbEGUzf5LNOU/yfVHher2KqPtWur6kdHUrBavWS1nnM0RVSfsSo+1DY8PZ+p+4NXNjFhKHvdnXGoJMuP+4ZlmGPFKEkcL5rM1ddOzyFY8+BqFZl8dOexbEM+sFglFmvDu9+95Mb/m+Bw4jj3IM9vtkqHd09Ud7alh9ydf4YWnbm9ZbiSJWpLGMNqGf/0//IYijVlvJzD4t9/+hlkR8ENG11m+++5LztUDd/f3ZHnK8fiIjiRte2C5LLm7+54hjLTdliTNWW/mHJvfYfhA1UrkQ4L3A6M/caosm82Ox4dHJAVejLx6eY21ilkeGIYOYx/JspRIx0ihGMcBqSJWW0nfBpIoQcmOU//IzQze/GbOD//bSDlbUtUDzgRevlrgRjCmZ7HJkGFqO3KuBpfR1j3lTlCfOl6/uqGuDKvZliRJOTWGx+dbNutrFquvGfrvUZd+bZAkaU4xT7C2xRKIZEkztBRFSnNw7B8s+SrC+ZGv3rxGpnOeH/aslksSXWPHnnmZ4/0GLWaTh3Hm6btAFEGWWKq6Zj6fE+kZLiT03uCjDiUMrpKcjj1ZtmC+UgQlqc8NLnj+cPf3VHXH+mqHEJ40mTG26hJQ08znSzyO4+GJqn0m0SXr9TWn5zseTwfiTNCODdYf2ey2nI4HaC3uXHE8nahPlnSRI7xG4bF9z2K7w/uIbCZJ84y2PSFkjPcGgmWWFNh2pBpbnBlY5jN0ZJivI4JzWNNjoyXBerwEJS2RNdRNhyng9HwkEFGUS/I4Q/0yfCNKS6IoMIZAbJYYF1Noxaqc8VR32DoQzRN6X6MQdIPlenXDbKVomgahB3wYcd6yCl+xcV8w+AovFNZ0qOcrzvdz2rOjM1NjzxQcEhgbsEOFsjXbheZmtyTPIrphIIhpta0JKJljZYyRitEYIi2oz4a+nyaNwk1eSrikrhGXlfH0PSZJxKycczxPlacESfASKTxJMk2pnb18HgJnPXmZMi9L2m7AWoOU6nPqH8BaLtiqiTs6tSsJtAApNe4iwASTmFMSIh0xjv+gNWlK5aCkYBx72tZ9Fl+ICd3kg6Ufe4Zhuj9CTKx7P5V8DCMMxhOCBqYVMz4QRRFCKkZzIQsgLpGpQBQLgoTRTbWswQeCnETgdGhUOCdxwaHEFDHi4jPVMqZqu2nyK9VnYTyFoabVYd9bgpYXISvwbqoTHYxjtPqXpPslJe+9nVq3gpyS92HqnMKDEp4kFozGMbrp64nwyf4AUaSQKtC0DkJ8sX0IbHCEMLVzjePEtJRICH5a7wuJlAEpHX1vsE5+brJCeoKXZFnKYj7n/vF8ebWIz+Ew4SCJosthXF/sAlPVrAuOKAIdRZzqFu8deZLw6uUNSawnf7DzWDOS5xl5luKd5ccff88wjqRxDHiQkMSaPJeYKGIIv2xCTrYhyjZ0Q40Tmu1ygetb8qigLHLKSKHjFFnE4DXH50cGJYm1ZTZfoMdAqhN64/h4+5Hr119gjOVYPQARX7z4ljzTdL1DCk/sBdX5lkjPSAvPfJXjxoG6OuOTgafTwNDG6I8nEtkyWzmeD39PsfuGRb5lu46oqhZjFTrWnNo9RXJF687oKCJblJzOJwQRbdehozmzsqFpa6yxdG2NVhmJ1HjR4ZynGToe93teXM8x40geaW52W87nZ1Q8EUSEVAgVkEpS1Q3L9RJnAldXN9SVYrXYMAy3fPnFW+LCcTo/IKQlknbyvjaCRS7JopimHVF5wfG0R4mYUCzobI0ShrrvSUUBQTMMFu+nxrPnhxOLxZykhKK4om6eSWNN4xqSOCWZxzwfPiAQRDqj70Z8rNBSsN8/s1rc0FUjXdeSFyuG+pFT0/Dmuz9j/+4Hntx7rLBsFgt62TM8nxlqQZ3fkgJJkBwMZObIcjbnMD4QhzlRmvHc7BlHR9CO0yFi+U1O33dcb3YEN1BVHW++XlO3P/HF7huWuwJrTwQXaKsWKRx9V3N40qw22bQhswEXRoa6JxVztFM45YiDYl1suXt6pJwvyMsY16cslppDfSJPi3+8ovwnuv6oUC0XC57ue8a+x6Yl9/fvGPo13XBgGAfqeuDutsa6kdFHHA4Wl40oldO2e4yXjG1PulxRzhZ0x8DYZTzta55u31POY57ujrRjS5LFeEa6NqOvRpbzOdv1G57vf+Luw4mr65KhazgdK96+fsO333yDjCRRFtGaJ1KZsSq+YruGwT0xy25AdJzqijTzbHclztSMxgCeJBUko+Tm5goXjiTJ5LlKogwlNMEqzNiyP7xHiRXr9Q3H0z3Imizb0bcOlEMqQTfe8/B8wvupGvP27j3XNyk3NyucFRxPjyil8GrBZv0CZw1/+PnvmGczlO8oMkWgZbGWuGHD7UfFw22F8xHb7RXf/HrJh3dP5HkEReB0alnNZnSnjlm+5txXpNGG1dyyXs4Za0UaveBg3nNzvebp+EzTHynzlFN1hEijU4EdBdY5tIqI4oimtaR5hjPn6QTsNXECz32Dd568LFmXN8Si4PmpIU9nZEnOOI4URUYUFSSR5+bqJW706HlEG7WkaUrvLDKa0Q0Vw+jYbG+g6zjt31EUOUpJbBgo5ku80JybR4ZQAzFD2+G8oMyv8fqMGaAoCrw1EwNRxCRRQT5TlHPNOGgejw8Te1NIlEiRsiDPIc1zIi15sX7L6VRju5ax65lvrthc76jre0zbE0lF7xwIQ9WeCNZS7c9kqUIoh4sCcSTQXpLpAuUNddtMmEoTyIqEp+pEkVlEGJgvYrKkQEYZ++Oezo4kCVMFpko/2fcA6M81IQrEccrbt/+MY9uQSIuKBefziU25wo+C+LQhDJpNWjD+EJjFKzZJhrYjzenEdb4h+fuvOD04BDNktqMdFOfKsK8MBoVSConAjBZnDX7smcWGF69LitkE6h/HiaGq0ph+HPFYRJjoCFIJZBAE6am7gWG0+CDwzsMFQ+U/IaHEJ3EmieKperhp2qlaVE5+UK2mMETfjfSDu7RYCmyYgPdaSsYxXGD2/jLthDiRCPGJ1zr5Yq1zREISX9bIzk3e2ak1yqMTecFWTdYC+Tn4FUgSjVSC0Y54L6eK0Mt9Q7CMo2U0MRB9XocLJhaqkJ/KBJg+JqbmJKUUSqYg3GR1uIjGqQRhCnMa6z5bJH4pM3DUbUPTWkDxyWE7eSkd/TAwGjtNhC8pex8gSSWzMsFbgfUBGfyFYCAJwRJFckrYc0FHOX75c+RASgZzITJcHm8IAS0CPriJ1kAyiWo+cU49CMtoPcPopim085eJOQgxUROmZfw/aNBiEqWxVsSx5PlgJj+oUogwHTqEl0SRItIxQ/+JxBAIfrqPVIosi6mrM+NopzxamA4KIUiUmigRXRsIDq52G652O8ZxvFSyGvquu4T8JHcPD7x7/540SSY7ixSIEEjTGBkLXCSJkl9euI2VXMc5nXvkqe0pVit0nrFeZURS4d1AKxy+P3HaB4TuWac7rGkxJuawv2eQBpVqRCoZhqmBLMoCMkxUh49390itiXREdW6oXUWc3eBTT+vbqTs+mf6PGoYjarYhsY+8WGwgmrPff8TKgUW+ocxLTv0PaCHI45hIl0RZzv5UwQBF4jmcRopCcO4eiM0KRMFoDIv5F8TxM7fvKnIxsFwpjqdbnvcNVWNZ5gMqpCAETdvQdp44EzSdIY2X9PbEh7uB11/9GS+v5oxthsoDs3lMc3zP//vvfyTN5zgcWZESJRIp31BVFUWWMPpnghkYGkdIFWPfM09mqCSmrU7YyjIMe6QRZFlEmc84PldsNi9Ivo5BGTSScYwxrsc6kA668YzoPWm2ugyotpyeeoIYOFbPVNVIGFpkntG3DU9PNYv1kkP3v/J8/pZ1XjK6Aal7zvszs3xJdTyhtaE/GzK1xLRHur5BCkNZJpTRbuL+no7MF1t6XXE87UnnCud7dvMZeRLxn/72L/nq62uuXn7Hf/6d5/xoWSzW2L7jZnOFjnpcq8EqGnvAuT2WyVInziNFHOPReDtAgCyJeP/DB5wwzLc3ZMUG4Q1DOIPyvHv//h+nJv8Jrz8qVP/w4ZaEGUmiED7h9u4dP717h9aGm90XuD5wODbEscXbgh9u73j5ekawOTpOOT89My8L/vD+nlfXhscPPa4e2Ly6Ic9jZPbM+fGRxeyaPE+QYqCqz4SguX77Bc/He7YvCuJcUc4Cs2zOd1/+OaiJj7baLDlVA435HUJ31OM9WZrT2TP1c0uUDpTFjtPpPU0Hy0XG2E8hh+rkmc0y0ixQdwdU7EjSliyek+UFwSlWFJRLxe39gbyI2B8kebakaWqu1ldYP/lAu7ZmdIGy3CCURiiP85Y0T3h+7FCRwhhD17XY+++J9IxuOBFQvFh8wePjM33fk8U5idzy/M5Tn3pevXlFnq5YL9Y0xwEz9MgooFVOmuS07hHhMqQryPKYvjUUxYp87jnUR958/QqpoHs8UM7m5EVCdT7xvLcsVwVNXRPLlK5vWa03nNuGbuhJZxmzxTT1NH5AZoGXuw2EiCzd8v7hB4QObMuvGIaG2TwmKSSr9WYKgNCyuVrxeGoJ0mHlyIePd2R5ghCS9XpBPexRkSaEhPpsCaHH2Zq7u9/SG0u5ipAiJ4k2SHFG64bD4RE/wNjXrFYJIOh6Q6E1dVPhHPTGUlU184UmLxeMxhIX08kyS0rM2OBc4P58S997go7Il46xPjMKhx0COl7T95Y4zQGJG1uEcyh63OCwXtEMR/J5SpakDF2DsZbgJ45onGaYbvIqVt3zFATsBGmWozJJWzWk2YzN7obDwxkVPCH+5Q1vu15xeHiPE4HN7jVpWXJ3+x6pEhazFXPxlqjV8NOWzO4QkacfWtJ4CrZoocnxBCE5nxvMaDDGUz8eaMd0cttphRQCa82UoDc9uXbM17DZlsSxJowD+rN3dkref2ogMsGgvSISijSOsd5S1xOT0AUBFpT0yBCw3vNLn/0URlFRYDQnuq6aBIwGZ+1FqEzJ68EMCCa8FXKqCbVmpOv7iX0p/ee0fqQjfAjTGzWXNbkzZLOM5WrN/nTC2hEhIjxuclwGh3Me7+T0OWKaJgbCRAqxYM30mLn8PUyra+tgsJe2pE8VryIQxxopme4bJik2BYwCEkvfG4zVgL74PqdygWEYJwbqpVVOCA9uyhopHRjGcWJACz1ZIcLU8KX1NIF0/gK0unBaCVMlqxCeph8mOsGlUSoIgZSQpBEeGIdxEnQAUuC8ZTQt1uXA5F3lU9gs+ClUIiYhOz0lk23Ah+k5ldJ9rl2d0KbhM+MU4dGRwLiAsf5yMrhMppmqbqWSOB8RhEV9pmJNFgAlHXV7pOkGlNKIMG2FPvlqbTB0/Xi53zThdWKycUgR4wkMgyNJIr5882aqEhXTYcc7SxxHxHGEc44ffviRbhjI4gjjP+GzJHmRY6XkrmlY/QPCY6pHgj8T0Fztdkgs6+0rrDDQS6wM9P2BoRumutrIXYgKEed6ajA7DAfE4CnzlP3xiCoj4nikOT3S1ifiTDK0Fh1pjDKkeclsqTlWJ44HWG1WPFUH+nNLkmkEPYtVyYfHPctyQ1Eu+PHDj3iZECuIhCabzynnMw5HTTc2DH1ACcNhuMOJgafjgXK2IVGaWMaM/sDf/a7iq69fsb5OOZ8rmtbz9LQn0iWKnq4RxLEGFVH1HU55dKx59eLbKZiWeT7cv+f66kusbxm6itP+HiceGZqefgz4+MxifkMQAYcjny9Iszkh1JzONd3oWW9n3B+P5NkW4QWhq1jlC05DjMgShDDEMqW3PQjD4bnj1VdvuX9+z9gPxBKKPCbIqcVSpxHWdphBk69XU1GEEnjrIEREKmc527FcZvRpzNwI8u2CNPIEYTFtxcPde/I8p6odx+4BJeYUi8kWeTV/ieneMTztSbc3dKbBdQnp9Yh76Ah1xG67gwBXN1fEwWNPI0fZkc3mhLGi3mdcXb3i8fd/w/F5yfUqZbuGuukYGkMSSyp7BDensmeEadimN5zPJ9J1RNCK81PFcrfj1FXkWUlvPRrF9SbnP/7Nz0SzBN/+/wRPdXjqSaKRcbRk1wVeO25vf0uot1wtbkiSgjx3tMOe4BRNf+ZwGknTwDwqptBBOuIfHB/evWdTXGP9imVa8uf/6r/jL//6L/jTf15QVy3z+ZzHu5arL2KqIzTmRBQH+mbB17+acz7fE4Jie7XCiyVfvP6Cn989oaMnhnEkTiRN/wHrFizKJdm24Hi6pe0eKBcZhIi2M4zD1LG8ur7BuBpvPXGW8Hz6wGaToYKgN0e8k3z76p/RDie8feaHH35L8EuCkqTJcuowHweySDErf8UwQKIiinwgEgX1qeXp8cjp0OHFGSklfT8QMDS2ZVGW5LMrIrHBjkeKPMV1G54rS1EKdlnCdr0BF/H+w+/Y7Jac62l9EckAbqDINVV1JisTZuWCp+eOpm/xsqFjD+Jf8vT8iBeOOEoZBkuSZbRNz+k4Yq2gHx8pZopjPUx+x0HQN4IxqSFYum5kvtzQmZ5IekZzZr0sSPMc61u6oSdKBef2HvNRsNnseKrv6BtJPyi6fkDHOUE6jvUDZfGKpoEgT+RZQdtZ4hiGscbiSFNNWpSMpkNLzaxYYs8jNjQM3ZEsyVESGtuAc0SxxrgDzqcoJWnqjsE2IHY0Y01jzzSnA1m0xGHpxwpnYLlc471HxxHrcsP++DPvH2/xY8FinpAVCz58PJDkI56GoXIUaY7Ugbau8fHA/tyxXs8ZrSUWJWme4HSFEYpT3VEUgqxIscbTj5amf5y6pLOMIl+Q6Jw0HTjvD5fGtumSOsOzoLNgQsos21KmMcbCjXwDf70mNXMCI9YbbGemqZMXCKcwPmBRVNXIuZUMJqE3AhMUUvqp6b53CG+xpkHKlu0q5+XLa4QYqZsTxkfEIoHRMkWnFX4Uk39ZSLRMscbijLkkvgN9a7D+EjDyAVC4YHHWTqthoUAEpJx8o+NgJlZmEGghsB4iqcnThMYMWOsJegrYCCCKJVJJjPHT6l4rgndMvUgW5y68Un7xWSaJppjNaXqDEOeLwLsEn7RAaX2ZFIK8hJcIDuc7hlFP1a7ik0gLKCEoZylRFDjVl9YkIXAhEKsw1dZ+4nZ+EmE+ICSk6VQH6oy/+HUn4eedw5lxCnK5SSRPzZ9Tmj5NIpQEZ8fL51ymnsKRJiC1pe0GPJOYg/AZa+Wdo657nI8vYTRxYZIGnBsZTJhKC8Q0ZeUigIMbqSuLMYvPvtXgJ3qBUI4kUVM4zU7f5wWTihBTwYCUA87+QicIn+/h0UpfQmtMsPSL9xc/ic5haCdbgJym5EIKVJhoD1HsaIcDzlukTKcxdphg9lqDlPZSyXopfmCaggbvUJEH4Rj6kZub12y2a4y1E9N1HBFCkKaTV3y/P/D+3TuiKLqE8qZLCFjMC2JlkCri+R+wJl9udszyLftzR14UKCkZjaFpe8pkjvAKZwxumLIMxghaRuKkZzAVL16+5HB+R30eGb0jSIsd66lApKmYzzYIHZEmC071PSG2xPMSoyuSMgMU3TgyOkM3NKxWb/Ftj3cCnyY8DyMLPQXU6vM7hFUoZsSLjHrsOHUt3nYEYygWESHM2WSax6f3xMpxOr7javUr1vNrnu7/M6dDRrFY82rxBU13Rz+O5DOP6iR5vsD4iq4RSK1Ic8fYS5QY6cZ79u8rAP7d//W/cLVIiJxiMKCykcfnnmxdoPGYp2ecVyyvDA8fWhblmiS2JEnG6VQR70qulpo4Kjg1T8iQkMQR8zUU6x2h7/Em4GXL0I8wtpgmJdFzjK6Is5S7p3copYhiTVmueLivCUHSdWeqGtarDYenjtfXX3JK9/zZN/+G169viOKCpj7xl//u/+DN1/+cJOv5i//933JsPUG0iGxHFmv6/h7rcrY3N4RBIcTALA9EsacfalSa05rAarViNBVJcs3rFzPSSFDtDUhFa2tuVjP6c4PVH8kyzYt8jm16+pkhSsHtc2TZkOUZuvfE+Rb3JEhnGb2P8WWBRTBfljRVTdCC3a82k0ZJoTFn3n/UWDfS7wWb+fofKSf/6a4/KlS7Y0c0W2AGixlasCVvXy95+D6muvXEq47DYc+5fuDli18xm68QUjBfL/CcyTJFlHm2yxgll2zKgr/+6Z7VrKA+KAq9m1Ki5kS4pD6TOGf5teDutmO93CBXO1Y7S3NWCGUx4URVDyRHj04jmsMDgUDfj8Q6w/vJME+Aef6Ch8PvuH5xgzWKn358oJyviCLwsqLtzjw+HHj58iWBqUrMO0HXPXO1/YKPHx4Y3J6+H1ERSHUmS24oZ1v6vmVeLOi6mBevFrx/fyQETZprrnbfcPf4PXe3jySp4rA/UuQZy8UWKQxt2/Di+i2BLdZIbrYvmZVQV5a+PbLd3vDzzwYJtF2P1gqpBM5pokhixpahG2iqqet7sVxiXUSW5TRdRdU8EqRjdIbn/QGVOLrhjBCBfjyTxCmHU4XwGUIYjmeHCwPz8gofErrTge1yztUq5/B8xhjHue0QUUWc1oigeNw/EScJyP4zB/FwekBoiY4SBt/Rjs944ThWHXEak7Cjbp84Nx9Zb9bc//xu8oqJmNG2BBUjlEQoRx6tOB8fqbtH2v6Zcr5BixTUETs2BHJEFGj7A0miMWNMmkxoksY9UH08o6ViHALGWBZzgwkN3oMdFOlo6NuGKI4IUiGTmGZsSHWKFR2W/P9j7k1+JMvSK7/fHd78bPTZIyIzaq4iu8GGIEBqNRdqCBL0H2uhhSBAI0Gh2SSLxarKzIiMjAifzG1683t30OKaR7I3BVAA0TLAYxNwcxv8uX33fOf8DnX/QO1qEIa21og4ATPSYcnymOP2M3GiMcQMytMyUaxKmv2RJEtAOYgi0iyjaXY0Q0P1uKcsc1zX0Zs9OvLYSJKmP/5R+LuPv+e731ruHyZ++bHAmR9Q+4RYKS6eblH7PXFRU84ynFM4b8A79r7GGEk7wDhBf/IQCu9RBA+iEBYlPMpPZIlnuRTMVgVJkjDZETu2RN6RqhCMmYxFS4H0HmEdyambfrTmxLZ0DM4gdcJ08lYKGQYXe0oseRvW2V740yAkKPMcLTXW/ogowkMax8RSsxvrU31mWI0rJUhijbOnYJC1wUZgQ62q9Jah9xjjv/hg8WDdRNM+0bQtzp08swQltMxTtIbJhOrh0zKZF+XPuBBGEqiTiunRSpOmGmNGrDG8eGiFU8SxYRZ3tK1DuCSQDwj2jiiWZGlM1xtg4gRNOvnmFGdnK4bJcqwsWobhL6TMDVpHCBExTT1OWl5MufKkjE6TY5wgvJCncBEBbq+VwhqBsQ5pLV4GRFikHFL4E1wg1Kq+qOZSwLwsEWJinDxCvXBnw/sqsCFtz8kP/BIY82HFH2qvzUlRDSzdcHhwCG8Das1oLBotZBhSRfi5kXaM44SdEpTUBL4uIYkvQwvaOI5Yp8JrJE4WEy8RwqIjgRSaF4YvJ6xVeMUG6mZEKsnbr79GCIlUCk5NXQBaaZzzvH//jqZriePkZMcIJRI6UixmJYqGWM3R8sf2nllxS1UfGaYGZVLGYcBMG8rsnHZscK6jb2CyE2miaSrF8rqkbmqGcc8Pny3GBmTi0HX0jcGNJy++Tqn6PT4rcTvzAAAgAElEQVRac7HOqYcUZ2O2hzuUUOgoRgrJOBiElVysL4m1YNt3pFlBmivu7j9i2gsuz3/D0/Y7/NTjJFTbiNmZRnuB8Smr1RlnFwnPDy2pWvKzt5fkBdx92qNFjCfh57/4M8rZOdYNGAPtdiDNosClTRz96Fgsrnh8esd6fYXpNePkcX7DNBrGwbNavsJEzxzHjvl8yTDB7ZsbWvE5bApMxv3TR+bza45bzzSFdjojoe177KQYesHN2Wv+9h//D9AZyzLluW45u1ygvWNz6MC1jAzMyiX17sh++4nWjuRRgpgCj3Z99YYoNbRtSxLnXJyvkWqg6ycirXl1e4Z0AozH2I598wNr/W/49t1f8dd//b9Qt3P+2//hL5jslrzI0anE2InXV69xSIYxZbcfGbt7Enp0saQ2LddlDInm2CqMqNGF4DgOlEnO4/2WdjJczeYM04H7O835POPx7h0yn3OwnrXo6IYYTahIvvhqTleNRMMMO7QonXB5veTDU02ici7yBaXU6KtrpHP0/chkLE0fauP1pInzAtNP/wky8T/37U8OqlhJHp8xzwRDJWkPLZevL3Cu5YcfWpKm5ac/f0XzTcOf/fkv6KeJzWaHTjxQcn4B0UpgW0cUL7k+O6f4yxUX5RJnR26uC54eryliQ6JjXr9a8vnunsV6gfBhyGiae1YXb7h5JUEe0XEM44ZvP7xnPrsmLxVRnbDZfeQnb35NffRst1t+9atf8nzfkkQJZpDk+TlaHsjy4Avb73q60bBeXTIOjjTKqOoNZgin6bFPKfUTUVwQRTkysby6/QnWKLSISCLNxfqMb999YHIaGUE39gxmQOeOpms4W52xP/xAmsyQQtJUFdeXr5nPSvwUsW/vWS/foNUM7wYWiwVda8iLFUUOxuQkOVS7mn6QeAnbwyOKlKaeED6sQPsBnp4+I7XieVOBhGmQ3D98z3K1oumeqZo9zg9hMLIRQkmGcUsUKcZeonXEw+MjxjiKWFEdS5JxicbjI0mSF+yPe/JZRtPusRK6qiKbtShyEj0nyxX3j38kKxRuPENFI3bqqZuBokzYHxriKGHsa+pakGUlw1RhrCHLz2jqhsnVNN1ImV1x7J6oumeiROG9IUlimtbRdW0IoOQ+rHQUaJ1R1QNxFlPXA8a3lOmcKJqTZSnDUIeBDk2iSzbbJyKtGEzPw+aBxbLECkU17HEioeu25CvFbj+Q5QXlImcSPcN4YBo9tlYUiwt6N4Fq2B8/s1q+4VjFWCwy8rRmpK2OKC2ZJotOIj7dfSLrMspyhhQPaKlI1Jrd8fDlsuu6hr/667/h7//hkb/6n94wUyX/5eIvuS1fc69alouSwVuqqsW4oOCNo0Ggg19QnFib0oXEuIBIBjTRfF6QpMEHmKUxKoLJGoahI8UQa7AqwqPATcRRhFYR0zBgrSFKEwQSN014b8KwqTS99QyT/bIK9j6E9F78i/6k1AEoJcmzCPBYZ/9Jo5GjKGKUkDTNgLEWJUKYR0qJ1gJjDOMYVvbGhGS7jjVJEjGMY6hIlV8AAiEoowWTCQgpIRXOOaSEKNI4ZzD2Je3uQvhKS+JY4U4zoZAyzL7eYO0U2qFOQ29ghAYVWQkDQ03fgHUxyADdCs8ZjO3pB4c4KcuCoJomWcysLBh3NR6LlPLLEKu0w/mJvrcn88SPoScpJEmiAznADKf7VF/qFoQkVE9PDufliUUbFEYdCYo0Oim3wQsc/K0eqTxZloFPsDZUt4Y2L3lCZSUoLemHCY/+UujgfcDlOXtSla3mZf2OPKnYOLx1TOMXxMCJNRseb5bHCOkYRgNefSnRAoi0pCxmGNthbY2KwkAuTjB/rSQ6FkzTSRmWoXzgBJYijhVCOq6urjg/DxsVKUKtrnOWWEckScLj0xPv3r0n0vGP7FgfnmOcaHQUbCqrxQLTVV+u22pw1LZl21QQJ0xjS5bNSfKY5nBktcjJh4hysWTf/SMzlRL4rxnjeERrS10b5guP82EbIXxKVip0NrB5OpCYGZvnTzTtgbaRSDEyL5e01RZnIq4urvByosxXPDx+QuiYwVisnThblvzxP/wR7f6cs8sbHp++J9WKREsSL5jHEaOcIeKJsZdM04QxhnW55uHxnihJubq8YLt7RirFoXvkefPE0GQUZcbZ+St2+w1CFoy2ZTIZUsB2c0RrTbnQXFyXfPzhkbOzNWNvWJ695nnzAS9n7HZ3XFyGv/P7zTORskg1snn6gV+u/oLKfWIylrppMAaKMibShh8+vaOuG/JSczg883lzJFmsaKodu3rDepkxVILLy1siEgZ7YOzh1cVrut2GP//Jb5hczsgGzEiW5iwXS7aHRxK1Jk0NfTMxdgH7tzn8lr//hy1vv97z29/+n3z101s2D9+S5v8j//6/++/5v//m/2EkZeE8FwvHu48Vx25CRj1a97RTQnoxQ3tQkSBjou06qvGenJL98RNicY5DsF6VZFLipojt9jOzbMXT80Aqn5kiTWcNaZxx/9CQL0ukqSlUiVtP/PDwxM31LfNVwWxvEArKNKFrjuz9QEbKavmKuv6Wqm6RsacdtowHx2y2oljO/z8Nlf8Stz85qDZ9xfPmDm/g4WnDxc0Zwq25/ckZf/c37/jLn/4FRTHnV38m6aeBYZyQ0cjzdk+c9RRpwWHvub5eMy9/ypvLn/Lp7jMxRw7dN7x+8xOQBcVkmUzDbteyvPIsz874/FGRpBF5PmMcW5x+YpYvadoNTbdH6SDV46HMb7m7v0MqyWKZkshziuQ1z/wj68UNZoqpjzVxAkWectgP4CIitebi7JKP33+kHRvidMHT9oE0OiNRBd14oB07rm/PkQo2jxNp1jDLV5ipY/d8IE0TusYBCUI98PnjyHJxyddvbqnrDXkeU6QL0jhn7LtQr+g1/eCR2lI1O6rjnjzPQOxRsaQbO/rR8bwfSDJo+5Zd1ZKkBcYKZsuSUQVoeKYlm12DiEwoHeifQYxk6YqmrTBGIYQmywq2uxrvco47g8fgxYDtZlxeXuGRbDc1Vu7QScSxqrG9J4oTRtchowKpFA9P37NcrGkOEyLq2W4HfvPrf8Wn7x+JYovwnuZYY6aWJMvoxiNKZrhpRhorptGynL3F+g14zWpxyzRNFPk5kmeQNWKMOVYb8lLhTEoUhw/rrqtwRqHIQFi6ukeLksN2z3oZMytnCN1wsb5mfzhQZldYI4h1RN8fsFYQ6+z0YT6hk4TJHMlmgrZv8Fi6sed8XbLftkTCMl/ccNhvWa8Sur5nHByr5Zym3RIXl4zTgHEGFSUnfyTEcczkjkx9H1LQiWO5WDOMhvPVGo9mHFuSJFTVutH/J+vF1dman//ZNeZxzr/x/561usB5aKqKNCko3sTc3KyQIqKfagQiMDQngfKhb14IiTUOlCNOFFksKZOYLJ3RT4ZhaFFS4SZ7GiAkVgSgulSKyXrMNKGVxJ0mPy8d+/5ApgqU0IzThBUOJx1dZ05Bq1OS+yUlj8E7gRfihEuyxEoRRTHDEAotpNAn5dSQZiq8D32osZTe4FzAV2ltGWzLOE2ngIz5ouJ5/4JnEif182VYtYyTY7Jh8JOnVbQUQV0OxQFBLRNCnFLpjihKGE/KqhAnZdh7pHbAyDCFmtTw0gRklZcxNr3CdA6HQ58GcEGA4AffJvxTyVfKoJpO43AamOWJCOAxdiJNQGlJs2+wTiJVHPyeToCcGG0FRuL9if8pTigtGUoShtExTQEf5ZzDnvThRCuUgLE3p9V5CGZZ60hjTZalHKuGyThizUlxDENfHEWYyTKOIWD1guxynlDOYOzJS6uQ8sRZPX1FkSJJIg7NiRLACxIthNmiSCNkBJxqqhAIBd6CkmHgr9twspBKILwKd20tkQ4HimG0SJ2dgm+hvtU7i3cCKXPevPkJSgfA/4tiH8cJaRI4yL///R9o25Y4STFm+oI0k0JQFBGehro9MJmWrj1+uW4nb4izObq2eALuULiC/eaBSCmGXuOdAZeAT0gTQEKcGqJJoFXB+blk+/zMbJYzXxaMrQs5g3pPObvg8vI1z8/3KDlx2B84X10wDDVmCjW67dAyGo8XDU3fBV8yjrQ8R9iUOJn4/Ok7rtNLVJKCWTJbrjGuIs4W2KZGuoTj45YIRX3oubjuQoYiT9gfHjgeOhZnmg/ff4fSCVGS0TSef/3znzIOE32nyHOJ5Yh3YRNatTuSQtPUhkgXXF+9YrP9jFY5s/maru0ps4zt5oFD1RHFGdZ6tJYMY0V9PIZacdEyjqC1xouO3eaBrmsp8jdkheTju/cUacHu6QEtBqrhE1F7idA5Hz5/IJcpOo45W8T88OkdqUzYHI88b+/4+a+umdyBXErGcWTsLJE0tI3hsDekqcDZFGMqIiX43d/9r+h0zdWbCFtLvvvwPzPHcnOxxmcZ427D8/Y7ts2eJH/LzU3CDx82yCTDRB39IUKqOakUKL/lq9cz3lxfsHn4juMhpkKSqQSTG77//MBqfc1u6Di/XJOtJpqjI1cF9TSwaRt+dj1HiyVFmfL++R07J/hqkXOsd1jbgxd88+ERtMedKAd+UMyLnKGq6OqBIk3x1pIXc/rhR/HkP/ftT+Op1gvWxZyzxYq3by8wPmZyCfnlyH/xX7/m6ragqQxffX3D0+bA9nmPpUOrnMeHT/zy1ysePjwzi+fEieOH+28Yp4naPJIUnvef/8DZZYoeHM3e0rkdrrvjw+eR5flXmOmJJPUcmh1pZvn9Hx6Zz2aMo4JR8dQdKGcFWXzG1cVrrIHV/IwyO+PQ/ECUwG4H55cLhJp4nd+wXFww9Z8wruNydU1zOJJGOVm+pu0lX30Vc3P2Z5RFzO//+B2d2dD3I4vFmqfHR8Sxh4uwhkBZrJfUY0M/OdCGx/uaWKWkUcSxOuK9QfoNfZdydjbDMbJ5OKJkx3y9oB9qklzxzTefWL/+zMXiz7l/umNwlljFHLcO1EBvasSk6YaetZo4u7jl8ekzQkN7bMnzlCJbcIjv6NqJ2SxGacn93Sdevb7FTi/qhCaKYg71A7NlzrK4IUonBJqr62vaLkKiMUPg3vVuCCffOCZJFH6CqfekkaL3GqkKmqbCesfUBvVR+znj8IQzOVlmqSsLDrxQ7Hd7Votz2i4lSSLSJKFtRnb9BqUc0yTJi4y22ZHN5vSNJ4pGJnMkUo4yK5BK44ykMy1jH+N9RtOdmn9UTBwVnK1LtJhDMtC2LXl6xmK+RmnF8fgA3lE1z0RqRpJExJHHTDHC9xg7YsUBaSOypMAVDdgeJcIaNo5LtNK03YSzI2aKiKI1eb7Ajj1uMEQiBR2qaJVS7Hc70qzk4uycqhpxIqByPAnGGfLix9PrYr7m7U+vWf3HtyT7s6CQCYHWGqEkMnJY26M0lEVEqjNUnLA97kh1ipCSydRIG15zI4LncHSerjrgccRoIqHorT95Iw1GCISMEMYwmZ44jvDCM4wDsTil4o1jGKuTehYGt1hHeBNGIGRQpxAq4KHcP/2LEkI1OtXE6Zymc+EgBV9UuTjSGDfRj334jlNDVRoHvNU4EAZLXtqDPHESg1CM0/CFQYoI8H0pw+MfzY+P6WVAsqY/0aheYk2B8xppRZ6VpyGnOynBHu8dSapIEkndTGE49CGhH1qmBNXoOU4WJ4IH8yVAlpxUX7sfAsQ/OIXBW2ItmcxE2w0nBNoLMQHAYW1ARYVBMAx4xlikNqGwoPdYOw8DHcHzKvDEOsJOocXLu9BG5V1QiAMqL4T/vEhOyfqgbkZRGDCbtsU6dVJVw/pfCFAyxhpwXoZkfgDPAsEGEEcRxgnsCVrwoqULIdCRQCiNMebELD0F0UIqDYFknDzGihCi4xTgEoGp6plo2+6ErXrBnoX3WSrD8bijH0KLnRAepDwddDxFXjKfXVOWC6ZxOlkGglofRRHOOR4eHnn3/j0qikIIUEjC0OxRKmK1WpCtNI/5M0pDH/Vffrv7vjuVVYRDY1cJruaXtP0zOpbsD3tiuaBrK+oKFnNNa5457B+Jo5jry7ccqw3kBfgjVdVwVpzhhEXIgjRLONY1OlIwar5++zpsA7OcyFiG6YiZHOMgMRxJypJUg3cTcSQZrGB+/hVaK47VyO3VFVpKBhraydO1HWVq6J4jbi8veNy8Y764ZfN0D15wvl5T1x34ES0yUn0Z1tVRx27TMY5vKMqENI3p2p40K0mKjrarqfsNWZtgXMFyuUDrGJxgqCvAsSpXCB8yBhkJiSpZzGM+PbVEUrN7PnBxtaAe7qnrmPPzNc3R0lYVSQI6FWBvub36CRdnJb1r+bS9x4sMqVOM7xnNyGyu6AfLJBvKlWbzfIfxUJznjNIyuho1CZqHijKd0/XPmL0iTZekWYJWkqk3OAxZKbn91Suk/YzX8P6732L3A+QJIho4bCpub9fsB0sZjVSVo6kcftwhRM75bEE7DsznGUmyIkmueK4fWV7P+cM3NbPbax4PP1A/GkS84uz1NQ+ffyDPFJOT+MjR25rjcWA5z2mHLYMvGApHy0RUpDRTzdTs2beGeZFDJCjXJc0mWPqyuKfUN5i0R1nF7fk1VVOzOp/T7Np/1jD5L3n7k4Pq9c05sSi4vnmLcZpkBp/vK3bVB6ap53l/z/n6hrp2VNUBY1sWsyvarmNslwzDAj9uGKeIh+dvwEcs5wt+9/v3/Ppnb3jYfAvRkqaOqSvL5eWCd+83fPO7f+Tf/tsLylnG4+NnylnB9qkiS2cIc8O89Nw/3SFFR5JOaJWzWKS8uvkFx0PHD3e/I04NWXxGschxjKRxjncxwzAwmhZchLENWVYSK0+SvmZ7bIlSQ9O2CNFz/eqcw1Fyvr7heHhCacNiNef5uAGX0eoNeZ7hsWz2zyityWaCw/GJygu6dsDZnjxTaAW7Q0VbbUEmDGMDkUHLGcVswQ8P/zu1+kw3TMzSG6ReQBRCGmZs6YYHxqnHY/nhU0OidpSzjN22J80EUbzi7OKMbZ3T9R1pHoIOWS6Yph4hNF1fMbuck4sCr3McCYf2B1IX4W2GFEekNggRIXxCyEkUWD0gs5pUapRYcaxqZBQjpGI5u6HtOqTuA5YIWCznOCLaLoCi+/4TTtQgOsqlpxsq5rMbpBpom46+NeSpxpqGYTyik+yLpyyOC7q+QoqcyYUwl5SQZUsiteA43lPMU+xYYqxE2gIzjaRJQRInPD5tWSzOiXRE01Zc31zSdBIlU8apRwqo6y7UOsYx83LFofrEbJ4Rxxrhg1pbHSa8M5SzlLrtyJMclUjmesE4TtTNls1mSxYviKOcpmuI4uBTEiQ83XdcXkWUaYIfKwQwm91w/3BPlir6dvxy3YnG8LP4Ld8lS1oIctLpA7VpO8wQMEDOe2KZ0dUdOvZgwNgRpGfoe5hCX7UQFuvB2BBc0UoincI4iwVm5ZJxHOm7Cjd6kAqQGGuZxh6PJMoWIXBCjE5kWNk7wWQnhtEzekU+m2Nlj5sMEPru3QtiSTikDwqYZ2J7fOBYB8C2PNVfSqXwAqqmpw90fryHyUyURUIUKerGnJBULnTPO4/SQYWzPqzhwZ/8pJzqGoOqKEQI5zjvSOKIOBY0XY91Ivhqwx6cJInxXtL348lKEXy3oVjAYixYJ09jEngv8cIRRY4oCp3mgRkr8S60MkVRGIYQI945hNbBFuBBa4XWCufHoDzLEOoKuCt1+rn6pPgG9b0bemItWc8uOQrLlvD7E3ytgjTJWC1KhqYOIazTUOiFxZ2U7nGCyYIjDKkv+ClrDV3XhPpFdBicT+EwKS3GjCAExvoXlAAvs2qRx5ydl2x34+kwFfyvQoT7dRgGY/En328Ilb1sAYKar3yCsX2w3J4KD0AgpcHaATMJpIjCcxUAoakpPh0KpSBUssow+Dov0EqRZ3Pms6uAzPIW4SXj9OKBhaHv+fvf/vakHhbBm3qyUXgEURyT5wm1uOf79f/FrXmNiNSX67brdyyX12HDMcTM5gllegVu4lBXTB6kB2s7mrFHDSPOJBT5GePQ8+GHb4lTjzEaqTrGNqc8K9n3e5xVDJPhw+d33F5f4ElAJcH3Og4oPYAMh18dwTgKlMxpx5p5HmPsnna0ZMuU+TJj87TlWH9mNr9ge7enaifms4yjdcTxDCMSllcLstLxN3/7mZvrP0fFCZ6Rm6+WfPywZ72+5v3Hv+PifM3xsOXbb/9IPvNUxyNaJazXlyhlqdojRb5itTrn4emem4szhm4iy1OeN880jSW7uWRVzhk7g84zoiiiObbEUcHl2yvG7nRg8IBuUdEaKTNmy5gsk3T1I7bdMV9d0wwGiaA/TKyv36KUoBuOSGXJ8pL98Z6uqjhfnHF9G2rT+7Hm7u6RoowYx5E8KdntdyRZxDiNjENLUebkc8V9NdDbgbI4p+9qHj+PFInkYbNH0YHNSfE4n9K7mKrp2R2/xYxLoiTFK0mkC6JMsv/wCTEVyKjhcSMwk2dflPR2z+vZJdocaWrDL372inb7iJmOHJ2i3x2YBoPKHKZ3LOYxu6HiuNlyff2Kx33Foixo6j7kW3Acmor1xQVXV2f87uFvScqUi/Nz3OC5Xt6w9gLTOS4vr3neb3DW/LMHyn+p258cVKNMIqVh2+3J5zkPDzteffUV3btHZiYiTecgJGayRFFGEi8pixVSPfLV15c8b7Ys5iugABfxuP09u0NCPo/4/PAEAp6fKpQueLjfECdzXt/8lLFeMDSC5eqM/XYXEptiwdXVgu1Tz/JswXz1M6ahZrW44e7+jkhJBJbz8zVeHHh43COWMReXJeNoaNua169e88PH72m6Axfr1xRpTn0YQU7EyRlx0nF3f0+RrTi7vMINDavVMqzO6NEailLx+W5EyhilO5qhZT5bUfc78nRFKud4b+gHQ5SMzIoVbW0oixlx2rOvHji7KGgOHa+ia47VkX33wM9/c8Pf/octffOJX/5Co3XCcfqO2igWxTnDBpK0wvkJa+c05gG4YLetefuzhK7b8bs/fs84dbx6/QYtJV3bsDrLGLsR6ybSLMUaQBqSOOPT/RM3tyuGgZAYl9A2D8TJhOaGJC6xfcPF6pzd5gGd9rRdjyVGsufNzWv62uMsdDXoWGN8SzMciNIZrnsCrynzW7w88On+M7NixjRNHI9bzs9XHJqWKJqAsJYfxg4zTewOW0Ybo5hwvg8rOjnRDz1popFjTt+MeDsGTuSgKUp/6ifuaNsGKT2T7XHWoZKYaeq4e/iePJ9hJs9yfh7Wz5MkSSKM3+EnQgoahRKaQ/2ZJJYkaUlfD9RNQ6TOGUxP0+yY5QvKdEYWzdnujpTFEik0+90jsUxZLc/ZPPVcX5yRKo07tixUQT/W+N5Sximaidki/3LdjWPH7eHfUccdH3jCu6AOBTXQUO0Hbq5L4iTCe08Ua5yYcAxIneLkhIpUWCMLF76MQwJZOscphTEt0juUsDTNDqRGaQ3OEWlNNzm60aJUQLc4pXFqwNiRSCxDIrVvqVpNPyY0o8RLQ1nGKAHOGfqup6pCAQA+oHisCVzU3f4Du73AOY2UCuPDOi+KFf1oGYdADZAKpnFCiZw0zTjW1SlcpU5Dokep06jzUhAgNd6AiiRSQt+bMKQjQjhHWPACKWOEiPCEIE8IIgVChjWWYZhOsH1xCqIJkjjG2LBSF18CWOHnWmXpLZhJovBI7KlZCgSOvu/DYCTlaaAOauE09aEBzv1oCXDWBj9oEtbF0+gQIj55f08qoA4DYN+bU9XqqSJLOOIoZpZnTF0ffLtKfBm6nQyD4WQE4+ROXNxgfwhuBgtOhLT4yYbwQnJQKhx0psli7YlacBq4nQ9Ir7YPNbH+5Kd1/sU16041sqFC9vQCBKuDhzRPWcwKnp6r03MEb0NJhPPuFOACazUidAyfShrCOCmlQLzUpvJSp8CJUqFYLC7IkhJjDUJqXkJzSkmkgPuHO+7uPhEnycm/+hIxEzg8cazQscD6CZ044tJy/+5HjyraYwne3avzt1xdzvn0/R+IY8e+2+MFoT5cSs4vl/TDPWaIkbpkdzxQFhY/FdhJEMUReZnRTw11f+BQPeMqQZJLJj8gIokVFqk0bbvDe81yXSC9RigYh4G6esZ4R6Qjhqkniy/xbmDz+Ij1CSJfhDBV3eBszzgNWK9x9p7vn56ZzwTO57S9Au35x2//AQmUpsD4ibvNu4A/a3pU5JHxyDgKhr5FFpb7pz9y2Decra9BWJyY0DpDRZLN8z3lLCKJFNF8gVQSJ3OINxwORxZJQm8n8rxg8iPL85LHx2eSdMl8eWS335AmS+bzJUWasEgjYu3pmfh4d8/1akniNHkeM7RHxt7QtQce744kiSTNz1gvr9ntNmw3R958fU5fNQgsSkeU85i2O6B0SbV7JIsWRCrh7vM9TVsxOUWqIh7uHkMT3S4MjVIsubyZs/m8YTAH2qlAuIgyB+NGdJQjREI+z3ncP9KOWw4Pd1zM19jOARODWHB1sUT5kYv1r3h1W5DPLN//UFPkK0Rfctw8wbynMRNjNfG4/UixvCDTKbv9Z+pqJNMNDrjbfWIRz5mMQTSC/T/eEy0y2n7ku6dnytzjh5JiqaiGA8q27HY1r65/bF37z32Tf+o/Pz/+kXbcc7+/Y9P+A7v+d3z3/m+QhFTo9fUFw9jQDk9EsSTSCUI40iwhjuFq/YokO+fVzS1xdMar61+TJAu+vv45eT7j669/w1dvf0melyxXZyxWa65vv+LX/+oX/OI3bxk6z1dfX2Imx2q9Yr2+YnVe4J3l5voGJc6I4xwhJy7Pb7Gmoal6Vss1q/lrpIpJ4oRIzri6WnM4bJnPC4p8RjccKaIyhGaWKdVwxFhLlpYsznPaUfH0uMO5ns32HhXFNE3DYXdE+ZRUrzib/5wsesVh3zMNUJYR2+1HEJCm5ywWrxAi1IPOZytidUsSJ+yrH5gXF3SdBd3SDJ9ZLHL+m2Xv5V4AACAASURBVP/q37HO33L3Q837D+/Y109MYst2+8BhVyFcTppKjBtx9Bzrll/++i1PmyOTbdgePqAUjH2PcIRe9mGkH2oO1UOA5LsUFU9Yb0DWRHqJc3FA26gY6yCKFkiVMHQdcWqpqiOgqeuGYaxA79CRI40UZxfPFOlImUiUGoijBcNQs929Y7lYMo0Nz0/v6dsKNzmaY4+3jt3he969/weaZk+Wxux2e46Hjnn5miQ5o+0G+jZi6D1TJ+jaPVX1BFikshyO3yJ0jZKKoe+ZzWY4P7E7PGJ8y77eUjcjeZaw3X/C2AYZ9TTtM2m8pO0q9vs7JAlltg6eTjFRdTVCOdpmYl9VPO9HDlWM0AusV2jtKbKMtm3w1pNEBo2hiEuESznWB8apZj6LWZ8tQM75/vEDLoZ+VKRFhPETIvYcm8+ksUUbiW/tl+tud2yYxpHVOkfp00euCANDpBWb7YG6H5hMR1s39OOEIaSPp9GiXcaiXJMkKdPYhfU0mjhReNdxOD7TTyOjnxhdh7E9U9/inMcJy+gHoiSlKAukCqD4YWiwjCAV3Qi7RrDZJzwfE6pOnniQ4YPdeEBGJHnOcr1kuVwwm5dBkchjimxBmd0Sq+IULHrhcVqU8l+UQ5w/eSBDwYBxHuMEUurQzU5InlvbME4t3kvESQ32HuJIB6C/+7ERycOXBqyx7+n7sNKGF39r8FAqHewAX9BUL/5dHJO1GH9SWTkNy9KR6GBCnYw/rYzD1wv6xhjPZE5q32kmlULgMXRjx2RdaAN9YbkKvvgupykMfpz8oEoSPPpCMhmH8UFhxgUTA7jAov3yWELwyPnQrOW9ZTKBB+ttSI15EQb5SIXXexxPnl4X6kpD/alEaXUKaJ2AVx5sEKPxWNqhpZ+m09vqv7y2SknW8xlZnH7BWb3844QPK1wm+uZ0MCV4doUPancUaZI4C01f8uQpOVkPpAzvd9f0mJO9Qfjgz9colssl52c3eAK4359UXgCEYLfbc/fwHhW92GlPBwzhT5SEKBAW4ppD+UCkI7b7Dce2+XLdPj1vOdYjWZ5w//Ce3/79txybChFpvKxp+gfS2Yyvvn5L2+0osgvqtsd6TbbImJ3NGZ0lnSn2Vc1gLHvb0EyGpmuYxoEs0+yrj7StYVYuyWczhlGzWn3Nbv9EkS3wdqRt99TDJ7xv6bqB+tgwthNJNGMYDrTNFjsp6mrESUtU5Eyuoe93RDEsVwl4GM3I+fkZTXvPp0/f0g8V+/0WLya61nF7fY2QCqkiPLDbfcbZnmnaM00td5t3NO2O3W7Du3e/YzKGpj/Q20fatuds+ZblQlJXW5pmYDSOyQwkecxhfKRqdxzHA/umJstyxmHkYvkK5zzP+2fM0FDEGcSG1sZ43yF9i0oE5brg/vNHpnHEtBrlY3Bwvjqj3njsNPL8fEcaS8bagm0xxmOsYhwV6+V5MFjblCgyfP/+Oz5+/MQ4KfJixeb5jv1xT9PuKZcpaZKzXi1xoyXWS75++5bBTKzKK75+9QqMZBohSgX7XUPb7JFArFMulm94dXuLjBO8SLk4v2Kc9qEqWHg+fv6IGSa8iHiuKppxROk4lBS0Fe3xGdPWGFWx2T2w3T6w72oO+w2aEeeeqNs7Nk/fUDdP7KodsY6xpsU4za7asz8cOPYNz881Z+fzH7dh/z+4/clBtW0ExjnidGKaDOMw8rj5A1VzxzgZds8HXt2eMQ4TAkuU1OgoVN0tF+csFjPevHqFtTvKmeDy7Kf85Otfg02Y59fUBwtOkkYrFrMZy/kV0hc8b/akaY5zEc6PZGnKYdtRzmbcXv0KaxR3nx+IozKk/qOE0Qi8VDxs7mi6Az/96U+4OPspVd1T1fcMw8Tx0NF1O4T32NGwOz5iga6vGPuBsTNEMiGNNNV2IomXbHcV/bgNK9PY0/cTRX6B1DWH4xOvX92wKK9Zr64R0hHpnOroqJsDY+8QIkPHEbvmPcYb8nKBFAV5PuN5t+FQfUJ4weZhQ5xYpFIMneJ89ZqF+gWFvMDbkeVacb6+IdZXLOa3KBWjkxoVBx7qfr/FO4dSjr6H0UToaOS4qzCTp0jP0JHCqj1xYTA2Zrm65v5uz8Pnhv22YRo68uiCWfQW6TTCxhwOFR8/vePy8i1MN6TxmkiXCL/gj99teHr2NG1JWmYs5hfM8zdEsiSOwweqcSMy6pimGi1j4jhiMD39ZJnsRDcd+Pz4AaEUdSMQMkPJOc7ktC3MZ+fMyzeYKSJWZ6TRBU3lQUx4JyiyW8r8hn7YMY6espgzjZb5bEUSx+TZCqU0bXdESgNi4uPnb4gLw3E44LwhVQptJdKkRFFMlq7ox4pj9UhZLLi++oq+EeBiFEvK4opZeclsdokxmrGX2EmSpxFDd6DvQiPJbH6O0hG3r9ZIqZjExHNzoHUNx6bDO4PrHGW24Lnef7nuhqmnH1tmy4g0i0+hpLCilerEH20M1lmSTIKwtO2IkimRFjjfY8yEwWPUiBcjwvcMtqeZapytwY2MQ4P0kjJao4kYuxHnNQaHswO4kBYWwjJNE9MUUzUJnx4NHx4nqg488uRLdTgDQz8wtA2mH/HGo1VMmuUU5YLZYsny/AynUp62EcbPyYsZaZaSpglxkjKOkqqyWBt0LLwNIZtYM5mJcTKBrymDXqakxwtD1/WYyZ6g8B4pLHESESc5nugUvpFhSPSexaxgsVgCpwrQE/MUwLiOYeyw9mVQCX8qrRuxrg3oo5PXVbzUd0qPVC4cKnzwun4JaGFxwgVLxWkwD98POtIURR6sC/akXvqTH1V4pLKnrXtQz1+wVVIKZmVBEuVMowjhqlMyHSQeQ296RiuQQv3I5neeWErSNGIyE/aFcQon1ViSZDHW2xPyKtynswbvHHGiURq6rsPbE5OXQFoQ0pPFmlgppsHiXwZZ8eJRDQ+vH8bwHHFflOqQNJuYuj5MikKE6fM00IfAU/DXG+u+3Flwqk4kCVydZYEV6z3CW5QIGnqaJfzi5z9HKfVFvX2hRlhj6JqWd+/+gOP45T0LvwvhMBQwVhKlHHJe8X79v/G8fWKzOTD/J5uQ8/U1XX+knzq6vudh+x06GQOyKbKBOiA8u8Mj01TRdQ1e9bTjM91Ys9l/RmjP4GpEBPV0xKJQUUw5izk7O2fsBNIWLGY5D3d3WAYmf6TuDmRZ2OxtdxtQHUppmnrA+4L5YsnuuKWqOyaT0I97nvbf4qUlzTQJmsSWJNFIUx/oe8FyfkWsUtr2gLUDSRpxfv4aqaCpa4p8jvEpKlFkesZCllwUC4Z+y7HZ8/BwTxwZmrrCDhGzYsHu+YnPd98wDD1KKZrxifcfPuCl5/7pPdIn5ElCczgQa4eIe0xfYcYUF8HgjjSVoUwvub5d0PTPPD7fcXe3w06COJV4AZ15pOqfqZsjo7EI1ZDGC5x3bJ42KFXzvP0eLSLO1iW73SPOeIauxQwDDDnSpOx3Twjf0dQ7xrFmVuacry847mqsqcgydWqxCwUaSks+3r1ndTbD25g4ykizjLGTJNGMrqkYWxF4tYMAFJEqKFczGtOhopQ0i+m7Gt9ZquaO9+8+UO8Nw1iz3x24vFqwXGsUS27Ta7JyRjy/RKuIrvJMxERpwvZugxsyVqsZnz48o1SC1BFPu8dQxRyHzWHTdDw/bxiGHmcnlqsSnUiO3e6fP1H+C93+5Oq/KFbUzRP18Ih7zpgV59TdPT4WtP0T+/2Gflrwy1/+Od99e083PJFnLW2VsVyV5Lki1im+t9TVjixT5HFOEkusibi/f2K/f8ZMitmsBBvT9nuSJChs49CjZMJvfvMzfv8Pd1jjybMZkpK6OnJxYUBkzGdv+Obdf+T2zYKubzBmxtPmCUSEkBPH6pnFcoUQI7v9PVrOKeYF20NNVkiapqY5TmiliCL4/v174njBbLai7jqkkrT9niyfYXpFVvR0w4SbGpR2xLGkLOaMY828WDMMAavxvH3k7df/mpkw3D9+y3xZsZhd4NWMfqxOfD6LmY5Ees53778hyySX12d4JxiPcHPzcz733zCf5XgEbQ1n64LHp4nZXPH9+/fIeOJstebu05HN5onRPLOyKav5/0vde/3IlqXZfb9tjg8faa8p213NoTgzhAQ+CRAE8M8XIU4Tw+np6uqqW3VNurDHm230sONW8akf5CgFkLj3KTLjZESeb69vrd+6ojMNi6ygbktuFtekERyeBqbeUcxvqKaa7XZBnuSkaUhd12fBuTyQpbdM48BisaI6j2w2c7Lilv3+zDiUODmx21s0LZtNTtd6lK5w1mCHjMYfGccANc7zDB0p8iKmHSxFcU9THTgeH3n7xTfEag6MoCs+fnxmtS1YzNZk6RY7TawW18wWKw6HA84IFvnvmM9uMWPEfv+ETgcWiw1Nd8a6hqvFFXFUcNiVeNHgBaRJgPP3fcPpNDI5aPsaZwecmyhmC0YB1jUURR68qHnK09MDYMizHOEzmv6EsR2b9YrT/j3V2eC9YLFKWM4W9FPDMAje/fJInCQslxneSxwei8JYS5InzKIcakfXlpy73xKWq8WCLMkQHRRFTFWOF1/mZWB1nvNp4OY6xU4T4zjgL2lurAtKqbHk2QyExVuDEpJxMugoJck81owYZyjSBQJFpIOn0nDpq7/0r8fxnMkI6tbStEER9IEnBNhAGzAW5wLrVKDAg5ksbpguSiZcDIl4EdBQeHUJZIF3waMppeDjYwteks/WFMIQXUJIm9UCvCCOPFlmQqXlRY2L4xxvJd5NwQToLyxNYTGmwxp7ScTLXwfWKJFIHYYSGaSzMAAqEWoxL2Eof1FT8R6lPSqyOCTOhzX755cmVRgypwsKSgBeBGyVZApQf5/yWYJ0hCaoWIPQBtN7EDqokD40KQWvqglcUSeDH/SiUCoZ7CDD2DKOYyBZuM/sVQ9MNH3NqTRIGYbjsKJ3REoR6Yi6MUyTQSdhXS5EuOEKAYOxTNYF5TKQxrDOYH2P1DlRHGMrg74oacIHtVnYgalPcSgcDnUZ/v0FGyaVYJpCW5lUEFTeoJpKL7BGMA4epTReBkuBdwIlBUUWY0ywF0gRDkgegXcK7we8rVFC47xCyDDvSiF4dX/P5mp7wZcFBd25UBoRyYiXl0807TNxoug6Q5zpi7oecGVB/hWI2DEtT2iWtNOerFhQZKtfP7fhOhuapmS+esXt/Rrvzjw9fyLNM7L4iiyb0/UvZMmM4+mRKIqQcsSYkjTZAoJp6pDRwPl8ZvRHhn5ks9qCFxx2R7br1zgrqOsKnUdEeShcWc4WvHv/Z6wxzFcJYw9JVuDFgCCjmGn257+AK9A6xjnDsXxhs4rwNby633Iaah53ls1mi+0j8lTRTRVtB5v1DciR3e6FJIp43P0nyukPfHm/xPYNi9Ubvnr9CuHm9NGe988ld5u3RCpjbDVJoRm6BBX1FPOIY/mRNC2Qkcb6kXYoiaKIonDsXo4kSYYdOyLvWc6X7Nsjjoxj/cAwwipdk6gCKQzL/IYsdZz3HctigRtasAqlR5qqY70pUCKhbU+UVcd8njCMDq0ijscT1sJkQqNjmo5czdbsds/YtmK1ukGnA7tjjYyWnMsDo6l+DTtqVTD0PW1/Zr26JUszyvqA8J6ycqwXBdYaNtsZk+841w1SN0Rx2FyusjmHYxm2mj5sbnozELkMrR1RasBqBJblYsusyJkXKxbbW+JJc6cNRWtYJAX7jyVv7+/43//pPzNLosCDjTsWRceb+68wxjJPW0ScY52lHzr6riNNNG3VsJgVjGNPVfeXA9v/Nx5/U1Hdbrco7UmjELbYrO7Iojv66YFh6InSgefnHXVThV5woUizhMHsONfv6aYXfvrlX+iGHuclbddyOO5wTnB1dUM/1JhRI3xC3/doHdH2Z5Io4+npI9bV1GUAyv/H//i/UpYNp/KBabJcX10zTQOn055parB25OHhHYtVwv3ttzx+2tPUz2RpEkJYwtIPDcZYllez0AGvufRyG8axDavh4cDEiFeKuntmNDXex0y243w6orTnVP5EN+ywduDp+ZHrmxlxApKccZAgJqrmEcuJ3cuexfweYzVSphzPO4xrceLIYmtYb9YslwuUlCgRUxQzhPDc3W+JtKCsTtRnxXrzhpfdCzo9kM8cr2+/I9M3rJa3TGZgtbhhtdqANLTDgXNb8u7TB4g08+UNbd9gR4V2KdpuieSEsw3ffnvF11++QQnHZjsLXrrpSJJKFkvPzdUVUSTIcsHN/RItl7x5/ZY4LpA+I05imvEjk2upuh39dEJHKcZEDN1EmiiUSqi7itlK0dsKqQfMVKF1gjVh1Tq6HUkxUVaPDH0D1lOVZ4axwooDSZpQVXuyPOL+7p44jpDCkWaOtLAYYxnHEWNa1usVLy8lcaRYrDSrTVBSzKhZzu/IsgWrxT3L2ZK2P9K4J3xkiNKYrm0oipRXr75mNfsOM1lmi5jVekscz4lzQ28e+PDwPQ9PfyFNFzgxMLmWvhfEeUE9nJCJZnAD5/qRpqpwk2AYJs7VGWcEdnBID7Mipx33xPlv8fikXOPqCG8tV9sCrX/NTQPhBn86NmHAUylplFNEGZmMGJsRgaYbLV09UogMbaPg2fSOWCmsifBOk8U5bd9wrHdM3oKOSVRGRIYkR6slki3WbJByS5TO0bEEprA2b3q6uqFtKvqhCfguY7ECvBKoVBMXKVGeoJMEKSOckYz9RNc21NWZpjrTtxV909K1Hf0w4oUnn8dsr9fc3t1xd3dPms7wLme5uOLu5pbb6xvubm64vrpCywVKzpjPZxR5TpqkpEmC9xNt1wYOqwgJb+EESoTr2DYD4wBSXpQzFFJ6rBuZjIFLal96CS5Uv0Y6sEexoIS6KJECgWU0Lf1gLs/zW2pdSY+1PXXT4Zy4gPrlRel0SD2EAwVcvmfQCZX0qOiCByOg+ML3C+8T7yf6YWCyJgzFzgbKiHCkSUQcxWENLhRhgR0OOzoKq3FjJcb64GEV/OrLVJEOaX8XXptzYVj0XmBMT993QW0VIdT3maYgpSDJUoZxohvG4CO+XGtPgPVrrTDmYqXlNyVXCkeUELYAF8vEZ4VYSIkSIaRWlQ3Wic+YiFDe4ARCKEYrqTt/OdSFsNt6teDtF2+YzHTxC4fvKkR4T7RNzV//GtjPwyAuKvBvPzMXq4AAorVh9+qfsIMiieeMvafvf1v9t22LcAtWi1usMex2Rx4eXqjqkrFLEUIyDCNff/UHutqRpwvm8TVYzTxbIW1G31ZomRCrhDSWeNEymobjaU/T7UhyRdV0PL2cEPHA4fREEl2jogQZSaRKg5++s5hJkBcavGEYG4o8ZTRHpqmjyK7YrDYwlqSFoifmOHzADJq+PvHw+I7Wlhyrn2i7FqUFWZZyLp9JkoQvvrrH2olCeEznmW83nP2Zd/sdN2++oWs6Ug/WTHRti3ED1ipe3b9hll9zOtbUzUDXel69XdMNFUhJ2X5gdzwQJRkWR2wycrWkbt5TlR2R0shIkswc79+9w04RTedZzDcMw5m633E6dgxdT9WcWRUbFrM5kQr87zhRFLMrojzGOM9mO8ejMd5jqVltBGlmgYG6e8exqYjnE0JmCAljNyH9SKwaTNPSnEv62pJFM/p2ZBxquvbE48M7jLEc9g+8vDyCnHg5PtCNHaM98/KywzCyWK6YekNV7pgGhzcKaydGF0GUMIwjUar59ve/R6sVTVciIkuWLjkeT5y78H652bzh5v4Vq2LGlWr4duH5X/7Hf8dqEZOpNX/3h69ROJbznCwOGY3yXJMkgpvtmu1qSX0IM8LpcKJtO4bh/ycVqlpFzOdLvE1Zrz1eHFhvI1AFTDf0Q0O66Pn06QNZOidLM5xVIAd2xyestCzmVwz2yPXNa9pyoh0eOZ2P7I87dOxo6p7ff/st7z/8zOHwgpCWU/lIliUsVzmnQ8mfv/8TXTcw9B2NreiGiWF/YhoUOuoYTcft9Q0vu0+cx4+87Aq8HzCTpG4eSOKM83FP1Z7xYqCbTuzLEpzhUA6kmUTFMZ+e3hFFK1bXtzzvS9zwC3mxRCJpuzN1dWI+j1Cq4PnlLyxnc8Zxy/v3j4ioR+iO+ixZLtbEUUrvBtJc8rL7hFQ1SXSHFBHWpNTdkVWWksZ3CLNmsZ14HI9It+XmruDL+3+LGaDpj1ib0DUKoQImq28IJ6AuoevPLNNX7F92WN8yX2ZMVhGrFU33yHq15Hh6j/eew/FAnATlpVjG2NGhVcn19isO+w90nQcxY3OtWS5fcT4+sdlsqH98wqsG4yL2xyP53OFFzXa9pZ9OCC345cMDSWop6x5rInQaIZwiST3raM2n5zNoT/UykkYC3MRmuyCJvyFSOSoLAZemGdhuC5SMOZclx/OOODYU2RX4hL4Z0WKG0CWn+oxWEaNxNG2PlyWz4gacYrkUGF8hpEeRkCY5sU4R2lPkmsVyi7D3fDR/AlGgijntVDOOA20NsGe5vKFpHJvVlqo+0A0t3bBjuVxSFAum0dP0JU72FIsVWnsGE27i3dSQJJ7ydCbRSyIWSLdnvZjjB89QjQyJoe1bRLoiV7+tELNfvsKdI5w03F5veP+u5Fx3XGLQAR3UDJzPPfltSprNgYiuqYhiRTbLsVWFGTusCq1wUlXM5wnjCNZZimxOJCStbVGZxAqNMZpEF2gVEckMpGaaDFE8IeQEg2bqe8w4YU1I36soQkYac1GorDEMxhDqOCVCystgplEyQkmFilKSC/NTqdBwJVzohQ/BJo+YRnoz0VVho6G1DoPfRf2UUhDHEXka3itpHLNaBf+klPoyRBkm0yCFJckd1hjM5DGTIlICY4dglxEXML2fEGJiGAe8SfBuhpABuyQuw2VQ8D6rs8ECIAVI4ZFCAb8FrCQSiQqlA9ISQAY6DIxhD491Pf3Q0w9JGIDFpX7Vg3dT8JEaFRqkCCGsQEjwCDnRDY7JhBViqCK1aCVD6GtyQW2U4pJbD0pxVkSgHVXTYR1I69EXJVcpSRzHNE2LDTNooBQgw+CsPJOxIYApPweigufTOotKMuIsg2OJ9OJSshGCTXEk8d5hrPg1aCUvP7cABjPgBolXCX7yKC8Dp9c7tAoDfzs64LPHVxCou4GlO9jwt0AJD9aSxAlffPGWNLsIISqUPUzjhBDhWv340194edlx/+aO3XN7UeLl55wVSIcSgTM7myW0yqMFbLa31K0lz367hS5ny9DUZhq6fkQQgnrLlUargaopub36e66vvuLn7GciLajrkt6WCDfjarvhcP6ZqayZz5Z4MWIHED4Pa/y+5NX9l1Tnnm4MNpK6OhLJGUmiqZuG2eIKrSVT3yNkyyy7wYywP/2AdAlpdINKFV13Jssy5rMNh93AMFhOpxwhM4wq6cueVDecqp40iZlpzeH0jLOeYrbi5blhu/o9eZ5wLI/cXL3muH/geOqQCfRDQxZtiJOUpjIIHNvNDbv9B6yHtjsxTYpx6EnirzDGY+kZhhN6vGK+sBgzUEQr2nGkHR6wLqOeXihmb1gWawb9R/qpwYmB8WUiURGOOevrjNP5idELIooA0Nc5znnKciLUmHek6Zxu6rBypFgsQRm6LiaKJj58+kiaXzHHslq+4cP7B4QXzIoZs3xBdf7ELL/FiwGpPMY2YcicIInTywF+YHu14nh84ocfnlhvVuDmZBpEkrMtMooso6wa9ruar765R81aRmNwQ4xXYK2lPAx8+dbz9PKJYvGGJIs512d650m3nubYMJMZ+93Ev//HL5i5f2ErF+RZzY99zma15rTvKHc9r/7hnmq3Z73KmWVXPD0/4Ixj7Dvub18TRQk2n8Ihb7v+vzZd/t/4+JuDaqwjpkkTJ+F0VlcnxsGyvc457s7U1URajExjz6yYUzV70vya+XxF2x84nF4QIubbr3/HqXxhOV/xcqyJs4nnwwN12TOfr2jaM8YMxElOlm95eTmQp3dU1TPIlo8fP+KpmCZPns8Yp4GmbZjnSzyOfgid63ECx/0Tf/pzw83dK/oBNvGCx/0DdV1yc/0Fv3x6R1w4dJJQ1weq9kCUvQoc1XZNPZyYTi0//PzA332zIs09XVmz2sSU55667ui7CEXMYrHAGo+OJp5fHlguNiA6dDxjEb1FMed4euD+7g3OfsuHXz5wdXNL20iGqeNw6ihu3/L0+ML93WvevP4SYwakW/Hw6RkvHNZ6kjSmrs5s13ckKmV3OFLMIcljygdHsbXcf9Pyw18HrFFsrpa4MWO1/XtmhePDpz+zXKUMfUWi70mTibpvyaTg8eNA1/wRmbS87CNWG+inF2b231OeDMP4Lqyz+gdUPENHMdXZIrwmiUHonKiXeBuTJQVm6hnGA/NVRuRy0jijrh2322/YLDPKl19YL7eMvSWNY3welqPexYENKXKEFBecj8YzMp/f0TVDSPROkvNxIl1MTOZMP+Q8fKyZLxOsnzCTZBjPRLHg4emFNL7D+4QiW6C0pu0avPCUh4lXt9ekyRwvN5zrHfM8QyrY7/aMNmK7DsGNTw9PDEOJNQYV90TqNbNCUp5eGKcarTUqAcSAnQSv739HEheM/YFZvkAR0TUNWMM6v8fICZ0VHNoDo4jI0znJf/NRbIojcT8jmmKSBOaLmHNdfw6XgxA4Z9i/9CRxh9Z9gKT7iUhKhtGiZYSJLJ30IAxWacres3spSdLQPOWtxrkCN4GUMThF1zsQBi0anA8qlHcCa21ISwsfGqKswEwD1oZ0PtJfVugSHacI4RDeX/BAITkjhQnDkvMgLXEUkyQFWoXBQyqFvFgQFEEFd87inMOYkWnsQtjB2EACUTFRokjilDhKiGJFGmfoWKO1uih6BUWhmGuC19df0u9uYpw6bm4t02QxxmAmg9TB/jNMwX0ZfLJhqNKRxTnLOOqL15QL1imEm6SIwOuLzeCzIBiul0Tibag8lTJYDtw00RTmUgAAIABJREFUhCS8SHAmNHV57/hsKAhWD3EZ7ICLp9P7gLvKioyyHLBuxDFeQmmhbEHpMSiCXl5W7IAN1xbhsHbCTvZSdgDGhNeplSJJFMZ+9uG6y1DpEN6gI4FWMZ+DWUJ9bu3yaBX8uMZpILoMqZ/NCpY4Cj7brjdImf763J+1VWMGJqcYbRJ8yP5zm1gISqVJTFmNWG/R3qGkwrpwwE1iSLTEGosSEVpKXr96xXq9Yhh6hCCs/d1vYb2Xlxd+/Okn8iIliiVV1f96S/ROhlpW6RBS4TEI6XBTQpFq/CRYzgvgtwrVrumJdMxmtcWbOkDrGfFOURQzkizBiRNPT7/wzTe/47A/8MvDzyzWmqn3TG5gc3VFVX+kaiuknKOEQKaasqqQCo6nFmcsdrJg5igGTqdHinyOjhYUs4K222OniDSdUZUjSVwgZcZgGqbJs1quqaqKzeaW/bHC9RVaGcYxw+qWeL5gvUzpDw3XV1+DmLCTBCNZzq8Yxor9ruLLL79BSoOvDW29Y7QD81WKEIrN4gatUvpuj1SGl+dPxInndPpIkmzI0oz9/oV5Nue43+HFxNXVG5yM+PD+kQXXxLEjigtm26/YHX/BWUeUxTx92nEzf8XtZkPZDxyPJbM4Ynm7pqkHrm5mHF/CgNa0L1RVDUqw3BR8+unPKJWwWt1Styf2fUOkJcvZkkSvcJEPnvj0yHL5lptrSX2cSHXMdvGWuhmoTy3rxSu2qzecmvf0HSAMUkuctzibcX93E3z9VrFYLOjH98zzV9h+hVJn7DQRG8+HH35gvbpiHDui2FE2PX4SCOdJdEwvZlxfZzw8vqNIt6xWBY+fjhgD2TzieDjyvDvRdY7NKkEUBe3wluhtgUxykqeGONWMvWK9/JYkzrFTyXq9oi732CEhzTXL9Yzt6pqqqhBNzyy/Ik6y/zMz5f8jj785qA5jxSL9mnr4gSSW1HVNnmZ8+rhnvbhl8eaa8txgxYm63aOjjHHyrNdbyvJM2Z8Yxx5jBNWppT7vGUeD97Be3nE+/4WmGXg5PNB2DavNG/7LH/8VpS2jOdC2JcPQgOpp24Z23DG5JbPZmmIlQezo+hiE5lT+yNPzM9d3twil6adT6JoWC6JEITrPbB6xmC8odx7kgJ7FmNLx+LRnphM8MFsIfnn4AYlivXpFNx4QWtP1I5CRp1ecTj/hgKoayeI+WANGiZIRWSoY+wmpe+KiYThaDodfyLIUNynMaEEYnI/phzNV88zmOuVwfOJ1/g1mGuiHikUWM3Qdm9WaDz/9yGq9ItHXSFmTFp6u98wXCVJV5IsTZkyJ+ZooN/Tjjr423H6xoWleWM5fY12NLAbSOKZsDyB6hlGiooynwy/cvb6h7Uf86YyOQ9OLnRTnfYWlw0uLGQVd23N9dcPxtOP9xx3FfE7X9eSZDLD2yTHJjlm+QcsV+92OSHnWi1um0nK9vgmqziyhbSa66YXZbEbddCRRxmLxmrp+Jo40i/maw/GBuuoQ3pMkkvXilqfnPU3Tk2SCpj6RZprV8o62O9KLjjR3KOb0pkJGDcKnVGWNTnr6vkLFE8J5no8Tbdsj5AtCNFijQEz048jCz6mrjnFqaWvBbJ4xyB1JMgudyJElzjQ6CgO20JqurtCiYBbNeHx4Zr1IWWVbdrsDxWLCWsX5UBEphREDq9k1tRO03RHV/wYOf9z8E/oUs56+Yph60lwihQzBJYLyJaXkl4972qEhiSK6wYUyAh2RFGMIgAhHHPVY5+inIVSt9gGMjm+wXl0GDQ9OYqaghHoEWmm8tVhnLoGpixtTwueOdxf+y68MTsdl+Ai+VIlCqFBUIFV4DUrK0IhFGECbbkBcet4F8hKgCet5rSLiJCJNImZFzmfGu/dBFbbGhpWu8/RDR9NMwBEI3lchRVBwtSaKIuI4QscapSKkVGidMZ+Hn01dAlpC+NBfPg+HRGsNUz/RDxMq7tGyR1yuD95ehlVQwiO9x04EYythbR4so+G5AlIpDJ1SXq6Fkhcv6iWU5D8THhxxHFTccTI4Ly/XmstFMJhpwkzhl/DZT+Yvw61H4dyFdyu5hL6CjxhvGIeWYDIIQ6h1MizcpWWyTcBhfQ4zeYGzjiQSZFnGNBFKBHzww3oCkSBNI7QSHE8D+AihPtMbgu0giiOsmy6IvBA2Cx1enkgFDu1kubBnL0Gsy8CepPGvta3BY2qQF0uDYwqqO6Ee1gvFdrvl7v6KcQp8WSllUMS9QynN+XziX//1XzEWlmmKc5KhM6FUQ/hff6+CoLzKKJRbeKsQXtCWE7EVREn66+e27XbcX3/LajZn/9zg3cT2+oa6rNntQh036omqOnB7fcXd3T3PxwWn0wGBo6lP/P7u72jOLbZviNKYq+1rPjy/YzIdaTyidE8ar5nPHGZS3OSvOJcPTKZkMoK2jRnMhJQjiJSqe+Fp9zOzWYZSoKMUhCbLC9o2HByHyZLF9yhxBm0Q/h6tR1rdksURgpw01nhjWBTX+NkshCbHBuEli+KaInf4bo5gBdZws7jmlw8/UjUNxVKTJA7ngsUHU+AU3N/eYnvYrrdkM0VZndGRZFEsmUVLZCSpzi1xYpllM6zX6FxzcyP56stv+PjQM7w8Io1mvtY0fUNapHx8/Inb6xtq33NsRpJc0k8N2ZgwW+RIP6MsDyg1cDieub/9GoQlT17h7A+8PFr+3b//e/760/fcZV9Q9++xvSdbXJEtF/Rji3UZbftC01YcTz1frd+Sz0AllmFyRFlG05XUZc18lhFHOT+//4kkatAqxjvHriw5nR+ZTMRiMePh/XsW1wW73TPKzOgSgxk1q0TQlILt6po0C0LN3c0V576k7CVfv/2Oc/mR6lDyp3/5hFIZs6XCnlq017zsW4pFHMLg44Ht1RxrBb/8/Ik4KsijmCgRPB2e0UozX8zpO8M4/XZP+u/9+JuDall9II5i0ugarS1RBHaKiJTh6vpr6qpB6jNvbr7k6elnpAstQGX9yOFYc3V3zXwe8+e//BNdPTKbRaSpoDxBU7csZtcEsHiNUJ6//vV7ztXPzBYJ3ViBn+FszHJ5hRlTlvMrzucz9zffcS4PfHj5kavNLWMvmS+WLOY3KL8GYZnsz3RTzeOzJFYxSQZPL++QQuN8jjUD5bkliVec9wPt9IGbO0VXSWb6Dd/+2y3lEdzFy2nbCEEW0C5MzGcpXV/S1o4kWXN78xVt/4DxmjxeMtkSrSRpLqmrPUm85WbzJZOrkMTM8jldn1KeejarBB05yvKA95IknvjLD//MfFkgRMJ6k+KMYTQ76r4LMOTmiEex3szxJuHhr3OS4oYPuz+yXW/Rmx4rSw71A1+++QdOpz1R3KHUxH3xiqEfeXr5mSiKWS6/xowO6IjEiqvVmr5tcDiWqy3H+kcgRUWC9XqFc47t9pY//elfmFxHluf04462OXN3/Zq8uMNNMfv2hbpuWK08Ux9THh3JTDK4Hit6zCDQsUZITZxKJtNS1nt0FEI6y/mKor9nGj2CgSxdASkiPpPIGUO/QwhFFCfEaUTbzWm7I1HWk6X3zJIKZzvGsQEyhL0A8e1AGhmq9oxQDnxPpA1Vswug+HQMoRhX07RH4mhNnKZMraKqBurqgcV8S9f3aCuI9JzjoWKzyqmPDaWf0MKSxkukgizPiWNFHOVM/UgzVDg38dV2ztR3HPcNhfvt9Hq9WZP1Ee6DYxo7ZitNnGi6ziMkBN5ngMnHsSaOc14OZyY7EEUx/jQgpQ7rUjEGVI8ON18pFX7y4C3CW5jCEGP9bzWZwnt6M4Uq1M9NRzL0wLvLGvi3FLdAKY26IJeEIjT+oC54oAtcfgzBKilAS3UBsgfN8rP66KzBuf9mSBA9oglNR1EUhbCj1kilEAqUkmRRhlIBAfWr4d4LrA/Egmk0jIOhbzqac42xBuctUoY0dZLEgTqQpCRJuM5ap+RZTBSpX3mtIYxkMFPPNMFoTFB4J8swjEQqQ0iDkgatQ9DJe4G1LuCVUBevqcJ7G8JgyAtRweFsFqwDIvAdhPDoOPx5ds4hpbqk5C/XXVr8JeXkL+GxQPSyCBFU2W70WP9ZZQ0hOCkgicIwOIwTCB3qRS/vjTgGZ0bG8fOwGPRQQWCo5lnO2A9M0wQiDvQF4QJeKs2ILh5m73wod/D2wniFOImDdUFcDlyE9563odFqvVhRtYad9QEP5i6jtAunoMBS1jg3XVb/nsBShWKWEyc51rYUsxm3d1c474I3W6vgZTWBFzsOA3/+/nvKsiJJYqQStM3IMBjiLDS1IYI3NQz2oDNP/Lqn7vZooblef4VXgrLd/fq5LbIZ68Waptpzc7Pi/YdfQKyZhhjnWo7HHTIaiKKU40kTRQlXmxWn/ZHZLCKODfXpiOsL1rMF/XTi8ekTs1lx4Wc3bDYLVvm3zPINZflCOf6MqCXWaFQM5/KJIl/i6ejHE8NkECpDRwVRIoNyrjxdW3N+eiRNCuIkI44FSZRxPJ+oyh1JakCG7YVwEU5NNPWZphR88eUX/OF3OX/+/gcWs2uSLCdJJWMvEPaGm7eSj+/fMbUTV+vXWNmyXmnwA303McsUo1PMigXbuzWRXnE+v3A6/0wSr1nNr7Cuw3U5SbZnd/gzN1df0I4jv3x4IFaWdx8V9dDwdHgmXsUMHKhOntlqw3H/M7ffveH9T3viLGeVxXSdYLO+Zbd/JM2XoA1tOXK1/YIivUUrT3naM5mJfnjk559WGGM47c4sZguS+UjfVMhYheDX6BEYIr0gX8KHp3fE6prdviTSCf3U8+Xbex6f/sTYJKxWbyiP77CqxsslVite2h1t13J1t+IPX7/i53f/ghsdsdSsVoph6Bn6mPP+maGD2+slx+MDfQ/fffd7qu//xOvt16xvIrwJXnyvAKU4V/uAfTw1CJ3wxasFURyaNNtxT9Jv2V7fgWwZbcU2v6fvW85lg1QeawWR+u0Q9t/78TcHVeuhanekswJBivQbyvoBFVt6+4zXEqc7XvbHcMNRPefDwHIjGUdPee7YrK8RdEhtkCJhGlP+4R//B979+BOb7Q2jOTCfXXM4PnA8nlBacz43JDcZxkIxn1N1O2ZZgfIbbrdLdk8Hrq/fMDSeSJ4wquHDx5L7u7dgCh53n4hnEcJbmqbDxeEDOrkBM8bcXG9wNPzph++5u/2a2c2KqvvAanGNMzXf/v4L8jzl4+MvqHjL8/MzaarZXi2puz3lCa7WKyLtkWJOlGtGX9LYE5IE5Jq2atBGosWM2+2C9fKa3cuZV/ffsdufeNz/iTQtGIaBpu1IkzlKS8a+Z7d7QesclKWqLa/evuFw3DNbFPRdhHeK7SqlakpINnT9kklUPD38iS++eg0uw0Y1zhmSJKEfj2R5gXMaaxuGbmQyZ5arN2ElZhwPHz6y3WzZbnJMb3g5fE/V1dy//gdU8gVN22DthPSOT08fmc9jXr/5lsen9+Tzkax4yzj2lGXDrAip2MlMTJOlbVLixcQkKubZktOuohtPzNIlV+svqGqPVh3DsCOOFlgXc2qPjMYRiZT5LMGYCWcyXBwKJIoixdo5WRZTNyP9dCZKdPA/NTFPz98zX0TMi1u69oUslQiZk2dLvA8sWmstxSylbkYMFq8V5+MOIRxJtEDjMK4hVoKqCTis0Z44nU9MVmFcjdIz2qaiSBY4OzGYJ7omJ0tn7Mr9pYd7IOkL0lyR53OifEbVHPmwf4+fLJnImC1+gyuXzQvD7X/mdV0QnWNWcUyax3T9AL+6DSVCwodPJVLWaK0ug1UY2pQKamZQ9ALyyDtwxl34kWFYEJewSgjRXAI38nNynIs3U1w66d3FChDS7P5SWOSdu/TEW/yvZSYhfKR1YH0qqRBSf8aS/sogvXxHvLcXZQ5wIoiSF+vAYCYma1FSI8UYfh4l0SookpEOg7KUF2ZpFIaANMsDp9T7YF0w5vLvZdVvJqyZaOuRpjwHr6QMzxdFEUop4jgmTi5fcYyKNEop5kmKnC/CdSF4yaZpYrk2Fy/syDRapnFERT0IS9Q7sJd2KBe4p1IFNRorkV7isb8qeVGckCQa4Ws8PvAqL2mqJI5RF/C+QKAEmAtcP4k1WaYZpgnnHEpKcA6HJFKSLNYBYOXcJcAVwP5OWJyxDC1YE34HEonH4y6DpxCSbuyZnP+VNeuEuITNHM46JhNKBQKvNTyP8B7hwRDU4/C6xeVtZomUQKIYxumyDRAgNdaF15dEwY4wjg6twkAvLsUNSgiKNAcVBtmb7RZQdP0Y6n2FABsOYNbAjz/+wKeHB9K8wJoJKSb6vglDvdDgAz9WKo1SHmMMaj7Sffcz2XFGGs0gsRyPJ/Lst5v5N1//A2114unxifXmDcv5K6JI05SPrFYbFgvH+XxGqAbvLQ+fDswWgvl8gRaSLFqw39Xc3t5j3MhQOcbpxCrNSJM78BlDX/OvH/5Ens959/6/kM/mpBnMF7d0fR0O15ViPl/S9SeSZIF3KdOoqesd969u6YaKU9WSZTnN0HO1nTNMJ9qqoWoMjopu8Gw29wxDh52OeJnRmIpEZdTDM1MFkU55OT0FzOAISlmWc8vpXNMMllff/g5nB47HkfJkuLlbcnUDb15/y/PLR6QXlMcGoUf8NLBa3HM+GybtKe2JbXHPYvUF4/E9zVQyDrCM5ySzhg9P71AqYkKSmBl+jPD+TH3+hBDwv/3xP+FNwWorcVOB7RrGvuZmdUXdOuJZznpxjSLh04ePLOZzVss1UVqQdzEPn35iMb+iki0OwTK9JptZmu7Mbtfzh7//iuf9C6eXDptC0zaIOCGNEkZvSZOClZqz1wtkGjP2NbFOmKcFVV+S5/es1wv+cjpjJsdgRno74aqeq+0W251h0gjtGDpLkaf88um/UNaQFBnf//QTXd8ipORwmALGs4ioywrSjqenluU2QsgU5/Z8eqmZRfdUVUM7NHgdc6xOLJaCYWp5fj6wXKw4HPf4XnB7d01X/9aW+N/78TcH1cVyg/cZP/38kevNmuvtK0Q1I04dL/v3ZPEGvEUJRVVL/vGb/5nz839lWWTEX1gWizuE86wW1xz9R7ROECyIdMTdXfBqNsMBb1OsM8SxRIpXzOcps9mSc31mHB1ZmiOwTOPEenXFy/EB3Z3I0gW7w47FYksSd8xnG/bPHduNpulmWPvEYv4K62tm+Yqu8Uy+ZbPJeN4dyPQNqV6zubpl/NDz9v4/YKd/YbITcbagGwZiG6OYUx9P1PLEcvYVmyvF6CxfvP6Gh4cXrAl8t0ikSJ0yDAZjPNd3c4Y6ByFJ0hWT29F0DetNRtNvKdsHNstX9J3CKMdillKfe5abnNX8iv/8T3/l9k6iVMTd7R2L+Ra1cXz/5x/xYkLImK43xPEZEZX8m+/+jqzQnI47ht5ibEkkJH37jLWafC4wQ8rzy57tjWO3f8A5x9s3VyzHLafTkTxd4vxEPzYU6YLzac9ycUtVfqIeLLdXKcKlvOw/8od/8488PW7Y7z4wzzZ42YEYMV4zmgbvIcoqvFigdE6aFXTjkdVyjjtoEuXJU8e8eMv3P5zYbr9lOf+Ovo2x/JH61PHdd9c8P57wQhElE73f41yCtRPb9ZLTeUDJnNOxYbPIubp5xak5Uk2PjOOaXnq6wSAkl+FGE+slx9MT5+pE2s5AdngfLCpFOgMvGYYK4xyTmZjPrzkeSsap4ur6hmlUKG3I05S+CVuG4ionjkGwoJhtiHSonhzGl8uKeGIaHa1vmM+umTqH0zlKOqyHYrb89XN3PrdMhxI9/cCif8Uie8VyWXA6tkBADXkfhk0pguI09iNBigxJTaUVOtJopVE6Dl9K/eqfBI/1n5uHLkOnC4vUX4dIKdHyAtGXIqyqCats5xzmorBKBMpfsEqXMdr7EIKx3oc2JUMYRi/TrRAXBVZ8RklxWb3LX9mjYW3sLszNwCJVl1CT0grvFM6BczYEfbQkgoBS8i6oxQRFzDl3UYwBBFEUEycp8rM9QAb/6Gd/gXehUWsaDV3VYU9hCPPOXdL/Gh1HRJd0fRzHRHHgBCdZisxDHSgyJOONMWzWwRtqzMg0GYwZUdGccRjoI3tBKkmc9aFNTYbfhzUW6RUiXA6EEEQqVNz2k0Gq4D0VIgS4Eq3IopijGTE2qPCf+bGxgjyN6fsJb0Na3vtLEh5Io5xEO7wN9aOhfNGHwRBH350YJou1+jJsyqCIClAClIgwU49EIYW4ILEsWmnSVHOqm/AafDhAhaFcEieSKI7wfghBOO8vzVAehCOKJcM4MBmHVJ/ZwuHwpKQCYSnrkeVmS5ImjMOIjiM8FuV8GLe95dPDI3/96a9k2YVLi0aqiHEYw9AsLd5e3p/yEvgSgjQL3NlYr1FsEb4j0grrfvOons5nDrtndLSgqlt0omnqjihSTLYjijJiXaBiyem0R6sCfE6RXHO1XbN7fubp8SPL2TVVV3E8VOii5HAqGbuMzeqacWyZTIdOJtJ4zj9+9x84lg90/cA8W1NkS/bHA2kyIy++5fn5F9r2yBdvfo9QBaDY715AJnTDSJZ7joeBrmtZL1LmS8PhsEOrmPLcoCNJnGryYk0cJ9TNmZdTjTMKIRWn6hPFTHDa16xWK+K4pCyPoGLmyzn//M9/JE4dUJBGr7m5KWiaI3EcY0zLze2XVMOe7WzL48sONzuxnt2zzR2xkpzOFYfDwNsvVjT9CzfXd8go41S9Z7MoeJ1/SRTF2FEhvUZFCf1Q8HB+JhI5r9ZrHs8n8rggS+as8gV9feahOxMphxsd/+YP/xOH4yf21QubxT1v3/w978YfMEPD2y++pKqekDrCOkWazVhucqKk4OY2Yf/wPebsuNu+wXQVxtfMsys2ecbj7hnhE/Isoh8yssU1RrbMcoicoT1aXn31lqHdc6pi2qknESk6XmL9iMZzfPrA0n9LXiiyfMWn3Y9k6yW//NyGyuClZeih7Q4s8m9IlWAcTgg8ZdWzKObk8xmYJLSf5RnPu4liNZGnKVpCmsQh2Co0Rb4kSwq0kKzXfxMK9f/q428Oqnl0x7nqiFWEdR2n8wHnQcs545TSGUOkY/JZwePHI9XZ8bvffUM/lHz5+hUOz+G4Yz7P6Ls1q9WCcWr59PiO8txwOH3g5v+g7k1+ZMnSK7/fHWw28zHmeENOLFZWsUiRC0JQLyQBgv5gaSVAQkMS1N1kd1HNYhWzKqc3xeyzu81277VemEdkrUoD1C3JNwk8PORzc3OL+O75zvmda8shT7GmpzOSKIwZT33aQnNxMuZu+Z6rqy/AKQLt8/H9d8ynHbrfU/eWz9/+ku++/z3TeY8mxHQ7mmrJaHzGaPRLrBnWfml0hdEF1q847PfU1YGzy4jQVxTVijjxuX/6kdXuA14Z0NmOLDmjt4LXl2c01YrWWDAXnFxrnla33N09MhqPabuG/UFxfXVNXuTU9QopQ2znAx1Wb/n2/RPGGPaftmRZyHg8pm1bsnRC7wxVtYLZiKf1e7LJG0xvsLakrO75+uc/o+81nz4uAMPu8MD8bI4fzrm5+z1vXp8xDq5pa584jNjv7hHK4kmF1iPOLq7Y7R+5fbjh5GQYxB7vd4znMeXecijW+EGI3yjev7vl6nXEKDlnlv0F37/7NbJvKQ7toCjJlOms5fGHd7x//x2j8RWtnZOXSzzP0LvBpxt6p2y3a/xgOrTyyAovHNO2FulZRllMNnasdzsm2SmSKaGOeLi74eL0M86zz6m9kv22G1pYZpJDtcAceppmSWszEl+x3RWk2Ru++Pya7377WyZfTSmrLUIomrYm8gVaxvh+iOkcVdkRh6BUhPbWuN6gGeGFknF2RnWQHHZL4thheoPoLE3dEUcj6m7Nbrdnkp0TxoqqWlJXLdNJNlS11j3Z6IrxOCXPd+T5Ch0bcIrOGcqmZTLtMRT48dBBHwUJUnSY/ic8lR/49J3iJvs183rHSJ8ymcTcKk3bPQ+Sz4ongBvCTEf/Y987bGdwXUP93MMu5VEdVWjtobWHOq7RlVIoqQePq6+RYgCit53Fth2ta4YhVsjjv/3sdxxUzMHjeVTXnD2qrOJoHTjqv1Ield1B9XPODj5Ta3CuRTBUVQ4p+mfAukZq+aLoSiFQx0Hb9Q5rh8FvuLzB8/nsRXxGIz2n9eWRPvA8iA7KcM9zHavnabQeBnvfD4bOdK2OJQHDZ2eMwXaGrmlomoamGdA7udljzKA2KzVUwiqpBytB6A3PjdZ4vof2fMIgItHD4P88lJ6cHK0KpqNr7NAopg1d2xNFAqkHL64xht4NxSDGOJraARpru2HQcg6tNb6f4GxFb2vQQ1uXEoOiOjwbQ/hKHvFR9A6FYpSk+H6D6/PBxyH1gKCSljjUxL7HejNUlA7UgsFTq6VDSDgcKrpOIqQ/hLB4rkh1dF1JU3Uv7NrnKFXfg+076hY6A8/hqsEWMvhoja2o6yNDVcqjRWL4q8MhJcD1IeNJhNZHCsIx2U8/2A1WyxXvfvgRX/tIqWnNgPXSKqbtgsEG0Q8FGs++5QGxYAljDyk9rMupqntOgjN613FoHl6e24fHuyMWLCLPC/zI0KsNh31JKiOquqJrNJNoTG8XBHHHdrNlPE4x3Qg/gvmZx3r/B3qXovwdwjk0KX4UI+RhQMv1hs5YtNeivIbN9gmlfVL/BKkF1n7CmhxfJwijGCcR+eGWLEtxpmY6jmkaaGqI/Ald2+NcTdMpbF0N1rla4mc5+aHn1fWXeGqE52k+3PxImgXEcYy1jmQs8f0Ef3KOczm78hEv8ijWOZvdA+l4zP6wIEmnvH37czyvZrVaIPqep+Ud+3xN3uyRpqSocsYjn/nkFYQ1y8cl49mIb/7wez778g1R5pGXHX4YEUdjnIvROiTwez49/EAaZVycXlHlHll8xeKx5vT0gg9PS95eznE2Z7HrmCYRdrWn90b01Gw2Szpjubo85cPHbxh0iChWAAAgAElEQVQHXzMZvyYMNVk2xfU1YarZ7taDoBZk7POaplGkUw8/Hz5HFWQU1SPnlxc83CwZzRX9usHGAZ4fcZGeU9otYdBRbA4IxigtgQLXGE6mGbfv7vD9HrTBlQaLwY8FD6v3TMZvyNKzgazSdpzOPiMaWbarhtnkLVpJtqua61dfk46e+PU/fsPVL7+kqB7ZrQ+8fXtGvqvIxgmBrzGhAQdRIHHGI0tGmMZhLUhpqKv/nyiqphs4aJdn13Ruh9QlAYq2ahFY4jBmPv8MZwKurx1lueUv//or/u3freinkrrqqIphWbldV6TJnKpsELIegM/SMo5+weogiULB1TxAK0HT7bm5+57z9oSL2c/Zbwt8v0V6IUl4StneoHTMm1dviMM5n24+IkXO9999Q5pFpH5Gb6FpB9+GNR5t3dG0JVk6ZrlaobTm7ZtLtguP5fYWMFTbiigNoPfZ7yGKoKhLguiCII3RrkKiWK8eyNKQtopRIsLZljj0qKot1hWM54rN0rFcf6Kn43wcouuQOAsI1Ix8X7B82qOUz2EjkSrBmEdMB5NZwu39I9qL8XyP09MzWrPn/bsFcRST5w1KeYySwS4ReMOXLU1ivr39Ec9/w/3TDWWz5LPXEzwiDsUTpvMQdgImI4535HnEL//sv+Jf/6t/gxIOazSRn5H3e6o8oK7AF09oFSKEz3Qy58svf852U+AHAaNRShiMub//wOdfnVEWDXE0I0nGWLekONQoGZFFp9RdRV5sEWxIozHG7dG+T2sCjLE8Lm7IJiFe6FG2t7RCcagPNI1D9TFBINHaEIWS7c7gZImTCduyxPSwWi0YT3f0uuX28YlwErJfa4SRtKUlDiZE2sNaR5Xn1K5CaMnJaYgQEU0xIo5GxN4ZRu9I08kRX1MSxTlFuWOUzRjFb2naLbXJGcbClKZ+YL/fkboYJQMEHYHJsUdiA6Ih9qcUB4uzOYddSV10TCaXZNmIPN/StA0Pq+//6MkLmE4Ubb1n6/+B1e1b/PCaINR0pmbA80ieMUjH8ZRndBE8l/pI5IvhcxgY6DtMa+iaQfEeVKVBWVNKEUUhSRwT+D6hp7FaYI086m0S1w/cTdf3mK4betCVwB2T+4ijlUAJwA7JcydeAkYDv3JgLmslQD8rrM9DzTHAYnusc5jWvoSzxNFOMFgbNFoP6/9hsB3UYhiuqTPHWtDj9b0Mu1Kg9XFY9zXqhQ5wZK2Kns4MiCr6/rgCVkPI5hgE84OIKM5Q6pmHCsYa2q6jM4auaY9hk5Z6V9J1hq4bFDutA4LAw/c8pArwfJ8o8gnC4b0EYUycaKSYHpVYy2g0EAnarqPtGrq2ResBiRN40NuhQMCY4ZDgaY3Ep62GIdj1YoD2Y/GDhCAe0+17nGxRL2EpefxMejprj20+/uANRSCEd2TIDv5xi4c6fv/oB5hAEPqYlhefsXtO9feSvi8x3R9X7R4boJ6BqhiqxmHsEd91VNsFwz2OQw/nWuifDyBHf6uzKK0wLkCpCb4evMv80fOhethtN/zw/Y/0SLQWQ/OZ0EhhiBPY3VfPBuvj4cVHimO9rvDQXocXOPYby2gSs1oNLPHJ6ezlqR2NY9rGEQUjTOcwbcF4nLFaVHSdQciBmnHY7xllGZ3dUNRrTs9/TmcbHD1+kCCFT1HmWNMzzq7oTEHfC+rSkudbwjDEtpK2O/Dx6TeUJmeWXLFe7+gpibwI6Rq2y4r57DVR0rM7PKB9qNuC1W6FYsJkfIExe4QU+H7I/nBAyBKlJOPxhL7v8PwO4/ZkocdiucQLJEIptK9oqz2Rf0ZVtoyyECEbytLg6wBjcw6HHdrzgZD17o5Pt9/z17/6L/nV1/8Nbbfg+x/+wPubv+PuDwV+FjNKJnTNmqJ8RPQBrg8wXcfl9QlN0yKVxRqo6xx6MWC4Wsc4mfPmukO6GNeUmK5lNkmQCtre8Muv32D2Da6t6fqcwikwjnE6p+nvub+9pa0dk9EVWLi5/cSv/rO/ZH+oWO02CNVzv3pgNp1SVTmdKykKx2bdcnZ+hYsfEcLj0BS4fox0PXl7Q7EOkL1HX+ygT5gQ47uI9S7n4nqGyXtWeYfvx7RNQTZKCCJDU+/x/BChPaJQUbcLPF+RF3uuXl3y6eYTUayROsSYPcrrMU5R1DVBKjgUGwhXnJ2coz2LMIA0LFd7FotPTLNrfJWwMwWb5RqpWrAjyl2OVDDKpkSRR7Hv/6/Ok//RXn9yUN2VB0rzgXF0hbAJQlo6HDcPN1xcRIRxiBIhk/E5dVUgpaIue+JoztPijpPTKULUBEHK67dztPLx9AgvPKA9wWz6GXXpGE8toT8lz9e8eXvBpw8lti8J4ozV6sDV1RVNWTFOxuw3K16/+hX39yXb7Yrv1v+ON6++ZrN+wrpb9vktZeFIR1Mau0aJOVoGJCNBbUqK0tDUiqouSNMpWiQk8ZjdfkEQxXStBuejteTp8SMWg+fFnJ5e8uHH3xOGe0bBaxKVwTxkuXlAq4iuM6zWSyYnIXneYZxFC5/W7Ln9VJHF13i+o6t7mmZQlPb5grp85PTsCvqI1vRolXEofmCx8vmbv/5bPn2843er35CmJwSRHGwJwSld22HalnEyp8xLimDLZ5+fslkX9AQkE0NZwcl0NKz0o2RoYvFCTmefEYcFN+8rsnFKb1tEr+g6ePXqmraRyHD4YT8eTXn9+pJPnzqqQjA/TXj83T3jcUxTF6SZT9PuyJIz6jLHuTU6aDB9QZiMWO0/EvhjhDj+4JeKJLiiKg29q2maHX4QU1YlnSuJxzF3i3sCP8GKAi8scVVAse/xAkVVrghHgxc1bwzzyQztfJaLBXldY9QSX/j4YkKahTRVQV0ZlA54ff01oW5Zb++JAo++vqBpOopqw2az4dVlQtcKqqZmMs04Sb7g5u4dURQxyiaszYJEpVhn6cwB21qUdng6wvWW3ugBAC4Deqfouojx5IzeSjxf0xYVtpUIGfC0PJBkAU1Vs1k9kMTJy3NX1ktG41cYrXGUHIKPXI5OSTOPsmx/ChyJIeB0rE96TqcMK9Pe0YvnPvRnePpRVRXQH1fFHD2Dfe9wtuWwb9lvd4MTVj5jkhTa85HaQymN5/toz8PT4tiso3GIAWPlerrG4npAHNFGrkfJ41Ap1cAdVYpeSJx9hqoD9Ece6ZEgwHNafRiEBvbo0XPqhrV8ax3O9S+Afa3kMeHvE0Qh2tMvyuqzCv1co+lcT99ZnOXISLU422GtGwI8on9RYZ8HoyGQ9uxj1Uc7hfjJN6sVYZgxmw+1uc4dG51MS9e2tI2h6xraxtBUJfl+zdLZ41A2dNN7vkcQavxgGKY9pVFqsCoEYTCok63BtBFX52OaztB2LXVT03aGXnncLQsaKwkCD/ncsOQsVZXzuDDsd82Lgg326E3u6WgoymYgQjwHlvrh4KO0wPMHRvVwL2Dof1JDA6oFz0voqYa6X9EPYu0x4FXVJU2jEcI/slEFzonjQDRkIrpuuJeIZ2yVxNceYRSw2w1NhcOXZahR9X2P2WSG542HQVMMYSjJT4eW/W7J4vE9iA6pQyzNEJg6hvuUlFRVeyzWAHGkU/iaQUV3jr7veHrYY9ocNcooywbtS+Lwp2aqfFshNZTVntBTjCcXvP90S5plmH6DFj5JGrJcLgijCb4OyUYT6rYkTiK22xypPKxtcHQYlxNFb/Gdo6mhMz2BP/TdK6VRSnJ/vyCOxpT50CwWp5q29imaHOUF4DpkHyBcQlcL8sOK6qD46u2viFPBh7sHpOqoqwDtRQRJTVuEfP75F/zut9+QpiOS1NGZLb2TXF28oipL6hIuLs65/bAH70BZLkizEGxCEs1oRiVta1CiJc4UWvncPn5DUT3yV8V/zqurr/j87d/w1We/4OLk1/zw7d+hdMbtzR3b9Xd4aUocGxZ3HVkypalLGnvAY4SvNLU74Hs9gsNQpPO0I/R68nLBbHZFXRdIDMo0aM8jG8U4keD2e4S0ZLOU0hwwtWGUxbReiPQNnjfnq1/OWO/vsK7mbpHzF3/1ht3HBZaA2anm8XGFZ6FrlmwWkrefzaj3PV0wIc9v2dzteP32hH/+9h0nJ6+p9huETClNyTRKSOSUzvh0bQ4uJJme4csSaX2S0ZzDviX0fZq+ZhTNsbbBODNYgYTh+tU52nd8ev+OV1en1M2Byh0QvaYzW+IsIU1fkcY9VVMQxQGrdYnnC84vrgjUiLar2O9qrGsIgxF+GLE/PKC1x25X8ovRLwj/v5Ol+tODqgyhLRRVt6MqW9o2IYp8dGBpmwAtRywWW/p5iFIeURzww48/4ITDipLdLqY1DettzcXZW+I4oawfsNYSR1PiMOb+4T1fXf+CxX2P74W0TYfvRby6+BUzUTAew9uzc775/kfuN99SuAeiRjI/PeGHH/93Xr1NUQQsFtuhjYaQIDRUdU46DThsDoRjByImy07Y7fYEiWGz37I7KE6np+R5hR9I2qbEE2d88dVrVutHWjulFwahFL0MkF7E5XWGK0aMkhPKrkZJH6kapPKoG8l20zGeBkiZ0Jo9UmuEzcgPDUEkwDZY11DVG+pmx/z8gjAUCDkk53e7mvl8TF33dK3ADwTCT0izkDCIOeQLprMZD/d3+HpEHEqiMKKpW5qqZRRf4el3JKMpTx8qri8h0G9YLB+5OP8M6S95vOsYJZds9x8JY02RK+JY0GvDYv2B0JsyHp0wm8y5vf+IdTV5kdPzI5Ypq/Utk2lCXT1xNv+SrqmpqgUCKA8CXSnmp2cUtaUxHUo70iDCdpr9oWY+mYA0NOwRwfCrzmLYbW+Io2hQ2PoIkDhRI0NHntd0xidMOyQRQeDo3QyBB6rEkxGz05DVdsHjfY0vRmTTKYEu2e8Kyr3gSeyRMsb3Etq6IgoDDk2JVjCaXNL3liAIySuJH/i0Xcv56TllVWI7DXR0nSYMkiFYpj3GI0XgJ1T1FmtzptNr8nKNUo4giDDGB2qs6JDeiLdvfsYuf0LKiK7p6XVFPJHUuXp57jpjeHi8pWrWCGm5O/k18cMJfjhFoOF5adofWZeAEA7E4MN87onvXwJR/NGgJnhur39mcg7Bp2GeHao5h5U94jks1eNsg+lq6KE+rnORcgicaI32NH4Q4Hn+YCNQRy8tkl7+NBhaN6TAwSCU+EkpRaGlxvcUvjc0O3H0zdp+WDU/r+ilFINa1/dHj+pP1aLPPtLOdEfuqzhaG+TR+3gMcIk/Wh/Dy2c1DFz26LflOCEPI9Pzvx8EHlrJY5OTxB2tEsL2SOnoWksjB0RY/5JWl0gdkITJ0TLBce0+DEPdcZCtK0vbtLRdRVHsB0W558WXK+SgHGs1YLbQQ5hJap9QKvzQDYpoB6PpnLFwx2sb7rqnhvCk9iRxZDHWYs3xwCAtjWkp6nb4O2q4ftFLRG/ohaVsLG0NODdgpKQC8dw6JcgPR+yVHIJwyB7hjrgyJen7wXowvAbbgVI9vq8wbrAxHIVxlFLHz88OBwMdHg9ow3dWK02SJsTxiLyoEbJCqyHFL6VE9rA/7Nitbjg58znUNfmhO4YGn9+CHQ4N9eBxFnAM0kGW+nSdoMgrtLQ8Przj7OQVni+IEo3U3ZGWMryMzQn0HK00EsN0nPLwJDBVS9/XaB0RRRFhFOD7gsXTE0E0oqfg4bGhKi3ZxJIfKtLompN5wqf73zJKzmhbg7MecRyCrHh6OnB1eXm0VFhcZ2nNBrQj3wuuX1+y2+3pug23Ny3nl29wrmW7rviLP/+v+atf/Le8u/uXXJxc0Lk9d5/uODk9QTL8/H182BFFAbZvKA4hng6Iow7X+/ieQrkOU2WEfkFnKopmP5Ti7AzzkwRjGuqqYRafYMyGrjtWOsuW/+Vf//eczk+ZTc+Zpa+5e3gkzkagAuJsThwpNuUe05dAiKNB++DbiIf775nPrmjbnENV89XnX3LY5nQ8EChJGAVUzTHc2q9Z7g+oJCOhpqgbqp3hs8uQ/bLAtQeKuhzqpseG7cHipE8cTTDdHW1+YDId4+zwO7YqDNKmSJsRxJrpTFDuNnTVZ4wyhWx9/uq/+Cv+/n/9n9HmDVcnOZ7K2JR7XP/E7PQtW7clkCNk21A5iycFTX0gSiKK/ADNjCyypP6MSVLjjADRcv9wgxOO1eOSbBJTlz0SQ98ZzmYnrDYL2rqjqwVFfmAyPsXzevreZ1t+II0neDrg/GTKxw8P1G2PH4AiZZRl7PMHRsmMtu2ZnIQIFHlx+FPj4X/S158cVPNyTVMbNnegPUnV3hD7V/iMqIuKzXbBcrmjrAasUpIcwz3R8Kt0PJqATbh9+g1heMvtHezyG/yg5+3rC4RNqfKeu7vvWS8lp2djbm9WNE03rIK7G/ygoioyeutz/3jH+ASeVk+kseD15a+ointWh3ecXyeofsT7T/+ei6szioPH26uvuOHfU9eW/c4xHs9I44zt/pY0m9D3ks3uBl9HeF7G5XnAfgNhEBB6KadjAEdnHNXhPYHaUh8SpPNIsy+pN5qy+pbxzGMcnWGPSeXDrsAPt9RNRRD0TDJL5F2yeHri8lLjVwGNsbw6u0aLOVXZo7waT6Q0pSXJFEnWc3v/iT/72Wfc3H5gufqIkgJfnnHYNnie5uQ0xSPFdDWRF7BePzFKLKfTU7a7notzQRpMMCLkL372L/hw8y0f3i2Jwil5VVE3JZfnX7NbLGhFT9+3nJ6cgNM8Lr/Diw5UTc779+855Bu01/H+3Zam26DknCx8w363Q8mAQAd0ncXzHL2TrJ4sh+4R6wyzWUjXDaglayt2+cCPCxJJksTcf9yg/YYgDgdF0FmK/Yogi6jbhr7vaeSWQ9MS6jGe77B1R3lYMXt9RVFYrPWYT6ekcUBTd3gqoLcwylLaRjIZXdFTs93fcHZ2xXpTEwRTgrCiKCt6J6ibLVHs43uO/LCgzgWj9Izp9IL7p++BHiV9RqMTdBkiaKkbWK8XdJ1lPImQIqApwQ8hCT3aJmcymeGCkm3XoESIdS3pKKXoO5rSoyx9dvvdy3O3PeyxtiUKIrSnsDakLhWeL5GqxbnBf9czrGWh5/RsgpSGMq8x7TBI2p6jj/MZazQopMMANiS6B0vAsOJ8HlBdbwblkmMYSRzZn1oelb/jYHdU1GxX0zWOMv9JrXxex2vtoZSPOq7ate8NKX01KLHPNkBnh1R4bx0WUJ6HVh7SkzgYeKnW0nUcyQbPvfSOHjO0J0mBp7yByXpkXvXHANVzKt8YMzCCj+GqIbz17GuV+P7AW/X0kKrvj4GzwWc7DLxaHENlzmH67mXgxAkMQ5+96uXx3hx9lm4otrC2+yngdfz/imPhllYek3GM1urIVu1xZihasLajNYamMdRVQ1OVNHmLNYNfcbCZDAcN5Q0KllACoQa7glLDnyvtgfQYTQTZpMdZg+kGYoPWFmsE9IosrekROOewvUFgMM6yr0qMc7heD3xRd1Tmj9SGQX09DuYMCrtSmjh1hEGElO6oSqsXX7LSIGVP2w0egucjVd/39MIhZY8xHU1nQHiDuisH5RkhOOQFvRgGXkmL0BohHcV+w+PdA5dnMVoJqtIA/mBFEc82E2jqYqAneCFCaLSnhp/7bQu9IJ36yJMFJ2cJVVlQVROSMayWGzz10yYkSUcI6TBux2z8JXWhCEJBzxjRWHyd0rWW0B/haR/fizCNIoobatshtcHZmJP5OcLFhGHApn+kbnKq+kDsv2U6S9hvLSbx6TrLfHZF13U0TUlfl5xNr2nLe3QfoJxP1zecXp6DEnSdAt1hgz/w3/2P31DXO07mE/wg5PLqlCAIMFYxnmmCULNe1+jA43F5y/n8FxT1PUk8xhiHsS2ejhFEKNXR98OgbVzHh5s/MJueYWxFWVSEwZh1tUTrDlBoNeLm/pbtYcs/rP+e+9U7Xl9e8ebN3xKmMc4dmExS6koznszROqJutux2HdPJa4Q0hFGI78N3393T1RAlr3A4lusVgZeQTlO2ixxUy68+f8P9hx/5dLvj9fmcx80OESb0XcfVm9dUbUFZHyh3AzbPGTiff0UVr+iEI981BCrCdOYY4nRoz0fpAOXBan3DPk7oneT2k4efpBSHAukyTi5PEIHEV5o4dny8tZye+NjKMZ+FKA+2yw2LVc4o8TmdnxFGMe++f8d1dIJVZgisE5KlM3TYE2aCx9uGUZRRlkticcbIP6FlS0PExfmUT5/eE6YBk8kpb998zdPjgt2y5Bc/+4rlYk3V7AnDCfFYEwZjLq9mbNeG3km8wPK0WNKYn+qB/99+/clBFdYo2TAdXWIaRy8N0mp8LWiaktX2E42xtF1KEkcst5/Ic8F0HrPPt8jew9djoijg9vH3CDzm0z9ns7lnsbxB9Q9M5pLdfo/wBK/e/ILvvtmy2f8z6eiaH1ct/V7hb38gjC6hS9HWJ8kylsslNlszyi4YhSOWmx/Ylx8Jo4CT6S+ZjAt+80//wNlFgCgHXuJ+W1LXQ7vKLJmThufsDyvSNCQIUpyFzi7Jq3usCTG2Jo4m5IcNdbtGeYqHh5wsDfnu3Q2fbv+ZZORjnMOYJ6I4oWs6iuKJMIbx6ITeKqw7DKER27He/cgo+YK2y7CVpmoqtJdQ1wf6ICAdS2Qf0zaPZKFkvV7iB9B1M64v/4z1oqFpK5Y3TyRJg1YGX4VUVYP0eh4fl4zTc7JkThjU0EXk+x1dpempCP0xaRbw+LhlvxZUJx1PTzf87Odf0XZw2OeMxyM8PeLpaYcg4ocfv+f1m1e0rUfb7glDzX67J45GFNUTbSP47LO33Nz+QGcc42xO0+bkTUU2VhTVmsfbksvrBKEb6maN1BWJfkW1WzKfJSxWJenUsT0sOJmNWGzW6MbHy7qhMm59IEhi6tYghWE2vsbTkBdbgugU2zkUIZIWJRTj0RnNvuVQHEhHPr2o6GWHH/qAN6BNTEOUQl4KpBI0TUXkUpqyP3LnBXl+GNiNFpT0Eaplt38E52NcRVVVSBFju4a72wV3/Z4oGKNUhvEdXiKROqKtFKPZmLKt2O1Lqu6AM4q2Mfz44fdY89OjuN9B21pMqogTD0FAHZacnFwR3DpMd+SdHgMjvWs5P8+4vEzozdAi51xPWTXs9gWHQz0gmawYGKBtdwTlDwGoYaY7ooKOO3fxHM0SR/9oz4uFwB1HWMSzOqlRCo5SLi/97s5iTY0xFX39jCIarARSCZT2jyqsHtAtaUqWJC+4KYfA9oNPs207mqal7QzGDiqhEOK46j8WCshBPdX6udZUoqUGAVooPM9/Fkh55oNKMSjMxlhMZ7DWUJYlvX1WQtUxnBQQht7L+5XH9fNzc9bzYO8AYQUGe8QsyeNnOPgXnn2t9GD7AZQv3MtIS9d3z0cJevHMqxVo7ZFEMUkMTAfmbNPWg/raDh7YpmmPamxDXR2O/vzh/omjoqw9RRCEBIGP5/l4vib0gxfQvXMwGo0Zj8G4o+e2M/TW4vsCY0p8r0H0AqR7OQwIFAJvGOydGwgK9C/tZAjIq4K2C1FqaP06ivn0zlA3DV03FDH0gDvWsg4WlB5jDV3nhnvsKwI/HqgKfT9svaRA9D5COLq2ZrtbsF6s8NTgtX66XWI7jfCev+sW0Ts8X+H5PtYKwkgeDznDIawoLBJJctqyevsbuqojSCK220fiTA4HRlW9PLdKOx6fVry6/BLl9Wy3jzSFRPQp09GIm7uPaM8xGmXc3a0Ig4zQ12AgTRuaKiH0R1T1gb5vWG+G1jJfhfQenJxHgEP3MacnGU23Jz8Yvnj1GevtE3Wzx7Y9k0lEma8YxTFlqxglI+4eHuitIpIZh+2BJMmIvQRrFU1jQAz2E9+XaJUymUw47LcIHSMUPK7e4UUlvp2TZgmr9Xt+/83vmYwyvEARpSnVIefi/AwvqInDmEO+5HG55M3rN5yeXuH7hs4W7IqS6+vPsa6gbTz+5s2XJEnHH777J6QISUPFOJVE/gXKk6y3N+x2FUk84u3bP+fjx38ijk6QoqZq1iDg4WlPknngGWpX8rC4pbWWOFE8fHxglxcDnlH5FFYQjyK0jTCiw3SCKAzYb2/xhEdve4IgQjJhtbsbtpyjC9omx1MdSTbUlEfhHESJkoKmbwi8iN/98D9RNYqz0TWzi1Nu7x64Pr0CBcV+x9TfcShbej+l2Xb00iMNxsRJTxBoisM9hypCpTll7ZGOzymLDUpblJbEfoyvG7RXkoUJ29wi+hbpJKNwSiNrJJYg8un6it1mQ5SOsLYmS2MeHzY4LGFwjvIlcaLZrHZk8WvCoCPNEr774Xecnr5iHgT/twfL/6dff7qZqqmI4zmGjnW+5IsvvuT2Zk2vDF6SYW1DNu2wHRyqBZ3b44Uj9kWFEXs+3X8iDO+pmiXa06SZZLH7DqF6iqZlOlKstiXrTU0UJ/zL/+1/YBy/BRR39/dMk3OCKOLdj0t+/qsDaRZSNw37wx1NV5PqKUpCl+8ZhydI7djXlkNhWS7u2RVLznhNEBnyYkFbxvSqYhadIwhJkgDnzrm/v+XPfiFZ3Duk0vzw7kcCL0PagLevZwOuQ8dE4Qld84ixllXxkflZSN/7FPsc7Wum04iPjxtevboiP+ScnkwxbUjbCn7//e84v4jZbjqK3Tuk6PjLP/sXPDw0OK/GqgsaZ/CBQCds9p/IogN13WGtYDq6Yr9vkF6L6iWur1BSslh+Yja7wovP2a521PUCGZYoJdita15fT1hvaqpmhe+n/MUvvuSHd7/h/v53fPbZr/jw8QOTqWa1XLIvNrSuJEpOsNYj8EKM6+h7TVEYPB9MX2O6YcVYNxVS9SAMDw939EiennJW65og6oiThKbsKPMnlD+iM4KuK+nqAl/GqEwS+AHG9CRZTGtagiCibRWjmUfoR6z3Nc4emPhzlIBDYSkbwXb/I7GnUWqCFzmEa8kP9xzqkvF4NMh0qiPLJjKQpOQAACAASURBVFgnKfKWzhVURY+UT0RhRF7sMNYSBBHj5HOWzSeKshrUNjOiqjfMp2OqeocAtpuCyeQE5wyurwn8FKVhs1myXO3I8y2OjiQ6Y1JfonSPDg40zQ22Dbh+nZDGGbPRhMCXLFY7DtsdaTr0ND+/TCfRIsa5Dt8bgYv5NPkHMnuCFygoXpb39AyK6WKx5XQuySIPb5QhpcR0LSezGGMFypc0ncB2KYdDxXa7I89z6rqgqWsGhuhRxXPDevjZC/isrA7YqSO/Ujx7GHkZVnoYgjMvI5tEyqOAhRg8iwhwkl5YjKlo2/JYaep4ksMwqVWA74eE4eDJVFoOjFDEUHBwpB4oMRgfni0MtnXY3uI8NQSWIo8wCI7tT8e36oY1uLODkiyVwjsWCnhKHdfTAxLKuqEytes6uuchtmgHvBLiSCY4DsdKH3m04o88sUevsHPDf/seK+UwNB4JCM+f4bPa/WzPOP7hy6BqjIW+eeHVWjcow4NyPhwQwjgiTtPjgM2RHztci+kMbfvsk22O93y4DqUk2tOD71EPqpJU8iVE5nseMhjek9YpV9fPhxhersP3FUKDFXuyVA+qtbWY3iL6Hq0DTN/Qtg7P+ylo9awkK89QN0cVWoI6epHF8btRdwYISJIUP9T0Tr0UPxypwtA7yrLlafFAVefE4QgpIYgkph48qfTHat6BeoWSgrprsU4g+0Ep6zlyZ5VHZyxel+PEhsX+W8aTz5l7r6irLWEU0rV/9NzWjraIOTn5jJvbf0NfdwjGRGnAod6RJAlp5tFTM5lNeVwsOJ/NCP3XRGlHJVuCMGOze0+azRFM8L0Ouh4VDUUFwka8nqQUbIjjhKpdEHQtl1lA18Ysdx9xfYJzB0xviEeOx809rR1zNbtgFChE2NOHI7r9mnW9IwsnRCpmlI2p2hXloWXys2uKieTs/ITfffMHyuafGcUJ6+1Qw1pVGmssp5NzslHK9z9+x1dfXKHVCC8UtM2eUEfM5yH5oRlqarXG16ckVyVJHHLIW0ZphnANzmrOTt6gdEN+GDZ2XdvTKxhNJiTJBaZtWC6fiKMpdemYTOf005j7u1u0P9yD0TilrArKuiKOMsbpFNf3JGlG19Xs88MQQFInBCNJW1mM3RKnV4wmHbEfQK9xruCwW+GLDE97BIFkXdVsly3Kn1GZgnpbMJqEvL/9wMX8nMYref36z2lFja1S5qeXXJ79kuksYr35kc3qhqfNP2PtlPnZV+RVg+kk41chTd7gy4TlckkUJjjX04UVnx7/kb7yScdTNocloj9FeQEnFzPm3hzh37B8WpAmc5wS6MTy7sOOKBsRxzHdDvJdSdd0lMUj+3KDH0bM5jE/fPcD7uwK6xw3n5Z4viQZRWTjEZ1pyVL///Qg+R/79ScH1cCdIXofL/AIUp/bp3cYN8bTAbNZwHZfIfAxYk0cjCnrkizLKOoGoaAuHcloyv5+Ty97dChZ396TpjM6KzAldLZF9DVS+qx3tzhn0DIg9MZUXU42HXP1esp+60BZ6rpECEngpwTelMfHBZ4YfPTWJgiR8/27f8vp9ISz+Rd8/+2PvP18jjUe2Thlta549/49r1+/ZbFZUB/GVGXLflfTA0WxIktOMJ0FCcvVFidahOo45C3OdQRRx2a7IUoyhIAoDoegkhgTBLeMshQtJbtih5/coPSUeDzj5iZHiA4l1owmFjrNflGgRwdUomlby+wsIgln3D9KwtinriyTyZi6OJDvt1jXIkWA7iOassa0PutFTZxs6eyaonnArqZcXV8iOp+elFfXUz7c/J7dpuXLr15T1y2zE0VVrXHUZNmU9x9+pLYLnI353e/+EV8HtHnLaOLjCbj7uESoCqRlPMnQQcdhV6H9nslJzNPjlqflgqYVFBvLeBbQGIenYvAbosBSlkMt235Tcj47p25zOrunyBsshmKTk4RneIkmCSN22y2BO8GXPoeywjch58kp1ttwc/OImp0TRgLR58znX7LbLNGFQXaGIO45dB2OnjCcUu4VvoJO5GxW95zMzrBux8PjLZ6cItw9nVvhjEIKj7YuiIOUutAkSUZjcjxvj2BAbHV2B06glIejojMFbddinCFJLMvtHWVZopWPHwztLmW1JRvByfyC05M5794vWKyeODs9J45/UmaccRhX4gUSZy1SOpwdFMkkidhvy0HFE8fAk1C0jWN7KGg6iaQiikfD6tUKtOcThEMIxcoUqWJ8LyJNS6qqYL3cEKeO88uUzrU4o/n4fsV2UxzVJXXE9HQvrNPBH2qHFDa8KKnPSiXP9aGIAVLPT35Y0Vskg2qrlQTFi190SJXnVHXOZmsHNfeoeiKGtL+nNb6vSZOUcToiyVKCIBx4mogXlbPvh88S6xBHJVPIo23A00duqnvxz7a9RVg7vH8h0F6AlhKZ/DR4Pl9H95zwN3bAxXTDGv4nSwTD4CqHAJlWGinl4C523fE99vSWF9rBy2cnfvLMPlsHnhFZzwxbNyAbflrPu+HA8syKFXLAeD2HzKSSRHFIksYcDR3Dd43hPlrjsGYYZo0xWGOP1ohhTa+9YdXu+/5wgPA9tOehPA/fCwaWK47r69lwTLHDYG/dEEwLAknbNphmg3NgDC8VtWEYkaYRh32OhaPyfvRIK4FFstsPCB2petpuCJbIXoAbPNudadhuN6zXG6RSpOlkSN67BhkGZKcTzP0W2feI3jC4uy1BEGC7ludQmJJ/pPzjUMKitIXAkSZXFIctUTwm8CN6pZllo5fnVkrF2UnGNEtYeSPyaoHDItyWutsym8+piwLnHHEckcURUTqiN5bl8sB0dI7tWgJxjilgnGUIYandAS+LWT888PWbhC++rBAhzOMRYTqiKT0+fPg1D2tJZwfFP/KmFH2N53waK5iEPm3xSJSN6F1LU68pTUugoToUxFGGsD6+iDHC59tvv0HJiKfHe3rjeHvxt+yLNUkS4PkFd+sdb66+Bq/ncblGBwLfmxL6Y+Ks5u+/+Se03/Pqsy/ZbUp6SsrGUh4EZ6cXlGXB7d07JuM3mKKkrCxhOCX0Z9RS0NmGxVPBVz/7jP1hz3qxBNnRNPe8vvoS6xocho833zDLfokf1S8kEM+LKIsKT/ts1zVxLCibBVILdvmK6TRF6ob7pw1953H6xqPYbxjFKUW75bBfsDs4hBpTNHfE6oz2kCP6+oi1K/D8KatmT/6wpikcdtZzuC9QpyeEUUstch4+fMJ57/lX/27BKv8B0yiyIGUSeVyenCP0jqo88LT8hOzGTCZzzs5mHPY1jgAdjHB5zauLjId9TtW0fKxvmThJICLEKGM2vqTYd3R9TWeGOmNfTfnVzy/47W9+wAtjikXJ42pJF25RxhLkJaZdQ9fz8LjhZJrRy57HpyXXr1+TJjHLxzW06f/R/Pif7PUnB9VJOsbQ0rWaKD5ntbkl8HOS9IzDtuVQOLIUmtoixeBnyJJTpCrY5QWb9R2jNOSrtz/n480t3/7uPafTS/bbA1fXKcW652mx4vR8jMeUaTZsD0fjMz7/7Gu++c1v+cMP/0SWnGDbiM+/POH+oabvLUmSkiQJN+9zJlPBevWIlSUX539O/x+oe9MeV7I8ve93zok9gkEySeZ2t7q3lu6qVrcwWmwLMmAI/sTWKwGyAAO27IGsGc3S3dNV1VV1l1y5k7Ev5xy/CGZWz5uBYEiCHUDezItMkhGHDPKJ5/8s/R1ar/hH3/wz/kZnCOEPrVlZRhzPiOOCMArYb0E6OeGoZrm8w3F8LBXniy/Ij2DEgU83txh2oHKssATRGXEc89C3pMkrdvsDhpK62WPigNBL2a1y+r5kXX1E2wZPWb747Gv+w81f4PhbyjJgNr3ih0/fsc0tb68v+fD4PaPJBGkjsv0Dk2QGwkcJl3F0zfqYofUfaWvFq1czFB1hMOP9hxW2V2i5ZZQKRtEFVdnQdT2uN8Xgsdtu6G2LMTX7w4FRnIA4p6xbYh+Wyw3IjnGyoKgO7Hc3KBuhPINrx3RdSzIdsV3XKGFJYsXyNgN/aG1aPa5p6oCy0RhhaTUUbU5T+6SpIPQt79/fMDubkyQuwibU3Y71ymc0dkE0aG3ptQElWG+PjEc+2c7hmy++YXvc0DQ73l2/Ji8Gd+tsPCKSAWM3Jgg6qjxDOQ7WGh7uV0ThNXXdcnu7Z3qW4wZzHu4zdvtHpPTIqweaJsdxXI7HktXyExeXCW2rUVJT1kuuL18RhR5NbdG4BMGI7XbLTx/eM5pafvPNf4fpDZN0TtcGjFJDUT1Slx2eN6Y3W/JyjyoUrlS0TUuc+Nx8rJhOs5N73iHLO8LoZ4ul1pauL+iPBotDU9+SxFPqoET6EQO8GFziYFEOFHnFdmdR7hC+P1+4g/HHHXRUVdVgbUrb6oFxKEvquqWpe4yFMHZJ0pCmtZyfX6BkyG//+gfqukYpC0h0ZzibJ8znY6qqoygKumaQLxjbPRuQnhzsQ5mA+ZlJ5QTGno1dA/NqrR3qMp+BrjjVkDrPJrAnXtcai+laqrYhOxy45w4lB82r5wWEYUQcR4RhSBQGhEGI53lIZ1irp4Yqo9sTmB1A4sBSnlqrzJ8YmJQcqltddTL0DAys4yg81ycITkf2JFO1dmBjT9rSQRerqer2pBU+PebzTYZ/1YnB5Gll7NAG9feMXacEhafbP0eBCfF8m6ftSZtrTrFUPx+rPTGZw0WC4w7A3w98lIoGWcKJOR9MdPq5LMGagZ0tjjmlGJIApFI4KsB1T/FdzomddSSupwiCECkl2mj8IOTN28mzYW1oCGtRyqBkQxK55IWlbTu0HqQTAoE2Ll0jhqYr2Q75ttbiSIk10LQZTVvR9ZYoSZHKo+s1nWkIHEHXdWSHFsFwgSVORkADQwJD1z6XTjylVEjkkOQhDZ7jY01I19Rcn/1jHFMTeymL6yt2q+3zmntuBEZx3K4Rvc9odIURlv1xS1lkTNPpUDCzSHhYvccRIfWxxvc9hK1pux1VLUjSCbv9GunG9H1NdzzQ9QnvXv+S6dxiPI+6CNitBctjSbP3qM2Imo755A1ZuaRrFPP0DaYvCR3Duxdz3n/7B5JZTODMMUmB2BmywmE0blk+3DObzqH38IJyqBLtt+S5xHEldV3RdyVecsE4nXB5UeAFLZ1xcOMMJ1Tsih+ZuWO2NzXW+DiOpCxrxpMzjocjnit4KD6yWFxxf7/Bd6+IRobDvmU0ithtNhSiwPdduq4CaTCtQ9/VeG5Abw/E4QycHCsNTR3iKI/xeETdGIriiJQecWo5Ph6ZnSUYW3LMC4rywGw2Qzkd+8OWqhYsV59YXLzh9kYTe8PvHpc/kKZzDArPNbTZkabwkWONCFxGl+esdgeKzR5PhgjX4dVVwrE80hQNzShH2T1F1RKomkBlzFyH2fUv2JUt88kU1eXsDgfu1rek/gW9LdC24Ke77/nlF1/yuPmOQ5FhIh/LnBdXr7HOEusu6ZuGupC8+eaK777/Dv8+IRqddO6qZv/o8vlnL9jcrWn2HZOvPG7u1kglWCSv8PwZwh65ubklSS8YBymz2ZTjfstk7vDdDz9yNhthFeTt5j8DQv632f5BoBoEKXlzhzGSXhdczF/R9DuiOMVoyTHXHLM9i+lLkFu0aCjrFZ7rkO96lAF0wXG751fv/gkfbxLS1Me2D8yT10RORt9bktjBUwlpMmNzWLE7ZIiPH/AjF1cECBsxnvts9u+JwpTdbseqeqAsaubnI4LABxGyKf8SYzqm4xl9X9BUB16+vODDxxtGowilJHX9SDq6oio0ngdIn05LEB6+H2OM4ng8IIXLfrtFKUXfKg7HDOXE2FgTj1LCBOrKJ4gSVssOZMrd6o+MEofbDwVaPDCZX/Hp/RrXbfi+/JEkEpzPf4EwCYvZZygBU/cTeb/m8uotbavZro+kccj1/CuKsiHwfe5vHthtMr759S857sBRPmHScnF1QVk3/B///s+ZnDloE5JOXA75AW8bMI5T/up3/47F+RRrfTwv5acfb+jNHt0nuP6BqipQasrLFxf87vff04uWpq2pjhY39knOBOtDg5UKqwzRSJLXW2pbo6xHke3Z73LS0We8fPWCh+Ut6cSn7WuqwhIFgs1DjxSa/XrL4uxLZFjjiICiUWxudlxeR6i+JAhjBIYkGNOVJVE4pup6vLDl8uqMoj2SV5Z0MibwPY77I4EzMGir/AfGkzPSsYfpxtw9PHLcL2kqAyJEiZ683JNXGU0d0XQ5QWAJggQMeKFmvbvD92PayqHXgofHJXF0wPNGlNUwoi6KgtCHURCxenjAGA+E4my8IExi7peaJq4RxqdrL4ijmrYukDYm8Bu84UXH4XDgbDpnFF1S1TVPlaYATddghYPuDftDhVKC9fbAXyz+HZf9f49lBlJhhUGcAFWvDZ0G4QmUo+i0RjgOuumw0gIubaPRWmGtpNcng0rTgOxQyiU7VrRdAyw5m40YTyOax5YBOmm0NriOw1dfL0AY6rqhbQR/+N0dh12PEO7g0LcGazWuUkPPuh5G7YiBvRsA6dMsfmAgxVNj1pBoNLi9MSfR52C7GUxaAzgbALqHPQXCW9tTNQeKasdqw7O7XwqF63j4fnj6cgnCgCgKTzrNoSpVKgmdGBqjun4I0+97Oq2fR+RD4YA4gVVnGAl6Hq6rcFw1mJXUn5QTOB6OG5xY1WE/n4sK+p6u72mblq4d2FnTDrW+T6zoKbPhmRF9Am7Dsg33JUyHPoHa56Yn+VRSMLSKDdFZ6omvPRnrQAmJNALdDdKAk1D2mcGVp9YwpRSe7w2j9j8pUzhpPjBantq2msEQVZ6MUtIihTvEdnmKuu1Yr9ZDRqkDruM+x5UNpjhJ39e0XXUCxuJZ3jAUCBiE6GlOY3urDca0nF+FTM9GHPbQa2c4FgaiPgkcXGUoim4AqEIgrAIrESikNLTNMBlw1PB66bQeNM5yeJ2mUUjThgRmT5E9EAUT1tsHtCPwXff5vPX9lHQUUBQrPnz8LfPLF4RRQOB6qOgMX1matqLOQ+g8xmmAoWC3rRlPJhyPRxw15nC8p2kqsuMjnS559eoFTpKQ+Ff88ccbfnzvU+cVH5d/YH3Y8ub8BU7sUtt7prFByktGFzGmPrA7rBHW8m3/e6qyxd2tuVt9x/X1L/ny3ed8untEKYeXL2M26z2HXU8URziuQ6csdSUH2ZgfMxoJ1qtH/CBBSM04nXHIazw/xGIZz0s+3f4VnjpHuC6Hg8YPNZ7T0fcWz42Yjs+5v1tjrOFsMmO3WSGEIgoj7suC83NF3WZkh5azsyscT/D61df89nd/wbHY8/J6wWZ3S+CfccwOvHz5hq7f0PSG7TbD8x2avkUqQ68rzs9fsD9YfN+nLGom6SvyPKOtLfPpO+bnlyxvPuImCWW3p8g6rmdvsKIn8ULOv3yBS8h2/TfkZU+W1RRZTVsKzi8uef36Dev1d/S7kNHU4qiG27slUoy4+Nzl3eIaV8Bf/qeCy3lKp3uUjHl4uMdxxjiuoqoC+qbBTzzuVhuqziEYSXa7O9rS58PjFe9ezNhmOaPZGe0uY/WQE09DPBr2q5w0vsRVPWHos9p+YrdpEIHgsN8TjxPGZxNMLTCdw/RyTFEXKJ0QeJZRnAwpCvWB/SEjmSjqviMMw/8XkPK/zvYPAtVjs+aYHXh9fUZVKbKdJpmOaE2BVAHSzUmCczQ1xcGinAlSxNT1gS+/+AVd8Yay3CNFQODHfPbq1/ynv/pzRukEYxyU6yKcliDWzKdjPGfCLn8g8Q1Gd6STEW0r8byWts2h96lqzXwx4bDuOZ99xnc//nuurq+YnV8y1v8cKTSH3ZYwdOlqgSTEdVy6tmc6moOf0uqaqi/wXIY32i6hrCvkNEP3lqrOWC5X9LVFOj11I3DVBatlxneH/8Tl9ZqybHh8SHBcyW53xNieMNjz4nrBZv9I12eMxlOMttw9HBhPOkaJjzGK6Til70usJ9kfa8JgRDp28P2AbFOwelzy6jLh61/9mt/99vcc8u/w5QylHOJUcLd8IE0Tbu5vKApNmPh4gWAynlB3d+wPO3z3DM9bom3DYvGCb//uhvn8jKxYUTZbirxldhlyewNp2rA+fGK5eeDV6wWjeMKf/+2PvP3yDKF92ibnw087LhZzjFXc3R/paUhkxGEPSXyNkA2mD4i8lOuX53z77QfK3mJaS3UImV9EzM/OWd3nYDTv3r3kuHoPVrG535OMYuqs41AfOJ/HBGFLmszYHZf0XUnsJTjJlFHS0JQHtJYcig2GGi/QhFMNRtFUNUr1+JEhyzrGM5emccmLFY+rJVoLymoHbk5bxpTlEDcUxDkITeyPWW8OtF2BkGccshVtc0sUDW0ek0lK4CYIK6nqnLLO8b0Rrl9RbXsWZ+/IyhvyI4ziKUZsqYv9EEJ9luI4AZ7vIITCdTW73YHJOOFstng+7zpT0/cG5QwMT11LhDDc3D4y7Woc5YCWIAaXphDQW0FZ9pRdzSiOMYecUdqC1eSVJQ7O8dSUrtf0uh10tsbQ9S1BZHE9Sd1UKKkGRtjNGaUe241C6x7BAMLWq4LbT0cmM4UQZmhbcobjUc7gGDe9QBvNi8/OmF0o8jIfzHydwnQDu1g1etiXE6gQYmhEGUb8J5OOfQJDnGpAAQz2TwhZazgxhAJnsIOfDF5PNQiAbamamqLenBjJk3XJcjJLufiBj+f5zwYqzwtOlahDHJYQQxyVOaUo1HkxNNUhUHLQ9yolTyUE6tlp/+S6fyoncE75q67joFyHyBuMWVIqsAKtDX3X0bYtbdtQ181QHVp3GMMz04mQJ0Pak6tf4fxJG9dJPwBWY/qT8lWe1uSJbZVPRQkn4Pl80TBcKPSAMf2JBT4x5U9SgNNFyFC+4OI4kiBITsB4uE+ERmDpeoM2PW1e8P6n7wZH9An0IiSO4xF4Pq43JAgoZzDIucob5gZCIkWLUhLX9YnimCRJcV0FypCOA/bbPWVRoJRAdM1zkgFC4oUhTXuk7wVKcmpGG9IEXM8HWpQz5LIa0zM0n2ms7lGuwCrB8djx1dXX7PN7tGspsoqH+w+k058/zI2VOE7CdrNhcXFOo3NiTyJaSToeEUUuXdVwWB55+eqCQ/bIMlNUTYYq62HyZytE3+AZB9dWVPWaH5Y1cidRzfdkecH87C2pk5D4Nb/5F/8cLTt2+/fYY8B6nXExe4vVO+5XDwTRFN3U3G2PHPYaf/yWUjxyu1tTVJKLxRVJkmLUhs2mYTa/5Jg/sM9LJuk5kzP4cLPH9V3yrAZhceQFk3FInmlCL2a73RCFEX31Bl+klNUG13N5+fqc3W7Nftfw+tUX7I/3tF2OtSlpOiNJPcrWoFuf2fgtn9QRR3qUhwxHhrjS55hnlJWDdBTns69o2xopBcvlDenonE5LjAZjey6vLynLDUEwRsma1eoR3xnjqIi+lURBwigOsN0Y48L8PGF33DEaJVhK8qzgbPKSV1dvefVijm0N8WhIjLj/YJg8rKlqTe3A5eUYGfWst++RbkLb/x6pxrgq5d0vvuawOWBFwndry0gW7IsCf7Sn6EIuzr5ksoBK94yThNRNqIsjD8slo7QliBwcN0DUhvAs5OPdb1mMf8PxuCWxrzmfp7z/9CMyHNP5Pb0qyZqMLtc47pHYG5FepCBbdBdAdyByxqhQEHoBebFisbik3EmiWPC4ukN5PlnekRc1VbVjvXpgsXjxXwBi/pfZ/uFmKt0QejOE4xP4IWrWUnUF2WaFUiPS0RTdRRi7J0kTsmLD/rgkjDri6BXJ/JLjcUfTWvJ+w83tHaPzod/9mGe8+/IL+r6h6e45ZBu6ZstkfIalQRBgTU5V5gRezOah4+XLmDgMkUYyHU3ZrA/88qs/Y384ctxXCAKiuOPq/HP6vkJZB1RMv2gosoKLswWbZUmlV+wPK15cvUQbS14MTriqYjAtyIy6soPbv+owCJJ4gZAFbaPZ73ZYE7Da3ZCkPlVdUzclvhtxON1vvvf5+P6I4yR4nouxPVUD3/3wPa/fZITqFW3d4uATBSnHbElWVhz3mt3+gXiUslmteP/+Oy5fQeSOKOqc+8c7jnuHujZ4gU+Wt8RBym77iKMqDC7T6RTP99gf1wib8O0fPvKweo+2JdEoQMopRfNHRr3CipbNrmN+mfCLX1/hyZDLxUvqrEU5c7KD5eJiQlPWjMKA1ccdyvHobMu2KWlrl4uzOUWxJ55K+s5leVuTpiGx69E1DUVx4Ky5oG96jK6Io6uhbtATtHWPkorITaioiaJBdH/YWnS7wokC6r2Lbzwax1LkW5o6o9UevjPiuO+o2hWjDBazc5bLDW2fcaEuAKi6iuXjagh3li29dRATjR8qupVD32qKQjAyEoSh6w70IqOjZJ+pIcvW8djvNFK2SFJqVQ2f/E4/fMApjeuOyfZ7lArYPA75nVqXVGWPlC4oS9VUNDuN42mmZylVWQCarqu5vfnwfN65nksYTqnrQTvnqKFIwFhxYsksVuvBAHX6PxbqWhM6apAO2I7tpiXwQxwnwPgh/SnHVJ9yR59640cjn76vAIEXBAPQkIr5fMzjfUaedwhhkVLRti13tzu8IMH1hrB+oweubmD1AAbg5keKKLX4I5ckmOFYj8CN6LqWzX6LxSc/VnTNELt0zEradmj0GmKZBtMLMLC0ww/AwHQJzIlflCdNrDiZewbQMfzSnoxiDu5zeKZ5olwHZlLX5PlTFMtThJd4Nkw5yh30qp6P53m4novrK7zQOa3VMC7XekgoqNoOa08M3imdQAp5YjqH+CpHDXW0T/WuzqmOVp2qO4UA6SjCOMKLgtP4fTAWPckX+pPEoNMNRg9Zsz9HbTk4T8yv6zybvQadq33OtNW6p29brDFI8bQPahivy2HsOyzJk5nu6XkQQ+uVtrS0CCtOdbwS11V4rocQEs9zCDwH5UaEfsB4IdMmmgAAIABJREFU8hNVXeF5HtpoQKNNSVGWuK3i3dvPmZ7N0LrD832kcvFd78RkDykRfhhiJRgGBK57wyiNiGJN2w/gvm0b6qqk1y2bjUI6EY47VEJa2w8KVG2oaocwSvFDeZJa9JgTk28RKGup+oadLoirMbb0CSNBdP2S437L6vb484epl7HbZjiOj/TOcChJ0kvCqMZ0LUoG7LYr6AyuGTNSCTuz5np2xsPqW7rG4+L8klG0oOQIMkNYn+N+w4vJHCkt/jTE9luCcMxiPCI/HClshhQufe1xfX5BWZYUxRFXpoyiGHyX7ccc5cO6WXI1+4YkTvmPf/UfOB4zFufnCNUTxTH740eatiPyF4MuHoHvu2xWOYvFHNfrni8AHK/kkN2iO4/p1QVFdWA8mbC/vScOIrLsSJk3GDOYEONwhnsF9/f3uG6KKxMCPyRKLgjlW/6n/+ErwlHBX//1f+T+8Uc+/PRbrl695e3Xb1mtHri+/JwPt/83yglQXkbdHSmzmi/e/hlZ/sDueE8cJGjT0TQCpRyOxx1awygeYWxDfoTz+TlZuaYuOwJXsFw7vLwcE05bNuuSx/Xfst8VPDzUhLrACAVuwvj8FU3bcGYMKd/SmN/QhRGO53L94hUfb1ZIV9Jol8n0Ha6vKPKKxXzE5UufT+sfqa0kfG2QDZiqx/E8uqag73vCyKftBMpvUTbl+jIm79eoRrDXG4TrE8YOKoy5WCR8vMuYnb1gcumy32nCeMpuf8tISLQ40DWG+ewVHhe8uXxNWZc0TUm9zHDlmPRa0jUHfvjxhjef/+IU2pLx+HjE9i7H7f4/F0f+V9/+QaAaBylRNGW3X1HXPfHYw+KRhGdD1y8Vx/aRbKvxgw4pO5p+j2tCtoePBJFH1ZXcL3/EDXL85Jz5fM7t7ceh+Wkr0aKm7yOqxlCXOUl4ReCHHI4HJnPNKEwJ3SnTCYyShLoYxm/Ca/EinyzfUpYHXlz+ksNxSZG3BOqCs9mC5f0NxmiU0oyiEdJmGLtGYnj58iVoQ1sqXB+USIhiwd3tCtMPAe5WgtYR1mqKPONsPqUtJLqHy4sv+Vjc4cqO5MxSNmvqPEaZhBeX7/jd8ifGZ3OmcxdX9oRJx2HrovuKzaqjrdZ88UWEbX2yg+b2focbtQjhMkmn5NmSv/jb/40wVSg1535zz+r4gao+Mkk+5/2HP9J3gpcvXtM0Ja6jEHRslzVBYrDmke26IYok2+1PhLEhGR25W92SJCleFGF1QtM84gcxd/dbOr1jklxgWpdXr6e0VmHdku2uZTq94mqREkcFVSVYPi6QtFinIDvU7LYWREfdlvh+zGg0J76Q3HzYkaaaprJ0rc9oNOHm9gPKtXz59VukV3PYZ5jNgbbraRtDmT3giog8yxCqpmvh6JYER40jDcpx2R8qjpuCZJRSVQF0CtmW+OEEN0hYrvZ4kUPVGnaZodESR40p8yO+M6K3AtMqHGcIhs8yPbzu9jscx/Ly9Qv6xlIV0DaCrre4TsjjqkR31WBOiV08H6pqR5Iawkjx8eZbPvz0QBjKwS0tIqSr6EyHS4LyDWXVIA4H2rpGKUXTKMSfjP6TKCWOY/KsoW1LlPLQuqGpu+ee8t6awegkT8YahoYpJQc9mad8ENB1PUkcIIkwRp4yNw3WSiyGKFKE4VBmoPUQi+U4gr7ziWKIIo8iH/q/rR1iu/a7jO3G4epFiuf5OG7GqcjpOeAeC1Ve0pcpVdVj/JzQ92lFR29aHGeonLy+HOMoh84vKW2GNpamaimyI8eyoih72o1Ln3n0naXrBnD0XOmKeR5lD3mw9hlUib+nBR3+7ufa2NPfi1PTlHpaf/En34dBuzE9dd1h6uxZTyulRElnkBa4Lr7n43jec/nBE9B7Yn2NZWjt0gbTn8bZDABWCnEKqQdOcUziFK8l5Umn+5QmwGls7zo4rssTczowxwPb2+t+cA2bnq5qoRxu9MTcDhWyp5G+64F70gaf1sZi6Y3B6h7R/rwcg+Ti5xxb5ThIxzmNydWzfENg6XSHsPIEagRKDmYzR0jQp9pcnqKrBFZahJJMZjM+//IXHLL9oGFtO7TuqFuNKVsge5aPDFm6A5OvhgaFwXAnXYJA4Lk+Wg+B/pPUJ4n0yfDYofsO3RlczyPwI3pzAq/GIpXFlQ5VVZAd9kR+Qhhd0Ls+wUxjtCZJrzC9x/bhL57P28Nyw2xygReM2R5z6KHOSppuTVcrOj/mxWcv+fjjdyy3axxZM/IsjhORuBM6Wpqi4OLiFYHjcnl1RlVEvPrsLe16Q4eko2G1uycNY/Y3hk+P3zG9XFDWDpP5GWkaoa3Bc2bI04VoVuTECfjSY7t5YMw14xiMPVJ3OYgLBA5l/UiceIxGU7L8SNeHpO6YwE9xxiGz6WuK+nuUdCnLHEfFlOWB25uCi6sXoHo2+wesbaibNYv4MyqvxPNi1pvHQasuOqyGKIhYXERI55q2afjxp9/z5vo3RMGEr97+M2aTC4ToaDR0ZU0aXuM6gtCfkJUb6trlxYsFzfZb7h5+HEpAjMbgcNjdczZZ4Hox0kBRlOi+BZkzGV3wcHdHa0p8N0b6OUkwZhxc8/qzl/ybf/Nv2ekC4R1oiTjaGtO02O7I8uFI9umRf/WPv6Yqam5qhzEFh8d7rI6J4g7rwW6/xHFKOPYk8Zj1seFhV7BY/ApnJKjaHXf3a+bjF3y6+wnRBlxfzCjuSxZnV3iR4fbDlnQW0Cw7utClrmrm6Zj1YY2VI9Y3O7K64eLqgr510U1BGlgyrbBtj6Fh+bClLXp6nfLh5juMEGgzYjF16PKS9tgy8R3Ogph8U9JmDufzK3aHPyJUNOSa/39k+4c1qk6ClD1RMsFxYbtbM4oVyrpUecP2eCRKD4Rhymjscvuh4Kuv3tIWAe8//TWjZEIchSgl+fKrL3n//ZHH+wdc5ZDnG7q2w/E0devguWckyYTtcsmbNxe40tBXMWEQUmQdaTpiHF+Tbze04gBkBI5LcewYT1KQOciaJI7ozZ5j7jObXZEVObv7HKUy8npGVXW0WMqmwugez5nx5uU3fLr5SF1a3r75R/zxjz/Q1h6zixFtdWR29pLRSNI2Ib7fIYUliQRffHEFbstyuSeKAoTxuFpcU1Y72u7A2eScKjviui3TdMb68ScuLmNeXH/Fcrni4uochwmHXcO8eYEKCqq6RvQRmCUal/0+Z7cfNDfQsl21HCe/B2o88YpPH25p9JooVkhZk6Yprqc4v47Y727o2oymy5CNYHvc83jX4Md7vLilaSy7rGNkGqQMqfI982TKcvUJR3pDNBU5V/O3JOGCpq7oSVBxj/EaEv+CybRAtwFxbKnbBw6Hlig6ILhANw6OE/Hui5dM4nesVxmbVUfox+RVxuPdgfF4RFlarGypu4rtWtO1Gk+WhIFDVze4geHqZUBZGqKRwQ0hnijaNuBQF0TBGElLnuWcjy7JipK+kMhGkR9K3kzfUOmK84sxtx/ec9gPpi8RgDEC3wvp2pJeGdq2Iz/4WFPiOAZjFEXWE4Quba2JQolwwfEc8qqiO3TUXYUILHghWZkxmftDVJLxcAPJ7pABPtLtsbbCqAZtHc4vryjKDGF74vjnNwWFQ5EV+G5I4E3Zro9I69L1e3Jvzdi7QDSnQHtxqsF8AlAorNEIRyEdS9/3OMqh10PUUm/aE5OmsaYlTodqTCFc4jjAGMV2u2W13DBfpESxQDkOfT+wqko5VKWmqSWu42ONpG01xmrkKdcVBt4zCGOCIMT3fAQOnq9ouwbpOPR+y0Ft8JWP0R3y9QpxnVE1GborCS1YU6L6iunqN8ibEV1vkUJRFg1FXtO2hrzoqcqGsmwoqxqjh5KDyKTEMj0lKJknK/mzThN4dkEZa08ZsKfdN4AY2EczILQhv1M8K0SfEC/WdnRNR1uVGGNPaQzDmF0qF8cZ5AOePwBZx3HxXOdn49TpNsYMI3Jj7LOhTGCAnj+tbnVOebFPJQFP2tnnmCsp8KT7bLJ6YpXFaZeHx9K0XY1tntIGhm3Q0Q734TjqTzSu8llKYawZUim0pmmaE/NsT4kKdjg+LxwkCUoMrX4CjLBIV5BOErjlZ2b2VDYBFt1ZPr7/gCM9mr4dHhuBcIbnQ3onUH8qUzB6yI+tSv18kWLtaT1OH29WaKQcAtelFLiuRLopwurni5a+18NzKwyedJDKorueLM+G1AApyIo1TZsQhIqwUxwf1+TVI5ezn8ejwih2my3zq5i2boj9mED23N5uCKIUpQr6RpN1O1ThEUrLLL0a3PTJmP2uJPKn1GVOU9WUgeDlm3OCZIrsQz5b/JK2WGHa3zKfz9lt3hP4Pb4f0pktrlpQZjWucnC9lOywBhHTdArPW7CYRES+g+t63C8fePPqc0bjEUW9IY488mJPGE5xvZDppKMufGyv6JuA7JhzsWg5HguISvJ8izY7emMJ4p5Pd9+Spimb9QpLhfRn5PlhaJbrarANyoftbsvZbIrWLcuHJWWVoWTC3eY/0uoVf/4fBkJgMpWMUw+kSyOg0w+8/2HP4mrB/eoH+s6y2RyJk5TtasmL61fozuWY3VJVGWtT4qoZTb1jHF9QVyXj+JxJeM2m2lCVGdOrc/K2w7WW/X6Hf5cwjs8oa5ez8y+gWDIOX2H6EV3d43gaXnj8nenpynOMs2b74YGRf8XLzy65+1TQ6hwBtLqmN/fU65JRGjCev2C6CHnc/hGsR+iOaeol9bHk8uwl6/0d03SOLzVNVlEXD9z8VNEZQ5AG/PjdLVE0omwLlDmQ2Q7fd6lNiWc9/OjAw/0GpTyK0iBc8OIxKoK6XFP0Fbq3BKqj0inaSl5dvCH/dEOgJmx2GeeLCUGsWK12fPXVryjr/58wqqPRnA83t8SjOaPEpS4NZVaQV49UTYEvRrx68ZbCaordT4hO0hQt2d7w2csvePi04tf/+FcoUj7+cCDxE3w/oe9cYvcK5RmSYEEe7ej1ga4KuFhcDd3x4wApzliv1owmIUan3G9uOFYtqB1xNOFwyAgiByEtm/2G6cwlPza4jqWsLZl0QNaE0UvGY4fN5kA0OYO6I5CWpskwtibwUi4vXlCWRwI/YJIumM16LhYLxtGWd29/gXVWvP94T1FPGI0cosAjf1gRhjllmWOFYTzyqco9vh9ydj7CjfcsVz3TWYS1Ld9885asWJPlOX7scdiXKGFodMHiVYQUY5aPhkre09YOcQL6UBOHhqbRSKdAKR/HdTDa41f/6Bf8L//6f+XlmxjcDDeYEAUzsvY9d48r4knE5XjK5pCzWS1xRhOkF7LflZyHHpvjjuQ85IuXX/P+D59QdkR2WGJawfwyYbPekUYjHOWz2d9xqNcEIw9pHUbjI9ORR1EJtCxRnqCoamaTC+rasl4fidIzyp1m5C+QSYhSR84mIw6Hgig0CN2RFxVCGfbrHhUoNA19pwikQydBW4muOzbrA30nuQoW+NownaZ0/RZRFphaU3UaqWoaXT1RTmyPDUqkONInFpqgKbkKW3zds+5Dytyemp9amqpD+d6gb9IObWuoe4Gw3SlWqEdgaathJHgoMpJkghcHNFVDXsJqu0L3FWmc0jWavjOEQcRsFlDVFUIOrJ6vEs4vFngyxuiO0RjiKHo+76LYpWtD0tE5j4+f8H0BtU8Sp9wkf4mbL1DF4tkwBIAY2p2MESjHR0g1RDvpwWBSN4Pmru2HhqOu12A1Sg1aVcdxTqYbM7CoWUXbGtJJhLfM6fsnplEjBGSHGt0rPM8bRsBmMM88hSwNa2ZoTU0SxWjt0PQVubrHTRyql/d41znGlTyuNrhqhL0XGJshLbQVtLbgUD6w9HL8tyOSZMQ4jfGFweksvbEkvUTgcnPzicP7DxjtUuaaOP+SUfeWvKgpy5q+BYxD3xv8PiKwCYiB1eMUrP+M2k6sIAza2WfFwAnPPgFJ+cR0IhAK5InZtOaJ4Wzpmpqm0XAYNLeWoThCue5JizlICRzPG4oPXOfEog5A1liL0WYwXnU97TP4HHZoiJ86jemlRJ1YTanMCWBLpDTD8ZyishQno9Vp34dDP6XfGoPpBzOZ1t3pWJ5qQk+yglOd67Nhi0GSIIRA9y1dp4d9NKea2JOG13UViCGrdXjtDqY4a4fAfmuGdIpODyxqW5dYLU4XWebvme6kGkoeBkAsUXK4oFJykFQ8Mc3GQN9aequxtsNiCYIQIb2THlUQ+BJth+dZ9y3H44HbT5/YbrZ88fkr4sRFWYPUYDrYHY+M/Ard9kSXb57PWzlyyLctUXPkLJmRbx5YLTPCYIxwPYzxcHXAaHKBcFx8GdFUhtHkgk31SBcoSrdgnIR4UcjvP33HY11StH8DnSGw/ycjLHV95CE9p3YNSTAhUQnxJKGsajwv4eHmkXdfpRxVTdtY0lGA1YJAhYRnF2A0npdycfEVWuzZbPckozGzpkMZB9+xBN5n3B5+xLQxDi5lfiQOxnz99l/yl3/950zPQqww1K1D2k3Y7e9pbU8URbRmRVHvqcqGaTyjKvdcnp9TVBvOZ1PiNOXm0098dvHP8byaMJ4Qxmc8bg68/vwts3PJ3ccNNw8bUBKkQcue7fEDF9f/gkn8jj1/ALFiu/Q4m8xxrE/fAWbQRbvKxXQdkgmh6/LZ1Re8e/UvuL//QF8fubst0NeGySTl8f5ImFh+uLlHhGfYTjCKJtzffaRtJsxnMQ+3Hzi/9PHx6PcF+2LNdCpx3ZgeNRhwRc1+d8QPNYfNFqkMk5GLRrGYnyOchmzvc/3KQ+uTDybveGy/5bNv/inkB4rigOkBU6NNTOCmdEWNGw514p5yCOSYSaLJj5pUdjiRQUQNm7ua6LKmzjSyXdCbgq6b0reCOBihYsFmtSEpfL7+8mu8cMby4XfsO5i9TXHwCYKYF9fw7u0v+Nu//Jv/LBD532L7B4HqzU3BZrtnPI9RrsRwoG4qHAWTZMaLq1esVx+HukERc3EtMFpSNzvGKkSbjrv7exbzS+4eviNZpFSFw9ksBhvz4fZHvvpnb9jvUn744Xe8fvE5fujx0/seE0TEvsNkMsH1hozRuqgBRZ5VxOEcKaZEiWa/39M3PjdZSdNkHHbw1VdfUtsVgZ9Q1RWTyQXa7BiN4kGQPyr4/rsNk+mEpm15XL5HKR9hzvgnf/YNP/70R377d3/Dr3/9BXnZstr/gTSd8L48Mk59Lhef8/0ff8d4PuPzd+c8LH/g+kVEeQhom5LF5JzJBMpFSdsdOZvP2a62LM4uScIrlqsd6+0NcTQEkjdtR9dVuL5gukj56Yc107nE886woqbbHhHCcvUixRHn3C1/zzb7ljBuieLpUP/oJFh7oO7u+OP3O5LJOQ4Z0qlI0gm608RJiuxc1h8fcBLNxfWIzcMDVXHgs1ffDFlxnUNR3nD92qfY9uR5hZWGyWRBOJIoCYvJBWF0xt/97u84O78gy3OkuCKOR5RNhjE9u8MHiuNQT3q73+C60FcNVdZj6NHGxTWw22UUeY0fObQahNtiCOjbGs8JqEqX3EqiSPBw+8g4S3nz5pzpROD4hroE1/cGg1W1RPQpSo2QKsSiuXt4QBjB3hW0GhodkDeG6WRCmMQs79YkozP8QFDkHaPUIYhjlrslbVsTR8ObslQBTVMiGNqmjFEUx562U/T1EOniOxGRt0AEGdY1nE1TNrsVVVkQRiFRHNE3ms1mSxg0JHGIFRpjfs6sGyVzykLT6Y5kkqKNod1WBDIgSh38cKjqHHSaA7umhELrIQppHEeEUYSUUEmN1pKqqsFoOt3T6Z6qqkhiweI8BQFFUeH5Hl3TEsce7sspUijCyGW7LqjLw2BCkgIhe7KsoMhbksvoZA57AmJmAKnGnlhYj6IssXEBScM2/T15ssZ1UtLSRQpN33X0TYnvh/SmBSGpKel0T28ExXHJ7Eyy2TTc3T5wdpbS9z11UzOZzkiSlMWlz3h2wdlszHS8oC57jtkdj+tH6s2KLncxtU+xy/AOb4nrX9DUPU3TUVcdThcSmARrTu58hrYpKRXPdCQn9vrvyQMGIDc0d9nnCChOBi+UQOIgnZ+ZZsHAQOvW0jbFCR/LZyOUUoOm1HW9kybWw3Ec/MBFKYcBXtufs1OtpWt7GvOkieVZjyqkwFFP9ylRajClCWkQ9ikz9AmdD5pZ5Xs4PJHjPx/TIG0+Zblai+46TN8P+/8UQXbKjB0KBBTOCYAKI5+BppTqZGY6Adan2lQBbdfQti1BFOL6/gAeT1ms9hT91fcdWvd0raZrTma3k+FNnthvqYZMVKUkrjcY1wTqBLqfws4GKYM5rWhdlSyXj9zf3lKX1VAGEfggDJ6T4gpD12TgKY6mQDkNu+3P2vL9rmc2TWjrcqjSdV0W49dMZxf8ePd7jK5489k75L3AypxIQFNbepWzz7ZMZwH7TYGwLcL6TKcu2fIjvr/ATUru7n7CXXzNZ3/2K5Z337H8dOTNm0uEo9juerSoscLiRYJPNx/Iyh3jeM58fsFuW4AVZMeK8dgldCIOhy15lhGPQ4QJOBtfoVtL3RRstu/xY4WVFtdM+adfXFHcr/m0L5AahPEJgzPa+g7T3rKYXlLYnqI9EjsTqrplPAnRZolQljhNWK9uwYQIVWJ6BWrPdtMwrluSYMrxcI/r9OiqxTcu6WLBrrhHOhGtNdTtgR8//MC7t18hlj1eaPGDJW1R87Bf8fr1G87Pf8G33/+WUfSWojhwOX7JvngkTl5Ra49v/sm/5OMfPZbLAw/7DdPqjHE6IgxjVqs1Z7Mx0tmDdXBVymL8GWVzR9k94jq/4X/+H/8V2/0P/O//17/FdSVt1WBNh+PU6EZhbEFZ5Oy3R84vUvJsiWDKu9cuTZtjWo98X3Dc1ZylL9joR0I/JpQxwainEz3ZYcNkccVxD1b9P9S9R48kW5qm9xyzY1q49pApb15VVV0CjW5gONMEN+SKxJDc8B/wdxR/BZdcE+CCwGAwoByQ6B72DLrZ3XWrbl2dmZGhPMKlaXWOcWGeeZsLFkhQzNC26RFu4e6W/tr3ve/zGkwmC9YPCYbRYJmSKHbpthGWkbG570iv1lxMYmgt0s0G3UqMQDLyYtKuRToeYTzCcToe725RfcFf/c1fIe2YZrvh6at/SBCP+PJ3f8XnH5/QlFdsHxOmpz8ygv91H39QqKq+JhpHlFXL7nCL6gQfv/yU+9sDF5dTLMvn7uYG5axoCjH0+3Yl0+kYx7Jw3JKXHz9ndVuwXC4xhEb3Ct1L9od7pouIb374lu3uGikj3t59j0AQuhMmY5vNLidLH4jCGb4XoTuPTfJI0yhW948sF89omoQsKQlDlzrvGI/mBJ5D1SRUBSxfnpOlb8iKjE5XGNjUdUJS3OEFEkTDevuapq5Znlj83b/8nqK6oS4hS3b49gzDEDRZTG32PH/6nIunAW0l+OjFC84vzimrjiguMHAZxxopLrHlgsfHFfOppmyGaVynKgSSvNjghjtcIciLFUE44/ZmzWhsY1oL6jLg9NwicH2KdIvWFtL0MY2Q6fgJWuTEDTw8PPLqk1MapZHSQjodd3fXpHnN2fmS9JDTIXnyZMndfcHT0wu86ZzDTc6X377DMwXVoUG6Dr/85RP2Bwi8BY5t8vb+Ad91ULZPVab4Qc8+S5D2BcHIYfuwZ5/d4bsOpmy4eDbj8W1H20GHZrPeEc4tRlNJlR8wyoaRa9EqjeM6KBStdukKi6qyMW1BLzx6DNpui2GCZ02HlaGj2ScVVVMzmkge1wZ5/j1nT2KqxuCQbXHVCMcrsdyCy/nnlGmHMvaURUWrcpJ9xenlR1j2BLqGdHvDZHJKPLFpyhbfnbLZX9N2JZYRk6YFvWqwLQPbDlGGRvUVWjfIPgDho3pFWVQ4joNjOXi2S+yPmcZTusDAFC55XhMGAWEY0rYdURzSNB277Ya+L+i6jlYl2Gb64bp73D5gGg5N3pPWNWWTYWHgSpt9Ibg4ds736sOVChhoLY4iUZNnBZYl0b2LanvoW3qtqNsK3SvqumI2cei1wHE8ZORiiKM3EokhBjyUa5ks5hHrVUbdDGtawzCoq5bNOmMyC4ZJse7pBzfCEa80oI3oBRl7dvO/wXle0eaK7f2a5UJS5CFZtiFwY/q+pFHFkMx2oDdNhLbodUGZJ6Qyw/fHA6fTdnDdKY5XU1YbinpDGAZIGdHVEYddT1nU9IaDtF1OTzy8px5hEFMWMQYOgV1Q1jmHbM3N9R7/7gXLYkxZliRJAbmDqLwhxHUkBfQMJQuGGASWPr4B4oh04hjA0qgP4u49K7X/e3W1g8vg/bp8EMLvGZ4D2qsZkv91TvphNX60Exgm0rSwbQfbcQf8lTmElkxz+O98aBc7ikmtaVtNXQ2/F6GPga7jdNV8z3A1PqDOjA9n/d4LcbQHiCN2y7KxDI6hr/fhLH2crA/lAV3T0vbNcb0ujv5mgVYtUlo0TfW/C2bBMNVtmorddkOkJ7RNy4eihaNn970Id23ryHA9BtowhrYrPXiwtdK0TUfWNISBT2RJdN9/mIIPGIkjQ7dt2W+33N5cs1k/DF+MUiIQWKZG6wrXNwk9ycN2zWL6GUW2Ik1Syj778ctUDkE0UzigCkzp4AU+2WGDbnKcMGK7u6XvLYJwQb7d4oUz8vYNjuPiOj7z+Yh3b644WYQsz8a8zr7C8ufMg1PGn45JNwd++PZ7WllSmY+8vkpx3BFPXrzg9dUttmcRhCGb3T3z+SXjMKCuOsIgGLzEvY8tY7brnGg0lChUZcHj3TuWJ2PW9ztG4wDdN9hyThD7mIXPOFR88buvSQt4+tkpvn9Olj6AFkTumPHohGp3GLi2qckodHHcju224PT0GauHO4SMCaKndNYVo1mElhptJKRZNayeT88xhKLaO7x6ds4PV1+QpxtsH/Z5wvnZR2jR8eb6b8irLTPxgpcXP+O3X3yVNQ/dAAAgAElEQVTB2ckZvhvQdAmeGwD9oBum4IxOyPaPvPnqr/n93015+uyMjz4+4Xr9DlO2dI2HMCpatUfKCcJMOSR7wiBEOj2ydHh5+YK+E0gHblbvMJmwiOaI7g5TeGw274iDJZ06cHN3h2UKpLCpW8UocthtrlAcmM98et0z8nyCCNp2zosnl3TNDfuix/CmmJbFmzffEsopk9lzelEziiPKYsdsvESLW9Ikw7Ekvm9i2zP29ylt4xJYTymbA40pcOycyF3Sd4Ld9i3L6HOeLH9GZ6+4eZtwfiZ4Oor444//mEq4XMnf8vaHv2W93WG5Nv74x9zEv+7jDwrVtDzwk5/+jPvHdxRZx9n8Farp6VXL/f0bjH6Oak20hpOTJeuHmniqkcaYdN/g+Zo4WPLX13/BaNZhiRnzJ1NMYnb7il2S4vmSrLRxvZK23TMKIvJKM9JzoD76+jrqKsO2I2bTMYYcI5A0XUZdZrjulMCPMEVI0ybYfk1Z5oThM9brlCAc8Xi/YTKfYJoeq/u3zE49wtDBEA5NsyIKpnRdx/rwe6wbwe13EX/0q0tOliFf//6WtsqwpxHe1KDIHbSx4eJ8zmZ3B9phEl1ySB+YTEck+566e2SxHHGotowCn8fHe4JIcEiuMXrNfD7iYbdHkXB3o/D9iLopEX0Cfcl0Okd1A9D64uTnFPEe2zbZbndYTsPp6TnJPkdYCdPpnDI3aFWLtCUz+yW6F3iiRRoZwVhhr3qSdcnN7W+YhxN+/skzRtGCXmoWk494XH+NYTRoLWjamixv8LMJddmy2+1Iy4YkE/hBxW9+9w1xMMbyOybTJabvcnP/jq4ssVzJ8iymOLS0ugIFo5GN64ZIu8CdOJRlC8qhbSzSfI2wwPdHpHk5rIs7geuaJHWB7jNs26a3DLBCWuWz2e+ZmjZ3Nzlt19P2kuSQMo5nmIZDHwcINhgcmPkOy+AU/49Oud/sqKqCUdhhm6fkZYESOXUj6LqcthM4XoTjjiiqDZa00MrF8SxqSu5vN8yjGWbvYFoGAskocpCyRYqeUTxiHM0pipxW1Yxjn8bSdHWLJW2m0zl3d/dkaYplSUwUXd2gqai65sN112NQVDXCMJDSRFUGvTZouxbpDIl8YQqEGqZRugcDY1gXi56mKWmaFtcNaVuTnuEGSWtNpwbskTR6TEtBb1GWDZPxaEBWKY1hyMFz2neorieOPTzfpm5ywEQgEaJlv8to6inSMt4H7nnveHwfWKqqmsPLbyknjwTmGbNpRFXVKN0OAT/LQqieMJoBHatVimuEhH5Ea9XUTcbF+RMmozmO41FWBXmV4LkSx3HIqw7daVRnAz1FUZOpBtvq0W2FaHukbSPMliIt2a40pizo5zts12TqmUwWY/h5jSm/IuhKnKQjenxGuJlx2KcUa4VRRlRlT1MPEP627f+en9SgPzaH9R9S/uZgv6QfhDz6w2tjCHl8jTp61PFxR/HEh5A9hjSG8NH7yW3fA5qurWjqkj5977s9ik5DIi17qKG1TCzHRlo20rEwDfu4aFd0qj2KOUXTHcH+w5kOXtwj93VY8x+5sEdKwTBJfU8YOJ5tD8Ndk8AUR0yWPGKyDHUkKwzCt+t6HNelqiqkFH+vpEAgxEBsqJsar+2OIcHBt/uemNB3w7S6bTRCNB/O1bIklm1jmBLLGWgHpmkO09heAB0D5sLgPZOXvqfMc25vbnlc3dO17dGne6xvNYYaca0ruv6G6/uBNrG5u2UcRDQypmnuP1y3jtXQdhLbDdDNhuvVDivx0Z3GiYbPxs31NVnZMWtD8n1H0LWYjsTQESP/JYQFeVZQNHuKIqKTLqbpUFU1ZbmlKwLMUUO6u0cpBhsFDY8PBxazJxwOKdI0cH0H1XloVePaAX4oWT3c89GLn7N6uKNpV9TlGOEUbLcZy+Ul68ctni8JAod311vCoGf7sKNpt5hdyOTZHL/tke4Yy9HM3IjNN/csxy/I0h3NIefFk2ecnZ3z/bu/xTAr4uApL85mfP3brxmNxxzKa/qyxhIWadKgGo0wWyzboe81ebHj5u0Vq9U9lleTFwa2b+OFBrtDxnJ+SlV9jWPEyF5QFTAfL3Fsk2SbcL/7hih4hu4rLOnSFWCHFk9PpiyWNW9XNxwef2AmFco2SR1NsqvwvCknyzlh6KB0zGG3QWu4fH5Oo3rO5p+z3qz4i3/5T3n99mti74zduiaKzimKitvrlM8+ecV8+RGdUrS1wWwy43Gzp+ru+eKLKz7/9E/wPYPVao3rWajWxDOh6w6sH9Y49hJtbjFqzWgU47YtxeGAHymaqiR0F6TplmjicHEegxI4ds/rr35PFJzw8UdL4nDGm7vvEKaB2iuko/FcC9sISJMVi9mYtPKInYJmf811O6b/zf/CoV0xndv0hse317/D3VsUxb85YSrz17/+9f/hP3559U9//fb1hnDUI1lye7ViMjUweo3nWQjRYDstjhNiSYe6EIThCHqbol5xefGc7W6P6sxhNVX2uK7LevvA4+YW6dtUVcJsek7gxyhV0QuBtjQNiiLLCQKXXjlgwMX5C5IsQR25ftE4wndPKKuCuknxAw/HHpFlBY4zZzIZcf/wLaZd07QV08kpedoTjjRJ+kivTXbbFN/38AOT3TbBDxXPXiz42c8/xrEX5NUjeaopqh1nJ2eoriKvHjGshryoyYstApuqTkjLHbYTA86RiLCmM3M2u5zdbk3oOfzRR/+AVxe/ILSm9E2Aql3ubldgNghcMA0sX7PebUA1KJUhjZDxOOLq5mssL0P0M6QRkKYZh4MCIr75+i1Z2gzd5Kojyw4I0dMhsT0b5RgEnsvkdMSrcMyn0ZT7MqNUe9aPeyLvjJOLj9gfElSfUDQFp9Mn2KZPljckaYMwJU1XYTsuZdWjRcP56RO2+5zeaHCZYkiFNgWX52eUeoctIqIwYLZcYLs+nU6Qjsn9XYfjRqT5duBBWi5FlaO7Dt0GSLvncb0mGo3x/JDZbITvBuSJpheCVnUc9hlIA4SLosGxI1BTHu4P2LaFicU+OdBqHynnJOkDrhMSRDZVk1O3NXVV8vB4IMkfweigt3F9k32yQZoWWvWsHndoQyAtje969KqlVxJpuPRKs1xGuJbNcj7HMAy22wf6vidJEsaTEaZhkuU5qusRwhxSqKplNppg9CaTOMb3Hf7s/j8F4H86+S9AGBRth9mDagqSvKLRGrPveNZ9Bnk4TFCPwR0hBF2rCAKDKHYxpQGYVJWk0+ZRoCh6epq6IQwl8WjgVTbtQBSwLJOu0zStGhigDN7T8XREmlakScX7JichBG3TMhp75HlFljbD7hY9NCVpmEwidHigmL7FXbRsNylVYeD7EU3bsd7c4ziSeBKBMOm1jxDg2gajIMQwh6rUSTzB0BZVUdHTUzc1ju1gWYK2a1jML9GdoMgzVNdjW9ax7UdzOl/iWWOa0mA5f8bZ6UuiaESrc/b7A0JH1IVBmu1IskdUZ+B5Dl20QT27Yzf9Cm9s8PT8DP+kYvHS4uLJlFHg4Acmo1GA71sYhsayxIeptBADrms4DPp+kIkDB7YHoY/680eI/zH5NeC13s8a+yN54GgngCOzVR7T++b7koEe+m6gQ9QFZZ6SpQnpfk922JMle/Isoa4L9LH1yTQlli1xXBvXsXFsiXmkH/R9T9d2NE1HXTeDRaJqaFs9lCJ0mq4doPxD6EoOvmgDtBhm/JqjNUEdw1NHe0DbNORFPjz+Q3Ds/VR6QGxZjktd1XSNHia0XT9gy44ItN7gQ9jLlBbClPR9T9t11FV1xMPpY+q/pe0UTdvSNg1NVVNkKau7G15//z2PqxVadcNn3vjRA2yYJmfnJ0RLm98e/pLV5oHRNKAvSwztMbu8ZGSPePq3/xiA73/yTyiaBx4et5iODbaFbUdMpxF1ZVA1DYvpOeORzW5zT5Y+sD7cYGqH0Hco0pY8LRGGySF/h2Mtif0LfMeEriWenTJejil1zSQ4JbJCRuMpri85pBlSDlP9yycnZFmBYSjiCOrSwDIlbdvQVJKmarHskrZ0iGchVaVx/I43b1/z9Mk5m8eMJEnRqiY0Q2aLiFZkvH59x8l8hisN2irFEJokq5jPLrCcClWkTMIQ6Tk0QuFZDnEQ8nwxQpQJjRasDwem8ZTdas84HmO7HeHEJ69KmianbnKWl3PS4p66ynCDkJYOTYVhmuRphmM7dKVB5IfkZcJsNiEKbe5vDzi+wXL2MWm2wbJssmzH7WbN6vEd6+0d94/X9LqlszS3lcsoOMWUQyV7kXdIaVIVYJgDCejpkwuS9I79tsMPTNqmZBSOCWKHd7cPvHr5CnqLtgGsmipzePJ0RlllqMZlFLm4wmH/kPEP/+TfITm8RdeSOi85mY9IqgOH3Q7L6Nmu92x3OYFrYlotulIc0gOSlkk0Is8TNtscepN0ZzIeRTgypq8S4rNTNskDWVHSmjlGVTGPpvSezcPdO+JoSbywydM1Zh8zH4+YBRFZZWBIi7Jco1XLaDrHdBzQEt+I+NM/+Q/+s/97EvP/meMPCtV/8df/7Ne6PyCNJaLX9Loi8mb0fT14nE2FZy85PXlGkVp0zdAn3XWaOJhhmj7b9Hv6XtDVAWVeUjc5ht2AHmNjUBYJz148w5QOt49XpGUGRsv17S2BHWFaNoiQ5XJB1SgOaY7qFZvdI34Iyb7n9u6GeBLx3Tf3eF5IXihMS5PmBVmRYkpNR0pTCCxboMQD/91/8+csz0KEkFRVRll1uG6MQGOakqou8MIx+0NHb2ocx8ZzHPb7DjtI8cKYsoW6yTGlpmoqbM9FSKjrjrvVNXleDIJB+UjDoUgbQusFq7uUh+0Vlmvw5e+/5eFxQ1HtiaMQpUt6pUn3BwxDc7J4heo0GAVNm7PfJ4xHC1pVIUyFxmCf7kjzA10j0Vpwf79hNIlQnaCvHDYPGYvoBHv0lMfcxQ4W/PD6lkOTYnsBbgCb3YFDVmI7AgOBIW26tqGsWjolKKohKb562CNtj7ZTFGWF6nqub98ym45x5QQp3cGP9LDBGRVcXiw4v1hSdSVZUdP1B1zHI81KqqrHxKOshgAFysVUBvPxEtOyaKoaaVi0bYNl9JRJwjh2mEw90izBcFq0YVBXAqUaelEymUx4d3NNmiV4Vsy+bHlI1wijRsqeXXpAmRm2NOi7gMfVhrYt6LSJZdjYtkPTKXQ3AMe17pCORmtBliaErkXohVjSRAoQfcvz56fUZUWv26GPus1wHHkc3rSUTUHTltiONXAfdU0UeUxGMb1WvHr1Ma7n8cvv/hMA/vnJf44hNE1dIoXAoKPtCgyjZT6Z8VL+gnZr0XXvp1rDoKhXAs+zcF0DUwjaTlDVNro3ed8WRT8wWEcjA9VXSOliTcGZSlpZ0lYNva7BUBhiWNFK2wIk68eUtu0+pMA7pXB9h67V5HnDe3wpQKcUQeDR//Jr9MUBVHwE+kPkXwAOwhhCMnXT8fDwgDAFs3lMU5a0VYfWirzMSQ4putNs99fk5Q7PCzAM6yiqc4q8pKmNQWy5wzpbigDLGFFXLW2tiIM5QRDTtC0P6w1K18zmMcIQtLVEmj6WbWCKmCJTZNl+SH23Fvbc4yH4inv/b+mfrxFOj6Vc3FlPdGIwuZCcvPCYP/WJzhTxucI/qYhGELkhnuvgOOYxiSUGzysMaqsfPJNC9Bj0x4CX+BB2guOPwNEqcJxgHmegH/yxR/+sEPIDOkpKE9NiqMDtO7quoakKiiIlT1LSw45sv6VIDpR5TltXqLbFBGzLwHMsXNvCcawji3UwBWilaNuGuq4oq4aqrCnLkrKsqKqWphkm8fTm0T4wiMr3sl1pTZamw9/+fop8HMn3fY8lbSbTCZZtDSE1aTD0IfRwpBaotqOuhxvNrhtYzNKS2I6F6w83/Ibxvh1rKHfo6op0v+Xh7o67mytW93c0dX1s/RJHy8p7oJnAdiw++ugSw2tYh7d0VovtwEn8EX44o9Q9dZXx6ov/GIA3P/+vmc8Ddo8JwgqZzU7QFVRJjRaaff5I7E8Hj26v8f0I1YHn9tR1xf3NGkO20IWYfcQoCFFpj7Ba6qqh6SX3dz9gGTOkGRGPHBzLoqj29NpmNHEp63uauqUoMpq6xLUkj3cZvjPndP5Tzk5HNO0jTaHpmqHatm16xqOY0PfRncA0LJbLJdK2yVRO2XVs9nuUEkxmM1qlWR9W/P67t5ydnWPaAs8Joa25v72mVICURPaI7f4Nt292OE7EzSqjMzRBaDOfX3JxeUqarvn+h2vCOKJT2+G9NKek5RrRhoynY7p+2OSczE/p2pbIW1LXCVqZjCcTyqKlaQpub65ZLGfD9d1J/FBStglpdsB2PaLpgm26x/Ze0rCkt01oFWY/wgsN3rx+x+XlczwvoO1qBCaj8YTDOqHY7ymLPePxjEa1+P4MR5o0ukNaIVm5IR6N+eHNt5jS5JA+0CmbnpLAnhD6NtvtBsuRPKzWPH16ybff/Bbp22S7lMvLJ6iy5un5x3z+yQX7ZAd9QF0fQPV49ph9+hbbHtN2CtceEcaC3XpDWey4Wpe8evUpnajozBQPm0YN6DaZ11RpheV6lIcCQ8NiMUM1Bk4g+fzzj7i/uWUy8tntCpzAxDElJ9Mpn//k3/03Qqj+wdV/XT9S13sOW8F45DCd2Tw8vCaKJownUx4fV2D6SMOgrFIms5D15o7JZIwpIu5udnjRkjyvUN2G8/PnrFb32K6N67qUxQOBv+DNDym13lJX4HkBFj2LiYfneqRJS9clpMWO84vndD0UZQqyZXWf0usC1SuqumN59pJG5WC0FEWKZTs0tcY0DYqqxI9z0vodvZb84he/oCgq4uCEfXmHZQny3GUyPuX8icshfUdXZewPd2AKpqMJvYR9fcuz6SVK+lxf/zmW0eC4n2LiUZeSJNtBFyKQRJ5DcShQfUEYBMTehP/hz/8JltT89OfPeXxbcHohGc9e8u72exazp5RNjutqqqLBceQRAdTS1ArHmpAld1TTG3Q7Zb/NSModhmdgORJDuBRVAfg8ufgZuuqp6oxdlvPNNw9k6pH7KuVLR/FiekIQSuq0xOhbdNdTphnLhU+yyRC2Qd2UHPY5eS6wHJe2EDiWzf3dDaNJQNsovlh9z2jisbrZcXnuU+YpZZqx3hzos44+vad0Cxw3xlI2up1TlA22K3Fti6ZqSfMGJRrqtCZwenxvxNubFX4AtttR5g11ZaLbHmkO06vxeILhNNSFzSEZ0Em2N8Eyel69PGf1cMNu/8A+3WF5ksuTJVVREcUSrXsiO2LVHog8wWwR8/bdHhN38ETWLZ7lkOUJvdZos6bre2xpoWuTUu3Q2uRi8ZSusenqCtsyEYZCWgJTCpI8BSTa6MiygqZp6RRYhkfXNYziOaOZx2Q+AnOYTL0/HCkYj0ZMY4/1dn/slbc47DPqOkdTI02P9n0DETDA/zu6WtFrgedaVNUxeNP/iD3SWiEMhTDB8yNSkbCJ/4Z+Ugw2E+sz4uaMVikqXdHYKYfqAc85wXXtYwnBkduqoUg7pD2wNFU/TMMGzqVB1/bowqArwDRzonBGljbsDivy+oGONYvJc1Auos9wTIknR7izCYdDwvZwT1bscZwA6bjYnUXTaSzLpWtrmkZStRW9SOmqlsZ18TwX1SomE4XrtuwOG7QwqCkp2wN1VVFWe+zQJq8bqjKnrg3ARakWaSgmkxN6w6ZpDlhWjCEMejpG1pRemfyu+OeYy5DZ5Iws32MIxTieUFdDs5FpN1RqxbL8jMvkH6FbTZpl1IWkLi16U9B0DWXRkaY1XQqyDtBKDYir/r1XdXhrBx+ooFf9Uageb1B6Qd8fq2ePU1px5KDSD77YH4sPwDQEmCY/ijFAa5SqaPICnQ5r8vcC2RAmpmUjLQvbcbAdZ4DuWxaeO/Bd9fGxWvVHUoCiaTqqsj5aQYfnO0IMjlSBatCnR6vI+/MVRxJA13bUdYVhmLSt/rH+1WCwvBwn+tKQQ3mFYQx8VDWwUKUcJsWWbWIY0FYdVZ6T54/sDzuKrEGpdng93vtx398UHH26HF/SvuuQuiMOe5aXP2F3c0faVPhzAwzYZocP163uMvLtknn8DNsNOD99SSbf8e67HcoMcZyAom6o9ym9oZESXlz+hE7vWN09Mh0vsJ2a/ebAJDrHxkRbO6JwjuM67JNHyqTk8sJn/XCL9KecTU+5uvmBlh131x6T8Sm6M5iObNJsz3R8gVbXOK6Jbcx5efE5qgiZuAkY9/zuq++QIqQ5+MjeYDG/RHoF19cPTBdz7H7N73/zBt02OLaHbfqsNtcE7ohRUPPwcMNkMub87Kf0zh43bvF8D9Ur0qRAWjEq7PnyJmM8EgQuVFWDVg3bfcJkOufmdk2R1FiepK5a0sMtoRXRdia9FmRJycX5pwTOCO90QlE+kB5qTj95hu2AahuSfct4GvHNt18ym10Qhme8e/eG6eKcV08vyLd7zM4nsC747Mlzrn+44fTpOU09bPB8T2FaLaqDeGLw9TcrXr36BK0LpLJwANHbJLuCTO1pW4MoiHl3t+HkJMJ2XXYbRTyWbDZ7ovgMadg8pm9Js5Kz2Sl3dw98tvxj5hcGb++ucKPhZiR9vOHb7xJenV3i2DnrW8HMPeMmucf3T2nrDWV9wJFnND24gUXkl6zuBIaqGJ2OqQ+SstqQ5lva3qJrEtKi4t96+Qse7ncUbYfVNQTCwbdC0mSNYQRIO+TdQ8pHP3vF6uYdoT+ibDN+8vFPydPV/xkN+f/J8QeFat85VGnAKHaYT59iCcG+/4aLyznrhxoTCAKLZC9IDgnRyCaOJ+wPGwJP0fUdRVFjWzHSCni827HavCEvJtyvv8CdCE6nv2Cz+w7dNeRphoxPWJw/AeuWKql58fwTfvv7bynanFG5ZZ9sOWRXfP7pJxjdAqU0XvDIYd/w/Llm9+gSRA0oH9ePiGKbPK/YrSscK0e1HaF/wnxRsN1BWt5S1AVubw1DCkNze3Mgjhc0Vcvp4oLdIcXzfO4fHnk83PL4xS1VL5hNLdBz6laQZwlF1lGXAtdesZxPUSLC0EPb0ma1ZTYe8eqzE7qmJowlj6sC8IjGAf/o4z+mrdXgMawqTmcLelmSFQ+URY9lC+pScHl5jmFKDrsM6Wms3iWvCqomx0AQRy511fC7L7+gryXC2bFvS9zexJERdvHI5z/9lMg2eP12hR9M0apCypKiMHD9FNPVlKXANANM0wbjQJJsh6q53GG/ybAcl64WtI1gv2ko84o4ioCEJ0/mLC9C/tVff0epHGauydwf8Xp1g29PqIw9vqOOIPsMz3PRZo/hNwSOS5lnmKJCCIljTzGMArTA9wPCKKaoejq1JzJHtLrCtW0uTl5xdjblsH+kyApGwRxNjcg6fE/SmQluHLDeHugKG+U01NWOKLCoVcdnP5mwX9UkWYPpSLpWIU2B7fkoDIqmxRQdlmkSuD62Db4nMTwXoU0cy8ZxJe/ur9judmjdYds2Zd0hhIlpSppWoY2WRjW8u3vHJglw7AlRkFIW1YfrTumONNvg+S6jeMx+/0iR55QlqD6jkSWmOUOY3bBS7kEIE2EImkZhGi6+G7Pdtj8m1o8tVlq1eC5ICZlY83fif8bWO6LSId0pxEVHNrob+IaOwfZwz3q14RfpP8Z24h/DLQzooTQtsaz36e3huQzDQHUKw9RMpzN2cmjZyfIHWm1QlQotKsqqZS8OPD0/w5EWru3i2AE9Crv28dsJaZ7QtgZCRPjeU4r1hv22x5AlVVWCANv2MQzNfr8mOUgsS1DWd8ymS3oD1g8rhOg4PT3HFB5RdI7jmWRFSp51qFbhHBP2bXtAaQvbMqmURW+YKJEiRIlSDk3TMooXaK0pywLf91AqZ7t/wLFDpDHisK8Qlks6yvku/hek6SNlmDCJTnCtMaYvkDIlQiCLHvt+wXS9GNi7rSZNU7KsoUstdOLQtC1gDiUN/Y/s08G9emwDO9bCDhPZY5uUwXF6238QvXywEBxraoHeGKgA7xfxg0juEb1Gq4JaCaoKdD94NA0xIKoGTqw1NHUdyQTSsrBt61g7O1hTdD+I2LZTA1dTaQQm+oil+hGSxVE4tyT7HdJ2ULo/Br+MwYMqjMFTe/ycGeZwPgO+qh+Cgk2JzjRNXVPlCV3b8elnT3n24oy2nZDscuqqZL8rePN2/2MAUAx+3L7Xw3TaAG3mNM6aaRgRBxGTmcmmygmWIYa2GAU/Vqj+9PNPeHuV0LsmVbPl3b3FyPY5e/oRhyzFNWskNdPxGIHB3e0WeoPl4pIsqUGNKPMHurpm+sSibnecP/2YpsvxvIDb1VecnLzAtXxm04Cbqy9J7g88eXLB29vf0emeptCcnS2439yBcknSAt1rdsmaLPsfWa+/4up1wn/0H/577FLNxcIgnFhUlYXuU/brkuWTEY6XHTFjHbapcITN/eqB+8kj8cwhech4cX5J1Vfc399iiBuCyKftSop6R9tUWDokigJu8tekquXEnUEbEIxDhGHzcP+AYQieXCxZrXLOT37Cl1/+hmkQE8eSTFiopmUUhESBj+vYmMInS3dE4xFFmZEVDYvZiGzvMorPSfIEKSXb3e3QsjiKacqGppO4VsTPX5yS5tdU0iIevYS64vXVa0ZtzDiekxxSpN0zm8wH33nd0HRb0iLnyfkr1tsdruXgOorVbkfgO4je4PLynG++eovvBTTkFHkxCNjMJssTSmtB7IdcfX/FeCoodhXPn39ErzJ8N6QSDUVrMQln5FtF25Vs1u+ohcQSDp433BjptuVxVWCf2ximh2nmtNpiNg7odM53377ms5/+lG/f/o6WgLebV3h+QBT1KMtgNJkgRYDrReSV4NR3uT9kPKYJgTknDgOuNzveXP+GKv3/SZhqt37k/OQU0/DoyhrDNonjgT/Ytg0mgqV2BHcAACAASURBVCg2eXN1i+X3lFXPeDRFWAXXVyuev/oTfvj2bzlbWLy5WrHbfs/oiYWuawQG2b7lh913BBFI06YsBb/8+TP2+wTLBtHaWIaLLRVFUVOme9JsxWLhUO16mv6GMA55fvGcqzdXVGlOPALVS5JDha07qrqh1z2+Oyb2fLTjkiQ58cRBGOAvO7JNxzi8xFIeu90O2zMR/YiRP6MSNfGk4fEuxfRbzqZn1FVF0pQ0qxHrvcl4nqHqBonB6WSB7wvqdkWuFJ4Xg1IEvqRVGb2pMG2TtiuZnUYUec9md0A6c/oeLCtmlzxyfjLB8WY8f/4pqu25vXvDWt0SjgKubnaUXYvl9nhjH10oNnsQsuFwEFiG4N3bK371qz/CsFx233yPNXIpMhPHtthvC7qRz2J+jmWcUNYJq4fvCDyHvl4QjH3S7PdIPUN0Gs+V7LYGluxI0xLbdlivKnzbxjAVUpi0Bmy29/ieRFUW2zRhvHQwMpPF/IwofElVv6Uq17hRgG3UJIeMsmzwI0mS9szmSy7OT9jc73myjNBmR1G1BEGMLQIoDsSBjxMqmrWBUgVhGGK6PcFkxO1+R+xWeFi0VU3sNZiTgHjhYhiKh/U9utO8+nTwdX3/VY7j+Wx3LYa2CWODzhymQvPRBfFswXazIS1TsmaPqCWmY9MUYAubbZrSdwcuF0vaKsPzp2hlUFegOkiTPYYhCKIIhIPSkkZ0NJgUteY+e6CrNszHU+TfE4D7qsZRHb2n2WUVaZHTmy2GJ4eksu6Pdsb3a2DQKFSv8cOI5XJGkXUoLY5b5vdr4kEkOA7U7o7fmf8tb9LvsL6PiSOPwBdc3SjOewffM+nqkt0qoats9vqezjhO+45iyDAFdVXRNMdx2fAMAwao19RWTTibstdvKAuJJS12u2vKskHaAUKYNHVK05bkpeL67i1JXjIZjcjSjKZLiaMQISz2yT27/YayLLAsA8vStE1LGI4xjZbVZgtAENjsDtngv5QuUTCjqVqKPMeztkSxB6ZNpXqCIKCpQxpRDQErDb4XsNm9wzA7+l4gZUkY2Jj49BjUXY4bLBCmQ549Elgulhzj2j3SknRdTSAEXefg2JIw8BH2AquU2LZFUxVk9ykdCV3XEfgLjNNH1hc3xK5P5JmI6o4+7wgPn2P9cEmSNbhyRJvZVFuFqqEq1dG3eUy5a3N4h3t9NHAO8LKhw+u9D7b/sTkM4zjJPPpmAY5C+EMgjqH2VQrzWFkKw8xz+DmlGuqupCyPloZ+kM/CMDANa5hqOtbAijWtodJVGljCpa0KyqrD6N/bRT6AV4GGLNtiCANpgVI9pmHh+fbgZe7ND4UJGHL4u7Q5FFq0NVVZ0TQVXduC1kxnY+Ix+IGD0Yc4tknXxkymmuvbjLpuj9ivo0AXQ9jKNC1UVHL99C/Z7ypq5TCd+gS15urrOyzDIRz9+BW6TSUXz59SVBWxe8mXb76k7Ca8eLnA9luubyS4DqYdYGjNZOrRqZx31yXIGEs2GL3JxatnhHOPQpcc6gJbQa0LPBkzCmPKfI9vL3m2FPyX/9V/z6e/eorjwCgcg0i4e1sSnz6jCQ40Xc1hnzI/XXC2OCfZ3zN9WvHbb/8Vh7xiEkmwDYrdisUkQFoNWXnA9Xu6dofoJZNpwEKcchlFtJaFY5pYskAJE9E6+K7N5vFbLk/+DIueNDtQtTt0FzNbBkzbOY4uMYwL3KkEI6HvTPzIY7t9hynO+ejFFMPWnJyd0XQVrYoZjS0MDVnhYKkxdXFHW4fM5yGHNAEapuEI2UHgu8yWHlU5Z71puHz6EZ7oEcaw/ndcm6re09QtluPx9GJJYLsk+Zoiz3j7WrNcLJiMx+hGErmCx/t7uvEM1xuh7Ud+89V3XC4XGFVEpQVhbNPkJaOpAUKhWsXZ5YJv3mwJZyP2hwfqEl599gmvv/meT17+DNN0cUTFq6evaL2S67drFpNXzMKW/S7nce3QKVg+HVP9UCGtjqYOsdwJnWpIdg9YxhLL8ZC2wjUWZIc1q/WG2WXERfSM5eyEZHbKdrvid1/8Bb/87DOquqHYt0xiRb5LUH3IYuLTNivSWuCYLYHbodoCy/Z4TNY4pf1/XVH+v3T8QY/qX/6v/+zXgb/AMA2adsPd/R26r0jyB9JiSzSysGyTN29vmJ/ZrB8O1DkEMdR5xGfPP+fq+vfUrSRahoTLCT//1Z9ANwajoe8Ehpmwun3AtWJOFudE0QhhFjRND0py8/gdL1++wrYkpvCYn0xRbUhbFwhZ0YnBYOyFIZvNgSBWeOaI0F2QlzkP6weCWLJYzCnKesC72C7SsZBWwC7NmYwnSMNjfZcSxDab3Q4hLEzf5M3915heR4+DaYHuO2w34n71gDYLFArTahhPn2KYLmcXT1itr9gXKUWaY5hDG9RivkRKn66r8IIOELjOOa1KiOIRhnBwXJc8q1jML3j6/CXFQdGUsN8/UjYJtdrz5k2OcCx2+5T9wwZpSCQWojcJPI/ddovrGpwtPiGOlhx2kGQJTa1JkxKtWtquY/OQH+vlSraHK0zZYZsuhtHS1YIw8qnVIDi6NsP3IhwnQimT2cLHt2JcZ8AY+ZakVy1VV+PbS1Y3W4SdM3It6DyWs0uK1OVu+xrL0Shl4owNAmnhmhEGsFjEXJzPmE8jzF6xWESEoxmd6PBil5OTc5qsRPUCZVS4bkd66Olbi/l5yNurK1bJA5OpjWPCn/3pkn/7H4z49//0JS9CSZFA1dhE3ohRGNMZBnWnyUpwPIe6rMjrBMtpCK0YpU0qXbLZJBwOKaDodUfXCtIc9kVNWZT0HSgtSPKCUlU0qiJLE3St6TqQ0mW5eMb/Rt2b9NqW5uldv/Wuvt392ae7fURGRmRGZjXOtF2gQuAytgxCwADBBCF5gjziI+TMn4EhE5CQZUAqCdugGkBVGduVmZVNRWQ0NyLu6c/Z7eqbd73vYrDPvZk1KTFBKu/Z2ZN9ztFa7/rv5/88v0dYA3WTYdsOnj2lLGq6FhzbxjFNmrrhP5f/HQB/OP7HOJ6HbyeUxZrpJMKzI0yzZsQ5y/YDhtxH9m/9fYfhoO96pqOYJ89m5LmkqowDyPwRbC8MYFBMZw5fzP4P7sRrGtlRNR1lXWM6A2WdIXtN3UjUMJAWNbYXUIyu0TsXsR8jMN8RRN8FfIzfPDkMlFLczD8lHX+CpsEyI7J8R68zbNum7VqapgHDYrtNUZ3FdlOgtWYyPsW2TQwh2e1T9vsdTVtx/3BLnhdMJgm2PbDfVZjEdH3Dan2N7Ada2WOaJpPZiFqW3K02dG2HaXW4rk9RNQfFbagoih2qF9R1SVXvDqxRMUL2EsfTWM5BdXQdm7ys2GQV3lFJZX3Nzz//lKrLmB7FmCJh0ILAC+iHgrLdYNkRphlQliX3Dxd0MsNzQxpZMpgFhmnCcFBxXe/A503TPU3TUpY1su/JxZbN6Jc0p1+jnu6xk555FJEcm8zPPZanMcv5mJPTGVFoY9ka1zawHzFJw2P7kjqkmYC3iC0eh9K3ISbxDiP1dqB9C+N/txrnkWiAwBgeh1wxvNsWmKbAts0DQkoMaNSBdVs3VGVJUWTkeXrof68KlO4PqCg4fN5v1MQODMSJy8v3pyyWDkHgMJ+OOX8W4voSxxnwQwlDQ1fW3F0/UOY5RbqjKgq6ukXJR/C746GVwPd8kpFDkbcwCDzPJ81yLi5W7/4Hh3vJeKQEGPiey+zMYe//inE0R5cSU0fE4xnz8Qg3VmAKnv+b/xiAX3zwTzHFCMdPMIaauqjwYwcbDaZFmnWMooDdrqDpLGS3Z7Pu8GIPNfTEic8oiSiqktvVirI0sJyeZBTSVpKnT76P63mcn30bO5hz+fqKP/1Xr3n67TMs1eP4PsJLMA2Pr27eoEVFfd9iqhDdbSnbGn/q0eYlqixp2z2LSch+u2K/WVOUKQibXkp2uyvUUNHjICuFZ1sUneLF+3+DvhGEgUVtpNRNQZH3LBYL6mZHLw1UrxgGwdFiie8NBG5MWz8GCrXF0fERl1e3vHr1EV64oyi21KUimUzxfJ+b6yvGk4HzJzG/+sUOx/ERbsvD5hpb+ByfTPnsV18RhCZaWihZc3l1x8cffwfPgbysWC6PafKKrJDMFiFpucL3ZmzTNap3sUzNLrvh9u6Os8WEutjhT1w6XXK/yinbHSYGYWjzsNnhxxFBbGCZLmEwZjQN8QOTm9UVljCp64b1wxqMCjdMsDybKt1SVwOj8YzID9juMmazY0aJzz7bsclyms5kuhBcX2+5u10j5QYvlCjlYBkOXe2xWEZsNtdo5WGZLkEYUnU79vsdiecRzEfc3VwhCHl2tiAvM/pOYOgcrBjTcWhLxW6X0VQDu3pLYUgcr+NuteYm3TKeHGNZmtHUoak7XNfjdDzi/e/8/b8WHtW/clD9yad/+CPTGvPF608YFIzGMVUtMYSkaNbs9xm3dzfkVYUpQmRT0XUVXW2y2e7Zrd7wnR9+TLnVmHoPI4Ny3bLb3BNOB2RmEYQ2J0cvcD2H6SJCa83Z2RSpCmynJBgtqLp7ZuMxgjG9uaFXHW2XIvuaouxIiwzJmoeHFSYOfW1hC4+82jEYDdHYxzYjVG+hjYG6lgyYTOMjHlYPOCJiv6kp6xQnmLHJrynlnqzYUJctdbfFsHp816dtO9JiT+j5nM/PyXc9jmVR5wZNVfDhqw9Zra4PPpBiz9mTI6bRC/TQku5TeqnoeyhzRZrn5HlKXRt0naTrK4bBIk4i1FBzu7oBobm8vkOYPba5QGuJZQ+EoUHsj9Hd5GDO700cO8I0XQbt4AUeF2++OHjjWoEhejw3JN9JvvPRb7Nd5wg0i9kJeZ5iuT1VIQlDg/1+RxiNkBqKeospTHRvYNkmTT1g0DOKYkaRxXQyIXBN5qOAh3yPYwmWi4B+aJmGc5p64OnZOUbvkNdrjs7nWI7AdSAMA2Qfkhx1fPzDKZgGn7/+gmAkGB9brNaXROEYLxhAWtjK4rvffY+syCmLPVLY+P6ExTJCNZqz5TPMfkDJFtMK+MlffINhGNSNxU5KarPDtH3K2iLXLT2am6sLptOQfrBoW8WgJF03UBQNTdZSdZqmbpj5MboxwPRppCKv94Cm66Fse8quZZtt2aU7ojBgnHiMxjFRNOPli48wsDl/cgwYbLd7VD8wChPG0YRi1zEZ+fyD8h8B8EfH/5jZaI5nhvTdgJIGs9mc58+O+bj8u5y7L6hqRVPz6E189BVqDspoJNjtJbI34RFwbomDJGbbivF0YB3/OSteA4dmt2gCZZvTdRI91OzzHdt8hdQ5abrFNgVn/QfoVYTsFG9h6XCo3jy8fj2tDlpzzRcY8xUI6Fqom4peDgyY5MWKXnWPw1zNw+qgmA4otpuUfZodmKZpCYaF4x2A2UWRo9WAEM4jcilkv5M4rothaOqqIwhGlHVKVq3J0i26HTANj322pZI5igaGnkH5xNEcpTqqqsK2XOIkwbQGtvtblK4IgyldY9PJnngyIhy5hNOGeCIJQwvHDDFkAAqUysAsDi1Lj77gpq4RJoxHU9SgKOodjnfoP227Estt0bqilxWO59LrHiFsHDOkLSW9lLRtTp4rKqUpJ1c8xF9SnN5jRKByi+jIITkxCUcDZ0czTs9nnJ5NGE1NotjC82ws+y1mCn5TM+WRBzsMPFaxvuWmHobQw/w4PNpLDqt8UxgHAdXQv/aZDsbj8Mu761EYB3aqaR4qWc3H+tdHMtQ7JfVtFew7A8BgEIYeL14usWzBeBoQJS6e56N1TzIOiKKA8STi4T4j3dcI03jrdgUhMEyBYRrYloWUEsuyOH86oZMVYRjSdCWdVFx888DwqC4bj1W0b+fnJAn59vcXpPGXlL1mOX+CHhqEayKExfXqDd0A3/rpfwpA+Qd/zvZuSxS53DzcYmqTuuyxTJuu67Esm7ZVfPy9HzCbTfnVJ78kcCJc36KsU+J4TBKfULQrSrVhNDllFM+wnJ7NpuTo+JRdukWpmK8ufsKXb/6Yv/N3/z3+4O/8ATLvubq/wrJHfPTdH9LsLxFC4aOx2xhtVWxUynJ6Tna/IYhmjCJB34XEXs86zaiQOHZN2w5YvsvD/QVwhO8FyCGn1RazRcx8GdPIgjeXV/iBj2kNmEyw3IOSPU6OkK1gPou4v7ujzDXvvfqQvs9IRlPqtkZY4kBCqHs2qy1FJpjNJ6x2rxkvV8xO79htt2zSgPHUJ3RDtGwx5Ih45OHFE9b5HUItcO2Sm6s1YbRE64quyVlv79FGgSFsqrrEsi3yakNd2ExGU7q+YRgqLq9veH/2AsetuFn1RCOHu7t7TDPE0i2yzbm63lN3AnqHrlWcPTsliGbYjmC9WpHXKwxzwoun3yF9WCPEQKclspNI2dLJjqP5CRf3n5CmLednJzgu2P6IFy9O2dyvKTPFd7//koe7G7TV0yqf4/MjHAFNI9FaE4QRtmfieRFJtCTNNwz5QDiLMNuB2WJBrSrKtkNLg2kcUxgN/hCxnI8o2xLfXHI0H9PIHegE3WeM5hYCh+XTM1abnJu7DW4Scr+55Ic/+C//Wgyqf+XqHzvj62/u8OICKW3GRy77rDzUWqoB11cMomYUwmb3JfP4fdbrexYnHrus5WzxCrcasxA3VLs1wrepNnuWp0fs23tOX8TMZ9+jriu6XiJlQz/cYvsujiOo9IBNRBTNiYMFur/l8v4bLG9gsE1Uqcg2BpZv4BsTXMNEdwJ7XGM6sF1tGc9jBm2QlwXrhzW+L9GDoqgNDGWD0sSRizXEqKFANhCFMUXZsts2+GZIkMT0rcEuG5gtTri/37KcTen6gGSmyJoL9vkO3wnYlyVaGNiOx8nRObqJ2G3W2F7JwJ5eOcymzzEMzdXlDVmusa0S16+wnSle5LLNrtldbEHHh75zy+XuUuK6DdFoxHq3RQgH2fkopQijHpoOKQ2q8lAL+PVXV8SRIowi2m2J69qE7ozj7y0o8x1ldYfAJ80CBFOenCV8/cXXBMGIutqzelgTJjF6UJR1g+ocHNUTBwGr1RrZ9kQejI+m7LMdz0djvvPxExJzTJVVDMpmtdvhipiyXXOx/gu8yEY2HaNEcH2R43sHj3OnatJ7SZW5LCZPCBNJVe1JxgH1NifyYpxE8vS9p9R5x3waIdUY1XXMph4311dMxjFHE5++SajVjs8uVzR1yD/LcrpaHvxmQ8/pE0HbNxSbmm1aMYrm1LmFZTosZiG71Qbhu8juoDQaDmA75E2PMs2DL3LosHyHomtwtUPT9WBIhGVgGTFHy2dEfkdVp5ycnNBUewzg+nJFmj+QjAQnp2MMXJSUCMPl6DiAR++6rsY4cwsxaEbhDMOsoZekW8mZ6HHcAcsSGIY6rEJ5C4U/POq7Dnp98CmalglqwLZMukHiBQJhSpQycN0xfa2wLU2vGoRt0bYDRdoxoKh1gxAdHiH+DCaxhX70Sg/Gb/geeatE/aU36NqeutF4UlHpHaYp6PoDaqfrBHlesksvGCdTEALXtdnt14iJYDR+QZ7taLoWZ3Co6oZeuggjoSwVyVigdEdZ3tJUA2E4whQey4VLJzvyFPrBwhwEz54+xTA0m6ImmAQYwsESAXEwwXOm1LlLVT6QJArbMRmMgdEopFMNYTxGtw5SVRiqpVr1+PVLJmZKOdzQpQ2m6BhUT5Gv8QIDpWzqSuL7Pa434IgJtojo2NH1ku11wXQ8Q4iAMh+wzJaBFtMc4zgBqmsRg8d8fkTZZ9TlBVJquqLEc54xm7hYjqDyrvhl8Ue4VkQUuHh6xqvmb6KUolcd8blPZLgHBbnxceQcpaCscpQ+hPz6FtruUAggW4WU/QGJOrz1tg4MhnHYMD0OcEq/tX8cvggZAgZ98NcfQlJ/+dp4e128LQYwHqtceRyO+fWIyVs/bVMP5FlNlEDXDAxDS292CEODHvDckCKXpPvmMfz0thZ2eIf5evvzMPRstzs26wVhKNilOban6PoSHj2vbwfmQ5jq1wErQxhMjhLq/Yp86LCTkqwXTIKEdLVndvprj+q+LZjMHTabL7m6e+A8PGI297Acl2Tk88mnr/no47/H0/PvYxg7rq4vuL2+YLJY4k0NLr+5xHuyoJeavsvZrl+zXU1Zzmfc7C65+OOfczI74bPrT6iKDe9/97tstyv+9F/+GU/PX7Ic9nRDwN3+nicnryhWF6zTFHMkmU3PGNoOx1tydhrQqB2NnTCxE7quo+4FlVSEoUevaspNjx9bHE0d3lymuKGi7zXjyZjLuzfcPdyiB81kumCzuSOKHHSf4ISCut1zfvaSq+svWa9zkjig15p+6EGA6g+Yse3+jihwOT494+rykuurG6S5Q/h7Xv+qZ3VV8OrDczQbDPsYw3G5v77F3UCrKgZp4kxNLMPAiyWDmeG5YxYTi5vVBfPpEm103D3sSUZLyjrHdQOePD3hk59/wvI45vnz97AMyd3NhsmzJ8jKYp6MwdQkrsv2usMUDUk8hS4jid9jsDU//uXPSKY92lQYfYCuHKbP4A4X37ep+prQcrHHkrLc0XULpqMjhC1Z7S/Z32fY4RHjI5vBiHj26pi7h1vm81Oy6h4/sJlPFqhqi+MtiKKXrFf1oUXMkOz3Befn58i7DSqPeHU64nr/KV9dFJy9fMkgShzfY9FP+ODJjMuHez784Pu0TYkyTIJ+i+4HwmXMgIXlSL64+zG7W5NvP39BQ0MYHP9/nSP/f3/9lYrq//LP//sfPazuefr0GFMEaK3ZrHIadc145rPbVHjOHM93OHsSELojkviYp0+PKHPF+flTPv3Zn1H1OW5yhG2OOD9+SSkrXk5PWLclt6uvKMqMyTxAKYnrJuz3G6q8R6pDYjUOT0Ap8uqeARfD2uMYM46SF4yTKU2To6qeUXBCHDqYjmK7TzldnuOFIVI2lHl9WOP5Pb2UjMdHWIGBbU7oKTk7m1KU1/i2w3Z1yw9/9/f4W3/z3+V3vvsfELgnfP7FVziWQNgmadaz295yn97zzc1n+IlHUZpcXd7Ryhw/amnamrpssEyDus3wrCNc16Lrmkc4tkVZSq4uH/D9AyYnDH0e1pcEoU/gnPFw0WIw4FiCh9uSomzoZUSaNtyv11iGy3a3wXddLCEYdEeZtjw5fcp/8vf+K/785z9DU+L5FqpvSfcli0VA1ZS4jofsoFVbJpMJ+/2Orm149nLMPl1jWjbJJGG3zQ9etFZTtx2mpaiqkiSYYpsGlWrJuwxHwGyxRCgFuiOrci7XBR++OOXh/oqiaVhOPLoqxfFCXMOgbnY4dgQyoW1b8jTFIECYGtt2SfwXzKIIP7RZFRs2+c2hP3kWUjQVk8CjaVJsYaPouV9dEY+OaLsKIQSBcLFch0rlyM5BNoqyzem1YreusUyPdN8hCwvL7smrFbYdMY7nlG1P03VUZYFtBJSqpDU66BSzKCLNWw52gIG+6bGFwWI8YjwKiCOXIPDIi4bTk2eEYUIUe2R5ymIZ8tGH76F7m+lyTDKJmB4FCDfn9746cFR/+v4/wfENAjcmDCbMFyEYBQOSo+rbBENEnmnK8lDzeeCogpKK0SjADwPK+sCdfBuwsWwT1SmSBGxX8EXzJanYkcQRRVqQZx2WFSIOTfDstzny0X7jugF9p4jUEUY+oikPitrboeBtK9M7wywHhuiDfYWerTEdheVadKonL3LqrkRrh6pu6VWDaR4QV03dITvYbDcURUVVF2x39zysNrSyRZgOYPDk6TlJElLke7RumM2mB3ySNTA7SpjMIuJ4hDAMTo4XHM1OGKixfUWUjIiCEYYCtI1jxwShRzJ2mc9PsERElj+gKWhbTZaXVFVKWdRUVcWgNA4JPkd0uYljOfheQCtrDKclrzKKoiZwI1zHZbdd09eCwE0QJli2Syd7PDMijsfoQWAMFkJAr8G0bTwnYJBQZN2B/jBZ0kiFHDJa2eO4Llm2Zbu7RZstpuHjOwFDVLGKfk42fUN5dEV3cod+mvEQ/JLK2JPwlORoRGPtkd6G8anF9Nzh6LnL4llAcqIZHcNo5jEKYlzXxPMO6fm3KLGD6HloQjP0AdIPj8PdIA7c18f3DoPs8Bt81EOg76DOineXzNvGLuCdp9owDozaKLFRqmdQh1BVrzuEaVLVNZcXax5ua2xLHOpd3xYscGjQssyDb1f1Cq3BsgxGUwulNGEQkOUVN1fp4W/5DTXZeCxZSJKQ6ZlgN/+G0ewUScHlxaeM4wlZXYBQTKZHPPl//j4Ab37whxT7HWpwePn+B1gNPD1/wS7bPfqrYV/e8eOf/V+cHr/i1bc+ZL29Yrcv8AKHqpQURYbnGge7Sb4idCa0lsZwTZ4cv2I2OsIbSZS3Y/ns2wgrxHFMhNkzDj2C8h5jXXH64iOG0CI8njA7XdJrj8l8gm8ajKYuX11fUOwLirRAuRaDNphPF0ijwyWkr0qcKCBwfXrZYtsGjhWyPHrOxfUF23XD02dL6vqAcbJMm66VZNmGIm+YTJacnC1QdOzSDVg9Ay1xHNN0NbblkEwMXn/5DVEU4Xku+33N6clzhEpY3wpcJ6buJW07UNUl15c3nJ3NuVvdMGDjR+EBI+l5pHlBWaaMwoSybTEshW46PM9lPJpSVxrb8XFdUK2gqzUvnk/RpsHP/uxf447mVKIjW5WEbsho5tFWLmFiIlyHyThiMrKpcoXtBUhjDcbhjLawiOIxtrmnrQrqpiEZT2nLgtn0Gcmk5vZyy8sXz/HCmNeff84onBAmMdc39zjCZ3l6xHbTcXKckJUZVRPh+ya+r1jdSxzniNPzOWXVsN2V2I4miE2Ecumkzfc/eMqpXbP78pbVviBKDNYlPDk/YRrP8CZnfPAy4dO/+HMWz36LZOzy+usLJouE0DkjK2ru9g9ETsxyvuBh3eLaAd//3n/410JR/SsH1T/5yT/90XwRkeYls+mIdUN92QAAIABJREFU0DtnGExMN6OpFGFo4FgjHMcmzyqklCRRwsN9iuW0fP7NJcncZX48R6qIz7/5BmvU8fXNlmi+5P7+Hi/QhN4RZSEP3dMqINsVWJaDYfZUdcvDw4o4ElRlTxAk9HJgFn7I+dF3We8/JwxNzp+c4zkjpE5ZHD1FiMOaPogFbVdQ1w2GWRDHLk0Npm2SFyWha+GaYzqpubq6pq1rRqMlnRzxqy8+Z5cWfPrlL7lZfUWrOxpVsd+XrFZ76nIg9EOiaIyWA/tNQ18bpNuUKu/Z7iqePH2B50fkaYMaKtAJbau4v92zT1OatqMuNVle0fcCQcTlxYrNumAwIc1L7q5zmi5HSZO6yqnrHEO7qE4h+4quUyitMY2Ol8/e57/9h/+I3/vdP+CP/ugntDJDCA/ZDoxnFrtNQRydYDk2whqoSousyElGLrJzSPcls/kMqTs6KcjTFN+2CPwR2hoIxh75riEwXWaLERcPd6ihYzZNGHqF7SgWy4Sm6RkHIWEQIhF8MHf5B98e+MF3l9znAms0YbuvqVuDTrc0XUNv9KzTawxh0isPrSW+NUOZA/dpCnZDWVfkmUUY9lS5It9X+FaIG4yom5Y3t1eUeY5jK3bbiqbRVNWhzlEEA52ckFcVvaGxHQvH8pjPxkTJQZ1eb/YUzcEG0nYNTSVRvYntWehe4oqQ8SjBsaFvFbZhYRkWoR1ydrwgjkz6vsO2JkzGMxwfNps1XasYT1yePj1ju05JkgP3U6kK1TfEMfzOr/4hAN/84H8mz7eMRxFHyylKKYTZE0YBi/JDPB2x27aUpX5UjXinBh0S+CZtB+9i3QbYlk3ftYyn0LobPu9+xkbe0nUNWh260YPYwrQPwUXH8gk8D9sK6HTJ3XpHOdmRDEvYhwxaHT7zMajza7zPr32NubXDPc5xE02a7ynKDGGYdK0kz1OUFvS6plclaAvZSYahp656sjSnalM62TAY0CNRQ08Q+Y/YoQFDdHhuwjg+w7I1fqgRosfAIgzGOIGBEnuqOqNuc2zXwBYu6AbZ7hgGk37oqNsdDOLAhXVDLNOj7nZ0fQpaMB4dEcUh2pDIoUWqFql72vYQhgrChKLdoBAkozNG4+mhl14JfHvK05OnmKZivd1i+wbCajG0gykEtltjmuYhTNrdUdYrosjHNBVldUvXlZSlwHFtXF8ziJxOb9nlDwyGxnE6fDsisKcIenyvw/ciLDuglwAOluPQ2Dl34Zf0z/akR6+58n9CdfLAlfcL7uJfcB/+klX0c7qzO6ITn2W8JDgumTwZOHmVMD+zsJOOaGngTBTJkYubaJTbUht7hG1AZx/KCvTw2O70do/+62tDPH6pGh6VWIaDc/atEmsY4pFlbTCe+ESJfQjEMiBMG8fxsB0LpRXrh5YsrQ7tTAMY4qDWMhwoAZYtHj/zoOAKE46WIV1foJRBuq+5u0kfucCPw/W7KlyYTBKOXgWkky+xlE2W3rLb5Bh2T6My6E2i0Tnnf/rvA7D//T+hqAv2dUGSTJiHMfebezqVk7V7TM8lCi20kXJxcwV9zHsvPmKbfU1dwmgS8rD7DKU6+kGjB58glFzsfoahO2gjlGxwzI5v7r7g5iYlDsdIuePTX37BOJrw+68WYJ8zmiT84uanvL5eHfCQbUmV54SJR9W2yNYkTkyaOuX49DnTyYTrb94gepMP3n9OnjbkdUmR10ROxDT2UaolrxVabYn9kKbryXcpfaexTAi8gKrK6bqeqkq5vrkhCCJcz4Chp+1KdrstTdsxShYoJdmla2zbYrE4R5gmoTMl2xnkWYXWkCTPOT95wXazZTFb4joBlj1wfbMljAWqy+l7wfHJUyxa2jpjcALqtsPuB9oOJuNjBhr2+x2T5JSmrZjOLcq6RSqXdXrD9OwZ8SyhKQbS7I7R5BnCNVhtNthujBAdvjdmMDJ6qdBDw3LyPVxHYoiIZOJxNJ/x5rOvkL3L8mzB0B8YwLYYYyhNHCXUjy2FfavxooiqLDmdL+lkR5bazOcxm2zNeHrMOIkp95LT0zMGBPNTwTa/Z71Z0XQSU58yikw26hpvElJnA2V+S3h2ztnzBUfHZ7x49iFJ2DOePaFuU7bbDGGatHWGbblEfg/Sw0BRFJJ5eEKveiohGVTP7/7Wf/TXf1D99Js//dHy+IQf//hf4Xomy8WSNL1ltbpjHM9pqoZW3WB7kt225mh+jpJQFA0nx2ccL6aMj2cHjyM1vbsh7zLO44Ci7ui7DhMHx0vZbze0jSZJLFzHQ+sD5LcfKjArkjBivV5hBwahtWAcW7Ryg+EMTObHFH1B03W8evU+uve5vr6ikg+YloXne9SVxnfGdK1mPJlTdSn5vsA2NbJ26FSL7Qts26VTNa+vvuSLry759PUvuH34EmEp3lztybOeofMoy4JW9mRFT1MGFGWFYyakaUWvXLY7A6kM7h7uub7acXu3YQDWq4Lx5PCg18KgqjuUCqkbSdt1pGmLlAIGi31ZI0yX7X5L23UYhonsGiwL+takqreEI5N4NKaTLVVbMEme8/LlS15//W+o5Ao/FFRVyTAoTOuQ2/WDBXLIsZwKQxgUZYHruTSViVIWrSx4WO3oanj25Iwib9CmAq8/JLyly8fffslu/0BaFDjC4GgZMR355LWkaQwMPVBLhWvYjETLibjgW9OBn31yx2f3DssnH3B9c0FZ7TCEoEgVZdGBFhRZi+eGaC3wowDZlwydwbOT57RSUzU9iTvGdx1kr+nqhqzcY2iTm9sdXWVjupJSZmx3Fa6d8IO//T5Vm7HbyEMHt7ug6w+rTqkl222KKTz6QbPJdijZUssG2z2ot1oNmNLEMC0qpTCMw4ETBA6WYzKIgTDxCBJBIyv8cIxpexS5JMtXdF1GnMRk+5o0XbM8mlOlNbJpiPwFvh3w8acH4P83P/ifMCxJGCc0cksrt4yTF8xnS7zVAquJKfOBojis/A2GAzjdMFCqRxiHdLQe1KMSZT5yOBt8X/LF8T9j7X1J03e0vWQwbLQSmPZALwaUFvi+iWu4OCJmfjSnqDLSbM8zPsYtFqhO/UbMxng3MP/moDrVp8hwTResSdMtTVMiW43qTdqupetrhkHQdYrhMbGNthknJ/i+T1nnhwe2oehR9HrAsnwc18Z2epSRHhBdGBiWJErA9WzyoqZrNZ7rUJYZCMlkdvDWunZCEAQ0TYUfhiijJk13j+zXns3mgbppsG0bS1iMohmeE2LaJgrN3eaBWraMJ1OEbbAvDp55yzRoKoXnjnBdn6psULoi8H0cYdF3Etu3GeyOIAg4PT5BGJq2zx43LYqmrjF0iO9OMO2Bwe5JpicHPnKxQumGnpaieMARHmEQ0UlJEo+ZTeZ8c/U5jmtgCIei6smyiqqtsF2D7X7HdrdF2AOGk6GNmvUmJ4gUpl2x26Y0laQswF+MWY1/yVfOn7Cdf4I+7ejnO7rTX9G+/Iz09DXLvy2Y/3BAvfga+eILpq8EY3vGeGHjWQ6OI3Bsi77vMdCP3FceiRW/buMyDOM3VPlHnywHi4AQA7NZwKB7oijCsQO6pqNrO9qm583rPUofuMEGHDYLgwGGeGzrOrS1IUAPGiUHFosFs3lEWRWsVxu26w5hir/smX38vaLEY3TacyF+TmO0DEaN72hWmx1RFBCPE8p0y3s//c8e79t/QlrvmC4neMIkW12jnAHDNillzc3DNYEX4/kxRXnHv/7pv2C937Ivr7i5veTs5CWzWcg+fcA0EkaThJv9FZE9Y2rPiIIxpqHpthVjcc5kFiN1jq1dpp7LyTziVz/NKMbH6Kbk/uaCzt5zPnmG72napmMQOd98XrPfrLFCk7pqSPxjlqdHhI7N1etPScYx2jUJ3Qllm2GJEKM20V3D9fqK9foNL89f0KqC++srzGHKyWlyaG0sKpq2xA1cHNfEUCYffviSrpVsNpf0uiHwfb58/QX7tGA+P6VucmaLOZv1DqUKxnHCbPKM915+gNEY5MUdD+uScORT1h2yM5gmCdM4okoVp7MJWbam7Wpsx6HXFVm+pcpcjk7OMZycTnZ0rUEUTjh5EnL/sKYoG7qmwfYdkvECMbj0/Q7L7bm+eoMaWvb7DXHgMJ1OyVtJr2xOzxes1/fUdYMbjjg+dvjsk5+zvTH47d/+Ld7cXvPk+Xu4wuTi9gv2m54PXn6Hurvj8maDZ3k8OXvFpthT15pX753y53/xM7JMgbJIYh+tMrJVRdtmgKZpFYY5UOYVtq3pW4HuB7b7r9lmO766/pov0xJ36bBtJIvJcyJ3YHN9SZbf8+bNJRf5mkpr2qqh0TAOR1i2iWe72LZL34Gna9J9xng5R+5qfvdv/FvQTPV//vH/+KO6MJmOE5T0aZuS49MJN5c7fN9jNpnw7MWUpjmEGxzHZBTN6aXJeByQRBbpvuRXX/4E7ZaMZi6DMWY5HrHdZ4wjGwMLW7i0bUkYBUzHR2gpSLMtlmsyCIkwbHTtYtk9J8fHXF9sQTe0/Y5KSR52t2RlTZa26N6m7zsu31wQjmI+//QB06upyjscN8KwJE6kDqnrXqO0Zp9fk7cpo2RCVWZk+YokHmO5gsVpQOCE2MxpGk1TlcgSbDugrsG0LXbbml41FEWNYSos1yHNJWooyYoU0/Rp2ob1botSJvv9HtuzaRqHIPJpZfuuhtDxfK5urqmqFiUNRqMApSVVbjAaB0RTl8GwwZJoLMqmxY0MtqkmiByqbsfF1yv++b/43zHMlCSekqea5XLGw13F6cmSrLhB9QJLhEhVo5RBnmdEiU0cT8A0yLOOURgSRglF3ZAsDDzHInJOCFyfq+vPubm7Am0xixM04BpTVlmLGlpcZ2AjWz5+YeAXG8ptyaqAn37Zc7t3uNnc0/UtWlv0rcFoJuhVi+fO6fqGth4YVMxAx5MnY94/fYpZW/Ra0A8tuo5oi4I8h/vVAw/7h0O9Kgrftbm5zWg79wCItwKUFBT7AcuB29uSroPtds0uP7Tr2KbGdA6cU3TPfDpGDRpHuIS+jakthDIwDE0YLw5NSIFFELm0SmF7PlKDMhRYBlmZEfg2T8/PMc0AKRsct6cfUgat8b0xH3zrKUkyoqi2bLd7/tab/waAn33wv6JERRQuyfKcrt/jWBMur1/j3B7jE5ClHWV+ePqLR9zQYVA98GkHxLsKTyEMulYyih1m84AL++d0fk1RS/KqQQjwPIHSgk71dLqkbTti3yaOD5XCkWdjDzYfJ/8OYh8eVn6GYDCMxyDO4czQWj8qvAeVNR99xUpe0DUms8kpURRSlHvyosTzPFzXoyoUXQu6N1C9oKk1oR9juzYDh0BPKzsQirqp8byAOI7xPAGiZbV6oKhybPdAWRCGy0BH19YYDLj2GMscYTs2pgiQ0sC0HbQGNbT4gYUQkqYpSeIZ8/kRWvcEQUwSntLUAqXg7Pw9gmjK5dU3dE2PY0e0MmWSzAntY3Q/4Jg2vcyQfQXaxTQFptA0bUrZX4ItidwXJOESSxi0NZgiIgxiQn9G5C8YaOhUjm5NbO1gGBrTGkA4bHc9lh5xevIUOfT0vUEU+uT1Hev9BfttRt5kNEqy3d8huWc6XeK5U2R/uDez6oH7zS22LRhPbYbeI10bOMKHwSEZR3RqT5rn2NYSSxt0eYfqFWWbUg+HumhjsKjKjmQcU4oNzfkt3olk4c1ZnsY8OTsiSiTzo5AoMklGLnHsYTuCtyWrv6ZhvR0Q4bHSDddxmM1H2FaA6zo0TYtGU7U5ed6yuq9xHAshbIRpHXyvhgBDIx4NtX0vH1f5A1ppPN9lPPPJ8g2y1WzWHaY4tGa9sx88DtFx4nP0yuLK+7+5K77CNFwGw6OQWwJ7TF1nNM2ej/7ivwbglx/8D0wnC7LNhvX9JV40px9sCgmO37JP78irEtc2SKIAPzawzIKi2OE4NkHocnd3R1lrDDsgmUzwnRjLTJhNlwxdjhuN6UMLZVhYvoNn29RZR2dX/Pibz5l/9CHxyObiq3vsQPDz19c4Q0I896gLG6PT6LJC6A2m1zIMHuttyig+wsFHqoKiyTGsgG12iWdFeKMJZg++aRMkMWWzwzJsFskxs8mSIBIk8Yh0t6ModrR9SxiFFGXGIjnGD3z2q4LFbMTV9T22HbDZ3JDlBacnzyirkr4bDveKYaDlgB/4ZPmeLLuma3PikYPtBHRNxnw0w/djWlXz6tl7ZPdr7q43iNCkalPmo1OScMR45iGsw/mfJGOgpqorwmhM2yqqfE9b7zg5fYaUFQ/XK3x7St0UpLuUxewMY8jpKo0XJAxuy3T6nMAbYzkNt6sHbMPgYXtJJXPqUuIIzSAGJrOneMGAH/cUqUY2iidPX7DJrsmyDeP4nE71bB9SPvzWC+7vrhmMlqqqmC/PKJsdaIsn5wlv3rxhsRjz8HCHgUPV7snTnuevRlRtxnuLZ+h1QTieMx+dExgOri0o0pzWtSgNm7LesdmmzGcJD6s7dAj5JuXp01Mu36zxvZBvvX9MV9/x5PkT0naDo2y+92+FovrFv/yRbE1OzhKqquLls+/x5s1XeK5JGHoIw8HzFfu7gDBI6Noa2014WKVIXWOKOW5k8cnnXzGaLJiN3iM0XapCYqgSS/iEMfR6YL/LODk6Yru5Rw0meQW74gbXHOOaIbqDxTxmvymo6y2nZ6coLXjYpTh+Qrrd4gwhw3B4qHiugR1syfMWfzRCdLBpNtT9nsvVDZEryHYdLT2V2NHpPaYRUewrLGfgaDmmvG/R0qZvcnRjM4oD2kKwmNrIxkMNAin7w2FpCizbpG0VShp4nkvTlDjWCKlMtvsNUoHtRGRZg2X7PNwW+JEHg0UvDdquAkNRdz3N0DEohWOPGI3GWLag6xo8VzCoAe/R86eHgf22oqkbprMRi+kRbVMSBB3TyTFl3vNb3/s+++2eo/kU27SwhOaDZ79P1w0I7aKlIks7MCO2eYkdWBiWoChK+qHGNi36tsPCpM5zinxPWWfEc5fFNGI8mhLF9qF6Vkq8ZElWdWiteBU55Ld37AqLbWXy2VXBumvYFwWzoyk4EYF5qBUtO0kUxKR5jWlqQtNiaEvqSmLbCaPJhKqo8bDZ7yu0dlB9TdOmtA0UjQZhYbsG+02B6TrUVY+UDbfXOXlV0vWCspSYWEhdozqN4ziYlklTKzzh01QNgRdR7HtcO0KYA6ZtgytwgxF6AG209EZDp1oYHGzr4FvdZRv6ATZpiaEU43iK7CRCSEz7cGgahndIfTcHG8d4FGGZHh9/+l8A8NP3/zdsx6AodtTlgGWGbHY7LHcg2b0gNqdkaUNVAhwezgcm5gFabpoO77ipukcYAtl2RInCshU31mc0QU7ZVui+xhksLG3QFC3IgUENBFHE8ugEOUCjcuajKbE35tz4Ls3KpcybX/v63ilRf3nNCxp9uqb2Up6efcTv/Nbvs8tX3K2vUAjCcIrjWORNStseuKbW/0vdm/RYt+XpXb+1+/70J7r3jbe7bd7Mm1WZWVkuGwvJCBBSSQzAwhMkPgAThJinhITECAFiyMCWQC7XDGOVAdkulyxUBjIrq25m3ibv20Z7+n3O7vfaey0GJ+7N/AjlGEQMIuKEFLFj7/96/s/ze0IDy3HQWmD7Ai1ahBL039S0CptRMsUSHUrXyBY6qRHKRAgXy3aZTh5j2y59XyKlYrVesF7foBV4gYvnQNfs6WWJZQiqpieO5iRRgmMNMc2QQ35H1eSURY9se7TQFGWFH4TYnmK5vsZQHuPB4LjOJsY0TTqVEUYOnmNiWwHnp+/TaUXe7LEdj77yMNSx7aqsVqB6lBI0bU7TFri+SSmvyfKcYfKI0K0h/ZqnUcxHl895fv4cozMx6Xg0mxDZJVrWpHVG33c4yqTKJWWlMQ2POEzYLLfk+4I48gmiiP2+pCwPaL2nayR9M+Y0usDTD387u0I2W1x7iNkHmLjIrqEhp+xqOlUjDIHrDOlbk7rq+Prrl5jKZiPvWQ0+Jxc15+Ep/qBjGD5mOEwIY4PLZzPOz+ckAxPHPwb3OvXgdT6WNz+I9ArXdnn85IQ4PgoZTStRSuP6FrfvMrJ9h+nYR38q/FZ5gMA0+BZRdbQhHP8fGinxIoFha+rKZr04PKC8Hl7jWyuNwXQW4Y5qFtFrPE9gWSFN0zOOR/jOmK+/ek088Pnkl/8pAL/4/v9K2wmCckkke3pvzOg0olP37PcbXjz9IZenn+D6JrvsirJOsZyE8/mHeG6A1g1x5JLuV+TZHkNYx2vxsAFh0PYesikJXI+vX3+N5fQYQh9VyeKYfXj24jn5siZwLcp2zejEQ9YNUewiGo12I86fnWAHgkb1BMkxSHr15ktGkyHCdrm6uiMOXMp8TxyNSZ5N2aQpTijI6gXC6Akij/XtOywRc5++papMnl2es7q5RrZwdn7BId3RtD2NclFNTuKMiQYz2sZkFIVk5RrXS5Dd8d7oCAMbje5y4FiBWqcrYjckiscIe8zjy3O6vEb1EJ1GpNsUzx8wnkxx/YDFqiRKxsjygC0dGtmSr/c08kBRNIyGCW/erInDnrntkBcu49Mxm33KYbfBEmB7Hmle8OTiElNkyNZnMp3hWALZSu6W79DaZ34yhy6nqRW2JbGFQNLy+uYN6SFnubkmjhy61iSMBwRhRFPVzE+mrNfXqFYihaQpOkaRx9n8nOnJgJdvvmAQxiRuzPTJr9nuXmGbAbv0jrOz99kc1vihj+Oc4hkuZSsJpkOmw3Nmswlamdh2x2a35Ha1xTY8DNtA03M4HGibltgO0MoiDBI2+ZqirdlsUxojZFUVXL3e8+TZIz56/+/89R9U/8W/+sc/2R9u2Wa/wrJMVouafb7G9QVJckqdafxQUxWK6fSUtlX0qgZ6LNvm1fXXpFnKfD7h0fkLbt5uKQ87drtbfNfhfr3mdP4h+33LbBYT+DG+55IEc7abDaYQPH58SpaWBJHP3e2a2ckEtEtRNgTJkK9e/pwkuiDd37LZ71llOcqAZBhQGvdYZoChhpTNlsZqKeuMySxk+a6l8wSlypFKsFrmdKXm+eWHvHz1S56+L3jxYs5XX+zoO8FgMmaf56S7lMQdsEpzDtmeMHCRqmUwGNF3mrbpME1Bdtgi9NFTBQ2yUajOJPCPXkHT7GmkpshahLKo6wrbcbFsA9UrVOszHvt0fYPrcVz7y46uV8cHTVXjuAamcbzB933DdHJBXfbc3b8hCgd0XUOeVxTlhg8/PscxE7I84/LyCfPJRxTyc/JDQ9NIZidzsqxEi46uqZF1dVyb9T1NqfHtkMCdcsj29KJDWDbPHl3w+NF77A8HBvGAj9/7A+7WC/yhiYdFX7kcqpp9B1nfs8h9Fp3DsixxcXG943p3OpgSBjPysj1aFIwjwLtscxxPk1cNWVZT1AZ25LNeLpGlQPU9ptFT1z21VhStpColebEjGYRggcDDMDrQPbPxObblUNUtvZBYToBhOvS9BKAuG7a7AygbrQ32hxotDKRqqCsLpUzQkn26QvdgCo1lWvj2kKYqCX0brRTbTYpsW7oelqsdi/t7hoMBZdXQdoKmlTSyJi8FaVZjG1OEYfC9z48rxJ+9//cpdg11A4YNZSGPiB9bMNq/wO8mZKl4AK3z8JA/JvGBI7xcH+H+x0SzRnUVQdRiO5J2vkD6Byyr5GQ6JgknVFVPUeVYpsMgijEBaSjc2CHbdzSNRdM2jPOnWIeEqqiP6e9vDQDi2wQ3HBVV1UM92vHjf+cP+OGP/iY//fn/zS+/+ikaiWkePYWWY2FaBr7j4JhgOz1hGKBFj+keAfBV3aC0QZj4uIFBK3NM7eG5MY4d4loDXDcgCAb0WpLuU9abFZYDk8EJs9kJvXEcrEfDAV5oo3FoW0WlUizbxBUjfOOUXhqUdYGUirKrELbANBS+q9mu16zvDzw6eUYUGXiuzyiZk243lEWF6wJa0zWQ5WuKco+UPapXlFVJWTQ4zgDHCrAMyIsNh2pD0+1B9Ghl03US3xf4zgihDeZRz8ySdNs3WOlXTK0lgXUg0Clzb4tqK65WirIH2/Jx7CGm3eLZEZfnn5IMp9zcfYXsKobjEC0MHOfIS767zilSk9APQHV4rokftthhTd0YxOYFbWeyO9yQtXfkzY7QPSG0zzA7kGVJLyVhPMB0czwfBpOQYZSQ0SKeXFF5O8TtEFkL+q5DdwaGsBGiAbNhvWyQ3W8Cgd+Grx78rCenYyy7o+t6PMc7Ho60w8svl3TdcV+v1DFFrh+qZY/D5tEGI4R1vDqFheBY+zudjhgMArbriu26/E1l6jf+VKExhMFoEmImNevwJYaAdLtFS4eqrKnKktnkGa4z5IO/+g8B+NfP/mdcK+QHf+vf53e/8z0Wb39JoST7/Q2hc8Ef/rv/OWEU8ad/9n9RNTuCYIRpWaxXC7QSdK1gf9hjmD2DkQdmwWa3YTCcHD/fZSyWK07nj+k6TS1T1vsDSh7FiyQMkHmPScTTZ09YLW5J0wqj1+RVdixlcPdcLRfUvYUrAmzPJwoDTMPFcWIePXpMLffYnkBpye3iFssLKdOMppYMpi511XAoclqVUxsNhmkSDwK0GjIbBbT7PZXMacyEx4+eUtUrskqzSAs61TAeTcA2uVrfE1qCqqxJDyssXITuKPKGLC/wg4SZNaLIW9q+x3J8oshnu7kFQyK7mvPTM9bbHVEyJx6GBH6MbcL9dc3pxTl5mTM/jcn3JefPPyEvNpg64vd/NKFUC55ezLlfv2SfSi6fzxjOhji+T5ZtGUVzRNdT1iZu7OD7E+6ur/A9TVUKJidjvn71EkGD6g063bHZ70jTe1zHozNyOjR1Kfj0e5/w2Wf/H6aYkox9kvEAw4p58ugxy/Vb6jIhHtqkacb52YT96sD5hc311eeYjBgmc/KiZjQb0skj+rDIS+YnQ7KsJc8aTNNiMh5TN5qvX/4a2Ume42fSAAAgAElEQVTGowkCTd3m+CHkB4Hr2viBj++HvH37hkOVYhkDfGt0RAm2LbF3yuPTS54+/b2//oPqP/nn/9NPwmCE0BEGQ5paUrcZCot4MEW3DveLK+YnJ7huQK8Em3TDIa9xrBAl9sjCxaDHsyNubn/NcOZhWQm11ASBj9IOWAWj8YTtKsUyDQxsZNVj2orNJuX2do0wK9ZLwWDkccgK9vsDtazxnClVcTi2NAwCWtOkNxTr7YKf/fwrbMMHc83JiUe6aVm83ZNXDau9wgkkmJqqMKlzjyiIqduUspKsVw7b1YG7NyaXz8/Juh279g267Xh6OaE3oG06OtXjuDaNbIhjD89zaOqOtmpxbIuyqDEMn07VxNGDF0Q2BGFEJy2U7hmPhxjGMfDiOS6DZEhTtTjOMVSw2S4fbsSCrlPHNKvuUL2FKUza5ug1PexLDvucvCzopEXfG2jRUjc7njz+hC8+u+X0UYBSJj/7yz+lblYUh2Og5fz8EXd3G4QWxP6AwLXRlUEUesiuI88Vymyx7eC4pnJD+lofAdF9x+PzJzy9+Jgv3vyK+9VrbKkZj8/ZH7ZIbPZdwLu1RDsNoXuK6iwwd1hew8XJC8q8x3Aknp1QZRZNK5GixXZbskOP6jt8L6JsSu7Xr+kNg6ubK2pZkqYC2fdUTUtTSegErhXR9RVaa3a7ksl0QOj7BIGFFhJhQ5XnVFlJ6AwwsDhkKXWjMKwAqTr6rgDl0fWaqumObEx6Ol3hhz6e77DbHvCcIW1/QKoGrQ1MW2BaJo0yaGpJ5Ps0ZcMhq3GCGATk5QHfi5F1TxIe/bjf//LIY/wj/79mtVuQVw150R0DRQrobS7736FPXXbbhrbluHP/FpauHxp1zIeqyh4hDLpWEoQW5+cTZCu50p8jkhrHEOjWBCRd1+MHAYNRhCkUhtQUeQY6YxCZtHWN6wlm9glGHlLsNX3/8HDXvxlXf4OoEqi+472//ZhP/+2P+Gf/8h/z05//GZYj6HtBU/e0SmG7EZ49IHIszmcRQeQjdYuyShopcW0f026p6gLL7YgSA9e1sC3BYJgwiAfHwJvu8UKTqj2QFRtsy8GzY6o6p6i3BJ6PZXusdzfkeUpZtVR1T1232A6Evo9tuGiglAcO1R7RHxUe2d+THnKKXBDEDobwcYwAxz0C7QM/wvcNTMNCd7DdrUErkugMLV3yck1RrcjKDXE0wLVDqjolK2/YpxmumzAcxrStZrM+UJQpq/Ud129vqWub3DQofTBMwfXr11ztbriv7nh7/4arRU5pTtB9DK0iGQe4ToSSsN2UOE6M45ocsopOVLSywHM9lGw5bFtO5o+IwojNbs1wMiJyI8yuRmrBap1jCQfTzynlmrowGSQuj86nCAFtpymbDNV3qC6nPJRMkkuEFhRNjlImndGhnDucYoLV2w9f2yLbmlZq8qyjqo6renE8cX1z1AGh8XyLKPGwbPuY9i8qqlLw9s09wuTYwvWAptIPBIFvbChd/6Cofov3PbZyua7LxaMhh7RmcbvHsq2HIffb3T8CGA4jJo88FsFn3N3eEwYTBBZVlaJUieOHNCi++4v/CIDr3//faLKUt9crvvP9/wAtF7y8fsOj0x/gO3NcN+HP/+KPuFvc0LaK8egczxlyyG8whELgMByecjp/TFn13C9Szk6f4jgG+3xFWaUE7hjZZ3RUxAOfNCtI7/eMkjmWMrh9d4UUkrf3X3N79ZrIndK2GcrsMa2A8+H7PJ+fsKkOCMsmzzLu7q5I9xXhAL78aonhKM4vzqianM+/+JK+11ycPObzr37FeHJGXSrA5tF7j1gu9hjKxXMi9lmG1jbnl3NkV5MXkosnjym3JaLTDJMY3w7Zb5foquc8mRFEimyvmE8vqOsWw4AwilBK03Ud9+82LLMte9kSjlyu799iOC5CDxkOYvZlRXpIWe/eorrgoTmzIct3+P4Iw5Bc374CL2Y+mSHzFcabFS8uBpjBlLlTcWLmzP2Oqg1ZZy4vf/0V02jGB8/f54P3P0UZHcK2KfKaYZLw7tVrhFWyz8ojtQRFWe45ZJoXz9/HtXuKgyaMHQwc+gaE2fLqVcr7Hz3l1ctfEJgJZ/OAmzfvcO0Yy1fssz2L+yXnJ5fcL1+z2xcU2ZBPf/d90rTh9PQppmUxm8bYZsnydosfjVitF2Bu+cUvXjOfnaFFQbqvSUYxoR/Q1oLt7o66MrFtRZxY7LYFjisYDmdHXGOWM54M2e1yxtOEOHR59+oNv/d7f/jXf1D943/y3/1E9kclQOCCvcAPGopM08gNltOTlzVBdMLbdwuW6T2OG3N/X1M1HcnY4/Z6zXw2PaYzDY1SA0zbxh7smU3nFHuXoq7Yb483pEOa4/k+RXnA98fYdkTTH0ii2YMSAnWz5vRkzq5SZG3JoXqH7yR4tk92WCGLFkvadLqiy1yaUiOloK1abOUwGT1mPH3K2/tXKN1wOr9gv85IQou2bClTzXg4ZxR/zMlZzAcffEI4Tniz+JrYHDEfnTG9CDEMhWV5KGUgO43tmPR9RVnU2IaN5Xr06pu6SUUYBfQ9WKaNxqLvavwwxAsCPMdiGMb4rs3TJxd0qkWpY6Xffl/g2N4xLShbijJjNEpQPRR5zXg8hM5BtppaZg/Ym+PJVGgf3T200Dg7vKDCsQZUVUfgu5ydTTBwcH0D224fPFE1kTehyjvigeaQKc6fxDSVTdeVVJnAcwWons3mGj90aaoO6LlfLlAKItuhFzmmtnDMiFoaWI5J5JicDgcMJgMcyyCMIvKdieuY5PUteVZSZDnj2dHXlu079nWGYWvub9eUxY7ItajbFiV8btdr6laT7UpsLTibP6EpJYdNxmg4xvUFw8kcy7VZLRckSUgQxhRVjemCbUcE1hx6iyzb4Zku42SOLUwORYEwTboeLFtgOjmmYSCUyyCJMSyB6zt43ois2JPlKW3XHeHjRoftRuhOYSrIDzmdhkORcShypNS0VUNV5GgtqBrJH7z7ewD80/P/gaqByfiM1XJLXTcEoY+sPUaHFzjSJzvUSGk8JJZ/C9IOx4FJa7TqEEAnJVFsMZ1FKK+gmm4QSXHcANQljm0TJxGWZdJ3EqEsDExCK0H0mqrYMU4S2kby6/qnkIeY6fhIC3jg/h89fuLbLnohxBFnNICXu/+HL9/9KyqZ0Stoqo6+E+jOos5sDFxs28E0XeLRhNnsnGESo7VEyg50S9+rY8DJFMgGoiCg71vqKqeRB7xAEESCvDzg+RZBrLEMC6FAa0nXWqB93FCiqbHMENcNcBwD30+YDC/p+4rFaonsIYoVoeNiqpiqbmllj+sPQYAfCEzTZrVaoJTCsmyE0RCGPobZIFVGJy1QNnm25bBPj0Q6QAibfK/ZLAvKcoNj2wyiE/I8x7QMDBM2u3u6TuG7I6RpcbVZs1zCdPJ9nr14SlV0lKXBrqwwZhfMnz1h6E+J/Dlu7LDb1xRVhTBgu12AEFiOBWZBUafURc7qZsfjsyd8+v2P2W06wiCiLDVyr7B2e/aHPXeHAiU3SL0GLRgPznHdYxXwu7srECG2thjFgpaWeHhK4A6gN4nchH2xYbcpmJ+f0sc1Q/kYR7vUVY3jOlh2QJE37NJjCAb12zSAo7oZJRGDscc+O2BZLpZl8PVXt6Rpg2k5D2l9jTAe/NqGQRQ5RJFFdqiOG6oHQgU8hKq6jvE0YLHYsN81D4rqNwPtN2UFBpMTH3F6y5fFn2MKh5PZGUop1ttbTs9naCD2LT74+d8F4OWP/3eUllRyT1cKPvn0e3z98i37tCOKY7568y84lNfM52dMxhdIeXyuxtGY+eQcrTs0HVfX17RSM52cEEc2tq+wjQGWI0kGAV3XHbcSTonMLeazGZbQRKHgfn3P/NFTEB2jUYjhmvh2gKN6nl98wPc/+Vts7jYs99d4tk0Q2oTBEGH23Kf/L0E4wvFM3r69wsBjdjoniQa8/96nnF6e8rOffQbUTOYRZR3Sp5rebBgOTpmNIm5v7xiczFFmgKE0d3fXfPDRH5DEEfeLLxgMTnjx4Xs0laSrWsqipCgb3v/gOxRVijAFF49myMbC9064T19hJIJwnGAZkERTDAsWyxWeY3G9WRwr1vMture5WvySd9dLPvn4Q3bbd6i+R3aa8+klt7s1k8mc6nCL2t3w9stf89lfvmYaRQjrQNbMaPGZTAN+53u/y+z8hN2uREqfRqZcXb9iNJoSDVxOHrsosaSrLeAYWC5Sh+9+8h3evLwmCkecn8WYleLJ2QlXb39NU2kGQ4ey2jMazMmzHLORCMPAiQyKsmY+H7LbHXCDmM6s2KUpfTNFSpPbuwX7rYEwG/bblsXNjlasubvZEIYxw2RIHHvc3t6RDMbUcs+7q9es1xkIeRQztMVquSNwHXabHM83yYuKPCvI8jvqtmEyPeHkZEa23/KDfxM8qn/0T/+bnyhxQBklu/UeLVKU6uibAa7dkdU1GAFp2nO3umGVfcE+y1iuKjBM9gW8fXcLVsYv//Ito2HCPn9LUTSYRkDdCD746Dv0quLN6xXaKKnaA/erO9xQMBw95+3Vl0xPxuS5wvEb2lrSdwrZ5mijpKdG64jT8TOenD2CvmI+fkTTljw+fcrH3x3h2gk325y7zS1e5HA2foGWG25vNoyjCbQGRmfx7uslv/eDv80hWzOY2BxS0CLjl1/9jMV2iew1ThcxSSZkTUZV5ximi2kbD2pnS69aHBFhmBZt34Po8EKDKJwhW5NONSgh6LTEsQWz0zN2xTW2WzGKQmyzR1PQ0x3N0FWN58aYhkUnJUJAUR5wTJc49hEaJsMEw9Q4nolC4ng2Gs16scawenoFi8WCs/MhZSHwA48w8DmdXeD6BusF4NzRFB0//uHfpG98zs8Tik6S5TnT6Rg6yW6VkQRnhIGHMDR+YLG4vcUQLnWn2KV3OK6PZZtoneJ7HXnucqg27NZbmrrC8SzcqEB3PR9+8AlNbaFpUJ3G94cUxY7Z6IIs1zT5CqcbYpiSyTChOFR4QQTCYDA5wTYmHIqcwcjGUzaPT+aMxiesdwumkxAbj+nJEMPpCOKQ9977gPlJwmazxnEtwjgCpeibDlSHVhWeb2EaBnEc0RkgdYftOAwGYzTQS41WCtloVC9Ba5S06GSLrDW2aaFFg2N5RGGCb7vQqWPbmFBsDzvKssU0fPaH+hjm6o7q4r+3+s8A+Gfjv49qXQ5ZjmV5BL6LZbooZRBuTjBKk7rW9L3JN1rm8ePRrGcaR36lUhrUMeBk2TVtl/Jy/i8pBmvKuqTXJWXRke62CNWDMrFMl8gf0cqeuq1oW4GhQ2zHo24VVaWZZC9w8ymq57d+/jcBqt++gwj8ImbLL9kar8j2Pfu0wbZDTGHQtD1VWdM0Oa5pkQRDhGWw3+9wHY/Qj2jqml526E5ji+iIdbFtPMcgOxzT+sPBCNfzyYuMoigwdIjqTPoWEn+MLab0ykbKDbprMWyNa4c4lo/pCrRw2K0N0l2JF1hEvguVwjQ8DM/icCgx8UnCEHSL5/rUdUtRrrHsDte1UPrIe5SdpKz3ZFlD5I8ZJDEowXT86JjmFyamqUF0JEMXqSq26RKFpmkK8mJH6Hs8v/iUYXhOGJl4hqDat+wPPmmhqLRARCPuswrTmZPlDVIUxMmIomiwXUUY2ZiGSddXIDowJFnWYDNhPrngZHRB7A0pipJDWiCrkjhxkaXGUZJhPKY2B2w3C4RwaFrF5MSjaSBLXQw8nj59wsn8hHGsSbMWwxwfh3vZ0SmB6VpMBme49gAdLCjdgn7lYvcGvhdjWgGtbFgtc0zD+k1j68OlbBjgeBbx0KKoNijVozr4+qslfa8xLdD6waD6IOsbmFw8SpidRtxdpwhhYAjz4XI0+KYidTQ6UiDWyxzLtr69Xo8NW2AIA++iJv2dP2WQnCGEAlGD8jg9fUw4tJCyYehNefqz4+r/5Q//IYesouoPNGnDo8vvEiQeZbujUy3LzTs83+ZYZ2zy1Ve/wnRapqMneF7MIduSDCIWixseP53QiT23NzfHOuPOo6jvQAnOTp6zWWf00mE6nHKot9imiesZSONIlah2NdPoOW2fYgcuv/fp32A2HOMMPMouZ7k7DtOWZ+FYAyy7Z5euEEaAKcZ4vglaYzshT87PeH31Nb2acTofYFsKuinz+Xt8+uH77NucplX86KOPGI8WXK2+ICsbptMph5uUzaHkyeUzHC/j81dfsVkVDKMhrS05nUxZb+6wnYjLyw8Qhn8M9sY+h2zHfDYkTTWDwGMaWlQbi+E4Jt2/Q7UG8cij7yoMFeLHku02hd5gMp5yejHAVg7aMqik5uNPvsNitabrNJ999YpUx5x/+ik/vyv46dsMy73kxYsz/uRP/g9u7q/YLg/8xRd/zi/+8jWTiU9erlimG0xP4Tomu8OXPDp/Qhg9QZsOk7HL7vCWbfWGbfYaoXxmp2Pu77eY+Dx7HqC1JvB86uqA50YETkBrZJyeP+Fk9jHpbs18Msa1h/S9yWZxTxyOiWOP4XiE7UUoFMt1zmBwwmw2wXM8hkMPQ1gkyQjT6rh6t6QuJfPzCXXd4/uDo/jVm4wGHnUpeXx2SbpfsNkeCP1TvKCjbjOyQqOkzfnJCe+9+Lf++g+qf/LP/9FPXM8EUbK42zGMLzmff8xm0XA45ETDEYdsy2p7z2J7g+N1bNeSsuioqpbbd2t6qehkR5JEmFbAarejEw1FUbNc51TNgsXyiiB0Wa131F32cFq2sIOa28U1ZaFRqsJzItbLHJOY7//gE6w+5ubdmrMLn3S7wcSgqgxeX73Bj1oSb8b95pZar9gcOk7nCUJ4eLbLLtsyTASJNyZxJ/SVxen8KeNZxG6/IghO+fyXL1ltlowmPlVVU7cHxvGU9TKl7g4E0ZTrm3uSgYvqFH0HlmWhlYfn2xTtHq06HDukk4J9nmGYgKWQvcR1QrbpjsM+YxAndG3PcDAhPRRIWXEyn1LXNZbhIvujJOO6PqHnYwiHVmY8ffqYJPFZ7l4RD0JcN6Zu9vTdMf1umBau56LocX3ryBatDgyShJubFWHsE4QGN1cbpuNTPv3ep3huhO0J3nv/E3a7NWHksVztcBzNdz78MVVe0JQ1RbOlrUz6zmG7P6BpWa7XpNkS0y4wcJEorCBCdpootjFC2GwbXDRaScrqwPTEw7NsHNfCtDp+9P2/wU//4q9Ii5bRMGA4cpGFTZpumZ0llHmG0Vvsdwe6PuPx+SmRZ/Di2fscqh0dPaYLyJ683GE5FrLX9L2F0gar9ZLDXh83BapFyQOjkc9wkqCMnkOV0WuwLANZKzwvxHED8qxnl1Zos0X2AhuLKPToWmjLjq7tUF1D3/ZEboxlPnjfDIOqqajrGtN0EPoIyK67nqZPKeucotzxH1f/JQB/bPy3dH2FZdv00qCo9ghhkx6WTIsL7DamrQ20svkWD8UDHkqph9YfjdDdQ7NQy2AiwOy4c19yW9xQFBVN1dM0DYZ2KYv2ASOk2Wy29FKQlltM7fP0/D3KrmFblPRK8JTvYmVjpFQPvtRvVqbi2+DKN/puryRNdM+iWpLuJKbwcGwfREdbZPRNixYmdSOp5QHhlAjdYHWCupBU1YG+NUi3LW3VM5vMEEJS1QdkC8Nkgu/bZIcMRI0wClAwH1zi2QmGcDAtTRSbjEYDNB1dfzjWGNcdkvb4+1WC8WiK7UgsoyY0IvpKk2U7lJY4novj2NiuQ9cLhGExHPjHoRbYpHes1u9AewyiM6IgxDYiTmaPCUNNdlhxOn2CKQJkV/P8+XNM22CxvTkinMwez3WYDp5QpC23b26RnYE2TLJDzcXl+7z3/D1QNbvdkl4FON6cODnjUO7ZZRuUbFHVnq6SpNsDXVdwfnbGsyfv08mWk5MpJ/M5XQ1PL18wmY9IDx2qr9jsbglil170bMo9vTC4W2T47ojAH3B3vyUe20RJyNn0CbFj0Tc1nheiSs3tbYph2sSuTWi5vFluGI0CTOsYdsyyDYv6FjUqiYoZXamp2wNlVbPdSgzDBo7tVuhvqlvB911OT0MMDGajC/b7kndvlg9J/Q6EDQ9kCEOYWLbN5dMhceKwWpa0TYdhGsfXfbAHqP5oNVBas90WmObDgMrxsHXcUhhMHoXopzscx+LkZIJhKCbjS55cfsjt/deUVc5gesbTf/2HAHzx6T/CMDrKbIvputR1zWq5odc5th1j2h1tl9K3CU1/zyFLmZ/P6ORR+e6kIEkSnKDBCzWbzS1tZZMkCUV7RZblRPb7PH70mPX67kis8BKGkxGqFyw3S7RpMx+eI7MCWXXUqiN0PfJc8OrqJT99+ZLtfk+2lzy+eI7jmizuViTRmLbtqKsC1Tc8u3yKaZj4lo/RCpLpiE36GllJhoMJULJcbSiblNVmj++3ZOkGYXUstxmT+Cl1WhNGQwYDH1Vt2aUZ4WBG4ho4qudQ1GT7AyfnJ2RFdgxTOia3Vx2ffvdHoKFranzXIHQ8xnHEYnVNXrecX14QxR4Db0CvoapNPN8k8Wf87u98iGkpbu7vefLRB6i+4t2bGx5NHtGLlutFSnA65OTygrrtKFuJaXu8/8Elm8Mb3CikNVoOtWQ8HPKDH3xAWWTk9QLTN9nna7781RuyjSSrMr54/QXOcMnsUYF2F5y8lzManuPwGG17bLIrhGMTRU85OTvl9v7X5IcUWUjMIKYTsFz0LDevyHZbynJD29TQKbyBzSFfMR1/iLAk17evsR1F3/QMEpu6KVH9sVFvvz/g2AGLxRX7XcHjZ1OqpkMpgyhOsC0fw+xp6pquUzjWcbNbNSVBlLBcvCOO52Bo9vsrVNvxwx/8G4Cn+j//7B/8ZHG/YuBfMhu/wHcn/PRn/xrLy/H9EdpM2exuMbDopEW6a1nfGTRVRbo9th9pbbLZ7Kjqlu0uY3dYIgwHYWh6e8f11TsM7aL7lvU6IwgiHl884fXbL0kPa3TnUVcFhgH3d2vCaITjObSNwTo90PQlst9iiSFJPGa5TtHdjovxOW2b8dlXL3FtD8dvqZaKQ7Zntd7RKMns9IR02/L47GP6tsdyOh6dX/Krz64ZJ4/Y7e/plUmVa3SnyLc2SkLfAYZJDwhtg1DIStA1grIqSdMcw24YDIYYAvrOANESRBYahUJiWR7eqEH3PVQ++11FPLKo5IE4TjCUpJGSvMxw3PBYZVpWdFLhRzay73FMA9uxqNsSRMd4NKPIgb4hjhqePnmOwYRON0xPDYqqxMAhDI4JU2HV9KpDCUESjNms3xEEPpPphOvrJXW5x/XB9RzaWuAGivVyi5Q1b9+8ZXYWMZk84tcv39LLDstSrNMS03OxDZPBeMYHT7/D8i7Di/fEUcLVdU7Tak6HU2QjiQcgjIDAc1itb7m4eMH1q9cs1lt01zAMR5iuz9XNHaeP59ihT5EKEBV1u8e1LQbRDDc26IVBdkjRuiUeRgwnDrbfIeuOKpd0vWazK8irHK1DekPQ9wZxmDCdTcjKhs2+wguGJMmUJJlieTb7LCUr9jiOwjCcI1lC9hwlIANhGMiuRKMxLXX00wkPTU+aZ/SGQd4UCGERuDGiB6Eb+l49qIUdWmn+k+6/AuCP/f+RojpgmTa2LajrFkVF20nOmvdw2wG9dNE437b9HNf/Cq0VhjC+rbHs+yPayAtNlOr57PAZ+77EtX3qoqZvFfQWtmNRFB1tW4FW2MLCt3xCM8JS5rEkQR8H4FP5AjsfIVv9Lez/G4+feKjdBND6mOAe9xfc7pes5YJBEqJ0gx+4tI1HWcBg4BJ7DokXcXb6mLYWlOUO2WX4ro1jjBhGJwwGIUkcHYHbyiAJT3HtBKUbOqmwTJfpaIrvhNCb+N6AaDhD9iWH/S2mJWhkT7bfYDgNvTKQtYFnxYzDcwI3BGERBqfYtsfJ5ITZ6ATb9fACl7IpyA4VXdsjRIOFpspLiqLAtmKaWmFZBhen53i2TZFJhIpQfU/fSh6dPmU+O0cpTVUr0l1KnqX4boLr2gjtEftPGCYnjEYDLM9ntcyxDJNGVsimxDRbCpkxSubEwRBtQiNTTOEQmuc0eYPtmhiGx8nsCaPRGXWpkbVgPJxjWSX7/f1xiGuhKJd0VcEontJrxeu7z7HjmGhso7qep0/f4+JkTLbN8ZwJk9mIxWKJlj3n8zFVntFUHZ3tYZsJjmmQF/ds9zsGoYcXOkDNcpsRhUN0tGf4zMJcD7G0iex6dluJUsdg6PHNwBBHG4vruoyGYzw3QCnBm9cL1usDlmWjtYnWD61SD98XRcdB1bYF69WB7FBhWr+xxgAPflZF3x1JEqZp8o0z9ptCArRg/iRi8LsZr16+YjI+Odb0CpuqythuVgyTOX2vef9nxxDkX77/v3Dx+BQpPc5GL7Ath3R3je4c8uzY+rdYv8a0LLq+p9eKqtnQ9xW22xF4Q6RsWG/uOKSaQTLFMm2EMNjnS6qyJfBtXK9nu9tj2QrXdbh5+wpbDIlHJzx99oSmTtlsrylriRIZ4+EZqzojzVfsNwU//PjHfP+HL6iNPVpq0u0OE4dBNOeTj3+IafXoDkbDkMg0qfOGtDqw2V0xTmZYtodtOyhdUJV7PM9jMHBIN2u2+xapDLrW4v7qlk23YrupWG/eMhyPaTuTk+kZr15/jmVoxrNTBmMX2Sk6UeH4DUk0ZZDEXN9+yeJ+zenFGb2G4eiM1a5gMr9gNA745V+9JLQ9+t4gSSLKomc2HbFerliu71mu7kFEmMLGNjS7usDFwXBitqsdqArfDRhGFoHlMJnO+frrWwajgLrI8GyDXrZo1bFeZ+zSDNeaMRrZ+M4Qgeb2Zs+LD064X37FatFTVQb7dY4lH/OjH/0+7bYmcAXr3YpWjvjO9z9ku98h2wjLM0irDY4vSWKPpur48KMTdtsDd/fXTCYRo8k50+ETpE5JD9cMwlN812J9n4ELkHsAACAASURBVDGIAoI44Pb2iqY28SPIih2GDRePHhFHE67vbogiizB0sZyOItdYYk4y7tnuSlrZYgcGw8GIyXhAW5l4vqSqX+MKhx//+O/99R9U/8E//MlPZN0RuHMsu+Xt1RuiaMbsdMhysSMvlwTuhHSjqCtJ3wqqDISQRMGYrCnZ7VNk6yMf1qpd09I3PV3bcHO/I/SHjIcjbNOnzl0EIXVbkO72mOoR3/nOe+zSDZPRkF4qlHGgrFr+4qevyOstyURy825HUzUoU+OEMdvNmsSZ01UBw3lNvm9YXGsCR7PZQ7bJodSUdUu21eT7HMtpeHv9Ctu1uLi84O31O/JsTxSH6N5muypp2p6+t7Ds40PYi2LWq8MD7LtF6Y7h0KesFI7tUFdg2wIv7PE8j9lkAmbNIS3w7JBw6GBrh4vZnEeXQ6ygZ5NtqbKWrjwmCAeD+JhOrgtcx2d/yOlVheNofOuM7XaDMBoMx6SRHTfXG3Rv8/gyoGtiEA1YgiDpUFRUuSL2xhiGwEtMtHKxLAm9hykEq1XKepOhhEkpb+m6msuLJ8TO4IgbkTWmX1K1krPTM4pSIjuFbzkMBh52lLDPapqsIgrOqdOKpllR1xmzeESWWYxGCY+nCaZh0/UWXuQhtMFitSEehOzXawbTAeFwgOG6rNOM2WyAoxIWNyviyMP1h/ihx2R4ztnFBfF0wtublxhdgGuWnJyPsdyE7fZAW3eYIsYyrYebd4cfKmzLOPY0S4P17p6sqhnOHxENx5RdgzQU2u4p6gNFkRO4NkhN5FjErkcpaw5VRtNVCKvDjx2avsZxI4aD4fEQoAWW52JYBtk+R0gDx7Ko2yPr0tAmgzCh7wz+bvdfAPBH7n9PLws6WdF3AqVbZFfSVD3P+B4JMzppofU3ieaHEMo3rUAPD2KNRimBMDWm3dEjuTK+pHH2mBiYdHRtTVU1aO1StzVCJ8RBhGeBYxi0zZ53V2+pqgqtQDYm8/opbj44Nh+J3179H99pzbc4IPj/qXuTX+uyND/r2Wvtvj3t7e/XRURGREZmVlapXCapwh4YBtgSEwYgGqn+CCYwyhEg7IEFDMBiAraQLDFANBOYmU4WltNV5czKjIzma+53m9Of3XdrLQbni8ziPygP7+RM7tp7v+t9f+/zKKSEQq4oxQZFT5KGjL1gqG3mi4Q0cwj8gOuLG2zpcXlxRRR5VNURY8B1Qj7+3nOub5bsdkewRpKpwJI1h0NOmddI6TBJzxl7gScmTOMFRja044qqWdE0hrZqSIIZjjxjvdoydAO2senLEav30EqDbdMpxSY/UDUDQRSTZDGhH+LbKWOjiIPwhP8p15jRYIsES8KgOqriSL4r6WuB57iEYUjkxWTxBD0aVqtH9vmO/XHDJEv5/qvP0aNm9VTw7u2OUVm8ePUx8+VzAs/HcyyuL6+J3Ji2rtnlGxqrJ55f4lgJDDUYi0X2EWn4CdU4UnQFhpGi3FIUOaaXLGcToiDj8X7HZrtC2iNNXSDHhkBaMEIQpEzmExazKXHmMnQN0kTsV0+czy7wA8nj+o62HZikZ0RhQtNWdN1IZ2qSQLOMMyqVY0TH5fUzZvOIqqzQtiAJZxzLNUNQYVxY1F9QNyXH48jQg2UZrO8W86zTJWjUmiR1SDLBsdjzq189oLWNkPK0fCU0CPOhoyo4u4y5vA7p+xalYLMqfstJFeI32Vc1jgyjRuu/uO3/2+mAFJLlCx/9/DVns5dYUnH//gGJjaFiVBVZkpD4CTf/+G8B8I+v/i6DUmihiN2MOG4piy1JNGF5Fp6aNJZNnld0XUsUzOj6CulYDOMeow19P+B7KWEw4+HxK4zy0QaUchDCwRY+Vd5jCY0UHmfLhAALywpwQpu2a8jzkmiaUDUd2WKGbztMF9f8jT/8I/7aT/5VgthH07FMfS6uFjAajoc9i/mcYag5HlfYloOlJdu7Ry7OZ9wdv8JxPSztsMsPJKlFXtyzvVfYoaKtBj65/QHb9Z6rF7c87tfYoWB9f8/NizMuri9oGnAsj9liwbvNl9R1z/nlc+JMsN00JMkZF5eXtF2FLSW7zRbPn/Pp55/w9t07WtVSNmum6QW6HQkch9XmPc9vXpAf39J1msDP8KOYMHZhNLx/emIeXxDPQrBaoijl17/8p3z56/f8zb/1NymKNQ/7d8TTG6oqx3NiEA2hk9AcB6rqyP7Qcvvshn7cc9zBi9vnHLeay6s5tgUvLn9AcegJ3HOsMWMRf0a+adisj0id8OrlF5yfzRj6PXU54rkebT9y8+wFi3nM5mlNEMT0rUYbya++fMNHH3+f2QIe3m6wTcLFRYyQirqp6HsLL3RO5r7eIoxipCOomhbHTijrguX8iqfVI44TAT1v393j+zYCnygJUWbEkj3r/SOWEMynN6RZzOGwxfdsfNelLgr+6A//+C9/oXq3/vOfJtE541AxmpzpYgFWwLPLjxBK8P7xkcXigrKosGixRhuJYTq5phtqECND3xFEEIYh0/SctrZwnAHP9elajySLGJVGaI+7N+9wAptvXv+KF88+xrYDtKhwnAjNyMsXP2K3bajKjq7VHDtxsq+UJYfiiHAtbl64PL2t2W5y6r5E95pG9dhWhOk0tgmIspTADxkbG6Ndmq7n/e5b3t8fMJbgzZt77u8fMKZC9QHjCI1pcOOY3gz4gYdlxOkg2jZB4FG3p8UoS0LguniOw3EoSOOQ/a5g7GtsbAZTEXkBE5Gg9oo0jOmajkLl6KGn6TX1TmI7itl5QlsOeHZMmoTMpymIhkkWMZv6jJ2FF1oUZU03Sop9yXJ5jjSCoXe4e3pLnMb4UcTm6YjuFNPsGWmgKdsVVS3Ii4fTi3yMKCvJoTkQTz2qqiTPnxhVj+NNefP6Hc8/+phNewpdXy4veH//HmFLJjOXNEpwvBQ/iFm/P2C6Hj+QSNcgjKDGYeFPebvd8PEnKZ5t0beKbvSYzmIeVys6q6XvO9I0oW0VfuDSo1BWw9l0zuvXr4kmDsFUUDclz68+YlcXIBwe39yzO6wJ05ir6zMOm5yiOVC2HcIOGHQPQpClCUPXYpsey8RMpkucJGBgpO168n3B090D79++Jn96y2bziG4ViZ+SRAnn8wkysNHaodcdUoBj26hRo7RFEKQkQYRqGqqqxijFJI7xpEPf1ji+xaA7mn7AKHXCgRlBVSv+Pes0+v/vxv8YrW36bkCP0LenHKznGJ7rHxKMS/pBAKds3W94plp9GLh/x40ErUZcDwLfQQDfqj/noB8JIo/97ojBEAYZ/VAznS5YLm/o2paz2QWz2ZRRdihboUabodN03ciFeUk4TjlRvf6CYYjv8FS/XagyCpI04rPlp2y7J3q/YZrM0f2JRuA4I6Hvcn52ThiGYDTDUNG2R4RwmU4WJElE6J8YyUJ6IAzDWGPLhL7xcO0YWziYUVIXBXU+EPgBNgPFcQVex2Jyha4cTG+R2iFd3TEMLpG7wCYkmyRoXJp6QMoaVxqGQaK0xSSLcRyHsukYJaTTCDMIulyRTQOimUDrGq0EXXHiQk8XZywnCxxs2q6l7QosWpp6RVGtwLG5vv4UScRxM3Bz/hkvn9+SJALPSUjjKdKuiQIbxwvActG9IT8+sozOSeWcOPDwAp+2F0yCJdM0w5aGxI1wjEccz2nqPT5wPr/gkD+x3d5xfX5OHE9PnngnRtgTlhfPybKIphkxOkL1mraXhFFANyqqcYefOdiWje5PprtJuKBpa/pREUUZWvX0bU3buPiWwE5tqqPAYopn+4ymZLerCfwZostYNp+itGK/rWkqjWWfzg3Wd+YqhRQnlar0Sl5/e8dhK7Cle/pAWWCdGHRIXGxbsLz0EU6D0ZLIz7i/W2O09eECZf3W6Go01gd7m/gwleA0DzjlWoXF8pVL+/xLdCd42t9haJkkMdIfsQKB600Zdy3P/+SUUX371/43qrJA9Q2YmKYrKdUKoTJ8L2KgwdIL0BIpJNPpGVVeo3qB58b4QUjfjxyPB/aHB6SUROmM/aFBjT7nF1PiJMHzAnzfpyhLdnmBIULKjK7ffcjCVry4+SHZPOT8PKWpn8hil0255eunf8TrN39G6LsUzR5jaarqjt3qcFp0VIZsnuKKmOUkxYgeYw1s8oaz82smydmp46qg6WqaocK3M27OPmG0KraHHbZzys7HyZTdcY/rF1g6JAgC8I58+/Y9QZCiUVRdS9Vo4ol7QrmZkc26YLGcMJvPKLsDv/jnf4JrGQa7Z7aYkW92HKoaZbUc9itcx8GPE/I852o24+7NI+0o8aMU3/GwbIVqHDw8Hp6eGJXDy5c3RJGPsQxl3qCVwpYuZV6zX28Yy5DICxjGFncu+f6n5zhyQaVHhnLk+dWnROGA17cYa8KoPG6WN7jCwfUjbMdj+7RhtX2i6wQysAhsQVk1hLbHZJHSdj1Kax7uHhG+Q1XlqF5xfXtF6MXIPqKqNX4I692e3hx4vC/BUoy6wtIeWg4I6fO0/oY0usbQ0/Y54ygwaPKyIssWJGmMsTpsKfF9h7bSbPcP3F6/IPGeEcQd949vKKua2XyJ1gnNoPhXfvIvQEf1//i//tefxvEt8+USP0jZryviMKQoKuqxJvIEtq2xHcVuU3K2WNANLfEkpB0MVX0gnYSo0WE292lrFy+AYYD5YokXx2hLnHAy0kEpfTpUo01TdTT9Aa0N79/tmU2X7A9rDoct++0WowWCiiZv0INkMplzLCt++ctvCLwzzi+nGASqtRAyYpQ+aRaRxTPaVlNV4Hkxu/yRffmINiNhMGW9uafMK4QOcGybKm+Q0pBkMQ+PDyg1EAUhq4cDgzYEfohSI1WhGHpN1eQnqoHv0jQFjiNJTMw4tFj+yCINGZCI1CZLDcuzC6q9pOsaAtunaWrmMxffjziWFce+oB8UN89vedhtWV66LNKEIIi5vp6w3W8ZlEcSTllcLPFdj81+D9ZANbpYdByKFdM04Cz9mDBMSeIpdZ3QDz1RJtBCcsz35GWJF2ikp/j6zVdIV5DFCe/fFLx98y37qmZTrfBlhK0llhCE0iPxE7A7wsDjVz/7Uy6XMR99sWAcBZHr8fWv3nP9/IKz6BlGnZSF4+ijLcHjeodSPdvHHWkYQacZK4W0XPbrnsfNt3Sqo2gGOtOC8PCsKS4Wnpvx5de/pKmOqF7iRQ5NU2Hj40gfLSQMA7bq0X2HKx1c4ZwWYVTP2FkYa2RoKpqiJ3Z9XD3guZLQiRl6iTV6iM4lrxr2xUnZWDU9VdPSNiPLxQSJIkuWDIOFUg3j0CK0R5JNCKMYy3LY7TYnVNSgqNsSDEjh0dQjSim6vuaPnf8IgH+g/1OGTjIqQdcpfBkwdIZuaHhmviDhDDOeRp+W+C1g36A5mao+OM61QWuF652YpUop7tSX7LoVZVWjtcERCZYlcGwXYbmUxRrXa5hMQ/rO5nF1wPUCptMZWBaKnFv5CclwydD//98Xv2mumt/+rbUmy2ImE5929sCRPVHks1imLOcTwlCQxDHGKKI4ZLm4ZNQFmhbHjhCWg3QajNXT9R11v0NbOecXlywnHzFNF9zeXtEW8HCXM59mXF5c4nsBgR8TeYvTIkreIrRDms5xbU3Tb3DdlNh5RujGBL6kbSos44NRVGXFfHHN1fUzgiClaRuKsiIKfKzRIJTk6vKGbDHncfNE29dIy2G/bvHEjHl2yXIao80pD6uURVE94rs2vh1gG0ngJAzDSBS6XF0uiSKbLHBxhECbnvVqTd85xJNLjIF0NsV2JK4VcX09xQiLYbAo84pssWB5fc5iuSAOBG17ZDG/IEsSolASBAnG8plMz+l6aPoRI8EymjRc4jkxVX4gTZc0DTw+vmUxu+BimhK6MIwDi8U557MlvuOhFMwnF0g94EY2aJu6bggWLtk0xvY0bdkTxil5caBoNijTkM1s2qFAHSTz8mOGfmS/LyjLU87ut5aq06XHwmKShcznMfd3FVVpTlQAS2BZEoSFkBrQ+J7HsxczlG4Z+p7AD1g95XTdiSRw6sB+qFSNQUr7t8+O+Y7y9gG3JgT+ZKBcfsPi7BIn6Ll47rF9GsnLks6M1PuGbdvxo1+c1Mdv/+B/wvcNQgbYns2oO6oD+F7GZl+RZde4zshu9xW96jFMcWUAhLRdQVO1jL1DkkrSiWS9OjDLPubm+hI/tCjylkl2wSS55HDconSP7bhYBl6+uuXd+/f4foLSA74XMpkErA5bXDfgWO15XN9R5AWpH1AcHjke1gR2zHb3eOJKexlhHFHkG7TuGQdDIxWq65Ad7Ks958tbVo8rLDvl8uwZD0+/Zj67JAhdvn79JeeX10RRTFGWbNY7fvDD36OqV7hOhGJgtd4RxyFoG9t2wW5A24RhxHbV8/L5F/jhSQCkhoiPPpkBHW++ecNseU0UXhN6GZNzh4eHDYHj0bctT08Df/UP/jpds2HULQMWnj1n6I6UR03bW2RZxDQSBImNsVze//oONxzYbguiMODNt69ZZK9YzK5wpU06tdnuGj79KxZltWW7ypjOUqpNyc2zS75580SDR94c6CvJy+c3BEHM0HSkacvd/Ttml+fYdGB6du9L5rOYvm85FDZjt2G7rnj28py2a3l3/55+l/LiPOP+viH2HbR7ZHER8fCwBstQVoLf+/0fcywOWCJG6xE/lGBpjruT9jfwQ/xQURaGZzcLNqscKRRp4tPXI83RIGWPLQc0A91YsNttkSIkigKapsN2DJYR/OSv/Jt/+QvV//3//Ac/fXja8NXrP+fx6TW+JzFa8bjdgGPT1xZ9ZxNHGcVxxA88tseSQ53jRhF9V2PwsSyHui3peri6lRh98nXvd/dI4dOWPb7n4dgxrfIp2hbjlLiOx+op54vPf8R+v0ebiu16TxRF9F2P5wQMvQHjUzeapoWxt5Am5P3bByw60sWcx23B8VhSN3seVluqpqdrjh82nwcsAUEQUhw6VK/xHR+tR2xho80pd1aVFUWec352RpEXFHlHkiSMg0GrHmN6lGrwfEk3aIxQWL2Dbwuk5xC5EVXZcP3sgmK/pbQ6ruIpjpRIq+L2+ob3d2twWibTlHLoqasWjxQnVhybmn7UCM/CcnzCOMTzYpqmoqdGjQODJVg/7GmVoaqPWG7I2cJjtCReKMm8M569umR3aAmCgMCvcewES7gYnZDEIePQMQyKfhiJggvUYNjudgSRR9N3KLtkmvnocUA6PfNlhBtMONQ5USKYZTPOX0QU9oY4TJDDGinhB7/zfZLZAj/2adqRvlFYtk1Z19R1TVOciAZN1VGVPclkCl5A1XZYyqdvFGHgYayRoigx2Ax9Tz8MODLAsT0sqdnvTj755XxGbynW6ycsDPP5FV0LXTugzEDX1wxYtHlFLD18L2AUMHKyA2XpCYMyaMNskpDGGUrbBLGLYqA6HLFd6JoGM0iECMjS6ekjd9rYIAxdlBlo2pLDrsSzPYaxx4weruOCJRDCZdQag+aP7f8QgL/f/yeo1mFoLaTloYVC2B2WsXll/YBQT9DKwxJ/MVsnT+N+rT90Nw2KEYRASINB0cqCB/dXNNYRiSTLMpRpUVaO72bE/hyLkWHoqNuTDczInjgTOPZpYaXtK17YPyIdn1NX42+zqb9JAFh/wfJzKlTTNGE6CzlEbzGTAt+XTKcp58uEJIoZlCKdKRbnLm3Xo7VB2CPShouzW7Ispu4fqetTrKLXFY7t4wjJOHQ4Muby/BnpZCQIRqbTFGMUceoRxTFD3zCdJNiWRzdaZMkMgY1GMJlOWSxnpOmUqm1p1R7L1fRjTVnnbLYHxtFiVCNSDKRhxNj0jEODdB3qquLu6zfsHo+YNsTXKYGwQEAynRKHE8qmJpkKZsuYsjAc8466rwjjEKSN6WEWZThiRFgeT+ucf/7P/pTN4/H0DI0jyyjh5e1zJuGMMI1YXp3Yzm/e/hyPOdl0ybPLK2ZehGLEc12GamCaPeNs/gzP87HkKdt/PO4QwUiRFyyzC24vz3lav6VqnhBOQ9d3XJ6d8fzFFcbUCHMy1V1m10QEYAuObcUk9YhsyfzimiQ+p2nes9r8mn4Y6IxNVY+gPIIgwJKavq+puwfKusbrZ2THK0ZVs9tVNPWHc2pOxakQBrSFZU4FxnyR8ubbI10Htu2czpc8jf6FJcFIssxlcW4zjCOu49C2NXUzkh97bOd0ecN811kVJ4ycAaX1B1LGby9bQlhkV4LD8udoW9OqnK56RDcRxnLId0eG1uCmc7740xP/+Gev/uGHTHhA13c4UhJHUzwnxFgN46gxZsD3PITtEKeXJKFHGs/wvJh+6Hh2+zF1Ieg7WCwXTNIpd28f6ZqG6TRju1nTd4bLiyueVu9wxQVJ7J++UzKiyHuGYSBLE4pyxzBIzCh58+7nuKHHJLlAmpi+HWhLj9d3X7E5FghxRpy43L35iixYMpumCBmCDAllhC1i7DRAGJ+xKhgGwdXZ5cnW5k+xbM2xfMM337xj7BOyGcxmGfv9gaJacXY2I4pSLMtCCpu22xIELkk6wXVmDGNDXY4kmeYXP/9zAi9htfs1iX/FdJ5iBovppcfj03uyJKNocmazjMXkDEuW1DUEvs8knZFMArbbgTBICRzN4PUYe2RsNrjy/BRX6xXDeGCSLfG9iLI4MknOubt7x83NBS9eXvD+/XvyWiFdxeFeslsXXD2fUFcKISLe3/+cKIqYJilK2UzSmNW7d/SVzctXZ+TrA2PvcXMWoAeXaXaGFbe8e3PH/qj46Hs3HDdP/PLhW7zIYtzXyCTg+3/1x2zeP/Hs+RIZKYqiZhxDht4gHDgWe4q8o+rWSKcjP7Ys59e8u7sn+EDkSeLZaX+lrPn8e39Akvj87J98yacf/UtItyAv9kSpS9dqhNDE/jnHvOSjT26pyoHF4oS//P0f/xt/+QvVv/cP/7OfNn3H4VBQVjuev3zFV1+/I0wivv76kferew77gtVuRzd05HVO3XcMFhyrAs+x8dwARUVdtwSB5NnNBdNJxuPDE0FgU9UDbSMRBg75kbwckbbBsR32mxxJjO0MGHowku26oayORH5Mq+zTwolt09QNQ9eTxhm7XU5V9uRFyz7vORwPDH1B22pGFeL5EWhDbzosIbBtl67t0aNmks6oioZJkiJsg5QnsL8xDn03EsYBVVVhkCil6RvD0LaMQ41WPWmyoB8kbV8SCclxKIkTh5urK/JdiSMVSlTEto2rE5xgIE4Nu12LG4T4oSBwZ2hl01OwmCV0qmA6neEwJS+OHI8C6XYMWtB0NXXbkWYzposFx+LAfD7HMi7SA9UOmEAgvSn5fsOgJRrDIrlgv8tJ0ynbpwbXdtFmwHGhyHOKfc+oFHVVU3QlQo6o3ma3XWOGnnjq0FYO67wkXNoc9u9xjeZ7r36HN29z8rxgGS3o6p6zzzXTiwn/9M/+lL7dUA8NbXMgz2vKqmK7P2DZLrbroDD0SrA57iirA7aIEXiUTYe0Q5q2wWLAGAvdtwzDiBodJtmE7XpD3RiqeoO0LPpecKwrGq2o6gFpexR1jmUUoeXg25rUdbFsjzAMKJoN+dgiZYTreUgMw9DxvVfPTviX0GEwNXWnsJRhNolBC1R/atREnoeNROhTCF+Zkd3u5EQ3RuO4Hk07EMUuaZqhFCAUlrBwXMm/a07LVP+9/s9xHYHvCoRQaANR4uI4Lh/ZnxHpBUq5H6ipp4+rEPKEjvvATjXoE5dSjXieJggc/h/+R+6tXyGEjWvbaBS9Bq0FtnD5/d/9XeazkKpucIOAySzDdjWjHnBtj7PFAqVdUrUkGie0pUYp6zdmn1POD/6CwB2tNa7rEccuT/KXjPGexTIh9AOwwPZGwtQQpVA2GwZVE8YWUeoTJZLjIWcYGoJYIaRL26gTnq7rEBZo3dN2BePQ0/UFrm8z6JqiOiIciW1rYj/GtyNG1dGORyYznyyaIx2f7CzAkgNN07A8m3B+NcHok4ve90a6tmSzW7Hfr2nrgrZqaaqa/W7NerNH4pClM8LwOZaOcAOH7332GZ988TGWK6nrDjUqLGMReUuS+BLhutRtR10oppM5N8+eETgu5bZEjBnXzy5ZLDI+ffUZn398y8vrSxIg39yD6XHoaMoGIRxe3N4wS+fYqmHsKvbbHNMZZukcUAxNSyglXXmAqkDVOXHsY5SmrWsS2+f+7T1N3yBcwbffvkX3PufzBX274bjfE4Upg1B4XohleRx2T0SBZJ4t0HnD2/sv+ebhLc3QMqpTzk5KB1eE2J7Bkj390NJ2FUFkcdgpMuuCaXGNViNF3tNUAmlbvylUT+fopFT1AwvhjLx/V6PNqYt6ymV/l021sYVkMgNkRd9ZuK5kGFoEPpunEiE/hFSMOC0bfnhGvls8FEJywrudfltKyUc/vGDxE41lejaPayLrnDSdcffwLbv9mo8+/j6J7/Pyn5wyqv/o/L8mmyxpWsFkEhAHLru8xVIDgecgbY9OtajR4/rqe/iew9dffwVG0rQ1V1cXbFYN11fPiFMbNdpIaVNXFbPpnPfvn5jNloSxw9hr9rsn5ouM2SJkHDSOK6mbI59+9gm+b9N3isAR5IeS+TKgbhr2hxKlJEZI4uAGyxvpGrhYvODmckHoTEijlOViwurpHZ7rcSxyLD/Fd23C0SYNDUHq8e7pKxwZkCYxTVNjWS6WNMTRhLOLjLvHX3Exf4nnLHFtn74JcO2YNEyJw4y3r9+w2TYEYYDrekwmEcfDljhK6Tub6+cpj49rVpuCLJ2iURTVlkl6QTfu+erLP6OrNH/4R3/E9nCPZSLCxOVYFGhLsd6/JQgiCr3my2/+Gbe3H58u4K5F17Zk048JAxc3gN3+yGx+TppkRLHH3f17vIBT9GJVU2wcFosZq+033D98xeXyc6KkZxgbHLMgndusNnva4YD2QPWv8dYHEmeJu3AZdEBXPNGMHlJYJAAAIABJREFU8OLFNde3Ft+8XuGQEcchUeRzs/wcz1IMTQ1qyy++/Ia6cXFcm6Yv8III2+vY7nfsdkfSScbZ8oyuFTw8PPDsxRmDqhlHxZt33/L81YTjvqIba+7Xr8nre6R1zu/83qf84ss/pR97luk5u1WBFB5arsmLPUkaUdUHmmbkJ7//L0BH9e/+/b/z07u7LevHA1J67A41m/xAXh55vH+iHTTZJKOpB5quRCkYaFGjPhlbwpiqrvCd0z//5jph6CqCoGf3OBBkCzpV4XkCSwmEcRFaE/kCMWgcLwFgu1+jBklZ51jGp656glhStyPDMGKhsEyPNh3tcELOzC6W9AaKfIVr2RjhYHsBruVRHEqUW2BGi6EfcV2XvlNMJhG2sOnqEZuQfmzxfAfpOigN2SSlHzps6RJGMYFvURctceSdrEVKn4w4gY+QPXHs0DcnVNd+sydywHVsLp9dMp/M8FyJjt+zy0u0pXnx+Q3n2S0uLUOX0+Bw7LckgUPixji+4ulhQ+oFHKsdm2NNrzSBG9COhuKYU3VHFtMZTSEpe4UeejpheHjImUQ27+7fcyxL6ibnUDWkaYAee5RRHMoSN3Jp6gbdw/7YksSS/bYlDiYEzgV1vcHqTxiuVpfs1ZGH1YGrs4TEDmnLlqeHHbHnME1u6XrBOi9x1QTLEnRdhR1qhrrh6XGHsCV5U2Ok/LDwYKH1iWXZ65rYj7C0pGlPFAStNb7rMw4DerDQeiQMIizjcjzuqJqKti8IvZC+URx2JY4dg/Ho2pamzllMEnwkl7HDLm8ptKLtCyylcW0fPWrMaGECfSr8BkOvDJ1q8K0YU3sIDTgexjYYORJPEno1sNmtsG2PvjtxIZU6Zd7armMYOsLQJUkD2q7EWB2WbQCfUfX8+5wK1f/B+y9IUp8wsnGkxndtAt9lt2+5tT4nlRfo8VQPnj6wp3HmOA6YDypJozVogSU02cLBCyRf9X/G6PUnbJjuQULTNjiOjeO2vHvzNVX9RJRCNzYYesLIJokynl19jzSaMo6aO/MzvCbEOs7QWpy6uXBCAGGh+Y5t+R2qymKxTGmXd8ipQEjFZvvEIT+irJ5scobrhtRdTZacEUcR/ZDTNg19r1BKo4cTlF0Ig8Sl2JcIIl69+l0uLy8ZVE4/foDvWyBtQc+Bvm+wtM2gOjQG24mwLJskDOmHmnf3bxk7iyiISdMYV4aI0ccaLMzY0fcVUiomWYgrXOIwIQgSbDsgdX3kOKIcj8ubz5hN5/QohB9imQFBixQSV3r0dUPXHplNp7i2x9jVCBr2xycOuydcqVg9Fvz8T14jGDk7nxBFMeXTjsP6hNDZ7N6w3214+PYN9WZPt65ojj1dp5mlKQwldduhHIf99gG3b4gcB9SAqgYYLBZJihlGqkPNi+sXIAyq25BFEVPnnIvpAuHV7MsHuk7x2e3nnE9mrLePbIuSvm3I7JNMQYQJgQVj3VOMHU5g4fsZFxcfUeYVx33Oze1z+r6iKA6MKqfrCxxryUScE+1uTia6puOwG7BtB23Mb1CqcCooPV8DA+unAdt1T0t6v6FdnCIAvie5uQ2x7R7fi0niFNfxGEd4eio+YNT4MAH4MIkwGinlB+vfd93U0+jftm1uPpnRnr/j6e5IYodUrUUz5Eg02TTCD33GAT7+2SmjOv5b/wuWu0NZPenEUOUdvrfg4uyWrtMkkyWTecJut6ZvLQ6HHCkHLi4XtO0RKV08J+bVR6fFHmMsuqFhMbvEaJu6rvn4o1cnpnZr8F0NYiRN5tguVPWewz5nki3Y7h7RCkLPo6pqhPTZbTdUdcN0EbN6WpOEIVpAXQ5876NPMaLFDUP8NKOnZLXZ4Nge9dAwCoM3Nni95vz5FetjxWp7JHWnSOkymcw5HFoury7wQpe8KOibhFfPbnj77Z6hbxj6lufPnuO6A3dvDjx/ccn++Ihl+dzevqBptxhtuLpc8Lh+w9dfvwVLEKYRTaXox5Isi3n37i1JeM3HL17wuPoKxckot1037Ksdm23BZOrQjRVFNRJJn2P9a8JFxeZdy48+e0nRtNRdyWr7nqo+cnZ+g6bgcfXIdD7Hc1Ms24ax4uHuntZ6JAh83PGM2TRhu9mhjctYa4Isw7I2zNOI9fYeP7jg/vGJm8+u+eEXDvXjrzm7uOWzLyIWFCz1iiha0642eFmGndhQQV+DY0d4jqFRhrzqmV8IhlExDiOHY44fajwnJckEkgR0TFkewOq5OH+G4xoO2xbHa3DdgHx/ZHfYo5TBDzvCqOeXf/4ll8sv+PijS3TbMfSCdJKgKGmqiHbYIx1Dntf89Z/8O3/5C9W//d/87Z82uWJUBdKxef+4YtAtbWNO43HTIrSkPLbEsUdRDlgEmD7EkxFBNEHrgShMmM9immogSz3GoUcKnziKyIuKaZbgSR8pNHEqMVowNAPClhz3ObYdEAQZZVEy6gELyaAatBIMfYfneTieh7QdLMfDiSXG9lBtSRi7OLYg9DWjHvFjQRicDFfogTjJqMqWMIhwHMPYWLRNz/n5/PQylFAPPbZzgvUHfsg4WrieS5zGWFLheQbP8wgCn7OzFMe2aJuOShXcpAtQHn0nmM0krz67xfUT1sWAp2tGp0KbCNcVeLMAMWY0zQrhCe73j/gOhGLOYmlQgwAjGO2GbjBstg2e6xM4DmXV0pYj3TgyNicpQt5VWGOE4zhUxYbEPSdvStxA8LB/S0fLftehhpGyaci7A1WrqWrFZJLRDIJFvKDaG5IkZdAVx+LID7/3Ixgc1rs1aRrw5pcDF9cRQ1siMVSFQcua0SiklLgyYtwPbNYrsAbq2mJsbGzXpW1b+nGk7npsZWMD5bHmLJtQ1T1xMKGpaqq2oB1aPNdhPpnS1gW+jJEG0jTDKIMxBRqDF2ZEvsfqmNO3GqsXZPGE8+mM2+mUwFiYYaQYDXebFVI6lMPIIAYieVqk6NoSraCuDJNkwmG/pWtGfD/AyA6lGywhKcrjidOITVV21HVFEieMI4yqxegBhEJjYTsSbQbUcLLlDLrDWKdRvetb/Nv9fwDA/zz9rxh1SxhILMsljBJGrWnamo/lFwTjAm2808jT4jeIKKV6jFGnb7AxDErjRZIkszFaUyzWVHZO1/V4rsf4QctrixBtKsLQp2k0Snn4XkgUSfwgYj65JnJdVo/3FHVOEEZcDN9H7VLG8cPSFN91Uc2J4QpYlvxgqALX03TxijEcyauc/XFN1TSEUcJ0esZ0eoXvph9QQSffNFhcXFwSBROU6tGmou13eJ5kPjljsbhiUAOrzRssy7CYXxGENrbX4vkebV9jCwtXRjiOS5bdoIxml9+TxCnIASeAMAoJoxgkvHv/GjWO6NFw3HagbELXQ/Wapm4RwkJIi1H1uJbN1cWCYGLI80cs0eB5p3pdDSP74xHH9Tg/n1I2K94/3rPb5UijCG04HB4BC1Uptk8FTphy+3LOPA3YH9bUbYOHYFe8Y3tYcXe3pukVYeCSJALhuxR9x7dfveXtt2sWyTnfe3mDkTWb94/s3h8IkxlJOkUbkFozqBHbyzg7v0VbA2O949nVhCiNKPKKy8spcRLjEXE1veBydsnhcU3dWQSBQ3cocFyXu9Udpg95ef191rsV7w8HdtsV+/0KiYXjBezLDWGQ4nku282WpikwSuPZGYnISOsLQjul7zWrp+pDlOXDdj6cOp0WxHGEbbvstjXSPV3MvjOynTqqFmni8/z5GX03EMcJs9mMpq4Zes1mXaLVqRIVljgVwx/yqFLKD6rh02+ZD7B/YQniC8Nq8v9S1zV5vaUfFF2vuF3eEJoIlE+6mHHzf/9rAPzs+38HI9e8+tTHj1qKvU9bjWjt0eoG6TmMY4crDK7nEyYxURCwemxIUx/bsbEdl7at2W+PTBceaZpQHAswhlevPsaIlv2uIEtCfNcgLBdbTijyFq0FVbWma3qeXX9BWbdYRvK0+5a2qzi/TLB0QJb6FNucV88znj+LeXnTk9iPRG5Nld/xdN9w93RHq3pM61LXDTjw489/wNPTmsYRbDZHVDOyP+a8e90wW0xwo4qH94/kh57zs3M8O6RvcrqhYTrPWCwnvP7mNWqQJFOP0drTNi2eF2Csnof7d3z+yfcZh45j9YS0Heq2II6fcX6W8fj0jqZuuTh7hlIDt8uPsBj5+S++ZjaZcXW15G71LXUhuH12yfHQoEfJcXUgsGe0fcHvfP9fptrXvPumJrh4y2ZXsJhd8fT0iEWE40ke3m/x45E3rx8xWhF7ktniFsu4XF9eMD1LqI+Ki+WUWTpl2z4hR4GrJKqzSG0XiU3rXaDGr5n5d7C9Y3/fEk8/pV89sX/3wKq84yYz1G1Kdv6S9XGDkjWv33xNnF5w/YMzVvff8rj6iixbMp3F7A5fc9xZdO2B5ewc15OMqsf3JfmhZrV+oO33CCGw7Qg1HvHcmGEY8d2QbngLQ8jt5ccc9xsO25HpwuPX3/xzpOOxP+xPpj/nill2ye//+F//y1+o/r3/9r/8qet4hImN57uAg9YCpWyaxiJLffK8JYxjpGdT9RXKMoxqxPMkwjEIbOqmxtKS+/sdjjdQli5qTKh2PbZwcCT4rkXTtDw+bnHcjCAIWT+tcJ0MIQyjbtnvWuygY9Qd0+z8w81YIjwbJS16NZImF9gep23WpqGnIgim6EGcuo+Rh6mBriWIQ5qmZTqZYOFg1IAtI4LIR+kGaQssR9CMI8eiQFgGW3rYtsfusEI6CXVTM5rTGM4SFqNqiaKEvtPU1UiQWbx6NqFqO9wkIopn/PL1L6iqHc44ULaSmxfPMcPIVw/39F2J9Gsedh1tLThLbnHsJW/ertiuB3ZHxbHd4bkxZ4uUvjB0JVijoCxPrvuurUEr+qGlKVqkZ+NaAWpUDMrG0g71UBMFS9QgOG57FDtcz8b3YrpW0XQ10+mU1I/Y7lecnc9Yrx9BD/zg++esVjUvbz1+78dXfO+zBVWZ0xbw/PkljpOxPRz44kcX+LFk0AOubwjdCfSSfmwYhCRNp+zWOd0wYHEi7UghqZoTAHxoDIHtAwNFn2M5LmawEGrAmBpPhswnM2zpEIYhw1idNpnDFIGF39nMg4SbsxlniwBttdRtx+M+581my1GN9KNBdz29HulHjR5H2rpkHBRdb+i0wrHBkT0STb4/4HgCMwhU0xF74akY1jau9BjaAT0MZGnMMNYIx8K2HYLIIwziE6Tf0oTBlGQS/X/UvUmPZWmep/W875nHO9q10d3cw2PMjKyszKLoLNGAmg1ISLBqiQZafAVWiGVKtWjRgpZoqaVGghaiV4UQQgIWbBgKSiWQiuysqsjMiPBwD3c3t/HOZz7nHVhci8jiG1TfhW1MMplkx875n//7+z0PbV8ThQdO7r/TP7b+5R9SNwZpPPqhZVtusAIWi5yPnJ/gtwvAPTzYHzeWUhwKL9b8dlAV1hJHglEW4EmX+/AlKi1xAkMUu+AKuq4l9FNC3yfPxwxaYRToAYRJyNMZXdWyedgwyjKka1mcjBkXzyivXIbBfF/oOhRRHvFUwHdHqUaD61uOuOChu2Jtb3B9jyj0mYzmRFGAIwxVVZJmAUma0LcDWTwh9ifEQUaceARBynx2gu/HXD75nMl0xL58jbZ7siwD66KUIook2gxorZjkU+Igoe4qrND0g6HqarxAMvQCYyTGDCjtMGhB03UY7RJ4GUk8ZpJNqfctXQ1n52c4gWBXrqibDcKTeGMX6fZI6RNECaMkYD7JEYGDETXF5gHbaUZJhtUeWgd4fkSej9neryk3G8ZHM1w3BwRpamDocH2Pzva07YYsTLF4zGcTPvvoIy4+/ojB8UmCQ4lyuSzJXIh8gZvFzM6ecnr2FOH7+HFENo5JA0vfrvj2zSv2vcPxB58znh2ReTmmdthvwLceoTTstg1JMGaUJkg/oBkcOiHZrHfsN3s6MTD0CrFvuH14y6vVG0SY4HgpyIGqrBFDiB9JNsUroiggT8fMJ6c4BOhO8+Tjc5IjD67GbDc1u033/Zb0u5Xqdy9AfaepqgFtDsxigcQKixTuQXRhLa47EAaaJE5RVtN3mrbSBKHH/e32IKdwDsf8QrjwGJwR8lGUYc3jCcVBCuB5Ps8+P6J98orNuuXp0w9IQoERA1iX09kMIXt00/Lkz/4tAK5+9n9hhwnLG0j9D1jfK5Sqmc2OwVMMRmJFTbltmEwO9qdJfkar3lAUe8bZC+qqoml33N3t6FtBFHsM/R6spakqFifHVKXm3dVLHKfCas1m3RFlmuvrbxh6y+XFhxgxsNt2qL48yEncI8bZBBhwHMP+oefh2w3f/GLN/f2Ak6RUOqHVA2W9xnU01X7HfH5EnAQ0TYnwYgrVUOue3qyRquB2vWZxMiUfOxRby4tnn1GUb7BaMJ/FNPuY2WJG13eMxxOqquTtmx2Xz5+w2ZY40hLGPm3tErgxT84u8KMK04+QcsTRLOP9/VvsIAkC2O62CCHIJyMuz4759pvXnJ5ecntzjUvCIEsm6RnoPW/ff021L0hzn1Gc8e71A4OxvH2z4oOPptzsvqIrFswXE+5W39A3mqra4ssJfmBRnYuh5uH9HW4YsDg5pqlajONzc3XF0XjC8Szh2794w4enH1HW90TjUxaXT3j24RhVVXxzPVDpJzjH52yqHfSWm3d/QWdOkOGnXN98jbwvuL5/iw7OmS0mKFvwcHeFrn36rmEQ73GcCK1C6qoD5TEfz2nqK8p2T1O1VM2Kqm4ZjRKW25esVjvCWICJiTLJdr/ndPGCzbLHDsd8+Mmcl7/Z8uLjC1p7i3U1bR2STzzurjccTS54ej7jk4/+tb/+g+p//z/81z9vugIrYDADVdmBdhhNYrwgoihL0lFCELsIN6PoCoxrMHZg0B6uCej7nr4bGAaLtS5VU7Ld1rStJfJjhGPZF5r1/Z40HtEPFmMUdpAM2iPNPNquQUpJr2tGkxBhE7zAxQjFvlYooWj0jjSLcGzM0DZ0VcNQK47mE9CSsq2QUYJtO05GR9SlIh/N0KbEcRSbdYWUmjSOGU8SHCdgtb3BDQPa3pDmB8BvGucMfYuQLbv6sCFQqsN1Haq6xA8ETVuiTYXr+xRNT1E31GWD9gS942LqktRP2W5qWu2hRY8rYt68aVjf3fH0WcZqJejahFKv+PbNS5qqo7UaIxtkH6MGQRoFrG4qjDaM0gDjWkIvAekhLITSZ5RHyAACXzDYgbJ94Gg0JU3HrJZrgsAjSQ1CucThiKFRWKuIYp9xHtG3cL9ec3yR0BSaTz865Xd+OmNwOn7wk5z7dYGNVpxehsxPTgjzEffFe1q15d3VHV/9+oam7DAiYHI2oeq3bFYNfpCy2+4PTF3DwQyjXKq6wUtynDhA2Zo8TRiqgbqsiXyHwHVpOsWAJcDhyfnxgW+rDLtdRdNrjDNgemiKHZ1p6GzLenfP9fsb3t+vaHqN5zo40uCHEo1BdgavtygriIKcyE8BQeS7uManahqc4DA8dh0YX+G7Eb2yKGEZLFRdh3E0TuDjheFBguB4CGnp+oFB9Qyqx/VDhANFWYEYGIYOKX+7Uf2n8u+hBodOVbiew3Q0J4sDxsGMef0Mtx0jhPNYWjpslw4O8w5rzOPxv8FYQRhLwkRiBexG7xB5SRgppN9hpSFPcqLAx5rDEfK+UGTxiDyd0Dew2xVcX91gekHbtPQDPKyvSXYnsBnR9wb53aD6V74efjeLlAJjBUHgEqcuN/LX3HSv8PyExWzB6eKcKMjwPA+ERA1Q7huGTjPLjxlnOVo1B3SN9hjlCySStrKMslOMgrqqEaLDDwRCaqIwxRP+Aabv52Bcej2A29D2e/ZVS9cP5GlIs19RbGowIf3QksYJoyyha/ZEocd8PuHk6JRRPsXxAxwfpGMY5RlGt1TVgFIewrq8/fYd77+9InQchrpA9pZQGnS5w+lhkicH7bE7oE1P4ueYwbDZ73lyesTzJ8cEUUw+jnBkQ5YldHRstzdgOoSwZFHM7PiYOAnwXI/R9Iwnz55z8fSIJx+eItwQ2UtoOlytmWYhxjjc3FzR1Brp5vhhgB4s0nq4UqOaCtVDEsB8GhNlHr7nEsRzruo9lbK02x2e9Dk6muJ5ilE6J4xGLJsVThby4vw5UTgnHz1jVdyx398gvA5pAjA+nhvw5OwSMyhiP+Hs6AewmxEsjwHLze32kHF8tJthD/IIIR20tgfChfBAOI+b0UOkRmCRDlw+XXB2eoRWHmmSUVRrtFGEUUhbadbr8pGn+lc9rd99DgUrKb8TVxwiBdMzB/3ka6TjMY+PkIAbWeq+Z1mvqaqWqz/b85OHfxeAL3/0f7I4WnBzdU9X+cRBQpSHfPrhT7GiYb3tSPOMh7sHnj875/2b94dNt2Mp9orl6j3aDKTJhDSTDMOAK1zK6ppRcgLkLJdrWr2kKPbowccVDl5wsHqlaQy2xiK5vX9PPhoxTiOsdHEcH4mP62sWR2dMJzlx6PO//PH/wfulZVsbgijl3cuS6egINzIY6VE3ljyf4rmK9a7E8wWrhzXGOWyoL55fIoWgaw3olP2qpu/WrO5KhPYwFJydP2W53HJ/u8d1XfyopWxaqnYLKmY+O6HrC+pqRxRaqn3JclVStO/p2wq8ir4eeHLxIQiNcCztsGZoFLq15OMM7MBoHPHNu1+TpyF5cMxmveb3/uB3ccXAcvPAxfNTsjwgiI/54EdHfPnnd4zHx9w9vCb0xyi1Iw4S/uAP/hXevtkQhyFxbFmMP+b97h3WOPTtmvv7Bz79wZTeaG4fNlxenJHlEb7ns9/csG4sm14QGpfpPKJ4yAiSCwQ5iglKSn75+o7Wl8TTS558+AmBL2jUwN36mqPpE+p2SVs9gNOTpTOurzcMg8L3BY7UvPl6z8X5jF/+xa8AGE1D9mtYHF3w9tt7zs8uKIqSvo/YNN/iuD6btSQbR4zHGZ3qSfIUw0CSj7i6ekManRHHLnUh+PwHHzF0NT/8wb/+139Q/c//0R/+vG8tytRYHCwefV/jWI9AWIyQ9ENFWXaofsC3AWLwCeUEYS2itbRlgSckuj0UO1zHwXM96nKgr2s839A1B4VgOhoxDIb1ukdEPf1gwVUopfE9HrdFEVEc4IU5venQtsD3HTwRobsBY9b0g0ZpF6Th9HTEdrfBDxymWcR+vyMfJ7gyo9OHzFhRKE7Ojzg/OTm4gc2G6WzGoHsmR6fIwEX1DcKA0DV5KknDlIdlzXF+gu8JelGhBbSmQEYK6Tik84R00jHx5xg88lFEoQb2qzWu1Ryfp0RpwOt3K8pOsF0W7LYdcZqw2wWsdmuqqmCWTMijKYMccDxB3zkUbYFjJK4b4jvQdi3GdTHCQQyWfBzgex6bsseIkqcLD1SC52dcnoxZ3e34+NMPceOIL99+TWoinCyk3paYqGZ+PmL5do+XOJR1Sd91+L4kn0z44jc77ldbbm4aHtYrzp8HDHpDpQo2wzV3+yvi2GGRPmUyypjOMgSa9eYdu73CC0OqtiWULgLDZl3jMAJRo2oHlEtntiT+oQW+q2vM41GffYTUp2HGKPBp2h1tX1FsC4TrUduaoqzI0zk3+zsKU9EJgRICRITuFb4XMShDj8APAiQeQZBjhUs/dPhJgBN6BJHFsR7dMFB0NTiGJPHoG+gHRZpH1PWAFxoEDtJ6RCGAoKwKOqXYVT1a9iB7NIamswy2BU/jAKEfIV0H3/f5281/CMD/mP8jfOHhS4nVhjjOMMbwe82/wZF+Tt+7WOQj+/Fg2sGAGjqMVXyXs0MIpDvgOIeiymb8jjZ+YDYb4zkevvBYLHKsbHD9GBAHFbAW9EaAI+nanr7TLB+23N+vDsUpG/KEHyP2OXV9OKL/7ecwJAtrH8swoM2A73lkWcTSe4ccK8Z5Thx7tH2F44PvezhC4AsP10jQHUYNaANYg8uYyB3RbJfUux3FqqCu6kP50A3IEg8/8Nhta5p9R+w4HE2PcL0Ju13FdJRwcXqGtgKlNKHvk2ULUn+MVAM9Pca0JI6LcCSdVWh1oJEIT1L0B6yW1S3Xt29wvIAkntIPiqqp2KzfsV5fUTc1dhiY5SnTNMH2LqP4iCjwWBUPh2KisrhGMTrKOH/6hNSTODSPopM1kSep9ise7q6o24JGt0zDBNkrtssNjh3oVc/m9o7V9RX3D++RbkgYBlCX7O6u6bsWqQVNXfLFl1/yxS++Zt8qjo6mHM1mjI9zfApEuyMIejq9o2PADRLqSrFbl6xWS968+gt+88VX9EOCH2rq61cIV3K/3oEDo/EYVWq265ZWGqIkY5L7ZOOQD56+YD49ZbOuaXY9Ra1whpbT5JJ9qWmWW5LdObvtnvuHGisP21H7SAP+/izeedx8SnkoUh34Ud9f/4Hn8uKDC6I4QoiDBthzA6TUVE2F6izLZYnjPaKnLCC/28oKpHRQyj7+vMN9xnUk5x9nqGcv2axagjSnajscYsryhrrZ4EYW7Tj8+Jt/D4Drf/l/gqGgUyVFbRnnU7b7Wza7JUkcEDku4+iUu7s33D+s8EJwQ8NqucZ1RqihZLdbEng5MCDlwHx+eBkMogDpOBhTYY3FaA8vOBjkRmlO165Q3cH0VdYNSRpxc/2AtuIgrIh9Bt3S9xY7WKIgYl/2nL24ZPFE8OTZjPdv73n9+h2ffvZDrq7usRaKsiNNFngh1NVA30IYCe7eFzjuIS7S14qz86d4bsrQL4kTOFs8493Lb9HKJx8tGI1DHDMwm0esd1seHu5xteT4bEpZFKxuG4ToyCcem33JzcM71ps7snyCNAH7ouZofkacWh7u38AATeOwa1scl0PW2voYY1G6PrCM84hpmrNedQh3wHMjqkqThCN+/cUXlJuajz/6PU5OF4zTY0LXx5MRzbBlPF4w6AbhOHgZbFYdL55/SlnW9H3H9GjEduMSCMVqr7ig0Z+DAAAgAElEQVT46JSvXr1mubnh6tu3TEcLarlGGo+LY4dQ1Hzxlw/Ei5zAW5DHIfXIRemcu63DdigJ4wjDA74zI/THvHrzS9qu4+ToYzwnxPUG8mzMm6tvcMMELxO0ncdHz/8Wv/P5z7j69h2e57E48+k7n4vnJzTtPX3zmK0PJsyOcspqg1YOlh03VxvG2RzPNSymLyjqe6zckWYZ37675W/+7G//9R9U/+E/+fs/90RIYASOMsReQhZHDKrDGknZWhxP4/kKNWi80LBeKTzHRTglVreMxmO6zjAMijgJCQMHbQxh6JPlCcZaHOnhugalDG27ZzwegQDd+wgGxvnkECzvFIHn0nQ7dus1VV0RJYeg/e3bgih0iYIQ1wdjawYUTVfS1S1h4FMVFQZDnFj8VOM6Kcrs6NqefBJTFw2eMBilWa7veXr6jP1qR10UCAttfQCeX14+5/ZuiWM1XnKCDjZ0vcWTPos4IhcJRgR0dk+aRIyniropedjsUbLg5PiIPItYHJ9RDZL3NzVe0tF1miScUNeC25uKptniex5F1dFow9AL4tAiGskiOuL82TkPy3t8z9I0PUocEC9De9jQtV1B0yocPD55dokkwvUdktBBeiGL2Qmvv/oKa0Ki/EAuNNIihoBdu6GnRYaW8eSErrMcHZ+yetihdI8ZQu7u1yR+Qr/NWd1Ihn5PGlkiOSZ0Fnz7ds14luEJh2q/pa1rmhqM27MuS3S9Y3E0I0lypOditCH0fYQzYKUiDmL2+z2T2RTf99lXJUobrLAkeUpd1rhhQq8M2+0WP3Dphposi1BdAdbH92OCwMH3Q6piTxLmNE0PwiNyU5qmpOs7rAdBejDe9B1o1SBdl2HoMAz0SjEaz5lMMuq2JExdqrLFdX1cB148vcR0hqE/QKvbocZxFHo45B3jMMGXMRiBMR1CatphwA0jHN+j7Sr+Tn8oU/3P8T/k2fkMLwwPZFShGYaWC/URbnsohiF+W2CSHEplSnUcqv6PD2Qso3FAEDoMg+XL9s946G/QStA0UOx79vuK3a5GD97BGe0CwqANOEiM0ggJYewdkGtSEiUhJ/YZanXgwB42UN9lZfleoYowBwzQI1g9jAS75B19XOM4GmsMfdthlMGXPqEPaeIyHk2Jk5T+0fTk+y55lJFYHxTEcY6fpkS5JXAMahio94rdSjFKxjy7uCTwXNq2wfUEjvQptpqq0ax3xYEfKhXFusI1HnGScnp6gbSG1eoOIT2aqiDAknkBTbtmr1fs6zWuFyACH4QmSzKE9enrhsl4TB7nWK0QSUwrDdqThFmI7/fEgcvRZIqPpe0akIr7u1vWqx3toLi/fkO9fqDqSjbFjr6XyA767R7Hj0kdF2kUu7JiWSm63sWXLlEekmc+QgzkQUzT7CmqBuvkKM/B9B0PV0uc/Jjp6QegAoyEMFK0+y3rokXIFCE9rpuC//cvv2a7b3jxo4wf/jTk7EjzdHHM4mjBYhaSTwTD4LFblazKNet1xfXbFccXp5ycZniUPLm4ZByfktoM3xGMj3L6VhN5PrMsIQxd7jfvuP+mwFseEyYp9/clxjzSKx438Y8X8eFSEg4gH7PP4ntIv7AOeRrx5MkUpTvCKKRuarADg9Lk+RhMwJu3t3iu91tjmjjU/g4nEt9tUjnYsQDHcZg8iXnrvmQ0GZFksF4t0X1LnIDrQN20ZLOMT3/5dwD45Qd/RNWUBJ7D0eSI86cXuCLE9SuqXUsazvnNr77AYhmPx4CirsEoQRQGxLFHFIXUtUYIh8k0AevSNpYozGhqy/MXz2jaHVKEnCwuKHbvaRuHxfw5++KeLPcBnyBw8Z0xXSs4fzJmvdqx3r9HSsloPGO324ONCcKIzbrn+fNLpITxZMZ0HlK3Fcezz1mtCj77/JyHu5I0zokSyf39kjDyicKYxfyUMBfsdmsmsxhlJHWhuXyy4OjkFGUM8UhQ15bz01OK4p6qhCxKGYZrlrsb7h9WCFfiuHB7v6TrPcaTEUVVs1pdMx4dI92a1fqah/sdjgN5fsxifsJu+46mWtOWJY4NieKUstsiPMV4Nj2UifY3vL/acXR8Sj6KCROXpjmQdNAZadzw/uqeZDLHzy1VscFzoWkHAneEURFHswlZLrl+d4vVAoNmU7xCmY48H7O8bYhkhxk6sskIa3eoymE+v+R4nPLqak3ZSepiy2wW0amS9U7x6ccfkYwkq01J2VRcnF1g+oE8Tzk/X/Cbl+/YlndUhc84PcJqlw8/+IQo8bm4fM58suCTzz7gz37xv5HlKUEkKKolwqacXUx5uL/Ddxb89Mc/Ybl+i7Qpl08X7Itrqqpj0IeexJtXD3z80SdY29A2Daulwg0s/9K/+M/BoPpP/+gf/zyaRhTGw0lyqnaDFB7doOh0j8UiHY3vpWgF5U6TZC6exwEb5XtYq0izjDxLCSMPY8BqGI0imkGhtYs1FVI2ONKn7XYkaUi9d6iKDWF4GGLbboe1PVK4eI5HGqeHVngSUheGo9mYLPaRQtDUA34w0JsGqyznJ89p64aj+QTfc8C1LFcP+KEkDB3Wy4HerDCqO6jOGo9duaGtBvbrlqPpEW1VMgwDQgqsGUiTEM9oTKKozIpQGj69/IzxKMWYgBfPTzFWHd7w/QbT9bi+x9AoNuuG8dgDc8T8eE5ZVzTdFlc6ZMmIst4RRoJQpHgyIsgcnNAhEA6RkxL4AVEI292SrlN4DqRphAxcxvmYrlbgGGbjGaN8jjUNL87/BfJRhu+NCNwJ8+Oc5cM9ly/meKJlYxucNsORCkcaPFfguCMm8YT9ek2USvabBsfZ47mGLHOIcpeqKilKS9FJ3l3V9LspT45+RFsJdGcZj2fcrO6ZnX5EowXC7VhM56RiQV3dMxlHyKCnGTYEXk7oh8RRhBc8Mvu04WF5TxD7DFrTNAPGOOz3LdN4jO+E9N1hiyIcgcYhyyfUdUMc5ERhevibaZemqpmMj+n6jiAOka5GG4vgUEYbBk2WZ1hj0APESYI2FWV5iCpkyZjd/oG+7xhPI4QGKQ74kLMnZ2z3e7quRasex4U0ConDkNCd4LuSpmrpui2u9AGXoRtASXRvqauG/0D+xwD8kf/36QZF1bb4QUgY+LjS56z/hNQeAyHfLZzAHkgJakCp/qBRfSw0ua5LEBzUniB4y2+4K9fsNhqtLOXesFwe1MDFfkdVbuk6Q99DP/R0fYMyCj8IEI7kaDEjzh0eVlcshuc4xZS20d9D0g9bLoHR+rFQ9Zg3RGOtJYkTtvEVy+GaoVf0XYUjLKETEXkuSeBhtaGsdhT1mjyb8OLZCxypWa5uqLqSIDVMT3Im45yAEF8Gh+EYSzaKcF2PoW+RQrLedxRDifQEk+nkoBp2LFL7bK432KGj6Up2m4qhHZBW0lSWrqqoyhW3d/cM1mClwA7gCo+6rGnrGkmA54R0zZK2KwjThMGC46RkacauvafuKtAOu/UW20gEAWVX0bQlzbDHdyOeTU5x6Ri0YJwcEUsfMRgm4Yj59ITpaErgeGzWa7b3SxwRkHghmVCEi5TxyRG66djeP+AEPn7q0yvJdnmPabbUrSKbTTk9OyOfxKjhHkvHOJsTSHCilnK7RyuPyFYspht+/2cBp+N7dPkl86jlOFN43bdE8oqTZxWhbPnRx0/58MWnHD95wWj8lMuzC0w54Dgup4sL1K6m3SsC6fP+6o7xOGA0TtDOBH80pqp6KANO7WdkScq3bx4YHhnEQnwXIpGPljUeEWiPJavv8FT2wFtdHB3KunHk0baKUXbMbn8QbEwmU4ptyfXNAwj5eJ2aQx72r+Dd4JBTFeIwtEopiOaGu/RXXJx8zmw2ptit6dqWNJ1g8DFDTJKM+fAXB47qX/7gv2XQgn2xJPJDpJMihcRxBtpCYXqPl19/xeWzCSeLQ0bz9esdftgSBB55HnJ7+w5rJE+fnSGlx931Hs83GHPgMUvh8uFHH1I3G16/fs3J/JSL82csFnOU6RkUaKO4unrHYv6cZ88WPKy/pdOrA64qHlG3SxA+URJRVw0vPlnw/uqKD559ThRF7Is1VdlxdHTCaBKj9I6uUUSxZDab4biKyWRE12lWqy3rYsfQN3iOx3J3x3J5gyMcarVjNs/4y1+9ZXESs9vccPP+mjj2WIyfYu2S29UNWTZBmZaH7Rumsxek2RRlHNL4hKcXTyjLhrJa4nqKobf0fUEYJCSpQ7NvcR2XKIi4uX6PEmuSUYAnJ9xv1uRJxHp3x8n5c4zoCUJ4f7VhVyzRlASBz3jiIYxH1295+fLPQU8pmxKCPcVuy2Qyx+qA0+MnSDmQjgy//vILPGeGtoIwcmjLEmMt27IhGmdYr8f3Y0bzCdv1ntJTHJ0fkcsR86MZtbJ4gWJ5sySOJvz0p7/L7fUbhLY4wmG/a7i/73l+8RFnsyNWb1s+/8HHDKy4en+HViFD6zO0A307UNX39AM8++CQB5YiwiHhh5/9Pm54x8NtQddWCASeIyiKG8IgpFOW1eqG+WxE06zZbzvyccgoP6UoS/7m3/jnAE/1j/+Lv/fzxlSsK8uAZWj3RDJgaDuwEMYhAh+jJL7vEIcTAj8kcDyM1VgtCXwPRIX0LHVxCMBLqbFIiq5DDQWe49G3DlorptMJWguGoWO+8MjSKevVFiEHxpMMgSSJI6RUGAxto/GchCwN6FrF+qHAlSFR7JAEMXmS09Y9ehhIkhjV94ReShqcUJYl+1WHHiyzI49iZ1HdwS7V9gLphzRtRbl7eASIZ7i+5HgxIfJ9tEkJgopiZfBlgtEtb973iMjlaHRMXdU4rqLtNeNghjYxQnkcny3w5QhhE3795RcgDBKf6Thnsyw4Oxvx09/7kCw95e72PeNFQOrPiRmwvYGgJRu7/PCTH9H3A47UPHt2ies5aKU5mR8zm40YZQmOC+NRijYeXqiI44jVes3V+18flHiTM45mE9b1huMs4+z4AzzP4fxogXUchLU4Lhir6IYdbuLw4tNPqbt7qrbEDyxJEGF6Bb1EKEESuRjtYaSLosZxJNoaIj9lu94Q+oYknLN5aDHax9iAbbXFWBc9dPhRwKAb6rpiNBlhheVh+YDn+UjhYrWgbxXY/mBe8gKMddgVLdPZKVXZUhQl+22J6/o0bY0aNI7jYY1FWYPju0hP0A8W13FwHY2DpmsMQ2/QosVqH991icIQxxuwokB4Lb4f4LoSR0LbgBs4DEphhWHQFWmSEkU+Vvf4ToDEpa0U0h62jk1d0Xc9Unvo4WCM8jyff18cMqr/xP4nKBPRNC37bYFVBoHPU3No/FvrYc0B5YU9MFyHocPoRwA/HL6PxvMtruOiesvXzZ8zBAWqPyiFPc8F2WPUgCtiPCfHcxPAQ0iXXreUXUXVtRR1Q9u31M0WYxUXfEZQzeka/VvoP48lrkeF6mGvar8/wbVW8G39mtfLV9RlieosXQ19ZWCwVLua9XJPUdYUTYHqNWXRs1zu6G2Nk7W0Zs1mt6Pe92yXDbc3O969e0VRrJDaEBJQ7SqapuVsfkIsAqpNQbMrEKYny6IDkcRx8DyIspCT4xOG3nBzf0tVVqi2xaLIxilKG7pWEEcpdVVh9IDvGExnqbqWbXWH67lE/ohEJHhuiHU8pqMJvu+yKxusEbgmoKkFXuDjSHBIsSJDugHPnnzCeDTBDgPd0OLGkpNxSl+VvNo8UIiO8WRKHo85uZxz+eGC6SjDDiC9gGQ2YzIZMbR7hAyYn53jYKBt8aKMfBIT2DWxbAmNRNUdru8g5QGHs1luGKfw/PmO8+lr2rtr+lqRnzwhmM8YYo1NJPE0wIsDhtChS1f0pqPcegSMGCcJWj+gnY5JdkKx3aAjsJ5H1x0iO54SpEHM/d0GgUcWThjtztH9wM3NFsV3m9JDhvS7POl3nODvBlj5qFgVVuA68OQyIk1djNWoQRPFAYb+UPiSFq16VsuDoeo7nJsQDsLK77f+h5yq+f5EQAjJ6MyS/M4Ni+lzit2GttRIPFwfBtWRpxecnV6w+ON/FYBff/5H5NmCs5NT3t/e8ubqPXkywnM11b4mjY6Yzh2EA08vn/P1y5ccH33Kz372U6LQ8tVvfsMHz36HKIpo+z2+PyYKU8pmxa5Yg4DlcoMUPsvVCtcVDJ3L5fMLNvt7rNBMxy/oO6jaNdP5DClGLOafYdB0vSHLY/quAjNDiIE37/8ZruuyXj+gVMt8dkaazIiSkPXulqpZUZYFk0nOfr/j6v0bRqMpxhj6DqbzjIf7e05Ojnn7Zsl4nNI2JcVWkk0d2n5J3xsmkxlJ5uA4IcMwYK3CWAPCx2iHblA8f/YTLp9fcvP+mjwPiKOItql49/5XbDcVi/kHeF6IIGI+O2W3X2MHwMyYn5xgTMfkaEFVKeRwuLe9ev3PqPodSJhOjtg3dwxtiBQuWoHEokRPGCYkgYfQHudPn+MGmq65I4x8puMj3nz7jicXc4ZBYdVBqiGEpO1rmrJnMhuxqxRnTzKSQONoH9+P8KMZot3SD3dsb7bMph5fvLqm7vcMlWFxdsyr11+h+xicgodlSZiNKbodV7evuX5Z8ZMf/y6n5yP8cEJRxZw8Oaaqr6nKaz766NmBWoGhLDqCYIzrSYauJQlH3N29OZAPNj0vPjh/JG/ELI6e0KkdTavYrgs+ePJjrm+/JAzDw32+rUjSMb//u//mX/9B9b/67/7Bz5umw7bgao1tD6WWIHQJ/QQrXKxRJJE8ZO1Ey37dYA3stntGyQQha6y1dI1gUBorLBbJoBRN1+M8Wnwm2Zy6VpR1h+s+Il7ocd0c1/NJkgA/dBDCMM5GVFWJDBS+F+CHHU3VEXtjHBlyenFY70cqY7N6AEeD8PC9iLaqCN2UthzwgpC2UFw+D6mrmNnRmPFsQKsUPM393QptGrLcZ3F8Qt0qettR9zUPDwUqHFD7jiyIcYKM3lZ4zkC5N7y+eYfuFNJVGDNh/6Ao6pYwGLOvWvQgWG0KBltgjMAMOb4XUdcVVmmKjWZfaaJMsDgLGJqG49xnms5pmg7pdPSl5PT8hMkopqk6lsstkoHN8oEgCLm9vaHtl4zHp9zsf8Ou6NltdginZTpOMfS0W4N2fDLXJ3QKZJhzd/eAcHr25S3bbcEwuPhuC32NEwlEWCK6HV4oOTofU1US3Qii0HJxeULVVpT7PSVv2e5WzEanDF1PW3aM8oQkg015RdO0gIMjx6y3O6quxBpNHI5pux4/FLRdT9c6VIWhayxPzy9ZP2wIvBAZajxfgpTc3q+J4xGhH7JZPeA7DhBQtzVVe3hhEEi0UQzK0vY9SncYGtRgGDpJGHikccjQDbiOptwcTGUS0H2DHgSOE1KUHc3ecnw8o6566n3BOInQTUPgiEfFo0FqH2ssnucy9B3WaKzRBEGI6hXJKCfMAjQDFsvfFf8RAP/N8J8d/OTK4EuXURqjdorT4SNScYwU/uOm6REHJSxD32K0eRxcJdZY/MA9cIClh++7vDO/YfA3hL6kKRqqpsRxBGgXz/NBDiAGlNIYbaiHht4YLIK2b2maBt1LhtYwLS+Ih2O0PhRU/qqh6rfH/99ZspxHfJbiy+2fc9e8RwjN0Ep2q5rdpibwIiSGzW7DrugpyhYpHEIn5OjoiEme0W87VA2uzdAENGrFeOIdThO0wrMusZ+TJAlRJEmzgF63GAx+GFN3PduqQSNRSmFxcIOEbbnj3dtXaKOIs5C6KtgXFbuiP9iHpMYVBkcFVLst1w+v8MOEyWROsatwlCF0QHuSbDzFReMKQV0r7m9v8E1AEoV4QQMInCgnnZ3Qm4Fvrl6i/Tnzi88wSUyQRiRRhhvl+OMcEVtiX/D8/ClPP/wYpQbaskJEOUGUobsWqzWu7+M5IePxMW3fkk1CpmcXWNtR7TbsWo12PcazEY4P2/0DVdWitEOUhMSRg3I9qipEiTmkJ3z7suXhVy0PV4I//cWW//tPbvjFH3/D//4n1/zyixBdLwiJOTmPGI8dIs8lTCbY0OHq9g1tp9jvCxIZcTp/SrktKHeKLJaczBNOsyf4tzOKquLhvvieIGHg+4H1O4zUX82PCikeg6aWLAv54Nk5woIaFMr0dH1FXTUkcYbWBjX07LYtRdHieuL/pxu2iMP/AAJjNHDIfEspWTzL0M/uePPmG7a7K9QwEMc+z59fst+WqL6jl7/i+f/zdwF4/7f+Aav1DUb3dLVHGp3w6Q8+pqyXOE7IZBpQ1TVIl22xpKz2OIxpyoFyK/nmq6/Rg8ILJFWzpK01F+entLUgCmMckRDHAV03YNUc6RgcqWj7lru7miAJefnyNc9fPCOIFd+8ek+U+Lx7f8X93Y4g8pFIun7D0HhkaUbd3FJXmkF1gEIKl7oukI7AdTI8X6MGSRzlqEGRjTyEycizhPu7JY7jk6cOUSrwAih3a1QPZ0/OKHYPBGGO73e8fPnA8w8v6FXPYn7Jw3LD8w9+yPHRU16+/oKn558xm1zwp3/6x4ynHuu7ijSJKHYtceKQJBlJfMLiOGfoYWg8tApxPQ8RF9ws35AEY/78L1/x6ScfcPvtr/D8GBnCKH5GmCge1m+oCsV+q0hywXQ6x8Nhu9tzevYEjaIoBUFoyaKcdq85OV+wK1fc3V2z2t7QVZK62aKNYD47ZZJPiPyYIE7oRccPfuCTC4WpCnxvYBKOkKrkx599zu98dIbvDvj5QFN3dIPhd3//Z2xWa96+e0WQpvizJZtij6s9fGNxQsGmrYmPx/yvf/JnnJwuSEOBajWe4+GJObPxCdY0CJ1SVAWbVU8YgdCG6fyE7cqQJ2N8b8x4PGW73bLb72ibiDiZMz+a0BYBo9GE65t3eG7G/Dihrgf+xu/923/9B9X/9L/8w59PFgs8P6ZvOvSgcQOPeJQjIg/bK4JAEITgSEFbKKweGI1CjLYIRyEdS9dahi7AWIPnKfq2ZZwfISQMtSAMxMH1nY0p6xrptkxGM4quo6kr8kmMI7zHdq/Bc1K6VuBIS70Hict8mtNVhtCP2BcF27Vi5AUYA9PZAmMO2aVe72nrBoRD2W4ZJTlGDdStRdsdxsDd/QbPmx5ygiKnqQbiPKDTBX7kcr9e4UcpFth3NV0jUX1NUXQwgB56tm2DNT2DMeghwqiITlX01rBcN5TVim6wNE2DUpJ+KOmbgWLXUO4NaqhRxZY0jNltLEOnOV6c4PkRakjxQx+UZDpbsNtv+erLb7BSUlc7sjjFCosIC/JRRLnrqXSNdAaSwCNJpzSlRvX3GDsQBQHNekPdGrpe0ZiWYr9lMBC5NfkoxjguzhByMU/ZP9QUGwNCcn1/S9N3PL08Z7NdggjZ7wb224I0ChgagSChrHs8PySKPO6uljS7HoWD1YI4yimaPXnukUYZjgjpdY2x3aNu0CVOYubTHN87PMCGfqDvJMWmJPB9hCMw2MOWvChBOHRNc2CYWjBa4zoRoecdtirCEPshngyIwow4DTF01EVHX7rEck7y/1H3Lr2ypXl612+td90vcY/Y13M/J7Myq6uqq6u77MbultpCWAwsMAJbQmKKhBggJD5ATRAeAEKIizwyxuABIOyBZSToAdi03HZXd1Zld2ZVZp485+xz9j3u677Wu973ZRAns5tv0N7D0NbeEaEVsZ73/3+e3xN5jEZDZpMBozRmv2volEb4NbPJlMj26ZsGz3NIYx/f8dgtd/RtSeL72HZA09Q0DTiuRRh6RLFBSgvHTRCRpCiyw5bBWPx79kGo/oPgvzsE9JqaQRIiMPx681c5sZ8jnBjD4fnr9+LQGP1eCOv3+B0LpfShXCAJMBhqvaaebCCWBIHHeDokSS0CHwLv/fOUHbblIVtN31fYwqGXBhuX2E3xRYhlxKHOUD0k7RcoaX0rUg8hLoPjCowxKPUN+N9gvRfQ5egdepAR+cGBTqAclBTcr1fkZUGUBoCL5ycsFlNGaYqPhck1pg7w7AG+G2ABXbEi9WNOTx7jhB41Gu05KNtCY3GzXHK7XtLIlk72pEmCsKHIVlhdT1O23OzucSKPOArZrLaUtaRRDbvtHjqH+fQEx3PY5yskkt40pL7LyA2xW8UwGeELh1pW6CA+BKW6gkxmVEWJrxwm45godtgWGcZXOJHParuhwZCkC8rdEiMblOnwjMXi6AFiPKCVBV2+Y7vNaCqF7HqqWiOlxX63p67K91zXkKppabqeummpihVtmSG7iqItaJqcKBXs8hxpHEbzMZEfMQwTTo99erNiWdT0egBizq5OuXwrwZ4wXnyItEYMZw+IZx8ggpQXT3+N733wWzw8PmI4CnEDj3K3IctyLH/A7f01L7/8BXESY6sOXUpk5+LGPuNTn/OHZ9Ap+nXAtH9MW3fcL0uqVuLYDljfHML+dC3/Ddj/m4PQNz/z6ZAPXjxFK4lSCinNAeWjD5QNA0S+y25fsNkUOI7Dt76ZbwD/8P4zo74VxMIWDE9dmgc3BL5L5CdEYYRtS4xUPD0/Zz7ruLr9BR/8/D8A4H+N/hOiNCV0od9qnj58Ru80uG6Cpmabb1mub5guTsBusSwH2e8QTo3QCX1vcXv3jvFownA0QdgxgR+TxjOub+6JwgipMoRwmIyPKasl+21F20v2xRZsxS5b88UXXzEcjek7GKQRUXqgd/huxMcf/CWSxGGUHmMZh6OjUzQNjh0wHJxiWT15sWa7zSnKEiEMgTdFaYWmpGthOPR49eodmoauNbx4+gSpS65vrpiNThGOjVQFwrg8/+DXaJs9rueR5fX7cGTAcLDA2C7bVc6v/vA3KcqMPK8ZT0KkzFne35DEQ8BikE65ePclwgqZzgbIPme327BYzPFjn3X2NcIJWYxTbMci8IbM44imjzh7+BTfG2K0wbE9LOPhePd03RahJ3z8Kx8fAtTK8PL1Z7S1oMkqpqNzTh88Yr29RPaG0TTi3dVXHM1eYLTEs6dEkcUwHkJO1fkAACAASURBVPLzTy7QNjx5/pTXX93yxScFf/DPNix3JfHA5839JZuyZ32Ts1kvqYuC0Dpn/ugp+/U9Nha7/RWX7zbE44KJ9xEn8YC4HPHRrxyzL1subxTf+ehjHpwp7t/dMYzPOX70mIfnj3H9mt12z/njCVWbUzUl0/Epx0cnXLxZMhnP2e62LOYPaGRNVhx+p6h7nj95xGq5YZtfMZyMSQcD4jRmu93iuSN+44f/EnBU/+E//vs/qeuOtm4OiKFeMZ9OsYyN1i1JmIAGrVuUzvGdBXGcIvsGW3Q4vkPfhxhjcH0LTwS4rsFzLfabjvEgYZxEPH/ygncXd1h+QzxIcFybOLVp+pZe12AaZA1KHriRy+Wa4ShlOpywut+RRgPmi+ggdmOPzaqkaw3nJ3MsO+H6boNSNnWzQ9FQdyD8EM+NCL2IJB6gMEzmPnXuMh0d8YPvf4/rNy8RdszR6Zym3+F6hqosiGIfx7PpS4NxbJabOzzLP7ASiZBUOMIiCkN6aVFlOfm+Q+BhhT2yzbG1R1MYPNclEDaqbfHdkL5toJcEnsXMnzGZDehVzngccL/ZsNxcM5ssKNqMzX1O1fZ0UlIWDcpo4jikqdpDwjUI8J0I3/Vou5DQsXl09JyLyxLXs5gNBzhhSFfkTGYjWhPSlx1lVWJ6aJRHmeUUrcaN5wwjjapdfvlVhfJa8m1DtekYRRHVuoTapu92KJNT9w22dvGDnnzXIrCxtE3fKbJsi2ULyiLgeH6OEIKq7EjTAap1aeuevNgTBilKWey2W+aLCW7gcHtzCLsUZUVdanRncISNNC2NbOhahSNcqrZkPI6xgKpqML1Fndd4jg9G4bo2lhIIG+o6p8xq+s7GaBAC2rZB95oyb3HEITwxnHokk5h0bDGdDAmIwFj0WlE3HcJ28F2HNPXxRADvLXFKGaJwRq8ahCNwvAMuCt1iawtbuzi2y79rHziq/yD6r9nsd0RhSOAI2kryiI9J7WMsO+SbNaXhMHnSqqPvOzDm2ymr1odp02gckCQBnwb/F3fWW5JBgjKKg9kkwtYQBh7G7rGdA/qna983c0kLWRv6UpOvK2TVI4yFljZfZ18T6ykD5vzpzf7g83MdgeMI9HvhDDZYFtpozFFOeGJjtE1T1dSVxlgOtiPwg5QoDtluSy4ubsjzJUZqFsmC3XJPUe/xAkOWF3RFh9eF1FtNtmvI64q8rtgXkiLLqLYVNgKlG7q2o8w7bu/2vLtfc7veY+yUTiqyaoPGpio6bMvGjwY4ns98NmVxdETR7cnyPaI1NPUOqbbYqqVtGhAeWAbHi5mPPyDsBb6t0KFgL1uEUni2y81yRZblaAH7IgNlH8IubkcaO2R1xS5fo9scz4Igibi6vWZ/f0ucpOyVw3KT0dsWzsAhHo8YDkc0WcGu6Khbie1rklHI0LUQdUvbavZZixApR/NTRvRMI3EI8ilDOghJYocma6jbiiiO8dMQ1e8ZuBbjYUqpfTKpUVbP0WxCOg4Qicfp8TkiqNjmNwSDiNEgJbChETbhYIReV1T7imDiUJUtyijOzgcspiGWtNHKZrPfUO8NweYE1SmubvZUvUbY4luv6CFQ9WeRUeLb6+ywObB4cH7M8XFKWWQo1SGlwvOdQ7MTIBwH9MFGcHe7x7YPFgHeJ/6t93/sgHhT7w9+B0/s8MSmOf6MuthQ7HMwkBcFr16/pthLLt/dIeWEj395wFO9/M2/S1d39F3B+rYjTYbUuqCqc4Ig4pOf/SFhcmB/73cNjiMIApfBYELT3zOZTXn2/CMcXxJHCRYWaTqmKFe4viGI4NNP/4SLiyvGkwjLboiChMcPPqCTNecPTsmra6JowHCwQAhB5CW0bUucWMxmE1zH5ZNPPmE6Oeb67iWz6YxeSdr2cP0Lx8V1U+JBhOXl1JXk6ePvoHTHxduXWLZLPHBYrXLSNGY48nC8mKurd8jaZzF7ThAeShT8cMzl5Sturt4xm50inJjF/ITlzYr7+9e4oYvmILyPjqdcXl4QiClRFOJ5MdPJnDSNyfYV80XKh995xvX1NZ5vyIsSR3goJdltao7nD7HyjvWyYzpdUG62eOPHRJHNLn/Ndl0gG4teZsgWRskxaZyiOkHf7vFcj5PjE3wvJE49lttLLu/e8vDhCS+/uuHodMHdbckgGRGFLpbRvH71FQPvBR/+MGJ1Z5H6IUEE23rHgw+eEo48Skug7RLPPyWdCT796hd8/WZL5DxgcT6gLK5oix7LGNJwSLkMuXmz5nzxENcr8KyU0+Mzfvbz3+PJwzF//Id/jKrnTOen3G/2fPbZZyzv75GtQ28UL1+9Yjp7QNe1xHEKlk3T9gyGgqIoWa1yzh+doS2Hy9s32CZHNUOOz6ZU3Yqi2vLu8oooHGHh8xd+/V8Cofq3/vv/9CfFpmeauhzP53j+4NBmYhpsY6Gkh1L9ocM5HILTYrscOoU3HX4QUdYbAi8hTRJkv6UpemwTMhmFOHZIkVfMJiMcz6YyNyil6aQkTUP2eYtRmjQRpElE2zQM4gghXPxAE4gBve4Yjh08K0BY4HshLz58RpomZFlFmAypu4aiLBCORdsp6t7BuDZKtTSlRgjwQgvLaejknjjuiaIR+b4hHPWk0x7Zd/S14ORoju8eOuCLXYNjdSgdYLkWTVUhlUILQ+DZOMZBSYNPgO8doOZVV+MoC9dAGkbUuTyEcrRLGnukfkzouszGcyzL5WaZo5REWIasqJgMFhS7nN1+Q13YbLMNvZYY7VHVHZ4Li8WUZDCi7MDSFi4+nZSYrsHF4W57SzKE5TpDIOk0vHj+fXqj2G7f8XCWsDgJWV2usARIK8aSFXbZYvkKkh6blnE6Qzc2nutz/OAhjewRlkXfGUbjMzzXRnVg+hCURRLFlGWJsCNcz6MoOzarLWk05Gj+GKM12XZPUW4IYg/bEpRlwXg6RLguu/0e2XfUbYXjQzwOSeIIA1RdidYKFxfLKOIE8l2DNjAYRngiOADMjU0Sh5R5xf1yg5Qt9ILA9/H8hqcvJoSJRZTazOcBXsChh/nsCBHu6VFYAmxLUTYSLxjQtj2Wtmmrhq4vwLLIa03XOWg0fnwA67ueQHbve8UdTRxMaGpJHPn4ns+/o/8jAP6e/M9whEffQuzHhEHCc//7RGaGwQPrMBV6n61HyhajD/7Ub+0ABoLAYTj0abuCd/afYAYS207ZZdWBfawaUArb8qjqirbv2e0atIzQnUu1q+gKSV/3GNnTS02RdWw3JWVZcew+YuKcIL4VEBZa9YSBj+/79FKhdP9teLuQOSv3jq28o5capTRh6LE4HXN0OmE8HWF0y2ZZotSBaTxOJtTtDqyewBM0VU0UDnHcEUVT4/s+x7MRoXDwVMA0Soltg+hbtjdbmswgtE+TK64ul/zyyzcs15Lbm5z1ZonuLXabnO1+SdVUhGF0mNrbhjAIGCcpv/mj3+ajD36V1eaarNiTjo/obcUm32LbPp7nYvWSfLVh02foAAJjMw6nCJPSlZokTHn08Azfd7jeXHGXb2j6kHWe06iaNBgQpiNu8zXvLt9hlKKsa3IpcX2HkB5Pt9zeXnNxt6TuG0QQ4YUC2ebs7teorEEpiZeEhNGIIBxgdMNmd0telIwnx8SjKbKtefvmNXmvKao9dAphLJq+4e3tHTWH743QSShVjex32GHMRIwRxrDe37Dc7fjq1S9ZrtdYIqbKK9LwCNVo1utb0A5OJ5gmC3wE5WqNLHsm8zOG83N6nVFcl4j7E7ZZzm4naVoFFmj0Id9v3uefzEFI2t82Vx380I4QnJ9OCcMAGwfX1++3AGBQtGpDmo5Ighite969W2FZzkGcWuJP7TPWN3YZ/e117AjBg+dz0meaQTDHdVzevL1EmZBdtmM0HXN0vsAEihd/9DcA+L3J/8T58CnXdxs+/NW/wnK7Jst3NO2eTjYI5/AaLDUkjGwwLkdHR9xclownQxAtdbvH9eH161vAo6ju8AJB3d0jZct3P/oxZd6w222J4ohhGjEaRwzSKcIacnn9NcfHC4xWdG3PIDm04O13t6TxKY4nubq6ZpvdcH+/ZLGYs1xfI2yXTvbYtmYymbBa34HoCJ0ZjgsvX35N1wqE21CVAt0bknSEbRuk7pnNEvJsS9FtiFIHyxikdtC6YjgYHYYHVcPl9Zds10ssFFXToa2epikpqi2r5Zr71SVa+fzwB38R2Ve0bcdscsTp6WPevHlFW1mEUUTfNzx7+oi6aYj8IYvZEFNKbpe32K6D6QRnH5+x39ySZSu6uuPRwxcU+Y7H5x8xSCNur/Y8OY1Z7a7Ylz1NY4gHDvtqR6d2zMZzbm9WmN7jzcUF7163HJ+kjEYpytwwnx5TtSsuLvfMhiO+8zTi5ee3BCPBdtvw6HTE1y+/JLSmTOYh+7Jll7u4kUvWXOIEKaenp9zc7omDOY+eJGw2N0RDn0LaiJHLdtcwGz9hNk6YjgO+fvuW3/3dn3Fy+hD0jp9//gWjUcTd3TU4GWXlEMUzGtlxfXnPYBCiVM3Vuz11m7Na77CFh9IOQRhyPHnIfD5jkJ6QDDy++volrhPznY+esc/X/MUf/Zt//oXq//j3/s5PjN2QTgMMAarNsXqF67cUlU0UguOV+L6FZUvKqkN4/fsTq0SgCUJJvTs09kzGEU1uYQuJNjvaTlPpil1+S+C6rDf3WDJiPA4xbkvsJ4TOgMDx2O22WJbDPi8YRmMmwzF320OTzdn5jNFowGZbcb/a0ilD3e3ptKbud/RKo3SH72vSQYBrC4zucXFJ0xRjS6qyp2sMvm/R9yGr+5auusf1YJ9nVJVmNE15/HTK/f092S7DC0OkTFCqwwaMNkBP11toD0ypML2FSARN3VDKBl8rPCsiFCm2DZZnYWOQWmJZLoHr0XIIp2Fp6q6ikQ1lUTIZDehrC2lajDUFIymrDb4X03YdspEUeUE08A6BtKIhLze0tUL0Ea2SeMKhXLaMTlLqOsUxMD9J0aoEY3Nz+0u2ukCLgrPTmK6LCPwQ17NZ7Q5CPAoMlvEJ05TZqU+2q/C8CaqvaaqSMEhpZYPnGXTvAy1N1VBUBftdD6JDCJembA9Ab+vggTw9OaOuC4pyh+MJirwmzzTpaMZmU1KVJVgtWnOoMtUN+/etTaEXEIUBVZPhBR5Vo7F1QDhwsN2e0/kDXGdA0zdsy1uMskHbCNsge42TVDhRRziUTOY+29We25sKz/cQfss624GJUa2hr2x6WWI5Bz9y1xmEOIhVSwmM1LS5pu0lYRRSdQVBqhBORxAG9FIhlcH3LGxHoCyBQfM39YGj+n9E/xUCi2ESEEYpQgScqw/x+yGW8Q/tOehDSQIWfdeBUf8/36rWEIYhXd9S1TUX9td8vf4ld8v1+2l0f7DCtAdUkxA2fWtRbhWm1WhZAgbZGWSj8N0IcKmbCmPAER5LbgnthImY840Pte8V08kYC8O2WlPris7UtLT8k+3/ybX1NU+fPmAwDHEji+l8gO8KPBHStxD6A549PWM6dJgnKYETUXeQTqd4QYTsD2J/u6sPwSYX3CDFSeaUTUd5f0OWFSzXGdryCJIEy1OUTUXTCiazc45mM3S3YZ9vaZqars7omhZlDPmuZLO8RWlJb7ncb+746R/9ET/7xdd0NsTDAfF4wHA042j2iMXxMbbrImvFeDwgHaeYTuIHAdpottmKyfGYwWjAxeUtZdFgWwdrQ+A7bDcrPOEQRSl937Ja3bHPM+JRRK4y9mWBMA7KdORVRd8bPKG4vr7kqze3XK/XtKpFK8O7dxest3fsipqiLcjKNUVdQhiBO6CVNWW1oeoknvCpi5ragkZLdvWaXb0hKwvc1sWqLOJ4hPAGvL14B72k7jUuYBuDbFvOj0Z4jkudb9mu7snbLVdXX9P7LtFwQr3P0V1HK3zGszOGw5jr2wvur+/wfQNlBFcjtO2w2dSHybDgsBn4pkTCPpAjbBts20Wbb+pVeyLP58mjMW23RmlNMhhTdTuarCUdxgRBgOg9MIJ9VnN7veQbXypa8U37lYX4Nrp10K2HCtXZ2QQ1q/ln//wzGvOOoq04msyYLM549Oi7PH70K1xcvOY7f/xvA/DzZ/87We5gWYYXjz8m2+eEkUevNniOwHdS3r69xnUSwtCiLjXnD88BKMsN6UDQ1PD24p4wdPCdGNftyTKXeCJZbd/gm2O+/93v0fY5ebVB01MWLaUyyLbnZH7EbnfH9Vf7QwjN9xiNA5pigyxDAs9lNHVZrq+R0rDebVnMT9BGc3uz4uGjc/bZGsuSdEVCHI3Z7HIQe6SSnJ09oWsLjILTsymtdYdvj8k2B1+kZkfgHtOrCtVazKYjVNexullzejzi+vqCVvfI3iIIRiRDi15VbJcdTZdjexWeSDg9ndBVOWWe8eDkBbJveHd5QVnvGY4jhGu4vlyjpOLpi+doO2LdSt7lrxDBYVPoCUNEgsokcTAmL9c8f/w9jschn/7sDY8/+h6DyOXycgfCJgljuqqgWHc4jkPVdFT1lmyf8cH5Rzw4D9ht95R1RZXD+dHHPHg25vpigytAeA1RFNPKO1Qf8/jZE/J6SRgPiGOPqtLUjaZqMsazOVWmeHB0xP32ingypG0zqrxhcTohChSz9Bwn6vjyiw1PPjrh85cvefT4+/zwx4+Zz4Zsljco0zObREBOMjrhaLJglKS8u7sitSMc33sfPnRIx4bry4zj85DPP/sFtnIYjjyUsbi62HJ6csyTR48RjsAyh83wj3/w1/78C9X/4r/8Wz+xesNsPuDtlwVxbON7Mb1WTBYBAp+maRDCRVgxghjVWpjeEAcCz3exdMRwGDGaeOjex/Fb4jRivzEIzyGKDWVeHfyvVoDrH1KVXZ8zTqeMRgGGlrJas91IRpOU7bZDmT0GxWZ3QxwmbDb3dH2H7wcU1Y6qrjGmp20NQaTxAs3x6YC+tZG9xhMxYQR5Xn/Lf6yrHMf1qMoeY2wcE5HvJKpv2O232L6i7nJurnfEfsIoig9pd92TxGOUbSPtCtUrrF5g+h5MRFZmDFKPtpeMwpjxaEy16ynqmnQmUTIlidNDqMeq6UyD0hWFtEnCAcLVRIPk4DOKIrRjEErSUjE7H+HEgnAY0ugt42mM7Bpm04TJZEa+b/GDAGNZ70VvyeRojHQNk7FLErm0jU+vDAIPN+pxgwQlHUbxlCAYcXrymKat0E5F0/ZYKsTzXMpGcn9XIHuDjY2WkKRTstzmdrkFI6j7ns2+xnVjRuM5nVWi7RrfSei6Hm0MyiiU6smzjDCMWa9ypLRQWpEMY7KyJC8y/FBgMKge+l4SCBfPDmkrSeA5WMZC9+89Zo5Cyo5sK2lzB91o7pZ3NHqPa8cMQococnADByeVuIlhvPCpqpYv/njP6loQhvH7NaMDKqGrLBxhIbsGJQ2u5RG4sDiKMKbFKEPbdkxmUyxHUVQlXmij7RpsiWXbtJ2mkx1hYuMKB99z8HxBFPr8G9V/CMA/jv8288URcRLh+g6W23HUPsLvp1iWjzag9AGxgzb0qsV+P3ky7x+3LBvharTRNHbDpXPLjhzbB2UOaXFL2URewmDgAxpb+DRVQBAMSQchVdOT7Q9fvpZt47gO6SAkTWNOjmY4rsPr6ks8K2DszJFG0tJQtDnr/Yqvwk/4Kv4j/ij7fX6W/T5btSKOY37nd36L80dHaCwsQix8XN8DRyJ1iewlUloY3RKnHvPTc2zhEDku80FKEoBttZi+ZT5fsN1pdnuJHzvUZcnV2w1+MGJ2tMAYWC83XF3uyXYetgWu1SCbirqzcUSC0IKu6lHaQiqX7b6mLnrQ75PP7RbHtwl8i9ALcOyItikxRiJbzXq7QlmGwegINwpY7rfYJkQ4Plmds15nlEWFthRFKckzRZ6V7HZr8ipnt9+z22U0jUQrB41FVm24vHlLryxsHOIwJIqHVFXLriiwPQ8pK6q8OOC82j1F37EuM/b5jrbtDqzrcgtaY5mIpjHcXN2wX9/StDm361t++smnrO7XKCwKZdCWw5PTR3RVyapaYcceoRfh+Q5KSbJ9ya6q2dYV97druqrDEw7GN4TJAt8NWd5dcTSdMDqKGS8WPDl/hB9JtKuomzW2qcn2JW4fEO/Ocd2IzaYmr2qEa71vBT7UAhs0WmuEbf0p7sw61APHocfJ6YCy3NOqhma8xv/1FerKpm+hay2Q8lAYIRxurjaHEpn3k1msgyXFMocApNb6fXDrgK46mRxzGj9kP71gdjRjPJ8TBxNE4BPGLpeXlyjV8uGnfx2A7q99jmLD+fmMq+u3tG3N82ffxfMETV1QVA3HJ2MadUPXWswWQ3QnuL25IwhcbEvw6NHiwEG2JXmxBiEJw0ORTrkUnE5P2azvMQwIBi7FtiJJR4DHIEmpisOBuevXTOcx9bZgEE+w3Y7bZY5xeoTj4xqPZ48f84uXr3j29DFJPMB1QuqqIUlitqueILSwHYvZUQTa4+z4AwI3oJUlZbFH2AHPn3yPfF+hFfSqwLFHNHXPZHRK25UYy6IqM0J/jLYUkoLlcotWAkOHLRzCIOFo9ojBcMDV7UuUhK7tSaIBg2nMervj9vqWpmo5O36O48Hlmw2Ok3B2MuHTn75Dth6jscfdxUsS12Yw6PCtkFoWhNMQJ1gwmKS0XcHL15/juQnDYEgQBHz+y18QJUMcz8KxAgL3DOEaHj06xgthuy4ZjGYsd1esd2uGo4QkmtM2BVleEQQRXthjjKbMPRxfke1Ljk8WrFcrfGdEEh4xm80Iw57r6zVnp6c8fnTCZr9hvyk5XZzSlwVd11I1Fj/67vfpdgVlp7FsxYfffcDby0/YrxUff/QCbSQ3dxu8wOXx2YSukQgrxOpDxrOAL998xW/+5q+z3V5zd7vn+7/2gHevCyx8Hr9IuL29RUsbEStWq4zZYoiFIEpclsuMTz/9Ei+w+Ms//rf+/AvVv/0//Oc/SWcWZVXjeA7zaco+W5OkPmW1o2x6jBYoDY7wMaqjqTo818YTDp2UNHXHeDTDsjco1bI4Tsi2Gs/3CCLByfQYzxuS1RnxwMZgo2SPZ/loJZlOJhRFRTL0SZNTjNOB3dP1ObZtcJ2Ioipx7BilBFVT07WComhI0xFx6uG4AXHqs99vmM+nCMvDD8zhNNF5SFXiCEEvbbq2ou8VqnfI9zVheED7lG1B0XRsNhLXEcS+j24MrpPQtIqi3qOtmrZqaLKWJHRouxYtbWzXIYkElu0QioggFIzSGAY9wnExXseDsyOGg4iektRP6GRJEsU0vUS2OUK6uH5CU9YEliFMXLKqp1WSzuRYrk1ZVRyfeJwcxzx68JA667C0Jgxcuq7FdhTzeUoYeSjRsNuuSZMRfmAhWWHZWzQuSZoyHg2wew83Llktb4iDhPRY4AaSWTxjkA7Y5zXTo3McP6Eql9hWxyidIOyKx8dzRnFI6rmcDBomQY7qK+72OYYEma8RQYzUCmUkjmPTyoaqrAjjw3vqBx7pJOZ2tSZKY2znIG20snAcF1+EOI7B9w++t6LssB2NcDV52RD6CWHqkE4iuj5nEIe4jgP0KGNQ2nrfyNgwSCxcq+Xma03fDEimHuHQoTdQNw6Ol9CoHVWzR0qBNjbCONRljW7h0ckT5sM5joopdgWuV5MMQrBthOeijEZbBiFswigAq8e1AlzHA3p62fDX2/8YgH8U/rcI5/1EOa/x8DjuvoMv5xjtfitIhX1Y6ykpDzf196v/b8JNUegRhD7/1PxDXndfoswB2F+XLbKT1FnPZplRZYcT9fp+j+f5GBRVXSBNTzJIcFwLzxX4vkMcB0RRzGg0RilDlpdc9ReEIuKL/uf88+53+WT/T/nD/e9R2DmL+RG+F7xPFStkJ/F8j9F4QBQF9L2m1zZtp6iamuV6yXa3p+kkaTLgZHFC33ScLCZ4vkXXd5w/OGE2HhOFQ9JhzLOnR/zarz/HtTTXr+/xgojtPqfIwRc+99drqqrnydNzjmdHeNqibxtevVlxe5fRtCVY4Lk+RaHppcCmJ88K6tZhOn3C4ugxtnbpig5LC4yxqBpJLRVFsaaTPb5wWK1fkdUloTtgX2ZkdcZuv2db5KzKPeuipLMslCNQBtrOpiw69vmKzW6D1IebtzYWtlAoLekaQ1V3SFPTqIZ1tqLoCtq2R9iCoi3QniEcpZQ1ZEVJXjZo22VfV3zx5ktuNxk4IX7qkbU566xhunjOyaMX2OkEYbsEdkQlOyo0ju8jHJvBfMaDJyMGMRwdnTKczZgvbD58fsRH3/0x3//R73By+oSb9S2vv37NcDgmGo+5Wi15u7lG1orQM1ytr/iDzz4nHkw5np0y9GI2X69J66e0suV+lVO36rDeN3zL5rXe+1QtSxyEKgdBaQPH8wkPHkyo25J+vqX66C21uqf0XuGspliqJwwTLDxsYXFze0fdGGxxoMcYLCyjD7xW20Zr82dsBhaLxYTe3ZFN3pImQwyGo9Ep88Up69U1SSw4PktZ/N//GgC/+Ph/w/VbOglpOiAr77B0ytPH36WVNa7n0/U5SThnOJwQ+il1nTOdHBHFHlEwY73dMRpNUSbn7v4tde4RBilW73EyXyDbjrbfUvU7bNslCjywHX76B/8vdVdQlQXPnh7TG8l4MObRgwWq8ykyB+Fpzh6c4HoubW0zHEX0SjKfPeb+foPjKox2qOoMo1ziYEwycdltVoTOKc+ffMDbt19R5Htkn3N8fEpZNGzXG45Px7SVx5Nnx6w3W4pihZSS3X7NgwdPCMMxQlgIx+bo+BQ/EginwfNGeL7BMkPKqmKxmLDL35ImIyy7o5MWpvcJvYRBMmY2D7m93qCUz2Th8+Xrt5wevcAbNNT1Fd3dkrOF5jd+4wn5VY/MK25Wt9hBz+3NL7m6WbMrOzoZ86MfvuD29iVZblgcP2A8m/HVxZ9wc/+WZJTg+D6or4f0+wAAIABJREFUANv2OX94zPXtNa4bMBmfMknPOXsw5vruhvHwFGWt2e57yqrl/MEDFkcxV5dL5tMhsq25eHXH4mjAel0Txj1tu6UuWtp2h5ceM/Yn2H7BZ59f8+GzF3x1cc3Z+Ayt9jRtw6u3S2YnU6qqIYhsrm7f4QWCob9gMvC4Wd0QRxFYFqvshuu3b5lNzthnhwOw5/nkRYfr90SRQxzG+M6It3cXyHbMeJKSVxuwOu7ur+jMDqVt/spf+ht//oXqP/q9/+Un2ukxtk2YtMjW5uFjH8/TyCJhtEhpG5emNgTeAGMawiA+THgcgUvKZJzQdzv2m46HT11ub2rKsiSKAoLQYntd4EY2IgpxvQJHhLSdJhABrteS55po2GEJaFqPdxc7pnOD7mKM9vH9kK5z6PrDunOz3RHGDq5nk+0UrdmAkBydLJDSMB7Osa2Q7WaF0s376WnHMF0cAj0Dl6I41MKmI49WV+wLg7Fs/DDGsRIC12W3kYRGEiUpby7uAPAcSPwJVat49t0zUn9EHIEXCNLEww0cmqxltkiw7IbtusHuDJbXIluLu/s7bK8j8AZURuP7DnUrKfSeTZ4zCEIcW+CECXVnkFrT1BVoQeRNGaUes4nFZDRluy0o64oHD47xQ8VwElM3LZHv03cVz56fst3ucD0Lz+vZNLc8Oluw3PSMRhH7/R2Wamg1DEIPISp2fYbvezw8XlBWJYkbU7U501OXwShmebsHbKrtEl1e0WzeQlsyClsmoSINFVqFrHYtneVhNIRRxC7fEYUBWvcIYWHQhJFH+L6zG+uAZKnqjNBLcG0PYwza1tiudShiEIcGp54e23FwHR8njgmSENfhYKnoe7o+pipr+qpnGEwIEkM4drBEws07wdHiCD9R9HaDJQTYDrYLnaxQqqfrNIeUlIsQIyazY7QS7FY5w3SI6wkQNsY+lDQ0sqfrNUEU4zqHqUlb1Xiuy2wyolcdaJtBPOZfz/59AH7/4f+MLVpGo4jxZMAPq79KmB+jdYgQDsbob7mShxCVwn4PQTfvp60WEIaHlq/X+nMy1tgItvcVWlYIo6l2gsBzcGybulBka8lunR8OiKMJ58+ecHRyQui40Eh822GQpjh+SG9ZbDYF201OJzXX6pJaVHR1y9HRMb/1W7/FIB3w+vUbNts1toDxZMRsPqNpJZt1Bubgk4oTDy8AbTSW7RF4Y6R0ULgMxiPOzo84Pp5jLI/VRnJ3k5FvWibThwwGQ1CaYlNx9+YGq+85e/AQy7GJRjFuZJBIOivhy1f3tLphPHN59faOza5hOPbpLUkvFaaF7V1Fvu8PCDGjsQgYJBOub+5Y320ZJiM8x0fLEqNswmCMcCz8MCEdD3m9fM1NXhAkC+43d2w29wjh4/kuTVeQ5Vv6vka3kr41B46kdsC26U1D1x8a6pQGZTTCCnCdAQpJXlXUrabTGqkMjezYZHfYjoXnDakrfah47Fu2RcZys2ffVGR9T97U1G2HE47xkjlGeHipiz8eopWmkxW7uqTRHZYBYws6et5evCOrd3z98ud89sufkzU5Xb5if33J6nrJ/dUlP/0X/4Rf/uJznpw/ZjI9JhxGjAeH8obJdIYRIel4zGjkYmTAdHJGW7XsLlri+py2LVmtC7rewbbFn2mOek+SOHy4v/WoanNgHz96eEQYacrwFvOvvCRv79hmt9RkqFGJsz5Bdha2sOmN4uZmQ1U3h5DWodbt2/9zaGO10Np8Sx1IU5/BMbzhD9lubzg6mxF4hqIpCUKbolyzvK/48NMD8P//OfpviJIAW0j225Z0kCI8gyOmNG3Jdrvn0dkPqOuOxeSUq7c3JMmMvvNYbpZcXV+QV9dc317g+QeyzQePv0uQ1Nzc3pGkE4ajAUW9xQ8cNqsdcSzIm5Lz0wcUzYbZdETX3ZPXPdPBU/K2Z5/fcXY8wzGSIivJ9hp/bGMFiicnH5DEUyaTMUW1Q6uIIHJp+xuEHYCxsHDRvUe2WzMcBVzfvMbxFJ474O7+AqUh9CecnM756uXnFOWhbnp2FLLarhC2z2a7AaclDEYE3pj1+oYw8plMB5Rlxj67xfM7sixH2B6qc3E8iyiJUH2C7UruVldcXF5wd7vlxz/+DYzpuLtdEbk9+3rLdr3jBx9OWd6X3N6f8Ow7j1lXe+LFkLpTvH7zGbaV8vj5Q/L8HYMgIq9zorHkdnUDtoPvJ3zw4RPq9o67mw2+FTOZJaxW98i+Y7W+ZpimXL27xdCgMbSqYrXZYDHi6CH8wb/4hOdPf4XJZEw6cLm6kCyOhzTmgs//+C2LowXL1RWT4TnTyQyLkv3mingxAQH37zYk4ynzJz6vvnpHJwR9oPkLv/3bfPHFl7i4mKal3mSUeYNsOvJ+y3ZfMJoMaWTHOHB5fPqETb5ivy/xnDGKe3bFK+rCoanAjRR5lRM7R3zwnRO++uIV0+kRDx4fsV13dH3Dv/qX/+aff6H6d/7+3/2JUTaeA73c4uDT1ZJiLZgvbLKtZLfZE0UWriMxZotj27x4/gRjBLJt6BrF8VGIIGA8Dbm7rLGMzcnphGgkcS0bz1Nc3ZQMBjGz6QDt9Gh7T5IYEDaOk9JKj9V9xkcfL7i9vuXsdEopDY2saPuWXbbDWCBsge1ovMBmMhvSGzg+P8a2A+7urxgPhvS6YL3eYeHgh4rduqNrNPviksCPaWpFOgoQdkSrO+KpT922tKWmWJeH1V8P+1KyzvYoCwbhhK7U+G7PBx/N8TzBOEo5Pw+xvQ6tDzWcR/Mhra5JoxNubiq+/9EpTRMcQNnTIZHvsrxbkamMrsqwrQPWyzYBoe/TtA2249D1CltYtG2N59k4xkI1PcZ4rHclnVUzWARstxJtW3hRSN9rktglDDxkE2LbLuOxx2a3Qfg2jgpRliL0YhyGeC60jWAxPMdxBbfbFefHL5CZIRmEjLwZ/x91b/JzW5aeef3W2n17+ub7bn8jbvTZOdNpZ7pwGYTAAgEqJGbUDP4PSwwYAiqExMSFKCSqVFIBA1cJCalsJBuXjTMd6YyIjLhx+689/dl9t/ZicG6EZ55UDcw6wzM4+xydtfSu932e53fIVmy2N+jOwveH5GVB2RTUXcMmd5HRjLJ3MKw7FKUgDDxcN6aqJXEcYtomXado646mbrFMC893kYbgcMio2gKtTZq6xbElk+EcrU9GCExBXZ10wF3XYFrylAfambgypNYFx2NOtsugs+m6mrJOWMxm/L3/6O8yCHuOO4VnW9SpSeSCIwPqskWaDZ7v0tUlZdoxjEbYRo9oDRxjyCA6pVuUjaI3BJt8Q65qlC0oaWiFpm2ak6wBRdNWBG6AY3iM4gGmUAitkMLAtjwEFr+b/BcA/Mvp/0RZNbSVSVE0zPJHOO0UegdpyNOYv++QQqC6BlMKjLcYyFO3VSOExrB6Kkpe6l9xaA/0nUbqHtewKQ+nQqnrGtJjhu4kk5HP3bMBD+6fUeeK7dWOl1+9OsU21S1W6BEOIkI/wLdsLEtiu5IwcHFsAyE0vVLYls1sOseyexyvIx5ZRLFDPPSJhz6OK5GGpCwaLi9uubi8pigbTOkRR0Om8xHjmcdwOCTJCjbHhJeX19xukhNRJ3KoqLjd3tIKKJuW9dUVhtUTzyIc22N5vqSuM443t4xjjydPloyGkr5JcLRkGIU4jqRtGgzholuLZJdg2y6zxYKiKlhvdiymS2bjMYYp8EMXLwjwvQVVpujKhrZt2R8PHPZb/urzL3h1vSN0I3wkfVtRlYqutsmLI3Wbn3JtTYnAoKwKsmJHXTdYho80oChKbDsgiD3KMkd1JrP5kqar2e23WI6N0hrHCQiiEXXX0qgcabSkh5YkKWjaGmn4WLZBUzVMZ0ui2KdVFddXlzRVg207HLYHyqzFCaIT0jqIaXtFXjW8fn7BZ7/4S7SQzMd3sD0XYcLhsOb25oLLq+es8hVFbLEvU968SPnOD76P4XdUTQeliSddimbP9WHL7XqNKiHLDwgtqasdorYY1u9imQarbUlRnVz6WvT0/cmV/+16i039hrxmGYLHj6YMhyCHGUf/FZdX1zR1jmpb8j6n8neM0we4jotlueRpzWZzxLSNk59AfGNIFMi3herpEnhy/Y/GEfEdQX7nKfM7U7xgyWGXE00m7LOvkWbLgzs/YvZHvwnAV9/7P1CdSd0ecZ0BlnOaFKgexuOQq+srJsNzpuMB2XFLnXcE8YiqPXD/wRmmrWjUkSRtGUTv8v6HH9F2NTc3a4YTg5evf0Xoj9BCc3ubMBzNOey2GLbFZLSgKHrms3uU1SXSCE8Ti6IlSRJ2acquXdPaBVlRYmFw8ew5u1WK71m8uXrGnbsPSYoN09kY2zZJj5r5fMEgGpMXG7Jsj+t6SKuiKEr6dshgOEBaLYaMqZqEtj3J6JCC65sr2lbheDZ37o0Rsma3ycmOmvfeex/XiSnL9iQnVHuKrCHyfXw3QlgpZd2gW4uXr77izv0zrm5fcH5+h+9+70OuL7fYjkGaH1hvLikbxW/95u8guo5nr6+Q4TmFylin10ThHXa3N0gyntx7wpMHCx4t7xO5Bq0yiIchnapZb54TRxOoAwJ/CH2NKlzCUc/6tmA6mfHuw4+pipR75/cpyh27Y4YXal5frhmMAmp1QOua414jBXz9NOEHP/iQY/WcNLGYLEK6rsdzYrJjh2t0OMpndD5hfXHLYWuxalN+9IN3eX274vWz19iDnCQ/RQdW5Z79OiEOzsmqHffunTEYd1zebvjeRz9GWhnrm4yF/w6jqUurWupakVcbonhBU7UIbdHUFmE4ZDGbMB6OUG1J15bc3rRs1geO6YH7j+7x4+/87t/+QvW/+2//698zdcnAm0AdMYgcpAADl9vrI6IzeHDvDN13CA2RO8Q1Qlz3RAYxjIquabGcBj9wEL1FFJsMovvMzgTjOzGmknRVzWgSMp64CF3QNArpaKqDzWa/AbsBo8a2XKK4ojh4CFFgRQF12zIanyKZ0CZd29DWmiiKOCQrlII4mpOkCZ4nKbL0xGzWKaqVeIHF5rZHk7I8j9nvurfPLqA3uFzdYLkBdd0QOR6eZVFWFRgWQRATRwGeJZhPYibzOYO5Qzy1uL6q+ehDD92ZnN+/x3jo4fgejn2iKD18+DFnd84IQounz17hD3t6XVOnguSYEsZjfMvnsKuIHBfPsDFcgdI9TVlgSBfpSDwvoCpzBBpDuiihScoDVhQie4erV1fcPZ9zdbPmyYOP2a9SHj18H1W1HJPDiVJkeVzfrAiDIVVdYtke48EIA4NBvOTB/cd0bQ/C43uf/Bo//4v/FyEMnDDC9jWHQ0ZT9VRFRppt6XSLtMfYvo9wU46ZSdHnXKwTvnq5QQmLupNk2e5EaWoUtu2eaFPY5Hl9MuYZBkEYYJsOhmHiWhZ10WBK83QJahpCZ0S6Lwj9gNFgwHGbE1gRnukjZI/jnTR05lsu+N/97Z/wk5++SzR5xc3xAtO1mUyHjMaKOPJpmordMaFubcK4x5QuVQFaVdg2lGVDUSYI2eO6PUVZ0/QN0tOkWUWRdTR5QVeU+L5NURQc9wm+62EbBl1dMxsNsUxJ2/SnGBoNVZnxH+Ynjer/2v83NKVEKRtFxbJ+jNNOENh/zTyXEikEbVdhG/I0+u8V35j++15huwY/c/6Y5/XndJ3EsT18x6ItNPtNRd8WOLZgNBwxHQUslxOm4xjXsVB9RTAMmc4n3FlMeefhfeaTMX7gEo8GGI6FMDTjUcxiOePu3SWz+ZDJJEaIjsurlyA6BsPorZM+RPcWSp3Qrp4bIoXGsiCMglOnuT7RhOqqpW40TdNTFC3rVcbtbcrNOuVqc+T5xQWvLjdsdz03txlXuw3alJheTNp0aGlQtw1KNbi2jTAijkWHNAXj0YLDtmWzyxmOB4wHLp4psaTAsizuPnjIZD6lbSsMYeKIkOurLbv0FifWHPIdt6uErz9fczwqDNtldbuhPLTsb2rOp+/xk09+yOHiJV999iXpsaOqOqr6dC5p3VOWBUq5eO4I27RRfU3dpjRdRhxFnC0e05SauuoxTZu229HrBqV6eiUxhUvbFShVI7SJJKRTBkjBcHjGMJrhmD6DQcxgEODbDlmRogBDVlT5mqquycuWze0V29WeNq+p8o4q7wjsiA+efMiDx4/J8orL6wuUksg+ouscBuMzrHCKGU4YuTOm5pipLzhbTOk6m2R/RDUV0WyINE7xUJ4p0UbDNl+BEtw7mxFbQ/T1DInJzaagrDWmeRrBn8b/3yB4T7S1b+LPtO6xbZjMDAr/hvXjX5DXG7I6Ia9z0nxN3hR4RAzWC4Q+RVC1jebqao9p2Qj916kZ31DV0PrU1X+rXV0sx3jzlAvrz5BEGDIgPb7mWFzQtFf0rY/E4d6/+ncB+LN7/wuTyRLbNuh7RVmW+EFEGA6IgjFSahbzO7iO5Ljd8/Llr3BCmygYMZ894Nmzl6xWK6azJQ/uP2R/2FLUJ1CIJRxmo3PiaEytGlabLcJSHPZrhKGxXE2adDSlRd0mDOIFrTpyfXuFG4anxAFTIgxFEFo8+/o18dBk4MUIw+Tq9oYkhXjosd1e0nU9URhzPOxx7JA0v+aY3FAUDcfjEdUZpEmNkCVgYJgO04VLWew47Cq0UOR5w53FQxbLGc+fv2C5WFKkNb47QOuOILTJy1vQktnoEU3Zcv/BmOO+RHUOYTihbSrarieMXGxXEYcT/vLnnzOZRPhexD7bMp/HaGzCKGJ9k6BduPfRiK9e/wVBNKWvHZp2gzQ9/Djg9c2f8vRpTiMN9CHj5kXO2fg9DPMtqteAHhstezw3ZLoM+OKrp3RNyK/92nd58+oWaWS8uXiONly80KOsEhAdTVszm0558fwZQriYrs0+2XLv4ZTXr1cUeYXnuTx4cIbqUqTOsFTHIJixW+Uow+fxd6a8evYKR3rEQ5u2ThlYZ+xWv+Tq4jWOO+TswX3soWZ7e6THxiFkOYupyh7fMXn8+N7JSF4rtFC08oI3L/fcv/uYXrcUZcaj+7/OaFTw53/6OYbVYxgmZWGQli8IY5t45PKjj/92kKnMv+nNw+4aQ8/ZNUcMU9FZYywrpOnW3F0+wfIk2/QaYSoCz8MVIaaUbDYpXd+SlxVR4PIbP/0B6wv48ukv+ei7Y6rCx3IsVGMQBhbnk3NW+Wt6NycUS+rDls2252zhMRycsa1+iR9M2V/nDOMR0TBj4L3Li92Kw75EqgBT2JRlhu8E5EWCYI7RDzlmlzz76lcgK0Lf54MnH/Hzi1/h+h6DyRC0wAta5osxQgqmU4/19oKqaoiDnrPZAikMosmU2B3S5j2b4yWm1xL4I7arFevVlsEo5OOPp6y3l2xXVwRGSFGUSCOkrHJcM8IUUKkd9+8/oleSYWDz888vGU19ijzDshyqTrN89An77Q4jaDFFhpYOlQKrEBQNGFGP4zRUhYUf9oRRTJIkDMZDDNMiK3O6ElarAwMnJt3VzEb3Wa9W3H/wgORYc3V9jaLFxqHuG7q24/nLF4S+S3Js6JctQ3/I4XiDRGAY8HC55NVXXxKEIZYruE1e4vsWQVhj4rNbaUZBgJYgDJdZ7PNmneBOHNo6JR4N0NJivakIApNBNKTpGnpVYRoGruuSphmeF2JZJoYBXd1TFCl12ZzQpI6JNExqqXFNm0E0QBUK1xJ0HcTxCMsw0SpDC/CtKapp8aOWRx8/4Sa74tP/6484H2puLwImU02ZKcLQo6pqRuOIPCt48XTPTely/4nPeNxRFWBIh8UyxjAVTVORHwq0Nuj6Ck/aOKaLa5gYvcTQHpZQBE6ENQoYDkKEbuiFou8FphHSqj1N22FKG9Nwv913XdfhOqeYHtMGu3UwG4u+PyVqCAwMU9Kr/mSeMsTb3EmJlPrtyFRTqRxNgaEspDY53KaIDnxP8fDhjEnsYZkaLQz80MFmRBxHLJYLOiqU1NSloioKTNNGSIP6bVZlkeWUWUNdNW8NLy2q65CGgW3bTCYTTEMihMVoOMTzApqm4Xg8GX2apn5rsZa0fY9pmQS+jSEkTdNRlR1NV9K2HbawsB0HYYDSb3WuwiLvCnqj4bjXXFwcceQlWB2DMGbguiTZnq6VSNshrVKkNrBMByk00XKA4wYE5hl379dYJrTtKbPWNOH7H59Rljmb1Z51tueqPHKxv0Qrie486k7St2dERUjdwG61o20Un0ynfPjDj1Bs+fL5BV3dU7Z7ouGUwHBpsiN0HXVbk7NHGwotBI47xDA6tHJYr9ZEkced8zs0bUOer1GNwrGGCF1iGUBnURUFwtKAQRTOQXSke0HTW9y95+K6HvtDTqsSOnZkVcfIm5HuC5L0wHA2Iqn29MmKNBHEwxghbcoixLYMaqVIdyXCbimaFEFHFE/xfJ+BP2aXFvTaYf7gDOEZVEZMqXqs2GPiBSR9zpvVKwIRENo+gedjje/x6vWnGKLivv1jhFLoRp8MmdL4NujfeDvm14iTnlT3nGJ5T8W+ZRk0XUqa35DurhlP5rw8PsW0T+fhZntAWRXKUhT1EdHm7I8pWuiTERFORqq3L1DfIlpPpipJcsyY6YD7Zx+QJAllecGD+1OeXb5EE+EGM65unn67b8O4pukuubnKmS+mGIbJcACTYYToQ2xjCD3UlcPZ2TmqgaIrqcuG42HPYnqfH37/t/nwg+8ijZo/+Bd/wO3VLcszOO43RO5dBiMPrVvu3XnAkyff4eXLT1ltDqxWBePJGNdwOWYhtlNxfbPF8yeYlk+vewLjIzbpL2mNltl4SeyeePGvX99g2BaW3XE8NoRhRFMW+J6kKQyyJCOOY+o2IfIHTCYzblcX+N5JnjaZB7x49SVJIXnzcsViNuHmesdweM5hf2Q4HBC4Y3brHNf2eefRXXpd8vL1a2xrCDIhSY7MJiMuXl6ie2gKm0F0Rme/Zr4M2a933Du/h2lpjD7kbPmIskl5cHaforhmFFo8++ophpgQL+b8xS/+H7Th4+aSXiZYtk1TFdSNSRS+y8Xzl6RfXrN+8RLVBPRigjvycLyAcDDm2ZtfoEXGPHrCq6st9x58RHrc8+kvvmR+J+D515d4gwnS9Nnt9jRtjSsGqPbIYPiE9z40yNMMJVvKtuTLLzwcRzJcnHNMNhy2O7ygIQ4eEPSCV5/9JUwfMp+PefPZX1I3PdPJlK9errB0zvcfx0wX7/Ov8j2W0VLuj8QDh9rZY7sWHzx4j+NxT904OJZJVh1w/ID6+sB2k2JHIU/emyO1wd3FezjONYfjLa8uXvPBxw/Jspzx1Kc3bwlUhG0N+fRPb+A/+zdWa/5rrb+xo/pP//f/7fc6ZaC1CZw6HLZlUCSa4/GKTFWsD2tUb+J5Q9KkZ7295cWbKwzbJ/QnVFXP44cfkWQFz5+9QdoVu13FYnHG1atrdF+SZRUNNtL1cJspi8ji/vkDJAHDSchsseST73zI5kbz5Rdf43od+0PCNs0o8w6lWuh7TCRdXyJNi76Rp+LPjFEdlKkmcE3KMmE+G9KWDsLQNE1LGNp03SmQHKkQ2kMKzXQcUhWC3faWvuvoGsXN6pLDoWI6cxj7J3fmbPmEMIpp+w15ukNgYvsmjuVTZhaH5EgUOgir5bgvEIwwbc2zl19Q2rDZZgwHAZ7tUdYVx6Pi4bmJqyUP3rmP7bhcvb4miEKqrMFzevKuwxUtRVIxiJZU9RHDUhRpT5kr+srFMBrMzqHuGtKmYrXeUnUVg+mAVikkCYEnaXuH0BuyXrUICqpG0BQZtu0wHMxomgLXN7h49Yrb2wuW5yNAoKuSNsmxpIXvRTiWT56t8cIaLXuSQ0k0cujqDc3BQPcmvdehpYXRmwzjiDTNvuXU102O1j2dUvQo2vqELZVSE3ghBsYJr4tA9Q37XUYc2SBa1puENKvBqkHmGJZA6RIhLJSRkWQNv/r6mtVhRTAQ5KWmBlpV4rsOphRopVBK0zYmvTIQysezbXzXJg4DhtEQ3/Whbwh8HyE1uhNY2sSVEtcwcC0baRkMz4bUlUI1Gt/1gB4pTEJvSFE0ZHmB742oy+5kDhEmv5v+lwD84eIfoalxfBdVNcyLD/D7JQJJ15/00oZhoLoWdIchT+5/3Wu0Pmn4WlHyM/HP+Xr3GWWaUqY5ppZYBowGAVEQYPQ2Aotg4BBFMYbpE4QRhm1iex6Hfcl+W5CkFderLdtjSlXXdE2HbZr4noPv2/ieTRyGxHGM4zggDEzDBg1No0jTnL5vaLsS1amTq1lruq6nblq6Xp1Cx5v65FYHqqbCFj2DwMawAdnRNS1CGVimjWHbSAOqpqRrBC4SrUo6wDYtLNum5aRdV9KgagSmDIgGMZbt0PeasmnppUU0CuiFpm96kpsV5X5LGEYMB2Nc1yXrWjZZQ1FIqtxmc9uw39c4lkPg2hiWyfh8SjQas1jO6bodf/5Hf8rhujl15QKL4yGjzgvAoG4NtOmyT0teP99R5N8UYSbDYYzQHW1x6jZXTcIgDHj44DGT8RTT6PA8gZAK0wxAaHpdUdcJQhi4vsJ1DbpOk+ZrDCEJYxutFbF3hmeMub3Zcjwc6LqOqi5J8hph+DhxjBO5NM2esrskK29x5GnqNFyccza/iydcpNVTFDvqokCaJUmyoSgOyKpkd3yDH4fEzoD18Zq+rrCDHjyNbZjI6kCZlTjeksBYMswfQa+5vDnQtCd06Skq6hQjJYWBlOItHvikwda6Jw5d7Dt7Lu79CWW1pq4rpGGSJjllnpOVCc+uvyTzE2bFR2hD0SnFdnPyT5ygAgagkUKe9qeUdJ06XfiEwXgy4Oy9Ac/5S0xXo0RDnlV02sByYpquYDgMefTn/wkAN//WP6esDni+j+No3nv3fVa3LxDaeiu9KDAMl8FYsLnWnC8/5uPvfML9+4/48MMf8N1Pfsr52QNU45HlO54/f8rN1XMePniMHxo8ff6+rzysAAAgAElEQVQcwwpRqkV0Ph88ucfF6pfIfsx0vqTKOh7ef8ThUDIMh0xnj7E9zWF/xHN9TEPgeQrVSH7yG79JVW1Yb28JRxGuNyGMHMJgQHrMGYYThsGcXtsIqfACk/0hQeJhWxaW3SDNmjytycodpgN5nnI2fYLnuahO8eDB2SnKMSnxPIe7d5YMwjGmlFR1yZvXKW2tyPIDebalLhOu3+RoZbK453N1s0YpH8/raY4SC4uugsfvPMJwFavdmhevnhN4S4bxnLrZ0AuFaYHUNmVSU5Q9VZNS9zlllwADkjLF8yLeffwjHn7ymGAG7lDT9FCUkrxYkyRbiiRjMInB6DmUF1gOJMkVu/2ad997j6pLSNIU3bv82g9/QjQ0uHx9hSEdhoOA69sLkqygVSXHfYbrWtR1hugdBCZ3Fw9IEzC8kHgZo2TK7fUt3qBGmA1VnjOaSkRlMo1GHNY9nh9gBzXr2xVD+x6LuQ+WTXG8pWhayr7DwOR2dcNh3fPTn/w6t5srJrMZAgvVefT6SFEfWZzHvPPeI3a7ijzPARfVCVwnoqlqutri3/t3/t7f/o6q79hcv7nFtEy0bLGdUyi0NEwGi3Mcy6SoNMfjNX4Qsjvu6dqC4XjEPkkxyEkTi3/4j/4p0dTECRV/8mctvueyOqT0rcAUNe88vg8lLKIzrlcrfvzTd7m8fMHYlczPhvzs0+dc9CnSviUIRggFYdBh9z6ZqblsEywb3NxBmjZNn+PnIZYR0asK26swHJtdVlN1Nary8AwPx7C43L3h7nJJXjZkuqCqKuIgomltxvMz3lz+ksXdBZZb0e1b0Bmj0RLfMhjPJTj32LYFQ98lySVp0UHjMz13cUKL0WzO1VXNelfTdQWHY8tkZpL3Kev9kaIp8b0FV+srtNmgO8k8tkmqgmEg8CY7bm5zfuO7H7F3tphBxsS7x6vVFle6fOdDF9lnuN0Zr1eX1FWLYyssv2Qc+ezXOfPRmKcvr+kNfaJ71S9YzCdEo084Hr8mDAVJYfD4wYLVZkVZJITGkNvrHMcuuLx+wXw+ppcts9mEtq7Yri9Zni15td/StGBKGz8yUZZgfSgYzwKGTkhd5fj2AHdqU5Y1xcHGUgLT6cAEzxrj6oqiamjrBGH6BG5Ame0QloHvDZBaI7XD/nB76ox7E0JfIkKPtijxbI/3n/gc0g1u6NN0DdL2UGlF294yGPo8eLKgw8I0IubjOa7QWIYkCj1s06TXPWVV8+bqDcLJ6HqfPFOE4QTLhapLMX2DQTQkOWqUylhMZ7SRwrFj2rbDkBZV0VNUO7a3lxRVeZJodC2mEBySFh0LDKMlsB1MGsbzGb3uqIrurzeeNtHSw3JCfpT+xwR6eRpHdZITHFSjlaarm1ORyilpRyKRaIwe/jj5P1nZX6F1g++62JFPnpYgJPtjy+36Bg04rsNczeluNjh2QhRlKNXR6/7bMWzb9qhOMRoNuXfvjMVyxGw2YDIaYdunmJled7RNT5E3bDZHsrzkdrVjs96TFyUXlys0EsdxkG/1tI5t4AcOuu+pm4ayaU4FCSfjjHBcVFFjWSaO46C6kroqsaVF354KWoHEMiWmbeK7c0ajGMex0EIztARtU1PXHYcEdruE7fM1lmlydjYnCkxatSdJbEbhAMuzmT88Q2lBJVz6xqUTFoOw4v1FR55ITDFm/D2XXmd0naKpNU3T4cUhVVVTb1K21Wua9CXSHSPMmKEHVrfl+mpNk2uEF9EqAcrB92IspyMe2IzGY5JdR5tX2FrjdBauYyM72Na3WFHAdDDH6GoKIwPLZZ/UrOothqxBSw77EguFUorBdIDhBBRlhylneLaB7Gzee+cJWZpSVwLT7jHMlqKsUGVGH0Atalw7YDZc4rsjVJsiuz2qFPSGcwrkd218Q3A8rAlcF982OVYrcAS3t3/FVhjYgYvhBrhiSLG6QhgHLMthPL6H6XjorqFvBMK2EIZEyFM3VSPRaKQ4ZZvSa6BH9xJNhxSaQezjuB1l3SMbiy67oTI0XQ1l2ZJrm8nwQ4p9Sk+H7F3apjoVvvqEWxb6G+PUW+OW4O1/85QIUFUdbZ2xu/kCU4z55PsfcPVmjd2NaNoCPwwZ+fLbbWuZAVl2yXDoYRgG11eXqM5jn2+4+WzDkyef4I7X7PIVDz7+MZPFGU3jYFgdh67k1evP6VuHNLk5AW46sGPNarXn/Xe/Q/24Z3+4xDIHDIMRr69uuHrVcHanpMoaLOGxXW8InQjHWTKdhVxc1LTqkpdvrnj44BNc16CtBW+uLvGCdwgHIHDwXYEk4+LZBsux6aKGv/rya8bTACEkula49gDfG2E5LW+u0pNkoh+xGIYc9j3vPLL44sufM/TPePfhR9T1FqUTwuEMQc3F6yvqDh49eMDq+ngi/XmC0fB7HA4prer58uu/4JMf/hDDrunqNbPJiKpYYcUG2hvTGwVpVdGVe159/YIodHnx9QuevPsDzs/vs95d0HU+wvRIshs+eedjJnP42c9fIA3FLn+O48fIWlAOWkLD5bjrSaw1s9EZvl/x8tVTDCNA2TV/+C//mN/6Oz+iyo7cHF9zNn/M6irn+fMvENQM3CEIh+MmY3e84b13vs/2NmGnWsbjO3z6808BzfJ8SNUUrFcrdC9YLt4lLWpm8yVSv+b6ZUrXmrQ6ZTq/Q1V+jcbh+vo1qgr5+dPPGczuMg581usL6tLg5e5r3g0X7NYb0iyn7SX3l+9RqzV1UfPOk4iff/ELitpmIQZ0IqNjxWQ05OfPf0GSFkTRkPPZhO998Al/9cXn1K3J2d0l6SbDKIp/k7Xmv9b6Gzuq//3v/4PfM9wWw+0IogBtGNRtRdsXJMWRvs9P3S/tYjseZZHStRaOPSbLd0CPtCRmAIfjlqLSCFNimJrdYc84nGBaNs++fkmveoTZobRktVlxdZXgRS1p3vDm9S37fYWi4O6jEXRnFIUkzzOePLlLW4AqDKg6HGHR1CXvvPMBFxdbwqGBHwG9gTQspNHQ1C0Cg/4t71lrj7xSJ91qd6QqM84WI7brDaoUBK5JkhSY0QQZeAhjQJrcsq4LOlPx+mbHfOwwmE1Zb7bMZu+gTYvPv1yz3h9oVcv+uMGzRuxuO4YDwbMvLxhMLFzToUVxvTtimzVxGJEcNfPBGNyWi4sN88U9OgHToUklFart+GRc8zt/x+F7P+x47zvgmQWPR5q//59O+bd/54xelrj9GWjIKoUWLVVa4/sZ+bphOZ6Si5Sr7dc0raAscuJBQFm1VG3LYHwfTUpRNjRdTqcrLCumKhqULui6FkM6JAeB5/rE8ZBDsqJpa5KkRACRF2KYkKctRZHhezFaajzf4dG7U169WIPuKIuc0SSgrm2UrpgMpxTJqWs4jP1TkaJatOqQwgahaNoTi15ryWDogThRkGxXUjUtZZkwHkd45hDROAxDh6EfQRnS7HvqJOfl01suXq3Z74588eUv+eyzr7i9TdAYtPrkUo+HAV3XcDxk5GnJeBChW4VrxBhCInSP6lpGw5iyOnJMblC6REqTKPKJoxDbthgMhhiGZjwOGI8jHMvgfHEf25FoXRPFNj+5+PsA/OHyH9K2NW3SsSwfM7RmCGm+NYBwypEE2qbAlALTML/V16E1dV/ytPwF+ypF9zZCSIaDgLPzE5J3MIzwfY8ojJjOJpimSdd1+L6H6hWGaaB6hUZjWfbJoIZEdR15XpCmGUVRk6T5Cb1omtiOh227GKYLwqDXmr7vybIMpXos20ZKiVIKw5Ao1VGWNVXV0imNRiKEpO9BCgshTJruhAc+6SkLEALbtrFME8e1cV0T2xFIo8eQGrQiz0uSJCPPGzbrhPUm4ZiUbHcph2OK6jtG45jBKMT1JYORjeX4qN7G80McP0IbmkbX7I8JRZlhmi7D4dnptxsLHPdUaFtWzyD2sE2L2zdb6l3Cg3HEbGyS65RNUoCwGU7uoe0RZQ+1aDAsQeD6+J7HYjHFtWOqzKZIeg7rHeWhwFAGA8tlHs1ZnD9hGI7Jb/Ykm4SutzFNi+Sw4+bmgiwpaOqevMg57iqk9qmqnCKrOGxTkmz9lnHv0aNQVESxx3i8YLYcEUQW8WBIj0TrFsv0kd2QMu+xTZc672l7yTZdYdsmTVoi2p6ut0iajiwvEFbIap/z+dOvKbqaVgmE8oidAKEUqoLjIWV/SJG2SVHndFsHbz+lrEpuVwWdMjHkW+7wN258oNfqrTZVoXuwTIfl2QBnWGA+qHFkgCwFqi95fdgjvQmT+YTx3Xssz5f4b+7Rd4qiaMmzlpM2SaKFfMt3e6tRFSf08De52nEc8/jjOeX8JbPI5ubNK+rWJI5Nvv/eb2OZPdt1z6NPfxeAzz74n1kuvos0HWyrBaVRyiTNEgQ1RXEgzS8p0oK+M/kn//if8PL1BavrLU+ffsn6dkNV72gqzfGwJzmULM4kSfKGthEnGYyrmc7G+J7Jy2e3LO9McX0DYa9YbV+QJB1eYPHVs59RVT2WY7Hd3BIFE5bLM4o2I8kK6G32+xu00XN+b07TVfi+zy7ZEEYDrm/WNI1kMhixurlhPpkzDM+Q9pbd7g2L2R3uLN8jDGImsyHH9IaXL2+Yjh7j2D6zyUOyfMf17hWzs3NO8ytNUdUku5Kz+ZjZHbh8vcJyJVm54bA1ef+DR1S1QugB4KJFRjzwSI4ZhtkymRv87C8+oywbHj2eU9U1tjnAdU1m84DVTYZpelTqBkXBYvwA1zYYT5ZM4jGW8BgMNF2acXY2P50dhstwMD3F39UVi/mMlldMRuecn93j5YtL7t6fk6UNUTDhfPEEKNF9iFAFea4RbkZHhTQMlvMlh21Jr3csFgtcN8DzJZ3q0NpEyI7B8CSlUOpIVTR89ukrZosRi/kdtquCOB7Qtlt8M2Q2ifHjEbPFmOv1mvPJIx49vsfl60veXCfEwyllt2M8fkQUT0jzgmgkOR4rBkGMgaBMEoaTkOMhZeQv0UrgGBbLxYDI9bh4+QapfR6/O+Pi1Q02EbKv+fXf+P8BQvV/+P3/6vfQirrp8FyfPD/iRyZNW1OWLaat0dqhrnqEbLi+uqXKe0xH41gmdW0gjQ7PM09yeOXStjVdA20h8fyeIi+xbJe6a9nsrnA8j7IpaGsD+ogoHDCIF1RNz3ZbUjcVaX4aO6RVy8WbDaou0U3Dcukh3Z6m93CjirY7Ypj69Hk12JaJZVsYhk3Tao7pnoE/RpiCLEugga7pePzgMbIOSFRNIyyOxQ1+5FC1BZPJgMsvb/CEYPYw4nBQSAGqKLhdFfRomk6Qtw2H5IBp2Shl03cmdb2jbRPS7Mhmd4tSJZhQtwVd3eCFJek+YxyMaLucyTim7wc0ZclRZyhR0GcN7wQ73lkqrqs9Xz3d8OyLA5OJxfd/PGP5yONf/OFLfvY1jOOQF6+vsRy4Ox1yuKgYTwV3736H7bri2YvPabqc0WCJEBGb446qKhh4EabR0vdweX1DVdc4js/1zYpOlbi+xWqdkCYFQvuEsUlZlNxcX2OZNl0jMAxJ3wEaOmXSdQ63t0cQgu1qQ1OXGMJiNjo/Gd1Ch74b0PUJltFwZ3afKu9QfQpaYlkGvusihct8PsSQEtOEyXhAliUYpos0XFw3Ik0y8jSn1xVSe+RJy8WrPRdv9ry5uuL19RsO1ZZOwea4pugqykrhmgNG8YmwlRcpbdOSZge6vsb3PHzHxbMcmqpBqpN57ZT72J4izdLkJEKPhrjOANu0yPMSKV36XhMELqqt8GwP23ZYr1dsdhcYtoFlefz04j8H4J/Jf0BR5vxa+u8zbu/iOhG9EnTdaUQspIHQoNri1Hvq3/LKBTTU/N/FH3C0V5zfGTKIbabTEZ7rUlcd+/2RqmrwPA/TtKjrmrqpcV0X27a/JQGZpoFtnUbk4i0DXBgmTavIi5rNZs9ul5FnLYdDQZrUHI81lxcbrq82XFzcsNnsqOoawzAJwhjLsjAMg77vUUq91RuezhqlWvpefRu4rulP31fByY0tUEqg+5PJxrYc4jggigOi0CPwLUxLY7sSL3Bpu4qqKSiqnPV2TZbnqF6jtaQsm7fPX1HkmsOxZndISfIDq82em82Wm9WB7aZkuz2y2R7JS01ZliTZAa0dpOHQC4MgHnD/4QLbPV1MDGnyy19dkesRyzvvE3ohSdqQ5C1FecqGnY8nBKaJoXtcWzAdeSymI2Zzj9H0ZDjzgyH2MGLT1gSTMYZtkyQVXesgtEuVlKj6JIG6udqz3XXUpUvfWjR1Ta8UqlG4TsBoeIeiLMmKjOFoQpYnmLaD78c0DazWCXnR03bge9Gpc68tXEMiu5q2qSiahKwUTMcfMIiGlHlGfmxpjwXVesvZKObu+CGP5u+RHBpse8B4NKDISzabHXXVY4gI1/OxHBhW97l79Vs4tnk6Z64yemG91Yl+k50KCAWiR6u3eGAtcR3J3bse3lTS3W1OAJC2JA6GaGmSZSWOIbi9eEr+UnFffIKJjWlKtusMtDypT74thU9LcNKn8jbD1XVdxvcC1MMjVacoixxbKFQzoukr1usN0pQ8+vQ/AODzj/8xWXVEGpqi2NE3DvfvPaTpKrTesduuqWuDLz69JhTfJ4oDvnr6FQ8fjvj9//GfsVmtCaKMT3/xJxz3LaN4gOO2bHYXnN+Zc319S69CynLP4XjLYOCT1yvSBO7d/ZCm6RiNI2y3JysOhHGANnPqSjGfjdknKa9vXmCYDk1VsRw8wvFcDNHy4usrDmuTTz55zM31DdPxgu16zXA8YXEnpm1bGpVwcXmLHw8Qpma1WdOWp1/OdiRdW1AVivl8QRD4fPn051RteTpbxRmOFWHbAaNoxngUkWfw7sPfZHd8w/WbjnsP3mF3vOBw3OC6PrP57BSFZQrCMKRTR64ujgSh5Hhco1uf9z96zH6XMh5PMU0D0zbArKlLC2FkOHHIfHHG9e4apMDzFhjuCZnbakldFkgCPE+i+pztTY3vOxSZ5M78O5iGSVtr/NDAcuCzv3qGoKMqXO6cn5HuWqKRQ60aQn/G7eo1x92Bs8UDoljw6uUFQWBhmi51JbBti3ffeZ/Li1s8X/LyxWse3f8uZ2czrq6fkWcZ89lDRmOXm6sbwoGH7kqQDoY+XfKn4QjTk9QK8jKh7zVny8dMJzPy6obQCxkPz2iqlOFgwL2HY7zAx3EFx+SaPEm4s3yX5XxKHNsUaUrkz7CNmDKvWM7mNOUtg0Dw8Xf/dhSqf+Po/+6dgMifslod6N8WmkXaYgiH80UI0iZNM0xL07QFk8kIQzoonWCYHrHrEcSaquwZBiPWt0d8S+C7Ea3ToulRWmMbIWVZ4HoBFxdbRgOP7Jiz3605HMYEQYjnObj2AK0UjteR5xV9XzGcj+mKivNRTG9V3KQ9g+mIsj7w/zH3Jj22pPl53++NeT5jnpNz3rxT1a2hq7rZDZIyRUuCABHyxhBgwJA/hDf+APwAXhmG5YVWhu2FDBiw5YGQLZoiaTZFsgd2d4237r05T2eOODFHvK8XkVXyqjcmDAaQqzwHiDxAnPy/z/95fk9/MEC1GoYwuE/usT3YbrfoukvojcFTxMUKyxbsPh9w9c2M8d4Bmu9xfvHA0cl73FSXjPs7FMWW2SYmMEfs7owwLcX1+RzNMsmXJQshGO4ZVKXGpnqg0T1UU1FsC1oZYxoOwpGYvs/1Zcbu8YAibajSmsX1Fk216HaIXgr0UCLshs8/O2N66NCzjrh6e0/tw/PxPZEm+dUlmLZOzwvwRjbhtM//8L+9491r1Xlo90e8+eaMN2+XfPrbL7hcJExOXU5P+6znitZ+oClqPL+PymN2emOMxmP05ADLUFw/LJgvcnSzxAtc7h8WWLZJlktef7VG0w0MIE9XZJlASoFQGoHnUGYSs+0hm4plssa0fW5vukNGvCk52NvFd0IGuz3yvETTDFRr4vhbssLoMEpmhuua2G6Ahk3TNOiG4Ohoj7pOkS2sVgtW7RLLNciLJVUjaWWfMAi72jhhY7o2si3oTUKUpojTFDdwqCvBMIjY9wbczR8QNQz7AaKRJKuSXn+HKPRJkrQbNmXJcOqR5DMCL2TcGzIenqBoWSc3xHGK49iYjoZpeKRZhWw0etGQRlVoOmy3KVVeUOUdi7WVkqLWkFrBze3Zd89dVRX0Ix+5lZ3f07BolUTTFa1sOz9jU+P7Nk3ZIBvZrUoN+Kn4Y5b6A3VRU1UQ+D5KGpQ1VJWO7w/xPIuqyZBS4fkBut59DQihoesaaB1VoG4lVd0QBt6jBaDGMM2O1dq2LFcpt/dLTL0jEGiahmmZj+lshZINRVkAAsNKUSjqunmEqovH9L9N0zbUdfsdaP1b5bVpJE0r0YWGYzvIVpJuM3INsjRnm7j0eiHjcUh/4BH4FooWKVuapsc23bLNUiZFj6YRVKUizUrKoqLIC+KkZJumNK1CKvU4EMnvBqLugCQwTJ0kvUEIgW3bqOYeTYf+MGAdV7y7uEcqA8eJ+Obuji+/ukQCB4c50/GIuirJ0hRDM0mTlrYuGI8jNGl2BwRb8HC/Ism3OJ6LpveZr7esqhTd1JH5Z7w8PeTweMr13Q2fff4L9kbdP+Zi41JuQu7XCZpeEPgeEkmv5wEZm82KJJZU7Zq8LIhXUJcFjr3l4LBG0zXOL8/xQ5fheEhRQRD46FqNVpvsTgcsiyXNVsNqTVrpUQGbrOVw/JSd93vc359TVDlvL2/pjwcoXXaKZLhLpkpcq2A4csm3NU0T07QZt7cLdpX+eMjSH1VM7Tt3alcDLBGahpLdAU22CqhwHJ9+bx8pbqi2D6TtFndgk6clXq9l4mqoVnBwuI/v7pCqX/Hs3T9kuVyh6za11BCaRJOKrsAaQH1XSfytpNvUNVX5WNOMwHIjnu5NycqQXG2Zb97ybPriu+e2FTVtU7OY5QyGfdbrNfbDDMMCKft88P7HrJOc/d98yU/+4n/l40/+AX/nNz9gvTzj9/7Rb3BwsMtPfvYneN6AMAInqJBVxHT8HvNZwmjwhKbNWSxWDPo92qYTitpWJ00rJrv7bDYpy2XGk5OXZFnOdlt3Q44xpOWO1998ST8aM+0/JzwdsN5es40bPnz5W1zdfUG8FPSCHVzXYjgMiDwdC4uySlBC0g8jsiQFu4+sEqywwXd9FqsNmpDUVcFycU9TlTw9+R5/9bOf8eLVp/zwk99m3D+hbFJsW/Lmq284eHJMzz8gmqy4v/8Jrmvz0SfP+OXP32F5NcvkC/b2dzENjYuLW/b2d8msN6gmYn/vBWEU8uabG1A2Z+evGU0EdS2YzVccPhmgJyMsYXD57g1NLSiyLfu7IY7fJ9L6ZFXM5fmS4VAi84KiyBlPQ7KsQhNdm9jVzQO9gc1me0OVm0T+E45PD/AdlzTNiAYh0cjnq29+hWgHPNk/ZT6/6xoUpYYwcxppcTh9wp2cYds+97cLdCEJrBE/+I09Vg8Gzz/0ubq1kXrC7f1bytqirgwMc4wkRrcK0qxiuUwZOh6L25a2VuzvDmjaguXqV6xWEb2oh2603JwVaPaKv/z5HR9//33izQZd09jZeY6qUzarDccnTzAE9CIX1wyxo4yvvlyzWtQgwQ/dv5kp82/g+rWK6h/8q//u92+ul9h2nzCIHjEyAs9xMYSBG/SQxBi6hq4JDFNg2w6WrRhPXW4WOY6vMZ9vMHWd8din3/M5fzND102EKWgahed5aJrCto2u9aWtMTQbYUCVa9zf37FcZAjdZLMuEegkcY0oC+I4RdYVRdrysEjwBiGmAFXWbJMWTW/IipQgjNA0iyzPMGwLIQxoLVAdOPv+fo5tCHzf4M3ZG16+PEIYkipb0CMkjzO8fp8kk3i2Il7HqMBE4lEnEsuHotzSFD66VlG2MyxlUtUllq3hR5L5Q0pbOgyHfVxvhGv2ufzqDl23efreiKE3oB+MaTCoCwm1CYWF1eth6RovDw8Z+QaXqwLdinB8l/nC5MuvJX/4R3cUdcjiQaFpLQfHI1ozpB8Y2DIgDBz2nzusVhltvUG0JU1msbs3YHazxBQaB4eH2LqPpbUEYcS7iwvC0CWNW/KswbAqFoslda0RhS5R0GdnMkW2NZt1Ri/cw3WGXF2d4bkOSoJluuQ5bLcl/SikLBTxOqMsSpJtQts2FIViHS9QWoIp+oRhQFVINASu46KUYH9/H8cxWK0WKAnLx/vwXI9tWtK2isDvoaHTVBXDfo9eP8R8xFSVZUEU9ghdB6PVGXg6rmORbjOiaNQNV22L7fQQhsW2zqizAt20MC0TU9dJ4g22b6PpOp4bUFVFtyGQFY7tUFVlFwxDQyGxHYtGVlRqjRRplwKORiyWM/KqRGGy2qzIypi6kfyTumum+lfhv+jA0/anTIMjlOwg/k3bINumW1E21aNns0SpjgNZkXOjnZG0MWVZIFtBVYJpOo/KqI5pOghhYeg+hmlhGiamYXXWAgRV3Q2IStJV+tZN570sS5RStG1LXdcdxkVTGKYOApq2W882TU3btgAopaFrVte+JaFtQcpuAFGPSnBVSdpGIdDRMB4PPDqGYaPrCk20KKlo2wYluwFIti15XlCVFUJ0w05RNCTbkvU6Y73u1N14U7CNS/JU0jY6VdWi6zqu52LbFpohyIsChcBxfYRmgN4N24YhMCzQDI2irCirEk0TjwGkjCwvWMzXzG5XLBcp6yTlfj6jrFN2JiOGwx2EYZFWNWXd0iqF1DSEaYFpEpcVynIoleDi5oa8krTSYrHMyLIKyxIM+h62oaEkpPGGu9sHpOhz8uz7aLpBU+eUtSQtM6QuycucqkgpqpIsrTFMB6W1xPGa7VKRLAzyLCGJM2YPCUVekmwSbm5ntKIhzbYs5hlKegyGQ9IcFnHO56/PuLq5ZrlYk28Vq9UdSbwgTSRXs3uK1mZ//wjdguWm+0wmwwnpdsvVxR2yVeRVxSZToyAAACAASURBVN38llKVbLKMkXeCPdtHYJPlNQ+LjJYuxAQKlELTOzuIoKtMVlIhUAz6HtN9n3l5wcq/Zniyj95AWm3xRh57wxFa01AlBjYBA2OMcRtR1S3zeUbdSAT6d5Ws31IyNAHfAgEQYBoGoxODS/dPSRc5utRJ6ppCrNCVh2Ea1KLi2U//CQDXf/dPePH0NxhNLWbzLb3emKzoCkvSbUWe5cyWd2zWMccHL8mKnBfP3mMxW7IzOsDzbJ4//5gf/ehH5OVtxyTWAwbDAVJJ5qu3zGf3PD/9AXsHuxRVRhTZNG2O63vM5yuur68wDItkU/L06SvOzr/h5vYBwxEYbsnOsIemdAzD5+TpE5LsgbOLM6xgjWbA5dUlLz94j9Vmxd7+MclKsjMZcz97R1nFJElKVThoZsndwz22bnF/t+boaJdesIOphaT5DVdXF+xODhkPTJJNw2L5mvOzL7i4nLNY3JDEM+bLGZtVzPnZAt/r8ebsS6IwIE87y5CpjRju2FxerJhM95jsBuRFxfXVgtEkwnEsLEcxij7g1Yd7fPX15zhWnw8+/BQla0Szhy5TNrMFQprkcUpbSfpRBE1JXpbsTIfkxQPzWYKuK+pGEkUepmk8WmYcokHBxRuN0yfPefXBM3Sj4uriAcv02ORXXF3fUNc1n37yPptFgcDCcCRVK3GcCtmaeJ4HyiRer9jGM05PntKWBXerO2hDdHvFzc0KJSStNOmHI7bZFfGqZDQaYVkmV7OS509eoFk59aakaRSz5QzDVBimpMhLZg8JTWPTHzjUTcvBkwPSRGLZElmBrXZ58eyIUb/Hv/2rf0M0CjAMnTfv3rDZpiTbGtN2ujDhjsfp6d//26+ollLSGwW4XkRZKdqm4ul7h6wWa+5uYixtRV2mVGVDrzdkuYpxXMV4Z8wmucMfOizXMUWhkJ6NUCZ5XnLy9Jg0W2GaLoZRo+sVQWCTpmscL6IuO4xNb9SnUSVB1CcraxCd8mKLitFAZ7mwIGvpH3RtDHUGaRbjGC6B56JUiWFqSAzCfsR8tUToDiiNuiwxSNA0nb7fYxRM0FFYKPpWn+u3M7wdjfGuxdUXM+o6Zdjr40c+m9UVgyggkwKnLwjbHLvXAznFs10W83uydYgIK1qh4XgDqnJDGPRpi4qmKig3OscHPur9U4o2p2pjNAym45C3P3nHzs6EwLco4paiqbCDgK0qeP26IG1N9I3B/sERtiF5/3mLfx1zfHrAF+UDdqRheg2OzHi294yBHVKLgvP7L6hzQZloGMLm5MShlnDw5Ijp/hjdcDj75h29SKcqNAwrJol1iqLFcVziZUmyBs/vVCdhrlmuttRlg+tZ7B+Mubma4Xtdb/RynqCbNvG6QSiNzTpjGI1pG5354ow01Wlrp6tG1SXVAjw/YZMIBr0pvuvS1jAc+ijVUhQJjicwDZu+sNCxybKU8dikFTqaVrNc3pOnkrqqmY6GSJnjmCatkTF7uOZo/wVCU2RpQlEqNNOmTBu01u5qMZOaoirR9AZaF6kqgsihTcH1JxiGwSreYIkcQYJhdIPYajWnaDIcV6cqM5SyWG0e8EIbNzA6tFSmk8RZtwa3XbZpwWgy7hKm2/a75252m9HrB2SipDQK2lYg0TE0nYYWlEQ2LU1Td5WyqkUqxZ8Wf8CDuKEsalzXJQx6yLZbdxuGhtJaTEuBapCAJnTqViJ0gVSKqm6/a+UpywpN07pKVSVpmoaqqjAMAwWUdfk4kD52pSNom6az1mgGTd12vmIFpmkiZTfImrqG6TqdgqkUuiaoqgLLMLFsA89z8Fy3QwipiKaWbLOCZJvSVBWyVZ0FoDUom4bZbM7DwwxQuK5NGLhoukKpDpWlaxZ53oHw67qlqiqk6uwMaAqEwrJcNK1AUqFUZ7Hg0fKghEDT9Y5mAGzTGCUVruMgpA7KAAOUJtFaMHFQ0qARAtkqdKEwDJMGjbJtqGSN3rRYpo7rCxrRMtjZwbEtirwkGAbkRY6ha9i+hxQaZQ332y3lPMZenhMs18Txiu1qhuOYCNOm3xtimw1K1SAKsjxlvUpoZcvB3oDT9/Z4mC04u7hmPk87JJooO3JCY7DarGlkw2TSoywkD/MzNpsU3x2iiQZwyfKWzfJLdC1HNzVMq3sP2PzlX0G/F2D4sE1TvrlYIAyFLGrmcYrt6fiBzs39krbu6jydVUUU2azWW+QjG5jH0goEXW5BaJ03tW26diphYtqKmf5z3o1/zFA7ZH1xw/YmZ3yyj25tqdY5opLYVcwoOkCmGbIVFE1XnUxbo5ldaItuF9HRBB5tJ99u/yVgmAbhyEEb9mnKkv29Awzd4fU31wRRj0bE3z23Z+/eYbkhVdXS60eItuX5h7/JTz/7Q66uLxiPpoR9j81yi6Zb2GbBn/343/Dpp99nsym66tIs4ebh5yw2X0Kzw9H+c7b3DkqruL+/ZW/8ikbmvHmz4JMffIBQWyRwd7ckTWscL8T1fVwr4G52TpYXfP9Hr1gnV5yfXdJWJr7ropspRZXRFKDpCde39zR5jyfHz/nssz9DNjbT8ZjZ6oKrh1+AkAx6uzjhnKJ+QLMOmMfvUEVL1DugVTplU2JaDkEY0bQZaXrLcpby9OmPiHotq+UKDME3b39Jnq+YLUqm4zG+P8QJSqr2hnfvwPcDdsd9otDnsy+/wvZDFvFbEAcoSkbjkLK+Y3VpcH+bcXykSDKdq+tzmvGAJ8cOV+fX7O6doBse7cgnKzw+/vgTajXjYXNNnTa4QcRmM6MsGg6mJ0S9kM++/hnDwSGt3FCXLq8+PCZNt3zwsSTeJMwW14hmyqv3PwJR40cOcfya0cTgZz/7JUUc8YPfOuDs4p5KbtgbPwX5wN1VSRAZ7B/scP6m4WF2SZqU1IZOrn3G/Bc1g+E+rmfy7u0V0+GIfm/E9c0tWe4h14rI9yjzJe5QIPSKcqtx8uSUOFmipIUX1Eg9Y5WfI7YtvWiH83eX+M6QRjWks5inRx5t7fH2qwu+99FHOP2AX/78Hb2+4Pp6ReAHNCQIwyDN7b/ZafP/w/VrFdV/8S//q9/PqyXb8oG6LqhrQVNq3N/dM96JuLx5jap1emFAui3Z5iWaXYOQLOc5UlXoUjAZedRFhi4kbdMwnYa0SqGUhS50sqygrmqqOqeVGo2s0UwHYUoczyZOKhzXRzdsyrpAF4p41VI1JdPdPklRUxsFugBDj0jKjNDZRZaKpukM3KVagVkipcBxLGzDoG4lg70ps8WcbZqwe7CHUl2Xru27tEud0+Mdbhdrhgd98ljn/nbJtsl5WN5xODrG8wRW5VNrDlm5oixz/ACyOmM02gcgiVM8N8AxHAxN4po9NFWQxCnhKGK9XbBeJOiWRZYmTEd72P6AvIanL0YYrcnh3j7xJuXpy4+w3T6tqDG1liLLma2/YXr4lDRrOH12QiUvqMqCXWfK3X1CqhUk5S2aKtneWvT9KaOdAe7QIoy6ENts/sDR0YAgCrm5zbi4Omc87JFsJE0pyNISgfvIOWxItzU3Vw/owmO8Y3HyZBdNdIpIFPWoK7i/3eD7EfEqxxA2VdmyWKzQdQPDAt9zGQ7HmLZCSoHnBewdBKyWKbotQAPZChzHJs+XWLYiTbeUdcLukY1iS7/v8sGH71NXLXlaEHg+091dBsMIWZVouo5pCKTUsEyH4TDgdvbAZpuRZjWa1jK7v+dgd0KvZ2NZ3etPpvtI1VJRIHSNtlAEvs/D8oZWtjhagMQkyWKk0DAMF9dzyYstm80KobkYhiBNuzBRsW2hdGgrnbJqmC9XJNuEItdQtcF2U/Kf2P8ZAP+T9p/juHCoPadv9tFtA1kLZCtokWhCUOU5Siosy8Y0DdzIohhvUF5DXVdMdsY8OZ0w3nGJei6OZ6JpglZ2iWbd0B/Zqx2vsqxqdMPo8ECiW8vbto1pmt0Xhf5Ybyl4DOZAXTe0TYsQOlEYMZ1OiMIA0zAwTQvXs7FsnarKkW2NaWjoutH5YvOCtlGURQOyG3ZRgiIriTcJVVmT5znr1Zp0myMQmEaHydN1OpuFaVLVNUoJbKdbU/mBzUffe873Pn3R9ZqbBnEck+U5dVt3yW7TwDAtLNvAtHU0YdI2iqqqaBoNMB/9s53t4lvV2LYdAr9DcOm6hmbYCN2kkQ1NW9O2krYRVG1DXhfUZUlbdQN+XdfoQkcXGkiJqQlUqyjTmrYSNLXOapWSFRVS6WzTgjxroVVYVoPjCxzfwdAMTCFw/AjNdDENFy/sYds6vb7F/sGIfhQyGgwJQh/Pcvl7v/sP+Y/+6e9x8t6QJy+eM5nuMhqMOZweEkURluOgCR9T89AAQ3Sq+XKe0dQtZSbYJi1K6RRV86iuW3jmlP3RlDAIqFSBcOBhHjObxazW92h6jWZ6LFdb4jihzBUX7245f3vLw+ucZ87HJFnCYpmgcEHTEUrSgSzEI55KQ7Udo1cAtmtw+vSE1s7ZjF9zF3/G1dtzttkDWVoSqB5N3EJhMJk+Ye0rim3GTn2KY1nM7nOKSiA0k8c2gf9XhapCSYlCPnplFaKXcT/4cz47+5rF9gbftNB1j6SKyZoFoTvi9C/+AwDi3/u3LOMrHu4WDPohF2/PuL1ZYzseZZEiWp8nx98jcKcU2RZNc2hkzNm7CyxH8fBwjWtHuM4E06nZ3/+QpnS5uHpD1Ndw9H3a0mUTL3HdEV7o0VQNX399yfXdjKfvHdOqCqVJqqZEKgPTGoJqOf/mDts0kdLkvVdPKUr48stfUqYFO6MdDF3j9MkTLi4uca0eB4cDdBmw3r7GNEyQFkJIHJuucnu+JXA1DD1g/+CYs8vXrLcLXL/Py5dPka1CtoLjoz32Dne5vnqLYfjkzZZNvOD56Qd8/OlT6iZmPB4jyVje25y+GPH6my86xbm85u4mYTDwGA0jNvEdSbJlMAypqi2r5ZIg1DANC8OuMAxF6E94c/4Tjo5OqeqU+V3JoL/D5d0XFGlGnjX0BhG+rbGK78g2gsDXabMeWbEkzzOi3pDLy6/ZPzhEyor7+3tm8xlFrjMaDhB6w93tnKpa89O/fIfjNyxXKetky3T6ksOjkNvbrjRhGJwQ+XtoZsl8PmcyOUG3BLsHe9zNrzg8esbOjs/tVYpru0SRgyZqZFMjC5vDowOqNCXwbNo2RlMNd+crHHfIaHoCYtsVWdx/Q55n+JHH3eJzstRkZ79PlmRskxmmHfL+02eE0YbZbMHR4Qmlqrl/WFIUEsNuqduMncmAJEnYbtdcXV3zu7/zT/9WKKq/dlD9r//5P/t92VhkqaJtBONol+UsxnEskFvCcEyyWXJ6ckRVWlQq5+A0IN5UlJlG5OjYmsfOIMTXAyJ3jKXbGHZOVYGkxvUdDE2jqipMR9DIiloU+L2QsmrZJjm2V5BWCW1joMQK2ZosHlL6wYCmrpCaQZ0aOLXLwZM9sjqjXZW0UrJObtAdiW4b1LWBa0dU+QbVSPJcY9ssqeoSUYHr22jKYbusqRsQdY1qGuKtwh24zJYLnJHGaDqEqmV4YJBVPtk2pnVdsvKBumowdIM8b0Gm+FEHahd6hkZFXbUcTJ7h+DpJXnJz+w2OG2DqO2gN5GmDM7YY7vSxjJj72wdszWKTpERmwA9/5zf55S/+mnTzgNO3MXwXO+xO0UW6omdFLGd3vP/qtxiPP+SrN98Q9LeYSmccPWXv8CPe/+QYiwHxKgZVsI4b0krg2B6q7ZHnFdvFA1WlIdCoyhKUQ5VpmIZOnhYs7kr60RhTG7JNYuYPOfOHDN1qSLZrZrMZAh3fN6nqFF1EaAIsS7Cz16F8RuMQ0xJIVROFGuNxjyDquHVZBpoAw9QRqmEwtLHsFt008SODWszwHAfftzE0i9FogO1oDIYRulF1ayHXRiExNBdLt+mFLsl6zpPjXVzLZmdsEjk2fW9Av9dVA5p2Z9dI8zWj8ZSGmqredizLwyN002CbJVR5TIvNKn6gbgs0Q7BcL2hlRd2mbJMC2zbQdI1kk5Oua9JNhZKCsigJooB4G+M4GqrRoDT4j+3/FIBfnv6P7O2HPOgXfJn/W278t0TaBL0xKdqMhoJs2/l0+70+wpJ8Gf0FVS9lb3+PzWZFUaTfDZuGaWLZFpqu4bhdPa3reTiu1zElAdOyuhCT6vyluq5jGAZC07AsC90w0TUdKekUR6V1vnHbIvBcxuM+vchjNOrxwx/9gKPjY3o9n/7AJww8/MDD9z1M00ShaJoW01RMpxF7e2Ome0P2D8YcHIwYjQL6fY/9vQk7kzGeZ+N6JkHoMJn2ODza5fhkj5fvH/DivSNMU2e9SmgajTRtWC1Tbq+W/OKv3/DmzR1xXJFmNRKwXatTXIVEAkrpKKnTSokQEqHpaDqgaqSqqNuKpmlQtLRNQ5EXlGWOlAolWpQqMISFIWxAoXSF0CTW41BaKajbLjxWtxWtahC6BsIgy+vOI9tUgMK2TFCSumjQVXdgaFsoM0VVGdSNjlAmg8GI6WTcdcpvF2imRs8f0As6xd+1dSaTCcfHO0x3HLI84cd/8Zf84vMrshKePJ3wj//xD/lHv/cjTl/0EbqGF5j4UUJbVmitg6og2VSsk5LVtqBsMixTI/BCZOXgGz0O9oZkTcLZ+RsaWVCXDbpShFGA6wTkSUVbmJ0yqjVMpgP6Qx8vtNmLTjgxP0SqFoRJUeqg6aDabhEvOs+q0BSyrWnrzqdqWrC7OySRD/zp+f/Bdm3y8uUrNEvx+vUF784vWCxT1mVNbhRUSU1cLal610TzZ9zdpNS1QDMEgobvgluPlKlu9d9ZTDRNI9gVrIZf8u6LBTuTHRptxeWbSzbza15/eYNr7PO9r/5DAP7v4/+S1b2iF/S4vpixyc9AOZyefsRktM/t/Rsur64ZRCMWD3O8IGBnZ8Rk32F2nyFbSZZXBKGHZUasVh1o//pmju9ZbLMLHMeibrZsc7o2qOEOmpXx9uINnh+SN2vyqiIMRqxWc1bJPdlKx7c8HLfi6YsXzBYpZdZwdLhPEEQITbCML7m8uWA07u6zyHp89PEPWKfnaAx5/vKYt2/PKZuYd+9uqKuI6f6UwDlGNwZsy1seZjGv3v8Iw0qIl5L9/acEvs3Vdclk5wnTaYBSLut5w2Q3JIh8qnQHKTWKvCGOt/hej9vrJbpmc32+oBf1aduaoojJ0hWu4xOFQdfU1ugI5dELpwitQLYhT58ecnZ2jm3b9Po9tnknpmiGIE8zJrshtiOJFzV5pvHe8/d4+/otrh0w3XmKMDRa1ZJsU+LkgsuLGfsHp/i+i2m1ZMWKuqrJsw2TyR4nhweU9Za7+ZrBrsV8niJFjGNZuGaPzaqlN1RcXFwgjJq35+84Of2ATfrAYvOAgcfB5BUvXk64v73HtgKOj0/YGYwZDC3GvsfsasXZ5RLf65PVEJgT8kJ1rXbNknip0TYlQs+pqhTPep/p7pDZfIUfjukPA5Zxio5OXdTMFyVxdsc8kYTuhNFezsX5NUmypCwL9nYPsQwHP4j4/id/O5qpfu2g+s//+//i94tiQ5E3mKKrxkPAZGLiBRr9QcjddUIY6QxGIccnT5gvzjiZnvL+6S46DaZh0pQ+/YGLYbUoocDsEvu2rZMVCZsswTA0+r0J69UNw94R6TZnu0oYDE2UaPF8F81MSJYGhqkIwobVumXQjwgcDVOTXN+k7O4ZtMWcw+kTkmTFJs7wdwySrELg0ZY6qqlI4hjPCjB9C12ahLrJ3c0DcRnTsiHQx0QHQy7uztk73iFbrTFMmzAcYxYVhmsQbwTbTYzuQl3EmI3NIBpQ5ClZlhNqAd4gpKolRVLTNwwKpVMkGaZV02gbhNNDNTZ+YGGb4BouVSu4uL1gEPj0gj66GXC/vMDfCXjzxTW9vqKQDU2ryOWW1SJj0DMxfVhtKtxgQG9XcXs3w7AzlNgynzeMp3uss3fkRcLZ2S2WsyXqaTiBy93DmrY0EKphsboiXSssy6GsY2SjsVyssG2b/sAmjhOqWhAGAdtsTbHRqdQaVeuUKsc2I+YPkmcvpwyiIcKqCQY2ZWrQqIbj93pEoxJdmMRJDtR4vsHONAIjQ2k5/UHU1Y1OBcFQkBZr4nyDboDltlimS1OMGQ4jVssFF2/PKbd1h9KpK8pMkmZbXK+g35ug6wamUzE96NHIlCKHo+OI3elTLEcnzVLcIKBqulS9YdlEbp/bs3sG7hDfHnE/e2C+WNAqibRsirpBaQ15WVHWFUWZkKUalu0wmRyjao02czBqEz/sszvZwXYt9nb7mMLB0E36Ucig5/P0dJ/fnXep/z/y/xvqTENWOkGvj+t6zM0Hvqh/wdftT/m8/Cu8JsIVNroteN3/OQ/cst6sub+7xvctnj0/YTAYUVQNTQVN3YWJ6hoa2SXfy0oipaCV0LQSpTSkgg5lqiNVtwZtZectLatONQSBrut4rk/gd730lqXRtDXLZYxthzh2j6++/JqLi8uuElkYWLZDGIVMp2N2d0ccHk84PJywuz/m6HCXyWTI4eGUJ08OGY/6hL2QIPQJIo8oCnA9twtsGSaWZaGkwvciNKEzny2oqgLN0EizgmRbIHQD3TLQDA3TtTAsi1ZC24DnBAR+iG3ZnS2C7u/6VlX7ljTwrZdRqa4xrKnrx4FedZ9h0VDXNWVV0LYNuhDohgGaQBgatmvi+TaOb2E7FpZt0bSSNO9UYtuy0AyTVgnKWtJIQaOgaFqqpkUJ0AwD0zDQHm0eWZaymc+ZPSwoKrAMn1oqpC7xQg/DtknznDhOub1ecD9bkqYpdzeXLO5uoZHE8Yr/64/+Nf/nv/5DFstvcN2UnusTWgGO1JBpxih0Ge+MmI7GGLpH3Uh0JTnZnRDqLZvlnNmmJdkqfHuAEIrlMkFVFuvlFjfq47oGVVWhGljNC8pc4LgmkTnAW+xT5i1lo3doqkc/6rcreU0DlKStG5qqRAmJJjTKIuFq8Y635Ze8/WLGzeUKWZn4nk44sBgfTPGGDlmZoZqQHXeP5K1kWn/M/WxL1XYsVqTR7fjFv0v+o3gkS3QFMEbYsp1c8+rVxwRuyPXVNyzmkt/4/t/HdQXbMuaHbzqs3E/e+2ccPjng7cUls/U9u3tPODjs8TCfY1l90q1CiArXM3jx/AVKLHh7dkOeV2DGqEwQ9l2u737JapNxfDjh4vaCqskJhy1hMGGbLXC9HrZXsd7c0BYmvtuDNmM9XxIMTR5mAktr6VkeJn0mUxO33/L67EvK2mE8HPLVl68ZRn083yW+f+DgeITQwTAFh9EEWw8RpuB+nhP2HN5+9Y6PX50Qr+/wvCEvX73AcUZs0zXhYJdpNGASjagWK64v3nL9cEuapvQ8l4fFHGHYlJUiTmasN0t29465OHvL7c2a06f71HVJELqMd4YcTV9xfHhAvk2RIkdWHs9fPGG1XtOqhMWiIttK7h9uOZx8j0qeoRHheHB3ofidf/8HfPbFn7NcrHFcnVV8TWDvAIpke4+SFctkSdSbsJonvHr2Q56/f4rpWZgqZFssUZog9Fxs22EyPmZnavGrv/4lh/tPccyw44a7LsPehFq4GHZLVdQUco1lJBg4NMJn9yDg4vJLyiZDGSnD4TGbzQJL70Hb0ApFkZj4nsWgv4NuNbw7e03PPaTn93GjZ7z33ge4RlfHfbt8TW/0kmikuL87x7T7bKsFQgTs7u1S5gUfv/87+EHAYrZmMtpFdzes1zMaIG1KNNNEWTlffnGGbmls0zWLecazpy9xXQ/VtASRwe3dGX/nN/92KKq/1qO6XaV4vsEwcog3BXlScXh4yHq9YLhjsUmWTHcnlEXG/kHEchsThjrrZYUphxSVwHYcFtkWX3mEgYETRKxWOtvlHfpIBwmO6aDIWS5uccwJ+XbLNl4T+mM0Q1EVFWlZY5iCMLIpMzDslvG4q0v1lIFlSZ4/H/PD3x7zh/97gu/vsni4IBorRG3j6Bqu63B7fkfoGbh2D9cHrbHYJhtq1wC3R1bmVHWFbqdoGw1X+NxcrjDNrmN9vY6RZYZluXimie043M2vcH0Tw7JI8hjL0uhFDq2C5XqBpbukQmeWZISDKSiLWZoQhhNoUoo6RSvAM10WywXmwMELPVpNkcsY13I4errPYr5CkyV527DJlrSlhqThaLpLlUt64x57zwbcnM+5eZPg9QKidsD+3pSvyyX3D3foUhFfbxgMfIaTCTezGa3sWltqkfDlV7f0A5+o12e2qahKgagc6jLD6NtUtc90d8z+ROPyPuHwKCReFxyf+iweDOrMxOhXeH7LarUhsUp6PY+2UkQjyW4QcXO+oDeI0ESGZWn0oxE7UwfPd7m7TwBJEJW4tosftggKmrrFsWwGQ48yMakyyXp9y2buEa9TJjsRp6dPWK6zDqVSSWws0k2BZ7dMd13qpqWqa9oGTk7HgIYwCgYjn5PTl1R1wWdf/xLHa6kyneVqjW7qNI3OeplSNjkCg7LMCMI+lm9Tt4o6s3FNwPCw+wZVJvj5j99RVRmTiYWoJaPeBMc36UU2dWMj9Izj4YSmapDCYDHLv3vunN5Ol/QvKpqm67tHE2y3G5IsZbNZ84vgx3i+S9vW1LMWTdMJQp/ecAfT0NjEJboh0TUd07Yeg8wGRVViILAsp/ME0g1gbSupqroLOqluDd627XfVrAqFrumPHj5JXdfEccJWA6VahABD12mqmru7P6Yqa5I4xnEcHNvtmoD0buATogvHtHVHP+gUXI22qVFKYhg6UsnvrApN29kLWilRUj1SCgRKtbRKohsWnutj+xF102DqHSA+L7smLN00sB0H/duaWbtrOsqz/JE0oH1nZ/gWnSWEhqHp6Hr30wXJGpSmPdolFK5uoBtmx3W1LYSAoiio6xpQtE2LkhLTtXFdG9dzsMwOP1WVJVVZ0dQtVd1QVmVnHWjld/ejCYGuSYQoKevi8Xc6rutT1grddui72oQUcQAAIABJREFUFqbhoOka6XZLut122LG8xNANhoMDdlyHwShgvVlxc33L1dmGH//Jz2irnHEYMprukKk+0u0RhUOiqGF0tGU8HHJ/veHs/Bue709QCKIw4OhgxNnb11ytCoKTIVM7wjd8rm/XpGVFIyVVVVLc3aG1FkXeYJkGvb7DJq7Q5ga9HQvHNEnr7BF/1rWVfUtPVerx6KAZ3YJedYUWhmagGkWaFSy3KdHEoWpalusSN9OpK0Uer/EjySaWZPIdX1Wfoy0cAv1T0DoclqbrSCHR+HfA/m+9sd+u/VGCfjTk5W//Xdbbe16/+Us2c4/Tp/tcXJ3TG7g0Kv3u/aI94IsvzrCDip7hMFsk0HbPzpv1Z1iGxvsvv0+a1CyWG5K4BmkSOn2inSl//M2f8zwwqNItUld8/faOnYGPkDoy67N3/ApTXZLm9ywXCX4YUdsZN+s5fs8iyRdUmUG9ThnuHXJxd4PteqjGJy1yirXAnPgUmxlPnoxApEx6R9gClvGa3eEPuDj/AyZBy0H/UyKn4uUPP2R5e8un/+B3eXp0hMg0Cssm3pwjq5D39qa0dsbtzdest33+vR/9LrPFX2PebNg7OuWLb17z0asnZNmcto7AMGmMkrbOeTLZ4/b6c4oiAwUfvHqfzz//AtuasXhXYrkhO4HPyfFTru+/wGhNFquS/ekLLAd2hxOkseL6/AbHFPR6fRr9HU3zBNMRpDEc9fa5uf8zkDbJJueTT79HHG842j9hubpjvswIbJtN2uBGGVUtCfw+wjBRVc2LZycIofGzn/4xbe1SlbCJb3h6/IpGZpzdX3ZlFUWGURf0fZMsGSHthulxyt39hm2xpK4lFg65cQnKwLSD75jAeX3D6zeC0yefsi0WeNGIn3/9R7jqKcPpA0W2xNAk15czeoOXPMy/RrZj+qOALC8YTwN64THJdka/v8sf/tH/wu7BCb4fYZgmVw9LiqzHzmBIv6/z+a8+ZzwK2JkE1HKJrGt2Jn1Wq4z3Xx1zd3PJ27OvqMpfOx7+/3r9WkX1f/6X/+3vU9toWs3Ll0dYlkXU0/B9C1MLuXi35KMPX+AZHvF6iaDBEkMGQZ9PPnlGvE6ZLS/oDwxGgz3ybcnZ29fEq5TQtyibCl0X2JaLbAqytUFTZajGJPA1olFAllUEocPHH3/A/CEhCDWkbNF1k2hgMu5NKVOTxWzFZDqiLFzyYs3uMRSFhmnpbBY1vdAmjZf4bucjK/MWS/t/mHuTH0myPL/v857Zs913jz0yMjNyqaqurt5bQ05rFg4hkCAI8KYF0kVXHfUXzEknQYKgm0QI0AgEtBwEnghJFDkYsWc47LWqu6qrK9fIyNh8dze3/Zk9Hcwze+bSB4mHMSCAQHi4ubm5mdvXvr/vIok3S2zlEeuMXOf4JoBGMqkW+EYQKpu0rEjzGK0zCl0gFQhj0xQaAyy3K2oailJjSwl1TSfoURmQCroyIK/br2BLKuKspDENddGOhi2jyZKCXrDHsD9ila3xAgdTFmTbmNFgwN54RJGVhE7IdpUhZYllh3jOAFMkDHpDskwSdDrEy4x+9x6bWcpw7DMcH7DNJ5gmQyddjg4O2RYpebJgul6y2TakccX1/IrAH5CkmpvtHMvRlGXGeDhAl4p7D+4BNhcvrnBF1Eosygps0LkgZYMuLYyV4oUZYSfCODE691jerGlEgxc0BI6NsQpcT2OpktVqge85FNWmHcUaxSa9QikLnXWRODR1jedIAsdn0Dln0BugnIZ4u2Qw7PD4g0eUdc4mThBSYXspq1WKYOc4ryRKebhugNGKMBiQFhuMqGi0TZ5XvHrzObrZ0tQF8+mKaODQH/RxgrY1qT8YIWSDriyqIme7TXZu5BxHKEJ3QCBCkuWW/VGP73/jI06PRjw+P8XNDT11hC9Dzg58Pjnpcfd2RqVt3KCH7Ub84fLfB+D/6P4v2I6H73VAKGzXRyob3WiqqjUUQoPnuyjHoz8a0h32cVwPYyS6BoyNrg21gTTJSdK8HWvv3P26rqlqTYPBiBYQsmMD/SDA8dz2x3VBtoYi21EIKXdSAhfLsnBsB4wFxmrPyU6HwXDAaNzn+OiQwaBLpxMQdn2EhLqpdgkEYpfbKnbjdqtlS5Vq9bCWhXJsXM/F8zxc38XzfcIoRLkKS1nYysd2AmzLoTZQ1nUb30VNbVqHP7KNH3rX4y53ObHG1DR13dbX7gC7MQbbtrFtG6VUCxZ3QLZ9roVtt/tAKadldWlBt65KdK3xPJd+v0/UifA8F8dWNHUr6VktEpazhCTOqYoaIQVuoAhCH9/3cF2XwPd2+ts2jL6uDGWhKfKaooCyhjTPqJoKL3BbmVFakqa6zXatG+q6NbUpRyFsSZplzBdr6tqwN9rn/tk9Hj854+H5PYIoJK808+WG28mcdRyjVMtYu17AarOl1poodLCEINnmXN5MmK0z+qMhQlrg+Zw/ucebl6/JsozBsMugs8/d2xnxpsT3I/YOHKAhXmvGoz6B9hnE9/HcgBqHIn93A2JakxsGYxpawJ9RlW3SROAroi40YUF47nB2b4CyDaHvslhOWW9iVknGplghPZtCp1RiQywWvIqfcZR9sz1eJbRZreKdVHW3tCa/9ylVbsbnyZ/y5S+fU2WG4+MBuqrJ8i2bxQZXjPj2y/8AgF98+CcUeoulbOrKJk0y5vOExXKxO+dKXr+a8s1vfp3J/DlV0SaW5HUOJsYPQlZLQ1zUdIIxp/vnnJwc8tnPfsXpWcDFq1cU24T9gw4WHQb9Pnl2xWbxgsV0i9+VnJ98nb7VoUpLlLJYJCvySlDpEMf3iLwp2fqnHBxm7D8oGe65BE5BpXuUVc5i8SWP74fcvn3G5vo5X774GdVyycm9J5R1yk9+/Be44Yg4T0jynKvFBXldY1cluDmrZM2Dk6c4teFb33lI37HZvPoCV6dkUjJP19hCY6PIpcBog3IK6somSacspyVJLOn1Pa6u3zIeRe2kaHLLfLam0Rad7hDLEmR5zGabEgUnKDvgk2+cM19ftMBX5KyWGd/85DukawXGwVEa01j0BgFXV29xvXaS4jkRgz2X67spUvhMl8/YbiuODg6x8BDGJs229Acuq1WKUhaO4/H8xUsG4QHhGNbbayKvy9npB2BtsRvIZzW13aYIeD64Tg/HNyymKcY0ZGmCRZ/jo4PWByEbXr99zcm9e5ye3seyG4YHLq/fvuD0PEBYEY+ePOLJo0esN1sGo0O2sSbwBkjLUFYZSnY4vtclzaZ0On225S1pPKfY+hzsj9is1pw/fECepwS+i3ICyipB4LB/MOTTn/8SIRXbtebgcMx3v/U3o0L1twLV//4f/7d/XOg1YaToRGO2yRrlKD766Lu8ePUZ4cDHGEUcrxge5njePt1hOza9uLwgqzKcUGK7DpPZhkYo8qqiOxwgpYU0DZaw2WxXOPYIictgEOIFiqxIKXSD6wrOTu9T5SVVUXN2/4CiMCg7YP+wT+CHPHhwQpLkRF3J6CDkk79d8ovPnhNvK2y7ZrvWPH30MWWmcJwOYdSGjj968JTFWiNdQX/PIvQ8uiLCVhCbFY6GomzFksoVIBu6vR5al5RpjoVivUmoTY3rOOjMYDUW3bBDXbQXRdmUjMI+elvjO0F7wbcUvmwzMFerJco09Lt9HhyfYzRc3b1lb2+IrwYc7Z8z6PtkeUm3GxEvM4b9Y4TwKKqKsozxbcHh4RHrdIu0HXyvQ17GSNfQWJJfv3rOcpvR6w1wXUljldyt35JrCEY2VWNTa0W+zVHCsF3XnNw7oRPtUaQSKRr6Q9nmok6X/N7vfou/9/e/z6c/fkXoKfYPu8ynFQQpnYGN5QdIu20QapqaZJPQ6wyI3DGuqxkNThgN98mKHGk3BF6XunKJt5vWdKICCq1x7D6rZYZlZ4yGY+a3W6qqze0bjkLSNObs7B5BGFCUmrfXM4qqZL2dUDfgWBGLRUJRrVitZ6RbwWZTUFY5thuwjR2Wi7yNPLm5IC9ihv1DLEsxGEocz2KT3iLdGtt1qXRNmkC/E2AZg6ccmlJSpFtM6VPlOWkcc//skLN7h5yOe+xFfY5PHhF1e3zz61/ja8ceq+lLfvzpr+gcnPL0699msLePH/h869XfA+AvD/8p6TZjtd5SaklRNpRVgXIU/f6Qvb09Dg4PiLodgigiDEOU6+B5Ln4QtCyfcjCmPQaDMCTsdFrgJtiBQ4Fl2TSmHesHQbgrAWjBWbMbfyr1G7BWliVN0/w19jEvyhbkImlMm4ApLUGvP+D45IBeP8ILHAbDLp7vYFmiZRYdhVJ2y8Qq2YJS18EPfCzVbp9tt6D1N3pFSVVrsrygMQ3CgkZU6KbNqbUsgRAt2FS22rVg2TtA2YAw6F2xgKPafSSlfM+aStmyu1rrXfNUC1arqkJr/f5/37HKza6twFY2jusAhkpXpFnKZrOh2KUkOK7C9dsL5GDcoT+M8AKFEe1nG8dZWy+cpDSmotPxGY4jur2I/qBHvx8Shg6O27KApmmZxywtSLYZWZZSVBl5kVBWOU1jcF2fMOzieR6GBmm15qQ0bWNtxqNjbCdES4nl+oSdLsfHB3S6AWVRcH15ze3NnLDX54OvPaLT6ZMXmv5gzNHJQ4Z7Y7I8ZbG8Yz5bMHu9oZhvCZXAtQWPH53R63lkyZa60rtYMZtuN6Tfl+iV4D7fxHFDtqmm2UVFtQBRAhIp2uOsrkp0Vb5nmue84Rfh/0kQ2Sw3UxwHxocDesMQ6Rj6Y5fDo320hqos2et8iC4kDw/P6S3OKYqWrX/XgNUGqe6KJppmF4PWPpDVGy7FZ/i+y2qWYhFQFjmT2yssAeUWfvfuPwXghwf/I6t5iSUjVsuE67cxyvGJ+hZVZXB9uHjza+KNQdeGbTqlLCTRaI+Lm5cs1ymBFRB2A4a9PZ4/f0ZTt8ec6wSttlrXjAcPiXoNz17+gss3MwZyv01LqCK8qk8tU55NP2edvMatj8GzkG6F2wk5sm4x25cM1ZhNKcmTkC9+fUecWhyfHDJLN4RqiB9qbpYzLNsF5fDl2zXLV5/z5//PD5k0DmBBJQkih+HhkEenZ8wXCWkiGHc9hmHBLz79OZv0hs9/+gzbH5IIieM1pJM78lgwOj4kCh2SbYauQBqXtxfXnJ6doCtFqWOWmyVFaaHckLRa0gjJ0Vmf7dawjK9J4pL7Z+d0OxFxsubNmxcE7pjJdMmwP8K2HRxHMBz5ICuKTFJlHlURYKkEv+OSZAlpqvniq5/QHbhE0ZA0WyCNYjDqkhcbVqst23xGlgi+9c1v8+bmOet1RlV7HBw4XD+fEgQ+8cbQCXrUzYokLyjrDFN7WNJFV4L1ZoXv7tGJOogGBv0Bv/z8K1yvz8FJwM38OdtNDGWHwLfJyphttmYyzxCypq4gT20OTkKu726p65Jev0vVLLm72wKGum4oKsN6WWL0ChsHXSY0OiPwQxAltmr171liuH//jDhek2UFngebtebh2QcUecb3v/uP/uYD1T/5n//LP9ZNhnAqtKloyBnv97l8e4UlG9aLNaaSnOwf0e9G2MIiju+Yz95QpBVSFFBG3L1NSJMNfuhRFxZFqilSELpCSk3gDtBNgeMqbNdhs10RdgZtZZxymU3W5OmGqoAkTnBdF619gsigtU9elAzG0B02zKYFP/vRG6azjHhjUaQl3/rWA4JI4/gZmzglz1POz89o6oLKZAiRYQuDshzeXk1Rdoipa6qsJhp0yZOcotAYy2M13VJmBZ4X0uv2ybKMwFM4UuJJj0Y37A3HKDeg0gVZkhJnOQPVJU8zjCPpR33qsiHo2Eg7QGcF0m4wjWC12tJY7V1+XN7RNAqsmsUq4/j0Hq4nma5uiYs1aVrhBRn3T56wXGRM4iuMtLm9ntAdOFwur9sIHTFnWxR89WKKbTccjh+QVQmXlzGjQY/pfIWQkmJZU+uEwd4xrtfnFz/7nFKnCGnRHyoW1yu++bUP+Z2/9RH//P/+F3ie5PDegMV0xsOPjjk9eszdfEkvjNCVw2aZY2nF/Qf7eKHBlApL5Qi7Id9mCH+D1gWO1wKo1SZFOoJtmmCaURtDhCbfVljmEEt4OA6UJaxXDdPphG26wrYi3l5PybKKMOrRUGBZEVUZoByHsiq5d3aCEA1F0eB4HeaLJZaSlEXJchGTFyWIiqKM8ZwBrt2nrqEqM+pU4DQ+oR3S88dk6bqt5EWRbUs8FXCwd0gUBIzGIVoLHCuirgW1yVFhgGV5XN9M+eWvXrCqe4wef4/Tx09QfoCQFqHv8/SL3wfgqw//FVK6WMrFdX2U42DZbRh+0wjSJKcoUipdvx/TV2VBU+v3Y/myKtp4JMvG8T1sZWM7rVRFWC14lZaF4zhEUYSQsjVWmZ3b2rJadtUPaAzvR/fSkrt61XZRjqIThTiODaKh0pqiqEiTguWi/fIDiWU5OI6P74cIocgLTZKm5EXRal+bhrppKKsKXdc77aAEYQGCotRkRUWpa4RstbQtoGxoTKtLbtuudhvWgG21jGyrZ20NMmEY4ioHXbV5r1L8VflDy7BCy66+A6jvgOy7x9+BWiH+qmSgRlqSMAjo9XoMBgN838cAWaaJ45I8N1SVoW4abEfhBy5B6NLrdQmjCN+PUHbY1qFuK9arjE2cUJUagcTzPMLIp9sN6HV9okjhd2xc30dKhUGi61YqkWdZ26S12VKWbbRTWVYgDMpVrOKYm9tbtnEKxiII+hgUdSPwww7DvQO6gy6uLwjDkL39Po5vUVZtgsN6fUNdpzhiSCAMtsjYOzvm6ccfMfAVn//o51xdLqFRbaKDLNnb77JZlaRxQzEz7FdPSJOcqrGwbKdl903THmu70H/T1FRFitENlmXT6QbIXsqt9yWWEhwfnxB2IrJqw+3dYlcZrDDCwvcsslXKZrNiOApwmhDr+gBpHBCtDrnZ1Qu8a6gy7F5/x8DnImPS/QKskvVKkuYxt9crkrjBUiVFbvi76/8MgH9S/hckZUK81djKZrp8hbEK4nXGfDnH8zyqPCTNcpJsjrB8kmbJm7dvmU0npHVJJ/RxbIcPzz/gq8svQLTmnDof4ijDxeVzfPuIIHR49eIFs+mGg+HXuPfhmL/40Y84edQlczZsiw1d+4C0Lgi9iKdHh5BeYS2/ZNwb8+Qb3+NffbkhqyLePrvFDV1WSYHnj+jtRWR2wmZZIsyADRHSpPz4x/+aphlw78EYL4yIDBzZPiYYgmX4+Wef4sqIy1cvWS7WzFeam6Xm9MNv82pxxWqdMOzusVxWjEanPHl6yHS2ZnI3ZbPKefTwGzQio6gShnshtu2inA7rVcnZgyMaUxAEfXoDj8Ws4eR0H1M3uOEa0Yy4f+8J19cXjEfn7A0Pd6bWlMndmqKsqcr25vLy6hVSWBwfn/DV6y/IsgZbWQRRQFHHTO82dLwIVzlUtWaxecVmu6YbDXG8Dlm5YbNpc3KFU9GX+/S6HSrb4v7Te5SJ5PDoIfN1yng8YDFbUeSauhb4Xo9uOKTIMpqmpCxrBr0h4fCG1TLBFQMc0+Nk/IjRSPLDv/hT+t37CCdFGAONpN/3SDPBJl+yXRe4bo+8bCuiB+M+WZ6wXm95cO8edW7TUXscHYQsZivmyys2yQ03N5fEcYat2u98hMaSisODQwbDDkHks13XfP+7/+BvBFD9rSIE6VbEq5xw0MMLa9arkqubl0RhnyyVOH6Xs0d9jo9G3F6WvLr8lCAY4viG/sERb68u29iqpKBqSphtiLcboo7C7wYMZZ/Bfp/JPGaxeUleuDx58pA873J185bx4BCpMqrYYEdRG8VQuYxGJ2xWN2RJn7u7a558cIKtFElc8fjBBxwdPuTy5pfE6RzPcTk4rbi9rri5WRP1PSy6TG6XVEtNdFzT6Q65fr5FuhX9A4PrFNh0oBJsqwLHdtgsFihjU5cG3/ewLYeqztow+TylF3XQpsFXiiDwKHZh6aWGmgY2U9zAZb2JycsaRyhqt8Z2+rjDPbRI2JYZWkgqodkWBsvNePHiC1z76/iBx89/+muePhkjZM7J/REXz6atKP1qwux2xb0PDtBVhlQ5F5cz8ipnrydYrXOUbDCpwbeOmUw3TCdtCPLQf8pEf8a22KILh5PHR6SmYraccnQq8cMxwgTc3r1g2Dvi8mLKT37yv1I1DXunfRK95fB+j0akFJmL50CezNjMRkR9h/1Dl02y4smTx5Sdmrww5LqmGzpMEw/PCcnScjfqdUmzjMZIiiJBypLQ97CF4m72FipBEEiUqwkDQxCFrOMbdO0jpaE/csizeOfcT3CDmro2CCWwfcjKBq9joVlh2YrNZo1AMhh2eH0xIRQ+eVlQpFMePjxju8y4fVNwMOwgcciLLYW+xYt6qEHAYr5mby9iPB5QlILNUpPnJf3uECxBNBjQGUREUYeu6lAeGspPHmMsSZNoNuuUoiwRgtbxvVscz8OpBY2gBReAbQmk05YfeJ7b5rIiWtDWtBrRd1mlnufuDD/vNKHir43atW4jhnw/pGkasjyn1vr9iFwp9Z5ZjOOYPM9ROwZyRz8hhCDPcgBKXSEtEJbANm2MVZaXzBdLMA2WLdC6RMp23XXdtMyssrEchWwMpjGUWu/eA21D1a6pSAiBtBV+4FHXmrrROJaNJRx02WCEee/abmu7Gthtf1Xr95FbdV2jqxRH2dS7BirT6PdsqeM4wK5Va/d8y7J2ObDN+/UIId/LF1qtLNTGtFmFyyUASjktm+o4OIFCOu160yJhva3bfSna9yiltRtre0RhQMcOMDQUZYGuKpqqoShasGuAIk+RoibsBLi+iyXBDy0cT2IahaM8LEuRpzlZ0lb7tmUHLoa6NXgFIZgGU5dIWRLHWWs4VBbbbbartG0B4/NXV5SFxpI+3ajLyfGAzbZhtYSzxyNk49AU4AYuq9kau3bpH57w8cOHfPjkjPlyymS6QkjD+SOY3m7ZP77Pfb1HVcJkmVO3t0ctYBSGptmF/osa01RAWx7hBw6NayirAss6wlY+d9MLttkaV43IswxjNK4cobCIV3PuP3lCUSe8XL9mnr3m9+V/gpI2DXVrlntHrv4VZpV3HVmWwdiKJDNIN2O5qrCdhkH/HlVdcnF78/68na6mdMYRdVbz8uKWw5MhRkvSJKaua149m+A6HlHXYnK1ptEpw5OS5WyLEhFOo5l7W6rK58WbKxwikrQla6bTSx7eP+X+ybdIshli0ufRg4+5N1pjwoTr6ZZw1PDTi3+OqQT3wg85DPbYpp9z+3rBOBoR9voU4ncI9gP+7Oclg+ERjayw+wZHulTblHlaEicFty8uOR2d0T17TL2wOH20z7pyOdx/hG3HvPn1LTqSLF5fokxJ5HbJyoZ5PEc5Dp7fEOuajndAt+txkJzSGXosVguCQR88+OVnb8jyjE50gDNQzFczylLR6+6h65zlKiaJS8ajPaRo+OTDP+Ti9SXJek2345KnCd3OkE5o8avP3hBGHodHJ9zcPMNWEZ2ehyU9et0xb95+ied2qSrBH/zh3yHLcvLEZX98hqV8qkzvtNCH/NEP/j3S7We8ePEcbSoWy4LuwKbTjWhqD8839Pof8OsvX3J01OdN/AYn6HIw3mf9ZkK83OB5Q/S25vybH4HJ+PyzZ+ztn3G0f4ahQmLQdYElJa5jkaYehoIq83jy8AHdjibLaj5+/EdURrMtbFA5UirmywUvX0/41ne/hysmTCYTOj2JFxrmyw3Iim5nhK0Uw2hIGucs7xLuHXxEZU95/uZzut0BlvDY2x8SL+Hg+JA3l88QdYe9/YiXL18SBr3/78jy3/LyWxnV/+2f/k9/PBx1kVbA27dTbOFhao+94T6+b9MUNaeHj1mtp2zTO0xj0R9W0Ngs51PevJrRVBW+19D1xoR+n6dPTrBMydFeyOPzp0hpM1m+ZjrbEPo+nuu2wd9hw+HeHvEqp9uDB+cH3FzfEIZdPvzwEfF6y3y64P6jPVzPIs8chv2AyzeXuHZInli4rsR3YT7JSPMKxxlzex3THwg820LUEstXGKEp0gZp24z3Q25ubqmNi62Ktm0Lj0bCaNjHlrDKVljYuJZD00i0LrEsiTAWnU6XokyJ4y1JluH7HYyQ5OmWaNjDMoJFmiCVwrYESaZZL+YkWYLvj8jyDOPUKMshXQtMJduYm7Jgs1kjheDZVzfEaUORL5kvY5QjOTwcolwH127wlCJLG87GB3zx4hXGdgilRUfZrPM5pbHxHA93ELHZNHhKUiaa0Wif28lbimyDIy2a2kdYgjRdkyca13GJky3RYEhWZng9G0HIZrNFFx7z5R11XZJkGbatWC1KitKgNawXJavtDZ2hi2wGzObXrFdrlL1jgrSgbCps5dA0FpVuG5c60QG6qplPZljSB1EjleD2ZoMfSRynj+92qckII4f+MKTUG6RwduvOKXVKntWs19t2xO31EaLtbXdcm9CPWK3WOGpMkVv0ukPmiwmhCvk7v/dHnBweMx4ecnzvgO6ggx/6gIXnt2Ndx3URIqQ/2KMT9Tk4POT09D4H+/cJw37bzoWgrEqybUkyS4jXKVJIoijCcT16/SFnP/kOANU/fEtvENHrBhwcDOl1QwIvQKnWoW7Zu1zTHctqWa1m0rIU0m4zQoWUbQSUrVpghdmxnQVCCIIgoK7r98H+ZVnu2qV+A9LegTPXbVlJ13V2GaJt9qrcmZqglQ8YIwiiEKUcmkbjOC24tJWN6/kEYdBqsm0L1/OQtsJgYVsOtu0ipcJ1Azw32OmJPZRyEJZqYYxsDY3GiLZoQbWGsFYzau8MSHLHkrZSBF23YNNxdmN+Id9XsirlvM+MbWUAFlKK96C2qlqw9s5gBeyKD4r3f2+aGmEJpG1hWRLbVriOj207u+atnabYyN37tLBtgevuosMstcvCVehaE283zOZz1pvN+wYl11UczaSfAAAgAElEQVR0ugEHh2MePLzH/YdnjMYjtK5Jkpw0KykKQ6VbcGfbkm435OT0gMPDIeePj3j0+JSoo3A9gW0JGm3I85qy/E2ZQ1kUbR5xlpEmWyxLUhmoGxvltaxtmhXc3k2pKkmnE5JuV0w2FfPNhjzXJJkmzjRG2NxNZjx7dk2SZjiey/XtkovXtwgUXWufU/GEsmrYphqDwDQghXhvzpNC0OiaqiiQWCDa9qitjrltrqlriLcpurJZLO9IkgXZVjO53rJZrcjLGRU1lYnJizlS2kw3Cc+Wb/kg+Fp77PyV652gnRyYxrwPAiitnGX/Ete18QNNr7vP6f0Tom4HYTXU9pp/uP7PAfg3T/8ErS2EzMFoHGuIa0mydIljufSjPqNhj7oCW7rUegu5RBsPy+vgGsXtmwmYhp/+8ucsVyX74wMWyyWjsY/nG/rRPq7btBmd/WOUhOeXn/H6+WvqTcj9g++xvJAM1AOMA93+HsLOyUzG4/NvMctyrm9tvLFLXboc7e0xn8YUjmC+uiJeXBGKAX6nS1HY2F7A85cXfPHskn/3979PUSy5mq649/QQW/hkyiMYeJitRWVteHP1JWE0RIuc1XrJ6fFDAltz8fIVxhaM98dcX16zPxrS6/bJ85LFasGwf87DJ4fopuHi9QTlalbL1lD79INz7u4mCONgK8XPfvozTFOQZxl5WZFuBd/9d75OkWfMV7d4XgRYlKXk9OQMyzG8fPWMKNyj1FuU26U/GPD69RX7+xFhtI9vR6TJLYPOQ+6NnrK4WnNyYvPFixcIE7RpN4uKw/37JEnMYjlnOOziuB2qPEdVBWrznPPBnI+/3eeH/+YNe+N90mxBrxthEeIol+FeSLfvM71bsFkl7O0NqGqDJUMsabE3PuX+wy6LRUKa53RHPnk9I40l509OSRLDzfQlulLUWrNexjiexnEcVusVabkiSVPK1KKpkzZpyVQEbsSLV79m7+CIXn+vlTAZyXods1nD/mHE5G7W6vBFhzD0ub55zR/84D/8G8Go/lag+j/8k//qj5smQ1gOtW4FyodHe7hKIIVDHG8QloeuHYTakmwrwq5PVTYU1Zaod4gtLU5O93hw/wmnZ0ckyZrFbY0uG4SpSctbyrKtyzvae0yvFzAYKFxXg/EoEhvpJNRNyenJI0aDA548fsTFxTW9IcRrxXK9IghrqjxHGofFXcqgN8D39ijzmCJ3yKsEr9NQ1Qn5uqYbeDSBQFcuVVzQ6Qp6xxbTecH8CgYRuD2bZBWzPzimkRayqduw8UGHfFOgszbbr2pqGhqqGkxj2hFPWePYNtukwlMK25F0BxEdO2BVZggLRFEhcXFVe1GtCoHvOZQmxbUdtLRQrmC5niJUQFptWW8KSlOxSle4lstitaYoMnSlWS5uidw+puwSpwtKrjk46ZCuakxlYTkBk/WSu9kK31UMh0M2yy0fPjpkPUu4214QDbs4yqVsFMp1UU6DYwUslyt6I4EfjfD9DrqUjMZ7yMZmm2YUWYUdBGidkzUte+PakrwSdMIxxjRsiiVRFFFmOUVjUSXgOT22cU6lLSQhnV4HWzVgBMrtYNmQpFP6gy6BH2GMTW0keZXiuSH7+yOiyOLizXOSdIWhwg8DegOL+WSGZ4958vQJZZXQ6Sn2RgOiYEReraibgl63w+QmxlYujhvgBYZNeo1Sir435Oz+KUlWkDaaYNDBjwZMJhM8p8NofIxSPkHQo9/fo6oMnhdSlQ2rRco2TZnNtyynczbrDWVWUlbQGIN0XWwhsCxQrgdS8uCn3wVg9nu/QFkNg+GATuTj+R6eF2JbraZTWC2QKnRJbQx1bagqjTHQ1G2jj640ylLYtqJuagSCqqwo8hLbsqkqTbJtY9TeMZ1CiPcM4jutqlLqvXa1NSE16J3k4F2LT9MYLKFQtouua5J0i7QkQehjK4Vt2dhK7YCgjRAWjnKxlEQIQ0Pr0pfC0DSathOooaFBN3VbZ6nawgJjmvfJBMbUIGoqXVDqHF1ryqpEQMtkug7urhhA67aC1ZIS05idFOCvOr7bAoN3aQeWZeF73k6v27SRU0C1i6eq610NrAFdawDqxuxY0t04rV1za7bS5a5etsGSDsbYNLqhrDKEMDiO/V6+YNsKY3ZguSgoi4rNOuHubsmbywl300XLkNoKTHsDUtfvJAoKXTXMZivevL7lbrJitdxSFg2Ocjk+PuDRo2POzw85Pz/l/v1DOl0HpcSO6W5byuqmptIVthAIU2MZQb/vsjcO6fc77O+PUG5rBOx3BuwN9hkO9vGiDm7gE0Ud/NDF9QOqWnD5ZoK0FPfvn6EcG6dU7JfnaC1IiwZ2bPW740qINt+3MSVV0ZZbKGURhT64FXqccjDaZ/r6isXNiiKRrOMVcbahaQZYvsf+fRtd1wTWkHGvjxCam2lMtQ154n+Apa1WDstOHrs7vtvEiXZ7tCxxzxs++viYV8+u8EKDslsJzGY7YbMy/KOszT/+Z+F/Q1Fk2MJi0LcQdYEtDQ8fHKAsG9+1Wa/mLJcrqqKh09nH90MoUxyVYQufovKJgoD1NqapBcv5hrubObIJ0Jli3D/iyeMHXF79ivVmyqDXYzCMSIsMg4tjKX7w/b/LR9/p8fL6DavJLUYqjIDtpsB3bJQULBc3fPXpmifnT/jyq2v8yGW9nDPaP8PUmqzMOb0/ZD6Judc7oXdQc/P6mof793n6ycdcXHxFWQU8ffiYMllitM3jTz6iF7gc9A8ptjm9rsugu8d0knB8tsfdbcLDx+e8uPwlde3heCUXryZoXbJO1pycnnE7ueHpR3tsNiWDgYOjRgShy3abE/UrttmcbRKja42uJQ8fPiHNY6LgkPG+z3KVg1Ccnj0kLRJoNK7qs1hO0E1JEHn0olOyas711YxBZ8BgNOTixSVllvCD3/s2//i/+6/53Y//Y45OFT/69DXf/tZH3N5dYIs+Qhh8XzKdTLBFyKjf54QbmqtnfO/b9/j2Hwn+8i9fk8WPMWrOar1F1C7D0ahtkypL5tMV4+Eey+WKTneP+foCW1mkqcFxW9PmxeUMbQTr7Yab6yscJ0JKQSVmbJZbDg8HzGYzet0hYdghyRbkRYZUNb7Xod8LqSvNcLzHerlgf2+AE655/WaCkD77BwNcp0OR1xweD8nzhMlkwnivg+trnj27QCnB7//u3wyg+ltH/6u1wbNSUhKG/RGeBXG6RVk9knTCwekejpdy+SrGUJIVK8qbgF53n+mk4OQwxOnYrJY1q/gFSZFgSc2981OePL7H51++5GR8yGh4xKvprzneD7m5WFGKhk8++Vu8fLmh4y341dWCqMwJDEzjNb/+5a/Y74fkykJIG0f16YYum82GUqdYYUJa17huh/5oH8+HeiuZxFMyUkLVxbYbFpOUeyfnPD77DnezCxp1w9E3jjjr9ymqS66SNrNu2AtIliWmMczyNxRhSM/rkc1WDA+6hDJisVrS7YYUaYElB/T6A1abDb5bUBRrep19hBC8XWwIVECWLSidGD/wKDaKYeSgpaFRElG2koNsu0K6Nl7QYTW9onZc0iLHU4bKlDQo7h894urumvlqjR9E/PTlG3JdcNodI8qIN59f4oV9CqGJrLamsTsI8XuG5bKgbBr+7Ke/pNJbhqMDqkKji5zT/UPW6Yak8EBViCBEcEiex1iBg9eTTGdv6Xd72LbLolphNjmOcvFsC2MJZGA4sYfcXlxz9HCPbO1y+dWCThiwymKkccmKkjyvqAoNFqT5Gq8jObv3IbdvZyxXK9LKIFVOmgmUHVDqWxx3TJzm3NxMcGWXMDjE8jW61IhKss6WfOPrj6gbBze0secN905Pmd2umG1e4zo9Br5DuphzdHDELC3QzZbbmwtsV+FHh8igy49+8inb9Zwnj54y2W65ndzR64/oDkfExQI7tFC2TeD4hEGHsixYzOfYrkOpM9armKqsd2BNUtPqExskddngKgfbkghh8Qe78+5f/tlPqSpoW5gEdVO1Dv2d8cnCoqoKpLJpjKFpWlbMcdr8ybpuWhONaUektt2Grkskvhugd+aWKOrQlZK6bjVala4oq1aGYTDvWb6iKql1OyIX7zkogW1ZeB3vPQOLAMcJ2y9lIdF1SVXtpg2ilRxorZFNQ91oTC2RtoMtm7axiV1E0G6pqgphGmzLQsg2vshxHIRozV113VaiKiNomhrbtnaFBex0rC2Ab5oaTN02HpmWQa3rhnjbRgsJIdpKWSmwdk1ddd2C5rrW2Fb7Gbf72Gn1qqah0jWWbe/itloDlqwljWz1lKZpq27FDry2+bOts71pqhYcNZKqbEBUbROWsgmDoJVW5FkbiWUMtitRxqCrCuqS1XK2KymQSLkzkmGotcayJP1+B2tnGGo7wNfUekVRFDtJg6TbjRgNexwc9Tl/FGBMje8HVFVDUVSsVzHL5ZY0KVgtt6xWeQskJTiO3cozpEA5Np7nEAQujquwlN2WK7gertvqcpXTw3UCXC+kqiTUPllZUhYghaR5d8MizM7f1MoOTNMy/FJCp+dzfn7MRFekQx9XZvzO3z7n9es5r14vORrf4xef/wSvmzF/HbO4hNHQJXVvuC6s1mCYWcx5y/+V/u/8A+8/Apr3Hq5WdtD+VjcGS0gaDa9ev+T5y4SDEx9dVdxcrfH9jCI39EIXFu3xGi9r/Mhlf69Pmiek9ZpeOKQoK3RjUeQJ8UKxv3eAUDnLeME2ltS1xsNHuS6jTsl6tcTkNbZv6PdG7I96bFYlUm34y5/9mCD6AdfXGxrpMp9coTxNvDZUlcX17ZTR+CXPry/x3RFLarLNBLMyvN2u+ejjc2qdY1s2J/fgh//6z1GWZjObUhU+Rgt+/dWU0+OIWudURU4zyLl3sMfz5y/415/+msdlg1Jdnr14i3tgc7Oc0wsH/PkP/4JPPvkQWflk5RWb5Yz1+hmCBcvlMU+efJO/+PPPOD76mIs3v+DVa5uHZ484PNpnuVzy+s1XeIHH9U3O/vEZWXbFZlFTNzl5Pufl84zR/gBhIvYPIrK0xHJcDC5vLq64mVXcTEvKKqHQEePhiGSd87VPHvP67TPyYovEo65rwjCk2wm4fDvjbromDALyzPAv/tm/ZLGaMq1+zp76LqfHJyTxHZvZhoOjMW+vY/pDj4uXG/7+H32PlDVfvIEn4zE/+tlLGrtD8rIh7FtEo0NubufEG8Pjx8fkZcXPfzKjP3TxfIcHjw4o8wrbdCjSGt+D25uXrBcbgk7DemGoqpxuAL5jcFzNbJnQCUd4jiTezvCjmu3VQ7727ROu35ZMZ3N6wwN8OyCm5PXLC6JoxGS9ARPQ7bjYFiRJQ1XCeBCyyG/JyzUVmunqjmdvcr7zjY/Z3MX/f7Dlv9XltwLVNFswGo8pqwXxZkuJxO9LSm+ONBbPXzzjcP8hpY7B0tQ6YDpbsFpbhP0O83LF/cM+dWIxva3YO0jI6oRt+ZKi9Ahdm4u3l1jOlONjQeAGlHVOtVbcvnFwXUjiDY8fnpCvYl5dvWS4d4prKlbbFdNiSrfXg0bw9u1rXA+2m5KDgwG9zphXlzOKMgMMSb3GdSI0NbqsMbVP5CqWkzt+Ol3R6QN2SZpO2N/v4zkfsvj8x7hBQ02B9BVNU6GkTZqnaK0I9zt0Rx2Sdcler48tFd1xl8XmFjcaMptN20B93ybJb6lQdAaSNBMk2wzrVGGsLavJguHZQw4fnPKTzz/DcxqioEesNfv9EboSVIFmvVgwCEZYpsbuRFgmYJHeYTuayBsxX63AhsixyKuYQIekOZTVFl9YRMcRQaTouR2m0xhhEgQ2SRqjpMVmFRN4IZ4XMJ1NkLaEKsOyNIO+ZFXc0OsP0KJGugY39cjKmMX2DiuMiOOaMGhbQDZx1TYuRYqjkwHd7pDpfIlyLJJtibRDJjcbsGeMD0IcJ4Q6wA/7GJMyvVrSWCBtgWp8Cg1YWxwlWd1q9o8NaZlRrbcEqqQiRjUCz/bRhQWmz3wh2KTX6AaawmIxz5EqYtDzGPg9VvGMbVpyezcjLxuEK/CdIaJUFMmWm+wFg9EIOiF/+vmnYNlYpuEH52dcvPkKJ8wZjc4Y9w9wHcVqOcdzfZ4+/QDXcdjEa6RVYwmXqmgoy5I8zynTAkvaSAxlXpE2UFb1+/NusZm3YMDyKHP9nkFs2TabWlrYjoWUFmIXqeR5Hlrr9/rSd+A1yzKEEO343lNIIQltH6V+M7Z/B7LEjlkty5KyLMFWSASmbsCA57Y5oOzG5Wanb30nJfjNmLyN0YIWNJb6NzpQy7KxbENjLCoqoG7d3JbV1i42bSuWkG1xgpD8NZD7TnZQVTV6F1nkuu5vnPg7M5Tejerb/zetbKAxNHVNXVcI0T7PmDaey9C+LsZg6jbZQAio699oGG3HAdOaoaS0CV1vt23V+/3eZqjuYrAQ6KaVDyilkMj3GuB2X7QB/mVVopscRyls22GbrjGNQQr5nvV9L8eom52uFRrTtBMe38NRDrZl0zRm97knZGmOaAR+6KAc6A1coqi70xoLyqJiNpvz9uqSNKnI8xrv/2XuTWJsWxPsrO//d9+e/kR/+3fvu6/1q8xqslxFUWkLG0zhmhgYAJLFEA+YwIhBItEILDFAILCQjACLEoWqylLZgLHskss2LpftfJX5MvPle+82cZtoT3923/2bwT4RmcmgJiCRIYXuVejGiYhzz4mz9vrX+pZl4bo64z2f4Sjk6HjCcNijbWtW6w3rVcxiHrFeRuR52WWGGzAMp1s5ojstklonZuuyplEFrmeTxhFnbxdM6mOeyF+gVopKtbRiR4xoW4SQO57pLifadjzTFklZKGaLNdds+fTqFRQZmq3T6/n83C9/zGQc8Iu/9A6vXr7h+nrNwdEBpYp58fKUq2WMPx0hRIuUgrqtEFqLQLst2qn2RycFtC0tipqKWmb4PUErWrI8QddNpFaytz/ugq1vuudtP/RxfIsoiTg/X6JrOqHTcn3ZzU57gcWdR5LNak2+rkCLCIN9HHtAEpc4TnfaUFU15kjD9UYM+j0kEZpssP2K188u+OqrA8paI85nRPGGsGd1MSN3xNX8Fd/+/neo25LJXhfX/md/9DnD/hjPHPK9771lfzImHNas1wvy0sANYzaLHvuHQ64v1qTpAse+w/WZxmbdEEUvKPPHfPjB1/ns829zcfGKSiVMJi5WU2NiIlWLLFM+/Ydf0hu6+H5Akcdo5pBx/4A/+P1P6fXuIZFEUUKZOdi2ZLF+TZKkZGlDkuUEA535Zc29eyNePH/DxWXCvYe/yNXVvCPFpGC5GstVimUauO4U21ozv56hNgZeEDKwLTarc1x7j7PrN7z5nTMePDxhvb2kKV10XWe9ipjujcmTLdFGxzR0JHt8/Mm7mH7BfHtO63n80aff4Wd+5md5/8M/g9IihDQw6y1/6uN3+OBwRWYdc/Um50KM2NRX/E+/FXF4fIdldEFvex+p30e2GUHo8fkfxEymU0xLcXU5oz/w6PUdbKvPZrMhTk/Ji4y2SWibCdM9SRzrtLWLpjfomoOh9TCtkvUyIghCDNHn7hOftgLHnHJ8MGB/75iXb/6QVlkooVO3CadfzjDNgnv37iKEgyYtctWSqhlv3yy5e2+C1k8Zj46xtRXPvnzG+lz9vxKX/1++iR93MP6fb9/8145aV454dbXG9VoMSlTbYziuEE3A8mqFUg1N20GoWwS9QY/BoM/V7C2DO33y6w1uZTMcDNiUa5bZOU2V8ujOA0RrsM1zqlySJdfceTAg2gS0bcv51VuUrHm0/zGtmeCYOm/fXNL3ewyMhlz0+ersOXVl4Jg2ph2TpRWytbCtAlObMo8r8nKFEg2GLdFlj+0mwrNcbEsynuxxOJ3w5eenuL2CNFcUVUEjY3rhCN8Jmc9nzK9WFJVACItCxZRtysjcx+pZrFYrBn2baNFi6yZOqIiymrQsIGtRoiYIJ90xZhPTKpPVaoFpOOBLVLNlYPYxzZCUiiRNGYc+edGSkSMVtE2AZqZ4uo7KDAoSGqmxXsZERUJo9zkc7/Pi/KtuTQUT17MQVU7RNAhdoFUag76L2zOJMyjSmDSNcHyTVkkM3cXQTZJNQuD3qMqcrGnQ9QrXkkSbFM0ysO0A1xhiGIrZ6hpdWuRlSiVrKlURut2TIM0bRmEfmUuCsAHdZ5OuaKuMLK6IspbJ3v7uaG+D7zkE3gghNLbbBbZjUSlQTUmc1Cg0qmLGyO1jmWMqI2cdr7ClxeHoHnG6wHV7bJdrfMcmK3OSMkE3JLIt6ff6pJnC9X0c22BzvUWZgqTpWLC68nH9gG1yhW1YHR2g1emFfWbrBVVTdizTqiGwXcZhyHDa71rUmoFj+hwfHWEYOotZxPVFRis08iLDcRwc2yJNY0I/JE9zlrMVTdM5SS9fv+DO/fv8x69+E4D/9JO/RFFm5HlG26pbF0+Irvmt6k6Eyp0wuXkO38yfdtlScfvxG6yPrssdFaDsikqtuG2xV1V1O7la1xWqqW9zoW3bUlc1lt3lU29EcL1rwf/4e13XtyWjG5xT06jbQpeUYne8XqPrHZKoqqrONRPa7c9zE0EQAvKiW30SiC7GIGT3b9umyzHuhgmA25ECtVuX6iIMnZjsBGvnINd18xPYqZvog5Ryxz5tqOqaVnArXm74qoju6zRNV9oSOyJ9WZZ0ZZzO7aVtEbv/E2Tn1rU7V7iLFLQYpoVhGp0zvosc0NJ9/aqbVr2hDgRBgGWZNFVFlqZkWUmeVSAUjmviWCb9Qch4PMB2dLIsI45SVsst61VCUSjqqqFRFY5jEoYege/g+w6aBmVRdszdJCeKusb0dptC2+L5DvsHY/YOBji2ecujVapls45YryPSpCRLc4qyoqpLBBq6tDBMiWnqWJaN47j0swk/134T3TRYbGPqRqLo8rjsCBPdRZSiSDZkcdStuPUD5EHKZ/3f5+jwGFvX2cYlUmswTYFUsLha0Q8CHFfn4uINTZ13brlwyKucP/yjZ8y2cOQf8y+Y/wqmsHeEAXYXITXtLiojWli0l3y7/7uc3AtJkgjXh0aVWLaiLjzq0uC/XHwGwL939JS6KUm2LY7nE8VzVCUYDqa4gSQvU9BrpHTRhMK1LdabiHsn7zOe+ETRhouLGY4Lb16nDIYOWXFNzz3Ack1Wi5K98R3i6JKySaikYjAcIVpBEpdsNzmWYyOchLeXV4wn+4h8zWw25+mDj9GEyXS8R7ROCHotZ6+3VFqJamNUMyTomaRZzmzxFl1zaGj54OlDrq82fPThE1pVMxj3Obt4RlHWtK3Pu4/HfPd7X2IZFk0GtcpwByPiVcnxYZ+XF1eUSct777yHo9/lbPkdrlanhN49Du5ovH1xSZkpRqMpml6T5AuGowF1YbLZnvHe009I4xxVC5bLNeHQQTNK3r5a8+DRAWW95ey0wQtqDLtmvZSMh0dcz78gjrc8fPSYvEjRdZM0WyFal3cfP+EH33/GaOiQxhmD3j3qZoPfL3CNe1zMPqepff7cr3/C7/7O77KeuTx49IDxgcb15Zz7hw/4U7/wy+TZ3+L0+SW5/ec4ff2SZ6/+AEsfo7Ut880aX+QEeydYlo2mF4TBiPnqOfPr7tTKC0NMadOoijD0+PLLF0wnU/JqRuDtc3BwyGrzhmwpGYwczuZvaTWFpcPsIsHvHTId9jCskh9+/oJwIMizBseaouQZy1VMEO6TRDWu5SH1JW9fr9ifvkd/Cl89e43n2QRBH0saaGzRpUleptjWBMvw+Yv/5l/+Ccrw/19vf2xG9W/8/f/uW+NwyOVyge/26Qd93J5LHMUk8RZDtyjLinfePcB191Aypqklq3WE0C3ycs3yaoure2yjGXFS0xDjeDqWsU+/r3OdXmBbEGh3sYMSx+2TRjOODg7wTB9Tt7iaX5GlM/YO7tDkFpvZGb3hmPNVgePD2cWarDSQVopmepjOXQq1Ii/XtHqKYQQIdLJkQ+DaNJVBXKQITXJ5dUVVNvRHDbrRvaAdnhwQb01s10bTdJKNwjR0BC2GPkCXNlezCyxDZzAacL1eUUoNLI0Whe/65NsYy/ARmsSybExLZ70s8QKNLG0YDj3KtsV2wbZt+v0+6/mM48GUw8N9ni3e4BgtdZ0TVQlBz6OtUyo9JZz6zF5fUjU1fmjR7wWde6IJFDWuY5FXFU0hMHQBsmW7KfDskFUUk1cNnuPQVD5RlGKZnaO5XC47oRhlSCHZ1CuEJjFMB6kMxv0xhjIRlcnqKkKYFtQWm2VMkRXYhmTkHpEsJKaTkRYFUq8om4bL9QzdEmi6RV6V6LaPbWik+ZpCZTRCsokTyjrjYH9Cz/W5Wi8Z741I84pGCZbLDdBiWJIkT7Fck2QbIxDUTU6alshWkRUxUhpEUUR8XRAYLrZnUkuDq9WCTbHC6rlERUpVCZAGQeBQpQ0KjUKkBPYA3/UxhMXI73M0GmMi6Dk+qmqIs5jlYrub1myo65r5fEFTK169PqVWKU5gkuQxcRLTtKBrJq9evmC7WuA5BtQNntfywUf3cVyTn3375wH4u+PfoK4rdN3A87wOEaU6EVXtKABtK8iy/Lbo0zTdcfON42iaFq7r3DbPO4xVdQvjaXdbkR3yqsGyTDzPRQKOZdELQzzHwXNdfM/D0DVE2wk0KfXbDGW7c71uxNxNcakTtM2uxX+DHQJ22CFgV9jqnE8pZVcCEzfiuaMgdH/Xb98t094Vx7RudcswMC0TwzTQDb37uUSHzdJ1A3nrzHX3yU1b/8bV7Epi1q1I1zSNsiqpmhrxY9zUFnZiE9g5vKppoL3JrXaEhaZRu9GC7vMEXebMNG3MXSmtw1w16IZBS4cTY4dlqqoSpWp0XbulN8CPXGUpJY7jMB6NGAx9bKdF0xVVXZEkOYvZmjevrzh7s2A5j8izhlZpCKHdrn9JDcoqY7WOuLrYcC2Yp0UAACAASURBVHG+4OJ8wXK+pqwqPM/mzt0D3nlyhw8+eodHj4/oDxyyLOfVy3O+/71nPH/+htOXb7m6vEZK8AOTg8MhDx4d8+DBMfv7E45Ppjge1E3BZh2xWGyYXS/RMpO9+oi8KKhbDYS+u6jqylI/ajg1VHlC29RoukGv18Pfd1n1l0RJQZE3qAakZlDVFZ999kP+9t/5v/j0u58zX3elmSov2WxTwl5ApTLWScpqW1LKhovyLe+Y7yJFF/tAiFtyhtjRHFIV8b34U7bxiu06ZjNXmFoP3+mz3ZSYhuDPpv8OAP/D5j8kSXMaBcf39nB8k6Y0cFyDvJpxdnGF5fSYr1Y4pk+y3VIUFaE/oSo0Pv/ihyByeuEY3wsRssC2HIRyqOoc1TY8efQRQtuSZQWG6QEtb9++wfEsNOny3nsfcT0/xbV1yjwn3ua4nk9ZGBSZgetrzJbnvL14zWob4XkWbdPDsDSapmK5XFCrBM3WMEyTxVW6Yzi7fPn8C5brc96eXZKkoAmHV2+uKauYt2cvELhMDgLens2ZTh6zfxDy6vQZtiUJ3IAitVlGz2jakP7IZL64xLOHmFbFarGlISaKYpbLJcPemOl4SJRm6EZNFpc8/eAJaZqQ5SXPn1+g6oZa5bTU6JrO+ZstP/f1P4lpdM8v6pAkLdBMncHIZ7W9QtVQlQ2v35xiygle2FDVEUHPpdcfMpyEXF+fsVzEjKcH6FrGV5/Pefe9O3z15UuSPCLPBR9+9POY7jGVnPM3f++v45rHPHjvEV+e/5Cm0PD7gqSRZFFBzTVpUhAGPb746vuYxoSPPrlLXij64YBtPMO0DETTR9MbLFNgWYIf/uArmqZlOOjmqAdTnz/89j9FEwFFk5MUOaNwgGoMhFbSNBVN1XGat9uUOC7IcqibNUFgoWqNLC3xeyaN2NKogiias1jMqQudMDSoMgfdNri63PD43Qc8fvDLPxUZ1T9WqP7tv/V/fotSMTkwsc2EwHLpD3qk65rRIOAbf/JrXF1saaVGlqWMxiGLxZaGRcfKXMRMRgGa1dK0Kcf3baqqxfUNpF4hZc6LtzPG+xay6fiMSZQz6AWcnebshT2GeyOGoxBX99hsUi6XX+CYU6KNYrpXES225FFF4DoYhsSxHbabmOU8JsoWjPb7DPp7mLpNldfYtsMmikmyOYbbIM2aujaxzZAgGLHZXKPrLQgLVcPps5c8evweq/WcrFZUhcTUNRzXRlKzjguu10uUoajqksl4n2iZoSGolKDXt6iqBm+QUqoCx+kRhjqtKOlZAsuVJFWDO+hh2SYn02O++PIzcrkk0PuUGwvbDChUw2K9wu0P2Cwamm2GGUoMPMqyxfJM6jLD9ywqKoSmU8YVOF0ZytYsTN8jqxRFlpJkBY7lEQxN4nRNmmaMx31MW6NpC4oqIfCH1JWkpXsh0DQDxzeZxW+IRLcKotolw4GLIQdYuoOlV0TREk1qJGmE1ARloVGrAsNwMIRDnld4gYuSGyQO6UZioHMwHRLHJW3rcjXfkGUxbmhTFA1tVWNpDkKzMd2uOHdxNWPan6K33YyqJj36Ychg6FLTsIhSjo8OefjwKVdRRlSn+LZLz+xTZRnxOsI1dTRZ0uQZJ3t3CIKAOJ4z8AOyJKVtBEXRcD1bUNWCvKzRLR0hSzQ9IEmq7ujVEaTFFtPyaFqdouqIB5puEOUxRZmQ5BvmiyvCwGM8HNDWioODEW/ennL66oJ/qfi3Afib9l9BohBS4vsBmtAxjW6FyLZ3bXU0TEvftd07eL6m3cD5ATqn9KbRfSNydN1Akxrd6E/nBuq6juM42GZHSjAMA33nsuZ5ThxHu9todkB/2fH34CfKV/aufHQjWi3b7FxT2B2tqg6r1TZAuwP8u7dlLcu0sG0Hx3FuXUTTNG/F5M3tQ3ck/iPXdSeaW3X7vXS3Z3bOmJC3Tu6P0wwMs8NtSSF32Kwu83rjsCJEN4+4m5C9iV/cjAFIIX+Cu9oxVQVVVXXvZbmbfO2YtGVVkmU5hrG7eFDdi6aqFW0jqIoORWUIHV1qNHVNWVe3xAGAoijJs4zNes1qtSXLagQaUug7vBNI2YnDLIuJ44gkTUnjjCTJdtEKg7bVsCwNywE/sNnfH9Pv92gaxWK+4fTlOc++esvL5xeslgVS2ozHQybTHo8en/D1r3/Mvft3cd2QzSbh/GzOi2fnvHp5ztXVgiwtsCyTO3cPef/9x7z/4UMePznh+GTCxJ1y3D6iRaNSnbMspda5/Ds8WSfQa8o8Re0uwoJeSK1nvBUvkNKERlEXNapUpPGai4sznrz7hKfvPcF1LSzTxrRN3LDPehOjWsFimRJFJZrW4kmb++a7aEIHFKqtMQyTpgGlaoRWs222XBvn7I3HWEInXZboTcnAHZCscpJFzq+b/y4Af/XiP+koH07B69MLrs8rQr/H0cmA5Tzj3r1HWEG3SHRydEwv6DMah8zmZ1SFhWFmJEnJarXBMh3ABGEihWKxumKxfoPUcyxjSN6sUQKaJqdoKqRhM1vEvDl/iW06pNsCU7Z41gjX8pmMQ9pWYxvPUdTYjs/+4YQ8j0mLnNHgAYoEpQRlExFnDa67h2UpAu8Ew5Q8f/UZZQlR3NI0Gq2suZhfYUiT6fiA2WqJ43pE6wtoOvOFUhAEHm9evyTNIppWoJk6tYhJshrTzNmsupGKvIg5ODjGMgKydEsSR3z17BVPn/wJ2kYwX12x2cas1pdYlkZ/EFKXCsPqHmum6VIVFYauOHv7mv2DCV+9+AFS25ClLduVIInnWLYOck1ZLlAIwn7IZiGx3YavvnxJFK87FFvg8/nnz3nw+IDecMw2Kun1Pdaba84vfsDh5F1G40947513efX8f+MP/tHvkyQFqshpqpLJwQjXssiLmDwD21GUdYsmbXSrJEsV61XE/fv3OX35mqvLBYORS9hzKTKF6/r0cLh4+V0CfcQg2MO3+hz2j6jLJdPRiGfPX1DXJocnIWfnZ1zPVzTymjiSeD0HqScYWhcnaSrBnZP7NCrj7fkZjtXHsRtU3aIbJrP1grKReG6AaUkurl/wSz//01Gm+mOF6v/81/+jb23mG+brhKbJ8OwBRV1RlhXLxZbzq7cMhxOKeMT+wT6efUCROowGY1arNekyRTcEqtXQ7JzxqEe+tXl1esneQQ/Hqbk8i+n1PBpmXF5uMfSaaJPStg0HexPiPOPs7Ixe6HN2eUqparYrmyyb0+87DHodnHq6HzJbxMzmBbqVsVzP8XsOog348vNzHNshThJmy7ddG9hyGU4HbDcRdSOpmoSyyEmTAik7B2t2dYnrOqzTLXGZk9caqs4oowXT/SNevH7THaMFkr6/jyFNaFPyvGa53jIYhvg9yf13jqnqjF6/x+X5mvEh6IZGlqcUDfS8HtQxh3sHnJ+tWa1X9Kc9FpuSSdAjuoyoixXDkU8edWzBQilaveD6TUYvPKAVBdv1jEE/BE3i+Q5CKMLQYTlPGY/GZGXMNk3wPJciq9lsYnr9EIFOU1mkKawWW+paYZoOWtMghaKqc0AROENmV2ukCWXTYlggWg3dsJgvZ12e1G5wfIFmW4imc4rKqiYMXCzdoMgSdGFhWy1lDIFv4/kmRQOtdLAMBymgyCPu3zvm5avn1LXg8YMTTo4OmM8j6irH0iQIi0Ho0VQFe3sB45FPLzTJ84zNJsWwTAy7pmwrtkVDQ0nfsRkYIZ60WccpSIthOIFCJ61z/NAnWtaUTYvn9BCiuwjLih3rUeuWl0AQDnz6o4A0zYmimixTxGlMWWekac52uyGrIjbRFVEyI0k2CKGTZ5LZVczFxVuyco0wFEHo8yvLfwOAf3Lvr1EUEaqFplbkeUGSJNR12ZVwdms63SRp3a1OSomud3ilm3GAOI47HiXsMpc/iV2SQmCaBrZtY+oGTd2hieqqpipvWuoNeZZTV50b26hd1rYoKMt8lx3dfd5OBN4ck7uOTdgLCcMA13Mxzc4h9hwH09DRdH23skSH0UJQ7lr1pnmDwWpvYfvd0fpNvKG9dWNNw+wGDfTOUb6JPHRA/+7O+nEBeiNmEaIT3fpOJLXtT6xPdbgiaFRzK5q7C4VO1DZ10y0ZtXSFNdVS1w0gMAwTx3bQtC5/eZPTFaITzFVVYhmSXs9lOPAJfIt+32c0CtC05tZBA62bVnVdTLNzZDWpIQXoukVTQ5rl5Hmxi0QIWhRKlRi6ieuGSE2gaQrTFlgOXW5aV9RlQV00tKrj9RZFxnAUcv/hIdO9gOHQ453HDzCtTkS8eX3B5cWW2XXG5fmGsmhwPYODwylf+9pH/MzXPuTuvWP296ZIqbGYR3z23Wf80adf8OXnr1kuYmzL47h3l0fOUwzLYhsXSPmjyAei3V2MtKimpMpKJBKkwHEsci3mlfqSKNp2JyZlJ8SbRrK3f4fJZA/fd+n1AhAtrdSp0PCCkF5/yPnFgtUmxrYsNuWCc3XJA/0RGiZSGCAaTLu7gLtILvk/Vv8LR8dD/uVf+wXu3vF5/OgRhwchZSlZLDM225J/3e+E6n/z5j/vEEqyxdDYHbcqlosIy9bZbhuieIZtGcRbxeXVBUVR0jY6ttOi6yZB6FI1BUrk6IaDadsUeXehoNqWptKZjEYoCi6vNxwcPqFWLhiCRq7RzJLVPKXvTzicHFMVCYYMuPdgymY771aM8orQHVLkJfPFNf2Bxdvzaxqu8XyNLCuolInQWnQlQDTESUajWpQQaJpNq0FWRkRRynq+Ym8yBGwEJrIG2ShsVyeO5hSZxZP3HjEcDXD8ECfM2EZXXF1v8K2QKFlimz1sK6AoU+omJVs7PHp4hy+efZs8MblzssfpyxcYpothVcyX12jSxbYF17PXKFXT6w15+eyUIs+6XgKK/f0Rp69e4XkObasxGI/I0xrbspnPSpQoMHRQIuniTqqgVQ37hy6vTxf0+sdU7Rs2M8XDB2NW8xX7kxM+++yH/Nbv/D38gU5/eMDXPv7zDA8qVskWb+jj923W14LDwynLeYVnD0jzBXXdPbbbRscyQq6uZmiyi9UYpmK7rjg88Xj9+pz5rCRPS773xT/jez94hjRHjKZjhFkyW14zGJ6QpQmTfZ/L8zX7JwOU3JBmERgtuqkI/T6Wvk+0STk4GEOrcfr6lNEkJE42DAcDtpsc020ZTY5QsmS9irHtEs3Q+MWv/6s//UL1r/61//5bbV0SlUuaymOz7naTPb+lUNfocsJ8fo5Sa5RKmc8usZ2cJGmALcKsiJM1eZrjuSXL2Ya6iTg6Cbl4HTMdDBj6NrPZNat4w2be8ORpn/l1zcNHj1hsCmr5kqosEYaJ51o8OvmEoi7wexVVsqLINNraQzNb4mhJv+9gGArXHLCJCjbrJYHnEMVLpLS6I0DDxjQFRZYTBodMx/c5ff1dwsClSCFNGtK0Iq8LTEuy2G5olcVg0qdtUsbOhHUek+c1e8cuBi6z82uO9/apy5zeQIJ0sAONINSo1Za61FgtS3pDRVpEWG7IOBhTNALHs4jyKxqpUTUuoR1i5AabSkAb8ejkMaNej9VyRaOglSmpsvEcD88X2G6DJg22q5gqS/E9g1IVlGVCkeS4XkhZFTRlRtO2pEWFqEum00PatqQsc6q8gUbHcSw0vaGtBaPeAYYuiTcpfT/EFAaO4TPq9wnsgKo2CdwBtmZSNSWT8SGbVURWp6zSBFMz6E9Cmt2sZV11YPmOrdkB7MuqJFpvmQz6eBbYls5ytcB0JGlTUFYFd+7eYR3NKVRGUZWMRiNaYSIt8BzJyd4d2loQeAOSqGOU/so/901cJL7jkZcpZZ5SJiVlXSFMWEVrsrLGcgWuY5EVAt0WCC3qNuBbE98O6fd7SB380CPLE4JBQKsUrtejKgsuLy5wXZ9G1ZRVThxvuqyjBrZtUOQZcZLQ1IKm0bEsB81QoBegCVbxlqzK2SYrfq38SwD8tvFfoZRGkqfkRYphGHieCzQUZdYtQ4nuqFTXtVvYv2oblKopy5w8z27b4G2rdotS9a6l3TmN+i5vWpZlV+TRNGzbRtO13RqWfhsdEKIr/rS0aIa2W7HqWudNXZMmyW0rHzqnVbXqtmjkeR69Xq+b1W06R1OTOoZuYhpm15LfZVOllOR5/hN509vBgh+LF3RZz93ROJ3TCz8aONB22dybz3Ec5xbe37btLhequiN8uM2O3qxUmaaJbVm38P4bN/XmNrvWu9ZFDHY4I9d1b4VsXVXomtaVsMSPMruaJjs3m84dzrKSIi+oa4UuO2C/lDqtkjR1t6bTNN2ASJokHbKqrDqea6uQEgxDRylFmqbomsR1HWzbIs9zsqwgy2qKoqWpBYZh4Xsew1Gfo6MDDvYPMHUDkKyXCV998ZY3r9akcUvT1IxGY9599wnvvf+IP/HJOzx85wDLbkmziLOza16dXvD5D17y/NkZq1XXFD44nPDk6V0+/OghH370mEfv3KUX+qxWG9ZnKfpFj802pZX6bTREatou73szqlBS5UXn4usajuuRi5SX6jltawImSlMYtklLN5CRlDlpUaFaA02aqFbiBC5lXZAlHQN2E6UIzUCikZNzUb3lgfUIiaIqG4pCoZs6qb7ij7afgm5i2SZffv4ClelM+kO26yX37g/55jd/iSfP/kUA2r/wHYKRwfVsjuMa3L93QpYu6fXGWFZIXW9xDB+tmTIcTlGyoKyWmKaHYbjdKlutU9YQJyl5GSOkweXlCtu1aHHY39/j2RfPEJpE10cMxjavTl8glYYuWuJVw3DQYzpxSYs1SZYTZw1pVaCkQ1bWuF5AXRdstjOEaukNQ96+vUSTIXlWMh7coaFAySV6PSTNKtAjslzRalCoS5K06E4VpcRxXc4v5qBsegOLy6sZQT9ksYyoVUTZ6CzXG4Rmsopf8eb1rIsnmCOkdHEsg+uruHvdrEfoest6uST0DnC9gPnlBtczKMuYps3YREscV8PQTFbrFzSqpsg0Rv0xtheRpRXj0RFvz08JvSF7eyfESYLUDO4/3CPLVjj2FMUGQU2yabGNgO2mwLa7i6Y6D5jsBeTZhlH/iM1CglawXYHpaNi9lm11xd/7u79HlkYYvQV3733InbsnzOYxi+WSaLlkMryP62ms4yv6gz6+O0WRMN33ugtcQ3FxfsXedA/dFOR5wduzl6w3S7bbiOH0kA8+fIIXOgSDkM9+8F10WXFydIhSkv6gx2TqMbssKasGP3ARmDh+F0MK3McIWVPkiuPD+3zx5Wd4PYHQY3RTYxFdQGPSNjn3HzxBFz4G0LQRF1cpf/ZX/62ffqH6P/7Gf/atMl1g6gfo+BwdGTuhVzPqj+n198nKK0YThet4zK7XmJaibrbEmxJhu9SZjiU0LE1hWw6eO6QVK2Rro1IBGZxdLJgcPWbgnVCUC6rSpigjPvzFMfNTmzv399B9sA3JuHeIZjgYToQb9oiLnHUyY5ttCQZ9NlFErSSKmiTJGQxN2kZ1DVuxQ8XgoKFIopyj4yPquqUoIgwGoGyWm3MaVaJMxXZV4TgOqlRcXV4xHY2wNJt5GmMYBb7d5+piwaDnIUXbuR0S6maLEwikrrOYbajUgvFYI45t9k48wnDM8eGYbZFwPbvgzuGYNFOkicLWdIb+AMtuyRqbZTTHtCBRJXFZUBc6rifYRBuCvk26zTA1j/U2whIuTS7IqxJDtOi2Q55uCS0XYRgkRYEqYDR2Cbx9mrogSVcUWUa/N2IyCdGNlqpUSGGiaYpRf5+8yGn1kuvVjNV6i1ICy1TcmY5ZXq+wHIVpVLQKiqoiV4pWmWDU1EKS5zWtrHG9EW5osV7lJEmC7ws++eQ94m1MFG0ByXS0j1Aam2RF3+8hmpR1tOy+hyrl6TtPeP/pz/LVy+8wGprcObiL7/epyhrqmpODOxwf3eHyasnp+YKiqpgGPuUqpaolhqXjOjpC1ym2KXlSMDnsURcRWmPguT6h59G2Dcv1nDhPaaSB0k2UaAhDD0MKirzCD3w0rXMhbMsl7IVst9dUzQYaSej3cCwXIQ18P0C1CkRJVm5ozQzT6xBdlmPxa1k3xfib4r9GGpK8jDHN3YqQbIniNVVdYjtm5/JJfZeP7cQmbXvrvN4MAQhxI2KaXR5V7YpJXctZ38UFBF1h6oblWdd1N8VallS7udG8KJG6hu066JreCQgpsCybMAh3wwAdt7TLfXZH8yDIkpw0yajKkqIoOiepBSHkrcN7I0qLouiKTG13LH+Tu/3xVr/a5XJvMrpC7mDtPyZ2TdPA0DvHuNfrYdv2reD1PK8batghqW5cW+BWBN/cD+rmz13xTAhBUzdoO5GqaRruLsJQ1x3twDA6IHdVljusmLo90r7Jw5qm1U3BVnXXai8rojghjlOyLKcoyu5nbhryNKPZZWG7clp3cVKWBXXd0SSausYwfiT4+4OQ45N9Hj26w3SvR9hz0XVJkmSsFgmL2YbtZkOWptiOwZ27Uz746CGPn9zh8HhI0LOpqorrqzmfffdLvv/ZC14+v2Yxi5DC4OBgn48+fsKHHz/m3af32N8f0FKzmG959sUF3/30BV/98JzzsxV5WuF6LscnB7x38pQH5lPqRpHkNZr80WPpJk8sgLouqPJu/cwwdaaHIxov48p+gRI1mgBDmBTJFlRDnidkZQqtpMhL4iTqSnd0xTjVCGbzDVGaIaQOElpRkbcR5+UbHprvQStAKM7SN/zv+W8zPjDQCPn43SeQPmNsnjIxrwnUNdH5D1i/fsYvVP8+AJ8O/gt8y2NvOmbUP+juJ9nQioLQvwfU6K0BSpJlDY7fFRxNbcDF5TnXs2uUKOgHJ3hBSNmsWK03OJ4EupJLVWYkG8VoPCDOIgzhsDc1yTc5++M9etYhR3t7XF3OydIc23Co1Jq8TIk2JYvrJRenKzbzNZY0aEqNJF9iuwaqqSjyDXG2oShyikwj2p7hei5Bz2OxnNEoA7/v08qcszdbHMdFs3UM0+Ts7JS21VmmazZJTl0Kkliwis4pa8kqvqBFoy4lstkj7GkYRsh6s6bfG3BxsaJRAonB03c+oWGJpk2Y7jnYlkFRRVwtXtILjjAtyWqxRVMhvnPI/Yd3Wc4jVN2SRT4fffwUzVCsF0sELl5g0uvZnL56zbNnL/CMRzx+9yHLizXT8RFffPEDppNhJ/RUHyWj7vlXxrx6fcHBvQkvz87RPcn40CZaKvZHE371V/80y6sZL561/IN/9HfIrg08V/Lq9IzBsGG1SvECA5RDnrXQagz6E6TWcvY6oj+wWGy+oK091ouKmitAkuUL5ssLzJ7G3viIqmq5Xr5hMHAZhA7TcYiuW5i24h//w+cEfX2XO+2iI749pRfaXK+f06iEppIcnUwpqoq6rgj7AZuVj9vvkadbRuEhb1+fEq3nVMUcxxojTZt//ht/4adfqP7m//pXvuWGNmVddTZ/NmO016c/tphdZ/QCE8e0aYqc87MLjo6eMJ+v0Q2JoXvolASDhm1WIrU+m8uKfCsYDaYkWYPrm4yOp/QPKkZ9i4F/n9AfYDNgb3iHbfSWunHx+w7RZkOvP2WdzDk66TIsbTuklQVR0RWiVKvTHzqcn10ynkyoVIXQfZK8pUXQ1C3bdYbjStK0Zpvn6KZOWS6QjaLOS5IiYrDXo2gLVA6+u0e+3WD1TOqqQZQ1l+slbhBQawqldNAEQWDimAaXlxHCcCjSCku1zJsE0eh8+N4n6EpjNNLIZE21aPnhyxfousT1DYb+hNdXEU4oOAwDUr1huVljaSFlnpMU15hyQJNX5HmCY3iUBSyvVxyFe1SpwLA2bKOWjAIqiagMdhFBpK6hmgpT16mKnNF4yHIVYbkmm6rAqB3M3QR2WhYcDw/IVMx2sSGpErIqI68lfiso6opFueGwP0JLKjabmKJtUErSNAWGNKmEwnJtVAFVEYNUtLXPenHN0LPIIxiMNZqixXJdppNDVNug6SFCxIDizr0+ebEizXMMo4cuHdKiZBVvSYoNBTkuLatlxDKJCAYKS7ZYls1yvQI9p84byqLC8A20oEaVNTQFbjCgSkuW0Zz+YJ+DfQ+tdbECD2E29MM+ZZYgbUmZZFSbnG21xe336Lke6+U1ttVDN1rqSlEkAl0YlHlEXcVYeg8hPDbbDdE2RtdbbBuKLMO0DMJ+H1NXHB/u8ejBU6q84k+v/yIAf3/yG9R1hO1YWKbH7PqaKJ6TF9vuSSvNjncqOlA+bQN1S1UUaJpCNwVVVZLmCYj6dq2oripEq2Hou8zS7vGgS0nbduinuqmo66wrD6kdXVJIWgWaZnaLSw2IVtyuKnUESonUOjdC2+VUVdMJtSrNEUqBqqnLCnaxA6lpVLsj8Rv3VNN1/CDEMLqMYeAHjAYjjvcPGIQh/cDHsy00WjzHph+E+I6LKXW0FuQuqdkqRVmVt8K2E8cFTdOQ5TlJlpIXnQiybAfL6jbWLcNE1w2QEqlrGKaBpmu3vxNb1SJauWOEOgih7SIHkrwoEFLgBx62Y2FaJrbvYjtds98wbhzsGk0zUUBZlxi7/K3tOBhm93EhuwywoUs02S00tTvaQ14UtxcoTVNTV02Hs7qF5kNVNywXG87eXu+2xgtcy+Zgf8qD+yd89NETHj68i23bbLZbLi8WfPnFa77/2UvO3izIsxbLdNjfH/Ho0T2evnefu/em7B8MEDQsl0tOX57xnU+f8ezZW64ul6RpwXg84v6DIx6/e4f3P7rPdL+HqUmKouLVqzOefXHK8nSLu5mQVwLQb8cRBJKmVZ1WpKUuM6qiQoruYmJrzvmn5u/hOg5BYKMbLYbZdtg1XUdKHVO3aKpuYAEERVGTJNkO80a33hNvMXSxy8N2LOJSSzmvX/BQ/wBDEyRs+Hz7GbrmMtoXDFwdtT7FVFsWS8WzNzEXK5031yW/HvwHAPx2+pcpa5OirvEHHnER0x+NyFIoyoiqtcscjgAAIABJREFUrslSwWAcdjQVxyQtGixHw3FbdB3KTIJWcXDQo8hqDLNlNBrRNIJeaHP37l2kkZKmOfePPqDIV6jaoJadwL7/5F1OX/yQrMjoBX2y3RBIlVTYwiSPtxxMjwDYrBvqSnJ0fELbFuRphWkGFGVJVUj2x8fkZUkmcpJ1wbt3H5Mkc4pEsLhYMO4PMCwDPWuYpWsqp0TkDQejE3qTMU27wtB6OGZAFM/Jqi1Fq5GVK1RhYWkaeblElEN+5Zd/Gc8KmM9eMh5aLOcZmi7ZpCuKPGIz13j44AFRPGcynNILPJJ1wngy5t13PqZtbObrazZRzPvv/wpoKd/+J/+YSjZMD465ms2ompKyXhPYBzx5/x6NzLh6mVCoC0J/ShRtcFydqkqxdIGsA66XS8K+h2e76Jgsrq9wbiaslY1SEiR87etPMaSDZoKl+1S54mDvHpcXc9ra5xvf+IjPf/gl/b6P73jcO3lE085AWCRxQVXAaKqTpQmqaTjYe8A3fv4bXL9+jiH3MNw1Uni89/geotGYjEeYhs7lfMWTpw/Jioi98R2yVBJ4OlJfU24DomTBcDhg2N/nq6+e03cntHXKcrGlyHPSbc5qGXG0/z6PP5iQxDGT6SP29+/ytZ8dczL91Z9+ofrbv/XffiuPdBzLJvBdgkCnzksCJ+hQR96Q6+tzqkLgB/ss1zNGeyF+4CGoaPSabZpjOwGbVUKZtsjWxDIN9vdGCE3y3c+eU5QR8+sE1RbYDhwdjSjymuv1K+49HFIVijtH77KNXlNnA2h08rRr4l5enjPsnVA3Nb1hQBLVIBTr9ZJWKOIkRzWChoQqB13roxkNeZEi2oa62hK6HnGUoeuC0AsZBvtcnc1o9QahGtAFdS4whMAyDYbhAabdYxslqDxnMAxZpwVRscF2D7CCmqKocPWQuEw4HB1RFHO26zmi9kjKDM9ycC2NOik5mhxwcbllu50R2h5SF5RZRBpF+LaJbRgkUUqZC0aTEa2SLNcrzLKk3wuIVwWF2FK1Po4tKJKKkd1j6O2TJTVVmWK7Ls3/zdyb/NqWpndaz/etvt3t2ae9fdwmMiIjMyPtxNjGtnBhQdWIpsQAIZVQSSX+C08RYogAiWYAE4ZGJRASpiiq7MLGmekIZ/Rx23NPs/u9V999azFYO25WTXJiS3hNrnSbo73PPmvfd7/f7/c8bYXre0SRpCyhLLZITYO6Ymh6ZFpDXmc4toZjezx+f0RTVtRVhrQdhKZhhjlFWiIwsVXH222NP+7xNh88/RCnDrhZzal1QVPmmIZGJyqEsFgv9rz/4HugdC4e+kRJSSdsbN3i7dUGzVcUZUKpWoo0QxUWRV4gpCL0fWzLx7U90njHfj/H83RMbLo2wBuExLsNJ6O7ZFnGNn1F2+igpXz75jm1kaO7FqtFzmR2xPXtGsWe2fmAVigm4wHTyYTVZkkS5ew3K6RpoSEYzI6xvBrX6JvZxTYjDD3SfEOSbgkCH8vRevNIWWA7NkVe4noSpSosa0Dgjw73BWhSYBgajjlitUwosl5H+vvb/xiAf+z+t4CgaSSm6WCaOm1X4roOrYK8SKnrBNEq6iqjaRLyak0ni17vKjp28QLowd5SmKi6b6Uj+rylZVpoUqAOm0vLMimqBNU0SGlQFiVFmWKYGoYhMS0Ny9GwLL3/NCNabKffJvZ5yX6g0jWwbA3b7vOitmExHgwZhCGhH/QkBd1Eaj131DJ0HMvCOByn96WvHrDfdYqOGqgxLcHxyYij2YDB0ObBo3Oevv+Qu/dOOJoNcT0Hy7Z7visSqfVmKiEFTV0ftq8crFMS/WDcskz73dG91PqMb1VXh6FZw7LMQz7UPEQATGzHwXHdPnYhf6lAsA+t/qZR1GXdl810vc/fyr5kpRs6jmv3Vq2uw7FtTNOkrmvKsnzH2s2yfpAuVQ2yfyw92fOwERffYZx+KSr4bgsO9MU0y8QweuRTtE9YzDdcvrnm1atLLi+v2aw3SNlxenbEBx8+5uMff8j9B2eYpmQfbXj58jXffP2WTz/9hhff3rBepdRNx+lZz5v80cfPePzsDoORi2noZHnJ1dWCly+u+fbbt7x5c0OSRAwGA8bTEaOJx/HJmDuTuwzyc/Ki+Vc4sT27VB00qi1lltI2DUiB7TgEJz63xhuyPCfPStK0QtUmqpHQ9XEHTReEAwc/sHBcs0em1U1fXCsbFvM1RdEhOguBhep6qYRtGxTseZF8zsw95p+Uf4RlGGhopHHMaGxiDDoyjoia+7inTyjMAcbsPn+v/AcAvPzNP8EMPEpVst0nSKHj+yHDweQwVLuotsW2fUbjEdfXN3QyY7/LkF3PNm67HFO3KPIWxw36BUxbkRcbdtsS2wpwHZtBOCBNcqomIy1Kol2CYXt8+cXPyauS0XCEYViMxyfINsRxBLarYzsautYjttzA4PR8SlkoEBpJliN1EzqTO/fOkUbCOrnG8AQn0zuYdsXz1684ms1I85g7j05pUoGl+ay2G46mx0hRo5suUZKwWuxJo4SiXFEWoEmfvIgpU4MkucE2dY5Pj/ACg1cvXvP+h/e4ub4iWhlYruLizhHjcMJut2bsj2nUDY57RJYI7p6es93v+Oj7PyYt5vzFn3/ORz86Z367IQwmvHn9hvc/PEK1JWVRY5pH/OQ33ufzLz7HMc4wrYzNdoE31hFdyMOHx7SVTuAEpOVr0G12SYljCILwnEZPsQIdUKjCIAytPrPbloiuV1AL0eHYAeFgSJzuUEoyOjpmOpnStIp9nHD/8YS8SNhuczTLYb9b9KcgaOhmQVZs6dqO9XrLaBTy7MlHfPPtN3StQ9NUCKlRqiVJ7PPke3f4q88+ASHxnDH7eMF6EeO5I158fUsQ9kzxKEqZX+c8vH+GEBWu56PZkrrVeP/Jx/z9f/cf8es/+QH/z5/+lNAPcTxFUrzh9jri13/w7/+tGFR/JfC/biVpAYbngtygUHh+SFQsULXOfrPEsArswKYsC4omoSgdVuuI09MBXVESJYpOJLgDxf1nj8h2Ccv9NcYgJgynnN9zMG2dt9cbbtZfEidHHE3PUFrBnXvvs9y9RDYjdvsdmjC5c3dAkqYgO5Joizcw0DWL49OA16/23LkXkhaSoX3EZrun7SLqRmDqIzS949mTh7x5+wbLS/E4Bk2hGh3b8YACz5Pk8YqL4ymLNCbflUzvDmhySLYaBRXnJzZv5hGaWXI8GpBkKSfHZxRlzCS02C7X/Ph79/nmm7c8fvSA+fMb7j4zMYwWU4Fv2QyGDs8/jbn/+II3128Ah9HEYp/PUYwxupBgfIxpaOxutpyc3GW73tKVBZ6h403H1HHTw5OrlgaQegmiRms7nr53hm6MUJcty13G/Dbm7GJC4NlYRkuexNhDiyaHrjNZFymDMKDuWlQnePv8hnt3P2a+eInrTOiMFFd67NOc8egOpiNJsxitk5RViU5DtNmQNR21UBi1ANVSVhlHZ2fkasf5sQ1lwpNn7/HVy2/ZRWsmoxmhZ7BaZSwXKyxbUFcCQ3l4psvby28xbEHoCDS9I05ijM5kNrtAaB2yqclV2rMSKRBkVColGA+o84qn95/x/ge/zeevv+DN1deEI500LUBr8EMD2Zp0dUMWtwzdgDRpWC5v0aTgBy6cDxy+zFM2WUO5KTBDjdkgIM5zNMtAlSXzxY7p0QDbMeiEhZQCPxhArXF0PiOvUpbrW6o6RDU1k4mH7AYkcYllWkijRLXlu/uukymaLlBVS1GmWKaDY3sIUVN1BaKVBP6QTuUHWLxCdQrVCaSp0dJRtRGutKmyHAz6Ew7dwDb7bGldZpR1iW1ZNKqlrFp2+yWBP8QwPPIi6ZvqZUOreFfCsm0Hy7IRCNoa6qbpW/O6jmWb2LZBXVckSdy38E2zRyJ1LeqgKa2rBonAtUyE1kPJldYi6uawcSze8U7rumGziVgudly+WRAEPoPhAM/tQMQHNWnfFJeaTjgY0EmNOElQqt8utp04DKESKXvkk2ob6qqmbRsc18E0LXTZZySNQ1ZVaP2QW9U1rQLTsDA9810MAA5xhEN5q62qA32rw9R0VNfRNqBkS6s6AjcAAXlR9Lgqw6Cua/I8f0dL0HUdeaAZdLQI2R2eQ4sSLVLvhQ1tqzBNC6npfYYfgWlZqENUIYljLNvoBxOpMZlOGI+HvXmqUqxXa9brLavna7Ks6MtfjoPvu0yOBty7d87733uM5TjUdcl6teb6es6r1xu+/volmrSxLIvJZMDJ2YzJ9IyjWYsfOHieTRTHrDc7FvMdz19csVnvqVWLa7vc01tc+Rip2dSH145/afBGgOjaviwnRP9hQAo6AbppMxuODhSHEtX0JIckSSgP5qxE09ANA8syGAxsZsdDTMPuC7KrazbbBNcNyYsaIbUeRaUEhu5ROTH/tPlfsS2PTjQYbo1tnpHWHoUBw+mI0wcXdErx9Ecfo2sx/C/9w3717VvyvKGjw7EdPN9gubzFtFzKquXk+B5FsWK+WNARMBzOiMsFplmy3++ZnYyx2xJDDzA0FykKmrLEcwKwS+K14u2rG45PRsxvv6UqOxzPY3o6pG07bpdXzMY+WSmIoi2a3rFYX1KlAyZHHboU7NYQhjajI5v9NmW+3DI79ojijsHEJ0lyVCfRjZrLl0sm3gmzswmuO2QVv8GbDJEyxNUnFHFDo1r25Q1QcjEb8clfvmW37uhUjtWZVFJydjphuYhoypKGErqOKu+IohJvm5NnKbOjMb/4qy94cP8Jg8GA7eaa1TKmFXtybcVA9/j8i0uC0wvu3PXRLZsf//Zv8Md/9M9QIibJUnabU3740fepasXTD6d8+eXnbBc1szOb957e5fm3C8aDh7QqQYgjNNFyc73mbDbm+nLO00f3USqlbR+gREcQJmhVyM3NS4o24/Gj72N0HaJWRNsK0zVB9Li+6+sbuq7jvQdDrq6u0KSOZXm0bUwnc9Yrg+Mjk1fffsV2ZTOa7JFYjI+mvH59yWg4JkreogmXVlZYtuDFixuyscS04Ph0wHol6XBohcvt+i0//0VOWQpu51e0zRzbM9mnLxmNDR4+uiCNNR7fe0ZWxmRFhO+H1BUMpwFiqyhLjx++/wecn874+af/F01l4Yx0ovwLdF2Q5vu/yVnzr3X9ykF1s18hjYJdHOC4FmNfJy8apGYwCo9ReYTCx2CE5drEkcZul+F7FkXeEC1ShALTdkjUlsX+CstwufPsEXVTcfU2QeqS7WXE0VlIUcborsU3r79FMuRopNHIPWlkcu+BxXbT0naS3X6DEwRk1Yh8r+GPbMq65PGjAU0XEToet1c50ijxLJd1VGEMWjTN5i/+388ZjXU00yZvMqh7PJNhwtnsiO12je+HON4Amc+ZnowQrcTzfG6vv2LoBmyjlCzPifWWcQu69ClVjO40XN++hboGNUSpFeQ67z/6mKqbY7kpU/ec6/2OFy8vefzkPUzP4/XtJ/zurz1mvnXYlm/I9xViEKN3PvtdxHjkU1UZnShpcSjqhjAccDTxKKuG5eKGstBour6Je3FxxmfffInpueimjxlYhNYx0X6PY9kMPRvfbmgNDSs8Ji8i8i6iNcDUHG4Xc1QTcLlaMLmvE28KPLvDrFM2u4b2KKczA+YvNvzuxz9kGyuW22s+f/uKzhaMxz4D4dM4JTe3G6SwMLQJythgDxre3Lxmvl7y9L0R6VKhCYOBKxhbY+IiZTY0GQ0GzK8Tzk8eUNY1ovPY79ZYVofnuOhSxw9GFMmK65ubPgNqhFzPdwwmIXmRohqFZ/fw86G9pxk5nEzeI44a9MGaaifwnXNAsV7vmIzGHE1maEZJEse41Y52GeP7ITu7pgxyOnNAY+ropkme1TRSslrdYLjgKJ88U4iuwDQLLAbo0qBTFb7f0dQpUveQncN2uWM8PcVwSpo2xdDDd/fdcBCiGRLQub1d0JH1ViqpI1rwfR9Dl1RNhWhrUJKuM3v/+H5Fh2Kz2LGuJaPBCNuJD7lIn6LSaZHkRcZoNKasFLo0qeoMTVe0bUkUb9ANgWWYCHQMw6SqehVqU9XUlUJqGqrpj84dx0WagiSOKDKJbZtcnJ1xcjLk5KQHkn+XO8yyjDTLmC/m3N6sqcoW2/VwTZe27Y1SRdmX3npFqUEQBEjRH62vNhHbXfpOVkDXYlsmrmej6ZIWRaMaDFMg6v77ouvGOzyXZVk9DUBJLNN+h44SQqBqhVK9CrYTh2N+oWHoAk2274pn35WzvjNOfVcGaqqSpq4wTQNdA6FA0wxMy6Lr2p5UcODJ9mU2HfPw/Jqmoarrd2SCpmlQjULXzL79fyhjoTrKPCfLUlTb0tDghWFvb1IKAeRZimYYSAF10VK2iv12x9vXe0zTwA8cxuOQp0+nuK5JUzfczpfkaUVZNrz49oosKxBCYpoW09mY2WzEe48fE/g2utEXwvK84vpqyYsXX5FnDVXVb+dNy2A8GjGZhJzMhjx7co9O9t5y7dbj/s0PKeq2t8HRUxU46FP7X1rapqFTvxRXKNUQRwW7qtfAfleYM3UdOg3PC/vtefNdjleRpRVppJHnOxAdfhAghEnbdmRZitQkTVfStoI0axmFY548uWC7SXj56jm2p+G6LY5uEScOstFIoltyr8AxdFSxJfB/GQux/BzTd1gsd1RFxXKfY1selYpIMxPXqzg6esg+/ilpnhJtC5xQ4pgB3rHFfrdm4J9iGQHbaI5MK46mR+i6y/42JQwd7ty9w3IxxzQPW+wiZb2IybOcvFYUro1lumx2EYapo+sNlhdT5h664/Pe0yHz+YL1dkccV7RqyEgFpOUtbZ1iOTZ5UXF9nWHZAxQNlD5XbxYUCoZOgI3keHaKMwmx9C0vfvEV42DI9fO3IB2CqU28bPB9D9GmXL+p2G5K7j94xL2LCzQd1usEXeq8fn1FENrsI5+z0xChKYpqy3Z3y9Xrgos7Y2Qz5f7T93FtE+H7nJwO+PmffcrZ3QsePJ3x4nXB0HxAWt6SXdc8fPCE6dGQVnncetcMpyY///lzwnDMD370Iza7L3j76po0zTk56r/+8KjkZv2W0J3x8MkdXr2+ZvlWcXJh8GByxs/+/DnWhcvx8T1evLjED+5y98GM1WZOmVU0Ndy58xDbM1isSsLwiMXiFlu30DSTTtZoBNCWDCctmpWyvEo4OrEpsg7neEg4bPnTP/kpYRjw+L1HLBd7bjbPGfhHAJRlzsnJmE8+WYGAJBpwcXFBXUrW0S+w9IfMRo+5mb/k/sUjOkfH8SvqVnB3NmazKkFI2i6nqTs8M2Q4rlkuvyHwTYaDKVmWcHr6AT/72T/l6Xu//jc7bf41rl85qHquhWVbSGGwWmRMRiNsCaILSbcdJ0f38PyAz774BqEV6BJU0ZB1Bk3dQCeYDEOSTIPOYbfPcD2T6O0ti3nJUMLT758yGF3w9voa3ZGsNqD0krr9HCKbm1cK21zz6V/9FaOxj2kIpqdnfPn1V4yPJd4wYBiMqYqA5XLB6+dLNuuEs7MTbOeEzz+75u7FGXlWQNdxfu5QVhXjacB+VxAvUwLbYzad0FY1Bn3A/dvXLwgHLrs0ZTYJ2Ec3DEYBo+GEpCox3YpAFxRJwenkiLe7OUrbQhUSDlw++eYX/Na//gRPP8YUOlgBab6kVAsuTqdI+ZQ4LmmjF4RuyHK9QuCh9pJgUKOagG22o0g7gsCizCIUDYamYVg6WbmlkTGysambivce3eX1CxjOBnhuwHK9xbN8DFvSCAPVpgyHLnFUYtoueZTgTwIswyXP1jh2x8TXSaOC3/zwQ4rS55vPP2VyV1FrA9Y7yaPHAY/DAfcuZnz65ws+fvoDxtNz6nbFdm1gGzrCqGkrxcooMdoWfzhC6AIdjU7z2NU1Zb7j7MEYJUC5Jcv6FhXkaJrJ6fgedVGR1C7SiNBki+702zBD81F1iaKmrpaso1vGvsdkPMDzfVzDoilryqbGtWxac8jl9SsszUI2Lh8+eYbnGex2S5JignM6YjVfMZ0O+ej7v0mjIqZDg8CfUVYhn7+85nRyRlILkmQFCMptjOUM8SybVXGJEw4YthM20Y6gabF1m7pssI0hnmnSkaMaDducUIkElMAxA1QIdbXldnHLvbsX5Gnz7r5zbY/dbs8uWiBFh6W7VK1CNTWWaVIUMZ1hA31RxPUcOiSqrQGDutIZe0fohoZpSzRdkhcpqBZTOiBaWjKifUnoTambkrzcHnBIYOg2CElVNwih03YGTaUwDIMgdCiKkq6rCcc+mt6/hWRphFI1vhdyPBszHo8wDaMvPGg9d9j3XEzbxA89pkcj7t4t2W5T9lFCFMe0bdMrZpsGw+wHvLo+FJm6Bs3gXdO/Z6Y6QI97akWDoZtYhkNzGCilANMU/wqWqxcWyIMZqi9wdW2LatsDc/UAff/u73T99lTX+1Z9cSj36LpOVdWAwPc9dE2gyQDfsbFt6zCsapiGTlFWRHHSCxpUh2q7PgdY19Q1/fH2gRjwXRnLNE0aUVPXJS09t9WweqFB3WkM3NE7daxSiqIoaLV+s+0GLrITVEWGron+56OjzwvXLXlW8urVNVVZo2sGnm/juCae73B+t19KdJ0iy0uKrCOJcy7f3JAkGY1SuI7DYNC/zw1HHhcXZwSBB6LHc+13CYvFipvbOV99WVLXFY5rE44C7plPcKyQpi2haxCiOUgoDgKKd4axhq5tQf5SO4slsD0bqUks3TjYxdThdeyoVY1SNfJQjrOd/gOMaY6gE5RlhdQvmM5G7Pc9xqeVBdGupswq4vyKb14vmAzu85/8w3+A7basF7dcXn2D6/tssyXUEVmS0tg2N9FXdI3GPzrct3mbUma94W292uJ4Gl4gsJyAoopYbS6p2gXCvmS71xDtFNsyGQ0nfPb5L/qCY7Pm4tzlaDpFtYowCImjHN+ZYrktpqnh+TYdHVUhETIijfaYrotDRZ7XJLtrvCAk3iUYwwFdbbJPMtabWyZFyHajY/sB/nDLbr9nHevoTtuLEFRDq1XEWYZpt3jWlLoGKVqE0hmPQmTb8uZmxX57ydvXCwzPQViSvJDojFlfrznxp5yMTaTucu/sI+om4/mL19y8vaYsbd57/4jXly+ZnXqs10uKomSXCLrK5Gg2RNUtprfHcE3efJmwPG7Imhy9rHj1dcsHP/qQoe/x9asE0zrm3/yDH/L65YLd6pbbxUsePvk9pN5SNTs++/rnBP4TRqcpV/MrQm+C55Z4zhTN1ljevqXWPDxXY5OtiN+kDMZj/LJC+oqr1zFnJ6dYdoXSdB69/yHT2SnL5RWr24gw9BkOJ+y2e6B/D10ul0TRjsTQGVjHpMWSgatTtBF167Nbbxn6Ll9++QVNV7FYekymIZPJCbPjEZvNDk0XDP0JN1dvqLshaVzx2SeXvP/sAdHW4v7ZBUpWpPmGm7lLYPexIje4C+qcDz4c8+lnX2DpNrt90m9rxZrudszyquN3f/tHuG7LyxcrLMchiSv2+Vd8+63g0cOP+fqzBP6Dv/6Q+Tdx/cpB1R+NuLrcMBga6I7OyzdrDEMjHAoeXnzMxZ27/PSnf4Julb3Gzm7pWps01UmaBssSbKItmpiRxRXDyQBaqKsI33Rw/Jb5bYZpSMqyBKNvyRVNzm5Tc/2m5Ml7F3z/e7/BF3/1kiJv+PTNX9KKgnv3L7DNIU7Y8elPX1JVewJf8oMPf8gXn10yv7phNGv5rd/+gCguePHiDbbjEO9ihuMpyaYijtacHU+xpA+NxmZ9xYPzc15dz9FMA7qQvNlTNBG63aBqnzevFxA0jEIN0zLoCsVmNyf0nV5D6gUIo+A3f3yXn/3sDVqV8Ph9C8mOVnnkOwNDd0h2r0nahKllYXSSbxdz7k7vMbPvU3c3GFLnZrnlaHSXfdzQNDq6bmFbLnQ76ianKCzMFgbjMXEeIXTQTQ0hFaajoymLeLNmOBlh2hZJlBLHOe89fUBWV+RZTZkuaaI91sikynOyqsIKBwzkiKu5SZtXBKGLcbJDuXue3LnPL/7vrzEyyb/ze/82/9sf/xmzM53HHz7iy69fYSEhkCRljO+EdEJye3nLnccnxJmGa/o4usIxJCK3cf2OrqrQCBk4I/QSLEM/eKhzbNckTVLStEWTNkK0VFVGEHgIERBHBePhlNViS2paeJ5DtivINjUPH/yY4WRCxZKq2bCI1wwZYBgjitWcXfua6dGMTrR8/uWXjEch09ERm12OFCYX78+oKjjWJ6T5mm2i0AXcrCPS8hrDh806AdW3xLMsptVbfM9GSEnZVOT7DF230TSDJhWczo6xTQtdV2TlkmcnF7TKQBPWu/sujdeMwjGj4ahv9+s6RdHjxuJ4ddhctdRNA0hEI3u4vtCIoxrHcAmmkqxMaKUiSmos0+75r7IhLyJaWjrRkFc7pNAo6wTHdhBS0XYZq1WMrtuYhoNtOdi6Q6cUutQ4Pj6iUf1wZRg6mtR6G1pekuc5t/M5V1dXlIXqGb1K0dLhuE6fedU1Ar8fbL5ruVd1g+t6CE2COmQWW0UvLvhOSwr6gYNa1zVVU6MdWvw9W1UgpYls275xX5dA944m8B2NoK5rWqV625aU70QJ3UEBWzfwnUHrO9zWd/SDnvHZ26h6cL8FXYtS4DketuvguQ6j4QjHMRA0FEVJELgUVY0mdYTo3+86+ue0iyKiOKY6qGShH1Q1XaOT/Rhn2eZhYwyhPULTdFAdTV6h6BiNJgccVUZdFuhSUpUl+13GdpPh+z7Towlh6GLbBpreq2nXqz3r1Y7tPmUflbx8uaKsCjzPYRB6HB2NOL9zzOnZuKdGdC3b7Z71asPrywWv3+hI+uKX73kMhyFB6HB0NOHx47tIXbFdR1xezemEIItjVrslVStAsxCH16fPp/7yUqqh3zuLd7SHMs3ZZ2sMx6CyLLTvyA5mL4AQlU4rdaoEIWWsAAAgAElEQVSqIS8V+uHUwTB6jJtl63hBwPR4QlVlbDZbdKHTqIzF4gZDtzCMPh/980/+DM8bMHCHGMYA23dpdy2i1fp4jdDwgylZ8vbdY769zOlqjfF4wp3TKf6gJVcLtvsKaVR4zojvf3SHVrj87M+/Jt1XXF/t0aWJajp2uz2PH09AQJGXeG7A5eVbhsMB6+2WmTHh9jolr1N0o4+CIC2CgU1alTR1RzCckpcAJp2EcNJRxgKhg1BH2JaP6axolMK2jsiKVwhdYONgWg7VASF4fnbG829f4Lv30XyJgUGy3rHaa1xdvkbXPIRfcTRVCN2myjT8wGMfLbGNAYNpyKdfvUJWFb/5a/8ep3cV7z0b8eUXt3z9zYLlfI/neUhdUpU6UiqMVkPVPs+efsRm+5yb+QYnDPmd33+fKt0RDHzmi0tUU+PvTF5+/YI7D48wbMnt4prh1EcTRwz9M/bxNZ/85UtGM527Fx8QZ1t0zeXtVcr5D7+HeeFQFDuuN9d43oCzkyOkqtlsV5RNylVe4Q8N0rRhMBmiy4K/fP4Z5w9mWGaF6WvstjFl0bBtMqDhzeUrnj39CM9zqNo9w8mI1WpBlMzRNJ2vv/wFwpgj9DOaYojlhYRjk9W8Jk8LtkZMU2moyqUsd4xGIyYn5+imRhnD42cam7lGsraxjIabqxuUXnF6esb7T38N26340z/9C374g19jubriX/yLt1zcD4l2G0zDZr3ccff+faIo4Se//hjTuuT//ONLnj+/xfVcFusVji94+OAZTbPFNP7lO/L/3+tXlqn+m//pP/tDw5FEcb+lCicWbedQVgXDyTGtquhwifYNmtBYzK/RTR3H97hZXNMowdnFPYpMIdGgFXS1IAhcaBrK0mSz29JUvV7S90dMhncoU6jKnOPROcNgwO3lFbQmr1/ekGZz7l08YLduuHzzBVWRsl0sUXXfRAab0dGE7TbmwaNTrt6A5VX4QUeeCmpVY9kGVV2h2pqB57KLtpRSUVKz3STo9gBnfIQ/cFjvF3QopuEJElC0NJXOcr6mEwGToyHrqKDVKlzLpywE4dChjCom05Af/WTAPluxX9uURYPQWoq0RmIwmo159c0lWphhuVOKKKEl4nbZsl+VmFpLut1zPJlSZoq8SHDsEXGSkzc1ruGjigbDMcmSEqEVVKpD1xTuKKDJSxzb7gcQpVEVBVVToOkWnWzoLIlum0wGISfnFxRtw/HZXQaWwzeX38CwxdRs7pw4HB1VeGJEvW3YL12GZwM6QyF1jbc3LxiNxjRxRte1JCpFNB22BEuXTCaTvuTWlsg2w9JC5qtLsrKlFh2242A6JtF+T5k3ZHmDUiVJWlAUDUlS0SoNUBRVBDS0bUeVVzSqIC0rirJBtC2WLUiyHWAyGc94/PApq9VzbpZLyqZvtmdphjeiL0I5UzbbLabrEiWKfRSRVwU36x3Z3kAzPeL9hjRVON6A8cQgTXaMAx9LG5LuSiyzQ5c5x7MLiqzD96yeZVo2SGlhORaGXvcCgdZFqRJN74jiiMV8jRAaw9GQn1z+fQD+yeR/wHFsdGGzXM0pq4TddsPV1S1ZluN5Xu9Z12pq1bDfxxi6ge8FSCGomop9sqNRDaZl9u74Azs0yxKyLCfwfaqy4Pb2msNkSF3VRNGOPM/J8hTdkBwfH2FKnThKKcuatlU0qma1WnJzfdkfoUpBURRITcN1PfKiIs0KdMNE0dJJMC2z97kLSVXX3Mzn7KI9RVn0Q6BqqQ/Db6MUeZnTodA06LrDcf53oP6emkpZKtpWQAdV2ZBnGWVZHHiUDeIAj7cs6x0/tQf19z8HPdu3olH9Vq4+/Dtd094hvbq2ozn8vmlZB6zUL21ZlmlQVRVpmpIkCUVeoVRHHKcsV1uur+csVzvKqumzoest2+2esqxJs14k0Ry2vcBBoNC848x6boBjujRlQ5FWPcUir8mTElU2OJaF63k9SuswfAeBh+s4jIYhJydjpkcDDBviLOL6+pbXr2+5vtywXMQ0LTiuy/nFKafnMzzfZjwdo1kmSVqw2SQsV3uub9bcLDZsdzFV3eEHA4bjMeFggOM7WLZJo2o2uy3L1Yar6xUvX99wO4+oahhNJpzeOeG908dM81PSIkcIne90uv0iVfURhrajzNPDprT/M891GVlTQjXhef0lcZyQphlxHLHb7YiiPW3bf+9sy+pNRbaB5Qo0HVTTo7+2qy2b1Z71IqapWxxbpy37yIzUI7K0xPPGeL5DXi24WrzhavUtN4vXpEmGYXl0UieJcyaDIyzT5u/s+53qP3b/awaTAWmRcz1fEucxVdnRKpM0jsnigturHUIFSGExnY4wNIurqzUPHpwzHPsUGZimTdsW1HXDPtpSlg3b3Q7Pn1CWPZvY8gSaoZBmR90ozs7vkKQZvm9StX00xHE98rIhz2vquqEqdTxnSFEphAaaAUJW5JkgSXfUzZ6qiCmzlirXqFXK7faKTrbslg3jcMjV2yvC0RE382uklAwHLp1SuG7AYGBTpgldbmKZLXVbs49WrNcJrjMgzZbMpjP+rT/4dW6ul8TJHjDwzIc8++CCVy/nDIMZP/jRg94OOByR7XZEu5b3H9/l5uottn3Cxz94zO5mTl02HE/u8PR7d0iygsVtjI7PB9+/4LMvf8bJ6SNevHhJmlSMJz6qqfBMjzItkSJndVNxcXKf8cDBMSR5XOMYY+aLJQho6op4D6dnAeFwyGZVMzv3mN/e8uKbV7iOC53Gg3t3KMqIMHS5vV1hWRZFlVPXBWn6guV6z707D6m2HoEzosg9LqYf4FkZWeYSDDvCcMJ6uUW1Ja1qKQvIiw0361uG3h08T/HV52/54Y8+ZHTk8M//+T/j6uqK87vn3NzMOT0P2G5KLH3I6ekp4ajj6uYS353Q1oLvf/CMt1dvWVwpfM9D12o00fH25gWGpfj66xecXdzDdXwm4xMGQUhSPOff+Nf+o78VZapfzVH9n/+LP6TVGU8GJHGKaXZk8Q5T09jv1r0y0h7y6s03zE48JoMZy9UWJSqGkxlVXjMdToh3K3QNirxB13yifYHQ23dtVomOpiesbytEpzianjAaO+jK4LNPfoGhG4zCAb7fcfVmzWpxSxo1zI5d5m9z1osUL1DslibC6CiKltnZEMmEqm7RrQLD1BCdietZJNmalg7bmvDy+SVWaJEbOdskZTAcgAnLOCaJchw7pG5Lqn0OpYYdWrimjqkHuCiaogatwtB9PFujaxraNsO1HAzT4+rymnBwSlHkFM0G3d3Rtmva2qTYrelkxa4UdLscT7NRloYsHGg6NHOA7RoMgpD5zQ66DE3oNEVDHiU4joYpLMo6oylT2kaR14JW5uwzsCwNxw0IQ4f9Ju7ZobLEEC5Q45tglA22EAynY0QacTo55vr2NcvokovTOxhSRxhLgvEztm864kXE0DfYlw3tvuLi6YxV1qG1El232eQ7Zn7IyDnDsAY0WkwlSrbZjlYr8T2brGpodJ+krJHCxh0YNCrldrEiGLk0RcZut0Q3XZIkwbbsA3ezw/McmqalrsE1LdrOxAuOyLKI/WaO77h0UiNJU7I8Iot3jMKgP15tK2QXousu8/UbjkbnFHFN0yS4gc/1+obr5Rv2qSBuWlQrWO8zltEC3bBpVYGuS+q6B7aPA4fZdIjvmZRFTJrEBKFO11XkqcF0eoTUFfvdFlVpGNJhs12gupxW9V9ndnyC1Fqub674g6j/D+//GPz35MWOLE8wDUkUJUjZ25fqpsKyHaSwibP8AOu3kEJDyI59tKaVIGWArtmHjGPRG+JUR9dJBv4EVI+28jwTISRZ2tunhBRIqeN5HrYtybIIKTtGwyFCdDSqpKpT8jKiVjlCKtI07vvoqkZKgWMfwPqipaWhbmqSLKOTEsOyqJua7IByatqWvCj7ApPWH20bunEo1OhITNpWHlz1+oFt2g/Mmg4dDXkeo9oCqXVoUiA1gdS+O07+5ZDeHjamUvSofdpeYPAdP1WX+iEm2R7kCRywWRLTNHt26yEu0DTNwUrVvStB6YZJXSrSJKMqm14aUnXUjWS/z9luY4qyoSxqsqxnyUbRniTLUAd+bNe2BEGA53g4lk7o6tw9m/Hh+4+5ezZj6Nq4po4hWvIkIUkzdtsdWZb1+gAhqIqcsiiIoz1JkuAHAffu3+fRo4c8evSA+w/ucXx6REdNlickaUqSZqRpCVJDNzSqusSyTfwgQDN0XM/HdX0QGmXVkBcVqm1Js4SqqWkRGKaN53o4nosf+JhWj2qqyoYoKri+2bB9nTOIjkEYtAjoDmWqrkMctMFd11IW6Xcz7EGU0FMkdvWG581XiE4egsS9mUwIQV2XZHnKfr+jKAvapkXVorfnaTqGlLiezWw2ZDCw0TVFladk2ZbHj++Qpnv225xwYJFmy96y57iYuoNt2FQqRRkNVQetEsTbFVKa/N38PwXgj+z/HMdpqesMGo26LKhVRdtIUA6GlQAdX335ipvbObuoZDIeE4YOnjsgyzIePDolS2tubza0JNSlpMgkjq+xWF2TFnvqWmFZNvv9nkq1ZGVGVysabKoiISs7yjxDmgA6AhNNaNR1wnK96E8DrI4kVkip4bkBhhGgyRbfHbJeNASugyoV05GB6Zo49pDJkcMmnSPaAQNHx8Um9I5pM4vBwGc4GZDHNZ7d0bQ65qgljWq2uyWvX97Qqopou2ax2DI7tlFtxZdfvmY8HXP/wR2221s6fUe81fH9njxyfHwHnI63b95imwbh8RTDiYjXWxoEWlOz2ey5ehthWSGmVXN1dUmVT5gc9zGp4chmehSyvF4yHoxxTJ+i2GEYDttlfIjXjBC2ZJPc4vunzI5n5AlUZUmWJHRFwPuPvodsE3zHIY07Pvr4Q2RrMV++pqOg6yAIPOI4QTcsijLC0E95+v0nvHm14Hz6kO1uySbeYJg1p0cnbLcxWR4hNUErdlRVw52Le3z7/AtsRzBfZQwHJkmUcufuGVW74tO/fMVv/85P8IKOJKm5nd+w22ZouuT6as1gFLBabjG0MUEoEJWPY0uyfMN4OmF8FBDvBT/6wUdopsXnny6Znbp0QjAaj9jtFkTxDXki+L3f+g//9g+q/+N/91/+oa5JDENDk5I42hKYE4Rs0Q2DskyZzU5Yb7YYZopp2axXEZ45xtQkkzAkTfZstzs6raXqGvIqp2lTXGdIVRa0XY+KMWqLaFWSqRTpteSZYrPfEx6HlErnzdUNoq0ILJORf0Fd1VSlSeCZ3Dk5Z7NsD4iogt025/LVCyxPILWMOFIkEXjDhu0uoVUmhq5x5yTEdE2kbWNKm9B02VcJmVBYQscsHIS2RxQaWVzhhS6y02hpUHZHnGbkTYkmBUWxxMKnSAscWyPJKy5f3XD33h02u5TldoWhu1D5GAzY3FY4VsftfEs+77C9IdmuQLY2lkhwrICyyRCGRVEr8iJCCUklVQ9crhVZWqJEi2NZxLFiNDqiSBWO5xNFWywnQLda6iSnyRoMx6NuIdpv0DWNYeiTlxm2H3D56pKijUirjFpUuD5It0UzW9ocPvnkazK15wffP8dwHH7vd36f+W7F1eUlppbx5L177KIY17F48uwRJ+czouUOXRMUbAiGJrOjUzzXR2Ly449+jCxzsnyFlgksK0DXNQLTIe1iWtXRVPbhWLC3KmmmhzRht43ROoNabxkOJzRZRdc0oHfUSFo0pAG6ppjv5txub9jvbxGNpCgLJtOAOhakSUSexwhdYxPn7PIIDI31PGbs+viWTVFnGEqnKbcYjomjTZgMx6iuQes8shqW0Y66knh6SBiGlE1OpQryYkVd9Rs2IX2q1qTTDdBdNKt31GuGxvX1WxzL5e/s/iEA//vovyJNcva7CNt0KVMNlMS1PXx7jC5NXMvC0n1MQ8dx+uPRNKkZDWYcz2boWoOUfSZT1f022zR1LNOhanLSPEVoElMPUU2LTosqJW0lkaKjqmqSpCTPCpqmV2y2XUWabWm7nKpMWG+uuF1eoes6ZVERxTF+0HNDEZCXGZopyfOUsikwDEFZZUTxmjjZstutaP8/6t4s1LJtv8/7xhizn3P1u6tdfXP65urqXnWWdIUEEraxQ+LI4DyEPISEPKUh5P2GkEAeQyBgFAg2CUkU44DsyE8mcqNcS4rk256rc+6pU82uXbtb/Zr9HE0e5qqSn/QQCCgFxYaqXavWnrtZ//kfv9/3OU02iHpYv6XXWCJ6A5aUCCmxpleVer7r+ZoahLRIZ7CdRjhBHMb7FrzC93yU9LG2b8v3B8j9o1qtadq6zz+KvkkulAQhemWttbRt14tNvJAgiPB8b1/e6bOpnufh+/7bI+s3mdcgCEiyhDAOkZ7szWC+xLoOYzu8QCE9ifIVQgksvY2pV8D2kYY4inpOaBozHg2ZTsYkcUyWRty5e8y7793nF/7S1/nZn/+Ejz95wofvP+Sj9x9z59YxcRBiO0tdtJSlpqmhbhzLVc6zZ694+eKC1XrLZrNDKsnscMbs+IDhaIgf+hhnEVJh9jc00OselepzzkL2ylnf7zFenh+QpgOU5/dUBU8RpRFIQdM1SE/1W3Xh8DyBtILQxJzwBCnD/kZB72MeCIRU/Q1C29BVNe5NLEAIBoMBcRxTy4Lr8OWfbWCFAWmIYp/ReEiapmRpRhT5eEH/dVI3Bca0mE6zvFkibc8ZrqqaZ19+ybNnL2k78LwUVEvV5hjhWOVbcBGbXY7nB8RxSqxSfNFSFFuCICVNMv5y8e8D8Pe9/wbrHMqTpGnC8fEpk3TGdDJidjji6mrNaHjEkyfvYjQkUYJUgrLoi2Pz65z54oLV9hIlPWJvBk4RpymTyYi83DEaHoGsKQtLXWsMDms6NtsWpRxSgXSKNIlJg5imqbC6FwTM1wu0dQwmCX6QsMuvKduGIAzI0ojACxlNxnRoiqrk7pMx+q6k3oYc+EcMx8e8uHzOMPSxTcBwnJCMJKXtODidcrY+Z9eWfPjkmGK5w4tTQk9ydDzlZv6afNOw2G5YV4ZGQ73ZgA5YbS3ZMOH06DYvfvIcYyVIgy4SPv7kaxg75/mrz1mvAh7dvkvGCaYMuH96l/sPHuF3Q07GD/nWr/wlHj94j0d3H/H4zrukWcfTzy9I4pDv/vGXLG4aDg5O2WxusLLi9dVrmrbi1csF926n3NzUfPDBOzRlzeAoJVaGwPqIeMTkKOLi2RlEgh89fUE2TqFLKDc3GCfYFEvyYst4MOPddz5kvTlDySl3795H15pnn5+TJIpv/uzXabvXvDr7kvk1DMYJZbvCINjmL9GNRMmAamO5f/8DYj/AtWMGo4z1dk1Zdnie5eJcc+f2RwRpxXJhyIsVm3XJw0f3CYKQrvNp2zXrG8MHHzzGVzVaOlbrS6LskMcPb/PDH/wpWgu+/tNf52b5nJvlJXEWsdi85vq6YHI44pe++Tf+4g+qf/fv/da3fc8RqAEXl+c8/mgKaoAzCbvNgjgJKKucJLUYY3n5dMlkGrDZrrm+qolD3bd3RQ1BwNVqQxCnZMmAqprT2hqlYqKootiVSCHxiJBYynyBVRPKTY4uctpdS+SNCMOMoihY3hQcnGQ0jUDGEi9SlOUcSYDye1a5dBm6U/h+xWZziRIDnO5d2XXTUJQBh6dHSG+IZ8YI6/ofbg5OpjPoOoyTHMxmzCZj5otLbFPRlQZjOlyncZ1AmClN1VAVG5wR4BS281HKsVzeIIzH9esrYj+gbWrGo4QvvvwJs5NjXCCpWkc8OEFIg5cYWqMQfobnS5pdTqoUnnVI3yOME6rdjuNkgJT+3lajCaTAmpb7d+/hnMETCu1K8p3FcwlNZTm/XhDEiiRxGGfYrmuyLKVulnhegkNjdF82axvBernCtQ3WOA5ObhM5j2azpbUd+XZFPJGkwxEnJw/xPIe2c7Ik4OL8DM/P6VTN5HCCbgwn00N28xsyP2U2OeTwuD/S8yOBM24Pw65oygqLY5SN0a3A9wK2m4ogDAn8kOubV2RxhhIBylq62iB9g4oNnpdgDDT1jtBLCZOENB7T5jtGwzHIkE2es7jZIJF0NJRdh3aSTgtMp9FNRxSkeL4Aa6l0hzVND9weHeH7CavlFmcc43HC66uXvL46QylDGARcL26YL1aEwQhtHFL5eDLi+voaa1tGowwnDDfzJWW5Q3ddj+BRit/YD6q/Lf4rgiDph/DOEUUSS41Qpj/d2Na0rWU4zmjbmtVyuYfKK7qupShzdsWGqi73MHW39733bXLlKYLAJ/RDmrrEGWgqxy6vUH7AYDghznorURhGrNeLfuh1BU27o65aBtkhWZIR7vOOUom3G8bVes16fU3b5aw3S3b5jsD30LplsbwkL+fk5Q1taxgODwm8GN+Le9mAqVGewPf73KmxDUI6PC9EIPcoKIEUHgKJ7wV4KtirXA3COpztN6lK9RF8ZxxOO/qumESiehoD/SCLozdgSfVWc+p5fbPdWtNvb/cK1l7jKt++n9y3z99sbN+8hV7p6lxfxIqiCN/331qzoijaW628t4NuFEV9ocb0kQNrHEZDVbbMb1a8fHHB82ev+OxHX3JxvsAaQRRFTCZj3nnnER9//C4//Y0P+fSnHnPn/oRk4GG0Jor6gqixhqIo6VpNWbacnZ2zmC96ykLX4QfB/nn1H/sbnSz0Stw3+dk3Wl3g7Z8p1W8tje6RYp7ye72s7+Gsw2jNKXf5hv4WTvRwfmsN1mhQEuEsYBDCopuGrm2Qoh+UhYDhcEgcR1SyYD2+IYpjPD8gy0Zk2ZCm0Ww3OVXZYV2PbVDKI/B9kjhkOhkRh4o4kgjZYWxFXi5pXEM28djucmwXkCWjvQlN0nWOumgIQ0uR91zUwI9pW0Oosj6WgOWv1b1R7h8mfxvrWuIoxZMpXdtxdJQxORjx+uKcrtM0TUNZ5wyGCZ4Pk8kYKR11rRGqRNsaz/PxpE9TGQbjlKK8RipF23VEiU8SpyTRiNPTKUEkmE4mGNNgTF/8i0KF0YYwClku5iTRiLapqao1w8EIP5B0bUuSDFDEWOeYTGOGqWJXveLwQc69xwMuX9Tstg2DMCFMJF2bs97u6FQNrSNMDavlBhdIyqqg2i7RlaTYGAajCSKwKJdSB4Lh/QmFXfL8K8fseIALNZerLYcHUz588iFSlhRVw7ZoSaMxt4/vczG/YJCM+erpV4ziJ/zb/9a/w3uP3uNoOuNXf+lnuHf7kOO7d/jgo1/k0buPiGTBxdMNL794wRff/yP+ye/+DherLVF0m6M7GcubOUkYk2Uhl9drRGhRIiHMhgzSIc/mP2T9KmfXrIjeHfH6BzdUbgdWc+fBu3x18RnPPzvn4emj/c1+zrP5JcL3OHt1w+QwYLWusSblyeN3eHW2o2w2FMWWR0/ukcQZjx4f8fmPX/L44aekQ4808+hMw/d/+F3Gg1tcXWzRjcdw6nH5eksYOsazkmI1wYqC1ULz9a//PE17Rl1ZVJCACBiMQ05Pj1guV2y3Oz752iPOXi65c++UXbXFJQNePH/OtmjYLZZ0OqCoWz7/4o84+2rNJ197F900uM5QbTRdXTFIhvzSz/3FGFT//DJV4OOkT1VVmEaic4PSHXUpsaJmvUj4+OsjWr3l8syBTphfzwmjIZ3ZUZYW204Ifct2XTDxjwm8mtYu8aKMQHjotma96p23nWnpih3Z5JiyDLHmJePRLQ6P3uvvPJuCn7w6I4sDhg+GvLq6IU4S1pc9pN0PC4TrcOaQ2cEI1ylu5i9oio504NE0W6qq13mORimdFby8fEFdrpnGx7QVxGnI6eEhV1drskRxfbYjjWAxLxBdyMN3fGYTC37IYl0ymNY8f7rk7KsIL9zhdM/RlP4WZ1KEUizXOSqIWW1LDmdDtnnJ6Z1jvvzRBVGmGPgJyrSs1yvMtiPyUogq6qqkKUuy6QSFo9huqLXhYDCgrWrwJL4MiVJBXTRILKvtgs52tEZT1ZpkELJave5faIcerdYIPKyosCiKcsN6tWU888hGhxTFmkCFCO0j/AS8mkT5+K3g+boke/gAL3RclwWjeEDVnuMlET/84Q3K70hGljrs+NH5F9y5/Q7bSqH8IbvdjmE6YbnYMl/ueH1tkSLGDxXgsdls8byYzlhM7dBbgfID8nxNECrqpsQ4QRoOGQ6GtHWDQvSN9VpSrkpGwzFBIFAq6ksq8xLkmjRNmG8XCCsQ+MhE0EnJ4mqBVJIgArBYK8h3Fa0riUTIQTDFOY+y1YyHM+oO8uIa3RqUbriWLQjF3VsPcQaqVuJFI0ZhgickiIQ4yfpcUtOQV3Pma8dsdsDx0RFNmeMpRVl2nF+8fvt9J3xF22nipMOLQoSx+IEjTvqj7yjKCAMPrMa0jiwa0dU12SgAfOq2w9j+hcrzQrq6wTqoqpooitHWUJYlOIcvA8IwYDQc8dHHp1R1Q16ucQKGg5C2chxMTwijfnPoexHDUUbXKOraEocJyle0rUHbms5UgGS726Bt1duxrI+xY3ACbTocffZuMkpomv55xHGCVJKu7ZCd7PFTxqKkI4i8/RG+w1pNUZQo5RNFYY9b2ZdtfL8XDXiqV8u2XYsvJFY4OtPiEPhBAJ4H+/KVkh5CKUC8JQJEUQg4rHVEUYjaD5zGGXRnsKYfznrFa99SfzPQQV+E8rw/U5n2eCWDc3a/me21sUopoijqqQXWwhseq3M4IQmjkCxLiKJon5VtMbrX2p69uuCzz77EdI6maQnDgMEww/M9hqOMIPBIkzG/+IsPAMF6vaauO3Z7wkLdtESRjzZ9/rfV/WZa77Wvbde9Vb1qramqiiRJMFpzc3Oz19BmSKXe5kjfIKPe/DshJEVR7Hm6Iaa1GOxbVWr/xd7HaBC9Ltc5u6c8OKRwOGtRex1t27V0oufO9pterzeD+T5HR7f6a7fPtWrd0tYt0qa4TvP67KQQqMsAACAASURBVDVdVxAGktE4pTMFQWRIpyF1U3CURQyilMloxs3NNevdBi8IKLsC34tIJjFt15DvFviBJIiiPtfc2ref9zCIKMuWIncIKvJ8DUYRRAVIyeQwfYs4s1IhneT6+oY0yZiOD9iVmvyqIvQi4ugQ4XlIWZJkMXVTcng0YrXMmc1mpKmPbgzNVqA9je0U0gREiSQMU7xoQBh3TKYp2/WWLA0YJkOE6yjXHVEmaUvF1z79iJvtK1wT8u7De1xuDGue41RN4PsczcY8e/aa6cO7qKBhOMm4udrhyjWHdx8Sd44vXy/54L2HRLYinh6Qty06aBjECdtqw9mLFffeu8XDR+8zTl4SRTsMkI5D/AxS3+f49CH/4k+/wypv+ObHD2nMc1TgEUY+dBP++r/5b3ByGtCWW5ZXF2wHAUnY8uN/+aecLX+bH//4KcurFi/yMJ7ECyzf+eH3efq65jd+5S6/8GsJTlyS1wfcfnTEqDhmNPJ49uqc7fqS7WTI3cMP2V4u8EWMu95yma+YTGJiL+B7P/gDrouCmpZnr8+oaGhERWandDRMA83Tz55y5+7X2eZn/IP/409IhhlhFzOd+pxfnPH44Tv8X9/5E+q25vq64Gs//ZDPf3SG68a88+RTbq7OkCLl4DjEGI1xW3w15upME4ea0cRns9B0jcfB9D1eXzyl0hGz2YzLqx2TgwHbvML3Ij777DWP33kX4ddcXc3RmxFG+MSZ4OLpDQfTT/nZn3uPb3x0gLTHnF99jqsU5zdnDLInPHpyl7y9/H83Vf5/8OvP3aj+49/7nW9fvTjnw3ciFhc1Bp9k5HF9tuGjRx+QNy1BYHn5bE5TxrSlxFrN7bu3cHKHF8c4seHoMCaJY1aLNUIB+JSlpW222NZDa0WhG6TvcXwyQHopr5dXZOMRcXbILrecvXhBLFvuHZ5gtGbXXKLViuG0odx4jEYD0uweTqTU7RLbeGzKNVECwyxmMj1lva7wM0OZt4wPPKDk4qJgkk7BrAkSw+J6yeY65+J6TuQHTGZTRlHKLIv45jeOGQ1LfCydzoEdd+57vPyqZbsuUNJHKUmR9zDgqrBoCzfbFSL2wFfsipKucWxXJa+uGoz0WW5z0qFgu9mRRYfcvT2lqnLqskVFHp3qKHVD22gC5dO6jmAUE4cR2+2WLAtp2r7kkmYDdkXeG15cRxBIcJrJNKZlS1EUBDKlyGuE0nihJBtOKEtLUV+idUdbd2RZhC88Vrs5m6Yh8gIeRSeoec12u6Y0huX5nMPRkHrdUG12BKolX2/w3AC0oCs065sFbZlT5BVSWrq2wmkfOsU2r5jP19TtXsggErpOMBqMqTtD2xa0ncFZRRQlgKZte8xPWTS0pu6PlsuafNuBlgzSBD+UtM6QhjFVXYHQ2G4Pf/c0tdW9hcUJhAio6w4DNF1DpzsQMEoHxCqmw4HsM4vL1Q2+32+mpNOE0YjASym2FVJ4dNbghx5pnOJaqKqCOM4wwLZdI3yQXojrei2rdQ7jBLuyoLU1v9n9JwD8D81/gcTfD0r9pjDfaR7cf5fxeIq1Faaz3L1zn/ff+5BXr15TVRWe3x/RhmGEtVBWNfmuQEoFQuIpr2+5e4qmafF8H207tGmomh1h6FM1O7quwvdjhOuP3ZWIyDf9sBJFCU3t2O2WKM+SxCnGQBQFCOlYrK7Y7BYgZN/K9n2mkxGjYUperml1Q1EW/WapqpGew/MNNzev6bqOwI/2xSdD3TQgxN4cpfqiVNtHGPqiFCAcvu+RpQmT8YDZbMJsOubocMp0PGI4SIlDnyj0CUMP53p1LDiU1+s7te6LSMC+1e+Q8g3SqsXYnlogheqvJX2dK9iXu4ToN5vBXhTw5nHesFb7obRvqEvZP0ZvkdJvh2xrLdvtlrqu+8HUOaqmpG1LmrZBmxZEf6zsBz6e7xHGAVEakg5TnLTs8pyqrNmst8znK87PL3n96jWbzRYHBIFPkoQkSchwkBDHPeKs67q3+tqubd8+/7qq9vSEjjzPsdYipSRJErIsQ3lqf/Ng0doAolfo7m8UjNlzZ6XAISjllipqOOke7Itqb+bUPtIhcZiuo62rfWYVQCKFIB2krKM530t+v+81+D5IgXWm//w4wy7f0ekWz5MMhwlCWsLAkQ0lQrWEEdR1DsKxXK96FfRuTlsbnFaEXkpTdnStZjBKKcoNQloCP6Lr+ryqkhFCWrpWgE0JAsVfa/4DAP5O8V8SRhFSBL39LIC8qPACxXa7QRuBtRKtwVlB07Z9HMSFey5thRQhZdGxnNeMxwOkv7efuQDdtoyHYy7OL2makt12R5M7pqNDDg4mVE1JHMes1wvCqN96a9OLRJaLGl/5eMoHE3Fw4rHaLNlWJZ4M+cZPfQPT+VRdhekUR4OPePed+wxSiSc9bh1GeCkEkeXJ4RPuPDxEpYZZPKazBudKIpHQ1haU4dnzM3yv4f0PPmaQCI6T2xzEIVdnBdPDIdV2jCkzhoewObd86xd/hR988V2kF/Lek0dUedXzzUXIb/zGL3J82i+aJIbN9pK//7//Dv/n7/0Rf/T5n/CdP/5TTu6+x87MIZMQx4xvTUkPM06OG7S6oemm/MLP/SqRX5GvK7pOMxjcw3UNo0nIi6++y3TwgHffO2Xif5+bn3xGh2OVZ0ymIW2x4+zlFS62DCcRP/7eU85vzgmzCGqfQLW0LsMLU+7fj1le54jAoHwYDg6RAq6vVyyW5zgUm+2aOJ4QhgZja0bTAYvFJUcHpzx6+BFNI7h35wPeefgOr86u+fW/8kt85w/+KQfT+8gg5/nTNWkG1kmiOOL6ckvsDynLa45Gn3LnkaSs1qTZkKdPv+KLH/yA2lTcPrzFtt0QSMPqqqImxbghs6P7fPjxx3zzZz5hODjus/5Ivvm1v/IXYqP65w6qf+d/+s+/Xe8MDx8MOTy4A9LH2Ibj2T3Wi2tGpwVlWaLUiDTzKYsVRycJp3dS4jjkq68q0uGQ+armcrVEpQHT2RFR6OFJQ9s6xqMJJ3cGFEVJFCnyRUe+3ZENQzzro2ho2jm62nL/9A6vX14ipYdzPoNpCq6hyAVRnKBbQV11hJHAmJZd05AkgkcPPyWv16zLDZu8xA8lCIurG5TsGCQpm3WP/WirFik9tGqwneXDj0+ZZJrZsGa3e4GgQIgdRnbs1j6ffV/z2fc0SZKRRrcIg4wok6RZxna7xY9jUJAkA+bzFZtVSdf2x7DHs3sEvqKocqazhM2uABHz8P1H/OjLz0mDDC0dxoNWazzhsV1t8SMfF0v0eouwCqNbtsuyL7F4PrrtyPMNceTYbupegTuIGAwPyaIBEk3TdqA0OA8/8kmHHptNidUKrVuqpqIgp6NmXXQkyZCiaWlCQXacULQ7gpFPXjteX6+Jhh74FVXTsN6UfXPVWUBRVh1t4yH8AYODGeuiQQtF0znCKEb5gl2xRSiHihxIh/QkTW1605Aw5GVBVTeUeYfRGj+QWKtoOgOyI4lDLs/WNK2h7nZ4Xn9ErKRPSEi966itxWYxcTqiWK0QfoQfRezKHCs0u3JH17bIpkMVFukppK9YzpdoW4FtMa2H78WgFTera0bjlMgLKOsSGUq06QhkwGQ4xo89OtOSVyuMgTgdI4VHW2nqskTKoM91r65pdMnfsv8ZAL87/C3CMGI2npJGMZ6ISaIJs9ktNpsNQaAYj8dsdjsGo4SmLSiKgrZrqJqcIOrb4p7yOTw4QIoeiF7VvT/bGEtdN0wPDml1RdWUjCfH7LbbPnvnJWTJkDJv+2N1KdCmYjxNCfwQYwXa9pBryQCtBdtih3UKIUM6rTk5vs+dW4/wZIgUAdY5NtsNUkGrazrbEAQBceSTpRFKwnq9ROsW5Quqekunq74YJRXGNFjbYaxFKX8P2rco1SOmcLxt6kupiJOUJEnJkpThcMB4PCZJE4TsbzT643kJe/xRpzVCCOI4fjusvjnS18bQtXpvwHJvj/flnvH5Zmva7fFSb/Krb6IAQoBSvWZRa43vByil0NqgpOpZ1fuMaxiGeJ63Z6M2WCdpWsNqvWO7y9msd2y2O+q6ZbstKcqOrrNo4/CCgCAKCaIQL3wjGpB0xlCVNevNhrIse3JD1+GcJQj8fSzBQ5vePBZFMZ7qUV5S9c/rzXWxdn/NhcDui21SCsIw6HPGrr9ub2IDfuD1g5YQBIFP6saMyxOwto+K2J44gbNY3dFUBV3bvM0UIyRSSXbpij+Uv8fl1RW7PCdJk7cba2v7I/X+OfSK4e12jdYtVxfXPH/5nF2x6W88tKEsaubLNduiJBskhCrDEz5tVfdWusBiXINT4IToMWi+T9e2pIPhvsDX4nkBuiv4181/CMA/v/X3KOsNnc7Z7XaEQUzgByAdQRjsiQ4WYxx5UdC0DXWd09aW2WxE11mariKMQuJE4kTN5dWSuoIg6L8mytzx4Qdf45OPPuBgco9bx8fU7ZybqxXHJ4dU9QajJWk2Is8LFjcGz4tJBoZ7D24xHkx58HjKzTVEI80693l89x0GmcfF9Rmj8THFUrNdlHzxxRcslmsOpnfY3uyoipB2B7KUJCPDzeqSQegjbP89IJjywXufMJsOmQ5nSO3z5dMzfu3Xfo7565dsFgXJMOLFxTWe9PjWz/0UNWtGWcTdO0fUTcnx8YxHD2/T1D220mjL5NBnMb/g2Vev+ZPvfsbv/MPfI682BMmIxx+f8vyr54xHU5zKefbFgsd3T0AXzC83OO82Seoh6wGmTlnmz+isB64kNkeMZkPOn18ikhbXaG4fHHI8snz9HcFyecXZZkBnbthca6rdDUfTY0xZE9uYalmw3ObcPzwhXy0xzjEcjTl7tqNtS6zUzBdXSJchRcKd24dcz59R5JJsGCOlYrvesti9wnQZw0nI4fQBn37tPV69Oufeg7us53OS1KfudlhKhL3FX/3rP09nr7i8yDk+OkBYxWTqI7AM0glSBhTFDas5+EFI1zmmByl5XVHXOV0HD+4+4POffMX4cMof/vEf8/L8c66uz1hcGR49fI84VkRBxjuPfvYv/qD6j/7B//xt4yQX8ysO72akoxrddvihIkxDdBtinER4EiM3DMeW8USy3ZRYbTm847NbF1xdrEmTnvMYqgRBThRCVXjcuZcwv1nR5OAqwSAecPvWhEjFBApsI0hij9mtEaW1VLJhXV/SdS31MmKXK/AayqLh/t0UT1huFjleVmKs4XB6yHqZ8+LZkl1dMZ72DU5FTrkQNM0aZIEVgqbxEHiESYgXB+jWMH8tUNpHeUsQAdtNzGYFz162nD3zubhQHJ4M6XQDfkkYZWyrc6TnI729mk96zLJZP3gLnzgeECVe/6LrOYSv8GSM86Gotvzwi2coP2EyHjMeZOxWGwaDAV3bUpcV08mY5WpBFkYUpcWPFU0rCeMIoaA1llrXyC7ED/rh1cNnvSxZzTfotiVOFHEWU+w6dpsCJ7fYJqRpW4bpIbaLsMsG1ymEtijbcfzgiORgyGax4fpmzXR8QF1XrDcbrm+2tFrSmIbGFNRNibSKQXRCs23RjUVYn7Jo6DrLarVlMs1IBkPqqkVrRds5PB/yco2lZjoZo7Xk/Pwa3RmSWFGVOUII2taymhcEgaJrW1QQEA9j4kGMcIKmqHAGPC8g39akAwjiFiFChsmQLE7wPJ84jPCVBGVpjcZZgW1aqlXN6OiENBkSejF50+NvPBvj+SHj0ZjatjjjmI6PsVZg0NRViXCOstnSAWWdU1VbAjVglMyYTYYYaxBe36SOopi6zrGu5W/q/xSA3x389wySmE8//oTzsyVN1aI8RVXnFHVOkbcUxQaU4WZ5iVIGKeHk1hGDQYwQcOv4hPV6i8AS+n1rdDgc0LUNujMo5aN8j81mRRRmCBIcPm3dkMQJUZjgK0kSDxmNEw6OQxarJbu8QngObfvjZm0bpN8hgw7rNM4ZpDQ0XYE1GqMtbaeZTmZ0rUE4SZqmCAHWaKxxFHnTt5LbijhVKM+w2S2pm5wsS5FSsFhdIqQlClIEik7bvgnu+XStpSxq1ut+gOtb5iV5UdG0HUb35bC67RDK28cGEuI4Rru+ad5nM723wymwH0rB90M8z397tM2/8vdvRAL/6uD6ZkjVWr/Nub7BTxVFSdO0+L6/H8ANTVO/3Wq+Gb7iOCaJUwSSpm6BPnPJfjtpbH8j5QUeKlCg6BvmTmPQGNdh6eMEXdf2sQbRI6/60wn1dqMbxRFJmr6NJDR1gxByb+16o57tc8Pj8ZgkSd6SD8R+wIb+6B/6za3nKaDfqLatRqp+wJ+3G5Ziy2l3CtbhXG+lss6CNeim53j2ban+Ol6Lc344+APiOGIwSMmyFNNpnHUEYUyWZf2Nh4CT4yNGowGDJCUMA8o6RyqH9Cza1lg6vMiB1FhniIMBQliMbTg6PmQwipB+Q2tbjA1xeAyGPoPhcM8zrnDO9DQI2dE0hr/JfwzA75/8NlJahoMBSZKiO73X+GqquqDpSpJBTBwFTKcTlFKkySHGOEaDKU3Tkhcrjk9OEV5O1ZScntyhbm9I0pQsGeNcydnza16/WvLll58jZIsQEMURcezT1IYy7xgNh5SFYXoQ07oVUiUk0ZDp6ATb+QS+Ih4YxodHPLidgjPc7K4oq5YsiJhMBNPZbY5v3aYsCyaTMfdPJqznO6azu9w6HvPi7IzljebJwwfsNppf/tW/TJZ1PP38c2yr+Pi9n2EYhyRZyMuzC24dP8APFdYoJtmQUGpOT98njlu6xnE0O8V0OdPpEVVZEHia45OY+WVNUwY8e/YC5+fUbUsynDKYjPHiEbPJfV5dnKMZcPvBHdrWZ56fM6+uQIdsdg3T44DZEeRrx2q+4fjgNjfFD4mHT5hEMVfFGaaGl+eXeHZMff6c7z6NIDXoVhEPUjylCG1CkXdsqobpaMYoiqi3a3arksnhlLJZkK9LHr5zyvn5mvfefZ/rqwvm83Vv8hOOKBzRdhXadOR5xWq1oewumF9Y0lSw2S3Z7WqUP2B5c008UBhaduuQe49Svv+9H/fEBq/h8vWO8eiI2SwhTDQ3lzVhkjO/FIxnijAcMF9t2DjDcJBivJJuk3JxUzC9lZL4BQezmKqZ07YFddvyh//3P+MP/uD7/OG/+ILf/Bv/P8BT/S//69/+9mBoOZiMCIKM+fYaL9XcuqVoyh2LVYNF07gVyI6q7pWkzz8LuHV4ShBZhknE1z/6hHpTczS5zcvnl0yHUw5mQ9JEcDO/QsmEpuxZdz/zrft8dfYc6+2QBx34ktsnJ7x+ec52XpOoGIVHudZEsaAsapquRVhIwgGeF3G1fInF8dGTr+HKCa/OnvLLv35KrW9Y3njU25xRHFE1cP/ka1StQKUWJRWzwTGddkR+SKxSpGfYbUuacsjVyufZM81XT2vKWlKLGiOKnhwgfYQ0TI4A6RGkkroEZ326piaJY04OT9juNuyKgnV+w9x1VM6g/agPo3flHqEyIIpCBuMR+WZHFqVIIVmuFownQ7CWNE7I85rR+BAR9q721W5OEPl4QYQXhohW4qTDdpK67JgdDXCuYTY6oKw0y/mSQRozGc7YzBvC0BAon65RdI2lNTmPTx8i/IhADBl5E84vr0n8iGkU4ImMm8sbpBIIRX/M7kKGowN2RU6a9vDq5XaJCoGgou5qAi/j7t0JwgRs84auKGm1oG01bVUQpSOqomEQZcxvVlRNThgGeELikRCGEZ4naFpHFPhIF+MFKaePhsjQsdsaJqMRThuKbY6XOFQkOZoO+alHD7l6PudqvaDMdzR1jZAejW4pygZj+vJclI2Roc/FqwskksJ0KOUziDNqXfetVBkyHEyZjqcEqcCSk8Q+aTxgU+5YbUqU9BHWI40H5EXOdremrgvCIOyP5Zzg+PgIKR1/dY+n+qe3/i5YS5aOabuWs1dfUdYNXhASxgIVSF5fXLMtN/iBJI4imrZlNBwRejFN3XB5eUHg+31ODoGnQpQniBN/nzX1aNqaIPCp65am0kxGM6ztENKSJCMchjgLadqOsq4RSuL5EUL6RGkAFopyh5P95isveq2ns325yvMVndVIAd7+mNhTPlVe0bVmX04KMa0BC+PxCM+TXF9fsttt6dqGuipZrW5o6rzflioBQvc4F2to27rfhKYJQvWDkkNQlCVFWZEXJbvdjrKuqN4wW3UPk3ei13d6ft9a77qub22/tVbJntsqBFL1bX8pBVKIt8f+Ukqcc7Rt27Nk98Pqm+FViB5d9aZE1Q91fazgDRfW29u9etuW92f4K2cxRiOl6JW6e40r9AB7qQTQD8T9EXuP8ZLCJwh6axeivx6e7xEEPghBkZdUVf2WblCUJWVZoo3et+nBWtOLDLqWtq37myvBPmfbb4jfvHXW9AQX0zNo2X/8zhrCMEB5Hko6jLEYqxiIMbeaU+T+/3qzpRaAbrt9NKMnNZzrr/gn7e9wMJuABCEcURSQJDF+EPTFz7bCuI7VZsFifo3uKrSuubx4RVmvSDOfKPHYbbdIKdmsSxyKqunzuHXXIBBUlUWIGCdBKEUQJHihR6crNpstbaPxZYjuLFYr2trQdZK/5f1HAPyPzX/NbluiZF/qlFJTNkuUB9tNjsMnS6c0bcvi5oaqLEniKbfvHNPWNdvdljhNWaxuEMpS5BVh4OH5HsaUOGuZjKcsFmvariNNhhjX9pg4PHw/7K+FdawXO+JE0eods9kEbTRxOODoYMrJ4X2url/ghRIlPOq8JIlG/PjHl6zXNVbD9esNH33yPpV5zerSkqQh203BYrNC+R4hES/PXtKKY+K44ez1S5pa8zPffMhyvsOYgF/+1qfYxjI5HOIFllsHj0F7+NLw8MGID5981PNH4yOkzHn+/Cco2VAVJX4kUIFB1ylZFoEs+628HzKeHLDdlfhRgdUxTx5+StneMIhnLFdL0myGYcfF+ZrR9IjhqObW9B7b1Za8ctx9fIfFaklT5Xz/T38fVMRROON6VXO13RLS8offW1EHE4puy2ZhCIeGly+vOb+8Yll1bLqSFsfRndvUqkCHlqrT1I1gPBoiZP+zablac/fOI7ruhtdnW6SylAXEqWF+nXMwPcZYSZp51LVhNDzGqiUvXy545513WK0WaO0YTCQvvqyJRx3L+QrMgGwQg1+huwKlYnwvJE1mrJctSZpxdCvi7PyMy8WK0hTcv3uHrkrIV2tmxxldJwhSn/l6zfGdGTdzQ5QmFGVBHAUcncT82rd+8y/+oPrP//FvfTuIHck45HpxA11LtyspqwVRprj3eMRwdBfhVaRZhMRxcjJGFwEntx3FwqPKoewuGB8P+MmLF8yOJVGgOP+q4f7dEZttRZgEHN5qef+bMZ89/5J1V+KnBknB9LalcAu09TG1IPJC5hdr2sojnUg+eP8BTaEp1x2zwwOsyrEoTk8OSL0RX335Aw5nI7744ownH804OswIXYrUPuNbKWlsefTBY56+usDUBtfSb1U9RV20IDuE0rQmpJUQxB7XV1s60xBPFU4oknREFA4p98Bxx5AgifHFkDyvCVOFU5ZdvQNP0GjLcBxRzRtiFzNMxwSiwApI/Bky6UAaiqJlu1hDZ6i7DiR4ShBFIUIqsiBlMd9ycJAxv1lgTEXgK/K87WHmbYO2HdNZyniQURQdXdOidYsfJPiex2R0SFlUaL3DcweMJhFhaNDacOfhI3Ztg/I7bo1HbHdriq5BeSnLuqDIlyAtRd2A9fB9D1/5HGQzlHGUuwbTSdJBhPMt2kHkh7xz9x5D6bPYrJlv1j0KanjMerPjYDSkxeFJQSgVy8WO4+NbNGVL4EHkRwS+om01KoxQQqG04vT4GCNbFtstaTakNRWe5/Hg7iHK+Qwnd9GNxa1KBnHEqqypXUOH5Xq1o6oqRskUzwaMxynWSmq3I419ymJNbR2hn9CUO5wUFE2Jn8F2e8N8fslqt8BQ44yhbjtcIAhkxOnRPbZbQ9nt8KLeXy/o7VtJFtHUXY9VEoZfX/67APyjwX+Hs7BcrdGmIk4SgiCiNR2t7bi6ucDzQ4zr0NoShSm6MyzmK6xR3L/3mLLIkRI8X+KrgDBI6HRD0+bgYL5YIpzED3qP+unxPRwN0tMcHJ1Slx15seTmZo6zivVmTV3XhGHKelvhnKDtWuIkJAxT6qrPG0oJTe3wVUzTWna7As9XeJ5ACI2S/aCRJgl1U+OsRmIZDocMszHL5Q6HZDgeMR0f4Pshjo4kDfdD1QZtehmBw/bZP93i0GjdUDcFrW77DVMa90zOtgEsVVWwLbb9qUPbUFYl7u3207w9tpdS9u17a9Gm3z6LPb7KvcFRiX6oYn/07/s+aZIQhMHb94njCE8pzF408AbD5Ps+YRDhXG9g6gH/Pf7K9/uhtt1vYAPfR0jZ53aNo+t6VSxOovdbRQf4nk8cxSgpca4vd3meD6LXifYDfk+yaJoKIR1SKYy2GNsrWLXRvbrUGeq6pCwLAr8nAQyyrJcx7DOrRVFgrUGIPzNpvYlEGN3tH0fjjME5iZQWowVF2ZHJIXfcXST9+1u3/201TVX2XFtBnwvvbnhhPsf3PUzX4XA0TUPT1Ox2GyyauslpdUHblVhTURZbmqbEupo4Am1qjGkQor/Ou3xLnERESYj0PRCGdOyRF0u01hRlw64o0XuUmcAjDCOCQBAGPlLWxKEiClPSbMi/1vx7APxv7r8lDD2ur5fgFNoY8l3NeDRDKR9jdd8dEDCdTfaxCx9jclbbS8I4oDOG1eYCXM8VRvscTG+T52sEEev1Dt1BXXVUpSZLprSVx2q15dlXr8nzCqMtYZDRdS1lUYIMODm5DVZT5Tum0yH3HszY5QuiKKTYdVzd3IBsuXvvDscnpzx4eEqeX/Dsac2dW49ZLV5APObl5QUPZu+SppLPv3iKnNY8+/yK0zsDbp8cczg8pahzHn9wymq90r3xKwAAIABJREFU5M6jU7Rt2C5zDgb3GB868qbh8FafqZ0MpgyGfWSmrRMePpwipeQnT5/h1IQHp7c5P38GZsDBbNzn/sNRHyeRBc2yt41J2bCYnzMZz2jDaxost46fkIQedWH2uuCEl69+QprcIs4s+AJTZuhyxdX1krt33uXe0RH/8vln/w97bw5r27bnZ31jjjH7OVe/+7PPOffec+99LVXlsl0gGRVYsgqBAwwRkiMHRGQEBCQvJbAIEBIQICSoACFAgnJAI4yEjDFU9/r73m1Ot89uVzv7ZswxCOY+p2wJFQGF9YI3oh2svba2tNaa//Wfv9/3kUea09Uxm8xltoyg6dhvNnSuB44i9SXnp2fk+7estzukTJlN5zCEOI6H7gOm05Rd/o7NnWG1CsmzA7qRhGHAYpVwdXWP1oamblFqydHRlLev1zRdThAPVFVOGLhoW/Czn70jTM1oQnQsSRyRZznL1ZLb2zuMMYQx/PhPX7MvHtjl90TRlEN1zerogr6siSYeq/iS2TJEDS3Pzp8ymBLBjG3+lrvNgaefXODGDiZoefnuJf/a7/2bv/qD6t/77//TH0yTKfGkZXnkY2RNrxvaQ0oiQ3Lr8vZ+Q9FsiZTDpD9m/6pnMHsuPnpOO7RMp4qmyzian7KchgRqggCiJGVfblk+SVHzLTbKefk6QwjD8/MXmMZDM0E5EaaLKSuDM2m4/GRCts7xjIu/mDAMmlkaY0xPEFhc1xJ5ilhNedjekeUl3dDTNBCoBctFgvINs6MYpw05NA33hxuydcBh3RCGhqFz6YaMyTTA6WKUiDg+PaEfIFwGiLAjmce48wDpx3ixoupr6nYgihes1wd03/Dk+Igia3B9Q55Xo4Pa0ZzMTujKA76KiUMPTw7UXc/y9Jy8bcdtZrun31kEEqEg8F3aqqHXGi0G2r4n8V0mSUxbW5JUUrcNTR1gBbRNRZB6DMJHSI+i3CJUB27I4dBj2mEsMEjFdr9nvrwgmvgUfY1xJf4soCr2uGqg2tc4SjIY8IWH7gpcJBUVtIbJ/GTEnHQ9YTKhb0bUTSx93CBikAFdpdFNgecLhsHyxU+/RgaCZujZ2w7hSpaTCNsZrG6QgYeIE1Tg0XmwvDgiMANJ6LBvS4q6wQXcRDA4IWmQMAkD8ipDm5pJeEwQw2xxTFM27A/3BGlE0Wq049F7LvM4prctfeZg+4bFUQK2Zbla4KgE3eQIY3G9kKcnK0QF2g44nkMgwfSSIFRk+S0Cj6bx6HoQvSSQIW3b0Q0HBq8nnCikF1BVhlR5lB1UXU0j1tRFjh4c/mYxljL+YPr7Y2HLkY+RhNGe1LYFuqvotRk1jkOPFAN2gDRaslzMedjcUXctVVdQlAdwBHXfsd6vAY0vXdqmZ7FcMgB12bKcrXCly26zIwx8yuzAbrdDOJYoDInjiL6rcKQlDBOkkOiuQioQIiQvGg7VFuGOGTvd2UcDVYcrPULPw+gG30vwvRBLA0YjBpdJEjBJJgyd4JBviOKI5eqctm/obE2YhgSxT9u01FXNMPQMQ0fb7zG2wNIhlcDann7Y4qiBNHqCH/rU/TsGYzB6JB3six1lVT2imjTaaLTuaZoGY4cRmTQMaN0hkFgjEM5oxxJCjXcOhAVGjqjnu7iPsHklJfJxEAx8hWCgrkocQEmJGcZ2eK81wzA8bjfth4zne6i91oayLBFCEIUhwIe8p9Y9SjmAwWI+8GrfP6ZpxgiBUqNZSymJkuNt+/dxBm0GcBwcpRjsmA8VjkCosbTTNO14S931SeMEz/MYhoEiL+i7DsGosR2b/cFYcmta+rYbKRJKEQbBaIfyApQf4Eio6o66NQhHoUPNQe45ac8eS1VmtP5pPZIepIOxA1fDS/7n8r8j8GIWiymep7CmZvPwQFtrcHJ2xQ1tlSGdmqZ9wDo1OB1FkYFw6FqNYxSd7SkaPWIDlYdQFs9x8V2Hrtc4ToijPHAGVkdzfN8l8MD1wHUdkiAiiQLapmbQEun4GGsJ/Jp/pf63APivnL9L05ZYLEmUkAQTHCciCF2aNkNYyLMtdWPxgwDXd9jsbvBUgMJnv93heoqL80t0X+HagNPTFYdszWACkonCd1NcNVINPN/n5Czl1atrqr7FjRQff/ZtVOBw8XTBodiRpgvitMD3DXHoMV8lfP3qimQ64f5hy2FTUPYO1nWY+D6lLXnY/JIv1q+wtctf+62/Tq8bvnz9diyqakkURrR9x3J1ypOTiLbWfO87n7FantFqzfH8lKdPErpc0pQa3QxgPC5ehDhRi65TvvXpOXevH/jW50/54Y9/hBkSOl3guilGuPRdT6B82mZLGi/HDLUWpIuG29sDUvooNwTpM9icN2/fEU2P2Bc3lNs9h9sKP7Hc3t0QBpIf/tEvgJZPP/uMw+GezbbEdDHzE40SMZ7rYYXmhz/9Oc8uzyjznm/edVi1Rufj63p5MSEMU5JQgM2xJqIvaxQxk0jSVA15X7JpBTIStJVGCI/t7ppdXeDhsUoW5HuNMTX7uqavO/oOWn1HXpccXx7TGUUaPsN1XPKDZrPdM4lmHK9WfP3NSxzjcXGx4s3LVwjZMnSGtu7xgxXJScv28MDlxXNCOUVaF+k4uInmyy+2fPf7l/zwT3/K3XZD726YBB+Rzi3X9w+cnE/Jmxvu3zp0+cC3Pzvhn/utf/1Xf1D90Q//kx+k8xm93eM4Pm3hcrq85De+9zvc3j/w7t07bN8SBw5Ol5BOe95evcWqFfiGi4uEu7sNy/kFY1yqJc8OtLXHxYVPVbdcftpyf5OzW9fM4gvSMGHiH3O6+ogo0gyNYegVQRxQlC3X97esniQMIsKRls36luVswtFyiqMMq8UK6UTYPubZJx8xnU9AaH77Nz/m+dkZqRfR6wO3mzXHpyuefxZzyN7QlA5hmpIsXK5vbpgmC9JoyXrzht2mYV9mWLciDBcM2iGJQ4TxKHYdg7V0umeyjPADB2dQ+CoiCkOCMCZNpvheilKCus3w3AisSxxYHOUx+IZo6lMdGkSlceqaqRujhcULLFEcjdpzoTHaErgTBj2QRAm6F9RdM7rBHZfpdIJSHnWdkYQxwaNCE+NhjaQzHbNVxGBLEt+nbnOmqyXCTdgeCrxA0rY1UZDi1B667lAIiuKA57v0w0A3FLSmInQCPB1QlDW+b/BdiRuE5HlBXhQY18MNJUq1uL6lbXukjGj6nsK0VEPDdD7BdJZYSaRVrNd3+MGIcTl0Ha7jMlEuYujJqgOFaQgjn0+fPSGdjnniOBR4nkV5/phTjf0xaznzWO8fkH5HEEoeHvbsDxlBGoJy0b3GjQNwBvzIpe0NynOodENeZAyPOCThxZR9hSMHfFcydIbUn+D7ChqDEQsmsxmu7bEorDteyIKJ4u27G5q6QjYxbd0TL3t01TN3YwyKrtdMYg9fTfmXsr8DwH9c/zs4niUJIzbbA3ebBzrbolxFXbWgDYHj4bmj2KGue8ygeNjeUjXluFWho9MDVeUgpcANetJ0yc27A1YY5rMVu82OKPaJ45i72zV5lgEGpbxR6zpZovuBum5pm462HVBSoaQciySDwyHLQLRY2yOsIgomeG7IYjZhOVsSKEXoezTluFEs6wNaj9s8zx9QToiULlGimM/nOFLheRJtNMJa6rJmv8lomx7Xc+l0jRFmjCPkA0oKtG7p9Hi716DxQ8Mhf0NZ7QmDFCkNZflA3/WE4WzkHBuBGRR9rxGORSqJkj6DMePzGINyA5TrPdqrDNaOilIpx9fO+1yqeYw7SOliLSNRQXnMZ4uxKa7ckTAgxPt466Nh6/0G0z7mWsfm/PuYwPvMatu2j1EB9WFrObI++WDVklL+E7/3QUjweN7//F4p68jHeIPlQ3yhbzviOCKKog/bZG3G9r7nuuNnzCNjtn9EVvVdjx3Mh0zu+6ztGJlwxs2oMUilaNsO3Q44ysHvPE77M4bBIKx9tJ519H2LEILr4Q1/v/6DUZbrWPxQfSjPJWmAVJYgCmh1gVKCwPdG8gQGjEMcpnRtRxQs8VyPtmlGlrDnA6A7Q+BF9LQYo2lqi4OPg0NbC6ocfD9ksA5KBtRNTp7VpOkMIUbSgKN6mqrnbw1jRvV/nPxH6G4gCqOxDCbGz2GlLE1T0mtLmiSEQQwI9rs9aTgl2xfcXN8Q+BOE4+D7Hl0p8H2H2/vteCcqDrm5e4lyYRh65ss5wvHImjVe7DFdrkjmCuPUWCwqMCTJjG+9eIa1DaKfc3n5jFevX+FHsH1oUZ5L7bRY2WHril3l8eLZOT//6Rd0mcN2XxImCXV2jR0GsmZHZ1o8mzCfKg7Vlll6xmp2QhKFVFXDZ58859PPn9GUhnTmEfsr6irj4rnHu5tXXH3VodTA5cUxvqfozIDr+WMJ2lf88Ec/YhKfcvFkRl32NLUgSnyMUeyzNa++uUVIwf3dliTxscBXX12zPRQslim77AHNSB7Qes36NqctS777+V/B9RRWp7h+x+bhDtMrHN+giCnLHs+Pmc2OwBE0fU9eV6ySI05PVmy3W3abnNCHKiswbUwcxvhBxH5X4HoeD3cPWHfgdv2GzfoNoRMyXx7RlT3ZeiyG5qbGX3rstxnK+mRlTWdKpvOEsm5pm4iH9RUP1xWB52FFT1WVWGGpupo317cUVfPIvA5xPcVquaQs9+RVxn5f4wVzdoct8SxBGEOtNd+8+RkODifLTzk59uiblKMTn6pa8/WrPYujhE4f+OE//IZy33D2NCXXGX/jd/72r/6g+sd//7/4QTqZ8Muv3tDbmtViRlaWNE5J40Ea+jx//hFol7rqePX6hmQVcPnpOZfPPuGrn79jPjtC9x1JPCNQKWdnU0wX4bmS+YnD6ze/QAxTnj9P2N9VHE1OYBAYXSAGl74C5dSEoUsST4nSgPv7PVbUOGYgUBFplHLINkzigENWoaRLGCte/eKe69srzi+P8d0Zv/zxA7v1nqfnK9ARdzdw8+YrluGKk/lTrm7uuXp3xfEqwTYa3buEYcTRmU+YLCmbljDx+PKXX9O3FmdwCFxBpNSoV8VnnngYrXGshxeGtH1NmqZstjvA0LYls+kU8HG8nlpXdF2L1YbIkTj9wCxZIITk0Jc0g8U6DtJ1KIuG+XyOlFBWNavFCWWliRNvhGy7oy5TCkEc+QR+QlkN4IDROVIawmhK31uq4kDTOrjBBBW4dGaH5/UMusdqw9D3mFYzmcQoqaibGle6uG5IWTSU2YAbBhijyJqMnp44mTIIqPsWoQJaranLhiScsi8K+r5iMYvRpqcTgryucKzFtj2+J9ke9mg0DAJfeHgqpNgeaA45xW6PMA5iEEg7oo+ECNG9ZRgs2vSEcchmnVPXHadPlhDWDKIiK3L6ThAHE1TgkT2WdMIg4VC2+CG44YAnZmBTkCGeo0cLT+iC21MUHSerGYKWquzIDjltt8UZfMJpStHvCBxBHATUbUmt9ygBza7j7PgZnnI47HY0TUMy8Qn9lENxoG0NnnKo64J/tR3bw38w/w9p+oqiuafqGpJ0Nn5RGTxmyQphLN5jSWe/39HrjmQSc8gPDAxID5bLJVIGlFVOlPjM5im7w45DmZMkKX3fkiYR1hq22y3GgFQjuHu/PzB0PWGk2B/uKKsDg+mJooiu7bm+usP0Y5HIVZLFcsYwGKqixA49TVUTeBFpFOHJUUuqpINwJEIY6nZP3w1I4eHYCKsDBIKqLGm7mjAMkQ5UZU6cJEg5lnM8z8XzfAI3JPBjTo8uiUOftsuZTGN836eocvJyw+bwhqYtCDyPXh+wtiKOgnE7WO4p8gOD6QgiH1fJUSwgBK4KcKTCkSOSbBigbRv0UBMEPr7vj4WlQaOHgcHqEbH0mBXtB410JFhGbXLTUNU1TdchhPNhKPV9H8/zHjeyI33A2j9jkX4obsGHAdTaMRP6Phv7HoVljPkA4X8/PI/P7f4TuCz4M96reMzZeq6HIwTScQh8n0EPVHX9IUMbBOFID2DknMZxjHQkwsLQa8Q/dr3wPZ8kijFmoCiKx4ytoes7irwYS5P9OJhXTsYv5I/I5ZrT/hyspakb2q7lqv+a/6n4r4EB1/VJJzGuO26G4zjCDQyOq7FCYZyBstoQhjGmVxgDjhhwhYvvxCjPAwl+6NH1HW3fc3y8JI1DHrYbhFScnC4I3Iiy6PA9gSNbHKkpyoyiHXFXvhehuzEikqQTlD9+SQjUlL/Zjtnyf3TxX9K0Jb0e2G4K4iRmMg1p2vIx3+sglSAKJjhiRHJ5SnHY7XADd7QaC8NuuyWNE8JAUXY1QTxFumMOfDKNcV3B1bsrnlw+xXUcXr95TZIq4sgjy+5ZTmOmScLZic/JcUS21SQJlPWBzUNGdnAwwuAGDrtNRpyMHNu6a1mdB1y/fWCy9CjyDV9+9XPCcMZ2+8DZ+RlYzXI54+x8wfHyjCSVpHHM08tzorjj3ZuKb33rEw6HPev7kiSRuB5EYcTLrx84Ojqj0zeUh5aq2vHlNzecnk34B//7P8B1PNIkZDE7piwyvn75EyL/mKo+0LYVgy1oa4U1GtcNqZuK2/sb5qsTorTn9u6afgjY5BWro+ckakpbD2N23Qr6QdFzAOly2NdAgHFihNyx225oWxfh9Hz9zU8AD60VSsHd/h7pBgRqSRgq2nYgK2C5iimKbjTcmYG6aZABuIEZH1cMeOEEi2ESRahYUpmB2/UV+0PPIk1RqWSbHRBiQdPlFEVJFBl0V3Lz9oBUPTc3O6Jwyjev3oIylO2eQ15hHYVRhuvbB5T0eLhfk2cO3/3e99ju9pRVTTfUBKFP21oWq4BJeEHfb6kqh8lkyh/99A/xo5Anz89xnZBf/OwtZ5cJxoVNUfC3fvfv/EoMquL9LaH/p/Pv/we/Z/d3BxxAq4HCbgmmE370f74k8T2CcE51sORZxsWTJWdPjtA6wXMCbu+u2BcVUZiiG58wmNF2b5jM4dnFP8ubtz9B+Iam3+OGLmlquL8y4OQo5XPYW+bnA31rKHY98STmxbc/JwiWbNYFSZzwJz98TZndcNisOVlcspovWe+vKOsa35vgipDd4ZrZwnB68jF2mBAGgqao6MqWu6JD2AdCuULLLZPlGbc3ljDMaLIaT55xc/caLQbmxzO+eVVyfB4xDC3ltmfyWCh58fHzEahda4qq4eTsGBVYvvj518SpRDpjTs11JGXdMpn59N1AoRuGrkbiEycxFsN+l1OXcHF6ivUsm21GOo/xfYWuDVJYXBfKsiXyU1xXcXf/DiFcHCzzRYzVhqpqOHQdg9Rj89u4hDIG5bLdblkuZuyHCoeI/FBytAhxzEgAiJOIngLfjUdtYdkz9AUXFwuUHMs3+11HOJ9z++4twlUY6zLUhsnSp9UNaJ9hsEghiZMJZV/SdwV2aHE9B+tIhPRo8orFMiWvGsJpTORPsHVPva6Yr2YMdGz3W+xgcMW4JYomMV6gRve7afGDlKp7YDA9SXjJNlvjBh35cCAQhqYA3blMIkXTddxsmrGxmU6oG4c09TB2j2dD8jynsR3fOr8kqweyfstyeU6f1TxZnPPHP/4JRV9xenZMXR5QjoO2ln2zYz6Z4JuY3b7FCMN8mZLfbTh/GtM5Dfk+wGhJPIU48tnvKpq2IY1SDJrf37/6p/bG//X59fn1+Ys9P/jsr/Nwf4M1krYfVblNVzKfp1grRqzbUBNHE3TfkWc7HCGYzCZI1+P24Y7Am2H1AKZgs94SThLidEFVtmArjpZLqjyj15bF8imzk4jXr18xWQS0lYNFc3y05De+91eQ7j33r+8QBOAcOOwlN3d3hPEFi9OUt1ev2d1tMcJwdHRJMBfU3St0E7KYhaAjYm9FPWw5O/mY+/s3JO6Kj57PGNqU84uUh5t33N1u+f73f4tav6XMHSbLhPX2gdXyhO1NxfPPJvxv/8sX/LXf/V2q9p6rN9e0bYnvC07Oz+nahldf3eErn+nCoap3BP4FQuV8+cs7Pnr+GZ4/6pc3DyVuEFD3D9RNRl5K/FBQV+AFAbW4Z3NoWAQfYeoCL24QuLx9c8dsOSfPNZ4vKbIDs3hCugrIHjJOVsc0nUbJmCrPuF1f88m3v0VXlXzx6hV+EBE7IedHU4q2oGgGJlOfvgMlHNr2QFnleFFI1ZcczRZUe82uLLh49hHlekerx2ufFC3rQnC0WmLshiqL+M2/9Dk//fGf8NmL73BxdsSf/uEfsb49sDo65fz0nLzc8Or1LXoQBLEgCD2UaukiidNbPnvyCbqt0a3Pt7//grdv33F7fcWLz18wmSWsN1tms4AuP+XsdELV7TCiJa9z1nfvSIIFF5envHz7Ei9WZLsBLxj4u//23xP/76/8///Pn7tR/c9+/9/9waHZo4XP7faGOAnpK4fjkyWDFKTzKdp0fOs3Q9YPEjca2B46zi+OeXP1NVK57NYZrj9gRc1iNSOZpoSTmn2+ZzKZU5eSMh+4evMOh4H1nebuOqNu9mh6yqwDK1Eo9nc91U7wcHtFHDjs9y13919xepbgu5KHuwemkzlaC6SMkIHGaE0SxhwvpqyOE66vt/z05284fT6j0R3SlxjvQJKek06WeOGe7TonCudM05QwjGl7TV6WTGbu2NjzHJZHPoqAdBaiRxU7nQPKVwhhyA8ZCEOaBjA4BL6l61uiYIo1Y6HJd2OMVmgzkHUlg+MifUUa+dSHlr5vmM1CyrJh6ASOMBgDTQsXT56Q5wU4LdYKnl5eEoUhwjLeGhM+jpIU5Z6ubnDxcYzLfLrADJYwTBHOQN92tGVLIFMO25rj5fGIwTEuebmjKDOU8pkvEiZpRF03NE2LdEJ6bel1xWANbWtRDrhS0CPGrXYIYRJwqEoC5RL5EdJVGDHChHU9/j/xJCIrCoQDynEp6wrleRQ2RwwtjjREi5izizNyU6Nlj+toelOTVzlGOBhpyIuOwJ3QDyVZVmPp8VqHwC7ICg1iIIoShgF6WyIcj6LM6NqKpmup8pYwFiSxyyI4wVOS1lruH9Z8fL5kc1NSdiX7rKOrS1YLj9uHBg9wXY+uV4SBi1WGaRKgPYfpNGYxTbi62tL3Aj9WgGBzdaCuG+KJwkpL3vZ8Zv8S5+ajf1rv/V+fX59fn7+g8yP5v/I/FP85UoQMxuApgSsVni8x1nJ7d09VNjhyoOs6LMMorrAORgh2RU6nB4T1cd0QKQR5NlI5jG7wnAQvaOjqAVcGCKuoCol1a8qq4v6dJU1SZlOFsYYsW3Pz9pq3L2vSZEZRlrx885owOOXJR6f88Gc/QXiaeBlyvFxhm45OdTxfrXCsZenP6FTPk8tLUl/RVDXz5dHIY97t6Jo9611Dtd+je/ACwfah5/LyObebn/DVy59xdvIxn31ySat33G/fIlTD3eaK2TLi6voGRMzQD7x9uceTDicnMcKG2MHDDobzJynFoaLKDU3ZYk3MMAyEUUitb9lsb2l6zdB1OCJmU79mn6+ZRsckUU9ebBgGw363Z3U0oWk0SgX4XsDJ6gTPEzzc7bB9gBIJhoG7uxs85iznJ1gnJ7srqMoKz3G5PF2ye3hAKIXnC7JdRRC5NFWPGTRVk2Osg9UCYRyiKOHq+o7WCmbLhO2+ZhJP8YTPrtohvJ4kWhJNG95cveT45Ii2tFTbgCgKqOp7hNC0dY10HG5v9jx//ilPzk8RgyVwoTSWJ+cnBE5IW7ZE0YztZk1XD1xeHtHUFX2nsMbQ9zVd2/LJp0949fZL/viPf45T11ycHKEbl960HPKS6WxKech58eQT/upv/Mu/EhvVP1eh6vkTVotn5NU7Pj76GK0dpkczXn7zFm0GPj7+jD5VdLzkZKn46OIzinlP215zdn7MYnbGer1jtz2wWs05OhtZmX/4f/0hvXYp8g2TySmCmPKwZL/b4NpTKrPBES5XX3QMg2S+mlB5HmV9RZRsKLKBm/s78rLn+PgJR8s5DzdXYzmhl3StIXBL8ntNkMSUbcjbu5ooq2CI0cbw+uaeRCUYq1jvB+rogdiLuX25oWkydK0IXZ8kmfDxNODV63uC2OBYzXw6Zb6SfPnTVxi7oHpoWax8XDrq1oK01PWW+XSJNaCtYLfdY6ymcxRJHJCECfebjHSe8LCvSIKUrmgRYsAJAqwc8LRg/foBx/PwI4cmb5hMJwxC8/qbXxBGU/LiQBzMaZoG5Uh2WY5wQrKsQVqLaBy+/eI3uH79lkG3VE1FMAlpTUk8RBT5PU8vlkhPcHp5ym6zw2iH6XRFVw2oAAI3oi56Xuc7pPJZb3ZMUhDWxfUiMBrjaEIXBisIkiW+Z3GV5X67xw99vDF/gDY9VTcOpbbzSdKYm6s1USTpDh3Xm9ccHZ9T6ZambpGOS9NrtKPZDVvqssCLRs/7drulsQMdBqMDfDemMwea5kASxkiVIHKDKxSnRzGHpqAqe5IwpNACvA4vLYk8l3powJ2BVDRNy3V9TegH4DdEqaZoD9Sy5fhZyvxIIquUwBN4z/asbxo+uvgEL9Z89Yu35H3Lt7/3CW+ubkmPU7ImYzrzGXTAPu95+mJJGgesN2uq3MNNe9xA8gPxt+lpWQYLXKvY7tYMTkOYxDgiYrfZoKTDxeklUZiS7XL6vmMyDfF9n6YeGbaTWUgYJHzz5QOD1QQTi3QlZd4S+R59W41ZOyMZBsmh2NHrHHAIvIjpNGIxnVFXUFYF09kEgYcUCmNGc5BjXcLYJQh98jyn73qmsxREx2gT8jgUu/F2rT97ZP8+gJFcPDki3+dU5QDOgBsMpPERJ8dP2O7uabuG3W6HtQ5hNBujK44BR/OwvkIpH09GbNd7XFdQFDk4PkGQ0PUl/VCMCB0VE7qKKFYURU2W97i+j/TsWAptalwV4qp4bN5KiR+ENF0xeuplgHIiJskCrECIkDie0OtxEx54IypND6Pe0/d9wjB4bL33SEeh5BhXGE1NjwU5HvFTBhy3rNiIAAAgAElEQVTpPLJWzYdMatM0jxiq8Zb9+4xqkiRYa/G8P/vYFkLQtu0jAuvPcqmjbMCMhSqlMMai9fDhb7yPAoyPHRh0j3IkFkv/SChQahx6rBlVsUaPQ1bwqA99LzvQWpM9op/iOKZtW3qtiZMYKZwPcYOiKNB6zLPWdT3qcIvD+B5vRm3qdDZhvpigfMnwiLsy1tLrgl63NO2e3X7PYnaM4xbsDwcwA64MMY8xjeViRd+1lGWGny7pmxrbDDieZGcrOuEwUTHmUFN0HVEo8Z2IbFezmKcUxRZwWK3OqKo9q6MVYeiz3ezYHLZMVxPcQNK0BYO2eMpD4ZBtSlazaIxHSAgCn7v1PTgOy9WKuulG5nddkciQfhhwheJh/YBwXaz16Kkotlt8x+fZx+fU5Xg7+PhiFMiUuaZVPW0rCSJFsWuIPRChR51l1FnD0Csuzi15uWc+P0dryXpdIpwO6fqstxusMGwOeyZxwj//L3yH7XXGy6+ucCdzpO25y7bs7Yb2m45vPXnKqzdvePbp90iOJa1j2N00nJ0syXTPyfI5L1++QyrB3faKbBdycfJ93r59x3HyGcI5Asfy8tUItq/ra9quQ/PA0PngdByyASEcQi/FmoTd4Yo0PeejTzQ/++mXaOtQ5YcxghbH5NkeO4ScnM25fXuLdDPSeMkwtDTZLRP5MX0dMGD5/NOPeXfzNWfLz3nYXNOVHYNwuHp1Tbw8Yeh7HjZvWRwtMYNLlGq0zVjf9KxmczqheXjISCZz6q6l6zUPDzcsFit6relajcDBCyOu393T1zXPLp9hejuaDEvFXd/QNoKTyzO+/OLHnJ6k7O4rMrvF9xJm04j9JmN7VfDd71mKfCCdnOJ5NWiX/VaDkWwerjg/f8EQuXStj60aTGW5ethgDHzyuc8XP/2C5eKMuElZ3xY4KsMPPE4vE774+g1+GHB7f42SltVySWcNFQNGRNztSo7OTsHV7KvyL3TY/P9y/tyN6j/60//2B/tyQAQJQRBjW4uoLZE358nZC5bT5/ipZr2rqbuGq3fX7LLX1F1F3UrevXvN/d2Bvq/J8h13t3t264autfTdHqM7utZBYImCGftdTdnkDINluTpl91BTtxs6bbBuS9kcWMwvaPuB/aFiGpxwcX7J//EP/4S+iQi8Ka6UNE2NK2NM5eLGgrwtKdqMPD+MpovZgsO+wpegXGjahqap6SqD63hIBhDeuPETBcqZc/FkxtWbPdbuabua25sD8+kMpQzTcMLQdJi2Rw6GviuIgxmTJKVpWzxX4Xk+R0cnxGGCsJbZdME+KwgiQ1MVuMYj9n1C5VEWLfE8pjKW1iqs7yAjhZuE9KJHqwqVuAROTJYVtE2L5/ocDhme7xPFE8qqwvQ9ySxi0JaHmwpXBvixxXqja/pkNhs5hLojiNS4Ye06fN/FCx2mswhjR5uFweK5KX3v0HcD6WRGX1UYA5EfYOiwTYdrXbQdN573Dx1GG4TtKYodk3SGHeTjhblHOh6h7+M5HoPWSCTT6ZSuHxvOPgqJixEegRcROi6i6UnDGMe6FAdBPJ1R1JquAl03DH2H1QoXH9cZM4dGD+z2BwbhMZlPEUZjBsgPBX3u4g0RRkgaoxF9R1+MzeayalgsYxZzRbZvcBKXeKYIlWWazBG+y9OnR0h35KqenR3xl7//XYJasLnPuVgesct6LB4fffwJzy4/YhonTGZTGgvYHtMEFNUOM1RYbZkkKYftHmMHjFa09TDqG+OAKPLQXUuej/gd6Q0k04j1ekPTFsSJQ+hHOE5E3ewpy4y6s3RCM50nDK0A7RLGPnU7YK1EeQ7KdUBYprMUPwgRjEMCVuD6CsPAISsoipz15h1a5wihMcYh8CM8T5Dlo9fc9xKqsmawNdPpBCliZpMFrgrpO8vTZx+T7S1XV9c8vTxjPo/o+hI/dEF09ENFUxvyQnNyfEIcprRtjTEd2WHHdn+NUi4Wh8vLc+bzBVKKkR2sfLwAet2NKtBh5CF33ZgTHTDUXTPaqQaLQ4iwIWVRkudryuqA6/lI4dE0GuEIQj8cyQDtDikfLzy2xKAJg5i+6/A8lyRNqOpR8aqNBkZ4fq9HBWuve/Qw4DhizGK23WPbXzwWlEbzkBCC2Wz2wXb1XsOapukHtez7nOt7PutolnJHh7yxH54PYx+xV+LDUPk+t/r+OVzXxcLIOnUVynVHrqkZRRHmEa1ljMFVLlJK2nbUcr7nvwohmM/nBEFAXY9lniAKx6H48blHikE08pCVZDJJOT4+4ej4jPliztn5MSenC5I0RCgH4Shcz8WKjqYrafuMwXRY01HXJV3XUBQVVa7pG7BG4vk+yWRG1zsUVU0/tFRdh7E9VkLZFUxOJqhJSNXUxL5DMhltcnVbMp3HdLpDDyClRzJJ8XxF3RaUTYnjWfzAoy47lBJI4WKNRTCQJilhGBKELo6rcD2fssnwXImxECYxA5aBFhAsj47R/YAzGMq6ZX8ocFBgOtI4eKQ4FEhpsSiCx2yk68Z89OKSIPFJlx4Dmqp2iKIF5xdn4FaEqct2MxZ88voaP1BMkxO6RnB0HrM/7Ki6ik9ffIuPZqdsbnZsDg3/4m/+VYxvSGYrFmdn6NIQ+YrvfPw7/PZvf8buoWKxmtD1DoPu+faL52z2B5rG4elH59R6x/6gWS3OOT+PaRuHo9OIt7df8bAumU5OuTg/oy4r0mhKW/o8vbxkt204f/IxftRT1BXZXvHJt094c/MjqjpgtlxwyMqxTNlppAtlJnh6/l126xbpSxYnIdL6hM6MYrfGDIInly9YLhPevX2gLhqyXUHbCOZTl0kU0jWafb3FD2uKrKKsFJfPjqm7A22nEa7lq1fXrBYnSCFxw5hGaw75gbarsaJDSZ/isCOOY5q+xBEhnzx/hutIXl+95uTkkqHusE7DZ59ecMh66rZFihbfjZEyoNcH6BfoSnD5NMT3Kq7e5niBBhPguS5RFPOd732G57l8+unnNF1GXVcYpyTbjUi3IArArTk6W5Id1swmcyYzybNnH6HUlKbueXe157d+6zvk+2uS0KPuWiwBy7NTsmqPGw70WmGFpKPi937n3/iV2Kj+uYPqf/MH/94PRB3xvRd/maYIiecRu2bD04vvUBcHrtc/Z7PdoZE83O5ZTBMCV3DzukFJS1UImv6BNInoSkvftLTdA+XOJfQj8kPHfmMQ0iCdmHdv73D9irpQ9H2HNXs8f4YbOOTlATt4lPmWtigIVIJ0Bu4f3uEowTC07Ha3TKchYZhS54K78h3WSo4WMfu7DU1leNhk+N6cps2ZxDMOVccuz4mTlPVDwWaXcXJ5TNu3NHkBNiRKJPmhI4mh60ZBteOE2BaUO6Cdjt5WtH1L21iOFmc4fcgh3yJEy/I4ZTKds9vmbNYbppOE3XaN50uqIkM5Fjfw6EXAoW7o+or9w240SAUOputZpFMST1IdDsReBH1LeRjom/Fil+Wj59ky8OqbKxADjpIYR1LVNY7QPH16hJCGQSiqoudmfYcKJFr3iCFkf18yiWOMseS5pu67sbCgPQYDWV7Q1i2LecygO4wviOYLlKeo+54kmNNkBdopKbM9jvFQg0NTdYRJShj5ONrg24hiK0hSH933JHEwcgN9B9eNWEynNFkJTkdjOvwwQrcd2IGLs1N0q/H8mMgPEL5gl++IwopJ6GK0PwLQs4G2zam7Bt8LSJIpnW1Z729J45TNbY1PhE/E8WTCbLHiULeEAhK5IJ4kSBlRZGtCm6BNw0PW0LY9+3XD8smUyYmH6zgcsh1BmLI6PUVW33DpbNnqiqyNCdIJnmspiobe6ZnEkO8K6qrDWAdhGgLf5dnFEzypaPqaQCY4UtHpmjBKCbwE3TY4g6BtNUka4EeSsi1RnsD1BUmcorvxwnkodrSNJJlKBtXQ42AsrBYpLoL8UJK3e8qyZNANg9Eo6aFcQde0GK1QrkCbhqataeoWV40NW6U8zODgqoDlcsXR0Snr9Zrdbo9SLtPZfGx464Kmy8FI6qqh7fd0fQM2YLO7xpEDZZGBFVgdUGYDd3cbDoeSos5wfUE8ibm+veN284a2y7m/u0d3LaerS05WZ7RdxatXr7m9v+eQ5fiBpGt6unpgPktJoylptCTLWrKiQVtNbzrqVuOpKZ7yqao9QvQoGeOpI1yZECYerqfAglIWY2varqCstuzzW/aHHWWZMQwFUWQYRMXucEvdbmnajN3+jqx4eCy9y5FR2uvx/WktTd3SdT1ZljEMwz828PGhcPW+nQ/gOIIoih4fIx43s2MByvQaowd016Okwnc9rDGPQ+pYuDMWjPmzTa2UDliBMeM21fM8pDsit4R0kMIhCoKRMGDtSHmQ4//Rtu0Hpep70sD7oVrrsWAmpCSKog9b2/cD6zAMWKMfB2l33KiWBUI4DMZStx16MAxWo5SgrDKyfIsVLbv9A9Zqur6naXJcVyCdCCkVTZOTTgP0AEIqhGoRTodyfGQ7co2FG2LagXK3o21Gm1NVHLBW4ntTwsjFCyVtp5nOIlx/GI1iQ8lgBrLygHAkFo0ZetAeRgviKKYsSlzP4kjDw8OGtu8YTEfdtEhnJMJY4ZCV4xc8i6SpOxgEqT+jHxzieElV5IR+SBLEhIFCqRSEYrFK0daSlQ+EoY+2Dm7UEUYzqn2L5wpevFiSJh6pP8F2HkoETGeSgZY698gPNYvVlPV6TVFKPvn0jM+//ZR/5uPPuf+/qXuTHlu2NE3rWbbMlvW2W29Of+6JGyciMiMylJFUQpE0JaQSSjGhmTFgxv+IATPEDIkBEkJCyj9QiAEFKgaMqigqg8xoMm57Gu99d9Y3q2Fg596q/AeZ7nK55PKRa2v7Z+/3fs9z1fHybcHV43u6qeaL37/n29+8Y1uckS9irr99xI4Jq4sleR5znq9pTh275jjfgsQTLqhJ0iXjBEURMvSzja2qG774YscP/+CCzfIZp+M9zy+fcXu3w+iW/fEjWnskacLu+JH7uw4ZDdzef8mXX9xws6sYJ8toDP3QY+1cBUtzHydqxibAhPecSkEeZhRKkifnvHn7gq458TdffuD64x6Dpii2FCszY8t6R1W1FNuUYqEoq45isSXOAw77HVcfjziR4vsJq2hLogz5IuXh4ZHQd6RBPGOhDGxWEb6cTXBmytkWS6yeOLs841A+kIaSx+M1z54k/P6vrvCUTxAYDvXE1LdEQYoMTvNDpHXcXO3YLC8gPPLhmzvi2KPtO4Q34YU++0PFxZNL7u4OHJodcbLEiZa6rVltNzzeHtgsY5QTqLDg8XFkf/qKSTuePr2kLO+wQ4SZBor1GUIrQk68/+Y9TVeT5Snb5Yr6vuHP/9F/+Xd/UP3f/49/8ksnO67vrnhyccZQd6yzlLY98FB9gzGK+7uGOJYYc8LomGmCJPf45m/u6foepSZCccbQR+we5qRICMWoa3ZHRxCG1EfN48MHnJvY5C9pmxNxFBIlzxnNiaYdSeMZeTO0im6wREXEaVdi9UDsLxGMnK23jJOgOo1MZsD5Ef105FgfsdZDW0Fdj6RZSNnc03WG475ie75hv3tEInEuoB8mXi43TDYhTj2+/vJrjseKxSKnPB7JVU6IQrqBLA1pSkGaR5ipoygU02AwjBijKU8tp+Oejx92NHVN3cz2EZxPVqQYDMe2xvMCbK/pjhoIKLYR2fqMJFmBGAh8n7qcGMaefmgRwiLNEu1qrFM0Q4OnBDKU1KeRUEkaU6LbCa0dly8uedjvudmfeCxPqNii7ITnIsZeEwQdWQ7OeNw9VPRTj7YDYpzwbID1fJwTnK8V+9ORh6ZkuV5j3EC+zFEqpG96ZBASqwXb7TPyJOHm7pqi8Hn59AlFvEZJj1F3BFGIneaMIcwUg+7QoyDyI54/f0E1NHh4TJOl608gHEkU4isBIuZQ3hNnkqo+4myLJET6BaemJAlDVsWSEYdnUpRwbLcrFssNxkLs50QuIExHtskKKQs6MXDalSgZkOWKqtyhtEeURNQ4jrpjMj1JmBPFjiQMebw/UZYPLHKH9BSRszT7K8LlW4rNM0Zfky4T9s2ei8sF0ZgwTEcO0z1ZnlN3midn56RpzBfXH3kcJ1S6YLHMWYSSTbHFuJ52rDDOIkPFaDWj6WnLkb7y0cIyKkVjNcPQQK9IsoBJjBzLAQ3YUOMhEZVFDIJBtNSDRgoPob0ZFzb0OBGg4pi+b2inhsdmxNkA5UnGsWeyPVkaID+tWuPE59v333B9f42vAoI4odQVHRXWDSShz3q5xhjDsb1iZAR/5OnTDSq01GVJliZstkv+9E//bc62GwLfw/N6VqsIM3lY2zMONX4gKIqMV89f8+RiwyrPWRQhx+qB06FltchYrzw2y4yzsy3Xtzvu7nas1ytGem7u7ukbSMOI7bIgjj20adBmIC8SsmyFF4Dx94xUIAImPWDNyKQtdT/QTJpBa86KBa/OFGfJSOBa3r//mofdDmcn9scHhqFm1C11t8fZHq1HwIFzdH1F2/VoM6/Qs2SJ9C3ODfNgK77TsFrGqf/eHmbM3IOTQuCsQ08GPU3fc2DHca4aeEIivv+ch0TpSQQOOcMFZkuYmwcxax1NUzMOw5y0Wvtp/T/rUf3vFKpSEkYRYRRh7MxfDYLge8zWLBWQ4M1EA9+fmbRD1zLpcaYVBD7OExiY1/l2YtAnPH8Cb0DbHiFH+nHHbneF1RNFljCZlqapKI8DnpB4no8MYDQj1nPI0KOxFn2YCD2faqjQo0N7MZ4HIxPO0yAtwkq81kNNMYHL2e0rfN9SNjNxxJOKpulxSKzTeC5E+hblJeTxikB2c8o+GFQQUCxShBlxwlD1ll21RyI4W26wk2QyliSXaOOwZsITHtNg8WXANOn5GDT02W6XJEnIaCeyVYJ2Brwe53s0TY8HOBeC9GiHlqbWdG3LepkgIsm7dw/Up5Z314+IwgAju3dHtPPxleXFy2eM1OArVpuYLDtwvKlo9iGvfpjjBsHkR5wOE0J5pLEk9nMWyVPiSPDDH/2URQxeu8SLBk7VIzIVtM2Rw+GIsEukCBjHBj01jL3ibHtGkka8fbvln/5v/5zz9WuGsaGdWpJshacmPr5/h/JjwHF9c0+eF3hCEWdLXr95zTDUGD0i1cTdw4kgs9zc3xOGGTe3V9RdS6oW+DgylWOlhaCjbizffHvN2DlWy5QXLxJCJciTAk9Yqmpgc5Fh3UC/k0Qq4vw8o37Y0U+WwXhEUnF+dsnL12fsHncoL8YTE/vTI3gR5xdPUdIwDIbTUVMUBf3YMpgKqwN8FzOZkSBwxMGGaYyIfY/70w25t+X5i+fcfntPFpwhjWD/+C23HyY+e/0DnrzasDkP0K0ii9csl5Z+apFBSNtqpBdgx4GubTk8HpFBS9NI0lySRgWCmmcXT5FZTuRD6MUsz1K++upLQn9i99gSLkJ6MyFCnywTFIHi9eUL6urA2Cse7j/yn//5f/33YFD9Z//9L3v9QByuuL8/kOU9cbjk3fv3vH7znNNRM+mJ3UPNOPZUZUNbBuAkni/5xR//hPsrzWSPWOt4vLP4XoYRhqrStEdHGkXASJIL1ttLvv12h/AD4jzm4zcVi7WHlBo7CdK44HjYs1lllIcDSRIQxYKu9iiyLVU5EMUBTVviydmIVJ6OCOcThgnOM0SJou1GwjAhTUO0aTFOEaqUMIIg8lAqZZEsOXU9xmmqpmT/2LAoIqRTDF1LW3asQoeZBs43GVNnydMNN3c3NO1AlAa07cDZWYE1CxyCIIh48uQJ0zQwGcsiXvLtu28xWqLHgDT1SJIcLcCLLFmyAGvR04DVgvP1E5wVnE41i8Wau8c9p7pmea5QcYJ1krbbIX2Pi4sL3GSIgxQZRvR6VtMlUULftkxVDSLA9yP8wEf60Pez3k0bSZTEqNWCwXgIMbFdKZSfcLsvwQt4/eI1VfXAOPVMk8FqQZbFQI3vzys6JRXr1SVOGDabS+Ko4Nv3XyE8D09Bz0hShAx6ZBwc22JFEkse729ZpEvasub++oQv3axDPWmaZkeWFUzj9OmfnwCnaCuNcx6bzZa2bvCFT6AEcRRRFDn7Y03TDTghkH7E6VTiGFmkG+q2ZxQ1sfTZ5iu6ZiCNQ0IlOJaP7KsS388RVjG0LXocWBdPcL7k5qEmS2YkWZKsEN5r/PgVy8U51/cH4kwy9AdSFZFlinEQxElMUUSM7cD97p5deY8KBKFUmEEjTUCqcqTn0/QnyqZBqRiHxknB5uwS6UM7jCzPQi4uM+rTAT1VJLnPqaw5VRVtZ3BG0NTNfKjhC6SEvq3w8IlUTuArun6i14YgDFDKR08Nk25pq5G+6kmiiGGaO3960KRJwdnlGbvDHm0mlqslZdmyO+xBOtp6JE8ysjTh4eFuthZhGMeOIi1QUmLGkVfPPuPp+SvSeEWW+2hXcfdwi7E+fpDT9hVd39H2GhXGCC+gayf6rqcuIY+eUGQZT5+fE0Upjw8nxqlGBXC+veCHnz8Dr6HtD/NDoXFsz5Ys1wnDdGKxkgR+xtAHXF5uSDLo2h5rBZOZEXN12dI2HRgBxme7WrFe5hz3j3zz8R3f3D2wawZUEuH5kjzakkYFXVtj9QROI33NOAxU5YFRH5FytnN9so0yDJqu0Qh8YF5Fg2ToNc4JpAwYhwnhSTwxY7qCwAdmzWuSJERRiJQexhqsMzj0PCD68pMAIEBKf05TjWMaJqZxxGGJ4+j7SsDcOZ2xUnNdwPtbbNY0TWcJgDbfo7BgHjzFv/G7zjmMdSRpzmKxYhz19z1d+4m7Oo493VBRNwceD7f0Y8U4tYzjhAo9iiLE9xSH447bm1s8ofCkQ/rmk5zAEEeKLA/xRMA6XZKlMX6o8DwfERiMpwlVSCgDlB+C5yEiyShmzvJ6kzNMI76S8xrWdLPhy58fApbFEhBs1usZgWXmBHqaegKlOJ4OCBsRhyF9qWfJQ6iQviKSFusUbloyjBW+MoR+hvQlUSwZxwFrHUrFdN18n+CHzMphEbBeXbI/PNDVEwboe8disyGIPIT0qLsdxjj2h5HE37IoPG5uvmWaQnwpOd884+nTF6y3CSqCqnng4vKSLJe4yefJ5hdstyHl0NBMDX/5l9+QBo4ktSzT18SLLet1CM5ncAMePYfynrKtufpwQ7byuP6w4+mTNxj3yGdvXjFNI0qls5p5rHFo7m5PTKOhn24YJ80vfvEHfPXlDVn0inyj6CdLlp/jhCMtPFQY46zgYXdL3yvCRNJNLXnxhPOLC9qqR0qf3b7lclPQVANR6NP3JXEUcnPzwN3NI6tNyvNnS87OCobWsd/t54fStMA5R56e8/C44+WL1yw3GXgBocowdCAsHiHZuuTm+iNxnNBPB6p6om0nvKDh5ctX3B/v+fBxD1YRZ3bGVJU9m+KcJxc5+32PFAaJj540ipjLF1u2Rc40tUQq5sWLlyQpqCDl5Ysf8erNgn66I09WvP3Bn/Di1Tm/+tUVcfqU9XnB7e09m82CujyCS0njYOYJC4/QzwjCjvao+d3vfoMAmr0miResNlscPZHK8FTIY/2B5fkFdD4/+eynVNUeJxXC5izzgs8+K/jTn/9nf/cH1f/z//qLX37z9QPH8o58EdIOD2TpkvOzn7B76MlXmr63rBbnSBnSNx6vXr1hf7jl1ZsNX/92x+6hwtgJhGaxdhgb4PsB682KF69jxrEnVAuePnnF7uHE8dQSR5JikbK5COgbxfHY4QeaSXfEYUAQhCwXT9huzhiGFoHH7viBKIrZ7wYmLQiUpm47mvbEZr2hHWZge15keNKSLyPadk/XePSjoR+PhIEkzTe0XQ+T4e76PcNQE8c5cZSTZjlCeixXS5JFyHHv2F48ZxKGME2ouhMP9w2eiFhfJPi+T9cPWFeDqPC9gCCyZEXEepNTl5qPV/c8e/6MrmtJ05jTsaUfKox19E1HGsckUYQdBV03W3UCLyRJFZOnObtYgC8ZBoX1TlhRE6qCYRrQgyPwFY+HPcYYNss1ddUQqQhpISkWaGPI0piHhzu61tB3grQosGJEJZpVmGKngb0+EJ9dUtVHPnv9jL5redhNoAM8KykfHxibA4ECK6DqenTXzMNQECJlzG9++1u64QTCZ5hGtJg1p1018GR7MetfT0dGPZIXGcJTpAvJ25+uOXuSkq46lquYsqnYHVrGsWO9TelqR3PqWRQx1hnC0CMJI5qmmlmWQ0+UJAymoe2PrNcZvT6QF0vCsCBKY7SpYTCcby7xPcXQd3iexPMDhnGka0ek51GkikRlHB57hDnRm4GujpBOEgiLClK+/njF11//GueXWDtyuqt4vLsljBOkr5ha2O0PZMqnGmqM55GonDxaoNsJ3xqQlvuHOwY9keYFAp+qPtAOHU1vkAEsL3KiJMG3Cm+S7B9bmr7l7PKC9SohzgWGepZtGJ/RjeBBHIY4bfA86PqeumqwXk+YhAR2xdCCsT2h7+F7Et+P0UYQBCnLYouTjqvHbzDOkiaLGVrvSSwO4RxFukJFMWM7YUZDlimUEiwXMeNUczqWCCvwhEc/dEjlePfxS37zm99TngYEMU3b0HQnqqqlqlqMhrZpaeoapRRJssCzCUPbsDvesK/e0087nAk4X7/i2ZMtX/7+HR8+PJAtYoaho64akjCde5LBJ5+9cDx5UhCE0ywWUdm8NpZzIpgVARdnBb4QJKGP7w/c399wc3NEBhHJIgdiBCG+9EBPpCrlfHtOrELCMAFrqMo7YAIMMGDtQFU39NNc9RmnBmsdvj+v7rtuNhw53KdhRhGqACHmB9dZxekhxEyRgFkL6/uz4AFh8YN5JW+MRngSawzjMKD1fNQlxKzBtdZ+X0vQ2nzfZfX9+evfPPCaVbCzRUrK2WaF9PDkv17zf9eHVSrA8+SnKoMgjNSnLq7GExCGIUI46vZAkuRzZz12CLCiO6cAACAASURBVDlRlS2//5tv2O3ucdaSZQVPzi9ZLhOcsHi+TxxlOA1JsmBZJPieIwwiyupAO+4JQ8nheEIJjwCBB3TjwDAOREmEL30Ms+xhGDSg8RxYNzKN0zxYT27G4LkOPVqcVgR+gLYldVkxtSNxvmbUPY93O84WS+IwJV9uaKd27p16JYEMebixaD0h1QT4ODQID6V8siSlbUaKxTnX13cILKfTI9PYIf35qDCMI6I04+ZuR1EkSC/i7qFFyQhnjxxPD1ibE4Y55+cpXTdXTzzpqNsHhI0pjz3XH++Zxo7QU0zC8u37X/Pxy4qzi4RF+IZBt/zohz/g7dtnFGeCLFc87g7c3U7IYOL2vmS13LI7Xc+BgIzp+iN1XdHUE1EUIFTPzfWBtj3w8tVLPvvsJW33yNBKwljRtwPj1BJlS5bFgj/62U9Roebbbz+SBAWXl4t56JeWyfW0vWa9Oufu+j1mNDy5ePpJ5qCJ/A3GdAhGrq/2PLl4Sd1UtHVF22jKsmazuiTNfe4frtisL3EWrq8OHOoH2uaEccxM8tRHG0dRPGW1jCgWCeWxJlSSx12DlBk/+YMfcHX1gXEcyKKIJFTz6zsIsNYjLwq0AY+A8/MMYSeSJCWKJprDRJEn7G4f2e2uybMlF+cX3N/v2G7PSHOPm6trHm8G+sZihePD7W8Ioyf84R/9gMnVxJmhOwW8evY5f/jzJbrW+GrLxWbB2HlcPn9BHjnq1lGsz6hqTb60POyu8PSScZioqwfevPgR11e/4vChxE0eIwM3Dzv+8Cc/w7iJj7uWf/wP/x4Mqv/0n/3FL6u6YpFf0A8VD/c9b978hCjMOByOrNYFX31xg7U92/ULPv/8DTf3f4PWglN54Mvf3hDGkiBIcAz87Kd/zO37jlP5EWcMv/3NET04lsWatq748O1HEj8kjUJu3j2QnmeI5JE4WbHebpHSsnu0dH2HFTN7LS1A6wEvsDRNxzCO+GqOx531WK82PD7uiZMMKyb2pz3GWtquRHcGrCRKJWkqETbEWEV5OuILS6wUi0WMc4o4m5O7U3ODcwHOGwlVTLqZZsPHILFmJFQZ3bDj6eUFV+9LjqcjVhvW2VsW65DVNuN47Pj48ci+2tNrjRU11hjyOKc7Gc62BWkUEqUZw9RirKbvRoaxRIiRNI3pxiNSgTUBXT/NIPX+iLCKJ082COcThDHV6YSUHkWe0p4qhnEkzgvabqBtT3hiXveN40igFFEc4nkO6RmaqgMsYewoMsXx4chiFSM8uHq/g9EQBRHCA+v1WE9idYEdEpRUCBOgzUScOermkfv7B5J4yeX5S5IoQvclASHr7Iy2OjL0HftDixeExLkiX/osz0eqqmWxzPjB56/ZnGVcPkuIY8PUh1R1w9BKLs4u6fsG7SwqkGDDmStn5zqCL0P2jzuKdEnbOIz1GEdN2dWMuqNrGqTzWa3Oef/hI4PpGTV0nSYIQjwsemjwhCSJYsrTkW605M8KWttxe7dnubqkHBquTnfc1e84DS2nsiVREZv1OWEBj/cPiEET+WfsDzVV3RFIxTiOVNWJWEiSOKK101xrQJCmGWEQUpYleJIwyAnDAGMU5RGu3t0RKcNqldIOLadqIMszhlEzMs19xH4gzyWaiaGfZoWnM8RJxGa9QQQS51nMWOJsT5HMBjbjBPXY4inBNA1oPVF2DZNwZNmS9eqCcRyoupIgjDHakCYJYRQxjUeSWNCPLVaD0ZKyrbFC0A+au4c9TkqcN9J1gqqccKJCyBprR+q2p58m4jik6zu6vkFFijAM0Xqk7vYc6o+IQCNlxMXFGT96+zkXZ2d8+HDNF199RZT5pGmKc2JO1sKAOJZgO5Io5eXTHyKl4/Zqhx4kUTybnrKsYLNN8KWlOfaYPkTiYxk4O9vw85/9gm1xydS05LHi6fY5RZKyyHIW2RLfFxSLAKU8tG5RAaRJQnMaMJNPoBTGTnjSIWQPXotzE4HyGKaKpj6AE/hKfeqwzqQAPelZdoFgmvQnu9XcuxO+xPO9+SHQOKSvkH6AQ6CNJlDBpxoAqMCftbFSft+FnT/+9XHXOI5orf8WkWAcR7q2xWjNJ23Up3R0Hni/+/rOoGXthNYjngcChzUGawwIMHak7Y50w47JzOrTst6hJ4ijlPU6Ic9SnPWIQkU7HEmyhGHUVHVFEAlUIFitckJPkmcpTVMhUWSLJQKL1YBzeIHPYAzT5BgHge09MIr9oWQcRpQf4JymqwcEAo8IbQzT2DOOhr6t0NpxcfGc03HuWw+9JVIxxSKmHXpEDP3QYifJ1c01nRaYqWfUA0oFFEWOkJp+aBkGTRzltE3J7c0jL59/TlW1hFHA2dmaUQ8YbfBVSDe1GBcQpJL94UCRbzgd97gpoB0mitjH9wXCX3L+PAfb8OHDPcMo2KwKht6CUbT9I7v7hhfPf4AbUp5evubiScg4Kt68fss//Hd+zj/+93/Ez37yGddX7/nyw7fcPz7yl//yislreP/hC64+Nrx4+QdYd8f7d9es12ckuWQcZizjxfnnnMo9t3dfUJeWzVlB13eUp5K7+0e+/vqaYlFQLH1U3PDbv3pH4Hk8PjxidY8zFpymqfZIcoyeePdxx9u3P8KZI/vriixZ0A5XgCGW57z9gyfc393h9Hr+39i3rPInPO7v8USIMZaqLNHaIlxM12qCQIHXc6pK+rZhsVnysGuZeosVAy/ePKevex6uOp5evuLlZ2uMHjgdG16/+pzz7fP5aHScGDrLj3/4Y7qhxqDp+xHP84hSyXFXki8jpskCgig4px937PePZNk5z5+vyPMEz22JU8f79zdEkc8Xf73j+YuE82cbAm/NZCfGSbA/fsDZASk8Qj/gFz//GZFX85d/9QWJL9GTpWfCjiPXjydGK9lX73n96jUOS7nvefnqnNOu5e3bt0xdTTcJTvaW3uyh87hcLvn//vpfcKoG/tP/+L/6uz+o/o//y3/zy7QQXL3f0dSSJFzz8ep2Vk8GAzcfGw6PFdZJfC/FcED6mt29Zr3JydOMZ8+fkMfPOVW3tO0BY3a8ffucN6/e8if/4DP+7M9+QhwpNsstP377mstniquPv+bl86csniu0hrq0PD7sWW8iVOAxTR5RJMjygGlqsTZlHDVnZ2ckeURdNaRJRhpHhFHG0Hu0fY9jXvGUpx5shBxDLDuW6wQl1ygZszs9cH5xhjcZRJiDZzicSnxlOB1PmGli7Bx2HFgWPuWh5+rqhvv7K6R0VMeBz9485bDfcXd/TxD45FlGmvmUZcevfvU3WL/EuIE4XqAUBFKSRinrdY7wJEgB/kjVd0hPkKbzJfZkOpI0ph8M49QytIJAhgRyYhomhPVJ1JLQ95jGjrruCHyPxXZJ3bUcT0fy1RKpwvkwYBoo4iXCecRRRBwp4lQRx7Otpt5bVCIp2xNn6y3KJnSHjofrPWfLAr/wiOKANArJojlVLI8d+/KIF8F6eYYTHcdjifQlaZqzKrbEEdipY3e/Y5lvkQiUPx9SORFyKE+U9SOnx5rdbY0vFDfv9zTViSLacrENMa3iw4cHjDNcXJyTZgLLQJgEaBokIeNoiJMQh2QcJuIwZJlt2T2c8OWcSseRj8TxbPuc0E/I8wLtBoJQ8PB4xLkRT0is0SgVscy3dP2RxVKx3ij2VyfCsWEdranLI56skSKAzqcbJpRULNMZ+7Mrp7lrGu+5frgjThaYbiYQGMDpT70/z9F0Db50eDJk6EeOjwciFZOlC6QIKfcnjodHtKkRnk+RZnRNOSs/hWDSJW50GCupuwHPg34wGB3gOUk/TCRhSuAH2KnDDwK0EfR1g50U/+G/+58wWseu2eGUwH1KwMZpwDiL83yMhvvbhxm7Zgau7+7o2oYoVAxW4wUGGTvaQVOWB3wZcnb+DCF96p0lT3IEAfv9kbo9MEwlQaRoGkc/aoyYaPuGMIpnIkEYE/gBfhBRli0P5Qca3ePwscbijGW/O3B9fSDLllw8L4gzwTSC5wU8e7ZlschmTNoIekyQMmLsBefbl7x58xRfBiRRThxDW7XYQZDGOaFSyGCaD1bSiFBJkiDm6dkFP/z8M/J0wdg3GDOxXq3JcsW+uqNre4p0QxovMBOkScFytcH3fbQZGU2Fw+J7EhX6jENJebqhqkqECAhUiNEaPU1I6eOMYxwmrAWEw9n558KbU815he/jBxFBEH7CXH1SqnoC35dEYYCU89V+lueA+D4xnVf54vsB+DtCgOdJPE9ircETYv57yFlk8t1B2HeUgu8JBs4x6QkhvE9rfzsra4WH1Ro9jQxTyf50Tdu1ny7dO/p2Qrg5kZ3GCesmiiIhyyJOxxohJM4zTKZHyZihM+xvd0RZhFKCosgZ7ICvHCL2sMoRFiH1UDFNA2Hs40ceZVehe0cSKaTUhH5EqEL04NH3Dc5aVDCj8NI4mW1cZuaS+jJhs31KukzADKyWS7xYMviQrTLyNEZMMGjDMA4MU4fzNKeypB0rBt0wDArlAsxg8aXPy1fPmWxHEPo4oB8numFEiBAhJeCx2+/ZrhdI59Bjy7Pn5xTJhn7s6ZjozZ7Inw12cRrjByO3Nzc4OqTqOTU3tJXHxZMlvu9x/fFAWXf4SvOv/vkXXH/8F/yv/+T/5quvbjm09/z6N+/ouke6ft4aBKHjt7//gkUecTxVrJfnaNPTd47t+YJ33z4wdJIgESzXK3a7j1y/bwiCmLpqefryDBUGaNfx1Vc3pMmWbrhn97inKgeGsaUfa7759oogKhiGkU5rjuXA/e1Hzs+XPJz23D8cicMC6yb+33/1BXiCqt4xTQI/yCgWBdvzFe/evcM5SxAKdvt7BAG//907lssFp/IeJ+fa37fvHqjqjovLlPuHPcdjw2JT8fSp5PEOujri53/8Q/QwcTq0fP72nK4bydYJm7MldXeibSeshizOifyA1F9xbEva1qPtHJqRuh0JlEVGKT/+8Y/4l//PX5HGW86eBPTdQJKPxFHKn/17v8BZy9XNNV9/fc/r16+IEsfD9Y7VYk25q9Fa8/DecrZYY/wTb//Q46svH9GBo68lD80t0k2UpxNX71vOzjbsjvd89fE3LM7OOHX3fPbsguWTFfGZozkeePPiGV9/8xVxuubpixX/wT/4L/7uD6r/01/8d798eKhRIRTJC3a7E8dDzbOnL7Dao21mBMZx3+Kplqa9ZxolQeBzdf0On4Rv398z6Ef+6E/eMPaWzYXkj376lvvbe+7vvuDiYsF2dc5ut+PsYsHhdAuBwJiMwZzQnaJrThSpot63xJHPIlc0TUM31cRJhEeBNh1dN1AeO/K0QIUGYyfa/kichIRxgDUjz5+9wpkAT3iEwkcFoKIYZ3z0aPGVpO8b6t3M7cMJNutzjvuBpm3w/YI8T7Gix8mQq9sG1Mj2/JzAz1mufELlOO00q82axaKgLS1hFNB0Jct1jEfKxcU5ypdIE6JkzDT1DNNEPVY0pppXis6SZhmegK6byLKcuumJopwoSom8hGFowXbk6SVDOxAEEx6K6lQR+Yr1Oufm4ZbOGIrFmihJKBYFygXUxwopfJQXkRc5YeST5Rl9P6CCiGdnCySAjOingb4bOV+tmbqOIHVk8Yqu7emGkc9/8hYR+Qi/52ybI7VgMgbP1wx9gPJjFsuYU3lH2z2ACwiiAuM0SRpirMekBUVRsNkU6HFEa4tSMVYrpLfAI+PDx1v2u57rjyfq2nDx9DmnU8nptGOzPWN3OBDFCmEjqrojy9O50zoNRKGiKis+e/MCz7MzpLksMc3A6b7G8slTLgWebzEixPPnSoGeJop8weFQEoQa6YX4gYfve0y9RaiAIPKRLsIZnyD2UanHepkQKUtbG4wVbJ/XWDOAfooee3wfhAw4HmsW+QaNx91+hxsmkkiB87i93RGpmKcXT9GT5vH+niiICKWPCDVxHuP0hNCGOMwQQtA0E9JqpmaajSsptL2HaQV55KMnGBrFzYdHxqHBk4IsX5BnKcpX3N9/ZN/usAHgeXTNQBQnIB1B6JPGBZIAhMFXHtpAGIVEkcJYwWRHjD/NiLVJ4YsQaVOGoeN0fODNs+f86R//W+R5QtPv8QLHoCU3D0faMWByMVVbolSOCjLatmIa7Se9qWAcLXUHnh8iPEd5PHI89CBCjBU0raaqB/reEQYJq0VBGCk8odCTwFrB0Pe0fUUYQhh5LBbFfK2OpO9b+u4Itudw3GOcY7NdY7WjbRpk0JEWIc+efwYi5Ob+mrxQbC/OafuG6+tvOBz3JOkCQUjXjmhtmHSNdkecmI8mwYCz4HwCmSCEI1AC6Qv8ABATw1jRdEfGocKYDmM6PGGYphbhOYSYk7y2rzF27laOkwbn0NMwq10nTd/3GGNo2oaqrBgnTVU1jOPMgP2Oieqc4ztj4XffhZjpIs5ZVDC/f1o3VxPmbuu85jdmHlyl5+Hh4eysr0R8lwiPWK1p24a2L+mHE13XIL2QvrVz2uog8BMkMWEYkOU+xmqskQgChJxouxbhAb4jjlKyLKbTPXf3B7abM9p+4FgOZMs1jw8lp31P4uUIDcJB3dfEScjlZosnzXzw5uatmTETRR4SBB6hTAhDDz12aK1ZFDlD53F7c48nLH1fUQ8NBseoLWlRsLnIacsjiS+IshA/ACnSGR/kWVSYs94+YehHTKe5uDinayo22w3HsqasGiY9khcJhvm4TYqAOMqIwxilFJ4zqEAyjRNxVGBlzal/RMkzApGBaBinEacD8kVCXU5oawiDSyYjSLKY2/v3GN9jsHvef3GLF/j8+m9+h1quyVZLwjBhebZif7jidHRkSU5Zl3i+pCrvqKqJtuu4vjqChTiJubv/iDWKNM+4v7/j44f3qLAAQqxL5x767ZHJBDw+DjRDS286jtUOPyzYnWqE8rFCIlTE77/6FplP9Lokjn0e9gcm4ZFkF0y9RioPzx8YxpphVGzOtgi/5+b2iqqaX1cIi7WOJBNUzYk0XZBkPlV9oul7YrUgij18KZEiwbqRQbQz77e0dI3Hi5fnnE5X1HXD0GsC5aFdy9df3vLmzXOa+kR5HDm/uMDzNW1fYoxkEhNBZLEYcB7ZOmezVAxuYv9Ys13Ph6VJtGScRuJgTRBqVsUltw/fcHF5PlspbY9HyH73DjFuWCxDur7lsCv56stvKC4FaRrwq1/tGC1Ye8SyJE4ku+OJOIsZuoFhaMgWCwIlef3sR5T7kd/9tiTwLaf7jroMOXu5YHA11b7lz/+jvweJ6v/wP/+3v7TG5/PXf0iSRBz2R8YBrKsYO8HxtJ9TuMyRFg1VVRGHG+q6RHopxTIiSRVvf/Rj2trj+Wfn7A87DjuFw+ewM/z1r3/DsTxRDw03d49o53P+ZEVSCDybcPFkw+HBkOcjP//5DxDTE66u3yMCS136FMuArmuJ4wzfyxm7iTgKOez3BCrkVO05nfZM40SxXFEfO/YPB9JEEkiPZXGBkDPIXE+W+90jkx7YFhu6fk7H+qHDaI/BtCACBlORFBIbNUzCgwAME1m65Xh4xFrIFwmYYl5NbXxClZEmZ0wciJMEM/mUp0cCmYIVbM5ThFjgKUeQhjhPoXyBNR7TOFDXNdILMWaiaQZA4lzD2AmyImWzXlFXI5PZEUYh1ckRBBJPCvAlUVrgOVDS492XXxMJn/PtBVIItBk4lQfOnpyj7VytWC2XWBom6VNWNfq0J1eKkobSDXSDZtIC60Yun54RKMXvfv87hqkjSTJ8teD2rsYPRqAHBIHyeTwcsEISp0ucJ8HTSOnR9iMqCinbR6axRfkKK0ec8EjycBZE2HukipiswwqPLC2IsxDnTURJxGgm8C1CCqwe8VXAOAx07TBrYzfPwIvxfMHV1R1e6PHs/DmraIFSPssnOW0zYoYRI0cG49F2JZ6wFHlGP/akeYS1mqrsWS6fEq8Cru8qVJqgJ8fYeHTWYOOBMHcIaSmbE2GQc75MaHcjV7/vyXzNdrPmUNXcHx+QgaDrG6zVZGGKcgFTPwCGrhkxmk/4IEcUhVht8ZxkciMThrGbmBqLJ1KOpyNjYzGtRIwhXTMRZoZACDZ5SpJIrBEzsSGHi4sVQvhop+lNSRwL2m6gM4YJB87D9yBLQ7qx5XCs8W1EFMwpP74A5xMFMdL38KMI4UPXO3aHmdcqjcOzhqY/UCyXrIsz3r1/x+PhRBgVNJ1msuCHcypYNiVpmhAGOR+vrmm7E74fIGVA3/W0bUexXOL7kljlqGBF3Q4EiQ/C0Y/zgZ8wsMoXeAKOx5K6nWsKvd5xqq/p2oaiWNE0PV9/9RuGvidJMpRSBH706QgywHMCPXZgQcqILF2hVEJZnjBmQPrz0WXTGKqq4ljd0fRzf1Fry8NNg0eAEBJBQdfMYpJQCeLIR/kpenR0Xc04DjhnMXZOE8epwZgOpRww4gfg+/PrReuRSQ8o5SN9xzC2c2/fc8zhqJibrs4RRjG+rxCeJFQhQnj4QUAYht8jseZEdEZVfcdP9f7Wen/uzEpv7qdKX6LNnJY65z55z+d0GxzznOvAasaxxfct1nYY29C0e66u3jHqgThRxEnIODjSaEEc+YxTjTECqTz2h4qmGXEWhD9htCNQOc6LGLqOrh1p+h4VerTdwLE60k81q2SNHiZ0M5JGEc5ZJjMQKYnAMvYD46f3rGyRU55qiiJh6AbiKCIMIsa+I1Bz7z2OYjyhyIsUX2pWRY4RlmPV4syAp6E+HMF4rJZrjJEMU0cQSPre4awgjkPsFCBMQl6Asx6OgGmaj33r5jhbB4WPkOA5MNrSdy15muGso+8aum4+xnJiRMiA8jQhrEIFjlHPPfehrUjThNF0nE4dSEPZNPz/1L3Jrm1dmp71jGLWc65qV+ec//xFZERGhiMzwWDRwR0j2S13EBKyLUEDcQHcQnRouoNFB1s0QEKii2ghcQWWkJyZyiCr+ItT7mJVs56jpDFPcg3OC9iNvfbac3zzG+/7PFFkZMmOy/MzWb5le2gY7UIqK679SJIUfP++Y56hSDYgHKgOrUq6XrKpE55Pn8jSkug1ebFhHieOp4/4YGj7E9O4oJOcokr5m+9/IC/3oGCYIu/ePZMWCaq0PD7NRKEYB4MQmn480jS35FnN+8cfUGqH8JH2+IhOdlzMCSkDJZqsEpTFDfOykGUJz08XQlhWHveyUjaqco8gwXjLMjvqZkddp+QFfP/TJ1KtCCwoLTDLzM3dA93ouX91j5ty8iqnHc5cjgNFmmB8z/fvPmBiS53leGPJs5Tvf/iJ7a7keJxpxwUXAkUu6YcWpKNrB4pNSpgkuip5fX9PkRXM08LD/dcoGbi733F8ufL0uFBUKX6quH2V89vf/r/c3Ve0lzPD0HFz+5rZTZzH9xxuH/j06cL/9X//GW++3fPpw8ybr+7RRK4X+OaXBxaz8OrwBrssPD0d2TYH2peWf/hP/gl/8Ed3bJuSqniF8cN6MzRHDjvNP/pP/+u/A4Pq//Ivf2NGjwhrc1lqS5ob6vLAZpuiSBmXZ4pC8HLskLLk6XPHMgt2uw2321c8Pn/mh5/+gpfTZ16u7/AuYV4cw2whTcnqimGyqCRyuL2lqXZsdjm7Q8bt/e9xuDlQbxXn6wWlFZ+fnvjweUDolLzMGaaO3e4NZpm4XnqGbmbTbPn66wc+fx4wRmAXRVntSRONNYHrqafICqpyx/HyibRI8V5yf3tDUZd8fnwiV4pFJEThmWwHemSzzamLgtd3r8EbPn7fsd9mHD/16zXXtGZky6oGrbgcP7PdbCiKLcM4kxZuxXnVCYvpmF2gG64EJ3FuxpoMoTRKlAzdGetmMlUyDC1lnnM43LLMLWm6ApersiQIR9PsufZPSAmBSFlsEFIQhKYqCwQCM1qYPWWW4rzhsN2zmIVqk7HbZaADKM117EjShHke+Hj5TDsM2OBJ8hIvDgxTjxSOOq1X4463JHnCjx/e4ZUkzTK69gi+xUsDauTt66/R8p5rH1G5otxUjMvAsgwEF2ivPUme4qWlnzuEXg/J9txzaG5IU8mlfUdzAGMnkB2CSK63+Gjphw5nFEIrZmOwSyCRkfkLsmfqR7I0xQvB4hcW/4JQC5dp5s3DzxguAzIPHO0jRXVAy5zPp3fs7w8IoelOHcFBXuRE4WnqmrpJOR6vPDzs2VQDTbGKBTyGaiPJlKDwBb/45iu+ef0LtPBs01fs919xeFuRpzcUZY6X0Pcz2/0dMsnYFRV5CESxZoSjsOTFhuA0RalIijVb+M3bt3gTGe2ETBSm9+A9EY2Uq5Tg7euvSJIS5xS7qiELkuAjQaVoMkQCGsVu84bFwMvpRJQ5koTrOGLFiFIaGTI0CcYu6KJYUVw6QcQFlML6tVktgqIfJ1S6DjrX04Vp6lFISpXi3cISIoEcQYETguf2hcvwwrCMWOfJ0gIpoClysjTBeUMUHUWh0FJTFnuiz1CJIM9SyqTBuQUbZm5eNRR1hjMpqSwoU8nt7oASmo8f39FPZ2xcmO1Cmpckco+MGYmqyJMGCJg5MAwjzi+rZKHK2G1uyZKSIhP86lffcXu/49p34AMax/HpkZfHF06XK+M44EUgqysOt7d0Y4sxLft9Spp5sqxcM8+pYbevcc4yTSMxJGSZRqeGNEuoyx1ETT9MLLPBLgZnHd6tw46162Zzmns+fPhAXuQYM3A8P65ZbefwweOD/4KRcozTxDTNGOMIYbVeiS+Cqr/dovovVqoVMbVatJIk+bJRXVv9wXuSLxB/6xzzvDDNC1on/z/iSgqB9xbnlnVw6U7EOBPlzMvpHf3wRMRDTAg+rtprUXJ7uCdLJdMwImPG7rAjK0qytCYSQUSyTEFUjLMlCM22aej7M8ZbfNAs4wIqEAA3OZJEEoRjChO6ySg3NQKFjgopNDe3r5CJxFqPVAGtMkIUfP3VN3h/JbiUTNUgIou7Ao5lmfFBrnHjIAAAIABJREFUoNJIIgLSKco6IoKikDvM5PCk3NxsmfoUqQqMMdzc3CJFgkSiU8c4WcoiRcpVwXm6HCnLDXc3rxn7BSUypsFT5FAUJTqJtP0TWdawPzR4bwghpcw32CWS6Zwkd7iYMtsZFTRCwmKuDPNIN85ILUiTmsm0JHJhvPT0p2d8SFBJwuTgsEnpr58ZzMgm3yFlyf3hK17OL8wzVEXJskhElLz99gZ8xun4TJ7tGKYXbLjQXgdi1Nze3vLh6QMuzKR5xbuPPzKZjstl5PPLJ7rLTFFk+AX2uy0ESbQFIV7xTkKI9CdP6ot1OZ9UhD7n61eC51PLPEe8U4QgKEqJs4JN/Qrjek7HC33rSEpLolM2mwN5XvPh3UBdl+TFgaasKOvI9XLlsHvFYC60U4sUBcsyUm8qijzh5fiRcRjRuiIqT9XcMi0TUinyIuV06hjGjnkyFKlmmSzBbBimAREjbx9+xewWxvNEOw34aV5jUybB2YV+uPDhwwfSDKK0SB04nS4sbqRtr7RnR1hKtrs914vh3cd3XEeLkBt+/Ue/5k/+5Hu2B0WaCtyc4O1AsIEy3/BXf/6Z7Ubxl3/+xN3bG4blRFU3PH74iZd3A3/y737Hq7d3dN2V41NLUdfkd6/4z/7Bf/53YFD9H//730QUSS159/iMSDVVXTD2kbrZMiwX0JIPny6EKPA+0A8jD2/2OBtAarqpRenA/asN2/o1WuX88P0zr77a8vNfCsxxIXSKqlYIFXj9ak/XP/P+neXcvufP//zPSGSFlDCMT+RFSlVu2TQZ43GhbwPnY8/kJlCOVzdvCK5H5orry0yiI/u7kiB6NpuKofVs6obDTYqocg6yoExThI6kdc3Tu0/rlfu+ZBCawQ0E2RKwHPZvSMQ9IQ70/cTuUBNjhvAZRSNpigaUWs09WlPWOe20cLyceb5+5OPTJ4qq5uXYMUwL0q2WL4ThcHOgb1c7Udce2W1rnDH89MOJoobr2ZKVmn6M+CRBlClkgkPRcD2O2OApc7EWc5ylLjY0RUPvrixxYF/uuN2UOAORSFnXbLZfLDNKoXXK4mBwI7MfGNsFrTPyPLDREhcqpmWgkAKd5RgWiJGizEhUwvHliYe71+A8dgoUWcVsPUpq9nXF4/SMnjxTH0iTnGG44oxDqJQwS0zuMJOkEBlaeGIcsDYwDxO6KKn3BwpZYaYZqUuES9kf7hjnK4m0DK1hosW4SJmmbLY78qrCzgsPN/dkSYZMJEF52qHFWEPqKt5/+J4ew3l6QUsokpxPnz6R6gJrJ/JsR5kk3O/WB/s0LRA8Oi+p64zueCLRO1Racvdmx89/7zVFqmmqjO6SoFXDn/673/LbP3nk299/Q7cc+eEvP1EpTVpazv1nnJhxC9jekqmcfuwZzAJaUlf3WJsQRCCrNLMfcNEj0pyYSmyc0UVKriJmmbm/vaes1qb2FBaUXri5WzOe0+LRWSDLIq9uXrPNa3Si0GnK8+nIOF7Z1gXbZk90nropiBP0p4m0gJ99fYfrDSGm1NuGbV0htQSv2BYlRR15uTxTphuETyBClgQymQJgvGUaPPM4rDzN6FhsSze2zJPD+7BaqdqOgKBvB2KccdIgoiYvCrwKLEgWZ5hcj0ozogq07ozQCSJounEkTzOkUyzWY2Kgi55+HkmiIEkbnM2ITpIoz6bUZOlaIqoKTZUlgGB2M5d+4HwZSAqNJ/D4dGIaLG529G3H8+cXzp8HvBUsImBiZDYGR46dEq6nAZVIumXBGEVZaEwYuVxaLsdHrL2S6BKtKpRWmGUtlJjJYmZLVaRYv+CiJ3iBDJp5mJmmFhE8Yzui0Jxfzjw/PnPY7dk0FYLAOF6YpytmXFAiEmKPpUfIgPOeECxSeHzQSCkZl5Z5miGkmNmzLAtBBIxdVjOVzLFfhCdROua5J5GrDCBJ1Fracg4bAjYEZjMggRAd/fKZORzppp6unelbw9B6pMy4e7VncT11U7DZ56RpwmF3y+3dnsu5wwfBt9/+nI8fHvHCM5iZ02V9fsQYVnIBUJYly7iySvO0ICyK0QxMwrHgkJmC4PB24bk/EoRgUxRIEei7CaKnrjVaRBJSlFR4D0pYxuWCjYboa5Z5JFUKaxewCcU25dqtQPjHzy2Kht2tJAJCFDS7G6Z5IMk9Og1olXK4yXFW4if4+u0NXRcQwuDVQCp33N5V2GmhqBqEHulnixcC4w1lmRL9SFwyUlXx6tUd4/zM0/mCqlIOD1vaywU/g8gDPkSIKS/HK6nSZEqxLBOLDzS6oGxKTFRf2L8diRIM04ALgd2u5t2Pn8nzlNP8iet1ZJfnFIXj+fjCdn+LnQPt5TNVtcHLyMupwztJe1z49KlFJoHJdby0VyKSzSZnGXrmPpBkmqT4gmJ0CyoLdC4gUocfPZ+OJ0RwJFkgvxG08xpjSQtJ0Jr25NE6I8s143whyTI+fzoRnCdLUoTe0fWXL+royId3j6scIl5wRoDLkd5RVveAptYH5jGgswI7X8hlQaYKzNTjrWMeRvbbPYftPf3lkcvzqhzv+o40TxjHme2uYpos/TiRZ4q6KjlfLjQHSXc5keQlucq4XAaKpqQfT+y2G3b7W87dibafSFTG53cfcIvjmzcPBC+wIuE8niE0BDEyjCMvS884LDw+fmKxM1GIlQm8SAITIWq8iew2KV07IpXgq4c7xr7jh+/f8/7d9/z4+a+5LC8M04mpPxPczO3+jvPnM//0H/8d2Kj+63/9r36TZSvs7+lxQsuc1/ff8uHHR95//C3DMLHb3FGWJSFo0qTi57/3HWNvWExP09yhtUCK9SH86SfLX/3VX/Ef/CcV3337Lf/23/4/mEGD31DfRmQamQaLjc9EAWWx4f27dwzDBakNyzLhfc5mt+F0PnM6Lrx8PPP2Zwc2+wYRLIPLiMXM+acXjoMlrSqSrKTvDVmyIckEophQhSDJIj4NLJPlxXbEaqZzPYXO2L19YO6eKDKH9DmleCDXG8z8grOOps453N9yvSgO95F+GakqwaVrKZI91+uADTOnS4+xdr0mUwqlU2KAJNX00wBBc3ezwU4L27pi9hNJUTOHhTqt6boRZyT7/S0vzy/ImDINAnSPGQzd45VM54xLj1Qp3dAzzh3X40w3DGQ6Y2jPLKMhyTZInTBMV8Z+YXYjIkRiGJGl4Nj1eAuaVau49JGx82RpSdeO3D1sSLOEaczox4n7wx1DP+EXaDYN8+RYZkOiSkJwLIunUQ3vP18wg2dblrgSNvsGFoebIkWxAznggkERECqS6Jx5initUVlCVueUZcnQz4iQkMqcVGrSdOLp1DK5QDe15LKiTEoEgXY2DP1AqjT7zY7gHVEEhnFACgE20jQpeeXJcwg2R8WcebwiiBR5iYgZN4eEehu4tAvGJwQFxg+rtMJMVFWNkiXH85nZdCglePk8YJeS16/vePfpb2jPV0q94eGbmufLX1MVBfubr+jNhb6/snSW6AM2WLJqfeE7PXc0xY7ttmSz0ex2GdfLhfFq0THjelxxMNEp3BxQMSGi0HVODALTW8ZgSIscRUKRJyxjR5QTMhOEqLFELv0FkUZk7pidRWcJ9S5H5xHnBRAp65Sb2x23+z3RCubRMFyfqcoKYmQcn0iUps7vMXOkHQeSIqDSiLWeKAJCRMqqQCcRYyecn1FaMU7jl9hNxJuA94aqSqmqhrQoGO2CmQWJqDHzwrhckYlksRPD3JLoHEGgm1vMLDDjhIsj0a9ueZlFruOFS3cmTTW4wLI4lnnBuxFkIDpBlmzIig3P5573n04EJGVdMPQTMmhUVFyOHTImdN3Ipe/xSJQsuL1/TbGt6cPCuMzIVBO1Xrer0azFsBAokgI7BjCCm82B+7sHQizIsrUEZMxIoiQiRJZpRmkJSYKLntvbA/f3tyRas9/tuLt/YJxnpnlkd7tlf7NFKNbPO4IQnmnsmPqBsR1Z5gnrFrr2yvV8ZplanJvox4HF9kymZ5pndrs9xs0IGSjKDO88McTVNmZHhHJELOMwI8gQUhClJ/q/JRHM2GUi2HWYc87Q9Z+w/oRZJqLTOBvIM0VV5+z2W7S25IUmSzPKbM88TDwff+L4eKTWNW3X8sO7n3i+HJGFgiQgBRQ6YVvvSRII0RKcxkdou4Gq3JBmgZvqnjBZjB3BRJRIaaodd8UdfrZEmyIE1OUOieDp8weKrCBJJEUuOTSvEbrG+gStIvvDBlXluAD7Q4XIJEVVkueS2TgO97dklWS33dBeWqrNLVI5nk4fmYzh09MzebFnXgLH04Xbmz0+wrWb0KnGENk0W0xwvBzPiDwQdA46Jc013nYsw0iRbZlnT5Zpuuv6f971F4ZpYRwcUhRIHbmeXii0RopIojWHw57gHdOwUOQNTZXw+fEFz8oMj2JBKc/L80xT331h1UqkWnABuq6nKnO8jTgsUtSkReDdp+8Z+8hhtyVTGcYYyjrn4e6OwMS1XW8MjTXEENYCcaVoh4kYLDIINtsdjy8faModmVJcXi4UZbpiB32CiAndcCHNI0sfyJMGM60Dm1RrxjQ4wWazRwqFsRZj4as3B9I0p2+HtXCbFwhSxrEliEjVQFHuaK8dbml58/obPn78kYQErTOOxyM3hwNKRQKRaZ4JwTJNDkKDTECljnpbc3o5Ep0mT7fk2VqCNtahVIZxA2ZJSPUWY1q8KfnmuwP92LIYjbEwDhNjN9C2M0WdUNRbvE14PB7ReYaNksvlhefzB4JKEN4TXVjNjT6SpyWX4wtFobHGgVbsbu94bF84jidEtpZriRoZK7ImodhuMD7BuRLrJEWV8pe/+xvefz7z3/7z/+7f/0H1//g//81vnAs8fjxRFIJNs6PvLmT5lbdv3nJzc8+H9x+5uW0oypy+PxMwTMPM9XrCB4uZBefrj+TZjqqBv/8ff8PxuePHH97hbIFdPPPS8vrbLbd399zcvmIcDT/7+h8wjJ9pyh1aZNjFs9lX/OVffOTT43t2zVf8/O8/YOXCr3/9S1TqeQlnilcOlU2cniz1rkBGQXAzTV7iRrl+iepi1fXNgUxM9KZHFBmjOTGcWtJ0x3DtieFMphuGC9zd3DAOJ95+t+PH788gNafpI93YcTyOBOE5HwfKarfqQ4UjKkkIgjTN8C4wTDNVVbPMhhjDaj0aWrTWCAGDuSKlYraRumrozYA3Vw5lCdFgpabcb4g8c8gqcr0ljQqpHfW+4Hr1XC8zm32ONZ7gU8pCMrY9MkmIOiPLFVVeopMEHx24hGa7ZbAD7XglOthUGw67Oz6+O3Fzl1LUN5h5xC4tQaZELEXWsJiO4Ax1VbNtCsxiCNHTFDVCetJ8vR786v5hBXO/3XK9PtO1Z+7u7ymylLZtGZYLTblnV265ThN5opmNxc+Rza7CuR7jJ6KU5HWFZ2GwR5Zp5ubmlg+Pz2ybPb/3+uecn48YJGNsCdZQJBnCgxAK4zxJmjL2A8IHdCYYR5AqJdGCREvMErieLPf3B5QAER0xpgSVk5QRGwzXbkYLh1QVic5w1mFNYJkDywAipix+ou3+dmvT8Me//kNmf+R6PvHzN3+P3/uD3+fz+xN2hmmJpGlCMHxh8QXypkCElHkcubYnQnAEF8izHO8dzs4cDluijQQXUCpn0xxQecLp6YUQDbJMkFrQNClZGag3NT4CMkPJBCHBOseyTIzTlSIrCc4y9CdE9EydZ7/bkqaS48uZYByJTHAmrhzGPEWryDQaQJMIRdv3WDVS1DnLbAhekRcF1nrM4tjtdyiVENxaEwleonVKXVVYt5Z9EplS5BlWeAYzEVxAixwpVqvZuCxfSlMOKRV1tflSABTUVQpRU6YVRZNyMWderi8s3pFnBUVasBi3YtOKFJVkGC/o+5HL8zMqSg6bO5qiwtjAMFiGfrXLjWPL+dpinKRs7qiqiqYqaJoKj+Pp9MJiInaJDN1MrgrsYlkWv/5dXWDbHHjz+msCjm65Mi4T87LmTMfpSpKkLNOqd3TCcxlekELjDHSXcUXrzQOfHz9xvJ6IGlCRYenXjPEys8w9bhlJtaQqKpq6pixS5qFlntdhuCrWIteyzKBHjsdP2CWglGKZ+7W05QJ2ASn+VicrEWplga7590iIgXm2WBPRSqAI2HlkHJ6Ypkem5YXr6UR0GXlWEeOEFKuGtW5qrJsRQmIXx9x77GJpuyN5lpPkCUZNGEaSVKwYHy04nV/YlRtyMjIU0a2DV/ALWgXu9rc05YbT04XNZsftoWFb78lkgoo5U+vIAhw2B4oyo6k3bOqCuihRImfT7IhxFSZYv6yg9kwx2CujMUzThBeRmEqMj0yT5Xq5EGLJYBeMHxguljqvOT2fEWJFiuEzEpEyDw6cRrLC7ZfFUe82vBw/sOBIkoLN7oE8z+gvJ8bBUW9KIhPzNKH1htHBcTwTUKhUkVcJzkpkTMAZ3DSxr3Zs6oab5o7+2rPZbgkO2pcBs6yGM3SH0hIp0nUjbiOfPx2pqhJQPB+fKPMbrsMzz6dn0iTncKgwzqOTknHqEYnER0maFOjouNndrj2VNCVPE06XK1KXRDQ6SdaXpi/Eh93hDa/u9lxeJqpGcz61SDzteUCKyB/+wd8j0Z4PH44sxoEMFFnGcPYUaUqSSaTUlEVFjJG+HxBC4RwkaUFepmRascwL1hryIqMoNyAVPhgy1ZCmkufHjqba0dQeZxT7fc08zWRZQZoUeCMxxiBFDsC0XOmujtEs/PLXvyDRWz5+eGG72WIWR5GXOD+htMBaz7ysSEAzJ9TVBqEHNrucQt6CTHl8ObFpbpFcuZ4HNk1DmqW8fLwifEQEwel8JlEpMSxfKEue6Trig1hLpUFQJjV1lWPdRNtFhmWga3sSuepE7BCZrpY81WSFp209OpHYMPP0/MxiHKfrlX6a+NUf/jH/xT/+r/79H1T/p3/zL39zPp25e5Xwy1/8EbiEcegYO8+3393SzTMPb+6Bkj/5099yf/8V798/M9mWsim4Xieenlo21T15coNQVz5/eqZvAw+vDszukSLf8+rVnrLKKKs9Qx+xc8Lvfvgt/cljXYs3KU294emjw9uc+1cb0sLz9o93XF4c7Uuk9xemZCJGh3YCmdbcVG/Iypl648iyFIJimJ/opyc224bNbUOTOcYwMU+Rqij59u6BROTYi+W7P/iaLNmCtOjE8enTCRM05aYirRSXYSEtEq6nMyFO+MWSFSlNdWCcInmd4l2kbTu01lhj+frttwx9S5HnDEPP4b6m7SCtUibXEWNBkxdcj1fay4C3JdUh4hBsmwozGoRPSNKccbjSNBqpLMY5nFt1a3maUuQ11+5MnkpUkuO1YzEzOmjOTwPGX2nKnLwpuX31mr7rGPuFbjDgU+Kose5KmgW8jMRZMPYCspy61sC0HlB2ZcnFEL444CVJqgkhkKUJ9b5CRc8kPNdxZrwYyrTm+XhEihUD5bxgah1ju1AdbnDmCkEiMk3MAlmpUUoxmsDYGzQCLVfEknQOsRSYYcbbltOlI93ldJcerQqU0BRZyvnywmJX1SRBMQ+ONGlwBrIsxzrLpbtS1hX39w9M84TOBLtNwfncYZl597uWw35HU+/BarabO6L3TMPM0+OJ6BW323uWyXJuX9AiQasKZwPOR7qppU73SFMydh2/+/Enqu2GYZro+5lUl3TXmXEyyFRDgHEcGYaR07VHJQXTvCATSValtO2FEBz7uz1JmqK9RAhIlCepHTKZkHHNXdqgOF8mxmm1rmzzHBEFXb+ghKZrJ7x1aCkpsoJMFuSqRKOZhpk8LcjznBCgbXtCjDRNQZ41K44ozOhUEzUs3rLMM3VZopUgOiCumUglCmIUXK/tinepN8xjx/nckiYFt3drTjzNSqLI+fT4yDSdyIoM6y0OR5bXeA9uXGjHBZFEGq3JdYMj0rcXyrRi9paPLx+w0ZGlOUquspAYYV56Eimp6g1j9NjgSbVguJ4JEoywvLQXuqnn2ncsPhKlYDSW2UlM9IxDzzAsnK5XPr08MRhL2WwRWjIM7TqQxAx0ZJmnNcOpJZfzC8PSce4vTPaMTBzWaRbjCEi8cMjUoTOB9fNKyEgq+n5iXgamZVjd5duGvMyxPmCMY5pHhLBIBZt6Q6LX3znPEpIsonPIq4KH+zdopSiynFxr8gQUkTRJSZVACkOiBVoFqkoQ48gwXhi7iXl0mCVglgViYOw7pr5DK0hUitYC505M43WlAyhNnmv22xtOTx3LvJDkKWmmidHTlDdEL4hWo0JKosPKBCWnrmvOxxaJ4u7mAaVy0Jq0KrHWkegEjyfIhKQsMTh8UBRF88VcVyDSiUvXsUwTedZgJseuKKm3G8b+St2UHHYNOIWMkk29DmjXtidJFf0UyVJNb07MHrL0ZjXMxYHFCnSMjEPPOI6oRGO9BR+4u7slUQKpDLOdMNZQ1jva9pmqhL7rCc5wvF7w3mJswDOsLGqfImXC7E5chiM3d7cQI/31RDQKv+QQBXmmcWIhSUp++vFHYphIlUJGkATG8QRRMveGcZjZbmvsYvGLIEkzskKC8Fi3cDy1TNOEs4I0afB+YbNpyNMMhCLPctr2zP39ga6b6EfPMB9Jq5UNer205Bksy0SSNOz2ez58/sAyLCxGsNs3TPOZ7W6P92GlWuiUNK/w0RCsIrLgvOP1m1dEJ0iVxi2Wp+cn5tFRlgkSxfd/9Y6vv/oZda1YFo/SAaktzlvMAtPouLndI4Th2p5ZZtYXMDtQ1juETrlcT2x2N0iXobSkrvcQwZiJxQa6aaTrWpQImCkwTSc2VcU09lQbweX6TKI3qwlxGPn08cIyB6RQ7PY3COVJUk13VaSpQqULVbXHuYXNbh2sFzNgRkGaw8efWrSQeBu4u9vgjaDvP2PHFT+pdGAcerRsyFTO6WiwsWNeDGlTIxNBP7ao4NE6MlnH5ALejWSJpClypBUIl5KqAqUk09iTpRnplyhImeaYySNCyn67QyrPP/+nfwcUqv/b//4//KbapLx+c8ef/elf8O7HzyiRsNsf+P1ffkdnDJ8eP/Dh80duH/acrif6cUZqxTh73r7dk2UZeZYQ/EKSKKxJ+e5nb0iSkv1mg7WWeiNQ5CxTQGjL777/nqHt8YslLzv6S0ZRC54+etr2xNBBouGlO5HMimnpGOZI5h2xLRmHgTRmvDwbsiohCIGNnpuHHaiEqtmQFZHu4wvXyVKJLWlTc//mgKsXig24vcScIpfjC5umQauMzaFid7PjMjzibYEoHcPQUasS6XekaEZjeXjYUW0aPn38TJ7nRBcILvLtV9+gheRyPpGnKbJIKJuCvodubFnMgukDwS0oAWWdr1534yiyVyyjpSlrlmUhJh1FtiFGhZlSZmuQ2nF/V+FMi3GG29sbbu5uiGnAScvcRrZlRpUrfJRsN7eMy8ipPeMtmNlxf39Hfz2SqkCR118O0IXDXuPMwmgE+80dx+cVF1RVKUpqts0t7WWmajLSLMNZSVJoEhH4PJ14ak+80VsWpfE4Xh32eAQ+rMOKFp5dvcOphaas2DUPKG2JwlNkKUM/0M9r3i9RMNuJus6I/YY//NUbDofVuiKTHd3UUmUJdV0hpWLs1sZrWWywxmOtZb/fUGYNUnm67kwgIrUmrzMsPZdrSz97fvrhPX3rScWGfVWSZ/D85XpnGifmqaWuc4oy549//Ucsg6FrZ4bRIIwiBhis4fk6gxBc246XY8ePP32mZ2KcZuxkEUHhmJn8wsOrBxKhuR6PSAFJpijrmnkOLCaSZSWXy5V+niibAjOOKCJvbg+E4PB+ZA4z0wApNVqm6FRQ1yVaCrSSbPKG0ToW67/YjzQ+GnyIpElJnteYaaRtB4qy4rufvSaEwDwZBJHDYU+iAk8vL5wuPc47vAzMfsZbS5GW6/feLsiYsNnWbHc1fb+QJpKskHTXlvvbB+qqpCpryrqiGweGyfH0fGKZZ6pa0WwlD28f2O0fsA5SVSBFgjOWNM9oypRc5sjkQIwKHSM6kbTDlXkc2G+2HKoDmhXns8wLWSYp0oR5npmjZzaCYTIYHXmxVz6OR67TgJAamSdMYaY3M1Gt18tCRHSu8UowOENvLeiMyzBwGa5EGdB5jteSOViUUgTnmKeJKs0RX7afRTGhkiuKiq/e/IIszxnmlrRYWahCaJpqR5KsiJokl+z2W8pqy+XSrQOSTFabHpF5mpjnkbIsKcoaFwNBOIa5Z5wmQpSAxoW1lV9mGUM/MU9mLU2pwLU949yE1gHnRswykX8xY1mzYJeJRAm8WcBHEpURaHH+zNBfubYXnl+eGfqZqjzQVA2KlH7s2B1yIqtrXVDRdQuX8xMSycOrW5JkLVfpZGWylmmKDQsfnz4h0xRVJExTz22zQVjP8bLSXbb7kuAjdZGg5ZUiO1PnLeOlZzKOKFKiSHh9f8OmSfl8/ICNM9M4En3FYb8D6fjhp594fP5ImkvGxbK4mdZdCdKxyw84JxhtxzTPlHrLTbNFq4RpWT+/9jwQrCAEz+eXJz4cR6IsMFiWuPJvg3CcXzqULkkzj10GjAnr4B1q5mFksk8Ye2UaDdenFmVKEiTGroSHsgpUeY4Z17x09JbgFqqqZrvbEbVjNDOvH+7J84Tj5RmVJCRpwnfffUWSeTwzzgu0KjHLjJmBoFd+rYvc3GwZB0PbHSmKEmLg+HJmWTQ6XUUw/TCRxJybbcGnTz/hveL+1c+Z3bAOzklFVW3RKcy2RypFost1MXC+4F1Yz7cyY7oaqg0czwsxGlgkZVWyzJ4kLTFmJMbIw93dyhb2hrRMGPoBUCyLpWkqbu+2lFXGy+mMw9NeJ6qyotnWvHv/EakSjDMUZclsZryA2bZc2jN1vWaj83TL/etbmiajyEruHyL9+IQLPSofEKJAkLOr32DsxOu3B7b7hE8fj1TVLVmWcjkv/PL3f4X1PSEsvP+ppamhOgBbAAAgAElEQVRuOF0+oJIEgebz8SOZksztFeUzDvc5fefQUqwzULKwTJL7h6+IqWSYZ8blmUvX4UVBkkOWVyBnnFn4+tUWMw6k+haHxYyRotpS1De8dD1OG8hniIHgFNfzmaZZC2whiC9yoC3n00AIBf/Nf/l3YFD9n//Xf/Wbza5gU/+Mf/Ev/hlff/s1oPmH/+jn/Pj+e567j3RDx9uvX/Hup0fKfEPfX5immbwQtKcZZ1ICF8qiIs0Dd6/BO4E1lrHrcUHQdTO/++ufkDJZD/B+YVvvePo8UTYpX3/9M77/4SeKCr56+8CbNzuSbOHj+4HWfqa5yWBWxMUjBERh2VQPvPl6xzA9EmLk7uYbXt3eMA0Xiiznh999xBWSrGoI2vLNz+/5i7/4LcrnDJ3n/e8+8lC/IksEVVGQ6bUd37WWZZm4vTvw+eWJuR+43zzgveRmv4VsxTBdu46yqBn7bv35JKcuaqQItF3LdrslpvDp0wm7GB5u7siTDCUFy2zRWeB46UiKK9JnJOlAkipUavBcWUZBZKEoE8qiBgndeKU9tWiVUG/vyPOUbmnpTAdIVJC8vXugaRqEhJhYBDNFXrJYSVbkCDfz5vYVD69e48NAliqICWYeyKsKRMJukyKiYrErB1QriZJ6Zb7qL+5wpUmKFV1jnMHKwF5qkkxSFgnzPBJF5PHxRJPn3Nw09P2IYYSgeX5+QQbNzeaO4TJzPo8kWcn+5ob97kCiC3ZFyaaBX/3hL8j0a/7D/+hnbHc1nz70pGnBPHmCDWgpSVNJjI40S6nKBmsD07jifdI0R2drtMQYyTjZVa1apkxj4NtvbmlKQVwEP/6uJc0yqqrEO4OUkXGauLYjUz8SrScvckbTIYzAxcjFXLFRsCyGbjb0zpFVGVV5g5nUl+yyBBmQcgW2D/2AcLCtd5TlBrNYVKJ49XDH6Xhi7Beq/X51lC8CO09EaemHgW4YSfSGxURkjLy6PYDz3NSvmCeL9QGlNO/ff2Yae/JSoaSiLnO0SFaXtoh4HGldUVQJx9MHLucrqSq42dVI6bhcjpz7E10/UaYbVJJivSG4iWACqSj4+be/4ubmgbZr6YeO4CP91IOw3NzuMbMnOOiHnutwYfGRxUaKuqDMSjblDu8C136iHSeMGYgsVHVCWdYcqgO51MzBMcQWby/YOdCP0F+vaO/RaPb1HjPPnK9nyjxDp5J+nDmfL1jjSXWJl5Jzf2WygcPuFWVWIWSCi4FuPBKEJ9EFUoJUq6p0thPOR0JcX/R8CJRVSV00zMvIML4g0ORZhYgRLRLyomQ0C851JEyrjpSMTCdUVYaSGcGtwPt5WUj0F+C7irjoiCLS9x3ttUepFCnBe4eSmjwp0TLh2l6wdsKFBWscSZKzmMDjy5m26wnRorUgywpUkrK7PeCEpR06ZrvwfH7m2p0pkgxnA6fTC5GRNJtJ9EyWRWSUBCdw/or1F7r+yLVvmeaBth8YekWqM+bl/6PuzX2t2dI8rWdNMUfs+ZzzTXfIe28OlVkTpaTUpS6gWxhY4OEgYYCQQEItCiQsjDRxwEBCGCAQAoP/ALMlDBxUdHUllZWd052+4Ux7iB3zsNbCiCthgXCQiuNu58Q+Z+94412/3/O0dN2Vuq3pJwfCYIxitj12hjzPyYsEmLFuySHXXb1sRLXGSlivdiRBztQ6tNXEKiUQhlUesVnllKcLfmrZFI7vfbwmkB1D/UCuBHEa0cmA29tb6qbjcm2pq56k2BHGSzns6flE1ZaYSDHN0PeOOI0wcU83XJdYT2/RaiTQEdOkkEojRs+1HnCAkJrd5pYkyrDWMzMw2pkoiSmrmvPxShrtCJTkB198hHcNWVyQxiHb/Y6qrJgmSRBY0jXYXpBHKyJC9CyI4oiq7YiyhHa88vjwHm9j0myL9R4pJ4yOGJqZwOglujF5pLCYKMQTMVvP/Ydv6Poa6yXTaBm6me32liJfU1UVeZFgtOHD+wfCUNL0LXby7Nc7Hj+cSIuMfjyTJ2tAfnesrMiSNV5Z1vsbnp+fEdIvCuZI4L3g5mZhx0qhGPuRKPYouRRFr2XDm7s3lPUTj+eK9WrFR7dveP/uiXydMIwtzltivWa9TmjaK2EU8fj8gbzI8E5QFCuKIuPx6R3n85E8W/F4PLPdrVjla65lw+V65Ob2lrdvPzC7kUk7zl1NmEik8LStI8sEfdWD7ADL9Trw+uMVx1PJze0LkiSkvkq2+wOBNlybEzqA2fVU155AF0zTSN1IsnzkcLij6yrCuMNhybIVQgq6VvGHP/1j7t++5bA+UOSCqmnZvyhoyx7bDdST5eXLG6r2TLHJmaYZZx3T3ONVjxEhX331gSKJyYOEviwZe8cv/uaB2xd7NrdbdCQYxonZqqXUF2hGKwjTnDheY2no54rJTlgclhmhQz68u/AX/85/8Hd/UP3P/4v/8mfP5285X2rqciJfKcJQc7lWDLxn7DMCnVJXF37v+z/hsDmgZcjYOvJkhXMz8zzhZkUSbLl/uMcEgi9/fUUKTV12rG8SZlqmVvHVl98QZo40PfD2q4psN3Pz4hU//9u/5u72C4qd5f7hkSwzi0kqCNm+eslvf/mO/apgmJccovceZ0Ka+pk8viEL9qRGU51P3L97RKuQc3kkDNekwUi8Mzx+eOT1y0/Qc4BD8zrfY6KJvp+prp7Dzd2SRz2f8EJyrh+pry0fvfyCqRuZ1Ui+zRlVw1AHBNFMU1m69spmu/7ORGNp+5btdsvlvDRsjciIYo+1I9NsmeaeruuJE0UcSj568xl1NbLdRsQqR/gRpSKqbiAQBmcXvl/bXAnijDwvKDYJT01JagxOGE6nEiMcSeTxPqPrLdP8zGwV5bGlvsJ6tWEeLwTKU5UVSisQIKUiTzVhsqVurnzvzYHjsWOaapIiZLff4p1nth1eeOIkomtbghDcpKi6CdNrojhFak0qA/q6Q5sUr0bCIEX2A0mekxYZs5+51lfiPEIm0HblwiGMAtbFCi0kU9sTWUGxTog2jqa31H3FOHUc7wd+/8df8HR8pKuvrLIcKRRPD0fOp4osXXJVm01OmmQYHTLNHbMfUNIglWG72rLLb+kGS5iAdIb6cqXpRg4vcl69fE1VlySZ/M6PHjDNijg19P0Fx0TTN2RhzqAFAyOrKMf3E1XdMkwTUagwLgQnOV+OdEPLPHncZOhaRzcMxEmIVIbTuaYbJxwzSjs8lixNydIUN1myMKFqGno7k5iIy7VhaGeKPGO3ylGA84tiOIw1CE15slRlhVGesR/BWQSSm/3NkrmcJnQYIqOQfug4PpzQclHsGi04nUuuTYcOAnbbjJvtjrGe8JMlNDFuHtmtb/j88x/jrOfb91/Tjj0zknGeUQGoIKBtG6Rg8c8HmiiNEcpyPD8zDTOvXrxBKUUUBZwvZ86nIyCou54oUNwctpTXC4+nim6UoAYGe+F8vRKagLsXB+Ik5VpWPB0fGYXFhIa66zldG+y8lAfzJMUYj1YQyxBajxKWcey5XkpiHRLLjObSIQBlFiXoPErAsMozAkCKmShUjO1I21VkSUhkMrQKlwcmo3HS0o0jIOlamPqMIt8SxpLyeuJ4OtF/lwFWUlPXNf3Q4/AMduRaV1zLC+AWXqoQ+NnjJ4+3gshE2GlimnqEByWX/6NrVVHXDVEQESjBOAxMw8zx9ETTljjv6IZlq163F+ZpIgo2RNEK7wOGbsRa6FvH08NyopIVwZLBNAsJYBx7htFze3vLi5c7TLhkIYdpibNIZVCBROiJeepJ4pjpuyGsvNZI47k2T2gZ462kuVQo5SnSBDFMREpgRcvgG3S8bICaoWe2BhOHyMDwfJq5tiGOG96+P3GsYPSOD+8fiCJFlAmiLGDwS2Sh6x0m9kyuoe1mVqs9CE8cZ4wTCBuiREEc50jRY3yGA4JMEEWGum2WbZ+QmEhy92JDGAYYrWkuHiEcN4cD65Uh0oanhyOXpxpmgVaa6bvsdpamtNOZLI9omgEpFXVfEiUJ3XTEhIahXx6qjE9Jk4jWatL1EhEp8h1ucNzuc17dbnn60GKimKHvkUohpSEvCtJ0xfm5pm09WsYkaYhCstsl3N3tCU3K5Xxht75js8/58PAtkc4owoLL+T0WiySh7yo+evOCpm7pB8uLm9c03Rmco+kaomgR0tTNFRPEGB3x9PDMYX8gzzKcG5itJc8TIrnBaEvT9uwPW0IVcXk+Mkye1Tbm8ekJowx902LnAR2G9HOHUDEqmIGOvhuYR02ebfHeIrSluo7kSfrdaw4pPc5N3N3cEQUBo3PcvLjDDhNGRMxiwNqRa1Vxbo9crx3ldeDp+Uh1magqhzYFiJyb2wNf/u7XrHYZdW35za9/h5L/V8EvzzKSvOThfcX3f/B96uZEWVZok7DaFLx9/zuCOCRUGdPQYSd49foOEPz07/2Yqj4zSSjWhiCKqZqeqjuiCLDOcq1LwiCmyNZExnB+urIutigV4JRht79BKsM89dy/+8D54cSqWFNdO4JYU7bv8UiEWVTKzoV4DEskfckD//v/5l/83R9U/7P/6j/52e2rlKeHBz48fgXqwuwHPjy85+npnmlUbFcRgYx5vn9ACkV5rNmsY+ZxpGpqirTg5YtX3N+/xzm4vXnB0IUUG0+y7gjTmKa70JYxq/WG3WtF389k+Uwzdtw/veXv//mfME6Of/qXXzMNy4paa0m2Lfjq51+RRSFxuiMQEXYAqy5YJ2ldTZQW5FmE8D1KKm5ubqjHC7uXt3z28o7g0GF0wNOzIk9XeN2h+wHnJuoBUJrJVZhI8fDQkWw0Tmg+PDyzipdi1Dq/YVANz+XXCHUg1J5r+YzWBWkWkiYh5aXi1cvXOD/z4eGetu2JfICdHcJYJtFx7XpAEkUa6cEJzdzXJKQwxlRdvaCI4gTfKcJQsN+/orl2PJ8fCbOMNI24tk8c24l1vME6gZ0rmATeKmQYIXRDphOmcWkR7g+3+LEHO+FcgBAp09CS5zvSLOHx2yNBnOPEyEc3X/D27Qn0BRPGdI3DqBilLUEQEAQpZdlglANgKGv2L3aocSaPY+7Pz2w2W+IgppsbkjDhNt9xHRtmOup2ZpIDJg6ZB0foJXgPyqOl4HI9sypSklDQ+yPepJzPAx8+fEPTHykvFf/H//YV+ztLV1sCE3F8fGSzLtisC4SCPF+axGmu0UYTp4YiL9AmZhgqsD3l6Z5+mpEanL+iXcbdR7vlyEZYusZSNTUmFMjQsjmsmaaB9tovG9ksQczwoTnjpWTjt2zjHCFaDkXG1MmFLDB76nPPy5cvuHbL0cxkW+LQY8VM7wdGZg53d0gT471GColUjlB9NyzZgW6aaEfIZEyYpMhgxgjD7XZP1zVYFG0vCKJgsZz4mSgxhGmKNilRFpIVWywDD8+P1N20bMPaheoQ6Yw0y9GRoGprzvWMEyCFw4iUxITI+crQNQxWEIc5cWg4nR/59v03jL7FxAqPBLkIMoZ5AKGQzmDniZmepl8McElquNl/xPmxxs4tq1WANI4XN7ekyYrnsiI3BU3XUtszSSKxfoRQYpKc/XbPq1e35NucwTkcgokZmSxH9+2wHMcnJkCpmH62eL3cxPquQ4Ywe0d9qdmkKXfrWxhHhq6h7x3dODL7gdE6+nnGuhHcRD/3tMOIljleBkyzAyQmSEgCg3I901hzerpwPg5gAlbbHTOWS9nQ9RYnLcIITJARBSn90DHZnsF3tH3NOIyEJibLM4JQYlRInqxZZQVGCJSEPC0Wram1aBnQNDX92JCnMevViiiIGduRaRwYhopp7hmGiSxdM40zaRIglKcfepTyID03N3u0EhgjWG9DNpsI60fO10dOxyVfv9mukVIsJrh0xtqZwBTsbw4EscPSYgKIgpipFwihlg1VNTGOM3G85J7X6w2roiCNDVY5RrtkUvebPW6eiHVI37SM40Bdd0SxQpqArodqGMBEWBOg9gfy/ZY0jLF2REsJSN4eH5BK4yeFRTG5jsfje6xbogxRbGiaEiMChnlEKkusA+qq4lrPhGmwwNGtXCQB+Y5+cJRtyenyzNgPfPr6Uw6vYi7VEUSMV46vv/0KbTRBaPBiBDfjZ4VUCXm+5rH6JW3jERRkucMPkkgfCCNJFCdEiWIWLd0oCFewTguEcJTlkTRR7Dcb8nTN0/EJHYRYP7FebfFMiGAEHKv0hrYekMbRtiUfffQRbVNSnnp+86t3/NEf/DH39x9QeuDd/QekTLi9XWGHnqbumJ1mVewIzEg3tnSdRCjLODQLMWYKWG+LZZD8zsBWFDl1dSUKC8LQ0HbXRdJjJN21QviAcZoIY42bLdJLLueS/V2O9Q4jCqIwYL9b2OlpcsApixUd3jpW+YHy0i7Xt4lo6hbhI7xSYAX1tUQ4aKoOO3eEkSSLtwTGcr6cmFuLcAnFNuDpWOFEhIgSpFeEYcT5fGKc7fI9MmmmSVG3JX2rONxmfPnle4IgRMuAIt3xx3/yBc/Hr/AuIgoKzucnukaz2W3RUUdZDqhA8/D0xO3NC1ZFzO1NvuiF/YzSmp//8mtuP0s5XUqerxdErBnsxPFUoUJP1UqyXFCsEoRcstTaRIx0HF4X1JOjOR5x1i7ovkggA0/fO4QIsVOPQ3A5tbg5RAqFUBPjMDL2M25S/KN/6/8Hg+o//l//m5+9enFDV0XEcUa+ivjy6y/55NOPieOP6NuZjz664/5dTdOVZEXCMIRM08DQasYuIAgCotgw2Z5p7ohWjvvj15jYQDJxbe7527/0eNETxZIkEWyy13z5mzND2/D9n7wmKlL+6p/+liS6IUpnZBAR7zLefn1kk6d0vUMquJ7fk6wysnXC+d3I4VVM1Zc8nSpOHzpe7nOQKbXvOY9nvv76DBiquuXNmxXWlVyPDYFKeXx7oa1qNkVCHK65Vj1CaU7PFcK3GBth5ogv3vx4QTZVj6xWG/b5HU+Pz8SJpis77l6saCuFCQL68YGvv3qLpKW7CurZLopBqWisoxpG7DCgbERfh6wzg1ERm92aKAuJ45g0X/Hh4UiQRhSrnKFvkWogyXLqtkVGikvTkcWel9sbprGjaztMZPBaEIQCIwNGK/j0Bz8gzTyPDyc+fPhAtlaEemlrx0m4WG88XPuSWEfsih1fvv8SL2eSTGDblCTK0DGYwNM1PWlcYAIFBvbr13hhSDNB2/fMk6K5loTGoIymrXoCpXDK03fLMWDd1myK7cLg1BAmBqUD+npGIVnlmsPhNfVQ43A8PfZcrxWrtSXREZ+++T4/+qNXpOsNdgx5enrAWkUQaJybGUdHuorYHG7YbLbLh5iY+3cXqsuVQDumuSOIwgXd1Vp26w1xYcgTA15StRVNc8Iaxexm+s7StwNymimrkutUEcQFzTjBZJkbS15EODxN2xNnCjtOGATnp4b9YUMQW6rmjFaLEjOOCpRKmOaB9XZNFK6RckIyU3c1x+uFtgM7WOxsiddrTKBZ3+RMtkeJHKMUcRYx2RkpYV1EdE2FRi6mnGZECs3N4Rajl3Ja2wyMvSeNI8ZhRklQckIbkMailGToQUtHkYXEUcQ8OYZOUlY9/dCCs3RtR3mu6acZIugGwdBMTEMPVpOYGNvBVFvauuJSdUhjkLPHtwIpZrqpIykKkixlHCrGpkO5FOkt2llW+QLp98FMHEYEVjHSE0aCoWkXbq6Ac3lBKocJA/q+ZxhG0iRgmwYEMmBd7AiFYho9s5eY0BIEIdfrjBAzaRou1IKxwwQerSwaiZ8DTBRgQoWvZ3KjENIRhGt26ZZ9krDbbhmGHg9EUUZdnenbGd8byqoErciLDGsFTdtj3XfKTB8idcRT/cixPXGdrhgVIGaJH+1yvTog+Y4XK+cI4Tx2ntDGoOORNE9wk+Z6qQmCgt3hFmkkwoNXEh0GKBFS1g2CCClCjDEUqzXeebraYueRINSEOuF8OdH1F07nC+W5xWGpmit9N4Fw5EVOdW356tvf0nZ2aeoXIVGe8nh65sPTlyg1MLQTl1NJnqcYFRGEkjyLly2btXRty+VSEwYpYaxp545+mOjGkcE7utlhTEJkMrwZ6QeLkgpnBwIdsl1ndG1JXV/w00BmAkYnsVis1bx9+hLnBcpJBBZhRoIwIU1TtFgUuVotXFiTGubeYQdHmoQEOmO/iwi8Yr5GFFmOGyLK04k4GQi1YOwNQ++puwvH85XD9pb6ciRUivUqRymPiQQmMmSHFT7uOF/OVG1DlmR4MZOvc5yT9G1FnkZgLee2ZrPfIt1Ma1u0DoiSgPJ6Yr1b46RkHEbSKOHD/RERKoJQUdUd86QJRU6moTyVVLXj7s2e4+UZiAjjjPV6z+Vcs1rlpLkmjDV5mHM+ncmyLVEo8EPIrgiIUk20SjDSc7u9QYsR52u806xWObtdwfnxyKVsWa0TplEQJoprdSFJI6y1XC4NbhYoI3DeESYF09Cx3a6IohAVLHE2YzwmaAmDiGvZsr/ZUXUtzoKfFMoo3DjjBkGcZ7TtBe0l/eQJtGSeFUG4BXPl7tUt4zwwzw4hFcfxyGwLmuZKrBXH5weK7R3Pp2f2acQwOdbbjGboWBW3eBKGqca5iG4809szv/rVI5t9zOYmQoiQ43mRI43zgJAzl/NI1wx8/sMbjuWRS3NEqZyxF1zPH1DOo5znxd0tQk4Ue8Uvf/MNabphUyi++vW3GGHo247dOqOvBkJSzNxSrFKk9QSJQShFIEOGqSVMDbv0gBcj06jQBrLE0FwmhBfESYqdNihG9GTIizWTL3l1s6e6ei7lQKjgH/3b/9Hf/UH1v/8f/7uf2dFjJ8vuVn3HMnV88vGnfP3VE1J0fPPVPe21ZbM6cLt/g3cT3sM4Oqwd+OR7qwWsq84cDlv2B8nt7Yq+9syy53xsUEh+7ycvSVeeOLzjWra8e/fAn/35H5JFOd/85luUz9juCz79/HtcL5ok7/jBZ59xPEZ8/qMX5PuUgZ67j1a8ffc1d68TdL3G1ZLN2oMMONys2O9GfvPXDTfbF1TdkSATnMqefGvpW0tfwfd/8AN2d3d8+slnFKuUa3Ph1Ud31E3FtSqJQkOkc8Zm4Oa24HT8wHq9ZuyguXb0bcNhc+BU1yRZQtk8ECUJz8eGNI+RJuTv/f0/4l/5l/85fvDZR3zvky3f//xzfvjR56QyZ53tObwCoTVxnnCpSupuKROleU4/DVyvJUMzM44DWRrQjTM6MHhm/AyhCTk+ndBGEMSGKA6XKMbkaKqO9WrN0FvKywi0pGnIYf0F1bVivYlQIqMfO4yJyIuQyQs8mq69kmcRUbgmjxPQHdNco1XC6fmCCWbAEpoD1fVMEAZ4pyjLM31Xk+UZSi+looAAhKDteva3dzwfL6RJTqAjmrLFC0UUZ/RDg05G8lXMenPDMEc8l08IZoSwy1YmzpgaTRqniKCiGyxSRRTxirtdzmq1YhbLMXwYrwmVwdkFzXQ8PSLxxPFSBBMEVNeRvnOMfYdSAVEcU19LZl8jA8XYe97c3aBciE4ljW2xYhFhpHqH74/Mo+NctqxWaw67PefjidkKxkGyKlJEOCOjHqlmlJzYb1YIlxCZkDwL8LNh7HrmXnB+LtmuDPPU4saAIstZRZokCtDeEEiNtR1u8FB7VivDZpvS9S1leSUvvtuuO0GcrPAYpF50kkEYUdYVTdsRRQFRrOnHChmM2HlGuGzBynQtx6cr1k7gLUoppnlcYgJaEWiNc9D3I0mWLRYtISgvDc35ivaghcM6h47NEjeYPHMviRLJi9e3rNYHdBgwImjbccEtTR1Gz8jBIvoQJSPSu5SJisv1w1K8cCGz9YRKsopueHn3hiwNuX/3DV50JFu4Vo8kMmGfveDyPKEJMIEkiAX5aoV1i+6wvrbMgyY0miINiXyAsopLe6aeGpLVmtVuh50G6nbCWY1kuQFc646ZlnlqCE3ENENdd6xWGWPf0DUdYxeQxEt+zDKg8cQmo+07yqFktDPCKRSW4/mRaRgJtUKOCtkHFOEag2C2/XcWKc1qtSJLt8zO4rwliGLWmxV/8AdfcPsiQqiBw4ucQBmKNCcMPU3XIoxBBX4xzumIKA65XI5cLiVBEBPHGcPo8TjmuQdhFjOPtMhgyTsPw4QyhsAsDe5Xr+/Y7ApG23E8dtRtR5xH9H2NVilReCDJdiRZRBJJhn5AyYhxnLC+o9jGS75Ra87XK8M4M4wDSkTcPz+SbBLqqcXKnrZtGMaO3eGWIMi5XDqapiI0GUrEJEnK8fm45OfFtIDbfYsROYXZMzY1fWNxo6Q69fgxYJ3dMLaCPDlQVjVGS5RQCBEwjWYRL0jNbCeiTOH8wPe+eM1kl/xrnBZsdzlCDbz/9pGu7dht99R1j1YJNzev6VuLncCNA2NrcdbTtT2gyOKE8+MzWoQQSrSUzKPmdDlyPh1xvUQ58H4RLHRdxzx75t5jUIztQNd1xHGAUSnT4CiKjLo80lxn4nCDCiT9VJPHBUoKjPLsN2sMkvPxkbZpGTvP0HXEeoefNafzB9K15VJ25Lnh/W9KTJgx2XqxFI4JYVAw2p6yqpgtC3tXKKyTODcyTRNtV5PEKcfjE9PUU6wj+qGhaVqyNEeKEK1CwlDStT37/S3D6KmvM2IOsJMnSRbhyrk6M3Qzh/0L6raj7Vq2qxtOTy1BnJMlId9+857NdktVHbHWc7h7zXa/5bdffosKe9I0QvqRPNoxThP92DAPDUPb07ctQ9fQlprXr17TDQ1957hcevaHHV3bogPDZpdQ1z12CtnsYobxwiq/ZbcKeLyvOV2PeCNop4YoUsSkfPHRZ/zJ7/+YH33xffruiaq9sru55fg0ID1cjxfqpiGLMm73L3DTleaiWOWKjz9eLeQAqegajzCSINQoF6FVzCovmNqWzT6hH2aqssPPirrsuNm/YJosSM9mn+NGg5NyWaRcZyBishY3DPzFvy0plZ0AACAASURBVPsf/90fVP/r//Y//Zk2IyYAbWrydcCf/vTP+We/+hVPD09cj4K6fULg2WxucG7i7bvf8vHHr5kGsfjF44WTmkZbduuPafon2q7l/n3P7YtoaZvNhijRxGFBURSEcUOxlvzDf/CvcXwcOV5+zY9++D32+w3vvnnit795S77yxNuRIkoRQcbTpaarn7F4TGHYbRx3dy84PkzEyRYRDbz+vuZ3vz7x0cd7toeUsR7Y7CKSOKY9Z8RCcFi9JAhTJjfTNS0ISZ6tuJQ1v/vtO9arLX3XkCVrdATv3t+TbzVtaymblt1djAlSTucjRZTw8sWKoWsxxpLHa5IoIFARaRpxejwyjFcu14G2rVhnM4eN4E9++kO6fiQIFCY0JElCXTXL1mCeeXj/HuaJKMpJ4oBhbDgeL0hlSLOIaZpJ4ozACKI4QIiE9++e+OTT12zWW8YeyrKibUtwChjY7TdcThfixBCFMVV1Yb1bUZUNQRTRM9EOLUkYcrd7weVSIXEEYUZ9tcx2ZLdbE5gCrVaEgeZyfaLICx7uzyAcabrAvruhRUjF+mZL2zVo4Zm6hkjrBcPSdmz32wVaPNXUVU1TWsYuQKplmOiGC0mUst284nrtWW8ntJ55fuoQWmBMRt+WfPTmDTKYWW8XhJN1Ax6DlZbj44nz6ZkkiXHWkSQZQmqc8xhtSLOENAtRWlFVJdO4cA/rZiQIEtpxQliNHQYCPKqXTLWim0aC1NM2Fi9n7l4FXM8tTQWDK5djxWvPw9MTl/PENFi8c4ydp6l75nGmaXqejk8Mo2OYW8JsXJ7M+4lsFaJUSF2d0YFGhgKhwVrNzf6G1Sqgm1u0hq69EoYBs7N000CSp9Rdw+PpCXBY6xDSka3kAnr3IeWlJowdURgi3YogUPTjmeNzxTgIsjQBu2RynZuQUuCxzN8pXIMoIssLhPT0Y/0diH4mSwvW24Ak9QQqJClyMJJkpTi8NEgBY+OYugEpB4QbmOaOcBXi5Mh2m/Dm9SuCSDPKFiUDPn/9Azb5lm7s8NJxu97xcn/HrGo+PP4WREAW75guM36UhHHBZrPiUOTUdcXoOlarAq0l0swEOsSPIWkScXO7Q0qFl2AFdF2PFBFGRXhnsX5ppns/IBgII41Xgtku0gqtQvqxZxxLhPcMDZwer2TFis1NgqMlz3KCMKabrjgx4l1AdZ1A2eX9a5e/kfKCPFqTBArcgCLCe41Dkuc7pnniVH6g2KzQQYKTHSqwtG1NWV7px5nVekOWJcShYrvLyBPNjz/9hE2ec3uzWrBLtgHpKTYrUCMIz+Fmy+xmZudBOOJcMbuRcZZEYc5msyYINMYY4sQwTpZpkmRpih0GsJKpmQllRBKkKBmSFylNWzJbFuRZVSOVAakYhpGmbXHKMcqRfhqX+4IJWa02zNMMDq71hX6c2ewOoAwfHt5htCCNM6IoQUqL0mCUZpxG5mkiC7coJ4lNRCAdbjAYHdB1F/I0IzYr4jDizUcHUB11W4OX5FlGEEm8tHR9C0KDaWjHCuuWh7b1ZsPk7Hds4oZpmtiuc5wbaZoLh8OeplveX2d77h++ITH5QkoJBNM0okTI2Ar6psH7ktubF1wfW8ZhYLNeY0eHNglJkuOkxw4Lr3fhOTtuNndoD01TIrUgCjR925GnCVEosTNkRcSxfMtoBc6DdxlBuMF6i9KWONeEqeLxdCTLV+T7FBU77m7u2GaS773e8NlnniIfWL8IaJuWfnSLOtks31dRHC0c2rnh5cuP8SwK0jxPCUPD09OJ25stWR5y/3BEieXEyYkBZ5eIwjAMnKuWME3pJstz9YBXM0ES8/U3X+OFQoYhCkeUGtBgJ4/0AS9e3vLpZy94eP8NSiuCwJOvUk7lGYRmfci5NldwAaGJcG7g/v0T6/WKYexpy4k83CNlS5EfiAJF1Txzfh6WXKyGfr7ivaCua7q+RusQN3u8aJjGBkmBDmc269eYwPLw4Yk0Nby5u6NIN4SBoW5KnO3QQiPmkF/+4i2n6zsG33P3+hU6bkjSgqf7E++/bfn0s5THxzPHZ9jfbumv8OI24VqdESKiyBP6saXsOq79M3GgCYIAjyeKFOtNTNf0GB1itGf2A9dypO07Xr1+xdBA3/WLhnUc+Q//jgyqwnv/f/viv/qvf+b/4A9/n3lIsNYRJpJfffmX6Kjn7ZdQXzx//NPXjF3K7355T5j25HnKMEocjmBVc7zv6csVf/BTh+1ink/fgJbE4Y71fuJ3v/2GIrvjD//oh7TXkTRJyLeOf/aLh6Xt1o3cv/X8gz//M37zi1/wP/0P/zP/xr/3ZxwvHe3kgZYvf/trvv/Zj5mcxDLiTMtf/dUDn366om8MhoDbvWGz3vFPfv41n3zyMT//y9/wZ3/6Od3c8PDQUeS3GGW5XM40rUCEJ66nmU/efIrWkrbvqOqJ+/sHNuuUNCp4PN+TZ8nyROJ70iJAmYCmvSBJUELhxIkiPzDNNdY7hI+pSseH90dWiaGxT0TxGiUThmYgUJ79LmAaDLPvmR0cDrc8Hc/UdQd2Zr1eEwaGsusXdpqCYdSkaUEQOaapx44DFsl2VywxjAFevdnwu99+RVUN3NyuiEPJPDpwAu89UehQMiA0G6JY4N1EPzhGK2nnHiEn+mvHi9uPuX94Sx7uiBND1TdcmzOvXr2ivnak8QKnNqGhLFvsBPtDweV8+q5h7xerj5Y8Pz9RZDFCSkITcTpdUUKRZRnd0DFT45zAkHE516y3ijCMKauRKI9ou4o0KZjGByKj8XMCcsYEMXEcIrC8+fgTHh+eqMoG5yVlVTN50LPE2ok0jomChKYZmMYRHXqEXDKMh/0N9++fUVqiVczxeKFqGg43K+IsZbtOeHh+QkXge83xsUWnDcYYhmtEmPdIqRgrg1aKcZ7ROkRLzzw0tM2EDmZMAGMvKDYrhFC8f3/GRI4wMcx2xiOpSsiymKQwtM1EEhmKLGLCcmourJOC9jQyTjNJCkUUI4UkX61oh5ayXuxDcZwCkEVbmvqMNiOzdUDEzeGWYR6Y7cjT45E4XH7X01PNPAnSPAGvyPOEfrwyDo4kiZltSz8MpMmKIFya6KdjxbnusXJmk8XsVwceTs+Mc8fcKfrEs73d8Wq9YTyfaS8lwgdcqo7dyzWrPCYwyxHe23f3fPzxHa9efERVX6jbijSOSLTAeoWPAuqmpghT1lnO15d3PJyOrHWBspZrV9JfLWJKMIki3Qbstnv8NC6qUCcJI808euZBkWQxKoi5ViWX+gFnFddTg/MQ5wYhHUIFyzAvRrruSt/PDKNEy4jQhCgD2ijGZsBPkKcrkkSz2mVcqitPT0/cbl+TpDnX7pG6uaDECo/EyYbZ9lTlSBjGxLHGEBDpGOEtYaSwrmOaYR4lSqvvtjuwKvY4qxiGmnGsiEOBDhVZviYOcp7vl7zd4a5gGlvqaiRbpVR1yW53AAK8AKUsdd3w4cMzSoZoqZjngSiMmCeLMQv8PNCaQIZgF5tXN/Y0nSVKIAkNdVUDDiVnwiRkngV136ECSaByhq5GKMHLl284ny90TU8QGlSgmNyInxxds5jEXty8QJuYydY8Pt1DGCKlxjmBkKAkCK9IopAsNzTdTFNVzO67AdbEHJ9/hx0l6+QG60e6YWSzy3FzQGBSYGa1WfNXf/NPCPMYhWYalqG3WG1AzYyDpapKhJnJ0xXVpSFOYp6PT7RNSxIXBDKka3uEmEmSlO3mAGq5N7btlTiC9abg22/eYYxBSbc83LSG2Q6YsMZOksDlzGomDSOkDPF6iXNEK40ba7w1WD8gw4BIZCRK0A0l4wzrLKcbB25v7ijPZ6ZeEKWaZn5mthnenanPmk8+/oJxrJg7RXkemPyZILQkyZb1PsSLnqlpkdYSxjUqH0nyDc9PR47PYEVI0/W8+fgLrB24Xs4MvSQrZrRYUV+hG+/x3rNeH6ivFUka4REEQUDVNgSBxOiQTXED3iJkT9lMWO8pq54f/eQNv/ibn5NHO5SA6lKjwowilTRTjZ0EL7cvGeceHSuev31PXfccbu+o2jPahJgoRusCpxbu6dj3NPXIbrvm3btn1sWKJAwQdrF5YUo0N6jA0jQNTWdxTFhnkOGAFJpr2ZOnIVJZArOoddd5QZavEdqSmA3H0z2fvPk+QWT5Z7/4DSYQFOkarQI2u4Q02/K3v/obvMjx+i0fvp14/fJAvg24PrcoK5Bq4PlRMIyaw0sNypJnO7p6whsLqqd8vFBXEyYU4L7rAKiE4/GJFy8PDMNIe/UMoyPPU3Quefi2Y/Idq3VCc1mkH2kOz49H3v31Rfx/PYT+v/n5f9yovn/7/mfWtpTXDygj+F/+8f/ONF/Y3FhW2Utev7mjaRq2uwMPDyeylSbNE+7vG+KNxIQjWs8UWcQnrz+nLqGpe168Snl83/PFF6/45M0XbA8Zb7/+hv0upW0U58s3/OQP/4TnxzOX+oHPPvuU9+8eMFry0z/959m9jKnGkg/vjvSPjn/xX/iXaNuQ49fvKJtHqsERk5OtQp6PX/Ojz3b83sc/5uGbC0oZ1sUKA6xfhey3B/qup+mfECbk6VoycaG6LkdCWmma5sj58oHL9USShngvqMqaLF2hxMzz4zPez6Rxip09wo1kUY4xkvU65XwsETJgf6sWTp3OiaOIj38UMY852oS0/ZWbN7ffFcA2nI8dgxuQ2tANC+/SIgnSmDAKSVcF7diiQ40JNXFcoLQiSQxBEDLOI1oVrNYxdXMlzVMeHj9QlT23ty/J84Dy3NIPFT/64U94fjzxfDwzW7uA1WdNpBX1ULFa75haT3m6cLjdMzEze8GLwyuE7lHK8XB/Wrh2gQVG0sgwO09Td6hgCWgLlzDPA93YI03E+XxmmieabmAcl2scuxmlDQjJME84r2magSh1rIsUvEL4AGMCLpcSWI6hpc9wdimidcNMGIVcu5muH7j/5sg8WeIiX4LyzpLIhCCKcM4ShQHjNKKEJopipAKE5Xa3o21mqkuNtx4TWYyBdZGxXm9xXnD/+C0kAeXgmKWmnWrCNEDLBG8nAl0wDpI8i2iajsenimlweGfZJnvizOP1TN0PBHGM955prgkCyTxK7NjT1xNiXHOz25IlirGZ6OuJuetRfqYsTwztSKYzhnZgnke0c4Q6R4qAx6cnqqZBa4MSGjt4jIzwbiYING0zcTkOrPIN49jS9xXXS4OfPavCYMfF877aRCSZQSjJ9dpgfYfWmjTO0UYhjUKGAeM8c3wq8WpCpYpiXVCYnO440Q4zwVqz2a0o0pw0DOjqluupoby2jNazus15+fEL3P9J3Zv8ypbkeV4fs2N25uPT9XvvmyIiIyOnyqyxqwsJmgUS/wdigRAlekMjIZa5ZlsS6iUSEguEEAv4C1ggxNB0q1pZFRkRGS/ixXvvDj6d+djIwkMsWVfvr0vXXe52zH72/X4+LqHJKuIYCaOnyXOKskLonqw0aH11gKtsy2wcTS25aXb03cLoFpq8Is0q0johU5Yizyh3FapMkJnA2oEwO4q8JiaSfpiRXAUQngjSs9iBpesRQZA1Ffkmo3MXgoRM58zzgBlnBDlVtSbNEpSSpHlCkoGxnugFZSFoNgk6S3g8nWiHM17ApW0R3qJEjgkO1UTyOsEbhwTK1ZWBa51FJIJEZwQJNhpmE1hmR1oEhBoJUZLqFdZClIZ2fGIyPSEKrFP0y8zhdGGxM5aBbliIpORlQ9sunM4tw7gwzYZltASfsswW70dyXdG3lkRoVJL/uEkVeAtVUTENC+fzVVN7uVyYppEgPaSKmCyoNOCJzM5DqjFx4jI/I7Ukek9ZFRg7QbRkWqJ1ilkstutJlaKqc4b5wmwtRVkTYyCKgFYGs3TU9QYl6ytTdVWTpddyzjgPWC+vE9juyP3dPZnOyZS+FluylLSKWCa8F7TdxLkfQAUm/8ziHKvVlvV2Q7Vx9NPC6XQhJiNRQF3dEPxCogLzNNKfe/bbO2QQ1EWFUB6pHKtVDUnA+B6tJcHPCGn44fE97XmhKUqis8yjp+3O1KuMfrA4H0grQZQ5dpyZxzNFtiaXimm6IJUieov1C0KAWa45XTMHrIvkag3R42xg7KerVKRbSJKrJery2GMnfaUADEcOT480dcP9izWLm6/P03NHGksOp3dMzvDUt8zTnu6w4cNbwzgq6nWGyiOnU4fWOWaeSLVms81pu4F5jKjM4n1EJdchgpQJw3Sirppr1EMnWAPeJoBCyhRzDqgkYZ47qkrw9PBAf7EkKLSqMa6n2dxQVnvc7FEYWtcxW8dnu5+QFDXjbHj58hVKV1hz1bTXlWLqDVmWgYB5GSjr6jq4+FEwc+6eOZ5mLv2ZLCu5nAIqXWiHM93FUVaBEFOKPKfIKoo8pe2fqKotWje4MDIcJiZzBb8vQeBC4NuvPvKbX/4EN4708xHvBE/PZx6fn2iaHS5amvxzXv8kIIPn8nxGR83xceSLL17x6lPN89PVvGhs5Ku/f0AkCXWTcn7uuVwu1KuCoTN0w8AwQlpm156KL3h+OlOvclwQjO0AKMpSMQ8XEpVxs91ye7NmHi3/9D/6N6BM9Tf/9W9/+/Uf/iUhXE+qVdVgppRxupAVF/73//WE8T2Imd/8ya9YhoWyytndZ0xm5s19Svs8sa9/wnhZ2NX3vHmjmaeON29e4KzEhhOX08jL/c/Z1jf87f/zO7LKEZIRYsCNArwiBqhvGs7mQDtf+PLLrzAPKbc3LwjyxL/4P/6WX//ZP8a7lEyu+OWv1/TDM/erG8pkx4cPA+t9gvYZmR7Yv1AEKt69/R4RBrxTPyoIF8bzQJlsQQq+/eYdu10DJPS9Yb+7IwYY5+GqP80i5Wqgrm94PLR8+umeaXRXl/YcudlWXA4jd7s9MgzEpSQRhnWTsLgB228ww8BPPnvB5dwTtUCkgnY44qZAXa3ouoGmXiOlJNUpMUYeHh5IUkVWVAQMXXf8/3imzkROlzO3uz2XyxmlMxY/MczPfPLJC7pu4nzqWMzCalVwPp1YrWu2mz1aNyxmwgbPMnTYIDm3PXYeSBJNVJrLeGIeLZudZr3eElxG1w+sVpqqWnE5LSzTzGIcp9MFhOHu5jVaVTwdHsnLhqJZ0c09SSKpipKmqMAH1psNwzxwmS7MfsFGqJsGpOFw6CnzPQ+Hj3jRXl3LpIgIMhGsmoyuG5BxjUwil35iHi15UaDSFGsciZCsyvoKRl9mXLBYM5EXCu8tXTsgZYoPIILEx8DdXYN1Bp0lVNWKhIT3P5x5OpwpK410Od3zQrIsJB4ePvQcnjo0krwQvHz1gr41XM6X68RHQJ1r/uiPP8MnhsOlJVEb3JKSq4wyK3l417EsEq01293q+p2bWvJSIaVjWRZe7/c0q5Jp6ClEzTjBaAbWq4QiKymLksUahrG/ZvkWgyS5TsOEwgfD+TxglsBmVVMVCcMwk+oKnSq0Thn7SFVUKB2ZpoVlFjw9HhkHT12XBO8Z+oV2HLAiXCMz44QzkTRVZLVCpQbsVSeYrTU+mbgcW/wEuSoIXrDd7ri7+wxVpBQrRdd3BHugKGdGe0Y1Dp9eSHJNtS45Xi60nWNxkaos0enCOJ/onwYeHj4yLx1prnCTZT7NkJZYHRG5I29q8qxGxuvnMPaOOVjKsmQ4zXgLWVHTTxMq0XgnWYyhahryvGGeFsxs8D4wm4lEpNTF9hofkB6tM5YlYKzH+0imBbAQokBQc+kXfDRIKciynKLKQUaEEggpOJ8PWGso0gq3LMzzTLNaoTPJMF7wYcBMM8sUyYqMGCTzuBCiQSmJ0gIXZ5K0YLECETNAMi09xvY4P11FBqIgOo+dLRJFjI6yKIkhUpUVdbVBJZok8cSQ0VRb7u7XpGnAO4udDUPnyLOczU3OZldSbzRFnZFVApUqHBNVmSFJsQYQCSpNSbQEAuM0UOcleHEVKaBwS6CocwbToVLFZrfmw9N3WAFFVTP2I+1pYn97h05yjs8XtJZIGRjnDu8F1gaWJWKsw7iRqkxRomCeA0kSWcxEIMELy7k742ykrBukuv79qT/gcOTZDcGnJELw4f2By2Vis8sws6DObikyRddeUBJisNR1xYvbW4LzWGNpdiU3Nyv6fkTrlGkeiB60rAguMgyOLJGUWUYqGmTQNE1OFLCq95RlQiQlaxKauriurXbgi59/wtNjBwjSNBCCQMqMPE/wJlDnO5xfGPsW7yLbzd3VlrZc6LqReb4e8C8ncMEwTD1KJWi9pu1bknLk5uWO29s3jMvCqV9YsCRZiVkESkbMEJjGgJTXLoG1gYAnOsP+ZkNdaZ6fDjw+PpMkOS9e7pgmC1Fijb3m/3NN215FBdM0o5S+TuXHke3mltmfuPRPpIXi4eORXN9Qlls8E173VFrhUTgfqHNB153oBkuR1QztGZHlpIVis10zLzNEibcGlVjKrAZfkmlFO1y4e3GPnT3LcsZb8CikaNje1Hz39gNDvyCER+uaZZlwfsEYeRVgyJS+m/DGUNVrjPFYPxOsIsiZ3W7PMnouT+1VJYyDJGLiTKobtquc/WYPsac7D2ybT3n1+p7oZoZxYraW2zc3/P3bfwlUmHDk9m5Pk6/ZrEpubrcYF0iT5Pp5VSlmkbT9gEg0WZkgkggxI0aHUJ6x9yRopLqqsGMASElVTlWWDJPlr//D//Qf/kb1f/yf/6vf6swxdprAwL/37/+Gp6cj7XnCB4edPW8+T6hXOe/e/T1VrkhTS3nzyOYmQ/iSf/ef/BNC7Hn9sub1pwV9l9JsKu7vP+NwOpBkZ/bbL7jdviZxCfv9LQHNeTiT64JXL35NPx5489knfP31iftXG7795h2//qNf8+bFHbuy5DR9yyc/+SkpKeubFJ+1fPm3v+Mf/clf4EZNjDVJLghREDDc3X9KXt3yw9s/YKcF76DIG0RUlFnJ8zvFfqs5HE+U6Q2pSogxQcbiCuueLFJG8qpGpYHPf/pzvv3he9Is43g6M/Rn+n5iu9+y2pYsiyCKgbpZ431OUQmSVLLK7nn7/ntefppTVZLnwxmpAs/PR3Ca290LiJLtZsfxcKC7tOxvtnRdRyITdvdrHj8emKeB9aohCZL2NDMvkarJ2a5qEplinWRxjmnpQEa88+RpyW6/Yr3dYRZH33es1jW7m3t+eP/AZFuWBc6XnpAk6FqQljnn84jgqsOczMTldN20fHz/TCRQVSuMkex2e2ZzveISZDT1lhgXqrrGB4VxE3YaSFVClmecLh1SawKBXCf4ZWSaExIVUSpi3EQia2KMyMQRE8V2vWWzXrNdrRiH8ccSVI/z5qovRbAYw7QMyERSpClKRMximd2CSjV1WbNerXDW/Jg90/R9j9ISpRJmOzDOHUpqjBecTwOPHw7040yZBbaNojtPSCxpNEQLd7c31KqkLCTVWrE4zzieGDtDIio2m4SbZsu/9e/8hn/1r77i8NyzbbbcrHYUhWdZBkg05bqhbDSrVYWQkshVExgRKGnQSjJMC31nyfMSUQRmHMZJqlyTKk2MMEwLXb+Q5xVaJdzcbNhscvo+EGIkyw2ruuJ0PONcoKxzZmNYrKOuK6yzPLw/MXaRECQxSF6/2uGs4PlwtfQkOsOLyOxGogjkeUIiroB7NydEERntSDcsbNc76rzC6wW1yhAxYTicSPyISluKlSYvK4okYxpmpmhIm5K8vuoc59GRRI1OCrbbAiWPnA9PeFdQqJyiViA048nigqG4aciylHFoISrW5SsuF8f5PFDnGSKxOBGoqoZK59zu17gQ+OHDE0prSCTDONAfzrg5UKY5wXnQCoHCzJYigyLNmUbH8XRkWRa8D+hUI8P1ISZlQhCBaekww4wxAWTA4ejmE13XMbb+erjKU5RWOBcRUjObhUCAqKnzkoTlCvSPEOKAwKPl9loq9CPjZIhRsSwTiRRM0wCx4Hb7GbvmDmssQTpa27Ha7sjKlERF0lQTY0CgkMozu57np54ir3jz6S1d/8zYTVRlTqI8WZZRNyVCedKy4Ol0wEfLZM9c2o4QwE6GVGqauiDNItM4YMeAiBqQ8KOoZbGO7jKT6YLLeOaxe+bF6y+uh2/n8F5cebXqur51Q8vT04VEF6jUkxaRKCzL7Fjscp3eCY11EjsuRG8QKiCF4HycCCIjUZGYgLEOiSLTWxJd03Y9XT9eozdLZJpPgOXliz3LciJaTZJEpqHFTIbNeofWimHsWcxEP0zs7+4w3jBMI8sU+PjxAySWeV4YOkOapojoWBZDiBkiSckqic4Fdok01R5vDUntmM3EMiU064yyzvjdl99TFslVz2wsbo4s1iOlYukXgvOsNzXT1CJFgvee/X7HZE5Y35OnNcfHFi0USsB+84LNuqYsFEpb0szy/oczLA261OgqY14sp+eO2/0LZnckLQuWMeNw/sD+bkNZpUi5UNeK05PhD3838tlnt9T1ltu7FZfLwNAbbm+v5qM0iwxjgpQC41uKIsMusF6vuXux4/HhA0OY+Ob7P1DWGd0wY+2Vj5qkmkRppJckydWAaMLIMBtyvWJdlqhGIISgrFK+++4d1i2cn1vO7Ue8m0nTCu8cY9cTg0Sp4mrpmkaIkrSGsT8y91BkOVolbG9KrLny0PN0i5IaKQXOWcos5+nhQvCRNJdcLi1ZXWPctZQ6nGaSKNnf5rS9ZXW/YWpbLueBx+cnZuNJ0oIQILqeV7evefv9I56CGUvPI90caKczzoOQZw6XA95rOtOiisjT+wN4ripdKxA65fZuQzsc8CFhmjxSRqyxxKAQUSLzhL7r6NqeZndLXhQ8PjyRZCl//R/89T/8jeo//+d/89u//Md/yaZZIZMUQk3fdXzxizeM55IvflnT1DusSfnkzYY//4vP2ax3nI6WxUqkuOP5ceD+RXO1wLSP1OsNeXnPuEi8v1BVFeOl5Pn9mU8/LRCh4vlyluEUyAAAIABJREFUotwE7m9/Qbs88faHiWpVUuqSp+8/8PlnL3FzRtZAnr3CGwjGc2q/ZzKGP3z/QH1TsGHLZvsTZntBq5Y6L7hcIrefan7/d295PnzH/uWWqBSXXmB9JEbN0HfM1rLf3aFFjpALu12NSjXD1DOMC4sZGU4LD+8Gnj/OtJeWqtT054FtueOT28+4vbtOd/vukT/6xSc8vLvw8uWeT1/+jFWxwZhAVDViPfPV70/0F8HQH0lcQykiYxAInfB0eMbYmdv7W5ACREQoyYeHb0lkzmeffo4ZFySKhILNZofQhsNjy9PjgazMUGnFhx9aLmfD65e3WH8hxAStVsQYqasd1iT4MDNMBikavM34/IsXHPsjnZ1wwhGMJxiHt5HJGJQOLPNMWdTsdivGcWZertdaT08Xslzy+ad/wulwoR3ekec1gZQgDURJriuwCXhJEhPsZImAznOkVxRZQqozvDUUWXUtB+UCYwRKwtj1dJcLn//kU6QsSNP0mvkUOVLlJAjWRU1CwrntESplmR1mXNjuNxjreXo6E0JkVTekqUYmgpt9Q1YKLsPM1CU0zYp2mHHesN6sqbY5q3VJIBJFROWRefJUzQ6hLeeLY9WUTIsl0TP92TH1Gbd31/zg3f4GguXw/MzYWfCWRMzMi8EKQX27ZbWSrKoCTEGd1eRpTlPWuCmyKgsWY8EnrNcbZA5FlaPqnMUbKlWydBYlS5zTQHa1im03GNMhEksQgtX2Ct5eJo+zkUQpFj+hc0VZ57gwYJeZ25t7mrqmWSmEaPE2MEwzUUwgLLPxCJ0zzY5EFGyaPc2mwtuFOEUIkrKs2K4qtA7oIkeLnHmcOHcDaVGh60BIwC+KlS5Zly9I04rtuiAMmsxvuCnvuFvvUUykac+mlCznGdwWhKYdDoyjBS1wSgCSYAJLb/BhQEp/bamrQFVVLJPF2A6ZB7Jco4Knb1uOpyd8mFAykIVIGgU608jMQjrho2CZEqJULMvIpt5S6Jqn5yMqS1hv5XW6ZUuEz0iziFAjyzJhjacpKqr1CicNQ3sAL1BpgYtcr6/L6+HJ4vBCEGTAx4D3BrdMuBFiqIhKkSpJlhbc3txxPHQ8PT8QlWGaHTEIzocT7blDBIedLG4ZUYlDBsmqqHDziBkXLscRZ64osmW6TmO64cxmteNnP/ucREmWMRK9Yh5HQnTsbvaIRODESD+fCUJhvePp+cJiEsomY71ZoXTK4XRmcZZLd6FuUl5/csfl1FKpnKYuicqSZeKaSw6GkAjymNAeH4gWMl0gwvWWYQ4j7w8PjNMjSRqom5xl5opX2qxY7IBdrpi09aohOk+0GTFkrJo1daNZ/FXVmSaapq45np7I05SyynB0zEskWEWURy7nM3kmuZpnE2KYmbtrLGcaJtr2zDiNLCZgrKRsSmbTMQ6OYeiRMqVZN6jUsUxX3nJTl1RNhrHy+vvdpVzGha6fyfKEVGu8BJ9HFmOY54kkpNhxZFlaGDW7/Ya58wgRqFYNUxfZNg3D8MzUL4xTQMpAxJDpNS/uX9ENj8yj5+ljj4sSladkZcbT5ffUm5SPz0cu00CUBQf9FcsiwUQ2dcHt3ZrufOHTVz+lTAqKTaRvLc26ADmQqZIy23J8euZuf0OapywmonPL5XIta3rfcn/3GXcvKv7w3Vt2N2uyLGEcJ+5uX7GYkefnA9ZorBjYrG8ZuoUy2ZLEiJlaBCVarlBkKDTeBmYXeDidebO/48X+hofuzOnwjEqgby3TNKJlze3tlRVc5mtS5XFLJM0U5/4949QxdwPeK6zq2ZQZ2/Ut212Cs44sF3Tdws3Np4zzAWMsZvLYZeT2dsc4CJbFIrSBKK7INJ3R9i3vPpx49folUR6JccPbt18yLBmL85RlxrS8ZxkV8wJF4/n+4zuarGCcRg7tGesTfv6bL2jPA03e8Hr7C/7yL/+KH979DkRCcAWrekvdNHw8XPA+QUpHOx6JMeX5wZOpNYkQBB9I0wxkJCrL0PUolSK1xljDOHR085n//D/+h1Gm+v/dqP5v/+J/+G2UA19++Z7j08x2c8PhdOZyeULplNPB8/nPPqesFF98+qf4saE99bSt5/tvA3/45jsQA95aukvk228/crt/xd//7v/m8Pw10m9YVV/w4eEdf/Rnn/DVN9fW6vvHr3n3wzuyXDIMI25M2a3vOZ9OjHPHdvcJzu/4+ee/YPEz333zBy79B0Kypb7bgND84tVvmC3gA0s7cnqylKuMf/27Z75/f+Dcn1mvChKl+fje049HtFpR5hUiaTGzoT2fURmkK0W13nEZRo7tB/JSEqMmesfdpxvyEnS6ot6t+OTFlk2xwqUL09lSZAUiKr7/7oG8zrl/+YJpXvjdl1+Trq8qv+cPz7hJc7tvKFRNEjLyMuX+foWdFuxi+MUvfgb4q5kjeKJ35M2W7WbN5XIgWE1ZVRR1xNmF7795j0pTpNWs1xmn4xFzHPj1z16SpgJsSpKlHJ9nwGMXSdOUfPX7P1xPxSuHjBXeJWjdwazZ1QXRXIH5QUS8t8yLwMcKFyzO9vSnljefvCIrIseuJ0tWuGlhnAfyZouqcywD89BShAKVZyxMZFqyzit2mz1ZmWPjgsoDabnCRs+qrih1gXVXzmGTKQIJUaXoIqM9L5SFpcgW8DW9u6AyzTCfaZoNQWhad8HZgSotKLcr0lRBtFS1whmPSlJELKib8upRNxN2cmSZxVlPCJEsT3HO4kyP8KBEgfIFdpp59fKOVbWBkLDdKLywRDdj/YRM4MXLe2TRw3Tmj3/5Ez48nTlejpS1pGwKFg+Tdag0w1lHkJ4sCMSimcwRdyU7koSJ9W6HTK9ZPZ1JpFBkqkbraxZJBEmzr6FYWOaWpq7Y3mhU4nChxOIxjCzxiIySm+qOLK/JypoYLEInLCbndnNLkgbmxeKXkSAM85Sw291i3UxV12zublG5QgdDjuPubk25rvFLi4+OWVoU8Pntp9eCm6xosg0hgHcGEWdUKonqylR0y4wZFjKVEJOFU+uwRuDVmZuXEm8E7344QC6IYsUyS4JYmH3H++cOL3OkhMv5wjDPV1xRmrBr1vgJhkv48QosXK1yJqC1YpkN02iv7yXXYAPd8YILHoRmmQYmM2C8xnlNf7ryWdOiYFfcoBCcp2d045mXmcvZEYNBVzMex0bv2RZbjBP4oFhsT7/0KKGp8oYk0SzLQJ5rsrykH0eGqSeJKcpnqKB+VP6qq6o2GtyyYF0gEwW2dwQX0HUKOiKkxJiRobOkesXNi4YsCQQnWSKc2gGBxC4Dl2nEiB8NZp1nu77ldr/Hu5kqk8zzha+//IF+MKgMkgSaZkWelXz7+C3dcmHoO1yYCVJQNRt22xVLP7MMM8N4YjDPDPNEnVd8tt+yVgnnU0DoDBvN9aCd1wzGcZzPNNstbnF4O+MMyBSCloQkpe0mjLXkdUqZFhA0xgERusOBuV9QukTJq6mtrCuc7/HOUm40UinsZK+Q9DTHRE8/dmhdMg4LTw/vMWbC+oFMCmY748ccb5JraSskdOPCerdCZ440jWybDd4L8jLjcr7GCQ7dgbK8UhKkUCzjRJZt2d1VmDjz4fGRZr3m/v6OpR/ozi15liJSwfPwhFUzpk3RekW+gsOpRQlIRUWQCTKbccKiC2iPLevVljQ310iSqFmt1lhvCRGQlsU/o5Oa49OCThXdeJ1kzrajblbEUHA4tmz3JU2jmZ8XXt5uCV5hFsNms0GlkSR3nPoFIS1FXVCvSxYzMfQdwVzxXatNyuHykQCM88SqWbFal3TDkXmeSOWOqsqQYmLsJqKpWFdbHj58z9C1iCjwzNeSZrWjO3fsd2vGfr5KYKTF9h3WGWIyM48SwUI7njl1PW5WbO4b7NuJZr2jcz23+xUJnow1Z3tCJyVFpXl8fGBb16TpTCTDmZSb1YYkC3jrWMZAWHJWTUGQA6vqnug9y/REXTdonTL0jv3+hsUMLAZm62FJuVwskx3IyhQvLaejINOSqRsxS8L9m1vubz4Fn1CtCubBc9Pc4eL1dfMEOhVkYs2urhmee25WBf0Zmt2ep3PHMs0UacrYefJsTZELvI9clo4QCrx1pMWAD44QNOumoNA1nelpypRTdyRRDYVQdMuBfNMQB8F/9p/8s3/4G9X/6X/5m99qec+5/cBPf/6S09nw7u2J/c0L/vjP7/n93z0ACc7OPDx+wzKfOZw6jqcDbz/+a/bbPS9ebYgCgtckKtB2J5RWfPbTP+L4NPHV11+TpilaZTw9PPP27ddMoyFJVqzWBc+PM/W6wSwzRZXw/ruZh8ePJKklzJb28USMir/4zV/y5TdHDlGx2rxmkgX25Pnqm79nNheysiQowVdv3/HD01u6+cL9botZNI9PJwQFxg4IOYArcHbm/r5mHD1FmTAMgbYdWW1yvFVsVjtE7Pn085cUuaRucvrhCT/3uHmhXqfoco0JnhefvCQmAp9EHg9PHM4Xng4HPp56LuOAzgqKckXXPdL3C0kKIgnsN/e07YFmXdH3M9NocN5QNQWLWZBRcHoekDGSKIe1lvbi0Lpgs0+JMierBE4ETu3C65d7NvsVl+GaJVLK0x4s250CIn//d99wd/+ScYocjgu3LwtcmBAiReqFy/PIL3/5BQSJdUe0zHl+OpMoiN4j0RRlARLO5zPTYLnd75DKUa4kLsw8Pj0x9A4ZSrLUMtkJ5xT7zWsyLbG0nIYT/ehxYUGJSKE1MUSEVPTtyDTMyESz3W14fHpAaEVZKcI8UuY1H0+PpGVFwDHbiE4KlHC07TMiKDarPdt1wfun9wzzgLUG5yNjZ68LphhZ5oXDs2V/s8N2KVUuybSi7wZkGsjLNYnKKKsdMp2ZlpHDqcPhcU5RNAU6rpj9ickrzj2IzDO0PVWpGOeWtz98wPpIWVUsZkJIKLICpTTezWRS09QbnLRMc090iixLqeqScl1ineX+xRrjBV/94Ym0VMQs8Hw6UaYJ66xhWRznfkSmBl1dN2LoQGDAesc8Kkq9Yb2urwpYMzIuA5duYGoHSpUQfST4q4cdqXjzyRdE5ZFCUmcFOtGIkGJHz3pboStJN/TUqsJNnrEzTG0guJnNTlKWcDm2PJ6f6JaBRKaUVUGwjjBYfvrqc5AZ7z58xal9ZjIDZRlIEk3XnZGip2wc8zTjrCcte+b5wukDKF+ikomxn8h1hU4SYtQEImbRpHLLm1f3bOqMIBzn00R3GVFlJARPllSkWjMMPd5l1KvXlGWFCAaZRop1zSq/RZmEGCw6S8iTSJ6mdLOhnQw4B8Zzs7lBlxoRHbfFGqkVvW0p0wzEFfe2rlaUaQ7iOtHVqiBJ1I+UkAmBvFJFvMSLGaUt7kfAfVXVOBfIs5RUa7JMcHd3i3UeiCihmMerIW6316hE0B4X8iJj8ZYQEupVSfSeh48ncrniz3/9F/zVX/3bfPL6M3brHXf7F3jv+fDhGSkiVS3IckkMgcWPzObCbBxDP1Fna8qsYOxHxtbgzUgUkfXNK+ZoaJcWXSZkGs4PE9/83QU0zL7jcr7ya8/9SHAzi7EE65HGktcFRbEiEujHidP5gvaSV82W+/WeYRqxIqLSkkw2SJ9TFzVCGIIwiESQqRqVgM5gnA3HQ4f1HSYuPD929JeOvCoJOqU3C8NouL99BTLQ9Wfq6jWbzYZ2fEJ4wSevP2O/u8EsBqVKsrTmdDrQdiMuaJbJ4azh/sUrrJ0QQVCkBU1TslnvOZ6P2CUyDY5ELQSuCs1UZeg0JYRr/IJZsQxHJIHLcWZVVtQZVIWkanLaviW4jLracT52PD89UJUNyxRZ3JFT1yGkYHtXMU4LQklCzLl7VdMNF3SScfepo6pzYkj58OGJus5BLpzPHpmuMGEhyWdEEPTnnjRJKdKMy/mJPKtQ2rOYge1qh50N+9s1Mgk8PR0pyorgBbvdhr6bCT5BKYWZI2aW5GnGPHqGwZAXitWq4XweGEfDJ5+8gWDQSiMDzMNIlWt2uy2pzsizlGaV0p5P2NmSyBzrIa8FSiiim7l0R9JYkZblj/i9SD+cSEXFOE8gAtZ7VvWeVJdkWYZKFPf3O3Q647xA64rN9jUx8Twf35HSkHiN849U9Y6udexuNYenw3UtKxWHx47ddsWrN3fc3NzhvEcmjvPpRKlXZNohY01RJNzd7fn+6+/YrWrqes0yOIb+TL0pmSd7VfwmJR8/PvPx3YHVqiBRiu4y8v3brwmTR3hJVefUzYbnxwvz3JLVGtNPmHlCiIy6ajDGEyNEsYCcaS89xAXnFTEESp1hPOSFYukd/+yv/w0A/v93//3f/Pbh4YFf/fpnfPdth84LisrhHByeTnzxxRf8X//n39KsUhCWr37/yHqzZfDPqELwxed7Hr57y5ube6bRUu0qzv11USsQfPv+HUI5ZjNzeP5ApGexA3/6J39BVTb0AzyfTiQqcjxdGLvAX/6jPyUiMHbm6ekHrAiEeeHdw3t+eD7y8f23HPsjD2+/vvqwY848z+z3DUN/wvSBm1rzizefcOlmgi/x8RqKdqHHmhnvEvJMM/QjWV4TsHz/3UeytCLGa4Mzxgk3g50j+9sXXC4D4zDx809+Sam3ZEXBaeg4no/088RkZn7/9VeM44Tzjp9+/jnffP+AKieOp46qTNmsM+YxsNuuyHXO4enEtPTkhaaqG0IQrLcb+qEjRk9TNpR5zuGppyxLIKC0IitSusGQ/vhDVlqT6xrvBr774T2BFKUhuMDSacpSscyCPF2TVZpuHBHa0LYH0iIwzgNTH9jf7Lkczmw2KedTj5KWJO5ZNQWLNdzs9my2Jd989R6VJqybijRV1E1N342kaUpTlqQqIcTA7X3FvASa6gYVPdPSM1hHkAohA1JKpAjXqZG9+uB36w1SJKA0OkkpspJ+mvBMFFHx+P4Zlw1YIVjOE+vVBr9YikRTFjlpUSB1ipCSsHiiUzx+OGDHBJUEmgayQqNTz6osCUukyBO8jwzLBaVSBIJNcwNyJk9LpnHEmmv7PdGOvr9GBLr2+aop7CaEh01WI6ctbTdzGSdUppGp/JE3aEiEQCAgRES0VLkGKTiOZ+pSs65K5rAwmoE8E/jgGWdDQLPa3RESy8fnd4hEEL1jObUc2xbKwOIN50vHZrtF5ynn0wXvFcEKvL1OV5xxdMORIANSZry6vaepNafLESkTdJ6yubmhLgsWNxClZVpanB/QRWC1y9jsN1TbGyAlDvD8/sKyOPZ3a4oqYxlLyvSOcThj3YRrBbVs2K0Lci3JZcWr/SvKUnI4tui8ZrO+wRqDmQeGi+VysPStoUnXaJnx2D0zBsf+fkOVKmzvKVTNq/0dOM88z2RZjVAZw2J5PB1ol2dG07Lbrfj5L3+CIzIOM3WxRomcZfDURc52V+BTmLUlLTXeZFTNhqK5GmCqbUpaZJjWslyuEwu0ZLW5JS9zilRzV9/gneXxdKEfBqbpgPeOm+0NCYF5mqiqNXVZo6UAHEJKpChI5Yoqq6jWAZEa0qRAWEEMghAERZ4hEDhn8NEiBHgTMLP/se3tadY5CQq3OOomwwH9sGDDgtQC7w27mx2//ukbuvOZP7x9x1dffsn7d+85n46cu2eC8Nf/C8eyOIyJXMaWRXbEJFwPT4Vm6GeKrESIHp1EdquXtMOFy/gBYw3TOSJMQrSS3e4FQ+iIiaBZbTDGQJLgFkdeVCQpGO+IIZLogs4tLM6zKms2zQqRSebgOVtLUtRkiSQXgl/97Nc4J7i0J7I8ZZ4CQs4gR6ZJYIIgKzTLbDh/7Fgmw+s3d3gLw6Vns06xdiItJGaeabuF4eK4e3VPUTjOhxN1dUORJQzTwqU9UVY5RVqSJPmVe6sFZV7QDxPOTzjjmOflqg8dZy7tmUyVrJuEw+GR09HgrGBZOs7HCwRAzBQqQyvDMFzYbLcsy4WqaJBCM0wtu90rkkQwTwM/+/krPv38jmFYWBaHzCaiNjTrFZf+wBKuqKeu72iHM6vNLZ9/cQsi43K5GsialUAmYJ3kZr/Cywnjep4+GNIsUJaC4GDoBdPkWK3X5IXmfDoTbULTrCmrnK7rmeYIUVDWOUIbHj4+Y2Z5HfIEhfeGRBryXNOsGhKZ8fx84Cefv+T+xZq2PzKNA95bJJLXr19RVJrT8cw0W1brFcF67JRQpmtO3UfK1RULNXeQYIghwcVAVqasqoIPDwe0ShFBoTOJFxERFMM4UNU587QgZcY4OUTU6CBYJkOQC6ttTlHseP/+mZcv7ricLNPsWW8DYKnLFW62NNULng7PNLvI7f0Nz4eBECeCj6xWNSJahs7hnaOuU8ZupClKsjTl7duPV2uUH7l0LW3rQVz1wlUNv/rVr9jsJe8/PBOihirDmAGRJiwi4cuvv6fKFTH2vPv+I3mRMtvpqiAuFJ6AkBlJopiNZ1fnOC84Hc/UecPYT9joKMsV3fnMf/FP/8t/+BvV/+a//ZvfqjRwOM0ENDf7DVmW8fz8QCI0l7ZltdkzzCekhi9+9qe8+/DI8/FEjDVmKSnLmkSXnHvJ4CJPpyOX9gljRkaTUNU3jH2grCqMdbx+8Su6Xl3D7bnn62++uj54o6XvL9zcKz68f+Cbb39PUeU8fnzP5A3dOHI6X/DGI9uZTVLgRAfB4IPhcOo4X0ayYkW5Knn7diYvKpyNdMP52pZNFGMfUMqwGE9Vl1jraC+BF6/uWVxLliusGTkfR5qq4vXrT/j48IjUkeA9uaqQUnNuO6K1V7xVP/DD+w/UVU1Z1gTraM8XpFzj7YX99oYy0wyXltcvXtH1P/Bnf/YbIlCWNbv9nmmeGOeJefJMw4xSkukM5/4jq1VFqiumKdAPI7rg2m6NhiwvePj4cC0uJRnBO1QmkTHBG0k/Drx+fc80TSTak+ead98/URaaVy9e/b/UvcmubOt6pvX81ajHiGqWq9jb59g+TmMhnCm4Azo0aNGkg5DIRgqSDii75wZAiJTogOgkIltcBz1ASGkfo2N777P3WnPNKopRj/FXNGJfhPMKQhGKGeOb3/e+z8M0ePIsZV/fUxXgpozHxwPBaV6+DXz3RzucCxADy+p4/nbm4UNGnjXc320Zxg5rI2W1xagUsNRNRlpIjsdrnizPNc9fn6nqLZNdOJ7fSYxmtQpnJ4wyhKjpLidCXIgKql3JNJ8pkqueVmuJ7yGS4TOYp0B1c0NS5MQAOgqmfqJIMhSStZ8IruNyOkOQ3N2UPDw24AoWOyPTmWDdVbWnIuNqSdOGJBPYBeoio79c8HZl7GYebj5wu7/l/N6yrj1uHYjKU20rTEhQQXO731y9024l3+praUUEijxlHK5bnLKsKMoUpa5yg66bsJMmSwxeOlq74p1HRUk3rvTDwmaz5fXtKy6siF8UrIlJ2ZYN/ToTzIqmQouCQE43zsz9iPOB3SanLAAU3l2zWmsAwtVENPiWYlNdMUUxsNvfsc0L5qGjszPWRZbBUmYlhc7oTwO2m6mFhLBgysDdpw2HjyX92jPOPc5eH965Snl4uGP/qeEyDYxHSxkTzt+eeH09EZVCaYldNVXeUGQp66i4O3zk8f6eIsuZ15lFKGZ7VTfXZUKiN2x2W5ImhSzDxcC09igtkVriwkRSKIqyQpMwThOrX2nqHeu8Mo4X6qLAqBznF2TiUXnJtEA/twQ9UWcZ2kdeLi+8jB1RJux2e1SqmZ3HR8WyzOyyilxu+PL6Sn+ZyLOSfJsSoqJMG5SJSAM+SNYJ1nnAuYks3+AcpFqQGcM8O1Sa4+1Koc21JGk9qVEEb1FakxUFVVGjhMK6hSh/0bGmCbkpqfKMqAzzatkdatLUoOWVY+mC5PLc8/xy4tJ3rMty5UhiGV2HLjwigl0hyzP6aaJfF1SWsixXTeW4nlAahDK4aOnHhfP5wrC2iJhRJTVhWblpPiCEJiYjeVXQ7PacLiemaUaYq8Wo2hbYENBJRpASKRKCtaSJYfYza3RMy4yNClWAWyYqqRF+4e144cu3b+jEMs8tVXGDW+NVnVvuKMuUaZko8pIqMTS7CudnlmlEBhBOcjweyTLFcB44nxbubnZ4LIf9hsxcc4i5Tnl6/YLKI1ku+fj4Ae8jUsNie6wdmINHqUhV1Tw8fOR4uly118Dj/Qfm4cLPP/U0m4IoZ+bBX+1MRHSsmeeZy3lBJwUueoRaMeaOcbxSEnKTsNqWTfUR7yLWTiipiXIiRMnjw3fo9GqtS/NIPwaSXIOJeGmZ5hkXRra7mnkSHN9brF+QMiNJC5x/pbsE6roAMbHMlrr+FTePNW03kRfmajscZsoqJ4TANFmiNEQRmNcencDXr3+gqW/Y1Fva04mH23tEiJRljZEFl0tLkkmEFDgrICoQkBWGS9/hfCREAUoQlQQpabYVT384Qii4uXvkcFsgjaBMK6aho6gEWZqiTApeX38f9hV3tw1Lt4BMSdOSaVzZ7HKm+ci0jNw/3DGvV4Zr0xTsbx+5dGe6dub1uaWsDP34RtU0RNmBsFxOgarYEeXCpT/x3a8/0U89z28XpFno2wXvPfe3Je3FkqUNNzc1fXd9b5lR4B1vp56qqfFhZQ0wTj3OafAZ2gSm0XI6XbhcHLPruawtVVHhvKBfR7KsxPcWGSwPHx64vLaU2ZZlmqirjLFzfH68Z5pesFO4djnIcH5iU5UkqQEtsKtkmRb+xX/1L/7hD6r/6l//j7+9nCekqtje5qzW8/T1jT//i+94ez2j80jXX3h/m4CM2S789NMTUtekpWL+Zrl0Hqs0q+tJGDn9dOT+cA+Z4Mefv5CmGZ+/+8w4dLRdR1HueT0eaad3psGh1ZYkSXh/Gznc1igSvnx7pSj2XE4TP/3wM1le0o8L1jvqekuqErI0IzM11gqMTimKDXV5QEpAdCgTMapkGLorCqS5nm6K7EBeSZYFoheYDKKMHM/f0EqRJwckCrs4prnly5evrH7d7vovAAAgAElEQVTBqeU6SG9ueT++0g492EhTb/jhx5/4/vtf0fczfTeRmPSqC1wiWqc4a4keyuyO8+UdnUtciLRDT2IKnr+9slpLxHN8e0MJw6E+8H45IbWkrDaYVOCsZ1Pf4JzFhpkqM7weWwKem21FXTfkTcO0tHgfiSQUuaLre/a7CmMCqbkiayIzaUww0nCzvefzh0feX07c3jxwal9RibmaqqqE528Lh7uS7d6QJQXffXePINL3HUJE6k3BNM0EbwnRMgwT3iUopen7kZfnI5lJyUuNTCI+BMIqOV9abu72+BCujDwlmNxEVhckqeb9dKJOSqITjL2nSGpe2yNWOO4PG0gMP/zNz4TRUTclzlma5oZhXDj3p+tDxKTc3DQImTGPK+PUkeYZxjSsVhGVQuuERCnC4vFrJC8yhBHMY2DsO2Q0fPhwSzecCCEiWAlOYaqUaH7JN0mNaUpU7Tl8KqnKGnU97JKmGQKNtZHNdsvhcMM4rrxf3khlvDIGk4Ru7Qg42tMZ5zw2aNKsQBFJlEAZRZblpCalqkuQCotk6TWJz9lsBMiADQtpFPz6+0/kxuCdI4qAxCOITNOKwmEZ6aaRaQ744DCpJklq7LByPD6zLJbh0lEXOcoYZusYg2UIKy4Kbg4f8C6iUsnpPDIOnqbR5IVBkpDpjKww9EPH23OLSRJsYnmZLkyrR6ucZZlYlzNaSZqqoqkS/p2/+GMeP+z58u0JlWRUeUYWDNt0x/3+E0m24dR3uBCZx5W+v2psEZH30ztlWbHZbCnTlLlf6NqFssrJUs00LnTtgJKCTGX0/cq34zuXy4kstWQazj/36DGj0BlEz7asuClrbDez9jMP2wN1lpEqiYyBfp1ZFsGu2VBvc5Y5kGUVMsm5dAPD0hKI+PVKoTBGMowTOhHc3+xZxplpmYlIlsmihcT7cM1MK4lbLUJqkrwiBo2SV6+695qAYFkdTaWpq5J2CGx2B+7uG6SM7JvdlbVqYBkEkx1p7gvWeUVpQVZojv07a1xY10iapdSbAhsdTni8FdTlBmMEzi8gBPNomReHDxaVaqJICRjyvMQYTRQemYNXV93ualekjvggMHUDyhKVw04CRkciFdJLlqnnsN9ye7dnHifsMFBERSbgw+4jMijO7Ruzm+jGnjzLub//Y272O+blTNudSZKafhgI/oqjCsLRnhYSVbHZZVzGlhhTPjw+InwgMwVSCx5vD0S5IqPCrgsu9ldJiD3xduyY5gVnOy6XdxCSPM1xYWQRFpNqtM746cc/kOgrv3i33bKt93z5+YVqcx3q2nahyCtiCAR3pZMkuiQvi+t203u2h5LAxLi+XjFWLlCWOfMQmaYB63uc7wksFOnttYjoJoZxAMCumsVaXPgFwSdXhjnw5esbJo98/PQRJVK+vX5FJZrHhw/kaY4ygrHvmIcMu458+HTH/kZj7cy0rCDApBFlJD4IAoG00qR5yry4q4Qh2aAkGBmJq2RoB/I8IwrHh48PzOvKOC382Z/9I15f35jGhcDMPE6UVQPSsKwrWptr3CWLNIWg3AmW0LGuVzSXCJLDzYZx9EipSBIgWoJ2nLuJTVEz9x2rnykzwWZTs9qB7W5L8IoQPCINnPsBmwq6RTAtM0o6ynzFj5HjE2z2gTQPuCWn2RY471AqpdwZnLTXPLfK6fojJsnRSqCNQQSDDwFhFoZuJkkSEh14ev5KWtUc7g54H7j0E945nFvZNhV92xOCAwJJmjFOC02h2eiC09sJkSiCFVxeT/yTf/zvklU1aPj6/Mbh4ZEoJC/fTli3cHNfYUPgbntHUJEf/+6ZZVzZbW8QMmV1LTeHLf/sP/vn//AH1f/1f/+Xv93sdnTjxDxbLpcz1k48ffnCuiwU1Z4ffviRSODcXVjWFqE9TbPld//mbyk3M/e/uuOlbRkngZCOKCN3n+5YomDpIrttQ3/p8RaEShjXmWHqWFeLEQW3dwcClmkeePrywtO3N7K8JM1SzoNltAubPKebJoR22HHCSktvO+4PW9qu57D/QJHnFFoTXQAPVV4zB8e5PZJnFT/94QmVQMTjvSIvCoQQ19N0taUsC5Ar5/cX1jmwqTd043Dlcu53nKeWzJS4NTBMHTFeeZXWeaqqIQSYZoeQimGeqOsN6zJxPM4IKQhB4mxBN/WMi+O97ZFIuq7DWU/XzYQQaJoCLSTd+0y5T7h//MgwrYxDT/AWISRCRpQR7DZbOjuy3d+QGsm4TpAkIATGaLSSGCMYu5lpulCYmnW2fP5ww25TkpLw4f6GIi/56Q8/UxQVOrEsvkcniksX2B1KHj6UCJFibcCkgdPpjNYR5yQ+OJx1eO9Z1uWKfUoMUqWcj68EYVhC4P5hy7l95fn1Da1SjFLkOdiwEGKgSnIEgsl5Drf32GnBLYom2yOEoe8W0lyxeShBBobLC6dvLaJf0DGiUsP94yfeLu+0a8/gHcVmR74pyAqHHTS3NwkfPgna1jJOniRJUSqS5oq8ypHKQUjZ7Ru6y0A3tMzWM0yBrMo5d+/U24KyqVhsZHQT0UlSCZu64PV1YRgnBAnjMCHCQnCC6BVFXrDbbkiTnK9fn3k/vlLlewqd4Zj46bnHk9KkBu1AZRVlU5DqhERAs8m49BPBC4wKuGBZHdTVhvF0IRGKLHeo1CJEpEm3bMoteMk4jFg7s6wTLs4I5UhNQWpy8AGpJVprhm7i5e3I2/GN2VmSMmezaRinFtSKUhGNIokZcgGCRCfXv5ux69BRsa13ZLokrAuLnbgslsFp8qTgUGnG7ojzgrKs6NoRt0BT71kdBA/zqPj97594eflCnuaMreP88o5wlm2zoe0WltVzd7vnfnOgSUrKtGaeNcM8s9luSU3DeOnoz0cIniTNsGvAL5Z1nNAyo0xLoh8JciIYiRUJcxsRs2J/W1JuG+4+/4q7X91T1xWlqliWheyQ44zh7fSOEQ6daHo74RZLVWUsdvhlEwiL9WRFjbUBZy37/QGpoR968izDGFgmxzJ6lLme9qM1FGlB0xSkicHaQJJlTMvIOFwZvcN4xkePDxGTVmhtMBK8X+nXC021Q8sUx8K22dIOLUmd0mwNWkNWpBSFodxmyGQmr3OQGU29Q5rIZehxNhKDJwme+/2WaWgZhoFEV6xTQGtBVRTM/UoUkGQKKTXztGASi5IRt0SsdVgvrpscGYg6I8sF87pAUJSqQEnFYGdm41hZWKaRIt8wu4msTnBO0B49f/rrv2BeeyY3kJcl1aZhXWf+/m//lnmOmLQgxsDNvqbtep6+fgOfcX93g3VQZBVFVtK3PQ/3N4iosMFTVTnz1KKlJE9KDjc7xrFnXmdUIoiqYl0hRkf2C+pnv7unbSdMoa8D9LEDVow0fLi/p8gzfvfXv6PZFiyr53geydIcbz1ZlgCR/X5DIkaWpaMfzkifcn5brnIXKRBO8nB/ixSGNHfsb0re3l5xfiY4WOaZTVlxfp9QIuV8mcjzBKEgMRKlFN/eXlhtQGlBWAXn0xvbPWSF5HTuWdxCVgXadmbuUr7/vEWJgAiWp5+fSbOCEANCQJrmzMvC7e0dx9MZITVaNJyPb2ilrjSQak+RVaQ6Z7etSAsIYeTStzT1LdvtDUoHxulClhYEZ0mNQUTNOCxYa0mTlERKhsuJy3Ehb2qyuuLQ3NIUhu79TGBht78FHKnRGFlwGi/kVUKuPJFAnjcY5a9RAKVpjxP7zQO//7sfOJ07ms0DMnGUVUqRC9yYsavuSVKHjZG0rJiGFZ0KfFzppyM2KJyTuLjgfCAzGUrmVFWKczPLrFj9ghKGcbrQnkZmO/P4uOd0bgnK4MKKQmFtIE0Top/Z7Qs2m4bHjxtW63CrZV0jLjikjCzOYx2cXls2VU6RK/7mdz8Svef2ZgNWEGdPEgO3my12tghvePzujsvUoWWCDAll1VA1OdPUstlW/NP/9L/8t2BQ/df/8reIgDaCebYYY3BrQJDRT0+8vfZ89/lXGAMiCqrykWk8gxjZ1rdst5/oT4HbZs/DfYnMJpAFX7+2jBfH/X6PETlff/qZPE1AXjce1q5U5Y7PH35F1/ecTgOv739HWd6SZwdeXi7MvsMZS6kll3lExRwZQcgSOUsm7/Gr5Tf/6Fecu4VLO+LkhFMjX96fOQ6KRFvmeSIKSbNpyLIKk8A0RvqpvarRmop5sQgZOb6/UeVbmqrB+gv73QNlmjC6lTWu1PmW7nzBxZlUF0zzSlmVjOOIkpJxHJFRkZqUZZrJspKy3EO4mmy0MrjQEwWkmaLJt7TnjrHrGedr2aaoCpZlIU9ybu4/8Hz8ymKPlHnFtrojTTKiviInTJDMLIBBBk8/9pzaFW8DdppRQJZcT4dNqbjd3bGpdnz5w4m62JPl8OMPL2SFvjqzk5V+GOjHAZMJsqpkHgZEFHTtCRsXVregjGEYJ5Qy9F37y4bgenI89e+sdmIZF1JTkW0MuoLTpSVYRZplzEuHSSV5puhOLXXRsC4L8+JQIiU1CcfjCexK09TIX5BdXq54t4JNWYZAVW7Y1AW3D1uQCU8/vbDMZ7RxbJMGISLvX1vef1z4j/7Dv+RPf3Mk8BMmm0kyyGTB5XzGesfb+ZlxciQZpKogBog6EgQsdiEvNUVVMk6er19eSDJFjBIVMuaxx46Rm+2Wm/0NwzmyhBeWaUQIg5SGxBiEENcMs72SGLQSJOoKaq/29+hEoaXlUO1QqUbJiIiaJDFktWbwK/3QkSnBugY0GVoGymLlsK/I0w1GJqyTJ1UJy7hi/YJdZ4zJSbKKrMhQEo5vA0bV6CCRKuK9YBkDPq5XbJUP7Lc3GFlhQ4LIMurdDp3VdPNMUDOOGZFIklSjgybXKSHCtDqWJdA0DVoKUiH4eLghS1IwBpOVGFlw2Nyx22ZkzcDmPiHNMppNRlpPZHlDKiuG7oQn4GSKSAsu4wnnZqJ3fH1+5jKudMOKEB4lEubO46eZUhtub+5RpmIcVgiRTGVUecm8tCRKcX//yNhFju8X+vWduiw43O4p7ht0kiGt49KeafsJ4SXjOjLIiTUGtmmBEtCvA0Zp6jpnmDtCiORNjhcQosBHi18daZIQWBmngSwtqMsGJeHSnlmXiNEFdlnIUn39Z1VLjqcT3WhJywJlImVW0zQ52ii8k4xTj0muTWoVrsOwSgVNkdMdB76d3pnWhWGwpGnNw/0drJLcZOzuK5awYHLQWqJUQVHmV1tcEJRZRZXV3O72zL1jGCJJWaFNwn6zI0tyBCkmgaIUJLLiZnuLXU5EwK8aEEiZIESGNpJpumCjYJlGurbj4eaeIi05rT2X5UIIC+Xm+tmtiyYvco5TTz8OpGXCqTujdUKZV9dBXYorP7iwbA47bh/3FIXg9D4ydJ67x4ZDvuHb2w9E7Wnbmf4yoYSh7SacCLy2r1cBRKGx00KR5Uzryjw7bJgYRsv2cIdODUZL8jTheDzjLMQgUChkSNAo0vQ6ZEmp8d4jUKAk3ThzODzw4dOB/V5fpQs+5XDYMU9nhtmjZYGMnjzL0Imn71/Jc8HXr2+sCzR1RXeeaE8LRmWkacnhZkOWVFzOLcpEHh9veXsdqfItnx4f+fnHbwQliFiqOhLWlNxcS2fBJdR1fu08pAG3wofHLVrWVFnFageK/MDYd2RFilQK5yLeg1bX93c59mzyPWWRYNeVfX3LZrOh7y88PjwS1UrbLlT1HfvDLeNyJArP2EOWbPDBUhQ1wziy2WxI8hydSLI0/0XUMVDVD4zjxDpbNpsUOy1MnePx7gNztxCsoJ+O9F0LJrCpdxzf3ujWkT+6+4gUO46Xnt3ugEDSX87c3WxIs4QkKRnfzwxnwWIH0nyFoMmLmmg8g2upkx1FI3h7s6RFTpZrpsEiCdzt7/l4d8c8TZzeepSx2FmS6AQhPUpkNFVJVmi2dc7lsiLSBKEidnCUZcLLyxcI5bXNnxmsnXn7ZlkW+PzdhsEtrFZjLVg7YLRkX9/SNCWX85EffrxQFCVpklHkKf/4L/+ct+MLz8dnPv/Jb1id5YenL2w3hpvNjnpXs7ozy+iYRst//U//LWj9/6v/47//7Tg50vRqYxmGEaUsy9Ixj4YPj58Yupmnpy+UhWEYRkRMcbOnLiva/kJeZaSF5vV0RkpB13q8NBS7kuVyZDh6irRgs1cEsdBPA2laME8rD4cH/u6H/xsvRvK8oShyIhFTrOT5DpaWeeh5ONyR5juyPCFMgfvHG/IMkqLi3L9hrSNNYR7OtG8X/KKYxwUbenb7LU1T4/yEXRK0TvDRUhQpZZ0y25ZlulqLiiLBrwmvL0/kSY53hucvTwSpEMZgh4BbHNJEEtkQvKfIEuZpQEbBcOlJlKHMCjKdUlaKuirYbjY0lSQzktQosvQKZl/HwOXYY0zCdleDkVgbmIaZw6Hi/fTO09M3siIjeoWUiigsnsgaLWa2iDTBrgETAllekqVbcmmYu5kiq2jKHL9I3ByZ54VEK7QsWe0bVX2L9YHPf3Q9RUxTS9efr1GLyTNMI+tkaTYCpVKkqklyyfFyAQRlnSGFZVOWRBJe3k8UTUmRNzT5LUkSGcLM4GaEklRlRfSCZlMg9czYj+yre4QXbHYbVitYR0eRaXx0bIuaeV54O73TzSdu77ZoqTi9XFCyYVNnxGCRWjCOI2WSU28KQrTkJOSxhKnjP/mP/z32zRP/3//791xeS0weCZTMfULfQZXviDYhVYa6rDhe3iGR1E3JsjjytKKsFfN8gihJdcHlNJOoBa0EnfXkdU1ULVkpGbt3xqUjSasreDlGvAMjDXbtaZocgictE5qsYlPdc2onuvWNoiwpk4qu7Vhni7UrRZHxPhwpbhMeH27p3gbwkn2TomIkN1vyssJ5OL+eEASMqSB6ylqTZyV2DkSlWFZFd5qYlpHt9oZ9fcsw9CSJ4Wa3J88SqrJCIdgVG4bLGR8Hklph/UqSGsqmucYA1oE5LExLQBNoz0feLxesVGiTEFFMc2B1KysTl3FknsGg+Hi7Z5oGzucJnWQMs6TrVnycObcdznmKOkOXhlUsoB3deOF8OTMvnn6Cbrq2x+syI9GC9nIhoEiKgmg8/dLx8vqM91AXDdI7yqzErQZhr+is5+M7URvyoiSXhiTkxKViHmae337i5a0jukj0J07njq51ZElEK3jvZ6x1NFlKCBHrV0QiWW3AeQ9CY7SnriRGQ9/3JOmW3e4OQmQcrlBubTRCDOSZ+cVXLn6JaESyqqTaVqQmwegFQiSiWeYZbTTaZES7Yvvxai8yBqy/nkLThCBTykIhxMA6eYzwVFUgaoM0JVIoRIw8fXtFCA9cy6lZ6jCqou0m+r7jPL6yEFndilCWqqxYGZjiTJqkxNVR5gXDtDDZyBwjXgkyVZMmhmluAUNaphghuNntmAbPsb2wbSqyVF2tQALa4wUlah7v77jNrgWumYXz/Iog4EcLQVA0JZaeum6o65p2fGeaLCoYmk3D7q6mrgqG4dr87u0Zl8xYYHaOpLSERJPq8iqFMRFnIz4o5qUDLXFrJEhDsysY+1fWccHbqxhmmk6sveB2/4GPjw9k+cphf2AcZpQ0+ODxMpCXBZtdxvH4jls0wa+kSbxyh3dbosiZBsGHx0c+fveJy3RkniJ5WqO0o8wbYtAc31/49P2O1fZolZOaHdZ70mxHjJHVv7MukOcON0XenmfSJsOYlFQ0NEVDoh3L6Dgc7piXC9obimzLuvSEYBEiENFkRY4PE1mikDJiUsXp/I5RijTVaK05Hl/ZVjl4QaKKq7Ww/4mHD81Vi51XWDtQlBVCiOv1zQdOxws+zNSbjJ+/nkkLw7hOtGNHWmS8vr+jSDgcDqRFRlFFEpmyqUuWCT5/fODl28/grqSQ/cOW06mn2dW8P72ADJgqY6tqRtdzujxh3YwQkSLTJKlAKFiWhSJPSXJNvStY3EJ7XHGLRGvLNAxMk+V8blmcpa53uEVef3u3G8pM8vT1K/NoiQGEEGidkRea48vIh8cHpPII6Tm9n5hGiFry9vbMb371G4wKLJPGuQEhPcYYDjcb+uFM8J7gAzf5DSrC9x8/0Z0vCK/YbCtQK1Wxo85z8izn+8+fefv6laWPKCmwjKwu4zL8AVNDphrOzxPtYKnKnBh7fPD88//iv/2HP6j+T//z//DbEALH0zNCKrbbirfXbySqosorXND89Iffc3uzRcsURSTLJN5ZBJK5taAj+mbHe+cogf71nWnsMTIBJ8hyQ1JKnId2sGR5gXUTiU7ZNDl/+PqEl5GsyNBSsiwTmdlQVFvO3cJwiURnSROHFAWX6cjqW7y1fP/dZzZ1RXdpuZyPdN2K8wkPD7eUeUqWFPgVTqcOEWpubjZMywAhRahAP3iMNEzdK0WmEFLx7eWJm8OeJE3ojzP3Hzbstxo/KNIkUJc3FKXChWvR4O1yZn93uCovP/8ReaOQ6YpIEqRSTPOFPM8IQWLFzHrtJVFVXC049T0kmrubhrmfELJgcitSa4KZMEqT6pz99oZ+GWntO1KtjBfLbXNDcCcSBdblJFqio0XHwKfPW1RMaeqG25ua+4cb6nKDd5ZPHzc83n3gdD5S5NfC2x++/j2THyirDzy9/QhCoRbHw8MdwzozWUdRK07HZ4ok57AtmbqFuEbmXuD9QlXuGfuBus4osoJptng7o1jwiyAGS5YL+mHk3M9EUVLVGq08Tb7j+DbyJ3/2mffz6Tp4Fjv6sSXfKIiC+5tH2nPPai239/dsmwPPzwOTcyxuIclq5nHhu+8UTbWhnz3/wT9OcdNf8//81TPjKPj4/R1S5fxf/2fP4iz3jw+ssWP0Rw63D1z6gSgWirSkW5frNqPRKGAaFSHAMPR0/YB6VLgl8KlpaLYV5+lazkikxTvL/f4jRmgI8N13u6viVOYE71i9JY0JebnH/aImVXoip0B7w+oki19JE02WKVKZEDo4Pl3wa7h+t4aA0TD0b6zrTLMtmZaePDfURY1Asi7rFe1iIKqFTVVgLSQqJc8UzV2BTjXLENCZYvUWpEXliiAknoBnxa6e6RIJA5yfjwz9ES0FYYlAQKYakWVUzS1aaKrakOWCoRuwsyBNStJUYRLYHXbINOH99E69y8iThKVv8dGzOnV9zSgggnDgSBhXx/HYgdLICG51nE8dbrZUWUJYLVWRUpSC2Z6ZlplpspRpxu12jx0HiBG7espSkGRwbq8FDy0DYXUQFFVTI1Rgdg4RBQRLiI5pclSbPbd3e6ZlpH3vSURKkiXXspLzdF2Pm8HHgHMjMjpSkyK9Ybo4FivI6oybuqCSGef3E+u6MM0DQhiS5CoYqPMtYV0YbY9QkbiurNbjNMhMcekHRjfjDVgRkFHjV/AIhqUnxJUlBkyZsLgLUg6oKEh0AQpOl1e69owKikynTONEv87YLBLlxMN2f42vLCupSvmTP/9EcltSpSmRlXPfc35uicpSmYYyv2GNPZexBwVJGlgnT5XnVHnNOEx46YmJQUVFmCIiJiSlJtWSpj4wjQtGQppcy4zaFOhC07mVvrWYJCfXOc4uWOVZtEBGd82iGs3N5pbnr28s3lPdlKhUMUwdz6eORGqSdIFU0BR7UucRLqJ0yWRH8qxAC82hOaCVJGqDV5b5MiPyhH4+004TfnZ8fPjM+8/PODFzc39HVijEVjKIiaVV/Pz3X3l+7XCpRG4zNps9kcjQLiQqpcgNWmi+//zH5EnGz1+f2W/2/Pt/+U+QynA+D7y+tDT1ld05rqBTuEw94xpJTUVhEtp+wClQcmFeLsSwcn4dwcHQj+hEkOQKlQu0E6gF7vcFyJlAT9tfaJobVA7TuPD4cM/aK/LCMwxvJEYiRMStAr9IFAG7TugsXCUH3cR+s2deBw67PXlS8PbyRKoNL28jQQoGe0LHDUYYTLry9tzigyfNNKlSuGnFCQn+qp2d/Eo/z9zdPBJZEDoDvTB0E9EHpM9IlCfNA1+fOnReUdWSy/hGXjTYubua+CpNlRpeXk6IsiSvMwKOt5cTZVVzujisntCFQS6BeY7c3Guev0CVZNxvaoaloxMeKXNA02waogxooamzDdFG2nEkN4ZxdtSHlDQ1tHOHEBm/+fRr8tIx9Y6HuwPH4xtJrpnmhd3hQFGv/P53F6bxQl4DWcHuw4Zxkby+nlBS8d3H73Bi4Ke3V+ZlIYYU3SiG1pIJy9BrkmLH4/eGH/++I01qzv0Jk187Hm/PT6SZIlcpQzsT0Xx62EKcEFECnn/2n/83//AH1f/lf/vvfgse7wRpKinLBhkrBIFxmMnKhPOpo9kWVyC2s0ThSbMGpRWbfX1lz51HxuGMcIFxWREyp0hyghCgA6fLOybJmWaLCzOfPj9wPs2MkwVxzXL13cTt/p6xH9juN7TDgBQT33+3pUw2/PzjhXka+PWv/5S2HXl8zBnHjh/+tqVpGhJTsz9UfPhcMgyRfmhZ/ERRVtR1xTCe6McOiKSVJcbAPI1M44ySirrOGPuJu7tfMY+OdZm4u73nx5//nt1hy9/+/pUkWwkisCyeiMUog589CqjKgr7rIMI0jTx9ecJkOYKczaZG6ojSOePS4dyF9jJhYkJa5jw9/cT76zsCzfv7Kze3exIlWEbJzf4Ot67M84DWCUPf0dQN0RuGtmVeBMpch4WxM8Qg2WwTpMoosobFnZjdSNdfUKmnqnOEyK8tXOsRieT57Y156XHeItVVhfh4/0CzLVDZicPulo/3d/zur/4ND3cfrhmuIfL60jI7xxSu34u7wy1FEnl8OLCsK3/48WfqrWbqUoZ2IJMVdZWQZRWn94FdrfHB08+ep9dn0spTlDlRrzx898e0ryekAoei3m85XSa0UWil2W9LtLHIRKAzhRAW4+GmiXx4MGi98PFuZXlXFHjy2wK3ZrxfPF9fLFGVlFVFEAMmW9EyI9UHiixhty15fRkxOmG7ychyzbntmNaRYalraYwAACAASURBVO5JUsPtfYZzkaASRKlQJvL++kxQILKExJRUxQ2B66YtzQVICNEidWSxE85J+rEnsqLkFWNV5dcc67j0DMOEtSsIT9u3nM7tVY+blRR5ilYKKTLK/Ibtbsf58oZJCrKkuiJ/tCQKj1st0xTxXjJNE0VdXVmFKNZ1QRKpiwSvYLWePEISBcGuJBrKuuLST0iTokxE60BWJEQm0jzHmAIlDdM0Xhv1TYKQlmW6nvbu7g+kqWK1lnmx9ONIN3V4HHlZIaVi9RM2WKQUbLc70lThreN47ng9fmGeBowQZDJB+YS5m2jqgtQk+FnzePcZu163/W3/Tte1JElJVWyIcSWEmd3u2rYduhG/aM5dj85TpEoxaUpVFby/nej6CSUlAolUOd5HnLNEqRmmmYCnLiqKskZn4P11MDBGI8V1k4ZY0d4wdDAvll2dUW1yZrtgvGboOl4vFyICZSQRgY8LLizkSQNRM7oRbTJqvSGRDjsvLLPH2hUfHFM3oNdAlSi0E/jVIkWgzA0iXnWb0zwQVkhkRowTyBWhchAFQgmMSRFCMNiRflpQUSKcYBgtpFcE0mZ7YNccOF+OBL9Qs6c0NS/nN5qmYpo7hFxBOITyKCWxNpKkCTKzrPpMFBrvAsEtFHXCZE+sy0i5rZlsTzcdiUJwbi3jBPW24dw9Y4eAVgK7Dlhv0QKqTYUWhrbviVoivaKpK35+fmK72VLqnERKLpeR9rVlW2V459BKcX+4QXmBUvKavSRDesNhW2MXh/UDIyfGZWaZA/cftiidoLVGeINdAlmuaDYVWZ6yPRwYxpaXpyc2+wahNZvdjqAEJpdc3jsup5Hdfk9irs+GZVm5f7ih7d55ej7jvaBfXvjrv/kryk3BOHdXBnJ4Z7QnTJJyOa88fHjA2xYdPVJE0lTgo6RvW0IQPD5+wLuF/fYD97e/IssTYtDcbCpSk5IVBcM4s1qPQmDI0UIj4ogBxu4E65Xmcj69XEUZ6ZXx22wTVishRpZpYbe5u8bKbI9WCUVacjyeMeYaTQlhwZgr+unu8JH+MmGSax5eSolA8fb2TJRQFTkIRbHJWOYVvyiq7IoFzNOGu5sHzqcnprGlu0x0F89u90CaGzwz4yzJsplMjiTxEVkk9OsZYXcgDVUm8esFI3J+/OkZkxqSNL3iAn0kKQ3reWB+neh5p7UjBEs/OoLNMFrirON8OTJMJ6pCEYWnbR1eK1SiiVKAhxAVeZLxcbvj/e0VoaEfXxDyivyqNgluDdgxpcxTZFCU9Q3/P3Vv0qPbtqVnPbNYc9VfFdWOvc8+555b5U2ytJ1IyIgWQvRpYwu5YyEhMB3at4eEhEBCMg13EIiemzRwH4lOImwMCc6899xT7SoivnqVs6SxtvI3pH9CKBSxxhzjfZ8nuIRwPU/fPFHKGqkMQQu+/+2Fm4dX2ClStQkbL0wXz7vvzjztT3z11QO/+80LL/v3zNayvdMMY49zkWa1FM+UKNGppcgNPl4hE7iosEnwn/xH/+hv/qD6P//Tf/zreQ5UVcHUj0yDQ2EQQiP0xDyPmKxCqKVBmRIkPKfTiFIeUxVcjiPDeWSyB8bBUzY1ISzw3qQbqibj4dUNUc70w4Usy5mnmXffDjTrjE9PzxhVsa7vCRa685FmVXK6voBTbJoV/eUEzNw/3BKjY7ve4ObEhw8HpHKcjyNCehDLltTTUZQtN7cNWguE0iAD2+0NP777uBhfnKQocppqzXq95unTx8/g74zcGH71i19wGfas2h3D1LFe3XD7aovJNUVpKMqGvu9IKaNZtbhk2d3fcbn2DOPMqzcP5LmiXbV89923i5Jx9qRkGYeZ3eo1mY7Y0BFT5NXjF0gEj4+PNNWK6/lKHJaNlNYQYkIkRV1W+Og5d2fKfE3ZJrzPyfWG0+UD211DCDnX4UQSHmsl4zSTVxLrI89PEyprsN4zJUteabSW7G5WtO2GL764ZZ5HvHO064U7t2vvEOnKr37+e/zki9/j0n9kGBztqub+9R1Va8iMoipbmjan6xYu6nq7Y5wG3Ci5uSt5fHyNVIJ+sLz9yR1SJ8bZ4d2Eioa7zS2nlwtVkYHsUSiqZkc/DExDRMtIpgtSnOmG41Jg0JZuHMik4PW25k//ja8IkybPS1ZbhVYTnppBKD6eK45nRxegd2ekChBz5l4xD47ZnthuasZxBgIpec7XA4fjie3dLUkqJhdIKVIWLTftLZf5wsv1RKElv/jiy6WFWpRsVzsiA4gL4CjLCueWjJcPsNneUdUFDsvUzZSypCgzRBYJMfDx/QvJax4f7shLzfG0x86OTBds1i3OzVSVweQFWVZyPD0R0sg8zRxPJ8Z5ZBgvjJNlmhYHui48eZGxWu/QSnKyV7477fEIhJq5pjPVriAFx+E8oLKZVbvhfE74CGWT4eyE0gVRRFwKZKYiRc00jpAcbZujtGCaLUVRLKr3eSaGzwWwOGJK/RnPpZndiHUj1kaqZsVuu+VwPHI5X1HRIIQDLwlTwk0WPy7FjrI2JM+ScW4NVVUwDBMhJKqqwegK62a68cQ8T6SguV4d5/OV8/GMnQbyuqCzE4fjCYRiGGb6bqCpK5SWXK8HEJHN9gapJd14JqkJoSzy88Z3nHvG3jFNEWc9zlqEkBRZhUkl8xwom5zdpmG2iwFNB73krjMIMWDDTAweY3KyrMXOHq0TqjREYcnliBtHhilhvUaLgugTKUbKVY5TkaLNSdIzeoslMYuRwQ605Za2WjONVxJpwVRdFxtXnq8wqgE0n15eUJlGCY21EyoXzG6iyhRMlpenAy56suhJKZKaQJYJRFAolTieOqZpRAqFUjVFsWDSkpEouUgZZjtS5wVxyDgfZqSW9OcXDvsXUpCLurXvWbclbZlTaEkKiRBmKlNyOc3Mo6WoDZkSRBHxAUpdMc0d4+wYhxEdJXaekDLjZldTVQValdxsbpj6CWtnmo3i3bvvMGrFqqxQEvaHT6CvDLPDOY0xirxckXyBHUeck+SmYHWjmeeRttqxP/dM50iwCtNk2CSYwwBRIYWh0CUmlyg9I0gIcvJaksTMD98/o41AFoHT9Mx6c8eqaXl5/h6lNUlJmrLl6UNP8J7T4QQupylLhuFCSoY8WzHOiRADgkDb3rBqVmQahu7CeO0QcuTp6RMIxcP9I85NXLulzDQHRWRmnCL94MjLnBAlAcjrLcQZISV9fyJ4wzzNDENHrnOMVlRFRfSK8+XEbreGCEo7lLQkBwjDfv8jTx9PrFcr6rJif/hAbgoe7l+z3x8oMo21M0LDer1juo40dcm1v5CljHYT6LsOoXLWu4zDoeO4d/zhH9/y44cf+Lb7iK1znj9GNk3Oy/MLdhREP1Fvc57fPzNfA9Er1jcNd18Y+nPA95qhuzBZwW2zoslaPp1OdNbye796Q7AewdLdmMYrpqi4XT8S7EJjuQ6OLCvQWmGKgvPLgXq1JjMZw3kPWc5qvWYYn1Gy4eHVPf145biPmBzK3NBuc1blC2184cv1kZ8/Kn75leD3vh6owogWilw4Du8/8rC9IfmCuqr40z/9I/74T/42Wvcc9z15UVCUGZttTdctfaNpmnFREpKiG0aEDvhocWNcxAxZ5D/++/8aDKr/3T/5L399eLpwd3vH6XDhfLwsrt/raWnmDQNaG95++RYXPMMwYUyNALrhwOXiwGcUeb4Alm1if94Twrw0dkPPNE787pt3kBxV2aKoGfqO3XpD0255eT6yXW/JlMcOJ3a7W+bR0ncj66ImzZrr5QxEpj5x/3DH/vgDbrKU1Q5jIq+/uKW/joSgkQi+eP2Gw8uB87nH+YkYM66XAVNkbLa3XM8jUkqaaosULFuc1Y7j4YSQgbu7DZMdqZqSeXZs1luyTHE+7VmtbgjpAsEgkWRa8fTyQtVUTNOEtZ68zGmqBp0JjqcXTF5RljXDcEVJwZuHrzgfe1ywrDcrtrtbtMrY3TSM1x48SOERwWPygtvbO67nDm/9koPLIqYuaRrJOJ3IVI13nrbNyLRefi9CgZi49hecn+h7y/XicWExVqw2G5y3tG1O153JC4W1gX585nw+o7RAZInf+/kfkUmBVpJpFPz5n/+fbLa3PH+64J1juHYYJTFZzuFyJRUOlwIhjKh6QOqcotZ89ZNXnIffgZrJi4Zr33PtA+Nl4HG7436z5nQ4U7SKutrQna5EkxEQ+DmwrjJutjtIEU/ES8+ufo13ihQiqzajyhQ//vA9MSl+/Hjhux9P/N//0iHLCrcS3L42mG3AXh253lBXDd5NOBt4/fotmVGYoubHHz8x2AGpDRKDmzSZNMz2iiCSUqCpbxntgMgcISSaagGaH59OrOqKTEuu50CIgbLOyYxGKo9LPZubHcM0cLpeESogIzRZjveRpMHNnrYseXV/wzyf6bsRJTRFUXO7e42SEUEgL3LG6co09QgJwzBwOp+Z7YCUkqKo8SFR1znomape/Nmnc8+n5x9I+YyLkZvqhsYoskwz9pHzy4QyGUpn1PkGYsDZif46MPSOSzfR2xFExvnQYWfPzW5HXdUIoZhnz/k6MM8Tzs/MdsJkOcE7SH7ZktsFwD/MJzKdEYNCKU2uK1ISaL1wNUWAGARK5KyqltW6IjOafhq4nCw3mxVffrVjniz9cEVpICnGYcRbS1O33N3cUZYV0zwsj+5yjZYKnWuiEIS44OMUit12TVVlWDtD0hSmZZ4muusFnSl88LjZUWQG5yfOpxN2DMBSlluta0DgrWS32VHWkrLSSGU4Hzrc6JESQvQI4SkqKIqWMm8I0ZMXhrrUTNPA+w+fyHNNXW94OVl6HzCtxmQeO8z0/USWJ7K8pu8GRJS8frxju90yDJbzscfPkbYqEEkRw2eXvQTvRmTyZCLjfDkyjiNlmTN2liovccFTmzV5LAnecL96INkJKfVivxGw2VS0RUsIjqH3aG0AQVUsudQQHNexww+eFBJCZjR5wW27IjOSpAb2L0dSyjHFBqEUX339gFaR7tqRyYzp4vDO0tQ523bNFD2/+unP6YeJvutZ1y1N3TD0HeMwgBDc3D8weUv0iaZd4yP4MGAMTHNAFRqHJ8ScVdsgxcS1u/L4+pZpmnBTAUIiomUKV1LqKKRgCo4kRupVgfIlL08XMIG6LKkbzbHfMztHWSqmocdQ48aJqrYEP9M0LYkJZwXPH3pcGFltMi7zFWlaglOssoJ1lXM8nyjLDfY6U1Uld/crHu4faMoWoRyzmzgeZ253N5zOe1a7io8fD6hk6Loj3XxGKcOmWZEXDSo3jJ1FIglhETq0Nzv8+EJyju4YWK0KMiMJyWJtJKUJ5wR9d+F4OmOykratmWdHChaZCoxacXt3j3MT1s/klWAYD+RGY6eItZLdjWHd3EOUCBkxhabve169+oK720een96RZZJpcmipKTJB2xhWbUtRzFxPic1mRUiOeZJUtaasA1JlNPWKat1yPV6o8x31DshztF6zqgpCiuSZYbttqBpB10WOLxalcspm5pu/fMft9i29n3HCUJeCdVtgiorh3FOXDckpNpsVJImbHW5ymCxjfZsRY8Y8j9Rlw3pVLbG2c8+vfvaW6zASokOkNeUqpx87LmfP68cvkWpiGifKWhAuklet4fjxzPEQSTKxP0wQBC709N2FN292GNMubOybW2SWeNn3jFfP5dzx6osaSHz33YF2I3FWEeLI6TqDSggll+yqdcvfL4my1vzD//A/+5s/qP73/+S/+vXDw473P+yZxpn72w0pWbIicT7NrNuWvMw4X3rOxz0hCrzTmCISokWkAqkNSS1tOaUUIkFTF8xeIKSjO4/c39yTaUnfzYz9zGbVcDy8kJnIdn2DCFAaSV2WXE8j3nl++csv+fD9ezKtSEFjZ8U0z3R9h5Ka3a7meNrTnT2ruuF8GMgzhRR2yfisGt69P/L8dMJkBmvh06d3NHWOmwOzPfP48AXPz89IKdhttsQUqMqc/f4Z52ZIkrrO0Srn6dMntrua5OF8OCEIiElQlYbdasW63iCBr7/6kqkb6E8d1lmUbFm1G2Y/4NxMkeUYk6O1ZHNzzzBZiqLGhY7L5RlDBg608mR5JC8bng8v3D/esl5XnC97qk1F3jRMg8XOGqEStzcl+6eJaZ5AzVg3Q0hoLfFWgMiZbEeKS7Hn2h3JTcUwXlFCo5TGWr+0rk2JcwFChck9T88f2b8EfPI0a0mwkm3dUtUZTVUyjSPalOiyxoaeaXZ4PxBmg50nXj20HJ4dnz4+09b3vLx09KdIHgpev2rp+w6ZC6wS1Ldbns97Zq8Zxg6tNPhIpiIQkUos2+BpoioNJp+RySNSRJeJYwedFZw6z3ff9rx93FL/BNJk6MaM7aqkUSW5Khk6WK1alDKQDM47uunM5CaSkrSbpcxw094jvaK7HiEmMlWgjeZpODH5CyTJbAUv+xNFVdI2NTE5bm5b2lXGNA2IVDPbyPPzkcP+grWe4AMmX1SoD7tbhmniOp7ZrLaUeQExLC1brSnLHDv1NE3B9TJQmg0hCs6XF2K0OOsZ+kCKiqqqUSJfGtKrhmn07J9HcrPFzp7z9UQSkqbZsG0ilfKEoSCOO14+HemHGaM0VVUu6KjREfxMURmqukAIjQ+RaerJzWd72Glg/IyXCdGTaYUpKpqmQSkYhwE/ezJl6C49Cv56mLnZ3JNps/AIlaFdtfg0I0XAyJwoIkpFknMIrehOHWMX+cUvfklZGL775j1D7zBFRkgLU1JliaIomCfJNDr68UyWp2XDaxN5WRDihEAgoiRFR10Zitwwz25pH9fg/IVgHTFJEgGTC+42D6hYMfQDdZlxd7sD6Znmkbpq2Gy3NE2N1IKA5XruOJ+W/GZZLdn8UmdkQiOyCNIRvEWJuMQZlKHIS252O1KCKDNC0kxuBHqkFUuZpsoIHkIaKTJDLbb0x4H9fo+3kapoQSeGvkdJRfBhQf/oAu89yUOwyxCL8OSmZF23fPF4SyJQ1oZhGHh89Za7ux3BW6RwRDcznRPBJrwfgcDN7o55msiMQiIYh47NpqTOFbkRyBAIXaDJKkwu2e9fmLoZRY4QGqUTeS6ZhgkjajQZKnn8lFDGgIjc398j8xwjDU+fXshLzThOjOMFlWWUVY4xy+BQ5uVivQsek1XsD09oWRB99hnTBrN3ZDkQI1m2ZHjLbMvD3R2KgfEKui4RqeN6TDT1DU0Lw5R4+fFCUzRLnCTriHpg7iJ+StTlmlJrGm2oCkVd5/hgGUePTCVaCkKcuNndYWTG4aNlXd+xqgusHRjnQF6XXPo9fTcgjac0G+wQ2N1kDNMZ55bip/MH2l3GOHi221dUZU7VtBwvHevbFVEP+Fmw29R4OxHSBFnCugV5d7v+gjy7Y3dXEYRlmi0+aZyT+GCILpIXOV9//SXz5KhbQ6YlN7sdhWkJMfG0f0delYtG1ERMYWiqLc4mVpuWabDcv3qFlEtJUImK2XecLgeGfqStlkiRC5BnhjJTTMOEMhqN4Xw5k1LG4WViva04nD4xdBYpFfvzmfP7F3I/kguD7QdULFik4TPn4xmf9hTlmssl0F8TN7cGFy/EUCDTLW+/aji6PakQrGrB6dPA1GXkxjNOFhkrzucnqrqmrXMkM3aWWO/xOUidMTvPbm0ICW7W97zerDkeT5yHnmGIJBkQWjENDkFJuy7YHw94p3h66SnXmqJ9IDNbhDbo8h5RvKEbElV9S7u+xVqPljPXw8iHH4/8/s/eoqqZbjzy9PHM0ClSzPjqJ3d8//1vF+FM9NRlzv75gpIlLsxklUTlkm4a+Uf/4L/4mz+o/i//7H/89XF/ZJ4cr149kpJf2njVhi9f/4quW8K+w9VxPJ3wLnI9TejcI4Vm1azZX/YI4Rh7z+3NLW5w3N7cMYyC49Mndu2Ou+2Kb37zW5pyjRSePMuY+okQIrWpyZRn1WqsHRAoqnzF86f94im+v+F0PnM6nqnbRW/ZdYHn5yNCSKJVvDzNeH/h2j0x9AEpIlVZsl41XC8Tq9aADKzbG+a5xzvH/e4WIWaOL2e2N7ccL09kSiKEZtWumd2AzjQ32zf8xf/7L1ivW0JggS7bRCIyDwGhI0W9bK7KMuf55ZnT8UTTrJBKstq0HE5HJjdxf39LihmXy4SPlufLe8Z+JKaADT1aSoQr6C4WGwNCB2KSvDx/RCpLYGazWzHOlq6z1FnD6dSzXu2Y3YnkS6oypzAlp+OZzWbNp3cTfe8xpWe9roi+QKSlFOFsIM/NMrAOIwggacpyycj0g8fOHZkuMCbjfP1ECJ772x1v3zxg3cy3736DKErqdk2yHpxFBkleFOyaDXYYqeQNbx9/yu1tg50m2nIhIDRo8lxQbg0fDtdF7TeOVJkgzZFcKUQA8KAUQTrO547ueqXWJc4GgoXoLVnuEJnCxYIgB06HiUIN/Om/Hfn2uytar/n6pz9hf7L8q//jPWVziwsvxBTYbh54OT4hs8j+0FMU92hdMA4HxuuF++0d0SX2T1e6a2CcLFoJ5hQpjGLbrMhTjpYKKSETgvAZij6MDoCqqrDziFKSVbuFz8OR0ZpN+8Dh5cTsJvJC4udA1y0bd6UWHW7btGx3O6Tyi1602S6naOGQUjLPy4OHlDEOy6Mtz3N+fP+J0+HMql1ze3tLdz6ATGx2d6zqFePlymQd0RR09kyQDp0XrDaaXAs+/fCMdzO3r1qaTbGwg8cA0dM0Oa8fX9FWNYJEVSoeX+3YbNaIZFBCk+JSWFQIUoTr5UrXdZR5tZzOp+XsLVhO2UYnkrB43xOEJys0WakXkcEQGPtIoQruNjfkjaTrB4LN2G5XZLlkmiGJjKopFgXtMDFPy4lOaoPOCnSuQc+UhUH4ha3cNDVlUSCICJmY5pHZT2gVmfoLsx2WvHDImLvAPPbsblYQIqfDGakMu90tzs2M84I3upwunK4D4xgxRhNkR1Zp3DThp5GyLHDBMtozWgQyXeMng58dVbtklochLA+deKXJK4ZDQFiPKTOGELi535AXivPpzDT1NG1JuWrICj6j9wYIy6PA2ZmyrCnzguQz+otHy4A2gqLMKcyiYh26Ee8S/TCybkvu6oJ/9e2/5Nvv35FlcTEU2YjUOTEIQHI6HpnmiegTu/UNKQjmwaGTwYic/jxRlxXJC54/nui6CSUrTKZpG4mbe9KkiSPUpkRT0NYrhPRIZdBK8+7phRRZWuEiUa0Lvv3wHqMFN7t7dGkgJF6tVlz3Z4rSsF7dAI6yFmgd2axzcmO4Xh02WbJK0pobnLPkpuVut2Oaz1yGC3mZk1UF3gbGi6Oscsq6IIaRm41h0zSMVxhDxzxHzp8sDzc1CgXeYZQjLwQ//HCkKHbkucIozdSDDxMyu/DybuL17g2PNxU+Rf7iu98yK0meb3B2IGs1PiaGbqYtS7QM1OUKN3tWTU6Ske9/OGDD8ujLjcK6mdnNeGnZdydOTyOxnxESyk3L8/lCVWxoqpJ+mnn84itefbWh3T2wecw5Xs/4lOj7BW5sdIk2Hmsj1o0cji/k+YoQHLqIVK1ByBwpMw7HF4ypuZwcMcLsJnY39yQx0/czxjQcDi+M7oWqvMEUia4bFsW0FsvlZU6LuS3OqFQhM8c4DYxToCgT/XBlt3rA+4G8zKjykqn3xJRR5BlpdBDCknuOibwo6HrH6XwkBqjLDRAZpwtKQ9kErseRpB2n/ohmhR9mjC4JKePp6RP3D2uOh4HT8cLrV1ueX54Z7ZUkHOPV09QF43Akodlsbnj++J7rNCKUZnTPnC/Lt+vurmYcFEPfY8qc1TpwPEwcDoFp6nn6dOL/+3/6hY2sDf/8//pLhsvA4TCwPzxxeplRmeP27g3GRN4/zczzjDEtD48Nb75SfPObb1ltNdfzTEiQFZqirBAYmqYmRvf5Wx/5T/91GFT/13/2T3+9f+44HJ64vbvD+pntbsN5P/Hy8kJZGezsiM7wx3/wt7i7uVmQRJlAyobhemV7t6XvRozUhBgpTEnBkk1bN5q39z+l704IUZCpcsltti0pTZgsA+G42d0Qk+Tp6YhUcsmDZBn7/QvrzS1/+VffMM0zJEV3XTSNILFucVrnZtl8vn58S1Ot+fLtl3z4+J5huPD4+Iqbmy1KfS5HoPjpl19zd/uGpw/fg8io6hVSgZKC9WoDJJLwfPH2kd/99on1ZoVUFjtHEg7vPG6WRK0omgqVGUxRcTi/YL1HZyU2zBxejmRFImpQWc4wTeyfL2RZTZCOJHtW9ZrT8UBRVVT5hk8f9uzubhm8I6SJsbc0dUm7MoQouHQDCEVZFNj5RJ5ldMMVIQfCVJB84HTsKfI1643AR2jWhpublmlyfPn2DTf3DTF4Jjd8znlFMiMoK8W79y/4OGKd5eGLmtLUhCkg4p77u3te3/0KN1nm0TFM0G4aIpqu72jrgvNxj4iJV/f3PH9/5t23nxiHxDhd+PH9j4hYoYRgu1bUdU03OmShmCZPdAPCTazzGxgzTGHIMkWZLwDsEDV1kyOTwA6OomhoVjnWDxS1Ybaey2FivHpyk/FHf5AhzMD1Cj97/fv4LPCv/vl3uCSYpp5pjEghuQ5nwJLlJUZXbJqavvtEGuHtq18ydBdeDh8RKkdoSbsxSMnCtm0b8gRhiHTnC3VlyE3O2E2oPNH3lrqqKUzN/njE2UCW6aW8WK7wHpSQmFxhkycGyFRB0AFVLEUmhCQEBUEzW8/6ZkMQM9ZNGJPjXWScBoJftmKZ0kjg2lnyquDLL2+4f2gZu5nh4qhWFZO7cnm64PuEB+qmpV1r6kKiEHg/c3ieyLOcvJiY7cw0SBQ5dZ6zWRXsNncYbUjR0lQ5b754RUrLgDZ0lqLIybMCNyXmyVLVJavNmna9od1syIsC62akhKpYYOHbpuV8fOZyPmOy7DPWZYCgKc2adbuiyAvKShH1TF23rFY1MQ1oI1FZZWjixQAAHK5JREFUyWg9+9MFF6Cua5q2RkqBcwGVKYbphFRwu3vEWY+PlrZdCie5ybBuWnLKMqe/wHSVrNodVblhtgEtI+tNxRws51NPnjUYU2K0IQa/RIhQyKDQuqDZrIjS00091lvGboCYqBtNN54RouBm8wpSjp+hXWmu/YX9y4jKSvb7A8enC5PtqdcZ23XFOA5MfiATHn/U5OTc3ObAIhCp64J5XPzkm9WK62lis7llu1nhLKRoUCLDmJxLfyEliZ0HrpeOl5cjJpMUpmDsAnYGZSSmyum9QKWWTEpUqdCx4HQ8E0JcwPRZi1EFEsnlPFDkNcePJ0LQbO931HVOqSTVSkDpGezySI9Bkok1QkLEMs6Baz9TFoqqqvjx/XfoQpPCBCphTIXJDE1bY4eZyTpkZnCTRYbEdrPh1J/Jq4yyNMQUCUJRFBXzMNCNF4KJEKExJSRFkoKiEpy7kTkmZgak1GAzyjxDhEhV3NHmLdfTlTgr2q2h62aiy7i/3/HmzS0pTGgVcH6gu4xIVfL1L75mniznw0BipqoU05R4/OKn7G5bopgx9ZoxBJp1TmVq2rJeBA6rDZly3LQFdbnhdF0EAUrnUNzx1U//Dr//h3+KcyPvfvyWV292bG5X2Ah2drRVQV7mlK1BGcVxf+XxYUeYRr7/7W/44fsf+d//t7/i6dORvnPUueH4dMFoj9SCREYSjmkKRBHIipzLdWR2A9YPeK+YR4/JNZfLBa0K2nZDlpVImTBFRjdduZwj2+0tUl/wIbJ/GZnczOPDW5SG/cuZypQYlbFeb3k+PxG9RWmwbub14yPTOPHx4ydub18hpeO0P6GjQYocXQbyVYUl0Y1LSz7FQG4KnJ3JTYPJM8pyeSApkVHVC+7Q2YideoJrKdsH2l3CmJzenaibhHOWomzJVMXQBe7v76iaNbY/c34eyXIIwePJeD5+IleSDy97Xt2tGKeZeRqoy5bNJuOwf+aLN19hjELaDDtE7l/l7A8XnBh588sHUqX5zdOPCFkuV4G1ZmSiHyS9PDEIycfnC8M806xyNhuJkmaxQroKkVqEsjwfeup1tdgr7++IzuGGwNxN7NYN//Dv/+d/8wfV/+a//a9/PXQDdb2lahVlZZBUzFPPZl3TNCXddcZNkuQViEDZKJCa3Gy4Xi/oXJPFgkx6rsPAzXYDk6AsIzebHb/7qwNlJbh/WOOjxXrL5Wh59WrD9999pKoUQkQ+fDhxPF0oCknb1MxDpCwbnp+PhJAQWhOJSL2cs6s65+PTmVePa3yYObx0ZKpESMdf/eZ3XM+OTJU0jUGrlsP+xH7/kabcoYTk+dMTWudonSNURlW2HJ6fqZsMn2b6aUAIxTDOVNUtw3ymrjVFUaGkoa1vUbkgk8sf6bff/Ibr+YW22lLmNXkuuLv7CeMcmVJHP3ZosUbnClXMixVknLH94qhu2i3eyYWtlk7otUEmePv6K372k58sm8j1HeXnYkSmI8KvSNIy2YmiENg5YqeRsiip24lzf6EocoLXfPi0p24qht5yPg7ENCErQEZCilg/UjUCkqGsE87N9M5he0f3cuHxbodROZ8+XPjw4RPeW0xekejwY0CrSD99dhF7wQ+//cTxtKdpN+SlwMUEGZwuE2OfWK/WHO1MUUrCmBgvZ9rqNUKumKJnCleGcWLoRvrLlYyFR5tlmtNxj8kLpIjoXHHurmgNdhCUWmFUoKh6vn4QnHvLtjI83r/mhx/OvPzmwmbbYMczWhu6boDPZp3oPUYrgpvRInDbbCgyQzc90+5KZJlobwuKvOZ86NDlgq1y04jMaprNLUJ8VktWObMbyHVLIuC8pa4KmrqhLAqkUsyzJSVFVa9RxmAqxW69pjQFGE2QNeO8DKAmTwzTkRCXR8H52jMOnml0RK+ADK0MKYoFB+Qlm92Wu4cdwXnsmHHeO4ocZOGYJghzwMdEVhSsylsOTz3nl5kUMs7TQFYuMRnlMwwFbl7O0945rI90neVyOqNVYrXaAIZhmJFSsd2u8TYwD47dbkNZL8Y0HyU2Jrr5ip07tJaIaLCzpSlqpnOkv040ZYvyBZumZbd6IAVJ3Sgyk+jtFZc8yEg3nnj3w3vs5CmrgtEdGf0FoUuKaokueT/TVA11s/7MYT3StCu6y8QwjJR1g7XLx2Rxr/c4H8AkkpRsmhapHSYr+bt/99/j9eMD337/DT7Bw/0rjIGu26OkYh5nYozkuYIwI5MkrxV9ssyTJheKPDes1mumceTS9Uid050t166H5KmrAmSBUBkvx2fm2fPm7Wsef/6KbFVi+4QMhizPSVNGFUqKbCl3pSjRusU6i7UTyecMl8Tj/QOrdc2HD0dSylDZgoob+pnD6QVkxGQlWimKoqUu1qhccHUDo7VUmx1SC+bRs9tu2K1WSO8///9ISJlRFAV3u0eatuLaPWOniaIukbkl4pgnj5KJsqk5nhxVWZFlGUaWGJGzKiuSD9gp8LOf/4ybuwKwSCmYBQhhQEJVaTyJZB25kqzXdzRtxdANzPNMN4zIHPK8xWM4nWc+7Pdc7ISdFWVWk7JE7wQZEj+cuXYn2s2OfpgYbGCSM/0cKHRFcIG7hzV+ssx2JrnIPCXu7rY8nX+E2bDZrNnc1nhbI5MhRkHXjYyDQ1eR2Vnef9xTVRJnJ9r6gdX6gXfHH/l0PLN5/IrnwwsxDGQykAlHbgx9n8jznDAFpF9UrLo2nK+ev/Un/y5/8mf/Do9fvOHh4QvqusaomSJLfHw6M46Qe0PMPPt+ZJx78mhYmR1KTHz6tCdFQ93umLzFbALD5BDUbDYV213L8Xjk8eE1q3ZLIC5otrNls23IC0NwCWKFMTku9LSrmu565XQ6Mk4OpSOn7sDlEjF5hXNnykZwPSmkDhTmnr4fGOYOpUuCS1RlwkWHLiUhTEwjpM+cAilynE1cLz0pzZwOF2IemL2mAPIhI6fkw8cn8hqkzMgoyFVg6BMPX+yo6oyPP+5Rtljy6UNJDAYfAiZmDLGnl4HTx5fP0mnBy6cZmc/oLDJ2luu4Z5g9xigiOVFM3O8eOF4mYuxZ6XwpmsWJ7rpcvW5uK9w0UeQF/fye7hIRVrC63yAq2H+y/MHPfsUP33zD4BWi2jDOI3XdMAdP33vKfCFqxFTQVonVbY2Ujn/x5+94++Zrkk988+03WKv44u2XmCwRfIKYkaKjHw7MsyevVrx5+yV/7z/4B3/zB9X/4X/6x79W+cj9qyWT1FT3/Pjje0KyrHYl3/zmHa9ffclqVdCuC7QpEWLZch1ePlDV8PzDjFaWtlkx9TmXyxNvvrrB24rK1Hx4eebufo0d4cePP3CzfSTaCV0uZqL7m1/wV7/5LUIu+sC8yKnKFSk4VGE5nY48PNwik0IyUxUtWVbyu28+UpSRFC3ruxuqomBi+WieLxFjQMrEw6sd127g+fmJsqx5/vhCP1z4N//sT+jPlsIYqlJipCE3GZdTh85WdMMJo9XCXzt8x836kd12zf55z/Xao0zg6f0BkQliUmSrnFdvH5FOklWa7d0aOw8M0whJs6lrhJ6YBs31cuTNTcvsE4WsKBuDyDTvv/+AVIJXr35CFhUxTrTrFSKTdGO3+L8dS0nCBnQhKIxBRk+pVlR6Q54XKOUQKUdJTYyJ9X3OTZ1jtKbIFFprTIKIgJQxXWBXKL7/zdOCF7GSj4cLairRwlE3FbvdIz+++4i1E01TgspYNwWn0XNiIpiKl/0R92mkHzsGP7PerKlXhs1uBQm8Ddxsa2Di5uaBPCt4fn9kdj0+6b/2xgc5cXjqqUzOZttQFDXtumXoe4iJae6p8gYfRpIcyVSG0ivmeeanv3iLlxmbomSVw3E/cHvzgAuKv/yL95RtiU6SkDLcNGOnSH898/Of/iEyZRwPe86XI0XWYsPM4OYlw+o10Sn2T0eSXcL93o1cphPGFIQwYaTCRouSmlLl2MGRZ4oUZgQTSUBMEa0VWhiSTaybhhgDT88f6a4dCcnT054wSWJ/JvqEVhnCe+wkmNzIPIxM1wmZIqt6TVksDN2qyBDRUeQ5dZOjCdSmJHrJOI+UqyU+YWeHFgq05G53R5m1fHr/ATuPjGGE4OleJuwp8fXrt+x2DWUdebi/BQTea9ys+OXvvWa9rrmcPWVZIpNnHuNiFhp7pu6CVBqhDMfLwjb1wRNjRCtDbkqMzinLjM2qQZHIC8VmW5JwzM7SjxNPz+/o+8vnNrxmvWpJMXC+XoiUbLavaNYV+1NPf5X4kMiN5n6zJjiPc/MSKfAdjg6VFazzFbafGcYRqQXeCdwcOY1nbAJjauzs2dQ35EXB0+mFdl0j8RxfPlKWmiqXMPVcxh5fKIqqXDBd08jT0+GvjWbee/rjiUYLbjcNMiTCDMO0/HzDdUYqwc12zWbbLMXMbmKcRjJtuH3dklUC2w3M/Zm2LTClRAtPXSqqKl/sYsxInVHWiiQjARaEGRYfR4axx04d61VG2yzFjPP5QtMYStOCNzRtznpVLFKOJNGZ5HQd0EkR7ML27a8XNvUaowuMrKmrhkJmFGa5ODy/fGCYJvJVibMTMiuRWbHkNYsKO0ekicjP5TSlCn729U8oC0kqIlpIiDPRJ6yXPO1fmGdLWS6Fs3l25JngeOoZZsV6s8FNgetwJstLdu0tRki26zXzaWQKC9NWoyhROBvorhM6LdrZwQpMW5PVGbIYOZ0vzGOPdIJV3eCVpsprVtmK1TrHpYQQAjuf2a3veXhc42Lg3bszbbVidE+crkfmLvHl2y8xuaQ7XbjZbXBe0FQrLt0LE46EpW0a1kXB3B8o6hyjBfieGCHPV7j5QooTgzuSlxtCKPnbf+ff50/+7N/i+4/fo71kvdvw9PEDjw9v+O633zN4y2gHVtuGaTyjY8JNAp8ETkXGKGhvNvRzj1CKx7d3/39797Jru3KVcfxf5XL5Pu9zXfY++1ySQCACIZ6JNu+QZ6BDCwkJiVehE4RooAAhJzk52Xvd5tX29K1cVTS8e9DPieTfeoG5NL2WR9ljjA/jApQUxNLizcDH35ekxY7Yd3z7u490w3StxjqlbyrieMv5dKUfLkRpxGgNddmS5zt0pPjqyy+ohxbvNCry3K+ngdNMr2nMFWcDjm/P3O8WGCPQOZS3kjjJuVYXnB/xxjEaxzJf0XUV1vZsN1uUijBGsnl4QPuAYBTcPzxy7mqUjmj6E84L/CAQwGK5RYeK6loSypi3pzfSPKM+WXYPCh2n/MVP/4xsE1IdTwTlSB1cSbOU8nIgyabfr8gyfvqjH1Ndbox9QJKkWNMSh/Dp6UgoJD/78z/ldrhitKdtLFrFWD8yKo+VkuZWYTqPs5Kf/PRHGPvCf//HG14OPH61ojWCj99dUL5md7eiHlqq9koqEnaPH1hkS/I8xfUth9cLRbEg8JZokbDIl3w6vHG3L7CjJFIRPjDsVlsOT2fuHrc0ZcuHLzYczsc/jqn/f/jHv/t51Vy5v3tP21WcT+XnOD2PdSPvHr5EBZpQBdR1jRlGdrsdZXUmVIq3wxvvHh94fNhNOfBKIkMLTjIOjq7vGKzFjg1d2xFGIdvNludPT7RDw3q14PX5SqCgWCSYXrJap6hA8XZ4Jck0RbHi/bsvkDJkGBr6Yfy8PiYkK2KSWE8ToFVHnCse9w/8+tcf+ebLD3zzzZ+QFRHf//Yjq80araf1K0We4r0lEAFSAcLj8Zi+53Q+EUUpSTrdYAQh+7s9TTXi3NR+UOQbnp6f2O33JEXCerVDpyFRHFDoHIvn229/zdD1bDZbzGDQYUAcRVSlIUumyNPegRgFSRZxqSoiFZOEiueXJ9IoxnlHIBXH4wGt9ZR+YwxRHCIDz3a7om1rHh/3NLeO/fYe7y1m7JBSopOEvFiSFAlDY7iUDXGcMlrou5Z+tCgVUVUNqyJhsdoRhgohJTKO6IfpqYt3sN7sGIaO9XZH07e0veFweKExN2Tkp9dQLuD0uzNN33P/uGdRLFgsckZrqeqa9XrNaAbSNCGOE95ez3hnp31/PqAfWpz3IBw6iBj6btrF1w+kWUZVlwymZ7/fcLlUfPp45uPHM5vVe1arB8be0dx6ApES4+jbJxargvX+jt98+0rXKSKd8Pbyyma3xY6GJMqIUz0txx8GnDUUeTYdRgIolqvPKUAR1nlGO9K3Pde6nDLUE0WeFBT5Ah1GBFp9jrA1RKEmiiKSOMLjcaOYgh+6ATs6hmEABK8vL9xuNbvdBucsURSzLFbEUcz5ekWFmvVygbWONE+Io4jFIuf+/o793T3ee0ItyfOUoihQKkCqgO39DlQwbbDIEqx1dF1P27VEWcx6uyJNYz5+/IQKJHGs0EnIoih4fHzg7n7JchkxDIbj243jqeP15YzD8v6rHYGSDJ2jHyxNW3O9XLleW/qxJwwDPrz7gn4YOJclQjDtdfUe7wXjaAiDAG8l1gi8C7m89bw91/QtCDK2mzXffP3AsshJ4pQ4TpBBwOVaYcYp9AApWRRLxmHgei1JoohASZSSSDG9+hytJY0jhICyLknSnFBM37kKNdZPh4FbVdMMN9brFSpQmNFiR8f5fJmGEAJFea25Xs7cuprOGKQMEUpTdy3X04Wmuk2hC5EmiSKMGfFeUuTTdLodDW+vB0YzHXbiKEQFIXleoLVGhQHH45GXpzeiJObd+3dI7WmqiiLO0VrRNdPEsLMW5z15uiDLM6ywDKPF2IHejFgPcRRR5FMPcW9HdKRx1hLFGXEaI6XAOUMYaZbrFdZPA6v+84+QgiAIUVJO35kOuNUVeZIjEVzLKzoOyfKMOIlozcBgOnozUNUll/OV3gykcUKRpZh+4Pb56d7gDE4InIW+vVGV5TSRP1ikCrhW1RSfaaY3cTpKKRYpbdsCfipcrcA5ix0Nox8IlUbLiFB6zteKKF5gxJSyUrUtqY4ZnWWz36C05Hw8EAhFkiict0gcXetQQYCwHhVq+tGBHcnCmDgNeX55ZRwMoRIoFeL9yOla0g+OJEo4XZ7Y7HZU5xalAkTg0UqDDIjilO1yRdNUoEKM7TDjSKanp/o6TmlvLaGUHA4VSMl+uyFPl6gg5uH+a4piy93DOxCCW3WmiCO+//Qd//aLf+Hbb39JHIIVjq5pGIxBh4I8LbhcKuIkob5V2NFhBsPlfCEQIefjASkD8iRBOs/z0yekTNjttlSXNzrjiJOYqqooigWRlhyOV1QoWCyLz0W1ZhwFURiRpJqX52ea/gZOEOqAQAQQBOA8Sgu8h+1mTxJH1G3H4GrMYNltt4CjMx1FmlGWN3bbLYPtp/231nE4vDEMHafjmSwMiVRM01b0XY9EoPUUaa51yOV8xDnLYpmh9bSdw3nLu4d3vH+3Z7FIOZ6vhNrxcqgItaZvahb3O4ql4nI6gUsJVULfGupzTb4IsWJECMV2u8XanltjUGrqjx/KhufLATs6oiihbmrk533JQ9MinGOzveN0eOZ2G0jSgvZ2ZRwsaZywyNfs9muMszRNT1ZkrJM1p0vFVx/eU9YV7x72IKDpK4STdGbgbrvjcD4SKnDeM3Q9xTqlvFTc3z1StxfsaPnwxSOXqvrjKFT/6Z///udffv2B8/mGMR2LxYp+aNFRQNu2FFkBHtI0Jk0TkqTgv371nxRFzMP9A5v9lqG/oUOFGUCF09R4ke+oqyu3+jYlb6wzIp1QrAvapkcJiQg8zhraZiRNNePYIkVMqOF8PiOlIEli6qqnKm98//1H0kxjjOXx8ZH61nL/uEXgKesby3RJM1SEBNztv2a5yNFK8/3H3yDE9Lo4kLBe7acFvqPBexDS0zQl10uFUgFBIEnjnFt7YRzctKbjc9xhWb2hAo21AV1n0HFEM9wwxlO1V0zX4Fs37Zv1I48Pj9yajsf7B7I4npqew4Is0Zi2Id9sEGZKuXIChJO40fDu4YE8SzCdJwwDXp+fqa4NRVbwzdcfuJzf8NYymJ4gCKiuJzbLNc5CVV9I0oD9/T1PL0es8wxuoDzeeDmVLJdLBuunHsusoLl1yMDz+nKgbgxxLnh7PjA4gQoFCIPzgsPbCQ+M1jHYEedh6EakivFS0bWWzSLjy7s73n39wOZ+jZIBXnistZhh5HKpWC0X3N3dcz5ckCqcUoH8SJqtKIoYFWqu1RXhHAKIU02xWOBxWGtYr1doHWIGi1IhKpSESjO6nvL6ggot4FH+zKoQpIsVXW/47rsDXuSEKiaQAhWG1FWNHeHuYft57U6PFJ7BdBhj2W43XMpyOmz0hmtVIwNJEqekWcp6uyLJUwIvsdYydhYvPIGQtPWNPMtxVhCq6e8pUJo0yRmGDjtaVqsNaZpireXubocKJMZM1yVCcnq9ghTUdYdwgPSoUOCsRwhPHEW0bcenp08kiSZOPmdyO0ucJqAEnenQkabve46nkijJiPMEHziEnG7w9w/3LJYF682S1XoxLbuXU+EbBIK2mQYI1+sti+WSKNXoOOTp6UjfjahQonRAEhUIFU+xkVGMHUau5ecdpd00ECEEdO107Q6DnYoCqcjShP1uw1/+7Cf81V//mB/9eM/driAOBXkWEYaarhuo64Zb02C9QMcaGUrKS8WtqojThCSK6bse8KRJxGgtQkoWeUbb3LjUVwIVMrYjdXWj7UfarsMMPQLBer8mX2b07UDXGbz1SCGQoUBrTW9Gbk1NlGjCJOZ0vnI6Vp/73wUISV4krIscJQLM4FFqOrDEUczQ93jvef/Fl8RxSBhKNpsNXddyfHsjjiL2d3dkaT71lDnD2/GZUAakYULb1KRpxna741aXSBWQxjmjNVyqK72ZnkQ7KYiSCOkczlrOlwuDMaRJhhRTVHPT1pTVBTOaKdEnCjFmanmKY82tqTldLvS9IdWaKNRUtyvWjggHTXOj6RukCqg/H9xO5ZXRDtO1GodsVlvyYoHDT7tcRz/d2LGcyjNeyOn/MA4VKJ5Pb8Q6Js1iyrIk1jHjaFA6pB/sNOTWD8hAMgyWolhS1VfsOEUpd71h7EbutiuuZc3HpzOr/YZhHJBhQFPf2Ow2vB1eeTu88rjdw2iRyjGYETeMHF9uhFqRhprRjTTDQJGkLJMcEXqGwbFerRHekSQZ1/JCZwyLxRI7WpxosaMji5coFZDmMXXVsN3uGQbDdrXCjj1ChQy2I01zqusN6xxeKsIgQjhHmq4hdHhrWS/27Lfv2e6/JMtX/M+3vyVUAV1d8qtf/pJ//fdfgO9Z5AG2u3E4H8jSDC8kp+MLddkgvEKp4HOUNRzfDkCAM35qj8kL8CO3a0lVVgRBwd39Dm9a+tHjhJs2XWQ5USTxXhHFAeNopntJ03I5l2w3O3Q0BVlcyuPUFzx2MAb0xsAIaRGBhzzNuFyPlNUN1Mg4TA9nqqri1lbYYcQTkKQxURwyjobnl1fuHu5YLDO2qz3l8cg4GPq+ZbNZocOQONHoKGW0ZuqNX+TUTY2K1XToUQq8J89Dvvvt7wi04nj8PU/PNxZFzmod83yuOb+dybMFXdeyWseYoQbnMaOnrj0ey7v3D3hnsG4qgKuqhGFkVI5YT1t0mrZFakl5uREpRRQqLucaHcH5ZPnm6/fTw7EhoO9qzucSHYW0pp/WcBU55dsVM1q0Vqy3G+rqjBeebrihgxhkwPuHB75/+p7tJiUMNe2tI0wk1jhOxwvrXYEbPX1bUTcdf/s3P4wIVeG9/0N/htlsNpvNZrPZ7P+Qf+gPMJvNZrPZbDab/X/mQnU2m81ms9ls9oM0F6qz2Ww2m81msx+kuVCdzWaz2Ww2m/0gzYXqbDabzWaz2ewHaS5UZ7PZbDabzWY/SP8LZAmJMc+m9RMAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Let's plot the result\n", + "show_result_pyplot(model, img, result, score_thr=0.3)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7GrWIJywLV-V" + }, + "source": [ + "## Train a Detector on A Customized Dataset\n", + "\n", + "To train a new detector, there are usually three things to do:\n", + "1. Support a new dataset\n", + "2. Modify the config\n", + "3. Train a new detector\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "E73y5Lru-wBx" + }, + "source": [ + "### Support a new dataset\n", + "\n", + "There are three ways to support a new dataset in MMDetection: \n", + " 1. Reorganize the dataset into a COCO format\n", + " 2. Reorganize the dataset into a middle format\n", + " 3. Implement a new dataset\n", + "\n", + "We recommend the first two methods, as they are usually easier than the third.\n", + "\n", + "In this tutorial, we give an example that converts the data into COCO format because MMDetection **only support evaluating mask AP of dataset in COCO format for now**. Other methods and more advanced usages can be found in the [doc](https://mmdetection.readthedocs.io/en/latest/tutorials/customize_dataset.html).\n", + "\n", + "First, let's download the [the balloon dataset](https://github.com/matterport/Mask_RCNN/tree/master/samples/balloon)." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "rHnw5Q_nARXq", + "outputId": "5993532c-3a6f-46d2-e9ad-428cf44dae60" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2022-02-13 11:41:21-- https://github.com/matterport/Mask_RCNN/releases/download/v2.1/balloon_dataset.zip\n", + "Resolving github.com (github.com)... 52.192.72.89\n", + "Connecting to github.com (github.com)|52.192.72.89|:443... connected.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/107595270/737339e2-2b83-11e8-856a-188034eb3468?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20220213%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20220213T114121Z&X-Amz-Expires=300&X-Amz-Signature=cb1ba2ce6a619db5efdfb4e96bf705e7c37d7d65971b436ae970c0422623f3cf&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=107595270&response-content-disposition=attachment%3B%20filename%3Dballoon_dataset.zip&response-content-type=application%2Foctet-stream [following]\n", + "--2022-02-13 11:41:21-- https://objects.githubusercontent.com/github-production-release-asset-2e65be/107595270/737339e2-2b83-11e8-856a-188034eb3468?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20220213%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20220213T114121Z&X-Amz-Expires=300&X-Amz-Signature=cb1ba2ce6a619db5efdfb4e96bf705e7c37d7d65971b436ae970c0422623f3cf&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=107595270&response-content-disposition=attachment%3B%20filename%3Dballoon_dataset.zip&response-content-type=application%2Foctet-stream\n", + "Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...\n", + "Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.108.133|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 38741381 (37M) [application/octet-stream]\n", + "Saving to: ‘balloon_dataset.zip’\n", + "\n", + "balloon_dataset.zip 100%[===================>] 36.95M 8.75MB/s in 4.2s \n", + "\n", + "2022-02-13 11:41:26 (8.75 MB/s) - ‘balloon_dataset.zip’ saved [38741381/38741381]\n", + "\n" + ] + } + ], + "source": [ + "# download and unzip the data\n", + "!wget https://github.com/matterport/Mask_RCNN/releases/download/v2.1/balloon_dataset.zip\n", + "!unzip balloon_dataset.zip > /dev/null" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Wuwxw1oZRtVZ", + "outputId": "4ee508e8-5acb-450d-c06b-69ceffdc85dd" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading package lists...\n", + "Building dependency tree...\n", + "Reading state information...\n", + "tree is already the newest version (1.7.0-5).\n", + "The following packages were automatically installed and are no longer required:\n", + " cuda-command-line-tools-10-0 cuda-command-line-tools-10-1\n", + " cuda-command-line-tools-11-0 cuda-compiler-10-0 cuda-compiler-10-1\n", + " cuda-compiler-11-0 cuda-cuobjdump-10-0 cuda-cuobjdump-10-1\n", + " cuda-cuobjdump-11-0 cuda-cupti-10-0 cuda-cupti-10-1 cuda-cupti-11-0\n", + " cuda-cupti-dev-11-0 cuda-documentation-10-0 cuda-documentation-10-1\n", + " cuda-documentation-11-0 cuda-documentation-11-1 cuda-gdb-10-0 cuda-gdb-10-1\n", + " cuda-gdb-11-0 cuda-gpu-library-advisor-10-0 cuda-gpu-library-advisor-10-1\n", + " cuda-libraries-10-0 cuda-libraries-10-1 cuda-libraries-11-0\n", + " cuda-memcheck-10-0 cuda-memcheck-10-1 cuda-memcheck-11-0 cuda-nsight-10-0\n", + " cuda-nsight-10-1 cuda-nsight-11-0 cuda-nsight-11-1 cuda-nsight-compute-10-0\n", + " cuda-nsight-compute-10-1 cuda-nsight-compute-11-0 cuda-nsight-compute-11-1\n", + " cuda-nsight-systems-10-1 cuda-nsight-systems-11-0 cuda-nsight-systems-11-1\n", + " cuda-nvcc-10-0 cuda-nvcc-10-1 cuda-nvcc-11-0 cuda-nvdisasm-10-0\n", + " cuda-nvdisasm-10-1 cuda-nvdisasm-11-0 cuda-nvml-dev-10-0 cuda-nvml-dev-10-1\n", + " cuda-nvml-dev-11-0 cuda-nvprof-10-0 cuda-nvprof-10-1 cuda-nvprof-11-0\n", + " cuda-nvprune-10-0 cuda-nvprune-10-1 cuda-nvprune-11-0 cuda-nvtx-10-0\n", + " cuda-nvtx-10-1 cuda-nvtx-11-0 cuda-nvvp-10-0 cuda-nvvp-10-1 cuda-nvvp-11-0\n", + " cuda-nvvp-11-1 cuda-samples-10-0 cuda-samples-10-1 cuda-samples-11-0\n", + " cuda-samples-11-1 cuda-sanitizer-11-0 cuda-sanitizer-api-10-1\n", + " cuda-toolkit-10-0 cuda-toolkit-10-1 cuda-toolkit-11-0 cuda-toolkit-11-1\n", + " cuda-tools-10-0 cuda-tools-10-1 cuda-tools-11-0 cuda-tools-11-1\n", + " cuda-visual-tools-10-0 cuda-visual-tools-10-1 cuda-visual-tools-11-0\n", + " cuda-visual-tools-11-1 default-jre dkms freeglut3 freeglut3-dev\n", + " keyboard-configuration libargon2-0 libcap2 libcryptsetup12\n", + " libdevmapper1.02.1 libfontenc1 libidn11 libip4tc0 libjansson4\n", + " libnvidia-cfg1-510 libnvidia-common-460 libnvidia-common-510\n", + " libnvidia-extra-510 libnvidia-fbc1-510 libnvidia-gl-510 libpam-systemd\n", + " libpolkit-agent-1-0 libpolkit-backend-1-0 libpolkit-gobject-1-0 libxfont2\n", + " libxi-dev libxkbfile1 libxmu-dev libxmu-headers libxnvctrl0 libxtst6\n", + " nsight-compute-2020.2.1 nsight-compute-2022.1.0 nsight-systems-2020.3.2\n", + " nsight-systems-2020.3.4 nsight-systems-2021.5.2 nvidia-dkms-510\n", + " nvidia-kernel-common-510 nvidia-kernel-source-510 nvidia-modprobe\n", + " nvidia-settings openjdk-11-jre policykit-1 policykit-1-gnome python3-xkit\n", + " screen-resolution-extra systemd systemd-sysv udev x11-xkb-utils\n", + " xserver-common xserver-xorg-core-hwe-18.04 xserver-xorg-video-nvidia-510\n", + "Use 'apt autoremove' to remove them.\n", + "0 upgraded, 0 newly installed, 0 to remove and 39 not upgraded.\n", + "balloon\n", + "├── train\n", + "│   ├── 10464445726_6f1e3bbe6a_k.jpg\n", + "│   ├── 12037308314_e16fb3a0f7_k.jpg\n", + "│   ├── 120853323_d4788431b9_b.jpg\n", + "│   ├── 12288043903_fe1ea17a4e_k.jpg\n", + "│   ├── 12288355124_5e340d3de3_k.jpg\n", + "│   ├── 12288446656_2c6a90e6f5_k.jpg\n", + "│   ├── 126700562_8e27720147_b.jpg\n", + "│   ├── 1297451346_5b92bdac08_b.jpg\n", + "│   ├── 14321263043_b76ef054d3_k.jpg\n", + "│   ├── 145053828_e0e748717c_b.jpg\n", + "│   ├── 14666848163_8be8e37562_k.jpg\n", + "│   ├── 15290896925_884ab33fd3_k.jpg\n", + "│   ├── 15331928994_d5b82eb368_k.jpg\n", + "│   ├── 154446334_5d41cd1375_b.jpg\n", + "│   ├── 155815494_800fc9aa32_b.jpg\n", + "│   ├── 15717689633_5f7f78c28e_k.jpg\n", + "│   ├── 16435593892_2aa8118f4a_k.jpg\n", + "│   ├── 17156759330_5af4f5a5b8_k.jpg\n", + "│   ├── 17178818589_16e58fc1e5_k.jpg\n", + "│   ├── 18849792632_aad23ad513_k.jpg\n", + "│   ├── 2311771643_f46392fcc0_b.jpg\n", + "│   ├── 2354829160_3f65a6bf6f_b.jpg\n", + "│   ├── 2385899600_94b68350af_b.jpg\n", + "│   ├── 24362039530_b151b41a52_k.jpg\n", + "│   ├── 25899693952_7c8b8b9edc_k.jpg\n", + "│   ├── 2685563244_b0d5f7eb67_b.jpg\n", + "│   ├── 2937599387_80e7d6e050_b.jpg\n", + "│   ├── 321888854_3723b6f10b_b.jpg\n", + "│   ├── 332344155_71be3a3b22_b.jpg\n", + "│   ├── 3342804367_f43682bb80_b.jpg\n", + "│   ├── 34020010494_e5cb88e1c4_k.jpg\n", + "│   ├── 351678851_e2aeebdafd_b.jpg\n", + "│   ├── 3646097131_e3e1215843_b.jpg\n", + "│   ├── 3927754171_9011487133_b.jpg\n", + "│   ├── 3945575930_ce99a7e98d_b.jpg\n", + "│   ├── 4057490235_2ffdf7d68b_b.jpg\n", + "│   ├── 4543126482_92254ef046_b.jpg\n", + "│   ├── 4552737035_3a0a4105fb_b.jpg\n", + "│   ├── 485227412_e335662bb5_b.jpg\n", + "│   ├── 4864857993_edb62f16ef_b.jpg\n", + "│   ├── 4887227769_acd2e6127d_b.jpg\n", + "│   ├── 489752654_777853a0ba_b.jpg\n", + "│   ├── 4955354786_337a598e4a_b.jpg\n", + "│   ├── 5013250607_26359229b6_b.jpg\n", + "│   ├── 5178670692_63a4365c9c_b.jpg\n", + "│   ├── 518678836_94d58e3839_b.jpg\n", + "│   ├── 5253122239_38b1e7f61c_b.jpg\n", + "│   ├── 53500107_d24b11b3c2_b.jpg\n", + "│   ├── 5560377994_cb597a4af5_b.jpg\n", + "│   ├── 5674044810_2d9e2243ff_b.jpg\n", + "│   ├── 605521662_a470fef77f_b.jpg\n", + "│   ├── 6483318883_21facf57cd_b.jpg\n", + "│   ├── 699765866_abaad7274d_b.jpg\n", + "│   ├── 7178882742_f090f3ce56_k.jpg\n", + "│   ├── 7308740338_591f27b631_k.jpg\n", + "│   ├── 7488015492_0583857ca0_k.jpg\n", + "│   ├── 8436015314_3a678c1005_k.jpg\n", + "│   ├── 873768102_7d931e5fa3_b.jpg\n", + "│   ├── 8758393087_76fcd56bd3_k.jpg\n", + "│   ├── 9210739293_2b0e0d991e_k.jpg\n", + "│   ├── 9330497995_4cf0438cb6_k.jpg\n", + "│   └── via_region_data.json\n", + "└── val\n", + " ├── 14898532020_ba6199dd22_k.jpg\n", + " ├── 16335852991_f55de7958d_k.jpg\n", + " ├── 24631331976_defa3bb61f_k.jpg\n", + " ├── 2917282960_06beee649a_b.jpg\n", + " ├── 3800636873_ace2c2795f_b.jpg\n", + " ├── 3825919971_93fb1ec581_b.jpg\n", + " ├── 410488422_5f8991f26e_b.jpg\n", + " ├── 4581425993_72b9b15fc0_b.jpg\n", + " ├── 4838031651_3e7b5ea5c7_b.jpg\n", + " ├── 5555705118_3390d70abe_b.jpg\n", + " ├── 5603212091_2dfe16ea72_b.jpg\n", + " ├── 6810773040_3d81036d05_k.jpg\n", + " ├── 8053085540_a72bd21a64_k.jpg\n", + " └── via_region_data.json\n", + "\n", + "2 directories, 76 files\n" + ] + } + ], + "source": [ + "# Check the directory structure of the tiny data\n", + "\n", + "# Install tree first\n", + "!apt-get -q install tree\n", + "!tree balloon" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 594 + }, + "id": "YnQQqzOWzE91", + "outputId": "befa7aae-a21b-42c8-c3ee-5cb4f5bf3e57" + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Let's take a look at the dataset image\n", + "import mmcv\n", + "import matplotlib.pyplot as plt\n", + "\n", + "img = mmcv.imread('balloon/train/10464445726_6f1e3bbe6a_k.jpg')\n", + "plt.figure(figsize=(15, 10))\n", + "plt.imshow(mmcv.bgr2rgb(img))\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PMZvtSIl71qi" + }, + "source": [ + "After downloading the data, we need to implement a function to convert the annotation format into the COCO format. Then we can use implemented `COCODataset` to load the data and perform training and evaluation.\n", + "Let's take a look at the annotation json file.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "id": "n7rwalnPd6e1" + }, + "outputs": [], + "source": [ + "# Check the label of a single image\n", + "annotation = mmcv.load('balloon/train/via_region_data.json')" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "keLW7uqJM54Y", + "outputId": "d71b98a7-516b-48d4-852d-373f33b881f4" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'base64_img_data': '',\n", + " 'file_attributes': {},\n", + " 'filename': '34020010494_e5cb88e1c4_k.jpg',\n", + " 'fileref': '',\n", + " 'regions': {'0': {'region_attributes': {},\n", + " 'shape_attributes': {'all_points_x': [1020,\n", + " 1000,\n", + " 994,\n", + " 1003,\n", + " 1023,\n", + " 1050,\n", + " 1089,\n", + " 1134,\n", + " 1190,\n", + " 1265,\n", + " 1321,\n", + " 1361,\n", + " 1403,\n", + " 1428,\n", + " 1442,\n", + " 1445,\n", + " 1441,\n", + " 1427,\n", + " 1400,\n", + " 1361,\n", + " 1316,\n", + " 1269,\n", + " 1228,\n", + " 1198,\n", + " 1207,\n", + " 1210,\n", + " 1190,\n", + " 1177,\n", + " 1172,\n", + " 1174,\n", + " 1170,\n", + " 1153,\n", + " 1127,\n", + " 1104,\n", + " 1061,\n", + " 1032,\n", + " 1020],\n", + " 'all_points_y': [963,\n", + " 899,\n", + " 841,\n", + " 787,\n", + " 738,\n", + " 700,\n", + " 663,\n", + " 638,\n", + " 621,\n", + " 619,\n", + " 643,\n", + " 672,\n", + " 720,\n", + " 765,\n", + " 800,\n", + " 860,\n", + " 896,\n", + " 942,\n", + " 990,\n", + " 1035,\n", + " 1079,\n", + " 1112,\n", + " 1129,\n", + " 1134,\n", + " 1144,\n", + " 1153,\n", + " 1166,\n", + " 1166,\n", + " 1150,\n", + " 1136,\n", + " 1129,\n", + " 1122,\n", + " 1112,\n", + " 1084,\n", + " 1037,\n", + " 989,\n", + " 963],\n", + " 'name': 'polygon'}}},\n", + " 'size': 1115004}" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# The annotation is a dict, and its values looks like the following\n", + "annotation['34020010494_e5cb88e1c4_k.jpg1115004']" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "QA1pFg-FeO3l" + }, + "source": [ + "According to the above observation, each single image has a corresponding annotation containing keys `filename` and `regions` that are necessary for training.\n", + "We need to read annotations of each image and convert them into COCO format as below:\n", + "\n", + "```python\n", + "{\n", + " \"images\": [image],\n", + " \"annotations\": [annotation], \n", + " \"categories\": [category]\n", + "}\n", + "\n", + "\n", + "image = {\n", + " \"id\": int,\n", + " \"width\": int,\n", + " \"height\": int,\n", + " \"file_name\": str,\n", + "}\n", + "\n", + "annotation = {\n", + " \"id\": int,\n", + " \"image_id\": int,\n", + " \"category_id\": int,\n", + " \"segmentation\": RLE or [polygon],\n", + " \"area\": float,\n", + " \"bbox\": [x,y,width,height],\n", + " \"iscrowd\": 0 or 1,\n", + "}\n", + "\n", + "categories = [{\n", + " \"id\": int,\n", + " \"name\": str,\n", + " \"supercategory\": str,\n", + "}]\n", + "```\n", + "**Note**: We only list the necessary keys for training, as shown above. For a full COCO format, please see [here](https://cocodataset.org/#format-data)." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "id": "GdSaB2ad0EdX" + }, + "outputs": [], + "source": [ + "import os.path as osp\n", + "\n", + "def convert_balloon_to_coco(ann_file, out_file, image_prefix):\n", + " data_infos = mmcv.load(ann_file)\n", + "\n", + " annotations = []\n", + " images = []\n", + " obj_count = 0\n", + " for idx, v in enumerate(mmcv.track_iter_progress(data_infos.values())):\n", + " filename = v['filename']\n", + " img_path = osp.join(image_prefix, filename)\n", + " height, width = mmcv.imread(img_path).shape[:2]\n", + "\n", + " images.append(dict(\n", + " id=idx,\n", + " file_name=filename,\n", + " height=height,\n", + " width=width))\n", + "\n", + " bboxes = []\n", + " labels = []\n", + " masks = []\n", + " for _, obj in v['regions'].items():\n", + " assert not obj['region_attributes']\n", + " obj = obj['shape_attributes']\n", + " px = obj['all_points_x']\n", + " py = obj['all_points_y']\n", + " poly = [(x + 0.5, y + 0.5) for x, y in zip(px, py)]\n", + " poly = [p for x in poly for p in x]\n", + "\n", + " x_min, y_min, x_max, y_max = (\n", + " min(px), min(py), max(px), max(py))\n", + "\n", + "\n", + " data_anno = dict(\n", + " image_id=idx,\n", + " id=obj_count,\n", + " category_id=0,\n", + " bbox=[x_min, y_min, x_max - x_min, y_max - y_min],\n", + " area=(x_max - x_min) * (y_max - y_min),\n", + " segmentation=[poly],\n", + " iscrowd=0)\n", + " annotations.append(data_anno)\n", + " obj_count += 1\n", + "\n", + " coco_format_json = dict(\n", + " images=images,\n", + " annotations=annotations,\n", + " categories=[{'id':0, 'name': 'balloon'}])\n", + " mmcv.dump(coco_format_json, out_file)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "G3xV5ktqlpFu", + "outputId": "af264997-25d1-4fc1-91bb-f9f1ff2c68c9" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 61/61, 29.6 task/s, elapsed: 2s, ETA: 0s\n", + "[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 13/13, 28.8 task/s, elapsed: 0s, ETA: 0s\n" + ] + } + ], + "source": [ + "convert_balloon_to_coco(\n", + " 'balloon/train/via_region_data.json',\n", + " 'balloon/train/annotation_coco.json',\n", + " 'balloon/train/')\n", + "convert_balloon_to_coco(\n", + " 'balloon/val/via_region_data.json',\n", + " 'balloon/val/annotation_coco.json',\n", + " 'balloon/val/')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PwqJOpBe-bMj" + }, + "source": [ + "### Modify the config\n", + "\n", + "In the next step, we need to modify the config for the training.\n", + "To accelerate the process, we finetune a detector using a pre-trained detector." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "id": "hamZrlnH-YDD" + }, + "outputs": [], + "source": [ + "from mmcv import Config\n", + "cfg = Config.fromfile('./configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HntziLGq-92Z" + }, + "source": [ + "Given a config that trains a Mask R-CNN on COCO dataset, we need to modify some values to use it for training on the balloon dataset." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "pUbwD8uV0PR8", + "outputId": "0c9ba286-1111-407d-bda4-14d6a262a3e3" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Config:\n", + "model = dict(\n", + " type='MaskRCNN',\n", + " backbone=dict(\n", + " type='ResNet',\n", + " depth=50,\n", + " num_stages=4,\n", + " out_indices=(0, 1, 2, 3),\n", + " frozen_stages=1,\n", + " norm_cfg=dict(type='BN', requires_grad=False),\n", + " norm_eval=True,\n", + " style='caffe',\n", + " init_cfg=dict(\n", + " type='Pretrained',\n", + " checkpoint='open-mmlab://detectron2/resnet50_caffe')),\n", + " neck=dict(\n", + " type='FPN',\n", + " in_channels=[256, 512, 1024, 2048],\n", + " out_channels=256,\n", + " num_outs=5),\n", + " rpn_head=dict(\n", + " type='RPNHead',\n", + " in_channels=256,\n", + " feat_channels=256,\n", + " anchor_generator=dict(\n", + " type='AnchorGenerator',\n", + " scales=[8],\n", + " ratios=[0.5, 1.0, 2.0],\n", + " strides=[4, 8, 16, 32, 64]),\n", + " bbox_coder=dict(\n", + " type='DeltaXYWHBBoxCoder',\n", + " target_means=[0.0, 0.0, 0.0, 0.0],\n", + " target_stds=[1.0, 1.0, 1.0, 1.0]),\n", + " loss_cls=dict(\n", + " type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0),\n", + " loss_bbox=dict(type='L1Loss', loss_weight=1.0)),\n", + " roi_head=dict(\n", + " type='StandardRoIHead',\n", + " bbox_roi_extractor=dict(\n", + " type='SingleRoIExtractor',\n", + " roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0),\n", + " out_channels=256,\n", + " featmap_strides=[4, 8, 16, 32]),\n", + " bbox_head=dict(\n", + " type='Shared2FCBBoxHead',\n", + " in_channels=256,\n", + " fc_out_channels=1024,\n", + " roi_feat_size=7,\n", + " num_classes=1,\n", + " bbox_coder=dict(\n", + " type='DeltaXYWHBBoxCoder',\n", + " target_means=[0.0, 0.0, 0.0, 0.0],\n", + " target_stds=[0.1, 0.1, 0.2, 0.2]),\n", + " reg_class_agnostic=False,\n", + " loss_cls=dict(\n", + " type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0),\n", + " loss_bbox=dict(type='L1Loss', loss_weight=1.0)),\n", + " mask_roi_extractor=dict(\n", + " type='SingleRoIExtractor',\n", + " roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0),\n", + " out_channels=256,\n", + " featmap_strides=[4, 8, 16, 32]),\n", + " mask_head=dict(\n", + " type='FCNMaskHead',\n", + " num_convs=4,\n", + " in_channels=256,\n", + " conv_out_channels=256,\n", + " num_classes=1,\n", + " loss_mask=dict(\n", + " type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))),\n", + " train_cfg=dict(\n", + " rpn=dict(\n", + " assigner=dict(\n", + " type='MaxIoUAssigner',\n", + " pos_iou_thr=0.7,\n", + " neg_iou_thr=0.3,\n", + " min_pos_iou=0.3,\n", + " match_low_quality=True,\n", + " ignore_iof_thr=-1),\n", + " sampler=dict(\n", + " type='RandomSampler',\n", + " num=256,\n", + " pos_fraction=0.5,\n", + " neg_pos_ub=-1,\n", + " add_gt_as_proposals=False),\n", + " allowed_border=-1,\n", + " pos_weight=-1,\n", + " debug=False),\n", + " rpn_proposal=dict(\n", + " nms_pre=2000,\n", + " max_per_img=1000,\n", + " nms=dict(type='nms', iou_threshold=0.7),\n", + " min_bbox_size=0),\n", + " rcnn=dict(\n", + " assigner=dict(\n", + " type='MaxIoUAssigner',\n", + " pos_iou_thr=0.5,\n", + " neg_iou_thr=0.5,\n", + " min_pos_iou=0.5,\n", + " match_low_quality=True,\n", + " ignore_iof_thr=-1),\n", + " sampler=dict(\n", + " type='RandomSampler',\n", + " num=512,\n", + " pos_fraction=0.25,\n", + " neg_pos_ub=-1,\n", + " add_gt_as_proposals=True),\n", + " mask_size=28,\n", + " pos_weight=-1,\n", + " debug=False)),\n", + " test_cfg=dict(\n", + " rpn=dict(\n", + " nms_pre=1000,\n", + " max_per_img=1000,\n", + " nms=dict(type='nms', iou_threshold=0.7),\n", + " min_bbox_size=0),\n", + " rcnn=dict(\n", + " score_thr=0.05,\n", + " nms=dict(type='nms', iou_threshold=0.5),\n", + " max_per_img=100,\n", + " mask_thr_binary=0.5)))\n", + "dataset_type = 'COCODataset'\n", + "data_root = 'data/coco/'\n", + "img_norm_cfg = dict(\n", + " mean=[103.53, 116.28, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False)\n", + "train_pipeline = [\n", + " dict(type='LoadImageFromFile'),\n", + " dict(\n", + " type='LoadAnnotations',\n", + " with_bbox=True,\n", + " with_mask=True,\n", + " poly2mask=False),\n", + " dict(\n", + " type='Resize',\n", + " img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736),\n", + " (1333, 768), (1333, 800)],\n", + " multiscale_mode='value',\n", + " keep_ratio=True),\n", + " dict(type='RandomFlip', flip_ratio=0.5),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[103.53, 116.28, 123.675],\n", + " std=[1.0, 1.0, 1.0],\n", + " to_rgb=False),\n", + " dict(type='Pad', size_divisor=32),\n", + " dict(type='DefaultFormatBundle'),\n", + " dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks'])\n", + "]\n", + "test_pipeline = [\n", + " dict(type='LoadImageFromFile'),\n", + " dict(\n", + " type='MultiScaleFlipAug',\n", + " img_scale=(1333, 800),\n", + " flip=False,\n", + " transforms=[\n", + " dict(type='Resize', keep_ratio=True),\n", + " dict(type='RandomFlip'),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[103.53, 116.28, 123.675],\n", + " std=[1.0, 1.0, 1.0],\n", + " to_rgb=False),\n", + " dict(type='Pad', size_divisor=32),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='Collect', keys=['img'])\n", + " ])\n", + "]\n", + "data = dict(\n", + " samples_per_gpu=2,\n", + " workers_per_gpu=2,\n", + " train=dict(\n", + " type='CocoDataset',\n", + " ann_file='balloon/train/annotation_coco.json',\n", + " img_prefix='balloon/train/',\n", + " pipeline=[\n", + " dict(type='LoadImageFromFile'),\n", + " dict(\n", + " type='LoadAnnotations',\n", + " with_bbox=True,\n", + " with_mask=True,\n", + " poly2mask=False),\n", + " dict(\n", + " type='Resize',\n", + " img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736),\n", + " (1333, 768), (1333, 800)],\n", + " multiscale_mode='value',\n", + " keep_ratio=True),\n", + " dict(type='RandomFlip', flip_ratio=0.5),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[103.53, 116.28, 123.675],\n", + " std=[1.0, 1.0, 1.0],\n", + " to_rgb=False),\n", + " dict(type='Pad', size_divisor=32),\n", + " dict(type='DefaultFormatBundle'),\n", + " dict(\n", + " type='Collect',\n", + " keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks'])\n", + " ],\n", + " classes=('balloon', )),\n", + " val=dict(\n", + " type='CocoDataset',\n", + " ann_file='balloon/val/annotation_coco.json',\n", + " img_prefix='balloon/val/',\n", + " pipeline=[\n", + " dict(type='LoadImageFromFile'),\n", + " dict(\n", + " type='MultiScaleFlipAug',\n", + " img_scale=(1333, 800),\n", + " flip=False,\n", + " transforms=[\n", + " dict(type='Resize', keep_ratio=True),\n", + " dict(type='RandomFlip'),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[103.53, 116.28, 123.675],\n", + " std=[1.0, 1.0, 1.0],\n", + " to_rgb=False),\n", + " dict(type='Pad', size_divisor=32),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='Collect', keys=['img'])\n", + " ])\n", + " ],\n", + " classes=('balloon', )),\n", + " test=dict(\n", + " type='CocoDataset',\n", + " ann_file='balloon/val/annotation_coco.json',\n", + " img_prefix='balloon/val/',\n", + " pipeline=[\n", + " dict(type='LoadImageFromFile'),\n", + " dict(\n", + " type='MultiScaleFlipAug',\n", + " img_scale=(1333, 800),\n", + " flip=False,\n", + " transforms=[\n", + " dict(type='Resize', keep_ratio=True),\n", + " dict(type='RandomFlip'),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[103.53, 116.28, 123.675],\n", + " std=[1.0, 1.0, 1.0],\n", + " to_rgb=False),\n", + " dict(type='Pad', size_divisor=32),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='Collect', keys=['img'])\n", + " ])\n", + " ],\n", + " classes=('balloon', )))\n", + "evaluation = dict(metric=['bbox', 'segm'], interval=12)\n", + "optimizer = dict(type='SGD', lr=0.0025, momentum=0.9, weight_decay=0.0001)\n", + "optimizer_config = dict(grad_clip=None)\n", + "lr_config = dict(\n", + " policy='step',\n", + " warmup=None,\n", + " warmup_iters=500,\n", + " warmup_ratio=0.001,\n", + " step=[8, 11])\n", + "runner = dict(type='EpochBasedRunner', max_epochs=12)\n", + "checkpoint_config = dict(interval=12)\n", + "log_config = dict(\n", + " interval=10,\n", + " hooks=[dict(type='TextLoggerHook'),\n", + " dict(type='TensorboardLoggerHook')])\n", + "custom_hooks = [dict(type='NumClassCheckHook')]\n", + "dist_params = dict(backend='nccl')\n", + "log_level = 'INFO'\n", + "load_from = 'checkpoints/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth'\n", + "resume_from = None\n", + "workflow = [('train', 1)]\n", + "opencv_num_threads = 0\n", + "mp_start_method = 'fork'\n", + "work_dir = './tutorial_exps'\n", + "seed = 0\n", + "gpu_ids = range(0, 1)\n", + "\n" + ] + } + ], + "source": [ + "from mmdet.apis import set_random_seed\n", + "\n", + "# Modify dataset type and path\n", + "cfg.dataset_type = 'COCODataset'\n", + "\n", + "cfg.data.test.ann_file = 'balloon/val/annotation_coco.json'\n", + "cfg.data.test.img_prefix = 'balloon/val/'\n", + "cfg.data.test.classes = ('balloon',)\n", + "\n", + "cfg.data.train.ann_file = 'balloon/train/annotation_coco.json'\n", + "cfg.data.train.img_prefix = 'balloon/train/'\n", + "cfg.data.train.classes = ('balloon',)\n", + "\n", + "\n", + "cfg.data.val.ann_file = 'balloon/val/annotation_coco.json'\n", + "cfg.data.val.img_prefix = 'balloon/val/'\n", + "cfg.data.val.classes = ('balloon',)\n", + "\n", + "# modify num classes of the model in box head and mask head\n", + "cfg.model.roi_head.bbox_head.num_classes = 1\n", + "cfg.model.roi_head.mask_head.num_classes = 1\n", + "\n", + "# We can still the pre-trained Mask RCNN model to obtain a higher performance\n", + "cfg.load_from = 'checkpoints/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth'\n", + "\n", + "# Set up working dir to save files and logs.\n", + "cfg.work_dir = './tutorial_exps'\n", + "\n", + "# The original learning rate (LR) is set for 8-GPU training.\n", + "# We divide it by 8 since we only use one GPU.\n", + "cfg.optimizer.lr = 0.02 / 8\n", + "cfg.lr_config.warmup = None\n", + "cfg.log_config.interval = 10\n", + "\n", + "# We can set the evaluation interval to reduce the evaluation times\n", + "cfg.evaluation.interval = 12\n", + "# We can set the checkpoint saving interval to reduce the storage cost\n", + "cfg.checkpoint_config.interval = 12\n", + "\n", + "# Set seed thus the results are more reproducible\n", + "cfg.seed = 0\n", + "set_random_seed(0, deterministic=False)\n", + "cfg.gpu_ids = range(1)\n", + "\n", + "# We can also use tensorboard to log the training process\n", + "cfg.log_config.hooks = [\n", + " dict(type='TextLoggerHook'),\n", + " dict(type='TensorboardLoggerHook')]\n", + "\n", + "# We can initialize the logger for training and have a look\n", + "# at the final config used for training\n", + "print(f'Config:\\n{cfg.pretty_text}')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "111W_oZV_3wa" + }, + "source": [ + "### Train a new detector\n", + "\n", + "Finally, lets initialize the dataset and detector, then train a new detector!" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "7WBWHu010PN3", + "outputId": "5c9b1ed6-393a-42fc-e16a-b5a805f394a9" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loading annotations into memory...\n", + "Done (t=0.01s)\n", + "creating index...\n", + "index created!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-02-13 11:41:34,851 - mmdet - INFO - load checkpoint from local path: checkpoints/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth\n", + "2022-02-13 11:41:35,014 - mmdet - WARNING - The model and loaded state dict do not match exactly\n", + "\n", + "size mismatch for roi_head.bbox_head.fc_cls.weight: copying a param with shape torch.Size([81, 1024]) from checkpoint, the shape in current model is torch.Size([2, 1024]).\n", + "size mismatch for roi_head.bbox_head.fc_cls.bias: copying a param with shape torch.Size([81]) from checkpoint, the shape in current model is torch.Size([2]).\n", + "size mismatch for roi_head.bbox_head.fc_reg.weight: copying a param with shape torch.Size([320, 1024]) from checkpoint, the shape in current model is torch.Size([4, 1024]).\n", + "size mismatch for roi_head.bbox_head.fc_reg.bias: copying a param with shape torch.Size([320]) from checkpoint, the shape in current model is torch.Size([4]).\n", + "size mismatch for roi_head.mask_head.conv_logits.weight: copying a param with shape torch.Size([80, 256, 1, 1]) from checkpoint, the shape in current model is torch.Size([1, 256, 1, 1]).\n", + "size mismatch for roi_head.mask_head.conv_logits.bias: copying a param with shape torch.Size([80]) from checkpoint, the shape in current model is torch.Size([1]).\n", + "2022-02-13 11:41:35,024 - mmdet - INFO - Start running, host: root@5e282d87a36d, work_dir: /content/mmdetection/tutorial_exps\n", + "2022-02-13 11:41:35,026 - mmdet - INFO - Hooks will be executed in the following order:\n", + "before_run:\n", + "(VERY_HIGH ) StepLrUpdaterHook \n", + "(NORMAL ) CheckpointHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + "(VERY_LOW ) TensorboardLoggerHook \n", + " -------------------- \n", + "before_train_epoch:\n", + "(VERY_HIGH ) StepLrUpdaterHook \n", + "(NORMAL ) NumClassCheckHook \n", + "(LOW ) IterTimerHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + "(VERY_LOW ) TensorboardLoggerHook \n", + " -------------------- \n", + "before_train_iter:\n", + "(VERY_HIGH ) StepLrUpdaterHook \n", + "(LOW ) IterTimerHook \n", + "(LOW ) EvalHook \n", + " -------------------- \n", + "after_train_iter:\n", + "(ABOVE_NORMAL) OptimizerHook \n", + "(NORMAL ) CheckpointHook \n", + "(LOW ) IterTimerHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + "(VERY_LOW ) TensorboardLoggerHook \n", + " -------------------- \n", + "after_train_epoch:\n", + "(NORMAL ) CheckpointHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + "(VERY_LOW ) TensorboardLoggerHook \n", + " -------------------- \n", + "before_val_epoch:\n", + "(NORMAL ) NumClassCheckHook \n", + "(LOW ) IterTimerHook \n", + "(VERY_LOW ) TextLoggerHook \n", + "(VERY_LOW ) TensorboardLoggerHook \n", + " -------------------- \n", + "before_val_iter:\n", + "(LOW ) IterTimerHook \n", + " -------------------- \n", + "after_val_iter:\n", + "(LOW ) IterTimerHook \n", + " -------------------- \n", + "after_val_epoch:\n", + "(VERY_LOW ) TextLoggerHook \n", + "(VERY_LOW ) TensorboardLoggerHook \n", + " -------------------- \n", + "after_run:\n", + "(VERY_LOW ) TextLoggerHook \n", + "(VERY_LOW ) TensorboardLoggerHook \n", + " -------------------- \n", + "2022-02-13 11:41:35,030 - mmdet - INFO - workflow: [('train', 1)], max: 12 epochs\n", + "2022-02-13 11:41:35,031 - mmdet - INFO - Checkpoints will be saved to /content/mmdetection/tutorial_exps by HardDiskBackend.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loading annotations into memory...\n", + "Done (t=0.00s)\n", + "creating index...\n", + "index created!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-02-13 11:41:56,214 - mmdet - INFO - Epoch [1][10/31]\tlr: 2.500e-03, eta: 0:10:53, time: 1.804, data_time: 0.245, memory: 3642, loss_rpn_cls: 0.0300, loss_rpn_bbox: 0.0167, loss_cls: 0.3630, acc: 84.1797, loss_bbox: 0.4075, loss_mask: 0.4678, loss: 1.2850\n", + "2022-02-13 11:42:11,324 - mmdet - INFO - Epoch [1][20/31]\tlr: 2.500e-03, eta: 0:09:44, time: 1.517, data_time: 0.091, memory: 3692, loss_rpn_cls: 0.0335, loss_rpn_bbox: 0.0144, loss_cls: 0.1382, acc: 96.0742, loss_bbox: 0.3001, loss_mask: 0.1131, loss: 0.5993\n", + "2022-02-13 11:42:26,183 - mmdet - INFO - Epoch [1][30/31]\tlr: 2.500e-03, eta: 0:09:07, time: 1.478, data_time: 0.085, memory: 3692, loss_rpn_cls: 0.0210, loss_rpn_bbox: 0.0104, loss_cls: 0.0643, acc: 97.6172, loss_bbox: 0.1328, loss_mask: 0.1230, loss: 0.3515\n", + "2022-02-13 11:42:44,524 - mmdet - INFO - Epoch [2][10/31]\tlr: 2.500e-03, eta: 0:08:42, time: 1.666, data_time: 0.245, memory: 3692, loss_rpn_cls: 0.0078, loss_rpn_bbox: 0.0075, loss_cls: 0.0546, acc: 97.8125, loss_bbox: 0.1013, loss_mask: 0.0632, loss: 0.2345\n", + "2022-02-13 11:42:59,439 - mmdet - INFO - Epoch [2][20/31]\tlr: 2.500e-03, eta: 0:08:21, time: 1.500, data_time: 0.090, memory: 3692, loss_rpn_cls: 0.0151, loss_rpn_bbox: 0.0125, loss_cls: 0.0680, acc: 97.6172, loss_bbox: 0.1259, loss_mask: 0.1011, loss: 0.3225\n", + "2022-02-13 11:43:14,733 - mmdet - INFO - Epoch [2][30/31]\tlr: 2.500e-03, eta: 0:08:03, time: 1.526, data_time: 0.081, memory: 3692, loss_rpn_cls: 0.0103, loss_rpn_bbox: 0.0118, loss_cls: 0.0805, acc: 96.9727, loss_bbox: 0.1343, loss_mask: 0.1026, loss: 0.3394\n", + "2022-02-13 11:43:33,227 - mmdet - INFO - Epoch [3][10/31]\tlr: 2.500e-03, eta: 0:07:44, time: 1.666, data_time: 0.239, memory: 3692, loss_rpn_cls: 0.0068, loss_rpn_bbox: 0.0052, loss_cls: 0.0446, acc: 98.4961, loss_bbox: 0.0672, loss_mask: 0.0573, loss: 0.1810\n", + "2022-02-13 11:43:47,886 - mmdet - INFO - Epoch [3][20/31]\tlr: 2.500e-03, eta: 0:07:26, time: 1.467, data_time: 0.084, memory: 3692, loss_rpn_cls: 0.0047, loss_rpn_bbox: 0.0108, loss_cls: 0.0605, acc: 97.5293, loss_bbox: 0.1027, loss_mask: 0.0806, loss: 0.2593\n", + "2022-02-13 11:44:03,271 - mmdet - INFO - Epoch [3][30/31]\tlr: 2.500e-03, eta: 0:07:11, time: 1.539, data_time: 0.083, memory: 3692, loss_rpn_cls: 0.0051, loss_rpn_bbox: 0.0159, loss_cls: 0.0767, acc: 96.8652, loss_bbox: 0.1379, loss_mask: 0.0835, loss: 0.3191\n", + "2022-02-13 11:44:21,725 - mmdet - INFO - Epoch [4][10/31]\tlr: 2.500e-03, eta: 0:06:53, time: 1.679, data_time: 0.244, memory: 3692, loss_rpn_cls: 0.0037, loss_rpn_bbox: 0.0110, loss_cls: 0.0645, acc: 97.5586, loss_bbox: 0.1028, loss_mask: 0.0741, loss: 0.2560\n", + "2022-02-13 11:44:36,092 - mmdet - INFO - Epoch [4][20/31]\tlr: 2.500e-03, eta: 0:06:35, time: 1.434, data_time: 0.081, memory: 3692, loss_rpn_cls: 0.0039, loss_rpn_bbox: 0.0103, loss_cls: 0.0516, acc: 97.9102, loss_bbox: 0.0752, loss_mask: 0.0608, loss: 0.2018\n", + "2022-02-13 11:44:51,949 - mmdet - INFO - Epoch [4][30/31]\tlr: 2.500e-03, eta: 0:06:21, time: 1.579, data_time: 0.084, memory: 3796, loss_rpn_cls: 0.0052, loss_rpn_bbox: 0.0103, loss_cls: 0.0556, acc: 97.8516, loss_bbox: 0.0947, loss_mask: 0.0708, loss: 0.2367\n", + "2022-02-13 11:45:10,505 - mmdet - INFO - Epoch [5][10/31]\tlr: 2.500e-03, eta: 0:06:04, time: 1.691, data_time: 0.237, memory: 3796, loss_rpn_cls: 0.0037, loss_rpn_bbox: 0.0089, loss_cls: 0.0433, acc: 98.2715, loss_bbox: 0.0773, loss_mask: 0.0637, loss: 0.1970\n", + "2022-02-13 11:45:25,370 - mmdet - INFO - Epoch [5][20/31]\tlr: 2.500e-03, eta: 0:05:48, time: 1.490, data_time: 0.082, memory: 3855, loss_rpn_cls: 0.0036, loss_rpn_bbox: 0.0108, loss_cls: 0.0528, acc: 97.9395, loss_bbox: 0.0800, loss_mask: 0.0566, loss: 0.2038\n", + "2022-02-13 11:45:40,909 - mmdet - INFO - Epoch [5][30/31]\tlr: 2.500e-03, eta: 0:05:33, time: 1.536, data_time: 0.078, memory: 3855, loss_rpn_cls: 0.0035, loss_rpn_bbox: 0.0119, loss_cls: 0.0467, acc: 98.2715, loss_bbox: 0.0945, loss_mask: 0.0845, loss: 0.2412\n", + "2022-02-13 11:45:59,548 - mmdet - INFO - Epoch [6][10/31]\tlr: 2.500e-03, eta: 0:05:17, time: 1.700, data_time: 0.244, memory: 3855, loss_rpn_cls: 0.0028, loss_rpn_bbox: 0.0062, loss_cls: 0.0324, acc: 98.8477, loss_bbox: 0.0624, loss_mask: 0.0499, loss: 0.1536\n", + "2022-02-13 11:46:14,173 - mmdet - INFO - Epoch [6][20/31]\tlr: 2.500e-03, eta: 0:05:01, time: 1.474, data_time: 0.087, memory: 3855, loss_rpn_cls: 0.0061, loss_rpn_bbox: 0.0104, loss_cls: 0.0569, acc: 97.7441, loss_bbox: 0.0969, loss_mask: 0.0968, loss: 0.2671\n", + "2022-02-13 11:46:29,226 - mmdet - INFO - Epoch [6][30/31]\tlr: 2.500e-03, eta: 0:04:45, time: 1.503, data_time: 0.076, memory: 3855, loss_rpn_cls: 0.0040, loss_rpn_bbox: 0.0092, loss_cls: 0.0419, acc: 98.5352, loss_bbox: 0.0766, loss_mask: 0.0748, loss: 0.2066\n", + "2022-02-13 11:46:48,076 - mmdet - INFO - Epoch [7][10/31]\tlr: 2.500e-03, eta: 0:04:28, time: 1.690, data_time: 0.238, memory: 3867, loss_rpn_cls: 0.0026, loss_rpn_bbox: 0.0057, loss_cls: 0.0278, acc: 98.9355, loss_bbox: 0.0514, loss_mask: 0.0636, loss: 0.1511\n", + "2022-02-13 11:47:02,801 - mmdet - INFO - Epoch [7][20/31]\tlr: 2.500e-03, eta: 0:04:13, time: 1.487, data_time: 0.092, memory: 3867, loss_rpn_cls: 0.0026, loss_rpn_bbox: 0.0049, loss_cls: 0.0327, acc: 98.6133, loss_bbox: 0.0656, loss_mask: 0.0596, loss: 0.1654\n", + "2022-02-13 11:47:18,660 - mmdet - INFO - Epoch [7][30/31]\tlr: 2.500e-03, eta: 0:03:58, time: 1.577, data_time: 0.076, memory: 3867, loss_rpn_cls: 0.0033, loss_rpn_bbox: 0.0145, loss_cls: 0.0619, acc: 97.5000, loss_bbox: 0.1103, loss_mask: 0.0882, loss: 0.2781\n", + "2022-02-13 11:47:37,321 - mmdet - INFO - Epoch [8][10/31]\tlr: 2.500e-03, eta: 0:03:41, time: 1.696, data_time: 0.234, memory: 3867, loss_rpn_cls: 0.0019, loss_rpn_bbox: 0.0073, loss_cls: 0.0365, acc: 98.6426, loss_bbox: 0.0668, loss_mask: 0.0605, loss: 0.1730\n", + "2022-02-13 11:47:52,276 - mmdet - INFO - Epoch [8][20/31]\tlr: 2.500e-03, eta: 0:03:26, time: 1.509, data_time: 0.093, memory: 3867, loss_rpn_cls: 0.0013, loss_rpn_bbox: 0.0068, loss_cls: 0.0320, acc: 98.7695, loss_bbox: 0.0625, loss_mask: 0.0638, loss: 0.1663\n", + "2022-02-13 11:48:07,563 - mmdet - INFO - Epoch [8][30/31]\tlr: 2.500e-03, eta: 0:03:10, time: 1.519, data_time: 0.076, memory: 3867, loss_rpn_cls: 0.0024, loss_rpn_bbox: 0.0103, loss_cls: 0.0368, acc: 98.5938, loss_bbox: 0.0723, loss_mask: 0.0679, loss: 0.1897\n", + "2022-02-13 11:48:25,899 - mmdet - INFO - Epoch [9][10/31]\tlr: 2.500e-04, eta: 0:02:54, time: 1.670, data_time: 0.236, memory: 3867, loss_rpn_cls: 0.0025, loss_rpn_bbox: 0.0095, loss_cls: 0.0372, acc: 98.5449, loss_bbox: 0.0633, loss_mask: 0.0541, loss: 0.1666\n", + "2022-02-13 11:48:40,549 - mmdet - INFO - Epoch [9][20/31]\tlr: 2.500e-04, eta: 0:02:38, time: 1.473, data_time: 0.081, memory: 3867, loss_rpn_cls: 0.0015, loss_rpn_bbox: 0.0080, loss_cls: 0.0378, acc: 98.6035, loss_bbox: 0.0641, loss_mask: 0.0609, loss: 0.1724\n", + "2022-02-13 11:48:55,935 - mmdet - INFO - Epoch [9][30/31]\tlr: 2.500e-04, eta: 0:02:23, time: 1.526, data_time: 0.072, memory: 3867, loss_rpn_cls: 0.0020, loss_rpn_bbox: 0.0075, loss_cls: 0.0281, acc: 99.0137, loss_bbox: 0.0551, loss_mask: 0.0658, loss: 0.1585\n", + "2022-02-13 11:49:14,390 - mmdet - INFO - Epoch [10][10/31]\tlr: 2.500e-04, eta: 0:02:06, time: 1.681, data_time: 0.244, memory: 3867, loss_rpn_cls: 0.0013, loss_rpn_bbox: 0.0065, loss_cls: 0.0251, acc: 99.1309, loss_bbox: 0.0526, loss_mask: 0.0564, loss: 0.1418\n", + "2022-02-13 11:49:29,412 - mmdet - INFO - Epoch [10][20/31]\tlr: 2.500e-04, eta: 0:01:51, time: 1.505, data_time: 0.087, memory: 3867, loss_rpn_cls: 0.0024, loss_rpn_bbox: 0.0101, loss_cls: 0.0444, acc: 98.1543, loss_bbox: 0.0755, loss_mask: 0.0656, loss: 0.1979\n", + "2022-02-13 11:49:44,314 - mmdet - INFO - Epoch [10][30/31]\tlr: 2.500e-04, eta: 0:01:35, time: 1.488, data_time: 0.083, memory: 3867, loss_rpn_cls: 0.0020, loss_rpn_bbox: 0.0041, loss_cls: 0.0262, acc: 98.8672, loss_bbox: 0.0439, loss_mask: 0.0496, loss: 0.1258\n", + "2022-02-13 11:50:02,842 - mmdet - INFO - Epoch [11][10/31]\tlr: 2.500e-04, eta: 0:01:19, time: 1.688, data_time: 0.252, memory: 3867, loss_rpn_cls: 0.0028, loss_rpn_bbox: 0.0125, loss_cls: 0.0416, acc: 98.4570, loss_bbox: 0.0738, loss_mask: 0.0673, loss: 0.1980\n", + "2022-02-13 11:50:17,905 - mmdet - INFO - Epoch [11][20/31]\tlr: 2.500e-04, eta: 0:01:03, time: 1.510, data_time: 0.086, memory: 3867, loss_rpn_cls: 0.0013, loss_rpn_bbox: 0.0052, loss_cls: 0.0269, acc: 99.0234, loss_bbox: 0.0567, loss_mask: 0.0561, loss: 0.1461\n", + "2022-02-13 11:50:33,036 - mmdet - INFO - Epoch [11][30/31]\tlr: 2.500e-04, eta: 0:00:48, time: 1.500, data_time: 0.082, memory: 3867, loss_rpn_cls: 0.0013, loss_rpn_bbox: 0.0038, loss_cls: 0.0232, acc: 99.1113, loss_bbox: 0.0437, loss_mask: 0.0547, loss: 0.1268\n", + "2022-02-13 11:50:51,703 - mmdet - INFO - Epoch [12][10/31]\tlr: 2.500e-05, eta: 0:00:31, time: 1.700, data_time: 0.245, memory: 3867, loss_rpn_cls: 0.0016, loss_rpn_bbox: 0.0074, loss_cls: 0.0321, acc: 98.8379, loss_bbox: 0.0612, loss_mask: 0.0629, loss: 0.1653\n", + "2022-02-13 11:51:06,711 - mmdet - INFO - Epoch [12][20/31]\tlr: 2.500e-05, eta: 0:00:16, time: 1.509, data_time: 0.091, memory: 3867, loss_rpn_cls: 0.0013, loss_rpn_bbox: 0.0067, loss_cls: 0.0397, acc: 98.5059, loss_bbox: 0.0688, loss_mask: 0.0661, loss: 0.1825\n", + "2022-02-13 11:51:21,732 - mmdet - INFO - Epoch [12][30/31]\tlr: 2.500e-05, eta: 0:00:01, time: 1.503, data_time: 0.081, memory: 3867, loss_rpn_cls: 0.0012, loss_rpn_bbox: 0.0056, loss_cls: 0.0224, acc: 99.1504, loss_bbox: 0.0376, loss_mask: 0.0485, loss: 0.1153\n", + "2022-02-13 11:51:22,692 - mmdet - INFO - Saving checkpoint at 12 epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 13/13, 2.0 task/s, elapsed: 6s, ETA: 0s" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-02-13 11:51:32,064 - mmdet - INFO - Evaluating bbox...\n", + "2022-02-13 11:51:32,116 - mmdet - INFO - \n", + " Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.796\n", + " Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=1000 ] = 0.904\n", + " Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=1000 ] = 0.879\n", + " Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.202\n", + " Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.662\n", + " Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.873\n", + " Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.830\n", + " Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=300 ] = 0.830\n", + " Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=1000 ] = 0.830\n", + " Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.200\n", + " Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.725\n", + " Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.900\n", + "\n", + "2022-02-13 11:51:32,117 - mmdet - INFO - Evaluating segm...\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading and preparing results...\n", + "DONE (t=0.00s)\n", + "creating index...\n", + "index created!\n", + "Running per image evaluation...\n", + "Evaluate annotation type *bbox*\n", + "DONE (t=0.03s).\n", + "Accumulating evaluation results...\n", + "DONE (t=0.01s).\n", + "Loading and preparing results...\n", + "DONE (t=0.00s)\n", + "creating index...\n", + "index created!\n", + "Running per image evaluation...\n", + "Evaluate annotation type *segm*\n", + "DONE (t=0.03s).\n", + "Accumulating evaluation results...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/content/mmdetection/mmdet/datasets/coco.py:478: UserWarning: The key \"bbox\" is deleted for more accurate mask AP of small/medium/large instances since v2.12.0. This does not change the overall mAP calculation.\n", + " UserWarning)\n", + "2022-02-13 11:51:32,181 - mmdet - INFO - \n", + " Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.815\n", + " Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=1000 ] = 0.904\n", + " Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=1000 ] = 0.857\n", + " Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.126\n", + " Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.707\n", + " Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.886\n", + " Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.852\n", + " Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=300 ] = 0.852\n", + " Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=1000 ] = 0.852\n", + " Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.250\n", + " Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.783\n", + " Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.908\n", + "\n", + "2022-02-13 11:51:32,183 - mmdet - INFO - Epoch(val) [12][13]\tbbox_mAP: 0.7960, bbox_mAP_50: 0.9040, bbox_mAP_75: 0.8790, bbox_mAP_s: 0.2020, bbox_mAP_m: 0.6620, bbox_mAP_l: 0.8730, bbox_mAP_copypaste: 0.796 0.904 0.879 0.202 0.662 0.873, segm_mAP: 0.8150, segm_mAP_50: 0.9040, segm_mAP_75: 0.8570, segm_mAP_s: 0.1260, segm_mAP_m: 0.7070, segm_mAP_l: 0.8860, segm_mAP_copypaste: 0.815 0.904 0.857 0.126 0.707 0.886\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DONE (t=0.02s).\n" + ] + } + ], + "source": [ + "from mmdet.datasets import build_dataset\n", + "from mmdet.models import build_detector\n", + "from mmdet.apis import train_detector\n", + "\n", + "\n", + "# Build dataset\n", + "datasets = [build_dataset(cfg.data.train)]\n", + "\n", + "# Build the detector\n", + "model = build_detector(cfg.model)\n", + "\n", + "# Add an attribute for visualization convenience\n", + "model.CLASSES = datasets[0].CLASSES\n", + "\n", + "# Create work_dir\n", + "mmcv.mkdir_or_exist(osp.abspath(cfg.work_dir))\n", + "train_detector(model, datasets, cfg, distributed=False, validate=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_vYQF5K2NqqI" + }, + "source": [ + "### Understand the log\n", + "From the log, we can have a basic understanding on the training process and know how well the detector is trained.\n", + "\n", + "First, since the dataset we are using is small, we loaded a Mask R-CNN model and finetune it for detection. Because the original Mask R-CNN is trained on COCO dataset that contains 80 classes but KITTI Tiny dataset only have 3 classes. Therefore, the last FC layers of the pre-trained Mask R-CNN for classification and regression have different weight shape and are not used. The pre-trained weights of mask prediction layer `mask_head.conv_logits` also does not matches the current model and is not used due to similar reason.\n", + "\n", + "Third, after training, the detector is evaluated by the default COCO-style evaluation. The results show that the detector achieves 79.6 bbox AP and 81.5 mask AP on the val dataset, not bad!\n", + "\n", + " We can also check the tensorboard to see the curves." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 840, + "resources": { + "https://localhost:6006/?tensorboardColab=true": { + "data": "PCFkb2N0eXBlIGh0bWw+PG1ldGEgbmFtZT0idGItcmVsYXRpdmUtcm9vdCIgY29udGVudD0iLi8iPjwhZG9jdHlwZSBodG1sPjwhLS0KQGxpY2Vuc2UKQ29weXJpZ2h0IDIwMTkgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0+PGh0bWw+PGhlYWQ+PG1ldGEgY2hhcnNldD0idXRmLTgiPgo8dGl0bGU+VGVuc29yQm9hcmQ8L3RpdGxlPgo8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBTVFBQUFERUNBWUFBQURBcG81ckFBQUFCSE5DU1ZRSUNBZ0lmQWhraUFBQUFBbHdTRmx6QUFCYWJnQUFXbTRCeFdzak9BQUFBQmwwUlZoMFUyOW1kSGRoY21VQWQzZDNMbWx1YTNOallYQmxMbTl5WjV2dVBCb0FBQmwwU1VSQlZIaWM3WjE1ZUZUVjNjYy92NXNGQ1ZSeHFWdHB0VlcyVmx4ZjYxcXRpcTBMOUdsOU5YVUJGRXBGUlRJaGhCQURDVGRBTUFFa0NZc0s3cUI5K2tENzJxZkJXaXZxVzdWYTY3NGlyZTlyYXhYMWJaVldaVEhML040LzVnNEdTR0R1ekwxejc1MDVuMzg0ek13NTU4dk0vWEsyM3prSERJR2ppemhQRjNGZTBEb01JRUVMeUdkMFBvT3dhQUF1Y1Y1YWgwVzVWUEI2a0xyeUdXT0lBRkNiL3ZTakVxZ0crdXp3S3dnZHdDMTBVQ2ZWL0RzWWhmbUxNVVFXVVJ1TEVrWUQ4eEVPMnY3R2pvWndQc3hIV014aElFdWxsSzVzNnN4bmpDR3loQzdnSkpSVzRDU2daeFAwbkg0Smk1aVU4N2pmR2czR0VMNmpUUXdFNWdHamtXN2ZkK3FHU0xLV0lzcGtNbS83SU5QZ1lBemhFMnBUUWgrcXNLZ0MrZ0x1VGJCcmVpdXdtSFlhWkRxZmVpcllBQmhEZUk0cVFpTVhBd3NRRHZQQUJEMmxOeUxVczRuYnhTYWV1V3BERW1NSUQ5RWJPUUZvUlRodCs0ditHQ0w1NTdOQXVjUjRLaTNCaGwwd2h2QUFiZUFRTEd4Z0FtRDVhb0x1NmNTZml2QUxsRXFKOFk1TDZZYWRNSWJJQUxVcHBvaHJFV1lqN0wzOWpld2FJcG5lakxLUXZXbVVjV3hMNlI5ZzJBVmppRFRSdVl6Q29nWDRCcEE5RTNSUDkveiszNEdaVXNiS1hxUWJkb014aEV1MGdhTVJtbEhPOXZBQi82T1RPdGtEUXlUU3lpTW81UkxqdFo3K0hZYWVzWUlXRUJYVVpqK2RTeXZ3UE1yWkhoVzdFV0VpbjNFYVV6a1ZvUlQ0bXljbEMrZGc4Ykl1WmFYZXdvR2VsSmtIbUJaaUQ2aE5JVVdNUjJrQUR2Q29WZGlLc0pqNHJ1c0p1cHdTUHFNS3FFS2M5WXZleWttOXprMUFFd2ZTTEtXMFkrZ1ZZNGpkb1BXY2cwVUx3bEhiWDh6Y0VHc1J5bVRhN2xlY3RZbUJGRGtyM095d3hwMk9JWkxwRFFoVDVUb2UyRjNkK1l3eFJBL29IQVpCdDdCc2IxcUZGeW1nWENyZHhTVHBJczRFV2hDTzNhWE05TFdzbzRDWVhNTWJiclRrQThZUTNWQ2IvZ2lWeUU1aDJaa1o0aU9FT1J5ZWZ0U3EybGdNWURUS2ZPQWdqM1Ixb054Q0lYVXkwWVNaSnpHR3dIbmdMT2VCNnlrc083MEhML0hBaVhmN0duUVovV252d2JEcGF3U2NNUFA5VEpnNUdFT2dzMU1JeTNiL3NLMGpUa3hxL09tU2FDdURVQnFRN1R2dHZPald2WWhRTHRma2Q1aDUzaHBDYlJkaDJhay9WQnRRS3FTRzMzZ3F0aGUwbFhPQUZ1QW9EOWRFMWxKQW1mdzBQOFBNODg0UWFsTUN6clJtcW1IWmUzNlFOaUUwOFRuTlltZDNXbE50Q3RtWDhZZ3pMZHk3UmpmcFJKaDVFUTN5ay93S004OGJReWdJZFZ5TXhRTFVaVmgyNys5M290eUpNRk5xK0lmWG10MmdpOWlQUW1ZQjF5RVVibjhqTTNPOGgxTERSRmFKb0o0S0RpbDVZUWl0NVFRa2c3RHNubDk3Rkl0eXFlWlZUOFZtaUM1aEtFb3o0aHhyNDAxWDZsbVVtRnpEMHg1S0RTVTViUWl0NFJDS3NORU13N0ozZk8wdGxCcVp5UnFQNVhxS0xtWVVRZ3ZpQkI5Q3B1WlE0RjQ2cUpKSmZPQ3AyQkNSazRaUW0ySTZQUXpMVHZ5WkNLL2VoeHVsak04OWx1d0xhbFBNL3M3M0FIdDcxRnBzUmxoSVlXNkdtZWVjSVhTRzUySFpjWVQ3RUtiSkRENzBWbTEyME9VY1FnYzI0clNVNE1YMzhoWkNqVXdJZDB2cGxwd3hoTjdBVUFwb0JzN3pjQXJ5R1pTWTFQR01oMUlEUTI5MnRyZ3FwM24ySFZrOFNwd3A4bE5lOFZCcVlFVGVFR3F6SHgzTVFyZ09uTm1Wekgvc2Q0RVoxT2JlN0lvcXdpM09JUWh3R09ERjk5V0pPTE50NDRPZGJjdVV5QnBDYlFycFlEeDRHcGE5QlZqQWwyaVNDclo2S0RkMDZISks2S1FLU1NITVBOVzB4U2JpTkxGM2RNUE1JMmtJclhGV2FMMEx5MWJnRnhRd1RXWjZ0RUVuSXVqaUZNTE0zYVlUWWVZVk1pNDdLL1plRWlsRDZFd0dFZmM4TFBzNUxNcWxqajk0cHpSNjZNMmM2VXhHN0JwbTdqYjl4V3ZyS0tSTXhyTGVPNlgrRWdsRHFPMUVlU3JWQ0gyMnY1R1pJVFlDOVdBTyswcWlOaFlITzRjeGR3OHpoMHpXYlJKUnZ4M1JDRE1QdFNIVXhtSXJvN0djSHdpOGFCWGFnVnNwWWFZNURySm5kQm45c2FqRWNzTE1JUk5ESkVtRW1mY05kNWg1YUEyaE4zUUx5L1p1R25VdFFreHMvdGREcVRtTDNzb2d4T21pWm02SVpQb0ZsSElaeHhOZWF2V0swQmxDcXhpSTFXMlFCMTYwQ2kraGxNc2NmdStwMkR4QlZ6RENpWTlLVEdKa1pvaGtlaTF4SnNzNC91cWwxa3dKalNIVXBvUXR6alFnOVBXb1ZVaHMzMXpQVWxrVDNtWTZDcWhOSVY5eFRoOFJKOHdjTWpFRUpLYTVsOUNYdVZMS1o5NHFUby9BRGFFZ1RPTml4RmtvY3YrbDlwUk9YRXZWVHAwMGhYOGdGeVgwZHZaRG1RVk1BZ295TkVReS9SNUNEYU9EWHdnTjFCQTZsUk93ZWduTFR0OFE2eERLWlk2NXVOQlA5RGFHQVl1UWJyZW5adjdiL1FtTG1JemVmcEpoMWduRUVGcnVoR1h2N3JSczkxL3FCdUpNbFhubXpLRnNvcmN6Q3B4Z1NtOWFkMFdjTVBOeDJROHp6Nm9obk83Uk5KUmFoUDQ5cW5EL3BYNE0xRlBFeldMVDZhMWlReXJvWGV4Rm5BcmdCcUMvUitPL1Q3Q1lReEdMc3hrR2t2VVdRaXM0emprTjc0d2VWYVJ1aUVSWWRoR1ZZdk4vZm1nMXVFT1hjd2lGUG9XWlg1R2RNUFBBeGhCYXlTaUVWdURycmcyaFBJb3dSZWJsUnNoeHJxRjNjd0pkenRqUXV6V2tSMUhLWmJTL1czYURIVlRiRkxPWmF4SG1BRi9hUVZIUFg4eGJXTlJJUTI1dFNzbEZWQkh1OWlITUhPNmtpSmxTNmsrWWVlRFRyZ0JheGFIQUxHQUMwbU5UbTlpMldFeWoyTG0zYlRHWDBlV1VVSnppYWVhcHB6ZWgxSE1veStRc2I4ZU5vVEJFRXEzaVA1eHUxS21Pc3NURzlpNnFaRUh1Ym16UEIvUTJCbExNUE5URE1ITjRFNHNLdVpRSHZkSVpLa09BTXhNMW5URUlGMk5oeXp4ZUNGcVR3VHYwTHI3cmhKa2ZzLzNGek0xeFAzRXE1WXJNWTlSQ1p3aEQ3cU0yRm9jN1llYVNRWmo1anVrT0xHNmhnMW9aelNmcGFqT0dNQVNHcnFZL1c3dWRaZzZadHhiQyt5ZzJGbmVrRTJadURHRUlITDJQUVhTbEVXYSt1elE4ajBXNWxQS2tHeTNHRUliUW9QZHdQc0lpaEtGQXBvYUF4S1gyRStUSDNKbXFCdGUza0dvNUU3U2NIN3JOWnpEc0NibVNCOW5LMGNCRTRKOWVGQWtjNmlhRCsydDVsU05SN3RjWTYvUjZ4OGtHZzBmSVJEcGtEQ3Zvd3hCZ01XUjNIMHM2aGloeVV1ZFF3Q3NhbzFXdjZ4YW9aekI0Z0pUeXNZd21ScHpod0crelZhOTdRMWpiRFFGUUJKUlJ4SHFOTWRZelZRYURnNHhsdll6bWZJUWZnUDk3NFROcElib3pFTGhIeTNqWWRLTU1maUNYMDBZUnc0QnlTSCtkWVUrNE53UTlHaUtCTUlJQ1h0WXBOS3JOWHVuTE1oaDJSVXBwbHl0b1JSZ0cvcHlsNWEwaEVoU2pUT2Rmdks0eFJxWWp5bURZSFhJWkc4R2Z2ZGQrR0NMSk54RGFkQXB0V3NuWDA2akhZTWc2WG8waGRzZEl1bmhkSzdCTk44b1FkaktkWlVxVnZpaXorSVRYdEpJTDA4aHZNR1NGYkxRUTNUbUNPR3UxZ2pZdDUvQU15akVZZk1IUE1jVHVHRWtCYjJpbDZVWVp3a1ZRaG9Ca04rcFRYdFZwWE9CUm1RWkRSZ1JwaUNSSG9qeWdVMm5UYXRPTk1nUkx0c2NRdlNPTXBKUFh0UXBiSjNlN0ZNVmd5Q0x1RFNFK0dTSkJDY29zK3ZDYVR1dDJacWpCa0NYQzBHWGFGZUZJNEVHdG9rMm5PbWY2R0F4WklKeUcrSUxFYkpUcFJobXlSTmdOQVZBQ3pLS0VWM1U2Mzg5eTNZWThJd3FHU0RJSStLMVcwNmJUK1ZwQUdndzVUcFFNa1VBWmliQmVxN0hWcGpoUUxZYWNJM3FHU0pEb1JtM2pWYTNtZTBHTE1lUU9VVFZFa3NFSUQra050T2tNdmhxMEdFUDBpYm9oa293a3pucXRNZDBvUTJia2lpRUErZ0d6YU9jVnJlSGNvTVVZb29rclEyamk0S2RDbjdSNHhSRGdkenJEZEtNTTduSFhRbHdkZWpOMFp5U3dYbWVhYmxSZUUzZDNHSUhiTGxOWXUwdTkwUTlsRmwyOHJETVpFYlFZUTFiWmpGTFBOaGE1eWVUT0VQdEd6aEFKbEtIQTczUW1LN1dHZzRLV1kvQVZCVmJSd1NDNURGdkd1YnVDelowaE9pTnFpQVFDaktHQURUcVRtTnFSNnY0WlVrSDVFeGFueWFXTWxURzhuMDRSN2d6UkZXbERKTmtIb1lVdW50TmFUZ3Rhak1FVDNrVzRra3M1V1VwNU9wT0MzQm5DcjgxQndYQU13aE5hWjdwUmtVWFpBdFJUd0dDNWxKVWltUjllNXM0UThad3lCQ1M3VVlXOHFYWEU5QklLZ2haa1NCRmhGVVVNbHN1d3BaU3QzaFhyQXIyZW9SU3czbFdwMFVxL2hEQkpiSjdDa0plNGF5R0tjcTZGMkpsamdTZlZacVhhSEJpMEdFUDJ5ZWN4Uk0rbzA0MkNEVnBQVEZlYmJsUStZUXpST3dOUVdsalBzenFiVTRJV1k4Z091YjVTN1FYSG9meEI2MW1wOC9oeTBHSU0vbUphaU5SSWRLTTYyYUJ6VERjcWwzRm5DTW43SUxsOVVWcll3SjkwTGljSExjYmdQYWJMbEE3SzhTaFA2UnpUamNvMVRKY3BmUkxkcUM3VGpjb2xUQXVST2ZzaXRQQVhudEhabkJTMEdFTm11RE5FZXJjSDVRZktDVmc4cFhOWnFUWUhCQzNIa0I2bWhmQVdDMkVNUld6UUJtSnFwN1ZuUFZSb013T0MxcEFKdXBxRDNYemU3USsyNXowRXJxS2pjcGI5Z0JhS2VWSWJPU1pvTWVtZ1N6aFVsN0tjWXVZRXJTVWRkQlZEOUdjOFFBZFQzZVJ6TzZoMk4rMXF6SEVLU2xuUUl0eWdOc1c2aEJnV2J5SmNUWG9uc3dTRzNzZStlaCtOV0x3QzdtK21jcmRyVENsSyt5SGZNZDltNERHZ2pTNmVvSWpIMEJ6ZGt4Q25QV2dKcWFMTEdJWFNDdEc3VjF4dExJNWdOTEFBMGcvTWRMdU5NcE14eE5zb0R3TnIyWWVIeFA3aVFkRktLb0Q3TWlnN3ZBZ2RRVXZZRTdxTVk0blRnbkptMEZyU1FlL2pMT0swSUJ5ZGFWbnVER0ZSNUdKUFVoZUovUVZyRWRya0pwN3Y3WU95a0o5cEpaZEREdDVoTGVGdElYUXArd04xeEprRTBWdEgwWlY4RFl1NUtHTzg2cDY3N3pMdG5zMkkweFVxNU5leWdBOWNLTG1lTHI1TDRnUyszRUhEMTBMb2NvcG81enJpMUNQc0U3UWV0K2hLK2lGTUE2YWo3T1hsV05XTEx0UGJDQThqdTNhRjNDQ04vRldyYUVDWmwzZ2huVkpDU01nTW9Zc1p3ZWUwQU44S1dvdGJWQkh1WlF4S0U3aWJUazJWZEF6eFJWY29UcHNzN3IwcjVKb1NGckNaVWhJNzEzSURLeHlHMEtVTXBvdEZLQmRHOFQ4YnZZc1RXVVVyK0xzM3haMGh1cmliSXVaTE14LzdJVVpzT3JXUzZ4Q2VwUHQwWDIvN29LTkJvR01JYldZQVFqVmRUSUhvUlN2clBYd0Z1QkVZVFJaK2ZWZUdrS1c4NlplUTdYVXM1R21keG5MZ1dyL3J5Z29CZFpuVXhtSkE1dE9RUWFHcjZjdFd5b0Fad0pleVZXODRGMTIyVVkzdzNoNC9GNFhXSW9CWkpyMkpzOWlIRjRCN2lLSVo3bUlVVzNnRHBaRXNtZ0ZDYWdoWndpZEFoYnRNL21qSm1DeTJFSG9UWDlWbVZtTHhLRVF2WkVUdjVIaTlpOGNSZmcwY0hvU0cwSjV2S2syczFtbU1SaGpsUHJNUGd0SWxDNGJRQmZURFlockNkR0F2dit2ekdyMkgvZW1pRGdsK1BTUzBoZ0RBNG5xVXM0RCthWmNSdkRsODZ6S3BJaXppWW9TRkVMMnJpblU1UlJSekhWM2hXUThKWlpjcGlUVHhEa0s5ZHdWNlZsTHErRFR0cWdzNWtVVThDYXdtaW1hNGt4RVU4UkpLQzRURERKQmxRNmhOb2JwOUxQdlNBcnpvdVpqc21HTVR5cXRlRnFoTkhLb0xXWTd3UitCVUw4dk9Cbm9IUS9SMkhuRGkycjRadEo2ZDhkMFFPcGsrT29VUldrRXJuL0F1VTdqS1RYNng2VVM1bXNTQ29ELzRZUTdsQXl6T2tocmU4S3pJaFZ4RUFYK0c2SVZsQStqdGpBZGVROXlIWldjTFg3NVVuVUpmbmNJb25jSktDdmtRZUJnb0F3NUNhTllxQnJvcFQrYnpISEN6SDFwM3JjeVRVdDZtZ085SU5TOTdVdG9YSEVPMFk3MkdFZkp4cTJmaXRKd0JLT2NpakVMNUVkQy9sNGRySDdxNEJWek9IaWt6RUg0RTdzeVVFZW1aNHpVSytiNU1aNlBIYWd4WklLTVdRaWV4djhZWXF6SGFVRDRrTWNBYnc1NW5oVVpxQlQ5MlU1Zk01MU1rOUx2UEhxZUEwNDBab290clEraGtCbW9aVjJ1TU5ncDVuOFJxNkVqY3hza0lTN1hTM1NxcU5ISS95cTljMWVNVmUyNHQxbExDZVZMTnY3T2d4dUFUN2k1dUwrY2lMTjVCV0U3Q0JKbnNvRHVBT00ydWN5bVRJT0NIYm1kektQZnlaUzZTQ3U5dXNqRUVnOXNydGZyaDVaeU1jTGxPNVlldXNzeG5JOG9zenpSa2lzVVN1cmhTSm9ZanpOdVFHY0ZQM1FrM2F6WDd1c3JUbHlYQUgvMFJsRElLMU1zTXlzUW1IckFXZzBjRWJ3ZzRoRTZhM0dRUW16Z1dFeUd3LzVXN1VLNlJXdXlBNmpmNFJCZ01BVEJCcC9FOU54bGtIcThBUzN6U3N6dmFFUzZUT2xZRVVMZkJaOEppQ0NIT2NyVmRCdkgxb1JaNDJ4OUpQYklaWVpUTVpFMFc2elJra2JBWUFvVEQyY3hjVjFsc3RqZ2h3OW5nWXl4R1NDMi95MUo5aGdBSWp5RVNUTmJwbk80bWc4empRZUFYUHVsSjhnN0NxVEl6OElHOHdXZkNaZ2lMT0xlcjdYS1RTeWVUZ1gvNUk0bjFGSEM2MUxMQnAvSU5JU0pzaGdBWXdtWnEzV1J3RGtTYjZZT1c1eWppVEpuSjM5TXRRQnM0eWt0QkJuOEpveUVBcXJTYUUxemxLT1lXNENrUE5UekdYcHd0TmZ3ajNRTDBScVlqVkhxb3llQXpZVFZFSVhIdTBLdFREdzBSbXpnRlhJTTNheE8vQWk2UTZYeWFiZ0hhd0d6bjFBaERoQWlySVFDT1lRQlZiakxJSEY1RjBvaVAycEc3Z1V2RVpsczZtVlVSYmFBRmNkZnRNNFNETUJzQ29GYW51enlEZEFzMjhEOXAxU1kwaWMwNHNlbE1KN3V1cG9CNTNBN0UwcXJmRURoaE4wUWY0QTY5SlBXalNhU1pyVTVFYk9vSWlsSXBOdFZ1QlNiUjFSVHdaKzRDeHFkYmhpRjR3bTRJVUU3aTYweDJrMFhtOFJEQ3oxUDhlQmN3UVdaemszdHhDZFNtbUQrekJtRk11bVVZd2tINERRRWdOR2cxUjdyS0U2Y2MyTFNIVDMxT1lyeHdaN3JTMUthRVF0cUFINlZiaGlFOFJNTVFVSUp5bTVzamJHUWVIOEp1dTBEL3dtS0V6T2IrZEVYcEF2bzVabkFWbUdnSUwxRXhCTUIzcWVhbnJuSTBjQnZ3WkEvdkpJNklzWHQ4THlYVVpnRGJXQWVjblc0Wmh2QVJKVU9Bc2tCbjhOVlVQeTZKVFR3VFNIU05raVNPaUxGNUtXMFpOZ2RTd0g4REo2ZGJoaUdjUk1zUXNEZGQzT29tZzh4bEE3RFErZXZyeFBtTzJMeVZyZ0MxT1pnQ0hpR0NwMnNiOWt6VURBRndnVlp6aGFzY2hjeEZ1WnNDVHBlR0ZPNmQ2QVdkeTJGWVBBRW1QaWxYQ2ZVcGFydWhWV3RZNXd5Yzk0aXo2and1a3dyVlpqQngxa0hxWFRaRDlJaGlDd0d3UDhyaWJGV21jeGlHeFdNWU0rUThVVFVFS0tWNkF4ZjVYbzNOOGNSNUhEalU3N29Nd1JOZFF5UllwamI3K1ZXNHp1WkVoSWVCQS95cXd4QXVvbTZJZzltV2ZzakY3dERabklueUNQaG5PRVA0aUxvaFFMaEtxem5QeXlLMW52T0o4eUJadmdIVEVEelJOd1NBc0Z5cnZIbDQxZVlIS1BjRGZiMG96eEF0Y3NNUThEVUt1VEhUUXJTT3k0QmZrZ2c3TitRaHVXSUlnR3QxQm1la20xbHRya2E0bCtpdXpSZzhJSmNNWWFIY3BsUGNkM1cwamtuQXJlVFc5MkZJZzF4N0FBWlQ0dTRBWXExak9zSlNOQVEzV2hzQ0o5Y01BY3BVcmVYRWxENDZpM293SjJQa01HK2cvTkpOQm5lRzZPSnhKUFJubXhZUTV3NjFlNy9pUzBGMEZxMG9kZGtVWnNnYW00QnFDamxPUnJzN2Z0VFZBRktXOFRmZyt6cUZFY1JwQVpjblltU1A0YlJ6QTFDLzh4dHFZOUhKQ3BTZkJLREw0Qzl4NEQ2S21DcWw2UjB3bDFhWFNacFp4MWFPUXlrbjZQdmVla09vMFZxR2QzOUpMNkdBVHU1RWpCbHlEdUZSTEk2VEt4aWJyaGtnZ3pHRXJLQkRGdE5LSjBjQWkwbWNYaEVtaW9semo5cUpWbEJ0aWhuS2FvUXJneFptOEpTM0VFcmxDczZSeTNrbDA4SXlIbFRMTWo2U1ZtSUl3NEdITWkzUFk0NmpnM0tkVEI4NldRUCtSOGNhc3NabW9KNU9oc3NWM2wxZzQ5a2lsTFN3SGpoUFkxeUNNQjg0M0t1eU0wS1l6VDVjQkp3U3RCU0RKeWh3TDUxVXlUZys4THB3ejZkZHBaVTFER0FJUWpud2lkZmxwMEZmakJseWhXZFJUcE94alBYRERPRFRPb1RZdEVzenJSUXhERmdCNXRwYVEwYThoM0lsWXpoSnJ1UnBQeXZ5ZFdGTzVyTlJtcGtJbkFUOHdjKzZERG5KVnFDSnZneVZxMWdwZ3ZwZFlWWUMyYVNaNXhTK1F3VVhBd3VBdzdKUnJ5SFNyRVdaTEZmeDEyeFdtclhRRFFHVlJhemhNNzZKVUUvQy9RYkR6cnlBY29aY3hTZ1psMTB6UUFDeFRMS0NMYklRbXdJR0E2dkEvMmJRRUFrK0FzcnB4N2RsSEU4RUpTS3c0RDZaejd0eUUyT0JVeEJ6M1cwZTB3RXNwcDBqWkJ5dFVocnNBbS9nMGE2eWtHZm94Mm5PQ25KS0I0OFpjb1oxd0xFeW5waE1ERWNJVU9DR2dNU0ZpYktBbFNoSE9PT0x6L2VZeVJCbE5tQnhvWXpuWEJuUEcwR0w2VTRvREpGRUZySlo1bU5Ud0ZHSWQ4dnhodER3TWNway9zNVJNbzdmQkMybUowSzVmMWdhZVFzbzFXck9kc0xNaCs4cGp5SDh5SVRNRDRMd20xQzFFRHNqalR4S0NjY2pUSVQwUTNvTmhsUUp0U0VBeEtaVEdsbUJNQVNsQ1dnUFdwTWhkd205SVpKSUk1dGtQdFhFT1JyQzJmODBSSi9JR0NLSnpHZUROSEloY0M2RWE0YkNFSDBpWjRnazBzZzZQdUpZSjh3OEZIUFlodWdUV1VPQXM0MTFIcTNBRWM0RkttSGJ4bXFJR0pFMlJCSzVrWS9rUm1MRU9SRjRQR2c5aHVpU0U0WklJbzI4S1BNNEUvZ0I4SGJRZWd6Ukk2Y01rVVFhYUdNTDMwS3BCajROV284aE91U2tJUUNrbWEweWp5WUtHWXFhYmF5RzFNaFpReVFSbTQzU3dFU1VreENlQ2xwUHhQZ3Y0dHN2dmM4TGN0NFFTYVNCNTVqTjZRaWx3RHRCNndrNWJ3TG55eVQrVXlibjExZ3Nid3dCempiVzJheWhnR0Vrem4zZEZyU21rUEV4U2puL1pMaE00cmRCaXdtQ3ZESkVFckhaSXJPeHNSZ0VyQ0lMcHptRW5FNWdCVVVNa2NtMGlrMW4wSUtDSWk4TmtVUnMzcFhaaktXTHM0Q1hndFlUQ01vanhEbE9Kak5SSnZMUG9PVUVUVjRiSW9uTTRmY0lKK1RaTnRhL0lKUktHU01reG10Qml3a0x4aEFPWWhNWG01WEFrWkRUMjFnL1E2a0hoc3Rrc3l0eFo0d2hka0pzUGhNYm13S0dRMDQ5TUhGZ0ZjcVJFc09Xc3B3MWZFYUVjZ3RwR0pCYS9nS1VhajNuQU0xRWV4dnJNeWd4S2VlWm9JV0VIZE5DN0FHWnhTTW94ME1rdDdHK0MxeEpqRk9NR1ZMREdDSUZ4S1pUNmxoQm5LRWtia3NLKzdUa0ZxQ2VPSU9sUER1SEJPY0t4aEF1RUp1UHBZNFlCUXhIZVRCb1BUMmd3QnE2K0taTXdaWUtjMzZ1Vzh3WUlnMmtoamVCQzNRT0kwaTBHTU1DbGdUQzgwQk1wcGhyQnpMQnRCQVpJTFdzNDhzY0UvQnRyTzhqVE9UZmZOdVlJWE9NSVRKRUp0SWh0YlJpY1FTUzFXMnM3Y0JpaWhncVUxZ2h0Z2x2OXdKakNJK1FHajZTR21MQXQ4SDM0OXpYWWpGTXBoS1RzbERjNDVjem1ER0V4OGdNWGdETzBMbU13cUxWNCtMZlJEaGJwdktZeCtVYURQNmpOaVhheUJsQjZ6Q2t6djhEUWQ3UXJNYkxSMUFBQUFBQVNVVk9SSzVDWUlJPSI+CjxsaW5rIHJlbD0iYXBwbGUtdG91Y2gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNUUFBQURFQ0FZQUFBREFwbzVyQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUJhYmdBQVdtNEJ4V3NqT0FBQUFCbDBSVmgwVTI5bWRIZGhjbVVBZDNkM0xtbHVhM05qWVhCbExtOXlaNXZ1UEJvQUFCbDBTVVJCVkhpYzdaMTVlRlRWM2NjL3Y1c0ZDVlJ4cVZ0cHRWVzJWbHhmNjFxdGlxMEw5R2w5TlhVQkZFcEZSVEloaEJBRENUZEFNQUVrQ1lzSzdxQjkra0Q3MnFmQldpdnFXN1ZhNjc0aXJlOXJheFgxYlpWV1pUSEwvTjQvNWc0R1NHRHV6TDF6NzUwNW4zODR6TXc1NTh2TS9YSzIzemtIRElHaml6aFBGM0ZlMERvTUlFRUx5R2QwUG9Pd2FBQXVjVjVhaDBXNVZQQjZrTHJ5R1dPSUFGQ2IvdlNqRXFnRyt1endLd2dkd0MxMFVDZlYvRHNZaGZtTE1VUVdVUnVMRWtZRDh4RU8ydjdHam9ad1BzeEhXTXhoSUV1bGxLNXM2c3huakNHeWhDN2dKSlJXNENTZ1p4UDBuSDRKaTVpVTg3amZHZzNHRUw2alRRd0U1Z0dqa1c3ZmQrcUdTTEtXSXNwa01tLzdJTlBnWUF6aEUycFRRaCtxc0tnQytnTHVUYkJyZWl1d21IWWFaRHFmZWlyWUFCaERlSTRxUWlNWEF3c1FEdlBBQkQybE55TFVzNG5ieFNhZXVXcERFbU1JRDlFYk9RRm9SVGh0KzR2K0dDTDU1N05BdWNSNEtpM0JobDB3aHZBQWJlQVFMR3hnQW1ENWFvTHU2Y1NmaXZBTGxFcUo4WTVMNllhZE1JYklBTFVwcG9ockVXWWo3TDM5amV3YUlwbmVqTEtRdldtVWNXeEw2UjlnMkFWamlEVFJ1WXpDb2dYNEJwQTlFM1JQOS96KzM0R1pVc2JLWHFRYmRvTXhoRXUwZ2FNUm1sSE85dkFCLzZPVE90a0RReVRTeWlNbzVSTGp0WjcrSFlhZXNZSVdFQlhVWmorZFN5dndQTXJaSGhXN0VXRWluM0VhVXprVm9SVDRteWNsQytkZzhiSXVaYVhld29HZWxKa0htQlppRDZoTklVV01SMmtBRHZDb1ZkaUtzSmo0cnVzSnVwd1NQcU1LcUVLYzlZdmV5a205emsxQUV3ZlNMS1cwWStnVlk0amRvUFdjZzBVTHdsSGJYOHpjRUdzUnltVGE3bGVjdFltQkZEa3IzT3l3eHAyT0laTHBEUWhUNVRvZTJGM2QrWXd4UkEvb0hBWkJ0N0JzYjFxRkZ5bWdYQ3JkeFNUcElzNEVXaENPM2FYTTlMV3NvNENZWE1NYmJyVGtBOFlRM1ZDYi9naVZ5RTVoMlprWjRpT0VPUnllZnRTcTJsZ01ZRFRLZk9BZ2ozUjFvTnhDSVhVeTBZU1pKekdHd0huZ0xPZUI2eWtzTzcwSEwvSEFpWGY3R25RWi9XbnZ3YkRwYXdTY01QUDlUSmc1R0VPZ3MxTUl5M2Ivc0swalRreHEvT21TYUN1RFVCcVE3VHZ0dk9qV3ZZaFFMdGZrZDVoNTNocENiUmRoMmFrL1ZCdFFLcVNHMzNncXRoZTBsWE9BRnVBb0Q5ZEUxbEpBbWZ3MFA4UE04ODRRYWxNQ3pyUm1xbUhaZTM2UU5pRTA4VG5OWW1kM1dsTnRDdG1YOFlnekxkeTdSamZwUkpoNUVRM3lrL3dLTTg4YlF5Z0lkVnlNeFFMVVpWaDI3Kzkzb3R5Sk1GTnErSWZYbXQyZ2k5aVBRbVlCMXlFVWJuOGpNM084aDFMRFJGYUpvSjRLRGlsNVlRaXQ1UVFrZzdEc25sOTdGSXR5cWVaVlQ4Vm1pQzVoS0VvejRoeHI0MDFYNmxtVW1GekQweDVLRFNVNWJRaXQ0UkNLc05FTXc3SjNmTzB0bEJxWnlScVA1WHFLTG1ZVVFndmlCQjlDcHVaUTRGNDZxSkpKZk9DcDJCQ1JrNFpRbTJJNlBRekxUdnlaQ0svZWh4dWxqTTg5bHV3TGFsUE0vczczQUh0NzFGcHNSbGhJWVc2R21lZWNJWFNHNTJIWmNZVDdFS2JKREQ3MFZtMTIwT1VjUWdjMjRyU1U0TVgzOGhaQ2pVd0lkMHZwbHB3eGhON0FVQXBvQnM3emNBcnlHWlNZMVBHTWgxSURRMjkydHJncXAzbjJIVms4U3B3cDhsTmU4VkJxWUVUZUVHcXpIeDNNUXJnT25ObVZ6SC9zZDRFWjFPYmU3SW9xd2kzT0lRaHdHT0RGOTlXSk9MTnQ0NE9kYmN1VXlCcENiUXJwWUR4NEdwYTlCVmpBbDJpU0NyWjZLRGQwNkhKSzZLUUtTU0hNUE5XMHhTYmlOTEYzZE1QTUkya0lyWEZXYUwwTHkxYmdGeFF3VFdaNnRFRW5JdWppRk1MTTNhWVRZZVlWTWk0N0svWmVFaWxENkV3R0VmYzhMUHM1TE1xbGpqOTRwelI2Nk0yYzZVeEc3QnBtN2piOXhXdnJLS1JNeHJMZU82WCtFZ2xEcU8xRWVTclZDSDIydjVHWklUWUM5V0FPKzBxaU5oWUhPNGN4ZHc4emgweldiUkpSdngzUkNETVB0U0hVeG1Jcm83R2NId2k4YUJYYWdWc3BZYVk1RHJKbmRCbjlzYWpFY3NMTUlSTkRKRW1FbWZjTmQ1aDVhQTJoTjNRTHkvWnVHblV0UWt4cy90ZERxVG1MM3NvZ3hPbWlabTZJWlBvRmxISVp4eE5lYXZXSzBCbENxeGlJMVcyUUIxNjBDaStobE1zY2Z1K3AyRHhCVnpEQ2lZOUtUR0prWm9oa2VpMXhKc3M0L3VxbDFrd0pqU0hVcG9RdHpqUWc5UFdvVlVoczMxelBVbGtUM21ZNkNxaE5JVjl4VGg4Uko4d2NNakVFSkthNWw5Q1h1VkxLWjk0cVRvL0FEYUVnVE9OaXhGa29jditsOXBST1hFdlZUcDAwaFg4Z0Z5WDBkdlpEbVFWTUFnb3lORVF5L1I1Q0RhT0RYd2dOMUJBNmxST3dlZ25MVHQ4UTZ4REtaWTY1dU5CUDlEYUdBWXVRYnJlblp2N2IvUW1MbUl6ZWZwSmgxZ25FRUZydWhHWHY3clJzOTEvcUJ1Sk1sWG5tektGc29yY3pDcHhnU205YWQwV2NNUE54MlE4eno2b2huTzdSTkpSYWhQNDlxbkQvcFg0TTFGUEV6V0xUNmExaVF5cm9YZXhGbkFyZ0JxQy9SK08vVDdDWVF4R0xzeGtHa3ZVV1FpczR6amtONzR3ZVZhUnVpRVJZZGhHVll2Ti9mbWcxdUVPWGN3aUZQb1daWDVHZE1QUEF4aEJheVNpRVZ1RHJyZzJoUElvd1JlYmxSc2h4cnFGM2N3SmR6dGpRdXpXa1IxSEtaYlMvVzNhREhWVGJGTE9aYXhIbUFGL2FRVkhQWDh4YldOUklRMjV0U3NsRlZCSHU5aUhNSE82a2lKbFM2aytZZWVEVHJnQmF4YUhBTEdBQzBtTlRtOWkyV0V5ajJMbTNiVEdYMGVXVVVKemlhZWFwcHplaDFITW95K1FzYjhlTm9UQkVFcTNpUDV4dTFLbU9zc1RHOWk2cVpFSHVibXpQQi9RMkJsTE1QTlRETUhONEU0c0t1WlFIdmRJWktrT0FNeE0xblRFSUYyTmh5enhlQ0ZxVHdUdjBMcjdyaEprZnMvM0Z6TTF4UDNFcTVZck1ZOVJDWndoRDdxTTJGb2M3WWVhU1FaajVqdWtPTEc2aGcxb1p6U2ZwYWpPR01BU0dycVkvVzd1ZFpnNlp0eGJDK3lnMkZuZWtFMlp1REdFSUhMMlBRWFNsRVdhK3V6UThqMFc1bFBLa0d5M0dFSWJRb1Bkd1BzSWloS0ZBcG9hQXhLWDJFK1RIM0ptcUJ0ZTNrR281RTdTY0g3ck5aekRzQ2JtU0I5bkswY0JFNEo5ZUZBa2M2aWFEKzJ0NWxTTlI3dGNZNi9SNng4a0dnMGZJUkRwa0RDdm93eEJnTVdSM0gwczZoaWh5VXVkUXdDc2FvMVd2Nnhhb1p6QjRnSlR5c1l3bVJwemh3Ryt6VmE5N1ExamJEUUZRQkpSUnhIcU5NZFl6VlFhRGc0eGx2WXptZklRZmdQOTc0VE5wSWJvekVMaEh5M2pZZEtNTWZpQ1gwMFlSdzRCeVNIK2RZVSs0TndROUdpS0JNSUlDWHRZcE5Lck5YdW5MTWhoMlJVcHBseXRvUlJnRy9weWw1YTBoRWhTalRPZGZ2SzR4UnFZanltRFlIWElaRzhHZnZkZCtHQ0xKTnhEYWRBcHRXc25YMDZqSFlNZzZYbzBoZHNkSXVuaGRLN0JOTjhvUWRqS2RaVXFWdmlpeitJVFh0SklMMDhodk1HU0ZiTFFRM1RtQ09HdTFnall0NS9BTXlqRVlmTUhQTWNUdUdFa0JiMmlsNlVZWndrVlFob0JrTitwVFh0VnBYT0JSbVFaRFJnUnBpQ1JIb2p5Z1UyblRhdE9OTWdSTHRzY1F2U09NcEpQWHRRcGJKM2U3Rk1WZ3lDTHVEU0UrR1NKQkNjb3MrdkNhVHV0MlpxakJrQ1hDMEdYYUZlRkk0RUd0b2sybk9tZjZHQXhaSUp5RytJTEViSlRwUmhteVJOZ05BVkFDektLRVYzVTYzODl5M1lZOEl3cUdTRElJK0sxVzA2YlQrVnBBR2d3NVRwUU1rVUFaaWJCZXE3SFZwamhRTFlhY0kzcUdTSkRvUm0zalZhM21lMEdMTWVRT1VUVkVrc0VJRCtrTnRPa012aHEwR0VQMGlib2hrb3drem5xdE1kMG9RMmJraWlFQStnR3phT2NWcmVIY29NVVlvb2tyUTJqaTRLZENuN1I0eFJEZ2R6ckRkS01NN25IWFFsd2Rlak4wWnlTd1htZWFibFJlRTNkM0dJSGJMbE5ZdTB1OTBROWxGbDI4ckRNWkViUVlRMWJaakZMUE5oYTV5ZVRPRVB0R3poQUpsS0hBNzNRbUs3V0dnNEtXWS9BVkJWYlJ3U0M1REZ2R3VidUN6WjBoT2lOcWlBUUNqS0dBRFRxVG1OcVI2djRaVWtINUV4YW55YVdNbFRHOG4wNFI3Z3pSRldsREpOa0hvWVV1bnROYVRndGFqTUVUM2tXNGtrczVXVXA1T3BPQzNCbkNyODFCd1hBTXdoTmFaN3BSa1VYWkF0UlR3R0M1bEpVaW1SOWU1czRROFp3eUJDUzdVWVc4cVhYRTlCSUtnaFprU0JGaEZVVU1sc3V3cFpTdDNoWHJBcjJlb1JTdzNsV3AwVXEvaERCSmJKN0NrSmU0YXlHS2NxNkYySmxqZ1NmVlpxWGFIQmkwR0VQMnllY3hSTStvMDQyQ0RWcFBURmViYmxRK1lRelJPd05RV2xqUHN6cWJVNElXWThnT3ViNVM3UVhIb2Z4QjYxbXA4L2h5MEdJTS9tSmFpTlJJZEtNNjJhQnpURGNxbDNGbkNNbjdJTGw5VVZyWXdKOTBMaWNITGNiZ1BhYkxsQTdLOFNoUDZSelRqY28xVEpjcGZSTGRxQzdUamNvbFRBdVJPZnNpdFBBWG50SFpuQlMwR0VObXVETkVlcmNINVFmS0NWZzhwWE5acVRZSEJDM0hrQjZtaGZBV0MyRU1SV3pRQm1KcXA3Vm5QVlJvTXdPQzFwQUp1cHFEM1h6ZTdRKzI1ejBFcnFLamNwYjlnQmFLZVZJYk9TWm9NZW1nU3poVWw3S2NZdVlFclNVZGRCVkQ5R2M4UUFkVDNlUnpPNmgyTisxcXpIRUtTbG5RSXR5Z05zVzZoQmdXYnlKY1RYb25zd1NHM3NlK2VoK05XTHdDN20rbWNyZHJUQ2xLK3lIZk1kOW00REdnalM2ZW9JakgwQnpka3hDblBXZ0pxYUxMR0lYU0N0RzdWMXh0TEk1Z05MQUEwZy9NZEx1Tk1wTXh4TnNvRHdOcjJZZUh4UDdpUWRGS0tvRDdNaWc3dkFnZFFVdllFN3FNWTRuVGduSm0wRnJTUWUvakxPSzBJQnlkYVZudURHRlI1R0pQVWhlSi9RVnJFZHJrSnA3djdZT3lrSjlwSlpkRER0NWhMZUZ0SVhRcCt3TjF4SmtFMFZ0SDBaVjhEWXU1S0dPODZwNjc3ekx0bnMySTB4VXE1TmV5Z0E5Y0tMbWVMcjVMNGdTKzNFSEQxMExvY29wbzV6cmkxQ1BzRTdRZXQraEsraUZNQTZhajdPWGxXTldMTHRQYkNBOGp1M2FGM0NDTi9GV3JhRUNabDNnaG5WSkNTTWdNb1lzWndlZTBBTjhLV290YlZCSHVaUXhLRTdpYlRrMlZkQXp4UlZjb1Rwc3M3cjByNUpvU0ZyQ1pVaEk3MTNJREt4eUcwS1VNcG90RktCZEc4VDhidllzVFdVVXIrTHMzeFowaHVyaWJJdVpMTXgvN0lVWnNPcldTNnhDZXBQdDBYMi83b0tOQm9HTUliV1lBUWpWZFRJSG9SU3ZyUFh3RnVCRVlUUlorZlZlR2tLVzg2WmVRN1hVczVHbWR4bkxnV3Ivcnlnb0JkWm5VeG1KQTV0T1FRYUdyNmN0V3lvQVp3SmV5Vlc4NEYxMjJVWTN3M2g0L0Y0WFdJb0JaSnIySnM5aUhGNEI3aUtJWjdtSVVXM2dEcFpFc21nRkNhZ2had2lkQWhidE0vbWpKbUN5MkVIb1RYOVZtVm1MeEtFUXZaRVR2NUhpOWk4Y1JmZzBjSG9TRzBKNXZLazJzMW1tTVJoamxQck1QZ3RJbEM0YlFCZlREWWhyQ2RHQXZ2K3Z6R3IySC9lbWlEZ2wrUFNTMGhnREE0bnFVczREK2FaY1J2RGw4NnpLcElpemlZb1NGRUwycmluVTVSUlJ6SFYzaFdROEpaWmNwaVRUeERrSzlkd1Y2VmxMcStEVHRxZ3M1a1VVOENhd21pbWE0a3hFVThSSktDNFREREpCbFE2aE5vYnA5TFB2U0Fyem91WmpzbUdNVHlxdGVGcWhOSEtvTFdZN3dSK0JVTDh2T0Jub0hRL1IySG5EaTJyNFp0SjZkOGQwUU9waytPb1VSV2tFcm4vQXVVN2pLVFg2eDZVUzVtc1NDb0QvNFlRN2xBeXpPa2hyZThLekloVnhFQVgrRzZJVmxBK2p0akFkZVE5eUhaV2NMWDc1VW5VSmZuY0lvbmNKS0N2a1FlQmdvQXc1Q2FOWXFCcm9wVCtiekhIQ3pIMXAzcmN5VFV0Nm1nTzlJTlM5N1V0b1hIRU8wWTcyR0VmSnhxMmZpdEp3QktPY2lqRUw1RWRDL2w0ZHJIN3E0QlZ6T0hpa3pFSDRFN3N5VUVlbVo0elVLK2I1TVo2UEhhZ3haSUtNV1FpZXh2OFlZcXpIYVVENGtNY0FidzU1bmhVWnFCVDkyVTVmTTUxTWs5THZQSHFlQTA0MFpvb3RyUStoa0Jtb1pWMnVNTmdwNW44UnE2RWpjeHNrSVM3WFMzU3FxTkhJL3lxOWMxZU1WZTI0dDFsTENlVkxOdjdPZ3h1QVQ3aTV1TCtjaUxONUJXRTdDQkpuc29EdUFPTTJ1Y3ltVElPQ0hibWR6S1BmeVpTNlNDdTl1c2pFRWc5c3J0ZnJoNVp5TWNMbE81WWV1c3N4bkk4b3N6elJraXNVU3VyaFNKb1lqek51UUdjRlAzUWszYXpYN3VzclRseVhBSC8wUmxESUsxTXNNeXNRbUhyQVdnMGNFYndnNGhFNmEzR1FRbXpnV0V5R3cvNVc3VUs2Uld1eUE2amY0UkJnTUFUQkJwL0U5Tnhsa0hxOEFTM3pTc3p2YUVTNlRPbFlFVUxmQlo4SmlDQ0hPY3JWZEJ2SDFvUlo0Mng5SlBiSVpZWlRNWkUwVzZ6UmtrYkFZQW9URDJjeGNWMWxzdGpnaHc5bmdZeXhHU0MyL3kxSjloZ0FJanlFU1ROYnBuTzRtZzh6alFlQVhQdWxKOGc3Q3FUSXo4SUc4d1dmQ1pnaUxPTGVyN1hLVFN5ZVRnWC81STRuMUZIQzYxTExCcC9JTklTSnNoZ0FZd21acTNXUndEa1NiNllPVzV5amlUSm5KMzlNdFFCczR5a3RCQm44Sm95RUFxclNhRTF6bEtPWVc0Q2tQTlR6R1hwd3ROZndqM1FMMFJxWWpWSHFveWVBellUVkVJWEh1MEt0VER3MFJtemdGWElNM2F4Ty9BaTZRNlh5YWJnSGF3R3puMUFoRGhBaXJJUUNPWVFCVmJqTElIRjVGMG9pUDJwRzdnVXZFWmxzNm1WVVJiYUFGY2RmdE00U0RNQnNDb0ZhbnV6eURkQXMyOEQ5cDFTWTBpYzA0c2VsTUo3dXVwb0I1M0E3RTBxcmZFRGhoTjBRZjRBNjlKUFdqU2FTWnJVNUViT29JaWxJcE50VnVCU2JSMVJUd1orNEN4cWRiaGlGNHdtNElVRTdpNjB4MmswWG04UkRDejFQOGVCY3dRV1p6azN0eENkU21tRCt6Qm1GTXVtVVl3a0g0RFFFZ05HZzFSN3JLRTZjYzJMU0hUMzFPWXJ4d1o3clMxS2FFUXRxQUg2VmJoaUU4Uk1NUVVJSnltNXNqYkdRZUg4SnV1MEQvd21LRXpPYitkRVhwQXZvNVpuQVZtR2dJTDFFeEJNQjNxZWFucm5JMGNCdndaQS92Skk2SXNYdDhMeVhVWmdEYldBZWNuVzRaaHZBUkpVT0Fza0JuOE5WVVB5NkpUVHdUU0hTTmtpU09pTEY1S1cwWk5nZFN3SDhESjZkYmhpR2NSTXNRc0RkZDNPb21nOHhsQTdEUStldnJ4UG1PMkx5VnJnQzFPWmdDSGlHQ3Ayc2I5a3pVREFGd2dWWnpoYXNjaGN4RnVac0NUcGVHRk82ZDZBV2R5MkZZUEFFbVBpbFhDZlVwYXJ1aFZXdFk1d3ljOTRpejZqd3Vrd3JWWmpCeDFrSHFYVFpEOUloaUN3R3dQOHJpYkZXbWN4aUd4V01ZTStROFVUVUVLS1Y2QXhmNVhvM044Y1I1SERqVTc3b013Uk5kUXlSWXBqYjcrVlc0enVaRWhJZUJBL3lxd3hBdW9tNklnOW1XZnNqRjd0RFpuSW55Q1Bobk9FUDRpTG9oUUxoS3F6blB5eUsxbnZPSjh5Qlp2Z0hURUR6Uk53U0FzRnlydkhsNDFlWUhLUGNEZmIwb3p4QXRjc01ROERVS3VUSFRRclNPeTRCZmtnZzdOK1FodVdJSWdHdDFCbWVrbTFsdHJrYTRsK2l1elJnOElKY01ZYUhjcGxQY2QzVzBqa25BcmVUVzkyRklnMXg3QUFaVDR1NEFZcTFqT3NKU05BUTNXaHNDSjljTUFjcFVyZVhFbEQ0Nmkzb3dKMlBrTUcrZy9OSk5CbmVHNk9KeEpQUm5teFlRNXc2MWU3L2lTMEYwRnEwb2Rka1Vac2dhbTRCcUNqbE9ScnM3ZnRUVkFGS1c4VGZnK3pxRkVjUnBBWmNuWW1TUDRiUnpBMUMvOHh0cVk5SEpDcFNmQktETDRDOXg0RDZLbUNxbDZSMHdsMWFYU1pwWngxYU9ReWtuNlB2ZWVrT28wVnFHZDM5Skw2R0FUdTVFakJseUR1RlJMSTZUS3hpYnJoa2dnekdFcktCREZ0TktKMGNBaTBtY1hoRW1pb2x6ajlxSlZsQnRpaG5LYW9Rcmd4Wm04SlMzRUVybENzNlJ5M2tsMDhJeUhsVExNajZTVm1JSXc0R0hNaTNQWTQ2amczS2RUQjg2V1FQK1I4Y2Fzc1ptb0o1T2hzc1YzbDFnNDlraWxMU3dIamhQWTF5Q01CODQzS3V5TTBLWXpUNWNCSndTdEJTREp5aHdMNTFVeVRnKzhMcHd6NmRkcFpVMURHQUlRam53aWRmbHAwRmZqQmx5aFdkUlRwT3hqUFhERE9EVE9vVFl0RXN6clJReERGZ0I1dHBhUTBhOGgzSWxZemhKcnVScFB5dnlkV0ZPNXJOUm1wa0luQVQ4d2MrNkREbkpWcUNKdmd5VnExZ3BndnBkWVZZQzJhU1o1eFMrUXdVWEF3dUF3N0pScnlIU3JFV1pMRmZ4MTJ4V21yWFFEUUdWUmF6aE03NkpVRS9DL1FiRHpyeUFjb1pjeFNnWmwxMHpRQUN4VExLQ0xiSVFtd0lHQTZ2QS8yYlFFQWsrQXNycHg3ZGxIRThFSlNLdzRENlp6N3R5RTJPQlV4QnozVzBlMHdFc3BwMGpaQnl0VWhyc0FtL2cwYTZ5a0dmb3gybk9DbkpLQjQ4WmNvWjF3TEV5bnBoTURFY0lVT0NHZ01TRmliS0FsU2hIT09PTHovZVl5UkJsTm1CeG9Zem5YQm5QRzBHTDZVNG9ESkZFRnJKWjVtTlR3RkdJZDh2eGh0RHdNY3BrL3M1Uk1vN2ZCQzJtSjBLNWYxZ2FlUXNvMVdyT2RzTE1oKzhwanlIOHlJVE1ENEx3bTFDMUVEc2pqVHhLQ2NjalRJVDBRM29OaGxRSnRTRUF4S1pUR2xtQk1BU2xDV2dQV3BNaGR3bTlJWkpJSTV0a1B0WEVPUnJDMmY4MFJKL0lHQ0tKekdlRE5ISWhjQzZFYTRiQ0VIMGlaNGdrMHNnNlB1SllKOHc4RkhQWWh1Z1RXVU9BczQxMUhxM0FFYzRGS21IYnhtcUlHSkUyUkJLNWtZL2tSbUxFT1JGNFBHZzlodWlTRTRaSUlvMjhLUE00RS9nQjhIYlFlZ3pSSTZjTWtVUWFhR01MMzBLcEJqNE5XbzhoT3VTa0lRQ2ttYTB5anlZS0dZcWFiYXlHMU1oWlF5UVJtNDNTd0VTVWt4Q2VDbHBQeFBndjR0c3Z2YzhMY3Q0UVNhU0I1NWpONlFpbHdEdEI2d2s1YndMbnl5VCtVeWJuMTFnc2J3d0J6amJXMmF5aGdHRWt6bjNkRnJTbWtQRXhTam4vWkxoTTRyZEJpd21DdkRKRUVySFpJck94c1JnRXJDSUxwem1FbkU1Z0JVVU1rY20waWsxbjBJS0NJaThOa1VSczNwWFpqS1dMczRDWGd0WVRDTW9qeERsT0pqTlJKdkxQb09VRVRWNGJJb25NNGZjSUorVFpOdGEvSUpSS0dTTWt4bXRCaXdrTHhoQU9ZaE1YbTVYQWtaRFQyMWcvUTZrSGhzdGtzeXR4WjR3aGRrSnNQaE1ibXdLR1EwNDlNSEZnRmNxUkVzT1dzcHcxZkVhRWNndHBHSkJhL2dLVWFqM25BTTFFZXh2ck15Z3hLZWVab0lXRUhkTkM3QUdaeFNNb3gwTWt0N0crQzF4SmpGT01HVkxER0NJRnhLWlQ2bGhCbktFa2Jrc0srN1RrRnFDZU9JT2xQRHVIQk9jS3hoQXVFSnVQcFk0WUJReEhlVEJvUFQyZ3dCcTYrS1pNd1pZS2MzNnVXOHdZSWcya2hqZUJDM1FPSTBpMEdNTUNsZ1RDODBCTXBwaHJCekxCdEJBWklMV3M0OHNjRS9CdHJPOGpUT1RmZk51WUlYT01JVEpFSnRJaHRiUmljUVNTMVcyczdjQmlpaGdxVTFnaHRnbHY5d0pqQ0krUUdqNlNHbUxBdDhIMzQ5elhZakZNcGhLVHNsRGM0NWN6bURHRXg4Z01YZ0RPMExtTXdxTFY0K0xmUkRoYnB2S1l4K1VhRFA2ak5pWGF5QmxCNnpDa3p2OERRZDdRck1iTFIxQUFBQUFBU1VWT1JLNUNZSUk9Ij4KCjxzdHlsZT4KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by91WUVDTUtvSGNPOXgxd2RtYnlISW0zLV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vc1RkYUE2ajBQc2I5MjBWanYtbXJ6SC1fa2Y2QnlZTzZDTFlkQjRIUUUtWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL19WWUZ4LXM4MjRrWHFfVWwyQkhxWUgtX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL3RuajRTQjZETmJkYVFuc004Q0ZxQlgtX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL29NTWdmWk1RdGhPcnlRbzluMjJkY3V2dkRpbjFwSzhhS3RlTHBlWjVjMEEud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL0tzX2NWeGlDaXdVV1ZzRldGQTNCam4tX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vTko0dnhsZ1d3V2JFc3YxOGRBaHFubi1fa2Y2QnlZTzZDTFlkQjRIUUUtWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9pc1otd2JDWE5LQWJuam82X1R3SFRvWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by83N0ZYRmpSYkd6TjRhQ3JTRmhsaDNvWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9qU04yQ0dWRGJjVnlDbmZKZmpTZGZJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL1VYNmk0SnhRRG0zZlZUYzFDUHV3cW9YMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vZC02SVlwbE9Gb2NDYWNLenh3WFNPSkJ3MXhVMXJLcHRKal8wamFuczkyMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by85N3VhaHhpcVpSb25jQmFDRUkzYVc0WDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vUHdaYy1ZYklMNDE0d0I5ckIxSUFQWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDMTRzWVlkSmc1ZFUycXpKRVZTdXRhMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQ19acmFSMlRnOHcybHptN2tMTkwwLXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0N3dF9SbTY5MUxUZWJLZlkyWmtLU21JLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0MxQlcyNlF4cFNqLV9aS21feFQ0aFd3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0M0Z3A5UThnYllyaHFHbFJhdl9JWGZrLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0M2RThrTTR4V1IxXzFiWVVSUm9qUkdjLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQzlEaU5zUjVhLTlPZV9JdnB1OFhXbFkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09wWFVxVG8wVWdRUWhHal9TRmRMV0JrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9XeHJYSmEwQzNLZHRDN2xNYWZHNGRSa0F6NHJZbjQ3WnkycnZpZ1dRZjZ3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vY0RLaFJhWG5RVE9WYmFveHdkT3I5eGtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vMWhaZjAyUE9BTmgzMmsyVmtnRW9VQmtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdlBjeW5TTDBxSHFfNmRYN2xLVkJ5WFloamJTcHZjNDdlZTZ4Ul84MEhudy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdlN6dWxmS1NLMExMampmZWF4Y1JFaGtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9LMjNjeFdWVHJJRkQ2REpzRVZpMDdSa0F6NHJZbjQ3WnkycnZpZ1dRZjZ3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vRmw0eTBRZE94eXlUSEVHTVhYOGtjWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by8wZUM2ZmwwNmx1WEVZV3BCU0p2WENJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL0kzUzF3c2dTZzlZQ3VyVjZQVWtUT1lYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by8tTDE0SmswNm02cFVIQi01bVhRUW5ZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vSGdvMTNrLXRmU3BuMHFpMVNGZFVmWkJ3MXhVMXJLcHRKal8wamFuczkyMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL1BydTMzcWpTaHBaU21HM3o2Vll3bllYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL05ZRFdCZEQ0Z0lxMjZHNVhZYkhzRklYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0MTRzWVlkSmc1ZFUycXpKRVZTdXRhMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0X1pyYVIyVGc4dzJsem03a0xOTDAtdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0d3RfUm02OTFMVGViS2ZZMlprS1NtSS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQxQlcyNlF4cFNqLV9aS21feFQ0aFd3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDRncDlROGdiWXJocUdsUmF2X0lYZmsud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0NkU4a000eFdSMV8xYllVUlJvalJHYy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDlEaU5zUjVhLTlPZV9JdnB1OFhXbFkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL29IaTMwa3dRV3ZwQ1dxQWh6SGNDU0lYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9aTHFLZWVsWWJBVEc2MEVwWkJTRHk0WDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vbXg5VWNrNnVCNjNWSUtGWW5FTVhyWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vckd2SGRKbnIybDc1cWIwWU5EOU55SVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vUnhaSmRuemVvM1I1elNleGdlOFVVWkJ3MXhVMXJLcHRKal8wamFuczkyMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vb09lRndaTmxyVGVmekxZbWxWVjFVSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9tYm1ocHJNSDY5Wmk2ZUVQQllWRmhZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwVjRzWVlkSmc1ZFUycXpKRVZTdXRhMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBmWnJhUjJUZzh3Mmx6bTdrTE5MMC13LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMFF0X1JtNjkxTFRlYktmWTJaa0tTbUkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBWQlcyNlF4cFNqLV9aS21feFQ0aFd3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwWWdwOVE4Z2JZcmhxR2xSYXZfSVhmay53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMGFFOGtNNHhXUjFfMWJZVVJSb2pSR2Mud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMGREaU5zUjVhLTlPZV9JdnB1OFhXbFkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZMTRzWVlkSmc1ZFUycXpKRVZTdXRhMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZX1pyYVIyVGc4dzJsem03a0xOTDAtdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZd3RfUm02OTFMVGViS2ZZMlprS1NtSS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFkxQlcyNlF4cFNqLV9aS21feFQ0aFd3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTRncDlROGdiWXJocUdsUmF2X0lYZmsud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZNkU4a000eFdSMV8xYllVUlJvalJHYy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTlEaU5zUjVhLTlPZV9JdnB1OFhXbFkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5RnoxeC1NMUkxdzVPTWlxblZGOHhCTGhVLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGendYYUFYdXA1bVpsZks2eFJMcmhzY28ud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6d242V3F4by14d3hpbERYUFU4Y2hWVS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGejFUN2FKTEs2bktwbjM2SU13VGNNTWMud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5RnpfNzlfWnVVeENpZ00yRGVzcFRuRmF3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6NGdkOU9FUFVDTjNBZFlXMGU4dGF0NC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6OGJJUVNZWm5XTGFXQzlRTkNwVEtfVS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9Cjwvc3R5bGU+CgoKCjxzdHlsZT4ubWF0LWJhZGdlLWNvbnRlbnR7Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsIC5tYXQtYmFkZ2UtY29udGVudHtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2UgLm1hdC1iYWRnZS1jb250ZW50e2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDEsLm1hdC1oZWFkbGluZSwubWF0LXR5cG9ncmFwaHkgaDF7Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDIsLm1hdC10aXRsZSwubWF0LXR5cG9ncmFwaHkgaDJ7Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDMsLm1hdC1zdWJoZWFkaW5nLTIsLm1hdC10eXBvZ3JhcGh5IGgze2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0LC5tYXQtc3ViaGVhZGluZy0xLC5tYXQtdHlwb2dyYXBoeSBoNHtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNSwubWF0LXR5cG9ncmFwaHkgaDV7Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDYsLm1hdC10eXBvZ3JhcGh5IGg2e2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nLC5tYXQtYm9keS0ye2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keSwubWF0LWJvZHktMSwubWF0LXR5cG9ncmFwaHl7Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5IHAsLm1hdC1ib2R5LTEgcCwubWF0LXR5cG9ncmFwaHkgcHttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbCwubWF0LWNhcHRpb257Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTQsLm1hdC10eXBvZ3JhcGh5IC5tYXQtZGlzcGxheS00e2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktMywubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTN7Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMiwubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTJ7Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTEsLm1hdC10eXBvZ3JhcGh5IC5tYXQtZGlzcGxheS0xe2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJ7Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b24sLm1hdC1yYWlzZWQtYnV0dG9uLC5tYXQtaWNvbi1idXR0b24sLm1hdC1zdHJva2VkLWJ1dHRvbiwubWF0LWZsYXQtYnV0dG9uLC5tYXQtZmFiLC5tYXQtbWluaS1mYWJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGV7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxle2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyIC5tYXQtY2FyZC10aXRsZXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGUsLm1hdC1jYXJkLWNvbnRlbnR7Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXQgLm1hdC1jaGVja2JveC1sYWJlbHtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcHtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uLC5tYXQtY2hpcCAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29ue2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGV7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGx7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbCwubWF0LWZvb3Rlci1jZWxse2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWwsLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9ue2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlciB0aHtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGV7Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVye2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudHtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGR7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJ7cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29ue2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiwubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbi1idXR0b257aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbntoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXh7cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcjpmb2N1cysubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJ7dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVse3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcntmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtd3JhcHBlcntwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcjpmb2N1cysubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtbGFiZWx7dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXIsLm1hdC1ncmlkLXRpbGUtZm9vdGVye2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlciAubWF0LWxpbmUsLm1hdC1ncmlkLXRpbGUtZm9vdGVyIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyIC5tYXQtbGluZTpudGgtY2hpbGQobisyKSwubWF0LWdyaWQtdGlsZS1mb290ZXIgLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50e21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVte2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3IsLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplIC5tYXQtc2VsZWN0LXRyaWdnZXJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9ue2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcntoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50e2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLC5tYXQtc3RlcHBlci1ob3Jpem9udGFse2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWx7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3J7Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcntmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWR7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3Vwe2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1saW5re2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyLC5tYXQtdG9vbGJhciBoMSwubWF0LXRvb2xiYXIgaDIsLm1hdC10b29sYmFyIGgzLC5tYXQtdG9vbGJhciBoNCwubWF0LXRvb2xiYXIgaDUsLm1hdC10b29sYmFyIGg2e2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldHtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVte2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3QtaXRlbXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3QtaXRlbSAubWF0LWxpbmV7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGluZTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZSAubWF0LXN1YmhlYWRlcntmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3QtaXRlbXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LXN1YmhlYWRlcntmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9ue2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVse2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFye2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb257bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWV7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlLC5tYXQtbmVzdGVkLXRyZWUtbm9kZXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGV7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVke292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudHtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtcmlwcGxlLWVsZW1lbnR7ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVue2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lciwuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJ7cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVye3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJ7ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3B7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmd7b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmd7b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcHtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AsLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmd7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94e3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2t7cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemV7cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ3twYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94e3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0ey8qISovfUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5key8qISovfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWQ6LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWQ6bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcntwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3J7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpfS5tYXQtb3B0aW9ue2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb246aG92ZXI6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSwubWF0LW9wdGlvbjpmb2N1czpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LWFjdGl2ZXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KTtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uLm1hdC1vcHRpb24tZGlzYWJsZWR7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHJpbWFyeSAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjU3YzAwfS5tYXQtYWNjZW50IC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmZjk4MDB9Lm1hdC13YXJuIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNDQzMzZ9Lm1hdC1vcHRncm91cC1sYWJlbHtjb2xvcjojNjE2MTYxfS5tYXQtb3B0Z3JvdXAtZGlzYWJsZWQgLm1hdC1vcHRncm91cC1sYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wc2V1ZG8tY2hlY2tib3h7Y29sb3I6IzYxNjE2MX0ubWF0LXBzZXVkby1jaGVja2JveDo6YWZ0ZXJ7Y29sb3I6I2ZmZn0ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZHtjb2xvcjojYjBiMGIwfS5tYXQtcHJpbWFyeSAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLC5tYXQtcHJpbWFyeSAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRle2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUsLm1hdC1hY2NlbnQgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCwubWF0LWFjY2VudCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRle2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LXdhcm4gLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCwubWF0LXdhcm4gLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZC5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkLC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZHtiYWNrZ3JvdW5kOiNiMGIwYjB9Lm1hdC1hcHAtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWVsZXZhdGlvbi16MHtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejF7Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Mntib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoze2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejR7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejV7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejZ7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo3e2JveC1zaGFkb3c6MHB4IDRweCA1cHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDdweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAycHggMTZweCAxcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OHtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejl7Ym94LXNoYWRvdzowcHggNXB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOXB4IDEycHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMHtib3gtc2hhZG93OjBweCA2cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMHB4IDE0cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAxOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMXtib3gtc2hhZG93OjBweCA2cHggN3B4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMXB4IDE1cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAyMHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMntib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxM3tib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxM3B4IDE5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNHB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNHtib3gtc2hhZG93OjBweCA3cHggOXB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNHB4IDIxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNXtib3gtc2hhZG93OjBweCA4cHggOXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNXB4IDIycHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAyOHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNntib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTd7Ym94LXNoYWRvdzowcHggOHB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE3cHggMjZweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMycHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE4e2JveC1zaGFkb3c6MHB4IDlweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOHB4IDI4cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOXtib3gtc2hhZG93OjBweCA5cHggMTJweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTlweCAyOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzZweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjB7Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMHB4IDMxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCAzOHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIxcHggMzNweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQwcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIye2JveC1zaGFkb3c6MHB4IDEwcHggMTRweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjJweCAzNXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDJweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjN7Ym94LXNoYWRvdzowcHggMTFweCAxNHB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyM3B4IDM2cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyNHtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC10aGVtZS1sb2FkZWQtbWFya2Vye2Rpc3BsYXk6bm9uZX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbHtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbCAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcik6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojMjEyMTIxfS5tYXQtYmFkZ2V7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1iYWRnZS1oaWRkZW4gLm1hdC1iYWRnZS1jb250ZW50e2Rpc3BsYXk6bm9uZX0ubWF0LWJhZGdlLWNvbnRlbnR7cG9zaXRpb246YWJzb2x1dGU7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gMjAwbXMgZWFzZS1pbi1vdXQ7dHJhbnNmb3JtOnNjYWxlKDAuNik7b3ZlcmZsb3c6aGlkZGVuO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm5nLWFuaW1hdGUtZGlzYWJsZWQgLm1hdC1iYWRnZS1jb250ZW50LC5tYXQtYmFkZ2UtY29udGVudC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1iYWRnZS1jb250ZW50Lm1hdC1iYWRnZS1hY3RpdmV7dHJhbnNmb3JtOm5vbmV9Lm1hdC1iYWRnZS1zbWFsbCAubWF0LWJhZGdlLWNvbnRlbnR7d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtsaW5lLWhlaWdodDoxNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFib3ZlIC5tYXQtYmFkZ2UtY29udGVudHt0b3A6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWxvdyAubWF0LWJhZGdlLWNvbnRlbnR7Ym90dG9tOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0xNnB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6LTE2cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi04cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0Oi04cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LThweH0ubWF0LWJhZGdlLW1lZGl1bSAubWF0LWJhZGdlLWNvbnRlbnR7d2lkdGg6MjJweDtoZWlnaHQ6MjJweDtsaW5lLWhlaWdodDoyMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnR7dG9wOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWxvdyAubWF0LWJhZGdlLWNvbnRlbnR7Ym90dG9tOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6LTIycHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0Oi0yMnB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0OmF1dG87bGVmdDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0xMXB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0OmF1dG87cmlnaHQ6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMTFweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTExcHh9Lm1hdC1iYWRnZS1sYXJnZSAubWF0LWJhZGdlLWNvbnRlbnR7d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtsaW5lLWhlaWdodDoyOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFib3ZlIC5tYXQtYmFkZ2UtY29udGVudHt0b3A6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVsb3cgLm1hdC1iYWRnZS1jb250ZW50e2JvdHRvbTotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6LTI4cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMjhweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0OmF1dG87bGVmdDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6LTE0cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMTRweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0OmF1dG87bGVmdDotMTRweH0ubWF0LWJhZGdlLWNvbnRlbnR7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNTdjMDB9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJhZGdlLWNvbnRlbnR7b3V0bGluZTpzb2xpZCAxcHg7Ym9yZGVyLXJhZGl1czowfS5tYXQtYmFkZ2UtYWNjZW50IC5tYXQtYmFkZ2UtY29udGVudHtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWJhZGdlLXdhcm4gLm1hdC1iYWRnZS1jb250ZW50e2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtYmFkZ2UtZGlzYWJsZWQgLm1hdC1iYWRnZS1jb250ZW50e2JhY2tncm91bmQ6I2JkYmRiZDtjb2xvcjojNzU3NTc1fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcntib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbiwubWF0LWljb24tYnV0dG9uLC5tYXQtc3Ryb2tlZC1idXR0b257Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5LC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnksLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeXtjb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnQsLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudHtjb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuLC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm4sLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2Fybntjb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1idXR0b24ubWF0LWFjY2VudC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtYnV0dG9uLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWljb24tYnV0dG9uLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1pY29uLWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm4ubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1idXR0b24tZGlzYWJsZWQubWF0LWJ1dHRvbi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm4gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b24gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWljb24tYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1zdHJva2VkLWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50e29wYWNpdHk6LjE7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1zdHJva2VkLWJ1dHRvbjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbiwubWF0LXJhaXNlZC1idXR0b24sLm1hdC1mYWIsLm1hdC1taW5pLWZhYntjb2xvcjojMjEyMTIxO2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5LC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeSwubWF0LWZhYi5tYXQtcHJpbWFyeSwubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5e2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtZmFiLm1hdC1hY2NlbnQsLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50e2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybiwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4sLm1hdC1mYWIubWF0LXdhcm4sLm1hdC1taW5pLWZhYi5tYXQtd2Fybntjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4ubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LXJhaXNlZC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtZmFiLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1mYWIubWF0LWFjY2VudC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtZmFiLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1mYWIubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LW1pbmktZmFiLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LW1pbmktZmFiLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1taW5pLWZhYi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWR7Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnksLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5LC5tYXQtZmFiLm1hdC1wcmltYXJ5LC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnl7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudCwubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudCwubWF0LWZhYi5tYXQtYWNjZW50LC5tYXQtbWluaS1mYWIubWF0LWFjY2VudHtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybiwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4sLm1hdC1mYWIubWF0LXdhcm4sLm1hdC1taW5pLWZhYi5tYXQtd2FybntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4ubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWZsYXQtYnV0dG9uLm1hdC1idXR0b24tZGlzYWJsZWQubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybi5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1mYWIubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWZhYi5tYXQtYWNjZW50Lm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1mYWIubWF0LXdhcm4ubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWZhYi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeS5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtbWluaS1mYWIubWF0LWFjY2VudC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtbWluaS1mYWIubWF0LXdhcm4ubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LW1pbmktZmFiLm1hdC1idXR0b24tZGlzYWJsZWQubWF0LWJ1dHRvbi1kaXNhYmxlZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1mYWIubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtZmFiLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LW1pbmktZmFiLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWZhYi5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtbWluaS1mYWIubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtc3Ryb2tlZC1idXR0b246bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1mbGF0LWJ1dHRvbjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uOm5vdCgubWF0LWJ1dHRvbi1kaXNhYmxlZCk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWI6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1taW5pLWZhYjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWI6bm90KC5tYXQtYnV0dG9uLWRpc2FibGVkKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1taW5pLWZhYjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiLm1hdC1idXR0b24tZGlzYWJsZWQ6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1taW5pLWZhYi5tYXQtYnV0dG9uLWRpc2FibGVkOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZSwubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXB7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJke2JveC1zaGFkb3c6bm9uZX0ubWF0LWJ1dHRvbi10b2dnbGV7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtYnV0dG9uLXRvZ2dsZSAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZHtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlKy5tYXQtYnV0dG9uLXRvZ2dsZXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfVtkaXI9cnRsXSAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUrLm1hdC1idXR0b24tdG9nZ2xle2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWwgLm1hdC1idXR0b24tdG9nZ2xlKy5tYXQtYnV0dG9uLXRvZ2dsZXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZHtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzYxNjE2MX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJke2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVke2NvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmR7YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2Vke2JhY2tncm91bmQtY29sb3I6I2JkYmRiZH0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJke2JvcmRlcjpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtYnV0dG9uLXRvZ2dsZS1sYWJlbC1jb250ZW50e2xpbmUtaGVpZ2h0OjQ4cHh9Lm1hdC1jYXJke2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtY2FyZDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC5tYXQtY2FyZC1mbGF0Om5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQtc3VidGl0bGV7Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWZyYW1le2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJre2ZpbGw6I2ZmZn0ubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoe3N0cm9rZTojZmZmICFpbXBvcnRhbnR9Lm1hdC1jaGVja2JveC1taXhlZG1hcmt7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHJpbWFyeSAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1wcmltYXJ5IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1hY2NlbnQgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtYWNjZW50IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC13YXJuIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCwubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXdhcm4gLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1jaGVja2VkIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCwubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZDpub3QoLm1hdC1jaGVja2JveC1jaGVja2VkKSAubWF0LWNoZWNrYm94LWZyYW1le2JvcmRlci1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWQgLm1hdC1jaGVja2JveC1sYWJlbHtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3ggLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtY2hlY2tib3g6YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWQ6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWNoZWNrYm94OmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWQ6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1jaGVja2JveDphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcHtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzIxMjEyMX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLXJlbW92ZXtjb2xvcjojMjEyMTIxO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpOmFjdGl2ZXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcDpub3QoLm1hdC1jaGlwLWRpc2FibGVkKSAubWF0LWNoaXAtcmVtb3ZlOmhvdmVye29wYWNpdHk6LjU0fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZHtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcDo6YWZ0ZXJ7YmFja2dyb3VuZDojMDAwfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnkgLm1hdC1jaGlwLXJlbW92ZXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm57YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuIC5tYXQtY2hpcC1yZW1vdmV7Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnQgLm1hdC1jaGlwLXJlbW92ZXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtdGFibGV7YmFja2dyb3VuZDojZmZmfS5tYXQtdGFibGUgdGhlYWQsLm1hdC10YWJsZSB0Ym9keSwubWF0LXRhYmxlIHRmb290LG1hdC1oZWFkZXItcm93LG1hdC1yb3csbWF0LWZvb3Rlci1yb3csW21hdC1oZWFkZXItcm93XSxbbWF0LXJvd10sW21hdC1mb290ZXItcm93XSwubWF0LXRhYmxlLXN0aWNreXtiYWNrZ3JvdW5kOmluaGVyaXR9bWF0LXJvdyxtYXQtaGVhZGVyLXJvdyxtYXQtZm9vdGVyLXJvdyx0aC5tYXQtaGVhZGVyLWNlbGwsdGQubWF0LWNlbGwsdGQubWF0LWZvb3Rlci1jZWxse2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaGVhZGVyLWNlbGx7Y29sb3I6IzYxNjE2MX0ubWF0LWNlbGwsLm1hdC1mb290ZXItY2VsbHtjb2xvcjojMjEyMTIxfS5tYXQtY2FsZW5kYXItYXJyb3d7ZmlsbDpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZSwubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWNhbGVuZGFyLW5leHQtYnV0dG9uLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50IC5tYXQtY2FsZW5kYXItcHJldmlvdXMtYnV0dG9ue2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcntjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXItZGl2aWRlcjo6YWZ0ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVse2NvbG9yOiM2MTYxNjF9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudCwubWF0LWRhdGUtcmFuZ2UtaW5wdXQtc2VwYXJhdG9ye2NvbG9yOiMyMTIxMjE7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpe2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZGF0ZS1yYW5nZS1pbnB1dC1zZXBhcmF0b3J7Y29sb3I6Izc1NzU3NX0ubWF0LWNhbGVuZGFyLWJvZHktaW4tcHJldmlld3tjb2xvcjpyZ2JhKDAsMCwwLC4yNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS10b2RheTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTgpfS5tYXQtY2FsZW5kYXItYm9keS1pbi1yYW5nZTo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgyNDUsMTI0LDAsLjIpfS5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCwubWF0LWNhbGVuZGFyLWJvZHktaW4tY29tcGFyaXNvbi1yYW5nZTo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgyNDksMTcxLDAsLjIpfS5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1zdGFydDo6YmVmb3JlLFtkaXI9cnRsXSAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2UtZW5kOjpiZWZvcmV7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMjQ1LCAxMjQsIDAsIDAuMikgNTAlLCByZ2JhKDI0OSwgMTcxLCAwLCAwLjIpIDUwJSl9Lm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3JlLFtkaXI9cnRsXSAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2Utc3RhcnQ6OmJlZm9yZXtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byBsZWZ0LCByZ2JhKDI0NSwgMTI0LCAwLCAwLjIpIDUwJSwgcmdiYSgyNDksIDE3MSwgMCwgMC4yKSA1MCUpfS5tYXQtY2FsZW5kYXItYm9keS1pbi1yYW5nZT4ubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwsLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2UubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U6OmFmdGVye2JhY2tncm91bmQ6I2E4ZGFiNX0ubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQsLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2U+Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQ6IzQ2YTM1ZX0ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC40KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3Zlcj4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpLC5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlPi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCksLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZT4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjMpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50e2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWluLXJhbmdlOjpiZWZvcmV7YmFja2dyb3VuZDpyZ2JhKDI1NSwxNTIsMCwuMil9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwsLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktaW4tY29tcGFyaXNvbi1yYW5nZTo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgyNDksMTcxLDAsLjIpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLXN0YXJ0OjpiZWZvcmUsLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCBbZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDI1NSwgMTUyLCAwLCAwLjIpIDUwJSwgcmdiYSgyNDksIDE3MSwgMCwgMC4yKSA1MCUpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3JlLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgW2Rpcj1ydGxdIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1zdGFydDo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIGxlZnQsIHJnYmEoMjU1LCAxNTIsIDAsIDAuMikgNTAlLCByZ2JhKDI0OSwgMTcxLCAwLCAwLjIpIDUwJSl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U+Lm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2UubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U6OmFmdGVye2JhY2tncm91bmQ6I2E4ZGFiNX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCwubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kOiM0NmEzNWV9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQ+Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktY2VsbDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3Zlcj4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKSwubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U6OmJlZm9yZXtiYWNrZ3JvdW5kOnJnYmEoMjQ0LDY3LDU0LC4yKX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwsLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2U6OmJlZm9yZXtiYWNrZ3JvdW5kOnJnYmEoMjQ5LDE3MSwwLC4yKX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2Utc3RhcnQ6OmJlZm9yZSwubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiBbZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDI0NCwgNjcsIDU0LCAwLjIpIDUwJSwgcmdiYSgyNDksIDE3MSwgMCwgMC4yKSA1MCUpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1lbmQ6OmJlZm9yZSwubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiBbZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLXN0YXJ0OjpiZWZvcmV7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gbGVmdCwgcmdiYSgyNDQsIDY3LCA1NCwgMC4yKSA1MCUsIHJnYmEoMjQ5LCAxNzEsIDAsIDAuMikgNTAlKX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U+Lm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlLm1hdC1jYWxlbmRhci1ib2R5LWluLXJhbmdlOjphZnRlcntiYWNrZ3JvdW5kOiNhOGRhYjV9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kOiM0NmEzNWV9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGw6bm90KC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCk6aG92ZXI+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKSwubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZT4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC4zKX0ubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaHtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmV7Y29sb3I6I2Y1N2MwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtYWNjZW50e2NvbG9yOiNmZjk4MDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LXdhcm57Y29sb3I6I2Y0NDMzNn0ubWF0LWRhdGUtcmFuZ2UtaW5wdXQtaW5uZXJbZGlzYWJsZWRde2NvbG9yOiM3NTc1NzV9Lm1hdC1kaWFsb2ctY29udGFpbmVye2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRpdmlkZXJ7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1kaXZpZGVyLXZlcnRpY2Fse2JvcmRlci1yaWdodC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWx7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFjdGlvbi1yb3d7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksLm1hdC1leHBhbnNpb24tcGFuZWwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoLm1hdC1leHBhbmRlZCkgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyOmhvdmVyOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoLm1hdC1leHBhbmRlZCk6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI6aG92ZXJ7YmFja2dyb3VuZDojZmZmfX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGV7Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb24sLm1hdC1leHBhbnNpb24taW5kaWNhdG9yOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGUsLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0gLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9ue2NvbG9yOmluaGVyaXR9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVye2hlaWdodDo0OHB4fS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5tYXQtZXhwYW5kZWR7aGVpZ2h0OjY0cHh9Lm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtaGludHtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50e2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtd2Fybntjb2xvcjojZjQ0MzM2fS5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2Vye2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudHtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LXdhcm57YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LWFjY2VudCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWQ6bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtd2FybiAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnQsLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1lcnJvcntjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1oaW50e2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtZmxleHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1mbGV4e2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5le2NvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtYWNjZW50IC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtd2FybiAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtaW52YWxpZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5le2NvbG9yOnJnYmEoMCwwLDAsLjA2KX0ubWF0LWljb24ubWF0LXByaW1hcnl7Y29sb3I6I2Y1N2MwMH0ubWF0LWljb24ubWF0LWFjY2VudHtjb2xvcjojZmY5ODAwfS5tYXQtaWNvbi5tYXQtd2Fybntjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0IC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWlucHV0LWVsZW1lbnQ6ZGlzYWJsZWQsLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojNzU3NTc1fS5tYXQtaW5wdXQtZWxlbWVudHtjYXJldC1jb2xvcjojZjU3YzAwfS5tYXQtaW5wdXQtZWxlbWVudDo6cGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudDo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnQ6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWZvcm0tZmllbGQubWF0LWFjY2VudCAubWF0LWlucHV0LWVsZW1lbnR7Y2FyZXQtY29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LXdhcm4gLm1hdC1pbnB1dC1lbGVtZW50LC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtaW5wdXQtZWxlbWVudHtjYXJldC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1pdGVte2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LW9wdGlvbntjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlIC5tYXQtc3ViaGVhZGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1saXN0LWl0ZW0tZGlzYWJsZWR7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtbGlzdC1vcHRpb246aG92ZXIsLm1hdC1saXN0LW9wdGlvbjpmb2N1cywubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1pdGVtOmhvdmVyLC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LWl0ZW06Zm9jdXMsLm1hdC1hY3Rpb24tbGlzdCAubWF0LWxpc3QtaXRlbTpob3ZlciwubWF0LWFjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uLC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uOmhvdmVyLC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtbWVudS1wYW5lbHtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1tZW51LXBhbmVsOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtbWVudS1pdGVte2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6IzIxMjEyMX0ubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF0sLm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdIC5tYXQtbWVudS1zdWJtZW51LWljb24sLm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdIC5tYXQtaWNvbi1uby1jb2xvcntjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1tZW51LWl0ZW0gLm1hdC1pY29uLW5vLWNvbG9yLC5tYXQtbWVudS1zdWJtZW51LWljb257Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtbWVudS1pdGVtOmhvdmVyOm5vdChbZGlzYWJsZWRdKSwubWF0LW1lbnUtaXRlbS5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdChbZGlzYWJsZWRdKSwubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoW2Rpc2FibGVkXSksLm1hdC1tZW51LWl0ZW0taGlnaGxpZ2h0ZWQ6bm90KFtkaXNhYmxlZF0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtcGFnaW5hdG9ye2JhY2tncm91bmQ6I2ZmZn0ubWF0LXBhZ2luYXRvciwubWF0LXBhZ2luYXRvci1wYWdlLXNpemUgLm1hdC1zZWxlY3QtdHJpZ2dlcntjb2xvcjojNjE2MTYxfS5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudCwubWF0LXBhZ2luYXRvci1pbmNyZW1lbnR7Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpO2JvcmRlci1yaWdodDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtcGFnaW5hdG9yLWZpcnN0LC5tYXQtcGFnaW5hdG9yLWxhc3R7Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudCwubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnQsLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItZmlyc3QsLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItbGFzdHtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcGFnaW5hdG9yLWNvbnRhaW5lcnttaW4taGVpZ2h0OjU2cHh9Lm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZHtmaWxsOiNmZGRlYmZ9Lm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6I2ZkZGViZn0ubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudCAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5ke2ZpbGw6I2ZmZTViZn0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmU1YmZ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudCAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm4gLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZHtmaWxsOiNmY2QwY2R9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm4gLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6I2ZjZDBjZH0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1wcm9ncmVzcy1zcGlubmVyIGNpcmNsZSwubWF0LXNwaW5uZXIgY2lyY2xle3N0cm9rZTojZjU3YzAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50IGNpcmNsZSwubWF0LXNwaW5uZXIubWF0LWFjY2VudCBjaXJjbGV7c3Ryb2tlOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC13YXJuIGNpcmNsZSwubWF0LXNwaW5uZXIubWF0LXdhcm4gY2lyY2xle3N0cm9rZTojZjQ0MzM2fS5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmFkaW8taW5uZXItY2lyY2xlLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQ6bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnk6YWN0aXZlIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudCAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQ6bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50OmFjdGl2ZSAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZXtib3JkZXItY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2FybiAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2FybiAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuOmFjdGl2ZSAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8taW5uZXItY2lyY2xle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZCAubWF0LXJhZGlvLWxhYmVsLWNvbnRlbnR7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2VsZWN0LXZhbHVle2NvbG9yOiMyMTIxMjF9Lm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtc2VsZWN0LWRpc2FibGVkIC5tYXQtc2VsZWN0LXZhbHVle2NvbG9yOiM3NTc1NzV9Lm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6IzYxNjE2MX0ubWF0LXNlbGVjdC1wYW5lbHtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1zZWxlY3QtcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zZWxlY3QtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1wcmltYXJ5IC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm4gLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1pbnZhbGlkIC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZGlzYWJsZWQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6Izc1NzU3NX0ubWF0LWRyYXdlci1jb250YWluZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1wdXNoe2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWRyYXdlcjpub3QoLm1hdC1kcmF3ZXItc2lkZSl7Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kcmF3ZXItc2lkZXtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5ke2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdIC5tYXQtZHJhd2VyLXNpZGV7Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF0gLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZHtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLWJhY2tkcm9wLm1hdC1kcmF3ZXItc2hvd257YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC42KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZTpub3QoLm1hdC1jaGVja2VkKSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1wcmltYXJ5IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHtjb2xvcjojZmZmfS5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci1mb2N1cy1yaW5ne2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjIpfS5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7Y29sb3I6I2ZmZn0ubWF0LWFjY2VudCAubWF0LXNsaWRlci1mb2N1cy1yaW5ne2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjIpfS5tYXQtd2FybiAubWF0LXNsaWRlci10cmFjay1maWxsLC5tYXQtd2FybiAubWF0LXNsaWRlci10aHVtYiwubWF0LXdhcm4gLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtd2FybiAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e2NvbG9yOiNmZmZ9Lm1hdC13YXJuIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuMil9Lm1hdC1zbGlkZXI6aG92ZXIgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCwubWF0LXNsaWRlci5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmQsLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1kaXNhYmxlZDpob3ZlciAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZSAubWF0LXNsaWRlci1mb2N1cy1yaW5ne2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKSAubWF0LXNsaWRlci10aHVtYntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3ZlciAubWF0LXNsaWRlci10aHVtYiwubWF0LXNsaWRlci1taW4tdmFsdWU6bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1ie2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3Zlci5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWhhcy10aWNrcyAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlcntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuNyl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aWNrc3tiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6LW1vei1yZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KDAuMDAwMWRlZywgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdGlja3N7YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zdGVwLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZCwubWF0LXN0ZXAtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWQsLm1hdC1zdGVwLWhlYWRlcjpob3Zlcjpub3QoW2FyaWEtZGlzYWJsZWRdKSwubWF0LXN0ZXAtaGVhZGVyOmhvdmVyW2FyaWEtZGlzYWJsZWQ9ZmFsc2Vde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtc3RlcC1oZWFkZXI6aG92ZXJbYXJpYS1kaXNhYmxlZD10cnVlXXtjdXJzb3I6ZGVmYXVsdH1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtc3RlcC1oZWFkZXI6aG92ZXJ7YmFja2dyb3VuZDpub25lfX0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbCwubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1vcHRpb25hbHtjb2xvcjojNjE2MTYxfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb257YmFja2dyb3VuZC1jb2xvcjojNjE2MTYxO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZCwubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1pY29uLXN0YXRlLWRvbmUsLm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lZGl0e2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXIubWF0LWFjY2VudCAubWF0LXN0ZXAtaWNvbntjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXIubWF0LWFjY2VudCAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZCwubWF0LXN0ZXAtaGVhZGVyLm1hdC1hY2NlbnQgLm1hdC1zdGVwLWljb24tc3RhdGUtZG9uZSwubWF0LXN0ZXAtaGVhZGVyLm1hdC1hY2NlbnQgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdHtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyLm1hdC13YXJuIC5tYXQtc3RlcC1pY29ue2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlci5tYXQtd2FybiAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZCwubWF0LXN0ZXAtaGVhZGVyLm1hdC13YXJuIC5tYXQtc3RlcC1pY29uLXN0YXRlLWRvbmUsLm1hdC1zdGVwLWhlYWRlci5tYXQtd2FybiAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lZGl0e2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc3RhdGUtZXJyb3J7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWFjdGl2ZXtjb2xvcjojMjEyMTIxfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWVycm9ye2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwcGVyLWhvcml6b250YWwsLm1hdC1zdGVwcGVyLXZlcnRpY2Fse2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXN0ZXBwZXItdmVydGljYWwtbGluZTo6YmVmb3Jle2JvcmRlci1sZWZ0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXI6OmJlZm9yZSwubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXI6OmFmdGVyLC5tYXQtc3RlcHBlci1ob3Jpem9udGFsLWxpbmV7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVye2hlaWdodDo3MnB4fS5tYXQtc3RlcHBlci1sYWJlbC1wb3NpdGlvbi1ib3R0b20gLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyLC5tYXQtdmVydGljYWwtc3RlcHBlci1oZWFkZXJ7cGFkZGluZzoyNHB4IDI0cHh9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLWxpbmU6OmJlZm9yZXt0b3A6LTE2cHg7Ym90dG9tOi0xNnB4fS5tYXQtc3RlcHBlci1sYWJlbC1wb3NpdGlvbi1ib3R0b20gLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyOjphZnRlciwubWF0LXN0ZXBwZXItbGFiZWwtcG9zaXRpb24tYm90dG9tIC5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcjo6YmVmb3Jle3RvcDozNnB4fS5tYXQtc3RlcHBlci1sYWJlbC1wb3NpdGlvbi1ib3R0b20gLm1hdC1zdGVwcGVyLWhvcml6b250YWwtbGluZXt0b3A6MzZweH0ubWF0LXNvcnQtaGVhZGVyLWFycm93e2NvbG9yOiM2MTYxNjF9Lm1hdC10YWItbmF2LWJhciwubWF0LXRhYi1oZWFkZXJ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpfS5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlciAubWF0LXRhYi1uYXYtYmFyLC5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlciAubWF0LXRhYi1oZWFkZXJ7Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1ib3R0b206bm9uZX0ubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1saW5re2NvbG9yOiMyMTIxMjF9Lm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7Y29sb3I6Izc1NzU3NX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjojMjEyMTIxfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOiM3NTc1NzV9Lm1hdC10YWItZ3JvdXBbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV0gLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLW5hdi1iYXJbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV17Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci10b3A6bm9uZX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNjcsMzgsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5IC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC1pbmstYmFyLC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMjQsMTc4LC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC1pbmstYmFye2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC1pbmstYmFyLC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LWluay1iYXIsLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC1pbmstYmFyLC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNjcsMzgsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItbGluay1jb250YWluZXIsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGluaywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXRhYi1saW5re2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlciAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3Jle2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIyNCwxNzgsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmssLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmt7Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3JlLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmV7Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGluaywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXRhYi1saW5re2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3Jle2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRvb2xiYXJ7YmFja2dyb3VuZDojZjU3YzAwO2NvbG9yOiMyMTIxMjF9Lm1hdC10b29sYmFyLm1hdC1wcmltYXJ5e2JhY2tncm91bmQ6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtYWNjZW50e2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtd2FybntiYWNrZ3JvdW5kOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSwubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSwubWF0LXRvb2xiYXIgLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LXRvb2xiYXIgLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LXRvb2xiYXIgLm1hdC1zZWxlY3QtdmFsdWUsLm1hdC10b29sYmFyIC5tYXQtc2VsZWN0LWFycm93LC5tYXQtdG9vbGJhciAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6aW5oZXJpdH0ubWF0LXRvb2xiYXIgLm1hdC1pbnB1dC1lbGVtZW50e2NhcmV0LWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2xiYXItbXVsdGlwbGUtcm93c3ttaW4taGVpZ2h0OjY0cHh9Lm1hdC10b29sYmFyLXJvdywubWF0LXRvb2xiYXItc2luZ2xlLXJvd3toZWlnaHQ6NjRweH1AbWVkaWEobWF4LXdpZHRoOiA1OTlweCl7Lm1hdC10b29sYmFyLW11bHRpcGxlLXJvd3N7bWluLWhlaWdodDo1NnB4fS5tYXQtdG9vbGJhci1yb3csLm1hdC10b29sYmFyLXNpbmdsZS1yb3d7aGVpZ2h0OjU2cHh9fS5tYXQtdG9vbHRpcHtiYWNrZ3JvdW5kOnJnYmEoOTcsOTcsOTcsLjkpfS5tYXQtdHJlZXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10cmVlLW5vZGUsLm1hdC1uZXN0ZWQtdHJlZS1ub2Rle2NvbG9yOiMyMTIxMjF9Lm1hdC10cmVlLW5vZGV7bWluLWhlaWdodDo0OHB4fS5tYXQtc25hY2stYmFyLWNvbnRhaW5lcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KTtiYWNrZ3JvdW5kOiMzMjMyMzI7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbntjb2xvcjojZmY5ODAwfWJvZHl7b3ZlcmZsb3c6aGlkZGVufS5jZGstb3ZlcmxheS1jb250YWluZXJ7Y29udGFpbjpzdHJpY3R9YTpub3QoLm1hdC1idXR0b24sLm1hdC1pY29uLWJ1dHRvbil7Y29sb3I6IzE5NzZkMn1hOm5vdCgubWF0LWJ1dHRvbiwubWF0LWljb24tYnV0dG9uKTp2aXNpdGVke2NvbG9yOiM3YjFmYTJ9Ym9keS5kYXJrLW1vZGV7YmFja2dyb3VuZC1jb2xvcjojMzAzMDMwfWJvZHkuZGFyay1tb2RlIGE6bm90KC5tYXQtYnV0dG9uLC5tYXQtaWNvbi1idXR0b24pe2NvbG9yOiM0MmE1ZjV9Ym9keS5kYXJrLW1vZGUgYTpub3QoLm1hdC1idXR0b24sLm1hdC1pY29uLWJ1dHRvbik6dmlzaXRlZHtjb2xvcjojYmE2OGM4fWJvZHkuZGFyay1tb2RlIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX1ib2R5LmRhcmstbW9kZSAubWF0LW9wdGlvbntjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtb3B0aW9uOmhvdmVyOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC1vcHRpb246Zm9jdXM6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjA0KX1ib2R5LmRhcmstbW9kZSAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMDQpfWJvZHkuZGFyay1tb2RlIC5tYXQtb3B0aW9uLm1hdC1hY3RpdmV7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wNCk7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LW9wdGlvbi5tYXQtb3B0aW9uLWRpc2FibGVke2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjUpfWJvZHkuZGFyay1tb2RlIC5tYXQtcHJpbWFyeSAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtYWNjZW50IC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC13YXJuIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1vcHRncm91cC1sYWJlbHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LW9wdGdyb3VwLWRpc2FibGVkIC5tYXQtb3B0Z3JvdXAtbGFiZWx7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1wc2V1ZG8tY2hlY2tib3h7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1wc2V1ZG8tY2hlY2tib3g6OmFmdGVye2NvbG9yOiMzMDMwMzB9Ym9keS5kYXJrLW1vZGUgLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWR7Y29sb3I6IzY4Njg2OH1ib2R5LmRhcmstbW9kZSAubWF0LXByaW1hcnkgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCxib2R5LmRhcmstbW9kZSAubWF0LXByaW1hcnkgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZXtiYWNrZ3JvdW5kOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCxib2R5LmRhcmstbW9kZSAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLGJvZHkuZGFyay1tb2RlIC5tYXQtYWNjZW50IC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1hY2NlbnQgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZXtiYWNrZ3JvdW5kOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC13YXJuIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsYm9keS5kYXJrLW1vZGUgLm1hdC13YXJuIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGV7YmFja2dyb3VuZDojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWR7YmFja2dyb3VuZDojNjg2ODY4fWJvZHkuZGFyay1tb2RlIC5tYXQtYXBwLWJhY2tncm91bmQsYm9keS5kYXJrLW1vZGUubWF0LWFwcC1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6IzMwMzAzMDtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtZWxldmF0aW9uLXowe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWVsZXZhdGlvbi16MXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZWxldmF0aW9uLXoye2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejN7Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWVsZXZhdGlvbi16NHtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWVsZXZhdGlvbi16NXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA1cHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWVsZXZhdGlvbi16Nntib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejd7Ym94LXNoYWRvdzowcHggNHB4IDVweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggN3B4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDJweCAxNnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZWxldmF0aW9uLXo4e2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWVsZXZhdGlvbi16OXtib3gtc2hhZG93OjBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA5cHggMTJweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejEwe2JveC1zaGFkb3c6MHB4IDZweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEwcHggMTRweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDE4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejExe2JveC1zaGFkb3c6MHB4IDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDExcHggMTVweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDIwcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejEye2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejEze2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEzcHggMTlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI0cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejE0e2JveC1zaGFkb3c6MHB4IDdweCA5cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE0cHggMjFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI2cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejE1e2JveC1zaGFkb3c6MHB4IDhweCA5cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE1cHggMjJweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDI4cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejE2e2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZWxldmF0aW9uLXoxN3tib3gtc2hhZG93OjBweCA4cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTdweCAyNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWVsZXZhdGlvbi16MTh7Ym94LXNoYWRvdzowcHggOXB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE4cHggMjhweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejE5e2JveC1zaGFkb3c6MHB4IDlweCAxMnB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOXB4IDI5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZWxldmF0aW9uLXoyMHtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIwcHggMzFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDM4cHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejIxe2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjFweCAzM3B4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDBweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWVsZXZhdGlvbi16MjJ7Ym94LXNoYWRvdzowcHggMTBweCAxNHB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMnB4IDM1cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MnB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZWxldmF0aW9uLXoyM3tib3gtc2hhZG93OjBweCAxMXB4IDE0cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIzcHggMzZweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejI0e2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXRoZW1lLWxvYWRlZC1tYXJrZXJ7ZGlzcGxheTpub25lfWJvZHkuZGFyay1tb2RlIC5tYXQtYXV0b2NvbXBsZXRlLXBhbmVse2JhY2tncm91bmQ6IzQyNDI0Mjtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpe2JhY2tncm91bmQ6IzQyNDI0Mn1ib2R5LmRhcmstbW9kZSAubWF0LWF1dG9jb21wbGV0ZS1wYW5lbCAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1iYWRnZS1jb250ZW50e2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZWY2YzAwfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgYm9keS5kYXJrLW1vZGUgLm1hdC1iYWRnZS1jb250ZW50e291dGxpbmU6c29saWQgMXB4O2JvcmRlci1yYWRpdXM6MH1ib2R5LmRhcmstbW9kZSAubWF0LWJhZGdlLWFjY2VudCAubWF0LWJhZGdlLWNvbnRlbnR7YmFja2dyb3VuZDojZWY2YzAwO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1iYWRnZS13YXJuIC5tYXQtYmFkZ2UtY29udGVudHtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWJhZGdlLWRpc2FibGVkIC5tYXQtYmFkZ2UtY29udGVudHtiYWNrZ3JvdW5kOiM2ZTZlNmU7Y29sb3I6IzYxNjE2MX1ib2R5LmRhcmstbW9kZSAubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJ7Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojNDI0MjQyO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24sYm9keS5kYXJrLW1vZGUgLm1hdC1pY29uLWJ1dHRvbixib2R5LmRhcmstbW9kZSAubWF0LXN0cm9rZWQtYnV0dG9ue2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDp0cmFuc3BhcmVudH1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeSxib2R5LmRhcmstbW9kZSAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5LGJvZHkuZGFyay1tb2RlIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnl7Y29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi5tYXQtYWNjZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudCxib2R5LmRhcmstbW9kZSAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnR7Y29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi5tYXQtd2Fybixib2R5LmRhcmstbW9kZSAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuLGJvZHkuZGFyay1tb2RlIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm57Y29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi5tYXQtd2Fybi5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLm1hdC1idXR0b24tZGlzYWJsZWQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybi5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtaWNvbi1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSxib2R5LmRhcmstbW9kZSAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksYm9keS5kYXJrLW1vZGUgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksYm9keS5kYXJrLW1vZGUgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksYm9keS5kYXJrLW1vZGUgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLm1hdC13YXJuIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksYm9keS5kYXJrLW1vZGUgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LGJvZHkuZGFyay1tb2RlIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm4gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LGJvZHkuZGFyay1tb2RlIC5tYXQtaWNvbi1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LGJvZHkuZGFyay1tb2RlIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24gLm1hdC1yaXBwbGUtZWxlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LWljb24tYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1zdHJva2VkLWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50e29wYWNpdHk6LjE7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1zdHJva2VkLWJ1dHRvbjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbixib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b24sYm9keS5kYXJrLW1vZGUgLm1hdC1mYWIsYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzQyNDI0Mn1ib2R5LmRhcmstbW9kZSAubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5LGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeSxib2R5LmRhcmstbW9kZSAubWF0LWZhYi5tYXQtcHJpbWFyeSxib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5e2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtZmFiLm1hdC1hY2NlbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50e2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybixib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4sYm9keS5kYXJrLW1vZGUgLm1hdC1mYWIubWF0LXdhcm4sYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtd2Fybntjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4ubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtZmFiLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1mYWIubWF0LWFjY2VudC5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtZmFiLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1mYWIubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeSxib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnksYm9keS5kYXJrLW1vZGUgLm1hdC1mYWIubWF0LXByaW1hcnksYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtZmFiLm1hdC1hY2NlbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50e2JhY2tncm91bmQtY29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuLGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybixib2R5LmRhcmstbW9kZSAubWF0LWZhYi5tYXQtd2Fybixib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiLm1hdC13YXJue2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybi5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtZmxhdC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1idXR0b24tZGlzYWJsZWQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LWZhYi5tYXQtcHJpbWFyeS5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtZmFiLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LWZhYi5tYXQtd2Fybi5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtZmFiLm1hdC1idXR0b24tZGlzYWJsZWQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtd2Fybi5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtbWluaS1mYWIubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVke2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LWZhYi5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfWJvZHkuZGFyay1tb2RlIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1mYWIubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtZmFiLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zdHJva2VkLWJ1dHRvbjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSxib2R5LmRhcmstbW9kZSAubWF0LWZsYXQtYnV0dG9uOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b246bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b246bm90KC5tYXQtYnV0dG9uLWRpc2FibGVkKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWZhYjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSxib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWZhYjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSxib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiOm5vdCgubWF0LWJ1dHRvbi1kaXNhYmxlZCk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1mYWIubWF0LWJ1dHRvbi1kaXNhYmxlZDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSxib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiLm1hdC1idXR0b24tZGlzYWJsZWQ6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLGJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cHtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQsYm9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmR7Ym94LXNoYWRvdzpub25lfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC41KX1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi10b2dnbGUgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmR7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiM0MjQyNDJ9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtYnV0dG9uLXRvZ2dsZSsubWF0LWJ1dHRvbi10b2dnbGV7Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjEyKX1ib2R5LmRhcmstbW9kZSBbZGlyPXJ0bF0gLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlKy5tYXQtYnV0dG9uLXRvZ2dsZXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgyNTUsMjU1LDI1NSwuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1idXR0b24tdG9nZ2xlLXZlcnRpY2FsIC5tYXQtYnV0dG9uLXRvZ2dsZSsubWF0LWJ1dHRvbi10b2dnbGV7Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6bm9uZTtib3JkZXItdG9wOnNvbGlkIDFweCByZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWR7YmFja2dyb3VuZC1jb2xvcjojMjEyMTIxO2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmR7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMyk7YmFja2dyb3VuZC1jb2xvcjojMDAwfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJke2JhY2tncm91bmQ6IzQyNDI0Mn1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZHtiYWNrZ3JvdW5kLWNvbG9yOiM0MjQyNDJ9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCxib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZHtib3JkZXI6c29saWQgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWNhcmR7YmFja2dyb3VuZDojNDI0MjQyO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1jYXJkOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1jYXJkLm1hdC1jYXJkLWZsYXQ6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FyZC1zdWJ0aXRsZXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWNoZWNrYm94LWZyYW1le2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWNoZWNrYm94LWNoZWNrbWFya3tmaWxsOiMzMDMwMzB9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHtzdHJva2U6IzMwMzAzMCAhaW1wb3J0YW50fWJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3gtbWl4ZWRtYXJre2JhY2tncm91bmQtY29sb3I6IzMwMzAzMH1ib2R5LmRhcmstbW9kZSAubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXByaW1hcnkgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLGJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtcHJpbWFyeSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtYWNjZW50IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCxib2R5LmRhcmstbW9kZSAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudCAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtd2FybiAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsYm9keS5kYXJrLW1vZGUgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC13YXJuIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtY2hlY2tlZCAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsYm9keS5kYXJrLW1vZGUgLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojNjg2ODY4fWJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3gtZGlzYWJsZWQ6bm90KC5tYXQtY2hlY2tib3gtY2hlY2tlZCkgLm1hdC1jaGVja2JveC1mcmFtZXtib3JkZXItY29sb3I6IzY4Njg2OH1ib2R5LmRhcmstbW9kZSAubWF0LWNoZWNrYm94LWRpc2FibGVkIC5tYXQtY2hlY2tib3gtbGFiZWx7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGVja2JveCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWNoZWNrYm94LWNoZWNrZWQ6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1jaGVja2JveDphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZDojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3gtY2hlY2tlZDpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3g6YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZDojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3gtY2hlY2tlZDpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LWNoZWNrYm94OmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwe2JhY2tncm91bmQtY29sb3I6IzYxNjE2MTtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcCAubWF0LWNoaXAtcmVtb3Zle2NvbG9yOiNmZmY7b3BhY2l0eTouNH1ib2R5LmRhcmstbW9kZSAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXA6bm90KC5tYXQtY2hpcC1kaXNhYmxlZCk6YWN0aXZle2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpIC5tYXQtY2hpcC1yZW1vdmU6aG92ZXJ7b3BhY2l0eTouNTR9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLWRpc2FibGVke29wYWNpdHk6LjR9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwOjphZnRlcntiYWNrZ3JvdW5kOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5e2JhY2tncm91bmQtY29sb3I6I2VmNmMwMDtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeSAubWF0LWNoaXAtcmVtb3Zle2NvbG9yOiNmZmY7b3BhY2l0eTouNH1ib2R5LmRhcmstbW9kZSAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2FybntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm4gLm1hdC1jaGlwLXJlbW92ZXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX1ib2R5LmRhcmstbW9kZSAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudHtiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDA7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudCAubWF0LWNoaXAtcmVtb3Zle2NvbG9yOiNmZmY7b3BhY2l0eTouNH1ib2R5LmRhcmstbW9kZSAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWJsZXtiYWNrZ3JvdW5kOiM0MjQyNDJ9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWJsZSB0aGVhZCxib2R5LmRhcmstbW9kZSAubWF0LXRhYmxlIHRib2R5LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFibGUgdGZvb3QsYm9keS5kYXJrLW1vZGUgbWF0LWhlYWRlci1yb3csYm9keS5kYXJrLW1vZGUgbWF0LXJvdyxib2R5LmRhcmstbW9kZSBtYXQtZm9vdGVyLXJvdyxib2R5LmRhcmstbW9kZSBbbWF0LWhlYWRlci1yb3ddLGJvZHkuZGFyay1tb2RlIFttYXQtcm93XSxib2R5LmRhcmstbW9kZSBbbWF0LWZvb3Rlci1yb3ddLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFibGUtc3RpY2t5e2JhY2tncm91bmQ6aW5oZXJpdH1ib2R5LmRhcmstbW9kZSBtYXQtcm93LGJvZHkuZGFyay1tb2RlIG1hdC1oZWFkZXItcm93LGJvZHkuZGFyay1tb2RlIG1hdC1mb290ZXItcm93LGJvZHkuZGFyay1tb2RlIHRoLm1hdC1oZWFkZXItY2VsbCxib2R5LmRhcmstbW9kZSB0ZC5tYXQtY2VsbCxib2R5LmRhcmstbW9kZSB0ZC5tYXQtZm9vdGVyLWNlbGx7Ym9yZGVyLWJvdHRvbS1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1oZWFkZXItY2VsbHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWNlbGwsYm9keS5kYXJrLW1vZGUgLm1hdC1mb290ZXItY2VsbHtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYXJyb3d7ZmlsbDojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci10b2dnbGUsYm9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQgLm1hdC1jYWxlbmRhci1uZXh0LWJ1dHRvbixib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbntjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjUpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyLWRpdmlkZXI6OmFmdGVye2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYm9keS1sYWJlbHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZS1yYW5nZS1pbnB1dC1zZXBhcmF0b3J7Y29sb3I6I2ZmZjtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9Ym9keS5kYXJrLW1vZGUgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCl7Y29sb3I6IzYxNjE2MX1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1kYXRlLXJhbmdlLWlucHV0LXNlcGFyYXRvcntjb2xvcjojNjE2MTYxfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYm9keS1pbi1wcmV2aWV3e2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjI0KX1ib2R5LmRhcmstbW9kZSAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCl7Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjUpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCl7Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjMpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYm9keS1pbi1yYW5nZTo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgyMzksMTA4LDAsLjIpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCxib2R5LmRhcmstbW9kZSAubWF0LWNhbGVuZGFyLWJvZHktaW4tY29tcGFyaXNvbi1yYW5nZTo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgyNDksMTcxLDAsLjIpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1zdGFydDo6YmVmb3JlLGJvZHkuZGFyay1tb2RlIFtkaXI9cnRsXSAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2UtZW5kOjpiZWZvcmV7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMjM5LCAxMDgsIDAsIDAuMikgNTAlLCByZ2JhKDI0OSwgMTcxLCAwLCAwLjIpIDUwJSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3JlLGJvZHkuZGFyay1tb2RlIFtkaXI9cnRsXSAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2Utc3RhcnQ6OmJlZm9yZXtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byBsZWZ0LCByZ2JhKDIzOSwgMTA4LCAwLCAwLjIpIDUwJSwgcmdiYSgyNDksIDE3MSwgMCwgMC4yKSA1MCUpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYm9keS1pbi1yYW5nZT4ubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwsYm9keS5kYXJrLW1vZGUgLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2UubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U6OmFmdGVye2JhY2tncm91bmQ6I2E4ZGFiNX1ib2R5LmRhcmstbW9kZSAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2U+Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQ6IzQ2YTM1ZX1ib2R5LmRhcmstbW9kZSAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjM5LDEwOCwwLC40KX1ib2R5LmRhcmstbW9kZSAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWNhbGVuZGFyLWJvZHktY2VsbDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3Zlcj4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpLGJvZHkuZGFyay1tb2RlIC5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlPi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCksYm9keS5kYXJrLW1vZGUgLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZT4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyMzksMTA4LDAsLjMpfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50e2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6IzQyNDI0Mjtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWluLXJhbmdlOjpiZWZvcmV7YmFja2dyb3VuZDpyZ2JhKDIzOSwxMDgsMCwuMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwsYm9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktaW4tY29tcGFyaXNvbi1yYW5nZTo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgyNDksMTcxLDAsLjIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLXN0YXJ0OjpiZWZvcmUsYm9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCBbZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDIzOSwgMTA4LCAwLCAwLjIpIDUwJSwgcmdiYSgyNDksIDE3MSwgMCwgMC4yKSA1MCUpfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3JlLGJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgW2Rpcj1ydGxdIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1zdGFydDo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIGxlZnQsIHJnYmEoMjM5LCAxMDgsIDAsIDAuMikgNTAlLCByZ2JhKDI0OSwgMTcxLCAwLCAwLjIpIDUwJSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U+Lm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsLGJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2UubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U6OmFmdGVye2JhY2tncm91bmQ6I2E4ZGFiNX1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCxib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kOiM0NmEzNWV9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQ+Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6cmdiYSgyMzksMTA4LDAsLjQpfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktY2VsbDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3Zlcj4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpLGJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKSxib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjM5LDEwOCwwLC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U6OmJlZm9yZXtiYWNrZ3JvdW5kOnJnYmEoMjQ0LDY3LDU0LC4yKX1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwsYm9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2U6OmJlZm9yZXtiYWNrZ3JvdW5kOnJnYmEoMjQ5LDE3MSwwLC4yKX1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2Utc3RhcnQ6OmJlZm9yZSxib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiBbZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDI0NCwgNjcsIDU0LCAwLjIpIDUwJSwgcmdiYSgyNDksIDE3MSwgMCwgMC4yKSA1MCUpfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1lbmQ6OmJlZm9yZSxib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiBbZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLXN0YXJ0OjpiZWZvcmV7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gbGVmdCwgcmdiYSgyNDQsIDY3LCA1NCwgMC4yKSA1MCUsIHJnYmEoMjQ5LCAxNzEsIDAsIDAuMikgNTAlKX1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U+Lm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsLGJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlLm1hdC1jYWxlbmRhci1ib2R5LWluLXJhbmdlOjphZnRlcntiYWNrZ3JvdW5kOiNhOGRhYjV9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kOiM0NmEzNWV9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGw6bm90KC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCk6aG92ZXI+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKSxib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZT4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpLGJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaHtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmV7Y29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtYWNjZW50e2NvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LXdhcm57Y29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGUtcmFuZ2UtaW5wdXQtaW5uZXJbZGlzYWJsZWRde2NvbG9yOiM2MTYxNjF9Ym9keS5kYXJrLW1vZGUgLm1hdC1kaWFsb2ctY29udGFpbmVye2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiM0MjQyNDI7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWRpdmlkZXJ7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1kaXZpZGVyLXZlcnRpY2Fse2JvcmRlci1yaWdodC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1leHBhbnNpb24tcGFuZWx7YmFja2dyb3VuZDojNDI0MjQyO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1leHBhbnNpb24tcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWFjdGlvbi1yb3d7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1leHBhbnNpb24tcGFuZWwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksYm9keS5kYXJrLW1vZGUgLm1hdC1leHBhbnNpb24tcGFuZWwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSxib2R5LmRhcmstbW9kZSAubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoLm1hdC1leHBhbmRlZCkgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyOmhvdmVyOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSl7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXtib2R5LmRhcmstbW9kZSAubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoLm1hdC1leHBhbmRlZCk6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI6aG92ZXJ7YmFja2dyb3VuZDojNDI0MjQyfX1ib2R5LmRhcmstbW9kZSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGV7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb24sYm9keS5kYXJrLW1vZGUgLm1hdC1leHBhbnNpb24taW5kaWNhdG9yOjphZnRlcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGUsYm9keS5kYXJrLW1vZGUgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0gLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9ue2NvbG9yOmluaGVyaXR9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfWJvZHkuZGFyay1tb2RlIC5tYXQtaGludHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50e2NvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtd2Fybntjb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2Vye2NvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC13YXJue2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZDpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZDpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC1hY2NlbnQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LXdhcm4gLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1sYWJlbCAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2Vye2NvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSxib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtZXJyb3J7Y29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWhpbnR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpIDAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNykgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNykgMCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtZmxleHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWZsZXh7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4wNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC41KX1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjojNjE2MTYxfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LWFjY2VudCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LXdhcm4gLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7Y29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOiM2MTYxNjF9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1pY29uLm1hdC1wcmltYXJ5e2NvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1pY29uLm1hdC1hY2NlbnR7Y29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LWljb24ubWF0LXdhcm57Y29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfWJvZHkuZGFyay1tb2RlIC5tYXQtaW5wdXQtZWxlbWVudDpkaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOiM2MTYxNjF9Ym9keS5kYXJrLW1vZGUgLm1hdC1pbnB1dC1lbGVtZW50e2NhcmV0LWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1pbnB1dC1lbGVtZW50OjpwbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC41KX1ib2R5LmRhcmstbW9kZSAubWF0LWlucHV0LWVsZW1lbnQ6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjUpfWJvZHkuZGFyay1tb2RlIC5tYXQtaW5wdXQtZWxlbWVudDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1pbnB1dC1lbGVtZW50IG9wdGlvbntjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1pbnB1dC1lbGVtZW50IG9wdGlvbjpkaXNhYmxlZHtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLm1hdC1hY2NlbnQgLm1hdC1pbnB1dC1lbGVtZW50e2NhcmV0LWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLm1hdC13YXJuIC5tYXQtaW5wdXQtZWxlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWlucHV0LWVsZW1lbnR7Y2FyZXQtY29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWxpc3QtYmFzZSAubWF0LWxpc3QtaXRlbXtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1vcHRpb257Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWxpc3QtYmFzZSAubWF0LXN1YmhlYWRlcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWxpc3QtaXRlbS1kaXNhYmxlZHtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1saXN0LW9wdGlvbjpob3Zlcixib2R5LmRhcmstbW9kZSAubWF0LWxpc3Qtb3B0aW9uOmZvY3VzLGJvZHkuZGFyay1tb2RlIC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LWl0ZW06aG92ZXIsYm9keS5kYXJrLW1vZGUgLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbTpmb2N1cyxib2R5LmRhcmstbW9kZSAubWF0LWFjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtOmhvdmVyLGJvZHkuZGFyay1tb2RlIC5tYXQtYWN0aW9uLWxpc3QgLm1hdC1saXN0LWl0ZW06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wNCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb24sYm9keS5kYXJrLW1vZGUgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb246aG92ZXIsYm9keS5kYXJrLW1vZGUgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb246Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1tZW51LXBhbmVse2JhY2tncm91bmQ6IzQyNDI0Mn1ib2R5LmRhcmstbW9kZSAubWF0LW1lbnUtcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1tZW51LWl0ZW17YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXSxib2R5LmRhcmstbW9kZSAubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF0gLm1hdC1tZW51LXN1Ym1lbnUtaWNvbixib2R5LmRhcmstbW9kZSAubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF0gLm1hdC1pY29uLW5vLWNvbG9ye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjUpfWJvZHkuZGFyay1tb2RlIC5tYXQtbWVudS1pdGVtIC5tYXQtaWNvbi1uby1jb2xvcixib2R5LmRhcmstbW9kZSAubWF0LW1lbnUtc3VibWVudS1pY29ue2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1tZW51LWl0ZW06aG92ZXI6bm90KFtkaXNhYmxlZF0pLGJvZHkuZGFyay1tb2RlIC5tYXQtbWVudS1pdGVtLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KFtkaXNhYmxlZF0pLGJvZHkuZGFyay1tb2RlIC5tYXQtbWVudS1pdGVtLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdChbZGlzYWJsZWRdKSxib2R5LmRhcmstbW9kZSAubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZDpub3QoW2Rpc2FibGVkXSl7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wNCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1wYWdpbmF0b3J7YmFja2dyb3VuZDojNDI0MjQyfWJvZHkuZGFyay1tb2RlIC5tYXQtcGFnaW5hdG9yLGJvZHkuZGFyay1tb2RlIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSAubWF0LXNlbGVjdC10cmlnZ2Vye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfWJvZHkuZGFyay1tb2RlIC5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnR7Ym9yZGVyLXRvcDoycHggc29saWQgI2ZmZjtib3JkZXItcmlnaHQ6MnB4IHNvbGlkICNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1wYWdpbmF0b3ItZmlyc3QsYm9keS5kYXJrLW1vZGUgLm1hdC1wYWdpbmF0b3ItbGFzdHtib3JkZXItdG9wOjJweCBzb2xpZCAjZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItZmlyc3QsYm9keS5kYXJrLW1vZGUgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItbGFzdHtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZHtmaWxsOiM2MDNmMjR9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6IzYwM2YyNH1ib2R5LmRhcmstbW9kZSAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudCAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5ke2ZpbGw6IzYwM2YyNH1ib2R5LmRhcmstbW9kZSAubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcntiYWNrZ3JvdW5kLWNvbG9yOiM2MDNmMjR9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudCAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm4gLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZHtmaWxsOiM2MTM1MzJ9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm4gLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6IzYxMzUzMn1ib2R5LmRhcmstbW9kZSAubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1zcGlubmVyIGNpcmNsZSxib2R5LmRhcmstbW9kZSAubWF0LXNwaW5uZXIgY2lyY2xle3N0cm9rZTojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50IGNpcmNsZSxib2R5LmRhcmstbW9kZSAubWF0LXNwaW5uZXIubWF0LWFjY2VudCBjaXJjbGV7c3Ryb2tlOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC13YXJuIGNpcmNsZSxib2R5LmRhcmstbW9kZSAubWF0LXNwaW5uZXIubWF0LXdhcm4gY2lyY2xle3N0cm9rZTojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZXtib3JkZXItY29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSxib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSxib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlLGJvZHkuZGFyay1tb2RlIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5OmFjdGl2ZSAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1yYWRpby1pbm5lci1jaXJjbGUsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudCAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSxib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudDphY3RpdmUgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4gLm1hdC1yYWRpby1pbm5lci1jaXJjbGUsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4gLm1hdC1yYWRpby1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudDpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksYm9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSxib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2FybjphY3RpdmUgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkLm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlLGJvZHkuZGFyay1tb2RlIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8taW5uZXItY2lyY2xle2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tbGFiZWwtY29udGVudHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC41KX1ib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXNlbGVjdC12YWx1ZXtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtc2VsZWN0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjUpfWJvZHkuZGFyay1tb2RlIC5tYXQtc2VsZWN0LWRpc2FibGVkIC5tYXQtc2VsZWN0LXZhbHVle2NvbG9yOiM2MTYxNjF9Ym9keS5kYXJrLW1vZGUgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zZWxlY3QtcGFuZWx7YmFja2dyb3VuZDojNDI0MjQyfWJvZHkuZGFyay1tb2RlIC5tYXQtc2VsZWN0LXBhbmVsOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtc2VsZWN0LXBhbmVsIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpe2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtcHJpbWFyeSAubWF0LXNlbGVjdC1hcnJvd3tjb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtYWNjZW50IC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC13YXJuIC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtaW52YWxpZCAubWF0LXNlbGVjdC1hcnJvd3tjb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZCAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWRpc2FibGVkIC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiM2MTYxNjF9Ym9keS5kYXJrLW1vZGUgLm1hdC1kcmF3ZXItY29udGFpbmVye2JhY2tncm91bmQtY29sb3I6IzMwMzAzMDtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtZHJhd2Vye2JhY2tncm91bmQtY29sb3I6IzQyNDI0Mjtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtZHJhd2VyLm1hdC1kcmF3ZXItcHVzaHtiYWNrZ3JvdW5kLWNvbG9yOiM0MjQyNDJ9Ym9keS5kYXJrLW1vZGUgLm1hdC1kcmF3ZXI6bm90KC5tYXQtZHJhd2VyLXNpZGUpe2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZHJhd2VyLXNpZGV7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZHtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgyNTUsMjU1LDI1NSwuMTIpO2JvcmRlci1yaWdodDpub25lfWJvZHkuZGFyay1tb2RlIFtkaXI9cnRsXSAubWF0LWRyYXdlci1zaWRle2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDI1NSwyNTUsMjU1LC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9Ym9keS5kYXJrLW1vZGUgW2Rpcj1ydGxdIC5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmR7Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWRyYXdlci1iYWNrZHJvcC5tYXQtZHJhd2VyLXNob3due2JhY2tncm91bmQtY29sb3I6cmdiYSgxODksMTg5LDE4OSwuNil9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjM5LDEwOCwwLC41NCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjM5LDEwOCwwLC41NCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC41NCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGU6bm90KC5tYXQtY2hlY2tlZCkgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNiZGJkYmR9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjMpfWJvZHkuZGFyay1tb2RlIC5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci10cmFjay1maWxsLGJvZHkuZGFyay1tb2RlIC5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci10aHVtYixib2R5LmRhcmstbW9kZSAubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcmltYXJ5IC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDIzOSwxMDgsMCwuMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdHJhY2stZmlsbCxib2R5LmRhcmstbW9kZSAubWF0LWFjY2VudCAubWF0LXNsaWRlci10aHVtYixib2R5LmRhcmstbW9kZSAubWF0LWFjY2VudCAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDIzOSwxMDgsMCwuMil9Ym9keS5kYXJrLW1vZGUgLm1hdC13YXJuIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsYm9keS5kYXJrLW1vZGUgLm1hdC13YXJuIC5tYXQtc2xpZGVyLXRodW1iLGJvZHkuZGFyay1tb2RlIC5tYXQtd2FybiAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC13YXJuIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXdhcm4gLm1hdC1zbGlkZXItZm9jdXMtcmluZ3tiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC4yKX1ib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlcjpob3ZlciAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kLGJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGVyLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kLGJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsYm9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlci1kaXNhYmxlZDpob3ZlciAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZXItbWluLXZhbHVlIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyAubWF0LXNsaWRlci10aHVtYixib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JhY2tncm91bmQtY29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLGJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlci1taW4tdmFsdWU6bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpIC5tYXQtc2xpZGVyLXRodW1ie2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4zKTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fWJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIgLm1hdC1zbGlkZXItdGh1bWIsYm9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3Zlci5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRodW1iLGJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZXItaGFzLXRpY2tzIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVye2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRpY2tze2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotbW96LXJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQoMC4wMDAxZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX1ib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aWNrc3tiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX1ib2R5LmRhcmstbW9kZSAubWF0LXN0ZXAtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkLGJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZCxib2R5LmRhcmstbW9kZSAubWF0LXN0ZXAtaGVhZGVyOmhvdmVyOm5vdChbYXJpYS1kaXNhYmxlZF0pLGJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXI6aG92ZXJbYXJpYS1kaXNhYmxlZD1mYWxzZV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4wNCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zdGVwLWhlYWRlcjpob3ZlclthcmlhLWRpc2FibGVkPXRydWVde2N1cnNvcjpkZWZhdWx0fUBtZWRpYShob3Zlcjogbm9uZSl7Ym9keS5kYXJrLW1vZGUgLm1hdC1zdGVwLWhlYWRlcjpob3ZlcntiYWNrZ3JvdW5kOm5vbmV9fWJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWxhYmVsLGJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLW9wdGlvbmFse2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfWJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb257YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KTtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc2VsZWN0ZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lLGJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdHtiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDA7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXN0ZXAtaGVhZGVyLm1hdC1hY2NlbnQgLm1hdC1zdGVwLWljb257Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXN0ZXAtaGVhZGVyLm1hdC1hY2NlbnQgLm1hdC1zdGVwLWljb24tc2VsZWN0ZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1zdGVwLWhlYWRlci5tYXQtYWNjZW50IC5tYXQtc3RlcC1pY29uLXN0YXRlLWRvbmUsYm9keS5kYXJrLW1vZGUgLm1hdC1zdGVwLWhlYWRlci5tYXQtYWNjZW50IC5tYXQtc3RlcC1pY29uLXN0YXRlLWVkaXR7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1zdGVwLWhlYWRlci5tYXQtd2FybiAubWF0LXN0ZXAtaWNvbntjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIubWF0LXdhcm4gLm1hdC1zdGVwLWljb24tc2VsZWN0ZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1zdGVwLWhlYWRlci5tYXQtd2FybiAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lLGJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIubWF0LXdhcm4gLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9ye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1hY3RpdmV7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1lcnJvcntjb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsLGJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcHBlci12ZXJ0aWNhbHtiYWNrZ3JvdW5kLWNvbG9yOiM0MjQyNDJ9Ym9keS5kYXJrLW1vZGUgLm1hdC1zdGVwcGVyLXZlcnRpY2FsLWxpbmU6OmJlZm9yZXtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyOjpiZWZvcmUsYm9keS5kYXJrLW1vZGUgLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyOjphZnRlcixib2R5LmRhcmstbW9kZSAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbC1saW5le2JvcmRlci10b3AtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtc29ydC1oZWFkZXItYXJyb3d7Y29sb3I6I2M2YzZjNn1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWhlYWRlcntib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tYXQtdGFiLW5hdi1iYXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tYXQtdGFiLWhlYWRlcntib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4xMik7Ym9yZGVyLWJvdHRvbTpub25lfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWxhYmVsLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWxpbmt7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjojNjE2MTYxfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6IzYxNjE2MX1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cFtjbGFzcyo9bWF0LWJhY2tncm91bmQtXSAubWF0LXRhYi1oZWFkZXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhcltjbGFzcyo9bWF0LWJhY2tncm91bmQtXXtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLXRvcDpub25lfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjUxLDE0MCwwLC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LWluay1iYXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtaW5rLWJhcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtaW5rLWJhcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtaW5rLWJhcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1pbmstYmFye2JhY2tncm91bmQtY29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTEsMTQwLDAsLjMpfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC1pbmstYmFyLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LWluay1iYXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1pbmstYmFyLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyIC5tYXQtaW5rLWJhcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC1pbmstYmFyLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC1pbmstYmFye2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LWluay1iYXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LWluay1iYXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LWluay1iYXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjUxLDE0MCwwLC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItbGluay1jb250YWluZXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9ue2JhY2tncm91bmQtY29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbCxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmssYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbCxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGlua3tjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3JlLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3JlLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZXtib3JkZXItY29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC1yaXBwbGUtZWxlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1MSwxNDAsMCwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1saW5rLWNvbnRhaW5lcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbntiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbCxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGluayxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGlua3tjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3JlLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZXtib3JkZXItY29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1saW5rLWNvbnRhaW5lcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXRhYi1saW5rLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmt7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVke2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3JlLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmV7Ym9yZGVyLWNvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1yaXBwbGUtZWxlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbGJhcntiYWNrZ3JvdW5kOiNlZjZjMDA7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXRvb2xiYXIubWF0LXByaW1hcnl7YmFja2dyb3VuZDojZWY2YzAwO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC10b29sYmFyLm1hdC1hY2NlbnR7YmFja2dyb3VuZDojZWY2YzAwO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC10b29sYmFyLm1hdC13YXJue2JhY2tncm91bmQ6I2Y0NDMzNjtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbGJhciAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lLGJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbGJhciAubWF0LWZvcm0tZmllbGQtcmlwcGxlLGJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbGJhciAubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn1ib2R5LmRhcmstbW9kZSAubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLGJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbGJhciAubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLGJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbGJhciAubWF0LXNlbGVjdC12YWx1ZSxib2R5LmRhcmstbW9kZSAubWF0LXRvb2xiYXIgLm1hdC1zZWxlY3QtYXJyb3csYm9keS5kYXJrLW1vZGUgLm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LXNlbGVjdC1hcnJvd3tjb2xvcjppbmhlcml0fWJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbGJhciAubWF0LWlucHV0LWVsZW1lbnR7Y2FyZXQtY29sb3I6Y3VycmVudENvbG9yfWJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbHRpcHtiYWNrZ3JvdW5kOnJnYmEoOTcsOTcsOTcsLjkpfWJvZHkuZGFyay1tb2RlIC5tYXQtdHJlZXtiYWNrZ3JvdW5kOiM0MjQyNDJ9Ym9keS5kYXJrLW1vZGUgLm1hdC10cmVlLW5vZGUsYm9keS5kYXJrLW1vZGUgLm1hdC1uZXN0ZWQtdHJlZS1ub2Rle2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbmFjay1iYXItY29udGFpbmVye2NvbG9yOnJnYmEoMCwwLDAsLjg3KTtiYWNrZ3JvdW5kOiNmYWZhZmE7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbntjb2xvcjppbmhlcml0fQo8L3N0eWxlPgoKPHN0eWxlPgogIGh0bWwsCiAgYm9keSB7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAwOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZm9udC1mYW1pbHk6IFJvYm90bywgc2Fucy1zZXJpZjsKICAgIGNvbG9yOiB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpOwoKICAgIC8qIExlZ2FjeSBtZWNoYW5pc20gdG8gYXZvaWQgaXNzdWVzIHdpdGggc3VicGl4ZWwgYW50aS1hbGlhc2luZyBvbiBtYWNPUy4KICAgICAqCiAgICAgKiBJbiB0aGUgcGFzdCBbMV0sIG1hY09TIHN1YnBpeGVsIEFBIGNhdXNlZCBleGNlc3NpdmUgYm9sZGluZyBmb3IgbGlnaHQtb24tZGFyayB0ZXh0OyB0aGlzIHJ1bGUKICAgICAqIGF2b2lkcyB0aGF0IGJ5IHJlcXVlc3Rpbmcgbm9uLXN1YnBpeGVsIEFBIGFsd2F5cywgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQgYmVoYXZpb3IsIHdoaWNoIGlzCiAgICAgKiB0byB1c2Ugc3VicGl4ZWwgQUEgd2hlbiBhdmFpbGFibGUuIFRoZSBvcmlnaW5hbCBpc3N1ZSB3YXMgImZpeGVkIiBieSByZW1vdmluZyBzdWJwaXhlbCBBQSBpbgogICAgICogbWFjT1MgMTQgKE1vamF2ZSksIGJ1dCBmb3IgbGVnYWN5IHJlYXNvbnMgdGhleSBwcmVzZXJ2ZWQgdGhlIGJvbGRpbmcgZWZmZWN0IGFzIGFuIG9wdGlvbi4KICAgICAqIENocm9tZSB0aGVuIGluIHR1cm4gdXBkYXRlZCBpdHMgZm9udCByZW5kZXJpbmcgdG8gYXBwbHkgdGhhdCBib2xkaW5nIGVmZmVjdCBbMl0sIHdoaWNoIG1lYW5zCiAgICAgKiB0aGF0IGV2ZW4gdGhvdWdoIHRoZSBgLXdlYmtpdC1mb250LXNtb290aGluZ2AgZG9jcyBbM10gc3VnZ2VzdCB0aGF0IHNldHRpbmcgYGFudGlhbGlhc2VkYAogICAgICogd291bGQgaGF2ZSBubyBlZmZlY3QgZm9yIHJlY2VudCB2ZXJzaW9ucyBvZiBtYWNPUywgaXQgc3RpbGwgaXMgbmVlZGVkIHRvIGF2b2lkIHRoZSBib2xkaW5nLgogICAgICoKICAgICAqIFsxXTogaHR0cDovL3d3dy5saWdodGVycmEuY29tL2FydGljbGVzL21hY29zeHRleHRhYWJ1Zy8KICAgICAqIFsyXTogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9ODU4ODYxCiAgICAgKiBbM106IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9mb250LXNtb290aAogICAgICoKICAgICAqLwoKICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogIH0KICBub3NjcmlwdCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG1hcmdpbjogMCBhdXRvOwogICAgbWF4LXdpZHRoOiA2MDBweDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgfQo8L3N0eWxlPgoKPC9oZWFkPjxib2R5Pjxub3NjcmlwdD4KICAgIDxoMT5UZW5zb3JCb2FyZCByZXF1aXJlcyBKYXZhU2NyaXB0PC9oMT4KICAgIDxwPlBsZWFzZSBlbmFibGUgSmF2YVNjcmlwdCBhbmQgcmVsb2FkIHRoaXMgcGFnZS48L3A+CiAgPC9ub3NjcmlwdD48dGItd2ViYXBwPjwvdGItd2ViYXBwPjxzY3JpcHQgc3JjPSJpbmRleC5qcz9fZmlsZV9oYXNoPTI5YTdkMDNhIj48L3NjcmlwdD48L2JvZHk+PC9odG1sPg==", + "headers": [ + [ + "content-type", + "text/html; charset=utf-8" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/environment": { + "data": "eyJ2ZXJzaW9uIjogIjIuNy4wIiwgImRhdGFfbG9jYXRpb24iOiAiLi90dXRvcmlhbF9leHBzIiwgIndpbmRvd190aXRsZSI6ICIiLCAiZXhwZXJpbWVudF9uYW1lIjogIiIsICJleHBlcmltZW50X2Rlc2NyaXB0aW9uIjogIiIsICJjcmVhdGlvbl90aW1lIjogMC4wLCAiZGVidWciOiB7ImRhdGFfcHJvdmlkZXIiOiAiR3JwY0RhdGFQcm92aWRlcihhZGRyPSdsb2NhbGhvc3Q6MzMwNzcnKSIsICJmbGFncyI6IHsibG9nZGlyIjogIi4vdHV0b3JpYWxfZXhwcyIsICJsb2dkaXJfc3BlYyI6ICIiLCAiaG9zdCI6IG51bGwsICJiaW5kX2FsbCI6IGZhbHNlLCAicG9ydCI6IG51bGwsICJyZXVzZV9wb3J0IjogZmFsc2UsICJsb2FkX2Zhc3QiOiAiYXV0byIsICJleHRyYV9kYXRhX3NlcnZlcl9mbGFncyI6ICIiLCAiZ3JwY19jcmVkc190eXBlIjogImxvY2FsIiwgImdycGNfZGF0YV9wcm92aWRlciI6ICIiLCAicHVyZ2Vfb3JwaGFuZWRfZGF0YSI6IHRydWUsICJkYiI6ICIiLCAiZGJfaW1wb3J0IjogZmFsc2UsICJpbnNwZWN0IjogZmFsc2UsICJ2ZXJzaW9uX3RiIjogZmFsc2UsICJ0YWciOiAiIiwgImV2ZW50X2ZpbGUiOiAiIiwgInBhdGhfcHJlZml4IjogIiIsICJ3aW5kb3dfdGl0bGUiOiAiIiwgIm1heF9yZWxvYWRfdGhyZWFkcyI6IDEsICJyZWxvYWRfaW50ZXJ2YWwiOiA1LjAsICJyZWxvYWRfdGFzayI6ICJhdXRvIiwgInJlbG9hZF9tdWx0aWZpbGUiOiBudWxsLCAicmVsb2FkX211bHRpZmlsZV9pbmFjdGl2ZV9zZWNzIjogODY0MDAsICJnZW5lcmljX2RhdGEiOiAiYXV0byIsICJzYW1wbGVzX3Blcl9wbHVnaW4iOiB7fSwgImN1c3RvbV9wcmVkaWN0X2ZuIjogIiIsICJ3aXRfZGF0YV9kaXIiOiAiIiwgIl9fdGVuc29yYm9hcmRfc3ViY29tbWFuZCI6ICJzZXJ2ZSJ9fX0=", + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/tags": { + "data": "e30=", + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugins_listing": { + "data": "eyJzY2FsYXJzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAic2NhbGFycyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtc2NhbGFyLWRhc2hib2FyZCJ9fSwgImN1c3RvbV9zY2FsYXJzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiQ3VzdG9tIFNjYWxhcnMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkIn19LCAiaW1hZ2VzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiaW1hZ2VzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1pbWFnZS1kYXNoYm9hcmQifX0sICJhdWRpbyI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogImF1ZGlvIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1hdWRpby1kYXNoYm9hcmQifX0sICJkZWJ1Z2dlci12MiI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogIkRlYnVnZ2VyIFYyIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIk5HX0NPTVBPTkVOVCJ9fSwgImdyYXBocyI6IHsiZGlzYWJsZV9yZWxvYWQiOiB0cnVlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiZ3JhcGhzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1ncmFwaC1kYXNoYm9hcmQifX0sICJkaXN0cmlidXRpb25zIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiZGlzdHJpYnV0aW9ucyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZCJ9fSwgImhpc3RvZ3JhbXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJoaXN0b2dyYW1zIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1oaXN0b2dyYW0tZGFzaGJvYXJkIn19LCAidGV4dCI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogInRleHQiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLXRleHQtZGFzaGJvYXJkIn19LCAicHJfY3VydmVzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiUFIgQ3VydmVzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1wci1jdXJ2ZS1kYXNoYm9hcmQifX0sICJwcm9maWxlX3JlZGlyZWN0IjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiUHJvZmlsZSIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtcHJvZmlsZS1yZWRpcmVjdC1kYXNoYm9hcmQifX0sICJocGFyYW1zIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiaHBhcmFtcyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtaHBhcmFtcy1kYXNoYm9hcmQifX0sICJtZXNoIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAibWVzaCIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAibWVzaC1kYXNoYm9hcmQifX0sICJ0aW1lc2VyaWVzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiVGltZSBTZXJpZXMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiTkdfQ09NUE9ORU5UIn19LCAicHJvamVjdG9yIjogeyJkaXNhYmxlX3JlbG9hZCI6IHRydWUsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJwcm9qZWN0b3IiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiSUZSQU1FIiwgIm1vZHVsZV9wYXRoIjogIi9kYXRhL3BsdWdpbi9wcm9qZWN0b3IvaW5kZXguanMifX0sICJ3aGF0aWYiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJXaGF0LUlmIFRvb2wiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiSUZSQU1FIiwgIm1vZHVsZV9wYXRoIjogIi9kYXRhL3BsdWdpbi93aGF0aWYvaW5kZXguanMifX19", + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/runs": { + "data": "W10=", + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/font-roboto/RxZJdnzeo3R5zSexge8UUZBw1xU1rKptJj_0jans920.woff2": { + "data": "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", + "headers": [ + [ + "content-type", + "font/woff2" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/font-roboto/d-6IYplOFocCacKzxwXSOJBw1xU1rKptJj_0jans920.woff2": { + "data": "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", + "headers": [ + [ + "content-type", + "font/woff2" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/font-roboto/oMMgfZMQthOryQo9n22dcuvvDin1pK8aKteLpeZ5c0A.woff2": { + "data": "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", + "headers": [ + [ + "content-type", + "font/woff2" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/font-roboto/vPcynSL0qHq_6dX7lKVByXYhjbSpvc47ee6xR_80Hnw.woff2": { + "data": "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", + "headers": [ + [ + "content-type", + "font/woff2" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/icon_bundle.svg": { + "data": "PD94bWwgdmVyc2lvbj0iMS4wIiA/Pjxzdmc+PGRlZnM+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0iYXJyb3dfZG93bndhcmRfMjRweCI+PHBhdGggZmlsbD0iIzAxMDEwMSIgZD0iTTIwIDEybC0xLjQxLTEuNDFMMTMgMTYuMTdWNGgtMnYxMi4xN2wtNS41OC01LjU5TDQgMTJsOCA4IDgtOHoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGlkPSJhcnJvd191cHdhcmRfMjRweCI+PHBhdGggZD0iTTQgMTJsMS40MSAxLjQxTDExIDcuODNWMjBoMlY3LjgzbDUuNTggNS41OUwyMCAxMmwtOC04LTggOHoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIGlkPSJicmlnaHRuZXNzXzZfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0yMCAxNS4zMUwyMy4zMSAxMiAyMCA4LjY5VjRoLTQuNjlMMTIgLjY5IDguNjkgNEg0djQuNjlMLjY5IDEyIDQgMTUuMzFWMjBoNC42OUwxMiAyMy4zMSAxNS4zMSAyMEgyMHYtNC42OXpNMTIgMThWNmMzLjMxIDAgNiAyLjY5IDYgNnMtMi42OSA2LTYgNnoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIGlkPSJidWdfcmVwb3J0XzI0cHgiPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNMjAgOGgtMi44MWMtLjQ1LS43OC0xLjA3LTEuNDUtMS44Mi0xLjk2TDE3IDQuNDEgMTUuNTkgM2wtMi4xNyAyLjE3QzEyLjk2IDUuMDYgMTIuNDkgNSAxMiA1Yy0uNDkgMC0uOTYuMDYtMS40MS4xN0w4LjQxIDMgNyA0LjQxbDEuNjIgMS42M0M3Ljg4IDYuNTUgNy4yNiA3LjIyIDYuODEgOEg0djJoMi4wOWMtLjA1LjMzLS4wOS42Ni0uMDkgMXYxSDR2MmgydjFjMCAuMzQuMDQuNjcuMDkgMUg0djJoMi44MWMxLjA0IDEuNzkgMi45NyAzIDUuMTkgM3M0LjE1LTEuMjEgNS4xOS0zSDIwdi0yaC0yLjA5Yy4wNS0uMzMuMDktLjY2LjA5LTF2LTFoMnYtMmgtMnYtMWMwLS4zNC0uMDQtLjY3LS4wOS0xSDIwVjh6bS02IDhoLTR2LTJoNHYyem0wLTRoLTR2LTJoNHYyeiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgaWQ9ImNhbmNlbF8yNHB4Ij48cGF0aCBkPSJNMTIgMkM2LjQ3IDIgMiA2LjQ3IDIgMTJzNC40NyAxMCAxMCAxMCAxMC00LjQ3IDEwLTEwUzE3LjUzIDIgMTIgMnptNSAxMy41OUwxNS41OSAxNyAxMiAxMy40MSA4LjQxIDE3IDcgMTUuNTkgMTAuNTkgMTIgNyA4LjQxIDguNDEgNyAxMiAxMC41OSAxNS41OSA3IDE3IDguNDEgMTMuNDEgMTIgMTcgMTUuNTl6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0iY2hldnJvbl9sZWZ0XzI0cHgiPjxwYXRoIGQ9Ik0xNS40MSA3LjQxTDE0IDZsLTYgNiA2IDYgMS40MS0xLjQxTDEwLjgzIDEyeiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgaWQ9ImNoZXZyb25fcmlnaHRfMjRweCI+PHBhdGggZD0iTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02eiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgaWQ9ImNsZWFyXzI0cHgiPjxwYXRoIGQ9Ik0xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0iY2xvc2VfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0iY29udGVudF9jb3B5XzI0cHgiPjxwYXRoIGQ9Ik0xNiAxSDRjLTEuMSAwLTIgLjktMiAydjE0aDJWM2gxMlYxem0zIDRIOGMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxMWMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yem0wIDE2SDhWN2gxMXYxNHoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMjQgMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0iZGFya19tb2RlXzI0cHgiPjxyZWN0IGZpbGw9Im5vbmUiIGhlaWdodD0iMjQiIHdpZHRoPSIyNCIvPjxwYXRoIGQ9Ik0xMiwzYy00Ljk3LDAtOSw0LjAzLTksOXM0LjAzLDksOSw5czktNC4wMyw5LTljMC0wLjQ2LTAuMDQtMC45Mi0wLjEtMS4zNmMtMC45OCwxLjM3LTIuNTgsMi4yNi00LjQsMi4yNiBjLTIuOTgsMC01LjQtMi40Mi01LjQtNS40YzAtMS44MSwwLjg5LTMuNDIsMi4yNi00LjRDMTIuOTIsMy4wNCwxMi40NiwzLDEyLDNMMTIsM3oiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGlkPSJkb25lXzI0cHgiPjxwYXRoIGQ9Ik05IDE2LjJMNC44IDEybC0xLjQgMS40TDkgMTkgMjEgN2wtMS40LTEuNEw5IDE2LjJ6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0iZHJhZ19pbmRpY2F0b3JfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTExIDE4YzAgMS4xLS45IDItMiAycy0yLS45LTItMiAuOS0yIDItMiAyIC45IDIgMnptLTItOGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAtNmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTYgNGMxLjEgMCAyLS45IDItMnMtLjktMi0yLTItMiAuOS0yIDIgLjkgMiAyIDJ6bTAgMmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAgNmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0iZWRpdF8yNHB4Ij48cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC0yLjM0LTIuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0xLjgzIDEuODMgMy43NSAzLjc1IDEuODMtMS44M3oiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGlkPSJlcnJvcl8yNHB4Ij48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMSAxNWgtMnYtMmgydjJ6bTAtNGgtMlY3aDJ2NnoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGlkPSJleHBhbmRfbGVzc18yNHB4Ij48cGF0aCBkPSJNMTIgOGwtNiA2IDEuNDEgMS40MUwxMiAxMC44M2w0LjU5IDQuNThMMTggMTR6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0iZXhwYW5kX21vcmVfMjRweCI+PHBhdGggZD0iTTE2LjU5IDguNTlMMTIgMTMuMTcgNy40MSA4LjU5IDYgMTBsNiA2IDYtNnoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMjQgMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0iZmlsdGVyX2FsdF8yNHB4Ij48Zz48cGF0aCBkPSJNMCwwaDI0IE0yNCwyNEgwIiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTQuMjUsNS42MUM2LjI3LDguMiwxMCwxMywxMCwxM3Y2YzAsMC41NSwwLjQ1LDEsMSwxaDJjMC41NSwwLDEtMC40NSwxLTF2LTZjMCwwLDMuNzItNC44LDUuNzQtNy4zOSBDMjAuMjUsNC45NSwxOS43OCw0LDE4Ljk1LDRINS4wNEM0LjIxLDQsMy43NCw0Ljk1LDQuMjUsNS42MXoiLz48cGF0aCBkPSJNMCwwaDI0djI0SDBWMHoiIGZpbGw9Im5vbmUiLz48L2c+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0iZmxhZ18yNHB4Ij48cGF0aCBkPSJNMTQuNCA2TDE0IDRINXYxN2gydi03aDUuNmwuNCAyaDdWNnoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIGlkPSJmdWxsc2NyZWVuXzI0cHgiPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNNyAxNEg1djVoNXYtMkg3di0zem0tMi00aDJWN2gzVjVINXY1em0xMiA3aC0zdjJoNXYtNWgtMnYzek0xNCA1djJoM3YzaDJWNWgtNXoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIGlkPSJmdWxsc2NyZWVuX2V4aXRfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik01IDE2aDN2M2gydi01SDV2MnptMy04SDV2Mmg1VjVIOHYzem02IDExaDJ2LTNoM3YtMmgtNXY1em0yLTExVjVoLTJ2NWg1VjhoLTN6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0iZ2V0X2FwcF8yNHB4Ij48cGF0aCBkPSJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1eiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgaWQ9Imdyb3VwX3dvcmtfMjRweCI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6TTggMTcuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6TTkuNSA4YzAtMS4zOCAxLjEyLTIuNSAyLjUtMi41czIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNVM5LjUgOS4zOCA5LjUgOHptNi41IDkuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0iaGVscF9vdXRsaW5lXzI0cHgiPjxwYXRoIGQ9Ik0xMSAxOGgydi0yaC0ydjJ6bTEtMTZDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4em0wLTE0Yy0yLjIxIDAtNCAxLjc5LTQgNGgyYzAtMS4xLjktMiAyLTJzMiAuOSAyIDJjMCAyLTMgMS43NS0zIDVoMmMwLTIuMjUgMy0yLjUgMy01IDAtMi4yMS0xLjc5LTQtNC00eiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgaWQ9ImltYWdlX3NlYXJjaF8yNHB4Ij48cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE4IDEzdjdINFY2aDUuMDJjLjA1LS43MS4yMi0xLjM4LjQ4LTJINGMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnYtNWwtMi0yem0tMS41IDVoLTExbDIuNzUtMy41MyAxLjk2IDIuMzYgMi43NS0zLjU0em0yLjgtOS4xMWMuNDQtLjcuNy0xLjUxLjctMi4zOUMyMCA0LjAxIDE3Ljk5IDIgMTUuNSAyUzExIDQuMDEgMTEgNi41czIuMDEgNC41IDQuNDkgNC41Yy44OCAwIDEuNy0uMjYgMi4zOS0uN0wyMSAxMy40MiAyMi40MiAxMiAxOS4zIDguODl6TTE1LjUgOUMxNC4xMiA5IDEzIDcuODggMTMgNi41UzE0LjEyIDQgMTUuNSA0IDE4IDUuMTIgMTggNi41IDE2Ljg4IDkgMTUuNSA5eiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgaWQ9ImluZm9fb3V0bGluZV8yNHB4Ij48cGF0aCBkPSJNMTEgMTdoMnYtNmgtMnY2em0xLTE1QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHpNMTEgOWgyVjdoLTJ2MnoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMjQgMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0ia2VlcF8yNHB4Ij48Zz48cmVjdCBmaWxsPSJub25lIiBoZWlnaHQ9IjI0IiB3aWR0aD0iMjQiLz48L2c+PGc+PHBhdGggZD0iTTE2LDlWNGwxLDBjMC41NSwwLDEtMC40NSwxLTF2MGMwLTAuNTUtMC40NS0xLTEtMUg3QzYuNDUsMiw2LDIuNDUsNiwzdjAgYzAsMC41NSwwLjQ1LDEsMSwxbDEsMHY1YzAsMS42Ni0xLjM0LDMtMywzaDB2Mmg1Ljk3djdsMSwxbDEtMXYtN0gxOXYtMmgwQzE3LjM0LDEyLDE2LDEwLjY2LDE2LDl6IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48L2c+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgaWQ9ImtlZXBfb3V0bGluZV8yNHB4Ij48Zz48cmVjdCBmaWxsPSJub25lIiBoZWlnaHQ9IjI0IiB3aWR0aD0iMjQiLz48L2c+PGc+PHBhdGggZD0iTTE0LDR2NWMwLDEuMTIsMC4zNywyLjE2LDEsM0g5YzAuNjUtMC44NiwxLTEuOSwxLTNWNEgxNCBNMTcsMkg3QzYuNDUsMiw2LDIuNDUsNiwzYzAsMC41NSwwLjQ1LDEsMSwxYzAsMCwwLDAsMCwwbDEsMHY1IGMwLDEuNjYtMS4zNCwzLTMsM3YyaDUuOTd2N2wxLDFsMS0xdi03SDE5di0yYzAsMCwwLDAsMCwwYy0xLjY2LDAtMy0xLjM0LTMtM1Y0bDEsMGMwLDAsMCwwLDAsMGMwLjU1LDAsMS0wLjQ1LDEtMSBDMTgsMi40NSwxNy41NSwyLDE3LDJMMTcsMnoiLz48L2c+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgaWQ9ImxpZ2h0X21vZGVfMjRweCI+PHJlY3QgZmlsbD0ibm9uZSIgaGVpZ2h0PSIyNCIgd2lkdGg9IjI0Ii8+PHBhdGggZD0iTTEyLDdjLTIuNzYsMC01LDIuMjQtNSw1czIuMjQsNSw1LDVzNS0yLjI0LDUtNVMxNC43Niw3LDEyLDdMMTIsN3ogTTIsMTNsMiwwYzAuNTUsMCwxLTAuNDUsMS0xcy0wLjQ1LTEtMS0xbC0yLDAgYy0wLjU1LDAtMSwwLjQ1LTEsMVMxLjQ1LDEzLDIsMTN6IE0yMCwxM2wyLDBjMC41NSwwLDEtMC40NSwxLTFzLTAuNDUtMS0xLTFsLTIsMGMtMC41NSwwLTEsMC40NS0xLDFTMTkuNDUsMTMsMjAsMTN6IE0xMSwydjIgYzAsMC41NSwwLjQ1LDEsMSwxczEtMC40NSwxLTFWMmMwLTAuNTUtMC40NS0xLTEtMVMxMSwxLjQ1LDExLDJ6IE0xMSwyMHYyYzAsMC41NSwwLjQ1LDEsMSwxczEtMC40NSwxLTF2LTJjMC0wLjU1LTAuNDUtMS0xLTEgQzExLjQ1LDE5LDExLDE5LjQ1LDExLDIweiBNNS45OSw0LjU4Yy0wLjM5LTAuMzktMS4wMy0wLjM5LTEuNDEsMGMtMC4zOSwwLjM5LTAuMzksMS4wMywwLDEuNDFsMS4wNiwxLjA2IGMwLjM5LDAuMzksMS4wMywwLjM5LDEuNDEsMHMwLjM5LTEuMDMsMC0xLjQxTDUuOTksNC41OHogTTE4LjM2LDE2Ljk1Yy0wLjM5LTAuMzktMS4wMy0wLjM5LTEuNDEsMGMtMC4zOSwwLjM5LTAuMzksMS4wMywwLDEuNDEgbDEuMDYsMS4wNmMwLjM5LDAuMzksMS4wMywwLjM5LDEuNDEsMGMwLjM5LTAuMzksMC4zOS0xLjAzLDAtMS40MUwxOC4zNiwxNi45NXogTTE5LjQyLDUuOTljMC4zOS0wLjM5LDAuMzktMS4wMywwLTEuNDEgYy0wLjM5LTAuMzktMS4wMy0wLjM5LTEuNDEsMGwtMS4wNiwxLjA2Yy0wLjM5LDAuMzktMC4zOSwxLjAzLDAsMS40MXMxLjAzLDAuMzksMS40MSwwTDE5LjQyLDUuOTl6IE03LjA1LDE4LjM2IGMwLjM5LTAuMzksMC4zOS0xLjAzLDAtMS40MWMtMC4zOS0wLjM5LTEuMDMtMC4zOS0xLjQxLDBsLTEuMDYsMS4wNmMtMC4zOSwwLjM5LTAuMzksMS4wMywwLDEuNDFzMS4wMywwLjM5LDEuNDEsMEw3LjA1LDE4LjM2eiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNCAyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIGlkPSJsaW5lX3dlaWdodF8yNHB4Ij48Zz48cmVjdCBmaWxsPSJub25lIiBoZWlnaHQ9IjI0IiB3aWR0aD0iMjQiIHg9IjAiLz48L2c+PGc+PGc+PGc+PHBhdGggZD0iTTMsMTdoMTh2LTJIM1YxN3ogTTMsMjBoMTh2LTFIM1YyMHogTTMsMTNoMTh2LTNIM1YxM3ogTTMsNHY0aDE4VjRIM3oiLz48L2c+PC9nPjwvZz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIGlkPSJtb3JlX3ZlcnRfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xMiA4YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptMCAyYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptMCA2Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIGlkPSJub3RpZmljYXRpb25zX25vbmVfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xMiAyMmMxLjEgMCAyLS45IDItMmgtNGMwIDEuMS45IDIgMiAyem02LTZ2LTVjMC0zLjA3LTEuNjMtNS42NC00LjUtNi4zMlY0YzAtLjgzLS42Ny0xLjUtMS41LTEuNXMtMS41LjY3LTEuNSAxLjV2LjY4QzcuNjQgNS4zNiA2IDcuOTIgNiAxMXY1bC0yIDJ2MWgxNnYtMWwtMi0yem0tMiAxSDh2LTZjMC0yLjQ4IDEuNTEtNC41IDQtNC41czQgMi4wMiA0IDQuNXY2eiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgaWQ9InBhbGV0dGVfMjRweCI+PHBhdGggZD0iTTEyIDNjLTQuOTcgMC05IDQuMDMtOSA5czQuMDMgOSA5IDljLjgzIDAgMS41LS42NyAxLjUtMS41IDAtLjM5LS4xNS0uNzQtLjM5LTEuMDEtLjIzLS4yNi0uMzgtLjYxLS4zOC0uOTkgMC0uODMuNjctMS41IDEuNS0xLjVIMTZjMi43NiAwIDUtMi4yNCA1LTUgMC00LjQyLTQuMDMtOC05LTh6bS01LjUgOWMtLjgzIDAtMS41LS42Ny0xLjUtMS41UzUuNjcgOSA2LjUgOSA4IDkuNjcgOCAxMC41IDcuMzMgMTIgNi41IDEyem0zLTRDOC42NyA4IDggNy4zMyA4IDYuNVM4LjY3IDUgOS41IDVzMS41LjY3IDEuNSAxLjVTMTAuMzMgOCA5LjUgOHptNSAwYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVTMTMuNjcgNSAxNC41IDVzMS41LjY3IDEuNSAxLjVTMTUuMzMgOCAxNC41IDh6bTMgNGMtLjgzIDAtMS41LS42Ny0xLjUtMS41UzE2LjY3IDkgMTcuNSA5czEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGlkPSJyZWZyZXNoXzI0cHgiPjxwYXRoIGQ9Ik0xNy42NSA2LjM1QzE2LjIgNC45IDE0LjIxIDQgMTIgNGMtNC40MiAwLTcuOTkgMy41OC03Ljk5IDhzMy41NyA4IDcuOTkgOGMzLjczIDAgNi44NC0yLjU1IDcuNzMtNmgtMi4wOGMtLjgyIDIuMzMtMy4wNCA0LTUuNjUgNC0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02YzEuNjYgMCAzLjE0LjY5IDQuMjIgMS43OEwxMyAxMWg3VjRsLTIuMzUgMi4zNXoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGlkPSJzZWFyY2hfMjRweCI+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0ic2V0dGluZ3NfMjRweCI+PHBhdGggZD0iTTE5LjQzIDEyLjk4Yy4wNC0uMzIuMDctLjY0LjA3LS45OHMtLjAzLS42Ni0uMDctLjk4bDIuMTEtMS42NWMuMTktLjE1LjI0LS40Mi4xMi0uNjRsLTItMy40NmMtLjEyLS4yMi0uMzktLjMtLjYxLS4yMmwtMi40OSAxYy0uNTItLjQtMS4wOC0uNzMtMS42OS0uOThsLS4zOC0yLjY1QzE0LjQ2IDIuMTggMTQuMjUgMiAxNCAyaC00Yy0uMjUgMC0uNDYuMTgtLjQ5LjQybC0uMzggMi42NWMtLjYxLjI1LTEuMTcuNTktMS42OS45OGwtMi40OS0xYy0uMjMtLjA5LS40OSAwLS42MS4yMmwtMiAzLjQ2Yy0uMTMuMjItLjA3LjQ5LjEyLjY0bDIuMTEgMS42NWMtLjA0LjMyLS4wNy42NS0uMDcuOThzLjAzLjY2LjA3Ljk4bC0yLjExIDEuNjVjLS4xOS4xNS0uMjQuNDItLjEyLjY0bDIgMy40NmMuMTIuMjIuMzkuMy42MS4yMmwyLjQ5LTFjLjUyLjQgMS4wOC43MyAxLjY5Ljk4bC4zOCAyLjY1Yy4wMy4yNC4yNC40Mi40OS40Mmg0Yy4yNSAwIC40Ni0uMTguNDktLjQybC4zOC0yLjY1Yy42MS0uMjUgMS4xNy0uNTkgMS42OS0uOThsMi40OSAxYy4yMy4wOS40OSAwIC42MS0uMjJsMi0zLjQ2Yy4xMi0uMjIuMDctLjQ5LS4xMi0uNjRsLTIuMTEtMS42NXpNMTIgMTUuNWMtMS45MyAwLTMuNS0xLjU3LTMuNS0zLjVzMS41Ny0zLjUgMy41LTMuNSAzLjUgMS41NyAzLjUgMy41LTEuNTcgMy41LTMuNSAzLjV6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0ic2V0dGluZ3NfYmFja3VwX3Jlc3RvcmVfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xNCAxMmMwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDIgLjkgMiAyIDIgMi0uOSAyLTJ6bS0yLTljLTQuOTcgMC05IDQuMDMtOSA5SDBsNCA0IDQtNEg1YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS41MSAwLTIuOTEtLjQ5LTQuMDYtMS4zbC0xLjQyIDEuNDRDOC4wNCAyMC4zIDkuOTQgMjEgMTIgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0ic2V0dGluZ3Nfb3ZlcnNjYW5fMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xMi4wMSA1LjVMMTAgOGg0bC0xLjk5LTIuNXpNMTggMTB2NGwyLjUtMS45OUwxOCAxMHpNNiAxMGwtMi41IDIuMDFMNiAxNHYtNHptOCA2aC00bDIuMDEgMi41TDE0IDE2em03LTEzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOTloMTh2MTQuMDJ6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0idmlzaWJpbGl0eV9vZmZfMjRweCI+PHBhdGggZD0iTTEyIDdjMi43NiAwIDUgMi4yNCA1IDUgMCAuNjUtLjEzIDEuMjYtLjM2IDEuODNsMi45MiAyLjkyYzEuNTEtMS4yNiAyLjctMi44OSAzLjQzLTQuNzUtMS43My00LjM5LTYtNy41LTExLTcuNS0xLjQgMC0yLjc0LjI1LTMuOTguN2wyLjE2IDIuMTZDMTAuNzQgNy4xMyAxMS4zNSA3IDEyIDd6TTIgNC4yN2wyLjI4IDIuMjguNDYuNDZDMy4wOCA4LjMgMS43OCAxMC4wMiAxIDEyYzEuNzMgNC4zOSA2IDcuNSAxMSA3LjUgMS41NSAwIDMuMDMtLjMgNC4zOC0uODRsLjQyLjQyTDE5LjczIDIyIDIxIDIwLjczIDMuMjcgMyAyIDQuMjd6TTcuNTMgOS44bDEuNTUgMS41NWMtLjA1LjIxLS4wOC40My0uMDguNjUgMCAxLjY2IDEuMzQgMyAzIDMgLjIyIDAgLjQ0LS4wMy42NS0uMDhsMS41NSAxLjU1Yy0uNjcuMzMtMS40MS41My0yLjIuNTMtMi43NiAwLTUtMi4yNC01LTUgMC0uNzkuMi0xLjUzLjUzLTIuMnptNC4zMS0uNzhsMy4xNSAzLjE1LjAyLS4xNmMwLTEuNjYtMS4zNC0zLTMtM2wtLjE3LjAxeiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgaWQ9Indhcm5pbmdfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xIDIxaDIyTDEyIDIgMSAyMXptMTItM2gtMnYtMmgydjJ6bTAtNGgtMnYtNGgydjR6Ii8+PC9zdmc+PC9kZWZzPjwvc3ZnPgo=", + "headers": [ + [ + "content-type", + "image/svg+xml; charset=utf-8" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/index.js?_file_hash=29a7d03a": { + "data": "dmFyIENMT1NVUkVfTk9fREVQUyA9IHRydWU7CndpbmRvdy5wb2x5bWVyU2tpcExvYWRpbmdGb250Um9ib3RvID0gdHJ1ZTsKLyoqIHZpbTogZXQ6dHM9NDpzdz00OnN0cz00CiAqIEBsaWNlbnNlIFJlcXVpcmVKUyAyLjMuNiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycy4KICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UsIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXF1aXJlanMvcmVxdWlyZWpzL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKICovCi8vTm90IHVzaW5nIHN0cmljdDogdW5ldmVuIHN0cmljdCBzdXBwb3J0IGluIGJyb3dzZXJzLCAjMzkyLCBhbmQgY2F1c2VzCi8vcHJvYmxlbXMgd2l0aCByZXF1aXJlanMuZXhlYygpL3RyYW5zcGlsZXIgcGx1Z2lucyB0aGF0IG1heSBub3QgYmUgc3RyaWN0LgovKmpzbGludCByZWdleHA6IHRydWUsIG5vbWVuOiB0cnVlLCBzbG9wcHk6IHRydWUgKi8KLypnbG9iYWwgd2luZG93LCBuYXZpZ2F0b3IsIGRvY3VtZW50LCBpbXBvcnRTY3JpcHRzLCBzZXRUaW1lb3V0LCBvcGVyYSAqLwoKdmFyIHJlcXVpcmVqcywgcmVxdWlyZSwgZGVmaW5lOwooZnVuY3Rpb24gKGdsb2JhbCwgc2V0VGltZW91dCkgewogICAgdmFyIHJlcSwgcywgaGVhZCwgYmFzZUVsZW1lbnQsIGRhdGFNYWluLCBzcmMsCiAgICAgICAgaW50ZXJhY3RpdmVTY3JpcHQsIGN1cnJlbnRseUFkZGluZ1NjcmlwdCwgbWFpblNjcmlwdCwgc3ViUGF0aCwKICAgICAgICB2ZXJzaW9uID0gJzIuMy42JywKICAgICAgICBjb21tZW50UmVnRXhwID0gL1wvXCpbXHNcU10qP1wqXC98KFteOiInPV18XilcL1wvLiokL21nLAogICAgICAgIGNqc1JlcXVpcmVSZWdFeHAgPSAvW14uXVxzKnJlcXVpcmVccypcKFxzKlsiJ10oW14nIlxzXSspWyInXVxzKlwpL2csCiAgICAgICAganNTdWZmaXhSZWdFeHAgPSAvXC5qcyQvLAogICAgICAgIGN1cnJEaXJSZWdFeHAgPSAvXlwuXC8vLAogICAgICAgIG9wID0gT2JqZWN0LnByb3RvdHlwZSwKICAgICAgICBvc3RyaW5nID0gb3AudG9TdHJpbmcsCiAgICAgICAgaGFzT3duID0gb3AuaGFzT3duUHJvcGVydHksCiAgICAgICAgaXNCcm93c2VyID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50KSwKICAgICAgICBpc1dlYldvcmtlciA9ICFpc0Jyb3dzZXIgJiYgdHlwZW9mIGltcG9ydFNjcmlwdHMgIT09ICd1bmRlZmluZWQnLAogICAgICAgIC8vUFMzIGluZGljYXRlcyBsb2FkZWQgYW5kIGNvbXBsZXRlLCBidXQgbmVlZCB0byB3YWl0IGZvciBjb21wbGV0ZQogICAgICAgIC8vc3BlY2lmaWNhbGx5LiBTZXF1ZW5jZSBpcyAnbG9hZGluZycsICdsb2FkZWQnLCBleGVjdXRpb24sCiAgICAgICAgLy8gdGhlbiAnY29tcGxldGUnLiBUaGUgVUEgY2hlY2sgaXMgdW5mb3J0dW5hdGUsIGJ1dCBub3Qgc3VyZSBob3cKICAgICAgICAvL3RvIGZlYXR1cmUgdGVzdCB3L28gY2F1c2luZyBwZXJmIGlzc3Vlcy4KICAgICAgICByZWFkeVJlZ0V4cCA9IGlzQnJvd3NlciAmJiBuYXZpZ2F0b3IucGxhdGZvcm0gPT09ICdQTEFZU1RBVElPTiAzJyA/CiAgICAgICAgICAgICAgICAgICAgICAvXmNvbXBsZXRlJC8gOiAvXihjb21wbGV0ZXxsb2FkZWQpJC8sCiAgICAgICAgZGVmQ29udGV4dE5hbWUgPSAnXycsCiAgICAgICAgLy9PaCB0aGUgdHJhZ2VkeSwgZGV0ZWN0aW5nIG9wZXJhLiBTZWUgdGhlIHVzYWdlIG9mIGlzT3BlcmEgZm9yIHJlYXNvbi4KICAgICAgICBpc09wZXJhID0gdHlwZW9mIG9wZXJhICE9PSAndW5kZWZpbmVkJyAmJiBvcGVyYS50b1N0cmluZygpID09PSAnW29iamVjdCBPcGVyYV0nLAogICAgICAgIGNvbnRleHRzID0ge30sCiAgICAgICAgY2ZnID0ge30sCiAgICAgICAgZ2xvYmFsRGVmUXVldWUgPSBbXSwKICAgICAgICB1c2VJbnRlcmFjdGl2ZSA9IGZhbHNlOwoKICAgIC8vQ291bGQgbWF0Y2ggc29tZXRoaW5nIGxpa2UgJykvL2NvbW1lbnQnLCBkbyBub3QgbG9zZSB0aGUgcHJlZml4IHRvIGNvbW1lbnQuCiAgICBmdW5jdGlvbiBjb21tZW50UmVwbGFjZShtYXRjaCwgc2luZ2xlUHJlZml4KSB7CiAgICAgICAgcmV0dXJuIHNpbmdsZVByZWZpeCB8fCAnJzsKICAgIH0KCiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uKGl0KSB7CiAgICAgICAgcmV0dXJuIG9zdHJpbmcuY2FsbChpdCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7CiAgICB9CgogICAgZnVuY3Rpb24gaXNBcnJheShpdCkgewogICAgICAgIHJldHVybiBvc3RyaW5nLmNhbGwoaXQpID09PSAnW29iamVjdCBBcnJheV0nOwogICAgfQoKICAgIC8qKgogICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciBpdGVyYXRpbmcgb3ZlciBhbiBhcnJheS4gSWYgdGhlIGZ1bmMgcmV0dXJucwogICAgICogYSB0cnVlIHZhbHVlLCBpdCB3aWxsIGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KICAgICAqLwogICAgZnVuY3Rpb24gZWFjaChhcnksIGZ1bmMpIHsKICAgICAgICBpZiAoYXJ5KSB7CiAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJ5Lmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICBpZiAoYXJ5W2ldICYmIGZ1bmMoYXJ5W2ldLCBpLCBhcnkpKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGl0ZXJhdGluZyBvdmVyIGFuIGFycmF5IGJhY2t3YXJkcy4gSWYgdGhlIGZ1bmMKICAgICAqIHJldHVybnMgYSB0cnVlIHZhbHVlLCBpdCB3aWxsIGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KICAgICAqLwogICAgZnVuY3Rpb24gZWFjaFJldmVyc2UoYXJ5LCBmdW5jKSB7CiAgICAgICAgaWYgKGFyeSkgewogICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgZm9yIChpID0gYXJ5Lmxlbmd0aCAtIDE7IGkgPiAtMTsgaSAtPSAxKSB7CiAgICAgICAgICAgICAgICBpZiAoYXJ5W2ldICYmIGZ1bmMoYXJ5W2ldLCBpLCBhcnkpKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaGFzUHJvcChvYmosIHByb3ApIHsKICAgICAgICByZXR1cm4gaGFzT3duLmNhbGwob2JqLCBwcm9wKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRPd24ob2JqLCBwcm9wKSB7CiAgICAgICAgcmV0dXJuIGhhc1Byb3Aob2JqLCBwcm9wKSAmJiBvYmpbcHJvcF07CiAgICB9CgogICAgLyoqCiAgICAgKiBDeWNsZXMgb3ZlciBwcm9wZXJ0aWVzIGluIGFuIG9iamVjdCBhbmQgY2FsbHMgYSBmdW5jdGlvbiBmb3IgZWFjaAogICAgICogcHJvcGVydHkgdmFsdWUuIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgdHJ1dGh5IHZhbHVlLCB0aGVuIHRoZQogICAgICogaXRlcmF0aW9uIGlzIHN0b3BwZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVhY2hQcm9wKG9iaiwgZnVuYykgewogICAgICAgIHZhciBwcm9wOwogICAgICAgIGZvciAocHJvcCBpbiBvYmopIHsKICAgICAgICAgICAgaWYgKGhhc1Byb3Aob2JqLCBwcm9wKSkgewogICAgICAgICAgICAgICAgaWYgKGZ1bmMob2JqW3Byb3BdLCBwcm9wKSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU2ltcGxlIGZ1bmN0aW9uIHRvIG1peCBpbiBwcm9wZXJ0aWVzIGZyb20gc291cmNlIGludG8gdGFyZ2V0LAogICAgICogYnV0IG9ubHkgaWYgdGFyZ2V0IGRvZXMgbm90IGFscmVhZHkgaGF2ZSBhIHByb3BlcnR5IG9mIHRoZSBzYW1lIG5hbWUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1peGluKHRhcmdldCwgc291cmNlLCBmb3JjZSwgZGVlcFN0cmluZ01peGluKSB7CiAgICAgICAgaWYgKHNvdXJjZSkgewogICAgICAgICAgICBlYWNoUHJvcChzb3VyY2UsIGZ1bmN0aW9uICh2YWx1ZSwgcHJvcCkgewogICAgICAgICAgICAgICAgaWYgKGZvcmNlIHx8ICFoYXNQcm9wKHRhcmdldCwgcHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGVlcFN0cmluZ01peGluICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIWlzQXJyYXkodmFsdWUpICYmICFpc0Z1bmN0aW9uKHZhbHVlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXRbcHJvcF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG1peGluKHRhcmdldFtwcm9wXSwgdmFsdWUsIGZvcmNlLCBkZWVwU3RyaW5nTWl4aW4pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CgogICAgLy9TaW1pbGFyIHRvIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLCBidXQgdGhlICd0aGlzJyBvYmplY3QgaXMgc3BlY2lmaWVkCiAgICAvL2ZpcnN0LCBzaW5jZSBpdCBpcyBlYXNpZXIgdG8gcmVhZC9maWd1cmUgb3V0IHdoYXQgJ3RoaXMnIHdpbGwgYmUuCiAgICBmdW5jdGlvbiBiaW5kKG9iaiwgZm4pIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkob2JqLCBhcmd1bWVudHMpOwogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2NyaXB0cygpIHsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRPbkVycm9yKGVycikgewogICAgICAgIHRocm93IGVycjsKICAgIH0KCiAgICAvL0FsbG93IGdldHRpbmcgYSBnbG9iYWwgdGhhdCBpcyBleHByZXNzZWQgaW4KICAgIC8vZG90IG5vdGF0aW9uLCBsaWtlICdhLmIuYycuCiAgICBmdW5jdGlvbiBnZXRHbG9iYWwodmFsdWUpIHsKICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgdmFyIGcgPSBnbG9iYWw7CiAgICAgICAgZWFjaCh2YWx1ZS5zcGxpdCgnLicpLCBmdW5jdGlvbiAocGFydCkgewogICAgICAgICAgICBnID0gZ1twYXJ0XTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZzsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN0cnVjdHMgYW4gZXJyb3Igd2l0aCBhIHBvaW50ZXIgdG8gYW4gVVJMIHdpdGggbW9yZSBpbmZvcm1hdGlvbi4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCB0aGUgZXJyb3IgSUQgdGhhdCBtYXBzIHRvIGFuIElEIG9uIGEgd2ViIHBhZ2UuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBodW1hbiByZWFkYWJsZSBlcnJvci4KICAgICAqIEBwYXJhbSB7RXJyb3J9IFtlcnJdIHRoZSBvcmlnaW5hbCBlcnJvciwgaWYgdGhlcmUgaXMgb25lLgogICAgICoKICAgICAqIEByZXR1cm5zIHtFcnJvcn0KICAgICAqLwogICAgZnVuY3Rpb24gbWFrZUVycm9yKGlkLCBtc2csIGVyciwgcmVxdWlyZU1vZHVsZXMpIHsKICAgICAgICB2YXIgZSA9IG5ldyBFcnJvcihtc2cgKyAnXG5odHRwczovL3JlcXVpcmVqcy5vcmcvZG9jcy9lcnJvcnMuaHRtbCMnICsgaWQpOwogICAgICAgIGUucmVxdWlyZVR5cGUgPSBpZDsKICAgICAgICBlLnJlcXVpcmVNb2R1bGVzID0gcmVxdWlyZU1vZHVsZXM7CiAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICBlLm9yaWdpbmFsRXJyb3IgPSBlcnI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBlOwogICAgfQoKICAgIGlmICh0eXBlb2YgZGVmaW5lICE9PSAndW5kZWZpbmVkJykgewogICAgICAgIC8vSWYgYSBkZWZpbmUgaXMgYWxyZWFkeSBpbiBwbGF5IHZpYSBhbm90aGVyIEFNRCBsb2FkZXIsCiAgICAgICAgLy9kbyBub3Qgb3ZlcndyaXRlLgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAodHlwZW9mIHJlcXVpcmVqcyAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICBpZiAoaXNGdW5jdGlvbihyZXF1aXJlanMpKSB7CiAgICAgICAgICAgIC8vRG8gbm90IG92ZXJ3cml0ZSBhbiBleGlzdGluZyByZXF1aXJlanMgaW5zdGFuY2UuCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY2ZnID0gcmVxdWlyZWpzOwogICAgICAgIHJlcXVpcmVqcyA9IHVuZGVmaW5lZDsKICAgIH0KCiAgICAvL0FsbG93IGZvciBhIHJlcXVpcmUgY29uZmlnIG9iamVjdAogICAgaWYgKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJyAmJiAhaXNGdW5jdGlvbihyZXF1aXJlKSkgewogICAgICAgIC8vYXNzdW1lIGl0IGlzIGEgY29uZmlnIG9iamVjdC4KICAgICAgICBjZmcgPSByZXF1aXJlOwogICAgICAgIHJlcXVpcmUgPSB1bmRlZmluZWQ7CiAgICB9CgogICAgZnVuY3Rpb24gbmV3Q29udGV4dChjb250ZXh0TmFtZSkgewogICAgICAgIHZhciBpbkNoZWNrTG9hZGVkLCBNb2R1bGUsIGNvbnRleHQsIGhhbmRsZXJzLAogICAgICAgICAgICBjaGVja0xvYWRlZFRpbWVvdXRJZCwKICAgICAgICAgICAgY29uZmlnID0gewogICAgICAgICAgICAgICAgLy9EZWZhdWx0cy4gRG8gbm90IHNldCBhIGRlZmF1bHQgZm9yIG1hcAogICAgICAgICAgICAgICAgLy9jb25maWcgdG8gc3BlZWQgdXAgbm9ybWFsaXplKCksIHdoaWNoCiAgICAgICAgICAgICAgICAvL3dpbGwgcnVuIGZhc3RlciBpZiB0aGVyZSBpcyBubyBkZWZhdWx0LgogICAgICAgICAgICAgICAgd2FpdFNlY29uZHM6IDcsCiAgICAgICAgICAgICAgICBiYXNlVXJsOiAnLi8nLAogICAgICAgICAgICAgICAgcGF0aHM6IHt9LAogICAgICAgICAgICAgICAgYnVuZGxlczoge30sCiAgICAgICAgICAgICAgICBwa2dzOiB7fSwKICAgICAgICAgICAgICAgIHNoaW06IHt9LAogICAgICAgICAgICAgICAgY29uZmlnOiB7fQogICAgICAgICAgICB9LAogICAgICAgICAgICByZWdpc3RyeSA9IHt9LAogICAgICAgICAgICAvL3JlZ2lzdHJ5IG9mIGp1c3QgZW5hYmxlZCBtb2R1bGVzLCB0byBzcGVlZAogICAgICAgICAgICAvL2N5Y2xlIGJyZWFraW5nIGNvZGUgd2hlbiBsb3RzIG9mIG1vZHVsZXMKICAgICAgICAgICAgLy9hcmUgcmVnaXN0ZXJlZCwgYnV0IG5vdCBhY3RpdmF0ZWQuCiAgICAgICAgICAgIGVuYWJsZWRSZWdpc3RyeSA9IHt9LAogICAgICAgICAgICB1bmRlZkV2ZW50cyA9IHt9LAogICAgICAgICAgICBkZWZRdWV1ZSA9IFtdLAogICAgICAgICAgICBkZWZpbmVkID0ge30sCiAgICAgICAgICAgIHVybEZldGNoZWQgPSB7fSwKICAgICAgICAgICAgYnVuZGxlc01hcCA9IHt9LAogICAgICAgICAgICByZXF1aXJlQ291bnRlciA9IDEsCiAgICAgICAgICAgIHVubm9ybWFsaXplZENvdW50ZXIgPSAxOwoKICAgICAgICAvKioKICAgICAgICAgKiBUcmltcyB0aGUgLiBhbmQgLi4gZnJvbSBhbiBhcnJheSBvZiBwYXRoIHNlZ21lbnRzLgogICAgICAgICAqIEl0IHdpbGwga2VlcCBhIGxlYWRpbmcgcGF0aCBzZWdtZW50IGlmIGEgLi4gd2lsbCBiZWNvbWUKICAgICAgICAgKiB0aGUgZmlyc3QgcGF0aCBzZWdtZW50LCB0byBoZWxwIHdpdGggbW9kdWxlIG5hbWUgbG9va3VwcywKICAgICAgICAgKiB3aGljaCBhY3QgbGlrZSBwYXRocywgYnV0IGNhbiBiZSByZW1hcHBlZC4gQnV0IHRoZSBlbmQgcmVzdWx0LAogICAgICAgICAqIGFsbCBwYXRocyB0aGF0IHVzZSB0aGlzIGZ1bmN0aW9uIHNob3VsZCBsb29rIG5vcm1hbGl6ZWQuCiAgICAgICAgICogTk9URTogdGhpcyBtZXRob2QgTU9ESUZJRVMgdGhlIGlucHV0IGFycmF5LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyeSB0aGUgYXJyYXkgb2YgcGF0aCBzZWdtZW50cy4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB0cmltRG90cyhhcnkpIHsKICAgICAgICAgICAgdmFyIGksIHBhcnQ7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcnkubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHBhcnQgPSBhcnlbaV07CiAgICAgICAgICAgICAgICBpZiAocGFydCA9PT0gJy4nKSB7CiAgICAgICAgICAgICAgICAgICAgYXJ5LnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgICBpIC09IDE7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQgPT09ICcuLicpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiBhdCB0aGUgc3RhcnQsIG9yIHByZXZpb3VzIHZhbHVlIGlzIHN0aWxsIC4uLAogICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgdGhlbSBzbyB0aGF0IHdoZW4gY29udmVydGVkIHRvIGEgcGF0aCBpdCBtYXkKICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCB3b3JrIHdoZW4gY29udmVydGVkIHRvIGEgcGF0aCwgZXZlbiB0aG91Z2gKICAgICAgICAgICAgICAgICAgICAvLyBhcyBhbiBJRCBpdCBpcyBsZXNzIHRoYW4gaWRlYWwuIEluIGxhcmdlciBwb2ludAogICAgICAgICAgICAgICAgICAgIC8vIHJlbGVhc2VzLCBtYXkgYmUgYmV0dGVyIHRvIGp1c3Qga2ljayBvdXQgYW4gZXJyb3IuCiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDAgfHwgKGkgPT09IDEgJiYgYXJ5WzJdID09PSAnLi4nKSB8fCBhcnlbaSAtIDFdID09PSAnLi4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXJ5LnNwbGljZShpIC0gMSwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgLT0gMjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEdpdmVuIGEgcmVsYXRpdmUgbW9kdWxlIG5hbWUsIGxpa2UgLi9zb21ldGhpbmcsIG5vcm1hbGl6ZSBpdCB0bwogICAgICAgICAqIGEgcmVhbCBuYW1lIHRoYXQgY2FuIGJlIG1hcHBlZCB0byBhIHBhdGguCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIHJlbGF0aXZlIG5hbWUKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmFzZU5hbWUgYSByZWFsIG5hbWUgdGhhdCB0aGUgbmFtZSBhcmcgaXMgcmVsYXRpdmUKICAgICAgICAgKiB0by4KICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFwcGx5TWFwIGFwcGx5IHRoZSBtYXAgY29uZmlnIHRvIHRoZSB2YWx1ZS4gU2hvdWxkCiAgICAgICAgICogb25seSBiZSBkb25lIGlmIHRoaXMgbm9ybWFsaXphdGlvbiBpcyBmb3IgYSBkZXBlbmRlbmN5IElELgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IG5vcm1hbGl6ZWQgbmFtZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZShuYW1lLCBiYXNlTmFtZSwgYXBwbHlNYXApIHsKICAgICAgICAgICAgdmFyIHBrZ01haW4sIG1hcFZhbHVlLCBuYW1lUGFydHMsIGksIGosIG5hbWVTZWdtZW50LCBsYXN0SW5kZXgsCiAgICAgICAgICAgICAgICBmb3VuZE1hcCwgZm91bmRJLCBmb3VuZFN0YXJNYXAsIHN0YXJJLCBub3JtYWxpemVkQmFzZVBhcnRzLAogICAgICAgICAgICAgICAgYmFzZVBhcnRzID0gKGJhc2VOYW1lICYmIGJhc2VOYW1lLnNwbGl0KCcvJykpLAogICAgICAgICAgICAgICAgbWFwID0gY29uZmlnLm1hcCwKICAgICAgICAgICAgICAgIHN0YXJNYXAgPSBtYXAgJiYgbWFwWycqJ107CgogICAgICAgICAgICAvL0FkanVzdCBhbnkgcmVsYXRpdmUgcGF0aHMuCiAgICAgICAgICAgIGlmIChuYW1lKSB7CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zcGxpdCgnLycpOwogICAgICAgICAgICAgICAgbGFzdEluZGV4ID0gbmFtZS5sZW5ndGggLSAxOwoKICAgICAgICAgICAgICAgIC8vIElmIHdhbnRpbmcgbm9kZSBJRCBjb21wYXRpYmlsaXR5LCBzdHJpcCAuanMgZnJvbSBlbmQKICAgICAgICAgICAgICAgIC8vIG9mIElEcy4gSGF2ZSB0byBkbyB0aGlzIGhlcmUsIGFuZCBub3QgaW4gbmFtZVRvVXJsCiAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIG5vZGUgYWxsb3dzIGVpdGhlciAuanMgb3Igbm9uIC5qcyB0byBtYXAKICAgICAgICAgICAgICAgIC8vIHRvIHNhbWUgZmlsZS4KICAgICAgICAgICAgICAgIGlmIChjb25maWcubm9kZUlkQ29tcGF0ICYmIGpzU3VmZml4UmVnRXhwLnRlc3QobmFtZVtsYXN0SW5kZXhdKSkgewogICAgICAgICAgICAgICAgICAgIG5hbWVbbGFzdEluZGV4XSA9IG5hbWVbbGFzdEluZGV4XS5yZXBsYWNlKGpzU3VmZml4UmVnRXhwLCAnJyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gU3RhcnRzIHdpdGggYSAnLicgc28gbmVlZCB0aGUgYmFzZU5hbWUKICAgICAgICAgICAgICAgIGlmIChuYW1lWzBdLmNoYXJBdCgwKSA9PT0gJy4nICYmIGJhc2VQYXJ0cykgewogICAgICAgICAgICAgICAgICAgIC8vQ29udmVydCBiYXNlTmFtZSB0byBhcnJheSwgYW5kIGxvcCBvZmYgdGhlIGxhc3QgcGFydCwKICAgICAgICAgICAgICAgICAgICAvL3NvIHRoYXQgLiBtYXRjaGVzIHRoYXQgJ2RpcmVjdG9yeScgYW5kIG5vdCBuYW1lIG9mIHRoZSBiYXNlTmFtZSdzCiAgICAgICAgICAgICAgICAgICAgLy9tb2R1bGUuIEZvciBpbnN0YW5jZSwgYmFzZU5hbWUgb2YgJ29uZS90d28vdGhyZWUnLCBtYXBzIHRvCiAgICAgICAgICAgICAgICAgICAgLy8nb25lL3R3by90aHJlZS5qcycsIGJ1dCB3ZSB3YW50IHRoZSBkaXJlY3RvcnksICdvbmUvdHdvJyBmb3IKICAgICAgICAgICAgICAgICAgICAvL3RoaXMgbm9ybWFsaXphdGlvbi4KICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkQmFzZVBhcnRzID0gYmFzZVBhcnRzLnNsaWNlKDAsIGJhc2VQYXJ0cy5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgICAgICBuYW1lID0gbm9ybWFsaXplZEJhc2VQYXJ0cy5jb25jYXQobmFtZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdHJpbURvdHMobmFtZSk7CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5qb2luKCcvJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vQXBwbHkgbWFwIGNvbmZpZyBpZiBhdmFpbGFibGUuCiAgICAgICAgICAgIGlmIChhcHBseU1hcCAmJiBtYXAgJiYgKGJhc2VQYXJ0cyB8fCBzdGFyTWFwKSkgewogICAgICAgICAgICAgICAgbmFtZVBhcnRzID0gbmFtZS5zcGxpdCgnLycpOwoKICAgICAgICAgICAgICAgIG91dGVyTG9vcDogZm9yIChpID0gbmFtZVBhcnRzLmxlbmd0aDsgaSA+IDA7IGkgLT0gMSkgewogICAgICAgICAgICAgICAgICAgIG5hbWVTZWdtZW50ID0gbmFtZVBhcnRzLnNsaWNlKDAsIGkpLmpvaW4oJy8nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VQYXJ0cykgewogICAgICAgICAgICAgICAgICAgICAgICAvL0ZpbmQgdGhlIGxvbmdlc3QgYmFzZU5hbWUgc2VnbWVudCBtYXRjaCBpbiB0aGUgY29uZmlnLgogICAgICAgICAgICAgICAgICAgICAgICAvL1NvLCBkbyBqb2lucyBvbiB0aGUgYmlnZ2VzdCB0byBzbWFsbGVzdCBsZW5ndGhzIG9mIGJhc2VQYXJ0cy4KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gYmFzZVBhcnRzLmxlbmd0aDsgaiA+IDA7IGogLT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwVmFsdWUgPSBnZXRPd24obWFwLCBiYXNlUGFydHMuc2xpY2UoMCwgaikuam9pbignLycpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Jhc2VOYW1lIHNlZ21lbnQgaGFzIGNvbmZpZywgZmluZCBpZiBpdCBoYXMgb25lIGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIG5hbWUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBWYWx1ZSA9IGdldE93bihtYXBWYWx1ZSwgbmFtZVNlZ21lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01hdGNoLCB1cGRhdGUgbmFtZSB0byB0aGUgbmV3IHZhbHVlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZE1hcCA9IG1hcFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEkgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlckxvb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvL0NoZWNrIGZvciBhIHN0YXIgbWFwIG1hdGNoLCBidXQganVzdCBob2xkIG9uIHRvIGl0LAogICAgICAgICAgICAgICAgICAgIC8vaWYgdGhlcmUgaXMgYSBzaG9ydGVyIHNlZ21lbnQgbWF0Y2ggbGF0ZXIgaW4gYSBtYXRjaGluZwogICAgICAgICAgICAgICAgICAgIC8vY29uZmlnLCB0aGVuIGZhdm9yIG92ZXIgdGhpcyBzdGFyIG1hcC4KICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kU3Rhck1hcCAmJiBzdGFyTWFwICYmIGdldE93bihzdGFyTWFwLCBuYW1lU2VnbWVudCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRTdGFyTWFwID0gZ2V0T3duKHN0YXJNYXAsIG5hbWVTZWdtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhckkgPSBpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kTWFwICYmIGZvdW5kU3Rhck1hcCkgewogICAgICAgICAgICAgICAgICAgIGZvdW5kTWFwID0gZm91bmRTdGFyTWFwOwogICAgICAgICAgICAgICAgICAgIGZvdW5kSSA9IHN0YXJJOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChmb3VuZE1hcCkgewogICAgICAgICAgICAgICAgICAgIG5hbWVQYXJ0cy5zcGxpY2UoMCwgZm91bmRJLCBmb3VuZE1hcCk7CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWVQYXJ0cy5qb2luKCcvJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElmIHRoZSBuYW1lIHBvaW50cyB0byBhIHBhY2thZ2UncyBuYW1lLCB1c2UKICAgICAgICAgICAgLy8gdGhlIHBhY2thZ2UgbWFpbiBpbnN0ZWFkLgogICAgICAgICAgICBwa2dNYWluID0gZ2V0T3duKGNvbmZpZy5wa2dzLCBuYW1lKTsKCiAgICAgICAgICAgIHJldHVybiBwa2dNYWluID8gcGtnTWFpbiA6IG5hbWU7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByZW1vdmVTY3JpcHQobmFtZSkgewogICAgICAgICAgICBpZiAoaXNCcm93c2VyKSB7CiAgICAgICAgICAgICAgICBlYWNoKHNjcmlwdHMoKSwgZnVuY3Rpb24gKHNjcmlwdE5vZGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2NyaXB0Tm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVxdWlyZW1vZHVsZScpID09PSBuYW1lICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHROb2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlY29udGV4dCcpID09PSBjb250ZXh0LmNvbnRleHROYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JpcHROb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGhhc1BhdGhGYWxsYmFjayhpZCkgewogICAgICAgICAgICB2YXIgcGF0aENvbmZpZyA9IGdldE93bihjb25maWcucGF0aHMsIGlkKTsKICAgICAgICAgICAgaWYgKHBhdGhDb25maWcgJiYgaXNBcnJheShwYXRoQ29uZmlnKSAmJiBwYXRoQ29uZmlnLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgIC8vUG9wIG9mZiB0aGUgZmlyc3QgYXJyYXkgdmFsdWUsIHNpbmNlIGl0IGZhaWxlZCwgYW5kCiAgICAgICAgICAgICAgICAvL3JldHJ5CiAgICAgICAgICAgICAgICBwYXRoQ29uZmlnLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBjb250ZXh0LnJlcXVpcmUudW5kZWYoaWQpOwoKICAgICAgICAgICAgICAgIC8vQ3VzdG9tIHJlcXVpcmUgdGhhdCBkb2VzIG5vdCBkbyBtYXAgdHJhbnNsYXRpb24sIHNpbmNlCiAgICAgICAgICAgICAgICAvL0lEIGlzICJhYnNvbHV0ZSIsIGFscmVhZHkgbWFwcGVkL3Jlc29sdmVkLgogICAgICAgICAgICAgICAgY29udGV4dC5tYWtlUmVxdWlyZShudWxsLCB7CiAgICAgICAgICAgICAgICAgICAgc2tpcE1hcDogdHJ1ZQogICAgICAgICAgICAgICAgfSkoW2lkXSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vVHVybnMgYSBwbHVnaW4hcmVzb3VyY2UgdG8gW3BsdWdpbiwgcmVzb3VyY2VdCiAgICAgICAgLy93aXRoIHRoZSBwbHVnaW4gYmVpbmcgdW5kZWZpbmVkIGlmIHRoZSBuYW1lCiAgICAgICAgLy9kaWQgbm90IGhhdmUgYSBwbHVnaW4gcHJlZml4LgogICAgICAgIGZ1bmN0aW9uIHNwbGl0UHJlZml4KG5hbWUpIHsKICAgICAgICAgICAgdmFyIHByZWZpeCwKICAgICAgICAgICAgICAgIGluZGV4ID0gbmFtZSA/IG5hbWUuaW5kZXhPZignIScpIDogLTE7CiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7CiAgICAgICAgICAgICAgICBwcmVmaXggPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxLCBuYW1lLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtwcmVmaXgsIG5hbWVdOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIG1vZHVsZSBtYXBwaW5nIHRoYXQgaW5jbHVkZXMgcGx1Z2luIHByZWZpeCwgbW9kdWxlCiAgICAgICAgICogbmFtZSwgYW5kIHBhdGguIElmIHBhcmVudE1vZHVsZU1hcCBpcyBwcm92aWRlZCBpdCB3aWxsCiAgICAgICAgICogYWxzbyBub3JtYWxpemUgdGhlIG5hbWUgdmlhIHJlcXVpcmUubm9ybWFsaXplKCkKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBtb2R1bGUgbmFtZQogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyZW50TW9kdWxlTWFwXSBwYXJlbnQgbW9kdWxlIG1hcAogICAgICAgICAqIGZvciB0aGUgbW9kdWxlIG5hbWUsIHVzZWQgdG8gcmVzb2x2ZSByZWxhdGl2ZSBuYW1lcy4KICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzTm9ybWFsaXplZDogaXMgdGhlIElEIGFscmVhZHkgbm9ybWFsaXplZC4KICAgICAgICAgKiBUaGlzIGlzIHRydWUgaWYgdGhpcyBjYWxsIGlzIGRvbmUgZm9yIGEgZGVmaW5lKCkgbW9kdWxlIElELgogICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXBwbHlNYXA6IGFwcGx5IHRoZSBtYXAgY29uZmlnIHRvIHRoZSBJRC4KICAgICAgICAgKiBTaG91bGQgb25seSBiZSB0cnVlIGlmIHRoaXMgbWFwIGlzIGZvciBhIGRlcGVuZGVuY3kuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIG1ha2VNb2R1bGVNYXAobmFtZSwgcGFyZW50TW9kdWxlTWFwLCBpc05vcm1hbGl6ZWQsIGFwcGx5TWFwKSB7CiAgICAgICAgICAgIHZhciB1cmwsIHBsdWdpbk1vZHVsZSwgc3VmZml4LCBuYW1lUGFydHMsCiAgICAgICAgICAgICAgICBwcmVmaXggPSBudWxsLAogICAgICAgICAgICAgICAgcGFyZW50TmFtZSA9IHBhcmVudE1vZHVsZU1hcCA/IHBhcmVudE1vZHVsZU1hcC5uYW1lIDogbnVsbCwKICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZSA9IG5hbWUsCiAgICAgICAgICAgICAgICBpc0RlZmluZSA9IHRydWUsCiAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9ICcnOwoKICAgICAgICAgICAgLy9JZiBubyBuYW1lLCB0aGVuIGl0IG1lYW5zIGl0IGlzIGEgcmVxdWlyZSBjYWxsLCBnZW5lcmF0ZSBhbgogICAgICAgICAgICAvL2ludGVybmFsIG5hbWUuCiAgICAgICAgICAgIGlmICghbmFtZSkgewogICAgICAgICAgICAgICAgaXNEZWZpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIG5hbWUgPSAnX0ByJyArIChyZXF1aXJlQ291bnRlciArPSAxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmFtZVBhcnRzID0gc3BsaXRQcmVmaXgobmFtZSk7CiAgICAgICAgICAgIHByZWZpeCA9IG5hbWVQYXJ0c1swXTsKICAgICAgICAgICAgbmFtZSA9IG5hbWVQYXJ0c1sxXTsKCiAgICAgICAgICAgIGlmIChwcmVmaXgpIHsKICAgICAgICAgICAgICAgIHByZWZpeCA9IG5vcm1hbGl6ZShwcmVmaXgsIHBhcmVudE5hbWUsIGFwcGx5TWFwKTsKICAgICAgICAgICAgICAgIHBsdWdpbk1vZHVsZSA9IGdldE93bihkZWZpbmVkLCBwcmVmaXgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL0FjY291bnQgZm9yIHJlbGF0aXZlIHBhdGhzIGlmIHRoZXJlIGlzIGEgYmFzZSBuYW1lLgogICAgICAgICAgICBpZiAobmFtZSkgewogICAgICAgICAgICAgICAgaWYgKHByZWZpeCkgewogICAgICAgICAgICAgICAgICAgIGlmIChpc05vcm1hbGl6ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZE5hbWUgPSBuYW1lOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGx1Z2luTW9kdWxlICYmIHBsdWdpbk1vZHVsZS5ub3JtYWxpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9QbHVnaW4gaXMgbG9hZGVkLCB1c2UgaXRzIG5vcm1hbGl6ZSBtZXRob2QuCiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lID0gcGx1Z2luTW9kdWxlLm5vcm1hbGl6ZShuYW1lLCBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShuYW1lLCBwYXJlbnROYW1lLCBhcHBseU1hcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5lc3RlZCBwbHVnaW4gcmVmZXJlbmNlcywgdGhlbiBkbyBub3QgdHJ5IHRvCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSwgYXMgaXQgd2lsbCBub3Qgbm9ybWFsaXplIGNvcnJlY3RseS4gVGhpcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBwbGFjZXMgYSByZXN0cmljdGlvbiBvbiByZXNvdXJjZUlkcywgYW5kIHRoZSBsb25nZXIKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybSBzb2x1dGlvbiBpcyBub3QgdG8gbm9ybWFsaXplIHVudGlsIHBsdWdpbnMgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWRlZCBhbmQgYWxsIG5vcm1hbGl6YXRpb25zIHRvIGFsbG93IGZvciBhc3luYwogICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkaW5nIG9mIGEgbG9hZGVyIHBsdWdpbi4gQnV0IGZvciBub3csIGZpeGVzIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21tb24gdXNlcy4gRGV0YWlscyBpbiAjMTEzMQogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9IG5hbWUuaW5kZXhPZignIScpID09PSAtMSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplKG5hbWUsIHBhcmVudE5hbWUsIGFwcGx5TWFwKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vQSByZWd1bGFyIG1vZHVsZS4KICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZShuYW1lLCBwYXJlbnROYW1lLCBhcHBseU1hcCk7CgogICAgICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplZCBuYW1lIG1heSBiZSBhIHBsdWdpbiBJRCBkdWUgdG8gbWFwIGNvbmZpZwogICAgICAgICAgICAgICAgICAgIC8vYXBwbGljYXRpb24gaW4gbm9ybWFsaXplLiBUaGUgbWFwIGNvbmZpZyB2YWx1ZXMgbXVzdAogICAgICAgICAgICAgICAgICAgIC8vYWxyZWFkeSBiZSBub3JtYWxpemVkLCBzbyBkbyBub3QgbmVlZCB0byByZWRvIHRoYXQgcGFydC4KICAgICAgICAgICAgICAgICAgICBuYW1lUGFydHMgPSBzcGxpdFByZWZpeChub3JtYWxpemVkTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gbmFtZVBhcnRzWzBdOwogICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lID0gbmFtZVBhcnRzWzFdOwogICAgICAgICAgICAgICAgICAgIGlzTm9ybWFsaXplZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIHVybCA9IGNvbnRleHQubmFtZVRvVXJsKG5vcm1hbGl6ZWROYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9JZiB0aGUgaWQgaXMgYSBwbHVnaW4gaWQgdGhhdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBpZiBpdCBuZWVkcwogICAgICAgICAgICAvL25vcm1hbGl6YXRpb24sIHN0YW1wIGl0IHdpdGggYSB1bmlxdWUgSUQgc28gdHdvIG1hdGNoaW5nIHJlbGF0aXZlCiAgICAgICAgICAgIC8vaWRzIHRoYXQgbWF5IGNvbmZsaWN0IGNhbiBiZSBzZXBhcmF0ZS4KICAgICAgICAgICAgc3VmZml4ID0gcHJlZml4ICYmICFwbHVnaW5Nb2R1bGUgJiYgIWlzTm9ybWFsaXplZCA/CiAgICAgICAgICAgICAgICAgICAgICdfdW5ub3JtYWxpemVkJyArICh1bm5vcm1hbGl6ZWRDb3VudGVyICs9IDEpIDoKICAgICAgICAgICAgICAgICAgICAgJyc7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcHJlZml4OiBwcmVmaXgsCiAgICAgICAgICAgICAgICBuYW1lOiBub3JtYWxpemVkTmFtZSwKICAgICAgICAgICAgICAgIHBhcmVudE1hcDogcGFyZW50TW9kdWxlTWFwLAogICAgICAgICAgICAgICAgdW5ub3JtYWxpemVkOiAhIXN1ZmZpeCwKICAgICAgICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiBvcmlnaW5hbE5hbWUsCiAgICAgICAgICAgICAgICBpc0RlZmluZTogaXNEZWZpbmUsCiAgICAgICAgICAgICAgICBpZDogKHByZWZpeCA/CiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArICchJyArIG5vcm1hbGl6ZWROYW1lIDoKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZE5hbWUpICsgc3VmZml4CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBnZXRNb2R1bGUoZGVwTWFwKSB7CiAgICAgICAgICAgIHZhciBpZCA9IGRlcE1hcC5pZCwKICAgICAgICAgICAgICAgIG1vZCA9IGdldE93bihyZWdpc3RyeSwgaWQpOwoKICAgICAgICAgICAgaWYgKCFtb2QpIHsKICAgICAgICAgICAgICAgIG1vZCA9IHJlZ2lzdHJ5W2lkXSA9IG5ldyBjb250ZXh0Lk1vZHVsZShkZXBNYXApOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbW9kOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gb24oZGVwTWFwLCBuYW1lLCBmbikgewogICAgICAgICAgICB2YXIgaWQgPSBkZXBNYXAuaWQsCiAgICAgICAgICAgICAgICBtb2QgPSBnZXRPd24ocmVnaXN0cnksIGlkKTsKCiAgICAgICAgICAgIGlmIChoYXNQcm9wKGRlZmluZWQsIGlkKSAmJgogICAgICAgICAgICAgICAgICAgICghbW9kIHx8IG1vZC5kZWZpbmVFbWl0Q29tcGxldGUpKSB7CiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2RlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgZm4oZGVmaW5lZFtpZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbW9kID0gZ2V0TW9kdWxlKGRlcE1hcCk7CiAgICAgICAgICAgICAgICBpZiAobW9kLmVycm9yICYmIG5hbWUgPT09ICdlcnJvcicpIHsKICAgICAgICAgICAgICAgICAgICBmbihtb2QuZXJyb3IpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtb2Qub24obmFtZSwgZm4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBvbkVycm9yKGVyciwgZXJyYmFjaykgewogICAgICAgICAgICB2YXIgaWRzID0gZXJyLnJlcXVpcmVNb2R1bGVzLAogICAgICAgICAgICAgICAgbm90aWZpZWQgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmIChlcnJiYWNrKSB7CiAgICAgICAgICAgICAgICBlcnJiYWNrKGVycik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlYWNoKGlkcywgZnVuY3Rpb24gKGlkKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZCA9IGdldE93bihyZWdpc3RyeSwgaWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChtb2QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9TZXQgZXJyb3Igb24gbW9kdWxlLCBzbyBpdCBza2lwcyB0aW1lb3V0IGNoZWNrcy4KICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmVycm9yID0gZXJyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kLmV2ZW50cy5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGlmICghbm90aWZpZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXEub25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gdHJhbnNmZXIgZ2xvYmFsUXVldWUgaXRlbXMgdG8gdGhpcyBjb250ZXh0J3MKICAgICAgICAgKiBkZWZRdWV1ZS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB0YWtlR2xvYmFsUXVldWUoKSB7CiAgICAgICAgICAgIC8vUHVzaCBhbGwgdGhlIGdsb2JhbERlZlF1ZXVlIGl0ZW1zIGludG8gdGhlIGNvbnRleHQncyBkZWZRdWV1ZQogICAgICAgICAgICBpZiAoZ2xvYmFsRGVmUXVldWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBlYWNoKGdsb2JhbERlZlF1ZXVlLCBmdW5jdGlvbihxdWV1ZUl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBxdWV1ZUl0ZW1bMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5kZWZRdWV1ZU1hcFtpZF0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZWZRdWV1ZS5wdXNoKHF1ZXVlSXRlbSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGdsb2JhbERlZlF1ZXVlID0gW107CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGhhbmRsZXJzID0gewogICAgICAgICAgICAncmVxdWlyZSc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIGlmIChtb2QucmVxdWlyZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2QucmVxdWlyZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtb2QucmVxdWlyZSA9IGNvbnRleHQubWFrZVJlcXVpcmUobW9kLm1hcCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAnZXhwb3J0cyc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIG1vZC51c2luZ0V4cG9ydHMgPSB0cnVlOwogICAgICAgICAgICAgICAgaWYgKG1vZC5tYXAuaXNEZWZpbmUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kLmV4cG9ydHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkZWZpbmVkW21vZC5tYXAuaWRdID0gbW9kLmV4cG9ydHMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAobW9kLmV4cG9ydHMgPSBkZWZpbmVkW21vZC5tYXAuaWRdID0ge30pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ21vZHVsZSc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIGlmIChtb2QubW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZC5tb2R1bGU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAobW9kLm1vZHVsZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IG1vZC5tYXAuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHVyaTogbW9kLm1hcC51cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldE93bihjb25maWcuY29uZmlnLCBtb2QubWFwLmlkKSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogbW9kLmV4cG9ydHMgfHwgKG1vZC5leHBvcnRzID0ge30pCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBjbGVhblJlZ2lzdHJ5KGlkKSB7CiAgICAgICAgICAgIC8vQ2xlYW4gdXAgbWFjaGluZXJ5IHVzZWQgZm9yIHdhaXRpbmcgbW9kdWxlcy4KICAgICAgICAgICAgZGVsZXRlIHJlZ2lzdHJ5W2lkXTsKICAgICAgICAgICAgZGVsZXRlIGVuYWJsZWRSZWdpc3RyeVtpZF07CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBicmVha0N5Y2xlKG1vZCwgdHJhY2VkLCBwcm9jZXNzZWQpIHsKICAgICAgICAgICAgdmFyIGlkID0gbW9kLm1hcC5pZDsKCiAgICAgICAgICAgIGlmIChtb2QuZXJyb3IpIHsKICAgICAgICAgICAgICAgIG1vZC5lbWl0KCdlcnJvcicsIG1vZC5lcnJvcik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0cmFjZWRbaWRdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGVhY2gobW9kLmRlcE1hcHMsIGZ1bmN0aW9uIChkZXBNYXAsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVwSWQgPSBkZXBNYXAuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcCA9IGdldE93bihyZWdpc3RyeSwgZGVwSWQpOwoKICAgICAgICAgICAgICAgICAgICAvL09ubHkgZm9yY2UgdGhpbmdzIHRoYXQgaGF2ZSBub3QgY29tcGxldGVkCiAgICAgICAgICAgICAgICAgICAgLy9iZWluZyBkZWZpbmVkLCBzbyBzdGlsbCBpbiB0aGUgcmVnaXN0cnksCiAgICAgICAgICAgICAgICAgICAgLy9hbmQgb25seSBpZiBpdCBoYXMgbm90IGJlZW4gbWF0Y2hlZCB1cAogICAgICAgICAgICAgICAgICAgIC8vaW4gdGhlIG1vZHVsZSBhbHJlYWR5LgogICAgICAgICAgICAgICAgICAgIGlmIChkZXAgJiYgIW1vZC5kZXBNYXRjaGVkW2ldICYmICFwcm9jZXNzZWRbZGVwSWRdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRPd24odHJhY2VkLCBkZXBJZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZC5kZWZpbmVEZXAoaSwgZGVmaW5lZFtkZXBJZF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmNoZWNrKCk7IC8vcGFzcyBmYWxzZT8KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrQ3ljbGUoZGVwLCB0cmFjZWQsIHByb2Nlc3NlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHByb2Nlc3NlZFtpZF0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjaGVja0xvYWRlZCgpIHsKICAgICAgICAgICAgdmFyIGVyciwgdXNpbmdQYXRoRmFsbGJhY2ssCiAgICAgICAgICAgICAgICB3YWl0SW50ZXJ2YWwgPSBjb25maWcud2FpdFNlY29uZHMgKiAxMDAwLAogICAgICAgICAgICAgICAgLy9JdCBpcyBwb3NzaWJsZSB0byBkaXNhYmxlIHRoZSB3YWl0IGludGVydmFsIGJ5IHVzaW5nIHdhaXRTZWNvbmRzIG9mIDAuCiAgICAgICAgICAgICAgICBleHBpcmVkID0gd2FpdEludGVydmFsICYmIChjb250ZXh0LnN0YXJ0VGltZSArIHdhaXRJbnRlcnZhbCkgPCBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKICAgICAgICAgICAgICAgIG5vTG9hZHMgPSBbXSwKICAgICAgICAgICAgICAgIHJlcUNhbGxzID0gW10sCiAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSBmYWxzZSwKICAgICAgICAgICAgICAgIG5lZWRDeWNsZUNoZWNrID0gdHJ1ZTsKCiAgICAgICAgICAgIC8vRG8gbm90IGJvdGhlciBpZiB0aGlzIGNhbGwgd2FzIGEgcmVzdWx0IG9mIGEgY3ljbGUgYnJlYWsuCiAgICAgICAgICAgIGlmIChpbkNoZWNrTG9hZGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGluQ2hlY2tMb2FkZWQgPSB0cnVlOwoKICAgICAgICAgICAgLy9GaWd1cmUgb3V0IHRoZSBzdGF0ZSBvZiBhbGwgdGhlIG1vZHVsZXMuCiAgICAgICAgICAgIGVhY2hQcm9wKGVuYWJsZWRSZWdpc3RyeSwgZnVuY3Rpb24gKG1vZCkgewogICAgICAgICAgICAgICAgdmFyIG1hcCA9IG1vZC5tYXAsCiAgICAgICAgICAgICAgICAgICAgbW9kSWQgPSBtYXAuaWQ7CgogICAgICAgICAgICAgICAgLy9Ta2lwIHRoaW5ncyB0aGF0IGFyZSBub3QgZW5hYmxlZCBvciBpbiBlcnJvciBzdGF0ZS4KICAgICAgICAgICAgICAgIGlmICghbW9kLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFtYXAuaXNEZWZpbmUpIHsKICAgICAgICAgICAgICAgICAgICByZXFDYWxscy5wdXNoKG1vZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFtb2QuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBtb2R1bGUgc2hvdWxkIGJlIGV4ZWN1dGVkLCBhbmQgaXQgaGFzIG5vdAogICAgICAgICAgICAgICAgICAgIC8vYmVlbiBpbml0ZWQgYW5kIHRpbWUgaXMgdXAsIHJlbWVtYmVyIGl0LgogICAgICAgICAgICAgICAgICAgIGlmICghbW9kLmluaXRlZCAmJiBleHBpcmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNQYXRoRmFsbGJhY2sobW9kSWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ1BhdGhGYWxsYmFjayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Mb2Fkcy5wdXNoKG1vZElkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVNjcmlwdChtb2RJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtb2QuaW5pdGVkICYmIG1vZC5mZXRjaGVkICYmIG1hcC5pc0RlZmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1hcC5wcmVmaXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTm8gcmVhc29uIHRvIGtlZXAgbG9va2luZyBmb3IgdW5maW5pc2hlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sb2FkaW5nLiBJZiB0aGUgb25seSBzdGlsbExvYWRpbmcgaXMgYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wbHVnaW4gcmVzb3VyY2UgdGhvdWdoLCBrZWVwIGdvaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9iZWNhdXNlIGl0IG1heSBiZSB0aGF0IGEgcGx1Z2luIHJlc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lzIHdhaXRpbmcgb24gYSBub24tcGx1Z2luIGN5Y2xlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZWVkQ3ljbGVDaGVjayA9IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoZXhwaXJlZCAmJiBub0xvYWRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgLy9JZiB3YWl0IHRpbWUgZXhwaXJlZCwgdGhyb3cgZXJyb3Igb2YgdW5sb2FkZWQgbW9kdWxlcy4KICAgICAgICAgICAgICAgIGVyciA9IG1ha2VFcnJvcigndGltZW91dCcsICdMb2FkIHRpbWVvdXQgZm9yIG1vZHVsZXM6ICcgKyBub0xvYWRzLCBudWxsLCBub0xvYWRzKTsKICAgICAgICAgICAgICAgIGVyci5jb250ZXh0TmFtZSA9IGNvbnRleHQuY29udGV4dE5hbWU7CiAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihlcnIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL05vdCBleHBpcmVkLCBjaGVjayBmb3IgYSBjeWNsZS4KICAgICAgICAgICAgaWYgKG5lZWRDeWNsZUNoZWNrKSB7CiAgICAgICAgICAgICAgICBlYWNoKHJlcUNhbGxzLCBmdW5jdGlvbiAobW9kKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWtDeWNsZShtb2QsIHt9LCB7fSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9JZiBzdGlsbCB3YWl0aW5nIG9uIGxvYWRzLCBhbmQgdGhlIHdhaXRpbmcgbG9hZCBpcyBzb21ldGhpbmcKICAgICAgICAgICAgLy9vdGhlciB0aGFuIGEgcGx1Z2luIHJlc291cmNlLCBvciB0aGVyZSBhcmUgc3RpbGwgb3V0c3RhbmRpbmcKICAgICAgICAgICAgLy9zY3JpcHRzLCB0aGVuIGp1c3QgdHJ5IGJhY2sgbGF0ZXIuCiAgICAgICAgICAgIGlmICgoIWV4cGlyZWQgfHwgdXNpbmdQYXRoRmFsbGJhY2spICYmIHN0aWxsTG9hZGluZykgewogICAgICAgICAgICAgICAgLy9Tb21ldGhpbmcgaXMgc3RpbGwgd2FpdGluZyB0byBsb2FkLiBXYWl0IGZvciBpdCwgYnV0IG9ubHkKICAgICAgICAgICAgICAgIC8vaWYgYSB0aW1lb3V0IGlzIG5vdCBhbHJlYWR5IGluIGVmZmVjdC4KICAgICAgICAgICAgICAgIGlmICgoaXNCcm93c2VyIHx8IGlzV2ViV29ya2VyKSAmJiAhY2hlY2tMb2FkZWRUaW1lb3V0SWQpIHsKICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWRlZFRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWRlZFRpbWVvdXRJZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrTG9hZGVkKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgNTApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpbkNoZWNrTG9hZGVkID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBNb2R1bGUgPSBmdW5jdGlvbiAobWFwKSB7CiAgICAgICAgICAgIHRoaXMuZXZlbnRzID0gZ2V0T3duKHVuZGVmRXZlbnRzLCBtYXAuaWQpIHx8IHt9OwogICAgICAgICAgICB0aGlzLm1hcCA9IG1hcDsKICAgICAgICAgICAgdGhpcy5zaGltID0gZ2V0T3duKGNvbmZpZy5zaGltLCBtYXAuaWQpOwogICAgICAgICAgICB0aGlzLmRlcEV4cG9ydHMgPSBbXTsKICAgICAgICAgICAgdGhpcy5kZXBNYXBzID0gW107CiAgICAgICAgICAgIHRoaXMuZGVwTWF0Y2hlZCA9IFtdOwogICAgICAgICAgICB0aGlzLnBsdWdpbk1hcHMgPSB7fTsKICAgICAgICAgICAgdGhpcy5kZXBDb3VudCA9IDA7CgogICAgICAgICAgICAvKiB0aGlzLmV4cG9ydHMgdGhpcy5mYWN0b3J5CiAgICAgICAgICAgICAgIHRoaXMuZGVwTWFwcyA9IFtdLAogICAgICAgICAgICAgICB0aGlzLmVuYWJsZWQsIHRoaXMuZmV0Y2hlZAogICAgICAgICAgICAqLwogICAgICAgIH07CgogICAgICAgIE1vZHVsZS5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChkZXBNYXBzLCBmYWN0b3J5LCBlcnJiYWNrLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCiAgICAgICAgICAgICAgICAvL0RvIG5vdCBkbyBtb3JlIGluaXRzIGlmIGFscmVhZHkgZG9uZS4gQ2FuIGhhcHBlbiBpZiB0aGVyZQogICAgICAgICAgICAgICAgLy9hcmUgbXVsdGlwbGUgZGVmaW5lIGNhbGxzIGZvciB0aGUgc2FtZSBtb2R1bGUuIFRoYXQgaXMgbm90CiAgICAgICAgICAgICAgICAvL2Egbm9ybWFsLCBjb21tb24gY2FzZSwgYnV0IGl0IGlzIGFsc28gbm90IHVuZXhwZWN0ZWQuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbml0ZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKCiAgICAgICAgICAgICAgICBpZiAoZXJyYmFjaykgewogICAgICAgICAgICAgICAgICAgIC8vUmVnaXN0ZXIgZm9yIGVycm9ycyBvbiB0aGlzIG1vZHVsZS4KICAgICAgICAgICAgICAgICAgICB0aGlzLm9uKCdlcnJvcicsIGVycmJhY2spOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmV2ZW50cy5lcnJvcikgewogICAgICAgICAgICAgICAgICAgIC8vSWYgbm8gZXJyYmFjayBhbHJlYWR5LCBidXQgdGhlcmUgYXJlIGVycm9yIGxpc3RlbmVycwogICAgICAgICAgICAgICAgICAgIC8vb24gdGhpcyBtb2R1bGUsIHNldCB1cCBhbiBlcnJiYWNrIHRvIHBhc3MgdG8gdGhlIGRlcHMuCiAgICAgICAgICAgICAgICAgICAgZXJyYmFjayA9IGJpbmQodGhpcywgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL0RvIGEgY29weSBvZiB0aGUgZGVwZW5kZW5jeSBhcnJheSwgc28gdGhhdAogICAgICAgICAgICAgICAgLy9zb3VyY2UgaW5wdXRzIGFyZSBub3QgbW9kaWZpZWQuIEZvciBleGFtcGxlCiAgICAgICAgICAgICAgICAvLyJzaGltIiBkZXBzIGFyZSBwYXNzZWQgaW4gaGVyZSBkaXJlY3RseSwgYW5kCiAgICAgICAgICAgICAgICAvL2RvaW5nIGEgZGlyZWN0IG1vZGlmaWNhdGlvbiBvZiB0aGUgZGVwTWFwcyBhcnJheQogICAgICAgICAgICAgICAgLy93b3VsZCBhZmZlY3QgdGhhdCBjb25maWcuCiAgICAgICAgICAgICAgICB0aGlzLmRlcE1hcHMgPSBkZXBNYXBzICYmIGRlcE1hcHMuc2xpY2UoMCk7CgogICAgICAgICAgICAgICAgdGhpcy5lcnJiYWNrID0gZXJyYmFjazsKCiAgICAgICAgICAgICAgICAvL0luZGljYXRlIHRoaXMgbW9kdWxlIGhhcyBiZSBpbml0aWFsaXplZAogICAgICAgICAgICAgICAgdGhpcy5pbml0ZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIHRoaXMuaWdub3JlID0gb3B0aW9ucy5pZ25vcmU7CgogICAgICAgICAgICAgICAgLy9Db3VsZCBoYXZlIG9wdGlvbiB0byBpbml0IHRoaXMgbW9kdWxlIGluIGVuYWJsZWQgbW9kZSwKICAgICAgICAgICAgICAgIC8vb3IgY291bGQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgbWFya2VkIGFzIGVuYWJsZWQuIEhvd2V2ZXIsCiAgICAgICAgICAgICAgICAvL3RoZSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBrbm93biB1bnRpbCBpbml0IGlzIGNhbGxlZC4gU28KICAgICAgICAgICAgICAgIC8vaWYgZW5hYmxlZCBwcmV2aW91c2x5LCBub3cgdHJpZ2dlciBkZXBlbmRlbmNpZXMgYXMgZW5hYmxlZC4KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmVuYWJsZWQgfHwgdGhpcy5lbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgLy9FbmFibGUgdGhpcyBtb2R1bGUgYW5kIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgICAgICAgICAvL1dpbGwgY2FsbCB0aGlzLmNoZWNrKCkKICAgICAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBkZWZpbmVEZXA6IGZ1bmN0aW9uIChpLCBkZXBFeHBvcnRzKSB7CiAgICAgICAgICAgICAgICAvL0JlY2F1c2Ugb2YgY3ljbGVzLCBkZWZpbmVkIGNhbGxiYWNrIGZvciBhIGdpdmVuCiAgICAgICAgICAgICAgICAvL2V4cG9ydCBjYW4gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRlcE1hdGNoZWRbaV0pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcE1hdGNoZWRbaV0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVwQ291bnQgLT0gMTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcEV4cG9ydHNbaV0gPSBkZXBFeHBvcnRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZmV0Y2g6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZldGNoZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmZldGNoZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIGNvbnRleHQuc3RhcnRUaW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKCiAgICAgICAgICAgICAgICB2YXIgbWFwID0gdGhpcy5tYXA7CgogICAgICAgICAgICAgICAgLy9JZiB0aGUgbWFuYWdlciBpcyBmb3IgYSBwbHVnaW4gbWFuYWdlZCByZXNvdXJjZSwKICAgICAgICAgICAgICAgIC8vYXNrIHRoZSBwbHVnaW4gdG8gbG9hZCBpdCBub3cuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaGltKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5tYWtlUmVxdWlyZSh0aGlzLm1hcCwgewogICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVCdWlsZENhbGxiYWNrOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSkodGhpcy5zaGltLmRlcHMgfHwgW10sIGJpbmQodGhpcywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwLnByZWZpeCA/IHRoaXMuY2FsbFBsdWdpbigpIDogdGhpcy5sb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL1JlZ3VsYXIgZGVwZW5kZW5jeS4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwLnByZWZpeCA/IHRoaXMuY2FsbFBsdWdpbigpIDogdGhpcy5sb2FkKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBsb2FkOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgdXJsID0gdGhpcy5tYXAudXJsOwoKICAgICAgICAgICAgICAgIC8vUmVndWxhciBkZXBlbmRlbmN5LgogICAgICAgICAgICAgICAgaWYgKCF1cmxGZXRjaGVkW3VybF0pIHsKICAgICAgICAgICAgICAgICAgICB1cmxGZXRjaGVkW3VybF0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnRleHQubG9hZCh0aGlzLm1hcC5pZCwgdXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDaGVja3MgaWYgdGhlIG1vZHVsZSBpcyByZWFkeSB0byBkZWZpbmUgaXRzZWxmLCBhbmQgaWYgc28sCiAgICAgICAgICAgICAqIGRlZmluZSBpdC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNoZWNrOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZW5hYmxlZCB8fCB0aGlzLmVuYWJsaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBlcnIsIGNqc01vZHVsZSwKICAgICAgICAgICAgICAgICAgICBpZCA9IHRoaXMubWFwLmlkLAogICAgICAgICAgICAgICAgICAgIGRlcEV4cG9ydHMgPSB0aGlzLmRlcEV4cG9ydHMsCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IHRoaXMuZXhwb3J0cywKICAgICAgICAgICAgICAgICAgICBmYWN0b3J5ID0gdGhpcy5mYWN0b3J5OwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbml0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGZldGNoIGlmIG5vdCBhbHJlYWR5IGluIHRoZSBkZWZRdWV1ZS4KICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AoY29udGV4dC5kZWZRdWV1ZU1hcCwgaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2goKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcy5lcnJvcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmRlZmluaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgLy9UaGUgZmFjdG9yeSBjb3VsZCB0cmlnZ2VyIGFub3RoZXIgcmVxdWlyZSBjYWxsCiAgICAgICAgICAgICAgICAgICAgLy90aGF0IHdvdWxkIHJlc3VsdCBpbiBjaGVja2luZyB0aGlzIG1vZHVsZSB0bwogICAgICAgICAgICAgICAgICAgIC8vZGVmaW5lIGl0c2VsZiBhZ2Fpbi4gSWYgYWxyZWFkeSBpbiB0aGUgcHJvY2VzcwogICAgICAgICAgICAgICAgICAgIC8vb2YgZG9pbmcgdGhhdCwgc2tpcCB0aGlzIHdvcmsuCiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZpbmluZyA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlcENvdW50IDwgMSAmJiAhdGhpcy5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGZhY3RvcnkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZXJlIGlzIGFuIGVycm9yIGxpc3RlbmVyLCBmYXZvciBwYXNzaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RvIHRoYXQgaW5zdGVhZCBvZiB0aHJvd2luZyBhbiBlcnJvci4gSG93ZXZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vb25seSBkbyBpdCBmb3IgZGVmaW5lKCknZCAgbW9kdWxlcy4gcmVxdWlyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lcnJiYWNrcyBzaG91bGQgbm90IGJlIGNhbGxlZCBmb3IgZmFpbHVyZXMgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhlaXIgY2FsbGJhY2tzICgjNjk5KS4gSG93ZXZlciBpZiBhIGdsb2JhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9vbkVycm9yIGlzIHNldCwgdXNlIHRoYXQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMuZXZlbnRzLmVycm9yICYmIHRoaXMubWFwLmlzRGVmaW5lKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5vbkVycm9yICE9PSBkZWZhdWx0T25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSBjb250ZXh0LmV4ZWNDYihpZCwgZmFjdG9yeSwgZGVwRXhwb3J0cywgZXhwb3J0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IGNvbnRleHQuZXhlY0NiKGlkLCBmYWN0b3J5LCBkZXBFeHBvcnRzLCBleHBvcnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYXZvciByZXR1cm4gdmFsdWUgb3ZlciBleHBvcnRzLiBJZiBub2RlL2NqcyBpbiBwbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiB3aWxsIG5vdCBoYXZlIGEgcmV0dXJuIHZhbHVlIGFueXdheS4gRmF2b3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZHVsZS5leHBvcnRzIGFzc2lnbm1lbnQgb3ZlciBleHBvcnRzIG9iamVjdC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcC5pc0RlZmluZSAmJiBleHBvcnRzID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjanNNb2R1bGUgPSB0aGlzLm1vZHVsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2pzTW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSBjanNNb2R1bGUuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudXNpbmdFeHBvcnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZXhwb3J0cyBhbHJlYWR5IHNldCB0aGUgZGVmaW5lZCB2YWx1ZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IHRoaXMuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5yZXF1aXJlTWFwID0gdGhpcy5tYXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnJlcXVpcmVNb2R1bGVzID0gdGhpcy5tYXAuaXNEZWZpbmUgPyBbdGhpcy5tYXAuaWRdIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIucmVxdWlyZVR5cGUgPSB0aGlzLm1hcC5pc0RlZmluZSA/ICdkZWZpbmUnIDogJ3JlcXVpcmUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbkVycm9yKCh0aGlzLmVycm9yID0gZXJyKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9KdXN0IGEgbGl0ZXJhbCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IGZhY3Rvcnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwb3J0cyA9IGV4cG9ydHM7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXAuaXNEZWZpbmUgJiYgIXRoaXMuaWdub3JlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkW2lkXSA9IGV4cG9ydHM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS5vblJlc291cmNlTG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNMb2FkTWFwcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2godGhpcy5kZXBNYXBzLCBmdW5jdGlvbiAoZGVwTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0xvYWRNYXBzLnB1c2goZGVwTWFwLm5vcm1hbGl6ZWRNYXAgfHwgZGVwTWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEub25SZXNvdXJjZUxvYWQoY29udGV4dCwgdGhpcy5tYXAsIHJlc0xvYWRNYXBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9DbGVhbiB1cAogICAgICAgICAgICAgICAgICAgICAgICBjbGVhblJlZ2lzdHJ5KGlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvL0ZpbmlzaGVkIHRoZSBkZWZpbmUgc3RhZ2UuIEFsbG93IGNhbGxpbmcgY2hlY2sgYWdhaW4KICAgICAgICAgICAgICAgICAgICAvL3RvIGFsbG93IGRlZmluZSBub3RpZmljYXRpb25zIGJlbG93IGluIHRoZSBjYXNlIG9mIGEKICAgICAgICAgICAgICAgICAgICAvL2N5Y2xlLgogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5pbmcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmaW5lZCAmJiAhdGhpcy5kZWZpbmVFbWl0dGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lRW1pdHRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZGVmaW5lZCcsIHRoaXMuZXhwb3J0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lRW1pdENvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgY2FsbFBsdWdpbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMubWFwLAogICAgICAgICAgICAgICAgICAgIGlkID0gbWFwLmlkLAogICAgICAgICAgICAgICAgICAgIC8vTWFwIGFscmVhZHkgbm9ybWFsaXplZCB0aGUgcHJlZml4LgogICAgICAgICAgICAgICAgICAgIHBsdWdpbk1hcCA9IG1ha2VNb2R1bGVNYXAobWFwLnByZWZpeCk7CgogICAgICAgICAgICAgICAgLy9NYXJrIHRoaXMgYXMgYSBkZXBlbmRlbmN5IGZvciB0aGlzIHBsdWdpbiwgc28gaXQKICAgICAgICAgICAgICAgIC8vY2FuIGJlIHRyYWNlZCBmb3IgY3ljbGVzLgogICAgICAgICAgICAgICAgdGhpcy5kZXBNYXBzLnB1c2gocGx1Z2luTWFwKTsKCiAgICAgICAgICAgICAgICBvbihwbHVnaW5NYXAsICdkZWZpbmVkJywgYmluZCh0aGlzLCBmdW5jdGlvbiAocGx1Z2luKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWQsIG5vcm1hbGl6ZWRNYXAsIG5vcm1hbGl6ZWRNb2QsCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZUlkID0gZ2V0T3duKGJ1bmRsZXNNYXAsIHRoaXMubWFwLmlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHRoaXMubWFwLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5hbWUgPSB0aGlzLm1hcC5wYXJlbnRNYXAgPyB0aGlzLm1hcC5wYXJlbnRNYXAubmFtZSA6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsUmVxdWlyZSA9IGNvbnRleHQubWFrZVJlcXVpcmUobWFwLnBhcmVudE1hcCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlQnVpbGRDYWxsYmFjazogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy9JZiBjdXJyZW50IG1hcCBpcyBub3Qgbm9ybWFsaXplZCwgd2FpdCBmb3IgdGhhdAogICAgICAgICAgICAgICAgICAgIC8vbm9ybWFsaXplZCBuYW1lIHRvIGxvYWQgaW5zdGVhZCBvZiBjb250aW51aW5nLgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcC51bm5vcm1hbGl6ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9Ob3JtYWxpemUgdGhlIElEIGlmIHRoZSBwbHVnaW4gYWxsb3dzIGl0LgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGx1Z2luLm5vcm1hbGl6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBsdWdpbi5ub3JtYWxpemUobmFtZSwgZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplKG5hbWUsIHBhcmVudE5hbWUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJlZml4IGFuZCBuYW1lIHNob3VsZCBhbHJlYWR5IGJlIG5vcm1hbGl6ZWQsIG5vIG5lZWQKICAgICAgICAgICAgICAgICAgICAgICAgLy9mb3IgYXBwbHlpbmcgbWFwIGNvbmZpZyBhZ2FpbiBlaXRoZXIuCiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRNYXAgPSBtYWtlTW9kdWxlTWFwKG1hcC5wcmVmaXggKyAnIScgKyBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcC5wYXJlbnRNYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBvbihub3JtYWxpemVkTWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmluZWQnLCBiaW5kKHRoaXMsIGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwLm5vcm1hbGl6ZWRNYXAgPSBub3JtYWxpemVkTWFwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdChbXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsdWU7IH0sIG51bGwsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CgogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTW9kID0gZ2V0T3duKHJlZ2lzdHJ5LCBub3JtYWxpemVkTWFwLmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRNb2QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTWFyayB0aGlzIGFzIGEgZGVwZW5kZW5jeSBmb3IgdGhpcyBwbHVnaW4sIHNvIGl0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NhbiBiZSB0cmFjZWQgZm9yIGN5Y2xlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVwTWFwcy5wdXNoKG5vcm1hbGl6ZWRNYXApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmV2ZW50cy5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRNb2Qub24oJ2Vycm9yJywgYmluZCh0aGlzLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRNb2QuZW5hYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vSWYgYSBwYXRocyBjb25maWcsIHRoZW4ganVzdCBsb2FkIHRoYXQgZmlsZSBpbnN0ZWFkIHRvCiAgICAgICAgICAgICAgICAgICAgLy9yZXNvbHZlIHRoZSBwbHVnaW4sIGFzIGl0IGlzIGJ1aWx0IGludG8gdGhhdCBwYXRocyBsYXllci4KICAgICAgICAgICAgICAgICAgICBpZiAoYnVuZGxlSWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAudXJsID0gY29udGV4dC5uYW1lVG9VcmwoYnVuZGxlSWQpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbG9hZCA9IGJpbmQodGhpcywgZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdChbXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsdWU7IH0sIG51bGwsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIGxvYWQuZXJyb3IgPSBiaW5kKHRoaXMsIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gZXJyOwogICAgICAgICAgICAgICAgICAgICAgICBlcnIucmVxdWlyZU1vZHVsZXMgPSBbaWRdOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9SZW1vdmUgdGVtcCB1bm5vcm1hbGl6ZWQgbW9kdWxlcyBmb3IgdGhpcyBtb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2luY2UgdGhleSB3aWxsIG5ldmVyIGJlIHJlc29sdmVkIG90aGVyd2lzZSBub3cuCiAgICAgICAgICAgICAgICAgICAgICAgIGVhY2hQcm9wKHJlZ2lzdHJ5LCBmdW5jdGlvbiAobW9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kLm1hcC5pZC5pbmRleE9mKGlkICsgJ191bm5vcm1hbGl6ZWQnKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFuUmVnaXN0cnkobW9kLm1hcC5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvL0FsbG93IHBsdWdpbnMgdG8gbG9hZCBvdGhlciBjb2RlIHdpdGhvdXQgaGF2aW5nIHRvIGtub3cgdGhlCiAgICAgICAgICAgICAgICAgICAgLy9jb250ZXh0IG9yIGhvdyB0byAnY29tcGxldGUnIHRoZSBsb2FkLgogICAgICAgICAgICAgICAgICAgIGxvYWQuZnJvbVRleHQgPSBiaW5kKHRoaXMsIGZ1bmN0aW9uICh0ZXh0LCB0ZXh0QWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qanNsaW50IGV2aWw6IHRydWUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZHVsZU5hbWUgPSBtYXAubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZU1hcCA9IG1ha2VNb2R1bGVNYXAobW9kdWxlTmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNJbnRlcmFjdGl2ZSA9IHVzZUludGVyYWN0aXZlOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9BcyBvZiAyLjEuMCwgc3VwcG9ydCBqdXN0IHBhc3NpbmcgdGhlIHRleHQsIHRvIHJlaW5mb3JjZQogICAgICAgICAgICAgICAgICAgICAgICAvL2Zyb21UZXh0IG9ubHkgYmVpbmcgY2FsbGVkIG9uY2UgcGVyIHJlc291cmNlLiBTdGlsbAogICAgICAgICAgICAgICAgICAgICAgICAvL3N1cHBvcnQgb2xkIHN0eWxlIG9mIHBhc3NpbmcgbW9kdWxlTmFtZSBidXQgZGlzY2FyZAogICAgICAgICAgICAgICAgICAgICAgICAvL3RoYXQgbW9kdWxlTmFtZSBpbiBmYXZvciBvZiB0aGUgaW50ZXJuYWwgcmVmLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dEFsdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHRBbHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vVHVybiBvZmYgaW50ZXJhY3RpdmUgc2NyaXB0IG1hdGNoaW5nIGZvciBJRSBmb3IgYW55IGRlZmluZQogICAgICAgICAgICAgICAgICAgICAgICAvL2NhbGxzIGluIHRoZSB0ZXh0LCB0aGVuIHR1cm4gaXQgYmFjayBvbiBhdCB0aGUgZW5kLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzSW50ZXJhY3RpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUludGVyYWN0aXZlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJpbWUgdGhlIHN5c3RlbSBieSBjcmVhdGluZyBhIG1vZHVsZSBpbnN0YW5jZSBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgLy9pdC4KICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TW9kdWxlKG1vZHVsZU1hcCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvL1RyYW5zZmVyIGFueSBjb25maWcgdG8gdGhpcyBvdGhlciBtb2R1bGUuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNQcm9wKGNvbmZpZy5jb25maWcsIGlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNvbmZpZ1ttb2R1bGVOYW1lXSA9IGNvbmZpZy5jb25maWdbaWRdOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmV4ZWModGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbkVycm9yKG1ha2VFcnJvcignZnJvbXRleHRldmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb21UZXh0IGV2YWwgZm9yICcgKyBpZCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBmYWlsZWQ6ICcgKyBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNJbnRlcmFjdGl2ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlSW50ZXJhY3RpdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL01hcmsgdGhpcyBhcyBhIGRlcGVuZGVuY3kgZm9yIHRoZSBwbHVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXNvdXJjZQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcE1hcHMucHVzaChtb2R1bGVNYXApOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9TdXBwb3J0IGFub255bW91cyBtb2R1bGVzLgogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmNvbXBsZXRlTG9hZChtb2R1bGVOYW1lKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vQmluZCB0aGUgdmFsdWUgb2YgdGhhdCBtb2R1bGUgdG8gdGhlIHZhbHVlIGZvciB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVzb3VyY2UgSUQuCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsUmVxdWlyZShbbW9kdWxlTmFtZV0sIGxvYWQpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvL1VzZSBwYXJlbnROYW1lIGhlcmUgc2luY2UgdGhlIHBsdWdpbidzIG5hbWUgaXMgbm90IHJlbGlhYmxlLAogICAgICAgICAgICAgICAgICAgIC8vY291bGQgYmUgc29tZSB3ZWlyZCBzdHJpbmcgd2l0aCBubyBwYXRoIHRoYXQgYWN0dWFsbHkgd2FudHMgdG8KICAgICAgICAgICAgICAgICAgICAvL3JlZmVyZW5jZSB0aGUgcGFyZW50TmFtZSdzIHBhdGguCiAgICAgICAgICAgICAgICAgICAgcGx1Z2luLmxvYWQobWFwLm5hbWUsIGxvY2FsUmVxdWlyZSwgbG9hZCwgY29uZmlnKTsKICAgICAgICAgICAgICAgIH0pKTsKCiAgICAgICAgICAgICAgICBjb250ZXh0LmVuYWJsZShwbHVnaW5NYXAsIHRoaXMpOwogICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5NYXBzW3BsdWdpbk1hcC5pZF0gPSBwbHVnaW5NYXA7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGVuYWJsZWRSZWdpc3RyeVt0aGlzLm1hcC5pZF0gPSB0aGlzOwogICAgICAgICAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvL1NldCBmbGFnIG1lbnRpb25pbmcgdGhhdCB0aGUgbW9kdWxlIGlzIGVuYWJsaW5nLAogICAgICAgICAgICAgICAgLy9zbyB0aGF0IGltbWVkaWF0ZSBjYWxscyB0byB0aGUgZGVmaW5lZCBjYWxsYmFja3MKICAgICAgICAgICAgICAgIC8vZm9yIGRlcGVuZGVuY2llcyBkbyBub3QgdHJpZ2dlciBpbmFkdmVydGVudCBsb2FkCiAgICAgICAgICAgICAgICAvL3dpdGggdGhlIGRlcENvdW50IHN0aWxsIGJlaW5nIHplcm8uCiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsaW5nID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvL0VuYWJsZSBlYWNoIGRlcGVuZGVuY3kKICAgICAgICAgICAgICAgIGVhY2godGhpcy5kZXBNYXBzLCBiaW5kKHRoaXMsIGZ1bmN0aW9uIChkZXBNYXAsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWQsIG1vZCwgaGFuZGxlcjsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXBNYXAgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vRGVwZW5kZW5jeSBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBkZXBNYXAKICAgICAgICAgICAgICAgICAgICAgICAgLy9hbmQgd2lyZWQgdXAgdG8gdGhpcyBtb2R1bGUuCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcE1hcCA9IG1ha2VNb2R1bGVNYXAoZGVwTWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLm1hcC5pc0RlZmluZSA/IHRoaXMubWFwIDogdGhpcy5tYXAucGFyZW50TWFwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5za2lwTWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBNYXBzW2ldID0gZGVwTWFwOwoKICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IGdldE93bihoYW5kbGVycywgZGVwTWFwLmlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcEV4cG9ydHNbaV0gPSBoYW5kbGVyKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcENvdW50ICs9IDE7CgogICAgICAgICAgICAgICAgICAgICAgICBvbihkZXBNYXAsICdkZWZpbmVkJywgYmluZCh0aGlzLCBmdW5jdGlvbiAoZGVwRXhwb3J0cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudW5kZWZlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lRGVwKGksIGRlcEV4cG9ydHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVjaygpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lcnJiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbihkZXBNYXAsICdlcnJvcicsIGJpbmQodGhpcywgdGhpcy5lcnJiYWNrKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ldmVudHMuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGRpcmVjdCBlcnJiYWNrIG9uIHRoaXMgbW9kdWxlLCBidXQgc29tZXRoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIGlzIGxpc3RlbmluZyBmb3IgZXJyb3JzLCBzbyBiZSBzdXJlIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9wYWdhdGUgdGhlIGVycm9yIGNvcnJlY3RseS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uKGRlcE1hcCwgJ2Vycm9yJywgYmluZCh0aGlzLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWQgPSBkZXBNYXAuaWQ7CiAgICAgICAgICAgICAgICAgICAgbW9kID0gcmVnaXN0cnlbaWRdOwoKICAgICAgICAgICAgICAgICAgICAvL1NraXAgc3BlY2lhbCBtb2R1bGVzIGxpa2UgJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnCiAgICAgICAgICAgICAgICAgICAgLy9BbHNvLCBkb24ndCBjYWxsIGVuYWJsZSBpZiBpdCBpcyBhbHJlYWR5IGVuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgLy9pbXBvcnRhbnQgaW4gY2lyY3VsYXIgZGVwZW5kZW5jeSBjYXNlcy4KICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AoaGFuZGxlcnMsIGlkKSAmJiBtb2QgJiYgIW1vZC5lbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZW5hYmxlKGRlcE1hcCwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwoKICAgICAgICAgICAgICAgIC8vRW5hYmxlIGVhY2ggcGx1Z2luIHRoYXQgaXMgdXNlZCBpbgogICAgICAgICAgICAgICAgLy9hIGRlcGVuZGVuY3kKICAgICAgICAgICAgICAgIGVhY2hQcm9wKHRoaXMucGx1Z2luTWFwcywgYmluZCh0aGlzLCBmdW5jdGlvbiAocGx1Z2luTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZCA9IGdldE93bihyZWdpc3RyeSwgcGx1Z2luTWFwLmlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kICYmICFtb2QuZW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVuYWJsZShwbHVnaW5NYXAsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKCiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsaW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgdGhpcy5jaGVjaygpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgb246IGZ1bmN0aW9uIChuYW1lLCBjYikgewogICAgICAgICAgICAgICAgdmFyIGNicyA9IHRoaXMuZXZlbnRzW25hbWVdOwogICAgICAgICAgICAgICAgaWYgKCFjYnMpIHsKICAgICAgICAgICAgICAgICAgICBjYnMgPSB0aGlzLmV2ZW50c1tuYW1lXSA9IFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2JzLnB1c2goY2IpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZW1pdDogZnVuY3Rpb24gKG5hbWUsIGV2dCkgewogICAgICAgICAgICAgICAgZWFjaCh0aGlzLmV2ZW50c1tuYW1lXSwgZnVuY3Rpb24gKGNiKSB7CiAgICAgICAgICAgICAgICAgICAgY2IoZXZ0KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdlcnJvcicpIHsKICAgICAgICAgICAgICAgICAgICAvL05vdyB0aGF0IHRoZSBlcnJvciBoYW5kbGVyIHdhcyB0cmlnZ2VyZWQsIHJlbW92ZQogICAgICAgICAgICAgICAgICAgIC8vdGhlIGxpc3RlbmVycywgc2luY2UgdGhpcyBicm9rZW4gTW9kdWxlIGluc3RhbmNlCiAgICAgICAgICAgICAgICAgICAgLy9jYW4gc3RheSBhcm91bmQgZm9yIGEgd2hpbGUgaW4gdGhlIHJlZ2lzdHJ5LgogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmV2ZW50c1tuYW1lXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIGNhbGxHZXRNb2R1bGUoYXJncykgewogICAgICAgICAgICAvL1NraXAgbW9kdWxlcyBhbHJlYWR5IGRlZmluZWQuCiAgICAgICAgICAgIGlmICghaGFzUHJvcChkZWZpbmVkLCBhcmdzWzBdKSkgewogICAgICAgICAgICAgICAgZ2V0TW9kdWxlKG1ha2VNb2R1bGVNYXAoYXJnc1swXSwgbnVsbCwgdHJ1ZSkpLmluaXQoYXJnc1sxXSwgYXJnc1syXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKG5vZGUsIGZ1bmMsIG5hbWUsIGllTmFtZSkgewogICAgICAgICAgICAvL0Zhdm9yIGRldGFjaEV2ZW50IGJlY2F1c2Ugb2YgSUU5CiAgICAgICAgICAgIC8vaXNzdWUsIHNlZSBhdHRhY2hFdmVudC9hZGRFdmVudExpc3RlbmVyIGNvbW1lbnQgZWxzZXdoZXJlCiAgICAgICAgICAgIC8vaW4gdGhpcyBmaWxlLgogICAgICAgICAgICBpZiAobm9kZS5kZXRhY2hFdmVudCAmJiAhaXNPcGVyYSkgewogICAgICAgICAgICAgICAgLy9Qcm9iYWJseSBJRS4gSWYgbm90IGl0IHdpbGwgdGhyb3cgYW4gZXJyb3IsIHdoaWNoIHdpbGwgYmUKICAgICAgICAgICAgICAgIC8vdXNlZnVsIHRvIGtub3cuCiAgICAgICAgICAgICAgICBpZiAoaWVOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgbm9kZS5kZXRhY2hFdmVudChpZU5hbWUsIGZ1bmMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGZ1bmMsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogR2l2ZW4gYW4gZXZlbnQgZnJvbSBhIHNjcmlwdCBub2RlLCBnZXQgdGhlIHJlcXVpcmVqcyBpbmZvIGZyb20gaXQsCiAgICAgICAgICogYW5kIHRoZW4gcmVtb3ZlcyB0aGUgZXZlbnQgbGlzdGVuZXJzIG9uIHRoZSBub2RlLgogICAgICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2dAogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0U2NyaXB0RGF0YShldnQpIHsKICAgICAgICAgICAgLy9Vc2luZyBjdXJyZW50VGFyZ2V0IGluc3RlYWQgb2YgdGFyZ2V0IGZvciBGaXJlZm94IDIuMCdzIHNha2UuIE5vdAogICAgICAgICAgICAvL2FsbCBvbGQgYnJvd3NlcnMgd2lsbCBiZSBzdXBwb3J0ZWQsIGJ1dCB0aGlzIG9uZSB3YXMgZWFzeSBlbm91Z2gKICAgICAgICAgICAgLy90byBzdXBwb3J0IGFuZCBzdGlsbCBtYWtlcyBzZW5zZS4KICAgICAgICAgICAgdmFyIG5vZGUgPSBldnQuY3VycmVudFRhcmdldCB8fCBldnQuc3JjRWxlbWVudDsKCiAgICAgICAgICAgIC8vUmVtb3ZlIHRoZSBsaXN0ZW5lcnMgb25jZSBoZXJlLgogICAgICAgICAgICByZW1vdmVMaXN0ZW5lcihub2RlLCBjb250ZXh0Lm9uU2NyaXB0TG9hZCwgJ2xvYWQnLCAnb25yZWFkeXN0YXRlY2hhbmdlJyk7CiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKG5vZGUsIGNvbnRleHQub25TY3JpcHRFcnJvciwgJ2Vycm9yJyk7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbm9kZTogbm9kZSwKICAgICAgICAgICAgICAgIGlkOiBub2RlICYmIG5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXJlcXVpcmVtb2R1bGUnKQogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaW50YWtlRGVmaW5lcygpIHsKICAgICAgICAgICAgdmFyIGFyZ3M7CgogICAgICAgICAgICAvL0FueSBkZWZpbmVkIG1vZHVsZXMgaW4gdGhlIGdsb2JhbCBxdWV1ZSwgaW50YWtlIHRoZW0gbm93LgogICAgICAgICAgICB0YWtlR2xvYmFsUXVldWUoKTsKCiAgICAgICAgICAgIC8vTWFrZSBzdXJlIGFueSByZW1haW5pbmcgZGVmUXVldWUgaXRlbXMgZ2V0IHByb3Blcmx5IHByb2Nlc3NlZC4KICAgICAgICAgICAgd2hpbGUgKGRlZlF1ZXVlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgYXJncyA9IGRlZlF1ZXVlLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBpZiAoYXJnc1swXSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvbkVycm9yKG1ha2VFcnJvcignbWlzbWF0Y2gnLCAnTWlzbWF0Y2hlZCBhbm9ueW1vdXMgZGVmaW5lKCkgbW9kdWxlOiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1thcmdzLmxlbmd0aCAtIDFdKSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vYXJncyBhcmUgaWQsIGRlcHMsIGZhY3RvcnkuIFNob3VsZCBiZSBub3JtYWxpemVkIGJ5IHRoZQogICAgICAgICAgICAgICAgICAgIC8vZGVmaW5lKCkgZnVuY3Rpb24uCiAgICAgICAgICAgICAgICAgICAgY2FsbEdldE1vZHVsZShhcmdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjb250ZXh0LmRlZlF1ZXVlTWFwID0ge307CiAgICAgICAgfQoKICAgICAgICBjb250ZXh0ID0gewogICAgICAgICAgICBjb25maWc6IGNvbmZpZywKICAgICAgICAgICAgY29udGV4dE5hbWU6IGNvbnRleHROYW1lLAogICAgICAgICAgICByZWdpc3RyeTogcmVnaXN0cnksCiAgICAgICAgICAgIGRlZmluZWQ6IGRlZmluZWQsCiAgICAgICAgICAgIHVybEZldGNoZWQ6IHVybEZldGNoZWQsCiAgICAgICAgICAgIGRlZlF1ZXVlOiBkZWZRdWV1ZSwKICAgICAgICAgICAgZGVmUXVldWVNYXA6IHt9LAogICAgICAgICAgICBNb2R1bGU6IE1vZHVsZSwKICAgICAgICAgICAgbWFrZU1vZHVsZU1hcDogbWFrZU1vZHVsZU1hcCwKICAgICAgICAgICAgbmV4dFRpY2s6IHJlcS5uZXh0VGljaywKICAgICAgICAgICAgb25FcnJvcjogb25FcnJvciwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTZXQgYSBjb25maWd1cmF0aW9uIGZvciB0aGUgY29udGV4dC4KICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyBjb25maWcgb2JqZWN0IHRvIGludGVncmF0ZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNvbmZpZ3VyZTogZnVuY3Rpb24gKGNmZykgewogICAgICAgICAgICAgICAgLy9NYWtlIHN1cmUgdGhlIGJhc2VVcmwgZW5kcyBpbiBhIHNsYXNoLgogICAgICAgICAgICAgICAgaWYgKGNmZy5iYXNlVXJsKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNmZy5iYXNlVXJsLmNoYXJBdChjZmcuYmFzZVVybC5sZW5ndGggLSAxKSAhPT0gJy8nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNmZy5iYXNlVXJsICs9ICcvJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gQ29udmVydCBvbGQgc3R5bGUgdXJsQXJncyBzdHJpbmcgdG8gYSBmdW5jdGlvbi4KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2ZnLnVybEFyZ3MgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVybEFyZ3MgPSBjZmcudXJsQXJnczsKICAgICAgICAgICAgICAgICAgICBjZmcudXJsQXJncyA9IGZ1bmN0aW9uKGlkLCB1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyB1cmxBcmdzOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9TYXZlIG9mZiB0aGUgcGF0aHMgc2luY2UgdGhleSByZXF1aXJlIHNwZWNpYWwgcHJvY2Vzc2luZywKICAgICAgICAgICAgICAgIC8vdGhleSBhcmUgYWRkaXRpdmUuCiAgICAgICAgICAgICAgICB2YXIgc2hpbSA9IGNvbmZpZy5zaGltLAogICAgICAgICAgICAgICAgICAgIG9ianMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVzOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcDogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgZWFjaFByb3AoY2ZnLCBmdW5jdGlvbiAodmFsdWUsIHByb3ApIHsKICAgICAgICAgICAgICAgICAgICBpZiAob2Jqc1twcm9wXSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ1twcm9wXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnW3Byb3BdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbWl4aW4oY29uZmlnW3Byb3BdLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnW3Byb3BdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy9SZXZlcnNlIG1hcCB0aGUgYnVuZGxlcwogICAgICAgICAgICAgICAgaWYgKGNmZy5idW5kbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZWFjaFByb3AoY2ZnLmJ1bmRsZXMsIGZ1bmN0aW9uICh2YWx1ZSwgcHJvcCkgewogICAgICAgICAgICAgICAgICAgICAgICBlYWNoKHZhbHVlLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgIT09IHByb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVzTWFwW3ZdID0gcHJvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9NZXJnZSBzaGltCiAgICAgICAgICAgICAgICBpZiAoY2ZnLnNoaW0pIHsKICAgICAgICAgICAgICAgICAgICBlYWNoUHJvcChjZmcuc2hpbSwgZnVuY3Rpb24gKHZhbHVlLCBpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAvL05vcm1hbGl6ZSB0aGUgc3RydWN0dXJlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwczogdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2YWx1ZS5leHBvcnRzIHx8IHZhbHVlLmluaXQpICYmICF2YWx1ZS5leHBvcnRzRm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmV4cG9ydHNGbiA9IGNvbnRleHQubWFrZVNoaW1FeHBvcnRzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzaGltW2lkXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zaGltID0gc2hpbTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL0FkanVzdCBwYWNrYWdlcyBpZiBuZWNlc3NhcnkuCiAgICAgICAgICAgICAgICBpZiAoY2ZnLnBhY2thZ2VzKSB7CiAgICAgICAgICAgICAgICAgICAgZWFjaChjZmcucGFja2FnZXMsIGZ1bmN0aW9uIChwa2dPYmopIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uLCBuYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgcGtnT2JqID0gdHlwZW9mIHBrZ09iaiA9PT0gJ3N0cmluZycgPyB7bmFtZTogcGtnT2JqfSA6IHBrZ09iajsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwa2dPYmoubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gPSBwa2dPYmoubG9jYXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnBhdGhzW25hbWVdID0gcGtnT2JqLmxvY2F0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL1NhdmUgcG9pbnRlciB0byBtYWluIG1vZHVsZSBJRCBmb3IgcGtnIG5hbWUuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVtb3ZlIGxlYWRpbmcgZG90IGluIG1haW4sIHNvIG1haW4gcGF0aHMgYXJlIG5vcm1hbGl6ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vYW5kIHJlbW92ZSBhbnkgdHJhaWxpbmcgLmpzLCBzaW5jZSBkaWZmZXJlbnQgcGFja2FnZQogICAgICAgICAgICAgICAgICAgICAgICAvL2VudnMgaGF2ZSBkaWZmZXJlbnQgY29udmVudGlvbnM6IHNvbWUgdXNlIGEgbW9kdWxlIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vc29tZSB1c2UgYSBmaWxlIG5hbWUuCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5wa2dzW25hbWVdID0gcGtnT2JqLm5hbWUgKyAnLycgKyAocGtnT2JqLm1haW4gfHwgJ21haW4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoY3VyckRpclJlZ0V4cCwgJycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShqc1N1ZmZpeFJlZ0V4cCwgJycpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vSWYgdGhlcmUgYXJlIGFueSAid2FpdGluZyB0byBleGVjdXRlIiBtb2R1bGVzIGluIHRoZSByZWdpc3RyeSwKICAgICAgICAgICAgICAgIC8vdXBkYXRlIHRoZSBtYXBzIGZvciB0aGVtLCBzaW5jZSB0aGVpciBpbmZvLCBsaWtlIFVSTHMgdG8gbG9hZCwKICAgICAgICAgICAgICAgIC8vbWF5IGhhdmUgY2hhbmdlZC4KICAgICAgICAgICAgICAgIGVhY2hQcm9wKHJlZ2lzdHJ5LCBmdW5jdGlvbiAobW9kLCBpZCkgewogICAgICAgICAgICAgICAgICAgIC8vSWYgbW9kdWxlIGFscmVhZHkgaGFzIGluaXQgY2FsbGVkLCBzaW5jZSBpdCBpcyB0b28KICAgICAgICAgICAgICAgICAgICAvL2xhdGUgdG8gbW9kaWZ5IHRoZW0sIGFuZCBpZ25vcmUgdW5ub3JtYWxpemVkIG9uZXMKICAgICAgICAgICAgICAgICAgICAvL3NpbmNlIHRoZXkgYXJlIHRyYW5zaWVudC4KICAgICAgICAgICAgICAgICAgICBpZiAoIW1vZC5pbml0ZWQgJiYgIW1vZC5tYXAudW5ub3JtYWxpemVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZC5tYXAgPSBtYWtlTW9kdWxlTWFwKGlkLCBudWxsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvL0lmIGEgZGVwcyBhcnJheSBvciBhIGNvbmZpZyBjYWxsYmFjayBpcyBzcGVjaWZpZWQsIHRoZW4gY2FsbAogICAgICAgICAgICAgICAgLy9yZXF1aXJlIHdpdGggdGhvc2UgYXJncy4gVGhpcyBpcyB1c2VmdWwgd2hlbiByZXF1aXJlIGlzIGRlZmluZWQgYXMgYQogICAgICAgICAgICAgICAgLy9jb25maWcgb2JqZWN0IGJlZm9yZSByZXF1aXJlLmpzIGlzIGxvYWRlZC4KICAgICAgICAgICAgICAgIGlmIChjZmcuZGVwcyB8fCBjZmcuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlcXVpcmUoY2ZnLmRlcHMgfHwgW10sIGNmZy5jYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBtYWtlU2hpbUV4cG9ydHM6IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgZnVuY3Rpb24gZm4oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldDsKICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5pdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB2YWx1ZS5pbml0LmFwcGx5KGdsb2JhbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldCB8fCAodmFsdWUuZXhwb3J0cyAmJiBnZXRHbG9iYWwodmFsdWUuZXhwb3J0cykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZuOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgbWFrZVJlcXVpcmU6IGZ1bmN0aW9uIChyZWxNYXAsIG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxvY2FsUmVxdWlyZShkZXBzLCBjYWxsYmFjaywgZXJyYmFjaykgewogICAgICAgICAgICAgICAgICAgIHZhciBpZCwgbWFwLCByZXF1aXJlTW9kOwoKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5lbmFibGVCdWlsZENhbGxiYWNrICYmIGNhbGxiYWNrICYmIGlzRnVuY3Rpb24oY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLl9fcmVxdWlyZUpzQnVpbGQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXBzID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihjYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSW52YWxpZCBjYWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ3JlcXVpcmVhcmdzJywgJ0ludmFsaWQgcmVxdWlyZSBjYWxsJyksIGVycmJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHJlcXVpcmV8ZXhwb3J0c3xtb2R1bGUgYXJlIHJlcXVlc3RlZCwgZ2V0IHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvL3ZhbHVlIGZvciB0aGVtIGZyb20gdGhlIHNwZWNpYWwgaGFuZGxlcnMuIENhdmVhdDoKICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIG9ubHkgd29ya3Mgd2hpbGUgbW9kdWxlIGlzIGJlaW5nIGRlZmluZWQuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxNYXAgJiYgaGFzUHJvcChoYW5kbGVycywgZGVwcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyc1tkZXBzXShyZWdpc3RyeVtyZWxNYXAuaWRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9TeW5jaHJvbm91cyBhY2Nlc3MgdG8gb25lIG1vZHVsZS4gSWYgcmVxdWlyZS5nZXQgaXMKICAgICAgICAgICAgICAgICAgICAgICAgLy9hdmFpbGFibGUgKGFzIGluIHRoZSBOb2RlIGFkYXB0ZXIpLCBwcmVmZXIgdGhhdC4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS5nZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXEuZ2V0KGNvbnRleHQsIGRlcHMsIHJlbE1hcCwgbG9jYWxSZXF1aXJlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9Ob3JtYWxpemUgbW9kdWxlIG5hbWUsIGlmIGl0IGNvbnRhaW5zIC4gb3IgLi4KICAgICAgICAgICAgICAgICAgICAgICAgbWFwID0gbWFrZU1vZHVsZU1hcChkZXBzLCByZWxNYXAsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSBtYXAuaWQ7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AoZGVmaW5lZCwgaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ25vdGxvYWRlZCcsICdNb2R1bGUgbmFtZSAiJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIiBoYXMgbm90IGJlZW4gbG9hZGVkIHlldCBmb3IgY29udGV4dDogJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0TmFtZSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVsTWFwID8gJycgOiAnLiBVc2UgcmVxdWlyZShbXSknKSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbmVkW2lkXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vR3JhYiBkZWZpbmVzIHdhaXRpbmcgaW4gdGhlIGdsb2JhbCBxdWV1ZS4KICAgICAgICAgICAgICAgICAgICBpbnRha2VEZWZpbmVzKCk7CgogICAgICAgICAgICAgICAgICAgIC8vTWFyayBhbGwgdGhlIGRlcGVuZGVuY2llcyBhcyBuZWVkaW5nIHRvIGJlIGxvYWRlZC4KICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lm5leHRUaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9Tb21lIGRlZmluZXMgY291bGQgaGF2ZSBiZWVuIGFkZGVkIHNpbmNlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvL3JlcXVpcmUgY2FsbCwgY29sbGVjdCB0aGVtLgogICAgICAgICAgICAgICAgICAgICAgICBpbnRha2VEZWZpbmVzKCk7CgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlTW9kID0gZ2V0TW9kdWxlKG1ha2VNb2R1bGVNYXAobnVsbCwgcmVsTWFwKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvL1N0b3JlIGlmIG1hcCBjb25maWcgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhpcyByZXF1aXJlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vY2FsbCBmb3IgZGVwZW5kZW5jaWVzLgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlTW9kLnNraXBNYXAgPSBvcHRpb25zLnNraXBNYXA7CgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlTW9kLmluaXQoZGVwcywgY2FsbGJhY2ssIGVycmJhY2ssIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWRlZCgpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxSZXF1aXJlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG1peGluKGxvY2FsUmVxdWlyZSwgewogICAgICAgICAgICAgICAgICAgIGlzQnJvd3NlcjogaXNCcm93c2VyLAoKICAgICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAgICAgKiBDb252ZXJ0cyBhIG1vZHVsZSBuYW1lICsgLmV4dGVuc2lvbiBpbnRvIGFuIFVSTCBwYXRoLgogICAgICAgICAgICAgICAgICAgICAqICpSZXF1aXJlcyogdGhlIHVzZSBvZiBhIG1vZHVsZSBuYW1lLiBJdCBkb2VzIG5vdCBzdXBwb3J0IHVzaW5nCiAgICAgICAgICAgICAgICAgICAgICogcGxhaW4gVVJMcyBsaWtlIG5hbWVUb1VybC4KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICB0b1VybDogZnVuY3Rpb24gKG1vZHVsZU5hbWVQbHVzRXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IG1vZHVsZU5hbWVQbHVzRXh0Lmxhc3RJbmRleE9mKCcuJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50ID0gbW9kdWxlTmFtZVBsdXNFeHQuc3BsaXQoJy8nKVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVsYXRpdmUgPSBzZWdtZW50ID09PSAnLicgfHwgc2VnbWVudCA9PT0gJy4uJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vSGF2ZSBhIGZpbGUgZXh0ZW5zaW9uIGFsaWFzLCBhbmQgaXQgaXMgbm90IHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvL2RvdHMgZnJvbSBhIHJlbGF0aXZlIHBhdGguCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEgJiYgKCFpc1JlbGF0aXZlIHx8IGluZGV4ID4gMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dCA9IG1vZHVsZU5hbWVQbHVzRXh0LnN1YnN0cmluZyhpbmRleCwgbW9kdWxlTmFtZVBsdXNFeHQubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZU5hbWVQbHVzRXh0ID0gbW9kdWxlTmFtZVBsdXNFeHQuc3Vic3RyaW5nKDAsIGluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQubmFtZVRvVXJsKG5vcm1hbGl6ZShtb2R1bGVOYW1lUGx1c0V4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsTWFwICYmIHJlbE1hcC5pZCwgdHJ1ZSksIGV4dCwgIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgIGRlZmluZWQ6IGZ1bmN0aW9uIChpZCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJvcChkZWZpbmVkLCBtYWtlTW9kdWxlTWFwKGlkLCByZWxNYXAsIGZhbHNlLCB0cnVlKS5pZCk7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkOiBmdW5jdGlvbiAoaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSBtYWtlTW9kdWxlTWFwKGlkLCByZWxNYXAsIGZhbHNlLCB0cnVlKS5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc1Byb3AoZGVmaW5lZCwgaWQpIHx8IGhhc1Byb3AocmVnaXN0cnksIGlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvL09ubHkgYWxsb3cgdW5kZWYgb24gdG9wIGxldmVsIHJlcXVpcmUgY2FsbHMKICAgICAgICAgICAgICAgIGlmICghcmVsTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYWxSZXF1aXJlLnVuZGVmID0gZnVuY3Rpb24gKGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vQmluZCBhbnkgd2FpdGluZyBkZWZpbmUoKSBjYWxscyB0byB0aGlzIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZml4IGZvciAjNDA4CiAgICAgICAgICAgICAgICAgICAgICAgIHRha2VHbG9iYWxRdWV1ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcCA9IG1ha2VNb2R1bGVNYXAoaWQsIHJlbE1hcCwgdHJ1ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2QgPSBnZXRPd24ocmVnaXN0cnksIGlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZC51bmRlZmVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlU2NyaXB0KGlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkZWZpbmVkW2lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHVybEZldGNoZWRbbWFwLnVybF07CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB1bmRlZkV2ZW50c1tpZF07CgogICAgICAgICAgICAgICAgICAgICAgICAvL0NsZWFuIHF1ZXVlZCBkZWZpbmVzIHRvby4gR28gYmFja3dhcmRzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vaW4gYXJyYXkgc28gdGhhdCB0aGUgc3BsaWNlcyBkbyBub3QKICAgICAgICAgICAgICAgICAgICAgICAgLy9tZXNzIHVwIHRoZSBpdGVyYXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgIGVhY2hSZXZlcnNlKGRlZlF1ZXVlLCBmdW5jdGlvbihhcmdzLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1swXSA9PT0gaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZRdWV1ZS5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgY29udGV4dC5kZWZRdWV1ZU1hcFtpZF07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0hvbGQgb24gdG8gbGlzdGVuZXJzIGluIGNhc2UgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21vZHVsZSB3aWxsIGJlIGF0dGVtcHRlZCB0byBiZSByZWxvYWRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91c2luZyBhIGRpZmZlcmVudCBjb25maWcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kLmV2ZW50cy5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZFdmVudHNbaWRdID0gbW9kLmV2ZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhblJlZ2lzdHJ5KGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsUmVxdWlyZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgdG8gZW5hYmxlIGEgbW9kdWxlIGlmIGl0IGlzIHN0aWxsIGluIHRoZSByZWdpc3RyeQogICAgICAgICAgICAgKiBhd2FpdGluZyBlbmFibGVtZW50LiBBIHNlY29uZCBhcmcsIHBhcmVudCwgdGhlIHBhcmVudCBtb2R1bGUsCiAgICAgICAgICAgICAqIGlzIHBhc3NlZCBpbiBmb3IgY29udGV4dCwgd2hlbiB0aGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5CiAgICAgICAgICAgICAqIHRoZSBvcHRpbWl6ZXIuIE5vdCBzaG93biBoZXJlIHRvIGtlZXAgY29kZSBjb21wYWN0LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZW5hYmxlOiBmdW5jdGlvbiAoZGVwTWFwKSB7CiAgICAgICAgICAgICAgICB2YXIgbW9kID0gZ2V0T3duKHJlZ2lzdHJ5LCBkZXBNYXAuaWQpOwogICAgICAgICAgICAgICAgaWYgKG1vZCkgewogICAgICAgICAgICAgICAgICAgIGdldE1vZHVsZShkZXBNYXApLmVuYWJsZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEludGVybmFsIG1ldGhvZCB1c2VkIGJ5IGVudmlyb25tZW50IGFkYXB0ZXJzIHRvIGNvbXBsZXRlIGEgbG9hZCBldmVudC4KICAgICAgICAgICAgICogQSBsb2FkIGV2ZW50IGNvdWxkIGJlIGEgc2NyaXB0IGxvYWQgb3IganVzdCBhIGxvYWQgcGFzcyBmcm9tIGEgc3luY2hyb25vdXMKICAgICAgICAgICAgICogbG9hZCBjYWxsLgogICAgICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIHBvdGVudGlhbGx5IGNvbXBsZXRlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY29tcGxldGVMb2FkOiBmdW5jdGlvbiAobW9kdWxlTmFtZSkgewogICAgICAgICAgICAgICAgdmFyIGZvdW5kLCBhcmdzLCBtb2QsCiAgICAgICAgICAgICAgICAgICAgc2hpbSA9IGdldE93bihjb25maWcuc2hpbSwgbW9kdWxlTmFtZSkgfHwge30sCiAgICAgICAgICAgICAgICAgICAgc2hFeHBvcnRzID0gc2hpbS5leHBvcnRzOwoKICAgICAgICAgICAgICAgIHRha2VHbG9iYWxRdWV1ZSgpOwoKICAgICAgICAgICAgICAgIHdoaWxlIChkZWZRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBhcmdzID0gZGVmUXVldWUuc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1swXSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzBdID0gbW9kdWxlTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiBhbHJlYWR5IGZvdW5kIGFuIGFub255bW91cyBtb2R1bGUgYW5kIGJvdW5kIGl0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdG8gdGhpcyBuYW1lLCB0aGVuIHRoaXMgaXMgc29tZSBvdGhlciBhbm9uIG1vZHVsZQogICAgICAgICAgICAgICAgICAgICAgICAvL3dhaXRpbmcgZm9yIGl0cyBjb21wbGV0ZUxvYWQgdG8gZmlyZS4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzWzBdID09PSBtb2R1bGVOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vRm91bmQgbWF0Y2hpbmcgZGVmaW5lIGNhbGwgZm9yIHRoaXMgc2NyaXB0IQogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjYWxsR2V0TW9kdWxlKGFyZ3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGV4dC5kZWZRdWV1ZU1hcCA9IHt9OwoKICAgICAgICAgICAgICAgIC8vRG8gdGhpcyBhZnRlciB0aGUgY3ljbGUgb2YgY2FsbEdldE1vZHVsZSBpbiBjYXNlIHRoZSByZXN1bHQKICAgICAgICAgICAgICAgIC8vb2YgdGhvc2UgY2FsbHMvaW5pdCBjYWxscyBjaGFuZ2VzIHRoZSByZWdpc3RyeS4KICAgICAgICAgICAgICAgIG1vZCA9IGdldE93bihyZWdpc3RyeSwgbW9kdWxlTmFtZSk7CgogICAgICAgICAgICAgICAgaWYgKCFmb3VuZCAmJiAhaGFzUHJvcChkZWZpbmVkLCBtb2R1bGVOYW1lKSAmJiBtb2QgJiYgIW1vZC5pbml0ZWQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmVuZm9yY2VEZWZpbmUgJiYgKCFzaEV4cG9ydHMgfHwgIWdldEdsb2JhbChzaEV4cG9ydHMpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUGF0aEZhbGxiYWNrKG1vZHVsZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ25vZGVmaW5lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vIGRlZmluZSBjYWxsIGZvciAnICsgbW9kdWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZHVsZU5hbWVdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvL0Egc2NyaXB0IHRoYXQgZG9lcyBub3QgY2FsbCBkZWZpbmUoKSwgc28ganVzdCBzaW11bGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAvL3RoZSBjYWxsIGZvciBpdC4KICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEdldE1vZHVsZShbbW9kdWxlTmFtZSwgKHNoaW0uZGVwcyB8fCBbXSksIHNoaW0uZXhwb3J0c0ZuXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNoZWNrTG9hZGVkKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ29udmVydHMgYSBtb2R1bGUgbmFtZSB0byBhIGZpbGUgcGF0aC4gU3VwcG9ydHMgY2FzZXMgd2hlcmUKICAgICAgICAgICAgICogbW9kdWxlTmFtZSBtYXkgYWN0dWFsbHkgYmUganVzdCBhbiBVUkwuCiAgICAgICAgICAgICAqIE5vdGUgdGhhdCBpdCAqKmRvZXMgbm90KiogY2FsbCBub3JtYWxpemUgb24gdGhlIG1vZHVsZU5hbWUsCiAgICAgICAgICAgICAqIGl0IGlzIGFzc3VtZWQgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gbm9ybWFsaXplZC4gVGhpcyBpcyBhbgogICAgICAgICAgICAgKiBpbnRlcm5hbCBBUEksIG5vdCBhIHB1YmxpYyBvbmUuIFVzZSB0b1VybCBmb3IgdGhlIHB1YmxpYyBBUEkuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBuYW1lVG9Vcmw6IGZ1bmN0aW9uIChtb2R1bGVOYW1lLCBleHQsIHNraXBFeHQpIHsKICAgICAgICAgICAgICAgIHZhciBwYXRocywgc3ltcywgaSwgcGFyZW50TW9kdWxlLCB1cmwsCiAgICAgICAgICAgICAgICAgICAgcGFyZW50UGF0aCwgYnVuZGxlSWQsCiAgICAgICAgICAgICAgICAgICAgcGtnTWFpbiA9IGdldE93bihjb25maWcucGtncywgbW9kdWxlTmFtZSk7CgogICAgICAgICAgICAgICAgaWYgKHBrZ01haW4pIHsKICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lID0gcGtnTWFpbjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBidW5kbGVJZCA9IGdldE93bihidW5kbGVzTWFwLCBtb2R1bGVOYW1lKTsKCiAgICAgICAgICAgICAgICBpZiAoYnVuZGxlSWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5uYW1lVG9VcmwoYnVuZGxlSWQsIGV4dCwgc2tpcEV4dCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9JZiBhIGNvbG9uIGlzIGluIHRoZSBVUkwsIGl0IGluZGljYXRlcyBhIHByb3RvY29sIGlzIHVzZWQgYW5kIGl0IGlzIGp1c3QKICAgICAgICAgICAgICAgIC8vYW4gVVJMIHRvIGEgZmlsZSwgb3IgaWYgaXQgc3RhcnRzIHdpdGggYSBzbGFzaCwgY29udGFpbnMgYSBxdWVyeSBhcmcgKGkuZS4gPykKICAgICAgICAgICAgICAgIC8vb3IgZW5kcyB3aXRoIC5qcywgdGhlbiBhc3N1bWUgdGhlIHVzZXIgbWVhbnQgdG8gdXNlIGFuIHVybCBhbmQgbm90IGEgbW9kdWxlIGlkLgogICAgICAgICAgICAgICAgLy9UaGUgc2xhc2ggaXMgaW1wb3J0YW50IGZvciBwcm90b2NvbC1sZXNzIFVSTHMgYXMgd2VsbCBhcyBmdWxsIHBhdGhzLgogICAgICAgICAgICAgICAgaWYgKHJlcS5qc0V4dFJlZ0V4cC50ZXN0KG1vZHVsZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgLy9KdXN0IGEgcGxhaW4gcGF0aCwgbm90IG1vZHVsZSBuYW1lIGxvb2t1cCwgc28ganVzdCByZXR1cm4gaXQuCiAgICAgICAgICAgICAgICAgICAgLy9BZGQgZXh0ZW5zaW9uIGlmIGl0IGlzIGluY2x1ZGVkLiBUaGlzIGlzIGEgYml0IHdvbmt5LCBvbmx5IG5vbi0uanMgdGhpbmdzIHBhc3MKICAgICAgICAgICAgICAgICAgICAvL2FuIGV4dGVuc2lvbiwgdGhpcyBtZXRob2QgcHJvYmFibHkgbmVlZHMgdG8gYmUgcmV3b3JrZWQuCiAgICAgICAgICAgICAgICAgICAgdXJsID0gbW9kdWxlTmFtZSArIChleHQgfHwgJycpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL0EgbW9kdWxlIHRoYXQgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIGEgcGF0aC4KICAgICAgICAgICAgICAgICAgICBwYXRocyA9IGNvbmZpZy5wYXRoczsKCiAgICAgICAgICAgICAgICAgICAgc3ltcyA9IG1vZHVsZU5hbWUuc3BsaXQoJy8nKTsKICAgICAgICAgICAgICAgICAgICAvL0ZvciBlYWNoIG1vZHVsZSBuYW1lIHNlZ21lbnQsIHNlZSBpZiB0aGVyZSBpcyBhIHBhdGgKICAgICAgICAgICAgICAgICAgICAvL3JlZ2lzdGVyZWQgZm9yIGl0LiBTdGFydCB3aXRoIG1vc3Qgc3BlY2lmaWMgbmFtZQogICAgICAgICAgICAgICAgICAgIC8vYW5kIHdvcmsgdXAgZnJvbSBpdC4KICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBzeW1zLmxlbmd0aDsgaSA+IDA7IGkgLT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRNb2R1bGUgPSBzeW1zLnNsaWNlKDAsIGkpLmpvaW4oJy8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFBhdGggPSBnZXRPd24ocGF0aHMsIHBhcmVudE1vZHVsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRQYXRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lmIGFuIGFycmF5LCBpdCBtZWFucyB0aGVyZSBhcmUgYSBmZXcgY2hvaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2hvb3NlIHRoZSBvbmUgdGhhdCBpcyBkZXNpcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShwYXJlbnRQYXRoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFBhdGggPSBwYXJlbnRQYXRoWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltcy5zcGxpY2UoMCwgaSwgcGFyZW50UGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy9Kb2luIHRoZSBwYXRoIHBhcnRzIHRvZ2V0aGVyLCB0aGVuIGZpZ3VyZSBvdXQgaWYgYmFzZVVybCBpcyBuZWVkZWQuCiAgICAgICAgICAgICAgICAgICAgdXJsID0gc3ltcy5qb2luKCcvJyk7CiAgICAgICAgICAgICAgICAgICAgdXJsICs9IChleHQgfHwgKC9eZGF0YVw6fF5ibG9iXDp8XD8vLnRlc3QodXJsKSB8fCBza2lwRXh0ID8gJycgOiAnLmpzJykpOwogICAgICAgICAgICAgICAgICAgIHVybCA9ICh1cmwuY2hhckF0KDApID09PSAnLycgfHwgdXJsLm1hdGNoKC9eW1x3XCtcLlwtXSs6LykgPyAnJyA6IGNvbmZpZy5iYXNlVXJsKSArIHVybDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnLnVybEFyZ3MgJiYgIS9eYmxvYlw6Ly50ZXN0KHVybCkgPwogICAgICAgICAgICAgICAgICAgICAgIHVybCArIGNvbmZpZy51cmxBcmdzKG1vZHVsZU5hbWUsIHVybCkgOiB1cmw7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvL0RlbGVnYXRlcyB0byByZXEubG9hZC4gQnJva2VuIG91dCBhcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvCiAgICAgICAgICAgIC8vYWxsb3cgb3ZlcnJpZGluZyBpbiB0aGUgb3B0aW1pemVyLgogICAgICAgICAgICBsb2FkOiBmdW5jdGlvbiAoaWQsIHVybCkgewogICAgICAgICAgICAgICAgcmVxLmxvYWQoY29udGV4dCwgaWQsIHVybCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXhlY3V0ZXMgYSBtb2R1bGUgY2FsbGJhY2sgZnVuY3Rpb24uIEJyb2tlbiBvdXQgYXMgYSBzZXBhcmF0ZSBmdW5jdGlvbgogICAgICAgICAgICAgKiBzb2xlbHkgdG8gYWxsb3cgdGhlIGJ1aWxkIHN5c3RlbSB0byBzZXF1ZW5jZSB0aGUgZmlsZXMgaW4gdGhlIGJ1aWx0CiAgICAgICAgICAgICAqIGxheWVyIGluIHRoZSByaWdodCBzZXF1ZW5jZS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGV4ZWNDYjogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrLCBhcmdzLCBleHBvcnRzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkoZXhwb3J0cywgYXJncyk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogY2FsbGJhY2sgZm9yIHNjcmlwdCBsb2FkcywgdXNlZCB0byBjaGVjayBzdGF0dXMgb2YgbG9hZGluZy4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtFdmVudH0gZXZ0IHRoZSBldmVudCBmcm9tIHRoZSBicm93c2VyIGZvciB0aGUgc2NyaXB0CiAgICAgICAgICAgICAqIHRoYXQgd2FzIGxvYWRlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uU2NyaXB0TG9hZDogZnVuY3Rpb24gKGV2dCkgewogICAgICAgICAgICAgICAgLy9Vc2luZyBjdXJyZW50VGFyZ2V0IGluc3RlYWQgb2YgdGFyZ2V0IGZvciBGaXJlZm94IDIuMCdzIHNha2UuIE5vdAogICAgICAgICAgICAgICAgLy9hbGwgb2xkIGJyb3dzZXJzIHdpbGwgYmUgc3VwcG9ydGVkLCBidXQgdGhpcyBvbmUgd2FzIGVhc3kgZW5vdWdoCiAgICAgICAgICAgICAgICAvL3RvIHN1cHBvcnQgYW5kIHN0aWxsIG1ha2VzIHNlbnNlLgogICAgICAgICAgICAgICAgaWYgKGV2dC50eXBlID09PSAnbG9hZCcgfHwKICAgICAgICAgICAgICAgICAgICAgICAgKHJlYWR5UmVnRXhwLnRlc3QoKGV2dC5jdXJyZW50VGFyZ2V0IHx8IGV2dC5zcmNFbGVtZW50KS5yZWFkeVN0YXRlKSkpIHsKICAgICAgICAgICAgICAgICAgICAvL1Jlc2V0IGludGVyYWN0aXZlIHNjcmlwdCBzbyBhIHNjcmlwdCBub2RlIGlzIG5vdCBoZWxkIG9udG8gZm9yCiAgICAgICAgICAgICAgICAgICAgLy90byBsb25nLgogICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlU2NyaXB0ID0gbnVsbDsKCiAgICAgICAgICAgICAgICAgICAgLy9QdWxsIG91dCB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIGFuZCB0aGUgY29udGV4dC4KICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGdldFNjcmlwdERhdGEoZXZ0KTsKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmNvbXBsZXRlTG9hZChkYXRhLmlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsYmFjayBmb3Igc2NyaXB0IGVycm9ycy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uU2NyaXB0RXJyb3I6IGZ1bmN0aW9uIChldnQpIHsKICAgICAgICAgICAgICAgIHZhciBkYXRhID0gZ2V0U2NyaXB0RGF0YShldnQpOwogICAgICAgICAgICAgICAgaWYgKCFoYXNQYXRoRmFsbGJhY2soZGF0YS5pZCkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGVhY2hQcm9wKHJlZ2lzdHJ5LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZignX0ByJykgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2godmFsdWUuZGVwTWFwcywgZnVuY3Rpb24oZGVwTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlcE1hcC5pZCA9PT0gZGF0YS5pZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRzLnB1c2goa2V5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ3NjcmlwdGVycm9yJywgJ1NjcmlwdCBlcnJvciBmb3IgIicgKyBkYXRhLmlkICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmVudHMubGVuZ3RoID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyIsIG5lZWRlZCBieTogJyArIHBhcmVudHMuam9pbignLCAnKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICciJyksIGV2dCwgW2RhdGEuaWRdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBjb250ZXh0LnJlcXVpcmUgPSBjb250ZXh0Lm1ha2VSZXF1aXJlKCk7CiAgICAgICAgcmV0dXJuIGNvbnRleHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBNYWluIGVudHJ5IHBvaW50LgogICAgICoKICAgICAqIElmIHRoZSBvbmx5IGFyZ3VtZW50IHRvIHJlcXVpcmUgaXMgYSBzdHJpbmcsIHRoZW4gdGhlIG1vZHVsZSB0aGF0CiAgICAgKiBpcyByZXByZXNlbnRlZCBieSB0aGF0IHN0cmluZyBpcyBmZXRjaGVkIGZvciB0aGUgYXBwcm9wcmlhdGUgY29udGV4dC4KICAgICAqCiAgICAgKiBJZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYW4gYXJyYXksIHRoZW4gaXQgd2lsbCBiZSB0cmVhdGVkIGFzIGFuIGFycmF5CiAgICAgKiBvZiBkZXBlbmRlbmN5IHN0cmluZyBuYW1lcyB0byBmZXRjaC4gQW4gb3B0aW9uYWwgZnVuY3Rpb24gY2FsbGJhY2sgY2FuCiAgICAgKiBiZSBzcGVjaWZpZWQgdG8gZXhlY3V0ZSB3aGVuIGFsbCBvZiB0aG9zZSBkZXBlbmRlbmNpZXMgYXJlIGF2YWlsYWJsZS4KICAgICAqCiAgICAgKiBNYWtlIGEgbG9jYWwgcmVxIHZhcmlhYmxlIHRvIGhlbHAgQ2FqYSBjb21wbGlhbmNlIChpdCBhc3N1bWVzIHRoaW5ncwogICAgICogb24gYSByZXF1aXJlIHRoYXQgYXJlIG5vdCBzdGFuZGFyZGl6ZWQpLCBhbmQgdG8gZ2l2ZSBhIHNob3J0CiAgICAgKiBuYW1lIGZvciBtaW5pZmljYXRpb24vbG9jYWwgc2NvcGUgdXNlLgogICAgICovCiAgICByZXEgPSByZXF1aXJlanMgPSBmdW5jdGlvbiAoZGVwcywgY2FsbGJhY2ssIGVycmJhY2ssIG9wdGlvbmFsKSB7CgogICAgICAgIC8vRmluZCB0aGUgcmlnaHQgY29udGV4dCwgdXNlIGRlZmF1bHQKICAgICAgICB2YXIgY29udGV4dCwgY29uZmlnLAogICAgICAgICAgICBjb250ZXh0TmFtZSA9IGRlZkNvbnRleHROYW1lOwoKICAgICAgICAvLyBEZXRlcm1pbmUgaWYgaGF2ZSBjb25maWcgb2JqZWN0IGluIHRoZSBjYWxsLgogICAgICAgIGlmICghaXNBcnJheShkZXBzKSAmJiB0eXBlb2YgZGVwcyAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgLy8gZGVwcyBpcyBhIGNvbmZpZyBvYmplY3QKICAgICAgICAgICAgY29uZmlnID0gZGVwczsKICAgICAgICAgICAgaWYgKGlzQXJyYXkoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAvLyBBZGp1c3QgYXJncyBpZiB0aGVyZSBhcmUgZGVwZW5kZW5jaWVzCiAgICAgICAgICAgICAgICBkZXBzID0gY2FsbGJhY2s7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGVycmJhY2s7CiAgICAgICAgICAgICAgICBlcnJiYWNrID0gb3B0aW9uYWw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZXBzID0gW107CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLmNvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dE5hbWUgPSBjb25maWcuY29udGV4dDsKICAgICAgICB9CgogICAgICAgIGNvbnRleHQgPSBnZXRPd24oY29udGV4dHMsIGNvbnRleHROYW1lKTsKICAgICAgICBpZiAoIWNvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHRzW2NvbnRleHROYW1lXSA9IHJlcS5zLm5ld0NvbnRleHQoY29udGV4dE5hbWUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbmZpZykgewogICAgICAgICAgICBjb250ZXh0LmNvbmZpZ3VyZShjb25maWcpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGNvbnRleHQucmVxdWlyZShkZXBzLCBjYWxsYmFjaywgZXJyYmFjayk7CiAgICB9OwoKICAgIC8qKgogICAgICogU3VwcG9ydCByZXF1aXJlLmNvbmZpZygpIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGNvb3BlcmF0ZSB3aXRoIG90aGVyCiAgICAgKiBBTUQgbG9hZGVycyBvbiBnbG9iYWxseSBhZ3JlZWQgbmFtZXMuCiAgICAgKi8KICAgIHJlcS5jb25maWcgPSBmdW5jdGlvbiAoY29uZmlnKSB7CiAgICAgICAgcmV0dXJuIHJlcShjb25maWcpOwogICAgfTsKCiAgICAvKioKICAgICAqIEV4ZWN1dGUgc29tZXRoaW5nIGFmdGVyIHRoZSBjdXJyZW50IHRpY2sKICAgICAqIG9mIHRoZSBldmVudCBsb29wLiBPdmVycmlkZSBmb3Igb3RoZXIgZW52cwogICAgICogdGhhdCBoYXZlIGEgYmV0dGVyIHNvbHV0aW9uIHRoYW4gc2V0VGltZW91dC4KICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmbiBmdW5jdGlvbiB0byBleGVjdXRlIGxhdGVyLgogICAgICovCiAgICByZXEubmV4dFRpY2sgPSB0eXBlb2Ygc2V0VGltZW91dCAhPT0gJ3VuZGVmaW5lZCcgPyBmdW5jdGlvbiAoZm4pIHsKICAgICAgICBzZXRUaW1lb3V0KGZuLCA0KTsKICAgIH0gOiBmdW5jdGlvbiAoZm4pIHsgZm4oKTsgfTsKCiAgICAvKioKICAgICAqIEV4cG9ydCByZXF1aXJlIGFzIGEgZ2xvYmFsLCBidXQgb25seSBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgogICAgICovCiAgICBpZiAoIXJlcXVpcmUpIHsKICAgICAgICByZXF1aXJlID0gcmVxOwogICAgfQoKICAgIHJlcS52ZXJzaW9uID0gdmVyc2lvbjsKCiAgICAvL1VzZWQgdG8gZmlsdGVyIG91dCBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgYWxyZWFkeSBwYXRocy4KICAgIHJlcS5qc0V4dFJlZ0V4cCA9IC9eXC98OnxcP3xcLmpzJC87CiAgICByZXEuaXNCcm93c2VyID0gaXNCcm93c2VyOwogICAgcyA9IHJlcS5zID0gewogICAgICAgIGNvbnRleHRzOiBjb250ZXh0cywKICAgICAgICBuZXdDb250ZXh0OiBuZXdDb250ZXh0CiAgICB9OwoKICAgIC8vQ3JlYXRlIGRlZmF1bHQgY29udGV4dC4KICAgIHJlcSh7fSk7CgogICAgLy9FeHBvcnRzIHNvbWUgY29udGV4dC1zZW5zaXRpdmUgbWV0aG9kcyBvbiBnbG9iYWwgcmVxdWlyZS4KICAgIGVhY2goWwogICAgICAgICd0b1VybCcsCiAgICAgICAgJ3VuZGVmJywKICAgICAgICAnZGVmaW5lZCcsCiAgICAgICAgJ3NwZWNpZmllZCcKICAgIF0sIGZ1bmN0aW9uIChwcm9wKSB7CiAgICAgICAgLy9SZWZlcmVuY2UgZnJvbSBjb250ZXh0cyBpbnN0ZWFkIG9mIGVhcmx5IGJpbmRpbmcgdG8gZGVmYXVsdCBjb250ZXh0LAogICAgICAgIC8vc28gdGhhdCBkdXJpbmcgYnVpbGRzLCB0aGUgbGF0ZXN0IGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IGNvbnRleHQKICAgICAgICAvL3dpdGggaXRzIGNvbmZpZyBnZXRzIHVzZWQuCiAgICAgICAgcmVxW3Byb3BdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgY3R4ID0gY29udGV4dHNbZGVmQ29udGV4dE5hbWVdOwogICAgICAgICAgICByZXR1cm4gY3R4LnJlcXVpcmVbcHJvcF0uYXBwbHkoY3R4LCBhcmd1bWVudHMpOwogICAgICAgIH07CiAgICB9KTsKCiAgICBpZiAoaXNCcm93c2VyKSB7CiAgICAgICAgaGVhZCA9IHMuaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07CiAgICAgICAgLy9JZiBCQVNFIHRhZyBpcyBpbiBwbGF5LCB1c2luZyBhcHBlbmRDaGlsZCBpcyBhIHByb2JsZW0gZm9yIElFNi4KICAgICAgICAvL1doZW4gdGhhdCBicm93c2VyIGRpZXMsIHRoaXMgY2FuIGJlIHJlbW92ZWQuIERldGFpbHMgaW4gdGhpcyBqUXVlcnkgYnVnOgogICAgICAgIC8vaHR0cDovL2Rldi5qcXVlcnkuY29tL3RpY2tldC8yNzA5CiAgICAgICAgYmFzZUVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYmFzZScpWzBdOwogICAgICAgIGlmIChiYXNlRWxlbWVudCkgewogICAgICAgICAgICBoZWFkID0gcy5oZWFkID0gYmFzZUVsZW1lbnQucGFyZW50Tm9kZTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBBbnkgZXJyb3JzIHRoYXQgcmVxdWlyZSBleHBsaWNpdGx5IGdlbmVyYXRlcyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzCiAgICAgKiBmdW5jdGlvbi4gSW50ZXJjZXB0L292ZXJyaWRlIGl0IGlmIHlvdSB3YW50IGN1c3RvbSBlcnJvciBoYW5kbGluZy4KICAgICAqIEBwYXJhbSB7RXJyb3J9IGVyciB0aGUgZXJyb3Igb2JqZWN0LgogICAgICovCiAgICByZXEub25FcnJvciA9IGRlZmF1bHRPbkVycm9yOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyB0aGUgbm9kZSBmb3IgdGhlIGxvYWQgY29tbWFuZC4gT25seSB1c2VkIGluIGJyb3dzZXIgZW52cy4KICAgICAqLwogICAgcmVxLmNyZWF0ZU5vZGUgPSBmdW5jdGlvbiAoY29uZmlnLCBtb2R1bGVOYW1lLCB1cmwpIHsKICAgICAgICB2YXIgbm9kZSA9IGNvbmZpZy54aHRtbCA/CiAgICAgICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnaHRtbDpzY3JpcHQnKSA6CiAgICAgICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICBub2RlLnR5cGUgPSBjb25maWcuc2NyaXB0VHlwZSB8fCAndGV4dC9qYXZhc2NyaXB0JzsKICAgICAgICBub2RlLmNoYXJzZXQgPSAndXRmLTgnOwogICAgICAgIG5vZGUuYXN5bmMgPSB0cnVlOwogICAgICAgIHJldHVybiBub2RlOwogICAgfTsKCiAgICAvKioKICAgICAqIERvZXMgdGhlIHJlcXVlc3QgdG8gbG9hZCBhIG1vZHVsZSBmb3IgdGhlIGJyb3dzZXIgY2FzZS4KICAgICAqIE1ha2UgdGhpcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGFsbG93IG90aGVyIGVudmlyb25tZW50cwogICAgICogdG8gb3ZlcnJpZGUgaXQuCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgdGhlIHJlcXVpcmUgY29udGV4dCB0byBmaW5kIHN0YXRlLgogICAgICogQHBhcmFtIHtTdHJpbmd9IG1vZHVsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSB1cmwgdGhlIFVSTCB0byB0aGUgbW9kdWxlLgogICAgICovCiAgICByZXEubG9hZCA9IGZ1bmN0aW9uIChjb250ZXh0LCBtb2R1bGVOYW1lLCB1cmwpIHsKICAgICAgICB2YXIgY29uZmlnID0gKGNvbnRleHQgJiYgY29udGV4dC5jb25maWcpIHx8IHt9LAogICAgICAgICAgICBub2RlOwogICAgICAgIGlmIChpc0Jyb3dzZXIpIHsKICAgICAgICAgICAgLy9JbiB0aGUgYnJvd3NlciBzbyB1c2UgYSBzY3JpcHQgdGFnCiAgICAgICAgICAgIG5vZGUgPSByZXEuY3JlYXRlTm9kZShjb25maWcsIG1vZHVsZU5hbWUsIHVybCk7CgogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlY29udGV4dCcsIGNvbnRleHQuY29udGV4dE5hbWUpOwogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlbW9kdWxlJywgbW9kdWxlTmFtZSk7CgogICAgICAgICAgICAvL1NldCB1cCBsb2FkIGxpc3RlbmVyLiBUZXN0IGF0dGFjaEV2ZW50IGZpcnN0IGJlY2F1c2UgSUU5IGhhcwogICAgICAgICAgICAvL2Egc3VidGxlIGlzc3VlIGluIGl0cyBhZGRFdmVudExpc3RlbmVyIGFuZCBzY3JpcHQgb25sb2FkIGZpcmluZ3MKICAgICAgICAgICAgLy90aGF0IGRvIG5vdCBtYXRjaCB0aGUgYmVoYXZpb3Igb2YgYWxsIG90aGVyIGJyb3dzZXJzIHdpdGgKICAgICAgICAgICAgLy9hZGRFdmVudExpc3RlbmVyIHN1cHBvcnQsIHdoaWNoIGZpcmUgdGhlIG9ubG9hZCBldmVudCBmb3IgYQogICAgICAgICAgICAvL3NjcmlwdCByaWdodCBhZnRlciB0aGUgc2NyaXB0IGV4ZWN1dGlvbi4gU2VlOgogICAgICAgICAgICAvL2h0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvNjQ4MDU3L3NjcmlwdC1vbmxvYWQtZXZlbnQtaXMtbm90LWZpcmVkLWltbWVkaWF0ZWx5LWFmdGVyLXNjcmlwdC1leGVjdXRpb24KICAgICAgICAgICAgLy9VTkZPUlRVTkFURUxZIE9wZXJhIGltcGxlbWVudHMgYXR0YWNoRXZlbnQgYnV0IGRvZXMgbm90IGZvbGxvdyB0aGUgc2NyaXB0CiAgICAgICAgICAgIC8vc2NyaXB0IGV4ZWN1dGlvbiBtb2RlLgogICAgICAgICAgICBpZiAobm9kZS5hdHRhY2hFdmVudCAmJgogICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgaWYgbm9kZS5hdHRhY2hFdmVudCBpcyBhcnRpZmljaWFsbHkgYWRkZWQgYnkgY3VzdG9tIHNjcmlwdCBvcgogICAgICAgICAgICAgICAgICAgIC8vbmF0aXZlbHkgc3VwcG9ydGVkIGJ5IGJyb3dzZXIKICAgICAgICAgICAgICAgICAgICAvL3JlYWQgaHR0cHM6Ly9naXRodWIuY29tL3JlcXVpcmVqcy9yZXF1aXJlanMvaXNzdWVzLzE4NwogICAgICAgICAgICAgICAgICAgIC8vaWYgd2UgY2FuIE5PVCBmaW5kIFtuYXRpdmUgY29kZV0gdGhlbiBpdCBtdXN0IE5PVCBuYXRpdmVseSBzdXBwb3J0ZWQuCiAgICAgICAgICAgICAgICAgICAgLy9pbiBJRTgsIG5vZGUuYXR0YWNoRXZlbnQgZG9lcyBub3QgaGF2ZSB0b1N0cmluZygpCiAgICAgICAgICAgICAgICAgICAgLy9Ob3RlIHRoZSB0ZXN0IGZvciAiW25hdGl2ZSBjb2RlIiB3aXRoIG5vIGNsb3NpbmcgYnJhY2UsIHNlZToKICAgICAgICAgICAgICAgICAgICAvL2h0dHBzOi8vZ2l0aHViLmNvbS9yZXF1aXJlanMvcmVxdWlyZWpzL2lzc3Vlcy8yNzMKICAgICAgICAgICAgICAgICAgICAhKG5vZGUuYXR0YWNoRXZlbnQudG9TdHJpbmcgJiYgbm9kZS5hdHRhY2hFdmVudC50b1N0cmluZygpLmluZGV4T2YoJ1tuYXRpdmUgY29kZScpIDwgMCkgJiYKICAgICAgICAgICAgICAgICAgICAhaXNPcGVyYSkgewogICAgICAgICAgICAgICAgLy9Qcm9iYWJseSBJRS4gSUUgKGF0IGxlYXN0IDYtOCkgZG8gbm90IGZpcmUKICAgICAgICAgICAgICAgIC8vc2NyaXB0IG9ubG9hZCByaWdodCBhZnRlciBleGVjdXRpbmcgdGhlIHNjcmlwdCwgc28KICAgICAgICAgICAgICAgIC8vd2UgY2Fubm90IHRpZSB0aGUgYW5vbnltb3VzIGRlZmluZSBjYWxsIHRvIGEgbmFtZS4KICAgICAgICAgICAgICAgIC8vSG93ZXZlciwgSUUgcmVwb3J0cyB0aGUgc2NyaXB0IGFzIGJlaW5nIGluICdpbnRlcmFjdGl2ZScKICAgICAgICAgICAgICAgIC8vcmVhZHlTdGF0ZSBhdCB0aGUgdGltZSBvZiB0aGUgZGVmaW5lIGNhbGwuCiAgICAgICAgICAgICAgICB1c2VJbnRlcmFjdGl2ZSA9IHRydWU7CgogICAgICAgICAgICAgICAgbm9kZS5hdHRhY2hFdmVudCgnb25yZWFkeXN0YXRlY2hhbmdlJywgY29udGV4dC5vblNjcmlwdExvYWQpOwogICAgICAgICAgICAgICAgLy9JdCB3b3VsZCBiZSBncmVhdCB0byBhZGQgYW4gZXJyb3IgaGFuZGxlciBoZXJlIHRvIGNhdGNoCiAgICAgICAgICAgICAgICAvLzQwNHMgaW4gSUU5Ky4gSG93ZXZlciwgb25yZWFkeXN0YXRlY2hhbmdlIHdpbGwgZmlyZSBiZWZvcmUKICAgICAgICAgICAgICAgIC8vdGhlIGVycm9yIGhhbmRsZXIsIHNvIHRoYXQgZG9lcyBub3QgaGVscC4gSWYgYWRkRXZlbnRMaXN0ZW5lcgogICAgICAgICAgICAgICAgLy9pcyB1c2VkLCB0aGVuIElFIHdpbGwgZmlyZSBlcnJvciBiZWZvcmUgbG9hZCwgYnV0IHdlIGNhbm5vdAogICAgICAgICAgICAgICAgLy91c2UgdGhhdCBwYXRod2F5IGdpdmVuIHRoZSBjb25uZWN0Lm1pY3Jvc29mdC5jb20gaXNzdWUKICAgICAgICAgICAgICAgIC8vbWVudGlvbmVkIGFib3ZlIGFib3V0IG5vdCBkb2luZyB0aGUgJ3NjcmlwdCBleGVjdXRlLAogICAgICAgICAgICAgICAgLy90aGVuIGZpcmUgdGhlIHNjcmlwdCBsb2FkIGV2ZW50IGxpc3RlbmVyIGJlZm9yZSBleGVjdXRlCiAgICAgICAgICAgICAgICAvL25leHQgc2NyaXB0JyB0aGF0IG90aGVyIGJyb3dzZXJzIGRvLgogICAgICAgICAgICAgICAgLy9CZXN0IGhvcGU6IElFMTAgZml4ZXMgdGhlIGlzc3VlcywKICAgICAgICAgICAgICAgIC8vYW5kIHRoZW4gZGVzdHJveXMgYWxsIGluc3RhbGxzIG9mIElFIDYtOS4KICAgICAgICAgICAgICAgIC8vbm9kZS5hdHRhY2hFdmVudCgnb25lcnJvcicsIGNvbnRleHQub25TY3JpcHRFcnJvcik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBjb250ZXh0Lm9uU2NyaXB0TG9hZCwgZmFsc2UpOwogICAgICAgICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGNvbnRleHQub25TY3JpcHRFcnJvciwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5vZGUuc3JjID0gdXJsOwoKICAgICAgICAgICAgLy9DYWxsaW5nIG9uTm9kZUNyZWF0ZWQgYWZ0ZXIgYWxsIHByb3BlcnRpZXMgb24gdGhlIG5vZGUgaGF2ZSBiZWVuCiAgICAgICAgICAgIC8vc2V0LCBidXQgYmVmb3JlIGl0IGlzIHBsYWNlZCBpbiB0aGUgRE9NLgogICAgICAgICAgICBpZiAoY29uZmlnLm9uTm9kZUNyZWF0ZWQpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5vbk5vZGVDcmVhdGVkKG5vZGUsIGNvbmZpZywgbW9kdWxlTmFtZSwgdXJsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9Gb3Igc29tZSBjYWNoZSBjYXNlcyBpbiBJRSA2LTgsIHRoZSBzY3JpcHQgZXhlY3V0ZXMgYmVmb3JlIHRoZSBlbmQKICAgICAgICAgICAgLy9vZiB0aGUgYXBwZW5kQ2hpbGQgZXhlY3V0aW9uLCBzbyB0byB0aWUgYW4gYW5vbnltb3VzIGRlZmluZQogICAgICAgICAgICAvL2NhbGwgdG8gdGhlIG1vZHVsZSBuYW1lICh3aGljaCBpcyBzdG9yZWQgb24gdGhlIG5vZGUpLCBob2xkIG9uCiAgICAgICAgICAgIC8vdG8gYSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLCBidXQgY2xlYXIgYWZ0ZXIgdGhlIERPTSBpbnNlcnRpb24uCiAgICAgICAgICAgIGN1cnJlbnRseUFkZGluZ1NjcmlwdCA9IG5vZGU7CiAgICAgICAgICAgIGlmIChiYXNlRWxlbWVudCkgewogICAgICAgICAgICAgICAgaGVhZC5pbnNlcnRCZWZvcmUobm9kZSwgYmFzZUVsZW1lbnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChub2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdXJyZW50bHlBZGRpbmdTY3JpcHQgPSBudWxsOwoKICAgICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgfSBlbHNlIGlmIChpc1dlYldvcmtlcikgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgLy9JbiBhIHdlYiB3b3JrZXIsIHVzZSBpbXBvcnRTY3JpcHRzLiBUaGlzIGlzIG5vdCBhIHZlcnkKICAgICAgICAgICAgICAgIC8vZWZmaWNpZW50IHVzZSBvZiBpbXBvcnRTY3JpcHRzLCBpbXBvcnRTY3JpcHRzIHdpbGwgYmxvY2sgdW50aWwKICAgICAgICAgICAgICAgIC8vaXRzIHNjcmlwdCBpcyBkb3dubG9hZGVkIGFuZCBldmFsdWF0ZWQuIEhvd2V2ZXIsIGlmIHdlYiB3b3JrZXJzCiAgICAgICAgICAgICAgICAvL2FyZSBpbiBwbGF5LCB0aGUgZXhwZWN0YXRpb24gaXMgdGhhdCBhIGJ1aWxkIGhhcyBiZWVuIGRvbmUgc28KICAgICAgICAgICAgICAgIC8vdGhhdCBvbmx5IG9uZSBzY3JpcHQgbmVlZHMgdG8gYmUgbG9hZGVkIGFueXdheS4gVGhpcyBtYXkgbmVlZAogICAgICAgICAgICAgICAgLy90byBiZSByZWV2YWx1YXRlZCBpZiBvdGhlciB1c2UgY2FzZXMgYmVjb21lIGNvbW1vbi4KCiAgICAgICAgICAgICAgICAvLyBQb3N0IGEgdGFzayB0byB0aGUgZXZlbnQgbG9vcCB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBXZWJLaXQKICAgICAgICAgICAgICAgIC8vIHdoZXJlIHRoZSB3b3JrZXIgZ2V0cyBnYXJiYWdlLWNvbGxlY3RlZCBhZnRlciBjYWxsaW5nCiAgICAgICAgICAgICAgICAvLyBpbXBvcnRTY3JpcHRzKCk6IGh0dHBzOi8vd2Via2l0Lm9yZy9iLzE1MzMxNwogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHt9LCAwKTsKICAgICAgICAgICAgICAgIGltcG9ydFNjcmlwdHModXJsKTsKCiAgICAgICAgICAgICAgICAvL0FjY291bnQgZm9yIGFub255bW91cyBtb2R1bGVzCiAgICAgICAgICAgICAgICBjb250ZXh0LmNvbXBsZXRlTG9hZChtb2R1bGVOYW1lKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgY29udGV4dC5vbkVycm9yKG1ha2VFcnJvcignaW1wb3J0c2NyaXB0cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydFNjcmlwdHMgZmFpbGVkIGZvciAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZSArICcgYXQgJyArIHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2R1bGVOYW1lXSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBnZXRJbnRlcmFjdGl2ZVNjcmlwdCgpIHsKICAgICAgICBpZiAoaW50ZXJhY3RpdmVTY3JpcHQgJiYgaW50ZXJhY3RpdmVTY3JpcHQucmVhZHlTdGF0ZSA9PT0gJ2ludGVyYWN0aXZlJykgewogICAgICAgICAgICByZXR1cm4gaW50ZXJhY3RpdmVTY3JpcHQ7CiAgICAgICAgfQoKICAgICAgICBlYWNoUmV2ZXJzZShzY3JpcHRzKCksIGZ1bmN0aW9uIChzY3JpcHQpIHsKICAgICAgICAgICAgaWYgKHNjcmlwdC5yZWFkeVN0YXRlID09PSAnaW50ZXJhY3RpdmUnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGludGVyYWN0aXZlU2NyaXB0ID0gc2NyaXB0KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBpbnRlcmFjdGl2ZVNjcmlwdDsKICAgIH0KCiAgICAvL0xvb2sgZm9yIGEgZGF0YS1tYWluIHNjcmlwdCBhdHRyaWJ1dGUsIHdoaWNoIGNvdWxkIGFsc28gYWRqdXN0IHRoZSBiYXNlVXJsLgogICAgaWYgKGlzQnJvd3NlciAmJiAhY2ZnLnNraXBEYXRhTWFpbikgewogICAgICAgIC8vRmlndXJlIG91dCBiYXNlVXJsLiBHZXQgaXQgZnJvbSB0aGUgc2NyaXB0IHRhZyB3aXRoIHJlcXVpcmUuanMgaW4gaXQuCiAgICAgICAgZWFjaFJldmVyc2Uoc2NyaXB0cygpLCBmdW5jdGlvbiAoc2NyaXB0KSB7CiAgICAgICAgICAgIC8vU2V0IHRoZSAnaGVhZCcgd2hlcmUgd2UgY2FuIGFwcGVuZCBjaGlsZHJlbiBieQogICAgICAgICAgICAvL3VzaW5nIHRoZSBzY3JpcHQncyBwYXJlbnQuCiAgICAgICAgICAgIGlmICghaGVhZCkgewogICAgICAgICAgICAgICAgaGVhZCA9IHNjcmlwdC5wYXJlbnROb2RlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL0xvb2sgZm9yIGEgZGF0YS1tYWluIGF0dHJpYnV0ZSB0byBzZXQgbWFpbiBzY3JpcHQgZm9yIHRoZSBwYWdlCiAgICAgICAgICAgIC8vdG8gbG9hZC4gSWYgaXQgaXMgdGhlcmUsIHRoZSBwYXRoIHRvIGRhdGEgbWFpbiBiZWNvbWVzIHRoZQogICAgICAgICAgICAvL2Jhc2VVcmwsIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHNldC4KICAgICAgICAgICAgZGF0YU1haW4gPSBzY3JpcHQuZ2V0QXR0cmlidXRlKCdkYXRhLW1haW4nKTsKICAgICAgICAgICAgaWYgKGRhdGFNYWluKSB7CiAgICAgICAgICAgICAgICAvL1ByZXNlcnZlIGRhdGFNYWluIGluIGNhc2UgaXQgaXMgYSBwYXRoIChpLmUuIGNvbnRhaW5zICc/JykKICAgICAgICAgICAgICAgIG1haW5TY3JpcHQgPSBkYXRhTWFpbjsKCiAgICAgICAgICAgICAgICAvL1NldCBmaW5hbCBiYXNlVXJsIGlmIHRoZXJlIGlzIG5vdCBhbHJlYWR5IGFuIGV4cGxpY2l0IG9uZSwKICAgICAgICAgICAgICAgIC8vYnV0IG9ubHkgZG8gc28gaWYgdGhlIGRhdGEtbWFpbiB2YWx1ZSBpcyBub3QgYSBsb2FkZXIgcGx1Z2luCiAgICAgICAgICAgICAgICAvL21vZHVsZSBJRC4KICAgICAgICAgICAgICAgIGlmICghY2ZnLmJhc2VVcmwgJiYgbWFpblNjcmlwdC5pbmRleE9mKCchJykgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgLy9QdWxsIG9mZiB0aGUgZGlyZWN0b3J5IG9mIGRhdGEtbWFpbiBmb3IgdXNlIGFzIHRoZQogICAgICAgICAgICAgICAgICAgIC8vYmFzZVVybC4KICAgICAgICAgICAgICAgICAgICBzcmMgPSBtYWluU2NyaXB0LnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICAgICAgbWFpblNjcmlwdCA9IHNyYy5wb3AoKTsKICAgICAgICAgICAgICAgICAgICBzdWJQYXRoID0gc3JjLmxlbmd0aCA/IHNyYy5qb2luKCcvJykgICsgJy8nIDogJy4vJzsKCiAgICAgICAgICAgICAgICAgICAgY2ZnLmJhc2VVcmwgPSBzdWJQYXRoOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vU3RyaXAgb2ZmIGFueSB0cmFpbGluZyAuanMgc2luY2UgbWFpblNjcmlwdCBpcyBub3cKICAgICAgICAgICAgICAgIC8vbGlrZSBhIG1vZHVsZSBuYW1lLgogICAgICAgICAgICAgICAgbWFpblNjcmlwdCA9IG1haW5TY3JpcHQucmVwbGFjZShqc1N1ZmZpeFJlZ0V4cCwgJycpOwoKICAgICAgICAgICAgICAgIC8vSWYgbWFpblNjcmlwdCBpcyBzdGlsbCBhIHBhdGgsIGZhbGwgYmFjayB0byBkYXRhTWFpbgogICAgICAgICAgICAgICAgaWYgKHJlcS5qc0V4dFJlZ0V4cC50ZXN0KG1haW5TY3JpcHQpKSB7CiAgICAgICAgICAgICAgICAgICAgbWFpblNjcmlwdCA9IGRhdGFNYWluOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vUHV0IHRoZSBkYXRhLW1haW4gc2NyaXB0IGluIHRoZSBmaWxlcyB0byBsb2FkLgogICAgICAgICAgICAgICAgY2ZnLmRlcHMgPSBjZmcuZGVwcyA/IGNmZy5kZXBzLmNvbmNhdChtYWluU2NyaXB0KSA6IFttYWluU2NyaXB0XTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyBkZWZpbml0aW9ucyBvZiBtb2R1bGVzLiBEaWZmZXJzIGZyb20KICAgICAqIHJlcXVpcmUoKSBpbiB0aGF0IGEgc3RyaW5nIGZvciB0aGUgbW9kdWxlIHNob3VsZCBiZSB0aGUgZmlyc3QgYXJndW1lbnQsCiAgICAgKiBhbmQgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYWZ0ZXIgZGVwZW5kZW5jaWVzIGFyZSBsb2FkZWQgc2hvdWxkCiAgICAgKiByZXR1cm4gYSB2YWx1ZSB0byBkZWZpbmUgdGhlIG1vZHVsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaXJzdCBhcmd1bWVudCdzCiAgICAgKiBuYW1lLgogICAgICovCiAgICBkZWZpbmUgPSBmdW5jdGlvbiAobmFtZSwgZGVwcywgY2FsbGJhY2spIHsKICAgICAgICB2YXIgbm9kZSwgY29udGV4dDsKCiAgICAgICAgLy9BbGxvdyBmb3IgYW5vbnltb3VzIG1vZHVsZXMKICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIC8vQWRqdXN0IGFyZ3MgYXBwcm9wcmlhdGVseQogICAgICAgICAgICBjYWxsYmFjayA9IGRlcHM7CiAgICAgICAgICAgIGRlcHMgPSBuYW1lOwogICAgICAgICAgICBuYW1lID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vVGhpcyBtb2R1bGUgbWF5IG5vdCBoYXZlIGRlcGVuZGVuY2llcwogICAgICAgIGlmICghaXNBcnJheShkZXBzKSkgewogICAgICAgICAgICBjYWxsYmFjayA9IGRlcHM7CiAgICAgICAgICAgIGRlcHMgPSBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy9JZiBubyBuYW1lLCBhbmQgY2FsbGJhY2sgaXMgYSBmdW5jdGlvbiwgdGhlbiBmaWd1cmUgb3V0IGlmIGl0IGEKICAgICAgICAvL0NvbW1vbkpTIHRoaW5nIHdpdGggZGVwZW5kZW5jaWVzLgogICAgICAgIGlmICghZGVwcyAmJiBpc0Z1bmN0aW9uKGNhbGxiYWNrKSkgewogICAgICAgICAgICBkZXBzID0gW107CiAgICAgICAgICAgIC8vUmVtb3ZlIGNvbW1lbnRzIGZyb20gdGhlIGNhbGxiYWNrIHN0cmluZywKICAgICAgICAgICAgLy9sb29rIGZvciByZXF1aXJlIGNhbGxzLCBhbmQgcHVsbCB0aGVtIGludG8gdGhlIGRlcGVuZGVuY2llcywKICAgICAgICAgICAgLy9idXQgb25seSBpZiB0aGVyZSBhcmUgZnVuY3Rpb24gYXJncy4KICAgICAgICAgICAgaWYgKGNhbGxiYWNrLmxlbmd0aCkgewogICAgICAgICAgICAgICAgY2FsbGJhY2sKICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKQogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKGNvbW1lbnRSZWdFeHAsIGNvbW1lbnRSZXBsYWNlKQogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKGNqc1JlcXVpcmVSZWdFeHAsIGZ1bmN0aW9uIChtYXRjaCwgZGVwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMucHVzaChkZXApOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vTWF5IGJlIGEgQ29tbW9uSlMgdGhpbmcgZXZlbiB3aXRob3V0IHJlcXVpcmUgY2FsbHMsIGJ1dCBzdGlsbAogICAgICAgICAgICAgICAgLy9jb3VsZCB1c2UgZXhwb3J0cywgYW5kIG1vZHVsZS4gQXZvaWQgZG9pbmcgZXhwb3J0cyBhbmQgbW9kdWxlCiAgICAgICAgICAgICAgICAvL3dvcmsgdGhvdWdoIGlmIGl0IGp1c3QgbmVlZHMgcmVxdWlyZS4KICAgICAgICAgICAgICAgIC8vUkVRVUlSRVMgdGhlIGZ1bmN0aW9uIHRvIGV4cGVjdCB0aGUgQ29tbW9uSlMgdmFyaWFibGVzIGluIHRoZQogICAgICAgICAgICAgICAgLy9vcmRlciBsaXN0ZWQgYmVsb3cuCiAgICAgICAgICAgICAgICBkZXBzID0gKGNhbGxiYWNrLmxlbmd0aCA9PT0gMSA/IFsncmVxdWlyZSddIDogWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJ10pLmNvbmNhdChkZXBzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy9JZiBpbiBJRSA2LTggYW5kIGhpdCBhbiBhbm9ueW1vdXMgZGVmaW5lKCkgY2FsbCwgZG8gdGhlIGludGVyYWN0aXZlCiAgICAgICAgLy93b3JrLgogICAgICAgIGlmICh1c2VJbnRlcmFjdGl2ZSkgewogICAgICAgICAgICBub2RlID0gY3VycmVudGx5QWRkaW5nU2NyaXB0IHx8IGdldEludGVyYWN0aXZlU2NyaXB0KCk7CiAgICAgICAgICAgIGlmIChub2RlKSB7CiAgICAgICAgICAgICAgICBpZiAoIW5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBuYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVxdWlyZW1vZHVsZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHRzW25vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXJlcXVpcmVjb250ZXh0JyldOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvL0Fsd2F5cyBzYXZlIG9mZiBldmFsdWF0aW5nIHRoZSBkZWYgY2FsbCB1bnRpbCB0aGUgc2NyaXB0IG9ubG9hZCBoYW5kbGVyLgogICAgICAgIC8vVGhpcyBhbGxvd3MgbXVsdGlwbGUgbW9kdWxlcyB0byBiZSBpbiBhIGZpbGUgd2l0aG91dCBwcmVtYXR1cmVseQogICAgICAgIC8vdHJhY2luZyBkZXBlbmRlbmNpZXMsIGFuZCBhbGxvd3MgZm9yIGFub255bW91cyBtb2R1bGUgc3VwcG9ydCwKICAgICAgICAvL3doZXJlIHRoZSBtb2R1bGUgbmFtZSBpcyBub3Qga25vd24gdW50aWwgdGhlIHNjcmlwdCBvbmxvYWQgZXZlbnQKICAgICAgICAvL29jY3Vycy4gSWYgbm8gY29udGV4dCwgdXNlIHRoZSBnbG9iYWwgcXVldWUsIGFuZCBnZXQgaXQgcHJvY2Vzc2VkCiAgICAgICAgLy9pbiB0aGUgb25zY3JpcHQgbG9hZCBjYWxsYmFjay4KICAgICAgICBpZiAoY29udGV4dCkgewogICAgICAgICAgICBjb250ZXh0LmRlZlF1ZXVlLnB1c2goW25hbWUsIGRlcHMsIGNhbGxiYWNrXSk7CiAgICAgICAgICAgIGNvbnRleHQuZGVmUXVldWVNYXBbbmFtZV0gPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdsb2JhbERlZlF1ZXVlLnB1c2goW25hbWUsIGRlcHMsIGNhbGxiYWNrXSk7CiAgICAgICAgfQogICAgfTsKCiAgICBkZWZpbmUuYW1kID0gewogICAgICAgIGpRdWVyeTogdHJ1ZQogICAgfTsKCiAgICAvKioKICAgICAqIEV4ZWN1dGVzIHRoZSB0ZXh0LiBOb3JtYWxseSBqdXN0IHVzZXMgZXZhbCwgYnV0IGNhbiBiZSBtb2RpZmllZAogICAgICogdG8gdXNlIGEgYmV0dGVyLCBlbnZpcm9ubWVudC1zcGVjaWZpYyBjYWxsLiBPbmx5IHVzZWQgZm9yIHRyYW5zcGlsaW5nCiAgICAgKiBsb2FkZXIgcGx1Z2lucywgbm90IGZvciBwbGFpbiBKUyBtb2R1bGVzLgogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgdGhlIHRleHQgdG8gZXhlY3V0ZS9ldmFsdWF0ZS4KICAgICAqLwogICAgcmVxLmV4ZWMgPSBmdW5jdGlvbiAodGV4dCkgewogICAgICAgIC8qanNsaW50IGV2aWw6IHRydWUgKi8KICAgICAgICByZXR1cm4gZXZhbCh0ZXh0KTsKICAgIH07CgogICAgLy9TZXQgdXAgd2l0aCBjb25maWcgaW5mby4KICAgIHJlcShjZmcpOwp9KHRoaXMsICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBzZXRUaW1lb3V0KSkpOwoKLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8KLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLy8gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAovLwovLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgohZnVuY3Rpb24oKXt2YXIgYT17fSxiPXt9LGM9e307IWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtpZigibnVtYmVyIj09dHlwZW9mIGEpcmV0dXJuIGE7dmFyIGI9e307Zm9yKHZhciBjIGluIGEpYltjXT1hW2NdO3JldHVybiBifWZ1bmN0aW9uIGQoKXt0aGlzLl9kZWxheT0wLHRoaXMuX2VuZERlbGF5PTAsdGhpcy5fZmlsbD0ibm9uZSIsdGhpcy5faXRlcmF0aW9uU3RhcnQ9MCx0aGlzLl9pdGVyYXRpb25zPTEsdGhpcy5fZHVyYXRpb249MCx0aGlzLl9wbGF5YmFja1JhdGU9MSx0aGlzLl9kaXJlY3Rpb249Im5vcm1hbCIsdGhpcy5fZWFzaW5nPSJsaW5lYXIiLHRoaXMuX2Vhc2luZ0Z1bmN0aW9uPXh9ZnVuY3Rpb24gZSgpe3JldHVybiBhLmlzRGVwcmVjYXRlZCgiSW52YWxpZCB0aW1pbmcgaW5wdXRzIiwiMjAxNi0wMy0wMiIsIlR5cGVFcnJvciBleGNlcHRpb25zIHdpbGwgYmUgdGhyb3duIGluc3RlYWQuIiwhMCl9ZnVuY3Rpb24gZihiLGMsZSl7dmFyIGY9bmV3IGQ7cmV0dXJuIGMmJihmLmZpbGw9ImJvdGgiLGYuZHVyYXRpb249ImF1dG8iKSwibnVtYmVyIiE9dHlwZW9mIGJ8fGlzTmFOKGIpP3ZvaWQgMCE9PWImJk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGIpLmZvckVhY2goZnVuY3Rpb24oYyl7aWYoImF1dG8iIT1iW2NdKXtpZigoIm51bWJlciI9PXR5cGVvZiBmW2NdfHwiZHVyYXRpb24iPT1jKSYmKCJudW1iZXIiIT10eXBlb2YgYltjXXx8aXNOYU4oYltjXSkpKXJldHVybjtpZigiZmlsbCI9PWMmJi0xPT12LmluZGV4T2YoYltjXSkpcmV0dXJuO2lmKCJkaXJlY3Rpb24iPT1jJiYtMT09dy5pbmRleE9mKGJbY10pKXJldHVybjtpZigicGxheWJhY2tSYXRlIj09YyYmMSE9PWJbY10mJmEuaXNEZXByZWNhdGVkKCJBbmltYXRpb25FZmZlY3RUaW1pbmcucGxheWJhY2tSYXRlIiwiMjAxNC0xMS0yOCIsIlVzZSBBbmltYXRpb24ucGxheWJhY2tSYXRlIGluc3RlYWQuIikpcmV0dXJuO2ZbY109YltjXX19KTpmLmR1cmF0aW9uPWIsZn1mdW5jdGlvbiBnKGEpe3JldHVybiJudW1iZXIiPT10eXBlb2YgYSYmKGE9aXNOYU4oYSk/e2R1cmF0aW9uOjB9OntkdXJhdGlvbjphfSksYX1mdW5jdGlvbiBoKGIsYyl7cmV0dXJuIGI9YS5udW1lcmljVGltaW5nVG9PYmplY3QoYiksZihiLGMpfWZ1bmN0aW9uIGkoYSxiLGMsZCl7cmV0dXJuIGE8MHx8YT4xfHxjPDB8fGM+MT94OmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGYoYSxiLGMpe3JldHVybiAzKmEqKDEtYykqKDEtYykqYyszKmIqKDEtYykqYypjK2MqYypjfWlmKGU8PTApe3ZhciBnPTA7cmV0dXJuIGE+MD9nPWIvYTohYiYmYz4wJiYoZz1kL2MpLGcqZX1pZihlPj0xKXt2YXIgaD0wO3JldHVybiBjPDE/aD0oZC0xKS8oYy0xKToxPT1jJiZhPDEmJihoPShiLTEpLyhhLTEpKSwxK2gqKGUtMSl9Zm9yKHZhciBpPTAsaj0xO2k8ajspe3ZhciBrPShpK2opLzIsbD1mKGEsYyxrKTtpZihNYXRoLmFicyhlLWwpPDFlLTUpcmV0dXJuIGYoYixkLGspO2w8ZT9pPWs6aj1rfXJldHVybiBmKGIsZCxrKX19ZnVuY3Rpb24gaihhLGIpe3JldHVybiBmdW5jdGlvbihjKXtpZihjPj0xKXJldHVybiAxO3ZhciBkPTEvYTtyZXR1cm4oYys9YipkKS1jJWR9fWZ1bmN0aW9uIGsoYSl7Q3x8KEM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUpLEMuYW5pbWF0aW9uVGltaW5nRnVuY3Rpb249IiIsQy5hbmltYXRpb25UaW1pbmdGdW5jdGlvbj1hO3ZhciBiPUMuYW5pbWF0aW9uVGltaW5nRnVuY3Rpb247aWYoIiI9PWImJmUoKSl0aHJvdyBuZXcgVHlwZUVycm9yKGErIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgZWFzaW5nIik7cmV0dXJuIGJ9ZnVuY3Rpb24gbChhKXtpZigibGluZWFyIj09YSlyZXR1cm4geDt2YXIgYj1FLmV4ZWMoYSk7aWYoYilyZXR1cm4gaS5hcHBseSh0aGlzLGIuc2xpY2UoMSkubWFwKE51bWJlcikpO3ZhciBjPUYuZXhlYyhhKTtpZihjKXJldHVybiBqKE51bWJlcihjWzFdKSxBKTt2YXIgZD1HLmV4ZWMoYSk7cmV0dXJuIGQ/aihOdW1iZXIoZFsxXSkse3N0YXJ0OnksbWlkZGxlOnosZW5kOkF9W2RbMl1dKTpCW2FdfHx4fWZ1bmN0aW9uIG0oYSl7cmV0dXJuIE1hdGguYWJzKG4oYSkvYS5wbGF5YmFja1JhdGUpfWZ1bmN0aW9uIG4oYSl7cmV0dXJuIDA9PT1hLmR1cmF0aW9ufHwwPT09YS5pdGVyYXRpb25zPzA6YS5kdXJhdGlvbiphLml0ZXJhdGlvbnN9ZnVuY3Rpb24gbyhhLGIsYyl7aWYobnVsbD09YilyZXR1cm4gSDt2YXIgZD1jLmRlbGF5K2ErYy5lbmREZWxheTtyZXR1cm4gYjxNYXRoLm1pbihjLmRlbGF5LGQpP0k6Yj49TWF0aC5taW4oYy5kZWxheSthLGQpP0o6S31mdW5jdGlvbiBwKGEsYixjLGQsZSl7c3dpdGNoKGQpe2Nhc2UgSTpyZXR1cm4iYmFja3dhcmRzIj09Ynx8ImJvdGgiPT1iPzA6bnVsbDtjYXNlIEs6cmV0dXJuIGMtZTtjYXNlIEo6cmV0dXJuImZvcndhcmRzIj09Ynx8ImJvdGgiPT1iP2E6bnVsbDtjYXNlIEg6cmV0dXJuIG51bGx9fWZ1bmN0aW9uIHEoYSxiLGMsZCxlKXt2YXIgZj1lO3JldHVybiAwPT09YT9iIT09SSYmKGYrPWMpOmYrPWQvYSxmfWZ1bmN0aW9uIHIoYSxiLGMsZCxlLGYpe3ZhciBnPWE9PT0xLzA/YiUxOmElMTtyZXR1cm4gMCE9PWd8fGMhPT1KfHwwPT09ZHx8MD09PWUmJjAhPT1mfHwoZz0xKSxnfWZ1bmN0aW9uIHMoYSxiLGMsZCl7cmV0dXJuIGE9PT1KJiZiPT09MS8wPzEvMDoxPT09Yz9NYXRoLmZsb29yKGQpLTE6TWF0aC5mbG9vcihkKX1mdW5jdGlvbiB0KGEsYixjKXt2YXIgZD1hO2lmKCJub3JtYWwiIT09YSYmInJldmVyc2UiIT09YSl7dmFyIGU9YjsiYWx0ZXJuYXRlLXJldmVyc2UiPT09YSYmKGUrPTEpLGQ9Im5vcm1hbCIsZSE9PTEvMCYmZSUyIT0wJiYoZD0icmV2ZXJzZSIpfXJldHVybiJub3JtYWwiPT09ZD9jOjEtY31mdW5jdGlvbiB1KGEsYixjKXt2YXIgZD1vKGEsYixjKSxlPXAoYSxjLmZpbGwsYixkLGMuZGVsYXkpO2lmKG51bGw9PT1lKXJldHVybiBudWxsO3ZhciBmPXEoYy5kdXJhdGlvbixkLGMuaXRlcmF0aW9ucyxlLGMuaXRlcmF0aW9uU3RhcnQpLGc9cihmLGMuaXRlcmF0aW9uU3RhcnQsZCxjLml0ZXJhdGlvbnMsZSxjLmR1cmF0aW9uKSxoPXMoZCxjLml0ZXJhdGlvbnMsZyxmKSxpPXQoYy5kaXJlY3Rpb24saCxnKTtyZXR1cm4gYy5fZWFzaW5nRnVuY3Rpb24oaSl9dmFyIHY9ImJhY2t3YXJkc3xmb3J3YXJkc3xib3RofG5vbmUiLnNwbGl0KCJ8Iiksdz0icmV2ZXJzZXxhbHRlcm5hdGV8YWx0ZXJuYXRlLXJldmVyc2UiLnNwbGl0KCJ8IikseD1mdW5jdGlvbihhKXtyZXR1cm4gYX07ZC5wcm90b3R5cGU9e19zZXRNZW1iZXI6ZnVuY3Rpb24oYixjKXt0aGlzWyJfIitiXT1jLHRoaXMuX2VmZmVjdCYmKHRoaXMuX2VmZmVjdC5fdGltaW5nSW5wdXRbYl09Yyx0aGlzLl9lZmZlY3QuX3RpbWluZz1hLm5vcm1hbGl6ZVRpbWluZ0lucHV0KHRoaXMuX2VmZmVjdC5fdGltaW5nSW5wdXQpLHRoaXMuX2VmZmVjdC5hY3RpdmVEdXJhdGlvbj1hLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKHRoaXMuX2VmZmVjdC5fdGltaW5nKSx0aGlzLl9lZmZlY3QuX2FuaW1hdGlvbiYmdGhpcy5fZWZmZWN0Ll9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCkpfSxnZXQgcGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMuX3BsYXliYWNrUmF0ZX0sc2V0IGRlbGF5KGEpe3RoaXMuX3NldE1lbWJlcigiZGVsYXkiLGEpfSxnZXQgZGVsYXkoKXtyZXR1cm4gdGhpcy5fZGVsYXl9LHNldCBlbmREZWxheShhKXt0aGlzLl9zZXRNZW1iZXIoImVuZERlbGF5IixhKX0sZ2V0IGVuZERlbGF5KCl7cmV0dXJuIHRoaXMuX2VuZERlbGF5fSxzZXQgZmlsbChhKXt0aGlzLl9zZXRNZW1iZXIoImZpbGwiLGEpfSxnZXQgZmlsbCgpe3JldHVybiB0aGlzLl9maWxsfSxzZXQgaXRlcmF0aW9uU3RhcnQoYSl7aWYoKGlzTmFOKGEpfHxhPDApJiZlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaXRlcmF0aW9uU3RhcnQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIsIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiaXRlcmF0aW9uU3RhcnQiLGEpfSxnZXQgaXRlcmF0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy5faXRlcmF0aW9uU3RhcnR9LHNldCBkdXJhdGlvbihhKXtpZigiYXV0byIhPWEmJihpc05hTihhKXx8YTwwKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoImR1cmF0aW9uIG11c3QgYmUgbm9uLW5lZ2F0aXZlIG9yIGF1dG8sIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiZHVyYXRpb24iLGEpfSxnZXQgZHVyYXRpb24oKXtyZXR1cm4gdGhpcy5fZHVyYXRpb259LHNldCBkaXJlY3Rpb24oYSl7dGhpcy5fc2V0TWVtYmVyKCJkaXJlY3Rpb24iLGEpfSxnZXQgZGlyZWN0aW9uKCl7cmV0dXJuIHRoaXMuX2RpcmVjdGlvbn0sc2V0IGVhc2luZyhhKXt0aGlzLl9lYXNpbmdGdW5jdGlvbj1sKGsoYSkpLHRoaXMuX3NldE1lbWJlcigiZWFzaW5nIixhKX0sZ2V0IGVhc2luZygpe3JldHVybiB0aGlzLl9lYXNpbmd9LHNldCBpdGVyYXRpb25zKGEpe2lmKChpc05hTihhKXx8YTwwKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIml0ZXJhdGlvbnMgbXVzdCBiZSBub24tbmVnYXRpdmUsIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiaXRlcmF0aW9ucyIsYSl9LGdldCBpdGVyYXRpb25zKCl7cmV0dXJuIHRoaXMuX2l0ZXJhdGlvbnN9fTt2YXIgeT0xLHo9LjUsQT0wLEI9e2Vhc2U6aSguMjUsLjEsLjI1LDEpLCJlYXNlLWluIjppKC40MiwwLDEsMSksImVhc2Utb3V0IjppKDAsMCwuNTgsMSksImVhc2UtaW4tb3V0IjppKC40MiwwLC41OCwxKSwic3RlcC1zdGFydCI6aigxLHkpLCJzdGVwLW1pZGRsZSI6aigxLHopLCJzdGVwLWVuZCI6aigxLEEpfSxDPW51bGwsRD0iXFxzKigtP1xcZCtcXC4/XFxkKnwtP1xcLlxcZCspXFxzKiIsRT1uZXcgUmVnRXhwKCJjdWJpYy1iZXppZXJcXCgiK0QrIiwiK0QrIiwiK0QrIiwiK0QrIlxcKSIpLEY9L3N0ZXBzXChccyooXGQrKVxzKlwpLyxHPS9zdGVwc1woXHMqKFxkKylccyosXHMqKHN0YXJ0fG1pZGRsZXxlbmQpXHMqXCkvLEg9MCxJPTEsSj0yLEs9MzthLmNsb25lVGltaW5nSW5wdXQ9YyxhLm1ha2VUaW1pbmc9ZixhLm51bWVyaWNUaW1pbmdUb09iamVjdD1nLGEubm9ybWFsaXplVGltaW5nSW5wdXQ9aCxhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uPW0sYS5jYWxjdWxhdGVJdGVyYXRpb25Qcm9ncmVzcz11LGEuY2FsY3VsYXRlUGhhc2U9byxhLm5vcm1hbGl6ZUVhc2luZz1rLGEucGFyc2VFYXNpbmdGdW5jdGlvbj1sfShhKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYSBpbiBrP2tbYV1bYl18fGI6Yn1mdW5jdGlvbiBkKGEpe3JldHVybiJkaXNwbGF5Ij09PWF8fDA9PT1hLmxhc3RJbmRleE9mKCJhbmltYXRpb24iLDApfHwwPT09YS5sYXN0SW5kZXhPZigidHJhbnNpdGlvbiIsMCl9ZnVuY3Rpb24gZShhLGIsZSl7aWYoIWQoYSkpe3ZhciBmPWhbYV07aWYoZil7aS5zdHlsZVthXT1iO2Zvcih2YXIgZyBpbiBmKXt2YXIgaj1mW2ddLGs9aS5zdHlsZVtqXTtlW2pdPWMoaixrKX19ZWxzZSBlW2FdPWMoYSxiKX19ZnVuY3Rpb24gZihhKXt2YXIgYj1bXTtmb3IodmFyIGMgaW4gYSlpZighKGMgaW5bImVhc2luZyIsIm9mZnNldCIsImNvbXBvc2l0ZSJdKSl7dmFyIGQ9YVtjXTtBcnJheS5pc0FycmF5KGQpfHwoZD1bZF0pO2Zvcih2YXIgZSxmPWQubGVuZ3RoLGc9MDtnPGY7ZysrKWU9e30sZS5vZmZzZXQ9Im9mZnNldCJpbiBhP2Eub2Zmc2V0OjE9PWY/MTpnLyhmLTEpLCJlYXNpbmciaW4gYSYmKGUuZWFzaW5nPWEuZWFzaW5nKSwiY29tcG9zaXRlImluIGEmJihlLmNvbXBvc2l0ZT1hLmNvbXBvc2l0ZSksZVtjXT1kW2ddLGIucHVzaChlKX1yZXR1cm4gYi5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEub2Zmc2V0LWIub2Zmc2V0fSksYn1mdW5jdGlvbiBnKGIpe2Z1bmN0aW9uIGMoKXt2YXIgYT1kLmxlbmd0aDtudWxsPT1kW2EtMV0ub2Zmc2V0JiYoZFthLTFdLm9mZnNldD0xKSxhPjEmJm51bGw9PWRbMF0ub2Zmc2V0JiYoZFswXS5vZmZzZXQ9MCk7Zm9yKHZhciBiPTAsYz1kWzBdLm9mZnNldCxlPTE7ZTxhO2UrKyl7dmFyIGY9ZFtlXS5vZmZzZXQ7aWYobnVsbCE9Zil7Zm9yKHZhciBnPTE7ZzxlLWI7ZysrKWRbYitnXS5vZmZzZXQ9YysoZi1jKSpnLyhlLWIpO2I9ZSxjPWZ9fX1pZihudWxsPT1iKXJldHVybltdO3dpbmRvdy5TeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmQXJyYXkucHJvdG90eXBlLmZyb20mJmJbU3ltYm9sLml0ZXJhdG9yXSYmKGI9QXJyYXkuZnJvbShiKSksQXJyYXkuaXNBcnJheShiKXx8KGI9ZihiKSk7Zm9yKHZhciBkPWIubWFwKGZ1bmN0aW9uKGIpe3ZhciBjPXt9O2Zvcih2YXIgZCBpbiBiKXt2YXIgZj1iW2RdO2lmKCJvZmZzZXQiPT1kKXtpZihudWxsIT1mKXtpZihmPU51bWJlcihmKSwhaXNGaW5pdGUoZikpdGhyb3cgbmV3IFR5cGVFcnJvcigiS2V5ZnJhbWUgb2Zmc2V0cyBtdXN0IGJlIG51bWJlcnMuIik7aWYoZjwwfHxmPjEpdGhyb3cgbmV3IFR5cGVFcnJvcigiS2V5ZnJhbWUgb2Zmc2V0cyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMS4iKX19ZWxzZSBpZigiY29tcG9zaXRlIj09ZCl7aWYoImFkZCI9PWZ8fCJhY2N1bXVsYXRlIj09Zil0aHJvd3t0eXBlOkRPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUixuYW1lOiJOb3RTdXBwb3J0ZWRFcnJvciIsbWVzc2FnZToiYWRkIGNvbXBvc2l0aW5nIGlzIG5vdCBzdXBwb3J0ZWQifTtpZigicmVwbGFjZSIhPWYpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBjb21wb3NpdGUgbW9kZSAiK2YrIi4iKX1lbHNlIGY9ImVhc2luZyI9PWQ/YS5ub3JtYWxpemVFYXNpbmcoZik6IiIrZjtlKGQsZixjKX1yZXR1cm4gdm9pZCAwPT1jLm9mZnNldCYmKGMub2Zmc2V0PW51bGwpLHZvaWQgMD09Yy5lYXNpbmcmJihjLmVhc2luZz0ibGluZWFyIiksY30pLGc9ITAsaD0tMS8wLGk9MDtpPGQubGVuZ3RoO2krKyl7dmFyIGo9ZFtpXS5vZmZzZXQ7aWYobnVsbCE9ail7aWYoajxoKXRocm93IG5ldyBUeXBlRXJyb3IoIktleWZyYW1lcyBhcmUgbm90IGxvb3NlbHkgc29ydGVkIGJ5IG9mZnNldC4gU29ydCBvciBzcGVjaWZ5IG9mZnNldHMuIik7aD1qfWVsc2UgZz0hMX1yZXR1cm4gZD1kLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXQ+PTAmJmEub2Zmc2V0PD0xfSksZ3x8YygpLGR9dmFyIGg9e2JhY2tncm91bmQ6WyJiYWNrZ3JvdW5kSW1hZ2UiLCJiYWNrZ3JvdW5kUG9zaXRpb24iLCJiYWNrZ3JvdW5kU2l6ZSIsImJhY2tncm91bmRSZXBlYXQiLCJiYWNrZ3JvdW5kQXR0YWNobWVudCIsImJhY2tncm91bmRPcmlnaW4iLCJiYWNrZ3JvdW5kQ2xpcCIsImJhY2tncm91bmRDb2xvciJdLGJvcmRlcjpbImJvcmRlclRvcENvbG9yIiwiYm9yZGVyVG9wU3R5bGUiLCJib3JkZXJUb3BXaWR0aCIsImJvcmRlclJpZ2h0Q29sb3IiLCJib3JkZXJSaWdodFN0eWxlIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbUNvbG9yIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21XaWR0aCIsImJvcmRlckxlZnRDb2xvciIsImJvcmRlckxlZnRTdHlsZSIsImJvcmRlckxlZnRXaWR0aCJdLGJvcmRlckJvdHRvbTpbImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21Db2xvciJdLGJvcmRlckNvbG9yOlsiYm9yZGVyVG9wQ29sb3IiLCJib3JkZXJSaWdodENvbG9yIiwiYm9yZGVyQm90dG9tQ29sb3IiLCJib3JkZXJMZWZ0Q29sb3IiXSxib3JkZXJMZWZ0OlsiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyTGVmdFN0eWxlIiwiYm9yZGVyTGVmdENvbG9yIl0sYm9yZGVyUmFkaXVzOlsiYm9yZGVyVG9wTGVmdFJhZGl1cyIsImJvcmRlclRvcFJpZ2h0UmFkaXVzIiwiYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMiLCJib3JkZXJCb3R0b21MZWZ0UmFkaXVzIl0sYm9yZGVyUmlnaHQ6WyJib3JkZXJSaWdodFdpZHRoIiwiYm9yZGVyUmlnaHRTdHlsZSIsImJvcmRlclJpZ2h0Q29sb3IiXSxib3JkZXJUb3A6WyJib3JkZXJUb3BXaWR0aCIsImJvcmRlclRvcFN0eWxlIiwiYm9yZGVyVG9wQ29sb3IiXSxib3JkZXJXaWR0aDpbImJvcmRlclRvcFdpZHRoIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyTGVmdFdpZHRoIl0sZmxleDpbImZsZXhHcm93IiwiZmxleFNocmluayIsImZsZXhCYXNpcyJdLGZvbnQ6WyJmb250RmFtaWx5IiwiZm9udFNpemUiLCJmb250U3R5bGUiLCJmb250VmFyaWFudCIsImZvbnRXZWlnaHQiLCJsaW5lSGVpZ2h0Il0sbWFyZ2luOlsibWFyZ2luVG9wIiwibWFyZ2luUmlnaHQiLCJtYXJnaW5Cb3R0b20iLCJtYXJnaW5MZWZ0Il0sb3V0bGluZTpbIm91dGxpbmVDb2xvciIsIm91dGxpbmVTdHlsZSIsIm91dGxpbmVXaWR0aCJdLHBhZGRpbmc6WyJwYWRkaW5nVG9wIiwicGFkZGluZ1JpZ2h0IiwicGFkZGluZ0JvdHRvbSIsInBhZGRpbmdMZWZ0Il19LGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiZGl2Iiksaj17dGhpbjoiMXB4IixtZWRpdW06IjNweCIsdGhpY2s6IjVweCJ9LGs9e2JvcmRlckJvdHRvbVdpZHRoOmosYm9yZGVyTGVmdFdpZHRoOmosYm9yZGVyUmlnaHRXaWR0aDpqLGJvcmRlclRvcFdpZHRoOmosZm9udFNpemU6eyJ4eC1zbWFsbCI6IjYwJSIsIngtc21hbGwiOiI3NSUiLHNtYWxsOiI4OSUiLG1lZGl1bToiMTAwJSIsbGFyZ2U6IjEyMCUiLCJ4LWxhcmdlIjoiMTUwJSIsInh4LWxhcmdlIjoiMjAwJSJ9LGZvbnRXZWlnaHQ6e25vcm1hbDoiNDAwIixib2xkOiI3MDAifSxvdXRsaW5lV2lkdGg6aix0ZXh0U2hhZG93Ontub25lOiIwcHggMHB4IDBweCB0cmFuc3BhcmVudCJ9LGJveFNoYWRvdzp7bm9uZToiMHB4IDBweCAwcHggMHB4IHRyYW5zcGFyZW50In19O2EuY29udmVydFRvQXJyYXlGb3JtPWYsYS5ub3JtYWxpemVLZXlmcmFtZXM9Z30oYSksZnVuY3Rpb24oYSl7dmFyIGI9e307YS5pc0RlcHJlY2F0ZWQ9ZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGY9ZT8iYXJlIjoiaXMiLGc9bmV3IERhdGUsaD1uZXcgRGF0ZShjKTtyZXR1cm4gaC5zZXRNb250aChoLmdldE1vbnRoKCkrMyksIShnPGgmJihhIGluIGJ8fGNvbnNvbGUud2FybigiV2ViIEFuaW1hdGlvbnM6ICIrYSsiICIrZisiIGRlcHJlY2F0ZWQgYW5kIHdpbGwgc3RvcCB3b3JraW5nIG9uICIraC50b0RhdGVTdHJpbmcoKSsiLiAiK2QpLGJbYV09ITAsMSkpfSxhLmRlcHJlY2F0ZWQ9ZnVuY3Rpb24oYixjLGQsZSl7dmFyIGY9ZT8iYXJlIjoiaXMiO2lmKGEuaXNEZXByZWNhdGVkKGIsYyxkLGUpKXRocm93IG5ldyBFcnJvcihiKyIgIitmKyIgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gIitkKX19KGEpLGZ1bmN0aW9uKCl7aWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFuaW1hdGUpe3ZhciBjPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hbmltYXRlKFtdLDApLGQ9ITA7aWYoYyYmKGQ9ITEsInBsYXl8Y3VycmVudFRpbWV8cGF1c2V8cmV2ZXJzZXxwbGF5YmFja1JhdGV8Y2FuY2VsfGZpbmlzaHxzdGFydFRpbWV8cGxheVN0YXRlIi5zcGxpdCgifCIpLmZvckVhY2goZnVuY3Rpb24oYSl7dm9pZCAwPT09Y1thXSYmKGQ9ITApfSkpLCFkKXJldHVybn0hZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7Zm9yKHZhciBiPXt9LGM9MDtjPGEubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYVtjXSlpZigib2Zmc2V0IiE9ZCYmImVhc2luZyIhPWQmJiJjb21wb3NpdGUiIT1kKXt2YXIgZT17b2Zmc2V0OmFbY10ub2Zmc2V0LGVhc2luZzphW2NdLmVhc2luZyx2YWx1ZTphW2NdW2RdfTtiW2RdPWJbZF18fFtdLGJbZF0ucHVzaChlKX1mb3IodmFyIGYgaW4gYil7dmFyIGc9YltmXTtpZigwIT1nWzBdLm9mZnNldHx8MSE9Z1tnLmxlbmd0aC0xXS5vZmZzZXQpdGhyb3d7dHlwZTpET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsbmFtZToiTm90U3VwcG9ydGVkRXJyb3IiLG1lc3NhZ2U6IlBhcnRpYWwga2V5ZnJhbWVzIGFyZSBub3Qgc3VwcG9ydGVkIn19cmV0dXJuIGJ9ZnVuY3Rpb24gZShjKXt2YXIgZD1bXTtmb3IodmFyIGUgaW4gYylmb3IodmFyIGY9Y1tlXSxnPTA7ZzxmLmxlbmd0aC0xO2crKyl7dmFyIGg9ZyxpPWcrMSxqPWZbaF0ub2Zmc2V0LGs9ZltpXS5vZmZzZXQsbD1qLG09azswPT1nJiYobD0tMS8wLDA9PWsmJihpPWgpKSxnPT1mLmxlbmd0aC0yJiYobT0xLzAsMT09aiYmKGg9aSkpLGQucHVzaCh7YXBwbHlGcm9tOmwsYXBwbHlUbzptLHN0YXJ0T2Zmc2V0OmZbaF0ub2Zmc2V0LGVuZE9mZnNldDpmW2ldLm9mZnNldCxlYXNpbmdGdW5jdGlvbjphLnBhcnNlRWFzaW5nRnVuY3Rpb24oZltoXS5lYXNpbmcpLHByb3BlcnR5OmUsaW50ZXJwb2xhdGlvbjpiLnByb3BlcnR5SW50ZXJwb2xhdGlvbihlLGZbaF0udmFsdWUsZltpXS52YWx1ZSl9KX1yZXR1cm4gZC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3RhcnRPZmZzZXQtYi5zdGFydE9mZnNldH0pLGR9Yi5jb252ZXJ0RWZmZWN0SW5wdXQ9ZnVuY3Rpb24oYyl7dmFyIGY9YS5ub3JtYWxpemVLZXlmcmFtZXMoYyksZz1kKGYpLGg9ZShnKTtyZXR1cm4gZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWguZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBjPj1hLmFwcGx5RnJvbSYmYzxhLmFwcGx5VG99KS5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPWMtZC5zdGFydE9mZnNldCxmPWQuZW5kT2Zmc2V0LWQuc3RhcnRPZmZzZXQsZz0wPT1mPzA6ZC5lYXNpbmdGdW5jdGlvbihlL2YpO2IuYXBwbHkoYSxkLnByb3BlcnR5LGQuaW50ZXJwb2xhdGlvbihnKSl9KTtlbHNlIGZvcih2YXIgZCBpbiBnKSJvZmZzZXQiIT1kJiYiZWFzaW5nIiE9ZCYmImNvbXBvc2l0ZSIhPWQmJmIuY2xlYXIoYSxkKX19fShhLGIpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3JldHVybiBhLnJlcGxhY2UoLy0oLikvZyxmdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9KX1mdW5jdGlvbiBlKGEsYixjKXtoW2NdPWhbY118fFtdLGhbY10ucHVzaChbYSxiXSl9ZnVuY3Rpb24gZihhLGIsYyl7Zm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspe2UoYSxiLGQoY1tmXSkpfX1mdW5jdGlvbiBnKGMsZSxmKXt2YXIgZz1jOy8tLy50ZXN0KGMpJiYhYS5pc0RlcHJlY2F0ZWQoIkh5cGhlbmF0ZWQgcHJvcGVydHkgbmFtZXMiLCIyMDE2LTAzLTIyIiwiVXNlIGNhbWVsQ2FzZSBpbnN0ZWFkLiIsITApJiYoZz1kKGMpKSwiaW5pdGlhbCIhPWUmJiJpbml0aWFsIiE9Znx8KCJpbml0aWFsIj09ZSYmKGU9aVtnXSksImluaXRpYWwiPT1mJiYoZj1pW2ddKSk7Zm9yKHZhciBqPWU9PWY/W106aFtnXSxrPTA7aiYmazxqLmxlbmd0aDtrKyspe3ZhciBsPWpba11bMF0oZSksbT1qW2tdWzBdKGYpO2lmKHZvaWQgMCE9PWwmJnZvaWQgMCE9PW0pe3ZhciBuPWpba11bMV0obCxtKTtpZihuKXt2YXIgbz1iLkludGVycG9sYXRpb24uYXBwbHkobnVsbCxuKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIDA9PWE/ZToxPT1hP2Y6byhhKX19fX1yZXR1cm4gYi5JbnRlcnBvbGF0aW9uKCExLCEwLGZ1bmN0aW9uKGEpe3JldHVybiBhP2Y6ZX0pfXZhciBoPXt9O2IuYWRkUHJvcGVydGllc0hhbmRsZXI9Zjt2YXIgaT17YmFja2dyb3VuZENvbG9yOiJ0cmFuc3BhcmVudCIsYmFja2dyb3VuZFBvc2l0aW9uOiIwJSAwJSIsYm9yZGVyQm90dG9tQ29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyQm90dG9tTGVmdFJhZGl1czoiMHB4Iixib3JkZXJCb3R0b21SaWdodFJhZGl1czoiMHB4Iixib3JkZXJCb3R0b21XaWR0aDoiM3B4Iixib3JkZXJMZWZ0Q29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyTGVmdFdpZHRoOiIzcHgiLGJvcmRlclJpZ2h0Q29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyUmlnaHRXaWR0aDoiM3B4Iixib3JkZXJTcGFjaW5nOiIycHgiLGJvcmRlclRvcENvbG9yOiJjdXJyZW50Q29sb3IiLGJvcmRlclRvcExlZnRSYWRpdXM6IjBweCIsYm9yZGVyVG9wUmlnaHRSYWRpdXM6IjBweCIsYm9yZGVyVG9wV2lkdGg6IjNweCIsYm90dG9tOiJhdXRvIixjbGlwOiJyZWN0KDBweCwgMHB4LCAwcHgsIDBweCkiLGNvbG9yOiJibGFjayIsZm9udFNpemU6IjEwMCUiLGZvbnRXZWlnaHQ6IjQwMCIsaGVpZ2h0OiJhdXRvIixsZWZ0OiJhdXRvIixsZXR0ZXJTcGFjaW5nOiJub3JtYWwiLGxpbmVIZWlnaHQ6IjEyMCUiLG1hcmdpbkJvdHRvbToiMHB4IixtYXJnaW5MZWZ0OiIwcHgiLG1hcmdpblJpZ2h0OiIwcHgiLG1hcmdpblRvcDoiMHB4IixtYXhIZWlnaHQ6Im5vbmUiLG1heFdpZHRoOiJub25lIixtaW5IZWlnaHQ6IjBweCIsbWluV2lkdGg6IjBweCIsb3BhY2l0eToiMS4wIixvdXRsaW5lQ29sb3I6ImludmVydCIsb3V0bGluZU9mZnNldDoiMHB4IixvdXRsaW5lV2lkdGg6IjNweCIscGFkZGluZ0JvdHRvbToiMHB4IixwYWRkaW5nTGVmdDoiMHB4IixwYWRkaW5nUmlnaHQ6IjBweCIscGFkZGluZ1RvcDoiMHB4IixyaWdodDoiYXV0byIsc3Ryb2tlRGFzaGFycmF5OiJub25lIixzdHJva2VEYXNob2Zmc2V0OiIwcHgiLHRleHRJbmRlbnQ6IjBweCIsdGV4dFNoYWRvdzoiMHB4IDBweCAwcHggdHJhbnNwYXJlbnQiLHRvcDoiYXV0byIsdHJhbnNmb3JtOiIiLHZlcnRpY2FsQWxpZ246IjBweCIsdmlzaWJpbGl0eToidmlzaWJsZSIsd2lkdGg6ImF1dG8iLHdvcmRTcGFjaW5nOiJub3JtYWwiLHpJbmRleDoiYXV0byJ9O2IucHJvcGVydHlJbnRlcnBvbGF0aW9uPWd9KGEsYiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYil7dmFyIGM9YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihiKSxkPWZ1bmN0aW9uKGQpe3JldHVybiBhLmNhbGN1bGF0ZUl0ZXJhdGlvblByb2dyZXNzKGMsZCxiKX07cmV0dXJuIGQuX3RvdGFsRHVyYXRpb249Yi5kZWxheStjK2IuZW5kRGVsYXksZH1iLktleWZyYW1lRWZmZWN0PWZ1bmN0aW9uKGMsZSxmLGcpe3ZhciBoLGk9ZChhLm5vcm1hbGl6ZVRpbWluZ0lucHV0KGYpKSxqPWIuY29udmVydEVmZmVjdElucHV0KGUpLGs9ZnVuY3Rpb24oKXtqKGMsaCl9O3JldHVybiBrLl91cGRhdGU9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPT0oaD1pKGEpKX0say5fY2xlYXI9ZnVuY3Rpb24oKXtqKGMsbnVsbCl9LGsuX2hhc1NhbWVUYXJnZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGM9PT1hfSxrLl90YXJnZXQ9YyxrLl90b3RhbER1cmF0aW9uPWkuX3RvdGFsRHVyYXRpb24say5faWQ9ZyxrfX0oYSxiKSxmdW5jdGlvbihhLGIpe2EuYXBwbHk9ZnVuY3Rpb24oYixjLGQpe2Iuc3R5bGVbYS5wcm9wZXJ0eU5hbWUoYyldPWR9LGEuY2xlYXI9ZnVuY3Rpb24oYixjKXtiLnN0eWxlW2EucHJvcGVydHlOYW1lKGMpXT0iIn19KGIpLGZ1bmN0aW9uKGEpe3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9IiI7cmV0dXJuIGMmJmMuaWQmJihkPWMuaWQpLGEudGltZWxpbmUuX3BsYXkoYS5LZXlmcmFtZUVmZmVjdCh0aGlzLGIsYyxkKSl9fShiKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiLGQpe2lmKCJudW1iZXIiPT10eXBlb2YgYSYmIm51bWJlciI9PXR5cGVvZiBiKXJldHVybiBhKigxLWQpK2IqZDtpZigiYm9vbGVhbiI9PXR5cGVvZiBhJiYiYm9vbGVhbiI9PXR5cGVvZiBiKXJldHVybiBkPC41P2E6YjtpZihhLmxlbmd0aD09Yi5sZW5ndGgpe2Zvcih2YXIgZT1bXSxmPTA7ZjxhLmxlbmd0aDtmKyspZS5wdXNoKGMoYVtmXSxiW2ZdLGQpKTtyZXR1cm4gZX10aHJvdyJNaXNtYXRjaGVkIGludGVycG9sYXRpb24gYXJndW1lbnRzICIrYSsiOiIrYn1hLkludGVycG9sYXRpb249ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZChjKGEsYixlKSl9fX0oYiksZnVuY3Rpb24oYSxiLGMpe2Euc2VxdWVuY2VOdW1iZXI9MDt2YXIgZD1mdW5jdGlvbihhLGIsYyl7dGhpcy50YXJnZXQ9YSx0aGlzLmN1cnJlbnRUaW1lPWIsdGhpcy50aW1lbGluZVRpbWU9Yyx0aGlzLnR5cGU9ImZpbmlzaCIsdGhpcy5idWJibGVzPSExLHRoaXMuY2FuY2VsYWJsZT0hMSx0aGlzLmN1cnJlbnRUYXJnZXQ9YSx0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITEsdGhpcy5ldmVudFBoYXNlPUV2ZW50LkFUX1RBUkdFVCx0aGlzLnRpbWVTdGFtcD1EYXRlLm5vdygpfTtiLkFuaW1hdGlvbj1mdW5jdGlvbihiKXt0aGlzLmlkPSIiLGImJmIuX2lkJiYodGhpcy5pZD1iLl9pZCksdGhpcy5fc2VxdWVuY2VOdW1iZXI9YS5zZXF1ZW5jZU51bWJlcisrLHRoaXMuX2N1cnJlbnRUaW1lPTAsdGhpcy5fc3RhcnRUaW1lPW51bGwsdGhpcy5fcGF1c2VkPSExLHRoaXMuX3BsYXliYWNrUmF0ZT0xLHRoaXMuX2luVGltZWxpbmU9ITAsdGhpcy5fZmluaXNoZWRGbGFnPSEwLHRoaXMub25maW5pc2g9bnVsbCx0aGlzLl9maW5pc2hIYW5kbGVycz1bXSx0aGlzLl9lZmZlY3Q9Yix0aGlzLl9pbkVmZmVjdD10aGlzLl9lZmZlY3QuX3VwZGF0ZSgwKSx0aGlzLl9pZGxlPSEwLHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz0hMX0sYi5BbmltYXRpb24ucHJvdG90eXBlPXtfZW5zdXJlQWxpdmU6ZnVuY3Rpb24oKXt0aGlzLnBsYXliYWNrUmF0ZTwwJiYwPT09dGhpcy5jdXJyZW50VGltZT90aGlzLl9pbkVmZmVjdD10aGlzLl9lZmZlY3QuX3VwZGF0ZSgtMSk6dGhpcy5faW5FZmZlY3Q9dGhpcy5fZWZmZWN0Ll91cGRhdGUodGhpcy5jdXJyZW50VGltZSksdGhpcy5faW5UaW1lbGluZXx8IXRoaXMuX2luRWZmZWN0JiZ0aGlzLl9maW5pc2hlZEZsYWd8fCh0aGlzLl9pblRpbWVsaW5lPSEwLGIudGltZWxpbmUuX2FuaW1hdGlvbnMucHVzaCh0aGlzKSl9LF90aWNrQ3VycmVudFRpbWU6ZnVuY3Rpb24oYSxiKXthIT10aGlzLl9jdXJyZW50VGltZSYmKHRoaXMuX2N1cnJlbnRUaW1lPWEsdGhpcy5faXNGaW5pc2hlZCYmIWImJih0aGlzLl9jdXJyZW50VGltZT10aGlzLl9wbGF5YmFja1JhdGU+MD90aGlzLl90b3RhbER1cmF0aW9uOjApLHRoaXMuX2Vuc3VyZUFsaXZlKCkpfSxnZXQgY3VycmVudFRpbWUoKXtyZXR1cm4gdGhpcy5faWRsZXx8dGhpcy5fY3VycmVudFRpbWVQZW5kaW5nP251bGw6dGhpcy5fY3VycmVudFRpbWV9LHNldCBjdXJyZW50VGltZShhKXthPSthLGlzTmFOKGEpfHwoYi5yZXN0YXJ0KCksdGhpcy5fcGF1c2VkfHxudWxsPT10aGlzLl9zdGFydFRpbWV8fCh0aGlzLl9zdGFydFRpbWU9dGhpcy5fdGltZWxpbmUuY3VycmVudFRpbWUtYS90aGlzLl9wbGF5YmFja1JhdGUpLHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz0hMSx0aGlzLl9jdXJyZW50VGltZSE9YSYmKHRoaXMuX2lkbGUmJih0aGlzLl9pZGxlPSExLHRoaXMuX3BhdXNlZD0hMCksdGhpcy5fdGlja0N1cnJlbnRUaW1lKGEsITApLGIuYXBwbHlEaXJ0aWVkQW5pbWF0aW9uKHRoaXMpKSl9LGdldCBzdGFydFRpbWUoKXtyZXR1cm4gdGhpcy5fc3RhcnRUaW1lfSxzZXQgc3RhcnRUaW1lKGEpe2E9K2EsaXNOYU4oYSl8fHRoaXMuX3BhdXNlZHx8dGhpcy5faWRsZXx8KHRoaXMuX3N0YXJ0VGltZT1hLHRoaXMuX3RpY2tDdXJyZW50VGltZSgodGhpcy5fdGltZWxpbmUuY3VycmVudFRpbWUtdGhpcy5fc3RhcnRUaW1lKSp0aGlzLnBsYXliYWNrUmF0ZSksYi5hcHBseURpcnRpZWRBbmltYXRpb24odGhpcykpfSxnZXQgcGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMuX3BsYXliYWNrUmF0ZX0sc2V0IHBsYXliYWNrUmF0ZShhKXtpZihhIT10aGlzLl9wbGF5YmFja1JhdGUpe3ZhciBjPXRoaXMuY3VycmVudFRpbWU7dGhpcy5fcGxheWJhY2tSYXRlPWEsdGhpcy5fc3RhcnRUaW1lPW51bGwsInBhdXNlZCIhPXRoaXMucGxheVN0YXRlJiYiaWRsZSIhPXRoaXMucGxheVN0YXRlJiYodGhpcy5fZmluaXNoZWRGbGFnPSExLHRoaXMuX2lkbGU9ITEsdGhpcy5fZW5zdXJlQWxpdmUoKSxiLmFwcGx5RGlydGllZEFuaW1hdGlvbih0aGlzKSksbnVsbCE9YyYmKHRoaXMuY3VycmVudFRpbWU9Yyl9fSxnZXQgX2lzRmluaXNoZWQoKXtyZXR1cm4hdGhpcy5faWRsZSYmKHRoaXMuX3BsYXliYWNrUmF0ZT4wJiZ0aGlzLl9jdXJyZW50VGltZT49dGhpcy5fdG90YWxEdXJhdGlvbnx8dGhpcy5fcGxheWJhY2tSYXRlPDAmJnRoaXMuX2N1cnJlbnRUaW1lPD0wKX0sZ2V0IF90b3RhbER1cmF0aW9uKCl7cmV0dXJuIHRoaXMuX2VmZmVjdC5fdG90YWxEdXJhdGlvbn0sZ2V0IHBsYXlTdGF0ZSgpe3JldHVybiB0aGlzLl9pZGxlPyJpZGxlIjpudWxsPT10aGlzLl9zdGFydFRpbWUmJiF0aGlzLl9wYXVzZWQmJjAhPXRoaXMucGxheWJhY2tSYXRlfHx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc/InBlbmRpbmciOnRoaXMuX3BhdXNlZD8icGF1c2VkIjp0aGlzLl9pc0ZpbmlzaGVkPyJmaW5pc2hlZCI6InJ1bm5pbmcifSxfcmV3aW5kOmZ1bmN0aW9uKCl7aWYodGhpcy5fcGxheWJhY2tSYXRlPj0wKXRoaXMuX2N1cnJlbnRUaW1lPTA7ZWxzZXtpZighKHRoaXMuX3RvdGFsRHVyYXRpb248MS8wKSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJVbmFibGUgdG8gcmV3aW5kIG5lZ2F0aXZlIHBsYXliYWNrIHJhdGUgYW5pbWF0aW9uIHdpdGggaW5maW5pdGUgZHVyYXRpb24iLCJJbnZhbGlkU3RhdGVFcnJvciIpO3RoaXMuX2N1cnJlbnRUaW1lPXRoaXMuX3RvdGFsRHVyYXRpb259fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5fcGF1c2VkPSExLCh0aGlzLl9pc0ZpbmlzaGVkfHx0aGlzLl9pZGxlKSYmKHRoaXMuX3Jld2luZCgpLHRoaXMuX3N0YXJ0VGltZT1udWxsKSx0aGlzLl9maW5pc2hlZEZsYWc9ITEsdGhpcy5faWRsZT0hMSx0aGlzLl9lbnN1cmVBbGl2ZSgpLGIuYXBwbHlEaXJ0aWVkQW5pbWF0aW9uKHRoaXMpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuX2lzRmluaXNoZWR8fHRoaXMuX3BhdXNlZHx8dGhpcy5faWRsZT90aGlzLl9pZGxlJiYodGhpcy5fcmV3aW5kKCksdGhpcy5faWRsZT0hMSk6dGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSEwLHRoaXMuX3N0YXJ0VGltZT1udWxsLHRoaXMuX3BhdXNlZD0hMH0sZmluaXNoOmZ1bmN0aW9uKCl7dGhpcy5faWRsZXx8KHRoaXMuY3VycmVudFRpbWU9dGhpcy5fcGxheWJhY2tSYXRlPjA/dGhpcy5fdG90YWxEdXJhdGlvbjowLHRoaXMuX3N0YXJ0VGltZT10aGlzLl90b3RhbER1cmF0aW9uLXRoaXMuY3VycmVudFRpbWUsdGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSExLGIuYXBwbHlEaXJ0aWVkQW5pbWF0aW9uKHRoaXMpKX0sY2FuY2VsOmZ1bmN0aW9uKCl7dGhpcy5faW5FZmZlY3QmJih0aGlzLl9pbkVmZmVjdD0hMSx0aGlzLl9pZGxlPSEwLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9maW5pc2hlZEZsYWc9ITAsdGhpcy5fY3VycmVudFRpbWU9MCx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLl9lZmZlY3QuX3VwZGF0ZShudWxsKSxiLmFwcGx5RGlydGllZEFuaW1hdGlvbih0aGlzKSl9LHJldmVyc2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXliYWNrUmF0ZSo9LTEsdGhpcy5wbGF5KCl9LGFkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXsiZnVuY3Rpb24iPT10eXBlb2YgYiYmImZpbmlzaCI9PWEmJnRoaXMuX2ZpbmlzaEhhbmRsZXJzLnB1c2goYil9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXtpZigiZmluaXNoIj09YSl7dmFyIGM9dGhpcy5fZmluaXNoSGFuZGxlcnMuaW5kZXhPZihiKTtjPj0wJiZ0aGlzLl9maW5pc2hIYW5kbGVycy5zcGxpY2UoYywxKX19LF9maXJlRXZlbnRzOmZ1bmN0aW9uKGEpe2lmKHRoaXMuX2lzRmluaXNoZWQpe2lmKCF0aGlzLl9maW5pc2hlZEZsYWcpe3ZhciBiPW5ldyBkKHRoaXMsdGhpcy5fY3VycmVudFRpbWUsYSksYz10aGlzLl9maW5pc2hIYW5kbGVycy5jb25jYXQodGhpcy5vbmZpbmlzaD9bdGhpcy5vbmZpbmlzaF06W10pO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtjLmZvckVhY2goZnVuY3Rpb24oYSl7YS5jYWxsKGIudGFyZ2V0LGIpfSl9LDApLHRoaXMuX2ZpbmlzaGVkRmxhZz0hMH19ZWxzZSB0aGlzLl9maW5pc2hlZEZsYWc9ITF9LF90aWNrOmZ1bmN0aW9uKGEsYil7dGhpcy5faWRsZXx8dGhpcy5fcGF1c2VkfHwobnVsbD09dGhpcy5fc3RhcnRUaW1lP2ImJih0aGlzLnN0YXJ0VGltZT1hLXRoaXMuX2N1cnJlbnRUaW1lL3RoaXMucGxheWJhY2tSYXRlKTp0aGlzLl9pc0ZpbmlzaGVkfHx0aGlzLl90aWNrQ3VycmVudFRpbWUoKGEtdGhpcy5fc3RhcnRUaW1lKSp0aGlzLnBsYXliYWNrUmF0ZSkpLGImJih0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITEsdGhpcy5fZmlyZUV2ZW50cyhhKSl9LGdldCBfbmVlZHNUaWNrKCl7cmV0dXJuIHRoaXMucGxheVN0YXRlIGlue3BlbmRpbmc6MSxydW5uaW5nOjF9fHwhdGhpcy5fZmluaXNoZWRGbGFnfSxfdGFyZ2V0QW5pbWF0aW9uczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2VmZmVjdC5fdGFyZ2V0O3JldHVybiBhLl9hY3RpdmVBbmltYXRpb25zfHwoYS5fYWN0aXZlQW5pbWF0aW9ucz1bXSksYS5fYWN0aXZlQW5pbWF0aW9uc30sX21hcmtUYXJnZXQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl90YXJnZXRBbmltYXRpb25zKCk7LTE9PT1hLmluZGV4T2YodGhpcykmJmEucHVzaCh0aGlzKX0sX3VubWFya1RhcmdldDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX3RhcmdldEFuaW1hdGlvbnMoKSxiPWEuaW5kZXhPZih0aGlzKTstMSE9PWImJmEuc3BsaWNlKGIsMSl9fX0oYSxiKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXt2YXIgYj1qO2o9W10sYTxxLmN1cnJlbnRUaW1lJiYoYT1xLmN1cnJlbnRUaW1lKSxxLl9hbmltYXRpb25zLnNvcnQoZSkscS5fYW5pbWF0aW9ucz1oKGEsITAscS5fYW5pbWF0aW9ucylbMF0sYi5mb3JFYWNoKGZ1bmN0aW9uKGIpe2JbMV0oYSl9KSxnKCksbD12b2lkIDB9ZnVuY3Rpb24gZShhLGIpe3JldHVybiBhLl9zZXF1ZW5jZU51bWJlci1iLl9zZXF1ZW5jZU51bWJlcn1mdW5jdGlvbiBmKCl7dGhpcy5fYW5pbWF0aW9ucz1bXSx0aGlzLmN1cnJlbnRUaW1lPXdpbmRvdy5wZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlLm5vdygpOjB9ZnVuY3Rpb24gZygpe28uZm9yRWFjaChmdW5jdGlvbihhKXthKCl9KSxvLmxlbmd0aD0wfWZ1bmN0aW9uIGgoYSxjLGQpe3A9ITAsbj0hMSxiLnRpbWVsaW5lLmN1cnJlbnRUaW1lPWEsbT0hMTt2YXIgZT1bXSxmPVtdLGc9W10saD1bXTtyZXR1cm4gZC5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IuX3RpY2soYSxjKSxiLl9pbkVmZmVjdD8oZi5wdXNoKGIuX2VmZmVjdCksYi5fbWFya1RhcmdldCgpKTooZS5wdXNoKGIuX2VmZmVjdCksYi5fdW5tYXJrVGFyZ2V0KCkpLGIuX25lZWRzVGljayYmKG09ITApO3ZhciBkPWIuX2luRWZmZWN0fHxiLl9uZWVkc1RpY2s7Yi5faW5UaW1lbGluZT1kLGQ/Zy5wdXNoKGIpOmgucHVzaChiKX0pLG8ucHVzaC5hcHBseShvLGUpLG8ucHVzaC5hcHBseShvLGYpLG0mJnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe30pLHA9ITEsW2csaF19dmFyIGk9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSxqPVtdLGs9MDt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKGEpe3ZhciBiPWsrKztyZXR1cm4gMD09ai5sZW5ndGgmJmkoZCksai5wdXNoKFtiLGFdKSxifSx3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7ai5mb3JFYWNoKGZ1bmN0aW9uKGIpe2JbMF09PWEmJihiWzFdPWZ1bmN0aW9uKCl7fSl9KX0sZi5wcm90b3R5cGU9e19wbGF5OmZ1bmN0aW9uKGMpe2MuX3RpbWluZz1hLm5vcm1hbGl6ZVRpbWluZ0lucHV0KGMudGltaW5nKTt2YXIgZD1uZXcgYi5BbmltYXRpb24oYyk7cmV0dXJuIGQuX2lkbGU9ITEsZC5fdGltZWxpbmU9dGhpcyx0aGlzLl9hbmltYXRpb25zLnB1c2goZCksYi5yZXN0YXJ0KCksYi5hcHBseURpcnRpZWRBbmltYXRpb24oZCksZH19O3ZhciBsPXZvaWQgMCxtPSExLG49ITE7Yi5yZXN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIG18fChtPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe30pLG49ITApLG59LGIuYXBwbHlEaXJ0aWVkQW5pbWF0aW9uPWZ1bmN0aW9uKGEpe2lmKCFwKXthLl9tYXJrVGFyZ2V0KCk7dmFyIGM9YS5fdGFyZ2V0QW5pbWF0aW9ucygpO2Muc29ydChlKSxoKGIudGltZWxpbmUuY3VycmVudFRpbWUsITEsYy5zbGljZSgpKVsxXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPXEuX2FuaW1hdGlvbnMuaW5kZXhPZihhKTstMSE9PWImJnEuX2FuaW1hdGlvbnMuc3BsaWNlKGIsMSl9KSxnKCl9fTt2YXIgbz1bXSxwPSExLHE9bmV3IGY7Yi50aW1lbGluZT1xfShhLGIpLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz1hLmV4ZWMoYik7aWYoYylyZXR1cm4gYz1hLmlnbm9yZUNhc2U/Y1swXS50b0xvd2VyQ2FzZSgpOmNbMF0sW2MsYi5zdWJzdHIoYy5sZW5ndGgpXX1mdW5jdGlvbiBjKGEsYil7Yj1iLnJlcGxhY2UoL15ccyovLCIiKTt2YXIgYz1hKGIpO2lmKGMpcmV0dXJuW2NbMF0sY1sxXS5yZXBsYWNlKC9eXHMqLywiIildfWZ1bmN0aW9uIGQoYSxkLGUpe2E9Yy5iaW5kKG51bGwsYSk7Zm9yKHZhciBmPVtdOzspe3ZhciBnPWEoZSk7aWYoIWcpcmV0dXJuW2YsZV07aWYoZi5wdXNoKGdbMF0pLGU9Z1sxXSwhKGc9YihkLGUpKXx8IiI9PWdbMV0pcmV0dXJuW2YsZV07ZT1nWzFdfX1mdW5jdGlvbiBlKGEsYil7Zm9yKHZhciBjPTAsZD0wO2Q8Yi5sZW5ndGgmJighL1xzfCwvLnRlc3QoYltkXSl8fDAhPWMpO2QrKylpZigiKCI9PWJbZF0pYysrO2Vsc2UgaWYoIikiPT1iW2RdJiYoYy0tLDA9PWMmJmQrKyxjPD0wKSlicmVhazt2YXIgZT1hKGIuc3Vic3RyKDAsZCkpO3JldHVybiB2b2lkIDA9PWU/dm9pZCAwOltlLGIuc3Vic3RyKGQpXX1mdW5jdGlvbiBmKGEsYil7Zm9yKHZhciBjPWEsZD1iO2MmJmQ7KWM+ZD9jJT1kOmQlPWM7cmV0dXJuIGM9YSpiLyhjK2QpfWZ1bmN0aW9uIGcoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWEoYik7cmV0dXJuIGMmJihjWzBdPXZvaWQgMCksY319ZnVuY3Rpb24gaChhLGIpe3JldHVybiBmdW5jdGlvbihjKXtyZXR1cm4gYShjKXx8W2IsY119fWZ1bmN0aW9uIGkoYixjKXtmb3IodmFyIGQ9W10sZT0wO2U8Yi5sZW5ndGg7ZSsrKXt2YXIgZj1hLmNvbnN1bWVUcmltbWVkKGJbZV0sYyk7aWYoIWZ8fCIiPT1mWzBdKXJldHVybjt2b2lkIDAhPT1mWzBdJiZkLnB1c2goZlswXSksYz1mWzFdfWlmKCIiPT1jKXJldHVybiBkfWZ1bmN0aW9uIGooYSxiLGMsZCxlKXtmb3IodmFyIGc9W10saD1bXSxpPVtdLGo9ZihkLmxlbmd0aCxlLmxlbmd0aCksaz0wO2s8ajtrKyspe3ZhciBsPWIoZFtrJWQubGVuZ3RoXSxlW2slZS5sZW5ndGhdKTtpZighbClyZXR1cm47Zy5wdXNoKGxbMF0pLGgucHVzaChsWzFdKSxpLnB1c2gobFsyXSl9cmV0dXJuW2csaCxmdW5jdGlvbihiKXt2YXIgZD1iLm1hcChmdW5jdGlvbihhLGIpe3JldHVybiBpW2JdKGEpfSkuam9pbihjKTtyZXR1cm4gYT9hKGQpOmR9XX1mdW5jdGlvbiBrKGEsYixjKXtmb3IodmFyIGQ9W10sZT1bXSxmPVtdLGc9MCxoPTA7aDxjLmxlbmd0aDtoKyspaWYoImZ1bmN0aW9uIj09dHlwZW9mIGNbaF0pe3ZhciBpPWNbaF0oYVtnXSxiW2crK10pO2QucHVzaChpWzBdKSxlLnB1c2goaVsxXSksZi5wdXNoKGlbMl0pfWVsc2UhZnVuY3Rpb24oYSl7ZC5wdXNoKCExKSxlLnB1c2goITEpLGYucHVzaChmdW5jdGlvbigpe3JldHVybiBjW2FdfSl9KGgpO3JldHVybltkLGUsZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKyliKz1mW2NdKGFbY10pO3JldHVybiBifV19YS5jb25zdW1lVG9rZW49YixhLmNvbnN1bWVUcmltbWVkPWMsYS5jb25zdW1lUmVwZWF0ZWQ9ZCxhLmNvbnN1bWVQYXJlbnRoZXNpc2VkPWUsYS5pZ25vcmU9ZyxhLm9wdGlvbmFsPWgsYS5jb25zdW1lTGlzdD1pLGEubWVyZ2VOZXN0ZWRSZXBlYXRlZD1qLmJpbmQobnVsbCxudWxsKSxhLm1lcmdlV3JhcHBlZE5lc3RlZFJlcGVhdGVkPWosYS5tZXJnZUxpc3Q9a30oYiksZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiKXtmdW5jdGlvbiBjKGIpe3ZhciBjPWEuY29uc3VtZVRva2VuKC9eaW5zZXQvaSxiKTtyZXR1cm4gYz8oZC5pbnNldD0hMCxjKTooYz1hLmNvbnN1bWVMZW5ndGhPclBlcmNlbnQoYikpPyhkLmxlbmd0aHMucHVzaChjWzBdKSxjKTooYz1hLmNvbnN1bWVDb2xvcihiKSxjPyhkLmNvbG9yPWNbMF0sYyk6dm9pZCAwKX12YXIgZD17aW5zZXQ6ITEsbGVuZ3RoczpbXSxjb2xvcjpudWxsfSxlPWEuY29uc3VtZVJlcGVhdGVkKGMsL14vLGIpO2lmKGUmJmVbMF0ubGVuZ3RoKXJldHVybltkLGVbMV1dfWZ1bmN0aW9uIGMoYyl7dmFyIGQ9YS5jb25zdW1lUmVwZWF0ZWQoYiwvXiwvLGMpO2lmKGQmJiIiPT1kWzFdKXJldHVybiBkWzBdfWZ1bmN0aW9uIGQoYixjKXtmb3IoO2IubGVuZ3Rocy5sZW5ndGg8TWF0aC5tYXgoYi5sZW5ndGhzLmxlbmd0aCxjLmxlbmd0aHMubGVuZ3RoKTspYi5sZW5ndGhzLnB1c2goe3B4OjB9KTtmb3IoO2MubGVuZ3Rocy5sZW5ndGg8TWF0aC5tYXgoYi5sZW5ndGhzLmxlbmd0aCxjLmxlbmd0aHMubGVuZ3RoKTspYy5sZW5ndGhzLnB1c2goe3B4OjB9KTtpZihiLmluc2V0PT1jLmluc2V0JiYhIWIuY29sb3I9PSEhYy5jb2xvcil7Zm9yKHZhciBkLGU9W10sZj1bW10sMF0sZz1bW10sMF0saD0wO2g8Yi5sZW5ndGhzLmxlbmd0aDtoKyspe3ZhciBpPWEubWVyZ2VEaW1lbnNpb25zKGIubGVuZ3Roc1toXSxjLmxlbmd0aHNbaF0sMj09aCk7ZlswXS5wdXNoKGlbMF0pLGdbMF0ucHVzaChpWzFdKSxlLnB1c2goaVsyXSl9aWYoYi5jb2xvciYmYy5jb2xvcil7dmFyIGo9YS5tZXJnZUNvbG9ycyhiLmNvbG9yLGMuY29sb3IpO2ZbMV09alswXSxnWzFdPWpbMV0sZD1qWzJdfXJldHVybltmLGcsZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWIuaW5zZXQ/Imluc2V0ICI6IiAiLGY9MDtmPGUubGVuZ3RoO2YrKyljKz1lW2ZdKGFbMF1bZl0pKyIgIjtyZXR1cm4gZCYmKGMrPWQoYVsxXSkpLGN9XX19ZnVuY3Rpb24gZShiLGMsZCxlKXtmdW5jdGlvbiBmKGEpe3JldHVybntpbnNldDphLGNvbG9yOlswLDAsMCwwXSxsZW5ndGhzOlt7cHg6MH0se3B4OjB9LHtweDowfSx7cHg6MH1dfX1mb3IodmFyIGc9W10saD1bXSxpPTA7aTxkLmxlbmd0aHx8aTxlLmxlbmd0aDtpKyspe3ZhciBqPWRbaV18fGYoZVtpXS5pbnNldCksaz1lW2ldfHxmKGRbaV0uaW5zZXQpO2cucHVzaChqKSxoLnB1c2goayl9cmV0dXJuIGEubWVyZ2VOZXN0ZWRSZXBlYXRlZChiLGMsZyxoKX12YXIgZj1lLmJpbmQobnVsbCxkLCIsICIpO2EuYWRkUHJvcGVydGllc0hhbmRsZXIoYyxmLFsiYm94LXNoYWRvdyIsInRleHQtc2hhZG93Il0pfShiKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIGEudG9GaXhlZCgzKS5yZXBsYWNlKC8wKyQvLCIiKS5yZXBsYWNlKC9cLiQvLCIiKX1mdW5jdGlvbiBkKGEsYixjKXtyZXR1cm4gTWF0aC5taW4oYixNYXRoLm1heChhLGMpKX1mdW5jdGlvbiBlKGEpe2lmKC9eXHMqWy0rXT8oXGQqXC4pP1xkK1xzKiQvLnRlc3QoYSkpcmV0dXJuIE51bWJlcihhKX1mdW5jdGlvbiBmKGEsYil7cmV0dXJuW2EsYixjXX1mdW5jdGlvbiBnKGEsYil7aWYoMCE9YSlyZXR1cm4gaSgwLDEvMCkoYSxiKX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuW2EsYixmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChkKDEsMS8wLGEpKX1dfWZ1bmN0aW9uIGkoYSxiKXtyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm5bZSxmLGZ1bmN0aW9uKGUpe3JldHVybiBjKGQoYSxiLGUpKX1dfX1mdW5jdGlvbiBqKGEpe3ZhciBiPWEudHJpbSgpLnNwbGl0KC9ccypbXHMsXVxzKi8pO2lmKDAhPT1iLmxlbmd0aCl7Zm9yKHZhciBjPVtdLGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGY9ZShiW2RdKTtpZih2b2lkIDA9PT1mKXJldHVybjtjLnB1c2goZil9cmV0dXJuIGN9fWZ1bmN0aW9uIGsoYSxiKXtpZihhLmxlbmd0aD09Yi5sZW5ndGgpcmV0dXJuW2EsYixmdW5jdGlvbihhKXtyZXR1cm4gYS5tYXAoYykuam9pbigiICIpfV19ZnVuY3Rpb24gbChhLGIpe3JldHVyblthLGIsTWF0aC5yb3VuZF19YS5jbGFtcD1kLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoaixrLFsic3Ryb2tlLWRhc2hhcnJheSJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsaSgwLDEvMCksWyJib3JkZXItaW1hZ2Utd2lkdGgiLCJsaW5lLWhlaWdodCJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsaSgwLDEpLFsib3BhY2l0eSIsInNoYXBlLWltYWdlLXRocmVzaG9sZCJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsZyxbImZsZXgtZ3JvdyIsImZsZXgtc2hyaW5rIl0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoZSxoLFsib3JwaGFucyIsIndpZG93cyJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsbCxbInotaW5kZXgiXSksYS5wYXJzZU51bWJlcj1lLGEucGFyc2VOdW1iZXJMaXN0PWosYS5tZXJnZU51bWJlcnM9ZixhLm51bWJlclRvU3RyaW5nPWN9KGIpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKCJ2aXNpYmxlIj09YXx8InZpc2libGUiPT1iKXJldHVyblswLDEsZnVuY3Rpb24oYyl7cmV0dXJuIGM8PTA/YTpjPj0xP2I6InZpc2libGUifV19YS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihTdHJpbmcsYyxbInZpc2liaWxpdHkiXSl9KGIpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXthPWEudHJpbSgpLGYuZmlsbFN0eWxlPSIjMDAwIixmLmZpbGxTdHlsZT1hO3ZhciBiPWYuZmlsbFN0eWxlO2lmKGYuZmlsbFN0eWxlPSIjZmZmIixmLmZpbGxTdHlsZT1hLGI9PWYuZmlsbFN0eWxlKXtmLmZpbGxSZWN0KDAsMCwxLDEpO3ZhciBjPWYuZ2V0SW1hZ2VEYXRhKDAsMCwxLDEpLmRhdGE7Zi5jbGVhclJlY3QoMCwwLDEsMSk7dmFyIGQ9Y1szXS8yNTU7cmV0dXJuW2NbMF0qZCxjWzFdKmQsY1syXSpkLGRdfX1mdW5jdGlvbiBkKGIsYyl7cmV0dXJuW2IsYyxmdW5jdGlvbihiKXtmdW5jdGlvbiBjKGEpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDI1NSxhKSl9aWYoYlszXSlmb3IodmFyIGQ9MDtkPDM7ZCsrKWJbZF09TWF0aC5yb3VuZChjKGJbZF0vYlszXSkpO3JldHVybiBiWzNdPWEubnVtYmVyVG9TdHJpbmcoYS5jbGFtcCgwLDEsYlszXSkpLCJyZ2JhKCIrYi5qb2luKCIsIikrIikifV19dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiY2FudmFzIik7ZS53aWR0aD1lLmhlaWdodD0xO3ZhciBmPWUuZ2V0Q29udGV4dCgiMmQiKTthLmFkZFByb3BlcnRpZXNIYW5kbGVyKGMsZCxbImJhY2tncm91bmQtY29sb3IiLCJib3JkZXItYm90dG9tLWNvbG9yIiwiYm9yZGVyLWxlZnQtY29sb3IiLCJib3JkZXItcmlnaHQtY29sb3IiLCJib3JkZXItdG9wLWNvbG9yIiwiY29sb3IiLCJmaWxsIiwiZmxvb2QtY29sb3IiLCJsaWdodGluZy1jb2xvciIsIm91dGxpbmUtY29sb3IiLCJzdG9wLWNvbG9yIiwic3Ryb2tlIiwidGV4dC1kZWNvcmF0aW9uLWNvbG9yIl0pLGEuY29uc3VtZUNvbG9yPWEuY29uc3VtZVBhcmVudGhlc2lzZWQuYmluZChudWxsLGMpLGEubWVyZ2VDb2xvcnM9ZH0oYiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe2Z1bmN0aW9uIGIoKXt2YXIgYj1oLmV4ZWMoYSk7Zz1iP2JbMF06dm9pZCAwfWZ1bmN0aW9uIGMoKXt2YXIgYT1OdW1iZXIoZyk7cmV0dXJuIGIoKSxhfWZ1bmN0aW9uIGQoKXtpZigiKCIhPT1nKXJldHVybiBjKCk7YigpO3ZhciBhPWYoKTtyZXR1cm4iKSIhPT1nP05hTjooYigpLGEpfWZ1bmN0aW9uIGUoKXtmb3IodmFyIGE9ZCgpOyIqIj09PWd8fCIvIj09PWc7KXt2YXIgYz1nO2IoKTt2YXIgZT1kKCk7IioiPT09Yz9hKj1lOmEvPWV9cmV0dXJuIGF9ZnVuY3Rpb24gZigpe2Zvcih2YXIgYT1lKCk7IisiPT09Z3x8Ii0iPT09Zzspe3ZhciBjPWc7YigpO3ZhciBkPWUoKTsiKyI9PT1jP2ErPWQ6YS09ZH1yZXR1cm4gYX12YXIgZyxoPS8oW1wrXC1cd1wuXSt8W1woXClcKlwvXSkvZztyZXR1cm4gYigpLGYoKX1mdW5jdGlvbiBkKGEsYil7aWYoIjAiPT0oYj1iLnRyaW0oKS50b0xvd2VyQ2FzZSgpKSYmInB4Ii5zZWFyY2goYSk+PTApcmV0dXJue3B4OjB9O2lmKC9eW14oXSokfF5jYWxjLy50ZXN0KGIpKXtiPWIucmVwbGFjZSgvY2FsY1woL2csIigiKTt2YXIgZD17fTtiPWIucmVwbGFjZShhLGZ1bmN0aW9uKGEpe3JldHVybiBkW2FdPW51bGwsIlUiK2F9KTtmb3IodmFyIGU9IlUoIithLnNvdXJjZSsiKSIsZj1iLnJlcGxhY2UoL1stK10/KFxkKlwuKT9cZCsoW0VlXVstK10/XGQrKT8vZywiTiIpLnJlcGxhY2UobmV3IFJlZ0V4cCgiTiIrZSwiZyIpLCJEIikucmVwbGFjZSgvXHNbKy1dXHMvZywiTyIpLnJlcGxhY2UoL1xzL2csIiIpLGc9Wy9OXCooRCkvZywvKE58RClbKlwvXU4vZywvKE58RClPXDEvZywvXCgoTnxEKVwpL2ddLGg9MDtoPGcubGVuZ3RoOylnW2hdLnRlc3QoZik/KGY9Zi5yZXBsYWNlKGdbaF0sIiQxIiksaD0wKTpoKys7aWYoIkQiPT1mKXtmb3IodmFyIGkgaW4gZCl7dmFyIGo9YyhiLnJlcGxhY2UobmV3IFJlZ0V4cCgiVSIraSwiZyIpLCIiKS5yZXBsYWNlKG5ldyBSZWdFeHAoZSwiZyIpLCIqMCIpKTtpZighaXNGaW5pdGUoaikpcmV0dXJuO2RbaV09an1yZXR1cm4gZH19fWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gZihhLGIsITApfWZ1bmN0aW9uIGYoYixjLGQpe3ZhciBlLGY9W107Zm9yKGUgaW4gYilmLnB1c2goZSk7Zm9yKGUgaW4gYylmLmluZGV4T2YoZSk8MCYmZi5wdXNoKGUpO3JldHVybiBiPWYubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBiW2FdfHwwfSksYz1mLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gY1thXXx8MH0pLFtiLGMsZnVuY3Rpb24oYil7dmFyIGM9Yi5tYXAoZnVuY3Rpb24oYyxlKXtyZXR1cm4gMT09Yi5sZW5ndGgmJmQmJihjPU1hdGgubWF4KGMsMCkpLGEubnVtYmVyVG9TdHJpbmcoYykrZltlXX0pLmpvaW4oIiArICIpO3JldHVybiBiLmxlbmd0aD4xPyJjYWxjKCIrYysiKSI6Y31dfXZhciBnPSJweHxlbXxleHxjaHxyZW18dnd8dmh8dm1pbnx2bWF4fGNtfG1tfGlufHB0fHBjIixoPWQuYmluZChudWxsLG5ldyBSZWdFeHAoZywiZyIpKSxpPWQuYmluZChudWxsLG5ldyBSZWdFeHAoZysifCUiLCJnIikpLGo9ZC5iaW5kKG51bGwsL2RlZ3xyYWR8Z3JhZHx0dXJuL2cpO2EucGFyc2VMZW5ndGg9aCxhLnBhcnNlTGVuZ3RoT3JQZXJjZW50PWksYS5jb25zdW1lTGVuZ3RoT3JQZXJjZW50PWEuY29uc3VtZVBhcmVudGhlc2lzZWQuYmluZChudWxsLGkpLGEucGFyc2VBbmdsZT1qLGEubWVyZ2VEaW1lbnNpb25zPWY7dmFyIGs9YS5jb25zdW1lUGFyZW50aGVzaXNlZC5iaW5kKG51bGwsaCksbD1hLmNvbnN1bWVSZXBlYXRlZC5iaW5kKHZvaWQgMCxrLC9eLyksbT1hLmNvbnN1bWVSZXBlYXRlZC5iaW5kKHZvaWQgMCxsLC9eLC8pO2EuY29uc3VtZVNpemVQYWlyTGlzdD1tO3ZhciBuPWZ1bmN0aW9uKGEpe3ZhciBiPW0oYSk7aWYoYiYmIiI9PWJbMV0pcmV0dXJuIGJbMF19LG89YS5tZXJnZU5lc3RlZFJlcGVhdGVkLmJpbmQodm9pZCAwLGUsIiAiKSxwPWEubWVyZ2VOZXN0ZWRSZXBlYXRlZC5iaW5kKHZvaWQgMCxvLCIsIik7YS5tZXJnZU5vbk5lZ2F0aXZlU2l6ZVBhaXI9byxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKG4scCxbImJhY2tncm91bmQtc2l6ZSJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGksZSxbImJvcmRlci1ib3R0b20td2lkdGgiLCJib3JkZXItaW1hZ2Utd2lkdGgiLCJib3JkZXItbGVmdC13aWR0aCIsImJvcmRlci1yaWdodC13aWR0aCIsImJvcmRlci10b3Atd2lkdGgiLCJmbGV4LWJhc2lzIiwiZm9udC1zaXplIiwiaGVpZ2h0IiwibGluZS1oZWlnaHQiLCJtYXgtaGVpZ2h0IiwibWF4LXdpZHRoIiwib3V0bGluZS13aWR0aCIsIndpZHRoIl0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoaSxmLFsiYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cyIsImJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzIiwiYm9yZGVyLXRvcC1sZWZ0LXJhZGl1cyIsImJvcmRlci10b3AtcmlnaHQtcmFkaXVzIiwiYm90dG9tIiwibGVmdCIsImxldHRlci1zcGFjaW5nIiwibWFyZ2luLWJvdHRvbSIsIm1hcmdpbi1sZWZ0IiwibWFyZ2luLXJpZ2h0IiwibWFyZ2luLXRvcCIsIm1pbi1oZWlnaHQiLCJtaW4td2lkdGgiLCJvdXRsaW5lLW9mZnNldCIsInBhZGRpbmctYm90dG9tIiwicGFkZGluZy1sZWZ0IiwicGFkZGluZy1yaWdodCIsInBhZGRpbmctdG9wIiwicGVyc3BlY3RpdmUiLCJyaWdodCIsInNoYXBlLW1hcmdpbiIsInN0cm9rZS1kYXNob2Zmc2V0IiwidGV4dC1pbmRlbnQiLCJ0b3AiLCJ2ZXJ0aWNhbC1hbGlnbiIsIndvcmQtc3BhY2luZyJdKX0oYiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGIpe3JldHVybiBhLmNvbnN1bWVMZW5ndGhPclBlcmNlbnQoYil8fGEuY29uc3VtZVRva2VuKC9eYXV0by8sYil9ZnVuY3Rpb24gZChiKXt2YXIgZD1hLmNvbnN1bWVMaXN0KFthLmlnbm9yZShhLmNvbnN1bWVUb2tlbi5iaW5kKG51bGwsL15yZWN0LykpLGEuaWdub3JlKGEuY29uc3VtZVRva2VuLmJpbmQobnVsbCwvXlwoLykpLGEuY29uc3VtZVJlcGVhdGVkLmJpbmQobnVsbCxjLC9eLC8pLGEuaWdub3JlKGEuY29uc3VtZVRva2VuLmJpbmQobnVsbCwvXlwpLykpXSxiKTtpZihkJiY0PT1kWzBdLmxlbmd0aClyZXR1cm4gZFswXX1mdW5jdGlvbiBlKGIsYyl7cmV0dXJuImF1dG8iPT1ifHwiYXV0byI9PWM/WyEwLCExLGZ1bmN0aW9uKGQpe3ZhciBlPWQ/YjpjO2lmKCJhdXRvIj09ZSlyZXR1cm4iYXV0byI7dmFyIGY9YS5tZXJnZURpbWVuc2lvbnMoZSxlKTtyZXR1cm4gZlsyXShmWzBdKX1dOmEubWVyZ2VEaW1lbnNpb25zKGIsYyl9ZnVuY3Rpb24gZihhKXtyZXR1cm4icmVjdCgiK2ErIikifXZhciBnPWEubWVyZ2VXcmFwcGVkTmVzdGVkUmVwZWF0ZWQuYmluZChudWxsLGYsZSwiLCAiKTthLnBhcnNlQm94PWQsYS5tZXJnZUJveGVzPWcsYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihkLGcsWyJjbGlwIl0pfShiKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPTA7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhPT09az9iW2MrK106YX0pfX1mdW5jdGlvbiBkKGEpe3JldHVybiBhfWZ1bmN0aW9uIGUoYil7aWYoIm5vbmUiPT0oYj1iLnRvTG93ZXJDYXNlKCkudHJpbSgpKSlyZXR1cm5bXTtmb3IodmFyIGMsZD0vXHMqKFx3KylcKChbXildKilcKS9nLGU9W10sZj0wO2M9ZC5leGVjKGIpOyl7aWYoYy5pbmRleCE9ZilyZXR1cm47Zj1jLmluZGV4K2NbMF0ubGVuZ3RoO3ZhciBnPWNbMV0saD1uW2ddO2lmKCFoKXJldHVybjt2YXIgaT1jWzJdLnNwbGl0KCIsIiksaj1oWzBdO2lmKGoubGVuZ3RoPGkubGVuZ3RoKXJldHVybjtmb3IodmFyIGs9W10sbz0wO288ai5sZW5ndGg7bysrKXt2YXIgcCxxPWlbb10scj1qW29dO2lmKHZvaWQgMD09PShwPXE/e0E6ZnVuY3Rpb24oYil7cmV0dXJuIjAiPT1iLnRyaW0oKT9tOmEucGFyc2VBbmdsZShiKX0sTjphLnBhcnNlTnVtYmVyLFQ6YS5wYXJzZUxlbmd0aE9yUGVyY2VudCxMOmEucGFyc2VMZW5ndGh9W3IudG9VcHBlckNhc2UoKV0ocSk6e2E6bSxuOmtbMF0sdDpsfVtyXSkpcmV0dXJuO2sucHVzaChwKX1pZihlLnB1c2goe3Q6ZyxkOmt9KSxkLmxhc3RJbmRleD09Yi5sZW5ndGgpcmV0dXJuIGV9fWZ1bmN0aW9uIGYoYSl7cmV0dXJuIGEudG9GaXhlZCg2KS5yZXBsYWNlKCIuMDAwMDAwIiwiIil9ZnVuY3Rpb24gZyhiLGMpe2lmKGIuZGVjb21wb3NpdGlvblBhaXIhPT1jKXtiLmRlY29tcG9zaXRpb25QYWlyPWM7dmFyIGQ9YS5tYWtlTWF0cml4RGVjb21wb3NpdGlvbihiKX1pZihjLmRlY29tcG9zaXRpb25QYWlyIT09Yil7Yy5kZWNvbXBvc2l0aW9uUGFpcj1iO3ZhciBlPWEubWFrZU1hdHJpeERlY29tcG9zaXRpb24oYyl9cmV0dXJuIG51bGw9PWRbMF18fG51bGw9PWVbMF0/W1shMV0sWyEwXSxmdW5jdGlvbihhKXtyZXR1cm4gYT9jWzBdLmQ6YlswXS5kfV06KGRbMF0ucHVzaCgwKSxlWzBdLnB1c2goMSksW2QsZSxmdW5jdGlvbihiKXt2YXIgYz1hLnF1YXQoZFswXVszXSxlWzBdWzNdLGJbNV0pO3JldHVybiBhLmNvbXBvc2VNYXRyaXgoYlswXSxiWzFdLGJbMl0sYyxiWzRdKS5tYXAoZikuam9pbigiLCIpfV0pfWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGEucmVwbGFjZSgvW3h5XS8sIiIpfWZ1bmN0aW9uIGkoYSl7cmV0dXJuIGEucmVwbGFjZSgvKHh8eXx6fDNkKT8kLywiM2QiKX1mdW5jdGlvbiBqKGIsYyl7dmFyIGQ9YS5tYWtlTWF0cml4RGVjb21wb3NpdGlvbiYmITAsZT0hMTtpZighYi5sZW5ndGh8fCFjLmxlbmd0aCl7Yi5sZW5ndGh8fChlPSEwLGI9YyxjPVtdKTtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl7dmFyIGo9YltmXS50LGs9YltmXS5kLGw9InNjYWxlIj09ai5zdWJzdHIoMCw1KT8xOjA7Yy5wdXNoKHt0OmosZDprLm1hcChmdW5jdGlvbihhKXtpZigibnVtYmVyIj09dHlwZW9mIGEpcmV0dXJuIGw7dmFyIGI9e307Zm9yKHZhciBjIGluIGEpYltjXT1sO3JldHVybiBifSl9KX19dmFyIG09ZnVuY3Rpb24oYSxiKXtyZXR1cm4icGVyc3BlY3RpdmUiPT1hJiYicGVyc3BlY3RpdmUiPT1ifHwoIm1hdHJpeCI9PWF8fCJtYXRyaXgzZCI9PWEpJiYoIm1hdHJpeCI9PWJ8fCJtYXRyaXgzZCI9PWIpfSxvPVtdLHA9W10scT1bXTtpZihiLmxlbmd0aCE9Yy5sZW5ndGgpe2lmKCFkKXJldHVybjt2YXIgcj1nKGIsYyk7bz1bclswXV0scD1bclsxXV0scT1bWyJtYXRyaXgiLFtyWzJdXV1dfWVsc2UgZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspe3ZhciBqLHM9YltmXS50LHQ9Y1tmXS50LHU9YltmXS5kLHY9Y1tmXS5kLHc9bltzXSx4PW5bdF07aWYobShzLHQpKXtpZighZClyZXR1cm47dmFyIHI9ZyhbYltmXV0sW2NbZl1dKTtvLnB1c2goclswXSkscC5wdXNoKHJbMV0pLHEucHVzaChbIm1hdHJpeCIsW3JbMl1dXSl9ZWxzZXtpZihzPT10KWo9cztlbHNlIGlmKHdbMl0mJnhbMl0mJmgocyk9PWgodCkpaj1oKHMpLHU9d1syXSh1KSx2PXhbMl0odik7ZWxzZXtpZighd1sxXXx8IXhbMV18fGkocykhPWkodCkpe2lmKCFkKXJldHVybjt2YXIgcj1nKGIsYyk7bz1bclswXV0scD1bclsxXV0scT1bWyJtYXRyaXgiLFtyWzJdXV1dO2JyZWFrfWo9aShzKSx1PXdbMV0odSksdj14WzFdKHYpfWZvcih2YXIgeT1bXSx6PVtdLEE9W10sQj0wO0I8dS5sZW5ndGg7QisrKXt2YXIgQz0ibnVtYmVyIj09dHlwZW9mIHVbQl0/YS5tZXJnZU51bWJlcnM6YS5tZXJnZURpbWVuc2lvbnMscj1DKHVbQl0sdltCXSk7eVtCXT1yWzBdLHpbQl09clsxXSxBLnB1c2goclsyXSl9by5wdXNoKHkpLHAucHVzaCh6KSxxLnB1c2goW2osQV0pfX1pZihlKXt2YXIgRD1vO289cCxwPUR9cmV0dXJuW28scCxmdW5jdGlvbihhKXtyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1hLm1hcChmdW5jdGlvbihhLGMpe3JldHVybiBxW2JdWzFdW2NdKGEpfSkuam9pbigiLCIpO3JldHVybiJtYXRyaXgiPT1xW2JdWzBdJiYxNj09Yy5zcGxpdCgiLCIpLmxlbmd0aCYmKHFbYl1bMF09Im1hdHJpeDNkIikscVtiXVswXSsiKCIrYysiKSJ9KS5qb2luKCIgIil9XX12YXIgaz1udWxsLGw9e3B4OjB9LG09e2RlZzowfSxuPXttYXRyaXg6WyJOTk5OTk4iLFtrLGssMCwwLGssaywwLDAsMCwwLDEsMCxrLGssMCwxXSxkXSxtYXRyaXgzZDpbIk5OTk5OTk5OTk5OTk5OTk4iLGRdLHJvdGF0ZTpbIkEiXSxyb3RhdGV4OlsiQSJdLHJvdGF0ZXk6WyJBIl0scm90YXRlejpbIkEiXSxyb3RhdGUzZDpbIk5OTkEiXSxwZXJzcGVjdGl2ZTpbIkwiXSxzY2FsZTpbIk5uIixjKFtrLGssMV0pLGRdLHNjYWxleDpbIk4iLGMoW2ssMSwxXSksYyhbaywxXSldLHNjYWxleTpbIk4iLGMoWzEsaywxXSksYyhbMSxrXSldLHNjYWxlejpbIk4iLGMoWzEsMSxrXSldLHNjYWxlM2Q6WyJOTk4iLGRdLHNrZXc6WyJBYSIsbnVsbCxkXSxza2V3eDpbIkEiLG51bGwsYyhbayxtXSldLHNrZXd5OlsiQSIsbnVsbCxjKFttLGtdKV0sdHJhbnNsYXRlOlsiVHQiLGMoW2ssayxsXSksZF0sdHJhbnNsYXRleDpbIlQiLGMoW2ssbCxsXSksYyhbayxsXSldLHRyYW5zbGF0ZXk6WyJUIixjKFtsLGssbF0pLGMoW2wsa10pXSx0cmFuc2xhdGV6OlsiTCIsYyhbbCxsLGtdKV0sdHJhbnNsYXRlM2Q6WyJUVEwiLGRdfTthLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsaixbInRyYW5zZm9ybSJdKSxhLnRyYW5zZm9ybVRvU3ZnTWF0cml4PWZ1bmN0aW9uKGIpe3ZhciBjPWEudHJhbnNmb3JtTGlzdFRvTWF0cml4KGUoYikpO3JldHVybiJtYXRyaXgoIitmKGNbMF0pKyIgIitmKGNbMV0pKyIgIitmKGNbNF0pKyIgIitmKGNbNV0pKyIgIitmKGNbMTJdKSsiICIrZihjWzEzXSkrIikifX0oYiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7Yi5jb25jYXQoW2FdKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlJiYoZFthXT1iKSxlW2JdPWF9KX12YXIgZD17fSxlPXt9O2MoInRyYW5zZm9ybSIsWyJ3ZWJraXRUcmFuc2Zvcm0iLCJtc1RyYW5zZm9ybSJdKSxjKCJ0cmFuc2Zvcm1PcmlnaW4iLFsid2Via2l0VHJhbnNmb3JtT3JpZ2luIl0pLGMoInBlcnNwZWN0aXZlIixbIndlYmtpdFBlcnNwZWN0aXZlIl0pLGMoInBlcnNwZWN0aXZlT3JpZ2luIixbIndlYmtpdFBlcnNwZWN0aXZlT3JpZ2luIl0pLGEucHJvcGVydHlOYW1lPWZ1bmN0aW9uKGEpe3JldHVybiBkW2FdfHxhfSxhLnVucHJlZml4ZWRQcm9wZXJ0eU5hbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIGVbYV18fGF9fShiKX0oKSxmdW5jdGlvbigpe2lmKHZvaWQgMD09PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLmFuaW1hdGUoW10pLm9uY2FuY2VsKXt2YXIgYTtpZih3aW5kb3cucGVyZm9ybWFuY2UmJnBlcmZvcm1hbmNlLm5vdyl2YXIgYT1mdW5jdGlvbigpe3JldHVybiBwZXJmb3JtYW5jZS5ub3coKX07ZWxzZSB2YXIgYT1mdW5jdGlvbigpe3JldHVybiBEYXRlLm5vdygpfTt2YXIgYj1mdW5jdGlvbihhLGIsYyl7dGhpcy50YXJnZXQ9YSx0aGlzLmN1cnJlbnRUaW1lPWIsdGhpcy50aW1lbGluZVRpbWU9Yyx0aGlzLnR5cGU9ImNhbmNlbCIsdGhpcy5idWJibGVzPSExLHRoaXMuY2FuY2VsYWJsZT0hMSx0aGlzLmN1cnJlbnRUYXJnZXQ9YSx0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITEsdGhpcy5ldmVudFBoYXNlPUV2ZW50LkFUX1RBUkdFVCx0aGlzLnRpbWVTdGFtcD1EYXRlLm5vdygpfSxjPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlO3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGQsZSl7dmFyIGY9Yy5jYWxsKHRoaXMsZCxlKTtmLl9jYW5jZWxIYW5kbGVycz1bXSxmLm9uY2FuY2VsPW51bGw7dmFyIGc9Zi5jYW5jZWw7Zi5jYW5jZWw9ZnVuY3Rpb24oKXtnLmNhbGwodGhpcyk7dmFyIGM9bmV3IGIodGhpcyxudWxsLGEoKSksZD10aGlzLl9jYW5jZWxIYW5kbGVycy5jb25jYXQodGhpcy5vbmNhbmNlbD9bdGhpcy5vbmNhbmNlbF06W10pO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtkLmZvckVhY2goZnVuY3Rpb24oYSl7YS5jYWxsKGMudGFyZ2V0LGMpfSl9LDApfTt2YXIgaD1mLmFkZEV2ZW50TGlzdGVuZXI7Zi5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYil7ImZ1bmN0aW9uIj09dHlwZW9mIGImJiJjYW5jZWwiPT1hP3RoaXMuX2NhbmNlbEhhbmRsZXJzLnB1c2goYik6aC5jYWxsKHRoaXMsYSxiKX07dmFyIGk9Zi5yZW1vdmVFdmVudExpc3RlbmVyO3JldHVybiBmLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiKXtpZigiY2FuY2VsIj09YSl7dmFyIGM9dGhpcy5fY2FuY2VsSGFuZGxlcnMuaW5kZXhPZihiKTtjPj0wJiZ0aGlzLl9jYW5jZWxIYW5kbGVycy5zcGxpY2UoYywxKX1lbHNlIGkuY2FsbCh0aGlzLGEsYil9LGZ9fX0oKSxmdW5jdGlvbihhKXt2YXIgYj1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsYz1udWxsLGQ9ITE7dHJ5e3ZhciBlPWdldENvbXB1dGVkU3R5bGUoYikuZ2V0UHJvcGVydHlWYWx1ZSgib3BhY2l0eSIpLGY9IjAiPT1lPyIxIjoiMCI7Yz1iLmFuaW1hdGUoe29wYWNpdHk6W2YsZl19LHtkdXJhdGlvbjoxfSksYy5jdXJyZW50VGltZT0wLGQ9Z2V0Q29tcHV0ZWRTdHlsZShiKS5nZXRQcm9wZXJ0eVZhbHVlKCJvcGFjaXR5Iik9PWZ9Y2F0Y2goYSl7fWZpbmFsbHl7YyYmYy5jYW5jZWwoKX1pZighZCl7dmFyIGc9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFuaW1hdGU7d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24oYixjKXtyZXR1cm4gd2luZG93LlN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yJiZBcnJheS5wcm90b3R5cGUuZnJvbSYmYltTeW1ib2wuaXRlcmF0b3JdJiYoYj1BcnJheS5mcm9tKGIpKSxBcnJheS5pc0FycmF5KGIpfHxudWxsPT09Ynx8KGI9YS5jb252ZXJ0VG9BcnJheUZvcm0oYikpLGcuY2FsbCh0aGlzLGIsYyl9fX0oYSksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7dmFyIGM9Yi50aW1lbGluZTtjLmN1cnJlbnRUaW1lPWEsYy5fZGlzY2FyZEFuaW1hdGlvbnMoKSwwPT1jLl9hbmltYXRpb25zLmxlbmd0aD9mPSExOnJlcXVlc3RBbmltYXRpb25GcmFtZShkKX12YXIgZT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIGUoZnVuY3Rpb24oYyl7Yi50aW1lbGluZS5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCksYShjKSxiLnRpbWVsaW5lLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKX0pfSxiLkFuaW1hdGlvblRpbWVsaW5lPWZ1bmN0aW9uKCl7dGhpcy5fYW5pbWF0aW9ucz1bXSx0aGlzLmN1cnJlbnRUaW1lPXZvaWQgMH0sYi5BbmltYXRpb25UaW1lbGluZS5wcm90b3R5cGU9e2dldEFuaW1hdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzY2FyZEFuaW1hdGlvbnMoKSx0aGlzLl9hbmltYXRpb25zLnNsaWNlKCl9LF91cGRhdGVBbmltYXRpb25zUHJvbWlzZXM6ZnVuY3Rpb24oKXtiLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXM9Yi5hbmltYXRpb25zV2l0aFByb21pc2VzLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS5fdXBkYXRlUHJvbWlzZXMoKX0pfSxfZGlzY2FyZEFuaW1hdGlvbnM6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKSx0aGlzLl9hbmltYXRpb25zPXRoaXMuX2FuaW1hdGlvbnMuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJmaW5pc2hlZCIhPWEucGxheVN0YXRlJiYiaWRsZSIhPWEucGxheVN0YXRlfSl9LF9wbGF5OmZ1bmN0aW9uKGEpe3ZhciBjPW5ldyBiLkFuaW1hdGlvbihhLHRoaXMpO3JldHVybiB0aGlzLl9hbmltYXRpb25zLnB1c2goYyksYi5yZXN0YXJ0V2ViQW5pbWF0aW9uc05leHRUaWNrKCksYy5fdXBkYXRlUHJvbWlzZXMoKSxjLl9hbmltYXRpb24ucGxheSgpLGMuX3VwZGF0ZVByb21pc2VzKCksY30scGxheTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5yZW1vdmUoKSx0aGlzLl9wbGF5KGEpfX07dmFyIGY9ITE7Yi5yZXN0YXJ0V2ViQW5pbWF0aW9uc05leHRUaWNrPWZ1bmN0aW9uKCl7Znx8KGY9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGQpKX07dmFyIGc9bmV3IGIuQW5pbWF0aW9uVGltZWxpbmU7Yi50aW1lbGluZT1nO3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LmRvY3VtZW50LCJ0aW1lbGluZSIse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZ319KX1jYXRjaChhKXt9dHJ5e3dpbmRvdy5kb2N1bWVudC50aW1lbGluZT1nfWNhdGNoKGEpe319KDAsYyksZnVuY3Rpb24oYSxiLGMpe2IuYW5pbWF0aW9uc1dpdGhQcm9taXNlcz1bXSxiLkFuaW1hdGlvbj1mdW5jdGlvbihiLGMpe2lmKHRoaXMuaWQ9IiIsYiYmYi5faWQmJih0aGlzLmlkPWIuX2lkKSx0aGlzLmVmZmVjdD1iLGImJihiLl9hbmltYXRpb249dGhpcyksIWMpdGhyb3cgbmV3IEVycm9yKCJBbmltYXRpb24gd2l0aCBudWxsIHRpbWVsaW5lIGlzIG5vdCBzdXBwb3J0ZWQiKTt0aGlzLl90aW1lbGluZT1jLHRoaXMuX3NlcXVlbmNlTnVtYmVyPWEuc2VxdWVuY2VOdW1iZXIrKyx0aGlzLl9ob2xkVGltZT0wLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9pc0dyb3VwPSExLHRoaXMuX2FuaW1hdGlvbj1udWxsLHRoaXMuX2NoaWxkQW5pbWF0aW9ucz1bXSx0aGlzLl9jYWxsYmFjaz1udWxsLHRoaXMuX29sZFBsYXlTdGF0ZT0iaWRsZSIsdGhpcy5fcmVidWlsZFVuZGVybHlpbmdBbmltYXRpb24oKSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sYi5BbmltYXRpb24ucHJvdG90eXBlPXtfdXBkYXRlUHJvbWlzZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9vbGRQbGF5U3RhdGUsYj10aGlzLnBsYXlTdGF0ZTtyZXR1cm4gdGhpcy5fcmVhZHlQcm9taXNlJiZiIT09YSYmKCJpZGxlIj09Yj8odGhpcy5fcmVqZWN0UmVhZHlQcm9taXNlKCksdGhpcy5fcmVhZHlQcm9taXNlPXZvaWQgMCk6InBlbmRpbmciPT1hP3RoaXMuX3Jlc29sdmVSZWFkeVByb21pc2UoKToicGVuZGluZyI9PWImJih0aGlzLl9yZWFkeVByb21pc2U9dm9pZCAwKSksdGhpcy5fZmluaXNoZWRQcm9taXNlJiZiIT09YSYmKCJpZGxlIj09Yj8odGhpcy5fcmVqZWN0RmluaXNoZWRQcm9taXNlKCksdGhpcy5fZmluaXNoZWRQcm9taXNlPXZvaWQgMCk6ImZpbmlzaGVkIj09Yj90aGlzLl9yZXNvbHZlRmluaXNoZWRQcm9taXNlKCk6ImZpbmlzaGVkIj09YSYmKHRoaXMuX2ZpbmlzaGVkUHJvbWlzZT12b2lkIDApKSx0aGlzLl9vbGRQbGF5U3RhdGU9dGhpcy5wbGF5U3RhdGUsdGhpcy5fcmVhZHlQcm9taXNlfHx0aGlzLl9maW5pc2hlZFByb21pc2V9LF9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbjpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGEsYyxkLGUsZj0hIXRoaXMuX2FuaW1hdGlvbjtmJiYoYT10aGlzLnBsYXliYWNrUmF0ZSxjPXRoaXMuX3BhdXNlZCxkPXRoaXMuc3RhcnRUaW1lLGU9dGhpcy5jdXJyZW50VGltZSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fYW5pbWF0aW9uLl93cmFwcGVyPW51bGwsdGhpcy5fYW5pbWF0aW9uPW51bGwpLCghdGhpcy5lZmZlY3R8fHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LktleWZyYW1lRWZmZWN0KSYmKHRoaXMuX2FuaW1hdGlvbj1iLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdCh0aGlzLmVmZmVjdCksYi5iaW5kQW5pbWF0aW9uRm9yS2V5ZnJhbWVFZmZlY3QodGhpcykpLCh0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdHx8dGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuR3JvdXBFZmZlY3QpJiYodGhpcy5fYW5pbWF0aW9uPWIubmV3VW5kZXJseWluZ0FuaW1hdGlvbkZvckdyb3VwKHRoaXMuZWZmZWN0KSxiLmJpbmRBbmltYXRpb25Gb3JHcm91cCh0aGlzKSksdGhpcy5lZmZlY3QmJnRoaXMuZWZmZWN0Ll9vbnNhbXBsZSYmYi5iaW5kQW5pbWF0aW9uRm9yQ3VzdG9tRWZmZWN0KHRoaXMpLGYmJigxIT1hJiYodGhpcy5wbGF5YmFja1JhdGU9YSksbnVsbCE9PWQ/dGhpcy5zdGFydFRpbWU9ZDpudWxsIT09ZT90aGlzLmN1cnJlbnRUaW1lPWU6bnVsbCE9PXRoaXMuX2hvbGRUaW1lJiYodGhpcy5jdXJyZW50VGltZT10aGlzLl9ob2xkVGltZSksYyYmdGhpcy5wYXVzZSgpKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxfdXBkYXRlQ2hpbGRyZW46ZnVuY3Rpb24oKXtpZih0aGlzLmVmZmVjdCYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSl7dmFyIGE9dGhpcy5lZmZlY3QuX3RpbWluZy5kZWxheTt0aGlzLl9jaGlsZEFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbihjKXt0aGlzLl9hcnJhbmdlQ2hpbGRyZW4oYyxhKSx0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdCYmKGErPWIuZ3JvdXBDaGlsZER1cmF0aW9uKGMuZWZmZWN0KSl9LmJpbmQodGhpcykpfX0sX3NldEV4dGVybmFsQW5pbWF0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuZWZmZWN0JiZ0aGlzLl9pc0dyb3VwKWZvcih2YXIgYj0wO2I8dGhpcy5lZmZlY3QuY2hpbGRyZW4ubGVuZ3RoO2IrKyl0aGlzLmVmZmVjdC5jaGlsZHJlbltiXS5fYW5pbWF0aW9uPWEsdGhpcy5fY2hpbGRBbmltYXRpb25zW2JdLl9zZXRFeHRlcm5hbEFuaW1hdGlvbihhKX0sX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9uczpmdW5jdGlvbigpe2lmKHRoaXMuZWZmZWN0JiZ0aGlzLl9pc0dyb3VwKXt2YXIgYT10aGlzLmVmZmVjdC5fdGltaW5nLmRlbGF5O3RoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpLHRoaXMuZWZmZWN0LmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9Yi50aW1lbGluZS5fcGxheShjKTt0aGlzLl9jaGlsZEFuaW1hdGlvbnMucHVzaChkKSxkLnBsYXliYWNrUmF0ZT10aGlzLnBsYXliYWNrUmF0ZSx0aGlzLl9wYXVzZWQmJmQucGF1c2UoKSxjLl9hbmltYXRpb249dGhpcy5lZmZlY3QuX2FuaW1hdGlvbix0aGlzLl9hcnJhbmdlQ2hpbGRyZW4oZCxhKSx0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdCYmKGErPWIuZ3JvdXBDaGlsZER1cmF0aW9uKGMpKX0uYmluZCh0aGlzKSl9fSxfYXJyYW5nZUNoaWxkcmVuOmZ1bmN0aW9uKGEsYil7bnVsbD09PXRoaXMuc3RhcnRUaW1lP2EuY3VycmVudFRpbWU9dGhpcy5jdXJyZW50VGltZS1iL3RoaXMucGxheWJhY2tSYXRlOmEuc3RhcnRUaW1lIT09dGhpcy5zdGFydFRpbWUrYi90aGlzLnBsYXliYWNrUmF0ZSYmKGEuc3RhcnRUaW1lPXRoaXMuc3RhcnRUaW1lK2IvdGhpcy5wbGF5YmFja1JhdGUpfSxnZXQgdGltZWxpbmUoKXtyZXR1cm4gdGhpcy5fdGltZWxpbmV9LGdldCBwbGF5U3RhdGUoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uP3RoaXMuX2FuaW1hdGlvbi5wbGF5U3RhdGU6ImlkbGUifSxnZXQgZmluaXNoZWQoKXtyZXR1cm4gd2luZG93LlByb21pc2U/KHRoaXMuX2ZpbmlzaGVkUHJvbWlzZXx8KC0xPT1iLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMuaW5kZXhPZih0aGlzKSYmYi5hbmltYXRpb25zV2l0aFByb21pc2VzLnB1c2godGhpcyksdGhpcy5fZmluaXNoZWRQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYil7dGhpcy5fcmVzb2x2ZUZpbmlzaGVkUHJvbWlzZT1mdW5jdGlvbigpe2EodGhpcyl9LHRoaXMuX3JlamVjdEZpbmlzaGVkUHJvbWlzZT1mdW5jdGlvbigpe2Ioe3R5cGU6RE9NRXhjZXB0aW9uLkFCT1JUX0VSUixuYW1lOiJBYm9ydEVycm9yIn0pfX0uYmluZCh0aGlzKSksImZpbmlzaGVkIj09dGhpcy5wbGF5U3RhdGUmJnRoaXMuX3Jlc29sdmVGaW5pc2hlZFByb21pc2UoKSksdGhpcy5fZmluaXNoZWRQcm9taXNlKTooY29uc29sZS53YXJuKCJBbmltYXRpb24gUHJvbWlzZXMgcmVxdWlyZSBKYXZhU2NyaXB0IFByb21pc2UgY29uc3RydWN0b3IiKSxudWxsKX0sZ2V0IHJlYWR5KCl7cmV0dXJuIHdpbmRvdy5Qcm9taXNlPyh0aGlzLl9yZWFkeVByb21pc2V8fCgtMT09Yi5hbmltYXRpb25zV2l0aFByb21pc2VzLmluZGV4T2YodGhpcykmJmIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5wdXNoKHRoaXMpLHRoaXMuX3JlYWR5UHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihhLGIpe3RoaXMuX3Jlc29sdmVSZWFkeVByb21pc2U9ZnVuY3Rpb24oKXthKHRoaXMpfSx0aGlzLl9yZWplY3RSZWFkeVByb21pc2U9ZnVuY3Rpb24oKXtiKHt0eXBlOkRPTUV4Y2VwdGlvbi5BQk9SVF9FUlIsbmFtZToiQWJvcnRFcnJvciJ9KX19LmJpbmQodGhpcykpLCJwZW5kaW5nIiE9PXRoaXMucGxheVN0YXRlJiZ0aGlzLl9yZXNvbHZlUmVhZHlQcm9taXNlKCkpLHRoaXMuX3JlYWR5UHJvbWlzZSk6KGNvbnNvbGUud2FybigiQW5pbWF0aW9uIFByb21pc2VzIHJlcXVpcmUgSmF2YVNjcmlwdCBQcm9taXNlIGNvbnN0cnVjdG9yIiksbnVsbCl9LGdldCBvbmZpbmlzaCgpe3JldHVybiB0aGlzLl9hbmltYXRpb24ub25maW5pc2h9LHNldCBvbmZpbmlzaChhKXt0aGlzLl9hbmltYXRpb24ub25maW5pc2g9ImZ1bmN0aW9uIj09dHlwZW9mIGE/ZnVuY3Rpb24oYil7Yi50YXJnZXQ9dGhpcyxhLmNhbGwodGhpcyxiKX0uYmluZCh0aGlzKTphfSxnZXQgb25jYW5jZWwoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsfSxzZXQgb25jYW5jZWwoYSl7dGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsPSJmdW5jdGlvbiI9PXR5cGVvZiBhP2Z1bmN0aW9uKGIpe2IudGFyZ2V0PXRoaXMsYS5jYWxsKHRoaXMsYil9LmJpbmQodGhpcyk6YX0sZ2V0IGN1cnJlbnRUaW1lKCl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKTt2YXIgYT10aGlzLl9hbmltYXRpb24uY3VycmVudFRpbWU7cmV0dXJuIHRoaXMuX3VwZGF0ZVByb21pc2VzKCksYX0sc2V0IGN1cnJlbnRUaW1lKGEpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5fYW5pbWF0aW9uLmN1cnJlbnRUaW1lPWlzRmluaXRlKGEpP2E6TWF0aC5zaWduKGEpKk51bWJlci5NQVhfVkFMVUUsdGhpcy5fcmVnaXN0ZXIoKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYixjKXtiLmN1cnJlbnRUaW1lPWEtY30pLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGdldCBzdGFydFRpbWUoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uLnN0YXJ0VGltZX0sc2V0IHN0YXJ0VGltZShhKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5zdGFydFRpbWU9aXNGaW5pdGUoYSk/YTpNYXRoLnNpZ24oYSkqTnVtYmVyLk1BWF9WQUxVRSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihiLGMpe2Iuc3RhcnRUaW1lPWErY30pLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGdldCBwbGF5YmFja1JhdGUoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uLnBsYXliYWNrUmF0ZX0sc2V0IHBsYXliYWNrUmF0ZShhKXt0aGlzLl91cGRhdGVQcm9taXNlcygpO3ZhciBiPXRoaXMuY3VycmVudFRpbWU7dGhpcy5fYW5pbWF0aW9uLnBsYXliYWNrUmF0ZT1hLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihiKXtiLnBsYXliYWNrUmF0ZT1hfSksbnVsbCE9PWImJih0aGlzLmN1cnJlbnRUaW1lPWIpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9hbmltYXRpb24ucGxheSgpLC0xPT10aGlzLl90aW1lbGluZS5fYW5pbWF0aW9ucy5pbmRleE9mKHRoaXMpJiZ0aGlzLl90aW1lbGluZS5fYW5pbWF0aW9ucy5wdXNoKHRoaXMpLHRoaXMuX3JlZ2lzdGVyKCksYi5hd2FpdFN0YXJ0VGltZSh0aGlzKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYSl7dmFyIGI9YS5jdXJyZW50VGltZTthLnBsYXkoKSxhLmN1cnJlbnRUaW1lPWJ9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5jdXJyZW50VGltZSYmKHRoaXMuX2hvbGRUaW1lPXRoaXMuY3VycmVudFRpbWUpLHRoaXMuX2FuaW1hdGlvbi5wYXVzZSgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pLHRoaXMuX3BhdXNlZD0hMCx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxmaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5maW5pc2goKSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGNhbmNlbDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5fYW5pbWF0aW9uLmNhbmNlbCgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0scmV2ZXJzZTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGE9dGhpcy5jdXJyZW50VGltZTt0aGlzLl9hbmltYXRpb24ucmV2ZXJzZSgpLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihhKXthLnJldmVyc2UoKX0pLG51bGwhPT1hJiYodGhpcy5jdXJyZW50VGltZT1hKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YjsiZnVuY3Rpb24iPT10eXBlb2YgYiYmKGM9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9dGhpcyxiLmNhbGwodGhpcyxhKX0uYmluZCh0aGlzKSxiLl93cmFwcGVyPWMpLHRoaXMuX2FuaW1hdGlvbi5hZGRFdmVudExpc3RlbmVyKGEsYyl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXt0aGlzLl9hbmltYXRpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGImJmIuX3dyYXBwZXJ8fGIpfSxfcmVtb3ZlQ2hpbGRBbmltYXRpb25zOmZ1bmN0aW9uKCl7Zm9yKDt0aGlzLl9jaGlsZEFuaW1hdGlvbnMubGVuZ3RoOyl0aGlzLl9jaGlsZEFuaW1hdGlvbnMucG9wKCkuY2FuY2VsKCl9LF9mb3JFYWNoQ2hpbGQ6ZnVuY3Rpb24oYil7dmFyIGM9MDtpZih0aGlzLmVmZmVjdC5jaGlsZHJlbiYmdGhpcy5fY2hpbGRBbmltYXRpb25zLmxlbmd0aDx0aGlzLmVmZmVjdC5jaGlsZHJlbi5sZW5ndGgmJnRoaXMuX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9ucygpLHRoaXMuX2NoaWxkQW5pbWF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2IuY2FsbCh0aGlzLGEsYyksdGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuU2VxdWVuY2VFZmZlY3QmJihjKz1hLmVmZmVjdC5hY3RpdmVEdXJhdGlvbil9LmJpbmQodGhpcykpLCJwZW5kaW5nIiE9dGhpcy5wbGF5U3RhdGUpe3ZhciBkPXRoaXMuZWZmZWN0Ll90aW1pbmcsZT10aGlzLmN1cnJlbnRUaW1lO251bGwhPT1lJiYoZT1hLmNhbGN1bGF0ZUl0ZXJhdGlvblByb2dyZXNzKGEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb24oZCksZSxkKSksKG51bGw9PWV8fGlzTmFOKGUpKSYmdGhpcy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCl9fX0sd2luZG93LkFuaW1hdGlvbj1iLkFuaW1hdGlvbn0oYSxjKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChiKXt0aGlzLl9mcmFtZXM9YS5ub3JtYWxpemVLZXlmcmFtZXMoYil9ZnVuY3Rpb24gZSgpe2Zvcih2YXIgYT0hMTtpLmxlbmd0aDspaS5zaGlmdCgpLl91cGRhdGVDaGlsZHJlbigpLGE9ITA7cmV0dXJuIGF9dmFyIGY9ZnVuY3Rpb24oYSl7aWYoYS5fYW5pbWF0aW9uPXZvaWQgMCxhIGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0fHxhIGluc3RhbmNlb2Ygd2luZG93Lkdyb3VwRWZmZWN0KWZvcih2YXIgYj0wO2I8YS5jaGlsZHJlbi5sZW5ndGg7YisrKWYoYS5jaGlsZHJlbltiXSl9O2IucmVtb3ZlTXVsdGk9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtkLl9wYXJlbnQ/KC0xPT1iLmluZGV4T2YoZC5fcGFyZW50KSYmYi5wdXNoKGQuX3BhcmVudCksZC5fcGFyZW50LmNoaWxkcmVuLnNwbGljZShkLl9wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihkKSwxKSxkLl9wYXJlbnQ9bnVsbCxmKGQpKTpkLl9hbmltYXRpb24mJmQuX2FuaW1hdGlvbi5lZmZlY3Q9PWQmJihkLl9hbmltYXRpb24uY2FuY2VsKCksZC5fYW5pbWF0aW9uLmVmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QobnVsbCxbXSksZC5fYW5pbWF0aW9uLl9jYWxsYmFjayYmKGQuX2FuaW1hdGlvbi5fY2FsbGJhY2suX2FuaW1hdGlvbj1udWxsKSxkLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCksZihkKSl9Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLl9yZWJ1aWxkKCl9LGIuS2V5ZnJhbWVFZmZlY3Q9ZnVuY3Rpb24oYixjLGUsZil7cmV0dXJuIHRoaXMudGFyZ2V0PWIsdGhpcy5fcGFyZW50PW51bGwsZT1hLm51bWVyaWNUaW1pbmdUb09iamVjdChlKSx0aGlzLl90aW1pbmdJbnB1dD1hLmNsb25lVGltaW5nSW5wdXQoZSksdGhpcy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoZSksdGhpcy50aW1pbmc9YS5tYWtlVGltaW5nKGUsITEsdGhpcyksdGhpcy50aW1pbmcuX2VmZmVjdD10aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBjPyhhLmRlcHJlY2F0ZWQoIkN1c3RvbSBLZXlmcmFtZUVmZmVjdCIsIjIwMTUtMDYtMjIiLCJVc2UgS2V5ZnJhbWVFZmZlY3Qub25zYW1wbGUgaW5zdGVhZC4iKSx0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzPWMpOnRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM9bmV3IGQoYyksdGhpcy5fa2V5ZnJhbWVzPWMsdGhpcy5hY3RpdmVEdXJhdGlvbj1hLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKHRoaXMuX3RpbWluZyksdGhpcy5faWQ9Zix0aGlzfSxiLktleWZyYW1lRWZmZWN0LnByb3RvdHlwZT17Z2V0RnJhbWVzOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM/dGhpcy5fbm9ybWFsaXplZEtleWZyYW1lczp0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzLl9mcmFtZXN9LHNldCBvbnNhbXBsZShhKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5nZXRGcmFtZXMoKSl0aHJvdyBuZXcgRXJyb3IoIlNldHRpbmcgb25zYW1wbGUgb24gY3VzdG9tIGVmZmVjdCBLZXlmcmFtZUVmZmVjdCBpcyBub3Qgc3VwcG9ydGVkLiIpO3RoaXMuX29uc2FtcGxlPWEsdGhpcy5fYW5pbWF0aW9uJiZ0aGlzLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCl9LGdldCBwYXJlbnQoKXtyZXR1cm4gdGhpcy5fcGFyZW50fSxjbG9uZTpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmdldEZyYW1lcygpKXRocm93IG5ldyBFcnJvcigiQ2xvbmluZyBjdXN0b20gZWZmZWN0cyBpcyBub3Qgc3VwcG9ydGVkLiIpO3ZhciBiPW5ldyBLZXlmcmFtZUVmZmVjdCh0aGlzLnRhcmdldCxbXSxhLmNsb25lVGltaW5nSW5wdXQodGhpcy5fdGltaW5nSW5wdXQpLHRoaXMuX2lkKTtyZXR1cm4gYi5fbm9ybWFsaXplZEtleWZyYW1lcz10aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzLGIuX2tleWZyYW1lcz10aGlzLl9rZXlmcmFtZXMsYn0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVNdWx0aShbdGhpc10pfX07dmFyIGc9RWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZTtFbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9IiI7cmV0dXJuIGMmJmMuaWQmJihkPWMuaWQpLGIudGltZWxpbmUuX3BsYXkobmV3IGIuS2V5ZnJhbWVFZmZlY3QodGhpcyxhLGMsZCkpfTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKTtiLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihhKXtpZihhKXt2YXIgYj1hLnRhcmdldHx8aCxjPWEuX2tleWZyYW1lczsiZnVuY3Rpb24iPT10eXBlb2YgYyYmKGM9W10pO3ZhciBkPWEuX3RpbWluZ0lucHV0O2QuaWQ9YS5faWR9ZWxzZSB2YXIgYj1oLGM9W10sZD0wO3JldHVybiBnLmFwcGx5KGIsW2MsZF0pfSxiLmJpbmRBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihhKXthLmVmZmVjdCYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZWZmZWN0Ll9ub3JtYWxpemVkS2V5ZnJhbWVzJiZiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3QoYSl9O3ZhciBpPVtdO2IuYXdhaXRTdGFydFRpbWU9ZnVuY3Rpb24oYSl7bnVsbD09PWEuc3RhcnRUaW1lJiZhLl9pc0dyb3VwJiYoMD09aS5sZW5ndGgmJnJlcXVlc3RBbmltYXRpb25GcmFtZShlKSxpLnB1c2goYSkpfTt2YXIgaj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZTtPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCJnZXRDb21wdXRlZFN0eWxlIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXtiLnRpbWVsaW5lLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKTt2YXIgYT1qLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZSgpJiYoYT1qLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksYi50aW1lbGluZS5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCksYX19KSx3aW5kb3cuS2V5ZnJhbWVFZmZlY3Q9Yi5LZXlmcmFtZUVmZmVjdCx3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuZ2V0QW5pbWF0aW9ucz1mdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC50aW1lbGluZS5nZXRBbmltYXRpb25zKCkuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT09YS5lZmZlY3QmJmEuZWZmZWN0LnRhcmdldD09dGhpc30uYmluZCh0aGlzKSl9fShhLGMpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe2EuX3JlZ2lzdGVyZWR8fChhLl9yZWdpc3RlcmVkPSEwLGcucHVzaChhKSxofHwoaD0hMCxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZSkpKX1mdW5jdGlvbiBlKGEpe3ZhciBiPWc7Zz1bXSxiLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5fc2VxdWVuY2VOdW1iZXItYi5fc2VxdWVuY2VOdW1iZXJ9KSxiPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe2EoKTt2YXIgYj1hLl9hbmltYXRpb24/YS5fYW5pbWF0aW9uLnBsYXlTdGF0ZToiaWRsZSI7cmV0dXJuInJ1bm5pbmciIT1iJiYicGVuZGluZyIhPWImJihhLl9yZWdpc3RlcmVkPSExKSxhLl9yZWdpc3RlcmVkfSksZy5wdXNoLmFwcGx5KGcsYiksZy5sZW5ndGg/KGg9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpKTpoPSExfXZhciBmPShkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKSwwKTtiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3Q9ZnVuY3Rpb24oYil7dmFyIGMsZT1iLmVmZmVjdC50YXJnZXQsZz0iZnVuY3Rpb24iPT10eXBlb2YgYi5lZmZlY3QuZ2V0RnJhbWVzKCk7Yz1nP2IuZWZmZWN0LmdldEZyYW1lcygpOmIuZWZmZWN0Ll9vbnNhbXBsZTt2YXIgaD1iLmVmZmVjdC50aW1pbmcsaT1udWxsO2g9YS5ub3JtYWxpemVUaW1pbmdJbnB1dChoKTt2YXIgaj1mdW5jdGlvbigpe3ZhciBkPWouX2FuaW1hdGlvbj9qLl9hbmltYXRpb24uY3VycmVudFRpbWU6bnVsbDtudWxsIT09ZCYmKGQ9YS5jYWxjdWxhdGVJdGVyYXRpb25Qcm9ncmVzcyhhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGgpLGQsaCksaXNOYU4oZCkmJihkPW51bGwpKSxkIT09aSYmKGc/YyhkLGUsYi5lZmZlY3QpOmMoZCxiLmVmZmVjdCxiLmVmZmVjdC5fYW5pbWF0aW9uKSksaT1kfTtqLl9hbmltYXRpb249YixqLl9yZWdpc3RlcmVkPSExLGouX3NlcXVlbmNlTnVtYmVyPWYrKyxiLl9jYWxsYmFjaz1qLGQoail9O3ZhciBnPVtdLGg9ITE7Yi5BbmltYXRpb24ucHJvdG90eXBlLl9yZWdpc3Rlcj1mdW5jdGlvbigpe3RoaXMuX2NhbGxiYWNrJiZkKHRoaXMuX2NhbGxiYWNrKX19KGEsYyksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7cmV0dXJuIGEuX3RpbWluZy5kZWxheSthLmFjdGl2ZUR1cmF0aW9uK2EuX3RpbWluZy5lbmREZWxheX1mdW5jdGlvbiBlKGIsYyxkKXt0aGlzLl9pZD1kLHRoaXMuX3BhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49Ynx8W10sdGhpcy5fcmVwYXJlbnQodGhpcy5jaGlsZHJlbiksYz1hLm51bWVyaWNUaW1pbmdUb09iamVjdChjKSx0aGlzLl90aW1pbmdJbnB1dD1hLmNsb25lVGltaW5nSW5wdXQoYyksdGhpcy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYywhMCksdGhpcy50aW1pbmc9YS5tYWtlVGltaW5nKGMsITAsdGhpcyksdGhpcy50aW1pbmcuX2VmZmVjdD10aGlzLCJhdXRvIj09PXRoaXMuX3RpbWluZy5kdXJhdGlvbiYmKHRoaXMuX3RpbWluZy5kdXJhdGlvbj10aGlzLmFjdGl2ZUR1cmF0aW9uKX13aW5kb3cuU2VxdWVuY2VFZmZlY3Q9ZnVuY3Rpb24oKXtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sd2luZG93Lkdyb3VwRWZmZWN0PWZ1bmN0aW9uKCl7ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlPXtfaXNBbmNlc3RvcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcztudWxsIT09Yjspe2lmKGI9PWEpcmV0dXJuITA7Yj1iLl9wYXJlbnR9cmV0dXJuITF9LF9yZWJ1aWxkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXM7YTspImF1dG8iPT09YS50aW1pbmcuZHVyYXRpb24mJihhLl90aW1pbmcuZHVyYXRpb249YS5hY3RpdmVEdXJhdGlvbiksYT1hLl9wYXJlbnQ7dGhpcy5fYW5pbWF0aW9uJiZ0aGlzLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCl9LF9yZXBhcmVudDpmdW5jdGlvbihhKXtiLnJlbW92ZU11bHRpKGEpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWFbY10uX3BhcmVudD10aGlzfSxfcHV0Q2hpbGQ6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9Yj8iQ2Fubm90IGFwcGVuZCBhbiBhbmNlc3RvciBvciBzZWxmIjoiQ2Fubm90IHByZXBlbmQgYW4gYW5jZXN0b3Igb3Igc2VsZiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWlmKHRoaXMuX2lzQW5jZXN0b3IoYVtkXSkpdGhyb3d7dHlwZTpET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLG5hbWU6IkhpZXJhcmNoeVJlcXVlc3RFcnJvciIsbWVzc2FnZTpjfTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyliP3RoaXMuY2hpbGRyZW4ucHVzaChhW2RdKTp0aGlzLmNoaWxkcmVuLnVuc2hpZnQoYVtkXSk7dGhpcy5fcmVwYXJlbnQoYSksdGhpcy5fcmVidWlsZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXt0aGlzLl9wdXRDaGlsZChhcmd1bWVudHMsITApfSxwcmVwZW5kOmZ1bmN0aW9uKCl7dGhpcy5fcHV0Q2hpbGQoYXJndW1lbnRzLCExKX0sZ2V0IHBhcmVudCgpe3JldHVybiB0aGlzLl9wYXJlbnR9LGdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoP3RoaXMuY2hpbGRyZW5bMF06bnVsbH0sZ2V0IGxhc3RDaGlsZCgpe3JldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aD90aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoLTFdOm51bGx9LGNsb25lOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPWEuY2xvbmVUaW1pbmdJbnB1dCh0aGlzLl90aW1pbmdJbnB1dCksYz1bXSxkPTA7ZDx0aGlzLmNoaWxkcmVuLmxlbmd0aDtkKyspYy5wdXNoKHRoaXMuY2hpbGRyZW5bZF0uY2xvbmUoKSk7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBHcm91cEVmZmVjdD9uZXcgR3JvdXBFZmZlY3QoYyxiKTpuZXcgU2VxdWVuY2VFZmZlY3QoYyxiKX0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVNdWx0aShbdGhpc10pfX0sd2luZG93LlNlcXVlbmNlRWZmZWN0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LlNlcXVlbmNlRWZmZWN0LnByb3RvdHlwZSwiYWN0aXZlRHVyYXRpb24iLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYil7YSs9ZChiKX0pLE1hdGgubWF4KGEsMCl9fSksd2luZG93Lkdyb3VwRWZmZWN0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93Lkdyb3VwRWZmZWN0LnByb3RvdHlwZSwiYWN0aXZlRHVyYXRpb24iLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYil7YT1NYXRoLm1heChhLGQoYikpfSksYX19KSxiLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JHcm91cD1mdW5jdGlvbihjKXt2YXIgZCxlPW51bGwsZj1mdW5jdGlvbihiKXt2YXIgYz1kLl93cmFwcGVyO2lmKGMmJiJwZW5kaW5nIiE9Yy5wbGF5U3RhdGUmJmMuZWZmZWN0KXJldHVybiBudWxsPT1iP3ZvaWQgYy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCk6MD09YiYmYy5wbGF5YmFja1JhdGU8MCYmKGV8fChlPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYy5lZmZlY3QudGltaW5nKSksYj1hLmNhbGN1bGF0ZUl0ZXJhdGlvblByb2dyZXNzKGEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb24oZSksLTEsZSksaXNOYU4oYil8fG51bGw9PWIpPyhjLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYSl7YS5jdXJyZW50VGltZT0tMX0pLHZvaWQgYy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCkpOnZvaWQgMH0sZz1uZXcgS2V5ZnJhbWVFZmZlY3QobnVsbCxbXSxjLl90aW1pbmcsYy5faWQpO3JldHVybiBnLm9uc2FtcGxlPWYsZD1iLnRpbWVsaW5lLl9wbGF5KGcpfSxiLmJpbmRBbmltYXRpb25Gb3JHcm91cD1mdW5jdGlvbihhKXthLl9hbmltYXRpb24uX3dyYXBwZXI9YSxhLl9pc0dyb3VwPSEwLGIuYXdhaXRTdGFydFRpbWUoYSksYS5fY29uc3RydWN0Q2hpbGRBbmltYXRpb25zKCksYS5fc2V0RXh0ZXJuYWxBbmltYXRpb24oYSl9LGIuZ3JvdXBDaGlsZER1cmF0aW9uPWR9KGEsYyl9KCk7CgohKGZ1bmN0aW9uKCl7Ci8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uCgogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiAgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuCgogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgKICAgIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQogICAgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULAogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NCiAgICBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgogICAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCmZ1bmN0aW9uIHQodCxlLG4saSl7dmFyIHIsbz1hcmd1bWVudHMubGVuZ3RoLGE9bzwzP2U6bnVsbD09PWk/aT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsbik6aTtpZigib2JqZWN0Ij09dHlwZW9mIFJlZmxlY3QmJiJmdW5jdGlvbiI9PXR5cGVvZiBSZWZsZWN0LmRlY29yYXRlKWE9UmVmbGVjdC5kZWNvcmF0ZSh0LGUsbixpKTtlbHNlIGZvcih2YXIgcz10Lmxlbmd0aC0xO3M+PTA7cy0tKShyPXRbc10pJiYoYT0obzwzP3IoYSk6bz4zP3IoZSxuLGEpOnIoZSxuKSl8fGEpO3JldHVybiBvPjMmJmEmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4sYSksYX1mdW5jdGlvbiBlKHQsZSl7aWYoIm9iamVjdCI9PXR5cGVvZiBSZWZsZWN0JiYiZnVuY3Rpb24iPT10eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSlyZXR1cm4gUmVmbGVjdC5tZXRhZGF0YSh0LGUpfWZ1bmN0aW9uIG4odCxlLG4saSl7cmV0dXJuIG5ldyhufHwobj1Qcm9taXNlKSkoKGZ1bmN0aW9uKHIsbyl7ZnVuY3Rpb24gYSh0KXt0cnl7bChpLm5leHQodCkpfWNhdGNoKHQpe28odCl9fWZ1bmN0aW9uIHModCl7dHJ5e2woaS50aHJvdyh0KSl9Y2F0Y2godCl7byh0KX19ZnVuY3Rpb24gbCh0KXt0LmRvbmU/cih0LnZhbHVlKTooZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIG4/dDpuZXcgbigoZnVuY3Rpb24oZSl7ZSh0KX0pKX0pKHQudmFsdWUpLnRoZW4oYSxzKX1sKChpPWkuYXBwbHkodCxlfHxbXSkpLm5leHQoKSl9KSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAxNiBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kCiAgICAgKiBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5CiAgICAgKiBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5CiAgICAgKiBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQCiAgICAgKiByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAgKi9mdW5jdGlvbiBpKHQpe3JldHVybiBlPT57aWYodClpZihlLmhhc093blByb3BlcnR5KCJpcyIpKXtpZih0IT09ZS5pcyl0aHJvdyBuZXcgRXJyb3IoYGN1c3RvbSBlbGVtZW50IHRhZyBuYW1lcyBkbyBub3QgbWF0Y2g6ICgke3R9ICE9PSAke2UuaXN9KWApfWVsc2UgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImlzIix7dmFsdWU6dH0pO3dpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoZS5pcyxlKX19ZnVuY3Rpb24gcih0LGUsbil7dC5jb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eSgicHJvcGVydGllcyIpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5jb25zdHJ1Y3RvciwicHJvcGVydGllcyIse3ZhbHVlOnt9fSksdC5jb25zdHJ1Y3Rvci5wcm9wZXJ0aWVzW2VdPU9iamVjdC5hc3NpZ24oe30sdC5jb25zdHJ1Y3Rvci5wcm9wZXJ0aWVzW2VdLG4pfWZ1bmN0aW9uIG8odCl7cmV0dXJuKGUsbik9PntyKGUsbix0KX19ZnVuY3Rpb24gYSguLi50KXtyZXR1cm4oZSxuKT0+e2UuY29uc3RydWN0b3IuaGFzT3duUHJvcGVydHkoIm9ic2VydmVycyIpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5jb25zdHJ1Y3Rvciwib2JzZXJ2ZXJzIix7dmFsdWU6W119KSxlLmNvbnN0cnVjdG9yLm9ic2VydmVycy5wdXNoKGAke259KCR7dC5qb2luKCIsIil9KWApfX1mdW5jdGlvbiBzKHQsLi4uZSl7cmV0dXJuKG4saSxvKT0+e2NvbnN0IGE9YF9fY29tcHV0ZSR7aX1gO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLGEse3ZhbHVlOm8uZ2V0fSksby5nZXQ9dm9pZCAwLHIobixpLHtjb21wdXRlZDpgJHthfSgke1t0LC4uLmVdLmpvaW4oIiwiKX0pYH0pfX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi93aW5kb3cuSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eT1mdW5jdGlvbih0LGUpe3JldHVybiB0fTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KbGV0IGwsYyx1PS8odXJsXCgpKFteKV0qKShcKSkvZyxoPS8oXlwvW15cL10pfCheIyl8KF5bXHctXGRdKjopLztmdW5jdGlvbiBkKHQsZSl7aWYodCYmaC50ZXN0KHQpKXJldHVybiB0O2lmKCIvLyI9PT10KXJldHVybiB0O2lmKHZvaWQgMD09PWwpe2w9ITE7dHJ5e2NvbnN0IHQ9bmV3IFVSTCgiYiIsImh0dHA6Ly9hIik7dC5wYXRobmFtZT0iYyUyMGQiLGw9Imh0dHA6Ly9hL2MlMjBkIj09PXQuaHJlZn1jYXRjaCh0KXt9fWlmKGV8fChlPWRvY3VtZW50LmJhc2VVUkl8fHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxsKXRyeXtyZXR1cm4gbmV3IFVSTCh0LGUpLmhyZWZ9Y2F0Y2goZSl7cmV0dXJuIHR9cmV0dXJuIGN8fChjPWRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgidGVtcCIpLGMuYmFzZT1jLmNyZWF0ZUVsZW1lbnQoImJhc2UiKSxjLmhlYWQuYXBwZW5kQ2hpbGQoYy5iYXNlKSxjLmFuY2hvcj1jLmNyZWF0ZUVsZW1lbnQoImEiKSxjLmJvZHkuYXBwZW5kQ2hpbGQoYy5hbmNob3IpKSxjLmJhc2UuaHJlZj1lLGMuYW5jaG9yLmhyZWY9dCxjLmFuY2hvci5ocmVmfHx0fWZ1bmN0aW9uIHAodCxlKXtyZXR1cm4gdC5yZXBsYWNlKHUsKGZ1bmN0aW9uKHQsbixpLHIpe3JldHVybiBuKyInIitkKGkucmVwbGFjZSgvWyInXS9nLCIiKSxlKSsiJyIrcn0pKX1mdW5jdGlvbiBmKHQpe3JldHVybiB0LnN1YnN0cmluZygwLHQubGFzdEluZGV4T2YoIi8iKSsxKX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9jb25zdCBtPSF3aW5kb3cuU2hhZHlET018fCF3aW5kb3cuU2hhZHlET00uaW5Vc2U7Qm9vbGVhbighd2luZG93LlNoYWR5Q1NTfHx3aW5kb3cuU2hhZHlDU1MubmF0aXZlQ3NzKTtjb25zdCBnPW0mJiJhZG9wdGVkU3R5bGVTaGVldHMiaW4gRG9jdW1lbnQucHJvdG90eXBlJiYicmVwbGFjZVN5bmMiaW4gQ1NTU3R5bGVTaGVldC5wcm90b3R5cGUmJigoKT0+e3RyeXtjb25zdCB0PW5ldyBDU1NTdHlsZVNoZWV0O3QucmVwbGFjZVN5bmMoIiIpO2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIGUuYXR0YWNoU2hhZG93KHttb2RlOiJvcGVuIn0pLGUuc2hhZG93Um9vdC5hZG9wdGVkU3R5bGVTaGVldHM9W3RdLGUuc2hhZG93Um9vdC5hZG9wdGVkU3R5bGVTaGVldHNbMF09PT10fWNhdGNoKHQpe3JldHVybiExfX0pKCk7bGV0IF89d2luZG93LlBvbHltZXImJndpbmRvdy5Qb2x5bWVyLnJvb3RQYXRofHxmKGRvY3VtZW50LmJhc2VVUkl8fHdpbmRvdy5sb2NhdGlvbi5ocmVmKSx5PXdpbmRvdy5Qb2x5bWVyJiZ3aW5kb3cuUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlfHx2b2lkIDAsdj13aW5kb3cuUG9seW1lciYmd2luZG93LlBvbHltZXIuc2V0UGFzc2l2ZVRvdWNoR2VzdHVyZXN8fCExLGI9d2luZG93LlBvbHltZXImJndpbmRvdy5Qb2x5bWVyLnN0cmljdFRlbXBsYXRlUG9saWN5fHwhMSx4PXdpbmRvdy5Qb2x5bWVyJiZ3aW5kb3cuUG9seW1lci5hbGxvd1RlbXBsYXRlRnJvbURvbU1vZHVsZXx8ITEsdz13aW5kb3cuUG9seW1lciYmd2luZG93LlBvbHltZXIubGVnYWN5T3B0aW1pemF0aW9uc3x8ITEsUz13aW5kb3cuUG9seW1lciYmd2luZG93LlBvbHltZXIubGVnYWN5V2FybmluZ3N8fCExLE09d2luZG93LlBvbHltZXImJndpbmRvdy5Qb2x5bWVyLnN5bmNJbml0aWFsUmVuZGVyfHwhMSxFPXdpbmRvdy5Qb2x5bWVyJiZ3aW5kb3cuUG9seW1lci5sZWdhY3lVbmRlZmluZWR8fCExLFQ9d2luZG93LlBvbHltZXImJndpbmRvdy5Qb2x5bWVyLm9yZGVyZWRDb21wdXRlZHx8ITEsQz13aW5kb3cuUG9seW1lciYmd2luZG93LlBvbHltZXIucmVtb3ZlTmVzdGVkVGVtcGxhdGVzfHwhMSxBPXdpbmRvdy5Qb2x5bWVyJiZ3aW5kb3cuUG9seW1lci5mYXN0RG9tSWZ8fCExLGs9d2luZG93LlBvbHltZXImJndpbmRvdy5Qb2x5bWVyLnN1cHByZXNzVGVtcGxhdGVOb3RpZmljYXRpb25zfHwhMSxMPXdpbmRvdy5Qb2x5bWVyJiZ3aW5kb3cuUG9seW1lci5sZWdhY3lOb09ic2VydmVkQXR0cmlidXRlc3x8ITEsUD13aW5kb3cuUG9seW1lciYmd2luZG93LlBvbHltZXIudXNlQWRvcHRlZFN0eWxlU2hlZXRzV2l0aEJ1aWx0Q1NTfHwhMSxOPTA7Y29uc3QgST1mdW5jdGlvbih0KXtsZXQgZT10Ll9fbWl4aW5BcHBsaWNhdGlvbnM7ZXx8KGU9bmV3IFdlYWtNYXAsdC5fX21peGluQXBwbGljYXRpb25zPWUpO2xldCBuPU4rKztyZXR1cm4gZnVuY3Rpb24gaShyKXtsZXQgbz1yLl9fbWl4aW5TZXQ7aWYobyYmb1tuXSlyZXR1cm4gcjtsZXQgYT1lLHM9YS5nZXQocik7aWYoIXMpe3M9dChyKSxhLnNldChyLHMpO2xldCBlPU9iamVjdC5jcmVhdGUocy5fX21peGluU2V0fHxvfHxudWxsKTtlW25dPSEwLHMuX19taXhpblNldD1lfXJldHVybiBzfX07Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovbGV0IFI9e30sTz17fTtmdW5jdGlvbiB6KHQsZSl7Ult0XT1PW3QudG9Mb3dlckNhc2UoKV09ZX1mdW5jdGlvbiBEKHQpe3JldHVybiBSW3RdfHxPW3QudG9Mb3dlckNhc2UoKV19Y2xhc3MgQiBleHRlbmRzIEhUTUxFbGVtZW50e3N0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCl7cmV0dXJuWyJpZCJdfXN0YXRpYyBpbXBvcnQodCxlKXtpZih0KXtsZXQgbj1EKHQpO3JldHVybiBuJiZlP24ucXVlcnlTZWxlY3RvcihlKTpufXJldHVybiBudWxsfWF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0LGUsbixpKXtlIT09biYmdGhpcy5yZWdpc3RlcigpfWdldCBhc3NldHBhdGgoKXtpZighdGhpcy5fX2Fzc2V0cGF0aCl7Y29uc3QgdD13aW5kb3cuSFRNTEltcG9ydHMmJkhUTUxJbXBvcnRzLmltcG9ydEZvckVsZW1lbnQ/SFRNTEltcG9ydHMuaW1wb3J0Rm9yRWxlbWVudCh0aGlzKXx8ZG9jdW1lbnQ6dGhpcy5vd25lckRvY3VtZW50LGU9ZCh0aGlzLmdldEF0dHJpYnV0ZSgiYXNzZXRwYXRoIil8fCIiLHQuYmFzZVVSSSk7dGhpcy5fX2Fzc2V0cGF0aD1mKGUpfXJldHVybiB0aGlzLl9fYXNzZXRwYXRofXJlZ2lzdGVyKHQpe2lmKHQ9dHx8dGhpcy5pZCl7aWYoYiYmdm9pZCAwIT09RCh0KSl0aHJvdyB6KHQsbnVsbCksbmV3IEVycm9yKGBzdHJpY3RUZW1wbGF0ZVBvbGljeTogZG9tLW1vZHVsZSAke3R9IHJlLXJlZ2lzdGVyZWRgKTt0aGlzLmlkPXQseih0LHRoaXMpLChmdW5jdGlvbiBlKHQpe3QucXVlcnlTZWxlY3Rvcigic3R5bGUiKSYmY29uc29sZS53YXJuKCJkb20tbW9kdWxlICVzIGhhcyBzdHlsZSBvdXRzaWRlIHRlbXBsYXRlIix0LmlkKX0pKHRoaXMpfX19Qi5wcm90b3R5cGUubW9kdWxlcz1SLGN1c3RvbUVsZW1lbnRzLmRlZmluZSgiZG9tLW1vZHVsZSIsQik7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IEg9InNoYWR5LXVuc2NvcGVkIjtmdW5jdGlvbiBGKHQpe3JldHVybiBCLmltcG9ydCh0KX1mdW5jdGlvbiBWKHQpe2NvbnN0IGU9cCgodC5ib2R5P3QuYm9keTp0KS50ZXh0Q29udGVudCx0LmJhc2VVUkkpLG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtyZXR1cm4gbi50ZXh0Q29udGVudD1lLG59ZnVuY3Rpb24gVSh0KXtjb25zdCBlPXQudHJpbSgpLnNwbGl0KC9ccysvKSxuPVtdO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKW4ucHVzaCguLi5qKGVbdF0pKTtyZXR1cm4gbn1mdW5jdGlvbiBqKHQpe2NvbnN0IGU9Rih0KTtpZighZSlyZXR1cm4gY29uc29sZS53YXJuKCJDb3VsZCBub3QgZmluZCBzdHlsZSBkYXRhIGluIG1vZHVsZSBuYW1lZCIsdCksW107aWYodm9pZCAwPT09ZS5fc3R5bGVzKXtjb25zdCB0PVtdO3QucHVzaCguLi5XKGUpKTtjb25zdCBuPWUucXVlcnlTZWxlY3RvcigidGVtcGxhdGUiKTtuJiZ0LnB1c2goLi4uRyhuLGUuYXNzZXRwYXRoKSksZS5fc3R5bGVzPXR9cmV0dXJuIGUuX3N0eWxlc31mdW5jdGlvbiBHKHQsZSl7aWYoIXQuX3N0eWxlcyl7Y29uc3Qgbj1bXSxpPXQuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCJzdHlsZSIpO2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7dCsrKXtsZXQgcj1pW3RdLG89ci5nZXRBdHRyaWJ1dGUoImluY2x1ZGUiKTtvJiZuLnB1c2goLi4uVShvKS5maWx0ZXIoKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbi5pbmRleE9mKHQpPT09ZX0pKSksZSYmKHIudGV4dENvbnRlbnQ9cChyLnRleHRDb250ZW50LGUpKSxuLnB1c2gocil9dC5fc3R5bGVzPW59cmV0dXJuIHQuX3N0eWxlc31mdW5jdGlvbiBXKHQpe2NvbnN0IGU9W10sbj10LnF1ZXJ5U2VsZWN0b3JBbGwoImxpbmtbcmVsPWltcG9ydF1bdHlwZX49Y3NzXSIpO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKXtsZXQgaT1uW3RdO2lmKGkuaW1wb3J0KXtjb25zdCB0PWkuaW1wb3J0LG49aS5oYXNBdHRyaWJ1dGUoSCk7aWYobiYmIXQuX3Vuc2NvcGVkU3R5bGUpe2NvbnN0IGU9Vih0KTtlLnNldEF0dHJpYnV0ZShILCIiKSx0Ll91bnNjb3BlZFN0eWxlPWV9ZWxzZSB0Ll9zdHlsZXx8KHQuX3N0eWxlPVYodCkpO2UucHVzaChuP3QuX3Vuc2NvcGVkU3R5bGU6dC5fc3R5bGUpfX1yZXR1cm4gZX1mdW5jdGlvbiBxKHQpe2xldCBlPUYodCk7aWYoZSYmdm9pZCAwPT09ZS5fY3NzVGV4dCl7bGV0IHQ9KGZ1bmN0aW9uIG4odCl7bGV0IGU9IiIsbj1XKHQpO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKWUrPW5bdF0udGV4dENvbnRlbnQ7cmV0dXJuIGV9Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovKShlKSxuPWUucXVlcnlTZWxlY3RvcigidGVtcGxhdGUiKTtuJiYodCs9KGZ1bmN0aW9uIGkodCxlKXtsZXQgbj0iIjtjb25zdCBpPUcodCxlKTtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrKyl7bGV0IGU9aVt0XTtlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSxuKz1lLnRleHRDb250ZW50fXJldHVybiBufSkobixlLmFzc2V0cGF0aCkpLGUuX2Nzc1RleHQ9dHx8bnVsbH1yZXR1cm4gZXx8Y29uc29sZS53YXJuKCJDb3VsZCBub3QgZmluZCBzdHlsZSBkYXRhIGluIG1vZHVsZSBuYW1lZCIsdCksZSYmZS5fY3NzVGV4dHx8IiJ9Y29uc3QgWT13aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS5ub1BhdGNoJiZ3aW5kb3cuU2hhZHlET00ud3JhcD93aW5kb3cuU2hhZHlET00ud3JhcDp3aW5kb3cuU2hhZHlET00/dD0+U2hhZHlET00ucGF0Y2godCk6dD0+dDsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9mdW5jdGlvbiBYKHQpe3JldHVybiB0LmluZGV4T2YoIi4iKT49MH1mdW5jdGlvbiAkKHQpe2xldCBlPXQuaW5kZXhPZigiLiIpO3JldHVybi0xPT09ZT90OnQuc2xpY2UoMCxlKX1mdW5jdGlvbiBLKHQsZSl7cmV0dXJuIDA9PT10LmluZGV4T2YoZSsiLiIpfWZ1bmN0aW9uIFoodCxlKXtyZXR1cm4gMD09PWUuaW5kZXhPZih0KyIuIil9ZnVuY3Rpb24gSih0LGUsbil7cmV0dXJuIGUrbi5zbGljZSh0Lmxlbmd0aCl9ZnVuY3Rpb24gUSh0LGUpe3JldHVybiB0PT09ZXx8Syh0LGUpfHxaKHQsZSl9ZnVuY3Rpb24gdHQodCl7aWYoQXJyYXkuaXNBcnJheSh0KSl7bGV0IGU9W107Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2xldCBpPXRbbl0udG9TdHJpbmcoKS5zcGxpdCgiLiIpO2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7dCsrKWUucHVzaChpW3RdKX1yZXR1cm4gZS5qb2luKCIuIil9cmV0dXJuIHR9ZnVuY3Rpb24gZXQodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dHQodCkuc3BsaXQoIi4iKTp0LnRvU3RyaW5nKCkuc3BsaXQoIi4iKX1mdW5jdGlvbiBudCh0LGUsbil7bGV0IGk9dCxyPWV0KGUpO2ZvcihsZXQgdD0wO3Q8ci5sZW5ndGg7dCsrKXtpZighaSlyZXR1cm47aT1pW3JbdF1dfXJldHVybiBuJiYobi5wYXRoPXIuam9pbigiLiIpKSxpfWZ1bmN0aW9uIGl0KHQsZSxuKXtsZXQgaT10LHI9ZXQoZSksbz1yW3IubGVuZ3RoLTFdO2lmKHIubGVuZ3RoPjEpe2ZvcihsZXQgdD0wO3Q8ci5sZW5ndGgtMTt0KyspaWYoaT1pW3JbdF1dLCFpKXJldHVybjtpW29dPW59ZWxzZSBpW2VdPW47cmV0dXJuIHIuam9pbigiLiIpfQovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL2NvbnN0IHJ0PXt9LG90PS8tW2Etel0vZyxhdD0vKFtBLVpdKS9nO2Z1bmN0aW9uIHN0KHQpe3JldHVybiBydFt0XXx8KHJ0W3RdPXQuaW5kZXhPZigiLSIpPDA/dDp0LnJlcGxhY2Uob3QsKHQ9PnRbMV0udG9VcHBlckNhc2UoKSkpKX1mdW5jdGlvbiBsdCh0KXtyZXR1cm4gcnRbdF18fChydFt0XT10LnJlcGxhY2UoYXQsIi0kMSIpLnRvTG93ZXJDYXNlKCkpfQovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL2xldCBjdD0wLHV0PTAsaHQ9W10sZHQ9MCxwdD0hMSxmdD1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIik7bmV3IHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyKChmdW5jdGlvbiBtdCgpe3B0PSExO2NvbnN0IHQ9aHQubGVuZ3RoO2ZvcihsZXQgZT0wO2U8dDtlKyspe2xldCB0PWh0W2VdO2lmKHQpdHJ5e3QoKX1jYXRjaCh0KXtzZXRUaW1lb3V0KCgoKT0+e3Rocm93IHR9KSl9fWh0LnNwbGljZSgwLHQpLHV0Kz10fSkpLm9ic2VydmUoZnQse2NoYXJhY3RlckRhdGE6ITB9KTtjb25zdCBndD17YWZ0ZXI6dD0+KHtydW46ZT0+d2luZG93LnNldFRpbWVvdXQoZSx0KSxjYW5jZWwodCl7d2luZG93LmNsZWFyVGltZW91dCh0KX19KSxydW46KHQsZSk9PndpbmRvdy5zZXRUaW1lb3V0KHQsZSksY2FuY2VsKHQpe3dpbmRvdy5jbGVhclRpbWVvdXQodCl9fSxfdD17cnVuOnQ9PndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodCksY2FuY2VsKHQpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0KX19LHl0PXtydW46dD0+d2luZG93LnJlcXVlc3RJZGxlQ2FsbGJhY2s/d2luZG93LnJlcXVlc3RJZGxlQ2FsbGJhY2sodCk6d2luZG93LnNldFRpbWVvdXQodCwxNiksY2FuY2VsKHQpe3dpbmRvdy5jYW5jZWxJZGxlQ2FsbGJhY2s/d2luZG93LmNhbmNlbElkbGVDYWxsYmFjayh0KTp3aW5kb3cuY2xlYXJUaW1lb3V0KHQpfX0sdnQ9e3J1bjp0PT4ocHR8fChwdD0hMCxmdC50ZXh0Q29udGVudD1kdCsrKSxodC5wdXNoKHQpLGN0KyspLGNhbmNlbCh0KXtjb25zdCBlPXQtdXQ7aWYoZT49MCl7aWYoIWh0W2VdKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBhc3luYyBoYW5kbGU6ICIrdCk7aHRbZV09bnVsbH19fSxidD12dCx4dD1JKCh0PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGNyZWF0ZVByb3BlcnRpZXModCl7Y29uc3QgZT10aGlzLnByb3RvdHlwZTtmb3IobGV0IG4gaW4gdCluIGluIGV8fGUuX2NyZWF0ZVByb3BlcnR5QWNjZXNzb3Iobil9c3RhdGljIGF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eSh0KXtyZXR1cm4gdC50b0xvd2VyQ2FzZSgpfXN0YXRpYyB0eXBlRm9yUHJvcGVydHkodCl7fV9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKHQsZSl7dGhpcy5fYWRkUHJvcGVydHlUb0F0dHJpYnV0ZU1hcCh0KSx0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl9fZGF0YUhhc0FjY2Vzc29yIix0aGlzKSl8fCh0aGlzLl9fZGF0YUhhc0FjY2Vzc29yPU9iamVjdC5hc3NpZ24oe30sdGhpcy5fX2RhdGFIYXNBY2Nlc3NvcikpLHRoaXMuX19kYXRhSGFzQWNjZXNzb3JbdF18fCh0aGlzLl9fZGF0YUhhc0FjY2Vzc29yW3RdPSEwLHRoaXMuX2RlZmluZVByb3BlcnR5QWNjZXNzb3IodCxlKSl9X2FkZFByb3BlcnR5VG9BdHRyaWJ1dGVNYXAodCl7dGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJfX2RhdGFBdHRyaWJ1dGVzIix0aGlzKSl8fCh0aGlzLl9fZGF0YUF0dHJpYnV0ZXM9T2JqZWN0LmFzc2lnbih7fSx0aGlzLl9fZGF0YUF0dHJpYnV0ZXMpKTtsZXQgZT10aGlzLl9fZGF0YUF0dHJpYnV0ZXNbdF07cmV0dXJuIGV8fChlPXRoaXMuY29uc3RydWN0b3IuYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHQpLHRoaXMuX19kYXRhQXR0cmlidXRlc1tlXT10KSxlfV9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHQsZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsdCx7Z2V0KCl7cmV0dXJuIHRoaXMuX19kYXRhW3RdfSxzZXQ6ZT9mdW5jdGlvbigpe306ZnVuY3Rpb24oZSl7dGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5KHQsZSwhMCkmJnRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCl9fSl9Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX19kYXRhRW5hYmxlZD0hMSx0aGlzLl9fZGF0YVJlYWR5PSExLHRoaXMuX19kYXRhSW52YWxpZD0hMSx0aGlzLl9fZGF0YT17fSx0aGlzLl9fZGF0YVBlbmRpbmc9bnVsbCx0aGlzLl9fZGF0YU9sZD1udWxsLHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcz1udWxsLHRoaXMuX19kYXRhQ291bnRlcj0wLHRoaXMuX19zZXJpYWxpemluZz0hMSx0aGlzLl9pbml0aWFsaXplUHJvcGVydGllcygpfXJlYWR5KCl7dGhpcy5fX2RhdGFSZWFkeT0hMCx0aGlzLl9mbHVzaFByb3BlcnRpZXMoKX1faW5pdGlhbGl6ZVByb3BlcnRpZXMoKXtmb3IobGV0IHQgaW4gdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcil0aGlzLmhhc093blByb3BlcnR5KHQpJiYodGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzPXRoaXMuX19kYXRhSW5zdGFuY2VQcm9wc3x8e30sdGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzW3RdPXRoaXNbdF0sZGVsZXRlIHRoaXNbdF0pfV9pbml0aWFsaXplSW5zdGFuY2VQcm9wZXJ0aWVzKHQpe09iamVjdC5hc3NpZ24odGhpcyx0KX1fc2V0UHJvcGVydHkodCxlKXt0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkodCxlKSYmdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKX1fZ2V0UHJvcGVydHkodCl7cmV0dXJuIHRoaXMuX19kYXRhW3RdfV9zZXRQZW5kaW5nUHJvcGVydHkodCxlLG4pe2xldCBpPXRoaXMuX19kYXRhW3RdLHI9dGhpcy5fc2hvdWxkUHJvcGVydHlDaGFuZ2UodCxlLGkpO3JldHVybiByJiYodGhpcy5fX2RhdGFQZW5kaW5nfHwodGhpcy5fX2RhdGFQZW5kaW5nPXt9LHRoaXMuX19kYXRhT2xkPXt9KSx0aGlzLl9fZGF0YU9sZCYmISh0IGluIHRoaXMuX19kYXRhT2xkKSYmKHRoaXMuX19kYXRhT2xkW3RdPWkpLHRoaXMuX19kYXRhW3RdPWUsdGhpcy5fX2RhdGFQZW5kaW5nW3RdPWUpLHJ9X2lzUHJvcGVydHlQZW5kaW5nKHQpe3JldHVybiEoIXRoaXMuX19kYXRhUGVuZGluZ3x8IXRoaXMuX19kYXRhUGVuZGluZy5oYXNPd25Qcm9wZXJ0eSh0KSl9X2ludmFsaWRhdGVQcm9wZXJ0aWVzKCl7IXRoaXMuX19kYXRhSW52YWxpZCYmdGhpcy5fX2RhdGFSZWFkeSYmKHRoaXMuX19kYXRhSW52YWxpZD0hMCxidC5ydW4oKCgpPT57dGhpcy5fX2RhdGFJbnZhbGlkJiYodGhpcy5fX2RhdGFJbnZhbGlkPSExLHRoaXMuX2ZsdXNoUHJvcGVydGllcygpKX0pKSl9X2VuYWJsZVByb3BlcnRpZXMoKXt0aGlzLl9fZGF0YUVuYWJsZWR8fCh0aGlzLl9fZGF0YUVuYWJsZWQ9ITAsdGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzJiYodGhpcy5faW5pdGlhbGl6ZUluc3RhbmNlUHJvcGVydGllcyh0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMpLHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcz1udWxsKSx0aGlzLnJlYWR5KCkpfV9mbHVzaFByb3BlcnRpZXMoKXt0aGlzLl9fZGF0YUNvdW50ZXIrKztjb25zdCB0PXRoaXMuX19kYXRhLGU9dGhpcy5fX2RhdGFQZW5kaW5nLG49dGhpcy5fX2RhdGFPbGQ7dGhpcy5fc2hvdWxkUHJvcGVydGllc0NoYW5nZSh0LGUsbikmJih0aGlzLl9fZGF0YVBlbmRpbmc9bnVsbCx0aGlzLl9fZGF0YU9sZD1udWxsLHRoaXMuX3Byb3BlcnRpZXNDaGFuZ2VkKHQsZSxuKSksdGhpcy5fX2RhdGFDb3VudGVyLS19X3Nob3VsZFByb3BlcnRpZXNDaGFuZ2UodCxlLG4pe3JldHVybiBCb29sZWFuKGUpfV9wcm9wZXJ0aWVzQ2hhbmdlZCh0LGUsbil7fV9zaG91bGRQcm9wZXJ0eUNoYW5nZSh0LGUsbil7cmV0dXJuIG4hPT1lJiYobj09bnx8ZT09ZSl9YXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHQsZSxuLGkpe2UhPT1uJiZ0aGlzLl9hdHRyaWJ1dGVUb1Byb3BlcnR5KHQsbiksc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrJiZzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodCxlLG4saSl9X2F0dHJpYnV0ZVRvUHJvcGVydHkodCxlLG4pe2lmKCF0aGlzLl9fc2VyaWFsaXppbmcpe2NvbnN0IGk9dGhpcy5fX2RhdGFBdHRyaWJ1dGVzLHI9aSYmaVt0XXx8dDt0aGlzW3JdPXRoaXMuX2Rlc2VyaWFsaXplVmFsdWUoZSxufHx0aGlzLmNvbnN0cnVjdG9yLnR5cGVGb3JQcm9wZXJ0eShyKSl9fV9wcm9wZXJ0eVRvQXR0cmlidXRlKHQsZSxuKXt0aGlzLl9fc2VyaWFsaXppbmc9ITAsdGhpcy5fdmFsdWVUb05vZGVBdHRyaWJ1dGUodGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg8Mz90aGlzW3RdOm4sZXx8dGhpcy5jb25zdHJ1Y3Rvci5hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkodCkpLHRoaXMuX19zZXJpYWxpemluZz0hMX1fdmFsdWVUb05vZGVBdHRyaWJ1dGUodCxlLG4pe2NvbnN0IGk9dGhpcy5fc2VyaWFsaXplVmFsdWUoZSk7ImNsYXNzIiE9PW4mJiJuYW1lIiE9PW4mJiJzbG90IiE9PW58fCh0PVkodCkpLHZvaWQgMD09PWk/dC5yZW1vdmVBdHRyaWJ1dGUobik6dC5zZXRBdHRyaWJ1dGUobixpKX1fc2VyaWFsaXplVmFsdWUodCl7c3dpdGNoKHR5cGVvZiB0KXtjYXNlImJvb2xlYW4iOnJldHVybiB0PyIiOnZvaWQgMDtkZWZhdWx0OnJldHVybiBudWxsIT10P3QudG9TdHJpbmcoKTp2b2lkIDB9fV9kZXNlcmlhbGl6ZVZhbHVlKHQsZSl7c3dpdGNoKGUpe2Nhc2UgQm9vbGVhbjpyZXR1cm4gbnVsbCE9PXQ7Y2FzZSBOdW1iZXI6cmV0dXJuIE51bWJlcih0KTtkZWZhdWx0OnJldHVybiB0fX19KSksd3Q9e307bGV0IFN0PUhUTUxFbGVtZW50LnByb3RvdHlwZTtmb3IoO1N0Oyl7bGV0IHQ9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoU3QpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXd0W3RbZV1dPSEwO1N0PU9iamVjdC5nZXRQcm90b3R5cGVPZihTdCl9Y29uc3QgTXQ9SSgodD0+e2NvbnN0IGU9eHQodCk7cmV0dXJuIGNsYXNzIGV4dGVuZHMgZXtzdGF0aWMgY3JlYXRlUHJvcGVydGllc0ZvckF0dHJpYnV0ZXMoKXtsZXQgdD10aGlzLm9ic2VydmVkQXR0cmlidXRlcztmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl0aGlzLnByb3RvdHlwZS5fY3JlYXRlUHJvcGVydHlBY2Nlc3NvcihzdCh0W2VdKSl9c3RhdGljIGF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eSh0KXtyZXR1cm4gbHQodCl9X2luaXRpYWxpemVQcm9wZXJ0aWVzKCl7dGhpcy5fX2RhdGFQcm90byYmKHRoaXMuX2luaXRpYWxpemVQcm90b1Byb3BlcnRpZXModGhpcy5fX2RhdGFQcm90byksdGhpcy5fX2RhdGFQcm90bz1udWxsKSxzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKX1faW5pdGlhbGl6ZVByb3RvUHJvcGVydGllcyh0KXtmb3IobGV0IGUgaW4gdCl0aGlzLl9zZXRQcm9wZXJ0eShlLHRbZV0pfV9lbnN1cmVBdHRyaWJ1dGUodCxlKXt0aGlzLmhhc0F0dHJpYnV0ZSh0KXx8dGhpcy5fdmFsdWVUb05vZGVBdHRyaWJ1dGUodGhpcyxlLHQpfV9zZXJpYWxpemVWYWx1ZSh0KXtzd2l0Y2godHlwZW9mIHQpe2Nhc2Uib2JqZWN0IjppZih0IGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gdC50b1N0cmluZygpO2lmKHQpdHJ5e3JldHVybiBKU09OLnN0cmluZ2lmeSh0KX1jYXRjaCh0KXtyZXR1cm4iIn1kZWZhdWx0OnJldHVybiBzdXBlci5fc2VyaWFsaXplVmFsdWUodCl9fV9kZXNlcmlhbGl6ZVZhbHVlKHQsZSl7bGV0IG47c3dpdGNoKGUpe2Nhc2UgT2JqZWN0OnRyeXtuPUpTT04ucGFyc2UodCl9Y2F0Y2goZSl7bj10fWJyZWFrO2Nhc2UgQXJyYXk6dHJ5e249SlNPTi5wYXJzZSh0KX1jYXRjaChlKXtuPW51bGwsY29uc29sZS53YXJuKGBQb2x5bWVyOjpBdHRyaWJ1dGVzOiBjb3VsZG4ndCBkZWNvZGUgQXJyYXkgYXMgSlNPTjogJHt0fWApfWJyZWFrO2Nhc2UgRGF0ZTpuPWlzTmFOKHQpP1N0cmluZyh0KTpOdW1iZXIodCksbj1uZXcgRGF0ZShuKTticmVhaztkZWZhdWx0Om49c3VwZXIuX2Rlc2VyaWFsaXplVmFsdWUodCxlKX1yZXR1cm4gbn1fZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcih0LGUpeyEoZnVuY3Rpb24gbih0LGUpe2lmKCF3dFtlXSl7bGV0IG49dFtlXTt2b2lkIDAhPT1uJiYodC5fX2RhdGE/dC5fc2V0UGVuZGluZ1Byb3BlcnR5KGUsbik6KHQuX19kYXRhUHJvdG8/dC5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJfX2RhdGFQcm90byIsdCkpfHwodC5fX2RhdGFQcm90bz1PYmplY3QuY3JlYXRlKHQuX19kYXRhUHJvdG8pKTp0Ll9fZGF0YVByb3RvPXt9LHQuX19kYXRhUHJvdG9bZV09bikpfX0pKHRoaXMsdCksc3VwZXIuX2RlZmluZVByb3BlcnR5QWNjZXNzb3IodCxlKX1faGFzQWNjZXNzb3IodCl7cmV0dXJuIHRoaXMuX19kYXRhSGFzQWNjZXNzb3ImJnRoaXMuX19kYXRhSGFzQWNjZXNzb3JbdF19X2lzUHJvcGVydHlQZW5kaW5nKHQpe3JldHVybiBCb29sZWFuKHRoaXMuX19kYXRhUGVuZGluZyYmdCBpbiB0aGlzLl9fZGF0YVBlbmRpbmcpfX19KSksRXQ9eyJkb20taWYiOiEwLCJkb20tcmVwZWF0IjohMH07Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovbGV0IFR0PSExLEN0PSExO2Z1bmN0aW9uIEF0KHQpe2xldCBlPXQuZ2V0QXR0cmlidXRlKCJpcyIpO2lmKGUmJkV0W2VdKXtsZXQgbj10O2ZvcihuLnJlbW92ZUF0dHJpYnV0ZSgiaXMiKSx0PW4ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpLG4ucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodCxuKSx0LmFwcGVuZENoaWxkKG4pO24uYXR0cmlidXRlcy5sZW5ndGg7KXQuc2V0QXR0cmlidXRlKG4uYXR0cmlidXRlc1swXS5uYW1lLG4uYXR0cmlidXRlc1swXS52YWx1ZSksbi5yZW1vdmVBdHRyaWJ1dGUobi5hdHRyaWJ1dGVzWzBdLm5hbWUpfXJldHVybiB0fWZ1bmN0aW9uIGt0KHQsZSl7bGV0IG49ZS5wYXJlbnRJbmZvJiZrdCh0LGUucGFyZW50SW5mbyk7aWYoIW4pcmV0dXJuIHQ7Zm9yKGxldCB0PW4uZmlyc3RDaGlsZCxpPTA7dDt0PXQubmV4dFNpYmxpbmcpaWYoZS5wYXJlbnRJbmRleD09PWkrKylyZXR1cm4gdH1mdW5jdGlvbiBMdCh0LGUsbixpKXtpLmlkJiYoZVtpLmlkXT1uKX1mdW5jdGlvbiBQdCh0LGUsbil7aWYobi5ldmVudHMmJm4uZXZlbnRzLmxlbmd0aClmb3IobGV0IGkscj0wLG89bi5ldmVudHM7cjxvLmxlbmd0aCYmKGk9b1tyXSk7cisrKXQuX2FkZE1ldGhvZEV2ZW50TGlzdGVuZXJUb05vZGUoZSxpLm5hbWUsaS52YWx1ZSx0KX1mdW5jdGlvbiBOdCh0LGUsbixpKXtuLnRlbXBsYXRlSW5mbyYmKGUuX3RlbXBsYXRlSW5mbz1uLnRlbXBsYXRlSW5mbyxlLl9wYXJlbnRUZW1wbGF0ZUluZm89aSl9Y29uc3QgSXQ9SSgodD0+Y2xhc3MgZXh0ZW5kcyB0e3N0YXRpYyBfcGFyc2VUZW1wbGF0ZSh0LGUpe2lmKCF0Ll90ZW1wbGF0ZUluZm8pe2xldCBuPXQuX3RlbXBsYXRlSW5mbz17fTtuLm5vZGVJbmZvTGlzdD1bXSxuLm5lc3RlZFRlbXBsYXRlPUJvb2xlYW4oZSksbi5zdHJpcFdoaXRlU3BhY2U9ZSYmZS5zdHJpcFdoaXRlU3BhY2V8fHQuaGFzQXR0cmlidXRlKCJzdHJpcC13aGl0ZXNwYWNlIiksdGhpcy5fcGFyc2VUZW1wbGF0ZUNvbnRlbnQodCxuLHtwYXJlbnQ6bnVsbH0pfXJldHVybiB0Ll90ZW1wbGF0ZUluZm99c3RhdGljIF9wYXJzZVRlbXBsYXRlQ29udGVudCh0LGUsbil7cmV0dXJuIHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlKHQuY29udGVudCxlLG4pfXN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGUodCxlLG4pe2xldCBpPSExLHI9dDtyZXR1cm4idGVtcGxhdGUiIT1yLmxvY2FsTmFtZXx8ci5oYXNBdHRyaWJ1dGUoInByZXNlcnZlLWNvbnRlbnQiKT8ic2xvdCI9PT1yLmxvY2FsTmFtZSYmKGUuaGFzSW5zZXJ0aW9uUG9pbnQ9ITApOmk9dGhpcy5fcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKHIsZSxuKXx8aSwoZnVuY3Rpb24gbyh0KXsoZnVuY3Rpb24gZSgpe2lmKCFUdCl7VHQ9ITA7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpO3QucGxhY2Vob2xkZXI9ImEiLEN0PXQucGxhY2Vob2xkZXI9PT10LnRleHRDb250ZW50fXJldHVybiBDdH0pKCkmJiJ0ZXh0YXJlYSI9PT10LmxvY2FsTmFtZSYmdC5wbGFjZWhvbGRlciYmdC5wbGFjZWhvbGRlcj09PXQudGV4dENvbnRlbnQmJih0LnRleHRDb250ZW50PW51bGwpfSkociksci5maXJzdENoaWxkJiZ0aGlzLl9wYXJzZVRlbXBsYXRlQ2hpbGROb2RlcyhyLGUsbiksci5oYXNBdHRyaWJ1dGVzJiZyLmhhc0F0dHJpYnV0ZXMoKSYmKGk9dGhpcy5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGVzKHIsZSxuKXx8aSksaXx8bi5ub3RlZH1zdGF0aWMgX3BhcnNlVGVtcGxhdGVDaGlsZE5vZGVzKHQsZSxuKXtpZigic2NyaXB0IiE9PXQubG9jYWxOYW1lJiYic3R5bGUiIT09dC5sb2NhbE5hbWUpZm9yKGxldCBpLHI9dC5maXJzdENoaWxkLG89MDtyO3I9aSl7aWYoInRlbXBsYXRlIj09ci5sb2NhbE5hbWUmJihyPUF0KHIpKSxpPXIubmV4dFNpYmxpbmcsci5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFKXtsZXQgbj1pO2Zvcig7biYmbi5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFOylyLnRleHRDb250ZW50Kz1uLnRleHRDb250ZW50LGk9bi5uZXh0U2libGluZyx0LnJlbW92ZUNoaWxkKG4pLG49aTtpZihlLnN0cmlwV2hpdGVTcGFjZSYmIXIudGV4dENvbnRlbnQudHJpbSgpKXt0LnJlbW92ZUNoaWxkKHIpO2NvbnRpbnVlfX1sZXQgYT17cGFyZW50SW5kZXg6byxwYXJlbnRJbmZvOm59O3RoaXMuX3BhcnNlVGVtcGxhdGVOb2RlKHIsZSxhKSYmKGEuaW5mb0luZGV4PWUubm9kZUluZm9MaXN0LnB1c2goYSktMSksci5wYXJlbnROb2RlJiZvKyt9fXN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKHQsZSxuKXtsZXQgaT10LHI9dGhpcy5fcGFyc2VUZW1wbGF0ZShpLGUpO3JldHVybihyLmNvbnRlbnQ9aS5jb250ZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKS5hcHBlbmRDaGlsZChpLmNvbnRlbnQpLG4udGVtcGxhdGVJbmZvPXIsITB9c3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZUF0dHJpYnV0ZXModCxlLG4pe2xldCBpPSExLHI9QXJyYXkuZnJvbSh0LmF0dHJpYnV0ZXMpO2ZvcihsZXQgbyxhPXIubGVuZ3RoLTE7bz1yW2FdO2EtLSlpPXRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlKHQsZSxuLG8ubmFtZSxvLnZhbHVlKXx8aTtyZXR1cm4gaX1zdGF0aWMgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlKHQsZSxuLGkscil7cmV0dXJuIm9uLSI9PT1pLnNsaWNlKDAsMyk/KHQucmVtb3ZlQXR0cmlidXRlKGkpLG4uZXZlbnRzPW4uZXZlbnRzfHxbXSxuLmV2ZW50cy5wdXNoKHtuYW1lOmkuc2xpY2UoMyksdmFsdWU6cn0pLCEwKToiaWQiPT09aSYmKG4uaWQ9ciwhMCl9c3RhdGljIF9jb250ZW50Rm9yVGVtcGxhdGUodCl7bGV0IGU9dC5fdGVtcGxhdGVJbmZvO3JldHVybiBlJiZlLmNvbnRlbnR8fHQuY29udGVudH1fc3RhbXBUZW1wbGF0ZSh0LGUpe3QmJiF0LmNvbnRlbnQmJndpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50JiZIVE1MVGVtcGxhdGVFbGVtZW50LmRlY29yYXRlJiZIVE1MVGVtcGxhdGVFbGVtZW50LmRlY29yYXRlKHQpO2xldCBuPShlPWV8fHRoaXMuY29uc3RydWN0b3IuX3BhcnNlVGVtcGxhdGUodCkpLm5vZGVJbmZvTGlzdCxpPWRvY3VtZW50LmltcG9ydE5vZGUoZS5jb250ZW50fHx0LmNvbnRlbnQsITApO2kuX19ub0luc2VydGlvblBvaW50PSFlLmhhc0luc2VydGlvblBvaW50O2xldCByPWkubm9kZUxpc3Q9bmV3IEFycmF5KG4ubGVuZ3RoKTtpLiQ9e307Zm9yKGxldCB0LG89MCxhPW4ubGVuZ3RoO288YSYmKHQ9bltvXSk7bysrKXtsZXQgbj1yW29dPWt0KGksdCk7THQoMCxpLiQsbix0KSxOdCgwLG4sdCxlKSxQdCh0aGlzLG4sdCl9cmV0dXJuIGk9aSxpfV9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKHQsZSxuLGkpe2xldCByPShmdW5jdGlvbiBvKHQsZSxuKXtyZXR1cm4gdD10Ll9tZXRob2RIb3N0fHx0LGZ1bmN0aW9uKGUpe3Rbbl0/dFtuXShlLGUuZGV0YWlsKTpjb25zb2xlLndhcm4oImxpc3RlbmVyIG1ldGhvZCBgIituKyJgIG5vdCBkZWZpbmVkIil9fSkoaT1pfHx0LDAsbik7cmV0dXJuIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUodCxlLHIpLHJ9X2FkZEV2ZW50TGlzdGVuZXJUb05vZGUodCxlLG4pe3QuYWRkRXZlbnRMaXN0ZW5lcihlLG4pfV9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUodCxlLG4pe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLG4pfX0pKTsKLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3CiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrUHJvdG90eXBhbFR5cGVzfQogICAgICogQGxpY2Vuc2UgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQKICAgICAqIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkKICAgICAqIGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkKICAgICAqIEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAKICAgICAqIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICAqL2xldCBSdD0wO2NvbnN0IE90PVtdLHp0PXtDT01QVVRFOiJfX2NvbXB1dGVFZmZlY3RzIixSRUZMRUNUOiJfX3JlZmxlY3RFZmZlY3RzIixOT1RJRlk6Il9fbm90aWZ5RWZmZWN0cyIsUFJPUEFHQVRFOiJfX3Byb3BhZ2F0ZUVmZmVjdHMiLE9CU0VSVkU6Il9fb2JzZXJ2ZUVmZmVjdHMiLFJFQURfT05MWToiX19yZWFkT25seSJ9LER0PS9bQS1aXS87ZnVuY3Rpb24gQnQodCxlLG4pe2xldCBpPXRbZV07aWYoaSl7aWYoIXQuaGFzT3duUHJvcGVydHkoZSkmJihpPXRbZV09T2JqZWN0LmNyZWF0ZSh0W2VdKSxuKSlmb3IobGV0IHQgaW4gaSl7bGV0IGU9aVt0XSxuPWlbdF09QXJyYXkoZS5sZW5ndGgpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKW5bdF09ZVt0XX19ZWxzZSBpPXRbZV09e307cmV0dXJuIGl9ZnVuY3Rpb24gSHQodCxlLG4saSxyLG8pe2lmKGUpe2xldCBhPSExO2NvbnN0IHM9UnQrKztmb3IobGV0IGwgaW4gbil7bGV0IGM9ZVtyPyQobCk6bF07aWYoYylmb3IobGV0IGUsdT0wLGg9Yy5sZW5ndGg7dTxoJiYoZT1jW3VdKTt1KyspZS5pbmZvJiZlLmluZm8ubGFzdFJ1bj09PXN8fHImJiFWdChsLGUudHJpZ2dlcil8fChlLmluZm8mJihlLmluZm8ubGFzdFJ1bj1zKSxlLmZuKHQsbCxuLGksZS5pbmZvLHIsbyksYT0hMCl9cmV0dXJuIGF9cmV0dXJuITF9ZnVuY3Rpb24gRnQodCxlLG4saSxyLG8sYSxzKXtsZXQgbD0hMSxjPWVbYT8kKGkpOmldO2lmKGMpZm9yKGxldCBlLHU9MCxoPWMubGVuZ3RoO3U8aCYmKGU9Y1t1XSk7dSsrKWUuaW5mbyYmZS5pbmZvLmxhc3RSdW49PT1ufHxhJiYhVnQoaSxlLnRyaWdnZXIpfHwoZS5pbmZvJiYoZS5pbmZvLmxhc3RSdW49biksZS5mbih0LGkscixvLGUuaW5mbyxhLHMpLGw9ITApO3JldHVybiBsfWZ1bmN0aW9uIFZ0KHQsZSl7aWYoZSl7bGV0IG49ZS5uYW1lO3JldHVybiBuPT10fHwhKCFlLnN0cnVjdHVyZWR8fCFLKG4sdCkpfHwhKCFlLndpbGRjYXJkfHwhWihuLHQpKX1yZXR1cm4hMH1mdW5jdGlvbiBVdCh0LGUsbixpLHIpe2xldCBvPSJzdHJpbmciPT10eXBlb2Ygci5tZXRob2Q/dFtyLm1ldGhvZF06ci5tZXRob2QsYT1yLnByb3BlcnR5O28/by5jYWxsKHQsdC5fX2RhdGFbYV0saVthXSk6ci5keW5hbWljRm58fGNvbnNvbGUud2Fybigib2JzZXJ2ZXIgbWV0aG9kIGAiK3IubWV0aG9kKyJgIG5vdCBkZWZpbmVkIil9ZnVuY3Rpb24ganQodCxlLG4pe2xldCBpPSQoZSk7cmV0dXJuIGkhPT1lJiYoR3QodCxsdChpKSsiLWNoYW5nZWQiLG5bZV0sZSksITApfWZ1bmN0aW9uIEd0KHQsZSxuLGkpe2xldCByPXt2YWx1ZTpuLHF1ZXVlUHJvcGVydHk6ITB9O2kmJihyLnBhdGg9aSksWSh0KS5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChlLHtkZXRhaWw6cn0pKX1mdW5jdGlvbiBXdCh0LGUsbixpLHIsbyl7bGV0IGE9KG8/JChlKTplKSE9ZT9lOm51bGwscz1hP250KHQsYSk6dC5fX2RhdGFbZV07YSYmdm9pZCAwPT09cyYmKHM9bltlXSksR3QodCxyLmV2ZW50TmFtZSxzLGEpfWZ1bmN0aW9uIHF0KHQsZSxuLGkscil7bGV0IG89dC5fX2RhdGFbZV07eSYmKG89eShvLHIuYXR0ck5hbWUsImF0dHJpYnV0ZSIsdCkpLHQuX3Byb3BlcnR5VG9BdHRyaWJ1dGUoZSxyLmF0dHJOYW1lLG8pfWNvbnN0IFl0PSh0LGUsbik9PntsZXQgaT0wLHI9ZS5sZW5ndGgtMSxvPS0xO2Zvcig7aTw9cjspe2NvbnN0IGE9aStyPj4xLHM9bi5nZXQoZVthXS5tZXRob2RJbmZvKS1uLmdldCh0Lm1ldGhvZEluZm8pO2lmKHM8MClpPWErMTtlbHNle2lmKCEocz4wKSl7bz1hO2JyZWFrfXI9YS0xfX1vPDAmJihvPXIrMSksZS5zcGxpY2UobywwLHQpfSxYdD0odCxlLG4saSxyKT0+e2NvbnN0IG89ZVtyPyQodCk6dF07aWYobylmb3IobGV0IGU9MDtlPG8ubGVuZ3RoO2UrKyl7Y29uc3QgYT1vW2VdO2EuaW5mby5sYXN0UnVuPT09UnR8fHImJiFWdCh0LGEudHJpZ2dlcil8fChhLmluZm8ubGFzdFJ1bj1SdCxZdChhLmluZm8sbixpKSl9fTtmdW5jdGlvbiAkdCh0LGUsbixpLHIpe2xldCBvPW5lKHQsZSxuLDAscik7aWYobz09PU90KXJldHVybiExO2xldCBhPXIubWV0aG9kSW5mbztyZXR1cm4gdC5fX2RhdGFIYXNBY2Nlc3NvciYmdC5fX2RhdGFIYXNBY2Nlc3NvclthXT90Ll9zZXRQZW5kaW5nUHJvcGVydHkoYSxvLCEwKToodFthXT1vLCExKX1mdW5jdGlvbiBLdCh0LGUsbixpLHIsbyxhKXtuLmJpbmRpbmdzPW4uYmluZGluZ3N8fFtdO2xldCBzPXtraW5kOmksdGFyZ2V0OnIscGFydHM6byxsaXRlcmFsOmEsaXNDb21wb3VuZDoxIT09by5sZW5ndGh9O2lmKG4uYmluZGluZ3MucHVzaChzKSwoZnVuY3Rpb24gbCh0KXtyZXR1cm4gQm9vbGVhbih0LnRhcmdldCkmJiJhdHRyaWJ1dGUiIT10LmtpbmQmJiJ0ZXh0IiE9dC5raW5kJiYhdC5pc0NvbXBvdW5kJiYieyI9PT10LnBhcnRzWzBdLm1vZGV9KShzKSl7bGV0e2V2ZW50OnQsbmVnYXRlOmV9PXMucGFydHNbMF07cy5saXN0ZW5lckV2ZW50PXR8fGx0KHIpKyItY2hhbmdlZCIscy5saXN0ZW5lck5lZ2F0ZT1lfWxldCBjPWUubm9kZUluZm9MaXN0Lmxlbmd0aDtmb3IobGV0IG49MDtuPHMucGFydHMubGVuZ3RoO24rKyl7bGV0IGk9cy5wYXJ0c1tuXTtpLmNvbXBvdW5kSW5kZXg9bixadCh0LGUscyxpLGMpfX1mdW5jdGlvbiBadCh0LGUsbixpLHIpe2lmKCFpLmxpdGVyYWwpaWYoImF0dHJpYnV0ZSI9PT1uLmtpbmQmJiItIj09PW4udGFyZ2V0WzBdKWNvbnNvbGUud2FybigiQ2Fubm90IHNldCBhdHRyaWJ1dGUgIituLnRhcmdldCsnIGJlY2F1c2UgIi0iIGlzIG5vdCBhIHZhbGlkIGF0dHJpYnV0ZSBzdGFydGluZyBjaGFyYWN0ZXInKTtlbHNle2xldCBvPWkuZGVwZW5kZW5jaWVzLGE9e2luZGV4OnIsYmluZGluZzpuLHBhcnQ6aSxldmFsdWF0b3I6dH07Zm9yKGxldCBuPTA7bjxvLmxlbmd0aDtuKyspe2xldCBpPW9bbl07InN0cmluZyI9PXR5cGVvZiBpJiYoaT1zZShpKSxpLndpbGRjYXJkPSEwKSx0Ll9hZGRUZW1wbGF0ZVByb3BlcnR5RWZmZWN0KGUsaS5yb290UHJvcGVydHkse2ZuOkp0LGluZm86YSx0cmlnZ2VyOml9KX19fWZ1bmN0aW9uIEp0KHQsZSxuLGkscixvLGEpe2xldCBzPWFbci5pbmRleF0sbD1yLmJpbmRpbmcsYz1yLnBhcnQ7aWYobyYmYy5zb3VyY2UmJmUubGVuZ3RoPmMuc291cmNlLmxlbmd0aCYmInByb3BlcnR5Ij09bC5raW5kJiYhbC5pc0NvbXBvdW5kJiZzLl9faXNQcm9wZXJ0eUVmZmVjdHNDbGllbnQmJnMuX19kYXRhSGFzQWNjZXNzb3ImJnMuX19kYXRhSGFzQWNjZXNzb3JbbC50YXJnZXRdKXtsZXQgaT1uW2VdO2U9SihjLnNvdXJjZSxsLnRhcmdldCxlKSxzLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoZSxpLCExLCEwKSYmdC5fZW5xdWV1ZUNsaWVudChzKX1lbHNle2xldCBhPXIuZXZhbHVhdG9yLl9ldmFsdWF0ZUJpbmRpbmcodCxjLGUsbixpLG8pO2EhPT1PdCYmKGZ1bmN0aW9uIHUodCxlLG4saSxyKXtpZihyPShmdW5jdGlvbiBvKHQsZSxuLGkpe2lmKG4uaXNDb21wb3VuZCl7bGV0IHI9dC5fX2RhdGFDb21wb3VuZFN0b3JhZ2Vbbi50YXJnZXRdO3JbaS5jb21wb3VuZEluZGV4XT1lLGU9ci5qb2luKCIiKX1yZXR1cm4iYXR0cmlidXRlIiE9PW4ua2luZCYmKCJ0ZXh0Q29udGVudCIhPT1uLnRhcmdldCYmKCJ2YWx1ZSIhPT1uLnRhcmdldHx8ImlucHV0IiE9PXQubG9jYWxOYW1lJiYidGV4dGFyZWEiIT09dC5sb2NhbE5hbWUpfHwoZT1udWxsPT1lPyIiOmUpKSxlfSkoZSxyLG4saSkseSYmKHI9eShyLG4udGFyZ2V0LG4ua2luZCxlKSksImF0dHJpYnV0ZSI9PW4ua2luZCl0Ll92YWx1ZVRvTm9kZUF0dHJpYnV0ZShlLHIsbi50YXJnZXQpO2Vsc2V7bGV0IGk9bi50YXJnZXQ7ZS5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50JiZlLl9fZGF0YUhhc0FjY2Vzc29yJiZlLl9fZGF0YUhhc0FjY2Vzc29yW2ldP2VbenQuUkVBRF9PTkxZXSYmZVt6dC5SRUFEX09OTFldW2ldfHxlLl9zZXRQZW5kaW5nUHJvcGVydHkoaSxyKSYmdC5fZW5xdWV1ZUNsaWVudChlKTp0Ll9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZShlLGkscil9fSkodCxzLGwsYyxhKX19ZnVuY3Rpb24gUXQodCxlKXtpZihlLmlzQ29tcG91bmQpe2xldCBuPXQuX19kYXRhQ29tcG91bmRTdG9yYWdlfHwodC5fX2RhdGFDb21wb3VuZFN0b3JhZ2U9e30pLGk9ZS5wYXJ0cyxyPW5ldyBBcnJheShpLmxlbmd0aCk7Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0Kyspclt0XT1pW3RdLmxpdGVyYWw7bGV0IG89ZS50YXJnZXQ7bltvXT1yLGUubGl0ZXJhbCYmInByb3BlcnR5Ij09ZS5raW5kJiYoImNsYXNzTmFtZSI9PT1vJiYodD1ZKHQpKSx0W29dPWUubGl0ZXJhbCl9fWZ1bmN0aW9uIHRlKHQsZSxuKXtpZihuLmxpc3RlbmVyRXZlbnQpe2xldCBpPW4ucGFydHNbMF07dC5hZGRFdmVudExpc3RlbmVyKG4ubGlzdGVuZXJFdmVudCwoZnVuY3Rpb24odCl7IShmdW5jdGlvbiByKHQsZSxuLGksbyl7bGV0IGEscz10LmRldGFpbCxsPXMmJnMucGF0aDtsPyhpPUoobixpLGwpLGE9cyYmcy52YWx1ZSk6YT10LmN1cnJlbnRUYXJnZXRbbl0sYT1vPyFhOmEsZVt6dC5SRUFEX09OTFldJiZlW3p0LlJFQURfT05MWV1baV18fCFlLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoaSxhLCEwLEJvb2xlYW4obCkpfHxzJiZzLnF1ZXVlUHJvcGVydHl8fGUuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCl9KSh0LGUsbi50YXJnZXQsaS5zb3VyY2UsaS5uZWdhdGUpfSkpfX1mdW5jdGlvbiBlZSh0LGUsbixpLHIsbyl7bGV0IGE9e21ldGhvZE5hbWU6ZS5tZXRob2ROYW1lLGFyZ3M6ZS5hcmdzLG1ldGhvZEluZm86cixkeW5hbWljRm46bz1lLnN0YXRpY3x8byYmKCJvYmplY3QiIT10eXBlb2Ygb3x8b1tlLm1ldGhvZE5hbWVdKX07Zm9yKGxldCByLG89MDtvPGUuYXJncy5sZW5ndGgmJihyPWUuYXJnc1tvXSk7bysrKXIubGl0ZXJhbHx8dC5fYWRkUHJvcGVydHlFZmZlY3Qoci5yb290UHJvcGVydHksbix7Zm46aSxpbmZvOmEsdHJpZ2dlcjpyfSk7cmV0dXJuIG8mJnQuX2FkZFByb3BlcnR5RWZmZWN0KGUubWV0aG9kTmFtZSxuLHtmbjppLGluZm86YX0pLGF9ZnVuY3Rpb24gbmUodCxlLG4saSxyKXtsZXQgbz10Ll9tZXRob2RIb3N0fHx0LGE9b1tyLm1ldGhvZE5hbWVdO2lmKGEpe2xldCBpPXQuX21hcnNoYWxBcmdzKHIuYXJncyxlLG4pO3JldHVybiBpPT09T3Q/T3Q6YS5hcHBseShvLGkpfXIuZHluYW1pY0ZufHxjb25zb2xlLndhcm4oIm1ldGhvZCBgIityLm1ldGhvZE5hbWUrImAgbm90IGRlZmluZWQiKX1jb25zdCBpZT1bXSxyZT1uZXcgUmVnRXhwKCIoXFxbXFxbfHt7KVxccyooPzooISlcXHMqKT8oKD86W2EtekEtWl8kXVtcXHcuOiRcXC0qXSopXFxzKig/OlxcKFxccyooPzooPzooPzooKD86W2EtekEtWl8kXVtcXHcuOiRcXC0qXSopfCg/OlstK10/WzAtOV0qXFwuP1swLTldKyg/OltlRV1bLStdP1swLTldKyk/KXwoPzooPzonKD86W14nXFxcXF18XFxcXC4pKicpfCg/OlwiKD86W15cIlxcXFxdfFxcXFwuKSpcIikpKVxccyopKD86LFxccyooPzooKD86W2EtekEtWl8kXVtcXHcuOiRcXC0qXSopfCg/OlstK10/WzAtOV0qXFwuP1swLTldKyg/OltlRV1bLStdP1swLTldKyk/KXwoPzooPzonKD86W14nXFxcXF18XFxcXC4pKicpfCg/OlwiKD86W15cIlxcXFxdfFxcXFwuKSpcIikpKVxccyopKSopPylcXClcXHMqKT8pKD86XV18fX0pIiwiZyIpO2Z1bmN0aW9uIG9lKHQpe2xldCBlPSIiO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKWUrPXRbbl0ubGl0ZXJhbHx8IiI7cmV0dXJuIGV9ZnVuY3Rpb24gYWUodCl7bGV0IGU9dC5tYXRjaCgvKFteXHNdKz8pXCgoW1xzXFNdKilcKS8pO2lmKGUpe2xldCB0PXttZXRob2ROYW1lOmVbMV0sc3RhdGljOiEwLGFyZ3M6aWV9O3JldHVybiBlWzJdLnRyaW0oKT8oZnVuY3Rpb24gbih0LGUpe3JldHVybiBlLmFyZ3M9dC5tYXAoKGZ1bmN0aW9uKHQpe2xldCBuPXNlKHQpO3JldHVybiBuLmxpdGVyYWx8fChlLnN0YXRpYz0hMSksbn0pLHRoaXMpLGV9KShlWzJdLnJlcGxhY2UoL1xcLC9nLCImY29tbWE7Iikuc3BsaXQoIiwiKSx0KTp0fXJldHVybiBudWxsfWZ1bmN0aW9uIHNlKHQpe2xldCBlPXQudHJpbSgpLnJlcGxhY2UoLyZjb21tYTsvZywiLCIpLnJlcGxhY2UoL1xcKC4pL2csIiQxIiksbj17bmFtZTplLHZhbHVlOiIiLGxpdGVyYWw6ITF9LGk9ZVswXTtzd2l0Y2goIi0iPT09aSYmKGk9ZVsxXSksaT49IjAiJiZpPD0iOSImJihpPSIjIiksaSl7Y2FzZSInIjpjYXNlJyInOm4udmFsdWU9ZS5zbGljZSgxLC0xKSxuLmxpdGVyYWw9ITA7YnJlYWs7Y2FzZSIjIjpuLnZhbHVlPU51bWJlcihlKSxuLmxpdGVyYWw9ITB9cmV0dXJuIG4ubGl0ZXJhbHx8KG4ucm9vdFByb3BlcnR5PSQoZSksbi5zdHJ1Y3R1cmVkPVgoZSksbi5zdHJ1Y3R1cmVkJiYobi53aWxkY2FyZD0iLioiPT1lLnNsaWNlKC0yKSxuLndpbGRjYXJkJiYobi5uYW1lPWUuc2xpY2UoMCwtMikpKSksbn1mdW5jdGlvbiBsZSh0LGUsbil7bGV0IGk9bnQodCxuKTtyZXR1cm4gdm9pZCAwPT09aSYmKGk9ZVtuXSksaX1mdW5jdGlvbiBjZSh0LGUsbixpKXtjb25zdCByPXtpbmRleFNwbGljZXM6aX07RSYmIXQuX292ZXJyaWRlTGVnYWN5VW5kZWZpbmVkJiYoZS5zcGxpY2VzPXIpLHQubm90aWZ5UGF0aChuKyIuc3BsaWNlcyIsciksdC5ub3RpZnlQYXRoKG4rIi5sZW5ndGgiLGUubGVuZ3RoKSxFJiYhdC5fb3ZlcnJpZGVMZWdhY3lVbmRlZmluZWQmJihyLmluZGV4U3BsaWNlcz1bXSl9ZnVuY3Rpb24gdWUodCxlLG4saSxyLG8pe2NlKHQsZSxuLFt7aW5kZXg6aSxhZGRlZENvdW50OnIscmVtb3ZlZDpvLG9iamVjdDplLHR5cGU6InNwbGljZSJ9XSl9Y29uc3QgaGU9SSgodD0+e2NvbnN0IGU9SXQoTXQodCkpO3JldHVybiBjbGFzcyBleHRlbmRzIGV7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX19pc1Byb3BlcnR5RWZmZWN0c0NsaWVudD0hMH1nZXQgUFJPUEVSVFlfRUZGRUNUX1RZUEVTKCl7cmV0dXJuIHp0fV9pbml0aWFsaXplUHJvcGVydGllcygpe3N1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpLHRoaXMuX3JlZ2lzdGVySG9zdCgpLHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5PSExLHRoaXMuX19kYXRhUGVuZGluZ0NsaWVudHM9bnVsbCx0aGlzLl9fZGF0YVRvTm90aWZ5PW51bGwsdGhpcy5fX2RhdGFMaW5rZWRQYXRocz1udWxsLHRoaXMuX19kYXRhSGFzUGF0aHM9ITEsdGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2U9dGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2V8fG51bGwsdGhpcy5fX2RhdGFIb3N0PXRoaXMuX19kYXRhSG9zdHx8bnVsbCx0aGlzLl9fZGF0YVRlbXA9e30sdGhpcy5fX2RhdGFDbGllbnRzSW5pdGlhbGl6ZWQ9ITF9X3JlZ2lzdGVySG9zdCgpe2lmKGRlLmxlbmd0aCl7bGV0IHQ9ZGVbZGUubGVuZ3RoLTFdO3QuX2VucXVldWVDbGllbnQodGhpcyksdGhpcy5fX2RhdGFIb3N0PXR9fV9pbml0aWFsaXplUHJvdG9Qcm9wZXJ0aWVzKHQpe3RoaXMuX19kYXRhPU9iamVjdC5jcmVhdGUodCksdGhpcy5fX2RhdGFQZW5kaW5nPU9iamVjdC5jcmVhdGUodCksdGhpcy5fX2RhdGFPbGQ9e319X2luaXRpYWxpemVJbnN0YW5jZVByb3BlcnRpZXModCl7bGV0IGU9dGhpc1t6dC5SRUFEX09OTFldO2ZvcihsZXQgbiBpbiB0KWUmJmVbbl18fCh0aGlzLl9fZGF0YVBlbmRpbmc9dGhpcy5fX2RhdGFQZW5kaW5nfHx7fSx0aGlzLl9fZGF0YU9sZD10aGlzLl9fZGF0YU9sZHx8e30sdGhpcy5fX2RhdGFbbl09dGhpcy5fX2RhdGFQZW5kaW5nW25dPXRbbl0pfV9hZGRQcm9wZXJ0eUVmZmVjdCh0LGUsbil7dGhpcy5fY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcih0LGU9PXp0LlJFQURfT05MWSk7bGV0IGk9QnQodGhpcyxlLCEwKVt0XTtpfHwoaT10aGlzW2VdW3RdPVtdKSxpLnB1c2gobil9X3JlbW92ZVByb3BlcnR5RWZmZWN0KHQsZSxuKXtsZXQgaT1CdCh0aGlzLGUsITApW3RdLHI9aS5pbmRleE9mKG4pO3I+PTAmJmkuc3BsaWNlKHIsMSl9X2hhc1Byb3BlcnR5RWZmZWN0KHQsZSl7bGV0IG49dGhpc1tlXTtyZXR1cm4gQm9vbGVhbihuJiZuW3RdKX1faGFzUmVhZE9ubHlFZmZlY3QodCl7cmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHQsenQuUkVBRF9PTkxZKX1faGFzTm90aWZ5RWZmZWN0KHQpe3JldHVybiB0aGlzLl9oYXNQcm9wZXJ0eUVmZmVjdCh0LHp0Lk5PVElGWSl9X2hhc1JlZmxlY3RFZmZlY3QodCl7cmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHQsenQuUkVGTEVDVCl9X2hhc0NvbXB1dGVkRWZmZWN0KHQpe3JldHVybiB0aGlzLl9oYXNQcm9wZXJ0eUVmZmVjdCh0LHp0LkNPTVBVVEUpfV9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgodCxlLG4saSl7aWYoaXx8JChBcnJheS5pc0FycmF5KHQpP3RbMF06dCkhPT10KXtpZighaSl7bGV0IG49bnQodGhpcyx0KTtpZighKHQ9aXQodGhpcyx0LGUpKXx8IXN1cGVyLl9zaG91bGRQcm9wZXJ0eUNoYW5nZSh0LGUsbikpcmV0dXJuITF9aWYodGhpcy5fX2RhdGFIYXNQYXRocz0hMCx0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkodCxlLG4pKXJldHVybihmdW5jdGlvbiByKHQsZSxuKXtsZXQgaT10Ll9fZGF0YUxpbmtlZFBhdGhzO2lmKGkpe2xldCByO2ZvcihsZXQgbyBpbiBpKXtsZXQgYT1pW29dO1oobyxlKT8ocj1KKG8sYSxlKSx0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocixuLCEwLCEwKSk6WihhLGUpJiYocj1KKGEsbyxlKSx0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocixuLCEwLCEwKSl9fX0pKHRoaXMsdCxlKSwhMH1lbHNle2lmKHRoaXMuX19kYXRhSGFzQWNjZXNzb3ImJnRoaXMuX19kYXRhSGFzQWNjZXNzb3JbdF0pcmV0dXJuIHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eSh0LGUsbik7dGhpc1t0XT1lfXJldHVybiExfV9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZSh0LGUsbil7bj09PXRbZV0mJiJvYmplY3QiIT10eXBlb2Ygbnx8KCJjbGFzc05hbWUiPT09ZSYmKHQ9WSh0KSksdFtlXT1uKX1fc2V0UGVuZGluZ1Byb3BlcnR5KHQsZSxuKXtsZXQgaT10aGlzLl9fZGF0YUhhc1BhdGhzJiZYKHQpO3JldHVybiEhdGhpcy5fc2hvdWxkUHJvcGVydHlDaGFuZ2UodCxlLChpP3RoaXMuX19kYXRhVGVtcDp0aGlzLl9fZGF0YSlbdF0pJiYodGhpcy5fX2RhdGFQZW5kaW5nfHwodGhpcy5fX2RhdGFQZW5kaW5nPXt9LHRoaXMuX19kYXRhT2xkPXt9KSx0IGluIHRoaXMuX19kYXRhT2xkfHwodGhpcy5fX2RhdGFPbGRbdF09dGhpcy5fX2RhdGFbdF0pLGk/dGhpcy5fX2RhdGFUZW1wW3RdPWU6dGhpcy5fX2RhdGFbdF09ZSx0aGlzLl9fZGF0YVBlbmRpbmdbdF09ZSwoaXx8dGhpc1t6dC5OT1RJRlldJiZ0aGlzW3p0Lk5PVElGWV1bdF0pJiYodGhpcy5fX2RhdGFUb05vdGlmeT10aGlzLl9fZGF0YVRvTm90aWZ5fHx7fSx0aGlzLl9fZGF0YVRvTm90aWZ5W3RdPW4pLCEwKX1fc2V0UHJvcGVydHkodCxlKXt0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkodCxlLCEwKSYmdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKX1faW52YWxpZGF0ZVByb3BlcnRpZXMoKXt0aGlzLl9fZGF0YVJlYWR5JiZ0aGlzLl9mbHVzaFByb3BlcnRpZXMoKX1fZW5xdWV1ZUNsaWVudCh0KXt0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzPXRoaXMuX19kYXRhUGVuZGluZ0NsaWVudHN8fFtdLHQhPT10aGlzJiZ0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzLnB1c2godCl9X2ZsdXNoQ2xpZW50cygpe3RoaXMuX19kYXRhQ2xpZW50c1JlYWR5P3RoaXMuX19lbmFibGVPckZsdXNoQ2xpZW50cygpOih0aGlzLl9fZGF0YUNsaWVudHNSZWFkeT0hMCx0aGlzLl9yZWFkeUNsaWVudHMoKSx0aGlzLl9fZGF0YVJlYWR5PSEwKX1fX2VuYWJsZU9yRmx1c2hDbGllbnRzKCl7bGV0IHQ9dGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cztpZih0KXt0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzPW51bGw7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2xldCBuPXRbZV07bi5fX2RhdGFFbmFibGVkP24uX19kYXRhUGVuZGluZyYmbi5fZmx1c2hQcm9wZXJ0aWVzKCk6bi5fZW5hYmxlUHJvcGVydGllcygpfX19X3JlYWR5Q2xpZW50cygpe3RoaXMuX19lbmFibGVPckZsdXNoQ2xpZW50cygpfXNldFByb3BlcnRpZXModCxlKXtmb3IobGV0IG4gaW4gdCkhZSYmdGhpc1t6dC5SRUFEX09OTFldJiZ0aGlzW3p0LlJFQURfT05MWV1bbl18fHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChuLHRbbl0sITApO3RoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCl9cmVhZHkoKXt0aGlzLl9mbHVzaFByb3BlcnRpZXMoKSx0aGlzLl9fZGF0YUNsaWVudHNSZWFkeXx8dGhpcy5fZmx1c2hDbGllbnRzKCksdGhpcy5fX2RhdGFQZW5kaW5nJiZ0aGlzLl9mbHVzaFByb3BlcnRpZXMoKX1fcHJvcGVydGllc0NoYW5nZWQodCxlLG4pe2xldCBpLHI9dGhpcy5fX2RhdGFIYXNQYXRoczt0aGlzLl9fZGF0YUhhc1BhdGhzPSExLChmdW5jdGlvbiBvKHQsZSxuLGkpe2xldCByPXRbenQuQ09NUFVURV07aWYocilpZihUKXtSdCsrO2NvbnN0IG89KGZ1bmN0aW9uIGEodCl7bGV0IGU9dC5jb25zdHJ1Y3Rvci5fX29yZGVyZWRDb21wdXRlZERlcHM7aWYoIWUpe2U9bmV3IE1hcDtjb25zdCBuPXRbenQuQ09NUFVURV07bGV0IGkse2NvdW50czpyLHJlYWR5Om8sdG90YWw6YX09KGZ1bmN0aW9uIHModCl7Y29uc3QgZT10Ll9fY29tcHV0ZUluZm8sbj17fSxpPXRbenQuQ09NUFVURV0scj1bXTtsZXQgbz0wO2ZvcihsZXQgdCBpbiBlKXtjb25zdCBpPWVbdF07bys9blt0XT1pLmFyZ3MuZmlsdGVyKCh0PT4hdC5saXRlcmFsKSkubGVuZ3RoKyhpLmR5bmFtaWNGbj8xOjApfWZvcihsZXQgdCBpbiBpKWVbdF18fHIucHVzaCh0KTtyZXR1cm57Y291bnRzOm4scmVhZHk6cix0b3RhbDpvfX0pKHQpO2Zvcig7aT1vLnNoaWZ0KCk7KXtlLnNldChpLGUuc2l6ZSk7Y29uc3QgdD1uW2ldO3QmJnQuZm9yRWFjaCgodD0+e2NvbnN0IGU9dC5pbmZvLm1ldGhvZEluZm87LS1hLDA9PS0tcltlXSYmby5wdXNoKGUpfSkpfTAhPT1hJiZjb25zb2xlLndhcm4oYENvbXB1dGVkIGdyYXBoIGZvciAke3QubG9jYWxOYW1lfSBpbmNvbXBsZXRlOyBjaXJjdWxhcj9gKSx0LmNvbnN0cnVjdG9yLl9fb3JkZXJlZENvbXB1dGVkRGVwcz1lfXJldHVybiBlfSkodCkscz1bXTtmb3IobGV0IHQgaW4gZSlYdCh0LHIscyxvLGkpO2xldCBsO2Zvcig7bD1zLnNoaWZ0KCk7KSR0KHQsIiIsZSwwLGwpJiZYdChsLm1ldGhvZEluZm8scixzLG8saSk7T2JqZWN0LmFzc2lnbihuLHQuX19kYXRhT2xkKSxPYmplY3QuYXNzaWduKGUsdC5fX2RhdGFQZW5kaW5nKSx0Ll9fZGF0YVBlbmRpbmc9bnVsbH1lbHNle2xldCBvPWU7Zm9yKDtIdCh0LHIsbyxuLGkpOylPYmplY3QuYXNzaWduKG4sdC5fX2RhdGFPbGQpLE9iamVjdC5hc3NpZ24oZSx0Ll9fZGF0YVBlbmRpbmcpLG89dC5fX2RhdGFQZW5kaW5nLHQuX19kYXRhUGVuZGluZz1udWxsfX0pKHRoaXMsZSxuLHIpLGk9dGhpcy5fX2RhdGFUb05vdGlmeSx0aGlzLl9fZGF0YVRvTm90aWZ5PW51bGwsdGhpcy5fcHJvcGFnYXRlUHJvcGVydHlDaGFuZ2VzKGUsbixyKSx0aGlzLl9mbHVzaENsaWVudHMoKSxIdCh0aGlzLHRoaXNbenQuUkVGTEVDVF0sZSxuLHIpLEh0KHRoaXMsdGhpc1t6dC5PQlNFUlZFXSxlLG4sciksaSYmKGZ1bmN0aW9uIGEodCxlLG4saSxyKXtsZXQgbyxhLHM9dFt6dC5OT1RJRlldLGw9UnQrKztmb3IobGV0IGEgaW4gZSllW2FdJiYocyYmRnQodCxzLGwsYSxuLGkscil8fHImJmp0KHQsYSxuKSkmJihvPSEwKTtvJiYoYT10Ll9fZGF0YUhvc3QpJiZhLl9pbnZhbGlkYXRlUHJvcGVydGllcyYmYS5faW52YWxpZGF0ZVByb3BlcnRpZXMoKX0pKHRoaXMsaSxlLG4sciksMT09dGhpcy5fX2RhdGFDb3VudGVyJiYodGhpcy5fX2RhdGFUZW1wPXt9KX1fcHJvcGFnYXRlUHJvcGVydHlDaGFuZ2VzKHQsZSxuKXt0aGlzW3p0LlBST1BBR0FURV0mJkh0KHRoaXMsdGhpc1t6dC5QUk9QQUdBVEVdLHQsZSxuKSx0aGlzLl9fdGVtcGxhdGVJbmZvJiZ0aGlzLl9ydW5FZmZlY3RzRm9yVGVtcGxhdGUodGhpcy5fX3RlbXBsYXRlSW5mbyx0LGUsbil9X3J1bkVmZmVjdHNGb3JUZW1wbGF0ZSh0LGUsbixpKXtjb25zdCByPShlLGkpPT57SHQodGhpcyx0LnByb3BlcnR5RWZmZWN0cyxlLG4saSx0Lm5vZGVMaXN0KTtmb3IobGV0IHI9dC5maXJzdENoaWxkO3I7cj1yLm5leHRTaWJsaW5nKXRoaXMuX3J1bkVmZmVjdHNGb3JUZW1wbGF0ZShyLGUsbixpKX07dC5ydW5FZmZlY3RzP3QucnVuRWZmZWN0cyhyLGUsaSk6cihlLGkpfWxpbmtQYXRocyh0LGUpe3Q9dHQodCksZT10dChlKSx0aGlzLl9fZGF0YUxpbmtlZFBhdGhzPXRoaXMuX19kYXRhTGlua2VkUGF0aHN8fHt9LHRoaXMuX19kYXRhTGlua2VkUGF0aHNbdF09ZX11bmxpbmtQYXRocyh0KXt0PXR0KHQpLHRoaXMuX19kYXRhTGlua2VkUGF0aHMmJmRlbGV0ZSB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzW3RdfW5vdGlmeVNwbGljZXModCxlKXtsZXQgbj17cGF0aDoiIn07Y2UodGhpcyxudCh0aGlzLHQsbiksbi5wYXRoLGUpfWdldCh0LGUpe3JldHVybiBudChlfHx0aGlzLHQpfXNldCh0LGUsbil7bj9pdChuLHQsZSk6dGhpc1t6dC5SRUFEX09OTFldJiZ0aGlzW3p0LlJFQURfT05MWV1bdF18fHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aCh0LGUsITApJiZ0aGlzLl9pbnZhbGlkYXRlUHJvcGVydGllcygpfXB1c2godCwuLi5lKXtsZXQgbj17cGF0aDoiIn0saT1udCh0aGlzLHQsbikscj1pLmxlbmd0aCxvPWkucHVzaCguLi5lKTtyZXR1cm4gZS5sZW5ndGgmJnVlKHRoaXMsaSxuLnBhdGgscixlLmxlbmd0aCxbXSksb31wb3AodCl7bGV0IGU9e3BhdGg6IiJ9LG49bnQodGhpcyx0LGUpLGk9Qm9vbGVhbihuLmxlbmd0aCkscj1uLnBvcCgpO3JldHVybiBpJiZ1ZSh0aGlzLG4sZS5wYXRoLG4ubGVuZ3RoLDAsW3JdKSxyfXNwbGljZSh0LGUsbiwuLi5pKXtsZXQgcixvPXtwYXRoOiIifSxhPW50KHRoaXMsdCxvKTtyZXR1cm4gZTwwP2U9YS5sZW5ndGgtTWF0aC5mbG9vcigtZSk6ZSYmKGU9TWF0aC5mbG9vcihlKSkscj0yPT09YXJndW1lbnRzLmxlbmd0aD9hLnNwbGljZShlKTphLnNwbGljZShlLG4sLi4uaSksKGkubGVuZ3RofHxyLmxlbmd0aCkmJnVlKHRoaXMsYSxvLnBhdGgsZSxpLmxlbmd0aCxyKSxyfXNoaWZ0KHQpe2xldCBlPXtwYXRoOiIifSxuPW50KHRoaXMsdCxlKSxpPUJvb2xlYW4obi5sZW5ndGgpLHI9bi5zaGlmdCgpO3JldHVybiBpJiZ1ZSh0aGlzLG4sZS5wYXRoLDAsMCxbcl0pLHJ9dW5zaGlmdCh0LC4uLmUpe2xldCBuPXtwYXRoOiIifSxpPW50KHRoaXMsdCxuKSxyPWkudW5zaGlmdCguLi5lKTtyZXR1cm4gZS5sZW5ndGgmJnVlKHRoaXMsaSxuLnBhdGgsMCxlLmxlbmd0aCxbXSkscn1ub3RpZnlQYXRoKHQsZSl7bGV0IG47aWYoMT09YXJndW1lbnRzLmxlbmd0aCl7bGV0IGk9e3BhdGg6IiJ9O2U9bnQodGhpcyx0LGkpLG49aS5wYXRofWVsc2Ugbj1BcnJheS5pc0FycmF5KHQpP3R0KHQpOnQ7dGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKG4sZSwhMCwhMCkmJnRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCl9X2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkodCxlKXt0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdCh0LHp0LlJFQURfT05MWSksZSYmKHRoaXNbIl9zZXQiKyhmdW5jdGlvbiBuKHQpe3JldHVybiB0WzBdLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHJpbmcoMSl9KSh0KV09ZnVuY3Rpb24oZSl7dGhpcy5fc2V0UHJvcGVydHkodCxlKX0pfV9jcmVhdGVQcm9wZXJ0eU9ic2VydmVyKHQsZSxuKXtsZXQgaT17cHJvcGVydHk6dCxtZXRob2Q6ZSxkeW5hbWljRm46Qm9vbGVhbihuKX07dGhpcy5fYWRkUHJvcGVydHlFZmZlY3QodCx6dC5PQlNFUlZFLHtmbjpVdCxpbmZvOmksdHJpZ2dlcjp7bmFtZTp0fX0pLG4mJnRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KGUsenQuT0JTRVJWRSx7Zm46VXQsaW5mbzppLHRyaWdnZXI6e25hbWU6ZX19KX1fY3JlYXRlTWV0aG9kT2JzZXJ2ZXIodCxlKXtsZXQgbj1hZSh0KTtpZighbil0aHJvdyBuZXcgRXJyb3IoIk1hbGZvcm1lZCBvYnNlcnZlciBleHByZXNzaW9uICciK3QrIiciKTtlZSh0aGlzLG4senQuT0JTRVJWRSxuZSxudWxsLGUpfV9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eSh0KXt0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdCh0LHp0Lk5PVElGWSx7Zm46V3QsaW5mbzp7ZXZlbnROYW1lOmx0KHQpKyItY2hhbmdlZCIscHJvcGVydHk6dH19KX1fY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkodCl7bGV0IGU9dGhpcy5jb25zdHJ1Y3Rvci5hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkodCk7Ii0iPT09ZVswXT9jb25zb2xlLndhcm4oIlByb3BlcnR5ICIrdCsiIGNhbm5vdCBiZSByZWZsZWN0ZWQgdG8gYXR0cmlidXRlICIrZSsnIGJlY2F1c2UgIi0iIGlzIG5vdCBhIHZhbGlkIHN0YXJ0aW5nIGF0dHJpYnV0ZSBuYW1lLiBVc2UgYSBsb3dlcmNhc2UgZmlyc3QgbGV0dGVyIGZvciB0aGUgcHJvcGVydHkgaW5zdGVhZC4nKTp0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdCh0LHp0LlJFRkxFQ1Qse2ZuOnF0LGluZm86e2F0dHJOYW1lOmV9fSl9X2NyZWF0ZUNvbXB1dGVkUHJvcGVydHkodCxlLG4pe2xldCBpPWFlKGUpO2lmKCFpKXRocm93IG5ldyBFcnJvcigiTWFsZm9ybWVkIGNvbXB1dGVkIGV4cHJlc3Npb24gJyIrZSsiJyIpO2NvbnN0IHI9ZWUodGhpcyxpLHp0LkNPTVBVVEUsJHQsdCxuKTtCdCh0aGlzLCJfX2NvbXB1dGVJbmZvIilbdF09cn1fbWFyc2hhbEFyZ3ModCxlLG4pe2NvbnN0IGk9dGhpcy5fX2RhdGEscj1bXTtmb3IobGV0IG89MCxhPXQubGVuZ3RoO288YTtvKyspe2xldHtuYW1lOmEsc3RydWN0dXJlZDpzLHdpbGRjYXJkOmwsdmFsdWU6YyxsaXRlcmFsOnV9PXRbb107aWYoIXUpaWYobCl7Y29uc3QgdD1aKGEsZSkscj1sZShpLG4sdD9lOmEpO2M9e3BhdGg6dD9lOmEsdmFsdWU6cixiYXNlOnQ/bnQoaSxhKTpyfX1lbHNlIGM9cz9sZShpLG4sYSk6aVthXTtpZihFJiYhdGhpcy5fb3ZlcnJpZGVMZWdhY3lVbmRlZmluZWQmJnZvaWQgMD09PWMmJnQubGVuZ3RoPjEpcmV0dXJuIE90O3Jbb109Y31yZXR1cm4gcn1zdGF0aWMgYWRkUHJvcGVydHlFZmZlY3QodCxlLG4pe3RoaXMucHJvdG90eXBlLl9hZGRQcm9wZXJ0eUVmZmVjdCh0LGUsbil9c3RhdGljIGNyZWF0ZVByb3BlcnR5T2JzZXJ2ZXIodCxlLG4pe3RoaXMucHJvdG90eXBlLl9jcmVhdGVQcm9wZXJ0eU9ic2VydmVyKHQsZSxuKX1zdGF0aWMgY3JlYXRlTWV0aG9kT2JzZXJ2ZXIodCxlKXt0aGlzLnByb3RvdHlwZS5fY3JlYXRlTWV0aG9kT2JzZXJ2ZXIodCxlKX1zdGF0aWMgY3JlYXRlTm90aWZ5aW5nUHJvcGVydHkodCl7dGhpcy5wcm90b3R5cGUuX2NyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5KHQpfXN0YXRpYyBjcmVhdGVSZWFkT25seVByb3BlcnR5KHQsZSl7dGhpcy5wcm90b3R5cGUuX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkodCxlKX1zdGF0aWMgY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkodCl7dGhpcy5wcm90b3R5cGUuX2NyZWF0ZVJlZmxlY3RlZFByb3BlcnR5KHQpfXN0YXRpYyBjcmVhdGVDb21wdXRlZFByb3BlcnR5KHQsZSxuKXt0aGlzLnByb3RvdHlwZS5fY3JlYXRlQ29tcHV0ZWRQcm9wZXJ0eSh0LGUsbil9c3RhdGljIGJpbmRUZW1wbGF0ZSh0KXtyZXR1cm4gdGhpcy5wcm90b3R5cGUuX2JpbmRUZW1wbGF0ZSh0KX1fYmluZFRlbXBsYXRlKHQsZSl7bGV0IG49dGhpcy5jb25zdHJ1Y3Rvci5fcGFyc2VUZW1wbGF0ZSh0KSxpPXRoaXMuX19wcmVCb3VuZFRlbXBsYXRlSW5mbz09bjtpZighaSlmb3IobGV0IHQgaW4gbi5wcm9wZXJ0eUVmZmVjdHMpdGhpcy5fY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcih0KTtpZihlKWlmKG49T2JqZWN0LmNyZWF0ZShuKSxuLndhc1ByZUJvdW5kPWksdGhpcy5fX3RlbXBsYXRlSW5mbyl7Y29uc3QgZT10Ll9wYXJlbnRUZW1wbGF0ZUluZm98fHRoaXMuX190ZW1wbGF0ZUluZm8saT1lLmxhc3RDaGlsZDtuLnBhcmVudD1lLGUubGFzdENoaWxkPW4sbi5wcmV2aW91c1NpYmxpbmc9aSxpP2kubmV4dFNpYmxpbmc9bjplLmZpcnN0Q2hpbGQ9bn1lbHNlIHRoaXMuX190ZW1wbGF0ZUluZm89bjtlbHNlIHRoaXMuX19wcmVCb3VuZFRlbXBsYXRlSW5mbz1uO3JldHVybiBufXN0YXRpYyBfYWRkVGVtcGxhdGVQcm9wZXJ0eUVmZmVjdCh0LGUsbil7KHQuaG9zdFByb3BzPXQuaG9zdFByb3BzfHx7fSlbZV09ITA7bGV0IGk9dC5wcm9wZXJ0eUVmZmVjdHM9dC5wcm9wZXJ0eUVmZmVjdHN8fHt9OyhpW2VdPWlbZV18fFtdKS5wdXNoKG4pfV9zdGFtcFRlbXBsYXRlKHQsZSl7ZT1lfHx0aGlzLl9iaW5kVGVtcGxhdGUodCwhMCksZGUucHVzaCh0aGlzKTtsZXQgbj1zdXBlci5fc3RhbXBUZW1wbGF0ZSh0LGUpO2lmKGRlLnBvcCgpLGUubm9kZUxpc3Q9bi5ub2RlTGlzdCwhZS53YXNQcmVCb3VuZCl7bGV0IHQ9ZS5jaGlsZE5vZGVzPVtdO2ZvcihsZXQgZT1uLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpdC5wdXNoKGUpfXJldHVybiBuLnRlbXBsYXRlSW5mbz1lLChmdW5jdGlvbiBpKHQsZSl7bGV0e25vZGVMaXN0Om4sbm9kZUluZm9MaXN0Oml9PWU7aWYoaS5sZW5ndGgpZm9yKGxldCBlPTA7ZTxpLmxlbmd0aDtlKyspe2xldCByPW5bZV0sbz1pW2VdLmJpbmRpbmdzO2lmKG8pZm9yKGxldCBlPTA7ZTxvLmxlbmd0aDtlKyspe2xldCBuPW9bZV07UXQocixuKSx0ZShyLHQsbil9ci5fX2RhdGFIb3N0PXR9fSkodGhpcyxlKSx0aGlzLl9fZGF0YUNsaWVudHNSZWFkeSYmKHRoaXMuX3J1bkVmZmVjdHNGb3JUZW1wbGF0ZShlLHRoaXMuX19kYXRhLG51bGwsITEpLHRoaXMuX2ZsdXNoQ2xpZW50cygpKSxufV9yZW1vdmVCb3VuZERvbSh0KXtjb25zdCBlPXQudGVtcGxhdGVJbmZvLHtwcmV2aW91c1NpYmxpbmc6bixuZXh0U2libGluZzppLHBhcmVudDpyfT1lO24/bi5uZXh0U2libGluZz1pOnImJihyLmZpcnN0Q2hpbGQ9aSksaT9pLnByZXZpb3VzU2libGluZz1uOnImJihyLmxhc3RDaGlsZD1uKSxlLm5leHRTaWJsaW5nPWUucHJldmlvdXNTaWJsaW5nPW51bGw7bGV0IG89ZS5jaGlsZE5vZGVzO2ZvcihsZXQgdD0wO3Q8by5sZW5ndGg7dCsrKXtsZXQgZT1vW3RdO1koWShlKS5wYXJlbnROb2RlKS5yZW1vdmVDaGlsZChlKX19c3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZSh0LG4saSl7bGV0IHI9ZS5fcGFyc2VUZW1wbGF0ZU5vZGUuY2FsbCh0aGlzLHQsbixpKTtpZih0Lm5vZGVUeXBlPT09Tm9kZS5URVhUX05PREUpe2xldCBlPXRoaXMuX3BhcnNlQmluZGluZ3ModC50ZXh0Q29udGVudCxuKTtlJiYodC50ZXh0Q29udGVudD1vZShlKXx8IiAiLEt0KHRoaXMsbixpLCJ0ZXh0IiwidGV4dENvbnRlbnQiLGUpLHI9ITApfXJldHVybiByfXN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUodCxuLGkscixvKXtsZXQgYT10aGlzLl9wYXJzZUJpbmRpbmdzKG8sbik7aWYoYSl7bGV0IGU9cixvPSJwcm9wZXJ0eSI7RHQudGVzdChyKT9vPSJhdHRyaWJ1dGUiOiIkIj09cltyLmxlbmd0aC0xXSYmKHI9ci5zbGljZSgwLC0xKSxvPSJhdHRyaWJ1dGUiKTtsZXQgcz1vZShhKTtyZXR1cm4gcyYmImF0dHJpYnV0ZSI9PW8mJigiY2xhc3MiPT1yJiZ0Lmhhc0F0dHJpYnV0ZSgiY2xhc3MiKSYmKHMrPSIgIit0LmdldEF0dHJpYnV0ZShyKSksdC5zZXRBdHRyaWJ1dGUocixzKSksImF0dHJpYnV0ZSI9PW8mJiJkaXNhYmxlLXVwZ3JhZGUkIj09ZSYmdC5zZXRBdHRyaWJ1dGUociwiIiksImlucHV0Ij09PXQubG9jYWxOYW1lJiYidmFsdWUiPT09ZSYmdC5zZXRBdHRyaWJ1dGUoZSwiIiksdC5yZW1vdmVBdHRyaWJ1dGUoZSksInByb3BlcnR5Ij09PW8mJihyPXN0KHIpKSxLdCh0aGlzLG4saSxvLHIsYSxzKSwhMH1yZXR1cm4gZS5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUuY2FsbCh0aGlzLHQsbixpLHIsbyl9c3RhdGljIF9wYXJzZVRlbXBsYXRlTmVzdGVkVGVtcGxhdGUodCxuLGkpe2xldCByPWUuX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZS5jYWxsKHRoaXMsdCxuLGkpO2NvbnN0IG89dC5wYXJlbnROb2RlLGE9aS50ZW1wbGF0ZUluZm8scz0iZG9tLWlmIj09PW8ubG9jYWxOYW1lO0MmJihzfHwiZG9tLXJlcGVhdCI9PT1vLmxvY2FsTmFtZSkmJihvLnJlbW92ZUNoaWxkKHQpLChpPWkucGFyZW50SW5mbykudGVtcGxhdGVJbmZvPWEsaS5ub3RlZD0hMCxyPSExKTtsZXQgbD1hLmhvc3RQcm9wcztpZihBJiZzKWwmJihuLmhvc3RQcm9wcz1PYmplY3QuYXNzaWduKG4uaG9zdFByb3BzfHx7fSxsKSxDfHwoaS5wYXJlbnRJbmZvLm5vdGVkPSEwKSk7ZWxzZXtsZXQgdD0ieyI7Zm9yKGxldCBlIGluIGwpS3QodGhpcyxuLGksInByb3BlcnR5IiwiX2hvc3RfIitlLFt7bW9kZTp0LHNvdXJjZTplLGRlcGVuZGVuY2llczpbZV0saG9zdFByb3A6ITB9XSl9cmV0dXJuIHJ9c3RhdGljIF9wYXJzZUJpbmRpbmdzKHQsZSl7bGV0IG4saT1bXSxyPTA7Zm9yKDtudWxsIT09KG49cmUuZXhlYyh0KSk7KXtuLmluZGV4PnImJmkucHVzaCh7bGl0ZXJhbDp0LnNsaWNlKHIsbi5pbmRleCl9KTtsZXQgbz1uWzFdWzBdLGE9Qm9vbGVhbihuWzJdKSxzPW5bM10udHJpbSgpLGw9ITEsYz0iIix1PS0xOyJ7Ij09byYmKHU9cy5pbmRleE9mKCI6OiIpKT4wJiYoYz1zLnN1YnN0cmluZyh1KzIpLHM9cy5zdWJzdHJpbmcoMCx1KSxsPSEwKTtsZXQgaD1hZShzKSxkPVtdO2lmKGgpe2xldHthcmdzOnQsbWV0aG9kTmFtZTpufT1oO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtsZXQgbj10W2VdO24ubGl0ZXJhbHx8ZC5wdXNoKG4pfWxldCBpPWUuZHluYW1pY0ZuczsoaSYmaVtuXXx8aC5zdGF0aWMpJiYoZC5wdXNoKG4pLGguZHluYW1pY0ZuPSEwKX1lbHNlIGQucHVzaChzKTtpLnB1c2goe3NvdXJjZTpzLG1vZGU6byxuZWdhdGU6YSxjdXN0b21FdmVudDpsLHNpZ25hdHVyZTpoLGRlcGVuZGVuY2llczpkLGV2ZW50OmN9KSxyPXJlLmxhc3RJbmRleH1pZihyJiZyPHQubGVuZ3RoKXtsZXQgZT10LnN1YnN0cmluZyhyKTtlJiZpLnB1c2goe2xpdGVyYWw6ZX0pfXJldHVybiBpLmxlbmd0aD9pOm51bGx9c3RhdGljIF9ldmFsdWF0ZUJpbmRpbmcodCxlLG4saSxyLG8pe2xldCBhO3JldHVybiBhPWUuc2lnbmF0dXJlP25lKHQsbixpLDAsZS5zaWduYXR1cmUpOm4hPWUuc291cmNlP250KHQsZS5zb3VyY2UpOm8mJlgobik/bnQodCxuKTp0Ll9fZGF0YVtuXSxlLm5lZ2F0ZSYmKGE9IWEpLGF9fX0pKSxkZT1bXSxwZT1JKCh0PT57Y29uc3QgZT14dCh0KTtmdW5jdGlvbiBuKHQpe2NvbnN0IGU9T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpO3JldHVybiBlLnByb3RvdHlwZSBpbnN0YW5jZW9mIHI/ZTpudWxsfWZ1bmN0aW9uIGkodCl7aWYoIXQuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiX19vd25Qcm9wZXJ0aWVzIix0KSkpe2xldCBlPW51bGw7aWYodC5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJwcm9wZXJ0aWVzIix0KSkpe2NvbnN0IG49dC5wcm9wZXJ0aWVzO24mJihlPSgKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KZnVuY3Rpb24gZSh0KXtjb25zdCBlPXt9O2ZvcihsZXQgbiBpbiB0KXtjb25zdCBpPXRbbl07ZVtuXT0iZnVuY3Rpb24iPT10eXBlb2YgaT97dHlwZTppfTppfXJldHVybiBlfSkobikpfXQuX19vd25Qcm9wZXJ0aWVzPWV9cmV0dXJuIHQuX19vd25Qcm9wZXJ0aWVzfWNsYXNzIHIgZXh0ZW5kcyBle3N0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCl7aWYoIXRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiX19vYnNlcnZlZEF0dHJpYnV0ZXMiLHRoaXMpKSl7Y29uc3QgdD10aGlzLl9wcm9wZXJ0aWVzO3RoaXMuX19vYnNlcnZlZEF0dHJpYnV0ZXM9dD9PYmplY3Qua2V5cyh0KS5tYXAoKHQ9PnRoaXMucHJvdG90eXBlLl9hZGRQcm9wZXJ0eVRvQXR0cmlidXRlTWFwKHQpKSk6W119cmV0dXJuIHRoaXMuX19vYnNlcnZlZEF0dHJpYnV0ZXN9c3RhdGljIGZpbmFsaXplKCl7aWYoIXRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiX19maW5hbGl6ZWQiLHRoaXMpKSl7Y29uc3QgdD1uKHRoaXMpO3QmJnQuZmluYWxpemUoKSx0aGlzLl9fZmluYWxpemVkPSEwLHRoaXMuX2ZpbmFsaXplQ2xhc3MoKX19c3RhdGljIF9maW5hbGl6ZUNsYXNzKCl7Y29uc3QgdD1pKHRoaXMpO3QmJnRoaXMuY3JlYXRlUHJvcGVydGllcyh0KX1zdGF0aWMgZ2V0IF9wcm9wZXJ0aWVzKCl7aWYoIXRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiX19wcm9wZXJ0aWVzIix0aGlzKSkpe2NvbnN0IHQ9bih0aGlzKTt0aGlzLl9fcHJvcGVydGllcz1PYmplY3QuYXNzaWduKHt9LHQmJnQuX3Byb3BlcnRpZXMsaSh0aGlzKSl9cmV0dXJuIHRoaXMuX19wcm9wZXJ0aWVzfXN0YXRpYyB0eXBlRm9yUHJvcGVydHkodCl7Y29uc3QgZT10aGlzLl9wcm9wZXJ0aWVzW3RdO3JldHVybiBlJiZlLnR5cGV9X2luaXRpYWxpemVQcm9wZXJ0aWVzKCl7dGhpcy5jb25zdHJ1Y3Rvci5maW5hbGl6ZSgpLHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpfWNvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2smJnN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCksdGhpcy5fZW5hYmxlUHJvcGVydGllcygpfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2smJnN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCl9fXJldHVybiByfSkpLGZlPXdpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkLG1lPUkoKHQ9Pntjb25zdCBlPXBlKGhlKHQpKTtmdW5jdGlvbiBuKHQsZSxuLGkpe24uY29tcHV0ZWQmJihuLnJlYWRPbmx5PSEwKSxuLmNvbXB1dGVkJiYodC5faGFzUmVhZE9ubHlFZmZlY3QoZSk/Y29uc29sZS53YXJuKGBDYW5ub3QgcmVkZWZpbmUgY29tcHV0ZWQgcHJvcGVydHkgJyR7ZX0nLmApOnQuX2NyZWF0ZUNvbXB1dGVkUHJvcGVydHkoZSxuLmNvbXB1dGVkLGkpKSxuLnJlYWRPbmx5JiYhdC5faGFzUmVhZE9ubHlFZmZlY3QoZSk/dC5fY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eShlLCFuLmNvbXB1dGVkKTohMT09PW4ucmVhZE9ubHkmJnQuX2hhc1JlYWRPbmx5RWZmZWN0KGUpJiZjb25zb2xlLndhcm4oYENhbm5vdCBtYWtlIHJlYWRPbmx5IHByb3BlcnR5ICcke2V9JyBub24tcmVhZE9ubHkuYCksbi5yZWZsZWN0VG9BdHRyaWJ1dGUmJiF0Ll9oYXNSZWZsZWN0RWZmZWN0KGUpP3QuX2NyZWF0ZVJlZmxlY3RlZFByb3BlcnR5KGUpOiExPT09bi5yZWZsZWN0VG9BdHRyaWJ1dGUmJnQuX2hhc1JlZmxlY3RFZmZlY3QoZSkmJmNvbnNvbGUud2FybihgQ2Fubm90IG1ha2UgcmVmbGVjdGVkIHByb3BlcnR5ICcke2V9JyBub24tcmVmbGVjdGVkLmApLG4ubm90aWZ5JiYhdC5faGFzTm90aWZ5RWZmZWN0KGUpP3QuX2NyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5KGUpOiExPT09bi5ub3RpZnkmJnQuX2hhc05vdGlmeUVmZmVjdChlKSYmY29uc29sZS53YXJuKGBDYW5ub3QgbWFrZSBub3RpZnkgcHJvcGVydHkgJyR7ZX0nIG5vbi1ub3RpZnkuYCksbi5vYnNlcnZlciYmdC5fY3JlYXRlUHJvcGVydHlPYnNlcnZlcihlLG4ub2JzZXJ2ZXIsaVtuLm9ic2VydmVyXSksdC5fYWRkUHJvcGVydHlUb0F0dHJpYnV0ZU1hcChlKX1yZXR1cm4gY2xhc3MgZXh0ZW5kcyBle3N0YXRpYyBnZXQgcG9seW1lckVsZW1lbnRWZXJzaW9uKCl7cmV0dXJuIjMuNC4xIn1zdGF0aWMgX2ZpbmFsaXplQ2xhc3MoKXtlLl9maW5hbGl6ZUNsYXNzLmNhbGwodGhpcyk7Y29uc3QgdD0oZnVuY3Rpb24gbih0KXtyZXR1cm4gdC5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJfX293bk9ic2VydmVycyIsdCkpfHwodC5fX293bk9ic2VydmVycz10Lmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIm9ic2VydmVycyIsdCkpP3Qub2JzZXJ2ZXJzOm51bGwpLHQuX19vd25PYnNlcnZlcnN9KSh0aGlzKTt0JiZ0aGlzLmNyZWF0ZU9ic2VydmVycyh0LHRoaXMuX3Byb3BlcnRpZXMpLHRoaXMuX3ByZXBhcmVUZW1wbGF0ZSgpfXN0YXRpYyBfcHJlcGFyZVRlbXBsYXRlKCl7bGV0IHQ9dGhpcy50ZW1wbGF0ZTt0JiYoInN0cmluZyI9PXR5cGVvZiB0Pyhjb25zb2xlLmVycm9yKCJ0ZW1wbGF0ZSBnZXR0ZXIgbXVzdCByZXR1cm4gSFRNTFRlbXBsYXRlRWxlbWVudCIpLHQ9bnVsbCk6d3x8KHQ9dC5jbG9uZU5vZGUoITApKSksdGhpcy5wcm90b3R5cGUuX3RlbXBsYXRlPXR9c3RhdGljIGNyZWF0ZVByb3BlcnRpZXModCl7Zm9yKGxldCBlIGluIHQpbih0aGlzLnByb3RvdHlwZSxlLHRbZV0sdCl9c3RhdGljIGNyZWF0ZU9ic2VydmVycyh0LGUpe2NvbnN0IG49dGhpcy5wcm90b3R5cGU7Zm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspbi5fY3JlYXRlTWV0aG9kT2JzZXJ2ZXIodFtpXSxlKX1zdGF0aWMgZ2V0IHRlbXBsYXRlKCl7aWYoIXRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiX3RlbXBsYXRlIix0aGlzKSkpe2NvbnN0IHQ9dGhpcy5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiX3RlbXBsYXRlIix0aGlzLnByb3RvdHlwZSkpP3RoaXMucHJvdG90eXBlLl90ZW1wbGF0ZTp2b2lkIDA7dGhpcy5fdGVtcGxhdGU9dm9pZCAwIT09dD90OnRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiaXMiLHRoaXMpKSYmKGZ1bmN0aW9uIGUodCl7bGV0IGU9bnVsbDtpZih0JiYoIWJ8fHgpJiYoZT1CLmltcG9ydCh0LCJ0ZW1wbGF0ZSIpLGImJiFlKSl0aHJvdyBuZXcgRXJyb3IoYHN0cmljdFRlbXBsYXRlUG9saWN5OiBleHBlY3RpbmcgZG9tLW1vZHVsZSBvciBudWxsIHRlbXBsYXRlIGZvciAke3R9YCk7cmV0dXJuIGV9KSh0aGlzLmlzKXx8T2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMucHJvdG90eXBlKS5jb25zdHJ1Y3Rvci50ZW1wbGF0ZX1yZXR1cm4gdGhpcy5fdGVtcGxhdGV9c3RhdGljIHNldCB0ZW1wbGF0ZSh0KXt0aGlzLl90ZW1wbGF0ZT10fXN0YXRpYyBnZXQgaW1wb3J0UGF0aCgpe2lmKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl9pbXBvcnRQYXRoIix0aGlzKSkpe2NvbnN0IHQ9dGhpcy5pbXBvcnRNZXRhO2lmKHQpdGhpcy5faW1wb3J0UGF0aD1mKHQudXJsKTtlbHNle2NvbnN0IHQ9Qi5pbXBvcnQodGhpcy5pcyk7dGhpcy5faW1wb3J0UGF0aD10JiZ0LmFzc2V0cGF0aHx8T2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMucHJvdG90eXBlKS5jb25zdHJ1Y3Rvci5pbXBvcnRQYXRofX1yZXR1cm4gdGhpcy5faW1wb3J0UGF0aH1jb25zdHJ1Y3Rvcigpe3N1cGVyKCl9X2luaXRpYWxpemVQcm9wZXJ0aWVzKCl7dGhpcy5jb25zdHJ1Y3Rvci5maW5hbGl6ZSgpLHRoaXMuY29uc3RydWN0b3IuX2ZpbmFsaXplVGVtcGxhdGUodGhpcy5sb2NhbE5hbWUpLHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpLHRoaXMucm9vdFBhdGg9Xyx0aGlzLmltcG9ydFBhdGg9dGhpcy5jb25zdHJ1Y3Rvci5pbXBvcnRQYXRoO2xldCB0PShmdW5jdGlvbiBlKHQpe2lmKCF0Lmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl9fcHJvcGVydHlEZWZhdWx0cyIsdCkpKXt0Ll9fcHJvcGVydHlEZWZhdWx0cz1udWxsO2xldCBlPXQuX3Byb3BlcnRpZXM7Zm9yKGxldCBuIGluIGUpe2xldCBpPWVbbl07InZhbHVlImluIGkmJih0Ll9fcHJvcGVydHlEZWZhdWx0cz10Ll9fcHJvcGVydHlEZWZhdWx0c3x8e30sdC5fX3Byb3BlcnR5RGVmYXVsdHNbbl09aSl9fXJldHVybiB0Ll9fcHJvcGVydHlEZWZhdWx0c30pKHRoaXMuY29uc3RydWN0b3IpO2lmKHQpZm9yKGxldCBlIGluIHQpe2xldCBuPXRbZV07aWYodGhpcy5fY2FuQXBwbHlQcm9wZXJ0eURlZmF1bHQoZSkpe2xldCB0PSJmdW5jdGlvbiI9PXR5cGVvZiBuLnZhbHVlP24udmFsdWUuY2FsbCh0aGlzKTpuLnZhbHVlO3RoaXMuX2hhc0FjY2Vzc29yKGUpP3RoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShlLHQsITApOnRoaXNbZV09dH19fV9jYW5BcHBseVByb3BlcnR5RGVmYXVsdCh0KXtyZXR1cm4hdGhpcy5oYXNPd25Qcm9wZXJ0eSh0KX1zdGF0aWMgX3Byb2Nlc3NTdHlsZVRleHQodCxlKXtyZXR1cm4gcCh0LGUpfXN0YXRpYyBfZmluYWxpemVUZW1wbGF0ZSh0KXtjb25zdCBlPXRoaXMucHJvdG90eXBlLl90ZW1wbGF0ZTtpZihlJiYhZS5fX3BvbHltZXJGaW5hbGl6ZWQpe2UuX19wb2x5bWVyRmluYWxpemVkPSEwO2NvbnN0IG49dGhpcy5pbXBvcnRQYXRoOyhmdW5jdGlvbiBpKHQsZSxuLHIpe2lmKCFmZSl7Y29uc3QgaT1lLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgic3R5bGUiKSxvPUcoZSksYT0oZnVuY3Rpb24gcyh0KXtsZXQgZT1GKHQpO3JldHVybiBlP1coZSk6W119KShuKSxsPWUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtmb3IobGV0IG49MDtuPGEubGVuZ3RoO24rKyl7bGV0IGk9YVtuXTtpLnRleHRDb250ZW50PXQuX3Byb2Nlc3NTdHlsZVRleHQoaS50ZXh0Q29udGVudCxyKSxlLmNvbnRlbnQuaW5zZXJ0QmVmb3JlKGksbCl9bGV0IGM9MDtmb3IobGV0IGU9MDtlPG8ubGVuZ3RoO2UrKyl7bGV0IG49b1tlXSxhPWlbY107YSE9PW4/KG49bi5jbG9uZU5vZGUoITApLGEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobixhKSk6YysrLG4udGV4dENvbnRlbnQ9dC5fcHJvY2Vzc1N0eWxlVGV4dChuLnRleHRDb250ZW50LHIpfX1pZih3aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGUoZSxuKSxQJiZmZSYmZyl7Y29uc3Qgbj1lLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgic3R5bGUiKTtpZihuKXtsZXQgZT0iIjtBcnJheS5mcm9tKG4pLmZvckVhY2goKHQ9PntlKz10LnRleHRDb250ZW50LHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KX0pKSx0Ll9zdHlsZVNoZWV0PW5ldyBDU1NTdHlsZVNoZWV0LHQuX3N0eWxlU2hlZXQucmVwbGFjZVN5bmMoZSl9fX0pKHRoaXMsZSx0LG4/ZChuKToiIiksdGhpcy5wcm90b3R5cGUuX2JpbmRUZW1wbGF0ZShlKX19Y29ubmVjdGVkQ2FsbGJhY2soKXt3aW5kb3cuU2hhZHlDU1MmJnRoaXMuX3RlbXBsYXRlJiZ3aW5kb3cuU2hhZHlDU1Muc3R5bGVFbGVtZW50KHRoaXMpLHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCl9cmVhZHkoKXt0aGlzLl90ZW1wbGF0ZSYmKHRoaXMucm9vdD10aGlzLl9zdGFtcFRlbXBsYXRlKHRoaXMuX3RlbXBsYXRlKSx0aGlzLiQ9dGhpcy5yb290LiQpLHN1cGVyLnJlYWR5KCl9X3JlYWR5Q2xpZW50cygpe3RoaXMuX3RlbXBsYXRlJiYodGhpcy5yb290PXRoaXMuX2F0dGFjaERvbSh0aGlzLnJvb3QpKSxzdXBlci5fcmVhZHlDbGllbnRzKCl9X2F0dGFjaERvbSh0KXtjb25zdCBlPVkodGhpcyk7aWYoZS5hdHRhY2hTaGFkb3cpcmV0dXJuIHQ/KGUuc2hhZG93Um9vdHx8KGUuYXR0YWNoU2hhZG93KHttb2RlOiJvcGVuIixzaGFkeVVwZ3JhZGVGcmFnbWVudDp0fSksZS5zaGFkb3dSb290LmFwcGVuZENoaWxkKHQpLHRoaXMuY29uc3RydWN0b3IuX3N0eWxlU2hlZXQmJihlLnNoYWRvd1Jvb3QuYWRvcHRlZFN0eWxlU2hlZXRzPVt0aGlzLmNvbnN0cnVjdG9yLl9zdHlsZVNoZWV0XSkpLE0mJndpbmRvdy5TaGFkeURPTSYmd2luZG93LlNoYWR5RE9NLmZsdXNoSW5pdGlhbChlLnNoYWRvd1Jvb3QpLGUuc2hhZG93Um9vdCk6bnVsbDt0aHJvdyBuZXcgRXJyb3IoIlNoYWRvd0RPTSBub3QgYXZhaWxhYmxlLiBQb2x5bWVyRWxlbWVudCBjYW4gY3JlYXRlIGRvbSBhcyBjaGlsZHJlbiBpbnN0ZWFkIG9mIGluIFNoYWRvd0RPTSBieSBzZXR0aW5nIGB0aGlzLnJvb3QgPSB0aGlzO2AgYmVmb3JlIGByZWFkeWAuIil9dXBkYXRlU3R5bGVzKHQpe3dpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLnN0eWxlU3VidHJlZSh0aGlzLHQpfXJlc29sdmVVcmwodCxlKXtyZXR1cm4hZSYmdGhpcy5pbXBvcnRQYXRoJiYoZT1kKHRoaXMuaW1wb3J0UGF0aCkpLGQodCxlKX1zdGF0aWMgX3BhcnNlVGVtcGxhdGVDb250ZW50KHQsbixpKXtyZXR1cm4gbi5keW5hbWljRm5zPW4uZHluYW1pY0Zuc3x8dGhpcy5fcHJvcGVydGllcyxlLl9wYXJzZVRlbXBsYXRlQ29udGVudC5jYWxsKHRoaXMsdCxuLGkpfXN0YXRpYyBfYWRkVGVtcGxhdGVQcm9wZXJ0eUVmZmVjdCh0LG4saSl7cmV0dXJuIVN8fG4gaW4gdGhpcy5fcHJvcGVydGllc3x8aS5pbmZvLnBhcnQuc2lnbmF0dXJlJiZpLmluZm8ucGFydC5zaWduYXR1cmUuc3RhdGljfHxpLmluZm8ucGFydC5ob3N0UHJvcHx8dC5uZXN0ZWRUZW1wbGF0ZXx8Y29uc29sZS53YXJuKGBQcm9wZXJ0eSAnJHtufScgdXNlZCBpbiB0ZW1wbGF0ZSBidXQgbm90IGRlY2xhcmVkIGluICdwcm9wZXJ0aWVzJzsgYXR0cmlidXRlIHdpbGwgbm90IGJlIG9ic2VydmVkLmApLGUuX2FkZFRlbXBsYXRlUHJvcGVydHlFZmZlY3QuY2FsbCh0aGlzLHQsbixpKX19fSkpOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjbGFzcyBnZXtjb25zdHJ1Y3Rvcih0KXt0aGlzLnZhbHVlPXQudG9TdHJpbmcoKX10b1N0cmluZygpe3JldHVybiB0aGlzLnZhbHVlfX1jb25zdCBfZT1mdW5jdGlvbiB0KGUsLi4ubil7Y29uc3QgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpO3JldHVybiBpLmlubmVySFRNTD1uLnJlZHVjZSgoKHQsbixpKT0+dCsoZnVuY3Rpb24gcih0KXtpZih0IGluc3RhbmNlb2YgSFRNTFRlbXBsYXRlRWxlbWVudClyZXR1cm4gdC5pbm5lckhUTUw7aWYodCBpbnN0YW5jZW9mIGdlKXJldHVybihmdW5jdGlvbiBlKHQpe2lmKHQgaW5zdGFuY2VvZiBnZSlyZXR1cm4gdC52YWx1ZTt0aHJvdyBuZXcgRXJyb3IoYG5vbi1saXRlcmFsIHZhbHVlIHBhc3NlZCB0byBQb2x5bWVyJ3MgaHRtbExpdGVyYWwgZnVuY3Rpb246ICR7dH1gKX0pKHQpO3Rocm93IG5ldyBFcnJvcihgbm9uLXRlbXBsYXRlIHZhbHVlIHBhc3NlZCB0byBQb2x5bWVyJ3MgaHRtbCBmdW5jdGlvbjogJHt0fWApfSkobikrZVtpKzFdKSxlWzBdKSxpfSx5ZT1tZShIVE1MRWxlbWVudCk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovdmFyIHZlPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gYmUodCl7aWYodC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBlPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLGkuZ2V0P2k6e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbbl19fSl9KSksZX12YXIgeGUsd2UsU2U9e2V4cG9ydHM6e319OwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBMb2Rhc2ggPGh0dHBzOi8vbG9kYXNoLmNvbS8+CiAgICAgKiBDb3B5cmlnaHQgT3BlbkpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9vcGVuanNmLm9yZy8+CiAgICAgKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+CiAgICAgKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPgogICAgICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzCiAgICAgKi94ZT1TZSx3ZT1TZS5leHBvcnRzLGZ1bmN0aW9uKCl7dmFyIHQsZT0iRXhwZWN0ZWQgYSBmdW5jdGlvbiIsbj0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyIsaT0iX19sb2Rhc2hfcGxhY2Vob2xkZXJfXyIscj0zMixvPTEyOCxhPTEvMCxzPTkwMDcxOTkyNTQ3NDA5OTEsbD1OYU4sYz00Mjk0OTY3Mjk1LHU9W1siYXJ5IixvXSxbImJpbmQiLDFdLFsiYmluZEtleSIsMl0sWyJjdXJyeSIsOF0sWyJjdXJyeVJpZ2h0IiwxNl0sWyJmbGlwIiw1MTJdLFsicGFydGlhbCIscl0sWyJwYXJ0aWFsUmlnaHQiLDY0XSxbInJlYXJnIiwyNTZdXSxoPSJbb2JqZWN0IEFyZ3VtZW50c10iLGQ9IltvYmplY3QgQXJyYXldIixwPSJbb2JqZWN0IEJvb2xlYW5dIixmPSJbb2JqZWN0IERhdGVdIixtPSJbb2JqZWN0IEVycm9yXSIsZz0iW29iamVjdCBGdW5jdGlvbl0iLF89IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIix5PSJbb2JqZWN0IE1hcF0iLHY9IltvYmplY3QgTnVtYmVyXSIsYj0iW29iamVjdCBPYmplY3RdIix4PSJbb2JqZWN0IFByb21pc2VdIix3PSJbb2JqZWN0IFJlZ0V4cF0iLFM9IltvYmplY3QgU2V0XSIsTT0iW29iamVjdCBTdHJpbmddIixFPSJbb2JqZWN0IFN5bWJvbF0iLFQ9IltvYmplY3QgV2Vha01hcF0iLEM9IltvYmplY3QgQXJyYXlCdWZmZXJdIixBPSJbb2JqZWN0IERhdGFWaWV3XSIsaz0iW29iamVjdCBGbG9hdDMyQXJyYXldIixMPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLFA9IltvYmplY3QgSW50OEFycmF5XSIsTj0iW29iamVjdCBJbnQxNkFycmF5XSIsST0iW29iamVjdCBJbnQzMkFycmF5XSIsUj0iW29iamVjdCBVaW50OEFycmF5XSIsTz0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLHo9IltvYmplY3QgVWludDE2QXJyYXldIixEPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsQj0vXGJfX3AgXCs9ICcnOy9nLEg9L1xiKF9fcCBcKz0pICcnIFwrL2csRj0vKF9fZVwoLio/XCl8XGJfX3RcKSkgXCtcbicnOy9nLFY9LyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLFU9L1smPD4iJ10vZyxqPVJlZ0V4cChWLnNvdXJjZSksRz1SZWdFeHAoVS5zb3VyY2UpLFc9LzwlLShbXHNcU10rPyklPi9nLHE9LzwlKFtcc1xTXSs/KSU+L2csWT0vPCU9KFtcc1xTXSs/KSU+L2csWD0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLywkPS9eXHcqJC8sSz0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxaPS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxKPVJlZ0V4cChaLnNvdXJjZSksUT0vXlxzKy8sdHQ9L1xzLyxldD0vXHsoPzpcblwvXCogXFt3cmFwcGVkIHdpdGggLitcXSBcKlwvKT9cbj8vLG50PS9ce1xuXC9cKiBcW3dyYXBwZWQgd2l0aCAoLispXF0gXCovLGl0PS8sPyAmIC8scnQ9L1teXHgwMC1ceDJmXHgzYS1ceDQwXHg1Yi1ceDYwXHg3Yi1ceDdmXSsvZyxvdD0vWygpPSx7fVxbXF1cL1xzXS8sYXQ9L1xcKFxcKT8vZyxzdD0vXCRceyhbXlxcfV0qKD86XFwuW15cXH1dKikqKVx9L2csbHQ9L1x3KiQvLGN0PS9eWy0rXTB4WzAtOWEtZl0rJC9pLHV0PS9eMGJbMDFdKyQvaSxodD0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyxkdD0vXjBvWzAtN10rJC9pLHB0PS9eKD86MHxbMS05XVxkKikkLyxmdD0vW1x4YzAtXHhkNlx4ZDgtXHhmNlx4ZjgtXHhmZlx1MDEwMC1cdTAxN2ZdL2csbXQ9LygkXikvLGd0PS9bJ1xuXHJcdTIwMjhcdTIwMjlcXF0vZyxfdD0iXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmIix5dD0iYS16XFx4ZGYtXFx4ZjZcXHhmOC1cXHhmZiIsdnQ9IkEtWlxceGMwLVxceGQ2XFx4ZDgtXFx4ZGUiLGJ0PSJcXHhhY1xceGIxXFx4ZDdcXHhmN1xceDAwLVxceDJmXFx4M2EtXFx4NDBcXHg1Yi1cXHg2MFxceDdiLVxceGJmXFx1MjAwMC1cXHUyMDZmIFxcdFxceDBiXFxmXFx4YTBcXHVmZWZmXFxuXFxyXFx1MjAyOFxcdTIwMjlcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwIix4dD0iWyIrYnQrIl0iLHd0PSJbIitfdCsiXSIsU3Q9IlxcZCsiLE10PSJbIit5dCsiXSIsRXQ9IlteXFx1ZDgwMC1cXHVkZmZmIitidCtTdCsiXFx1MjcwMC1cXHUyN2JmIit5dCt2dCsiXSIsVHQ9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIsQ3Q9IlteXFx1ZDgwMC1cXHVkZmZmXSIsQXQ9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLGt0PSJbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdIixMdD0iWyIrdnQrIl0iLFB0PSIoPzoiK010KyJ8IitFdCsiKSIsTnQ9Iig/OiIrTHQrInwiK0V0KyIpIixJdD0iKD86WyfigJldKD86ZHxsbHxtfHJlfHN8dHx2ZSkpPyIsUnQ9Iig/Olsn4oCZXSg/OkR8TEx8TXxSRXxTfFR8VkUpKT8iLE90PSIoPzoiK3d0KyJ8IitUdCsiKT8iLHp0PSJbXFx1ZmUwZVxcdWZlMGZdPyIsRHQ9enQrT3QrIig/OlxcdTIwMGQoPzoiK1tDdCxBdCxrdF0uam9pbigifCIpKyIpIit6dCtPdCsiKSoiLEJ0PSIoPzoiK1siW1xcdTI3MDAtXFx1MjdiZl0iLEF0LGt0XS5qb2luKCJ8IikrIikiK0R0LEh0PSIoPzoiK1tDdCt3dCsiPyIsd3QsQXQsa3QsIltcXHVkODAwLVxcdWRmZmZdIl0uam9pbigifCIpKyIpIixGdD1SZWdFeHAoIlsn4oCZXSIsImciKSxWdD1SZWdFeHAod3QsImciKSxVdD1SZWdFeHAoVHQrIig/PSIrVHQrIil8IitIdCtEdCwiZyIpLGp0PVJlZ0V4cChbTHQrIj8iK010KyIrIitJdCsiKD89IitbeHQsTHQsIiQiXS5qb2luKCJ8IikrIikiLE50KyIrIitSdCsiKD89IitbeHQsTHQrUHQsIiQiXS5qb2luKCJ8IikrIikiLEx0KyI/IitQdCsiKyIrSXQsTHQrIisiK1J0LCJcXGQqKD86MVNUfDJORHwzUkR8KD8hWzEyM10pXFxkVEgpKD89XFxifFthLXpfXSkiLCJcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxkdGgpKD89XFxifFtBLVpfXSkiLFN0LEJ0XS5qb2luKCJ8IiksImciKSxHdD1SZWdFeHAoIltcXHUyMDBkXFx1ZDgwMC1cXHVkZmZmIitfdCsiXFx1ZmUwZVxcdWZlMGZdIiksV3Q9L1thLXpdW0EtWl18W0EtWl17Mn1bYS16XXxbMC05XVthLXpBLVpdfFthLXpBLVpdWzAtOV18W15hLXpBLVowLTkgXS8scXQ9WyJBcnJheSIsIkJ1ZmZlciIsIkRhdGFWaWV3IiwiRGF0ZSIsIkVycm9yIiwiRmxvYXQzMkFycmF5IiwiRmxvYXQ2NEFycmF5IiwiRnVuY3Rpb24iLCJJbnQ4QXJyYXkiLCJJbnQxNkFycmF5IiwiSW50MzJBcnJheSIsIk1hcCIsIk1hdGgiLCJPYmplY3QiLCJQcm9taXNlIiwiUmVnRXhwIiwiU2V0IiwiU3RyaW5nIiwiU3ltYm9sIiwiVHlwZUVycm9yIiwiVWludDhBcnJheSIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiVWludDE2QXJyYXkiLCJVaW50MzJBcnJheSIsIldlYWtNYXAiLCJfIiwiY2xlYXJUaW1lb3V0IiwiaXNGaW5pdGUiLCJwYXJzZUludCIsInNldFRpbWVvdXQiXSxZdD0tMSxYdD17fTtYdFtrXT1YdFtMXT1YdFtQXT1YdFtOXT1YdFtJXT1YdFtSXT1YdFtPXT1YdFt6XT1YdFtEXT0hMCxYdFtoXT1YdFtkXT1YdFtDXT1YdFtwXT1YdFtBXT1YdFtmXT1YdFttXT1YdFtnXT1YdFt5XT1YdFt2XT1YdFtiXT1YdFt3XT1YdFtTXT1YdFtNXT1YdFtUXT0hMTt2YXIgJHQ9e307JHRbaF09JHRbZF09JHRbQ109JHRbQV09JHRbcF09JHRbZl09JHRba109JHRbTF09JHRbUF09JHRbTl09JHRbSV09JHRbeV09JHRbdl09JHRbYl09JHRbd109JHRbU109JHRbTV09JHRbRV09JHRbUl09JHRbT109JHRbel09JHRbRF09ITAsJHRbbV09JHRbZ109JHRbVF09ITE7dmFyIEt0PXsiXFwiOiJcXCIsIiciOiInIiwiXG4iOiJuIiwiXHIiOiJyIiwiXHUyMDI4IjoidTIwMjgiLCJcdTIwMjkiOiJ1MjAyOSJ9LFp0PXBhcnNlRmxvYXQsSnQ9cGFyc2VJbnQsUXQ9Im9iamVjdCI9PXR5cGVvZiB2ZSYmdmUmJnZlLk9iamVjdD09PU9iamVjdCYmdmUsdGU9Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixlZT1RdHx8dGV8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksbmU9d2UmJiF3ZS5ub2RlVHlwZSYmd2UsaWU9bmUmJnhlJiYheGUubm9kZVR5cGUmJnhlLHJlPWllJiZpZS5leHBvcnRzPT09bmUsb2U9cmUmJlF0LnByb2Nlc3MsYWU9KGZ1bmN0aW9uKCl7dHJ5e3JldHVybiBpZSYmaWUucmVxdWlyZSYmaWUucmVxdWlyZSgidXRpbCIpLnR5cGVzfHxvZSYmb2UuYmluZGluZyYmb2UuYmluZGluZygidXRpbCIpfWNhdGNoKHQpe319KSgpLHNlPWFlJiZhZS5pc0FycmF5QnVmZmVyLGxlPWFlJiZhZS5pc0RhdGUsY2U9YWUmJmFlLmlzTWFwLHVlPWFlJiZhZS5pc1JlZ0V4cCxoZT1hZSYmYWUuaXNTZXQsZGU9YWUmJmFlLmlzVHlwZWRBcnJheTtmdW5jdGlvbiBwZSh0LGUsbil7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHQuY2FsbChlKTtjYXNlIDE6cmV0dXJuIHQuY2FsbChlLG5bMF0pO2Nhc2UgMjpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSxuWzJdKX1yZXR1cm4gdC5hcHBseShlLG4pfWZ1bmN0aW9uIGZlKHQsZSxuLGkpe2Zvcih2YXIgcj0tMSxvPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK3I8bzspe3ZhciBhPXRbcl07ZShpLGEsbihhKSx0KX1yZXR1cm4gaX1mdW5jdGlvbiBtZSh0LGUpe2Zvcih2YXIgbj0tMSxpPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK248aSYmITEhPT1lKHRbbl0sbix0KTspO3JldHVybiB0fWZ1bmN0aW9uIGdlKHQsZSl7Zm9yKHZhciBuPW51bGw9PXQ/MDp0Lmxlbmd0aDtuLS0mJiExIT09ZSh0W25dLG4sdCk7KTtyZXR1cm4gdH1mdW5jdGlvbiBfZSh0LGUpe2Zvcih2YXIgbj0tMSxpPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK248aTspaWYoIWUodFtuXSxuLHQpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIHllKHQsZSl7Zm9yKHZhciBuPS0xLGk9bnVsbD09dD8wOnQubGVuZ3RoLHI9MCxvPVtdOysrbjxpOyl7dmFyIGE9dFtuXTtlKGEsbix0KSYmKG9bcisrXT1hKX1yZXR1cm4gb31mdW5jdGlvbiBiZSh0LGUpe3JldHVybiEobnVsbD09dHx8IXQubGVuZ3RoKSYmTmUodCxlLDApPi0xfWZ1bmN0aW9uIFNlKHQsZSxuKXtmb3IodmFyIGk9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7KytpPHI7KWlmKG4oZSx0W2ldKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBNZSh0LGUpe2Zvcih2YXIgbj0tMSxpPW51bGw9PXQ/MDp0Lmxlbmd0aCxyPUFycmF5KGkpOysrbjxpOylyW25dPWUodFtuXSxuLHQpO3JldHVybiByfWZ1bmN0aW9uIEVlKHQsZSl7Zm9yKHZhciBuPS0xLGk9ZS5sZW5ndGgscj10Lmxlbmd0aDsrK248aTspdFtyK25dPWVbbl07cmV0dXJuIHR9ZnVuY3Rpb24gVGUodCxlLG4saSl7dmFyIHI9LTEsbz1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKGkmJm8mJihuPXRbKytyXSk7KytyPG87KW49ZShuLHRbcl0scix0KTtyZXR1cm4gbn1mdW5jdGlvbiBDZSh0LGUsbixpKXt2YXIgcj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKGkmJnImJihuPXRbLS1yXSk7ci0tOyluPWUobix0W3JdLHIsdCk7cmV0dXJuIG59ZnVuY3Rpb24gQWUodCxlKXtmb3IodmFyIG49LTEsaT1udWxsPT10PzA6dC5sZW5ndGg7KytuPGk7KWlmKGUodFtuXSxuLHQpKXJldHVybiEwO3JldHVybiExfXZhciBrZT16ZSgibGVuZ3RoIik7ZnVuY3Rpb24gTGUodCxlLG4pe3ZhciBpO3JldHVybiBuKHQsKGZ1bmN0aW9uKHQsbixyKXtpZihlKHQsbixyKSlyZXR1cm4gaT1uLCExfSkpLGl9ZnVuY3Rpb24gUGUodCxlLG4saSl7Zm9yKHZhciByPXQubGVuZ3RoLG89bisoaT8xOi0xKTtpP28tLTorK288cjspaWYoZSh0W29dLG8sdCkpcmV0dXJuIG87cmV0dXJuLTF9ZnVuY3Rpb24gTmUodCxlLG4pe3JldHVybiBlPT1lPyhmdW5jdGlvbiBpKHQsZSxuKXtmb3IodmFyIGk9bi0xLHI9dC5sZW5ndGg7KytpPHI7KWlmKHRbaV09PT1lKXJldHVybiBpO3JldHVybi0xfSkodCxlLG4pOlBlKHQsUmUsbil9ZnVuY3Rpb24gSWUodCxlLG4saSl7Zm9yKHZhciByPW4tMSxvPXQubGVuZ3RoOysrcjxvOylpZihpKHRbcl0sZSkpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gUmUodCl7cmV0dXJuIHQhPXR9ZnVuY3Rpb24gT2UodCxlKXt2YXIgbj1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIG4/SGUodCxlKS9uOmx9ZnVuY3Rpb24gemUoZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBudWxsPT1uP3Q6bltlXX19ZnVuY3Rpb24gRGUoZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBudWxsPT1lP3Q6ZVtuXX19ZnVuY3Rpb24gQmUodCxlLG4saSxyKXtyZXR1cm4gcih0LChmdW5jdGlvbih0LHIsbyl7bj1pPyhpPSExLHQpOmUobix0LHIsbyl9KSksbn1mdW5jdGlvbiBIZShlLG4pe2Zvcih2YXIgaSxyPS0xLG89ZS5sZW5ndGg7KytyPG87KXt2YXIgYT1uKGVbcl0pO2EhPT10JiYoaT1pPT09dD9hOmkrYSl9cmV0dXJuIGl9ZnVuY3Rpb24gRmUodCxlKXtmb3IodmFyIG49LTEsaT1BcnJheSh0KTsrK248dDspaVtuXT1lKG4pO3JldHVybiBpfWZ1bmN0aW9uIFZlKHQpe3JldHVybiB0P3Quc2xpY2UoMCxhbih0KSsxKS5yZXBsYWNlKFEsIiIpOnR9ZnVuY3Rpb24gVWUodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX1mdW5jdGlvbiBqZSh0LGUpe3JldHVybiBNZShlLChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pKX1mdW5jdGlvbiBHZSh0LGUpe3JldHVybiB0LmhhcyhlKX1mdW5jdGlvbiBXZSh0LGUpe2Zvcih2YXIgbj0tMSxpPXQubGVuZ3RoOysrbjxpJiZOZShlLHRbbl0sMCk+LTE7KTtyZXR1cm4gbn1mdW5jdGlvbiBxZSh0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS0mJk5lKGUsdFtuXSwwKT4tMTspO3JldHVybiBufWZ1bmN0aW9uIFllKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoLGk9MDtuLS07KXRbbl09PT1lJiYrK2k7cmV0dXJuIGl9dmFyIFhlPURlKHsiw4AiOiJBIiwiw4EiOiJBIiwiw4IiOiJBIiwiw4MiOiJBIiwiw4QiOiJBIiwiw4UiOiJBIiwiw6AiOiJhIiwiw6EiOiJhIiwiw6IiOiJhIiwiw6MiOiJhIiwiw6QiOiJhIiwiw6UiOiJhIiwiw4ciOiJDIiwiw6ciOiJjIiwiw5AiOiJEIiwiw7AiOiJkIiwiw4giOiJFIiwiw4kiOiJFIiwiw4oiOiJFIiwiw4siOiJFIiwiw6giOiJlIiwiw6kiOiJlIiwiw6oiOiJlIiwiw6siOiJlIiwiw4wiOiJJIiwiw40iOiJJIiwiw44iOiJJIiwiw48iOiJJIiwiw6wiOiJpIiwiw60iOiJpIiwiw64iOiJpIiwiw68iOiJpIiwiw5EiOiJOIiwiw7EiOiJuIiwiw5IiOiJPIiwiw5MiOiJPIiwiw5QiOiJPIiwiw5UiOiJPIiwiw5YiOiJPIiwiw5giOiJPIiwiw7IiOiJvIiwiw7MiOiJvIiwiw7QiOiJvIiwiw7UiOiJvIiwiw7YiOiJvIiwiw7giOiJvIiwiw5kiOiJVIiwiw5oiOiJVIiwiw5siOiJVIiwiw5wiOiJVIiwiw7kiOiJ1Iiwiw7oiOiJ1Iiwiw7siOiJ1Iiwiw7wiOiJ1Iiwiw50iOiJZIiwiw70iOiJ5Iiwiw78iOiJ5Iiwiw4YiOiJBZSIsIsOmIjoiYWUiLCLDniI6IlRoIiwiw74iOiJ0aCIsIsOfIjoic3MiLCLEgCI6IkEiLCLEgiI6IkEiLCLEhCI6IkEiLCLEgSI6ImEiLCLEgyI6ImEiLCLEhSI6ImEiLCLEhiI6IkMiLCLEiCI6IkMiLCLEiiI6IkMiLCLEjCI6IkMiLCLEhyI6ImMiLCLEiSI6ImMiLCLEiyI6ImMiLCLEjSI6ImMiLCLEjiI6IkQiLCLEkCI6IkQiLCLEjyI6ImQiLCLEkSI6ImQiLCLEkiI6IkUiLCLElCI6IkUiLCLEliI6IkUiLCLEmCI6IkUiLCLEmiI6IkUiLCLEkyI6ImUiLCLElSI6ImUiLCLElyI6ImUiLCLEmSI6ImUiLCLEmyI6ImUiLCLEnCI6IkciLCLEniI6IkciLCLEoCI6IkciLCLEoiI6IkciLCLEnSI6ImciLCLEnyI6ImciLCLEoSI6ImciLCLEoyI6ImciLCLEpCI6IkgiLCLEpiI6IkgiLCLEpSI6ImgiLCLEpyI6ImgiLCLEqCI6IkkiLCLEqiI6IkkiLCLErCI6IkkiLCLEriI6IkkiLCLEsCI6IkkiLCLEqSI6ImkiLCLEqyI6ImkiLCLErSI6ImkiLCLEryI6ImkiLCLEsSI6ImkiLCLEtCI6IkoiLCLEtSI6ImoiLCLEtiI6IksiLCLEtyI6ImsiLCLEuCI6ImsiLCLEuSI6IkwiLCLEuyI6IkwiLCLEvSI6IkwiLCLEvyI6IkwiLCLFgSI6IkwiLCLEuiI6ImwiLCLEvCI6ImwiLCLEviI6ImwiLCLFgCI6ImwiLCLFgiI6ImwiLCLFgyI6Ik4iLCLFhSI6Ik4iLCLFhyI6Ik4iLCLFiiI6Ik4iLCLFhCI6Im4iLCLFhiI6Im4iLCLFiCI6Im4iLCLFiyI6Im4iLCLFjCI6Ik8iLCLFjiI6Ik8iLCLFkCI6Ik8iLCLFjSI6Im8iLCLFjyI6Im8iLCLFkSI6Im8iLCLFlCI6IlIiLCLFliI6IlIiLCLFmCI6IlIiLCLFlSI6InIiLCLFlyI6InIiLCLFmSI6InIiLCLFmiI6IlMiLCLFnCI6IlMiLCLFniI6IlMiLCLFoCI6IlMiLCLFmyI6InMiLCLFnSI6InMiLCLFnyI6InMiLCLFoSI6InMiLCLFoiI6IlQiLCLFpCI6IlQiLCLFpiI6IlQiLCLFoyI6InQiLCLFpSI6InQiLCLFpyI6InQiLCLFqCI6IlUiLCLFqiI6IlUiLCLFrCI6IlUiLCLFriI6IlUiLCLFsCI6IlUiLCLFsiI6IlUiLCLFqSI6InUiLCLFqyI6InUiLCLFrSI6InUiLCLFryI6InUiLCLFsSI6InUiLCLFsyI6InUiLCLFtCI6IlciLCLFtSI6InciLCLFtiI6IlkiLCLFtyI6InkiLCLFuCI6IlkiLCLFuSI6IloiLCLFuyI6IloiLCLFvSI6IloiLCLFuiI6InoiLCLFvCI6InoiLCLFviI6InoiLCLEsiI6IklKIiwixLMiOiJpaiIsIsWSIjoiT2UiLCLFkyI6Im9lIiwixYkiOiInbiIsIsW/IjoicyJ9KSwkZT1EZSh7IiYiOiImYW1wOyIsIjwiOiImbHQ7IiwiPiI6IiZndDsiLCciJzoiJnF1b3Q7IiwiJyI6IiYjMzk7In0pO2Z1bmN0aW9uIEtlKHQpe3JldHVybiJcXCIrS3RbdF19ZnVuY3Rpb24gWmUodCl7cmV0dXJuIEd0LnRlc3QodCl9ZnVuY3Rpb24gSmUodCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQsaSl7blsrK2VdPVtpLHRdfSkpLG59ZnVuY3Rpb24gUWUodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQoZShuKSl9fWZ1bmN0aW9uIHRuKHQsZSl7Zm9yKHZhciBuPS0xLHI9dC5sZW5ndGgsbz0wLGE9W107KytuPHI7KXt2YXIgcz10W25dO3MhPT1lJiZzIT09aXx8KHRbbl09aSxhW28rK109bil9cmV0dXJuIGF9ZnVuY3Rpb24gZW4odCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe25bKytlXT10fSkpLG59ZnVuY3Rpb24gbm4odCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe25bKytlXT1bdCx0XX0pKSxufWZ1bmN0aW9uIHJuKHQpe3JldHVybiBaZSh0KT8oZnVuY3Rpb24gZSh0KXtmb3IodmFyIGU9VXQubGFzdEluZGV4PTA7VXQudGVzdCh0KTspKytlO3JldHVybiBlfSkodCk6a2UodCl9ZnVuY3Rpb24gb24odCl7cmV0dXJuIFplKHQpPyhmdW5jdGlvbiBlKHQpe3JldHVybiB0Lm1hdGNoKFV0KXx8W119KSh0KTooZnVuY3Rpb24gbih0KXtyZXR1cm4gdC5zcGxpdCgiIil9KSh0KX1mdW5jdGlvbiBhbih0KXtmb3IodmFyIGU9dC5sZW5ndGg7ZS0tJiZ0dC50ZXN0KHQuY2hhckF0KGUpKTspO3JldHVybiBlfXZhciBzbj1EZSh7IiZhbXA7IjoiJiIsIiZsdDsiOiI8IiwiJmd0OyI6Ij4iLCImcXVvdDsiOiciJywiJiMzOTsiOiInIn0pLGxuPShmdW5jdGlvbiB0dChfdCl7dmFyIHl0LHZ0PShfdD1udWxsPT1fdD9lZTpsbi5kZWZhdWx0cyhlZS5PYmplY3QoKSxfdCxsbi5waWNrKGVlLHF0KSkpLkFycmF5LGJ0PV90LkRhdGUseHQ9X3QuRXJyb3Isd3Q9X3QuRnVuY3Rpb24sU3Q9X3QuTWF0aCxNdD1fdC5PYmplY3QsRXQ9X3QuUmVnRXhwLFR0PV90LlN0cmluZyxDdD1fdC5UeXBlRXJyb3IsQXQ9dnQucHJvdG90eXBlLGt0PU10LnByb3RvdHlwZSxMdD1fdFsiX19jb3JlLWpzX3NoYXJlZF9fIl0sUHQ9d3QucHJvdG90eXBlLnRvU3RyaW5nLE50PWt0Lmhhc093blByb3BlcnR5LEl0PTAsUnQ9KHl0PS9bXi5dKyQvLmV4ZWMoTHQmJkx0LmtleXMmJkx0LmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIit5dDoiIixPdD1rdC50b1N0cmluZyx6dD1QdC5jYWxsKE10KSxEdD1lZS5fLEJ0PUV0KCJeIitQdC5jYWxsKE50KS5yZXBsYWNlKFosIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIiksSHQ9cmU/X3QuQnVmZmVyOnQsVXQ9X3QuU3ltYm9sLEd0PV90LlVpbnQ4QXJyYXksS3Q9SHQ/SHQuYWxsb2NVbnNhZmU6dCxRdD1RZShNdC5nZXRQcm90b3R5cGVPZixNdCksdGU9TXQuY3JlYXRlLG5lPWt0LnByb3BlcnR5SXNFbnVtZXJhYmxlLGllPUF0LnNwbGljZSxvZT1VdD9VdC5pc0NvbmNhdFNwcmVhZGFibGU6dCxhZT1VdD9VdC5pdGVyYXRvcjp0LHZlPVV0P1V0LnRvU3RyaW5nVGFnOnQseGU9KGZ1bmN0aW9uKCl7dHJ5e3ZhciB0PVBvKE10LCJkZWZpbmVQcm9wZXJ0eSIpO3JldHVybiB0KHt9LCIiLHt9KSx0fWNhdGNoKHQpe319KSgpLHdlPV90LmNsZWFyVGltZW91dCE9PWVlLmNsZWFyVGltZW91dCYmX3QuY2xlYXJUaW1lb3V0LGtlPWJ0JiZidC5ub3chPT1lZS5EYXRlLm5vdyYmYnQubm93LERlPV90LnNldFRpbWVvdXQhPT1lZS5zZXRUaW1lb3V0JiZfdC5zZXRUaW1lb3V0LGNuPVN0LmNlaWwsdW49U3QuZmxvb3IsaG49TXQuZ2V0T3duUHJvcGVydHlTeW1ib2xzLGRuPUh0P0h0LmlzQnVmZmVyOnQscG49X3QuaXNGaW5pdGUsZm49QXQuam9pbixtbj1RZShNdC5rZXlzLE10KSxnbj1TdC5tYXgsX249U3QubWluLHluPWJ0Lm5vdyx2bj1fdC5wYXJzZUludCxibj1TdC5yYW5kb20seG49QXQucmV2ZXJzZSx3bj1QbyhfdCwiRGF0YVZpZXciKSxTbj1QbyhfdCwiTWFwIiksTW49UG8oX3QsIlByb21pc2UiKSxFbj1QbyhfdCwiU2V0IiksVG49UG8oX3QsIldlYWtNYXAiKSxDbj1QbyhNdCwiY3JlYXRlIiksQW49VG4mJm5ldyBUbixrbj17fSxMbj1vYSh3biksUG49b2EoU24pLE5uPW9hKE1uKSxJbj1vYShFbiksUm49b2EoVG4pLE9uPVV0P1V0LnByb3RvdHlwZTp0LHpuPU9uP09uLnZhbHVlT2Y6dCxEbj1Pbj9Pbi50b1N0cmluZzp0O2Z1bmN0aW9uIEJuKHQpe2lmKE1zKHQpJiYhaHModCkmJiEodCBpbnN0YW5jZW9mIFVuKSl7aWYodCBpbnN0YW5jZW9mIFZuKXJldHVybiB0O2lmKE50LmNhbGwodCwiX193cmFwcGVkX18iKSlyZXR1cm4gYWEodCl9cmV0dXJuIG5ldyBWbih0KX12YXIgSG49KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe31yZXR1cm4gZnVuY3Rpb24obil7aWYoIVNzKG4pKXJldHVybnt9O2lmKHRlKXJldHVybiB0ZShuKTtlLnByb3RvdHlwZT1uO3ZhciBpPW5ldyBlO3JldHVybiBlLnByb3RvdHlwZT10LGl9fSkoKTtmdW5jdGlvbiBGbigpe31mdW5jdGlvbiBWbihlLG4pe3RoaXMuX193cmFwcGVkX189ZSx0aGlzLl9fYWN0aW9uc19fPVtdLHRoaXMuX19jaGFpbl9fPSEhbix0aGlzLl9faW5kZXhfXz0wLHRoaXMuX192YWx1ZXNfXz10fWZ1bmN0aW9uIFVuKHQpe3RoaXMuX193cmFwcGVkX189dCx0aGlzLl9fYWN0aW9uc19fPVtdLHRoaXMuX19kaXJfXz0xLHRoaXMuX19maWx0ZXJlZF9fPSExLHRoaXMuX19pdGVyYXRlZXNfXz1bXSx0aGlzLl9fdGFrZUNvdW50X189Yyx0aGlzLl9fdmlld3NfXz1bXX1mdW5jdGlvbiBqbih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIGk9dFtlXTt0aGlzLnNldChpWzBdLGlbMV0pfX1mdW5jdGlvbiBHbih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIGk9dFtlXTt0aGlzLnNldChpWzBdLGlbMV0pfX1mdW5jdGlvbiBXbih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIGk9dFtlXTt0aGlzLnNldChpWzBdLGlbMV0pfX1mdW5jdGlvbiBxbih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgV247KytlPG47KXRoaXMuYWRkKHRbZV0pfWZ1bmN0aW9uIFluKHQpe3ZhciBlPXRoaXMuX19kYXRhX189bmV3IEduKHQpO3RoaXMuc2l6ZT1lLnNpemV9ZnVuY3Rpb24gWG4odCxlKXt2YXIgbj1ocyh0KSxpPSFuJiZ1cyh0KSxyPSFuJiYhaSYmZ3ModCksbz0hbiYmIWkmJiFyJiZPcyh0KSxhPW58fGl8fHJ8fG8scz1hP0ZlKHQubGVuZ3RoLFR0KTpbXSxsPXMubGVuZ3RoO2Zvcih2YXIgYyBpbiB0KSFlJiYhTnQuY2FsbCh0LGMpfHxhJiYoImxlbmd0aCI9PWN8fHImJigib2Zmc2V0Ij09Y3x8InBhcmVudCI9PWMpfHxvJiYoImJ1ZmZlciI9PWN8fCJieXRlTGVuZ3RoIj09Y3x8ImJ5dGVPZmZzZXQiPT1jKXx8Qm8oYyxsKSl8fHMucHVzaChjKTtyZXR1cm4gc31mdW5jdGlvbiAkbihlKXt2YXIgbj1lLmxlbmd0aDtyZXR1cm4gbj9lW3ByKDAsbi0xKV06dH1mdW5jdGlvbiBLbih0LGUpe3JldHVybiBlYShYcih0KSxvaShlLDAsdC5sZW5ndGgpKX1mdW5jdGlvbiBabih0KXtyZXR1cm4gZWEoWHIodCkpfWZ1bmN0aW9uIEpuKGUsbixpKXsoaSE9PXQmJiFzcyhlW25dLGkpfHxpPT09dCYmIShuIGluIGUpKSYmaWkoZSxuLGkpfWZ1bmN0aW9uIFFuKGUsbixpKXt2YXIgcj1lW25dO050LmNhbGwoZSxuKSYmc3MocixpKSYmKGkhPT10fHxuIGluIGUpfHxpaShlLG4saSl9ZnVuY3Rpb24gdGkodCxlKXtmb3IodmFyIG49dC5sZW5ndGg7bi0tOylpZihzcyh0W25dWzBdLGUpKXJldHVybiBuO3JldHVybi0xfWZ1bmN0aW9uIGVpKHQsZSxuLGkpe3JldHVybiBOaSh0LChmdW5jdGlvbih0LHIsbyl7ZShpLHQsbih0KSxvKX0pKSxpfWZ1bmN0aW9uIG5pKHQsZSl7cmV0dXJuIHQmJiRyKGUscmwoZSksdCl9ZnVuY3Rpb24gaWkodCxlLG4peyJfX3Byb3RvX18iPT1lJiZ4ZT94ZSh0LGUse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm4sd3JpdGFibGU6ITB9KTp0W2VdPW59ZnVuY3Rpb24gcmkoZSxuKXtmb3IodmFyIGk9LTEscj1uLmxlbmd0aCxvPXZ0KHIpLGE9bnVsbD09ZTsrK2k8cjspb1tpXT1hP3Q6UXMoZSxuW2ldKTtyZXR1cm4gb31mdW5jdGlvbiBvaShlLG4saSl7cmV0dXJuIGU9PWUmJihpIT09dCYmKGU9ZTw9aT9lOmkpLG4hPT10JiYoZT1lPj1uP2U6bikpLGV9ZnVuY3Rpb24gYWkoZSxuLGkscixvLGEpe3ZhciBzLGw9MSZuLGM9MiZuLHU9NCZuO2lmKGkmJihzPW8/aShlLHIsbyxhKTppKGUpKSxzIT09dClyZXR1cm4gcztpZighU3MoZSkpcmV0dXJuIGU7dmFyIGQ9aHMoZSk7aWYoZCl7aWYocz0oZnVuY3Rpb24gbSh0KXt2YXIgZT10Lmxlbmd0aCxuPW5ldyB0LmNvbnN0cnVjdG9yKGUpO3JldHVybiBlJiYic3RyaW5nIj09dHlwZW9mIHRbMF0mJk50LmNhbGwodCwiaW5kZXgiKSYmKG4uaW5kZXg9dC5pbmRleCxuLmlucHV0PXQuaW5wdXQpLG59KShlKSwhbClyZXR1cm4gWHIoZSxzKX1lbHNle3ZhciB4PVJvKGUpLFQ9eD09Z3x8eD09XztpZihncyhlKSlyZXR1cm4gVXIoZSxsKTtpZih4PT1ifHx4PT1ofHxUJiYhbyl7aWYocz1jfHxUP3t9OnpvKGUpLCFsKXJldHVybiBjPyhmdW5jdGlvbiBIKHQsZSl7cmV0dXJuICRyKHQsSW8odCksZSl9KShlLChmdW5jdGlvbiBCKHQsZSl7cmV0dXJuIHQmJiRyKGUsb2woZSksdCl9KShzLGUpKTooZnVuY3Rpb24gRih0LGUpe3JldHVybiAkcih0LE5vKHQpLGUpfSkoZSxuaShzLGUpKX1lbHNle2lmKCEkdFt4XSlyZXR1cm4gbz9lOnt9O3M9KGZ1bmN0aW9uIFYodCxlLG4pe3ZhciBpPXQuY29uc3RydWN0b3I7c3dpdGNoKGUpe2Nhc2UgQzpyZXR1cm4ganIodCk7Y2FzZSBwOmNhc2UgZjpyZXR1cm4gbmV3IGkoK3QpO2Nhc2UgQTpyZXR1cm4oZnVuY3Rpb24gcih0LGUpe3ZhciBuPWU/anIodC5idWZmZXIpOnQuYnVmZmVyO3JldHVybiBuZXcgdC5jb25zdHJ1Y3RvcihuLHQuYnl0ZU9mZnNldCx0LmJ5dGVMZW5ndGgpfSkodCxuKTtjYXNlIGs6Y2FzZSBMOmNhc2UgUDpjYXNlIE46Y2FzZSBJOmNhc2UgUjpjYXNlIE86Y2FzZSB6OmNhc2UgRDpyZXR1cm4gR3IodCxuKTtjYXNlIHk6cmV0dXJuIG5ldyBpO2Nhc2UgdjpjYXNlIE06cmV0dXJuIG5ldyBpKHQpO2Nhc2UgdzpyZXR1cm4oZnVuY3Rpb24gbyh0KXt2YXIgZT1uZXcgdC5jb25zdHJ1Y3Rvcih0LnNvdXJjZSxsdC5leGVjKHQpKTtyZXR1cm4gZS5sYXN0SW5kZXg9dC5sYXN0SW5kZXgsZX0pKHQpO2Nhc2UgUzpyZXR1cm4gbmV3IGk7Y2FzZSBFOnJldHVybihmdW5jdGlvbiBhKHQpe3JldHVybiB6bj9NdCh6bi5jYWxsKHQpKTp7fX0pKHQpfX0pKGUseCxsKX19YXx8KGE9bmV3IFluKTt2YXIgVT1hLmdldChlKTtpZihVKXJldHVybiBVO2Euc2V0KGUscyksUHMoZSk/ZS5mb3JFYWNoKChmdW5jdGlvbih0KXtzLmFkZChhaSh0LG4saSx0LGUsYSkpfSkpOkVzKGUpJiZlLmZvckVhY2goKGZ1bmN0aW9uKHQscil7cy5zZXQocixhaSh0LG4saSxyLGUsYSkpfSkpO3ZhciBqPWQ/dDoodT9jP01vOlNvOmM/b2w6cmwpKGUpO3JldHVybiBtZShqfHxlLChmdW5jdGlvbih0LHIpe2omJih0PWVbcj10XSksUW4ocyxyLGFpKHQsbixpLHIsZSxhKSl9KSksc31mdW5jdGlvbiBzaShlLG4saSl7dmFyIHI9aS5sZW5ndGg7aWYobnVsbD09ZSlyZXR1cm4hcjtmb3IoZT1NdChlKTtyLS07KXt2YXIgbz1pW3JdLGE9ZVtvXTtpZihhPT09dCYmIShvIGluIGUpfHwhKDAsbltvXSkoYSkpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gbGkobixpLHIpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBDdChlKTtyZXR1cm4gWm8oKGZ1bmN0aW9uKCl7bi5hcHBseSh0LHIpfSksaSl9ZnVuY3Rpb24gY2kodCxlLG4saSl7dmFyIHI9LTEsbz1iZSxhPSEwLHM9dC5sZW5ndGgsbD1bXSxjPWUubGVuZ3RoO2lmKCFzKXJldHVybiBsO24mJihlPU1lKGUsVWUobikpKSxpPyhvPVNlLGE9ITEpOmUubGVuZ3RoPj0yMDAmJihvPUdlLGE9ITEsZT1uZXcgcW4oZSkpO3Q6Zm9yKDsrK3I8czspe3ZhciB1PXRbcl0saD1udWxsPT1uP3U6bih1KTtpZih1PWl8fDAhPT11P3U6MCxhJiZoPT1oKXtmb3IodmFyIGQ9YztkLS07KWlmKGVbZF09PT1oKWNvbnRpbnVlIHQ7bC5wdXNoKHUpfWVsc2UgbyhlLGgsaSl8fGwucHVzaCh1KX1yZXR1cm4gbH1Cbi50ZW1wbGF0ZVNldHRpbmdzPXtlc2NhcGU6VyxldmFsdWF0ZTpxLGludGVycG9sYXRlOlksdmFyaWFibGU6IiIsaW1wb3J0czp7XzpCbn19LChCbi5wcm90b3R5cGU9Rm4ucHJvdG90eXBlKS5jb25zdHJ1Y3Rvcj1CbiwoVm4ucHJvdG90eXBlPUhuKEZuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPVZuLChVbi5wcm90b3R5cGU9SG4oRm4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9VW4sam4ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uIHVpKCl7dGhpcy5fX2RhdGFfXz1Dbj9DbihudWxsKTp7fSx0aGlzLnNpemU9MH0sam4ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbiBoaSh0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX0sam4ucHJvdG90eXBlLmdldD1mdW5jdGlvbiBkaShlKXt2YXIgaT10aGlzLl9fZGF0YV9fO2lmKENuKXt2YXIgcj1pW2VdO3JldHVybiByPT09bj90OnJ9cmV0dXJuIE50LmNhbGwoaSxlKT9pW2VdOnR9LGpuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24gcGkoZSl7dmFyIG49dGhpcy5fX2RhdGFfXztyZXR1cm4gQ24/bltlXSE9PXQ6TnQuY2FsbChuLGUpfSxqbi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uIGZpKGUsaSl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyhlKT8wOjEscltlXT1DbiYmaT09PXQ/bjppLHRoaXN9LEduLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbiBtaSgpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9LEduLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24gZ2kodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPXRpKGUsdCk7cmV0dXJuIShuPDB8fChuPT1lLmxlbmd0aC0xP2UucG9wKCk6aWUuY2FsbChlLG4sMSksLS10aGlzLnNpemUsMCkpfSxHbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uIF9pKGUpe3ZhciBuPXRoaXMuX19kYXRhX18saT10aShuLGUpO3JldHVybiBpPDA/dDpuW2ldWzFdfSxHbi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uIHlpKHQpe3JldHVybiB0aSh0aGlzLl9fZGF0YV9fLHQpPi0xfSxHbi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uIHZpKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxpPXRpKG4sdCk7cmV0dXJuIGk8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltpXVsxXT1lLHRoaXN9LFduLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbiBiaSgpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IGpuLG1hcDpuZXcoU258fEduKSxzdHJpbmc6bmV3IGpufX0sV24ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbiB4aSh0KXt2YXIgZT1rbyh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxXbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uIHdpKHQpe3JldHVybiBrbyh0aGlzLHQpLmdldCh0KX0sV24ucHJvdG90eXBlLmhhcz1mdW5jdGlvbiBTaSh0KXtyZXR1cm4ga28odGhpcyx0KS5oYXModCl9LFduLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24gTWkodCxlKXt2YXIgbj1rbyh0aGlzLHQpLGk9bi5zaXplO3JldHVybiBuLnNldCh0LGUpLHRoaXMuc2l6ZSs9bi5zaXplPT1pPzA6MSx0aGlzfSxxbi5wcm90b3R5cGUuYWRkPXFuLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uIEVpKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLnNldCh0LG4pLHRoaXN9LHFuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24gVGkodCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfSxZbi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24gQ2koKXt0aGlzLl9fZGF0YV9fPW5ldyBHbix0aGlzLnNpemU9MH0sWW4ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbiBBaSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49ZS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1lLnNpemUsbn0sWW4ucHJvdG90eXBlLmdldD1mdW5jdGlvbiBraSh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9LFluLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24gTGkodCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfSxZbi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uIFBpKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXztpZihuIGluc3RhbmNlb2YgR24pe3ZhciBpPW4uX19kYXRhX187aWYoIVNufHxpLmxlbmd0aDwxOTkpcmV0dXJuIGkucHVzaChbdCxlXSksdGhpcy5zaXplPSsrbi5zaXplLHRoaXM7bj10aGlzLl9fZGF0YV9fPW5ldyBXbihpKX1yZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemU9bi5zaXplLHRoaXN9O3ZhciBOaT1KcihGaSksSWk9SnIoVmksITApO2Z1bmN0aW9uIFJpKHQsZSl7dmFyIG49ITA7cmV0dXJuIE5pKHQsKGZ1bmN0aW9uKHQsaSxyKXtyZXR1cm4gbj0hIWUodCxpLHIpfSkpLG59ZnVuY3Rpb24gT2koZSxuLGkpe2Zvcih2YXIgcj0tMSxvPWUubGVuZ3RoOysrcjxvOyl7dmFyIGE9ZVtyXSxzPW4oYSk7aWYobnVsbCE9cyYmKGw9PT10P3M9PXMmJiFScyhzKTppKHMsbCkpKXZhciBsPXMsYz1hfXJldHVybiBjfWZ1bmN0aW9uIHppKHQsZSl7dmFyIG49W107cmV0dXJuIE5pKHQsKGZ1bmN0aW9uKHQsaSxyKXtlKHQsaSxyKSYmbi5wdXNoKHQpfSkpLG59ZnVuY3Rpb24gRGkodCxlLG4saSxyKXt2YXIgbz0tMSxhPXQubGVuZ3RoO2ZvcihufHwobj1Ebykscnx8KHI9W10pOysrbzxhOyl7dmFyIHM9dFtvXTtlPjAmJm4ocyk/ZT4xP0RpKHMsZS0xLG4saSxyKTpFZShyLHMpOml8fChyW3IubGVuZ3RoXT1zKX1yZXR1cm4gcn12YXIgQmk9UXIoKSxIaT1RcighMCk7ZnVuY3Rpb24gRmkodCxlKXtyZXR1cm4gdCYmQmkodCxlLHJsKX1mdW5jdGlvbiBWaSh0LGUpe3JldHVybiB0JiZIaSh0LGUscmwpfWZ1bmN0aW9uIFVpKHQsZSl7cmV0dXJuIHllKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBicyh0W2VdKX0pKX1mdW5jdGlvbiBqaShlLG4pe2Zvcih2YXIgaT0wLHI9KG49QnIobixlKSkubGVuZ3RoO251bGwhPWUmJmk8cjspZT1lW3JhKG5baSsrXSldO3JldHVybiBpJiZpPT1yP2U6dH1mdW5jdGlvbiBHaSh0LGUsbil7dmFyIGk9ZSh0KTtyZXR1cm4gaHModCk/aTpFZShpLG4odCkpfWZ1bmN0aW9uIFdpKGUpe3JldHVybiBudWxsPT1lP2U9PT10PyJbb2JqZWN0IFVuZGVmaW5lZF0iOiJbb2JqZWN0IE51bGxdIjp2ZSYmdmUgaW4gTXQoZSk/KGZ1bmN0aW9uIG4oZSl7dmFyIG49TnQuY2FsbChlLHZlKSxpPWVbdmVdO3RyeXtlW3ZlXT10O3ZhciByPSEwfWNhdGNoKHQpe312YXIgbz1PdC5jYWxsKGUpO3JldHVybiByJiYobj9lW3ZlXT1pOmRlbGV0ZSBlW3ZlXSksb30pKGUpOihmdW5jdGlvbiBpKHQpe3JldHVybiBPdC5jYWxsKHQpfSkoZSl9ZnVuY3Rpb24gcWkodCxlKXtyZXR1cm4gdD5lfWZ1bmN0aW9uIFlpKHQsZSl7cmV0dXJuIG51bGwhPXQmJk50LmNhbGwodCxlKX1mdW5jdGlvbiBYaSh0LGUpe3JldHVybiBudWxsIT10JiZlIGluIE10KHQpfWZ1bmN0aW9uICRpKGUsbixpKXtmb3IodmFyIHI9aT9TZTpiZSxvPWVbMF0ubGVuZ3RoLGE9ZS5sZW5ndGgscz1hLGw9dnQoYSksYz0xLzAsdT1bXTtzLS07KXt2YXIgaD1lW3NdO3MmJm4mJihoPU1lKGgsVWUobikpKSxjPV9uKGgubGVuZ3RoLGMpLGxbc109IWkmJihufHxvPj0xMjAmJmgubGVuZ3RoPj0xMjApP25ldyBxbihzJiZoKTp0fWg9ZVswXTt2YXIgZD0tMSxwPWxbMF07dDpmb3IoOysrZDxvJiZ1Lmxlbmd0aDxjOyl7dmFyIGY9aFtkXSxtPW4/bihmKTpmO2lmKGY9aXx8MCE9PWY/ZjowLCEocD9HZShwLG0pOnIodSxtLGkpKSl7Zm9yKHM9YTstLXM7KXt2YXIgZz1sW3NdO2lmKCEoZz9HZShnLG0pOnIoZVtzXSxtLGkpKSljb250aW51ZSB0fXAmJnAucHVzaChtKSx1LnB1c2goZil9fXJldHVybiB1fWZ1bmN0aW9uIEtpKGUsbixpKXt2YXIgcj1udWxsPT0oZT1ZbyhlLG49QnIobixlKSkpP2U6ZVtyYShfYShuKSldO3JldHVybiBudWxsPT1yP3Q6cGUocixlLGkpfWZ1bmN0aW9uIFppKHQpe3JldHVybiBNcyh0KSYmV2kodCk9PWh9ZnVuY3Rpb24gSmkoZSxuLGkscixvKXtyZXR1cm4gZT09PW58fChudWxsPT1lfHxudWxsPT1ufHwhTXMoZSkmJiFNcyhuKT9lIT1lJiZuIT1uOihmdW5jdGlvbiBhKGUsbixpLHIsbyxzKXt2YXIgbD1ocyhlKSxjPWhzKG4pLHU9bD9kOlJvKGUpLGc9Yz9kOlJvKG4pLF89KHU9dT09aD9iOnUpPT1iLHg9KGc9Zz09aD9iOmcpPT1iLFQ9dT09ZztpZihUJiZncyhlKSl7aWYoIWdzKG4pKXJldHVybiExO2w9ITAsXz0hMX1pZihUJiYhXylyZXR1cm4gc3x8KHM9bmV3IFluKSxsfHxPcyhlKT94byhlLG4saSxyLG8scyk6KGZ1bmN0aW9uIGsodCxlLG4saSxyLG8sYSl7c3dpdGNoKG4pe2Nhc2UgQTppZih0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8dC5ieXRlT2Zmc2V0IT1lLmJ5dGVPZmZzZXQpcmV0dXJuITE7dD10LmJ1ZmZlcixlPWUuYnVmZmVyO2Nhc2UgQzpyZXR1cm4hKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHwhbyhuZXcgR3QodCksbmV3IEd0KGUpKSk7Y2FzZSBwOmNhc2UgZjpjYXNlIHY6cmV0dXJuIHNzKCt0LCtlKTtjYXNlIG06cmV0dXJuIHQubmFtZT09ZS5uYW1lJiZ0Lm1lc3NhZ2U9PWUubWVzc2FnZTtjYXNlIHc6Y2FzZSBNOnJldHVybiB0PT1lKyIiO2Nhc2UgeTp2YXIgcz1KZTtjYXNlIFM6aWYoc3x8KHM9ZW4pLHQuc2l6ZSE9ZS5zaXplJiYhKDEmaSkpcmV0dXJuITE7dmFyIGw9YS5nZXQodCk7aWYobClyZXR1cm4gbD09ZTtpfD0yLGEuc2V0KHQsZSk7dmFyIGM9eG8ocyh0KSxzKGUpLGkscixvLGEpO3JldHVybiBhLmRlbGV0ZSh0KSxjO2Nhc2UgRTppZih6bilyZXR1cm4gem4uY2FsbCh0KT09em4uY2FsbChlKX1yZXR1cm4hMX0pKGUsbix1LGkscixvLHMpO2lmKCEoMSZpKSl7dmFyIEw9XyYmTnQuY2FsbChlLCJfX3dyYXBwZWRfXyIpLFA9eCYmTnQuY2FsbChuLCJfX3dyYXBwZWRfXyIpO2lmKEx8fFApe3ZhciBOPUw/ZS52YWx1ZSgpOmUsST1QP24udmFsdWUoKTpuO3JldHVybiBzfHwocz1uZXcgWW4pLG8oTixJLGkscixzKX19cmV0dXJuISFUJiYoc3x8KHM9bmV3IFluKSwoZnVuY3Rpb24gUihlLG4saSxyLG8sYSl7dmFyIHM9MSZpLGw9U28oZSksYz1sLmxlbmd0aDtpZihjIT1TbyhuKS5sZW5ndGgmJiFzKXJldHVybiExO2Zvcih2YXIgdT1jO3UtLTspe3ZhciBoPWxbdV07aWYoIShzP2ggaW4gbjpOdC5jYWxsKG4saCkpKXJldHVybiExfXZhciBkPWEuZ2V0KGUpLHA9YS5nZXQobik7aWYoZCYmcClyZXR1cm4gZD09biYmcD09ZTt2YXIgZj0hMDthLnNldChlLG4pLGEuc2V0KG4sZSk7Zm9yKHZhciBtPXM7Kyt1PGM7KXt2YXIgZz1lW2g9bFt1XV0sXz1uW2hdO2lmKHIpdmFyIHk9cz9yKF8sZyxoLG4sZSxhKTpyKGcsXyxoLGUsbixhKTtpZighKHk9PT10P2c9PT1ffHxvKGcsXyxpLHIsYSk6eSkpe2Y9ITE7YnJlYWt9bXx8KG09ImNvbnN0cnVjdG9yIj09aCl9aWYoZiYmIW0pe3ZhciB2PWUuY29uc3RydWN0b3IsYj1uLmNvbnN0cnVjdG9yO3Y9PWJ8fCEoImNvbnN0cnVjdG9yImluIGUpfHwhKCJjb25zdHJ1Y3RvciJpbiBuKXx8ImZ1bmN0aW9uIj09dHlwZW9mIHYmJnYgaW5zdGFuY2VvZiB2JiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYiBpbnN0YW5jZW9mIGJ8fChmPSExKX1yZXR1cm4gYS5kZWxldGUoZSksYS5kZWxldGUobiksZn0pKGUsbixpLHIsbyxzKSl9KShlLG4saSxyLEppLG8pKX1mdW5jdGlvbiBRaShlLG4saSxyKXt2YXIgbz1pLmxlbmd0aCxhPW8scz0hcjtpZihudWxsPT1lKXJldHVybiFhO2ZvcihlPU10KGUpO28tLTspe3ZhciBsPWlbb107aWYocyYmbFsyXT9sWzFdIT09ZVtsWzBdXTohKGxbMF1pbiBlKSlyZXR1cm4hMX1mb3IoOysrbzxhOyl7dmFyIGM9KGw9aVtvXSlbMF0sdT1lW2NdLGg9bFsxXTtpZihzJiZsWzJdKXtpZih1PT09dCYmIShjIGluIGUpKXJldHVybiExfWVsc2V7dmFyIGQ9bmV3IFluO2lmKHIpdmFyIHA9cih1LGgsYyxlLG4sZCk7aWYoIShwPT09dD9KaShoLHUsMyxyLGQpOnApKXJldHVybiExfX1yZXR1cm4hMH1mdW5jdGlvbiB0cih0KXtyZXR1cm4hKCFTcyh0KXx8KGZ1bmN0aW9uIGUodCl7cmV0dXJuISFSdCYmUnQgaW4gdH0pKHQpKSYmKGJzKHQpP0J0Omh0KS50ZXN0KG9hKHQpKX1mdW5jdGlvbiBlcih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90Om51bGw9PXQ/TGw6Im9iamVjdCI9PXR5cGVvZiB0P2hzKHQpP2FyKHRbMF0sdFsxXSk6b3IodCk6SGwodCl9ZnVuY3Rpb24gbnIodCl7aWYoIWpvKHQpKXJldHVybiBtbih0KTt2YXIgZT1bXTtmb3IodmFyIG4gaW4gTXQodCkpTnQuY2FsbCh0LG4pJiYiY29uc3RydWN0b3IiIT1uJiZlLnB1c2gobik7cmV0dXJuIGV9ZnVuY3Rpb24gaXIodCxlKXtyZXR1cm4gdDxlfWZ1bmN0aW9uIHJyKHQsZSl7dmFyIG49LTEsaT1mcyh0KT92dCh0Lmxlbmd0aCk6W107cmV0dXJuIE5pKHQsKGZ1bmN0aW9uKHQscixvKXtpWysrbl09ZSh0LHIsbyl9KSksaX1mdW5jdGlvbiBvcih0KXt2YXIgZT1Mbyh0KTtyZXR1cm4gMT09ZS5sZW5ndGgmJmVbMF1bMl0/V28oZVswXVswXSxlWzBdWzFdKTpmdW5jdGlvbihuKXtyZXR1cm4gbj09PXR8fFFpKG4sdCxlKX19ZnVuY3Rpb24gYXIoZSxuKXtyZXR1cm4gRm8oZSkmJkdvKG4pP1dvKHJhKGUpLG4pOmZ1bmN0aW9uKGkpe3ZhciByPVFzKGksZSk7cmV0dXJuIHI9PT10JiZyPT09bj90bChpLGUpOkppKG4sciwzKX19ZnVuY3Rpb24gc3IoZSxuLGkscixvKXtlIT09biYmQmkobiwoZnVuY3Rpb24oYSxzKXtpZihvfHwobz1uZXcgWW4pLFNzKGEpKSEoZnVuY3Rpb24gbChlLG4saSxyLG8sYSxzKXt2YXIgbD0kbyhlLGkpLGM9JG8obixpKSx1PXMuZ2V0KGMpO2lmKHUpSm4oZSxpLHUpO2Vsc2V7dmFyIGg9YT9hKGwsYyxpKyIiLGUsbixzKTp0LGQ9aD09PXQ7aWYoZCl7dmFyIHA9aHMoYyksZj0hcCYmZ3MoYyksbT0hcCYmIWYmJk9zKGMpO2g9YyxwfHxmfHxtP2hzKGwpP2g9bDptcyhsKT9oPVhyKGwpOmY/KGQ9ITEsaD1VcihjLCEwKSk6bT8oZD0hMSxoPUdyKGMsITApKTpoPVtdOkFzKGMpfHx1cyhjKT8oaD1sLHVzKGwpP2g9R3MobCk6U3MobCkmJiFicyhsKXx8KGg9em8oYykpKTpkPSExfWQmJihzLnNldChjLGgpLG8oaCxjLHIsYSxzKSxzLmRlbGV0ZShjKSksSm4oZSxpLGgpfX0pKGUsbixzLGksc3IscixvKTtlbHNle3ZhciBjPXI/cigkbyhlLHMpLGEscysiIixlLG4sbyk6dDtjPT09dCYmKGM9YSksSm4oZSxzLGMpfX0pLG9sKX1mdW5jdGlvbiBscihlLG4pe3ZhciBpPWUubGVuZ3RoO2lmKGkpcmV0dXJuIEJvKG4rPW48MD9pOjAsaSk/ZVtuXTp0fWZ1bmN0aW9uIGNyKHQsZSxuKXtlPWUubGVuZ3RoP01lKGUsKGZ1bmN0aW9uKHQpe3JldHVybiBocyh0KT9mdW5jdGlvbihlKXtyZXR1cm4gamkoZSwxPT09dC5sZW5ndGg/dFswXTp0KX06dH0pKTpbTGxdO3ZhciBpPS0xO3JldHVybiBlPU1lKGUsVWUoQW8oKSkpLChmdW5jdGlvbiByKHQsZSl7dmFyIG49dC5sZW5ndGg7Zm9yKHQuc29ydChlKTtuLS07KXRbbl09dFtuXS52YWx1ZTtyZXR1cm4gdH0pKHJyKHQsKGZ1bmN0aW9uKHQsbixyKXtyZXR1cm57Y3JpdGVyaWE6TWUoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUodCl9KSksaW5kZXg6KytpLHZhbHVlOnR9fSkpLChmdW5jdGlvbih0LGUpe3JldHVybihmdW5jdGlvbiBpKHQsZSxuKXtmb3IodmFyIGk9LTEscj10LmNyaXRlcmlhLG89ZS5jcml0ZXJpYSxhPXIubGVuZ3RoLHM9bi5sZW5ndGg7KytpPGE7KXt2YXIgbD1XcihyW2ldLG9baV0pO2lmKGwpcmV0dXJuIGk+PXM/bDpsKigiZGVzYyI9PW5baV0/LTE6MSl9cmV0dXJuIHQuaW5kZXgtZS5pbmRleH0pKHQsZSxuKX0pKX1mdW5jdGlvbiB1cih0LGUsbil7Zm9yKHZhciBpPS0xLHI9ZS5sZW5ndGgsbz17fTsrK2k8cjspe3ZhciBhPWVbaV0scz1qaSh0LGEpO24ocyxhKSYmeXIobyxCcihhLHQpLHMpfXJldHVybiBvfWZ1bmN0aW9uIGhyKHQsZSxuLGkpe3ZhciByPWk/SWU6TmUsbz0tMSxhPWUubGVuZ3RoLHM9dDtmb3IodD09PWUmJihlPVhyKGUpKSxuJiYocz1NZSh0LFVlKG4pKSk7KytvPGE7KWZvcih2YXIgbD0wLGM9ZVtvXSx1PW4/bihjKTpjOyhsPXIocyx1LGwsaSkpPi0xOylzIT09dCYmaWUuY2FsbChzLGwsMSksaWUuY2FsbCh0LGwsMSk7cmV0dXJuIHR9ZnVuY3Rpb24gZHIodCxlKXtmb3IodmFyIG49dD9lLmxlbmd0aDowLGk9bi0xO24tLTspe3ZhciByPWVbbl07aWYobj09aXx8ciE9PW8pe3ZhciBvPXI7Qm8ocik/aWUuY2FsbCh0LHIsMSk6THIodCxyKX19cmV0dXJuIHR9ZnVuY3Rpb24gcHIodCxlKXtyZXR1cm4gdCt1bihibigpKihlLXQrMSkpfWZ1bmN0aW9uIGZyKHQsZSl7dmFyIG49IiI7aWYoIXR8fGU8MXx8ZT5zKXJldHVybiBuO2Rve2UlMiYmKG4rPXQpLChlPXVuKGUvMikpJiYodCs9dCl9d2hpbGUoZSk7cmV0dXJuIG59ZnVuY3Rpb24gbXIodCxlKXtyZXR1cm4gSm8ocW8odCxlLExsKSx0KyIiKX1mdW5jdGlvbiBncih0KXtyZXR1cm4gJG4ocGwodCkpfWZ1bmN0aW9uIF9yKHQsZSl7dmFyIG49cGwodCk7cmV0dXJuIGVhKG4sb2koZSwwLG4ubGVuZ3RoKSl9ZnVuY3Rpb24geXIoZSxuLGkscil7aWYoIVNzKGUpKXJldHVybiBlO2Zvcih2YXIgbz0tMSxhPShuPUJyKG4sZSkpLmxlbmd0aCxzPWEtMSxsPWU7bnVsbCE9bCYmKytvPGE7KXt2YXIgYz1yYShuW29dKSx1PWk7aWYoIl9fcHJvdG9fXyI9PT1jfHwiY29uc3RydWN0b3IiPT09Y3x8InByb3RvdHlwZSI9PT1jKXJldHVybiBlO2lmKG8hPXMpe3ZhciBoPWxbY107KHU9cj9yKGgsYyxsKTp0KT09PXQmJih1PVNzKGgpP2g6Qm8obltvKzFdKT9bXTp7fSl9UW4obCxjLHUpLGw9bFtjXX1yZXR1cm4gZX12YXIgdnI9QW4/ZnVuY3Rpb24odCxlKXtyZXR1cm4gQW4uc2V0KHQsZSksdH06TGwsYnI9eGU/ZnVuY3Rpb24odCxlKXtyZXR1cm4geGUodCwidG9TdHJpbmciLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTpDbChlKSx3cml0YWJsZTohMH0pfTpMbDtmdW5jdGlvbiB4cih0KXtyZXR1cm4gZWEocGwodCkpfWZ1bmN0aW9uIHdyKHQsZSxuKXt2YXIgaT0tMSxyPXQubGVuZ3RoO2U8MCYmKGU9LWU+cj8wOnIrZSksKG49bj5yP3I6bik8MCYmKG4rPXIpLHI9ZT5uPzA6bi1lPj4+MCxlPj4+PTA7Zm9yKHZhciBvPXZ0KHIpOysraTxyOylvW2ldPXRbaStlXTtyZXR1cm4gb31mdW5jdGlvbiBTcih0LGUpe3ZhciBuO3JldHVybiBOaSh0LChmdW5jdGlvbih0LGkscil7cmV0dXJuIShuPWUodCxpLHIpKX0pKSwhIW59ZnVuY3Rpb24gTXIodCxlLG4pe3ZhciBpPTAscj1udWxsPT10P2k6dC5sZW5ndGg7aWYoIm51bWJlciI9PXR5cGVvZiBlJiZlPT1lJiZyPD0yMTQ3NDgzNjQ3KXtmb3IoO2k8cjspe3ZhciBvPWkrcj4+PjEsYT10W29dO251bGwhPT1hJiYhUnMoYSkmJihuP2E8PWU6YTxlKT9pPW8rMTpyPW99cmV0dXJuIHJ9cmV0dXJuIEVyKHQsZSxMbCxuKX1mdW5jdGlvbiBFcihlLG4saSxyKXt2YXIgbz0wLGE9bnVsbD09ZT8wOmUubGVuZ3RoO2lmKDA9PT1hKXJldHVybiAwO2Zvcih2YXIgcz0obj1pKG4pKSE9bixsPW51bGw9PT1uLGM9UnMobiksdT1uPT09dDtvPGE7KXt2YXIgaD11bigobythKS8yKSxkPWkoZVtoXSkscD1kIT09dCxmPW51bGw9PT1kLG09ZD09ZCxnPVJzKGQpO2lmKHMpdmFyIF89cnx8bTtlbHNlIF89dT9tJiYocnx8cCk6bD9tJiZwJiYocnx8IWYpOmM/bSYmcCYmIWYmJihyfHwhZyk6IWYmJiFnJiYocj9kPD1uOmQ8bik7Xz9vPWgrMTphPWh9cmV0dXJuIF9uKGEsNDI5NDk2NzI5NCl9ZnVuY3Rpb24gVHIodCxlKXtmb3IodmFyIG49LTEsaT10Lmxlbmd0aCxyPTAsbz1bXTsrK248aTspe3ZhciBhPXRbbl0scz1lP2UoYSk6YTtpZighbnx8IXNzKHMsbCkpe3ZhciBsPXM7b1tyKytdPTA9PT1hPzA6YX19cmV0dXJuIG99ZnVuY3Rpb24gQ3IodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3Q6UnModCk/bDordH1mdW5jdGlvbiBBcih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYoaHModCkpcmV0dXJuIE1lKHQsQXIpKyIiO2lmKFJzKHQpKXJldHVybiBEbj9Ebi5jYWxsKHQpOiIiO3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS0xLzA/Ii0wIjplfWZ1bmN0aW9uIGtyKHQsZSxuKXt2YXIgaT0tMSxyPWJlLG89dC5sZW5ndGgsYT0hMCxzPVtdLGw9cztpZihuKWE9ITEscj1TZTtlbHNlIGlmKG8+PTIwMCl7dmFyIGM9ZT9udWxsOm1vKHQpO2lmKGMpcmV0dXJuIGVuKGMpO2E9ITEscj1HZSxsPW5ldyBxbn1lbHNlIGw9ZT9bXTpzO3Q6Zm9yKDsrK2k8bzspe3ZhciB1PXRbaV0saD1lP2UodSk6dTtpZih1PW58fDAhPT11P3U6MCxhJiZoPT1oKXtmb3IodmFyIGQ9bC5sZW5ndGg7ZC0tOylpZihsW2RdPT09aCljb250aW51ZSB0O2UmJmwucHVzaChoKSxzLnB1c2godSl9ZWxzZSByKGwsaCxuKXx8KGwhPT1zJiZsLnB1c2goaCkscy5wdXNoKHUpKX1yZXR1cm4gc31mdW5jdGlvbiBMcih0LGUpe3JldHVybiBudWxsPT0odD1Zbyh0LGU9QnIoZSx0KSkpfHxkZWxldGUgdFtyYShfYShlKSldfWZ1bmN0aW9uIFByKHQsZSxuLGkpe3JldHVybiB5cih0LGUsbihqaSh0LGUpKSxpKX1mdW5jdGlvbiBOcih0LGUsbixpKXtmb3IodmFyIHI9dC5sZW5ndGgsbz1pP3I6LTE7KGk/by0tOisrbzxyKSYmZSh0W29dLG8sdCk7KTtyZXR1cm4gbj93cih0LGk/MDpvLGk/bysxOnIpOndyKHQsaT9vKzE6MCxpP3I6byl9ZnVuY3Rpb24gSXIodCxlKXt2YXIgbj10O3JldHVybiBuIGluc3RhbmNlb2YgVW4mJihuPW4udmFsdWUoKSksVGUoZSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5mdW5jLmFwcGx5KGUudGhpc0FyZyxFZShbdF0sZS5hcmdzKSl9KSxuKX1mdW5jdGlvbiBScih0LGUsbil7dmFyIGk9dC5sZW5ndGg7aWYoaTwyKXJldHVybiBpP2tyKHRbMF0pOltdO2Zvcih2YXIgcj0tMSxvPXZ0KGkpOysrcjxpOylmb3IodmFyIGE9dFtyXSxzPS0xOysrczxpOylzIT1yJiYob1tyXT1jaShvW3JdfHxhLHRbc10sZSxuKSk7cmV0dXJuIGtyKERpKG8sMSksZSxuKX1mdW5jdGlvbiBPcihlLG4saSl7Zm9yKHZhciByPS0xLG89ZS5sZW5ndGgsYT1uLmxlbmd0aCxzPXt9OysrcjxvOylpKHMsZVtyXSxyPGE/bltyXTp0KTtyZXR1cm4gc31mdW5jdGlvbiB6cih0KXtyZXR1cm4gbXModCk/dDpbXX1mdW5jdGlvbiBEcih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OkxsfWZ1bmN0aW9uIEJyKHQsZSl7cmV0dXJuIGhzKHQpP3Q6Rm8odCxlKT9bdF06bmEoV3ModCkpfXZhciBIcj1tcjtmdW5jdGlvbiBGcihlLG4saSl7dmFyIHI9ZS5sZW5ndGg7cmV0dXJuIGk9aT09PXQ/cjppLCFuJiZpPj1yP2U6d3IoZSxuLGkpfXZhciBWcj13ZXx8ZnVuY3Rpb24odCl7cmV0dXJuIGVlLmNsZWFyVGltZW91dCh0KX07ZnVuY3Rpb24gVXIodCxlKXtpZihlKXJldHVybiB0LnNsaWNlKCk7dmFyIG49dC5sZW5ndGgsaT1LdD9LdChuKTpuZXcgdC5jb25zdHJ1Y3RvcihuKTtyZXR1cm4gdC5jb3B5KGkpLGl9ZnVuY3Rpb24ganIodCl7dmFyIGU9bmV3IHQuY29uc3RydWN0b3IodC5ieXRlTGVuZ3RoKTtyZXR1cm4gbmV3IEd0KGUpLnNldChuZXcgR3QodCkpLGV9ZnVuY3Rpb24gR3IodCxlKXt2YXIgbj1lP2pyKHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3Iobix0LmJ5dGVPZmZzZXQsdC5sZW5ndGgpfWZ1bmN0aW9uIFdyKGUsbil7aWYoZSE9PW4pe3ZhciBpPWUhPT10LHI9bnVsbD09PWUsbz1lPT1lLGE9UnMoZSkscz1uIT09dCxsPW51bGw9PT1uLGM9bj09bix1PVJzKG4pO2lmKCFsJiYhdSYmIWEmJmU+bnx8YSYmcyYmYyYmIWwmJiF1fHxyJiZzJiZjfHwhaSYmY3x8IW8pcmV0dXJuIDE7aWYoIXImJiFhJiYhdSYmZTxufHx1JiZpJiZvJiYhciYmIWF8fGwmJmkmJm98fCFzJiZvfHwhYylyZXR1cm4tMX1yZXR1cm4gMH1mdW5jdGlvbiBxcih0LGUsbixpKXtmb3IodmFyIHI9LTEsbz10Lmxlbmd0aCxhPW4ubGVuZ3RoLHM9LTEsbD1lLmxlbmd0aCxjPWduKG8tYSwwKSx1PXZ0KGwrYyksaD0haTsrK3M8bDspdVtzXT1lW3NdO2Zvcig7KytyPGE7KShofHxyPG8pJiYodVtuW3JdXT10W3JdKTtmb3IoO2MtLTspdVtzKytdPXRbcisrXTtyZXR1cm4gdX1mdW5jdGlvbiBZcih0LGUsbixpKXtmb3IodmFyIHI9LTEsbz10Lmxlbmd0aCxhPS0xLHM9bi5sZW5ndGgsbD0tMSxjPWUubGVuZ3RoLHU9Z24oby1zLDApLGg9dnQodStjKSxkPSFpOysrcjx1OyloW3JdPXRbcl07Zm9yKHZhciBwPXI7KytsPGM7KWhbcCtsXT1lW2xdO2Zvcig7KythPHM7KShkfHxyPG8pJiYoaFtwK25bYV1dPXRbcisrXSk7cmV0dXJuIGh9ZnVuY3Rpb24gWHIodCxlKXt2YXIgbj0tMSxpPXQubGVuZ3RoO2ZvcihlfHwoZT12dChpKSk7KytuPGk7KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiAkcihlLG4saSxyKXt2YXIgbz0haTtpfHwoaT17fSk7Zm9yKHZhciBhPS0xLHM9bi5sZW5ndGg7KythPHM7KXt2YXIgbD1uW2FdLGM9cj9yKGlbbF0sZVtsXSxsLGksZSk6dDtjPT09dCYmKGM9ZVtsXSksbz9paShpLGwsYyk6UW4oaSxsLGMpfXJldHVybiBpfWZ1bmN0aW9uIEtyKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSl7dmFyIHI9aHMobik/ZmU6ZWksbz1lP2UoKTp7fTtyZXR1cm4gcihuLHQsQW8oaSwyKSxvKX19ZnVuY3Rpb24gWnIoZSl7cmV0dXJuIG1yKChmdW5jdGlvbihuLGkpe3ZhciByPS0xLG89aS5sZW5ndGgsYT1vPjE/aVtvLTFdOnQscz1vPjI/aVsyXTp0O2ZvcihhPWUubGVuZ3RoPjMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhPyhvLS0sYSk6dCxzJiZIbyhpWzBdLGlbMV0scykmJihhPW88Mz90OmEsbz0xKSxuPU10KG4pOysrcjxvOyl7dmFyIGw9aVtyXTtsJiZlKG4sbCxyLGEpfXJldHVybiBufSkpfWZ1bmN0aW9uIEpyKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSl7aWYobnVsbD09bilyZXR1cm4gbjtpZighZnMobikpcmV0dXJuIHQobixpKTtmb3IodmFyIHI9bi5sZW5ndGgsbz1lP3I6LTEsYT1NdChuKTsoZT9vLS06KytvPHIpJiYhMSE9PWkoYVtvXSxvLGEpOyk7cmV0dXJuIG59fWZ1bmN0aW9uIFFyKHQpe3JldHVybiBmdW5jdGlvbihlLG4saSl7Zm9yKHZhciByPS0xLG89TXQoZSksYT1pKGUpLHM9YS5sZW5ndGg7cy0tOyl7dmFyIGw9YVt0P3M6KytyXTtpZighMT09PW4ob1tsXSxsLG8pKWJyZWFrfXJldHVybiBlfX1mdW5jdGlvbiB0byhlKXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGk9WmUobj1XcyhuKSk/b24obik6dCxyPWk/aVswXTpuLmNoYXJBdCgwKSxvPWk/RnIoaSwxKS5qb2luKCIiKTpuLnNsaWNlKDEpO3JldHVybiByW2VdKCkrb319ZnVuY3Rpb24gZW8odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBUZShNbChnbChlKS5yZXBsYWNlKEZ0LCIiKSksdCwiIil9fWZ1bmN0aW9uIG5vKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlWzBdKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSk7Y2FzZSAzOnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSk7Y2FzZSA0OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdKTtjYXNlIDU6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSk7Y2FzZSA2OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XSk7Y2FzZSA3OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XSxlWzZdKX12YXIgbj1Ibih0LnByb3RvdHlwZSksaT10LmFwcGx5KG4sZSk7cmV0dXJuIFNzKGkpP2k6bn19ZnVuY3Rpb24gaW8oZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSxyKXt2YXIgbz1NdChuKTtpZighZnMobikpe3ZhciBhPUFvKGksMyk7bj1ybChuKSxpPWZ1bmN0aW9uKHQpe3JldHVybiBhKG9bdF0sdCxvKX19dmFyIHM9ZShuLGkscik7cmV0dXJuIHM+LTE/b1thP25bc106c106dH19ZnVuY3Rpb24gcm8obil7cmV0dXJuIHdvKChmdW5jdGlvbihpKXt2YXIgcj1pLmxlbmd0aCxvPXIsYT1Wbi5wcm90b3R5cGUudGhydTtmb3IobiYmaS5yZXZlcnNlKCk7by0tOyl7dmFyIHM9aVtvXTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygcyl0aHJvdyBuZXcgQ3QoZSk7aWYoYSYmIWwmJiJ3cmFwcGVyIj09VG8ocykpdmFyIGw9bmV3IFZuKFtdLCEwKX1mb3Iobz1sP286cjsrK288cjspe3ZhciBjPVRvKHM9aVtvXSksdT0id3JhcHBlciI9PWM/RW8ocyk6dDtsPXUmJlZvKHVbMF0pJiY0MjQ9PXVbMV0mJiF1WzRdLmxlbmd0aCYmMT09dVs5XT9sW1RvKHVbMF0pXS5hcHBseShsLHVbM10pOjE9PXMubGVuZ3RoJiZWbyhzKT9sW2NdKCk6bC50aHJ1KHMpfXJldHVybiBmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cyxlPXRbMF07aWYobCYmMT09dC5sZW5ndGgmJmhzKGUpKXJldHVybiBsLnBsYW50KGUpLnZhbHVlKCk7Zm9yKHZhciBuPTAsbz1yP2lbbl0uYXBwbHkodGhpcyx0KTplOysrbjxyOylvPWlbbl0uY2FsbCh0aGlzLG8pO3JldHVybiBvfX0pKX1mdW5jdGlvbiBvbyhlLG4saSxyLGEscyxsLGMsdSxoKXt2YXIgZD1uJm8scD0xJm4sZj0yJm4sbT0yNCZuLGc9NTEyJm4sXz1mP3Q6bm8oZSk7cmV0dXJuIGZ1bmN0aW9uIHQoKXtmb3IodmFyIG89YXJndW1lbnRzLmxlbmd0aCx5PXZ0KG8pLHY9bzt2LS07KXlbdl09YXJndW1lbnRzW3ZdO2lmKG0pdmFyIGI9Q28odCkseD1ZZSh5LGIpO2lmKHImJih5PXFyKHkscixhLG0pKSxzJiYoeT1Zcih5LHMsbCxtKSksby09eCxtJiZvPGgpe3ZhciB3PXRuKHksYik7cmV0dXJuIHBvKGUsbixvbyx0LnBsYWNlaG9sZGVyLGkseSx3LGMsdSxoLW8pfXZhciBTPXA/aTp0aGlzLE09Zj9TW2VdOmU7cmV0dXJuIG89eS5sZW5ndGgsYz95PVhvKHksYyk6ZyYmbz4xJiZ5LnJldmVyc2UoKSxkJiZ1PG8mJih5Lmxlbmd0aD11KSx0aGlzJiZ0aGlzIT09ZWUmJnRoaXMgaW5zdGFuY2VvZiB0JiYoTT1ffHxubyhNKSksTS5hcHBseShTLHkpfX1mdW5jdGlvbiBhbyh0LGUpe3JldHVybiBmdW5jdGlvbihuLGkpe3JldHVybihmdW5jdGlvbiByKHQsZSxuLGkpe3JldHVybiBGaSh0LChmdW5jdGlvbih0LHIsbyl7ZShpLG4odCkscixvKX0pKSxpfSkobix0LGUoaSkse30pfX1mdW5jdGlvbiBzbyhlLG4pe3JldHVybiBmdW5jdGlvbihpLHIpe3ZhciBvO2lmKGk9PT10JiZyPT09dClyZXR1cm4gbjtpZihpIT09dCYmKG89aSksciE9PXQpe2lmKG89PT10KXJldHVybiByOyJzdHJpbmciPT10eXBlb2YgaXx8InN0cmluZyI9PXR5cGVvZiByPyhpPUFyKGkpLHI9QXIocikpOihpPUNyKGkpLHI9Q3IocikpLG89ZShpLHIpfXJldHVybiBvfX1mdW5jdGlvbiBsbyh0KXtyZXR1cm4gd28oKGZ1bmN0aW9uKGUpe3JldHVybiBlPU1lKGUsVWUoQW8oKSkpLG1yKChmdW5jdGlvbihuKXt2YXIgaT10aGlzO3JldHVybiB0KGUsKGZ1bmN0aW9uKHQpe3JldHVybiBwZSh0LGksbil9KSl9KSl9KSl9ZnVuY3Rpb24gY28oZSxuKXt2YXIgaT0obj1uPT09dD8iICI6QXIobikpLmxlbmd0aDtpZihpPDIpcmV0dXJuIGk/ZnIobixlKTpuO3ZhciByPWZyKG4sY24oZS9ybihuKSkpO3JldHVybiBaZShuKT9GcihvbihyKSwwLGUpLmpvaW4oIiIpOnIuc2xpY2UoMCxlKX1mdW5jdGlvbiB1byhlKXtyZXR1cm4gZnVuY3Rpb24obixpLHIpe3JldHVybiByJiYibnVtYmVyIiE9dHlwZW9mIHImJkhvKG4saSxyKSYmKGk9cj10KSxuPUZzKG4pLGk9PT10PyhpPW4sbj0wKTppPUZzKGkpLChmdW5jdGlvbiBvKHQsZSxuLGkpe2Zvcih2YXIgcj0tMSxvPWduKGNuKChlLXQpLyhufHwxKSksMCksYT12dChvKTtvLS07KWFbaT9vOisrcl09dCx0Kz1uO3JldHVybiBhfSkobixpLHI9cj09PXQ/bjxpPzE6LTE6RnMociksZSl9fWZ1bmN0aW9uIGhvKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmInN0cmluZyI9PXR5cGVvZiBufHwoZT1qcyhlKSxuPWpzKG4pKSx0KGUsbil9fWZ1bmN0aW9uIHBvKGUsbixpLG8sYSxzLGwsYyx1LGgpe3ZhciBkPTgmbjtufD1kP3I6NjQsNCYobiY9fihkPzY0OnIpKXx8KG4mPS00KTt2YXIgcD1bZSxuLGEsZD9zOnQsZD9sOnQsZD90OnMsZD90OmwsYyx1LGhdLGY9aS5hcHBseSh0LHApO3JldHVybiBWbyhlKSYmS28oZixwKSxmLnBsYWNlaG9sZGVyPW8sUW8oZixlLG4pfWZ1bmN0aW9uIGZvKHQpe3ZhciBlPVN0W3RdO3JldHVybiBmdW5jdGlvbih0LG4pe2lmKHQ9anModCksKG49bnVsbD09bj8wOl9uKFZzKG4pLDI5MikpJiZwbih0KSl7dmFyIGk9KFdzKHQpKyJlIikuc3BsaXQoImUiKTtyZXR1cm4rKChpPShXcyhlKGlbMF0rImUiKygraVsxXStuKSkpKyJlIikuc3BsaXQoImUiKSlbMF0rImUiKygraVsxXS1uKSl9cmV0dXJuIGUodCl9fXZhciBtbz1FbiYmMS9lbihuZXcgRW4oWywtMF0pKVsxXT09YT9mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEVuKHQpfTpPbDtmdW5jdGlvbiBnbyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49Um8oZSk7cmV0dXJuIG49PXk/SmUoZSk6bj09Uz9ubihlKTooZnVuY3Rpb24gaSh0LGUpe3JldHVybiBNZShlLChmdW5jdGlvbihlKXtyZXR1cm5bZSx0W2VdXX0pKX0pKGUsdChlKSl9fWZ1bmN0aW9uIF9vKG4sYSxzLGwsYyx1LGgsZCl7dmFyIHA9MiZhO2lmKCFwJiYiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgQ3QoZSk7dmFyIGY9bD9sLmxlbmd0aDowO2lmKGZ8fChhJj0tOTcsbD1jPXQpLGg9aD09PXQ/aDpnbihWcyhoKSwwKSxkPWQ9PT10P2Q6VnMoZCksZi09Yz9jLmxlbmd0aDowLDY0JmEpe3ZhciBtPWwsZz1jO2w9Yz10fXZhciBfPXA/dDpFbyhuKSx5PVtuLGEscyxsLGMsbSxnLHUsaCxkXTtpZihfJiYoZnVuY3Rpb24gdih0LGUpe3ZhciBuPXRbMV0scj1lWzFdLGE9bnxyO2lmKCEoYTwxMzF8fHI9PW8mJjg9PW58fHI9PW8mJjI1Nj09biYmdFs3XS5sZW5ndGg8PWVbOF18fDM4ND09ciYmZVs3XS5sZW5ndGg8PWVbOF0mJjg9PW4pKXJldHVybiB0OzEmciYmKHRbMl09ZVsyXSxhfD0xJm4/MDo0KTt2YXIgcz1lWzNdO2lmKHMpe3ZhciBsPXRbM107dFszXT1sP3FyKGwscyxlWzRdKTpzLHRbNF09bD90bih0WzNdLGkpOmVbNF19KHM9ZVs1XSkmJih0WzVdPShsPXRbNV0pP1lyKGwscyxlWzZdKTpzLHRbNl09bD90bih0WzVdLGkpOmVbNl0pLChzPWVbN10pJiYodFs3XT1zKSxyJm8mJih0WzhdPW51bGw9PXRbOF0/ZVs4XTpfbih0WzhdLGVbOF0pKSxudWxsPT10WzldJiYodFs5XT1lWzldKSx0WzBdPWVbMF0sdFsxXT1hfSkoeSxfKSxuPXlbMF0sYT15WzFdLHM9eVsyXSxsPXlbM10sYz15WzRdLCEoZD15WzldPXlbOV09PT10P3A/MDpuLmxlbmd0aDpnbih5WzldLWYsMCkpJiYyNCZhJiYoYSY9LTI1KSxhJiYxIT1hKXc9OD09YXx8MTY9PWE/KGZ1bmN0aW9uIGIoZSxuLGkpe3ZhciByPW5vKGUpO3JldHVybiBmdW5jdGlvbiBvKCl7Zm9yKHZhciBhPWFyZ3VtZW50cy5sZW5ndGgscz12dChhKSxsPWEsYz1DbyhvKTtsLS07KXNbbF09YXJndW1lbnRzW2xdO3ZhciB1PWE8MyYmc1swXSE9PWMmJnNbYS0xXSE9PWM/W106dG4ocyxjKTtyZXR1cm4oYS09dS5sZW5ndGgpPGk/cG8oZSxuLG9vLG8ucGxhY2Vob2xkZXIsdCxzLHUsdCx0LGktYSk6cGUodGhpcyYmdGhpcyE9PWVlJiZ0aGlzIGluc3RhbmNlb2Ygbz9yOmUsdGhpcyxzKX19KShuLGEsZCk6YSE9ciYmMzMhPWF8fGMubGVuZ3RoP29vLmFwcGx5KHQseSk6KGZ1bmN0aW9uIHgodCxlLG4saSl7dmFyIHI9MSZlLG89bm8odCk7cmV0dXJuIGZ1bmN0aW9uIGUoKXtmb3IodmFyIGE9LTEscz1hcmd1bWVudHMubGVuZ3RoLGw9LTEsYz1pLmxlbmd0aCx1PXZ0KGMrcyksaD10aGlzJiZ0aGlzIT09ZWUmJnRoaXMgaW5zdGFuY2VvZiBlP286dDsrK2w8YzspdVtsXT1pW2xdO2Zvcig7cy0tOyl1W2wrK109YXJndW1lbnRzWysrYV07cmV0dXJuIHBlKGgscj9uOnRoaXMsdSl9fSkobixhLHMsbCk7ZWxzZSB2YXIgdz0oZnVuY3Rpb24gUyh0LGUsbil7dmFyIGk9MSZlLHI9bm8odCk7cmV0dXJuIGZ1bmN0aW9uIGUoKXtyZXR1cm4odGhpcyYmdGhpcyE9PWVlJiZ0aGlzIGluc3RhbmNlb2YgZT9yOnQpLmFwcGx5KGk/bjp0aGlzLGFyZ3VtZW50cyl9fSkobixhLHMpO3JldHVybiBRbygoXz92cjpLbykodyx5KSxuLGEpfWZ1bmN0aW9uIHlvKGUsbixpLHIpe3JldHVybiBlPT09dHx8c3MoZSxrdFtpXSkmJiFOdC5jYWxsKHIsaSk/bjplfWZ1bmN0aW9uIHZvKGUsbixpLHIsbyxhKXtyZXR1cm4gU3MoZSkmJlNzKG4pJiYoYS5zZXQobixlKSxzcihlLG4sdCx2byxhKSxhLmRlbGV0ZShuKSksZX1mdW5jdGlvbiBibyhlKXtyZXR1cm4gQXMoZSk/dDplfWZ1bmN0aW9uIHhvKGUsbixpLHIsbyxhKXt2YXIgcz0xJmksbD1lLmxlbmd0aCxjPW4ubGVuZ3RoO2lmKGwhPWMmJiEocyYmYz5sKSlyZXR1cm4hMTt2YXIgdT1hLmdldChlKSxoPWEuZ2V0KG4pO2lmKHUmJmgpcmV0dXJuIHU9PW4mJmg9PWU7dmFyIGQ9LTEscD0hMCxmPTImaT9uZXcgcW46dDtmb3IoYS5zZXQoZSxuKSxhLnNldChuLGUpOysrZDxsOyl7dmFyIG09ZVtkXSxnPW5bZF07aWYocil2YXIgXz1zP3IoZyxtLGQsbixlLGEpOnIobSxnLGQsZSxuLGEpO2lmKF8hPT10KXtpZihfKWNvbnRpbnVlO3A9ITE7YnJlYWt9aWYoZil7aWYoIUFlKG4sKGZ1bmN0aW9uKHQsZSl7aWYoIUdlKGYsZSkmJihtPT09dHx8byhtLHQsaSxyLGEpKSlyZXR1cm4gZi5wdXNoKGUpfSkpKXtwPSExO2JyZWFrfX1lbHNlIGlmKG0hPT1nJiYhbyhtLGcsaSxyLGEpKXtwPSExO2JyZWFrfX1yZXR1cm4gYS5kZWxldGUoZSksYS5kZWxldGUobikscH1mdW5jdGlvbiB3byhlKXtyZXR1cm4gSm8ocW8oZSx0LGRhKSxlKyIiKX1mdW5jdGlvbiBTbyh0KXtyZXR1cm4gR2kodCxybCxObyl9ZnVuY3Rpb24gTW8odCl7cmV0dXJuIEdpKHQsb2wsSW8pfXZhciBFbz1Bbj9mdW5jdGlvbih0KXtyZXR1cm4gQW4uZ2V0KHQpfTpPbDtmdW5jdGlvbiBUbyh0KXtmb3IodmFyIGU9dC5uYW1lKyIiLG49a25bZV0saT1OdC5jYWxsKGtuLGUpP24ubGVuZ3RoOjA7aS0tOyl7dmFyIHI9bltpXSxvPXIuZnVuYztpZihudWxsPT1vfHxvPT10KXJldHVybiByLm5hbWV9cmV0dXJuIGV9ZnVuY3Rpb24gQ28odCl7cmV0dXJuKE50LmNhbGwoQm4sInBsYWNlaG9sZGVyIik/Qm46dCkucGxhY2Vob2xkZXJ9ZnVuY3Rpb24gQW8oKXt2YXIgdD1Cbi5pdGVyYXRlZXx8UGw7cmV0dXJuIHQ9dD09PVBsP2VyOnQsYXJndW1lbnRzLmxlbmd0aD90KGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pOnR9ZnVuY3Rpb24ga28odCxlKXt2YXIgbj10Ll9fZGF0YV9fO3JldHVybihmdW5jdGlvbiBpKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiJzdHJpbmciPT1lfHwibnVtYmVyIj09ZXx8InN5bWJvbCI9PWV8fCJib29sZWFuIj09ZT8iX19wcm90b19fIiE9PXQ6bnVsbD09PXR9KShlKT9uWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOm4ubWFwfWZ1bmN0aW9uIExvKHQpe2Zvcih2YXIgZT1ybCh0KSxuPWUubGVuZ3RoO24tLTspe3ZhciBpPWVbbl0scj10W2ldO2Vbbl09W2kscixHbyhyKV19cmV0dXJuIGV9ZnVuY3Rpb24gUG8oZSxuKXt2YXIgaT0oZnVuY3Rpb24gcihlLG4pe3JldHVybiBudWxsPT1lP3Q6ZVtuXX0pKGUsbik7cmV0dXJuIHRyKGkpP2k6dH12YXIgTm89aG4/ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106KHQ9TXQodCkseWUoaG4odCksKGZ1bmN0aW9uKGUpe3JldHVybiBuZS5jYWxsKHQsZSl9KSkpfTpVbCxJbz1obj9mdW5jdGlvbih0KXtmb3IodmFyIGU9W107dDspRWUoZSxObyh0KSksdD1RdCh0KTtyZXR1cm4gZX06VWwsUm89V2k7ZnVuY3Rpb24gT28odCxlLG4pe2Zvcih2YXIgaT0tMSxyPShlPUJyKGUsdCkpLmxlbmd0aCxvPSExOysraTxyOyl7dmFyIGE9cmEoZVtpXSk7aWYoIShvPW51bGwhPXQmJm4odCxhKSkpYnJlYWs7dD10W2FdfXJldHVybiBvfHwrK2khPXI/bzohIShyPW51bGw9PXQ/MDp0Lmxlbmd0aCkmJndzKHIpJiZCbyhhLHIpJiYoaHModCl8fHVzKHQpKX1mdW5jdGlvbiB6byh0KXtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdC5jb25zdHJ1Y3Rvcnx8am8odCk/e306SG4oUXQodCkpfWZ1bmN0aW9uIERvKHQpe3JldHVybiBocyh0KXx8dXModCl8fCEhKG9lJiZ0JiZ0W29lXSl9ZnVuY3Rpb24gQm8odCxlKXt2YXIgbj10eXBlb2YgdDtyZXR1cm4hIShlPW51bGw9PWU/czplKSYmKCJudW1iZXIiPT1ufHwic3ltYm9sIiE9biYmcHQudGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxlfWZ1bmN0aW9uIEhvKHQsZSxuKXtpZighU3MobikpcmV0dXJuITE7dmFyIGk9dHlwZW9mIGU7cmV0dXJuISEoIm51bWJlciI9PWk/ZnMobikmJkJvKGUsbi5sZW5ndGgpOiJzdHJpbmciPT1pJiZlIGluIG4pJiZzcyhuW2VdLHQpfWZ1bmN0aW9uIEZvKHQsZSl7aWYoaHModCkpcmV0dXJuITE7dmFyIG49dHlwZW9mIHQ7cmV0dXJuISgibnVtYmVyIiE9biYmInN5bWJvbCIhPW4mJiJib29sZWFuIiE9biYmbnVsbCE9dCYmIVJzKHQpKXx8JC50ZXN0KHQpfHwhWC50ZXN0KHQpfHxudWxsIT1lJiZ0IGluIE10KGUpfWZ1bmN0aW9uIFZvKHQpe3ZhciBlPVRvKHQpLG49Qm5bZV07aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG58fCEoZSBpbiBVbi5wcm90b3R5cGUpKXJldHVybiExO2lmKHQ9PT1uKXJldHVybiEwO3ZhciBpPUVvKG4pO3JldHVybiEhaSYmdD09PWlbMF19KHduJiZSbyhuZXcgd24obmV3IEFycmF5QnVmZmVyKDEpKSkhPUF8fFNuJiZSbyhuZXcgU24pIT15fHxNbiYmUm8oTW4ucmVzb2x2ZSgpKSE9eHx8RW4mJlJvKG5ldyBFbikhPVN8fFRuJiZSbyhuZXcgVG4pIT1UKSYmKFJvPWZ1bmN0aW9uKGUpe3ZhciBuPVdpKGUpLGk9bj09Yj9lLmNvbnN0cnVjdG9yOnQscj1pP29hKGkpOiIiO2lmKHIpc3dpdGNoKHIpe2Nhc2UgTG46cmV0dXJuIEE7Y2FzZSBQbjpyZXR1cm4geTtjYXNlIE5uOnJldHVybiB4O2Nhc2UgSW46cmV0dXJuIFM7Y2FzZSBSbjpyZXR1cm4gVH1yZXR1cm4gbn0pO3ZhciBVbz1MdD9iczpqbDtmdW5jdGlvbiBqbyh0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yO3JldHVybiB0PT09KCJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLnByb3RvdHlwZXx8a3QpfWZ1bmN0aW9uIEdvKHQpe3JldHVybiB0PT10JiYhU3ModCl9ZnVuY3Rpb24gV28oZSxuKXtyZXR1cm4gZnVuY3Rpb24oaSl7cmV0dXJuIG51bGwhPWkmJmlbZV09PT1uJiYobiE9PXR8fGUgaW4gTXQoaSkpfX1mdW5jdGlvbiBxbyhlLG4saSl7cmV0dXJuIG49Z24obj09PXQ/ZS5sZW5ndGgtMTpuLDApLGZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cyxyPS0xLG89Z24odC5sZW5ndGgtbiwwKSxhPXZ0KG8pOysrcjxvOylhW3JdPXRbbityXTtyPS0xO2Zvcih2YXIgcz12dChuKzEpOysrcjxuOylzW3JdPXRbcl07cmV0dXJuIHNbbl09aShhKSxwZShlLHRoaXMscyl9fWZ1bmN0aW9uIFlvKHQsZSl7cmV0dXJuIGUubGVuZ3RoPDI/dDpqaSh0LHdyKGUsMCwtMSkpfWZ1bmN0aW9uIFhvKGUsbil7Zm9yKHZhciBpPWUubGVuZ3RoLHI9X24obi5sZW5ndGgsaSksbz1YcihlKTtyLS07KXt2YXIgYT1uW3JdO2Vbcl09Qm8oYSxpKT9vW2FdOnR9cmV0dXJuIGV9ZnVuY3Rpb24gJG8odCxlKXtpZigoImNvbnN0cnVjdG9yIiE9PWV8fCJmdW5jdGlvbiIhPXR5cGVvZiB0W2VdKSYmIl9fcHJvdG9fXyIhPWUpcmV0dXJuIHRbZV19dmFyIEtvPXRhKHZyKSxabz1EZXx8ZnVuY3Rpb24odCxlKXtyZXR1cm4gZWUuc2V0VGltZW91dCh0LGUpfSxKbz10YShicik7ZnVuY3Rpb24gUW8odCxlLG4pe3ZhciBpPWUrIiI7cmV0dXJuIEpvKHQsKGZ1bmN0aW9uIGEodCxlKXt2YXIgbj1lLmxlbmd0aDtpZighbilyZXR1cm4gdDt2YXIgaT1uLTE7cmV0dXJuIGVbaV09KG4+MT8iJiAiOiIiKStlW2ldLGU9ZS5qb2luKG4+Mj8iLCAiOiIgIiksdC5yZXBsYWNlKGV0LCJ7XG4vKiBbd3JhcHBlZCB3aXRoICIrZSsiXSAqL1xuIil9KShpLChmdW5jdGlvbiBvKHQsZSl7cmV0dXJuIG1lKHUsKGZ1bmN0aW9uKG4pe3ZhciBpPSJfLiIrblswXTtlJm5bMV0mJiFiZSh0LGkpJiZ0LnB1c2goaSl9KSksdC5zb3J0KCl9KSgoZnVuY3Rpb24gcih0KXt2YXIgZT10Lm1hdGNoKG50KTtyZXR1cm4gZT9lWzFdLnNwbGl0KGl0KTpbXX0pKGkpLG4pKSl9ZnVuY3Rpb24gdGEoZSl7dmFyIG49MCxpPTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9eW4oKSxvPTE2LShyLWkpO2lmKGk9cixvPjApe2lmKCsrbj49ODAwKXJldHVybiBhcmd1bWVudHNbMF19ZWxzZSBuPTA7cmV0dXJuIGUuYXBwbHkodCxhcmd1bWVudHMpfX1mdW5jdGlvbiBlYShlLG4pe3ZhciBpPS0xLHI9ZS5sZW5ndGgsbz1yLTE7Zm9yKG49bj09PXQ/cjpuOysraTxuOyl7dmFyIGE9cHIoaSxvKSxzPWVbYV07ZVthXT1lW2ldLGVbaV09c31yZXR1cm4gZS5sZW5ndGg9bixlfXZhciBuYT0oZnVuY3Rpb24gaWEodCl7dmFyIGU9ZXModCwoZnVuY3Rpb24odCl7cmV0dXJuIDUwMD09PW4uc2l6ZSYmbi5jbGVhcigpLHR9KSksbj1lLmNhY2hlO3JldHVybiBlfSkoKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKCIiKSx0LnJlcGxhY2UoSywoZnVuY3Rpb24odCxuLGkscil7ZS5wdXNoKGk/ci5yZXBsYWNlKGF0LCIkMSIpOm58fHQpfSkpLGV9KSk7ZnVuY3Rpb24gcmEodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHxScyh0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0tMS8wPyItMCI6ZX1mdW5jdGlvbiBvYSh0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIFB0LmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifWZ1bmN0aW9uIGFhKHQpe2lmKHQgaW5zdGFuY2VvZiBVbilyZXR1cm4gdC5jbG9uZSgpO3ZhciBlPW5ldyBWbih0Ll9fd3JhcHBlZF9fLHQuX19jaGFpbl9fKTtyZXR1cm4gZS5fX2FjdGlvbnNfXz1Ycih0Ll9fYWN0aW9uc19fKSxlLl9faW5kZXhfXz10Ll9faW5kZXhfXyxlLl9fdmFsdWVzX189dC5fX3ZhbHVlc19fLGV9dmFyIHNhPW1yKChmdW5jdGlvbih0LGUpe3JldHVybiBtcyh0KT9jaSh0LERpKGUsMSxtcywhMCkpOltdfSkpLGxhPW1yKChmdW5jdGlvbihlLG4pe3ZhciBpPV9hKG4pO3JldHVybiBtcyhpKSYmKGk9dCksbXMoZSk/Y2koZSxEaShuLDEsbXMsITApLEFvKGksMikpOltdfSkpLGNhPW1yKChmdW5jdGlvbihlLG4pe3ZhciBpPV9hKG4pO3JldHVybiBtcyhpKSYmKGk9dCksbXMoZSk/Y2koZSxEaShuLDEsbXMsITApLHQsaSk6W119KSk7ZnVuY3Rpb24gdWEodCxlLG4pe3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZighaSlyZXR1cm4tMTt2YXIgcj1udWxsPT1uPzA6VnMobik7cmV0dXJuIHI8MCYmKHI9Z24oaStyLDApKSxQZSh0LEFvKGUsMykscil9ZnVuY3Rpb24gaGEoZSxuLGkpe3ZhciByPW51bGw9PWU/MDplLmxlbmd0aDtpZighcilyZXR1cm4tMTt2YXIgbz1yLTE7cmV0dXJuIGkhPT10JiYobz1WcyhpKSxvPWk8MD9nbihyK28sMCk6X24obyxyLTEpKSxQZShlLEFvKG4sMyksbywhMCl9ZnVuY3Rpb24gZGEodCl7cmV0dXJuIG51bGwhPXQmJnQubGVuZ3RoP0RpKHQsMSk6W119ZnVuY3Rpb24gcGEoZSl7cmV0dXJuIGUmJmUubGVuZ3RoP2VbMF06dH12YXIgZmE9bXIoKGZ1bmN0aW9uKHQpe3ZhciBlPU1lKHQsenIpO3JldHVybiBlLmxlbmd0aCYmZVswXT09PXRbMF0/JGkoZSk6W119KSksbWE9bXIoKGZ1bmN0aW9uKGUpe3ZhciBuPV9hKGUpLGk9TWUoZSx6cik7cmV0dXJuIG49PT1fYShpKT9uPXQ6aS5wb3AoKSxpLmxlbmd0aCYmaVswXT09PWVbMF0/JGkoaSxBbyhuLDIpKTpbXX0pKSxnYT1tcigoZnVuY3Rpb24oZSl7dmFyIG49X2EoZSksaT1NZShlLHpyKTtyZXR1cm4obj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnQpJiZpLnBvcCgpLGkubGVuZ3RoJiZpWzBdPT09ZVswXT8kaShpLHQsbik6W119KSk7ZnVuY3Rpb24gX2EoZSl7dmFyIG49bnVsbD09ZT8wOmUubGVuZ3RoO3JldHVybiBuP2Vbbi0xXTp0fXZhciB5YT1tcih2YSk7ZnVuY3Rpb24gdmEodCxlKXtyZXR1cm4gdCYmdC5sZW5ndGgmJmUmJmUubGVuZ3RoP2hyKHQsZSk6dH12YXIgYmE9d28oKGZ1bmN0aW9uKHQsZSl7dmFyIG49bnVsbD09dD8wOnQubGVuZ3RoLGk9cmkodCxlKTtyZXR1cm4gZHIodCxNZShlLChmdW5jdGlvbih0KXtyZXR1cm4gQm8odCxuKT8rdDp0fSkpLnNvcnQoV3IpKSxpfSkpO2Z1bmN0aW9uIHhhKHQpe3JldHVybiBudWxsPT10P3Q6eG4uY2FsbCh0KX12YXIgd2E9bXIoKGZ1bmN0aW9uKHQpe3JldHVybiBrcihEaSh0LDEsbXMsITApKX0pKSxTYT1tcigoZnVuY3Rpb24oZSl7dmFyIG49X2EoZSk7cmV0dXJuIG1zKG4pJiYobj10KSxrcihEaShlLDEsbXMsITApLEFvKG4sMikpfSkpLE1hPW1yKChmdW5jdGlvbihlKXt2YXIgbj1fYShlKTtyZXR1cm4gbj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnQsa3IoRGkoZSwxLG1zLCEwKSx0LG4pfSkpO2Z1bmN0aW9uIEVhKHQpe2lmKCF0fHwhdC5sZW5ndGgpcmV0dXJuW107dmFyIGU9MDtyZXR1cm4gdD15ZSh0LChmdW5jdGlvbih0KXtpZihtcyh0KSlyZXR1cm4gZT1nbih0Lmxlbmd0aCxlKSwhMH0pKSxGZShlLChmdW5jdGlvbihlKXtyZXR1cm4gTWUodCx6ZShlKSl9KSl9ZnVuY3Rpb24gVGEoZSxuKXtpZighZXx8IWUubGVuZ3RoKXJldHVybltdO3ZhciBpPUVhKGUpO3JldHVybiBudWxsPT1uP2k6TWUoaSwoZnVuY3Rpb24oZSl7cmV0dXJuIHBlKG4sdCxlKX0pKX12YXIgQ2E9bXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG1zKHQpP2NpKHQsZSk6W119KSksQWE9bXIoKGZ1bmN0aW9uKHQpe3JldHVybiBScih5ZSh0LG1zKSl9KSksa2E9bXIoKGZ1bmN0aW9uKGUpe3ZhciBuPV9hKGUpO3JldHVybiBtcyhuKSYmKG49dCksUnIoeWUoZSxtcyksQW8obiwyKSl9KSksTGE9bXIoKGZ1bmN0aW9uKGUpe3ZhciBuPV9hKGUpO3JldHVybiBuPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246dCxScih5ZShlLG1zKSx0LG4pfSkpLFBhPW1yKEVhKSxOYT1tcigoZnVuY3Rpb24oZSl7dmFyIG49ZS5sZW5ndGgsaT1uPjE/ZVtuLTFdOnQ7cmV0dXJuIGk9ImZ1bmN0aW9uIj09dHlwZW9mIGk/KGUucG9wKCksaSk6dCxUYShlLGkpfSkpO2Z1bmN0aW9uIElhKHQpe3ZhciBlPUJuKHQpO3JldHVybiBlLl9fY2hhaW5fXz0hMCxlfWZ1bmN0aW9uIFJhKHQsZSl7cmV0dXJuIGUodCl9dmFyIE9hPXdvKChmdW5jdGlvbihlKXt2YXIgbj1lLmxlbmd0aCxpPW4/ZVswXTowLHI9dGhpcy5fX3dyYXBwZWRfXyxvPWZ1bmN0aW9uKHQpe3JldHVybiByaSh0LGUpfTtyZXR1cm4hKG4+MXx8dGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgpJiZyIGluc3RhbmNlb2YgVW4mJkJvKGkpPygocj1yLnNsaWNlKGksK2krKG4/MTowKSkpLl9fYWN0aW9uc19fLnB1c2goe2Z1bmM6UmEsYXJnczpbb10sdGhpc0FyZzp0fSksbmV3IFZuKHIsdGhpcy5fX2NoYWluX18pLnRocnUoKGZ1bmN0aW9uKGUpe3JldHVybiBuJiYhZS5sZW5ndGgmJmUucHVzaCh0KSxlfSkpKTp0aGlzLnRocnUobyl9KSksemE9S3IoKGZ1bmN0aW9uKHQsZSxuKXtOdC5jYWxsKHQsbik/Kyt0W25dOmlpKHQsbiwxKX0pKSxEYT1pbyh1YSksQmE9aW8oaGEpO2Z1bmN0aW9uIEhhKHQsZSl7cmV0dXJuKGhzKHQpP21lOk5pKSh0LEFvKGUsMykpfWZ1bmN0aW9uIEZhKHQsZSl7cmV0dXJuKGhzKHQpP2dlOklpKSh0LEFvKGUsMykpfXZhciBWYT1LcigoZnVuY3Rpb24odCxlLG4pe050LmNhbGwodCxuKT90W25dLnB1c2goZSk6aWkodCxuLFtlXSl9KSksVWE9bXIoKGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT0tMSxyPSJmdW5jdGlvbiI9PXR5cGVvZiBlLG89ZnModCk/dnQodC5sZW5ndGgpOltdO3JldHVybiBOaSh0LChmdW5jdGlvbih0KXtvWysraV09cj9wZShlLHQsbik6S2kodCxlLG4pfSkpLG99KSksamE9S3IoKGZ1bmN0aW9uKHQsZSxuKXtpaSh0LG4sZSl9KSk7ZnVuY3Rpb24gR2EodCxlKXtyZXR1cm4oaHModCk/TWU6cnIpKHQsQW8oZSwzKSl9dmFyIFdhPUtyKChmdW5jdGlvbih0LGUsbil7dFtuPzA6MV0ucHVzaChlKX0pLChmdW5jdGlvbigpe3JldHVybltbXSxbXV19KSkscWE9bXIoKGZ1bmN0aW9uKHQsZSl7aWYobnVsbD09dClyZXR1cm5bXTt2YXIgbj1lLmxlbmd0aDtyZXR1cm4gbj4xJiZIbyh0LGVbMF0sZVsxXSk/ZT1bXTpuPjImJkhvKGVbMF0sZVsxXSxlWzJdKSYmKGU9W2VbMF1dKSxjcih0LERpKGUsMSksW10pfSkpLFlhPWtlfHxmdW5jdGlvbigpe3JldHVybiBlZS5EYXRlLm5vdygpfTtmdW5jdGlvbiBYYShlLG4saSl7cmV0dXJuIG49aT90Om4sX28oZSxvLHQsdCx0LHQsbj1lJiZudWxsPT1uP2UubGVuZ3RoOm4pfWZ1bmN0aW9uICRhKG4saSl7dmFyIHI7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGkpdGhyb3cgbmV3IEN0KGUpO3JldHVybiBuPVZzKG4pLGZ1bmN0aW9uKCl7cmV0dXJuLS1uPjAmJihyPWkuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxuPD0xJiYoaT10KSxyfX12YXIgS2E9bXIoKGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT0xO2lmKG4ubGVuZ3RoKXt2YXIgbz10bihuLENvKEthKSk7aXw9cn1yZXR1cm4gX28odCxpLGUsbixvKX0pKSxaYT1tcigoZnVuY3Rpb24odCxlLG4pe3ZhciBpPTM7aWYobi5sZW5ndGgpe3ZhciBvPXRuKG4sQ28oWmEpKTtpfD1yfXJldHVybiBfbyhlLGksdCxuLG8pfSkpO2Z1bmN0aW9uIEphKG4saSxyKXt2YXIgbyxhLHMsbCxjLHUsaD0wLGQ9ITEscD0hMSxmPSEwO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBDdChlKTtmdW5jdGlvbiBtKGUpe3ZhciBpPW8scj1hO3JldHVybiBvPWE9dCxoPWUsbD1uLmFwcGx5KHIsaSl9ZnVuY3Rpb24gZyh0KXtyZXR1cm4gaD10LGM9Wm8oeSxpKSxkP20odCk6bH1mdW5jdGlvbiBfKGUpe3ZhciBuPWUtdTtyZXR1cm4gdT09PXR8fG4+PWl8fG48MHx8cCYmZS1oPj1zfWZ1bmN0aW9uIHkoKXt2YXIgdD1ZYSgpO2lmKF8odCkpcmV0dXJuIHYodCk7Yz1abyh5LChmdW5jdGlvbiBlKHQpe3ZhciBlPWktKHQtdSk7cmV0dXJuIHA/X24oZSxzLSh0LWgpKTplfSkodCkpfWZ1bmN0aW9uIHYoZSl7cmV0dXJuIGM9dCxmJiZvP20oZSk6KG89YT10LGwpfWZ1bmN0aW9uIGIoKXt2YXIgZT1ZYSgpLG49XyhlKTtpZihvPWFyZ3VtZW50cyxhPXRoaXMsdT1lLG4pe2lmKGM9PT10KXJldHVybiBnKHUpO2lmKHApcmV0dXJuIFZyKGMpLGM9Wm8oeSxpKSxtKHUpfXJldHVybiBjPT09dCYmKGM9Wm8oeSxpKSksbH1yZXR1cm4gaT1qcyhpKXx8MCxTcyhyKSYmKGQ9ISFyLmxlYWRpbmcscz0ocD0ibWF4V2FpdCJpbiByKT9nbihqcyhyLm1heFdhaXQpfHwwLGkpOnMsZj0idHJhaWxpbmciaW4gcj8hIXIudHJhaWxpbmc6ZiksYi5jYW5jZWw9ZnVuY3Rpb24geCgpe2MhPT10JiZWcihjKSxoPTAsbz11PWE9Yz10fSxiLmZsdXNoPWZ1bmN0aW9uIHcoKXtyZXR1cm4gYz09PXQ/bDp2KFlhKCkpfSxifXZhciBRYT1tcigoZnVuY3Rpb24odCxlKXtyZXR1cm4gbGkodCwxLGUpfSkpLHRzPW1yKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIGxpKHQsanMoZSl8fDAsbil9KSk7ZnVuY3Rpb24gZXModCxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8bnVsbCE9biYmImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEN0KGUpO3ZhciBpPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLHI9bj9uLmFwcGx5KHRoaXMsZSk6ZVswXSxvPWkuY2FjaGU7aWYoby5oYXMocikpcmV0dXJuIG8uZ2V0KHIpO3ZhciBhPXQuYXBwbHkodGhpcyxlKTtyZXR1cm4gaS5jYWNoZT1vLnNldChyLGEpfHxvLGF9O3JldHVybiBpLmNhY2hlPW5ldyhlcy5DYWNoZXx8V24pLGl9ZnVuY3Rpb24gbnModCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEN0KGUpO3JldHVybiBmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4hdC5jYWxsKHRoaXMpO2Nhc2UgMTpyZXR1cm4hdC5jYWxsKHRoaXMsZVswXSk7Y2FzZSAyOnJldHVybiF0LmNhbGwodGhpcyxlWzBdLGVbMV0pO2Nhc2UgMzpyZXR1cm4hdC5jYWxsKHRoaXMsZVswXSxlWzFdLGVbMl0pfXJldHVybiF0LmFwcGx5KHRoaXMsZSl9fWVzLkNhY2hlPVduO3ZhciBpcz1IcigoZnVuY3Rpb24odCxlKXt2YXIgbj0oZT0xPT1lLmxlbmd0aCYmaHMoZVswXSk/TWUoZVswXSxVZShBbygpKSk6TWUoRGkoZSwxKSxVZShBbygpKSkpLmxlbmd0aDtyZXR1cm4gbXIoKGZ1bmN0aW9uKGkpe2Zvcih2YXIgcj0tMSxvPV9uKGkubGVuZ3RoLG4pOysrcjxvOylpW3JdPWVbcl0uY2FsbCh0aGlzLGlbcl0pO3JldHVybiBwZSh0LHRoaXMsaSl9KSl9KSkscnM9bXIoKGZ1bmN0aW9uKGUsbil7dmFyIGk9dG4obixDbyhycykpO3JldHVybiBfbyhlLHIsdCxuLGkpfSkpLG9zPW1yKChmdW5jdGlvbihlLG4pe3ZhciBpPXRuKG4sQ28ob3MpKTtyZXR1cm4gX28oZSw2NCx0LG4saSl9KSksYXM9d28oKGZ1bmN0aW9uKGUsbil7cmV0dXJuIF9vKGUsMjU2LHQsdCx0LG4pfSkpO2Z1bmN0aW9uIHNzKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfXZhciBscz1obyhxaSksY3M9aG8oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+PWV9KSksdXM9WmkoKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30pKCkpP1ppOmZ1bmN0aW9uKHQpe3JldHVybiBNcyh0KSYmTnQuY2FsbCh0LCJjYWxsZWUiKSYmIW5lLmNhbGwodCwiY2FsbGVlIil9LGhzPXZ0LmlzQXJyYXksZHM9c2U/VWUoc2UpOmZ1bmN0aW9uIHBzKHQpe3JldHVybiBNcyh0KSYmV2kodCk9PUN9O2Z1bmN0aW9uIGZzKHQpe3JldHVybiBudWxsIT10JiZ3cyh0Lmxlbmd0aCkmJiFicyh0KX1mdW5jdGlvbiBtcyh0KXtyZXR1cm4gTXModCkmJmZzKHQpfXZhciBncz1kbnx8amwsX3M9bGU/VWUobGUpOmZ1bmN0aW9uIHlzKHQpe3JldHVybiBNcyh0KSYmV2kodCk9PWZ9O2Z1bmN0aW9uIHZzKHQpe2lmKCFNcyh0KSlyZXR1cm4hMTt2YXIgZT1XaSh0KTtyZXR1cm4gZT09bXx8IltvYmplY3QgRE9NRXhjZXB0aW9uXSI9PWV8fCJzdHJpbmciPT10eXBlb2YgdC5tZXNzYWdlJiYic3RyaW5nIj09dHlwZW9mIHQubmFtZSYmIUFzKHQpfWZ1bmN0aW9uIGJzKHQpe2lmKCFTcyh0KSlyZXR1cm4hMTt2YXIgZT1XaSh0KTtyZXR1cm4gZT09Z3x8ZT09X3x8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBQcm94eV0iPT1lfWZ1bmN0aW9uIHhzKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmdD09VnModCl9ZnVuY3Rpb24gd3ModCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0Pi0xJiZ0JTE9PTAmJnQ8PXN9ZnVuY3Rpb24gU3ModCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9ZnVuY3Rpb24gTXModCl7cmV0dXJuIG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdH12YXIgRXM9Y2U/VWUoY2UpOmZ1bmN0aW9uIFRzKHQpe3JldHVybiBNcyh0KSYmUm8odCk9PXl9O2Z1bmN0aW9uIENzKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdHx8TXModCkmJldpKHQpPT12fWZ1bmN0aW9uIEFzKHQpe2lmKCFNcyh0KXx8V2kodCkhPWIpcmV0dXJuITE7dmFyIGU9UXQodCk7aWYobnVsbD09PWUpcmV0dXJuITA7dmFyIG49TnQuY2FsbChlLCJjb25zdHJ1Y3RvciIpJiZlLmNvbnN0cnVjdG9yO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuJiZuIGluc3RhbmNlb2YgbiYmUHQuY2FsbChuKT09enR9dmFyIGtzPXVlP1VlKHVlKTpmdW5jdGlvbiBMcyh0KXtyZXR1cm4gTXModCkmJldpKHQpPT13fSxQcz1oZT9VZShoZSk6ZnVuY3Rpb24gTnModCl7cmV0dXJuIE1zKHQpJiZSbyh0KT09U307ZnVuY3Rpb24gSXModCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHwhaHModCkmJk1zKHQpJiZXaSh0KT09TX1mdW5jdGlvbiBScyh0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR8fE1zKHQpJiZXaSh0KT09RX12YXIgT3M9ZGU/VWUoZGUpOmZ1bmN0aW9uIHpzKHQpe3JldHVybiBNcyh0KSYmd3ModC5sZW5ndGgpJiYhIVh0W1dpKHQpXX0sRHM9aG8oaXIpLEJzPWhvKChmdW5jdGlvbih0LGUpe3JldHVybiB0PD1lfSkpO2Z1bmN0aW9uIEhzKHQpe2lmKCF0KXJldHVybltdO2lmKGZzKHQpKXJldHVybiBJcyh0KT9vbih0KTpYcih0KTtpZihhZSYmdFthZV0pcmV0dXJuKGZ1bmN0aW9uIGUodCl7Zm9yKHZhciBlLG49W107IShlPXQubmV4dCgpKS5kb25lOyluLnB1c2goZS52YWx1ZSk7cmV0dXJuIG59KSh0W2FlXSgpKTt2YXIgbj1Sbyh0KTtyZXR1cm4obj09eT9KZTpuPT1TP2VuOnBsKSh0KX1mdW5jdGlvbiBGcyh0KXtyZXR1cm4gdD8odD1qcyh0KSk9PT1hfHx0PT09LTEvMD8xNzk3NjkzMTM0ODYyMzE1N2UyOTIqKHQ8MD8tMToxKTp0PT10P3Q6MDowPT09dD90OjB9ZnVuY3Rpb24gVnModCl7dmFyIGU9RnModCksbj1lJTE7cmV0dXJuIGU9PWU/bj9lLW46ZTowfWZ1bmN0aW9uIFVzKHQpe3JldHVybiB0P29pKFZzKHQpLDAsYyk6MH1mdW5jdGlvbiBqcyh0KXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYoUnModCkpcmV0dXJuIGw7aWYoU3ModCkpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2Y/dC52YWx1ZU9mKCk6dDt0PVNzKGUpP2UrIiI6ZX1pZigic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIDA9PT10P3Q6K3Q7dD1WZSh0KTt2YXIgbj11dC50ZXN0KHQpO3JldHVybiBufHxkdC50ZXN0KHQpP0p0KHQuc2xpY2UoMiksbj8yOjgpOmN0LnRlc3QodCk/bDordH1mdW5jdGlvbiBHcyh0KXtyZXR1cm4gJHIodCxvbCh0KSl9ZnVuY3Rpb24gV3ModCl7cmV0dXJuIG51bGw9PXQ/IiI6QXIodCl9dmFyIHFzPVpyKChmdW5jdGlvbih0LGUpe2lmKGpvKGUpfHxmcyhlKSkkcihlLHJsKGUpLHQpO2Vsc2UgZm9yKHZhciBuIGluIGUpTnQuY2FsbChlLG4pJiZRbih0LG4sZVtuXSl9KSksWXM9WnIoKGZ1bmN0aW9uKHQsZSl7JHIoZSxvbChlKSx0KX0pKSxYcz1acigoZnVuY3Rpb24odCxlLG4saSl7JHIoZSxvbChlKSx0LGkpfSkpLCRzPVpyKChmdW5jdGlvbih0LGUsbixpKXskcihlLHJsKGUpLHQsaSl9KSksS3M9d28ocmkpLFpzPW1yKChmdW5jdGlvbihlLG4pe2U9TXQoZSk7dmFyIGk9LTEscj1uLmxlbmd0aCxvPXI+Mj9uWzJdOnQ7Zm9yKG8mJkhvKG5bMF0sblsxXSxvKSYmKHI9MSk7KytpPHI7KWZvcih2YXIgYT1uW2ldLHM9b2woYSksbD0tMSxjPXMubGVuZ3RoOysrbDxjOyl7dmFyIHU9c1tsXSxoPWVbdV07KGg9PT10fHxzcyhoLGt0W3VdKSYmIU50LmNhbGwoZSx1KSkmJihlW3VdPWFbdV0pfXJldHVybiBlfSkpLEpzPW1yKChmdW5jdGlvbihlKXtyZXR1cm4gZS5wdXNoKHQsdm8pLHBlKHNsLHQsZSl9KSk7ZnVuY3Rpb24gUXMoZSxuLGkpe3ZhciByPW51bGw9PWU/dDpqaShlLG4pO3JldHVybiByPT09dD9pOnJ9ZnVuY3Rpb24gdGwodCxlKXtyZXR1cm4gbnVsbCE9dCYmT28odCxlLFhpKX12YXIgZWw9YW8oKGZ1bmN0aW9uKHQsZSxuKXtudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZS50b1N0cmluZyYmKGU9T3QuY2FsbChlKSksdFtlXT1ufSksQ2woTGwpKSxubD1hbygoZnVuY3Rpb24odCxlLG4pe251bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlLnRvU3RyaW5nJiYoZT1PdC5jYWxsKGUpKSxOdC5jYWxsKHQsZSk/dFtlXS5wdXNoKG4pOnRbZV09W25dfSksQW8pLGlsPW1yKEtpKTtmdW5jdGlvbiBybCh0KXtyZXR1cm4gZnModCk/WG4odCk6bnIodCl9ZnVuY3Rpb24gb2wodCl7cmV0dXJuIGZzKHQpP1huKHQsITApOihmdW5jdGlvbiBlKHQpe2lmKCFTcyh0KSlyZXR1cm4oZnVuY3Rpb24gZSh0KXt2YXIgZT1bXTtpZihudWxsIT10KWZvcih2YXIgbiBpbiBNdCh0KSllLnB1c2gobik7cmV0dXJuIGV9KSh0KTt2YXIgbj1qbyh0KSxpPVtdO2Zvcih2YXIgciBpbiB0KSgiY29uc3RydWN0b3IiIT1yfHwhbiYmTnQuY2FsbCh0LHIpKSYmaS5wdXNoKHIpO3JldHVybiBpfSkodCl9dmFyIGFsPVpyKChmdW5jdGlvbih0LGUsbil7c3IodCxlLG4pfSkpLHNsPVpyKChmdW5jdGlvbih0LGUsbixpKXtzcih0LGUsbixpKX0pKSxsbD13bygoZnVuY3Rpb24odCxlKXt2YXIgbj17fTtpZihudWxsPT10KXJldHVybiBuO3ZhciBpPSExO2U9TWUoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGU9QnIoZSx0KSxpfHwoaT1lLmxlbmd0aD4xKSxlfSkpLCRyKHQsTW8odCksbiksaSYmKG49YWkobiw3LGJvKSk7Zm9yKHZhciByPWUubGVuZ3RoO3ItLTspTHIobixlW3JdKTtyZXR1cm4gbn0pKSxjbD13bygoZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD97fTooZnVuY3Rpb24gbih0LGUpe3JldHVybiB1cih0LGUsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIHRsKHQsbil9KSl9KSh0LGUpfSkpO2Z1bmN0aW9uIHVsKHQsZSl7aWYobnVsbD09dClyZXR1cm57fTt2YXIgbj1NZShNbyh0KSwoZnVuY3Rpb24odCl7cmV0dXJuW3RdfSkpO3JldHVybiBlPUFvKGUpLHVyKHQsbiwoZnVuY3Rpb24odCxuKXtyZXR1cm4gZSh0LG5bMF0pfSkpfXZhciBobD1nbyhybCksZGw9Z28ob2wpO2Z1bmN0aW9uIHBsKHQpe3JldHVybiBudWxsPT10P1tdOmplKHQscmwodCkpfXZhciBmbD1lbygoZnVuY3Rpb24odCxlLG4pe3JldHVybiBlPWUudG9Mb3dlckNhc2UoKSx0KyhuP21sKGUpOmUpfSkpO2Z1bmN0aW9uIG1sKHQpe3JldHVybiBTbChXcyh0KS50b0xvd2VyQ2FzZSgpKX1mdW5jdGlvbiBnbCh0KXtyZXR1cm4odD1Xcyh0KSkmJnQucmVwbGFjZShmdCxYZSkucmVwbGFjZShWdCwiIil9dmFyIF9sPWVvKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQrKG4/Ii0iOiIiKStlLnRvTG93ZXJDYXNlKCl9KSkseWw9ZW8oKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdCsobj8iICI6IiIpK2UudG9Mb3dlckNhc2UoKX0pKSx2bD10bygidG9Mb3dlckNhc2UiKSxibD1lbygoZnVuY3Rpb24odCxlLG4pe3JldHVybiB0KyhuPyJfIjoiIikrZS50b0xvd2VyQ2FzZSgpfSkpLHhsPWVvKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQrKG4/IiAiOiIiKStTbChlKX0pKSx3bD1lbygoZnVuY3Rpb24odCxlLG4pe3JldHVybiB0KyhuPyIgIjoiIikrZS50b1VwcGVyQ2FzZSgpfSkpLFNsPXRvKCJ0b1VwcGVyQ2FzZSIpO2Z1bmN0aW9uIE1sKGUsbixpKXtyZXR1cm4gZT1XcyhlKSwobj1pP3Q6bik9PT10PyhmdW5jdGlvbiByKHQpe3JldHVybiBXdC50ZXN0KHQpfSkoZSk/KGZ1bmN0aW9uIG8odCl7cmV0dXJuIHQubWF0Y2goanQpfHxbXX0pKGUpOihmdW5jdGlvbiBhKHQpe3JldHVybiB0Lm1hdGNoKHJ0KXx8W119KShlKTplLm1hdGNoKG4pfHxbXX12YXIgRWw9bXIoKGZ1bmN0aW9uKGUsbil7dHJ5e3JldHVybiBwZShlLHQsbil9Y2F0Y2godCl7cmV0dXJuIHZzKHQpP3Q6bmV3IHh0KHQpfX0pKSxUbD13bygoZnVuY3Rpb24odCxlKXtyZXR1cm4gbWUoZSwoZnVuY3Rpb24oZSl7ZT1yYShlKSxpaSh0LGUsS2EodFtlXSx0KSl9KSksdH0pKTtmdW5jdGlvbiBDbCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19dmFyIEFsPXJvKCksa2w9cm8oITApO2Z1bmN0aW9uIExsKHQpe3JldHVybiB0fWZ1bmN0aW9uIFBsKHQpe3JldHVybiBlcigiZnVuY3Rpb24iPT10eXBlb2YgdD90OmFpKHQsMSkpfXZhciBObD1tcigoZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIEtpKG4sdCxlKX19KSksSWw9bXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBLaSh0LG4sZSl9fSkpO2Z1bmN0aW9uIFJsKHQsZSxuKXt2YXIgaT1ybChlKSxyPVVpKGUsaSk7bnVsbCE9bnx8U3MoZSkmJihyLmxlbmd0aHx8IWkubGVuZ3RoKXx8KG49ZSxlPXQsdD10aGlzLHI9VWkoZSxybChlKSkpO3ZhciBvPSEoU3MobikmJiJjaGFpbiJpbiBuJiYhbi5jaGFpbiksYT1icyh0KTtyZXR1cm4gbWUociwoZnVuY3Rpb24obil7dmFyIGk9ZVtuXTt0W25dPWksYSYmKHQucHJvdG90eXBlW25dPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fX2NoYWluX187aWYob3x8ZSl7dmFyIG49dCh0aGlzLl9fd3JhcHBlZF9fKSxyPW4uX19hY3Rpb25zX189WHIodGhpcy5fX2FjdGlvbnNfXyk7cmV0dXJuIHIucHVzaCh7ZnVuYzppLGFyZ3M6YXJndW1lbnRzLHRoaXNBcmc6dH0pLG4uX19jaGFpbl9fPWUsbn1yZXR1cm4gaS5hcHBseSh0LEVlKFt0aGlzLnZhbHVlKCldLGFyZ3VtZW50cykpfSl9KSksdH1mdW5jdGlvbiBPbCgpe312YXIgemw9bG8oTWUpLERsPWxvKF9lKSxCbD1sbyhBZSk7ZnVuY3Rpb24gSGwodCl7cmV0dXJuIEZvKHQpP3plKHJhKHQpKTooZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGppKGUsdCl9fSkodCl9dmFyIEZsPXVvKCksVmw9dW8oITApO2Z1bmN0aW9uIFVsKCl7cmV0dXJuW119ZnVuY3Rpb24gamwoKXtyZXR1cm4hMX12YXIgR2wsV2w9c28oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZX0pLDApLHFsPWZvKCJjZWlsIiksWWw9c28oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQvZX0pLDEpLFhsPWZvKCJmbG9vciIpLCRsPXNvKChmdW5jdGlvbih0LGUpe3JldHVybiB0KmV9KSwxKSxLbD1mbygicm91bmQiKSxabD1zbygoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC1lfSksMCk7cmV0dXJuIEJuLmFmdGVyPWZ1bmN0aW9uIEpsKHQsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEN0KGUpO3JldHVybiB0PVZzKHQpLGZ1bmN0aW9uKCl7aWYoLS10PDEpcmV0dXJuIG4uYXBwbHkodGhpcyxhcmd1bWVudHMpfX0sQm4uYXJ5PVhhLEJuLmFzc2lnbj1xcyxCbi5hc3NpZ25Jbj1ZcyxCbi5hc3NpZ25JbldpdGg9WHMsQm4uYXNzaWduV2l0aD0kcyxCbi5hdD1LcyxCbi5iZWZvcmU9JGEsQm4uYmluZD1LYSxCbi5iaW5kQWxsPVRsLEJuLmJpbmRLZXk9WmEsQm4uY2FzdEFycmF5PWZ1bmN0aW9uIFFsKCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW107dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBocyh0KT90Olt0XX0sQm4uY2hhaW49SWEsQm4uY2h1bms9ZnVuY3Rpb24gdGMoZSxuLGkpe249KGk/SG8oZSxuLGkpOm49PT10KT8xOmduKFZzKG4pLDApO3ZhciByPW51bGw9PWU/MDplLmxlbmd0aDtpZighcnx8bjwxKXJldHVybltdO2Zvcih2YXIgbz0wLGE9MCxzPXZ0KGNuKHIvbikpO288cjspc1thKytdPXdyKGUsbyxvKz1uKTtyZXR1cm4gc30sQm4uY29tcGFjdD1mdW5jdGlvbiBlYyh0KXtmb3IodmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGgsaT0wLHI9W107KytlPG47KXt2YXIgbz10W2VdO28mJihyW2krK109byl9cmV0dXJuIHJ9LEJuLmNvbmNhdD1mdW5jdGlvbiBuYygpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg7aWYoIXQpcmV0dXJuW107Zm9yKHZhciBlPXZ0KHQtMSksbj1hcmd1bWVudHNbMF0saT10O2ktLTspZVtpLTFdPWFyZ3VtZW50c1tpXTtyZXR1cm4gRWUoaHMobik/WHIobik6W25dLERpKGUsMSkpfSxCbi5jb25kPWZ1bmN0aW9uIGljKHQpe3ZhciBuPW51bGw9PXQ/MDp0Lmxlbmd0aCxpPUFvKCk7cmV0dXJuIHQ9bj9NZSh0LChmdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdFsxXSl0aHJvdyBuZXcgQ3QoZSk7cmV0dXJuW2kodFswXSksdFsxXV19KSk6W10sbXIoKGZ1bmN0aW9uKGUpe2Zvcih2YXIgaT0tMTsrK2k8bjspe3ZhciByPXRbaV07aWYocGUoclswXSx0aGlzLGUpKXJldHVybiBwZShyWzFdLHRoaXMsZSl9fSkpfSxCbi5jb25mb3Jtcz1mdW5jdGlvbiByYyh0KXtyZXR1cm4oZnVuY3Rpb24gZSh0KXt2YXIgZT1ybCh0KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHNpKG4sdCxlKX19KShhaSh0LDEpKX0sQm4uY29uc3RhbnQ9Q2wsQm4uY291bnRCeT16YSxCbi5jcmVhdGU9ZnVuY3Rpb24gb2ModCxlKXt2YXIgbj1Ibih0KTtyZXR1cm4gbnVsbD09ZT9uOm5pKG4sZSl9LEJuLmN1cnJ5PWZ1bmN0aW9uIGUobixpLHIpe3ZhciBvPV9vKG4sOCx0LHQsdCx0LHQsaT1yP3Q6aSk7cmV0dXJuIG8ucGxhY2Vob2xkZXI9ZS5wbGFjZWhvbGRlcixvfSxCbi5jdXJyeVJpZ2h0PWZ1bmN0aW9uIGUobixpLHIpe3ZhciBvPV9vKG4sMTYsdCx0LHQsdCx0LGk9cj90OmkpO3JldHVybiBvLnBsYWNlaG9sZGVyPWUucGxhY2Vob2xkZXIsb30sQm4uZGVib3VuY2U9SmEsQm4uZGVmYXVsdHM9WnMsQm4uZGVmYXVsdHNEZWVwPUpzLEJuLmRlZmVyPVFhLEJuLmRlbGF5PXRzLEJuLmRpZmZlcmVuY2U9c2EsQm4uZGlmZmVyZW5jZUJ5PWxhLEJuLmRpZmZlcmVuY2VXaXRoPWNhLEJuLmRyb3A9ZnVuY3Rpb24gYWMoZSxuLGkpe3ZhciByPW51bGw9PWU/MDplLmxlbmd0aDtyZXR1cm4gcj93cihlLChuPWl8fG49PT10PzE6VnMobikpPDA/MDpuLHIpOltdfSxCbi5kcm9wUmlnaHQ9ZnVuY3Rpb24gc2MoZSxuLGkpe3ZhciByPW51bGw9PWU/MDplLmxlbmd0aDtyZXR1cm4gcj93cihlLDAsKG49ci0obj1pfHxuPT09dD8xOlZzKG4pKSk8MD8wOm4pOltdfSxCbi5kcm9wUmlnaHRXaGlsZT1mdW5jdGlvbiBsYyh0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9Ocih0LEFvKGUsMyksITAsITApOltdfSxCbi5kcm9wV2hpbGU9ZnVuY3Rpb24gY2ModCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/TnIodCxBbyhlLDMpLCEwKTpbXX0sQm4uZmlsbD1mdW5jdGlvbiB1YyhlLG4saSxyKXt2YXIgbz1udWxsPT1lPzA6ZS5sZW5ndGg7cmV0dXJuIG8/KGkmJiJudW1iZXIiIT10eXBlb2YgaSYmSG8oZSxuLGkpJiYoaT0wLHI9byksKGZ1bmN0aW9uIGEoZSxuLGkscil7dmFyIG89ZS5sZW5ndGg7Zm9yKChpPVZzKGkpKTwwJiYoaT0taT5vPzA6bytpKSwocj1yPT09dHx8cj5vP286VnMocikpPDAmJihyKz1vKSxyPWk+cj8wOlVzKHIpO2k8cjspZVtpKytdPW47cmV0dXJuIGV9KShlLG4saSxyKSk6W119LEJuLmZpbHRlcj1mdW5jdGlvbiBoYyh0LGUpe3JldHVybihocyh0KT95ZTp6aSkodCxBbyhlLDMpKX0sQm4uZmxhdE1hcD1mdW5jdGlvbiBkYyh0LGUpe3JldHVybiBEaShHYSh0LGUpLDEpfSxCbi5mbGF0TWFwRGVlcD1mdW5jdGlvbiBwYyh0LGUpe3JldHVybiBEaShHYSh0LGUpLGEpfSxCbi5mbGF0TWFwRGVwdGg9ZnVuY3Rpb24gZmMoZSxuLGkpe3JldHVybiBpPWk9PT10PzE6VnMoaSksRGkoR2EoZSxuKSxpKX0sQm4uZmxhdHRlbj1kYSxCbi5mbGF0dGVuRGVlcD1mdW5jdGlvbiBtYyh0KXtyZXR1cm4gbnVsbCE9dCYmdC5sZW5ndGg/RGkodCxhKTpbXX0sQm4uZmxhdHRlbkRlcHRoPWZ1bmN0aW9uIGdjKGUsbil7cmV0dXJuIG51bGwhPWUmJmUubGVuZ3RoP0RpKGUsbj1uPT09dD8xOlZzKG4pKTpbXX0sQm4uZmxpcD1mdW5jdGlvbiBfYyh0KXtyZXR1cm4gX28odCw1MTIpfSxCbi5mbG93PUFsLEJuLmZsb3dSaWdodD1rbCxCbi5mcm9tUGFpcnM9ZnVuY3Rpb24geWModCl7Zm9yKHZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoLGk9e307KytlPG47KXt2YXIgcj10W2VdO2lbclswXV09clsxXX1yZXR1cm4gaX0sQm4uZnVuY3Rpb25zPWZ1bmN0aW9uIHZjKHQpe3JldHVybiBudWxsPT10P1tdOlVpKHQscmwodCkpfSxCbi5mdW5jdGlvbnNJbj1mdW5jdGlvbiBiYyh0KXtyZXR1cm4gbnVsbD09dD9bXTpVaSh0LG9sKHQpKX0sQm4uZ3JvdXBCeT1WYSxCbi5pbml0aWFsPWZ1bmN0aW9uIHhjKHQpe3JldHVybiBudWxsIT10JiZ0Lmxlbmd0aD93cih0LDAsLTEpOltdfSxCbi5pbnRlcnNlY3Rpb249ZmEsQm4uaW50ZXJzZWN0aW9uQnk9bWEsQm4uaW50ZXJzZWN0aW9uV2l0aD1nYSxCbi5pbnZlcnQ9ZWwsQm4uaW52ZXJ0Qnk9bmwsQm4uaW52b2tlTWFwPVVhLEJuLml0ZXJhdGVlPVBsLEJuLmtleUJ5PWphLEJuLmtleXM9cmwsQm4ua2V5c0luPW9sLEJuLm1hcD1HYSxCbi5tYXBLZXlzPWZ1bmN0aW9uIHdjKHQsZSl7dmFyIG49e307cmV0dXJuIGU9QW8oZSwzKSxGaSh0LChmdW5jdGlvbih0LGkscil7aWkobixlKHQsaSxyKSx0KX0pKSxufSxCbi5tYXBWYWx1ZXM9ZnVuY3Rpb24gU2ModCxlKXt2YXIgbj17fTtyZXR1cm4gZT1BbyhlLDMpLEZpKHQsKGZ1bmN0aW9uKHQsaSxyKXtpaShuLGksZSh0LGkscikpfSkpLG59LEJuLm1hdGNoZXM9ZnVuY3Rpb24gTWModCl7cmV0dXJuIG9yKGFpKHQsMSkpfSxCbi5tYXRjaGVzUHJvcGVydHk9ZnVuY3Rpb24gRWModCxlKXtyZXR1cm4gYXIodCxhaShlLDEpKX0sQm4ubWVtb2l6ZT1lcyxCbi5tZXJnZT1hbCxCbi5tZXJnZVdpdGg9c2wsQm4ubWV0aG9kPU5sLEJuLm1ldGhvZE9mPUlsLEJuLm1peGluPVJsLEJuLm5lZ2F0ZT1ucyxCbi5udGhBcmc9ZnVuY3Rpb24gVGModCl7cmV0dXJuIHQ9VnModCksbXIoKGZ1bmN0aW9uKGUpe3JldHVybiBscihlLHQpfSkpfSxCbi5vbWl0PWxsLEJuLm9taXRCeT1mdW5jdGlvbiBDYyh0LGUpe3JldHVybiB1bCh0LG5zKEFvKGUpKSl9LEJuLm9uY2U9ZnVuY3Rpb24gQWModCl7cmV0dXJuICRhKDIsdCl9LEJuLm9yZGVyQnk9ZnVuY3Rpb24ga2MoZSxuLGkscil7cmV0dXJuIG51bGw9PWU/W106KGhzKG4pfHwobj1udWxsPT1uP1tdOltuXSksaHMoaT1yP3Q6aSl8fChpPW51bGw9PWk/W106W2ldKSxjcihlLG4saSkpfSxCbi5vdmVyPXpsLEJuLm92ZXJBcmdzPWlzLEJuLm92ZXJFdmVyeT1EbCxCbi5vdmVyU29tZT1CbCxCbi5wYXJ0aWFsPXJzLEJuLnBhcnRpYWxSaWdodD1vcyxCbi5wYXJ0aXRpb249V2EsQm4ucGljaz1jbCxCbi5waWNrQnk9dWwsQm4ucHJvcGVydHk9SGwsQm4ucHJvcGVydHlPZj1mdW5jdGlvbiBMYyhlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG51bGw9PWU/dDpqaShlLG4pfX0sQm4ucHVsbD15YSxCbi5wdWxsQWxsPXZhLEJuLnB1bGxBbGxCeT1mdW5jdGlvbiBQYyh0LGUsbil7cmV0dXJuIHQmJnQubGVuZ3RoJiZlJiZlLmxlbmd0aD9ocih0LGUsQW8obiwyKSk6dH0sQm4ucHVsbEFsbFdpdGg9ZnVuY3Rpb24gTmMoZSxuLGkpe3JldHVybiBlJiZlLmxlbmd0aCYmbiYmbi5sZW5ndGg/aHIoZSxuLHQsaSk6ZX0sQm4ucHVsbEF0PWJhLEJuLnJhbmdlPUZsLEJuLnJhbmdlUmlnaHQ9VmwsQm4ucmVhcmc9YXMsQm4ucmVqZWN0PWZ1bmN0aW9uIEljKHQsZSl7cmV0dXJuKGhzKHQpP3llOnppKSh0LG5zKEFvKGUsMykpKX0sQm4ucmVtb3ZlPWZ1bmN0aW9uIFJjKHQsZSl7dmFyIG49W107aWYoIXR8fCF0Lmxlbmd0aClyZXR1cm4gbjt2YXIgaT0tMSxyPVtdLG89dC5sZW5ndGg7Zm9yKGU9QW8oZSwzKTsrK2k8bzspe3ZhciBhPXRbaV07ZShhLGksdCkmJihuLnB1c2goYSksci5wdXNoKGkpKX1yZXR1cm4gZHIodCxyKSxufSxCbi5yZXN0PWZ1bmN0aW9uIE9jKG4saSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEN0KGUpO3JldHVybiBtcihuLGk9aT09PXQ/aTpWcyhpKSl9LEJuLnJldmVyc2U9eGEsQm4uc2FtcGxlU2l6ZT1mdW5jdGlvbiB6YyhlLG4saSl7cmV0dXJuIG49KGk/SG8oZSxuLGkpOm49PT10KT8xOlZzKG4pLChocyhlKT9LbjpfcikoZSxuKX0sQm4uc2V0PWZ1bmN0aW9uIERjKHQsZSxuKXtyZXR1cm4gbnVsbD09dD90OnlyKHQsZSxuKX0sQm4uc2V0V2l0aD1mdW5jdGlvbiBCYyhlLG4saSxyKXtyZXR1cm4gcj0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yOnQsbnVsbD09ZT9lOnlyKGUsbixpLHIpfSxCbi5zaHVmZmxlPWZ1bmN0aW9uIEhjKHQpe3JldHVybihocyh0KT9abjp4cikodCl9LEJuLnNsaWNlPWZ1bmN0aW9uIEZjKGUsbixpKXt2YXIgcj1udWxsPT1lPzA6ZS5sZW5ndGg7cmV0dXJuIHI/KGkmJiJudW1iZXIiIT10eXBlb2YgaSYmSG8oZSxuLGkpPyhuPTAsaT1yKToobj1udWxsPT1uPzA6VnMobiksaT1pPT09dD9yOlZzKGkpKSx3cihlLG4saSkpOltdfSxCbi5zb3J0Qnk9cWEsQm4uc29ydGVkVW5pcT1mdW5jdGlvbiBWYyh0KXtyZXR1cm4gdCYmdC5sZW5ndGg/VHIodCk6W119LEJuLnNvcnRlZFVuaXFCeT1mdW5jdGlvbiBVYyh0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9Ucih0LEFvKGUsMikpOltdfSxCbi5zcGxpdD1mdW5jdGlvbiBqYyhlLG4saSl7cmV0dXJuIGkmJiJudW1iZXIiIT10eXBlb2YgaSYmSG8oZSxuLGkpJiYobj1pPXQpLChpPWk9PT10P2M6aT4+PjApPyhlPVdzKGUpKSYmKCJzdHJpbmciPT10eXBlb2Ygbnx8bnVsbCE9biYmIWtzKG4pKSYmIShuPUFyKG4pKSYmWmUoZSk/RnIob24oZSksMCxpKTplLnNwbGl0KG4saSk6W119LEJuLnNwcmVhZD1mdW5jdGlvbiBHYyh0LG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBDdChlKTtyZXR1cm4gbj1udWxsPT1uPzA6Z24oVnMobiksMCksbXIoKGZ1bmN0aW9uKGUpe3ZhciBpPWVbbl0scj1GcihlLDAsbik7cmV0dXJuIGkmJkVlKHIsaSkscGUodCx0aGlzLHIpfSkpfSxCbi50YWlsPWZ1bmN0aW9uIFdjKHQpe3ZhciBlPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gZT93cih0LDEsZSk6W119LEJuLnRha2U9ZnVuY3Rpb24gcWMoZSxuLGkpe3JldHVybiBlJiZlLmxlbmd0aD93cihlLDAsKG49aXx8bj09PXQ/MTpWcyhuKSk8MD8wOm4pOltdfSxCbi50YWtlUmlnaHQ9ZnVuY3Rpb24gWWMoZSxuLGkpe3ZhciByPW51bGw9PWU/MDplLmxlbmd0aDtyZXR1cm4gcj93cihlLChuPXItKG49aXx8bj09PXQ/MTpWcyhuKSkpPDA/MDpuLHIpOltdfSxCbi50YWtlUmlnaHRXaGlsZT1mdW5jdGlvbiBYYyh0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9Ocih0LEFvKGUsMyksITEsITApOltdfSxCbi50YWtlV2hpbGU9ZnVuY3Rpb24gJGModCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/TnIodCxBbyhlLDMpKTpbXX0sQm4udGFwPWZ1bmN0aW9uIEtjKHQsZSl7cmV0dXJuIGUodCksdH0sQm4udGhyb3R0bGU9ZnVuY3Rpb24gWmModCxuLGkpe3ZhciByPSEwLG89ITA7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEN0KGUpO3JldHVybiBTcyhpKSYmKHI9ImxlYWRpbmciaW4gaT8hIWkubGVhZGluZzpyLG89InRyYWlsaW5nImluIGk/ISFpLnRyYWlsaW5nOm8pLEphKHQsbix7bGVhZGluZzpyLG1heFdhaXQ6bix0cmFpbGluZzpvfSl9LEJuLnRocnU9UmEsQm4udG9BcnJheT1IcyxCbi50b1BhaXJzPWhsLEJuLnRvUGFpcnNJbj1kbCxCbi50b1BhdGg9ZnVuY3Rpb24gSmModCl7cmV0dXJuIGhzKHQpP01lKHQscmEpOlJzKHQpP1t0XTpYcihuYShXcyh0KSkpfSxCbi50b1BsYWluT2JqZWN0PUdzLEJuLnRyYW5zZm9ybT1mdW5jdGlvbiBRYyh0LGUsbil7dmFyIGk9aHModCkscj1pfHxncyh0KXx8T3ModCk7aWYoZT1BbyhlLDQpLG51bGw9PW4pe3ZhciBvPXQmJnQuY29uc3RydWN0b3I7bj1yP2k/bmV3IG86W106U3ModCkmJmJzKG8pP0huKFF0KHQpKTp7fX1yZXR1cm4ocj9tZTpGaSkodCwoZnVuY3Rpb24odCxpLHIpe3JldHVybiBlKG4sdCxpLHIpfSkpLG59LEJuLnVuYXJ5PWZ1bmN0aW9uIHR1KHQpe3JldHVybiBYYSh0LDEpfSxCbi51bmlvbj13YSxCbi51bmlvbkJ5PVNhLEJuLnVuaW9uV2l0aD1NYSxCbi51bmlxPWZ1bmN0aW9uIGV1KHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9rcih0KTpbXX0sQm4udW5pcUJ5PWZ1bmN0aW9uIG51KHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP2tyKHQsQW8oZSwyKSk6W119LEJuLnVuaXFXaXRoPWZ1bmN0aW9uIGl1KGUsbil7cmV0dXJuIG49ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp0LGUmJmUubGVuZ3RoP2tyKGUsdCxuKTpbXX0sQm4udW5zZXQ9ZnVuY3Rpb24gcnUodCxlKXtyZXR1cm4gbnVsbD09dHx8THIodCxlKX0sQm4udW56aXA9RWEsQm4udW56aXBXaXRoPVRhLEJuLnVwZGF0ZT1mdW5jdGlvbiBvdSh0LGUsbil7cmV0dXJuIG51bGw9PXQ/dDpQcih0LGUsRHIobikpfSxCbi51cGRhdGVXaXRoPWZ1bmN0aW9uIGF1KGUsbixpLHIpe3JldHVybiByPSJmdW5jdGlvbiI9PXR5cGVvZiByP3I6dCxudWxsPT1lP2U6UHIoZSxuLERyKGkpLHIpfSxCbi52YWx1ZXM9cGwsQm4udmFsdWVzSW49ZnVuY3Rpb24gc3UodCl7cmV0dXJuIG51bGw9PXQ/W106amUodCxvbCh0KSl9LEJuLndpdGhvdXQ9Q2EsQm4ud29yZHM9TWwsQm4ud3JhcD1mdW5jdGlvbiBsdSh0LGUpe3JldHVybiBycyhEcihlKSx0KX0sQm4ueG9yPUFhLEJuLnhvckJ5PWthLEJuLnhvcldpdGg9TGEsQm4uemlwPVBhLEJuLnppcE9iamVjdD1mdW5jdGlvbiBjdSh0LGUpe3JldHVybiBPcih0fHxbXSxlfHxbXSxRbil9LEJuLnppcE9iamVjdERlZXA9ZnVuY3Rpb24gdXUodCxlKXtyZXR1cm4gT3IodHx8W10sZXx8W10seXIpfSxCbi56aXBXaXRoPU5hLEJuLmVudHJpZXM9aGwsQm4uZW50cmllc0luPWRsLEJuLmV4dGVuZD1ZcyxCbi5leHRlbmRXaXRoPVhzLFJsKEJuLEJuKSxCbi5hZGQ9V2wsQm4uYXR0ZW1wdD1FbCxCbi5jYW1lbENhc2U9ZmwsQm4uY2FwaXRhbGl6ZT1tbCxCbi5jZWlsPXFsLEJuLmNsYW1wPWZ1bmN0aW9uIGh1KGUsbixpKXtyZXR1cm4gaT09PXQmJihpPW4sbj10KSxpIT09dCYmKGk9KGk9anMoaSkpPT1pP2k6MCksbiE9PXQmJihuPShuPWpzKG4pKT09bj9uOjApLG9pKGpzKGUpLG4saSl9LEJuLmNsb25lPWZ1bmN0aW9uIGR1KHQpe3JldHVybiBhaSh0LDQpfSxCbi5jbG9uZURlZXA9ZnVuY3Rpb24gcHUodCl7cmV0dXJuIGFpKHQsNSl9LEJuLmNsb25lRGVlcFdpdGg9ZnVuY3Rpb24gZnUoZSxuKXtyZXR1cm4gYWkoZSw1LG49ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp0KX0sQm4uY2xvbmVXaXRoPWZ1bmN0aW9uIG11KGUsbil7cmV0dXJuIGFpKGUsNCxuPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246dCl9LEJuLmNvbmZvcm1zVG89ZnVuY3Rpb24gZ3UodCxlKXtyZXR1cm4gbnVsbD09ZXx8c2kodCxlLHJsKGUpKX0sQm4uZGVidXJyPWdsLEJuLmRlZmF1bHRUbz1mdW5jdGlvbiBfdSh0LGUpe3JldHVybiBudWxsPT10fHx0IT10P2U6dH0sQm4uZGl2aWRlPVlsLEJuLmVuZHNXaXRoPWZ1bmN0aW9uIHl1KGUsbixpKXtlPVdzKGUpLG49QXIobik7dmFyIHI9ZS5sZW5ndGgsbz1pPWk9PT10P3I6b2koVnMoaSksMCxyKTtyZXR1cm4oaS09bi5sZW5ndGgpPj0wJiZlLnNsaWNlKGksbyk9PW59LEJuLmVxPXNzLEJuLmVzY2FwZT1mdW5jdGlvbiB2dSh0KXtyZXR1cm4odD1Xcyh0KSkmJkcudGVzdCh0KT90LnJlcGxhY2UoVSwkZSk6dH0sQm4uZXNjYXBlUmVnRXhwPWZ1bmN0aW9uIGJ1KHQpe3JldHVybih0PVdzKHQpKSYmSi50ZXN0KHQpP3QucmVwbGFjZShaLCJcXCQmIik6dH0sQm4uZXZlcnk9ZnVuY3Rpb24geHUoZSxuLGkpe3ZhciByPWhzKGUpP19lOlJpO3JldHVybiBpJiZIbyhlLG4saSkmJihuPXQpLHIoZSxBbyhuLDMpKX0sQm4uZmluZD1EYSxCbi5maW5kSW5kZXg9dWEsQm4uZmluZEtleT1mdW5jdGlvbiB3dSh0LGUpe3JldHVybiBMZSh0LEFvKGUsMyksRmkpfSxCbi5maW5kTGFzdD1CYSxCbi5maW5kTGFzdEluZGV4PWhhLEJuLmZpbmRMYXN0S2V5PWZ1bmN0aW9uIFN1KHQsZSl7cmV0dXJuIExlKHQsQW8oZSwzKSxWaSl9LEJuLmZsb29yPVhsLEJuLmZvckVhY2g9SGEsQm4uZm9yRWFjaFJpZ2h0PUZhLEJuLmZvckluPWZ1bmN0aW9uIE11KHQsZSl7cmV0dXJuIG51bGw9PXQ/dDpCaSh0LEFvKGUsMyksb2wpfSxCbi5mb3JJblJpZ2h0PWZ1bmN0aW9uIEV1KHQsZSl7cmV0dXJuIG51bGw9PXQ/dDpIaSh0LEFvKGUsMyksb2wpfSxCbi5mb3JPd249ZnVuY3Rpb24gVHUodCxlKXtyZXR1cm4gdCYmRmkodCxBbyhlLDMpKX0sQm4uZm9yT3duUmlnaHQ9ZnVuY3Rpb24gQ3UodCxlKXtyZXR1cm4gdCYmVmkodCxBbyhlLDMpKX0sQm4uZ2V0PVFzLEJuLmd0PWxzLEJuLmd0ZT1jcyxCbi5oYXM9ZnVuY3Rpb24gQXUodCxlKXtyZXR1cm4gbnVsbCE9dCYmT28odCxlLFlpKX0sQm4uaGFzSW49dGwsQm4uaGVhZD1wYSxCbi5pZGVudGl0eT1MbCxCbi5pbmNsdWRlcz1mdW5jdGlvbiBrdSh0LGUsbixpKXt0PWZzKHQpP3Q6cGwodCksbj1uJiYhaT9WcyhuKTowO3ZhciByPXQubGVuZ3RoO3JldHVybiBuPDAmJihuPWduKHIrbiwwKSksSXModCk/bjw9ciYmdC5pbmRleE9mKGUsbik+LTE6ISFyJiZOZSh0LGUsbik+LTF9LEJuLmluZGV4T2Y9ZnVuY3Rpb24gTHUodCxlLG4pe3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZighaSlyZXR1cm4tMTt2YXIgcj1udWxsPT1uPzA6VnMobik7cmV0dXJuIHI8MCYmKHI9Z24oaStyLDApKSxOZSh0LGUscil9LEJuLmluUmFuZ2U9ZnVuY3Rpb24gUHUoZSxuLGkpe3JldHVybiBuPUZzKG4pLGk9PT10PyhpPW4sbj0wKTppPUZzKGkpLChmdW5jdGlvbiByKHQsZSxuKXtyZXR1cm4gdD49X24oZSxuKSYmdDxnbihlLG4pfSkoZT1qcyhlKSxuLGkpfSxCbi5pbnZva2U9aWwsQm4uaXNBcmd1bWVudHM9dXMsQm4uaXNBcnJheT1ocyxCbi5pc0FycmF5QnVmZmVyPWRzLEJuLmlzQXJyYXlMaWtlPWZzLEJuLmlzQXJyYXlMaWtlT2JqZWN0PW1zLEJuLmlzQm9vbGVhbj1mdW5jdGlvbiBOdSh0KXtyZXR1cm4hMD09PXR8fCExPT09dHx8TXModCkmJldpKHQpPT1wfSxCbi5pc0J1ZmZlcj1ncyxCbi5pc0RhdGU9X3MsQm4uaXNFbGVtZW50PWZ1bmN0aW9uIEl1KHQpe3JldHVybiBNcyh0KSYmMT09PXQubm9kZVR5cGUmJiFBcyh0KX0sQm4uaXNFbXB0eT1mdW5jdGlvbiBSdSh0KXtpZihudWxsPT10KXJldHVybiEwO2lmKGZzKHQpJiYoaHModCl8fCJzdHJpbmciPT10eXBlb2YgdHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQuc3BsaWNlfHxncyh0KXx8T3ModCl8fHVzKHQpKSlyZXR1cm4hdC5sZW5ndGg7dmFyIGU9Um8odCk7aWYoZT09eXx8ZT09UylyZXR1cm4hdC5zaXplO2lmKGpvKHQpKXJldHVybiFucih0KS5sZW5ndGg7Zm9yKHZhciBuIGluIHQpaWYoTnQuY2FsbCh0LG4pKXJldHVybiExO3JldHVybiEwfSxCbi5pc0VxdWFsPWZ1bmN0aW9uIE91KHQsZSl7cmV0dXJuIEppKHQsZSl9LEJuLmlzRXF1YWxXaXRoPWZ1bmN0aW9uIHp1KGUsbixpKXt2YXIgcj0oaT0iZnVuY3Rpb24iPT10eXBlb2YgaT9pOnQpP2koZSxuKTp0O3JldHVybiByPT09dD9KaShlLG4sdCxpKTohIXJ9LEJuLmlzRXJyb3I9dnMsQm4uaXNGaW5pdGU9ZnVuY3Rpb24gRHUodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZwbih0KX0sQm4uaXNGdW5jdGlvbj1icyxCbi5pc0ludGVnZXI9eHMsQm4uaXNMZW5ndGg9d3MsQm4uaXNNYXA9RXMsQm4uaXNNYXRjaD1mdW5jdGlvbiBCdSh0LGUpe3JldHVybiB0PT09ZXx8UWkodCxlLExvKGUpKX0sQm4uaXNNYXRjaFdpdGg9ZnVuY3Rpb24gSHUoZSxuLGkpe3JldHVybiBpPSJmdW5jdGlvbiI9PXR5cGVvZiBpP2k6dCxRaShlLG4sTG8obiksaSl9LEJuLmlzTmFOPWZ1bmN0aW9uIEZ1KHQpe3JldHVybiBDcyh0KSYmdCE9K3R9LEJuLmlzTmF0aXZlPWZ1bmN0aW9uIFZ1KHQpe2lmKFVvKHQpKXRocm93IG5ldyB4dCgiVW5zdXBwb3J0ZWQgY29yZS1qcyB1c2UuIFRyeSBodHRwczovL25wbXMuaW8vc2VhcmNoP3E9cG9ueWZpbGwuIik7cmV0dXJuIHRyKHQpfSxCbi5pc05pbD1mdW5jdGlvbiBVdSh0KXtyZXR1cm4gbnVsbD09dH0sQm4uaXNOdWxsPWZ1bmN0aW9uIGp1KHQpe3JldHVybiBudWxsPT09dH0sQm4uaXNOdW1iZXI9Q3MsQm4uaXNPYmplY3Q9U3MsQm4uaXNPYmplY3RMaWtlPU1zLEJuLmlzUGxhaW5PYmplY3Q9QXMsQm4uaXNSZWdFeHA9a3MsQm4uaXNTYWZlSW50ZWdlcj1mdW5jdGlvbiBHdSh0KXtyZXR1cm4geHModCkmJnQ+PS05MDA3MTk5MjU0NzQwOTkxJiZ0PD1zfSxCbi5pc1NldD1QcyxCbi5pc1N0cmluZz1JcyxCbi5pc1N5bWJvbD1ScyxCbi5pc1R5cGVkQXJyYXk9T3MsQm4uaXNVbmRlZmluZWQ9ZnVuY3Rpb24gV3UoZSl7cmV0dXJuIGU9PT10fSxCbi5pc1dlYWtNYXA9ZnVuY3Rpb24gcXUodCl7cmV0dXJuIE1zKHQpJiZSbyh0KT09VH0sQm4uaXNXZWFrU2V0PWZ1bmN0aW9uIFl1KHQpe3JldHVybiBNcyh0KSYmIltvYmplY3QgV2Vha1NldF0iPT1XaSh0KX0sQm4uam9pbj1mdW5jdGlvbiBYdSh0LGUpe3JldHVybiBudWxsPT10PyIiOmZuLmNhbGwodCxlKX0sQm4ua2ViYWJDYXNlPV9sLEJuLmxhc3Q9X2EsQm4ubGFzdEluZGV4T2Y9ZnVuY3Rpb24gJHUoZSxuLGkpe3ZhciByPW51bGw9PWU/MDplLmxlbmd0aDtpZighcilyZXR1cm4tMTt2YXIgbz1yO3JldHVybiBpIT09dCYmKG89KG89VnMoaSkpPDA/Z24ocitvLDApOl9uKG8sci0xKSksbj09bj8oZnVuY3Rpb24gYSh0LGUsbil7Zm9yKHZhciBpPW4rMTtpLS07KWlmKHRbaV09PT1lKXJldHVybiBpO3JldHVybiBpfSkoZSxuLG8pOlBlKGUsUmUsbywhMCl9LEJuLmxvd2VyQ2FzZT15bCxCbi5sb3dlckZpcnN0PXZsLEJuLmx0PURzLEJuLmx0ZT1CcyxCbi5tYXg9ZnVuY3Rpb24gS3UoZSl7cmV0dXJuIGUmJmUubGVuZ3RoP09pKGUsTGwscWkpOnR9LEJuLm1heEJ5PWZ1bmN0aW9uIFp1KGUsbil7cmV0dXJuIGUmJmUubGVuZ3RoP09pKGUsQW8obiwyKSxxaSk6dH0sQm4ubWVhbj1mdW5jdGlvbiBKdSh0KXtyZXR1cm4gT2UodCxMbCl9LEJuLm1lYW5CeT1mdW5jdGlvbiBRdSh0LGUpe3JldHVybiBPZSh0LEFvKGUsMikpfSxCbi5taW49ZnVuY3Rpb24gdGgoZSl7cmV0dXJuIGUmJmUubGVuZ3RoP09pKGUsTGwsaXIpOnR9LEJuLm1pbkJ5PWZ1bmN0aW9uIGVoKGUsbil7cmV0dXJuIGUmJmUubGVuZ3RoP09pKGUsQW8obiwyKSxpcik6dH0sQm4uc3R1YkFycmF5PVVsLEJuLnN0dWJGYWxzZT1qbCxCbi5zdHViT2JqZWN0PWZ1bmN0aW9uIG5oKCl7cmV0dXJue319LEJuLnN0dWJTdHJpbmc9ZnVuY3Rpb24gaWgoKXtyZXR1cm4iIn0sQm4uc3R1YlRydWU9ZnVuY3Rpb24gcmgoKXtyZXR1cm4hMH0sQm4ubXVsdGlwbHk9JGwsQm4ubnRoPWZ1bmN0aW9uIG9oKGUsbil7cmV0dXJuIGUmJmUubGVuZ3RoP2xyKGUsVnMobikpOnR9LEJuLm5vQ29uZmxpY3Q9ZnVuY3Rpb24gYWgoKXtyZXR1cm4gZWUuXz09PXRoaXMmJihlZS5fPUR0KSx0aGlzfSxCbi5ub29wPU9sLEJuLm5vdz1ZYSxCbi5wYWQ9ZnVuY3Rpb24gc2godCxlLG4pe3Q9V3ModCk7dmFyIGk9KGU9VnMoZSkpP3JuKHQpOjA7aWYoIWV8fGk+PWUpcmV0dXJuIHQ7dmFyIHI9KGUtaSkvMjtyZXR1cm4gY28odW4ociksbikrdCtjbyhjbihyKSxuKX0sQm4ucGFkRW5kPWZ1bmN0aW9uIGxoKHQsZSxuKXt0PVdzKHQpO3ZhciBpPShlPVZzKGUpKT9ybih0KTowO3JldHVybiBlJiZpPGU/dCtjbyhlLWksbik6dH0sQm4ucGFkU3RhcnQ9ZnVuY3Rpb24gY2godCxlLG4pe3Q9V3ModCk7dmFyIGk9KGU9VnMoZSkpP3JuKHQpOjA7cmV0dXJuIGUmJmk8ZT9jbyhlLWksbikrdDp0fSxCbi5wYXJzZUludD1mdW5jdGlvbiB1aCh0LGUsbil7cmV0dXJuIG58fG51bGw9PWU/ZT0wOmUmJihlPStlKSx2bihXcyh0KS5yZXBsYWNlKFEsIiIpLGV8fDApfSxCbi5yYW5kb209ZnVuY3Rpb24gaGgoZSxuLGkpe2lmKGkmJiJib29sZWFuIiE9dHlwZW9mIGkmJkhvKGUsbixpKSYmKG49aT10KSxpPT09dCYmKCJib29sZWFuIj09dHlwZW9mIG4/KGk9bixuPXQpOiJib29sZWFuIj09dHlwZW9mIGUmJihpPWUsZT10KSksZT09PXQmJm49PT10PyhlPTAsbj0xKTooZT1GcyhlKSxuPT09dD8obj1lLGU9MCk6bj1GcyhuKSksZT5uKXt2YXIgcj1lO2U9bixuPXJ9aWYoaXx8ZSUxfHxuJTEpe3ZhciBvPWJuKCk7cmV0dXJuIF9uKGUrbyoobi1lK1p0KCIxZS0iKygobysiIikubGVuZ3RoLTEpKSksbil9cmV0dXJuIHByKGUsbil9LEJuLnJlZHVjZT1mdW5jdGlvbiBkaCh0LGUsbil7dmFyIGk9aHModCk/VGU6QmUscj1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIGkodCxBbyhlLDQpLG4scixOaSl9LEJuLnJlZHVjZVJpZ2h0PWZ1bmN0aW9uIHBoKHQsZSxuKXt2YXIgaT1ocyh0KT9DZTpCZSxyPWFyZ3VtZW50cy5sZW5ndGg8MztyZXR1cm4gaSh0LEFvKGUsNCksbixyLElpKX0sQm4ucmVwZWF0PWZ1bmN0aW9uIGZoKGUsbixpKXtyZXR1cm4gbj0oaT9IbyhlLG4saSk6bj09PXQpPzE6VnMobiksZnIoV3MoZSksbil9LEJuLnJlcGxhY2U9ZnVuY3Rpb24gbWgoKXt2YXIgdD1hcmd1bWVudHMsZT1Xcyh0WzBdKTtyZXR1cm4gdC5sZW5ndGg8Mz9lOmUucmVwbGFjZSh0WzFdLHRbMl0pfSxCbi5yZXN1bHQ9ZnVuY3Rpb24gZ2goZSxuLGkpe3ZhciByPS0xLG89KG49QnIobixlKSkubGVuZ3RoO2ZvcihvfHwobz0xLGU9dCk7KytyPG87KXt2YXIgYT1udWxsPT1lP3Q6ZVtyYShuW3JdKV07YT09PXQmJihyPW8sYT1pKSxlPWJzKGEpP2EuY2FsbChlKTphfXJldHVybiBlfSxCbi5yb3VuZD1LbCxCbi5ydW5JbkNvbnRleHQ9dHQsQm4uc2FtcGxlPWZ1bmN0aW9uIF9oKHQpe3JldHVybihocyh0KT8kbjpncikodCl9LEJuLnNpemU9ZnVuY3Rpb24geWgodCl7aWYobnVsbD09dClyZXR1cm4gMDtpZihmcyh0KSlyZXR1cm4gSXModCk/cm4odCk6dC5sZW5ndGg7dmFyIGU9Um8odCk7cmV0dXJuIGU9PXl8fGU9PVM/dC5zaXplOm5yKHQpLmxlbmd0aH0sQm4uc25ha2VDYXNlPWJsLEJuLnNvbWU9ZnVuY3Rpb24gdmgoZSxuLGkpe3ZhciByPWhzKGUpP0FlOlNyO3JldHVybiBpJiZIbyhlLG4saSkmJihuPXQpLHIoZSxBbyhuLDMpKX0sQm4uc29ydGVkSW5kZXg9ZnVuY3Rpb24gYmgodCxlKXtyZXR1cm4gTXIodCxlKX0sQm4uc29ydGVkSW5kZXhCeT1mdW5jdGlvbiB4aCh0LGUsbil7cmV0dXJuIEVyKHQsZSxBbyhuLDIpKX0sQm4uc29ydGVkSW5kZXhPZj1mdW5jdGlvbiB3aCh0LGUpe3ZhciBuPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZihuKXt2YXIgaT1Ncih0LGUpO2lmKGk8biYmc3ModFtpXSxlKSlyZXR1cm4gaX1yZXR1cm4tMX0sQm4uc29ydGVkTGFzdEluZGV4PWZ1bmN0aW9uIFNoKHQsZSl7cmV0dXJuIE1yKHQsZSwhMCl9LEJuLnNvcnRlZExhc3RJbmRleEJ5PWZ1bmN0aW9uIE1oKHQsZSxuKXtyZXR1cm4gRXIodCxlLEFvKG4sMiksITApfSxCbi5zb3J0ZWRMYXN0SW5kZXhPZj1mdW5jdGlvbiBFaCh0LGUpe2lmKG51bGwhPXQmJnQubGVuZ3RoKXt2YXIgbj1Ncih0LGUsITApLTE7aWYoc3ModFtuXSxlKSlyZXR1cm4gbn1yZXR1cm4tMX0sQm4uc3RhcnRDYXNlPXhsLEJuLnN0YXJ0c1dpdGg9ZnVuY3Rpb24gVGgodCxlLG4pe3JldHVybiB0PVdzKHQpLG49bnVsbD09bj8wOm9pKFZzKG4pLDAsdC5sZW5ndGgpLGU9QXIoZSksdC5zbGljZShuLG4rZS5sZW5ndGgpPT1lfSxCbi5zdWJ0cmFjdD1abCxCbi5zdW09ZnVuY3Rpb24gQ2godCl7cmV0dXJuIHQmJnQubGVuZ3RoP0hlKHQsTGwpOjB9LEJuLnN1bUJ5PWZ1bmN0aW9uIEFoKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP0hlKHQsQW8oZSwyKSk6MH0sQm4udGVtcGxhdGU9ZnVuY3Rpb24ga2goZSxuLGkpe3ZhciByPUJuLnRlbXBsYXRlU2V0dGluZ3M7aSYmSG8oZSxuLGkpJiYobj10KSxlPVdzKGUpLG49WHMoe30sbixyLHlvKTt2YXIgbyxhLHM9WHMoe30sbi5pbXBvcnRzLHIuaW1wb3J0cyx5byksbD1ybChzKSxjPWplKHMsbCksdT0wLGg9bi5pbnRlcnBvbGF0ZXx8bXQsZD0iX19wICs9ICciLHA9RXQoKG4uZXNjYXBlfHxtdCkuc291cmNlKyJ8IitoLnNvdXJjZSsifCIrKGg9PT1ZP3N0Om10KS5zb3VyY2UrInwiKyhuLmV2YWx1YXRlfHxtdCkuc291cmNlKyJ8JCIsImciKSxmPSIvLyMgc291cmNlVVJMPSIrKE50LmNhbGwobiwic291cmNlVVJMIik/KG4uc291cmNlVVJMKyIiKS5yZXBsYWNlKC9ccy9nLCIgIik6ImxvZGFzaC50ZW1wbGF0ZVNvdXJjZXNbIisgKytZdCsiXSIpKyJcbiI7ZS5yZXBsYWNlKHAsKGZ1bmN0aW9uKHQsbixpLHIscyxsKXtyZXR1cm4gaXx8KGk9ciksZCs9ZS5zbGljZSh1LGwpLnJlcGxhY2UoZ3QsS2UpLG4mJihvPSEwLGQrPSInICtcbl9fZSgiK24rIikgK1xuJyIpLHMmJihhPSEwLGQrPSInO1xuIitzKyI7XG5fX3AgKz0gJyIpLGkmJihkKz0iJyArXG4oKF9fdCA9ICgiK2krIikpID09IG51bGwgPyAnJyA6IF9fdCkgK1xuJyIpLHU9bCt0Lmxlbmd0aCx0fSkpLGQrPSInO1xuIjt2YXIgbT1OdC5jYWxsKG4sInZhcmlhYmxlIikmJm4udmFyaWFibGU7aWYobSl7aWYob3QudGVzdChtKSl0aHJvdyBuZXcgeHQoIkludmFsaWQgYHZhcmlhYmxlYCBvcHRpb24gcGFzc2VkIGludG8gYF8udGVtcGxhdGVgIil9ZWxzZSBkPSJ3aXRoIChvYmopIHtcbiIrZCsiXG59XG4iO2Q9KGE/ZC5yZXBsYWNlKEIsIiIpOmQpLnJlcGxhY2UoSCwiJDEiKS5yZXBsYWNlKEYsIiQxOyIpLGQ9ImZ1bmN0aW9uKCIrKG18fCJvYmoiKSsiKSB7XG4iKyhtPyIiOiJvYmogfHwgKG9iaiA9IHt9KTtcbiIpKyJ2YXIgX190LCBfX3AgPSAnJyIrKG8/IiwgX19lID0gXy5lc2NhcGUiOiIiKSsoYT8iLCBfX2ogPSBBcnJheS5wcm90b3R5cGUuam9pbjtcbmZ1bmN0aW9uIHByaW50KCkgeyBfX3AgKz0gX19qLmNhbGwoYXJndW1lbnRzLCAnJykgfVxuIjoiO1xuIikrZCsicmV0dXJuIF9fcFxufSI7dmFyIGc9RWwoKGZ1bmN0aW9uKCl7cmV0dXJuIHd0KGwsZisicmV0dXJuICIrZCkuYXBwbHkodCxjKX0pKTtpZihnLnNvdXJjZT1kLHZzKGcpKXRocm93IGc7cmV0dXJuIGd9LEJuLnRpbWVzPWZ1bmN0aW9uIExoKHQsZSl7aWYoKHQ9VnModCkpPDF8fHQ+cylyZXR1cm5bXTt2YXIgbj1jLGk9X24odCxjKTtlPUFvKGUpLHQtPWM7Zm9yKHZhciByPUZlKGksZSk7KytuPHQ7KWUobik7cmV0dXJuIHJ9LEJuLnRvRmluaXRlPUZzLEJuLnRvSW50ZWdlcj1WcyxCbi50b0xlbmd0aD1VcyxCbi50b0xvd2VyPWZ1bmN0aW9uIFBoKHQpe3JldHVybiBXcyh0KS50b0xvd2VyQ2FzZSgpfSxCbi50b051bWJlcj1qcyxCbi50b1NhZmVJbnRlZ2VyPWZ1bmN0aW9uIE5oKHQpe3JldHVybiB0P29pKFZzKHQpLC05MDA3MTk5MjU0NzQwOTkxLHMpOjA9PT10P3Q6MH0sQm4udG9TdHJpbmc9V3MsQm4udG9VcHBlcj1mdW5jdGlvbiBJaCh0KXtyZXR1cm4gV3ModCkudG9VcHBlckNhc2UoKX0sQm4udHJpbT1mdW5jdGlvbiBSaChlLG4saSl7aWYoKGU9V3MoZSkpJiYoaXx8bj09PXQpKXJldHVybiBWZShlKTtpZighZXx8IShuPUFyKG4pKSlyZXR1cm4gZTt2YXIgcj1vbihlKSxvPW9uKG4pO3JldHVybiBGcihyLFdlKHIsbykscWUocixvKSsxKS5qb2luKCIiKX0sQm4udHJpbUVuZD1mdW5jdGlvbiBPaChlLG4saSl7aWYoKGU9V3MoZSkpJiYoaXx8bj09PXQpKXJldHVybiBlLnNsaWNlKDAsYW4oZSkrMSk7aWYoIWV8fCEobj1BcihuKSkpcmV0dXJuIGU7dmFyIHI9b24oZSk7cmV0dXJuIEZyKHIsMCxxZShyLG9uKG4pKSsxKS5qb2luKCIiKX0sQm4udHJpbVN0YXJ0PWZ1bmN0aW9uIHpoKGUsbixpKXtpZigoZT1XcyhlKSkmJihpfHxuPT09dCkpcmV0dXJuIGUucmVwbGFjZShRLCIiKTtpZighZXx8IShuPUFyKG4pKSlyZXR1cm4gZTt2YXIgcj1vbihlKTtyZXR1cm4gRnIocixXZShyLG9uKG4pKSkuam9pbigiIil9LEJuLnRydW5jYXRlPWZ1bmN0aW9uIERoKGUsbil7dmFyIGk9MzAscj0iLi4uIjtpZihTcyhuKSl7dmFyIG89InNlcGFyYXRvciJpbiBuP24uc2VwYXJhdG9yOm87aT0ibGVuZ3RoImluIG4/VnMobi5sZW5ndGgpOmkscj0ib21pc3Npb24iaW4gbj9BcihuLm9taXNzaW9uKTpyfXZhciBhPShlPVdzKGUpKS5sZW5ndGg7aWYoWmUoZSkpe3ZhciBzPW9uKGUpO2E9cy5sZW5ndGh9aWYoaT49YSlyZXR1cm4gZTt2YXIgbD1pLXJuKHIpO2lmKGw8MSlyZXR1cm4gcjt2YXIgYz1zP0ZyKHMsMCxsKS5qb2luKCIiKTplLnNsaWNlKDAsbCk7aWYobz09PXQpcmV0dXJuIGMrcjtpZihzJiYobCs9Yy5sZW5ndGgtbCksa3Mobykpe2lmKGUuc2xpY2UobCkuc2VhcmNoKG8pKXt2YXIgdSxoPWM7Zm9yKG8uZ2xvYmFsfHwobz1FdChvLnNvdXJjZSxXcyhsdC5leGVjKG8pKSsiZyIpKSxvLmxhc3RJbmRleD0wO3U9by5leGVjKGgpOyl2YXIgZD11LmluZGV4O2M9Yy5zbGljZSgwLGQ9PT10P2w6ZCl9fWVsc2UgaWYoZS5pbmRleE9mKEFyKG8pLGwpIT1sKXt2YXIgcD1jLmxhc3RJbmRleE9mKG8pO3A+LTEmJihjPWMuc2xpY2UoMCxwKSl9cmV0dXJuIGMrcn0sQm4udW5lc2NhcGU9ZnVuY3Rpb24gQmgodCl7cmV0dXJuKHQ9V3ModCkpJiZqLnRlc3QodCk/dC5yZXBsYWNlKFYsc24pOnR9LEJuLnVuaXF1ZUlkPWZ1bmN0aW9uIEhoKHQpe3ZhciBlPSsrSXQ7cmV0dXJuIFdzKHQpK2V9LEJuLnVwcGVyQ2FzZT13bCxCbi51cHBlckZpcnN0PVNsLEJuLmVhY2g9SGEsQm4uZWFjaFJpZ2h0PUZhLEJuLmZpcnN0PXBhLFJsKEJuLChHbD17fSxGaShCbiwoZnVuY3Rpb24odCxlKXtOdC5jYWxsKEJuLnByb3RvdHlwZSxlKXx8KEdsW2VdPXQpfSkpLEdsKSx7Y2hhaW46ITF9KSxCbi5WRVJTSU9OPSI0LjE3LjIxIixtZShbImJpbmQiLCJiaW5kS2V5IiwiY3VycnkiLCJjdXJyeVJpZ2h0IiwicGFydGlhbCIsInBhcnRpYWxSaWdodCJdLChmdW5jdGlvbih0KXtCblt0XS5wbGFjZWhvbGRlcj1Cbn0pKSxtZShbImRyb3AiLCJ0YWtlIl0sKGZ1bmN0aW9uKGUsbil7VW4ucHJvdG90eXBlW2VdPWZ1bmN0aW9uKGkpe2k9aT09PXQ/MTpnbihWcyhpKSwwKTt2YXIgcj10aGlzLl9fZmlsdGVyZWRfXyYmIW4/bmV3IFVuKHRoaXMpOnRoaXMuY2xvbmUoKTtyZXR1cm4gci5fX2ZpbHRlcmVkX18/ci5fX3Rha2VDb3VudF9fPV9uKGksci5fX3Rha2VDb3VudF9fKTpyLl9fdmlld3NfXy5wdXNoKHtzaXplOl9uKGksYyksdHlwZTplKyhyLl9fZGlyX188MD8iUmlnaHQiOiIiKX0pLHJ9LFVuLnByb3RvdHlwZVtlKyJSaWdodCJdPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJldmVyc2UoKVtlXSh0KS5yZXZlcnNlKCl9fSkpLG1lKFsiZmlsdGVyIiwibWFwIiwidGFrZVdoaWxlIl0sKGZ1bmN0aW9uKHQsZSl7dmFyIG49ZSsxLGk9MT09bnx8Mz09bjtVbi5wcm90b3R5cGVbdF09ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jbG9uZSgpO3JldHVybiBlLl9faXRlcmF0ZWVzX18ucHVzaCh7aXRlcmF0ZWU6QW8odCwzKSx0eXBlOm59KSxlLl9fZmlsdGVyZWRfXz1lLl9fZmlsdGVyZWRfX3x8aSxlfX0pKSxtZShbImhlYWQiLCJsYXN0Il0sKGZ1bmN0aW9uKHQsZSl7dmFyIG49InRha2UiKyhlPyJSaWdodCI6IiIpO1VuLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3JldHVybiB0aGlzW25dKDEpLnZhbHVlKClbMF19fSkpLG1lKFsiaW5pdGlhbCIsInRhaWwiXSwoZnVuY3Rpb24odCxlKXt2YXIgbj0iZHJvcCIrKGU/IiI6IlJpZ2h0Iik7VW4ucHJvdG90eXBlW3RdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19maWx0ZXJlZF9fP25ldyBVbih0aGlzKTp0aGlzW25dKDEpfX0pKSxVbi5wcm90b3R5cGUuY29tcGFjdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbHRlcihMbCl9LFVuLnByb3RvdHlwZS5maW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZpbHRlcih0KS5oZWFkKCl9LFVuLnByb3RvdHlwZS5maW5kTGFzdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkuZmluZCh0KX0sVW4ucHJvdG90eXBlLmludm9rZU1hcD1tcigoZnVuY3Rpb24odCxlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD9uZXcgVW4odGhpcyk6dGhpcy5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiBLaShuLHQsZSl9KSl9KSksVW4ucHJvdG90eXBlLnJlamVjdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5maWx0ZXIobnMoQW8odCkpKX0sVW4ucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKGUsbil7ZT1WcyhlKTt2YXIgaT10aGlzO3JldHVybiBpLl9fZmlsdGVyZWRfXyYmKGU+MHx8bjwwKT9uZXcgVW4oaSk6KGU8MD9pPWkudGFrZVJpZ2h0KC1lKTplJiYoaT1pLmRyb3AoZSkpLG4hPT10JiYoaT0obj1WcyhuKSk8MD9pLmRyb3BSaWdodCgtbik6aS50YWtlKG4tZSkpLGkpfSxVbi5wcm90b3R5cGUudGFrZVJpZ2h0V2hpbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmV2ZXJzZSgpLnRha2VXaGlsZSh0KS5yZXZlcnNlKCl9LFVuLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFrZShjKX0sRmkoVW4ucHJvdG90eXBlLChmdW5jdGlvbihlLG4pe3ZhciBpPS9eKD86ZmlsdGVyfGZpbmR8bWFwfHJlamVjdCl8V2hpbGUkLy50ZXN0KG4pLHI9L14oPzpoZWFkfGxhc3QpJC8udGVzdChuKSxvPUJuW3I/InRha2UiKygibGFzdCI9PW4/IlJpZ2h0IjoiIik6bl0sYT1yfHwvXmZpbmQvLnRlc3Qobik7byYmKEJuLnByb3RvdHlwZVtuXT1mdW5jdGlvbigpe3ZhciBuPXRoaXMuX193cmFwcGVkX18scz1yP1sxXTphcmd1bWVudHMsbD1uIGluc3RhbmNlb2YgVW4sYz1zWzBdLHU9bHx8aHMobiksaD1mdW5jdGlvbih0KXt2YXIgZT1vLmFwcGx5KEJuLEVlKFt0XSxzKSk7cmV0dXJuIHImJmQ/ZVswXTplfTt1JiZpJiYiZnVuY3Rpb24iPT10eXBlb2YgYyYmMSE9Yy5sZW5ndGgmJihsPXU9ITEpO3ZhciBkPXRoaXMuX19jaGFpbl9fLHA9ISF0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCxmPWEmJiFkLG09bCYmIXA7aWYoIWEmJnUpe249bT9uOm5ldyBVbih0aGlzKTt2YXIgZz1lLmFwcGx5KG4scyk7cmV0dXJuIGcuX19hY3Rpb25zX18ucHVzaCh7ZnVuYzpSYSxhcmdzOltoXSx0aGlzQXJnOnR9KSxuZXcgVm4oZyxkKX1yZXR1cm4gZiYmbT9lLmFwcGx5KHRoaXMscyk6KGc9dGhpcy50aHJ1KGgpLGY/cj9nLnZhbHVlKClbMF06Zy52YWx1ZSgpOmcpfSl9KSksbWUoWyJwb3AiLCJwdXNoIiwic2hpZnQiLCJzb3J0Iiwic3BsaWNlIiwidW5zaGlmdCJdLChmdW5jdGlvbih0KXt2YXIgZT1BdFt0XSxuPS9eKD86cHVzaHxzb3J0fHVuc2hpZnQpJC8udGVzdCh0KT8idGFwIjoidGhydSIsaT0vXig/OnBvcHxzaGlmdCkkLy50ZXN0KHQpO0JuLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cztpZihpJiYhdGhpcy5fX2NoYWluX18pe3ZhciByPXRoaXMudmFsdWUoKTtyZXR1cm4gZS5hcHBseShocyhyKT9yOltdLHQpfXJldHVybiB0aGlzW25dKChmdW5jdGlvbihuKXtyZXR1cm4gZS5hcHBseShocyhuKT9uOltdLHQpfSkpfX0pKSxGaShVbi5wcm90b3R5cGUsKGZ1bmN0aW9uKHQsZSl7dmFyIG49Qm5bZV07aWYobil7dmFyIGk9bi5uYW1lKyIiO050LmNhbGwoa24saSl8fChrbltpXT1bXSksa25baV0ucHVzaCh7bmFtZTplLGZ1bmM6bn0pfX0pKSxrbltvbyh0LDIpLm5hbWVdPVt7bmFtZToid3JhcHBlciIsZnVuYzp0fV0sVW4ucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uIEZoKCl7dmFyIHQ9bmV3IFVuKHRoaXMuX193cmFwcGVkX18pO3JldHVybiB0Ll9fYWN0aW9uc19fPVhyKHRoaXMuX19hY3Rpb25zX18pLHQuX19kaXJfXz10aGlzLl9fZGlyX18sdC5fX2ZpbHRlcmVkX189dGhpcy5fX2ZpbHRlcmVkX18sdC5fX2l0ZXJhdGVlc19fPVhyKHRoaXMuX19pdGVyYXRlZXNfXyksdC5fX3Rha2VDb3VudF9fPXRoaXMuX190YWtlQ291bnRfXyx0Ll9fdmlld3NfXz1Ycih0aGlzLl9fdmlld3NfXyksdH0sVW4ucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24gVmgoKXtpZih0aGlzLl9fZmlsdGVyZWRfXyl7dmFyIHQ9bmV3IFVuKHRoaXMpO3QuX19kaXJfXz0tMSx0Ll9fZmlsdGVyZWRfXz0hMH1lbHNlKHQ9dGhpcy5jbG9uZSgpKS5fX2Rpcl9fKj0tMTtyZXR1cm4gdH0sVW4ucHJvdG90eXBlLnZhbHVlPWZ1bmN0aW9uIFVoKCl7dmFyIHQ9dGhpcy5fX3dyYXBwZWRfXy52YWx1ZSgpLGU9dGhpcy5fX2Rpcl9fLG49aHModCksaT1lPDAscj1uP3QubGVuZ3RoOjAsbz0oZnVuY3Rpb24gYSh0LGUsbil7Zm9yKHZhciBpPS0xLHI9bi5sZW5ndGg7KytpPHI7KXt2YXIgbz1uW2ldLGE9by5zaXplO3N3aXRjaChvLnR5cGUpe2Nhc2UiZHJvcCI6dCs9YTticmVhaztjYXNlImRyb3BSaWdodCI6ZS09YTticmVhaztjYXNlInRha2UiOmU9X24oZSx0K2EpO2JyZWFrO2Nhc2UidGFrZVJpZ2h0Ijp0PWduKHQsZS1hKX19cmV0dXJue3N0YXJ0OnQsZW5kOmV9fSkoMCxyLHRoaXMuX192aWV3c19fKSxzPW8uc3RhcnQsbD1vLmVuZCxjPWwtcyx1PWk/bDpzLTEsaD10aGlzLl9faXRlcmF0ZWVzX18sZD1oLmxlbmd0aCxwPTAsZj1fbihjLHRoaXMuX190YWtlQ291bnRfXyk7aWYoIW58fCFpJiZyPT1jJiZmPT1jKXJldHVybiBJcih0LHRoaXMuX19hY3Rpb25zX18pO3ZhciBtPVtdO3Q6Zm9yKDtjLS0mJnA8Zjspe2Zvcih2YXIgZz0tMSxfPXRbdSs9ZV07KytnPGQ7KXt2YXIgeT1oW2ddLHY9eS50eXBlLGI9KDAseS5pdGVyYXRlZSkoXyk7aWYoMj09dilfPWI7ZWxzZSBpZighYil7aWYoMT09diljb250aW51ZSB0O2JyZWFrIHR9fW1bcCsrXT1ffXJldHVybiBtfSxCbi5wcm90b3R5cGUuYXQ9T2EsQm4ucHJvdG90eXBlLmNoYWluPWZ1bmN0aW9uIGpoKCl7cmV0dXJuIElhKHRoaXMpfSxCbi5wcm90b3R5cGUuY29tbWl0PWZ1bmN0aW9uIEdoKCl7cmV0dXJuIG5ldyBWbih0aGlzLnZhbHVlKCksdGhpcy5fX2NoYWluX18pfSxCbi5wcm90b3R5cGUubmV4dD1mdW5jdGlvbiBXaCgpe3RoaXMuX192YWx1ZXNfXz09PXQmJih0aGlzLl9fdmFsdWVzX189SHModGhpcy52YWx1ZSgpKSk7dmFyIGU9dGhpcy5fX2luZGV4X18+PXRoaXMuX192YWx1ZXNfXy5sZW5ndGg7cmV0dXJue2RvbmU6ZSx2YWx1ZTplP3Q6dGhpcy5fX3ZhbHVlc19fW3RoaXMuX19pbmRleF9fKytdfX0sQm4ucHJvdG90eXBlLnBsYW50PWZ1bmN0aW9uIHFoKGUpe2Zvcih2YXIgbixpPXRoaXM7aSBpbnN0YW5jZW9mIEZuOyl7dmFyIHI9YWEoaSk7ci5fX2luZGV4X189MCxyLl9fdmFsdWVzX189dCxuP28uX193cmFwcGVkX189cjpuPXI7dmFyIG89cjtpPWkuX193cmFwcGVkX199cmV0dXJuIG8uX193cmFwcGVkX189ZSxufSxCbi5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbiBZaCgpe3ZhciBlPXRoaXMuX193cmFwcGVkX187aWYoZSBpbnN0YW5jZW9mIFVuKXt2YXIgbj1lO3JldHVybiB0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCYmKG49bmV3IFVuKHRoaXMpKSwobj1uLnJldmVyc2UoKSkuX19hY3Rpb25zX18ucHVzaCh7ZnVuYzpSYSxhcmdzOlt4YV0sdGhpc0FyZzp0fSksbmV3IFZuKG4sdGhpcy5fX2NoYWluX18pfXJldHVybiB0aGlzLnRocnUoeGEpfSxCbi5wcm90b3R5cGUudG9KU09OPUJuLnByb3RvdHlwZS52YWx1ZU9mPUJuLnByb3RvdHlwZS52YWx1ZT1mdW5jdGlvbiBYaCgpe3JldHVybiBJcih0aGlzLl9fd3JhcHBlZF9fLHRoaXMuX19hY3Rpb25zX18pfSxCbi5wcm90b3R5cGUuZmlyc3Q9Qm4ucHJvdG90eXBlLmhlYWQsYWUmJihCbi5wcm90b3R5cGVbYWVdPWZ1bmN0aW9uICRoKCl7cmV0dXJuIHRoaXN9KSxCbn0pKCk7aWU/KChpZS5leHBvcnRzPWxuKS5fPWxuLG5lLl89bG4pOmVlLl89bG59LmNhbGwodmUpOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBNZT0hKHdpbmRvdy5TaGFkeURPTSYmd2luZG93LlNoYWR5RE9NLmluVXNlKTtsZXQgRWUsVGU7ZnVuY3Rpb24gQ2UodCl7RWU9KCF0fHwhdC5zaGltY3NzcHJvcGVydGllcykmJihNZXx8Qm9vbGVhbighbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQXBwbGVXZWJLaXRcLzYwMXxFZGdlXC8xNS8pJiZ3aW5kb3cuQ1NTJiZDU1Muc3VwcG9ydHMmJkNTUy5zdXBwb3J0cygiYm94LXNoYWRvdyIsIjAgMCAwIHZhcigtLWZvbykiKSkpfXdpbmRvdy5TaGFkeUNTUyYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkJiYoVGU9d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkKTtjb25zdCBBZT1Cb29sZWFuKHdpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLmRpc2FibGVSdW50aW1lKTt3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M/RWU9d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzczp3aW5kb3cuU2hhZHlDU1M/KENlKHdpbmRvdy5TaGFkeUNTUyksd2luZG93LlNoYWR5Q1NTPXZvaWQgMCk6Q2Uod2luZG93LldlYkNvbXBvbmVudHMmJndpbmRvdy5XZWJDb21wb25lbnRzLmZsYWdzKTtjb25zdCBrZT1FZTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9jbGFzcyBMZXtjb25zdHJ1Y3Rvcigpe3RoaXMuc3RhcnQ9MCx0aGlzLmVuZD0wLHRoaXMucHJldmlvdXM9bnVsbCx0aGlzLnBhcmVudD1udWxsLHRoaXMucnVsZXM9bnVsbCx0aGlzLnBhcnNlZENzc1RleHQ9IiIsdGhpcy5jc3NUZXh0PSIiLHRoaXMuYXRSdWxlPSExLHRoaXMudHlwZT0wLHRoaXMua2V5ZnJhbWVzTmFtZT0iIix0aGlzLnNlbGVjdG9yPSIiLHRoaXMucGFyc2VkU2VsZWN0b3I9IiJ9fWZ1bmN0aW9uIFBlKHQpe3JldHVybiBOZSgoZnVuY3Rpb24gbih0KXtsZXQgZT1uZXcgTGU7ZS5zdGFydD0wLGUuZW5kPXQubGVuZ3RoO2xldCBuPWU7Zm9yKGxldCBpPTAscj10Lmxlbmd0aDtpPHI7aSsrKWlmKHRbaV09PT1PZSl7bi5ydWxlc3x8KG4ucnVsZXM9W10pO2xldCB0PW4sZT10LnJ1bGVzW3QucnVsZXMubGVuZ3RoLTFdfHxudWxsO249bmV3IExlLG4uc3RhcnQ9aSsxLG4ucGFyZW50PXQsbi5wcmV2aW91cz1lLHQucnVsZXMucHVzaChuKX1lbHNlIHRbaV09PT16ZSYmKG4uZW5kPWkrMSxuPW4ucGFyZW50fHxlKTtyZXR1cm4gZX0pKHQ9KGZ1bmN0aW9uIGUodCl7cmV0dXJuIHQucmVwbGFjZShEZS5jb21tZW50cywiIikucmVwbGFjZShEZS5wb3J0LCIiKX0pKHQpKSx0KX1mdW5jdGlvbiBOZSh0LGUpe2xldCBuPWUuc3Vic3RyaW5nKHQuc3RhcnQsdC5lbmQtMSk7aWYodC5wYXJzZWRDc3NUZXh0PXQuY3NzVGV4dD1uLnRyaW0oKSx0LnBhcmVudCl7bj1lLnN1YnN0cmluZyh0LnByZXZpb3VzP3QucHJldmlvdXMuZW5kOnQucGFyZW50LnN0YXJ0LHQuc3RhcnQtMSksbj0oZnVuY3Rpb24gaSh0KXtyZXR1cm4gdC5yZXBsYWNlKC9cXChbMC05YS1mXXsxLDZ9KVxzL2dpLChmdW5jdGlvbigpe2xldCB0PWFyZ3VtZW50c1sxXSxlPTYtdC5sZW5ndGg7Zm9yKDtlLS07KXQ9IjAiK3Q7cmV0dXJuIlxcIit0fSkpfSkobiksbj1uLnJlcGxhY2UoRGUubXVsdGlwbGVTcGFjZXMsIiAiKSxuPW4uc3Vic3RyaW5nKG4ubGFzdEluZGV4T2YoIjsiKSsxKTtsZXQgaT10LnBhcnNlZFNlbGVjdG9yPXQuc2VsZWN0b3I9bi50cmltKCk7dC5hdFJ1bGU9MD09PWkuaW5kZXhPZihGZSksdC5hdFJ1bGU/MD09PWkuaW5kZXhPZihIZSk/dC50eXBlPVJlLk1FRElBX1JVTEU6aS5tYXRjaChEZS5rZXlmcmFtZXNSdWxlKSYmKHQudHlwZT1SZS5LRVlGUkFNRVNfUlVMRSx0LmtleWZyYW1lc05hbWU9dC5zZWxlY3Rvci5zcGxpdChEZS5tdWx0aXBsZVNwYWNlcykucG9wKCkpOnQudHlwZT0wPT09aS5pbmRleE9mKEJlKT9SZS5NSVhJTl9SVUxFOlJlLlNUWUxFX1JVTEV9bGV0IHI9dC5ydWxlcztpZihyKWZvcihsZXQgdCxuPTAsaT1yLmxlbmd0aDtuPGkmJih0PXJbbl0pO24rKylOZSh0LGUpO3JldHVybiB0fWZ1bmN0aW9uIEllKHQsZSxuPSIiKXtsZXQgaT0iIjtpZih0LmNzc1RleHR8fHQucnVsZXMpe2xldCBuPXQucnVsZXM7aWYobiYmIShmdW5jdGlvbiByKHQpe2xldCBlPXRbMF07cmV0dXJuIEJvb2xlYW4oZSkmJkJvb2xlYW4oZS5zZWxlY3RvcikmJjA9PT1lLnNlbGVjdG9yLmluZGV4T2YoQmUpfSkobikpZm9yKGxldCB0LHI9MCxvPW4ubGVuZ3RoO3I8byYmKHQ9bltyXSk7cisrKWk9SWUodCxlLGkpO2Vsc2UgaT1lP3QuY3NzVGV4dDooZnVuY3Rpb24gbyh0KXtyZXR1cm4oZnVuY3Rpb24gbih0KXtyZXR1cm4gdC5yZXBsYWNlKERlLm1peGluQXBwbHksIiIpLnJlcGxhY2UoRGUudmFyQXBwbHksIiIpfSkodD0oZnVuY3Rpb24gZSh0KXtyZXR1cm4gdC5yZXBsYWNlKERlLmN1c3RvbVByb3AsIiIpLnJlcGxhY2UoRGUubWl4aW5Qcm9wLCIiKX0pKHQpKX0pKHQuY3NzVGV4dCksaT1pLnRyaW0oKSxpJiYoaT0iICAiK2krIlxuIil9cmV0dXJuIGkmJih0LnNlbGVjdG9yJiYobis9dC5zZWxlY3RvcisiICIrT2UrIlxuIiksbis9aSx0LnNlbGVjdG9yJiYobis9emUrIlxuXG4iKSksbn1jb25zdCBSZT17U1RZTEVfUlVMRToxLEtFWUZSQU1FU19SVUxFOjcsTUVESUFfUlVMRTo0LE1JWElOX1JVTEU6MWUzfSxPZT0ieyIsemU9In0iLERlPXtjb21tZW50czovXC9cKlteKl0qXCorKFteLypdW14qXSpcKispKlwvL2dpbSxwb3J0Oi9AaW1wb3J0W147XSo7L2dpbSxjdXN0b21Qcm9wOi8oPzpeW147XC1cc31dKyk/LS1bXjt7fV0qPzpbXnt9O10qPyg/Ols7XG5dfCQpL2dpbSxtaXhpblByb3A6Lyg/Ol5bXjtcLVxzfV0rKT8tLVteO3t9XSo/Oltee307XSo/e1tefV0qP30oPzpbO1xuXXwkKT8vZ2ltLG1peGluQXBwbHk6L0BhcHBseVxzKlwoP1teKTtdKlwpP1xzKig/Ols7XG5dfCQpPy9naW0sdmFyQXBwbHk6L1teOzpdKj86W147XSo/dmFyXChbXjtdKlwpKD86Wztcbl18JCk/L2dpbSxrZXlmcmFtZXNSdWxlOi9eQFteXHNdKmtleWZyYW1lcy8sbXVsdGlwbGVTcGFjZXM6L1xzKy9nfSxCZT0iLS0iLEhlPSJAbWVkaWEiLEZlPSJAIixWZT0vKD86XnxbO1xze11ccyopKC0tW1x3LV0qPylccyo6XHMqKD86KCg/OicoPzpcXCd8LikqPyd8Iig/OlxcInwuKSo/InxcKFteKV0qP1wpfFtefTt7XSkrKXxceyhbXn1dKilcfSg/Oig/PVs7XHN9XSl8JCkpL2dpLFVlPS8oPzpefFxXKylAYXBwbHlccypcKD8oW14pO1xuXSopXCk/L2dpLGplPS9AbWVkaWFccyguKikvLEdlPW5ldyBTZXQ7ZnVuY3Rpb24gV2UodCl7Y29uc3QgZT10LnRleHRDb250ZW50O2lmKCFHZS5oYXMoZSkpe0dlLmFkZChlKTtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7dC5zZXRBdHRyaWJ1dGUoInNoYWR5LXVuc2NvcGVkIiwiIiksdC50ZXh0Q29udGVudD1lLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodCl9fWZ1bmN0aW9uIHFlKHQpe3JldHVybiB0Lmhhc0F0dHJpYnV0ZSgic2hhZHktdW5zY29wZWQiKX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9mdW5jdGlvbiBZZSh0LGUpe3JldHVybiB0Pygic3RyaW5nIj09dHlwZW9mIHQmJih0PVBlKHQpKSxlJiYkZSh0LGUpLEllKHQsa2UpKToiIn1mdW5jdGlvbiBYZSh0KXtyZXR1cm4hdC5fX2Nzc1J1bGVzJiZ0LnRleHRDb250ZW50JiYodC5fX2Nzc1J1bGVzPVBlKHQudGV4dENvbnRlbnQpKSx0Ll9fY3NzUnVsZXN8fG51bGx9ZnVuY3Rpb24gJGUodCxlLG4saSl7aWYoIXQpcmV0dXJuO2xldCByPSExLG89dC50eXBlO2lmKGkmJm89PT1SZS5NRURJQV9SVUxFKXtsZXQgZT10LnNlbGVjdG9yLm1hdGNoKGplKTtlJiYod2luZG93Lm1hdGNoTWVkaWEoZVsxXSkubWF0Y2hlc3x8KHI9ITApKX1vPT09UmUuU1RZTEVfUlVMRT9lKHQpOm4mJm89PT1SZS5LRVlGUkFNRVNfUlVMRT9uKHQpOm89PT1SZS5NSVhJTl9SVUxFJiYocj0hMCk7bGV0IGE9dC5ydWxlcztpZihhJiYhcilmb3IobGV0IHQscj0wLG89YS5sZW5ndGg7cjxvJiYodD1hW3JdKTtyKyspJGUodCxlLG4saSl9ZnVuY3Rpb24gS2UodCxlKXtsZXQgbj10LmluZGV4T2YoInZhcigiKTtpZigtMT09PW4pcmV0dXJuIGUodCwiIiwiIiwiIik7bGV0IGk9KGZ1bmN0aW9uIHIodCxlKXtsZXQgbj0wO2ZvcihsZXQgaT1lLHI9dC5sZW5ndGg7aTxyO2krKylpZigiKCI9PT10W2ldKW4rKztlbHNlIGlmKCIpIj09PXRbaV0mJjA9PS0tbilyZXR1cm4gaTtyZXR1cm4tMX0pKHQsbiszKSxvPXQuc3Vic3RyaW5nKG4rNCxpKSxhPXQuc3Vic3RyaW5nKDAsbikscz1LZSh0LnN1YnN0cmluZyhpKzEpLGUpLGw9by5pbmRleE9mKCIsIik7cmV0dXJuLTE9PT1sP2UoYSxvLnRyaW0oKSwiIixzKTplKGEsby5zdWJzdHJpbmcoMCxsKS50cmltKCksby5zdWJzdHJpbmcobCsxKS50cmltKCkscyl9d2luZG93LlNoYWR5RE9NJiZ3aW5kb3c7Y29uc3QgWmU9ImNzcy1idWlsZCI7ZnVuY3Rpb24gSmUodCl7cmV0dXJuIiIhPT0oZnVuY3Rpb24gZSh0KXtpZih2b2lkIDAhPT1UZSlyZXR1cm4gVGU7aWYodm9pZCAwPT09dC5fX2Nzc0J1aWxkKXtjb25zdCBlPXQuZ2V0QXR0cmlidXRlKFplKTtpZihlKXQuX19jc3NCdWlsZD1lO2Vsc2V7Y29uc3QgZT0oZnVuY3Rpb24gZSh0KXtjb25zdCBlPSJ0ZW1wbGF0ZSI9PT10LmxvY2FsTmFtZT90LmNvbnRlbnQuZmlyc3RDaGlsZDp0LmZpcnN0Q2hpbGQ7aWYoZSBpbnN0YW5jZW9mIENvbW1lbnQpe2NvbnN0IHQ9ZS50ZXh0Q29udGVudC50cmltKCkuc3BsaXQoIjoiKTtpZih0WzBdPT09WmUpcmV0dXJuIHRbMV19cmV0dXJuIiJ9KSh0KTsiIiE9PWUmJihmdW5jdGlvbiBuKHQpe2NvbnN0IGU9InRlbXBsYXRlIj09PXQubG9jYWxOYW1lP3QuY29udGVudC5maXJzdENoaWxkOnQuZmlyc3RDaGlsZDtlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSl9Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovKSh0KSx0Ll9fY3NzQnVpbGQ9ZX19cmV0dXJuIHQuX19jc3NCdWlsZHx8IiJ9KSh0KX1mdW5jdGlvbiBRZSh0LGUpe2ZvcihsZXQgbiBpbiBlKW51bGw9PT1uP3Quc3R5bGUucmVtb3ZlUHJvcGVydHkobik6dC5zdHlsZS5zZXRQcm9wZXJ0eShuLGVbbl0pfWZ1bmN0aW9uIHRuKHQsZSl7Y29uc3Qgbj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS5nZXRQcm9wZXJ0eVZhbHVlKGUpO3JldHVybiBuP24udHJpbSgpOiIifQovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBlbj0vO1xzKi9tLG5uPS9eXHMqKGluaXRpYWwpfChpbmhlcml0KVxzKiQvLHJuPS9ccyohaW1wb3J0YW50LztjbGFzcyBvbntjb25zdHJ1Y3Rvcigpe3RoaXMuX21hcD17fX1zZXQodCxlKXt0PXQudHJpbSgpLHRoaXMuX21hcFt0XT17cHJvcGVydGllczplLGRlcGVuZGFudHM6e319fWdldCh0KXtyZXR1cm4gdD10LnRyaW0oKSx0aGlzLl9tYXBbdF18fG51bGx9fWxldCBhbj1udWxsO2NsYXNzIHNue2NvbnN0cnVjdG9yKCl7dGhpcy5fY3VycmVudEVsZW1lbnQ9bnVsbCx0aGlzLl9tZWFzdXJlRWxlbWVudD1udWxsLHRoaXMuX21hcD1uZXcgb259ZGV0ZWN0TWl4aW4odCl7cmV0dXJuKGZ1bmN0aW9uIGUodCl7Y29uc3QgZT1VZS50ZXN0KHQpfHxWZS50ZXN0KHQpO3JldHVybiBVZS5sYXN0SW5kZXg9MCxWZS5sYXN0SW5kZXg9MCxlfSkodCl9Z2F0aGVyU3R5bGVzKHQpe2NvbnN0IGU9KGZ1bmN0aW9uIG4odCl7Y29uc3QgZT1bXSxuPXQucXVlcnlTZWxlY3RvckFsbCgic3R5bGUiKTtmb3IobGV0IHQ9MDt0PG4ubGVuZ3RoO3QrKyl7Y29uc3QgaT1uW3RdO3FlKGkpP01lfHwoV2UoaSksaS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGkpKTooZS5wdXNoKGkudGV4dENvbnRlbnQpLGkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChpKSl9cmV0dXJuIGUuam9pbigiIikudHJpbSgpfSkodC5jb250ZW50KTtpZihlKXtjb25zdCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7cmV0dXJuIG4udGV4dENvbnRlbnQ9ZSx0LmNvbnRlbnQuaW5zZXJ0QmVmb3JlKG4sdC5jb250ZW50LmZpcnN0Q2hpbGQpLG59cmV0dXJuIG51bGx9dHJhbnNmb3JtVGVtcGxhdGUodCxlKXt2b2lkIDA9PT10Ll9nYXRoZXJlZFN0eWxlJiYodC5fZ2F0aGVyZWRTdHlsZT10aGlzLmdhdGhlclN0eWxlcyh0KSk7Y29uc3Qgbj10Ll9nYXRoZXJlZFN0eWxlO3JldHVybiBuP3RoaXMudHJhbnNmb3JtU3R5bGUobixlKTpudWxsfXRyYW5zZm9ybVN0eWxlKHQsZT0iIil7bGV0IG49WGUodCk7cmV0dXJuIHRoaXMudHJhbnNmb3JtUnVsZXMobixlKSx0LnRleHRDb250ZW50PVllKG4pLG59dHJhbnNmb3JtQ3VzdG9tU3R5bGUodCl7bGV0IGU9WGUodCk7cmV0dXJuICRlKGUsKHQ9PnsiOnJvb3QiPT09dC5zZWxlY3RvciYmKHQuc2VsZWN0b3I9Imh0bWwiKSx0aGlzLnRyYW5zZm9ybVJ1bGUodCl9KSksdC50ZXh0Q29udGVudD1ZZShlKSxlfXRyYW5zZm9ybVJ1bGVzKHQsZSl7dGhpcy5fY3VycmVudEVsZW1lbnQ9ZSwkZSh0LCh0PT57dGhpcy50cmFuc2Zvcm1SdWxlKHQpfSkpLHRoaXMuX2N1cnJlbnRFbGVtZW50PW51bGx9dHJhbnNmb3JtUnVsZSh0KXt0LmNzc1RleHQ9dGhpcy50cmFuc2Zvcm1Dc3NUZXh0KHQucGFyc2VkQ3NzVGV4dCx0KSwiOnJvb3QiPT09dC5zZWxlY3RvciYmKHQuc2VsZWN0b3I9Ijpob3N0ID4gKiIpfXRyYW5zZm9ybUNzc1RleHQodCxlKXtyZXR1cm4gdD10LnJlcGxhY2UoVmUsKCh0LG4saSxyKT0+dGhpcy5fcHJvZHVjZUNzc1Byb3BlcnRpZXModCxuLGkscixlKSkpLHRoaXMuX2NvbnN1bWVDc3NQcm9wZXJ0aWVzKHQsZSl9X2dldEluaXRpYWxWYWx1ZUZvclByb3BlcnR5KHQpe3JldHVybiB0aGlzLl9tZWFzdXJlRWxlbWVudHx8KHRoaXMuX21lYXN1cmVFbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm1ldGEiKSx0aGlzLl9tZWFzdXJlRWxlbWVudC5zZXRBdHRyaWJ1dGUoImFwcGx5LXNoaW0tbWVhc3VyZSIsIiIpLHRoaXMuX21lYXN1cmVFbGVtZW50LnN0eWxlLmFsbD0iaW5pdGlhbCIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0aGlzLl9tZWFzdXJlRWxlbWVudCkpLHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuX21lYXN1cmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKHQpfV9mYWxsYmFja3NGcm9tUHJldmlvdXNSdWxlcyh0KXtsZXQgZT10O2Zvcig7ZS5wYXJlbnQ7KWU9ZS5wYXJlbnQ7Y29uc3Qgbj17fTtsZXQgaT0hMTtyZXR1cm4gJGUoZSwoZT0+e2k9aXx8ZT09PXQsaXx8ZS5zZWxlY3Rvcj09PXQuc2VsZWN0b3ImJk9iamVjdC5hc3NpZ24obix0aGlzLl9jc3NUZXh0VG9NYXAoZS5wYXJzZWRDc3NUZXh0KSl9KSksbn1fY29uc3VtZUNzc1Byb3BlcnRpZXModCxlKXtsZXQgbj1udWxsO2Zvcig7bj1VZS5leGVjKHQpOyl7bGV0IGk9blswXSxyPW5bMV0sbz1uLmluZGV4LGE9bytpLmluZGV4T2YoIkBhcHBseSIpLHM9bytpLmxlbmd0aCxsPXQuc2xpY2UoMCxhKSxjPXQuc2xpY2UocyksdT1lP3RoaXMuX2ZhbGxiYWNrc0Zyb21QcmV2aW91c1J1bGVzKGUpOnt9O09iamVjdC5hc3NpZ24odSx0aGlzLl9jc3NUZXh0VG9NYXAobCkpO2xldCBoPXRoaXMuX2F0QXBwbHlUb0Nzc1Byb3BlcnRpZXMocix1KTt0PWAke2x9JHtofSR7Y31gLFVlLmxhc3RJbmRleD1vK2gubGVuZ3RofXJldHVybiB0fV9hdEFwcGx5VG9Dc3NQcm9wZXJ0aWVzKHQsZSl7dD10LnJlcGxhY2UoZW4sIiIpO2xldCBuPVtdLGk9dGhpcy5fbWFwLmdldCh0KTtpZihpfHwodGhpcy5fbWFwLnNldCh0LHt9KSxpPXRoaXMuX21hcC5nZXQodCkpLGkpe2xldCByLG8sYTt0aGlzLl9jdXJyZW50RWxlbWVudCYmKGkuZGVwZW5kYW50c1t0aGlzLl9jdXJyZW50RWxlbWVudF09ITApO2NvbnN0IHM9aS5wcm9wZXJ0aWVzO2ZvcihyIGluIHMpYT1lJiZlW3JdLG89W3IsIjogdmFyKCIsdCwiXy1fIixyXSxhJiZvLnB1c2goIiwiLGEucmVwbGFjZShybiwiIikpLG8ucHVzaCgiKSIpLHJuLnRlc3Qoc1tyXSkmJm8ucHVzaCgiICFpbXBvcnRhbnQiKSxuLnB1c2goby5qb2luKCIiKSl9cmV0dXJuIG4uam9pbigiOyAiKX1fcmVwbGFjZUluaXRpYWxPckluaGVyaXQodCxlKXtsZXQgbj1ubi5leGVjKGUpO3JldHVybiBuJiYoZT1uWzFdP3RoaXMuX2dldEluaXRpYWxWYWx1ZUZvclByb3BlcnR5KHQpOiJhcHBseS1zaGltLWluaGVyaXQiKSxlfV9jc3NUZXh0VG9NYXAodCxlPSExKXtsZXQgbixpLHI9dC5zcGxpdCgiOyIpLG89e307Zm9yKGxldCB0LGEscz0wO3M8ci5sZW5ndGg7cysrKXQ9cltzXSx0JiYoYT10LnNwbGl0KCI6IiksYS5sZW5ndGg+MSYmKG49YVswXS50cmltKCksaT1hLnNsaWNlKDEpLmpvaW4oIjoiKSxlJiYoaT10aGlzLl9yZXBsYWNlSW5pdGlhbE9ySW5oZXJpdChuLGkpKSxvW25dPWkpKTtyZXR1cm4gb31faW52YWxpZGF0ZU1peGluRW50cnkodCl7aWYoYW4pZm9yKGxldCBlIGluIHQuZGVwZW5kYW50cyllIT09dGhpcy5fY3VycmVudEVsZW1lbnQmJmFuKGUpfV9wcm9kdWNlQ3NzUHJvcGVydGllcyh0LGUsbixpLHIpe2lmKG4mJktlKG4sKCh0LGUpPT57ZSYmdGhpcy5fbWFwLmdldChlKSYmKGk9YEBhcHBseSAke2V9O2ApfSkpLCFpKXJldHVybiB0O2xldCBvPXRoaXMuX2NvbnN1bWVDc3NQcm9wZXJ0aWVzKCIiK2ksciksYT10LnNsaWNlKDAsdC5pbmRleE9mKCItLSIpKSxzPXRoaXMuX2Nzc1RleHRUb01hcChvLCEwKSxsPXMsYz10aGlzLl9tYXAuZ2V0KGUpLHU9YyYmYy5wcm9wZXJ0aWVzO3U/bD1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUodSkscyk6dGhpcy5fbWFwLnNldChlLGwpO2xldCBoLGQscD1bXSxmPSExO2ZvcihoIGluIGwpZD1zW2hdLHZvaWQgMD09PWQmJihkPSJpbml0aWFsIiksdSYmIShoIGluIHUpJiYoZj0hMCkscC5wdXNoKGAke2V9Xy1fJHtofTogJHtkfWApO3JldHVybiBmJiZ0aGlzLl9pbnZhbGlkYXRlTWl4aW5FbnRyeShjKSxjJiYoYy5wcm9wZXJ0aWVzPWwpLG4mJihhPWAke3R9OyR7YX1gKSxgJHthfSR7cC5qb2luKCI7ICIpfTtgfX1zbi5wcm90b3R5cGUuZGV0ZWN0TWl4aW49c24ucHJvdG90eXBlLmRldGVjdE1peGluLHNuLnByb3RvdHlwZS50cmFuc2Zvcm1TdHlsZT1zbi5wcm90b3R5cGUudHJhbnNmb3JtU3R5bGUsc24ucHJvdG90eXBlLnRyYW5zZm9ybUN1c3RvbVN0eWxlPXNuLnByb3RvdHlwZS50cmFuc2Zvcm1DdXN0b21TdHlsZSxzbi5wcm90b3R5cGUudHJhbnNmb3JtUnVsZXM9c24ucHJvdG90eXBlLnRyYW5zZm9ybVJ1bGVzLHNuLnByb3RvdHlwZS50cmFuc2Zvcm1SdWxlPXNuLnByb3RvdHlwZS50cmFuc2Zvcm1SdWxlLHNuLnByb3RvdHlwZS50cmFuc2Zvcm1UZW1wbGF0ZT1zbi5wcm90b3R5cGUudHJhbnNmb3JtVGVtcGxhdGUsc24ucHJvdG90eXBlLl9zZXBhcmF0b3I9Il8tXyIsT2JqZWN0LmRlZmluZVByb3BlcnR5KHNuLnByb3RvdHlwZSwiaW52YWxpZENhbGxiYWNrIix7Z2V0OigpPT5hbixzZXQodCl7YW49dH19KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgbG49e30sY249Il9hcHBseVNoaW1DdXJyZW50VmVyc2lvbiIsdW49Il9hcHBseVNoaW1OZXh0VmVyc2lvbiIsaG49Il9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbiIsZG49UHJvbWlzZS5yZXNvbHZlKCk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovZnVuY3Rpb24gcG4odCl7bGV0IGU9bG5bdF07ZSYmKGZ1bmN0aW9uIG4odCl7dFtjbl09dFtjbl18fDAsdFtobl09dFtobl18fDAsdFt1bl09KHRbdW5dfHwwKSsxfSkoZSl9ZnVuY3Rpb24gZm4odCl7cmV0dXJuIHRbY25dPT09dFt1bl19Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmxldCBtbixnbj1udWxsLF9uPXdpbmRvdy5IVE1MSW1wb3J0cyYmd2luZG93LkhUTUxJbXBvcnRzLndoZW5SZWFkeXx8bnVsbDtmdW5jdGlvbiB5bih0KXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uKCl7X24/X24odCk6KGdufHwoZ249bmV3IFByb21pc2UoKHQ9Pnttbj10fSkpLCJjb21wbGV0ZSI9PT1kb2N1bWVudC5yZWFkeVN0YXRlP21uKCk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsKCgpPT57ImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGUmJm1uKCl9KSkpLGduLnRoZW4oKGZ1bmN0aW9uKCl7dCYmdCgpfSkpKX0pKX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9jb25zdCB2bj0iX19zZWVuQnlTaGFkeUNTUyIsYm49Il9fc2hhZHlDU1NDYWNoZWRTdHlsZSI7bGV0IHhuPW51bGwsd249bnVsbDtjbGFzcyBTbntjb25zdHJ1Y3Rvcigpe3RoaXMuY3VzdG9tU3R5bGVzPVtdLHRoaXMuZW5xdWV1ZWQ9ITEseW4oKCgpPT57d2luZG93LlNoYWR5Q1NTLmZsdXNoQ3VzdG9tU3R5bGVzJiZ3aW5kb3cuU2hhZHlDU1MuZmx1c2hDdXN0b21TdHlsZXMoKX0pKX1lbnF1ZXVlRG9jdW1lbnRWYWxpZGF0aW9uKCl7IXRoaXMuZW5xdWV1ZWQmJnduJiYodGhpcy5lbnF1ZXVlZD0hMCx5bih3bikpfWFkZEN1c3RvbVN0eWxlKHQpe3Rbdm5dfHwodFt2bl09ITAsdGhpcy5jdXN0b21TdHlsZXMucHVzaCh0KSx0aGlzLmVucXVldWVEb2N1bWVudFZhbGlkYXRpb24oKSl9Z2V0U3R5bGVGb3JDdXN0b21TdHlsZSh0KXtpZih0W2JuXSlyZXR1cm4gdFtibl07bGV0IGU7cmV0dXJuIGU9dC5nZXRTdHlsZT90LmdldFN0eWxlKCk6dCxlfXByb2Nlc3NTdHlsZXMoKXtjb25zdCB0PXRoaXMuY3VzdG9tU3R5bGVzO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtjb25zdCBuPXRbZV07aWYobltibl0pY29udGludWU7Y29uc3QgaT10aGlzLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUobik7aWYoaSl7Y29uc3QgdD1pLl9fYXBwbGllZEVsZW1lbnR8fGk7eG4mJnhuKHQpLG5bYm5dPXR9fXJldHVybiB0fX1Tbi5wcm90b3R5cGUuYWRkQ3VzdG9tU3R5bGU9U24ucHJvdG90eXBlLmFkZEN1c3RvbVN0eWxlLFNuLnByb3RvdHlwZS5nZXRTdHlsZUZvckN1c3RvbVN0eWxlPVNuLnByb3RvdHlwZS5nZXRTdHlsZUZvckN1c3RvbVN0eWxlLFNuLnByb3RvdHlwZS5wcm9jZXNzU3R5bGVzPVNuLnByb3RvdHlwZS5wcm9jZXNzU3R5bGVzLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFNuLnByb3RvdHlwZSx7dHJhbnNmb3JtQ2FsbGJhY2s6e2dldDooKT0+eG4sc2V0KHQpe3huPXR9fSx2YWxpZGF0ZUNhbGxiYWNrOntnZXQ6KCk9PnduLHNldCh0KXtsZXQgZT0hMTt3bnx8KGU9ITApLHduPXQsZSYmdGhpcy5lbnF1ZXVlRG9jdW1lbnRWYWxpZGF0aW9uKCl9fX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBNbj1uZXcgc247Y2xhc3MgRW57Y29uc3RydWN0b3IoKXt0aGlzLmN1c3RvbVN0eWxlSW50ZXJmYWNlPW51bGwsTW4uaW52YWxpZENhbGxiYWNrPXBufWVuc3VyZSgpe3RoaXMuY3VzdG9tU3R5bGVJbnRlcmZhY2V8fHdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSYmKHRoaXMuY3VzdG9tU3R5bGVJbnRlcmZhY2U9d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlLHRoaXMuY3VzdG9tU3R5bGVJbnRlcmZhY2UudHJhbnNmb3JtQ2FsbGJhY2s9dD0+e01uLnRyYW5zZm9ybUN1c3RvbVN0eWxlKHQpfSx0aGlzLmN1c3RvbVN0eWxlSW50ZXJmYWNlLnZhbGlkYXRlQ2FsbGJhY2s9KCk9PntyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT57dGhpcy5jdXN0b21TdHlsZUludGVyZmFjZS5lbnF1ZXVlZCYmdGhpcy5mbHVzaEN1c3RvbVN0eWxlcygpfSkpfSl9cHJlcGFyZVRlbXBsYXRlKHQsZSl7aWYodGhpcy5lbnN1cmUoKSxKZSh0KSlyZXR1cm47bG5bZV09dDtsZXQgbj1Nbi50cmFuc2Zvcm1UZW1wbGF0ZSh0LGUpO3QuX3N0eWxlQXN0PW59Zmx1c2hDdXN0b21TdHlsZXMoKXtpZih0aGlzLmVuc3VyZSgpLCF0aGlzLmN1c3RvbVN0eWxlSW50ZXJmYWNlKXJldHVybjtsZXQgdD10aGlzLmN1c3RvbVN0eWxlSW50ZXJmYWNlLnByb2Nlc3NTdHlsZXMoKTtpZih0aGlzLmN1c3RvbVN0eWxlSW50ZXJmYWNlLmVucXVldWVkKXtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl7bGV0IG49dGhpcy5jdXN0b21TdHlsZUludGVyZmFjZS5nZXRTdHlsZUZvckN1c3RvbVN0eWxlKHRbZV0pO24mJk1uLnRyYW5zZm9ybUN1c3RvbVN0eWxlKG4pfXRoaXMuY3VzdG9tU3R5bGVJbnRlcmZhY2UuZW5xdWV1ZWQ9ITF9fXN0eWxlU3VidHJlZSh0LGUpe2lmKHRoaXMuZW5zdXJlKCksZSYmUWUodCxlKSx0LnNoYWRvd1Jvb3Qpe3RoaXMuc3R5bGVFbGVtZW50KHQpO2xldCBlPXQuc2hhZG93Um9vdC5jaGlsZHJlbnx8dC5zaGFkb3dSb290LmNoaWxkTm9kZXM7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspdGhpcy5zdHlsZVN1YnRyZWUoZVt0XSl9ZWxzZXtsZXQgZT10LmNoaWxkcmVufHx0LmNoaWxkTm9kZXM7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspdGhpcy5zdHlsZVN1YnRyZWUoZVt0XSl9fXN0eWxlRWxlbWVudCh0KXt0aGlzLmVuc3VyZSgpO2xldHtpczplfT0oZnVuY3Rpb24gbih0KXtsZXQgZT10LmxvY2FsTmFtZSxuPSIiLGk9IiI7cmV0dXJuIGU/ZS5pbmRleE9mKCItIik+LTE/bj1lOihpPWUsbj10LmdldEF0dHJpYnV0ZSYmdC5nZXRBdHRyaWJ1dGUoImlzIil8fCIiKToobj10LmlzLGk9dC5leHRlbmRzKSx7aXM6bix0eXBlRXh0ZW5zaW9uOml9fSkodCksaT1sbltlXTtpZigoIWl8fCFKZShpKSkmJmkmJiFmbihpKSl7KGZ1bmN0aW9uIG4odCl7cmV0dXJuIWZuKHQpJiZ0W2huXT09PXRbdW5dfSkoaSl8fCh0aGlzLnByZXBhcmVUZW1wbGF0ZShpLGUpLChmdW5jdGlvbiByKHQpe3RbaG5dPXRbdW5dLHQuX3ZhbGlkYXRpbmd8fCh0Ll92YWxpZGF0aW5nPSEwLGRuLnRoZW4oKGZ1bmN0aW9uKCl7dFtjbl09dFt1bl0sdC5fdmFsaWRhdGluZz0hMX0pKSl9KShpKSk7bGV0IG89dC5zaGFkb3dSb290O2lmKG8pe2xldCB0PW8ucXVlcnlTZWxlY3Rvcigic3R5bGUiKTt0JiYodC5fX2Nzc1J1bGVzPWkuX3N0eWxlQXN0LHQudGV4dENvbnRlbnQ9WWUoaS5fc3R5bGVBc3QpKX19fXN0eWxlRG9jdW1lbnQodCl7dGhpcy5lbnN1cmUoKSx0aGlzLnN0eWxlU3VidHJlZShkb2N1bWVudC5ib2R5LHQpfX1pZighd2luZG93LlNoYWR5Q1NTfHwhd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltKXtjb25zdCB0PW5ldyBFbjtsZXQgZT13aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZTt3aW5kb3cuU2hhZHlDU1M9e3ByZXBhcmVUZW1wbGF0ZShlLG4saSl7dC5mbHVzaEN1c3RvbVN0eWxlcygpLHQucHJlcGFyZVRlbXBsYXRlKGUsbil9LHByZXBhcmVUZW1wbGF0ZVN0eWxlcyh0LGUsbil7d2luZG93LlNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZSh0LGUsbil9LHByZXBhcmVUZW1wbGF0ZURvbSh0LGUpe30sc3R5bGVTdWJ0cmVlKGUsbil7dC5mbHVzaEN1c3RvbVN0eWxlcygpLHQuc3R5bGVTdWJ0cmVlKGUsbil9LHN0eWxlRWxlbWVudChlKXt0LmZsdXNoQ3VzdG9tU3R5bGVzKCksdC5zdHlsZUVsZW1lbnQoZSl9LHN0eWxlRG9jdW1lbnQoZSl7dC5mbHVzaEN1c3RvbVN0eWxlcygpLHQuc3R5bGVEb2N1bWVudChlKX0sZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlOih0LGUpPT50bih0LGUpLGZsdXNoQ3VzdG9tU3R5bGVzKCl7dC5mbHVzaEN1c3RvbVN0eWxlcygpfSxuYXRpdmVDc3M6a2UsbmF0aXZlU2hhZG93Ok1lLGNzc0J1aWxkOlRlLGRpc2FibGVSdW50aW1lOkFlfSxlJiYod2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlPWUpfXdpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW09TW47Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNsYXNzIFRue2NvbnN0cnVjdG9yKCl7dGhpcy5fYXN5bmNNb2R1bGU9bnVsbCx0aGlzLl9jYWxsYmFjaz1udWxsLHRoaXMuX3RpbWVyPW51bGx9c2V0Q29uZmlnKHQsZSl7dGhpcy5fYXN5bmNNb2R1bGU9dCx0aGlzLl9jYWxsYmFjaz1lLHRoaXMuX3RpbWVyPXRoaXMuX2FzeW5jTW9kdWxlLnJ1bigoKCk9Pnt0aGlzLl90aW1lcj1udWxsLENuLmRlbGV0ZSh0aGlzKSx0aGlzLl9jYWxsYmFjaygpfSkpfWNhbmNlbCgpe3RoaXMuaXNBY3RpdmUoKSYmKHRoaXMuX2NhbmNlbEFzeW5jKCksQ24uZGVsZXRlKHRoaXMpKX1fY2FuY2VsQXN5bmMoKXt0aGlzLmlzQWN0aXZlKCkmJih0aGlzLl9hc3luY01vZHVsZS5jYW5jZWwodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPW51bGwpfWZsdXNoKCl7dGhpcy5pc0FjdGl2ZSgpJiYodGhpcy5jYW5jZWwoKSx0aGlzLl9jYWxsYmFjaygpKX1pc0FjdGl2ZSgpe3JldHVybiBudWxsIT10aGlzLl90aW1lcn1zdGF0aWMgZGVib3VuY2UodCxlLG4pe3JldHVybiB0IGluc3RhbmNlb2YgVG4/dC5fY2FuY2VsQXN5bmMoKTp0PW5ldyBUbix0LnNldENvbmZpZyhlLG4pLHR9fWxldCBDbj1uZXcgU2V0O2NvbnN0IEFuPWZ1bmN0aW9uKHQpe0NuLmFkZCh0KX0sa249ZnVuY3Rpb24oKXtjb25zdCB0PUJvb2xlYW4oQ24uc2l6ZSk7cmV0dXJuIENuLmZvckVhY2goKHQ9Pnt0cnl7dC5mbHVzaCgpfWNhdGNoKHQpe3NldFRpbWVvdXQoKCgpPT57dGhyb3cgdH0pKX19KSksdH07Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmxldCBMbj0ic3RyaW5nIj09dHlwZW9mIGRvY3VtZW50LmhlYWQuc3R5bGUudG91Y2hBY3Rpb24sUG49Il9fcG9seW1lckdlc3R1cmVzIixObj0iX19wb2x5bWVyR2VzdHVyZXNIYW5kbGVkIixJbj0iX19wb2x5bWVyR2VzdHVyZXNUb3VjaEFjdGlvbiIsUm49WyJtb3VzZWRvd24iLCJtb3VzZW1vdmUiLCJtb3VzZXVwIiwiY2xpY2siXSxPbj1bMCwxLDQsMl0sem49KGZ1bmN0aW9uKCl7dHJ5e3JldHVybiAxPT09bmV3IE1vdXNlRXZlbnQoInRlc3QiLHtidXR0b25zOjF9KS5idXR0b25zfWNhdGNoKHQpe3JldHVybiExfX0pKCk7ZnVuY3Rpb24gRG4odCl7cmV0dXJuIFJuLmluZGV4T2YodCk+LTF9bGV0IEJuPSExO2Z1bmN0aW9uIEhuKHQpe2lmKCFEbih0KSYmInRvdWNoZW5kIiE9PXQpcmV0dXJuIExuJiZCbiYmdj97cGFzc2l2ZTohMH06dm9pZCAwfSEoZnVuY3Rpb24oKXt0cnl7bGV0IHQ9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJwYXNzaXZlIix7Z2V0KCl7Qm49ITB9fSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLG51bGwsdCksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRlc3QiLG51bGwsdCl9Y2F0Y2godCl7fX0pKCk7bGV0IEZuPW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQKD86W29hXWR8aG9uZSl8QW5kcm9pZC8pO2NvbnN0IFZuPVtdLFVuPXtidXR0b246ITAsaW5wdXQ6ITAsa2V5Z2VuOiEwLG1ldGVyOiEwLG91dHB1dDohMCx0ZXh0YXJlYTohMCxwcm9ncmVzczohMCxzZWxlY3Q6ITB9LGpuPXtidXR0b246ITAsY29tbWFuZDohMCxmaWVsZHNldDohMCxpbnB1dDohMCxrZXlnZW46ITAsb3B0Z3JvdXA6ITAsb3B0aW9uOiEwLHNlbGVjdDohMCx0ZXh0YXJlYTohMH07ZnVuY3Rpb24gR24odCl7bGV0IGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodC5sYWJlbHN8fFtdKTtpZighZS5sZW5ndGgpe2U9W107bGV0IG49dC5nZXRSb290Tm9kZSgpO2lmKHQuaWQpe2xldCBpPW4ucXVlcnlTZWxlY3RvckFsbChgbGFiZWxbZm9yID0gJHt0LmlkfV1gKTtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrKyllLnB1c2goaVt0XSl9fXJldHVybiBlfWxldCBXbj1mdW5jdGlvbih0KXtsZXQgZT10LnNvdXJjZUNhcGFiaWxpdGllcztpZigoIWV8fGUuZmlyZXNUb3VjaEV2ZW50cykmJih0W05uXT17c2tpcDohMH0sImNsaWNrIj09PXQudHlwZSkpe2xldCBlPSExLG49Sm4odCk7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0Kyspe2lmKG5bdF0ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSlpZigibGFiZWwiPT09blt0XS5sb2NhbE5hbWUpVm4ucHVzaChuW3RdKTtlbHNlIGlmKFVuW25bdF0ubG9jYWxOYW1lXSl7bGV0IGk9R24oblt0XSk7Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0KyspZT1lfHxWbi5pbmRleE9mKGlbdF0pPi0xfWlmKG5bdF09PT1Ybi5tb3VzZS50YXJnZXQpcmV0dXJufWlmKGUpcmV0dXJuO3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpfX07ZnVuY3Rpb24gcW4odCl7bGV0IGU9Rm4/WyJjbGljayJdOlJuO2ZvcihsZXQgbixpPTA7aTxlLmxlbmd0aDtpKyspbj1lW2ldLHQ/KFZuLmxlbmd0aD0wLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIobixXbiwhMCkpOmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIobixXbiwhMCl9ZnVuY3Rpb24gWW4odCl7bGV0IGU9dC50eXBlO2lmKCFEbihlKSlyZXR1cm4hMTtpZigibW91c2Vtb3ZlIj09PWUpe2xldCBlPXZvaWQgMD09PXQuYnV0dG9ucz8xOnQuYnV0dG9ucztyZXR1cm4gdCBpbnN0YW5jZW9mIHdpbmRvdy5Nb3VzZUV2ZW50JiYhem4mJihlPU9uW3Qud2hpY2hdfHwwKSxCb29sZWFuKDEmZSl9cmV0dXJuIDA9PT0odm9pZCAwPT09dC5idXR0b24/MDp0LmJ1dHRvbil9bGV0IFhuPXttb3VzZTp7dGFyZ2V0Om51bGwsbW91c2VJZ25vcmVKb2I6bnVsbH0sdG91Y2g6e3g6MCx5OjAsaWQ6LTEsc2Nyb2xsRGVjaWRlZDohMX19O2Z1bmN0aW9uICRuKHQsZSxuKXt0Lm1vdmVmbj1lLHQudXBmbj1uLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsZSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsbil9ZnVuY3Rpb24gS24odCl7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0Lm1vdmVmbiksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsdC51cGZuKSx0Lm1vdmVmbj1udWxsLHQudXBmbj1udWxsfWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwoZnVuY3Rpb24gWm4odCl7WG4ubW91c2UubW91c2VJZ25vcmVKb2J8fHFuKCEwKSxYbi5tb3VzZS50YXJnZXQ9Sm4odClbMF0sWG4ubW91c2UubW91c2VJZ25vcmVKb2I9VG4uZGVib3VuY2UoWG4ubW91c2UubW91c2VJZ25vcmVKb2IsZ3QuYWZ0ZXIoMjUwMCksKGZ1bmN0aW9uKCl7cW4oKSxYbi5tb3VzZS50YXJnZXQ9bnVsbCxYbi5tb3VzZS5tb3VzZUlnbm9yZUpvYj1udWxsfSkpfSksISFCbiYme3Bhc3NpdmU6ITB9KTtjb25zdCBKbj13aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS5ub1BhdGNoP3dpbmRvdy5TaGFkeURPTS5jb21wb3NlZFBhdGg6dD0+dC5jb21wb3NlZFBhdGgmJnQuY29tcG9zZWRQYXRoKCl8fFtdLFFuPXt9LHRpPVtdO2Z1bmN0aW9uIGVpKHQpe2NvbnN0IGU9Sm4odCk7cmV0dXJuIGUubGVuZ3RoPjA/ZVswXTp0LnRhcmdldH1mdW5jdGlvbiBuaSh0KXtsZXQgZSxuPXQudHlwZSxpPXQuY3VycmVudFRhcmdldFtQbl07aWYoIWkpcmV0dXJuO2xldCByPWlbbl07aWYocil7aWYoIXRbTm5dJiYodFtObl09e30sInRvdWNoIj09PW4uc2xpY2UoMCw1KSkpe2xldCBlPSh0PXQpLmNoYW5nZWRUb3VjaGVzWzBdO2lmKCJ0b3VjaHN0YXJ0Ij09PW4mJjE9PT10LnRvdWNoZXMubGVuZ3RoJiYoWG4udG91Y2guaWQ9ZS5pZGVudGlmaWVyKSxYbi50b3VjaC5pZCE9PWUuaWRlbnRpZmllcilyZXR1cm47TG58fCJ0b3VjaHN0YXJ0IiE9PW4mJiJ0b3VjaG1vdmUiIT09bnx8KGZ1bmN0aW9uIG8odCl7bGV0IGU9dC5jaGFuZ2VkVG91Y2hlc1swXSxuPXQudHlwZTtpZigidG91Y2hzdGFydCI9PT1uKVhuLnRvdWNoLng9ZS5jbGllbnRYLFhuLnRvdWNoLnk9ZS5jbGllbnRZLFhuLnRvdWNoLnNjcm9sbERlY2lkZWQ9ITE7ZWxzZSBpZigidG91Y2htb3ZlIj09PW4pe2lmKFhuLnRvdWNoLnNjcm9sbERlY2lkZWQpcmV0dXJuO1huLnRvdWNoLnNjcm9sbERlY2lkZWQ9ITA7bGV0IG49KGZ1bmN0aW9uIGkodCl7bGV0IGU9ImF1dG8iLG49Sm4odCk7Zm9yKGxldCB0LGk9MDtpPG4ubGVuZ3RoO2krKylpZih0PW5baV0sdFtJbl0pe2U9dFtJbl07YnJlYWt9cmV0dXJuIGV9KSh0KSxpPSExLHI9TWF0aC5hYnMoWG4udG91Y2gueC1lLmNsaWVudFgpLG89TWF0aC5hYnMoWG4udG91Y2gueS1lLmNsaWVudFkpO3QuY2FuY2VsYWJsZSYmKCJub25lIj09PW4/aT0hMDoicGFuLXgiPT09bj9pPW8+cjoicGFuLXkiPT09biYmKGk9cj5vKSksaT90LnByZXZlbnREZWZhdWx0KCk6c2koInRyYWNrIil9fSkodCl9aWYoZT10W05uXSwhZS5za2lwKXtmb3IobGV0IG4saT0wO2k8dGkubGVuZ3RoO2krKyluPXRpW2ldLHJbbi5uYW1lXSYmIWVbbi5uYW1lXSYmbi5mbG93JiZuLmZsb3cuc3RhcnQuaW5kZXhPZih0LnR5cGUpPi0xJiZuLnJlc2V0JiZuLnJlc2V0KCk7Zm9yKGxldCBpLG89MDtvPHRpLmxlbmd0aDtvKyspaT10aVtvXSxyW2kubmFtZV0mJiFlW2kubmFtZV0mJihlW2kubmFtZV09ITAsaVtuXSh0KSl9fX1mdW5jdGlvbiBpaSh0LGUsbil7cmV0dXJuISFRbltlXSYmKChmdW5jdGlvbiBpKHQsZSxuKXtsZXQgaT1RbltlXSxyPWkuZGVwcyxvPWkubmFtZSxhPXRbUG5dO2F8fCh0W1BuXT1hPXt9KTtmb3IobGV0IGUsbixpPTA7aTxyLmxlbmd0aDtpKyspZT1yW2ldLEZuJiZEbihlKSYmImNsaWNrIiE9PWV8fChuPWFbZV0sbnx8KGFbZV09bj17X2NvdW50OjB9KSwwPT09bi5fY291bnQmJnQuYWRkRXZlbnRMaXN0ZW5lcihlLG5pLEhuKGUpKSxuW29dPShuW29dfHwwKSsxLG4uX2NvdW50PShuLl9jb3VudHx8MCkrMSk7dC5hZGRFdmVudExpc3RlbmVyKGUsbiksaS50b3VjaEFjdGlvbiYmb2kodCxpLnRvdWNoQWN0aW9uKX0pKHQsZSxuKSwhMCl9ZnVuY3Rpb24gcmkodCl7dGkucHVzaCh0KTtmb3IobGV0IGU9MDtlPHQuZW1pdHMubGVuZ3RoO2UrKylRblt0LmVtaXRzW2VdXT10fWZ1bmN0aW9uIG9pKHQsZSl7TG4mJnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmdnQucnVuKCgoKT0+e3Quc3R5bGUudG91Y2hBY3Rpb249ZX0pKSx0W0luXT1lfWZ1bmN0aW9uIGFpKHQsZSxuKXtsZXQgaT1uZXcgRXZlbnQoZSx7YnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNvbXBvc2VkOiEwfSk7aWYoaS5kZXRhaWw9bixZKHQpLmRpc3BhdGNoRXZlbnQoaSksaS5kZWZhdWx0UHJldmVudGVkKXtsZXQgdD1uLnByZXZlbnRlcnx8bi5zb3VyY2VFdmVudDt0JiZ0LnByZXZlbnREZWZhdWx0JiZ0LnByZXZlbnREZWZhdWx0KCl9fWZ1bmN0aW9uIHNpKHQpe2xldCBlPShmdW5jdGlvbiBuKHQpe2ZvcihsZXQgZSxuPTA7bjx0aS5sZW5ndGg7bisrKXtlPXRpW25dO2ZvcihsZXQgbixpPTA7aTxlLmVtaXRzLmxlbmd0aDtpKyspaWYobj1lLmVtaXRzW2ldLG49PT10KXJldHVybiBlfXJldHVybiBudWxsfSkodCk7ZS5pbmZvJiYoZS5pbmZvLnByZXZlbnQ9ITApfWZ1bmN0aW9uIGxpKHQsZSxuLGkpe2UmJmFpKGUsdCx7eDpuLmNsaWVudFgseTpuLmNsaWVudFksc291cmNlRXZlbnQ6bixwcmV2ZW50ZXI6aSxwcmV2ZW50OmZ1bmN0aW9uKHQpe3JldHVybiBzaSh0KX19KX1mdW5jdGlvbiBjaSh0LGUsbil7aWYodC5wcmV2ZW50KXJldHVybiExO2lmKHQuc3RhcnRlZClyZXR1cm4hMDtsZXQgaT1NYXRoLmFicyh0LngtZSkscj1NYXRoLmFicyh0Lnktbik7cmV0dXJuIGk+PTV8fHI+PTV9ZnVuY3Rpb24gdWkodCxlLG4pe2lmKCFlKXJldHVybjtsZXQgaSxyPXQubW92ZXNbdC5tb3Zlcy5sZW5ndGgtMl0sbz10Lm1vdmVzW3QubW92ZXMubGVuZ3RoLTFdLGE9MDtyJiYoaT1vLngtci54LGE9by55LXIueSksYWkoZSwidHJhY2siLHtzdGF0ZTp0LnN0YXRlLHg6bi5jbGllbnRYLHk6bi5jbGllbnRZLGR4Om8ueC10LngsZHk6by55LXQueSxkZHg6aSxkZHk6YSxzb3VyY2VFdmVudDpuLGhvdmVyOmZ1bmN0aW9uKCl7cmV0dXJuKGZ1bmN0aW9uIHQoZSxuKXtsZXQgaT1kb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGUsbikscj1pO2Zvcig7ciYmci5zaGFkb3dSb290JiYhd2luZG93LlNoYWR5RE9NOyl7bGV0IHQ9cjtpZihyPXIuc2hhZG93Um9vdC5lbGVtZW50RnJvbVBvaW50KGUsbiksdD09PXIpYnJlYWs7ciYmKGk9cil9cmV0dXJuIGl9KShuLmNsaWVudFgsbi5jbGllbnRZKX19KX1mdW5jdGlvbiBoaSh0LGUsbil7bGV0IGk9TWF0aC5hYnMoZS5jbGllbnRYLXQueCkscj1NYXRoLmFicyhlLmNsaWVudFktdC55KSxvPWVpKG58fGUpOyFvfHxqbltvLmxvY2FsTmFtZV0mJm8uaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpfHwoaXNOYU4oaSl8fGlzTmFOKHIpfHxpPD0yNSYmcjw9MjV8fChmdW5jdGlvbiBhKHQpe2lmKCJjbGljayI9PT10LnR5cGUpe2lmKDA9PT10LmRldGFpbClyZXR1cm4hMDtsZXQgZT1laSh0KTtpZighZS5ub2RlVHlwZXx8ZS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFKXJldHVybiEwO2xldCBuPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksaT10LnBhZ2VYLHI9dC5wYWdlWTtyZXR1cm4hKGk+PW4ubGVmdCYmaTw9bi5yaWdodCYmcj49bi50b3AmJnI8PW4uYm90dG9tKX1yZXR1cm4hMX0pKGUpKSYmKHQucHJldmVudHx8YWkobywidGFwIix7eDplLmNsaWVudFgseTplLmNsaWVudFksc291cmNlRXZlbnQ6ZSxwcmV2ZW50ZXI6bn0pKX1yaSh7bmFtZToiZG93bnVwIixkZXBzOlsibW91c2Vkb3duIiwidG91Y2hzdGFydCIsInRvdWNoZW5kIl0sZmxvdzp7c3RhcnQ6WyJtb3VzZWRvd24iLCJ0b3VjaHN0YXJ0Il0sZW5kOlsibW91c2V1cCIsInRvdWNoZW5kIl19LGVtaXRzOlsiZG93biIsInVwIl0saW5mbzp7bW92ZWZuOm51bGwsdXBmbjpudWxsfSxyZXNldDpmdW5jdGlvbigpe0tuKHRoaXMuaW5mbyl9LG1vdXNlZG93bjpmdW5jdGlvbih0KXtpZighWW4odCkpcmV0dXJuO2xldCBlPWVpKHQpLG49dGhpczskbih0aGlzLmluZm8sKGZ1bmN0aW9uIHQoaSl7WW4oaSl8fChsaSgidXAiLGUsaSksS24obi5pbmZvKSl9KSwoZnVuY3Rpb24gdChpKXtZbihpKSYmbGkoInVwIixlLGkpLEtuKG4uaW5mbyl9KSksbGkoImRvd24iLGUsdCl9LHRvdWNoc3RhcnQ6ZnVuY3Rpb24odCl7bGkoImRvd24iLGVpKHQpLHQuY2hhbmdlZFRvdWNoZXNbMF0sdCl9LHRvdWNoZW5kOmZ1bmN0aW9uKHQpe2xpKCJ1cCIsZWkodCksdC5jaGFuZ2VkVG91Y2hlc1swXSx0KX19KSxyaSh7bmFtZToidHJhY2siLHRvdWNoQWN0aW9uOiJub25lIixkZXBzOlsibW91c2Vkb3duIiwidG91Y2hzdGFydCIsInRvdWNobW92ZSIsInRvdWNoZW5kIl0sZmxvdzp7c3RhcnQ6WyJtb3VzZWRvd24iLCJ0b3VjaHN0YXJ0Il0sZW5kOlsibW91c2V1cCIsInRvdWNoZW5kIl19LGVtaXRzOlsidHJhY2siXSxpbmZvOnt4OjAseTowLHN0YXRlOiJzdGFydCIsc3RhcnRlZDohMSxtb3ZlczpbXSxhZGRNb3ZlOmZ1bmN0aW9uKHQpe3RoaXMubW92ZXMubGVuZ3RoPjImJnRoaXMubW92ZXMuc2hpZnQoKSx0aGlzLm1vdmVzLnB1c2godCl9LG1vdmVmbjpudWxsLHVwZm46bnVsbCxwcmV2ZW50OiExfSxyZXNldDpmdW5jdGlvbigpe3RoaXMuaW5mby5zdGF0ZT0ic3RhcnQiLHRoaXMuaW5mby5zdGFydGVkPSExLHRoaXMuaW5mby5tb3Zlcz1bXSx0aGlzLmluZm8ueD0wLHRoaXMuaW5mby55PTAsdGhpcy5pbmZvLnByZXZlbnQ9ITEsS24odGhpcy5pbmZvKX0sbW91c2Vkb3duOmZ1bmN0aW9uKHQpe2lmKCFZbih0KSlyZXR1cm47bGV0IGU9ZWkodCksbj10aGlzLGk9ZnVuY3Rpb24gdChpKXtsZXQgcj1pLmNsaWVudFgsbz1pLmNsaWVudFk7Y2kobi5pbmZvLHIsbykmJihuLmluZm8uc3RhdGU9bi5pbmZvLnN0YXJ0ZWQ/Im1vdXNldXAiPT09aS50eXBlPyJlbmQiOiJ0cmFjayI6InN0YXJ0Iiwic3RhcnQiPT09bi5pbmZvLnN0YXRlJiZzaSgidGFwIiksbi5pbmZvLmFkZE1vdmUoe3g6cix5Om99KSxZbihpKXx8KG4uaW5mby5zdGF0ZT0iZW5kIixLbihuLmluZm8pKSxlJiZ1aShuLmluZm8sZSxpKSxuLmluZm8uc3RhcnRlZD0hMCl9OyRuKHRoaXMuaW5mbyxpLChmdW5jdGlvbiB0KGUpe24uaW5mby5zdGFydGVkJiZpKGUpLEtuKG4uaW5mbyl9KSksdGhpcy5pbmZvLng9dC5jbGllbnRYLHRoaXMuaW5mby55PXQuY2xpZW50WX0sdG91Y2hzdGFydDpmdW5jdGlvbih0KXtsZXQgZT10LmNoYW5nZWRUb3VjaGVzWzBdO3RoaXMuaW5mby54PWUuY2xpZW50WCx0aGlzLmluZm8ueT1lLmNsaWVudFl9LHRvdWNobW92ZTpmdW5jdGlvbih0KXtsZXQgZT1laSh0KSxuPXQuY2hhbmdlZFRvdWNoZXNbMF0saT1uLmNsaWVudFgscj1uLmNsaWVudFk7Y2kodGhpcy5pbmZvLGkscikmJigic3RhcnQiPT09dGhpcy5pbmZvLnN0YXRlJiZzaSgidGFwIiksdGhpcy5pbmZvLmFkZE1vdmUoe3g6aSx5OnJ9KSx1aSh0aGlzLmluZm8sZSxuKSx0aGlzLmluZm8uc3RhdGU9InRyYWNrIix0aGlzLmluZm8uc3RhcnRlZD0hMCl9LHRvdWNoZW5kOmZ1bmN0aW9uKHQpe2xldCBlPWVpKHQpLG49dC5jaGFuZ2VkVG91Y2hlc1swXTt0aGlzLmluZm8uc3RhcnRlZCYmKHRoaXMuaW5mby5zdGF0ZT0iZW5kIix0aGlzLmluZm8uYWRkTW92ZSh7eDpuLmNsaWVudFgseTpuLmNsaWVudFl9KSx1aSh0aGlzLmluZm8sZSxuKSl9fSkscmkoe25hbWU6InRhcCIsZGVwczpbIm1vdXNlZG93biIsImNsaWNrIiwidG91Y2hzdGFydCIsInRvdWNoZW5kIl0sZmxvdzp7c3RhcnQ6WyJtb3VzZWRvd24iLCJ0b3VjaHN0YXJ0Il0sZW5kOlsiY2xpY2siLCJ0b3VjaGVuZCJdfSxlbWl0czpbInRhcCJdLGluZm86e3g6TmFOLHk6TmFOLHByZXZlbnQ6ITF9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5pbmZvLng9TmFOLHRoaXMuaW5mby55PU5hTix0aGlzLmluZm8ucHJldmVudD0hMX0sbW91c2Vkb3duOmZ1bmN0aW9uKHQpe1luKHQpJiYodGhpcy5pbmZvLng9dC5jbGllbnRYLHRoaXMuaW5mby55PXQuY2xpZW50WSl9LGNsaWNrOmZ1bmN0aW9uKHQpe1luKHQpJiZoaSh0aGlzLmluZm8sdCl9LHRvdWNoc3RhcnQ6ZnVuY3Rpb24odCl7Y29uc3QgZT10LmNoYW5nZWRUb3VjaGVzWzBdO3RoaXMuaW5mby54PWUuY2xpZW50WCx0aGlzLmluZm8ueT1lLmNsaWVudFl9LHRvdWNoZW5kOmZ1bmN0aW9uKHQpe2hpKHRoaXMuaW5mbyx0LmNoYW5nZWRUb3VjaGVzWzBdLHQpfX0pO2NvbnN0IGRpPWVpLHBpPUkoKHQ9PmNsYXNzIGV4dGVuZHMgdHtfYWRkRXZlbnRMaXN0ZW5lclRvTm9kZSh0LGUsbil7aWkodCxlLG4pfHxzdXBlci5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZSh0LGUsbil9X3JlbW92ZUV2ZW50TGlzdGVuZXJGcm9tTm9kZSh0LGUsbil7KGZ1bmN0aW9uIGkodCxlLG4pe3JldHVybiEhUW5bZV0mJigoZnVuY3Rpb24gaSh0LGUsbil7bGV0IGk9UW5bZV0scj1pLmRlcHMsbz1pLm5hbWUsYT10W1BuXTtpZihhKWZvcihsZXQgZSxuLGk9MDtpPHIubGVuZ3RoO2krKyllPXJbaV0sbj1hW2VdLG4mJm5bb10mJihuW29dPShuW29dfHwxKS0xLG4uX2NvdW50PShuLl9jb3VudHx8MSktMSwwPT09bi5fY291bnQmJnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLG5pLEhuKGUpKSk7dC5yZW1vdmVFdmVudExpc3RlbmVyKGUsbil9KSh0LGUsbiksITApfSkodCxlLG4pfHxzdXBlci5fcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21Ob2RlKHQsZSxuKX19KSksZmk9Lzpob3N0XCg6ZGlyXCgobHRyfHJ0bClcKVwpL2csbWk9LyhbXHNcdy0jXC5cW1xdXCpdKik6ZGlyXCgobHRyfHJ0bClcKS9nLGdpPS86ZGlyXCgoPzpsdHJ8cnRsKVwpLyxfaT1Cb29sZWFuKHdpbmRvdy5TaGFkeURPTSYmd2luZG93LlNoYWR5RE9NLmluVXNlKSx5aT1bXTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9sZXQgdmk9bnVsbCxiaT0iIjtmdW5jdGlvbiB4aSgpe2JpPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoImRpciIpfWZ1bmN0aW9uIHdpKHQpe3QuX19hdXRvRGlyT3B0T3V0fHx0LnNldEF0dHJpYnV0ZSgiZGlyIixiaSl9ZnVuY3Rpb24gU2koKXt4aSgpLGJpPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoImRpciIpO2ZvcihsZXQgdD0wO3Q8eWkubGVuZ3RoO3QrKyl3aSh5aVt0XSl9Y29uc3QgTWk9SSgodD0+e19pfHx2aXx8KHhpKCksdmk9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoU2kpLHZpLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHthdHRyaWJ1dGVzOiEwLGF0dHJpYnV0ZUZpbHRlcjpbImRpciJdfSkpO2NvbnN0IGU9TXQodCk7Y2xhc3MgbiBleHRlbmRzIGV7c3RhdGljIF9wcm9jZXNzU3R5bGVUZXh0KHQsbil7cmV0dXJuIHQ9ZS5fcHJvY2Vzc1N0eWxlVGV4dC5jYWxsKHRoaXMsdCxuKSwhX2kmJmdpLnRlc3QodCkmJih0PXRoaXMuX3JlcGxhY2VEaXJJbkNzc1RleHQodCksdGhpcy5fX2FjdGl2YXRlRGlyPSEwKSx0fXN0YXRpYyBfcmVwbGFjZURpckluQ3NzVGV4dCh0KXtsZXQgZT10O3JldHVybiBlPWUucmVwbGFjZShmaSwnOmhvc3QoW2Rpcj0iJDEiXSknKSxlPWUucmVwbGFjZShtaSwnOmhvc3QoW2Rpcj0iJDIiXSkgJDEnKSxlfWNvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9fYXV0b0Rpck9wdE91dD0hMX1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5fX2F1dG9EaXJPcHRPdXQ9dGhpcy5oYXNBdHRyaWJ1dGUoImRpciIpfWNvbm5lY3RlZENhbGxiYWNrKCl7ZS5wcm90b3R5cGUuY29ubmVjdGVkQ2FsbGJhY2smJnN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCksdGhpcy5jb25zdHJ1Y3Rvci5fX2FjdGl2YXRlRGlyJiYoKGZ1bmN0aW9uIHQoKXt2aSYmdmkudGFrZVJlY29yZHMoKS5sZW5ndGgmJlNpKCl9KSgpLHlpLnB1c2godGhpcyksd2kodGhpcykpfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7aWYoZS5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2smJnN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCksdGhpcy5jb25zdHJ1Y3Rvci5fX2FjdGl2YXRlRGlyKXtjb25zdCB0PXlpLmluZGV4T2YodGhpcyk7dD4tMSYmeWkuc3BsaWNlKHQsMSl9fX1yZXR1cm4gbi5fX2FjdGl2YXRlRGlyPSExLG59KSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovbGV0IEVpPSExLFRpPVtdLENpPVtdO2Z1bmN0aW9uIEFpKCl7RWk9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKChmdW5jdGlvbigpe0VpPSExLChmdW5jdGlvbiB0KGUpe2Zvcig7ZS5sZW5ndGg7KWtpKGUuc2hpZnQoKSl9KShUaSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXshKGZ1bmN0aW9uIHQoZSl7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aDt0PG47dCsrKWtpKGUuc2hpZnQoKSl9KShDaSl9KSl9KSl9ZnVuY3Rpb24ga2kodCl7Y29uc3QgZT10WzBdLG49dFsxXSxpPXRbMl07dHJ5e24uYXBwbHkoZSxpKX1jYXRjaCh0KXtzZXRUaW1lb3V0KCgoKT0+e3Rocm93IHR9KSl9fWZ1bmN0aW9uIExpKHQsZSxuKXtFaXx8QWkoKSxDaS5wdXNoKFt0LGUsbl0pfQovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL2Z1bmN0aW9uIFBpKCl7ZG9jdW1lbnQuYm9keS5yZW1vdmVBdHRyaWJ1dGUoInVucmVzb2x2ZWQiKX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KZnVuY3Rpb24gTmkodCxlLG4pe3JldHVybntpbmRleDp0LHJlbW92ZWQ6ZSxhZGRlZENvdW50Om59fWZ1bmN0aW9uIElpKHQsZSl7cmV0dXJuKGZ1bmN0aW9uIG4odCxlLGkscixvLGEpe2xldCBzLGw9MCxjPTAsdT1NYXRoLm1pbihpLWUsYS1vKTtpZigwPT1lJiYwPT1vJiYobD0oZnVuY3Rpb24gaCh0LGUsbil7Zm9yKGxldCBpPTA7aTxuO2krKylpZighUmkodFtpXSxlW2ldKSlyZXR1cm4gaTtyZXR1cm4gbn0pKHQscix1KSksaT09dC5sZW5ndGgmJmE9PXIubGVuZ3RoJiYoYz0oZnVuY3Rpb24gZCh0LGUsbil7bGV0IGk9dC5sZW5ndGgscj1lLmxlbmd0aCxvPTA7Zm9yKDtvPG4mJlJpKHRbLS1pXSxlWy0tcl0pOylvKys7cmV0dXJuIG99KSh0LHIsdS1sKSksbys9bCxhLT1jLChpLT1jKS0oZSs9bCk9PTAmJmEtbz09MClyZXR1cm5bXTtpZihlPT1pKXtmb3Iocz1OaShlLFtdLDApO288YTspcy5yZW1vdmVkLnB1c2gocltvKytdKTtyZXR1cm5bc119aWYobz09YSlyZXR1cm5bTmkoZSxbXSxpLWUpXTtsZXQgcD0oZnVuY3Rpb24gbSh0KXtsZXQgZT10Lmxlbmd0aC0xLG49dFswXS5sZW5ndGgtMSxpPXRbZV1bbl0scj1bXTtmb3IoO2U+MHx8bj4wOyl7aWYoMD09ZSl7ci5wdXNoKDIpLG4tLTtjb250aW51ZX1pZigwPT1uKXtyLnB1c2goMyksZS0tO2NvbnRpbnVlfWxldCBvLGE9dFtlLTFdW24tMV0scz10W2UtMV1bbl0sbD10W2VdW24tMV07bz1zPGw/czxhP3M6YTpsPGE/bDphLG89PWE/KGE9PWk/ci5wdXNoKDApOihyLnB1c2goMSksaT1hKSxlLS0sbi0tKTpvPT1zPyhyLnB1c2goMyksZS0tLGk9cyk6KHIucHVzaCgyKSxuLS0saT1sKX1yZXR1cm4gci5yZXZlcnNlKCkscn0pKChmdW5jdGlvbiBmKHQsZSxuLGkscixvKXtsZXQgYT1vLXIrMSxzPW4tZSsxLGw9bmV3IEFycmF5KGEpO2ZvcihsZXQgdD0wO3Q8YTt0KyspbFt0XT1uZXcgQXJyYXkocyksbFt0XVswXT10O2ZvcihsZXQgdD0wO3Q8czt0KyspbFswXVt0XT10O2ZvcihsZXQgbj0xO248YTtuKyspZm9yKGxldCBvPTE7bzxzO28rKylpZihSaSh0W2Urby0xXSxpW3Irbi0xXSkpbFtuXVtvXT1sW24tMV1bby0xXTtlbHNle2xldCB0PWxbbi0xXVtvXSsxLGU9bFtuXVtvLTFdKzE7bFtuXVtvXT10PGU/dDplfXJldHVybiBsfSkodCxlLGkscixvLGEpKTtzPXZvaWQgMDtsZXQgZz1bXSxfPWUseT1vO2ZvcihsZXQgdD0wO3Q8cC5sZW5ndGg7dCsrKXN3aXRjaChwW3RdKXtjYXNlIDA6cyYmKGcucHVzaChzKSxzPXZvaWQgMCksXysrLHkrKzticmVhaztjYXNlIDE6c3x8KHM9TmkoXyxbXSwwKSkscy5hZGRlZENvdW50KyssXysrLHMucmVtb3ZlZC5wdXNoKHJbeV0pLHkrKzticmVhaztjYXNlIDI6c3x8KHM9TmkoXyxbXSwwKSkscy5hZGRlZENvdW50KyssXysrO2JyZWFrO2Nhc2UgMzpzfHwocz1OaShfLFtdLDApKSxzLnJlbW92ZWQucHVzaChyW3ldKSx5Kyt9cmV0dXJuIHMmJmcucHVzaChzKSxnfSkodCwwLHQubGVuZ3RoLGUsMCxlLmxlbmd0aCl9ZnVuY3Rpb24gUmkodCxlKXtyZXR1cm4gdD09PWV9Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovZnVuY3Rpb24gT2kodCl7cmV0dXJuInNsb3QiPT09dC5sb2NhbE5hbWV9ImludGVyYWN0aXZlIj09PWRvY3VtZW50LnJlYWR5U3RhdGV8fCJjb21wbGV0ZSI9PT1kb2N1bWVudC5yZWFkeVN0YXRlP1BpKCk6d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLFBpKTtsZXQgemk9Y2xhc3N7c3RhdGljIGdldEZsYXR0ZW5lZE5vZGVzKHQpe2NvbnN0IGU9WSh0KTtyZXR1cm4gT2kodCk/KHQ9dCxlLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46ITB9KSk6QXJyYXkuZnJvbShlLmNoaWxkTm9kZXMpLm1hcCgodD0+T2kodCk/WSh0PXQpLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46ITB9KTpbdF0pKS5yZWR1Y2UoKCh0LGUpPT50LmNvbmNhdChlKSksW10pfWNvbnN0cnVjdG9yKHQsZSl7dGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyPW51bGwsdGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlcj1udWxsLHRoaXMuX2Nvbm5lY3RlZD0hMSx0aGlzLl90YXJnZXQ9dCx0aGlzLmNhbGxiYWNrPWUsdGhpcy5fZWZmZWN0aXZlTm9kZXM9W10sdGhpcy5fb2JzZXJ2ZXI9bnVsbCx0aGlzLl9zY2hlZHVsZWQ9ITEsdGhpcy5fYm91bmRTY2hlZHVsZT0oKT0+e3RoaXMuX3NjaGVkdWxlKCl9LHRoaXMuY29ubmVjdCgpLHRoaXMuX3NjaGVkdWxlKCl9Y29ubmVjdCgpe09pKHRoaXMuX3RhcmdldCk/dGhpcy5fbGlzdGVuU2xvdHMoW3RoaXMuX3RhcmdldF0pOlkodGhpcy5fdGFyZ2V0KS5jaGlsZHJlbiYmKHRoaXMuX2xpc3RlblNsb3RzKFkodGhpcy5fdGFyZ2V0KS5jaGlsZHJlbiksd2luZG93LlNoYWR5RE9NP3RoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlcj13aW5kb3cuU2hhZHlET00ub2JzZXJ2ZUNoaWxkcmVuKHRoaXMuX3RhcmdldCwodD0+e3RoaXMuX3Byb2Nlc3NNdXRhdGlvbnModCl9KSk6KHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXI9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoKHQ9Pnt0aGlzLl9wcm9jZXNzTXV0YXRpb25zKHQpfSkpLHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl90YXJnZXQse2NoaWxkTGlzdDohMH0pKSksdGhpcy5fY29ubmVjdGVkPSEwfWRpc2Nvbm5lY3QoKXtPaSh0aGlzLl90YXJnZXQpP3RoaXMuX3VubGlzdGVuU2xvdHMoW3RoaXMuX3RhcmdldF0pOlkodGhpcy5fdGFyZ2V0KS5jaGlsZHJlbiYmKHRoaXMuX3VubGlzdGVuU2xvdHMoWSh0aGlzLl90YXJnZXQpLmNoaWxkcmVuKSx3aW5kb3cuU2hhZHlET00mJnRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlcj8od2luZG93LlNoYWR5RE9NLnVub2JzZXJ2ZUNoaWxkcmVuKHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlciksdGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyPW51bGwpOnRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXImJih0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyLmRpc2Nvbm5lY3QoKSx0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyPW51bGwpKSx0aGlzLl9jb25uZWN0ZWQ9ITF9X3NjaGVkdWxlKCl7dGhpcy5fc2NoZWR1bGVkfHwodGhpcy5fc2NoZWR1bGVkPSEwLHZ0LnJ1bigoKCk9PnRoaXMuZmx1c2goKSkpKX1fcHJvY2Vzc011dGF0aW9ucyh0KXt0aGlzLl9wcm9jZXNzU2xvdE11dGF0aW9ucyh0KSx0aGlzLmZsdXNoKCl9X3Byb2Nlc3NTbG90TXV0YXRpb25zKHQpe2lmKHQpZm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2xldCBuPXRbZV07bi5hZGRlZE5vZGVzJiZ0aGlzLl9saXN0ZW5TbG90cyhuLmFkZGVkTm9kZXMpLG4ucmVtb3ZlZE5vZGVzJiZ0aGlzLl91bmxpc3RlblNsb3RzKG4ucmVtb3ZlZE5vZGVzKX19Zmx1c2goKXtpZighdGhpcy5fY29ubmVjdGVkKXJldHVybiExO3dpbmRvdy5TaGFkeURPTSYmU2hhZHlET00uZmx1c2goKSx0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyP3RoaXMuX3Byb2Nlc3NTbG90TXV0YXRpb25zKHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIudGFrZVJlY29yZHMoKSk6dGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyJiZ0aGlzLl9wcm9jZXNzU2xvdE11dGF0aW9ucyh0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIudGFrZVJlY29yZHMoKSksdGhpcy5fc2NoZWR1bGVkPSExO2xldCB0PXt0YXJnZXQ6dGhpcy5fdGFyZ2V0LGFkZGVkTm9kZXM6W10scmVtb3ZlZE5vZGVzOltdfSxlPXRoaXMuY29uc3RydWN0b3IuZ2V0RmxhdHRlbmVkTm9kZXModGhpcy5fdGFyZ2V0KSxuPUlpKGUsdGhpcy5fZWZmZWN0aXZlTm9kZXMpO2ZvcihsZXQgZSxpPTA7aTxuLmxlbmd0aCYmKGU9bltpXSk7aSsrKWZvcihsZXQgbixpPTA7aTxlLnJlbW92ZWQubGVuZ3RoJiYobj1lLnJlbW92ZWRbaV0pO2krKyl0LnJlbW92ZWROb2Rlcy5wdXNoKG4pO2ZvcihsZXQgaSxyPTA7cjxuLmxlbmd0aCYmKGk9bltyXSk7cisrKWZvcihsZXQgbj1pLmluZGV4O248aS5pbmRleCtpLmFkZGVkQ291bnQ7bisrKXQuYWRkZWROb2Rlcy5wdXNoKGVbbl0pO3RoaXMuX2VmZmVjdGl2ZU5vZGVzPWU7bGV0IGk9ITE7cmV0dXJuKHQuYWRkZWROb2Rlcy5sZW5ndGh8fHQucmVtb3ZlZE5vZGVzLmxlbmd0aCkmJihpPSEwLHRoaXMuY2FsbGJhY2suY2FsbCh0aGlzLl90YXJnZXQsdCkpLGl9X2xpc3RlblNsb3RzKHQpe2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtsZXQgbj10W2VdO09pKG4pJiZuLmFkZEV2ZW50TGlzdGVuZXIoInNsb3RjaGFuZ2UiLHRoaXMuX2JvdW5kU2NoZWR1bGUpfX1fdW5saXN0ZW5TbG90cyh0KXtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl7bGV0IG49dFtlXTtPaShuKSYmbi5yZW1vdmVFdmVudExpc3RlbmVyKCJzbG90Y2hhbmdlIix0aGlzLl9ib3VuZFNjaGVkdWxlKX19fTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9jb25zdCBEaT1mdW5jdGlvbigpe2xldCB0LGU7ZG97dD13aW5kb3cuU2hhZHlET00mJlNoYWR5RE9NLmZsdXNoKCksd2luZG93LlNoYWR5Q1NTJiZ3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0mJndpbmRvdy5TaGFkeUNTUy5TY29waW5nU2hpbS5mbHVzaCgpLGU9a24oKX13aGlsZSh0fHxlKX0sQmk9RWxlbWVudC5wcm90b3R5cGUsSGk9QmkubWF0Y2hlc3x8QmkubWF0Y2hlc1NlbGVjdG9yfHxCaS5tb3pNYXRjaGVzU2VsZWN0b3J8fEJpLm1zTWF0Y2hlc1NlbGVjdG9yfHxCaS5vTWF0Y2hlc1NlbGVjdG9yfHxCaS53ZWJraXRNYXRjaGVzU2VsZWN0b3IsRmk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gSGkuY2FsbCh0LGUpfTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9jbGFzcyBWaXtjb25zdHJ1Y3Rvcih0KXt3aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS5pblVzZSYmd2luZG93LlNoYWR5RE9NLnBhdGNoKHQpLHRoaXMubm9kZT10fW9ic2VydmVOb2Rlcyh0KXtyZXR1cm4gbmV3IHppKHRoaXMubm9kZSx0KX11bm9ic2VydmVOb2Rlcyh0KXt0LmRpc2Nvbm5lY3QoKX1ub3RpZnlPYnNlcnZlcigpe31kZWVwQ29udGFpbnModCl7aWYoWSh0aGlzLm5vZGUpLmNvbnRhaW5zKHQpKXJldHVybiEwO2xldCBlPXQsbj10Lm93bmVyRG9jdW1lbnQ7Zm9yKDtlJiZlIT09biYmZSE9PXRoaXMubm9kZTspZT1ZKGUpLnBhcmVudE5vZGV8fFkoZSkuaG9zdDtyZXR1cm4gZT09PXRoaXMubm9kZX1nZXRPd25lclJvb3QoKXtyZXR1cm4gWSh0aGlzLm5vZGUpLmdldFJvb3ROb2RlKCl9Z2V0RGlzdHJpYnV0ZWROb2Rlcygpe3JldHVybiJzbG90Ij09PXRoaXMubm9kZS5sb2NhbE5hbWU/WSh0aGlzLm5vZGUpLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46ITB9KTpbXX1nZXREZXN0aW5hdGlvbkluc2VydGlvblBvaW50cygpe2xldCB0PVtdLGU9WSh0aGlzLm5vZGUpLmFzc2lnbmVkU2xvdDtmb3IoO2U7KXQucHVzaChlKSxlPVkoZSkuYXNzaWduZWRTbG90O3JldHVybiB0fWltcG9ydE5vZGUodCxlKXtsZXQgbj10aGlzLm5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudD90aGlzLm5vZGU6dGhpcy5ub2RlLm93bmVyRG9jdW1lbnQ7cmV0dXJuIFkobikuaW1wb3J0Tm9kZSh0LGUpfWdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKXtyZXR1cm4gemkuZ2V0RmxhdHRlbmVkTm9kZXModGhpcy5ub2RlKX1xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHModCl7bGV0IGU9dGhpcy5nZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCksbj1bXTtmb3IobGV0IGkscj0wLG89ZS5sZW5ndGg7cjxvJiYoaT1lW3JdKTtyKyspaS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZGaShpLHQpJiZuLnB1c2goaSk7cmV0dXJuIG59Z2V0IGFjdGl2ZUVsZW1lbnQoKXtsZXQgdD10aGlzLm5vZGU7cmV0dXJuIHZvaWQgMCE9PXQuX2FjdGl2ZUVsZW1lbnQ/dC5fYWN0aXZlRWxlbWVudDp0LmFjdGl2ZUVsZW1lbnR9fWZ1bmN0aW9uIFVpKHQsZSl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2xldCBpPWVbbl07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaSx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZVtpXX0sY29uZmlndXJhYmxlOiEwfSl9fWNsYXNzIGppe2NvbnN0cnVjdG9yKHQpe3RoaXMuZXZlbnQ9dH1nZXQgcm9vdFRhcmdldCgpe3JldHVybiB0aGlzLnBhdGhbMF19Z2V0IGxvY2FsVGFyZ2V0KCl7cmV0dXJuIHRoaXMuZXZlbnQudGFyZ2V0fWdldCBwYXRoKCl7cmV0dXJuIHRoaXMuZXZlbnQuY29tcG9zZWRQYXRoKCl9fWxldCBHaT1WaTtpZih3aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS5pblVzZSYmd2luZG93LlNoYWR5RE9NLm5vUGF0Y2gmJndpbmRvdy5TaGFkeURPTS5XcmFwcGVyKXtjbGFzcyB0IGV4dGVuZHMgd2luZG93LlNoYWR5RE9NLldyYXBwZXJ7fU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFZpLnByb3RvdHlwZSkuZm9yRWFjaCgoZT0+eyJhY3RpdmVFbGVtZW50IiE9ZSYmKHQucHJvdG90eXBlW2VdPVZpLnByb3RvdHlwZVtlXSl9KSksVWkodC5wcm90b3R5cGUsWyJjbGFzc0xpc3QiXSksR2k9dCxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhqaS5wcm90b3R5cGUse2xvY2FsVGFyZ2V0OntnZXQoKXtjb25zdCB0PXRoaXMuZXZlbnQuY3VycmVudFRhcmdldCxlPXQmJllpKHQpLmdldE93bmVyUm9vdCgpLG49dGhpcy5wYXRoO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKXtjb25zdCBpPW5bdF07aWYoWWkoaSkuZ2V0T3duZXJSb290KCk9PT1lKXJldHVybiBpfX0sY29uZmlndXJhYmxlOiEwfSxwYXRoOntnZXQoKXtyZXR1cm4gd2luZG93LlNoYWR5RE9NLmNvbXBvc2VkUGF0aCh0aGlzLmV2ZW50KX0sY29uZmlndXJhYmxlOiEwfX0pfWVsc2UhKGZ1bmN0aW9uIFdpKHQsZSl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2xldCBpPWVbbl07dFtpXT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGVbaV0uYXBwbHkodGhpcy5ub2RlLGFyZ3VtZW50cyl9fX0pKFZpLnByb3RvdHlwZSxbImNsb25lTm9kZSIsImFwcGVuZENoaWxkIiwiaW5zZXJ0QmVmb3JlIiwicmVtb3ZlQ2hpbGQiLCJyZXBsYWNlQ2hpbGQiLCJzZXRBdHRyaWJ1dGUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJxdWVyeVNlbGVjdG9yIiwicXVlcnlTZWxlY3RvckFsbCJdKSxVaShWaS5wcm90b3R5cGUsWyJwYXJlbnROb2RlIiwiZmlyc3RDaGlsZCIsImxhc3RDaGlsZCIsIm5leHRTaWJsaW5nIiwicHJldmlvdXNTaWJsaW5nIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJsYXN0RWxlbWVudENoaWxkIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwicHJldmlvdXNFbGVtZW50U2libGluZyIsImNoaWxkTm9kZXMiLCJjaGlsZHJlbiIsImNsYXNzTGlzdCJdKSwoZnVuY3Rpb24gcWkodCxlKXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7bGV0IGk9ZVtuXTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlW2ldfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5ub2RlW2ldPXR9LGNvbmZpZ3VyYWJsZTohMH0pfX0pKFZpLnByb3RvdHlwZSxbInRleHRDb250ZW50IiwiaW5uZXJIVE1MIiwiY2xhc3NOYW1lIl0pO2NvbnN0IFlpPWZ1bmN0aW9uKHQpe2lmKCh0PXR8fGRvY3VtZW50KWluc3RhbmNlb2YgR2kpcmV0dXJuIHQ7aWYodCBpbnN0YW5jZW9mIGppKXJldHVybiB0O2xldCBlPXQuX19kb21BcGk7cmV0dXJuIGV8fChlPXQgaW5zdGFuY2VvZiBFdmVudD9uZXcgamkodCk6bmV3IEdpKHQpLHQuX19kb21BcGk9ZSksZX0sWGk9d2luZG93LlNoYWR5RE9NLCRpPXdpbmRvdy5TaGFkeUNTUzsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE5IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9mdW5jdGlvbiBLaSh0LGUpe3JldHVybiBZKHQpLmdldFJvb3ROb2RlKCk9PT1lfQovKioKICAgICAqIEBmaWxlb3ZlcnZpZXcKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tQcm90b3R5cGFsVHlwZXN9CiAgICAgKiBAbGljZW5zZSBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZAogICAgICogYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heQogICAgICogYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieQogICAgICogR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUAogICAgICogcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgICovCmNvbnN0IFppPSJkaXNhYmxlLXVwZ3JhZGUiLEppPXQ9Pntmb3IoO3Q7KXtjb25zdCBlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwib2JzZXJ2ZWRBdHRyaWJ1dGVzIik7aWYoZSlyZXR1cm4gZS5nZXQ7dD1PYmplY3QuZ2V0UHJvdG90eXBlT2YodC5wcm90b3R5cGUpLmNvbnN0cnVjdG9yfXJldHVybigpPT5bXX07SSgodD0+e2NvbnN0IGU9bWUodCk7bGV0IG49SmkoZSk7cmV0dXJuIGNsYXNzIGV4dGVuZHMgZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCl9c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKXtyZXR1cm4gbi5jYWxsKHRoaXMpLmNvbmNhdChaaSl9X2luaXRpYWxpemVQcm9wZXJ0aWVzKCl7dGhpcy5oYXNBdHRyaWJ1dGUoWmkpP3RoaXMuX19pc1VwZ3JhZGVEaXNhYmxlZD0hMDpzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKX1fZW5hYmxlUHJvcGVydGllcygpe3RoaXMuX19pc1VwZ3JhZGVEaXNhYmxlZHx8c3VwZXIuX2VuYWJsZVByb3BlcnRpZXMoKX1fY2FuQXBwbHlQcm9wZXJ0eURlZmF1bHQodCl7cmV0dXJuIHN1cGVyLl9jYW5BcHBseVByb3BlcnR5RGVmYXVsdCh0KSYmISh0aGlzLl9faXNVcGdyYWRlRGlzYWJsZWQmJnRoaXMuX2lzUHJvcGVydHlQZW5kaW5nKHQpKX1hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodCxlLG4saSl7dD09Wmk/dGhpcy5fX2lzVXBncmFkZURpc2FibGVkJiZudWxsPT1uJiYoc3VwZXIuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCksdGhpcy5fX2lzVXBncmFkZURpc2FibGVkPSExLFkodGhpcykuaXNDb25uZWN0ZWQmJnN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCkpOnN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0LGUsbixpKX1jb25uZWN0ZWRDYWxsYmFjaygpe3RoaXMuX19pc1VwZ3JhZGVEaXNhYmxlZHx8c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKX1kaXNjb25uZWN0ZWRDYWxsYmFjaygpe3RoaXMuX19pc1VwZ3JhZGVEaXNhYmxlZHx8c3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKX19fSkpOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBRaT0iZGlzYWJsZS11cGdyYWRlIjtsZXQgdHI9d2luZG93LlNoYWR5Q1NTO2NvbnN0IGVyPUkoKHQ9Pntjb25zdCBlPXBpKG1lKHQpKSxuPWZlP2U6TWkoZSksaT1KaShuKSxyPXt4OiJwYW4teCIseToicGFuLXkiLG5vbmU6Im5vbmUiLGFsbDoiYXV0byJ9O2NsYXNzIG8gZXh0ZW5kcyBue2NvbnN0cnVjdG9yKCl7c3VwZXIoKX1zdGF0aWMgZ2V0IGltcG9ydE1ldGEoKXtyZXR1cm4gdGhpcy5wcm90b3R5cGUuaW1wb3J0TWV0YX1jcmVhdGVkKCl7fV9fYXR0cmlidXRlUmVhY3Rpb24odCxlLG4peyh0aGlzLl9fZGF0YUF0dHJpYnV0ZXMmJnRoaXMuX19kYXRhQXR0cmlidXRlc1t0XXx8dD09PVFpKSYmdGhpcy5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodCxlLG4sbnVsbCl9c2V0QXR0cmlidXRlKHQsZSl7aWYoTCYmIXRoaXMuX2xlZ2FjeUZvcmNlT2JzZXJ2ZWRBdHRyaWJ1dGVzKXtjb25zdCBuPXRoaXMuZ2V0QXR0cmlidXRlKHQpO3N1cGVyLnNldEF0dHJpYnV0ZSh0LGUpLHRoaXMuX19hdHRyaWJ1dGVSZWFjdGlvbih0LG4sU3RyaW5nKGUpKX1lbHNlIHN1cGVyLnNldEF0dHJpYnV0ZSh0LGUpfXJlbW92ZUF0dHJpYnV0ZSh0KXtpZihMJiYhdGhpcy5fbGVnYWN5Rm9yY2VPYnNlcnZlZEF0dHJpYnV0ZXMpe2NvbnN0IGU9dGhpcy5nZXRBdHRyaWJ1dGUodCk7c3VwZXIucmVtb3ZlQXR0cmlidXRlKHQpLHRoaXMuX19hdHRyaWJ1dGVSZWFjdGlvbih0LGUsbnVsbCl9ZWxzZSBzdXBlci5yZW1vdmVBdHRyaWJ1dGUodCl9c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKXtyZXR1cm4gTCYmIXRoaXMucHJvdG90eXBlLl9sZWdhY3lGb3JjZU9ic2VydmVkQXR0cmlidXRlcz8odGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJfX29ic2VydmVkQXR0cmlidXRlcyIsdGhpcykpfHwodGhpcy5fX29ic2VydmVkQXR0cmlidXRlcz1bXSksdGhpcy5fX29ic2VydmVkQXR0cmlidXRlcyk6aS5jYWxsKHRoaXMpLmNvbmNhdChRaSl9X2VuYWJsZVByb3BlcnRpZXMoKXt0aGlzLl9faXNVcGdyYWRlRGlzYWJsZWR8fHN1cGVyLl9lbmFibGVQcm9wZXJ0aWVzKCl9X2NhbkFwcGx5UHJvcGVydHlEZWZhdWx0KHQpe3JldHVybiBzdXBlci5fY2FuQXBwbHlQcm9wZXJ0eURlZmF1bHQodCkmJiEodGhpcy5fX2lzVXBncmFkZURpc2FibGVkJiZ0aGlzLl9pc1Byb3BlcnR5UGVuZGluZyh0KSl9Y29ubmVjdGVkQ2FsbGJhY2soKXt0aGlzLl9fbmVlZHNBdHRyaWJ1dGVzQXRDb25uZWN0ZWQmJnRoaXMuX3Rha2VBdHRyaWJ1dGVzKCksdGhpcy5fX2lzVXBncmFkZURpc2FibGVkfHwoc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLmlzQXR0YWNoZWQ9ITAsdGhpcy5hdHRhY2hlZCgpKX1hdHRhY2hlZCgpe31kaXNjb25uZWN0ZWRDYWxsYmFjaygpe3RoaXMuX19pc1VwZ3JhZGVEaXNhYmxlZHx8KHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCksdGhpcy5pc0F0dGFjaGVkPSExLHRoaXMuZGV0YWNoZWQoKSl9ZGV0YWNoZWQoKXt9YXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHQsZSxuLGkpe2UhPT1uJiYodD09UWk/dGhpcy5fX2lzVXBncmFkZURpc2FibGVkJiZudWxsPT1uJiYodGhpcy5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKSx0aGlzLl9faXNVcGdyYWRlRGlzYWJsZWQ9ITEsWSh0aGlzKS5pc0Nvbm5lY3RlZCYmdGhpcy5jb25uZWN0ZWRDYWxsYmFjaygpKTooc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHQsZSxuLGkpLHRoaXMuYXR0cmlidXRlQ2hhbmdlZCh0LGUsbikpKX1hdHRyaWJ1dGVDaGFuZ2VkKHQsZSxuKXt9X2luaXRpYWxpemVQcm9wZXJ0aWVzKCl7aWYodyYmdGhpcy5oYXNBdHRyaWJ1dGUoUWkpKXRoaXMuX19pc1VwZ3JhZGVEaXNhYmxlZD0hMDtlbHNle2xldCB0PU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTt0Lmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl9faGFzUmVnaXN0ZXJGaW5pc2hlZCIsdCkpfHwodGhpcy5fcmVnaXN0ZXJlZCgpLHQuX19oYXNSZWdpc3RlckZpbmlzaGVkPSEwKSxzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKSx0aGlzLnJvb3Q9dGhpcyx0aGlzLmNyZWF0ZWQoKSxMJiYhdGhpcy5fbGVnYWN5Rm9yY2VPYnNlcnZlZEF0dHJpYnV0ZXMmJih0aGlzLmhhc0F0dHJpYnV0ZXMoKT90aGlzLl90YWtlQXR0cmlidXRlcygpOnRoaXMucGFyZW50Tm9kZXx8KHRoaXMuX19uZWVkc0F0dHJpYnV0ZXNBdENvbm5lY3RlZD0hMCkpLHRoaXMuX2FwcGx5TGlzdGVuZXJzKCl9fV90YWtlQXR0cmlidXRlcygpe2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgbj10W2VdO3RoaXMuX19hdHRyaWJ1dGVSZWFjdGlvbihuLm5hbWUsbnVsbCxuLnZhbHVlKX19X3JlZ2lzdGVyZWQoKXt9cmVhZHkoKXt0aGlzLl9lbnN1cmVBdHRyaWJ1dGVzKCksc3VwZXIucmVhZHkoKX1fZW5zdXJlQXR0cmlidXRlcygpe31fYXBwbHlMaXN0ZW5lcnMoKXt9c2VyaWFsaXplKHQpe3JldHVybiB0aGlzLl9zZXJpYWxpemVWYWx1ZSh0KX1kZXNlcmlhbGl6ZSh0LGUpe3JldHVybiB0aGlzLl9kZXNlcmlhbGl6ZVZhbHVlKHQsZSl9cmVmbGVjdFByb3BlcnR5VG9BdHRyaWJ1dGUodCxlLG4pe3RoaXMuX3Byb3BlcnR5VG9BdHRyaWJ1dGUodCxlLG4pfXNlcmlhbGl6ZVZhbHVlVG9BdHRyaWJ1dGUodCxlLG4pe3RoaXMuX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKG58fHRoaXMsdCxlKX1leHRlbmQodCxlKXtpZighdHx8IWUpcmV0dXJuIHR8fGU7bGV0IG49T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSk7Zm9yKGxldCBpLHI9MDtyPG4ubGVuZ3RoJiYoaT1uW3JdKTtyKyspe2xldCBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxpKTtuJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLG4pfXJldHVybiB0fW1peGluKHQsZSl7Zm9yKGxldCBuIGluIGUpdFtuXT1lW25dO3JldHVybiB0fWNoYWluT2JqZWN0KHQsZSl7cmV0dXJuIHQmJmUmJnQhPT1lJiYodC5fX3Byb3RvX189ZSksdH1pbnN0YW5jZVRlbXBsYXRlKHQpe2xldCBlPXRoaXMuY29uc3RydWN0b3IuX2NvbnRlbnRGb3JUZW1wbGF0ZSh0KTtyZXR1cm4gZG9jdW1lbnQuaW1wb3J0Tm9kZShlLCEwKX1maXJlKHQsZSxuKXtuPW58fHt9LGU9bnVsbD09ZT97fTplO2xldCBpPW5ldyBFdmVudCh0LHtidWJibGVzOnZvaWQgMD09PW4uYnViYmxlc3x8bi5idWJibGVzLGNhbmNlbGFibGU6Qm9vbGVhbihuLmNhbmNlbGFibGUpLGNvbXBvc2VkOnZvaWQgMD09PW4uY29tcG9zZWR8fG4uY29tcG9zZWR9KTtyZXR1cm4gaS5kZXRhaWw9ZSxZKG4ubm9kZXx8dGhpcykuZGlzcGF0Y2hFdmVudChpKSxpfWxpc3Rlbih0LGUsbil7dD10fHx0aGlzO2xldCBpPXRoaXMuX19ib3VuZExpc3RlbmVyc3x8KHRoaXMuX19ib3VuZExpc3RlbmVycz1uZXcgV2Vha01hcCkscj1pLmdldCh0KTtyfHwocj17fSxpLnNldCh0LHIpKTtsZXQgbz1lK247cltvXXx8KHJbb109dGhpcy5fYWRkTWV0aG9kRXZlbnRMaXN0ZW5lclRvTm9kZSh0LGUsbix0aGlzKSl9dW5saXN0ZW4odCxlLG4pe3Q9dHx8dGhpcztsZXQgaT10aGlzLl9fYm91bmRMaXN0ZW5lcnMmJnRoaXMuX19ib3VuZExpc3RlbmVycy5nZXQodCkscj1lK24sbz1pJiZpW3JdO28mJih0aGlzLl9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUodCxlLG8pLGlbcl09bnVsbCl9c2V0U2Nyb2xsRGlyZWN0aW9uKHQsZSl7b2koZXx8dGhpcyxyW3RdfHwiYXV0byIpfSQkKHQpe3JldHVybiB0aGlzLnJvb3QucXVlcnlTZWxlY3Rvcih0KX1nZXQgZG9tSG9zdCgpe2xldCB0PVkodGhpcykuZ2V0Um9vdE5vZGUoKTtyZXR1cm4gdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQ/dC5ob3N0OnR9ZGlzdHJpYnV0ZUNvbnRlbnQoKXtjb25zdCB0PVlpKHRoaXMpO3dpbmRvdy5TaGFkeURPTSYmdC5zaGFkb3dSb290JiZTaGFkeURPTS5mbHVzaCgpfWdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKXtyZXR1cm4gWWkodGhpcykuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpfXF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyh0KXtyZXR1cm4gWWkodGhpcykucXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHQpfWdldEVmZmVjdGl2ZUNoaWxkcmVuKCl7cmV0dXJuIHRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERX0pKX1nZXRFZmZlY3RpdmVUZXh0Q29udGVudCgpe2xldCB0PXRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpLGU9W107Zm9yKGxldCBuLGk9MDtuPXRbaV07aSsrKW4ubm9kZVR5cGUhPT1Ob2RlLkNPTU1FTlRfTk9ERSYmZS5wdXNoKG4udGV4dENvbnRlbnQpO3JldHVybiBlLmpvaW4oIiIpfXF1ZXJ5RWZmZWN0aXZlQ2hpbGRyZW4odCl7bGV0IGU9dGhpcy5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHModCk7cmV0dXJuIGUmJmVbMF19cXVlcnlBbGxFZmZlY3RpdmVDaGlsZHJlbih0KXtyZXR1cm4gdGhpcy5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHModCl9Z2V0Q29udGVudENoaWxkTm9kZXModCl7bGV0IGU9dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IodHx8InNsb3QiKTtyZXR1cm4gZT9ZaShlKS5nZXREaXN0cmlidXRlZE5vZGVzKCk6W119Z2V0Q29udGVudENoaWxkcmVuKHQpe3JldHVybiB0aGlzLmdldENvbnRlbnRDaGlsZE5vZGVzKHQpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERX0pKX1pc0xpZ2h0RGVzY2VuZGFudCh0KXtjb25zdCBlPXRoaXM7cmV0dXJuIGUhPT10JiZZKGUpLmNvbnRhaW5zKHQpJiZZKGUpLmdldFJvb3ROb2RlKCk9PT1ZKHQpLmdldFJvb3ROb2RlKCl9aXNMb2NhbERlc2NlbmRhbnQodCl7cmV0dXJuIHRoaXMucm9vdD09PVkodCkuZ2V0Um9vdE5vZGUoKX1zY29wZVN1YnRyZWUodCxlPSExKXtyZXR1cm4oZnVuY3Rpb24gbih0LGU9ITEpe2lmKCFYaXx8ISRpKXJldHVybiBudWxsO2lmKCFYaS5oYW5kbGVzRHluYW1pY1Njb3BpbmcpcmV0dXJuIG51bGw7Y29uc3Qgbj0kaS5TY29waW5nU2hpbTtpZighbilyZXR1cm4gbnVsbDtjb25zdCBpPW4uc2NvcGVGb3JOb2RlKHQpLHI9WSh0KS5nZXRSb290Tm9kZSgpLG89dD0+e2lmKCFLaSh0LHIpKXJldHVybjtjb25zdCBlPUFycmF5LmZyb20oWGkubmF0aXZlTWV0aG9kcy5xdWVyeVNlbGVjdG9yQWxsLmNhbGwodCwiKiIpKTtlLnB1c2godCk7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2NvbnN0IG89ZVt0XTtpZighS2kobyxyKSljb250aW51ZTtjb25zdCBhPW4uY3VycmVudFNjb3BlRm9yTm9kZShvKTthIT09aSYmKCIiIT09YSYmbi51bnNjb3BlTm9kZShvLGEpLG4uc2NvcGVOb2RlKG8saSkpfX07aWYobyh0KSxlKXtjb25zdCBlPW5ldyBNdXRhdGlvbk9ic2VydmVyKCh0PT57Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2NvbnN0IG49dFtlXTtmb3IobGV0IHQ9MDt0PG4uYWRkZWROb2Rlcy5sZW5ndGg7dCsrKXtjb25zdCBlPW4uYWRkZWROb2Rlc1t0XTtlLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJm8oZSl9fX0pKTtyZXR1cm4gZS5vYnNlcnZlKHQse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSksZX1yZXR1cm4gbnVsbH0pKHQsZSl9Z2V0Q29tcHV0ZWRTdHlsZVZhbHVlKHQpe3JldHVybiB0ci5nZXRDb21wdXRlZFN0eWxlVmFsdWUodGhpcyx0KX1kZWJvdW5jZSh0LGUsbil7cmV0dXJuIHRoaXMuX2RlYm91bmNlcnM9dGhpcy5fZGVib3VuY2Vyc3x8e30sdGhpcy5fZGVib3VuY2Vyc1t0XT1Ubi5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZXJzW3RdLG4+MD9ndC5hZnRlcihuKTp2dCxlLmJpbmQodGhpcykpfWlzRGVib3VuY2VyQWN0aXZlKHQpe3RoaXMuX2RlYm91bmNlcnM9dGhpcy5fZGVib3VuY2Vyc3x8e307bGV0IGU9dGhpcy5fZGVib3VuY2Vyc1t0XTtyZXR1cm4hKCFlfHwhZS5pc0FjdGl2ZSgpKX1mbHVzaERlYm91bmNlcih0KXt0aGlzLl9kZWJvdW5jZXJzPXRoaXMuX2RlYm91bmNlcnN8fHt9O2xldCBlPXRoaXMuX2RlYm91bmNlcnNbdF07ZSYmZS5mbHVzaCgpfWNhbmNlbERlYm91bmNlcih0KXt0aGlzLl9kZWJvdW5jZXJzPXRoaXMuX2RlYm91bmNlcnN8fHt9O2xldCBlPXRoaXMuX2RlYm91bmNlcnNbdF07ZSYmZS5jYW5jZWwoKX1hc3luYyh0LGUpe3JldHVybiBlPjA/Z3QucnVuKHQuYmluZCh0aGlzKSxlKTp+dnQucnVuKHQuYmluZCh0aGlzKSl9Y2FuY2VsQXN5bmModCl7dDwwP3Z0LmNhbmNlbCh+dCk6Z3QuY2FuY2VsKHQpfWNyZWF0ZSh0LGUpe2xldCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodCk7aWYoZSlpZihuLnNldFByb3BlcnRpZXMpbi5zZXRQcm9wZXJ0aWVzKGUpO2Vsc2UgZm9yKGxldCB0IGluIGUpblt0XT1lW3RdO3JldHVybiBufWVsZW1lbnRNYXRjaGVzKHQsZSl7cmV0dXJuIEZpKGV8fHRoaXMsdCl9dG9nZ2xlQXR0cmlidXRlKHQsZSl7bGV0IG49dGhpcztyZXR1cm4gMz09PWFyZ3VtZW50cy5sZW5ndGgmJihuPWFyZ3VtZW50c1syXSksMT09YXJndW1lbnRzLmxlbmd0aCYmKGU9IW4uaGFzQXR0cmlidXRlKHQpKSxlPyhZKG4pLnNldEF0dHJpYnV0ZSh0LCIiKSwhMCk6KFkobikucmVtb3ZlQXR0cmlidXRlKHQpLCExKX10b2dnbGVDbGFzcyh0LGUsbil7bj1ufHx0aGlzLDE9PWFyZ3VtZW50cy5sZW5ndGgmJihlPSFuLmNsYXNzTGlzdC5jb250YWlucyh0KSksZT9uLmNsYXNzTGlzdC5hZGQodCk6bi5jbGFzc0xpc3QucmVtb3ZlKHQpfXRyYW5zZm9ybSh0LGUpeyhlPWV8fHRoaXMpLnN0eWxlLndlYmtpdFRyYW5zZm9ybT10LGUuc3R5bGUudHJhbnNmb3JtPXR9dHJhbnNsYXRlM2QodCxlLG4saSl7dGhpcy50cmFuc2Zvcm0oInRyYW5zbGF0ZTNkKCIrdCsiLCIrZSsiLCIrbisiKSIsaT1pfHx0aGlzKX1hcnJheURlbGV0ZSh0LGUpe2xldCBuO2lmKEFycmF5LmlzQXJyYXkodCkpe2lmKG49dC5pbmRleE9mKGUpLG4+PTApcmV0dXJuIHQuc3BsaWNlKG4sMSl9ZWxzZSBpZihuPW50KHRoaXMsdCkuaW5kZXhPZihlKSxuPj0wKXJldHVybiB0aGlzLnNwbGljZSh0LG4sMSk7cmV0dXJuIG51bGx9X2xvZ2dlcih0LGUpe3N3aXRjaChBcnJheS5pc0FycmF5KGUpJiYxPT09ZS5sZW5ndGgmJkFycmF5LmlzQXJyYXkoZVswXSkmJihlPWVbMF0pLHQpe2Nhc2UibG9nIjpjYXNlIndhcm4iOmNhc2UiZXJyb3IiOmNvbnNvbGVbdF0oLi4uZSl9fV9sb2coLi4udCl7dGhpcy5fbG9nZ2VyKCJsb2ciLHQpfV93YXJuKC4uLnQpe3RoaXMuX2xvZ2dlcigid2FybiIsdCl9X2Vycm9yKC4uLnQpe3RoaXMuX2xvZ2dlcigiZXJyb3IiLHQpfV9sb2dmKHQsLi4uZSl7cmV0dXJuWyJbJXM6OiVzXSIsdGhpcy5pcyx0LC4uLmVdfX1yZXR1cm4gby5wcm90b3R5cGUuaXM9IiIsb30pKTtmdW5jdGlvbiBucih0LGUpe2xldCBuPTAsaT0wO2Zvcig7Oyl7aWYobj09PXQubGVuZ3RoKXJldHVybiBpPT09ZS5sZW5ndGg/MDotMTtpZihpPT09ZS5sZW5ndGgpcmV0dXJuIDE7aWYocnIodFtuXSkmJnJyKGVbaV0pKXtjb25zdCByPW4sbz1pO249aXIodCxuKzEpLGk9aXIoZSxpKzEpO2NvbnN0IGE9cGFyc2VGbG9hdCh0LnNsaWNlKHIsbikpLHM9cGFyc2VGbG9hdChlLnNsaWNlKG8saSkpO2lmKGE8cylyZXR1cm4tMTtpZihhPnMpcmV0dXJuIDF9ZWxzZXtpZihvcih0W25dKSl7aWYoIW9yKGVbaV0pKXJldHVybi0xfWVsc2V7aWYob3IoZVtpXSkpcmV0dXJuIDE7aWYodFtuXTxlW2ldKXJldHVybi0xO2lmKHRbbl0+ZVtpXSlyZXR1cm4gMX1uKyssaSsrfX19ZnVuY3Rpb24gaXIodCxlKXtsZXQgbjshKGZ1bmN0aW9uKHQpe3RbdC5OQVRVUkFMPTBdPSJOQVRVUkFMIix0W3QuUkVBTD0xXT0iUkVBTCIsdFt0LkVYUE9ORU5UX1NJR049Ml09IkVYUE9ORU5UX1NJR04iLHRbdC5FWFBPTkVOVD0zXT0iRVhQT05FTlQifSkobnx8KG49e30pKTtsZXQgaT1uLk5BVFVSQUw7Zm9yKDtlPHQubGVuZ3RoO2UrKylpZihpPT09bi5OQVRVUkFMKXtpZigiLiI9PT10W2VdKWk9bi5SRUFMO2Vsc2UgaWYoImUiPT09dFtlXXx8IkUiPT09dFtlXSlpPW4uRVhQT05FTlRfU0lHTjtlbHNlIGlmKCFycih0W2VdKSlicmVha31lbHNlIGlmKGk9PT1uLlJFQUwpe2lmKCJlIj09PXRbZV18fCJFIj09PXRbZV0paT1uLkVYUE9ORU5UX1NJR047ZWxzZSBpZighcnIodFtlXSkpYnJlYWt9ZWxzZSBpZihpPT09bi5FWFBPTkVOVF9TSUdOKXtpZighcnIodFtlXSkmJiIrIiE9PXRbZV0mJiItIiE9PXRbZV0pYnJlYWs7aT1uLkVYUE9ORU5UfWVsc2UgaWYoaT09PW4uRVhQT05FTlQmJiFycih0W2VdKSlicmVhaztyZXR1cm4gZX1mdW5jdGlvbiBycih0KXtyZXR1cm4iMCI8PXQmJnQ8PSI5In1mdW5jdGlvbiBvcih0KXtyZXR1cm4iLyI9PT10fHwiXyI9PT10fHxycih0KX1mdW5jdGlvbiBhcih0KXtyZXR1cm4gU2UuZXhwb3J0cy51bmlvbi5hcHBseShudWxsLFNlLmV4cG9ydHMudmFsdWVzKHQpKS5zb3J0KG5yKX1jbGFzcyBzciBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLm5hbWU9IlJlcXVlc3RDYW5jZWxsYXRpb25FcnJvciJ9fWNsYXNzIGxyIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5uYW1lPSJJbnZhbGlkUmVxdWVzdE9wdGlvbnNFcnJvciIsT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsbHIucHJvdG90eXBlKX19Y2xhc3MgY3IgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5tZXNzYWdlPWBSZXF1ZXN0TmV0d29ya0Vycm9yOiAke3Quc3RhdHVzfSBhdCAke2V9YCx0aGlzLm5hbWU9IlJlcXVlc3ROZXR3b3JrRXJyb3IiLHRoaXMucmVxPXQsdGhpcy51cmw9ZX19dmFyIHVyOyEoZnVuY3Rpb24odCl7dC5HRVQ9IkdFVCIsdC5QT1NUPSJQT1NUIn0pKHVyfHwodXI9e30pKTtjbGFzcyBocnt2YWxpZGF0ZSgpe2lmKHRoaXMubWV0aG9kVHlwZT09PXVyLkdFVCYmdGhpcy5ib2R5KXRocm93IG5ldyBscigiYm9keSBtdXN0IGJlIG1pc3NpbmcgZm9yIGEgR0VUIHJlcXVlc3QuIil9fWNsYXNzIGRye2NvbnN0cnVjdG9yKHQ9MWUzLGU9Myl7dGhpcy5fcXVldWU9W10sdGhpcy5fbkFjdGl2ZVJlcXVlc3RzPTAsdGhpcy5fblNpbXVsdGFuZW91c1JlcXVlc3RzPXQsdGhpcy5fbWF4UmV0cmllcz1lfXJlcXVlc3QodCxlKXtjb25zdCBuPShmdW5jdGlvbiBpKHQpe2NvbnN0IGU9bmV3IGhyO3JldHVybiB0PyhlLm1ldGhvZFR5cGU9dXIuUE9TVCxlLmJvZHk9KGZ1bmN0aW9uIG4odCl7Y29uc3QgZT1uZXcgRm9ybURhdGE7Zm9yKGNvbnN0W24saV1vZiBPYmplY3QuZW50cmllcyh0KSl7Y29uc3QgdD1BcnJheS5pc0FycmF5KGkpP2k6W2ldO2Zvcihjb25zdCBpIG9mIHQpZS5hcHBlbmQobixpKX1yZXR1cm4gZX0pKHQpLGUpOihlLm1ldGhvZFR5cGU9dXIuR0VULGUpfSkoZSk7cmV0dXJuIHRoaXMucmVxdWVzdFdpdGhPcHRpb25zKHQsbil9cmVxdWVzdFdpdGhPcHRpb25zKHQsZSl7cmV0dXJuIGUudmFsaWRhdGUoKSxuZXcgUHJvbWlzZSgoKHQsZSk9Pnt0aGlzLl9xdWV1ZS5wdXNoKHtyZXNvbHZlOnQscmVqZWN0OmV9KSx0aGlzLmxhdW5jaFJlcXVlc3RzKCl9KSkudGhlbigoKCk9PnRoaXMucHJvbWlzZVdpdGhSZXRyaWVzKHQsdGhpcy5fbWF4UmV0cmllcyxlKSkpLnRoZW4oKHQ9Pih0aGlzLl9uQWN0aXZlUmVxdWVzdHMtLSx0aGlzLmxhdW5jaFJlcXVlc3RzKCksdCkpLCh0PT4oIlJlcXVlc3ROZXR3b3JrRXJyb3IiPT09dC5uYW1lJiYodGhpcy5fbkFjdGl2ZVJlcXVlc3RzLS0sdGhpcy5sYXVuY2hSZXF1ZXN0cygpKSxQcm9taXNlLnJlamVjdCh0KSkpKX1mZXRjaCh0LGUpe3JldHVybiBuZXcgUHJvbWlzZSgoKHQsZSk9Pnt0aGlzLl9xdWV1ZS5wdXNoKHtyZXNvbHZlOnQscmVqZWN0OmV9KSx0aGlzLmxhdW5jaFJlcXVlc3RzKCl9KSkudGhlbigoKCk9PntsZXQgbj0xO3JldHVybiBuZXcgUHJvbWlzZSgoaT0+e2NvbnN0IHI9KCk9PntmZXRjaCh0LGUpLnRoZW4oKHQ9PntpZighdC5vayYmdGhpcy5fbWF4UmV0cmllcz5uKXJldHVybiBuKyssdm9pZCByKCk7aSh0KSx0aGlzLl9uQWN0aXZlUmVxdWVzdHMtLSx0aGlzLmxhdW5jaFJlcXVlc3RzKCl9KSl9O3IoKX0pKX0pKX1jbGVhclF1ZXVlKCl7Zm9yKDt0aGlzLl9xdWV1ZS5sZW5ndGg+MDspdGhpcy5fcXVldWUucG9wKCkucmVqZWN0KG5ldyBzcigiUmVxdWVzdCBjYW5jZWxsZWQgYnkgY2xlYXJRdWV1ZSIpKX1hY3RpdmVSZXF1ZXN0cygpe3JldHVybiB0aGlzLl9uQWN0aXZlUmVxdWVzdHN9b3V0c3RhbmRpbmdSZXF1ZXN0cygpe3JldHVybiB0aGlzLl9uQWN0aXZlUmVxdWVzdHMrdGhpcy5fcXVldWUubGVuZ3RofWxhdW5jaFJlcXVlc3RzKCl7Zm9yKDt0aGlzLl9uQWN0aXZlUmVxdWVzdHM8dGhpcy5fblNpbXVsdGFuZW91c1JlcXVlc3RzJiZ0aGlzLl9xdWV1ZS5sZW5ndGg+MDspdGhpcy5fbkFjdGl2ZVJlcXVlc3RzKyssdGhpcy5fcXVldWUucG9wKCkucmVzb2x2ZSh2b2lkIDApfXByb21pc2VXaXRoUmV0cmllcyh0LGUsbil7cmV0dXJuIHRoaXMuX3Byb21pc2VGcm9tVXJsKHQsbikudGhlbigodD0+dCksKGk9PmU+MD90aGlzLnByb21pc2VXaXRoUmV0cmllcyh0LGUtMSxuKTpQcm9taXNlLnJlamVjdChpKSkpfV9wcm9taXNlRnJvbVVybCh0LGUpe3JldHVybiBuZXcgUHJvbWlzZSgoKG4saSk9Pntjb25zdCByPShmdW5jdGlvbiBvKHQsZSxuLGkpe2NvbnN0IHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiByLm9wZW4odCxlKSxuJiYoci53aXRoQ3JlZGVudGlhbHM9biksaSYmci5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGkpLHJ9KShlLm1ldGhvZFR5cGUsdCxlLndpdGhDcmVkZW50aWFscyxlLmNvbnRlbnRUeXBlKTtyLm9ubG9hZD1mdW5jdGlvbigpezIwMD09PXIuc3RhdHVzP24oSlNPTi5wYXJzZShyLnJlc3BvbnNlVGV4dCkpOmkobmV3IGNyKHIsdCkpfSxyLm9uZXJyb3I9ZnVuY3Rpb24oKXtpKG5ldyBjcihyLHQpKX0sZS5ib2R5P3Iuc2VuZChlLmJvZHkpOnIuc2VuZCgpfSkpfX1jb25zdCBwcj0iZXhwZXJpbWVudGFsUGx1Z2luIixmcj1uZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO2xldCBtcj1ncigpO2Z1bmN0aW9uIGdyKHQ9ImRhdGEiLGU9ZnIpe3JldHVybiIvIj09PXRbdC5sZW5ndGgtMV0mJih0PXQuc2xpY2UoMCx0Lmxlbmd0aC0xKSkse2Vudmlyb25tZW50OigpPT55cih0LCIvZW52aXJvbm1lbnQiKSxleHBlcmltZW50czooKT0+eXIodCwiL2V4cGVyaW1lbnRzIikscGx1Z2luUm91dGU6KGUsbixpKT0+eXIodCsiL3BsdWdpbiIsYC8ke2V9JHtufWAsaSkscGx1Z2luc0xpc3Rpbmc6KCk9PnlyKHQsIi9wbHVnaW5zX2xpc3RpbmciLHZyKHtbcHJdOmUuZ2V0QWxsKHByKX0pKSxydW5zOigpPT55cih0LCIvcnVucyIpLHJ1bnNGb3JFeHBlcmltZW50OmU9PnlyKHQsIi9leHBlcmltZW50X3J1bnMiLHZyKHtleHBlcmltZW50OlN0cmluZyhlKX0pKX19ZnVuY3Rpb24gX3IoKXtyZXR1cm4gbXJ9ZnVuY3Rpb24geXIodCxlLG49bmV3IFVSTFNlYXJjaFBhcmFtcyl7bGV0IGk9dCtlO3JldHVybiBTdHJpbmcobikmJihpKz0oZS5pbmNsdWRlcygiPyIpPyImIjoiPyIpK1N0cmluZyhuKSksaX1mdW5jdGlvbiB2cih0PXt9KXtjb25zdCBlPU9iamVjdC5rZXlzKHQpLnNvcnQoKS5maWx0ZXIoKGU9PnRbZV0pKSxuPW5ldyBVUkxTZWFyY2hQYXJhbXM7cmV0dXJuIGUuZm9yRWFjaCgoZT0+e2NvbnN0IGk9dFtlXTsoQXJyYXkuaXNBcnJheShpKT9pOltpXSkuZm9yRWFjaCgodD0+bi5hcHBlbmQoZSx0KSkpfSkpLG59dmFyIGJyO2Z1bmN0aW9uIHhyKHQsZSl7Y29uc3Qgbj0oKCk9Pnt0cnl7cmV0dXJuIG5ldyBSZWdFeHAoZSl9Y2F0Y2godCl7cmV0dXJuIG51bGx9fSkoKTtyZXR1cm57bmFtZTplLG1ldGFkYXRhOnt0eXBlOmJyLlNFQVJDSF9SRVNVTFRTLHZhbGlkUmVnZXg6ISFuLHVuaXZlcnNhbFJlZ2V4OiIuKiI9PT1lfSxpdGVtczpuP3QuZmlsdGVyKCh0PT50Lm1hdGNoKG4pKSk6W119fWZ1bmN0aW9uIHdyKHQsZSxuKXtjb25zdCBpPShmdW5jdGlvbiByKHQsZT0iIil7Y29uc3Qgbj1beHIodCxlKV0saT0oZnVuY3Rpb24gcih0LGU9Ii8iKXtjb25zdCBuPVtdLGk9e307cmV0dXJuIHQuZm9yRWFjaCgodD0+e2NvbnN0IHI9dC5pbmRleE9mKGUpLG89cj49MD90LnNsaWNlKDAscik6dDtpZighaVtvXSl7Y29uc3QgdD17bmFtZTpvLG1ldGFkYXRhOnt0eXBlOmJyLlBSRUZJWF9HUk9VUH0saXRlbXM6W119O2lbb109dCxuLnB1c2godCl9aVtvXS5pdGVtcy5wdXNoKHQpfSkpLG59KSh0KTtyZXR1cm5bXS5jb25jYXQobixpKX0pKGFyKHQpLG4pLG89KGZ1bmN0aW9uIGEodCl7Y29uc3QgZT1uZXcgTWFwO3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChuPT57dFtuXS5mb3JFYWNoKCh0PT57Y29uc3QgaT1lLmdldCh0KXx8W107aS5wdXNoKG4pLGUuc2V0KHQsaSl9KSl9KSksZX0pKFNlLmV4cG9ydHMucGljayh0LGUpKTtyZXR1cm4gaS5tYXAoKCh7bmFtZTp0LG1ldGFkYXRhOmUsaXRlbXM6bn0pPT4oe25hbWU6dCxtZXRhZGF0YTplLGl0ZW1zOm4ubWFwKCh0PT4oe3RhZzp0LHJ1bnM6KG8uZ2V0KHQpfHxbXSkuc2xpY2UoKX0pKSl9KSkpfWZ1bmN0aW9uIFNyKHQsZSl7Y29uc3Qgbj1ucih0LnRhZyxlLnRhZyk7cmV0dXJuIDAhPW4/bjpucih0LnJ1bixlLnJ1bil9ZnVuY3Rpb24gTXIodCxlLG4pe3JldHVybiB3cih0LGUsbikubWFwKChmdW5jdGlvbiBpKHQpe2NvbnN0IGU9U2UuZXhwb3J0cy5mbGF0dGVuKHQuaXRlbXMubWFwKCgoe3RhZzp0LHJ1bnM6ZX0pPT5lLm1hcCgoZT0+KHt0YWc6dCxydW46ZX0pKSkpKSk7cmV0dXJuIGUuc29ydChTcikse25hbWU6dC5uYW1lLG1ldGFkYXRhOnQubWV0YWRhdGEsaXRlbXM6ZX19KSl9Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovIShmdW5jdGlvbih0KXt0W3QuU0VBUkNIX1JFU1VMVFM9MF09IlNFQVJDSF9SRVNVTFRTIix0W3QuUFJFRklYX0dST1VQPTFdPSJQUkVGSVhfR1JPVVAifSkoYnJ8fChicj17fSkpO2NvbnN0IEVyPXthdHRhY2hlZDohMCxkZXRhY2hlZDohMCxyZWFkeTohMCxjcmVhdGVkOiEwLGJlZm9yZVJlZ2lzdGVyOiEwLHJlZ2lzdGVyZWQ6ITAsYXR0cmlidXRlQ2hhbmdlZDohMCxsaXN0ZW5lcnM6ITAsaG9zdEF0dHJpYnV0ZXM6ITB9LFRyPXthdHRhY2hlZDohMCxkZXRhY2hlZDohMCxyZWFkeTohMCxjcmVhdGVkOiEwLGJlZm9yZVJlZ2lzdGVyOiEwLHJlZ2lzdGVyZWQ6ITAsYXR0cmlidXRlQ2hhbmdlZDohMCxiZWhhdmlvcnM6ITAsX25vQWNjZXNzb3JzOiEwfSxDcj1PYmplY3QuYXNzaWduKHtsaXN0ZW5lcnM6ITAsaG9zdEF0dHJpYnV0ZXM6ITAscHJvcGVydGllczohMCxvYnNlcnZlcnM6ITB9LFRyKTtmdW5jdGlvbiBBcih0LGUsbixpKXshKGZ1bmN0aW9uIHIodCxlLG4pe2NvbnN0IGk9dC5fbm9BY2Nlc3NvcnMscj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KTtmb3IobGV0IG89MDtvPHIubGVuZ3RoO28rKyl7bGV0IGE9cltvXTtpZighKGEgaW4gbikpaWYoaSllW2FdPXRbYV07ZWxzZXtsZXQgbj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsYSk7biYmKG4uY29uZmlndXJhYmxlPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLGEsbikpfX19KShlLHQsaSk7Zm9yKGxldCB0IGluIEVyKWVbdF0mJihuW3RdPW5bdF18fFtdLG5bdF0ucHVzaChlW3RdKSl9ZnVuY3Rpb24ga3IodCxlLG4pe2U9ZXx8W107Zm9yKGxldCBpPXQubGVuZ3RoLTE7aT49MDtpLS0pe2xldCByPXRbaV07cj9BcnJheS5pc0FycmF5KHIpP2tyKHIsZSk6ZS5pbmRleE9mKHIpPDAmJighbnx8bi5pbmRleE9mKHIpPDApJiZlLnVuc2hpZnQocik6Y29uc29sZS53YXJuKCJiZWhhdmlvciBpcyBudWxsLCBjaGVjayBmb3IgbWlzc2luZyBvciA0MDQgaW1wb3J0Iil9cmV0dXJuIGV9ZnVuY3Rpb24gTHIodCxlKXtmb3IoY29uc3QgbiBpbiBlKXtjb25zdCBpPXRbbl0scj1lW25dO3Rbbl09ISgidmFsdWUiaW4gcikmJmkmJiJ2YWx1ZSJpbiBpP09iamVjdC5hc3NpZ24oe3ZhbHVlOmkudmFsdWV9LHIpOnJ9fWNvbnN0IFByPWVyKEhUTUxFbGVtZW50KTtmdW5jdGlvbiBOcih0LGUsbil7bGV0IGk7Y29uc3Qgcj17fTtjbGFzcyBvIGV4dGVuZHMgZXtzdGF0aWMgX2ZpbmFsaXplQ2xhc3MoKXtpZih0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoImdlbmVyYXRlZEZyb20iLHRoaXMpKSl7aWYoaSlmb3IobGV0IHQsZT0wO2U8aS5sZW5ndGg7ZSsrKXQ9aVtlXSx0LnByb3BlcnRpZXMmJnRoaXMuY3JlYXRlUHJvcGVydGllcyh0LnByb3BlcnRpZXMpLHQub2JzZXJ2ZXJzJiZ0aGlzLmNyZWF0ZU9ic2VydmVycyh0Lm9ic2VydmVycyx0LnByb3BlcnRpZXMpO3QucHJvcGVydGllcyYmdGhpcy5jcmVhdGVQcm9wZXJ0aWVzKHQucHJvcGVydGllcyksdC5vYnNlcnZlcnMmJnRoaXMuY3JlYXRlT2JzZXJ2ZXJzKHQub2JzZXJ2ZXJzLHQucHJvcGVydGllcyksdGhpcy5fcHJlcGFyZVRlbXBsYXRlKCl9ZWxzZSBlLl9maW5hbGl6ZUNsYXNzLmNhbGwodGhpcyl9c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7Y29uc3QgZT17fTtpZihpKWZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7dCsrKUxyKGUsaVt0XS5wcm9wZXJ0aWVzKTtyZXR1cm4gTHIoZSx0LnByb3BlcnRpZXMpLGV9c3RhdGljIGdldCBvYnNlcnZlcnMoKXtsZXQgZT1bXTtpZihpKWZvcihsZXQgdCxuPTA7bjxpLmxlbmd0aDtuKyspdD1pW25dLHQub2JzZXJ2ZXJzJiYoZT1lLmNvbmNhdCh0Lm9ic2VydmVycykpO3JldHVybiB0Lm9ic2VydmVycyYmKGU9ZS5jb25jYXQodC5vYnNlcnZlcnMpKSxlfWNyZWF0ZWQoKXtzdXBlci5jcmVhdGVkKCk7Y29uc3QgdD1yLmNyZWF0ZWQ7aWYodClmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdLmNhbGwodGhpcyl9X3JlZ2lzdGVyZWQoKXtjb25zdCB0PW8ucHJvdG90eXBlO2lmKCF0Lmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl9faGFzUmVnaXN0ZXJGaW5pc2hlZCIsdCkpKXt0Ll9faGFzUmVnaXN0ZXJGaW5pc2hlZD0hMCxzdXBlci5fcmVnaXN0ZXJlZCgpLHcmJmEodCk7Y29uc3QgZT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7bGV0IG49ci5iZWZvcmVSZWdpc3RlcjtpZihuKWZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKW5bdF0uY2FsbChlKTtpZihuPXIucmVnaXN0ZXJlZCxuKWZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKW5bdF0uY2FsbChlKX19X2FwcGx5TGlzdGVuZXJzKCl7c3VwZXIuX2FwcGx5TGlzdGVuZXJzKCk7Y29uc3QgdD1yLmxpc3RlbmVycztpZih0KWZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtjb25zdCBuPXRbZV07aWYobilmb3IobGV0IHQgaW4gbil0aGlzLl9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKHRoaXMsdCxuW3RdKX19X2Vuc3VyZUF0dHJpYnV0ZXMoKXtjb25zdCB0PXIuaG9zdEF0dHJpYnV0ZXM7aWYodClmb3IobGV0IGU9dC5sZW5ndGgtMTtlPj0wO2UtLSl7Y29uc3Qgbj10W2VdO2ZvcihsZXQgdCBpbiBuKXRoaXMuX2Vuc3VyZUF0dHJpYnV0ZSh0LG5bdF0pfXN1cGVyLl9lbnN1cmVBdHRyaWJ1dGVzKCl9cmVhZHkoKXtzdXBlci5yZWFkeSgpO2xldCB0PXIucmVhZHk7aWYodClmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdLmNhbGwodGhpcyl9YXR0YWNoZWQoKXtzdXBlci5hdHRhY2hlZCgpO2xldCB0PXIuYXR0YWNoZWQ7aWYodClmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdLmNhbGwodGhpcyl9ZGV0YWNoZWQoKXtzdXBlci5kZXRhY2hlZCgpO2xldCB0PXIuZGV0YWNoZWQ7aWYodClmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdLmNhbGwodGhpcyl9YXR0cmlidXRlQ2hhbmdlZCh0LGUsbil7c3VwZXIuYXR0cmlidXRlQ2hhbmdlZCgpO2xldCBpPXIuYXR0cmlidXRlQ2hhbmdlZDtpZihpKWZvcihsZXQgcj0wO3I8aS5sZW5ndGg7cisrKWlbcl0uY2FsbCh0aGlzLHQsZSxuKX19aWYobil7QXJyYXkuaXNBcnJheShuKXx8KG49W25dKTtsZXQgdD1lLnByb3RvdHlwZS5iZWhhdmlvcnM7aT1rcihuLG51bGwsdCksby5wcm90b3R5cGUuYmVoYXZpb3JzPXQ/dC5jb25jYXQobik6aX1jb25zdCBhPWU9PntpJiYoZnVuY3Rpb24gbih0LGUsaSl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspQXIodCxlW25dLGksQ3IpfSkoZSxpLHIpLEFyKGUsdCxyLFRyKX07cmV0dXJuIHd8fGEoby5wcm90b3R5cGUpLG8uZ2VuZXJhdGVkRnJvbT10LG99Y29uc3QgSXI9ZnVuY3Rpb24odCxlKXt0fHxjb25zb2xlLndhcm4oIlBvbHltZXIuQ2xhc3MgcmVxdWlyZXMgYGluZm9gIGFyZ3VtZW50Iik7bGV0IG49ZT9lKFByKTpQcjtyZXR1cm4gbj1Ocih0LG4sdC5iZWhhdmlvcnMpLG4uaXM9bi5wcm90b3R5cGUuaXM9dC5pcyxufSxScj1mdW5jdGlvbih0KXtsZXQgZTtyZXR1cm4gZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJyLkNsYXNzKHQpLHQuX2xlZ2FjeUZvcmNlT2JzZXJ2ZWRBdHRyaWJ1dGVzJiYoZS5wcm90b3R5cGUuX2xlZ2FjeUZvcmNlT2JzZXJ2ZWRBdHRyaWJ1dGVzPXQuX2xlZ2FjeUZvcmNlT2JzZXJ2ZWRBdHRyaWJ1dGVzKSxjdXN0b21FbGVtZW50cy5kZWZpbmUoZS5pcyxlKSxlfTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KZnVuY3Rpb24gT3IodCxlLG4saSxyKXtsZXQgbztyJiYobz0ib2JqZWN0Ij09dHlwZW9mIG4mJm51bGwhPT1uLG8mJihpPXQuX19kYXRhVGVtcFtlXSkpO2xldCBhPWkhPT1uJiYoaT09aXx8bj09bik7cmV0dXJuIG8mJmEmJih0Ll9fZGF0YVRlbXBbZV09biksYX1Sci5DbGFzcz1Jcjtjb25zdCB6cj1JKCh0PT5jbGFzcyBleHRlbmRzIHR7X3Nob3VsZFByb3BlcnR5Q2hhbmdlKHQsZSxuKXtyZXR1cm4gT3IodGhpcyx0LGUsbiwhMCl9fSkpLERyPUkoKHQ9PmNsYXNzIGV4dGVuZHMgdHtzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKXtyZXR1cm57bXV0YWJsZURhdGE6Qm9vbGVhbn19X3Nob3VsZFByb3BlcnR5Q2hhbmdlKHQsZSxuKXtyZXR1cm4gT3IodGhpcyx0LGUsbix0aGlzLm11dGFibGVEYXRhKX19KSk7enIuX211dGFibGVQcm9wZXJ0eUNoYW5nZT1PcjsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KbGV0IEJyPW51bGw7ZnVuY3Rpb24gSHIoKXtyZXR1cm4gQnJ9SHIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSFRNTFRlbXBsYXRlRWxlbWVudC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpIcix3cml0YWJsZTohMH19KTtjb25zdCBGcj1oZShIciksVnI9enIoRnIpLFVyPWhlKGNsYXNze30pO2Z1bmN0aW9uIGpyKHQsZSl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2xldCBpPWVbbl07aWYoQm9vbGVhbih0KSE9Qm9vbGVhbihpLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXykpaWYoaS5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFKXQ/KGkuX19wb2x5bWVyVGV4dENvbnRlbnRfXz1pLnRleHRDb250ZW50LGkudGV4dENvbnRlbnQ9IiIpOmkudGV4dENvbnRlbnQ9aS5fX3BvbHltZXJUZXh0Q29udGVudF9fO2Vsc2UgaWYoInNsb3QiPT09aS5sb2NhbE5hbWUpaWYodClpLl9fcG9seW1lclJlcGxhY2VkX189ZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgiaGlkZGVuLXNsb3QiKSxZKFkoaSkucGFyZW50Tm9kZSkucmVwbGFjZUNoaWxkKGkuX19wb2x5bWVyUmVwbGFjZWRfXyxpKTtlbHNle2NvbnN0IHQ9aS5fX3BvbHltZXJSZXBsYWNlZF9fO3QmJlkoWSh0KS5wYXJlbnROb2RlKS5yZXBsYWNlQ2hpbGQoaSx0KX1lbHNlIGkuc3R5bGUmJih0PyhpLl9fcG9seW1lckRpc3BsYXlfXz1pLnN0eWxlLmRpc3BsYXksaS5zdHlsZS5kaXNwbGF5PSJub25lIik6aS5zdHlsZS5kaXNwbGF5PWkuX19wb2x5bWVyRGlzcGxheV9fKTtpLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXz10LGkuX3Nob3dIaWRlQ2hpbGRyZW4mJmkuX3Nob3dIaWRlQ2hpbGRyZW4odCl9fWNsYXNzIEdyIGV4dGVuZHMgVXJ7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLl9jb25maWd1cmVQcm9wZXJ0aWVzKHQpLHRoaXMucm9vdD10aGlzLl9zdGFtcFRlbXBsYXRlKHRoaXMuX19kYXRhSG9zdCk7bGV0IGU9W107dGhpcy5jaGlsZHJlbj1lO2ZvcihsZXQgdD10aGlzLnJvb3QuZmlyc3RDaGlsZDt0O3Q9dC5uZXh0U2libGluZyllLnB1c2godCksdC5fX3RlbXBsYXRpemVJbnN0YW5jZT10aGlzO3RoaXMuX190ZW1wbGF0aXplT3duZXImJnRoaXMuX190ZW1wbGF0aXplT3duZXIuX19oaWRlVGVtcGxhdGVDaGlsZHJlbl9fJiZ0aGlzLl9zaG93SGlkZUNoaWxkcmVuKCEwKTtsZXQgbj10aGlzLl9fdGVtcGxhdGl6ZU9wdGlvbnM7KHQmJm4uaW5zdGFuY2VQcm9wc3x8IW4uaW5zdGFuY2VQcm9wcykmJnRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKX1fY29uZmlndXJlUHJvcGVydGllcyh0KXtpZih0aGlzLl9fdGVtcGxhdGl6ZU9wdGlvbnMuZm9yd2FyZEhvc3RQcm9wKWZvcihsZXQgdCBpbiB0aGlzLl9faG9zdFByb3BzKXRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eSh0LHRoaXMuX19kYXRhSG9zdFsiX2hvc3RfIit0XSk7Zm9yKGxldCBlIGluIHQpdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5KGUsdFtlXSl9Zm9yd2FyZEhvc3RQcm9wKHQsZSl7dGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHQsZSwhMSwhMCkmJnRoaXMuX19kYXRhSG9zdC5fZW5xdWV1ZUNsaWVudCh0aGlzKX1fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZSh0LGUsbil7aWYodGhpcy5fbWV0aG9kSG9zdCYmdGhpcy5fX3RlbXBsYXRpemVPcHRpb25zLnBhcmVudE1vZGVsKXRoaXMuX21ldGhvZEhvc3QuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUodCxlLCh0PT57dC5tb2RlbD10aGlzLG4odCl9KSk7ZWxzZXtsZXQgaT10aGlzLl9fZGF0YUhvc3QuX19kYXRhSG9zdDtpJiZpLl9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKHQsZSxuKX19X3Nob3dIaWRlQ2hpbGRyZW4odCl7anIodCx0aGlzLmNoaWxkcmVuKX1fc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUodCxlLG4pe3QuX19oaWRlVGVtcGxhdGVDaGlsZHJlbl9fJiZ0Lm5vZGVUeXBlPT1Ob2RlLlRFWFRfTk9ERSYmInRleHRDb250ZW50Ij09ZT90Ll9fcG9seW1lclRleHRDb250ZW50X189bjpzdXBlci5fc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUodCxlLG4pfWdldCBwYXJlbnRNb2RlbCgpe2xldCB0PXRoaXMuX19wYXJlbnRNb2RlbDtpZighdCl7bGV0IGU7dD10aGlzO2Rve3Q9dC5fX2RhdGFIb3N0Ll9fZGF0YUhvc3R9d2hpbGUoKGU9dC5fX3RlbXBsYXRpemVPcHRpb25zKSYmIWUucGFyZW50TW9kZWwpO3RoaXMuX19wYXJlbnRNb2RlbD10fXJldHVybiB0fWRpc3BhdGNoRXZlbnQodCl7cmV0dXJuITB9fWNvbnN0IFdyPXpyKEdyKTtmdW5jdGlvbiBxcih0KXtsZXQgZT10Ll9fZGF0YUhvc3Q7cmV0dXJuIGUmJmUuX21ldGhvZEhvc3R8fGV9ZnVuY3Rpb24gWXIodCxlKXtyZXR1cm4gZnVuY3Rpb24gdChuLGkscil7ZS5jYWxsKG4uX190ZW1wbGF0aXplT3duZXIsaS5zdWJzdHJpbmcoIl9ob3N0XyIubGVuZ3RoKSxyW2ldKX19ZnVuY3Rpb24gWHIodCxlKXtyZXR1cm4gZnVuY3Rpb24gdChuLGkscil7ZS5jYWxsKG4uX190ZW1wbGF0aXplT3duZXIsbixpLHJbaV0pfX1mdW5jdGlvbiAkcih0LGUsbil7aWYoYiYmIXFyKHQpKXRocm93IG5ldyBFcnJvcigic3RyaWN0VGVtcGxhdGVQb2xpY3k6IHRlbXBsYXRlIG93bmVyIG5vdCB0cnVzdGVkIik7aWYobj1ufHx7fSx0Ll9fdGVtcGxhdGl6ZU93bmVyKXRocm93IG5ldyBFcnJvcigiQSA8dGVtcGxhdGU+IGNhbiBvbmx5IGJlIHRlbXBsYXRpemVkIG9uY2UiKTt0Ll9fdGVtcGxhdGl6ZU93bmVyPWU7bGV0IGk9KGU/ZS5jb25zdHJ1Y3RvcjpHcikuX3BhcnNlVGVtcGxhdGUodCkscj1pLnRlbXBsYXRpemVJbnN0YW5jZUNsYXNzO3J8fChyPShmdW5jdGlvbiBvKHQsZSxuKXtsZXQgaT1uLm11dGFibGVEYXRhP1dyOkdyOyRyLm1peGluJiYoaT0kci5taXhpbihpKSk7bGV0IHI9Y2xhc3MgZXh0ZW5kcyBpe307cmV0dXJuIHIucHJvdG90eXBlLl9fdGVtcGxhdGl6ZU9wdGlvbnM9bixyLnByb3RvdHlwZS5fYmluZFRlbXBsYXRlKHQpLChmdW5jdGlvbiBvKHQsZSxuLGkpe2xldCByPW4uaG9zdFByb3BzfHx7fTtmb3IobGV0IGUgaW4gaS5pbnN0YW5jZVByb3BzKXtkZWxldGUgcltlXTtsZXQgbj1pLm5vdGlmeUluc3RhbmNlUHJvcDtuJiZ0LnByb3RvdHlwZS5fYWRkUHJvcGVydHlFZmZlY3QoZSx0LnByb3RvdHlwZS5QUk9QRVJUWV9FRkZFQ1RfVFlQRVMuTk9USUZZLHtmbjpYcigwLG4pfSl9aWYoaS5mb3J3YXJkSG9zdFByb3AmJmUuX19kYXRhSG9zdClmb3IobGV0IGUgaW4gciluLmhhc0hvc3RQcm9wc3x8KG4uaGFzSG9zdFByb3BzPSEwKSx0LnByb3RvdHlwZS5fYWRkUHJvcGVydHlFZmZlY3QoZSx0LnByb3RvdHlwZS5QUk9QRVJUWV9FRkZFQ1RfVFlQRVMuTk9USUZZLHtmbjpmdW5jdGlvbiB0KGUsbixpKXtlLl9fZGF0YUhvc3QuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aCgiX2hvc3RfIituLGlbbl0sITAsITApfX0pfSkocix0LGUsbikscn0pKHQsaSxuKSxpLnRlbXBsYXRpemVJbnN0YW5jZUNsYXNzPXIpO2NvbnN0IGE9cXIodCk7IShmdW5jdGlvbiBzKHQsZSxuLGkpe2xldCByPW4uZm9yd2FyZEhvc3RQcm9wO2lmKHImJmUuaGFzSG9zdFByb3BzKXtjb25zdCBvPSJ0ZW1wbGF0ZSI9PXQubG9jYWxOYW1lO2xldCBhPWUudGVtcGxhdGl6ZVRlbXBsYXRlQ2xhc3M7aWYoIWEpe2lmKG8pe2xldCB0PW4ubXV0YWJsZURhdGE/VnI6RnI7Y2xhc3MgaSBleHRlbmRzIHR7fWE9ZS50ZW1wbGF0aXplVGVtcGxhdGVDbGFzcz1pfWVsc2V7Y29uc3Qgbj10LmNvbnN0cnVjdG9yO2NsYXNzIGkgZXh0ZW5kcyBue31hPWUudGVtcGxhdGl6ZVRlbXBsYXRlQ2xhc3M9aX1sZXQgcz1lLmhvc3RQcm9wcztmb3IobGV0IHQgaW4gcylhLnByb3RvdHlwZS5fYWRkUHJvcGVydHlFZmZlY3QoIl9ob3N0XyIrdCxhLnByb3RvdHlwZS5QUk9QRVJUWV9FRkZFQ1RfVFlQRVMuUFJPUEFHQVRFLHtmbjpZcigwLHIpfSksYS5wcm90b3R5cGUuX2NyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5KCJfaG9zdF8iK3QpO1MmJmkmJihmdW5jdGlvbiBvKHQsZSxuKXtjb25zdCBpPW4uY29uc3RydWN0b3IuX3Byb3BlcnRpZXMse3Byb3BlcnR5RWZmZWN0czpyfT10LHtpbnN0YW5jZVByb3BzOm99PWU7Zm9yKGxldCB0IGluIHIpaWYoIShpW3RdfHxvJiZvW3RdKSl7Y29uc3QgZT1yW3RdO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtjb25zdHtwYXJ0Oml9PWVbbl0uaW5mbztpZighaS5zaWduYXR1cmV8fCFpLnNpZ25hdHVyZS5zdGF0aWMpe2NvbnNvbGUud2FybihgUHJvcGVydHkgJyR7dH0nIHVzZWQgaW4gdGVtcGxhdGUgYnV0IG5vdCBkZWNsYXJlZCBpbiAncHJvcGVydGllcyc7IGF0dHJpYnV0ZSB3aWxsIG5vdCBiZSBvYnNlcnZlZC5gKTticmVha319fX0pKGUsbixpKX1pZih0Ll9fZGF0YVByb3RvJiZPYmplY3QuYXNzaWduKHQuX19kYXRhLHQuX19kYXRhUHJvdG8pLG8pIShmdW5jdGlvbiBhKHQsZSl7QnI9dCxPYmplY3Quc2V0UHJvdG90eXBlT2YodCxlLnByb3RvdHlwZSksbmV3IGUsQnI9bnVsbH0pKHQsYSksdC5fX2RhdGFUZW1wPXt9LHQuX19kYXRhUGVuZGluZz1udWxsLHQuX19kYXRhT2xkPW51bGwsdC5fZW5hYmxlUHJvcGVydGllcygpO2Vsc2V7T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsYS5wcm90b3R5cGUpO2NvbnN0IG49ZS5ob3N0UHJvcHM7Zm9yKGxldCBlIGluIG4paWYoZT0iX2hvc3RfIitlLGUgaW4gdCl7Y29uc3Qgbj10W2VdO2RlbGV0ZSB0W2VdLHQuX19kYXRhW2VdPW59fX19KSh0LGksbixhKTtsZXQgbD1jbGFzcyBleHRlbmRzIHJ7fTtyZXR1cm4gbC5wcm90b3R5cGUuX21ldGhvZEhvc3Q9YSxsLnByb3RvdHlwZS5fX2RhdGFIb3N0PXQsbC5wcm90b3R5cGUuX190ZW1wbGF0aXplT3duZXI9ZSxsLnByb3RvdHlwZS5fX2hvc3RQcm9wcz1pLmhvc3RQcm9wcyxsPWwsbH1mdW5jdGlvbiBLcih0LGUpe2xldCBuO2Zvcig7ZTspaWYobj1lLl9fZGF0YUhvc3Q/ZTplLl9fdGVtcGxhdGl6ZUluc3RhbmNlKXtpZihuLl9fZGF0YUhvc3Q9PXQpcmV0dXJuIG47ZT1uLl9fZGF0YUhvc3R9ZWxzZSBlPVkoZSkucGFyZW50Tm9kZTtyZXR1cm4gbnVsbH0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9jb25zdCBacj17dGVtcGxhdGl6ZSh0LGUpe3RoaXMuX3RlbXBsYXRpemVyVGVtcGxhdGU9dCx0aGlzLmN0b3I9JHIodCx0aGlzLHttdXRhYmxlRGF0YTpCb29sZWFuKGUpLHBhcmVudE1vZGVsOnRoaXMuX3BhcmVudE1vZGVsLGluc3RhbmNlUHJvcHM6dGhpcy5faW5zdGFuY2VQcm9wcyxmb3J3YXJkSG9zdFByb3A6dGhpcy5fZm9yd2FyZEhvc3RQcm9wVjIsbm90aWZ5SW5zdGFuY2VQcm9wOnRoaXMuX25vdGlmeUluc3RhbmNlUHJvcFYyfSl9LHN0YW1wKHQpe3JldHVybiBuZXcgdGhpcy5jdG9yKHQpfSxtb2RlbEZvckVsZW1lbnQodCl7cmV0dXJuIEtyKHRoaXMuX3RlbXBsYXRpemVyVGVtcGxhdGUsdCl9fTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9sZXQgSnI9ITE7ZnVuY3Rpb24gUXIoKXtpZih3JiYhbSl7aWYoIUpyKXtKcj0hMDtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7dC50ZXh0Q29udGVudD0iZG9tLWJpbmQsZG9tLWlmLGRvbS1yZXBlYXR7ZGlzcGxheTpub25lO30iLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodCl9cmV0dXJuITB9cmV0dXJuITF9Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovY29uc3QgdG89cGkoRHIoaGUoSFRNTEVsZW1lbnQpKSk7Y3VzdG9tRWxlbWVudHMuZGVmaW5lKCJkb20tYmluZCIsY2xhc3MgZXh0ZW5kcyB0b3tzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpe3JldHVyblsibXV0YWJsZS1kYXRhIl19Y29uc3RydWN0b3IoKXtpZihzdXBlcigpLGIpdGhyb3cgbmV3IEVycm9yKCJzdHJpY3RUZW1wbGF0ZVBvbGljeTogZG9tLWJpbmQgbm90IGFsbG93ZWQiKTt0aGlzLnJvb3Q9bnVsbCx0aGlzLiQ9bnVsbCx0aGlzLl9fY2hpbGRyZW49bnVsbH1hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodCxlLG4saSl7dGhpcy5tdXRhYmxlRGF0YT0hMH1jb25uZWN0ZWRDYWxsYmFjaygpe1FyKCl8fCh0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSx0aGlzLnJlbmRlcigpfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7dGhpcy5fX3JlbW92ZUNoaWxkcmVuKCl9X19pbnNlcnRDaGlsZHJlbigpe1koWSh0aGlzKS5wYXJlbnROb2RlKS5pbnNlcnRCZWZvcmUodGhpcy5yb290LHRoaXMpfV9fcmVtb3ZlQ2hpbGRyZW4oKXtpZih0aGlzLl9fY2hpbGRyZW4pZm9yKGxldCB0PTA7dDx0aGlzLl9fY2hpbGRyZW4ubGVuZ3RoO3QrKyl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5fX2NoaWxkcmVuW3RdKX1yZW5kZXIoKXtsZXQgdDtpZighdGhpcy5fX2NoaWxkcmVuKXtpZih0PXR8fHRoaXMucXVlcnlTZWxlY3RvcigidGVtcGxhdGUiKSwhdCl7bGV0IGU9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCgpPT57aWYodD10aGlzLnF1ZXJ5U2VsZWN0b3IoInRlbXBsYXRlIiksIXQpdGhyb3cgbmV3IEVycm9yKCJkb20tYmluZCByZXF1aXJlcyBhIDx0ZW1wbGF0ZT4gY2hpbGQiKTtlLmRpc2Nvbm5lY3QoKSx0aGlzLnJlbmRlcigpfSkpO3JldHVybiB2b2lkIGUub2JzZXJ2ZSh0aGlzLHtjaGlsZExpc3Q6ITB9KX10aGlzLnJvb3Q9dGhpcy5fc3RhbXBUZW1wbGF0ZSh0KSx0aGlzLiQ9dGhpcy5yb290LiQsdGhpcy5fX2NoaWxkcmVuPVtdO2ZvcihsZXQgdD10aGlzLnJvb3QuZmlyc3RDaGlsZDt0O3Q9dC5uZXh0U2libGluZyl0aGlzLl9fY2hpbGRyZW5bdGhpcy5fX2NoaWxkcmVuLmxlbmd0aF09dDt0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCl9dGhpcy5fX2luc2VydENoaWxkcmVuKCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiZG9tLWNoYW5nZSIse2J1YmJsZXM6ITAsY29tcG9zZWQ6ITB9KSl9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IGVvPURyKHllKTtjbGFzcyBubyBleHRlbmRzIGVve3N0YXRpYyBnZXQgaXMoKXtyZXR1cm4iZG9tLXJlcGVhdCJ9c3RhdGljIGdldCB0ZW1wbGF0ZSgpe3JldHVybiBudWxsfXN0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntpdGVtczp7dHlwZTpBcnJheX0sYXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpdGVtIn0saW5kZXhBczp7dHlwZTpTdHJpbmcsdmFsdWU6ImluZGV4In0saXRlbXNJbmRleEFzOnt0eXBlOlN0cmluZyx2YWx1ZToiaXRlbXNJbmRleCJ9LHNvcnQ6e3R5cGU6RnVuY3Rpb24sb2JzZXJ2ZXI6Il9fc29ydENoYW5nZWQifSxmaWx0ZXI6e3R5cGU6RnVuY3Rpb24sb2JzZXJ2ZXI6Il9fZmlsdGVyQ2hhbmdlZCJ9LG9ic2VydmU6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfX29ic2VydmVDaGFuZ2VkIn0sZGVsYXk6TnVtYmVyLHJlbmRlcmVkSXRlbUNvdW50Ont0eXBlOk51bWJlcixub3RpZnk6IWsscmVhZE9ubHk6ITB9LGluaXRpYWxDb3VudDp7dHlwZTpOdW1iZXJ9LHRhcmdldEZyYW1lcmF0ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MjB9LF90YXJnZXRGcmFtZVRpbWU6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfX2NvbXB1dGVGcmFtZVRpbWUodGFyZ2V0RnJhbWVyYXRlKSJ9LG5vdGlmeURvbUNoYW5nZTp7dHlwZTpCb29sZWFufSxyZXVzZUNodW5rZWRJbnN0YW5jZXM6e3R5cGU6Qm9vbGVhbn19fXN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCl7cmV0dXJuWyJfX2l0ZW1zQ2hhbmdlZChpdGVtcy4qKSJdfWNvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9faW5zdGFuY2VzPVtdLHRoaXMuX19yZW5kZXJEZWJvdW5jZXI9bnVsbCx0aGlzLl9faXRlbXNJZHhUb0luc3RJZHg9e30sdGhpcy5fX2NodW5rQ291bnQ9bnVsbCx0aGlzLl9fcmVuZGVyU3RhcnRUaW1lPW51bGwsdGhpcy5fX2l0ZW1zQXJyYXlDaGFuZ2VkPSExLHRoaXMuX19zaG91bGRNZWFzdXJlQ2h1bms9ITEsdGhpcy5fX3Nob3VsZENvbnRpbnVlQ2h1bmtpbmc9ITEsdGhpcy5fX2NodW5raW5nSWQ9MCx0aGlzLl9fc29ydEZuPW51bGwsdGhpcy5fX2ZpbHRlckZuPW51bGwsdGhpcy5fX29ic2VydmVQYXRocz1udWxsLHRoaXMuX19jdG9yPW51bGwsdGhpcy5fX2lzRGV0YWNoZWQ9ITAsdGhpcy50ZW1wbGF0ZT1udWxsfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLl9faXNEZXRhY2hlZD0hMDtmb3IobGV0IHQ9MDt0PHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoO3QrKyl0aGlzLl9fZGV0YWNoSW5zdGFuY2UodCl9Y29ubmVjdGVkQ2FsbGJhY2soKXtpZihzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLFFyKCl8fCh0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSx0aGlzLl9faXNEZXRhY2hlZCl7dGhpcy5fX2lzRGV0YWNoZWQ9ITE7bGV0IHQ9WShZKHRoaXMpLnBhcmVudE5vZGUpO2ZvcihsZXQgZT0wO2U8dGhpcy5fX2luc3RhbmNlcy5sZW5ndGg7ZSsrKXRoaXMuX19hdHRhY2hJbnN0YW5jZShlLHQpfX1fX2Vuc3VyZVRlbXBsYXRpemVkKCl7aWYoIXRoaXMuX19jdG9yKXtjb25zdCB0PXRoaXM7bGV0IGU9dGhpcy50ZW1wbGF0ZT10Ll90ZW1wbGF0ZUluZm8/dDp0aGlzLnF1ZXJ5U2VsZWN0b3IoInRlbXBsYXRlIik7aWYoIWUpe2xldCB0PW5ldyBNdXRhdGlvbk9ic2VydmVyKCgoKT0+e2lmKCF0aGlzLnF1ZXJ5U2VsZWN0b3IoInRlbXBsYXRlIikpdGhyb3cgbmV3IEVycm9yKCJkb20tcmVwZWF0IHJlcXVpcmVzIGEgPHRlbXBsYXRlPiBjaGlsZCIpO3QuZGlzY29ubmVjdCgpLHRoaXMuX19yZW5kZXIoKX0pKTtyZXR1cm4gdC5vYnNlcnZlKHRoaXMse2NoaWxkTGlzdDohMH0pLCExfWxldCBuPXt9O25bdGhpcy5hc109ITAsblt0aGlzLmluZGV4QXNdPSEwLG5bdGhpcy5pdGVtc0luZGV4QXNdPSEwLHRoaXMuX19jdG9yPSRyKGUsdGhpcyx7bXV0YWJsZURhdGE6dGhpcy5tdXRhYmxlRGF0YSxwYXJlbnRNb2RlbDohMCxpbnN0YW5jZVByb3BzOm4sZm9yd2FyZEhvc3RQcm9wOmZ1bmN0aW9uKHQsZSl7bGV0IG49dGhpcy5fX2luc3RhbmNlcztmb3IobGV0IGkscj0wO3I8bi5sZW5ndGgmJihpPW5bcl0pO3IrKylpLmZvcndhcmRIb3N0UHJvcCh0LGUpfSxub3RpZnlJbnN0YW5jZVByb3A6ZnVuY3Rpb24odCxlLG4pe2lmKFEodGhpcy5hcyxlKSl7bGV0IGk9dFt0aGlzLml0ZW1zSW5kZXhBc107ZT09dGhpcy5hcyYmKHRoaXMuaXRlbXNbaV09bik7bGV0IHI9Sih0aGlzLmFzLGAke0pTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIml0ZW1zIix0aGlzKX0uJHtpfWAsZSk7dGhpcy5ub3RpZnlQYXRoKHIsbil9fX0pfXJldHVybiEwfV9fZ2V0TWV0aG9kSG9zdCgpe3JldHVybiB0aGlzLl9fZGF0YUhvc3QuX21ldGhvZEhvc3R8fHRoaXMuX19kYXRhSG9zdH1fX2Z1bmN0aW9uRnJvbVByb3BlcnR5VmFsdWUodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtsZXQgZT10LG49dGhpcy5fX2dldE1ldGhvZEhvc3QoKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbltlXS5hcHBseShuLGFyZ3VtZW50cyl9fXJldHVybiB0fV9fc29ydENoYW5nZWQodCl7dGhpcy5fX3NvcnRGbj10aGlzLl9fZnVuY3Rpb25Gcm9tUHJvcGVydHlWYWx1ZSh0KSx0aGlzLml0ZW1zJiZ0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcil9X19maWx0ZXJDaGFuZ2VkKHQpe3RoaXMuX19maWx0ZXJGbj10aGlzLl9fZnVuY3Rpb25Gcm9tUHJvcGVydHlWYWx1ZSh0KSx0aGlzLml0ZW1zJiZ0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcil9X19jb21wdXRlRnJhbWVUaW1lKHQpe3JldHVybiBNYXRoLmNlaWwoMWUzL3QpfV9fb2JzZXJ2ZUNoYW5nZWQoKXt0aGlzLl9fb2JzZXJ2ZVBhdGhzPXRoaXMub2JzZXJ2ZSYmdGhpcy5vYnNlcnZlLnJlcGxhY2UoIi4qIiwiLiIpLnNwbGl0KCIgIil9X19oYW5kbGVPYnNlcnZlZFBhdGhzKHQpe2lmKHRoaXMuX19zb3J0Rm58fHRoaXMuX19maWx0ZXJGbilpZih0KXtpZih0aGlzLl9fb2JzZXJ2ZVBhdGhzKXtsZXQgZT10aGlzLl9fb2JzZXJ2ZVBhdGhzO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKTA9PT10LmluZGV4T2YoZVtuXSkmJnRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyLHRoaXMuZGVsYXkpfX1lbHNlIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyLHRoaXMuZGVsYXkpfV9faXRlbXNDaGFuZ2VkKHQpe3RoaXMuaXRlbXMmJiFBcnJheS5pc0FycmF5KHRoaXMuaXRlbXMpJiZjb25zb2xlLndhcm4oImRvbS1yZXBlYXQgZXhwZWN0ZWQgYXJyYXkgZm9yIGBpdGVtc2AsIGZvdW5kIix0aGlzLml0ZW1zKSx0aGlzLl9faGFuZGxlSXRlbVBhdGgodC5wYXRoLHQudmFsdWUpfHwoIml0ZW1zIj09PXQucGF0aCYmKHRoaXMuX19pdGVtc0FycmF5Q2hhbmdlZD0hMCksdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIpKX1fX2RlYm91bmNlUmVuZGVyKHQsZT0wKXt0aGlzLl9fcmVuZGVyRGVib3VuY2VyPVRuLmRlYm91bmNlKHRoaXMuX19yZW5kZXJEZWJvdW5jZXIsZT4wP2d0LmFmdGVyKGUpOnZ0LHQuYmluZCh0aGlzKSksQW4odGhpcy5fX3JlbmRlckRlYm91bmNlcil9cmVuZGVyKCl7dGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIpLERpKCl9X19yZW5kZXIoKXtpZighdGhpcy5fX2Vuc3VyZVRlbXBsYXRpemVkKCkpcmV0dXJuO2xldCB0PXRoaXMuaXRlbXN8fFtdO2NvbnN0IGU9dGhpcy5fX3NvcnRBbmRGaWx0ZXJJdGVtcyh0KSxuPXRoaXMuX19jYWxjdWxhdGVMaW1pdChlLmxlbmd0aCk7dGhpcy5fX3VwZGF0ZUluc3RhbmNlcyh0LG4sZSksdGhpcy5pbml0aWFsQ291bnQmJih0aGlzLl9fc2hvdWxkTWVhc3VyZUNodW5rfHx0aGlzLl9fc2hvdWxkQ29udGludWVDaHVua2luZykmJihjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fY2h1bmtpbmdJZCksdGhpcy5fX2NodW5raW5nSWQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+dGhpcy5fX2NvbnRpbnVlQ2h1bmtpbmcoKSkpKSx0aGlzLl9zZXRSZW5kZXJlZEl0ZW1Db3VudCh0aGlzLl9faW5zdGFuY2VzLmxlbmd0aCksayYmIXRoaXMubm90aWZ5RG9tQ2hhbmdlfHx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJkb20tY2hhbmdlIix7YnViYmxlczohMCxjb21wb3NlZDohMH0pKX1fX3NvcnRBbmRGaWx0ZXJJdGVtcyh0KXtsZXQgZT1uZXcgQXJyYXkodC5sZW5ndGgpO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKWVbbl09bjtyZXR1cm4gdGhpcy5fX2ZpbHRlckZuJiYoZT1lLmZpbHRlcigoKGUsbixpKT0+dGhpcy5fX2ZpbHRlckZuKHRbZV0sbixpKSkpKSx0aGlzLl9fc29ydEZuJiZlLnNvcnQoKChlLG4pPT50aGlzLl9fc29ydEZuKHRbZV0sdFtuXSkpKSxlfV9fY2FsY3VsYXRlTGltaXQodCl7bGV0IGU9dDtjb25zdCBuPXRoaXMuX19pbnN0YW5jZXMubGVuZ3RoO2lmKHRoaXMuaW5pdGlhbENvdW50KXtsZXQgaTshdGhpcy5fX2NodW5rQ291bnR8fHRoaXMuX19pdGVtc0FycmF5Q2hhbmdlZCYmIXRoaXMucmV1c2VDaHVua2VkSW5zdGFuY2VzPyhlPU1hdGgubWluKHQsdGhpcy5pbml0aWFsQ291bnQpLGk9TWF0aC5tYXgoZS1uLDApLHRoaXMuX19jaHVua0NvdW50PWl8fDEpOihpPU1hdGgubWluKE1hdGgubWF4KHQtbiwwKSx0aGlzLl9fY2h1bmtDb3VudCksZT1NYXRoLm1pbihuK2ksdCkpLHRoaXMuX19zaG91bGRNZWFzdXJlQ2h1bms9aT09PXRoaXMuX19jaHVua0NvdW50LHRoaXMuX19zaG91bGRDb250aW51ZUNodW5raW5nPWU8dCx0aGlzLl9fcmVuZGVyU3RhcnRUaW1lPXBlcmZvcm1hbmNlLm5vdygpfXJldHVybiB0aGlzLl9faXRlbXNBcnJheUNoYW5nZWQ9ITEsZX1fX2NvbnRpbnVlQ2h1bmtpbmcoKXtpZih0aGlzLl9fc2hvdWxkTWVhc3VyZUNodW5rKXtjb25zdCB0PXBlcmZvcm1hbmNlLm5vdygpLXRoaXMuX19yZW5kZXJTdGFydFRpbWU7dGhpcy5fX2NodW5rQ291bnQ9TWF0aC5yb3VuZCh0aGlzLl9fY2h1bmtDb3VudCoodGhpcy5fdGFyZ2V0RnJhbWVUaW1lL3QpKXx8MX10aGlzLl9fc2hvdWxkQ29udGludWVDaHVua2luZyYmdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIpfV9fdXBkYXRlSW5zdGFuY2VzKHQsZSxuKXtjb25zdCBpPXRoaXMuX19pdGVtc0lkeFRvSW5zdElkeD17fTtsZXQgcjtmb3Iocj0wO3I8ZTtyKyspe2xldCBlPXRoaXMuX19pbnN0YW5jZXNbcl0sbz1uW3JdLGE9dFtvXTtpW29dPXIsZT8oZS5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuYXMsYSksZS5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaW5kZXhBcyxyKSxlLl9zZXRQZW5kaW5nUHJvcGVydHkodGhpcy5pdGVtc0luZGV4QXMsbyksZS5fZmx1c2hQcm9wZXJ0aWVzKCkpOnRoaXMuX19pbnNlcnRJbnN0YW5jZShhLHIsbyl9Zm9yKGxldCB0PXRoaXMuX19pbnN0YW5jZXMubGVuZ3RoLTE7dD49cjt0LS0pdGhpcy5fX2RldGFjaEFuZFJlbW92ZUluc3RhbmNlKHQpfV9fZGV0YWNoSW5zdGFuY2UodCl7bGV0IGU9dGhpcy5fX2luc3RhbmNlc1t0XTtjb25zdCBuPVkoZS5yb290KTtmb3IobGV0IHQ9MDt0PGUuY2hpbGRyZW4ubGVuZ3RoO3QrKyluLmFwcGVuZENoaWxkKGUuY2hpbGRyZW5bdF0pO3JldHVybiBlfV9fYXR0YWNoSW5zdGFuY2UodCxlKXtlLmluc2VydEJlZm9yZSh0aGlzLl9faW5zdGFuY2VzW3RdLnJvb3QsdGhpcyl9X19kZXRhY2hBbmRSZW1vdmVJbnN0YW5jZSh0KXt0aGlzLl9fZGV0YWNoSW5zdGFuY2UodCksdGhpcy5fX2luc3RhbmNlcy5zcGxpY2UodCwxKX1fX3N0YW1wSW5zdGFuY2UodCxlLG4pe2xldCBpPXt9O3JldHVybiBpW3RoaXMuYXNdPXQsaVt0aGlzLmluZGV4QXNdPWUsaVt0aGlzLml0ZW1zSW5kZXhBc109bixuZXcgdGhpcy5fX2N0b3IoaSl9X19pbnNlcnRJbnN0YW5jZSh0LGUsbil7Y29uc3QgaT10aGlzLl9fc3RhbXBJbnN0YW5jZSh0LGUsbik7bGV0IHI9dGhpcy5fX2luc3RhbmNlc1tlKzFdLG89cj9yLmNoaWxkcmVuWzBdOnRoaXM7cmV0dXJuIFkoWSh0aGlzKS5wYXJlbnROb2RlKS5pbnNlcnRCZWZvcmUoaS5yb290LG8pLHRoaXMuX19pbnN0YW5jZXNbZV09aSxpfV9zaG93SGlkZUNoaWxkcmVuKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5fX2luc3RhbmNlcy5sZW5ndGg7ZSsrKXRoaXMuX19pbnN0YW5jZXNbZV0uX3Nob3dIaWRlQ2hpbGRyZW4odCl9X19oYW5kbGVJdGVtUGF0aCh0LGUpe2xldCBuPXQuc2xpY2UoNiksaT1uLmluZGV4T2YoIi4iKSxyPWk8MD9uOm4uc3Vic3RyaW5nKDAsaSk7aWYocj09cGFyc2VJbnQociwxMCkpe2xldCB0PWk8MD8iIjpuLnN1YnN0cmluZyhpKzEpO3RoaXMuX19oYW5kbGVPYnNlcnZlZFBhdGhzKHQpO2xldCBvPXRoaXMuX19pbnN0YW5jZXNbdGhpcy5fX2l0ZW1zSWR4VG9JbnN0SWR4W3JdXTtyZXR1cm4gbyYmKG8uX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aCh0aGlzLmFzKyh0PyIuIit0OiIiKSxlLCExLCEwKSxvLl9mbHVzaFByb3BlcnRpZXMoKSksITB9fWl0ZW1Gb3JFbGVtZW50KHQpe2xldCBlPXRoaXMubW9kZWxGb3JFbGVtZW50KHQpO3JldHVybiBlJiZlW3RoaXMuYXNdfWluZGV4Rm9yRWxlbWVudCh0KXtsZXQgZT10aGlzLm1vZGVsRm9yRWxlbWVudCh0KTtyZXR1cm4gZSYmZVt0aGlzLmluZGV4QXNdfW1vZGVsRm9yRWxlbWVudCh0KXtyZXR1cm4gS3IodGhpcy50ZW1wbGF0ZSx0KX19Y3VzdG9tRWxlbWVudHMuZGVmaW5lKG5vLmlzLG5vKTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY2xhc3MgaW8gZXh0ZW5kcyB5ZXtzdGF0aWMgZ2V0IGlzKCl7cmV0dXJuImRvbS1pZiJ9c3RhdGljIGdldCB0ZW1wbGF0ZSgpe3JldHVybiBudWxsfXN0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntpZjp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfX2RlYm91bmNlUmVuZGVyIn0scmVzdGFtcDp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfX2RlYm91bmNlUmVuZGVyIn0sbm90aWZ5RG9tQ2hhbmdlOnt0eXBlOkJvb2xlYW59fX1jb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5fX3JlbmRlckRlYm91bmNlcj1udWxsLHRoaXMuX2xhc3RJZj0hMSx0aGlzLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXz0hMX1fX2RlYm91bmNlUmVuZGVyKCl7dGhpcy5fX3JlbmRlckRlYm91bmNlcj1Ubi5kZWJvdW5jZSh0aGlzLl9fcmVuZGVyRGVib3VuY2VyLHZ0LCgoKT0+dGhpcy5fX3JlbmRlcigpKSksQW4odGhpcy5fX3JlbmRlckRlYm91bmNlcil9ZGlzY29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO2NvbnN0IHQ9WSh0aGlzKS5wYXJlbnROb2RlO3QmJih0Lm5vZGVUeXBlIT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREV8fFkodCkuaG9zdCl8fHRoaXMuX190ZWFyZG93bkluc3RhbmNlKCl9Y29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLFFyKCl8fCh0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSx0aGlzLmlmJiZ0aGlzLl9fZGVib3VuY2VSZW5kZXIoKX1fX2Vuc3VyZVRlbXBsYXRlKCl7aWYoIXRoaXMuX190ZW1wbGF0ZSl7Y29uc3QgdD10aGlzO2xldCBlPXQuX3RlbXBsYXRlSW5mbz90OlkodCkucXVlcnlTZWxlY3RvcigidGVtcGxhdGUiKTtpZighZSl7bGV0IHQ9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCgpPT57aWYoIVkodGhpcykucXVlcnlTZWxlY3RvcigidGVtcGxhdGUiKSl0aHJvdyBuZXcgRXJyb3IoImRvbS1pZiByZXF1aXJlcyBhIDx0ZW1wbGF0ZT4gY2hpbGQiKTt0LmRpc2Nvbm5lY3QoKSx0aGlzLl9fcmVuZGVyKCl9KSk7cmV0dXJuIHQub2JzZXJ2ZSh0aGlzLHtjaGlsZExpc3Q6ITB9KSwhMX10aGlzLl9fdGVtcGxhdGU9ZX1yZXR1cm4hMH1fX2Vuc3VyZUluc3RhbmNlKCl7bGV0IHQ9WSh0aGlzKS5wYXJlbnROb2RlO2lmKHRoaXMuX19oYXNJbnN0YW5jZSgpKXtsZXQgZT10aGlzLl9fZ2V0SW5zdGFuY2VOb2RlcygpO2lmKGUmJmUubGVuZ3RoJiZZKHRoaXMpLnByZXZpb3VzU2libGluZyE9PWVbZS5sZW5ndGgtMV0pZm9yKGxldCBuLGk9MDtpPGUubGVuZ3RoJiYobj1lW2ldKTtpKyspWSh0KS5pbnNlcnRCZWZvcmUobix0aGlzKX1lbHNle2lmKCF0KXJldHVybiExO2lmKCF0aGlzLl9fZW5zdXJlVGVtcGxhdGUoKSlyZXR1cm4hMTt0aGlzLl9fY3JlYXRlQW5kSW5zZXJ0SW5zdGFuY2UodCl9cmV0dXJuITB9cmVuZGVyKCl7RGkoKX1fX3JlbmRlcigpe2lmKHRoaXMuaWYpe2lmKCF0aGlzLl9fZW5zdXJlSW5zdGFuY2UoKSlyZXR1cm59ZWxzZSB0aGlzLnJlc3RhbXAmJnRoaXMuX190ZWFyZG93bkluc3RhbmNlKCk7dGhpcy5fc2hvd0hpZGVDaGlsZHJlbigpLGsmJiF0aGlzLm5vdGlmeURvbUNoYW5nZXx8dGhpcy5pZj09dGhpcy5fbGFzdElmfHwodGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiZG9tLWNoYW5nZSIse2J1YmJsZXM6ITAsY29tcG9zZWQ6ITB9KSksdGhpcy5fbGFzdElmPXRoaXMuaWYpfV9faGFzSW5zdGFuY2UoKXt9X19nZXRJbnN0YW5jZU5vZGVzKCl7fV9fY3JlYXRlQW5kSW5zZXJ0SW5zdGFuY2UodCl7fV9fdGVhcmRvd25JbnN0YW5jZSgpe31fc2hvd0hpZGVDaGlsZHJlbigpe319Y29uc3Qgcm89QT9jbGFzcyBleHRlbmRzIGlve2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9faW5zdGFuY2U9bnVsbCx0aGlzLl9fc3luY0luZm89bnVsbH1fX2hhc0luc3RhbmNlKCl7cmV0dXJuIEJvb2xlYW4odGhpcy5fX2luc3RhbmNlKX1fX2dldEluc3RhbmNlTm9kZXMoKXtyZXR1cm4gdGhpcy5fX2luc3RhbmNlLnRlbXBsYXRlSW5mby5jaGlsZE5vZGVzfV9fY3JlYXRlQW5kSW5zZXJ0SW5zdGFuY2UodCl7Y29uc3QgZT10aGlzLl9fZGF0YUhvc3R8fHRoaXM7aWYoYiYmIXRoaXMuX19kYXRhSG9zdCl0aHJvdyBuZXcgRXJyb3IoInN0cmljdFRlbXBsYXRlUG9saWN5OiB0ZW1wbGF0ZSBvd25lciBub3QgdHJ1c3RlZCIpO2NvbnN0IG49ZS5fYmluZFRlbXBsYXRlKHRoaXMuX190ZW1wbGF0ZSwhMCk7bi5ydW5FZmZlY3RzPSh0LGUsbik9PntsZXQgaT10aGlzLl9fc3luY0luZm87aWYodGhpcy5pZilpJiYodGhpcy5fX3N5bmNJbmZvPW51bGwsdGhpcy5fc2hvd0hpZGVDaGlsZHJlbigpLGU9T2JqZWN0LmFzc2lnbihpLmNoYW5nZWRQcm9wcyxlKSksdChlLG4pO2Vsc2UgaWYodGhpcy5fX2luc3RhbmNlKWlmKGl8fChpPXRoaXMuX19zeW5jSW5mbz17cnVuRWZmZWN0czp0LGNoYW5nZWRQcm9wczp7fX0pLG4pZm9yKGNvbnN0IHQgaW4gZSl7Y29uc3QgZT0kKHQpO2kuY2hhbmdlZFByb3BzW2VdPXRoaXMuX19kYXRhSG9zdFtlXX1lbHNlIE9iamVjdC5hc3NpZ24oaS5jaGFuZ2VkUHJvcHMsZSl9LHRoaXMuX19pbnN0YW5jZT1lLl9zdGFtcFRlbXBsYXRlKHRoaXMuX190ZW1wbGF0ZSxuKSxZKHQpLmluc2VydEJlZm9yZSh0aGlzLl9faW5zdGFuY2UsdGhpcyl9X19zeW5jSG9zdFByb3BlcnRpZXMoKXtjb25zdCB0PXRoaXMuX19zeW5jSW5mbzt0JiYodGhpcy5fX3N5bmNJbmZvPW51bGwsdC5ydW5FZmZlY3RzKHQuY2hhbmdlZFByb3BzLCExKSl9X190ZWFyZG93bkluc3RhbmNlKCl7dGhpcy5fX2luc3RhbmNlJiYoKHRoaXMuX19kYXRhSG9zdHx8dGhpcykuX3JlbW92ZUJvdW5kRG9tKHRoaXMuX19pbnN0YW5jZSksdGhpcy5fX2luc3RhbmNlPW51bGwsdGhpcy5fX3N5bmNJbmZvPW51bGwpfV9zaG93SGlkZUNoaWxkcmVuKCl7Y29uc3QgdD10aGlzLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fX3x8IXRoaXMuaWY7dGhpcy5fX2luc3RhbmNlJiZCb29sZWFuKHRoaXMuX19pbnN0YW5jZS5fX2hpZGRlbikhPT10JiYodGhpcy5fX2luc3RhbmNlLl9faGlkZGVuPXQsanIodCx0aGlzLl9faW5zdGFuY2UudGVtcGxhdGVJbmZvLmNoaWxkTm9kZXMpKSx0fHx0aGlzLl9fc3luY0hvc3RQcm9wZXJ0aWVzKCl9fTpjbGFzcyBleHRlbmRzIGlve2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9fY3Rvcj1udWxsLHRoaXMuX19pbnN0YW5jZT1udWxsLHRoaXMuX19pbnZhbGlkUHJvcHM9bnVsbH1fX2hhc0luc3RhbmNlKCl7cmV0dXJuIEJvb2xlYW4odGhpcy5fX2luc3RhbmNlKX1fX2dldEluc3RhbmNlTm9kZXMoKXtyZXR1cm4gdGhpcy5fX2luc3RhbmNlLmNoaWxkcmVufV9fY3JlYXRlQW5kSW5zZXJ0SW5zdGFuY2UodCl7dGhpcy5fX2N0b3J8fCh0aGlzLl9fY3Rvcj0kcih0aGlzLl9fdGVtcGxhdGUsdGhpcyx7bXV0YWJsZURhdGE6ITAsZm9yd2FyZEhvc3RQcm9wOmZ1bmN0aW9uKHQsZSl7dGhpcy5fX2luc3RhbmNlJiYodGhpcy5pZj90aGlzLl9faW5zdGFuY2UuZm9yd2FyZEhvc3RQcm9wKHQsZSk6KHRoaXMuX19pbnZhbGlkUHJvcHM9dGhpcy5fX2ludmFsaWRQcm9wc3x8T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9faW52YWxpZFByb3BzWyQodCldPSEwKSl9fSkpLHRoaXMuX19pbnN0YW5jZT1uZXcgdGhpcy5fX2N0b3IsWSh0KS5pbnNlcnRCZWZvcmUodGhpcy5fX2luc3RhbmNlLnJvb3QsdGhpcyl9X190ZWFyZG93bkluc3RhbmNlKCl7aWYodGhpcy5fX2luc3RhbmNlKXtsZXQgdD10aGlzLl9faW5zdGFuY2UuY2hpbGRyZW47aWYodCYmdC5sZW5ndGgpe2xldCBlPVkodFswXSkucGFyZW50Tm9kZTtpZihlKXtlPVkoZSk7Zm9yKGxldCBuLGk9MDtpPHQubGVuZ3RoJiYobj10W2ldKTtpKyspZS5yZW1vdmVDaGlsZChuKX19dGhpcy5fX2ludmFsaWRQcm9wcz1udWxsLHRoaXMuX19pbnN0YW5jZT1udWxsfX1fX3N5bmNIb3N0UHJvcGVydGllcygpe2xldCB0PXRoaXMuX19pbnZhbGlkUHJvcHM7aWYodCl7dGhpcy5fX2ludmFsaWRQcm9wcz1udWxsO2ZvcihsZXQgZSBpbiB0KXRoaXMuX19pbnN0YW5jZS5fc2V0UGVuZGluZ1Byb3BlcnR5KGUsdGhpcy5fX2RhdGFIb3N0W2VdKTt0aGlzLl9faW5zdGFuY2UuX2ZsdXNoUHJvcGVydGllcygpfX1fc2hvd0hpZGVDaGlsZHJlbigpe2NvbnN0IHQ9dGhpcy5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX198fCF0aGlzLmlmO3RoaXMuX19pbnN0YW5jZSYmQm9vbGVhbih0aGlzLl9faW5zdGFuY2UuX19oaWRkZW4pIT09dCYmKHRoaXMuX19pbnN0YW5jZS5fX2hpZGRlbj10LHRoaXMuX19pbnN0YW5jZS5fc2hvd0hpZGVDaGlsZHJlbih0KSksdHx8dGhpcy5fX3N5bmNIb3N0UHJvcGVydGllcygpfX07Y3VzdG9tRWxlbWVudHMuZGVmaW5lKHJvLmlzLHJvKTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KbGV0IG9vPUkoKHQ9PntsZXQgZT1tZSh0KTtyZXR1cm4gY2xhc3MgZXh0ZW5kcyBle3N0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntpdGVtczp7dHlwZTpBcnJheX0sbXVsdGk6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sc2VsZWN0ZWQ6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sc2VsZWN0ZWRJdGVtOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LHRvZ2dsZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX19c3RhdGljIGdldCBvYnNlcnZlcnMoKXtyZXR1cm5bIl9fdXBkYXRlU2VsZWN0aW9uKG11bHRpLCBpdGVtcy4qKSJdfWNvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9fbGFzdEl0ZW1zPW51bGwsdGhpcy5fX2xhc3RNdWx0aT1udWxsLHRoaXMuX19zZWxlY3RlZE1hcD1udWxsfV9fdXBkYXRlU2VsZWN0aW9uKHQsZSl7bGV0IG49ZS5wYXRoO2lmKG49PUpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIml0ZW1zIix0aGlzKSl7bGV0IG49ZS5iYXNlfHxbXSxpPXRoaXMuX19sYXN0SXRlbXM7aWYodCE9PXRoaXMuX19sYXN0TXVsdGkmJnRoaXMuY2xlYXJTZWxlY3Rpb24oKSxpKXtsZXQgdD1JaShuLGkpO3RoaXMuX19hcHBseVNwbGljZXModCl9dGhpcy5fX2xhc3RJdGVtcz1uLHRoaXMuX19sYXN0TXVsdGk9dH1lbHNlIGlmKGUucGF0aD09YCR7SlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiaXRlbXMiLHRoaXMpfS5zcGxpY2VzYCl0aGlzLl9fYXBwbHlTcGxpY2VzKGUudmFsdWUuaW5kZXhTcGxpY2VzKTtlbHNle2xldCB0PW4uc2xpY2UoYCR7SlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiaXRlbXMiLHRoaXMpfS5gLmxlbmd0aCksZT1wYXJzZUludCh0LDEwKTt0LmluZGV4T2YoIi4iKTwwJiZ0PT1lJiZ0aGlzLl9fZGVzZWxlY3RDaGFuZ2VkSWR4KGUpfX1fX2FwcGx5U3BsaWNlcyh0KXtsZXQgZT10aGlzLl9fc2VsZWN0ZWRNYXA7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2xldCBpPXRbbl07ZS5mb3JFYWNoKCgodCxuKT0+e3Q8aS5pbmRleHx8ZS5zZXQobix0Pj1pLmluZGV4K2kucmVtb3ZlZC5sZW5ndGg/dCtpLmFkZGVkQ291bnQtaS5yZW1vdmVkLmxlbmd0aDotMSl9KSk7Zm9yKGxldCB0PTA7dDxpLmFkZGVkQ291bnQ7dCsrKXtsZXQgbj1pLmluZGV4K3Q7ZS5oYXModGhpcy5pdGVtc1tuXSkmJmUuc2V0KHRoaXMuaXRlbXNbbl0sbil9fXRoaXMuX191cGRhdGVMaW5rcygpO2xldCBuPTA7ZS5mb3JFYWNoKCgodCxpKT0+e3Q8MD8odGhpcy5tdWx0aT90aGlzLnNwbGljZShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJzZWxlY3RlZCIsdGhpcyksbiwxKTp0aGlzLnNlbGVjdGVkPXRoaXMuc2VsZWN0ZWRJdGVtPW51bGwsZS5kZWxldGUoaSkpOm4rK30pKX1fX3VwZGF0ZUxpbmtzKCl7aWYodGhpcy5fX2RhdGFMaW5rZWRQYXRocz17fSx0aGlzLm11bHRpKXtsZXQgdD0wO3RoaXMuX19zZWxlY3RlZE1hcC5mb3JFYWNoKChlPT57ZT49MCYmdGhpcy5saW5rUGF0aHMoYCR7SlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiaXRlbXMiLHRoaXMpfS4ke2V9YCxgJHtKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJzZWxlY3RlZCIsdGhpcyl9LiR7dCsrfWApfSkpfWVsc2UgdGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goKHQ9Pnt0aGlzLmxpbmtQYXRocyhKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJzZWxlY3RlZCIsdGhpcyksYCR7SlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiaXRlbXMiLHRoaXMpfS4ke3R9YCksdGhpcy5saW5rUGF0aHMoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgic2VsZWN0ZWRJdGVtIix0aGlzKSxgJHtKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJpdGVtcyIsdGhpcyl9LiR7dH1gKX0pKX1jbGVhclNlbGVjdGlvbigpe3RoaXMuX19kYXRhTGlua2VkUGF0aHM9e30sdGhpcy5fX3NlbGVjdGVkTWFwPW5ldyBNYXAsdGhpcy5zZWxlY3RlZD10aGlzLm11bHRpP1tdOm51bGwsdGhpcy5zZWxlY3RlZEl0ZW09bnVsbH1pc1NlbGVjdGVkKHQpe3JldHVybiB0aGlzLl9fc2VsZWN0ZWRNYXAuaGFzKHQpfWlzSW5kZXhTZWxlY3RlZCh0KXtyZXR1cm4gdGhpcy5pc1NlbGVjdGVkKHRoaXMuaXRlbXNbdF0pfV9fZGVzZWxlY3RDaGFuZ2VkSWR4KHQpe2xldCBlPXRoaXMuX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KHQpO2lmKGU+PTApe2xldCB0PTA7dGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goKChuLGkpPT57ZT09dCsrJiZ0aGlzLmRlc2VsZWN0KGkpfSkpfX1fX3NlbGVjdGVkSW5kZXhGb3JJdGVtSW5kZXgodCl7bGV0IGU9dGhpcy5fX2RhdGFMaW5rZWRQYXRoc1tgJHtKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJpdGVtcyIsdGhpcyl9LiR7dH1gXTtpZihlKXJldHVybiBwYXJzZUludChlLnNsaWNlKGAke0pTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoInNlbGVjdGVkIix0aGlzKX0uYC5sZW5ndGgpLDEwKX1kZXNlbGVjdCh0KXtsZXQgZT10aGlzLl9fc2VsZWN0ZWRNYXAuZ2V0KHQpO2lmKGU+PTApe2xldCBuO3RoaXMuX19zZWxlY3RlZE1hcC5kZWxldGUodCksdGhpcy5tdWx0aSYmKG49dGhpcy5fX3NlbGVjdGVkSW5kZXhGb3JJdGVtSW5kZXgoZSkpLHRoaXMuX191cGRhdGVMaW5rcygpLHRoaXMubXVsdGk/dGhpcy5zcGxpY2UoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgic2VsZWN0ZWQiLHRoaXMpLG4sMSk6dGhpcy5zZWxlY3RlZD10aGlzLnNlbGVjdGVkSXRlbT1udWxsfX1kZXNlbGVjdEluZGV4KHQpe3RoaXMuZGVzZWxlY3QodGhpcy5pdGVtc1t0XSl9c2VsZWN0KHQpe3RoaXMuc2VsZWN0SW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKHQpKX1zZWxlY3RJbmRleCh0KXtsZXQgZT10aGlzLml0ZW1zW3RdO3RoaXMuaXNTZWxlY3RlZChlKT90aGlzLnRvZ2dsZSYmdGhpcy5kZXNlbGVjdEluZGV4KHQpOih0aGlzLm11bHRpfHx0aGlzLl9fc2VsZWN0ZWRNYXAuY2xlYXIoKSx0aGlzLl9fc2VsZWN0ZWRNYXAuc2V0KGUsdCksdGhpcy5fX3VwZGF0ZUxpbmtzKCksdGhpcy5tdWx0aT90aGlzLnB1c2goSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgic2VsZWN0ZWQiLHRoaXMpLGUpOnRoaXMuc2VsZWN0ZWQ9dGhpcy5zZWxlY3RlZEl0ZW09ZSl9fX0pKSh5ZSk7Y2xhc3MgYW8gZXh0ZW5kcyBvb3tzdGF0aWMgZ2V0IGlzKCl7cmV0dXJuImFycmF5LXNlbGVjdG9yIn1zdGF0aWMgZ2V0IHRlbXBsYXRlKCl7cmV0dXJuIG51bGx9fWN1c3RvbUVsZW1lbnRzLmRlZmluZShhby5pcyxhbyk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IHNvPW5ldyBTbjt3aW5kb3cuU2hhZHlDU1N8fCh3aW5kb3cuU2hhZHlDU1M9e3ByZXBhcmVUZW1wbGF0ZSh0LGUsbil7fSxwcmVwYXJlVGVtcGxhdGVEb20odCxlKXt9LHByZXBhcmVUZW1wbGF0ZVN0eWxlcyh0LGUsbil7fSxzdHlsZVN1YnRyZWUodCxlKXtzby5wcm9jZXNzU3R5bGVzKCksUWUodCxlKX0sc3R5bGVFbGVtZW50KHQpe3NvLnByb2Nlc3NTdHlsZXMoKX0sc3R5bGVEb2N1bWVudCh0KXtzby5wcm9jZXNzU3R5bGVzKCksUWUoZG9jdW1lbnQuYm9keSx0KX0sZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlOih0LGUpPT50bih0LGUpLGZsdXNoQ3VzdG9tU3R5bGVzKCl7fSxuYXRpdmVDc3M6a2UsbmF0aXZlU2hhZG93Ok1lLGNzc0J1aWxkOlRlLGRpc2FibGVSdW50aW1lOkFlfSksd2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlPXNvOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBsbz0iaW5jbHVkZSIsY289d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlO2NsYXNzIHVvIGV4dGVuZHMgSFRNTEVsZW1lbnR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX3N0eWxlPW51bGwsY28uYWRkQ3VzdG9tU3R5bGUodGhpcyl9Z2V0U3R5bGUoKXtpZih0aGlzLl9zdHlsZSlyZXR1cm4gdGhpcy5fc3R5bGU7Y29uc3QgdD10aGlzLnF1ZXJ5U2VsZWN0b3IoInN0eWxlIik7aWYoIXQpcmV0dXJuIG51bGw7dGhpcy5fc3R5bGU9dDtjb25zdCBlPXQuZ2V0QXR0cmlidXRlKGxvKTtyZXR1cm4gZSYmKHQucmVtb3ZlQXR0cmlidXRlKGxvKSx0LnRleHRDb250ZW50PShmdW5jdGlvbiBuKHQpe2xldCBlPXQudHJpbSgpLnNwbGl0KC9ccysvKSxuPSIiO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKW4rPXEoZVt0XSk7cmV0dXJuIG59KShlKSt0LnRleHRDb250ZW50KSx0aGlzLm93bmVyRG9jdW1lbnQhPT13aW5kb3cuZG9jdW1lbnQmJndpbmRvdy5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRoaXMpLHRoaXMuX3N0eWxlfX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KbGV0IGhvO3dpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoImN1c3RvbS1zdHlsZSIsdW8pLGhvPXpyLl9tdXRhYmxlUHJvcGVydHlDaGFuZ2U7Y29uc3QgcG89e3Byb3BlcnRpZXM6e211dGFibGVEYXRhOkJvb2xlYW59LF9zaG91bGRQcm9wZXJ0eUNoYW5nZSh0LGUsbil7cmV0dXJuIGhvKHRoaXMsdCxlLG4sdGhpcy5tdXRhYmxlRGF0YSl9fSxmbz1lcihIVE1MRWxlbWVudCkucHJvdG90eXBlOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KdmFyIG1vPW5ldyBTZXQ7Y29uc3QgZ289e3Byb3BlcnRpZXM6e19wYXJlbnRSZXNpemFibGU6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfcGFyZW50UmVzaXphYmxlQ2hhbmdlZCJ9LF9ub3RpZnlpbmdEZXNjZW5kYW50Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxsaXN0ZW5lcnM6eyJpcm9uLXJlcXVlc3QtcmVzaXplLW5vdGlmaWNhdGlvbnMiOiJfb25Jcm9uUmVxdWVzdFJlc2l6ZU5vdGlmaWNhdGlvbnMifSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5faW50ZXJlc3RlZFJlc2l6YWJsZXM9W10sdGhpcy5fYm91bmROb3RpZnlSZXNpemU9dGhpcy5ub3RpZnlSZXNpemUuYmluZCh0aGlzKSx0aGlzLl9ib3VuZE9uRGVzY2VuZGFudElyb25SZXNpemU9dGhpcy5fb25EZXNjZW5kYW50SXJvblJlc2l6ZS5iaW5kKHRoaXMpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zKCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcGFyZW50UmVzaXphYmxlP3RoaXMuX3BhcmVudFJlc2l6YWJsZS5zdG9wUmVzaXplTm90aWZpY2F0aW9uc0Zvcih0aGlzKToobW8uZGVsZXRlKHRoaXMpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLHRoaXMuX2JvdW5kTm90aWZ5UmVzaXplKSksdGhpcy5fcGFyZW50UmVzaXphYmxlPW51bGx9LG5vdGlmeVJlc2l6ZTpmdW5jdGlvbigpe3RoaXMuaXNBdHRhY2hlZCYmKHRoaXMuX2ludGVyZXN0ZWRSZXNpemFibGVzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3RoaXMucmVzaXplclNob3VsZE5vdGlmeSh0KSYmdGhpcy5fbm90aWZ5RGVzY2VuZGFudCh0KX0pLHRoaXMpLHRoaXMuX2ZpcmVSZXNpemUoKSl9LGFzc2lnblBhcmVudFJlc2l6YWJsZTpmdW5jdGlvbih0KXt0aGlzLl9wYXJlbnRSZXNpemFibGUmJnRoaXMuX3BhcmVudFJlc2l6YWJsZS5zdG9wUmVzaXplTm90aWZpY2F0aW9uc0Zvcih0aGlzKSx0aGlzLl9wYXJlbnRSZXNpemFibGU9dCx0JiYtMT09PXQuX2ludGVyZXN0ZWRSZXNpemFibGVzLmluZGV4T2YodGhpcykmJih0Ll9pbnRlcmVzdGVkUmVzaXphYmxlcy5wdXNoKHRoaXMpLHQuX3N1YnNjcmliZUlyb25SZXNpemUodGhpcykpfSxzdG9wUmVzaXplTm90aWZpY2F0aW9uc0ZvcjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5pbmRleE9mKHQpO2U+LTEmJih0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5zcGxpY2UoZSwxKSx0aGlzLl91bnN1YnNjcmliZUlyb25SZXNpemUodCkpfSxfc3Vic2NyaWJlSXJvblJlc2l6ZTpmdW5jdGlvbih0KXt0LmFkZEV2ZW50TGlzdGVuZXIoImlyb24tcmVzaXplIix0aGlzLl9ib3VuZE9uRGVzY2VuZGFudElyb25SZXNpemUpfSxfdW5zdWJzY3JpYmVJcm9uUmVzaXplOmZ1bmN0aW9uKHQpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiaXJvbi1yZXNpemUiLHRoaXMuX2JvdW5kT25EZXNjZW5kYW50SXJvblJlc2l6ZSl9LHJlc2l6ZXJTaG91bGROb3RpZnk6ZnVuY3Rpb24odCl7cmV0dXJuITB9LF9vbkRlc2NlbmRhbnRJcm9uUmVzaXplOmZ1bmN0aW9uKHQpe3RoaXMuX25vdGlmeWluZ0Rlc2NlbmRhbnQ/dC5zdG9wUHJvcGFnYXRpb24oKTptfHx0aGlzLl9maXJlUmVzaXplKCl9LF9maXJlUmVzaXplOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJpcm9uLXJlc2l6ZSIsbnVsbCx7bm9kZTp0aGlzLGJ1YmJsZXM6ITF9KX0sX29uSXJvblJlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zOmZ1bmN0aW9uKHQpe3ZhciBlPVlpKHQpLnJvb3RUYXJnZXQ7ZSE9PXRoaXMmJihlLmFzc2lnblBhcmVudFJlc2l6YWJsZSh0aGlzKSx0aGlzLl9ub3RpZnlEZXNjZW5kYW50KGUpLHQuc3RvcFByb3BhZ2F0aW9uKCkpfSxfcGFyZW50UmVzaXphYmxlQ2hhbmdlZDpmdW5jdGlvbih0KXt0JiZ3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIix0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZSl9LF9ub3RpZnlEZXNjZW5kYW50OmZ1bmN0aW9uKHQpe3RoaXMuaXNBdHRhY2hlZCYmKHRoaXMuX25vdGlmeWluZ0Rlc2NlbmRhbnQ9ITAsdC5ub3RpZnlSZXNpemUoKSx0aGlzLl9ub3RpZnlpbmdEZXNjZW5kYW50PSExKX0sX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0F0dGFjaGVkKWlmKCJsb2FkaW5nIj09PWRvY3VtZW50LnJlYWR5U3RhdGUpe3ZhciB0PXRoaXMuX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zLmJpbmQodGhpcyk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsKGZ1bmN0aW9uIGUoKXtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIixlKSx0KCl9KSl9ZWxzZSB0aGlzLl9maW5kUGFyZW50KCksdGhpcy5fcGFyZW50UmVzaXphYmxlP3RoaXMuX3BhcmVudFJlc2l6YWJsZS5faW50ZXJlc3RlZFJlc2l6YWJsZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dCE9PXRoaXMmJnQuX2ZpbmRQYXJlbnQoKX0pLHRoaXMpOihtby5mb3JFYWNoKChmdW5jdGlvbih0KXt0IT09dGhpcyYmdC5fZmluZFBhcmVudCgpfSksdGhpcyksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdGhpcy5fYm91bmROb3RpZnlSZXNpemUpLHRoaXMubm90aWZ5UmVzaXplKCkpfSxfZmluZFBhcmVudDpmdW5jdGlvbigpe3RoaXMuYXNzaWduUGFyZW50UmVzaXphYmxlKG51bGwpLHRoaXMuZmlyZSgiaXJvbi1yZXF1ZXN0LXJlc2l6ZS1ub3RpZmljYXRpb25zIixudWxsLHtub2RlOnRoaXMsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwfSksdGhpcy5fcGFyZW50UmVzaXphYmxlP21vLmRlbGV0ZSh0aGlzKTptby5hZGQodGhpcyl9fTt2YXIgX289T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsSXJvblJlc2l6YWJsZUJlaGF2aW9yOmdvfSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL1JyKHtfdGVtcGxhdGU6X2VgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1pcm9uLWNvbGxhcHNlLXRyYW5zaXRpb24tZHVyYXRpb24sIDMwMG1zKTsKICAgICAgICAvKiBTYWZhcmkgMTAgbmVlZHMgdGhpcyBwcm9wZXJ0eSBwcmVmaXhlZCB0byBjb3JyZWN0bHkgYXBwbHkgdGhlIGN1c3RvbSBwcm9wZXJ0eSAqLwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogdmFyKC0taXJvbi1jb2xsYXBzZS10cmFuc2l0aW9uLWR1cmF0aW9uLCAzMDBtcyk7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgIH0KCiAgICAgIDpob3N0KC5pcm9uLWNvbGxhcHNlLWNsb3NlZCkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KDpub3QoLmlyb24tY29sbGFwc2Utb3BlbmVkKSkgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgpgLGlzOiJpcm9uLWNvbGxhcHNlIixiZWhhdmlvcnM6W2dvXSxwcm9wZXJ0aWVzOntob3Jpem9udGFsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9ob3Jpem9udGFsQ2hhbmdlZCJ9LG9wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifSx0cmFuc2l0aW9uaW5nOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSxub0FuaW1hdGlvbjp7dHlwZTpCb29sZWFufSxfZGVzaXJlZFNpemU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sZ2V0IGRpbWVuc2lvbigpe3JldHVybiB0aGlzLmhvcml6b250YWw/IndpZHRoIjoiaGVpZ2h0In0sZ2V0IF9kaW1lbnNpb25NYXgoKXtyZXR1cm4gdGhpcy5ob3Jpem9udGFsPyJtYXhXaWR0aCI6Im1heEhlaWdodCJ9LGdldCBfZGltZW5zaW9uTWF4Q3NzKCl7cmV0dXJuIHRoaXMuaG9yaXpvbnRhbD8ibWF4LXdpZHRoIjoibWF4LWhlaWdodCJ9LGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJncm91cCIsImFyaWEtaGlkZGVuIjoidHJ1ZSJ9LGxpc3RlbmVyczp7dHJhbnNpdGlvbmVuZDoiX29uVHJhbnNpdGlvbkVuZCJ9LHRvZ2dsZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkPSF0aGlzLm9wZW5lZH0sc2hvdzpmdW5jdGlvbigpe3RoaXMub3BlbmVkPSEwfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ9ITF9LHVwZGF0ZVNpemU6ZnVuY3Rpb24odCxlKXt0PSJhdXRvIj09PXQ/IiI6dDt2YXIgbj1lJiYhdGhpcy5ub0FuaW1hdGlvbiYmdGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9kZXNpcmVkU2l6ZSE9PXQ7aWYodGhpcy5fZGVzaXJlZFNpemU9dCx0aGlzLl91cGRhdGVUcmFuc2l0aW9uKCExKSxuKXt2YXIgaT10aGlzLl9jYWxjU2l6ZSgpOyIiPT09dCYmKHRoaXMuc3R5bGVbdGhpcy5fZGltZW5zaW9uTWF4XT0iIix0PXRoaXMuX2NhbGNTaXplKCkpLHRoaXMuc3R5bGVbdGhpcy5fZGltZW5zaW9uTWF4XT1pLHRoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wLHRoaXMuX3VwZGF0ZVRyYW5zaXRpb24oITApLG49dCE9PWl9dGhpcy5zdHlsZVt0aGlzLl9kaW1lbnNpb25NYXhdPXQsbnx8dGhpcy5fdHJhbnNpdGlvbkVuZCgpfSxlbmFibGVUcmFuc2l0aW9uOmZ1bmN0aW9uKHQpe2ZvLl93YXJuKCJgZW5hYmxlVHJhbnNpdGlvbigpYCBpcyBkZXByZWNhdGVkLCB1c2UgYG5vQW5pbWF0aW9uYCBpbnN0ZWFkLiIpLHRoaXMubm9BbmltYXRpb249IXR9LF91cGRhdGVUcmFuc2l0aW9uOmZ1bmN0aW9uKHQpe3RoaXMuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPXQmJiF0aGlzLm5vQW5pbWF0aW9uPyIiOiIwcyJ9LF9ob3Jpem9udGFsQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuc3R5bGUudHJhbnNpdGlvblByb3BlcnR5PXRoaXMuX2RpbWVuc2lvbk1heENzcyx0aGlzLnN0eWxlWyJtYXhXaWR0aCI9PT10aGlzLl9kaW1lbnNpb25NYXg/Im1heEhlaWdodCI6Im1heFdpZHRoIl09IiIsdGhpcy51cGRhdGVTaXplKHRoaXMub3BlbmVkPyJhdXRvIjoiMHB4IiwhMSl9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwhdGhpcy5vcGVuZWQpLHRoaXMuX3NldFRyYW5zaXRpb25pbmcoITApLHRoaXMudG9nZ2xlQ2xhc3MoImlyb24tY29sbGFwc2UtY2xvc2VkIiwhMSksdGhpcy50b2dnbGVDbGFzcygiaXJvbi1jb2xsYXBzZS1vcGVuZWQiLCExKSx0aGlzLnVwZGF0ZVNpemUodGhpcy5vcGVuZWQ/ImF1dG8iOiIwcHgiLCEwKSx0aGlzLm9wZW5lZCYmdGhpcy5mb2N1cygpfSxfdHJhbnNpdGlvbkVuZDpmdW5jdGlvbigpe3RoaXMuc3R5bGVbdGhpcy5fZGltZW5zaW9uTWF4XT10aGlzLl9kZXNpcmVkU2l6ZSx0aGlzLnRvZ2dsZUNsYXNzKCJpcm9uLWNvbGxhcHNlLWNsb3NlZCIsIXRoaXMub3BlbmVkKSx0aGlzLnRvZ2dsZUNsYXNzKCJpcm9uLWNvbGxhcHNlLW9wZW5lZCIsdGhpcy5vcGVuZWQpLHRoaXMuX3VwZGF0ZVRyYW5zaXRpb24oITEpLHRoaXMubm90aWZ5UmVzaXplKCksdGhpcy5fc2V0VHJhbnNpdGlvbmluZyghMSl9LF9vblRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24odCl7WWkodCkucm9vdFRhcmdldD09PXRoaXMmJnRoaXMuX3RyYW5zaXRpb25FbmQoKX0sX2NhbGNTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbdGhpcy5kaW1lbnNpb25dKyJweCJ9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCB5bz1fZWAKLyogTW9zdCBjb21tb24gdXNlZCBmbGV4IHN0eWxlcyovCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmxheW91dC5ob3Jpem9udGFsLAogICAgICAubGF5b3V0LnZlcnRpY2FsIHsKICAgICAgICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmxheW91dC5pbmxpbmUgewogICAgICAgIGRpc3BsYXk6IC1tcy1pbmxpbmUtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWlubGluZS1mbGV4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICB9CgogICAgICAubGF5b3V0Lmhvcml6b250YWwgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CgogICAgICAubGF5b3V0LnZlcnRpY2FsIHsKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgLmxheW91dC53cmFwIHsKICAgICAgICAtbXMtZmxleC13cmFwOiB3cmFwOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwOwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfQoKICAgICAgLmxheW91dC5uby13cmFwIHsKICAgICAgICAtbXMtZmxleC13cmFwOiBub3dyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXIsCiAgICAgIC5sYXlvdXQuY2VudGVyLWNlbnRlciB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItanVzdGlmaWVkLAogICAgICAubGF5b3V0LmNlbnRlci1jZW50ZXIgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAuZmxleCB7CiAgICAgICAgLW1zLWZsZXg6IDEgMSAwLjAwMDAwMDAwMXB4OwogICAgICAgIC13ZWJraXQtZmxleDogMTsKICAgICAgICBmbGV4OiAxOwogICAgICAgIC13ZWJraXQtZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgICBmbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICB9CgogICAgICAuZmxleC1hdXRvIHsKICAgICAgICAtbXMtZmxleDogMSAxIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDEgYXV0bzsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfQoKICAgICAgLmZsZXgtbm9uZSB7CiAgICAgICAgLW1zLWZsZXg6IG5vbmU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiBub25lOwogICAgICAgIGZsZXg6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgovKiBCYXNpYyBmbGV4Ym94IHJldmVyc2Ugc3R5bGVzICovCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgtcmV2ZXJzZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAubGF5b3V0Lmhvcml6b250YWwtcmV2ZXJzZSwKICAgICAgLmxheW91dC52ZXJ0aWNhbC1yZXZlcnNlIHsKICAgICAgICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmxheW91dC5ob3Jpem9udGFsLXJldmVyc2UgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICB9CgogICAgICAubGF5b3V0LnZlcnRpY2FsLXJldmVyc2UgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICB9CgogICAgICAubGF5b3V0LndyYXAtcmV2ZXJzZSB7CiAgICAgICAgLW1zLWZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgovKiBGbGV4Ym94IGFsaWdubWVudCAqLwo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1mbGV4LWFsaWdubWVudCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAvKioKICAgICAgICogQWxpZ25tZW50IGluIGNyb3NzIGF4aXMuCiAgICAgICAqLwogICAgICAubGF5b3V0LnN0YXJ0IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXIsCiAgICAgIC5sYXlvdXQuY2VudGVyLWNlbnRlciB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmxheW91dC5lbmQgewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBlbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgICB9CgogICAgICAubGF5b3V0LmJhc2VsaW5lIHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogYmFzZWxpbmU7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQWxpZ25tZW50IGluIG1haW4gYXhpcy4KICAgICAgICovCiAgICAgIC5sYXlvdXQuc3RhcnQtanVzdGlmaWVkIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBzdGFydDsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuY2VudGVyLWp1c3RpZmllZCwKICAgICAgLmxheW91dC5jZW50ZXItY2VudGVyIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmxheW91dC5lbmQtanVzdGlmaWVkIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBlbmQ7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYXJvdW5kLWp1c3RpZmllZCB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogZGlzdHJpYnV0ZTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICB9CgogICAgICAubGF5b3V0Lmp1c3RpZmllZCB7CiAgICAgICAgLW1zLWZsZXgtcGFjazoganVzdGlmeTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTZWxmIGFsaWdubWVudC4KICAgICAgICovCiAgICAgIC5zZWxmLXN0YXJ0IHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgICAgfQoKICAgICAgLnNlbGYtY2VudGVyIHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogY2VudGVyOwogICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLnNlbGYtZW5kIHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLnNlbGYtc3RyZXRjaCB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICAgIGFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgIH0KCiAgICAgIC5zZWxmLWJhc2VsaW5lIHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogYmFzZWxpbmU7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICBhbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIG11bHRpLWxpbmUgYWxpZ25tZW50IGluIG1haW4gYXhpcy4KICAgICAgICovCiAgICAgIC5sYXlvdXQuc3RhcnQtYWxpZ25lZCB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBzdGFydDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgfQoKICAgICAgLmxheW91dC5lbmQtYWxpZ25lZCB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBlbmQ7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuY2VudGVyLWFsaWduZWQgewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogY2VudGVyOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmJldHdlZW4tYWxpZ25lZCB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBqdXN0aWZ5OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9CgogICAgICAubGF5b3V0LmFyb3VuZC1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGRpc3RyaWJ1dGU7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgovKiBOb24tZmxleGJveCBwb3NpdGlvbmluZyBoZWxwZXIgc3R5bGVzICovCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgtZmFjdG9ycyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuZmxleCwKICAgICAgLmZsZXgtMSB7CiAgICAgICAgLW1zLWZsZXg6IDEgMSAwLjAwMDAwMDAwMXB4OwogICAgICAgIC13ZWJraXQtZmxleDogMTsKICAgICAgICBmbGV4OiAxOwogICAgICAgIC13ZWJraXQtZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgICBmbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICB9CgogICAgICAuZmxleC0yIHsKICAgICAgICAtbXMtZmxleDogMjsKICAgICAgICAtd2Via2l0LWZsZXg6IDI7CiAgICAgICAgZmxleDogMjsKICAgICAgfQoKICAgICAgLmZsZXgtMyB7CiAgICAgICAgLW1zLWZsZXg6IDM7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAzOwogICAgICAgIGZsZXg6IDM7CiAgICAgIH0KCiAgICAgIC5mbGV4LTQgewogICAgICAgIC1tcy1mbGV4OiA0OwogICAgICAgIC13ZWJraXQtZmxleDogNDsKICAgICAgICBmbGV4OiA0OwogICAgICB9CgogICAgICAuZmxleC01IHsKICAgICAgICAtbXMtZmxleDogNTsKICAgICAgICAtd2Via2l0LWZsZXg6IDU7CiAgICAgICAgZmxleDogNTsKICAgICAgfQoKICAgICAgLmZsZXgtNiB7CiAgICAgICAgLW1zLWZsZXg6IDY7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA2OwogICAgICAgIGZsZXg6IDY7CiAgICAgIH0KCiAgICAgIC5mbGV4LTcgewogICAgICAgIC1tcy1mbGV4OiA3OwogICAgICAgIC13ZWJraXQtZmxleDogNzsKICAgICAgICBmbGV4OiA3OwogICAgICB9CgogICAgICAuZmxleC04IHsKICAgICAgICAtbXMtZmxleDogODsKICAgICAgICAtd2Via2l0LWZsZXg6IDg7CiAgICAgICAgZmxleDogODsKICAgICAgfQoKICAgICAgLmZsZXgtOSB7CiAgICAgICAgLW1zLWZsZXg6IDk7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA5OwogICAgICAgIGZsZXg6IDk7CiAgICAgIH0KCiAgICAgIC5mbGV4LTEwIHsKICAgICAgICAtbXMtZmxleDogMTA7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxMDsKICAgICAgICBmbGV4OiAxMDsKICAgICAgfQoKICAgICAgLmZsZXgtMTEgewogICAgICAgIC1tcy1mbGV4OiAxMTsKICAgICAgICAtd2Via2l0LWZsZXg6IDExOwogICAgICAgIGZsZXg6IDExOwogICAgICB9CgogICAgICAuZmxleC0xMiB7CiAgICAgICAgLW1zLWZsZXg6IDEyOwogICAgICAgIC13ZWJraXQtZmxleDogMTI7CiAgICAgICAgZmxleDogMTI7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1wb3NpdGlvbmluZyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuYmxvY2sgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaW52aXNpYmxlIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLnJlbGF0aXZlIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIGJvZHkuZnVsbGJsZWVkIHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgfQoKICAgICAgLnNjcm9sbCB7CiAgICAgICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAvKiBmaXhlZCBwb3NpdGlvbiAqLwogICAgICAuZml4ZWQtYm90dG9tLAogICAgICAuZml4ZWQtbGVmdCwKICAgICAgLmZpeGVkLXJpZ2h0LAogICAgICAuZml4ZWQtdG9wIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KCiAgICAgIC5maXhlZC10b3AgewogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtcmlnaHQgewogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgIH0KCiAgICAgIC5maXhlZC1ib3R0b20gewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtbGVmdCB7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KYDt5by5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZGlzcGxheTogbm9uZTsiKSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHlvLmNvbnRlbnQpOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3Qgdm89X2VgCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgW2hpZGRlbl0gewogICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICB9CiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+CjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CgogICAgICAtLWxheW91dDogewogICAgICAgIGRpc3BsYXk6IC1tcy1mbGV4Ym94OwogICAgICAgIGRpc3BsYXk6IC13ZWJraXQtZmxleDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaW5saW5lOiB7CiAgICAgICAgZGlzcGxheTogLW1zLWlubGluZS1mbGV4Ym94OwogICAgICAgIGRpc3BsYXk6IC13ZWJraXQtaW5saW5lLWZsZXg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgIH07CgogICAgICAtLWxheW91dC1ob3Jpem9udGFsOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWhvcml6b250YWwtcmV2ZXJzZTogewogICAgICAgIEBhcHBseSAtLWxheW91dDsKCiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgIH07CgogICAgICAtLWxheW91dC12ZXJ0aWNhbDogewogICAgICAgIEBhcHBseSAtLWxheW91dDsKCiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIH07CgogICAgICAtLWxheW91dC12ZXJ0aWNhbC1yZXZlcnNlOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXdyYXA6IHsKICAgICAgICAtbXMtZmxleC13cmFwOiB3cmFwOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwOwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXdyYXAtcmV2ZXJzZTogewogICAgICAgIC1tcy1mbGV4LXdyYXA6IHdyYXAtcmV2ZXJzZTsKICAgICAgICAtd2Via2l0LWZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICAgIGZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC1hdXRvOiB7CiAgICAgICAgLW1zLWZsZXg6IDEgMSBhdXRvOwogICAgICAgIC13ZWJraXQtZmxleDogMSAxIGF1dG87CiAgICAgICAgZmxleDogMSAxIGF1dG87CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LW5vbmU6IHsKICAgICAgICAtbXMtZmxleDogbm9uZTsKICAgICAgICAtd2Via2l0LWZsZXg6IG5vbmU7CiAgICAgICAgZmxleDogbm9uZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXg6IHsKICAgICAgICAtbXMtZmxleDogMSAxIDAuMDAwMDAwMDAxcHg7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxOwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgLXdlYmtpdC1mbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICAgIGZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTI6IHsKICAgICAgICAtbXMtZmxleDogMjsKICAgICAgICAtd2Via2l0LWZsZXg6IDI7CiAgICAgICAgZmxleDogMjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtMzogewogICAgICAgIC1tcy1mbGV4OiAzOwogICAgICAgIC13ZWJraXQtZmxleDogMzsKICAgICAgICBmbGV4OiAzOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC00OiB7CiAgICAgICAgLW1zLWZsZXg6IDQ7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA0OwogICAgICAgIGZsZXg6IDQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTU6IHsKICAgICAgICAtbXMtZmxleDogNTsKICAgICAgICAtd2Via2l0LWZsZXg6IDU7CiAgICAgICAgZmxleDogNTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtNjogewogICAgICAgIC1tcy1mbGV4OiA2OwogICAgICAgIC13ZWJraXQtZmxleDogNjsKICAgICAgICBmbGV4OiA2OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC03OiB7CiAgICAgICAgLW1zLWZsZXg6IDc7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA3OwogICAgICAgIGZsZXg6IDc7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTg6IHsKICAgICAgICAtbXMtZmxleDogODsKICAgICAgICAtd2Via2l0LWZsZXg6IDg7CiAgICAgICAgZmxleDogODsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtOTogewogICAgICAgIC1tcy1mbGV4OiA5OwogICAgICAgIC13ZWJraXQtZmxleDogOTsKICAgICAgICBmbGV4OiA5OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC0xMDogewogICAgICAgIC1tcy1mbGV4OiAxMDsKICAgICAgICAtd2Via2l0LWZsZXg6IDEwOwogICAgICAgIGZsZXg6IDEwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC0xMTogewogICAgICAgIC1tcy1mbGV4OiAxMTsKICAgICAgICAtd2Via2l0LWZsZXg6IDExOwogICAgICAgIGZsZXg6IDExOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC0xMjogewogICAgICAgIC1tcy1mbGV4OiAxMjsKICAgICAgICAtd2Via2l0LWZsZXg6IDEyOwogICAgICAgIGZsZXg6IDEyOwogICAgICB9OwoKICAgICAgLyogYWxpZ25tZW50IGluIGNyb3NzIGF4aXMgKi8KCiAgICAgIC0tbGF5b3V0LXN0YXJ0OiB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IHN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXI6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZW5kOiB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1iYXNlbGluZTogewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICAgIH07CgogICAgICAvKiBhbGlnbm1lbnQgaW4gbWFpbiBheGlzICovCgogICAgICAtLWxheW91dC1zdGFydC1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBzdGFydDsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXItanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogY2VudGVyOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH07CgogICAgICAtLWxheW91dC1lbmQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogZW5kOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYXJvdW5kLWp1c3RpZmllZDogewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGRpc3RyaWJ1dGU7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWp1c3RpZmllZDogewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGp1c3RpZnk7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjogewogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlci1qdXN0aWZpZWQ7CiAgICAgIH07CgogICAgICAvKiBzZWxmIGFsaWdubWVudCAqLwoKICAgICAgLS1sYXlvdXQtc2VsZi1zdGFydDogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1jZW50ZXI6IHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogY2VudGVyOwogICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXNlbGYtZW5kOiB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zZWxmLXN0cmV0Y2g6IHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgICAgYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXNlbGYtYmFzZWxpbmU6IHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogYmFzZWxpbmU7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICBhbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgfTsKCiAgICAgIC8qIG11bHRpLWxpbmUgYWxpZ25tZW50IGluIG1haW4gYXhpcyAqLwoKICAgICAgLS1sYXlvdXQtc3RhcnQtYWxpZ25lZDogewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogc3RhcnQ7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1lbmQtYWxpZ25lZDogewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogZW5kOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtY2VudGVyLWFsaWduZWQ6IHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGNlbnRlcjsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWJldHdlZW4tYWxpZ25lZDogewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazoganVzdGlmeTsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWFyb3VuZC1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBkaXN0cmlidXRlOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgICAgYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICB9OwoKICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICAgIE90aGVyIExheW91dAogICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgICAgLS1sYXlvdXQtYmxvY2s6IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWludmlzaWJsZTogewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtcmVsYXRpdmU6IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH07CgogICAgICAtLWxheW91dC1maXQ6IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2Nyb2xsOiB7CiAgICAgICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZnVsbGJsZWVkOiB7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGhlaWdodDogMTAwdmg7CiAgICAgIH07CgogICAgICAvKiBmaXhlZCBwb3NpdGlvbiAqLwoKICAgICAgLS1sYXlvdXQtZml4ZWQtdG9wOiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml4ZWQtcmlnaHQ6IHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZpeGVkLWJvdHRvbTogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZpeGVkLWxlZnQ6IHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9OwoKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT5gO3ZvLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJkaXNwbGF5OiBub25lOyIpLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodm8uY29udGVudCk7dmFyIGJvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7Ym8udGV4dENvbnRlbnQ9IltoaWRkZW5dIHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9Iixkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGJvKTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNsYXNzIHhve2NvbnN0cnVjdG9yKHQpe3hvWyIgIl0odCksdGhpcy50eXBlPXQmJnQudHlwZXx8ImRlZmF1bHQiLHRoaXMua2V5PXQmJnQua2V5LHQmJiJ2YWx1ZSJpbiB0JiYodGhpcy52YWx1ZT10LnZhbHVlKX1nZXQgdmFsdWUoKXt2YXIgdD10aGlzLnR5cGUsZT10aGlzLmtleTtpZih0JiZlKXJldHVybiB4by50eXBlc1t0XSYmeG8udHlwZXNbdF1bZV19c2V0IHZhbHVlKHQpe3ZhciBlPXRoaXMudHlwZSxuPXRoaXMua2V5O2UmJm4mJihlPXhvLnR5cGVzW2VdPXhvLnR5cGVzW2VdfHx7fSxudWxsPT10P2RlbGV0ZSBlW25dOmVbbl09dCl9Z2V0IGxpc3QoKXtpZih0aGlzLnR5cGUpe3ZhciB0PXhvLnR5cGVzW3RoaXMudHlwZV07cmV0dXJuIHQ/T2JqZWN0LmtleXModCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gd29bdGhpcy50eXBlXVt0XX0pLHRoaXMpOltdfX1ieUtleSh0KXtyZXR1cm4gdGhpcy5rZXk9dCx0aGlzLnZhbHVlfX14b1siICJdPWZ1bmN0aW9uKCl7fSx4by50eXBlcz17fTt2YXIgd289eG8udHlwZXM7UnIoe2lzOiJpcm9uLW1ldGEiLHByb3BlcnRpZXM6e3R5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJkZWZhdWx0In0sa2V5Ont0eXBlOlN0cmluZ30sdmFsdWU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sc2VsZjp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfc2VsZkNoYW5nZWQifSxfX21ldGE6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX19jb21wdXRlTWV0YSh0eXBlLCBrZXksIHZhbHVlKSJ9fSxob3N0QXR0cmlidXRlczp7aGlkZGVuOiEwfSxfX2NvbXB1dGVNZXRhOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uZXcgeG8oe3R5cGU6dCxrZXk6ZX0pO3JldHVybiB2b2lkIDAhPT1uJiZuIT09aS52YWx1ZT9pLnZhbHVlPW46dGhpcy52YWx1ZSE9PWkudmFsdWUmJih0aGlzLnZhbHVlPWkudmFsdWUpLGl9LGdldCBsaXN0KCl7cmV0dXJuIHRoaXMuX19tZXRhJiZ0aGlzLl9fbWV0YS5saXN0fSxfc2VsZkNoYW5nZWQ6ZnVuY3Rpb24odCl7dCYmKHRoaXMudmFsdWU9dGhpcyl9LGJ5S2V5OmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgeG8oe3R5cGU6dGhpcy50eXBlLGtleTp0fSkudmFsdWV9fSksCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpScih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWlubGluZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CgogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgogICAgICAgIGZpbGw6IHZhcigtLWlyb24taWNvbi1maWxsLWNvbG9yLCBjdXJyZW50Y29sb3IpOwogICAgICAgIHN0cm9rZTogdmFyKC0taXJvbi1pY29uLXN0cm9rZS1jb2xvciwgbm9uZSk7CgogICAgICAgIHdpZHRoOiB2YXIoLS1pcm9uLWljb24td2lkdGgsIDI0cHgpOwogICAgICAgIGhlaWdodDogdmFyKC0taXJvbi1pY29uLWhlaWdodCwgMjRweCk7CiAgICAgICAgQGFwcGx5IC0taXJvbi1pY29uOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CmAsaXM6Imlyb24taWNvbiIscHJvcGVydGllczp7aWNvbjp7dHlwZTpTdHJpbmd9LHRoZW1lOnt0eXBlOlN0cmluZ30sc3JjOnt0eXBlOlN0cmluZ30sX21ldGE6e3ZhbHVlOmZvLmNyZWF0ZSgiaXJvbi1tZXRhIix7dHlwZToiaWNvbnNldCJ9KX19LG9ic2VydmVyczpbIl91cGRhdGVJY29uKF9tZXRhLCBpc0F0dGFjaGVkKSIsIl91cGRhdGVJY29uKHRoZW1lLCBpc0F0dGFjaGVkKSIsIl9zcmNDaGFuZ2VkKHNyYywgaXNBdHRhY2hlZCkiLCJfaWNvbkNoYW5nZWQoaWNvbiwgaXNBdHRhY2hlZCkiXSxfREVGQVVMVF9JQ09OU0VUOiJpY29ucyIsX2ljb25DaGFuZ2VkOmZ1bmN0aW9uKHQpe3ZhciBlPSh0fHwiIikuc3BsaXQoIjoiKTt0aGlzLl9pY29uTmFtZT1lLnBvcCgpLHRoaXMuX2ljb25zZXROYW1lPWUucG9wKCl8fHRoaXMuX0RFRkFVTFRfSUNPTlNFVCx0aGlzLl91cGRhdGVJY29uKCl9LF9zcmNDaGFuZ2VkOmZ1bmN0aW9uKHQpe3RoaXMuX3VwZGF0ZUljb24oKX0sX3VzZXNJY29uc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWNvbnx8IXRoaXMuc3JjfSxfdXBkYXRlSWNvbjpmdW5jdGlvbigpe3RoaXMuX3VzZXNJY29uc2V0KCk/KHRoaXMuX2ltZyYmdGhpcy5faW1nLnBhcmVudE5vZGUmJllpKHRoaXMucm9vdCkucmVtb3ZlQ2hpbGQodGhpcy5faW1nKSwiIj09PXRoaXMuX2ljb25OYW1lP3RoaXMuX2ljb25zZXQmJnRoaXMuX2ljb25zZXQucmVtb3ZlSWNvbih0aGlzKTp0aGlzLl9pY29uc2V0TmFtZSYmdGhpcy5fbWV0YSYmKHRoaXMuX2ljb25zZXQ9dGhpcy5fbWV0YS5ieUtleSh0aGlzLl9pY29uc2V0TmFtZSksdGhpcy5faWNvbnNldD8odGhpcy5faWNvbnNldC5hcHBseUljb24odGhpcyx0aGlzLl9pY29uTmFtZSx0aGlzLnRoZW1lKSx0aGlzLnVubGlzdGVuKHdpbmRvdywiaXJvbi1pY29uc2V0LWFkZGVkIiwiX3VwZGF0ZUljb24iKSk6dGhpcy5saXN0ZW4od2luZG93LCJpcm9uLWljb25zZXQtYWRkZWQiLCJfdXBkYXRlSWNvbiIpKSk6KHRoaXMuX2ljb25zZXQmJnRoaXMuX2ljb25zZXQucmVtb3ZlSWNvbih0aGlzKSx0aGlzLl9pbWd8fCh0aGlzLl9pbWc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksdGhpcy5faW1nLnN0eWxlLndpZHRoPSIxMDAlIix0aGlzLl9pbWcuc3R5bGUuaGVpZ2h0PSIxMDAlIix0aGlzLl9pbWcuZHJhZ2dhYmxlPSExKSx0aGlzLl9pbWcuc3JjPXRoaXMuc3JjLFlpKHRoaXMucm9vdCkuYXBwZW5kQ2hpbGQodGhpcy5faW1nKSl9fSksCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpScih7aXM6Imlyb24taWNvbnNldC1zdmciLHByb3BlcnRpZXM6e25hbWU6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfbmFtZUNoYW5nZWQifSxzaXplOnt0eXBlOk51bWJlcix2YWx1ZToyNH0scnRsTWlycm9yaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHVzZUdsb2JhbFJ0bEF0dHJpYnV0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX21ldGE9bmV3IHhvKHt0eXBlOiJpY29uc2V0IixrZXk6bnVsbCx2YWx1ZTpudWxsfSl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZ2V0SWNvbk5hbWVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ljb25zPXRoaXMuX2NyZWF0ZUljb25NYXAoKSxPYmplY3Qua2V5cyh0aGlzLl9pY29ucykubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5uYW1lKyI6Iit0fSksdGhpcyl9LGFwcGx5SWNvbjpmdW5jdGlvbih0LGUpe3RoaXMucmVtb3ZlSWNvbih0KTt2YXIgbj10aGlzLl9jbG9uZUljb24oZSx0aGlzLnJ0bE1pcnJvcmluZyYmdGhpcy5fdGFyZ2V0SXNSVEwodCkpO2lmKG4pe3ZhciBpPVlpKHQucm9vdHx8dCk7cmV0dXJuIGkuaW5zZXJ0QmVmb3JlKG4saS5jaGlsZE5vZGVzWzBdKSx0Ll9zdmdJY29uPW59cmV0dXJuIG51bGx9LHJlbW92ZUljb246ZnVuY3Rpb24odCl7dC5fc3ZnSWNvbiYmKFlpKHQucm9vdHx8dCkucmVtb3ZlQ2hpbGQodC5fc3ZnSWNvbiksdC5fc3ZnSWNvbj1udWxsKX0sX3RhcmdldElzUlRMOmZ1bmN0aW9uKHQpe2lmKG51bGw9PXRoaXMuX190YXJnZXRJc1JUTClpZih0aGlzLnVzZUdsb2JhbFJ0bEF0dHJpYnV0ZSl7dmFyIGU9ZG9jdW1lbnQuYm9keSYmZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoImRpciIpP2RvY3VtZW50LmJvZHk6ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O3RoaXMuX190YXJnZXRJc1JUTD0icnRsIj09PWUuZ2V0QXR0cmlidXRlKCJkaXIiKX1lbHNlIHQmJnQubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSYmKHQ9dC5ob3N0KSx0aGlzLl9fdGFyZ2V0SXNSVEw9dCYmInJ0bCI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS5kaXJlY3Rpb247cmV0dXJuIHRoaXMuX190YXJnZXRJc1JUTH0sX25hbWVDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fbWV0YS52YWx1ZT1udWxsLHRoaXMuX21ldGEua2V5PXRoaXMubmFtZSx0aGlzLl9tZXRhLnZhbHVlPXRoaXMsdGhpcy5hc3luYygoZnVuY3Rpb24oKXt0aGlzLmZpcmUoImlyb24taWNvbnNldC1hZGRlZCIsdGhpcyx7bm9kZTp3aW5kb3d9KX0pKX0sX2NyZWF0ZUljb25NYXA6ZnVuY3Rpb24oKXt2YXIgdD1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBZaSh0aGlzKS5xdWVyeVNlbGVjdG9yQWxsKCJbaWRdIikuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dFtlLmlkXT1lfSkpLHR9LF9jbG9uZUljb246ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5faWNvbnM9dGhpcy5faWNvbnN8fHRoaXMuX2NyZWF0ZUljb25NYXAoKSx0aGlzLl9wcmVwYXJlU3ZnQ2xvbmUodGhpcy5faWNvbnNbdF0sdGhpcy5zaXplLGUpfSxfcHJlcGFyZVN2Z0Nsb25lOmZ1bmN0aW9uKHQsZSxuKXtpZih0KXt2YXIgaT10LmNsb25lTm9kZSghMCkscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwic3ZnIiksbz1pLmdldEF0dHJpYnV0ZSgidmlld0JveCIpfHwiMCAwICIrZSsiICIrZSxhPSJwb2ludGVyLWV2ZW50czogbm9uZTsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IjtyZXR1cm4gbiYmaS5oYXNBdHRyaWJ1dGUoIm1pcnJvci1pbi1ydGwiKSYmKGErPSItd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgtMSwxKTt0cmFuc2Zvcm06c2NhbGUoLTEsMSk7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7Iiksci5zZXRBdHRyaWJ1dGUoInZpZXdCb3giLG8pLHIuc2V0QXR0cmlidXRlKCJwcmVzZXJ2ZUFzcGVjdFJhdGlvIiwieE1pZFlNaWQgbWVldCIpLHIuc2V0QXR0cmlidXRlKCJmb2N1c2FibGUiLCJmYWxzZSIpLHIuc3R5bGUuY3NzVGV4dD1hLHIuYXBwZW5kQ2hpbGQoaSkucmVtb3ZlQXR0cmlidXRlKCJpZCIpLHJ9cmV0dXJuIG51bGx9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBTbz1fZWA8aXJvbi1pY29uc2V0LXN2ZyBuYW1lPSJpbWFnZSIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iYWRkLWEtcGhvdG8iPjxwYXRoIGQ9Ik0zIDRWMWgydjNoM3YySDV2M0gzVjZIMFY0aDN6bTMgNlY3aDNWNGg3bDEuODMgMkgyMWMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg1Yy0xLjEgMC0yLS45LTItMlYxMGgzem03IDljMi43NiAwIDUtMi4yNCA1LTVzLTIuMjQtNS01LTUtNSAyLjI0LTUgNSAyLjI0IDUgNSA1em0tMy4yLTVjMCAxLjc3IDEuNDMgMy4yIDMuMiAzLjJzMy4yLTEuNDMgMy4yLTMuMi0xLjQzLTMuMi0zLjItMy4yLTMuMiAxLjQzLTMuMiAzLjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYWRkLXRvLXBob3RvcyI+PHBhdGggZD0iTTQgNkgydjE0YzAgMS4xLjkgMiAyIDJoMTR2LTJINFY2em0xNi00SDhjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTEgOWgtNHY0aC0ydi00SDlWOWg0VjVoMnY0aDR2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJhZGp1c3QiPjxwYXRoIGQ9Ik0xMiAyQzYuNDkgMiAyIDYuNDkgMiAxMnM0LjQ5IDEwIDEwIDEwIDEwLTQuNDkgMTAtMTBTMTcuNTEgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHptMy04YzAgMS42Ni0xLjM0IDMtMyAzcy0zLTEuMzQtMy0zIDEuMzQtMyAzLTMgMyAxLjM0IDMgM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJhc3Npc3RhbnQiPjxwYXRoIGQ9Ik0xOSAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoNGwzIDMgMy0zaDRjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTUuMTIgMTAuODhMMTIgMTdsLTEuODgtNC4xMkw2IDExbDQuMTItMS44OEwxMiA1bDEuODggNC4xMkwxOCAxMWwtNC4xMiAxLjg4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFzc2lzdGFudC1waG90byI+PHBhdGggZD0iTTE0LjQgNkwxNCA0SDV2MTdoMnYtN2g1LjZsLjQgMmg3VjZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXVkaW90cmFjayI+PHBhdGggZD0iTTEyIDN2OS4yOGMtLjQ3LS4xNy0uOTctLjI4LTEuNS0uMjhDOC4wMSAxMiA2IDE0LjAxIDYgMTYuNVM4LjAxIDIxIDEwLjUgMjFjMi4zMSAwIDQuMi0xLjc1IDQuNDUtNEgxNVY2aDRWM2gtN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJibHVyLWNpcmN1bGFyIj48cGF0aCBkPSJNMTAgOWMtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTEtLjQ1LTEtMS0xem0wIDRjLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xLS40NS0xLTEtMXpNNyA5LjVjLS4yOCAwLS41LjIyLS41LjVzLjIyLjUuNS41LjUtLjIyLjUtLjUtLjIyLS41LS41LS41em0zIDdjLS4yOCAwLS41LjIyLS41LjVzLjIyLjUuNS41LjUtLjIyLjUtLjUtLjIyLS41LS41LS41em0tMy0zYy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXptMy02Yy4yOCAwIC41LS4yMi41LS41cy0uMjItLjUtLjUtLjUtLjUuMjItLjUuNS4yMi41LjUuNXpNMTQgOWMtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTEtLjQ1LTEtMS0xem0wLTEuNWMuMjggMCAuNS0uMjIuNS0uNXMtLjIyLS41LS41LS41LS41LjIyLS41LjUuMjIuNS41LjV6bTMgNmMtLjI4IDAtLjUuMjItLjUuNXMuMjIuNS41LjUuNS0uMjIuNS0uNS0uMjItLjUtLjUtLjV6bTAtNGMtLjI4IDAtLjUuMjItLjUuNXMuMjIuNS41LjUuNS0uMjIuNS0uNS0uMjItLjUtLjUtLjV6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4em0yLTMuNWMtLjI4IDAtLjUuMjItLjUuNXMuMjIuNS41LjUuNS0uMjIuNS0uNS0uMjItLjUtLjUtLjV6bTAtMy41Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYmx1ci1saW5lYXIiPjxwYXRoIGQ9Ik01IDE3LjVjLjgzIDAgMS41LS42NyAxLjUtMS41cy0uNjctMS41LTEuNS0xLjUtMS41LjY3LTEuNSAxLjUuNjcgMS41IDEuNSAxLjV6TTkgMTNjLjU1IDAgMS0uNDUgMS0xcy0uNDUtMS0xLTEtMSAuNDUtMSAxIC40NSAxIDEgMXptMC00Yy41NSAwIDEtLjQ1IDEtMXMtLjQ1LTEtMS0xLTEgLjQ1LTEgMSAuNDUgMSAxIDF6TTMgMjFoMTh2LTJIM3Yyek01IDkuNWMuODMgMCAxLjUtLjY3IDEuNS0xLjVTNS44MyA2LjUgNSA2LjUgMy41IDcuMTcgMy41IDggNC4xNyA5LjUgNSA5LjV6bTAgNGMuODMgMCAxLjUtLjY3IDEuNS0xLjVzLS42Ny0xLjUtMS41LTEuNS0xLjUuNjctMS41IDEuNS42NyAxLjUgMS41IDEuNXpNOSAxN2MuNTUgMCAxLS40NSAxLTFzLS40NS0xLTEtMS0xIC40NS0xIDEgLjQ1IDEgMSAxem04LS41Yy4yOCAwIC41LS4yMi41LS41cy0uMjItLjUtLjUtLjUtLjUuMjItLjUuNS4yMi41LjUuNXpNMyAzdjJoMThWM0gzem0xNCA1LjVjLjI4IDAgLjUtLjIyLjUtLjVzLS4yMi0uNS0uNS0uNS0uNS4yMi0uNS41LjIyLjUuNS41em0wIDRjLjI4IDAgLjUtLjIyLjUtLjVzLS4yMi0uNS0uNS0uNS0uNS4yMi0uNS41LjIyLjUuNS41ek0xMyA5Yy41NSAwIDEtLjQ1IDEtMXMtLjQ1LTEtMS0xLTEgLjQ1LTEgMSAuNDUgMSAxIDF6bTAgNGMuNTUgMCAxLS40NSAxLTFzLS40NS0xLTEtMS0xIC40NS0xIDEgLjQ1IDEgMSAxem0wIDRjLjU1IDAgMS0uNDUgMS0xcy0uNDUtMS0xLTEtMSAuNDUtMSAxIC40NSAxIDEgMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJibHVyLW9mZiI+PHBhdGggZD0iTTE0IDdjLjU1IDAgMS0uNDUgMS0xcy0uNDUtMS0xLTEtMSAuNDUtMSAxIC40NSAxIDEgMXptLS4yIDQuNDhsLjIuMDJjLjgzIDAgMS41LS42NyAxLjUtMS41cy0uNjctMS41LTEuNS0xLjUtMS41LjY3LTEuNSAxLjVsLjAyLjJjLjA5LjY3LjYxIDEuMTkgMS4yOCAxLjI4ek0xNCAzLjVjLjI4IDAgLjUtLjIyLjUtLjVzLS4yMi0uNS0uNS0uNS0uNS4yMi0uNS41LjIyLjUuNS41em0tNCAwYy4yOCAwIC41LS4yMi41LS41cy0uMjItLjUtLjUtLjUtLjUuMjItLjUuNS4yMi41LjUuNXptMTEgN2MuMjggMCAuNS0uMjIuNS0uNXMtLjIyLS41LS41LS41LS41LjIyLS41LjUuMjIuNS41LjV6TTEwIDdjLjU1IDAgMS0uNDUgMS0xcy0uNDUtMS0xLTEtMSAuNDUtMSAxIC40NSAxIDEgMXptOCA4Yy41NSAwIDEtLjQ1IDEtMXMtLjQ1LTEtMS0xLTEgLjQ1LTEgMSAuNDUgMSAxIDF6bTAtNGMuNTUgMCAxLS40NSAxLTFzLS40NS0xLTEtMS0xIC40NS0xIDEgLjQ1IDEgMSAxem0wLTRjLjU1IDAgMS0uNDUgMS0xcy0uNDUtMS0xLTEtMSAuNDUtMSAxIC40NSAxIDEgMXptLTQgMTMuNWMtLjI4IDAtLjUuMjItLjUuNXMuMjIuNS41LjUuNS0uMjIuNS0uNS0uMjItLjUtLjUtLjV6TTIuNSA1LjI3bDMuNzggMy43OEw2IDljLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xYzAtLjEtLjAzLS4xOS0uMDYtLjI4bDIuODEgMi44MWMtLjcxLjExLTEuMjUuNzMtMS4yNSAxLjQ3IDAgLjgzLjY3IDEuNSAxLjUgMS41Ljc0IDAgMS4zNi0uNTQgMS40Ny0xLjI1bDIuODEgMi44MWMtLjA5LS4wMy0uMTgtLjA2LS4yOC0uMDYtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTFjMC0uMS0uMDMtLjE5LS4wNi0uMjhsMy43OCAzLjc4TDIwIDIwLjIzIDMuNzcgNCAyLjUgNS4yN3pNMTAgMTdjLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xLS40NS0xLTEtMXptMTEtMy41Yy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXpNNiAxM2MtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTEtLjQ1LTEtMS0xek0zIDkuNWMtLjI4IDAtLjUuMjItLjUuNXMuMjIuNS41LjUuNS0uMjIuNS0uNS0uMjItLjUtLjUtLjV6bTcgMTFjLS4yOCAwLS41LjIyLS41LjVzLjIyLjUuNS41LjUtLjIyLjUtLjUtLjIyLS41LS41LS41ek02IDE3Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6bS0zLTMuNWMtLjI4IDAtLjUuMjItLjUuNXMuMjIuNS41LjUuNS0uMjIuNS0uNS0uMjItLjUtLjUtLjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYmx1ci1vbiI+PHBhdGggZD0iTTYgMTNjLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xLS40NS0xLTEtMXptMCA0Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6bTAtOGMtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTEtLjQ1LTEtMS0xem0tMyAuNWMtLjI4IDAtLjUuMjItLjUuNXMuMjIuNS41LjUuNS0uMjIuNS0uNS0uMjItLjUtLjUtLjV6TTYgNWMtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTEtLjQ1LTEtMS0xem0xNSA1LjVjLjI4IDAgLjUtLjIyLjUtLjVzLS4yMi0uNS0uNS0uNS0uNS4yMi0uNS41LjIyLjUuNS41ek0xNCA3Yy41NSAwIDEtLjQ1IDEtMXMtLjQ1LTEtMS0xLTEgLjQ1LTEgMSAuNDUgMSAxIDF6bTAtMy41Yy4yOCAwIC41LS4yMi41LS41cy0uMjItLjUtLjUtLjUtLjUuMjItLjUuNS4yMi41LjUuNXptLTExIDEwYy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXptNyA3Yy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXptMC0xN2MuMjggMCAuNS0uMjIuNS0uNXMtLjIyLS41LS41LS41LS41LjIyLS41LjUuMjIuNS41LjV6TTEwIDdjLjU1IDAgMS0uNDUgMS0xcy0uNDUtMS0xLTEtMSAuNDUtMSAxIC40NSAxIDEgMXptMCA1LjVjLS44MyAwLTEuNS42Ny0xLjUgMS41cy42NyAxLjUgMS41IDEuNSAxLjUtLjY3IDEuNS0xLjUtLjY3LTEuNS0xLjUtMS41em04IC41Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6bTAgNGMtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTEtLjQ1LTEtMS0xem0wLThjLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xLS40NS0xLTEtMXptMC00Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6bTMgOC41Yy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXpNMTQgMTdjLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xLS40NS0xLTEtMXptMCAzLjVjLS4yOCAwLS41LjIyLS41LjVzLjIyLjUuNS41LjUtLjIyLjUtLjUtLjIyLS41LS41LS41em0tNC0xMmMtLjgzIDAtMS41LjY3LTEuNSAxLjVzLjY3IDEuNSAxLjUgMS41IDEuNS0uNjcgMS41LTEuNS0uNjctMS41LTEuNS0xLjV6bTAgOC41Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6bTQtNC41Yy0uODMgMC0xLjUuNjctMS41IDEuNXMuNjcgMS41IDEuNSAxLjUgMS41LS42NyAxLjUtMS41LS42Ny0xLjUtMS41LTEuNXptMC00Yy0uODMgMC0xLjUuNjctMS41IDEuNXMuNjcgMS41IDEuNSAxLjUgMS41LS42NyAxLjUtMS41LS42Ny0xLjUtMS41LTEuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJicmlnaHRuZXNzLTEiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIj48L2NpcmNsZT48L2c+CjxnIGlkPSJicmlnaHRuZXNzLTIiPjxwYXRoIGQ9Ik0xMCAyYy0xLjgyIDAtMy41My41LTUgMS4zNUM3Ljk5IDUuMDggMTAgOC4zIDEwIDEycy0yLjAxIDYuOTItNSA4LjY1QzYuNDcgMjEuNSA4LjE4IDIyIDEwIDIyYzUuNTIgMCAxMC00LjQ4IDEwLTEwUzE1LjUyIDIgMTAgMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJicmlnaHRuZXNzLTMiPjxwYXRoIGQ9Ik05IDJjLTEuMDUgMC0yLjA1LjE2LTMgLjQ2IDQuMDYgMS4yNyA3IDUuMDYgNyA5LjU0IDAgNC40OC0yLjk0IDguMjctNyA5LjU0Ljk1LjMgMS45NS40NiAzIC40NiA1LjUyIDAgMTAtNC40OCAxMC0xMFMxNC41MiAyIDkgMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJicmlnaHRuZXNzLTQiPjxwYXRoIGQ9Ik0yMCA4LjY5VjRoLTQuNjlMMTIgLjY5IDguNjkgNEg0djQuNjlMLjY5IDEyIDQgMTUuMzFWMjBoNC42OUwxMiAyMy4zMSAxNS4zMSAyMEgyMHYtNC42OUwyMy4zMSAxMiAyMCA4LjY5ek0xMiAxOGMtLjg5IDAtMS43NC0uMi0yLjUtLjU1QzExLjU2IDE2LjUgMTMgMTQuNDIgMTMgMTJzLTEuNDQtNC41LTMuNS01LjQ1QzEwLjI2IDYuMiAxMS4xMSA2IDEyIDZjMy4zMSAwIDYgMi42OSA2IDZzLTIuNjkgNi02IDZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYnJpZ2h0bmVzcy01Ij48cGF0aCBkPSJNMjAgMTUuMzFMMjMuMzEgMTIgMjAgOC42OVY0aC00LjY5TDEyIC42OSA4LjY5IDRINHY0LjY5TC42OSAxMiA0IDE1LjMxVjIwaDQuNjlMMTIgMjMuMzEgMTUuMzEgMjBIMjB2LTQuNjl6TTEyIDE4Yy0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02IDYgMi42OSA2IDYtMi42OSA2LTYgNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJicmlnaHRuZXNzLTYiPjxwYXRoIGQ9Ik0yMCAxNS4zMUwyMy4zMSAxMiAyMCA4LjY5VjRoLTQuNjlMMTIgLjY5IDguNjkgNEg0djQuNjlMLjY5IDEyIDQgMTUuMzFWMjBoNC42OUwxMiAyMy4zMSAxNS4zMSAyMEgyMHYtNC42OXpNMTIgMThWNmMzLjMxIDAgNiAyLjY5IDYgNnMtMi42OSA2LTYgNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJicmlnaHRuZXNzLTciPjxwYXRoIGQ9Ik0yMCA4LjY5VjRoLTQuNjlMMTIgLjY5IDguNjkgNEg0djQuNjlMLjY5IDEyIDQgMTUuMzFWMjBoNC42OUwxMiAyMy4zMSAxNS4zMSAyMEgyMHYtNC42OUwyMy4zMSAxMiAyMCA4LjY5ek0xMiAxOGMtMy4zMSAwLTYtMi42OS02LTZzMi42OS02IDYtNiA2IDIuNjkgNiA2LTIuNjkgNi02IDZ6bTAtMTBjLTIuMjEgMC00IDEuNzktNCA0czEuNzkgNCA0IDQgNC0xLjc5IDQtNC0xLjc5LTQtNC00eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJyb2tlbi1pbWFnZSI+PHBhdGggZD0iTTIxIDV2Ni41OWwtMy0zLjAxLTQgNC4wMS00LTQtNCA0LTMtMy4wMVY1YzAtMS4xLjktMiAyLTJoMTRjMS4xIDAgMiAuOSAyIDJ6bS0zIDYuNDJsMyAzLjAxVjE5YzAgMS4xLS45IDItMiAySDVjLTEuMSAwLTItLjktMi0ydi02LjU4bDMgMi45OSA0LTQgNCA0IDQtMy45OXoiPjwvcGF0aD48L2c+CjxnIGlkPSJicnVzaCI+PHBhdGggZD0iTTcgMTRjLTEuNjYgMC0zIDEuMzQtMyAzIDAgMS4zMS0xLjE2IDItMiAyIC45MiAxLjIyIDIuNDkgMiA0IDIgMi4yMSAwIDQtMS43OSA0LTQgMC0xLjY2LTEuMzQtMy0zLTN6bTEzLjcxLTkuMzdsLTEuMzQtMS4zNGMtLjM5LS4zOS0xLjAyLS4zOS0xLjQxIDBMOSAxMi4yNSAxMS43NSAxNWw4Ljk2LTguOTZjLjM5LS4zOS4zOS0xLjAyIDAtMS40MXoiPjwvcGF0aD48L2c+CjxnIGlkPSJidXJzdC1tb2RlIj48cGF0aCBkPSJNMSA1aDJ2MTRIMXptNCAwaDJ2MTRINXptMTcgMEgxMGMtLjU1IDAtMSAuNDUtMSAxdjEyYzAgLjU1LjQ1IDEgMSAxaDEyYy41NSAwIDEtLjQ1IDEtMVY2YzAtLjU1LS40NS0xLTEtMXpNMTEgMTdsMi41LTMuMTVMMTUuMjkgMTZsMi41LTMuMjJMMjEgMTdIMTF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2FtZXJhIj48cGF0aCBkPSJNOS40IDEwLjVsNC43Ny04LjI2QzEzLjQ3IDIuMDkgMTIuNzUgMiAxMiAyYy0yLjQgMC00LjYuODUtNi4zMiAyLjI1bDMuNjYgNi4zNS4wNi0uMXpNMjEuNTQgOWMtLjkyLTIuOTItMy4xNS01LjI2LTYtNi4zNEwxMS44OCA5aDkuNjZ6bS4yNiAxaC03LjQ5bC4yOS41IDQuNzYgOC4yNUMyMSAxNi45NyAyMiAxNC42MSAyMiAxMmMwLS42OS0uMDctMS4zNS0uMi0yek04LjU0IDEybC0zLjktNi43NUMzLjAxIDcuMDMgMiA5LjM5IDIgMTJjMCAuNjkuMDcgMS4zNS4yIDJoNy40OWwtMS4xNS0yem0tNi4wOCAzYy45MiAyLjkyIDMuMTUgNS4yNiA2IDYuMzRMMTIuMTIgMTVIMi40NnptMTEuMjcgMGwtMy45IDYuNzZjLjcuMTUgMS40Mi4yNCAyLjE3LjI0IDIuNCAwIDQuNi0uODUgNi4zMi0yLjI1bC0zLjY2LTYuMzUtLjkzIDEuNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjYW1lcmEtYWx0Ij48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIzLjIiPjwvY2lyY2xlPjxwYXRoIGQ9Ik05IDJMNy4xNyA0SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMmgtMy4xN0wxNSAySDl6bTMgMTVjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNhbWVyYS1mcm9udCI+PHBhdGggZD0iTTEwIDIwSDV2Mmg1djJsMy0zLTMtM3Yyem00IDB2Mmg1di0yaC01ek0xMiA4YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0xLjk5LjktMS45OSAyUzEwLjkgOCAxMiA4em01LThIN0M1LjkgMCA1IC45IDUgMnYxNGMwIDEuMS45IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjJjMC0xLjEtLjktMi0yLTJ6TTcgMmgxMHYxMC41YzAtMS42Ny0zLjMzLTIuNS01LTIuNXMtNSAuODMtNSAyLjVWMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjYW1lcmEtcmVhciI+PHBhdGggZD0iTTEwIDIwSDV2Mmg1djJsMy0zLTMtM3Yyem00IDB2Mmg1di0yaC01em0zLTIwSDdDNS45IDAgNSAuOSA1IDJ2MTRjMCAxLjEuOSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlYyYzAtMS4xLS45LTItMi0yem0tNSA2Yy0xLjExIDAtMi0uOS0yLTJzLjg5LTIgMS45OS0yIDIgLjkgMiAyQzE0IDUuMSAxMy4xIDYgMTIgNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjYW1lcmEtcm9sbCI+PHBhdGggZD0iTTE0IDVjMC0xLjEtLjktMi0yLTJoLTFWMmMwLS41NS0uNDUtMS0xLTFINmMtLjU1IDAtMSAuNDUtMSAxdjFINGMtMS4xIDAtMiAuOS0yIDJ2MTVjMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yaDhWNWgtOHptLTIgMTNoLTJ2LTJoMnYyem0wLTloLTJWN2gydjJ6bTQgOWgtMnYtMmgydjJ6bTAtOWgtMlY3aDJ2MnptNCA5aC0ydi0yaDJ2MnptMC05aC0yVjdoMnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNlbnRlci1mb2N1cy1zdHJvbmciPjxwYXRoIGQ9Ik0xMiA4Yy0yLjIxIDAtNCAxLjc5LTQgNHMxLjc5IDQgNCA0IDQtMS43OSA0LTQtMS43OS00LTQtNHptLTcgN0gzdjRjMCAxLjEuOSAyIDIgMmg0di0ySDV2LTR6TTUgNWg0VjNINWMtMS4xIDAtMiAuOS0yIDJ2NGgyVjV6bTE0LTJoLTR2Mmg0djRoMlY1YzAtMS4xLS45LTItMi0yem0wIDE2aC00djJoNGMxLjEgMCAyLS45IDItMnYtNGgtMnY0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNlbnRlci1mb2N1cy13ZWFrIj48cGF0aCBkPSJNNSAxNUgzdjRjMCAxLjEuOSAyIDIgMmg0di0ySDV2LTR6TTUgNWg0VjNINWMtMS4xIDAtMiAuOS0yIDJ2NGgyVjV6bTE0LTJoLTR2Mmg0djRoMlY1YzAtMS4xLS45LTItMi0yem0wIDE2aC00djJoNGMxLjEgMCAyLS45IDItMnYtNGgtMnY0ek0xMiA4Yy0yLjIxIDAtNCAxLjc5LTQgNHMxLjc5IDQgNCA0IDQtMS43OSA0LTQtMS43OS00LTQtNHptMCA2Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjb2xsZWN0aW9ucyI+PHBhdGggZD0iTTIyIDE2VjRjMC0xLjEtLjktMi0yLTJIOGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMnptLTExLTRsMi4wMyAyLjcxTDE2IDExbDQgNUg4bDMtNHpNMiA2djE0YzAgMS4xLjkgMiAyIDJoMTR2LTJINFY2SDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY29sbGVjdGlvbnMtYm9va21hcmsiPjxwYXRoIGQ9Ik00IDZIMnYxNGMwIDEuMS45IDIgMiAyaDE0di0ySDRWNnptMTYtNEg4Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bTAgMTBsLTIuNS0xLjVMMTUgMTJWNGg1djh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY29sb3ItbGVucyI+PHBhdGggZD0iTTEyIDNjLTQuOTcgMC05IDQuMDMtOSA5czQuMDMgOSA5IDljLjgzIDAgMS41LS42NyAxLjUtMS41IDAtLjM5LS4xNS0uNzQtLjM5LTEuMDEtLjIzLS4yNi0uMzgtLjYxLS4zOC0uOTkgMC0uODMuNjctMS41IDEuNS0xLjVIMTZjMi43NiAwIDUtMi4yNCA1LTUgMC00LjQyLTQuMDMtOC05LTh6bS01LjUgOWMtLjgzIDAtMS41LS42Ny0xLjUtMS41UzUuNjcgOSA2LjUgOSA4IDkuNjcgOCAxMC41IDcuMzMgMTIgNi41IDEyem0zLTRDOC42NyA4IDggNy4zMyA4IDYuNVM4LjY3IDUgOS41IDVzMS41LjY3IDEuNSAxLjVTMTAuMzMgOCA5LjUgOHptNSAwYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVTMTMuNjcgNSAxNC41IDVzMS41LjY3IDEuNSAxLjVTMTUuMzMgOCAxNC41IDh6bTMgNGMtLjgzIDAtMS41LS42Ny0xLjUtMS41UzE2LjY3IDkgMTcuNSA5czEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJjb2xvcml6ZSI+PHBhdGggZD0iTTIwLjcxIDUuNjNsLTIuMzQtMi4zNGMtLjM5LS4zOS0xLjAyLS4zOS0xLjQxIDBsLTMuMTIgMy4xMi0xLjkzLTEuOTEtMS40MSAxLjQxIDEuNDIgMS40MkwzIDE2LjI1VjIxaDQuNzVsOC45Mi04LjkyIDEuNDIgMS40MiAxLjQxLTEuNDEtMS45Mi0xLjkyIDMuMTItMy4xMmMuNC0uNC40LTEuMDMuMDEtMS40MnpNNi45MiAxOUw1IDE3LjA4bDguMDYtOC4wNiAxLjkyIDEuOTJMNi45MiAxOXoiPjwvcGF0aD48L2c+CjxnIGlkPSJjb21wYXJlIj48cGF0aCBkPSJNMTAgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDV2MmgyVjFoLTJ2MnptMCAxNUg1bDUtNnY2em05LTE1aC01djJoNXYxM2wtNS02djloNWMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNvbnRyb2wtcG9pbnQiPjxwYXRoIGQ9Ik0xMyA3aC0ydjRIN3YyaDR2NGgydi00aDR2LTJoLTRWN3ptLTEtNUM2LjQ5IDIgMiA2LjQ5IDIgMTJzNC40OSAxMCAxMCAxMCAxMC00LjQ5IDEwLTEwUzE3LjUxIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY29udHJvbC1wb2ludC1kdXBsaWNhdGUiPjxwYXRoIGQ9Ik0xNiA4aC0ydjNoLTN2MmgzdjNoMnYtM2gzdi0yaC0zek0yIDEyYzAtMi43OSAxLjY0LTUuMiA0LjAxLTYuMzJWMy41MkMyLjUyIDQuNzYgMCA4LjA5IDAgMTJzMi41MiA3LjI0IDYuMDEgOC40OHYtMi4xNkMzLjY0IDE3LjIgMiAxNC43OSAyIDEyem0xMy05Yy00Ljk2IDAtOSA0LjA0LTkgOXM0LjA0IDkgOSA5IDktNC4wNCA5LTktNC4wNC05LTktOXptMCAxNmMtMy44NiAwLTctMy4xNC03LTdzMy4xNC03IDctNyA3IDMuMTQgNyA3LTMuMTQgNy03IDd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY3JvcCI+PHBhdGggZD0iTTE3IDE1aDJWN2MwLTEuMS0uOS0yLTItMkg5djJoOHY4ek03IDE3VjFINXY0SDF2Mmg0djEwYzAgMS4xLjkgMiAyIDJoMTB2NGgydi00aDR2LTJIN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJjcm9wLTE2LTkiPjxwYXRoIGQ9Ik0xOSA2SDVjLTEuMSAwLTIgLjktMiAydjhjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yem0wIDEwSDVWOGgxNHY4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyb3AtMy0yIj48cGF0aCBkPSJNMTkgNEg1Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgMTRINVY2aDE0djEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyb3AtNS00Ij48cGF0aCBkPSJNMTkgNUg1Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6bTAgMTJINVY3aDE0djEweiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyb3AtNy01Ij48cGF0aCBkPSJNMTkgN0g1Yy0xLjEgMC0yIC45LTIgMnY2YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWOWMwLTEuMS0uOS0yLTItMnptMCA4SDVWOWgxNHY2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyb3AtZGluIj48cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTZINVY1aDE0djE0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyb3AtZnJlZSI+PHBhdGggZD0iTTMgNXY0aDJWNWg0VjNINWMtMS4xIDAtMiAuOS0yIDJ6bTIgMTBIM3Y0YzAgMS4xLjkgMiAyIDJoNHYtMkg1di00em0xNCA0aC00djJoNGMxLjEgMCAyLS45IDItMnYtNGgtMnY0em0wLTE2aC00djJoNHY0aDJWNWMwLTEuMS0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjcm9wLWxhbmRzY2FwZSI+PHBhdGggZD0iTTE5IDVINWMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yem0wIDEySDVWN2gxNHYxMHoiPjwvcGF0aD48L2c+CjxnIGlkPSJjcm9wLW9yaWdpbmFsIj48cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTZINVY1aDE0djE0em0tNS4wNC02LjcxbC0yLjc1IDMuNTQtMS45Ni0yLjM2TDYuNSAxN2gxMWwtMy41NC00LjcxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyb3AtcG9ydHJhaXQiPjxwYXRoIGQ9Ik0xNyAzSDdjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTBjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkg3VjVoMTB2MTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY3JvcC1yb3RhdGUiPjxwYXRoIGQ9Ik03LjQ3IDIxLjQ5QzQuMiAxOS45MyAxLjg2IDE2Ljc2IDEuNSAxM0gwYy41MSA2LjE2IDUuNjYgMTEgMTEuOTUgMTEgLjIzIDAgLjQ0LS4wMi42Ni0uMDNMOC44IDIwLjE1bC0xLjMzIDEuMzR6TTEyLjA1IDBjLS4yMyAwLS40NC4wMi0uNjYuMDRsMy44MSAzLjgxIDEuMzMtMS4zM0MxOS44IDQuMDcgMjIuMTQgNy4yNCAyMi41IDExSDI0Yy0uNTEtNi4xNi01LjY2LTExLTExLjk1LTExek0xNiAxNGgyVjhjMC0xLjExLS45LTItMi0yaC02djJoNnY2em0tOCAyVjRINnYySDR2MmgydjhjMCAxLjEuODkgMiAyIDJoOHYyaDJ2LTJoMnYtMkg4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyb3Atc3F1YXJlIj48cGF0aCBkPSJNMTggNEg2Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgMTRINlY2aDEydjEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImRlaGF6ZSI+PHBhdGggZD0iTTIgMTUuNXYyaDIwdi0ySDJ6bTAtNXYyaDIwdi0ySDJ6bTAtNXYyaDIwdi0ySDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZGV0YWlscyI+PHBhdGggZD0iTTMgNGw5IDE2IDktMTZIM3ptMy4zOCAyaDExLjI1TDEyIDE2IDYuMzggNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJlZGl0Ij48cGF0aCBkPSJNMyAxNy4yNVYyMWgzLjc1TDE3LjgxIDkuOTRsLTMuNzUtMy43NUwzIDE3LjI1ek0yMC43MSA3LjA0Yy4zOS0uMzkuMzktMS4wMiAwLTEuNDFsLTIuMzQtMi4zNGMtLjM5LS4zOS0xLjAyLS4zOS0xLjQxIDBsLTEuODMgMS44MyAzLjc1IDMuNzUgMS44My0xLjgzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImV4cG9zdXJlIj48cGF0aCBkPSJNMTUgMTd2Mmgydi0yaDJ2LTJoLTJ2LTJoLTJ2MmgtMnYyaDJ6bTUtMTVINGMtMS4xIDAtMiAuOS0yIDJ2MTZjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek01IDVoNnYySDVWNXptMTUgMTVINEwyMCA0djE2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImV4cG9zdXJlLW5lZy0xIj48cGF0aCBkPSJNNCAxMXYyaDh2LTJINHptMTUgN2gtMlY3LjM4TDE0IDguNFY2LjdMMTguNyA1aC4zdjEzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImV4cG9zdXJlLW5lZy0yIj48cGF0aCBkPSJNMTUuMDUgMTYuMjlsMi44Ni0zLjA3Yy4zOC0uMzkuNzItLjc5IDEuMDQtMS4xOC4zMi0uMzkuNTktLjc4LjgyLTEuMTcuMjMtLjM5LjQxLS43OC41NC0xLjE3cy4xOS0uNzkuMTktMS4xOGMwLS41My0uMDktMS4wMi0uMjctMS40Ni0uMTgtLjQ0LS40NC0uODEtLjc4LTEuMTEtLjM0LS4zMS0uNzctLjU0LTEuMjYtLjcxLS41MS0uMTYtMS4wOC0uMjQtMS43Mi0uMjQtLjY5IDAtMS4zMS4xMS0xLjg1LjMyLS41NC4yMS0xIC41MS0xLjM2Ljg4LS4zNy4zNy0uNjUuOC0uODQgMS4zLS4xOC40Ny0uMjcuOTctLjI4IDEuNWgyLjE0Yy4wMS0uMzEuMDUtLjYuMTMtLjg3LjA5LS4yOS4yMy0uNTQuNC0uNzUuMTgtLjIxLjQxLS4zNy42OC0uNDkuMjctLjEyLjYtLjE4Ljk2LS4xOC4zMSAwIC41OC4wNS44MS4xNS4yMy4xLjQzLjI1LjU5LjQzLjE2LjE4LjI4LjQuMzcuNjUuMDguMjUuMTMuNTIuMTMuODEgMCAuMjItLjAzLjQzLS4wOC42NS0uMDYuMjItLjE1LjQ1LS4yOS43LS4xNC4yNS0uMzIuNTMtLjU2LjgzLS4yMy4zLS41Mi42NS0uODggMS4wM2wtNC4xNyA0LjU1VjE4SDIxdi0xLjcxaC01Ljk1ek0yIDExdjJoOHYtMkgyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImV4cG9zdXJlLXBsdXMtMSI+PHBhdGggZD0iTTEwIDdIOHY0SDR2Mmg0djRoMnYtNGg0di0yaC00Vjd6bTEwIDExaC0yVjcuMzhMMTUgOC40VjYuN0wxOS43IDVoLjN2MTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXhwb3N1cmUtcGx1cy0yIj48cGF0aCBkPSJNMTYuMDUgMTYuMjlsMi44Ni0zLjA3Yy4zOC0uMzkuNzItLjc5IDEuMDQtMS4xOC4zMi0uMzkuNTktLjc4LjgyLTEuMTcuMjMtLjM5LjQxLS43OC41NC0xLjE3LjEzLS4zOS4xOS0uNzkuMTktMS4xOCAwLS41My0uMDktMS4wMi0uMjctMS40Ni0uMTgtLjQ0LS40NC0uODEtLjc4LTEuMTEtLjM0LS4zMS0uNzctLjU0LTEuMjYtLjcxLS41MS0uMTYtMS4wOC0uMjQtMS43Mi0uMjQtLjY5IDAtMS4zMS4xMS0xLjg1LjMyLS41NC4yMS0xIC41MS0xLjM2Ljg4LS4zNy4zNy0uNjUuOC0uODQgMS4zLS4xOC40Ny0uMjcuOTctLjI4IDEuNWgyLjE0Yy4wMS0uMzEuMDUtLjYuMTMtLjg3LjA5LS4yOS4yMy0uNTQuNC0uNzUuMTgtLjIxLjQxLS4zNy42OC0uNDkuMjctLjEyLjYtLjE4Ljk2LS4xOC4zMSAwIC41OC4wNS44MS4xNS4yMy4xLjQzLjI1LjU5LjQzLjE2LjE4LjI4LjQuMzcuNjUuMDguMjUuMTMuNTIuMTMuODEgMCAuMjItLjAzLjQzLS4wOC42NS0uMDYuMjItLjE1LjQ1LS4yOS43LS4xNC4yNS0uMzIuNTMtLjU2LjgzLS4yMy4zLS41Mi42NS0uODggMS4wM2wtNC4xNyA0LjU1VjE4SDIydi0xLjcxaC01Ljk1ek04IDdINnY0SDJ2Mmg0djRoMnYtNGg0di0ySDhWN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJleHBvc3VyZS16ZXJvIj48cGF0aCBkPSJNMTYuMTQgMTIuNWMwIDEtLjEgMS44NS0uMyAyLjU1LS4yLjctLjQ4IDEuMjctLjgzIDEuNy0uMzYuNDQtLjc5Ljc1LTEuMy45NS0uNTEuMi0xLjA3LjMtMS43LjMtLjYyIDAtMS4xOC0uMS0xLjY5LS4zLS41MS0uMi0uOTUtLjUxLTEuMzEtLjk1LS4zNi0uNDQtLjY1LTEuMDEtLjg1LTEuNy0uMi0uNy0uMy0xLjU1LS4zLTIuNTV2LTIuMDRjMC0xIC4xLTEuODUuMy0yLjU1LjItLjcuNDgtMS4yNi44NC0xLjY5LjM2LS40My44LS43NCAxLjMxLS45M0MxMC44MSA1LjEgMTEuMzggNSAxMiA1Yy42MyAwIDEuMTkuMSAxLjcuMjkuNTEuMTkuOTUuNSAxLjMxLjkzLjM2LjQzLjY0Ljk5Ljg0IDEuNjkuMi43LjMgMS41NC4zIDIuNTV2Mi4wNHptLTIuMTEtMi4zNmMwLS42NC0uMDUtMS4xOC0uMTMtMS42Mi0uMDktLjQ0LS4yMi0uNzktLjQtMS4wNi0uMTctLjI3LS4zOS0uNDYtLjY0LS41OC0uMjUtLjEzLS41NC0uMTktLjg2LS4xOS0uMzIgMC0uNjEuMDYtLjg2LjE4cy0uNDcuMzEtLjY0LjU4Yy0uMTcuMjctLjMxLjYyLS40IDEuMDZzLS4xMy45OC0uMTMgMS42MnYyLjY3YzAgLjY0LjA1IDEuMTguMTQgMS42Mi4wOS40NS4yMy44MS40IDEuMDlzLjM5LjQ4LjY0LjYxLjU0LjE5Ljg3LjE5Yy4zMyAwIC42Mi0uMDYuODctLjE5cy40Ni0uMzMuNjMtLjYxYy4xNy0uMjguMy0uNjQuMzktMS4wOS4wOS0uNDUuMTMtLjk5LjEzLTEuNjJ2LTIuNjZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyIj48cGF0aCBkPSJNMTUuOTYgMTAuMjlsLTIuNzUgMy41NC0xLjk2LTIuMzZMOC41IDE1aDExbC0zLjU0LTQuNzF6TTMgNUgxdjE2YzAgMS4xLjkgMiAyIDJoMTZ2LTJIM1Y1em0xOC00SDdjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0yLTItMnptMCAxNkg3VjNoMTR2MTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLTEiPjxwYXRoIGQ9Ik0zIDVIMXYxNmMwIDEuMS45IDIgMiAyaDE2di0ySDNWNXptMTEgMTBoMlY1aC00djJoMnY4em03LTE0SDdjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0yLTItMnptMCAxNkg3VjNoMTR2MTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLTIiPjxwYXRoIGQ9Ik0zIDVIMXYxNmMwIDEuMS45IDIgMiAyaDE2di0ySDNWNXptMTgtNEg3Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgMTZIN1YzaDE0djE0em0tNC00aC00di0yaDJjMS4xIDAgMi0uODkgMi0yVjdjMC0xLjExLS45LTItMi0yaC00djJoNHYyaC0yYy0xLjEgMC0yIC44OS0yIDJ2NGg2di0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbHRlci0zIj48cGF0aCBkPSJNMjEgMUg3Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgMTZIN1YzaDE0djE0ek0zIDVIMXYxNmMwIDEuMS45IDIgMiAyaDE2di0ySDNWNXptMTQgOHYtMS41YzAtLjgzLS42Ny0xLjUtMS41LTEuNS44MyAwIDEuNS0uNjcgMS41LTEuNVY3YzAtMS4xMS0uOS0yLTItMmgtNHYyaDR2MmgtMnYyaDJ2MmgtNHYyaDRjMS4xIDAgMi0uODkgMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbHRlci00Ij48cGF0aCBkPSJNMyA1SDF2MTZjMCAxLjEuOSAyIDIgMmgxNnYtMkgzVjV6bTEyIDEwaDJWNWgtMnY0aC0yVjVoLTJ2Nmg0djR6bTYtMTRIN2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTItMi0yem0wIDE2SDdWM2gxNHYxNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXItNSI+PHBhdGggZD0iTTIxIDFIN2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTItMi0yem0wIDE2SDdWM2gxNHYxNHpNMyA1SDF2MTZjMCAxLjEuOSAyIDIgMmgxNnYtMkgzVjV6bTE0IDh2LTJjMC0xLjExLS45LTItMi0yaC0yVjdoNFY1aC02djZoNHYyaC00djJoNGMxLjEgMCAyLS44OSAyLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLTYiPjxwYXRoIGQ9Ik0zIDVIMXYxNmMwIDEuMS45IDIgMiAyaDE2di0ySDNWNXptMTgtNEg3Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgMTZIN1YzaDE0djE0em0tOC0yaDJjMS4xIDAgMi0uODkgMi0ydi0yYzAtMS4xMS0uOS0yLTItMmgtMlY3aDRWNWgtNGMtMS4xIDAtMiAuODktMiAydjZjMCAxLjExLjkgMiAyIDJ6bTAtNGgydjJoLTJ2LTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLTciPjxwYXRoIGQ9Ik0zIDVIMXYxNmMwIDEuMS45IDIgMiAyaDE2di0ySDNWNXptMTgtNEg3Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgMTZIN1YzaDE0djE0em0tOC0ybDQtOFY1aC02djJoNGwtNCA4aDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLTgiPjxwYXRoIGQ9Ik0zIDVIMXYxNmMwIDEuMS45IDIgMiAyaDE2di0ySDNWNXptMTgtNEg3Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgMTZIN1YzaDE0djE0em0tOC0yaDJjMS4xIDAgMi0uODkgMi0ydi0xLjVjMC0uODMtLjY3LTEuNS0xLjUtMS41LjgzIDAgMS41LS42NyAxLjUtMS41VjdjMC0xLjExLS45LTItMi0yaC0yYy0xLjEgMC0yIC44OS0yIDJ2MS41YzAgLjgzLjY3IDEuNSAxLjUgMS41LS44MyAwLTEuNS42Ny0xLjUgMS41VjEzYzAgMS4xMS45IDIgMiAyem0wLThoMnYyaC0yVjd6bTAgNGgydjJoLTJ2LTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLTkiPjxwYXRoIGQ9Ik0zIDVIMXYxNmMwIDEuMS45IDIgMiAyaDE2di0ySDNWNXptMTgtNEg3Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgMTZIN1YzaDE0djE0ek0xNSA1aC0yYy0xLjEgMC0yIC44OS0yIDJ2MmMwIDEuMTEuOSAyIDIgMmgydjJoLTR2Mmg0YzEuMSAwIDItLjg5IDItMlY3YzAtMS4xMS0uOS0yLTItMnptMCA0aC0yVjdoMnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbHRlci05LXBsdXMiPjxwYXRoIGQ9Ik0zIDVIMXYxNmMwIDEuMS45IDIgMiAyaDE2di0ySDNWNXptMTEgN1Y4YzAtMS4xMS0uOS0yLTItMmgtMWMtMS4xIDAtMiAuODktMiAydjFjMCAxLjExLjkgMiAyIDJoMXYxSDl2MmgzYzEuMSAwIDItLjg5IDItMnptLTMtM1Y4aDF2MWgtMXptMTAtOEg3Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgOGgtMlY3aC0ydjJoLTJ2MmgydjJoMnYtMmgydjZIN1YzaDE0djZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLWItYW5kLXciPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNmwtNy04djhINWw3LThWNWg3djE0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbHRlci1jZW50ZXItZm9jdXMiPjxwYXRoIGQ9Ik01IDE1SDN2NGMwIDEuMS45IDIgMiAyaDR2LTJINXYtNHpNNSA1aDRWM0g1Yy0xLjEgMC0yIC45LTIgMnY0aDJWNXptMTQtMmgtNHYyaDR2NGgyVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTZoLTR2Mmg0YzEuMSAwIDItLjkgMi0ydi00aC0ydjR6TTEyIDljLTEuNjYgMC0zIDEuMzQtMyAzczEuMzQgMyAzIDMgMy0xLjM0IDMtMy0xLjM0LTMtMy0zeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbHRlci1kcmFtYSI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYxIDUuNjQgNS4zNiA4LjA0IDIuMzUgOC4zNiAwIDEwLjkgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTkgMThINmMtMi4yMSAwLTQtMS43OS00LTRzMS43OS00IDQtNCA0IDEuNzkgNCA0aDJjMC0yLjc2LTEuODYtNS4wOC00LjQtNS43OEM4LjYxIDYuODggMTAuMiA2IDEyIDZjMy4wMyAwIDUuNSAyLjQ3IDUuNSA1LjV2LjVIMTljMS42NSAwIDMgMS4zNSAzIDNzLTEuMzUgMy0zIDN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLWZyYW1lcyI+PHBhdGggZD0iTTIwIDRoLTRsLTQtNC00IDRINGMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDE2SDRWNmg0LjUybDMuNTItMy41TDE1LjUyIDZIMjB2MTR6TTE4IDhINnYxMGgxMiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbHRlci1oZHIiPjxwYXRoIGQ9Ik0xNCA2bC0zLjc1IDUgMi44NSAzLjgtMS42IDEuMkM5LjgxIDEzLjc1IDcgMTAgNyAxMGwtNiA4aDIyTDE0IDZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLW5vbmUiPjxwYXRoIGQ9Ik0zIDVIMXYxNmMwIDEuMS45IDIgMiAyaDE2di0ySDNWNXptMTgtNEg3Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgMTZIN1YzaDE0djE0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbHRlci10aWx0LXNoaWZ0Ij48cGF0aCBkPSJNMTEgNC4wN1YyLjA1Yy0yLjAxLjItMy44NCAxLTUuMzIgMi4yMUw3LjEgNS42OWMxLjExLS44NiAyLjQ0LTEuNDQgMy45LTEuNjJ6bTcuMzIuMTlDMTYuODQgMy4wNSAxNS4wMSAyLjI1IDEzIDIuMDV2Mi4wMmMxLjQ2LjE4IDIuNzkuNzYgMy45IDEuNjJsMS40Mi0xLjQzek0xOS45MyAxMWgyLjAyYy0uMi0yLjAxLTEtMy44NC0yLjIxLTUuMzJMMTguMzEgNy4xYy44NiAxLjExIDEuNDQgMi40NCAxLjYyIDMuOXpNNS42OSA3LjFMNC4yNiA1LjY4QzMuMDUgNy4xNiAyLjI1IDguOTkgMi4wNSAxMWgyLjAyYy4xOC0xLjQ2Ljc2LTIuNzkgMS42Mi0zLjl6TTQuMDcgMTNIMi4wNWMuMiAyLjAxIDEgMy44NCAyLjIxIDUuMzJsMS40My0xLjQzYy0uODYtMS4xLTEuNDQtMi40My0xLjYyLTMuODl6TTE1IDEyYzAtMS42Ni0xLjM0LTMtMy0zcy0zIDEuMzQtMyAzIDEuMzQgMyAzIDMgMy0xLjM0IDMtM3ptMy4zMSA0LjlsMS40MyAxLjQzYzEuMjEtMS40OCAyLjAxLTMuMzIgMi4yMS01LjMyaC0yLjAyYy0uMTggMS40NS0uNzYgMi43OC0xLjYyIDMuODl6TTEzIDE5LjkzdjIuMDJjMi4wMS0uMiAzLjg0LTEgNS4zMi0yLjIxbC0xLjQzLTEuNDNjLTEuMS44Ni0yLjQzIDEuNDQtMy44OSAxLjYyem0tNy4zMi0uMTlDNy4xNiAyMC45NSA5IDIxLjc1IDExIDIxLjk1di0yLjAyYy0xLjQ2LS4xOC0yLjc5LS43Ni0zLjktMS42MmwtMS40MiAxLjQzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbHRlci12aW50YWdlIj48cGF0aCBkPSJNMTguNyAxMi40Yy0uMjgtLjE2LS41Ny0uMjktLjg2LS40LjI5LS4xMS41OC0uMjQuODYtLjQgMS45Mi0xLjExIDIuOTktMy4xMiAzLTUuMTktMS43OS0xLjAzLTQuMDctMS4xMS02IDAtLjI4LjE2LS41NC4zNS0uNzguNTQuMDUtLjMxLjA4LS42My4wOC0uOTUgMC0yLjIyLTEuMjEtNC4xNS0zLTUuMTlDMTAuMjEgMS44NSA5IDMuNzggOSA2YzAgLjMyLjAzLjY0LjA4Ljk1LS4yNC0uMi0uNS0uMzktLjc4LS41NS0xLjkyLTEuMTEtNC4yLTEuMDMtNiAwIDAgMi4wNyAxLjA3IDQuMDggMyA1LjE5LjI4LjE2LjU3LjI5Ljg2LjQtLjI5LjExLS41OC4yNC0uODYuNC0xLjkyIDEuMTEtMi45OSAzLjEyLTMgNS4xOSAxLjc5IDEuMDMgNC4wNyAxLjExIDYgMCAuMjgtLjE2LjU0LS4zNS43OC0uNTQtLjA1LjMyLS4wOC42NC0uMDguOTYgMCAyLjIyIDEuMjEgNC4xNSAzIDUuMTkgMS43OS0xLjA0IDMtMi45NyAzLTUuMTkgMC0uMzItLjAzLS42NC0uMDgtLjk1LjI0LjIuNS4zOC43OC41NCAxLjkyIDEuMTEgNC4yIDEuMDMgNiAwLS4wMS0yLjA3LTEuMDgtNC4wOC0zLTUuMTl6TTEyIDE2Yy0yLjIxIDAtNC0xLjc5LTQtNHMxLjc5LTQgNC00IDQgMS43OSA0IDQtMS43OSA0LTQgNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJmbGFyZSI+PHBhdGggZD0iTTcgMTFIMXYyaDZ2LTJ6bTIuMTctMy4yNEw3LjA1IDUuNjQgNS42NCA3LjA1bDIuMTIgMi4xMiAxLjQxLTEuNDF6TTEzIDFoLTJ2NmgyVjF6bTUuMzYgNi4wNWwtMS40MS0xLjQxLTIuMTIgMi4xMiAxLjQxIDEuNDEgMi4xMi0yLjEyek0xNyAxMXYyaDZ2LTJoLTZ6bS01LTJjLTEuNjYgMC0zIDEuMzQtMyAzczEuMzQgMyAzIDMgMy0xLjM0IDMtMy0xLjM0LTMtMy0zem0yLjgzIDcuMjRsMi4xMiAyLjEyIDEuNDEtMS40MS0yLjEyLTIuMTItMS40MSAxLjQxem0tOS4xOS43MWwxLjQxIDEuNDEgMi4xMi0yLjEyLTEuNDEtMS40MS0yLjEyIDIuMTJ6TTExIDIzaDJ2LTZoLTJ2NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmbGFzaC1hdXRvIj48cGF0aCBkPSJNMyAydjEyaDN2OWw3LTEySDlsNC05SDN6bTE2IDBoLTJsLTMuMiA5aDEuOWwuNy0yaDMuMmwuNyAyaDEuOUwxOSAyem0tMi4xNSA1LjY1TDE4IDRsMS4xNSAzLjY1aC0yLjN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmxhc2gtb2ZmIj48cGF0aCBkPSJNMy4yNyAzTDIgNC4yN2w1IDVWMTNoM3Y5bDMuNTgtNi4xNEwxNy43MyAyMCAxOSAxOC43MyAzLjI3IDN6TTE3IDEwaC00bDQtOEg3djIuMThsOC40NiA4LjQ2TDE3IDEweiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZsYXNoLW9uIj48cGF0aCBkPSJNNyAydjExaDN2OWw3LTEyaC00bDQtOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJmbGlwIj48cGF0aCBkPSJNMTUgMjFoMnYtMmgtMnYyem00LTEyaDJWN2gtMnYyek0zIDV2MTRjMCAxLjEuOSAyIDIgMmg0di0ySDVWNWg0VjNINWMtMS4xIDAtMiAuOS0yIDJ6bTE2LTJ2MmgyYzAtMS4xLS45LTItMi0yem0tOCAyMGgyVjFoLTJ2MjJ6bTgtNmgydi0yaC0ydjJ6TTE1IDVoMlYzaC0ydjJ6bTQgOGgydi0yaC0ydjJ6bTAgOGMxLjEgMCAyLS45IDItMmgtMnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImdyYWRpZW50Ij48cGF0aCBkPSJNMTEgOWgydjJoLTJ6bS0yIDJoMnYySDl6bTQgMGgydjJoLTJ6bTItMmgydjJoLTJ6TTcgOWgydjJIN3ptMTItNkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6TTkgMThIN3YtMmgydjJ6bTQgMGgtMnYtMmgydjJ6bTQgMGgtMnYtMmgydjJ6bTItN2gtMnYyaDJ2MmgtMnYtMmgtMnYyaC0ydi0yaC0ydjJIOXYtMkg3djJINXYtMmgydi0ySDVWNWgxNHY2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImdyYWluIj48cGF0aCBkPSJNMTAgMTJjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yek02IDhjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0wIDhjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0xMi04YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptLTQgOGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTQtNGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bS00LTRjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0tNC00Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJncmlkLW9mZiI+PHBhdGggZD0iTTggNHYxLjQ1bDIgMlY0aDR2NGgtMy40NWwyIDJIMTR2MS40NWwyIDJWMTBoNHY0aC0zLjQ1bDIgMkgyMHYxLjQ1bDIgMlY0YzAtMS4xLS45LTItMi0ySDQuNTVsMiAySDh6bTggMGg0djRoLTRWNHpNMS4yNyAxLjI3TDAgMi41NWwyIDJWMjBjMCAxLjEuOSAyIDIgMmgxNS40NmwyIDIgMS4yNy0xLjI3TDEuMjcgMS4yN3pNMTAgMTIuNTVMMTEuNDUgMTRIMTB2LTEuNDV6bS02LTZMNS40NSA4SDRWNi41NXpNOCAyMEg0di00aDR2NHptMC02SDR2LTRoMy40NWwuNTUuNTVWMTR6bTYgNmgtNHYtNGgzLjQ1bC41NS41NFYyMHptMiAwdi0xLjQ2TDE3LjQ2IDIwSDE2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImdyaWQtb24iPjxwYXRoIGQ9Ik0yMCAySDRjLTEuMSAwLTIgLjktMiAydjE2YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnpNOCAyMEg0di00aDR2NHptMC02SDR2LTRoNHY0em0wLTZINFY0aDR2NHptNiAxMmgtNHYtNGg0djR6bTAtNmgtNHYtNGg0djR6bTAtNmgtNFY0aDR2NHptNiAxMmgtNHYtNGg0djR6bTAtNmgtNHYtNGg0djR6bTAtNmgtNFY0aDR2NHoiPjwvcGF0aD48L2c+CjxnIGlkPSJoZHItb2ZmIj48cGF0aCBkPSJNMTcuNSAxNXYtMmgxLjFsLjkgMkgyMWwtLjktMi4xYy41LS4yLjktLjguOS0xLjR2LTFjMC0uOC0uNy0xLjUtMS41LTEuNUgxNnY0LjlsMS4xIDEuMWguNHptMC00LjVoMnYxaC0ydi0xem0tNC41IDB2LjRsMS41IDEuNXYtMS45YzAtLjgtLjctMS41LTEuNS0xLjVoLTEuOWwxLjUgMS41aC40em0tMy41LTFsLTctNy0xLjEgMUw2LjkgOWgtLjR2MmgtMlY5SDN2NmgxLjV2LTIuNWgyVjE1SDh2LTQuOWwxLjUgMS41VjE1aDMuNGw3LjYgNy42IDEuMS0xLjEtMTIuMS0xMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJoZHItb24iPjxwYXRoIGQ9Ik0yMSAxMS41di0xYzAtLjgtLjctMS41LTEuNS0xLjVIMTZ2NmgxLjV2LTJoMS4xbC45IDJIMjFsLS45LTIuMWMuNS0uMy45LS44LjktMS40em0tMS41IDBoLTJ2LTFoMnYxem0tMTMtLjVoLTJWOUgzdjZoMS41di0yLjVoMlYxNUg4VjlINi41djJ6TTEzIDlIOS41djZIMTNjLjggMCAxLjUtLjcgMS41LTEuNXYtM2MwLS44LS43LTEuNS0xLjUtMS41em0wIDQuNWgtMnYtM2gydjN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaGRyLXN0cm9uZyI+PHBhdGggZD0iTTE3IDZjLTMuMzEgMC02IDIuNjktNiA2czIuNjkgNiA2IDYgNi0yLjY5IDYtNi0yLjY5LTYtNi02ek01IDhjLTIuMjEgMC00IDEuNzktNCA0czEuNzkgNCA0IDQgNC0xLjc5IDQtNC0xLjc5LTQtNC00em0wIDZjLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imhkci13ZWFrIj48cGF0aCBkPSJNNSA4Yy0yLjIxIDAtNCAxLjc5LTQgNHMxLjc5IDQgNCA0IDQtMS43OSA0LTQtMS43OS00LTQtNHptMTItMmMtMy4zMSAwLTYgMi42OS02IDZzMi42OSA2IDYgNiA2LTIuNjkgNi02LTIuNjktNi02LTZ6bTAgMTBjLTIuMjEgMC00LTEuNzktNC00czEuNzktNCA0LTQgNCAxLjc5IDQgNC0xLjc5IDQtNCA0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImhlYWxpbmciPjxwYXRoIGQ9Ik0xNy43MyAxMi4wMmwzLjk4LTMuOThjLjM5LS4zOS4zOS0xLjAyIDAtMS40MWwtNC4zNC00LjM0Yy0uMzktLjM5LTEuMDItLjM5LTEuNDEgMGwtMy45OCAzLjk4TDggMi4yOUM3LjggMi4xIDcuNTUgMiA3LjI5IDJjLS4yNSAwLS41MS4xLS43LjI5TDIuMjUgNi42M2MtLjM5LjM5LS4zOSAxLjAyIDAgMS40MWwzLjk4IDMuOThMMi4yNSAxNmMtLjM5LjM5LS4zOSAxLjAyIDAgMS40MWw0LjM0IDQuMzRjLjM5LjM5IDEuMDIuMzkgMS40MSAwbDMuOTgtMy45OCAzLjk4IDMuOThjLjIuMi40NS4yOS43MS4yOS4yNiAwIC41MS0uMS43MS0uMjlsNC4zNC00LjM0Yy4zOS0uMzkuMzktMS4wMiAwLTEuNDFsLTMuOTktMy45OHpNMTIgOWMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0tNC43MSAxLjk2TDMuNjYgNy4zNGwzLjYzLTMuNjMgMy42MiAzLjYyLTMuNjIgMy42M3pNMTAgMTNjLS41NSAwLTEtLjQ1LTEtMXMuNDUtMSAxLTEgMSAuNDUgMSAxLS40NSAxLTEgMXptMiAyYy0uNTUgMC0xLS40NS0xLTFzLjQ1LTEgMS0xIDEgLjQ1IDEgMS0uNDUgMS0xIDF6bTItNGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0yLjY2IDkuMzRsLTMuNjMtMy42MiAzLjYzLTMuNjMgMy42MiAzLjYyLTMuNjIgMy42M3oiPjwvcGF0aD48L2c+CjxnIGlkPSJpbWFnZSI+PHBhdGggZD0iTTIxIDE5VjVjMC0xLjEtLjktMi0yLTJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnpNOC41IDEzLjVsMi41IDMuMDFMMTQuNSAxMmw0LjUgNkg1bDMuNS00LjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaW1hZ2UtYXNwZWN0LXJhdGlvIj48cGF0aCBkPSJNMTYgMTBoLTJ2Mmgydi0yem0wIDRoLTJ2Mmgydi0yem0tOC00SDZ2Mmgydi0yem00IDBoLTJ2Mmgydi0yem04LTZINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDE0SDRWNmgxNnYxMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJpc28iPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNNS41IDcuNWgydi0ySDl2MmgyVjlIOXYySDcuNVY5aC0yVjcuNXpNMTkgMTlINUwxOSA1djE0em0tMi0ydi0xLjVoLTVWMTdoNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJsYW5kc2NhcGUiPjxwYXRoIGQ9Ik0xNCA2bC0zLjc1IDUgMi44NSAzLjgtMS42IDEuMkM5LjgxIDEzLjc1IDcgMTAgNyAxMGwtNiA4aDIyTDE0IDZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibGVhay1hZGQiPjxwYXRoIGQ9Ik02IDNIM3YzYzEuNjYgMCAzLTEuMzQgMy0zem04IDBoLTJjMCA0Ljk3LTQuMDMgOS05IDl2MmM2LjA4IDAgMTEtNC45MyAxMS0xMXptLTQgMEg4YzAgMi43Ni0yLjI0IDUtNSA1djJjMy44NyAwIDctMy4xMyA3LTd6bTAgMThoMmMwLTQuOTcgNC4wMy05IDktOXYtMmMtNi4wNyAwLTExIDQuOTMtMTEgMTF6bTggMGgzdi0zYy0xLjY2IDAtMyAxLjM0LTMgM3ptLTQgMGgyYzAtMi43NiAyLjI0LTUgNS01di0yYy0zLjg3IDAtNyAzLjEzLTcgN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJsZWFrLXJlbW92ZSI+PHBhdGggZD0iTTEwIDNIOGMwIC4zNy0uMDQuNzItLjEyIDEuMDZsMS41OSAxLjU5QzkuODEgNC44NCAxMCAzLjk0IDEwIDN6TTMgNC4yN2wyLjg0IDIuODRDNS4wMyA3LjY3IDQuMDYgOCAzIDh2MmMxLjYxIDAgMy4wOS0uNTUgNC4yNy0xLjQ2TDguNyA5Ljk3QzcuMTQgMTEuMjQgNS4xNiAxMiAzIDEydjJjMi43MSAwIDUuMTktLjk5IDcuMTEtMi42MmwyLjUgMi41QzEwLjk5IDE1LjgxIDEwIDE4LjI5IDEwIDIxaDJjMC0yLjE2Ljc2LTQuMTQgMi4wMy01LjY5bDEuNDMgMS40M0MxNC41NSAxNy45MSAxNCAxOS4zOSAxNCAyMWgyYzAtMS4wNi4zMy0yLjAzLjg5LTIuODRMMTkuNzMgMjEgMjEgMTkuNzMgNC4yNyAzIDMgNC4yN3pNMTQgM2gtMmMwIDEuNS0uMzcgMi45MS0xLjAyIDQuMTZsMS40NiAxLjQ2QzEzLjQyIDYuOTggMTQgNS4wNiAxNCAzem01Ljk0IDEzLjEyYy4zNC0uMDguNjktLjEyIDEuMDYtLjEydi0yYy0uOTQgMC0xLjg0LjE5LTIuNjYuNTJsMS42IDEuNnptLTQuNTYtNC41NmwxLjQ2IDEuNDZDMTguMDkgMTIuMzcgMTkuNSAxMiAyMSAxMnYtMmMtMi4wNiAwLTMuOTguNTgtNS42MiAxLjU2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImxlbnMiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImxpbmtlZC1jYW1lcmEiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTQiIHI9IjMuMiI+PC9jaXJjbGU+PHBhdGggZD0iTTE2IDMuMzNjMi41OCAwIDQuNjcgMi4wOSA0LjY3IDQuNjdIMjJjMC0zLjMxLTIuNjktNi02LTZ2MS4zM00xNiA2YzEuMTEgMCAyIC44OSAyIDJoMS4zM2MwLTEuODQtMS40OS0zLjMzLTMuMzMtMy4zM1Y2Ij48L3BhdGg+PHBhdGggZD0iTTE3IDljMC0xLjExLS44OS0yLTItMlY0SDlMNy4xNyA2SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWOWgtNXptLTUgMTBjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imxvb2tzIj48cGF0aCBkPSJNMTIgMTBjLTMuODYgMC03IDMuMTQtNyA3aDJjMC0yLjc2IDIuMjQtNSA1LTVzNSAyLjI0IDUgNWgyYzAtMy44Ni0zLjE0LTctNy03em0wLTRDNS45MyA2IDEgMTAuOTMgMSAxN2gyYzAtNC45NiA0LjA0LTkgOS05czkgNC4wNCA5IDloMmMwLTYuMDctNC45My0xMS0xMS0xMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJsb29rcy0zIj48cGF0aCBkPSJNMTkuMDEgM2gtMTRjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTQgNy41YzAgLjgzLS42NyAxLjUtMS41IDEuNS44MyAwIDEuNS42NyAxLjUgMS41VjE1YzAgMS4xMS0uOSAyLTIgMmgtNHYtMmg0di0yaC0ydi0yaDJWOWgtNFY3aDRjMS4xIDAgMiAuODkgMiAydjEuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJsb29rcy00Ij48cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS00IDE0aC0ydi00SDlWN2gydjRoMlY3aDJ2MTB6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibG9va3MtNSI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNCA2aC00djJoMmMxLjEgMCAyIC44OSAyIDJ2MmMwIDEuMTEtLjkgMi0yIDJIOXYtMmg0di0ySDlWN2g2djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibG9va3MtNiI+PHBhdGggZD0iTTExIDE1aDJ2LTJoLTJ2MnptOC0xMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS00IDZoLTR2MmgyYzEuMSAwIDIgLjg5IDIgMnYyYzAgMS4xMS0uOSAyLTIgMmgtMmMtMS4xIDAtMi0uODktMi0yVjljMC0xLjExLjktMiAyLTJoNHYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imxvb2tzLW9uZSI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNSAxNGgtMlY5aC0yVjdoNHYxMHoiPjwvcGF0aD48L2c+CjxnIGlkPSJsb29rcy10d28iPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTQgOGMwIDEuMTEtLjkgMi0yIDJoLTJ2Mmg0djJIOXYtNGMwLTEuMTEuOS0yIDItMmgyVjlIOVY3aDRjMS4xIDAgMiAuODkgMiAydjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibG91cGUiPjxwYXRoIGQ9Ik0xMyA3aC0ydjRIN3YyaDR2NGgydi00aDR2LTJoLTRWN3ptLTEtNUM2LjQ5IDIgMiA2LjQ5IDIgMTJzNC40OSAxMCAxMCAxMGg4YzEuMSAwIDItLjkgMi0ydi04YzAtNS41MS00LjQ5LTEwLTEwLTEwem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJtb25vY2hyb21lLXBob3RvcyI+PHBhdGggZD0iTTIwIDVoLTMuMkwxNSAzSDlMNy4yIDVINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yem0wIDE0aC04di0xYy0yLjggMC01LTIuMi01LTVzMi4yLTUgNS01VjdoOHYxMnptLTMtNmMwLTIuOC0yLjItNS01LTV2MS44YzEuOCAwIDMuMiAxLjQgMy4yIDMuMnMtMS40IDMuMi0zLjIgMy4yVjE4YzIuOCAwIDUtMi4yIDUtNXptLTguMiAwYzAgMS44IDEuNCAzLjIgMy4yIDMuMlY5LjhjLTEuOCAwLTMuMiAxLjQtMy4yIDMuMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJtb3ZpZS1jcmVhdGlvbiI+PHBhdGggZD0iTTE4IDRsMiA0aC0zbC0yLTRoLTJsMiA0aC0zbC0yLTRIOGwyIDRIN0w1IDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNGgtNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJtb3ZpZS1maWx0ZXIiPjxwYXRoIGQ9Ik0xOCA0bDIgM2gtM2wtMi0zaC0ybDIgM2gtM2wtMi0zSDhsMiAzSDdMNSA0SDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjRoLTR6bS02Ljc1IDExLjI1TDEwIDE4bC0xLjI1LTIuNzVMNiAxNGwyLjc1LTEuMjVMMTAgMTBsMS4yNSAyLjc1TDE0IDE0bC0yLjc1IDEuMjV6bTUuNjktMy4zMUwxNiAxNGwtLjk0LTIuMDZMMTMgMTFsMi4wNi0uOTRMMTYgOGwuOTQgMi4wNkwxOSAxMWwtMi4wNi45NHoiPjwvcGF0aD48L2c+CjxnIGlkPSJtdXNpYy1ub3RlIj48cGF0aCBkPSJNMTIgM3YxMC41NWMtLjU5LS4zNC0xLjI3LS41NS0yLS41NS0yLjIxIDAtNCAxLjc5LTQgNHMxLjc5IDQgNCA0IDQtMS43OSA0LTRWN2g0VjNoLTZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibmF0dXJlIj48cGF0aCBkPSJNMTMgMTYuMTJjMy40Ny0uNDEgNi4xNy0zLjM2IDYuMTctNi45NSAwLTMuODctMy4xMy03LTctN3MtNyAzLjEzLTcgN2MwIDMuNDcgMi41MiA2LjM0IDUuODMgNi44OVYyMEg1djJoMTR2LTJoLTZ2LTMuODh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibmF0dXJlLXBlb3BsZSI+PHBhdGggZD0iTTIyLjE3IDkuMTdjMC0zLjg3LTMuMTMtNy03LTdzLTcgMy4xMy03IDdjMCAzLjQ3IDIuNTIgNi4zNCA1LjgzIDYuODlWMjBINnYtM2gxdi00YzAtLjU1LS40NS0xLTEtMUgzYy0uNTUgMC0xIC40NS0xIDF2NGgxdjVoMTZ2LTJoLTN2LTMuODhjMy40Ny0uNDEgNi4xNy0zLjM2IDYuMTctNi45NXpNNC41IDExYy44MyAwIDEuNS0uNjcgMS41LTEuNVM1LjMzIDggNC41IDggMyA4LjY3IDMgOS41IDMuNjcgMTEgNC41IDExeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im5hdmlnYXRlLWJlZm9yZSI+PHBhdGggZD0iTTE1LjQxIDcuNDFMMTQgNmwtNiA2IDYgNiAxLjQxLTEuNDFMMTAuODMgMTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibmF2aWdhdGUtbmV4dCI+PHBhdGggZD0iTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBhbGV0dGUiPjxwYXRoIGQ9Ik0xMiAzYy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAzIDkgOSA5Yy44MyAwIDEuNS0uNjcgMS41LTEuNSAwLS4zOS0uMTUtLjc0LS4zOS0xLjAxLS4yMy0uMjYtLjM4LS42MS0uMzgtLjk5IDAtLjgzLjY3LTEuNSAxLjUtMS41SDE2YzIuNzYgMCA1LTIuMjQgNS01IDAtNC40Mi00LjAzLTgtOS04em0tNS41IDljLS44MyAwLTEuNS0uNjctMS41LTEuNVM1LjY3IDkgNi41IDkgOCA5LjY3IDggMTAuNSA3LjMzIDEyIDYuNSAxMnptMy00QzguNjcgOCA4IDcuMzMgOCA2LjVTOC42NyA1IDkuNSA1czEuNS42NyAxLjUgMS41UzEwLjMzIDggOS41IDh6bTUgMGMtLjgzIDAtMS41LS42Ny0xLjUtMS41UzEzLjY3IDUgMTQuNSA1czEuNS42NyAxLjUgMS41UzE1LjMzIDggMTQuNSA4em0zIDRjLS44MyAwLTEuNS0uNjctMS41LTEuNVMxNi42NyA5IDE3LjUgOXMxLjUuNjcgMS41IDEuNS0uNjcgMS41LTEuNSAxLjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGFub3JhbWEiPjxwYXRoIGQ9Ik0yMyAxOFY2YzAtMS4xLS45LTItMi0ySDNjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJ6TTguNSAxMi41bDIuNSAzLjAxTDE0LjUgMTFsNC41IDZINWwzLjUtNC41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBhbm9yYW1hLWZpc2gtZXllIj48cGF0aCBkPSJNMTIgMkM2LjQ3IDIgMiA2LjQ3IDIgMTJzNC40NyAxMCAxMCAxMCAxMC00LjQ3IDEwLTEwUzE3LjUzIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGFub3JhbWEtaG9yaXpvbnRhbCI+PHBhdGggZD0iTTIwIDYuNTR2MTAuOTFjLTIuNi0uNzctNS4yOC0xLjE2LTgtMS4xNi0yLjcyIDAtNS40LjM5LTggMS4xNlY2LjU0YzIuNi43NyA1LjI4IDEuMTYgOCAxLjE2IDIuNzIuMDEgNS40LS4zOCA4LTEuMTZNMjEuNDMgNGMtLjEgMC0uMi4wMi0uMzEuMDZDMTguMTggNS4xNiAxNS4wOSA1LjcgMTIgNS43Yy0zLjA5IDAtNi4xOC0uNTUtOS4xMi0xLjY0LS4xMS0uMDQtLjIyLS4wNi0uMzEtLjA2LS4zNCAwLS41Ny4yMy0uNTcuNjN2MTQuNzVjMCAuMzkuMjMuNjIuNTcuNjIuMSAwIC4yLS4wMi4zMS0uMDYgMi45NC0xLjEgNi4wMy0xLjY0IDkuMTItMS42NCAzLjA5IDAgNi4xOC41NSA5LjEyIDEuNjQuMTEuMDQuMjEuMDYuMzEuMDYuMzMgMCAuNTctLjIzLjU3LS42M1Y0LjYzYzAtLjQtLjI0LS42My0uNTctLjYzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBhbm9yYW1hLXZlcnRpY2FsIj48cGF0aCBkPSJNMTkuOTQgMjEuMTJjLTEuMS0yLjk0LTEuNjQtNi4wMy0xLjY0LTkuMTIgMC0zLjA5LjU1LTYuMTggMS42NC05LjEyLjA0LS4xMS4wNi0uMjIuMDYtLjMxIDAtLjM0LS4yMy0uNTctLjYzLS41N0g0LjYzYy0uNCAwLS42My4yMy0uNjMuNTcgMCAuMS4wMi4yLjA2LjMxQzUuMTYgNS44MiA1LjcxIDguOTEgNS43MSAxMmMwIDMuMDktLjU1IDYuMTgtMS42NCA5LjEyLS4wNS4xMS0uMDcuMjItLjA3LjMxIDAgLjMzLjIzLjU3LjYzLjU3aDE0Ljc1Yy4zOSAwIC42My0uMjQuNjMtLjU3LS4wMS0uMS0uMDMtLjItLjA3LS4zMXpNNi41NCAyMGMuNzctMi42IDEuMTYtNS4yOCAxLjE2LTggMC0yLjcyLS4zOS01LjQtMS4xNi04aDEwLjkxYy0uNzcgMi42LTEuMTYgNS4yOC0xLjE2IDggMCAyLjcyLjM5IDUuNCAxLjE2IDhINi41NHoiPjwvcGF0aD48L2c+CjxnIGlkPSJwYW5vcmFtYS13aWRlLWFuZ2xlIj48cGF0aCBkPSJNMTIgNmMyLjQ1IDAgNC43MS4yIDcuMjkuNjQuNDcgMS43OC43MSAzLjU4LjcxIDUuMzYgMCAxLjc4LS4yNCAzLjU4LS43MSA1LjM2LTIuNTguNDQtNC44NC42NC03LjI5LjY0cy00LjcxLS4yLTcuMjktLjY0QzQuMjQgMTUuNTggNCAxMy43OCA0IDEyYzAtMS43OC4yNC0zLjU4LjcxLTUuMzZDNy4yOSA2LjIgOS41NSA2IDEyIDZtMC0yYy0yLjczIDAtNS4yMi4yNC03Ljk1LjcybC0uOTMuMTYtLjI1LjlDMi4yOSA3Ljg1IDIgOS45MyAyIDEycy4yOSA0LjE1Ljg3IDYuMjJsLjI1Ljg5LjkzLjE2YzIuNzMuNDkgNS4yMi43MyA3Ljk1LjczczUuMjItLjI0IDcuOTUtLjcybC45My0uMTYuMjUtLjg5Yy41OC0yLjA4Ljg3LTQuMTYuODctNi4yM3MtLjI5LTQuMTUtLjg3LTYuMjJsLS4yNS0uODktLjkzLS4xNkMxNy4yMiA0LjI0IDE0LjczIDQgMTIgNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJwaG90byI+PHBhdGggZD0iTTIxIDE5VjVjMC0xLjEtLjktMi0yLTJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnpNOC41IDEzLjVsMi41IDMuMDFMMTQuNSAxMmw0LjUgNkg1bDMuNS00LjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGhvdG8tYWxidW0iPjxwYXRoIGQ9Ik0xOCAySDZjLTEuMSAwLTIgLjktMiAydjE2YzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnpNNiA0aDV2OGwtMi41LTEuNUw2IDEyVjR6bTAgMTVsMy0zLjg2IDIuMTQgMi41OCAzLTMuODZMMTggMTlINnoiPjwvcGF0aD48L2c+CjxnIGlkPSJwaG90by1jYW1lcmEiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjMuMiI+PC9jaXJjbGU+PHBhdGggZD0iTTkgMkw3LjE3IDRINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yaC0zLjE3TDE1IDJIOXptMyAxNWMtMi43NiAwLTUtMi4yNC01LTVzMi4yNC01IDUtNSA1IDIuMjQgNSA1LTIuMjQgNS01IDV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGhvdG8tZmlsdGVyIj48cGF0aCBkPSJNMTkuMDIgMTB2OUg1VjVoOVYzSDUuMDJjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJ2LTloLTJ6TTE3IDEwbC45NC0yLjA2TDIwIDdsLTIuMDYtLjk0TDE3IDRsLS45NCAyLjA2TDE0IDdsMi4wNi45NHptLTMuNzUuNzVMMTIgOGwtMS4yNSAyLjc1TDggMTJsMi43NSAxLjI1TDEyIDE2bDEuMjUtMi43NUwxNiAxMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJwaG90by1saWJyYXJ5Ij48cGF0aCBkPSJNMjIgMTZWNGMwLTEuMS0uOS0yLTItMkg4Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yem0tMTEtNGwyLjAzIDIuNzFMMTYgMTFsNCA1SDhsMy00ek0yIDZ2MTRjMCAxLjEuOSAyIDIgMmgxNHYtMkg0VjZIMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJwaG90by1zaXplLXNlbGVjdC1hY3R1YWwiPjxwYXRoIGQ9Ik0yMSAzSDNDMiAzIDEgNCAxIDV2MTRjMCAxLjEuOSAyIDIgMmgxOGMxIDAgMi0xIDItMlY1YzAtMS0xLTItMi0yek01IDE3bDMuNS00LjUgMi41IDMuMDFMMTQuNSAxMWw0LjUgNkg1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBob3RvLXNpemUtc2VsZWN0LWxhcmdlIj48cGF0aCBkPSJNMjEgMTVoMnYyaC0ydi0yem0wLTRoMnYyaC0ydi0yem0yIDhoLTJ2MmMxIDAgMi0xIDItMnpNMTMgM2gydjJoLTJWM3ptOCA0aDJ2MmgtMlY3em0wLTR2MmgyYzAtMS0xLTItMi0yek0xIDdoMnYySDFWN3ptMTYtNGgydjJoLTJWM3ptMCAxNmgydjJoLTJ2LTJ6TTMgM0MyIDMgMSA0IDEgNWgyVjN6bTYgMGgydjJIOVYzek01IDNoMnYySDVWM3ptLTQgOHY4YzAgMS4xLjkgMiAyIDJoMTJWMTFIMXptMiA4bDIuNS0zLjIxIDEuNzkgMi4xNSAyLjUtMy4yMkwxMyAxOUgzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBob3RvLXNpemUtc2VsZWN0LXNtYWxsIj48cGF0aCBkPSJNMjMgMTVoLTJ2Mmgydi0yem0wLTRoLTJ2Mmgydi0yem0wIDhoLTJ2MmMxIDAgMi0xIDItMnpNMTUgM2gtMnYyaDJWM3ptOCA0aC0ydjJoMlY3em0tMi00djJoMmMwLTEtMS0yLTItMnpNMyAyMWg4di02SDF2NGMwIDEuMS45IDIgMiAyek0zIDdIMXYyaDJWN3ptMTIgMTJoLTJ2Mmgydi0yem00LTE2aC0ydjJoMlYzem0wIDE2aC0ydjJoMnYtMnpNMyAzQzIgMyAxIDQgMSA1aDJWM3ptMCA4SDF2Mmgydi0yem04LThIOXYyaDJWM3pNNyAzSDV2MmgyVjN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGljdHVyZS1hcy1wZGYiPjxwYXRoIGQ9Ik0yMCAySDhjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTguNSA3LjVjMCAuODMtLjY3IDEuNS0xLjUgMS41SDl2Mkg3LjVWN0gxMGMuODMgMCAxLjUuNjcgMS41IDEuNXYxem01IDJjMCAuODMtLjY3IDEuNS0xLjUgMS41aC0yLjVWN0gxNWMuODMgMCAxLjUuNjcgMS41IDEuNXYzem00LTNIMTl2MWgxLjVWMTFIMTl2MmgtMS41VjdoM3YxLjV6TTkgOS41aDF2LTFIOXYxek00IDZIMnYxNGMwIDEuMS45IDIgMiAyaDE0di0ySDRWNnptMTAgNS41aDF2LTNoLTF2M3oiPjwvcGF0aD48L2c+CjxnIGlkPSJwb3J0cmFpdCI+PHBhdGggZD0iTTEyIDEyLjI1YzEuMjQgMCAyLjI1LTEuMDEgMi4yNS0yLjI1UzEzLjI0IDcuNzUgMTIgNy43NSA5Ljc1IDguNzYgOS43NSAxMHMxLjAxIDIuMjUgMi4yNSAyLjI1em00LjUgNGMwLTEuNS0zLTIuMjUtNC41LTIuMjVzLTQuNS43NS00LjUgMi4yNVYxN2g5di0uNzV6TTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDVWNWgxNHYxNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZW1vdmUtcmVkLWV5ZSI+PHBhdGggZD0iTTEyIDQuNUM3IDQuNSAyLjczIDcuNjEgMSAxMmMxLjczIDQuMzkgNiA3LjUgMTEgNy41czkuMjctMy4xMSAxMS03LjVjLTEuNzMtNC4zOS02LTcuNS0xMS03LjV6TTEyIDE3Yy0yLjc2IDAtNS0yLjI0LTUtNXMyLjI0LTUgNS01IDUgMi4yNCA1IDUtMi4yNCA1LTUgNXptMC04Yy0xLjY2IDAtMyAxLjM0LTMgM3MxLjM0IDMgMyAzIDMtMS4zNCAzLTMtMS4zNC0zLTMtM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJyb3RhdGUtOTAtZGVncmVlcy1jY3ciPjxwYXRoIGQ9Ik03LjM0IDYuNDFMLjg2IDEyLjlsNi40OSA2LjQ4IDYuNDktNi40OC02LjUtNi40OXpNMy42OSAxMi45bDMuNjYtMy42NkwxMSAxMi45bC0zLjY2IDMuNjYtMy42NS0zLjY2em0xNS42Ny02LjI2QzE3LjYxIDQuODggMTUuMyA0IDEzIDRWLjc2TDguNzYgNSAxMyA5LjI0VjZjMS43OSAwIDMuNTguNjggNC45NSAyLjA1IDIuNzMgMi43MyAyLjczIDcuMTcgMCA5LjlDMTYuNTggMTkuMzIgMTQuNzkgMjAgMTMgMjBjLS45NyAwLTEuOTQtLjIxLTIuODQtLjYxbC0xLjQ5IDEuNDlDMTAuMDIgMjEuNjIgMTEuNTEgMjIgMTMgMjJjMi4zIDAgNC42MS0uODggNi4zNi0yLjY0IDMuNTItMy41MSAzLjUyLTkuMjEgMC0xMi43MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJyb3RhdGUtbGVmdCI+PHBhdGggZD0iTTcuMTEgOC41M0w1LjcgNy4xMUM0LjggOC4yNyA0LjI0IDkuNjEgNC4wNyAxMWgyLjAyYy4xNC0uODcuNDktMS43MiAxLjAyLTIuNDd6TTYuMDkgMTNINC4wN2MuMTcgMS4zOS43MiAyLjczIDEuNjIgMy44OWwxLjQxLTEuNDJjLS41Mi0uNzUtLjg3LTEuNTktMS4wMS0yLjQ3em0xLjAxIDUuMzJjMS4xNi45IDIuNTEgMS40NCAzLjkgMS42MVYxNy45Yy0uODctLjE1LTEuNzEtLjQ5LTIuNDYtMS4wM0w3LjEgMTguMzJ6TTEzIDQuMDdWMUw4LjQ1IDUuNTUgMTMgMTBWNi4wOWMyLjg0LjQ4IDUgMi45NCA1IDUuOTFzLTIuMTYgNS40My01IDUuOTF2Mi4wMmMzLjk1LS40OSA3LTMuODUgNy03Ljkzcy0zLjA1LTcuNDQtNy03LjkzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJvdGF0ZS1yaWdodCI+PHBhdGggZD0iTTE1LjU1IDUuNTVMMTEgMXYzLjA3QzcuMDYgNC41NiA0IDcuOTIgNCAxMnMzLjA1IDcuNDQgNyA3Ljkzdi0yLjAyYy0yLjg0LS40OC01LTIuOTQtNS01LjkxczIuMTYtNS40MyA1LTUuOTFWMTBsNC41NS00LjQ1ek0xOS45MyAxMWMtLjE3LTEuMzktLjcyLTIuNzMtMS42Mi0zLjg5bC0xLjQyIDEuNDJjLjU0Ljc1Ljg4IDEuNiAxLjAyIDIuNDdoMi4wMnpNMTMgMTcuOXYyLjAyYzEuMzktLjE3IDIuNzQtLjcxIDMuOS0xLjYxbC0xLjQ0LTEuNDRjLS43NS41NC0xLjU5Ljg5LTIuNDYgMS4wM3ptMy44OS0yLjQybDEuNDIgMS40MWMuOS0xLjE2IDEuNDUtMi41IDEuNjItMy44OWgtMi4wMmMtLjE0Ljg3LS40OCAxLjcyLTEuMDIgMi40OHoiPjwvcGF0aD48L2c+CjxnIGlkPSJzbGlkZXNob3ciPjxwYXRoIGQ9Ik0xMCA4djhsNS00LTUtNHptOS01SDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkg1VjVoMTR2MTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3RyYWlnaHRlbiI+PHBhdGggZD0iTTIxIDZIM2MtMS4xIDAtMiAuOS0yIDJ2OGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bTAgMTBIM1Y4aDJ2NGgyVjhoMnY0aDJWOGgydjRoMlY4aDJ2NGgyVjhoMnY4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InN0eWxlIj48cGF0aCBkPSJNMi41MyAxOS42NWwxLjM0LjU2di05LjAzbC0yLjQzIDUuODZjLS40MSAxLjAyLjA4IDIuMTkgMS4wOSAyLjYxem0xOS41LTMuN0wxNy4wNyAzLjk4Yy0uMzEtLjc1LTEuMDQtMS4yMS0xLjgxLTEuMjMtLjI2IDAtLjUzLjA0LS43OS4xNUw3LjEgNS45NWMtLjc1LjMxLTEuMjEgMS4wMy0xLjIzIDEuOC0uMDEuMjcuMDQuNTQuMTUuOGw0Ljk2IDExLjk3Yy4zMS43NiAxLjA1IDEuMjIgMS44MyAxLjIzLjI2IDAgLjUyLS4wNS43Ny0uMTVsNy4zNi0zLjA1YzEuMDItLjQyIDEuNTEtMS41OSAxLjA5LTIuNnpNNy44OCA4Ljc1Yy0uNTUgMC0xLS40NS0xLTFzLjQ1LTEgMS0xIDEgLjQ1IDEgMS0uNDUgMS0xIDF6bS0yIDExYzAgMS4xLjkgMiAyIDJoMS40NWwtMy40NS04LjM0djYuMzR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3dpdGNoLWNhbWVyYSI+PHBhdGggZD0iTTIwIDRoLTMuMTdMMTUgMkg5TDcuMTcgNEg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bS01IDExLjVWMTNIOXYyLjVMNS41IDEyIDkgOC41VjExaDZWOC41bDMuNSAzLjUtMy41IDMuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJzd2l0Y2gtdmlkZW8iPjxwYXRoIGQ9Ik0xOCA5LjVWNmMwLS41NS0uNDUtMS0xLTFIM2MtLjU1IDAtMSAuNDUtMSAxdjEyYzAgLjU1LjQ1IDEgMSAxaDE0Yy41NSAwIDEtLjQ1IDEtMXYtMy41bDQgNHYtMTNsLTQgNHptLTUgNlYxM0g3djIuNUwzLjUgMTIgNyA4LjVWMTFoNlY4LjVsMy41IDMuNS0zLjUgMy41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRhZy1mYWNlcyI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6TTEyIDIwYy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHptMy41LTljLjgzIDAgMS41LS42NyAxLjUtMS41UzE2LjMzIDggMTUuNSA4IDE0IDguNjcgMTQgOS41cy42NyAxLjUgMS41IDEuNXptLTcgMGMuODMgMCAxLjUtLjY3IDEuNS0xLjVTOS4zMyA4IDguNSA4IDcgOC42NyA3IDkuNSA3LjY3IDExIDguNSAxMXptMy41IDYuNWMyLjMzIDAgNC4zMS0xLjQ2IDUuMTEtMy41SDYuODljLjggMi4wNCAyLjc4IDMuNSA1LjExIDMuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0ZXh0dXJlIj48cGF0aCBkPSJNMTkuNTEgMy4wOEwzLjA4IDE5LjUxYy4wOS4zNC4yNy42NS41MS45LjI1LjI0LjU2LjQyLjkuNTFMMjAuOTMgNC40OWMtLjE5LS42OS0uNzMtMS4yMy0xLjQyLTEuNDF6TTExLjg4IDNMMyAxMS44OHYyLjgzTDE0LjcxIDNoLTIuODN6TTUgM2MtMS4xIDAtMiAuOS0yIDJ2Mmw0LTRINXptMTQgMThjLjU1IDAgMS4wNS0uMjIgMS40MS0uNTkuMzctLjM2LjU5LS44Ni41OS0xLjQxdi0ybC00IDRoMnptLTkuNzEgMGgyLjgzTDIxIDEyLjEyVjkuMjlMOS4yOSAyMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0aW1lbGFwc2UiPjxwYXRoIGQ9Ik0xNi4yNCA3Ljc2QzE1LjA3IDYuNTkgMTMuNTQgNiAxMiA2djZsLTQuMjQgNC4yNGMyLjM0IDIuMzQgNi4xNCAyLjM0IDguNDkgMCAyLjM0LTIuMzQgMi4zNC02LjE0LS4wMS04LjQ4ek0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0aW1lciI+PHBhdGggZD0iTTE1IDFIOXYyaDZWMXptLTQgMTNoMlY4aC0ydjZ6bTguMDMtNi42MWwxLjQyLTEuNDJjLS40My0uNTEtLjktLjk5LTEuNDEtMS40MWwtMS40MiAxLjQyQzE2LjA3IDQuNzQgMTQuMTIgNCAxMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5IDktNC4wMyA5LTljMC0yLjEyLS43NC00LjA3LTEuOTctNS42MXpNMTIgMjBjLTMuODcgMC03LTMuMTMtNy03czMuMTMtNyA3LTcgNyAzLjEzIDcgNy0zLjEzIDctNyA3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRpbWVyLTEwIj48cGF0aCBkPSJNMCA3LjcyVjkuNGwzLTFWMThoMlY2aC0uMjVMMCA3Ljcyem0yMy43OCA2LjY1Yy0uMTQtLjI4LS4zNS0uNTMtLjYzLS43NC0uMjgtLjIxLS42MS0uMzktMS4wMS0uNTNzLS44NS0uMjctMS4zNS0uMzhjLS4zNS0uMDctLjY0LS4xNS0uODctLjIzLS4yMy0uMDgtLjQxLS4xNi0uNTUtLjI1LS4xNC0uMDktLjIzLS4xOS0uMjgtLjMtLjA1LS4xMS0uMDgtLjI0LS4wOC0uMzkgMC0uMTQuMDMtLjI4LjA5LS40MS4wNi0uMTMuMTUtLjI1LjI3LS4zNC4xMi0uMS4yNy0uMTguNDUtLjI0cy40LS4wOS42NC0uMDljLjI1IDAgLjQ3LjA0LjY2LjExLjE5LjA3LjM1LjE3LjQ4LjI5LjEzLjEyLjIyLjI2LjI5LjQyLjA2LjE2LjEuMzIuMS40OWgxLjk1YzAtLjM5LS4wOC0uNzUtLjI0LTEuMDktLjE2LS4zNC0uMzktLjYzLS42OS0uODgtLjMtLjI1LS42Ni0uNDQtMS4wOS0uNTlDMjEuNDkgOS4wNyAyMSA5IDIwLjQ2IDljLS41MSAwLS45OC4wNy0xLjM5LjIxLS40MS4xNC0uNzcuMzMtMS4wNi41Ny0uMjkuMjQtLjUxLjUyLS42Ny44NC0uMTYuMzItLjIzLjY1LS4yMyAxLjAxcy4wOC42OS4yMy45NmMuMTUuMjguMzYuNTIuNjQuNzMuMjcuMjEuNi4zOC45OC41My4zOC4xNC44MS4yNiAxLjI3LjM2LjM5LjA4LjcxLjE3Ljk1LjI2cy40My4xOS41Ny4yOWMuMTMuMS4yMi4yMi4yNy4zNC4wNS4xMi4wNy4yNS4wNy4zOSAwIC4zMi0uMTMuNTctLjQuNzctLjI3LjItLjY2LjI5LTEuMTcuMjktLjIyIDAtLjQzLS4wMi0uNjQtLjA4LS4yMS0uMDUtLjQtLjEzLS41Ni0uMjQtLjE3LS4xMS0uMy0uMjYtLjQxLS40NC0uMTEtLjE4LS4xNy0uNDEtLjE4LS42N2gtMS44OWMwIC4zNi4wOC43MS4yNCAxLjA1LjE2LjM0LjM5LjY1LjcuOTMuMzEuMjcuNjkuNDkgMS4xNS42Ni40Ni4xNy45OC4yNSAxLjU4LjI1LjUzIDAgMS4wMS0uMDYgMS40NC0uMTkuNDMtLjEzLjgtLjMxIDEuMTEtLjU0LjMxLS4yMy41NC0uNTEuNzEtLjgzLjE3LS4zMi4yNS0uNjcuMjUtMS4wNi0uMDItLjQtLjA5LS43NC0uMjQtMS4wMnptLTkuOTYtNy4zMmMtLjM0LS40LS43NS0uNy0xLjIzLS44OC0uNDctLjE4LTEuMDEtLjI3LTEuNTktLjI3LS41OCAwLTEuMTEuMDktMS41OS4yNy0uNDguMTgtLjg5LjQ3LTEuMjMuODgtLjM0LjQxLS42LjkzLS43OSAxLjU5LS4xOC42NS0uMjggMS40NS0uMjggMi4zOXYxLjkyYzAgLjk0LjA5IDEuNzQuMjggMi4zOS4xOS42Ni40NSAxLjE5LjggMS42LjM0LjQxLjc1LjcxIDEuMjMuODkuNDguMTggMS4wMS4yOCAxLjU5LjI4LjU5IDAgMS4xMi0uMDkgMS41OS0uMjguNDgtLjE4Ljg4LS40OCAxLjIyLS44OS4zNC0uNDEuNi0uOTQuNzgtMS42LjE4LS42NS4yOC0xLjQ1LjI4LTIuMzl2LTEuOTJjMC0uOTQtLjA5LTEuNzQtLjI4LTIuMzktLjE4LS42Ni0uNDQtMS4xOS0uNzgtMS41OXptLS45MiA2LjE3YzAgLjYtLjA0IDEuMTEtLjEyIDEuNTMtLjA4LjQyLS4yLjc2LS4zNiAxLjAyLS4xNi4yNi0uMzYuNDUtLjU5LjU3LS4yMy4xMi0uNTEuMTgtLjgyLjE4LS4zIDAtLjU4LS4wNi0uODItLjE4cy0uNDQtLjMxLS42LS41N2MtLjE2LS4yNi0uMjktLjYtLjM4LTEuMDItLjA5LS40Mi0uMTMtLjkzLS4xMy0xLjUzdi0yLjVjMC0uNi4wNC0xLjExLjEzLTEuNTIuMDktLjQxLjIxLS43NC4zOC0xIC4xNi0uMjUuMzYtLjQzLjYtLjU1LjI0LS4xMS41MS0uMTcuODEtLjE3LjMxIDAgLjU4LjA2LjgxLjE3LjI0LjExLjQ0LjI5LjYuNTUuMTYuMjUuMjkuNTguMzcuOTkuMDguNDEuMTMuOTIuMTMgMS41MnYyLjUxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRpbWVyLTMiPjxwYXRoIGQ9Ik0xMS42MSAxMi45N2MtLjE2LS4yNC0uMzYtLjQ2LS42Mi0uNjUtLjI1LS4xOS0uNTYtLjM1LS45My0uNDguMy0uMTQuNTctLjMuOC0uNS4yMy0uMi40Mi0uNDEuNTctLjY0LjE1LS4yMy4yNy0uNDYuMzQtLjcxLjA4LS4yNC4xMS0uNDkuMTEtLjczIDAtLjU1LS4wOS0xLjA0LS4yOC0xLjQ2LS4xOC0uNDItLjQ0LS43Ny0uNzgtMS4wNi0uMzMtLjI4LS43My0uNS0xLjItLjY0LS40NS0uMTMtLjk3LS4yLTEuNTMtLjItLjU1IDAtMS4wNi4wOC0xLjUyLjI0LS40Ny4xNy0uODcuNC0xLjIuNjktLjMzLjI5LS42LjYzLS43OCAxLjAzLS4yLjM5LS4yOS44My0uMjkgMS4yOWgxLjk4YzAtLjI2LjA1LS40OS4xNC0uNjkuMDktLjIuMjItLjM4LjM4LS41Mi4xNy0uMTQuMzYtLjI1LjU4LS4zMy4yMi0uMDguNDYtLjEyLjczLS4xMi42MSAwIDEuMDYuMTYgMS4zNi40Ny4zLjMxLjQ0Ljc1LjQ0IDEuMzIgMCAuMjctLjA0LjUyLS4xMi43NC0uMDguMjItLjIxLjQxLS4zOC41Ny0uMTcuMTYtLjM4LjI4LS42My4zNy0uMjUuMDktLjU1LjEzLS44OS4xM0g2LjcydjEuNTdINy45Yy4zNCAwIC42NC4wNC45MS4xMS4yNy4wOC41LjE5LjY5LjM1LjE5LjE2LjM0LjM2LjQ0LjYxLjEuMjQuMTYuNTQuMTYuODcgMCAuNjItLjE4IDEuMDktLjUzIDEuNDItLjM1LjMzLS44NC40OS0xLjQ1LjQ5LS4yOSAwLS41Ni0uMDQtLjgtLjEzLS4yNC0uMDgtLjQ0LS4yLS42MS0uMzYtLjE3LS4xNi0uMy0uMzQtLjM5LS41Ni0uMDktLjIyLS4xNC0uNDYtLjE0LS43Mkg0LjE5YzAgLjU1LjExIDEuMDMuMzIgMS40NS4yMS40Mi41Ljc3Ljg2IDEuMDVzLjc3LjQ5IDEuMjQuNjMuOTYuMjEgMS40OC4yMWMuNTcgMCAxLjA5LS4wOCAxLjU4LS4yMy40OS0uMTUuOTEtLjM4IDEuMjYtLjY4LjM2LS4zLjY0LS42Ni44NC0xLjEuMi0uNDMuMy0uOTMuMy0xLjQ4IDAtLjI5LS4wNC0uNTgtLjExLS44Ni0uMDgtLjI1LS4xOS0uNTEtLjM1LS43NnptOS4yNiAxLjRjLS4xNC0uMjgtLjM1LS41My0uNjMtLjc0LS4yOC0uMjEtLjYxLS4zOS0xLjAxLS41M3MtLjg1LS4yNy0xLjM1LS4zOGMtLjM1LS4wNy0uNjQtLjE1LS44Ny0uMjMtLjIzLS4wOC0uNDEtLjE2LS41NS0uMjUtLjE0LS4wOS0uMjMtLjE5LS4yOC0uMy0uMDUtLjExLS4wOC0uMjQtLjA4LS4zOXMuMDMtLjI4LjA5LS40MWMuMDYtLjEzLjE1LS4yNS4yNy0uMzQuMTItLjEuMjctLjE4LjQ1LS4yNHMuNC0uMDkuNjQtLjA5Yy4yNSAwIC40Ny4wNC42Ni4xMS4xOS4wNy4zNS4xNy40OC4yOS4xMy4xMi4yMi4yNi4yOS40Mi4wNi4xNi4xLjMyLjEuNDloMS45NWMwLS4zOS0uMDgtLjc1LS4yNC0xLjA5LS4xNi0uMzQtLjM5LS42My0uNjktLjg4LS4zLS4yNS0uNjYtLjQ0LTEuMDktLjU5LS40My0uMTUtLjkyLS4yMi0xLjQ2LS4yMi0uNTEgMC0uOTguMDctMS4zOS4yMS0uNDEuMTQtLjc3LjMzLTEuMDYuNTctLjI5LjI0LS41MS41Mi0uNjcuODQtLjE2LjMyLS4yMy42NS0uMjMgMS4wMXMuMDguNjguMjMuOTZjLjE1LjI4LjM3LjUyLjY0LjczLjI3LjIxLjYuMzguOTguNTMuMzguMTQuODEuMjYgMS4yNy4zNi4zOS4wOC43MS4xNy45NS4yNnMuNDMuMTkuNTcuMjljLjEzLjEuMjIuMjIuMjcuMzQuMDUuMTIuMDcuMjUuMDcuMzkgMCAuMzItLjEzLjU3LS40Ljc3LS4yNy4yLS42Ni4yOS0xLjE3LjI5LS4yMiAwLS40My0uMDItLjY0LS4wOC0uMjEtLjA1LS40LS4xMy0uNTYtLjI0LS4xNy0uMTEtLjMtLjI2LS40MS0uNDQtLjExLS4xOC0uMTctLjQxLS4xOC0uNjdoLTEuODljMCAuMzYuMDguNzEuMjQgMS4wNS4xNi4zNC4zOS42NS43LjkzLjMxLjI3LjY5LjQ5IDEuMTUuNjYuNDYuMTcuOTguMjUgMS41OC4yNS41MyAwIDEuMDEtLjA2IDEuNDQtLjE5LjQzLS4xMy44LS4zMSAxLjExLS41NC4zMS0uMjMuNTQtLjUxLjcxLS44My4xNy0uMzIuMjUtLjY3LjI1LTEuMDYtLjAyLS40LS4wOS0uNzQtLjI0LTEuMDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idGltZXItb2ZmIj48cGF0aCBkPSJNMTkuMDQgNC41NWwtMS40MiAxLjQyQzE2LjA3IDQuNzQgMTQuMTIgNCAxMiA0Yy0xLjgzIDAtMy41My41NS00Ljk1IDEuNDhsMS40NiAxLjQ2QzkuNTMgNi4zNSAxMC43MyA2IDEyIDZjMy44NyAwIDcgMy4xMyA3IDcgMCAxLjI3LS4zNSAyLjQ3LS45NCAzLjQ5bDEuNDUgMS40NUMyMC40NSAxNi41MyAyMSAxNC44MyAyMSAxM2MwLTIuMTItLjc0LTQuMDctMS45Ny01LjYxbDEuNDItMS40Mi0xLjQxLTEuNDJ6TTE1IDFIOXYyaDZWMXptLTQgOC40NGwyIDJWOGgtMnYxLjQ0ek0zLjAyIDRMMS43NSA1LjI3IDQuNSA4LjAzQzMuNTUgOS40NSAzIDExLjE2IDMgMTNjMCA0Ljk3IDQuMDIgOSA5IDkgMS44NCAwIDMuNTUtLjU1IDQuOTgtMS41bDIuNSAyLjUgMS4yNy0xLjI3LTcuNzEtNy43MUwzLjAyIDR6TTEyIDIwYy0zLjg3IDAtNy0zLjEzLTctNyAwLTEuMjguMzUtMi40OC45NS0zLjUybDkuNTYgOS41NmMtMS4wMy42MS0yLjIzLjk2LTMuNTEuOTZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idG9uYWxpdHkiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0tMSAxNy45M2MtMy45NC0uNDktNy0zLjg1LTctNy45M3MzLjA1LTcuNDQgNy03LjkzdjE1Ljg2em0yLTE1Ljg2YzEuMDMuMTMgMiAuNDUgMi44Ny45M0gxM3YtLjkzek0xMyA3aDUuMjRjLjI1LjMxLjQ4LjY1LjY4IDFIMTNWN3ptMCAzaDYuNzRjLjA4LjMzLjE1LjY2LjE5IDFIMTN2LTF6bTAgOS45M1YxOWgyLjg3Yy0uODcuNDgtMS44NC44LTIuODcuOTN6TTE4LjI0IDE3SDEzdi0xaDUuOTJjLS4yLjM1LS40My42OS0uNjggMXptMS41LTNIMTN2LTFoNi45M2MtLjA0LjM0LS4xMS42Ny0uMTkgMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0cmFuc2Zvcm0iPjxwYXRoIGQ9Ik0yMiAxOHYtMkg4VjRoMkw3IDEgNCA0aDJ2MkgydjJoNHY4YzAgMS4xLjkgMiAyIDJoOHYyaC0ybDMgMyAzLTNoLTJ2LTJoNHpNMTAgOGg2djZoMlY4YzAtMS4xLS45LTItMi0yaC02djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idHVuZSI+PHBhdGggZD0iTTMgMTd2Mmg2di0ySDN6TTMgNXYyaDEwVjVIM3ptMTAgMTZ2LTJoOHYtMmgtOHYtMmgtMnY2aDJ6TTcgOXYySDN2Mmg0djJoMlY5SDd6bTE0IDR2LTJIMTF2MmgxMHptLTYtNGgyVjdoNFY1aC00VjNoLTJ2NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aWV3LWNvbWZ5Ij48cGF0aCBkPSJNMyA5aDRWNUgzdjR6bTAgNWg0di00SDN2NHptNSAwaDR2LTRIOHY0em01IDBoNHYtNGgtNHY0ek04IDloNFY1SDh2NHptNS00djRoNFY1aC00em01IDloNHYtNGgtNHY0ek0zIDE5aDR2LTRIM3Y0em01IDBoNHYtNEg4djR6bTUgMGg0di00aC00djR6bTUgMGg0di00aC00djR6bTAtMTR2NGg0VjVoLTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idmlldy1jb21wYWN0Ij48cGF0aCBkPSJNMyAxOWg2di03SDN2N3ptNyAwaDEydi03SDEwdjd6TTMgNXY2aDE5VjVIM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aWduZXR0ZSI+PHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tOSAxNWMtNC40MiAwLTgtMi42OS04LTZzMy41OC02IDgtNiA4IDIuNjkgOCA2LTMuNTggNi04IDZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0id2ItYXV0byI+PHBhdGggZD0iTTYuODUgMTIuNjVoMi4zTDggOWwtMS4xNSAzLjY1ek0yMiA3bC0xLjIgNi4yOUwxOS4zIDdoLTEuNmwtMS40OSA2LjI5TDE1IDdoLS43NkMxMi43NyA1LjE3IDEwLjUzIDQgOCA0Yy00LjQyIDAtOCAzLjU4LTggOHMzLjU4IDggOCA4YzMuMTMgMCA1Ljg0LTEuODEgNy4xNS00LjQzbC4xLjQzSDE3bDEuNS02LjFMMjAgMTZoMS43NWwyLjA1LTlIMjJ6bS0xMS43IDlsLS43LTJINi40bC0uNyAySDMuOEw3IDdoMmwzLjIgOWgtMS45eiI+PC9wYXRoPjwvZz4KPGcgaWQ9IndiLWNsb3VkeSI+PHBhdGggZD0iTTE5LjM2IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjQtNC45NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ3Yi1pbmNhbmRlc2NlbnQiPjxwYXRoIGQ9Ik0zLjU1IDE4LjU0bDEuNDEgMS40MSAxLjc5LTEuOC0xLjQxLTEuNDEtMS43OSAxLjh6TTExIDIyLjQ1aDJWMTkuNWgtMnYyLjk1ek00IDEwLjVIMXYyaDN2LTJ6bTExLTQuMTlWMS41SDl2NC44MUM3LjIxIDcuMzUgNiA5LjI4IDYgMTEuNWMwIDMuMzEgMi42OSA2IDYgNnM2LTIuNjkgNi02YzAtMi4yMi0xLjIxLTQuMTUtMy01LjE5em01IDQuMTl2Mmgzdi0yaC0zem0tMi43NiA3LjY2bDEuNzkgMS44IDEuNDEtMS40MS0xLjgtMS43OS0xLjQgMS40eiI+PC9wYXRoPjwvZz4KPGcgaWQ9IndiLWlyaWRlc2NlbnQiPjxwYXRoIGQ9Ik01IDE0LjVoMTR2LTZINXY2ek0xMSAuNTVWMy41aDJWLjU1aC0yem04LjA0IDIuNWwtMS43OSAxLjc5IDEuNDEgMS40MSAxLjgtMS43OS0xLjQyLTEuNDF6TTEzIDIyLjQ1VjE5LjVoLTJ2Mi45NWgyem03LjQ1LTMuOTFsLTEuOC0xLjc5LTEuNDEgMS40MSAxLjc5IDEuOCAxLjQyLTEuNDJ6TTMuNTUgNC40NmwxLjc5IDEuNzkgMS40MS0xLjQxLTEuNzktMS43OS0xLjQxIDEuNDF6bTEuNDEgMTUuNDlsMS43OS0xLjgtMS40MS0xLjQxLTEuNzkgMS43OSAxLjQxIDEuNDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0id2Itc3VubnkiPjxwYXRoIGQ9Ik02Ljc2IDQuODRsLTEuOC0xLjc5LTEuNDEgMS40MSAxLjc5IDEuNzkgMS40Mi0xLjQxek00IDEwLjVIMXYyaDN2LTJ6bTktOS45NWgtMlYzLjVoMlYuNTV6bTcuNDUgMy45MWwtMS40MS0xLjQxLTEuNzkgMS43OSAxLjQxIDEuNDEgMS43OS0xLjc5em0tMy4yMSAxMy43bDEuNzkgMS44IDEuNDEtMS40MS0xLjgtMS43OS0xLjQgMS40ek0yMCAxMC41djJoM3YtMmgtM3ptLTgtNWMtMy4zMSAwLTYgMi42OS02IDZzMi42OSA2IDYgNiA2LTIuNjkgNi02LTIuNjktNi02LTZ6bS0xIDE2Ljk1aDJWMTkuNWgtMnYyLjk1em0tNy40NS0zLjkxbDEuNDEgMS40MSAxLjc5LTEuOC0xLjQxLTEuNDEtMS43OSAxLjh6Ij48L3BhdGg+PC9nPgo8L2RlZnM+PC9zdmc+CjwvaXJvbi1pY29uc2V0LXN2Zz5gO2RvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoU28uY29udGVudCk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBNbz1fZWA8aXJvbi1pY29uc2V0LXN2ZyBuYW1lPSJpY29ucyIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iM2Qtcm90YXRpb24iPjxwYXRoIGQ9Ik03LjUyIDIxLjQ4QzQuMjUgMTkuOTQgMS45MSAxNi43NiAxLjU1IDEzSC4wNUMuNTYgMTkuMTYgNS43MSAyNCAxMiAyNGwuNjYtLjAzLTMuODEtMy44MS0xLjMzIDEuMzJ6bS44OS02LjUyYy0uMTkgMC0uMzctLjAzLS41Mi0uMDgtLjE2LS4wNi0uMjktLjEzLS40LS4yNC0uMTEtLjEtLjItLjIyLS4yNi0uMzctLjA2LS4xNC0uMDktLjMtLjA5LS40N2gtMS4zYzAgLjM2LjA3LjY4LjIxLjk1LjE0LjI3LjMzLjUuNTYuNjkuMjQuMTguNTEuMzIuODIuNDEuMy4xLjYyLjE1Ljk2LjE1LjM3IDAgLjcyLS4wNSAxLjAzLS4xNS4zMi0uMS42LS4yNS44My0uNDRzLjQyLS40My41NS0uNzJjLjEzLS4yOS4yLS42MS4yLS45NyAwLS4xOS0uMDItLjM4LS4wNy0uNTYtLjA1LS4xOC0uMTItLjM1LS4yMy0uNTEtLjEtLjE2LS4yNC0uMy0uNC0uNDMtLjE3LS4xMy0uMzctLjIzLS42MS0uMzEuMi0uMDkuMzctLjIuNTItLjMzLjE1LS4xMy4yNy0uMjcuMzctLjQyLjEtLjE1LjE3LS4zLjIyLS40Ni4wNS0uMTYuMDctLjMyLjA3LS40OCAwLS4zNi0uMDYtLjY4LS4xOC0uOTYtLjEyLS4yOC0uMjktLjUxLS41MS0uNjktLjItLjE5LS40Ny0uMzMtLjc3LS40M0M5LjEgOC4wNSA4Ljc2IDggOC4zOSA4Yy0uMzYgMC0uNjkuMDUtMSAuMTYtLjMuMTEtLjU3LjI2LS43OS40NS0uMjEuMTktLjM4LjQxLS41MS42Ny0uMTIuMjYtLjE4LjU0LS4xOC44NWgxLjNjMC0uMTcuMDMtLjMyLjA5LS40NXMuMTQtLjI1LjI1LS4zNGMuMTEtLjA5LjIzLS4xNy4zOC0uMjIuMTUtLjA1LjMtLjA4LjQ4LS4wOC40IDAgLjcuMS44OS4zMS4xOS4yLjI5LjQ5LjI5Ljg2IDAgLjE4LS4wMy4zNC0uMDguNDktLjA1LjE1LS4xNC4yNy0uMjUuMzctLjExLjEtLjI1LjE4LS40MS4yNC0uMTYuMDYtLjM2LjA5LS41OC4wOUg3LjV2MS4wM2guNzdjLjIyIDAgLjQyLjAyLjYuMDdzLjMzLjEzLjQ1LjIzYy4xMi4xMS4yMi4yNC4yOS40LjA3LjE2LjEuMzUuMS41NyAwIC40MS0uMTIuNzItLjM1LjkzLS4yMy4yMy0uNTUuMzMtLjk1LjMzem04LjU1LTUuOTJjLS4zMi0uMzMtLjctLjU5LTEuMTQtLjc3LS40My0uMTgtLjkyLS4yNy0xLjQ2LS4yN0gxMnY4aDIuM2MuNTUgMCAxLjA2LS4wOSAxLjUxLS4yNy40NS0uMTguODQtLjQzIDEuMTYtLjc2LjMyLS4zMy41Ny0uNzMuNzQtMS4xOS4xNy0uNDcuMjYtLjk5LjI2LTEuNTd2LS40YzAtLjU4LS4wOS0xLjEtLjI2LTEuNTctLjE4LS40Ny0uNDMtLjg3LS43NS0xLjJ6bS0uMzkgMy4xNmMwIC40Mi0uMDUuNzktLjE0IDEuMTMtLjEuMzMtLjI0LjYyLS40My44NS0uMTkuMjMtLjQzLjQxLS43MS41My0uMjkuMTItLjYyLjE4LS45OS4xOGgtLjkxVjkuMTJoLjk3Yy43MiAwIDEuMjcuMjMgMS42NC42OS4zOC40Ni41NyAxLjEyLjU3IDEuOTl2LjR6TTEyIDBsLS42Ni4wMyAzLjgxIDMuODEgMS4zMy0xLjMzYzMuMjcgMS41NSA1LjYxIDQuNzIgNS45NiA4LjQ4aDEuNUMyMy40NCA0Ljg0IDE4LjI5IDAgMTIgMHoiPjwvcGF0aD48L2c+CjxnIGlkPSJhY2Nlc3NpYmlsaXR5Ij48cGF0aCBkPSJNMTIgMmMxLjEgMCAyIC45IDIgMnMtLjkgMi0yIDItMi0uOS0yLTIgLjktMiAyLTJ6bTkgN2gtNnYxM2gtMnYtNmgtMnY2SDlWOUgzVjdoMTh2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJhY2Nlc3NpYmxlIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjQiIHI9IjIiPjwvY2lyY2xlPjxwYXRoIGQ9Ik0xOSAxM3YtMmMtMS41NC4wMi0zLjA5LS43NS00LjA3LTEuODNsLTEuMjktMS40M2MtLjE3LS4xOS0uMzgtLjM0LS42MS0uNDUtLjAxIDAtLjAxLS4wMS0uMDItLjAxSDEzYy0uMzUtLjItLjc1LS4zLTEuMTktLjI2QzEwLjc2IDcuMTEgMTAgOC4wNCAxMCA5LjA5VjE1YzAgMS4xLjkgMiAyIDJoNXY1aDJ2LTUuNWMwLTEuMS0uOS0yLTItMmgtM3YtMy40NWMxLjI5IDEuMDcgMy4yNSAxLjk0IDUgMS45NXptLTYuMTcgNWMtLjQxIDEuMTYtMS41MiAyLTIuODMgMi0xLjY2IDAtMy0xLjM0LTMtMyAwLTEuMzEuODQtMi40MSAyLTIuODNWMTIuMWMtMi4yOC40Ni00IDIuNDgtNCA0LjkgMCAyLjc2IDIuMjQgNSA1IDUgMi40MiAwIDQuNDQtMS43MiA0LjktNGgtMi4wN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJhY2NvdW50LWJhbGFuY2UiPjxwYXRoIGQ9Ik00IDEwdjdoM3YtN0g0em02IDB2N2gzdi03aC0zek0yIDIyaDE5di0zSDJ2M3ptMTQtMTJ2N2gzdi03aC0zem0tNC41LTlMMiA2djJoMTlWNmwtOS41LTV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYWNjb3VudC1iYWxhbmNlLXdhbGxldCI+PHBhdGggZD0iTTIxIDE4djFjMCAxLjEtLjkgMi0yIDJINWMtMS4xMSAwLTItLjktMi0yVjVjMC0xLjEuODktMiAyLTJoMTRjMS4xIDAgMiAuOSAyIDJ2MWgtOWMtMS4xMSAwLTIgLjktMiAydjhjMCAxLjEuODkgMiAyIDJoOXptLTktMmgxMFY4SDEydjh6bTQtMi41Yy0uODMgMC0xLjUtLjY3LTEuNS0xLjVzLjY3LTEuNSAxLjUtMS41IDEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJhY2NvdW50LWJveCI+PHBhdGggZD0iTTMgNXYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0ySDVjLTEuMTEgMC0yIC45LTIgMnptMTIgNGMwIDEuNjYtMS4zNCAzLTMgM3MtMy0xLjM0LTMtMyAxLjM0LTMgMy0zIDMgMS4zNCAzIDN6bS05IDhjMC0yIDQtMy4xIDYtMy4xczYgMS4xIDYgMy4xdjFINnYtMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJhY2NvdW50LWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgM2MxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgMy0zLTEuMzQtMy0zIDEuMzQtMyAzLTN6bTAgMTQuMmMtMi41IDAtNC43MS0xLjI4LTYtMy4yMi4wMy0xLjk5IDQtMy4wOCA2LTMuMDggMS45OSAwIDUuOTcgMS4wOSA2IDMuMDgtMS4yOSAxLjk0LTMuNSAzLjIyLTYgMy4yMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJhZGQiPjxwYXRoIGQ9Ik0xOSAxM2gtNnY2aC0ydi02SDV2LTJoNlY1aDJ2Nmg2djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYWRkLWFsZXJ0Ij48cGF0aCBkPSJNMTAuMDEgMjEuMDFjMCAxLjEuODkgMS45OSAxLjk5IDEuOTlzMS45OS0uODkgMS45OS0xLjk5aC0zLjk4em04Ljg3LTQuMTlWMTFjMC0zLjI1LTIuMjUtNS45Ny01LjI5LTYuNjl2LS43MkMxMy41OSAyLjcxIDEyLjg4IDIgMTIgMnMtMS41OS43MS0xLjU5IDEuNTl2LjcyQzcuMzcgNS4wMyA1LjEyIDcuNzUgNS4xMiAxMXY1LjgyTDMgMTguOTRWMjBoMTh2LTEuMDZsLTIuMTItMi4xMnpNMTYgMTMuMDFoLTN2M2gtMnYtM0g4VjExaDNWOGgydjNoM3YyLjAxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFkZC1ib3giPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tMiAxMGgtNHY0aC0ydi00SDd2LTJoNFY3aDJ2NGg0djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYWRkLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTUgMTFoLTR2NGgtMnYtNEg3di0yaDRWN2gydjRoNHYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFkZC1jaXJjbGUtb3V0bGluZSI+PHBhdGggZD0iTTEzIDdoLTJ2NEg3djJoNHY0aDJ2LTRoNHYtMmgtNFY3em0tMS01QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJhZGQtc2hvcHBpbmctY2FydCI+PHBhdGggZD0iTTExIDloMlY2aDNWNGgtM1YxaC0ydjNIOHYyaDN2M3ptLTQgOWMtMS4xIDAtMS45OS45LTEuOTkgMlM1LjkgMjIgNyAyMnMyLS45IDItMi0uOS0yLTItMnptMTAgMGMtMS4xIDAtMS45OS45LTEuOTkgMnMuODkgMiAxLjk5IDIgMi0uOSAyLTItLjktMi0yLTJ6bS05LjgzLTMuMjVsLjAzLS4xMi45LTEuNjNoNy40NWMuNzUgMCAxLjQxLS40MSAxLjc1LTEuMDNsMy44Ni03LjAxTDE5LjQyIDRoLS4wMWwtMS4xIDItMi43NiA1SDguNTNsLS4xMy0uMjdMNi4xNiA2bC0uOTUtMi0uOTQtMkgxdjJoMmwzLjYgNy41OS0xLjM1IDIuNDVjLS4xNi4yOC0uMjUuNjEtLjI1Ljk2IDAgMS4xLjkgMiAyIDJoMTJ2LTJINy40MmMtLjEzIDAtLjI1LS4xMS0uMjUtLjI1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFsYXJtIj48cGF0aCBkPSJNMjIgNS43MmwtNC42LTMuODYtMS4yOSAxLjUzIDQuNiAzLjg2TDIyIDUuNzJ6TTcuODggMy4zOUw2LjYgMS44NiAyIDUuNzFsMS4yOSAxLjUzIDQuNTktMy44NXpNMTIuNSA4SDExdjZsNC43NSAyLjg1Ljc1LTEuMjMtNC0yLjM3Vjh6TTEyIDRjLTQuOTcgMC05IDQuMDMtOSA5czQuMDIgOSA5IDljNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bTAgMTZjLTMuODcgMC03LTMuMTMtNy03czMuMTMtNyA3LTcgNyAzLjEzIDcgNy0zLjEzIDctNyA3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFsYXJtLWFkZCI+PHBhdGggZD0iTTcuODggMy4zOUw2LjYgMS44NiAyIDUuNzFsMS4yOSAxLjUzIDQuNTktMy44NXpNMjIgNS43MmwtNC42LTMuODYtMS4yOSAxLjUzIDQuNiAzLjg2TDIyIDUuNzJ6TTEyIDRjLTQuOTcgMC05IDQuMDMtOSA5czQuMDIgOSA5IDljNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bTAgMTZjLTMuODcgMC03LTMuMTMtNy03czMuMTMtNyA3LTcgNyAzLjEzIDcgNy0zLjEzIDctNyA3em0xLTExaC0ydjNIOHYyaDN2M2gydi0zaDN2LTJoLTNWOXoiPjwvcGF0aD48L2c+CjxnIGlkPSJhbGFybS1vZmYiPjxwYXRoIGQ9Ik0xMiA2YzMuODcgMCA3IDMuMTMgNyA3IDAgLjg0LS4xNiAxLjY1LS40MyAyLjRsMS41MiAxLjUyYy41OC0xLjE5LjkxLTIuNTEuOTEtMy45MiAwLTQuOTctNC4wMy05LTktOS0xLjQxIDAtMi43My4zMy0zLjkyLjkxTDkuNiA2LjQzQzEwLjM1IDYuMTYgMTEuMTYgNiAxMiA2em0xMC0uMjhsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek0yLjkyIDIuMjlMMS42NSAzLjU3IDIuOTggNC45bC0xLjExLjkzIDEuNDIgMS40MiAxLjExLS45NC44LjhDMy44MyA4LjY5IDMgMTAuNzUgMyAxM2MwIDQuOTcgNC4wMiA5IDkgOSAyLjI1IDAgNC4zMS0uODMgNS44OS0yLjJsMi4yIDIuMiAxLjI3LTEuMjdMMy44OSAzLjI3bC0uOTctLjk4em0xMy41NSAxNi4xQzE1LjI2IDE5LjM5IDEzLjcgMjAgMTIgMjBjLTMuODcgMC03LTMuMTMtNy03IDAtMS43LjYxLTMuMjYgMS42MS00LjQ3bDkuODYgOS44NnpNOC4wMiAzLjI4TDYuNiAxLjg2bC0uODYuNzEgMS40MiAxLjQyLjg2LS43MXoiPjwvcGF0aD48L2c+CjxnIGlkPSJhbGFybS1vbiI+PHBhdGggZD0iTTIyIDUuNzJsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek03Ljg4IDMuMzlMNi42IDEuODYgMiA1LjcxbDEuMjkgMS41MyA0LjU5LTMuODV6TTEyIDRjLTQuOTcgMC05IDQuMDMtOSA5czQuMDIgOSA5IDljNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bTAgMTZjLTMuODcgMC03LTMuMTMtNy03czMuMTMtNyA3LTcgNyAzLjEzIDcgNy0zLjEzIDctNyA3em0tMS40Ni01LjQ3TDguNDEgMTIuNGwtMS4wNiAxLjA2IDMuMTggMy4xOCA2LTYtMS4wNi0xLjA2LTQuOTMgNC45NXoiPjwvcGF0aD48L2c+CjxnIGlkPSJhbGwtb3V0Ij48cGF0aCBkPSJNMTYuMjEgNC4xNmw0IDR2LTR6bTQgMTJsLTQgNGg0em0tMTIgNGwtNC00djR6bS00LTEybDQtNGgtNHptMTIuOTUtLjk1Yy0yLjczLTIuNzMtNy4xNy0yLjczLTkuOSAwcy0yLjczIDcuMTcgMCA5LjkgNy4xNyAyLjczIDkuOSAwIDIuNzMtNy4xNiAwLTkuOXptLTEuMSA4LjhjLTIuMTMgMi4xMy01LjU3IDIuMTMtNy43IDBzLTIuMTMtNS41NyAwLTcuNyA1LjU3LTIuMTMgNy43IDAgMi4xMyA1LjU3IDAgNy43eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFuZHJvaWQiPjxwYXRoIGQ9Ik02IDE4YzAgLjU1LjQ1IDEgMSAxaDF2My41YzAgLjgzLjY3IDEuNSAxLjUgMS41czEuNS0uNjcgMS41LTEuNVYxOWgydjMuNWMwIC44My42NyAxLjUgMS41IDEuNXMxLjUtLjY3IDEuNS0xLjVWMTloMWMuNTUgMCAxLS40NSAxLTFWOEg2djEwek0zLjUgOEMyLjY3IDggMiA4LjY3IDIgOS41djdjMCAuODMuNjcgMS41IDEuNSAxLjVTNSAxNy4zMyA1IDE2LjV2LTdDNSA4LjY3IDQuMzMgOCAzLjUgOHptMTcgMGMtLjgzIDAtMS41LjY3LTEuNSAxLjV2N2MwIC44My42NyAxLjUgMS41IDEuNXMxLjUtLjY3IDEuNS0xLjV2LTdjMC0uODMtLjY3LTEuNS0xLjUtMS41em0tNC45Ny01Ljg0bDEuMy0xLjNjLjItLjIuMi0uNTEgMC0uNzEtLjItLjItLjUxLS4yLS43MSAwbC0xLjQ4IDEuNDhDMTMuODUgMS4yMyAxMi45NSAxIDEyIDFjLS45NiAwLTEuODYuMjMtMi42Ni42M0w3Ljg1LjE1Yy0uMi0uMi0uNTEtLjItLjcxIDAtLjIuMi0uMi41MSAwIC43MWwxLjMxIDEuMzFDNi45NyAzLjI2IDYgNS4wMSA2IDdoMTJjMC0xLjk5LS45Ny0zLjc1LTIuNDctNC44NHpNMTAgNUg5VjRoMXYxem01IDBoLTFWNGgxdjF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYW5ub3VuY2VtZW50Ij48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDloLTJWNWgydjZ6bTAgNGgtMnYtMmgydjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXBwcyI+PHBhdGggZD0iTTQgOGg0VjRINHY0em02IDEyaDR2LTRoLTR2NHptLTYgMGg0di00SDR2NHptMC02aDR2LTRINHY0em02IDBoNHYtNGgtNHY0em02LTEwdjRoNFY0aC00em0tNiA0aDRWNGgtNHY0em02IDZoNHYtNGgtNHY0em0wIDZoNHYtNGgtNHY0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFyY2hpdmUiPjxwYXRoIGQ9Ik0yMC41NCA1LjIzbC0xLjM5LTEuNjhDMTguODggMy4yMSAxOC40NyAzIDE4IDNINmMtLjQ3IDAtLjg4LjIxLTEuMTYuNTVMMy40NiA1LjIzQzMuMTcgNS41NyAzIDYuMDIgMyA2LjVWMTljMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2LjVjMC0uNDgtLjE3LS45My0uNDYtMS4yN3pNMTIgMTcuNUw2LjUgMTJIMTB2LTJoNHYyaDMuNUwxMiAxNy41ek01LjEyIDVsLjgxLTFoMTJsLjk0IDFINS4xMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJhcnJvdy1iYWNrIj48cGF0aCBkPSJNMjAgMTFINy44M2w1LjU5LTUuNTlMMTIgNGwtOCA4IDggOCAxLjQxLTEuNDFMNy44MyAxM0gyMHYtMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJhcnJvdy1kb3dud2FyZCI+PHBhdGggZD0iTTIwIDEybC0xLjQxLTEuNDFMMTMgMTYuMTdWNGgtMnYxMi4xN2wtNS41OC01LjU5TDQgMTJsOCA4IDgtOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJhcnJvdy1kcm9wLWRvd24iPjxwYXRoIGQ9Ik03IDEwbDUgNSA1LTV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXJyb3ctZHJvcC1kb3duLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMTJsLTQtNGg4bC00IDR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXJyb3ctZHJvcC11cCI+PHBhdGggZD0iTTcgMTRsNS01IDUgNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJhcnJvdy1mb3J3YXJkIj48cGF0aCBkPSJNMTIgNGwtMS40MSAxLjQxTDE2LjE3IDExSDR2MmgxMi4xN2wtNS41OCA1LjU5TDEyIDIwbDgtOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJhcnJvdy11cHdhcmQiPjxwYXRoIGQ9Ik00IDEybDEuNDEgMS40MUwxMSA3LjgzVjIwaDJWNy44M2w1LjU4IDUuNTlMMjAgMTJsLTgtOC04IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXNwZWN0LXJhdGlvIj48cGF0aCBkPSJNMTkgMTJoLTJ2M2gtM3YyaDV2LTV6TTcgOWgzVjdINXY1aDJWOXptMTQtNkgzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTYuMDFIM1Y0Ljk5aDE4djE0LjAyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFzc2Vzc21lbnQiPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNOSAxN0g3di03aDJ2N3ptNCAwaC0yVjdoMnYxMHptNCAwaC0ydi00aDJ2NHoiPjwvcGF0aD48L2c+CjxnIGlkPSJhc3NpZ25tZW50Ij48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTIgMTRIN3YtMmg3djJ6bTMtNEg3di0yaDEwdjJ6bTAtNEg3VjdoMTB2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJhc3NpZ25tZW50LWluZCI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0wIDRjMS42NiAwIDMgMS4zNCAzIDNzLTEuMzQgMy0zIDMtMy0xLjM0LTMtMyAxLjM0LTMgMy0zem02IDEySDZ2LTEuNGMwLTIgNC0zLjEgNi0zLjFzNiAxLjEgNiAzLjFWMTl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXNzaWdubWVudC1sYXRlIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNiAxNWgtMnYtMmgydjJ6bTAtNGgtMlY4aDJ2NnptLTEtOWMtLjU1IDAtMS0uNDUtMS0xcy40NS0xIDEtMSAxIC40NSAxIDEtLjQ1IDEtMSAxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtcmV0dXJuIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTQgMTJoLTR2M2wtNS01IDUtNXYzaDR2NHoiPjwvcGF0aD48L2c+CjxnIGlkPSJhc3NpZ25tZW50LXJldHVybmVkIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTAgMTVsLTUtNWgzVjloNHY0aDNsLTUgNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJhc3NpZ25tZW50LXR1cm5lZC1pbiI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0tMiAxNGwtNC00IDEuNDEtMS40MUwxMCAxNC4xN2w2LjU5LTYuNTlMMTggOWwtOCA4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImF0dGFjaG1lbnQiPjxwYXRoIGQ9Ik0yIDEyLjVDMiA5LjQ2IDQuNDYgNyA3LjUgN0gxOGMyLjIxIDAgNCAxLjc5IDQgNHMtMS43OSA0LTQgNEg5LjVDOC4xMiAxNSA3IDEzLjg4IDcgMTIuNVM4LjEyIDEwIDkuNSAxMEgxN3YySDkuNDFjLS41NSAwLS41NSAxIDAgMUgxOGMxLjEgMCAyLS45IDItMnMtLjktMi0yLTJINy41QzUuNTcgOSA0IDEwLjU3IDQgMTIuNVM1LjU3IDE2IDcuNSAxNkgxN3YySDcuNUM0LjQ2IDE4IDIgMTUuNTQgMiAxMi41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImF1dG9yZW5ldyI+PHBhdGggZD0iTTEyIDZ2M2w0LTQtNC00djNjLTQuNDIgMC04IDMuNTgtOCA4IDAgMS41Ny40NiAzLjAzIDEuMjQgNC4yNkw2LjcgMTQuOGMtLjQ1LS44My0uNy0xLjc5LS43LTIuOCAwLTMuMzEgMi42OS02IDYtNnptNi43NiAxLjc0TDE3LjMgOS4yYy40NC44NC43IDEuNzkuNyAyLjggMCAzLjMxLTIuNjkgNi02IDZ2LTNsLTQgNCA0IDR2LTNjNC40MiAwIDgtMy41OCA4LTggMC0xLjU3LS40Ni0zLjAzLTEuMjQtNC4yNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJiYWNrc3BhY2UiPjxwYXRoIGQ9Ik0yMiAzSDdjLS42OSAwLTEuMjMuMzUtMS41OS44OEwwIDEybDUuNDEgOC4xMWMuMzYuNTMuOS44OSAxLjU5Ljg5aDE1YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS0zIDEyLjU5TDE3LjU5IDE3IDE0IDEzLjQxIDEwLjQxIDE3IDkgMTUuNTkgMTIuNTkgMTIgOSA4LjQxIDEwLjQxIDcgMTQgMTAuNTkgMTcuNTkgNyAxOSA4LjQxIDE1LjQxIDEyIDE5IDE1LjU5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJhY2t1cCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTQgMTN2NGgtNHYtNEg3bDUtNSA1IDVoLTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYmxvY2siPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyek00IDEyYzAtNC40MiAzLjU4LTggOC04IDEuODUgMCAzLjU1LjYzIDQuOSAxLjY5TDUuNjkgMTYuOUM0LjYzIDE1LjU1IDQgMTMuODUgNCAxMnptOCA4Yy0xLjg1IDAtMy41NS0uNjMtNC45LTEuNjlMMTguMzEgNy4xQzE5LjM3IDguNDUgMjAgMTAuMTUgMjAgMTJjMCA0LjQyLTMuNTggOC04IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYm9vayI+PHBhdGggZD0iTTE4IDJINmMtMS4xIDAtMiAuOS0yIDJ2MTZjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek02IDRoNXY4bC0yLjUtMS41TDYgMTJWNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJib29rbWFyayI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJib29rbWFyay1ib3JkZXIiPjxwYXRoIGQ9Ik0xNyAzSDdjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNSAyMWw3LTMgNyAzVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTVsLTUtMi4xOEw3IDE4VjVoMTB2MTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYnVnLXJlcG9ydCI+PHBhdGggZD0iTTIwIDhoLTIuODFjLS40NS0uNzgtMS4wNy0xLjQ1LTEuODItMS45NkwxNyA0LjQxIDE1LjU5IDNsLTIuMTcgMi4xN0MxMi45NiA1LjA2IDEyLjQ5IDUgMTIgNWMtLjQ5IDAtLjk2LjA2LTEuNDEuMTdMOC40MSAzIDcgNC40MWwxLjYyIDEuNjNDNy44OCA2LjU1IDcuMjYgNy4yMiA2LjgxIDhINHYyaDIuMDljLS4wNS4zMy0uMDkuNjYtLjA5IDF2MUg0djJoMnYxYzAgLjM0LjA0LjY3LjA5IDFINHYyaDIuODFjMS4wNCAxLjc5IDIuOTcgMyA1LjE5IDNzNC4xNS0xLjIxIDUuMTktM0gyMHYtMmgtMi4wOWMuMDUtLjMzLjA5LS42Ni4wOS0xdi0xaDJ2LTJoLTJ2LTFjMC0uMzQtLjA0LS42Ny0uMDktMUgyMFY4em0tNiA4aC00di0yaDR2MnptMC00aC00di0yaDR2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJidWlsZCI+PHBhdGggZD0iTTIyLjcgMTlsLTkuMS05LjFjLjktMi4zLjQtNS0xLjUtNi45LTItMi01LTIuNC03LjQtMS4zTDkgNiA2IDkgMS42IDQuN0MuNCA3LjEuOSAxMC4xIDIuOSAxMi4xYzEuOSAxLjkgNC42IDIuNCA2LjkgMS41bDkuMSA5LjFjLjQuNCAxIC40IDEuNCAwbDIuMy0yLjNjLjUtLjQuNS0xLjEuMS0xLjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2FjaGVkIj48cGF0aCBkPSJNMTkgOGwtNCA0aDNjMCAzLjMxLTIuNjkgNi02IDYtMS4wMSAwLTEuOTctLjI1LTIuOC0uN2wtMS40NiAxLjQ2QzguOTcgMTkuNTQgMTAuNDMgMjAgMTIgMjBjNC40MiAwIDgtMy41OCA4LThoM2wtNC00ek02IDEyYzAtMy4zMSAyLjY5LTYgNi02IDEuMDEgMCAxLjk3LjI1IDIuOC43bDEuNDYtMS40NkMxNS4wMyA0LjQ2IDEzLjU3IDQgMTIgNGMtNC40MiAwLTggMy41OC04IDhIMWw0IDQgNC00SDZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2FtZXJhLWVuaGFuY2UiPjxwYXRoIGQ9Ik05IDNMNy4xNyA1SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMmgtMy4xN0wxNSAzSDl6bTMgMTVjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1em0wLTFsMS4yNS0yLjc1TDE2IDEzbC0yLjc1LTEuMjVMMTIgOWwtMS4yNSAyLjc1TDggMTNsMi43NSAxLjI1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNhbmNlbCI+PHBhdGggZD0iTTEyIDJDNi40NyAyIDIgNi40NyAyIDEyczQuNDcgMTAgMTAgMTAgMTAtNC40NyAxMC0xMFMxNy41MyAyIDEyIDJ6bTUgMTMuNTlMMTUuNTkgMTcgMTIgMTMuNDEgOC40MSAxNyA3IDE1LjU5IDEwLjU5IDEyIDcgOC40MSA4LjQxIDcgMTIgMTAuNTkgMTUuNTkgNyAxNyA4LjQxIDEzLjQxIDEyIDE3IDE1LjU5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNhcmQtZ2lmdGNhcmQiPjxwYXRoIGQ9Ik0yMCA2aC0yLjE4Yy4xMS0uMzEuMTgtLjY1LjE4LTEgMC0xLjY2LTEuMzQtMy0zLTMtMS4wNSAwLTEuOTYuNTQtMi41IDEuMzVsLS41LjY3LS41LS42OEMxMC45NiAyLjU0IDEwLjA1IDIgOSAyIDcuMzQgMiA2IDMuMzQgNiA1YzAgLjM1LjA3LjY5LjE4IDFINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMTljMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWOGMwLTEuMTEtLjg5LTItMi0yem0tNS0yYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6TTkgNGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0xMSAxNUg0di0yaDE2djJ6bTAtNUg0VjhoNS4wOEw3IDEwLjgzIDguNjIgMTIgMTEgOC43NmwxLTEuMzYgMSAxLjM2TDE1LjM4IDEyIDE3IDEwLjgzIDE0LjkyIDhIMjB2NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjYXJkLW1lbWJlcnNoaXAiPjxwYXRoIGQ9Ik0yMCAySDRjLTEuMTEgMC0yIC44OS0yIDJ2MTFjMCAxLjExLjg5IDIgMiAyaDR2NWw0LTIgNCAydi01aDRjMS4xMSAwIDItLjg5IDItMlY0YzAtMS4xMS0uODktMi0yLTJ6bTAgMTNINHYtMmgxNnYyem0wLTVINFY0aDE2djZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2FyZC10cmF2ZWwiPjxwYXRoIGQ9Ik0yMCA2aC0zVjRjMC0xLjExLS44OS0yLTItMkg5Yy0xLjExIDAtMiAuODktMiAydjJINGMtMS4xMSAwLTIgLjg5LTIgMnYxMWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6TTkgNGg2djJIOVY0em0xMSAxNUg0di0yaDE2djJ6bTAtNUg0VjhoM3YyaDJWOGg2djJoMlY4aDN2NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjaGFuZ2UtaGlzdG9yeSI+PHBhdGggZD0iTTEyIDcuNzdMMTguMzkgMThINS42MUwxMiA3Ljc3TTEyIDRMMiAyMGgyMEwxMiA0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNoZWNrIj48cGF0aCBkPSJNOSAxNi4xN0w0LjgzIDEybC0xLjQyIDEuNDFMOSAxOSAyMSA3bC0xLjQxLTEuNDF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2hlY2stYm94Ij48cGF0aCBkPSJNMTkgM0g1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xMSAwIDItLjkgMi0yVjVjMC0xLjEtLjg5LTItMi0yem0tOSAxNGwtNS01IDEuNDEtMS40MUwxMCAxNC4xN2w3LjU5LTcuNTlMMTkgOGwtOSA5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNoZWNrLWJveC1vdXRsaW5lLWJsYW5rIj48cGF0aCBkPSJNMTkgNXYxNEg1VjVoMTRtMC0ySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjaGVjay1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0tMiAxNWwtNS01IDEuNDEtMS40MUwxMCAxNC4xN2w3LjU5LTcuNTlMMTkgOGwtOSA5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNoZXZyb24tbGVmdCI+PHBhdGggZD0iTTE1LjQxIDcuNDFMMTQgNmwtNiA2IDYgNiAxLjQxLTEuNDFMMTAuODMgMTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2hldnJvbi1yaWdodCI+PHBhdGggZD0iTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNocm9tZS1yZWFkZXItbW9kZSI+PHBhdGggZD0iTTEzIDEyaDd2MS41aC03em0wLTIuNWg3VjExaC03em0wIDVoN1YxNmgtN3pNMjEgNEgzYy0xLjEgMC0yIC45LTIgMnYxM2MwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgMTVoLTlWNmg5djEzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNsYXNzIj48cGF0aCBkPSJNMTggMkg2Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTYgNGg1djhsLTIuNS0xLjVMNiAxMlY0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNsZWFyIj48cGF0aCBkPSJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNsb3NlIj48cGF0aCBkPSJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNsb3VkIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNsb3VkLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTQuNSAxNEg4Yy0xLjY2IDAtMy0xLjM0LTMtM3MxLjM0LTMgMy0zbC4xNC4wMUM4LjU4IDguMjggMTAuMTMgNyAxMiA3YzIuMjEgMCA0IDEuNzkgNCA0aC41YzEuMzggMCAyLjUgMS4xMiAyLjUgMi41UzE3Ljg4IDE2IDE2LjUgMTZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2xvdWQtZG9uZSI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTAgMTdsLTMuNS0zLjUgMS40MS0xLjQxTDEwIDE0LjE3IDE1LjE4IDlsMS40MSAxLjQxTDEwIDE3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNsb3VkLWRvd25sb2FkIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xNyAxM2wtNSA1LTUtNWgzVjloNHY0aDN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2xvdWQtb2ZmIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDRjLTEuNDggMC0yLjg1LjQzLTQuMDEgMS4xN2wxLjQ2IDEuNDZDMTAuMjEgNi4yMyAxMS4wOCA2IDEyIDZjMy4wNCAwIDUuNSAyLjQ2IDUuNSA1LjV2LjVIMTljMS42NiAwIDMgMS4zNCAzIDMgMCAxLjEzLS42NCAyLjExLTEuNTYgMi42MmwxLjQ1IDEuNDVDMjMuMTYgMTguMTYgMjQgMTYuNjggMjQgMTVjMC0yLjY0LTIuMDUtNC43OC00LjY1LTQuOTZ6TTMgNS4yN2wyLjc1IDIuNzRDMi41NiA4LjE1IDAgMTAuNzcgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxMS43M2wyIDJMMjEgMjAuNzMgNC4yNyA0IDMgNS4yN3pNNy43MyAxMGw4IDhINmMtMi4yMSAwLTQtMS43OS00LTRzMS43OS00IDQtNGgxLjczeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNsb3VkLXF1ZXVlIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xOSAxOEg2Yy0yLjIxIDAtNC0xLjc5LTQtNHMxLjc5LTQgNC00aC43MUM3LjM3IDcuNjkgOS40OCA2IDEyIDZjMy4wNCAwIDUuNSAyLjQ2IDUuNSA1LjV2LjVIMTljMS42NiAwIDMgMS4zNCAzIDNzLTEuMzQgMy0zIDN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2xvdWQtdXBsb2FkIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xNCAxM3Y0aC00di00SDdsNS01IDUgNWgtM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJjb2RlIj48cGF0aCBkPSJNOS40IDE2LjZMNC44IDEybDQuNi00LjZMOCA2bC02IDYgNiA2IDEuNC0xLjR6bTUuMiAwbDQuNi00LjYtNC42LTQuNkwxNiA2bDYgNi02IDYtMS40LTEuNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJjb21wYXJlLWFycm93cyI+PHBhdGggZD0iTTkuMDEgMTRIMnYyaDcuMDF2M0wxMyAxNWwtMy45OS00djN6bTUuOTgtMXYtM0gyMlY4aC03LjAxVjVMMTEgOWwzLjk5IDR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY29udGVudC1jb3B5Ij48cGF0aCBkPSJNMTYgMUg0Yy0xLjEgMC0yIC45LTIgMnYxNGgyVjNoMTJWMXptMyA0SDhjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTFjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnptMCAxNkg4VjdoMTF2MTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY29udGVudC1jdXQiPjxwYXRoIGQ9Ik05LjY0IDcuNjRjLjIzLS41LjM2LTEuMDUuMzYtMS42NCAwLTIuMjEtMS43OS00LTQtNFMyIDMuNzkgMiA2czEuNzkgNCA0IDRjLjU5IDAgMS4xNC0uMTMgMS42NC0uMzZMMTAgMTJsLTIuMzYgMi4zNkM3LjE0IDE0LjEzIDYuNTkgMTQgNiAxNGMtMi4yMSAwLTQgMS43OS00IDRzMS43OSA0IDQgNCA0LTEuNzkgNC00YzAtLjU5LS4xMy0xLjE0LS4zNi0xLjY0TDEyIDE0bDcgN2gzdi0xTDkuNjQgNy42NHpNNiA4Yy0xLjEgMC0yLS44OS0yLTJzLjktMiAyLTIgMiAuODkgMiAyLS45IDItMiAyem0wIDEyYy0xLjEgMC0yLS44OS0yLTJzLjktMiAyLTIgMiAuODkgMiAyLS45IDItMiAyem02LTcuNWMtLjI4IDAtLjUtLjIyLS41LS41cy4yMi0uNS41LS41LjUuMjIuNS41LS4yMi41LS41LjV6TTE5IDNsLTYgNiAyIDIgNy03VjN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY29udGVudC1wYXN0ZSI+PHBhdGggZD0iTTE5IDJoLTQuMThDMTQuNC44NCAxMy4zIDAgMTIgMGMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptNyAxOEg1VjRoMnYzaDEwVjRoMnYxNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjb3B5cmlnaHQiPjxwYXRoIGQ9Ik0xMC4wOCAxMC44NmMuMDUtLjMzLjE2LS42Mi4zLS44N3MuMzQtLjQ2LjU5LS42MmMuMjQtLjE1LjU0LS4yMi45MS0uMjMuMjMuMDEuNDQuMDUuNjMuMTMuMi4wOS4zOC4yMS41Mi4zNnMuMjUuMzMuMzQuNTMuMTMuNDIuMTQuNjRoMS43OWMtLjAyLS40Ny0uMTEtLjktLjI4LTEuMjlzLS40LS43My0uNy0xLjAxLS42Ni0uNS0xLjA4LS42Ni0uODgtLjIzLTEuMzktLjIzYy0uNjUgMC0xLjIyLjExLTEuNy4zNHMtLjg4LjUzLTEuMi45Mi0uNTYuODQtLjcxIDEuMzZTOCAxMS4yOSA4IDExLjg3di4yN2MwIC41OC4wOCAxLjEyLjIzIDEuNjRzLjM5Ljk3LjcxIDEuMzUuNzIuNjkgMS4yLjkxIDEuMDUuMzQgMS43LjM0Yy40NyAwIC45MS0uMDggMS4zMi0uMjNzLjc3LS4zNiAxLjA4LS42My41Ni0uNTguNzQtLjk0LjI5LS43NC4zLTEuMTVoLTEuNzljLS4wMS4yMS0uMDYuNC0uMTUuNThzLS4yMS4zMy0uMzYuNDYtLjMyLjIzLS41Mi4zYy0uMTkuMDctLjM5LjA5LS42LjEtLjM2LS4wMS0uNjYtLjA4LS44OS0uMjMtLjI1LS4xNi0uNDUtLjM3LS41OS0uNjJzLS4yNS0uNTUtLjMtLjg4LS4wOC0uNjctLjA4LTF2LS4yN2MwLS4zNS4wMy0uNjguMDgtMS4wMXpNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY3JlYXRlIj48cGF0aCBkPSJNMyAxNy4yNVYyMWgzLjc1TDE3LjgxIDkuOTRsLTMuNzUtMy43NUwzIDE3LjI1ek0yMC43MSA3LjA0Yy4zOS0uMzkuMzktMS4wMiAwLTEuNDFsLTIuMzQtMi4zNGMtLjM5LS4zOS0xLjAyLS4zOS0xLjQxIDBsLTEuODMgMS44MyAzLjc1IDMuNzUgMS44My0xLjgzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyZWF0ZS1uZXctZm9sZGVyIj48cGF0aCBkPSJNMjAgNmgtOGwtMi0ySDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE4YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjhjMC0xLjExLS44OS0yLTItMnptLTEgOGgtM3YzaC0ydi0zaC0zdi0yaDNWOWgydjNoM3YyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyZWRpdC1jYXJkIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY2YzAtMS4xMS0uODktMi0yLTJ6bTAgMTRINHYtNmgxNnY2em0wLTEwSDRWNmgxNnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImRhc2hib2FyZCI+PHBhdGggZD0iTTMgMTNoOFYzSDN2MTB6bTAgOGg4di02SDN2NnptMTAgMGg4VjExaC04djEwem0wLTE4djZoOFYzaC04eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImRhdGUtcmFuZ2UiPjxwYXRoIGQ9Ik05IDExSDd2Mmgydi0yem00IDBoLTJ2Mmgydi0yem00IDBoLTJ2Mmgydi0yem0yLTdoLTFWMmgtMnYySDhWMkg2djJINWMtMS4xMSAwLTEuOTkuOS0xLjk5IDJMMyAyMGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDE2SDVWOWgxNHYxMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJkZWxldGUiPjxwYXRoIGQ9Ik02IDE5YzAgMS4xLjkgMiAyIDJoOGMxLjEgMCAyLS45IDItMlY3SDZ2MTJ6TTE5IDRoLTMuNWwtMS0xaC01bC0xIDFINXYyaDE0VjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZGVsZXRlLWZvcmV2ZXIiPjxwYXRoIGQ9Ik02IDE5YzAgMS4xLjkgMiAyIDJoOGMxLjEgMCAyLS45IDItMlY3SDZ2MTJ6bTIuNDYtNy4xMmwxLjQxLTEuNDFMMTIgMTIuNTlsMi4xMi0yLjEyIDEuNDEgMS40MUwxMy40MSAxNGwyLjEyIDIuMTItMS40MSAxLjQxTDEyIDE1LjQxbC0yLjEyIDIuMTItMS40MS0xLjQxTDEwLjU5IDE0bC0yLjEzLTIuMTJ6TTE1LjUgNGwtMS0xaC01bC0xIDFINXYyaDE0VjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZGVsZXRlLXN3ZWVwIj48cGF0aCBkPSJNMTUgMTZoNHYyaC00em0wLThoN3YyaC03em0wIDRoNnYyaC02ek0zIDE4YzAgMS4xLjkgMiAyIDJoNmMxLjEgMCAyLS45IDItMlY4SDN2MTB6TTE0IDVoLTNsLTEtMUg2TDUgNUgydjJoMTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZGVzY3JpcHRpb24iPjxwYXRoIGQ9Ik0xNCAySDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAyMGMwIDEuMS44OSAyIDEuOTkgMkgxOGMxLjEgMCAyLS45IDItMlY4bC02LTZ6bTIgMTZIOHYtMmg4djJ6bTAtNEg4di0yaDh2MnptLTMtNVYzLjVMMTguNSA5SDEzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImRucyI+PHBhdGggZD0iTTIwIDEzSDRjLS41NSAwLTEgLjQ1LTEgMXY2YzAgLjU1LjQ1IDEgMSAxaDE2Yy41NSAwIDEtLjQ1IDEtMXYtNmMwLS41NS0uNDUtMS0xLTF6TTcgMTljLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyek0yMCAzSDRjLS41NSAwLTEgLjQ1LTEgMXY2YzAgLjU1LjQ1IDEgMSAxaDE2Yy41NSAwIDEtLjQ1IDEtMVY0YzAtLjU1LS40NS0xLTEtMXpNNyA5Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJkb25lIj48cGF0aCBkPSJNOSAxNi4yTDQuOCAxMmwtMS40IDEuNEw5IDE5IDIxIDdsLTEuNC0xLjRMOSAxNi4yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImRvbmUtYWxsIj48cGF0aCBkPSJNMTggN2wtMS40MS0xLjQxLTYuMzQgNi4zNCAxLjQxIDEuNDFMMTggN3ptNC4yNC0xLjQxTDExLjY2IDE2LjE3IDcuNDggMTJsLTEuNDEgMS40MUwxMS42NiAxOWwxMi0xMi0xLjQyLTEuNDF6TS40MSAxMy40MUw2IDE5bDEuNDEtMS40MUwxLjgzIDEyIC40MSAxMy40MXoiPjwvcGF0aD48L2c+CjxnIGlkPSJkb251dC1sYXJnZSI+PHBhdGggZD0iTTExIDUuMDhWMmMtNSAuNS05IDQuODEtOSAxMHM0IDkuNSA5IDEwdi0zLjA4Yy0zLS40OC02LTMuNC02LTYuOTJzMy02LjQ0IDYtNi45MnpNMTguOTcgMTFIMjJjLS40Ny01LTQtOC41My05LTl2My4wOEMxNiA1LjUxIDE4LjU0IDggMTguOTcgMTF6TTEzIDE4LjkyVjIyYzUtLjQ3IDguNTMtNCA5LTloLTMuMDNjLS40MyAzLTIuOTcgNS40OS01Ljk3IDUuOTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZG9udXQtc21hbGwiPjxwYXRoIGQ9Ik0xMSA5LjE2VjJjLTUgLjUtOSA0Ljc5LTkgMTBzNCA5LjUgOSAxMHYtNy4xNmMtMS0uNDEtMi0xLjUyLTItMi44NHMxLTIuNDMgMi0yLjg0ek0xNC44NiAxMUgyMmMtLjQ4LTQuNzUtNC04LjUzLTktOXY3LjE2YzEgLjMgMS41Mi45OCAxLjg2IDEuODR6TTEzIDE0Ljg0VjIyYzUtLjQ3IDguNTItNC4yNSA5LTloLTcuMTRjLS4zNC44Ni0uODYgMS41NC0xLjg2IDEuODR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZHJhZnRzIj48cGF0aCBkPSJNMjEuOTkgOGMwLS43Mi0uMzctMS4zNS0uOTQtMS43TDEyIDEgMi45NSA2LjNDMi4zOCA2LjY1IDIgNy4yOCAyIDh2MTBjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMmwtLjAxLTEwek0xMiAxM0wzLjc0IDcuODQgMTIgM2w4LjI2IDQuODRMMTIgMTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZWplY3QiPjxwYXRoIGQ9Ik01IDE3aDE0djJINXptNy0xMkw1LjMzIDE1aDEzLjM0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImVycm9yIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMSAxNWgtMnYtMmgydjJ6bTAtNGgtMlY3aDJ2NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJlcnJvci1vdXRsaW5lIj48cGF0aCBkPSJNMTEgMTVoMnYyaC0yem0wLThoMnY2aC0yem0uOTktNUM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnpNMTIgMjBjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImV1cm8tc3ltYm9sIj48cGF0aCBkPSJNMTUgMTguNWMtMi41MSAwLTQuNjgtMS40Mi01Ljc2LTMuNUgxNXYtMkg4LjU4Yy0uMDUtLjMzLS4wOC0uNjYtLjA4LTFzLjAzLS42Ny4wOC0xSDE1VjlIOS4yNEMxMC4zMiA2LjkyIDEyLjUgNS41IDE1IDUuNWMxLjYxIDAgMy4wOS41OSA0LjIzIDEuNTdMMjEgNS4zQzE5LjQxIDMuODcgMTcuMyAzIDE1IDNjLTMuOTIgMC03LjI0IDIuNTEtOC40OCA2SDN2MmgzLjA2Yy0uMDQuMzMtLjA2LjY2LS4wNiAxIDAgLjM0LjAyLjY3LjA2IDFIM3YyaDMuNTJjMS4yNCAzLjQ5IDQuNTYgNiA4LjQ4IDYgMi4zMSAwIDQuNDEtLjg3IDYtMi4zbC0xLjc4LTEuNzdjLTEuMTMuOTgtMi42IDEuNTctNC4yMiAxLjU3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImV2ZW50Ij48cGF0aCBkPSJNMTcgMTJoLTV2NWg1di01ek0xNiAxdjJIOFYxSDZ2Mkg1Yy0xLjExIDAtMS45OS45LTEuOTkgMkwzIDE5YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJoLTFWMWgtMnptMyAxOEg1VjhoMTR2MTF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXZlbnQtc2VhdCI+PHBhdGggZD0iTTQgMTh2M2gzdi0zaDEwdjNoM3YtNkg0em0xNS04aDN2M2gtM3pNMiAxMGgzdjNIMnptMTUgM0g3VjVjMC0xLjEuOS0yIDItMmg2YzEuMSAwIDIgLjkgMiAydjh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXhpdC10by1hcHAiPjxwYXRoIGQ9Ik0xMC4wOSAxNS41OUwxMS41IDE3bDUtNS01LTUtMS40MSAxLjQxTDEyLjY3IDExSDN2Mmg5LjY3bC0yLjU4IDIuNTl6TTE5IDNINWMtMS4xMSAwLTIgLjktMiAydjRoMlY1aDE0djE0SDV2LTRIM3Y0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXhwYW5kLWxlc3MiPjxwYXRoIGQ9Ik0xMiA4bC02IDYgMS40MSAxLjQxTDEyIDEwLjgzbDQuNTkgNC41OEwxOCAxNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJleHBhbmQtbW9yZSI+PHBhdGggZD0iTTE2LjU5IDguNTlMMTIgMTMuMTcgNy40MSA4LjU5IDYgMTBsNiA2IDYtNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJleHBsb3JlIj48cGF0aCBkPSJNMTIgMTAuOWMtLjYxIDAtMS4xLjQ5LTEuMSAxLjFzLjQ5IDEuMSAxLjEgMS4xYy42MSAwIDEuMS0uNDkgMS4xLTEuMXMtLjQ5LTEuMS0xLjEtMS4xek0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0yLjE5IDEyLjE5TDYgMThsMy44MS04LjE5TDE4IDZsLTMuODEgOC4xOXoiPjwvcGF0aD48L2c+CjxnIGlkPSJleHRlbnNpb24iPjxwYXRoIGQ9Ik0yMC41IDExSDE5VjdjMC0xLjEtLjktMi0yLTJoLTRWMy41QzEzIDIuMTIgMTEuODggMSAxMC41IDFTOCAyLjEyIDggMy41VjVINGMtMS4xIDAtMS45OS45LTEuOTkgMnYzLjhIMy41YzEuNDkgMCAyLjcgMS4yMSAyLjcgMi43cy0xLjIxIDIuNy0yLjcgMi43SDJWMjBjMCAxLjEuOSAyIDIgMmgzLjh2LTEuNWMwLTEuNDkgMS4yMS0yLjcgMi43LTIuNyAxLjQ5IDAgMi43IDEuMjEgMi43IDIuN1YyMkgxN2MxLjEgMCAyLS45IDItMnYtNGgxLjVjMS4zOCAwIDIuNS0xLjEyIDIuNS0yLjVTMjEuODggMTEgMjAuNSAxMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJmYWNlIj48cGF0aCBkPSJNOSAxMS43NWMtLjY5IDAtMS4yNS41Ni0xLjI1IDEuMjVzLjU2IDEuMjUgMS4yNSAxLjI1IDEuMjUtLjU2IDEuMjUtMS4yNS0uNTYtMS4yNS0xLjI1LTEuMjV6bTYgMGMtLjY5IDAtMS4yNS41Ni0xLjI1IDEuMjVzLjU2IDEuMjUgMS4yNSAxLjI1IDEuMjUtLjU2IDEuMjUtMS4yNS0uNTYtMS4yNS0xLjI1LTEuMjV6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04IDAtLjI5LjAyLS41OC4wNS0uODYgMi4zNi0xLjA1IDQuMjMtMi45OCA1LjIxLTUuMzdDMTEuMDcgOC4zMyAxNC4wNSAxMCAxNy40MiAxMGMuNzggMCAxLjUzLS4wOSAyLjI1LS4yNi4yMS43MS4zMyAxLjQ3LjMzIDIuMjYgMCA0LjQxLTMuNTkgOC04IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmF2b3JpdGUiPjxwYXRoIGQ9Ik0xMiAyMS4zNWwtMS40NS0xLjMyQzUuNCAxNS4zNiAyIDEyLjI4IDIgOC41IDIgNS40MiA0LjQyIDMgNy41IDNjMS43NCAwIDMuNDEuODEgNC41IDIuMDlDMTMuMDkgMy44MSAxNC43NiAzIDE2LjUgMyAxOS41OCAzIDIyIDUuNDIgMjIgOC41YzAgMy43OC0zLjQgNi44Ni04LjU1IDExLjU0TDEyIDIxLjM1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZhdm9yaXRlLWJvcmRlciI+PHBhdGggZD0iTTE2LjUgM2MtMS43NCAwLTMuNDEuODEtNC41IDIuMDlDMTAuOTEgMy44MSA5LjI0IDMgNy41IDMgNC40MiAzIDIgNS40MiAyIDguNWMwIDMuNzggMy40IDYuODYgOC41NSAxMS41NEwxMiAyMS4zNWwxLjQ1LTEuMzJDMTguNiAxNS4zNiAyMiAxMi4yOCAyMiA4LjUgMjIgNS40MiAxOS41OCAzIDE2LjUgM3ptLTQuNCAxNS41NWwtLjEuMS0uMS0uMUM3LjE0IDE0LjI0IDQgMTEuMzkgNCA4LjUgNCA2LjUgNS41IDUgNy41IDVjMS41NCAwIDMuMDQuOTkgMy41NyAyLjM2aDEuODdDMTMuNDYgNS45OSAxNC45NiA1IDE2LjUgNWMyIDAgMy41IDEuNSAzLjUgMy41IDAgMi44OS0zLjE0IDUuNzQtNy45IDEwLjA1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZlZWRiYWNrIj48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDEyaC0ydi0yaDJ2MnptMC00aC0yVjZoMnY0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbGUtZG93bmxvYWQiPjxwYXRoIGQ9Ik0xOSA5aC00VjNIOXY2SDVsNyA3IDctN3pNNSAxOHYyaDE0di0ySDV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsZS11cGxvYWQiPjxwYXRoIGQ9Ik05IDE2aDZ2LTZoNGwtNy03LTcgN2g0em0tNCAyaDE0djJINXoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXItbGlzdCI+PHBhdGggZD0iTTEwIDE4aDR2LTJoLTR2MnpNMyA2djJoMThWNkgzem0zIDdoMTJ2LTJINnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbmQtaW4tcGFnZSI+PHBhdGggZD0iTTIwIDE5LjU5VjhsLTYtNkg2Yy0xLjEgMC0xLjk5LjktMS45OSAyTDQgMjBjMCAxLjEuODkgMiAxLjk5IDJIMThjLjQ1IDAgLjg1LS4xNSAxLjE5LS40bC00LjQzLTQuNDNjLS44LjUyLTEuNzQuODMtMi43Ni44My0yLjc2IDAtNS0yLjI0LTUtNXMyLjI0LTUgNS01IDUgMi4yNCA1IDVjMCAxLjAyLS4zMSAxLjk2LS44MyAyLjc1TDIwIDE5LjU5ek05IDEzYzAgMS42NiAxLjM0IDMgMyAzczMtMS4zNCAzLTMtMS4zNC0zLTMtMy0zIDEuMzQtMyAzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbmQtcmVwbGFjZSI+PHBhdGggZD0iTTExIDZjMS4zOCAwIDIuNjMuNTYgMy41NCAxLjQ2TDEyIDEwaDZWNGwtMi4wNSAyLjA1QzE0LjY4IDQuNzggMTIuOTMgNCAxMSA0Yy0zLjUzIDAtNi40MyAyLjYxLTYuOTIgNkg2LjFjLjQ2LTIuMjggMi40OC00IDQuOS00em01LjY0IDkuMTRjLjY2LS45IDEuMTItMS45NyAxLjI4LTMuMTRIMTUuOWMtLjQ2IDIuMjgtMi40OCA0LTQuOSA0LTEuMzggMC0yLjYzLS41Ni0zLjU0LTEuNDZMMTAgMTJINHY2bDIuMDUtMi4wNUM3LjMyIDE3LjIyIDkuMDcgMTggMTEgMThjMS41NSAwIDIuOTgtLjUxIDQuMTQtMS4zNkwyMCAyMS40OSAyMS40OSAyMGwtNC44NS00Ljg2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbmdlcnByaW50Ij48cGF0aCBkPSJNMTcuODEgNC40N2MtLjA4IDAtLjE2LS4wMi0uMjMtLjA2QzE1LjY2IDMuNDIgMTQgMyAxMi4wMSAzYy0xLjk4IDAtMy44Ni40Ny01LjU3IDEuNDEtLjI0LjEzLS41NC4wNC0uNjgtLjItLjEzLS4yNC0uMDQtLjU1LjItLjY4QzcuODIgMi41MiA5Ljg2IDIgMTIuMDEgMmMyLjEzIDAgMy45OS40NyA2LjAzIDEuNTIuMjUuMTMuMzQuNDMuMjEuNjctLjA5LjE4LS4yNi4yOC0uNDQuMjh6TTMuNSA5LjcyYy0uMSAwLS4yLS4wMy0uMjktLjA5LS4yMy0uMTYtLjI4LS40Ny0uMTItLjcuOTktMS40IDIuMjUtMi41IDMuNzUtMy4yN0M5Ljk4IDQuMDQgMTQgNC4wMyAxNy4xNSA1LjY1YzEuNS43NyAyLjc2IDEuODYgMy43NSAzLjI1LjE2LjIyLjExLjU0LS4xMi43LS4yMy4xNi0uNTQuMTEtLjctLjEyLS45LTEuMjYtMi4wNC0yLjI1LTMuMzktMi45NC0yLjg3LTEuNDctNi41NC0xLjQ3LTkuNC4wMS0xLjM2LjctMi41IDEuNy0zLjQgMi45Ni0uMDguMTQtLjIzLjIxLS4zOS4yMXptNi4yNSAxMi4wN2MtLjEzIDAtLjI2LS4wNS0uMzUtLjE1LS44Ny0uODctMS4zNC0xLjQzLTIuMDEtMi42NC0uNjktMS4yMy0xLjA1LTIuNzMtMS4wNS00LjM0IDAtMi45NyAyLjU0LTUuMzkgNS42Ni01LjM5czUuNjYgMi40MiA1LjY2IDUuMzljMCAuMjgtLjIyLjUtLjUuNXMtLjUtLjIyLS41LS41YzAtMi40Mi0yLjA5LTQuMzktNC42Ni00LjM5LTIuNTcgMC00LjY2IDEuOTctNC42NiA0LjM5IDAgMS40NC4zMiAyLjc3LjkzIDMuODUuNjQgMS4xNSAxLjA4IDEuNjQgMS44NSAyLjQyLjE5LjIuMTkuNTEgMCAuNzEtLjExLjEtLjI0LjE1LS4zNy4xNXptNy4xNy0xLjg1Yy0xLjE5IDAtMi4yNC0uMy0zLjEtLjg5LTEuNDktMS4wMS0yLjM4LTIuNjUtMi4zOC00LjM5IDAtLjI4LjIyLS41LjUtLjVzLjUuMjIuNS41YzAgMS40MS43MiAyLjc0IDEuOTQgMy41Ni43MS40OCAxLjU0LjcxIDIuNTQuNzEuMjQgMCAuNjQtLjAzIDEuMDQtLjEuMjctLjA1LjUzLjEzLjU4LjQxLjA1LjI3LS4xMy41My0uNDEuNTgtLjU3LjExLTEuMDcuMTItMS4yMS4xMnpNMTQuOTEgMjJjLS4wNCAwLS4wOS0uMDEtLjEzLS4wMi0xLjU5LS40NC0yLjYzLTEuMDMtMy43Mi0yLjEtMS40LTEuMzktMi4xNy0zLjI0LTIuMTctNS4yMiAwLTEuNjIgMS4zOC0yLjk0IDMuMDgtMi45NCAxLjcgMCAzLjA4IDEuMzIgMy4wOCAyLjk0IDAgMS4wNy45MyAxLjk0IDIuMDggMS45NHMyLjA4LS44NyAyLjA4LTEuOTRjMC0zLjc3LTMuMjUtNi44My03LjI1LTYuODMtMi44NCAwLTUuNDQgMS41OC02LjYxIDQuMDMtLjM5LjgxLS41OSAxLjc2LS41OSAyLjggMCAuNzguMDcgMi4wMS42NyAzLjYxLjEuMjYtLjAzLjU1LS4yOS42NC0uMjYuMS0uNTUtLjA0LS42NC0uMjktLjQ5LTEuMzEtLjczLTIuNjEtLjczLTMuOTYgMC0xLjIuMjMtMi4yOS42OC0zLjI0IDEuMzMtMi43OSA0LjI4LTQuNiA3LjUxLTQuNiA0LjU1IDAgOC4yNSAzLjUxIDguMjUgNy44MyAwIDEuNjItMS4zOCAyLjk0LTMuMDggMi45NHMtMy4wOC0xLjMyLTMuMDgtMi45NGMwLTEuMDctLjkzLTEuOTQtMi4wOC0xLjk0cy0yLjA4Ljg3LTIuMDggMS45NGMwIDEuNzEuNjYgMy4zMSAxLjg3IDQuNTEuOTUuOTQgMS44NiAxLjQ2IDMuMjcgMS44NS4yNy4wNy40Mi4zNS4zNS42MS0uMDUuMjMtLjI2LjM4LS40Ny4zOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaXJzdC1wYWdlIj48cGF0aCBkPSJNMTguNDEgMTYuNTlMMTMuODIgMTJsNC41OS00LjU5TDE3IDZsLTYgNiA2IDZ6TTYgNmgydjEySDZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmxhZyI+PHBhdGggZD0iTTE0LjQgNkwxNCA0SDV2MTdoMnYtN2g1LjZsLjQgMmg3VjZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmxpZ2h0LWxhbmQiPjxwYXRoIGQ9Ik0yLjUgMTloMTl2MmgtMTl6bTcuMTgtNS43M2w0LjM1IDEuMTYgNS4zMSAxLjQyYy44LjIxIDEuNjItLjI2IDEuODQtMS4wNi4yMS0uOC0uMjYtMS42Mi0xLjA2LTEuODRsLTUuMzEtMS40Mi0yLjc2LTkuMDJMMTAuMTIgMnY4LjI4TDUuMTUgOC45NWwtLjkzLTIuMzItMS40NS0uMzl2NS4xN2wxLjYuNDMgNS4zMSAxLjQzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZsaWdodC10YWtlb2ZmIj48cGF0aCBkPSJNMi41IDE5aDE5djJoLTE5em0xOS41Ny05LjM2Yy0uMjEtLjgtMS4wNC0xLjI4LTEuODQtMS4wNkwxNC45MiAxMGwtNi45LTYuNDMtMS45My41MSA0LjE0IDcuMTctNC45NyAxLjMzLTEuOTctMS41NC0xLjQ1LjM5IDEuODIgMy4xNi43NyAxLjMzIDEuNi0uNDMgNS4zMS0xLjQyIDQuMzUtMS4xNkwyMSAxMS40OWMuODEtLjIzIDEuMjgtMS4wNSAxLjA3LTEuODV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmxpcC10by1iYWNrIj48cGF0aCBkPSJNOSA3SDd2MmgyVjd6bTAgNEg3djJoMnYtMnptMC04Yy0xLjExIDAtMiAuOS0yIDJoMlYzem00IDEyaC0ydjJoMnYtMnptNi0xMnYyaDJjMC0xLjEtLjktMi0yLTJ6bS02IDBoLTJ2MmgyVjN6TTkgMTd2LTJIN2MwIDEuMS44OSAyIDIgMnptMTAtNGgydi0yaC0ydjJ6bTAtNGgyVjdoLTJ2MnptMCA4YzEuMSAwIDItLjkgMi0yaC0ydjJ6TTUgN0gzdjEyYzAgMS4xLjg5IDIgMiAyaDEydi0ySDVWN3ptMTAtMmgyVjNoLTJ2MnptMCAxMmgydi0yaC0ydjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmxpcC10by1mcm9udCI+PHBhdGggZD0iTTMgMTNoMnYtMkgzdjJ6bTAgNGgydi0ySDN2MnptMiA0di0ySDNjMCAxLjEuODkgMiAyIDJ6TTMgOWgyVjdIM3Yyem0xMiAxMmgydi0yaC0ydjJ6bTQtMThIOWMtMS4xMSAwLTIgLjktMiAydjEwYzAgMS4xLjg5IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTJIOVY1aDEwdjEwem0tOCA2aDJ2LTJoLTJ2MnptLTQgMGgydi0ySDd2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmb2xkZXIiPjxwYXRoIGQ9Ik0xMCA0SDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJoLThsLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmb2xkZXItb3BlbiI+PHBhdGggZD0iTTIwIDZoLThsLTItMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yem0wIDEySDRWOGgxNnYxMHoiPjwvcGF0aD48L2c+CjxnIGlkPSJmb2xkZXItc2hhcmVkIj48cGF0aCBkPSJNMjAgNmgtOGwtMi0ySDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bS01IDNjMS4xIDAgMiAuOSAyIDJzLS45IDItMiAyLTItLjktMi0yIC45LTIgMi0yem00IDhoLTh2LTFjMC0xLjMzIDIuNjctMiA0LTJzNCAuNjcgNCAydjF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZm9udC1kb3dubG9hZCI+PHBhdGggZD0iTTkuOTMgMTMuNWg0LjE0TDEyIDcuOTh6TTIwIDJINGMtMS4xIDAtMiAuOS0yIDJ2MTZjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tNC4wNSAxNi41bC0xLjE0LTNIOS4xN2wtMS4xMiAzSDUuOTZsNS4xMS0xM2gxLjg2bDUuMTEgMTNoLTIuMDl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZm9yd2FyZCI+PHBhdGggZD0iTTEyIDhWNGw4IDgtOCA4di00SDRWOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJmdWxsc2NyZWVuIj48cGF0aCBkPSJNNyAxNEg1djVoNXYtMkg3di0zem0tMi00aDJWN2gzVjVINXY1em0xMiA3aC0zdjJoNXYtNWgtMnYzek0xNCA1djJoM3YzaDJWNWgtNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJmdWxsc2NyZWVuLWV4aXQiPjxwYXRoIGQ9Ik01IDE2aDN2M2gydi01SDV2MnptMy04SDV2Mmg1VjVIOHYzem02IDExaDJ2LTNoM3YtMmgtNXY1em0yLTExVjVoLTJ2NWg1VjhoLTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZy10cmFuc2xhdGUiPjxwYXRoIGQ9Ik0yMCA1aC05LjEyTDEwIDJINGMtMS4xIDAtMiAuOS0yIDJ2MTNjMCAxLjEuOSAyIDIgMmg3bDEgM2g4YzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6TTcuMTcgMTQuNTljLTIuMjUgMC00LjA5LTEuODMtNC4wOS00LjA5czEuODMtNC4wOSA0LjA5LTQuMDljMS4wNCAwIDEuOTkuMzcgMi43NCAxLjA3bC4wNy4wNi0xLjIzIDEuMTgtLjA2LS4wNWMtLjI5LS4yNy0uNzgtLjU5LTEuNTItLjU5LTEuMzEgMC0yLjM4IDEuMDktMi4zOCAyLjQyczEuMDcgMi40MiAyLjM4IDIuNDJjMS4zNyAwIDEuOTYtLjg3IDIuMTItMS40Nkg3LjA4VjkuOTFoMy45NWwuMDEuMDdjLjA0LjIxLjA1LjQuMDUuNjEgMCAyLjM1LTEuNjEgNC0zLjkyIDR6bTYuMDMtMS43MWMuMzMuNi43NCAxLjE4IDEuMTkgMS43bC0uNTQuNTMtLjY1LTIuMjN6bS43Ny0uNzZoLS45OWwtLjMxLTEuMDRoMy45OXMtLjM0IDEuMzEtMS41NiAyLjc0Yy0uNTItLjYyLS44OS0xLjIzLTEuMTMtMS43ek0yMSAyMGMwIC41NS0uNDUgMS0xIDFoLTdsMi0yLS44MS0yLjc3LjkyLS45MkwxNy43OSAxOGwuNzMtLjczLTIuNzEtMi42OGMuOS0xLjAzIDEuNi0yLjI1IDEuOTItMy41MUgxOXYtMS4wNGgtMy42NFY5aC0xLjA0djEuMDRoLTEuOTZMMTEuMTggNkgyMGMuNTUgMCAxIC40NSAxIDF2MTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZ2F2ZWwiPjxwYXRoIGQ9Ik0xIDIxaDEydjJIMXpNNS4yNDUgOC4wN2wyLjgzLTIuODI3IDE0LjE0IDE0LjE0Mi0yLjgyOCAyLjgyOHpNMTIuMzE3IDFsNS42NTcgNS42NTYtMi44MyAyLjgzLTUuNjU0LTUuNjZ6TTMuODI1IDkuNDg1bDUuNjU3IDUuNjU3LTIuODI4IDIuODI4LTUuNjU3LTUuNjU3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imdlc3R1cmUiPjxwYXRoIGQ9Ik00LjU5IDYuODljLjctLjcxIDEuNC0xLjM1IDEuNzEtMS4yMi41LjIgMCAxLjAzLS4zIDEuNTItLjI1LjQyLTIuODYgMy44OS0yLjg2IDYuMzEgMCAxLjI4LjQ4IDIuMzQgMS4zNCAyLjk4Ljc1LjU2IDEuNzQuNzMgMi42NC40NiAxLjA3LS4zMSAxLjk1LTEuNCAzLjA2LTIuNzcgMS4yMS0xLjQ5IDIuODMtMy40NCA0LjA4LTMuNDQgMS42MyAwIDEuNjUgMS4wMSAxLjc2IDEuNzktMy43OC42NC01LjM4IDMuNjctNS4zOCA1LjM3IDAgMS43IDEuNDQgMy4wOSAzLjIxIDMuMDkgMS42MyAwIDQuMjktMS4zMyA0LjY5LTYuMUgyMXYtMi41aC0yLjQ3Yy0uMTUtMS42NS0xLjA5LTQuMi00LjAzLTQuMi0yLjI1IDAtNC4xOCAxLjkxLTQuOTQgMi44NC0uNTguNzMtMi4wNiAyLjQ4LTIuMjkgMi43Mi0uMjUuMy0uNjguODQtMS4xMS44NC0uNDUgMC0uNzItLjgzLS4zNi0xLjkyLjM1LTEuMDkgMS40LTIuODYgMS44NS0zLjUyLjc4LTEuMTQgMS4zLTEuOTIgMS4zLTMuMjhDOC45NSAzLjY5IDcuMzEgMyA2LjQ0IDMgNS4xMiAzIDMuOTcgNCAzLjcyIDQuMjVjLS4zNi4zNi0uNjYuNjYtLjg4LjkzbDEuNzUgMS43MXptOS4yOSAxMS42NmMtLjMxIDAtLjc0LS4yNi0uNzQtLjcyIDAtLjYuNzMtMi4yIDIuODctMi43Ni0uMyAyLjY5LTEuNDMgMy40OC0yLjEzIDMuNDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZ2V0LWFwcCI+PHBhdGggZD0iTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXoiPjwvcGF0aD48L2c+CjxnIGlkPSJnaWYiPjxwYXRoIGQ9Ik0xMS41IDlIMTN2NmgtMS41ek05IDlINmMtLjYgMC0xIC41LTEgMXY0YzAgLjUuNCAxIDEgMWgzYy42IDAgMS0uNSAxLTF2LTJIOC41djEuNWgtMnYtM0gxMFYxMGMwLS41LS40LTEtMS0xem0xMCAxLjVWOWgtNC41djZIMTZ2LTJoMnYtMS41aC0ydi0xeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImdyYWRlIj48cGF0aCBkPSJNMTIgMTcuMjdMMTguMTggMjFsLTEuNjQtNy4wM0wyMiA5LjI0bC03LjE5LS42MUwxMiAyIDkuMTkgOC42MyAyIDkuMjRsNS40NiA0LjczTDUuODIgMjF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZ3JvdXAtd29yayI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6TTggMTcuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6TTkuNSA4YzAtMS4zOCAxLjEyLTIuNSAyLjUtMi41czIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNVM5LjUgOS4zOCA5LjUgOHptNi41IDkuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaGVscCI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTEgMTdoLTJ2LTJoMnYyem0yLjA3LTcuNzVsLS45LjkyQzEzLjQ1IDEyLjkgMTMgMTMuNSAxMyAxNWgtMnYtLjVjMC0xLjEuNDUtMi4xIDEuMTctMi44M2wxLjI0LTEuMjZjLjM3LS4zNi41OS0uODYuNTktMS40MSAwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDJIOGMwLTIuMjEgMS43OS00IDQtNHM0IDEuNzkgNCA0YzAgLjg4LS4zNiAxLjY4LS45MyAyLjI1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImhlbHAtb3V0bGluZSI+PHBhdGggZD0iTTExIDE4aDJ2LTJoLTJ2MnptMS0xNkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6bTAtMTRjLTIuMjEgMC00IDEuNzktNCA0aDJjMC0xLjEuOS0yIDItMnMyIC45IDIgMmMwIDItMyAxLjc1LTMgNWgyYzAtMi4yNSAzLTIuNSAzLTUgMC0yLjIxLTEuNzktNC00LTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaGlnaGxpZ2h0LW9mZiI+PHBhdGggZD0iTTE0LjU5IDhMMTIgMTAuNTkgOS40MSA4IDggOS40MSAxMC41OSAxMiA4IDE0LjU5IDkuNDEgMTYgMTIgMTMuNDEgMTQuNTkgMTYgMTYgMTQuNTkgMTMuNDEgMTIgMTYgOS40MSAxNC41OSA4ek0xMiAyQzYuNDcgMiAyIDYuNDcgMiAxMnM0LjQ3IDEwIDEwIDEwIDEwLTQuNDcgMTAtMTBTMTcuNTMgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJoaXN0b3J5Ij48cGF0aCBkPSJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImhvbWUiPjxwYXRoIGQ9Ik0xMCAyMHYtNmg0djZoNXYtOGgzTDEyIDMgMiAxMmgzdjh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaG91cmdsYXNzLWVtcHR5Ij48cGF0aCBkPSJNNiAydjZoLjAxTDYgOC4wMSAxMCAxMmwtNCA0IC4wMS4wMUg2VjIyaDEydi01Ljk5aC0uMDFMMTggMTZsLTQtNCA0LTMuOTktLjAxLS4wMUgxOFYySDZ6bTEwIDE0LjVWMjBIOHYtMy41bDQtNCA0IDR6bS00LTVsLTQtNFY0aDh2My41bC00IDR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaG91cmdsYXNzLWZ1bGwiPjxwYXRoIGQ9Ik02IDJ2NmguMDFMNiA4LjAxIDEwIDEybC00IDQgLjAxLjAxSDZWMjJoMTJ2LTUuOTloLS4wMUwxOCAxNmwtNC00IDQtMy45OS0uMDEtLjAxSDE4VjJINnoiPjwvcGF0aD48L2c+CjxnIGlkPSJodHRwIj48cGF0aCBkPSJNNC41IDExaC0yVjlIMXY2aDEuNXYtMi41aDJWMTVINlY5SDQuNXYyem0yLjUtLjVoMS41VjE1SDEwdi00LjVoMS41VjlIN3YxLjV6bTUuNSAwSDE0VjE1aDEuNXYtNC41SDE3VjloLTQuNXYxLjV6bTktMS41SDE4djZoMS41di0yaDJjLjggMCAxLjUtLjcgMS41LTEuNXYtMWMwLS44LS43LTEuNS0xLjUtMS41em0wIDIuNWgtMnYtMWgydjF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaHR0cHMiPjxwYXRoIGQ9Ik0xOCA4aC0xVjZjMC0yLjc2LTIuMjQtNS01LTVTNyAzLjI0IDcgNnYySDZjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWMTBjMC0xLjEtLjktMi0yLTJ6bS02IDljLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyem0zLjEtOUg4LjlWNmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMSAxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImltcG9ydGFudC1kZXZpY2VzIj48cGF0aCBkPSJNMjMgMTEuMDFMMTggMTFjLS41NSAwLTEgLjQ1LTEgMXY5YzAgLjU1LjQ1IDEgMSAxaDVjLjU1IDAgMS0uNDUgMS0xdi05YzAtLjU1LS40NS0uOTktMS0uOTl6TTIzIDIwaC01di03aDV2N3pNMjAgMkgyQy44OSAyIDAgMi44OSAwIDR2MTJjMCAxLjEuODkgMiAyIDJoN3YySDd2Mmg4di0yaC0ydi0yaDJ2LTJIMlY0aDE4djVoMlY0YzAtMS4xMS0uOS0yLTItMnptLTguMDMgN0wxMSA2bC0uOTcgM0g3bDIuNDcgMS43Ni0uOTQgMi45MSAyLjQ3LTEuOCAyLjQ3IDEuOC0uOTQtMi45MUwxNSA5aC0zLjAzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImluYm94Ij48cGF0aCBkPSJNMTkgM0g0Ljk5Yy0xLjExIDAtMS45OC44OS0xLjk4IDJMMyAxOWMwIDEuMS44OCAyIDEuOTkgMkgxOWMxLjEgMCAyLS45IDItMlY1YzAtMS4xMS0uOS0yLTItMnptMCAxMmgtNGMwIDEuNjYtMS4zNSAzLTMgM3MtMy0xLjM0LTMtM0g0Ljk5VjVIMTl2MTB6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaW5kZXRlcm1pbmF0ZS1jaGVjay1ib3giPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTIgMTBIN3YtMmgxMHYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImluZm8iPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE1aC0ydi02aDJ2NnptMC04aC0yVjdoMnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImluZm8tb3V0bGluZSI+PHBhdGggZD0iTTExIDE3aDJ2LTZoLTJ2NnptMS0xNUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6TTExIDloMlY3aC0ydjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaW5wdXQiPjxwYXRoIGQ9Ik0yMSAzLjAxSDNjLTEuMSAwLTIgLjktMiAyVjloMlY0Ljk5aDE4djE0LjAzSDNWMTVIMXY0LjAxYzAgMS4xLjkgMS45OCAyIDEuOThoMThjMS4xIDAgMi0uODggMi0xLjk4di0xNGMwLTEuMTEtLjktMi0yLTJ6TTExIDE2bDQtNC00LTR2M0gxdjJoMTB2M3oiPjwvcGF0aD48L2c+CjxnIGlkPSJpbnZlcnQtY29sb3JzIj48cGF0aCBkPSJNMTcuNjYgNy45M0wxMiAyLjI3IDYuMzQgNy45M2MtMy4xMiAzLjEyLTMuMTIgOC4xOSAwIDExLjMxQzcuOSAyMC44IDkuOTUgMjEuNTggMTIgMjEuNThjMi4wNSAwIDQuMS0uNzggNS42Ni0yLjM0IDMuMTItMy4xMiAzLjEyLTguMTkgMC0xMS4zMXpNMTIgMTkuNTljLTEuNiAwLTMuMTEtLjYyLTQuMjQtMS43NkM2LjYyIDE2LjY5IDYgMTUuMTkgNiAxMy41OXMuNjItMy4xMSAxLjc2LTQuMjRMMTIgNS4xdjE0LjQ5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImxhYmVsIj48cGF0aCBkPSJNMTcuNjMgNS44NEMxNy4yNyA1LjMzIDE2LjY3IDUgMTYgNUw1IDUuMDFDMy45IDUuMDEgMyA1LjkgMyA3djEwYzAgMS4xLjkgMS45OSAyIDEuOTlMMTYgMTljLjY3IDAgMS4yNy0uMzMgMS42My0uODRMMjIgMTJsLTQuMzctNi4xNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJsYWJlbC1vdXRsaW5lIj48cGF0aCBkPSJNMTcuNjMgNS44NEMxNy4yNyA1LjMzIDE2LjY3IDUgMTYgNUw1IDUuMDFDMy45IDUuMDEgMyA1LjkgMyA3djEwYzAgMS4xLjkgMS45OSAyIDEuOTlMMTYgMTljLjY3IDAgMS4yNy0uMzMgMS42My0uODRMMjIgMTJsLTQuMzctNi4xNnpNMTYgMTdINVY3aDExbDMuNTUgNUwxNiAxN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJsYW5ndWFnZSI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6bTYuOTMgNmgtMi45NWMtLjMyLTEuMjUtLjc4LTIuNDUtMS4zOC0zLjU2IDEuODQuNjMgMy4zNyAxLjkxIDQuMzMgMy41NnpNMTIgNC4wNGMuODMgMS4yIDEuNDggMi41MyAxLjkxIDMuOTZoLTMuODJjLjQzLTEuNDMgMS4wOC0yLjc2IDEuOTEtMy45NnpNNC4yNiAxNEM0LjEgMTMuMzYgNCAxMi42OSA0IDEycy4xLTEuMzYuMjYtMmgzLjM4Yy0uMDguNjYtLjE0IDEuMzItLjE0IDIgMCAuNjguMDYgMS4zNC4xNCAySDQuMjZ6bS44MiAyaDIuOTVjLjMyIDEuMjUuNzggMi40NSAxLjM4IDMuNTYtMS44NC0uNjMtMy4zNy0xLjktNC4zMy0zLjU2em0yLjk1LThINS4wOGMuOTYtMS42NiAyLjQ5LTIuOTMgNC4zMy0zLjU2QzguODEgNS41NSA4LjM1IDYuNzUgOC4wMyA4ek0xMiAxOS45NmMtLjgzLTEuMi0xLjQ4LTIuNTMtMS45MS0zLjk2aDMuODJjLS40MyAxLjQzLTEuMDggMi43Ni0xLjkxIDMuOTZ6TTE0LjM0IDE0SDkuNjZjLS4wOS0uNjYtLjE2LTEuMzItLjE2LTIgMC0uNjguMDctMS4zNS4xNi0yaDQuNjhjLjA5LjY1LjE2IDEuMzIuMTYgMiAwIC42OC0uMDcgMS4zNC0uMTYgMnptLjI1IDUuNTZjLjYtMS4xMSAxLjA2LTIuMzEgMS4zOC0zLjU2aDIuOTVjLS45NiAxLjY1LTIuNDkgMi45My00LjMzIDMuNTZ6TTE2LjM2IDE0Yy4wOC0uNjYuMTQtMS4zMi4xNC0yIDAtLjY4LS4wNi0xLjM0LS4xNC0yaDMuMzhjLjE2LjY0LjI2IDEuMzEuMjYgMnMtLjEgMS4zNi0uMjYgMmgtMy4zOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJsYXN0LXBhZ2UiPjxwYXRoIGQ9Ik01LjU5IDcuNDFMMTAuMTggMTJsLTQuNTkgNC41OUw3IDE4bDYtNi02LTZ6TTE2IDZoMnYxMmgtMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJsYXVuY2giPjxwYXRoIGQ9Ik0xOSAxOUg1VjVoN1YzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnYtN2gtMnY3ek0xNCAzdjJoMy41OWwtOS44MyA5LjgzIDEuNDEgMS40MUwxOSA2LjQxVjEwaDJWM2gtN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJsaWdodGJ1bGItb3V0bGluZSI+PHBhdGggZD0iTTkgMjFjMCAuNTUuNDUgMSAxIDFoNGMuNTUgMCAxLS40NSAxLTF2LTFIOXYxem0zLTE5QzguMTQgMiA1IDUuMTQgNSA5YzAgMi4zOCAxLjE5IDQuNDcgMyA1Ljc0VjE3YzAgLjU1LjQ1IDEgMSAxaDZjLjU1IDAgMS0uNDUgMS0xdi0yLjI2YzEuODEtMS4yNyAzLTMuMzYgMy01Ljc0IDAtMy44Ni0zLjE0LTctNy03em0yLjg1IDExLjFsLS44NS42VjE2aC00di0yLjNsLS44NS0uNkM3LjggMTIuMTYgNyAxMC42MyA3IDljMC0yLjc2IDIuMjQtNSA1LTVzNSAyLjI0IDUgNWMwIDEuNjMtLjggMy4xNi0yLjE1IDQuMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJsaW5lLXN0eWxlIj48cGF0aCBkPSJNMyAxNmg1di0ySDN2MnptNi41IDBoNXYtMmgtNXYyem02LjUgMGg1di0yaC01djJ6TTMgMjBoMnYtMkgzdjJ6bTQgMGgydi0ySDd2MnptNCAwaDJ2LTJoLTJ2MnptNCAwaDJ2LTJoLTJ2MnptNCAwaDJ2LTJoLTJ2MnpNMyAxMmg4di0ySDN2MnptMTAgMGg4di0yaC04djJ6TTMgNHY0aDE4VjRIM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJsaW5lLXdlaWdodCI+PHBhdGggZD0iTTMgMTdoMTh2LTJIM3Yyem0wIDNoMTh2LTFIM3Yxem0wLTdoMTh2LTNIM3Yzem0wLTl2NGgxOFY0SDN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibGluayI+PHBhdGggZD0iTTMuOSAxMmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMWg0VjdIN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNWg0di0xLjlIN2MtMS43MSAwLTMuMS0xLjM5LTMuMS0zLjF6TTggMTNoOHYtMkg4djJ6bTktNmgtNHYxLjloNGMxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXMtMS4zOSAzLjEtMy4xIDMuMWgtNFYxN2g0YzIuNzYgMCA1LTIuMjQgNS01cy0yLjI0LTUtNS01eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imxpc3QiPjxwYXRoIGQ9Ik0zIDEzaDJ2LTJIM3Yyem0wIDRoMnYtMkgzdjJ6bTAtOGgyVjdIM3Yyem00IDRoMTR2LTJIN3Yyem0wIDRoMTR2LTJIN3Yyek03IDd2MmgxNFY3SDd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibG9jayI+PHBhdGggZD0iTTE4IDhoLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2djJINmMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlYxMGMwLTEuMS0uOS0yLTItMnptLTYgOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6bTMuMS05SDguOVY2YzAtMS43MSAxLjM5LTMuMSAzLjEtMy4xIDEuNzEgMCAzLjEgMS4zOSAzLjEgMy4xdjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibG9jay1vcGVuIj48cGF0aCBkPSJNMTIgMTdjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0yLTIgLjktMiAyIC45IDIgMiAyem02LTloLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2aDEuOWMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMSAxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXYySDZjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWMTBjMC0xLjEtLjktMi0yLTJ6bTAgMTJINlYxMGgxMnYxMHoiPjwvcGF0aD48L2c+CjxnIGlkPSJsb2NrLW91dGxpbmUiPjxwYXRoIGQ9Ik0xMiAxN2MxLjEgMCAyLS45IDItMnMtLjktMi0yLTItMiAuOS0yIDIgLjkgMiAyIDJ6bTYtOWgtMVY2YzAtMi43Ni0yLjI0LTUtNS01UzcgMy4yNCA3IDZ2Mkg2Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjEwYzAtMS4xLS45LTItMi0yek04LjkgNmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMXMzLjEgMS4zOSAzLjEgMy4xdjJIOC45VjZ6TTE4IDIwSDZWMTBoMTJ2MTB6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibG93LXByaW9yaXR5Ij48cGF0aCBkPSJNMTQgNWg4djJoLTh6bTAgNS41aDh2MmgtOHptMCA1LjVoOHYyaC04ek0yIDExLjVDMiAxNS4wOCA0LjkyIDE4IDguNSAxOEg5djJsMy0zLTMtM3YyaC0uNUM2LjAyIDE2IDQgMTMuOTggNCAxMS41UzYuMDIgNyA4LjUgN0gxMlY1SDguNUM0LjkyIDUgMiA3LjkyIDIgMTEuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJsb3lhbHR5Ij48cGF0aCBkPSJNMjEuNDEgMTEuNThsLTktOUMxMi4wNSAyLjIyIDExLjU1IDIgMTEgMkg0Yy0xLjEgMC0yIC45LTIgMnY3YzAgLjU1LjIyIDEuMDUuNTkgMS40Mmw5IDljLjM2LjM2Ljg2LjU4IDEuNDEuNTguNTUgMCAxLjA1LS4yMiAxLjQxLS41OWw3LTdjLjM3LS4zNi41OS0uODYuNTktMS40MSAwLS41NS0uMjMtMS4wNi0uNTktMS40MnpNNS41IDdDNC42NyA3IDQgNi4zMyA0IDUuNVM0LjY3IDQgNS41IDQgNyA0LjY3IDcgNS41IDYuMzMgNyA1LjUgN3ptMTEuNzcgOC4yN0wxMyAxOS41NGwtNC4yNy00LjI3QzguMjggMTQuODEgOCAxNC4xOSA4IDEzLjVjMC0xLjM4IDEuMTItMi41IDIuNS0yLjUuNjkgMCAxLjMyLjI4IDEuNzcuNzRsLjczLjcyLjczLS43M2MuNDUtLjQ1IDEuMDgtLjczIDEuNzctLjczIDEuMzggMCAyLjUgMS4xMiAyLjUgMi41IDAgLjY5LS4yOCAxLjMyLS43MyAxLjc3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im1haWwiPjxwYXRoIGQ9Ik0yMCA0SDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgNGwtOCA1LTgtNVY2bDggNSA4LTV2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJtYXJrdW5yZWFkIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDRsLTggNS04LTVWNmw4IDUgOC01djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibWFya3VucmVhZC1tYWlsYm94Ij48cGF0aCBkPSJNMjAgNkgxMHY2SDhWNGg2VjBINnY2SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWOGMwLTEuMS0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJtZW51Ij48cGF0aCBkPSJNMyAxOGgxOHYtMkgzdjJ6bTAtNWgxOHYtMkgzdjJ6bTAtN3YyaDE4VjZIM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJtb3JlLWhvcml6Ij48cGF0aCBkPSJNNiAxMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTEyIDBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0tNiAwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJtb3JlLXZlcnQiPjxwYXRoIGQ9Ik0xMiA4YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptMCAyYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptMCA2Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJtb3RvcmN5Y2xlIj48cGF0aCBkPSJNMTkuNDQgOS4wM0wxNS40MSA1SDExdjJoMy41OWwyIDJINWMtMi44IDAtNSAyLjItNSA1czIuMiA1IDUgNWMyLjQ2IDAgNC40NS0xLjY5IDQuOS00aDEuNjVsMi43Ny0yLjc3Yy0uMjEuNTQtLjMyIDEuMTQtLjMyIDEuNzcgMCAyLjggMi4yIDUgNSA1czUtMi4yIDUtNWMwLTIuNjUtMS45Ny00Ljc3LTQuNTYtNC45N3pNNy44MiAxNUM3LjQgMTYuMTUgNi4yOCAxNyA1IDE3Yy0xLjYzIDAtMy0xLjM3LTMtM3MxLjM3LTMgMy0zYzEuMjggMCAyLjQuODUgMi44MiAySDV2MmgyLjgyek0xOSAxN2MtMS42NiAwLTMtMS4zNC0zLTNzMS4zNC0zIDMtMyAzIDEuMzQgMyAzLTEuMzQgMy0zIDN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibW92ZS10by1pbmJveCI+PHBhdGggZD0iTTE5IDNINC45OWMtMS4xMSAwLTEuOTguOS0xLjk4IDJMMyAxOWMwIDEuMS44OCAyIDEuOTkgMkgxOWMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDEyaC00YzAgMS42Ni0xLjM1IDMtMyAzcy0zLTEuMzQtMy0zSDQuOTlWNUgxOXYxMHptLTMtNWgtMlY3aC00djNIOGw0IDQgNC00eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im5leHQtd2VlayI+PHBhdGggZD0iTTIwIDdoLTRWNWMwLS41NS0uMjItMS4wNS0uNTktMS40MUMxNS4wNSAzLjIyIDE0LjU1IDMgMTQgM2gtNGMtMS4xIDAtMiAuOS0yIDJ2Mkg0Yy0xLjEgMC0yIC45LTIgMnYxMWMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjljMC0xLjEtLjktMi0yLTJ6TTEwIDVoNHYyaC00VjV6bTEgMTMuNWwtMS0xIDMtMy0zLTMgMS0xIDQgNC00IDR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibm90ZS1hZGQiPjxwYXRoIGQ9Ik0xNCAySDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAyMGMwIDEuMS44OSAyIDEuOTkgMkgxOGMxLjEgMCAyLS45IDItMlY4bC02LTZ6bTIgMTRoLTN2M2gtMnYtM0g4di0yaDN2LTNoMnYzaDN2MnptLTMtN1YzLjVMMTguNSA5SDEzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im9mZmxpbmUtcGluIj48cGF0aCBkPSJNMTIgMkM2LjUgMiAyIDYuNSAyIDEyczQuNSAxMCAxMCAxMCAxMC00LjUgMTAtMTBTMTcuNSAyIDEyIDJ6bTUgMTZIN3YtMmgxMHYyem0tNi43LTRMNyAxMC43bDEuNC0xLjQgMS45IDEuOSA1LjMtNS4zTDE3IDcuMyAxMC4zIDE0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im9wYWNpdHkiPjxwYXRoIGQ9Ik0xNy42NiA4TDEyIDIuMzUgNi4zNCA4QzQuNzggOS41NiA0IDExLjY0IDQgMTMuNjRzLjc4IDQuMTEgMi4zNCA1LjY3IDMuNjEgMi4zNSA1LjY2IDIuMzUgNC4xLS43OSA1LjY2LTIuMzVTMjAgMTUuNjQgMjAgMTMuNjQgMTkuMjIgOS41NiAxNy42NiA4ek02IDE0Yy4wMS0yIC42Mi0zLjI3IDEuNzYtNC40TDEyIDUuMjdsNC4yNCA0LjM4QzE3LjM4IDEwLjc3IDE3Ljk5IDEyIDE4IDE0SDZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ib3Blbi1pbi1icm93c2VyIj48cGF0aCBkPSJNMTkgNEg1Yy0xLjExIDAtMiAuOS0yIDJ2MTJjMCAxLjEuODkgMiAyIDJoNHYtMkg1VjhoMTR2MTBoLTR2Mmg0YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjg5LTItMi0yem0tNyA2bC00IDRoM3Y2aDJ2LTZoM2wtNC00eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im9wZW4taW4tbmV3Ij48cGF0aCBkPSJNMTkgMTlINVY1aDdWM0g1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJ2LTdoLTJ2N3pNMTQgM3YyaDMuNTlsLTkuODMgOS44MyAxLjQxIDEuNDFMMTkgNi40MVYxMGgyVjNoLTd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ib3Blbi13aXRoIj48cGF0aCBkPSJNMTAgOWg0VjZoM2wtNS01LTUgNWgzdjN6bS0xIDFINlY3bC01IDUgNSA1di0zaDN2LTR6bTE0IDJsLTUtNXYzaC0zdjRoM3YzbDUtNXptLTkgM2gtNHYzSDdsNSA1IDUtNWgtM3YtM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJwYWdldmlldyI+PHBhdGggZD0iTTExLjUgOUMxMC4xMiA5IDkgMTAuMTIgOSAxMS41czEuMTIgMi41IDIuNSAyLjUgMi41LTEuMTIgMi41LTIuNVMxMi44OCA5IDExLjUgOXpNMjAgNEg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bS0zLjIxIDE0LjIxbC0yLjkxLTIuOTFjLS42OS40NC0xLjUxLjctMi4zOS43QzkuMDEgMTYgNyAxMy45OSA3IDExLjVTOS4wMSA3IDExLjUgNyAxNiA5LjAxIDE2IDExLjVjMCAuODgtLjI2IDEuNjktLjcgMi4zOWwyLjkxIDIuOS0xLjQyIDEuNDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGFuLXRvb2wiPjxwYXRoIGQ9Ik0yMyA1LjVWMjBjMCAyLjItMS44IDQtNCA0aC03LjNjLTEuMDggMC0yLjEtLjQzLTIuODUtMS4xOUwxIDE0LjgzczEuMjYtMS4yMyAxLjMtMS4yNWMuMjItLjE5LjQ5LS4yOS43OS0uMjkuMjIgMCAuNDIuMDYuNi4xNi4wNC4wMSA0LjMxIDIuNDYgNC4zMSAyLjQ2VjRjMC0uODMuNjctMS41IDEuNS0xLjVTMTEgMy4xNyAxMSA0djdoMVYxLjVjMC0uODMuNjctMS41IDEuNS0xLjVTMTUgLjY3IDE1IDEuNVYxMWgxVjIuNWMwLS44My42Ny0xLjUgMS41LTEuNXMxLjUuNjcgMS41IDEuNVYxMWgxVjUuNWMwLS44My42Ny0xLjUgMS41LTEuNXMxLjUuNjcgMS41IDEuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJwYXltZW50Ij48cGF0aCBkPSJNMjAgNEg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY2YzAtMS4xMS0uODktMi0yLTJ6bTAgMTRINHYtNmgxNnY2em0wLTEwSDRWNmgxNnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBlcm0tY2FtZXJhLW1pYyI+PHBhdGggZD0iTTIwIDVoLTMuMTdMMTUgM0g5TDcuMTcgNUg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDd2LTIuMDljLTIuODMtLjQ4LTUtMi45NC01LTUuOTFoMmMwIDIuMjEgMS43OSA0IDQgNHM0LTEuNzkgNC00aDJjMCAyLjk3LTIuMTcgNS40My01IDUuOTFWMjFoN2MxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yem0tNiA4YzAgMS4xLS45IDItMiAycy0yLS45LTItMlY5YzAtMS4xLjktMiAyLTJzMiAuOSAyIDJ2NHoiPjwvcGF0aD48L2c+CjxnIGlkPSJwZXJtLWNvbnRhY3QtY2FsZW5kYXIiPjxwYXRoIGQ9Ik0xOSAzaC0xVjFoLTJ2Mkg4VjFINnYySDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAzYzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptNiAxMkg2di0xYzAtMiA0LTMuMSA2LTMuMXM2IDEuMSA2IDMuMXYxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBlcm0tZGF0YS1zZXR0aW5nIj48cGF0aCBkPSJNMTguOTkgMTEuNWMuMzQgMCAuNjcuMDMgMSAuMDdMMjAgMCAwIDIwaDExLjU2Yy0uMDQtLjMzLS4wNy0uNjYtLjA3LTEgMC00LjE0IDMuMzYtNy41IDcuNS03LjV6bTMuNzEgNy45OWMuMDItLjE2LjA0LS4zMi4wNC0uNDkgMC0uMTctLjAxLS4zMy0uMDQtLjQ5bDEuMDYtLjgzYy4wOS0uMDguMTItLjIxLjA2LS4zMmwtMS0xLjczYy0uMDYtLjExLS4xOS0uMTUtLjMxLS4xMWwtMS4yNC41Yy0uMjYtLjItLjU0LS4zNy0uODUtLjQ5bC0uMTktMS4zMmMtLjAxLS4xMi0uMTItLjIxLS4yNC0uMjFoLTJjLS4xMiAwLS4yMy4wOS0uMjUuMjFsLS4xOSAxLjMyYy0uMy4xMy0uNTkuMjktLjg1LjQ5bC0xLjI0LS41Yy0uMTEtLjA0LS4yNCAwLS4zMS4xMWwtMSAxLjczYy0uMDYuMTEtLjA0LjI0LjA2LjMybDEuMDYuODNjLS4wMi4xNi0uMDMuMzItLjAzLjQ5IDAgLjE3LjAxLjMzLjAzLjQ5bC0xLjA2LjgzYy0uMDkuMDgtLjEyLjIxLS4wNi4zMmwxIDEuNzNjLjA2LjExLjE5LjE1LjMxLjExbDEuMjQtLjVjLjI2LjIuNTQuMzcuODUuNDlsLjE5IDEuMzJjLjAyLjEyLjEyLjIxLjI1LjIxaDJjLjEyIDAgLjIzLS4wOS4yNS0uMjFsLjE5LTEuMzJjLjMtLjEzLjU5LS4yOS44NC0uNDlsMS4yNS41Yy4xMS4wNC4yNCAwIC4zMS0uMTFsMS0xLjczYy4wNi0uMTEuMDMtLjI0LS4wNi0uMzJsLTEuMDctLjgzem0tMy43MSAxLjAxYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVzLjY3LTEuNSAxLjUtMS41IDEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJwZXJtLWRldmljZS1pbmZvcm1hdGlvbiI+PHBhdGggZD0iTTEzIDdoLTJ2MmgyVjd6bTAgNGgtMnY2aDJ2LTZ6bTQtOS45OUw3IDFjLTEuMSAwLTIgLjktMiAydjE4YzAgMS4xLjkgMiAyIDJoMTBjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0xLjk5LTItMS45OXpNMTcgMTlIN1Y1aDEwdjE0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBlcm0taWRlbnRpdHkiPjxwYXRoIGQ9Ik0xMiA1LjljMS4xNiAwIDIuMS45NCAyLjEgMi4xcy0uOTQgMi4xLTIuMSAyLjFTOS45IDkuMTYgOS45IDhzLjk0LTIuMSAyLjEtMi4xbTAgOWMyLjk3IDAgNi4xIDEuNDYgNi4xIDIuMXYxLjFINS45VjE3YzAtLjY0IDMuMTMtMi4xIDYuMS0yLjFNMTIgNEM5Ljc5IDQgOCA1Ljc5IDggOHMxLjc5IDQgNCA0IDQtMS43OSA0LTQtMS43OS00LTQtNHptMCA5Yy0yLjY3IDAtOCAxLjM0LTggNHYzaDE2di0zYzAtMi42Ni01LjMzLTQtOC00eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBlcm0tbWVkaWEiPjxwYXRoIGQ9Ik0yIDZIMHY1aC4wMUwwIDIwYzAgMS4xLjkgMiAyIDJoMTh2LTJIMlY2em0yMC0yaC04bC0yLTJINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDE2YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnpNNyAxNWw0LjUtNiAzLjUgNC41MSAyLjUtMy4wMUwyMSAxNUg3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBlcm0tcGhvbmUtbXNnIj48cGF0aCBkPSJNMjAgMTUuNWMtMS4yNSAwLTIuNDUtLjItMy41Ny0uNTctLjM1LS4xMS0uNzQtLjAzLTEuMDIuMjRsLTIuMiAyLjJjLTIuODMtMS40NC01LjE1LTMuNzUtNi41OS02LjU4bDIuMi0yLjIxYy4yOC0uMjcuMzYtLjY2LjI1LTEuMDFDOC43IDYuNDUgOC41IDUuMjUgOC41IDRjMC0uNTUtLjQ1LTEtMS0xSDRjLS41NSAwLTEgLjQ1LTEgMSAwIDkuMzkgNy42MSAxNyAxNyAxNyAuNTUgMCAxLS40NSAxLTF2LTMuNWMwLS41NS0uNDUtMS0xLTF6TTEyIDN2MTBsMy0zaDZWM2gtOXoiPjwvcGF0aD48L2c+CjxnIGlkPSJwZXJtLXNjYW4td2lmaSI+PHBhdGggZD0iTTEyIDNDNi45NSAzIDMuMTUgNC44NSAwIDcuMjNMMTIgMjIgMjQgNy4yNUMyMC44NSA0Ljg3IDE3LjA1IDMgMTIgM3ptMSAxM2gtMnYtNmgydjZ6bS0yLThWNmgydjJoLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGV0cyI+PGNpcmNsZSBjeD0iNC41IiBjeT0iOS41IiByPSIyLjUiPjwvY2lyY2xlPjxjaXJjbGUgY3g9IjkiIGN5PSI1LjUiIHI9IjIuNSI+PC9jaXJjbGU+PGNpcmNsZSBjeD0iMTUiIGN5PSI1LjUiIHI9IjIuNSI+PC9jaXJjbGU+PGNpcmNsZSBjeD0iMTkuNSIgY3k9IjkuNSIgcj0iMi41Ij48L2NpcmNsZT48cGF0aCBkPSJNMTcuMzQgMTQuODZjLS44Ny0xLjAyLTEuNi0xLjg5LTIuNDgtMi45MS0uNDYtLjU0LTEuMDUtMS4wOC0xLjc1LTEuMzItLjExLS4wNC0uMjItLjA3LS4zMy0uMDktLjI1LS4wNC0uNTItLjA0LS43OC0uMDRzLS41MyAwLS43OS4wNWMtLjExLjAyLS4yMi4wNS0uMzMuMDktLjcuMjQtMS4yOC43OC0xLjc1IDEuMzItLjg3IDEuMDItMS42IDEuODktMi40OCAyLjkxLTEuMzEgMS4zMS0yLjkyIDIuNzYtMi42MiA0Ljc5LjI5IDEuMDIgMS4wMiAyLjAzIDIuMzMgMi4zMi43My4xNSAzLjA2LS40NCA1LjU0LS40NGguMThjMi40OCAwIDQuODEuNTggNS41NC40NCAxLjMxLS4yOSAyLjA0LTEuMzEgMi4zMy0yLjMyLjMxLTIuMDQtMS4zLTMuNDktMi42MS00Ljh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGljdHVyZS1pbi1waWN0dXJlIj48cGF0aCBkPSJNMTkgN2gtOHY2aDhWN3ptMi00SDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMS45OCAyIDEuOThoMThjMS4xIDAgMi0uODggMi0xLjk4VjVjMC0xLjEtLjktMi0yLTJ6bTAgMTYuMDFIM1Y0Ljk4aDE4djE0LjAzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBpY3R1cmUtaW4tcGljdHVyZS1hbHQiPjxwYXRoIGQ9Ik0xOSAxMWgtOHY2aDh2LTZ6bTQgOFY0Ljk4QzIzIDMuODggMjIuMSAzIDIxIDNIM2MtMS4xIDAtMiAuODgtMiAxLjk4VjE5YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJ6bS0yIC4wMkgzVjQuOTdoMTh2MTQuMDV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGxheS1mb3Itd29yayI+PHBhdGggZD0iTTExIDV2NS41OUg3LjVsNC41IDQuNSA0LjUtNC41SDEzVjVoLTJ6bS01IDljMCAzLjMxIDIuNjkgNiA2IDZzNi0yLjY5IDYtNmgtMmMwIDIuMjEtMS43OSA0LTQgNHMtNC0xLjc5LTQtNEg2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBvbHltZXIiPjxwYXRoIGQ9Ik0xOSA0aC00TDcuMTEgMTYuNjMgNC41IDEyIDkgNEg1TC41IDEyIDUgMjBoNGw3Ljg5LTEyLjYzTDE5LjUgMTIgMTUgMjBoNGw0LjUtOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJwb3dlci1zZXR0aW5ncy1uZXciPjxwYXRoIGQ9Ik0xMyAzaC0ydjEwaDJWM3ptNC44MyAyLjE3bC0xLjQyIDEuNDJDMTcuOTkgNy44NiAxOSA5LjgxIDE5IDEyYzAgMy44Ny0zLjEzIDctNyA3cy03LTMuMTMtNy03YzAtMi4xOSAxLjAxLTQuMTQgMi41OC01LjQyTDYuMTcgNS4xN0M0LjIzIDYuODIgMyA5LjI2IDMgMTJjMCA0Ljk3IDQuMDMgOSA5IDlzOS00LjAzIDktOWMwLTIuNzQtMS4yMy01LjE4LTMuMTctNi44M3oiPjwvcGF0aD48L2c+CjxnIGlkPSJwcmVnbmFudC13b21hbiI+PHBhdGggZD0iTTkgNGMwLTEuMTEuODktMiAyLTJzMiAuODkgMiAyLS44OSAyLTIgMi0yLS44OS0yLTJ6bTcgOWMtLjAxLTEuMzQtLjgzLTIuNTEtMi0zIDAtMS42Ni0xLjM0LTMtMy0zcy0zIDEuMzQtMyAzdjdoMnY1aDN2LTVoM3YtNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJwcmludCI+PHBhdGggZD0iTTE5IDhINWMtMS42NiAwLTMgMS4zNC0zIDN2Nmg0djRoMTJ2LTRoNHYtNmMwLTEuNjYtMS4zNC0zLTMtM3ptLTMgMTFIOHYtNWg4djV6bTMtN2MtLjU1IDAtMS0uNDUtMS0xcy40NS0xIDEtMSAxIC40NSAxIDEtLjQ1IDEtMSAxem0tMS05SDZ2NGgxMlYzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InF1ZXJ5LWJ1aWxkZXIiPjxwYXRoIGQ9Ik0xMS45OSAyQzYuNDcgMiAyIDYuNDggMiAxMnM0LjQ3IDEwIDkuOTkgMTBDMTcuNTIgMjIgMjIgMTcuNTIgMjIgMTJTMTcuNTIgMiAxMS45OSAyek0xMiAyMGMtNC40MiAwLTgtMy41OC04LThzMy41OC04IDgtOCA4IDMuNTggOCA4LTMuNTggOC04IDh6bS41LTEzSDExdjZsNS4yNSAzLjE1Ljc1LTEuMjMtNC41LTIuNjd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icXVlc3Rpb24tYW5zd2VyIj48cGF0aCBkPSJNMjEgNmgtMnY5SDZ2MmMwIC41NS40NSAxIDEgMWgxMWw0IDRWN2MwLS41NS0uNDUtMS0xLTF6bS00IDZWM2MwLS41NS0uNDUtMS0xLTFIM2MtLjU1IDAtMSAuNDUtMSAxdjE0bDQtNGgxMGMuNTUgMCAxLS40NSAxLTF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmFkaW8tYnV0dG9uLWNoZWNrZWQiPjxwYXRoIGQ9Ik0xMiA3Yy0yLjc2IDAtNSAyLjI0LTUgNXMyLjI0IDUgNSA1IDUtMi4yNCA1LTUtMi4yNC01LTUtNXptMC01QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJyYWRpby1idXR0b24tdW5jaGVja2VkIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MiAwLTgtMy41OC04LThzMy41OC04IDgtOCA4IDMuNTggOCA4LTMuNTggOC04IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmVjZWlwdCI+PHBhdGggZD0iTTE4IDE3SDZ2LTJoMTJ2MnptMC00SDZ2LTJoMTJ2MnptMC00SDZWN2gxMnYyek0zIDIybDEuNS0xLjVMNiAyMmwxLjUtMS41TDkgMjJsMS41LTEuNUwxMiAyMmwxLjUtMS41TDE1IDIybDEuNS0xLjVMMTggMjJsMS41LTEuNUwyMSAyMlYybC0xLjUgMS41TDE4IDJsLTEuNSAxLjVMMTUgMmwtMS41IDEuNUwxMiAybC0xLjUgMS41TDkgMiA3LjUgMy41IDYgMiA0LjUgMy41IDMgMnYyMHoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZWNvcmQtdm9pY2Utb3ZlciI+PGNpcmNsZSBjeD0iOSIgY3k9IjkiIHI9IjQiPjwvY2lyY2xlPjxwYXRoIGQ9Ik05IDE1Yy0yLjY3IDAtOCAxLjM0LTggNHYyaDE2di0yYzAtMi42Ni01LjMzLTQtOC00em03Ljc2LTkuNjRsLTEuNjggMS42OWMuODQgMS4xOC44NCAyLjcxIDAgMy44OWwxLjY4IDEuNjljMi4wMi0yLjAyIDIuMDItNS4wNyAwLTcuMjd6TTIwLjA3IDJsLTEuNjMgMS42M2MyLjc3IDMuMDIgMi43NyA3LjU2IDAgMTAuNzRMMjAuMDcgMTZjMy45LTMuODkgMy45MS05Ljk1IDAtMTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmVkZWVtIj48cGF0aCBkPSJNMjAgNmgtMi4xOGMuMTEtLjMxLjE4LS42NS4xOC0xIDAtMS42Ni0xLjM0LTMtMy0zLTEuMDUgMC0xLjk2LjU0LTIuNSAxLjM1bC0uNS42Ny0uNS0uNjhDMTAuOTYgMi41NCAxMC4wNSAyIDkgMiA3LjM0IDIgNiAzLjM0IDYgNWMwIC4zNS4wNy42OS4xOCAxSDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE5YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjhjMC0xLjExLS44OS0yLTItMnptLTUtMmMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xek05IDRjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMTEgMTVINHYtMmgxNnYyem0wLTVINFY4aDUuMDhMNyAxMC44MyA4LjYyIDEyIDExIDguNzZsMS0xLjM2IDEgMS4zNkwxNS4zOCAxMiAxNyAxMC44MyAxNC45MiA4SDIwdjZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmVkbyI+PHBhdGggZD0iTTE4LjQgMTAuNkMxNi41NSA4Ljk5IDE0LjE1IDggMTEuNSA4Yy00LjY1IDAtOC41OCAzLjAzLTkuOTYgNy4yMkwzLjkgMTZjMS4wNS0zLjE5IDQuMDUtNS41IDcuNi01LjUgMS45NSAwIDMuNzMuNzIgNS4xMiAxLjg4TDEzIDE2aDlWN2wtMy42IDMuNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZWZyZXNoIj48cGF0aCBkPSJNMTcuNjUgNi4zNUMxNi4yIDQuOSAxNC4yMSA0IDEyIDRjLTQuNDIgMC03Ljk5IDMuNTgtNy45OSA4czMuNTcgOCA3Ljk5IDhjMy43MyAwIDYuODQtMi41NSA3LjczLTZoLTIuMDhjLS44MiAyLjMzLTMuMDQgNC01LjY1IDQtMy4zMSAwLTYtMi42OS02LTZzMi42OS02IDYtNmMxLjY2IDAgMy4xNC42OSA0LjIyIDEuNzhMMTMgMTFoN1Y0bC0yLjM1IDIuMzV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmVtb3ZlIj48cGF0aCBkPSJNMTkgMTNINXYtMmgxNHYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJlbW92ZS1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem01IDExSDd2LTJoMTB2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZW1vdmUtY2lyY2xlLW91dGxpbmUiPjxwYXRoIGQ9Ik03IDExdjJoMTB2LTJIN3ptNS05QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZW1vdmUtc2hvcHBpbmctY2FydCI+PHBhdGggZD0iTTIyLjczIDIyLjczTDIuNzcgMi43NyAyIDJsLS43My0uNzNMMCAyLjU0bDQuMzkgNC4zOSAyLjIxIDQuNjYtMS4zNSAyLjQ1Yy0uMTYuMjgtLjI1LjYxLS4yNS45NiAwIDEuMS45IDIgMiAyaDcuNDZsMS4zOCAxLjM4Yy0uNS4zNi0uODMuOTUtLjgzIDEuNjIgMCAxLjEuODkgMiAxLjk5IDIgLjY3IDAgMS4yNi0uMzMgMS42Mi0uODRMMjEuNDYgMjRsMS4yNy0xLjI3ek03LjQyIDE1Yy0uMTQgMC0uMjUtLjExLS4yNS0uMjVsLjAzLS4xMi45LTEuNjNoMi4zNmwyIDJINy40MnptOC4xMy0yYy43NSAwIDEuNDEtLjQxIDEuNzUtMS4wM2wzLjU4LTYuNDljLjA4LS4xNC4xMi0uMzEuMTItLjQ4IDAtLjU1LS40NS0xLTEtMUg2LjU0bDkuMDEgOXpNNyAxOGMtMS4xIDAtMS45OS45LTEuOTkgMlM1LjkgMjIgNyAyMnMyLS45IDItMi0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZW9yZGVyIj48cGF0aCBkPSJNMyAxNWgxOHYtMkgzdjJ6bTAgNGgxOHYtMkgzdjJ6bTAtOGgxOFY5SDN2MnptMC02djJoMThWNUgzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJlcGx5Ij48cGF0aCBkPSJNMTAgOVY1bC03IDcgNyA3di00LjFjNSAwIDguNSAxLjYgMTEgNS4xLTEtNS00LTEwLTExLTExeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJlcGx5LWFsbCI+PHBhdGggZD0iTTcgOFY1bC03IDcgNyA3di0zbC00LTQgNC00em02IDFWNWwtNyA3IDcgN3YtNC4xYzUgMCA4LjUgMS42IDExIDUuMS0xLTUtNC0xMC0xMS0xMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZXBvcnQiPjxwYXRoIGQ9Ik0xNS43MyAzSDguMjdMMyA4LjI3djcuNDZMOC4yNyAyMWg3LjQ2TDIxIDE1LjczVjguMjdMMTUuNzMgM3pNMTIgMTcuM2MtLjcyIDAtMS4zLS41OC0xLjMtMS4zIDAtLjcyLjU4LTEuMyAxLjMtMS4zLjcyIDAgMS4zLjU4IDEuMyAxLjMgMCAuNzItLjU4IDEuMy0xLjMgMS4zem0xLTQuM2gtMlY3aDJ2NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZXBvcnQtcHJvYmxlbSI+PHBhdGggZD0iTTEgMjFoMjJMMTIgMiAxIDIxem0xMi0zaC0ydi0yaDJ2MnptMC00aC0ydi00aDJ2NHoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZXN0b3JlIj48cGF0aCBkPSJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJlc3RvcmUtcGFnZSI+PHBhdGggZD0iTTE0IDJINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDIwYzAgMS4xLjg5IDIgMS45OSAySDE4YzEuMSAwIDItLjkgMi0yVjhsLTYtNnptLTIgMTZjLTIuMDUgMC0zLjgxLTEuMjQtNC41OC0zaDEuNzFjLjYzLjkgMS42OCAxLjUgMi44NyAxLjUgMS45MyAwIDMuNS0xLjU3IDMuNS0zLjVTMTMuOTMgOS41IDEyIDkuNWMtMS4zNSAwLTIuNTIuNzgtMy4xIDEuOWwxLjYgMS42aC00VjlsMS4zIDEuM0M4LjY5IDguOTIgMTAuMjMgOCAxMiA4YzIuNzYgMCA1IDIuMjQgNSA1cy0yLjI0IDUtNSA1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJvb20iPjxwYXRoIGQ9Ik0xMiAyQzguMTMgMiA1IDUuMTMgNSA5YzAgNS4yNSA3IDEzIDcgMTNzNy03Ljc1IDctMTNjMC0zLjg3LTMuMTMtNy03LTd6bTAgOS41Yy0xLjM4IDAtMi41LTEuMTItMi41LTIuNXMxLjEyLTIuNSAyLjUtMi41IDIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJyb3VuZGVkLWNvcm5lciI+PHBhdGggZD0iTTE5IDE5aDJ2MmgtMnYtMnptMC0yaDJ2LTJoLTJ2MnpNMyAxM2gydi0ySDN2MnptMCA0aDJ2LTJIM3Yyem0wLThoMlY3SDN2MnptMC00aDJWM0gzdjJ6bTQgMGgyVjNIN3Yyem04IDE2aDJ2LTJoLTJ2MnptLTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6bS04IDBoMnYtMkg3djJ6bS00IDBoMnYtMkgzdjJ6TTIxIDhjMC0yLjc2LTIuMjQtNS01LTVoLTV2Mmg1YzEuNjUgMCAzIDEuMzUgMyAzdjVoMlY4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJvd2luZyI+PHBhdGggZD0iTTguNSAxNC41TDQgMTlsMS41IDEuNUw5IDE3aDJsLTIuNS0yLjV6TTE1IDFjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem02IDIwLjAxTDE4IDI0bC0yLjk5LTMuMDFWMTkuNWwtNy4xLTcuMDljLS4zMS4wNS0uNjEuMDctLjkxLjA3di0yLjE2YzEuNjYuMDMgMy42MS0uODcgNC42Ny0yLjA0bDEuNC0xLjU1Yy4xOS0uMjEuNDMtLjM4LjY5LS41LjI5LS4xNC42Mi0uMjMuOTYtLjIzaC4wM0MxNS45OSA2LjAxIDE3IDcuMDIgMTcgOC4yNnY1Ljc1YzAgLjg0LS4zNSAxLjYxLS45MiAyLjE2bC0zLjU4LTMuNTh2LTIuMjdjLS42My41Mi0xLjQzIDEuMDItMi4yOSAxLjM5TDE2LjUgMThIMThsMyAzLjAxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNhdmUiPjxwYXRoIGQ9Ik0xNyAzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY3bC00LTR6bS01IDE2Yy0xLjY2IDAtMy0xLjM0LTMtM3MxLjM0LTMgMy0zIDMgMS4zNCAzIDMtMS4zNCAzLTMgM3ptMy0xMEg1VjVoMTB2NHoiPjwvcGF0aD48L2c+CjxnIGlkPSJzY2hlZHVsZSI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6TTEyIDIwYy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHptLjUtMTNIMTF2Nmw1LjI1IDMuMTUuNzUtMS4yMy00LjUtMi42N3oiPjwvcGF0aD48L2c+CjxnIGlkPSJzZWFyY2giPjxwYXRoIGQ9Ik0xNS41IDE0aC0uNzlsLS4yOC0uMjdDMTUuNDEgMTIuNTkgMTYgMTEuMTEgMTYgOS41IDE2IDUuOTEgMTMuMDkgMyA5LjUgM1MzIDUuOTEgMyA5LjUgNS45MSAxNiA5LjUgMTZjMS42MSAwIDMuMDktLjU5IDQuMjMtMS41N2wuMjcuMjh2Ljc5bDUgNC45OUwyMC40OSAxOWwtNC45OS01em0tNiAwQzcuMDEgMTQgNSAxMS45OSA1IDkuNVM3LjAxIDUgOS41IDUgMTQgNy4wMSAxNCA5LjUgMTEuOTkgMTQgOS41IDE0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNlbGVjdC1hbGwiPjxwYXRoIGQ9Ik0zIDVoMlYzYy0xLjEgMC0yIC45LTIgMnptMCA4aDJ2LTJIM3Yyem00IDhoMnYtMkg3djJ6TTMgOWgyVjdIM3Yyem0xMC02aC0ydjJoMlYzem02IDB2MmgyYzAtMS4xLS45LTItMi0yek01IDIxdi0ySDNjMCAxLjEuOSAyIDIgMnptLTItNGgydi0ySDN2MnpNOSAzSDd2MmgyVjN6bTIgMThoMnYtMmgtMnYyem04LThoMnYtMmgtMnYyem0wIDhjMS4xIDAgMi0uOSAyLTJoLTJ2MnptMC0xMmgyVjdoLTJ2MnptMCA4aDJ2LTJoLTJ2MnptLTQgNGgydi0yaC0ydjJ6bTAtMTZoMlYzaC0ydjJ6TTcgMTdoMTBWN0g3djEwem0yLThoNnY2SDlWOXoiPjwvcGF0aD48L2c+CjxnIGlkPSJzZW5kIj48cGF0aCBkPSJNMi4wMSAyMUwyMyAxMiAyLjAxIDMgMiAxMGwxNSAyLTE1IDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3MiPjxwYXRoIGQ9Ik0xOS40MyAxMi45OGMuMDQtLjMyLjA3LS42NC4wNy0uOThzLS4wMy0uNjYtLjA3LS45OGwyLjExLTEuNjVjLjE5LS4xNS4yNC0uNDIuMTItLjY0bC0yLTMuNDZjLS4xMi0uMjItLjM5LS4zLS42MS0uMjJsLTIuNDkgMWMtLjUyLS40LTEuMDgtLjczLTEuNjktLjk4bC0uMzgtMi42NUMxNC40NiAyLjE4IDE0LjI1IDIgMTQgMmgtNGMtLjI1IDAtLjQ2LjE4LS40OS40MmwtLjM4IDIuNjVjLS42MS4yNS0xLjE3LjU5LTEuNjkuOThsLTIuNDktMWMtLjIzLS4wOS0uNDkgMC0uNjEuMjJsLTIgMy40NmMtLjEzLjIyLS4wNy40OS4xMi42NGwyLjExIDEuNjVjLS4wNC4zMi0uMDcuNjUtLjA3Ljk4cy4wMy42Ni4wNy45OGwtMi4xMSAxLjY1Yy0uMTkuMTUtLjI0LjQyLS4xMi42NGwyIDMuNDZjLjEyLjIyLjM5LjMuNjEuMjJsMi40OS0xYy41Mi40IDEuMDguNzMgMS42OS45OGwuMzggMi42NWMuMDMuMjQuMjQuNDIuNDkuNDJoNGMuMjUgMCAuNDYtLjE4LjQ5LS40MmwuMzgtMi42NWMuNjEtLjI1IDEuMTctLjU5IDEuNjktLjk4bDIuNDkgMWMuMjMuMDkuNDkgMCAuNjEtLjIybDItMy40NmMuMTItLjIyLjA3LS40OS0uMTItLjY0bC0yLjExLTEuNjV6TTEyIDE1LjVjLTEuOTMgMC0zLjUtMS41Ny0zLjUtMy41czEuNTctMy41IDMuNS0zLjUgMy41IDEuNTcgMy41IDMuNS0xLjU3IDMuNS0zLjUgMy41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLWFwcGxpY2F0aW9ucyI+PHBhdGggZD0iTTEyIDEwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptNy03SDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uOSAyLTJWNWMwLTEuMS0uODktMi0yLTJ6bS0xLjc1IDljMCAuMjMtLjAyLjQ2LS4wNS42OGwxLjQ4IDEuMTZjLjEzLjExLjE3LjMuMDguNDVsLTEuNCAyLjQyYy0uMDkuMTUtLjI3LjIxLS40My4xNWwtMS43NC0uN2MtLjM2LjI4LS43Ni41MS0xLjE4LjY5bC0uMjYgMS44NWMtLjAzLjE3LS4xOC4zLS4zNS4zaC0yLjhjLS4xNyAwLS4zMi0uMTMtLjM1LS4yOWwtLjI2LTEuODVjLS40My0uMTgtLjgyLS40MS0xLjE4LS42OWwtMS43NC43Yy0uMTYuMDYtLjM0IDAtLjQzLS4xNWwtMS40LTIuNDJjLS4wOS0uMTUtLjA1LS4zNC4wOC0uNDVsMS40OC0xLjE2Yy0uMDMtLjIzLS4wNS0uNDYtLjA1LS42OSAwLS4yMy4wMi0uNDYuMDUtLjY4bC0xLjQ4LTEuMTZjLS4xMy0uMTEtLjE3LS4zLS4wOC0uNDVsMS40LTIuNDJjLjA5LS4xNS4yNy0uMjEuNDMtLjE1bDEuNzQuN2MuMzYtLjI4Ljc2LS41MSAxLjE4LS42OWwuMjYtMS44NWMuMDMtLjE3LjE4LS4zLjM1LS4zaDIuOGMuMTcgMCAuMzIuMTMuMzUuMjlsLjI2IDEuODVjLjQzLjE4LjgyLjQxIDEuMTguNjlsMS43NC0uN2MuMTYtLjA2LjM0IDAgLjQzLjE1bDEuNCAyLjQyYy4wOS4xNS4wNS4zNC0uMDguNDVsLTEuNDggMS4xNmMuMDMuMjMuMDUuNDYuMDUuNjl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtYmFja3VwLXJlc3RvcmUiPjxwYXRoIGQ9Ik0xNCAxMmMwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDIgLjkgMiAyIDIgMi0uOSAyLTJ6bS0yLTljLTQuOTcgMC05IDQuMDMtOSA5SDBsNCA0IDQtNEg1YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS41MSAwLTIuOTEtLjQ5LTQuMDYtMS4zbC0xLjQyIDEuNDRDOC4wNCAyMC4zIDkuOTQgMjEgMTIgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtYmx1ZXRvb3RoIj48cGF0aCBkPSJNMTEgMjRoMnYtMmgtMnYyem0tNCAwaDJ2LTJIN3Yyem04IDBoMnYtMmgtMnYyem0yLjcxLTE4LjI5TDEyIDBoLTF2Ny41OUw2LjQxIDMgNSA0LjQxIDEwLjU5IDEwIDUgMTUuNTkgNi40MSAxNyAxMSAxMi40MVYyMGgxbDUuNzEtNS43MS00LjMtNC4yOSA0LjMtNC4yOXpNMTMgMy44M2wxLjg4IDEuODhMMTMgNy41OVYzLjgzem0xLjg4IDEwLjQ2TDEzIDE2LjE3di0zLjc2bDEuODggMS44OHoiPjwvcGF0aD48L2c+CjxnIGlkPSJzZXR0aW5ncy1icmlnaHRuZXNzIj48cGF0aCBkPSJNMjEgM0gzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTYuMDFIM1Y0Ljk5aDE4djE0LjAyek04IDE2aDIuNWwxLjUgMS41IDEuNS0xLjVIMTZ2LTIuNWwxLjUtMS41LTEuNS0xLjVWOGgtMi41TDEyIDYuNSAxMC41IDhIOHYyLjVMNi41IDEyIDggMTMuNVYxNnptNC03YzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzVjl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtY2VsbCI+PHBhdGggZD0iTTcgMjRoMnYtMkg3djJ6bTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6TTE2IC4wMUw4IDBDNi45IDAgNiAuOSA2IDJ2MTZjMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjJjMC0xLjEtLjktMS45OS0yLTEuOTl6TTE2IDE2SDhWNGg4djEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLWV0aGVybmV0Ij48cGF0aCBkPSJNNy43NyA2Ljc2TDYuMjMgNS40OC44MiAxMmw1LjQxIDYuNTIgMS41NC0xLjI4TDMuNDIgMTJsNC4zNS01LjI0ek03IDEzaDJ2LTJIN3Yyem0xMC0yaC0ydjJoMnYtMnptLTYgMmgydi0yaC0ydjJ6bTYuNzctNy41MmwtMS41NCAxLjI4TDIwLjU4IDEybC00LjM1IDUuMjQgMS41NCAxLjI4TDIzLjE4IDEybC01LjQxLTYuNTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtaW5wdXQtYW50ZW5uYSI+PHBhdGggZD0iTTEyIDVjLTMuODcgMC03IDMuMTMtNyA3aDJjMC0yLjc2IDIuMjQtNSA1LTVzNSAyLjI0IDUgNWgyYzAtMy44Ny0zLjEzLTctNy03em0xIDkuMjljLjg4LS4zOSAxLjUtMS4yNiAxLjUtMi4yOSAwLTEuMzgtMS4xMi0yLjUtMi41LTIuNVM5LjUgMTAuNjIgOS41IDEyYzAgMS4wMi42MiAxLjkgMS41IDIuMjl2My4zTDcuNTkgMjEgOSAyMi40MWwzLTMgMyAzTDE2LjQxIDIxIDEzIDE3LjU5di0zLjN6TTEyIDFDNS45MyAxIDEgNS45MyAxIDEyaDJjMC00Ljk3IDQuMDMtOSA5LTlzOSA0LjAzIDkgOWgyYzAtNi4wNy00LjkzLTExLTExLTExeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLWlucHV0LWNvbXBvbmVudCI+PHBhdGggZD0iTTUgMmMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0SDF2Nmg2VjZINVYyem00IDE0YzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOGMxLjE2LS40MSAyLTEuNTEgMi0yLjgydi0ySDl2MnptLTggMGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThDNi4xNiAxOC40IDcgMTcuMyA3IDE2di0ySDF2MnpNMjEgNlYyYzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRoLTJ2Nmg2VjZoLTJ6bS04LTRjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NEg5djZoNlY2aC0yVjJ6bTQgMTRjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4YzEuMTYtLjQxIDItMS41MSAyLTIuODJ2LTJoLTZ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1jb21wb3NpdGUiPjxwYXRoIGQ9Ik01IDJjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NEgxdjZoNlY2SDVWMnptNCAxNGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThjMS4xNi0uNDEgMi0xLjUxIDItMi44MnYtMkg5djJ6bS04IDBjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4QzYuMTYgMTguNCA3IDE3LjMgNyAxNnYtMkgxdjJ6TTIxIDZWMmMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0aC0ydjZoNlY2aC0yem0tOC00YzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRIOXY2aDZWNmgtMlYyem00IDE0YzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOGMxLjE2LS40MSAyLTEuNTEgMi0yLjgydi0yaC02djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtaW5wdXQtaGRtaSI+PHBhdGggZD0iTTE4IDdWNGMwLTEuMS0uOS0yLTItMkg4Yy0xLjEgMC0yIC45LTIgMnYzSDV2NmwzIDZ2M2g4di0zbDMtNlY3aC0xek04IDRoOHYzaC0yVjVoLTF2MmgtMlY1aC0xdjJIOFY0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLWlucHV0LXN2aWRlbyI+PHBhdGggZD0iTTggMTEuNWMwLS44My0uNjctMS41LTEuNS0xLjVTNSAxMC42NyA1IDExLjUgNS42NyAxMyA2LjUgMTMgOCAxMi4zMyA4IDExLjV6bTctNWMwLS44My0uNjctMS41LTEuNS0xLjVoLTNDOS42NyA1IDkgNS42NyA5IDYuNVM5LjY3IDggMTAuNSA4aDNjLjgzIDAgMS41LS42NyAxLjUtMS41ek04LjUgMTVjLS44MyAwLTEuNS42Ny0xLjUgMS41UzcuNjcgMTggOC41IDE4czEuNS0uNjcgMS41LTEuNVM5LjMzIDE1IDguNSAxNXpNMTIgMUM1LjkzIDEgMSA1LjkzIDEgMTJzNC45MyAxMSAxMSAxMSAxMS00LjkzIDExLTExUzE4LjA3IDEgMTIgMXptMCAyMGMtNC45NiAwLTktNC4wNC05LTlzNC4wNC05IDktOSA5IDQuMDQgOSA5LTQuMDQgOS05IDl6bTUuNS0xMWMtLjgzIDAtMS41LjY3LTEuNSAxLjVzLjY3IDEuNSAxLjUgMS41IDEuNS0uNjcgMS41LTEuNS0uNjctMS41LTEuNS0xLjV6bS0yIDVjLS44MyAwLTEuNS42Ny0xLjUgMS41cy42NyAxLjUgMS41IDEuNSAxLjUtLjY3IDEuNS0xLjUtLjY3LTEuNS0xLjUtMS41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLW92ZXJzY2FuIj48cGF0aCBkPSJNMTIuMDEgNS41TDEwIDhoNGwtMS45OS0yLjV6TTE4IDEwdjRsMi41LTEuOTlMMTggMTB6TTYgMTBsLTIuNSAyLjAxTDYgMTR2LTR6bTggNmgtNGwyLjAxIDIuNUwxNCAxNnptNy0xM0gzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTYuMDFIM1Y0Ljk5aDE4djE0LjAyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLXBob25lIj48cGF0aCBkPSJNMTMgOWgtMnYyaDJWOXptNCAwaC0ydjJoMlY5em0zIDYuNWMtMS4yNSAwLTIuNDUtLjItMy41Ny0uNTctLjM1LS4xMS0uNzQtLjAzLTEuMDIuMjRsLTIuMiAyLjJjLTIuODMtMS40NC01LjE1LTMuNzUtNi41OS02LjU4bDIuMi0yLjIxYy4yOC0uMjcuMzYtLjY2LjI1LTEuMDFDOC43IDYuNDUgOC41IDUuMjUgOC41IDRjMC0uNTUtLjQ1LTEtMS0xSDRjLS41NSAwLTEgLjQ1LTEgMSAwIDkuMzkgNy42MSAxNyAxNyAxNyAuNTUgMCAxLS40NSAxLTF2LTMuNWMwLS41NS0uNDUtMS0xLTF6TTE5IDl2MmgyVjloLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtcG93ZXIiPjxwYXRoIGQ9Ik03IDI0aDJ2LTJIN3Yyem00IDBoMnYtMmgtMnYyem0yLTIyaC0ydjEwaDJWMnptMy41NiAyLjQ0bC0xLjQ1IDEuNDVDMTYuODQgNi45NCAxOCA4LjgzIDE4IDExYzAgMy4zMS0yLjY5IDYtNiA2cy02LTIuNjktNi02YzAtMi4xNyAxLjE2LTQuMDYgMi44OC01LjEyTDcuNDQgNC40NEM1LjM2IDUuODggNCA4LjI4IDQgMTFjMCA0LjQyIDMuNTggOCA4IDhzOC0zLjU4IDgtOGMwLTIuNzItMS4zNi01LjEyLTMuNDQtNi41NnpNMTUgMjRoMnYtMmgtMnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLXJlbW90ZSI+PHBhdGggZD0iTTE1IDlIOWMtLjU1IDAtMSAuNDUtMSAxdjEyYzAgLjU1LjQ1IDEgMSAxaDZjLjU1IDAgMS0uNDUgMS0xVjEwYzAtLjU1LS40NS0xLTEtMXptLTMgNmMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6TTcuMDUgNi4wNWwxLjQxIDEuNDFDOS4zNyA2LjU2IDEwLjYyIDYgMTIgNnMyLjYzLjU2IDMuNTQgMS40NmwxLjQxLTEuNDFDMTUuNjggNC43OCAxMy45MyA0IDEyIDRzLTMuNjguNzgtNC45NSAyLjA1ek0xMiAwQzguOTYgMCA2LjIxIDEuMjMgNC4yMiAzLjIybDEuNDEgMS40MUM3LjI2IDMuMDEgOS41MSAyIDEyIDJzNC43NCAxLjAxIDYuMzYgMi42NGwxLjQxLTEuNDFDMTcuNzkgMS4yMyAxNS4wNCAwIDEyIDB6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3Mtdm9pY2UiPjxwYXRoIGQ9Ik03IDI0aDJ2LTJIN3Yyem01LTExYzEuNjYgMCAyLjk5LTEuMzQgMi45OS0zTDE1IDRjMC0xLjY2LTEuMzQtMy0zLTNTOSAyLjM0IDkgNHY2YzAgMS42NiAxLjM0IDMgMyAzem0tMSAxMWgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6bTQtMTRoLTEuN2MwIDMtMi41NCA1LjEtNS4zIDUuMVM2LjcgMTMgNi43IDEwSDVjMCAzLjQxIDIuNzIgNi4yMyA2IDYuNzJWMjBoMnYtMy4yOGMzLjI4LS40OSA2LTMuMzEgNi02LjcyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNob3AiPjxwYXRoIGQ9Ik0xNiA2VjRjMC0xLjExLS44OS0yLTItMmgtNGMtMS4xMSAwLTIgLjg5LTIgMnYySDJ2MTNjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWNmgtNnptLTYtMmg0djJoLTRWNHpNOSAxOFY5bDcuNSA0TDkgMTh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2hvcC10d28iPjxwYXRoIGQ9Ik0zIDlIMXYxMWMwIDEuMTEuODkgMiAyIDJoMTRjMS4xMSAwIDItLjg5IDItMkgzVjl6bTE1LTRWM2MwLTEuMTEtLjg5LTItMi0yaC00Yy0xLjExIDAtMiAuODktMiAydjJINXYxMWMwIDEuMTEuODkgMiAyIDJoMTRjMS4xMSAwIDItLjg5IDItMlY1aC01em0tNi0yaDR2MmgtNFYzem0wIDEyVjhsNS41IDMtNS41IDR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2hvcHBpbmctYmFza2V0Ij48cGF0aCBkPSJNMTcuMjEgOWwtNC4zOC02LjU2Yy0uMTktLjI4LS41MS0uNDItLjgzLS40Mi0uMzIgMC0uNjQuMTQtLjgzLjQzTDYuNzkgOUgyYy0uNTUgMC0xIC40NS0xIDEgMCAuMDkuMDEuMTguMDQuMjdsMi41NCA5LjI3Yy4yMy44NCAxIDEuNDYgMS45MiAxLjQ2aDEzYy45MiAwIDEuNjktLjYyIDEuOTMtMS40NmwyLjU0LTkuMjdMMjMgMTBjMC0uNTUtLjQ1LTEtMS0xaC00Ljc5ek05IDlsMy00LjRMMTUgOUg5em0zIDhjLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNob3BwaW5nLWNhcnQiPjxwYXRoIGQ9Ik03IDE4Yy0xLjEgMC0xLjk5LjktMS45OSAyUzUuOSAyMiA3IDIyczItLjkgMi0yLS45LTItMi0yek0xIDJ2MmgybDMuNiA3LjU5LTEuMzUgMi40NWMtLjE2LjI4LS4yNS42MS0uMjUuOTYgMCAxLjEuOSAyIDIgMmgxMnYtMkg3LjQyYy0uMTQgMC0uMjUtLjExLS4yNS0uMjVsLjAzLS4xMi45LTEuNjNoNy40NWMuNzUgMCAxLjQxLS40MSAxLjc1LTEuMDNsMy41OC02LjQ5Yy4wOC0uMTQuMTItLjMxLjEyLS40OCAwLS41NS0uNDUtMS0xLTFINS4yMWwtLjk0LTJIMXptMTYgMTZjLTEuMSAwLTEuOTkuOS0xLjk5IDJzLjg5IDIgMS45OSAyIDItLjkgMi0yLS45LTItMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNvcnQiPjxwYXRoIGQ9Ik0zIDE4aDZ2LTJIM3Yyek0zIDZ2MmgxOFY2SDN6bTAgN2gxMnYtMkgzdjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3BlYWtlci1ub3RlcyI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek04IDE0SDZ2LTJoMnYyem0wLTNINlY5aDJ2MnptMC0zSDZWNmgydjJ6bTcgNmgtNXYtMmg1djJ6bTMtM2gtOFY5aDh2MnptMC0zaC04VjZoOHYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNwZWFrZXItbm90ZXMtb2ZmIj48cGF0aCBkPSJNMTAuNTQgMTFsLS41NC0uNTRMNy41NCA4IDYgNi40NiAyLjM4IDIuODQgMS4yNyAxLjczIDAgM2wyLjAxIDIuMDFMMiAyMmw0LTRoOWw1LjczIDUuNzNMMjIgMjIuNDYgMTcuNTQgMThsLTctN3pNOCAxNEg2di0yaDJ2MnptLTItM1Y5bDIgMkg2em0xNC05SDQuMDhMMTAgNy45MlY2aDh2MmgtNy45MmwxIDFIMTh2MmgtNC45Mmw2Ljk5IDYuOTlDMjEuMTQgMTcuOTUgMjIgMTcuMDggMjIgMTZWNGMwLTEuMS0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJzcGVsbGNoZWNrIj48cGF0aCBkPSJNMTIuNDUgMTZoMi4wOUw5LjQzIDNINy41N0wyLjQ2IDE2aDIuMDlsMS4xMi0zaDUuNjRsMS4xNCAzem0tNi4wMi01TDguNSA1LjQ4IDEwLjU3IDExSDYuNDN6bTE1LjE2LjU5bC04LjA5IDguMDlMOS44MyAxNmwtMS40MSAxLjQxIDUuMDkgNS4wOUwyMyAxM2wtMS40MS0xLjQxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InN0YXIiPjxwYXRoIGQ9Ik0xMiAxNy4yN0wxOC4xOCAyMWwtMS42NC03LjAzTDIyIDkuMjRsLTcuMTktLjYxTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJzdGFyLWJvcmRlciI+PHBhdGggZD0iTTIyIDkuMjRsLTcuMTktLjYyTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMSAxMiAxNy4yNyAxOC4xOCAyMWwtMS42My03LjAzTDIyIDkuMjR6TTEyIDE1LjRsLTMuNzYgMi4yNyAxLTQuMjgtMy4zMi0yLjg4IDQuMzgtLjM4TDEyIDYuMWwxLjcxIDQuMDQgNC4zOC4zOC0zLjMyIDIuODggMSA0LjI4TDEyIDE1LjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3Rhci1oYWxmIj48cGF0aCBkPSJNMjIgOS4yNGwtNy4xOS0uNjJMMTIgMiA5LjE5IDguNjMgMiA5LjI0bDUuNDYgNC43M0w1LjgyIDIxIDEyIDE3LjI3IDE4LjE4IDIxbC0xLjYzLTcuMDNMMjIgOS4yNHpNMTIgMTUuNFY2LjFsMS43MSA0LjA0IDQuMzguMzgtMy4zMiAyLjg4IDEgNC4yOEwxMiAxNS40eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InN0YXJzIj48cGF0aCBkPSJNMTEuOTkgMkM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnptNC4yNCAxNkwxMiAxNS40NSA3Ljc3IDE4bDEuMTItNC44MS0zLjczLTMuMjMgNC45Mi0uNDJMMTIgNWwxLjkyIDQuNTMgNC45Mi40Mi0zLjczIDMuMjNMMTYuMjMgMTh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3RvcmUiPjxwYXRoIGQ9Ik0yMCA0SDR2MmgxNlY0em0xIDEwdi0ybC0xLTVINGwtMSA1djJoMXY2aDEwdi02aDR2Nmgydi02aDF6bS05IDRINnYtNGg2djR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3ViZGlyZWN0b3J5LWFycm93LWxlZnQiPjxwYXRoIGQ9Ik0xMSA5bDEuNDIgMS40Mkw4LjgzIDE0SDE4VjRoMnYxMkg4LjgzbDMuNTkgMy41OEwxMSAyMWwtNi02IDYtNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJzdWJkaXJlY3RvcnktYXJyb3ctcmlnaHQiPjxwYXRoIGQ9Ik0xOSAxNWwtNiA2LTEuNDItMS40MkwxNS4xNyAxNkg0VjRoMnYxMGg5LjE3bC0zLjU5LTMuNThMMTMgOWw2IDZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3ViamVjdCI+PHBhdGggZD0iTTE0IDE3SDR2MmgxMHYtMnptNi04SDR2MmgxNlY5ek00IDE1aDE2di0ySDR2MnpNNCA1djJoMTZWNUg0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InN1cGVydmlzb3ItYWNjb3VudCI+PHBhdGggZD0iTTE2LjUgMTJjMS4zOCAwIDIuNDktMS4xMiAyLjQ5LTIuNVMxNy44OCA3IDE2LjUgN0MxNS4xMiA3IDE0IDguMTIgMTQgOS41czEuMTIgMi41IDIuNSAyLjV6TTkgMTFjMS42NiAwIDIuOTktMS4zNCAyLjk5LTNTMTAuNjYgNSA5IDVDNy4zNCA1IDYgNi4zNCA2IDhzMS4zNCAzIDMgM3ptNy41IDNjLTEuODMgMC01LjUuOTItNS41IDIuNzVWMTloMTF2LTIuMjVjMC0xLjgzLTMuNjctMi43NS01LjUtMi43NXpNOSAxM2MtMi4zMyAwLTcgMS4xNy03IDMuNVYxOWg3di0yLjI1YzAtLjg1LjMzLTIuMzQgMi4zNy0zLjQ3QzEwLjUgMTMuMSA5LjY2IDEzIDkgMTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3dhcC1ob3JpeiI+PHBhdGggZD0iTTYuOTkgMTFMMyAxNWwzLjk5IDR2LTNIMTR2LTJINi45OXYtM3pNMjEgOWwtMy45OS00djNIMTB2Mmg3LjAxdjNMMjEgOXoiPjwvcGF0aD48L2c+CjxnIGlkPSJzd2FwLXZlcnQiPjxwYXRoIGQ9Ik0xNiAxNy4wMVYxMGgtMnY3LjAxaC0zTDE1IDIxbDQtMy45OWgtM3pNOSAzTDUgNi45OWgzVjE0aDJWNi45OWgzTDkgM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJzd2FwLXZlcnRpY2FsLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6TTYuNSA5TDEwIDUuNSAxMy41IDlIMTF2NEg5VjlINi41em0xMSA2TDE0IDE4LjUgMTAuNSAxNUgxM3YtNGgydjRoMi41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InN5c3RlbS11cGRhdGUtYWx0Ij48cGF0aCBkPSJNMTIgMTYuNWw0LTRoLTN2LTloLTJ2OUg4bDQgNHptOS0xM2gtNnYxLjk5aDZ2MTQuMDNIM1Y1LjQ5aDZWMy41SDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJ2LTE0YzAtMS4xLS45LTItMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRhYiI+PHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDNWNWgxMHY0aDh2MTB6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idGFiLXVuc2VsZWN0ZWQiPjxwYXRoIGQ9Ik0xIDloMlY3SDF2MnptMCA0aDJ2LTJIMXYyem0wLThoMlYzYy0xLjEgMC0yIC45LTIgMnptOCAxNmgydi0ySDl2MnptLTgtNGgydi0ySDF2MnptMiA0di0ySDFjMCAxLjEuOSAyIDIgMnpNMjEgM2gtOHY2aDEwVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTRoMnYtMmgtMnYyek05IDVoMlYzSDl2MnpNNSAyMWgydi0ySDV2MnpNNSA1aDJWM0g1djJ6bTE2IDE2YzEuMSAwIDItLjkgMi0yaC0ydjJ6bTAtOGgydi0yaC0ydjJ6bS04IDhoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRleHQtZm9ybWF0Ij48cGF0aCBkPSJNNSAxN3YyaDE0di0ySDV6bTQuNS00LjJoNWwuOSAyLjJoMi4xTDEyLjc1IDRoLTEuNUw2LjUgMTVoMi4xbC45LTIuMnpNMTIgNS45OEwxMy44NyAxMWgtMy43NEwxMiA1Ljk4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRoZWF0ZXJzIj48cGF0aCBkPSJNMTggM3YyaC0yVjNIOHYySDZWM0g0djE4aDJ2LTJoMnYyaDh2LTJoMnYyaDJWM2gtMnpNOCAxN0g2di0yaDJ2MnptMC00SDZ2LTJoMnYyem0wLTRINlY3aDJ2MnptMTAgOGgtMnYtMmgydjJ6bTAtNGgtMnYtMmgydjJ6bTAtNGgtMlY3aDJ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0aHVtYi1kb3duIj48cGF0aCBkPSJNMTUgM0g2Yy0uODMgMC0xLjU0LjUtMS44NCAxLjIybC0zLjAyIDcuMDVjLS4wOS4yMy0uMTQuNDctLjE0LjczdjEuOTFsLjAxLjAxTDEgMTRjMCAxLjEuOSAyIDIgMmg2LjMxbC0uOTUgNC41Ny0uMDMuMzJjMCAuNDEuMTcuNzkuNDQgMS4wNkw5LjgzIDIzbDYuNTktNi41OWMuMzYtLjM2LjU4LS44Ni41OC0xLjQxVjVjMC0xLjEtLjktMi0yLTJ6bTQgMHYxMmg0VjNoLTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idGh1bWItdXAiPjxwYXRoIGQ9Ik0xIDIxaDRWOUgxdjEyem0yMi0xMWMwLTEuMS0uOS0yLTItMmgtNi4zMWwuOTUtNC41Ny4wMy0uMzJjMC0uNDEtLjE3LS43OS0uNDQtMS4wNkwxNC4xNyAxIDcuNTkgNy41OUM3LjIyIDcuOTUgNyA4LjQ1IDcgOXYxMGMwIDEuMS45IDIgMiAyaDljLjgzIDAgMS41NC0uNSAxLjg0LTEuMjJsMy4wMi03LjA1Yy4wOS0uMjMuMTQtLjQ3LjE0LS43M3YtMS45MWwtLjAxLS4wMUwyMyAxMHoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0aHVtYnMtdXAtZG93biI+PHBhdGggZD0iTTEyIDZjMC0uNTUtLjQ1LTEtMS0xSDUuODJsLjY2LTMuMTguMDItLjIzYzAtLjMxLS4xMy0uNTktLjMzLS44TDUuMzggMCAuNDQgNC45NEMuMTcgNS4yMSAwIDUuNTkgMCA2djYuNWMwIC44My42NyAxLjUgMS41IDEuNWg2Ljc1Yy42MiAwIDEuMTUtLjM4IDEuMzgtLjkxbDIuMjYtNS4yOWMuMDctLjE3LjExLS4zNi4xMS0uNTVWNnptMTAuNSA0aC02Ljc1Yy0uNjIgMC0xLjE1LjM4LTEuMzguOTFsLTIuMjYgNS4yOWMtLjA3LjE3LS4xMS4zNi0uMTEuNTVWMThjMCAuNTUuNDUgMSAxIDFoNS4xOGwtLjY2IDMuMTgtLjAyLjI0YzAgLjMxLjEzLjU5LjMzLjhsLjc5Ljc4IDQuOTQtNC45NGMuMjctLjI3LjQ0LS42NS40NC0xLjA2di02LjVjMC0uODMtLjY3LTEuNS0xLjUtMS41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRpbWVsaW5lIj48cGF0aCBkPSJNMjMgOGMwIDEuMS0uOSAyLTIgMi0uMTggMC0uMzUtLjAyLS41MS0uMDdsLTMuNTYgMy41NWMuMDUuMTYuMDcuMzQuMDcuNTIgMCAxLjEtLjkgMi0yIDJzLTItLjktMi0yYzAtLjE4LjAyLS4zNi4wNy0uNTJsLTIuNTUtMi41NWMtLjE2LjA1LS4zNC4wNy0uNTIuMDdzLS4zNi0uMDItLjUyLS4wN2wtNC41NSA0LjU2Yy4wNS4xNi4wNy4zMy4wNy41MSAwIDEuMS0uOSAyLTIgMnMtMi0uOS0yLTIgLjktMiAyLTJjLjE4IDAgLjM1LjAyLjUxLjA3bDQuNTYtNC41NUM4LjAyIDkuMzYgOCA5LjE4IDggOWMwLTEuMS45LTIgMi0yczIgLjkgMiAyYzAgLjE4LS4wMi4zNi0uMDcuNTJsMi41NSAyLjU1Yy4xNi0uMDUuMzQtLjA3LjUyLS4wN3MuMzYuMDIuNTIuMDdsMy41NS0zLjU2QzE5LjAyIDguMzUgMTkgOC4xOCAxOSA4YzAtMS4xLjktMiAyLTJzMiAuOSAyIDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idG9jIj48cGF0aCBkPSJNMyA5aDE0VjdIM3Yyem0wIDRoMTR2LTJIM3Yyem0wIDRoMTR2LTJIM3Yyem0xNiAwaDJ2LTJoLTJ2MnptMC0xMHYyaDJWN2gtMnptMCA2aDJ2LTJoLTJ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0b2RheSI+PHBhdGggZD0iTTE5IDNoLTFWMWgtMnYySDhWMUg2djJINWMtMS4xMSAwLTEuOTkuOS0xLjk5IDJMMyAxOWMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDVWOGgxNHYxMXpNNyAxMGg1djVIN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJ0b2xsIj48cGF0aCBkPSJNMTUgNGMtNC40MiAwLTggMy41OC04IDhzMy41OCA4IDggOCA4LTMuNTggOC04LTMuNTgtOC04LTh6bTAgMTRjLTMuMzEgMC02LTIuNjktNi02czIuNjktNiA2LTYgNiAyLjY5IDYgNi0yLjY5IDYtNiA2ek0zIDEyYzAtMi42MSAxLjY3LTQuODMgNC01LjY1VjQuMjZDMy41NSA1LjE1IDEgOC4yNyAxIDEyczIuNTUgNi44NSA2IDcuNzR2LTIuMDljLTIuMzMtLjgyLTQtMy4wNC00LTUuNjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idG91Y2gtYXBwIj48cGF0aCBkPSJNOSAxMS4yNFY3LjVDOSA2LjEyIDEwLjEyIDUgMTEuNSA1UzE0IDYuMTIgMTQgNy41djMuNzRjMS4yMS0uODEgMi0yLjE4IDItMy43NEMxNiA1LjAxIDEzLjk5IDMgMTEuNSAzUzcgNS4wMSA3IDcuNWMwIDEuNTYuNzkgMi45MyAyIDMuNzR6bTkuODQgNC42M2wtNC41NC0yLjI2Yy0uMTctLjA3LS4zNS0uMTEtLjU0LS4xMUgxM3YtNmMwLS44My0uNjctMS41LTEuNS0xLjVTMTAgNi42NyAxMCA3LjV2MTAuNzRsLTMuNDMtLjcyYy0uMDgtLjAxLS4xNS0uMDMtLjI0LS4wMy0uMzEgMC0uNTkuMTMtLjc5LjMzbC0uNzkuOCA0Ljk0IDQuOTRjLjI3LjI3LjY1LjQ0IDEuMDYuNDRoNi43OWMuNzUgMCAxLjMzLS41NSAxLjQ0LTEuMjhsLjc1LTUuMjdjLjAxLS4wNy4wMi0uMTQuMDItLjIgMC0uNjItLjM4LTEuMTYtLjkxLTEuMzh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idHJhY2stY2hhbmdlcyI+PHBhdGggZD0iTTE5LjA3IDQuOTNsLTEuNDEgMS40MUMxOS4xIDcuNzkgMjAgOS43OSAyMCAxMmMwIDQuNDItMy41OCA4LTggOHMtOC0zLjU4LTgtOGMwLTQuMDggMy4wNS03LjQ0IDctNy45M3YyLjAyQzguMTYgNi41NyA2IDkuMDMgNiAxMmMwIDMuMzEgMi42OSA2IDYgNnM2LTIuNjkgNi02YzAtMS42Ni0uNjctMy4xNi0xLjc2LTQuMjRsLTEuNDEgMS40MUMxNS41NSA5LjkgMTYgMTAuOSAxNiAxMmMwIDIuMjEtMS43OSA0LTQgNHMtNC0xLjc5LTQtNGMwLTEuODYgMS4yOC0zLjQxIDMtMy44NnYyLjE0Yy0uNi4zNS0xIC45OC0xIDEuNzIgMCAxLjEuOSAyIDIgMnMyLS45IDItMmMwLS43NC0uNC0xLjM4LTEtMS43MlYyaC0xQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBjMC0yLjc2LTEuMTItNS4yNi0yLjkzLTcuMDd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idHJhbnNsYXRlIj48cGF0aCBkPSJNMTIuODcgMTUuMDdsLTIuNTQtMi41MS4wMy0uMDNjMS43NC0xLjk0IDIuOTgtNC4xNyAzLjcxLTYuNTNIMTdWNGgtN1YySDh2MkgxdjEuOTloMTEuMTdDMTEuNSA3LjkyIDEwLjQ0IDkuNzUgOSAxMS4zNSA4LjA3IDEwLjMyIDcuMyA5LjE5IDYuNjkgOGgtMmMuNzMgMS42MyAxLjczIDMuMTcgMi45OCA0LjU2bC01LjA5IDUuMDJMNCAxOWw1LTUgMy4xMSAzLjExLjc2LTIuMDR6TTE4LjUgMTBoLTJMMTIgMjJoMmwxLjEyLTNoNC43NUwyMSAyMmgybC00LjUtMTJ6bS0yLjYyIDdsMS42Mi00LjMzTDE5LjEyIDE3aC0zLjI0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRyZW5kaW5nLWRvd24iPjxwYXRoIGQ9Ik0xNiAxOGwyLjI5LTIuMjktNC44OC00Ljg4LTQgNEwyIDcuNDEgMy40MSA2bDYgNiA0LTQgNi4zIDYuMjlMMjIgMTJ2NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0cmVuZGluZy1mbGF0Ij48cGF0aCBkPSJNMjIgMTJsLTQtNHYzSDN2MmgxNXYzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRyZW5kaW5nLXVwIj48cGF0aCBkPSJNMTYgNmwyLjI5IDIuMjktNC44OCA0Ljg4LTQtNEwyIDE2LjU5IDMuNDEgMThsNi02IDQgNCA2LjMtNi4yOUwyMiAxMlY2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InR1cm5lZC1pbiI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0dXJuZWQtaW4tbm90Ij48cGF0aCBkPSJNMTcgM0g3Yy0xLjEgMC0xLjk5LjktMS45OSAyTDUgMjFsNy0zIDcgM1Y1YzAtMS4xLS45LTItMi0yem0wIDE1bC01LTIuMThMNyAxOFY1aDEwdjEzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InVuYXJjaGl2ZSI+PHBhdGggZD0iTTIwLjU1IDUuMjJsLTEuMzktMS42OEMxOC44OCAzLjIxIDE4LjQ3IDMgMTggM0g2Yy0uNDcgMC0uODguMjEtMS4xNS41NUwzLjQ2IDUuMjJDMy4xNyA1LjU3IDMgNi4wMSAzIDYuNVYxOWMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2LjVjMC0uNDktLjE3LS45My0uNDUtMS4yOHpNMTIgOS41bDUuNSA1LjVIMTR2MmgtNHYtMkg2LjVMMTIgOS41ek01LjEyIDVsLjgyLTFoMTJsLjkzIDFINS4xMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ1bmRvIj48cGF0aCBkPSJNMTIuNSA4Yy0yLjY1IDAtNS4wNS45OS02LjkgMi42TDIgN3Y5aDlsLTMuNjItMy42MmMxLjM5LTEuMTYgMy4xNi0xLjg4IDUuMTItMS44OCAzLjU0IDAgNi41NSAyLjMxIDcuNiA1LjVsMi4zNy0uNzhDMjEuMDggMTEuMDMgMTcuMTUgOCAxMi41IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idW5mb2xkLWxlc3MiPjxwYXRoIGQ9Ik03LjQxIDE4LjU5TDguODMgMjAgMTIgMTYuODMgMTUuMTcgMjBsMS40MS0xLjQxTDEyIDE0bC00LjU5IDQuNTl6bTkuMTgtMTMuMThMMTUuMTcgNCAxMiA3LjE3IDguODMgNCA3LjQxIDUuNDEgMTIgMTBsNC41OS00LjU5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InVuZm9sZC1tb3JlIj48cGF0aCBkPSJNMTIgNS44M0wxNS4xNyA5bDEuNDEtMS40MUwxMiAzIDcuNDEgNy41OSA4LjgzIDkgMTIgNS44M3ptMCAxMi4zNEw4LjgzIDE1bC0xLjQxIDEuNDFMMTIgMjFsNC41OS00LjU5TDE1LjE3IDE1IDEyIDE4LjE3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InVwZGF0ZSI+PHBhdGggZD0iTTIxIDEwLjEyaC02Ljc4bDIuNzQtMi44MmMtMi43My0yLjctNy4xNS0yLjgtOS44OC0uMS0yLjczIDIuNzEtMi43MyA3LjA4IDAgOS43OSAyLjczIDIuNzEgNy4xNSAyLjcxIDkuODggMEMxOC4zMiAxNS42NSAxOSAxNC4wOCAxOSAxMi4xaDJjMCAxLjk4LS44OCA0LjU1LTIuNjQgNi4yOS0zLjUxIDMuNDgtOS4yMSAzLjQ4LTEyLjcyIDAtMy41LTMuNDctMy41My05LjExLS4wMi0xMi41OCAzLjUxLTMuNDcgOS4xNC0zLjQ3IDEyLjY1IDBMMjEgM3Y3LjEyek0xMi41IDh2NC4yNWwzLjUgMi4wOC0uNzIgMS4yMUwxMSAxM1Y4aDEuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2ZXJpZmllZC11c2VyIj48cGF0aCBkPSJNMTIgMUwzIDV2NmMwIDUuNTUgMy44NCAxMC43NCA5IDEyIDUuMTYtMS4yNiA5LTYuNDUgOS0xMlY1bC05LTR6bS0yIDE2bC00LTQgMS40MS0xLjQxTDEwIDE0LjE3bDYuNTktNi41OUwxOCA5bC04IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idmlldy1hZ2VuZGEiPjxwYXRoIGQ9Ik0yMCAxM0gzYy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxN2MuNTUgMCAxLS40NSAxLTF2LTZjMC0uNTUtLjQ1LTEtMS0xem0wLTEwSDNjLS41NSAwLTEgLjQ1LTEgMXY2YzAgLjU1LjQ1IDEgMSAxaDE3Yy41NSAwIDEtLjQ1IDEtMVY0YzAtLjU1LS40NS0xLTEtMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aWV3LWFycmF5Ij48cGF0aCBkPSJNNCAxOGgzVjVINHYxM3pNMTggNXYxM2gzVjVoLTN6TTggMThoOVY1SDh2MTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idmlldy1jYXJvdXNlbCI+PHBhdGggZD0iTTcgMTloMTBWNEg3djE1em0tNS0yaDRWNkgydjExek0xOCA2djExaDRWNmgtNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aWV3LWNvbHVtbiI+PHBhdGggZD0iTTEwIDE4aDVWNWgtNXYxM3ptLTYgMGg1VjVINHYxM3pNMTYgNXYxM2g1VjVoLTV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idmlldy1kYXkiPjxwYXRoIGQ9Ik0yIDIxaDE5di0zSDJ2M3pNMjAgOEgzYy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxN2MuNTUgMCAxLS40NSAxLTFWOWMwLS41NS0uNDUtMS0xLTF6TTIgM3YzaDE5VjNIMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aWV3LWhlYWRsaW5lIj48cGF0aCBkPSJNNCAxNWgxNnYtMkg0djJ6bTAgNGgxNnYtMkg0djJ6bTAtOGgxNlY5SDR2MnptMC02djJoMTZWNUg0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InZpZXctbGlzdCI+PHBhdGggZD0iTTQgMTRoNHYtNEg0djR6bTAgNWg0di00SDR2NHpNNCA5aDRWNUg0djR6bTUgNWgxMnYtNEg5djR6bTAgNWgxMnYtNEg5djR6TTkgNXY0aDEyVjVIOXoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aWV3LW1vZHVsZSI+PHBhdGggZD0iTTQgMTFoNVY1SDR2NnptMCA3aDV2LTZINHY2em02IDBoNXYtNmgtNXY2em02IDBoNXYtNmgtNXY2em0tNi03aDVWNWgtNXY2em02LTZ2Nmg1VjVoLTV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idmlldy1xdWlsdCI+PHBhdGggZD0iTTEwIDE4aDV2LTZoLTV2NnptLTYgMGg1VjVINHYxM3ptMTIgMGg1di02aC01djZ6TTEwIDV2NmgxMVY1SDEweiI+PC9wYXRoPjwvZz4KPGcgaWQ9InZpZXctc3RyZWFtIj48cGF0aCBkPSJNNCAxOGgxN3YtNkg0djZ6TTQgNXY2aDE3VjVINHoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aWV3LXdlZWsiPjxwYXRoIGQ9Ik02IDVIM2MtLjU1IDAtMSAuNDUtMSAxdjEyYzAgLjU1LjQ1IDEgMSAxaDNjLjU1IDAgMS0uNDUgMS0xVjZjMC0uNTUtLjQ1LTEtMS0xem0xNCAwaC0zYy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoM2MuNTUgMCAxLS40NSAxLTFWNmMwLS41NS0uNDUtMS0xLTF6bS03IDBoLTNjLS41NSAwLTEgLjQ1LTEgMXYxMmMwIC41NS40NSAxIDEgMWgzYy41NSAwIDEtLjQ1IDEtMVY2YzAtLjU1LS40NS0xLTEtMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aXNpYmlsaXR5Ij48cGF0aCBkPSJNMTIgNC41QzcgNC41IDIuNzMgNy42MSAxIDEyYzEuNzMgNC4zOSA2IDcuNSAxMSA3LjVzOS4yNy0zLjExIDExLTcuNWMtMS43My00LjM5LTYtNy41LTExLTcuNXpNMTIgMTdjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1em0wLThjLTEuNjYgMC0zIDEuMzQtMyAzczEuMzQgMyAzIDMgMy0xLjM0IDMtMy0xLjM0LTMtMy0zeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InZpc2liaWxpdHktb2ZmIj48cGF0aCBkPSJNMTIgN2MyLjc2IDAgNSAyLjI0IDUgNSAwIC42NS0uMTMgMS4yNi0uMzYgMS44M2wyLjkyIDIuOTJjMS41MS0xLjI2IDIuNy0yLjg5IDMuNDMtNC43NS0xLjczLTQuMzktNi03LjUtMTEtNy41LTEuNCAwLTIuNzQuMjUtMy45OC43bDIuMTYgMi4xNkMxMC43NCA3LjEzIDExLjM1IDcgMTIgN3pNMiA0LjI3bDIuMjggMi4yOC40Ni40NkMzLjA4IDguMyAxLjc4IDEwLjAyIDEgMTJjMS43MyA0LjM5IDYgNy41IDExIDcuNSAxLjU1IDAgMy4wMy0uMyA0LjM4LS44NGwuNDIuNDJMMTkuNzMgMjIgMjEgMjAuNzMgMy4yNyAzIDIgNC4yN3pNNy41MyA5LjhsMS41NSAxLjU1Yy0uMDUuMjEtLjA4LjQzLS4wOC42NSAwIDEuNjYgMS4zNCAzIDMgMyAuMjIgMCAuNDQtLjAzLjY1LS4wOGwxLjU1IDEuNTVjLS42Ny4zMy0xLjQxLjUzLTIuMi41My0yLjc2IDAtNS0yLjI0LTUtNSAwLS43OS4yLTEuNTMuNTMtMi4yem00LjMxLS43OGwzLjE1IDMuMTUuMDItLjE2YzAtMS42Ni0xLjM0LTMtMy0zbC0uMTcuMDF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0id2FybmluZyI+PHBhdGggZD0iTTEgMjFoMjJMMTIgMiAxIDIxem0xMi0zaC0ydi0yaDJ2MnptMC00aC0ydi00aDJ2NHoiPjwvcGF0aD48L2c+CjxnIGlkPSJ3YXRjaC1sYXRlciI+PHBhdGggZD0iTTEyIDJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyem00LjIgMTQuMkwxMSAxM1Y3aDEuNXY1LjJsNC41IDIuNy0uOCAxLjN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0id2Vla2VuZCI+PHBhdGggZD0iTTIxIDEwYy0xLjEgMC0yIC45LTIgMnYzSDV2LTNjMC0xLjEtLjktMi0yLTJzLTIgLjktMiAydjVjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMnYtNWMwLTEuMS0uOS0yLTItMnptLTMtNUg2Yy0xLjEgMC0yIC45LTIgMnYyLjE1YzEuMTYuNDEgMiAxLjUxIDIgMi44MlYxNGgxMnYtMi4wM2MwLTEuMy44NC0yLjQgMi0yLjgyVjdjMC0xLjEtLjktMi0yLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0id29yayI+PHBhdGggZD0iTTIwIDZoLTRWNGMwLTEuMTEtLjg5LTItMi0yaC00Yy0xLjExIDAtMiAuODktMiAydjJINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMTljMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWOGMwLTEuMTEtLjg5LTItMi0yem0tNiAwaC00VjRoNHYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InlvdXR1YmUtc2VhcmNoZWQtZm9yIj48cGF0aCBkPSJNMTcuMDEgMTRoLS44bC0uMjctLjI3Yy45OC0xLjE0IDEuNTctMi42MSAxLjU3LTQuMjMgMC0zLjU5LTIuOTEtNi41LTYuNS02LjVzLTYuNSAzLTYuNSA2LjVIMmwzLjg0IDQgNC4xNi00SDYuNTFDNi41MSA3IDguNTMgNSAxMS4wMSA1czQuNSAyLjAxIDQuNSA0LjVjMCAyLjQ4LTIuMDIgNC41LTQuNSA0LjUtLjY1IDAtMS4yNi0uMTQtMS44Mi0uMzhMNy43MSAxNS4xYy45Ny41NyAyLjA5LjkgMy4zLjkgMS42MSAwIDMuMDgtLjU5IDQuMjItMS41N2wuMjcuMjd2Ljc5bDUuMDEgNC45OUwyMiAxOWwtNC45OS01eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Inpvb20taW4iPjxwYXRoIGQ9Ik0xNS41IDE0aC0uNzlsLS4yOC0uMjdDMTUuNDEgMTIuNTkgMTYgMTEuMTEgMTYgOS41IDE2IDUuOTEgMTMuMDkgMyA5LjUgM1MzIDUuOTEgMyA5LjUgNS45MSAxNiA5LjUgMTZjMS42MSAwIDMuMDktLjU5IDQuMjMtMS41N2wuMjcuMjh2Ljc5bDUgNC45OUwyMC40OSAxOWwtNC45OS01em0tNiAwQzcuMDEgMTQgNSAxMS45OSA1IDkuNVM3LjAxIDUgOS41IDUgMTQgNy4wMSAxNCA5LjUgMTEuOTkgMTQgOS41IDE0em0yLjUtNGgtMnYySDl2LTJIN1Y5aDJWN2gxdjJoMnYxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Inpvb20tb3V0Ij48cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHpNNyA5aDV2MUg3eiI+PC9wYXRoPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+YDtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKE1vLmNvbnRlbnQpOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KdmFyIEVvPXsiVSswMDA4IjoiYmFja3NwYWNlIiwiVSswMDA5IjoidGFiIiwiVSswMDFCIjoiZXNjIiwiVSswMDIwIjoic3BhY2UiLCJVKzAwN0YiOiJkZWwifSxUbz17ODoiYmFja3NwYWNlIiw5OiJ0YWIiLDEzOiJlbnRlciIsMjc6ImVzYyIsMzM6InBhZ2V1cCIsMzQ6InBhZ2Vkb3duIiwzNToiZW5kIiwzNjoiaG9tZSIsMzI6InNwYWNlIiwzNzoibGVmdCIsMzg6InVwIiwzOToicmlnaHQiLDQwOiJkb3duIiw0NjoiZGVsIiwxMDY6IioifSxDbz17c2hpZnQ6InNoaWZ0S2V5IixjdHJsOiJjdHJsS2V5IixhbHQ6ImFsdEtleSIsbWV0YToibWV0YUtleSJ9LEFvPS9bYS16MC05Kl0vLGtvPS9VXCsvLExvPS9eYXJyb3cvLFBvPS9ec3BhY2UoYmFyKT8vLE5vPS9eZXNjYXBlJC87ZnVuY3Rpb24gSW8odCxlKXt2YXIgbj0iIjtpZih0KXt2YXIgaT10LnRvTG93ZXJDYXNlKCk7IiAiPT09aXx8UG8udGVzdChpKT9uPSJzcGFjZSI6Tm8udGVzdChpKT9uPSJlc2MiOjE9PWkubGVuZ3RoP2UmJiFBby50ZXN0KGkpfHwobj1pKTpuPUxvLnRlc3QoaSk/aS5yZXBsYWNlKCJhcnJvdyIsIiIpOiJtdWx0aXBseSI9PWk/IioiOml9cmV0dXJuIG59ZnVuY3Rpb24gUm8odCxlKXtyZXR1cm4oZnVuY3Rpb24gbih0LGUpe3JldHVybiB0LmtleT9Jbyh0LmtleSxlKTp0LmRldGFpbCYmdC5kZXRhaWwua2V5P0lvKHQuZGV0YWlsLmtleSxlKTooZnVuY3Rpb24gbih0KXt2YXIgZT0iIjtyZXR1cm4gdCYmKHQgaW4gRW8/ZT1Fb1t0XTprby50ZXN0KHQpPyh0PXBhcnNlSW50KHQucmVwbGFjZSgiVSsiLCIweCIpLDE2KSxlPVN0cmluZy5mcm9tQ2hhckNvZGUodCkudG9Mb3dlckNhc2UoKSk6ZT10LnRvTG93ZXJDYXNlKCkpLGV9KSh0LmtleUlkZW50aWZpZXIpfHwoZnVuY3Rpb24gaSh0KXt2YXIgZT0iIjtyZXR1cm4gTnVtYmVyKHQpJiYoZT10Pj02NSYmdDw9OTA/U3RyaW5nLmZyb21DaGFyQ29kZSgzMit0KTp0Pj0xMTImJnQ8PTEyMz8iZiIrKHQtMTEyKzEpOnQ+PTQ4JiZ0PD01Nz9TdHJpbmcodC00OCk6dD49OTYmJnQ8PTEwNT9TdHJpbmcodC05Nik6VG9bdF0pLGV9KSh0LmtleUNvZGUpfHwiIn0pKGUsdC5oYXNNb2RpZmllcnMpPT09dC5rZXkmJighdC5oYXNNb2RpZmllcnN8fCEhZS5zaGlmdEtleT09ISF0LnNoaWZ0S2V5JiYhIWUuY3RybEtleT09ISF0LmN0cmxLZXkmJiEhZS5hbHRLZXk9PSEhdC5hbHRLZXkmJiEhZS5tZXRhS2V5PT0hIXQubWV0YUtleSl9ZnVuY3Rpb24gT28odCl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KCIgIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4oZnVuY3Rpb24gZSh0KXtyZXR1cm4gMT09PXQubGVuZ3RoP3tjb21ibzp0LGtleTp0LGV2ZW50OiJrZXlkb3duIn06dC5zcGxpdCgiKyIpLnJlZHVjZSgoZnVuY3Rpb24odCxlKXt2YXIgbj1lLnNwbGl0KCI6IiksaT1uWzBdLHI9blsxXTtyZXR1cm4gaSBpbiBDbz8odFtDb1tpXV09ITAsdC5oYXNNb2RpZmllcnM9ITApOih0LmtleT1pLHQuZXZlbnQ9cnx8ImtleWRvd24iKSx0fSkse2NvbWJvOnQuc3BsaXQoIjoiKS5zaGlmdCgpfSl9KSh0KX0pKX1jb25zdCB6bz17cHJvcGVydGllczp7a2V5RXZlbnRUYXJnZXQ6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSxzdG9wS2V5Ym9hcmRFdmVudFByb3BhZ2F0aW9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9ib3VuZEtleUhhbmRsZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxfaW1wZXJhdGl2ZUtleUJpbmRpbmdzOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX19LG9ic2VydmVyczpbIl9yZXNldEtleUV2ZW50TGlzdGVuZXJzKGtleUV2ZW50VGFyZ2V0LCBfYm91bmRLZXlIYW5kbGVycykiXSxrZXlCaW5kaW5nczp7fSxyZWdpc3RlcmVkOmZ1bmN0aW9uKCl7dGhpcy5fcHJlcEtleUJpbmRpbmdzKCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fbGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl91bmxpc3RlbktleUV2ZW50TGlzdGVuZXJzKCl9LGFkZE93bktleUJpbmRpbmc6ZnVuY3Rpb24odCxlKXt0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3NbdF09ZSx0aGlzLl9wcmVwS2V5QmluZGluZ3MoKSx0aGlzLl9yZXNldEtleUV2ZW50TGlzdGVuZXJzKCl9LHJlbW92ZU93bktleUJpbmRpbmdzOmZ1bmN0aW9uKCl7dGhpcy5faW1wZXJhdGl2ZUtleUJpbmRpbmdzPXt9LHRoaXMuX3ByZXBLZXlCaW5kaW5ncygpLHRoaXMuX3Jlc2V0S2V5RXZlbnRMaXN0ZW5lcnMoKX0sa2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPU9vKGUpLGk9MDtpPG4ubGVuZ3RoOysraSlpZihSbyhuW2ldLHQpKXJldHVybiEwO3JldHVybiExfSxfY29sbGVjdEtleUJpbmRpbmdzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5iZWhhdmlvcnMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5rZXlCaW5kaW5nc30pKTtyZXR1cm4tMT09PXQuaW5kZXhPZih0aGlzLmtleUJpbmRpbmdzKSYmdC5wdXNoKHRoaXMua2V5QmluZGluZ3MpLHR9LF9wcmVwS2V5QmluZGluZ3M6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5fa2V5QmluZGluZ3M9e30sdGhpcy5fY29sbGVjdEtleUJpbmRpbmdzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHQpdGhpcy5fYWRkS2V5QmluZGluZyhlLHRbZV0pfSksdGhpcyksdGhpcy5faW1wZXJhdGl2ZUtleUJpbmRpbmdzKXRoaXMuX2FkZEtleUJpbmRpbmcodCx0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3NbdF0pO2Zvcih2YXIgZSBpbiB0aGlzLl9rZXlCaW5kaW5ncyl0aGlzLl9rZXlCaW5kaW5nc1tlXS5zb3J0KChmdW5jdGlvbih0LGUpe3ZhciBuPXRbMF0uaGFzTW9kaWZpZXJzO3JldHVybiBuPT09ZVswXS5oYXNNb2RpZmllcnM/MDpuPy0xOjF9KSl9LF9hZGRLZXlCaW5kaW5nOmZ1bmN0aW9uKHQsZSl7T28odCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dGhpcy5fa2V5QmluZGluZ3NbdC5ldmVudF09dGhpcy5fa2V5QmluZGluZ3NbdC5ldmVudF18fFtdLHRoaXMuX2tleUJpbmRpbmdzW3QuZXZlbnRdLnB1c2goW3QsZV0pfSksdGhpcyl9LF9yZXNldEtleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fdW5saXN0ZW5LZXlFdmVudExpc3RlbmVycygpLHRoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKX0sX2xpc3RlbktleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5rZXlFdmVudFRhcmdldCYmT2JqZWN0LmtleXModGhpcy5fa2V5QmluZGluZ3MpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX29uS2V5QmluZGluZ0V2ZW50LmJpbmQodGhpcyx0aGlzLl9rZXlCaW5kaW5nc1t0XSk7dGhpcy5fYm91bmRLZXlIYW5kbGVycy5wdXNoKFt0aGlzLmtleUV2ZW50VGFyZ2V0LHQsZV0pLHRoaXMua2V5RXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0LGUpfSksdGhpcyl9LF91bmxpc3RlbktleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7Zm9yKHZhciB0O3RoaXMuX2JvdW5kS2V5SGFuZGxlcnMubGVuZ3RoOykodD10aGlzLl9ib3VuZEtleUhhbmRsZXJzLnBvcCgpKVswXS5yZW1vdmVFdmVudExpc3RlbmVyKHRbMV0sdFsyXSl9LF9vbktleUJpbmRpbmdFdmVudDpmdW5jdGlvbih0LGUpe2lmKHRoaXMuc3RvcEtleWJvYXJkRXZlbnRQcm9wYWdhdGlvbiYmZS5zdG9wUHJvcGFnYXRpb24oKSwhZS5kZWZhdWx0UHJldmVudGVkKWZvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgaT10W25dWzBdLHI9dFtuXVsxXTtpZihSbyhpLGUpJiYodGhpcy5fdHJpZ2dlcktleUhhbmRsZXIoaSxyLGUpLGUuZGVmYXVsdFByZXZlbnRlZCkpcmV0dXJufX0sX3RyaWdnZXJLZXlIYW5kbGVyOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1PYmplY3QuY3JlYXRlKHQpO2kua2V5Ym9hcmRFdmVudD1uO3ZhciByPW5ldyBDdXN0b21FdmVudCh0LmV2ZW50LHtkZXRhaWw6aSxjYW5jZWxhYmxlOiEwfSk7dGhpc1tlXS5jYWxsKHRoaXMsciksci5kZWZhdWx0UHJldmVudGVkJiZuLnByZXZlbnREZWZhdWx0KCl9fSxEbz17cHJvcGVydGllczp7c2Nyb2xsVGFyZ2V0Ont0eXBlOkhUTUxFbGVtZW50LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlZmF1bHRTY3JvbGxUYXJnZXR9fX0sb2JzZXJ2ZXJzOlsiX3Njcm9sbFRhcmdldENoYW5nZWQoc2Nyb2xsVGFyZ2V0LCBpc0F0dGFjaGVkKSJdLF9zaG91bGRIYXZlTGlzdGVuZXI6ITAsX3Njcm9sbFRhcmdldENoYW5nZWQ6ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9vbGRTY3JvbGxUYXJnZXQmJih0aGlzLl90b2dnbGVTY3JvbGxMaXN0ZW5lcighMSx0aGlzLl9vbGRTY3JvbGxUYXJnZXQpLHRoaXMuX29sZFNjcm9sbFRhcmdldD1udWxsKSxlKWlmKCJkb2N1bWVudCI9PT10KXRoaXMuc2Nyb2xsVGFyZ2V0PXRoaXMuX2RvYztlbHNlIGlmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIG49dGhpcy5kb21Ib3N0O3RoaXMuc2Nyb2xsVGFyZ2V0PW4mJm4uJD9uLiRbdF06WWkodGhpcy5vd25lckRvY3VtZW50KS5xdWVyeVNlbGVjdG9yKCIjIit0KX1lbHNlIHRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuX29sZFNjcm9sbFRhcmdldD10LHRoaXMuX3RvZ2dsZVNjcm9sbExpc3RlbmVyKHRoaXMuX3Nob3VsZEhhdmVMaXN0ZW5lcix0KSl9LF9zY3JvbGxIYW5kbGVyOmZ1bmN0aW9uIHQoKXt9LGdldCBfZGVmYXVsdFNjcm9sbFRhcmdldCgpe3JldHVybiB0aGlzLl9kb2N9LGdldCBfZG9jKCl7cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnR9LGdldCBfc2Nyb2xsVG9wKCl7cmV0dXJuIHRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKT90aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cucGFnZVlPZmZzZXQ6dGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsVG9wOjB9LGdldCBfc2Nyb2xsTGVmdCgpe3JldHVybiB0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCk/dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LnBhZ2VYT2Zmc2V0OnRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ6MH0sc2V0IF9zY3JvbGxUb3AodCl7dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LnNjcm9sbFRvKHdpbmRvdy5wYWdlWE9mZnNldCx0KTp0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCkmJih0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A9dCl9LHNldCBfc2Nyb2xsTGVmdCh0KXt0aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cuc2Nyb2xsVG8odCx3aW5kb3cucGFnZVlPZmZzZXQpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ9dCl9LHNjcm9sbDpmdW5jdGlvbih0LGUpe3ZhciBuOyJvYmplY3QiPT10eXBlb2YgdD8obj10LmxlZnQsZT10LnRvcCk6bj10LG49bnx8MCxlPWV8fDAsdGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LnNjcm9sbFRvKG4sZSk6dGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpJiYodGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsTGVmdD1uLHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcD1lKX0sZ2V0IF9zY3JvbGxUYXJnZXRXaWR0aCgpe3JldHVybiB0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCk/dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LmlubmVyV2lkdGg6dGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0V2lkdGg6MH0sZ2V0IF9zY3JvbGxUYXJnZXRIZWlnaHQoKXtyZXR1cm4gdGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpP3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5pbm5lckhlaWdodDp0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRIZWlnaHQ6MH0sX2lzVmFsaWRTY3JvbGxUYXJnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zY3JvbGxUYXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudH0sX3RvZ2dsZVNjcm9sbExpc3RlbmVyOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZT09PXRoaXMuX2RvYz93aW5kb3c6ZTt0P3RoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcnx8KHRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcj10aGlzLl9zY3JvbGxIYW5kbGVyLmJpbmQodGhpcyksbi5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcikpOnRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlciYmKG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXIpLHRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcj1udWxsKX0sdG9nZ2xlU2Nyb2xsTGlzdGVuZXI6ZnVuY3Rpb24odCl7dGhpcy5fc2hvdWxkSGF2ZUxpc3RlbmVyPXQsdGhpcy5fdG9nZ2xlU2Nyb2xsTGlzdGVuZXIodCx0aGlzLnNjcm9sbFRhcmdldCl9fTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNiBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwp2YXIgQm89bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpob25lfGFkOyg/OiBVOyk/IENQVSkgT1MgKFxkKykvKSxIbz1CbyYmQm9bMV0+PTgsRm89Ii0xMDAwMHB4IixWbz0tMTAwO1JyKHtfdGVtcGxhdGU6X2VgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1tYXgtZGV2aWNlLXBpeGVsLXJhdGlvOiAxKSB7CiAgICAgICAgOmhvc3QgewogICAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNpdGVtcyB7CiAgICAgICAgQGFwcGx5IC0taXJvbi1saXN0LWl0ZW1zLWNvbnRhaW5lcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIDpob3N0KDpub3QoW2dyaWRdKSkgI2l0ZW1zID4gOjpzbG90dGVkKCopIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2l0ZW1zID4gOjpzbG90dGVkKCopIHsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGFycmF5LXNlbGVjdG9yIGlkPSJzZWxlY3RvciIgaXRlbXM9Int7aXRlbXN9fSIgc2VsZWN0ZWQ9Int7c2VsZWN0ZWRJdGVtc319IiBzZWxlY3RlZC1pdGVtPSJ7e3NlbGVjdGVkSXRlbX19Ij48L2FycmF5LXNlbGVjdG9yPgoKICAgIDxkaXYgaWQ9Iml0ZW1zIj4KICAgICAgPHNsb3Q+PC9zbG90PgogICAgPC9kaXY+CmAsaXM6Imlyb24tbGlzdCIscHJvcGVydGllczp7aXRlbXM6e3R5cGU6QXJyYXl9LGFzOnt0eXBlOlN0cmluZyx2YWx1ZToiaXRlbSJ9LGluZGV4QXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpbmRleCJ9LHNlbGVjdGVkQXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJzZWxlY3RlZCJ9LGdyaWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsb2JzZXJ2ZXI6Il9ncmlkQ2hhbmdlZCJ9LHNlbGVjdGlvbkVuYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sc2VsZWN0ZWRJdGVtOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LHNlbGVjdGVkSXRlbXM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sbXVsdGlTZWxlY3Rpb246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sc2Nyb2xsT2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZTowfX0sb2JzZXJ2ZXJzOlsiX2l0ZW1zQ2hhbmdlZChpdGVtcy4qKSIsIl9zZWxlY3Rpb25FbmFibGVkQ2hhbmdlZChzZWxlY3Rpb25FbmFibGVkKSIsIl9tdWx0aVNlbGVjdGlvbkNoYW5nZWQobXVsdGlTZWxlY3Rpb24pIiwiX3NldE92ZXJmbG93KHNjcm9sbFRhcmdldCwgc2Nyb2xsT2Zmc2V0KSJdLGJlaGF2aW9yczpbWnIsZ28sRG8scG9dLF9yYXRpbzouNSxfc2Nyb2xsZXJQYWRkaW5nVG9wOjAsX3Njcm9sbFBvc2l0aW9uOjAsX3BoeXNpY2FsU2l6ZTowLF9waHlzaWNhbEF2ZXJhZ2U6MCxfcGh5c2ljYWxBdmVyYWdlQ291bnQ6MCxfcGh5c2ljYWxUb3A6MCxfdmlydHVhbENvdW50OjAsX2VzdFNjcm9sbEhlaWdodDowLF9zY3JvbGxIZWlnaHQ6MCxfdmlld3BvcnRIZWlnaHQ6MCxfdmlld3BvcnRXaWR0aDowLF9waHlzaWNhbEl0ZW1zOm51bGwsX3BoeXNpY2FsU2l6ZXM6bnVsbCxfZmlyc3RWaXNpYmxlSW5kZXhWYWw6bnVsbCxfbGFzdFZpc2libGVJbmRleFZhbDpudWxsLF9tYXhQYWdlczoyLF9mb2N1c2VkSXRlbTpudWxsLF9mb2N1c2VkVmlydHVhbEluZGV4Oi0xLF9mb2N1c2VkUGh5c2ljYWxJbmRleDotMSxfb2Zmc2NyZWVuRm9jdXNlZEl0ZW06bnVsbCxfZm9jdXNCYWNrZmlsbEl0ZW06bnVsbCxfaXRlbXNQZXJSb3c6MSxfaXRlbVdpZHRoOjAsX3Jvd0hlaWdodDowLF90ZW1wbGF0ZUNvc3Q6MCxfcGFyZW50TW9kZWw6ITAsZ2V0IF9waHlzaWNhbEJvdHRvbSgpe3JldHVybiB0aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9waHlzaWNhbFNpemV9LGdldCBfc2Nyb2xsQm90dG9tKCl7cmV0dXJuIHRoaXMuX3Njcm9sbFBvc2l0aW9uK3RoaXMuX3ZpZXdwb3J0SGVpZ2h0fSxnZXQgX3ZpcnR1YWxFbmQoKXtyZXR1cm4gdGhpcy5fdmlydHVhbFN0YXJ0K3RoaXMuX3BoeXNpY2FsQ291bnQtMX0sZ2V0IF9oaWRkZW5Db250ZW50U2l6ZSgpe3JldHVybih0aGlzLmdyaWQ/dGhpcy5fcGh5c2ljYWxSb3dzKnRoaXMuX3Jvd0hlaWdodDp0aGlzLl9waHlzaWNhbFNpemUpLXRoaXMuX3ZpZXdwb3J0SGVpZ2h0fSxnZXQgX2l0ZW1zUGFyZW50KCl7cmV0dXJuIFlpKFlpKHRoaXMuX3VzZXJUZW1wbGF0ZSkucGFyZW50Tm9kZSl9LGdldCBfbWF4U2Nyb2xsVG9wKCl7cmV0dXJuIHRoaXMuX2VzdFNjcm9sbEhlaWdodC10aGlzLl92aWV3cG9ydEhlaWdodCt0aGlzLl9zY3JvbGxPZmZzZXR9LGdldCBfbWF4VmlydHVhbFN0YXJ0KCl7dmFyIHQ9dGhpcy5fY29udmVydEluZGV4VG9Db21wbGV0ZVJvdyh0aGlzLl92aXJ0dWFsQ291bnQpO3JldHVybiBNYXRoLm1heCgwLHQtdGhpcy5fcGh5c2ljYWxDb3VudCl9LHNldCBfdmlydHVhbFN0YXJ0KHQpe3Q9dGhpcy5fY2xhbXAodCwwLHRoaXMuX21heFZpcnR1YWxTdGFydCksdGhpcy5ncmlkJiYodC09dCV0aGlzLl9pdGVtc1BlclJvdyksdGhpcy5fdmlydHVhbFN0YXJ0VmFsPXR9LGdldCBfdmlydHVhbFN0YXJ0KCl7cmV0dXJuIHRoaXMuX3ZpcnR1YWxTdGFydFZhbHx8MH0sc2V0IF9waHlzaWNhbFN0YXJ0KHQpeyh0JT10aGlzLl9waHlzaWNhbENvdW50KTwwJiYodD10aGlzLl9waHlzaWNhbENvdW50K3QpLHRoaXMuZ3JpZCYmKHQtPXQldGhpcy5faXRlbXNQZXJSb3cpLHRoaXMuX3BoeXNpY2FsU3RhcnRWYWw9dH0sZ2V0IF9waHlzaWNhbFN0YXJ0KCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsU3RhcnRWYWx8fDB9LGdldCBfcGh5c2ljYWxFbmQoKXtyZXR1cm4odGhpcy5fcGh5c2ljYWxTdGFydCt0aGlzLl9waHlzaWNhbENvdW50LTEpJXRoaXMuX3BoeXNpY2FsQ291bnR9LHNldCBfcGh5c2ljYWxDb3VudCh0KXt0aGlzLl9waHlzaWNhbENvdW50VmFsPXR9LGdldCBfcGh5c2ljYWxDb3VudCgpe3JldHVybiB0aGlzLl9waHlzaWNhbENvdW50VmFsfHwwfSxnZXQgX29wdFBoeXNpY2FsU2l6ZSgpe3JldHVybiAwPT09dGhpcy5fdmlld3BvcnRIZWlnaHQ/MS8wOnRoaXMuX3ZpZXdwb3J0SGVpZ2h0KnRoaXMuX21heFBhZ2VzfSxnZXQgX2lzVmlzaWJsZSgpe3JldHVybiBCb29sZWFuKHRoaXMub2Zmc2V0V2lkdGh8fHRoaXMub2Zmc2V0SGVpZ2h0KX0sZ2V0IGZpcnN0VmlzaWJsZUluZGV4KCl7dmFyIHQ9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw7aWYobnVsbD09dCl7dmFyIGU9dGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0O3Q9dGhpcy5faXRlcmF0ZUl0ZW1zKChmdW5jdGlvbih0LG4pe3JldHVybihlKz10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQodCkpPnRoaXMuX3Njcm9sbFBvc2l0aW9uP3RoaXMuZ3JpZD9uLW4ldGhpcy5faXRlbXNQZXJSb3c6bjp0aGlzLmdyaWQmJnRoaXMuX3ZpcnR1YWxDb3VudC0xPT09bj9uLW4ldGhpcy5faXRlbXNQZXJSb3c6dm9pZCAwfSkpfHwwLHRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPXR9cmV0dXJuIHR9LGdldCBsYXN0VmlzaWJsZUluZGV4KCl7dmFyIHQ9dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbDtpZihudWxsPT10KXtpZih0aGlzLmdyaWQpdD1NYXRoLm1pbih0aGlzLl92aXJ0dWFsQ291bnQsdGhpcy5maXJzdFZpc2libGVJbmRleCt0aGlzLl9lc3RSb3dzSW5WaWV3KnRoaXMuX2l0ZW1zUGVyUm93LTEpO2Vsc2V7dmFyIGU9dGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0O3RoaXMuX2l0ZXJhdGVJdGVtcygoZnVuY3Rpb24obixpKXtlPHRoaXMuX3Njcm9sbEJvdHRvbSYmKHQ9aSksZSs9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KG4pfSkpfXRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dH1yZXR1cm4gdH0sZ2V0IF9kZWZhdWx0U2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXN9LGdldCBfdmlydHVhbFJvd0NvdW50KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl92aXJ0dWFsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpfSxnZXQgX2VzdFJvd3NJblZpZXcoKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuX3ZpZXdwb3J0SGVpZ2h0L3RoaXMuX3Jvd0hlaWdodCl9LGdldCBfcGh5c2ljYWxSb3dzKCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl9waHlzaWNhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KX0sZ2V0IF9zY3JvbGxPZmZzZXQoKXtyZXR1cm4gdGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wK3RoaXMuc2Nyb2xsT2Zmc2V0fSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2RpZEZvY3VzLmJpbmQodGhpcyksITApfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2RlYm91bmNlKCJfcmVuZGVyIix0aGlzLl9yZW5kZXIsX3QpLHRoaXMubGlzdGVuKHRoaXMsImlyb24tcmVzaXplIiwiX3Jlc2l6ZUhhbmRsZXIiKSx0aGlzLmxpc3Rlbih0aGlzLCJrZXlkb3duIiwiX2tleWRvd25IYW5kbGVyIil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy51bmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsIl9yZXNpemVIYW5kbGVyIiksdGhpcy51bmxpc3Rlbih0aGlzLCJrZXlkb3duIiwiX2tleWRvd25IYW5kbGVyIil9LF9zZXRPdmVyZmxvdzpmdW5jdGlvbih0KXt0aGlzLnN0eWxlLndlYmtpdE92ZXJmbG93U2Nyb2xsaW5nPXQ9PT10aGlzPyJ0b3VjaCI6IiIsdGhpcy5zdHlsZS5vdmVyZmxvd1k9dD09PXRoaXM/ImF1dG8iOiIiLHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9bnVsbCx0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsLHRoaXMuX2RlYm91bmNlKCJfcmVuZGVyIix0aGlzLl9yZW5kZXIsX3QpfSx1cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXM6ZnVuY3Rpb24oKXt2YXIgdD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKTt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3A9dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzPzA6cGFyc2VJbnQodFsicGFkZGluZy10b3AiXSwxMCksdGhpcy5faXNSVEw9Qm9vbGVhbigicnRsIj09PXQuZGlyZWN0aW9uKSx0aGlzLl92aWV3cG9ydFdpZHRoPXRoaXMuJC5pdGVtcy5vZmZzZXRXaWR0aCx0aGlzLl92aWV3cG9ydEhlaWdodD10aGlzLl9zY3JvbGxUYXJnZXRIZWlnaHQsdGhpcy5ncmlkJiZ0aGlzLl91cGRhdGVHcmlkTWV0cmljcygpfSxfc2Nyb2xsSGFuZGxlcjpmdW5jdGlvbigpe3ZhciB0PU1hdGgubWF4KDAsTWF0aC5taW4odGhpcy5fbWF4U2Nyb2xsVG9wLHRoaXMuX3Njcm9sbFRvcCkpLGU9dC10aGlzLl9zY3JvbGxQb3NpdGlvbixuPWU+PTA7aWYodGhpcy5fc2Nyb2xsUG9zaXRpb249dCx0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsLHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9bnVsbCxNYXRoLmFicyhlKT50aGlzLl9waHlzaWNhbFNpemUmJnRoaXMuX3BoeXNpY2FsU2l6ZT4wKXtlLT10aGlzLl9zY3JvbGxPZmZzZXQ7dmFyIGk9TWF0aC5yb3VuZChlL3RoaXMuX3BoeXNpY2FsQXZlcmFnZSkqdGhpcy5faXRlbXNQZXJSb3c7dGhpcy5fdmlydHVhbFN0YXJ0PXRoaXMuX3ZpcnR1YWxTdGFydCtpLHRoaXMuX3BoeXNpY2FsU3RhcnQ9dGhpcy5fcGh5c2ljYWxTdGFydCtpLHRoaXMuX3BoeXNpY2FsVG9wPU1hdGgubWluKE1hdGguZmxvb3IodGhpcy5fdmlydHVhbFN0YXJ0L3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2UsdGhpcy5fc2Nyb2xsUG9zaXRpb24pLHRoaXMuX3VwZGF0ZSgpfWVsc2UgaWYodGhpcy5fcGh5c2ljYWxDb3VudD4wKXt2YXIgcj10aGlzLl9nZXRSZXVzYWJsZXMobik7bj8odGhpcy5fcGh5c2ljYWxUb3A9ci5waHlzaWNhbFRvcCx0aGlzLl92aXJ0dWFsU3RhcnQ9dGhpcy5fdmlydHVhbFN0YXJ0K3IuaW5kZXhlcy5sZW5ndGgsdGhpcy5fcGh5c2ljYWxTdGFydD10aGlzLl9waHlzaWNhbFN0YXJ0K3IuaW5kZXhlcy5sZW5ndGgpOih0aGlzLl92aXJ0dWFsU3RhcnQ9dGhpcy5fdmlydHVhbFN0YXJ0LXIuaW5kZXhlcy5sZW5ndGgsdGhpcy5fcGh5c2ljYWxTdGFydD10aGlzLl9waHlzaWNhbFN0YXJ0LXIuaW5kZXhlcy5sZW5ndGgpLHRoaXMuX3VwZGF0ZShyLmluZGV4ZXMsbj9udWxsOnIuaW5kZXhlcyksdGhpcy5fZGVib3VuY2UoIl9pbmNyZWFzZVBvb2xJZk5lZWRlZCIsdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQuYmluZCh0aGlzLDApLHZ0KX19LF9nZXRSZXVzYWJsZXM6ZnVuY3Rpb24odCl7dmFyIGUsbixpLHI9W10sbz10aGlzLl9oaWRkZW5Db250ZW50U2l6ZSp0aGlzLl9yYXRpbyxhPXRoaXMuX3ZpcnR1YWxTdGFydCxzPXRoaXMuX3ZpcnR1YWxFbmQsbD10aGlzLl9waHlzaWNhbENvdW50LGM9dGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0LHU9dGhpcy5fc2Nyb2xsUG9zaXRpb24saD10aGlzLl9zY3JvbGxCb3R0b207Zm9yKHQ/KGU9dGhpcy5fcGh5c2ljYWxTdGFydCxuPXUtYyk6KGU9dGhpcy5fcGh5c2ljYWxFbmQsbj10aGlzLl9waHlzaWNhbEJvdHRvbSt0aGlzLl9zY3JvbGxPZmZzZXQtaCk7bi09aT10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQoZSksIShyLmxlbmd0aD49bHx8bjw9byk7KWlmKHQpe2lmKHMrci5sZW5ndGgrMT49dGhpcy5fdmlydHVhbENvdW50KWJyZWFrO2lmKGMraT49dS10aGlzLl9zY3JvbGxPZmZzZXQpYnJlYWs7ci5wdXNoKGUpLGMrPWksZT0oZSsxKSVsfWVsc2V7aWYoYS1yLmxlbmd0aDw9MClicmVhaztpZihjK3RoaXMuX3BoeXNpY2FsU2l6ZS1pPD1oKWJyZWFrO3IucHVzaChlKSxjLT1pLGU9MD09PWU/bC0xOmUtMX1yZXR1cm57aW5kZXhlczpyLHBoeXNpY2FsVG9wOmMtdGhpcy5fc2Nyb2xsT2Zmc2V0fX0sX3VwZGF0ZTpmdW5jdGlvbih0LGUpe2lmKCEodCYmMD09PXQubGVuZ3RofHwwPT09dGhpcy5fcGh5c2ljYWxDb3VudCkpe2lmKHRoaXMuX21hbmFnZUZvY3VzKCksdGhpcy5fYXNzaWduTW9kZWxzKHQpLHRoaXMuX3VwZGF0ZU1ldHJpY3ModCksZSlmb3IoO2UubGVuZ3RoOyl7dmFyIG49ZS5wb3AoKTt0aGlzLl9waHlzaWNhbFRvcC09dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KG4pfXRoaXMuX3Bvc2l0aW9uSXRlbXMoKSx0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoKX19LF9jcmVhdGVQb29sOmZ1bmN0aW9uKHQpe3ZhciBlLG47dGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKTt2YXIgaT1uZXcgQXJyYXkodCk7Zm9yKGU9MDtlPHQ7ZSsrKW49dGhpcy5zdGFtcChudWxsKSxpW2VdPW4ucm9vdC5xdWVyeVNlbGVjdG9yKCIqIiksdGhpcy5faXRlbXNQYXJlbnQuYXBwZW5kQ2hpbGQobi5yb290KTtyZXR1cm4gaX0sX2lzQ2xpZW50RnVsbDpmdW5jdGlvbigpe3JldHVybiAwIT10aGlzLl9zY3JvbGxCb3R0b20mJnRoaXMuX3BoeXNpY2FsQm90dG9tLTE+PXRoaXMuX3Njcm9sbEJvdHRvbSYmdGhpcy5fcGh5c2ljYWxUb3A8PXRoaXMuX3Njcm9sbFBvc2l0aW9ufSxfaW5jcmVhc2VQb29sSWZOZWVkZWQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fY2xhbXAodGhpcy5fcGh5c2ljYWxDb3VudCt0LDMsdGhpcy5fdmlydHVhbENvdW50LXRoaXMuX3ZpcnR1YWxTdGFydCk7aWYoZT10aGlzLl9jb252ZXJ0SW5kZXhUb0NvbXBsZXRlUm93KGUpLHRoaXMuZ3JpZCl7dmFyIG49ZSV0aGlzLl9pdGVtc1BlclJvdztuJiZlLW48PXRoaXMuX3BoeXNpY2FsQ291bnQmJihlKz10aGlzLl9pdGVtc1BlclJvdyksZS09bn12YXIgaT1lLXRoaXMuX3BoeXNpY2FsQ291bnQscj1NYXRoLnJvdW5kKC41KnRoaXMuX3BoeXNpY2FsQ291bnQpO2lmKCEoaTwwKSl7aWYoaT4wKXt2YXIgbz13aW5kb3cucGVyZm9ybWFuY2Uubm93KCk7W10ucHVzaC5hcHBseSh0aGlzLl9waHlzaWNhbEl0ZW1zLHRoaXMuX2NyZWF0ZVBvb2woaSkpO2Zvcih2YXIgYT0wO2E8aTthKyspdGhpcy5fcGh5c2ljYWxTaXplcy5wdXNoKDApO3RoaXMuX3BoeXNpY2FsQ291bnQ9dGhpcy5fcGh5c2ljYWxDb3VudCtpLHRoaXMuX3BoeXNpY2FsU3RhcnQ+dGhpcy5fcGh5c2ljYWxFbmQmJnRoaXMuX2lzSW5kZXhSZW5kZXJlZCh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KSYmdGhpcy5fZ2V0UGh5c2ljYWxJbmRleCh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KTx0aGlzLl9waHlzaWNhbEVuZCYmKHRoaXMuX3BoeXNpY2FsU3RhcnQ9dGhpcy5fcGh5c2ljYWxTdGFydCtpKSx0aGlzLl91cGRhdGUoKSx0aGlzLl90ZW1wbGF0ZUNvc3Q9KHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKS1vKS9pLHI9TWF0aC5yb3VuZCguNSp0aGlzLl9waHlzaWNhbENvdW50KX10aGlzLl92aXJ0dWFsRW5kPj10aGlzLl92aXJ0dWFsQ291bnQtMXx8MD09PXJ8fCh0aGlzLl9pc0NsaWVudEZ1bGwoKT90aGlzLl9waHlzaWNhbFNpemU8dGhpcy5fb3B0UGh5c2ljYWxTaXplJiZ0aGlzLl9kZWJvdW5jZSgiX2luY3JlYXNlUG9vbElmTmVlZGVkIix0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZC5iaW5kKHRoaXMsdGhpcy5fY2xhbXAoTWF0aC5yb3VuZCg1MC90aGlzLl90ZW1wbGF0ZUNvc3QpLDEscikpLHl0KTp0aGlzLl9kZWJvdW5jZSgiX2luY3JlYXNlUG9vbElmTmVlZGVkIix0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZC5iaW5kKHRoaXMsciksdnQpKX19LF9yZW5kZXI6ZnVuY3Rpb24oKXtpZih0aGlzLmlzQXR0YWNoZWQmJnRoaXMuX2lzVmlzaWJsZSlpZigwIT09dGhpcy5fcGh5c2ljYWxDb3VudCl7dmFyIHQ9dGhpcy5fZ2V0UmV1c2FibGVzKCEwKTt0aGlzLl9waHlzaWNhbFRvcD10LnBoeXNpY2FsVG9wLHRoaXMuX3ZpcnR1YWxTdGFydD10aGlzLl92aXJ0dWFsU3RhcnQrdC5pbmRleGVzLmxlbmd0aCx0aGlzLl9waHlzaWNhbFN0YXJ0PXRoaXMuX3BoeXNpY2FsU3RhcnQrdC5pbmRleGVzLmxlbmd0aCx0aGlzLl91cGRhdGUodC5pbmRleGVzKSx0aGlzLl91cGRhdGUoKSx0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgwKX1lbHNlIHRoaXMuX3ZpcnR1YWxDb3VudD4wJiYodGhpcy51cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXMoKSx0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgzKSl9LF9lbnN1cmVUZW1wbGF0aXplZDpmdW5jdGlvbigpe2lmKCF0aGlzLmN0b3Ipe3RoaXMuX3VzZXJUZW1wbGF0ZT10aGlzLnF1ZXJ5RWZmZWN0aXZlQ2hpbGRyZW4oInRlbXBsYXRlIiksdGhpcy5fdXNlclRlbXBsYXRlfHxjb25zb2xlLndhcm4oImlyb24tbGlzdCByZXF1aXJlcyBhIHRlbXBsYXRlIHRvIGJlIHByb3ZpZGVkIGluIGxpZ2h0LWRvbSIpO3ZhciB0PXtfX2tleV9fOiEwfTt0W3RoaXMuYXNdPSEwLHRbdGhpcy5pbmRleEFzXT0hMCx0W3RoaXMuc2VsZWN0ZWRBc109ITAsdC50YWJJbmRleD0hMCx0aGlzLl9pbnN0YW5jZVByb3BzPXQsdGhpcy50ZW1wbGF0aXplKHRoaXMuX3VzZXJUZW1wbGF0ZSx0aGlzLm11dGFibGVEYXRhKX19LF9ncmlkQ2hhbmdlZDpmdW5jdGlvbih0LGUpe3ZvaWQgMCE9PWUmJih0aGlzLm5vdGlmeVJlc2l6ZSgpLERpKCksdCYmdGhpcy5fdXBkYXRlR3JpZE1ldHJpY3MoKSl9LF9pdGVtc0NoYW5nZWQ6ZnVuY3Rpb24odCl7aWYoIml0ZW1zIj09PXQucGF0aCl0aGlzLl92aXJ0dWFsU3RhcnQ9MCx0aGlzLl9waHlzaWNhbFRvcD0wLHRoaXMuX3ZpcnR1YWxDb3VudD10aGlzLml0ZW1zP3RoaXMuaXRlbXMubGVuZ3RoOjAsdGhpcy5fcGh5c2ljYWxJbmRleEZvcktleT17fSx0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsLHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9bnVsbCx0aGlzLl9waHlzaWNhbENvdW50PXRoaXMuX3BoeXNpY2FsQ291bnR8fDAsdGhpcy5fcGh5c2ljYWxJdGVtcz10aGlzLl9waHlzaWNhbEl0ZW1zfHxbXSx0aGlzLl9waHlzaWNhbFNpemVzPXRoaXMuX3BoeXNpY2FsU2l6ZXN8fFtdLHRoaXMuX3BoeXNpY2FsU3RhcnQ9MCx0aGlzLl9zY3JvbGxUb3A+dGhpcy5fc2Nyb2xsT2Zmc2V0JiZ0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKDApLHRoaXMuX3JlbW92ZUZvY3VzZWRJdGVtKCksdGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLHRoaXMuX3JlbmRlcixfdCk7ZWxzZSBpZigiaXRlbXMuc3BsaWNlcyI9PT10LnBhdGgpe2lmKHRoaXMuX2FkanVzdFZpcnR1YWxJbmRleCh0LnZhbHVlLmluZGV4U3BsaWNlcyksdGhpcy5fdmlydHVhbENvdW50PXRoaXMuaXRlbXM/dGhpcy5pdGVtcy5sZW5ndGg6MCx0LnZhbHVlLmluZGV4U3BsaWNlcy5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gdC5hZGRlZENvdW50PjB8fHQucmVtb3ZlZC5sZW5ndGg+MH0pKSl7dmFyIGU9dGhpcy5fZ2V0QWN0aXZlRWxlbWVudCgpO3RoaXMuY29udGFpbnMoZSkmJmUuYmx1cigpfXZhciBuPXQudmFsdWUuaW5kZXhTcGxpY2VzLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmluZGV4K3QuYWRkZWRDb3VudD49dGhpcy5fdmlydHVhbFN0YXJ0JiZ0LmluZGV4PD10aGlzLl92aXJ0dWFsRW5kfSksdGhpcyk7dGhpcy5faXNDbGllbnRGdWxsKCkmJiFufHx0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLF90KX1lbHNlIml0ZW1zLmxlbmd0aCIhPT10LnBhdGgmJnRoaXMuX2ZvcndhcmRJdGVtUGF0aCh0LnBhdGgsdC52YWx1ZSl9LF9mb3J3YXJkSXRlbVBhdGg6ZnVuY3Rpb24odCxlKXt2YXIgbixpLHIsbz0odD10LnNsaWNlKDYpKS5pbmRleE9mKCIuIik7LTE9PT1vJiYobz10Lmxlbmd0aCk7dmFyIGE9dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pLHM9cGFyc2VJbnQodC5zdWJzdHJpbmcoMCxvKSwxMCk7KG49dGhpcy5faXNJbmRleFJlbmRlcmVkKHMpKT8oaT10aGlzLl9nZXRQaHlzaWNhbEluZGV4KHMpLHI9dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1tpXSkpOmEmJihyPWEpLHImJnJbdGhpcy5pbmRleEFzXT09PXMmJih0PXQuc3Vic3RyaW5nKG8rMSksci5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHQ9dGhpcy5hcysodD8iLiIrdDoiIiksZSwhMSwhMCksci5fZmx1c2hQcm9wZXJ0aWVzJiZyLl9mbHVzaFByb3BlcnRpZXMoKSxuJiYodGhpcy5fdXBkYXRlTWV0cmljcyhbaV0pLHRoaXMuX3Bvc2l0aW9uSXRlbXMoKSx0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoKSkpfSxfYWRqdXN0VmlydHVhbEluZGV4OmZ1bmN0aW9uKHQpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYodC5yZW1vdmVkLmZvckVhY2godGhpcy5fcmVtb3ZlSXRlbSx0aGlzKSx0LmluZGV4PHRoaXMuX3ZpcnR1YWxTdGFydCl7dmFyIGU9TWF0aC5tYXgodC5hZGRlZENvdW50LXQucmVtb3ZlZC5sZW5ndGgsdC5pbmRleC10aGlzLl92aXJ0dWFsU3RhcnQpO3RoaXMuX3ZpcnR1YWxTdGFydD10aGlzLl92aXJ0dWFsU3RhcnQrZSx0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4Pj0wJiYodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleD10aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4K2UpfX0pLHRoaXMpfSxfcmVtb3ZlSXRlbTpmdW5jdGlvbih0KXt0aGlzLiQuc2VsZWN0b3IuZGVzZWxlY3QodCksdGhpcy5fZm9jdXNlZEl0ZW0mJnRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX2ZvY3VzZWRJdGVtKVt0aGlzLmFzXT09PXQmJnRoaXMuX3JlbW92ZUZvY3VzZWRJdGVtKCl9LF9pdGVyYXRlSXRlbXM6ZnVuY3Rpb24odCxlKXt2YXIgbixpLHIsbztpZigyPT09YXJndW1lbnRzLmxlbmd0aCYmZSl7Zm9yKG89MDtvPGUubGVuZ3RoO28rKylpZihpPXRoaXMuX2NvbXB1dGVWaWR4KG49ZVtvXSksbnVsbCE9KHI9dC5jYWxsKHRoaXMsbixpKSkpcmV0dXJuIHJ9ZWxzZXtmb3Iobj10aGlzLl9waHlzaWNhbFN0YXJ0LGk9dGhpcy5fdmlydHVhbFN0YXJ0O248dGhpcy5fcGh5c2ljYWxDb3VudDtuKyssaSsrKWlmKG51bGwhPShyPXQuY2FsbCh0aGlzLG4saSkpKXJldHVybiByO2ZvcihuPTA7bjx0aGlzLl9waHlzaWNhbFN0YXJ0O24rKyxpKyspaWYobnVsbCE9KHI9dC5jYWxsKHRoaXMsbixpKSkpcmV0dXJuIHJ9fSxfY29tcHV0ZVZpZHg6ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PXRoaXMuX3BoeXNpY2FsU3RhcnQ/dGhpcy5fdmlydHVhbFN0YXJ0Kyh0LXRoaXMuX3BoeXNpY2FsU3RhcnQpOnRoaXMuX3ZpcnR1YWxTdGFydCsodGhpcy5fcGh5c2ljYWxDb3VudC10aGlzLl9waHlzaWNhbFN0YXJ0KSt0fSxfYXNzaWduTW9kZWxzOmZ1bmN0aW9uKHQpe3RoaXMuX2l0ZXJhdGVJdGVtcygoZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9waHlzaWNhbEl0ZW1zW3RdLGk9dGhpcy5pdGVtcyYmdGhpcy5pdGVtc1tlXTtpZihudWxsIT1pKXt2YXIgcj10aGlzLm1vZGVsRm9yRWxlbWVudChuKTtyLl9fa2V5X189bnVsbCx0aGlzLl9mb3J3YXJkUHJvcGVydHkocix0aGlzLmFzLGkpLHRoaXMuX2ZvcndhcmRQcm9wZXJ0eShyLHRoaXMuc2VsZWN0ZWRBcyx0aGlzLiQuc2VsZWN0b3IuaXNTZWxlY3RlZChpKSksdGhpcy5fZm9yd2FyZFByb3BlcnR5KHIsdGhpcy5pbmRleEFzLGUpLHRoaXMuX2ZvcndhcmRQcm9wZXJ0eShyLCJ0YWJJbmRleCIsdGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleD09PWU/MDotMSksdGhpcy5fcGh5c2ljYWxJbmRleEZvcktleVtyLl9fa2V5X19dPXQsci5fZmx1c2hQcm9wZXJ0aWVzJiZyLl9mbHVzaFByb3BlcnRpZXMoITApLG4ucmVtb3ZlQXR0cmlidXRlKCJoaWRkZW4iKX1lbHNlIG4uc2V0QXR0cmlidXRlKCJoaWRkZW4iLCIiKX0pLHQpfSxfdXBkYXRlTWV0cmljczpmdW5jdGlvbih0KXtEaSgpO3ZhciBlPTAsbj0wLGk9dGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQscj10aGlzLl9waHlzaWNhbEF2ZXJhZ2U7dGhpcy5faXRlcmF0ZUl0ZW1zKChmdW5jdGlvbih0LGkpe24rPXRoaXMuX3BoeXNpY2FsU2l6ZXNbdF0sdGhpcy5fcGh5c2ljYWxTaXplc1t0XT10aGlzLl9waHlzaWNhbEl0ZW1zW3RdLm9mZnNldEhlaWdodCxlKz10aGlzLl9waHlzaWNhbFNpemVzW3RdLHRoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50Kz10aGlzLl9waHlzaWNhbFNpemVzW3RdPzE6MH0pLHQpLHRoaXMuZ3JpZD8odGhpcy5fdXBkYXRlR3JpZE1ldHJpY3MoKSx0aGlzLl9waHlzaWNhbFNpemU9TWF0aC5jZWlsKHRoaXMuX3BoeXNpY2FsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3Jvd0hlaWdodCk6KG49MT09PXRoaXMuX2l0ZW1zUGVyUm93P246TWF0aC5jZWlsKHRoaXMuX3BoeXNpY2FsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3Jvd0hlaWdodCx0aGlzLl9waHlzaWNhbFNpemU9dGhpcy5fcGh5c2ljYWxTaXplK2Utbix0aGlzLl9pdGVtc1BlclJvdz0xKSx0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCE9PWkmJih0aGlzLl9waHlzaWNhbEF2ZXJhZ2U9TWF0aC5yb3VuZCgocippK2UpL3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50KSl9LF91cGRhdGVHcmlkTWV0cmljczpmdW5jdGlvbigpe3RoaXMuX2l0ZW1XaWR0aD10aGlzLl9waHlzaWNhbENvdW50PjA/dGhpcy5fcGh5c2ljYWxJdGVtc1swXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDoyMDAsdGhpcy5fcm93SGVpZ2h0PXRoaXMuX3BoeXNpY2FsQ291bnQ+MD90aGlzLl9waHlzaWNhbEl0ZW1zWzBdLm9mZnNldEhlaWdodDoyMDAsdGhpcy5faXRlbXNQZXJSb3c9dGhpcy5faXRlbVdpZHRoP01hdGguZmxvb3IodGhpcy5fdmlld3BvcnRXaWR0aC90aGlzLl9pdGVtV2lkdGgpOnRoaXMuX2l0ZW1zUGVyUm93fSxfcG9zaXRpb25JdGVtczpmdW5jdGlvbigpe3RoaXMuX2FkanVzdFNjcm9sbFBvc2l0aW9uKCk7dmFyIHQ9dGhpcy5fcGh5c2ljYWxUb3A7aWYodGhpcy5ncmlkKXt2YXIgZT0odGhpcy5fdmlld3BvcnRXaWR0aC10aGlzLl9pdGVtc1BlclJvdyp0aGlzLl9pdGVtV2lkdGgpLzI7dGhpcy5faXRlcmF0ZUl0ZW1zKChmdW5jdGlvbihuLGkpe3ZhciByPU1hdGguZmxvb3IoaSV0aGlzLl9pdGVtc1BlclJvdyp0aGlzLl9pdGVtV2lkdGgrZSk7dGhpcy5faXNSVEwmJihyKj0tMSksdGhpcy50cmFuc2xhdGUzZChyKyJweCIsdCsicHgiLDAsdGhpcy5fcGh5c2ljYWxJdGVtc1tuXSksdGhpcy5fc2hvdWxkUmVuZGVyTmV4dFJvdyhpKSYmKHQrPXRoaXMuX3Jvd0hlaWdodCl9KSl9ZWxzZXtjb25zdCBlPVtdO3RoaXMuX2l0ZXJhdGVJdGVtcygoZnVuY3Rpb24obixpKXtjb25zdCByPXRoaXMuX3BoeXNpY2FsSXRlbXNbbl07dGhpcy50cmFuc2xhdGUzZCgwLHQrInB4IiwwLHIpLHQrPXRoaXMuX3BoeXNpY2FsU2l6ZXNbbl07Y29uc3Qgbz1yLmlkO28mJmUucHVzaChvKX0pKSxlLmxlbmd0aCYmdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtb3ducyIsZS5qb2luKCIgIikpfX0sX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5ncmlkP3RoaXMuX2NvbXB1dGVWaWR4KHQpJXRoaXMuX2l0ZW1zUGVyUm93IT10aGlzLl9pdGVtc1BlclJvdy0xPzA6dGhpcy5fcm93SGVpZ2h0OnRoaXMuX3BoeXNpY2FsU2l6ZXNbdF19LF9zaG91bGRSZW5kZXJOZXh0Um93OmZ1bmN0aW9uKHQpe3JldHVybiB0JXRoaXMuX2l0ZW1zUGVyUm93PT10aGlzLl9pdGVtc1BlclJvdy0xfSxfYWRqdXN0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgdD0wPT09dGhpcy5fdmlydHVhbFN0YXJ0P3RoaXMuX3BoeXNpY2FsVG9wOk1hdGgubWluKHRoaXMuX3Njcm9sbFBvc2l0aW9uK3RoaXMuX3BoeXNpY2FsVG9wLDApO2lmKDAhPT10KXt0aGlzLl9waHlzaWNhbFRvcD10aGlzLl9waHlzaWNhbFRvcC10O3ZhciBlPXRoaXMuX3Njcm9sbFBvc2l0aW9uOyFIbyYmZT4wJiZ0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKGUtdCl9fSxfcmVzZXRTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbih0KXt0aGlzLnNjcm9sbFRhcmdldCYmdD49MCYmKHRoaXMuX3Njcm9sbFRvcD10LHRoaXMuX3Njcm9sbFBvc2l0aW9uPXRoaXMuX3Njcm9sbFRvcCl9LF91cGRhdGVTY3JvbGxlclNpemU6ZnVuY3Rpb24odCl7dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0PXRoaXMuZ3JpZD90aGlzLl92aXJ0dWFsUm93Q291bnQqdGhpcy5fcm93SGVpZ2h0OnRoaXMuX3BoeXNpY2FsQm90dG9tK01hdGgubWF4KHRoaXMuX3ZpcnR1YWxDb3VudC10aGlzLl9waHlzaWNhbENvdW50LXRoaXMuX3ZpcnR1YWxTdGFydCwwKSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2UsKCh0PSh0PSh0PXR8fDA9PT10aGlzLl9zY3JvbGxIZWlnaHQpfHx0aGlzLl9zY3JvbGxQb3NpdGlvbj49dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3BoeXNpY2FsU2l6ZSl8fHRoaXMuZ3JpZCYmdGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodDx0aGlzLl9lc3RTY3JvbGxIZWlnaHQpfHxNYXRoLmFicyh0aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fc2Nyb2xsSGVpZ2h0KT49dGhpcy5fdmlld3BvcnRIZWlnaHQpJiYodGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodD10aGlzLl9lc3RTY3JvbGxIZWlnaHQrInB4Iix0aGlzLl9zY3JvbGxIZWlnaHQ9dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0KX0sc2Nyb2xsVG9JdGVtOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKHQpKX0sc2Nyb2xsVG9JbmRleDpmdW5jdGlvbih0KXtpZighKCJudW1iZXIiIT10eXBlb2YgdHx8dDwwfHx0PnRoaXMuaXRlbXMubGVuZ3RoLTEpJiYoRGkoKSwwIT09dGhpcy5fcGh5c2ljYWxDb3VudCkpe3Q9dGhpcy5fY2xhbXAodCwwLHRoaXMuX3ZpcnR1YWxDb3VudC0xKSwoIXRoaXMuX2lzSW5kZXhSZW5kZXJlZCh0KXx8dD49dGhpcy5fbWF4VmlydHVhbFN0YXJ0KSYmKHRoaXMuX3ZpcnR1YWxTdGFydD10aGlzLmdyaWQ/dC0yKnRoaXMuX2l0ZW1zUGVyUm93OnQtMSksdGhpcy5fbWFuYWdlRm9jdXMoKSx0aGlzLl9hc3NpZ25Nb2RlbHMoKSx0aGlzLl91cGRhdGVNZXRyaWNzKCksdGhpcy5fcGh5c2ljYWxUb3A9TWF0aC5mbG9vcih0aGlzLl92aXJ0dWFsU3RhcnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3BoeXNpY2FsQXZlcmFnZTtmb3IodmFyIGU9dGhpcy5fcGh5c2ljYWxTdGFydCxuPXRoaXMuX3ZpcnR1YWxTdGFydCxpPTAscj10aGlzLl9oaWRkZW5Db250ZW50U2l6ZTtuPHQmJmk8PXI7KWkrPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChlKSxlPShlKzEpJXRoaXMuX3BoeXNpY2FsQ291bnQsbisrO3RoaXMuX3VwZGF0ZVNjcm9sbGVyU2l6ZSghMCksdGhpcy5fcG9zaXRpb25JdGVtcygpLHRoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24odGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0K2kpLHRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDApLHRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPW51bGwsdGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1udWxsfX0sX3Jlc2V0QXZlcmFnZTpmdW5jdGlvbigpe3RoaXMuX3BoeXNpY2FsQXZlcmFnZT0wLHRoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50PTB9LF9yZXNpemVIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLChmdW5jdGlvbigpe3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPW51bGwsdGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1udWxsLHRoaXMuX2lzVmlzaWJsZT8odGhpcy51cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXMoKSx0aGlzLnRvZ2dsZVNjcm9sbExpc3RlbmVyKCEwKSx0aGlzLl9yZXNldEF2ZXJhZ2UoKSx0aGlzLl9yZW5kZXIoKSk6dGhpcy50b2dnbGVTY3JvbGxMaXN0ZW5lcighMSl9KSxfdCl9LHNlbGVjdEl0ZW06ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc2VsZWN0SW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKHQpKX0sc2VsZWN0SW5kZXg6ZnVuY3Rpb24odCl7aWYoISh0PDB8fHQ+PXRoaXMuX3ZpcnR1YWxDb3VudCkpe2lmKCF0aGlzLm11bHRpU2VsZWN0aW9uJiZ0aGlzLnNlbGVjdGVkSXRlbSYmdGhpcy5jbGVhclNlbGVjdGlvbigpLHRoaXMuX2lzSW5kZXhSZW5kZXJlZCh0KSl7dmFyIGU9dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9nZXRQaHlzaWNhbEluZGV4KHQpXSk7ZSYmKGVbdGhpcy5zZWxlY3RlZEFzXT0hMCksdGhpcy51cGRhdGVTaXplRm9ySW5kZXgodCl9dGhpcy4kLnNlbGVjdG9yLnNlbGVjdEluZGV4KHQpfX0sZGVzZWxlY3RJdGVtOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRlc2VsZWN0SW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKHQpKX0sZGVzZWxlY3RJbmRleDpmdW5jdGlvbih0KXt0PDB8fHQ+PXRoaXMuX3ZpcnR1YWxDb3VudHx8KHRoaXMuX2lzSW5kZXhSZW5kZXJlZCh0KSYmKHRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZ2V0UGh5c2ljYWxJbmRleCh0KV0pW3RoaXMuc2VsZWN0ZWRBc109ITEsdGhpcy51cGRhdGVTaXplRm9ySW5kZXgodCkpLHRoaXMuJC5zZWxlY3Rvci5kZXNlbGVjdEluZGV4KHQpKX0sdG9nZ2xlU2VsZWN0aW9uRm9ySXRlbTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50b2dnbGVTZWxlY3Rpb25Gb3JJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YodCkpfSx0b2dnbGVTZWxlY3Rpb25Gb3JJbmRleDpmdW5jdGlvbih0KXsodGhpcy4kLnNlbGVjdG9yLmlzSW5kZXhTZWxlY3RlZD90aGlzLiQuc2VsZWN0b3IuaXNJbmRleFNlbGVjdGVkKHQpOnRoaXMuJC5zZWxlY3Rvci5pc1NlbGVjdGVkKHRoaXMuaXRlbXNbdF0pKT90aGlzLmRlc2VsZWN0SW5kZXgodCk6dGhpcy5zZWxlY3RJbmRleCh0KX0sY2xlYXJTZWxlY3Rpb246ZnVuY3Rpb24oKXt0aGlzLl9pdGVyYXRlSXRlbXMoKGZ1bmN0aW9uKHQsZSl7dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1t0XSlbdGhpcy5zZWxlY3RlZEFzXT0hMX0pKSx0aGlzLiQuc2VsZWN0b3IuY2xlYXJTZWxlY3Rpb24oKX0sX3NlbGVjdGlvbkVuYWJsZWRDaGFuZ2VkOmZ1bmN0aW9uKHQpeyh0P3RoaXMubGlzdGVuOnRoaXMudW5saXN0ZW4pLmNhbGwodGhpcyx0aGlzLCJ0YXAiLCJfc2VsZWN0aW9uSGFuZGxlciIpfSxfc2VsZWN0aW9uSGFuZGxlcjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm1vZGVsRm9yRWxlbWVudCh0LnRhcmdldCk7aWYoZSl7dmFyIG4saSxyPVlpKHQpLnBhdGhbMF0sbz10aGlzLl9nZXRBY3RpdmVFbGVtZW50KCksYT10aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgoZVt0aGlzLmluZGV4QXNdKV07ImlucHV0IiE9PXIubG9jYWxOYW1lJiYiYnV0dG9uIiE9PXIubG9jYWxOYW1lJiYic2VsZWN0IiE9PXIubG9jYWxOYW1lJiYobj1lLnRhYkluZGV4LGUudGFiSW5kZXg9Vm8saT1vP28udGFiSW5kZXg6LTEsZS50YWJJbmRleD1uLG8mJmEhPT1vJiZhLmNvbnRhaW5zKG8pJiZpIT09Vm98fHRoaXMudG9nZ2xlU2VsZWN0aW9uRm9ySXRlbShlW3RoaXMuYXNdKSl9fSxfbXVsdGlTZWxlY3Rpb25DaGFuZ2VkOmZ1bmN0aW9uKHQpe3RoaXMuY2xlYXJTZWxlY3Rpb24oKSx0aGlzLiQuc2VsZWN0b3IubXVsdGk9dH0sdXBkYXRlU2l6ZUZvckl0ZW06ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudXBkYXRlU2l6ZUZvckluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZih0KSl9LHVwZGF0ZVNpemVGb3JJbmRleDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faXNJbmRleFJlbmRlcmVkKHQpPyh0aGlzLl91cGRhdGVNZXRyaWNzKFt0aGlzLl9nZXRQaHlzaWNhbEluZGV4KHQpXSksdGhpcy5fcG9zaXRpb25JdGVtcygpLG51bGwpOm51bGx9LF9tYW5hZ2VGb2N1czpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg7dD49MCYmdDx0aGlzLl92aXJ0dWFsQ291bnQ/dGhpcy5faXNJbmRleFJlbmRlcmVkKHQpP3RoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpOnRoaXMuX2NyZWF0ZUZvY3VzQmFja2ZpbGxJdGVtKCk6dGhpcy5fdmlydHVhbENvdW50PjAmJnRoaXMuX3BoeXNpY2FsQ291bnQ+MCYmKHRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX3BoeXNpY2FsU3RhcnQsdGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleD10aGlzLl92aXJ0dWFsU3RhcnQsdGhpcy5fZm9jdXNlZEl0ZW09dGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9waHlzaWNhbFN0YXJ0XSl9LF9jb252ZXJ0SW5kZXhUb0NvbXBsZXRlUm93OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pdGVtc1BlclJvdz10aGlzLl9pdGVtc1BlclJvd3x8MSx0aGlzLmdyaWQ/TWF0aC5jZWlsKHQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX2l0ZW1zUGVyUm93OnR9LF9pc0luZGV4UmVuZGVyZWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PXRoaXMuX3ZpcnR1YWxTdGFydCYmdDw9dGhpcy5fdmlydHVhbEVuZH0sX2lzSW5kZXhWaXNpYmxlOmZ1bmN0aW9uKHQpe3JldHVybiB0Pj10aGlzLmZpcnN0VmlzaWJsZUluZGV4JiZ0PD10aGlzLmxhc3RWaXNpYmxlSW5kZXh9LF9nZXRQaHlzaWNhbEluZGV4OmZ1bmN0aW9uKHQpe3JldHVybih0aGlzLl9waHlzaWNhbFN0YXJ0Kyh0LXRoaXMuX3ZpcnR1YWxTdGFydCkpJXRoaXMuX3BoeXNpY2FsQ291bnR9LGZvY3VzSXRlbTpmdW5jdGlvbih0KXt0aGlzLl9mb2N1c1BoeXNpY2FsSXRlbSh0KX0sX2ZvY3VzUGh5c2ljYWxJdGVtOmZ1bmN0aW9uKHQpe2lmKCEodDwwfHx0Pj10aGlzLl92aXJ0dWFsQ291bnQpKXt0aGlzLl9yZXN0b3JlRm9jdXNlZEl0ZW0oKSx0aGlzLl9pc0luZGV4UmVuZGVyZWQodCl8fHRoaXMuc2Nyb2xsVG9JbmRleCh0KTt2YXIgZSxuPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZ2V0UGh5c2ljYWxJbmRleCh0KV0saT10aGlzLm1vZGVsRm9yRWxlbWVudChuKTtpLnRhYkluZGV4PVZvLG4udGFiSW5kZXg9PT1WbyYmKGU9biksZXx8KGU9WWkobikucXVlcnlTZWxlY3RvcignW3RhYmluZGV4PSItMTAwIl0nKSksaS50YWJJbmRleD0wLHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9dCxlJiZlLmZvY3VzKCl9fSxfcmVtb3ZlRm9jdXNlZEl0ZW06ZnVuY3Rpb24oKXt0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSYmdGhpcy5faXRlbXNQYXJlbnQucmVtb3ZlQ2hpbGQodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pLHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtPW51bGwsdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW09bnVsbCx0aGlzLl9mb2N1c2VkSXRlbT1udWxsLHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9LTEsdGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXg9LTF9LF9jcmVhdGVGb2N1c0JhY2tmaWxsSXRlbTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4O2lmKCEodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW18fHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg8MCkpe2lmKCF0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSl7dmFyIGU9dGhpcy5zdGFtcChudWxsKTt0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT1lLnJvb3QucXVlcnlTZWxlY3RvcigiKiIpLHRoaXMuX2l0ZW1zUGFyZW50LmFwcGVuZENoaWxkKGUucm9vdCl9dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW09dGhpcy5fcGh5c2ljYWxJdGVtc1t0XSx0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSkudGFiSW5kZXg9MCx0aGlzLl9waHlzaWNhbEl0ZW1zW3RdPXRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtLHRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXQsdGhpcy50cmFuc2xhdGUzZCgwLEZvLDAsdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pfX0sX3Jlc3RvcmVGb2N1c2VkSXRlbTpmdW5jdGlvbigpe2lmKHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtJiYhKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg8MCkpe3RoaXMuX2Fzc2lnbk1vZGVscygpO3ZhciB0PXRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX2dldFBoeXNpY2FsSW5kZXgodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCksZT10aGlzLl9waHlzaWNhbEl0ZW1zW3RdO2lmKGUpe3ZhciBuPXRoaXMubW9kZWxGb3JFbGVtZW50KGUpLGk9dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pO25bdGhpcy5hc109PT1pW3RoaXMuYXNdPyh0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT1lLG4udGFiSW5kZXg9LTEsdGhpcy5fcGh5c2ljYWxJdGVtc1t0XT10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSx0aGlzLnRyYW5zbGF0ZTNkKDAsRm8sMCx0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSkpOih0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpLHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtPW51bGwpLHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtPW51bGx9fX0sX2RpZEZvY3VzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubW9kZWxGb3JFbGVtZW50KHQudGFyZ2V0KSxuPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX2ZvY3VzZWRJdGVtKSxpPW51bGwhPT10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSxyPXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg7ZSYmKG49PT1lP3RoaXMuX2lzSW5kZXhWaXNpYmxlKHIpfHx0aGlzLnNjcm9sbFRvSW5kZXgocik6KHRoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpLG4mJihuLnRhYkluZGV4PS0xKSxlLnRhYkluZGV4PTAsdGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleD1yPWVbdGhpcy5pbmRleEFzXSx0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleD10aGlzLl9nZXRQaHlzaWNhbEluZGV4KHIpLHRoaXMuX2ZvY3VzZWRJdGVtPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXhdLGkmJiF0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSYmdGhpcy5fdXBkYXRlKCkpKX0sX2tleWRvd25IYW5kbGVyOmZ1bmN0aW9uKHQpe3N3aXRjaCh0LmtleUNvZGUpe2Nhc2UgNDA6dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleDx0aGlzLl92aXJ0dWFsQ291bnQtMSYmdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgrKHRoaXMuZ3JpZD90aGlzLl9pdGVtc1BlclJvdzoxKSk7YnJlYWs7Y2FzZSAzOTp0aGlzLmdyaWQmJnRoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgrKHRoaXMuX2lzUlRMPy0xOjEpKTticmVhaztjYXNlIDM4OnRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg+MCYmdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgtKHRoaXMuZ3JpZD90aGlzLl9pdGVtc1BlclJvdzoxKSk7YnJlYWs7Y2FzZSAzNzp0aGlzLmdyaWQmJnRoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgrKHRoaXMuX2lzUlRMPzE6LTEpKTticmVhaztjYXNlIDEzOnRoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgpLHRoaXMuc2VsZWN0aW9uRW5hYmxlZCYmdGhpcy5fc2VsZWN0aW9uSGFuZGxlcih0KX19LF9jbGFtcDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIE1hdGgubWluKG4sTWF0aC5tYXgoZSx0KSl9LF9kZWJvdW5jZTpmdW5jdGlvbih0LGUsbil7dGhpcy5fZGVib3VuY2Vycz10aGlzLl9kZWJvdW5jZXJzfHx7fSx0aGlzLl9kZWJvdW5jZXJzW3RdPVRuLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlcnNbdF0sbixlLmJpbmQodGhpcykpLEFuKHRoaXMuX2RlYm91bmNlcnNbdF0pfSxfZm9yd2FyZFByb3BlcnR5OmZ1bmN0aW9uKHQsZSxuKXt0Ll9zZXRQZW5kaW5nUHJvcGVydHkoZSxuKX0sX2ZvcndhcmRIb3N0UHJvcFYyOmZ1bmN0aW9uKHQsZSl7KHRoaXMuX3BoeXNpY2FsSXRlbXN8fFtdKS5jb25jYXQoW3RoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtLHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtXSkuZm9yRWFjaCgoZnVuY3Rpb24obil7biYmdGhpcy5tb2RlbEZvckVsZW1lbnQobikuZm9yd2FyZEhvc3RQcm9wKHQsZSl9KSx0aGlzKX0sX25vdGlmeUluc3RhbmNlUHJvcFYyOmZ1bmN0aW9uKHQsZSxuKXtpZihRKHRoaXMuYXMsZSkpe3ZhciBpPXRbdGhpcy5pbmRleEFzXTtlPT10aGlzLmFzJiYodGhpcy5pdGVtc1tpXT1uKSx0aGlzLm5vdGlmeVBhdGgoSih0aGlzLmFzLCJpdGVtcy4iK2ksZSksbil9fSxfZ2V0U3RhbXBlZENoaWxkcmVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsSXRlbXN9LF9mb3J3YXJkSW5zdGFuY2VQYXRoOmZ1bmN0aW9uKHQsZSxuKXswPT09ZS5pbmRleE9mKHRoaXMuYXMrIi4iKSYmdGhpcy5ub3RpZnlQYXRoKCJpdGVtcy4iK3QuX19rZXlfXysiLiIrZS5zbGljZSh0aGlzLmFzLmxlbmd0aCsxKSxuKX0sX2ZvcndhcmRQYXJlbnRQYXRoOmZ1bmN0aW9uKHQsZSl7KHRoaXMuX3BoeXNpY2FsSXRlbXN8fFtdKS5jb25jYXQoW3RoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtLHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtXSkuZm9yRWFjaCgoZnVuY3Rpb24obil7biYmdGhpcy5tb2RlbEZvckVsZW1lbnQobikubm90aWZ5UGF0aCh0LGUpfSksdGhpcyl9LF9mb3J3YXJkUGFyZW50UHJvcDpmdW5jdGlvbih0LGUpeyh0aGlzLl9waHlzaWNhbEl0ZW1zfHxbXSkuY29uY2F0KFt0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSx0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbV0pLmZvckVhY2goKGZ1bmN0aW9uKG4pe24mJih0aGlzLm1vZGVsRm9yRWxlbWVudChuKVt0XT1lKX0pLHRoaXMpfSxfZ2V0QWN0aXZlRWxlbWVudDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2l0ZW1zUGFyZW50Lm5vZGUuZG9tSG9zdDtyZXR1cm4gWWkodD90LnJvb3Q6ZG9jdW1lbnQpLmFjdGl2ZUVsZW1lbnR9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjbGFzcyBVb3tjb25zdHJ1Y3Rvcih0KXt0aGlzLnNlbGVjdGlvbj1bXSx0aGlzLnNlbGVjdENhbGxiYWNrPXR9Z2V0KCl7cmV0dXJuIHRoaXMubXVsdGk/dGhpcy5zZWxlY3Rpb24uc2xpY2UoKTp0aGlzLnNlbGVjdGlvblswXX1jbGVhcih0KXt0aGlzLnNlbGVjdGlvbi5zbGljZSgpLmZvckVhY2goKGZ1bmN0aW9uKGUpeyghdHx8dC5pbmRleE9mKGUpPDApJiZ0aGlzLnNldEl0ZW1TZWxlY3RlZChlLCExKX0pLHRoaXMpfWlzU2VsZWN0ZWQodCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uLmluZGV4T2YodCk+PTB9c2V0SXRlbVNlbGVjdGVkKHQsZSl7aWYobnVsbCE9dCYmZSE9PXRoaXMuaXNTZWxlY3RlZCh0KSl7aWYoZSl0aGlzLnNlbGVjdGlvbi5wdXNoKHQpO2Vsc2V7dmFyIG49dGhpcy5zZWxlY3Rpb24uaW5kZXhPZih0KTtuPj0wJiZ0aGlzLnNlbGVjdGlvbi5zcGxpY2UobiwxKX10aGlzLnNlbGVjdENhbGxiYWNrJiZ0aGlzLnNlbGVjdENhbGxiYWNrKHQsZSl9fXNlbGVjdCh0KXt0aGlzLm11bHRpP3RoaXMudG9nZ2xlKHQpOnRoaXMuZ2V0KCkhPT10JiYodGhpcy5zZXRJdGVtU2VsZWN0ZWQodGhpcy5nZXQoKSwhMSksdGhpcy5zZXRJdGVtU2VsZWN0ZWQodCwhMCkpfXRvZ2dsZSh0KXt0aGlzLnNldEl0ZW1TZWxlY3RlZCh0LCF0aGlzLmlzU2VsZWN0ZWQodCkpfX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovY29uc3Qgam89e3Byb3BlcnRpZXM6e2F0dHJGb3JTZWxlY3RlZDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sc2VsZWN0ZWQ6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sc2VsZWN0ZWRJdGVtOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9LGFjdGl2YXRlRXZlbnQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJ0YXAiLG9ic2VydmVyOiJfYWN0aXZhdGVFdmVudENoYW5nZWQifSxzZWxlY3RhYmxlOlN0cmluZyxzZWxlY3RlZENsYXNzOnt0eXBlOlN0cmluZyx2YWx1ZToiaXJvbi1zZWxlY3RlZCJ9LHNlbGVjdGVkQXR0cmlidXRlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxmYWxsYmFja1NlbGVjdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0saXRlbXM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxfZXhjbHVkZWRMb2NhbE5hbWVzOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt0ZW1wbGF0ZToxLCJkb20tYmluZCI6MSwiZG9tLWlmIjoxLCJkb20tcmVwZWF0IjoxfX19fSxvYnNlcnZlcnM6WyJfdXBkYXRlQXR0ckZvclNlbGVjdGVkKGF0dHJGb3JTZWxlY3RlZCkiLCJfdXBkYXRlU2VsZWN0ZWQoc2VsZWN0ZWQpIiwiX2NoZWNrRmFsbGJhY2soZmFsbGJhY2tTZWxlY3Rpb24pIl0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX2JpbmRGaWx0ZXJJdGVtPXRoaXMuX2ZpbHRlckl0ZW0uYmluZCh0aGlzKSx0aGlzLl9zZWxlY3Rpb249bmV3IFVvKHRoaXMuX2FwcGx5U2VsZWN0aW9uLmJpbmQodGhpcykpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPXRoaXMuX29ic2VydmVJdGVtcyh0aGlzKSx0aGlzLl9hZGRMaXN0ZW5lcih0aGlzLmFjdGl2YXRlRXZlbnQpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiZZaSh0aGlzKS51bm9ic2VydmVOb2Rlcyh0aGlzLl9vYnNlcnZlciksdGhpcy5fcmVtb3ZlTGlzdGVuZXIodGhpcy5hY3RpdmF0ZUV2ZW50KX0saW5kZXhPZjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVtcz90aGlzLml0ZW1zLmluZGV4T2YodCk6LTF9LHNlbGVjdDpmdW5jdGlvbih0KXt0aGlzLnNlbGVjdGVkPXR9LHNlbGVjdFByZXZpb3VzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5pdGVtcy5sZW5ndGgsZT10LTE7dm9pZCAwIT09dGhpcy5zZWxlY3RlZCYmKGU9KE51bWJlcih0aGlzLl92YWx1ZVRvSW5kZXgodGhpcy5zZWxlY3RlZCkpLTErdCkldCksdGhpcy5zZWxlY3RlZD10aGlzLl9pbmRleFRvVmFsdWUoZSl9LHNlbGVjdE5leHQ6ZnVuY3Rpb24oKXt2YXIgdD0wO3ZvaWQgMCE9PXRoaXMuc2VsZWN0ZWQmJih0PShOdW1iZXIodGhpcy5fdmFsdWVUb0luZGV4KHRoaXMuc2VsZWN0ZWQpKSsxKSV0aGlzLml0ZW1zLmxlbmd0aCksdGhpcy5zZWxlY3RlZD10aGlzLl9pbmRleFRvVmFsdWUodCl9LHNlbGVjdEluZGV4OmZ1bmN0aW9uKHQpe3RoaXMuc2VsZWN0KHRoaXMuX2luZGV4VG9WYWx1ZSh0KSl9LGZvcmNlU3luY2hyb25vdXNJdGVtVXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLl9vYnNlcnZlci5mbHVzaD90aGlzLl9vYnNlcnZlci5mbHVzaCgpOnRoaXMuX3VwZGF0ZUl0ZW1zKCl9LGdldCBfc2hvdWxkVXBkYXRlU2VsZWN0aW9uKCl7cmV0dXJuIG51bGwhPXRoaXMuc2VsZWN0ZWR9LF9jaGVja0ZhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlU2VsZWN0ZWQoKX0sX2FkZExpc3RlbmVyOmZ1bmN0aW9uKHQpe3RoaXMubGlzdGVuKHRoaXMsdCwiX2FjdGl2YXRlSGFuZGxlciIpfSxfcmVtb3ZlTGlzdGVuZXI6ZnVuY3Rpb24odCl7dGhpcy51bmxpc3Rlbih0aGlzLHQsIl9hY3RpdmF0ZUhhbmRsZXIiKX0sX2FjdGl2YXRlRXZlbnRDaGFuZ2VkOmZ1bmN0aW9uKHQsZSl7dGhpcy5fcmVtb3ZlTGlzdGVuZXIoZSksdGhpcy5fYWRkTGlzdGVuZXIodCl9LF91cGRhdGVJdGVtczpmdW5jdGlvbigpe3ZhciB0PVlpKHRoaXMpLnF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyh0aGlzLnNlbGVjdGFibGV8fCIqIik7dD1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwodCx0aGlzLl9iaW5kRmlsdGVySXRlbSksdGhpcy5fc2V0SXRlbXModCl9LF91cGRhdGVBdHRyRm9yU2VsZWN0ZWQ6ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkSXRlbSYmKHRoaXMuc2VsZWN0ZWQ9dGhpcy5fdmFsdWVGb3JJdGVtKHRoaXMuc2VsZWN0ZWRJdGVtKSl9LF91cGRhdGVTZWxlY3RlZDpmdW5jdGlvbigpe3RoaXMuX3NlbGVjdFNlbGVjdGVkKHRoaXMuc2VsZWN0ZWQpfSxfc2VsZWN0U2VsZWN0ZWQ6ZnVuY3Rpb24odCl7aWYodGhpcy5pdGVtcyl7dmFyIGU9dGhpcy5fdmFsdWVUb0l0ZW0odGhpcy5zZWxlY3RlZCk7ZT90aGlzLl9zZWxlY3Rpb24uc2VsZWN0KGUpOnRoaXMuX3NlbGVjdGlvbi5jbGVhcigpLHRoaXMuZmFsbGJhY2tTZWxlY3Rpb24mJnRoaXMuaXRlbXMubGVuZ3RoJiZ2b2lkIDA9PT10aGlzLl9zZWxlY3Rpb24uZ2V0KCkmJih0aGlzLnNlbGVjdGVkPXRoaXMuZmFsbGJhY2tTZWxlY3Rpb24pfX0sX2ZpbHRlckl0ZW06ZnVuY3Rpb24odCl7cmV0dXJuIXRoaXMuX2V4Y2x1ZGVkTG9jYWxOYW1lc1t0LmxvY2FsTmFtZV19LF92YWx1ZVRvSXRlbTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9udWxsOnRoaXMuaXRlbXNbdGhpcy5fdmFsdWVUb0luZGV4KHQpXX0sX3ZhbHVlVG9JbmRleDpmdW5jdGlvbih0KXtpZighdGhpcy5hdHRyRm9yU2VsZWN0ZWQpcmV0dXJuIE51bWJlcih0KTtmb3IodmFyIGUsbj0wO2U9dGhpcy5pdGVtc1tuXTtuKyspaWYodGhpcy5fdmFsdWVGb3JJdGVtKGUpPT10KXJldHVybiBufSxfaW5kZXhUb1ZhbHVlOmZ1bmN0aW9uKHQpe2lmKCF0aGlzLmF0dHJGb3JTZWxlY3RlZClyZXR1cm4gdDt2YXIgZT10aGlzLml0ZW1zW3RdO3JldHVybiBlP3RoaXMuX3ZhbHVlRm9ySXRlbShlKTp2b2lkIDB9LF92YWx1ZUZvckl0ZW06ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIG51bGw7aWYoIXRoaXMuYXR0ckZvclNlbGVjdGVkKXt2YXIgZT10aGlzLmluZGV4T2YodCk7cmV0dXJuLTE9PT1lP251bGw6ZX12YXIgbj10W3N0KHRoaXMuYXR0ckZvclNlbGVjdGVkKV07cmV0dXJuIG51bGwhPW4/bjp0LmdldEF0dHJpYnV0ZSh0aGlzLmF0dHJGb3JTZWxlY3RlZCl9LF9hcHBseVNlbGVjdGlvbjpmdW5jdGlvbih0LGUpe3RoaXMuc2VsZWN0ZWRDbGFzcyYmdGhpcy50b2dnbGVDbGFzcyh0aGlzLnNlbGVjdGVkQ2xhc3MsZSx0KSx0aGlzLnNlbGVjdGVkQXR0cmlidXRlJiZ0aGlzLnRvZ2dsZUF0dHJpYnV0ZSh0aGlzLnNlbGVjdGVkQXR0cmlidXRlLGUsdCksdGhpcy5fc2VsZWN0aW9uQ2hhbmdlKCksdGhpcy5maXJlKCJpcm9uLSIrKGU/InNlbGVjdCI6ImRlc2VsZWN0Iikse2l0ZW06dH0pfSxfc2VsZWN0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtKHRoaXMuX3NlbGVjdGlvbi5nZXQoKSl9LF9vYnNlcnZlSXRlbXM6ZnVuY3Rpb24odCl7cmV0dXJuIFlpKHQpLm9ic2VydmVOb2RlcygoZnVuY3Rpb24odCl7dGhpcy5fdXBkYXRlSXRlbXMoKSx0aGlzLl91cGRhdGVTZWxlY3RlZCgpLHRoaXMuZmlyZSgiaXJvbi1pdGVtcy1jaGFuZ2VkIix0LHtidWJibGVzOiExLGNhbmNlbGFibGU6ITF9KX0pKX0sX2FjdGl2YXRlSGFuZGxlcjpmdW5jdGlvbih0KXtmb3IodmFyIGU9dC50YXJnZXQsbj10aGlzLml0ZW1zO2UmJmUhPXRoaXM7KXt2YXIgaT1uLmluZGV4T2YoZSk7aWYoaT49MCl7dmFyIHI9dGhpcy5faW5kZXhUb1ZhbHVlKGkpO3JldHVybiB2b2lkIHRoaXMuX2l0ZW1BY3RpdmF0ZShyLGUpfWU9ZS5wYXJlbnROb2RlfX0sX2l0ZW1BY3RpdmF0ZTpmdW5jdGlvbih0LGUpe3RoaXMuZmlyZSgiaXJvbi1hY3RpdmF0ZSIse3NlbGVjdGVkOnQsaXRlbTplfSx7Y2FuY2VsYWJsZTohMH0pLmRlZmF1bHRQcmV2ZW50ZWR8fHRoaXMuc2VsZWN0KHQpfX07Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL1JyKHtfdGVtcGxhdGU6X2VgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoOm5vdChzbG90KTpub3QoLmlyb24tc2VsZWN0ZWQpKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KYCxpczoiaXJvbi1wYWdlcyIsYmVoYXZpb3JzOltnbyxqb10scHJvcGVydGllczp7YWN0aXZhdGVFdmVudDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9zZWxlY3RlZFBhZ2VDaGFuZ2VkKHNlbGVjdGVkKSJdLF9zZWxlY3RlZFBhZ2VDaGFuZ2VkOmZ1bmN0aW9uKHQsZSl7dGhpcy5hc3luYyh0aGlzLm5vdGlmeVJlc2l6ZSl9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBHbz1fZWAKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKCiAgICAgIC0tc2hhZG93LXRyYW5zaXRpb246IHsKICAgICAgICB0cmFuc2l0aW9uOiBib3gtc2hhZG93IDAuMjhzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1ub25lOiB7CiAgICAgICAgYm94LXNoYWRvdzogbm9uZTsKICAgICAgfTsKCiAgICAgIC8qIGZyb20gaHR0cDovL2NvZGVwZW4uaW8vc2h5bmRtYW4vcGVuL2M1Mzk0ZGRmMmU4YjJhNWM5MTg1OTA0YjU3NDIxY2RiICovCgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tMmRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAycHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi0zZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDNweCA0cHggMCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgMXB4IDhweCAwIHJnYmEoMCwgMCwgMCwgMC4xMiksCiAgICAgICAgICAgICAgICAgICAgMCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTRkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCAxcHggMTBweCAwIHJnYmEoMCwgMCwgMCwgMC4xMiksCiAgICAgICAgICAgICAgICAgICAgMCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTZkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgNnB4IDEwcHggMCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgMXB4IDE4cHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi04ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMiksCiAgICAgICAgICAgICAgICAgICAgMCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTEyZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDEycHggMTZweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDRweCAyMnB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgNnB4IDdweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi0xNmRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCAgNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMiksCiAgICAgICAgICAgICAgICAgICAgMCAgOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tMjRkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMiksCiAgICAgICAgICAgICAgICAgICAgMCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CiAgICB9CiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+YDtHby5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZGlzcGxheTogbm9uZTsiKSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKEdvLmNvbnRlbnQpOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgV289X2VgCjxkb20tbW9kdWxlIGlkPSJwYXBlci1tYXRlcmlhbC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgaHRtbCB7CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbDogewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0xOiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTI6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tNGRwOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi02ZHA7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi00OiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLThkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTU6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDsKICAgICAgICB9OwogICAgICB9CiAgICAgIC5wYXBlci1tYXRlcmlhbCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWw7CiAgICAgIH0KICAgICAgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMSJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTsKICAgICAgfQogICAgICAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIyIl0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOwogICAgICB9CiAgICAgIC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjMiXSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTM7CiAgICAgIH0KICAgICAgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iNCJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDsKICAgICAgfQogICAgICAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI1Il0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OwogICAgICB9CgogICAgICAvKiBEdXBsaWNhdGUgdGhlIHN0eWxlcyBiZWNhdXNlIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJjb21wb25lbnRzL3NoYWR5Y3NzL2lzc3Vlcy8xOTMgKi8KICAgICAgOmhvc3QgewogICAgICAgIC0tcGFwZXItbWF0ZXJpYWw6IHsKICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTRkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTM6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tNmRwOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi04ZHA7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTE2ZHA7CiAgICAgICAgfTsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWwpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbDsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIxIl0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIyIl0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMjsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIzIl0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI0Il0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI1Il0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+YDtXby5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZGlzcGxheTogbm9uZTsiKSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKFdvLmNvbnRlbnQpOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgcW89e3Byb3BlcnRpZXM6e2ZvY3VzZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITAscmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxvYnNlcnZlcjoiX2Rpc2FibGVkQ2hhbmdlZCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfb2xkVGFiSW5kZXg6e3R5cGU6U3RyaW5nfSxfYm91bmRGb2N1c0JsdXJIYW5kbGVyOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZvY3VzQmx1ckhhbmRsZXIuYmluZCh0aGlzKX19fSxvYnNlcnZlcnM6WyJfY2hhbmdlZENvbnRyb2xTdGF0ZShmb2N1c2VkLCBkaXNhYmxlZCkiXSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2JvdW5kRm9jdXNCbHVySGFuZGxlciwhMCksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9ib3VuZEZvY3VzQmx1ckhhbmRsZXIsITApfSxfZm9jdXNCbHVySGFuZGxlcjpmdW5jdGlvbih0KXt0aGlzLl9zZXRGb2N1c2VkKCJmb2N1cyI9PT10LnR5cGUpfSxfZGlzYWJsZWRDaGFuZ2VkOmZ1bmN0aW9uKHQsZSl7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiLHQ/InRydWUiOiJmYWxzZSIpLHRoaXMuc3R5bGUucG9pbnRlckV2ZW50cz10PyJub25lIjoiIix0Pyh0aGlzLl9vbGRUYWJJbmRleD10aGlzLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSx0aGlzLl9zZXRGb2N1c2VkKCExKSx0aGlzLnRhYkluZGV4PS0xLHRoaXMuYmx1cigpKTp2b2lkIDAhPT10aGlzLl9vbGRUYWJJbmRleCYmKG51bGw9PT10aGlzLl9vbGRUYWJJbmRleD90aGlzLnJlbW92ZUF0dHJpYnV0ZSgidGFiaW5kZXgiKTp0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLHRoaXMuX29sZFRhYkluZGV4KSl9LF9jaGFuZ2VkQ29udHJvbFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCYmdGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCgpfX0sWW89e3Byb3BlcnRpZXM6e3ByZXNzZWQ6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMCx2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsb2JzZXJ2ZXI6Il9wcmVzc2VkQ2hhbmdlZCJ9LHRvZ2dsZXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHBvaW50ZXJEb3duOnt0eXBlOkJvb2xlYW4scmVhZE9ubHk6ITAsdmFsdWU6ITF9LHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQ6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMH0sYXJpYUFjdGl2ZUF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImFyaWEtcHJlc3NlZCIsb2JzZXJ2ZXI6Il9hcmlhQWN0aXZlQXR0cmlidXRlQ2hhbmdlZCJ9fSxsaXN0ZW5lcnM6e2Rvd246Il9kb3duSGFuZGxlciIsdXA6Il91cEhhbmRsZXIiLHRhcDoiX3RhcEhhbmRsZXIifSxvYnNlcnZlcnM6WyJfZm9jdXNDaGFuZ2VkKGZvY3VzZWQpIiwiX2FjdGl2ZUNoYW5nZWQoYWN0aXZlLCBhcmlhQWN0aXZlQXR0cmlidXRlKSJdLGtleUJpbmRpbmdzOnsiZW50ZXI6a2V5ZG93biI6Il9hc3luY0NsaWNrIiwic3BhY2U6a2V5ZG93biI6Il9zcGFjZUtleURvd25IYW5kbGVyIiwic3BhY2U6a2V5dXAiOiJfc3BhY2VLZXlVcEhhbmRsZXIifSxfbW91c2VFdmVudFJlOi9ebW91c2UvLF90YXBIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy50b2dnbGVzP3RoaXMuX3VzZXJBY3RpdmF0ZSghdGhpcy5hY3RpdmUpOnRoaXMuYWN0aXZlPSExfSxfZm9jdXNDaGFuZ2VkOmZ1bmN0aW9uKHQpe3RoaXMuX2RldGVjdEtleWJvYXJkRm9jdXModCksdHx8dGhpcy5fc2V0UHJlc3NlZCghMSl9LF9kZXRlY3RLZXlib2FyZEZvY3VzOmZ1bmN0aW9uKHQpe3RoaXMuX3NldFJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQoIXRoaXMucG9pbnRlckRvd24mJnQpfSxfdXNlckFjdGl2YXRlOmZ1bmN0aW9uKHQpe3RoaXMuYWN0aXZlIT09dCYmKHRoaXMuYWN0aXZlPXQsdGhpcy5maXJlKCJjaGFuZ2UiKSl9LF9kb3duSGFuZGxlcjpmdW5jdGlvbih0KXt0aGlzLl9zZXRQb2ludGVyRG93bighMCksdGhpcy5fc2V0UHJlc3NlZCghMCksdGhpcy5fc2V0UmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCghMSl9LF91cEhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLl9zZXRQb2ludGVyRG93bighMSksdGhpcy5fc2V0UHJlc3NlZCghMSl9LF9zcGFjZUtleURvd25IYW5kbGVyOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZGV0YWlsLmtleWJvYXJkRXZlbnQsbj1ZaShlKS5sb2NhbFRhcmdldDt0aGlzLmlzTGlnaHREZXNjZW5kYW50KG4pfHwoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5fc2V0UHJlc3NlZCghMCkpfSxfc3BhY2VLZXlVcEhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGU9WWkodC5kZXRhaWwua2V5Ym9hcmRFdmVudCkubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChlKXx8KHRoaXMucHJlc3NlZCYmdGhpcy5fYXN5bmNDbGljaygpLHRoaXMuX3NldFByZXNzZWQoITEpKX0sX2FzeW5jQ2xpY2s6ZnVuY3Rpb24oKXt0aGlzLmFzeW5jKChmdW5jdGlvbigpe3RoaXMuY2xpY2soKX0pLDEpfSxfcHJlc3NlZENoYW5nZWQ6ZnVuY3Rpb24odCl7dGhpcy5fY2hhbmdlZEJ1dHRvblN0YXRlKCl9LF9hcmlhQWN0aXZlQXR0cmlidXRlQ2hhbmdlZDpmdW5jdGlvbih0LGUpe2UmJmUhPXQmJnRoaXMuaGFzQXR0cmlidXRlKGUpJiZ0aGlzLnJlbW92ZUF0dHJpYnV0ZShlKX0sX2FjdGl2ZUNoYW5nZWQ6ZnVuY3Rpb24odCxlKXt0aGlzLnRvZ2dsZXM/dGhpcy5zZXRBdHRyaWJ1dGUodGhpcy5hcmlhQWN0aXZlQXR0cmlidXRlLHQ/InRydWUiOiJmYWxzZSIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKHRoaXMuYXJpYUFjdGl2ZUF0dHJpYnV0ZSksdGhpcy5fY2hhbmdlZEJ1dHRvblN0YXRlKCl9LF9jb250cm9sU3RhdGVDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlZD90aGlzLl9zZXRQcmVzc2VkKCExKTp0aGlzLl9jaGFuZ2VkQnV0dG9uU3RhdGUoKX0sX2NoYW5nZWRCdXR0b25TdGF0ZTpmdW5jdGlvbigpe3RoaXMuX2J1dHRvblN0YXRlQ2hhbmdlZCYmdGhpcy5fYnV0dG9uU3RhdGVDaGFuZ2VkKCl9fSxYbz1bem8sWW9dOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCnZhciAkbz17ZGlzdGFuY2U6ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dC1uLG89ZS1pO3JldHVybiBNYXRoLnNxcnQocipyK28qbyl9LG5vdzp3aW5kb3cucGVyZm9ybWFuY2UmJndpbmRvdy5wZXJmb3JtYW5jZS5ub3c/d2luZG93LnBlcmZvcm1hbmNlLm5vdy5iaW5kKHdpbmRvdy5wZXJmb3JtYW5jZSk6RGF0ZS5ub3d9O2Z1bmN0aW9uIEtvKHQpe3RoaXMuZWxlbWVudD10LHRoaXMud2lkdGg9dGhpcy5ib3VuZGluZ1JlY3Qud2lkdGgsdGhpcy5oZWlnaHQ9dGhpcy5ib3VuZGluZ1JlY3QuaGVpZ2h0LHRoaXMuc2l6ZT1NYXRoLm1heCh0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KX1mdW5jdGlvbiBabyh0KXt0aGlzLmVsZW1lbnQ9dCx0aGlzLmNvbG9yPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLmNvbG9yLHRoaXMud2F2ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLndhdmVDb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy53YXZlLnN0eWxlLmJhY2tncm91bmRDb2xvcj10aGlzLmNvbG9yLHRoaXMud2F2ZS5jbGFzc0xpc3QuYWRkKCJ3YXZlIiksdGhpcy53YXZlQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoIndhdmUtY29udGFpbmVyIiksWWkodGhpcy53YXZlQ29udGFpbmVyKS5hcHBlbmRDaGlsZCh0aGlzLndhdmUpLHRoaXMucmVzZXRJbnRlcmFjdGlvblN0YXRlKCl9S28ucHJvdG90eXBlPXtnZXQgYm91bmRpbmdSZWN0KCl7cmV0dXJuIHRoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0sZnVydGhlc3RDb3JuZXJEaXN0YW5jZUZyb206ZnVuY3Rpb24odCxlKXt2YXIgbj0kby5kaXN0YW5jZSh0LGUsMCwwKSxpPSRvLmRpc3RhbmNlKHQsZSx0aGlzLndpZHRoLDApLHI9JG8uZGlzdGFuY2UodCxlLDAsdGhpcy5oZWlnaHQpLG89JG8uZGlzdGFuY2UodCxlLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpO3JldHVybiBNYXRoLm1heChuLGkscixvKX19LFpvLk1BWF9SQURJVVM9MzAwLFpvLnByb3RvdHlwZT17Z2V0IHJlY2VudGVycygpe3JldHVybiB0aGlzLmVsZW1lbnQucmVjZW50ZXJzfSxnZXQgY2VudGVyKCl7cmV0dXJuIHRoaXMuZWxlbWVudC5jZW50ZXJ9LGdldCBtb3VzZURvd25FbGFwc2VkKCl7dmFyIHQ7cmV0dXJuIHRoaXMubW91c2VEb3duU3RhcnQ/KHQ9JG8ubm93KCktdGhpcy5tb3VzZURvd25TdGFydCx0aGlzLm1vdXNlVXBTdGFydCYmKHQtPXRoaXMubW91c2VVcEVsYXBzZWQpLHQpOjB9LGdldCBtb3VzZVVwRWxhcHNlZCgpe3JldHVybiB0aGlzLm1vdXNlVXBTdGFydD8kby5ub3coKS10aGlzLm1vdXNlVXBTdGFydDowfSxnZXQgbW91c2VEb3duRWxhcHNlZFNlY29uZHMoKXtyZXR1cm4gdGhpcy5tb3VzZURvd25FbGFwc2VkLzFlM30sZ2V0IG1vdXNlVXBFbGFwc2VkU2Vjb25kcygpe3JldHVybiB0aGlzLm1vdXNlVXBFbGFwc2VkLzFlM30sZ2V0IG1vdXNlSW50ZXJhY3Rpb25TZWNvbmRzKCl7cmV0dXJuIHRoaXMubW91c2VEb3duRWxhcHNlZFNlY29uZHMrdGhpcy5tb3VzZVVwRWxhcHNlZFNlY29uZHN9LGdldCBpbml0aWFsT3BhY2l0eSgpe3JldHVybiB0aGlzLmVsZW1lbnQuaW5pdGlhbE9wYWNpdHl9LGdldCBvcGFjaXR5RGVjYXlWZWxvY2l0eSgpe3JldHVybiB0aGlzLmVsZW1lbnQub3BhY2l0eURlY2F5VmVsb2NpdHl9LGdldCByYWRpdXMoKXt2YXIgdD0xLjEqTWF0aC5taW4oTWF0aC5zcXJ0KHRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aCp0aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgrdGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodCp0aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0KSxaby5NQVhfUkFESVVTKSs1LGU9dCooMS1NYXRoLnBvdyg4MCwtdGhpcy5tb3VzZUludGVyYWN0aW9uU2Vjb25kcy8oMS4xLXQvWm8uTUFYX1JBRElVUyouMikpKTtyZXR1cm4gTWF0aC5hYnMoZSl9LGdldCBvcGFjaXR5KCl7cmV0dXJuIHRoaXMubW91c2VVcFN0YXJ0P01hdGgubWF4KDAsdGhpcy5pbml0aWFsT3BhY2l0eS10aGlzLm1vdXNlVXBFbGFwc2VkU2Vjb25kcyp0aGlzLm9wYWNpdHlEZWNheVZlbG9jaXR5KTp0aGlzLmluaXRpYWxPcGFjaXR5fSxnZXQgb3V0ZXJPcGFjaXR5KCl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oLjMqdGhpcy5tb3VzZVVwRWxhcHNlZFNlY29uZHMsdGhpcy5vcGFjaXR5KSl9LGdldCBpc09wYWNpdHlGdWxseURlY2F5ZWQoKXtyZXR1cm4gdGhpcy5vcGFjaXR5PC4wMSYmdGhpcy5yYWRpdXM+PU1hdGgubWluKHRoaXMubWF4UmFkaXVzLFpvLk1BWF9SQURJVVMpfSxnZXQgaXNSZXN0aW5nQXRNYXhSYWRpdXMoKXtyZXR1cm4gdGhpcy5vcGFjaXR5Pj10aGlzLmluaXRpYWxPcGFjaXR5JiZ0aGlzLnJhZGl1cz49TWF0aC5taW4odGhpcy5tYXhSYWRpdXMsWm8uTUFYX1JBRElVUyl9LGdldCBpc0FuaW1hdGlvbkNvbXBsZXRlKCl7cmV0dXJuIHRoaXMubW91c2VVcFN0YXJ0P3RoaXMuaXNPcGFjaXR5RnVsbHlEZWNheWVkOnRoaXMuaXNSZXN0aW5nQXRNYXhSYWRpdXN9LGdldCB0cmFuc2xhdGlvbkZyYWN0aW9uKCl7cmV0dXJuIE1hdGgubWluKDEsdGhpcy5yYWRpdXMvdGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUqMi9NYXRoLnNxcnQoMikpfSxnZXQgeE5vdygpe3JldHVybiB0aGlzLnhFbmQ/dGhpcy54U3RhcnQrdGhpcy50cmFuc2xhdGlvbkZyYWN0aW9uKih0aGlzLnhFbmQtdGhpcy54U3RhcnQpOnRoaXMueFN0YXJ0fSxnZXQgeU5vdygpe3JldHVybiB0aGlzLnlFbmQ/dGhpcy55U3RhcnQrdGhpcy50cmFuc2xhdGlvbkZyYWN0aW9uKih0aGlzLnlFbmQtdGhpcy55U3RhcnQpOnRoaXMueVN0YXJ0fSxnZXQgaXNNb3VzZURvd24oKXtyZXR1cm4gdGhpcy5tb3VzZURvd25TdGFydCYmIXRoaXMubW91c2VVcFN0YXJ0fSxyZXNldEludGVyYWN0aW9uU3RhdGU6ZnVuY3Rpb24oKXt0aGlzLm1heFJhZGl1cz0wLHRoaXMubW91c2VEb3duU3RhcnQ9MCx0aGlzLm1vdXNlVXBTdGFydD0wLHRoaXMueFN0YXJ0PTAsdGhpcy55U3RhcnQ9MCx0aGlzLnhFbmQ9MCx0aGlzLnlFbmQ9MCx0aGlzLnNsaWRlRGlzdGFuY2U9MCx0aGlzLmNvbnRhaW5lck1ldHJpY3M9bmV3IEtvKHRoaXMuZWxlbWVudCl9LGRyYXc6ZnVuY3Rpb24oKXt2YXIgdCxlLG47dGhpcy53YXZlLnN0eWxlLm9wYWNpdHk9dGhpcy5vcGFjaXR5LHQ9dGhpcy5yYWRpdXMvKHRoaXMuY29udGFpbmVyTWV0cmljcy5zaXplLzIpLHRoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS53ZWJraXRUcmFuc2Zvcm09InRyYW5zbGF0ZSgiKyhlPXRoaXMueE5vdy10aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgvMikrInB4LCAiKyhuPXRoaXMueU5vdy10aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0LzIpKyJweCkiLHRoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKCIrZSsicHgsICIrbisicHgsIDApIix0aGlzLndhdmUuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJzY2FsZSgiK3QrIiwiK3QrIikiLHRoaXMud2F2ZS5zdHlsZS50cmFuc2Zvcm09InNjYWxlM2QoIit0KyIsIit0KyIsMSkifSxkb3duQWN0aW9uOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aC8yLG49dGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodC8yO3RoaXMucmVzZXRJbnRlcmFjdGlvblN0YXRlKCksdGhpcy5tb3VzZURvd25TdGFydD0kby5ub3coKSx0aGlzLmNlbnRlcj8odGhpcy54U3RhcnQ9ZSx0aGlzLnlTdGFydD1uLHRoaXMuc2xpZGVEaXN0YW5jZT0kby5kaXN0YW5jZSh0aGlzLnhTdGFydCx0aGlzLnlTdGFydCx0aGlzLnhFbmQsdGhpcy55RW5kKSk6KHRoaXMueFN0YXJ0PXQ/dC5kZXRhaWwueC10aGlzLmNvbnRhaW5lck1ldHJpY3MuYm91bmRpbmdSZWN0LmxlZnQ6dGhpcy5jb250YWluZXJNZXRyaWNzLndpZHRoLzIsdGhpcy55U3RhcnQ9dD90LmRldGFpbC55LXRoaXMuY29udGFpbmVyTWV0cmljcy5ib3VuZGluZ1JlY3QudG9wOnRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQvMiksdGhpcy5yZWNlbnRlcnMmJih0aGlzLnhFbmQ9ZSx0aGlzLnlFbmQ9bix0aGlzLnNsaWRlRGlzdGFuY2U9JG8uZGlzdGFuY2UodGhpcy54U3RhcnQsdGhpcy55U3RhcnQsdGhpcy54RW5kLHRoaXMueUVuZCkpLHRoaXMubWF4UmFkaXVzPXRoaXMuY29udGFpbmVyTWV0cmljcy5mdXJ0aGVzdENvcm5lckRpc3RhbmNlRnJvbSh0aGlzLnhTdGFydCx0aGlzLnlTdGFydCksdGhpcy53YXZlQ29udGFpbmVyLnN0eWxlLnRvcD0odGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodC10aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSkvMisicHgiLHRoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS5sZWZ0PSh0aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgtdGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUpLzIrInB4Iix0aGlzLndhdmVDb250YWluZXIuc3R5bGUud2lkdGg9dGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUrInB4Iix0aGlzLndhdmVDb250YWluZXIuc3R5bGUuaGVpZ2h0PXRoaXMuY29udGFpbmVyTWV0cmljcy5zaXplKyJweCJ9LHVwQWN0aW9uOmZ1bmN0aW9uKHQpe3RoaXMuaXNNb3VzZURvd24mJih0aGlzLm1vdXNlVXBTdGFydD0kby5ub3coKSl9LHJlbW92ZTpmdW5jdGlvbigpe1lpKFlpKHRoaXMud2F2ZUNvbnRhaW5lcikucGFyZW50Tm9kZSkucmVtb3ZlQ2hpbGQodGhpcy53YXZlQ29udGFpbmVyKX19LFJyKHtfdGVtcGxhdGU6X2VgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKCiAgICAgICAgLyogU2VlIFBvbHltZXJFbGVtZW50cy9wYXBlci1iZWhhdmlvcnMvaXNzdWVzLzM0LiBPbiBub24tQ2hyb21lIGJyb3dzZXJzLAogICAgICAgICAqIGNyZWF0aW5nIGEgbm9kZSAod2l0aCBhIHBvc2l0aW9uOmFic29sdXRlKSBpbiB0aGUgbWlkZGxlIG9mIGFuIGV2ZW50CiAgICAgICAgICogaGFuZGxlciAiaW50ZXJydXB0cyIgdGhhdCBldmVudCBoYW5kbGVyICh3aGljaCBoYXBwZW5zIHdoZW4gdGhlCiAgICAgICAgICogcmlwcGxlIGlzIGNyZWF0ZWQgb24gZGVtYW5kKSAqLwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICA6aG9zdChbYW5pbWF0aW5nXSkgewogICAgICAgIC8qIFRoaXMgcmVzb2x2ZXMgYSByZW5kZXJpbmcgaXNzdWUgaW4gQ2hyb21lIChhcyBvZiA0MCkgd2hlcmUgdGhlCiAgICAgICAgICAgcmlwcGxlIGlzIG5vdCBwcm9wZXJseSBjbGlwcGVkIGJ5IGl0cyBwYXJlbnQgKHdoaWNoIG1heSBoYXZlCiAgICAgICAgICAgcm91bmRlZCBjb3JuZXJzKS4gU2VlOiBodHRwOi8vanNiaW4uY29tL3RlbWV4YS80CgogICAgICAgICAgIE5vdGU6IFdlIG9ubHkgYXBwbHkgdGhpcyBzdHlsZSBjb25kaXRpb25hbGx5LiBPdGhlcndpc2UsIHRoZSBicm93c2VyCiAgICAgICAgICAgd2lsbCBjcmVhdGUgYSBuZXcgY29tcG9zaXRpbmcgbGF5ZXIgZm9yIGV2ZXJ5IHJpcHBsZSBlbGVtZW50IG9uIHRoZQogICAgICAgICAgIHBhZ2UsIGFuZCB0aGF0IHdvdWxkIGJlIGJhZC4gKi8KICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7CiAgICAgIH0KCiAgICAgICNiYWNrZ3JvdW5kLAogICAgICAjd2F2ZXMsCiAgICAgIC53YXZlLWNvbnRhaW5lciwKICAgICAgLndhdmUgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgICNiYWNrZ3JvdW5kLAogICAgICAud2F2ZSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgI3dhdmVzLAogICAgICAud2F2ZSB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLndhdmUtY29udGFpbmVyLAogICAgICAud2F2ZSB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICB9CgogICAgICA6aG9zdCguY2lyY2xlKSAjYmFja2dyb3VuZCwKICAgICAgOmhvc3QoLmNpcmNsZSkgI3dhdmVzIHsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgIH0KCiAgICAgIDpob3N0KC5jaXJjbGUpIC53YXZlLWNvbnRhaW5lciB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJiYWNrZ3JvdW5kIj48L2Rpdj4KICAgIDxkaXYgaWQ9IndhdmVzIj48L2Rpdj4KYCxpczoicGFwZXItcmlwcGxlIixiZWhhdmlvcnM6W3pvXSxwcm9wZXJ0aWVzOntpbml0aWFsT3BhY2l0eTp7dHlwZTpOdW1iZXIsdmFsdWU6LjI1fSxvcGFjaXR5RGVjYXlWZWxvY2l0eTp7dHlwZTpOdW1iZXIsdmFsdWU6Ljh9LHJlY2VudGVyczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxjZW50ZXI6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0scmlwcGxlczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sYW5pbWF0aW5nOnt0eXBlOkJvb2xlYW4scmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExfSxob2xkRG93bjp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfaG9sZERvd25DaGFuZ2VkIn0sbm9pbms6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2FuaW1hdGluZzp7dHlwZTpCb29sZWFufSxfYm91bmRBbmltYXRlOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYW5pbWF0ZS5iaW5kKHRoaXMpfX19LGdldCB0YXJnZXQoKXtyZXR1cm4gdGhpcy5rZXlFdmVudFRhcmdldH0sa2V5QmluZGluZ3M6eyJlbnRlcjprZXlkb3duIjoiX29uRW50ZXJLZXlkb3duIiwic3BhY2U6a2V5ZG93biI6Il9vblNwYWNlS2V5ZG93biIsInNwYWNlOmtleXVwIjoiX29uU3BhY2VLZXl1cCJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5rZXlFdmVudFRhcmdldD0xMT09WWkodGhpcykucGFyZW50Tm9kZS5ub2RlVHlwZT9ZaSh0aGlzKS5nZXRPd25lclJvb3QoKS5ob3N0OllpKHRoaXMpLnBhcmVudE5vZGU7dmFyIHQ9dGhpcy5rZXlFdmVudFRhcmdldDt0aGlzLmxpc3Rlbih0LCJ1cCIsInVpVXBBY3Rpb24iKSx0aGlzLmxpc3Rlbih0LCJkb3duIiwidWlEb3duQWN0aW9uIil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy51bmxpc3Rlbih0aGlzLmtleUV2ZW50VGFyZ2V0LCJ1cCIsInVpVXBBY3Rpb24iKSx0aGlzLnVubGlzdGVuKHRoaXMua2V5RXZlbnRUYXJnZXQsImRvd24iLCJ1aURvd25BY3Rpb24iKSx0aGlzLmtleUV2ZW50VGFyZ2V0PW51bGx9LGdldCBzaG91bGRLZWVwQW5pbWF0aW5nKCl7Zm9yKHZhciB0PTA7dDx0aGlzLnJpcHBsZXMubGVuZ3RoOysrdClpZighdGhpcy5yaXBwbGVzW3RdLmlzQW5pbWF0aW9uQ29tcGxldGUpcmV0dXJuITA7cmV0dXJuITF9LHNpbXVsYXRlZFJpcHBsZTpmdW5jdGlvbigpe3RoaXMuZG93bkFjdGlvbihudWxsKSx0aGlzLmFzeW5jKChmdW5jdGlvbigpe3RoaXMudXBBY3Rpb24oKX0pLDEpfSx1aURvd25BY3Rpb246ZnVuY3Rpb24odCl7dGhpcy5ub2lua3x8dGhpcy5kb3duQWN0aW9uKHQpfSxkb3duQWN0aW9uOmZ1bmN0aW9uKHQpe3RoaXMuaG9sZERvd24mJnRoaXMucmlwcGxlcy5sZW5ndGg+MHx8KHRoaXMuYWRkUmlwcGxlKCkuZG93bkFjdGlvbih0KSx0aGlzLl9hbmltYXRpbmd8fCh0aGlzLl9hbmltYXRpbmc9ITAsdGhpcy5hbmltYXRlKCkpKX0sdWlVcEFjdGlvbjpmdW5jdGlvbih0KXt0aGlzLm5vaW5rfHx0aGlzLnVwQWN0aW9uKHQpfSx1cEFjdGlvbjpmdW5jdGlvbih0KXt0aGlzLmhvbGREb3dufHwodGhpcy5yaXBwbGVzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UudXBBY3Rpb24odCl9KSksdGhpcy5fYW5pbWF0aW5nPSEwLHRoaXMuYW5pbWF0ZSgpKX0sb25BbmltYXRpb25Db21wbGV0ZTpmdW5jdGlvbigpe3RoaXMuX2FuaW1hdGluZz0hMSx0aGlzLiQuYmFja2dyb3VuZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiIsdGhpcy5maXJlKCJ0cmFuc2l0aW9uZW5kIil9LGFkZFJpcHBsZTpmdW5jdGlvbigpe3ZhciB0PW5ldyBabyh0aGlzKTtyZXR1cm4gWWkodGhpcy4kLndhdmVzKS5hcHBlbmRDaGlsZCh0LndhdmVDb250YWluZXIpLHRoaXMuJC5iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmRDb2xvcj10LmNvbG9yLHRoaXMucmlwcGxlcy5wdXNoKHQpLHRoaXMuX3NldEFuaW1hdGluZyghMCksdH0scmVtb3ZlUmlwcGxlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucmlwcGxlcy5pbmRleE9mKHQpO2U8MHx8KHRoaXMucmlwcGxlcy5zcGxpY2UoZSwxKSx0LnJlbW92ZSgpLHRoaXMucmlwcGxlcy5sZW5ndGh8fHRoaXMuX3NldEFuaW1hdGluZyghMSkpfSxhbmltYXRlOmZ1bmN0aW9uKCl7aWYodGhpcy5fYW5pbWF0aW5nKXt2YXIgdCxlO2Zvcih0PTA7dDx0aGlzLnJpcHBsZXMubGVuZ3RoOysrdCkoZT10aGlzLnJpcHBsZXNbdF0pLmRyYXcoKSx0aGlzLiQuYmFja2dyb3VuZC5zdHlsZS5vcGFjaXR5PWUub3V0ZXJPcGFjaXR5LGUuaXNPcGFjaXR5RnVsbHlEZWNheWVkJiYhZS5pc1Jlc3RpbmdBdE1heFJhZGl1cyYmdGhpcy5yZW1vdmVSaXBwbGUoZSk7dGhpcy5zaG91bGRLZWVwQW5pbWF0aW5nfHwwIT09dGhpcy5yaXBwbGVzLmxlbmd0aD93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuX2JvdW5kQW5pbWF0ZSk6dGhpcy5vbkFuaW1hdGlvbkNvbXBsZXRlKCl9fSxhbmltYXRlUmlwcGxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYW5pbWF0ZSgpfSxfb25FbnRlcktleWRvd246ZnVuY3Rpb24oKXt0aGlzLnVpRG93bkFjdGlvbigpLHRoaXMuYXN5bmModGhpcy51aVVwQWN0aW9uLDEpfSxfb25TcGFjZUtleWRvd246ZnVuY3Rpb24oKXt0aGlzLnVpRG93bkFjdGlvbigpfSxfb25TcGFjZUtleXVwOmZ1bmN0aW9uKCl7dGhpcy51aVVwQWN0aW9uKCl9LF9ob2xkRG93bkNoYW5nZWQ6ZnVuY3Rpb24odCxlKXt2b2lkIDAhPT1lJiYodD90aGlzLmRvd25BY3Rpb24oKTp0aGlzLnVwQWN0aW9uKCkpfX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgSm89e3Byb3BlcnRpZXM6e25vaW5rOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9ub2lua0NoYW5nZWQifSxfcmlwcGxlQ29udGFpbmVyOnt0eXBlOk9iamVjdH19LF9idXR0b25TdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmZvY3VzZWQmJnRoaXMuZW5zdXJlUmlwcGxlKCl9LF9kb3duSGFuZGxlcjpmdW5jdGlvbih0KXtZby5fZG93bkhhbmRsZXIuY2FsbCh0aGlzLHQpLHRoaXMucHJlc3NlZCYmdGhpcy5lbnN1cmVSaXBwbGUodCl9LGVuc3VyZVJpcHBsZTpmdW5jdGlvbih0KXtpZighdGhpcy5oYXNSaXBwbGUoKSl7dGhpcy5fcmlwcGxlPXRoaXMuX2NyZWF0ZVJpcHBsZSgpLHRoaXMuX3JpcHBsZS5ub2luaz10aGlzLm5vaW5rO3ZhciBlPXRoaXMuX3JpcHBsZUNvbnRhaW5lcnx8dGhpcy5yb290O2lmKGUmJllpKGUpLmFwcGVuZENoaWxkKHRoaXMuX3JpcHBsZSksdCl7dmFyIG49WWkodGhpcy5fcmlwcGxlQ29udGFpbmVyfHx0aGlzKSxpPVlpKHQpLnJvb3RUYXJnZXQ7bi5kZWVwQ29udGFpbnMoaSkmJnRoaXMuX3JpcHBsZS51aURvd25BY3Rpb24odCl9fX0sZ2V0UmlwcGxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5zdXJlUmlwcGxlKCksdGhpcy5fcmlwcGxlfSxoYXNSaXBwbGU6ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbih0aGlzLl9yaXBwbGUpfSxfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLXJpcHBsZSIpfSxfbm9pbmtDaGFuZ2VkOmZ1bmN0aW9uKHQpe3RoaXMuaGFzUmlwcGxlKCkmJih0aGlzLl9yaXBwbGUubm9pbms9dCl9fSxRbz17cHJvcGVydGllczp7ZWxldmF0aW9uOnt0eXBlOk51bWJlcixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAscmVhZE9ubHk6ITB9fSxvYnNlcnZlcnM6WyJfY2FsY3VsYXRlRWxldmF0aW9uKGZvY3VzZWQsIGRpc2FibGVkLCBhY3RpdmUsIHByZXNzZWQsIHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQpIiwiX2NvbXB1dGVLZXlib2FyZENsYXNzKHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQpIl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImJ1dHRvbiIsdGFiaW5kZXg6IjAiLGFuaW1hdGVkOiEwfSxfY2FsY3VsYXRlRWxldmF0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9MTt0aGlzLmRpc2FibGVkP3Q9MDp0aGlzLmFjdGl2ZXx8dGhpcy5wcmVzc2VkP3Q9NDp0aGlzLnJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQmJih0PTMpLHRoaXMuX3NldEVsZXZhdGlvbih0KX0sX2NvbXB1dGVLZXlib2FyZENsYXNzOmZ1bmN0aW9uKHQpe3RoaXMudG9nZ2xlQ2xhc3MoImtleWJvYXJkLWZvY3VzIix0KX0sX3NwYWNlS2V5RG93bkhhbmRsZXI6ZnVuY3Rpb24odCl7WW8uX3NwYWNlS2V5RG93bkhhbmRsZXIuY2FsbCh0aGlzLHQpLHRoaXMuaGFzUmlwcGxlKCkmJnRoaXMuZ2V0UmlwcGxlKCkucmlwcGxlcy5sZW5ndGg8MSYmdGhpcy5fcmlwcGxlLnVpRG93bkFjdGlvbigpfSxfc3BhY2VLZXlVcEhhbmRsZXI6ZnVuY3Rpb24odCl7WW8uX3NwYWNlS2V5VXBIYW5kbGVyLmNhbGwodGhpcyx0KSx0aGlzLmhhc1JpcHBsZSgpJiZ0aGlzLl9yaXBwbGUudWlVcEFjdGlvbigpfX0sdGE9W1hvLHFvLEpvLFFvXSxlYT1fZWAKICA8c3R5bGUgaW5jbHVkZT0icGFwZXItbWF0ZXJpYWwtc3R5bGVzIj4KICAgIC8qIE5lZWQgdG8gc3BlY2lmeSB0aGUgc2FtZSBzcGVjaWZpY2l0eSBhcyB0aGUgc3R5bGVzIGltcG9ydGVkIGZyb20gcGFwZXItbWF0ZXJpYWwuICovCiAgICA6aG9zdCB7CiAgICAgIEBhcHBseSAtLWxheW91dC1pbmxpbmU7CiAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItY2VudGVyOwogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIG1pbi13aWR0aDogNS4xNGVtOwogICAgICBtYXJnaW46IDAgMC4yOWVtOwogICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgICBmb250OiBpbmhlcml0OwogICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICBvdXRsaW5lLXdpZHRoOiAwOwogICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgei1pbmRleDogMDsKICAgICAgcGFkZGluZzogMC43ZW0gMC41N2VtOwoKICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgQGFwcGx5IC0tcGFwZXItYnV0dG9uOwogICAgfQoKICAgIDpob3N0KFtlbGV2YXRpb249IjEiXSkgewogICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTsKICAgIH0KCiAgICA6aG9zdChbZWxldmF0aW9uPSIyIl0pIHsKICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTI7CiAgICB9CgogICAgOmhvc3QoW2VsZXZhdGlvbj0iMyJdKSB7CiAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0zOwogICAgfQoKICAgIDpob3N0KFtlbGV2YXRpb249IjQiXSkgewogICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDsKICAgIH0KCiAgICA6aG9zdChbZWxldmF0aW9uPSI1Il0pIHsKICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTU7CiAgICB9CgogICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgfQoKICAgIDpob3N0KFtyYWlzZWRdLmtleWJvYXJkLWZvY3VzKSB7CiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICBAYXBwbHkgLS1wYXBlci1idXR0b24tcmFpc2VkLWtleWJvYXJkLWZvY3VzOwogICAgfQoKICAgIDpob3N0KDpub3QoW3JhaXNlZF0pLmtleWJvYXJkLWZvY3VzKSB7CiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICBAYXBwbHkgLS1wYXBlci1idXR0b24tZmxhdC1rZXlib2FyZC1mb2N1czsKICAgIH0KCiAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICAgIGNvbG9yOiAjYThhOGE4OwogICAgICBjdXJzb3I6IGF1dG87CiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwoKICAgICAgQGFwcGx5IC0tcGFwZXItYnV0dG9uLWRpc2FibGVkOwogICAgfQoKICAgIDpob3N0KFtkaXNhYmxlZF1bcmFpc2VkXSkgewogICAgICBiYWNrZ3JvdW5kOiAjZWFlYWVhOwogICAgfQoKCiAgICA6aG9zdChbYW5pbWF0ZWRdKSB7CiAgICAgIEBhcHBseSAtLXNoYWRvdy10cmFuc2l0aW9uOwogICAgfQoKICAgIHBhcGVyLXJpcHBsZSB7CiAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1idXR0b24taW5rLWNvbG9yKTsKICAgIH0KICA8L3N0eWxlPgoKICA8c2xvdD48L3Nsb3Q+YDsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovZWEuc2V0QXR0cmlidXRlKCJzdHJpcC13aGl0ZXNwYWNlIiwiIiksUnIoe190ZW1wbGF0ZTplYSxpczoicGFwZXItYnV0dG9uIixiZWhhdmlvcnM6W3RhXSxwcm9wZXJ0aWVzOntyYWlzZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITEsb2JzZXJ2ZXI6Il9jYWxjdWxhdGVFbGV2YXRpb24ifX0sX2NhbGN1bGF0ZUVsZXZhdGlvbjpmdW5jdGlvbigpe3RoaXMucmFpc2VkP1FvLl9jYWxjdWxhdGVFbGV2YXRpb24uYXBwbHkodGhpcyk6dGhpcy5fc2V0RWxldmF0aW9uKDApfX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgbmE9X2VgCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CgogICAgICAvKiBNYXRlcmlhbCBEZXNpZ24gY29sb3IgcGFsZXR0ZSBmb3IgR29vZ2xlIHByb2R1Y3RzICovCgogICAgICAtLWdvb2dsZS1yZWQtMTAwOiAjZjRjN2MzOwogICAgICAtLWdvb2dsZS1yZWQtMzAwOiAjZTY3YzczOwogICAgICAtLWdvb2dsZS1yZWQtNTAwOiAjZGI0NDM3OwogICAgICAtLWdvb2dsZS1yZWQtNzAwOiAjYzUzOTI5OwoKICAgICAgLS1nb29nbGUtYmx1ZS0xMDA6ICNjNmRhZmM7CiAgICAgIC0tZ29vZ2xlLWJsdWUtMzAwOiAjN2JhYWY3OwogICAgICAtLWdvb2dsZS1ibHVlLTUwMDogIzQyODVmNDsKICAgICAgLS1nb29nbGUtYmx1ZS03MDA6ICMzMzY3ZDY7CgogICAgICAtLWdvb2dsZS1ncmVlbi0xMDA6ICNiN2UxY2Q7CiAgICAgIC0tZ29vZ2xlLWdyZWVuLTMwMDogIzU3YmI4YTsKICAgICAgLS1nb29nbGUtZ3JlZW4tNTAwOiAjMGY5ZDU4OwogICAgICAtLWdvb2dsZS1ncmVlbi03MDA6ICMwYjgwNDM7CgogICAgICAtLWdvb2dsZS15ZWxsb3ctMTAwOiAjZmNlOGIyOwogICAgICAtLWdvb2dsZS15ZWxsb3ctMzAwOiAjZjdjYjRkOwogICAgICAtLWdvb2dsZS15ZWxsb3ctNTAwOiAjZjRiNDAwOwogICAgICAtLWdvb2dsZS15ZWxsb3ctNzAwOiAjZjA5MzAwOwoKICAgICAgLS1nb29nbGUtZ3JleS0xMDA6ICNmNWY1ZjU7CiAgICAgIC0tZ29vZ2xlLWdyZXktMzAwOiAjZTBlMGUwOwogICAgICAtLWdvb2dsZS1ncmV5LTUwMDogIzllOWU5ZTsKICAgICAgLS1nb29nbGUtZ3JleS03MDA6ICM2MTYxNjE7CgogICAgICAvKiBNYXRlcmlhbCBEZXNpZ24gY29sb3IgcGFsZXR0ZSBmcm9tIG9ubGluZSBzcGVjIGRvY3VtZW50ICovCgogICAgICAtLXBhcGVyLXJlZC01MDogI2ZmZWJlZTsKICAgICAgLS1wYXBlci1yZWQtMTAwOiAjZmZjZGQyOwogICAgICAtLXBhcGVyLXJlZC0yMDA6ICNlZjlhOWE7CiAgICAgIC0tcGFwZXItcmVkLTMwMDogI2U1NzM3MzsKICAgICAgLS1wYXBlci1yZWQtNDAwOiAjZWY1MzUwOwogICAgICAtLXBhcGVyLXJlZC01MDA6ICNmNDQzMzY7CiAgICAgIC0tcGFwZXItcmVkLTYwMDogI2U1MzkzNTsKICAgICAgLS1wYXBlci1yZWQtNzAwOiAjZDMyZjJmOwogICAgICAtLXBhcGVyLXJlZC04MDA6ICNjNjI4Mjg7CiAgICAgIC0tcGFwZXItcmVkLTkwMDogI2I3MWMxYzsKICAgICAgLS1wYXBlci1yZWQtYTEwMDogI2ZmOGE4MDsKICAgICAgLS1wYXBlci1yZWQtYTIwMDogI2ZmNTI1MjsKICAgICAgLS1wYXBlci1yZWQtYTQwMDogI2ZmMTc0NDsKICAgICAgLS1wYXBlci1yZWQtYTcwMDogI2Q1MDAwMDsKCiAgICAgIC0tcGFwZXItcGluay01MDogI2ZjZTRlYzsKICAgICAgLS1wYXBlci1waW5rLTEwMDogI2Y4YmJkMDsKICAgICAgLS1wYXBlci1waW5rLTIwMDogI2Y0OGZiMTsKICAgICAgLS1wYXBlci1waW5rLTMwMDogI2YwNjI5MjsKICAgICAgLS1wYXBlci1waW5rLTQwMDogI2VjNDA3YTsKICAgICAgLS1wYXBlci1waW5rLTUwMDogI2U5MWU2MzsKICAgICAgLS1wYXBlci1waW5rLTYwMDogI2Q4MWI2MDsKICAgICAgLS1wYXBlci1waW5rLTcwMDogI2MyMTg1YjsKICAgICAgLS1wYXBlci1waW5rLTgwMDogI2FkMTQ1NzsKICAgICAgLS1wYXBlci1waW5rLTkwMDogIzg4MGU0ZjsKICAgICAgLS1wYXBlci1waW5rLWExMDA6ICNmZjgwYWI7CiAgICAgIC0tcGFwZXItcGluay1hMjAwOiAjZmY0MDgxOwogICAgICAtLXBhcGVyLXBpbmstYTQwMDogI2Y1MDA1NzsKICAgICAgLS1wYXBlci1waW5rLWE3MDA6ICNjNTExNjI7CgogICAgICAtLXBhcGVyLXB1cnBsZS01MDogI2YzZTVmNTsKICAgICAgLS1wYXBlci1wdXJwbGUtMTAwOiAjZTFiZWU3OwogICAgICAtLXBhcGVyLXB1cnBsZS0yMDA6ICNjZTkzZDg7CiAgICAgIC0tcGFwZXItcHVycGxlLTMwMDogI2JhNjhjODsKICAgICAgLS1wYXBlci1wdXJwbGUtNDAwOiAjYWI0N2JjOwogICAgICAtLXBhcGVyLXB1cnBsZS01MDA6ICM5YzI3YjA7CiAgICAgIC0tcGFwZXItcHVycGxlLTYwMDogIzhlMjRhYTsKICAgICAgLS1wYXBlci1wdXJwbGUtNzAwOiAjN2IxZmEyOwogICAgICAtLXBhcGVyLXB1cnBsZS04MDA6ICM2YTFiOWE7CiAgICAgIC0tcGFwZXItcHVycGxlLTkwMDogIzRhMTQ4YzsKICAgICAgLS1wYXBlci1wdXJwbGUtYTEwMDogI2VhODBmYzsKICAgICAgLS1wYXBlci1wdXJwbGUtYTIwMDogI2UwNDBmYjsKICAgICAgLS1wYXBlci1wdXJwbGUtYTQwMDogI2Q1MDBmOTsKICAgICAgLS1wYXBlci1wdXJwbGUtYTcwMDogI2FhMDBmZjsKCiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtNTA6ICNlZGU3ZjY7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtMTAwOiAjZDFjNGU5OwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTIwMDogI2IzOWRkYjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS0zMDA6ICM5NTc1Y2Q7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtNDAwOiAjN2U1N2MyOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTUwMDogIzY3M2FiNzsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS02MDA6ICM1ZTM1YjE7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtNzAwOiAjNTEyZGE4OwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTgwMDogIzQ1MjdhMDsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS05MDA6ICMzMTFiOTI7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtYTEwMDogI2IzODhmZjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS1hMjAwOiAjN2M0ZGZmOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWE0MDA6ICM2NTFmZmY7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtYTcwMDogIzYyMDBlYTsKCiAgICAgIC0tcGFwZXItaW5kaWdvLTUwOiAjZThlYWY2OwogICAgICAtLXBhcGVyLWluZGlnby0xMDA6ICNjNWNhZTk7CiAgICAgIC0tcGFwZXItaW5kaWdvLTIwMDogIzlmYThkYTsKICAgICAgLS1wYXBlci1pbmRpZ28tMzAwOiAjNzk4NmNiOwogICAgICAtLXBhcGVyLWluZGlnby00MDA6ICM1YzZiYzA7CiAgICAgIC0tcGFwZXItaW5kaWdvLTUwMDogIzNmNTFiNTsKICAgICAgLS1wYXBlci1pbmRpZ28tNjAwOiAjMzk0OWFiOwogICAgICAtLXBhcGVyLWluZGlnby03MDA6ICMzMDNmOWY7CiAgICAgIC0tcGFwZXItaW5kaWdvLTgwMDogIzI4MzU5MzsKICAgICAgLS1wYXBlci1pbmRpZ28tOTAwOiAjMWEyMzdlOwogICAgICAtLXBhcGVyLWluZGlnby1hMTAwOiAjOGM5ZWZmOwogICAgICAtLXBhcGVyLWluZGlnby1hMjAwOiAjNTM2ZGZlOwogICAgICAtLXBhcGVyLWluZGlnby1hNDAwOiAjM2Q1YWZlOwogICAgICAtLXBhcGVyLWluZGlnby1hNzAwOiAjMzA0ZmZlOwoKICAgICAgLS1wYXBlci1ibHVlLTUwOiAjZTNmMmZkOwogICAgICAtLXBhcGVyLWJsdWUtMTAwOiAjYmJkZWZiOwogICAgICAtLXBhcGVyLWJsdWUtMjAwOiAjOTBjYWY5OwogICAgICAtLXBhcGVyLWJsdWUtMzAwOiAjNjRiNWY2OwogICAgICAtLXBhcGVyLWJsdWUtNDAwOiAjNDJhNWY1OwogICAgICAtLXBhcGVyLWJsdWUtNTAwOiAjMjE5NmYzOwogICAgICAtLXBhcGVyLWJsdWUtNjAwOiAjMWU4OGU1OwogICAgICAtLXBhcGVyLWJsdWUtNzAwOiAjMTk3NmQyOwogICAgICAtLXBhcGVyLWJsdWUtODAwOiAjMTU2NWMwOwogICAgICAtLXBhcGVyLWJsdWUtOTAwOiAjMGQ0N2ExOwogICAgICAtLXBhcGVyLWJsdWUtYTEwMDogIzgyYjFmZjsKICAgICAgLS1wYXBlci1ibHVlLWEyMDA6ICM0NDhhZmY7CiAgICAgIC0tcGFwZXItYmx1ZS1hNDAwOiAjMjk3OWZmOwogICAgICAtLXBhcGVyLWJsdWUtYTcwMDogIzI5NjJmZjsKCiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS01MDogI2UxZjVmZTsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTEwMDogI2IzZTVmYzsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTIwMDogIzgxZDRmYTsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTMwMDogIzRmYzNmNzsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTQwMDogIzI5YjZmNjsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTUwMDogIzAzYTlmNDsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTYwMDogIzAzOWJlNTsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTcwMDogIzAyODhkMTsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTgwMDogIzAyNzdiZDsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTkwMDogIzAxNTc5YjsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLWExMDA6ICM4MGQ4ZmY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hMjAwOiAjNDBjNGZmOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtYTQwMDogIzAwYjBmZjsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLWE3MDA6ICMwMDkxZWE7CgogICAgICAtLXBhcGVyLWN5YW4tNTA6ICNlMGY3ZmE7CiAgICAgIC0tcGFwZXItY3lhbi0xMDA6ICNiMmViZjI7CiAgICAgIC0tcGFwZXItY3lhbi0yMDA6ICM4MGRlZWE7CiAgICAgIC0tcGFwZXItY3lhbi0zMDA6ICM0ZGQwZTE7CiAgICAgIC0tcGFwZXItY3lhbi00MDA6ICMyNmM2ZGE7CiAgICAgIC0tcGFwZXItY3lhbi01MDA6ICMwMGJjZDQ7CiAgICAgIC0tcGFwZXItY3lhbi02MDA6ICMwMGFjYzE7CiAgICAgIC0tcGFwZXItY3lhbi03MDA6ICMwMDk3YTc7CiAgICAgIC0tcGFwZXItY3lhbi04MDA6ICMwMDgzOGY7CiAgICAgIC0tcGFwZXItY3lhbi05MDA6ICMwMDYwNjQ7CiAgICAgIC0tcGFwZXItY3lhbi1hMTAwOiAjODRmZmZmOwogICAgICAtLXBhcGVyLWN5YW4tYTIwMDogIzE4ZmZmZjsKICAgICAgLS1wYXBlci1jeWFuLWE0MDA6ICMwMGU1ZmY7CiAgICAgIC0tcGFwZXItY3lhbi1hNzAwOiAjMDBiOGQ0OwoKICAgICAgLS1wYXBlci10ZWFsLTUwOiAjZTBmMmYxOwogICAgICAtLXBhcGVyLXRlYWwtMTAwOiAjYjJkZmRiOwogICAgICAtLXBhcGVyLXRlYWwtMjAwOiAjODBjYmM0OwogICAgICAtLXBhcGVyLXRlYWwtMzAwOiAjNGRiNmFjOwogICAgICAtLXBhcGVyLXRlYWwtNDAwOiAjMjZhNjlhOwogICAgICAtLXBhcGVyLXRlYWwtNTAwOiAjMDA5Njg4OwogICAgICAtLXBhcGVyLXRlYWwtNjAwOiAjMDA4OTdiOwogICAgICAtLXBhcGVyLXRlYWwtNzAwOiAjMDA3OTZiOwogICAgICAtLXBhcGVyLXRlYWwtODAwOiAjMDA2OTVjOwogICAgICAtLXBhcGVyLXRlYWwtOTAwOiAjMDA0ZDQwOwogICAgICAtLXBhcGVyLXRlYWwtYTEwMDogI2E3ZmZlYjsKICAgICAgLS1wYXBlci10ZWFsLWEyMDA6ICM2NGZmZGE7CiAgICAgIC0tcGFwZXItdGVhbC1hNDAwOiAjMWRlOWI2OwogICAgICAtLXBhcGVyLXRlYWwtYTcwMDogIzAwYmZhNTsKCiAgICAgIC0tcGFwZXItZ3JlZW4tNTA6ICNlOGY1ZTk7CiAgICAgIC0tcGFwZXItZ3JlZW4tMTAwOiAjYzhlNmM5OwogICAgICAtLXBhcGVyLWdyZWVuLTIwMDogI2E1ZDZhNzsKICAgICAgLS1wYXBlci1ncmVlbi0zMDA6ICM4MWM3ODQ7CiAgICAgIC0tcGFwZXItZ3JlZW4tNDAwOiAjNjZiYjZhOwogICAgICAtLXBhcGVyLWdyZWVuLTUwMDogIzRjYWY1MDsKICAgICAgLS1wYXBlci1ncmVlbi02MDA6ICM0M2EwNDc7CiAgICAgIC0tcGFwZXItZ3JlZW4tNzAwOiAjMzg4ZTNjOwogICAgICAtLXBhcGVyLWdyZWVuLTgwMDogIzJlN2QzMjsKICAgICAgLS1wYXBlci1ncmVlbi05MDA6ICMxYjVlMjA7CiAgICAgIC0tcGFwZXItZ3JlZW4tYTEwMDogI2I5ZjZjYTsKICAgICAgLS1wYXBlci1ncmVlbi1hMjAwOiAjNjlmMGFlOwogICAgICAtLXBhcGVyLWdyZWVuLWE0MDA6ICMwMGU2NzY7CiAgICAgIC0tcGFwZXItZ3JlZW4tYTcwMDogIzAwYzg1MzsKCiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tNTA6ICNmMWY4ZTk7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tMTAwOiAjZGNlZGM4OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTIwMDogI2M1ZTFhNTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi0zMDA6ICNhZWQ1ODE7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tNDAwOiAjOWNjYzY1OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTUwMDogIzhiYzM0YTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi02MDA6ICM3Y2IzNDI7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tNzAwOiAjNjg5ZjM4OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTgwMDogIzU1OGIyZjsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi05MDA6ICMzMzY5MWU7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tYTEwMDogI2NjZmY5MDsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi1hMjAwOiAjYjJmZjU5OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWE0MDA6ICM3NmZmMDM7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tYTcwMDogIzY0ZGQxNzsKCiAgICAgIC0tcGFwZXItbGltZS01MDogI2Y5ZmJlNzsKICAgICAgLS1wYXBlci1saW1lLTEwMDogI2YwZjRjMzsKICAgICAgLS1wYXBlci1saW1lLTIwMDogI2U2ZWU5YzsKICAgICAgLS1wYXBlci1saW1lLTMwMDogI2RjZTc3NTsKICAgICAgLS1wYXBlci1saW1lLTQwMDogI2Q0ZTE1NzsKICAgICAgLS1wYXBlci1saW1lLTUwMDogI2NkZGMzOTsKICAgICAgLS1wYXBlci1saW1lLTYwMDogI2MwY2EzMzsKICAgICAgLS1wYXBlci1saW1lLTcwMDogI2FmYjQyYjsKICAgICAgLS1wYXBlci1saW1lLTgwMDogIzllOWQyNDsKICAgICAgLS1wYXBlci1saW1lLTkwMDogIzgyNzcxNzsKICAgICAgLS1wYXBlci1saW1lLWExMDA6ICNmNGZmODE7CiAgICAgIC0tcGFwZXItbGltZS1hMjAwOiAjZWVmZjQxOwogICAgICAtLXBhcGVyLWxpbWUtYTQwMDogI2M2ZmYwMDsKICAgICAgLS1wYXBlci1saW1lLWE3MDA6ICNhZWVhMDA7CgogICAgICAtLXBhcGVyLXllbGxvdy01MDogI2ZmZmRlNzsKICAgICAgLS1wYXBlci15ZWxsb3ctMTAwOiAjZmZmOWM0OwogICAgICAtLXBhcGVyLXllbGxvdy0yMDA6ICNmZmY1OWQ7CiAgICAgIC0tcGFwZXIteWVsbG93LTMwMDogI2ZmZjE3NjsKICAgICAgLS1wYXBlci15ZWxsb3ctNDAwOiAjZmZlZTU4OwogICAgICAtLXBhcGVyLXllbGxvdy01MDA6ICNmZmViM2I7CiAgICAgIC0tcGFwZXIteWVsbG93LTYwMDogI2ZkZDgzNTsKICAgICAgLS1wYXBlci15ZWxsb3ctNzAwOiAjZmJjMDJkOwogICAgICAtLXBhcGVyLXllbGxvdy04MDA6ICNmOWE4MjU7CiAgICAgIC0tcGFwZXIteWVsbG93LTkwMDogI2Y1N2YxNzsKICAgICAgLS1wYXBlci15ZWxsb3ctYTEwMDogI2ZmZmY4ZDsKICAgICAgLS1wYXBlci15ZWxsb3ctYTIwMDogI2ZmZmYwMDsKICAgICAgLS1wYXBlci15ZWxsb3ctYTQwMDogI2ZmZWEwMDsKICAgICAgLS1wYXBlci15ZWxsb3ctYTcwMDogI2ZmZDYwMDsKCiAgICAgIC0tcGFwZXItYW1iZXItNTA6ICNmZmY4ZTE7CiAgICAgIC0tcGFwZXItYW1iZXItMTAwOiAjZmZlY2IzOwogICAgICAtLXBhcGVyLWFtYmVyLTIwMDogI2ZmZTA4MjsKICAgICAgLS1wYXBlci1hbWJlci0zMDA6ICNmZmQ1NGY7CiAgICAgIC0tcGFwZXItYW1iZXItNDAwOiAjZmZjYTI4OwogICAgICAtLXBhcGVyLWFtYmVyLTUwMDogI2ZmYzEwNzsKICAgICAgLS1wYXBlci1hbWJlci02MDA6ICNmZmIzMDA7CiAgICAgIC0tcGFwZXItYW1iZXItNzAwOiAjZmZhMDAwOwogICAgICAtLXBhcGVyLWFtYmVyLTgwMDogI2ZmOGYwMDsKICAgICAgLS1wYXBlci1hbWJlci05MDA6ICNmZjZmMDA7CiAgICAgIC0tcGFwZXItYW1iZXItYTEwMDogI2ZmZTU3ZjsKICAgICAgLS1wYXBlci1hbWJlci1hMjAwOiAjZmZkNzQwOwogICAgICAtLXBhcGVyLWFtYmVyLWE0MDA6ICNmZmM0MDA7CiAgICAgIC0tcGFwZXItYW1iZXItYTcwMDogI2ZmYWIwMDsKCiAgICAgIC0tcGFwZXItb3JhbmdlLTUwOiAjZmZmM2UwOwogICAgICAtLXBhcGVyLW9yYW5nZS0xMDA6ICNmZmUwYjI7CiAgICAgIC0tcGFwZXItb3JhbmdlLTIwMDogI2ZmY2M4MDsKICAgICAgLS1wYXBlci1vcmFuZ2UtMzAwOiAjZmZiNzRkOwogICAgICAtLXBhcGVyLW9yYW5nZS00MDA6ICNmZmE3MjY7CiAgICAgIC0tcGFwZXItb3JhbmdlLTUwMDogI2ZmOTgwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtNjAwOiAjZmI4YzAwOwogICAgICAtLXBhcGVyLW9yYW5nZS03MDA6ICNmNTdjMDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTgwMDogI2VmNmMwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtOTAwOiAjZTY1MTAwOwogICAgICAtLXBhcGVyLW9yYW5nZS1hMTAwOiAjZmZkMTgwOwogICAgICAtLXBhcGVyLW9yYW5nZS1hMjAwOiAjZmZhYjQwOwogICAgICAtLXBhcGVyLW9yYW5nZS1hNDAwOiAjZmY5MTAwOwogICAgICAtLXBhcGVyLW9yYW5nZS1hNzAwOiAjZmY2NTAwOwoKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS01MDogI2ZiZTllNzsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS0xMDA6ICNmZmNjYmM7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtMjAwOiAjZmZhYjkxOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTMwMDogI2ZmOGE2NTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS00MDA6ICNmZjcwNDM7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNTAwOiAjZmY1NzIyOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTYwMDogI2Y0NTExZTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS03MDA6ICNlNjRhMTk7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtODAwOiAjZDg0MzE1OwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTkwMDogI2JmMzYwYzsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS1hMTAwOiAjZmY5ZTgwOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLWEyMDA6ICNmZjZlNDA7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTQwMDogI2ZmM2QwMDsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS1hNzAwOiAjZGQyYzAwOwoKICAgICAgLS1wYXBlci1icm93bi01MDogI2VmZWJlOTsKICAgICAgLS1wYXBlci1icm93bi0xMDA6ICNkN2NjYzg7CiAgICAgIC0tcGFwZXItYnJvd24tMjAwOiAjYmNhYWE0OwogICAgICAtLXBhcGVyLWJyb3duLTMwMDogI2ExODg3ZjsKICAgICAgLS1wYXBlci1icm93bi00MDA6ICM4ZDZlNjM7CiAgICAgIC0tcGFwZXItYnJvd24tNTAwOiAjNzk1NTQ4OwogICAgICAtLXBhcGVyLWJyb3duLTYwMDogIzZkNGM0MTsKICAgICAgLS1wYXBlci1icm93bi03MDA6ICM1ZDQwMzc7CiAgICAgIC0tcGFwZXItYnJvd24tODAwOiAjNGUzNDJlOwogICAgICAtLXBhcGVyLWJyb3duLTkwMDogIzNlMjcyMzsKCiAgICAgIC0tcGFwZXItZ3JleS01MDogI2ZhZmFmYTsKICAgICAgLS1wYXBlci1ncmV5LTEwMDogI2Y1ZjVmNTsKICAgICAgLS1wYXBlci1ncmV5LTIwMDogI2VlZWVlZTsKICAgICAgLS1wYXBlci1ncmV5LTMwMDogI2UwZTBlMDsKICAgICAgLS1wYXBlci1ncmV5LTQwMDogI2JkYmRiZDsKICAgICAgLS1wYXBlci1ncmV5LTUwMDogIzllOWU5ZTsKICAgICAgLS1wYXBlci1ncmV5LTYwMDogIzc1NzU3NTsKICAgICAgLS1wYXBlci1ncmV5LTcwMDogIzYxNjE2MTsKICAgICAgLS1wYXBlci1ncmV5LTgwMDogIzQyNDI0MjsKICAgICAgLS1wYXBlci1ncmV5LTkwMDogIzIxMjEyMTsKCiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTUwOiAjZWNlZmYxOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS0xMDA6ICNjZmQ4ZGM7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTIwMDogI2IwYmVjNTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktMzAwOiAjOTBhNGFlOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS00MDA6ICM3ODkwOWM7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTUwMDogIzYwN2Q4YjsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNjAwOiAjNTQ2ZTdhOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS03MDA6ICM0NTVhNjQ7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTgwMDogIzM3NDc0ZjsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktOTAwOiAjMjYzMjM4OwoKICAgICAgLyogb3BhY2l0eSBmb3IgZGFyayB0ZXh0IG9uIGEgbGlnaHQgYmFja2dyb3VuZCAqLwogICAgICAtLWRhcmstZGl2aWRlci1vcGFjaXR5OiAwLjEyOwogICAgICAtLWRhcmstZGlzYWJsZWQtb3BhY2l0eTogMC4zODsgLyogb3IgaGludCB0ZXh0IG9yIGljb24gKi8KICAgICAgLS1kYXJrLXNlY29uZGFyeS1vcGFjaXR5OiAwLjU0OwogICAgICAtLWRhcmstcHJpbWFyeS1vcGFjaXR5OiAwLjg3OwoKICAgICAgLyogb3BhY2l0eSBmb3IgbGlnaHQgdGV4dCBvbiBhIGRhcmsgYmFja2dyb3VuZCAqLwogICAgICAtLWxpZ2h0LWRpdmlkZXItb3BhY2l0eTogMC4xMjsKICAgICAgLS1saWdodC1kaXNhYmxlZC1vcGFjaXR5OiAwLjM7IC8qIG9yIGhpbnQgdGV4dCBvciBpY29uICovCiAgICAgIC0tbGlnaHQtc2Vjb25kYXJ5LW9wYWNpdHk6IDAuNzsKICAgICAgLS1saWdodC1wcmltYXJ5LW9wYWNpdHk6IDEuMDsKCiAgICB9CgogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgpgO25hLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJkaXNwbGF5OiBub25lOyIpLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobmEuY29udGVudCk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBpYT1fZWAKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKICAgICAgLyoKICAgICAgICogWW91IGNhbiB1c2UgdGhlc2UgZ2VuZXJpYyB2YXJpYWJsZXMgaW4geW91ciBlbGVtZW50cyBmb3IgZWFzeSB0aGVtaW5nLgogICAgICAgKiBGb3IgZXhhbXBsZSwgaWYgYWxsIHlvdXIgZWxlbWVudHMgdXNlIFxgLS1wcmltYXJ5LXRleHQtY29sb3JcYCBhcyBpdHMgbWFpbgogICAgICAgKiBjb2xvciwgdGhlbiBzd2l0Y2hpbmcgZnJvbSBhIGxpZ2h0IHRvIGEgZGFyayB0aGVtZSBpcyBqdXN0IGEgbWF0dGVyIG9mCiAgICAgICAqIGNoYW5naW5nIHRoZSB2YWx1ZSBvZiBcYC0tcHJpbWFyeS10ZXh0LWNvbG9yXGAgaW4geW91ciBhcHBsaWNhdGlvbi4KICAgICAgICovCiAgICAgIC0tcHJpbWFyeS10ZXh0LWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS10ZXh0LWNvbG9yKTsKICAgICAgLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLWJhY2tncm91bmQtY29sb3IpOwogICAgICAtLXNlY29uZGFyeS10ZXh0LWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS1zZWNvbmRhcnktY29sb3IpOwogICAgICAtLWRpc2FibGVkLXRleHQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLWRpc2FibGVkLWNvbG9yKTsKICAgICAgLS1kaXZpZGVyLWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS1kaXZpZGVyLWNvbG9yKTsKICAgICAgLS1lcnJvci1jb2xvcjogdmFyKC0tcGFwZXItZGVlcC1vcmFuZ2UtYTcwMCk7CgogICAgICAvKgogICAgICAgKiBQcmltYXJ5IGFuZCBhY2NlbnQgY29sb3JzLiBBbHNvIHNlZSBjb2xvci5qcyBmb3IgbW9yZSBjb2xvcnMuCiAgICAgICAqLwogICAgICAtLXByaW1hcnktY29sb3I6IHZhcigtLXBhcGVyLWluZGlnby01MDApOwogICAgICAtLWxpZ2h0LXByaW1hcnktY29sb3I6IHZhcigtLXBhcGVyLWluZGlnby0xMDApOwogICAgICAtLWRhcmstcHJpbWFyeS1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTcwMCk7CgogICAgICAtLWFjY2VudC1jb2xvcjogdmFyKC0tcGFwZXItcGluay1hMjAwKTsKICAgICAgLS1saWdodC1hY2NlbnQtY29sb3I6IHZhcigtLXBhcGVyLXBpbmstYTEwMCk7CiAgICAgIC0tZGFyay1hY2NlbnQtY29sb3I6IHZhcigtLXBhcGVyLXBpbmstYTQwMCk7CgoKICAgICAgLyoKICAgICAgICogTWF0ZXJpYWwgRGVzaWduIExpZ2h0IGJhY2tncm91bmQgdGhlbWUKICAgICAgICovCiAgICAgIC0tbGlnaHQtdGhlbWUtYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKICAgICAgLS1saWdodC10aGVtZS1iYXNlLWNvbG9yOiAjMDAwMDAwOwogICAgICAtLWxpZ2h0LXRoZW1lLXRleHQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktOTAwKTsKICAgICAgLS1saWdodC10aGVtZS1zZWNvbmRhcnktY29sb3I6ICM3MzczNzM7ICAvKiBmb3Igc2Vjb25kYXJ5IHRleHQgYW5kIGljb25zICovCiAgICAgIC0tbGlnaHQtdGhlbWUtZGlzYWJsZWQtY29sb3I6ICM5YjliOWI7ICAvKiBkaXNhYmxlZC9oaW50IHRleHQgKi8KICAgICAgLS1saWdodC10aGVtZS1kaXZpZGVyLWNvbG9yOiAjZGJkYmRiOwoKICAgICAgLyoKICAgICAgICogTWF0ZXJpYWwgRGVzaWduIERhcmsgYmFja2dyb3VuZCB0aGVtZQogICAgICAgKi8KICAgICAgLS1kYXJrLXRoZW1lLWJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktOTAwKTsKICAgICAgLS1kYXJrLXRoZW1lLWJhc2UtY29sb3I6ICNmZmZmZmY7CiAgICAgIC0tZGFyay10aGVtZS10ZXh0LWNvbG9yOiAjZmZmZmZmOwogICAgICAtLWRhcmstdGhlbWUtc2Vjb25kYXJ5LWNvbG9yOiAjYmNiY2JjOyAgLyogZm9yIHNlY29uZGFyeSB0ZXh0IGFuZCBpY29ucyAqLwogICAgICAtLWRhcmstdGhlbWUtZGlzYWJsZWQtY29sb3I6ICM2NDY0NjQ7ICAvKiBkaXNhYmxlZC9oaW50IHRleHQgKi8KICAgICAgLS1kYXJrLXRoZW1lLWRpdmlkZXItY29sb3I6ICMzYzNjM2M7CgogICAgICAvKgogICAgICAgKiBEZXByZWNhdGVkIHZhbHVlcyBiZWNhdXNlIG9mIHRoZWlyIGNvbmZ1c2luZyBuYW1lcy4KICAgICAgICovCiAgICAgIC0tdGV4dC1wcmltYXJ5LWNvbG9yOiB2YXIoLS1kYXJrLXRoZW1lLXRleHQtY29sb3IpOwogICAgICAtLWRlZmF1bHQtcHJpbWFyeS1jb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcik7CiAgICB9CiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+YDtpYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZGlzcGxheTogbm9uZTsiKSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGlhLmNvbnRlbnQpOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgcmE9e3Byb3BlcnRpZXM6e25hbWU6e3R5cGU6U3RyaW5nfSx2YWx1ZTp7bm90aWZ5OiEwLHR5cGU6U3RyaW5nfSxyZXF1aXJlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt9LGRldGFjaGVkOmZ1bmN0aW9uKCl7fX07Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL2xldCBvYT1udWxsO2NvbnN0IGFhPXtwcm9wZXJ0aWVzOnt2YWxpZGF0b3I6e3R5cGU6U3RyaW5nfSxpbnZhbGlkOntub3RpZnk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2ludmFsaWRDaGFuZ2VkIn19LHJlZ2lzdGVyZWQ6ZnVuY3Rpb24oKXtvYT1uZXcgeG8oe3R5cGU6InZhbGlkYXRvciJ9KX0sX2ludmFsaWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5pbnZhbGlkP3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWludmFsaWQiLCJ0cnVlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtaW52YWxpZCIpfSxnZXQgX3ZhbGlkYXRvcigpe3JldHVybiBvYSYmb2EuYnlLZXkodGhpcy52YWxpZGF0b3IpfSxoYXNWYWxpZGF0b3I6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9dGhpcy5fdmFsaWRhdG9yfSx2YWxpZGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbnZhbGlkPXZvaWQgMD09PXQmJnZvaWQgMCE9PXRoaXMudmFsdWU/IXRoaXMuX2dldFZhbGlkaXR5KHRoaXMudmFsdWUpOiF0aGlzLl9nZXRWYWxpZGl0eSh0KSwhdGhpcy5pbnZhbGlkfSxfZ2V0VmFsaWRpdHk6ZnVuY3Rpb24odCl7cmV0dXJuIXRoaXMuaGFzVmFsaWRhdG9yKCl8fHRoaXMuX3ZhbGlkYXRvci52YWxpZGF0ZSh0KX19LHNhPXtwcm9wZXJ0aWVzOntjaGVja2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLG5vdGlmeTohMCxvYnNlcnZlcjoiX2NoZWNrZWRDaGFuZ2VkIn0sdG9nZ2xlczp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sdmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiJvbiIsb2JzZXJ2ZXI6Il92YWx1ZUNoYW5nZWQifX0sb2JzZXJ2ZXJzOlsiX3JlcXVpcmVkQ2hhbmdlZChyZXF1aXJlZCkiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5faGFzSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3I9ITB9LF9nZXRWYWxpZGl0eTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kaXNhYmxlZHx8IXRoaXMucmVxdWlyZWR8fHRoaXMuY2hlY2tlZH0sX3JlcXVpcmVkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMucmVxdWlyZWQ/dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtcmVxdWlyZWQiLCJ0cnVlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtcmVxdWlyZWQiKX0sX2NoZWNrZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5hY3RpdmU9dGhpcy5jaGVja2VkLHRoaXMuZmlyZSgiaXJvbi1jaGFuZ2UiKX0sX3ZhbHVlQ2hhbmdlZDpmdW5jdGlvbigpe251bGw9PXRoaXMudmFsdWUmJih0aGlzLnZhbHVlPSJvbiIpfX0sbGE9e29ic2VydmVyczpbIl9mb2N1c2VkQ2hhbmdlZChyZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKSJdLF9mb2N1c2VkQ2hhbmdlZDpmdW5jdGlvbih0KXt0JiZ0aGlzLmVuc3VyZVJpcHBsZSgpLHRoaXMuaGFzUmlwcGxlKCkmJih0aGlzLl9yaXBwbGUuaG9sZERvd249dCl9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXt2YXIgdD1Kby5fY3JlYXRlUmlwcGxlKCk7cmV0dXJuIHQuaWQ9ImluayIsdC5zZXRBdHRyaWJ1dGUoImNlbnRlciIsIiIpLHQuY2xhc3NMaXN0LmFkZCgiY2lyY2xlIiksdH19LGNhPVtYbyxxbyxKbyxsYV0sdWE9W2NhLFtyYSxhYSxzYV0se19jaGVja2VkQ2hhbmdlZDpmdW5jdGlvbigpe3NhLl9jaGVja2VkQ2hhbmdlZC5jYWxsKHRoaXMpLHRoaXMuaGFzUmlwcGxlKCkmJih0aGlzLmNoZWNrZWQ/dGhpcy5fcmlwcGxlLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsIiIpOnRoaXMuX3JpcHBsZS5yZW1vdmVBdHRyaWJ1dGUoImNoZWNrZWQiKSl9LF9idXR0b25TdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oKXtKby5fYnV0dG9uU3RhdGVDaGFuZ2VkLmNhbGwodGhpcyksdGhpcy5kaXNhYmxlZHx8dGhpcy5pc0F0dGFjaGVkJiYodGhpcy5jaGVja2VkPXRoaXMuYWN0aXZlKX19XSxoYT1fZWA8c3R5bGU+CiAgOmhvc3QgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplOiB2YXIoLS1wYXBlci1jaGVja2JveC1zaXplLCAxOHB4KTsKICAgIC8qIC0xcHggaXMgYSBzZW50aW5lbCBmb3IgdGhlIGRlZmF1bHQgYW5kIGlzIHJlcGxhY2VkIGluIFxgYXR0YWNoZWRcYC4gKi8KICAgIC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZTogdmFyKC0tcGFwZXItY2hlY2tib3gtaW5rLXNpemUsIC0xcHgpOwogICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgIGxpbmUtaGVpZ2h0OiAwOwogICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICB9CgogIDpob3N0KFtoaWRkZW5dKSB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgfQoKICA6aG9zdCg6Zm9jdXMpIHsKICAgIG91dGxpbmU6IG5vbmU7CiAgfQoKICAuaGlkZGVuIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQoKICAjY2hlY2tib3hDb250YWluZXIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSk7CiAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSk7CiAgICBtaW4td2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSk7CiAgICBtYXJnaW46IHZhcigtLXBhcGVyLWNoZWNrYm94LW1hcmdpbiwgaW5pdGlhbCk7CiAgICB2ZXJ0aWNhbC1hbGlnbjogdmFyKC0tcGFwZXItY2hlY2tib3gtdmVydGljYWwtYWxpZ24sIG1pZGRsZSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtYmFja2dyb3VuZC1jb2xvciwgdHJhbnNwYXJlbnQpOwogIH0KCiAgI2luayB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CgogICAgLyogQ2VudGVyIHRoZSByaXBwbGUgaW4gdGhlIGNoZWNrYm94IGJ5IG5lZ2F0aXZlIG9mZnNldHRpbmcgaXQgYnkKICAgICAqIChpbmtXaWR0aCAtIHJpcHBsZVdpZHRoKSAvIDIgKi8KICAgIHRvcDogY2FsYygwcHggLSAodmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSkgLSB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpKSAvIDIpOwogICAgbGVmdDogY2FsYygwcHggLSAodmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSkgLSB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpKSAvIDIpOwogICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpOwogICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplKTsKICAgIGNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgIG9wYWNpdHk6IDAuNjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogIH0KCiAgI2luazpkaXIocnRsKSB7CiAgICByaWdodDogY2FsYygwcHggLSAodmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSkgLSB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpKSAvIDIpOwogICAgbGVmdDogYXV0bzsKICB9CgogICNpbmtbY2hlY2tlZF0gewogICAgY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgfQoKICAjY2hlY2tib3ggewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIGhlaWdodDogMTAwJTsKICAgIGJvcmRlcjogc29saWQgMnB4OwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAtd2Via2l0LXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMTQwbXMsIGJvcmRlci1jb2xvciAxNDBtczsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMTQwbXMsIGJvcmRlci1jb2xvciAxNDBtczsKCiAgICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLWNoZWNrYm94LWFuaW1hdGlvbi1kdXJhdGlvbiwgMTQwbXMpOwogICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItY2hlY2tib3gtYW5pbWF0aW9uLWR1cmF0aW9uLCAxNDBtcyk7CiAgfQoKICAvKiBjaGVja2JveCBjaGVja2VkIGFuaW1hdGlvbnMgKi8KICAjY2hlY2tib3guY2hlY2tlZCAjY2hlY2ttYXJrIHsKICAgIC13ZWJraXQtYW5pbWF0aW9uOiBjaGVja21hcmstZXhwYW5kIDE0MG1zIGVhc2Utb3V0IGZvcndhcmRzOwogICAgYW5pbWF0aW9uOiBjaGVja21hcmstZXhwYW5kIDE0MG1zIGVhc2Utb3V0IGZvcndhcmRzOwoKICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci1jaGVja2JveC1hbmltYXRpb24tZHVyYXRpb24sIDE0MG1zKTsKICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItY2hlY2tib3gtYW5pbWF0aW9uLWR1cmF0aW9uLCAxNDBtcyk7CiAgfQoKICBALXdlYmtpdC1rZXlmcmFtZXMgY2hlY2ttYXJrLWV4cGFuZCB7CiAgICAwJSB7CiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLCAwKSByb3RhdGUoNDVkZWcpOwogICAgfQogICAgMTAwJSB7CiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLCAxKSByb3RhdGUoNDVkZWcpOwogICAgfQogIH0KCiAgQGtleWZyYW1lcyBjaGVja21hcmstZXhwYW5kIHsKICAgIDAlIHsKICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLCAwKSByb3RhdGUoNDVkZWcpOwogICAgfQogICAgMTAwJSB7CiAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSkgcm90YXRlKDQ1ZGVnKTsKICAgIH0KICB9CgogICNjaGVja2JveC5jaGVja2VkIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogIH0KCiAgI2NoZWNrbWFyayB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB3aWR0aDogMzYlOwogICAgaGVpZ2h0OiA3MCU7CiAgICBib3JkZXItc3R5bGU6IHNvbGlkOwogICAgYm9yZGVyLXRvcDogbm9uZTsKICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgYm9yZGVyLXJpZ2h0LXdpZHRoOiBjYWxjKDIvMTUgKiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpKTsKICAgIGJvcmRlci1ib3R0b20td2lkdGg6IGNhbGMoMi8xNSAqIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1jaGVja21hcmstY29sb3IsIHdoaXRlKTsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogOTclIDg2JTsKICAgIHRyYW5zZm9ybS1vcmlnaW46IDk3JSA4NiU7CiAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDsgLyogcHJvdGVjdCBhZ2FpbnN0IHBhZ2UtbGV2ZWwgYm94LXNpemluZyAqLwogIH0KCiAgI2NoZWNrbWFyazpkaXIocnRsKSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IDUwJSAxNCU7CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiA1MCUgMTQlOwogIH0KCiAgLyogbGFiZWwgKi8KICAjY2hlY2tib3hMYWJlbCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1wYXBlci1jaGVja2JveC1sYWJlbC1zcGFjaW5nLCA4cHgpOwogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7CiAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgQGFwcGx5IC0tcGFwZXItY2hlY2tib3gtbGFiZWw7CiAgfQoKICA6aG9zdChbY2hlY2tlZF0pICNjaGVja2JveExhYmVsIHsKICAgIGNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1sYWJlbC1jaGVja2VkLWNvbG9yLCB2YXIoLS1wYXBlci1jaGVja2JveC1sYWJlbC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSkpOwogICAgQGFwcGx5IC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY2hlY2tlZDsKICB9CgogICNjaGVja2JveExhYmVsOmRpcihydGwpIHsKICAgIHBhZGRpbmctcmlnaHQ6IHZhcigtLXBhcGVyLWNoZWNrYm94LWxhYmVsLXNwYWNpbmcsIDhweCk7CiAgICBwYWRkaW5nLWxlZnQ6IDA7CiAgfQoKICAjY2hlY2tib3hMYWJlbFtoaWRkZW5dIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQoKICAvKiBkaXNhYmxlZCBzdGF0ZSAqLwoKICA6aG9zdChbZGlzYWJsZWRdKSAjY2hlY2tib3ggewogICAgb3BhY2l0eTogMC41OwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogIH0KCiAgOmhvc3QoW2Rpc2FibGVkXVtjaGVja2VkXSkgI2NoZWNrYm94IHsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICBvcGFjaXR5OiAwLjU7CiAgfQoKICA6aG9zdChbZGlzYWJsZWRdKSAjY2hlY2tib3hMYWJlbCAgewogICAgb3BhY2l0eTogMC42NTsKICB9CgogIC8qIGludmFsaWQgc3RhdGUgKi8KICAjY2hlY2tib3guaW52YWxpZDpub3QoLmNoZWNrZWQpIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtZXJyb3ItY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgfQo8L3N0eWxlPgoKPGRpdiBpZD0iY2hlY2tib3hDb250YWluZXIiPgogIDxkaXYgaWQ9ImNoZWNrYm94IiBjbGFzcyQ9IltbX2NvbXB1dGVDaGVja2JveENsYXNzKGNoZWNrZWQsIGludmFsaWQpXV0iPgogICAgPGRpdiBpZD0iY2hlY2ttYXJrIiBjbGFzcyQ9IltbX2NvbXB1dGVDaGVja21hcmtDbGFzcyhjaGVja2VkKV1dIj48L2Rpdj4KICA8L2Rpdj4KPC9kaXY+Cgo8ZGl2IGlkPSJjaGVja2JveExhYmVsIj48c2xvdD48L3Nsb3Q+PC9kaXY+YDsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpsZXQgZGE7aGEuc2V0QXR0cmlidXRlKCJzdHJpcC13aGl0ZXNwYWNlIiwiIiksUnIoe190ZW1wbGF0ZTpoYSxpczoicGFwZXItY2hlY2tib3giLGJlaGF2aW9yczpbdWFdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJjaGVja2JveCIsImFyaWEtY2hlY2tlZCI6ITEsdGFiaW5kZXg6MH0scHJvcGVydGllczp7YXJpYUFjdGl2ZUF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImFyaWEtY2hlY2tlZCJ9fSxhdHRhY2hlZDpmdW5jdGlvbigpe0xpKHRoaXMsKGZ1bmN0aW9uKCl7aWYoIi0xcHgiPT09dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSIpLnRyaW0oKSl7dmFyIHQ9dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplIikudHJpbSgpLGU9InB4IixuPXQubWF0Y2goL1tBLVphLXpdKyQvKTtudWxsIT09biYmKGU9blswXSk7dmFyIGk9cGFyc2VGbG9hdCh0KSxyPTgvMyppOyJweCI9PT1lJiYocj1NYXRoLmZsb29yKHIpKSUyIT1pJTImJnIrKyx0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItY2hlY2tib3gtaW5rLXNpemUiOnIrZX0pfX0pKX0sX2NvbXB1dGVDaGVja2JveENsYXNzOmZ1bmN0aW9uKHQsZSl7dmFyIG49IiI7cmV0dXJuIHQmJihuKz0iY2hlY2tlZCAiKSxlJiYobis9ImludmFsaWQiKSxufSxfY29tcHV0ZUNoZWNrbWFya0NsYXNzOmZ1bmN0aW9uKHQpe3JldHVybiB0PyIiOiJoaWRkZW4ifSxfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JpcHBsZUNvbnRhaW5lcj10aGlzLiQuY2hlY2tib3hDb250YWluZXIsbGEuX2NyZWF0ZVJpcHBsZS5jYWxsKHRoaXMpfX0pO2NvbnN0IHBhPXtwcm9wZXJ0aWVzOntzaXppbmdUYXJnZXQ6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSxmaXRJbnRvOnt0eXBlOk9iamVjdCx2YWx1ZTp3aW5kb3d9LG5vT3ZlcmxhcDp7dHlwZTpCb29sZWFufSxwb3NpdGlvblRhcmdldDp7dHlwZTpFbGVtZW50fSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nfSx2ZXJ0aWNhbEFsaWduOnt0eXBlOlN0cmluZ30sZHluYW1pY0FsaWduOnt0eXBlOkJvb2xlYW59LGhvcml6b250YWxPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSx2ZXJ0aWNhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LGF1dG9GaXRPbkF0dGFjaDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxleHBhbmRTaXppbmdUYXJnZXRGb3JTY3JvbGxiYXJzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9maXRJbmZvOnt0eXBlOk9iamVjdH19LGdldCBfZml0V2lkdGgoKXtyZXR1cm4gdGhpcy5maXRJbnRvPT09d2luZG93P3RoaXMuZml0SW50by5pbm5lcldpZHRoOnRoaXMuZml0SW50by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aH0sZ2V0IF9maXRIZWlnaHQoKXtyZXR1cm4gdGhpcy5maXRJbnRvPT09d2luZG93P3RoaXMuZml0SW50by5pbm5lckhlaWdodDp0aGlzLmZpdEludG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0fSxnZXQgX2ZpdExlZnQoKXtyZXR1cm4gdGhpcy5maXRJbnRvPT09d2luZG93PzA6dGhpcy5maXRJbnRvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnR9LGdldCBfZml0VG9wKCl7cmV0dXJuIHRoaXMuZml0SW50bz09PXdpbmRvdz8wOnRoaXMuZml0SW50by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3B9LGdldCBfZGVmYXVsdFBvc2l0aW9uVGFyZ2V0KCl7dmFyIHQ9WWkodGhpcykucGFyZW50Tm9kZTtyZXR1cm4gdCYmdC5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSYmKHQ9dC5ob3N0KSx0fSxnZXQgX2xvY2FsZUhvcml6b250YWxBbGlnbigpe2lmKHRoaXMuX2lzUlRMKXtpZigicmlnaHQiPT09dGhpcy5ob3Jpem9udGFsQWxpZ24pcmV0dXJuImxlZnQiO2lmKCJsZWZ0Ij09PXRoaXMuaG9yaXpvbnRhbEFsaWduKXJldHVybiJyaWdodCJ9cmV0dXJuIHRoaXMuaG9yaXpvbnRhbEFsaWdufSxnZXQgX19zaG91bGRQb3NpdGlvbigpe3JldHVybih0aGlzLmhvcml6b250YWxBbGlnbnx8dGhpcy52ZXJ0aWNhbEFsaWduKSYmdGhpcy5wb3NpdGlvblRhcmdldH0sZ2V0IF9pc1JUTCgpe3JldHVybiB2b2lkIDA9PT10aGlzLl9tZW1vaXplZElzUlRMJiYodGhpcy5fbWVtb2l6ZWRJc1JUTD0icnRsIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcykuZGlyZWN0aW9uKSx0aGlzLl9tZW1vaXplZElzUlRMfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMucG9zaXRpb25UYXJnZXQ9dGhpcy5wb3NpdGlvblRhcmdldHx8dGhpcy5fZGVmYXVsdFBvc2l0aW9uVGFyZ2V0LHRoaXMuYXV0b0ZpdE9uQXR0YWNoJiYoIm5vbmUiPT09d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcykuZGlzcGxheT9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5maXQoKX0uYmluZCh0aGlzKSk6KHdpbmRvdy5TaGFkeURPTSYmU2hhZHlET00uZmx1c2goKSx0aGlzLmZpdCgpKSl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fX2RlZmVycmVkRml0JiYoY2xlYXJUaW1lb3V0KHRoaXMuX19kZWZlcnJlZEZpdCksdGhpcy5fX2RlZmVycmVkRml0PW51bGwpfSxmaXQ6ZnVuY3Rpb24oKXt0aGlzLnBvc2l0aW9uKCksdGhpcy5jb25zdHJhaW4oKSx0aGlzLmNlbnRlcigpfSxfZGlzY292ZXJJbmZvOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2ZpdEluZm8pe3ZhciB0PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5zaXppbmdUYXJnZXQpO3RoaXMuX2ZpdEluZm89e2lubGluZVN0eWxlOnt0b3A6dGhpcy5zdHlsZS50b3B8fCIiLGxlZnQ6dGhpcy5zdHlsZS5sZWZ0fHwiIixwb3NpdGlvbjp0aGlzLnN0eWxlLnBvc2l0aW9ufHwiIn0sc2l6ZXJJbmxpbmVTdHlsZTp7bWF4V2lkdGg6dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUubWF4V2lkdGh8fCIiLG1heEhlaWdodDp0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5tYXhIZWlnaHR8fCIiLGJveFNpemluZzp0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5ib3hTaXppbmd8fCIifSxwb3NpdGlvbmVkQnk6e3ZlcnRpY2FsbHk6ImF1dG8iIT09dC50b3A/InRvcCI6ImF1dG8iIT09dC5ib3R0b20/ImJvdHRvbSI6bnVsbCxob3Jpem9udGFsbHk6ImF1dG8iIT09dC5sZWZ0PyJsZWZ0IjoiYXV0byIhPT10LnJpZ2h0PyJyaWdodCI6bnVsbH0sc2l6ZWRCeTp7aGVpZ2h0OiJub25lIiE9PWUubWF4SGVpZ2h0LHdpZHRoOiJub25lIiE9PWUubWF4V2lkdGgsbWluV2lkdGg6cGFyc2VJbnQoZS5taW5XaWR0aCwxMCl8fDAsbWluSGVpZ2h0OnBhcnNlSW50KGUubWluSGVpZ2h0LDEwKXx8MH0sbWFyZ2luOnt0b3A6cGFyc2VJbnQodC5tYXJnaW5Ub3AsMTApfHwwLHJpZ2h0OnBhcnNlSW50KHQubWFyZ2luUmlnaHQsMTApfHwwLGJvdHRvbTpwYXJzZUludCh0Lm1hcmdpbkJvdHRvbSwxMCl8fDAsbGVmdDpwYXJzZUludCh0Lm1hcmdpbkxlZnQsMTApfHwwfX19fSxyZXNldEZpdDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2ZpdEluZm98fHt9O2Zvcih2YXIgZSBpbiB0LnNpemVySW5saW5lU3R5bGUpdGhpcy5zaXppbmdUYXJnZXQuc3R5bGVbZV09dC5zaXplcklubGluZVN0eWxlW2VdO2Zvcih2YXIgZSBpbiB0LmlubGluZVN0eWxlKXRoaXMuc3R5bGVbZV09dC5pbmxpbmVTdHlsZVtlXTt0aGlzLl9maXRJbmZvPW51bGx9LHJlZml0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsTGVmdCxlPXRoaXMuc2l6aW5nVGFyZ2V0LnNjcm9sbFRvcDt0aGlzLnJlc2V0Rml0KCksdGhpcy5maXQoKSx0aGlzLnNpemluZ1RhcmdldC5zY3JvbGxMZWZ0PXQsdGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsVG9wPWV9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19zaG91bGRQb3NpdGlvbilyZXR1cm47dGhpcy5fZGlzY292ZXJJbmZvKCksd2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uZmx1c2goKSx0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsdGhpcy5zaXppbmdUYXJnZXQuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iix0aGlzLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5zdHlsZS50b3A9IjBweCI7dmFyIHQ9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxlPXRoaXMuX19nZXROb3JtYWxpemVkUmVjdCh0aGlzLnBvc2l0aW9uVGFyZ2V0KSxuPXRoaXMuX19nZXROb3JtYWxpemVkUmVjdCh0aGlzLmZpdEludG8pO2xldCBpLHIsbyxhO3RoaXMuZXhwYW5kU2l6aW5nVGFyZ2V0Rm9yU2Nyb2xsYmFycyYmKGk9dGhpcy5zaXppbmdUYXJnZXQub2Zmc2V0V2lkdGgscj10aGlzLnNpemluZ1RhcmdldC5vZmZzZXRIZWlnaHQsbz10aGlzLnNpemluZ1RhcmdldC5jbGllbnRXaWR0aCxhPXRoaXMuc2l6aW5nVGFyZ2V0LmNsaWVudEhlaWdodCk7dmFyIHM9dGhpcy5fZml0SW5mby5tYXJnaW4sbD10aGlzLl9fZ2V0UG9zaXRpb24odGhpcy5fbG9jYWxlSG9yaXpvbnRhbEFsaWduLHRoaXMudmVydGljYWxBbGlnbix7d2lkdGg6dC53aWR0aCtzLmxlZnQrcy5yaWdodCxoZWlnaHQ6dC5oZWlnaHQrcy50b3Arcy5ib3R0b219LHQsZSxuKSxjPWwubGVmdCtzLmxlZnQsdT1sLnRvcCtzLnRvcCxoPU1hdGgubWluKG4ucmlnaHQtcy5yaWdodCxjK3Qud2lkdGgpLGQ9TWF0aC5taW4obi5ib3R0b20tcy5ib3R0b20sdSt0LmhlaWdodCk7Yz1NYXRoLm1heChuLmxlZnQrcy5sZWZ0LE1hdGgubWluKGMsaC10aGlzLl9maXRJbmZvLnNpemVkQnkubWluV2lkdGgpKSx1PU1hdGgubWF4KG4udG9wK3MudG9wLE1hdGgubWluKHUsZC10aGlzLl9maXRJbmZvLnNpemVkQnkubWluSGVpZ2h0KSk7Y29uc3QgcD1NYXRoLm1heChoLWMsdGhpcy5fZml0SW5mby5zaXplZEJ5Lm1pbldpZHRoKSxmPU1hdGgubWF4KGQtdSx0aGlzLl9maXRJbmZvLnNpemVkQnkubWluSGVpZ2h0KTt0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5tYXhXaWR0aD1wKyJweCIsdGhpcy5zaXppbmdUYXJnZXQuc3R5bGUubWF4SGVpZ2h0PWYrInB4Ijtjb25zdCBtPWMtdC5sZWZ0LGc9dS10LnRvcDtpZih0aGlzLnN0eWxlLmxlZnQ9YCR7bX1weGAsdGhpcy5zdHlsZS50b3A9YCR7Z31weGAsdGhpcy5leHBhbmRTaXppbmdUYXJnZXRGb3JTY3JvbGxiYXJzKXtjb25zdCB0PXRoaXMuc2l6aW5nVGFyZ2V0Lm9mZnNldEhlaWdodCxlPXQtdGhpcy5zaXppbmdUYXJnZXQuY2xpZW50SGVpZ2h0LShyLWEpO2lmKGU+MCl7Y29uc3QgaT1NYXRoLm1pbihuLmhlaWdodC1zLnRvcC1zLmJvdHRvbSxmK2UpO3RoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLm1heEhlaWdodD1gJHtpfXB4YDtjb25zdCByPXRoaXMuc2l6aW5nVGFyZ2V0Lm9mZnNldEhlaWdodCxvPXItdDtsZXQgYTsidG9wIj09PWwudmVydGljYWxBbGlnbj9hPWc6Im1pZGRsZSI9PT1sLnZlcnRpY2FsQWxpZ24/YT1nLW8vMjoiYm90dG9tIj09PWwudmVydGljYWxBbGlnbiYmKGE9Zy1vKSxhPU1hdGgubWF4KG4udG9wK3MudG9wLE1hdGgubWluKGEsbi5ib3R0b20tcy5ib3R0b20tcikpLHRoaXMuc3R5bGUudG9wPWAke2F9cHhgfWNvbnN0IGM9dGhpcy5zaXppbmdUYXJnZXQub2Zmc2V0V2lkdGgsdT1jLXRoaXMuc2l6aW5nVGFyZ2V0LmNsaWVudFdpZHRoLShpLW8pO2lmKHU+MCl7Y29uc3QgdD0oKCk9PntpZih2b2lkIDAhPT1kYSlyZXR1cm4gZGE7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtPYmplY3QuYXNzaWduKHQuc3R5bGUse292ZXJmbG93OiJhdXRvIixwb3NpdGlvbjoiZml4ZWQiLGxlZnQ6IjBweCIsdG9wOiIwcHgiLG1heFdpZHRoOiIxMDBweCIsbWF4SGVpZ2h0OiIxMDBweCJ9KTtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBlLnN0eWxlLndpZHRoPSIyMDBweCIsZS5zdHlsZS5oZWlnaHQ9IjIwMHB4Iix0LmFwcGVuZENoaWxkKGUpLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodCksZGE9TWF0aC5hYnModC5vZmZzZXRXaWR0aC0xMDApPjE/dC5vZmZzZXRXaWR0aC10LmNsaWVudFdpZHRoOjAsZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0KSxkYX0pKCksZT1NYXRoLm1pbihuLndpZHRoLXMubGVmdC1zLnJpZ2h0LHArdS10KTt0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5tYXhXaWR0aD1gJHtlfXB4YDtjb25zdCBpPXRoaXMuc2l6aW5nVGFyZ2V0Lm9mZnNldFdpZHRoK3Qscj1pLWM7bGV0IG87ImxlZnQiPT09bC5ob3Jpem9udGFsQWxpZ24/bz1tOiJjZW50ZXIiPT09bC5ob3Jpem9udGFsQWxpZ24/bz1tLXIvMjoicmlnaHQiPT09bC5ob3Jpem9udGFsQWxpZ24mJihvPW0tciksbz1NYXRoLm1heChuLmxlZnQrcy5sZWZ0LE1hdGgubWluKG8sbi5yaWdodC1zLnJpZ2h0LWkpKSx0aGlzLnN0eWxlLmxlZnQ9YCR7b31weGB9fX0sY29uc3RyYWluOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19zaG91bGRQb3NpdGlvbil7dGhpcy5fZGlzY292ZXJJbmZvKCk7dmFyIHQ9dGhpcy5fZml0SW5mbzt0LnBvc2l0aW9uZWRCeS52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLHRoaXMuc3R5bGUudG9wPSIwcHgiKSx0LnBvc2l0aW9uZWRCeS5ob3Jpem9udGFsbHl8fCh0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsdGhpcy5zdHlsZS5sZWZ0PSIwcHgiKSx0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giO3ZhciBlPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dC5zaXplZEJ5LmhlaWdodHx8dGhpcy5fX3NpemVEaW1lbnNpb24oZSx0LnBvc2l0aW9uZWRCeS52ZXJ0aWNhbGx5LCJ0b3AiLCJib3R0b20iLCJIZWlnaHQiKSx0LnNpemVkQnkud2lkdGh8fHRoaXMuX19zaXplRGltZW5zaW9uKGUsdC5wb3NpdGlvbmVkQnkuaG9yaXpvbnRhbGx5LCJsZWZ0IiwicmlnaHQiLCJXaWR0aCIpfX0sX3NpemVEaW1lbnNpb246ZnVuY3Rpb24odCxlLG4saSxyKXt0aGlzLl9fc2l6ZURpbWVuc2lvbih0LGUsbixpLHIpfSxfX3NpemVEaW1lbnNpb246ZnVuY3Rpb24odCxlLG4saSxyKXt2YXIgbz10aGlzLl9maXRJbmZvLGE9dGhpcy5fX2dldE5vcm1hbGl6ZWRSZWN0KHRoaXMuZml0SW50bykscz0iV2lkdGgiPT09cj9hLndpZHRoOmEuaGVpZ2h0LGw9ZT09PWksYz0ib2Zmc2V0IityO3RoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlWyJtYXgiK3JdPXMtby5tYXJnaW5bbD9uOmldLShsP3MtdFtpXTp0W25dKS0odGhpc1tjXS10aGlzLnNpemluZ1RhcmdldFtjXSkrInB4In0sY2VudGVyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19zaG91bGRQb3NpdGlvbil7dGhpcy5fZGlzY292ZXJJbmZvKCk7dmFyIHQ9dGhpcy5fZml0SW5mby5wb3NpdGlvbmVkQnk7aWYoIXQudmVydGljYWxseXx8IXQuaG9yaXpvbnRhbGx5KXt0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsdC52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS50b3A9IjBweCIpLHQuaG9yaXpvbnRhbGx5fHwodGhpcy5zdHlsZS5sZWZ0PSIwcHgiKTt2YXIgZT10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49dGhpcy5fX2dldE5vcm1hbGl6ZWRSZWN0KHRoaXMuZml0SW50byk7dC52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS50b3A9bi50b3AtZS50b3ArKG4uaGVpZ2h0LWUuaGVpZ2h0KS8yKyJweCIpLHQuaG9yaXpvbnRhbGx5fHwodGhpcy5zdHlsZS5sZWZ0PW4ubGVmdC1lLmxlZnQrKG4ud2lkdGgtZS53aWR0aCkvMisicHgiKX19fSxfX2dldE5vcm1hbGl6ZWRSZWN0OmZ1bmN0aW9uKHQpe3JldHVybiB0PT09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx0PT09d2luZG93P3t0b3A6MCxsZWZ0OjAsd2lkdGg6d2luZG93LmlubmVyV2lkdGgsaGVpZ2h0OndpbmRvdy5pbm5lckhlaWdodCxyaWdodDp3aW5kb3cuaW5uZXJXaWR0aCxib3R0b206d2luZG93LmlubmVySGVpZ2h0fTp0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfSxfX2dldE9mZnNjcmVlbkFyZWE6ZnVuY3Rpb24odCxlLG4pe3ZhciBpPU1hdGgubWluKDAsdC50b3ApK01hdGgubWluKDAsbi5ib3R0b20tKHQudG9wK2UuaGVpZ2h0KSkscj1NYXRoLm1pbigwLHQubGVmdCkrTWF0aC5taW4oMCxuLnJpZ2h0LSh0LmxlZnQrZS53aWR0aCkpO3JldHVybiBNYXRoLmFicyhpKSplLndpZHRoK01hdGguYWJzKHIpKmUuaGVpZ2h0fSxfX2dldFBvc2l0aW9uOmZ1bmN0aW9uKHQsZSxuLGkscixvKXt2YXIgYSxzPVt7dmVydGljYWxBbGlnbjoidG9wIixob3Jpem9udGFsQWxpZ246ImxlZnQiLHRvcDpyLnRvcCt0aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ci5sZWZ0K3RoaXMuaG9yaXpvbnRhbE9mZnNldH0se3ZlcnRpY2FsQWxpZ246InRvcCIsaG9yaXpvbnRhbEFsaWduOiJyaWdodCIsdG9wOnIudG9wK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDpyLnJpZ2h0LW4ud2lkdGgtdGhpcy5ob3Jpem9udGFsT2Zmc2V0fSx7dmVydGljYWxBbGlnbjoiYm90dG9tIixob3Jpem9udGFsQWxpZ246ImxlZnQiLHRvcDpyLmJvdHRvbS1uLmhlaWdodC10aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ci5sZWZ0K3RoaXMuaG9yaXpvbnRhbE9mZnNldH0se3ZlcnRpY2FsQWxpZ246ImJvdHRvbSIsaG9yaXpvbnRhbEFsaWduOiJyaWdodCIsdG9wOnIuYm90dG9tLW4uaGVpZ2h0LXRoaXMudmVydGljYWxPZmZzZXQsbGVmdDpyLnJpZ2h0LW4ud2lkdGgtdGhpcy5ob3Jpem9udGFsT2Zmc2V0fV07aWYodGhpcy5ub092ZXJsYXApe2Zvcih2YXIgbD0wLGM9cy5sZW5ndGg7bDxjO2wrKyl7dmFyIHU9e307Zm9yKHZhciBoIGluIHNbbF0pdVtoXT1zW2xdW2hdO3MucHVzaCh1KX1zWzBdLnRvcD1zWzFdLnRvcCs9ci5oZWlnaHQsc1syXS50b3A9c1szXS50b3AtPXIuaGVpZ2h0LHNbNF0ubGVmdD1zWzZdLmxlZnQrPXIud2lkdGgsc1s1XS5sZWZ0PXNbN10ubGVmdC09ci53aWR0aH1mb3IoZT0iYXV0byI9PT1lP251bGw6ZSwodD0iYXV0byI9PT10P251bGw6dCkmJiJjZW50ZXIiIT09dHx8KHMucHVzaCh7dmVydGljYWxBbGlnbjoidG9wIixob3Jpem9udGFsQWxpZ246ImNlbnRlciIsdG9wOnIudG9wK3RoaXMudmVydGljYWxPZmZzZXQrKHRoaXMubm9PdmVybGFwP3IuaGVpZ2h0OjApLGxlZnQ6ci5sZWZ0LWkud2lkdGgvMityLndpZHRoLzIrdGhpcy5ob3Jpem9udGFsT2Zmc2V0fSkscy5wdXNoKHt2ZXJ0aWNhbEFsaWduOiJib3R0b20iLGhvcml6b250YWxBbGlnbjoiY2VudGVyIix0b3A6ci5ib3R0b20tbi5oZWlnaHQtdGhpcy52ZXJ0aWNhbE9mZnNldC0odGhpcy5ub092ZXJsYXA/ci5oZWlnaHQ6MCksbGVmdDpyLmxlZnQtaS53aWR0aC8yK3Iud2lkdGgvMit0aGlzLmhvcml6b250YWxPZmZzZXR9KSksZSYmIm1pZGRsZSIhPT1lfHwocy5wdXNoKHt2ZXJ0aWNhbEFsaWduOiJtaWRkbGUiLGhvcml6b250YWxBbGlnbjoibGVmdCIsdG9wOnIudG9wLWkuaGVpZ2h0LzIrci5oZWlnaHQvMit0aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ci5sZWZ0K3RoaXMuaG9yaXpvbnRhbE9mZnNldCsodGhpcy5ub092ZXJsYXA/ci53aWR0aDowKX0pLHMucHVzaCh7dmVydGljYWxBbGlnbjoibWlkZGxlIixob3Jpem9udGFsQWxpZ246InJpZ2h0Iix0b3A6ci50b3AtaS5oZWlnaHQvMityLmhlaWdodC8yK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDpyLnJpZ2h0LW4ud2lkdGgtdGhpcy5ob3Jpem9udGFsT2Zmc2V0LSh0aGlzLm5vT3ZlcmxhcD9yLndpZHRoOjApfSkpLCJtaWRkbGUiPT09ZSYmImNlbnRlciI9PT10JiZzLnB1c2goe3ZlcnRpY2FsQWxpZ246Im1pZGRsZSIsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLHRvcDpyLnRvcC1pLmhlaWdodC8yK3IuaGVpZ2h0LzIrdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OnIubGVmdC1pLndpZHRoLzIrci53aWR0aC8yK3RoaXMuaG9yaXpvbnRhbE9mZnNldH0pLGw9MDtsPHMubGVuZ3RoO2wrKyl7dmFyIGQ9c1tsXSxwPWQudmVydGljYWxBbGlnbj09PWUsZj1kLmhvcml6b250YWxBbGlnbj09PXQ7aWYoIXRoaXMuZHluYW1pY0FsaWduJiYhdGhpcy5ub092ZXJsYXAmJnAmJmYpe2E9ZDticmVha312YXIgbT0oIWV8fHApJiYoIXR8fGYpO2lmKHRoaXMuZHluYW1pY0FsaWdufHxtKXtpZihkLm9mZnNjcmVlbkFyZWE9dGhpcy5fX2dldE9mZnNjcmVlbkFyZWEoZCxuLG8pLDA9PT1kLm9mZnNjcmVlbkFyZWEmJm0pe2E9ZDticmVha312YXIgZz1kLm9mZnNjcmVlbkFyZWEtKGE9YXx8ZCkub2Zmc2NyZWVuQXJlYTsoZzwwfHwwPT09ZyYmKHB8fGYpKSYmKGE9ZCl9fXJldHVybiBhfX07Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNiBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwp2YXIgZmE9RWxlbWVudC5wcm90b3R5cGUsbWE9ZmEubWF0Y2hlc3x8ZmEubWF0Y2hlc1NlbGVjdG9yfHxmYS5tb3pNYXRjaGVzU2VsZWN0b3J8fGZhLm1zTWF0Y2hlc1NlbGVjdG9yfHxmYS5vTWF0Y2hlc1NlbGVjdG9yfHxmYS53ZWJraXRNYXRjaGVzU2VsZWN0b3I7Y29uc3QgZ2E9bmV3IGNsYXNze2dldFRhYmJhYmxlTm9kZXModCl7dmFyIGU9W107cmV0dXJuIHRoaXMuX2NvbGxlY3RUYWJiYWJsZU5vZGVzKHQsZSk/dGhpcy5fc29ydEJ5VGFiSW5kZXgoZSk6ZX1pc0ZvY3VzYWJsZSh0KXtyZXR1cm4gbWEuY2FsbCh0LCJpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYnV0dG9uLCBvYmplY3QiKT9tYS5jYWxsKHQsIjpub3QoW2Rpc2FibGVkXSkiKTptYS5jYWxsKHQsImFbaHJlZl0sIGFyZWFbaHJlZl0sIGlmcmFtZSwgW3RhYmluZGV4XSwgW2NvbnRlbnRFZGl0YWJsZV0iKX1pc1RhYmJhYmxlKHQpe3JldHVybiB0aGlzLmlzRm9jdXNhYmxlKHQpJiZtYS5jYWxsKHQsJzpub3QoW3RhYmluZGV4PSItMSJdKScpJiZ0aGlzLl9pc1Zpc2libGUodCl9X25vcm1hbGl6ZWRUYWJJbmRleCh0KXtpZih0aGlzLmlzRm9jdXNhYmxlKHQpKXt2YXIgZT10LmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKXx8MDtyZXR1cm4gTnVtYmVyKGUpfXJldHVybi0xfV9jb2xsZWN0VGFiYmFibGVOb2Rlcyh0LGUpe2lmKHQubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4hMTt2YXIgbj10O2lmKCF0aGlzLl9pc1Zpc2libGUobikpcmV0dXJuITE7dmFyIGkscj10aGlzLl9ub3JtYWxpemVkVGFiSW5kZXgobiksbz1yPjA7cj49MCYmZS5wdXNoKG4pLGk9ImNvbnRlbnQiPT09bi5sb2NhbE5hbWV8fCJzbG90Ij09PW4ubG9jYWxOYW1lP1lpKG4pLmdldERpc3RyaWJ1dGVkTm9kZXMoKTpZaShuLnJvb3R8fG4pLmNoaWxkcmVuO2Zvcih2YXIgYT0wO2E8aS5sZW5ndGg7YSsrKW89dGhpcy5fY29sbGVjdFRhYmJhYmxlTm9kZXMoaVthXSxlKXx8bztyZXR1cm4gb31faXNWaXNpYmxlKHQpe3ZhciBlPXQuc3R5bGU7cmV0dXJuImhpZGRlbiIhPT1lLnZpc2liaWxpdHkmJiJub25lIiE9PWUuZGlzcGxheSYmImhpZGRlbiIhPT0oZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KSkudmlzaWJpbGl0eSYmIm5vbmUiIT09ZS5kaXNwbGF5fV9zb3J0QnlUYWJJbmRleCh0KXt2YXIgZT10Lmxlbmd0aDtpZihlPDIpcmV0dXJuIHQ7dmFyIG49TWF0aC5jZWlsKGUvMiksaT10aGlzLl9zb3J0QnlUYWJJbmRleCh0LnNsaWNlKDAsbikpLHI9dGhpcy5fc29ydEJ5VGFiSW5kZXgodC5zbGljZShuKSk7cmV0dXJuIHRoaXMuX21lcmdlU29ydEJ5VGFiSW5kZXgoaSxyKX1fbWVyZ2VTb3J0QnlUYWJJbmRleCh0LGUpe2Zvcih2YXIgbj1bXTt0Lmxlbmd0aD4wJiZlLmxlbmd0aD4wOyl0aGlzLl9oYXNMb3dlclRhYk9yZGVyKHRbMF0sZVswXSk/bi5wdXNoKGUuc2hpZnQoKSk6bi5wdXNoKHQuc2hpZnQoKSk7cmV0dXJuIG4uY29uY2F0KHQsZSl9X2hhc0xvd2VyVGFiT3JkZXIodCxlKXt2YXIgbj1NYXRoLm1heCh0LnRhYkluZGV4LDApLGk9TWF0aC5tYXgoZS50YWJJbmRleCwwKTtyZXR1cm4gMD09PW58fDA9PT1pP2k+bjpuPml9fTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovUnIoe190ZW1wbGF0ZTpfZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLWJhY2tncm91bmQtY29sb3IsICMwMDApOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIEBhcHBseSAtLWlyb24tb3ZlcmxheS1iYWNrZHJvcDsKICAgICAgfQoKICAgICAgOmhvc3QoLm9wZW5lZCkgewogICAgICAgIG9wYWNpdHk6IHZhcigtLWlyb24tb3ZlcmxheS1iYWNrZHJvcC1vcGFjaXR5LCAwLjYpOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICAgIEBhcHBseSAtLWlyb24tb3ZlcmxheS1iYWNrZHJvcC1vcGVuZWQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgpgLGlzOiJpcm9uLW92ZXJsYXktYmFja2Ryb3AiLHByb3BlcnRpZXM6e29wZW5lZDp7cmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifX0sbGlzdGVuZXJzOnt0cmFuc2l0aW9uZW5kOiJfb25UcmFuc2l0aW9uZW5kIn0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX19vcGVuZWRSYWY9bnVsbH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5fb3BlbmVkQ2hhbmdlZCh0aGlzLm9wZW5lZCl9LHByZXBhcmU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmIXRoaXMucGFyZW50Tm9kZSYmWWkoZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQodGhpcyl9LG9wZW46ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMH0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMX0sY29tcGxldGU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZHx8dGhpcy5wYXJlbnROb2RlIT09ZG9jdW1lbnQuYm9keXx8WWkodGhpcy5wYXJlbnROb2RlKS5yZW1vdmVDaGlsZCh0aGlzKX0sX29uVHJhbnNpdGlvbmVuZDpmdW5jdGlvbih0KXt0JiZ0LnRhcmdldD09PXRoaXMmJnRoaXMuY29tcGxldGUoKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24odCl7aWYodCl0aGlzLnByZXBhcmUoKTtlbHNle3ZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpOyIwcyIhPT1lLnRyYW5zaXRpb25EdXJhdGlvbiYmMCE9ZS5vcGFjaXR5fHx0aGlzLmNvbXBsZXRlKCl9dGhpcy5pc0F0dGFjaGVkJiYodGhpcy5fX29wZW5lZFJhZiYmKHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fb3BlbmVkUmFmKSx0aGlzLl9fb3BlbmVkUmFmPW51bGwpLHRoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wLHRoaXMuX19vcGVuZWRSYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3RoaXMuX19vcGVuZWRSYWY9bnVsbCx0aGlzLnRvZ2dsZUNsYXNzKCJvcGVuZWQiLHRoaXMub3BlbmVkKX0uYmluZCh0aGlzKSkpfX0pO2NvbnN0IF9hPW5ldwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9vdmVybGF5cz1bXSx0aGlzLl9taW5pbXVtWj0xMDEsdGhpcy5fYmFja2Ryb3BFbGVtZW50PW51bGwsaWkoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCJ0YXAiLChmdW5jdGlvbigpe30pKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLHRoaXMuX29uQ2FwdHVyZUNsaWNrLmJpbmQodGhpcyksITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9vbkNhcHR1cmVGb2N1cy5iaW5kKHRoaXMpLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLl9vbkNhcHR1cmVLZXlEb3duLmJpbmQodGhpcyksITApfWdldCBiYWNrZHJvcEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fYmFja2Ryb3BFbGVtZW50fHwodGhpcy5fYmFja2Ryb3BFbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlyb24tb3ZlcmxheS1iYWNrZHJvcCIpKSx0aGlzLl9iYWNrZHJvcEVsZW1lbnR9Z2V0IGRlZXBBY3RpdmVFbGVtZW50KCl7dmFyIHQ9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtmb3IodCYmdCBpbnN0YW5jZW9mIEVsZW1lbnQhPTB8fCh0PWRvY3VtZW50LmJvZHkpO3Qucm9vdCYmWWkodC5yb290KS5hY3RpdmVFbGVtZW50Oyl0PVlpKHQucm9vdCkuYWN0aXZlRWxlbWVudDtyZXR1cm4gdH1fYnJpbmdPdmVybGF5QXRJbmRleFRvRnJvbnQodCl7dmFyIGU9dGhpcy5fb3ZlcmxheXNbdF07aWYoZSl7dmFyIG49dGhpcy5fb3ZlcmxheXMubGVuZ3RoLTEsaT10aGlzLl9vdmVybGF5c1tuXTtpZihpJiZ0aGlzLl9zaG91bGRCZUJlaGluZE92ZXJsYXkoZSxpKSYmbi0tLCEodD49bikpe3ZhciByPU1hdGgubWF4KHRoaXMuY3VycmVudE92ZXJsYXlaKCksdGhpcy5fbWluaW11bVopO2Zvcih0aGlzLl9nZXRaKGUpPD1yJiZ0aGlzLl9hcHBseU92ZXJsYXlaKGUscik7dDxuOyl0aGlzLl9vdmVybGF5c1t0XT10aGlzLl9vdmVybGF5c1t0KzFdLHQrKzt0aGlzLl9vdmVybGF5c1tuXT1lfX19YWRkT3JSZW1vdmVPdmVybGF5KHQpe3Qub3BlbmVkP3RoaXMuYWRkT3ZlcmxheSh0KTp0aGlzLnJlbW92ZU92ZXJsYXkodCl9YWRkT3ZlcmxheSh0KXt2YXIgZT10aGlzLl9vdmVybGF5cy5pbmRleE9mKHQpO2lmKGU+PTApcmV0dXJuIHRoaXMuX2JyaW5nT3ZlcmxheUF0SW5kZXhUb0Zyb250KGUpLHZvaWQgdGhpcy50cmFja0JhY2tkcm9wKCk7dmFyIG49dGhpcy5fb3ZlcmxheXMubGVuZ3RoLGk9dGhpcy5fb3ZlcmxheXNbbi0xXSxyPU1hdGgubWF4KHRoaXMuX2dldFooaSksdGhpcy5fbWluaW11bVopLG89dGhpcy5fZ2V0Wih0KTtpJiZ0aGlzLl9zaG91bGRCZUJlaGluZE92ZXJsYXkodCxpKSYmKHRoaXMuX2FwcGx5T3ZlcmxheVooaSxyKSxuLS0scj1NYXRoLm1heCh0aGlzLl9nZXRaKHRoaXMuX292ZXJsYXlzW24tMV0pLHRoaXMuX21pbmltdW1aKSksbzw9ciYmdGhpcy5fYXBwbHlPdmVybGF5Wih0LHIpLHRoaXMuX292ZXJsYXlzLnNwbGljZShuLDAsdCksdGhpcy50cmFja0JhY2tkcm9wKCl9cmVtb3ZlT3ZlcmxheSh0KXt2YXIgZT10aGlzLl9vdmVybGF5cy5pbmRleE9mKHQpOy0xIT09ZSYmKHRoaXMuX292ZXJsYXlzLnNwbGljZShlLDEpLHRoaXMudHJhY2tCYWNrZHJvcCgpKX1jdXJyZW50T3ZlcmxheSgpe3JldHVybiB0aGlzLl9vdmVybGF5c1t0aGlzLl9vdmVybGF5cy5sZW5ndGgtMV19Y3VycmVudE92ZXJsYXlaKCl7cmV0dXJuIHRoaXMuX2dldFoodGhpcy5jdXJyZW50T3ZlcmxheSgpKX1lbnN1cmVNaW5pbXVtWih0KXt0aGlzLl9taW5pbXVtWj1NYXRoLm1heCh0aGlzLl9taW5pbXVtWix0KX1mb2N1c092ZXJsYXkoKXt2YXIgdD10aGlzLmN1cnJlbnRPdmVybGF5KCk7dCYmdC5fYXBwbHlGb2N1cygpfXRyYWNrQmFja2Ryb3AoKXt2YXIgdD10aGlzLl9vdmVybGF5V2l0aEJhY2tkcm9wKCk7KHR8fHRoaXMuX2JhY2tkcm9wRWxlbWVudCkmJih0aGlzLmJhY2tkcm9wRWxlbWVudC5zdHlsZS56SW5kZXg9dGhpcy5fZ2V0Wih0KS0xLHRoaXMuYmFja2Ryb3BFbGVtZW50Lm9wZW5lZD0hIXQsdGhpcy5iYWNrZHJvcEVsZW1lbnQucHJlcGFyZSgpKX1nZXRCYWNrZHJvcHMoKXtmb3IodmFyIHQ9W10sZT0wO2U8dGhpcy5fb3ZlcmxheXMubGVuZ3RoO2UrKyl0aGlzLl9vdmVybGF5c1tlXS53aXRoQmFja2Ryb3AmJnQucHVzaCh0aGlzLl9vdmVybGF5c1tlXSk7cmV0dXJuIHR9YmFja2Ryb3BaKCl7cmV0dXJuIHRoaXMuX2dldFoodGhpcy5fb3ZlcmxheVdpdGhCYWNrZHJvcCgpKS0xfV9vdmVybGF5V2l0aEJhY2tkcm9wKCl7Zm9yKHZhciB0PXRoaXMuX292ZXJsYXlzLmxlbmd0aC0xO3Q+PTA7dC0tKWlmKHRoaXMuX292ZXJsYXlzW3RdLndpdGhCYWNrZHJvcClyZXR1cm4gdGhpcy5fb3ZlcmxheXNbdF19X2dldFoodCl7dmFyIGU9dGhpcy5fbWluaW11bVo7aWYodCl7dmFyIG49TnVtYmVyKHQuc3R5bGUuekluZGV4fHx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS56SW5kZXgpO249PW4mJihlPW4pfXJldHVybiBlfV9zZXRaKHQsZSl7dC5zdHlsZS56SW5kZXg9ZX1fYXBwbHlPdmVybGF5Wih0LGUpe3RoaXMuX3NldFoodCxlKzIpfV9vdmVybGF5SW5QYXRoKHQpe3Q9dHx8W107Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspaWYodFtlXS5fbWFuYWdlcj09PXRoaXMpcmV0dXJuIHRbZV19X29uQ2FwdHVyZUNsaWNrKHQpe3ZhciBlPXRoaXMuX292ZXJsYXlzLmxlbmd0aC0xO2lmKC0xIT09ZSlmb3IodmFyIG4saT1ZaSh0KS5wYXRoOyhuPXRoaXMuX292ZXJsYXlzW2VdKSYmdGhpcy5fb3ZlcmxheUluUGF0aChpKSE9PW4mJihuLl9vbkNhcHR1cmVDbGljayh0KSxuLmFsbG93Q2xpY2tUaHJvdWdoKTspZS0tfV9vbkNhcHR1cmVGb2N1cyh0KXt2YXIgZT10aGlzLmN1cnJlbnRPdmVybGF5KCk7ZSYmZS5fb25DYXB0dXJlRm9jdXModCl9X29uQ2FwdHVyZUtleURvd24odCl7dmFyIGU9dGhpcy5jdXJyZW50T3ZlcmxheSgpO2UmJih6by5rZXlib2FyZEV2ZW50TWF0Y2hlc0tleXModCwiZXNjIik/ZS5fb25DYXB0dXJlRXNjKHQpOnpvLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyh0LCJ0YWIiKSYmZS5fb25DYXB0dXJlVGFiKHQpKX1fc2hvdWxkQmVCZWhpbmRPdmVybGF5KHQsZSl7cmV0dXJuIXQuYWx3YXlzT25Ub3AmJmUuYWx3YXlzT25Ub3B9fTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovdmFyIHlhLHZhLGJhPXtwYWdlWDowLHBhZ2VZOjB9LHhhPW51bGwsd2E9W10sU2E9WyJ3aGVlbCIsIm1vdXNld2hlZWwiLCJET01Nb3VzZVNjcm9sbCIsInRvdWNoc3RhcnQiLCJ0b3VjaG1vdmUiXTtmdW5jdGlvbiBNYSh0KXtFYS5pbmRleE9mKHQpPj0wfHwoMD09PUVhLmxlbmd0aCYmKGZ1bmN0aW9uIGUoKXt5YT15YXx8VGEuYmluZCh2b2lkIDApO2Zvcih2YXIgdD0wLGU9U2EubGVuZ3RoO3Q8ZTt0KyspZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihTYVt0XSx5YSx7Y2FwdHVyZTohMCxwYXNzaXZlOiExfSl9KSgpLEVhLnB1c2godCksdmE9RWFbRWEubGVuZ3RoLTFdKX1jb25zdCBFYT1bXTtmdW5jdGlvbiBUYSh0KXtpZih0LmNhbmNlbGFibGUmJihmdW5jdGlvbiBlKHQpe3ZhciBlPVlpKHQpLnJvb3RUYXJnZXQ7aWYoInRvdWNobW92ZSIhPT10LnR5cGUmJnhhIT09ZSYmKHhhPWUsd2E9KGZ1bmN0aW9uIG4odCl7Zm9yKHZhciBlPVtdLG49dC5pbmRleE9mKHZhKSxpPTA7aTw9bjtpKyspaWYodFtpXS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKXt2YXIgcj10W2ldLG89ci5zdHlsZTsic2Nyb2xsIiE9PW8ub3ZlcmZsb3cmJiJhdXRvIiE9PW8ub3ZlcmZsb3cmJihvPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHIpKSwic2Nyb2xsIiE9PW8ub3ZlcmZsb3cmJiJhdXRvIiE9PW8ub3ZlcmZsb3d8fGUucHVzaChyKX1yZXR1cm4gZX0pKFlpKHQpLnBhdGgpKSwhd2EubGVuZ3RoKXJldHVybiEwO2lmKCJ0b3VjaHN0YXJ0Ij09PXQudHlwZSlyZXR1cm4hMTt2YXIgaT0oZnVuY3Rpb24gcih0KXt2YXIgZT17ZGVsdGFYOnQuZGVsdGFYLGRlbHRhWTp0LmRlbHRhWX07aWYoImRlbHRhWCJpbiB0KTtlbHNlIGlmKCJ3aGVlbERlbHRhWCJpbiB0JiYid2hlZWxEZWx0YVkiaW4gdCllLmRlbHRhWD0tdC53aGVlbERlbHRhWCxlLmRlbHRhWT0tdC53aGVlbERlbHRhWTtlbHNlIGlmKCJ3aGVlbERlbHRhImluIHQpZS5kZWx0YVg9MCxlLmRlbHRhWT0tdC53aGVlbERlbHRhO2Vsc2UgaWYoImF4aXMiaW4gdCllLmRlbHRhWD0xPT09dC5heGlzP3QuZGV0YWlsOjAsZS5kZWx0YVk9Mj09PXQuYXhpcz90LmRldGFpbDowO2Vsc2UgaWYodC50YXJnZXRUb3VjaGVzKXt2YXIgbj10LnRhcmdldFRvdWNoZXNbMF07ZS5kZWx0YVg9YmEucGFnZVgtbi5wYWdlWCxlLmRlbHRhWT1iYS5wYWdlWS1uLnBhZ2VZfXJldHVybiBlfQovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8pKHQpO3JldHVybiEoZnVuY3Rpb24gbyh0LGUsbil7aWYoZXx8bilmb3IodmFyIGk9TWF0aC5hYnMobik+PU1hdGguYWJzKGUpLHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG89dFtyXTtpZihpP248MD9vLnNjcm9sbFRvcD4wOm8uc2Nyb2xsVG9wPG8uc2Nyb2xsSGVpZ2h0LW8uY2xpZW50SGVpZ2h0OmU8MD9vLnNjcm9sbExlZnQ+MDpvLnNjcm9sbExlZnQ8by5zY3JvbGxXaWR0aC1vLmNsaWVudFdpZHRoKXJldHVybiBvfX0pKHdhLGkuZGVsdGFYLGkuZGVsdGFZKX0pKHQpJiZ0LnByZXZlbnREZWZhdWx0KCksdC50YXJnZXRUb3VjaGVzKXt2YXIgbj10LnRhcmdldFRvdWNoZXNbMF07YmEucGFnZVg9bi5wYWdlWCxiYS5wYWdlWT1uLnBhZ2VZfX1jb25zdCBDYT17cHJvcGVydGllczp7b3BlbmVkOntvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQiLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LGNhbmNlbGVkOntvYnNlcnZlcjoiX2NhbmNlbGVkQ2hhbmdlZCIscmVhZE9ubHk6ITAsdHlwZTpCb29sZWFuLHZhbHVlOiExfSx3aXRoQmFja2Ryb3A6e29ic2VydmVyOiJfd2l0aEJhY2tkcm9wQ2hhbmdlZCIsdHlwZTpCb29sZWFufSxub0F1dG9Gb2N1czp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0NhbmNlbE9uRXNjS2V5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sY2xvc2luZ1JlYXNvbjp7dHlwZTpPYmplY3R9LHJlc3RvcmVGb2N1c09uQ2xvc2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYWxsb3dDbGlja1Rocm91Z2g6e3R5cGU6Qm9vbGVhbn0sYWx3YXlzT25Ub3A6e3R5cGU6Qm9vbGVhbn0sc2Nyb2xsQWN0aW9uOnt0eXBlOlN0cmluZ30sX21hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOl9hfSxfZm9jdXNlZENoaWxkOnt0eXBlOk9iamVjdH19LGxpc3RlbmVyczp7Imlyb24tcmVzaXplIjoiX29uSXJvblJlc2l6ZSJ9LG9ic2VydmVyczpbIl9fdXBkYXRlU2Nyb2xsT2JzZXJ2ZXJzKGlzQXR0YWNoZWQsIG9wZW5lZCwgc2Nyb2xsQWN0aW9uKSJdLGdldCBiYWNrZHJvcEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fbWFuYWdlci5iYWNrZHJvcEVsZW1lbnR9LGdldCBfZm9jdXNOb2RlKCl7cmV0dXJuIHRoaXMuX2ZvY3VzZWRDaGlsZHx8WWkodGhpcykucXVlcnlTZWxlY3RvcigiW2F1dG9mb2N1c10iKXx8dGhpc30sZ2V0IF9mb2N1c2FibGVOb2Rlcygpe3JldHVybiBnYS5nZXRUYWJiYWJsZU5vZGVzKHRoaXMpfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX19pc0FuaW1hdGluZz0hMSx0aGlzLl9fc2hvdWxkUmVtb3ZlVGFiSW5kZXg9ITEsdGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZT10aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGU9bnVsbCx0aGlzLl9fcmFmcz17fSx0aGlzLl9fcmVzdG9yZUZvY3VzTm9kZT1udWxsLHRoaXMuX19zY3JvbGxUb3A9dGhpcy5fX3Njcm9sbExlZnQ9bnVsbCx0aGlzLl9fb25DYXB0dXJlU2Nyb2xsPXRoaXMuX19vbkNhcHR1cmVTY3JvbGwuYmluZCh0aGlzKSx0aGlzLl9fcm9vdE5vZGVzPW51bGwsdGhpcy5fZW5zdXJlU2V0dXAoKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5fb3BlbmVkQ2hhbmdlZCh0aGlzLm9wZW5lZCksdGhpcy5fb2JzZXJ2ZXI9WWkodGhpcykub2JzZXJ2ZU5vZGVzKHRoaXMuX29uTm9kZXNDaGFuZ2UpfSxkZXRhY2hlZDpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLl9vYnNlcnZlciYmWWkodGhpcykudW5vYnNlcnZlTm9kZXModGhpcy5fb2JzZXJ2ZXIpLHRoaXMuX29ic2VydmVyPW51bGwsdGhpcy5fX3JhZnMpbnVsbCE9PXRoaXMuX19yYWZzW3RdJiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fcmFmc1t0XSk7dGhpcy5fX3JhZnM9e30sdGhpcy5fbWFuYWdlci5yZW1vdmVPdmVybGF5KHRoaXMpLHRoaXMuX19pc0FuaW1hdGluZyYmKHRoaXMub3BlbmVkP3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOih0aGlzLl9hcHBseUZvY3VzKCksdGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCkpKX0sdG9nZ2xlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Q2FuY2VsZWQoITEpLHRoaXMub3BlbmVkPSF0aGlzLm9wZW5lZH0sb3BlbjpmdW5jdGlvbigpe3RoaXMuX3NldENhbmNlbGVkKCExKSx0aGlzLm9wZW5lZD0hMH0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLl9zZXRDYW5jZWxlZCghMSksdGhpcy5vcGVuZWQ9ITF9LGNhbmNlbDpmdW5jdGlvbih0KXt0aGlzLmZpcmUoImlyb24tb3ZlcmxheS1jYW5jZWxlZCIsdCx7Y2FuY2VsYWJsZTohMH0pLmRlZmF1bHRQcmV2ZW50ZWR8fCh0aGlzLl9zZXRDYW5jZWxlZCghMCksdGhpcy5vcGVuZWQ9ITEpfSxpbnZhbGlkYXRlVGFiYmFibGVzOmZ1bmN0aW9uKCl7dGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZT10aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGU9bnVsbH0sX2Vuc3VyZVNldHVwOmZ1bmN0aW9uKCl7dGhpcy5fb3ZlcmxheVNldHVwfHwodGhpcy5fb3ZlcmxheVNldHVwPSEwLHRoaXMuc3R5bGUub3V0bGluZT0ibm9uZSIsdGhpcy5zdHlsZS5kaXNwbGF5PSJub25lIil9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKHQpe3Q/dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIik6dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpLHRoaXMuaXNBdHRhY2hlZCYmKHRoaXMuX19pc0FuaW1hdGluZz0hMCx0aGlzLl9fZGVyYWYoIl9fb3BlbmVkQ2hhbmdlZCIsdGhpcy5fX29wZW5lZENoYW5nZWQpKX0sX2NhbmNlbGVkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuY2xvc2luZ1JlYXNvbj10aGlzLmNsb3NpbmdSZWFzb258fHt9LHRoaXMuY2xvc2luZ1JlYXNvbi5jYW5jZWxlZD10aGlzLmNhbmNlbGVkfSxfd2l0aEJhY2tkcm9wQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMud2l0aEJhY2tkcm9wJiYhdGhpcy5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iik/KHRoaXMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIi0xIiksdGhpcy5fX3Nob3VsZFJlbW92ZVRhYkluZGV4PSEwKTp0aGlzLl9fc2hvdWxkUmVtb3ZlVGFiSW5kZXgmJih0aGlzLnJlbW92ZUF0dHJpYnV0ZSgidGFiaW5kZXgiKSx0aGlzLl9fc2hvdWxkUmVtb3ZlVGFiSW5kZXg9ITEpLHRoaXMub3BlbmVkJiZ0aGlzLmlzQXR0YWNoZWQmJnRoaXMuX21hbmFnZXIudHJhY2tCYWNrZHJvcCgpfSxfcHJlcGFyZVJlbmRlck9wZW5lZDpmdW5jdGlvbigpe3RoaXMuX19yZXN0b3JlRm9jdXNOb2RlPXRoaXMuX21hbmFnZXIuZGVlcEFjdGl2ZUVsZW1lbnQsdGhpcy5fcHJlcGFyZVBvc2l0aW9uaW5nKCksdGhpcy5yZWZpdCgpLHRoaXMuX2ZpbmlzaFBvc2l0aW9uaW5nKCksdGhpcy5ub0F1dG9Gb2N1cyYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PXRoaXMuX2ZvY3VzTm9kZSYmKHRoaXMuX2ZvY3VzTm9kZS5ibHVyKCksdGhpcy5fX3Jlc3RvcmVGb2N1c05vZGUuZm9jdXMoKSl9LF9yZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLl9maW5pc2hSZW5kZXJPcGVuZWQoKX0sX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpe3RoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpfSxfZmluaXNoUmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5ub3RpZnlSZXNpemUoKSx0aGlzLl9faXNBbmltYXRpbmc9ITEsdGhpcy5maXJlKCJpcm9uLW92ZXJsYXktb3BlbmVkIil9LF9maW5pc2hSZW5kZXJDbG9zZWQ6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuc3R5bGUuekluZGV4PSIiLHRoaXMubm90aWZ5UmVzaXplKCksdGhpcy5fX2lzQW5pbWF0aW5nPSExLHRoaXMuZmlyZSgiaXJvbi1vdmVybGF5LWNsb3NlZCIsdGhpcy5jbG9zaW5nUmVhc29uKX0sX3ByZXBhcmVQb3NpdGlvbmluZzpmdW5jdGlvbigpe3RoaXMuc3R5bGUudHJhbnNpdGlvbj10aGlzLnN0eWxlLndlYmtpdFRyYW5zaXRpb249Im5vbmUiLHRoaXMuc3R5bGUudHJhbnNmb3JtPXRoaXMuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJub25lIix0aGlzLnN0eWxlLmRpc3BsYXk9IiJ9LF9maW5pc2hQb3NpdGlvbmluZzpmdW5jdGlvbigpe3RoaXMuc3R5bGUuZGlzcGxheT0ibm9uZSIsdGhpcy5zY3JvbGxUb3A9dGhpcy5zY3JvbGxUb3AsdGhpcy5zdHlsZS50cmFuc2l0aW9uPXRoaXMuc3R5bGUud2Via2l0VHJhbnNpdGlvbj0iIix0aGlzLnN0eWxlLnRyYW5zZm9ybT10aGlzLnN0eWxlLndlYmtpdFRyYW5zZm9ybT0iIix0aGlzLnN0eWxlLmRpc3BsYXk9IiIsdGhpcy5zY3JvbGxUb3A9dGhpcy5zY3JvbGxUb3B9LF9hcHBseUZvY3VzOmZ1bmN0aW9uKCl7aWYodGhpcy5vcGVuZWQpdGhpcy5ub0F1dG9Gb2N1c3x8dGhpcy5fZm9jdXNOb2RlLmZvY3VzKCk7ZWxzZXtpZih0aGlzLnJlc3RvcmVGb2N1c09uQ2xvc2UmJnRoaXMuX19yZXN0b3JlRm9jdXNOb2RlKXt2YXIgdD10aGlzLl9tYW5hZ2VyLmRlZXBBY3RpdmVFbGVtZW50Oyh0PT09ZG9jdW1lbnQuYm9keXx8QWEodGhpcyx0KSkmJnRoaXMuX19yZXN0b3JlRm9jdXNOb2RlLmZvY3VzKCl9dGhpcy5fX3Jlc3RvcmVGb2N1c05vZGU9bnVsbCx0aGlzLl9mb2N1c05vZGUuYmx1cigpLHRoaXMuX2ZvY3VzZWRDaGlsZD1udWxsfX0sX29uQ2FwdHVyZUNsaWNrOmZ1bmN0aW9uKHQpe3RoaXMubm9DYW5jZWxPbk91dHNpZGVDbGlja3x8dGhpcy5jYW5jZWwodCl9LF9vbkNhcHR1cmVGb2N1czpmdW5jdGlvbih0KXtpZih0aGlzLndpdGhCYWNrZHJvcCl7dmFyIGU9WWkodCkucGF0aDstMT09PWUuaW5kZXhPZih0aGlzKT8odC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLl9hcHBseUZvY3VzKCkpOnRoaXMuX2ZvY3VzZWRDaGlsZD1lWzBdfX0sX29uQ2FwdHVyZUVzYzpmdW5jdGlvbih0KXt0aGlzLm5vQ2FuY2VsT25Fc2NLZXl8fHRoaXMuY2FuY2VsKHQpfSxfb25DYXB0dXJlVGFiOmZ1bmN0aW9uKHQpe2lmKHRoaXMud2l0aEJhY2tkcm9wKXt0aGlzLl9fZW5zdXJlRmlyc3RMYXN0Rm9jdXNhYmxlcygpO3ZhciBlPXQuc2hpZnRLZXksbj1lP3RoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU6dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlLGk9ZT90aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGU6dGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZSxyPSExO2lmKG49PT1pKXI9ITA7ZWxzZXt2YXIgbz10aGlzLl9tYW5hZ2VyLmRlZXBBY3RpdmVFbGVtZW50O3I9bz09PW58fG89PT10aGlzfXImJih0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fZm9jdXNlZENoaWxkPWksdGhpcy5fYXBwbHlGb2N1cygpKX19LF9vbklyb25SZXNpemU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmIXRoaXMuX19pc0FuaW1hdGluZyYmdGhpcy5fX2RlcmFmKCJyZWZpdCIsdGhpcy5yZWZpdCl9LF9vbk5vZGVzQ2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQmJiF0aGlzLl9faXNBbmltYXRpbmcmJih0aGlzLmludmFsaWRhdGVUYWJiYWJsZXMoKSx0aGlzLm5vdGlmeVJlc2l6ZSgpKX0sX19lbnN1cmVGaXJzdExhc3RGb2N1c2FibGVzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZm9jdXNhYmxlTm9kZXM7dGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZT10WzBdLHRoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZT10W3QubGVuZ3RoLTFdfSxfX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD8odGhpcy5fcHJlcGFyZVJlbmRlck9wZW5lZCgpLHRoaXMuX21hbmFnZXIuYWRkT3ZlcmxheSh0aGlzKSx0aGlzLl9hcHBseUZvY3VzKCksdGhpcy5fcmVuZGVyT3BlbmVkKCkpOih0aGlzLl9tYW5hZ2VyLnJlbW92ZU92ZXJsYXkodGhpcyksdGhpcy5fYXBwbHlGb2N1cygpLHRoaXMuX3JlbmRlckNsb3NlZCgpKX0sX19kZXJhZjpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX19yYWZzO251bGwhPT1uW3RdJiZjYW5jZWxBbmltYXRpb25GcmFtZShuW3RdKSxuW3RdPXJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiBpKCl7blt0XT1udWxsLGUuY2FsbCh0aGlzKX0uYmluZCh0aGlzKSl9LF9fdXBkYXRlU2Nyb2xsT2JzZXJ2ZXJzOmZ1bmN0aW9uKHQsZSxuKXt0JiZlJiZ0aGlzLl9faXNWYWxpZFNjcm9sbEFjdGlvbihuKT8oImxvY2siPT09biYmKHRoaXMuX19zYXZlU2Nyb2xsUG9zaXRpb24oKSxNYSh0aGlzKSksdGhpcy5fX2FkZFNjcm9sbExpc3RlbmVycygpKTooKGZ1bmN0aW9uIGkodCl7dmFyIGU9RWEuaW5kZXhPZih0KTstMSE9PWUmJihFYS5zcGxpY2UoZSwxKSx2YT1FYVtFYS5sZW5ndGgtMV0sMD09PUVhLmxlbmd0aCYmKGZ1bmN0aW9uIG4oKXtmb3IodmFyIHQ9MCxlPVNhLmxlbmd0aDt0PGU7dCsrKWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoU2FbdF0seWEse2NhcHR1cmU6ITAscGFzc2l2ZTohMX0pfSkoKSl9KSh0aGlzKSx0aGlzLl9fcmVtb3ZlU2Nyb2xsTGlzdGVuZXJzKCkpfSxfX2FkZFNjcm9sbExpc3RlbmVyczpmdW5jdGlvbigpe2lmKCF0aGlzLl9fcm9vdE5vZGVzKXtpZih0aGlzLl9fcm9vdE5vZGVzPVtdLG0pZm9yKHZhciB0PXRoaXM7dDspdC5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSYmdC5ob3N0JiZ0aGlzLl9fcm9vdE5vZGVzLnB1c2godCksdD10Lmhvc3R8fHQuYXNzaWduZWRTbG90fHx0LnBhcmVudE5vZGU7dGhpcy5fX3Jvb3ROb2Rlcy5wdXNoKGRvY3VtZW50KX10aGlzLl9fcm9vdE5vZGVzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9fb25DYXB0dXJlU2Nyb2xsLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITB9KX0pLHRoaXMpfSxfX3JlbW92ZVNjcm9sbExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuX19yb290Tm9kZXMmJnRoaXMuX19yb290Tm9kZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuX19vbkNhcHR1cmVTY3JvbGwse2NhcHR1cmU6ITAscGFzc2l2ZTohMH0pfSksdGhpcyksdGhpcy5pc0F0dGFjaGVkfHwodGhpcy5fX3Jvb3ROb2Rlcz1udWxsKX0sX19pc1ZhbGlkU2Nyb2xsQWN0aW9uOmZ1bmN0aW9uKHQpe3JldHVybiJsb2NrIj09PXR8fCJyZWZpdCI9PT10fHwiY2FuY2VsIj09PXR9LF9fb25DYXB0dXJlU2Nyb2xsOmZ1bmN0aW9uKHQpe2lmKCEodGhpcy5fX2lzQW5pbWF0aW5nfHxZaSh0KS5wYXRoLmluZGV4T2YodGhpcyk+PTApKXN3aXRjaCh0aGlzLnNjcm9sbEFjdGlvbil7Y2FzZSJsb2NrIjp0aGlzLl9fcmVzdG9yZVNjcm9sbFBvc2l0aW9uKCk7YnJlYWs7Y2FzZSJyZWZpdCI6dGhpcy5fX2RlcmFmKCJyZWZpdCIsdGhpcy5yZWZpdCk7YnJlYWs7Y2FzZSJjYW5jZWwiOnRoaXMuY2FuY2VsKHQpfX0sX19zYXZlU2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXtkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50Pyh0aGlzLl9fc2Nyb2xsVG9wPWRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsVG9wLHRoaXMuX19zY3JvbGxMZWZ0PWRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsTGVmdCk6KHRoaXMuX19zY3JvbGxUb3A9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCxkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCksdGhpcy5fX3Njcm9sbExlZnQ9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0KSl9LF9fcmVzdG9yZVNjcm9sbFBvc2l0aW9uOmZ1bmN0aW9uKCl7ZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudD8oZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudC5zY3JvbGxUb3A9dGhpcy5fX3Njcm9sbFRvcCxkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbExlZnQ9dGhpcy5fX3Njcm9sbExlZnQpOihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wPWRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wPXRoaXMuX19zY3JvbGxUb3AsZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ9ZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0PXRoaXMuX19zY3JvbGxMZWZ0KX19LEFhPSh0LGUpPT57Zm9yKGxldCBpPWU7aTtpPShuPWkpLmFzc2lnbmVkU2xvdHx8bi5wYXJlbnROb2RlfHxuLmhvc3QpaWYoaT09PXQpcmV0dXJuITA7dmFyIG47cmV0dXJuITF9LGthPVtwYSxnbyxDYV0sTGE9e2hvc3RBdHRyaWJ1dGVzOntyb2xlOiJkaWFsb2ciLHRhYmluZGV4OiItMSJ9LHByb3BlcnRpZXM6e21vZGFsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9fcmVhZGllZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sb2JzZXJ2ZXJzOlsiX21vZGFsQ2hhbmdlZChtb2RhbCwgX19yZWFkaWVkKSJdLGxpc3RlbmVyczp7dGFwOiJfb25EaWFsb2dDbGljayJ9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fX3ByZXZOb0NhbmNlbE9uT3V0c2lkZUNsaWNrPXRoaXMubm9DYW5jZWxPbk91dHNpZGVDbGljayx0aGlzLl9fcHJldk5vQ2FuY2VsT25Fc2NLZXk9dGhpcy5ub0NhbmNlbE9uRXNjS2V5LHRoaXMuX19wcmV2V2l0aEJhY2tkcm9wPXRoaXMud2l0aEJhY2tkcm9wLHRoaXMuX19yZWFkaWVkPSEwfSxfbW9kYWxDaGFuZ2VkOmZ1bmN0aW9uKHQsZSl7ZSYmKHQ/KHRoaXMuX19wcmV2Tm9DYW5jZWxPbk91dHNpZGVDbGljaz10aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2ssdGhpcy5fX3ByZXZOb0NhbmNlbE9uRXNjS2V5PXRoaXMubm9DYW5jZWxPbkVzY0tleSx0aGlzLl9fcHJldldpdGhCYWNrZHJvcD10aGlzLndpdGhCYWNrZHJvcCx0aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s9ITAsdGhpcy5ub0NhbmNlbE9uRXNjS2V5PSEwLHRoaXMud2l0aEJhY2tkcm9wPSEwKToodGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrPXRoaXMubm9DYW5jZWxPbk91dHNpZGVDbGljayYmdGhpcy5fX3ByZXZOb0NhbmNlbE9uT3V0c2lkZUNsaWNrLHRoaXMubm9DYW5jZWxPbkVzY0tleT10aGlzLm5vQ2FuY2VsT25Fc2NLZXkmJnRoaXMuX19wcmV2Tm9DYW5jZWxPbkVzY0tleSx0aGlzLndpdGhCYWNrZHJvcD10aGlzLndpdGhCYWNrZHJvcCYmdGhpcy5fX3ByZXZXaXRoQmFja2Ryb3ApKX0sX3VwZGF0ZUNsb3NpbmdSZWFzb25Db25maXJtZWQ6ZnVuY3Rpb24odCl7dGhpcy5jbG9zaW5nUmVhc29uPXRoaXMuY2xvc2luZ1JlYXNvbnx8e30sdGhpcy5jbG9zaW5nUmVhc29uLmNvbmZpcm1lZD10fSxfb25EaWFsb2dDbGljazpmdW5jdGlvbih0KXtmb3IodmFyIGU9WWkodCkucGF0aCxuPTAsaT1lLmluZGV4T2YodGhpcyk7bjxpO24rKyl7dmFyIHI9ZVtuXTtpZihyLmhhc0F0dHJpYnV0ZSYmKHIuaGFzQXR0cmlidXRlKCJkaWFsb2ctZGlzbWlzcyIpfHxyLmhhc0F0dHJpYnV0ZSgiZGlhbG9nLWNvbmZpcm0iKSkpe3RoaXMuX3VwZGF0ZUNsb3NpbmdSZWFzb25Db25maXJtZWQoci5oYXNBdHRyaWJ1dGUoImRpYWxvZy1jb25maXJtIikpLHRoaXMuY2xvc2UoKSx0LnN0b3BQcm9wYWdhdGlvbigpO2JyZWFrfX19fSxQYT1ba2EsTGFdOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KaWYoCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpScih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlPgoKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIEBhcHBseSAtLWxheW91dC1yZWxhdGl2ZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmlzLXNjcm9sbGVkOm5vdCg6Zmlyc3QtY2hpbGQpKTo6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgaGVpZ2h0OiAxcHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGl2aWRlci1jb2xvcik7CiAgICAgIH0KCiAgICAgIDpob3N0KC5jYW4tc2Nyb2xsOm5vdCguc2Nyb2xsZWQtdG8tYm90dG9tKTpub3QoOmxhc3QtY2hpbGQpKTo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBoZWlnaHQ6IDFweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1kaXZpZGVyLWNvbG9yKTsKICAgICAgfQoKICAgICAgLnNjcm9sbGFibGUgewogICAgICAgIHBhZGRpbmc6IDAgMjRweDsKCiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXNjcm9sbDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kaWFsb2ctc2Nyb2xsYWJsZTsKICAgICAgfQoKICAgICAgLmZpdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZpdDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJzY3JvbGxhYmxlIiBjbGFzcz0ic2Nyb2xsYWJsZSIgb24tc2Nyb2xsPSJ1cGRhdGVTY3JvbGxTdGF0ZSI+CiAgICAgIDxzbG90Pjwvc2xvdD4KICAgIDwvZGl2PgpgLGlzOiJwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZSIscHJvcGVydGllczp7ZGlhbG9nRWxlbWVudDp7dHlwZTpPYmplY3R9fSxnZXQgc2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXMuJC5zY3JvbGxhYmxlfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX2Vuc3VyZVRhcmdldCgpLHRoaXMuY2xhc3NMaXN0LmFkZCgibm8tcGFkZGluZyIpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2Vuc3VyZVRhcmdldCgpLHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnVwZGF0ZVNjcm9sbFN0YXRlLmJpbmQodGhpcykpfSx1cGRhdGVTY3JvbGxTdGF0ZTpmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ2xhc3MoImlzLXNjcm9sbGVkIix0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A+MCksdGhpcy50b2dnbGVDbGFzcygiY2FuLXNjcm9sbCIsdGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0SGVpZ2h0PHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbEhlaWdodCksdGhpcy50b2dnbGVDbGFzcygic2Nyb2xsZWQtdG8tYm90dG9tIix0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3ArdGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0SGVpZ2h0Pj10aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxIZWlnaHQpfSxfZW5zdXJlVGFyZ2V0OmZ1bmN0aW9uKCl7dGhpcy5kaWFsb2dFbGVtZW50PXRoaXMuZGlhbG9nRWxlbWVudHx8dGhpcy5wYXJlbnRFbGVtZW50LHRoaXMuZGlhbG9nRWxlbWVudCYmdGhpcy5kaWFsb2dFbGVtZW50LmJlaGF2aW9ycyYmdGhpcy5kaWFsb2dFbGVtZW50LmJlaGF2aW9ycy5pbmRleE9mKExhKT49MD8odGhpcy5kaWFsb2dFbGVtZW50LnNpemluZ1RhcmdldD10aGlzLnNjcm9sbFRhcmdldCx0aGlzLnNjcm9sbFRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCJmaXQiKSk6dGhpcy5kaWFsb2dFbGVtZW50JiZ0aGlzLnNjcm9sbFRhcmdldC5jbGFzc0xpc3QuYWRkKCJmaXQiKX19KSwhd2luZG93LnBvbHltZXJTa2lwTG9hZGluZ0ZvbnRSb2JvdG8pe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpO3QucmVsPSJzdHlsZXNoZWV0Iix0LnR5cGU9InRleHQvY3NzIix0LmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiLHQuaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bytNb25vOjQwMCw3MDB8Um9ib3RvOjQwMCwzMDAsMzAwaXRhbGljLDQwMGl0YWxpYyw1MDAsNTAwaXRhbGljLDcwMCw3MDBpdGFsaWMiLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodCl9Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL2NvbnN0IE5hPV9lYDxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CgogICAgICAvKiBTaGFyZWQgU3R5bGVzICovCiAgICAgIC0tcGFwZXItZm9udC1jb21tb24tYmFzZTogewogICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvJywgJ05vdG8nLCBzYW5zLXNlcmlmOwogICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWNvbW1vbi1jb2RlOiB7CiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubycsICdDb25zb2xhcycsICdNZW5sbycsIG1vbm9zcGFjZTsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb21tb24tZXhwZW5zaXZlLWtlcm5pbmc6IHsKICAgICAgICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA6IHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH07CgogICAgICAvKiBNYXRlcmlhbCBGb250IFN0eWxlcyAqLwoKICAgICAgLS1wYXBlci1mb250LWRpc3BsYXk0OiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMTEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDMwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLS4wNDRlbTsKICAgICAgICBsaW5lLWhlaWdodDogMTIwcHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtZGlzcGxheTM6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiA1NnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDI2ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDYwcHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtZGlzcGxheTI6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDQ1cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLS4wMThlbTsKICAgICAgICBsaW5lLWhlaWdodDogNDhweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1kaXNwbGF5MTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogMzRweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtLjAxZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDQwcHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtaGVhZGxpbmU6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDI0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLS4wMTJlbTsKICAgICAgICBsaW5lLWhlaWdodDogMzJweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC10aXRsZTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDIwcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjhweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1zdWJoZWFkOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtYm9keTI6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjRweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1ib2R5MTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWNhcHRpb246IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDExZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtbWVudTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjRweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1idXR0b246IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDE4ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb2RlMjogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWNvZGU7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNzAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWNvZGUxOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tY29kZTsKCiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgIH07CgogICAgfQoKICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT5gO05hLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJkaXNwbGF5OiBub25lOyIpLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoTmEuY29udGVudCk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBJYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpO0lhLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJkaXNwbGF5OiBub25lOyIpLElhLmlubmVySFRNTD0nPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWRpYWxvZy1zaGFyZWQtc3R5bGVzIj5cbiAgPHRlbXBsYXRlPlxuICAgIDxzdHlsZT5cbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIG1hcmdpbjogMjRweCA0MHB4O1xuXG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLWRpYWxvZy1iYWNrZ3JvdW5kLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3IpKTtcbiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWRpYWxvZy1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7XG5cbiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1ib2R5MTtcbiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0xNmRwO1xuICAgICAgICBAYXBwbHkgLS1wYXBlci1kaWFsb2c7XG4gICAgICB9XG5cbiAgICAgIDpob3N0ID4gOjpzbG90dGVkKCopIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMjBweDtcbiAgICAgICAgcGFkZGluZzogMCAyNHB4O1xuICAgICAgfVxuXG4gICAgICA6aG9zdCA+IDo6c2xvdHRlZCgubm8tcGFkZGluZykge1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgfVxuXG4gICAgICBcbiAgICAgIDpob3N0ID4gOjpzbG90dGVkKCo6Zmlyc3QtY2hpbGQpIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMjRweDtcbiAgICAgIH1cblxuICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKjpsYXN0LWNoaWxkKSB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7XG4gICAgICB9XG5cbiAgICAgIC8qIEluIDEueCwgdGhpcyBzZWxlY3RvciB3YXMgYDpob3N0ID4gOjpjb250ZW50IGgyYC4gSW4gMi54IDxzbG90PiBhbGxvd3NcbiAgICAgIHRvIHNlbGVjdCBkaXJlY3QgY2hpbGRyZW4gb25seSwgd2hpY2ggaW5jcmVhc2VzIHRoZSB3ZWlnaHQgb2YgdGhpc1xuICAgICAgc2VsZWN0b3IsIHNvIHdlIGhhdmUgdG8gcmUtZGVmaW5lIGZpcnN0LWNoaWxkL2xhc3QtY2hpbGQgbWFyZ2lucyBiZWxvdy4gKi9cbiAgICAgIDpob3N0ID4gOjpzbG90dGVkKGgyKSB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgbWFyZ2luOiAwO1xuXG4gICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtdGl0bGU7XG4gICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy10aXRsZTtcbiAgICAgIH1cblxuICAgICAgLyogQXBwbHkgbWl4aW4gYWdhaW4sIGluIGNhc2UgaXQgc2V0cyBtYXJnaW4tdG9wLiAqL1xuICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoaDI6Zmlyc3QtY2hpbGQpIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMjRweDtcbiAgICAgICAgQGFwcGx5IC0tcGFwZXItZGlhbG9nLXRpdGxlO1xuICAgICAgfVxuXG4gICAgICAvKiBBcHBseSBtaXhpbiBhZ2FpbiwgaW4gY2FzZSBpdCBzZXRzIG1hcmdpbi1ib3R0b20uICovXG4gICAgICA6aG9zdCA+IDo6c2xvdHRlZChoMjpsYXN0LWNoaWxkKSB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7XG4gICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy10aXRsZTtcbiAgICAgIH1cblxuICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoLnBhcGVyLWRpYWxvZy1idXR0b25zKSxcbiAgICAgIDpob3N0ID4gOjpzbG90dGVkKC5idXR0b25zKSB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgcGFkZGluZzogOHB4IDhweCA4cHggMjRweDtcbiAgICAgICAgbWFyZ2luOiAwO1xuXG4gICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1kaWFsb2ctYnV0dG9uLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7XG5cbiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7XG4gICAgICAgIEBhcHBseSAtLWxheW91dC1lbmQtanVzdGlmaWVkO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gIDwvdGVtcGxhdGU+XG48L2RvbS1tb2R1bGU+Jyxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKElhLmNvbnRlbnQpOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgUmE9W3twcm9wZXJ0aWVzOnthbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0fSxlbnRyeUFuaW1hdGlvbjp7b2JzZXJ2ZXI6Il9lbnRyeUFuaW1hdGlvbkNoYW5nZWQiLHR5cGU6U3RyaW5nfSxleGl0QW5pbWF0aW9uOntvYnNlcnZlcjoiX2V4aXRBbmltYXRpb25DaGFuZ2VkIix0eXBlOlN0cmluZ319LF9lbnRyeUFuaW1hdGlvbkNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmFuaW1hdGlvbkNvbmZpZz10aGlzLmFuaW1hdGlvbkNvbmZpZ3x8e30sdGhpcy5hbmltYXRpb25Db25maWcuZW50cnk9W3tuYW1lOnRoaXMuZW50cnlBbmltYXRpb24sbm9kZTp0aGlzfV19LF9leGl0QW5pbWF0aW9uQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuYW5pbWF0aW9uQ29uZmlnPXRoaXMuYW5pbWF0aW9uQ29uZmlnfHx7fSx0aGlzLmFuaW1hdGlvbkNvbmZpZy5leGl0PVt7bmFtZTp0aGlzLmV4aXRBbmltYXRpb24sbm9kZTp0aGlzfV19LF9jb3B5UHJvcGVydGllczpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKXRbbl09ZVtuXX0sX2Nsb25lQ29uZmlnOmZ1bmN0aW9uKHQpe3ZhciBlPXtpc0Nsb25lOiEwfTtyZXR1cm4gdGhpcy5fY29weVByb3BlcnRpZXMoZSx0KSxlfSxfZ2V0QW5pbWF0aW9uQ29uZmlnUmVjdXJzaXZlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaTtpZih0aGlzLmFuaW1hdGlvbkNvbmZpZylpZih0aGlzLmFuaW1hdGlvbkNvbmZpZy52YWx1ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuYW5pbWF0aW9uQ29uZmlnLnZhbHVlKXRoaXMuX3dhcm4odGhpcy5fbG9nZigicGxheUFuaW1hdGlvbiIsIlBsZWFzZSBwdXQgJ2FuaW1hdGlvbkNvbmZpZycgaW5zaWRlIG9mIHlvdXIgY29tcG9uZW50cyAncHJvcGVydGllcycgb2JqZWN0IGluc3RlYWQgb2Ygb3V0c2lkZSBvZiBpdC4iKSk7ZWxzZSBpZihpPXQ/dGhpcy5hbmltYXRpb25Db25maWdbdF06dGhpcy5hbmltYXRpb25Db25maWcsQXJyYXkuaXNBcnJheShpKXx8KGk9W2ldKSxpKWZvcih2YXIgcixvPTA7cj1pW29dO28rKylpZihyLmFuaW1hdGFibGUpci5hbmltYXRhYmxlLl9nZXRBbmltYXRpb25Db25maWdSZWN1cnNpdmUoci50eXBlfHx0LGUsbik7ZWxzZSBpZihyLmlkKXt2YXIgYT1lW3IuaWRdO2E/KGEuaXNDbG9uZXx8KGVbci5pZF09dGhpcy5fY2xvbmVDb25maWcoYSksYT1lW3IuaWRdKSx0aGlzLl9jb3B5UHJvcGVydGllcyhhLHIpKTplW3IuaWRdPXJ9ZWxzZSBuLnB1c2gocil9LGdldEFuaW1hdGlvbkNvbmZpZzpmdW5jdGlvbih0KXt2YXIgZT17fSxuPVtdO2Zvcih2YXIgaSBpbiB0aGlzLl9nZXRBbmltYXRpb25Db25maWdSZWN1cnNpdmUodCxlLG4pLGUpbi5wdXNoKGVbaV0pO3JldHVybiBufX0se19jb25maWd1cmVBbmltYXRpb25zOmZ1bmN0aW9uKHQpe3ZhciBlPVtdLG49W107aWYodC5sZW5ndGg+MClmb3IobGV0IGUsaT0wO2U9dFtpXTtpKyspe2xldCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZS5uYW1lKTtpZih0LmlzTmVvbkFuaW1hdGlvbil7bGV0IGk9bnVsbDt0LmNvbmZpZ3VyZXx8KHQuY29uZmlndXJlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsfSksaT10LmNvbmZpZ3VyZShlKSxuLnB1c2goe3Jlc3VsdDppLGNvbmZpZzplLG5lb25BbmltYXRpb246dH0pfWVsc2UgY29uc29sZS53YXJuKHRoaXMuaXMrIjoiLGUubmFtZSwibm90IGZvdW5kISIpfWZvcih2YXIgaT0wO2k8bi5sZW5ndGg7aSsrKXtsZXQgdD1uW2ldLnJlc3VsdCxyPW5baV0uY29uZmlnLG89bltpXS5uZW9uQW5pbWF0aW9uO3RyeXsiZnVuY3Rpb24iIT10eXBlb2YgdC5jYW5jZWwmJih0PWRvY3VtZW50LnRpbWVsaW5lLnBsYXkodCkpfWNhdGNoKGUpe3Q9bnVsbCxjb25zb2xlLndhcm4oIkNvdWxkbnQgcGxheSIsIigiLHIubmFtZSwiKS4iLGUpfXQmJmUucHVzaCh7bmVvbkFuaW1hdGlvbjpvLGNvbmZpZzpyLGFuaW1hdGlvbjp0fSl9cmV0dXJuIGV9LF9zaG91bGRDb21wbGV0ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9ITAsbj0wO248dC5sZW5ndGg7bisrKWlmKCJmaW5pc2hlZCIhPXRbbl0uYW5pbWF0aW9uLnBsYXlTdGF0ZSl7ZT0hMTticmVha31yZXR1cm4gZX0sX2NvbXBsZXRlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKXRbZV0ubmVvbkFuaW1hdGlvbi5jb21wbGV0ZSh0W2VdLmNvbmZpZyk7Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdLmFuaW1hdGlvbi5jYW5jZWwoKX0scGxheUFuaW1hdGlvbjpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0QW5pbWF0aW9uQ29uZmlnKHQpO2lmKG4pe3RoaXMuX2FjdGl2ZT10aGlzLl9hY3RpdmV8fHt9LHRoaXMuX2FjdGl2ZVt0XSYmKHRoaXMuX2NvbXBsZXRlKHRoaXMuX2FjdGl2ZVt0XSksZGVsZXRlIHRoaXMuX2FjdGl2ZVt0XSk7dmFyIGk9dGhpcy5fY29uZmlndXJlQW5pbWF0aW9ucyhuKTtpZigwIT1pLmxlbmd0aCl7dGhpcy5fYWN0aXZlW3RdPWk7Zm9yKHZhciByPTA7cjxpLmxlbmd0aDtyKyspaVtyXS5hbmltYXRpb24ub25maW5pc2g9ZnVuY3Rpb24oKXt0aGlzLl9zaG91bGRDb21wbGV0ZShpKSYmKHRoaXMuX2NvbXBsZXRlKGkpLGRlbGV0ZSB0aGlzLl9hY3RpdmVbdF0sdGhpcy5maXJlKCJuZW9uLWFuaW1hdGlvbi1maW5pc2giLGUse2J1YmJsZXM6ITF9KSl9LmJpbmQodGhpcyl9ZWxzZSB0aGlzLmZpcmUoIm5lb24tYW5pbWF0aW9uLWZpbmlzaCIsZSx7YnViYmxlczohMX0pfX0sY2FuY2VsQW5pbWF0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuX2FjdGl2ZSl7dmFyIGU9dGhpcy5fYWN0aXZlW3RdO2Zvcih2YXIgbiBpbiBlKWVbbl0uYW5pbWF0aW9uLmNhbmNlbCgpfXRoaXMuX2FjdGl2ZT17fX19XTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpScih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLWRpYWxvZy1zaGFyZWQtc3R5bGVzIj48L3N0eWxlPgogICAgPHNsb3Q+PC9zbG90PgpgLGlzOiJwYXBlci1kaWFsb2ciLGJlaGF2aW9yczpbUGEsUmFdLGxpc3RlbmVyczp7Im5lb24tYW5pbWF0aW9uLWZpbmlzaCI6Il9vbk5lb25BbmltYXRpb25GaW5pc2gifSxfcmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxBbmltYXRpb24oKSx0aGlzLnBsYXlBbmltYXRpb24oImVudHJ5Iil9LF9yZW5kZXJDbG9zZWQ6ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbEFuaW1hdGlvbigpLHRoaXMucGxheUFuaW1hdGlvbigiZXhpdCIpfSxfb25OZW9uQW5pbWF0aW9uRmluaXNoOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ/dGhpcy5fZmluaXNoUmVuZGVyT3BlbmVkKCk6dGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCl9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBPYT1Scih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBjbGlwOiByZWN0KDBweCwwcHgsMHB4LDBweCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGFyaWEtbGl2ZSQ9IltbbW9kZV1dIj5bW190ZXh0XV08L2Rpdj4KYCxpczoiaXJvbi1hMTF5LWFubm91bmNlciIscHJvcGVydGllczp7bW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6InBvbGl0ZSJ9LHRpbWVvdXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjE1MH0sX3RleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sY3JlYXRlZDpmdW5jdGlvbigpe09hLmluc3RhbmNlfHwoT2EuaW5zdGFuY2U9dGhpcyksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiaXJvbi1hbm5vdW5jZSIsdGhpcy5fb25Jcm9uQW5ub3VuY2UuYmluZCh0aGlzKSl9LGFubm91bmNlOmZ1bmN0aW9uKHQpe3RoaXMuX3RleHQ9IiIsdGhpcy5hc3luYygoZnVuY3Rpb24oKXt0aGlzLl90ZXh0PXR9KSx0aGlzLnRpbWVvdXQpfSxfb25Jcm9uQW5ub3VuY2U6ZnVuY3Rpb24odCl7dC5kZXRhaWwmJnQuZGV0YWlsLnRleHQmJnRoaXMuYW5ub3VuY2UodC5kZXRhaWwudGV4dCl9fSk7T2EuaW5zdGFuY2U9bnVsbCxPYS5yZXF1ZXN0QXZhaWxhYmlsaXR5PWZ1bmN0aW9uKCl7T2EuaW5zdGFuY2V8fChPYS5pbnN0YW5jZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpcm9uLWExMXktYW5ub3VuY2VyIikpLGRvY3VtZW50LmJvZHk/ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChPYS5pbnN0YW5jZSk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChPYS5pbnN0YW5jZSl9KSl9LAovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KUnIoe190ZW1wbGF0ZTpfZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzbG90IGlkPSJjb250ZW50Ij48L3Nsb3Q+CmAsaXM6Imlyb24taW5wdXQiLGJlaGF2aW9yczpbYWFdLHByb3BlcnRpZXM6e2JpbmRWYWx1ZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LHZhbHVlOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVWYWx1ZShiaW5kVmFsdWUpIn0sYWxsb3dlZFBhdHRlcm46e3R5cGU6U3RyaW5nfSxhdXRvVmFsaWRhdGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2lucHV0RWxlbWVudDpPYmplY3R9LG9ic2VydmVyczpbIl9iaW5kVmFsdWVDaGFuZ2VkKGJpbmRWYWx1ZSwgX2lucHV0RWxlbWVudCkiXSxsaXN0ZW5lcnM6e2lucHV0OiJfb25JbnB1dCIsa2V5cHJlc3M6Il9vbktleXByZXNzIn0sY3JlYXRlZDpmdW5jdGlvbigpe09hLnJlcXVlc3RBdmFpbGFiaWxpdHkoKSx0aGlzLl9wcmV2aW91c1ZhbGlkSW5wdXQ9IiIsdGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkPSExfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPVlpKHRoaXMpLm9ic2VydmVOb2RlcyhmdW5jdGlvbih0KXt0aGlzLl9pbml0U2xvdHRlZElucHV0KCl9LmJpbmQodGhpcykpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiYoWWkodGhpcykudW5vYnNlcnZlTm9kZXModGhpcy5fb2JzZXJ2ZXIpLHRoaXMuX29ic2VydmVyPW51bGwpfSxnZXQgaW5wdXRFbGVtZW50KCl7cmV0dXJuIHRoaXMuX2lucHV0RWxlbWVudH0sX2luaXRTbG90dGVkSW5wdXQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dEVsZW1lbnQ9dGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpWzBdLHRoaXMuaW5wdXRFbGVtZW50JiZ0aGlzLmlucHV0RWxlbWVudC52YWx1ZSYmKHRoaXMuYmluZFZhbHVlPXRoaXMuaW5wdXRFbGVtZW50LnZhbHVlKSx0aGlzLmZpcmUoImlyb24taW5wdXQtcmVhZHkiKX0sZ2V0IF9wYXR0ZXJuUmVnRXhwKCl7dmFyIHQ7aWYodGhpcy5hbGxvd2VkUGF0dGVybil0PW5ldyBSZWdFeHAodGhpcy5hbGxvd2VkUGF0dGVybik7ZWxzZSBzd2l0Y2godGhpcy5pbnB1dEVsZW1lbnQudHlwZSl7Y2FzZSJudW1iZXIiOnQ9L1swLTkuLGUtXS99cmV0dXJuIHR9LF9iaW5kVmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKHQsZSl7ZSYmKHZvaWQgMD09PXQ/ZS52YWx1ZT1udWxsOnQhPT1lLnZhbHVlJiYodGhpcy5pbnB1dEVsZW1lbnQudmFsdWU9dCksdGhpcy5hdXRvVmFsaWRhdGUmJnRoaXMudmFsaWRhdGUoKSx0aGlzLmZpcmUoImJpbmQtdmFsdWUtY2hhbmdlZCIse3ZhbHVlOnR9KSl9LF9vbklucHV0OmZ1bmN0aW9uKCl7dGhpcy5hbGxvd2VkUGF0dGVybiYmIXRoaXMuX3BhdHRlcm5BbHJlYWR5Q2hlY2tlZCYmKHRoaXMuX2NoZWNrUGF0dGVyblZhbGlkaXR5KCl8fCh0aGlzLl9hbm5vdW5jZUludmFsaWRDaGFyYWN0ZXIoIkludmFsaWQgc3RyaW5nIG9mIGNoYXJhY3RlcnMgbm90IGVudGVyZWQuIiksdGhpcy5pbnB1dEVsZW1lbnQudmFsdWU9dGhpcy5fcHJldmlvdXNWYWxpZElucHV0KSksdGhpcy5iaW5kVmFsdWU9dGhpcy5fcHJldmlvdXNWYWxpZElucHV0PXRoaXMuaW5wdXRFbGVtZW50LnZhbHVlLHRoaXMuX3BhdHRlcm5BbHJlYWR5Q2hlY2tlZD0hMX0sX2lzUHJpbnRhYmxlOmZ1bmN0aW9uKHQpe3JldHVybiEoOD09dC5rZXlDb2RlfHw5PT10LmtleUNvZGV8fDEzPT10LmtleUNvZGV8fDI3PT10LmtleUNvZGV8fDA9PXQuY2hhckNvZGUmJigxOT09dC5rZXlDb2RlfHwyMD09dC5rZXlDb2RlfHw0NT09dC5rZXlDb2RlfHw0Nj09dC5rZXlDb2RlfHwxNDQ9PXQua2V5Q29kZXx8MTQ1PT10LmtleUNvZGV8fHQua2V5Q29kZT4zMiYmdC5rZXlDb2RlPDQxfHx0LmtleUNvZGU+MTExJiZ0LmtleUNvZGU8MTI0KSl9LF9vbktleXByZXNzOmZ1bmN0aW9uKHQpe2lmKHRoaXMuYWxsb3dlZFBhdHRlcm58fCJudW1iZXIiPT09dGhpcy5pbnB1dEVsZW1lbnQudHlwZSl7dmFyIGU9dGhpcy5fcGF0dGVyblJlZ0V4cDtpZihlJiYhKHQubWV0YUtleXx8dC5jdHJsS2V5fHx0LmFsdEtleSkpe3RoaXMuX3BhdHRlcm5BbHJlYWR5Q2hlY2tlZD0hMDt2YXIgbj1TdHJpbmcuZnJvbUNoYXJDb2RlKHQuY2hhckNvZGUpO3RoaXMuX2lzUHJpbnRhYmxlKHQpJiYhZS50ZXN0KG4pJiYodC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2Fubm91bmNlSW52YWxpZENoYXJhY3RlcigiSW52YWxpZCBjaGFyYWN0ZXIgIituKyIgbm90IGVudGVyZWQuIikpfX19LF9jaGVja1BhdHRlcm5WYWxpZGl0eTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3BhdHRlcm5SZWdFeHA7aWYoIXQpcmV0dXJuITA7Zm9yKHZhciBlPTA7ZTx0aGlzLmlucHV0RWxlbWVudC52YWx1ZS5sZW5ndGg7ZSsrKWlmKCF0LnRlc3QodGhpcy5pbnB1dEVsZW1lbnQudmFsdWVbZV0pKXJldHVybiExO3JldHVybiEwfSx2YWxpZGF0ZTpmdW5jdGlvbigpe2lmKCF0aGlzLmlucHV0RWxlbWVudClyZXR1cm4gdGhpcy5pbnZhbGlkPSExLCEwO3ZhciB0PXRoaXMuaW5wdXRFbGVtZW50LmNoZWNrVmFsaWRpdHkoKTtyZXR1cm4gdCYmKHRoaXMucmVxdWlyZWQmJiIiPT09dGhpcy5iaW5kVmFsdWU/dD0hMTp0aGlzLmhhc1ZhbGlkYXRvcigpJiYodD1hYS52YWxpZGF0ZS5jYWxsKHRoaXMsdGhpcy5iaW5kVmFsdWUpKSksdGhpcy5pbnZhbGlkPSF0LHRoaXMuZmlyZSgiaXJvbi1pbnB1dC12YWxpZGF0ZSIpLHR9LF9hbm5vdW5jZUludmFsaWRDaGFyYWN0ZXI6ZnVuY3Rpb24odCl7dGhpcy5maXJlKCJpcm9uLWFubm91bmNlIix7dGV4dDp0fSl9LF9jb21wdXRlVmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHR9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCB6YT17YXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoImFkZG9uLWF0dGFjaGVkIil9LHVwZGF0ZTpmdW5jdGlvbih0KXt9fTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovUnIoe190ZW1wbGF0ZTpfZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmbG9hdDogcmlnaHQ7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY2FwdGlvbjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jaGFyLWNvdW50ZXI7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c3Bhbj5bW19jaGFyQ291bnRlclN0cl1dPC9zcGFuPgpgLGlzOiJwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIiLGJlaGF2aW9yczpbemFdLHByb3BlcnRpZXM6e19jaGFyQ291bnRlclN0cjp7dHlwZTpTdHJpbmcsdmFsdWU6IjAifX0sdXBkYXRlOmZ1bmN0aW9uKHQpe2lmKHQuaW5wdXRFbGVtZW50KXt0LnZhbHVlPXQudmFsdWV8fCIiO3ZhciBlPXQudmFsdWUudG9TdHJpbmcoKS5sZW5ndGgudG9TdHJpbmcoKTt0LmlucHV0RWxlbWVudC5oYXNBdHRyaWJ1dGUoIm1heGxlbmd0aCIpJiYoZSs9Ii8iK3QuaW5wdXRFbGVtZW50LmdldEF0dHJpYnV0ZSgibWF4bGVuZ3RoIikpLHRoaXMuX2NoYXJDb3VudGVyU3RyPWV9fX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgRGE9X2VgCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CiAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXNoYXJlZC1pbnB1dC1zdHlsZTogewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogdG8gbWFrZSBhIHN0YWNraW5nIGNvbnRleHQgKi8KICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgdGV4dC1hbGlnbjogaW5oZXJpdDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LWFsaWduLCBib3R0b20pOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgIH07CiAgICB9CiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+CmA7RGEuc2V0QXR0cmlidXRlKCJzdHlsZSIsImRpc3BsYXk6IG5vbmU7IiksZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChEYS5jb250ZW50KSxScih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogOHB4IDA7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyOwogICAgICB9CgogICAgICA6aG9zdChbaW5saW5lXSkgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIG9wYWNpdHk6IDAuMzM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5mbG9hdGVkLWxhYmVsLXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNhcHRpb247CiAgICAgIH0KCiAgICAgIC51bmRlcmxpbmUgewogICAgICAgIGhlaWdodDogMnB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLmZvY3VzZWQtbGluZSB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZpdDsKICAgICAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CgogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKDAsMSwxKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlM2QoMCwxLDEpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItdW5kZXJsaW5lLWZvY3VzOwogICAgICB9CgogICAgICAudW5kZXJsaW5lLmlzLWhpZ2hsaWdodGVkIC5mb2N1c2VkLWxpbmUgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBub25lOwogICAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuMjVzOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjI1czsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdHJhbnNpdGlvbi1lYXNpbmc7CiAgICAgIH0KCiAgICAgIC51bmRlcmxpbmUuaXMtaW52YWxpZCAuZm9jdXNlZC1saW5lIHsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBub25lOwogICAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuMjVzOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjI1czsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdHJhbnNpdGlvbi1lYXNpbmc7CiAgICAgIH0KCiAgICAgIC51bmZvY3VzZWQtbGluZSB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZpdDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci11bmRlcmxpbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIC51bmZvY3VzZWQtbGluZSB7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IGRhc2hlZDsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItdW5kZXJsaW5lLWRpc2FibGVkOwogICAgICB9CgogICAgICAuaW5wdXQtd3JhcHBlciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwogICAgICAgIEBhcHBseSAtLWxheW91dC1yZWxhdGl2ZTsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChsYWJlbCksCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZCgucGFwZXItaW5wdXQtbGFiZWwpIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZm9udDogaW5oZXJpdDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcikpOwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMC4yNXMsIHdpZHRoIDAuMjVzOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjI1cywgd2lkdGggMC4yNXM7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IHRvcDsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IHRvcDsKICAgICAgICAvKiBGaXggZm9yIHNhZmFyaSBub3QgZm9jdXNpbmcgMC1oZWlnaHQgZGF0ZS90aW1lIGlucHV0cyB3aXRoIC13ZWJraXQtYXBwZXJhbmNlOiBub25lOyAqLwogICAgICAgIG1pbi1oZWlnaHQ6IDFweDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdHJhbnNpdGlvbi1lYXNpbmc7CiAgICAgIH0KCgogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQobGFiZWwpOmJlZm9yZSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1sYWJlbCk6YmVmb3JlIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWwtYmVmb3JlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQobGFiZWwpOmFmdGVyLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKTphZnRlciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsLWFmdGVyOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTc1JSkgc2NhbGUoMC43NSk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC03NSUpIHNjYWxlKDAuNzUpOwoKICAgICAgICAvKiBTaW5jZSB3ZSBzY2FsZSB0byA3NS8xMDAgb2YgdGhlIHNpemUsIHdlIGFjdHVhbGx5IGhhdmUgMTAwLzc1IG9mIHRoZQogICAgICAgIG9yaWdpbmFsIHNwYWNlIG5vdyBhdmFpbGFibGUgKi8KICAgICAgICB3aWR0aDogMTMzJTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsLWZsb2F0aW5nOwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIC5pbnB1dC1jb250ZW50LmxhYmVsLWlzLWZsb2F0aW5nIDo6c2xvdHRlZChsYWJlbCksCiAgICAgIDpob3N0KDpkaXIocnRsKSkgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtZmxvYXRpbmcgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1sYWJlbCkgewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGxlZnQ6IGF1dG87CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWwtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWRkZW4gOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtaGlkZGVuIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtbGFiZWwpIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpcm9uLWlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWlucHV0KSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXNoYXJlZC1pbnB1dC1zdHlsZTsKICAgICAgICAvKiBUaGUgYXBwbHkgc2hpbSBkb2Vzbid0IGFwcGx5IHRoZSBuZXN0ZWQgY29sb3IgY3VzdG9tIHByb3BlcnR5LAogICAgICAgICAgc28gd2UgaGF2ZSB0byByZS1hcHBseSBpdCBoZXJlLiAqLwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24taW5wdXQpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCh0ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtaW5wdXQpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1pbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1pbnB1dCkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1pbnZhbGlkOwogICAgICB9CgogICAgICAucHJlZml4IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1ub25lOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LXByZWZpeDsKICAgICAgfQoKICAgICAgLnN1ZmZpeCA6OnNsb3R0ZWQoKikgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtbm9uZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtc3VmZml4OwogICAgICB9CgogICAgICAvKiBGaXJlZm94IHNldHMgYSBtaW4td2lkdGggb24gdGhlIGlucHV0LCB3aGljaCBjYW4gY2F1c2UgbGF5b3V0IGlzc3VlcyAqLwogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoaW5wdXQpIHsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZCh0ZXh0YXJlYSkgewogICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgfQoKICAgICAgLmFkZC1vbi1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5hZGQtb24tY29udGVudC5pcy1pbnZhbGlkIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuYWRkLW9uLWNvbnRlbnQuaXMtaGlnaGxpZ2h0ZWQgOjpzbG90dGVkKCopIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciIgYXJpYS1oaWRkZW49InRydWUiIGhpZGRlbj0iW1tub0xhYmVsRmxvYXRdXSI+Jm5ic3A7PC9kaXY+CgogICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgIDxzcGFuIGNsYXNzPSJwcmVmaXgiPjxzbG90IG5hbWU9InByZWZpeCI+PC9zbG90Pjwvc3Bhbj4KCiAgICAgIDxkaXYgY2xhc3MkPSJbW19jb21wdXRlSW5wdXRDb250ZW50Q2xhc3Mobm9MYWJlbEZsb2F0LGFsd2F5c0Zsb2F0TGFiZWwsZm9jdXNlZCxpbnZhbGlkLF9pbnB1dEhhc0NvbnRlbnQpXV0iIGlkPSJsYWJlbEFuZElucHV0Q29udGFpbmVyIj4KICAgICAgICA8c2xvdCBuYW1lPSJsYWJlbCI+PC9zbG90PgogICAgICAgIDxzbG90IG5hbWU9ImlucHV0Ij48L3Nsb3Q+CiAgICAgIDwvZGl2PgoKICAgICAgPHNwYW4gY2xhc3M9InN1ZmZpeCI+PHNsb3QgbmFtZT0ic3VmZml4Ij48L3Nsb3Q+PC9zcGFuPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcyQ9IltbX2NvbXB1dGVVbmRlcmxpbmVDbGFzcyhmb2N1c2VkLGludmFsaWQpXV0iPgogICAgICA8ZGl2IGNsYXNzPSJ1bmZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzJD0iW1tfY29tcHV0ZUFkZE9uQ29udGVudENsYXNzKGZvY3VzZWQsaW52YWxpZCldXSI+CiAgICAgIDxzbG90IG5hbWU9ImFkZC1vbiI+PC9zbG90PgogICAgPC9kaXY+CmAsaXM6InBhcGVyLWlucHV0LWNvbnRhaW5lciIscHJvcGVydGllczp7bm9MYWJlbEZsb2F0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGFsd2F5c0Zsb2F0TGFiZWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYXR0ckZvclZhbHVlOnt0eXBlOlN0cmluZyx2YWx1ZToiYmluZC12YWx1ZSJ9LGF1dG9WYWxpZGF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbnZhbGlkOntvYnNlcnZlcjoiX2ludmFsaWRDaGFuZ2VkIix0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZvY3VzZWQ6e3JlYWRPbmx5OiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LF9hZGRvbnM6e3R5cGU6QXJyYXl9LF9pbnB1dEhhc0NvbnRlbnQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2lucHV0U2VsZWN0b3I6e3R5cGU6U3RyaW5nLHZhbHVlOiJpbnB1dCxpcm9uLWlucHV0LHRleHRhcmVhLC5wYXBlci1pbnB1dC1pbnB1dCJ9LF9ib3VuZE9uRm9jdXM6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25Gb2N1cy5iaW5kKHRoaXMpfX0sX2JvdW5kT25CbHVyOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uQmx1ci5iaW5kKHRoaXMpfX0sX2JvdW5kT25JbnB1dDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbklucHV0LmJpbmQodGhpcyl9fSxfYm91bmRWYWx1ZUNoYW5nZWQ6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25WYWx1ZUNoYW5nZWQuYmluZCh0aGlzKX19fSxsaXN0ZW5lcnM6eyJhZGRvbi1hdHRhY2hlZCI6Il9vbkFkZG9uQXR0YWNoZWQiLCJpcm9uLWlucHV0LXZhbGlkYXRlIjoiX29uSXJvbklucHV0VmFsaWRhdGUifSxnZXQgX3ZhbHVlQ2hhbmdlZEV2ZW50KCl7cmV0dXJuIHRoaXMuYXR0ckZvclZhbHVlKyItY2hhbmdlZCJ9LGdldCBfcHJvcGVydHlGb3JWYWx1ZSgpe3JldHVybiBzdCh0aGlzLmF0dHJGb3JWYWx1ZSl9LGdldCBfaW5wdXRFbGVtZW50KCl7cmV0dXJuIFlpKHRoaXMpLnF1ZXJ5U2VsZWN0b3IodGhpcy5faW5wdXRTZWxlY3Rvcil9LGdldCBfaW5wdXRFbGVtZW50VmFsdWUoKXtyZXR1cm4gdGhpcy5faW5wdXRFbGVtZW50W3RoaXMuX3Byb3BlcnR5Rm9yVmFsdWVdfHx0aGlzLl9pbnB1dEVsZW1lbnQudmFsdWV9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fX2lzRmlyc3RWYWx1ZVVwZGF0ZT0hMCx0aGlzLl9hZGRvbnN8fCh0aGlzLl9hZGRvbnM9W10pLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2JvdW5kT25Gb2N1cywhMCksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9ib3VuZE9uQmx1ciwhMCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5hdHRyRm9yVmFsdWU/dGhpcy5faW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5fdmFsdWVDaGFuZ2VkRXZlbnQsdGhpcy5fYm91bmRWYWx1ZUNoYW5nZWQpOnRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLHRoaXMuX29uSW5wdXQpLHRoaXMuX2lucHV0RWxlbWVudFZhbHVlJiYiIiE9dGhpcy5faW5wdXRFbGVtZW50VmFsdWU/dGhpcy5faGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGUodGhpcy5faW5wdXRFbGVtZW50KTp0aGlzLl9oYW5kbGVWYWx1ZSh0aGlzLl9pbnB1dEVsZW1lbnQpfSxfb25BZGRvbkF0dGFjaGVkOmZ1bmN0aW9uKHQpe3RoaXMuX2FkZG9uc3x8KHRoaXMuX2FkZG9ucz1bXSk7dmFyIGU9dC50YXJnZXQ7LTE9PT10aGlzLl9hZGRvbnMuaW5kZXhPZihlKSYmKHRoaXMuX2FkZG9ucy5wdXNoKGUpLHRoaXMuaXNBdHRhY2hlZCYmdGhpcy5faGFuZGxlVmFsdWUodGhpcy5faW5wdXRFbGVtZW50KSl9LF9vbkZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Rm9jdXNlZCghMCl9LF9vbkJsdXI6ZnVuY3Rpb24oKXt0aGlzLl9zZXRGb2N1c2VkKCExKSx0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZSh0aGlzLl9pbnB1dEVsZW1lbnQpfSxfb25JbnB1dDpmdW5jdGlvbih0KXt0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZSh0LnRhcmdldCl9LF9vblZhbHVlQ2hhbmdlZDpmdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldDt0aGlzLl9faXNGaXJzdFZhbHVlVXBkYXRlJiYodGhpcy5fX2lzRmlyc3RWYWx1ZVVwZGF0ZT0hMSx2b2lkIDA9PT1lLnZhbHVlfHwiIj09PWUudmFsdWUpfHx0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZSh0LnRhcmdldCl9LF9oYW5kbGVWYWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9pbnB1dEVsZW1lbnRWYWx1ZTt0aGlzLl9pbnB1dEhhc0NvbnRlbnQ9ISghZSYmMCE9PWUmJigibnVtYmVyIiE9PXQudHlwZXx8dC5jaGVja1ZhbGlkaXR5KCkpKSx0aGlzLnVwZGF0ZUFkZG9ucyh7aW5wdXRFbGVtZW50OnQsdmFsdWU6ZSxpbnZhbGlkOnRoaXMuaW52YWxpZH0pfSxfaGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGU6ZnVuY3Rpb24odCl7dmFyIGU7dGhpcy5hdXRvVmFsaWRhdGUmJnQmJihlPXQudmFsaWRhdGU/dC52YWxpZGF0ZSh0aGlzLl9pbnB1dEVsZW1lbnRWYWx1ZSk6dC5jaGVja1ZhbGlkaXR5KCksdGhpcy5pbnZhbGlkPSFlKSx0aGlzLl9oYW5kbGVWYWx1ZSh0KX0sX29uSXJvbklucHV0VmFsaWRhdGU6ZnVuY3Rpb24odCl7dGhpcy5pbnZhbGlkPXRoaXMuX2lucHV0RWxlbWVudC5pbnZhbGlkfSxfaW52YWxpZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hZGRvbnMmJnRoaXMudXBkYXRlQWRkb25zKHtpbnZhbGlkOnRoaXMuaW52YWxpZH0pfSx1cGRhdGVBZGRvbnM6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MDtlPXRoaXMuX2FkZG9uc1tuXTtuKyspZS51cGRhdGUodCl9LF9jb21wdXRlSW5wdXRDb250ZW50Q2xhc3M6ZnVuY3Rpb24odCxlLG4saSxyKXt2YXIgbz0iaW5wdXQtY29udGVudCI7aWYodClyJiYobys9IiBsYWJlbC1pcy1oaWRkZW4iKSxpJiYobys9IiBpcy1pbnZhbGlkIik7ZWxzZXt2YXIgYT10aGlzLnF1ZXJ5U2VsZWN0b3IoImxhYmVsIik7ZXx8cj8obys9IiBsYWJlbC1pcy1mbG9hdGluZyIsdGhpcy4kLmxhYmVsQW5kSW5wdXRDb250YWluZXIuc3R5bGUucG9zaXRpb249InN0YXRpYyIsaT9vKz0iIGlzLWludmFsaWQiOm4mJihvKz0iIGxhYmVsLWlzLWhpZ2hsaWdodGVkIikpOihhJiYodGhpcy4kLmxhYmVsQW5kSW5wdXRDb250YWluZXIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksaSYmKG8rPSIgaXMtaW52YWxpZCIpKX1yZXR1cm4gbiYmKG8rPSIgZm9jdXNlZCIpLG99LF9jb21wdXRlVW5kZXJsaW5lQ2xhc3M6ZnVuY3Rpb24odCxlKXt2YXIgbj0idW5kZXJsaW5lIjtyZXR1cm4gZT9uKz0iIGlzLWludmFsaWQiOnQmJihuKz0iIGlzLWhpZ2hsaWdodGVkIiksbn0sX2NvbXB1dGVBZGRPbkNvbnRlbnRDbGFzczpmdW5jdGlvbih0LGUpe3ZhciBuPSJhZGQtb24tY29udGVudCI7cmV0dXJuIGU/bis9IiBpcy1pbnZhbGlkIjp0JiYobis9IiBpcy1oaWdobGlnaHRlZCIpLG59fSksCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpScih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKCiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNhcHRpb247CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtZXJyb3I7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6MDsKICAgICAgICByaWdodDowOwogICAgICB9CgogICAgICA6aG9zdChbaW52YWxpZF0pIHsKICAgICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOwogICAgICB9CgogICAgICAjYTExeVdyYXBwZXIgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgOmhvc3QoW2ludmFsaWRdKSAjYTExeVdyYXBwZXIgewogICAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPCEtLQogICAgSWYgdGhlIHBhcGVyLWlucHV0LWVycm9yIGVsZW1lbnQgaXMgZGlyZWN0bHkgcmVmZXJlbmNlZCBieSBhbgogICAgXGBhcmlhLWRlc2NyaWJlZGJ5XGAgYXR0cmlidXRlLCBzdWNoIGFzIHdoZW4gdXNlZCBhcyBhIHBhcGVyLWlucHV0IGFkZC1vbiwKICAgIHRoZW4gYXBwbHlpbmcgXGB2aXNpYmlsaXR5OiBoaWRkZW47XGAgdG8gdGhlIHBhcGVyLWlucHV0LWVycm9yIGVsZW1lbnQgaXRzZWxmCiAgICBkb2VzIG5vdCBoaWRlIHRoZSBlcnJvci4KCiAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlOgogICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL2FjY25hbWUtMS4xLyNtYXBwaW5nX2FkZGl0aW9uYWxfbmRfZGVzY3JpcHRpb24KICAgIC0tPgogICAgPGRpdiBpZD0iYTExeVdyYXBwZXIiPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KYCxpczoicGFwZXItaW5wdXQtZXJyb3IiLGJlaGF2aW9yczpbemFdLHByb3BlcnRpZXM6e2ludmFsaWQ6e3JlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx0eXBlOkJvb2xlYW59fSx1cGRhdGU6ZnVuY3Rpb24odCl7dGhpcy5fc2V0SW52YWxpZCh0LmludmFsaWQpfX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgQmE9e05leHRMYWJlbElEOjEsTmV4dEFkZG9uSUQ6MSxOZXh0SW5wdXRJRDoxfSxIYT17cHJvcGVydGllczp7bGFiZWw6e3R5cGU6U3RyaW5nfSx2YWx1ZTp7bm90aWZ5OiEwLHR5cGU6U3RyaW5nfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbnZhbGlkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxhbGxvd2VkUGF0dGVybjp7dHlwZTpTdHJpbmd9LHR5cGU6e3R5cGU6U3RyaW5nfSxsaXN0Ont0eXBlOlN0cmluZ30scGF0dGVybjp7dHlwZTpTdHJpbmd9LHJlcXVpcmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGVycm9yTWVzc2FnZTp7dHlwZTpTdHJpbmd9LGNoYXJDb3VudGVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vTGFiZWxGbG9hdDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbHdheXNGbG9hdExhYmVsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGF1dG9WYWxpZGF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx2YWxpZGF0b3I6e3R5cGU6U3RyaW5nfSxhdXRvY29tcGxldGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJvZmYifSxhdXRvZm9jdXM6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2F1dG9mb2N1c0NoYW5nZWQifSxpbnB1dG1vZGU6e3R5cGU6U3RyaW5nfSxtaW5sZW5ndGg6e3R5cGU6TnVtYmVyfSxtYXhsZW5ndGg6e3R5cGU6TnVtYmVyfSxtaW46e3R5cGU6U3RyaW5nfSxtYXg6e3R5cGU6U3RyaW5nfSxzdGVwOnt0eXBlOlN0cmluZ30sbmFtZTp7dHlwZTpTdHJpbmd9LHBsYWNlaG9sZGVyOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0scmVhZG9ubHk6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sc2l6ZTp7dHlwZTpOdW1iZXJ9LGF1dG9jYXBpdGFsaXplOnt0eXBlOlN0cmluZyx2YWx1ZToibm9uZSJ9LGF1dG9jb3JyZWN0Ont0eXBlOlN0cmluZyx2YWx1ZToib2ZmIn0sYXV0b3NhdmU6e3R5cGU6U3RyaW5nfSxyZXN1bHRzOnt0eXBlOk51bWJlcn0sYWNjZXB0Ont0eXBlOlN0cmluZ30sbXVsdGlwbGU6e3R5cGU6Qm9vbGVhbn0sX2FyaWFEZXNjcmliZWRCeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9hcmlhTGFiZWxsZWRCeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9pbnB1dElkOnt0eXBlOlN0cmluZyx2YWx1ZToiIn19LGxpc3RlbmVyczp7ImFkZG9uLWF0dGFjaGVkIjoiX29uQWRkb25BdHRhY2hlZCJ9LGtleUJpbmRpbmdzOnsic2hpZnQrdGFiOmtleWRvd24iOiJfb25TaGlmdFRhYkRvd24ifSxob3N0QXR0cmlidXRlczp7dGFiaW5kZXg6MH0sZ2V0IGlucHV0RWxlbWVudCgpe3JldHVybiB0aGlzLiR8fCh0aGlzLiQ9e30pLHRoaXMuJC5pbnB1dHx8KHRoaXMuX2dlbmVyYXRlSW5wdXRJZCgpLHRoaXMuJC5pbnB1dD10aGlzLiQkKCIjIit0aGlzLl9pbnB1dElkKSksdGhpcy4kLmlucHV0fSxnZXQgX2ZvY3VzYWJsZUVsZW1lbnQoKXtyZXR1cm4gdGhpcy5pbnB1dEVsZW1lbnR9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl90eXBlc1RoYXRIYXZlVGV4dD1bImRhdGUiLCJkYXRldGltZSIsImRhdGV0aW1lLWxvY2FsIiwibW9udGgiLCJ0aW1lIiwid2VlayIsImZpbGUiXX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVBcmlhTGFiZWxsZWRCeSgpLCF5ZSYmdGhpcy5pbnB1dEVsZW1lbnQmJi0xIT09dGhpcy5fdHlwZXNUaGF0SGF2ZVRleHQuaW5kZXhPZih0aGlzLmlucHV0RWxlbWVudC50eXBlKSYmKHRoaXMuYWx3YXlzRmxvYXRMYWJlbD0hMCl9LF9hcHBlbmRTdHJpbmdXaXRoU3BhY2U6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD90KyIgIitlOmV9LF9vbkFkZG9uQXR0YWNoZWQ6ZnVuY3Rpb24odCl7dmFyIGU9WWkodCkucm9vdFRhcmdldDtpZihlLmlkKXRoaXMuX2FyaWFEZXNjcmliZWRCeT10aGlzLl9hcHBlbmRTdHJpbmdXaXRoU3BhY2UodGhpcy5fYXJpYURlc2NyaWJlZEJ5LGUuaWQpO2Vsc2V7dmFyIG49InBhcGVyLWlucHV0LWFkZC1vbi0iK0JhLk5leHRBZGRvbklEKys7ZS5pZD1uLHRoaXMuX2FyaWFEZXNjcmliZWRCeT10aGlzLl9hcHBlbmRTdHJpbmdXaXRoU3BhY2UodGhpcy5fYXJpYURlc2NyaWJlZEJ5LG4pfX0sdmFsaWRhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnB1dEVsZW1lbnQudmFsaWRhdGUoKX0sX2ZvY3VzQmx1ckhhbmRsZXI6ZnVuY3Rpb24odCl7cW8uX2ZvY3VzQmx1ckhhbmRsZXIuY2FsbCh0aGlzLHQpLHRoaXMuZm9jdXNlZCYmIXRoaXMuX3NoaWZ0VGFiUHJlc3NlZCYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudCYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudC5mb2N1cygpfSxfb25TaGlmdFRhYkRvd246ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRBdHRyaWJ1dGUoInRhYmluZGV4Iik7dGhpcy5fc2hpZnRUYWJQcmVzc2VkPSEwLHRoaXMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIi0xIiksdGhpcy5hc3luYygoZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLGUpLHRoaXMuX3NoaWZ0VGFiUHJlc3NlZD0hMX0pLDEpfSxfaGFuZGxlQXV0b1ZhbGlkYXRlOmZ1bmN0aW9uKCl7dGhpcy5hdXRvVmFsaWRhdGUmJnRoaXMudmFsaWRhdGUoKX0sdXBkYXRlVmFsdWVBbmRQcmVzZXJ2ZUNhcmV0OmZ1bmN0aW9uKHQpe3RyeXt2YXIgZT10aGlzLmlucHV0RWxlbWVudC5zZWxlY3Rpb25TdGFydDt0aGlzLnZhbHVlPXQsdGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uU3RhcnQ9ZSx0aGlzLmlucHV0RWxlbWVudC5zZWxlY3Rpb25FbmQ9ZX1jYXRjaChlKXt0aGlzLnZhbHVlPXR9fSxfY29tcHV0ZUFsd2F5c0Zsb2F0TGFiZWw6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8dH0sX3VwZGF0ZUFyaWFMYWJlbGxlZEJ5OmZ1bmN0aW9uKCl7dmFyIHQsZT1ZaSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3IoImxhYmVsIik7ZT8oZS5pZD90PWUuaWQ6KHQ9InBhcGVyLWlucHV0LWxhYmVsLSIrQmEuTmV4dExhYmVsSUQrKyxlLmlkPXQpLHRoaXMuX2FyaWFMYWJlbGxlZEJ5PXQpOnRoaXMuX2FyaWFMYWJlbGxlZEJ5PSIifSxfZ2VuZXJhdGVJbnB1dElkOmZ1bmN0aW9uKCl7dGhpcy5faW5wdXRJZCYmIiIhPT10aGlzLl9pbnB1dElkfHwodGhpcy5faW5wdXRJZD0iaW5wdXQtIitCYS5OZXh0SW5wdXRJRCsrKX0sX29uQ2hhbmdlOmZ1bmN0aW9uKHQpe3RoaXMuc2hhZG93Um9vdCYmdGhpcy5maXJlKHQudHlwZSx7c291cmNlRXZlbnQ6dH0se25vZGU6dGhpcyxidWJibGVzOnQuYnViYmxlcyxjYW5jZWxhYmxlOnQuY2FuY2VsYWJsZX0pfSxfYXV0b2ZvY3VzQ2hhbmdlZDpmdW5jdGlvbigpe2lmKHRoaXMuYXV0b2ZvY3VzJiZ0aGlzLl9mb2N1c2FibGVFbGVtZW50KXt2YXIgdD1kb2N1bWVudC5hY3RpdmVFbGVtZW50O3QgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmdCE9PWRvY3VtZW50LmJvZHkmJnQhPT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fHRoaXMuX2ZvY3VzYWJsZUVsZW1lbnQuZm9jdXMoKX19fSxGYT1bcW8sem8sSGFdOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KUnIoe2lzOiJwYXBlci1pbnB1dCIsX3RlbXBsYXRlOl9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtmb2N1c2VkXSkgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBpbnB1dCB7CiAgICAgICAgLyogRmlyZWZveCBzZXRzIGEgbWluLXdpZHRoIG9uIHRoZSBpbnB1dCwgd2hpY2ggY2FuIGNhdXNlIGxheW91dCBpc3N1ZXMgKi8KICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC8qIEluIDEueCwgdGhlIDxpbnB1dD4gaXMgZGlzdHJpYnV0ZWQgdG8gcGFwZXItaW5wdXQtY29udGFpbmVyLCB3aGljaCBzdHlsZXMgaXQuCiAgICAgIEluIDIueCB0aGUgPGlyb24taW5wdXQ+IGlzIGRpc3RyaWJ1dGVkIHRvIHBhcGVyLWlucHV0LWNvbnRhaW5lciwgd2hpY2ggc3R5bGVzCiAgICAgIGl0LCBidXQgaW4gb3JkZXIgZm9yIHRoaXMgdG8gd29yayBjb3JyZWN0bHksIHdlIG5lZWQgdG8gcmVzZXQgc29tZQogICAgICBvZiB0aGUgbmF0aXZlIGlucHV0J3MgcHJvcGVydGllcyB0byBpbmhlcml0IChmcm9tIHRoZSBpcm9uLWlucHV0KSAqLwogICAgICBpcm9uLWlucHV0ID4gaW5wdXQgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1zaGFyZWQtaW5wdXQtc3R5bGU7CiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7CiAgICAgICAgZm9udC1zaXplOiBpbmhlcml0OwogICAgICAgIGxldHRlci1zcGFjaW5nOiBpbmhlcml0OwogICAgICAgIHdvcmQtc3BhY2luZzogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LXNoYWRvdzogaW5oZXJpdDsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICBjdXJzb3I6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIGlucHV0OmRpc2FibGVkIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLAogICAgICBpbnB1dDo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICBpbnB1dDo6LXdlYmtpdC1jbGVhci1idXR0b24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3IgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvcjsKICAgICAgfQoKICAgICAgaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0Oi1tb3otcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICBpbnB1dDo6LW1zLWNsZWFyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbXMtcmV2ZWFsIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtcmV2ZWFsOwogICAgICB9CgogICAgICBpbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGxhYmVsIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaW5wdXQtY29udGFpbmVyIGlkPSJjb250YWluZXIiIG5vLWxhYmVsLWZsb2F0PSJbW25vTGFiZWxGbG9hdF1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsKGFsd2F5c0Zsb2F0TGFiZWwscGxhY2Vob2xkZXIpXV0iIGF1dG8tdmFsaWRhdGUkPSJbW2F1dG9WYWxpZGF0ZV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaW52YWxpZD0iW1tpbnZhbGlkXV0iPgoKICAgICAgPHNsb3QgbmFtZT0icHJlZml4IiBzbG90PSJwcmVmaXgiPjwvc2xvdD4KCiAgICAgIDxsYWJlbCBoaWRkZW4kPSJbWyFsYWJlbF1dIiBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9yJD0iW1tfaW5wdXRJZF1dIiBzbG90PSJsYWJlbCI+W1tsYWJlbF1dPC9sYWJlbD4KCiAgICAgIDwhLS0gTmVlZCB0byBiaW5kIG1heGxlbmd0aCBzbyB0aGF0IHRoZSBwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgd29ya3MgY29ycmVjdGx5IC0tPgogICAgICA8aXJvbi1pbnB1dCBiaW5kLXZhbHVlPSJ7e3ZhbHVlfX0iIHNsb3Q9ImlucHV0IiBjbGFzcz0iaW5wdXQtZWxlbWVudCIgaWQkPSJbW19pbnB1dElkXV0iIG1heGxlbmd0aCQ9IltbbWF4bGVuZ3RoXV0iIGFsbG93ZWQtcGF0dGVybj0iW1thbGxvd2VkUGF0dGVybl1dIiBpbnZhbGlkPSJ7e2ludmFsaWR9fSIgdmFsaWRhdG9yPSJbW3ZhbGlkYXRvcl1dIj4KICAgICAgICA8aW5wdXQgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdGl0bGUkPSJbW3RpdGxlXV0iIHR5cGUkPSJbW3R5cGVdXSIgcGF0dGVybiQ9IltbcGF0dGVybl1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgbWluJD0iW1ttaW5dXSIgbWF4JD0iW1ttYXhdXSIgc3RlcCQ9Iltbc3RlcF1dIiBuYW1lJD0iW1tuYW1lXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgbGlzdCQ9IltbbGlzdF1dIiBzaXplJD0iW1tzaXplXV0iIGF1dG9jYXBpdGFsaXplJD0iW1thdXRvY2FwaXRhbGl6ZV1dIiBhdXRvY29ycmVjdCQ9IltbYXV0b2NvcnJlY3RdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiIHRhYmluZGV4JD0iW1t0YWJJbmRleF1dIiBhdXRvc2F2ZSQ9IltbYXV0b3NhdmVdXSIgcmVzdWx0cyQ9IltbcmVzdWx0c11dIiBhY2NlcHQkPSJbW2FjY2VwdF1dIiBtdWx0aXBsZSQ9IltbbXVsdGlwbGVdXSIgcm9sZSQ9IltbaW5wdXRSb2xlXV0iIGFyaWEtaGFzcG9wdXAkPSJbW2lucHV0QXJpYUhhc3BvcHVwXV0iPgogICAgICA8L2lyb24taW5wdXQ+CgogICAgICA8c2xvdCBuYW1lPSJzdWZmaXgiIHNsb3Q9InN1ZmZpeCI+PC9zbG90PgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2Vycm9yTWVzc2FnZV1dIj4KICAgICAgICA8cGFwZXItaW5wdXQtZXJyb3IgYXJpYS1saXZlPSJhc3NlcnRpdmUiIHNsb3Q9ImFkZC1vbiI+W1tlcnJvck1lc3NhZ2VdXTwvcGFwZXItaW5wdXQtZXJyb3I+CiAgICAgIDwvdGVtcGxhdGU+CgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbY2hhckNvdW50ZXJdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWNoYXItY291bnRlciBzbG90PSJhZGQtb24iPjwvcGFwZXItaW5wdXQtY2hhci1jb3VudGVyPgogICAgICA8L3RlbXBsYXRlPgoKICAgIDwvcGFwZXItaW5wdXQtY29udGFpbmVyPgogIGAsYmVoYXZpb3JzOltGYSxyYV0scHJvcGVydGllczp7dmFsdWU6e3R5cGU6U3RyaW5nfSxpbnB1dFJvbGU6e3R5cGU6U3RyaW5nLHZhbHVlOnZvaWQgMH0saW5wdXRBcmlhSGFzcG9wdXA6e3R5cGU6U3RyaW5nLHZhbHVlOnZvaWQgMH19LGdldCBfZm9jdXNhYmxlRWxlbWVudCgpe3JldHVybiB0aGlzLmlucHV0RWxlbWVudC5faW5wdXRFbGVtZW50fSxsaXN0ZW5lcnM6eyJpcm9uLWlucHV0LXJlYWR5IjoiX29uSXJvbklucHV0UmVhZHkifSxfb25Jcm9uSW5wdXRSZWFkeTpmdW5jdGlvbigpe3RoaXMuJC5uYXRpdmVJbnB1dHx8KHRoaXMuJC5uYXRpdmVJbnB1dD10aGlzLiQkKCJpbnB1dCIpKSx0aGlzLmlucHV0RWxlbWVudCYmLTEhPT10aGlzLl90eXBlc1RoYXRIYXZlVGV4dC5pbmRleE9mKHRoaXMuJC5uYXRpdmVJbnB1dC50eXBlKSYmKHRoaXMuYWx3YXlzRmxvYXRMYWJlbD0hMCksdGhpcy5pbnB1dEVsZW1lbnQuYmluZFZhbHVlJiZ0aGlzLiQuY29udGFpbmVyLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZSh0aGlzLmlucHV0RWxlbWVudCl9fSksCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpScih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CgogICAgICAjY29udGVudFdyYXBwZXIgOjpzbG90dGVkKCopIHsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQoKICAgICAgI2NvbnRlbnRXcmFwcGVyLmFuaW1hdGluZyA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iY29udGVudFdyYXBwZXIiPgogICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgPC9kaXY+CmAsaXM6Imlyb24tZHJvcGRvd24iLGJlaGF2aW9yczpbcW8sem8sa2EsUmFdLHByb3BlcnRpZXM6e2hvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sdmVydGljYWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6InRvcCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxvcGVuQW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdH0sY2xvc2VBbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0fSxmb2N1c1RhcmdldDp7dHlwZTpPYmplY3R9LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbGxvd091dHNpZGVTY3JvbGw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2FsbG93T3V0c2lkZVNjcm9sbENoYW5nZWQifX0sbGlzdGVuZXJzOnsibmVvbi1hbmltYXRpb24tZmluaXNoIjoiX29uTmVvbkFuaW1hdGlvbkZpbmlzaCJ9LG9ic2VydmVyczpbIl91cGRhdGVPdmVybGF5UG9zaXRpb24ocG9zaXRpb25UYXJnZXQsIHZlcnRpY2FsQWxpZ24sIGhvcml6b250YWxBbGlnbiwgdmVydGljYWxPZmZzZXQsIGhvcml6b250YWxPZmZzZXQpIl0sZ2V0IGNvbnRhaW5lZEVsZW1lbnQoKXtmb3IodmFyIHQ9WWkodGhpcy4kLmNvbnRlbnQpLmdldERpc3RyaWJ1dGVkTm9kZXMoKSxlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKWlmKHRbZV0ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4gdFtlXX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbEFjdGlvbnx8KHRoaXMuc2Nyb2xsQWN0aW9uPXRoaXMuYWxsb3dPdXRzaWRlU2Nyb2xsPyJyZWZpdCI6ImxvY2siKSx0aGlzLl9yZWFkaWVkPSEwfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2l6aW5nVGFyZ2V0JiZ0aGlzLnNpemluZ1RhcmdldCE9PXRoaXN8fCh0aGlzLnNpemluZ1RhcmdldD10aGlzLmNvbnRhaW5lZEVsZW1lbnR8fHRoaXMpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuY2FuY2VsQW5pbWF0aW9uKCl9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQmJnRoaXMuZGlzYWJsZWQ/dGhpcy5jYW5jZWwoKToodGhpcy5jYW5jZWxBbmltYXRpb24oKSx0aGlzLl91cGRhdGVBbmltYXRpb25Db25maWcoKSxDYS5fb3BlbmVkQ2hhbmdlZC5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxfcmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7IXRoaXMubm9BbmltYXRpb25zJiZ0aGlzLmFuaW1hdGlvbkNvbmZpZy5vcGVuPyh0aGlzLiQuY29udGVudFdyYXBwZXIuY2xhc3NMaXN0LmFkZCgiYW5pbWF0aW5nIiksdGhpcy5wbGF5QW5pbWF0aW9uKCJvcGVuIikpOkNhLl9yZW5kZXJPcGVuZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfcmVuZGVyQ2xvc2VkOmZ1bmN0aW9uKCl7IXRoaXMubm9BbmltYXRpb25zJiZ0aGlzLmFuaW1hdGlvbkNvbmZpZy5jbG9zZT8odGhpcy4kLmNvbnRlbnRXcmFwcGVyLmNsYXNzTGlzdC5hZGQoImFuaW1hdGluZyIpLHRoaXMucGxheUFuaW1hdGlvbigiY2xvc2UiKSk6Q2EuX3JlbmRlckNsb3NlZC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9vbk5lb25BbmltYXRpb25GaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLiQuY29udGVudFdyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSgiYW5pbWF0aW5nIiksdGhpcy5vcGVuZWQ/dGhpcy5fZmluaXNoUmVuZGVyT3BlbmVkKCk6dGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCl9LF91cGRhdGVBbmltYXRpb25Db25maWc6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5jb250YWluZWRFbGVtZW50LGU9W10uY29uY2F0KHRoaXMub3BlbkFuaW1hdGlvbkNvbmZpZ3x8W10pLmNvbmNhdCh0aGlzLmNsb3NlQW5pbWF0aW9uQ29uZmlnfHxbXSksbj0wO248ZS5sZW5ndGg7bisrKWVbbl0ubm9kZT10O3RoaXMuYW5pbWF0aW9uQ29uZmlnPXtvcGVuOnRoaXMub3BlbkFuaW1hdGlvbkNvbmZpZyxjbG9zZTp0aGlzLmNsb3NlQW5pbWF0aW9uQ29uZmlnfX0sX3VwZGF0ZU92ZXJsYXlQb3NpdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5ub3RpZnlSZXNpemUoKX0sX2FsbG93T3V0c2lkZVNjcm9sbENoYW5nZWQ6ZnVuY3Rpb24odCl7dGhpcy5fcmVhZGllZCYmKHQ/dGhpcy5zY3JvbGxBY3Rpb24mJiJsb2NrIiE9PXRoaXMuc2Nyb2xsQWN0aW9ufHwodGhpcy5zY3JvbGxBY3Rpb249InJlZml0Iik6dGhpcy5zY3JvbGxBY3Rpb249ImxvY2siKX0sX2FwcGx5Rm9jdXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmZvY3VzVGFyZ2V0fHx0aGlzLmNvbnRhaW5lZEVsZW1lbnQ7dCYmdGhpcy5vcGVuZWQmJiF0aGlzLm5vQXV0b0ZvY3VzP3QuZm9jdXMoKTpDYS5fYXBwbHlGb2N1cy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBWYT17cHJvcGVydGllczp7YW5pbWF0aW9uVGltaW5nOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybntkdXJhdGlvbjo1MDAsZWFzaW5nOiJjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpIixmaWxsOiJib3RoIn19fX0saXNOZW9uQW5pbWF0aW9uOiEwLGNyZWF0ZWQ6ZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LmFuaW1hdGV8fGNvbnNvbGUud2FybigiTm8gd2ViIGFuaW1hdGlvbnMgZGV0ZWN0ZWQuIFRoaXMgZWxlbWVudCB3aWxsIG5vdCBmdW5jdGlvbiB3aXRob3V0IGEgd2ViIGFuaW1hdGlvbnMgcG9seWZpbGwuIil9LHRpbWluZ0Zyb21Db25maWc6ZnVuY3Rpb24odCl7aWYodC50aW1pbmcpZm9yKHZhciBlIGluIHQudGltaW5nKXRoaXMuYW5pbWF0aW9uVGltaW5nW2VdPXQudGltaW5nW2VdO3JldHVybiB0aGlzLmFuaW1hdGlvblRpbWluZ30sc2V0UHJlZml4ZWRQcm9wZXJ0eTpmdW5jdGlvbih0LGUsbil7Zm9yKHZhciBpLHI9e3RyYW5zZm9ybTpbIndlYmtpdFRyYW5zZm9ybSJdLHRyYW5zZm9ybU9yaWdpbjpbIm1velRyYW5zZm9ybU9yaWdpbiIsIndlYmtpdFRyYW5zZm9ybU9yaWdpbiJdfVtlXSxvPTA7aT1yW29dO28rKyl0LnN0eWxlW2ldPW47dC5zdHlsZVtlXT1ufSxjb21wbGV0ZTpmdW5jdGlvbih0KXt9fTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovUnIoe2lzOiJmYWRlLWluLWFuaW1hdGlvbiIsYmVoYXZpb3JzOltWYV0sY29uZmlndXJlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KHQubm9kZSxbe29wYWNpdHk6IjAifSx7b3BhY2l0eToiMSJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcodCkpLHRoaXMuX2VmZmVjdH19KSwKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovClJyKHtpczoiZmFkZS1vdXQtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1ZhXSxjb25maWd1cmU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2VmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QodC5ub2RlLFt7b3BhY2l0eToiMSJ9LHtvcGFjaXR5OiIwIn1dLHRoaXMudGltaW5nRnJvbUNvbmZpZyh0KSksdGhpcy5fZWZmZWN0fX0pLAovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KUnIoe2lzOiJwYXBlci1tZW51LWdyb3ctaGVpZ2h0LWFuaW1hdGlvbiIsX3RlbXBsYXRlOm51bGwsYmVoYXZpb3JzOltWYV0sY29uZmlndXJlOmZ1bmN0aW9uKHQpe3ZhciBlPXQubm9kZSxuPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O3JldHVybiB0aGlzLl9lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KGUsW3toZWlnaHQ6bi8yKyJweCJ9LHtoZWlnaHQ6bisicHgifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKHQpKSx0aGlzLl9lZmZlY3R9fSksUnIoe2lzOiJwYXBlci1tZW51LWdyb3ctd2lkdGgtYW5pbWF0aW9uIixfdGVtcGxhdGU6bnVsbCxiZWhhdmlvcnM6W1ZhXSxjb25maWd1cmU6ZnVuY3Rpb24odCl7dmFyIGU9dC5ub2RlLG49ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChlLFt7d2lkdGg6bi8yKyJweCJ9LHt3aWR0aDpuKyJweCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcodCkpLHRoaXMuX2VmZmVjdH19KSxScih7aXM6InBhcGVyLW1lbnUtc2hyaW5rLXdpZHRoLWFuaW1hdGlvbiIsX3RlbXBsYXRlOm51bGwsYmVoYXZpb3JzOltWYV0sY29uZmlndXJlOmZ1bmN0aW9uKHQpe3ZhciBlPXQubm9kZSxuPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7cmV0dXJuIHRoaXMuX2VmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QoZSxbe3dpZHRoOm4rInB4In0se3dpZHRoOm4tbi8yMCsicHgifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKHQpKSx0aGlzLl9lZmZlY3R9fSksUnIoe2lzOiJwYXBlci1tZW51LXNocmluay1oZWlnaHQtYW5pbWF0aW9uIixfdGVtcGxhdGU6bnVsbCxiZWhhdmlvcnM6W1ZhXSxjb25maWd1cmU6ZnVuY3Rpb24odCl7dmFyIGU9dC5ub2RlLG49ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7cmV0dXJuIHRoaXMuc2V0UHJlZml4ZWRQcm9wZXJ0eShlLCJ0cmFuc2Zvcm1PcmlnaW4iLCIwIDAiKSx0aGlzLl9lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KGUsW3toZWlnaHQ6bisicHgiLHRyYW5zZm9ybToidHJhbnNsYXRlWSgwKSJ9LHtoZWlnaHQ6bi8yKyJweCIsdHJhbnNmb3JtOiJ0cmFuc2xhdGVZKC0yMHB4KSJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcodCkpLHRoaXMuX2VmZmVjdH19KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCnZhciBVYT17QU5JTUFUSU9OX0NVQklDX0JFWklFUjoiY3ViaWMtYmV6aWVyKC4zLC45NSwuNSwxKSIsTUFYX0FOSU1BVElPTl9USU1FX01TOjQwMH07Y29uc3QgamE9UnIoe190ZW1wbGF0ZTpfZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgY3Vyc29yOiBhdXRvOwogICAgICAgIGNvbG9yOiB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWVudS1idXR0b24tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlyb24tZHJvcGRvd24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWRyb3Bkb3duOwogICAgICB9CgogICAgICAuZHJvcGRvd24tY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CgogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItbWVudS1idXR0b24tZHJvcGRvd24tYmFja2dyb3VuZCwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWNvbnRlbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbC1hbGlnbj0idG9wIl0pIC5kcm9wZG93bi1jb250ZW50IHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICAgIG1hcmdpbi10b3A6IC0xMHB4OwogICAgICAgIHRvcDogMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZlcnRpY2FsLWFsaWduPSJib3R0b20iXSkgLmRyb3Bkb3duLWNvbnRlbnQgewogICAgICAgIGJvdHRvbTogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAtMTBweDsKICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICB9CgogICAgICAjdHJpZ2dlciB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InRyaWdnZXIiIG9uLXRhcD0idG9nZ2xlIj4KICAgICAgPHNsb3QgbmFtZT0iZHJvcGRvd24tdHJpZ2dlciI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGlyb24tZHJvcGRvd24gaWQ9ImRyb3Bkb3duIiBvcGVuZWQ9Int7b3BlbmVkfX0iIGhvcml6b250YWwtYWxpZ249IltbaG9yaXpvbnRhbEFsaWduXV0iIHZlcnRpY2FsLWFsaWduPSJbW3ZlcnRpY2FsQWxpZ25dXSIgZHluYW1pYy1hbGlnbj0iW1tkeW5hbWljQWxpZ25dXSIgaG9yaXpvbnRhbC1vZmZzZXQ9IltbaG9yaXpvbnRhbE9mZnNldF1dIiB2ZXJ0aWNhbC1vZmZzZXQ9IltbdmVydGljYWxPZmZzZXRdXSIgbm8tb3ZlcmxhcD0iW1tub092ZXJsYXBdXSIgb3Blbi1hbmltYXRpb24tY29uZmlnPSJbW29wZW5BbmltYXRpb25Db25maWddXSIgY2xvc2UtYW5pbWF0aW9uLWNvbmZpZz0iW1tjbG9zZUFuaW1hdGlvbkNvbmZpZ11dIiBuby1hbmltYXRpb25zPSJbW25vQW5pbWF0aW9uc11dIiBmb2N1cy10YXJnZXQ9IltbX2Ryb3Bkb3duQ29udGVudF1dIiBhbGxvdy1vdXRzaWRlLXNjcm9sbD0iW1thbGxvd091dHNpZGVTY3JvbGxdXSIgcmVzdG9yZS1mb2N1cy1vbi1jbG9zZT0iW1tyZXN0b3JlRm9jdXNPbkNsb3NlXV0iIG9uLWlyb24tb3ZlcmxheS1jYW5jZWxlZD0iX19vbklyb25PdmVybGF5Q2FuY2VsZWQiIGV4cGFuZC1zaXppbmctdGFyZ2V0LWZvci1zY3JvbGxiYXJzPSJbW2V4cGFuZFNpemluZ1RhcmdldEZvclNjcm9sbGJhcnNdXSI+CiAgICAgIDxkaXYgc2xvdD0iZHJvcGRvd24tY29udGVudCIgY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgIDxzbG90IGlkPSJjb250ZW50IiBuYW1lPSJkcm9wZG93bi1jb250ZW50Ij48L3Nsb3Q+CiAgICAgIDwvZGl2PgogICAgPC9pcm9uLWRyb3Bkb3duPgpgLGlzOiJwYXBlci1tZW51LWJ1dHRvbiIsYmVoYXZpb3JzOlt6byxxb10scHJvcGVydGllczp7b3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwLG9ic2VydmVyOiJfb3BlbmVkQ2hhbmdlZCJ9LGhvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sdmVydGljYWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6InRvcCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxkeW5hbWljQWxpZ246e3R5cGU6Qm9vbGVhbn0saG9yaXpvbnRhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LHZlcnRpY2FsT2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sbm9PdmVybGFwOnt0eXBlOkJvb2xlYW59LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpZ25vcmVTZWxlY3Q6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sY2xvc2VPbkFjdGl2YXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG9wZW5BbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW3tuYW1lOiJmYWRlLWluLWFuaW1hdGlvbiIsdGltaW5nOntkZWxheToxMDAsZHVyYXRpb246MjAwfX0se25hbWU6InBhcGVyLW1lbnUtZ3Jvdy13aWR0aC1hbmltYXRpb24iLHRpbWluZzp7ZGVsYXk6MTAwLGR1cmF0aW9uOjE1MCxlYXNpbmc6VWEuQU5JTUFUSU9OX0NVQklDX0JFWklFUn19LHtuYW1lOiJwYXBlci1tZW51LWdyb3ctaGVpZ2h0LWFuaW1hdGlvbiIsdGltaW5nOntkZWxheToxMDAsZHVyYXRpb246Mjc1LGVhc2luZzpVYS5BTklNQVRJT05fQ1VCSUNfQkVaSUVSfX1dfX0sY2xvc2VBbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW3tuYW1lOiJmYWRlLW91dC1hbmltYXRpb24iLHRpbWluZzp7ZHVyYXRpb246MTUwfX0se25hbWU6InBhcGVyLW1lbnUtc2hyaW5rLXdpZHRoLWFuaW1hdGlvbiIsdGltaW5nOntkZWxheToxMDAsZHVyYXRpb246NTAsZWFzaW5nOlVhLkFOSU1BVElPTl9DVUJJQ19CRVpJRVJ9fSx7bmFtZToicGFwZXItbWVudS1zaHJpbmstaGVpZ2h0LWFuaW1hdGlvbiIsdGltaW5nOntkdXJhdGlvbjoyMDAsZWFzaW5nOiJlYXNlLWluIn19XX19LGFsbG93T3V0c2lkZVNjcm9sbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxyZXN0b3JlRm9jdXNPbkNsb3NlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LGV4cGFuZFNpemluZ1RhcmdldEZvclNjcm9sbGJhcnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2Ryb3Bkb3duQ29udGVudDp7dHlwZTpPYmplY3R9fSxob3N0QXR0cmlidXRlczp7cm9sZToiZ3JvdXAiLCJhcmlhLWhhc3BvcHVwIjoidHJ1ZSJ9LGxpc3RlbmVyczp7Imlyb24tYWN0aXZhdGUiOiJfb25Jcm9uQWN0aXZhdGUiLCJpcm9uLXNlbGVjdCI6Il9vbklyb25TZWxlY3QifSxnZXQgY29udGVudEVsZW1lbnQoKXtmb3IodmFyIHQ9WWkodGhpcy4kLmNvbnRlbnQpLmdldERpc3RyaWJ1dGVkTm9kZXMoKSxlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKWlmKHRbZV0ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4gdFtlXX0sdG9nZ2xlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ/dGhpcy5jbG9zZSgpOnRoaXMub3BlbigpfSxvcGVuOmZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlZHx8dGhpcy4kLmRyb3Bkb3duLm9wZW4oKX0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLiQuZHJvcGRvd24uY2xvc2UoKX0sX29uSXJvblNlbGVjdDpmdW5jdGlvbih0KXt0aGlzLmlnbm9yZVNlbGVjdHx8dGhpcy5jbG9zZSgpfSxfb25Jcm9uQWN0aXZhdGU6ZnVuY3Rpb24odCl7dGhpcy5jbG9zZU9uQWN0aXZhdGUmJnRoaXMuY2xvc2UoKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24odCxlKXt0Pyh0aGlzLl9kcm9wZG93bkNvbnRlbnQ9dGhpcy5jb250ZW50RWxlbWVudCx0aGlzLmZpcmUoInBhcGVyLWRyb3Bkb3duLW9wZW4iKSk6bnVsbCE9ZSYmdGhpcy5maXJlKCJwYXBlci1kcm9wZG93bi1jbG9zZSIpfSxfZGlzYWJsZWRDaGFuZ2VkOmZ1bmN0aW9uKHQpe3FvLl9kaXNhYmxlZENoYW5nZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQmJnRoaXMub3BlbmVkJiZ0aGlzLmNsb3NlKCl9LF9fb25Jcm9uT3ZlcmxheUNhbmNlbGVkOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuJC50cmlnZ2VyO1lpKHQuZGV0YWlsKS5wYXRoLmluZGV4T2YoZSk+LTEmJnQucHJldmVudERlZmF1bHQoKX19KTtPYmplY3Qua2V5cyhVYSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7amFbdF09VWFbdF19KSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNiBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBHYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpO0dhLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJkaXNwbGF5OiBub25lOyIpLEdhLmlubmVySFRNTD0nPGlyb24taWNvbnNldC1zdmcgbmFtZT0icGFwZXItZHJvcGRvd24tbWVudSIgc2l6ZT0iMjQiPlxuPHN2Zz48ZGVmcz5cbjxnIGlkPSJhcnJvdy1kcm9wLWRvd24iPjxwYXRoIGQ9Ik03IDEwbDUgNSA1LTV6Ij48L3BhdGg+PC9nPlxuPC9kZWZzPjwvc3ZnPlxuPC9pcm9uLWljb25zZXQtc3ZnPicsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChHYS5jb250ZW50KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IFdhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7V2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsImRpc3BsYXk6IG5vbmU7IiksV2EuaW5uZXJIVE1MPSc8ZG9tLW1vZHVsZSBpZD0icGFwZXItZHJvcGRvd24tbWVudS1zaGFyZWQtc3R5bGVzIj5cbiAgPHRlbXBsYXRlPlxuICAgIDxzdHlsZT5cbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG5cbiAgICAgICAgLyogTk9URShjZGF0YSk6IEJvdGggdmFsdWVzIGFyZSBuZWVkZWQsIHNpbmNlIHNvbWUgcGhvbmVzIHJlcXVpcmUgdGhlXG4gICAgICAgICAqIHZhbHVlIHRvIGJlIGB0cmFuc3BhcmVudGAuXG4gICAgICAgICAqL1xuICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwwLDAsMCk7XG4gICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7XG5cbiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHtcbiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB9O1xuXG4gICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnU7XG4gICAgICB9XG5cbiAgICAgIC8qIHBhcGVyLWRyb3Bkb3duLW1lbnUgYW5kIHBhcGVyLWRyb3Bkb3duLW1lbnUtbGlnaHQgYm90aCBkZWxlZ2F0ZSBmb2N1c1xuICAgICAgICogdG8gb3RoZXIgaW50ZXJuYWwgZWxlbWVudHMgd2hpY2ggbWFuYWdlIGZvY3VzIHN0eWxpbmcuICovXG4gICAgICA6aG9zdCg6Zm9jdXMpIHtcbiAgICAgICAgb3V0bGluZTogbm9uZTtcbiAgICAgIH1cblxuICAgICAgOmhvc3QoOmRpcihydGwpKSB7XG4gICAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuXG4gICAgICAgIEBhcHBseSgtLXBhcGVyLWRyb3Bkb3duLW1lbnUpO1xuICAgICAgfVxuXG4gICAgICA6aG9zdChbZGlzYWJsZWRdKSB7XG4gICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtZGlzYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgIDpob3N0KFtub2lua10pIHBhcGVyLXJpcHBsZSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG5cbiAgICAgIDpob3N0KFtuby1sYWJlbC1mbG9hdF0pIHBhcGVyLXJpcHBsZSB7XG4gICAgICAgIHRvcDogOHB4O1xuICAgICAgfVxuXG4gICAgICBwYXBlci1yaXBwbGUge1xuICAgICAgICB0b3A6IDEycHg7XG4gICAgICAgIGxlZnQ6IDBweDtcbiAgICAgICAgYm90dG9tOiA4cHg7XG4gICAgICAgIHJpZ2h0OiAwcHg7XG5cbiAgICAgICAgQGFwcGx5IC0tcGFwZXItZHJvcGRvd24tbWVudS1yaXBwbGU7XG4gICAgICB9XG5cbiAgICAgIHBhcGVyLW1lbnUtYnV0dG9uIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBhZGRpbmc6IDA7XG5cbiAgICAgICAgQGFwcGx5IC0tcGFwZXItZHJvcGRvd24tbWVudS1idXR0b247XG4gICAgICB9XG5cbiAgICAgIHBhcGVyLWlucHV0IHtcbiAgICAgICAgQGFwcGx5IC0tcGFwZXItZHJvcGRvd24tbWVudS1pbnB1dDtcbiAgICAgIH1cblxuICAgICAgaXJvbi1pY29uIHtcbiAgICAgICAgY29sb3I6IHZhcigtLWRpc2FibGVkLXRleHQtY29sb3IpO1xuXG4gICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtaWNvbjtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICA8L3RlbXBsYXRlPlxuPC9kb20tbW9kdWxlPicsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChXYS5jb250ZW50KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IHFhPWVyKEhUTUxFbGVtZW50KTtScih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLWRyb3Bkb3duLW1lbnUtc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KCiAgICA8cGFwZXItbWVudS1idXR0b24gaWQ9Im1lbnVCdXR0b24iIHZlcnRpY2FsLWFsaWduPSJbW3ZlcnRpY2FsQWxpZ25dXSIgaG9yaXpvbnRhbC1hbGlnbj0iW1tob3Jpem9udGFsQWxpZ25dXSIgZHluYW1pYy1hbGlnbj0iW1tkeW5hbWljQWxpZ25dXSIgdmVydGljYWwtb2Zmc2V0PSJbW19jb21wdXRlTWVudVZlcnRpY2FsT2Zmc2V0KG5vTGFiZWxGbG9hdCwgdmVydGljYWxPZmZzZXQpXV0iIGRpc2FibGVkPSJbW2Rpc2FibGVkXV0iIG5vLWFuaW1hdGlvbnM9Iltbbm9BbmltYXRpb25zXV0iIG9uLWlyb24tc2VsZWN0PSJfb25Jcm9uU2VsZWN0IiBvbi1pcm9uLWRlc2VsZWN0PSJfb25Jcm9uRGVzZWxlY3QiIG9wZW5lZD0ie3tvcGVuZWR9fSIgY2xvc2Utb24tYWN0aXZhdGUgYWxsb3ctb3V0c2lkZS1zY3JvbGw9IltbYWxsb3dPdXRzaWRlU2Nyb2xsXV0iIHJlc3RvcmUtZm9jdXMtb24tY2xvc2U9IltbcmVzdG9yZUZvY3VzT25DbG9zZV1dIiBleHBhbmQtc2l6aW5nLXRhcmdldC1mb3Itc2Nyb2xsYmFycz0iW1tleHBhbmRTaXppbmdUYXJnZXRGb3JTY3JvbGxiYXJzXV0iPgogICAgICA8IS0tIHN1cHBvcnQgaHlicmlkIG1vZGU6IHVzZXIgbWlnaHQgYmUgdXNpbmcgcGFwZXItbWVudS1idXR0b24gMS54IHdoaWNoIGRpc3RyaWJ1dGVzIHZpYSA8Y29udGVudD4gLS0+CiAgICAgIDxkaXYgY2xhc3M9ImRyb3Bkb3duLXRyaWdnZXIiIHNsb3Q9ImRyb3Bkb3duLXRyaWdnZXIiPgogICAgICAgIDxwYXBlci1yaXBwbGU+PC9wYXBlci1yaXBwbGU+CiAgICAgICAgPCEtLSBwYXBlci1pbnB1dCBoYXMgdHlwZT0idGV4dCIgZm9yIGExMXksIGRvIG5vdCByZW1vdmUgLS0+CiAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJpbnB1dCIgdHlwZT0idGV4dCIgaW52YWxpZD0iW1tpbnZhbGlkXV0iIHJlYWRvbmx5IGRpc2FibGVkPSJbW2Rpc2FibGVkXV0iIHZhbHVlPSJbW3ZhbHVlXV0iIHBsYWNlaG9sZGVyPSJbW3BsYWNlaG9sZGVyXV0iIGVycm9yLW1lc3NhZ2U9IltbZXJyb3JNZXNzYWdlXV0iIGFsd2F5cy1mbG9hdC1sYWJlbD0iW1thbHdheXNGbG9hdExhYmVsXV0iIG5vLWxhYmVsLWZsb2F0PSJbW25vTGFiZWxGbG9hdF1dIiBsYWJlbD0iW1tsYWJlbF1dIiBpbnB1dC1yb2xlPSJidXR0b24iIGlucHV0LWFyaWEtaGFzcG9wdXA9Imxpc3Rib3giIGF1dG9jb21wbGV0ZT0ib2ZmIj4KICAgICAgICAgIDwhLS0gc3VwcG9ydCBoeWJyaWQgbW9kZTogdXNlciBtaWdodCBiZSB1c2luZyBwYXBlci1pbnB1dCAxLnggd2hpY2ggZGlzdHJpYnV0ZXMgdmlhIDxjb250ZW50PiAtLT4KICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0icGFwZXItZHJvcGRvd24tbWVudTphcnJvdy1kcm9wLWRvd24iIHN1ZmZpeCBzbG90PSJzdWZmaXgiPjwvaXJvbi1pY29uPgogICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgIDwvZGl2PgogICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgPC9wYXBlci1tZW51LWJ1dHRvbj4KYCxpczoicGFwZXItZHJvcGRvd24tbWVudSIsYmVoYXZpb3JzOltYbyxxbyxyYSxhYV0scHJvcGVydGllczp7c2VsZWN0ZWRJdGVtTGFiZWw6e3R5cGU6U3RyaW5nLG5vdGlmeTohMCxyZWFkT25seTohMH0sc2VsZWN0ZWRJdGVtOnt0eXBlOk9iamVjdCxub3RpZnk6ITAscmVhZE9ubHk6ITB9LHZhbHVlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LGxhYmVsOnt0eXBlOlN0cmluZ30scGxhY2Vob2xkZXI6e3R5cGU6U3RyaW5nfSxlcnJvck1lc3NhZ2U6e3R5cGU6U3RyaW5nfSxvcGVuZWQ6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAsdmFsdWU6ITEsb2JzZXJ2ZXI6Il9vcGVuZWRDaGFuZ2VkIn0sYWxsb3dPdXRzaWRlU2Nyb2xsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vTGFiZWxGbG9hdDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sYWx3YXlzRmxvYXRMYWJlbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0FuaW1hdGlvbnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0saG9yaXpvbnRhbEFsaWduOnt0eXBlOlN0cmluZyx2YWx1ZToicmlnaHQifSx2ZXJ0aWNhbEFsaWduOnt0eXBlOlN0cmluZyx2YWx1ZToidG9wIn0sdmVydGljYWxPZmZzZXQ6TnVtYmVyLGR5bmFtaWNBbGlnbjp7dHlwZTpCb29sZWFufSxyZXN0b3JlRm9jdXNPbkNsb3NlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LGV4cGFuZFNpemluZ1RhcmdldEZvclNjcm9sbGJhcnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LGxpc3RlbmVyczp7dGFwOiJfb25UYXAifSxrZXlCaW5kaW5nczp7InVwIGRvd24iOiJvcGVuIixlc2M6ImNsb3NlIn0sb2JzZXJ2ZXJzOlsiX3NlbGVjdGVkSXRlbUNoYW5nZWQoc2VsZWN0ZWRJdGVtKSJdLF9hdHRhY2hEb20odCl7Y29uc3QgZT1ZKHRoaXMpO3JldHVybiBlLmF0dGFjaFNoYWRvdyh7bW9kZToib3BlbiIsZGVsZWdhdGVzRm9jdXM6ITAsc2hhZHlVcGdyYWRlRnJhZ21lbnQ6dH0pLGUuc2hhZG93Um9vdC5hcHBlbmRDaGlsZCh0KSxxYS5wcm90b3R5cGUuX2F0dGFjaERvbS5jYWxsKHRoaXMsdCl9LGZvY3VzKCl7dGhpcy4kLmlucHV0Ll9mb2N1c2FibGVFbGVtZW50LmZvY3VzKCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZW50RWxlbWVudDt0JiZ0LnNlbGVjdGVkSXRlbSYmdGhpcy5fc2V0U2VsZWN0ZWRJdGVtKHQuc2VsZWN0ZWRJdGVtKX0sZ2V0IGNvbnRlbnRFbGVtZW50KCl7Zm9yKHZhciB0PVlpKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCksZT0wLG49dC5sZW5ndGg7ZTxuO2UrKylpZih0W2VdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIHRbZV19LG9wZW46ZnVuY3Rpb24oKXt0aGlzLiQubWVudUJ1dHRvbi5vcGVuKCl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy4kLm1lbnVCdXR0b24uY2xvc2UoKX0sX29uSXJvblNlbGVjdDpmdW5jdGlvbih0KXt0aGlzLl9zZXRTZWxlY3RlZEl0ZW0odC5kZXRhaWwuaXRlbSl9LF9vbklyb25EZXNlbGVjdDpmdW5jdGlvbih0KXt0aGlzLl9zZXRTZWxlY3RlZEl0ZW0obnVsbCl9LF9vblRhcDpmdW5jdGlvbih0KXtkaSh0KT09PXRoaXMmJnRoaXMub3BlbigpfSxfc2VsZWN0ZWRJdGVtQ2hhbmdlZDpmdW5jdGlvbih0KXt2YXIgZTtlPXQ/dC5sYWJlbHx8dC5nZXRBdHRyaWJ1dGUoImxhYmVsIil8fHQudGV4dENvbnRlbnQudHJpbSgpOiIiLHRoaXMudmFsdWU9ZSx0aGlzLl9zZXRTZWxlY3RlZEl0ZW1MYWJlbChlKX0sX2NvbXB1dGVNZW51VmVydGljYWxPZmZzZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8KHQ/LTQ6OCl9LF9nZXRWYWxpZGl0eTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kaXNhYmxlZHx8IXRoaXMucmVxdWlyZWR8fHRoaXMucmVxdWlyZWQmJiEhdGhpcy52YWx1ZX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnRlbnRFbGVtZW50O3QmJnQuc2V0QXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIix0aGlzLm9wZW5lZD8idHJ1ZSI6ImZhbHNlIil9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwp2YXIgWWE9e291dGVyU2Nyb2xsOntzY3JvbGw6ITB9LHNoYWRvd01vZGU6e3N0YW5kYXJkOjIsd2F0ZXJmYWxsOjEsIndhdGVyZmFsbC10YWxsIjoxfSx0YWxsTW9kZTp7IndhdGVyZmFsbC10YWxsIjohMH19O1JyKHtfdGVtcGxhdGU6X2VgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtdmVydGljYWw7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWw7CiAgICAgIH0KCiAgICAgICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgICB9CgogICAgICAjbWFpblBhbmVsIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtdmVydGljYWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLWJvZHk7CiAgICAgIH0KCiAgICAgICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtY29udGFpbmVyOwogICAgICB9CgogICAgICAvKgogICAgICAgKiBtb2RlOiBzY3JvbGwKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPXNjcm9sbF0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtc2Nyb2xsLWNvbnRhaW5lcjsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgOmhvc3QoW21vZGU9c2Nyb2xsXSkgewogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogY292ZXIKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPWNvdmVyXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1jb3Zlci1jb250YWluZXI7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQoKICAgICAgOmhvc3QoW21vZGU9Y292ZXJdKSAjbWFpblBhbmVsIHsKICAgICAgICBwb3NpdGlvbjogc3RhdGljOwogICAgICB9CgogICAgICAvKgogICAgICAgKiBtb2RlOiBzdGFuZGFyZAogICAgICAgKi8KICAgICAgOmhvc3QoW21vZGU9c3RhbmRhcmRdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXN0YW5kYXJkLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogc2VhbWVkCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1zZWFtZWRdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXNlYW1lZC1jb250YWluZXI7CiAgICAgIH0KCgogICAgICAvKgogICAgICAgKiBtb2RlOiB3YXRlcmZhbGwKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPXdhdGVyZmFsbF0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtd2F0ZXJmYWxsLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogd2F0ZXJmYWxsLXRhbGwKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPXdhdGVyZmFsbC10YWxsXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC13YXRlcmZhbGwtdGFsbC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgICNkcm9wU2hhZG93IHsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuNXM7CiAgICAgICAgaGVpZ2h0OiA2cHg7CiAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMHB4IDVweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXNoYWRvdzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI2Ryb3BTaGFkb3cuaGFzLXNoYWRvdyB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgI21haW5Db250YWluZXIgPiA6OnNsb3R0ZWQoLmZpdCkgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KCiAgICA8L3N0eWxlPgoKICAgIDxzbG90IGlkPSJoZWFkZXJTbG90IiBuYW1lPSJoZWFkZXIiPjwvc2xvdD4KCiAgICA8ZGl2IGlkPSJtYWluUGFuZWwiPgogICAgICA8ZGl2IGlkPSJtYWluQ29udGFpbmVyIiBjbGFzc1wkPSJbW19jb21wdXRlTWFpbkNvbnRhaW5lckNsYXNzKG1vZGUpXV0iPgogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImRyb3BTaGFkb3ciPjwvZGl2PgogICAgPC9kaXY+CmAsaXM6InBhcGVyLWhlYWRlci1wYW5lbCIscHJvcGVydGllczp7bW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0YW5kYXJkIixvYnNlcnZlcjoiX21vZGVDaGFuZ2VkIixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHNoYWRvdzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx0YWxsQ2xhc3M6e3R5cGU6U3RyaW5nLHZhbHVlOiJ0YWxsIn0sYXRUb3A6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxub3RpZnk6ITAscmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfX0sb2JzZXJ2ZXJzOlsiX2NvbXB1dGVEcm9wU2hhZG93SGlkZGVuKGF0VG9wLCBtb2RlLCBzaGFkb3cpIl0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hZGRMaXN0ZW5lcigpLHRoaXMuX2tlZXBTY3JvbGxpbmdTdGF0ZSgpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3JlbW92ZUxpc3RlbmVyKCl9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxIYW5kbGVyPXRoaXMuX3Njcm9sbC5iaW5kKHRoaXMpLGNvbnNvbGUud2Fybih0aGlzLmlzLCJpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGFwcC1sYXlvdXQgaW5zdGVhZCEiKX0sZ2V0IGhlYWRlcigpe3JldHVybiBZaSh0aGlzLiQuaGVhZGVyU2xvdCkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpWzBdfSxnZXQgc2Nyb2xsZXIoKXtyZXR1cm4gdGhpcy5fZ2V0U2Nyb2xsZXJGb3JNb2RlKHRoaXMubW9kZSl9LGdldCB2aXNpYmxlU2hhZG93KCl7cmV0dXJuIHRoaXMuJC5kcm9wU2hhZG93LmNsYXNzTGlzdC5jb250YWlucygiaGFzLXNoYWRvdyIpfSxfY29tcHV0ZURyb3BTaGFkb3dIaWRkZW46ZnVuY3Rpb24odCxlLG4pe3ZhciBpPVlhLnNoYWRvd01vZGVbZV07dGhpcy50b2dnbGVDbGFzcygiaGFzLXNoYWRvdyIsISF0aGlzLnNoYWRvd3x8Mj09PWl8fDE9PT1pJiYhdCx0aGlzLiQuZHJvcFNoYWRvdyl9LF9jb21wdXRlTWFpbkNvbnRhaW5lckNsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlPXt9O3JldHVybiBlLmZsZXg9ImNvdmVyIiE9PXQsT2JqZWN0LmtleXMoZSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0pKS5qb2luKCIgIil9LF9hZGRMaXN0ZW5lcjpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLnNjcm9sbEhhbmRsZXIpfSxfcmVtb3ZlTGlzdGVuZXI6ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdGhpcy5zY3JvbGxIYW5kbGVyKX0sX21vZGVDaGFuZ2VkOmZ1bmN0aW9uKHQsZSl7dmFyIG49WWEsaT10aGlzLmhlYWRlcjtpJiYobi50YWxsTW9kZVtlXSYmIW4udGFsbE1vZGVbdF0/KGkuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLnRhbGxDbGFzcyksdGhpcy5hc3luYygoZnVuY3Rpb24oKXtpLmNsYXNzTGlzdC5yZW1vdmUoImFuaW1hdGUiKX0pLDIwMCkpOnRoaXMudG9nZ2xlQ2xhc3MoImFuaW1hdGUiLG4udGFsbE1vZGVbdF0saSkpLHRoaXMuX2tlZXBTY3JvbGxpbmdTdGF0ZSgpfSxfa2VlcFNjcm9sbGluZ1N0YXRlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zY3JvbGxlcixlPXRoaXMuaGVhZGVyO3RoaXMuX3NldEF0VG9wKDA9PT10LnNjcm9sbFRvcCksZSYmdGhpcy50YWxsQ2xhc3MmJllhLnRhbGxNb2RlW3RoaXMubW9kZV0mJnRoaXMudG9nZ2xlQ2xhc3ModGhpcy50YWxsQ2xhc3MsdGhpcy5hdFRvcHx8ZS5jbGFzc0xpc3QuY29udGFpbnModGhpcy50YWxsQ2xhc3MpJiZ0LnNjcm9sbEhlaWdodDx0aGlzLm9mZnNldEhlaWdodCxlKX0sX3Njcm9sbDpmdW5jdGlvbigpe3RoaXMuX2tlZXBTY3JvbGxpbmdTdGF0ZSgpLHRoaXMuZmlyZSgiY29udGVudC1zY3JvbGwiLHt0YXJnZXQ6dGhpcy5zY3JvbGxlcn0se2J1YmJsZXM6ITF9KX0sX2dldFNjcm9sbGVyRm9yTW9kZTpmdW5jdGlvbih0KXtyZXR1cm4gWWEub3V0ZXJTY3JvbGxbdF0/dGhpczp0aGlzLiQubWFpbkNvbnRhaW5lcn19KSwKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovClJyKHtpczoicGFwZXItaWNvbi1idXR0b24iLF90ZW1wbGF0ZTpfZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgei1pbmRleDogMDsKICAgICAgICBsaW5lLWhlaWdodDogMTsKCiAgICAgICAgd2lkdGg6IDQwcHg7CiAgICAgICAgaGVpZ2h0OiA0MHB4OwoKICAgICAgICAvKgogICAgICAgICAgTk9URTogQm90aCB2YWx1ZXMgYXJlIG5lZWRlZCwgc2luY2Ugc29tZSBwaG9uZXMgcmVxdWlyZSB0aGUgdmFsdWUgdG8KICAgICAgICAgIGJlIFxgdHJhbnNwYXJlbnRcYC4KICAgICAgICAqLwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTsKICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwoKICAgICAgICAvKiBCZWNhdXNlIG9mIHBvbHltZXIvMjU1OCwgdGhpcyBzdHlsZSBoYXMgbG93ZXIgc3BlY2lmaWNpdHkgdGhhbiAqICovCiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pY29uLWJ1dHRvbjsKICAgICAgfQoKICAgICAgOmhvc3QgI2luayB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWljb24tYnV0dG9uLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgb3BhY2l0eTogMC42OwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWljb24tYnV0dG9uLWRpc2FibGVkLXRleHQsIHZhcigtLWRpc2FibGVkLXRleHQtY29sb3IpKTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBjdXJzb3I6IGF1dG87CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWljb24tYnV0dG9uLWRpc2FibGVkOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgOmhvc3QoOmhvdmVyKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaWNvbi1idXR0b24taG92ZXI7CiAgICAgIH0KCiAgICAgIGlyb24taWNvbiB7CiAgICAgICAgLS1pcm9uLWljb24td2lkdGg6IDEwMCU7CiAgICAgICAgLS1pcm9uLWljb24taGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxpcm9uLWljb24gaWQ9Imljb24iIHNyYz0iW1tzcmNdXSIgaWNvbj0iW1tpY29uXV0iCiAgICAgICAgICAgICAgIGFsdCQ9IltbYWx0XV0iPjwvaXJvbi1pY29uPgogIGAsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImJ1dHRvbiIsdGFiaW5kZXg6IjAifSxiZWhhdmlvcnM6W2NhXSxyZWdpc3RlcmVkOmZ1bmN0aW9uKCl7dGhpcy5fdGVtcGxhdGUuc2V0QXR0cmlidXRlKCJzdHJpcC13aGl0ZXNwYWNlIiwiIil9LHByb3BlcnRpZXM6e3NyYzp7dHlwZTpTdHJpbmd9LGljb246e3R5cGU6U3RyaW5nfSxhbHQ6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfYWx0Q2hhbmdlZCJ9fSxfYWx0Q2hhbmdlZDpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIik7biYmZSE9bnx8dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLHQpfX0pLAovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KUnIoe190ZW1wbGF0ZTpfZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkOwogICAgICAgIHBhZGRpbmc6IDJweDsKICAgICAgICAtbW96LWFwcGVhcmFuY2U6IHRleHRhcmVhOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogdGV4dGFyZWE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLm1pcnJvci10ZXh0IHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgcmVzaXplOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgLyogc2VlIGNvbW1lbnRzIGluIHRlbXBsYXRlICovCiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdDsKICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0OwogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTo6LW1vei1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0taXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYS1wbGFjZWhvbGRlcjsKICAgICAgfQoKICAgICAgdGV4dGFyZWE6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDwhLS0gdGhlIG1pcnJvciBzaXplcyB0aGUgaW5wdXQvdGV4dGFyZWEgc28gaXQgZ3Jvd3Mgd2l0aCB0eXBpbmcgLS0+CiAgICA8IS0tIHVzZSAmIzE2MDsgaW5zdGVhZCAmbmJzcDsgb2YgdG8gYWxsb3cgdGhpcyBlbGVtZW50IHRvIGJlIHVzZWQgaW4gWEhUTUwgLS0+CiAgICA8ZGl2IGlkPSJtaXJyb3IiIGNsYXNzPSJtaXJyb3ItdGV4dCIgYXJpYS1oaWRkZW49InRydWUiPiZuYnNwOzwvZGl2PgoKICAgIDwhLS0gc2l6ZSB0aGUgaW5wdXQvdGV4dGFyZWEgd2l0aCBhIGRpdiwgYmVjYXVzZSB0aGUgdGV4dGFyZWEgaGFzIGludHJpbnNpYyBzaXplIGluIGZmIC0tPgogICAgPGRpdiBjbGFzcz0idGV4dGFyZWEtY29udGFpbmVyIGZpdCI+CiAgICAgIDx0ZXh0YXJlYSBpZD0idGV4dGFyZWEiIG5hbWUkPSJbW25hbWVdXSIgYXJpYS1sYWJlbCQ9IltbbGFiZWxdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgYXV0b2NhcGl0YWxpemUkPSJbW2F1dG9jYXBpdGFsaXplXV0iIGlucHV0bW9kZSQ9IltbaW5wdXRtb2RlXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgcmVxdWlyZWQkPSJbW3JlcXVpcmVkXV0iIGRpc2FibGVkJD0iW1tkaXNhYmxlZF1dIiByb3dzJD0iW1tyb3dzXV0iIG1pbmxlbmd0aCQ9IltbbWlubGVuZ3RoXV0iIG1heGxlbmd0aCQ9IltbbWF4bGVuZ3RoXV0iPjwvdGV4dGFyZWE+CiAgICA8L2Rpdj4KYCxpczoiaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSIsYmVoYXZpb3JzOlthYSxxb10scHJvcGVydGllczp7dmFsdWU6e29ic2VydmVyOiJfdmFsdWVDaGFuZ2VkIix0eXBlOlN0cmluZyxub3RpZnk6ITB9LGJpbmRWYWx1ZTp7b2JzZXJ2ZXI6Il9iaW5kVmFsdWVDaGFuZ2VkIix0eXBlOlN0cmluZyxub3RpZnk6ITB9LHJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjEsb2JzZXJ2ZXI6Il91cGRhdGVDYWNoZWQifSxtYXhSb3dzOnt0eXBlOk51bWJlcix2YWx1ZTowLG9ic2VydmVyOiJfdXBkYXRlQ2FjaGVkIn0sYXV0b2NvbXBsZXRlOnt0eXBlOlN0cmluZyx2YWx1ZToib2ZmIn0sYXV0b2ZvY3VzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGF1dG9jYXBpdGFsaXplOnt0eXBlOlN0cmluZyx2YWx1ZToibm9uZSJ9LGlucHV0bW9kZTp7dHlwZTpTdHJpbmd9LHBsYWNlaG9sZGVyOnt0eXBlOlN0cmluZ30scmVhZG9ubHk6e3R5cGU6U3RyaW5nfSxyZXF1aXJlZDp7dHlwZTpCb29sZWFufSxtaW5sZW5ndGg6e3R5cGU6TnVtYmVyfSxtYXhsZW5ndGg6e3R5cGU6TnVtYmVyfSxsYWJlbDp7dHlwZTpTdHJpbmd9fSxsaXN0ZW5lcnM6e2lucHV0OiJfb25JbnB1dCJ9LGdldCB0ZXh0YXJlYSgpe3JldHVybiB0aGlzLiQudGV4dGFyZWF9LGdldCBzZWxlY3Rpb25TdGFydCgpe3JldHVybiB0aGlzLiQudGV4dGFyZWEuc2VsZWN0aW9uU3RhcnR9LGdldCBzZWxlY3Rpb25FbmQoKXtyZXR1cm4gdGhpcy4kLnRleHRhcmVhLnNlbGVjdGlvbkVuZH0sc2V0IHNlbGVjdGlvblN0YXJ0KHQpe3RoaXMuJC50ZXh0YXJlYS5zZWxlY3Rpb25TdGFydD10fSxzZXQgc2VsZWN0aW9uRW5kKHQpe3RoaXMuJC50ZXh0YXJlYS5zZWxlY3Rpb25FbmQ9dH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXtuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OltvYV1kfGhvbmUpLykmJiFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PUyAxWzM0NTY3ODldLykmJih0aGlzLiQudGV4dGFyZWEuc3R5bGUubWFyZ2luTGVmdD0iLTNweCIpfSx2YWxpZGF0ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuJC50ZXh0YXJlYS52YWxpZGl0eS52YWxpZDtyZXR1cm4gdCYmKHRoaXMucmVxdWlyZWQmJiIiPT09dGhpcy52YWx1ZT90PSExOnRoaXMuaGFzVmFsaWRhdG9yKCkmJih0PWFhLnZhbGlkYXRlLmNhbGwodGhpcyx0aGlzLnZhbHVlKSkpLHRoaXMuaW52YWxpZD0hdCx0aGlzLmZpcmUoImlyb24taW5wdXQtdmFsaWRhdGUiKSx0fSxfYmluZFZhbHVlQ2hhbmdlZDpmdW5jdGlvbih0KXt0aGlzLnZhbHVlPXR9LF92YWx1ZUNoYW5nZWQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy50ZXh0YXJlYTtlJiYoZS52YWx1ZSE9PXQmJihlLnZhbHVlPXR8fDA9PT10P3Q6IiIpLHRoaXMuYmluZFZhbHVlPXQsdGhpcy4kLm1pcnJvci5pbm5lckhUTUw9dGhpcy5fdmFsdWVGb3JNaXJyb3IoKSx0aGlzLmZpcmUoImJpbmQtdmFsdWUtY2hhbmdlZCIse3ZhbHVlOnRoaXMuYmluZFZhbHVlfSkpfSxfb25JbnB1dDpmdW5jdGlvbih0KXt2YXIgZT1ZaSh0KS5wYXRoO3RoaXMudmFsdWU9ZT9lWzBdLnZhbHVlOnQudGFyZ2V0LnZhbHVlfSxfY29uc3RyYWluOmZ1bmN0aW9uKHQpe3ZhciBlO2Zvcih0PXR8fFsiIl0sZT10aGlzLm1heFJvd3M+MCYmdC5sZW5ndGg+dGhpcy5tYXhSb3dzP3Quc2xpY2UoMCx0aGlzLm1heFJvd3MpOnQuc2xpY2UoMCk7dGhpcy5yb3dzPjAmJmUubGVuZ3RoPHRoaXMucm93czspZS5wdXNoKCIiKTtyZXR1cm4gZS5qb2luKCI8YnIvPiIpKyImIzE2MDsifSxfdmFsdWVGb3JNaXJyb3I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnRleHRhcmVhO2lmKHQpcmV0dXJuIHRoaXMudG9rZW5zPXQmJnQudmFsdWU/dC52YWx1ZS5yZXBsYWNlKC8mL2dtLCImYW1wOyIpLnJlcGxhY2UoLyIvZ20sIiZxdW90OyIpLnJlcGxhY2UoLycvZ20sIiYjMzk7IikucmVwbGFjZSgvPC9nbSwiJmx0OyIpLnJlcGxhY2UoLz4vZ20sIiZndDsiKS5zcGxpdCgiXG4iKTpbIiJdLHRoaXMuX2NvbnN0cmFpbih0aGlzLnRva2Vucyl9LF91cGRhdGVDYWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLiQubWlycm9yLmlubmVySFRNTD10aGlzLl9jb25zdHJhaW4odGhpcy50b2tlbnMpfX0pLAovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KUnIoe190ZW1wbGF0ZTpfZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgbGFiZWwgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pbnB1dC1jb250YWluZXIgbm8tbGFiZWwtZmxvYXQkPSJbW25vTGFiZWxGbG9hdF1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsKGFsd2F5c0Zsb2F0TGFiZWwscGxhY2Vob2xkZXIpXV0iIGF1dG8tdmFsaWRhdGUkPSJbW2F1dG9WYWxpZGF0ZV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaW52YWxpZD0iW1tpbnZhbGlkXV0iPgoKICAgICAgPGxhYmVsIGhpZGRlbiQ9IltbIWxhYmVsXV0iIGFyaWEtaGlkZGVuPSJ0cnVlIiBmb3IkPSJbW19pbnB1dElkXV0iIHNsb3Q9ImxhYmVsIj5bW2xhYmVsXV08L2xhYmVsPgoKICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3M9InBhcGVyLWlucHV0LWlucHV0IiBzbG90PSJpbnB1dCIgaWQkPSJbW19pbnB1dElkXV0iIGFyaWEtbGFiZWxsZWRieSQ9IltbX2FyaWFMYWJlbGxlZEJ5XV0iIGFyaWEtZGVzY3JpYmVkYnkkPSJbW19hcmlhRGVzY3JpYmVkQnldXSIgYmluZC12YWx1ZT0ie3t2YWx1ZX19IiBpbnZhbGlkPSJ7e2ludmFsaWR9fSIgdmFsaWRhdG9yJD0iW1t2YWxpZGF0b3JdXSIgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIGF1dG9jb21wbGV0ZSQ9IltbYXV0b2NvbXBsZXRlXV0iIGF1dG9mb2N1cyQ9IltbYXV0b2ZvY3VzXV0iIGlucHV0bW9kZSQ9IltbaW5wdXRtb2RlXV0iIG5hbWUkPSJbW25hbWVdXSIgcGxhY2Vob2xkZXIkPSJbW3BsYWNlaG9sZGVyXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgYXV0b2NhcGl0YWxpemUkPSJbW2F1dG9jYXBpdGFsaXplXV0iIHJvd3MkPSJbW3Jvd3NdXSIgbWF4LXJvd3MkPSJbW21heFJvd3NdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiPjwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlcnJvck1lc3NhZ2VdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWVycm9yIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIiBzbG90PSJhZGQtb24iPltbZXJyb3JNZXNzYWdlXV08L3BhcGVyLWlucHV0LWVycm9yPgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJDb3VudGVyXV0iPgogICAgICAgIDxwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgc2xvdD0iYWRkLW9uIj48L3BhcGVyLWlucHV0LWNoYXItY291bnRlcj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KYCxpczoicGFwZXItdGV4dGFyZWEiLGJlaGF2aW9yczpbRmEscmFdLHByb3BlcnRpZXM6e19hcmlhTGFiZWxsZWRCeTp7b2JzZXJ2ZXI6Il9hcmlhTGFiZWxsZWRCeUNoYW5nZWQiLHR5cGU6U3RyaW5nfSxfYXJpYURlc2NyaWJlZEJ5OntvYnNlcnZlcjoiX2FyaWFEZXNjcmliZWRCeUNoYW5nZWQiLHR5cGU6U3RyaW5nfSx2YWx1ZTp7dHlwZTpTdHJpbmd9LHJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LG1heFJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjB9fSxnZXQgc2VsZWN0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0fSxzZXQgc2VsZWN0aW9uU3RhcnQodCl7dGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0PXR9LGdldCBzZWxlY3Rpb25FbmQoKXtyZXR1cm4gdGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvbkVuZH0sc2V0IHNlbGVjdGlvbkVuZCh0KXt0aGlzLiQuaW5wdXQudGV4dGFyZWEuc2VsZWN0aW9uRW5kPXR9LF9hcmlhTGFiZWxsZWRCeUNoYW5nZWQ6ZnVuY3Rpb24odCl7dGhpcy5fZm9jdXNhYmxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsdCl9LF9hcmlhRGVzY3JpYmVkQnlDaGFuZ2VkOmZ1bmN0aW9uKHQpe3RoaXMuX2ZvY3VzYWJsZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5Iix0KX0sZ2V0IF9mb2N1c2FibGVFbGVtZW50KCl7cmV0dXJuIHRoaXMuaW5wdXRFbGVtZW50LnRleHRhcmVhfX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgWGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtYYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZGlzcGxheTogbm9uZTsiKSxYYS5pbm5lckhUTUw9Ijxkb20tbW9kdWxlIGlkPVwicGFwZXItaXRlbS1zaGFyZWQtc3R5bGVzXCI+XG4gIDx0ZW1wbGF0ZT5cbiAgICA8c3R5bGU+XG4gICAgICA6aG9zdCwgLnBhcGVyLWl0ZW0ge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBtaW4taGVpZ2h0OiB2YXIoLS1wYXBlci1pdGVtLW1pbi1oZWlnaHQsIDQ4cHgpO1xuICAgICAgICBwYWRkaW5nOiAwcHggMTZweDtcbiAgICAgIH1cblxuICAgICAgLnBhcGVyLWl0ZW0ge1xuICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7XG4gICAgICAgIGJvcmRlcjpub25lO1xuICAgICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgICB9XG5cbiAgICAgIDpob3N0KFtoaWRkZW5dKSwgLnBhcGVyLWl0ZW1baGlkZGVuXSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgIH1cblxuICAgICAgOmhvc3QoLmlyb24tc2VsZWN0ZWQpLCAucGFwZXItaXRlbS5pcm9uLXNlbGVjdGVkIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IHZhcigtLXBhcGVyLWl0ZW0tc2VsZWN0ZWQtd2VpZ2h0LCBib2xkKTtcblxuICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLXNlbGVjdGVkO1xuICAgICAgfVxuXG4gICAgICA6aG9zdChbZGlzYWJsZWRdKSwgLnBhcGVyLWl0ZW1bZGlzYWJsZWRdIHtcbiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWl0ZW0tZGlzYWJsZWQtY29sb3IsIHZhcigtLWRpc2FibGVkLXRleHQtY29sb3IpKTtcblxuICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLWRpc2FibGVkO1xuICAgICAgfVxuXG4gICAgICA6aG9zdCg6Zm9jdXMpLCAucGFwZXItaXRlbTpmb2N1cyB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgb3V0bGluZTogMDtcblxuICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLWZvY3VzZWQ7XG4gICAgICB9XG5cbiAgICAgIDpob3N0KDpmb2N1cyk6YmVmb3JlLCAucGFwZXItaXRlbTpmb2N1czpiZWZvcmUge1xuICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0O1xuXG4gICAgICAgIGJhY2tncm91bmQ6IGN1cnJlbnRDb2xvcjtcbiAgICAgICAgY29udGVudDogJyc7XG4gICAgICAgIG9wYWNpdHk6IHZhcigtLWRhcmstZGl2aWRlci1vcGFjaXR5KTtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG5cbiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1mb2N1c2VkLWJlZm9yZTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICA8L3RlbXBsYXRlPlxuPC9kb20tbW9kdWxlPiIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChYYS5jb250ZW50KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0ICRhPVtYbyxxbyx7aG9zdEF0dHJpYnV0ZXM6e3JvbGU6Im9wdGlvbiIsdGFiaW5kZXg6IjAifX1dOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KUnIoe190ZW1wbGF0ZTpfZWAKICAgIDxzdHlsZSBpbmNsdWRlPSJwYXBlci1pdGVtLXNoYXJlZC1zdHlsZXMiPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8c2xvdD48L3Nsb3Q+CmAsaXM6InBhcGVyLWl0ZW0iLGJlaGF2aW9yczpbJGFdfSksCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpScih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsgLyogbmVlZGVkIGZvciB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcyB0byB3b3JrIG9uIGZmICovCiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItanVzdGlmaWVkOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgICB9CgogICAgICA6aG9zdChbdHdvLWxpbmVdKSB7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXR3by1saW5lLW1pbi1oZWlnaHQsIDcycHgpOwogICAgICB9CgogICAgICA6aG9zdChbdGhyZWUtbGluZV0pIHsKICAgICAgICBtaW4taGVpZ2h0OiB2YXIoLS1wYXBlci1pdGVtLWJvZHktdGhyZWUtbGluZS1taW4taGVpZ2h0LCA4OHB4KTsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoW3NlY29uZGFyeV0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWJvZHkxOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXNlY29uZGFyeS1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1ib2R5LXNlY29uZGFyeTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CmAsaXM6InBhcGVyLWl0ZW0tYm9keSJ9KSwKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovClJyKHtfdGVtcGxhdGU6X2VgCiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItaXRlbS1zaGFyZWQtc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW07CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaWNvbi1pdGVtOwogICAgICB9CgogICAgICAuY29udGVudC1pY29uIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwoKICAgICAgICB3aWR0aDogdmFyKC0tcGFwZXItaXRlbS1pY29uLXdpZHRoLCA1NnB4KTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLWljb247CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iY29udGVudEljb24iIGNsYXNzPSJjb250ZW50LWljb24iPgogICAgICA8c2xvdCBuYW1lPSJpdGVtLWljb24iPjwvc2xvdD4KICAgIDwvZGl2PgogICAgPHNsb3Q+PC9zbG90PgpgLGlzOiJwYXBlci1pY29uLWl0ZW0iLGJlaGF2aW9yczpbJGFdfSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBLYT17cHJvcGVydGllczp7bXVsdGk6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoibXVsdGlDaGFuZ2VkIn0sc2VsZWN0ZWRWYWx1ZXM6e3R5cGU6QXJyYXksbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxzZWxlY3RlZEl0ZW1zOnt0eXBlOkFycmF5LHJlYWRPbmx5OiEwLG5vdGlmeTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LG9ic2VydmVyczpbIl91cGRhdGVTZWxlY3RlZChzZWxlY3RlZFZhbHVlcy5zcGxpY2VzKSJdLHNlbGVjdDpmdW5jdGlvbih0KXt0aGlzLm11bHRpP3RoaXMuX3RvZ2dsZVNlbGVjdGVkKHQpOnRoaXMuc2VsZWN0ZWQ9dH0sbXVsdGlDaGFuZ2VkOmZ1bmN0aW9uKHQpe3RoaXMuX3NlbGVjdGlvbi5tdWx0aT10LHRoaXMuX3VwZGF0ZVNlbGVjdGVkKCl9LGdldCBfc2hvdWxkVXBkYXRlU2VsZWN0aW9uKCl7cmV0dXJuIG51bGwhPXRoaXMuc2VsZWN0ZWR8fG51bGwhPXRoaXMuc2VsZWN0ZWRWYWx1ZXMmJnRoaXMuc2VsZWN0ZWRWYWx1ZXMubGVuZ3RofSxfdXBkYXRlQXR0ckZvclNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5tdWx0aT90aGlzLnNlbGVjdGVkSXRlbXMmJnRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGg+MCYmKHRoaXMuc2VsZWN0ZWRWYWx1ZXM9dGhpcy5zZWxlY3RlZEl0ZW1zLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2luZGV4VG9WYWx1ZSh0aGlzLmluZGV4T2YodCkpfSksdGhpcykuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dH0pLHRoaXMpKTpqby5fdXBkYXRlQXR0ckZvclNlbGVjdGVkLmFwcGx5KHRoaXMpfSxfdXBkYXRlU2VsZWN0ZWQ6ZnVuY3Rpb24oKXt0aGlzLm11bHRpP3RoaXMuX3NlbGVjdE11bHRpKHRoaXMuc2VsZWN0ZWRWYWx1ZXMpOnRoaXMuX3NlbGVjdFNlbGVjdGVkKHRoaXMuc2VsZWN0ZWQpfSxfc2VsZWN0TXVsdGk6ZnVuY3Rpb24odCl7dmFyIGU9KHRoaXMuX3ZhbHVlc1RvSXRlbXModD10fHxbXSl8fFtdKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10fSkpO3RoaXMuX3NlbGVjdGlvbi5jbGVhcihlKTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0aGlzLl9zZWxlY3Rpb24uc2V0SXRlbVNlbGVjdGVkKGVbbl0sITApO3RoaXMuZmFsbGJhY2tTZWxlY3Rpb24mJiF0aGlzLl9zZWxlY3Rpb24uZ2V0KCkubGVuZ3RoJiZ0aGlzLl92YWx1ZVRvSXRlbSh0aGlzLmZhbGxiYWNrU2VsZWN0aW9uKSYmdGhpcy5zZWxlY3QodGhpcy5mYWxsYmFja1NlbGVjdGlvbil9LF9zZWxlY3Rpb25DaGFuZ2U6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zZWxlY3Rpb24uZ2V0KCk7dGhpcy5tdWx0aT8odGhpcy5fc2V0U2VsZWN0ZWRJdGVtcyh0KSx0aGlzLl9zZXRTZWxlY3RlZEl0ZW0odC5sZW5ndGg/dFswXTpudWxsKSk6bnVsbCE9dD8odGhpcy5fc2V0U2VsZWN0ZWRJdGVtcyhbdF0pLHRoaXMuX3NldFNlbGVjdGVkSXRlbSh0KSk6KHRoaXMuX3NldFNlbGVjdGVkSXRlbXMoW10pLHRoaXMuX3NldFNlbGVjdGVkSXRlbShudWxsKSl9LF90b2dnbGVTZWxlY3RlZDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnNlbGVjdGVkVmFsdWVzLmluZGV4T2YodCk7ZTwwP3RoaXMucHVzaCgic2VsZWN0ZWRWYWx1ZXMiLHQpOnRoaXMuc3BsaWNlKCJzZWxlY3RlZFZhbHVlcyIsZSwxKX0sX3ZhbHVlc1RvSXRlbXM6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/bnVsbDp0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3ZhbHVlVG9JdGVtKHQpfSksdGhpcyl9fSxaYT17cHJvcGVydGllczp7Zm9jdXNlZEl0ZW06e29ic2VydmVyOiJfZm9jdXNlZEl0ZW1DaGFuZ2VkIixyZWFkT25seTohMCx0eXBlOk9iamVjdH0sYXR0ckZvckl0ZW1UaXRsZTp7dHlwZTpTdHJpbmd9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9kaXNhYmxlZENoYW5nZWQifX0sX01PRElGSUVSX0tFWVM6WyJBbHQiLCJBbHRHcmFwaCIsIkNhcHNMb2NrIiwiQ29udHJvbCIsIkZuIiwiRm5Mb2NrIiwiSHlwZXIiLCJNZXRhIiwiTnVtTG9jayIsIk9TIiwiU2Nyb2xsTG9jayIsIlNoaWZ0IiwiU3VwZXIiLCJTeW1ib2wiLCJTeW1ib2xMb2NrIl0sX1NFQVJDSF9SRVNFVF9USU1FT1VUX01TOjFlMyxfcHJldmlvdXNUYWJJbmRleDowLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJtZW51In0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZU11bHRpc2VsZWN0YWJsZShtdWx0aSkiXSxsaXN0ZW5lcnM6e2ZvY3VzOiJfb25Gb2N1cyIsa2V5ZG93bjoiX29uS2V5ZG93biIsImlyb24taXRlbXMtY2hhbmdlZCI6Il9vbklyb25JdGVtc0NoYW5nZWQifSxrZXlCaW5kaW5nczp7dXA6Il9vblVwS2V5Iixkb3duOiJfb25Eb3duS2V5Iixlc2M6Il9vbkVzY0tleSIsInNoaWZ0K3RhYjprZXlkb3duIjoiX29uU2hpZnRUYWJEb3duIn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9yZXNldFRhYmluZGljZXMoKX0sc2VsZWN0OmZ1bmN0aW9uKHQpe3RoaXMuX2RlZmF1bHRGb2N1c0FzeW5jJiYodGhpcy5jYW5jZWxBc3luYyh0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYyksdGhpcy5fZGVmYXVsdEZvY3VzQXN5bmM9bnVsbCk7dmFyIGU9dGhpcy5fdmFsdWVUb0l0ZW0odCk7ZSYmZS5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIil8fCh0aGlzLl9zZXRGb2N1c2VkSXRlbShlKSxLYS5zZWxlY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sX3Jlc2V0VGFiaW5kaWNlczpmdW5jdGlvbigpe3ZhciB0PXRoaXMubXVsdGk/dGhpcy5zZWxlY3RlZEl0ZW1zJiZ0aGlzLnNlbGVjdGVkSXRlbXNbMF06dGhpcy5zZWxlY3RlZEl0ZW07dGhpcy5pdGVtcy5mb3JFYWNoKChmdW5jdGlvbihlKXtlLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLGU9PT10PyIwIjoiLTEiKSxlLnNldEF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIsdGhpcy5fc2VsZWN0aW9uLmlzU2VsZWN0ZWQoZSkpfSksdGhpcyl9LF91cGRhdGVNdWx0aXNlbGVjdGFibGU6ZnVuY3Rpb24odCl7dD90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1tdWx0aXNlbGVjdGFibGUiLCJ0cnVlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtbXVsdGlzZWxlY3RhYmxlIil9LF9mb2N1c1dpdGhLZXlib2FyZEV2ZW50OmZ1bmN0aW9uKHQpe2lmKC0xPT09dGhpcy5fTU9ESUZJRVJfS0VZUy5pbmRleE9mKHQua2V5KSl7dGhpcy5jYW5jZWxEZWJvdW5jZXIoIl9jbGVhclNlYXJjaFRleHQiKTtmb3IodmFyIGUsbj10aGlzLl9zZWFyY2hUZXh0fHwiIixpPShuKz0odC5rZXkmJjE9PXQua2V5Lmxlbmd0aD90LmtleTpTdHJpbmcuZnJvbUNoYXJDb2RlKHQua2V5Q29kZSkpLnRvTG9jYWxlTG93ZXJDYXNlKCkpLmxlbmd0aCxyPTA7ZT10aGlzLml0ZW1zW3JdO3IrKylpZighZS5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIikpe3ZhciBvPXRoaXMuYXR0ckZvckl0ZW1UaXRsZXx8InRleHRDb250ZW50IixhPShlW29dfHxlLmdldEF0dHJpYnV0ZShvKXx8IiIpLnRyaW0oKTtpZighKGEubGVuZ3RoPGkpJiZhLnNsaWNlKDAsaSkudG9Mb2NhbGVMb3dlckNhc2UoKT09bil7dGhpcy5fc2V0Rm9jdXNlZEl0ZW0oZSk7YnJlYWt9fXRoaXMuX3NlYXJjaFRleHQ9bix0aGlzLmRlYm91bmNlKCJfY2xlYXJTZWFyY2hUZXh0Iix0aGlzLl9jbGVhclNlYXJjaFRleHQsdGhpcy5fU0VBUkNIX1JFU0VUX1RJTUVPVVRfTVMpfX0sX2NsZWFyU2VhcmNoVGV4dDpmdW5jdGlvbigpe3RoaXMuX3NlYXJjaFRleHQ9IiJ9LF9mb2N1c1ByZXZpb3VzOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuaXRlbXMubGVuZ3RoLGU9TnVtYmVyKHRoaXMuaW5kZXhPZih0aGlzLmZvY3VzZWRJdGVtKSksbj0xO248dCsxO24rKyl7dmFyIGk9dGhpcy5pdGVtc1soZS1uK3QpJXRdO2lmKCFpLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIHI9WWkoaSkuZ2V0T3duZXJSb290KCl8fGRvY3VtZW50O2lmKHRoaXMuX3NldEZvY3VzZWRJdGVtKGkpLFlpKHIpLmFjdGl2ZUVsZW1lbnQ9PWkpcmV0dXJufX19LF9mb2N1c05leHQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5pdGVtcy5sZW5ndGgsZT1OdW1iZXIodGhpcy5pbmRleE9mKHRoaXMuZm9jdXNlZEl0ZW0pKSxuPTE7bjx0KzE7bisrKXt2YXIgaT10aGlzLml0ZW1zWyhlK24pJXRdO2lmKCFpLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIHI9WWkoaSkuZ2V0T3duZXJSb290KCl8fGRvY3VtZW50O2lmKHRoaXMuX3NldEZvY3VzZWRJdGVtKGkpLFlpKHIpLmFjdGl2ZUVsZW1lbnQ9PWkpcmV0dXJufX19LF9hcHBseVNlbGVjdGlvbjpmdW5jdGlvbih0LGUpe3Quc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIixlPyJ0cnVlIjoiZmFsc2UiKSxqby5fYXBwbHlTZWxlY3Rpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfZm9jdXNlZEl0ZW1DaGFuZ2VkOmZ1bmN0aW9uKHQsZSl7ZSYmZS5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKSwhdHx8dC5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIil8fHRoaXMuZGlzYWJsZWR8fCh0LnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCIwIiksdC5mb2N1cygpKX0sX29uSXJvbkl0ZW1zQ2hhbmdlZDpmdW5jdGlvbih0KXt0LmRldGFpbC5hZGRlZE5vZGVzLmxlbmd0aCYmdGhpcy5fcmVzZXRUYWJpbmRpY2VzKCl9LF9vblNoaWZ0VGFiRG93bjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKTtaYS5fc2hpZnRUYWJQcmVzc2VkPSEwLHRoaXMuX3NldEZvY3VzZWRJdGVtKG51bGwpLHRoaXMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIi0xIiksdGhpcy5hc3luYygoZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLGUpLFphLl9zaGlmdFRhYlByZXNzZWQ9ITF9KSwxKX0sX29uRm9jdXM6ZnVuY3Rpb24odCl7aWYoIVphLl9zaGlmdFRhYlByZXNzZWQpe3ZhciBlPVlpKHQpLnJvb3RUYXJnZXQ7KGU9PT10aGlzfHx2b2lkIDA9PT1lLnRhYkluZGV4fHx0aGlzLmlzTGlnaHREZXNjZW5kYW50KGUpKSYmKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jPXRoaXMuYXN5bmMoKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5tdWx0aT90aGlzLnNlbGVjdGVkSXRlbXMmJnRoaXMuc2VsZWN0ZWRJdGVtc1swXTp0aGlzLnNlbGVjdGVkSXRlbTt0aGlzLl9zZXRGb2N1c2VkSXRlbShudWxsKSx0P3RoaXMuX3NldEZvY3VzZWRJdGVtKHQpOnRoaXMuaXRlbXNbMF0mJnRoaXMuX2ZvY3VzTmV4dCgpfSkpKX19LF9vblVwS2V5OmZ1bmN0aW9uKHQpe3RoaXMuX2ZvY3VzUHJldmlvdXMoKSx0LmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LF9vbkRvd25LZXk6ZnVuY3Rpb24odCl7dGhpcy5fZm9jdXNOZXh0KCksdC5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25Fc2NLZXk6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5mb2N1c2VkSXRlbTtlJiZlLmJsdXIoKX0sX29uS2V5ZG93bjpmdW5jdGlvbih0KXt0aGlzLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyh0LCJ1cCBkb3duIGVzYyIpfHx0aGlzLl9mb2N1c1dpdGhLZXlib2FyZEV2ZW50KHQpLHQuc3RvcFByb3BhZ2F0aW9uKCl9LF9hY3RpdmF0ZUhhbmRsZXI6ZnVuY3Rpb24odCl7am8uX2FjdGl2YXRlSGFuZGxlci5jYWxsKHRoaXMsdCksdC5zdG9wUHJvcGFnYXRpb24oKX0sX2Rpc2FibGVkQ2hhbmdlZDpmdW5jdGlvbih0KXt0Pyh0aGlzLl9wcmV2aW91c1RhYkluZGV4PXRoaXMuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpP3RoaXMudGFiSW5kZXg6MCx0aGlzLnJlbW92ZUF0dHJpYnV0ZSgidGFiaW5kZXgiKSk6dGhpcy5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil8fHRoaXMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsdGhpcy5fcHJldmlvdXNUYWJJbmRleCl9LF9zaGlmdFRhYlByZXNzZWQ6ITF9LEphPVtbam8sS2FdLHpvLFphXTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovClJyKHtfdGVtcGxhdGU6X2VgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiA4cHggMDsKCiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItbGlzdGJveC1iYWNrZ3JvdW5kLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3IpKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItbGlzdGJveC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWxpc3Rib3g7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgpgLGlzOiJwYXBlci1saXN0Ym94IixiZWhhdmlvcnM6W0phXSxob3N0QXR0cmlidXRlczp7cm9sZToibGlzdGJveCJ9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBRYT1fZWAKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLW1hdGVyaWFsLXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMSJdKSB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjIiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tNGRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIzIl0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTZkcDsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iNCJdKSB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi04ZHA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjUiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CmA7UWEuc2V0QXR0cmlidXRlKCJzdHlsZSIsImRpc3BsYXk6IG5vbmU7IiksZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChRYS5jb250ZW50KSwKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovClJyKHtfdGVtcGxhdGU6X2VgCiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItbWF0ZXJpYWwtc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoW2FuaW1hdGVkXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy10cmFuc2l0aW9uOwogICAgICB9CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CmAsaXM6InBhcGVyLW1hdGVyaWFsIixwcm9wZXJ0aWVzOntlbGV2YXRpb246e3R5cGU6TnVtYmVyLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZToxfSxhbmltYXRlZDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMX19fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCB0cz17cHJvcGVydGllczp7dmFsdWU6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sbWluOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sbWF4Ont0eXBlOk51bWJlcix2YWx1ZToxMDAsbm90aWZ5OiEwfSxzdGVwOnt0eXBlOk51bWJlcix2YWx1ZToxLG5vdGlmeTohMH0scmF0aW86e3R5cGU6TnVtYmVyLHZhbHVlOjAscmVhZE9ubHk6ITAsbm90aWZ5OiEwfX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZSh2YWx1ZSwgbWluLCBtYXgsIHN0ZXApIl0sX2NhbGNSYXRpbzpmdW5jdGlvbih0KXtyZXR1cm4odGhpcy5fY2xhbXBWYWx1ZSh0KS10aGlzLm1pbikvKHRoaXMubWF4LXRoaXMubWluKX0sX2NsYW1wVmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgubWluKHRoaXMubWF4LE1hdGgubWF4KHRoaXMubWluLHRoaXMuX2NhbGNTdGVwKHQpKSl9LF9jYWxjU3RlcDpmdW5jdGlvbih0KXtpZih0PXBhcnNlRmxvYXQodCksIXRoaXMuc3RlcClyZXR1cm4gdDt2YXIgZT1NYXRoLnJvdW5kKCh0LXRoaXMubWluKS90aGlzLnN0ZXApO3JldHVybiB0aGlzLnN0ZXA8MT9lLygxL3RoaXMuc3RlcCkrdGhpcy5taW46ZSp0aGlzLnN0ZXArdGhpcy5taW59LF92YWxpZGF0ZVZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnZhbHVlKTtyZXR1cm4gdGhpcy52YWx1ZT10aGlzLm9sZFZhbHVlPWlzTmFOKHQpP3RoaXMub2xkVmFsdWU6dCx0aGlzLnZhbHVlIT09dH0sX3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX3ZhbGlkYXRlVmFsdWUoKSx0aGlzLl9zZXRSYXRpbygxMDAqdGhpcy5fY2FsY1JhdGlvKHRoaXMudmFsdWUpKX19OwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9Scih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDIwMHB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSksIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgICNwcm9ncmVzc0NvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItcHJvZ3Jlc3MtY29udGFpbmVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzQ29udGFpbmVyLAogICAgICAvKiB0aGUgc3RyaXBlIGZvciB0aGUgaW5kZXRlcm1pbmF0ZSBhbmltYXRpb24qLwogICAgICAuaW5kZXRlcm1pbmF0ZTo6YWZ0ZXIgewogICAgICAgIGhlaWdodDogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtaGVpZ2h0LCA0cHgpOwogICAgICB9CgogICAgICAjcHJpbWFyeVByb2dyZXNzLAogICAgICAjc2Vjb25kYXJ5UHJvZ3Jlc3MsCiAgICAgIC5pbmRldGVybWluYXRlOjphZnRlciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZpdDsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzQ29udGFpbmVyLAogICAgICAuaW5kZXRlcm1pbmF0ZTo6YWZ0ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWNvbnRhaW5lci1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZXktMzAwKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KC50cmFuc2l0aW5nKSAjcHJpbWFyeVByb2dyZXNzLAogICAgICA6aG9zdCgudHJhbnNpdGluZykgI3NlY29uZGFyeVByb2dyZXNzIHsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IC13ZWJraXQtdHJhbnNmb3JtOwogICAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybTsKCiAgICAgICAgLyogRHVyYXRpb24gKi8KICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tZHVyYXRpb24sIDAuMDhzKTsKICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLWR1cmF0aW9uLCAwLjA4cyk7CgogICAgICAgIC8qIFRpbWluZyBmdW5jdGlvbiAqLwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uLCBlYXNlKTsKICAgICAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24sIGVhc2UpOwoKICAgICAgICAvKiBEZWxheSAqLwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1kZWxheTogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi1kZWxheSwgMHMpOwogICAgICAgIHRyYW5zaXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tZGVsYXksIDBzKTsKICAgICAgfQoKICAgICAgI3ByaW1hcnlQcm9ncmVzcywKICAgICAgI3NlY29uZGFyeVByb2dyZXNzIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgwKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgwKTsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAjcHJpbWFyeVByb2dyZXNzIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1wcm9ncmVzcy1hY3RpdmUtY29sb3IsIHZhcigtLWdvb2dsZS1ncmVlbi01MDApKTsKICAgICAgfQoKICAgICAgI3NlY29uZGFyeVByb2dyZXNzIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1wcm9ncmVzcy1zZWNvbmRhcnktY29sb3IsIHZhcigtLWdvb2dsZS1ncmVlbi0xMDApKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgI3ByaW1hcnlQcm9ncmVzcyB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtZGlzYWJsZWQtYWN0aXZlLWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JleS01MDApKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgI3NlY29uZGFyeVByb2dyZXNzIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1wcm9ncmVzcy1kaXNhYmxlZC1zZWNvbmRhcnktY29sb3IsIHZhcigtLWdvb2dsZS1ncmV5LTMwMCkpOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtkaXNhYmxlZF0pKSAjcHJpbWFyeVByb2dyZXNzLmluZGV0ZXJtaW5hdGUgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgY2VudGVyOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogaW5kZXRlcm1pbmF0ZS1iYXIgdmFyKC0tcGFwZXItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZS1jeWNsZS1kdXJhdGlvbiwgMnMpIGxpbmVhciBpbmZpbml0ZTsKICAgICAgICBhbmltYXRpb246IGluZGV0ZXJtaW5hdGUtYmFyIHZhcigtLXBhcGVyLXByb2dyZXNzLWluZGV0ZXJtaW5hdGUtY3ljbGUtZHVyYXRpb24sIDJzKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIDpob3N0KDpub3QoW2Rpc2FibGVkXSkpICNwcmltYXJ5UHJvZ3Jlc3MuaW5kZXRlcm1pbmF0ZTo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOwoKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogaW5kZXRlcm1pbmF0ZS1zcGxpdHRlciB2YXIoLS1wYXBlci1wcm9ncmVzcy1pbmRldGVybWluYXRlLWN5Y2xlLWR1cmF0aW9uLCAycykgbGluZWFyIGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbjogaW5kZXRlcm1pbmF0ZS1zcGxpdHRlciB2YXIoLS1wYXBlci1wcm9ncmVzcy1pbmRldGVybWluYXRlLWN5Y2xlLWR1cmF0aW9uLCAycykgbGluZWFyIGluZmluaXRlOwogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgaW5kZXRlcm1pbmF0ZS1iYXIgewogICAgICAgIDAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgtMTAwJSk7CiAgICAgICAgfQogICAgICAgIDUwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgIH0KICAgICAgICA3NSUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKC4yOCwuNjIsLjM3LC45MSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgwKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBpbmRldGVybWluYXRlLXNwbGl0dGVyIHsKICAgICAgICAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgtMTI1JSk7CiAgICAgICAgfQogICAgICAgIDMwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgtMTI1JSk7CiAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllciguNDIsMCwuNiwuOCk7CiAgICAgICAgfQogICAgICAgIDkwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgxMjUlKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgxMjUlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgaW5kZXRlcm1pbmF0ZS1iYXIgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoLTEwMCUpOwogICAgICAgIH0KICAgICAgICA1MCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgfQogICAgICAgIDc1JSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllciguMjgsLjYyLC4zNywuOTEpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDApIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBpbmRldGVybWluYXRlLXNwbGl0dGVyIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoLTEyNSUpOwogICAgICAgIH0KICAgICAgICAzMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKC0xMjUlKTsKICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllciguNDIsMCwuNiwuOCk7CiAgICAgICAgfQogICAgICAgIDkwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoMTI1JSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKDEyNSUpOwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJwcm9ncmVzc0NvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9InNlY29uZGFyeVByb2dyZXNzIiBoaWRkZW5cJD0iW1tfaGlkZVNlY29uZGFyeVByb2dyZXNzKHNlY29uZGFyeVJhdGlvKV1dIj48L2Rpdj4KICAgICAgPGRpdiBpZD0icHJpbWFyeVByb2dyZXNzIj48L2Rpdj4KICAgIDwvZGl2PgpgLGlzOiJwYXBlci1wcm9ncmVzcyIsYmVoYXZpb3JzOlt0c10scHJvcGVydGllczp7c2Vjb25kYXJ5UHJvZ3Jlc3M6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LHNlY29uZGFyeVJhdGlvOnt0eXBlOk51bWJlcix2YWx1ZTowLHJlYWRPbmx5OiEwfSxpbmRldGVybWluYXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il90b2dnbGVJbmRldGVybWluYXRlIn0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsb2JzZXJ2ZXI6Il9kaXNhYmxlZENoYW5nZWQifX0sb2JzZXJ2ZXJzOlsiX3Byb2dyZXNzQ2hhbmdlZChzZWNvbmRhcnlQcm9ncmVzcywgdmFsdWUsIG1pbiwgbWF4LCBpbmRldGVybWluYXRlKSJdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJwcm9ncmVzc2JhciJ9LF90b2dnbGVJbmRldGVybWluYXRlOmZ1bmN0aW9uKHQpe3RoaXMudG9nZ2xlQ2xhc3MoImluZGV0ZXJtaW5hdGUiLHQsdGhpcy4kLnByaW1hcnlQcm9ncmVzcyl9LF90cmFuc2Zvcm1Qcm9ncmVzczpmdW5jdGlvbih0LGUpe3Quc3R5bGUudHJhbnNmb3JtPXQuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJzY2FsZVgoIitlLzEwMCsiKSJ9LF9tYWluUmF0aW9DaGFuZ2VkOmZ1bmN0aW9uKHQpe3RoaXMuX3RyYW5zZm9ybVByb2dyZXNzKHRoaXMuJC5wcmltYXJ5UHJvZ3Jlc3MsdCl9LF9wcm9ncmVzc0NoYW5nZWQ6ZnVuY3Rpb24odCxlLG4saSxyKXt0PXRoaXMuX2NsYW1wVmFsdWUodCksZT10aGlzLl9jbGFtcFZhbHVlKGUpO3ZhciBvPTEwMCp0aGlzLl9jYWxjUmF0aW8odCksYT0xMDAqdGhpcy5fY2FsY1JhdGlvKGUpO3RoaXMuX3NldFNlY29uZGFyeVJhdGlvKG8pLHRoaXMuX3RyYW5zZm9ybVByb2dyZXNzKHRoaXMuJC5zZWNvbmRhcnlQcm9ncmVzcyxvKSx0aGlzLl90cmFuc2Zvcm1Qcm9ncmVzcyh0aGlzLiQucHJpbWFyeVByb2dyZXNzLGEpLHRoaXMuc2Vjb25kYXJ5UHJvZ3Jlc3M9dCxyP3RoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLXZhbHVlbm93Iik6dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVub3ciLGUpLHRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbWluIixuKSx0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW1heCIsaSl9LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24odCl7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiLHQ/InRydWUiOiJmYWxzZSIpfSxfaGlkZVNlY29uZGFyeVByb2dyZXNzOmZ1bmN0aW9uKHQpe3JldHVybiAwPT09dH19KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgZXM9X2VgCjxzdHlsZT4KICA6aG9zdCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBsaW5lLWhlaWdodDogMDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1zaXplOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tc2l6ZSwgMTZweCk7CiAgICAvKiAtMXB4IGlzIGEgc2VudGluZWwgZm9yIHRoZSBkZWZhdWx0IGFuZCBpcyByZXBsYWNlIGluIFxgYXR0YWNoZWRcYC4gKi8KICAgIC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemU6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZSwgLTFweCk7CiAgfQoKICA6aG9zdCg6Zm9jdXMpIHsKICAgIG91dGxpbmU6IG5vbmU7CiAgfQoKICAjcmFkaW9Db250YWluZXIgewogICAgQGFwcGx5IC0tbGF5b3V0LWlubGluZTsKICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItY2VudGVyOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemUpOwogICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1zaXplKTsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgogICAgQGFwcGx5IC0tcGFwZXItcmFkaW8tYnV0dG9uLXJhZGlvLWNvbnRhaW5lcjsKICB9CgogICNpbmsgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA1MCU7CiAgICBsZWZ0OiA1MCU7CiAgICByaWdodDogYXV0bzsKICAgIHdpZHRoOiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZSk7CiAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplKTsKICAgIGNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICBvcGFjaXR5OiAwLjY7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICB9CgogICNpbmtbY2hlY2tlZF0gewogICAgY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogIH0KCiAgI29mZlJhZGlvLCAjb25SYWRpbyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgdG9wOiAwOwogICAgbGVmdDogMDsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogIH0KCiAgI29mZlJhZGlvIHsKICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLXVuY2hlY2tlZC1iYWNrZ3JvdW5kLWNvbG9yLCB0cmFuc3BhcmVudCk7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4yOHM7CiAgfQoKICAjb25SYWRpbyB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApOwogICAgdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIGVhc2UgMC4yOHM7CiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gZWFzZSAwLjI4czsKICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgfQoKICA6aG9zdChbY2hlY2tlZF0pICNvZmZSYWRpbyB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgfQoKICA6aG9zdChbY2hlY2tlZF0pICNvblJhZGlvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjUpOwogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjUpOwogIH0KCiAgI3JhZGlvTGFiZWwgewogICAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICBtYXJnaW4tbGVmdDogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWxhYmVsLXNwYWNpbmcsIDEwcHgpOwogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgIGNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwoKICAgIEBhcHBseSAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbDsKICB9CgogIDpob3N0KFtjaGVja2VkXSkgI3JhZGlvTGFiZWwgewogICAgQGFwcGx5IC0tcGFwZXItcmFkaW8tYnV0dG9uLWxhYmVsLWNoZWNrZWQ7CiAgfQoKICAjcmFkaW9MYWJlbDpkaXIocnRsKSB7CiAgICBtYXJnaW4tbGVmdDogMDsKICAgIG1hcmdpbi1yaWdodDogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWxhYmVsLXNwYWNpbmcsIDEwcHgpOwogIH0KCiAgI3JhZGlvTGFiZWxbaGlkZGVuXSB7CiAgICBkaXNwbGF5OiBub25lOwogIH0KCiAgLyogZGlzYWJsZWQgc3RhdGUgKi8KCiAgOmhvc3QoW2Rpc2FibGVkXSkgI29mZlJhZGlvIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICBvcGFjaXR5OiAwLjU7CiAgfQoKICA6aG9zdChbZGlzYWJsZWRdW2NoZWNrZWRdKSAjb25SYWRpbyB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgIG9wYWNpdHk6IDAuNTsKICB9CgogIDpob3N0KFtkaXNhYmxlZF0pICNyYWRpb0xhYmVsIHsKICAgIC8qIHNsaWdodGx5IGRhcmtlciB0aGFuIHRoZSBidXR0b24sIHNvIHRoYXQgaXQncyByZWFkYWJsZSAqLwogICAgb3BhY2l0eTogMC42NTsKICB9Cjwvc3R5bGU+Cgo8ZGl2IGlkPSJyYWRpb0NvbnRhaW5lciI+CiAgPGRpdiBpZD0ib2ZmUmFkaW8iPjwvZGl2PgogIDxkaXYgaWQ9Im9uUmFkaW8iPjwvZGl2Pgo8L2Rpdj4KCjxkaXYgaWQ9InJhZGlvTGFiZWwiPjxzbG90Pjwvc2xvdD48L2Rpdj5gO2VzLnNldEF0dHJpYnV0ZSgic3RyaXAtd2hpdGVzcGFjZSIsIiIpLFJyKHtfdGVtcGxhdGU6ZXMsaXM6InBhcGVyLXJhZGlvLWJ1dHRvbiIsYmVoYXZpb3JzOlt1YV0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InJhZGlvIiwiYXJpYS1jaGVja2VkIjohMSx0YWJpbmRleDowfSxwcm9wZXJ0aWVzOnthcmlhQWN0aXZlQXR0cmlidXRlOnt0eXBlOlN0cmluZyx2YWx1ZToiYXJpYS1jaGVja2VkIn19LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fcmlwcGxlQ29udGFpbmVyPXRoaXMuJC5yYWRpb0NvbnRhaW5lcn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXtMaSh0aGlzLChmdW5jdGlvbigpe2lmKCItMXB4Ij09PXRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCItLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplIikudHJpbSgpKXt2YXIgdD1wYXJzZUZsb2F0KHRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCItLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemUiKS50cmltKCkpLGU9TWF0aC5mbG9vcigzKnQpO2UlMiE9dCUyJiZlKyssdGhpcy51cGRhdGVTdHlsZXMoeyItLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZSI6ZSsicHgifSl9fSkpfX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgbnM9e2hvc3RBdHRyaWJ1dGVzOntyb2xlOiJtZW51YmFyIn0sa2V5QmluZGluZ3M6e2xlZnQ6Il9vbkxlZnRLZXkiLHJpZ2h0OiJfb25SaWdodEtleSJ9LF9vblVwS2V5OmZ1bmN0aW9uKHQpe3RoaXMuZm9jdXNlZEl0ZW0uY2xpY2soKSx0LmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LF9vbkRvd25LZXk6ZnVuY3Rpb24odCl7dGhpcy5mb2N1c2VkSXRlbS5jbGljaygpLHQuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sZ2V0IF9pc1JUTCgpe3JldHVybiJydGwiPT09d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcykuZGlyZWN0aW9ufSxfb25MZWZ0S2V5OmZ1bmN0aW9uKHQpe3RoaXMuX2lzUlRMP3RoaXMuX2ZvY3VzTmV4dCgpOnRoaXMuX2ZvY3VzUHJldmlvdXMoKSx0LmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LF9vblJpZ2h0S2V5OmZ1bmN0aW9uKHQpe3RoaXMuX2lzUlRMP3RoaXMuX2ZvY3VzUHJldmlvdXMoKTp0aGlzLl9mb2N1c05leHQoKSx0LmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LF9vbktleWRvd246ZnVuY3Rpb24odCl7dGhpcy5rZXlib2FyZEV2ZW50TWF0Y2hlc0tleXModCwidXAgZG93biBsZWZ0IHJpZ2h0IGVzYyIpfHx0aGlzLl9mb2N1c1dpdGhLZXlib2FyZEV2ZW50KHQpfX0saXM9W0phLG5zXTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovClJyKHtfdGVtcGxhdGU6X2VgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgcGFkZGluZzogdmFyKC0tcGFwZXItcmFkaW8tZ3JvdXAtaXRlbS1wYWRkaW5nLCAxMnB4KTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CmAsaXM6InBhcGVyLXJhZGlvLWdyb3VwIixiZWhhdmlvcnM6W2lzXSxob3N0QXR0cmlidXRlczp7cm9sZToicmFkaW9ncm91cCJ9LHByb3BlcnRpZXM6e2F0dHJGb3JTZWxlY3RlZDp7dHlwZTpTdHJpbmcsdmFsdWU6Im5hbWUifSxzZWxlY3RlZEF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImNoZWNrZWQifSxzZWxlY3RhYmxlOnt0eXBlOlN0cmluZyx2YWx1ZToicGFwZXItcmFkaW8tYnV0dG9uIn0sYWxsb3dFbXB0eVNlbGVjdGlvbjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sc2VsZWN0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3ZhbHVlVG9JdGVtKHQpO2lmKCFlfHwhZS5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIikpe2lmKHRoaXMuc2VsZWN0ZWQpe3ZhciBuPXRoaXMuX3ZhbHVlVG9JdGVtKHRoaXMuc2VsZWN0ZWQpO2lmKHRoaXMuc2VsZWN0ZWQ9PXQpe2lmKCF0aGlzLmFsbG93RW1wdHlTZWxlY3Rpb24pcmV0dXJuIHZvaWQobiYmKG4uY2hlY2tlZD0hMCkpO3Q9IiJ9biYmKG4uY2hlY2tlZD0hMSl9am8uc2VsZWN0LmFwcGx5KHRoaXMsW3RdKSx0aGlzLmZpcmUoInBhcGVyLXJhZGlvLWdyb3VwLWNoYW5nZWQiKX19LF9hY3RpdmF0ZUZvY3VzZWRJdGVtOmZ1bmN0aW9uKCl7dGhpcy5faXRlbUFjdGl2YXRlKHRoaXMuX3ZhbHVlRm9ySXRlbSh0aGlzLmZvY3VzZWRJdGVtKSx0aGlzLmZvY3VzZWRJdGVtKX0sX29uVXBLZXk6ZnVuY3Rpb24odCl7dGhpcy5fZm9jdXNQcmV2aW91cygpLHQucHJldmVudERlZmF1bHQoKSx0aGlzLl9hY3RpdmF0ZUZvY3VzZWRJdGVtKCl9LF9vbkRvd25LZXk6ZnVuY3Rpb24odCl7dGhpcy5fZm9jdXNOZXh0KCksdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX0sX29uTGVmdEtleTpmdW5jdGlvbih0KXtucy5fb25MZWZ0S2V5LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9hY3RpdmF0ZUZvY3VzZWRJdGVtKCl9LF9vblJpZ2h0S2V5OmZ1bmN0aW9uKHQpe25zLl9vblJpZ2h0S2V5LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9hY3RpdmF0ZUZvY3VzZWRJdGVtKCl9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBycz1fZWAKICA8c3R5bGU+CiAgICA6aG9zdCB7CiAgICAgIEBhcHBseSAtLWxheW91dDsKICAgICAgQGFwcGx5IC0tbGF5b3V0LWp1c3RpZmllZDsKICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgd2lkdGg6IDIwMHB4OwogICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTsKICAgICAgLS1wYXBlci1wcm9ncmVzcy1hY3RpdmUtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgICAtLXBhcGVyLXByb2dyZXNzLXNlY29uZGFyeS1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtMzAwKSk7CiAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtZGlzYWJsZWQtYWN0aXZlLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItZGlzYWJsZWQtYWN0aXZlLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICAtLXBhcGVyLXByb2dyZXNzLWRpc2FibGVkLXNlY29uZGFyeS1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWRpc2FibGVkLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQ6IHZhcigtLXBhcGVyLXNsaWRlci1oZWlnaHQsIDJweCk7CiAgICB9CgogICAgLyogZm9jdXMgc2hvd3MgdGhlIHJpcHBsZSAqLwogICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgIG91dGxpbmU6IG5vbmU7CiAgICB9CgogICAgLyoqCiAgICAgICogTk9URShrZWFudWxlZSk6IFRob3VnaCA6aG9zdC1jb250ZXh0IGlzIG5vdCB1bml2ZXJzYWxseSBzdXBwb3J0ZWQsIHNvbWUgcGFnZXMKICAgICAgKiBzdGlsbCByZWx5IG9uIHBhcGVyLXNsaWRlciBiZWluZyBmbGlwcGVkIHdoZW4gZGlyPSJydGwiIGlzIHNldCBvbiBib2R5LiBGb3IgZnVsbAogICAgICAqIGNvbXBhdGliaWxpdHksIGRpcj0icnRsIiBtdXN0IGJlIGV4cGxpY2l0bHkgc2V0IG9uIHBhcGVyLXNsaWRlci4KICAgICAgKi8KICAgIDpkaXIocnRsKSAjc2xpZGVyQ29udGFpbmVyIHsKICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgtMSk7CiAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC0xKTsKICAgIH0KCiAgICAvKioKICAgICAgKiBOT1RFKGtlYW51bGVlKTogVGhpcyBpcyBzZXBhcmF0ZSBmcm9tIHRoZSBydWxlIGFib3ZlIGJlY2F1c2UgOmhvc3QtY29udGV4dCBtYXkKICAgICAgKiBub3QgYmUgcmVjb2duaXplZC4KICAgICAgKi8KICAgIDpob3N0KFtkaXI9InJ0bCJdKSAjc2xpZGVyQ29udGFpbmVyIHsKICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgtMSk7CiAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC0xKTsKICAgIH0KCiAgICAvKioKICAgICAgKiBOT1RFKGtlYW51bGVlKTogTmVlZGVkIHRvIG92ZXJyaWRlIHRoZSA6aG9zdC1jb250ZXh0IHJ1bGUgKHdoZXJlIHN1cHBvcnRlZCkKICAgICAgKiB0byBzdXBwb3J0IExUUiBzbGlkZXJzIGluIFJUTCBwYWdlcy4KICAgICAgKi8KICAgIDpob3N0KFtkaXI9Imx0ciJdKSAjc2xpZGVyQ29udGFpbmVyIHsKICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgxKTsKICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSk7CiAgICB9CgogICAgI3NsaWRlckNvbnRhaW5lciB7CiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIGhlaWdodDogY2FsYygzMHB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KSk7CiAgICAgIG1hcmdpbi1sZWZ0OiBjYWxjKDE1cHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgICBtYXJnaW4tcmlnaHQ6IGNhbGMoMTVweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICB9CgogICAgI3NsaWRlckNvbnRhaW5lcjpmb2N1cyB7CiAgICAgIG91dGxpbmU6IDA7CiAgICB9CgogICAgI3NsaWRlckNvbnRhaW5lci5lZGl0YWJsZSB7CiAgICAgIG1hcmdpbi10b3A6IDEycHg7CiAgICAgIG1hcmdpbi1ib3R0b206IDEycHg7CiAgICB9CgogICAgLmJhci1jb250YWluZXIgewogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHRvcDogMDsKICAgICAgYm90dG9tOiAwOwogICAgICBsZWZ0OiAwOwogICAgICByaWdodDogMDsKICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIH0KCiAgICAucmluZyA+IC5iYXItY29udGFpbmVyIHsKICAgICAgbGVmdDogY2FsYyg1cHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgICB0cmFuc2l0aW9uOiBsZWZ0IDAuMThzIGVhc2U7CiAgICB9CgogICAgLnJpbmcuZXhwYW5kLmRyYWdnaW5nID4gLmJhci1jb250YWluZXIgewogICAgICB0cmFuc2l0aW9uOiBub25lOwogICAgfQoKICAgIC5yaW5nLmV4cGFuZDpub3QoLnBpbikgPiAuYmFyLWNvbnRhaW5lciB7CiAgICAgIGxlZnQ6IGNhbGMoOHB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgIH0KCiAgICAjc2xpZGVyQmFyIHsKICAgICAgcGFkZGluZzogMTVweCAwOwogICAgICB3aWR0aDogMTAwJTsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWJhci1jb2xvciwgdHJhbnNwYXJlbnQpOwogICAgICAtLXBhcGVyLXByb2dyZXNzLWNvbnRhaW5lci1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWNvbnRhaW5lci1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgLS1wYXBlci1wcm9ncmVzcy1oZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCk7CiAgICB9CgogICAgLnNsaWRlci1tYXJrZXJzIHsKICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAvKiBzbGlkZXIta25vYiBpcyAzMHB4ICsgdGhlIHNsaWRlci1oZWlnaHQgc28gdGhhdCB0aGUgbWFya2VycyBzaG91bGQgc3RhcnQgYXQgYSBvZmZzZXQgb2YgMTVweCovCiAgICAgIHRvcDogMTVweDsKICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpOwogICAgICBsZWZ0OiAwOwogICAgICByaWdodDogLTFweDsKICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgfQoKICAgIC5zbGlkZXItbWFya2VyIHsKICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICB9CiAgICAuc2xpZGVyLW1hcmtlcnM6OmFmdGVyLAogICAgLnNsaWRlci1tYXJrZXI6OmFmdGVyIHsKICAgICAgY29udGVudDogIiI7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICBtYXJnaW4tbGVmdDogLTFweDsKICAgICAgd2lkdGg6IDJweDsKICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpOwogICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1tYXJrZXJzLWNvbG9yLCAjMDAwKTsKICAgIH0KCiAgICAuc2xpZGVyLWtub2IgewogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIGxlZnQ6IDA7CiAgICAgIHRvcDogMDsKICAgICAgbWFyZ2luLWxlZnQ6IGNhbGMoLTE1cHggLSB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgICB3aWR0aDogY2FsYygzMHB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KSk7CiAgICAgIGhlaWdodDogY2FsYygzMHB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KSk7CiAgICB9CgogICAgLnRyYW5zaXRpbmcgPiAuc2xpZGVyLWtub2IgewogICAgICB0cmFuc2l0aW9uOiBsZWZ0IDAuMDhzIGVhc2U7CiAgICB9CgogICAgLnNsaWRlci1rbm9iOmZvY3VzIHsKICAgICAgb3V0bGluZTogbm9uZTsKICAgIH0KCiAgICAuc2xpZGVyLWtub2IuZHJhZ2dpbmcgewogICAgICB0cmFuc2l0aW9uOiBub25lOwogICAgfQoKICAgIC5zbmFwcyA+IC5zbGlkZXIta25vYi5kcmFnZ2luZyB7CiAgICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuMDhzIGVhc2U7CiAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjA4cyBlYXNlOwogICAgfQoKICAgIC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgIG1hcmdpbjogMTBweDsKICAgICAgd2lkdGg6IGNhbGMoMTAwJSAtIDIwcHgpOwogICAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDIwcHgpOwogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNzAwKSk7CiAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwoKICAgICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwoKICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm0sIGJhY2tncm91bmQtY29sb3IsIGJvcmRlcjsKICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXI7CiAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMThzOwogICAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsKICAgIH0KCiAgICAuZXhwYW5kOm5vdCgucGluKSA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLjUpOwogICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuNSk7CiAgICB9CgogICAgLnJpbmcgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXIgewogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvciwgdHJhbnNwYXJlbnQpOwogICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICB9CgogICAgLnNsaWRlci1rbm9iLWlubmVyOjpiZWZvcmUgewogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItcGluLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgIH0KCiAgICAucGluID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjpiZWZvcmUgewogICAgICBjb250ZW50OiAiIjsKICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB0b3A6IDA7CiAgICAgIGxlZnQ6IDUwJTsKICAgICAgbWFyZ2luLWxlZnQ6IC0xM3B4OwogICAgICB3aWR0aDogMjZweDsKICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICBib3JkZXItcmFkaXVzOiA1MCUgNTAlIDUwJSAwOwoKICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpIHNjYWxlKDApIHRyYW5zbGF0ZSgwKTsKICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICB9CgogICAgLnNsaWRlci1rbm9iLWlubmVyOjpiZWZvcmUsCiAgICAuc2xpZGVyLWtub2ItaW5uZXI6OmFmdGVyIHsKICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gLjE4cyBlYXNlLCBiYWNrZ3JvdW5kLWNvbG9yIC4xOHMgZWFzZTsKICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIC4xOHMgZWFzZSwgYmFja2dyb3VuZC1jb2xvciAuMThzIGVhc2U7CiAgICB9CgogICAgLnBpbi5yaW5nID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjpiZWZvcmUgewogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgfQoKICAgIC5waW4uZXhwYW5kID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjpiZWZvcmUgewogICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC00NWRlZykgc2NhbGUoMSkgdHJhbnNsYXRlKDE3cHgsIC0xN3B4KTsKICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgxKSB0cmFuc2xhdGUoMTdweCwgLTE3cHgpOwogICAgfQoKICAgIC5waW4gPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmFmdGVyIHsKICAgICAgY29udGVudDogYXR0cih2YWx1ZSk7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgdG9wOiAwOwogICAgICBsZWZ0OiA1MCU7CiAgICAgIG1hcmdpbi1sZWZ0OiAtMTZweDsKICAgICAgd2lkdGg6IDMycHg7CiAgICAgIGhlaWdodDogMjZweDsKICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICBjb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWZvbnQtY29sb3IsICNmZmYpOwogICAgICBmb250LXNpemU6IDEwcHg7CgogICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCkgdHJhbnNsYXRlKDApOwogICAgICB0cmFuc2Zvcm06IHNjYWxlKDApIHRyYW5zbGF0ZSgwKTsKICAgIH0KCiAgICAucGluLmV4cGFuZCA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lcjo6YWZ0ZXIgewogICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSkgdHJhbnNsYXRlKDAsIC0xN3B4KTsKICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKSB0cmFuc2xhdGUoMCwgLTE3cHgpOwogICAgfQoKICAgIC8qIHBhcGVyLWlucHV0ICovCiAgICAuc2xpZGVyLWlucHV0IHsKICAgICAgd2lkdGg6IDUwcHg7CiAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXNsaWRlci1pbnB1dC1jb250YWluZXItaW5wdXQ7CiAgICAgIH07CiAgICAgIEBhcHBseSAtLXBhcGVyLXNsaWRlci1pbnB1dDsKICAgIH0KCiAgICAvKiBkaXNhYmxlZCBzdGF0ZSAqLwogICAgI3NsaWRlckNvbnRhaW5lci5kaXNhYmxlZCB7CiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgfQoKICAgIC5kaXNhYmxlZCA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1kaXNhYmxlZC1rbm9iLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1zbGlkZXItZGlzYWJsZWQta25vYi1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoMC43NSwgMC43NSwgMSk7CiAgICAgIHRyYW5zZm9ybTogc2NhbGUzZCgwLjc1LCAwLjc1LCAxKTsKICAgIH0KCiAgICAuZGlzYWJsZWQucmluZyA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yLCB0cmFuc3BhcmVudCk7CiAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgIH0KCiAgICBwYXBlci1yaXBwbGUgewogICAgICBjb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgfQogIDwvc3R5bGU+CgogIDxkaXYgaWQ9InNsaWRlckNvbnRhaW5lciIgY2xhc3NcJD0iW1tfZ2V0Q2xhc3NOYW1lcyhkaXNhYmxlZCwgcGluLCBzbmFwcywgaW1tZWRpYXRlVmFsdWUsIG1pbiwgZXhwYW5kLCBkcmFnZ2luZywgdHJhbnNpdGluZywgZWRpdGFibGUpXV0iPgogICAgPGRpdiBjbGFzcz0iYmFyLWNvbnRhaW5lciI+CiAgICAgIDxwYXBlci1wcm9ncmVzcyBkaXNhYmxlZFwkPSJbW2Rpc2FibGVkXV0iIGlkPSJzbGlkZXJCYXIiIGFyaWEtaGlkZGVuPSJ0cnVlIiBtaW49IltbbWluXV0iIG1heD0iW1ttYXhdXSIgc3RlcD0iW1tzdGVwXV0iIHZhbHVlPSJbW2ltbWVkaWF0ZVZhbHVlXV0iIHNlY29uZGFyeS1wcm9ncmVzcz0iW1tzZWNvbmRhcnlQcm9ncmVzc11dIiBvbi1kb3duPSJfYmFyZG93biIgb24tdXA9Il9yZXNldEtub2IiIG9uLXRyYWNrPSJfYmFydHJhY2siIG9uLXRhcD0iX2JhcmNsaWNrIj4KICAgICAgPC9wYXBlci1wcm9ncmVzcz4KICAgIDwvZGl2PgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzbmFwc11dIj4KICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLW1hcmtlcnMiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbbWFya2Vyc11dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1tYXJrZXIiPjwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KCiAgICA8ZGl2IGlkPSJzbGlkZXJLbm9iIiBjbGFzcz0ic2xpZGVyLWtub2IiIG9uLWRvd249Il9rbm9iZG93biIgb24tdXA9Il9yZXNldEtub2IiIG9uLXRyYWNrPSJfb25UcmFjayIgb24tdHJhbnNpdGlvbmVuZD0iX2tub2JUcmFuc2l0aW9uRW5kIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXIta25vYi1pbm5lciIgdmFsdWVcJD0iW1tpbW1lZGlhdGVWYWx1ZV1dIj48L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2PgoKICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbZWRpdGFibGVdXSI+CiAgICA8cGFwZXItaW5wdXQgaWQ9ImlucHV0IiB0eXBlPSJudW1iZXIiIHN0ZXA9Iltbc3RlcF1dIiBtaW49IltbbWluXV0iIG1heD0iW1ttYXhdXSIgY2xhc3M9InNsaWRlci1pbnB1dCIgZGlzYWJsZWRcJD0iW1tkaXNhYmxlZF1dIiB2YWx1ZT0iW1tpbW1lZGlhdGVWYWx1ZV1dIiBvbi1jaGFuZ2U9Il9jaGFuZ2VWYWx1ZSIgb24ta2V5ZG93bj0iX2lucHV0S2V5RG93biIgbm8tbGFiZWwtZmxvYXQ+CiAgICA8L3BhcGVyLWlucHV0PgogIDwvdGVtcGxhdGU+CmA7cnMuc2V0QXR0cmlidXRlKCJzdHJpcC13aGl0ZXNwYWNlIiwiIiksUnIoe190ZW1wbGF0ZTpycyxpczoicGFwZXItc2xpZGVyIixiZWhhdmlvcnM6W3pvLHJhLGNhLHRzXSxwcm9wZXJ0aWVzOnt2YWx1ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sc25hcHM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LHBpbjp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sc2Vjb25kYXJ5UHJvZ3Jlc3M6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwLG9ic2VydmVyOiJfc2Vjb25kYXJ5UHJvZ3Jlc3NDaGFuZ2VkIn0sZWRpdGFibGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0saW1tZWRpYXRlVmFsdWU6e3R5cGU6TnVtYmVyLHZhbHVlOjAscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxtYXhNYXJrZXJzOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sZXhwYW5kOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVhZE9ubHk6ITB9LGlnbm9yZUJhclRvdWNoOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGRyYWdnaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSx0cmFuc2l0aW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVhZE9ubHk6ITB9LG1hcmtlcnM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19fSxvYnNlcnZlcnM6WyJfdXBkYXRlS25vYih2YWx1ZSwgbWluLCBtYXgsIHNuYXBzLCBzdGVwKSIsIl92YWx1ZUNoYW5nZWQodmFsdWUpIiwiX2ltbWVkaWF0ZVZhbHVlQ2hhbmdlZChpbW1lZGlhdGVWYWx1ZSkiLCJfdXBkYXRlTWFya2VycyhtYXhNYXJrZXJzLCBtaW4sIG1heCwgc25hcHMpIl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InNsaWRlciIsdGFiaW5kZXg6MH0sa2V5QmluZGluZ3M6e2xlZnQ6Il9sZWZ0S2V5IixyaWdodDoiX3JpZ2h0S2V5IiwiZG93biBwYWdlZG93biBob21lIjoiX2RlY3JlbWVudEtleSIsInVwIHBhZ2V1cCBlbmQiOiJfaW5jcmVtZW50S2V5In0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmlnbm9yZUJhclRvdWNoJiZvaSh0aGlzLiQuc2xpZGVyQmFyLCJhdXRvIil9LGluY3JlbWVudDpmdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnZhbHVlK3RoaXMuc3RlcCl9LGRlY3JlbWVudDpmdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnZhbHVlLXRoaXMuc3RlcCl9LF91cGRhdGVLbm9iOmZ1bmN0aW9uKHQsZSxuLGkscil7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVtaW4iLGUpLHRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbWF4IixuKSx0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW5vdyIsdCksdGhpcy5fcG9zaXRpb25Lbm9iKDEwMCp0aGlzLl9jYWxjUmF0aW8odCkpfSxfdmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJ2YWx1ZS1jaGFuZ2UiLHtjb21wb3NlZDohMH0pfSxfaW1tZWRpYXRlVmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kcmFnZ2luZz90aGlzLmZpcmUoImltbWVkaWF0ZS12YWx1ZS1jaGFuZ2UiLHtjb21wb3NlZDohMH0pOnRoaXMudmFsdWU9dGhpcy5pbW1lZGlhdGVWYWx1ZX0sX3NlY29uZGFyeVByb2dyZXNzQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuc2Vjb25kYXJ5UHJvZ3Jlc3M9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnNlY29uZGFyeVByb2dyZXNzKX0sX2V4cGFuZEtub2I6ZnVuY3Rpb24oKXt0aGlzLl9zZXRFeHBhbmQoITApfSxfcmVzZXRLbm9iOmZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxEZWJvdW5jZXIoImV4cGFuZEtub2IiKSx0aGlzLl9zZXRFeHBhbmQoITEpfSxfcG9zaXRpb25Lbm9iOmZ1bmN0aW9uKHQpe3RoaXMuX3NldEltbWVkaWF0ZVZhbHVlKHRoaXMuX2NhbGNTdGVwKHRoaXMuX2NhbGNLbm9iUG9zaXRpb24odCkpKSx0aGlzLl9zZXRSYXRpbygxMDAqdGhpcy5fY2FsY1JhdGlvKHRoaXMuaW1tZWRpYXRlVmFsdWUpKSx0aGlzLiQuc2xpZGVyS25vYi5zdHlsZS5sZWZ0PXRoaXMucmF0aW8rIiUiLHRoaXMuZHJhZ2dpbmcmJih0aGlzLl9rbm9ic3RhcnR4PXRoaXMucmF0aW8qdGhpcy5fdy8xMDAsdGhpcy50cmFuc2xhdGUzZCgwLDAsMCx0aGlzLiQuc2xpZGVyS25vYikpfSxfY2FsY0tub2JQb3NpdGlvbjpmdW5jdGlvbih0KXtyZXR1cm4odGhpcy5tYXgtdGhpcy5taW4pKnQvMTAwK3RoaXMubWlufSxfb25UcmFjazpmdW5jdGlvbih0KXtzd2l0Y2godC5zdG9wUHJvcGFnYXRpb24oKSx0LmRldGFpbC5zdGF0ZSl7Y2FzZSJzdGFydCI6dGhpcy5fdHJhY2tTdGFydCh0KTticmVhaztjYXNlInRyYWNrIjp0aGlzLl90cmFja1godCk7YnJlYWs7Y2FzZSJlbmQiOnRoaXMuX3RyYWNrRW5kKCl9fSxfdHJhY2tTdGFydDpmdW5jdGlvbih0KXt0aGlzLl9zZXRUcmFuc2l0aW5nKCExKSx0aGlzLl93PXRoaXMuJC5zbGlkZXJCYXIub2Zmc2V0V2lkdGgsdGhpcy5feD10aGlzLnJhdGlvKnRoaXMuX3cvMTAwLHRoaXMuX3N0YXJ0eD10aGlzLl94LHRoaXMuX2tub2JzdGFydHg9dGhpcy5fc3RhcnR4LHRoaXMuX21pbng9LXRoaXMuX3N0YXJ0eCx0aGlzLl9tYXh4PXRoaXMuX3ctdGhpcy5fc3RhcnR4LHRoaXMuJC5zbGlkZXJLbm9iLmNsYXNzTGlzdC5hZGQoImRyYWdnaW5nIiksdGhpcy5fc2V0RHJhZ2dpbmcoITApfSxfdHJhY2tYOmZ1bmN0aW9uKHQpe3RoaXMuZHJhZ2dpbmd8fHRoaXMuX3RyYWNrU3RhcnQodCk7dmFyIGU9TWF0aC5taW4odGhpcy5fbWF4eCxNYXRoLm1heCh0aGlzLl9taW54LHQuZGV0YWlsLmR4Kih0aGlzLl9pc1JUTD8tMToxKSkpO3RoaXMuX3g9dGhpcy5fc3RhcnR4K2U7dmFyIG49dGhpcy5fY2FsY1N0ZXAodGhpcy5fY2FsY0tub2JQb3NpdGlvbih0aGlzLl94L3RoaXMuX3cqMTAwKSk7dGhpcy5fc2V0SW1tZWRpYXRlVmFsdWUobik7dmFyIGk9dGhpcy5fY2FsY1JhdGlvKHRoaXMuaW1tZWRpYXRlVmFsdWUpKnRoaXMuX3ctdGhpcy5fa25vYnN0YXJ0eDt0aGlzLnRyYW5zbGF0ZTNkKGkrInB4IiwwLDAsdGhpcy4kLnNsaWRlcktub2IpfSxfdHJhY2tFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLiQuc2xpZGVyS25vYi5zdHlsZTt0aGlzLiQuc2xpZGVyS25vYi5jbGFzc0xpc3QucmVtb3ZlKCJkcmFnZ2luZyIpLHRoaXMuX3NldERyYWdnaW5nKCExKSx0aGlzLl9yZXNldEtub2IoKSx0aGlzLnZhbHVlPXRoaXMuaW1tZWRpYXRlVmFsdWUsdC50cmFuc2Zvcm09dC53ZWJraXRUcmFuc2Zvcm09IiIsdGhpcy5maXJlKCJjaGFuZ2UiLHtjb21wb3NlZDohMH0pfSxfa25vYmRvd246ZnVuY3Rpb24odCl7dGhpcy5fZXhwYW5kS25vYigpLHQucHJldmVudERlZmF1bHQoKSx0aGlzLmZvY3VzKCl9LF9iYXJ0cmFjazpmdW5jdGlvbih0KXt0aGlzLl9hbGxvd0JhckV2ZW50KHQpJiZ0aGlzLl9vblRyYWNrKHQpfSxfYmFyY2xpY2s6ZnVuY3Rpb24odCl7dGhpcy5fdz10aGlzLiQuc2xpZGVyQmFyLm9mZnNldFdpZHRoO3ZhciBlPXRoaXMuJC5zbGlkZXJCYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj0odC5kZXRhaWwueC1lLmxlZnQpL3RoaXMuX3cqMTAwO3RoaXMuX2lzUlRMJiYobj0xMDAtbik7dmFyIGk9dGhpcy5yYXRpbzt0aGlzLl9zZXRUcmFuc2l0aW5nKCEwKSx0aGlzLl9wb3NpdGlvbktub2IobiksaT09PXRoaXMucmF0aW8mJnRoaXMuX3NldFRyYW5zaXRpbmcoITEpLHRoaXMuYXN5bmMoKGZ1bmN0aW9uKCl7dGhpcy5maXJlKCJjaGFuZ2UiLHtjb21wb3NlZDohMH0pfSkpLHQucHJldmVudERlZmF1bHQoKSx0aGlzLmZvY3VzKCl9LF9iYXJkb3duOmZ1bmN0aW9uKHQpe3RoaXMuX2FsbG93QmFyRXZlbnQodCkmJih0aGlzLmRlYm91bmNlKCJleHBhbmRLbm9iIix0aGlzLl9leHBhbmRLbm9iLDYwKSx0aGlzLl9iYXJjbGljayh0KSl9LF9rbm9iVHJhbnNpdGlvbkVuZDpmdW5jdGlvbih0KXt0LnRhcmdldD09PXRoaXMuJC5zbGlkZXJLbm9iJiZ0aGlzLl9zZXRUcmFuc2l0aW5nKCExKX0sX3VwZGF0ZU1hcmtlcnM6ZnVuY3Rpb24odCxlLG4saSl7aXx8dGhpcy5fc2V0TWFya2VycyhbXSk7dmFyIHI9TWF0aC5yb3VuZCgobi1lKS90aGlzLnN0ZXApO3I+dCYmKHI9dCksKHI8MHx8IWlzRmluaXRlKHIpKSYmKHI9MCksdGhpcy5fc2V0TWFya2VycyhuZXcgQXJyYXkocikpfSxfbWVyZ2VDbGFzc2VzOmZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qua2V5cyh0KS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSkpLmpvaW4oIiAiKX0sX2dldENsYXNzTmFtZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWVyZ2VDbGFzc2VzKHtkaXNhYmxlZDp0aGlzLmRpc2FibGVkLHBpbjp0aGlzLnBpbixzbmFwczp0aGlzLnNuYXBzLHJpbmc6dGhpcy5pbW1lZGlhdGVWYWx1ZTw9dGhpcy5taW4sZXhwYW5kOnRoaXMuZXhwYW5kLGRyYWdnaW5nOnRoaXMuZHJhZ2dpbmcsdHJhbnNpdGluZzp0aGlzLnRyYW5zaXRpbmcsZWRpdGFibGU6dGhpcy5lZGl0YWJsZX0pfSxfYWxsb3dCYXJFdmVudDpmdW5jdGlvbih0KXtyZXR1cm4hdGhpcy5pZ25vcmVCYXJUb3VjaHx8dC5kZXRhaWwuc291cmNlRXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50fSxnZXQgX2lzUlRMKCl7cmV0dXJuIHZvaWQgMD09PXRoaXMuX19pc1JUTCYmKHRoaXMuX19pc1JUTD0icnRsIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLmRpcmVjdGlvbiksdGhpcy5fX2lzUlRMfSxfbGVmdEtleTpmdW5jdGlvbih0KXt0aGlzLl9pc1JUTD90aGlzLl9pbmNyZW1lbnRLZXkodCk6dGhpcy5fZGVjcmVtZW50S2V5KHQpfSxfcmlnaHRLZXk6ZnVuY3Rpb24odCl7dGhpcy5faXNSVEw/dGhpcy5fZGVjcmVtZW50S2V5KHQpOnRoaXMuX2luY3JlbWVudEtleSh0KX0sX2luY3JlbWVudEtleTpmdW5jdGlvbih0KXt0aGlzLmRpc2FibGVkfHwoImVuZCI9PT10LmRldGFpbC5rZXk/dGhpcy52YWx1ZT10aGlzLm1heDp0aGlzLmluY3JlbWVudCgpLHRoaXMuZmlyZSgiY2hhbmdlIiksdC5wcmV2ZW50RGVmYXVsdCgpKX0sX2RlY3JlbWVudEtleTpmdW5jdGlvbih0KXt0aGlzLmRpc2FibGVkfHwoImhvbWUiPT09dC5kZXRhaWwua2V5P3RoaXMudmFsdWU9dGhpcy5taW46dGhpcy5kZWNyZW1lbnQoKSx0aGlzLmZpcmUoImNoYW5nZSIpLHQucHJldmVudERlZmF1bHQoKSl9LF9jaGFuZ2VWYWx1ZTpmdW5jdGlvbih0KXt0aGlzLnZhbHVlPXQudGFyZ2V0LnZhbHVlLHRoaXMuZmlyZSgiY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0sX2lucHV0S2V5RG93bjpmdW5jdGlvbih0KXt0LnN0b3BQcm9wYWdhdGlvbigpfSxfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JpcHBsZUNvbnRhaW5lcj10aGlzLiQuc2xpZGVyS25vYixsYS5fY3JlYXRlUmlwcGxlLmNhbGwodGhpcyl9LF9mb2N1c2VkQ2hhbmdlZDpmdW5jdGlvbih0KXt0JiZ0aGlzLmVuc3VyZVJpcHBsZSgpLHRoaXMuaGFzUmlwcGxlKCkmJih0aGlzLl9yaXBwbGUuc3R5bGUuZGlzcGxheT10PyIiOiJub25lIix0aGlzLl9yaXBwbGUuaG9sZERvd249dCl9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBvcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpO29zLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJkaXNwbGF5OiBub25lOyIpLG9zLmlubmVySFRNTD0iPGRvbS1tb2R1bGUgaWQ9XCJwYXBlci1zcGlubmVyLXN0eWxlc1wiPlxuICA8dGVtcGxhdGU+XG4gICAgPHN0eWxlPlxuICAgICAgLypcbiAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICAgIC8qIFNUWUxFUyBGT1IgVEhFIFNQSU5ORVIgKi9cbiAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgICAgLypcbiAgICAgICAqIENvbnN0YW50czpcbiAgICAgICAqICAgICAgQVJDU0laRSAgICAgPSAyNzAgZGVncmVlcyAoYW1vdW50IG9mIGNpcmNsZSB0aGUgYXJjIHRha2VzIHVwKVxuICAgICAgICogICAgICBBUkNUSU1FICAgICA9IDEzMzNtcyAodGltZSBpdCB0YWtlcyB0byBleHBhbmQgYW5kIGNvbnRyYWN0IGFyYylcbiAgICAgICAqICAgICAgQVJDU1RBUlRST1QgPSAyMTYgZGVncmVlcyAoaG93IG11Y2ggdGhlIHN0YXJ0IGxvY2F0aW9uIG9mIHRoZSBhcmNcbiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgcm90YXRlIGVhY2ggdGltZSwgMjE2IGdpdmVzIHVzIGFcbiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1IHBvaW50ZWQgc3RhciBzaGFwZSAoaXQncyAzNjAvNSAqIDMpLlxuICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBhIDcgcG9pbnRlZCBzdGFyLCB3ZSBtaWdodCBkb1xuICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2MC83ICogMyA9IDE1NC4yODYpXG4gICAgICAgKiAgICAgIFNIUklOS19USU1FID0gNDAwbXNcbiAgICAgICAqL1xuXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB3aWR0aDogMjhweDtcbiAgICAgICAgaGVpZ2h0OiAyOHB4O1xuXG4gICAgICAgIC8qIDM2MCAqIEFSQ1RJTUUgLyAoQVJDU1RBUlRST1QgKyAoMzYwLUFSQ1NJWkUpKSAqL1xuICAgICAgICAtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uOiAxNTY4bXM7XG5cbiAgICAgICAgLyogQVJDVElNRSAqL1xuICAgICAgICAtLXBhcGVyLXNwaW5uZXItZXhwYW5kLWNvbnRyYWN0LWR1cmF0aW9uOiAxMzMzbXM7XG5cbiAgICAgICAgLyogNCAqIEFSQ1RJTUUgKi9cbiAgICAgICAgLS1wYXBlci1zcGlubmVyLWZ1bGwtY3ljbGUtZHVyYXRpb246IDUzMzJtcztcblxuICAgICAgICAvKiBTSFJJTktfVElNRSAqL1xuICAgICAgICAtLXBhcGVyLXNwaW5uZXItY29vbGRvd24tZHVyYXRpb246IDQwMG1zO1xuICAgICAgfVxuXG4gICAgICAjc3Bpbm5lckNvbnRhaW5lciB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG5cbiAgICAgICAgLyogVGhlIHNwaW5uZXIgZG9lcyBub3QgaGF2ZSBhbnkgY29udGVudHMgdGhhdCB3b3VsZCBoYXZlIHRvIGJlXG4gICAgICAgICAqIGZsaXBwZWQgaWYgdGhlIGRpcmVjdGlvbiBjaGFuZ2VzLiBBbHdheXMgdXNlIGx0ciBzbyB0aGF0IHRoZVxuICAgICAgICAgKiBzdHlsZSB3b3JrcyBvdXQgY29ycmVjdGx5IGluIGJvdGggY2FzZXMuICovXG4gICAgICAgIGRpcmVjdGlvbjogbHRyO1xuICAgICAgfVxuXG4gICAgICAjc3Bpbm5lckNvbnRhaW5lci5hY3RpdmUge1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogY29udGFpbmVyLXJvdGF0ZSB2YXIoLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbikgbGluZWFyIGluZmluaXRlO1xuICAgICAgICBhbmltYXRpb246IGNvbnRhaW5lci1yb3RhdGUgdmFyKC0tcGFwZXItc3Bpbm5lci1jb250YWluZXItcm90YXRpb24tZHVyYXRpb24pIGxpbmVhciBpbmZpbml0ZTtcbiAgICAgIH1cblxuICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGNvbnRhaW5lci1yb3RhdGUge1xuICAgICAgICB0byB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKSB9XG4gICAgICB9XG5cbiAgICAgIEBrZXlmcmFtZXMgY29udGFpbmVyLXJvdGF0ZSB7XG4gICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKSB9XG4gICAgICB9XG5cbiAgICAgIC5zcGlubmVyLWxheWVyIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNTAwKSk7XG4gICAgICB9XG5cbiAgICAgIC5sYXllci0xIHtcbiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNwaW5uZXItbGF5ZXItMS1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNTAwKSk7XG4gICAgICB9XG5cbiAgICAgIC5sYXllci0yIHtcbiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNwaW5uZXItbGF5ZXItMi1jb2xvciwgdmFyKC0tZ29vZ2xlLXJlZC01MDApKTtcbiAgICAgIH1cblxuICAgICAgLmxheWVyLTMge1xuICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1sYXllci0zLWNvbG9yLCB2YXIoLS1nb29nbGUteWVsbG93LTUwMCkpO1xuICAgICAgfVxuXG4gICAgICAubGF5ZXItNCB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWxheWVyLTQtY29sb3IsIHZhcigtLWdvb2dsZS1ncmVlbi01MDApKTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBJTVBPUlRBTlQgTk9URSBBQk9VVCBDU1MgQU5JTUFUSU9OIFBST1BFUlRJRVMgKGtlYW51bGVlKTpcbiAgICAgICAqXG4gICAgICAgKiBpT1MgU2FmYXJpICh0ZXN0ZWQgb24gaU9TIDguMSkgZG9lcyBub3QgaGFuZGxlIGFuaW1hdGlvbi1kZWxheSB2ZXJ5IHdlbGwgLSBpdCBkb2Vzbid0XG4gICAgICAgKiBndWFyYW50ZWUgdGhhdCB0aGUgYW5pbWF0aW9uIHdpbGwgc3RhcnQgX2V4YWN0bHlfIGFmdGVyIHRoYXQgdmFsdWUuIFNvIHdlIGF2b2lkIHVzaW5nXG4gICAgICAgKiBhbmltYXRpb24tZGVsYXkgYW5kIGluc3RlYWQgc2V0IGN1c3RvbSBrZXlmcmFtZXMgZm9yIGVhY2ggY29sb3IgKGFzIGxheWVyLTJ1bmRhbnQgYXMgaXRcbiAgICAgICAqIHNlZW1zKS5cbiAgICAgICAqL1xuICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllciB7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZTtcbiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZnVsbC1jeWNsZS1kdXJhdGlvbik7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpO1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xuICAgICAgICBhbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlO1xuICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZnVsbC1jeWNsZS1kdXJhdGlvbik7XG4gICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTtcbiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICB9XG5cbiAgICAgIC5hY3RpdmUgLnNwaW5uZXItbGF5ZXIubGF5ZXItMSB7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMS1mYWRlLWluLW91dDtcbiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMS1mYWRlLWluLW91dDtcbiAgICAgIH1cblxuICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0yIHtcbiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlLCBsYXllci0yLWZhZGUtaW4tb3V0O1xuICAgICAgICBhbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlLCBsYXllci0yLWZhZGUtaW4tb3V0O1xuICAgICAgfVxuXG4gICAgICAuYWN0aXZlIC5zcGlubmVyLWxheWVyLmxheWVyLTMge1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTMtZmFkZS1pbi1vdXQ7XG4gICAgICAgIGFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTMtZmFkZS1pbi1vdXQ7XG4gICAgICB9XG5cbiAgICAgIC5hY3RpdmUgLnNwaW5uZXItbGF5ZXIubGF5ZXItNCB7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItNC1mYWRlLWluLW91dDtcbiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItNC1mYWRlLWluLW91dDtcbiAgICAgIH1cblxuICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGZpbGwtdW5maWxsLXJvdGF0ZSB7XG4gICAgICAgIDEyLjUlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpIH0gLyogMC41ICogQVJDU0laRSAqL1xuICAgICAgICAyNSUgICB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKSB9IC8qIDEgICAqIEFSQ1NJWkUgKi9cbiAgICAgICAgMzcuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDQwNWRlZykgfSAvKiAxLjUgKiBBUkNTSVpFICovXG4gICAgICAgIDUwJSAgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg1NDBkZWcpIH0gLyogMiAgICogQVJDU0laRSAqL1xuICAgICAgICA2Mi41JSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoNjc1ZGVnKSB9IC8qIDIuNSAqIEFSQ1NJWkUgKi9cbiAgICAgICAgNzUlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDgxMGRlZykgfSAvKiAzICAgKiBBUkNTSVpFICovXG4gICAgICAgIDg3LjUlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg5NDVkZWcpIH0gLyogMy41ICogQVJDU0laRSAqL1xuICAgICAgICB0byAgICB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTA4MGRlZykgfSAvKiA0ICAgKiBBUkNTSVpFICovXG4gICAgICB9XG5cbiAgICAgIEBrZXlmcmFtZXMgZmlsbC11bmZpbGwtcm90YXRlIHtcbiAgICAgICAgMTIuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpIH0gLyogMC41ICogQVJDU0laRSAqL1xuICAgICAgICAyNSUgICB7IHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZykgfSAvKiAxICAgKiBBUkNTSVpFICovXG4gICAgICAgIDM3LjUlIHsgdHJhbnNmb3JtOiByb3RhdGUoNDA1ZGVnKSB9IC8qIDEuNSAqIEFSQ1NJWkUgKi9cbiAgICAgICAgNTAlICAgeyB0cmFuc2Zvcm06IHJvdGF0ZSg1NDBkZWcpIH0gLyogMiAgICogQVJDU0laRSAqL1xuICAgICAgICA2Mi41JSB7IHRyYW5zZm9ybTogcm90YXRlKDY3NWRlZykgfSAvKiAyLjUgKiBBUkNTSVpFICovXG4gICAgICAgIDc1JSAgIHsgdHJhbnNmb3JtOiByb3RhdGUoODEwZGVnKSB9IC8qIDMgICAqIEFSQ1NJWkUgKi9cbiAgICAgICAgODcuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSg5NDVkZWcpIH0gLyogMy41ICogQVJDU0laRSAqL1xuICAgICAgICB0byAgICB7IHRyYW5zZm9ybTogcm90YXRlKDEwODBkZWcpIH0gLyogNCAgICogQVJDU0laRSAqL1xuICAgICAgfVxuXG4gICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbGF5ZXItMS1mYWRlLWluLW91dCB7XG4gICAgICAgIDAlIHsgb3BhY2l0eTogMSB9XG4gICAgICAgIDI1JSB7IG9wYWNpdHk6IDEgfVxuICAgICAgICAyNiUgeyBvcGFjaXR5OiAwIH1cbiAgICAgICAgODklIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIDkwJSB7IG9wYWNpdHk6IDEgfVxuICAgICAgICB0byB7IG9wYWNpdHk6IDEgfVxuICAgICAgfVxuXG4gICAgICBAa2V5ZnJhbWVzIGxheWVyLTEtZmFkZS1pbi1vdXQge1xuICAgICAgICAwJSB7IG9wYWNpdHk6IDEgfVxuICAgICAgICAyNSUgeyBvcGFjaXR5OiAxIH1cbiAgICAgICAgMjYlIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIDg5JSB7IG9wYWNpdHk6IDAgfVxuICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH1cbiAgICAgICAgdG8geyBvcGFjaXR5OiAxIH1cbiAgICAgIH1cblxuICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGxheWVyLTItZmFkZS1pbi1vdXQge1xuICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfVxuICAgICAgICAxNSUgeyBvcGFjaXR5OiAwIH1cbiAgICAgICAgMjUlIHsgb3BhY2l0eTogMSB9XG4gICAgICAgIDUwJSB7IG9wYWNpdHk6IDEgfVxuICAgICAgICA1MSUgeyBvcGFjaXR5OiAwIH1cbiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH1cbiAgICAgIH1cblxuICAgICAgQGtleWZyYW1lcyBsYXllci0yLWZhZGUtaW4tb3V0IHtcbiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH1cbiAgICAgICAgMTUlIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIDI1JSB7IG9wYWNpdHk6IDEgfVxuICAgICAgICA1MCUgeyBvcGFjaXR5OiAxIH1cbiAgICAgICAgNTElIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIHRvIHsgb3BhY2l0eTogMCB9XG4gICAgICB9XG5cbiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci0zLWZhZGUtaW4tb3V0IHtcbiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH1cbiAgICAgICAgNDAlIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIDUwJSB7IG9wYWNpdHk6IDEgfVxuICAgICAgICA3NSUgeyBvcGFjaXR5OiAxIH1cbiAgICAgICAgNzYlIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIHRvIHsgb3BhY2l0eTogMCB9XG4gICAgICB9XG5cbiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItMy1mYWRlLWluLW91dCB7XG4gICAgICAgIDAlIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIDQwJSB7IG9wYWNpdHk6IDAgfVxuICAgICAgICA1MCUgeyBvcGFjaXR5OiAxIH1cbiAgICAgICAgNzUlIHsgb3BhY2l0eTogMSB9XG4gICAgICAgIDc2JSB7IG9wYWNpdHk6IDAgfVxuICAgICAgICB0byB7IG9wYWNpdHk6IDAgfVxuICAgICAgfVxuXG4gICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbGF5ZXItNC1mYWRlLWluLW91dCB7XG4gICAgICAgIDAlIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIDY1JSB7IG9wYWNpdHk6IDAgfVxuICAgICAgICA3NSUgeyBvcGFjaXR5OiAxIH1cbiAgICAgICAgOTAlIHsgb3BhY2l0eTogMSB9XG4gICAgICAgIHRvIHsgb3BhY2l0eTogMCB9XG4gICAgICB9XG5cbiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItNC1mYWRlLWluLW91dCB7XG4gICAgICAgIDAlIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIDY1JSB7IG9wYWNpdHk6IDAgfVxuICAgICAgICA3NSUgeyBvcGFjaXR5OiAxIH1cbiAgICAgICAgOTAlIHsgb3BhY2l0eTogMSB9XG4gICAgICAgIHRvIHsgb3BhY2l0eTogMCB9XG4gICAgICB9XG5cbiAgICAgIC5jaXJjbGUtY2xpcHBlciB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB3aWR0aDogNTAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogUGF0Y2ggdGhlIGdhcCB0aGF0IGFwcGVhciBiZXR3ZWVuIHRoZSB0d28gYWRqYWNlbnQgZGl2LmNpcmNsZS1jbGlwcGVyIHdoaWxlIHRoZVxuICAgICAgICogc3Bpbm5lciBpcyByb3RhdGluZyAoYXBwZWFycyBvbiBDaHJvbWUgNTAsIFNhZmFyaSA5LjEuMSwgYW5kIEVkZ2UpLlxuICAgICAgICovXG4gICAgICAuc3Bpbm5lci1sYXllcjo6YWZ0ZXIge1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgbGVmdDogNDUlO1xuICAgICAgICB3aWR0aDogMTAlO1xuICAgICAgICBib3JkZXItdG9wLXN0eWxlOiBzb2xpZDtcbiAgICAgIH1cblxuICAgICAgLnNwaW5uZXItbGF5ZXI6OmFmdGVyLFxuICAgICAgLmNpcmNsZS1jbGlwcGVyIC5jaXJjbGUge1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgYm9yZGVyLXdpZHRoOiB2YXIoLS1wYXBlci1zcGlubmVyLXN0cm9rZS13aWR0aCwgM3B4KTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgfVxuXG4gICAgICAuY2lyY2xlLWNsaXBwZXIgLmNpcmNsZSB7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgd2lkdGg6IDIwMCU7XG4gICAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7XG4gICAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG4gICAgICB9XG5cbiAgICAgIC5jaXJjbGUtY2xpcHBlci5sZWZ0IC5jaXJjbGUge1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTI5ZGVnKTtcbiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTI5ZGVnKTtcbiAgICAgIH1cblxuICAgICAgLmNpcmNsZS1jbGlwcGVyLnJpZ2h0IC5jaXJjbGUge1xuICAgICAgICBsZWZ0OiAtMTAwJTtcbiAgICAgICAgYm9yZGVyLWxlZnQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTEyOWRlZyk7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC0xMjlkZWcpO1xuICAgICAgfVxuXG4gICAgICAuYWN0aXZlIC5nYXAtcGF0Y2g6OmFmdGVyLFxuICAgICAgLmFjdGl2ZSAuY2lyY2xlLWNsaXBwZXIgLmNpcmNsZSB7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci1zcGlubmVyLWV4cGFuZC1jb250cmFjdC1kdXJhdGlvbik7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpO1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xuICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZXhwYW5kLWNvbnRyYWN0LWR1cmF0aW9uKTtcbiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpO1xuICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTtcbiAgICAgIH1cblxuICAgICAgLmFjdGl2ZSAuY2lyY2xlLWNsaXBwZXIubGVmdCAuY2lyY2xlIHtcbiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogbGVmdC1zcGluO1xuICAgICAgICBhbmltYXRpb24tbmFtZTogbGVmdC1zcGluO1xuICAgICAgfVxuXG4gICAgICAuYWN0aXZlIC5jaXJjbGUtY2xpcHBlci5yaWdodCAuY2lyY2xlIHtcbiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogcmlnaHQtc3BpbjtcbiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IHJpZ2h0LXNwaW47XG4gICAgICB9XG5cbiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsZWZ0LXNwaW4ge1xuICAgICAgICAwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTMwZGVnKSB9XG4gICAgICAgIDUwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTVkZWcpIH1cbiAgICAgICAgdG8geyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzMGRlZykgfVxuICAgICAgfVxuXG4gICAgICBAa2V5ZnJhbWVzIGxlZnQtc3BpbiB7XG4gICAgICAgIDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMTMwZGVnKSB9XG4gICAgICAgIDUwJSB7IHRyYW5zZm9ybTogcm90YXRlKC01ZGVnKSB9XG4gICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMTMwZGVnKSB9XG4gICAgICB9XG5cbiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyByaWdodC1zcGluIHtcbiAgICAgICAgMCUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC0xMzBkZWcpIH1cbiAgICAgICAgNTAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg1ZGVnKSB9XG4gICAgICAgIHRvIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKSB9XG4gICAgICB9XG5cbiAgICAgIEBrZXlmcmFtZXMgcmlnaHQtc3BpbiB7XG4gICAgICAgIDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfVxuICAgICAgICA1MCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSg1ZGVnKSB9XG4gICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfVxuICAgICAgfVxuXG4gICAgICAjc3Bpbm5lckNvbnRhaW5lci5jb29sZG93biB7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGUsIGZhZGUtb3V0IHZhcigtLXBhcGVyLXNwaW5uZXItY29vbGRvd24tZHVyYXRpb24pIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTtcbiAgICAgICAgYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGUsIGZhZGUtb3V0IHZhcigtLXBhcGVyLXNwaW5uZXItY29vbGRvd24tZHVyYXRpb24pIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTtcbiAgICAgIH1cblxuICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGZhZGUtb3V0IHtcbiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH1cbiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH1cbiAgICAgIH1cblxuICAgICAgQGtleWZyYW1lcyBmYWRlLW91dCB7XG4gICAgICAgIDAlIHsgb3BhY2l0eTogMSB9XG4gICAgICAgIHRvIHsgb3BhY2l0eTogMCB9XG4gICAgICB9XG4gICAgPC9zdHlsZT5cbiAgPC90ZW1wbGF0ZT5cbjwvZG9tLW1vZHVsZT4iLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQob3MuY29udGVudCk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBhcz17cHJvcGVydGllczp7YWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLG9ic2VydmVyOiJfX2FjdGl2ZUNoYW5nZWQifSxhbHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJsb2FkaW5nIixvYnNlcnZlcjoiX19hbHRDaGFuZ2VkIn0sX19jb29saW5nRG93bjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sX19jb21wdXRlQ29udGFpbmVyQ2xhc3NlczpmdW5jdGlvbih0LGUpe3JldHVyblt0fHxlPyJhY3RpdmUiOiIiLGU/ImNvb2xkb3duIjoiIl0uam9pbigiICIpfSxfX2FjdGl2ZUNoYW5nZWQ6ZnVuY3Rpb24odCxlKXt0aGlzLl9fc2V0QXJpYUhpZGRlbighdCksdGhpcy5fX2Nvb2xpbmdEb3duPSF0JiZlfSxfX2FsdENoYW5nZWQ6ZnVuY3Rpb24odCl7ImxvYWRpbmciPT09dD90aGlzLmFsdD10aGlzLmdldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpfHx0Oih0aGlzLl9fc2V0QXJpYUhpZGRlbigiIj09PXQpLHRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIix0KSl9LF9fc2V0QXJpYUhpZGRlbjpmdW5jdGlvbih0KXt2YXIgZT0iYXJpYS1oaWRkZW4iO3Q/dGhpcy5zZXRBdHRyaWJ1dGUoZSwidHJ1ZSIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKGUpfSxfX3Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5hY3RpdmU9ITEsdGhpcy5fX2Nvb2xpbmdEb3duPSExfX0sc3M9X2VgCiAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLXNwaW5uZXItc3R5bGVzIj48L3N0eWxlPgoKICA8ZGl2IGlkPSJzcGlubmVyQ29udGFpbmVyIiBjbGFzcy1uYW1lPSJbW19fY29tcHV0ZUNvbnRhaW5lckNsYXNzZXMoYWN0aXZlLCBfX2Nvb2xpbmdEb3duKV1dIiBvbi1hbmltYXRpb25lbmQ9Il9fcmVzZXQiIG9uLXdlYmtpdC1hbmltYXRpb24tZW5kPSJfX3Jlc2V0Ij4KICAgIDxkaXYgY2xhc3M9InNwaW5uZXItbGF5ZXIiPgogICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciBsZWZ0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUiPjwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgcmlnaHQiPgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC9kaXY+CmA7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL3NzLnNldEF0dHJpYnV0ZSgic3RyaXAtd2hpdGVzcGFjZSIsIiIpLFJyKHtfdGVtcGxhdGU6c3MsaXM6InBhcGVyLXNwaW5uZXItbGl0ZSIsYmVoYXZpb3JzOlthc119KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IGxzPV9lYAogIDxzdHlsZSBpbmNsdWRlPSJwYXBlci1zcGlubmVyLXN0eWxlcyI+PC9zdHlsZT4KCiAgPGRpdiBpZD0ic3Bpbm5lckNvbnRhaW5lciIgY2xhc3MtbmFtZT0iW1tfX2NvbXB1dGVDb250YWluZXJDbGFzc2VzKGFjdGl2ZSwgX19jb29saW5nRG93bildXSIgb24tYW5pbWF0aW9uZW5kPSJfX3Jlc2V0IiBvbi13ZWJraXQtYW5pbWF0aW9uLWVuZD0iX19yZXNldCI+CiAgICA8ZGl2IGNsYXNzPSJzcGlubmVyLWxheWVyIGxheWVyLTEiPgogICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciBsZWZ0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUiPjwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgcmlnaHQiPgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0ic3Bpbm5lci1sYXllciBsYXllci0yIj4KICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgbGVmdCI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIHJpZ2h0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUiPjwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9InNwaW5uZXItbGF5ZXIgbGF5ZXItMyI+CiAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIGxlZnQiPgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciByaWdodCI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJzcGlubmVyLWxheWVyIGxheWVyLTQiPgogICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciBsZWZ0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUiPjwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgcmlnaHQiPgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC9kaXY+CmA7bHMuc2V0QXR0cmlidXRlKCJzdHJpcC13aGl0ZXNwYWNlIiwiIiksUnIoe190ZW1wbGF0ZTpscyxpczoicGFwZXItc3Bpbm5lciIsYmVoYXZpb3JzOlthc119KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgY3M9X2VgPGlyb24taWNvbnNldC1zdmcgbmFtZT0icGFwZXItdGFicyIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iY2hldnJvbi1sZWZ0Ij48cGF0aCBkPSJNMTUuNDEgNy40MUwxNCA2bC02IDYgNiA2IDEuNDEtMS40MUwxMC44MyAxMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjaGV2cm9uLXJpZ2h0Ij48cGF0aCBkPSJNMTAgNkw4LjU5IDcuNDEgMTMuMTcgMTJsLTQuNTggNC41OUwxMCAxOGw2LTZ6Ij48L3BhdGg+PC9nPgo8L2RlZnM+PC9zdmc+CjwvaXJvbi1pY29uc2V0LXN2Zz5gO2RvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoY3MuY29udGVudCksCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovClJyKHtfdGVtcGxhdGU6X2VgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlci1qdXN0aWZpZWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKCiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHBhZGRpbmc6IDAgMTJweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYjsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2xpbmtdKSB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLnRhYi1jb250ZW50IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApOwogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjFzIGN1YmljLWJlemllcigwLjQsIDAuMCwgMSwgMSk7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlci1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWItY29udGVudDsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdCguaXJvbi1zZWxlY3RlZCkpID4gLnRhYi1jb250ZW50IHsKICAgICAgICBvcGFjaXR5OiAwLjg7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYi1jb250ZW50LXVuc2VsZWN0ZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgLnRhYi1jb250ZW50IHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYi1jb250ZW50LWZvY3VzZWQ7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRhYi1pbmssIHZhcigtLXBhcGVyLXllbGxvdy1hMTAwKSk7CiAgICAgIH0KCiAgICAgIC50YWItY29udGVudCA+IDo6c2xvdHRlZChhKSB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKCiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9InRhYi1jb250ZW50Ij4KICAgICAgPHNsb3Q+PC9zbG90PgogICAgPC9kaXY+CmAsaXM6InBhcGVyLXRhYiIsYmVoYXZpb3JzOltxbyxYbyxKb10scHJvcGVydGllczp7bGluazp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJ0YWIifSxsaXN0ZW5lcnM6e2Rvd246Il91cGRhdGVOb2luayIsdGFwOiJfb25UYXAifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZU5vaW5rKCl9LGdldCBfcGFyZW50Tm9pbmsoKXt2YXIgdD1ZaSh0aGlzKS5wYXJlbnROb2RlO3JldHVybiEhdCYmISF0Lm5vaW5rfSxfdXBkYXRlTm9pbms6ZnVuY3Rpb24oKXt0aGlzLm5vaW5rPSEhdGhpcy5ub2lua3x8ISF0aGlzLl9wYXJlbnROb2lua30sX29uVGFwOmZ1bmN0aW9uKHQpe2lmKHRoaXMubGluayl7dmFyIGU9dGhpcy5xdWVyeUVmZmVjdGl2ZUNoaWxkcmVuKCJhIik7aWYoIWUpcmV0dXJuO2lmKHQudGFyZ2V0PT09ZSlyZXR1cm47ZS5jbGljaygpfX19KSwKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KUnIoe190ZW1wbGF0ZTpfZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwoKICAgICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwoKICAgICAgICAvKiBOT1RFOiBCb3RoIHZhbHVlcyBhcmUgbmVlZGVkLCBzaW5jZSBzb21lIHBob25lcyByZXF1aXJlIHRoZSB2YWx1ZSB0byBiZSBcYHRyYW5zcGFyZW50XGAuICovCiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYnM7CiAgICAgIH0KCiAgICAgIDpob3N0KDpkaXIocnRsKSkgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsLXJldmVyc2U7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYnMtY29udGFpbmVyOwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAtbW96LWZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgLW1zLWZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWJzLWNvbnRlbnQ7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudC5zY3JvbGxhYmxlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50Om5vdCguc2Nyb2xsYWJsZSksCiAgICAgICN0YWJzQ29udGVudC5zY3JvbGxhYmxlLmZpdC1jb250YWluZXIgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQuc2Nyb2xsYWJsZS5maXQtY29udGFpbmVyIHsKICAgICAgICBtaW4td2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudC5zY3JvbGxhYmxlLmZpdC1jb250YWluZXIgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIC8qIElFIC0gcHJldmVudCB0YWJzIGZyb20gY29tcHJlc3Npbmcgd2hlbiB0aGV5IHNob3VsZCBzY3JvbGwuICovCiAgICAgICAgLW1zLWZsZXg6IDEgMCBhdXRvOwogICAgICAgIC13ZWJraXQtZmxleDogMSAwIGF1dG87CiAgICAgICAgZmxleDogMSAwIGF1dG87CiAgICAgIH0KCiAgICAgIC5oaWRkZW4gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5ub3QtdmlzaWJsZSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICB3aWR0aDogNDhweDsKICAgICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICBtYXJnaW46IDAgNHB4OwogICAgICB9CgogICAgICAjc2VsZWN0aW9uQmFyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgaGVpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB2YXIoLS1wYXBlci10YWJzLXNlbGVjdGlvbi1iYXItY29sb3IsIHZhcigtLXBhcGVyLXllbGxvdy1hMTAwKSk7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBjZW50ZXI7CiAgICAgICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybTsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm07CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYnMtc2VsZWN0aW9uLWJhcjsKICAgICAgfQoKICAgICAgI3NlbGVjdGlvbkJhci5hbGlnbi1ib3R0b20gewogICAgICAgIHRvcDogMDsKICAgICAgICBib3R0b206IGF1dG87CiAgICAgIH0KCiAgICAgICNzZWxlY3Rpb25CYXIuZXhwYW5kIHsKICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjE1czsKICAgICAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAxLCAxKTsKICAgICAgfQoKICAgICAgI3NlbGVjdGlvbkJhci5jb250cmFjdCB7CiAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4xOHM7CiAgICAgICAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjAsIDAuMCwgMC4yLCAxKTsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50ID4gOjpzbG90dGVkKDpub3QoI3NlbGVjdGlvbkJhcikpIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InBhcGVyLXRhYnM6Y2hldnJvbi1sZWZ0IiBjbGFzcyQ9IltbX2NvbXB1dGVTY3JvbGxCdXR0b25DbGFzcyhfbGVmdEhpZGRlbiwgc2Nyb2xsYWJsZSwgaGlkZVNjcm9sbEJ1dHRvbnMpXV0iIG9uLXVwPSJfb25TY3JvbGxCdXR0b25VcCIgb24tZG93bj0iX29uTGVmdFNjcm9sbEJ1dHRvbkRvd24iIHRhYmluZGV4PSItMSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KCiAgICA8ZGl2IGlkPSJ0YWJzQ29udGFpbmVyIiBvbi10cmFjaz0iX3Njcm9sbCIgb24tZG93bj0iX2Rvd24iPgogICAgICA8ZGl2IGlkPSJ0YWJzQ29udGVudCIgY2xhc3MkPSJbW19jb21wdXRlVGFic0NvbnRlbnRDbGFzcyhzY3JvbGxhYmxlLCBmaXRDb250YWluZXIpXV0iPgogICAgICAgIDxkaXYgaWQ9InNlbGVjdGlvbkJhciIgY2xhc3MkPSJbW19jb21wdXRlU2VsZWN0aW9uQmFyQ2xhc3Mobm9CYXIsIGFsaWduQm90dG9tKV1dIiBvbi10cmFuc2l0aW9uZW5kPSJfb25CYXJUcmFuc2l0aW9uRW5kIj48L2Rpdj4KICAgICAgICA8c2xvdD48L3Nsb3Q+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InBhcGVyLXRhYnM6Y2hldnJvbi1yaWdodCIgY2xhc3MkPSJbW19jb21wdXRlU2Nyb2xsQnV0dG9uQ2xhc3MoX3JpZ2h0SGlkZGVuLCBzY3JvbGxhYmxlLCBoaWRlU2Nyb2xsQnV0dG9ucyldXSIgb24tdXA9Il9vblNjcm9sbEJ1dHRvblVwIiBvbi1kb3duPSJfb25SaWdodFNjcm9sbEJ1dHRvbkRvd24iIHRhYmluZGV4PSItMSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KYCxpczoicGFwZXItdGFicyIsYmVoYXZpb3JzOltnbyxpc10scHJvcGVydGllczp7bm9pbms6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX25vaW5rQ2hhbmdlZCJ9LG5vQmFyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vU2xpZGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sc2Nyb2xsYWJsZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxmaXRDb250YWluZXI6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZGlzYWJsZURyYWc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0saGlkZVNjcm9sbEJ1dHRvbnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYWxpZ25Cb3R0b206e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sc2VsZWN0YWJsZTp7dHlwZTpTdHJpbmcsdmFsdWU6InBhcGVyLXRhYiJ9LGF1dG9zZWxlY3Q6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYXV0b3NlbGVjdERlbGF5Ont0eXBlOk51bWJlcix2YWx1ZTowfSxfc3RlcDp7dHlwZTpOdW1iZXIsdmFsdWU6MTB9LF9ob2xkRGVsYXk6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LF9sZWZ0SGlkZGVuOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9yaWdodEhpZGRlbjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfcHJldmlvdXNUYWI6e3R5cGU6T2JqZWN0fX0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InRhYmxpc3QifSxsaXN0ZW5lcnM6eyJpcm9uLXJlc2l6ZSI6Il9vblRhYlNpemluZ0NoYW5nZWQiLCJpcm9uLWl0ZW1zLWNoYW5nZWQiOiJfb25UYWJTaXppbmdDaGFuZ2VkIiwiaXJvbi1zZWxlY3QiOiJfb25Jcm9uU2VsZWN0IiwiaXJvbi1kZXNlbGVjdCI6Il9vbklyb25EZXNlbGVjdCJ9LGtleUJpbmRpbmdzOnsibGVmdDprZXl1cCByaWdodDprZXl1cCI6Il9vbkFycm93S2V5dXAifSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5faG9sZEpvYj1udWxsLHRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT12b2lkIDAsdGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXZvaWQgMCx0aGlzLl9iaW5kRGVsYXllZEFjdGl2YXRpb25IYW5kbGVyPXRoaXMuX2RlbGF5ZWRBY3RpdmF0aW9uSGFuZGxlci5iaW5kKHRoaXMpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsdGhpcy5fb25CbHVyQ2FwdHVyZS5iaW5kKHRoaXMpLCEwKX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLnNldFNjcm9sbERpcmVjdGlvbigieSIsdGhpcy4kLnRhYnNDb250YWluZXIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2NhbmNlbFBlbmRpbmdBY3RpdmF0aW9uKCl9LF9ub2lua0NoYW5nZWQ6ZnVuY3Rpb24odCl7WWkodGhpcykucXVlcnlTZWxlY3RvckFsbCgicGFwZXItdGFiIikuZm9yRWFjaCh0P3RoaXMuX3NldE5vaW5rQXR0cmlidXRlOnRoaXMuX3JlbW92ZU5vaW5rQXR0cmlidXRlKX0sX3NldE5vaW5rQXR0cmlidXRlOmZ1bmN0aW9uKHQpe3Quc2V0QXR0cmlidXRlKCJub2luayIsIiIpfSxfcmVtb3ZlTm9pbmtBdHRyaWJ1dGU6ZnVuY3Rpb24odCl7dC5yZW1vdmVBdHRyaWJ1dGUoIm5vaW5rIil9LF9jb21wdXRlU2Nyb2xsQnV0dG9uQ2xhc3M6ZnVuY3Rpb24odCxlLG4pe3JldHVybiFlfHxuPyJoaWRkZW4iOnQ/Im5vdC12aXNpYmxlIjoiIn0sX2NvbXB1dGVUYWJzQ29udGVudENsYXNzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ/InNjcm9sbGFibGUiKyhlPyIgZml0LWNvbnRhaW5lciI6IiIpOiIgZml0LWNvbnRhaW5lciJ9LF9jb21wdXRlU2VsZWN0aW9uQmFyQ2xhc3M6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD8iaGlkZGVuIjplPyJhbGlnbi1ib3R0b20iOiIifSxfb25UYWJTaXppbmdDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kZWJvdW5jZSgiX29uVGFiU2l6aW5nQ2hhbmdlZCIsKGZ1bmN0aW9uKCl7dGhpcy5fc2Nyb2xsKCksdGhpcy5fdGFiQ2hhbmdlZCh0aGlzLnNlbGVjdGVkSXRlbSl9KSwxMCl9LF9vbklyb25TZWxlY3Q6ZnVuY3Rpb24odCl7dGhpcy5fdGFiQ2hhbmdlZCh0LmRldGFpbC5pdGVtLHRoaXMuX3ByZXZpb3VzVGFiKSx0aGlzLl9wcmV2aW91c1RhYj10LmRldGFpbC5pdGVtLHRoaXMuY2FuY2VsRGVib3VuY2VyKCJ0YWItY2hhbmdlZCIpfSxfb25Jcm9uRGVzZWxlY3Q6ZnVuY3Rpb24odCl7dGhpcy5kZWJvdW5jZSgidGFiLWNoYW5nZWQiLChmdW5jdGlvbigpe3RoaXMuX3RhYkNoYW5nZWQobnVsbCx0aGlzLl9wcmV2aW91c1RhYiksdGhpcy5fcHJldmlvdXNUYWI9bnVsbH0pLDEpfSxfYWN0aXZhdGVIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fY2FuY2VsUGVuZGluZ0FjdGl2YXRpb24oKSxaYS5fYWN0aXZhdGVIYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sX3NjaGVkdWxlQWN0aXZhdGlvbjpmdW5jdGlvbih0LGUpe3RoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT10LHRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uVGltZW91dD10aGlzLmFzeW5jKHRoaXMuX2JpbmREZWxheWVkQWN0aXZhdGlvbkhhbmRsZXIsZSl9LF9kZWxheWVkQWN0aXZhdGlvbkhhbmRsZXI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wZW5kaW5nQWN0aXZhdGlvbkl0ZW07dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtPXZvaWQgMCx0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQ9dm9pZCAwLHQuZmlyZSh0aGlzLmFjdGl2YXRlRXZlbnQsbnVsbCx7YnViYmxlczohMCxjYW5jZWxhYmxlOiEwfSl9LF9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbjpmdW5jdGlvbigpe3ZvaWQgMCE9PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uVGltZW91dCYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0KSx0aGlzLl9wZW5kaW5nQWN0aXZhdGlvbkl0ZW09dm9pZCAwLHRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uVGltZW91dD12b2lkIDApfSxfb25BcnJvd0tleXVwOmZ1bmN0aW9uKHQpe3RoaXMuYXV0b3NlbGVjdCYmdGhpcy5fc2NoZWR1bGVBY3RpdmF0aW9uKHRoaXMuZm9jdXNlZEl0ZW0sdGhpcy5hdXRvc2VsZWN0RGVsYXkpfSxfb25CbHVyQ2FwdHVyZTpmdW5jdGlvbih0KXt0LnRhcmdldD09PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbSYmdGhpcy5fY2FuY2VsUGVuZGluZ0FjdGl2YXRpb24oKX0sZ2V0IF90YWJDb250YWluZXJTY3JvbGxTaXplKCl7cmV0dXJuIE1hdGgubWF4KDAsdGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsV2lkdGgtdGhpcy4kLnRhYnNDb250YWluZXIub2Zmc2V0V2lkdGgpfSxfc2Nyb2xsOmZ1bmN0aW9uKHQsZSl7dGhpcy5zY3JvbGxhYmxlJiZ0aGlzLl9hZmZlY3RTY3JvbGwoZSYmLWUuZGR4fHwwKX0sX2Rvd246ZnVuY3Rpb24odCl7dGhpcy5hc3luYygoZnVuY3Rpb24oKXt0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYyYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fZGVmYXVsdEZvY3VzQXN5bmMpLHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jPW51bGwpfSksMSl9LF9hZmZlY3RTY3JvbGw6ZnVuY3Rpb24odCl7dGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdCs9dDt2YXIgZT10aGlzLiQudGFic0NvbnRhaW5lci5zY3JvbGxMZWZ0O3RoaXMuX2xlZnRIaWRkZW49MD09PWUsdGhpcy5fcmlnaHRIaWRkZW49ZT09PXRoaXMuX3RhYkNvbnRhaW5lclNjcm9sbFNpemV9LF9vbkxlZnRTY3JvbGxCdXR0b25Eb3duOmZ1bmN0aW9uKCl7dGhpcy5fc2Nyb2xsVG9MZWZ0KCksdGhpcy5faG9sZEpvYj1zZXRJbnRlcnZhbCh0aGlzLl9zY3JvbGxUb0xlZnQuYmluZCh0aGlzKSx0aGlzLl9ob2xkRGVsYXkpfSxfb25SaWdodFNjcm9sbEJ1dHRvbkRvd246ZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGxUb1JpZ2h0KCksdGhpcy5faG9sZEpvYj1zZXRJbnRlcnZhbCh0aGlzLl9zY3JvbGxUb1JpZ2h0LmJpbmQodGhpcyksdGhpcy5faG9sZERlbGF5KX0sX29uU2Nyb2xsQnV0dG9uVXA6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKHRoaXMuX2hvbGRKb2IpLHRoaXMuX2hvbGRKb2I9bnVsbH0sX3Njcm9sbFRvTGVmdDpmdW5jdGlvbigpe3RoaXMuX2FmZmVjdFNjcm9sbCgtdGhpcy5fc3RlcCl9LF9zY3JvbGxUb1JpZ2h0OmZ1bmN0aW9uKCl7dGhpcy5fYWZmZWN0U2Nyb2xsKHRoaXMuX3N0ZXApfSxfdGFiQ2hhbmdlZDpmdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybiB0aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdC5yZW1vdmUoImV4cGFuZCIpLHRoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LnJlbW92ZSgiY29udHJhY3QiKSx2b2lkIHRoaXMuX3Bvc2l0aW9uQmFyKDAsMCk7dmFyIG49dGhpcy4kLnRhYnNDb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGk9bi53aWR0aCxyPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbz1yLmxlZnQtbi5sZWZ0O2lmKHRoaXMuX3Bvcz17d2lkdGg6dGhpcy5fY2FsY1BlcmNlbnQoci53aWR0aCxpKSxsZWZ0OnRoaXMuX2NhbGNQZXJjZW50KG8saSl9LHRoaXMubm9TbGlkZXx8bnVsbD09ZSlyZXR1cm4gdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCJleHBhbmQiKSx0aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdC5yZW1vdmUoImNvbnRyYWN0Iiksdm9pZCB0aGlzLl9wb3NpdGlvbkJhcih0aGlzLl9wb3Mud2lkdGgsdGhpcy5fcG9zLmxlZnQpO3ZhciBhPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscz10aGlzLml0ZW1zLmluZGV4T2YoZSksbD10aGlzLml0ZW1zLmluZGV4T2YodCk7dGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QuYWRkKCJleHBhbmQiKTt2YXIgYz1zPGw7dGhpcy5faXNSVEwmJihjPSFjKSxjP3RoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX2NhbGNQZXJjZW50KHIubGVmdCtyLndpZHRoLWEubGVmdCxpKS01LHRoaXMuX2xlZnQpOnRoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX2NhbGNQZXJjZW50KGEubGVmdCthLndpZHRoLXIubGVmdCxpKS01LHRoaXMuX2NhbGNQZXJjZW50KG8saSkrNSksdGhpcy5zY3JvbGxhYmxlJiZ0aGlzLl9zY3JvbGxUb1NlbGVjdGVkSWZOZWVkZWQoci53aWR0aCxvKX0sX3Njcm9sbFRvU2VsZWN0ZWRJZk5lZWRlZDpmdW5jdGlvbih0LGUpe3ZhciBuPWUtdGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdDsobjwwfHwobis9dC10aGlzLiQudGFic0NvbnRhaW5lci5vZmZzZXRXaWR0aCk+MCkmJih0aGlzLiQudGFic0NvbnRhaW5lci5zY3JvbGxMZWZ0Kz1uKX0sX2NhbGNQZXJjZW50OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIDEwMCp0L2V9LF9wb3NpdGlvbkJhcjpmdW5jdGlvbih0LGUpe2U9ZXx8MCx0aGlzLl93aWR0aD10PXR8fDAsdGhpcy5fbGVmdD1lLHRoaXMudHJhbnNmb3JtKCJ0cmFuc2xhdGVYKCIrZSsiJSkgc2NhbGVYKCIrdC8xMDArIikiLHRoaXMuJC5zZWxlY3Rpb25CYXIpfSxfb25CYXJUcmFuc2l0aW9uRW5kOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0O2UuY29udGFpbnMoImV4cGFuZCIpPyhlLnJlbW92ZSgiZXhwYW5kIiksZS5hZGQoImNvbnRyYWN0IiksdGhpcy5fcG9zaXRpb25CYXIodGhpcy5fcG9zLndpZHRoLHRoaXMuX3Bvcy5sZWZ0KSk6ZS5jb250YWlucygiY29udHJhY3QiKSYmZS5yZW1vdmUoImNvbnRyYWN0Iil9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwp2YXIgdXM9bnVsbDtScih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvYXN0LWJhY2tncm91bmQtY29sb3IsICMzMjMyMzIpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b2FzdC1jb2xvciwgI2YxZjFmMSk7CiAgICAgICAgbWluLWhlaWdodDogNDhweDsKICAgICAgICBtaW4td2lkdGg6IDI4OHB4OwogICAgICAgIHBhZGRpbmc6IDE2cHggMjRweDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC4yNik7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIG1hcmdpbjogMTJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMC4zcywgb3BhY2l0eSAwLjNzOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzLCBvcGFjaXR5IDAuM3M7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDBweCk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDEwMHB4KTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICB9CgogICAgICA6aG9zdCguY2Fwc3VsZSkgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDI0cHg7CiAgICAgIH0KCiAgICAgIDpob3N0KC5maXQtYm90dG9tKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDA7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICA6aG9zdCgucGFwZXItdG9hc3Qtb3BlbikgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMHB4KTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMHB4KTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c3BhbiBpZD0ibGFiZWwiPnt7dGV4dH19PC9zcGFuPgogICAgPHNsb3Q+PC9zbG90PgpgLGlzOiJwYXBlci10b2FzdCIsYmVoYXZpb3JzOltrYV0scHJvcGVydGllczp7Zml0SW50bzp7dHlwZTpPYmplY3QsdmFsdWU6d2luZG93LG9ic2VydmVyOiJfb25GaXRJbnRvQ2hhbmdlZCJ9LGhvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQifSx2ZXJ0aWNhbEFsaWduOnt0eXBlOlN0cmluZyx2YWx1ZToiYm90dG9tIn0sZHVyYXRpb246e3R5cGU6TnVtYmVyLHZhbHVlOjNlM30sdGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LG5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sbm9BdXRvRm9jdXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LGxpc3RlbmVyczp7dHJhbnNpdGlvbmVuZDoiX19vblRyYW5zaXRpb25FbmQifSxnZXQgdmlzaWJsZSgpe3JldHVybiBmby5fd2FybigiYHZpc2libGVgIGlzIGRlcHJlY2F0ZWQsIHVzZSBgb3BlbmVkYCBpbnN0ZWFkIiksdGhpcy5vcGVuZWR9LGdldCBfY2FuQXV0b0Nsb3NlKCl7cmV0dXJuIHRoaXMuZHVyYXRpb24+MCYmdGhpcy5kdXJhdGlvbiE9PTEvMH0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX2F1dG9DbG9zZT1udWxsLE9hLnJlcXVlc3RBdmFpbGFiaWxpdHkoKX0sc2hvdzpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4ic3RyaW5nIj09dHlwZW9mIHQmJih0PXt0ZXh0OnR9KSx0KTA9PT1lLmluZGV4T2YoIl8iKT9mby5fd2FybignVGhlIHByb3BlcnR5ICInK2UrJyIgaXMgcHJpdmF0ZSBhbmQgd2FzIG5vdCBzZXQuJyk6ZSBpbiB0aGlzP3RoaXNbZV09dFtlXTpmby5fd2FybignVGhlIHByb3BlcnR5ICInK2UrJyIgaXMgbm90IHZhbGlkLicpO3RoaXMub3BlbigpfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5jbG9zZSgpfSxfX29uVHJhbnNpdGlvbkVuZDpmdW5jdGlvbih0KXt0JiZ0LnRhcmdldD09PXRoaXMmJiJvcGFjaXR5Ij09PXQucHJvcGVydHlOYW1lJiYodGhpcy5vcGVuZWQ/dGhpcy5fZmluaXNoUmVuZGVyT3BlbmVkKCk6dGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCkpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe251bGwhPT10aGlzLl9hdXRvQ2xvc2UmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2F1dG9DbG9zZSksdGhpcy5fYXV0b0Nsb3NlPW51bGwpLHRoaXMub3BlbmVkPyh1cyYmdXMhPT10aGlzJiZ1cy5jbG9zZSgpLHVzPXRoaXMsdGhpcy5maXJlKCJpcm9uLWFubm91bmNlIix7dGV4dDp0aGlzLnRleHR9KSx0aGlzLl9jYW5BdXRvQ2xvc2UmJih0aGlzLl9hdXRvQ2xvc2U9dGhpcy5hc3luYyh0aGlzLmNsb3NlLHRoaXMuZHVyYXRpb24pKSk6dXM9PT10aGlzJiYodXM9bnVsbCksQ2EuX29wZW5lZENoYW5nZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfcmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5jbGFzc0xpc3QuYWRkKCJwYXBlci10b2FzdC1vcGVuIil9LF9yZW5kZXJDbG9zZWQ6ZnVuY3Rpb24oKXt0aGlzLmNsYXNzTGlzdC5yZW1vdmUoInBhcGVyLXRvYXN0LW9wZW4iKX0sX29uRml0SW50b0NoYW5nZWQ6ZnVuY3Rpb24odCl7dGhpcy5wb3NpdGlvblRhcmdldD10fX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBocz1fZWAKCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6bm9uZTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1iYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIG9wYWNpdHk6IDAuNDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIGxpbmVhciAuMDhzOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhci1jb2xvciwgIzAwMDAwMCk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhcjsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1idXR0b24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IC0zcHg7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC42KTsKICAgICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSBsaW5lYXIgLjA4cywgYmFja2dyb3VuZC1jb2xvciBsaW5lYXIgLjA4czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gbGluZWFyIC4wOHMsIGJhY2tncm91bmQtY29sb3IgbGluZWFyIC4wOHM7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLXVuY2hlY2tlZC1idXR0b24tY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNTApKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi11bmNoZWNrZWQtYnV0dG9uOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbi5kcmFnZ2luZyB7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBub25lOwogICAgICAgIHRyYW5zaXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjaGVja2VkXTpub3QoW2Rpc2FibGVkXSkpIC50b2dnbGUtYmFyIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJhci1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYmFyOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudG9nZ2xlLWJhciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKICAgICAgICBvcGFjaXR5OiAwLjEyOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDE2cHgsIDApOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDE2cHgsIDApOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF06bm90KFtkaXNhYmxlZF0pKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJ1dHRvbi1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2JkYmRiZDsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAudG9nZ2xlLWluayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogLTE0cHg7CiAgICAgICAgbGVmdDogLTE0cHg7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgYm90dG9tOiBhdXRvOwogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluazsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAudG9nZ2xlLWluayB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWluazsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDM2cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICAgIC8qIFRoZSB0b2dnbGUgYnV0dG9uIGhhcyBhbiBhYnNvbHV0ZSBwb3NpdGlvbiBvZiAtM3B4OyBUaGUgZXh0cmEgMXB4CiAgICAgICAgLyogYWNjb3VudHMgZm9yIHRoZSB0b2dnbGUgYnV0dG9uIHNoYWRvdyBib3guICovCiAgICAgICAgbWFyZ2luOiA0cHggMXB4OwogICAgICB9CgogICAgICAudG9nZ2xlLWxhYmVsIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWxhYmVsLXNwYWNpbmcsIDhweCk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICAvKiBpbnZhbGlkIHN0YXRlICovCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1iYXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1iYXItY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1idXR0b24gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1idXR0b24tY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1pbmsgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWludmFsaWQtaW5rLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJ0b2dnbGVCYXIiIGNsYXNzPSJ0b2dnbGUtYmFyIj48L2Rpdj4KICAgICAgPGRpdiBpZD0idG9nZ2xlQnV0dG9uIiBjbGFzcz0idG9nZ2xlLWJ1dHRvbiI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJ0b2dnbGUtbGFiZWwiPjxzbG90Pjwvc2xvdD48L2Rpdj4KCiAgYDtocy5zZXRBdHRyaWJ1dGUoInN0cmlwLXdoaXRlc3BhY2UiLCIiKSxScih7X3RlbXBsYXRlOmhzLGlzOiJwYXBlci10b2dnbGUtYnV0dG9uIixiZWhhdmlvcnM6W3VhXSxob3N0QXR0cmlidXRlczp7cm9sZToiYnV0dG9uIiwiYXJpYS1wcmVzc2VkIjoiZmFsc2UiLHRhYmluZGV4OjB9LHByb3BlcnRpZXM6e30sbGlzdGVuZXJzOnt0cmFjazoiX29udHJhY2sifSxhdHRhY2hlZDpmdW5jdGlvbigpe0xpKHRoaXMsKGZ1bmN0aW9uKCl7b2kodGhpcywicGFuLXkiKX0pKX0sX29udHJhY2s6ZnVuY3Rpb24odCl7dmFyIGU9dC5kZXRhaWw7InN0YXJ0Ij09PWUuc3RhdGU/dGhpcy5fdHJhY2tTdGFydChlKToidHJhY2siPT09ZS5zdGF0ZT90aGlzLl90cmFja01vdmUoZSk6ImVuZCI9PT1lLnN0YXRlJiZ0aGlzLl90cmFja0VuZChlKX0sX3RyYWNrU3RhcnQ6ZnVuY3Rpb24odCl7dGhpcy5fd2lkdGg9dGhpcy4kLnRvZ2dsZUJhci5vZmZzZXRXaWR0aC8yLHRoaXMuX3RyYWNrQ2hlY2tlZD10aGlzLmNoZWNrZWQsdGhpcy4kLnRvZ2dsZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCJkcmFnZ2luZyIpfSxfdHJhY2tNb3ZlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZHg7dGhpcy5feD1NYXRoLm1pbih0aGlzLl93aWR0aCxNYXRoLm1heCgwLHRoaXMuX3RyYWNrQ2hlY2tlZD90aGlzLl93aWR0aCtlOmUpKSx0aGlzLnRyYW5zbGF0ZTNkKHRoaXMuX3grInB4IiwwLDAsdGhpcy4kLnRvZ2dsZUJ1dHRvbiksdGhpcy5fdXNlckFjdGl2YXRlKHRoaXMuX3g+dGhpcy5fd2lkdGgvMil9LF90cmFja0VuZDpmdW5jdGlvbih0KXt0aGlzLiQudG9nZ2xlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoImRyYWdnaW5nIiksdGhpcy50cmFuc2Zvcm0oIiIsdGhpcy4kLnRvZ2dsZUJ1dHRvbil9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXt0aGlzLl9yaXBwbGVDb250YWluZXI9dGhpcy4kLnRvZ2dsZUJ1dHRvbjt2YXIgdD1Kby5fY3JlYXRlUmlwcGxlKCk7cmV0dXJuIHQuaWQ9ImluayIsdC5zZXRBdHRyaWJ1dGUoInJlY2VudGVycyIsIiIpLHQuY2xhc3NMaXN0LmFkZCgiY2lyY2xlIiwidG9nZ2xlLWluayIpLHR9fSksCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpScih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItaGVpZ2h0OiB2YXIoLS1wYXBlci10b29sYmFyLWhlaWdodCwgNjRweCk7CiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0OiB2YXIoLS1wYXBlci10b29sYmFyLXNtLWhlaWdodCwgNTZweCk7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLWhlaWdodCk7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItdG9vbGJhci1iYWNrZ3JvdW5kLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvb2xiYXItY29sb3IsIHZhcigtLWRhcmstdGhlbWUtdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2xiYXI7CiAgICAgIH0KCiAgICAgIDpob3N0KC5hbmltYXRlKSB7CiAgICAgICAgdHJhbnNpdGlvbjogdmFyKC0tcGFwZXItdG9vbGJhci10cmFuc2l0aW9uLCBoZWlnaHQgMC4xOHMgZWFzZS1pbik7CiAgICAgIH0KCiAgICAgIDpob3N0KC5tZWRpdW0tdGFsbCkgewogICAgICAgIGhlaWdodDogY2FsYyh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItaGVpZ2h0KSAqIDIpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2xiYXItbWVkaXVtOwogICAgICB9CgogICAgICA6aG9zdCgudGFsbCkgewogICAgICAgIGhlaWdodDogY2FsYyh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItaGVpZ2h0KSAqIDMpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2xiYXItdGFsbDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQpOwogICAgICAgIHBhZGRpbmc6IDAgMTZweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2xiYXItY29udGVudDsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogVE9ETzogV2hlcmUgc2hvdWxkIG1lZGlhIHF1ZXJ5IGJyZWFrcG9pbnRzIGxpdmUgc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gZWxlbWVudHM/CiAgICAgICAqLwoKICAgICAgQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KSB7CiAgICAgICAgOmhvc3QgewogICAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0KTsKICAgICAgICB9CgogICAgICAgIDpob3N0KC5tZWRpdW0tdGFsbCkgewogICAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQpICogMik7CiAgICAgICAgfQoKICAgICAgICA6aG9zdCgudGFsbCkgewogICAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQpICogMyk7CiAgICAgICAgfQoKICAgICAgICAudG9vbGJhci10b29scyB7CiAgICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgI3RvcEJhciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAvKiBtaWRkbGUgYmFyICovCiAgICAgICNtaWRkbGVCYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQoKICAgICAgOmhvc3QoLnRhbGwpICNtaWRkbGVCYXIsCiAgICAgIDpob3N0KC5tZWRpdW0tdGFsbCkgI21pZGRsZUJhciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwJSk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDEwMCUpOwogICAgICB9CgogICAgICAvKiBib3R0b20gYmFyICovCiAgICAgICNib3R0b21CYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbWFrZSBlbGVtZW50cyAoZS5nLiBidXR0b25zKSByZXNwb25kIHRvIG1vdXNlL3RvdWNoIGV2ZW50cwogICAgICAgKgogICAgICAgKiBcYC50b29sYmFyLXRvb2xzXGAgZGlzYWJsZXMgdG91Y2ggZXZlbnRzIHNvIG11bHRpcGxlIHRvb2xiYXJzIGNhbiBzdGFjayBhbmQgbm90CiAgICAgICAqIGFic29yYiBldmVudHMuIEFsbCBjaGlsZHJlbiBtdXN0IGhhdmUgcG9pbnRlciBldmVudHMgcmUtZW5hYmxlZCB0byB3b3JrIGFzCiAgICAgICAqIGV4cGVjdGVkLgogICAgICAgKi8KICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoKjpub3QoW2Rpc2FibGVkXSkpIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLXRvb2xzID4gOjpzbG90dGVkKC50aXRsZSkgewogICAgICAgIG1hcmdpbi1sZWZ0OiA1NnB4OwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZChwYXBlci1pY29uLWJ1dHRvbiArIC50aXRsZSkgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVGhlIC0tcGFwZXItdG9vbGJhci10aXRsZSBtaXhpbiBpcyBhcHBsaWVkIGhlcmUgaW5zdGVhZCBvZiBhYm92ZSB0bwogICAgICAgKiBmaXggdGhlIGlzc3VlIHdpdGggbWFyZ2luLWxlZnQgYmVpbmcgaWdub3JlZCBkdWUgdG8gY3NzIG9yZGVyaW5nLgogICAgICAgKi8KICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci10aXRsZTsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQocGFwZXItaWNvbi1idXR0b25baWNvbj1tZW51XSkgewogICAgICAgIG1hcmdpbi1yaWdodDogMjRweDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLmZpdCkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IGF1dG87CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAvKiBUT0RPKG5vbXMpOiBVbnRpbCB3ZSBoYXZlIGEgYmV0dGVyIHNvbHV0aW9uIGZvciBjbGFzc2VzIHRoYXQgZG9uJ3QgdXNlCiAgICAgICAqIC9kZWVwLyBjcmVhdGUgb3VyIG93bi4KICAgICAgICovCiAgICAgIC5zdGFydC1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1zdGFydC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5jZW50ZXItanVzdGlmaWVkIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgfQoKICAgICAgLmVuZC1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1lbmQtanVzdGlmaWVkOwogICAgICB9CgogICAgICAuYXJvdW5kLWp1c3RpZmllZCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWFyb3VuZC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1qdXN0aWZpZWQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0idG9wQmFyIiBjbGFzc1wkPSJ0b29sYmFyLXRvb2xzIFtbX2NvbXB1dGVCYXJFeHRyYUNsYXNzZXMoanVzdGlmeSldXSI+CiAgICAgIDxzbG90IG5hbWU9InRvcCI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGRpdiBpZD0ibWlkZGxlQmFyIiBjbGFzc1wkPSJ0b29sYmFyLXRvb2xzIFtbX2NvbXB1dGVCYXJFeHRyYUNsYXNzZXMobWlkZGxlSnVzdGlmeSldXSI+CiAgICAgIDxzbG90IG5hbWU9Im1pZGRsZSI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGRpdiBpZD0iYm90dG9tQmFyIiBjbGFzc1wkPSJ0b29sYmFyLXRvb2xzIFtbX2NvbXB1dGVCYXJFeHRyYUNsYXNzZXMoYm90dG9tSnVzdGlmeSldXSI+CiAgICAgIDxzbG90IG5hbWU9ImJvdHRvbSI+PC9zbG90PgogICAgPC9kaXY+CmAsaXM6InBhcGVyLXRvb2xiYXIiLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJ0b29sYmFyIn0scHJvcGVydGllczp7Ym90dG9tSnVzdGlmeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LGp1c3RpZnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxtaWRkbGVKdXN0aWZ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn19LHJlYWR5OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKHRoaXMuaXMsImlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYXBwLWxheW91dCBpbnN0ZWFkISIpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPXRoaXMuX29ic2VydmUodGhpcyksdGhpcy5fdXBkYXRlQXJpYUxhYmVsbGVkQnkoKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlciYmdGhpcy5fb2JzZXJ2ZXIuZGlzY29ubmVjdCgpfSxfb2JzZXJ2ZTpmdW5jdGlvbih0KXt2YXIgZT1uZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUFyaWFMYWJlbGxlZEJ5KCl9LmJpbmQodGhpcykpO3JldHVybiBlLm9ic2VydmUodCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxlfSxfdXBkYXRlQXJpYUxhYmVsbGVkQnk6ZnVuY3Rpb24oKXtEaSgpO2Zvcih2YXIgdCxlPVtdLG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoWWkodGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJzbG90IikpLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChZaSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3JBbGwoImNvbnRlbnQiKSkpLGk9MDt0PW5baV07aSsrKWZvcih2YXIgcixvPVlpKHQpLmdldERpc3RyaWJ1dGVkTm9kZXMoKSxhPTA7cj1vW2FdO2ErKylpZihyLmNsYXNzTGlzdCYmci5jbGFzc0xpc3QuY29udGFpbnMoInRpdGxlIikpaWYoci5pZCllLnB1c2goci5pZCk7ZWxzZXt2YXIgcz0icGFwZXItdG9vbGJhci1sYWJlbC0iK01hdGguZmxvb3IoMWU0Kk1hdGgucmFuZG9tKCkpO3IuaWQ9cyxlLnB1c2gocyl9ZS5sZW5ndGg+MCYmdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsZS5qb2luKCIgIikpfSxfY29tcHV0ZUJhckV4dHJhQ2xhc3NlczpmdW5jdGlvbih0KXtyZXR1cm4gdD90KygianVzdGlmaWVkIj09PXQ/IiI6Ii1qdXN0aWZpZWQiKToiIn19KSwKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovClJyKHtfdGVtcGxhdGU6X2VgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICB6LWluZGV4OiAxMDAyOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CgogICAgICAjdG9vbHRpcCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b29sdGlwLWJhY2tncm91bmQsICM2MTYxNjEpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b29sdGlwLXRleHQtY29sb3IsIHdoaXRlKTsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXA7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVTY2FsZVVwIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuMCk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZVNjYWxlRG93biB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjApOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC4wKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVGYWRlSW5PcGFjaXR5IHsKICAgICAgICAwJSB7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVGYWRlT3V0T3BhY2l0eSB7CiAgICAgICAgMCUgewogICAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lU2xpZGVEb3duSW4gewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjAwMHB4KTsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgfQogICAgICAgIDEwJSB7CiAgICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZVNsaWRlRG93bk91dCB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIH0KICAgICAgICAxMCUgewogICAgICAgICAgb3BhY2l0eTogMC4yOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjAwMHB4KTsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgfQogICAgICB9CgogICAgICAuZmFkZS1pbi1hbmltYXRpb24gewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LWluLCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lRmFkZUluT3BhY2l0eTsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLWluLCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5mYWRlLW91dC1hbmltYXRpb24gewogICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0LCAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZUZhZGVPdXRPcGFjaXR5OwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24tb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5zY2FsZS11cC1hbmltYXRpb24gewogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1pbiwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZVNjYWxlVXA7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1pbiwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuc2NhbGUtZG93bi1hbmltYXRpb24gewogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVTY2FsZURvd247CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLnNsaWRlLWRvd24tYW5pbWF0aW9uIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTIwMDBweCk7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lU2xpZGVEb3duSW47CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wLCAwLjAsIDAuMiwgMSk7CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuc2xpZGUtZG93bi1hbmltYXRpb24tb3V0IHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVTbGlkZURvd25PdXQ7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDEsIDEpOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLmNhbmNlbC1hbmltYXRpb24gewogICAgICAgIGFuaW1hdGlvbi1kZWxheTogLTMwcyAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAvKiBUaGFua3MgSUUgMTAuICovCgogICAgICAuaGlkZGVuIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0idG9vbHRpcCIgY2xhc3M9ImhpZGRlbiI+CiAgICAgIDxzbG90Pjwvc2xvdD4KICAgIDwvZGl2PgpgLGlzOiJwYXBlci10b29sdGlwIixob3N0QXR0cmlidXRlczp7cm9sZToidG9vbHRpcCIsdGFiaW5kZXg6LTF9LHByb3BlcnRpZXM6e2Zvcjp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9maW5kVGFyZ2V0In0sbWFudWFsTW9kZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfbWFudWFsTW9kZUNoYW5nZWQifSxwb3NpdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImJvdHRvbSJ9LGZpdFRvVmlzaWJsZUJvdW5kczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxvZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjE0fSxtYXJnaW5Ub3A6e3R5cGU6TnVtYmVyLHZhbHVlOjE0fSxhbmltYXRpb25EZWxheTp7dHlwZTpOdW1iZXIsdmFsdWU6NTAwLG9ic2VydmVyOiJfZGVsYXlDaGFuZ2UifSxhbmltYXRpb25FbnRyeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LGFuaW1hdGlvbkV4aXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxhbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue2VudHJ5Olt7bmFtZToiZmFkZS1pbi1hbmltYXRpb24iLG5vZGU6dGhpcyx0aW1pbmc6e2RlbGF5OjB9fV0sZXhpdDpbe25hbWU6ImZhZGUtb3V0LWFuaW1hdGlvbiIsbm9kZTp0aGlzfV19fX0sX3Nob3dpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LGxpc3RlbmVyczp7d2Via2l0QW5pbWF0aW9uRW5kOiJfb25BbmltYXRpb25FbmQifSxnZXQgdGFyZ2V0KCl7dmFyIHQ9WWkodGhpcykucGFyZW50Tm9kZSxlPVlpKHRoaXMpLmdldE93bmVyUm9vdCgpO3JldHVybiB0aGlzLmZvcj9ZaShlKS5xdWVyeVNlbGVjdG9yKCIjIit0aGlzLmZvcik6dC5ub2RlVHlwZT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFP2UuaG9zdDp0fSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2ZpbmRUYXJnZXQoKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLm1hbnVhbE1vZGV8fHRoaXMuX3JlbW92ZUxpc3RlbmVycygpfSxwbGF5QW5pbWF0aW9uOmZ1bmN0aW9uKHQpeyJlbnRyeSI9PT10P3RoaXMuc2hvdygpOiJleGl0Ij09PXQmJnRoaXMuaGlkZSgpfSxjYW5jZWxBbmltYXRpb246ZnVuY3Rpb24oKXt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QuYWRkKCJjYW5jZWwtYW5pbWF0aW9uIil9LHNob3c6ZnVuY3Rpb24oKXtpZighdGhpcy5fc2hvd2luZyl7aWYoIiI9PT1ZaSh0aGlzKS50ZXh0Q29udGVudC50cmltKCkpe2Zvcih2YXIgdD0hMCxlPVlpKHRoaXMpLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKSxuPTA7bjxlLmxlbmd0aDtuKyspaWYoIiIhPT1lW25dLnRleHRDb250ZW50LnRyaW0oKSl7dD0hMTticmVha31pZih0KXJldHVybn10aGlzLl9zaG93aW5nPSEwLHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlbiIpLHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImNhbmNlbC1hbmltYXRpb24iKSx0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImV4aXQiKSksdGhpcy51cGRhdGVQb3NpdGlvbigpLHRoaXMuX2FuaW1hdGlvblBsYXlpbmc9ITAsdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJlbnRyeSIpKX19LGhpZGU6ZnVuY3Rpb24oKXtpZih0aGlzLl9zaG93aW5nKXtpZih0aGlzLl9hbmltYXRpb25QbGF5aW5nKXJldHVybiB0aGlzLl9zaG93aW5nPSExLHZvaWQgdGhpcy5fY2FuY2VsQW5pbWF0aW9uKCk7dGhpcy5fb25BbmltYXRpb25GaW5pc2goKSx0aGlzLl9zaG93aW5nPSExLHRoaXMuX2FuaW1hdGlvblBsYXlpbmc9ITB9fSx1cGRhdGVQb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXMuX3RhcmdldCYmdGhpcy5vZmZzZXRQYXJlbnQpe3ZhciB0PXRoaXMub2Zmc2V0OzE0IT10aGlzLm1hcmdpblRvcCYmMTQ9PXRoaXMub2Zmc2V0JiYodD10aGlzLm1hcmdpblRvcCk7dmFyIGUsbixpPXRoaXMub2Zmc2V0UGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHI9dGhpcy5fdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG89dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxhPShyLndpZHRoLW8ud2lkdGgpLzIscz0oci5oZWlnaHQtby5oZWlnaHQpLzIsbD1yLmxlZnQtaS5sZWZ0LGM9ci50b3AtaS50b3A7c3dpdGNoKHRoaXMucG9zaXRpb24pe2Nhc2UidG9wIjplPWwrYSxuPWMtby5oZWlnaHQtdDticmVhaztjYXNlImJvdHRvbSI6ZT1sK2Esbj1jK3IuaGVpZ2h0K3Q7YnJlYWs7Y2FzZSJsZWZ0IjplPWwtby53aWR0aC10LG49YytzO2JyZWFrO2Nhc2UicmlnaHQiOmU9bCtyLndpZHRoK3Qsbj1jK3N9dGhpcy5maXRUb1Zpc2libGVCb3VuZHM/KGkubGVmdCtlK28ud2lkdGg+d2luZG93LmlubmVyV2lkdGg/KHRoaXMuc3R5bGUucmlnaHQ9IjBweCIsdGhpcy5zdHlsZS5sZWZ0PSJhdXRvIik6KHRoaXMuc3R5bGUubGVmdD1NYXRoLm1heCgwLGUpKyJweCIsdGhpcy5zdHlsZS5yaWdodD0iYXV0byIpLGkudG9wK24rby5oZWlnaHQ+d2luZG93LmlubmVySGVpZ2h0Pyh0aGlzLnN0eWxlLmJvdHRvbT1pLmhlaWdodC1jK3QrInB4Iix0aGlzLnN0eWxlLnRvcD0iYXV0byIpOih0aGlzLnN0eWxlLnRvcD1NYXRoLm1heCgtaS50b3AsbikrInB4Iix0aGlzLnN0eWxlLmJvdHRvbT0iYXV0byIpKToodGhpcy5zdHlsZS5sZWZ0PWUrInB4Iix0aGlzLnN0eWxlLnRvcD1uKyJweCIpfX0sX2FkZExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuX3RhcmdldCYmKHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwibW91c2VlbnRlciIsInNob3ciKSx0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsImZvY3VzIiwic2hvdyIpLHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwibW91c2VsZWF2ZSIsImhpZGUiKSx0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsImJsdXIiLCJoaWRlIiksdGhpcy5saXN0ZW4odGhpcy5fdGFyZ2V0LCJ0YXAiLCJoaWRlIikpLHRoaXMubGlzdGVuKHRoaXMuJC50b29sdGlwLCJhbmltYXRpb25lbmQiLCJfb25BbmltYXRpb25FbmQiKSx0aGlzLmxpc3Rlbih0aGlzLCJtb3VzZWVudGVyIiwiaGlkZSIpfSxfZmluZFRhcmdldDpmdW5jdGlvbigpe3RoaXMubWFudWFsTW9kZXx8dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCksdGhpcy5fdGFyZ2V0PXRoaXMudGFyZ2V0LHRoaXMubWFudWFsTW9kZXx8dGhpcy5fYWRkTGlzdGVuZXJzKCl9LF9kZWxheUNoYW5nZTpmdW5jdGlvbih0KXs1MDAhPT10JiZ0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItdG9vbHRpcC1kZWxheS1pbiI6dCsibXMifSl9LF9tYW51YWxNb2RlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMubWFudWFsTW9kZT90aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKTp0aGlzLl9hZGRMaXN0ZW5lcnMoKX0sX2NhbmNlbEFuaW1hdGlvbjpmdW5jdGlvbigpe3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZW50cnkiKSksdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJleGl0IikpLHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImNhbmNlbC1hbmltYXRpb24iKSx0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QuYWRkKCJoaWRkZW4iKX0sX29uQW5pbWF0aW9uRmluaXNoOmZ1bmN0aW9uKCl7dGhpcy5fc2hvd2luZyYmKHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZW50cnkiKSksdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSgiY2FuY2VsLWFuaW1hdGlvbiIpLHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZXhpdCIpKSl9LF9vbkFuaW1hdGlvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2FuaW1hdGlvblBsYXlpbmc9ITEsdGhpcy5fc2hvd2luZ3x8KHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZXhpdCIpKSx0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QuYWRkKCJoaWRkZW4iKSl9LF9nZXRBbmltYXRpb25UeXBlOmZ1bmN0aW9uKHQpe2lmKCJlbnRyeSI9PT10JiYiIiE9PXRoaXMuYW5pbWF0aW9uRW50cnkpcmV0dXJuIHRoaXMuYW5pbWF0aW9uRW50cnk7aWYoImV4aXQiPT09dCYmIiIhPT10aGlzLmFuaW1hdGlvbkV4aXQpcmV0dXJuIHRoaXMuYW5pbWF0aW9uRXhpdDtpZih0aGlzLmFuaW1hdGlvbkNvbmZpZ1t0XSYmInN0cmluZyI9PXR5cGVvZiB0aGlzLmFuaW1hdGlvbkNvbmZpZ1t0XVswXS5uYW1lKXtpZih0aGlzLmFuaW1hdGlvbkNvbmZpZ1t0XVswXS50aW1pbmcmJnRoaXMuYW5pbWF0aW9uQ29uZmlnW3RdWzBdLnRpbWluZy5kZWxheSYmMCE9PXRoaXMuYW5pbWF0aW9uQ29uZmlnW3RdWzBdLnRpbWluZy5kZWxheSl7dmFyIGU9dGhpcy5hbmltYXRpb25Db25maWdbdF1bMF0udGltaW5nLmRlbGF5OyJlbnRyeSI9PT10P3RoaXMudXBkYXRlU3R5bGVzKHsiLS1wYXBlci10b29sdGlwLWRlbGF5LWluIjplKyJtcyJ9KToiZXhpdCI9PT10JiZ0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQiOmUrIm1zIn0pfXJldHVybiB0aGlzLmFuaW1hdGlvbkNvbmZpZ1t0XVswXS5uYW1lfX0sX3JlbW92ZUxpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuX3RhcmdldCYmKHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJtb3VzZWVudGVyIiwic2hvdyIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJmb2N1cyIsInNob3ciKSx0aGlzLnVubGlzdGVuKHRoaXMuX3RhcmdldCwibW91c2VsZWF2ZSIsImhpZGUiKSx0aGlzLnVubGlzdGVuKHRoaXMuX3RhcmdldCwiYmx1ciIsImhpZGUiKSx0aGlzLnVubGlzdGVuKHRoaXMuX3RhcmdldCwidGFwIiwiaGlkZSIpKSx0aGlzLnVubGlzdGVuKHRoaXMuJC50b29sdGlwLCJhbmltYXRpb25lbmQiLCJfb25BbmltYXRpb25FbmQiKSx0aGlzLnVubGlzdGVuKHRoaXMsIm1vdXNlZW50ZXIiLCJoaWRlIil9fSk7Y2xhc3MgZHN7Y29uc3RydWN0b3IodCl7dGhpcy5saXN0ZW5lcj10fX1jb25zdCBwcz1uZXcgU2V0LGZzPW5ldyBTZXQ7ZnVuY3Rpb24gbXModCl7Y29uc3QgZT1uZXcgZHModCk7cmV0dXJuIHBzLmFkZChlKSxlfWZ1bmN0aW9uIGdzKHQpe2NvbnN0IGU9bmV3IGRzKHQpO3JldHVybiBmcy5hZGQoZSksZX1mdW5jdGlvbiBfcygpe2ZzLmZvckVhY2goKHQ9PnQubGlzdGVuZXIoKSkpfWZ1bmN0aW9uIHlzKHQpe3BzLmRlbGV0ZSh0KX1mdW5jdGlvbiB2cyh0KXtmcy5kZWxldGUodCl9d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhhc2hjaGFuZ2UiLCgoKT0+e3BzLmZvckVhY2goKHQ9PnQubGlzdGVuZXIoKSkpfSkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzdG9yYWdlIiwoKCk9Pntmcy5mb3JFYWNoKCh0PT50Lmxpc3RlbmVyKCkpKX0pKTtsZXQgYnM9ITE7ZnVuY3Rpb24geHMoKXtyZXR1cm4gYnN9bGV0IHdzPSIiO2Z1bmN0aW9uIFNzKHQpe3dzPXR9ZnVuY3Rpb24gTXMoKXtyZXR1cm4gd3N9dmFyIEVzPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHNldFVzZUhhc2g6ZnVuY3Rpb24gVHModCl7YnM9dH0sdXNlSGFzaDp4cyxzZXRGYWtlSGFzaDpTcyxnZXRGYWtlSGFzaDpNc30pO2xldCBDcz17fTtmdW5jdGlvbiBBcygpe3JldHVybiB4cygpP3dpbmRvdy5sb2NhdGlvbi5oYXNoLnNsaWNlKDEpOk1zKCl9ZnVuY3Rpb24ga3ModCl7Y29uc3QgZT17fTtyZXR1cm4gdC5zcGxpdCgiJiIpLmZvckVhY2goKHQ9Pntjb25zdCBuPXQuc3BsaXQoIj0iKTsxPT09bi5sZW5ndGg/ZS5fX3RhYl9fPW5bMF06Mj09PW4ubGVuZ3RoJiYoZVtkZWNvZGVVUklDb21wb25lbnQoblswXSldPWRlY29kZVVSSUNvbXBvbmVudChuWzFdKSl9KSksZX1mdW5jdGlvbiBMcyh0LGU9ITEpe2lmKHhzKCkpaWYoZSl7Y29uc3QgZT1uZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtlLmhhc2g9dCx3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwiIixlLnRvU3RyaW5nKCkpfWVsc2Ugd2luZG93LmxvY2F0aW9uLmhhc2g9dDtlbHNlIFNzKHQpfWZ1bmN0aW9uIFBzKHQpe2xldCBlPSIiO3ZvaWQgMCE9PXQuX190YWJfXyYmKGUrPXQuX190YWJfXyk7Y29uc3Qgbj1PYmplY3Qua2V5cyh0KS5tYXAoKGU9PltlLHRbZV1dKSkuZmlsdGVyKCh0PT4iX190YWJfXyIhPT10WzBdKSkubWFwKCh0PT5lbmNvZGVVUklDb21wb25lbnQodFswXSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0WzFdKSkpLmpvaW4oIiYiKTtyZXR1cm4gbi5sZW5ndGg+MD9lKyImIituOmV9bXMoKCgpPT57Q3M9a3MoQXMoKSl9KSk7Y29uc3R7Z2V0Ok5zLHNldDpJcyxnZXRJbml0aWFsaXplcjpScyxnZXRPYnNlcnZlcjpPcyxkaXNwb3NlQmluZGluZzp6c309SnMoKHQ9PnQpLCh0PT50KSkse2dldDpEcyxzZXQ6QnMsZ2V0SW5pdGlhbGl6ZXI6SHMsZ2V0T2JzZXJ2ZXI6RnMsZGlzcG9zZUJpbmRpbmc6VnN9PUpzKCh0PT4idHJ1ZSI9PT10fHwiZmFsc2UiIT09dCYmdm9pZCAwKSwodD0+dC50b1N0cmluZygpKSkse2dldDpVcyxzZXQ6anMsZ2V0SW5pdGlhbGl6ZXI6R3MsZ2V0T2JzZXJ2ZXI6V3MsZGlzcG9zZUJpbmRpbmc6cXN9PUpzKCh0PT4rdCksKHQ9PnQudG9TdHJpbmcoKSkpLHtnZXQ6WXMsc2V0OlhzLGdldEluaXRpYWxpemVyOiRzLGdldE9ic2VydmVyOktzLGRpc3Bvc2VCaW5kaW5nOlpzfT1KcygodD0+SlNPTi5wYXJzZShhdG9iKHQpKSksKHQ9PmJ0b2EoSlNPTi5zdHJpbmdpZnkodCkpKSk7ZnVuY3Rpb24gSnModCxlKXtjb25zdCBuPVtdLGk9W107ZnVuY3Rpb24gcihlLG49e30pe2NvbnN0e2RlZmF1bHRWYWx1ZTppLHVzZUxvY2FsU3RvcmFnZTpyPSExfT1uLG89cj93aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oZSk6a3MoQXMoKSlbZV07cmV0dXJuIG51bGw9PW8/U2UuZXhwb3J0cy5jbG9uZURlZXAoaSk6dChvKX1mdW5jdGlvbiBvKHQsbixpPXt9KXtjb25zdHtkZWZhdWx0VmFsdWU6byx1c2VMb2NhbFN0b3JhZ2U6YT0hMSx1c2VMb2NhdGlvblJlcGxhY2U6cz0hMX09aSxsPWUobik7aWYoYSl3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0odCxsKSxfcygpO2Vsc2UgaWYoIVNlLmV4cG9ydHMuaXNFcXVhbChuLHIodCx7dXNlTG9jYWxTdG9yYWdlOmF9KSkpaWYoU2UuZXhwb3J0cy5pc0VxdWFsKG4sbykpIShmdW5jdGlvbiBjKHQpe2NvbnN0IGU9a3MoQXMoKSk7ZGVsZXRlIGVbdF0sTHMoUHMoZSkpfSkodCk7ZWxzZXtjb25zdCBlPWtzKEFzKCkpO2VbdF09bCxMcyhQcyhlKSxzKX19cmV0dXJue2dldDpyLHNldDpvLGdldEluaXRpYWxpemVyOmZ1bmN0aW9uIGEodCxlKXtjb25zdCBvPU9iamVjdC5hc3NpZ24oe2RlZmF1bHRWYWx1ZTplLmRlZmF1bHRWYWx1ZSxwb2x5bWVyUHJvcGVydHk6dCx1c2VMb2NhbFN0b3JhZ2U6ITF9LGUpO3JldHVybiBmdW5jdGlvbigpe2NvbnN0IGU9UXModGhpcyx0KSxhPSgpPT57Y29uc3QgdD1yKGUsbyk7U2UuZXhwb3J0cy5pc0VxdWFsKHQsdGhpc1tvLnBvbHltZXJQcm9wZXJ0eV0pfHwodGhpc1tvLnBvbHltZXJQcm9wZXJ0eV09dCl9LHM9KG8udXNlTG9jYWxTdG9yYWdlP2dzOm1zKSgoKCk9PmEoKSkpO3JldHVybiBvLnVzZUxvY2FsU3RvcmFnZT9pLnB1c2gocyk6bi5wdXNoKHMpLGEoKSx0aGlzW28ucG9seW1lclByb3BlcnR5XX19LGdldE9ic2VydmVyOmZ1bmN0aW9uIHModCxlKXtjb25zdCBuPU9iamVjdC5hc3NpZ24oe2RlZmF1bHRWYWx1ZTplLmRlZmF1bHRWYWx1ZSxwb2x5bWVyUHJvcGVydHk6dCx1c2VMb2NhbFN0b3JhZ2U6ITF9LGUpO3JldHVybiBmdW5jdGlvbigpe28oUXModGhpcyx0KSx0aGlzW24ucG9seW1lclByb3BlcnR5XSxuKX19LGRpc3Bvc2VCaW5kaW5nOmZ1bmN0aW9uIGwoKXtuLmZvckVhY2goKHQ9PnlzKHQpKSksaS5mb3JFYWNoKCh0PT52cyh0KSkpfX19ZnVuY3Rpb24gUXModCxlKXtjb25zdCBuPXQuZGlzYW1iaWd1YXRvcjtyZXR1cm4obnVsbD09bj9bZV06W24sZV0pLmpvaW4oIi4iKX1sZXQgdGw9Y2xhc3MgZXh0ZW5kcyB5ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fdGFnRmlsdGVyPVJzKCJ0YWdGaWx0ZXIiLHtkZWZhdWx0VmFsdWU6IiIsdXNlTG9jYWxTdG9yYWdlOiExLHBvbHltZXJQcm9wZXJ0eToiX3RhZ0ZpbHRlciJ9KS5jYWxsKHRoaXMpLHRoaXMuX3RhZ0ZpbHRlck9ic2VydmVyPU9zKCJ0YWdGaWx0ZXIiLHtkZWZhdWx0VmFsdWU6IiIsdXNlTG9jYWxTdG9yYWdlOiExLHBvbHltZXJQcm9wZXJ0eToiX3RhZ0ZpbHRlciJ9KX1fY29tcHV0ZVRhZ0ZpbHRlcigpe3JldHVybiB0aGlzLl90YWdGaWx0ZXJ9fTtmdW5jdGlvbiBlbCh0KXtjb25zdHttb2R1bGVOYW1lOmUsc3R5bGVDb250ZW50Om59PXQsaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkb20tbW9kdWxlIikscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpLG89W107dC5zdHlsZURlcGVuZGVuY2llcyYmdC5zdHlsZURlcGVuZGVuY2llcy5mb3JFYWNoKCh0PT57Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2Uuc2V0QXR0cmlidXRlKCJpbmNsdWRlIix0KSxvLnB1c2goZSl9KSk7Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO09iamVjdC5hc3NpZ24oYSx7dGV4dENvbnRlbnQ6bn0pLG8uZm9yRWFjaCgodD0+e3IuY29udGVudC5hcHBlbmRDaGlsZCh0KX0pKSxyLmNvbnRlbnQuYXBwZW5kQ2hpbGQoYSksaS5hcHBlbmRDaGlsZChyKSxpLnJlZ2lzdGVyKGUpfXRsLnRlbXBsYXRlPV9lYAogICAgPHBhcGVyLWlucHV0CiAgICAgIG5vLWxhYmVsLWZsb2F0PSIiCiAgICAgIGxhYmVsPSJGaWx0ZXIgdGFncyAocmVndWxhciBleHByZXNzaW9ucyBzdXBwb3J0ZWQpIgogICAgICB2YWx1ZT0ie3tfdGFnRmlsdGVyfX0iCiAgICAgIGNsYXNzPSJzZWFyY2gtaW5wdXQiCiAgICA+CiAgICAgIDxpcm9uLWljb24gcHJlZml4PSIiIGljb249InNlYXJjaCIgc2xvdD0icHJlZml4Ij48L2lyb24taWNvbj4KICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDEwcHggNXB4IDEwcHggMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nLG5vdGlmeTohMCxjb21wdXRlZDoiX2NvbXB1dGVUYWdGaWx0ZXIoX3RhZ0ZpbHRlcikifSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHRsLnByb3RvdHlwZSwidGFnRmlsdGVyIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfdGFnRmlsdGVyT2JzZXJ2ZXIifSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHRsLnByb3RvdHlwZSwiX3RhZ0ZpbHRlciIsdm9pZCAwKSx0bD10KFtpKCJ0Zi10YWctZmlsdGVyZXIiKV0sdGwpLGVsKHttb2R1bGVOYW1lOiJkYXNoYm9hcmQtc3R5bGUiLHN0eWxlRGVwZW5kZW5jaWVzOlsiaXJvbi1mbGV4Il0sc3R5bGVDb250ZW50OiJcbiAgICAgIDpob3N0IHtcbiAgICAgICAgLS1zaWRlYmFyLXZlcnRpY2FsLXBhZGRpbmc6IDE1cHg7XG4gICAgICAgIC0tc2lkZWJhci1sZWZ0LXBhZGRpbmc6IDMwcHg7XG4gICAgICB9XG5cbiAgICAgIFtzbG90PSdzaWRlYmFyJ10ge1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICAgICAgICBwYWRkaW5nOiA1cHggMDtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICB9XG5cbiAgICAgIC5zZXR0aW5ncyB7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDUwcHg7XG4gICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTtcbiAgICAgIH1cblxuICAgICAgLnJ1bnMtc2VsZWN0b3Ige1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWdyb3c6IDE7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDIwMHB4O1xuICAgICAgfVxuXG4gICAgICB0Zi1ydW5zLXNlbGVjdG9yIHtcbiAgICAgICAgZmxleC1ncm93OiAxO1xuICAgICAgICBmbGV4LXNocmluazogMTtcbiAgICAgICAgbGVmdDogdmFyKC0tc2lkZWJhci1sZWZ0LXBhZGRpbmcpO1xuICAgICAgICBtYXgtaGVpZ2h0OiBjYWxjKDEwMCUgLSB2YXIoLS1zaWRlYmFyLXZlcnRpY2FsLXBhZGRpbmcpICogMik7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICB9XG5cbiAgICAgIC5zZWFyY2gtaW5wdXQge1xuICAgICAgICBtYXJnaW46IDEwcHggNXB4IDAgMTBweDtcbiAgICAgIH1cblxuICAgICAgLnNpZGViYXItc2VjdGlvbiB7XG4gICAgICAgIGJvcmRlci10b3A6IHNvbGlkIDFweCB2YXIoLS10Yi11aS1ib3JkZXIpO1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gICAgICAgIHBhZGRpbmc6IHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgMFxuICAgICAgICAgIHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgdmFyKC0tc2lkZWJhci1sZWZ0LXBhZGRpbmcpO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB9XG5cbiAgICAgIC5zaWRlYmFyLXNlY3Rpb246Zmlyc3Qtb2YtdHlwZSB7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIH1cblxuICAgICAgLnNpZGViYXItc2VjdGlvbiBwYXBlci1idXR0b24ge1xuICAgICAgICBtYXJnaW46IDVweDtcbiAgICAgIH1cblxuICAgICAgLnNpZGViYXItc2VjdGlvbiBwYXBlci1idXR0b246Zmlyc3Qtb2YtdHlwZSB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAwICFpbXBvcnRhbnQ7XG4gICAgICB9XG5cbiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmxhc3Qtb2YtdHlwZSB7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMCAhaW1wb3J0YW50O1xuICAgICAgfVxuXG4gICAgICAuc2lkZWJhci1zZWN0aW9uID4gOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICAgICAgcGFkZGluZy10b3A6IDA7XG4gICAgICB9XG5cbiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6bGFzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiAwO1xuICAgICAgfVxuXG4gICAgICAuc2lkZWJhci1zZWN0aW9uIGgzIHtcbiAgICAgICAgY29sb3I6IHZhcigtLXRiLXNlY29uZGFyeS10ZXh0LWNvbG9yKTtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICAgICAgbWFyZ2luOiAxMHB4IDAgNXB4O1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIH1cblxuICAgICAgcGFwZXItY2hlY2tib3gge1xuICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTtcbiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTtcbiAgICAgICAgZm9udC1zaXplOiAxNXB4O1xuICAgICAgICBtYXJnaW4tdG9wOiA1cHg7XG4gICAgICB9XG5cbiAgICAgIGEge1xuICAgICAgICBjb2xvcjogdmFyKC0tdGItbGluayk7XG4gICAgICB9XG5cbiAgICAgIGE6dmlzaXRlZCB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS10Yi1saW5rLXZpc2l0ZWQpO1xuICAgICAgfVxuICAifSk7Y29uc3Qgbmw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtmdW5jdGlvbiBpbCh0KXtyZXR1cm4gY2xhc3MgZXh0ZW5kcyB0e2Nvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLl9tYXliZVNldERhcmtNb2RlKCksdGhpcy5vYnNlcnZlcj1uZXcgTXV0YXRpb25PYnNlcnZlcigodD0+e3Quc29tZSgodD0+ImNsYXNzIj09PXQuYXR0cmlidXRlTmFtZSkpJiZ0aGlzLl9tYXliZVNldERhcmtNb2RlKCl9KSksdGhpcy5vYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHkse2F0dHJpYnV0ZXM6ITB9KX1kaXNjb25uZWN0ZWRDYWxsYmFjaygpe3ZhciB0O3N1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCksbnVsbD09PSh0PXRoaXMub2JzZXJ2ZXIpfHx2b2lkIDA9PT10fHx0LmRpc2Nvbm5lY3QoKX1fbWF5YmVTZXREYXJrTW9kZSgpe3RoaXMuY2xhc3NMaXN0LnRvZ2dsZSgiZGFyay1tb2RlIixkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygiZGFyay1tb2RlIikpfX19bmwuc2V0QXR0cmlidXRlKCJpcyIsImN1c3RvbS1zdHlsZSIpLG5sLnRleHRDb250ZW50PSJcbiAgOnJvb3Qge1xuICAgIC0tdGItb3JhbmdlLXdlYWs6ICNmZmE3MjY7XG4gICAgLS10Yi1vcmFuZ2Utc3Ryb25nOiAjZjU3YzAwO1xuICAgIC0tdGItb3JhbmdlLWRhcms6ICNkYzczMjA7XG4gICAgLS10Yi1ncmV5LWRhcmtlcjogI2UyZTJlMjtcbiAgICAtLXRiLWdyZXktbGlnaHRlcjogI2YzZjNmMztcbiAgICAtLXRiLXVpLWRhcmstYWNjZW50OiAjNzU3NTc1O1xuICAgIC0tdGItdWktbGlnaHQtYWNjZW50OiAjZTBlMGUwO1xuICAgIC0tdGItdWktYm9yZGVyOiB2YXIoLS1wYXBlci1ncmV5LTMwMCk7XG4gICAgLS10Yi1ncmFwaC1mYWRlZDogI2UwZDRiMztcbiAgICAtLXRiLXNlY29uZGFyeS10ZXh0LWNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTgwMCk7XG4gICAgLS10Yi1yYWlzZWQtYnV0dG9uLXNoYWRvdy1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjIpO1xuICAgIC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIC0tc2Vjb25kYXJ5LWJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XG4gICAgLS10Yi1sYXlvdXQtYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcbiAgICAtLXRiLWxpbms6ICMxOTc2ZDI7IC8qIG1hdGVyaWFsIGJsdWUgNzAwLiAqL1xuICAgIC0tdGItbGluay12aXNpdGVkOiAjN2IxZmEyOyAvKiBtYXRlcmlhbCBwdXJwbGUgNzAwLiAqL1xuICB9XG5cbiAgOnJvb3QgLmRhcmstbW9kZSB7XG4gICAgLS10Yi11aS1ib3JkZXI6IHZhcigtLXBhcGVyLWdyZXktNzAwKTtcbiAgICAtLXRiLXVpLWRhcmstYWNjZW50OiB2YXIoLS1wYXBlci1ncmV5LTQwMCk7XG4gICAgLS10Yi11aS1saWdodC1hY2NlbnQ6IHZhcigtLXBhcGVyLWdyZXktNjAwKTtcbiAgICAtLXRiLXNlY29uZGFyeS10ZXh0LWNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTQwMCk7XG4gICAgLS10Yi1yYWlzZWQtYnV0dG9uLXNoYWRvdy1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpO1xuICAgIC0tcHJpbWFyeS10ZXh0LWNvbG9yOiAjZmZmO1xuICAgIC0tc2Vjb25kYXJ5LXRleHQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNDAwKTtcbiAgICAtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvcjogIzMwMzAzMDsgIC8qIG1hdGVyaWFsIGdyZXkgQTQwMC4gKi9cbiAgICAtLXNlY29uZGFyeS1iYWNrZ3JvdW5kLWNvbG9yOiAjM2EzYTNhO1xuICAgIC0tdGItbGF5b3V0LWJhY2tncm91bmQtY29sb3I6ICMzYTNhM2E7XG4gICAgLS10Yi1saW5rOiAjNDJhNWY1OyAvKiBtYXRlcmlhbCBibHVlIDQwMC4gKi9cbiAgICAtLXRiLWxpbmstdmlzaXRlZDogI2JhNjhjODsgLyogbWF0ZXJpYWwgcHVycGxlIDMwMC4gKi9cbiAgICAvKiBPdmVycmlkZXMgcGFwZXItbWF0ZXJpYWwgKi9cbiAgICAtLXNoYWRvdy1lbGV2YXRpb24tMmRwXy1fYm94LXNoYWRvdzogMCAycHggMnB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSxcbiAgICAgIDAgMXB4IDVweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMiksXG4gICAgICAwIDNweCAxcHggLTJweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7XG4gIH1cbiIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChubCksZWwoe21vZHVsZU5hbWU6InNjcm9sbGJhci1zdHlsZSIsc3R5bGVDb250ZW50OiJcbiAgICAuc2Nyb2xsYmFyOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG4gICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgfVxuXG4gICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICAgICAgd2lkdGg6IDEwcHg7XG4gICAgfVxuXG4gICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xuICAgICAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgICAgIC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAwIDJweCByZ2JhKDAsIDAsIDAsIDAuMyk7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTUwMCk7XG4gICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApO1xuICAgIH1cbiAgICAuc2Nyb2xsYmFyIHtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuICAifSk7bGV0IHJsPWNsYXNzIGV4dGVuZHMoaWwoeWUpKXt9O3JsLnRlbXBsYXRlPV9lYAogICAgPGRpdiBpZD0ic2lkZWJhciI+CiAgICAgIDxzbG90IG5hbWU9InNpZGViYXIiPjwvc2xvdD4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9ImNlbnRlciI+CiAgICAgIDxzbG90IG5hbWU9ImNlbnRlciIgY2xhc3M9InNjb2xsYmFyIj48L3Nsb3Q+CiAgICA8L2Rpdj4KICAgIDxzdHlsZSBpbmNsdWRlPSJzY3JvbGxiYXItc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIDpob3N0KC5kYXJrLW1vZGUpIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zZWNvbmRhcnktYmFja2dyb3VuZC1jb2xvcik7CiAgICAgIH0KCiAgICAgICNzaWRlYmFyIHsKICAgICAgICBmbGV4OiAwIDAgdmFyKC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLWJhc2lzLCAyNSUpOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBtYXgtd2lkdGg6IHZhcigtLXRmLWRhc2hib2FyZC1sYXlvdXQtc2lkZWJhci1tYXgtd2lkdGgsIDM1MHB4KTsKICAgICAgICBtaW4td2lkdGg6IHZhcigtLXRmLWRhc2hib2FyZC1sYXlvdXQtc2lkZWJhci1taW4td2lkdGgsIDI3MHB4KTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CgogICAgICAjY2VudGVyIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIDo6c2xvdHRlZChbc2xvdD0nY2VudGVyJ10pIHsKICAgICAgICBjb250YWluOiBzdHJpY3Q7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KCiAgICAgIC50Zi1ncmFwaC1kYXNoYm9hcmQgI2NlbnRlciB7CiAgICAgICAgYmFja2dyb3VuZDogI2ZmZjsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHJsPXQoW2koInRmLWRhc2hib2FyZC1sYXlvdXQiKV0scmwpO2NvbnN0IG9sPSJURi5UZW5zb3JCb2FyZC5QYWdpbmF0ZWRWaWV3LmxpbWl0IjtsZXQgYWw9bnVsbDtjb25zdCBzbD1uZXcgU2V0O2Z1bmN0aW9uIGxsKHQpe3NsLmFkZCh0KX1mdW5jdGlvbiBjbCh0KXtzbC5kZWxldGUodCl9ZnVuY3Rpb24gdWwoKXtyZXR1cm4gbnVsbD09YWwmJihhbD1VcyhvbCx7dXNlTG9jYWxTdG9yYWdlOiEwfSksKG51bGw9PWFsfHwhaXNGaW5pdGUoYWwpfHxhbDw9MCkmJihhbD0xMikpLGFsfWNsYXNzIGhsIGV4dGVuZHMgeWV7dXBkYXRlQXJyYXlQcm9wKHQsZSxuKXtsZXQgaT10aGlzLmdldCh0KTtjb25zdCByPWU7aWYoIUFycmF5LmlzQXJyYXkocikpdGhyb3cgUmFuZ2VFcnJvcihgRXhwZWN0ZWQgbmV3IHZhbHVlIHRvICcke3R9JyB0byBiZSBhbiBhcnJheS5gKTtBcnJheS5pc0FycmF5KGkpfHwoaT1bXSx0aGlzLnNldCh0LGkpKTtjb25zdCBvPW5ldyBTZXQoci5tYXAoKCh0LGUpPT5uKHQsZSkpKSk7bGV0IGE9MCxzPTA7Zm9yKDthPGkubGVuZ3RoJiZzPHIubGVuZ3RoOylvLmhhcyhuKGlbYV0sYSkpPyhuKGlbYV0sYSk9PW4ocltzXSxzKT90aGlzLnNldChgJHt0fS4ke2F9YCxyW3NdKTp0aGlzLnNwbGljZSh0LGEsMCxyW3NdKSxzKyssYSsrKTp0aGlzLnNwbGljZSh0LGEsMSk7YTxpLmxlbmd0aCYmdGhpcy5zcGxpY2UodCxhKSxzPHIubGVuZ3RoJiZ0aGlzLnB1c2godCwuLi5yLnNsaWNlKHMpKX19Y2xhc3MgZGwgZXh0ZW5kcyBobHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5hcz0iaXRlbSIsdGhpcy5fY29udGVudEFjdGl2ZT0hMCx0aGlzLl9kb21Cb290c3RyYXBwZWQ9ITEsdGhpcy5fY3Rvcj1udWxsLHRoaXMuX3JlbmRlcmVkSXRlbXM9W10sdGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3Q9bmV3IE1hcCx0aGlzLl9scnVDYWNoZWRJdGVtcz1uZXcgTWFwLHRoaXMuX2NhY2hlU2l6ZT0xMCx0aGlzLl9nZXRJdGVtS2V5PXQ9PkpTT04uc3RyaW5naWZ5KHQpLHRoaXMuX2lzQ29ubmVjdGVkPSExfWNvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLl9pc0Nvbm5lY3RlZD0hMH1zZXRDYWNoZVNpemUodCl7dGhpcy5fY2FjaGVTaXplPXR9c2V0R2V0SXRlbUtleSh0KXt0aGlzLl9nZXRJdGVtS2V5PXR9dXBkYXRlRG9tKHQpe3RoaXMudXBkYXRlQXJyYXlQcm9wKCJfcmVuZGVyZWRJdGVtcyIsdCx0aGlzLl9nZXRJdGVtS2V5KX1fZW5zdXJlVGVtcGxhdGl6ZWQoKXtpZighdGhpcy5pc0Nvbm5lY3RlZClyZXR1cm4hMTtpZighdGhpcy5fY3Rvcil7Y29uc3QgdD10aGlzLnF1ZXJ5U2VsZWN0b3IoInRlbXBsYXRlIik7dGhpcy5fY3Rvcj0kcih0LHRoaXMse3BhcmVudE1vZGVsOiEwLGluc3RhbmNlUHJvcHM6e1t0aGlzLmFzXTohMCxhY3RpdmU6dGhpcy5fY29udGVudEFjdGl2ZX0sZm9yd2FyZEhvc3RQcm9wOmZ1bmN0aW9uKHQsZSl7dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZm9yRWFjaCgobj0+e24uZm9yd2FyZEhvc3RQcm9wKHQsZSl9KSl9fSl9cmV0dXJuITB9X2Jvb3RzdHJhcERvbSgpe3RoaXMuX2Vuc3VyZVRlbXBsYXRpemVkKCkmJiF0aGlzLl9kb21Cb290c3RyYXBwZWQmJihuZXcgTXV0YXRpb25PYnNlcnZlcigodD0+e2Zvcihjb25zdCBlIG9mIHQpaWYoImNoaWxkTGlzdCI9PT1lLnR5cGUpZm9yKGNvbnN0IHQgb2YgQXJyYXkuZnJvbShlLmFkZGVkTm9kZXMpKXQgaW5zdGFuY2VvZiBFbGVtZW50JiZ0LnNldEF0dHJpYnV0ZSgic2xvdCIsIml0ZW1zIil9KSkub2JzZXJ2ZSh0aGlzLHtjaGlsZExpc3Q6ITB9KSxBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pLmZvckVhY2goKHQ9Pnt0aGlzLnJlbW92ZUNoaWxkKHQpfSkpLHRoaXMuX2xydUNhY2hlZEl0ZW1zLmNsZWFyKCksdGhpcy5fcmVuZGVyZWRJdGVtcy5mb3JFYWNoKCgodCxlKT0+dGhpcy5faW5zZXJ0SXRlbSh0LGUpKSksdGhpcy5fZG9tQm9vdHN0cmFwcGVkPSEwKX1fdXBkYXRlQWN0aXZlKCl7dGhpcy5fZG9tQm9vdHN0cmFwcGVkJiZBcnJheS5mcm9tKHRoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LnZhbHVlcygpKS5mb3JFYWNoKCh0PT57dC5ub3RpZnlQYXRoKCJhY3RpdmUiLHRoaXMuX2NvbnRlbnRBY3RpdmUpfSkpfV91cGRhdGVEb20odCl7aWYodGhpcy5fZG9tQm9vdHN0cmFwcGVkJiYiX3JlbmRlcmVkSXRlbXMiIT10LnBhdGgmJiJfcmVuZGVyZWRJdGVtcy5sZW5ndGgiIT10LnBhdGgpaWYoIl9yZW5kZXJlZEl0ZW1zLnNwbGljZXMiPT09dC5wYXRoKXQudmFsdWUuaW5kZXhTcGxpY2VzLmZvckVhY2goKHQ9Pntjb25zdHtpbmRleDplLGFkZGVkQ291bnQ6bixvYmplY3Q6aSxyZW1vdmVkOnJ9PXQ7ci5mb3JFYWNoKCh0PT57dGhpcy5fcmVtb3ZlSXRlbSh0LHRoaXMuY2hpbGRyZW5bZV0pfSkpLGkuc2xpY2UoZSxlK24pLmZvckVhY2goKCh0LG4pPT50aGlzLl9pbnNlcnRJdGVtKHQsZStuKSkpLHRoaXMuX3RyaW1DYWNoZSgpfSkpO2Vsc2V7Y29uc3QgZT10aGlzLl9nZXRJdGVtS2V5KHQudmFsdWUpO3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmhhcyhlKT90aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5nZXQoZSkubm90aWZ5UGF0aCh0aGlzLmFzLHQudmFsdWUpOmNvbnNvbGUud2FybihgRXhwZWN0ZWQgJyR7ZX0nIHRvIGV4aXN0IGluIHRoZSBET00gYnV0IGNvdWxkIG5vdCBmaW5kIG9uZS5gKX19X2luc2VydEl0ZW0odCxlKXtpZighdGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKSl0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIHRlbXBsYXRpemVkIGJlZm9yZSBpbnNlcnRpbmcgYW4gaXRlbSIpO2xldCBuO2NvbnN0IGk9dGhpcy5fZ2V0SXRlbUtleSh0KTtpZih0aGlzLl9scnVDYWNoZWRJdGVtcy5oYXMoaSkpbj10aGlzLl9scnVDYWNoZWRJdGVtcy5nZXQoaSksdGhpcy5fbHJ1Q2FjaGVkSXRlbXMuZGVsZXRlKGkpLHRoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmdldChpKS5ub3RpZnlQYXRoKCJhY3RpdmUiLHRoaXMuX2NvbnRlbnRBY3RpdmUpO2Vsc2V7Y29uc3QgZT1uZXcgdGhpcy5fY3Rvcih7W3RoaXMuYXNdOnQsYWN0aXZlOnRoaXMuX2NvbnRlbnRBY3RpdmV9KTtuPWUucm9vdCx0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5zZXQoaSxlKX10aGlzLmNoaWxkcmVuW2VdP3RoaXMuaW5zZXJ0QmVmb3JlKG4sdGhpcy5jaGlsZHJlbltlXSk6KChuLm5vZGVUeXBlPT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU/QXJyYXkuZnJvbShuLmNoaWxkcmVuKTpbbl0pLmZvckVhY2goKHQ9PnQuc2V0QXR0cmlidXRlKCJzbG90IiwiaXRlbXMiKSkpLHRoaXMuYXBwZW5kQ2hpbGQobikpfV9yZW1vdmVJdGVtKHQsZSl7ZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7Y29uc3Qgbj10aGlzLl9nZXRJdGVtS2V5KHQpO3RoaXMuX2xydUNhY2hlZEl0ZW1zLnNldChuLGUpLHRoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmdldChuKS5ub3RpZnlQYXRoKCJhY3RpdmUiLCExKX1fdHJpbUNhY2hlKCl7Zm9yKDt0aGlzLl9scnVDYWNoZWRJdGVtcy5zaXplPnRoaXMuX2NhY2hlU2l6ZTspe2NvbnN0W3RdPXRoaXMuX2xydUNhY2hlZEl0ZW1zLmtleXMoKTt0aGlzLl9scnVDYWNoZWRJdGVtcy5kZWxldGUodCksdGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZGVsZXRlKHQpfX19dChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sZGwucHJvdG90eXBlLCJhcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sZGwucHJvdG90eXBlLCJpdGVtcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGRsLnByb3RvdHlwZSwiX2NvbnRlbnRBY3RpdmUiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGRsLnByb3RvdHlwZSwiX2RvbUJvb3RzdHJhcHBlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxkbC5wcm90b3R5cGUsIl9jdG9yIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxkbC5wcm90b3R5cGUsIl9yZW5kZXJlZEl0ZW1zIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGRsLnByb3RvdHlwZSwiX3JlbmRlcmVkVGVtcGxhdGVJbnN0Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGRsLnByb3RvdHlwZSwiX2xydUNhY2hlZEl0ZW1zIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGRsLnByb3RvdHlwZSwiX2NhY2hlU2l6ZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxkbC5wcm90b3R5cGUsIl9nZXRJdGVtS2V5Iix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxkbC5wcm90b3R5cGUsIl9pc0Nvbm5lY3RlZCIsdm9pZCAwKSx0KFthKCJfaXNDb25uZWN0ZWQiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGRsLnByb3RvdHlwZSwiX2Jvb3RzdHJhcERvbSIsbnVsbCksdChbYSgiX2NvbnRlbnRBY3RpdmUiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGRsLnByb3RvdHlwZSwiX3VwZGF0ZUFjdGl2ZSIsbnVsbCksdChbYSgiX3JlbmRlcmVkSXRlbXMuKiIsIl9kb21Cb290c3RyYXBwZWQiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbT2JqZWN0XSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGRsLnByb3RvdHlwZSwiX3VwZGF0ZURvbSIsbnVsbCksdChbYSgiX2NhY2hlU2l6ZSIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sZGwucHJvdG90eXBlLCJfdHJpbUNhY2hlIixudWxsKTtsZXQgcGw9Y2xhc3MgZXh0ZW5kcyBkbHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5kaXNhYmxlUGFnaW5hdGlvbj0hMSx0aGlzLmdldENhdGVnb3J5SXRlbUtleT10PT5KU09OLnN0cmluZ2lmeSh0KSx0aGlzLl9saW1pdD0xMix0aGlzLl9hY3RpdmVJbmRleD0wLHRoaXMuX3BhZ2VJbnB1dFJhd1ZhbHVlPSIiLHRoaXMuX3BhZ2VJbnB1dEZvY3VzZWQ9ITF9X2NvbXB1dGVDb3VudCgpe3JldHVybiB0aGlzLmNhdGVnb3J5Lml0ZW1zLmxlbmd0aH1nZXQgX2hhc011bHRpcGxlKCl7cmV0dXJuIHRoaXMuX2NvdW50PjF9X3RvZ2dsZVBhbmUoKXt0aGlzLm9wZW5lZD0hdGhpcy5vcGVuZWR9X2NoYW5nZUNvbnRlbnRBY3RpdmUodCl7dGhpcy5fY29udGVudEFjdGl2ZT10fV9vblBhbmVSZW5kZXJlZENoYW5nZWQodCxlKXt0JiZ0IT09ZSYmdGhpcy4kLmlmUmVuZGVyZWQucmVuZGVyKCl9X2NvbXB1dGVQYW5lUmVuZGVyZWQodCl7cmV0dXJuISh0Lm1ldGFkYXRhLnR5cGU9PT1ici5TRUFSQ0hfUkVTVUxUUyYmIiI9PT10Lm5hbWUpfWdldCBfaXRlbXNSZW5kZXJlZCgpe3JldHVybiB0aGlzLl9wYW5lUmVuZGVyZWQmJnRoaXMub3BlbmVkfV9jb21wdXRlSXNTZWFyY2hSZXN1bHRzKHQpe3JldHVybiB0PT09YnIuU0VBUkNIX1JFU1VMVFN9X2NvbXB1dGVJc0ludmFsaWRTZWFyY2hSZXN1bHRzKHQpe3JldHVybiB0LnR5cGU9PT1ici5TRUFSQ0hfUkVTVUxUUyYmIXQudmFsaWRSZWdleH1fY29tcHV0ZUlzVW5pdmVyc2FsU2VhcmNoUXVlcnkodCl7cmV0dXJuIHQudHlwZT09PWJyLlNFQVJDSF9SRVNVTFRTJiZ0LnVuaXZlcnNhbFJlZ2V4fV9pc0NvbXBvc2l0ZVNlYXJjaCgpe2NvbnN0e3R5cGU6dCxjb21wb3NpdGVTZWFyY2g6ZX09dGhpcy5jYXRlZ29yeS5tZXRhZGF0YTtyZXR1cm4gZSYmdD09PWJyLlNFQVJDSF9SRVNVTFRTfXJlYWR5KCl7c3VwZXIucmVhZHkoKSx0aGlzLm9wZW5lZD1udWxsPT10aGlzLmluaXRpYWxPcGVuZWR8fHRoaXMuaW5pdGlhbE9wZW5lZCx0aGlzLl9saW1pdExpc3RlbmVyPSgpPT57dGhpcy5zZXQoIl9saW1pdCIsdWwoKSl9LGxsKHRoaXMuX2xpbWl0TGlzdGVuZXIpLHRoaXMuX2xpbWl0TGlzdGVuZXIoKX1kZXRhY2hlZCgpe2NsKHRoaXMuX2xpbWl0TGlzdGVuZXIpfV91cGRhdGVSZW5kZXJlZEl0ZW1zKCl7dmFyIHQ9dGhpcy5fbGltaXQsZT10aGlzLmRpc2FibGVQYWdpbmF0aW9uO2lmKCF0aGlzLl9pdGVtc1JlbmRlcmVkKXJldHVybjtjb25zdCBuPU1hdGguZmxvb3IodGhpcy5fYWN0aXZlSW5kZXgvdCksaT10aGlzLmNhdGVnb3J5Lml0ZW1zfHxbXSxyPWU/aTppLnNsaWNlKG4qdCwobisxKSp0KTt0aGlzLnVwZGF0ZURvbShyKX1fbGltaXRDaGFuZ2VkKHQpe3RoaXMuc2V0Q2FjaGVTaXplKDIqdCl9X2dldENhdGVnb3J5SXRlbUtleUNoYW5nZWQoKXt0aGlzLnNldEdldEl0ZW1LZXkodGhpcy5nZXRDYXRlZ29yeUl0ZW1LZXkpfWdldCBfY3VycmVudFBhZ2UoKXtyZXR1cm4gTWF0aC5mbG9vcih0aGlzLl9hY3RpdmVJbmRleC90aGlzLl9saW1pdCkrMX1fY29tcHV0ZVBhZ2VDb3VudCh0LGUpe3JldHVybiB0aGlzLmNhdGVnb3J5P01hdGguY2VpbCh0aGlzLmNhdGVnb3J5Lml0ZW1zLmxlbmd0aC9lKTowfWdldCBfbXVsdGlwbGVQYWdlc0V4aXN0KCl7cmV0dXJuIXRoaXMuZGlzYWJsZVBhZ2luYXRpb24mJnRoaXMuX3BhZ2VDb3VudD4xfWdldCBfaGFzUHJldmlvdXNQYWdlKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnRQYWdlPjF9Z2V0IF9oYXNOZXh0UGFnZSgpe3JldHVybiB0aGlzLl9jdXJyZW50UGFnZTx0aGlzLl9wYWdlQ291bnR9X2NvbXB1dGVJbnB1dFdpZHRoKHQpe3JldHVybmBjYWxjKCR7dC50b1N0cmluZygpLmxlbmd0aH1lbSArIDIwcHgpYH1fc2V0QWN0aXZlSW5kZXgodCl7Y29uc3QgZT0odGhpcy5jYXRlZ29yeS5pdGVtc3x8W10pLmxlbmd0aC0xO3Q+ZSYmKHQ9ZSksdDwwJiYodD0wKSx0aGlzLnNldCgiX2FjdGl2ZUluZGV4Iix0KX1fY2xhbXBBY3RpdmVJbmRleCgpe3RoaXMuX3NldEFjdGl2ZUluZGV4KHRoaXMuX2FjdGl2ZUluZGV4KX1fcGVyZm9ybVByZXZpb3VzUGFnZSgpe3RoaXMuX3NldEFjdGl2ZUluZGV4KHRoaXMuX2FjdGl2ZUluZGV4LXRoaXMuX2xpbWl0KX1fcGVyZm9ybU5leHRQYWdlKCl7dGhpcy5fc2V0QWN0aXZlSW5kZXgodGhpcy5fYWN0aXZlSW5kZXgrdGhpcy5fbGltaXQpfV9jb21wdXRlUGFnZUlucHV0VmFsdWUodCxlLG4pe3JldHVybiB0P2U6bi50b1N0cmluZygpfV9oYW5kbGVQYWdlSW5wdXRFdmVudCh0KXt0aGlzLnNldCgiX3BhZ2VJbnB1dFJhd1ZhbHVlIix0LnRhcmdldC52YWx1ZSk7Y29uc3QgZT1OdW1iZXIodC50YXJnZXQudmFsdWV8fE5hTik7aWYoaXNOYU4oZSkpcmV0dXJuO2NvbnN0IG49TWF0aC5tYXgoMSxNYXRoLm1pbihlLHRoaXMuX3BhZ2VDb3VudCkpLTE7dGhpcy5fc2V0QWN0aXZlSW5kZXgodGhpcy5fbGltaXQqbil9X2hhbmRsZVBhZ2VDaGFuZ2VFdmVudCgpe3RoaXMuc2V0KCJfcGFnZUlucHV0UmF3VmFsdWUiLHRoaXMuX2N1cnJlbnRQYWdlLnRvU3RyaW5nKCkpfV9oYW5kbGVQYWdlRm9jdXNFdmVudCgpe3RoaXMuc2V0KCJfcGFnZUlucHV0UmF3VmFsdWUiLHRoaXMuX3BhZ2VJbnB1dFZhbHVlKSx0aGlzLnNldCgiX3BhZ2VJbnB1dEZvY3VzZWQiLCEwKX1faGFuZGxlUGFnZUJsdXJFdmVudCgpe3RoaXMuc2V0KCJfcGFnZUlucHV0Rm9jdXNlZCIsITEpfV91cGRhdGVQYWdlSW5wdXRWYWx1ZSh0KXtjb25zdCBlPXRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIjcGFnZS1pbnB1dCBpbnB1dCIpO2UmJihlLnZhbHVlPXQpfV91cGRhdGVJbnB1dFdpZHRoKCl7dGhpcy51cGRhdGVTdHlsZXMoeyItLXRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3LXBhZ2UtaW5wdXQtd2lkdGgiOnRoaXMuX2lucHV0V2lkdGh9KX19O3BsLnRlbXBsYXRlPV9lYAogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19wYW5lUmVuZGVyZWRdXSIgaWQ9ImlmUmVuZGVyZWQiPgogICAgICA8YnV0dG9uIGNsYXNzPSJoZWFkaW5nIiBvbi10YXA9Il90b2dnbGVQYW5lIiBvcGVuLWJ1dHRvbiQ9Iltbb3BlbmVkXV0iPgogICAgICAgIDxzcGFuIGNsYXNzPSJuYW1lIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNTZWFyY2hSZXN1bHRzXV0iPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzQ29tcG9zaXRlU2VhcmNoKGNhdGVnb3J5KV1dIj4KICAgICAgICAgICAgICA8c3Bhbj5UYWdzIG1hdGNoaW5nIG11bHRpcGxlIGV4cGVyaW1lbnRzPC9zcGFuPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNJbnZhbGlkU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgICAgIDxzcGFuCiAgICAgICAgICAgICAgICAgID4mbmJzcDs8c3Ryb25nPihtYWxmb3JtZWQgcmVndWxhciBleHByZXNzaW9uKTwvc3Ryb25nPjwvc3BhbgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzQ29tcG9zaXRlU2VhcmNoKGNhdGVnb3J5KV1dIj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGlnaHQiPlRhZ3MgbWF0Y2hpbmcgLzwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY2F0ZWdvcnktbmFtZSIgdGl0bGUkPSJbW2NhdGVnb3J5Lm5hbWVdXSIKICAgICAgICAgICAgICAgID5bW2NhdGVnb3J5Lm5hbWVdXTwvc3BhbgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGlnaHQiPi88L3NwYW4+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5XV0iPgogICAgICAgICAgICAgICAgPHNwYW4+IChhbGwgdGFncyk8L3NwYW4+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzSW52YWxpZFNlYXJjaFJlc3VsdHNdXSI+CiAgICAgICAgICAgICAgICA8c3Bhbj4gPHN0cm9uZz4obWFsZm9ybWVkIHJlZ3VsYXIgZXhwcmVzc2lvbik8L3N0cm9uZz48L3NwYW4+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9pc1NlYXJjaFJlc3VsdHNdXSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS1uYW1lIiB0aXRsZSQ9IltbY2F0ZWdvcnkubmFtZV1dIgogICAgICAgICAgICAgID5bW2NhdGVnb3J5Lm5hbWVdXTwvc3BhbgogICAgICAgICAgICA+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iY291bnQiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZV1dIj4KICAgICAgICAgICAgPHNwYW4+W1tfY291bnRdXTwvc3Bhbj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249ImV4cGFuZC1tb3JlIiBjbGFzcz0iZXhwYW5kLWFycm93Ij48L2lyb24taWNvbj4KICAgICAgICA8L3NwYW4+CiAgICAgIDwvYnV0dG9uPgogICAgICA8IS0tIFRPRE8oc3RlcGhhbndsZWUpOiBpbnZlc3RpZ2F0ZSBmdXJ0aGVyLiBGb3Igc29tZSByZWFzb24sCiAgICAgICAgdHJhbnNpdGlvbmVuZCB0aGF0IHRoZSBpcm9uLWNvbGxhcHNlIHJlbGllcyBvbiBzb21ldGltZXMgZG9lcyBub3QKICAgICAgICB0cmlnZ2VyIHdoZW4gcmVuZGVyaW5nIGEgY2hhcnQgd2l0aCBhIHNwaW5uZXIuIEEgdG95IGV4YW1wbGUgY2Fubm90CiAgICAgICAgcmVwcm9kdWNlIHRoaXMgYnVnLiAtLT4KICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW29wZW5lZF1dIiBuby1hbmltYXRpb249IiI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+CiAgICAgICAgICA8c3BhbiBpZD0idG9wLW9mLWNvbnRhaW5lciI+PC9zcGFuPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19tdWx0aXBsZVBhZ2VzRXhpc3RdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJpZy1wYWdlLWJ1dHRvbnMiIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAxMHB4OyI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbgogICAgICAgICAgICAgICAgb24tdGFwPSJfcGVyZm9ybVByZXZpb3VzUGFnZSIKICAgICAgICAgICAgICAgIGRpc2FibGVkJD0iW1shX2hhc1ByZXZpb3VzUGFnZV1dIgogICAgICAgICAgICAgICAgPlByZXZpb3VzIHBhZ2U8L3BhcGVyLWJ1dHRvbgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgICBvbi10YXA9Il9wZXJmb3JtTmV4dFBhZ2UiCiAgICAgICAgICAgICAgICBkaXNhYmxlZCQ9IltbIV9oYXNOZXh0UGFnZV1dIgogICAgICAgICAgICAgICAgPk5leHQgcGFnZTwvcGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgICAgPGRpdiBpZD0iaXRlbXMiPgogICAgICAgICAgICA8c2xvdCBuYW1lPSJpdGVtcyI+PC9zbG90PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX211bHRpcGxlUGFnZXNFeGlzdF1dIj4KICAgICAgICAgICAgPGRpdiBpZD0iY29udHJvbHMtY29udGFpbmVyIj4KICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmc6IDAgNXB4Ij4KICAgICAgICAgICAgICAgIFBhZ2UKICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dAogICAgICAgICAgICAgICAgICBpZD0icGFnZS1pbnB1dCIKICAgICAgICAgICAgICAgICAgdHlwZT0ibnVtYmVyIgogICAgICAgICAgICAgICAgICBuby1sYWJlbC1mbG9hdD0iIgogICAgICAgICAgICAgICAgICBtaW49IjEiCiAgICAgICAgICAgICAgICAgIG1heD0iW1tfcGFnZUNvdW50XV0iCiAgICAgICAgICAgICAgICAgIHZhbHVlPSJbW19wYWdlSW5wdXRWYWx1ZV1dIgogICAgICAgICAgICAgICAgICBvbi1pbnB1dD0iX2hhbmRsZVBhZ2VJbnB1dEV2ZW50IgogICAgICAgICAgICAgICAgICBvbi1jaGFuZ2U9Il9oYW5kbGVQYWdlQ2hhbmdlRXZlbnQiCiAgICAgICAgICAgICAgICAgIG9uLWZvY3VzPSJfaGFuZGxlUGFnZUZvY3VzRXZlbnQiCiAgICAgICAgICAgICAgICAgIG9uLWJsdXI9Il9oYW5kbGVQYWdlQmx1ckV2ZW50IgogICAgICAgICAgICAgICAgPjwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICBvZiBbW19wYWdlQ291bnRdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJpZy1wYWdlLWJ1dHRvbnMiIHN0eWxlPSJtYXJnaW4tdG9wOiAxMHB4OyI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbgogICAgICAgICAgICAgICAgb24tdGFwPSJfcGVyZm9ybVByZXZpb3VzUGFnZSIKICAgICAgICAgICAgICAgIGRpc2FibGVkJD0iW1shX2hhc1ByZXZpb3VzUGFnZV1dIgogICAgICAgICAgICAgICAgPlByZXZpb3VzIHBhZ2U8L3BhcGVyLWJ1dHRvbgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgICBvbi10YXA9Il9wZXJmb3JtTmV4dFBhZ2UiCiAgICAgICAgICAgICAgICBkaXNhYmxlZCQ9IltbIV9oYXNOZXh0UGFnZV1dIgogICAgICAgICAgICAgICAgPk5leHQgcGFnZTwvcGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgIDwvdGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDAgNXB4IDFweCAxMHB4OwogICAgICB9CgogICAgICA6aG9zdCg6Zmlyc3Qtb2YtdHlwZSkgewogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgIH0KCiAgICAgIDpob3N0KDpsYXN0LW9mLXR5cGUpIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICB9CgogICAgICAuaGVhZGluZyB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZvbnQtc2l6ZTogMTVweDsKICAgICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgICBib3gtc2hhZG93OiAwIDFweCA1cHggdmFyKC0tdGItcmFpc2VkLWJ1dHRvbi1zaGFkb3ctY29sb3IpOwogICAgICAgIHBhZGRpbmc6IDEwcHggMTVweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9CgogICAgICAuaGVhZGluZzo6LW1vei1mb2N1cy1pbm5lciB7CiAgICAgICAgcGFkZGluZzogMTBweCAxNXB4OwogICAgICB9CgogICAgICBbb3Blbi1idXR0b25dIHsKICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDAgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgW29wZW4tYnV0dG9uXSAuZXhwYW5kLWFycm93IHsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZVooMTgwZGVnKTsKICAgICAgfQoKICAgICAgLm5hbWUgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5saWdodCB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgfQoKICAgICAgLmNhdGVnb3J5LW5hbWUgewogICAgICAgIHdoaXRlLXNwYWNlOiBwcmU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBwYWRkaW5nOiAycHggMDsKICAgICAgfQoKICAgICAgLmNvdW50IHsKICAgICAgICBtYXJnaW46IDAgNXB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS01MDApOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBmbGV4OiBub25lOwogICAgICB9CgogICAgICAuaGVhZGluZzo6LW1vei1mb2N1cy1pbm5lciB7CiAgICAgICAgcGFkZGluZzogMTBweCAxNXB4OwogICAgICB9CgogICAgICAuY29udGVudCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvcik7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMnB4OwogICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAycHg7CiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGVkZWRlOwogICAgICAgIHBhZGRpbmc6IDE1cHg7CiAgICAgIH0KCiAgICAgIC5saWdodCB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgfQoKICAgICAgI2NvbnRyb2xzLWNvbnRhaW5lciB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2NvbnRyb2xzLWNvbnRhaW5lciBwYXBlci1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmJpZy1wYWdlLWJ1dHRvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIC5iaWctcGFnZS1idXR0b25zIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmbGV4LWJhc2lzOiAwOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KCiAgICAgIC5iaWctcGFnZS1idXR0b25zIHBhcGVyLWJ1dHRvbltkaXNhYmxlZF0gewogICAgICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICAgIH0KCiAgICAgIHNsb3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KCiAgICAgIDo6c2xvdHRlZChbc2xvdD0naXRlbXMnXSkgewogICAgICAgIC8qIFRvb2x0aXAgZm9yIGRlc2NyaXB0aW9ucyBhbmQgb3RoZXJzIGJyZWFrIHdpdGggbW9yZSBzdHJpY3Qgb25lcy4gKi8KICAgICAgICBjb250YWluOiBzdHlsZTsKICAgICAgfQoKICAgICAgI3BhZ2UtaW5wdXQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogdmFyKC0tdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXctcGFnZS1pbnB1dC13aWR0aCwgMTAwJSk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxwbC5wcm90b3R5cGUsImNhdGVnb3J5Iix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0scGwucHJvdG90eXBlLCJpbml0aWFsT3BlbmVkIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLHBsLnByb3RvdHlwZSwib3BlbmVkIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0scGwucHJvdG90eXBlLCJkaXNhYmxlUGFnaW5hdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVDb3VudChjYXRlZ29yeS5pdGVtcy4qKSJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0scGwucHJvdG90eXBlLCJfY291bnQiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZVBhbmVSZW5kZXJlZChjYXRlZ29yeSkiLG9ic2VydmVyOiJfb25QYW5lUmVuZGVyZWRDaGFuZ2VkIn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0scGwucHJvdG90eXBlLCJfcGFuZVJlbmRlcmVkIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVJc1NlYXJjaFJlc3VsdHMoY2F0ZWdvcnkubWV0YWRhdGEudHlwZSkifSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxwbC5wcm90b3R5cGUsIl9pc1NlYXJjaFJlc3VsdHMiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUlzSW52YWxpZFNlYXJjaFJlc3VsdHMoY2F0ZWdvcnkubWV0YWRhdGEpIn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0scGwucHJvdG90eXBlLCJfaXNJbnZhbGlkU2VhcmNoUmVzdWx0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSXNVbml2ZXJzYWxTZWFyY2hRdWVyeShjYXRlZ29yeS5tZXRhZGF0YSkifSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxwbC5wcm90b3R5cGUsIl9pc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfZ2V0Q2F0ZWdvcnlJdGVtS2V5Q2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0scGwucHJvdG90eXBlLCJnZXRDYXRlZ29yeUl0ZW1LZXkiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXIsb2JzZXJ2ZXI6Il9saW1pdENoYW5nZWQifSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLHBsLnByb3RvdHlwZSwiX2xpbWl0Iix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLHBsLnByb3RvdHlwZSwiX2FjdGl2ZUluZGV4Iix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZVBhZ2VDb3VudChjYXRlZ29yeS5pdGVtcy4qLCBfbGltaXQpIn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxwbC5wcm90b3R5cGUsIl9wYWdlQ291bnQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlSW5wdXRXaWR0aChfcGFnZUNvdW50KSIsb2JzZXJ2ZXI6Il91cGRhdGVJbnB1dFdpZHRoIn0pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxwbC5wcm90b3R5cGUsIl9pbnB1dFdpZHRoIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVBhZ2VJbnB1dFZhbHVlKF9wYWdlSW5wdXRGb2N1c2VkLCBfcGFnZUlucHV0UmF3VmFsdWUsIF9jdXJyZW50UGFnZSkiLG9ic2VydmVyOiJfdXBkYXRlUGFnZUlucHV0VmFsdWUifSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHBsLnByb3RvdHlwZSwiX3BhZ2VJbnB1dFZhbHVlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHBsLnByb3RvdHlwZSwiX3BhZ2VJbnB1dFJhd1ZhbHVlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0scGwucHJvdG90eXBlLCJfcGFnZUlucHV0Rm9jdXNlZCIsdm9pZCAwKSx0KFtzKCJfY291bnQiKSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0scGwucHJvdG90eXBlLCJfaGFzTXVsdGlwbGUiLG51bGwpLHQoW2EoIm9wZW5lZCIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtCb29sZWFuXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLHBsLnByb3RvdHlwZSwiX2NoYW5nZUNvbnRlbnRBY3RpdmUiLG51bGwpLHQoW3MoIm9wZW5lZCIsIl9wYW5lUmVuZGVyZWQiKSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0scGwucHJvdG90eXBlLCJfaXRlbXNSZW5kZXJlZCIsbnVsbCksdChbYSgiX2l0ZW1zUmVuZGVyZWQiLCJjYXRlZ29yeS5pdGVtcy4qIiwiX2xpbWl0IiwiX2FjdGl2ZUluZGV4IiwiX3BhZ2VDb3VudCIsImRpc2FibGVQYWdpbmF0aW9uIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxwbC5wcm90b3R5cGUsIl91cGRhdGVSZW5kZXJlZEl0ZW1zIixudWxsKSx0KFtzKCJfbGltaXQiLCJfYWN0aXZlSW5kZXgiKSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxwbC5wcm90b3R5cGUsIl9jdXJyZW50UGFnZSIsbnVsbCksdChbcygiX3BhZ2VDb3VudCIsImRpc2FibGVQYWdpbmF0aW9uIiksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLHBsLnByb3RvdHlwZSwiX211bHRpcGxlUGFnZXNFeGlzdCIsbnVsbCksdChbcygiX2N1cnJlbnRQYWdlIiksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLHBsLnByb3RvdHlwZSwiX2hhc1ByZXZpb3VzUGFnZSIsbnVsbCksdChbcygiX2N1cnJlbnRQYWdlIiwiX3BhZ2VDb3VudCIpLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxwbC5wcm90b3R5cGUsIl9oYXNOZXh0UGFnZSIsbnVsbCksdChbYSgiY2F0ZWdvcnkuaXRlbXMuKiIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0scGwucHJvdG90eXBlLCJfY2xhbXBBY3RpdmVJbmRleCIsbnVsbCkscGw9dChbaSgidGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXciKV0scGwpO2NsYXNzIGZse2NvbnN0cnVjdG9yKHQpe3RoaXMubGlzdGVuZXI9dH19Y2xhc3MgbWx7Y29uc3RydWN0b3IoKXt0aGlzLnJlcXVlc3RNYW5hZ2VyPW5ldyBkcigxKSx0aGlzLl9saXN0ZW5lcnM9bmV3IFNldCx0aGlzLmluaXRpYWxpemVkPSExfXJlZnJlc2goKXtyZXR1cm4gdGhpcy5sb2FkKCkudGhlbigoKCk9Pnt0aGlzLmluaXRpYWxpemVkPSEwfSkpfWFkZExpc3RlbmVyKHQpe2NvbnN0IGU9bmV3IGZsKHQpO3JldHVybiB0aGlzLl9saXN0ZW5lcnMuYWRkKGUpLGV9cmVtb3ZlTGlzdGVuZXJCeUtleSh0KXt0aGlzLl9saXN0ZW5lcnMuZGVsZXRlKHQpfWVtaXRDaGFuZ2UoKXt0aGlzLl9saXN0ZW5lcnMuZm9yRWFjaCgodD0+e3RyeXt0Lmxpc3RlbmVyKCl9Y2F0Y2godCl7fX0pKX19Y2xhc3MgZ2wgZXh0ZW5kcyBtbHtsb2FkKCl7Y29uc3QgdD1fcigpLmVudmlyb25tZW50KCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0KS50aGVuKCh0PT57Y29uc3QgZT17ZGF0YUxvY2F0aW9uOnQuZGF0YV9sb2NhdGlvbix3aW5kb3dUaXRsZTp0LndpbmRvd190aXRsZX07dm9pZCAwIT09dC5leHBlcmltZW50X25hbWUmJihlLmV4cGVyaW1lbnROYW1lPXQuZXhwZXJpbWVudF9uYW1lKSx2b2lkIDAhPT10LmV4cGVyaW1lbnRfZGVzY3JpcHRpb24mJihlLmV4cGVyaW1lbnREZXNjcmlwdGlvbj10LmV4cGVyaW1lbnRfZGVzY3JpcHRpb24pLHZvaWQgMCE9PXQuY3JlYXRpb25fdGltZSYmKGUuY3JlYXRpb25UaW1lPXQuY3JlYXRpb25fdGltZSksU2UuZXhwb3J0cy5pc0VxdWFsKHRoaXMuZW52aXJvbm1lbnQsZSl8fCh0aGlzLmVudmlyb25tZW50PWUsdGhpcy5lbWl0Q2hhbmdlKCkpfSkpfWdldERhdGFMb2NhdGlvbigpe3JldHVybiB0aGlzLmVudmlyb25tZW50P3RoaXMuZW52aXJvbm1lbnQuZGF0YUxvY2F0aW9uOiIifWdldFdpbmRvd1RpdGxlKCl7cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQ/dGhpcy5lbnZpcm9ubWVudC53aW5kb3dUaXRsZToiIn1nZXRFeHBlcmltZW50TmFtZSgpe3JldHVybiB0aGlzLmVudmlyb25tZW50P3RoaXMuZW52aXJvbm1lbnQuZXhwZXJpbWVudE5hbWU6IiJ9Z2V0RXhwZXJpbWVudERlc2NyaXB0aW9uKCl7cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQ/dGhpcy5lbnZpcm9ubWVudC5leHBlcmltZW50RGVzY3JpcHRpb246IiJ9Z2V0Q3JlYXRpb25UaW1lKCl7cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQ/dGhpcy5lbnZpcm9ubWVudC5jcmVhdGlvblRpbWU6bnVsbH19Y29uc3QgX2w9bmV3IGdsO2NsYXNzIHlsIGV4dGVuZHMgbWx7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX3J1bnM9W119bG9hZCgpe2NvbnN0IHQ9X3IoKS5ydW5zKCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0KS50aGVuKCh0PT57U2UuZXhwb3J0cy5pc0VxdWFsKHRoaXMuX3J1bnMsdCl8fCh0aGlzLl9ydW5zPXQsdGhpcy5lbWl0Q2hhbmdlKCkpfSkpfWdldFJ1bnMoKXtyZXR1cm4gdGhpcy5fcnVucy5zbGljZSgpfX1jb25zdCB2bD1uZXcgeWw7ZnVuY3Rpb24gYmwodCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOnQ+PWU/MDpOYU59ZnVuY3Rpb24geGwodCl7cmV0dXJuIDE9PT10Lmxlbmd0aCYmKHQ9KGZ1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuIGJsKHQoZSksbil9fSkodCkpLHtsZWZ0OmZ1bmN0aW9uKGUsbixpLHIpe2ZvcihudWxsPT1pJiYoaT0wKSxudWxsPT1yJiYocj1lLmxlbmd0aCk7aTxyOyl7dmFyIG89aStyPj4+MTt0KGVbb10sbik8MD9pPW8rMTpyPW99cmV0dXJuIGl9LHJpZ2h0OmZ1bmN0aW9uKGUsbixpLHIpe2ZvcihudWxsPT1pJiYoaT0wKSxudWxsPT1yJiYocj1lLmxlbmd0aCk7aTxyOyl7dmFyIG89aStyPj4+MTt0KGVbb10sbik+MD9yPW86aT1vKzF9cmV0dXJuIGl9fX12YXIgd2w9eGwoYmwpLFNsPXdsLnJpZ2h0LE1sPXdsLmxlZnQ7ZnVuY3Rpb24gRWwodCxlKXtyZXR1cm5bdCxlXX1mdW5jdGlvbiBUbCh0LGUsbil7dmFyIGkscixvLGEscz10Lmxlbmd0aCxsPWUubGVuZ3RoLGM9bmV3IEFycmF5KHMqbCk7Zm9yKG51bGw9PW4mJihuPUVsKSxpPW89MDtpPHM7KytpKWZvcihhPXRbaV0scj0wO3I8bDsrK3IsKytvKWNbb109bihhLGVbcl0pO3JldHVybiBjfWZ1bmN0aW9uIENsKHQpe3JldHVybiBudWxsPT09dD9OYU46K3R9ZnVuY3Rpb24gQWwodCxlKXt2YXIgbixpLHI9dC5sZW5ndGgsbz0wLGE9LTEscz0wLGw9MDtpZihudWxsPT1lKWZvcig7KythPHI7KWlzTmFOKG49Q2wodFthXSkpfHwobCs9KGk9bi1zKSoobi0ocys9aS8rK28pKSk7ZWxzZSBmb3IoOysrYTxyOylpc05hTihuPUNsKGUodFthXSxhLHQpKSl8fChsKz0oaT1uLXMpKihuLShzKz1pLysrbykpKTtpZihvPjEpcmV0dXJuIGwvKG8tMSl9ZnVuY3Rpb24ga2wodCxlKXt2YXIgbj1BbCh0LGUpO3JldHVybiBuP01hdGguc3FydChuKTpufWZ1bmN0aW9uIExsKHQsZSl7dmFyIG4saSxyLG89dC5sZW5ndGgsYT0tMTtpZihudWxsPT1lKXtmb3IoOysrYTxvOylpZihudWxsIT0obj10W2FdKSYmbj49bilmb3IoaT1yPW47KythPG87KW51bGwhPShuPXRbYV0pJiYoaT5uJiYoaT1uKSxyPG4mJihyPW4pKX1lbHNlIGZvcig7KythPG87KWlmKG51bGwhPShuPWUodFthXSxhLHQpKSYmbj49bilmb3IoaT1yPW47KythPG87KW51bGwhPShuPWUodFthXSxhLHQpKSYmKGk+biYmKGk9bikscjxuJiYocj1uKSk7cmV0dXJuW2kscl19dmFyIFBsPUFycmF5LnByb3RvdHlwZSxObD1QbC5zbGljZSxJbD1QbC5tYXA7ZnVuY3Rpb24gUmwodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIE9sKHQpe3JldHVybiB0fWZ1bmN0aW9uIHpsKHQsZSxuKXt0PSt0LGU9K2Usbj0ocj1hcmd1bWVudHMubGVuZ3RoKTwyPyhlPXQsdD0wLDEpOnI8Mz8xOituO2Zvcih2YXIgaT0tMSxyPTB8TWF0aC5tYXgoMCxNYXRoLmNlaWwoKGUtdCkvbikpLG89bmV3IEFycmF5KHIpOysraTxyOylvW2ldPXQraSpuO3JldHVybiBvfXZhciBEbD1NYXRoLnNxcnQoNTApLEJsPU1hdGguc3FydCgxMCksSGw9TWF0aC5zcXJ0KDIpO2Z1bmN0aW9uIEZsKHQsZSxuKXt2YXIgaSxyLG8sYSxzPS0xO2lmKG49K24sKHQ9K3QpPT0oZT0rZSkmJm4+MClyZXR1cm5bdF07aWYoKGk9ZTx0KSYmKHI9dCx0PWUsZT1yKSwwPT09KGE9VmwodCxlLG4pKXx8IWlzRmluaXRlKGEpKXJldHVybltdO2lmKGE+MClmb3IodD1NYXRoLmNlaWwodC9hKSxlPU1hdGguZmxvb3IoZS9hKSxvPW5ldyBBcnJheShyPU1hdGguY2VpbChlLXQrMSkpOysrczxyOylvW3NdPSh0K3MpKmE7ZWxzZSBmb3IodD1NYXRoLmZsb29yKHQqYSksZT1NYXRoLmNlaWwoZSphKSxvPW5ldyBBcnJheShyPU1hdGguY2VpbCh0LWUrMSkpOysrczxyOylvW3NdPSh0LXMpL2E7cmV0dXJuIGkmJm8ucmV2ZXJzZSgpLG99ZnVuY3Rpb24gVmwodCxlLG4pe3ZhciBpPShlLXQpL01hdGgubWF4KDAsbikscj1NYXRoLmZsb29yKE1hdGgubG9nKGkpL01hdGguTE4xMCksbz1pL01hdGgucG93KDEwLHIpO3JldHVybiByPj0wPyhvPj1EbD8xMDpvPj1CbD81Om8+PUhsPzI6MSkqTWF0aC5wb3coMTAscik6LU1hdGgucG93KDEwLC1yKS8obz49RGw/MTA6bz49Qmw/NTpvPj1IbD8yOjEpfWZ1bmN0aW9uIFVsKHQsZSxuKXt2YXIgaT1NYXRoLmFicyhlLXQpL01hdGgubWF4KDAsbikscj1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKGkpL01hdGguTE4xMCkpLG89aS9yO3JldHVybiBvPj1EbD9yKj0xMDpvPj1CbD9yKj01Om8+PUhsJiYocio9MiksZTx0Py1yOnJ9ZnVuY3Rpb24gamwodCl7cmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZyh0Lmxlbmd0aCkvTWF0aC5MTjIpKzF9ZnVuY3Rpb24gR2wodCxlLG4pe2lmKG51bGw9PW4mJihuPUNsKSxpPXQubGVuZ3RoKXtpZigoZT0rZSk8PTB8fGk8MilyZXR1cm4rbih0WzBdLDAsdCk7aWYoZT49MSlyZXR1cm4rbih0W2ktMV0saS0xLHQpO3ZhciBpLHI9KGktMSkqZSxvPU1hdGguZmxvb3IociksYT0rbih0W29dLG8sdCk7cmV0dXJuIGErKCtuKHRbbysxXSxvKzEsdCktYSkqKHItbyl9fWZ1bmN0aW9uIFdsKHQsZSl7dmFyIG4saSxyPXQubGVuZ3RoLG89LTE7aWYobnVsbD09ZSl7Zm9yKDsrK288cjspaWYobnVsbCE9KG49dFtvXSkmJm4+PW4pZm9yKGk9bjsrK288cjspbnVsbCE9KG49dFtvXSkmJm4+aSYmKGk9bil9ZWxzZSBmb3IoOysrbzxyOylpZihudWxsIT0obj1lKHRbb10sbyx0KSkmJm4+PW4pZm9yKGk9bjsrK288cjspbnVsbCE9KG49ZSh0W29dLG8sdCkpJiZuPmkmJihpPW4pO3JldHVybiBpfWZ1bmN0aW9uIHFsKHQpe2Zvcih2YXIgZSxuLGkscj10Lmxlbmd0aCxvPS0xLGE9MDsrK288cjspYSs9dFtvXS5sZW5ndGg7Zm9yKG49bmV3IEFycmF5KGEpOy0tcj49MDspZm9yKGU9KGk9dFtyXSkubGVuZ3RoOy0tZT49MDspblstLWFdPWlbZV07cmV0dXJuIG59ZnVuY3Rpb24gWWwodCxlKXt2YXIgbixpLHI9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1lKXtmb3IoOysrbzxyOylpZihudWxsIT0obj10W29dKSYmbj49bilmb3IoaT1uOysrbzxyOyludWxsIT0obj10W29dKSYmaT5uJiYoaT1uKX1lbHNlIGZvcig7KytvPHI7KWlmKG51bGwhPShuPWUodFtvXSxvLHQpKSYmbj49bilmb3IoaT1uOysrbzxyOyludWxsIT0obj1lKHRbb10sbyx0KSkmJmk+biYmKGk9bik7cmV0dXJuIGl9ZnVuY3Rpb24gWGwodCl7aWYoIShyPXQubGVuZ3RoKSlyZXR1cm5bXTtmb3IodmFyIGU9LTEsbj1ZbCh0LCRsKSxpPW5ldyBBcnJheShuKTsrK2U8bjspZm9yKHZhciByLG89LTEsYT1pW2VdPW5ldyBBcnJheShyKTsrK288cjspYVtvXT10W29dW2VdO3JldHVybiBpfWZ1bmN0aW9uICRsKHQpe3JldHVybiB0Lmxlbmd0aH12YXIgS2w9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIFpsKHQpe3JldHVybiB0fXZhciBKbD0xZS02O2Z1bmN0aW9uIFFsKHQpe3JldHVybiJ0cmFuc2xhdGUoIisodCsuNSkrIiwwKSJ9ZnVuY3Rpb24gdGModCl7cmV0dXJuInRyYW5zbGF0ZSgwLCIrKHQrLjUpKyIpIn1mdW5jdGlvbiBlYyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuK3QoZSl9fWZ1bmN0aW9uIG5jKHQpe3ZhciBlPU1hdGgubWF4KDAsdC5iYW5kd2lkdGgoKS0xKS8yO3JldHVybiB0LnJvdW5kKCkmJihlPU1hdGgucm91bmQoZSkpLGZ1bmN0aW9uKG4pe3JldHVybit0KG4pK2V9fWZ1bmN0aW9uIGljKCl7cmV0dXJuIXRoaXMuX19heGlzfWZ1bmN0aW9uIHJjKHQsZSl7dmFyIG49W10saT1udWxsLHI9bnVsbCxvPTYsYT02LHM9MyxsPTE9PT10fHw0PT09dD8tMToxLGM9ND09PXR8fDI9PT10PyJ4IjoieSIsdT0xPT09dHx8Mz09PXQ/UWw6dGM7ZnVuY3Rpb24gaChoKXt2YXIgZD1udWxsPT1pP2UudGlja3M/ZS50aWNrcy5hcHBseShlLG4pOmUuZG9tYWluKCk6aSxwPW51bGw9PXI/ZS50aWNrRm9ybWF0P2UudGlja0Zvcm1hdC5hcHBseShlLG4pOlpsOnIsZj1NYXRoLm1heChvLDApK3MsbT1lLnJhbmdlKCksZz0rbVswXSsuNSxfPSttW20ubGVuZ3RoLTFdKy41LHk9KGUuYmFuZHdpZHRoP25jOmVjKShlLmNvcHkoKSksdj1oLnNlbGVjdGlvbj9oLnNlbGVjdGlvbigpOmgsYj12LnNlbGVjdEFsbCgiLmRvbWFpbiIpLmRhdGEoW251bGxdKSx4PXYuc2VsZWN0QWxsKCIudGljayIpLmRhdGEoZCxlKS5vcmRlcigpLHc9eC5leGl0KCksUz14LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJ0aWNrIiksTT14LnNlbGVjdCgibGluZSIpLEU9eC5zZWxlY3QoInRleHQiKTtiPWIubWVyZ2UoYi5lbnRlcigpLmluc2VydCgicGF0aCIsIi50aWNrIikuYXR0cigiY2xhc3MiLCJkb21haW4iKS5hdHRyKCJzdHJva2UiLCJjdXJyZW50Q29sb3IiKSkseD14Lm1lcmdlKFMpLE09TS5tZXJnZShTLmFwcGVuZCgibGluZSIpLmF0dHIoInN0cm9rZSIsImN1cnJlbnRDb2xvciIpLmF0dHIoYysiMiIsbCpvKSksRT1FLm1lcmdlKFMuYXBwZW5kKCJ0ZXh0IikuYXR0cigiZmlsbCIsImN1cnJlbnRDb2xvciIpLmF0dHIoYyxsKmYpLmF0dHIoImR5IiwxPT09dD8iMGVtIjozPT09dD8iMC43MWVtIjoiMC4zMmVtIikpLGghPT12JiYoYj1iLnRyYW5zaXRpb24oaCkseD14LnRyYW5zaXRpb24oaCksTT1NLnRyYW5zaXRpb24oaCksRT1FLnRyYW5zaXRpb24oaCksdz13LnRyYW5zaXRpb24oaCkuYXR0cigib3BhY2l0eSIsSmwpLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PXkodCkpP3UodCk6dGhpcy5nZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIpfSkpLFMuYXR0cigib3BhY2l0eSIsSmwpLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucGFyZW50Tm9kZS5fX2F4aXM7cmV0dXJuIHUoZSYmaXNGaW5pdGUoZT1lKHQpKT9lOnkodCkpfSkpKSx3LnJlbW92ZSgpLGIuYXR0cigiZCIsND09PXR8fDI9PXQ/YT8iTSIrbCphKyIsIitnKyJIMC41ViIrXysiSCIrbCphOiJNMC41LCIrZysiViIrXzphPyJNIitnKyIsIitsKmErIlYwLjVIIitfKyJWIitsKmE6Ik0iK2crIiwwLjVIIitfKSx4LmF0dHIoIm9wYWNpdHkiLDEpLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3JldHVybiB1KHkodCkpfSkpLE0uYXR0cihjKyIyIixsKm8pLEUuYXR0cihjLGwqZikudGV4dChwKSx2LmZpbHRlcihpYykuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJmb250LXNpemUiLDEwKS5hdHRyKCJmb250LWZhbWlseSIsInNhbnMtc2VyaWYiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsMj09PXQ/InN0YXJ0Ijo0PT09dD8iZW5kIjoibWlkZGxlIiksdi5lYWNoKChmdW5jdGlvbigpe3RoaXMuX19heGlzPXl9KSl9cmV0dXJuIGguc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxoKTplfSxoLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIG49S2wuY2FsbChhcmd1bWVudHMpLGh9LGgudGlja0FyZ3VtZW50cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P1tdOktsLmNhbGwodCksaCk6bi5zbGljZSgpfSxoLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09dD9udWxsOktsLmNhbGwodCksaCk6aSYmaS5zbGljZSgpfSxoLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxoKTpyfSxoLnRpY2tTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWE9K3QsaCk6b30saC50aWNrU2l6ZUlubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSt0LGgpOm99LGgudGlja1NpemVPdXRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rdCxoKTphfSxoLnRpY2tQYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0LGgpOnN9LGh9ZnVuY3Rpb24gb2ModCl7cmV0dXJuIHJjKDMsdCl9ZnVuY3Rpb24gYWModCl7cmV0dXJuIHJjKDQsdCl9dmFyIHNjPXt2YWx1ZTpmdW5jdGlvbigpe319O2Z1bmN0aW9uIGxjKCl7Zm9yKHZhciB0LGU9MCxuPWFyZ3VtZW50cy5sZW5ndGgsaT17fTtlPG47KytlKXtpZighKHQ9YXJndW1lbnRzW2VdKyIiKXx8dCBpbiBpfHwvW1xzLl0vLnRlc3QodCkpdGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIHR5cGU6ICIrdCk7aVt0XT1bXX1yZXR1cm4gbmV3IGNjKGkpfWZ1bmN0aW9uIGNjKHQpe3RoaXMuXz10fWZ1bmN0aW9uIHVjKHQsZSl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcCgoZnVuY3Rpb24odCl7dmFyIG49IiIsaT10LmluZGV4T2YoIi4iKTtpZihpPj0wJiYobj10LnNsaWNlKGkrMSksdD10LnNsaWNlKDAsaSkpLHQmJiFlLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO3JldHVybnt0eXBlOnQsbmFtZTpufX0pKX1mdW5jdGlvbiBoYyh0LGUpe2Zvcih2YXIgbixpPTAscj10Lmxlbmd0aDtpPHI7KytpKWlmKChuPXRbaV0pLm5hbWU9PT1lKXJldHVybiBuLnZhbHVlfWZ1bmN0aW9uIGRjKHQsZSxuKXtmb3IodmFyIGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpaWYodFtpXS5uYW1lPT09ZSl7dFtpXT1zYyx0PXQuc2xpY2UoMCxpKS5jb25jYXQodC5zbGljZShpKzEpKTticmVha31yZXR1cm4gbnVsbCE9biYmdC5wdXNoKHtuYW1lOmUsdmFsdWU6bn0pLHR9Y2MucHJvdG90eXBlPWxjLnByb3RvdHlwZT17Y29uc3RydWN0b3I6Y2Msb246ZnVuY3Rpb24odCxlKXt2YXIgbixpPXRoaXMuXyxyPXVjKHQrIiIsaSksbz0tMSxhPXIubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7aWYobnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK2UpO2Zvcig7KytvPGE7KWlmKG49KHQ9cltvXSkudHlwZSlpW25dPWRjKGlbbl0sdC5uYW1lLGUpO2Vsc2UgaWYobnVsbD09ZSlmb3IobiBpbiBpKWlbbl09ZGMoaVtuXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK288YTspaWYoKG49KHQ9cltvXSkudHlwZSkmJihuPWhjKGlbbl0sdC5uYW1lKSkpcmV0dXJuIG59LGNvcHk6ZnVuY3Rpb24oKXt2YXIgdD17fSxlPXRoaXMuXztmb3IodmFyIG4gaW4gZSl0W25dPWVbbl0uc2xpY2UoKTtyZXR1cm4gbmV3IGNjKHQpfSxjYWxsOmZ1bmN0aW9uKHQsZSl7aWYoKG49YXJndW1lbnRzLmxlbmd0aC0yKT4wKWZvcih2YXIgbixpLHI9bmV3IEFycmF5KG4pLG89MDtvPG47KytvKXJbb109YXJndW1lbnRzW28rMl07aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3Iobz0wLG49KGk9dGhpcy5fW3RdKS5sZW5ndGg7bzxuOysrbylpW29dLnZhbHVlLmFwcGx5KGUscil9LGFwcGx5OmZ1bmN0aW9uKHQsZSxuKXtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2Zvcih2YXIgaT10aGlzLl9bdF0scj0wLG89aS5sZW5ndGg7cjxvOysrcilpW3JdLnZhbHVlLmFwcGx5KGUsbil9fTt2YXIgcGM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLGZjPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDpwYyx4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyJ9O2Z1bmN0aW9uIG1jKHQpe3ZhciBlPXQrPSIiLG49ZS5pbmRleE9mKCI6Iik7cmV0dXJuIG4+PTAmJiJ4bWxucyIhPT0oZT10LnNsaWNlKDAsbikpJiYodD10LnNsaWNlKG4rMSkpLGZjLmhhc093blByb3BlcnR5KGUpP3tzcGFjZTpmY1tlXSxsb2NhbDp0fTp0fWZ1bmN0aW9uIGdjKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMub3duZXJEb2N1bWVudCxuPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBuPT09cGMmJmUuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PXBjP2UuY3JlYXRlRWxlbWVudCh0KTplLmNyZWF0ZUVsZW1lbnROUyhuLHQpfX1mdW5jdGlvbiBfYyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiB5Yyh0KXt2YXIgZT1tYyh0KTtyZXR1cm4oZS5sb2NhbD9fYzpnYykoZSl9ZnVuY3Rpb24gdmMoKXt9ZnVuY3Rpb24gYmModCl7cmV0dXJuIG51bGw9PXQ/dmM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpfX1mdW5jdGlvbiB4Yygpe3JldHVybltdfWZ1bmN0aW9uIHdjKHQpe3JldHVybiBudWxsPT10P3hjOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbCh0KX19ZnVuY3Rpb24gU2ModCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2hlcyh0KX19ZnVuY3Rpb24gTWModCl7cmV0dXJuIG5ldyBBcnJheSh0Lmxlbmd0aCl9ZnVuY3Rpb24gRWModCxlKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPWV9ZnVuY3Rpb24gVGModCxlLG4saSxyLG8pe2Zvcih2YXIgYSxzPTAsbD1lLmxlbmd0aCxjPW8ubGVuZ3RoO3M8YzsrK3MpKGE9ZVtzXSk/KGEuX19kYXRhX189b1tzXSxpW3NdPWEpOm5bc109bmV3IEVjKHQsb1tzXSk7Zm9yKDtzPGw7KytzKShhPWVbc10pJiYocltzXT1hKX1mdW5jdGlvbiBDYyh0LGUsbixpLHIsbyxhKXt2YXIgcyxsLGMsdT17fSxoPWUubGVuZ3RoLGQ9by5sZW5ndGgscD1uZXcgQXJyYXkoaCk7Zm9yKHM9MDtzPGg7KytzKShsPWVbc10pJiYocFtzXT1jPSIkIithLmNhbGwobCxsLl9fZGF0YV9fLHMsZSksYyBpbiB1P3Jbc109bDp1W2NdPWwpO2ZvcihzPTA7czxkOysrcykobD11W2M9IiQiK2EuY2FsbCh0LG9bc10scyxvKV0pPyhpW3NdPWwsbC5fX2RhdGFfXz1vW3NdLHVbY109bnVsbCk6bltzXT1uZXcgRWModCxvW3NdKTtmb3Iocz0wO3M8aDsrK3MpKGw9ZVtzXSkmJnVbcFtzXV09PT1sJiYocltzXT1sKX1mdW5jdGlvbiBBYyh0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6dD49ZT8wOk5hTn1mdW5jdGlvbiBrYyh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19ZnVuY3Rpb24gTGModCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBQYyh0LGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKHQsZSl9fWZ1bmN0aW9uIE5jKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsZSl9fWZ1bmN0aW9uIEljKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj90aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KTp0aGlzLnNldEF0dHJpYnV0ZSh0LG4pfX1mdW5jdGlvbiBSYyh0LGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PW4/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLG4pfX1mdW5jdGlvbiBPYyh0KXtyZXR1cm4gdC5vd25lckRvY3VtZW50JiZ0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHQuZG9jdW1lbnQmJnR8fHQuZGVmYXVsdFZpZXd9ZnVuY3Rpb24gemModCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KX19ZnVuY3Rpb24gRGModCxlLG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxlLG4pfX1mdW5jdGlvbiBCYyh0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09aT90aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpOnRoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxpLG4pfX1mdW5jdGlvbiBIYyh0LGUpe3JldHVybiB0LnN0eWxlLmdldFByb3BlcnR5VmFsdWUoZSl8fE9jKHQpLmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKGUpfWZ1bmN0aW9uIEZjKHQpe3JldHVybiBmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW3RdfX1mdW5jdGlvbiBWYyh0LGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXNbdF09ZX19ZnVuY3Rpb24gVWModCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP2RlbGV0ZSB0aGlzW3RdOnRoaXNbdF09bn19ZnVuY3Rpb24gamModCl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uIEdjKHQpe3JldHVybiB0LmNsYXNzTGlzdHx8bmV3IFdjKHQpfWZ1bmN0aW9uIFdjKHQpe3RoaXMuX25vZGU9dCx0aGlzLl9uYW1lcz1qYyh0LmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfWZ1bmN0aW9uIHFjKHQsZSl7Zm9yKHZhciBuPUdjKHQpLGk9LTEscj1lLmxlbmd0aDsrK2k8cjspbi5hZGQoZVtpXSl9ZnVuY3Rpb24gWWModCxlKXtmb3IodmFyIG49R2ModCksaT0tMSxyPWUubGVuZ3RoOysraTxyOyluLnJlbW92ZShlW2ldKX1mdW5jdGlvbiBYYyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtxYyh0aGlzLHQpfX1mdW5jdGlvbiAkYyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtZYyh0aGlzLHQpfX1mdW5jdGlvbiBLYyh0LGUpe3JldHVybiBmdW5jdGlvbigpeyhlLmFwcGx5KHRoaXMsYXJndW1lbnRzKT9xYzpZYykodGhpcyx0KX19ZnVuY3Rpb24gWmMoKXt0aGlzLnRleHRDb250ZW50PSIifWZ1bmN0aW9uIEpjKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19ZnVuY3Rpb24gUWModCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT1lPyIiOmV9fWZ1bmN0aW9uIHR1KCl7dGhpcy5pbm5lckhUTUw9IiJ9ZnVuY3Rpb24gZXUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9dH19ZnVuY3Rpb24gbnUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pbm5lckhUTUw9bnVsbD09ZT8iIjplfX1mdW5jdGlvbiBpdSgpe3RoaXMubmV4dFNpYmxpbmcmJnRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKX1mdW5jdGlvbiBydSgpe3RoaXMucHJldmlvdXNTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIG91KCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gYXUoKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7dCYmdC5yZW1vdmVDaGlsZCh0aGlzKX1mdW5jdGlvbiBzdSgpe3ZhciB0PXRoaXMuY2xvbmVOb2RlKCExKSxlPXRoaXMucGFyZW50Tm9kZTtyZXR1cm4gZT9lLmluc2VydEJlZm9yZSh0LHRoaXMubmV4dFNpYmxpbmcpOnR9ZnVuY3Rpb24gbHUoKXt2YXIgdD10aGlzLmNsb25lTm9kZSghMCksZT10aGlzLnBhcmVudE5vZGU7cmV0dXJuIGU/ZS5pbnNlcnRCZWZvcmUodCx0aGlzLm5leHRTaWJsaW5nKTp0fUVjLnByb3RvdHlwZT17Y29uc3RydWN0b3I6RWMsYXBwZW5kQ2hpbGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUodCx0aGlzLl9uZXh0KX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUodCxlKX0scXVlcnlTZWxlY3RvcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3IodCl9LHF1ZXJ5U2VsZWN0b3JBbGw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHQpfX0sV2MucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtlPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKGUsMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgY3U9e30sdXU9bnVsbDtmdW5jdGlvbiBodSh0LGUsbil7cmV0dXJuIHQ9ZHUodCxlLG4pLGZ1bmN0aW9uKGUpe3ZhciBuPWUucmVsYXRlZFRhcmdldDtuJiYobj09PXRoaXN8fDgmbi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzKSl8fHQuY2FsbCh0aGlzLGUpfX1mdW5jdGlvbiBkdSh0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKGkpe3ZhciByPXV1O3V1PWk7dHJ5e3QuY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZSxuKX1maW5hbGx5e3V1PXJ9fX1mdW5jdGlvbiBwdSh0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKChmdW5jdGlvbih0KXt2YXIgZT0iIixuPXQuaW5kZXhPZigiLiIpO3JldHVybiBuPj0wJiYoZT10LnNsaWNlKG4rMSksdD10LnNsaWNlKDAsbikpLHt0eXBlOnQsbmFtZTplfX0pKX1mdW5jdGlvbiBmdSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9fb247aWYoZSl7Zm9yKHZhciBuLGk9MCxyPS0xLG89ZS5sZW5ndGg7aTxvOysraSluPWVbaV0sdC50eXBlJiZuLnR5cGUhPT10LnR5cGV8fG4ubmFtZSE9PXQubmFtZT9lWysrcl09bjp0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobi50eXBlLG4ubGlzdGVuZXIsbi5jYXB0dXJlKTsrK3I/ZS5sZW5ndGg9cjpkZWxldGUgdGhpcy5fX29ufX19ZnVuY3Rpb24gbXUodCxlLG4pe3ZhciBpPWN1Lmhhc093blByb3BlcnR5KHQudHlwZSk/aHU6ZHU7cmV0dXJuIGZ1bmN0aW9uKHIsbyxhKXt2YXIgcyxsPXRoaXMuX19vbixjPWkoZSxvLGEpO2lmKGwpZm9yKHZhciB1PTAsaD1sLmxlbmd0aDt1PGg7Kyt1KWlmKChzPWxbdV0pLnR5cGU9PT10LnR5cGUmJnMubmFtZT09PXQubmFtZSlyZXR1cm4gdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHMudHlwZSxzLmxpc3RlbmVyLHMuY2FwdHVyZSksdGhpcy5hZGRFdmVudExpc3RlbmVyKHMudHlwZSxzLmxpc3RlbmVyPWMscy5jYXB0dXJlPW4pLHZvaWQocy52YWx1ZT1lKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIodC50eXBlLGMsbikscz17dHlwZTp0LnR5cGUsbmFtZTp0Lm5hbWUsdmFsdWU6ZSxsaXN0ZW5lcjpjLGNhcHR1cmU6bn0sbD9sLnB1c2gocyk6dGhpcy5fX29uPVtzXX19ZnVuY3Rpb24gZ3UodCxlLG4saSl7dmFyIHI9dXU7dC5zb3VyY2VFdmVudD11dSx1dT10O3RyeXtyZXR1cm4gZS5hcHBseShuLGkpfWZpbmFsbHl7dXU9cn19ZnVuY3Rpb24gX3UodCxlLG4pe3ZhciBpPU9jKHQpLHI9aS5DdXN0b21FdmVudDsiZnVuY3Rpb24iPT10eXBlb2Ygcj9yPW5ldyByKGUsbik6KHI9aS5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxuPyhyLmluaXRFdmVudChlLG4uYnViYmxlcyxuLmNhbmNlbGFibGUpLHIuZGV0YWlsPW4uZGV0YWlsKTpyLmluaXRFdmVudChlLCExLCExKSksdC5kaXNwYXRjaEV2ZW50KHIpfWZ1bmN0aW9uIHl1KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIF91KHRoaXMsdCxlKX19ZnVuY3Rpb24gdnUodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gX3UodGhpcyx0LGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX19InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmKCJvbm1vdXNlZW50ZXIiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHwoY3U9e21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSkpO3ZhciBidT1bbnVsbF07ZnVuY3Rpb24geHUodCxlKXt0aGlzLl9ncm91cHM9dCx0aGlzLl9wYXJlbnRzPWV9ZnVuY3Rpb24gd3UoKXtyZXR1cm4gbmV3IHh1KFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sYnUpfWZ1bmN0aW9uIFN1KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9uZXcgeHUoW1tkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQpXV0sW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pOm5ldyB4dShbW3RdXSxidSl9eHUucHJvdG90eXBlPXd1LnByb3RvdHlwZT17Y29uc3RydWN0b3I6eHUsc2VsZWN0OmZ1bmN0aW9uIE11KHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1iYyh0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWZvcih2YXIgbyxhLHM9ZVtyXSxsPXMubGVuZ3RoLGM9aVtyXT1uZXcgQXJyYXkobCksdT0wO3U8bDsrK3UpKG89c1t1XSkmJihhPXQuY2FsbChvLG8uX19kYXRhX18sdSxzKSkmJigiX19kYXRhX18iaW4gbyYmKGEuX19kYXRhX189by5fX2RhdGFfXyksY1t1XT1hKTtyZXR1cm4gbmV3IHh1KGksdGhpcy5fcGFyZW50cyl9LHNlbGVjdEFsbDpmdW5jdGlvbiBFdSh0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9d2ModCkpO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj1lLmxlbmd0aCxpPVtdLHI9W10sbz0wO288bjsrK28pZm9yKHZhciBhLHM9ZVtvXSxsPXMubGVuZ3RoLGM9MDtjPGw7KytjKShhPXNbY10pJiYoaS5wdXNoKHQuY2FsbChhLGEuX19kYXRhX18sYyxzKSksci5wdXNoKGEpKTtyZXR1cm4gbmV3IHh1KGkscil9LGZpbHRlcjpmdW5jdGlvbiBUdSh0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9U2ModCkpO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj1lLmxlbmd0aCxpPW5ldyBBcnJheShuKSxyPTA7cjxuOysrcilmb3IodmFyIG8sYT1lW3JdLHM9YS5sZW5ndGgsbD1pW3JdPVtdLGM9MDtjPHM7KytjKShvPWFbY10pJiZ0LmNhbGwobyxvLl9fZGF0YV9fLGMsYSkmJmwucHVzaChvKTtyZXR1cm4gbmV3IHh1KGksdGhpcy5fcGFyZW50cyl9LGRhdGE6ZnVuY3Rpb24gQ3UodCxlKXtpZighdClyZXR1cm4gZj1uZXcgQXJyYXkodGhpcy5zaXplKCkpLHU9LTEsdGhpcy5lYWNoKChmdW5jdGlvbih0KXtmWysrdV09dH0pKSxmO3ZhciBuPWU/Q2M6VGMsaT10aGlzLl9wYXJlbnRzLHI9dGhpcy5fZ3JvdXBzOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD0oZnVuY3Rpb24gbyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KSh0KSk7Zm9yKHZhciBhPXIubGVuZ3RoLHM9bmV3IEFycmF5KGEpLGw9bmV3IEFycmF5KGEpLGM9bmV3IEFycmF5KGEpLHU9MDt1PGE7Kyt1KXt2YXIgaD1pW3VdLGQ9clt1XSxwPWQubGVuZ3RoLGY9dC5jYWxsKGgsaCYmaC5fX2RhdGFfXyx1LGkpLG09Zi5sZW5ndGgsZz1sW3VdPW5ldyBBcnJheShtKSxfPXNbdV09bmV3IEFycmF5KG0pO24oaCxkLGcsXyxjW3VdPW5ldyBBcnJheShwKSxmLGUpO2Zvcih2YXIgeSx2LGI9MCx4PTA7YjxtOysrYilpZih5PWdbYl0pe2ZvcihiPj14JiYoeD1iKzEpOyEodj1fW3hdKSYmKyt4PG07KTt5Ll9uZXh0PXZ8fG51bGx9fXJldHVybihzPW5ldyB4dShzLGkpKS5fZW50ZXI9bCxzLl9leGl0PWMsc30sZW50ZXI6ZnVuY3Rpb24gQXUoKXtyZXR1cm4gbmV3IHh1KHRoaXMuX2VudGVyfHx0aGlzLl9ncm91cHMubWFwKE1jKSx0aGlzLl9wYXJlbnRzKX0sZXhpdDpmdW5jdGlvbiBrdSgpe3JldHVybiBuZXcgeHUodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChNYyksdGhpcy5fcGFyZW50cyl9LGpvaW46ZnVuY3Rpb24gTHUodCxlLG4pe3ZhciBpPXRoaXMuZW50ZXIoKSxyPXRoaXMsbz10aGlzLmV4aXQoKTtyZXR1cm4gaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90KGkpOmkuYXBwZW5kKHQrIiIpLG51bGwhPWUmJihyPWUocikpLG51bGw9PW4/by5yZW1vdmUoKTpuKG8pLGkmJnI/aS5tZXJnZShyKS5vcmRlcigpOnJ9LG1lcmdlOmZ1bmN0aW9uIFB1KHQpe2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj10Ll9ncm91cHMsaT1lLmxlbmd0aCxyPU1hdGgubWluKGksbi5sZW5ndGgpLG89bmV3IEFycmF5KGkpLGE9MDthPHI7KythKWZvcih2YXIgcyxsPWVbYV0sYz1uW2FdLHU9bC5sZW5ndGgsaD1vW2FdPW5ldyBBcnJheSh1KSxkPTA7ZDx1OysrZCkocz1sW2RdfHxjW2RdKSYmKGhbZF09cyk7Zm9yKDthPGk7KythKW9bYV09ZVthXTtyZXR1cm4gbmV3IHh1KG8sdGhpcy5fcGFyZW50cyl9LG9yZGVyOmZ1bmN0aW9uIE51KCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxlPS0xLG49dC5sZW5ndGg7KytlPG47KWZvcih2YXIgaSxyPXRbZV0sbz1yLmxlbmd0aC0xLGE9cltvXTstLW8+PTA7KShpPXJbb10pJiYoYSYmNF5pLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGEpJiZhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGksYSksYT1pKTtyZXR1cm4gdGhpc30sc29ydDpmdW5jdGlvbiBJdSh0KXtmdW5jdGlvbiBlKGUsbil7cmV0dXJuIGUmJm4/dChlLl9fZGF0YV9fLG4uX19kYXRhX18pOiFlLSFufXR8fCh0PUFjKTtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGk9bi5sZW5ndGgscj1uZXcgQXJyYXkoaSksbz0wO288aTsrK28pe2Zvcih2YXIgYSxzPW5bb10sbD1zLmxlbmd0aCxjPXJbb109bmV3IEFycmF5KGwpLHU9MDt1PGw7Kyt1KShhPXNbdV0pJiYoY1t1XT1hKTtjLnNvcnQoZSl9cmV0dXJuIG5ldyB4dShyLHRoaXMuX3BhcmVudHMpLm9yZGVyKCl9LGNhbGw6ZnVuY3Rpb24gUnUoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGFyZ3VtZW50c1swXT10aGlzLHQuYXBwbHkobnVsbCxhcmd1bWVudHMpLHRoaXN9LG5vZGVzOmZ1bmN0aW9uIE91KCl7dmFyIHQ9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSxlPS0xO3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7dFsrK2VdPXRoaXN9KSksdH0sbm9kZTpmdW5jdGlvbiB6dSgpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsZT0wLG49dC5sZW5ndGg7ZTxuOysrZSlmb3IodmFyIGk9dFtlXSxyPTAsbz1pLmxlbmd0aDtyPG87KytyKXt2YXIgYT1pW3JdO2lmKGEpcmV0dXJuIGF9cmV0dXJuIG51bGx9LHNpemU6ZnVuY3Rpb24gRHUoKXt2YXIgdD0wO3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7Kyt0fSkpLHR9LGVtcHR5OmZ1bmN0aW9uIEJ1KCl7cmV0dXJuIXRoaXMubm9kZSgpfSxlYWNoOmZ1bmN0aW9uIEh1KHQpe2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj0wLGk9ZS5sZW5ndGg7bjxpOysrbilmb3IodmFyIHIsbz1lW25dLGE9MCxzPW8ubGVuZ3RoO2E8czsrK2EpKHI9b1thXSkmJnQuY2FsbChyLHIuX19kYXRhX18sYSxvKTtyZXR1cm4gdGhpc30sYXR0cjpmdW5jdGlvbiBGdSh0LGUpe3ZhciBuPW1jKHQpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7dmFyIGk9dGhpcy5ub2RlKCk7cmV0dXJuIG4ubG9jYWw/aS5nZXRBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOmkuZ2V0QXR0cmlidXRlKG4pfXJldHVybiB0aGlzLmVhY2goKG51bGw9PWU/bi5sb2NhbD9MYzprYzoiZnVuY3Rpb24iPT10eXBlb2YgZT9uLmxvY2FsP1JjOkljOm4ubG9jYWw/TmM6UGMpKG4sZSkpfSxzdHlsZTpmdW5jdGlvbiBWdSh0LGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PWU/emM6ImZ1bmN0aW9uIj09dHlwZW9mIGU/QmM6RGMpKHQsZSxudWxsPT1uPyIiOm4pKTpIYyh0aGlzLm5vZGUoKSx0KX0scHJvcGVydHk6ZnVuY3Rpb24gVXUodCxlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09ZT9GYzoiZnVuY3Rpb24iPT10eXBlb2YgZT9VYzpWYykodCxlKSk6dGhpcy5ub2RlKClbdF19LGNsYXNzZWQ6ZnVuY3Rpb24ganUodCxlKXt2YXIgbj1qYyh0KyIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgaT1HYyh0aGlzLm5vZGUoKSkscj0tMSxvPW4ubGVuZ3RoOysrcjxvOylpZighaS5jb250YWlucyhuW3JdKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgZT9LYzplP1hjOiRjKShuLGUpKX0sdGV4dDpmdW5jdGlvbiBHdSh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9aYzooImZ1bmN0aW9uIj09dHlwZW9mIHQ/UWM6SmMpKHQpKTp0aGlzLm5vZGUoKS50ZXh0Q29udGVudH0saHRtbDpmdW5jdGlvbiBXdSh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD90dTooImZ1bmN0aW9uIj09dHlwZW9mIHQ/bnU6ZXUpKHQpKTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LHJhaXNlOmZ1bmN0aW9uIHF1KCl7cmV0dXJuIHRoaXMuZWFjaChpdSl9LGxvd2VyOmZ1bmN0aW9uIFl1KCl7cmV0dXJuIHRoaXMuZWFjaChydSl9LGFwcGVuZDpmdW5jdGlvbiBYdSh0KXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnljKHQpO3JldHVybiB0aGlzLnNlbGVjdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KSl9LGluc2VydDpmdW5jdGlvbiAkdSh0LGUpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eWModCksaT1udWxsPT1lP291OiJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6YmMoZSk7cmV0dXJuIHRoaXMuc2VsZWN0KChmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8bnVsbCl9KSl9LHJlbW92ZTpmdW5jdGlvbiBLdSgpe3JldHVybiB0aGlzLmVhY2goYXUpfSxjbG9uZTpmdW5jdGlvbiBadSh0KXtyZXR1cm4gdGhpcy5zZWxlY3QodD9sdTpzdSl9LGRhdHVtOmZ1bmN0aW9uIEp1KHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIix0KTp0aGlzLm5vZGUoKS5fX2RhdGFfX30sb246ZnVuY3Rpb24gUXUodCxlLG4pe3ZhciBpLHIsbz1wdSh0KyIiKSxhPW8ubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7Zm9yKHM9ZT9tdTpmdSxudWxsPT1uJiYobj0hMSksaT0wO2k8YTsrK2kpdGhpcy5lYWNoKHMob1tpXSxlLG4pKTtyZXR1cm4gdGhpc312YXIgcz10aGlzLm5vZGUoKS5fX29uO2lmKHMpZm9yKHZhciBsLGM9MCx1PXMubGVuZ3RoO2M8dTsrK2MpZm9yKGk9MCxsPXNbY107aTxhOysraSlpZigocj1vW2ldKS50eXBlPT09bC50eXBlJiZyLm5hbWU9PT1sLm5hbWUpcmV0dXJuIGwudmFsdWV9LGRpc3BhdGNoOmZ1bmN0aW9uIHRoKHQsZSl7cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIGU/dnU6eXUpKHQsZSkpfX07dmFyIGVoPTA7ZnVuY3Rpb24gbmgoKXtyZXR1cm4gbmV3IGlofWZ1bmN0aW9uIGloKCl7dGhpcy5fPSJAIisoKytlaCkudG9TdHJpbmcoMzYpfWZ1bmN0aW9uIHJoKCl7Zm9yKHZhciB0LGU9dXU7dD1lLnNvdXJjZUV2ZW50OyllPXQ7cmV0dXJuIGV9ZnVuY3Rpb24gb2godCxlKXt2YXIgbj10Lm93bmVyU1ZHRWxlbWVudHx8dDtpZihuLmNyZWF0ZVNWR1BvaW50KXt2YXIgaT1uLmNyZWF0ZVNWR1BvaW50KCk7cmV0dXJuIGkueD1lLmNsaWVudFgsaS55PWUuY2xpZW50WSxbKGk9aS5tYXRyaXhUcmFuc2Zvcm0odC5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpKS54LGkueV19dmFyIHI9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm5bZS5jbGllbnRYLXIubGVmdC10LmNsaWVudExlZnQsZS5jbGllbnRZLXIudG9wLXQuY2xpZW50VG9wXX1mdW5jdGlvbiBhaCh0KXt2YXIgZT1yaCgpO3JldHVybiBlLmNoYW5nZWRUb3VjaGVzJiYoZT1lLmNoYW5nZWRUb3VjaGVzWzBdKSxvaCh0LGUpfWZ1bmN0aW9uIHNoKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9uZXcgeHUoW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCldLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgeHUoW251bGw9PXQ/W106dF0sYnUpfWZ1bmN0aW9uIGxoKHQsZSxuKXthcmd1bWVudHMubGVuZ3RoPDMmJihuPWUsZT1yaCgpLmNoYW5nZWRUb3VjaGVzKTtmb3IodmFyIGkscj0wLG89ZT9lLmxlbmd0aDowO3I8bzsrK3IpaWYoKGk9ZVtyXSkuaWRlbnRpZmllcj09PW4pcmV0dXJuIG9oKHQsaSk7cmV0dXJuIG51bGx9ZnVuY3Rpb24gY2goKXt1dS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiB1aCgpe3V1LnByZXZlbnREZWZhdWx0KCksdXUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gaGgodCl7dmFyIGU9dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbj1TdSh0KS5vbigiZHJhZ3N0YXJ0LmRyYWciLHVoLCEwKTsib25zZWxlY3RzdGFydCJpbiBlP24ub24oInNlbGVjdHN0YXJ0LmRyYWciLHVoLCEwKTooZS5fX25vc2VsZWN0PWUuc3R5bGUuTW96VXNlclNlbGVjdCxlLnN0eWxlLk1velVzZXJTZWxlY3Q9Im5vbmUiKX1mdW5jdGlvbiBkaCh0LGUpe3ZhciBuPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGk9U3UodCkub24oImRyYWdzdGFydC5kcmFnIixudWxsKTtlJiYoaS5vbigiY2xpY2suZHJhZyIsdWgsITApLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aS5vbigiY2xpY2suZHJhZyIsbnVsbCl9KSwwKSksIm9uc2VsZWN0c3RhcnQiaW4gbj9pLm9uKCJzZWxlY3RzdGFydC5kcmFnIixudWxsKToobi5zdHlsZS5Nb3pVc2VyU2VsZWN0PW4uX19ub3NlbGVjdCxkZWxldGUgbi5fX25vc2VsZWN0KX1mdW5jdGlvbiBwaCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gZmgodCxlLG4saSxyLG8sYSxzLGwsYyl7dGhpcy50YXJnZXQ9dCx0aGlzLnR5cGU9ZSx0aGlzLnN1YmplY3Q9bix0aGlzLmlkZW50aWZpZXI9aSx0aGlzLmFjdGl2ZT1yLHRoaXMueD1vLHRoaXMueT1hLHRoaXMuZHg9cyx0aGlzLmR5PWwsdGhpcy5fPWN9ZnVuY3Rpb24gbWgoKXtyZXR1cm4hdXUuY3RybEtleSYmIXV1LmJ1dHRvbn1mdW5jdGlvbiBnaCgpe3JldHVybiB0aGlzLnBhcmVudE5vZGV9ZnVuY3Rpb24gX2godCl7cmV0dXJuIG51bGw9PXQ/e3g6dXUueCx5OnV1Lnl9OnR9ZnVuY3Rpb24geWgoKXtyZXR1cm4gbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzfHwib250b3VjaHN0YXJ0ImluIHRoaXN9ZnVuY3Rpb24gdmgoKXt2YXIgdCxlLG4saSxyPW1oLG89Z2gsYT1faCxzPXloLGw9e30sYz1sYygic3RhcnQiLCJkcmFnIiwiZW5kIiksdT0wLGg9MDtmdW5jdGlvbiBkKHQpe3Qub24oIm1vdXNlZG93bi5kcmFnIixwKS5maWx0ZXIocykub24oInRvdWNoc3RhcnQuZHJhZyIsZykub24oInRvdWNobW92ZS5kcmFnIixfKS5vbigidG91Y2hlbmQuZHJhZyB0b3VjaGNhbmNlbC5kcmFnIix5KS5zdHlsZSgidG91Y2gtYWN0aW9uIiwibm9uZSIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIil9ZnVuY3Rpb24gcCgpe2lmKCFpJiZyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIGE9digibW91c2UiLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpLGFoLHRoaXMsYXJndW1lbnRzKTthJiYoU3UodXUudmlldykub24oIm1vdXNlbW92ZS5kcmFnIixmLCEwKS5vbigibW91c2V1cC5kcmFnIixtLCEwKSxoaCh1dS52aWV3KSxjaCgpLG49ITEsdD11dS5jbGllbnRYLGU9dXUuY2xpZW50WSxhKCJzdGFydCIpKX19ZnVuY3Rpb24gZigpe2lmKHVoKCksIW4pe3ZhciBpPXV1LmNsaWVudFgtdCxyPXV1LmNsaWVudFktZTtuPWkqaStyKnI+aH1sLm1vdXNlKCJkcmFnIil9ZnVuY3Rpb24gbSgpe1N1KHV1LnZpZXcpLm9uKCJtb3VzZW1vdmUuZHJhZyBtb3VzZXVwLmRyYWciLG51bGwpLGRoKHV1LnZpZXcsbiksdWgoKSxsLm1vdXNlKCJlbmQiKX1mdW5jdGlvbiBnKCl7aWYoci5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciB0LGUsbj11dS5jaGFuZ2VkVG91Y2hlcyxpPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpLGE9bi5sZW5ndGg7Zm9yKHQ9MDt0PGE7Kyt0KShlPXYoblt0XS5pZGVudGlmaWVyLGksbGgsdGhpcyxhcmd1bWVudHMpKSYmKGNoKCksZSgic3RhcnQiKSl9fWZ1bmN0aW9uIF8oKXt2YXIgdCxlLG49dXUuY2hhbmdlZFRvdWNoZXMsaT1uLmxlbmd0aDtmb3IodD0wO3Q8aTsrK3QpKGU9bFtuW3RdLmlkZW50aWZpZXJdKSYmKHVoKCksZSgiZHJhZyIpKX1mdW5jdGlvbiB5KCl7dmFyIHQsZSxuPXV1LmNoYW5nZWRUb3VjaGVzLHI9bi5sZW5ndGg7Zm9yKGkmJmNsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aT1udWxsfSksNTAwKSx0PTA7dDxyOysrdCkoZT1sW25bdF0uaWRlbnRpZmllcl0pJiYoY2goKSxlKCJlbmQiKSl9ZnVuY3Rpb24gdih0LGUsbixpLHIpe3ZhciBvLHMsaCxwPW4oZSx0KSxmPWMuY29weSgpO2lmKGd1KG5ldyBmaChkLCJiZWZvcmVzdGFydCIsbyx0LHUscFswXSxwWzFdLDAsMCxmKSwoZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9KHV1LnN1YmplY3Q9bz1hLmFwcGx5KGkscikpJiYocz1vLngtcFswXXx8MCxoPW8ueS1wWzFdfHwwLCEwKX0pKSlyZXR1cm4gZnVuY3Rpb24gYShjKXt2YXIgbSxnPXA7c3dpdGNoKGMpe2Nhc2Uic3RhcnQiOmxbdF09YSxtPXUrKzticmVhaztjYXNlImVuZCI6ZGVsZXRlIGxbdF0sLS11O2Nhc2UiZHJhZyI6cD1uKGUsdCksbT11fWd1KG5ldyBmaChkLGMsbyx0LG0scFswXStzLHBbMV0raCxwWzBdLWdbMF0scFsxXS1nWzFdLGYpLGYuYXBwbHksZixbYyxpLHJdKX19cmV0dXJuIGQuZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6cGgoISF0KSxkKTpyfSxkLmNvbnRhaW5lcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnBoKHQpLGQpOm99LGQuc3ViamVjdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnBoKHQpLGQpOmF9LGQudG91Y2hhYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6cGgoISF0KSxkKTpzfSxkLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9Yy5vbi5hcHBseShjLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1jP2Q6dH0sZC5jbGlja0Rpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSh0PSt0KSp0LGQpOk1hdGguc3FydChoKX0sZH1mdW5jdGlvbiBiaCh0LGUsbil7dC5wcm90b3R5cGU9ZS5wcm90b3R5cGU9bixuLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24geGgodCxlKXt2YXIgbj1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIGkgaW4gZSluW2ldPWVbaV07cmV0dXJuIG59ZnVuY3Rpb24gd2goKXt9aWgucHJvdG90eXBlPW5oLnByb3RvdHlwZT17Y29uc3RydWN0b3I6aWgsZ2V0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl87IShlIGluIHQpOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHRbZV19LHNldDpmdW5jdGlvbih0LGUpe3JldHVybiB0W3RoaXMuX109ZX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl8gaW4gdCYmZGVsZXRlIHRbdGhpcy5fXX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX0sZmgucHJvdG90eXBlLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fLm9uLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpO3JldHVybiB0PT09dGhpcy5fP3RoaXM6dH07dmFyIFNoPS43LE1oPTEvU2gsRWg9IlxccyooWystXT9cXGQrKVxccyoiLFRoPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLENoPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixBaD0vXiMoWzAtOWEtZl17Myw4fSkkLyxraD1uZXcgUmVnRXhwKCJecmdiXFwoIitbRWgsRWgsRWhdKyJcXCkkIiksTGg9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW0NoLENoLENoXSsiXFwpJCIpLFBoPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbRWgsRWgsRWgsVGhdKyJcXCkkIiksTmg9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tDaCxDaCxDaCxUaF0rIlxcKSQiKSxJaD1uZXcgUmVnRXhwKCJeaHNsXFwoIitbVGgsQ2gsQ2hdKyJcXCkkIiksUmg9bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1tUaCxDaCxDaCxUaF0rIlxcKSQiKSxPaD17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtmdW5jdGlvbiB6aCgpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpfWZ1bmN0aW9uIERoKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCl9ZnVuY3Rpb24gQmgodCl7dmFyIGUsbjtyZXR1cm4gdD0odCsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKGU9QWguZXhlYyh0KSk/KG49ZVsxXS5sZW5ndGgsZT1wYXJzZUludChlWzFdLDE2KSw2PT09bj9IaChlKTozPT09bj9uZXcgamgoZT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgxNSZlKTw8NHwxNSZlLDEpOjg9PT1uP0ZoKGU+PjI0JjI1NSxlPj4xNiYyNTUsZT4+OCYyNTUsKDI1NSZlKS8yNTUpOjQ9PT1uP0ZoKGU+PjEyJjE1fGU+PjgmMjQwLGU+PjgmMTV8ZT4+NCYyNDAsZT4+NCYxNXwyNDAmZSwoKDE1JmUpPDw0fDE1JmUpLzI1NSk6bnVsbCk6KGU9a2guZXhlYyh0KSk/bmV3IGpoKGVbMV0sZVsyXSxlWzNdLDEpOihlPUxoLmV4ZWModCkpP25ldyBqaCgyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCwxKTooZT1QaC5leGVjKHQpKT9GaChlWzFdLGVbMl0sZVszXSxlWzRdKTooZT1OaC5leGVjKHQpKT9GaCgyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCxlWzRdKTooZT1JaC5leGVjKHQpKT9ZaChlWzFdLGVbMl0vMTAwLGVbM10vMTAwLDEpOihlPVJoLmV4ZWModCkpP1loKGVbMV0sZVsyXS8xMDAsZVszXS8xMDAsZVs0XSk6T2guaGFzT3duUHJvcGVydHkodCk/SGgoT2hbdF0pOiJ0cmFuc3BhcmVudCI9PT10P25ldyBqaChOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIEhoKHQpe3JldHVybiBuZXcgamgodD4+MTYmMjU1LHQ+PjgmMjU1LDI1NSZ0LDEpfWZ1bmN0aW9uIEZoKHQsZSxuLGkpe3JldHVybiBpPD0wJiYodD1lPW49TmFOKSxuZXcgamgodCxlLG4saSl9ZnVuY3Rpb24gVmgodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiB3aHx8KHQ9QmgodCkpLHQ/bmV3IGpoKCh0PXQucmdiKCkpLnIsdC5nLHQuYix0Lm9wYWNpdHkpOm5ldyBqaH1mdW5jdGlvbiBVaCh0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/VmgodCk6bmV3IGpoKHQsZSxuLG51bGw9PWk/MTppKX1mdW5jdGlvbiBqaCh0LGUsbixpKXt0aGlzLnI9K3QsdGhpcy5nPStlLHRoaXMuYj0rbix0aGlzLm9wYWNpdHk9K2l9ZnVuY3Rpb24gR2goKXtyZXR1cm4iIyIrcWgodGhpcy5yKStxaCh0aGlzLmcpK3FoKHRoaXMuYil9ZnVuY3Rpb24gV2goKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX1mdW5jdGlvbiBxaCh0KXtyZXR1cm4oKHQ9TWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0KXx8MCkpKTwxNj8iMCI6IiIpK3QudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIFloKHQsZSxuLGkpe3JldHVybiBpPD0wP3Q9ZT1uPU5hTjpuPD0wfHxuPj0xP3Q9ZT1OYU46ZTw9MCYmKHQ9TmFOKSxuZXcgS2godCxlLG4saSl9ZnVuY3Rpb24gWGgodCl7aWYodCBpbnN0YW5jZW9mIEtoKXJldHVybiBuZXcgS2godC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2Ygd2h8fCh0PUJoKHQpKSwhdClyZXR1cm4gbmV3IEtoO2lmKHQgaW5zdGFuY2VvZiBLaClyZXR1cm4gdDt2YXIgZT0odD10LnJnYigpKS5yLzI1NSxuPXQuZy8yNTUsaT10LmIvMjU1LHI9TWF0aC5taW4oZSxuLGkpLG89TWF0aC5tYXgoZSxuLGkpLGE9TmFOLHM9by1yLGw9KG8rcikvMjtyZXR1cm4gcz8oYT1lPT09bz8obi1pKS9zKzYqKG48aSk6bj09PW8/KGktZSkvcysyOihlLW4pL3MrNCxzLz1sPC41P28rcjoyLW8tcixhKj02MCk6cz1sPjAmJmw8MT8wOmEsbmV3IEtoKGEscyxsLHQub3BhY2l0eSl9ZnVuY3Rpb24gJGgodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP1hoKHQpOm5ldyBLaCh0LGUsbixudWxsPT1pPzE6aSl9ZnVuY3Rpb24gS2godCxlLG4saSl7dGhpcy5oPSt0LHRoaXMucz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIFpoKHQsZSxuKXtyZXR1cm4gMjU1Kih0PDYwP2UrKG4tZSkqdC82MDp0PDE4MD9uOnQ8MjQwP2UrKG4tZSkqKDI0MC10KS82MDplKX1iaCh3aCxCaCx7Y29weTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3Rvcix0aGlzLHQpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCl9LGhleDp6aCxmb3JtYXRIZXg6emgsZm9ybWF0SHNsOmZ1bmN0aW9uIEpoKCl7cmV0dXJuIFhoKHRoaXMpLmZvcm1hdEhzbCgpfSxmb3JtYXRSZ2I6RGgsdG9TdHJpbmc6RGh9KSxiaChqaCxVaCx4aCh3aCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9NaDpNYXRoLnBvdyhNaCx0KSxuZXcgamgodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/U2g6TWF0aC5wb3coU2gsdCksbmV3IGpoKHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybi0uNTw9dGhpcy5yJiZ0aGlzLnI8MjU1LjUmJi0uNTw9dGhpcy5nJiZ0aGlzLmc8MjU1LjUmJi0uNTw9dGhpcy5iJiZ0aGlzLmI8MjU1LjUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxoZXg6R2gsZm9ybWF0SGV4OkdoLGZvcm1hdFJnYjpXaCx0b1N0cmluZzpXaH0pKSxiaChLaCwkaCx4aCh3aCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9NaDpNYXRoLnBvdyhNaCx0KSxuZXcgS2godGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9TaDpNYXRoLnBvdyhTaCx0KSxuZXcgS2godGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmglMzYwKzM2MCoodGhpcy5oPDApLGU9aXNOYU4odCl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsbj10aGlzLmwsaT1uKyhuPC41P246MS1uKSplLHI9MipuLWk7cmV0dXJuIG5ldyBqaChaaCh0Pj0yNDA/dC0yNDA6dCsxMjAscixpKSxaaCh0LHIsaSksWmgodDwxMjA/dCsyNDA6dC0xMjAscixpKSx0aGlzLm9wYWNpdHkpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybigwPD10aGlzLnMmJnRoaXMuczw9MXx8aXNOYU4odGhpcy5zKSkmJjA8PXRoaXMubCYmdGhpcy5sPD0xJiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sZm9ybWF0SHNsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcGFjaXR5O3JldHVybigxPT09KHQ9aXNOYU4odCk/MTpNYXRoLm1heCgwLE1hdGgubWluKDEsdCkpKT8iaHNsKCI6ImhzbGEoIikrKHRoaXMuaHx8MCkrIiwgIisxMDAqKHRoaXMuc3x8MCkrIiUsICIrMTAwKih0aGlzLmx8fDApKyIlIisoMT09PXQ/IikiOiIsICIrdCsiKSIpfX0pKTt2YXIgUWg9TWF0aC5QSS8xODAsdGQ9MTgwL01hdGguUEksZWQ9Ljk2NDIyLG5kPS44MjUyMSxpZD00LzI5LHJkPTYvMjksb2Q9MypyZCpyZDtmdW5jdGlvbiBhZCh0KXtpZih0IGluc3RhbmNlb2YgbGQpcmV0dXJuIG5ldyBsZCh0LmwsdC5hLHQuYix0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiBtZClyZXR1cm4gZ2QodCk7dCBpbnN0YW5jZW9mIGpofHwodD1WaCh0KSk7dmFyIGUsbixpPWRkKHQucikscj1kZCh0LmcpLG89ZGQodC5iKSxhPWNkKCguMjIyNTA0NSppKy43MTY4Nzg2KnIrLjA2MDYxNjkqbykvMSk7cmV0dXJuIGk9PT1yJiZyPT09bz9lPW49YTooZT1jZCgoLjQzNjA3NDcqaSsuMzg1MDY0OSpyKy4xNDMwODA0Km8pL2VkKSxuPWNkKCguMDEzOTMyMippKy4wOTcxMDQ1KnIrLjcxNDE3MzMqbykvbmQpKSxuZXcgbGQoMTE2KmEtMTYsNTAwKihlLWEpLDIwMCooYS1uKSx0Lm9wYWNpdHkpfWZ1bmN0aW9uIHNkKHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9hZCh0KTpuZXcgbGQodCxlLG4sbnVsbD09aT8xOmkpfWZ1bmN0aW9uIGxkKHQsZSxuLGkpe3RoaXMubD0rdCx0aGlzLmE9K2UsdGhpcy5iPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiBjZCh0KXtyZXR1cm4gdD4uMDA4ODU2NDUxNjc5MDM1NjMxP01hdGgucG93KHQsMS8zKTp0L29kK2lkfWZ1bmN0aW9uIHVkKHQpe3JldHVybiB0PnJkP3QqdCp0Om9kKih0LWlkKX1mdW5jdGlvbiBoZCh0KXtyZXR1cm4gMjU1Kih0PD0uMDAzMTMwOD8xMi45Mip0OjEuMDU1Kk1hdGgucG93KHQsMS8yLjQpLS4wNTUpfWZ1bmN0aW9uIGRkKHQpe3JldHVybih0Lz0yNTUpPD0uMDQwNDU/dC8xMi45MjpNYXRoLnBvdygodCsuMDU1KS8xLjA1NSwyLjQpfWZ1bmN0aW9uIHBkKHQpe2lmKHQgaW5zdGFuY2VvZiBtZClyZXR1cm4gbmV3IG1kKHQuaCx0LmMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIGxkfHwodD1hZCh0KSksMD09PXQuYSYmMD09PXQuYilyZXR1cm4gbmV3IG1kKE5hTiwwPHQubCYmdC5sPDEwMD8wOk5hTix0LmwsdC5vcGFjaXR5KTt2YXIgZT1NYXRoLmF0YW4yKHQuYix0LmEpKnRkO3JldHVybiBuZXcgbWQoZTwwP2UrMzYwOmUsTWF0aC5zcXJ0KHQuYSp0LmErdC5iKnQuYiksdC5sLHQub3BhY2l0eSl9ZnVuY3Rpb24gZmQodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3BkKHQpOm5ldyBtZCh0LGUsbixudWxsPT1pPzE6aSl9ZnVuY3Rpb24gbWQodCxlLG4saSl7dGhpcy5oPSt0LHRoaXMuYz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIGdkKHQpe2lmKGlzTmFOKHQuaCkpcmV0dXJuIG5ldyBsZCh0LmwsMCwwLHQub3BhY2l0eSk7dmFyIGU9dC5oKlFoO3JldHVybiBuZXcgbGQodC5sLE1hdGguY29zKGUpKnQuYyxNYXRoLnNpbihlKSp0LmMsdC5vcGFjaXR5KX1iaChsZCxzZCx4aCh3aCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBsZCh0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGxkKHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9KHRoaXMubCsxNikvMTE2LGU9aXNOYU4odGhpcy5hKT90OnQrdGhpcy5hLzUwMCxuPWlzTmFOKHRoaXMuYik/dDp0LXRoaXMuYi8yMDA7cmV0dXJuIG5ldyBqaChoZCgzLjEzMzg1NjEqKGU9ZWQqdWQoZSkpLTEuNjE2ODY2NyoodD0xKnVkKHQpKS0uNDkwNjE0Nioobj1uZCp1ZChuKSkpLGhkKC0uOTc4NzY4NCplKzEuOTE2MTQxNSp0Ky4wMzM0NTQqbiksaGQoLjA3MTk0NTMqZS0uMjI4OTkxNCp0KzEuNDA1MjQyNypuKSx0aGlzLm9wYWNpdHkpfX0pKSxiaChtZCxmZCx4aCh3aCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBtZCh0aGlzLmgsdGhpcy5jLHRoaXMubCsxOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG1kKHRoaXMuaCx0aGlzLmMsdGhpcy5sLTE4KihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIGdkKHRoaXMpLnJnYigpfX0pKTt2YXIgX2Q9LS4yOTIyNyx5ZD0tLjkwNjQ5LHZkPTEuOTcyOTQ7ZnVuY3Rpb24gYmQodCl7aWYodCBpbnN0YW5jZW9mIHdkKXJldHVybiBuZXcgd2QodC5oLHQucyx0LmwsdC5vcGFjaXR5KTt0IGluc3RhbmNlb2Ygamh8fCh0PVZoKHQpKTt2YXIgZT10LmcvMjU1LG49dC5iLzI1NSxpPSgtLjY1NTc2MzY2Njc5OTk5OTkqbit0LnIvMjU1Ki0xLjc4ODQ1MDM4MDYtMy41MTcyOTgyNDM4KmUpLy01Ljk2MTUxMjI5MTIscj1uLWksbz0odmQqKGUtaSktX2QqcikveWQsYT1NYXRoLnNxcnQobypvK3IqcikvKHZkKmkqKDEtaSkpLHM9YT9NYXRoLmF0YW4yKG8scikqdGQtMTIwOk5hTjtyZXR1cm4gbmV3IHdkKHM8MD9zKzM2MDpzLGEsaSx0Lm9wYWNpdHkpfWZ1bmN0aW9uIHhkKHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9iZCh0KTpuZXcgd2QodCxlLG4sbnVsbD09aT8xOmkpfWZ1bmN0aW9uIHdkKHQsZSxuLGkpe3RoaXMuaD0rdCx0aGlzLnM9K2UsdGhpcy5sPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiBTZCh0LGUsbixpLHIpe3ZhciBvPXQqdCxhPW8qdDtyZXR1cm4oKDEtMyp0KzMqby1hKSplKyg0LTYqbyszKmEpKm4rKDErMyp0KzMqby0zKmEpKmkrYSpyKS82fWZ1bmN0aW9uIE1kKHQpe3ZhciBlPXQubGVuZ3RoLTE7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBpPW48PTA/bj0wOm4+PTE/KG49MSxlLTEpOk1hdGguZmxvb3IobiplKSxyPXRbaV0sbz10W2krMV07cmV0dXJuIFNkKChuLWkvZSkqZSxpPjA/dFtpLTFdOjIqci1vLHIsbyxpPGUtMT90W2krMl06MipvLXIpfX1mdW5jdGlvbiBFZCh0KXt2YXIgZT10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGk9TWF0aC5mbG9vcigoKG4lPTEpPDA/KytuOm4pKmUpO3JldHVybiBTZCgobi1pL2UpKmUsdFsoaStlLTEpJWVdLHRbaSVlXSx0WyhpKzEpJWVdLHRbKGkrMiklZV0pfX1mdW5jdGlvbiBUZCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gQ2QodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQrbiplfX1mdW5jdGlvbiBBZCh0LGUpe3ZhciBuPWUtdDtyZXR1cm4gbj9DZCh0LG4+MTgwfHxuPC0xODA/bi0zNjAqTWF0aC5yb3VuZChuLzM2MCk6bik6VGQoaXNOYU4odCk/ZTp0KX1mdW5jdGlvbiBrZCh0LGUpe3ZhciBuPWUtdDtyZXR1cm4gbj9DZCh0LG4pOlRkKGlzTmFOKHQpP2U6dCl9Ymgod2QseGQseGgod2gse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/TWg6TWF0aC5wb3coTWgsdCksbmV3IHdkKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/U2g6TWF0aC5wb3coU2gsdCksbmV3IHdkKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9aXNOYU4odGhpcy5oKT8wOih0aGlzLmgrMTIwKSpRaCxlPSt0aGlzLmwsbj1pc05hTih0aGlzLnMpPzA6dGhpcy5zKmUqKDEtZSksaT1NYXRoLmNvcyh0KSxyPU1hdGguc2luKHQpO3JldHVybiBuZXcgamgoMjU1KihlK24qKC0uMTQ4NjEqaSsxLjc4Mjc3KnIpKSwyNTUqKGUrbiooX2QqaSt5ZCpyKSksMjU1KihlK24qKHZkKmkpKSx0aGlzLm9wYWNpdHkpfX0pKTt2YXIgTGQ9KGZ1bmN0aW9uIHQoZSl7dmFyIG49KGZ1bmN0aW9uIGkodCl7cmV0dXJuIDE9PSh0PSt0KT9rZDpmdW5jdGlvbihlLG4pe3JldHVybiBuLWU/KGZ1bmN0aW9uIGkodCxlLG4pe3JldHVybiB0PU1hdGgucG93KHQsbiksZT1NYXRoLnBvdyhlLG4pLXQsbj0xL24sZnVuY3Rpb24oaSl7cmV0dXJuIE1hdGgucG93KHQraSplLG4pfX0pKGUsbix0KTpUZChpc05hTihlKT9uOmUpfX0pKGUpO2Z1bmN0aW9uIHIodCxlKXt2YXIgaT1uKCh0PVVoKHQpKS5yLChlPVVoKGUpKS5yKSxyPW4odC5nLGUuZyksbz1uKHQuYixlLmIpLGE9a2QodC5vcGFjaXR5LGUub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0LnI9aShlKSx0Lmc9cihlKSx0LmI9byhlKSx0Lm9wYWNpdHk9YShlKSx0KyIifX1yZXR1cm4gci5nYW1tYT10LHJ9KSgxKTtmdW5jdGlvbiBQZCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG4saSxyPWUubGVuZ3RoLG89bmV3IEFycmF5KHIpLGE9bmV3IEFycmF5KHIpLHM9bmV3IEFycmF5KHIpO2ZvcihuPTA7bjxyOysrbilpPVVoKGVbbl0pLG9bbl09aS5yfHwwLGFbbl09aS5nfHwwLHNbbl09aS5ifHwwO3JldHVybiBvPXQobyksYT10KGEpLHM9dChzKSxpLm9wYWNpdHk9MSxmdW5jdGlvbih0KXtyZXR1cm4gaS5yPW8odCksaS5nPWEodCksaS5iPXModCksaSsiIn19fXZhciBOZD1QZChNZCksSWQ9UGQoRWQpO2Z1bmN0aW9uIFJkKHQsZSl7ZXx8KGU9W10pO3ZhciBuLGk9dD9NYXRoLm1pbihlLmxlbmd0aCx0Lmxlbmd0aCk6MCxyPWUuc2xpY2UoKTtyZXR1cm4gZnVuY3Rpb24obyl7Zm9yKG49MDtuPGk7KytuKXJbbl09dFtuXSooMS1vKStlW25dKm87cmV0dXJuIHJ9fWZ1bmN0aW9uIE9kKHQpe3JldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcodCkmJiEodCBpbnN0YW5jZW9mIERhdGFWaWV3KX1mdW5jdGlvbiB6ZCh0LGUpe3ZhciBuLGk9ZT9lLmxlbmd0aDowLHI9dD9NYXRoLm1pbihpLHQubGVuZ3RoKTowLG89bmV3IEFycmF5KHIpLGE9bmV3IEFycmF5KGkpO2ZvcihuPTA7bjxyOysrbilvW25dPWpkKHRbbl0sZVtuXSk7Zm9yKDtuPGk7KytuKWFbbl09ZVtuXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKG49MDtuPHI7KytuKWFbbl09b1tuXSh0KTtyZXR1cm4gYX19ZnVuY3Rpb24gRGQodCxlKXt2YXIgbj1uZXcgRGF0ZTtyZXR1cm4gdD0rdCxlPStlLGZ1bmN0aW9uKGkpe3JldHVybiBuLnNldFRpbWUodCooMS1pKStlKmkpLG59fWZ1bmN0aW9uIEJkKHQsZSl7cmV0dXJuIHQ9K3QsZT0rZSxmdW5jdGlvbihuKXtyZXR1cm4gdCooMS1uKStlKm59fWZ1bmN0aW9uIEhkKHQsZSl7dmFyIG4saT17fSxyPXt9O2ZvcihuIGluIG51bGwhPT10JiYib2JqZWN0Ij09dHlwZW9mIHR8fCh0PXt9KSxudWxsIT09ZSYmIm9iamVjdCI9PXR5cGVvZiBlfHwoZT17fSksZSluIGluIHQ/aVtuXT1qZCh0W25dLGVbbl0pOnJbbl09ZVtuXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKG4gaW4gaSlyW25dPWlbbl0odCk7cmV0dXJuIHJ9fXZhciBGZD0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2csVmQ9bmV3IFJlZ0V4cChGZC5zb3VyY2UsImciKTtmdW5jdGlvbiBVZCh0LGUpe3ZhciBuLGkscixvPUZkLmxhc3RJbmRleD1WZC5sYXN0SW5kZXg9MCxhPS0xLHM9W10sbD1bXTtmb3IodCs9IiIsZSs9IiI7KG49RmQuZXhlYyh0KSkmJihpPVZkLmV4ZWMoZSkpOykocj1pLmluZGV4KT5vJiYocj1lLnNsaWNlKG8sciksc1thXT9zW2FdKz1yOnNbKythXT1yKSwobj1uWzBdKT09PShpPWlbMF0pP3NbYV0/c1thXSs9aTpzWysrYV09aTooc1srK2FdPW51bGwsbC5wdXNoKHtpOmEseDpCZChuLGkpfSkpLG89VmQubGFzdEluZGV4O3JldHVybiBvPGUubGVuZ3RoJiYocj1lLnNsaWNlKG8pLHNbYV0/c1thXSs9cjpzWysrYV09cikscy5sZW5ndGg8Mj9sWzBdPyhmdW5jdGlvbiBjKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlKSsiIn19KShsWzBdLngpOihmdW5jdGlvbiB1KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0pKGUpOihlPWwubGVuZ3RoLGZ1bmN0aW9uKHQpe2Zvcih2YXIgbixpPTA7aTxlOysraSlzWyhuPWxbaV0pLmldPW4ueCh0KTtyZXR1cm4gcy5qb2luKCIiKX0pfWZ1bmN0aW9uIGpkKHQsZSl7dmFyIG4saT10eXBlb2YgZTtyZXR1cm4gbnVsbD09ZXx8ImJvb2xlYW4iPT09aT9UZChlKTooIm51bWJlciI9PT1pP0JkOiJzdHJpbmciPT09aT8obj1CaChlKSk/KGU9bixMZCk6VWQ6ZSBpbnN0YW5jZW9mIEJoP0xkOmUgaW5zdGFuY2VvZiBEYXRlP0RkOk9kKGUpP1JkOkFycmF5LmlzQXJyYXkoZSk/emQ6ImZ1bmN0aW9uIiE9dHlwZW9mIGUudmFsdWVPZiYmImZ1bmN0aW9uIiE9dHlwZW9mIGUudG9TdHJpbmd8fGlzTmFOKGUpP0hkOkJkKSh0LGUpfWZ1bmN0aW9uIEdkKHQsZSl7cmV0dXJuIHQ9K3QsZT0rZSxmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5yb3VuZCh0KigxLW4pK2Uqbil9fXZhciBXZCxxZCxZZCxYZCwkZD0xODAvTWF0aC5QSSxLZD17dHJhbnNsYXRlWDowLHRyYW5zbGF0ZVk6MCxyb3RhdGU6MCxza2V3WDowLHNjYWxlWDoxLHNjYWxlWToxfTtmdW5jdGlvbiBaZCh0LGUsbixpLHIsbyl7dmFyIGEscyxsO3JldHVybihhPU1hdGguc3FydCh0KnQrZSplKSkmJih0Lz1hLGUvPWEpLChsPXQqbitlKmkpJiYobi09dCpsLGktPWUqbCksKHM9TWF0aC5zcXJ0KG4qbitpKmkpKSYmKG4vPXMsaS89cyxsLz1zKSx0Kmk8ZSpuJiYodD0tdCxlPS1lLGw9LWwsYT0tYSkse3RyYW5zbGF0ZVg6cix0cmFuc2xhdGVZOm8scm90YXRlOk1hdGguYXRhbjIoZSx0KSokZCxza2V3WDpNYXRoLmF0YW4obCkqJGQsc2NhbGVYOmEsc2NhbGVZOnN9fWZ1bmN0aW9uIEpkKHQsZSxuLGkpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQubGVuZ3RoP3QucG9wKCkrIiAiOiIifXJldHVybiBmdW5jdGlvbihvLGEpe3ZhciBzPVtdLGw9W107cmV0dXJuIG89dChvKSxhPXQoYSksKGZ1bmN0aW9uIGModCxpLHIsbyxhLHMpe2lmKHQhPT1yfHxpIT09byl7dmFyIGw9YS5wdXNoKCJ0cmFuc2xhdGUoIixudWxsLGUsbnVsbCxuKTtzLnB1c2goe2k6bC00LHg6QmQodCxyKX0se2k6bC0yLHg6QmQoaSxvKX0pfWVsc2Uocnx8bykmJmEucHVzaCgidHJhbnNsYXRlKCIrcitlK28rbil9KShvLnRyYW5zbGF0ZVgsby50cmFuc2xhdGVZLGEudHJhbnNsYXRlWCxhLnRyYW5zbGF0ZVkscyxsKSwoZnVuY3Rpb24gdSh0LGUsbixvKXt0IT09ZT8odC1lPjE4MD9lKz0zNjA6ZS10PjE4MCYmKHQrPTM2MCksby5wdXNoKHtpOm4ucHVzaChyKG4pKyJyb3RhdGUoIixudWxsLGkpLTIseDpCZCh0LGUpfSkpOmUmJm4ucHVzaChyKG4pKyJyb3RhdGUoIitlK2kpfSkoby5yb3RhdGUsYS5yb3RhdGUscyxsKSwoZnVuY3Rpb24gaCh0LGUsbixvKXt0IT09ZT9vLnB1c2goe2k6bi5wdXNoKHIobikrInNrZXdYKCIsbnVsbCxpKS0yLHg6QmQodCxlKX0pOmUmJm4ucHVzaChyKG4pKyJza2V3WCgiK2UraSl9KShvLnNrZXdYLGEuc2tld1gscyxsKSwoZnVuY3Rpb24gZCh0LGUsbixpLG8sYSl7aWYodCE9PW58fGUhPT1pKXt2YXIgcz1vLnB1c2gocihvKSsic2NhbGUoIixudWxsLCIsIixudWxsLCIpIik7YS5wdXNoKHtpOnMtNCx4OkJkKHQsbil9LHtpOnMtMix4OkJkKGUsaSl9KX1lbHNlIDE9PT1uJiYxPT09aXx8by5wdXNoKHIobykrInNjYWxlKCIrbisiLCIraSsiKSIpfSkoby5zY2FsZVgsby5zY2FsZVksYS5zY2FsZVgsYS5zY2FsZVkscyxsKSxvPWE9bnVsbCxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0tMSxpPWwubGVuZ3RoOysrbjxpOylzWyhlPWxbbl0pLmldPWUueCh0KTtyZXR1cm4gcy5qb2luKCIiKX19fXZhciBRZD1KZCgoZnVuY3Rpb24gdHAodCl7cmV0dXJuIm5vbmUiPT09dD9LZDooV2R8fChXZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSxxZD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsWWQ9ZG9jdW1lbnQuZGVmYXVsdFZpZXcpLFdkLnN0eWxlLnRyYW5zZm9ybT10LHQ9WWQuZ2V0Q29tcHV0ZWRTdHlsZShxZC5hcHBlbmRDaGlsZChXZCksbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNmb3JtIikscWQucmVtb3ZlQ2hpbGQoV2QpLFpkKCsodD10LnNsaWNlKDcsLTEpLnNwbGl0KCIsIikpWzBdLCt0WzFdLCt0WzJdLCt0WzNdLCt0WzRdLCt0WzVdKSl9KSwicHgsICIsInB4KSIsImRlZykiKSxlcD1KZCgoZnVuY3Rpb24gbnAodCl7cmV0dXJuIG51bGw9PXQ/S2Q6KFhkfHwoWGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsImciKSksWGQuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLHQpLCh0PVhkLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpP1pkKCh0PXQubWF0cml4KS5hLHQuYix0LmMsdC5kLHQuZSx0LmYpOktkKX0pLCIsICIsIikiLCIpIiksaXA9TWF0aC5TUVJUMjtmdW5jdGlvbiBycCh0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpKzEvdCkvMn1mdW5jdGlvbiBvcCh0LGUpe3ZhciBuLGkscj10WzBdLG89dFsxXSxhPXRbMl0scz1lWzJdLGw9ZVswXS1yLGM9ZVsxXS1vLHU9bCpsK2MqYztpZih1PDFlLTEyKWk9TWF0aC5sb2cocy9hKS9pcCxuPWZ1bmN0aW9uKHQpe3JldHVybltyK3QqbCxvK3QqYyxhKk1hdGguZXhwKGlwKnQqaSldfTtlbHNle3ZhciBoPU1hdGguc3FydCh1KSxkPShzKnMtYSphKzQqdSkvKDIqYSoyKmgpLHA9KHMqcy1hKmEtNCp1KS8oMipzKjIqaCksZj1NYXRoLmxvZyhNYXRoLnNxcnQoZCpkKzEpLWQpLG09TWF0aC5sb2coTWF0aC5zcXJ0KHAqcCsxKS1wKTtpPShtLWYpL2lwLG49ZnVuY3Rpb24odCl7dmFyIGU9dCppLG49cnAoZikscz1hLygyKmgpKihuKihmdW5jdGlvbiB1KHQpe3JldHVybigodD1NYXRoLmV4cCgyKnQpKS0xKS8odCsxKX0pKGlwKmUrZiktKGZ1bmN0aW9uIGQodCl7cmV0dXJuKCh0PU1hdGguZXhwKHQpKS0xL3QpLzJ9KShmKSk7cmV0dXJuW3IrcypsLG8rcypjLGEqbi9ycChpcCplK2YpXX19cmV0dXJuIG4uZHVyYXRpb249MWUzKmksbn1mdW5jdGlvbiBhcCh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgaT10KChlPSRoKGUpKS5oLChuPSRoKG4pKS5oKSxyPWtkKGUucyxuLnMpLG89a2QoZS5sLG4ubCksYT1rZChlLm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUuaD1pKHQpLGUucz1yKHQpLGUubD1vKHQpLGUub3BhY2l0eT1hKHQpLGUrIiJ9fX12YXIgc3A9YXAoQWQpLGxwPWFwKGtkKTtmdW5jdGlvbiBjcCh0LGUpe3ZhciBuPWtkKCh0PXNkKHQpKS5sLChlPXNkKGUpKS5sKSxpPWtkKHQuYSxlLmEpLHI9a2QodC5iLGUuYiksbz1rZCh0Lm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQubD1uKGUpLHQuYT1pKGUpLHQuYj1yKGUpLHQub3BhY2l0eT1vKGUpLHQrIiJ9fWZ1bmN0aW9uIHVwKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciBpPXQoKGU9ZmQoZSkpLmgsKG49ZmQobikpLmgpLHI9a2QoZS5jLG4uYyksbz1rZChlLmwsbi5sKSxhPWtkKGUub3BhY2l0eSxuLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5oPWkodCksZS5jPXIodCksZS5sPW8odCksZS5vcGFjaXR5PWEodCksZSsiIn19fXZhciBocD11cChBZCksZHA9dXAoa2QpO2Z1bmN0aW9uIHBwKHQpe3JldHVybihmdW5jdGlvbiBlKG4pe2Z1bmN0aW9uIGkoZSxpKXt2YXIgcj10KChlPXhkKGUpKS5oLChpPXhkKGkpKS5oKSxvPWtkKGUucyxpLnMpLGE9a2QoZS5sLGkubCkscz1rZChlLm9wYWNpdHksaS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUuaD1yKHQpLGUucz1vKHQpLGUubD1hKE1hdGgucG93KHQsbikpLGUub3BhY2l0eT1zKHQpLGUrIiJ9fXJldHVybiBuPStuLGkuZ2FtbWE9ZSxpfSkoMSl9dmFyIGZwLG1wLGdwPXBwKEFkKSxfcD1wcChrZCkseXA9MCx2cD0wLGJwPTAseHA9MCx3cD0wLFNwPTAsTXA9Im9iamVjdCI9PXR5cGVvZiBwZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlOkRhdGUsRXA9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdyk6ZnVuY3Rpb24odCl7c2V0VGltZW91dCh0LDE3KX07ZnVuY3Rpb24gVHAoKXtyZXR1cm4gd3B8fChFcChDcCksd3A9TXAubm93KCkrU3ApfWZ1bmN0aW9uIENwKCl7d3A9MH1mdW5jdGlvbiBBcCgpe3RoaXMuX2NhbGw9dGhpcy5fdGltZT10aGlzLl9uZXh0PW51bGx9ZnVuY3Rpb24ga3AodCxlLG4pe3ZhciBpPW5ldyBBcDtyZXR1cm4gaS5yZXN0YXJ0KHQsZSxuKSxpfWZ1bmN0aW9uIExwKCl7VHAoKSwrK3lwO2Zvcih2YXIgdCxlPWZwO2U7KSh0PXdwLWUuX3RpbWUpPj0wJiZlLl9jYWxsLmNhbGwobnVsbCx0KSxlPWUuX25leHQ7LS15cH1mdW5jdGlvbiBQcCgpe3dwPSh4cD1NcC5ub3coKSkrU3AseXA9dnA9MDt0cnl7THAoKX1maW5hbGx5e3lwPTAsKGZ1bmN0aW9uIHQoKXtmb3IodmFyIHQsZSxuPWZwLGk9MS8wO247KW4uX2NhbGw/KGk+bi5fdGltZSYmKGk9bi5fdGltZSksdD1uLG49bi5fbmV4dCk6KGU9bi5fbmV4dCxuLl9uZXh0PW51bGwsbj10P3QuX25leHQ9ZTpmcD1lKTttcD10LElwKGkpfSkoKSx3cD0wfX1mdW5jdGlvbiBOcCgpe3ZhciB0PU1wLm5vdygpLGU9dC14cDtlPjFlMyYmKFNwLT1lLHhwPXQpfWZ1bmN0aW9uIElwKHQpe3lwfHwodnAmJih2cD1jbGVhclRpbWVvdXQodnApKSx0LXdwPjI0Pyh0PDEvMCYmKHZwPXNldFRpbWVvdXQoUHAsdC1NcC5ub3coKS1TcCkpLGJwJiYoYnA9Y2xlYXJJbnRlcnZhbChicCkpKTooYnB8fCh4cD1NcC5ub3coKSxicD1zZXRJbnRlcnZhbChOcCwxZTMpKSx5cD0xLEVwKFBwKSkpfWZ1bmN0aW9uIFJwKHQsZSxuKXt2YXIgaT1uZXcgQXA7cmV0dXJuIGkucmVzdGFydCgoZnVuY3Rpb24obil7aS5zdG9wKCksdChuK2UpfSksZT1udWxsPT1lPzA6K2UsbiksaX1BcC5wcm90b3R5cGU9a3AucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpBcCxyZXN0YXJ0OmZ1bmN0aW9uKHQsZSxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbiIpO249KG51bGw9PW4/VHAoKTorbikrKG51bGw9PWU/MDorZSksdGhpcy5fbmV4dHx8bXA9PT10aGlzfHwobXA/bXAuX25leHQ9dGhpczpmcD10aGlzLG1wPXRoaXMpLHRoaXMuX2NhbGw9dCx0aGlzLl90aW1lPW4sSXAoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2NhbGwmJih0aGlzLl9jYWxsPW51bGwsdGhpcy5fdGltZT0xLzAsSXAoKSl9fTt2YXIgT3A9bGMoInN0YXJ0IiwiZW5kIiwiY2FuY2VsIiwiaW50ZXJydXB0IiksenA9W107ZnVuY3Rpb24gRHAodCxlLG4saSxyLG8pe3ZhciBhPXQuX190cmFuc2l0aW9uO2lmKGEpe2lmKG4gaW4gYSlyZXR1cm59ZWxzZSB0Ll9fdHJhbnNpdGlvbj17fTshKGZ1bmN0aW9uIHModCxlLG4pe3ZhciBpLHI9dC5fX3RyYW5zaXRpb247ZnVuY3Rpb24gbyhsKXt2YXIgYyx1LGgsZDtpZigxIT09bi5zdGF0ZSlyZXR1cm4gcygpO2ZvcihjIGluIHIpaWYoKGQ9cltjXSkubmFtZT09PW4ubmFtZSl7aWYoMz09PWQuc3RhdGUpcmV0dXJuIFJwKG8pOzQ9PT1kLnN0YXRlPyhkLnN0YXRlPTYsZC50aW1lci5zdG9wKCksZC5vbi5jYWxsKCJpbnRlcnJ1cHQiLHQsdC5fX2RhdGFfXyxkLmluZGV4LGQuZ3JvdXApLGRlbGV0ZSByW2NdKTorYzxlJiYoZC5zdGF0ZT02LGQudGltZXIuc3RvcCgpLGQub24uY2FsbCgiY2FuY2VsIix0LHQuX19kYXRhX18sZC5pbmRleCxkLmdyb3VwKSxkZWxldGUgcltjXSl9aWYoUnAoKGZ1bmN0aW9uKCl7Mz09PW4uc3RhdGUmJihuLnN0YXRlPTQsbi50aW1lci5yZXN0YXJ0KGEsbi5kZWxheSxuLnRpbWUpLGEobCkpfSkpLG4uc3RhdGU9MixuLm9uLmNhbGwoInN0YXJ0Iix0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSwyPT09bi5zdGF0ZSl7Zm9yKG4uc3RhdGU9MyxpPW5ldyBBcnJheShoPW4udHdlZW4ubGVuZ3RoKSxjPTAsdT0tMTtjPGg7KytjKShkPW4udHdlZW5bY10udmFsdWUuY2FsbCh0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSkmJihpWysrdV09ZCk7aS5sZW5ndGg9dSsxfX1mdW5jdGlvbiBhKGUpe2Zvcih2YXIgcj1lPG4uZHVyYXRpb24/bi5lYXNlLmNhbGwobnVsbCxlL24uZHVyYXRpb24pOihuLnRpbWVyLnJlc3RhcnQocyksbi5zdGF0ZT01LDEpLG89LTEsYT1pLmxlbmd0aDsrK288YTspaVtvXS5jYWxsKHQscik7NT09PW4uc3RhdGUmJihuLm9uLmNhbGwoImVuZCIsdCx0Ll9fZGF0YV9fLG4uaW5kZXgsbi5ncm91cCkscygpKX1mdW5jdGlvbiBzKCl7Zm9yKHZhciBpIGluIG4uc3RhdGU9NixuLnRpbWVyLnN0b3AoKSxkZWxldGUgcltlXSxyKXJldHVybjtkZWxldGUgdC5fX3RyYW5zaXRpb259cltlXT1uLG4udGltZXI9a3AoKGZ1bmN0aW9uIGwodCl7bi5zdGF0ZT0xLG4udGltZXIucmVzdGFydChvLG4uZGVsYXksbi50aW1lKSxuLmRlbGF5PD10JiZvKHQtbi5kZWxheSl9KSwwLG4udGltZSl9KSh0LG4se25hbWU6ZSxpbmRleDppLGdyb3VwOnIsb246T3AsdHdlZW46enAsdGltZTpvLnRpbWUsZGVsYXk6by5kZWxheSxkdXJhdGlvbjpvLmR1cmF0aW9uLGVhc2U6by5lYXNlLHRpbWVyOm51bGwsc3RhdGU6MH0pfWZ1bmN0aW9uIEJwKHQsZSl7dmFyIG49RnAodCxlKTtpZihuLnN0YXRlPjApdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFkeSBzY2hlZHVsZWQiKTtyZXR1cm4gbn1mdW5jdGlvbiBIcCh0LGUpe3ZhciBuPUZwKHQsZSk7aWYobi5zdGF0ZT4zKXRocm93IG5ldyBFcnJvcigidG9vIGxhdGU7IGFscmVhZHkgcnVubmluZyIpO3JldHVybiBufWZ1bmN0aW9uIEZwKHQsZSl7dmFyIG49dC5fX3RyYW5zaXRpb247aWYoIW58fCEobj1uW2VdKSl0aHJvdyBuZXcgRXJyb3IoInRyYW5zaXRpb24gbm90IGZvdW5kIik7cmV0dXJuIG59ZnVuY3Rpb24gVnAodCxlKXt2YXIgbixpLHIsbz10Ll9fdHJhbnNpdGlvbixhPSEwO2lmKG8pe2ZvcihyIGluIGU9bnVsbD09ZT9udWxsOmUrIiIsbykobj1vW3JdKS5uYW1lPT09ZT8oaT1uLnN0YXRlPjImJm4uc3RhdGU8NSxuLnN0YXRlPTYsbi50aW1lci5zdG9wKCksbi5vbi5jYWxsKGk/ImludGVycnVwdCI6ImNhbmNlbCIsdCx0Ll9fZGF0YV9fLG4uaW5kZXgsbi5ncm91cCksZGVsZXRlIG9bcl0pOmE9ITE7YSYmZGVsZXRlIHQuX190cmFuc2l0aW9ufX1mdW5jdGlvbiBVcCh0LGUpe3ZhciBuLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9SHAodGhpcyx0KSxvPXIudHdlZW47aWYobyE9PW4pZm9yKHZhciBhPTAscz0oaT1uPW8pLmxlbmd0aDthPHM7KythKWlmKGlbYV0ubmFtZT09PWUpeyhpPWkuc2xpY2UoKSkuc3BsaWNlKGEsMSk7YnJlYWt9ci50d2Vlbj1pfX1mdW5jdGlvbiBqcCh0LGUsbil7dmFyIGkscjtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89SHAodGhpcyx0KSxhPW8udHdlZW47aWYoYSE9PWkpe3I9KGk9YSkuc2xpY2UoKTtmb3IodmFyIHM9e25hbWU6ZSx2YWx1ZTpufSxsPTAsYz1yLmxlbmd0aDtsPGM7KytsKWlmKHJbbF0ubmFtZT09PWUpe3JbbF09czticmVha31sPT09YyYmci5wdXNoKHMpfW8udHdlZW49cn19ZnVuY3Rpb24gR3AodCxlLG4pe3ZhciBpPXQuX2lkO3JldHVybiB0LmVhY2goKGZ1bmN0aW9uKCl7dmFyIHQ9SHAodGhpcyxpKTsodC52YWx1ZXx8KHQudmFsdWU9e30pKVtlXT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pKSxmdW5jdGlvbih0KXtyZXR1cm4gRnAodCxpKS52YWx1ZVtlXX19ZnVuY3Rpb24gV3AodCxlKXt2YXIgbjtyZXR1cm4oIm51bWJlciI9PXR5cGVvZiBlP0JkOmUgaW5zdGFuY2VvZiBCaD9MZDoobj1CaChlKSk/KGU9bixMZCk6VWQpKHQsZSl9ZnVuY3Rpb24gcXAodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIFlwKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gWHAodCxlLG4pe3ZhciBpLHIsbz1uKyIiO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0QXR0cmlidXRlKHQpO3JldHVybiBhPT09bz9udWxsOmE9PT1pP3I6cj1lKGk9YSxuKX19ZnVuY3Rpb24gJHAodCxlLG4pe3ZhciBpLHIsbz1uKyIiO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTtyZXR1cm4gYT09PW8/bnVsbDphPT09aT9yOnI9ZShpPWEsbil9fWZ1bmN0aW9uIEtwKHQsZSxuKXt2YXIgaSxyLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEscyxsPW4odGhpcyk7aWYobnVsbCE9bClyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZSh0KSk9PT0ocz1sKyIiKT9udWxsOmE9PT1pJiZzPT09cj9vOihyPXMsbz1lKGk9YSxsKSk7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIFpwKHQsZSxuKXt2YXIgaSxyLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEscyxsPW4odGhpcyk7aWYobnVsbCE9bClyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCkpPT09KHM9bCsiIik/bnVsbDphPT09aSYmcz09PXI/bzoocj1zLG89ZShpPWEsbCkpO3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gSnAodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGUodCxlLmNhbGwodGhpcyxuKSl9fWZ1bmN0aW9uIFFwKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGUuY2FsbCh0aGlzLG4pKX19ZnVuY3Rpb24gdGYodCxlKXt2YXIgbixpO2Z1bmN0aW9uIHIoKXt2YXIgcj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gciE9PWkmJihuPShpPXIpJiZRcCh0LHIpKSxufXJldHVybiByLl92YWx1ZT1lLHJ9ZnVuY3Rpb24gZWYodCxlKXt2YXIgbixpO2Z1bmN0aW9uIHIoKXt2YXIgcj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gciE9PWkmJihuPShpPXIpJiZKcCh0LHIpKSxufXJldHVybiByLl92YWx1ZT1lLHJ9ZnVuY3Rpb24gbmYodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtCcCh0aGlzLHQpLmRlbGF5PStlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gcmYodCxlKXtyZXR1cm4gZT0rZSxmdW5jdGlvbigpe0JwKHRoaXMsdCkuZGVsYXk9ZX19ZnVuY3Rpb24gb2YodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtIcCh0aGlzLHQpLmR1cmF0aW9uPStlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gYWYodCxlKXtyZXR1cm4gZT0rZSxmdW5jdGlvbigpe0hwKHRoaXMsdCkuZHVyYXRpb249ZX19ZnVuY3Rpb24gc2YodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7SHAodGhpcyx0KS5lYXNlPWV9fWZ1bmN0aW9uIGxmKHQsZSxuKXt2YXIgaSxyLG89KGZ1bmN0aW9uIGEodCl7cmV0dXJuKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5ldmVyeSgoZnVuY3Rpb24odCl7dmFyIGU9dC5pbmRleE9mKCIuIik7cmV0dXJuIGU+PTAmJih0PXQuc2xpY2UoMCxlKSksIXR8fCJzdGFydCI9PT10fSkpfSkoZSk/QnA6SHA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9byh0aGlzLHQpLHM9YS5vbjtzIT09aSYmKHI9KGk9cykuY29weSgpKS5vbihlLG4pLGEub249cn19dmFyIGNmPXd1LnByb3RvdHlwZS5jb25zdHJ1Y3RvcjtmdW5jdGlvbiB1Zih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX1mdW5jdGlvbiBoZih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKGkpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxlLmNhbGwodGhpcyxpKSxuKX19ZnVuY3Rpb24gZGYodCxlLG4pe3ZhciBpLHI7ZnVuY3Rpb24gbygpe3ZhciBvPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBvIT09ciYmKGk9KHI9bykmJmhmKHQsbyxuKSksaX1yZXR1cm4gby5fdmFsdWU9ZSxvfWZ1bmN0aW9uIHBmKHQpe3JldHVybiBmdW5jdGlvbihlKXt0aGlzLnRleHRDb250ZW50PXQuY2FsbCh0aGlzLGUpfX1mdW5jdGlvbiBmZih0KXt2YXIgZSxuO2Z1bmN0aW9uIGkoKXt2YXIgaT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gaSE9PW4mJihlPShuPWkpJiZwZihpKSksZX1yZXR1cm4gaS5fdmFsdWU9dCxpfXZhciBtZj0wO2Z1bmN0aW9uIGdmKHQsZSxuLGkpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9ZSx0aGlzLl9uYW1lPW4sdGhpcy5faWQ9aX1mdW5jdGlvbiBfZih0KXtyZXR1cm4gd3UoKS50cmFuc2l0aW9uKHQpfWZ1bmN0aW9uIHlmKCl7cmV0dXJuKyttZn12YXIgdmY9d3UucHJvdG90eXBlO2Z1bmN0aW9uIGJmKHQpe3JldHVybit0fWZ1bmN0aW9uIHhmKHQpe3JldHVybiB0KnR9ZnVuY3Rpb24gd2YodCl7cmV0dXJuIHQqKDItdCl9ZnVuY3Rpb24gU2YodCl7cmV0dXJuKCh0Kj0yKTw9MT90KnQ6LS10KigyLXQpKzEpLzJ9ZnVuY3Rpb24gTWYodCl7cmV0dXJuIHQqdCp0fWZ1bmN0aW9uIEVmKHQpe3JldHVybi0tdCp0KnQrMX1mdW5jdGlvbiBUZih0KXtyZXR1cm4oKHQqPTIpPD0xP3QqdCp0Oih0LT0yKSp0KnQrMikvMn1nZi5wcm90b3R5cGU9X2YucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpnZixzZWxlY3Q6ZnVuY3Rpb24gQ2YodCl7dmFyIGU9dGhpcy5fbmFtZSxuPXRoaXMuX2lkOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1iYyh0KSk7Zm9yKHZhciBpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89bmV3IEFycmF5KHIpLGE9MDthPHI7KythKWZvcih2YXIgcyxsLGM9aVthXSx1PWMubGVuZ3RoLGg9b1thXT1uZXcgQXJyYXkodSksZD0wO2Q8dTsrK2QpKHM9Y1tkXSkmJihsPXQuY2FsbChzLHMuX19kYXRhX18sZCxjKSkmJigiX19kYXRhX18iaW4gcyYmKGwuX19kYXRhX189cy5fX2RhdGFfXyksaFtkXT1sLERwKGhbZF0sZSxuLGQsaCxGcChzLG4pKSk7cmV0dXJuIG5ldyBnZihvLHRoaXMuX3BhcmVudHMsZSxuKX0sc2VsZWN0QWxsOmZ1bmN0aW9uIEFmKHQpe3ZhciBlPXRoaXMuX25hbWUsbj10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9d2ModCkpO2Zvcih2YXIgaT10aGlzLl9ncm91cHMscj1pLmxlbmd0aCxvPVtdLGE9W10scz0wO3M8cjsrK3MpZm9yKHZhciBsLGM9aVtzXSx1PWMubGVuZ3RoLGg9MDtoPHU7KytoKWlmKGw9Y1toXSl7Zm9yKHZhciBkLHA9dC5jYWxsKGwsbC5fX2RhdGFfXyxoLGMpLGY9RnAobCxuKSxtPTAsZz1wLmxlbmd0aDttPGc7KyttKShkPXBbbV0pJiZEcChkLGUsbixtLHAsZik7by5wdXNoKHApLGEucHVzaChsKX1yZXR1cm4gbmV3IGdmKG8sYSxlLG4pfSxmaWx0ZXI6ZnVuY3Rpb24ga2YodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVNjKHQpKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49ZS5sZW5ndGgsaT1uZXcgQXJyYXkobikscj0wO3I8bjsrK3IpZm9yKHZhciBvLGE9ZVtyXSxzPWEubGVuZ3RoLGw9aVtyXT1bXSxjPTA7YzxzOysrYykobz1hW2NdKSYmdC5jYWxsKG8sby5fX2RhdGFfXyxjLGEpJiZsLnB1c2gobyk7cmV0dXJuIG5ldyBnZihpLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LG1lcmdlOmZ1bmN0aW9uIExmKHQpe2lmKHQuX2lkIT09dGhpcy5faWQpdGhyb3cgbmV3IEVycm9yO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj10Ll9ncm91cHMsaT1lLmxlbmd0aCxyPU1hdGgubWluKGksbi5sZW5ndGgpLG89bmV3IEFycmF5KGkpLGE9MDthPHI7KythKWZvcih2YXIgcyxsPWVbYV0sYz1uW2FdLHU9bC5sZW5ndGgsaD1vW2FdPW5ldyBBcnJheSh1KSxkPTA7ZDx1OysrZCkocz1sW2RdfHxjW2RdKSYmKGhbZF09cyk7Zm9yKDthPGk7KythKW9bYV09ZVthXTtyZXR1cm4gbmV3IGdmKG8sdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sc2VsZWN0aW9uOmZ1bmN0aW9uIFBmKCl7cmV0dXJuIG5ldyBjZih0aGlzLl9ncm91cHMsdGhpcy5fcGFyZW50cyl9LHRyYW5zaXRpb246ZnVuY3Rpb24gTmYoKXtmb3IodmFyIHQ9dGhpcy5fbmFtZSxlPXRoaXMuX2lkLG49eWYoKSxpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89MDtvPHI7KytvKWZvcih2YXIgYSxzPWlbb10sbD1zLmxlbmd0aCxjPTA7YzxsOysrYylpZihhPXNbY10pe3ZhciB1PUZwKGEsZSk7RHAoYSx0LG4sYyxzLHt0aW1lOnUudGltZSt1LmRlbGF5K3UuZHVyYXRpb24sZGVsYXk6MCxkdXJhdGlvbjp1LmR1cmF0aW9uLGVhc2U6dS5lYXNlfSl9cmV0dXJuIG5ldyBnZihpLHRoaXMuX3BhcmVudHMsdCxuKX0sY2FsbDp2Zi5jYWxsLG5vZGVzOnZmLm5vZGVzLG5vZGU6dmYubm9kZSxzaXplOnZmLnNpemUsZW1wdHk6dmYuZW1wdHksZWFjaDp2Zi5lYWNoLG9uOmZ1bmN0aW9uIElmKHQsZSl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj9GcCh0aGlzLm5vZGUoKSxuKS5vbi5vbih0KTp0aGlzLmVhY2gobGYobix0LGUpKX0sYXR0cjpmdW5jdGlvbiBSZih0LGUpe3ZhciBuPW1jKHQpLGk9InRyYW5zZm9ybSI9PT1uP2VwOldwO3JldHVybiB0aGlzLmF0dHJUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBlPyhuLmxvY2FsP1pwOktwKShuLGksR3AodGhpcywiYXR0ci4iK3QsZSkpOm51bGw9PWU/KG4ubG9jYWw/WXA6cXApKG4pOihuLmxvY2FsPyRwOlhwKShuLGksZSkpfSxhdHRyVHdlZW46ZnVuY3Rpb24gT2YodCxlKXt2YXIgbj0iYXR0ci4iK3Q7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXJldHVybihuPXRoaXMudHdlZW4obikpJiZuLl92YWx1ZTtpZihudWxsPT1lKXJldHVybiB0aGlzLnR3ZWVuKG4sbnVsbCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO3ZhciBpPW1jKHQpO3JldHVybiB0aGlzLnR3ZWVuKG4sKGkubG9jYWw/dGY6ZWYpKGksZSkpfSxzdHlsZTpmdW5jdGlvbiB6Zih0LGUsbil7dmFyIGk9InRyYW5zZm9ybSI9PSh0Kz0iIik/UWQ6V3A7cmV0dXJuIG51bGw9PWU/dGhpcy5zdHlsZVR3ZWVuKHQsKGZ1bmN0aW9uIHIodCxlKXt2YXIgbixpLHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89SGModGhpcyx0KSxhPSh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLEhjKHRoaXMsdCkpO3JldHVybiBvPT09YT9udWxsOm89PT1uJiZhPT09aT9yOnI9ZShuPW8saT1hKX19KSh0LGkpKS5vbigiZW5kLnN0eWxlLiIrdCx1Zih0KSk6ImZ1bmN0aW9uIj09dHlwZW9mIGU/dGhpcy5zdHlsZVR3ZWVuKHQsKGZ1bmN0aW9uIGEodCxlLG4pe3ZhciBpLHIsbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1IYyh0aGlzLHQpLHM9bih0aGlzKSxsPXMrIiI7cmV0dXJuIG51bGw9PXMmJih0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLGw9cz1IYyh0aGlzLHQpKSxhPT09bD9udWxsOmE9PT1pJiZsPT09cj9vOihyPWwsbz1lKGk9YSxzKSl9fSkodCxpLEdwKHRoaXMsInN0eWxlLiIrdCxlKSkpLmVhY2goKGZ1bmN0aW9uIG8odCxlKXt2YXIgbixpLHIsbyxhPSJzdHlsZS4iK2Uscz0iZW5kLiIrYTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbD1IcCh0aGlzLHQpLGM9bC5vbix1PW51bGw9PWwudmFsdWVbYV0/b3x8KG89dWYoZSkpOnZvaWQgMDtjPT09biYmcj09PXV8fChpPShuPWMpLmNvcHkoKSkub24ocyxyPXUpLGwub249aX19KSh0aGlzLl9pZCx0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsKGZ1bmN0aW9uIHModCxlLG4pe3ZhciBpLHIsbz1uKyIiO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPUhjKHRoaXMsdCk7cmV0dXJuIGE9PT1vP251bGw6YT09PWk/cjpyPWUoaT1hLG4pfX0pKHQsaSxlKSxuKS5vbigiZW5kLnN0eWxlLiIrdCxudWxsKX0sc3R5bGVUd2VlbjpmdW5jdGlvbiBEZih0LGUsbil7dmFyIGk9InN0eWxlLiIrKHQrPSIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKGk9dGhpcy50d2VlbihpKSkmJmkuX3ZhbHVlO2lmKG51bGw9PWUpcmV0dXJuIHRoaXMudHdlZW4oaSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4oaSxkZih0LGUsbnVsbD09bj8iIjpuKSl9LHRleHQ6ZnVuY3Rpb24gQmYodCl7cmV0dXJuIHRoaXMudHdlZW4oInRleHQiLCJmdW5jdGlvbiI9PXR5cGVvZiB0PyhmdW5jdGlvbiBlKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQodGhpcyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT1lPyIiOmV9fSkoR3AodGhpcywidGV4dCIsdCkpOihmdW5jdGlvbiBuKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KShudWxsPT10PyIiOnQrIiIpKX0sdGV4dFR3ZWVuOmZ1bmN0aW9uIEhmKHQpe3ZhciBlPSJ0ZXh0IjtpZihhcmd1bWVudHMubGVuZ3RoPDEpcmV0dXJuKGU9dGhpcy50d2VlbihlKSkmJmUuX3ZhbHVlO2lmKG51bGw9PXQpcmV0dXJuIHRoaXMudHdlZW4oZSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4oZSxmZih0KSl9LHJlbW92ZTpmdW5jdGlvbiBGZigpe3JldHVybiB0aGlzLm9uKCJlbmQucmVtb3ZlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7Zm9yKHZhciBuIGluIHRoaXMuX190cmFuc2l0aW9uKWlmKCtuIT09ZSlyZXR1cm47dCYmdC5yZW1vdmVDaGlsZCh0aGlzKX19KSh0aGlzLl9pZCkpfSx0d2VlbjpmdW5jdGlvbiBWZih0LGUpe3ZhciBuPXRoaXMuX2lkO2lmKHQrPSIiLGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciBpLHI9RnAodGhpcy5ub2RlKCksbikudHdlZW4sbz0wLGE9ci5sZW5ndGg7bzxhOysrbylpZigoaT1yW29dKS5uYW1lPT09dClyZXR1cm4gaS52YWx1ZTtyZXR1cm4gbnVsbH1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1lP1VwOmpwKShuLHQsZSkpfSxkZWxheTpmdW5jdGlvbiBVZih0KXt2YXIgZT10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiB0P25mOnJmKShlLHQpKTpGcCh0aGlzLm5vZGUoKSxlKS5kZWxheX0sZHVyYXRpb246ZnVuY3Rpb24gamYodCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9vZjphZikoZSx0KSk6RnAodGhpcy5ub2RlKCksZSkuZHVyYXRpb259LGVhc2U6ZnVuY3Rpb24gR2YodCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKHNmKGUsdCkpOkZwKHRoaXMubm9kZSgpLGUpLmVhc2V9LGVuZDpmdW5jdGlvbiBXZigpe3ZhciB0LGUsbj10aGlzLGk9bi5faWQscj1uLnNpemUoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG8sYSl7dmFyIHM9e3ZhbHVlOmF9LGw9e3ZhbHVlOmZ1bmN0aW9uKCl7MD09LS1yJiZvKCl9fTtuLmVhY2goKGZ1bmN0aW9uKCl7dmFyIG49SHAodGhpcyxpKSxyPW4ub247ciE9PXQmJigoZT0odD1yKS5jb3B5KCkpLl8uY2FuY2VsLnB1c2gocyksZS5fLmludGVycnVwdC5wdXNoKHMpLGUuXy5lbmQucHVzaChsKSksbi5vbj1lfSkpfSkpfX07dmFyIHFmPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIE1hdGgucG93KHQsZSl9cmV0dXJuIGU9K2Usbi5leHBvbmVudD10LG59KSgzKSxZZj0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiAxLU1hdGgucG93KDEtdCxlKX1yZXR1cm4gZT0rZSxuLmV4cG9uZW50PXQsbn0pKDMpLFhmPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuKCh0Kj0yKTw9MT9NYXRoLnBvdyh0LGUpOjItTWF0aC5wb3coMi10LGUpKS8yfXJldHVybiBlPStlLG4uZXhwb25lbnQ9dCxufSkoMyksJGY9TWF0aC5QSSxLZj0kZi8yO2Z1bmN0aW9uIFpmKHQpe3JldHVybiAxPT0rdD8xOjEtTWF0aC5jb3ModCpLZil9ZnVuY3Rpb24gSmYodCl7cmV0dXJuIE1hdGguc2luKHQqS2YpfWZ1bmN0aW9uIFFmKHQpe3JldHVybigxLU1hdGguY29zKCRmKnQpKS8yfWZ1bmN0aW9uIHRtKHQpe3JldHVybiAxLjAwMDk3NzUxNzEwNjU0OTQqKE1hdGgucG93KDIsLTEwKnQpLS4wMDA5NzY1NjI1KX1mdW5jdGlvbiBlbSh0KXtyZXR1cm4gdG0oMS0rdCl9ZnVuY3Rpb24gbm0odCl7cmV0dXJuIDEtdG0odCl9ZnVuY3Rpb24gaW0odCl7cmV0dXJuKCh0Kj0yKTw9MT90bSgxLXQpOjItdG0odC0xKSkvMn1mdW5jdGlvbiBybSh0KXtyZXR1cm4gMS1NYXRoLnNxcnQoMS10KnQpfWZ1bmN0aW9uIG9tKHQpe3JldHVybiBNYXRoLnNxcnQoMS0gLS10KnQpfWZ1bmN0aW9uIGFtKHQpe3JldHVybigodCo9Mik8PTE/MS1NYXRoLnNxcnQoMS10KnQpOk1hdGguc3FydCgxLSh0LT0yKSp0KSsxKS8yfXZhciBzbT03LjU2MjU7ZnVuY3Rpb24gbG0odCl7cmV0dXJuIDEtY20oMS10KX1mdW5jdGlvbiBjbSh0KXtyZXR1cm4odD0rdCk8LjM2MzYzNjM2MzYzNjM2MzY1P3NtKnQqdDp0PC43MjcyNzI3MjcyNzI3MjczP3NtKih0LT0uNTQ1NDU0NTQ1NDU0NTQ1NCkqdCsuNzU6dDwuOTA5MDkwOTA5MDkwOTA5MT9zbSoodC09LjgxODE4MTgxODE4MTgxODIpKnQrLjkzNzU6c20qKHQtPS45NTQ1NDU0NTQ1NDU0NTQ2KSp0Ky45ODQzNzV9ZnVuY3Rpb24gdW0odCl7cmV0dXJuKCh0Kj0yKTw9MT8xLWNtKDEtdCk6Y20odC0xKSsxKS8yfXZhciBobT0xLjcwMTU4LGRtPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuKHQ9K3QpKnQqKGUqKHQtMSkrdCl9cmV0dXJuIGU9K2Usbi5vdmVyc2hvb3Q9dCxufSkoaG0pLHBtPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuLS10KnQqKCh0KzEpKmUrdCkrMX1yZXR1cm4gZT0rZSxuLm92ZXJzaG9vdD10LG59KShobSksZm09KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4oKHQqPTIpPDE/dCp0KigoZSsxKSp0LWUpOih0LT0yKSp0KigoZSsxKSp0K2UpKzIpLzJ9cmV0dXJuIGU9K2Usbi5vdmVyc2hvb3Q9dCxufSkoaG0pLG1tPTIqTWF0aC5QSSxnbT0oZnVuY3Rpb24gdChlLG4pe3ZhciBpPU1hdGguYXNpbigxLyhlPU1hdGgubWF4KDEsZSkpKSoobi89bW0pO2Z1bmN0aW9uIHIodCl7cmV0dXJuIGUqdG0oLSAtLXQpKk1hdGguc2luKChpLXQpL24pfXJldHVybiByLmFtcGxpdHVkZT1mdW5jdGlvbihlKXtyZXR1cm4gdChlLG4qbW0pfSxyLnBlcmlvZD1mdW5jdGlvbihuKXtyZXR1cm4gdChlLG4pfSxyfSkoMSwuMyksX209KGZ1bmN0aW9uIHQoZSxuKXt2YXIgaT1NYXRoLmFzaW4oMS8oZT1NYXRoLm1heCgxLGUpKSkqKG4vPW1tKTtmdW5jdGlvbiByKHQpe3JldHVybiAxLWUqdG0odD0rdCkqTWF0aC5zaW4oKHQraSkvbil9cmV0dXJuIHIuYW1wbGl0dWRlPWZ1bmN0aW9uKGUpe3JldHVybiB0KGUsbiptbSl9LHIucGVyaW9kPWZ1bmN0aW9uKG4pe3JldHVybiB0KGUsbil9LHJ9KSgxLC4zKSx5bT0oZnVuY3Rpb24gdChlLG4pe3ZhciBpPU1hdGguYXNpbigxLyhlPU1hdGgubWF4KDEsZSkpKSoobi89bW0pO2Z1bmN0aW9uIHIodCl7cmV0dXJuKCh0PTIqdC0xKTwwP2UqdG0oLXQpKk1hdGguc2luKChpLXQpL24pOjItZSp0bSh0KSpNYXRoLnNpbigoaSt0KS9uKSkvMn1yZXR1cm4gci5hbXBsaXR1ZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSxuKm1tKX0sci5wZXJpb2Q9ZnVuY3Rpb24obil7cmV0dXJuIHQoZSxuKX0scn0pKDEsLjMpLHZtPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGVhc2VMaW5lYXI6YmYsZWFzZVF1YWQ6U2YsZWFzZVF1YWRJbjp4ZixlYXNlUXVhZE91dDp3ZixlYXNlUXVhZEluT3V0OlNmLGVhc2VDdWJpYzpUZixlYXNlQ3ViaWNJbjpNZixlYXNlQ3ViaWNPdXQ6RWYsZWFzZUN1YmljSW5PdXQ6VGYsZWFzZVBvbHk6WGYsZWFzZVBvbHlJbjpxZixlYXNlUG9seU91dDpZZixlYXNlUG9seUluT3V0OlhmLGVhc2VTaW46UWYsZWFzZVNpbkluOlpmLGVhc2VTaW5PdXQ6SmYsZWFzZVNpbkluT3V0OlFmLGVhc2VFeHA6aW0sZWFzZUV4cEluOmVtLGVhc2VFeHBPdXQ6bm0sZWFzZUV4cEluT3V0OmltLGVhc2VDaXJjbGU6YW0sZWFzZUNpcmNsZUluOnJtLGVhc2VDaXJjbGVPdXQ6b20sZWFzZUNpcmNsZUluT3V0OmFtLGVhc2VCb3VuY2U6Y20sZWFzZUJvdW5jZUluOmxtLGVhc2VCb3VuY2VPdXQ6Y20sZWFzZUJvdW5jZUluT3V0OnVtLGVhc2VCYWNrOmZtLGVhc2VCYWNrSW46ZG0sZWFzZUJhY2tPdXQ6cG0sZWFzZUJhY2tJbk91dDpmbSxlYXNlRWxhc3RpYzpfbSxlYXNlRWxhc3RpY0luOmdtLGVhc2VFbGFzdGljT3V0Ol9tLGVhc2VFbGFzdGljSW5PdXQ6eW19KSxibT17dGltZTpudWxsLGRlbGF5OjAsZHVyYXRpb246MjUwLGVhc2U6VGZ9O2Z1bmN0aW9uIHhtKHQsZSl7Zm9yKHZhciBuOyEobj10Ll9fdHJhbnNpdGlvbil8fCEobj1uW2VdKTspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuIGJtLnRpbWU9VHAoKSxibTtyZXR1cm4gbn13dS5wcm90b3R5cGUuaW50ZXJydXB0PWZ1bmN0aW9uIHdtKHQpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7VnAodGhpcyx0KX0pKX0sd3UucHJvdG90eXBlLnRyYW5zaXRpb249ZnVuY3Rpb24gU20odCl7dmFyIGUsbjt0IGluc3RhbmNlb2YgZ2Y/KGU9dC5faWQsdD10Ll9uYW1lKTooZT15ZigpLChuPWJtKS50aW1lPVRwKCksdD1udWxsPT10P251bGw6dCsiIik7Zm9yKHZhciBpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89MDtvPHI7KytvKWZvcih2YXIgYSxzPWlbb10sbD1zLmxlbmd0aCxjPTA7YzxsOysrYykoYT1zW2NdKSYmRHAoYSx0LGUsYyxzLG58fHhtKGEsZSkpO3JldHVybiBuZXcgZ2YoaSx0aGlzLl9wYXJlbnRzLHQsZSl9O3ZhciBNbT1bbnVsbF07ZnVuY3Rpb24gRW0odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIFRtKHQsZSxuKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1lLHRoaXMuc2VsZWN0aW9uPW59ZnVuY3Rpb24gQ20oKXt1dS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBBbSgpe3V1LnByZXZlbnREZWZhdWx0KCksdXUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9dmFyIGttPXtuYW1lOiJkcmFnIn0sTG09e25hbWU6InNwYWNlIn0sUG09e25hbWU6ImhhbmRsZSJ9LE5tPXtuYW1lOiJjZW50ZXIifTtmdW5jdGlvbiBJbSh0KXtyZXR1cm5bK3RbMF0sK3RbMV1dfWZ1bmN0aW9uIFJtKHQpe3JldHVybltJbSh0WzBdKSxJbSh0WzFdKV19ZnVuY3Rpb24gT20odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBsaChlLHV1LnRvdWNoZXMsdCl9fXZhciB6bT17bmFtZToieCIsaGFuZGxlczpbInciLCJlIl0ubWFwKEdtKSxpbnB1dDpmdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P251bGw6W1srdFswXSxlWzBdWzFdXSxbK3RbMV0sZVsxXVsxXV1dfSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlt0WzBdWzBdLHRbMV1bMF1dfX0sRG09e25hbWU6InkiLGhhbmRsZXM6WyJuIiwicyJdLm1hcChHbSksaW5wdXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD9udWxsOltbZVswXVswXSwrdFswXV0sW2VbMV1bMF0sK3RbMV1dXX0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZbdFswXVsxXSx0WzFdWzFdXX19LEJtPXtuYW1lOiJ4eSIsaGFuZGxlczpbIm4iLCJ3IiwiZSIsInMiLCJudyIsIm5lIiwic3ciLCJzZSJdLm1hcChHbSksaW5wdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/bnVsbDpSbSh0KX0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0fX0sSG09e292ZXJsYXk6ImNyb3NzaGFpciIsc2VsZWN0aW9uOiJtb3ZlIixuOiJucy1yZXNpemUiLGU6ImV3LXJlc2l6ZSIsczoibnMtcmVzaXplIix3OiJldy1yZXNpemUiLG53OiJud3NlLXJlc2l6ZSIsbmU6Im5lc3ctcmVzaXplIixzZToibndzZS1yZXNpemUiLHN3OiJuZXN3LXJlc2l6ZSJ9LEZtPXtlOiJ3Iix3OiJlIixudzoibmUiLG5lOiJudyIsc2U6InN3Iixzdzoic2UifSxWbT17bjoicyIsczoibiIsbnc6InN3IixuZToic2UiLHNlOiJuZSIsc3c6Im53In0sVW09e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOm51bGwsZToxLHM6bnVsbCx3Oi0xLG53Oi0xLG5lOjEsc2U6MSxzdzotMX0sam09e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOi0xLGU6bnVsbCxzOjEsdzpudWxsLG53Oi0xLG5lOi0xLHNlOjEsc3c6MX07ZnVuY3Rpb24gR20odCl7cmV0dXJue3R5cGU6dH19ZnVuY3Rpb24gV20oKXtyZXR1cm4hdXUuY3RybEtleSYmIXV1LmJ1dHRvbn1mdW5jdGlvbiBxbSgpe3ZhciB0PXRoaXMub3duZXJTVkdFbGVtZW50fHx0aGlzO3JldHVybiB0Lmhhc0F0dHJpYnV0ZSgidmlld0JveCIpP1tbKHQ9dC52aWV3Qm94LmJhc2VWYWwpLngsdC55XSxbdC54K3Qud2lkdGgsdC55K3QuaGVpZ2h0XV06W1swLDBdLFt0LndpZHRoLmJhc2VWYWwudmFsdWUsdC5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dfWZ1bmN0aW9uIFltKCl7cmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50c3x8Im9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIFhtKHQpe2Zvcig7IXQuX19icnVzaDspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuO3JldHVybiB0Ll9fYnJ1c2h9ZnVuY3Rpb24gJG0odCl7cmV0dXJuIHRbMF1bMF09PT10WzFdWzBdfHx0WzBdWzFdPT09dFsxXVsxXX1mdW5jdGlvbiBLbSh0KXt2YXIgZT10Ll9fYnJ1c2g7cmV0dXJuIGU/ZS5kaW0ub3V0cHV0KGUuc2VsZWN0aW9uKTpudWxsfWZ1bmN0aW9uIFptKCl7cmV0dXJuIFFtKERtKX1mdW5jdGlvbiBKbSgpe3JldHVybiBRbShCbSl9ZnVuY3Rpb24gUW0odCl7dmFyIGUsbj1xbSxpPVdtLHI9WW0sbz0hMCxhPWxjKCJzdGFydCIsImJydXNoIiwiZW5kIikscz02O2Z1bmN0aW9uIGwoZSl7dmFyIG49ZS5wcm9wZXJ0eSgiX19icnVzaCIsbSkuc2VsZWN0QWxsKCIub3ZlcmxheSIpLmRhdGEoW0dtKCJvdmVybGF5IildKTtuLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJvdmVybGF5IikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5hdHRyKCJjdXJzb3IiLEhtLm92ZXJsYXkpLm1lcmdlKG4pLmVhY2goKGZ1bmN0aW9uKCl7dmFyIHQ9WG0odGhpcykuZXh0ZW50O1N1KHRoaXMpLmF0dHIoIngiLHRbMF1bMF0pLmF0dHIoInkiLHRbMF1bMV0pLmF0dHIoIndpZHRoIix0WzFdWzBdLXRbMF1bMF0pLmF0dHIoImhlaWdodCIsdFsxXVsxXS10WzBdWzFdKX0pKSxlLnNlbGVjdEFsbCgiLnNlbGVjdGlvbiIpLmRhdGEoW0dtKCJzZWxlY3Rpb24iKV0pLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJzZWxlY3Rpb24iKS5hdHRyKCJjdXJzb3IiLEhtLnNlbGVjdGlvbikuYXR0cigiZmlsbCIsIiM3NzciKS5hdHRyKCJmaWxsLW9wYWNpdHkiLC4zKS5hdHRyKCJzdHJva2UiLCIjZmZmIikuYXR0cigic2hhcGUtcmVuZGVyaW5nIiwiY3Jpc3BFZGdlcyIpO3ZhciBpPWUuc2VsZWN0QWxsKCIuaGFuZGxlIikuZGF0YSh0LmhhbmRsZXMsKGZ1bmN0aW9uKHQpe3JldHVybiB0LnR5cGV9KSk7aS5leGl0KCkucmVtb3ZlKCksaS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwoZnVuY3Rpb24odCl7cmV0dXJuImhhbmRsZSBoYW5kbGUtLSIrdC50eXBlfSkpLmF0dHIoImN1cnNvciIsKGZ1bmN0aW9uKHQpe3JldHVybiBIbVt0LnR5cGVdfSkpLGUuZWFjaChjKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIikub24oIm1vdXNlZG93bi5icnVzaCIsZCkuZmlsdGVyKHIpLm9uKCJ0b3VjaHN0YXJ0LmJydXNoIixkKS5vbigidG91Y2htb3ZlLmJydXNoIixwKS5vbigidG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLGYpLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCJub25lIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKX1mdW5jdGlvbiBjKCl7dmFyIHQ9U3UodGhpcyksZT1YbSh0aGlzKS5zZWxlY3Rpb247ZT8odC5zZWxlY3RBbGwoIi5zZWxlY3Rpb24iKS5zdHlsZSgiZGlzcGxheSIsbnVsbCkuYXR0cigieCIsZVswXVswXSkuYXR0cigieSIsZVswXVsxXSkuYXR0cigid2lkdGgiLGVbMV1bMF0tZVswXVswXSkuYXR0cigiaGVpZ2h0IixlWzFdWzFdLWVbMF1bMV0pLHQuc2VsZWN0QWxsKCIuaGFuZGxlIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLChmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGVbdC50eXBlLmxlbmd0aC0xXT9lWzFdWzBdLXMvMjplWzBdWzBdLXMvMn0pKS5hdHRyKCJ5IiwoZnVuY3Rpb24odCl7cmV0dXJuInMiPT09dC50eXBlWzBdP2VbMV1bMV0tcy8yOmVbMF1bMV0tcy8yfSkpLmF0dHIoIndpZHRoIiwoZnVuY3Rpb24odCl7cmV0dXJuIm4iPT09dC50eXBlfHwicyI9PT10LnR5cGU/ZVsxXVswXS1lWzBdWzBdK3M6c30pKS5hdHRyKCJoZWlnaHQiLChmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGV8fCJ3Ij09PXQudHlwZT9lWzFdWzFdLWVbMF1bMV0rczpzfSkpKTp0LnNlbGVjdEFsbCgiLnNlbGVjdGlvbiwuaGFuZGxlIikuc3R5bGUoImRpc3BsYXkiLCJub25lIikuYXR0cigieCIsbnVsbCkuYXR0cigieSIsbnVsbCkuYXR0cigid2lkdGgiLG51bGwpLmF0dHIoImhlaWdodCIsbnVsbCl9ZnVuY3Rpb24gdSh0LGUsbil7dmFyIGk9dC5fX2JydXNoLmVtaXR0ZXI7cmV0dXJuIWl8fG4mJmkuY2xlYW4/bmV3IGgodCxlLG4pOml9ZnVuY3Rpb24gaCh0LGUsbil7dGhpcy50aGF0PXQsdGhpcy5hcmdzPWUsdGhpcy5zdGF0ZT10Ll9fYnJ1c2gsdGhpcy5hY3RpdmU9MCx0aGlzLmNsZWFuPW59ZnVuY3Rpb24gZCgpe2lmKCghZXx8dXUudG91Y2hlcykmJmkuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbixyLGEscyxsLGgsZCxwLGYsbSxnLF89dGhpcyx5PXV1LnRhcmdldC5fX2RhdGFfXy50eXBlLHY9InNlbGVjdGlvbiI9PT0obyYmdXUubWV0YUtleT95PSJvdmVybGF5Ijp5KT9rbTpvJiZ1dS5hbHRLZXk/Tm06UG0sYj10PT09RG0/bnVsbDpVbVt5XSx4PXQ9PT16bT9udWxsOmptW3ldLHc9WG0oXyksUz13LmV4dGVudCxNPXcuc2VsZWN0aW9uLEU9U1swXVswXSxUPVNbMF1bMV0sQz1TWzFdWzBdLEE9U1sxXVsxXSxrPTAsTD0wLFA9YiYmeCYmbyYmdXUuc2hpZnRLZXksTj11dS50b3VjaGVzP09tKHV1LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXIpOmFoLEk9TihfKSxSPUksTz11KF8sYXJndW1lbnRzLCEwKS5iZWZvcmVzdGFydCgpOyJvdmVybGF5Ij09PXk/KE0mJihmPSEwKSx3LnNlbGVjdGlvbj1NPVtbbj10PT09RG0/RTpJWzBdLGE9dD09PXptP1Q6SVsxXV0sW2w9dD09PURtP0M6bixkPXQ9PT16bT9BOmFdXSk6KG49TVswXVswXSxhPU1bMF1bMV0sbD1NWzFdWzBdLGQ9TVsxXVsxXSkscj1uLHM9YSxoPWwscD1kO3ZhciB6PVN1KF8pLmF0dHIoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpLEQ9ei5zZWxlY3RBbGwoIi5vdmVybGF5IikuYXR0cigiY3Vyc29yIixIbVt5XSk7aWYodXUudG91Y2hlcylPLm1vdmVkPUgsTy5lbmRlZD1WO2Vsc2V7dmFyIEI9U3UodXUudmlldykub24oIm1vdXNlbW92ZS5icnVzaCIsSCwhMCkub24oIm1vdXNldXAuYnJ1c2giLFYsITApO28mJkIub24oImtleWRvd24uYnJ1c2giLFUsITApLm9uKCJrZXl1cC5icnVzaCIsaiwhMCksaGgodXUudmlldyl9Q20oKSxWcChfKSxjLmNhbGwoXyksTy5zdGFydCgpfWZ1bmN0aW9uIEgoKXt2YXIgdD1OKF8pOyFQfHxtfHxnfHwoTWF0aC5hYnModFswXS1SWzBdKT5NYXRoLmFicyh0WzFdLVJbMV0pP2c9ITA6bT0hMCksUj10LGY9ITAsQW0oKSxGKCl9ZnVuY3Rpb24gRigpe3ZhciB0O3N3aXRjaChrPVJbMF0tSVswXSxMPVJbMV0tSVsxXSx2KXtjYXNlIExtOmNhc2Uga206YiYmKGs9TWF0aC5tYXgoRS1uLE1hdGgubWluKEMtbCxrKSkscj1uK2ssaD1sK2spLHgmJihMPU1hdGgubWF4KFQtYSxNYXRoLm1pbihBLWQsTCkpLHM9YStMLHA9ZCtMKTticmVhaztjYXNlIFBtOmI8MD8oaz1NYXRoLm1heChFLW4sTWF0aC5taW4oQy1uLGspKSxyPW4rayxoPWwpOmI+MCYmKGs9TWF0aC5tYXgoRS1sLE1hdGgubWluKEMtbCxrKSkscj1uLGg9bCtrKSx4PDA/KEw9TWF0aC5tYXgoVC1hLE1hdGgubWluKEEtYSxMKSkscz1hK0wscD1kKTp4PjAmJihMPU1hdGgubWF4KFQtZCxNYXRoLm1pbihBLWQsTCkpLHM9YSxwPWQrTCk7YnJlYWs7Y2FzZSBObTpiJiYocj1NYXRoLm1heChFLE1hdGgubWluKEMsbi1rKmIpKSxoPU1hdGgubWF4KEUsTWF0aC5taW4oQyxsK2sqYikpKSx4JiYocz1NYXRoLm1heChULE1hdGgubWluKEEsYS1MKngpKSxwPU1hdGgubWF4KFQsTWF0aC5taW4oQSxkK0wqeCkpKX1oPHImJihiKj0tMSx0PW4sbj1sLGw9dCx0PXIscj1oLGg9dCx5IGluIEZtJiZELmF0dHIoImN1cnNvciIsSG1beT1GbVt5XV0pKSxwPHMmJih4Kj0tMSx0PWEsYT1kLGQ9dCx0PXMscz1wLHA9dCx5IGluIFZtJiZELmF0dHIoImN1cnNvciIsSG1beT1WbVt5XV0pKSx3LnNlbGVjdGlvbiYmKE09dy5zZWxlY3Rpb24pLG0mJihyPU1bMF1bMF0saD1NWzFdWzBdKSxnJiYocz1NWzBdWzFdLHA9TVsxXVsxXSksTVswXVswXT09PXImJk1bMF1bMV09PT1zJiZNWzFdWzBdPT09aCYmTVsxXVsxXT09PXB8fCh3LnNlbGVjdGlvbj1bW3Isc10sW2gscF1dLGMuY2FsbChfKSxPLmJydXNoKCkpfWZ1bmN0aW9uIFYoKXtpZihDbSgpLHV1LnRvdWNoZXMpe2lmKHV1LnRvdWNoZXMubGVuZ3RoKXJldHVybjtlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2U9bnVsbH0pLDUwMCl9ZWxzZSBkaCh1dS52aWV3LGYpLEIub24oImtleWRvd24uYnJ1c2gga2V5dXAuYnJ1c2ggbW91c2Vtb3ZlLmJydXNoIG1vdXNldXAuYnJ1c2giLG51bGwpO3ouYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKSxELmF0dHIoImN1cnNvciIsSG0ub3ZlcmxheSksdy5zZWxlY3Rpb24mJihNPXcuc2VsZWN0aW9uKSwkbShNKSYmKHcuc2VsZWN0aW9uPW51bGwsYy5jYWxsKF8pKSxPLmVuZCgpfWZ1bmN0aW9uIFUoKXtzd2l0Y2godXUua2V5Q29kZSl7Y2FzZSAxNjpQPWImJng7YnJlYWs7Y2FzZSAxODp2PT09UG0mJihiJiYobD1oLWsqYixuPXIraypiKSx4JiYoZD1wLUwqeCxhPXMrTCp4KSx2PU5tLEYoKSk7YnJlYWs7Y2FzZSAzMjp2IT09UG0mJnYhPT1ObXx8KGI8MD9sPWgtazpiPjAmJihuPXItaykseDwwP2Q9cC1MOng+MCYmKGE9cy1MKSx2PUxtLEQuYXR0cigiY3Vyc29yIixIbS5zZWxlY3Rpb24pLEYoKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59QW0oKX1mdW5jdGlvbiBqKCl7c3dpdGNoKHV1LmtleUNvZGUpe2Nhc2UgMTY6UCYmKG09Zz1QPSExLEYoKSk7YnJlYWs7Y2FzZSAxODp2PT09Tm0mJihiPDA/bD1oOmI+MCYmKG49cikseDwwP2Q9cDp4PjAmJihhPXMpLHY9UG0sRigpKTticmVhaztjYXNlIDMyOnY9PT1MbSYmKHV1LmFsdEtleT8oYiYmKGw9aC1rKmIsbj1yK2sqYikseCYmKGQ9cC1MKngsYT1zK0wqeCksdj1ObSk6KGI8MD9sPWg6Yj4wJiYobj1yKSx4PDA/ZD1wOng+MCYmKGE9cyksdj1QbSksRC5hdHRyKCJjdXJzb3IiLEhtW3ldKSxGKCkpO2JyZWFrO2RlZmF1bHQ6cmV0dXJufUFtKCl9fWZ1bmN0aW9uIHAoKXt1KHRoaXMsYXJndW1lbnRzKS5tb3ZlZCgpfWZ1bmN0aW9uIGYoKXt1KHRoaXMsYXJndW1lbnRzKS5lbmRlZCgpfWZ1bmN0aW9uIG0oKXt2YXIgZT10aGlzLl9fYnJ1c2h8fHtzZWxlY3Rpb246bnVsbH07cmV0dXJuIGUuZXh0ZW50PVJtKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxlLmRpbT10LGV9cmV0dXJuIGwubW92ZT1mdW5jdGlvbihlLG4pe2Uuc2VsZWN0aW9uP2Uub24oInN0YXJ0LmJydXNoIiwoZnVuY3Rpb24oKXt1KHRoaXMsYXJndW1lbnRzKS5iZWZvcmVzdGFydCgpLnN0YXJ0KCl9KSkub24oImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2giLChmdW5jdGlvbigpe3UodGhpcyxhcmd1bWVudHMpLmVuZCgpfSkpLnR3ZWVuKCJicnVzaCIsKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxpPWUuX19icnVzaCxyPXUoZSxhcmd1bWVudHMpLG89aS5zZWxlY3Rpb24sYT10LmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm4saS5leHRlbnQpLHM9amQobyxhKTtmdW5jdGlvbiBsKHQpe2kuc2VsZWN0aW9uPTE9PT10JiZudWxsPT09YT9udWxsOnModCksYy5jYWxsKGUpLHIuYnJ1c2goKX1yZXR1cm4gbnVsbCE9PW8mJm51bGwhPT1hP2w6bCgxKX0pKTplLmVhY2goKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxpPWFyZ3VtZW50cyxyPWUuX19icnVzaCxvPXQuaW5wdXQoImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseShlLGkpOm4sci5leHRlbnQpLGE9dShlLGkpLmJlZm9yZXN0YXJ0KCk7VnAoZSksci5zZWxlY3Rpb249bnVsbD09PW8/bnVsbDpvLGMuY2FsbChlKSxhLnN0YXJ0KCkuYnJ1c2goKS5lbmQoKX0pKX0sbC5jbGVhcj1mdW5jdGlvbih0KXtsLm1vdmUodCxudWxsKX0saC5wcm90b3R5cGU9e2JlZm9yZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLnN0YXRlLmVtaXR0ZXI9dGhpcyx0aGlzLnN0YXJ0aW5nPSEwKSx0aGlzfSxzdGFydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0aW5nPyh0aGlzLnN0YXJ0aW5nPSExLHRoaXMuZW1pdCgic3RhcnQiKSk6dGhpcy5lbWl0KCJicnVzaCIpLHRoaXN9LGJydXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW1pdCgiYnJ1c2giKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09LS10aGlzLmFjdGl2ZSYmKGRlbGV0ZSB0aGlzLnN0YXRlLmVtaXR0ZXIsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbihlKXtndShuZXcgVG0obCxlLHQub3V0cHV0KHRoaXMuc3RhdGUuc2VsZWN0aW9uKSksYS5hcHBseSxhLFtlLHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LGwuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RW0oUm0odCkpLGwpOm59LGwuZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RW0oISF0KSxsKTppfSxsLnRvdWNoYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkVtKCEhdCksbCk6cn0sbC5oYW5kbGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0LGwpOnN9LGwua2V5TW9kaWZpZXJzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSEhdCxsKTpvfSxsLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9YS5vbi5hcHBseShhLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1hP2w6dH0sbH12YXIgdGc9TWF0aC5jb3MsZWc9TWF0aC5zaW4sbmc9TWF0aC5QSSxpZz1uZy8yLHJnPTIqbmcsb2c9TWF0aC5tYXg7ZnVuY3Rpb24gYWcodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQoZS5zb3VyY2UudmFsdWUrZS50YXJnZXQudmFsdWUsbi5zb3VyY2UudmFsdWUrbi50YXJnZXQudmFsdWUpfX12YXIgc2c9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIGxnKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX12YXIgY2c9TWF0aC5QSSx1Zz0yKmNnLGhnPTFlLTYsZGc9dWctaGc7ZnVuY3Rpb24gcGcoKXt0aGlzLl94MD10aGlzLl95MD10aGlzLl94MT10aGlzLl95MT1udWxsLHRoaXMuXz0iIn1mdW5jdGlvbiBmZygpe3JldHVybiBuZXcgcGd9ZnVuY3Rpb24gbWcodCl7cmV0dXJuIHQuc291cmNlfWZ1bmN0aW9uIGdnKHQpe3JldHVybiB0LnRhcmdldH1mdW5jdGlvbiBfZyh0KXtyZXR1cm4gdC5yYWRpdXN9ZnVuY3Rpb24geWcodCl7cmV0dXJuIHQuc3RhcnRBbmdsZX1mdW5jdGlvbiB2Zyh0KXtyZXR1cm4gdC5lbmRBbmdsZX1wZy5wcm90b3R5cGU9ZmcucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpwZyxtb3ZlVG86ZnVuY3Rpb24odCxlKXt0aGlzLl8rPSJNIisodGhpcy5feDA9dGhpcy5feDE9K3QpKyIsIisodGhpcy5feTA9dGhpcy5feTE9K2UpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5feDEmJih0aGlzLl94MT10aGlzLl94MCx0aGlzLl95MT10aGlzLl95MCx0aGlzLl8rPSJaIil9LGxpbmVUbzpmdW5jdGlvbih0LGUpe3RoaXMuXys9IkwiKyh0aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MT0rZSl9LHF1YWRyYXRpY0N1cnZlVG86ZnVuY3Rpb24odCxlLG4saSl7dGhpcy5fKz0iUSIrICt0KyIsIisgK2UrIiwiKyh0aGlzLl94MT0rbikrIiwiKyh0aGlzLl95MT0raSl9LGJlemllckN1cnZlVG86ZnVuY3Rpb24odCxlLG4saSxyLG8pe3RoaXMuXys9IkMiKyArdCsiLCIrICtlKyIsIisgK24rIiwiKyAraSsiLCIrKHRoaXMuX3gxPStyKSsiLCIrKHRoaXMuX3kxPStvKX0sYXJjVG86ZnVuY3Rpb24odCxlLG4saSxyKXt2YXIgbz10aGlzLl94MSxhPXRoaXMuX3kxLHM9KG49K24pLSh0PSt0KSxsPShpPStpKS0oZT0rZSksYz1vLXQsdT1hLWUsaD1jKmMrdSp1O2lmKChyPStyKTwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiK3IpO2lmKG51bGw9PT10aGlzLl94MSl0aGlzLl8rPSJNIisodGhpcy5feDE9dCkrIiwiKyh0aGlzLl95MT1lKTtlbHNlIGlmKGg+aGcpaWYoTWF0aC5hYnModSpzLWwqYyk+aGcmJnIpe3ZhciBkPW4tbyxwPWktYSxmPXMqcytsKmwsbT1kKmQrcCpwLGc9TWF0aC5zcXJ0KGYpLF89TWF0aC5zcXJ0KGgpLHk9cipNYXRoLnRhbigoY2ctTWF0aC5hY29zKChmK2gtbSkvKDIqZypfKSkpLzIpLHY9eS9fLGI9eS9nO01hdGguYWJzKHYtMSk+aGcmJih0aGlzLl8rPSJMIisodCt2KmMpKyIsIisoZSt2KnUpKSx0aGlzLl8rPSJBIityKyIsIityKyIsMCwwLCIrICsodSpkPmMqcCkrIiwiKyh0aGlzLl94MT10K2IqcykrIiwiKyh0aGlzLl95MT1lK2IqbCl9ZWxzZSB0aGlzLl8rPSJMIisodGhpcy5feDE9dCkrIiwiKyh0aGlzLl95MT1lKX0sYXJjOmZ1bmN0aW9uKHQsZSxuLGkscixvKXt0PSt0LGU9K2Usbz0hIW87dmFyIGE9KG49K24pKk1hdGguY29zKGkpLHM9bipNYXRoLnNpbihpKSxsPXQrYSxjPWUrcyx1PTFebyxoPW8/aS1yOnItaTtpZihuPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIrbik7bnVsbD09PXRoaXMuX3gxP3RoaXMuXys9Ik0iK2wrIiwiK2M6KE1hdGguYWJzKHRoaXMuX3gxLWwpPmhnfHxNYXRoLmFicyh0aGlzLl95MS1jKT5oZykmJih0aGlzLl8rPSJMIitsKyIsIitjKSxuJiYoaDwwJiYoaD1oJXVnK3VnKSxoPmRnP3RoaXMuXys9IkEiK24rIiwiK24rIiwwLDEsIit1KyIsIisodC1hKSsiLCIrKGUtcykrIkEiK24rIiwiK24rIiwwLDEsIit1KyIsIisodGhpcy5feDE9bCkrIiwiKyh0aGlzLl95MT1jKTpoPmhnJiYodGhpcy5fKz0iQSIrbisiLCIrbisiLDAsIisgKyhoPj1jZykrIiwiK3UrIiwiKyh0aGlzLl94MT10K24qTWF0aC5jb3MocikpKyIsIisodGhpcy5feTE9ZStuKk1hdGguc2luKHIpKSkpfSxyZWN0OmZ1bmN0aW9uKHQsZSxuLGkpe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rZSkrImgiKyArbisidiIrICtpKyJoIistbisiWiJ9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX319O3ZhciBiZz0iJCI7ZnVuY3Rpb24geGcoKXt9ZnVuY3Rpb24gd2codCxlKXt2YXIgbj1uZXcgeGc7aWYodCBpbnN0YW5jZW9mIHhnKXQuZWFjaCgoZnVuY3Rpb24odCxlKXtuLnNldChlLHQpfSkpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSl7dmFyIGkscj0tMSxvPXQubGVuZ3RoO2lmKG51bGw9PWUpZm9yKDsrK3I8bzspbi5zZXQocix0W3JdKTtlbHNlIGZvcig7KytyPG87KW4uc2V0KGUoaT10W3JdLHIsdCksaSl9ZWxzZSBpZih0KWZvcih2YXIgYSBpbiB0KW4uc2V0KGEsdFthXSk7cmV0dXJuIG59ZnVuY3Rpb24gU2coKXtyZXR1cm57fX1mdW5jdGlvbiBNZyh0LGUsbil7dFtlXT1ufWZ1bmN0aW9uIEVnKCl7cmV0dXJuIHdnKCl9ZnVuY3Rpb24gVGcodCxlLG4pe3Quc2V0KGUsbil9ZnVuY3Rpb24gQ2coKXt9eGcucHJvdG90eXBlPXdnLnByb3RvdHlwZT17Y29uc3RydWN0b3I6eGcsaGFzOmZ1bmN0aW9uKHQpe3JldHVybiBiZyt0IGluIHRoaXN9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpc1tiZyt0XX0sc2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXNbYmcrdF09ZSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9YmcrdDtyZXR1cm4gZSBpbiB0aGlzJiZkZWxldGUgdGhpc1tlXX0sY2xlYXI6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcyl0WzBdPT09YmcmJmRlbGV0ZSB0aGlzW3RdfSxrZXlzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PWJnJiZ0LnB1c2goZS5zbGljZSgxKSk7cmV0dXJuIHR9LHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT1iZyYmdC5wdXNoKHRoaXNbZV0pO3JldHVybiB0fSxlbnRyaWVzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PWJnJiZ0LnB1c2goe2tleTplLnNsaWNlKDEpLHZhbHVlOnRoaXNbZV19KTtyZXR1cm4gdH0sc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTA7Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PWJnJiYrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpaWYodFswXT09PWJnKXJldHVybiExO3JldHVybiEwfSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT1iZyYmdCh0aGlzW2VdLGUuc2xpY2UoMSksdGhpcyl9fTt2YXIgQWc9d2cucHJvdG90eXBlO2Z1bmN0aW9uIGtnKHQsZSl7dmFyIG49bmV3IENnO2lmKHQgaW5zdGFuY2VvZiBDZyl0LmVhY2goKGZ1bmN0aW9uKHQpe24uYWRkKHQpfSkpO2Vsc2UgaWYodCl7dmFyIGk9LTEscj10Lmxlbmd0aDtpZihudWxsPT1lKWZvcig7KytpPHI7KW4uYWRkKHRbaV0pO2Vsc2UgZm9yKDsrK2k8cjspbi5hZGQoZSh0W2ldLGksdCkpfXJldHVybiBufWZ1bmN0aW9uIExnKHQpe3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KWUucHVzaChuKTtyZXR1cm4gZX1DZy5wcm90b3R5cGU9a2cucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpDZyxoYXM6QWcuaGFzLGFkZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpc1tiZysodCs9IiIpXT10LHRoaXN9LHJlbW92ZTpBZy5yZW1vdmUsY2xlYXI6QWcuY2xlYXIsdmFsdWVzOkFnLmtleXMsc2l6ZTpBZy5zaXplLGVtcHR5OkFnLmVtcHR5LGVhY2g6QWcuZWFjaH07dmFyIFBnPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBOZyh0LGUpe3JldHVybiB0LWV9ZnVuY3Rpb24gSWcodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIFJnKHQsZSl7Zm9yKHZhciBuLGk9LTEscj1lLmxlbmd0aDsrK2k8cjspaWYobj1PZyh0LGVbaV0pKXJldHVybiBuO3JldHVybiAwfWZ1bmN0aW9uIE9nKHQsZSl7Zm9yKHZhciBuPWVbMF0saT1lWzFdLHI9LTEsbz0wLGE9dC5sZW5ndGgscz1hLTE7bzxhO3M9bysrKXt2YXIgbD10W29dLGM9bFswXSx1PWxbMV0saD10W3NdLGQ9aFswXSxwPWhbMV07aWYoemcobCxoLGUpKXJldHVybiAwO3U+aSE9cD5pJiZuPChkLWMpKihpLXUpLyhwLXUpK2MmJihyPS1yKX1yZXR1cm4gcn1mdW5jdGlvbiB6Zyh0LGUsbil7dmFyIGk7cmV0dXJuKGZ1bmN0aW9uIHIodCxlLG4pe3JldHVybihlWzBdLXRbMF0pKihuWzFdLXRbMV0pPT0oblswXS10WzBdKSooZVsxXS10WzFdKX0pKHQsZSxuKSYmKGZ1bmN0aW9uIG8odCxlLG4pe3JldHVybiB0PD1lJiZlPD1ufHxuPD1lJiZlPD10fSkodFtpPSsodFswXT09PWVbMF0pXSxuW2ldLGVbaV0pfWZ1bmN0aW9uIERnKCl7fXZhciBCZz1bW10sW1tbMSwxLjVdLFsuNSwxXV1dLFtbWzEuNSwxXSxbMSwxLjVdXV0sW1tbMS41LDFdLFsuNSwxXV1dLFtbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLDEuNV0sWy41LDFdXSxbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLC41XSxbMSwxLjVdXV0sW1tbMSwuNV0sWy41LDFdXV0sW1tbLjUsMV0sWzEsLjVdXV0sW1tbMSwxLjVdLFsxLC41XV1dLFtbWy41LDFdLFsxLC41XV0sW1sxLjUsMV0sWzEsMS41XV1dLFtbWzEuNSwxXSxbMSwuNV1dXSxbW1suNSwxXSxbMS41LDFdXV0sW1tbMSwxLjVdLFsxLjUsMV1dXSxbW1suNSwxXSxbMSwxLjVdXV0sW11dO2Z1bmN0aW9uIEhnKCl7dmFyIHQ9MSxlPTEsbj1qbCxpPXM7ZnVuY3Rpb24gcih0KXt2YXIgZT1uKHQpO2lmKEFycmF5LmlzQXJyYXkoZSkpZT1lLnNsaWNlKCkuc29ydChOZyk7ZWxzZXt2YXIgaT1MbCh0KSxyPWlbMF0sYT1pWzFdO2U9VWwocixhLGUpLGU9emwoTWF0aC5mbG9vcihyL2UpKmUsTWF0aC5mbG9vcihhL2UpKmUsZSl9cmV0dXJuIGUubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gbyh0LGUpfSkpfWZ1bmN0aW9uIG8obixyKXt2YXIgbz1bXSxzPVtdO3JldHVybihmdW5jdGlvbiBsKG4saSxyKXt2YXIgbyxzLGwsYyx1LGg9bmV3IEFycmF5LGQ9bmV3IEFycmF5O2ZvcihvPXM9LTEsQmdbKGw9blswXT49aSk8PDFdLmZvckVhY2gocCk7KytvPHQtMTspQmdbbHwobD1uW28rMV0+PWkpPDwxXS5mb3JFYWNoKHApO2ZvcihCZ1tsPDwwXS5mb3JFYWNoKHApOysrczxlLTE7KXtmb3Iobz0tMSxCZ1sobD1uW3MqdCt0XT49aSk8PDF8KGM9bltzKnRdPj1pKTw8Ml0uZm9yRWFjaChwKTsrK288dC0xOyl1PWMsQmdbbHwobD1uW3MqdCt0K28rMV0+PWkpPDwxfChjPW5bcyp0K28rMV0+PWkpPDwyfHU8PDNdLmZvckVhY2gocCk7QmdbbHxjPDwzXS5mb3JFYWNoKHApfWZvcihvPS0xLEJnWyhjPW5bcyp0XT49aSk8PDJdLmZvckVhY2gocCk7KytvPHQtMTspdT1jLEJnWyhjPW5bcyp0K28rMV0+PWkpPDwyfHU8PDNdLmZvckVhY2gocCk7ZnVuY3Rpb24gcCh0KXt2YXIgZSxuLGk9W3RbMF1bMF0rbyx0WzBdWzFdK3NdLGw9W3RbMV1bMF0rbyx0WzFdWzFdK3NdLGM9YShpKSx1PWEobCk7KGU9ZFtjXSk/KG49aFt1XSk/KGRlbGV0ZSBkW2UuZW5kXSxkZWxldGUgaFtuLnN0YXJ0XSxlPT09bj8oZS5yaW5nLnB1c2gobCkscihlLnJpbmcpKTpoW2Uuc3RhcnRdPWRbbi5lbmRdPXtzdGFydDplLnN0YXJ0LGVuZDpuLmVuZCxyaW5nOmUucmluZy5jb25jYXQobi5yaW5nKX0pOihkZWxldGUgZFtlLmVuZF0sZS5yaW5nLnB1c2gobCksZFtlLmVuZD11XT1lKTooZT1oW3VdKT8obj1kW2NdKT8oZGVsZXRlIGhbZS5zdGFydF0sZGVsZXRlIGRbbi5lbmRdLGU9PT1uPyhlLnJpbmcucHVzaChsKSxyKGUucmluZykpOmhbbi5zdGFydF09ZFtlLmVuZF09e3N0YXJ0Om4uc3RhcnQsZW5kOmUuZW5kLHJpbmc6bi5yaW5nLmNvbmNhdChlLnJpbmcpfSk6KGRlbGV0ZSBoW2Uuc3RhcnRdLGUucmluZy51bnNoaWZ0KGkpLGhbZS5zdGFydD1jXT1lKTpoW2NdPWRbdV09e3N0YXJ0OmMsZW5kOnUscmluZzpbaSxsXX19QmdbYzw8M10uZm9yRWFjaChwKX0pKG4sciwoZnVuY3Rpb24odCl7aSh0LG4sciksKGZ1bmN0aW9uIGUodCl7Zm9yKHZhciBlPTAsbj10Lmxlbmd0aCxpPXRbbi0xXVsxXSp0WzBdWzBdLXRbbi0xXVswXSp0WzBdWzFdOysrZTxuOylpKz10W2UtMV1bMV0qdFtlXVswXS10W2UtMV1bMF0qdFtlXVsxXTtyZXR1cm4gaX0pKHQpPjA/by5wdXNoKFt0XSk6cy5wdXNoKHQpfSkpLHMuZm9yRWFjaCgoZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MCxpPW8ubGVuZ3RoO248aTsrK24paWYoLTEhPT1SZygoZT1vW25dKVswXSx0KSlyZXR1cm4gdm9pZCBlLnB1c2godCl9KSkse3R5cGU6Ik11bHRpUG9seWdvbiIsdmFsdWU6cixjb29yZGluYXRlczpvfX1mdW5jdGlvbiBhKGUpe3JldHVybiAyKmVbMF0rZVsxXSoodCsxKSo0fWZ1bmN0aW9uIHMobixpLHIpe24uZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIG8sYT1uWzBdLHM9blsxXSxsPTB8YSxjPTB8cyx1PWlbYyp0K2xdO2E+MCYmYTx0JiZsPT09YSYmKG5bMF09YSsoci0obz1pW2MqdCtsLTFdKSkvKHUtbyktLjUpLHM+MCYmczxlJiZjPT09cyYmKG5bMV09cysoci0obz1pWyhjLTEpKnQrbF0pKS8odS1vKS0uNSl9KSl9cmV0dXJuIHIuY29udG91cj1vLHIuc2l6ZT1mdW5jdGlvbihuKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm5bdCxlXTt2YXIgaT1NYXRoLmNlaWwoblswXSksbz1NYXRoLmNlaWwoblsxXSk7aWYoIShpPjAmJm8+MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNpemUiKTtyZXR1cm4gdD1pLGU9byxyfSxyLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP0lnKFBnLmNhbGwodCkpOklnKHQpLHIpOm59LHIuc21vb3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQ/czpEZyxyKTppPT09c30scn1mdW5jdGlvbiBGZyh0LGUsbil7Zm9yKHZhciBpPXQud2lkdGgscj10LmhlaWdodCxvPTErKG48PDEpLGE9MDthPHI7KythKWZvcih2YXIgcz0wLGw9MDtzPGkrbjsrK3MpczxpJiYobCs9dC5kYXRhW3MrYSppXSkscz49biYmKHM+PW8mJihsLT10LmRhdGFbcy1vK2EqaV0pLGUuZGF0YVtzLW4rYSppXT1sL01hdGgubWluKHMrMSxpLTErby1zLG8pKX1mdW5jdGlvbiBWZyh0LGUsbil7Zm9yKHZhciBpPXQud2lkdGgscj10LmhlaWdodCxvPTErKG48PDEpLGE9MDthPGk7KythKWZvcih2YXIgcz0wLGw9MDtzPHIrbjsrK3MpczxyJiYobCs9dC5kYXRhW2ErcyppXSkscz49biYmKHM+PW8mJihsLT10LmRhdGFbYSsocy1vKSppXSksZS5kYXRhW2ErKHMtbikqaV09bC9NYXRoLm1pbihzKzEsci0xK28tcyxvKSl9ZnVuY3Rpb24gVWcodCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gamcodCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gR2coKXtyZXR1cm4gMX12YXIgV2c9e30scWc9e307ZnVuY3Rpb24gWWcodCl7cmV0dXJuIG5ldyBGdW5jdGlvbigiZCIsInJldHVybiB7Iit0Lm1hcCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodCkrIjogZFsiK2UrJ10gfHwgIiInfSkpLmpvaW4oIiwiKSsifSIpfWZ1bmN0aW9uIFhnKHQpe3ZhciBlPU9iamVjdC5jcmVhdGUobnVsbCksbj1bXTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtmb3IodmFyIGkgaW4gdClpIGluIGV8fG4ucHVzaChlW2ldPWkpfSkpLG59ZnVuY3Rpb24gJGcodCxlKXt2YXIgbj10KyIiLGk9bi5sZW5ndGg7cmV0dXJuIGk8ZT9uZXcgQXJyYXkoZS1pKzEpLmpvaW4oMCkrbjpufWZ1bmN0aW9uIEtnKHQpe3ZhciBlPW5ldyBSZWdFeHAoJ1siJyt0KyJcblxyXSIpLG49dC5jaGFyQ29kZUF0KDApO2Z1bmN0aW9uIGkodCxlKXt2YXIgaSxyPVtdLG89dC5sZW5ndGgsYT0wLHM9MCxsPW88PTAsYz0hMTtmdW5jdGlvbiB1KCl7aWYobClyZXR1cm4gcWc7aWYoYylyZXR1cm4gYz0hMSxXZzt2YXIgZSxpLHI9YTtpZigzND09PXQuY2hhckNvZGVBdChyKSl7Zm9yKDthKys8byYmMzQhPT10LmNoYXJDb2RlQXQoYSl8fDM0PT09dC5jaGFyQ29kZUF0KCsrYSk7KTtyZXR1cm4oZT1hKT49bz9sPSEwOjEwPT09KGk9dC5jaGFyQ29kZUF0KGErKykpP2M9ITA6MTM9PT1pJiYoYz0hMCwxMD09PXQuY2hhckNvZGVBdChhKSYmKythKSx0LnNsaWNlKHIrMSxlLTEpLnJlcGxhY2UoLyIiL2csJyInKX1mb3IoO2E8bzspe2lmKDEwPT09KGk9dC5jaGFyQ29kZUF0KGU9YSsrKSkpYz0hMDtlbHNlIGlmKDEzPT09aSljPSEwLDEwPT09dC5jaGFyQ29kZUF0KGEpJiYrK2E7ZWxzZSBpZihpIT09biljb250aW51ZTtyZXR1cm4gdC5zbGljZShyLGUpfXJldHVybiBsPSEwLHQuc2xpY2UocixvKX1mb3IoMTA9PT10LmNoYXJDb2RlQXQoby0xKSYmLS1vLDEzPT09dC5jaGFyQ29kZUF0KG8tMSkmJi0tbzsoaT11KCkpIT09cWc7KXtmb3IodmFyIGg9W107aSE9PVdnJiZpIT09cWc7KWgucHVzaChpKSxpPXUoKTtlJiZudWxsPT0oaD1lKGgscysrKSl8fHIucHVzaChoKX1yZXR1cm4gcn1mdW5jdGlvbiByKGUsbil7cmV0dXJuIGUubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gbi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBhKGVbdF0pfSkpLmpvaW4odCl9KSl9ZnVuY3Rpb24gbyhlKXtyZXR1cm4gZS5tYXAoYSkuam9pbih0KX1mdW5jdGlvbiBhKHQpe3JldHVybiBudWxsPT10PyIiOnQgaW5zdGFuY2VvZiBEYXRlPyhmdW5jdGlvbiBuKHQpe3ZhciBlPXQuZ2V0VVRDSG91cnMoKSxuPXQuZ2V0VVRDTWludXRlcygpLGk9dC5nZXRVVENTZWNvbmRzKCkscj10LmdldFVUQ01pbGxpc2Vjb25kcygpO3JldHVybiBpc05hTih0KT8iSW52YWxpZCBEYXRlIjooZnVuY3Rpb24gbyh0KXtyZXR1cm4gdDwwPyItIiskZygtdCw2KTp0Pjk5OTk/IisiKyRnKHQsNik6JGcodCw0KX0pKHQuZ2V0VVRDRnVsbFllYXIoKSkrIi0iKyRnKHQuZ2V0VVRDTW9udGgoKSsxLDIpKyItIiskZyh0LmdldFVUQ0RhdGUoKSwyKSsocj8iVCIrJGcoZSwyKSsiOiIrJGcobiwyKSsiOiIrJGcoaSwyKSsiLiIrJGcociwzKSsiWiI6aT8iVCIrJGcoZSwyKSsiOiIrJGcobiwyKSsiOiIrJGcoaSwyKSsiWiI6bnx8ZT8iVCIrJGcoZSwyKSsiOiIrJGcobiwyKSsiWiI6IiIpfSkodCk6ZS50ZXN0KHQrPSIiKT8nIicrdC5yZXBsYWNlKC8iL2csJyIiJykrJyInOnR9cmV0dXJue3BhcnNlOmZ1bmN0aW9uIHModCxlKXt2YXIgbixyLG89aSh0LChmdW5jdGlvbih0LGkpe2lmKG4pcmV0dXJuIG4odCxpLTEpO3I9dCxuPWU/KGZ1bmN0aW9uIG8odCxlKXt2YXIgbj1ZZyh0KTtyZXR1cm4gZnVuY3Rpb24oaSxyKXtyZXR1cm4gZShuKGkpLHIsdCl9fSkodCxlKTpZZyh0KX0pKTtyZXR1cm4gby5jb2x1bW5zPXJ8fFtdLG99LHBhcnNlUm93czppLGZvcm1hdDpmdW5jdGlvbiBsKGUsbil7cmV0dXJuIG51bGw9PW4mJihuPVhnKGUpKSxbbi5tYXAoYSkuam9pbih0KV0uY29uY2F0KHIoZSxuKSkuam9pbigiXG4iKX0sZm9ybWF0Qm9keTpmdW5jdGlvbiBjKHQsZSl7cmV0dXJuIG51bGw9PWUmJihlPVhnKHQpKSxyKHQsZSkuam9pbigiXG4iKX0sZm9ybWF0Um93czpmdW5jdGlvbiB1KHQpe3JldHVybiB0Lm1hcChvKS5qb2luKCJcbiIpfSxmb3JtYXRSb3c6byxmb3JtYXRWYWx1ZTphfX12YXIgWmc9S2coIiwiKSxKZz1aZy5wYXJzZSxRZz1aZy5wYXJzZVJvd3MsdF89WmcuZm9ybWF0LGVfPVpnLmZvcm1hdEJvZHksbl89WmcuZm9ybWF0Um93cyxpXz1aZy5mb3JtYXRSb3cscl89WmcuZm9ybWF0VmFsdWUsb189S2coIlx0IiksYV89b18ucGFyc2Usc189b18ucGFyc2VSb3dzLGxfPW9fLmZvcm1hdCxjXz1vXy5mb3JtYXRCb2R5LHVfPW9fLmZvcm1hdFJvd3MsaF89b18uZm9ybWF0Um93LGRfPW9fLmZvcm1hdFZhbHVlLHBfPW5ldyBEYXRlKCIyMDE5LTAxLTAxVDAwOjAwIikuZ2V0SG91cnMoKXx8bmV3IERhdGUoIjIwMTktMDctMDFUMDA6MDAiKS5nZXRIb3VycygpO2Z1bmN0aW9uIGZfKHQpe2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcih0LnN0YXR1cysiICIrdC5zdGF0dXNUZXh0KTtyZXR1cm4gdC5ibG9iKCl9ZnVuY3Rpb24gbV8odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LmFycmF5QnVmZmVyKCl9ZnVuY3Rpb24gZ18odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LnRleHQoKX1mdW5jdGlvbiBfXyh0LGUpe3JldHVybiBmZXRjaCh0LGUpLnRoZW4oZ18pfWZ1bmN0aW9uIHlfKHQpe3JldHVybiBmdW5jdGlvbihlLG4saSl7cmV0dXJuIDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgbiYmKGk9bixuPXZvaWQgMCksX18oZSxuKS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gdChlLGkpfSkpfX12YXIgdl89eV8oSmcpLGJfPXlfKGFfKTtmdW5jdGlvbiB4Xyh0KXtpZighdC5vayl0aHJvdyBuZXcgRXJyb3IodC5zdGF0dXMrIiAiK3Quc3RhdHVzVGV4dCk7aWYoMjA0IT09dC5zdGF0dXMmJjIwNSE9PXQuc3RhdHVzKXJldHVybiB0Lmpzb24oKX1mdW5jdGlvbiB3Xyh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtyZXR1cm4gX18oZSxuKS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGUsdCl9KSl9fXZhciBTXz13XygiYXBwbGljYXRpb24veG1sIiksTV89d18oInRleHQvaHRtbCIpLEVfPXdfKCJpbWFnZS9zdmcreG1sIik7ZnVuY3Rpb24gVF8odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIENfKCl7cmV0dXJuIDFlLTYqKE1hdGgucmFuZG9tKCktLjUpfWZ1bmN0aW9uIEFfKHQsZSxuLGkpe2lmKGlzTmFOKGUpfHxpc05hTihuKSlyZXR1cm4gdDt2YXIgcixvLGEscyxsLGMsdSxoLGQscD10Ll9yb290LGY9e2RhdGE6aX0sbT10Ll94MCxnPXQuX3kwLF89dC5feDEseT10Ll95MTtpZighcClyZXR1cm4gdC5fcm9vdD1mLHQ7Zm9yKDtwLmxlbmd0aDspaWYoKGM9ZT49KG89KG0rXykvMikpP209bzpfPW8sKHU9bj49KGE9KGcreSkvMikpP2c9YTp5PWEscj1wLCEocD1wW2g9dTw8MXxjXSkpcmV0dXJuIHJbaF09Zix0O2lmKHM9K3QuX3guY2FsbChudWxsLHAuZGF0YSksbD0rdC5feS5jYWxsKG51bGwscC5kYXRhKSxlPT09cyYmbj09PWwpcmV0dXJuIGYubmV4dD1wLHI/cltoXT1mOnQuX3Jvb3Q9Zix0O2Rve3I9cj9yW2hdPW5ldyBBcnJheSg0KTp0Ll9yb290PW5ldyBBcnJheSg0KSwoYz1lPj0obz0obStfKS8yKSk/bT1vOl89bywodT1uPj0oYT0oZyt5KS8yKSk/Zz1hOnk9YX13aGlsZSgoaD11PDwxfGMpPT0oZD0obD49YSk8PDF8cz49bykpO3JldHVybiByW2RdPXAscltoXT1mLHR9ZnVuY3Rpb24ga18odCxlLG4saSxyKXt0aGlzLm5vZGU9dCx0aGlzLngwPWUsdGhpcy55MD1uLHRoaXMueDE9aSx0aGlzLnkxPXJ9ZnVuY3Rpb24gTF8odCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gUF8odCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gTl8odCxlLG4pe3ZhciBpPW5ldyBJXyhudWxsPT1lP0xfOmUsbnVsbD09bj9QXzpuLE5hTixOYU4sTmFOLE5hTik7cmV0dXJuIG51bGw9PXQ/aTppLmFkZEFsbCh0KX1mdW5jdGlvbiBJXyh0LGUsbixpLHIsbyl7dGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl94MD1uLHRoaXMuX3kwPWksdGhpcy5feDE9cix0aGlzLl95MT1vLHRoaXMuX3Jvb3Q9dm9pZCAwfWZ1bmN0aW9uIFJfKHQpe2Zvcih2YXIgZT17ZGF0YTp0LmRhdGF9LG49ZTt0PXQubmV4dDspbj1uLm5leHQ9e2RhdGE6dC5kYXRhfTtyZXR1cm4gZX12YXIgT189Tl8ucHJvdG90eXBlPUlfLnByb3RvdHlwZTtmdW5jdGlvbiB6Xyh0KXtyZXR1cm4gdC54K3Qudnh9ZnVuY3Rpb24gRF8odCl7cmV0dXJuIHQueSt0LnZ5fWZ1bmN0aW9uIEJfKHQpe3JldHVybiB0LmluZGV4fWZ1bmN0aW9uIEhfKHQsZSl7dmFyIG49dC5nZXQoZSk7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nOiAiK2UpO3JldHVybiBufWZ1bmN0aW9uIEZfKHQpe3JldHVybiB0Lnh9ZnVuY3Rpb24gVl8odCl7cmV0dXJuIHQueX1PXy5jb3B5PWZ1bmN0aW9uKCl7dmFyIHQsZSxuPW5ldyBJXyh0aGlzLl94LHRoaXMuX3ksdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpLGk9dGhpcy5fcm9vdDtpZighaSlyZXR1cm4gbjtpZighaS5sZW5ndGgpcmV0dXJuIG4uX3Jvb3Q9Ul8oaSksbjtmb3IodD1be3NvdXJjZTppLHRhcmdldDpuLl9yb290PW5ldyBBcnJheSg0KX1dO2k9dC5wb3AoKTspZm9yKHZhciByPTA7cjw0OysrcikoZT1pLnNvdXJjZVtyXSkmJihlLmxlbmd0aD90LnB1c2goe3NvdXJjZTplLHRhcmdldDppLnRhcmdldFtyXT1uZXcgQXJyYXkoNCl9KTppLnRhcmdldFtyXT1SXyhlKSk7cmV0dXJuIG59LE9fLmFkZD1mdW5jdGlvbiBVXyh0KXt2YXIgZT0rdGhpcy5feC5jYWxsKG51bGwsdCksbj0rdGhpcy5feS5jYWxsKG51bGwsdCk7cmV0dXJuIEFfKHRoaXMuY292ZXIoZSxuKSxlLG4sdCl9LE9fLmFkZEFsbD1mdW5jdGlvbiBqXyh0KXt2YXIgZSxuLGkscixvPXQubGVuZ3RoLGE9bmV3IEFycmF5KG8pLHM9bmV3IEFycmF5KG8pLGw9MS8wLGM9MS8wLHU9LTEvMCxoPS0xLzA7Zm9yKG49MDtuPG87KytuKWlzTmFOKGk9K3RoaXMuX3guY2FsbChudWxsLGU9dFtuXSkpfHxpc05hTihyPSt0aGlzLl95LmNhbGwobnVsbCxlKSl8fChhW25dPWksc1tuXT1yLGk8bCYmKGw9aSksaT51JiYodT1pKSxyPGMmJihjPXIpLHI+aCYmKGg9cikpO2lmKGw+dXx8Yz5oKXJldHVybiB0aGlzO2Zvcih0aGlzLmNvdmVyKGwsYykuY292ZXIodSxoKSxuPTA7bjxvOysrbilBXyh0aGlzLGFbbl0sc1tuXSx0W25dKTtyZXR1cm4gdGhpc30sT18uY292ZXI9ZnVuY3Rpb24gR18odCxlKXtpZihpc05hTih0PSt0KXx8aXNOYU4oZT0rZSkpcmV0dXJuIHRoaXM7dmFyIG49dGhpcy5feDAsaT10aGlzLl95MCxyPXRoaXMuX3gxLG89dGhpcy5feTE7aWYoaXNOYU4obikpcj0obj1NYXRoLmZsb29yKHQpKSsxLG89KGk9TWF0aC5mbG9vcihlKSkrMTtlbHNle2Zvcih2YXIgYSxzLGw9ci1uLGM9dGhpcy5fcm9vdDtuPnR8fHQ+PXJ8fGk+ZXx8ZT49bzspc3dpdGNoKHM9KGU8aSk8PDF8dDxuLChhPW5ldyBBcnJheSg0KSlbc109YyxjPWEsbCo9MixzKXtjYXNlIDA6cj1uK2wsbz1pK2w7YnJlYWs7Y2FzZSAxOm49ci1sLG89aStsO2JyZWFrO2Nhc2UgMjpyPW4rbCxpPW8tbDticmVhaztjYXNlIDM6bj1yLWwsaT1vLWx9dGhpcy5fcm9vdCYmdGhpcy5fcm9vdC5sZW5ndGgmJih0aGlzLl9yb290PWMpfXJldHVybiB0aGlzLl94MD1uLHRoaXMuX3kwPWksdGhpcy5feDE9cix0aGlzLl95MT1vLHRoaXN9LE9fLmRhdGE9ZnVuY3Rpb24gV18oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy52aXNpdCgoZnVuY3Rpb24oZSl7aWYoIWUubGVuZ3RoKWRve3QucHVzaChlLmRhdGEpfXdoaWxlKGU9ZS5uZXh0KX0pKSx0fSxPXy5leHRlbnQ9ZnVuY3Rpb24gcV8odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5jb3ZlcigrdFswXVswXSwrdFswXVsxXSkuY292ZXIoK3RbMV1bMF0sK3RbMV1bMV0pOmlzTmFOKHRoaXMuX3gwKT92b2lkIDA6W1t0aGlzLl94MCx0aGlzLl95MF0sW3RoaXMuX3gxLHRoaXMuX3kxXV19LE9fLmZpbmQ9ZnVuY3Rpb24gWV8odCxlLG4pe3ZhciBpLHIsbyxhLHMsbCxjLHU9dGhpcy5feDAsaD10aGlzLl95MCxkPXRoaXMuX3gxLHA9dGhpcy5feTEsZj1bXSxtPXRoaXMuX3Jvb3Q7Zm9yKG0mJmYucHVzaChuZXcga18obSx1LGgsZCxwKSksbnVsbD09bj9uPTEvMDoodT10LW4saD1lLW4sZD10K24scD1lK24sbio9bik7bD1mLnBvcCgpOylpZighKCEobT1sLm5vZGUpfHwocj1sLngwKT5kfHwobz1sLnkwKT5wfHwoYT1sLngxKTx1fHwocz1sLnkxKTxoKSlpZihtLmxlbmd0aCl7dmFyIGc9KHIrYSkvMixfPShvK3MpLzI7Zi5wdXNoKG5ldyBrXyhtWzNdLGcsXyxhLHMpLG5ldyBrXyhtWzJdLHIsXyxnLHMpLG5ldyBrXyhtWzFdLGcsbyxhLF8pLG5ldyBrXyhtWzBdLHIsbyxnLF8pKSwoYz0oZT49Xyk8PDF8dD49ZykmJihsPWZbZi5sZW5ndGgtMV0sZltmLmxlbmd0aC0xXT1mW2YubGVuZ3RoLTEtY10sZltmLmxlbmd0aC0xLWNdPWwpfWVsc2V7dmFyIHk9dC0rdGhpcy5feC5jYWxsKG51bGwsbS5kYXRhKSx2PWUtK3RoaXMuX3kuY2FsbChudWxsLG0uZGF0YSksYj15Knkrdip2O2lmKGI8bil7dmFyIHg9TWF0aC5zcXJ0KG49Yik7dT10LXgsaD1lLXgsZD10K3gscD1lK3gsaT1tLmRhdGF9fXJldHVybiBpfSxPXy5yZW1vdmU9ZnVuY3Rpb24gWF8odCl7aWYoaXNOYU4obz0rdGhpcy5feC5jYWxsKG51bGwsdCkpfHxpc05hTihhPSt0aGlzLl95LmNhbGwobnVsbCx0KSkpcmV0dXJuIHRoaXM7dmFyIGUsbixpLHIsbyxhLHMsbCxjLHUsaCxkLHA9dGhpcy5fcm9vdCxmPXRoaXMuX3gwLG09dGhpcy5feTAsZz10aGlzLl94MSxfPXRoaXMuX3kxO2lmKCFwKXJldHVybiB0aGlzO2lmKHAubGVuZ3RoKWZvcig7Oyl7aWYoKGM9bz49KHM9KGYrZykvMikpP2Y9czpnPXMsKHU9YT49KGw9KG0rXykvMikpP209bDpfPWwsZT1wLCEocD1wW2g9dTw8MXxjXSkpcmV0dXJuIHRoaXM7aWYoIXAubGVuZ3RoKWJyZWFrOyhlW2grMSYzXXx8ZVtoKzImM118fGVbaCszJjNdKSYmKG49ZSxkPWgpfWZvcig7cC5kYXRhIT09dDspaWYoaT1wLCEocD1wLm5leHQpKXJldHVybiB0aGlzO3JldHVybihyPXAubmV4dCkmJmRlbGV0ZSBwLm5leHQsaT8ocj9pLm5leHQ9cjpkZWxldGUgaS5uZXh0LHRoaXMpOmU/KHI/ZVtoXT1yOmRlbGV0ZSBlW2hdLChwPWVbMF18fGVbMV18fGVbMl18fGVbM10pJiZwPT09KGVbM118fGVbMl18fGVbMV18fGVbMF0pJiYhcC5sZW5ndGgmJihuP25bZF09cDp0aGlzLl9yb290PXApLHRoaXMpOih0aGlzLl9yb290PXIsdGhpcyl9LE9fLnJlbW92ZUFsbD1mdW5jdGlvbiAkXyh0KXtmb3IodmFyIGU9MCxuPXQubGVuZ3RoO2U8bjsrK2UpdGhpcy5yZW1vdmUodFtlXSk7cmV0dXJuIHRoaXN9LE9fLnJvb3Q9ZnVuY3Rpb24gS18oKXtyZXR1cm4gdGhpcy5fcm9vdH0sT18uc2l6ZT1mdW5jdGlvbiBaXygpe3ZhciB0PTA7cmV0dXJuIHRoaXMudmlzaXQoKGZ1bmN0aW9uKGUpe2lmKCFlLmxlbmd0aClkb3srK3R9d2hpbGUoZT1lLm5leHQpfSkpLHR9LE9fLnZpc2l0PWZ1bmN0aW9uIEpfKHQpe3ZhciBlLG4saSxyLG8sYSxzPVtdLGw9dGhpcy5fcm9vdDtmb3IobCYmcy5wdXNoKG5ldyBrXyhsLHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSk7ZT1zLnBvcCgpOylpZighdChsPWUubm9kZSxpPWUueDAscj1lLnkwLG89ZS54MSxhPWUueTEpJiZsLmxlbmd0aCl7dmFyIGM9KGkrbykvMix1PShyK2EpLzI7KG49bFszXSkmJnMucHVzaChuZXcga18obixjLHUsbyxhKSksKG49bFsyXSkmJnMucHVzaChuZXcga18obixpLHUsYyxhKSksKG49bFsxXSkmJnMucHVzaChuZXcga18obixjLHIsbyx1KSksKG49bFswXSkmJnMucHVzaChuZXcga18obixpLHIsYyx1KSl9cmV0dXJuIHRoaXN9LE9fLnZpc2l0QWZ0ZXI9ZnVuY3Rpb24gUV8odCl7dmFyIGUsbj1bXSxpPVtdO2Zvcih0aGlzLl9yb290JiZuLnB1c2gobmV3IGtfKHRoaXMuX3Jvb3QsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtlPW4ucG9wKCk7KXt2YXIgcj1lLm5vZGU7aWYoci5sZW5ndGgpe3ZhciBvLGE9ZS54MCxzPWUueTAsbD1lLngxLGM9ZS55MSx1PShhK2wpLzIsaD0ocytjKS8yOyhvPXJbMF0pJiZuLnB1c2gobmV3IGtfKG8sYSxzLHUsaCkpLChvPXJbMV0pJiZuLnB1c2gobmV3IGtfKG8sdSxzLGwsaCkpLChvPXJbMl0pJiZuLnB1c2gobmV3IGtfKG8sYSxoLHUsYykpLChvPXJbM10pJiZuLnB1c2gobmV3IGtfKG8sdSxoLGwsYykpfWkucHVzaChlKX1mb3IoO2U9aS5wb3AoKTspdChlLm5vZGUsZS54MCxlLnkwLGUueDEsZS55MSk7cmV0dXJuIHRoaXN9LE9fLng9ZnVuY3Rpb24gdHkodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3g9dCx0aGlzKTp0aGlzLl94fSxPXy55PWZ1bmN0aW9uIGV5KHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl95PXQsdGhpcyk6dGhpcy5feX07dmFyIG55PU1hdGguUEkqKDMtTWF0aC5zcXJ0KDUpKTtmdW5jdGlvbiBpeSh0LGUpe2lmKChuPSh0PWU/dC50b0V4cG9uZW50aWFsKGUtMSk6dC50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoImUiKSk8MClyZXR1cm4gbnVsbDt2YXIgbixpPXQuc2xpY2UoMCxuKTtyZXR1cm5baS5sZW5ndGg+MT9pWzBdK2kuc2xpY2UoMik6aSwrdC5zbGljZShuKzEpXX1mdW5jdGlvbiByeSh0KXtyZXR1cm4odD1peShNYXRoLmFicyh0KSkpP3RbMV06TmFOfXZhciBveSxheT0vXig/OiguKT8oWzw+PV5dKSk/KFsrXC0oIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KH4pPyhbYS16JV0pPyQvaTtmdW5jdGlvbiBzeSh0KXtpZighKGU9YXkuZXhlYyh0KSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdDogIit0KTt2YXIgZTtyZXR1cm4gbmV3IGx5KHtmaWxsOmVbMV0sYWxpZ246ZVsyXSxzaWduOmVbM10sc3ltYm9sOmVbNF0semVybzplWzVdLHdpZHRoOmVbNl0sY29tbWE6ZVs3XSxwcmVjaXNpb246ZVs4XSYmZVs4XS5zbGljZSgxKSx0cmltOmVbOV0sdHlwZTplWzEwXX0pfWZ1bmN0aW9uIGx5KHQpe3RoaXMuZmlsbD12b2lkIDA9PT10LmZpbGw/IiAiOnQuZmlsbCsiIix0aGlzLmFsaWduPXZvaWQgMD09PXQuYWxpZ24/Ij4iOnQuYWxpZ24rIiIsdGhpcy5zaWduPXZvaWQgMD09PXQuc2lnbj8iLSI6dC5zaWduKyIiLHRoaXMuc3ltYm9sPXZvaWQgMD09PXQuc3ltYm9sPyIiOnQuc3ltYm9sKyIiLHRoaXMuemVybz0hIXQuemVybyx0aGlzLndpZHRoPXZvaWQgMD09PXQud2lkdGg/dm9pZCAwOit0LndpZHRoLHRoaXMuY29tbWE9ISF0LmNvbW1hLHRoaXMucHJlY2lzaW9uPXZvaWQgMD09PXQucHJlY2lzaW9uP3ZvaWQgMDordC5wcmVjaXNpb24sdGhpcy50cmltPSEhdC50cmltLHRoaXMudHlwZT12b2lkIDA9PT10LnR5cGU/IiI6dC50eXBlKyIifWZ1bmN0aW9uIGN5KHQsZSl7dmFyIG49aXkodCxlKTtpZighbilyZXR1cm4gdCsiIjt2YXIgaT1uWzBdLHI9blsxXTtyZXR1cm4gcjwwPyIwLiIrbmV3IEFycmF5KC1yKS5qb2luKCIwIikraTppLmxlbmd0aD5yKzE/aS5zbGljZSgwLHIrMSkrIi4iK2kuc2xpY2UocisxKTppK25ldyBBcnJheShyLWkubGVuZ3RoKzIpLmpvaW4oIjAiKX1zeS5wcm90b3R5cGU9bHkucHJvdG90eXBlLGx5LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbGwrdGhpcy5hbGlnbit0aGlzLnNpZ24rdGhpcy5zeW1ib2wrKHRoaXMuemVybz8iMCI6IiIpKyh2b2lkIDA9PT10aGlzLndpZHRoPyIiOk1hdGgubWF4KDEsMHx0aGlzLndpZHRoKSkrKHRoaXMuY29tbWE/IiwiOiIiKSsodm9pZCAwPT09dGhpcy5wcmVjaXNpb24/IiI6Ii4iK01hdGgubWF4KDAsMHx0aGlzLnByZWNpc2lvbikpKyh0aGlzLnRyaW0/In4iOiIiKSt0aGlzLnR5cGV9O3ZhciB1eT17IiUiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuKDEwMCp0KS50b0ZpeGVkKGUpfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDIpfSxjOmZ1bmN0aW9uKHQpe3JldHVybiB0KyIifSxkOmZ1bmN0aW9uIGh5KHQpe3JldHVybiBNYXRoLmFicyh0PU1hdGgucm91bmQodCkpPj0xZTIxP3QudG9Mb2NhbGVTdHJpbmcoImVuIikucmVwbGFjZSgvLC9nLCIiKTp0LnRvU3RyaW5nKDEwKX0sZTpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRvRXhwb25lbnRpYWwoZSl9LGY6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50b0ZpeGVkKGUpfSxnOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9QcmVjaXNpb24oZSl9LG86ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoOCl9LHA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gY3koMTAwKnQsZSl9LHI6Y3ksczpmdW5jdGlvbiBkeSh0LGUpe3ZhciBuPWl5KHQsZSk7aWYoIW4pcmV0dXJuIHQrIiI7dmFyIGk9blswXSxyPW5bMV0sbz1yLShveT0zKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihyLzMpKSkpKzEsYT1pLmxlbmd0aDtyZXR1cm4gbz09PWE/aTpvPmE/aStuZXcgQXJyYXkoby1hKzEpLmpvaW4oIjAiKTpvPjA/aS5zbGljZSgwLG8pKyIuIitpLnNsaWNlKG8pOiIwLiIrbmV3IEFycmF5KDEtbykuam9pbigiMCIpK2l5KHQsTWF0aC5tYXgoMCxlK28tMSkpWzBdfSxYOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSx4OmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KX19O2Z1bmN0aW9uIHB5KHQpe3JldHVybiB0fXZhciBmeSxteSxneSxfeT1BcnJheS5wcm90b3R5cGUubWFwLHl5PVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTtmdW5jdGlvbiB2eSh0KXt2YXIgZT12b2lkIDA9PT10Lmdyb3VwaW5nfHx2b2lkIDA9PT10LnRob3VzYW5kcz9weTooZnVuY3Rpb24gbih0LGUpe3JldHVybiBmdW5jdGlvbihuLGkpe2Zvcih2YXIgcj1uLmxlbmd0aCxvPVtdLGE9MCxzPXRbMF0sbD0wO3I+MCYmcz4wJiYobCtzKzE+aSYmKHM9TWF0aC5tYXgoMSxpLWwpKSxvLnB1c2gobi5zdWJzdHJpbmcoci09cyxyK3MpKSwhKChsKz1zKzEpPmkpKTspcz10W2E9KGErMSkldC5sZW5ndGhdO3JldHVybiBvLnJldmVyc2UoKS5qb2luKGUpfX0pKF95LmNhbGwodC5ncm91cGluZyxOdW1iZXIpLHQudGhvdXNhbmRzKyIiKSxpPXZvaWQgMD09PXQuY3VycmVuY3k/IiI6dC5jdXJyZW5jeVswXSsiIixyPXZvaWQgMD09PXQuY3VycmVuY3k/IiI6dC5jdXJyZW5jeVsxXSsiIixvPXZvaWQgMD09PXQuZGVjaW1hbD8iLiI6dC5kZWNpbWFsKyIiLGE9dm9pZCAwPT09dC5udW1lcmFscz9weTooZnVuY3Rpb24gcyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvWzAtOV0vZywoZnVuY3Rpb24oZSl7cmV0dXJuIHRbK2VdfSkpfX0pKF95LmNhbGwodC5udW1lcmFscyxTdHJpbmcpKSxsPXZvaWQgMD09PXQucGVyY2VudD8iJSI6dC5wZXJjZW50KyIiLGM9dm9pZCAwPT09dC5taW51cz8iLSI6dC5taW51cysiIix1PXZvaWQgMD09PXQubmFuPyJOYU4iOnQubmFuKyIiO2Z1bmN0aW9uIGgodCl7dmFyIG49KHQ9c3kodCkpLmZpbGwscz10LmFsaWduLGg9dC5zaWduLGQ9dC5zeW1ib2wscD10Lnplcm8sZj10LndpZHRoLG09dC5jb21tYSxnPXQucHJlY2lzaW9uLF89dC50cmltLHk9dC50eXBlOyJuIj09PXk/KG09ITAseT0iZyIpOnV5W3ldfHwodm9pZCAwPT09ZyYmKGc9MTIpLF89ITAseT0iZyIpLChwfHwiMCI9PT1uJiYiPSI9PT1zKSYmKHA9ITAsbj0iMCIscz0iPSIpO3ZhciB2PSIkIj09PWQ/aToiIyI9PT1kJiYvW2JveFhdLy50ZXN0KHkpPyIwIit5LnRvTG93ZXJDYXNlKCk6IiIsYj0iJCI9PT1kP3I6L1slcF0vLnRlc3QoeSk/bDoiIix4PXV5W3ldLHc9L1tkZWZncHJzJV0vLnRlc3QoeSk7ZnVuY3Rpb24gUyh0KXt2YXIgaSxyLGwsZD12LFM9YjtpZigiYyI9PT15KVM9eCh0KStTLHQ9IiI7ZWxzZXt2YXIgTT0odD0rdCk8MHx8MS90PDA7aWYodD1pc05hTih0KT91OngoTWF0aC5hYnModCksZyksXyYmKHQ9KGZ1bmN0aW9uIEUodCl7dDpmb3IodmFyIGUsbj10Lmxlbmd0aCxpPTEscj0tMTtpPG47KytpKXN3aXRjaCh0W2ldKXtjYXNlIi4iOnI9ZT1pO2JyZWFrO2Nhc2UiMCI6MD09PXImJihyPWkpLGU9aTticmVhaztkZWZhdWx0OmlmKCErdFtpXSlicmVhayB0O3I+MCYmKHI9MCl9cmV0dXJuIHI+MD90LnNsaWNlKDAscikrdC5zbGljZShlKzEpOnR9KSh0KSksTSYmMD09K3QmJiIrIiE9PWgmJihNPSExKSxkPShNPyIoIj09PWg/aDpjOiItIj09PWh8fCIoIj09PWg/IiI6aCkrZCxTPSgicyI9PT15P3l5Wzgrb3kvM106IiIpK1MrKE0mJiIoIj09PWg/IikiOiIiKSx3KWZvcihpPS0xLHI9dC5sZW5ndGg7KytpPHI7KWlmKDQ4PihsPXQuY2hhckNvZGVBdChpKSl8fGw+NTcpe1M9KDQ2PT09bD9vK3Quc2xpY2UoaSsxKTp0LnNsaWNlKGkpKStTLHQ9dC5zbGljZSgwLGkpO2JyZWFrfX1tJiYhcCYmKHQ9ZSh0LDEvMCkpO3ZhciBUPWQubGVuZ3RoK3QubGVuZ3RoK1MubGVuZ3RoLEM9VDxmP25ldyBBcnJheShmLVQrMSkuam9pbihuKToiIjtzd2l0Y2gobSYmcCYmKHQ9ZShDK3QsQy5sZW5ndGg/Zi1TLmxlbmd0aDoxLzApLEM9IiIpLHMpe2Nhc2UiPCI6dD1kK3QrUytDO2JyZWFrO2Nhc2UiPSI6dD1kK0MrdCtTO2JyZWFrO2Nhc2UiXiI6dD1DLnNsaWNlKDAsVD1DLmxlbmd0aD4+MSkrZCt0K1MrQy5zbGljZShUKTticmVhaztkZWZhdWx0OnQ9QytkK3QrU31yZXR1cm4gYSh0KX1yZXR1cm4gZz12b2lkIDA9PT1nPzY6L1tncHJzXS8udGVzdCh5KT9NYXRoLm1heCgxLE1hdGgubWluKDIxLGcpKTpNYXRoLm1heCgwLE1hdGgubWluKDIwLGcpKSxTLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHQrIiJ9LFN9cmV0dXJue2Zvcm1hdDpoLGZvcm1hdFByZWZpeDpmdW5jdGlvbiBkKHQsZSl7dmFyIG49aCgoKHQ9c3kodCkpLnR5cGU9ImYiLHQpKSxpPTMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKHJ5KGUpLzMpKSkscj1NYXRoLnBvdygxMCwtaSksbz15eVs4K2kvM107cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuKHIqdCkrb319fX1mdW5jdGlvbiBieSh0KXtyZXR1cm4gZnk9dnkodCksbXk9ZnkuZm9ybWF0LGd5PWZ5LmZvcm1hdFByZWZpeCxmeX1mdW5jdGlvbiB4eSh0KXtyZXR1cm4gTWF0aC5tYXgoMCwtcnkoTWF0aC5hYnModCkpKX1mdW5jdGlvbiB3eSh0LGUpe3JldHVybiBNYXRoLm1heCgwLDMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKHJ5KGUpLzMpKSktcnkoTWF0aC5hYnModCkpKX1mdW5jdGlvbiBTeSh0LGUpe3JldHVybiB0PU1hdGguYWJzKHQpLGU9TWF0aC5hYnMoZSktdCxNYXRoLm1heCgwLHJ5KGUpLXJ5KHQpKSsxfWZ1bmN0aW9uIE15KCl7cmV0dXJuIG5ldyBFeX1mdW5jdGlvbiBFeSgpe3RoaXMucmVzZXQoKX1ieSh7ZGVjaW1hbDoiLiIsdGhvdXNhbmRzOiIsIixncm91cGluZzpbM10sY3VycmVuY3k6WyIkIiwiIl0sbWludXM6Ii0ifSksRXkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpFeSxyZXNldDpmdW5jdGlvbigpe3RoaXMucz10aGlzLnQ9MH0sYWRkOmZ1bmN0aW9uKHQpe0N5KFR5LHQsdGhpcy50KSxDeSh0aGlzLFR5LnMsdGhpcy5zKSx0aGlzLnM/dGhpcy50Kz1UeS50OnRoaXMucz1UeS50fSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc319O3ZhciBUeT1uZXcgRXk7ZnVuY3Rpb24gQ3kodCxlLG4pe3ZhciBpPXQucz1lK24scj1pLWU7dC50PWUtKGktcikrKG4tcil9dmFyIEF5PTFlLTYsa3k9MWUtMTIsTHk9TWF0aC5QSSxQeT1MeS8yLE55PUx5LzQsSXk9MipMeSxSeT0xODAvTHksT3k9THkvMTgwLHp5PU1hdGguYWJzLER5PU1hdGguYXRhbixCeT1NYXRoLmF0YW4yLEh5PU1hdGguY29zLEZ5PU1hdGguY2VpbCxWeT1NYXRoLmV4cCxVeT1NYXRoLmxvZyxqeT1NYXRoLnBvdyxHeT1NYXRoLnNpbixXeT1NYXRoLnNpZ258fGZ1bmN0aW9uKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH0scXk9TWF0aC5zcXJ0LFl5PU1hdGgudGFuO2Z1bmN0aW9uIFh5KHQpe3JldHVybiB0PjE/MDp0PC0xP0x5Ok1hdGguYWNvcyh0KX1mdW5jdGlvbiAkeSh0KXtyZXR1cm4gdD4xP1B5OnQ8LTE/LVB5Ok1hdGguYXNpbih0KX1mdW5jdGlvbiBLeSh0KXtyZXR1cm4odD1HeSh0LzIpKSp0fWZ1bmN0aW9uIFp5KCl7fWZ1bmN0aW9uIEp5KHQsZSl7dCYmdHYuaGFzT3duUHJvcGVydHkodC50eXBlKSYmdHZbdC50eXBlXSh0LGUpfXZhciBReT17RmVhdHVyZTpmdW5jdGlvbih0LGUpe0p5KHQuZ2VvbWV0cnksZSl9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZmVhdHVyZXMsaT0tMSxyPW4ubGVuZ3RoOysraTxyOylKeShuW2ldLmdlb21ldHJ5LGUpfX0sdHY9e1NwaGVyZTpmdW5jdGlvbih0LGUpe2Uuc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKHQsZSl7ZS5wb2ludCgodD10LmNvb3JkaW5hdGVzKVswXSx0WzFdLHRbMl0pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuY29vcmRpbmF0ZXMsaT0tMSxyPW4ubGVuZ3RoOysraTxyOyllLnBvaW50KCh0PW5baV0pWzBdLHRbMV0sdFsyXSl9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxlKXtldih0LmNvb3JkaW5hdGVzLGUsMCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmNvb3JkaW5hdGVzLGk9LTEscj1uLmxlbmd0aDsrK2k8cjspZXYobltpXSxlLDApfSxQb2x5Z29uOmZ1bmN0aW9uKHQsZSl7bnYodC5jb29yZGluYXRlcyxlKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuY29vcmRpbmF0ZXMsaT0tMSxyPW4ubGVuZ3RoOysraTxyOyludihuW2ldLGUpfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5nZW9tZXRyaWVzLGk9LTEscj1uLmxlbmd0aDsrK2k8cjspSnkobltpXSxlKX19O2Z1bmN0aW9uIGV2KHQsZSxuKXt2YXIgaSxyPS0xLG89dC5sZW5ndGgtbjtmb3IoZS5saW5lU3RhcnQoKTsrK3I8bzspZS5wb2ludCgoaT10W3JdKVswXSxpWzFdLGlbMl0pO2UubGluZUVuZCgpfWZ1bmN0aW9uIG52KHQsZSl7dmFyIG49LTEsaT10Lmxlbmd0aDtmb3IoZS5wb2x5Z29uU3RhcnQoKTsrK248aTspZXYodFtuXSxlLDEpO2UucG9seWdvbkVuZCgpfWZ1bmN0aW9uIGl2KHQsZSl7dCYmUXkuaGFzT3duUHJvcGVydHkodC50eXBlKT9ReVt0LnR5cGVdKHQsZSk6SnkodCxlKX12YXIgcnYsb3YsYXYsc3YsbHYsY3Y9TXkoKSx1dj1NeSgpLGh2PXtwb2ludDpaeSxsaW5lU3RhcnQ6WnksbGluZUVuZDpaeSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtjdi5yZXNldCgpLGh2LmxpbmVTdGFydD1kdixodi5saW5lRW5kPXB2fSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9K2N2O3V2LmFkZCh0PDA/SXkrdDp0KSx0aGlzLmxpbmVTdGFydD10aGlzLmxpbmVFbmQ9dGhpcy5wb2ludD1aeX0sc3BoZXJlOmZ1bmN0aW9uKCl7dXYuYWRkKEl5KX19O2Z1bmN0aW9uIGR2KCl7aHYucG9pbnQ9ZnZ9ZnVuY3Rpb24gcHYoKXttdihydixvdil9ZnVuY3Rpb24gZnYodCxlKXtodi5wb2ludD1tdixydj10LG92PWUsYXY9dCo9T3ksc3Y9SHkoZT0oZSo9T3kpLzIrTnkpLGx2PUd5KGUpfWZ1bmN0aW9uIG12KHQsZSl7dmFyIG49KHQqPU95KS1hdixpPW4+PTA/MTotMSxyPWkqbixvPUh5KGU9KGUqPU95KS8yK055KSxhPUd5KGUpLHM9bHYqYSxsPXN2Km8rcypIeShyKSxjPXMqaSpHeShyKTtjdi5hZGQoQnkoYyxsKSksYXY9dCxzdj1vLGx2PWF9ZnVuY3Rpb24gZ3YodCl7cmV0dXJuW0J5KHRbMV0sdFswXSksJHkodFsyXSldfWZ1bmN0aW9uIF92KHQpe3ZhciBlPXRbMF0sbj10WzFdLGk9SHkobik7cmV0dXJuW2kqSHkoZSksaSpHeShlKSxHeShuKV19ZnVuY3Rpb24geXYodCxlKXtyZXR1cm4gdFswXSplWzBdK3RbMV0qZVsxXSt0WzJdKmVbMl19ZnVuY3Rpb24gdnYodCxlKXtyZXR1cm5bdFsxXSplWzJdLXRbMl0qZVsxXSx0WzJdKmVbMF0tdFswXSplWzJdLHRbMF0qZVsxXS10WzFdKmVbMF1dfWZ1bmN0aW9uIGJ2KHQsZSl7dFswXSs9ZVswXSx0WzFdKz1lWzFdLHRbMl0rPWVbMl19ZnVuY3Rpb24geHYodCxlKXtyZXR1cm5bdFswXSplLHRbMV0qZSx0WzJdKmVdfWZ1bmN0aW9uIHd2KHQpe3ZhciBlPXF5KHRbMF0qdFswXSt0WzFdKnRbMV0rdFsyXSp0WzJdKTt0WzBdLz1lLHRbMV0vPWUsdFsyXS89ZX12YXIgU3YsTXYsRXYsVHYsQ3YsQXYsa3YsTHYsUHYsTnYsSXYsUnYsT3YsenYsRHYsQnYsSHYsRnYsVnYsVXYsanYsR3YsV3YscXYsWXYsWHYsJHY9TXkoKSxLdj17cG9pbnQ6WnYsbGluZVN0YXJ0OlF2LGxpbmVFbmQ6dGIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7S3YucG9pbnQ9ZWIsS3YubGluZVN0YXJ0PW5iLEt2LmxpbmVFbmQ9aWIsJHYucmVzZXQoKSxodi5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2h2LnBvbHlnb25FbmQoKSxLdi5wb2ludD1adixLdi5saW5lU3RhcnQ9UXYsS3YubGluZUVuZD10YixjdjwwPyhTdj0tKEV2PTE4MCksTXY9LShUdj05MCkpOiR2PkF5P1R2PTkwOiR2PC0xZS02JiYoTXY9LTkwKSxOdlswXT1TdixOdlsxXT1Fdn0sc3BoZXJlOmZ1bmN0aW9uKCl7U3Y9LShFdj0xODApLE12PS0oVHY9OTApfX07ZnVuY3Rpb24gWnYodCxlKXtQdi5wdXNoKE52PVtTdj10LEV2PXRdKSxlPE12JiYoTXY9ZSksZT5UdiYmKFR2PWUpfWZ1bmN0aW9uIEp2KHQsZSl7dmFyIG49X3YoW3QqT3ksZSpPeV0pO2lmKEx2KXt2YXIgaT12dihMdixuKSxyPXZ2KFtpWzFdLC1pWzBdLDBdLGkpO3d2KHIpLHI9Z3Yocik7dmFyIG8sYT10LUN2LHM9YT4wPzE6LTEsbD1yWzBdKlJ5KnMsYz16eShhKT4xODA7Y14ocypDdjxsJiZsPHMqdCk/KG89clsxXSpSeSk+VHYmJihUdj1vKTpjXihzKkN2PChsPShsKzM2MCklMzYwLTE4MCkmJmw8cyp0KT8obz0tclsxXSpSeSk8TXYmJihNdj1vKTooZTxNdiYmKE12PWUpLGU+VHYmJihUdj1lKSksYz90PEN2P3JiKFN2LHQpPnJiKFN2LEV2KSYmKEV2PXQpOnJiKHQsRXYpPnJiKFN2LEV2KSYmKFN2PXQpOkV2Pj1Tdj8odDxTdiYmKFN2PXQpLHQ+RXYmJihFdj10KSk6dD5Ddj9yYihTdix0KT5yYihTdixFdikmJihFdj10KTpyYih0LEV2KT5yYihTdixFdikmJihTdj10KX1lbHNlIFB2LnB1c2goTnY9W1N2PXQsRXY9dF0pO2U8TXYmJihNdj1lKSxlPlR2JiYoVHY9ZSksTHY9bixDdj10fWZ1bmN0aW9uIFF2KCl7S3YucG9pbnQ9SnZ9ZnVuY3Rpb24gdGIoKXtOdlswXT1TdixOdlsxXT1FdixLdi5wb2ludD1adixMdj1udWxsfWZ1bmN0aW9uIGViKHQsZSl7aWYoTHYpe3ZhciBuPXQtQ3Y7JHYuYWRkKHp5KG4pPjE4MD9uKyhuPjA/MzYwOi0zNjApOm4pfWVsc2UgQXY9dCxrdj1lO2h2LnBvaW50KHQsZSksSnYodCxlKX1mdW5jdGlvbiBuYigpe2h2LmxpbmVTdGFydCgpfWZ1bmN0aW9uIGliKCl7ZWIoQXYsa3YpLGh2LmxpbmVFbmQoKSx6eSgkdik+QXkmJihTdj0tKEV2PTE4MCkpLE52WzBdPVN2LE52WzFdPUV2LEx2PW51bGx9ZnVuY3Rpb24gcmIodCxlKXtyZXR1cm4oZS09dCk8MD9lKzM2MDplfWZ1bmN0aW9uIG9iKHQsZSl7cmV0dXJuIHRbMF0tZVswXX1mdW5jdGlvbiBhYih0LGUpe3JldHVybiB0WzBdPD10WzFdP3RbMF08PWUmJmU8PXRbMV06ZTx0WzBdfHx0WzFdPGV9dmFyIHNiPXtzcGhlcmU6WnkscG9pbnQ6bGIsbGluZVN0YXJ0OnViLGxpbmVFbmQ6cGIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7c2IubGluZVN0YXJ0PWZiLHNiLmxpbmVFbmQ9bWJ9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtzYi5saW5lU3RhcnQ9dWIsc2IubGluZUVuZD1wYn19O2Z1bmN0aW9uIGxiKHQsZSl7dCo9T3k7dmFyIG49SHkoZSo9T3kpO2NiKG4qSHkodCksbipHeSh0KSxHeShlKSl9ZnVuY3Rpb24gY2IodCxlLG4peysrSXYsT3YrPSh0LU92KS9Jdix6dis9KGUtenYpL0l2LER2Kz0obi1EdikvSXZ9ZnVuY3Rpb24gdWIoKXtzYi5wb2ludD1oYn1mdW5jdGlvbiBoYih0LGUpe3QqPU95O3ZhciBuPUh5KGUqPU95KTtxdj1uKkh5KHQpLFl2PW4qR3kodCksWHY9R3koZSksc2IucG9pbnQ9ZGIsY2IocXYsWXYsWHYpfWZ1bmN0aW9uIGRiKHQsZSl7dCo9T3k7dmFyIG49SHkoZSo9T3kpLGk9bipIeSh0KSxyPW4qR3kodCksbz1HeShlKSxhPUJ5KHF5KChhPVl2Km8tWHYqcikqYSsoYT1YdippLXF2Km8pKmErKGE9cXYqci1ZdippKSphKSxxdippK1l2KnIrWHYqbyk7UnYrPWEsQnYrPWEqKHF2Kyhxdj1pKSksSHYrPWEqKFl2KyhZdj1yKSksRnYrPWEqKFh2KyhYdj1vKSksY2IocXYsWXYsWHYpfWZ1bmN0aW9uIHBiKCl7c2IucG9pbnQ9bGJ9ZnVuY3Rpb24gZmIoKXtzYi5wb2ludD1nYn1mdW5jdGlvbiBtYigpe19iKEd2LFd2KSxzYi5wb2ludD1sYn1mdW5jdGlvbiBnYih0LGUpe0d2PXQsV3Y9ZSx0Kj1PeSxlKj1PeSxzYi5wb2ludD1fYjt2YXIgbj1IeShlKTtxdj1uKkh5KHQpLFl2PW4qR3kodCksWHY9R3koZSksY2IocXYsWXYsWHYpfWZ1bmN0aW9uIF9iKHQsZSl7dCo9T3k7dmFyIG49SHkoZSo9T3kpLGk9bipIeSh0KSxyPW4qR3kodCksbz1HeShlKSxhPVl2Km8tWHYqcixzPVh2KmktcXYqbyxsPXF2KnItWXYqaSxjPXF5KGEqYStzKnMrbCpsKSx1PSR5KGMpLGg9YyYmLXUvYztWdis9aCphLFV2Kz1oKnMsanYrPWgqbCxSdis9dSxCdis9dSoocXYrKHF2PWkpKSxIdis9dSooWXYrKFl2PXIpKSxGdis9dSooWHYrKFh2PW8pKSxjYihxdixZdixYdil9ZnVuY3Rpb24geWIodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIHZiKHQsZSl7ZnVuY3Rpb24gbihuLGkpe3JldHVybiBuPXQobixpKSxlKG5bMF0sblsxXSl9cmV0dXJuIHQuaW52ZXJ0JiZlLmludmVydCYmKG4uaW52ZXJ0PWZ1bmN0aW9uKG4saSl7cmV0dXJuKG49ZS5pbnZlcnQobixpKSkmJnQuaW52ZXJ0KG5bMF0sblsxXSl9KSxufWZ1bmN0aW9uIGJiKHQsZSl7cmV0dXJuW3p5KHQpPkx5P3QrTWF0aC5yb3VuZCgtdC9JeSkqSXk6dCxlXX1mdW5jdGlvbiB4Yih0LGUsbil7cmV0dXJuKHQlPUl5KT9lfHxuP3ZiKFNiKHQpLE1iKGUsbikpOlNiKHQpOmV8fG4/TWIoZSxuKTpiYn1mdW5jdGlvbiB3Yih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtyZXR1cm5bKGUrPXQpPkx5P2UtSXk6ZTwtTHk/ZStJeTplLG5dfX1mdW5jdGlvbiBTYih0KXt2YXIgZT13Yih0KTtyZXR1cm4gZS5pbnZlcnQ9d2IoLXQpLGV9ZnVuY3Rpb24gTWIodCxlKXt2YXIgbj1IeSh0KSxpPUd5KHQpLHI9SHkoZSksbz1HeShlKTtmdW5jdGlvbiBhKHQsZSl7dmFyIGE9SHkoZSkscz1IeSh0KSphLGw9R3kodCkqYSxjPUd5KGUpLHU9YypuK3MqaTtyZXR1cm5bQnkobCpyLXUqbyxzKm4tYyppKSwkeSh1KnIrbCpvKV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIGE9SHkoZSkscz1IeSh0KSphLGw9R3kodCkqYSxjPUd5KGUpLHU9YypyLWwqbztyZXR1cm5bQnkobCpyK2MqbyxzKm4rdSppKSwkeSh1Km4tcyppKV19LGF9ZnVuY3Rpb24gRWIodCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4oZT10KGVbMF0qT3ksZVsxXSpPeSkpWzBdKj1SeSxlWzFdKj1SeSxlfXJldHVybiB0PXhiKHRbMF0qT3ksdFsxXSpPeSx0Lmxlbmd0aD4yP3RbMl0qT3k6MCksZS5pbnZlcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuKGU9dC5pbnZlcnQoZVswXSpPeSxlWzFdKk95KSlbMF0qPVJ5LGVbMV0qPVJ5LGV9LGV9ZnVuY3Rpb24gVGIodCxlLG4saSxyLG8pe2lmKG4pe3ZhciBhPUh5KGUpLHM9R3koZSksbD1pKm47bnVsbD09cj8ocj1lK2kqSXksbz1lLWwvMik6KHI9Q2IoYSxyKSxvPUNiKGEsbyksKGk+MD9yPG86cj5vKSYmKHIrPWkqSXkpKTtmb3IodmFyIGMsdT1yO2k+MD91Pm86dTxvO3UtPWwpYz1ndihbYSwtcypIeSh1KSwtcypHeSh1KV0pLHQucG9pbnQoY1swXSxjWzFdKX19ZnVuY3Rpb24gQ2IodCxlKXsoZT1fdihlKSlbMF0tPXQsd3YoZSk7dmFyIG49WHkoLWVbMV0pO3JldHVybigoLWVbMl08MD8tbjpuKStJeS1BeSklSXl9ZnVuY3Rpb24gQWIoKXt2YXIgdCxlPVtdO3JldHVybntwb2ludDpmdW5jdGlvbihlLG4saSl7dC5wdXNoKFtlLG4saV0pfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtlLnB1c2godD1bXSl9LGxpbmVFbmQ6WnkscmVqb2luOmZ1bmN0aW9uKCl7ZS5sZW5ndGg+MSYmZS5wdXNoKGUucG9wKCkuY29uY2F0KGUuc2hpZnQoKSkpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgbj1lO3JldHVybiBlPVtdLHQ9bnVsbCxufX19ZnVuY3Rpb24ga2IodCxlKXtyZXR1cm4genkodFswXS1lWzBdKTxBeSYmenkodFsxXS1lWzFdKTxBeX1mdW5jdGlvbiBMYih0LGUsbixpKXt0aGlzLng9dCx0aGlzLno9ZSx0aGlzLm89bix0aGlzLmU9aSx0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIFBiKHQsZSxuLGkscil7dmFyIG8sYSxzPVtdLGw9W107aWYodC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighKChlPXQubGVuZ3RoLTEpPD0wKSl7dmFyIGUsbixpPXRbMF0sYT10W2VdO2lmKGtiKGksYSkpe2lmKCFpWzJdJiYhYVsyXSl7Zm9yKHIubGluZVN0YXJ0KCksbz0wO288ZTsrK28pci5wb2ludCgoaT10W29dKVswXSxpWzFdKTtyZXR1cm4gdm9pZCByLmxpbmVFbmQoKX1hWzBdKz0yZS02fXMucHVzaChuPW5ldyBMYihpLHQsbnVsbCwhMCkpLGwucHVzaChuLm89bmV3IExiKGksbnVsbCxuLCExKSkscy5wdXNoKG49bmV3IExiKGEsdCxudWxsLCExKSksbC5wdXNoKG4ubz1uZXcgTGIoYSxudWxsLG4sITApKX19KSkscy5sZW5ndGgpe2ZvcihsLnNvcnQoZSksTmIocyksTmIobCksbz0wLGE9bC5sZW5ndGg7bzxhOysrbylsW29dLmU9bj0hbjtmb3IodmFyIGMsdSxoPXNbMF07Oyl7Zm9yKHZhciBkPWgscD0hMDtkLnY7KWlmKChkPWQubik9PT1oKXJldHVybjtjPWQueixyLmxpbmVTdGFydCgpO2Rve2lmKGQudj1kLm8udj0hMCxkLmUpe2lmKHApZm9yKG89MCxhPWMubGVuZ3RoO288YTsrK28pci5wb2ludCgodT1jW29dKVswXSx1WzFdKTtlbHNlIGkoZC54LGQubi54LDEscik7ZD1kLm59ZWxzZXtpZihwKWZvcihvPShjPWQucC56KS5sZW5ndGgtMTtvPj0wOy0tbylyLnBvaW50KCh1PWNbb10pWzBdLHVbMV0pO2Vsc2UgaShkLngsZC5wLngsLTEscik7ZD1kLnB9Yz0oZD1kLm8pLnoscD0hcH13aGlsZSghZC52KTtyLmxpbmVFbmQoKX19fWZ1bmN0aW9uIE5iKHQpe2lmKGU9dC5sZW5ndGgpe2Zvcih2YXIgZSxuLGk9MCxyPXRbMF07KytpPGU7KXIubj1uPXRbaV0sbi5wPXIscj1uO3Iubj1uPXRbMF0sbi5wPXJ9fWJiLmludmVydD1iYjt2YXIgSWI9TXkoKTtmdW5jdGlvbiBSYih0KXtyZXR1cm4genkodFswXSk8PUx5P3RbMF06V3kodFswXSkqKCh6eSh0WzBdKStMeSklSXktTHkpfWZ1bmN0aW9uIE9iKHQsZSl7dmFyIG49UmIoZSksaT1lWzFdLHI9R3koaSksbz1bR3kobiksLUh5KG4pLDBdLGE9MCxzPTA7SWIucmVzZXQoKSwxPT09cj9pPVB5K0F5Oi0xPT09ciYmKGk9LVB5LUF5KTtmb3IodmFyIGw9MCxjPXQubGVuZ3RoO2w8YzsrK2wpaWYoaD0odT10W2xdKS5sZW5ndGgpZm9yKHZhciB1LGgsZD11W2gtMV0scD1SYihkKSxmPWRbMV0vMitOeSxtPUd5KGYpLGc9SHkoZiksXz0wO188aDsrK18scD12LG09eCxnPXcsZD15KXt2YXIgeT11W19dLHY9UmIoeSksYj15WzFdLzIrTnkseD1HeShiKSx3PUh5KGIpLFM9di1wLE09Uz49MD8xOi0xLEU9TSpTLFQ9RT5MeSxDPW0qeDtpZihJYi5hZGQoQnkoQypNKkd5KEUpLGcqdytDKkh5KEUpKSksYSs9VD9TK00qSXk6UyxUXnA+PW5edj49bil7dmFyIEE9dnYoX3YoZCksX3YoeSkpO3d2KEEpO3ZhciBrPXZ2KG8sQSk7d3Yoayk7dmFyIEw9KFReUz49MD8tMToxKSokeShrWzJdKTsoaT5MfHxpPT09TCYmKEFbMF18fEFbMV0pKSYmKHMrPVReUz49MD8xOi0xKX19cmV0dXJuKGE8LTFlLTZ8fGE8QXkmJkliPC0xZS02KV4xJnN9ZnVuY3Rpb24gemIodCxlLG4saSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciBvLGEscyxsPWUociksYz1BYigpLHU9ZShjKSxoPSExLGQ9e3BvaW50OnAsbGluZVN0YXJ0Om0sbGluZUVuZDpnLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2QucG9pbnQ9XyxkLmxpbmVTdGFydD15LGQubGluZUVuZD12LGE9W10sbz1bXX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2QucG9pbnQ9cCxkLmxpbmVTdGFydD1tLGQubGluZUVuZD1nLGE9cWwoYSk7dmFyIHQ9T2IobyxpKTthLmxlbmd0aD8oaHx8KHIucG9seWdvblN0YXJ0KCksaD0hMCksUGIoYSxCYix0LG4scikpOnQmJihofHwoci5wb2x5Z29uU3RhcnQoKSxoPSEwKSxyLmxpbmVTdGFydCgpLG4obnVsbCxudWxsLDEsciksci5saW5lRW5kKCkpLGgmJihyLnBvbHlnb25FbmQoKSxoPSExKSxhPW89bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7ci5wb2x5Z29uU3RhcnQoKSxyLmxpbmVTdGFydCgpLG4obnVsbCxudWxsLDEsciksci5saW5lRW5kKCksci5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBwKGUsbil7dChlLG4pJiZyLnBvaW50KGUsbil9ZnVuY3Rpb24gZih0LGUpe2wucG9pbnQodCxlKX1mdW5jdGlvbiBtKCl7ZC5wb2ludD1mLGwubGluZVN0YXJ0KCl9ZnVuY3Rpb24gZygpe2QucG9pbnQ9cCxsLmxpbmVFbmQoKX1mdW5jdGlvbiBfKHQsZSl7cy5wdXNoKFt0LGVdKSx1LnBvaW50KHQsZSl9ZnVuY3Rpb24geSgpe3UubGluZVN0YXJ0KCkscz1bXX1mdW5jdGlvbiB2KCl7XyhzWzBdWzBdLHNbMF1bMV0pLHUubGluZUVuZCgpO3ZhciB0LGUsbixpLGw9dS5jbGVhbigpLGQ9Yy5yZXN1bHQoKSxwPWQubGVuZ3RoO2lmKHMucG9wKCksby5wdXNoKHMpLHM9bnVsbCxwKWlmKDEmbCl7aWYoKGU9KG49ZFswXSkubGVuZ3RoLTEpPjApe2ZvcihofHwoci5wb2x5Z29uU3RhcnQoKSxoPSEwKSxyLmxpbmVTdGFydCgpLHQ9MDt0PGU7Kyt0KXIucG9pbnQoKGk9blt0XSlbMF0saVsxXSk7ci5saW5lRW5kKCl9fWVsc2UgcD4xJiYyJmwmJmQucHVzaChkLnBvcCgpLmNvbmNhdChkLnNoaWZ0KCkpKSxhLnB1c2goZC5maWx0ZXIoRGIpKX1yZXR1cm4gZH19ZnVuY3Rpb24gRGIodCl7cmV0dXJuIHQubGVuZ3RoPjF9ZnVuY3Rpb24gQmIodCxlKXtyZXR1cm4oKHQ9dC54KVswXTwwP3RbMV0tUHktQXk6UHktdFsxXSktKChlPWUueClbMF08MD9lWzFdLVB5LUF5OlB5LWVbMV0pfXZhciBIYj16YigoZnVuY3Rpb24oKXtyZXR1cm4hMH0pLChmdW5jdGlvbiBGYih0KXt2YXIgZSxuPU5hTixpPU5hTixyPU5hTjtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5saW5lU3RhcnQoKSxlPTF9LHBvaW50OmZ1bmN0aW9uKG8sYSl7dmFyIHM9bz4wP0x5Oi1MeSxsPXp5KG8tbik7enkobC1MeSk8QXk/KHQucG9pbnQobixpPShpK2EpLzI+MD9QeTotUHkpLHQucG9pbnQocixpKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQocyxpKSx0LnBvaW50KG8saSksZT0wKTpyIT09cyYmbD49THkmJih6eShuLXIpPEF5JiYobi09cipBeSksenkoby1zKTxBeSYmKG8tPXMqQXkpLGk9KGZ1bmN0aW9uIGModCxlLG4saSl7dmFyIHIsbyxhPUd5KHQtbik7cmV0dXJuIHp5KGEpPkF5P0R5KChHeShlKSoobz1IeShpKSkqR3kobiktR3koaSkqKHI9SHkoZSkpKkd5KHQpKS8ocipvKmEpKTooZStpKS8yfSkobixpLG8sYSksdC5wb2ludChyLGkpLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludChzLGkpLGU9MCksdC5wb2ludChuPW8saT1hKSxyPXN9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0LmxpbmVFbmQoKSxuPWk9TmFOfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiAyLWV9fX0pLChmdW5jdGlvbiBWYih0LGUsbixpKXt2YXIgcjtpZihudWxsPT10KWkucG9pbnQoLUx5LHI9bipQeSksaS5wb2ludCgwLHIpLGkucG9pbnQoTHksciksaS5wb2ludChMeSwwKSxpLnBvaW50KEx5LC1yKSxpLnBvaW50KDAsLXIpLGkucG9pbnQoLUx5LC1yKSxpLnBvaW50KC1MeSwwKSxpLnBvaW50KC1MeSxyKTtlbHNlIGlmKHp5KHRbMF0tZVswXSk+QXkpe3ZhciBvPXRbMF08ZVswXT9MeTotTHk7aS5wb2ludCgtbyxyPW4qby8yKSxpLnBvaW50KDAsciksaS5wb2ludChvLHIpfWVsc2UgaS5wb2ludChlWzBdLGVbMV0pfSksWy1MeSwtUHldKTtmdW5jdGlvbiBVYih0KXt2YXIgZT1IeSh0KSxuPTYqT3ksaT1lPjAscj16eShlKT5BeTtmdW5jdGlvbiBvKHQsbil7cmV0dXJuIEh5KHQpKkh5KG4pPmV9ZnVuY3Rpb24gYSh0LG4saSl7dmFyIHI9WzEsMCwwXSxvPXZ2KF92KHQpLF92KG4pKSxhPXl2KG8sbykscz1vWzBdLGw9YS1zKnM7aWYoIWwpcmV0dXJuIWkmJnQ7dmFyIGM9ZSphL2wsdT0tZSpzL2wsaD12dihyLG8pLGQ9eHYocixjKTtidihkLHh2KG8sdSkpO3ZhciBwPWgsZj15dihkLHApLG09eXYocCxwKSxnPWYqZi1tKih5dihkLGQpLTEpO2lmKCEoZzwwKSl7dmFyIF89cXkoZykseT14dihwLCgtZi1fKS9tKTtpZihidih5LGQpLHk9Z3YoeSksIWkpcmV0dXJuIHk7dmFyIHYsYj10WzBdLHg9blswXSx3PXRbMV0sUz1uWzFdO3g8YiYmKHY9YixiPXgseD12KTt2YXIgTT14LWIsRT16eShNLUx5KTxBeTtpZighRSYmUzx3JiYodj13LHc9UyxTPXYpLEV8fE08QXk/RT93K1M+MF55WzFdPCh6eSh5WzBdLWIpPEF5P3c6Uyk6dzw9eVsxXSYmeVsxXTw9UzpNPkx5XihiPD15WzBdJiZ5WzBdPD14KSl7dmFyIFQ9eHYocCwoLWYrXykvbSk7cmV0dXJuIGJ2KFQsZCksW3ksZ3YoVCldfX19ZnVuY3Rpb24gcyhlLG4pe3ZhciByPWk/dDpMeS10LG89MDtyZXR1cm4gZTwtcj9vfD0xOmU+ciYmKG98PTIpLG48LXI/b3w9NDpuPnImJihvfD04KSxvfXJldHVybiB6YihvLChmdW5jdGlvbiBsKHQpe3ZhciBlLG4sbCxjLHU7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2M9bD0hMSx1PTF9LHBvaW50OmZ1bmN0aW9uKGgsZCl7dmFyIHAsZj1baCxkXSxtPW8oaCxkKSxnPWk/bT8wOnMoaCxkKTptP3MoaCsoaDwwP0x5Oi1MeSksZCk6MDtpZighZSYmKGM9bD1tKSYmdC5saW5lU3RhcnQoKSxtIT09bCYmKCEocD1hKGUsZikpfHxrYihlLHApfHxrYihmLHApKSYmKGZbMl09MSksbSE9PWwpdT0wLG0/KHQubGluZVN0YXJ0KCkscD1hKGYsZSksdC5wb2ludChwWzBdLHBbMV0pKToocD1hKGUsZiksdC5wb2ludChwWzBdLHBbMV0sMiksdC5saW5lRW5kKCkpLGU9cDtlbHNlIGlmKHImJmUmJmlebSl7dmFyIF87ZyZufHwhKF89YShmLGUsITApKXx8KHU9MCxpPyh0LmxpbmVTdGFydCgpLHQucG9pbnQoX1swXVswXSxfWzBdWzFdKSx0LnBvaW50KF9bMV1bMF0sX1sxXVsxXSksdC5saW5lRW5kKCkpOih0LnBvaW50KF9bMV1bMF0sX1sxXVsxXSksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KF9bMF1bMF0sX1swXVsxXSwzKSkpfSFtfHxlJiZrYihlLGYpfHx0LnBvaW50KGZbMF0sZlsxXSksZT1mLGw9bSxuPWd9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtsJiZ0LmxpbmVFbmQoKSxlPW51bGx9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIHV8KGMmJmwpPDwxfX19KSwoZnVuY3Rpb24gYyhlLGkscixvKXtUYihvLHQsbixyLGUsaSl9KSxpP1swLC10XTpbLUx5LHQtTHldKX12YXIgamI9MWU5LEdiPS1qYjtmdW5jdGlvbiBXYih0LGUsbixpKXtmdW5jdGlvbiByKHIsbyl7cmV0dXJuIHQ8PXImJnI8PW4mJmU8PW8mJm88PWl9ZnVuY3Rpb24gbyhyLG8scyxjKXt2YXIgdT0wLGg9MDtpZihudWxsPT1yfHwodT1hKHIscykpIT09KGg9YShvLHMpKXx8bChyLG8pPDBecz4wKWRve2MucG9pbnQoMD09PXV8fDM9PT11P3Q6bix1PjE/aTplKX13aGlsZSgodT0odStzKzQpJTQpIT09aCk7ZWxzZSBjLnBvaW50KG9bMF0sb1sxXSl9ZnVuY3Rpb24gYShpLHIpe3JldHVybiB6eShpWzBdLXQpPEF5P3I+MD8wOjM6enkoaVswXS1uKTxBeT9yPjA/MjoxOnp5KGlbMV0tZSk8QXk/cj4wPzE6MDpyPjA/MzoyfWZ1bmN0aW9uIHModCxlKXtyZXR1cm4gbCh0LngsZS54KX1mdW5jdGlvbiBsKHQsZSl7dmFyIG49YSh0LDEpLGk9YShlLDEpO3JldHVybiBuIT09aT9uLWk6MD09PW4/ZVsxXS10WzFdOjE9PT1uP3RbMF0tZVswXToyPT09bj90WzFdLWVbMV06ZVswXS10WzBdfXJldHVybiBmdW5jdGlvbihhKXt2YXIgbCxjLHUsaCxkLHAsZixtLGcsXyx5LHY9YSxiPUFiKCkseD17cG9pbnQ6VCxsaW5lU3RhcnQ6ZnVuY3Rpb24gdygpe3gucG9pbnQ9QyxjJiZjLnB1c2godT1bXSksXz0hMCxnPSExLGY9bT1OYU59LGxpbmVFbmQ6ZnVuY3Rpb24gUygpe2wmJihDKGgsZCkscCYmZyYmYi5yZWpvaW4oKSxsLnB1c2goYi5yZXN1bHQoKSkpLHgucG9pbnQ9VCxnJiZ2LmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uIE0oKXt2PWIsbD1bXSxjPVtdLHk9ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24gRSgpe3ZhciBlPShmdW5jdGlvbiBuKCl7Zm9yKHZhciBlPTAsbj0wLHI9Yy5sZW5ndGg7bjxyOysrbilmb3IodmFyIG8sYSxzPWNbbl0sbD0xLHU9cy5sZW5ndGgsaD1zWzBdLGQ9aFswXSxwPWhbMV07bDx1OysrbClvPWQsYT1wLGQ9KGg9c1tsXSlbMF0scD1oWzFdLGE8PWk/cD5pJiYoZC1vKSooaS1hKT4ocC1hKSoodC1vKSYmKytlOnA8PWkmJihkLW8pKihpLWEpPChwLWEpKih0LW8pJiYtLWU7cmV0dXJuIGV9KSgpLHI9eSYmZSxoPShsPXFsKGwpKS5sZW5ndGg7KHJ8fGgpJiYoYS5wb2x5Z29uU3RhcnQoKSxyJiYoYS5saW5lU3RhcnQoKSxvKG51bGwsbnVsbCwxLGEpLGEubGluZUVuZCgpKSxoJiZQYihsLHMsZSxvLGEpLGEucG9seWdvbkVuZCgpKSx2PWEsbD1jPXU9bnVsbH19O2Z1bmN0aW9uIFQodCxlKXtyKHQsZSkmJnYucG9pbnQodCxlKX1mdW5jdGlvbiBDKG8sYSl7dmFyIHM9cihvLGEpO2lmKGMmJnUucHVzaChbbyxhXSksXyloPW8sZD1hLHA9cyxfPSExLHMmJih2LmxpbmVTdGFydCgpLHYucG9pbnQobyxhKSk7ZWxzZSBpZihzJiZnKXYucG9pbnQobyxhKTtlbHNle3ZhciBsPVtmPU1hdGgubWF4KEdiLE1hdGgubWluKGpiLGYpKSxtPU1hdGgubWF4KEdiLE1hdGgubWluKGpiLG0pKV0sYj1bbz1NYXRoLm1heChHYixNYXRoLm1pbihqYixvKSksYT1NYXRoLm1heChHYixNYXRoLm1pbihqYixhKSldOyEoZnVuY3Rpb24geCh0LGUsbixpLHIsbyl7dmFyIGEscz10WzBdLGw9dFsxXSxjPTAsdT0xLGg9ZVswXS1zLGQ9ZVsxXS1sO2lmKGE9bi1zLGh8fCEoYT4wKSl7aWYoYS89aCxoPDApe2lmKGE8YylyZXR1cm47YTx1JiYodT1hKX1lbHNlIGlmKGg+MCl7aWYoYT51KXJldHVybjthPmMmJihjPWEpfWlmKGE9ci1zLGh8fCEoYTwwKSl7aWYoYS89aCxoPDApe2lmKGE+dSlyZXR1cm47YT5jJiYoYz1hKX1lbHNlIGlmKGg+MCl7aWYoYTxjKXJldHVybjthPHUmJih1PWEpfWlmKGE9aS1sLGR8fCEoYT4wKSl7aWYoYS89ZCxkPDApe2lmKGE8YylyZXR1cm47YTx1JiYodT1hKX1lbHNlIGlmKGQ+MCl7aWYoYT51KXJldHVybjthPmMmJihjPWEpfWlmKGE9by1sLGR8fCEoYTwwKSl7aWYoYS89ZCxkPDApe2lmKGE+dSlyZXR1cm47YT5jJiYoYz1hKX1lbHNlIGlmKGQ+MCl7aWYoYTxjKXJldHVybjthPHUmJih1PWEpfXJldHVybiBjPjAmJih0WzBdPXMrYypoLHRbMV09bCtjKmQpLHU8MSYmKGVbMF09cyt1KmgsZVsxXT1sK3UqZCksITB9fX19fSkobCxiLHQsZSxuLGkpP3MmJih2LmxpbmVTdGFydCgpLHYucG9pbnQobyxhKSx5PSExKTooZ3x8KHYubGluZVN0YXJ0KCksdi5wb2ludChsWzBdLGxbMV0pKSx2LnBvaW50KGJbMF0sYlsxXSksc3x8di5saW5lRW5kKCkseT0hMSl9Zj1vLG09YSxnPXN9cmV0dXJuIHh9fXZhciBxYixZYixYYiwkYj1NeSgpLEtiPXtzcGhlcmU6WnkscG9pbnQ6WnksbGluZVN0YXJ0OmZ1bmN0aW9uIFpiKCl7S2IucG9pbnQ9UWIsS2IubGluZUVuZD1KYn0sbGluZUVuZDpaeSxwb2x5Z29uU3RhcnQ6WnkscG9seWdvbkVuZDpaeX07ZnVuY3Rpb24gSmIoKXtLYi5wb2ludD1LYi5saW5lRW5kPVp5fWZ1bmN0aW9uIFFiKHQsZSl7cWI9dCo9T3ksWWI9R3koZSo9T3kpLFhiPUh5KGUpLEtiLnBvaW50PXR4fWZ1bmN0aW9uIHR4KHQsZSl7dCo9T3k7dmFyIG49R3koZSo9T3kpLGk9SHkoZSkscj16eSh0LXFiKSxvPUh5KHIpLGE9aSpHeShyKSxzPVhiKm4tWWIqaSpvLGw9WWIqbitYYippKm87JGIuYWRkKEJ5KHF5KGEqYStzKnMpLGwpKSxxYj10LFliPW4sWGI9aX1mdW5jdGlvbiBleCh0KXtyZXR1cm4gJGIucmVzZXQoKSxpdih0LEtiKSwrJGJ9dmFyIG54PVtudWxsLG51bGxdLGl4PXt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpueH07ZnVuY3Rpb24gcngodCxlKXtyZXR1cm4gbnhbMF09dCxueFsxXT1lLGV4KGl4KX12YXIgb3g9e0ZlYXR1cmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gc3godC5nZW9tZXRyeSxlKX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5mZWF0dXJlcyxpPS0xLHI9bi5sZW5ndGg7KytpPHI7KWlmKHN4KG5baV0uZ2VvbWV0cnksZSkpcmV0dXJuITA7cmV0dXJuITF9fSxheD17U3BoZXJlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBvaW50OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGx4KHQuY29vcmRpbmF0ZXMsZSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5jb29yZGluYXRlcyxpPS0xLHI9bi5sZW5ndGg7KytpPHI7KWlmKGx4KG5baV0sZSkpcmV0dXJuITA7cmV0dXJuITF9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxlKXtyZXR1cm4gY3godC5jb29yZGluYXRlcyxlKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuY29vcmRpbmF0ZXMsaT0tMSxyPW4ubGVuZ3RoOysraTxyOylpZihjeChuW2ldLGUpKXJldHVybiEwO3JldHVybiExfSxQb2x5Z29uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHV4KHQuY29vcmRpbmF0ZXMsZSl9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmNvb3JkaW5hdGVzLGk9LTEscj1uLmxlbmd0aDsrK2k8cjspaWYodXgobltpXSxlKSlyZXR1cm4hMDtyZXR1cm4hMX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZ2VvbWV0cmllcyxpPS0xLHI9bi5sZW5ndGg7KytpPHI7KWlmKHN4KG5baV0sZSkpcmV0dXJuITA7cmV0dXJuITF9fTtmdW5jdGlvbiBzeCh0LGUpe3JldHVybiEoIXR8fCFheC5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpKSYmYXhbdC50eXBlXSh0LGUpfWZ1bmN0aW9uIGx4KHQsZSl7cmV0dXJuIDA9PT1yeCh0LGUpfWZ1bmN0aW9uIGN4KHQsZSl7Zm9yKHZhciBuLGkscixvPTAsYT10Lmxlbmd0aDtvPGE7bysrKXtpZigwPT09KGk9cngodFtvXSxlKSkpcmV0dXJuITA7aWYobz4wJiYocj1yeCh0W29dLHRbby0xXSkpPjAmJm48PXImJmk8PXImJihuK2ktcikqKDEtTWF0aC5wb3coKG4taSkvciwyKSk8a3kqcilyZXR1cm4hMDtuPWl9cmV0dXJuITF9ZnVuY3Rpb24gdXgodCxlKXtyZXR1cm4hIU9iKHQubWFwKGh4KSxkeChlKSl9ZnVuY3Rpb24gaHgodCl7cmV0dXJuKHQ9dC5tYXAoZHgpKS5wb3AoKSx0fWZ1bmN0aW9uIGR4KHQpe3JldHVyblt0WzBdKk95LHRbMV0qT3ldfWZ1bmN0aW9uIHB4KHQsZSxuKXt2YXIgaT16bCh0LGUtQXksbikuY29uY2F0KGUpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVyblt0LGVdfSkpfX1mdW5jdGlvbiBmeCh0LGUsbil7dmFyIGk9emwodCxlLUF5LG4pLmNvbmNhdChlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGkubWFwKChmdW5jdGlvbihlKXtyZXR1cm5bZSx0XX0pKX19ZnVuY3Rpb24gbXgoKXt2YXIgdCxlLG4saSxyLG8sYSxzLGwsYyx1LGgsZD0xMCxwPWQsZj05MCxtPTM2MCxnPTIuNTtmdW5jdGlvbiBfKCl7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6eSgpfX1mdW5jdGlvbiB5KCl7cmV0dXJuIHpsKEZ5KGkvZikqZixuLGYpLm1hcCh1KS5jb25jYXQoemwoRnkocy9tKSptLGEsbSkubWFwKGgpKS5jb25jYXQoemwoRnkoZS9kKSpkLHQsZCkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4genkodCVmKT5BeX0pKS5tYXAobCkpLmNvbmNhdCh6bChGeShvL3ApKnAscixwKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB6eSh0JW0pPkF5fSkpLm1hcChjKSl9cmV0dXJuIF8ubGluZXM9ZnVuY3Rpb24oKXtyZXR1cm4geSgpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnR9fSkpfSxfLm91dGxpbmU9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3UoaSkuY29uY2F0KGgoYSkuc2xpY2UoMSksdShuKS5yZXZlcnNlKCkuc2xpY2UoMSksaChzKS5yZXZlcnNlKCkuc2xpY2UoMSkpXX19LF8uZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP18uZXh0ZW50TWFqb3IodCkuZXh0ZW50TWlub3IodCk6Xy5leHRlbnRNaW5vcigpfSxfLmV4dGVudE1ham9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0WzBdWzFdLGE9K3RbMV1bMV0sKGk9K3RbMF1bMF0pPihuPSt0WzFdWzBdKSYmKHQ9aSxpPW4sbj10KSxzPmEmJih0PXMscz1hLGE9dCksXy5wcmVjaXNpb24oZykpOltbaSxzXSxbbixhXV19LF8uZXh0ZW50TWlub3I9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K25bMF1bMV0scj0rblsxXVsxXSwoZT0rblswXVswXSk+KHQ9K25bMV1bMF0pJiYobj1lLGU9dCx0PW4pLG8+ciYmKG49byxvPXIscj1uKSxfLnByZWNpc2lvbihnKSk6W1tlLG9dLFt0LHJdXX0sXy5zdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP18uc3RlcE1ham9yKHQpLnN0ZXBNaW5vcih0KTpfLnN0ZXBNaW5vcigpfSxfLnN0ZXBNYWpvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0rdFswXSxtPSt0WzFdLF8pOltmLG1dfSxfLnN0ZXBNaW5vcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD0rdFswXSxwPSt0WzFdLF8pOltkLHBdfSxfLnByZWNpc2lvbj1mdW5jdGlvbihkKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz0rZCxsPXB4KG8sciw5MCksYz1meChlLHQsZyksdT1weChzLGEsOTApLGg9ZngoaSxuLGcpLF8pOmd9LF8uZXh0ZW50TWFqb3IoW1stMTgwLC04OS45OTk5OTldLFsxODAsODkuOTk5OTk5XV0pLmV4dGVudE1pbm9yKFtbLTE4MCwtODAuMDAwMDAxXSxbMTgwLDgwLjAwMDAwMV1dKX1mdW5jdGlvbiBneCh0KXtyZXR1cm4gdH12YXIgX3gseXgsdngsYngseHg9TXkoKSx3eD1NeSgpLFN4PXtwb2ludDpaeSxsaW5lU3RhcnQ6WnksbGluZUVuZDpaeSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtTeC5saW5lU3RhcnQ9TXgsU3gubGluZUVuZD1DeH0scG9seWdvbkVuZDpmdW5jdGlvbigpe1N4LmxpbmVTdGFydD1TeC5saW5lRW5kPVN4LnBvaW50PVp5LHh4LmFkZCh6eSh3eCkpLHd4LnJlc2V0KCl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PXh4LzI7cmV0dXJuIHh4LnJlc2V0KCksdH19O2Z1bmN0aW9uIE14KCl7U3gucG9pbnQ9RXh9ZnVuY3Rpb24gRXgodCxlKXtTeC5wb2ludD1UeCxfeD12eD10LHl4PWJ4PWV9ZnVuY3Rpb24gVHgodCxlKXt3eC5hZGQoYngqdC12eCplKSx2eD10LGJ4PWV9ZnVuY3Rpb24gQ3goKXtUeChfeCx5eCl9dmFyIEF4LGt4LEx4LFB4LE54PVN4LEl4PTEvMCxSeD1JeCxPeD0tSXgseng9T3gsRHg9e3BvaW50OmZ1bmN0aW9uIEJ4KHQsZSl7dDxJeCYmKEl4PXQpLHQ+T3gmJihPeD10KSxlPFJ4JiYoUng9ZSksZT56eCYmKHp4PWUpfSxsaW5lU3RhcnQ6WnksbGluZUVuZDpaeSxwb2x5Z29uU3RhcnQ6WnkscG9seWdvbkVuZDpaeSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD1bW0l4LFJ4XSxbT3gsenhdXTtyZXR1cm4gT3g9eng9LShSeD1JeD0xLzApLHR9fSxIeD0wLEZ4PTAsVng9MCxVeD0wLGp4PTAsR3g9MCxXeD0wLHF4PTAsWXg9MCxYeD17cG9pbnQ6JHgsbGluZVN0YXJ0Okt4LGxpbmVFbmQ6UXgscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7WHgubGluZVN0YXJ0PXR3LFh4LmxpbmVFbmQ9ZXd9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtYeC5wb2ludD0keCxYeC5saW5lU3RhcnQ9S3gsWHgubGluZUVuZD1ReH0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9WXg/W1d4L1l4LHF4L1l4XTpHeD9bVXgvR3gsangvR3hdOlZ4P1tIeC9WeCxGeC9WeF06W05hTixOYU5dO3JldHVybiBIeD1GeD1WeD1VeD1qeD1HeD1XeD1xeD1ZeD0wLHR9fTtmdW5jdGlvbiAkeCh0LGUpe0h4Kz10LEZ4Kz1lLCsrVnh9ZnVuY3Rpb24gS3goKXtYeC5wb2ludD1aeH1mdW5jdGlvbiBaeCh0LGUpe1h4LnBvaW50PUp4LCR4KEx4PXQsUHg9ZSl9ZnVuY3Rpb24gSngodCxlKXt2YXIgbj10LUx4LGk9ZS1QeCxyPXF5KG4qbitpKmkpO1V4Kz1yKihMeCt0KS8yLGp4Kz1yKihQeCtlKS8yLEd4Kz1yLCR4KEx4PXQsUHg9ZSl9ZnVuY3Rpb24gUXgoKXtYeC5wb2ludD0keH1mdW5jdGlvbiB0dygpe1h4LnBvaW50PW53fWZ1bmN0aW9uIGV3KCl7aXcoQXgsa3gpfWZ1bmN0aW9uIG53KHQsZSl7WHgucG9pbnQ9aXcsJHgoQXg9THg9dCxreD1QeD1lKX1mdW5jdGlvbiBpdyh0LGUpe3ZhciBuPXQtTHgsaT1lLVB4LHI9cXkobipuK2kqaSk7VXgrPXIqKEx4K3QpLzIsangrPXIqKFB4K2UpLzIsR3grPXIsV3grPShyPVB4KnQtTHgqZSkqKEx4K3QpLHF4Kz1yKihQeCtlKSxZeCs9MypyLCR4KEx4PXQsUHg9ZSl9dmFyIHJ3PVh4O2Z1bmN0aW9uIG93KHQpe3RoaXMuX2NvbnRleHQ9dH1vdy5wcm90b3R5cGU9e19yYWRpdXM6NC41LHBvaW50UmFkaXVzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yYWRpdXM9dCx0aGlzfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpezA9PT10aGlzLl9saW5lJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX3BvaW50PU5hTn0scG9pbnQ6ZnVuY3Rpb24odCxlKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX2NvbnRleHQubGluZVRvKHQsZSk7YnJlYWs7ZGVmYXVsdDp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0K3RoaXMuX3JhZGl1cyxlKSx0aGlzLl9jb250ZXh0LmFyYyh0LGUsdGhpcy5fcmFkaXVzLDAsSXkpfX0scmVzdWx0Olp5fTt2YXIgYXcsc3csbHcsY3csdXcsaHc9TXkoKSxkdz17cG9pbnQ6WnksbGluZVN0YXJ0OmZ1bmN0aW9uKCl7ZHcucG9pbnQ9cHd9LGxpbmVFbmQ6ZnVuY3Rpb24oKXthdyYmZncoc3csbHcpLGR3LnBvaW50PVp5fSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXthdz0hMH0scG9seWdvbkVuZDpmdW5jdGlvbigpe2F3PW51bGx9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PStodztyZXR1cm4gaHcucmVzZXQoKSx0fX07ZnVuY3Rpb24gcHcodCxlKXtkdy5wb2ludD1mdyxzdz1jdz10LGx3PXV3PWV9ZnVuY3Rpb24gZncodCxlKXtody5hZGQocXkoKGN3LT10KSpjdysodXctPWUpKnV3KSksY3c9dCx1dz1lfXZhciBtdz1kdztmdW5jdGlvbiBndygpe3RoaXMuX3N0cmluZz1bXX1mdW5jdGlvbiBfdyh0KXtyZXR1cm4ibTAsIit0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKy0yKnQrImEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrMip0KyJ6In1mdW5jdGlvbiB5dyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49bmV3IHZ3O2Zvcih2YXIgaSBpbiB0KW5baV09dFtpXTtyZXR1cm4gbi5zdHJlYW09ZSxufX1mdW5jdGlvbiB2dygpe31mdW5jdGlvbiBidyh0LGUsbil7dmFyIGk9dC5jbGlwRXh0ZW50JiZ0LmNsaXBFeHRlbnQoKTtyZXR1cm4gdC5zY2FsZSgxNTApLnRyYW5zbGF0ZShbMCwwXSksbnVsbCE9aSYmdC5jbGlwRXh0ZW50KG51bGwpLGl2KG4sdC5zdHJlYW0oRHgpKSxlKER4LnJlc3VsdCgpKSxudWxsIT1pJiZ0LmNsaXBFeHRlbnQoaSksdH1mdW5jdGlvbiB4dyh0LGUsbil7cmV0dXJuIGJ3KHQsKGZ1bmN0aW9uKG4pe3ZhciBpPWVbMV1bMF0tZVswXVswXSxyPWVbMV1bMV0tZVswXVsxXSxvPU1hdGgubWluKGkvKG5bMV1bMF0tblswXVswXSksci8oblsxXVsxXS1uWzBdWzFdKSksYT0rZVswXVswXSsoaS1vKihuWzFdWzBdK25bMF1bMF0pKS8yLHM9K2VbMF1bMV0rKHItbyooblsxXVsxXStuWzBdWzFdKSkvMjt0LnNjYWxlKDE1MCpvKS50cmFuc2xhdGUoW2Esc10pfSksbil9ZnVuY3Rpb24gd3codCxlLG4pe3JldHVybiB4dyh0LFtbMCwwXSxlXSxuKX1mdW5jdGlvbiBTdyh0LGUsbil7cmV0dXJuIGJ3KHQsKGZ1bmN0aW9uKG4pe3ZhciBpPStlLHI9aS8oblsxXVswXS1uWzBdWzBdKSxvPShpLXIqKG5bMV1bMF0rblswXVswXSkpLzIsYT0tcipuWzBdWzFdO3Quc2NhbGUoMTUwKnIpLnRyYW5zbGF0ZShbbyxhXSl9KSxuKX1mdW5jdGlvbiBNdyh0LGUsbil7cmV0dXJuIGJ3KHQsKGZ1bmN0aW9uKG4pe3ZhciBpPStlLHI9aS8oblsxXVsxXS1uWzBdWzFdKSxvPS1yKm5bMF1bMF0sYT0oaS1yKihuWzFdWzFdK25bMF1bMV0pKS8yO3Quc2NhbGUoMTUwKnIpLnRyYW5zbGF0ZShbbyxhXSl9KSxuKX1ndy5wcm90b3R5cGU9e19yYWRpdXM6NC41LF9jaXJjbGU6X3coNC41KSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4odD0rdCkhPT10aGlzLl9yYWRpdXMmJih0aGlzLl9yYWRpdXM9dCx0aGlzLl9jaXJjbGU9bnVsbCksdGhpc30scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPT09dGhpcy5fbGluZSYmdGhpcy5fc3RyaW5nLnB1c2goIloiKSx0aGlzLl9wb2ludD1OYU59LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fc3RyaW5nLnB1c2goIk0iLHQsIiwiLGUpLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3N0cmluZy5wdXNoKCJMIix0LCIsIixlKTticmVhaztkZWZhdWx0Om51bGw9PXRoaXMuX2NpcmNsZSYmKHRoaXMuX2NpcmNsZT1fdyh0aGlzLl9yYWRpdXMpKSx0aGlzLl9zdHJpbmcucHVzaCgiTSIsdCwiLCIsZSx0aGlzLl9jaXJjbGUpfX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYodGhpcy5fc3RyaW5nLmxlbmd0aCl7dmFyIHQ9dGhpcy5fc3RyaW5nLmpvaW4oIiIpO3JldHVybiB0aGlzLl9zdHJpbmc9W10sdH1yZXR1cm4gbnVsbH19LHZ3LnByb3RvdHlwZT17Y29uc3RydWN0b3I6dncscG9pbnQ6ZnVuY3Rpb24odCxlKXt0aGlzLnN0cmVhbS5wb2ludCh0LGUpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX07dmFyIEV3PUh5KDMwKk95KTtmdW5jdGlvbiBUdyh0LGUpe3JldHVybitlPyhmdW5jdGlvbiBuKHQsZSl7ZnVuY3Rpb24gbihpLHIsbyxhLHMsbCxjLHUsaCxkLHAsZixtLGcpe3ZhciBfPWMtaSx5PXUtcix2PV8qXyt5Knk7aWYodj40KmUmJm0tLSl7dmFyIGI9YStkLHg9cytwLHc9bCtmLFM9cXkoYipiK3gqeCt3KncpLE09JHkody89UyksRT16eSh6eSh3KS0xKTxBeXx8enkoby1oKTxBeT8obytoKS8yOkJ5KHgsYiksVD10KEUsTSksQz1UWzBdLEE9VFsxXSxrPUMtaSxMPUEtcixQPXkqay1fKkw7KFAqUC92PmV8fHp5KChfKmsreSpMKS92LS41KT4uM3x8YSpkK3MqcCtsKmY8RXcpJiYobihpLHIsbyxhLHMsbCxDLEEsRSxiLz1TLHgvPVMsdyxtLGcpLGcucG9pbnQoQyxBKSxuKEMsQSxFLGIseCx3LGMsdSxoLGQscCxmLG0sZykpfX1yZXR1cm4gZnVuY3Rpb24oZSl7dmFyIGkscixvLGEscyxsLGMsdSxoLGQscCxmLG09e3BvaW50OmcsbGluZVN0YXJ0Ol8sbGluZUVuZDp2LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2UucG9seWdvblN0YXJ0KCksbS5saW5lU3RhcnQ9Yn0scG9seWdvbkVuZDpmdW5jdGlvbigpe2UucG9seWdvbkVuZCgpLG0ubGluZVN0YXJ0PV99fTtmdW5jdGlvbiBnKG4saSl7bj10KG4saSksZS5wb2ludChuWzBdLG5bMV0pfWZ1bmN0aW9uIF8oKXt1PU5hTixtLnBvaW50PXksZS5saW5lU3RhcnQoKX1mdW5jdGlvbiB5KGkscil7dmFyIG89X3YoW2kscl0pLGE9dChpLHIpO24odSxoLGMsZCxwLGYsdT1hWzBdLGg9YVsxXSxjPWksZD1vWzBdLHA9b1sxXSxmPW9bMl0sMTYsZSksZS5wb2ludCh1LGgpfWZ1bmN0aW9uIHYoKXttLnBvaW50PWcsZS5saW5lRW5kKCl9ZnVuY3Rpb24gYigpe18oKSxtLnBvaW50PXgsbS5saW5lRW5kPXd9ZnVuY3Rpb24geCh0LGUpe3koaT10LGUpLHI9dSxvPWgsYT1kLHM9cCxsPWYsbS5wb2ludD15fWZ1bmN0aW9uIHcoKXtuKHUsaCxjLGQscCxmLHIsbyxpLGEscyxsLDE2LGUpLG0ubGluZUVuZD12LHYoKX1yZXR1cm4gbX19KSh0LGUpOihmdW5jdGlvbiBpKHQpe3JldHVybiB5dyh7cG9pbnQ6ZnVuY3Rpb24oZSxuKXtlPXQoZSxuKSx0aGlzLnN0cmVhbS5wb2ludChlWzBdLGVbMV0pfX0pfSkodCl9dmFyIEN3PXl3KHtwb2ludDpmdW5jdGlvbih0LGUpe3RoaXMuc3RyZWFtLnBvaW50KHQqT3ksZSpPeSl9fSk7ZnVuY3Rpb24gQXcodCxlLG4saSxyKXtmdW5jdGlvbiBvKG8sYSl7cmV0dXJuW2UrdCoobyo9aSksbi10KihhKj1yKV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKG8sYSl7cmV0dXJuWyhvLWUpL3QqaSwobi1hKS90KnJdfSxvfWZ1bmN0aW9uIGt3KHQsZSxuLGkscixvKXt2YXIgYT1IeShvKSxzPUd5KG8pLGw9YSp0LGM9cyp0LHU9YS90LGg9cy90LGQ9KHMqbi1hKmUpL3QscD0ocyplK2EqbikvdDtmdW5jdGlvbiBmKHQsbyl7cmV0dXJuW2wqKHQqPWkpLWMqKG8qPXIpK2Usbi1jKnQtbCpvXX1yZXR1cm4gZi5pbnZlcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm5baSoodSp0LWgqZStkKSxyKihwLWgqdC11KmUpXX0sZn1mdW5jdGlvbiBMdyh0KXtyZXR1cm4gUHcoKGZ1bmN0aW9uKCl7cmV0dXJuIHR9KSkoKX1mdW5jdGlvbiBQdyh0KXt2YXIgZSxuLGkscixvLGEscyxsLGMsdSxoPTE1MCxkPTQ4MCxwPTI1MCxmPTAsbT0wLGc9MCxfPTAseT0wLHY9MCxiPTEseD0xLHc9bnVsbCxTPUhiLE09bnVsbCxFPWd4LFQ9LjU7ZnVuY3Rpb24gQyh0KXtyZXR1cm4gbCh0WzBdKk95LHRbMV0qT3kpfWZ1bmN0aW9uIEEodCl7cmV0dXJuKHQ9bC5pbnZlcnQodFswXSx0WzFdKSkmJlt0WzBdKlJ5LHRbMV0qUnldfWZ1bmN0aW9uIGsoKXt2YXIgdD1rdyhoLDAsMCxiLHgsdikuYXBwbHkobnVsbCxlKGYsbSkpLGk9KHY/a3c6QXcpKGgsZC10WzBdLHAtdFsxXSxiLHgsdik7cmV0dXJuIG49eGIoZyxfLHkpLHM9dmIoZSxpKSxsPXZiKG4scyksYT1UdyhzLFQpLEwoKX1mdW5jdGlvbiBMKCl7cmV0dXJuIGM9dT1udWxsLEN9cmV0dXJuIEMuc3RyZWFtPWZ1bmN0aW9uKHQpe3JldHVybiBjJiZ1PT09dD9jOmM9Q3coKGZ1bmN0aW9uIGUodCl7cmV0dXJuIHl3KHtwb2ludDpmdW5jdGlvbihlLG4pe3ZhciBpPXQoZSxuKTtyZXR1cm4gdGhpcy5zdHJlYW0ucG9pbnQoaVswXSxpWzFdKX19KX0pKG4pKFMoYShFKHU9dCkpKSkpfSxDLnByZWNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KFM9dCx3PXZvaWQgMCxMKCkpOlN9LEMucG9zdGNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEU9dCxNPWk9cj1vPW51bGwsTCgpKTpFfSxDLmNsaXBBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oUz0rdD9VYih3PXQqT3kpOih3PW51bGwsSGIpLEwoKSk6dypSeX0sQy5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhFPW51bGw9PXQ/KE09aT1yPW89bnVsbCxneCk6V2IoTT0rdFswXVswXSxpPSt0WzBdWzFdLHI9K3RbMV1bMF0sbz0rdFsxXVsxXSksTCgpKTpudWxsPT1NP251bGw6W1tNLGldLFtyLG9dXX0sQy5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdCxrKCkpOmh9LEMudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSt0WzBdLHA9K3RbMV0saygpKTpbZCxwXX0sQy5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9dFswXSUzNjAqT3ksbT10WzFdJTM2MCpPeSxrKCkpOltmKlJ5LG0qUnldfSxDLnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz10WzBdJTM2MCpPeSxfPXRbMV0lMzYwKk95LHk9dC5sZW5ndGg+Mj90WzJdJTM2MCpPeTowLGsoKSk6W2cqUnksXypSeSx5KlJ5XX0sQy5hbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj10JTM2MCpPeSxrKCkpOnYqUnl9LEMucmVmbGVjdFg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGI9dD8tMToxLGsoKSk6YjwwfSxDLnJlZmxlY3RZPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PXQ/LTE6MSxrKCkpOng8MH0sQy5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9VHcocyxUPXQqdCksTCgpKTpxeShUKX0sQy5maXRFeHRlbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4geHcoQyx0LGUpfSxDLmZpdFNpemU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gd3coQyx0LGUpfSxDLmZpdFdpZHRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFN3KEMsdCxlKX0sQy5maXRIZWlnaHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTXcoQyx0LGUpfSxmdW5jdGlvbigpe3JldHVybiBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpLEMuaW52ZXJ0PWUuaW52ZXJ0JiZBLGsoKX19ZnVuY3Rpb24gTncodCl7dmFyIGU9MCxuPUx5LzMsaT1Qdyh0KSxyPWkoZSxuKTtyZXR1cm4gci5wYXJhbGxlbHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/aShlPXRbMF0qT3ksbj10WzFdKk95KTpbZSpSeSxuKlJ5XX0scn1mdW5jdGlvbiBJdyh0LGUpe3ZhciBuPUd5KHQpLGk9KG4rR3koZSkpLzI7aWYoenkoaSk8QXkpcmV0dXJuKGZ1bmN0aW9uIHIodCl7dmFyIGU9SHkodCk7ZnVuY3Rpb24gbih0LG4pe3JldHVyblt0KmUsR3kobikvZV19cmV0dXJuIG4uaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuW3QvZSwkeShuKmUpXX0sbn0pKHQpO3ZhciBvPTErbiooMippLW4pLGE9cXkobykvaTtmdW5jdGlvbiBzKHQsZSl7dmFyIG49cXkoby0yKmkqR3koZSkpL2k7cmV0dXJuW24qR3kodCo9aSksYS1uKkh5KHQpXX1yZXR1cm4gcy5pbnZlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1hLWUscj1CeSh0LHp5KG4pKSpXeShuKTtyZXR1cm4gbippPDAmJihyLT1MeSpXeSh0KSpXeShuKSksW3IvaSwkeSgoby0odCp0K24qbikqaSppKS8oMippKSldfSxzfWZ1bmN0aW9uIFJ3KCl7cmV0dXJuIE53KEl3KS5zY2FsZSgxNTUuNDI0KS5jZW50ZXIoWzAsMzMuNjQ0Ml0pfWZ1bmN0aW9uIE93KCl7cmV0dXJuIFJ3KCkucGFyYWxsZWxzKFsyOS41LDQ1LjVdKS5zY2FsZSgxMDcwKS50cmFuc2xhdGUoWzQ4MCwyNTBdKS5yb3RhdGUoWzk2LDBdKS5jZW50ZXIoWy0uNiwzOC43XSl9ZnVuY3Rpb24gencodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIGk9SHkoZSkscj1IeShuKSxvPXQoaSpyKTtyZXR1cm5bbypyKkd5KGUpLG8qR3kobildfX1mdW5jdGlvbiBEdyh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgaT1xeShlKmUrbipuKSxyPXQoaSksbz1HeShyKSxhPUh5KHIpO3JldHVybltCeShlKm8saSphKSwkeShpJiZuKm8vaSldfX12YXIgQnc9encoKGZ1bmN0aW9uKHQpe3JldHVybiBxeSgyLygxK3QpKX0pKTtCdy5pbnZlcnQ9RHcoKGZ1bmN0aW9uKHQpe3JldHVybiAyKiR5KHQvMil9KSk7dmFyIEh3PXp3KChmdW5jdGlvbih0KXtyZXR1cm4odD1YeSh0KSkmJnQvR3kodCl9KSk7ZnVuY3Rpb24gRncodCxlKXtyZXR1cm5bdCxVeShZeSgoUHkrZSkvMikpXX1mdW5jdGlvbiBWdyh0KXt2YXIgZSxuLGkscj1Mdyh0KSxvPXIuY2VudGVyLGE9ci5zY2FsZSxzPXIudHJhbnNsYXRlLGw9ci5jbGlwRXh0ZW50LGM9bnVsbDtmdW5jdGlvbiB1KCl7dmFyIG89THkqYSgpLHM9cihFYihyLnJvdGF0ZSgpKS5pbnZlcnQoWzAsMF0pKTtyZXR1cm4gbChudWxsPT1jP1tbc1swXS1vLHNbMV0tb10sW3NbMF0rbyxzWzFdK29dXTp0PT09Rnc/W1tNYXRoLm1heChzWzBdLW8sYyksZV0sW01hdGgubWluKHNbMF0rbyxuKSxpXV06W1tjLE1hdGgubWF4KHNbMV0tbyxlKV0sW24sTWF0aC5taW4oc1sxXStvLGkpXV0pfXJldHVybiByLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhKHQpLHUoKSk6YSgpfSxyLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocyh0KSx1KCkpOnMoKX0sci5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG8odCksdSgpKTpvKCl9LHIuY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9jPWU9bj1pPW51bGw6KGM9K3RbMF1bMF0sZT0rdFswXVsxXSxuPSt0WzFdWzBdLGk9K3RbMV1bMV0pLHUoKSk6bnVsbD09Yz9udWxsOltbYyxlXSxbbixpXV19LHUoKX1mdW5jdGlvbiBVdyh0KXtyZXR1cm4gWXkoKFB5K3QpLzIpfWZ1bmN0aW9uIGp3KHQsZSl7dmFyIG49SHkodCksaT10PT09ZT9HeSh0KTpVeShuL0h5KGUpKS9VeShVdyhlKS9Vdyh0KSkscj1uKmp5KFV3KHQpLGkpL2k7aWYoIWkpcmV0dXJuIEZ3O2Z1bmN0aW9uIG8odCxlKXtyPjA/ZTwtUHkrQXkmJihlPS1QeStBeSk6ZT5QeS1BeSYmKGU9UHktQXkpO3ZhciBuPXIvankoVXcoZSksaSk7cmV0dXJuW24qR3koaSp0KSxyLW4qSHkoaSp0KV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ci1lLG89V3koaSkqcXkodCp0K24qbiksYT1CeSh0LHp5KG4pKSpXeShuKTtyZXR1cm4gbippPDAmJihhLT1MeSpXeSh0KSpXeShuKSksW2EvaSwyKkR5KGp5KHIvbywxL2kpKS1QeV19LG99ZnVuY3Rpb24gR3codCxlKXtyZXR1cm5bdCxlXX1mdW5jdGlvbiBXdyh0LGUpe3ZhciBuPUh5KHQpLGk9dD09PWU/R3kodCk6KG4tSHkoZSkpLyhlLXQpLHI9bi9pK3Q7aWYoenkoaSk8QXkpcmV0dXJuIEd3O2Z1bmN0aW9uIG8odCxlKXt2YXIgbj1yLWUsbz1pKnQ7cmV0dXJuW24qR3kobyksci1uKkh5KG8pXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1yLWUsbz1CeSh0LHp5KG4pKSpXeShuKTtyZXR1cm4gbippPDAmJihvLT1MeSpXeSh0KSpXeShuKSksW28vaSxyLVd5KGkpKnF5KHQqdCtuKm4pXX0sb31Idy5pbnZlcnQ9RHcoKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpLEZ3LmludmVydD1mdW5jdGlvbih0LGUpe3JldHVyblt0LDIqRHkoVnkoZSkpLVB5XX0sR3cuaW52ZXJ0PUd3O3ZhciBxdz0xLjM0MDI2NCxZdz0tLjA4MTEwNixYdz04OTNlLTYsJHc9LjAwMzc5NixLdz1xeSgzKS8yO2Z1bmN0aW9uIFp3KHQsZSl7dmFyIG49JHkoS3cqR3koZSkpLGk9bipuLHI9aSppKmk7cmV0dXJuW3QqSHkobikvKEt3KihxdyszKll3KmkrciooNypYdys5KiR3KmkpKSksbioocXcrWXcqaStyKihYdyskdyppKSldfWZ1bmN0aW9uIEp3KHQsZSl7dmFyIG49SHkoZSksaT1IeSh0KSpuO3JldHVybltuKkd5KHQpL2ksR3koZSkvaV19ZnVuY3Rpb24gUXcodCxlKXt2YXIgbj1lKmUsaT1uKm47cmV0dXJuW3QqKC44NzA3LS4xMzE5NzkqbitpKihpKiguMDAzOTcxKm4tLjAwMTUyOSppKS0uMDEzNzkxKSksZSooMS4wMDcyMjYrbiooLjAxNTA4NStpKiguMDI4ODc0Km4tLjA0NDQ3NS0uMDA1OTE2KmkpKSldfWZ1bmN0aW9uIHRTKHQsZSl7cmV0dXJuW0h5KGUpKkd5KHQpLEd5KGUpXX1mdW5jdGlvbiBlUyh0LGUpe3ZhciBuPUh5KGUpLGk9MStIeSh0KSpuO3JldHVybltuKkd5KHQpL2ksR3koZSkvaV19ZnVuY3Rpb24gblModCxlKXtyZXR1cm5bVXkoWXkoKFB5K2UpLzIpKSwtdF19ZnVuY3Rpb24gaVModCxlKXtyZXR1cm4gdC5wYXJlbnQ9PT1lLnBhcmVudD8xOjJ9ZnVuY3Rpb24gclModCxlKXtyZXR1cm4gdCtlLnh9ZnVuY3Rpb24gb1ModCxlKXtyZXR1cm4gTWF0aC5tYXgodCxlLnkpfWZ1bmN0aW9uIGFTKHQpe3ZhciBlPTAsbj10LmNoaWxkcmVuLGk9biYmbi5sZW5ndGg7aWYoaSlmb3IoOy0taT49MDspZSs9bltpXS52YWx1ZTtlbHNlIGU9MTt0LnZhbHVlPWV9ZnVuY3Rpb24gc1ModCxlKXt2YXIgbixpLHIsbyxhLHM9bmV3IGhTKHQpLGw9K3QudmFsdWUmJihzLnZhbHVlPXQudmFsdWUpLGM9W3NdO2ZvcihudWxsPT1lJiYoZT1sUyk7bj1jLnBvcCgpOylpZihsJiYobi52YWx1ZT0rbi5kYXRhLnZhbHVlKSwocj1lKG4uZGF0YSkpJiYoYT1yLmxlbmd0aCkpZm9yKG4uY2hpbGRyZW49bmV3IEFycmF5KGEpLG89YS0xO28+PTA7LS1vKWMucHVzaChpPW4uY2hpbGRyZW5bb109bmV3IGhTKHJbb10pKSxpLnBhcmVudD1uLGkuZGVwdGg9bi5kZXB0aCsxO3JldHVybiBzLmVhY2hCZWZvcmUodVMpfWZ1bmN0aW9uIGxTKHQpe3JldHVybiB0LmNoaWxkcmVufWZ1bmN0aW9uIGNTKHQpe3QuZGF0YT10LmRhdGEuZGF0YX1mdW5jdGlvbiB1Uyh0KXt2YXIgZT0wO2Rve3QuaGVpZ2h0PWV9d2hpbGUoKHQ9dC5wYXJlbnQpJiZ0LmhlaWdodDwrK2UpfWZ1bmN0aW9uIGhTKHQpe3RoaXMuZGF0YT10LHRoaXMuZGVwdGg9dGhpcy5oZWlnaHQ9MCx0aGlzLnBhcmVudD1udWxsfVp3LmludmVydD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbixpPWUscj1pKmksbz1yKnIqcixhPTA7YTwxMiYmKG89KHI9KGktPW49KGkqKHF3K1l3KnIrbyooWHcrJHcqcikpLWUpLyhxdyszKll3KnIrbyooNypYdys5KiR3KnIpKSkqaSkqcipyLCEoenkobik8a3kpKTsrK2EpO3JldHVybltLdyp0KihxdyszKll3KnIrbyooNypYdys5KiR3KnIpKS9IeShpKSwkeShHeShpKS9LdyldfSxKdy5pbnZlcnQ9RHcoRHkpLFF3LmludmVydD1mdW5jdGlvbih0LGUpe3ZhciBuLGk9ZSxyPTI1O2Rve3ZhciBvPWkqaSxhPW8qbztpLT1uPShpKigxLjAwNzIyNitvKiguMDE1MDg1K2EqKC4wMjg4NzQqby0uMDQ0NDc1LS4wMDU5MTYqYSkpKS1lKS8oMS4wMDcyMjYrbyooLjA0NTI1NSthKiguMjU5ODY2Km8tLjMxMTMyNS0uMDA1OTE2KjExKmEpKSl9d2hpbGUoenkobik+QXkmJi0tcj4wKTtyZXR1cm5bdC8oLjg3MDcrKG89aSppKSoobyoobypvKm8qKC4wMDM5NzEtLjAwMTUyOSpvKS0uMDEzNzkxKS0uMTMxOTc5KSksaV19LHRTLmludmVydD1EdygkeSksZVMuaW52ZXJ0PUR3KChmdW5jdGlvbih0KXtyZXR1cm4gMipEeSh0KX0pKSxuUy5pbnZlcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm5bLWUsMipEeShWeSh0KSktUHldfSxoUy5wcm90b3R5cGU9c1MucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpoUyxjb3VudDpmdW5jdGlvbiBkUygpe3JldHVybiB0aGlzLmVhY2hBZnRlcihhUyl9LGVhY2g6ZnVuY3Rpb24gcFModCl7dmFyIGUsbixpLHIsbz10aGlzLGE9W29dO2Rve2ZvcihlPWEucmV2ZXJzZSgpLGE9W107bz1lLnBvcCgpOylpZih0KG8pLG49by5jaGlsZHJlbilmb3IoaT0wLHI9bi5sZW5ndGg7aTxyOysraSlhLnB1c2gobltpXSl9d2hpbGUoYS5sZW5ndGgpO3JldHVybiB0aGlzfSxlYWNoQWZ0ZXI6ZnVuY3Rpb24gZlModCl7Zm9yKHZhciBlLG4saSxyPXRoaXMsbz1bcl0sYT1bXTtyPW8ucG9wKCk7KWlmKGEucHVzaChyKSxlPXIuY2hpbGRyZW4pZm9yKG49MCxpPWUubGVuZ3RoO248aTsrK24pby5wdXNoKGVbbl0pO2Zvcig7cj1hLnBvcCgpOyl0KHIpO3JldHVybiB0aGlzfSxlYWNoQmVmb3JlOmZ1bmN0aW9uIG1TKHQpe2Zvcih2YXIgZSxuLGk9dGhpcyxyPVtpXTtpPXIucG9wKCk7KWlmKHQoaSksZT1pLmNoaWxkcmVuKWZvcihuPWUubGVuZ3RoLTE7bj49MDstLW4pci5wdXNoKGVbbl0pO3JldHVybiB0aGlzfSxzdW06ZnVuY3Rpb24gZ1ModCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKChmdW5jdGlvbihlKXtmb3IodmFyIG49K3QoZS5kYXRhKXx8MCxpPWUuY2hpbGRyZW4scj1pJiZpLmxlbmd0aDstLXI+PTA7KW4rPWlbcl0udmFsdWU7ZS52YWx1ZT1ufSkpfSxzb3J0OmZ1bmN0aW9uIF9TKHQpe3JldHVybiB0aGlzLmVhY2hCZWZvcmUoKGZ1bmN0aW9uKGUpe2UuY2hpbGRyZW4mJmUuY2hpbGRyZW4uc29ydCh0KX0pKX0scGF0aDpmdW5jdGlvbiB5Uyh0KXtmb3IodmFyIGU9dGhpcyxuPShmdW5jdGlvbiBpKHQsZSl7aWYodD09PWUpcmV0dXJuIHQ7dmFyIG49dC5hbmNlc3RvcnMoKSxpPWUuYW5jZXN0b3JzKCkscj1udWxsO2Zvcih0PW4ucG9wKCksZT1pLnBvcCgpO3Q9PT1lOylyPXQsdD1uLnBvcCgpLGU9aS5wb3AoKTtyZXR1cm4gcn0pKGUsdCkscj1bZV07ZSE9PW47KXIucHVzaChlPWUucGFyZW50KTtmb3IodmFyIG89ci5sZW5ndGg7dCE9PW47KXIuc3BsaWNlKG8sMCx0KSx0PXQucGFyZW50O3JldHVybiByfSxhbmNlc3RvcnM6ZnVuY3Rpb24gdlMoKXtmb3IodmFyIHQ9dGhpcyxlPVt0XTt0PXQucGFyZW50OyllLnB1c2godCk7cmV0dXJuIGV9LGRlc2NlbmRhbnRzOmZ1bmN0aW9uIGJTKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oZSl7dC5wdXNoKGUpfSkpLHR9LGxlYXZlczpmdW5jdGlvbiB4Uygpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2hCZWZvcmUoKGZ1bmN0aW9uKGUpe2UuY2hpbGRyZW58fHQucHVzaChlKX0pKSx0fSxsaW5rczpmdW5jdGlvbiB3Uygpe3ZhciB0PXRoaXMsZT1bXTtyZXR1cm4gdC5lYWNoKChmdW5jdGlvbihuKXtuIT09dCYmZS5wdXNoKHtzb3VyY2U6bi5wYXJlbnQsdGFyZ2V0Om59KX0pKSxlfSxjb3B5OmZ1bmN0aW9uIFNTKCl7cmV0dXJuIHNTKHRoaXMpLmVhY2hCZWZvcmUoY1MpfX07dmFyIE1TPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBFUyh0KXtmb3IodmFyIGUsbixpPTAscj0odD0oZnVuY3Rpb24gbyh0KXtmb3IodmFyIGUsbixpPXQubGVuZ3RoO2k7KW49TWF0aC5yYW5kb20oKSppLS18MCxlPXRbaV0sdFtpXT10W25dLHRbbl09ZTtyZXR1cm4gdH0pKE1TLmNhbGwodCkpKS5sZW5ndGgsYT1bXTtpPHI7KWU9dFtpXSxuJiZBUyhuLGUpPysraToobj1MUyhhPVRTKGEsZSkpLGk9MCk7cmV0dXJuIG59ZnVuY3Rpb24gVFModCxlKXt2YXIgbixpO2lmKGtTKGUsdCkpcmV0dXJuW2VdO2ZvcihuPTA7bjx0Lmxlbmd0aDsrK24paWYoQ1MoZSx0W25dKSYma1MoUFModFtuXSxlKSx0KSlyZXR1cm5bdFtuXSxlXTtmb3Iobj0wO248dC5sZW5ndGgtMTsrK24pZm9yKGk9bisxO2k8dC5sZW5ndGg7KytpKWlmKENTKFBTKHRbbl0sdFtpXSksZSkmJkNTKFBTKHRbbl0sZSksdFtpXSkmJkNTKFBTKHRbaV0sZSksdFtuXSkmJmtTKE5TKHRbbl0sdFtpXSxlKSx0KSlyZXR1cm5bdFtuXSx0W2ldLGVdO3Rocm93IG5ldyBFcnJvcn1mdW5jdGlvbiBDUyh0LGUpe3ZhciBuPXQuci1lLnIsaT1lLngtdC54LHI9ZS55LXQueTtyZXR1cm4gbjwwfHxuKm48aSppK3Iqcn1mdW5jdGlvbiBBUyh0LGUpe3ZhciBuPXQuci1lLnIrMWUtNixpPWUueC10Lngscj1lLnktdC55O3JldHVybiBuPjAmJm4qbj5pKmkrcipyfWZ1bmN0aW9uIGtTKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDsrK24paWYoIUFTKHQsZVtuXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gTFModCl7c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDE6cmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJue3g6dC54LHk6dC55LHI6dC5yfX0pKHRbMF0pO2Nhc2UgMjpyZXR1cm4gUFModFswXSx0WzFdKTtjYXNlIDM6cmV0dXJuIE5TKHRbMF0sdFsxXSx0WzJdKX19ZnVuY3Rpb24gUFModCxlKXt2YXIgbj10LngsaT10Lnkscj10LnIsbz1lLngsYT1lLnkscz1lLnIsbD1vLW4sYz1hLWksdT1zLXIsaD1NYXRoLnNxcnQobCpsK2MqYyk7cmV0dXJue3g6KG4rbytsL2gqdSkvMix5OihpK2ErYy9oKnUpLzIscjooaCtyK3MpLzJ9fWZ1bmN0aW9uIE5TKHQsZSxuKXt2YXIgaT10Lngscj10Lnksbz10LnIsYT1lLngscz1lLnksbD1lLnIsYz1uLngsdT1uLnksaD1uLnIsZD1pLWEscD1pLWMsZj1yLXMsbT1yLXUsZz1sLW8sXz1oLW8seT1pKmkrcipyLW8qbyx2PXktYSphLXMqcytsKmwsYj15LWMqYy11KnUraCpoLHg9cCpmLWQqbSx3PShmKmItbSp2KS8oMip4KS1pLFM9KG0qZy1mKl8pL3gsTT0ocCp2LWQqYikvKDIqeCktcixFPShkKl8tcCpnKS94LFQ9UypTK0UqRS0xLEM9Mioobyt3KlMrTSpFKSxBPXcqdytNKk0tbypvLGs9LShUPyhDK01hdGguc3FydChDKkMtNCpUKkEpKS8oMipUKTpBL0MpO3JldHVybnt4OmkrdytTKmsseTpyK00rRSprLHI6a319ZnVuY3Rpb24gSVModCxlLG4pe3ZhciBpLHIsbyxhLHM9dC54LWUueCxsPXQueS1lLnksYz1zKnMrbCpsO2M/KHI9ZS5yK24ucixhPXQucituLnIsKHIqPXIpPihhKj1hKT8oaT0oYythLXIpLygyKmMpLG89TWF0aC5zcXJ0KE1hdGgubWF4KDAsYS9jLWkqaSkpLG4ueD10LngtaSpzLW8qbCxuLnk9dC55LWkqbCtvKnMpOihpPShjK3ItYSkvKDIqYyksbz1NYXRoLnNxcnQoTWF0aC5tYXgoMCxyL2MtaSppKSksbi54PWUueCtpKnMtbypsLG4ueT1lLnkraSpsK28qcykpOihuLng9ZS54K24ucixuLnk9ZS55KX1mdW5jdGlvbiBSUyh0LGUpe3ZhciBuPXQucitlLnItMWUtNixpPWUueC10Lngscj1lLnktdC55O3JldHVybiBuPjAmJm4qbj5pKmkrcipyfWZ1bmN0aW9uIE9TKHQpe3ZhciBlPXQuXyxuPXQubmV4dC5fLGk9ZS5yK24ucixyPShlLngqbi5yK24ueCplLnIpL2ksbz0oZS55Km4ucituLnkqZS5yKS9pO3JldHVybiByKnIrbypvfWZ1bmN0aW9uIHpTKHQpe3RoaXMuXz10LHRoaXMubmV4dD1udWxsLHRoaXMucHJldmlvdXM9bnVsbH1mdW5jdGlvbiBEUyh0KXtpZighKHI9dC5sZW5ndGgpKXJldHVybiAwO3ZhciBlLG4saSxyLG8sYSxzLGwsYyx1LGg7aWYoKGU9dFswXSkueD0wLGUueT0wLCEocj4xKSlyZXR1cm4gZS5yO2lmKGUueD0tKG49dFsxXSkucixuLng9ZS5yLG4ueT0wLCEocj4yKSlyZXR1cm4gZS5yK24ucjtJUyhuLGUsaT10WzJdKSxlPW5ldyB6UyhlKSxuPW5ldyB6UyhuKSxpPW5ldyB6UyhpKSxlLm5leHQ9aS5wcmV2aW91cz1uLG4ubmV4dD1lLnByZXZpb3VzPWksaS5uZXh0PW4ucHJldmlvdXM9ZTt0OmZvcihzPTM7czxyOysrcyl7SVMoZS5fLG4uXyxpPXRbc10pLGk9bmV3IHpTKGkpLGw9bi5uZXh0LGM9ZS5wcmV2aW91cyx1PW4uXy5yLGg9ZS5fLnI7ZG97aWYodTw9aCl7aWYoUlMobC5fLGkuXykpe2UubmV4dD1uPWwsbi5wcmV2aW91cz1lLC0tcztjb250aW51ZSB0fXUrPWwuXy5yLGw9bC5uZXh0fWVsc2V7aWYoUlMoYy5fLGkuXykpeyhlPWMpLm5leHQ9bixuLnByZXZpb3VzPWUsLS1zO2NvbnRpbnVlIHR9aCs9Yy5fLnIsYz1jLnByZXZpb3VzfX13aGlsZShsIT09Yy5uZXh0KTtmb3IoaS5wcmV2aW91cz1lLGkubmV4dD1uLGUubmV4dD1uLnByZXZpb3VzPW49aSxvPU9TKGUpOyhpPWkubmV4dCkhPT1uOykoYT1PUyhpKSk8byYmKGU9aSxvPWEpO249ZS5uZXh0fWZvcihlPVtuLl9dLGk9bjsoaT1pLm5leHQpIT09bjspZS5wdXNoKGkuXyk7Zm9yKGk9RVMoZSkscz0wO3M8cjsrK3MpKGU9dFtzXSkueC09aS54LGUueS09aS55O3JldHVybiBpLnJ9ZnVuY3Rpb24gQlModCl7cmV0dXJuIG51bGw9PXQ/bnVsbDpIUyh0KX1mdW5jdGlvbiBIUyh0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHR9ZnVuY3Rpb24gRlMoKXtyZXR1cm4gMH1mdW5jdGlvbiBWUyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gVVModCl7cmV0dXJuIE1hdGguc3FydCh0LnZhbHVlKX1mdW5jdGlvbiBqUyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7ZS5jaGlsZHJlbnx8KGUucj1NYXRoLm1heCgwLCt0KGUpfHwwKSl9fWZ1bmN0aW9uIEdTKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe2lmKGk9bi5jaGlsZHJlbil7dmFyIGkscixvLGE9aS5sZW5ndGgscz10KG4pKmV8fDA7aWYocylmb3Iocj0wO3I8YTsrK3IpaVtyXS5yKz1zO2lmKG89RFMoaSkscylmb3Iocj0wO3I8YTsrK3IpaVtyXS5yLT1zO24ucj1vK3N9fX1mdW5jdGlvbiBXUyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49ZS5wYXJlbnQ7ZS5yKj10LG4mJihlLng9bi54K3QqZS54LGUueT1uLnkrdCplLnkpfX1mdW5jdGlvbiBxUyh0KXt0LngwPU1hdGgucm91bmQodC54MCksdC55MD1NYXRoLnJvdW5kKHQueTApLHQueDE9TWF0aC5yb3VuZCh0LngxKSx0LnkxPU1hdGgucm91bmQodC55MSl9ZnVuY3Rpb24gWVModCxlLG4saSxyKXtmb3IodmFyIG8sYT10LmNoaWxkcmVuLHM9LTEsbD1hLmxlbmd0aCxjPXQudmFsdWUmJihpLWUpL3QudmFsdWU7KytzPGw7KShvPWFbc10pLnkwPW4sby55MT1yLG8ueDA9ZSxvLngxPWUrPW8udmFsdWUqY312YXIgWFM9e2RlcHRoOi0xfSwkUz17fTtmdW5jdGlvbiBLUyh0KXtyZXR1cm4gdC5pZH1mdW5jdGlvbiBaUyh0KXtyZXR1cm4gdC5wYXJlbnRJZH1mdW5jdGlvbiBKUyh0LGUpe3JldHVybiB0LnBhcmVudD09PWUucGFyZW50PzE6Mn1mdW5jdGlvbiBRUyh0KXt2YXIgZT10LmNoaWxkcmVuO3JldHVybiBlP2VbMF06dC50fWZ1bmN0aW9uIHRNKHQpe3ZhciBlPXQuY2hpbGRyZW47cmV0dXJuIGU/ZVtlLmxlbmd0aC0xXTp0LnR9ZnVuY3Rpb24gZU0odCxlLG4pe3ZhciBpPW4vKGUuaS10LmkpO2UuYy09aSxlLnMrPW4sdC5jKz1pLGUueis9bixlLm0rPW59ZnVuY3Rpb24gbk0odCxlLG4pe3JldHVybiB0LmEucGFyZW50PT09ZS5wYXJlbnQ/dC5hOm59ZnVuY3Rpb24gaU0odCxlKXt0aGlzLl89dCx0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49bnVsbCx0aGlzLkE9bnVsbCx0aGlzLmE9dGhpcyx0aGlzLno9MCx0aGlzLm09MCx0aGlzLmM9MCx0aGlzLnM9MCx0aGlzLnQ9bnVsbCx0aGlzLmk9ZX1mdW5jdGlvbiByTSh0LGUsbixpLHIpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4scz0tMSxsPWEubGVuZ3RoLGM9dC52YWx1ZSYmKHItbikvdC52YWx1ZTsrK3M8bDspKG89YVtzXSkueDA9ZSxvLngxPWksby55MD1uLG8ueTE9bis9by52YWx1ZSpjfWlNLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGhTLnByb3RvdHlwZSk7dmFyIG9NPSgxK01hdGguc3FydCg1KSkvMjtmdW5jdGlvbiBhTSh0LGUsbixpLHIsbyl7Zm9yKHZhciBhLHMsbCxjLHUsaCxkLHAsZixtLGcsXz1bXSx5PWUuY2hpbGRyZW4sdj0wLGI9MCx4PXkubGVuZ3RoLHc9ZS52YWx1ZTt2PHg7KXtsPXItbixjPW8taTtkb3t1PXlbYisrXS52YWx1ZX13aGlsZSghdSYmYjx4KTtmb3IoaD1kPXUsZz11KnUqKG09TWF0aC5tYXgoYy9sLGwvYykvKHcqdCkpLGY9TWF0aC5tYXgoZC9nLGcvaCk7Yjx4OysrYil7aWYodSs9cz15W2JdLnZhbHVlLHM8aCYmKGg9cykscz5kJiYoZD1zKSxnPXUqdSptLChwPU1hdGgubWF4KGQvZyxnL2gpKT5mKXt1LT1zO2JyZWFrfWY9cH1fLnB1c2goYT17dmFsdWU6dSxkaWNlOmw8YyxjaGlsZHJlbjp5LnNsaWNlKHYsYil9KSxhLmRpY2U/WVMoYSxuLGkscix3P2krPWMqdS93Om8pOnJNKGEsbixpLHc/bis9bCp1L3c6cixvKSx3LT11LHY9Yn1yZXR1cm4gX312YXIgc009KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0LG4saSxyLG8pe2FNKGUsdCxuLGkscixvKX1yZXR1cm4gbi5yYXRpbz1mdW5jdGlvbihlKXtyZXR1cm4gdCgoZT0rZSk+MT9lOjEpfSxufSkob00pLGxNPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCxuLGkscixvKXtpZigoYT10Ll9zcXVhcmlmeSkmJmEucmF0aW89PT1lKWZvcih2YXIgYSxzLGwsYyx1LGg9LTEsZD1hLmxlbmd0aCxwPXQudmFsdWU7KytoPGQ7KXtmb3IobD0ocz1hW2hdKS5jaGlsZHJlbixjPXMudmFsdWU9MCx1PWwubGVuZ3RoO2M8dTsrK2Mpcy52YWx1ZSs9bFtjXS52YWx1ZTtzLmRpY2U/WVMocyxuLGkscixpKz0oby1pKSpzLnZhbHVlL3ApOnJNKHMsbixpLG4rPShyLW4pKnMudmFsdWUvcCxvKSxwLT1zLnZhbHVlfWVsc2UgdC5fc3F1YXJpZnk9YT1hTShlLHQsbixpLHIsbyksYS5yYXRpbz1lfXJldHVybiBuLnJhdGlvPWZ1bmN0aW9uKGUpe3JldHVybiB0KChlPStlKT4xP2U6MSl9LG59KShvTSk7ZnVuY3Rpb24gY00odCxlLG4pe3JldHVybihlWzBdLXRbMF0pKihuWzFdLXRbMV0pLShlWzFdLXRbMV0pKihuWzBdLXRbMF0pfWZ1bmN0aW9uIHVNKHQsZSl7cmV0dXJuIHRbMF0tZVswXXx8dFsxXS1lWzFdfWZ1bmN0aW9uIGhNKHQpe2Zvcih2YXIgZT10Lmxlbmd0aCxuPVswLDFdLGk9MixyPTI7cjxlOysrcil7Zm9yKDtpPjEmJmNNKHRbbltpLTJdXSx0W25baS0xXV0sdFtyXSk8PTA7KS0taTtuW2krK109cn1yZXR1cm4gbi5zbGljZSgwLGkpfWZ1bmN0aW9uIGRNKCl7cmV0dXJuIE1hdGgucmFuZG9tKCl9dmFyIHBNPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCxuKXtyZXR1cm4gdD1udWxsPT10PzA6K3Qsbj1udWxsPT1uPzE6K24sMT09PWFyZ3VtZW50cy5sZW5ndGg/KG49dCx0PTApOm4tPXQsZnVuY3Rpb24oKXtyZXR1cm4gZSgpKm4rdH19cmV0dXJuIG4uc291cmNlPXQsbn0pKGRNKSxmTT0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQsbil7dmFyIGkscjtyZXR1cm4gdD1udWxsPT10PzA6K3Qsbj1udWxsPT1uPzE6K24sZnVuY3Rpb24oKXt2YXIgbztpZihudWxsIT1pKW89aSxpPW51bGw7ZWxzZSBkb3tpPTIqZSgpLTEsbz0yKmUoKS0xLHI9aSppK28qb313aGlsZSghcnx8cj4xKTtyZXR1cm4gdCtuKm8qTWF0aC5zcXJ0KC0yKk1hdGgubG9nKHIpL3IpfX1yZXR1cm4gbi5zb3VyY2U9dCxufSkoZE0pLG1NPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4oKXt2YXIgdD1mTS5zb3VyY2UoZSkuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBNYXRoLmV4cCh0KCkpfX1yZXR1cm4gbi5zb3VyY2U9dCxufSkoZE0pLGdNPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBuPTAsaT0wO2k8dDsrK2kpbis9ZSgpO3JldHVybiBufX1yZXR1cm4gbi5zb3VyY2U9dCxufSkoZE0pLF9NPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7dmFyIG49Z00uc291cmNlKGUpKHQpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBuKCkvdH19cmV0dXJuIG4uc291cmNlPXQsbn0pKGRNKSx5TT0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybi1NYXRoLmxvZygxLWUoKSkvdH19cmV0dXJuIG4uc291cmNlPXQsbn0pKGRNKTtmdW5jdGlvbiB2TSh0LGUpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6YnJlYWs7Y2FzZSAxOnRoaXMucmFuZ2UodCk7YnJlYWs7ZGVmYXVsdDp0aGlzLnJhbmdlKGUpLmRvbWFpbih0KX1yZXR1cm4gdGhpc31mdW5jdGlvbiBiTSh0LGUpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6YnJlYWs7Y2FzZSAxOnRoaXMuaW50ZXJwb2xhdG9yKHQpO2JyZWFrO2RlZmF1bHQ6dGhpcy5pbnRlcnBvbGF0b3IoZSkuZG9tYWluKHQpfXJldHVybiB0aGlzfXZhciB4TT1BcnJheS5wcm90b3R5cGUsd009eE0ubWFwLFNNPXhNLnNsaWNlLE1NPXtuYW1lOiJpbXBsaWNpdCJ9O2Z1bmN0aW9uIEVNKCl7dmFyIHQ9d2coKSxlPVtdLG49W10saT1NTTtmdW5jdGlvbiByKHIpe3ZhciBvPXIrIiIsYT10LmdldChvKTtpZighYSl7aWYoaSE9PU1NKXJldHVybiBpO3Quc2V0KG8sYT1lLnB1c2gocikpfXJldHVybiBuWyhhLTEpJW4ubGVuZ3RoXX1yZXR1cm4gci5kb21haW49ZnVuY3Rpb24obil7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGUuc2xpY2UoKTtlPVtdLHQ9d2coKTtmb3IodmFyIGksbyxhPS0xLHM9bi5sZW5ndGg7KythPHM7KXQuaGFzKG89KGk9blthXSkrIiIpfHx0LnNldChvLGUucHVzaChpKSk7cmV0dXJuIHJ9LHIucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49U00uY2FsbCh0KSxyKTpuLnNsaWNlKCl9LHIudW5rbm93bj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LHIpOml9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiBFTShlLG4pLnVua25vd24oaSl9LHZNLmFwcGx5KHIsYXJndW1lbnRzKSxyfWZ1bmN0aW9uIFRNKCl7dmFyIHQsZSxuPUVNKCkudW5rbm93bih2b2lkIDApLGk9bi5kb21haW4scj1uLnJhbmdlLG89WzAsMV0sYT0hMSxzPTAsbD0wLGM9LjU7ZnVuY3Rpb24gdSgpe3ZhciBuPWkoKS5sZW5ndGgsdT1vWzFdPG9bMF0saD1vW3UtMF0sZD1vWzEtdV07dD0oZC1oKS9NYXRoLm1heCgxLG4tcysyKmwpLGEmJih0PU1hdGguZmxvb3IodCkpLGgrPShkLWgtdCoobi1zKSkqYyxlPXQqKDEtcyksYSYmKGg9TWF0aC5yb3VuZChoKSxlPU1hdGgucm91bmQoZSkpO3ZhciBwPXpsKG4pLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGgrdCplfSkpO3JldHVybiByKHU/cC5yZXZlcnNlKCk6cCl9cmV0dXJuIGRlbGV0ZSBuLnVua25vd24sbi5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkodCksdSgpKTppKCl9LG4ucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89Wyt0WzBdLCt0WzFdXSx1KCkpOm8uc2xpY2UoKX0sbi5yYW5nZVJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBvPVsrdFswXSwrdFsxXV0sYT0hMCx1KCl9LG4uYmFuZHdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uc3RlcD1mdW5jdGlvbigpe3JldHVybiB0fSxuLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSEhdCx1KCkpOmF9LG4ucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1NYXRoLm1pbigxLGw9K3QpLHUoKSk6c30sbi5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9TWF0aC5taW4oMSx0KSx1KCkpOnN9LG4ucGFkZGluZ091dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPSt0LHUoKSk6bH0sbi5hbGlnbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHUoKSk6Y30sbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFRNKGkoKSxvKS5yb3VuZChhKS5wYWRkaW5nSW5uZXIocykucGFkZGluZ091dGVyKGwpLmFsaWduKGMpfSx2TS5hcHBseSh1KCksYXJndW1lbnRzKX1mdW5jdGlvbiBDTSh0KXt2YXIgZT10LmNvcHk7cmV0dXJuIHQucGFkZGluZz10LnBhZGRpbmdPdXRlcixkZWxldGUgdC5wYWRkaW5nSW5uZXIsZGVsZXRlIHQucGFkZGluZ091dGVyLHQuY29weT1mdW5jdGlvbigpe3JldHVybiBDTShlKCkpfSx0fWZ1bmN0aW9uIEFNKCl7cmV0dXJuIENNKFRNLmFwcGx5KG51bGwsYXJndW1lbnRzKS5wYWRkaW5nSW5uZXIoMSkpfWZ1bmN0aW9uIGtNKHQpe3JldHVybit0fXZhciBMTT1bMCwxXTtmdW5jdGlvbiBQTSh0KXtyZXR1cm4gdH1mdW5jdGlvbiBOTSh0LGUpe3JldHVybihlLT10PSt0KT9mdW5jdGlvbihuKXtyZXR1cm4obi10KS9lfTooZnVuY3Rpb24gbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KShpc05hTihlKT9OYU46LjUpfWZ1bmN0aW9uIElNKHQpe3ZhciBlLG49dFswXSxpPXRbdC5sZW5ndGgtMV07cmV0dXJuIG4+aSYmKGU9bixuPWksaT1lKSxmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5tYXgobixNYXRoLm1pbihpLHQpKX19ZnVuY3Rpb24gUk0odCxlLG4pe3ZhciBpPXRbMF0scj10WzFdLG89ZVswXSxhPWVbMV07cmV0dXJuIHI8aT8oaT1OTShyLGkpLG89bihhLG8pKTooaT1OTShpLHIpLG89bihvLGEpKSxmdW5jdGlvbih0KXtyZXR1cm4gbyhpKHQpKX19ZnVuY3Rpb24gT00odCxlLG4pe3ZhciBpPU1hdGgubWluKHQubGVuZ3RoLGUubGVuZ3RoKS0xLHI9bmV3IEFycmF5KGkpLG89bmV3IEFycmF5KGkpLGE9LTE7Zm9yKHRbaV08dFswXSYmKHQ9dC5zbGljZSgpLnJldmVyc2UoKSxlPWUuc2xpY2UoKS5yZXZlcnNlKCkpOysrYTxpOylyW2FdPU5NKHRbYV0sdFthKzFdKSxvW2FdPW4oZVthXSxlW2ErMV0pO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj1TbCh0LGUsMSxpKS0xO3JldHVybiBvW25dKHJbbl0oZSkpfX1mdW5jdGlvbiB6TSh0LGUpe3JldHVybiBlLmRvbWFpbih0LmRvbWFpbigpKS5yYW5nZSh0LnJhbmdlKCkpLmludGVycG9sYXRlKHQuaW50ZXJwb2xhdGUoKSkuY2xhbXAodC5jbGFtcCgpKS51bmtub3duKHQudW5rbm93bigpKX1mdW5jdGlvbiBETSgpe3ZhciB0LGUsbixpLHIsbyxhPUxNLHM9TE0sbD1qZCxjPVBNO2Z1bmN0aW9uIHUoKXtyZXR1cm4gaT1NYXRoLm1pbihhLmxlbmd0aCxzLmxlbmd0aCk+Mj9PTTpSTSxyPW89bnVsbCxofWZ1bmN0aW9uIGgoZSl7cmV0dXJuIGlzTmFOKGU9K2UpP246KHJ8fChyPWkoYS5tYXAodCkscyxsKSkpKHQoYyhlKSkpfXJldHVybiBoLmludmVydD1mdW5jdGlvbihuKXtyZXR1cm4gYyhlKChvfHwobz1pKHMsYS5tYXAodCksQmQpKSkobikpKX0saC5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9d00uY2FsbCh0LGtNKSxjPT09UE18fChjPUlNKGEpKSx1KCkpOmEuc2xpY2UoKX0saC5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1TTS5jYWxsKHQpLHUoKSk6cy5zbGljZSgpfSxoLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHM9U00uY2FsbCh0KSxsPUdkLHUoKX0saC5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz10P0lNKGEpOlBNLGgpOmMhPT1QTX0saC5pbnRlcnBvbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD10LHUoKSk6bH0saC51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsaCk6bn0sZnVuY3Rpb24obixpKXtyZXR1cm4gdD1uLGU9aSx1KCl9fWZ1bmN0aW9uIEJNKHQsZSl7cmV0dXJuIERNKCkodCxlKX1mdW5jdGlvbiBITSh0LGUsbixpKXt2YXIgcixvPVVsKHQsZSxuKTtzd2l0Y2goKGk9c3kobnVsbD09aT8iLGYiOmkpKS50eXBlKXtjYXNlInMiOnZhciBhPU1hdGgubWF4KE1hdGguYWJzKHQpLE1hdGguYWJzKGUpKTtyZXR1cm4gbnVsbCE9aS5wcmVjaXNpb258fGlzTmFOKHI9d3kobyxhKSl8fChpLnByZWNpc2lvbj1yKSxneShpLGEpO2Nhc2UiIjpjYXNlImUiOmNhc2UiZyI6Y2FzZSJwIjpjYXNlInIiOm51bGwhPWkucHJlY2lzaW9ufHxpc05hTihyPVN5KG8sTWF0aC5tYXgoTWF0aC5hYnModCksTWF0aC5hYnMoZSkpKSl8fChpLnByZWNpc2lvbj1yLSgiZSI9PT1pLnR5cGUpKTticmVhaztjYXNlImYiOmNhc2UiJSI6bnVsbCE9aS5wcmVjaXNpb258fGlzTmFOKHI9eHkobykpfHwoaS5wcmVjaXNpb249ci0yKigiJSI9PT1pLnR5cGUpKX1yZXR1cm4gbXkoaSl9ZnVuY3Rpb24gRk0odCl7dmFyIGU9dC5kb21haW47cmV0dXJuIHQudGlja3M9ZnVuY3Rpb24odCl7dmFyIG49ZSgpO3JldHVybiBGbChuWzBdLG5bbi5sZW5ndGgtMV0sbnVsbD09dD8xMDp0KX0sdC50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsbil7dmFyIGk9ZSgpO3JldHVybiBITShpWzBdLGlbaS5sZW5ndGgtMV0sbnVsbD09dD8xMDp0LG4pfSx0Lm5pY2U9ZnVuY3Rpb24obil7bnVsbD09biYmKG49MTApO3ZhciBpLHI9ZSgpLG89MCxhPXIubGVuZ3RoLTEscz1yW29dLGw9clthXTtyZXR1cm4gbDxzJiYoaT1zLHM9bCxsPWksaT1vLG89YSxhPWkpLChpPVZsKHMsbCxuKSk+MD9pPVZsKHM9TWF0aC5mbG9vcihzL2kpKmksbD1NYXRoLmNlaWwobC9pKSppLG4pOmk8MCYmKGk9Vmwocz1NYXRoLmNlaWwocyppKS9pLGw9TWF0aC5mbG9vcihsKmkpL2ksbikpLGk+MD8ocltvXT1NYXRoLmZsb29yKHMvaSkqaSxyW2FdPU1hdGguY2VpbChsL2kpKmksZShyKSk6aTwwJiYocltvXT1NYXRoLmNlaWwocyppKS9pLHJbYV09TWF0aC5mbG9vcihsKmkpL2ksZShyKSksdH0sdH1mdW5jdGlvbiBWTSgpe3ZhciB0PUJNKFBNLFBNKTtyZXR1cm4gdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHpNKHQsVk0oKSl9LHZNLmFwcGx5KHQsYXJndW1lbnRzKSxGTSh0KX1mdW5jdGlvbiBVTSh0LGUpe3ZhciBuLGk9MCxyPSh0PXQuc2xpY2UoKSkubGVuZ3RoLTEsbz10W2ldLGE9dFtyXTtyZXR1cm4gYTxvJiYobj1pLGk9cixyPW4sbj1vLG89YSxhPW4pLHRbaV09ZS5mbG9vcihvKSx0W3JdPWUuY2VpbChhKSx0fWZ1bmN0aW9uIGpNKHQpe3JldHVybiBNYXRoLmxvZyh0KX1mdW5jdGlvbiBHTSh0KXtyZXR1cm4gTWF0aC5leHAodCl9ZnVuY3Rpb24gV00odCl7cmV0dXJuLU1hdGgubG9nKC10KX1mdW5jdGlvbiBxTSh0KXtyZXR1cm4tTWF0aC5leHAoLXQpfWZ1bmN0aW9uIFlNKHQpe3JldHVybiBpc0Zpbml0ZSh0KT8rKCIxZSIrdCk6dDwwPzA6dH1mdW5jdGlvbiBYTSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuLXQoLWUpfX1mdW5jdGlvbiAkTSh0KXt2YXIgZSxuLGk9dChqTSxHTSkscj1pLmRvbWFpbixvPTEwO2Z1bmN0aW9uIGEoKXtyZXR1cm4gZT0oZnVuY3Rpb24gYSh0KXtyZXR1cm4gdD09PU1hdGguRT9NYXRoLmxvZzoxMD09PXQmJk1hdGgubG9nMTB8fDI9PT10JiZNYXRoLmxvZzJ8fCh0PU1hdGgubG9nKHQpLGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmxvZyhlKS90fSl9KShvKSxuPShmdW5jdGlvbiBzKHQpe3JldHVybiAxMD09PXQ/WU06dD09PU1hdGguRT9NYXRoLmV4cDpmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5wb3codCxlKX19KShvKSxyKClbMF08MD8oZT1YTShlKSxuPVhNKG4pLHQoV00scU0pKTp0KGpNLEdNKSxpfXJldHVybiBpLmJhc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3QsYSgpKTpvfSxpLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocih0KSxhKCkpOnIoKX0saS50aWNrcz1mdW5jdGlvbih0KXt2YXIgaSxhPXIoKSxzPWFbMF0sbD1hW2EubGVuZ3RoLTFdOyhpPWw8cykmJihkPXMscz1sLGw9ZCk7dmFyIGMsdSxoLGQ9ZShzKSxwPWUobCksZj1udWxsPT10PzEwOit0LG09W107aWYoIShvJTEpJiZwLWQ8Zil7aWYoZD1NYXRoLnJvdW5kKGQpLTEscD1NYXRoLnJvdW5kKHApKzEscz4wKXtmb3IoO2Q8cDsrK2QpZm9yKHU9MSxjPW4oZCk7dTxvOysrdSlpZighKChoPWMqdSk8cykpe2lmKGg+bClicmVhazttLnB1c2goaCl9fWVsc2UgZm9yKDtkPHA7KytkKWZvcih1PW8tMSxjPW4oZCk7dT49MTstLXUpaWYoISgoaD1jKnUpPHMpKXtpZihoPmwpYnJlYWs7bS5wdXNoKGgpfX1lbHNlIG09RmwoZCxwLE1hdGgubWluKHAtZCxmKSkubWFwKG4pO3JldHVybiBpP20ucmV2ZXJzZSgpOm19LGkudGlja0Zvcm1hdD1mdW5jdGlvbih0LHIpe2lmKG51bGw9PXImJihyPTEwPT09bz8iLjBlIjoiLCIpLCJmdW5jdGlvbiIhPXR5cGVvZiByJiYocj1teShyKSksdD09PTEvMClyZXR1cm4gcjtudWxsPT10JiYodD0xMCk7dmFyIGE9TWF0aC5tYXgoMSxvKnQvaS50aWNrcygpLmxlbmd0aCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBpPXQvbihNYXRoLnJvdW5kKGUodCkpKTtyZXR1cm4gaSpvPG8tLjUmJihpKj1vKSxpPD1hP3IodCk6IiJ9fSxpLm5pY2U9ZnVuY3Rpb24oKXtyZXR1cm4gcihVTShyKCkse2Zsb29yOmZ1bmN0aW9uKHQpe3JldHVybiBuKE1hdGguZmxvb3IoZSh0KSkpfSxjZWlsOmZ1bmN0aW9uKHQpe3JldHVybiBuKE1hdGguY2VpbChlKHQpKSl9fSkpfSxpfWZ1bmN0aW9uIEtNKCl7dmFyIHQ9JE0oRE0oKSkuZG9tYWluKFsxLDEwXSk7cmV0dXJuIHQuY29weT1mdW5jdGlvbigpe3JldHVybiB6TSh0LEtNKCkpLmJhc2UodC5iYXNlKCkpfSx2TS5hcHBseSh0LGFyZ3VtZW50cyksdH1mdW5jdGlvbiBaTSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguc2lnbihlKSpNYXRoLmxvZzFwKE1hdGguYWJzKGUvdCkpfX1mdW5jdGlvbiBKTSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguc2lnbihlKSpNYXRoLmV4cG0xKE1hdGguYWJzKGUpKSp0fX1mdW5jdGlvbiBRTSh0KXt2YXIgZT0xLG49dChaTShlKSxKTShlKSk7cmV0dXJuIG4uY29uc3RhbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dChaTShlPStuKSxKTShlKSk6ZX0sRk0obil9ZnVuY3Rpb24gdEUodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlPDA/LU1hdGgucG93KC1lLHQpOk1hdGgucG93KGUsdCl9fWZ1bmN0aW9uIGVFKHQpe3JldHVybiB0PDA/LU1hdGguc3FydCgtdCk6TWF0aC5zcXJ0KHQpfWZ1bmN0aW9uIG5FKHQpe3JldHVybiB0PDA/LXQqdDp0KnR9ZnVuY3Rpb24gaUUodCl7dmFyIGU9dChQTSxQTSksbj0xO2Z1bmN0aW9uIGkoKXtyZXR1cm4gMT09PW4/dChQTSxQTSk6LjU9PT1uP3QoZUUsbkUpOnQodEUobiksdEUoMS9uKSl9cmV0dXJuIGUuZXhwb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3QsaSgpKTpufSxGTShlKX1mdW5jdGlvbiByRSgpe3ZhciB0PWlFKERNKCkpO3JldHVybiB0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gek0odCxyRSgpKS5leHBvbmVudCh0LmV4cG9uZW50KCkpfSx2TS5hcHBseSh0LGFyZ3VtZW50cyksdH1mdW5jdGlvbiBvRSgpe3ZhciB0LGU9W10sbj1bXSxpPVtdO2Z1bmN0aW9uIHIoKXt2YXIgdD0wLHI9TWF0aC5tYXgoMSxuLmxlbmd0aCk7Zm9yKGk9bmV3IEFycmF5KHItMSk7Kyt0PHI7KWlbdC0xXT1HbChlLHQvcik7cmV0dXJuIG99ZnVuY3Rpb24gbyhlKXtyZXR1cm4gaXNOYU4oZT0rZSk/dDpuW1NsKGksZSldfXJldHVybiBvLmludmVydEV4dGVudD1mdW5jdGlvbih0KXt2YXIgcj1uLmluZGV4T2YodCk7cmV0dXJuIHI8MD9bTmFOLE5hTl06W3I+MD9pW3ItMV06ZVswXSxyPGkubGVuZ3RoP2lbcl06ZVtlLmxlbmd0aC0xXV19LG8uZG9tYWluPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBlLnNsaWNlKCk7ZT1bXTtmb3IodmFyIG4saT0wLG89dC5sZW5ndGg7aTxvOysraSludWxsPT0obj10W2ldKXx8aXNOYU4obj0rbil8fGUucHVzaChuKTtyZXR1cm4gZS5zb3J0KGJsKSxyKCl9LG8ucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49U00uY2FsbCh0KSxyKCkpOm4uc2xpY2UoKX0sby51bmtub3duPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsbyk6dH0sby5xdWFudGlsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gaS5zbGljZSgpfSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gb0UoKS5kb21haW4oZSkucmFuZ2UobikudW5rbm93bih0KX0sdk0uYXBwbHkobyxhcmd1bWVudHMpfWZ1bmN0aW9uIGFFKCl7dmFyIHQsZT0wLG49MSxpPTEscj1bLjVdLG89WzAsMV07ZnVuY3Rpb24gYShlKXtyZXR1cm4gZTw9ZT9vW1NsKHIsZSwwLGkpXTp0fWZ1bmN0aW9uIHMoKXt2YXIgdD0tMTtmb3Iocj1uZXcgQXJyYXkoaSk7Kyt0PGk7KXJbdF09KCh0KzEpKm4tKHQtaSkqZSkvKGkrMSk7cmV0dXJuIGF9cmV0dXJuIGEuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLG49K3RbMV0scygpKTpbZSxuXX0sYS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0obz1TTS5jYWxsKHQpKS5sZW5ndGgtMSxzKCkpOm8uc2xpY2UoKX0sYS5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIGE9by5pbmRleE9mKHQpO3JldHVybiBhPDA/W05hTixOYU5dOmE8MT9bZSxyWzBdXTphPj1pP1tyW2ktMV0sbl06W3JbYS0xXSxyW2FdXX0sYS51bmtub3duPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsYSk6YX0sYS50aHJlc2hvbGRzPWZ1bmN0aW9uKCl7cmV0dXJuIHIuc2xpY2UoKX0sYS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGFFKCkuZG9tYWluKFtlLG5dKS5yYW5nZShvKS51bmtub3duKHQpfSx2TS5hcHBseShGTShhKSxhcmd1bWVudHMpfXZhciBzRT1uZXcgRGF0ZSxsRT1uZXcgRGF0ZTtmdW5jdGlvbiBjRSh0LGUsbixpKXtmdW5jdGlvbiByKGUpe3JldHVybiB0KGU9MD09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IERhdGU6bmV3IERhdGUoK2UpKSxlfXJldHVybiByLmZsb29yPWZ1bmN0aW9uKGUpe3JldHVybiB0KGU9bmV3IERhdGUoK2UpKSxlfSxyLmNlaWw9ZnVuY3Rpb24obil7cmV0dXJuIHQobj1uZXcgRGF0ZShuLTEpKSxlKG4sMSksdChuKSxufSxyLnJvdW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXIodCksbj1yLmNlaWwodCk7cmV0dXJuIHQtZTxuLXQ/ZTpufSxyLm9mZnNldD1mdW5jdGlvbih0LG4pe3JldHVybiBlKHQ9bmV3IERhdGUoK3QpLG51bGw9PW4/MTpNYXRoLmZsb29yKG4pKSx0fSxyLnJhbmdlPWZ1bmN0aW9uKG4saSxvKXt2YXIgYSxzPVtdO2lmKG49ci5jZWlsKG4pLG89bnVsbD09bz8xOk1hdGguZmxvb3IobyksIShuPGkmJm8+MCkpcmV0dXJuIHM7ZG97cy5wdXNoKGE9bmV3IERhdGUoK24pKSxlKG4sbyksdChuKX13aGlsZShhPG4mJm48aSk7cmV0dXJuIHN9LHIuZmlsdGVyPWZ1bmN0aW9uKG4pe3JldHVybiBjRSgoZnVuY3Rpb24oZSl7aWYoZT49ZSlmb3IoO3QoZSksIW4oZSk7KWUuc2V0VGltZShlLTEpfSksKGZ1bmN0aW9uKHQsaSl7aWYodD49dClpZihpPDApZm9yKDsrK2k8PTA7KWZvcig7ZSh0LC0xKSwhbih0KTspO2Vsc2UgZm9yKDstLWk+PTA7KWZvcig7ZSh0LDEpLCFuKHQpOyk7fSkpfSxuJiYoci5jb3VudD1mdW5jdGlvbihlLGkpe3JldHVybiBzRS5zZXRUaW1lKCtlKSxsRS5zZXRUaW1lKCtpKSx0KHNFKSx0KGxFKSxNYXRoLmZsb29yKG4oc0UsbEUpKX0sci5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP3IuZmlsdGVyKGk/ZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSkldD09MH06ZnVuY3Rpb24oZSl7cmV0dXJuIHIuY291bnQoMCxlKSV0PT0wfSk6cjpudWxsfSkscn12YXIgdUU9Y0UoKGZ1bmN0aW9uKCl7fSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUtdH0pKTt1RS5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP2NFKChmdW5jdGlvbihlKXtlLnNldFRpbWUoTWF0aC5mbG9vcihlL3QpKnQpfSksKGZ1bmN0aW9uKGUsbil7ZS5zZXRUaW1lKCtlK24qdCl9KSwoZnVuY3Rpb24oZSxuKXtyZXR1cm4obi1lKS90fSkpOnVFOm51bGx9O3ZhciBoRT11RSxkRT11RS5yYW5nZSxwRT0xZTMsZkU9NmU0LG1FPTM2ZTUsZ0U9ODY0ZTUsX0U9NjA0OGU1LHlFPWNFKChmdW5jdGlvbih0KXt0LnNldFRpbWUodC10LmdldE1pbGxpc2Vjb25kcygpKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKnBFKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL3BFfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ1NlY29uZHMoKX0pKSx2RT15RSxiRT15RS5yYW5nZSx4RT1jRSgoZnVuY3Rpb24odCl7dC5zZXRUaW1lKHQtdC5nZXRNaWxsaXNlY29uZHMoKS10LmdldFNlY29uZHMoKSpwRSl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFRpbWUoK3QrZSpmRSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS9mRX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNaW51dGVzKCl9KSksd0U9eEUsU0U9eEUucmFuZ2UsTUU9Y0UoKGZ1bmN0aW9uKHQpe3Quc2V0VGltZSh0LXQuZ2V0TWlsbGlzZWNvbmRzKCktdC5nZXRTZWNvbmRzKCkqcEUtdC5nZXRNaW51dGVzKCkqZkUpfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UqbUUpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvbUV9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0SG91cnMoKX0pKSxFRT1NRSxURT1NRS5yYW5nZSxDRT1jRSgoZnVuY3Rpb24odCl7dC5zZXRIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0RGF0ZSh0LmdldERhdGUoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQtKGUuZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKmZFKS9nRX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXREYXRlKCktMX0pKSxBRT1DRSxrRT1DRS5yYW5nZTtmdW5jdGlvbiBMRSh0KXtyZXR1cm4gY0UoKGZ1bmN0aW9uKGUpe2Uuc2V0RGF0ZShlLmdldERhdGUoKS0oZS5nZXREYXkoKSs3LXQpJTcpLGUuc2V0SG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldERhdGUodC5nZXREYXRlKCkrNyplKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQtKGUuZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKmZFKS9fRX0pKX12YXIgUEU9TEUoMCksTkU9TEUoMSksSUU9TEUoMiksUkU9TEUoMyksT0U9TEUoNCksekU9TEUoNSksREU9TEUoNiksQkU9UEUucmFuZ2UsSEU9TkUucmFuZ2UsRkU9SUUucmFuZ2UsVkU9UkUucmFuZ2UsVUU9T0UucmFuZ2UsakU9ekUucmFuZ2UsR0U9REUucmFuZ2UsV0U9Y0UoKGZ1bmN0aW9uKHQpe3Quc2V0RGF0ZSgxKSx0LnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRNb250aCh0LmdldE1vbnRoKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5nZXRNb250aCgpLXQuZ2V0TW9udGgoKSsxMiooZS5nZXRGdWxsWWVhcigpLXQuZ2V0RnVsbFllYXIoKSl9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TW9udGgoKX0pKSxxRT1XRSxZRT1XRS5yYW5nZSxYRT1jRSgoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldEZ1bGxZZWFyKHQuZ2V0RnVsbFllYXIoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybiBlLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KSk7WEUuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9jRSgoZnVuY3Rpb24oZSl7ZS5zZXRGdWxsWWVhcihNYXRoLmZsb29yKGUuZ2V0RnVsbFllYXIoKS90KSp0KSxlLnNldE1vbnRoKDAsMSksZS5zZXRIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbihlLG4pe2Uuc2V0RnVsbFllYXIoZS5nZXRGdWxsWWVhcigpK24qdCl9KSk6bnVsbH07dmFyICRFPVhFLEtFPVhFLnJhbmdlLFpFPWNFKChmdW5jdGlvbih0KXt0LnNldFVUQ1NlY29uZHMoMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKmZFKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL2ZFfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01pbnV0ZXMoKX0pKSxKRT1aRSxRRT1aRS5yYW5nZSx0VD1jRSgoZnVuY3Rpb24odCl7dC5zZXRVVENNaW51dGVzKDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKm1FKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL21FfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0hvdXJzKCl9KSksZVQ9dFQsblQ9dFQucmFuZ2UsaVQ9Y0UoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS9nRX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENEYXRlKCktMX0pKSxyVD1pVCxvVD1pVC5yYW5nZTtmdW5jdGlvbiBhVCh0KXtyZXR1cm4gY0UoKGZ1bmN0aW9uKGUpe2Uuc2V0VVRDRGF0ZShlLmdldFVUQ0RhdGUoKS0oZS5nZXRVVENEYXkoKSs3LXQpJTcpLGUuc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrNyplKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL19FfSkpfXZhciBzVD1hVCgwKSxsVD1hVCgxKSxjVD1hVCgyKSx1VD1hVCgzKSxoVD1hVCg0KSxkVD1hVCg1KSxwVD1hVCg2KSxmVD1zVC5yYW5nZSxtVD1sVC5yYW5nZSxnVD1jVC5yYW5nZSxfVD11VC5yYW5nZSx5VD1oVC5yYW5nZSx2VD1kVC5yYW5nZSxiVD1wVC5yYW5nZSx4VD1jRSgoZnVuY3Rpb24odCl7dC5zZXRVVENEYXRlKDEpLHQuc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFVUQ01vbnRoKHQuZ2V0VVRDTW9udGgoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybiBlLmdldFVUQ01vbnRoKCktdC5nZXRVVENNb250aCgpKzEyKihlLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpKX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENNb250aCgpfSkpLHdUPXhULFNUPXhULnJhbmdlLE1UPWNFKChmdW5jdGlvbih0KXt0LnNldFVUQ01vbnRoKDAsMSksdC5zZXRVVENIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VVRDRnVsbFllYXIodC5nZXRVVENGdWxsWWVhcigpK2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZ2V0VVRDRnVsbFllYXIoKS10LmdldFVUQ0Z1bGxZZWFyKCl9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDRnVsbFllYXIoKX0pKTtNVC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP2NFKChmdW5jdGlvbihlKXtlLnNldFVUQ0Z1bGxZZWFyKE1hdGguZmxvb3IoZS5nZXRVVENGdWxsWWVhcigpL3QpKnQpLGUuc2V0VVRDTW9udGgoMCwxKSxlLnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKGUsbil7ZS5zZXRVVENGdWxsWWVhcihlLmdldFVUQ0Z1bGxZZWFyKCkrbip0KX0pKTpudWxsfTt2YXIgRVQ9TVQsVFQ9TVQucmFuZ2U7ZnVuY3Rpb24gQ1QodCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgZT1uZXcgRGF0ZSgtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCk7cmV0dXJuIGUuc2V0RnVsbFllYXIodC55KSxlfXJldHVybiBuZXcgRGF0ZSh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpfWZ1bmN0aW9uIEFUKHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIGU9bmV3IERhdGUoRGF0ZS5VVEMoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKTtyZXR1cm4gZS5zZXRVVENGdWxsWWVhcih0LnkpLGV9cmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHQueSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpfWZ1bmN0aW9uIGtUKHQsZSxuKXtyZXR1cm57eTp0LG06ZSxkOm4sSDowLE06MCxTOjAsTDowfX1mdW5jdGlvbiBMVCh0KXt2YXIgZT10LmRhdGVUaW1lLG49dC5kYXRlLGk9dC50aW1lLHI9dC5wZXJpb2RzLG89dC5kYXlzLGE9dC5zaG9ydERheXMscz10Lm1vbnRocyxsPXQuc2hvcnRNb250aHMsYz1VVChyKSx1PWpUKHIpLGg9VVQobyksZD1qVChvKSxwPVVUKGEpLGY9alQoYSksbT1VVChzKSxnPWpUKHMpLF89VVQobCkseT1qVChsKSx2PXthOmZ1bmN0aW9uIGIodCl7cmV0dXJuIGFbdC5nZXREYXkoKV19LEE6ZnVuY3Rpb24geCh0KXtyZXR1cm4gb1t0LmdldERheSgpXX0sYjpmdW5jdGlvbiB3KHQpe3JldHVybiBsW3QuZ2V0TW9udGgoKV19LEI6ZnVuY3Rpb24gUyh0KXtyZXR1cm4gc1t0LmdldE1vbnRoKCldfSxjOm51bGwsZDp1QyxlOnVDLGY6bUMsZzpUQyxHOkFDLEg6aEMsSTpkQyxqOnBDLEw6ZkMsbTpnQyxNOl9DLHA6ZnVuY3Rpb24gTSh0KXtyZXR1cm4gclsrKHQuZ2V0SG91cnMoKT49MTIpXX0scTpmdW5jdGlvbiBFKHQpe3JldHVybiAxK35+KHQuZ2V0TW9udGgoKS8zKX0sUTpaQyxzOkpDLFM6eUMsdTp2QyxVOmJDLFY6d0MsdzpTQyxXOk1DLHg6bnVsbCxYOm51bGwseTpFQyxZOkNDLFo6a0MsIiUiOktDfSxUPXthOmZ1bmN0aW9uIEModCl7cmV0dXJuIGFbdC5nZXRVVENEYXkoKV19LEE6ZnVuY3Rpb24gQSh0KXtyZXR1cm4gb1t0LmdldFVUQ0RheSgpXX0sYjpmdW5jdGlvbiBrKHQpe3JldHVybiBsW3QuZ2V0VVRDTW9udGgoKV19LEI6ZnVuY3Rpb24gTCh0KXtyZXR1cm4gc1t0LmdldFVUQ01vbnRoKCldfSxjOm51bGwsZDpMQyxlOkxDLGY6T0MsZzpxQyxHOlhDLEg6UEMsSTpOQyxqOklDLEw6UkMsbTp6QyxNOkRDLHA6ZnVuY3Rpb24gUCh0KXtyZXR1cm4gclsrKHQuZ2V0VVRDSG91cnMoKT49MTIpXX0scTpmdW5jdGlvbiBOKHQpe3JldHVybiAxK35+KHQuZ2V0VVRDTW9udGgoKS8zKX0sUTpaQyxzOkpDLFM6QkMsdTpIQyxVOkZDLFY6VUMsdzpqQyxXOkdDLHg6bnVsbCxYOm51bGwseTpXQyxZOllDLFo6JEMsIiUiOktDfSxJPXthOmZ1bmN0aW9uIFIodCxlLG4pe3ZhciBpPXAuZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC53PWZbaVswXS50b0xvd2VyQ2FzZSgpXSxuK2lbMF0ubGVuZ3RoKTotMX0sQTpmdW5jdGlvbiBPKHQsZSxuKXt2YXIgaT1oLmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIGk/KHQudz1kW2lbMF0udG9Mb3dlckNhc2UoKV0sbitpWzBdLmxlbmd0aCk6LTF9LGI6ZnVuY3Rpb24geih0LGUsbil7dmFyIGk9Xy5leGVjKGUuc2xpY2UobikpO3JldHVybiBpPyh0Lm09eVtpWzBdLnRvTG93ZXJDYXNlKCldLG4raVswXS5sZW5ndGgpOi0xfSxCOmZ1bmN0aW9uIEQodCxlLG4pe3ZhciBpPW0uZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC5tPWdbaVswXS50b0xvd2VyQ2FzZSgpXSxuK2lbMF0ubGVuZ3RoKTotMX0sYzpmdW5jdGlvbiBCKHQsbixpKXtyZXR1cm4gRyh0LGUsbixpKX0sZDp0QyxlOnRDLGY6YUMsZzpLVCxHOiRULEg6bkMsSTpuQyxqOmVDLEw6b0MsbTpRVCxNOmlDLHA6ZnVuY3Rpb24gSCh0LGUsbil7dmFyIGk9Yy5leGVjKGUuc2xpY2UobikpO3JldHVybiBpPyh0LnA9dVtpWzBdLnRvTG93ZXJDYXNlKCldLG4raVswXS5sZW5ndGgpOi0xfSxxOkpULFE6bEMsczpjQyxTOnJDLHU6V1QsVTpxVCxWOllULHc6R1QsVzpYVCx4OmZ1bmN0aW9uIEYodCxlLGkpe3JldHVybiBHKHQsbixlLGkpfSxYOmZ1bmN0aW9uIFYodCxlLG4pe3JldHVybiBHKHQsaSxlLG4pfSx5OktULFk6JFQsWjpaVCwiJSI6c0N9O2Z1bmN0aW9uIFUodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGkscixvLGE9W10scz0tMSxsPTAsYz10Lmxlbmd0aDtmb3IobiBpbnN0YW5jZW9mIERhdGV8fChuPW5ldyBEYXRlKCtuKSk7KytzPGM7KTM3PT09dC5jaGFyQ29kZUF0KHMpJiYoYS5wdXNoKHQuc2xpY2UobCxzKSksbnVsbCE9KHI9elRbaT10LmNoYXJBdCgrK3MpXSk/aT10LmNoYXJBdCgrK3MpOnI9ImUiPT09aT8iICI6IjAiLChvPWVbaV0pJiYoaT1vKG4scikpLGEucHVzaChpKSxsPXMrMSk7cmV0dXJuIGEucHVzaCh0LnNsaWNlKGwscykpLGEuam9pbigiIil9fWZ1bmN0aW9uIGoodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGkscixvPWtUKDE5MDAsdm9pZCAwLDEpO2lmKEcobyx0LG4rPSIiLDApIT1uLmxlbmd0aClyZXR1cm4gbnVsbDtpZigiUSJpbiBvKXJldHVybiBuZXcgRGF0ZShvLlEpO2lmKCJzImluIG8pcmV0dXJuIG5ldyBEYXRlKDFlMypvLnMrKCJMImluIG8/by5MOjApKTtpZihlJiYhKCJaImluIG8pJiYoby5aPTApLCJwImluIG8mJihvLkg9by5IJTEyKzEyKm8ucCksdm9pZCAwPT09by5tJiYoby5tPSJxImluIG8/by5xOjApLCJWImluIG8pe2lmKG8uVjwxfHxvLlY+NTMpcmV0dXJuIG51bGw7InciaW4gb3x8KG8udz0xKSwiWiJpbiBvPyhyPShpPUFUKGtUKG8ueSwwLDEpKSkuZ2V0VVRDRGF5KCksaT1yPjR8fDA9PT1yP2xULmNlaWwoaSk6bFQoaSksaT1yVC5vZmZzZXQoaSw3KihvLlYtMSkpLG8ueT1pLmdldFVUQ0Z1bGxZZWFyKCksby5tPWkuZ2V0VVRDTW9udGgoKSxvLmQ9aS5nZXRVVENEYXRlKCkrKG8udys2KSU3KToocj0oaT1DVChrVChvLnksMCwxKSkpLmdldERheSgpLGk9cj40fHwwPT09cj9ORS5jZWlsKGkpOk5FKGkpLGk9QUUub2Zmc2V0KGksNyooby5WLTEpKSxvLnk9aS5nZXRGdWxsWWVhcigpLG8ubT1pLmdldE1vbnRoKCksby5kPWkuZ2V0RGF0ZSgpKyhvLncrNiklNyl9ZWxzZSgiVyJpbiBvfHwiVSJpbiBvKSYmKCJ3ImluIG98fChvLnc9InUiaW4gbz9vLnUlNzoiVyJpbiBvPzE6MCkscj0iWiJpbiBvP0FUKGtUKG8ueSwwLDEpKS5nZXRVVENEYXkoKTpDVChrVChvLnksMCwxKSkuZ2V0RGF5KCksby5tPTAsby5kPSJXImluIG8/KG8udys2KSU3Kzcqby5XLShyKzUpJTc6by53Kzcqby5VLShyKzYpJTcpO3JldHVybiJaImluIG8/KG8uSCs9by5aLzEwMHwwLG8uTSs9by5aJTEwMCxBVChvKSk6Q1Qobyl9fWZ1bmN0aW9uIEcodCxlLG4saSl7Zm9yKHZhciByLG8sYT0wLHM9ZS5sZW5ndGgsbD1uLmxlbmd0aDthPHM7KXtpZihpPj1sKXJldHVybi0xO2lmKDM3PT09KHI9ZS5jaGFyQ29kZUF0KGErKykpKXtpZihyPWUuY2hhckF0KGErKyksIShvPUlbciBpbiB6VD9lLmNoYXJBdChhKyspOnJdKXx8KGk9byh0LG4saSkpPDApcmV0dXJuLTF9ZWxzZSBpZihyIT1uLmNoYXJDb2RlQXQoaSsrKSlyZXR1cm4tMX1yZXR1cm4gaX1yZXR1cm4gdi54PVUobix2KSx2Llg9VShpLHYpLHYuYz1VKGUsdiksVC54PVUobixUKSxULlg9VShpLFQpLFQuYz1VKGUsVCkse2Zvcm1hdDpmdW5jdGlvbih0KXt2YXIgZT1VKHQrPSIiLHYpO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9LHBhcnNlOmZ1bmN0aW9uKHQpe3ZhciBlPWoodCs9IiIsITEpO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9LHV0Y0Zvcm1hdDpmdW5jdGlvbih0KXt2YXIgZT1VKHQrPSIiLFQpO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9LHV0Y1BhcnNlOmZ1bmN0aW9uKHQpe3ZhciBlPWoodCs9IiIsITApO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9fX12YXIgUFQsTlQsSVQsUlQsT1QselQ9eyItIjoiIixfOiIgIiwwOiIwIn0sRFQ9L15ccypcZCsvLEJUPS9eJS8sSFQ9L1tcXF4kKis/fFtcXSgpLnt9XS9nO2Z1bmN0aW9uIEZUKHQsZSxuKXt2YXIgaT10PDA/Ii0iOiIiLHI9KGk/LXQ6dCkrIiIsbz1yLmxlbmd0aDtyZXR1cm4gaSsobzxuP25ldyBBcnJheShuLW8rMSkuam9pbihlKStyOnIpfWZ1bmN0aW9uIFZUKHQpe3JldHVybiB0LnJlcGxhY2UoSFQsIlxcJCYiKX1mdW5jdGlvbiBVVCh0KXtyZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIrdC5tYXAoVlQpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiBqVCh0KXtmb3IodmFyIGU9e30sbj0tMSxpPXQubGVuZ3RoOysrbjxpOyllW3Rbbl0udG9Mb3dlckNhc2UoKV09bjtyZXR1cm4gZX1mdW5jdGlvbiBHVCh0LGUsbil7dmFyIGk9RFQuZXhlYyhlLnNsaWNlKG4sbisxKSk7cmV0dXJuIGk/KHQudz0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBXVCh0LGUsbil7dmFyIGk9RFQuZXhlYyhlLnNsaWNlKG4sbisxKSk7cmV0dXJuIGk/KHQudT0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBxVCh0LGUsbil7dmFyIGk9RFQuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQuVT0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBZVCh0LGUsbil7dmFyIGk9RFQuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQuVj0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBYVCh0LGUsbil7dmFyIGk9RFQuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQuVz0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiAkVCh0LGUsbil7dmFyIGk9RFQuZXhlYyhlLnNsaWNlKG4sbis0KSk7cmV0dXJuIGk/KHQueT0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBLVCh0LGUsbil7dmFyIGk9RFQuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQueT0raVswXSsoK2lbMF0+Njg/MTkwMDoyZTMpLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFpUKHQsZSxuKXt2YXIgaT0vXihaKXwoWystXVxkXGQpKD86Oj8oXGRcZCkpPy8uZXhlYyhlLnNsaWNlKG4sbis2KSk7cmV0dXJuIGk/KHQuWj1pWzFdPzA6LShpWzJdKyhpWzNdfHwiMDAiKSksbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gSlQodCxlLG4pe3ZhciBpPURULmV4ZWMoZS5zbGljZShuLG4rMSkpO3JldHVybiBpPyh0LnE9MyppWzBdLTMsbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gUVQodCxlLG4pe3ZhciBpPURULmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0Lm09aVswXS0xLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHRDKHQsZSxuKXt2YXIgaT1EVC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5kPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGVDKHQsZSxuKXt2YXIgaT1EVC5leGVjKGUuc2xpY2UobixuKzMpKTtyZXR1cm4gaT8odC5tPTAsdC5kPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG5DKHQsZSxuKXt2YXIgaT1EVC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5IPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGlDKHQsZSxuKXt2YXIgaT1EVC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5NPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHJDKHQsZSxuKXt2YXIgaT1EVC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5TPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG9DKHQsZSxuKXt2YXIgaT1EVC5leGVjKGUuc2xpY2UobixuKzMpKTtyZXR1cm4gaT8odC5MPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGFDKHQsZSxuKXt2YXIgaT1EVC5leGVjKGUuc2xpY2UobixuKzYpKTtyZXR1cm4gaT8odC5MPU1hdGguZmxvb3IoaVswXS8xZTMpLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHNDKHQsZSxuKXt2YXIgaT1CVC5leGVjKGUuc2xpY2UobixuKzEpKTtyZXR1cm4gaT9uK2lbMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGxDKHQsZSxuKXt2YXIgaT1EVC5leGVjKGUuc2xpY2UobikpO3JldHVybiBpPyh0LlE9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gY0ModCxlLG4pe3ZhciBpPURULmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIGk/KHQucz0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1Qyh0LGUpe3JldHVybiBGVCh0LmdldERhdGUoKSxlLDIpfWZ1bmN0aW9uIGhDKHQsZSl7cmV0dXJuIEZUKHQuZ2V0SG91cnMoKSxlLDIpfWZ1bmN0aW9uIGRDKHQsZSl7cmV0dXJuIEZUKHQuZ2V0SG91cnMoKSUxMnx8MTIsZSwyKX1mdW5jdGlvbiBwQyh0LGUpe3JldHVybiBGVCgxK0FFLmNvdW50KCRFKHQpLHQpLGUsMyl9ZnVuY3Rpb24gZkModCxlKXtyZXR1cm4gRlQodC5nZXRNaWxsaXNlY29uZHMoKSxlLDMpfWZ1bmN0aW9uIG1DKHQsZSl7cmV0dXJuIGZDKHQsZSkrIjAwMCJ9ZnVuY3Rpb24gZ0ModCxlKXtyZXR1cm4gRlQodC5nZXRNb250aCgpKzEsZSwyKX1mdW5jdGlvbiBfQyh0LGUpe3JldHVybiBGVCh0LmdldE1pbnV0ZXMoKSxlLDIpfWZ1bmN0aW9uIHlDKHQsZSl7cmV0dXJuIEZUKHQuZ2V0U2Vjb25kcygpLGUsMil9ZnVuY3Rpb24gdkModCl7dmFyIGU9dC5nZXREYXkoKTtyZXR1cm4gMD09PWU/NzplfWZ1bmN0aW9uIGJDKHQsZSl7cmV0dXJuIEZUKFBFLmNvdW50KCRFKHQpLTEsdCksZSwyKX1mdW5jdGlvbiB4Qyh0KXt2YXIgZT10LmdldERheSgpO3JldHVybiBlPj00fHwwPT09ZT9PRSh0KTpPRS5jZWlsKHQpfWZ1bmN0aW9uIHdDKHQsZSl7cmV0dXJuIHQ9eEModCksRlQoT0UuY291bnQoJEUodCksdCkrKDQ9PT0kRSh0KS5nZXREYXkoKSksZSwyKX1mdW5jdGlvbiBTQyh0KXtyZXR1cm4gdC5nZXREYXkoKX1mdW5jdGlvbiBNQyh0LGUpe3JldHVybiBGVChORS5jb3VudCgkRSh0KS0xLHQpLGUsMil9ZnVuY3Rpb24gRUModCxlKXtyZXR1cm4gRlQodC5nZXRGdWxsWWVhcigpJTEwMCxlLDIpfWZ1bmN0aW9uIFRDKHQsZSl7cmV0dXJuIEZUKCh0PXhDKHQpKS5nZXRGdWxsWWVhcigpJTEwMCxlLDIpfWZ1bmN0aW9uIENDKHQsZSl7cmV0dXJuIEZUKHQuZ2V0RnVsbFllYXIoKSUxZTQsZSw0KX1mdW5jdGlvbiBBQyh0LGUpe3ZhciBuPXQuZ2V0RGF5KCk7cmV0dXJuIEZUKCh0PW4+PTR8fDA9PT1uP09FKHQpOk9FLmNlaWwodCkpLmdldEZ1bGxZZWFyKCklMWU0LGUsNCl9ZnVuY3Rpb24ga0ModCl7dmFyIGU9dC5nZXRUaW1lem9uZU9mZnNldCgpO3JldHVybihlPjA/Ii0iOihlKj0tMSwiKyIpKStGVChlLzYwfDAsIjAiLDIpK0ZUKGUlNjAsIjAiLDIpfWZ1bmN0aW9uIExDKHQsZSl7cmV0dXJuIEZUKHQuZ2V0VVRDRGF0ZSgpLGUsMil9ZnVuY3Rpb24gUEModCxlKXtyZXR1cm4gRlQodC5nZXRVVENIb3VycygpLGUsMil9ZnVuY3Rpb24gTkModCxlKXtyZXR1cm4gRlQodC5nZXRVVENIb3VycygpJTEyfHwxMixlLDIpfWZ1bmN0aW9uIElDKHQsZSl7cmV0dXJuIEZUKDErclQuY291bnQoRVQodCksdCksZSwzKX1mdW5jdGlvbiBSQyh0LGUpe3JldHVybiBGVCh0LmdldFVUQ01pbGxpc2Vjb25kcygpLGUsMyl9ZnVuY3Rpb24gT0ModCxlKXtyZXR1cm4gUkModCxlKSsiMDAwIn1mdW5jdGlvbiB6Qyh0LGUpe3JldHVybiBGVCh0LmdldFVUQ01vbnRoKCkrMSxlLDIpfWZ1bmN0aW9uIERDKHQsZSl7cmV0dXJuIEZUKHQuZ2V0VVRDTWludXRlcygpLGUsMil9ZnVuY3Rpb24gQkModCxlKXtyZXR1cm4gRlQodC5nZXRVVENTZWNvbmRzKCksZSwyKX1mdW5jdGlvbiBIQyh0KXt2YXIgZT10LmdldFVUQ0RheSgpO3JldHVybiAwPT09ZT83OmV9ZnVuY3Rpb24gRkModCxlKXtyZXR1cm4gRlQoc1QuY291bnQoRVQodCktMSx0KSxlLDIpfWZ1bmN0aW9uIFZDKHQpe3ZhciBlPXQuZ2V0VVRDRGF5KCk7cmV0dXJuIGU+PTR8fDA9PT1lP2hUKHQpOmhULmNlaWwodCl9ZnVuY3Rpb24gVUModCxlKXtyZXR1cm4gdD1WQyh0KSxGVChoVC5jb3VudChFVCh0KSx0KSsoND09PUVUKHQpLmdldFVUQ0RheSgpKSxlLDIpfWZ1bmN0aW9uIGpDKHQpe3JldHVybiB0LmdldFVUQ0RheSgpfWZ1bmN0aW9uIEdDKHQsZSl7cmV0dXJuIEZUKGxULmNvdW50KEVUKHQpLTEsdCksZSwyKX1mdW5jdGlvbiBXQyh0LGUpe3JldHVybiBGVCh0LmdldFVUQ0Z1bGxZZWFyKCklMTAwLGUsMil9ZnVuY3Rpb24gcUModCxlKXtyZXR1cm4gRlQoKHQ9VkModCkpLmdldFVUQ0Z1bGxZZWFyKCklMTAwLGUsMil9ZnVuY3Rpb24gWUModCxlKXtyZXR1cm4gRlQodC5nZXRVVENGdWxsWWVhcigpJTFlNCxlLDQpfWZ1bmN0aW9uIFhDKHQsZSl7dmFyIG49dC5nZXRVVENEYXkoKTtyZXR1cm4gRlQoKHQ9bj49NHx8MD09PW4/aFQodCk6aFQuY2VpbCh0KSkuZ2V0VVRDRnVsbFllYXIoKSUxZTQsZSw0KX1mdW5jdGlvbiAkQygpe3JldHVybiIrMDAwMCJ9ZnVuY3Rpb24gS0MoKXtyZXR1cm4iJSJ9ZnVuY3Rpb24gWkModCl7cmV0dXJuK3R9ZnVuY3Rpb24gSkModCl7cmV0dXJuIE1hdGguZmxvb3IoK3QvMWUzKX1mdW5jdGlvbiBRQyh0KXtyZXR1cm4gUFQ9TFQodCksTlQ9UFQuZm9ybWF0LElUPVBULnBhcnNlLFJUPVBULnV0Y0Zvcm1hdCxPVD1QVC51dGNQYXJzZSxQVH1RQyh7ZGF0ZVRpbWU6IiV4LCAlWCIsZGF0ZToiJS1tLyUtZC8lWSIsdGltZToiJS1JOiVNOiVTICVwIixwZXJpb2RzOlsiQU0iLCJQTSJdLGRheXM6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLHNob3J0RGF5czpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLG1vbnRoczpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sc2hvcnRNb250aHM6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXX0pO3ZhciB0QT0iJVktJW0tJWRUJUg6JU06JVMuJUxaIixlQT1EYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZz9mdW5jdGlvbiBuQSh0KXtyZXR1cm4gdC50b0lTT1N0cmluZygpfTpSVCh0QSksaUE9K25ldyBEYXRlKCIyMDAwLTAxLTAxVDAwOjAwOjAwLjAwMFoiKT9mdW5jdGlvbiByQSh0KXt2YXIgZT1uZXcgRGF0ZSh0KTtyZXR1cm4gaXNOYU4oZSk/bnVsbDplfTpPVCh0QSksb0E9MzE1MzZlNjtmdW5jdGlvbiBhQSh0KXtyZXR1cm4gbmV3IERhdGUodCl9ZnVuY3Rpb24gc0EodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlPyt0OituZXcgRGF0ZSgrdCl9ZnVuY3Rpb24gbEEodCxlLG4saSxyLG8sYSxzLGwpe3ZhciBjPUJNKFBNLFBNKSx1PWMuaW52ZXJ0LGg9Yy5kb21haW4sZD1sKCIuJUwiKSxwPWwoIjolUyIpLGY9bCgiJUk6JU0iKSxtPWwoIiVJICVwIiksZz1sKCIlYSAlZCIpLF89bCgiJWIgJWQiKSx5PWwoIiVCIiksdj1sKCIlWSIpLGI9W1thLDEsMWUzXSxbYSw1LDVlM10sW2EsMTUsMTVlM10sW2EsMzAsM2U0XSxbbywxLDZlNF0sW28sNSwzZTVdLFtvLDE1LDllNV0sW28sMzAsMThlNV0sW3IsMSwzNmU1XSxbciwzLDEwOGU1XSxbciw2LDIxNmU1XSxbciwxMiw0MzJlNV0sW2ksMSw4NjRlNV0sW2ksMiwxNzI4ZTVdLFtuLDEsNjA0OGU1XSxbZSwxLDI1OTJlNl0sW2UsMyw3Nzc2ZTZdLFt0LDEsb0FdXTtmdW5jdGlvbiB4KHMpe3JldHVybihhKHMpPHM/ZDpvKHMpPHM/cDpyKHMpPHM/ZjppKHMpPHM/bTplKHMpPHM/bihzKTxzP2c6Xzp0KHMpPHM/eTp2KShzKX1mdW5jdGlvbiB3KGUsbixpLHIpe2lmKG51bGw9PWUmJihlPTEwKSwibnVtYmVyIj09dHlwZW9mIGUpe3ZhciBvPU1hdGguYWJzKGktbikvZSxhPXhsKChmdW5jdGlvbih0KXtyZXR1cm4gdFsyXX0pKS5yaWdodChiLG8pO2E9PT1iLmxlbmd0aD8ocj1VbChuL29BLGkvb0EsZSksZT10KTphPyhyPShhPWJbby9iW2EtMV1bMl08YlthXVsyXS9vP2EtMTphXSlbMV0sZT1hWzBdKToocj1NYXRoLm1heChVbChuLGksZSksMSksZT1zKX1yZXR1cm4gbnVsbD09cj9lOmUuZXZlcnkocil9cmV0dXJuIGMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRGF0ZSh1KHQpKX0sYy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/aCh3TS5jYWxsKHQsc0EpKTpoKCkubWFwKGFBKX0sYy50aWNrcz1mdW5jdGlvbih0LGUpe3ZhciBuLGk9aCgpLHI9aVswXSxvPWlbaS5sZW5ndGgtMV0sYT1vPHI7cmV0dXJuIGEmJihuPXIscj1vLG89biksbj0obj13KHQscixvLGUpKT9uLnJhbmdlKHIsbysxKTpbXSxhP24ucmV2ZXJzZSgpOm59LGMudGlja0Zvcm1hdD1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT1lP3g6bChlKX0sYy5uaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIG49aCgpO3JldHVybih0PXcodCxuWzBdLG5bbi5sZW5ndGgtMV0sZSkpP2goVU0obix0KSk6Y30sYy5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHpNKGMsbEEodCxlLG4saSxyLG8sYSxzLGwpKX0sY31mdW5jdGlvbiBjQSgpe3JldHVybiB2TS5hcHBseShsQSgkRSxxRSxQRSxBRSxFRSx3RSx2RSxoRSxOVCkuZG9tYWluKFtuZXcgRGF0ZSgyZTMsMCwxKSxuZXcgRGF0ZSgyZTMsMCwyKV0pLGFyZ3VtZW50cyl9ZnVuY3Rpb24gdUEoKXt2YXIgdCxlLG4saSxyLG89MCxhPTEscz1QTSxsPSExO2Z1bmN0aW9uIGMoZSl7cmV0dXJuIGlzTmFOKGU9K2UpP3I6cygwPT09bj8uNTooZT0oaShlKS10KSpuLGw/TWF0aC5tYXgoMCxNYXRoLm1pbigxLGUpKTplKSl9cmV0dXJuIGMuZG9tYWluPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWkobz0rclswXSksZT1pKGE9K3JbMV0pLG49dD09PWU/MDoxLyhlLXQpLGMpOltvLGFdfSxjLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPSEhdCxjKTpsfSxjLmludGVycG9sYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz10LGMpOnN9LGMudW5rbm93bj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LGMpOnJ9LGZ1bmN0aW9uKHIpe3JldHVybiBpPXIsdD1yKG8pLGU9cihhKSxuPXQ9PT1lPzA6MS8oZS10KSxjfX1mdW5jdGlvbiBoQSh0LGUpe3JldHVybiBlLmRvbWFpbih0LmRvbWFpbigpKS5pbnRlcnBvbGF0b3IodC5pbnRlcnBvbGF0b3IoKSkuY2xhbXAodC5jbGFtcCgpKS51bmtub3duKHQudW5rbm93bigpKX1mdW5jdGlvbiBkQSgpe3ZhciB0PWlFKHVBKCkpO3JldHVybiB0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gaEEodCxkQSgpKS5leHBvbmVudCh0LmV4cG9uZW50KCkpfSxiTS5hcHBseSh0LGFyZ3VtZW50cyl9ZnVuY3Rpb24gcEEoKXt2YXIgdCxlLG4saSxyLG8sYSxzPTAsbD0uNSxjPTEsdT1QTSxoPSExO2Z1bmN0aW9uIGQodCl7cmV0dXJuIGlzTmFOKHQ9K3QpP2E6KHQ9LjUrKCh0PStvKHQpKS1lKSoodDxlP2k6ciksdShoP01hdGgubWF4KDAsTWF0aC5taW4oMSx0KSk6dCkpfXJldHVybiBkLmRvbWFpbj1mdW5jdGlvbihhKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1vKHM9K2FbMF0pLGU9byhsPSthWzFdKSxuPW8oYz0rYVsyXSksaT10PT09ZT8wOi41LyhlLXQpLHI9ZT09PW4/MDouNS8obi1lKSxkKTpbcyxsLGNdfSxkLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSEhdCxkKTpofSxkLmludGVycG9sYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LGQpOnV9LGQudW5rbm93bj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT10LGQpOmF9LGZ1bmN0aW9uKGEpe3JldHVybiBvPWEsdD1hKHMpLGU9YShsKSxuPWEoYyksaT10PT09ZT8wOi41LyhlLXQpLHI9ZT09PW4/MDouNS8obi1lKSxkfX1mdW5jdGlvbiBmQSgpe3ZhciB0PWlFKHBBKCkpO3JldHVybiB0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gaEEodCxmQSgpKS5leHBvbmVudCh0LmV4cG9uZW50KCkpfSxiTS5hcHBseSh0LGFyZ3VtZW50cyl9ZnVuY3Rpb24gbUEodCl7Zm9yKHZhciBlPXQubGVuZ3RoLzZ8MCxuPW5ldyBBcnJheShlKSxpPTA7aTxlOyluW2ldPSIjIit0LnNsaWNlKDYqaSw2KisraSk7cmV0dXJuIG59dmFyIGdBPW1BKCIxZjc3YjRmZjdmMGUyY2EwMmNkNjI3Mjg5NDY3YmQ4YzU2NGJlMzc3YzI3ZjdmN2ZiY2JkMjIxN2JlY2YiKSxfQT1tQSgiN2ZjOTdmYmVhZWQ0ZmRjMDg2ZmZmZjk5Mzg2Y2IwZjAwMjdmYmY1YjE3NjY2NjY2IikseUE9bUEoIjFiOWU3N2Q5NWYwMjc1NzBiM2U3Mjk4YTY2YTYxZWU2YWIwMmE2NzYxZDY2NjY2NiIpLHZBPW1BKCJhNmNlZTMxZjc4YjRiMmRmOGEzM2EwMmNmYjlhOTllMzFhMWNmZGJmNmZmZjdmMDBjYWIyZDY2YTNkOWFmZmZmOTliMTU5MjgiKSxiQT1tQSgiZmJiNGFlYjNjZGUzY2NlYmM1ZGVjYmU0ZmVkOWE2ZmZmZmNjZTVkOGJkZmRkYWVjZjJmMmYyIikseEE9bUEoImIzZTJjZGZkY2RhY2NiZDVlOGY0Y2FlNGU2ZjVjOWZmZjJhZWYxZTJjY2NjY2NjYyIpLHdBPW1BKCJlNDFhMWMzNzdlYjg0ZGFmNGE5ODRlYTNmZjdmMDBmZmZmMzNhNjU2MjhmNzgxYmY5OTk5OTkiKSxTQT1tQSgiNjZjMmE1ZmM4ZDYyOGRhMGNiZTc4YWMzYTZkODU0ZmZkOTJmZTVjNDk0YjNiM2IzIiksTUE9bUEoIjhkZDNjN2ZmZmZiM2JlYmFkYWZiODA3MjgwYjFkM2ZkYjQ2MmIzZGU2OWZjY2RlNWQ5ZDlkOWJjODBiZGNjZWJjNWZmZWQ2ZiIpLEVBPW1BKCI0ZTc5YTdmMjhlMmNlMTU3NTk3NmI3YjI1OWExNGZlZGM5NDlhZjdhYTFmZjlkYTc5Yzc1NWZiYWIwYWIiKTtmdW5jdGlvbiBUQSh0KXtyZXR1cm4gTmQodFt0Lmxlbmd0aC0xXSl9dmFyIENBPW5ldyBBcnJheSgzKS5jb25jYXQoImQ4YjM2NWY1ZjVmNTVhYjRhYyIsImE2NjExYWRmYzI3ZDgwY2RjMTAxODU3MSIsImE2NjExYWRmYzI3ZGY1ZjVmNTgwY2RjMTAxODU3MSIsIjhjNTEwYWQ4YjM2NWY2ZThjM2M3ZWFlNTVhYjRhYzAxNjY1ZSIsIjhjNTEwYWQ4YjM2NWY2ZThjM2Y1ZjVmNWM3ZWFlNTVhYjRhYzAxNjY1ZSIsIjhjNTEwYWJmODEyZGRmYzI3ZGY2ZThjM2M3ZWFlNTgwY2RjMTM1OTc4ZjAxNjY1ZSIsIjhjNTEwYWJmODEyZGRmYzI3ZGY2ZThjM2Y1ZjVmNWM3ZWFlNTgwY2RjMTM1OTc4ZjAxNjY1ZSIsIjU0MzAwNThjNTEwYWJmODEyZGRmYzI3ZGY2ZThjM2M3ZWFlNTgwY2RjMTM1OTc4ZjAxNjY1ZTAwM2MzMCIsIjU0MzAwNThjNTEwYWJmODEyZGRmYzI3ZGY2ZThjM2Y1ZjVmNWM3ZWFlNTgwY2RjMTM1OTc4ZjAxNjY1ZTAwM2MzMCIpLm1hcChtQSksQUE9VEEoQ0EpLGtBPW5ldyBBcnJheSgzKS5jb25jYXQoImFmOGRjM2Y3ZjdmNzdmYmY3YiIsIjdiMzI5NGMyYTVjZmE2ZGJhMDAwODgzNyIsIjdiMzI5NGMyYTVjZmY3ZjdmN2E2ZGJhMDAwODgzNyIsIjc2MmE4M2FmOGRjM2U3ZDRlOGQ5ZjBkMzdmYmY3YjFiNzgzNyIsIjc2MmE4M2FmOGRjM2U3ZDRlOGY3ZjdmN2Q5ZjBkMzdmYmY3YjFiNzgzNyIsIjc2MmE4Mzk5NzBhYmMyYTVjZmU3ZDRlOGQ5ZjBkM2E2ZGJhMDVhYWU2MTFiNzgzNyIsIjc2MmE4Mzk5NzBhYmMyYTVjZmU3ZDRlOGY3ZjdmN2Q5ZjBkM2E2ZGJhMDVhYWU2MTFiNzgzNyIsIjQwMDA0Yjc2MmE4Mzk5NzBhYmMyYTVjZmU3ZDRlOGQ5ZjBkM2E2ZGJhMDVhYWU2MTFiNzgzNzAwNDQxYiIsIjQwMDA0Yjc2MmE4Mzk5NzBhYmMyYTVjZmU3ZDRlOGY3ZjdmN2Q5ZjBkM2E2ZGJhMDVhYWU2MTFiNzgzNzAwNDQxYiIpLm1hcChtQSksTEE9VEEoa0EpLFBBPW5ldyBBcnJheSgzKS5jb25jYXQoImU5YTNjOWY3ZjdmN2ExZDc2YSIsImQwMWM4YmYxYjZkYWI4ZTE4NjRkYWMyNiIsImQwMWM4YmYxYjZkYWY3ZjdmN2I4ZTE4NjRkYWMyNiIsImM1MWI3ZGU5YTNjOWZkZTBlZmU2ZjVkMGExZDc2YTRkOTIyMSIsImM1MWI3ZGU5YTNjOWZkZTBlZmY3ZjdmN2U2ZjVkMGExZDc2YTRkOTIyMSIsImM1MWI3ZGRlNzdhZWYxYjZkYWZkZTBlZmU2ZjVkMGI4ZTE4NjdmYmM0MTRkOTIyMSIsImM1MWI3ZGRlNzdhZWYxYjZkYWZkZTBlZmY3ZjdmN2U2ZjVkMGI4ZTE4NjdmYmM0MTRkOTIyMSIsIjhlMDE1MmM1MWI3ZGRlNzdhZWYxYjZkYWZkZTBlZmU2ZjVkMGI4ZTE4NjdmYmM0MTRkOTIyMTI3NjQxOSIsIjhlMDE1MmM1MWI3ZGRlNzdhZWYxYjZkYWZkZTBlZmY3ZjdmN2U2ZjVkMGI4ZTE4NjdmYmM0MTRkOTIyMTI3NjQxOSIpLm1hcChtQSksTkE9VEEoUEEpLElBPW5ldyBBcnJheSgzKS5jb25jYXQoIjk5OGVjM2Y3ZjdmN2YxYTM0MCIsIjVlM2M5OWIyYWJkMmZkYjg2M2U2NjEwMSIsIjVlM2M5OWIyYWJkMmY3ZjdmN2ZkYjg2M2U2NjEwMSIsIjU0Mjc4ODk5OGVjM2Q4ZGFlYmZlZTBiNmYxYTM0MGIzNTgwNiIsIjU0Mjc4ODk5OGVjM2Q4ZGFlYmY3ZjdmN2ZlZTBiNmYxYTM0MGIzNTgwNiIsIjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNiIsIjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmY3ZjdmN2ZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNiIsIjJkMDA0YjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNjdmM2IwOCIsIjJkMDA0YjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmY3ZjdmN2ZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNjdmM2IwOCIpLm1hcChtQSksUkE9VEEoSUEpLE9BPW5ldyBBcnJheSgzKS5jb25jYXQoImVmOGE2MmY3ZjdmNzY3YTljZiIsImNhMDAyMGY0YTU4MjkyYzVkZTA1NzFiMCIsImNhMDAyMGY0YTU4MmY3ZjdmNzkyYzVkZTA1NzFiMCIsImIyMTgyYmVmOGE2MmZkZGJjN2QxZTVmMDY3YTljZjIxNjZhYyIsImIyMTgyYmVmOGE2MmZkZGJjN2Y3ZjdmN2QxZTVmMDY3YTljZjIxNjZhYyIsImIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2QxZTVmMDkyYzVkZTQzOTNjMzIxNjZhYyIsImIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2Y3ZjdmN2QxZTVmMDkyYzVkZTQzOTNjMzIxNjZhYyIsIjY3MDAxZmIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2QxZTVmMDkyYzVkZTQzOTNjMzIxNjZhYzA1MzA2MSIsIjY3MDAxZmIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2Y3ZjdmN2QxZTVmMDkyYzVkZTQzOTNjMzIxNjZhYzA1MzA2MSIpLm1hcChtQSksekE9VEEoT0EpLERBPW5ldyBBcnJheSgzKS5jb25jYXQoImVmOGE2MmZmZmZmZjk5OTk5OSIsImNhMDAyMGY0YTU4MmJhYmFiYTQwNDA0MCIsImNhMDAyMGY0YTU4MmZmZmZmZmJhYmFiYTQwNDA0MCIsImIyMTgyYmVmOGE2MmZkZGJjN2UwZTBlMDk5OTk5OTRkNGQ0ZCIsImIyMTgyYmVmOGE2MmZkZGJjN2ZmZmZmZmUwZTBlMDk5OTk5OTRkNGQ0ZCIsImIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2UwZTBlMGJhYmFiYTg3ODc4NzRkNGQ0ZCIsImIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2ZmZmZmZmUwZTBlMGJhYmFiYTg3ODc4NzRkNGQ0ZCIsIjY3MDAxZmIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2UwZTBlMGJhYmFiYTg3ODc4NzRkNGQ0ZDFhMWExYSIsIjY3MDAxZmIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2ZmZmZmZmUwZTBlMGJhYmFiYTg3ODc4NzRkNGQ0ZDFhMWExYSIpLm1hcChtQSksQkE9VEEoREEpLEhBPW5ldyBBcnJheSgzKS5jb25jYXQoImZjOGQ1OWZmZmZiZjkxYmZkYiIsImQ3MTkxY2ZkYWU2MWFiZDllOTJjN2JiNiIsImQ3MTkxY2ZkYWU2MWZmZmZiZmFiZDllOTJjN2JiNiIsImQ3MzAyN2ZjOGQ1OWZlZTA5MGUwZjNmODkxYmZkYjQ1NzViNCIsImQ3MzAyN2ZjOGQ1OWZlZTA5MGZmZmZiZmUwZjNmODkxYmZkYjQ1NzViNCIsImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNCIsImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGZmZmZiZmUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNCIsImE1MDAyNmQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNDMxMzY5NSIsImE1MDAyNmQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGZmZmZiZmUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNDMxMzY5NSIpLm1hcChtQSksRkE9VEEoSEEpLFZBPW5ldyBBcnJheSgzKS5jb25jYXQoImZjOGQ1OWZmZmZiZjkxY2Y2MCIsImQ3MTkxY2ZkYWU2MWE2ZDk2YTFhOTY0MSIsImQ3MTkxY2ZkYWU2MWZmZmZiZmE2ZDk2YTFhOTY0MSIsImQ3MzAyN2ZjOGQ1OWZlZTA4YmQ5ZWY4YjkxY2Y2MDFhOTg1MCIsImQ3MzAyN2ZjOGQ1OWZlZTA4YmZmZmZiZmQ5ZWY4YjkxY2Y2MDFhOTg1MCIsImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4YmQ5ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MCIsImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmQ5ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MCIsImE1MDAyNmQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4YmQ5ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MDAwNjgzNyIsImE1MDAyNmQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmQ5ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MDAwNjgzNyIpLm1hcChtQSksVUE9VEEoVkEpLGpBPW5ldyBBcnJheSgzKS5jb25jYXQoImZjOGQ1OWZmZmZiZjk5ZDU5NCIsImQ3MTkxY2ZkYWU2MWFiZGRhNDJiODNiYSIsImQ3MTkxY2ZkYWU2MWZmZmZiZmFiZGRhNDJiODNiYSIsImQ1M2U0ZmZjOGQ1OWZlZTA4YmU2ZjU5ODk5ZDU5NDMyODhiZCIsImQ1M2U0ZmZjOGQ1OWZlZTA4YmZmZmZiZmU2ZjU5ODk5ZDU5NDMyODhiZCIsImQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZCIsImQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZCIsIjllMDE0MmQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZDVlNGZhMiIsIjllMDE0MmQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZDVlNGZhMiIpLm1hcChtQSksR0E9VEEoakEpLFdBPW5ldyBBcnJheSgzKS5jb25jYXQoImU1ZjVmOTk5ZDhjOTJjYTI1ZiIsImVkZjhmYmIyZTJlMjY2YzJhNDIzOGI0NSIsImVkZjhmYmIyZTJlMjY2YzJhNDJjYTI1ZjAwNmQyYyIsImVkZjhmYmNjZWNlNjk5ZDhjOTY2YzJhNDJjYTI1ZjAwNmQyYyIsImVkZjhmYmNjZWNlNjk5ZDhjOTY2YzJhNDQxYWU3NjIzOGI0NTAwNTgyNCIsImY3ZmNmZGU1ZjVmOWNjZWNlNjk5ZDhjOTY2YzJhNDQxYWU3NjIzOGI0NTAwNTgyNCIsImY3ZmNmZGU1ZjVmOWNjZWNlNjk5ZDhjOTY2YzJhNDQxYWU3NjIzOGI0NTAwNmQyYzAwNDQxYiIpLm1hcChtQSkscUE9VEEoV0EpLFlBPW5ldyBBcnJheSgzKS5jb25jYXQoImUwZWNmNDllYmNkYTg4NTZhNyIsImVkZjhmYmIzY2RlMzhjOTZjNjg4NDE5ZCIsImVkZjhmYmIzY2RlMzhjOTZjNjg4NTZhNzgxMGY3YyIsImVkZjhmYmJmZDNlNjllYmNkYThjOTZjNjg4NTZhNzgxMGY3YyIsImVkZjhmYmJmZDNlNjllYmNkYThjOTZjNjhjNmJiMTg4NDE5ZDZlMDE2YiIsImY3ZmNmZGUwZWNmNGJmZDNlNjllYmNkYThjOTZjNjhjNmJiMTg4NDE5ZDZlMDE2YiIsImY3ZmNmZGUwZWNmNGJmZDNlNjllYmNkYThjOTZjNjhjNmJiMTg4NDE5ZDgxMGY3YzRkMDA0YiIpLm1hcChtQSksWEE9VEEoWUEpLCRBPW5ldyBBcnJheSgzKS5jb25jYXQoImUwZjNkYmE4ZGRiNTQzYTJjYSIsImYwZjllOGJhZTRiYzdiY2NjNDJiOGNiZSIsImYwZjllOGJhZTRiYzdiY2NjNDQzYTJjYTA4NjhhYyIsImYwZjllOGNjZWJjNWE4ZGRiNTdiY2NjNDQzYTJjYTA4NjhhYyIsImYwZjllOGNjZWJjNWE4ZGRiNTdiY2NjNDRlYjNkMzJiOGNiZTA4NTg5ZSIsImY3ZmNmMGUwZjNkYmNjZWJjNWE4ZGRiNTdiY2NjNDRlYjNkMzJiOGNiZTA4NTg5ZSIsImY3ZmNmMGUwZjNkYmNjZWJjNWE4ZGRiNTdiY2NjNDRlYjNkMzJiOGNiZTA4NjhhYzA4NDA4MSIpLm1hcChtQSksS0E9VEEoJEEpLFpBPW5ldyBBcnJheSgzKS5jb25jYXQoImZlZThjOGZkYmI4NGUzNGEzMyIsImZlZjBkOWZkY2M4YWZjOGQ1OWQ3MzAxZiIsImZlZjBkOWZkY2M4YWZjOGQ1OWUzNGEzM2IzMDAwMCIsImZlZjBkOWZkZDQ5ZWZkYmI4NGZjOGQ1OWUzNGEzM2IzMDAwMCIsImZlZjBkOWZkZDQ5ZWZkYmI4NGZjOGQ1OWVmNjU0OGQ3MzAxZjk5MDAwMCIsImZmZjdlY2ZlZThjOGZkZDQ5ZWZkYmI4NGZjOGQ1OWVmNjU0OGQ3MzAxZjk5MDAwMCIsImZmZjdlY2ZlZThjOGZkZDQ5ZWZkYmI4NGZjOGQ1OWVmNjU0OGQ3MzAxZmIzMDAwMDdmMDAwMCIpLm1hcChtQSksSkE9VEEoWkEpLFFBPW5ldyBBcnJheSgzKS5jb25jYXQoImVjZTJmMGE2YmRkYjFjOTA5OSIsImY2ZWZmN2JkYzllMTY3YTljZjAyODE4YSIsImY2ZWZmN2JkYzllMTY3YTljZjFjOTA5OTAxNmM1OSIsImY2ZWZmN2QwZDFlNmE2YmRkYjY3YTljZjFjOTA5OTAxNmM1OSIsImY2ZWZmN2QwZDFlNmE2YmRkYjY3YTljZjM2OTBjMDAyODE4YTAxNjQ1MCIsImZmZjdmYmVjZTJmMGQwZDFlNmE2YmRkYjY3YTljZjM2OTBjMDAyODE4YTAxNjQ1MCIsImZmZjdmYmVjZTJmMGQwZDFlNmE2YmRkYjY3YTljZjM2OTBjMDAyODE4YTAxNmM1OTAxNDYzNiIpLm1hcChtQSksdGs9VEEoUUEpLGVrPW5ldyBBcnJheSgzKS5jb25jYXQoImVjZTdmMmE2YmRkYjJiOGNiZSIsImYxZWVmNmJkYzllMTc0YTljZjA1NzBiMCIsImYxZWVmNmJkYzllMTc0YTljZjJiOGNiZTA0NWE4ZCIsImYxZWVmNmQwZDFlNmE2YmRkYjc0YTljZjJiOGNiZTA0NWE4ZCIsImYxZWVmNmQwZDFlNmE2YmRkYjc0YTljZjM2OTBjMDA1NzBiMDAzNGU3YiIsImZmZjdmYmVjZTdmMmQwZDFlNmE2YmRkYjc0YTljZjM2OTBjMDA1NzBiMDAzNGU3YiIsImZmZjdmYmVjZTdmMmQwZDFlNmE2YmRkYjc0YTljZjM2OTBjMDA1NzBiMDA0NWE4ZDAyMzg1OCIpLm1hcChtQSksbms9VEEoZWspLGlrPW5ldyBBcnJheSgzKS5jb25jYXQoImU3ZTFlZmM5OTRjN2RkMWM3NyIsImYxZWVmNmQ3YjVkOGRmNjViMGNlMTI1NiIsImYxZWVmNmQ3YjVkOGRmNjViMGRkMWM3Nzk4MDA0MyIsImYxZWVmNmQ0YjlkYWM5OTRjN2RmNjViMGRkMWM3Nzk4MDA0MyIsImYxZWVmNmQ0YjlkYWM5OTRjN2RmNjViMGU3Mjk4YWNlMTI1NjkxMDAzZiIsImY3ZjRmOWU3ZTFlZmQ0YjlkYWM5OTRjN2RmNjViMGU3Mjk4YWNlMTI1NjkxMDAzZiIsImY3ZjRmOWU3ZTFlZmQ0YjlkYWM5OTRjN2RmNjViMGU3Mjk4YWNlMTI1Njk4MDA0MzY3MDAxZiIpLm1hcChtQSkscms9VEEoaWspLG9rPW5ldyBBcnJheSgzKS5jb25jYXQoImZkZTBkZGZhOWZiNWM1MWI4YSIsImZlZWJlMmZiYjRiOWY3NjhhMWFlMDE3ZSIsImZlZWJlMmZiYjRiOWY3NjhhMWM1MWI4YTdhMDE3NyIsImZlZWJlMmZjYzVjMGZhOWZiNWY3NjhhMWM1MWI4YTdhMDE3NyIsImZlZWJlMmZjYzVjMGZhOWZiNWY3NjhhMWRkMzQ5N2FlMDE3ZTdhMDE3NyIsImZmZjdmM2ZkZTBkZGZjYzVjMGZhOWZiNWY3NjhhMWRkMzQ5N2FlMDE3ZTdhMDE3NyIsImZmZjdmM2ZkZTBkZGZjYzVjMGZhOWZiNWY3NjhhMWRkMzQ5N2FlMDE3ZTdhMDE3NzQ5MDA2YSIpLm1hcChtQSksYWs9VEEob2spLHNrPW5ldyBBcnJheSgzKS5jb25jYXQoImVkZjhiMTdmY2RiYjJjN2ZiOCIsImZmZmZjY2ExZGFiNDQxYjZjNDIyNWVhOCIsImZmZmZjY2ExZGFiNDQxYjZjNDJjN2ZiODI1MzQ5NCIsImZmZmZjY2M3ZTliNDdmY2RiYjQxYjZjNDJjN2ZiODI1MzQ5NCIsImZmZmZjY2M3ZTliNDdmY2RiYjQxYjZjNDFkOTFjMDIyNWVhODBjMmM4NCIsImZmZmZkOWVkZjhiMWM3ZTliNDdmY2RiYjQxYjZjNDFkOTFjMDIyNWVhODBjMmM4NCIsImZmZmZkOWVkZjhiMWM3ZTliNDdmY2RiYjQxYjZjNDFkOTFjMDIyNWVhODI1MzQ5NDA4MWQ1OCIpLm1hcChtQSksbGs9VEEoc2spLGNrPW5ldyBBcnJheSgzKS5jb25jYXQoImY3ZmNiOWFkZGQ4ZTMxYTM1NCIsImZmZmZjY2MyZTY5OTc4YzY3OTIzODQ0MyIsImZmZmZjY2MyZTY5OTc4YzY3OTMxYTM1NDAwNjgzNyIsImZmZmZjY2Q5ZjBhM2FkZGQ4ZTc4YzY3OTMxYTM1NDAwNjgzNyIsImZmZmZjY2Q5ZjBhM2FkZGQ4ZTc4YzY3OTQxYWI1ZDIzODQ0MzAwNWEzMiIsImZmZmZlNWY3ZmNiOWQ5ZjBhM2FkZGQ4ZTc4YzY3OTQxYWI1ZDIzODQ0MzAwNWEzMiIsImZmZmZlNWY3ZmNiOWQ5ZjBhM2FkZGQ4ZTc4YzY3OTQxYWI1ZDIzODQ0MzAwNjgzNzAwNDUyOSIpLm1hcChtQSksdWs9VEEoY2spLGhrPW5ldyBBcnJheSgzKS5jb25jYXQoImZmZjdiY2ZlYzQ0ZmQ5NWYwZSIsImZmZmZkNGZlZDk4ZWZlOTkyOWNjNGMwMiIsImZmZmZkNGZlZDk4ZWZlOTkyOWQ5NWYwZTk5MzQwNCIsImZmZmZkNGZlZTM5MWZlYzQ0ZmZlOTkyOWQ5NWYwZTk5MzQwNCIsImZmZmZkNGZlZTM5MWZlYzQ0ZmZlOTkyOWVjNzAxNGNjNGMwMjhjMmQwNCIsImZmZmZlNWZmZjdiY2ZlZTM5MWZlYzQ0ZmZlOTkyOWVjNzAxNGNjNGMwMjhjMmQwNCIsImZmZmZlNWZmZjdiY2ZlZTM5MWZlYzQ0ZmZlOTkyOWVjNzAxNGNjNGMwMjk5MzQwNDY2MjUwNiIpLm1hcChtQSksZGs9VEEoaGspLHBrPW5ldyBBcnJheSgzKS5jb25jYXQoImZmZWRhMGZlYjI0Y2YwM2IyMCIsImZmZmZiMmZlY2M1Y2ZkOGQzY2UzMWExYyIsImZmZmZiMmZlY2M1Y2ZkOGQzY2YwM2IyMGJkMDAyNiIsImZmZmZiMmZlZDk3NmZlYjI0Y2ZkOGQzY2YwM2IyMGJkMDAyNiIsImZmZmZiMmZlZDk3NmZlYjI0Y2ZkOGQzY2ZjNGUyYWUzMWExY2IxMDAyNiIsImZmZmZjY2ZmZWRhMGZlZDk3NmZlYjI0Y2ZkOGQzY2ZjNGUyYWUzMWExY2IxMDAyNiIsImZmZmZjY2ZmZWRhMGZlZDk3NmZlYjI0Y2ZkOGQzY2ZjNGUyYWUzMWExY2JkMDAyNjgwMDAyNiIpLm1hcChtQSksZms9VEEocGspLG1rPW5ldyBBcnJheSgzKS5jb25jYXQoImRlZWJmNzllY2FlMTMxODJiZCIsImVmZjNmZmJkZDdlNzZiYWVkNjIxNzFiNSIsImVmZjNmZmJkZDdlNzZiYWVkNjMxODJiZDA4NTE5YyIsImVmZjNmZmM2ZGJlZjllY2FlMTZiYWVkNjMxODJiZDA4NTE5YyIsImVmZjNmZmM2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NDU5NCIsImY3ZmJmZmRlZWJmN2M2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NDU5NCIsImY3ZmJmZmRlZWJmN2M2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NTE5YzA4MzA2YiIpLm1hcChtQSksZ2s9VEEobWspLF9rPW5ldyBBcnJheSgzKS5jb25jYXQoImU1ZjVlMGExZDk5YjMxYTM1NCIsImVkZjhlOWJhZTRiMzc0YzQ3NjIzOGI0NSIsImVkZjhlOWJhZTRiMzc0YzQ3NjMxYTM1NDAwNmQyYyIsImVkZjhlOWM3ZTljMGExZDk5Yjc0YzQ3NjMxYTM1NDAwNmQyYyIsImVkZjhlOWM3ZTljMGExZDk5Yjc0YzQ3NjQxYWI1ZDIzOGI0NTAwNWEzMiIsImY3ZmNmNWU1ZjVlMGM3ZTljMGExZDk5Yjc0YzQ3NjQxYWI1ZDIzOGI0NTAwNWEzMiIsImY3ZmNmNWU1ZjVlMGM3ZTljMGExZDk5Yjc0YzQ3NjQxYWI1ZDIzOGI0NTAwNmQyYzAwNDQxYiIpLm1hcChtQSkseWs9VEEoX2spLHZrPW5ldyBBcnJheSgzKS5jb25jYXQoImYwZjBmMGJkYmRiZDYzNjM2MyIsImY3ZjdmN2NjY2NjYzk2OTY5NjUyNTI1MiIsImY3ZjdmN2NjY2NjYzk2OTY5NjYzNjM2MzI1MjUyNSIsImY3ZjdmN2Q5ZDlkOWJkYmRiZDk2OTY5NjYzNjM2MzI1MjUyNSIsImY3ZjdmN2Q5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUyNTI1MjI1MjUyNSIsImZmZmZmZmYwZjBmMGQ5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUyNTI1MjI1MjUyNSIsImZmZmZmZmYwZjBmMGQ5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUyNTI1MjI1MjUyNTAwMDAwMCIpLm1hcChtQSksYms9VEEodmspLHhrPW5ldyBBcnJheSgzKS5jb25jYXQoImVmZWRmNWJjYmRkYzc1NmJiMSIsImYyZjBmN2NiYzllMjllOWFjODZhNTFhMyIsImYyZjBmN2NiYzllMjllOWFjODc1NmJiMTU0Mjc4ZiIsImYyZjBmN2RhZGFlYmJjYmRkYzllOWFjODc1NmJiMTU0Mjc4ZiIsImYyZjBmN2RhZGFlYmJjYmRkYzllOWFjODgwN2RiYTZhNTFhMzRhMTQ4NiIsImZjZmJmZGVmZWRmNWRhZGFlYmJjYmRkYzllOWFjODgwN2RiYTZhNTFhMzRhMTQ4NiIsImZjZmJmZGVmZWRmNWRhZGFlYmJjYmRkYzllOWFjODgwN2RiYTZhNTFhMzU0Mjc4ZjNmMDA3ZCIpLm1hcChtQSksd2s9VEEoeGspLFNrPW5ldyBBcnJheSgzKS5jb25jYXQoImZlZTBkMmZjOTI3MmRlMmQyNiIsImZlZTVkOWZjYWU5MWZiNmE0YWNiMTgxZCIsImZlZTVkOWZjYWU5MWZiNmE0YWRlMmQyNmE1MGYxNSIsImZlZTVkOWZjYmJhMWZjOTI3MmZiNmE0YWRlMmQyNmE1MGYxNSIsImZlZTVkOWZjYmJhMWZjOTI3MmZiNmE0YWVmM2IyY2NiMTgxZDk5MDAwZCIsImZmZjVmMGZlZTBkMmZjYmJhMWZjOTI3MmZiNmE0YWVmM2IyY2NiMTgxZDk5MDAwZCIsImZmZjVmMGZlZTBkMmZjYmJhMWZjOTI3MmZiNmE0YWVmM2IyY2NiMTgxZGE1MGYxNTY3MDAwZCIpLm1hcChtQSksTWs9VEEoU2spLEVrPW5ldyBBcnJheSgzKS5jb25jYXQoImZlZTZjZWZkYWU2YmU2NTUwZCIsImZlZWRkZWZkYmU4NWZkOGQzY2Q5NDcwMSIsImZlZWRkZWZkYmU4NWZkOGQzY2U2NTUwZGE2MzYwMyIsImZlZWRkZWZkZDBhMmZkYWU2YmZkOGQzY2U2NTUwZGE2MzYwMyIsImZlZWRkZWZkZDBhMmZkYWU2YmZkOGQzY2YxNjkxM2Q5NDgwMThjMmQwNCIsImZmZjVlYmZlZTZjZWZkZDBhMmZkYWU2YmZkOGQzY2YxNjkxM2Q5NDgwMThjMmQwNCIsImZmZjVlYmZlZTZjZWZkZDBhMmZkYWU2YmZkOGQzY2YxNjkxM2Q5NDgwMWE2MzYwMzdmMjcwNCIpLm1hcChtQSksVGs9VEEoRWspLENrPV9wKHhkKDMwMCwuNSwwKSx4ZCgtMjQwLC41LDEpKSxBaz1fcCh4ZCgtMTAwLC43NSwuMzUpLHhkKDgwLDEuNSwuOCkpLGtrPV9wKHhkKDI2MCwuNzUsLjM1KSx4ZCg4MCwxLjUsLjgpKSxMaz14ZCgpLFBrPVVoKCksTms9TWF0aC5QSS8zLElrPTIqTWF0aC5QSS8zO2Z1bmN0aW9uIFJrKHQpe3ZhciBlPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdFtNYXRoLm1heCgwLE1hdGgubWluKGUtMSxNYXRoLmZsb29yKG4qZSkpKV19fXZhciBPaz1SayhtQSgiNDQwMTU0NDQwMjU2NDUwNDU3NDUwNTU5NDYwNzVhNDYwODVjNDYwYTVkNDYwYjVlNDcwZDYwNDcwZTYxNDcxMDYzNDcxMTY0NDcxMzY1NDgxNDY3NDgxNjY4NDgxNzY5NDgxODZhNDgxYTZjNDgxYjZkNDgxYzZlNDgxZDZmNDgxZjcwNDgyMDcxNDgyMTczNDgyMzc0NDgyNDc1NDgyNTc2NDgyNjc3NDgyODc4NDgyOTc5NDcyYTdhNDcyYzdhNDcyZDdiNDcyZTdjNDcyZjdkNDYzMDdlNDYzMjdlNDYzMzdmNDYzNDgwNDUzNTgxNDUzNzgxNDUzODgyNDQzOTgzNDQzYTgzNDQzYjg0NDMzZDg0NDMzZTg1NDIzZjg1NDI0MDg2NDI0MTg2NDE0Mjg3NDE0NDg3NDA0NTg4NDA0Njg4M2Y0Nzg4M2Y0ODg5M2U0OTg5M2U0YTg5M2U0YzhhM2Q0ZDhhM2Q0ZThhM2M0ZjhhM2M1MDhiM2I1MThiM2I1MjhiM2E1MzhiM2E1NDhjMzk1NThjMzk1NjhjMzg1ODhjMzg1OThjMzc1YThjMzc1YjhkMzY1YzhkMzY1ZDhkMzU1ZThkMzU1ZjhkMzQ2MDhkMzQ2MThkMzM2MjhkMzM2MzhkMzI2NDhlMzI2NThlMzE2NjhlMzE2NzhlMzE2ODhlMzA2OThlMzA2YThlMmY2YjhlMmY2YzhlMmU2ZDhlMmU2ZThlMmU2ZjhlMmQ3MDhlMmQ3MThlMmM3MThlMmM3MjhlMmM3MzhlMmI3NDhlMmI3NThlMmE3NjhlMmE3NzhlMmE3ODhlMjk3OThlMjk3YThlMjk3YjhlMjg3YzhlMjg3ZDhlMjc3ZThlMjc3ZjhlMjc4MDhlMjY4MThlMjY4MjhlMjY4MjhlMjU4MzhlMjU4NDhlMjU4NThlMjQ4NjhlMjQ4NzhlMjM4ODhlMjM4OThlMjM4YThkMjI4YjhkMjI4YzhkMjI4ZDhkMjE4ZThkMjE4ZjhkMjE5MDhkMjE5MThjMjA5MjhjMjA5MjhjMjA5MzhjMWY5NDhjMWY5NThiMWY5NjhiMWY5NzhiMWY5ODhiMWY5OThhMWY5YThhMWU5YjhhMWU5Yzg5MWU5ZDg5MWY5ZTg5MWY5Zjg4MWZhMDg4MWZhMTg4MWZhMTg3MWZhMjg3MjBhMzg2MjBhNDg2MjFhNTg1MjFhNjg1MjJhNzg1MjJhODg0MjNhOTgzMjRhYTgzMjVhYjgyMjVhYzgyMjZhZDgxMjdhZDgxMjhhZTgwMjlhZjdmMmFiMDdmMmNiMTdlMmRiMjdkMmViMzdjMmZiNDdjMzFiNTdiMzJiNjdhMzRiNjc5MzViNzc5MzdiODc4MzhiOTc3M2FiYTc2M2JiYjc1M2RiYzc0M2ZiYzczNDBiZDcyNDJiZTcxNDRiZjcwNDZjMDZmNDhjMTZlNGFjMTZkNGNjMjZjNGVjMzZiNTBjNDZhNTJjNTY5NTRjNTY4NTZjNjY3NThjNzY1NWFjODY0NWNjODYzNWVjOTYyNjBjYTYwNjNjYjVmNjVjYjVlNjdjYzVjNjljZDViNmNjZDVhNmVjZTU4NzBjZjU3NzNkMDU2NzVkMDU0NzdkMTUzN2FkMTUxN2NkMjUwN2ZkMzRlODFkMzRkODRkNDRiODZkNTQ5ODlkNTQ4OGJkNjQ2OGVkNjQ1OTBkNzQzOTNkNzQxOTVkODQwOThkODNlOWJkOTNjOWRkOTNiYTBkYTM5YTJkYTM3YTVkYjM2YThkYjM0YWFkYzMyYWRkYzMwYjBkZDJmYjJkZDJkYjVkZTJiYjhkZTI5YmFkZTI4YmRkZjI2YzBkZjI1YzJkZjIzYzVlMDIxYzhlMDIwY2FlMTFmY2RlMTFkZDBlMTFjZDJlMjFiZDVlMjFhZDhlMjE5ZGFlMzE5ZGRlMzE4ZGZlMzE4ZTJlNDE4ZTVlNDE5ZTdlNDE5ZWFlNTFhZWNlNTFiZWZlNTFjZjFlNTFkZjRlNjFlZjZlNjIwZjhlNjIxZmJlNzIzZmRlNzI1IikpLHprPVJrKG1BKCIwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMDkwMjAyMGIwMjAyMGQwMzAzMGYwMzAzMTIwNDA0MTQwNTA0MTYwNjA1MTgwNjA1MWEwNzA2MWMwODA3MWUwOTA3MjAwYTA4MjIwYjA5MjQwYzA5MjYwZDBhMjkwZTBiMmIxMDBiMmQxMTBjMmYxMjBkMzExMzBkMzQxNDBlMzYxNTBlMzgxNjBmM2IxODBmM2QxOTEwM2YxYTEwNDIxYzEwNDQxZDExNDcxZTExNDkyMDExNGIyMTExNGUyMjExNTAyNDEyNTMyNTEyNTUyNzEyNTgyOTExNWEyYTExNWMyYzExNWYyZDExNjEyZjExNjMzMTExNjUzMzEwNjczNDEwNjkzNjEwNmIzODEwNmMzOTBmNmUzYjBmNzAzZDBmNzEzZjBmNzI0MDBmNzQ0MjBmNzU0NDBmNzY0NTEwNzc0NzEwNzg0OTEwNzg0YTEwNzk0YzExN2E0ZTExN2I0ZjEyN2I1MTEyN2M1MjEzN2M1NDEzN2Q1NjE0N2Q1NzE1N2U1OTE1N2U1YTE2N2U1YzE2N2Y1ZDE3N2Y1ZjE4N2Y2MDE4ODA2MjE5ODA2NDFhODA2NTFhODA2NzFiODA2ODFjODE2YTFjODE2YjFkODE2ZDFkODE2ZTFlODE3MDFmODE3MjFmODE3MzIwODE3NTIxODE3NjIxODE3ODIyODE3OTIyODI3YjIzODI3YzIzODI3ZTI0ODI4MDI1ODI4MTI1ODE4MzI2ODE4NDI2ODE4NjI3ODE4ODI3ODE4OTI4ODE4YjI5ODE4YzI5ODE4ZTJhODE5MDJhODE5MTJiODE5MzJiODA5NDJjODA5NjJjODA5ODJkODA5OTJkODA5YjJlN2Y5YzJlN2Y5ZTJmN2ZhMDJmN2ZhMTMwN2VhMzMwN2VhNTMxN2VhNjMxN2RhODMyN2RhYTMzN2RhYjMzN2NhZDM0N2NhZTM0N2JiMDM1N2JiMjM1N2JiMzM2N2FiNTM2N2FiNzM3NzliODM3NzliYTM4NzhiYzM5NzhiZDM5NzdiZjNhNzdjMDNhNzZjMjNiNzVjNDNjNzVjNTNjNzRjNzNkNzNjODNlNzNjYTNlNzJjYzNmNzFjZDQwNzFjZjQwNzBkMDQxNmZkMjQyNmZkMzQzNmVkNTQ0NmRkNjQ1NmNkODQ1NmNkOTQ2NmJkYjQ3NmFkYzQ4NjlkZTQ5NjhkZjRhNjhlMDRjNjdlMjRkNjZlMzRlNjVlNDRmNjRlNTUwNjRlNzUyNjNlODUzNjJlOTU0NjJlYTU2NjFlYjU3NjBlYzU4NjBlZDVhNWZlZTViNWVlZjVkNWVmMDVmNWVmMTYwNWRmMjYyNWRmMjY0NWNmMzY1NWNmNDY3NWNmNDY5NWNmNTZiNWNmNjZjNWNmNjZlNWNmNzcwNWNmNzcyNWNmODc0NWNmODc2NWNmOTc4NWRmOTc5NWRmOTdiNWRmYTdkNWVmYTdmNWVmYTgxNWZmYjgzNWZmYjg1NjBmYjg3NjFmYzg5NjFmYzhhNjJmYzhjNjNmYzhlNjRmYzkwNjVmZDkyNjZmZDk0NjdmZDk2NjhmZDk4NjlmZDlhNmFmZDliNmJmZTlkNmNmZTlmNmRmZWExNmVmZWEzNmZmZWE1NzFmZWE3NzJmZWE5NzNmZWFhNzRmZWFjNzZmZWFlNzdmZWIwNzhmZWIyN2FmZWI0N2JmZWI2N2NmZWI3N2VmZWI5N2ZmZWJiODFmZWJkODJmZWJmODRmZWMxODVmZWMyODdmZWM0ODhmZWM2OGFmZWM4OGNmZWNhOGRmZWNjOGZmZWNkOTBmZWNmOTJmZWQxOTRmZWQzOTVmZWQ1OTdmZWQ3OTlmZWQ4OWFmZGRhOWNmZGRjOWVmZGRlYTBmZGUwYTFmZGUyYTNmZGUzYTVmZGU1YTdmZGU3YTlmZGU5YWFmZGViYWNmY2VjYWVmY2VlYjBmY2YwYjJmY2YyYjRmY2Y0YjZmY2Y2YjhmY2Y3YjlmY2Y5YmJmY2ZiYmRmY2ZkYmYiKSksRGs9UmsobUEoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwYTAyMDIwYzAyMDIwZTAzMDIxMDA0MDMxMjA0MDMxNDA1MDQxNzA2MDQxOTA3MDUxYjA4MDUxZDA5MDYxZjBhMDcyMjBiMDcyNDBjMDgyNjBkMDgyOTBlMDkyYjEwMDkyZDExMGEzMDEyMGEzMjE0MGIzNDE1MGIzNzE2MGIzOTE4MGMzYzE5MGMzZTFiMGM0MTFjMGM0MzFlMGM0NTFmMGM0ODIxMGM0YTIzMGM0YzI0MGM0ZjI2MGM1MTI4MGI1MzI5MGI1NTJiMGI1NzJkMGI1OTJmMGE1YjMxMGE1YzMyMGE1ZTM0MGE1ZjM2MDk2MTM4MDk2MjM5MDk2MzNiMDk2NDNkMDk2NTNlMDk2NjQwMGE2NzQyMGE2ODQ0MGE2ODQ1MGE2OTQ3MGI2YTQ5MGI2YTRhMGM2YjRjMGM2YjRkMGQ2YzRmMGQ2YzUxMGU2YzUyMGU2ZDU0MGY2ZDU1MGY2ZDU3MTA2ZTU5MTA2ZTVhMTE2ZTVjMTI2ZTVkMTI2ZTVmMTM2ZTYxMTM2ZTYyMTQ2ZTY0MTU2ZTY1MTU2ZTY3MTY2ZTY5MTY2ZTZhMTc2ZTZjMTg2ZTZkMTg2ZTZmMTk2ZTcxMTk2ZTcyMWE2ZTc0MWE2ZTc1MWI2ZTc3MWM2ZDc4MWM2ZDdhMWQ2ZDdjMWQ2ZDdkMWU2ZDdmMWU2YzgwMWY2YzgyMjA2Yzg0MjA2Yjg1MjE2Yjg3MjE2Yjg4MjI2YThhMjI2YThjMjM2OThkMjM2OThmMjQ2OTkwMjU2ODkyMjU2ODkzMjY2Nzk1MjY2Nzk3Mjc2Njk4Mjc2NjlhMjg2NTliMjk2NDlkMjk2NDlmMmE2M2EwMmE2M2EyMmI2MmEzMmM2MWE1MmM2MGE2MmQ2MGE4MmU1ZmE5MmU1ZWFiMmY1ZWFkMzA1ZGFlMzA1Y2IwMzE1YmIxMzI1YWIzMzI1YWI0MzM1OWI2MzQ1OGI3MzU1N2I5MzU1NmJhMzY1NWJjMzc1NGJkMzg1M2JmMzk1MmMwM2E1MWMxM2E1MGMzM2I0ZmM0M2M0ZWM2M2Q0ZGM3M2U0Y2M4M2Y0YmNhNDA0YWNiNDE0OWNjNDI0OGNlNDM0N2NmNDQ0NmQwNDU0NWQyNDY0NGQzNDc0M2Q0NDg0MmQ1NGE0MWQ3NGIzZmQ4NGMzZWQ5NGQzZGRhNGUzY2RiNTAzYmRkNTEzYWRlNTIzOGRmNTMzN2UwNTUzNmUxNTYzNWUyNTczNGUzNTkzM2U0NWEzMWU1NWMzMGU2NWQyZmU3NWUyZWU4NjAyZGU5NjEyYmVhNjMyYWViNjQyOWViNjYyOGVjNjcyNmVkNjkyNWVlNmEyNGVmNmMyM2VmNmUyMWYwNmYyMGYxNzExZmYxNzMxZGYyNzQxY2YzNzYxYmYzNzgxOWY0NzkxOGY1N2IxN2Y1N2QxNWY2N2UxNGY2ODAxM2Y3ODIxMmY3ODQxMGY4ODUwZmY4ODcwZWY4ODkwY2Y5OGIwYmY5OGMwYWY5OGUwOWZhOTAwOGZhOTIwN2ZhOTQwN2ZiOTYwNmZiOTcwNmZiOTkwNmZiOWIwNmZiOWQwN2ZjOWYwN2ZjYTEwOGZjYTMwOWZjYTUwYWZjYTYwY2ZjYTgwZGZjYWEwZmZjYWMxMWZjYWUxMmZjYjAxNGZjYjIxNmZjYjQxOGZiYjYxYWZiYjgxZGZiYmExZmZiYmMyMWZiYmUyM2ZhYzAyNmZhYzIyOGZhYzQyYWZhYzYyZGY5YzcyZmY5YzkzMmY5Y2IzNWY4Y2QzN2Y4Y2YzYWY3ZDEzZGY3ZDM0MGY2ZDU0M2Y2ZDc0NmY1ZDk0OWY1ZGI0Y2Y0ZGQ0ZmY0ZGY1M2Y0ZTE1NmYzZTM1YWYzZTU1ZGYyZTY2MWYyZTg2NWYyZWE2OWYxZWM2ZGYxZWQ3MWYxZWY3NWYxZjE3OWYyZjI3ZGYyZjQ4MmYzZjU4NmYzZjY4YWY0Zjg4ZWY1Zjk5MmY2ZmE5NmY4ZmI5YWY5ZmM5ZGZhZmRhMWZjZmZhNCIpKSxCaz1SayhtQSgiMGQwODg3MTAwNzg4MTMwNzg5MTYwNzhhMTkwNjhjMWIwNjhkMWQwNjhlMjAwNjhmMjIwNjkwMjQwNjkxMjYwNTkxMjgwNTkyMmEwNTkzMmMwNTk0MmUwNTk1MmYwNTk2MzEwNTk3MzMwNTk3MzUwNDk4MzcwNDk5MzgwNDlhM2EwNDlhM2MwNDliM2UwNDljM2YwNDljNDEwNDlkNDMwMzllNDQwMzllNDYwMzlmNDgwMzlmNDkwM2EwNGIwM2ExNGMwMmExNGUwMmEyNTAwMmEyNTEwMmEzNTMwMmEzNTUwMmE0NTYwMWE0NTgwMWE0NTkwMWE1NWIwMWE1NWMwMWE2NWUwMWE2NjAwMWE2NjEwMGE3NjMwMGE3NjQwMGE3NjYwMGE3NjcwMGE4NjkwMGE4NmEwMGE4NmMwMGE4NmUwMGE4NmYwMGE4NzEwMGE4NzIwMWE4NzQwMWE4NzUwMWE4NzcwMWE4NzgwMWE4N2EwMmE4N2IwMmE4N2QwM2E4N2UwM2E4ODAwNGE4ODEwNGE3ODMwNWE3ODQwNWE3ODYwNmE2ODcwN2E2ODgwOGE2OGEwOWE1OGIwYWE1OGQwYmE1OGUwY2E0OGYwZGE0OTEwZWEzOTIwZmEzOTQxMGEyOTUxMWExOTYxM2ExOTgxNGEwOTkxNTlmOWExNjlmOWMxNzllOWQxODlkOWUxOTlkYTAxYTljYTExYjliYTIxZDlhYTMxZTlhYTUxZjk5YTYyMDk4YTcyMTk3YTgyMjk2YWEyMzk1YWIyNDk0YWMyNjk0YWQyNzkzYWUyODkyYjAyOTkxYjEyYTkwYjIyYjhmYjMyYzhlYjQyZThkYjUyZjhjYjYzMDhiYjczMThhYjgzMjg5YmEzMzg4YmIzNDg4YmMzNTg3YmQzNzg2YmUzODg1YmYzOTg0YzAzYTgzYzEzYjgyYzIzYzgxYzMzZDgwYzQzZTdmYzU0MDdlYzY0MTdkYzc0MjdjYzg0MzdiYzk0NDdhY2E0NTdhY2I0Njc5Y2M0Nzc4Y2M0OTc3Y2Q0YTc2Y2U0Yjc1Y2Y0Yzc0ZDA0ZDczZDE0ZTcyZDI0ZjcxZDM1MTcxZDQ1MjcwZDU1MzZmZDU1NDZlZDY1NTZkZDc1NjZjZDg1NzZiZDk1ODZhZGE1YTZhZGE1YjY5ZGI1YzY4ZGM1ZDY3ZGQ1ZTY2ZGU1ZjY1ZGU2MTY0ZGY2MjYzZTA2MzYzZTE2NDYyZTI2NTYxZTI2NjYwZTM2ODVmZTQ2OTVlZTU2YTVkZTU2YjVkZTY2YzVjZTc2ZTViZTc2ZjVhZTg3MDU5ZTk3MTU4ZTk3MjU3ZWE3NDU3ZWI3NTU2ZWI3NjU1ZWM3NzU0ZWQ3OTUzZWQ3YTUyZWU3YjUxZWY3YzUxZWY3ZTUwZjA3ZjRmZjA4MDRlZjE4MTRkZjE4MzRjZjI4NDRiZjM4NTRiZjM4NzRhZjQ4ODQ5ZjQ4OTQ4ZjU4YjQ3ZjU4YzQ2ZjY4ZDQ1ZjY4ZjQ0Zjc5MDQ0Zjc5MTQzZjc5MzQyZjg5NDQxZjg5NTQwZjk5NzNmZjk5ODNlZjk5YTNlZmE5YjNkZmE5YzNjZmE5ZTNiZmI5ZjNhZmJhMTM5ZmJhMjM4ZmNhMzM4ZmNhNTM3ZmNhNjM2ZmNhODM1ZmNhOTM0ZmRhYjMzZmRhYzMzZmRhZTMyZmRhZjMxZmRiMTMwZmRiMjJmZmRiNDJmZmRiNTJlZmViNzJkZmViODJjZmViYTJjZmViYjJiZmViZDJhZmViZTJhZmVjMDI5ZmRjMjI5ZmRjMzI4ZmRjNTI3ZmRjNjI3ZmRjODI3ZmRjYTI2ZmRjYjI2ZmNjZDI1ZmNjZTI1ZmNkMDI1ZmNkMjI1ZmJkMzI0ZmJkNTI0ZmJkNzI0ZmFkODI0ZmFkYTI0ZjlkYzI0ZjlkZDI1ZjhkZjI1ZjhlMTI1ZjdlMjI1ZjdlNDI1ZjZlNjI2ZjZlODI2ZjVlOTI2ZjVlYjI3ZjRlZDI3ZjNlZTI3ZjNmMDI3ZjJmMjI3ZjFmNDI2ZjFmNTI1ZjBmNzI0ZjBmOTIxIikpO2Z1bmN0aW9uIEhrKHQpe3JldHVybiBmdW5jdGlvbiBlKCl7cmV0dXJuIHR9fXZhciBGaz1NYXRoLmFicyxWaz1NYXRoLmF0YW4yLFVrPU1hdGguY29zLGprPU1hdGgubWF4LEdrPU1hdGgubWluLFdrPU1hdGguc2luLHFrPU1hdGguc3FydCxZaz0xZS0xMixYaz1NYXRoLlBJLCRrPVhrLzIsS2s9MipYaztmdW5jdGlvbiBaayh0KXtyZXR1cm4gdD4xPzA6dDwtMT9YazpNYXRoLmFjb3ModCl9ZnVuY3Rpb24gSmsodCl7cmV0dXJuIHQ+PTE/JGs6dDw9LTE/LSRrOk1hdGguYXNpbih0KX1mdW5jdGlvbiBRayh0KXtyZXR1cm4gdC5pbm5lclJhZGl1c31mdW5jdGlvbiB0TCh0KXtyZXR1cm4gdC5vdXRlclJhZGl1c31mdW5jdGlvbiBlTCh0KXtyZXR1cm4gdC5zdGFydEFuZ2xlfWZ1bmN0aW9uIG5MKHQpe3JldHVybiB0LmVuZEFuZ2xlfWZ1bmN0aW9uIGlMKHQpe3JldHVybiB0JiZ0LnBhZEFuZ2xlfWZ1bmN0aW9uIHJMKHQsZSxuLGkscixvLGEscyl7dmFyIGw9bi10LGM9aS1lLHU9YS1yLGg9cy1vLGQ9aCpsLXUqYztpZighKGQqZDxZaykpcmV0dXJuW3QrKGQ9KHUqKGUtbyktaCoodC1yKSkvZCkqbCxlK2QqY119ZnVuY3Rpb24gb0wodCxlLG4saSxyLG8sYSl7dmFyIHM9dC1uLGw9ZS1pLGM9KGE/bzotbykvcWsocypzK2wqbCksdT1jKmwsaD0tYypzLGQ9dCt1LHA9ZStoLGY9bit1LG09aStoLGc9KGQrZikvMixfPShwK20pLzIseT1mLWQsdj1tLXAsYj15Knkrdip2LHg9ci1vLHc9ZCptLWYqcCxTPSh2PDA/LTE6MSkqcWsoamsoMCx4KngqYi13KncpKSxNPSh3KnYteSpTKS9iLEU9KC13KnktdipTKS9iLFQ9KHcqdit5KlMpL2IsQz0oLXcqeSt2KlMpL2IsQT1NLWcsaz1FLV8sTD1ULWcsUD1DLV87cmV0dXJuIEEqQStrKms+TCpMK1AqUCYmKE09VCxFPUMpLHtjeDpNLGN5OkUseDAxOi11LHkwMTotaCx4MTE6TSooci94LTEpLHkxMTpFKihyL3gtMSl9fWZ1bmN0aW9uIGFMKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBzTCh0KXtyZXR1cm4gbmV3IGFMKHQpfWZ1bmN0aW9uIGxMKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIGNMKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIHVMKCl7dmFyIHQ9bEwsZT1jTCxuPUhrKCEwKSxpPW51bGwscj1zTCxvPW51bGw7ZnVuY3Rpb24gYShhKXt2YXIgcyxsLGMsdT1hLmxlbmd0aCxoPSExO2ZvcihudWxsPT1pJiYobz1yKGM9ZmcoKSkpLHM9MDtzPD11OysrcykhKHM8dSYmbihsPWFbc10scyxhKSk9PT1oJiYoKGg9IWgpP28ubGluZVN0YXJ0KCk6by5saW5lRW5kKCkpLGgmJm8ucG9pbnQoK3QobCxzLGEpLCtlKGwscyxhKSk7aWYoYylyZXR1cm4gbz1udWxsLGMrIiJ8fG51bGx9cmV0dXJuIGEueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOkhrKCtlKSxhKTp0fSxhLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpIaygrdCksYSk6ZX0sYS5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SGsoISF0KSxhKTpufSxhLmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbnVsbCE9aSYmKG89cihpKSksYSk6cn0sYS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P2k9bz1udWxsOm89cihpPXQpLGEpOml9LGF9ZnVuY3Rpb24gaEwoKXt2YXIgdD1sTCxlPW51bGwsbj1IaygwKSxpPWNMLHI9SGsoITApLG89bnVsbCxhPXNMLHM9bnVsbDtmdW5jdGlvbiBsKGwpe3ZhciBjLHUsaCxkLHAsZj1sLmxlbmd0aCxtPSExLGc9bmV3IEFycmF5KGYpLF89bmV3IEFycmF5KGYpO2ZvcihudWxsPT1vJiYocz1hKHA9ZmcoKSkpLGM9MDtjPD1mOysrYyl7aWYoIShjPGYmJnIoZD1sW2NdLGMsbCkpPT09bSlpZihtPSFtKXU9YyxzLmFyZWFTdGFydCgpLHMubGluZVN0YXJ0KCk7ZWxzZXtmb3Iocy5saW5lRW5kKCkscy5saW5lU3RhcnQoKSxoPWMtMTtoPj11Oy0taClzLnBvaW50KGdbaF0sX1toXSk7cy5saW5lRW5kKCkscy5hcmVhRW5kKCl9bSYmKGdbY109K3QoZCxjLGwpLF9bY109K24oZCxjLGwpLHMucG9pbnQoZT8rZShkLGMsbCk6Z1tjXSxpPytpKGQsYyxsKTpfW2NdKSl9aWYocClyZXR1cm4gcz1udWxsLHArIiJ8fG51bGx9ZnVuY3Rpb24gYygpe3JldHVybiB1TCgpLmRlZmluZWQocikuY3VydmUoYSkuY29udGV4dChvKX1yZXR1cm4gbC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246SGsoK24pLGU9bnVsbCxsKTp0fSxsLngwPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6SGsoK2UpLGwpOnR9LGwueDE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SGsoK3QpLGwpOmV9LGwueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkhrKCt0KSxpPW51bGwsbCk6bn0sbC55MD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkhrKCt0KSxsKTpufSxsLnkxPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OkhrKCt0KSxsKTppfSxsLmxpbmVYMD1sLmxpbmVZMD1mdW5jdGlvbigpe3JldHVybiBjKCkueCh0KS55KG4pfSxsLmxpbmVZMT1mdW5jdGlvbigpe3JldHVybiBjKCkueCh0KS55KGkpfSxsLmxpbmVYMT1mdW5jdGlvbigpe3JldHVybiBjKCkueChlKS55KG4pfSxsLmRlZmluZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpIayghIXQpLGwpOnJ9LGwuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCxudWxsIT1vJiYocz1hKG8pKSxsKTphfSxsLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/bz1zPW51bGw6cz1hKG89dCksbCk6b30sbH1mdW5jdGlvbiBkTCh0LGUpe3JldHVybiBlPHQ/LTE6ZT50PzE6ZT49dD8wOk5hTn1mdW5jdGlvbiBwTCh0KXtyZXR1cm4gdH1hTC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxlKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5saW5lVG8odCxlKX19fTt2YXIgZkw9Z0woc0wpO2Z1bmN0aW9uIG1MKHQpe3RoaXMuX2N1cnZlPXR9ZnVuY3Rpb24gZ0wodCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gbmV3IG1MKHQoZSkpfXJldHVybiBlLl9jdXJ2ZT10LGV9ZnVuY3Rpb24gX0wodCl7dmFyIGU9dC5jdXJ2ZTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoZ0wodCkpOmUoKS5fY3VydmV9LHR9ZnVuY3Rpb24geUwoKXtyZXR1cm4gX0wodUwoKS5jdXJ2ZShmTCkpfWZ1bmN0aW9uIHZMKCl7dmFyIHQ9aEwoKS5jdXJ2ZShmTCksZT10LmN1cnZlLG49dC5saW5lWDAsaT10LmxpbmVYMSxyPXQubGluZVkwLG89dC5saW5lWTE7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5zdGFydEFuZ2xlPXQueDAsZGVsZXRlIHQueDAsdC5lbmRBbmdsZT10LngxLGRlbGV0ZSB0LngxLHQucmFkaXVzPXQueSxkZWxldGUgdC55LHQuaW5uZXJSYWRpdXM9dC55MCxkZWxldGUgdC55MCx0Lm91dGVyUmFkaXVzPXQueTEsZGVsZXRlIHQueTEsdC5saW5lU3RhcnRBbmdsZT1mdW5jdGlvbigpe3JldHVybiBfTChuKCkpfSxkZWxldGUgdC5saW5lWDAsdC5saW5lRW5kQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gX0woaSgpKX0sZGVsZXRlIHQubGluZVgxLHQubGluZUlubmVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIF9MKHIoKSl9LGRlbGV0ZSB0LmxpbmVZMCx0LmxpbmVPdXRlclJhZGl1cz1mdW5jdGlvbigpe3JldHVybiBfTChvKCkpfSxkZWxldGUgdC5saW5lWTEsdC5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9lKGdMKHQpKTplKCkuX2N1cnZlfSx0fWZ1bmN0aW9uIGJMKHQsZSl7cmV0dXJuWyhlPStlKSpNYXRoLmNvcyh0LT1NYXRoLlBJLzIpLGUqTWF0aC5zaW4odCldfW1MLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYVN0YXJ0KCl9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5hcmVhRW5kKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LGUpe3RoaXMuX2N1cnZlLnBvaW50KGUqTWF0aC5zaW4odCksZSotTWF0aC5jb3ModCkpfX07dmFyIHhMPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiB3TCh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gU0wodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIE1MKHQpe3ZhciBlPXdMLG49U0wsaT1sTCxyPWNMLG89bnVsbDtmdW5jdGlvbiBhKCl7dmFyIGEscz14TC5jYWxsKGFyZ3VtZW50cyksbD1lLmFwcGx5KHRoaXMscyksYz1uLmFwcGx5KHRoaXMscyk7aWYob3x8KG89YT1mZygpKSx0KG8sK2kuYXBwbHkodGhpcywoc1swXT1sLHMpKSwrci5hcHBseSh0aGlzLHMpLCtpLmFwcGx5KHRoaXMsKHNbMF09YyxzKSksK3IuYXBwbHkodGhpcyxzKSksYSlyZXR1cm4gbz1udWxsLGErIiJ8fG51bGx9cmV0dXJuIGEuc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsYSk6ZX0sYS50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxhKTpufSxhLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpIaygrdCksYSk6aX0sYS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SGsoK3QpLGEpOnJ9LGEuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1udWxsPT10P251bGw6dCxhKTpvfSxhfWZ1bmN0aW9uIEVMKHQsZSxuLGkscil7dC5tb3ZlVG8oZSxuKSx0LmJlemllckN1cnZlVG8oZT0oZStpKS8yLG4sZSxyLGkscil9ZnVuY3Rpb24gVEwodCxlLG4saSxyKXt0Lm1vdmVUbyhlLG4pLHQuYmV6aWVyQ3VydmVUbyhlLG49KG4rcikvMixpLG4saSxyKX1mdW5jdGlvbiBDTCh0LGUsbixpLHIpe3ZhciBvPWJMKGUsbiksYT1iTChlLG49KG4rcikvMikscz1iTChpLG4pLGw9YkwoaSxyKTt0Lm1vdmVUbyhvWzBdLG9bMV0pLHQuYmV6aWVyQ3VydmVUbyhhWzBdLGFbMV0sc1swXSxzWzFdLGxbMF0sbFsxXSl9dmFyIEFMPXtkcmF3OmZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5zcXJ0KGUvWGspO3QubW92ZVRvKG4sMCksdC5hcmMoMCwwLG4sMCxLayl9fSxrTD17ZHJhdzpmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguc3FydChlLzUpLzI7dC5tb3ZlVG8oLTMqbiwtbiksdC5saW5lVG8oLW4sLW4pLHQubGluZVRvKC1uLC0zKm4pLHQubGluZVRvKG4sLTMqbiksdC5saW5lVG8obiwtbiksdC5saW5lVG8oMypuLC1uKSx0LmxpbmVUbygzKm4sbiksdC5saW5lVG8obixuKSx0LmxpbmVUbyhuLDMqbiksdC5saW5lVG8oLW4sMypuKSx0LmxpbmVUbygtbixuKSx0LmxpbmVUbygtMypuLG4pLHQuY2xvc2VQYXRoKCl9fSxMTD1NYXRoLnNxcnQoMS8zKSxQTD0yKkxMLE5MPXtkcmF3OmZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5zcXJ0KGUvUEwpLGk9bipMTDt0Lm1vdmVUbygwLC1uKSx0LmxpbmVUbyhpLDApLHQubGluZVRvKDAsbiksdC5saW5lVG8oLWksMCksdC5jbG9zZVBhdGgoKX19LElMPU1hdGguc2luKFhrLzEwKS9NYXRoLnNpbig3KlhrLzEwKSxSTD1NYXRoLnNpbihLay8xMCkqSUwsT0w9LU1hdGguY29zKEtrLzEwKSpJTCx6TD17ZHJhdzpmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguc3FydCguODkwODEzMDkxNTI5Mjg1MiplKSxpPVJMKm4scj1PTCpuO3QubW92ZVRvKDAsLW4pLHQubGluZVRvKGkscik7Zm9yKHZhciBvPTE7bzw1Oysrbyl7dmFyIGE9S2sqby81LHM9TWF0aC5jb3MoYSksbD1NYXRoLnNpbihhKTt0LmxpbmVUbyhsKm4sLXMqbiksdC5saW5lVG8ocyppLWwqcixsKmkrcypyKX10LmNsb3NlUGF0aCgpfX0sREw9e2RyYXc6ZnVuY3Rpb24odCxlKXt2YXIgbj1NYXRoLnNxcnQoZSksaT0tbi8yO3QucmVjdChpLGksbixuKX19LEJMPU1hdGguc3FydCgzKSxITD17ZHJhdzpmdW5jdGlvbih0LGUpe3ZhciBuPS1NYXRoLnNxcnQoZS8oMypCTCkpO3QubW92ZVRvKDAsMipuKSx0LmxpbmVUbygtQkwqbiwtbiksdC5saW5lVG8oQkwqbiwtbiksdC5jbG9zZVBhdGgoKX19LEZMPS0uNSxWTD1NYXRoLnNxcnQoMykvMixVTD0xL01hdGguc3FydCgxMiksakw9MyooVUwvMisxKSxHTD17ZHJhdzpmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguc3FydChlL2pMKSxpPW4vMixyPW4qVUwsbz1pLGE9bipVTCtuLHM9LW8sbD1hO3QubW92ZVRvKGksciksdC5saW5lVG8obyxhKSx0LmxpbmVUbyhzLGwpLHQubGluZVRvKEZMKmktVkwqcixWTCppK0ZMKnIpLHQubGluZVRvKEZMKm8tVkwqYSxWTCpvK0ZMKmEpLHQubGluZVRvKEZMKnMtVkwqbCxWTCpzK0ZMKmwpLHQubGluZVRvKEZMKmkrVkwqcixGTCpyLVZMKmkpLHQubGluZVRvKEZMKm8rVkwqYSxGTCphLVZMKm8pLHQubGluZVRvKEZMKnMrVkwqbCxGTCpsLVZMKnMpLHQuY2xvc2VQYXRoKCl9fSxXTD1bQUwsa0wsTkwsREwsekwsSEwsR0xdO2Z1bmN0aW9uIHFMKCl7fWZ1bmN0aW9uIFlMKHQsZSxuKXt0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oKDIqdC5feDArdC5feDEpLzMsKDIqdC5feTArdC5feTEpLzMsKHQuX3gwKzIqdC5feDEpLzMsKHQuX3kwKzIqdC5feTEpLzMsKHQuX3gwKzQqdC5feDErZSkvNiwodC5feTArNCp0Ll95MStuKS82KX1mdW5jdGlvbiBYTCh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gJEwodCl7cmV0dXJuIG5ldyBYTCh0KX1mdW5jdGlvbiBLTCh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gWkwodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEpMKHQsZSl7dGhpcy5fYmFzaXM9bmV3IFhMKHQpLHRoaXMuX2JldGE9ZX1YTC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAzOllMKHRoaXMsdGhpcy5feDEsdGhpcy5feTEpO2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxlKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2NvbnRleHQubGluZVRvKCg1KnRoaXMuX3gwK3RoaXMuX3gxKS82LCg1KnRoaXMuX3kwK3RoaXMuX3kxKS82KTtkZWZhdWx0OllMKHRoaXMsdCxlKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPWV9fSxLTC5wcm90b3R5cGU9e2FyZWFTdGFydDpxTCxhcmVhRW5kOnFMLGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MisyKnRoaXMuX3gzKS8zLCh0aGlzLl95MisyKnRoaXMuX3kzKS8zKSx0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMrMip0aGlzLl94MikvMywodGhpcy5feTMrMip0aGlzLl95MikvMyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95MiksdGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCl9fSxwb2ludDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gyPXQsdGhpcy5feTI9ZTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94Mz10LHRoaXMuX3kzPWU7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDQ9dCx0aGlzLl95ND1lLHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYsKHRoaXMuX3kwKzQqdGhpcy5feTErZSkvNik7YnJlYWs7ZGVmYXVsdDpZTCh0aGlzLHQsZSl9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1lfX0sWkwucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7dmFyIG49KHRoaXMuX3gwKzQqdGhpcy5feDErdCkvNixpPSh0aGlzLl95MCs0KnRoaXMuX3kxK2UpLzY7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyhuLGkpOnRoaXMuX2NvbnRleHQubW92ZVRvKG4saSk7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpZTCh0aGlzLHQsZSl9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1lfX0sSkwucHJvdG90eXBlPXtsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PVtdLHRoaXMuX3k9W10sdGhpcy5fYmFzaXMubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl94LGU9dGhpcy5feSxuPXQubGVuZ3RoLTE7aWYobj4wKWZvcih2YXIgaSxyPXRbMF0sbz1lWzBdLGE9dFtuXS1yLHM9ZVtuXS1vLGw9LTE7KytsPD1uOyl0aGlzLl9iYXNpcy5wb2ludCh0aGlzLl9iZXRhKnRbbF0rKDEtdGhpcy5fYmV0YSkqKHIrKGk9bC9uKSphKSx0aGlzLl9iZXRhKmVbbF0rKDEtdGhpcy5fYmV0YSkqKG8raSpzKSk7dGhpcy5feD10aGlzLl95PW51bGwsdGhpcy5fYmFzaXMubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LGUpe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtlKX19O3ZhciBRTD0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiAxPT09ZT9uZXcgWEwodCk6bmV3IEpMKHQsZSl9cmV0dXJuIG4uYmV0YT1mdW5jdGlvbihlKXtyZXR1cm4gdCgrZSl9LG59KSguODUpO2Z1bmN0aW9uIHRQKHQsZSxuKXt0Ll9jb250ZXh0LmJlemllckN1cnZlVG8odC5feDErdC5fayoodC5feDItdC5feDApLHQuX3kxK3QuX2sqKHQuX3kyLXQuX3kwKSx0Ll94Mit0Ll9rKih0Ll94MS1lKSx0Ll95Mit0Ll9rKih0Ll95MS1uKSx0Ll94Mix0Ll95Mil9ZnVuY3Rpb24gZVAodCxlKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1lKS82fWVQLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0UCh0aGlzLHRoaXMuX3gxLHRoaXMuX3kxKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsZSk7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5feDE9dCx0aGlzLl95MT1lO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO2RlZmF1bHQ6dFAodGhpcyx0LGUpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9ZX19O3ZhciBuUD0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBuZXcgZVAodCxlKX1yZXR1cm4gbi50ZW5zaW9uPWZ1bmN0aW9uKGUpe3JldHVybiB0KCtlKX0sbn0pKDApO2Z1bmN0aW9uIGlQKHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtZSkvNn1pUC5wcm90b3R5cGU9e2FyZWFTdGFydDpxTCxhcmVhRW5kOnFMLGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1lO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9ZSk7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1lO2JyZWFrO2RlZmF1bHQ6dFAodGhpcyx0LGUpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9ZX19O3ZhciByUD0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBuZXcgaVAodCxlKX1yZXR1cm4gbi50ZW5zaW9uPWZ1bmN0aW9uKGUpe3JldHVybiB0KCtlKX0sbn0pKDApO2Z1bmN0aW9uIG9QKHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtZSkvNn1vUC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtzd2l0Y2godD0rdCxlPStlLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDp0UCh0aGlzLHQsZSl9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1lfX07dmFyIGFQPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIG5ldyBvUCh0LGUpfXJldHVybiBuLnRlbnNpb249ZnVuY3Rpb24oZSl7cmV0dXJuIHQoK2UpfSxufSkoMCk7ZnVuY3Rpb24gc1AodCxlLG4pe3ZhciBpPXQuX3gxLHI9dC5feTEsbz10Ll94MixhPXQuX3kyO2lmKHQuX2wwMV9hPllrKXt2YXIgcz0yKnQuX2wwMV8yYSszKnQuX2wwMV9hKnQuX2wxMl9hK3QuX2wxMl8yYSxsPTMqdC5fbDAxX2EqKHQuX2wwMV9hK3QuX2wxMl9hKTtpPShpKnMtdC5feDAqdC5fbDEyXzJhK3QuX3gyKnQuX2wwMV8yYSkvbCxyPShyKnMtdC5feTAqdC5fbDEyXzJhK3QuX3kyKnQuX2wwMV8yYSkvbH1pZih0Ll9sMjNfYT5Zayl7dmFyIGM9Mip0Ll9sMjNfMmErMyp0Ll9sMjNfYSp0Ll9sMTJfYSt0Ll9sMTJfMmEsdT0zKnQuX2wyM19hKih0Ll9sMjNfYSt0Ll9sMTJfYSk7bz0obypjK3QuX3gxKnQuX2wyM18yYS1lKnQuX2wxMl8yYSkvdSxhPShhKmMrdC5feTEqdC5fbDIzXzJhLW4qdC5fbDEyXzJhKS91fXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhpLHIsbyxhLHQuX3gyLHQuX3kyKX1mdW5jdGlvbiBsUCh0LGUpe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1lfWxQLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gyLHRoaXMuX3kyKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7aWYodD0rdCxlPStlLHRoaXMuX3BvaW50KXt2YXIgbj10aGlzLl94Mi10LGk9dGhpcy5feTItZTt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KG4qbitpKmksdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxlKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO2RlZmF1bHQ6c1AodGhpcyx0LGUpfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPWV9fTt2YXIgY1A9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gZT9uZXcgbFAodCxlKTpuZXcgZVAodCwwKX1yZXR1cm4gbi5hbHBoYT1mdW5jdGlvbihlKXtyZXR1cm4gdCgrZSl9LG59KSguNSk7ZnVuY3Rpb24gdVAodCxlKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9ZX11UC5wcm90b3R5cGU9e2FyZWFTdGFydDpxTCxhcmVhRW5kOnFMLGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsZSl7aWYodD0rdCxlPStlLHRoaXMuX3BvaW50KXt2YXIgbj10aGlzLl94Mi10LGk9dGhpcy5feTItZTt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KG4qbitpKmksdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gzPXQsdGhpcy5feTM9ZTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94ND10LHRoaXMuX3k0PWUpO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX3g1PXQsdGhpcy5feTU9ZTticmVhaztkZWZhdWx0OnNQKHRoaXMsdCxlKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1lfX07dmFyIGhQPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIGU/bmV3IHVQKHQsZSk6bmV3IGlQKHQsMCl9cmV0dXJuIG4uYWxwaGE9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoK2UpfSxufSkoLjUpO2Z1bmN0aW9uIGRQKHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPWV9ZFAucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7aWYodD0rdCxlPStlLHRoaXMuX3BvaW50KXt2YXIgbj10aGlzLl94Mi10LGk9dGhpcy5feTItZTt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KG4qbitpKmksdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0OnNQKHRoaXMsdCxlKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1lfX07dmFyIHBQPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIGU/bmV3IGRQKHQsZSk6bmV3IG9QKHQsMCl9cmV0dXJuIG4uYWxwaGE9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoK2UpfSxufSkoLjUpO2Z1bmN0aW9uIGZQKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBtUCh0KXtyZXR1cm4gdDwwPy0xOjF9ZnVuY3Rpb24gZ1AodCxlLG4pe3ZhciBpPXQuX3gxLXQuX3gwLHI9ZS10Ll94MSxvPSh0Ll95MS10Ll95MCkvKGl8fHI8MCYmLTApLGE9KG4tdC5feTEpLyhyfHxpPDAmJi0wKSxzPShvKnIrYSppKS8oaStyKTtyZXR1cm4obVAobykrbVAoYSkpKk1hdGgubWluKE1hdGguYWJzKG8pLE1hdGguYWJzKGEpLC41Kk1hdGguYWJzKHMpKXx8MH1mdW5jdGlvbiBfUCh0LGUpe3ZhciBuPXQuX3gxLXQuX3gwO3JldHVybiBuPygzKih0Ll95MS10Ll95MCkvbi1lKS8yOmV9ZnVuY3Rpb24geVAodCxlLG4pe3ZhciBpPXQuX3gwLHI9dC5feDEsbz10Ll95MSxhPShyLWkpLzM7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKGkrYSx0Ll95MCthKmUsci1hLG8tYSpuLHIsbyl9ZnVuY3Rpb24gdlAodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIGJQKHQpe3RoaXMuX2NvbnRleHQ9bmV3IHhQKHQpfWZ1bmN0aW9uIHhQKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiB3UCh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gU1AodCl7dmFyIGUsbixpPXQubGVuZ3RoLTEscj1uZXcgQXJyYXkoaSksbz1uZXcgQXJyYXkoaSksYT1uZXcgQXJyYXkoaSk7Zm9yKHJbMF09MCxvWzBdPTIsYVswXT10WzBdKzIqdFsxXSxlPTE7ZTxpLTE7KytlKXJbZV09MSxvW2VdPTQsYVtlXT00KnRbZV0rMip0W2UrMV07Zm9yKHJbaS0xXT0yLG9baS0xXT03LGFbaS0xXT04KnRbaS0xXSt0W2ldLGU9MTtlPGk7KytlKW9bZV0tPW49cltlXS9vW2UtMV0sYVtlXS09biphW2UtMV07Zm9yKHJbaS0xXT1hW2ktMV0vb1tpLTFdLGU9aS0yO2U+PTA7LS1lKXJbZV09KGFbZV0tcltlKzFdKS9vW2VdO2ZvcihvW2ktMV09KHRbaV0rcltpLTFdKS8yLGU9MDtlPGktMTsrK2Upb1tlXT0yKnRbZSsxXS1yW2UrMV07cmV0dXJuW3Isb119ZnVuY3Rpb24gTVAodCxlKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fdD1lfWZ1bmN0aW9uIEVQKHQsZSl7aWYoKHI9dC5sZW5ndGgpPjEpZm9yKHZhciBuLGkscixvPTEsYT10W2VbMF1dLHM9YS5sZW5ndGg7bzxyOysrbylmb3IoaT1hLGE9dFtlW29dXSxuPTA7bjxzOysrbilhW25dWzFdKz1hW25dWzBdPWlzTmFOKGlbbl1bMV0pP2lbbl1bMF06aVtuXVsxXX1mdW5jdGlvbiBUUCh0KXtmb3IodmFyIGU9dC5sZW5ndGgsbj1uZXcgQXJyYXkoZSk7LS1lPj0wOyluW2VdPWU7cmV0dXJuIG59ZnVuY3Rpb24gQ1AodCxlKXtyZXR1cm4gdFtlXX1mdW5jdGlvbiBBUCh0KXt2YXIgZT10Lm1hcChrUCk7cmV0dXJuIFRQKHQpLnNvcnQoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGVbdF0tZVtuXX0pKX1mdW5jdGlvbiBrUCh0KXtmb3IodmFyIGUsbj0tMSxpPTAscj10Lmxlbmd0aCxvPS0xLzA7KytuPHI7KShlPSt0W25dWzFdKT5vJiYobz1lLGk9bik7cmV0dXJuIGl9ZnVuY3Rpb24gTFAodCl7dmFyIGU9dC5tYXAoUFApO3JldHVybiBUUCh0KS5zb3J0KChmdW5jdGlvbih0LG4pe3JldHVybiBlW3RdLWVbbl19KSl9ZnVuY3Rpb24gUFAodCl7Zm9yKHZhciBlLG49MCxpPS0xLHI9dC5sZW5ndGg7KytpPHI7KShlPSt0W2ldWzFdKSYmKG4rPWUpO3JldHVybiBufWZ1bmN0aW9uIE5QKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBJUCh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBSUCh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBPUCgpe3RoaXMuXz1udWxsfWZ1bmN0aW9uIHpQKHQpe3QuVT10LkM9dC5MPXQuUj10LlA9dC5OPW51bGx9ZnVuY3Rpb24gRFAodCxlKXt2YXIgbj1lLGk9ZS5SLHI9bi5VO3I/ci5MPT09bj9yLkw9aTpyLlI9aTp0Ll89aSxpLlU9cixuLlU9aSxuLlI9aS5MLG4uUiYmKG4uUi5VPW4pLGkuTD1ufWZ1bmN0aW9uIEJQKHQsZSl7dmFyIG49ZSxpPWUuTCxyPW4uVTtyP3IuTD09PW4/ci5MPWk6ci5SPWk6dC5fPWksaS5VPXIsbi5VPWksbi5MPWkuUixuLkwmJihuLkwuVT1uKSxpLlI9bn1mdW5jdGlvbiBIUCh0KXtmb3IoO3QuTDspdD10Lkw7cmV0dXJuIHR9ZnVuY3Rpb24gRlAodCxlLG4saSl7dmFyIHI9W251bGwsbnVsbF0sbz11Ti5wdXNoKHIpLTE7cmV0dXJuIHIubGVmdD10LHIucmlnaHQ9ZSxuJiZVUChyLHQsZSxuKSxpJiZVUChyLGUsdCxpKSxsTlt0LmluZGV4XS5oYWxmZWRnZXMucHVzaChvKSxsTltlLmluZGV4XS5oYWxmZWRnZXMucHVzaChvKSxyfWZ1bmN0aW9uIFZQKHQsZSxuKXt2YXIgaT1bZSxuXTtyZXR1cm4gaS5sZWZ0PXQsaX1mdW5jdGlvbiBVUCh0LGUsbixpKXt0WzBdfHx0WzFdP3QubGVmdD09PW4/dFsxXT1pOnRbMF09aToodFswXT1pLHQubGVmdD1lLHQucmlnaHQ9bil9ZnVuY3Rpb24galAodCxlLG4saSxyKXt2YXIgbyxhPXRbMF0scz10WzFdLGw9YVswXSxjPWFbMV0sdT0wLGg9MSxkPXNbMF0tbCxwPXNbMV0tYztpZihvPWUtbCxkfHwhKG8+MCkpe2lmKG8vPWQsZDwwKXtpZihvPHUpcmV0dXJuO288aCYmKGg9byl9ZWxzZSBpZihkPjApe2lmKG8+aClyZXR1cm47bz51JiYodT1vKX1pZihvPWktbCxkfHwhKG88MCkpe2lmKG8vPWQsZDwwKXtpZihvPmgpcmV0dXJuO28+dSYmKHU9byl9ZWxzZSBpZihkPjApe2lmKG88dSlyZXR1cm47bzxoJiYoaD1vKX1pZihvPW4tYyxwfHwhKG8+MCkpe2lmKG8vPXAscDwwKXtpZihvPHUpcmV0dXJuO288aCYmKGg9byl9ZWxzZSBpZihwPjApe2lmKG8+aClyZXR1cm47bz51JiYodT1vKX1pZihvPXItYyxwfHwhKG88MCkpe2lmKG8vPXAscDwwKXtpZihvPmgpcmV0dXJuO28+dSYmKHU9byl9ZWxzZSBpZihwPjApe2lmKG88dSlyZXR1cm47bzxoJiYoaD1vKX1yZXR1cm4hKHU+MHx8aDwxKXx8KHU+MCYmKHRbMF09W2wrdSpkLGMrdSpwXSksaDwxJiYodFsxXT1bbCtoKmQsYytoKnBdKSwhMCl9fX19fWZ1bmN0aW9uIEdQKHQsZSxuLGkscil7dmFyIG89dFsxXTtpZihvKXJldHVybiEwO3ZhciBhLHMsbD10WzBdLGM9dC5sZWZ0LHU9dC5yaWdodCxoPWNbMF0sZD1jWzFdLHA9dVswXSxmPXVbMV0sbT0oaCtwKS8yO2lmKGY9PT1kKXtpZihtPGV8fG0+PWkpcmV0dXJuO2lmKGg+cCl7aWYobCl7aWYobFsxXT49cilyZXR1cm59ZWxzZSBsPVttLG5dO289W20scl19ZWxzZXtpZihsKXtpZihsWzFdPG4pcmV0dXJufWVsc2UgbD1bbSxyXTtvPVttLG5dfX1lbHNlIGlmKHM9KGQrZikvMi0oYT0oaC1wKS8oZi1kKSkqbSxhPC0xfHxhPjEpaWYoaD5wKXtpZihsKXtpZihsWzFdPj1yKXJldHVybn1lbHNlIGw9WyhuLXMpL2Esbl07bz1bKHItcykvYSxyXX1lbHNle2lmKGwpe2lmKGxbMV08bilyZXR1cm59ZWxzZSBsPVsoci1zKS9hLHJdO289WyhuLXMpL2Esbl19ZWxzZSBpZihkPGYpe2lmKGwpe2lmKGxbMF0+PWkpcmV0dXJufWVsc2UgbD1bZSxhKmUrc107bz1baSxhKmkrc119ZWxzZXtpZihsKXtpZihsWzBdPGUpcmV0dXJufWVsc2UgbD1baSxhKmkrc107bz1bZSxhKmUrc119cmV0dXJuIHRbMF09bCx0WzFdPW8sITB9ZnVuY3Rpb24gV1AodCxlKXt2YXIgbj10LnNpdGUsaT1lLmxlZnQscj1lLnJpZ2h0O3JldHVybiBuPT09ciYmKHI9aSxpPW4pLHI/TWF0aC5hdGFuMihyWzFdLWlbMV0sclswXS1pWzBdKToobj09PWk/KGk9ZVsxXSxyPWVbMF0pOihpPWVbMF0scj1lWzFdKSxNYXRoLmF0YW4yKGlbMF0tclswXSxyWzFdLWlbMV0pKX1mdW5jdGlvbiBxUCh0LGUpe3JldHVybiBlWysoZS5sZWZ0IT09dC5zaXRlKV19ZnVuY3Rpb24gWVAodCxlKXtyZXR1cm4gZVsrKGUubGVmdD09PXQuc2l0ZSldfWZQLnByb3RvdHlwZT17YXJlYVN0YXJ0OnFMLGFyZWFFbmQ6cUwsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuX3BvaW50JiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxwb2ludDpmdW5jdGlvbih0LGUpe3Q9K3QsZT0rZSx0aGlzLl9wb2ludD90aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpOih0aGlzLl9wb2ludD0xLHRoaXMuX2NvbnRleHQubW92ZVRvKHQsZSkpfX0sdlAucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5fdDA9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSk7YnJlYWs7Y2FzZSAzOnlQKHRoaXMsdGhpcy5fdDAsX1AodGhpcyx0aGlzLl90MCkpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxlKXt2YXIgbj1OYU47aWYoZT0rZSwodD0rdCkhPT10aGlzLl94MXx8ZSE9PXRoaXMuX3kxKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxlKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHlQKHRoaXMsX1AodGhpcyxuPWdQKHRoaXMsdCxlKSksbik7YnJlYWs7ZGVmYXVsdDp5UCh0aGlzLHRoaXMuX3QwLG49Z1AodGhpcyx0LGUpKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPWUsdGhpcy5fdDA9bn19fSwoYlAucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodlAucHJvdG90eXBlKSkucG9pbnQ9ZnVuY3Rpb24odCxlKXt2UC5wcm90b3R5cGUucG9pbnQuY2FsbCh0aGlzLGUsdCl9LHhQLnByb3RvdHlwZT17bW92ZVRvOmZ1bmN0aW9uKHQsZSl7dGhpcy5fY29udGV4dC5tb3ZlVG8oZSx0KX0sY2xvc2VQYXRoOmZ1bmN0aW9uKCl7dGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKX0sbGluZVRvOmZ1bmN0aW9uKHQsZSl7dGhpcy5fY29udGV4dC5saW5lVG8oZSx0KX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LGUsbixpLHIsbyl7dGhpcy5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKGUsdCxpLG4sbyxyKX19LHdQLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3g9W10sdGhpcy5feT1bXX0sbGluZUVuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3gsZT10aGlzLl95LG49dC5sZW5ndGg7aWYobilpZih0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRbMF0sZVswXSk6dGhpcy5fY29udGV4dC5tb3ZlVG8odFswXSxlWzBdKSwyPT09bil0aGlzLl9jb250ZXh0LmxpbmVUbyh0WzFdLGVbMV0pO2Vsc2UgZm9yKHZhciBpPVNQKHQpLHI9U1AoZSksbz0wLGE9MTthPG47KytvLCsrYSl0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8oaVswXVtvXSxyWzBdW29dLGlbMV1bb10sclsxXVtvXSx0W2FdLGVbYV0pOyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PW4pJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lLHRoaXMuX3g9dGhpcy5feT1udWxsfSxwb2ludDpmdW5jdGlvbih0LGUpe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtlKX19LE1QLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3g9dGhpcy5feT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpezA8dGhpcy5fdCYmdGhpcy5fdDwxJiYyPT09dGhpcy5fcG9pbnQmJnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsdGhpcy5feSksKHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU+PTAmJih0aGlzLl90PTEtdGhpcy5fdCx0aGlzLl9saW5lPTEtdGhpcy5fbGluZSl9LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsZSk7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7ZGVmYXVsdDppZih0aGlzLl90PD0wKXRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsZSksdGhpcy5fY29udGV4dC5saW5lVG8odCxlKTtlbHNle3ZhciBuPXRoaXMuX3gqKDEtdGhpcy5fdCkrdCp0aGlzLl90O3RoaXMuX2NvbnRleHQubGluZVRvKG4sdGhpcy5feSksdGhpcy5fY29udGV4dC5saW5lVG8obixlKX19dGhpcy5feD10LHRoaXMuX3k9ZX19LE9QLnByb3RvdHlwZT17Y29uc3RydWN0b3I6T1AsaW5zZXJ0OmZ1bmN0aW9uKHQsZSl7dmFyIG4saSxyO2lmKHQpe2lmKGUuUD10LGUuTj10Lk4sdC5OJiYodC5OLlA9ZSksdC5OPWUsdC5SKXtmb3IodD10LlI7dC5MOyl0PXQuTDt0Lkw9ZX1lbHNlIHQuUj1lO249dH1lbHNlIHRoaXMuXz8odD1IUCh0aGlzLl8pLGUuUD1udWxsLGUuTj10LHQuUD10Lkw9ZSxuPXQpOihlLlA9ZS5OPW51bGwsdGhpcy5fPWUsbj1udWxsKTtmb3IoZS5MPWUuUj1udWxsLGUuVT1uLGUuQz0hMCx0PWU7biYmbi5DOyluPT09KGk9bi5VKS5MPyhyPWkuUikmJnIuQz8obi5DPXIuQz0hMSxpLkM9ITAsdD1pKToodD09PW4uUiYmKERQKHRoaXMsbiksbj0odD1uKS5VKSxuLkM9ITEsaS5DPSEwLEJQKHRoaXMsaSkpOihyPWkuTCkmJnIuQz8obi5DPXIuQz0hMSxpLkM9ITAsdD1pKToodD09PW4uTCYmKEJQKHRoaXMsbiksbj0odD1uKS5VKSxuLkM9ITEsaS5DPSEwLERQKHRoaXMsaSkpLG49dC5VO3RoaXMuXy5DPSExfSxyZW1vdmU6ZnVuY3Rpb24odCl7dC5OJiYodC5OLlA9dC5QKSx0LlAmJih0LlAuTj10Lk4pLHQuTj10LlA9bnVsbDt2YXIgZSxuLGkscj10LlUsbz10LkwsYT10LlI7aWYobj1vP2E/SFAoYSk6bzphLHI/ci5MPT09dD9yLkw9bjpyLlI9bjp0aGlzLl89bixvJiZhPyhpPW4uQyxuLkM9dC5DLG4uTD1vLG8uVT1uLG4hPT1hPyhyPW4uVSxuLlU9dC5VLHIuTD10PW4uUixuLlI9YSxhLlU9bik6KG4uVT1yLHI9bix0PW4uUikpOihpPXQuQyx0PW4pLHQmJih0LlU9ciksIWkpaWYodCYmdC5DKXQuQz0hMTtlbHNle2Rve2lmKHQ9PT10aGlzLl8pYnJlYWs7aWYodD09PXIuTCl7aWYoKGU9ci5SKS5DJiYoZS5DPSExLHIuQz0hMCxEUCh0aGlzLHIpLGU9ci5SKSxlLkwmJmUuTC5DfHxlLlImJmUuUi5DKXtlLlImJmUuUi5DfHwoZS5MLkM9ITEsZS5DPSEwLEJQKHRoaXMsZSksZT1yLlIpLGUuQz1yLkMsci5DPWUuUi5DPSExLERQKHRoaXMsciksdD10aGlzLl87YnJlYWt9fWVsc2UgaWYoKGU9ci5MKS5DJiYoZS5DPSExLHIuQz0hMCxCUCh0aGlzLHIpLGU9ci5MKSxlLkwmJmUuTC5DfHxlLlImJmUuUi5DKXtlLkwmJmUuTC5DfHwoZS5SLkM9ITEsZS5DPSEwLERQKHRoaXMsZSksZT1yLkwpLGUuQz1yLkMsci5DPWUuTC5DPSExLEJQKHRoaXMsciksdD10aGlzLl87YnJlYWt9ZS5DPSEwLHQ9cixyPXIuVX13aGlsZSghdC5DKTt0JiYodC5DPSExKX19fTt2YXIgWFAsJFA9W107ZnVuY3Rpb24gS1AoKXt6UCh0aGlzKSx0aGlzLng9dGhpcy55PXRoaXMuYXJjPXRoaXMuc2l0ZT10aGlzLmN5PW51bGx9ZnVuY3Rpb24gWlAodCl7dmFyIGU9dC5QLG49dC5OO2lmKGUmJm4pe3ZhciBpPWUuc2l0ZSxyPXQuc2l0ZSxvPW4uc2l0ZTtpZihpIT09byl7dmFyIGE9clswXSxzPXJbMV0sbD1pWzBdLWEsYz1pWzFdLXMsdT1vWzBdLWEsaD1vWzFdLXMsZD0yKihsKmgtYyp1KTtpZighKGQ+PS1kTikpe3ZhciBwPWwqbCtjKmMsZj11KnUraCpoLG09KGgqcC1jKmYpL2QsZz0obCpmLXUqcCkvZCxfPSRQLnBvcCgpfHxuZXcgS1A7Xy5hcmM9dCxfLnNpdGU9cixfLng9bSthLF8ueT0oXy5jeT1nK3MpK01hdGguc3FydChtKm0rZypnKSx0LmNpcmNsZT1fO2Zvcih2YXIgeT1udWxsLHY9Y04uXzt2OylpZihfLnk8di55fHxfLnk9PT12LnkmJl8ueDw9di54KXtpZighdi5MKXt5PXYuUDticmVha312PXYuTH1lbHNle2lmKCF2LlIpe3k9djticmVha312PXYuUn1jTi5pbnNlcnQoeSxfKSx5fHwoWFA9Xyl9fX19ZnVuY3Rpb24gSlAodCl7dmFyIGU9dC5jaXJjbGU7ZSYmKGUuUHx8KFhQPWUuTiksY04ucmVtb3ZlKGUpLCRQLnB1c2goZSkselAoZSksdC5jaXJjbGU9bnVsbCl9dmFyIFFQPVtdO2Z1bmN0aW9uIHROKCl7elAodGhpcyksdGhpcy5lZGdlPXRoaXMuc2l0ZT10aGlzLmNpcmNsZT1udWxsfWZ1bmN0aW9uIGVOKHQpe3ZhciBlPVFQLnBvcCgpfHxuZXcgdE47cmV0dXJuIGUuc2l0ZT10LGV9ZnVuY3Rpb24gbk4odCl7SlAodCksc04ucmVtb3ZlKHQpLFFQLnB1c2godCkselAodCl9ZnVuY3Rpb24gaU4odCl7dmFyIGU9dC5jaXJjbGUsbj1lLngsaT1lLmN5LHI9W24saV0sbz10LlAsYT10Lk4scz1bdF07bk4odCk7Zm9yKHZhciBsPW87bC5jaXJjbGUmJk1hdGguYWJzKG4tbC5jaXJjbGUueCk8aE4mJk1hdGguYWJzKGktbC5jaXJjbGUuY3kpPGhOOylvPWwuUCxzLnVuc2hpZnQobCksbk4obCksbD1vO3MudW5zaGlmdChsKSxKUChsKTtmb3IodmFyIGM9YTtjLmNpcmNsZSYmTWF0aC5hYnMobi1jLmNpcmNsZS54KTxoTiYmTWF0aC5hYnMoaS1jLmNpcmNsZS5jeSk8aE47KWE9Yy5OLHMucHVzaChjKSxuTihjKSxjPWE7cy5wdXNoKGMpLEpQKGMpO3ZhciB1LGg9cy5sZW5ndGg7Zm9yKHU9MTt1PGg7Kyt1KVVQKChjPXNbdV0pLmVkZ2UsKGw9c1t1LTFdKS5zaXRlLGMuc2l0ZSxyKTsoYz1zW2gtMV0pLmVkZ2U9RlAoKGw9c1swXSkuc2l0ZSxjLnNpdGUsbnVsbCxyKSxaUChsKSxaUChjKX1mdW5jdGlvbiByTih0KXtmb3IodmFyIGUsbixpLHIsbz10WzBdLGE9dFsxXSxzPXNOLl87czspaWYoKGk9b04ocyxhKS1vKT5oTilzPXMuTDtlbHNle2lmKCEoKHI9by1hTihzLGEpKT5oTikpe2k+LWhOPyhlPXMuUCxuPXMpOnI+LWhOPyhlPXMsbj1zLk4pOmU9bj1zO2JyZWFrfWlmKCFzLlIpe2U9czticmVha31zPXMuUn0hKGZ1bmN0aW9uIGwodCl7bE5bdC5pbmRleF09e3NpdGU6dCxoYWxmZWRnZXM6W119fSkodCk7dmFyIGM9ZU4odCk7aWYoc04uaW5zZXJ0KGUsYyksZXx8bil7aWYoZT09PW4pcmV0dXJuIEpQKGUpLG49ZU4oZS5zaXRlKSxzTi5pbnNlcnQoYyxuKSxjLmVkZ2U9bi5lZGdlPUZQKGUuc2l0ZSxjLnNpdGUpLFpQKGUpLHZvaWQgWlAobik7aWYobil7SlAoZSksSlAobik7dmFyIHU9ZS5zaXRlLGg9dVswXSxkPXVbMV0scD10WzBdLWgsZj10WzFdLWQsbT1uLnNpdGUsZz1tWzBdLWgsXz1tWzFdLWQseT0yKihwKl8tZipnKSx2PXAqcCtmKmYsYj1nKmcrXypfLHg9WyhfKnYtZipiKS95K2gsKHAqYi1nKnYpL3krZF07VVAobi5lZGdlLHUsbSx4KSxjLmVkZ2U9RlAodSx0LG51bGwseCksbi5lZGdlPUZQKHQsbSxudWxsLHgpLFpQKGUpLFpQKG4pfWVsc2UgYy5lZGdlPUZQKGUuc2l0ZSxjLnNpdGUpfX1mdW5jdGlvbiBvTih0LGUpe3ZhciBuPXQuc2l0ZSxpPW5bMF0scj1uWzFdLG89ci1lO2lmKCFvKXJldHVybiBpO3ZhciBhPXQuUDtpZighYSlyZXR1cm4tMS8wO3ZhciBzPShuPWEuc2l0ZSlbMF0sbD1uWzFdLGM9bC1lO2lmKCFjKXJldHVybiBzO3ZhciB1PXMtaSxoPTEvby0xL2MsZD11L2M7cmV0dXJuIGg/KC1kK01hdGguc3FydChkKmQtMipoKih1KnUvKC0yKmMpLWwrYy8yK3Itby8yKSkpL2graTooaStzKS8yfWZ1bmN0aW9uIGFOKHQsZSl7dmFyIG49dC5OO2lmKG4pcmV0dXJuIG9OKG4sZSk7dmFyIGk9dC5zaXRlO3JldHVybiBpWzFdPT09ZT9pWzBdOjEvMH12YXIgc04sbE4sY04sdU4saE49MWUtNixkTj0xZS0xMjtmdW5jdGlvbiBwTih0LGUsbil7cmV0dXJuKHRbMF0tblswXSkqKGVbMV0tdFsxXSktKHRbMF0tZVswXSkqKG5bMV0tdFsxXSl9ZnVuY3Rpb24gZk4odCxlKXtyZXR1cm4gZVsxXS10WzFdfHxlWzBdLXRbMF19ZnVuY3Rpb24gbU4odCxlKXt2YXIgbixpLHIsbz10LnNvcnQoZk4pLnBvcCgpO2Zvcih1Tj1bXSxsTj1uZXcgQXJyYXkodC5sZW5ndGgpLHNOPW5ldyBPUCxjTj1uZXcgT1A7OylpZihyPVhQLG8mJighcnx8b1sxXTxyLnl8fG9bMV09PT1yLnkmJm9bMF08ci54KSlvWzBdPT09biYmb1sxXT09PWl8fChyTihvKSxuPW9bMF0saT1vWzFdKSxvPXQucG9wKCk7ZWxzZXtpZighcilicmVhaztpTihyLmFyYyl9aWYoKGZ1bmN0aW9uIGEoKXtmb3IodmFyIHQsZSxuLGkscj0wLG89bE4ubGVuZ3RoO3I8bzsrK3IpaWYoKHQ9bE5bcl0pJiYoaT0oZT10LmhhbGZlZGdlcykubGVuZ3RoKSl7dmFyIGE9bmV3IEFycmF5KGkpLHM9bmV3IEFycmF5KGkpO2ZvcihuPTA7bjxpOysrbilhW25dPW4sc1tuXT1XUCh0LHVOW2Vbbl1dKTtmb3IoYS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBzW2VdLXNbdF19KSksbj0wO248aTsrK24pc1tuXT1lW2Fbbl1dO2ZvcihuPTA7bjxpOysrbillW25dPXNbbl19fSkoKSxlKXt2YXIgcz0rZVswXVswXSxsPStlWzBdWzFdLGM9K2VbMV1bMF0sdT0rZVsxXVsxXTshKGZ1bmN0aW9uIGgodCxlLG4saSl7Zm9yKHZhciByLG89dU4ubGVuZ3RoO28tLTspR1Aocj11TltvXSx0LGUsbixpKSYmalAocix0LGUsbixpKSYmKE1hdGguYWJzKHJbMF1bMF0tclsxXVswXSk+aE58fE1hdGguYWJzKHJbMF1bMV0tclsxXVsxXSk+aE4pfHxkZWxldGUgdU5bb119KShzLGwsYyx1KSwoZnVuY3Rpb24gZCh0LGUsbixpKXt2YXIgcixvLGEscyxsLGMsdSxoLGQscCxmLG0sZz1sTi5sZW5ndGgsXz0hMDtmb3Iocj0wO3I8ZzsrK3IpaWYobz1sTltyXSl7Zm9yKGE9by5zaXRlLHM9KGw9by5oYWxmZWRnZXMpLmxlbmd0aDtzLS07KXVOW2xbc11dfHxsLnNwbGljZShzLDEpO2ZvcihzPTAsYz1sLmxlbmd0aDtzPGM7KWY9KHA9WVAobyx1TltsW3NdXSkpWzBdLG09cFsxXSxoPSh1PXFQKG8sdU5bbFsrK3MlY11dKSlbMF0sZD11WzFdLChNYXRoLmFicyhmLWgpPmhOfHxNYXRoLmFicyhtLWQpPmhOKSYmKGwuc3BsaWNlKHMsMCx1Ti5wdXNoKFZQKGEscCxNYXRoLmFicyhmLXQpPGhOJiZpLW0+aE4/W3QsTWF0aC5hYnMoaC10KTxoTj9kOmldOk1hdGguYWJzKG0taSk8aE4mJm4tZj5oTj9bTWF0aC5hYnMoZC1pKTxoTj9oOm4saV06TWF0aC5hYnMoZi1uKTxoTiYmbS1lPmhOP1tuLE1hdGguYWJzKGgtbik8aE4/ZDplXTpNYXRoLmFicyhtLWUpPGhOJiZmLXQ+aE4/W01hdGguYWJzKGQtZSk8aE4/aDp0LGVdOm51bGwpKS0xKSwrK2MpO2MmJihfPSExKX1pZihfKXt2YXIgeSx2LGIseD0xLzA7Zm9yKHI9MCxfPW51bGw7cjxnOysrcikobz1sTltyXSkmJihiPSh5PShhPW8uc2l0ZSlbMF0tdCkqeSsodj1hWzFdLWUpKnYpPHgmJih4PWIsXz1vKTtpZihfKXt2YXIgdz1bdCxlXSxTPVt0LGldLE09W24saV0sRT1bbixlXTtfLmhhbGZlZGdlcy5wdXNoKHVOLnB1c2goVlAoYT1fLnNpdGUsdyxTKSktMSx1Ti5wdXNoKFZQKGEsUyxNKSktMSx1Ti5wdXNoKFZQKGEsTSxFKSktMSx1Ti5wdXNoKFZQKGEsRSx3KSktMSl9fWZvcihyPTA7cjxnOysrcikobz1sTltyXSkmJihvLmhhbGZlZGdlcy5sZW5ndGh8fGRlbGV0ZSBsTltyXSl9KShzLGwsYyx1KX10aGlzLmVkZ2VzPXVOLHRoaXMuY2VsbHM9bE4sc049Y049dU49bE49bnVsbH1mdW5jdGlvbiBnTih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gX04odCxlLG4pe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPWUsdGhpcy50cmFuc2Zvcm09bn1mdW5jdGlvbiB5Tih0LGUsbil7dGhpcy5rPXQsdGhpcy54PWUsdGhpcy55PW59bU4ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjptTixwb2x5Z29uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMubWFwKChmdW5jdGlvbihlKXt2YXIgbj1lLmhhbGZlZGdlcy5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiBxUChlLHRbbl0pfSkpO3JldHVybiBuLmRhdGE9ZS5zaXRlLmRhdGEsbn0pKX0sdHJpYW5nbGVzOmZ1bmN0aW9uKCl7dmFyIHQ9W10sZT10aGlzLmVkZ2VzO3JldHVybiB0aGlzLmNlbGxzLmZvckVhY2goKGZ1bmN0aW9uKG4saSl7aWYobz0ocj1uLmhhbGZlZGdlcykubGVuZ3RoKWZvcih2YXIgcixvLGEscz1uLnNpdGUsbD0tMSxjPWVbcltvLTFdXSx1PWMubGVmdD09PXM/Yy5yaWdodDpjLmxlZnQ7KytsPG87KWE9dSx1PShjPWVbcltsXV0pLmxlZnQ9PT1zP2MucmlnaHQ6Yy5sZWZ0LGEmJnUmJmk8YS5pbmRleCYmaTx1LmluZGV4JiZwTihzLGEsdSk8MCYmdC5wdXNoKFtzLmRhdGEsYS5kYXRhLHUuZGF0YV0pfSkpLHR9LGxpbmtzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZXMuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5yaWdodH0pKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybntzb3VyY2U6dC5sZWZ0LmRhdGEsdGFyZ2V0OnQucmlnaHQuZGF0YX19KSl9LGZpbmQ6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaSxyLG89dGhpcyxhPW8uX2ZvdW5kfHwwLHM9by5jZWxscy5sZW5ndGg7IShyPW8uY2VsbHNbYV0pOylpZigrK2E+PXMpcmV0dXJuIG51bGw7dmFyIGw9dC1yLnNpdGVbMF0sYz1lLXIuc2l0ZVsxXSx1PWwqbCtjKmM7ZG97cj1vLmNlbGxzW2k9YV0sYT1udWxsLHIuaGFsZmVkZ2VzLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBpPW8uZWRnZXNbbl0scz1pLmxlZnQ7aWYocyE9PXIuc2l0ZSYmc3x8KHM9aS5yaWdodCkpe3ZhciBsPXQtc1swXSxjPWUtc1sxXSxoPWwqbCtjKmM7aDx1JiYodT1oLGE9cy5pbmRleCl9fSkpfXdoaWxlKG51bGwhPT1hKTtyZXR1cm4gby5fZm91bmQ9aSxudWxsPT1ufHx1PD1uKm4/ci5zaXRlOm51bGx9fSx5Ti5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnlOLHNjYWxlOmZ1bmN0aW9uKHQpe3JldHVybiAxPT09dD90aGlzOm5ldyB5Tih0aGlzLmsqdCx0aGlzLngsdGhpcy55KX0sdHJhbnNsYXRlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIDA9PT10JjA9PT1lP3RoaXM6bmV3IHlOKHRoaXMuayx0aGlzLngrdGhpcy5rKnQsdGhpcy55K3RoaXMuayplKX0sYXBwbHk6ZnVuY3Rpb24odCl7cmV0dXJuW3RbMF0qdGhpcy5rK3RoaXMueCx0WzFdKnRoaXMuayt0aGlzLnldfSxhcHBseVg6ZnVuY3Rpb24odCl7cmV0dXJuIHQqdGhpcy5rK3RoaXMueH0sYXBwbHlZOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuayt0aGlzLnl9LGludmVydDpmdW5jdGlvbih0KXtyZXR1cm5bKHRbMF0tdGhpcy54KS90aGlzLmssKHRbMV0tdGhpcy55KS90aGlzLmtdfSxpbnZlcnRYOmZ1bmN0aW9uKHQpe3JldHVybih0LXRoaXMueCkvdGhpcy5rfSxpbnZlcnRZOmZ1bmN0aW9uKHQpe3JldHVybih0LXRoaXMueSkvdGhpcy5rfSxyZXNjYWxlWDpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCkuZG9tYWluKHQucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRYLHRoaXMpLm1hcCh0LmludmVydCx0KSl9LHJlc2NhbGVZOmZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoKS5kb21haW4odC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksdGhpcykubWFwKHQuaW52ZXJ0LHQpKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4idHJhbnNsYXRlKCIrdGhpcy54KyIsIit0aGlzLnkrIikgc2NhbGUoIit0aGlzLmsrIikifX07dmFyIHZOPW5ldyB5TigxLDAsMCk7ZnVuY3Rpb24gYk4odCl7Zm9yKDshdC5fX3pvb207KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybiB2TjtyZXR1cm4gdC5fX3pvb219ZnVuY3Rpb24geE4oKXt1dS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiB3Tigpe3V1LnByZXZlbnREZWZhdWx0KCksdXUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gU04oKXtyZXR1cm4hdXUuY3RybEtleSYmIXV1LmJ1dHRvbn1mdW5jdGlvbiBNTigpe3ZhciB0PXRoaXM7cmV0dXJuIHQgaW5zdGFuY2VvZiBTVkdFbGVtZW50Pyh0PXQub3duZXJTVkdFbGVtZW50fHx0KS5oYXNBdHRyaWJ1dGUoInZpZXdCb3giKT9bWyh0PXQudmlld0JveC5iYXNlVmFsKS54LHQueV0sW3QueCt0LndpZHRoLHQueSt0LmhlaWdodF1dOltbMCwwXSxbdC53aWR0aC5iYXNlVmFsLnZhbHVlLHQuaGVpZ2h0LmJhc2VWYWwudmFsdWVdXTpbWzAsMF0sW3QuY2xpZW50V2lkdGgsdC5jbGllbnRIZWlnaHRdXX1mdW5jdGlvbiBFTigpe3JldHVybiB0aGlzLl9fem9vbXx8dk59ZnVuY3Rpb24gVE4oKXtyZXR1cm4tdXUuZGVsdGFZKigxPT09dXUuZGVsdGFNb2RlPy4wNTp1dS5kZWx0YU1vZGU/MTouMDAyKX1mdW5jdGlvbiBDTigpe3JldHVybiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHN8fCJvbnRvdWNoc3RhcnQiaW4gdGhpc31mdW5jdGlvbiBBTih0LGUsbil7dmFyIGk9dC5pbnZlcnRYKGVbMF1bMF0pLW5bMF1bMF0scj10LmludmVydFgoZVsxXVswXSktblsxXVswXSxvPXQuaW52ZXJ0WShlWzBdWzFdKS1uWzBdWzFdLGE9dC5pbnZlcnRZKGVbMV1bMV0pLW5bMV1bMV07cmV0dXJuIHQudHJhbnNsYXRlKHI+aT8oaStyKS8yOk1hdGgubWluKDAsaSl8fE1hdGgubWF4KDAsciksYT5vPyhvK2EpLzI6TWF0aC5taW4oMCxvKXx8TWF0aC5tYXgoMCxhKSl9ZnVuY3Rpb24ga04oKXt2YXIgdCxlLG49U04saT1NTixyPUFOLG89VE4sYT1DTixzPVswLDEvMF0sbD1bWy0xLzAsLTEvMF0sWzEvMCwxLzBdXSxjPTI1MCx1PW9wLGg9bGMoInN0YXJ0Iiwiem9vbSIsImVuZCIpLGQ9NTAwLHA9MDtmdW5jdGlvbiBmKHQpe3QucHJvcGVydHkoIl9fem9vbSIsRU4pLm9uKCJ3aGVlbC56b29tIix4KS5vbigibW91c2Vkb3duLnpvb20iLHcpLm9uKCJkYmxjbGljay56b29tIixTKS5maWx0ZXIoYSkub24oInRvdWNoc3RhcnQuem9vbSIsTSkub24oInRvdWNobW92ZS56b29tIixFKS5vbigidG91Y2hlbmQuem9vbSB0b3VjaGNhbmNlbC56b29tIixUKS5zdHlsZSgidG91Y2gtYWN0aW9uIiwibm9uZSIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIil9ZnVuY3Rpb24gbSh0LGUpe3JldHVybihlPU1hdGgubWF4KHNbMF0sTWF0aC5taW4oc1sxXSxlKSkpPT09dC5rP3Q6bmV3IHlOKGUsdC54LHQueSl9ZnVuY3Rpb24gZyh0LGUsbil7dmFyIGk9ZVswXS1uWzBdKnQuayxyPWVbMV0tblsxXSp0Lms7cmV0dXJuIGk9PT10LngmJnI9PT10Lnk/dDpuZXcgeU4odC5rLGkscil9ZnVuY3Rpb24gXyh0KXtyZXR1cm5bKCt0WzBdWzBdKyArdFsxXVswXSkvMiwoK3RbMF1bMV0rICt0WzFdWzFdKS8yXX1mdW5jdGlvbiB5KHQsZSxuKXt0Lm9uKCJzdGFydC56b29tIiwoZnVuY3Rpb24oKXt2KHRoaXMsYXJndW1lbnRzKS5zdGFydCgpfSkpLm9uKCJpbnRlcnJ1cHQuem9vbSBlbmQuem9vbSIsKGZ1bmN0aW9uKCl7dih0aGlzLGFyZ3VtZW50cykuZW5kKCl9KSkudHdlZW4oInpvb20iLChmdW5jdGlvbigpe3ZhciB0PXRoaXMscj1hcmd1bWVudHMsbz12KHQsciksYT1pLmFwcGx5KHQscikscz1udWxsPT1uP18oYSk6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0LHIpOm4sbD1NYXRoLm1heChhWzFdWzBdLWFbMF1bMF0sYVsxXVsxXS1hWzBdWzFdKSxjPXQuX196b29tLGg9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0LHIpOmUsZD11KGMuaW52ZXJ0KHMpLmNvbmNhdChsL2MuayksaC5pbnZlcnQocykuY29uY2F0KGwvaC5rKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKDE9PT10KXQ9aDtlbHNle3ZhciBlPWQodCksbj1sL2VbMl07dD1uZXcgeU4obixzWzBdLWVbMF0qbixzWzFdLWVbMV0qbil9by56b29tKG51bGwsdCl9fSkpfWZ1bmN0aW9uIHYodCxlLG4pe3JldHVybiFuJiZ0Ll9fem9vbWluZ3x8bmV3IGIodCxlKX1mdW5jdGlvbiBiKHQsZSl7dGhpcy50aGF0PXQsdGhpcy5hcmdzPWUsdGhpcy5hY3RpdmU9MCx0aGlzLmV4dGVudD1pLmFwcGx5KHQsZSksdGhpcy50YXBzPTB9ZnVuY3Rpb24geCgpe2lmKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdD12KHRoaXMsYXJndW1lbnRzKSxlPXRoaXMuX196b29tLGk9TWF0aC5tYXgoc1swXSxNYXRoLm1pbihzWzFdLGUuaypNYXRoLnBvdygyLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpKSkpLGE9YWgodGhpcyk7aWYodC53aGVlbCl0Lm1vdXNlWzBdWzBdPT09YVswXSYmdC5tb3VzZVswXVsxXT09PWFbMV18fCh0Lm1vdXNlWzFdPWUuaW52ZXJ0KHQubW91c2VbMF09YSkpLGNsZWFyVGltZW91dCh0LndoZWVsKTtlbHNle2lmKGUuaz09PWkpcmV0dXJuO3QubW91c2U9W2EsZS5pbnZlcnQoYSldLFZwKHRoaXMpLHQuc3RhcnQoKX13TigpLHQud2hlZWw9c2V0VGltZW91dChjLDE1MCksdC56b29tKCJtb3VzZSIscihnKG0oZSxpKSx0Lm1vdXNlWzBdLHQubW91c2VbMV0pLHQuZXh0ZW50LGwpKX1mdW5jdGlvbiBjKCl7dC53aGVlbD1udWxsLHQuZW5kKCl9fWZ1bmN0aW9uIHcoKXtpZighZSYmbi5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciB0PXYodGhpcyxhcmd1bWVudHMsITApLGk9U3UodXUudmlldykub24oIm1vdXNlbW92ZS56b29tIixjLCEwKS5vbigibW91c2V1cC56b29tIix1LCEwKSxvPWFoKHRoaXMpLGE9dXUuY2xpZW50WCxzPXV1LmNsaWVudFk7aGgodXUudmlldykseE4oKSx0Lm1vdXNlPVtvLHRoaXMuX196b29tLmludmVydChvKV0sVnAodGhpcyksdC5zdGFydCgpfWZ1bmN0aW9uIGMoKXtpZih3TigpLCF0Lm1vdmVkKXt2YXIgZT11dS5jbGllbnRYLWEsbj11dS5jbGllbnRZLXM7dC5tb3ZlZD1lKmUrbipuPnB9dC56b29tKCJtb3VzZSIscihnKHQudGhhdC5fX3pvb20sdC5tb3VzZVswXT1haCh0LnRoYXQpLHQubW91c2VbMV0pLHQuZXh0ZW50LGwpKX1mdW5jdGlvbiB1KCl7aS5vbigibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tIixudWxsKSxkaCh1dS52aWV3LHQubW92ZWQpLHdOKCksdC5lbmQoKX19ZnVuY3Rpb24gUygpe2lmKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdD10aGlzLl9fem9vbSxlPWFoKHRoaXMpLG89dC5pbnZlcnQoZSksYT10LmsqKHV1LnNoaWZ0S2V5Py41OjIpLHM9cihnKG0odCxhKSxlLG8pLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpLGwpO3dOKCksYz4wP1N1KHRoaXMpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihjKS5jYWxsKHkscyxlKTpTdSh0aGlzKS5jYWxsKGYudHJhbnNmb3JtLHMpfX1mdW5jdGlvbiBNKCl7aWYobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBlLGkscixvLGE9dXUudG91Y2hlcyxzPWEubGVuZ3RoLGw9dih0aGlzLGFyZ3VtZW50cyx1dS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg9PT1zKTtmb3IoeE4oKSxpPTA7aTxzOysraSlvPVtvPWxoKHRoaXMsYSwocj1hW2ldKS5pZGVudGlmaWVyKSx0aGlzLl9fem9vbS5pbnZlcnQobyksci5pZGVudGlmaWVyXSxsLnRvdWNoMD9sLnRvdWNoMXx8bC50b3VjaDBbMl09PT1vWzJdfHwobC50b3VjaDE9byxsLnRhcHM9MCk6KGwudG91Y2gwPW8sZT0hMCxsLnRhcHM9MSshIXQpO3QmJih0PWNsZWFyVGltZW91dCh0KSksZSYmKGwudGFwczwyJiYodD1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3Q9bnVsbH0pLGQpKSxWcCh0aGlzKSxsLnN0YXJ0KCkpfX1mdW5jdGlvbiBFKCl7aWYodGhpcy5fX3pvb21pbmcpe3ZhciBlLG4saSxvLGE9dih0aGlzLGFyZ3VtZW50cykscz11dS5jaGFuZ2VkVG91Y2hlcyxjPXMubGVuZ3RoO2Zvcih3TigpLHQmJih0PWNsZWFyVGltZW91dCh0KSksYS50YXBzPTAsZT0wO2U8YzsrK2UpaT1saCh0aGlzLHMsKG49c1tlXSkuaWRlbnRpZmllciksYS50b3VjaDAmJmEudG91Y2gwWzJdPT09bi5pZGVudGlmaWVyP2EudG91Y2gwWzBdPWk6YS50b3VjaDEmJmEudG91Y2gxWzJdPT09bi5pZGVudGlmaWVyJiYoYS50b3VjaDFbMF09aSk7aWYobj1hLnRoYXQuX196b29tLGEudG91Y2gxKXt2YXIgdT1hLnRvdWNoMFswXSxoPWEudG91Y2gwWzFdLGQ9YS50b3VjaDFbMF0scD1hLnRvdWNoMVsxXSxmPShmPWRbMF0tdVswXSkqZisoZj1kWzFdLXVbMV0pKmYsXz0oXz1wWzBdLWhbMF0pKl8rKF89cFsxXS1oWzFdKSpfO249bShuLE1hdGguc3FydChmL18pKSxpPVsodVswXStkWzBdKS8yLCh1WzFdK2RbMV0pLzJdLG89WyhoWzBdK3BbMF0pLzIsKGhbMV0rcFsxXSkvMl19ZWxzZXtpZighYS50b3VjaDApcmV0dXJuO2k9YS50b3VjaDBbMF0sbz1hLnRvdWNoMFsxXX1hLnpvb20oInRvdWNoIixyKGcobixpLG8pLGEuZXh0ZW50LGwpKX19ZnVuY3Rpb24gVCgpe2lmKHRoaXMuX196b29taW5nKXt2YXIgdCxuLGk9dih0aGlzLGFyZ3VtZW50cykscj11dS5jaGFuZ2VkVG91Y2hlcyxvPXIubGVuZ3RoO2Zvcih4TigpLGUmJmNsZWFyVGltZW91dChlKSxlPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZT1udWxsfSksZCksdD0wO3Q8bzsrK3Qpbj1yW3RdLGkudG91Y2gwJiZpLnRvdWNoMFsyXT09PW4uaWRlbnRpZmllcj9kZWxldGUgaS50b3VjaDA6aS50b3VjaDEmJmkudG91Y2gxWzJdPT09bi5pZGVudGlmaWVyJiZkZWxldGUgaS50b3VjaDE7aWYoaS50b3VjaDEmJiFpLnRvdWNoMCYmKGkudG91Y2gwPWkudG91Y2gxLGRlbGV0ZSBpLnRvdWNoMSksaS50b3VjaDApaS50b3VjaDBbMV09dGhpcy5fX3pvb20uaW52ZXJ0KGkudG91Y2gwWzBdKTtlbHNlIGlmKGkuZW5kKCksMj09PWkudGFwcyl7dmFyIGE9U3UodGhpcykub24oImRibGNsaWNrLnpvb20iKTthJiZhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19fXJldHVybiBmLnRyYW5zZm9ybT1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5zZWxlY3Rpb24/dC5zZWxlY3Rpb24oKTp0O2kucHJvcGVydHkoIl9fem9vbSIsRU4pLHQhPT1pP3kodCxlLG4pOmkuaW50ZXJydXB0KCkuZWFjaCgoZnVuY3Rpb24oKXt2KHRoaXMsYXJndW1lbnRzKS5zdGFydCgpLnpvb20obnVsbCwiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplKS5lbmQoKX0pKX0sZi5zY2FsZUJ5PWZ1bmN0aW9uKHQsZSxuKXtmLnNjYWxlVG8odCwoZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9fem9vbS5rLG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZTtyZXR1cm4gdCpufSksbil9LGYuc2NhbGVUbz1mdW5jdGlvbih0LGUsbil7Zi50cmFuc2Zvcm0odCwoZnVuY3Rpb24oKXt2YXIgdD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxvPXRoaXMuX196b29tLGE9bnVsbD09bj9fKHQpOiJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm4scz1vLmludmVydChhKSxjPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmU7cmV0dXJuIHIoZyhtKG8sYyksYSxzKSx0LGwpfSksbil9LGYudHJhbnNsYXRlQnk9ZnVuY3Rpb24odCxlLG4pe2YudHJhbnNmb3JtKHQsKGZ1bmN0aW9uKCl7cmV0dXJuIHIodGhpcy5fX3pvb20udHJhbnNsYXRlKCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUsImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6biksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyksbCl9KSl9LGYudHJhbnNsYXRlVG89ZnVuY3Rpb24odCxlLG4sbyl7Zi50cmFuc2Zvcm0odCwoZnVuY3Rpb24oKXt2YXIgdD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhPXRoaXMuX196b29tLHM9bnVsbD09bz9fKHQpOiJmdW5jdGlvbiI9PXR5cGVvZiBvP28uYXBwbHkodGhpcyxhcmd1bWVudHMpOm87cmV0dXJuIHIodk4udHJhbnNsYXRlKHNbMF0sc1sxXSkuc2NhbGUoYS5rKS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIGU/LWUuYXBwbHkodGhpcyxhcmd1bWVudHMpOi1lLCJmdW5jdGlvbiI9PXR5cGVvZiBuPy1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTotbiksdCxsKX0pLG8pfSxiLnByb3RvdHlwZT17c3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gMT09Kyt0aGlzLmFjdGl2ZSYmKHRoaXMudGhhdC5fX3pvb21pbmc9dGhpcyx0aGlzLmVtaXQoInN0YXJ0IikpLHRoaXN9LHpvb206ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5tb3VzZSYmIm1vdXNlIiE9PXQmJih0aGlzLm1vdXNlWzFdPWUuaW52ZXJ0KHRoaXMubW91c2VbMF0pKSx0aGlzLnRvdWNoMCYmInRvdWNoIiE9PXQmJih0aGlzLnRvdWNoMFsxXT1lLmludmVydCh0aGlzLnRvdWNoMFswXSkpLHRoaXMudG91Y2gxJiYidG91Y2giIT09dCYmKHRoaXMudG91Y2gxWzFdPWUuaW52ZXJ0KHRoaXMudG91Y2gxWzBdKSksdGhpcy50aGF0Ll9fem9vbT1lLHRoaXMuZW1pdCgiem9vbSIpLHRoaXN9LGVuZDpmdW5jdGlvbigpe3JldHVybiAwPT0tLXRoaXMuYWN0aXZlJiYoZGVsZXRlIHRoaXMudGhhdC5fX3pvb21pbmcsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXtndShuZXcgX04oZix0LHRoaXMudGhhdC5fX3pvb20pLGguYXBwbHksaCxbdCx0aGlzLnRoYXQsdGhpcy5hcmdzXSl9fSxmLndoZWVsRGVsdGE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpnTigrdCksZik6b30sZi5maWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpnTighIXQpLGYpOm59LGYudG91Y2hhYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Z04oISF0KSxmKTphfSxmLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmdOKFtbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dKSxmKTppfSxmLnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzWzBdPSt0WzBdLHNbMV09K3RbMV0sZik6W3NbMF0sc1sxXV19LGYudHJhbnNsYXRlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsWzBdWzBdPSt0WzBdWzBdLGxbMV1bMF09K3RbMV1bMF0sbFswXVsxXT0rdFswXVsxXSxsWzFdWzFdPSt0WzFdWzFdLGYpOltbbFswXVswXSxsWzBdWzFdXSxbbFsxXVswXSxsWzFdWzFdXV19LGYuY29uc3RyYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsZik6cn0sZi5kdXJhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0rdCxmKTpjfSxmLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsZik6dX0sZi5vbj1mdW5jdGlvbigpe3ZhciB0PWgub24uYXBwbHkoaCxhcmd1bWVudHMpO3JldHVybiB0PT09aD9mOnR9LGYuY2xpY2tEaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0odD0rdCkqdCxmKTpNYXRoLnNxcnQocCl9LGZ9Yk4ucHJvdG90eXBlPXlOLnByb3RvdHlwZTt2YXIgTE49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdmVyc2lvbjoiNS43LjAiLGJpc2VjdDpTbCxiaXNlY3RSaWdodDpTbCxiaXNlY3RMZWZ0Ok1sLGFzY2VuZGluZzpibCxiaXNlY3Rvcjp4bCxjcm9zczpUbCxkZXNjZW5kaW5nOmZ1bmN0aW9uIFBOKHQsZSl7cmV0dXJuIGU8dD8tMTplPnQ/MTplPj10PzA6TmFOfSxkZXZpYXRpb246a2wsZXh0ZW50OkxsLGhpc3RvZ3JhbTpmdW5jdGlvbiBOTigpe3ZhciB0PU9sLGU9TGwsbj1qbDtmdW5jdGlvbiBpKGkpe3ZhciByLG8sYT1pLmxlbmd0aCxzPW5ldyBBcnJheShhKTtmb3Iocj0wO3I8YTsrK3Ipc1tyXT10KGlbcl0scixpKTt2YXIgbD1lKHMpLGM9bFswXSx1PWxbMV0saD1uKHMsYyx1KTtBcnJheS5pc0FycmF5KGgpfHwoaD1VbChjLHUsaCksaD16bChNYXRoLmNlaWwoYy9oKSpoLHUsaCkpO2Zvcih2YXIgZD1oLmxlbmd0aDtoWzBdPD1jOyloLnNoaWZ0KCksLS1kO2Zvcig7aFtkLTFdPnU7KWgucG9wKCksLS1kO3ZhciBwLGY9bmV3IEFycmF5KGQrMSk7Zm9yKHI9MDtyPD1kOysrcikocD1mW3JdPVtdKS54MD1yPjA/aFtyLTFdOmMscC54MT1yPGQ/aFtyXTp1O2ZvcihyPTA7cjxhOysrciljPD0obz1zW3JdKSYmbzw9dSYmZltTbChoLG8sMCxkKV0ucHVzaChpW3JdKTtyZXR1cm4gZn1yZXR1cm4gaS52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOlJsKGUpLGkpOnR9LGkuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmwoW3RbMF0sdFsxXV0pLGkpOmV9LGkudGhyZXNob2xkcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkFycmF5LmlzQXJyYXkodCk/UmwoTmwuY2FsbCh0KSk6UmwodCksaSk6bn0saX0sdGhyZXNob2xkRnJlZWRtYW5EaWFjb25pczpmdW5jdGlvbiBJTih0LGUsbil7cmV0dXJuIHQ9SWwuY2FsbCh0LENsKS5zb3J0KGJsKSxNYXRoLmNlaWwoKG4tZSkvKDIqKEdsKHQsLjc1KS1HbCh0LC4yNSkpKk1hdGgucG93KHQubGVuZ3RoLC0xLzMpKSl9LHRocmVzaG9sZFNjb3R0OmZ1bmN0aW9uIFJOKHQsZSxuKXtyZXR1cm4gTWF0aC5jZWlsKChuLWUpLygzLjUqa2wodCkqTWF0aC5wb3codC5sZW5ndGgsLTEvMykpKX0sdGhyZXNob2xkU3R1cmdlczpqbCxtYXg6V2wsbWVhbjpmdW5jdGlvbiBPTih0LGUpe3ZhciBuLGk9dC5sZW5ndGgscj1pLG89LTEsYT0wO2lmKG51bGw9PWUpZm9yKDsrK288aTspaXNOYU4obj1DbCh0W29dKSk/LS1yOmErPW47ZWxzZSBmb3IoOysrbzxpOylpc05hTihuPUNsKGUodFtvXSxvLHQpKSk/LS1yOmErPW47aWYocilyZXR1cm4gYS9yfSxtZWRpYW46ZnVuY3Rpb24gek4odCxlKXt2YXIgbixpPXQubGVuZ3RoLHI9LTEsbz1bXTtpZihudWxsPT1lKWZvcig7KytyPGk7KWlzTmFOKG49Q2wodFtyXSkpfHxvLnB1c2gobik7ZWxzZSBmb3IoOysrcjxpOylpc05hTihuPUNsKGUodFtyXSxyLHQpKSl8fG8ucHVzaChuKTtyZXR1cm4gR2woby5zb3J0KGJsKSwuNSl9LG1lcmdlOnFsLG1pbjpZbCxwYWlyczpmdW5jdGlvbiBETih0LGUpe251bGw9PWUmJihlPUVsKTtmb3IodmFyIG49MCxpPXQubGVuZ3RoLTEscj10WzBdLG89bmV3IEFycmF5KGk8MD8wOmkpO248aTspb1tuXT1lKHIscj10Wysrbl0pO3JldHVybiBvfSxwZXJtdXRlOmZ1bmN0aW9uIEJOKHQsZSl7Zm9yKHZhciBuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pO24tLTspaVtuXT10W2Vbbl1dO3JldHVybiBpfSxxdWFudGlsZTpHbCxyYW5nZTp6bCxzY2FuOmZ1bmN0aW9uIEhOKHQsZSl7aWYobj10Lmxlbmd0aCl7dmFyIG4saSxyPTAsbz0wLGE9dFtvXTtmb3IobnVsbD09ZSYmKGU9YmwpOysrcjxuOykoZShpPXRbcl0sYSk8MHx8MCE9PWUoYSxhKSkmJihhPWksbz1yKTtyZXR1cm4gMD09PWUoYSxhKT9vOnZvaWQgMH19LHNodWZmbGU6ZnVuY3Rpb24gRk4odCxlLG4pe2Zvcih2YXIgaSxyLG89KG51bGw9PW4/dC5sZW5ndGg6biktKGU9bnVsbD09ZT8wOitlKTtvOylyPU1hdGgucmFuZG9tKCkqby0tfDAsaT10W28rZV0sdFtvK2VdPXRbcitlXSx0W3IrZV09aTtyZXR1cm4gdH0sc3VtOmZ1bmN0aW9uIFZOKHQsZSl7dmFyIG4saT10Lmxlbmd0aCxyPS0xLG89MDtpZihudWxsPT1lKWZvcig7KytyPGk7KShuPSt0W3JdKSYmKG8rPW4pO2Vsc2UgZm9yKDsrK3I8aTspKG49K2UodFtyXSxyLHQpKSYmKG8rPW4pO3JldHVybiBvfSx0aWNrczpGbCx0aWNrSW5jcmVtZW50OlZsLHRpY2tTdGVwOlVsLHRyYW5zcG9zZTpYbCx2YXJpYW5jZTpBbCx6aXA6ZnVuY3Rpb24gVU4oKXtyZXR1cm4gWGwoYXJndW1lbnRzKX0sYXhpc1RvcDpmdW5jdGlvbiBqTih0KXtyZXR1cm4gcmMoMSx0KX0sYXhpc1JpZ2h0OmZ1bmN0aW9uIEdOKHQpe3JldHVybiByYygyLHQpfSxheGlzQm90dG9tOm9jLGF4aXNMZWZ0OmFjLGJydXNoOkptLGJydXNoWDpmdW5jdGlvbiBXTigpe3JldHVybiBRbSh6bSl9LGJydXNoWTpabSxicnVzaFNlbGVjdGlvbjpLbSxjaG9yZDpmdW5jdGlvbiBxTigpe3ZhciB0PTAsZT1udWxsLG49bnVsbCxpPW51bGw7ZnVuY3Rpb24gcihyKXt2YXIgbyxhLHMsbCxjLHUsaD1yLmxlbmd0aCxkPVtdLHA9emwoaCksZj1bXSxtPVtdLGc9bS5ncm91cHM9bmV3IEFycmF5KGgpLF89bmV3IEFycmF5KGgqaCk7Zm9yKG89MCxjPS0xOysrYzxoOyl7Zm9yKGE9MCx1PS0xOysrdTxoOylhKz1yW2NdW3VdO2QucHVzaChhKSxmLnB1c2goemwoaCkpLG8rPWF9Zm9yKGUmJnAuc29ydCgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZShkW3RdLGRbbl0pfSkpLG4mJmYuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt0LnNvcnQoKGZ1bmN0aW9uKHQsaSl7cmV0dXJuIG4ocltlXVt0XSxyW2VdW2ldKX0pKX0pKSxsPShvPW9nKDAscmctdCpoKS9vKT90OnJnL2gsYT0wLGM9LTE7KytjPGg7KXtmb3Iocz1hLHU9LTE7Kyt1PGg7KXt2YXIgeT1wW2NdLHY9Zlt5XVt1XSxiPXJbeV1bdl0seD1hLHc9YSs9YipvO19bdipoK3ldPXtpbmRleDp5LHN1YmluZGV4OnYsc3RhcnRBbmdsZTp4LGVuZEFuZ2xlOncsdmFsdWU6Yn19Z1t5XT17aW5kZXg6eSxzdGFydEFuZ2xlOnMsZW5kQW5nbGU6YSx2YWx1ZTpkW3ldfSxhKz1sfWZvcihjPS0xOysrYzxoOylmb3IodT1jLTE7Kyt1PGg7KXt2YXIgUz1fW3UqaCtjXSxNPV9bYypoK3VdOyhTLnZhbHVlfHxNLnZhbHVlKSYmbS5wdXNoKFMudmFsdWU8TS52YWx1ZT97c291cmNlOk0sdGFyZ2V0OlN9Ontzb3VyY2U6Uyx0YXJnZXQ6TX0pfXJldHVybiBpP20uc29ydChpKTptfXJldHVybiByLnBhZEFuZ2xlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW9nKDAsZSkscik6dH0sci5zb3J0R3JvdXBzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQscik6ZX0sci5zb3J0U3ViZ3JvdXBzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQscik6bn0sci5zb3J0Q2hvcmRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P2k9bnVsbDooaT1hZyh0KSkuXz10LHIpOmkmJmkuX30scn0scmliYm9uOmZ1bmN0aW9uIFlOKCl7dmFyIHQ9bWcsZT1nZyxuPV9nLGk9eWcscj12ZyxvPW51bGw7ZnVuY3Rpb24gYSgpe3ZhciBhLHM9c2cuY2FsbChhcmd1bWVudHMpLGw9dC5hcHBseSh0aGlzLHMpLGM9ZS5hcHBseSh0aGlzLHMpLHU9K24uYXBwbHkodGhpcywoc1swXT1sLHMpKSxoPWkuYXBwbHkodGhpcyxzKS1pZyxkPXIuYXBwbHkodGhpcyxzKS1pZyxwPXUqdGcoaCksZj11KmVnKGgpLG09K24uYXBwbHkodGhpcywoc1swXT1jLHMpKSxnPWkuYXBwbHkodGhpcyxzKS1pZyxfPXIuYXBwbHkodGhpcyxzKS1pZztpZihvfHwobz1hPWZnKCkpLG8ubW92ZVRvKHAsZiksby5hcmMoMCwwLHUsaCxkKSxoPT09ZyYmZD09PV98fChvLnF1YWRyYXRpY0N1cnZlVG8oMCwwLG0qdGcoZyksbSplZyhnKSksby5hcmMoMCwwLG0sZyxfKSksby5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCxwLGYpLG8uY2xvc2VQYXRoKCksYSlyZXR1cm4gbz1udWxsLGErIiJ8fG51bGx9cmV0dXJuIGEucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bGcoK3QpLGEpOm59LGEuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmxnKCt0KSxhKTppfSxhLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bGcoK3QpLGEpOnJ9LGEuc291cmNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsYSk6dH0sYS50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxhKTplfSxhLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bnVsbD09dD9udWxsOnQsYSk6b30sYX0sbmVzdDpmdW5jdGlvbiBYTigpe3ZhciB0LGUsbixpPVtdLHI9W107ZnVuY3Rpb24gbyhuLHIsYSxzKXtpZihyPj1pLmxlbmd0aClyZXR1cm4gbnVsbCE9dCYmbi5zb3J0KHQpLG51bGwhPWU/ZShuKTpuO2Zvcih2YXIgbCxjLHUsaD0tMSxkPW4ubGVuZ3RoLHA9aVtyKytdLGY9d2coKSxtPWEoKTsrK2g8ZDspKHU9Zi5nZXQobD1wKGM9bltoXSkrIiIpKT91LnB1c2goYyk6Zi5zZXQobCxbY10pO3JldHVybiBmLmVhY2goKGZ1bmN0aW9uKHQsZSl7cyhtLGUsbyh0LHIsYSxzKSl9KSksbX1mdW5jdGlvbiBhKHQsbil7aWYoKytuPmkubGVuZ3RoKXJldHVybiB0O3ZhciBvLHM9cltuLTFdO3JldHVybiBudWxsIT1lJiZuPj1pLmxlbmd0aD9vPXQuZW50cmllcygpOihvPVtdLHQuZWFjaCgoZnVuY3Rpb24odCxlKXtvLnB1c2goe2tleTplLHZhbHVlczphKHQsbil9KX0pKSksbnVsbCE9cz9vLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHModC5rZXksZS5rZXkpfSkpOm99cmV0dXJuIG49e29iamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LDAsU2csTWcpfSxtYXA6ZnVuY3Rpb24odCl7cmV0dXJuIG8odCwwLEVnLFRnKX0sZW50cmllczpmdW5jdGlvbih0KXtyZXR1cm4gYShvKHQsMCxFZyxUZyksMCl9LGtleTpmdW5jdGlvbih0KXtyZXR1cm4gaS5wdXNoKHQpLG59LHNvcnRLZXlzOmZ1bmN0aW9uKHQpe3JldHVybiByW2kubGVuZ3RoLTFdPXQsbn0sc29ydFZhbHVlczpmdW5jdGlvbihlKXtyZXR1cm4gdD1lLG59LHJvbGx1cDpmdW5jdGlvbih0KXtyZXR1cm4gZT10LG59fX0sc2V0OmtnLG1hcDp3ZyxrZXlzOkxnLHZhbHVlczpmdW5jdGlvbiAkTih0KXt2YXIgZT1bXTtmb3IodmFyIG4gaW4gdCllLnB1c2godFtuXSk7cmV0dXJuIGV9LGVudHJpZXM6ZnVuY3Rpb24gS04odCl7dmFyIGU9W107Zm9yKHZhciBuIGluIHQpZS5wdXNoKHtrZXk6bix2YWx1ZTp0W25dfSk7cmV0dXJuIGV9LGNvbG9yOkJoLHJnYjpVaCxoc2w6JGgsbGFiOnNkLGhjbDpmZCxsY2g6ZnVuY3Rpb24gWk4odCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3BkKHQpOm5ldyBtZChuLGUsdCxudWxsPT1pPzE6aSl9LGdyYXk6ZnVuY3Rpb24gSk4odCxlKXtyZXR1cm4gbmV3IGxkKHQsMCwwLG51bGw9PWU/MTplKX0sY3ViZWhlbGl4OnhkLGNvbnRvdXJzOkhnLGNvbnRvdXJEZW5zaXR5OmZ1bmN0aW9uIFFOKCl7dmFyIHQ9VWcsZT1qZyxuPUdnLGk9OTYwLHI9NTAwLG89MjAsYT0yLHM9MypvLGw9aSsyKnM+PmEsYz1yKzIqcz4+YSx1PUlnKDIwKTtmdW5jdGlvbiBoKGkpe3ZhciByPW5ldyBGbG9hdDMyQXJyYXkobCpjKSxoPW5ldyBGbG9hdDMyQXJyYXkobCpjKTtpLmZvckVhY2goKGZ1bmN0aW9uKGksbyx1KXt2YXIgaD0rdChpLG8sdSkrcz4+YSxkPStlKGksbyx1KStzPj5hLHA9K24oaSxvLHUpO2g+PTAmJmg8bCYmZD49MCYmZDxjJiYocltoK2QqbF0rPXApfSkpLEZnKHt3aWR0aDpsLGhlaWdodDpjLGRhdGE6cn0se3dpZHRoOmwsaGVpZ2h0OmMsZGF0YTpofSxvPj5hKSxWZyh7d2lkdGg6bCxoZWlnaHQ6YyxkYXRhOmh9LHt3aWR0aDpsLGhlaWdodDpjLGRhdGE6cn0sbz4+YSksRmcoe3dpZHRoOmwsaGVpZ2h0OmMsZGF0YTpyfSx7d2lkdGg6bCxoZWlnaHQ6YyxkYXRhOmh9LG8+PmEpLFZnKHt3aWR0aDpsLGhlaWdodDpjLGRhdGE6aH0se3dpZHRoOmwsaGVpZ2h0OmMsZGF0YTpyfSxvPj5hKSxGZyh7d2lkdGg6bCxoZWlnaHQ6YyxkYXRhOnJ9LHt3aWR0aDpsLGhlaWdodDpjLGRhdGE6aH0sbz4+YSksVmcoe3dpZHRoOmwsaGVpZ2h0OmMsZGF0YTpofSx7d2lkdGg6bCxoZWlnaHQ6YyxkYXRhOnJ9LG8+PmEpO3ZhciBwPXUocik7aWYoIUFycmF5LmlzQXJyYXkocCkpe3ZhciBmPVdsKHIpO3A9VWwoMCxmLHApLChwPXpsKDAsTWF0aC5mbG9vcihmL3ApKnAscCkpLnNoaWZ0KCl9cmV0dXJuIEhnKCkudGhyZXNob2xkcyhwKS5zaXplKFtsLGNdKShyKS5tYXAoZCl9ZnVuY3Rpb24gZCh0KXtyZXR1cm4gdC52YWx1ZSo9TWF0aC5wb3coMiwtMiphKSx0LmNvb3JkaW5hdGVzLmZvckVhY2gocCksdH1mdW5jdGlvbiBwKHQpe3QuZm9yRWFjaChmKX1mdW5jdGlvbiBmKHQpe3QuZm9yRWFjaChtKX1mdW5jdGlvbiBtKHQpe3RbMF09dFswXSpNYXRoLnBvdygyLGEpLXMsdFsxXT10WzFdKk1hdGgucG93KDIsYSktc31mdW5jdGlvbiBnKCl7cmV0dXJuIGw9aSsyKihzPTMqbyk+PmEsYz1yKzIqcz4+YSxofXJldHVybiBoLng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpJZygrZSksaCk6dH0saC55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SWcoK3QpLGgpOmV9LGgud2VpZ2h0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SWcoK3QpLGgpOm59LGguc2l6ZT1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm5baSxyXTt2YXIgZT1NYXRoLmNlaWwodFswXSksbj1NYXRoLmNlaWwodFsxXSk7aWYoIShlPj0wfHxlPj0wKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgc2l6ZSIpO3JldHVybiBpPWUscj1uLGcoKX0saC5jZWxsU2l6ZT1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gMTw8YTtpZighKCh0PSt0KT49MSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNlbGwgc2l6ZSIpO3JldHVybiBhPU1hdGguZmxvb3IoTWF0aC5sb2codCkvTWF0aC5MTjIpLGcoKX0saC50aHJlc2hvbGRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6QXJyYXkuaXNBcnJheSh0KT9JZyhQZy5jYWxsKHQpKTpJZyh0KSxoKTp1fSxoLmJhbmR3aWR0aD1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gTWF0aC5zcXJ0KG8qKG8rMSkpO2lmKCEoKHQ9K3QpPj0wKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgYmFuZHdpZHRoIik7cmV0dXJuIG89TWF0aC5yb3VuZCgoTWF0aC5zcXJ0KDQqdCp0KzEpLTEpLzIpLGcoKX0saH0sZGlzcGF0Y2g6bGMsZHJhZzp2aCxkcmFnRGlzYWJsZTpoaCxkcmFnRW5hYmxlOmRoLGRzdkZvcm1hdDpLZyxjc3ZQYXJzZTpKZyxjc3ZQYXJzZVJvd3M6UWcsY3N2Rm9ybWF0OnRfLGNzdkZvcm1hdEJvZHk6ZV8sY3N2Rm9ybWF0Um93czpuXyxjc3ZGb3JtYXRSb3c6aV8sY3N2Rm9ybWF0VmFsdWU6cl8sdHN2UGFyc2U6YV8sdHN2UGFyc2VSb3dzOnNfLHRzdkZvcm1hdDpsXyx0c3ZGb3JtYXRCb2R5OmNfLHRzdkZvcm1hdFJvd3M6dV8sdHN2Rm9ybWF0Um93OmhfLHRzdkZvcm1hdFZhbHVlOmRfLGF1dG9UeXBlOmZ1bmN0aW9uIHRJKHQpe2Zvcih2YXIgZSBpbiB0KXt2YXIgbixpLHI9dFtlXS50cmltKCk7aWYocilpZigidHJ1ZSI9PT1yKXI9ITA7ZWxzZSBpZigiZmFsc2UiPT09cilyPSExO2Vsc2UgaWYoIk5hTiI9PT1yKXI9TmFOO2Vsc2UgaWYoaXNOYU4obj0rcikpe2lmKCEoaT1yLm1hdGNoKC9eKFstK11cZHsyfSk/XGR7NH0oLVxkezJ9KC1cZHsyfSk/KT8oVFxkezJ9OlxkezJ9KDpcZHsyfShcLlxkezN9KT8pPyhafFstK11cZHsyfTpcZHsyfSk/KT8kLykpKWNvbnRpbnVlO3BfJiZpWzRdJiYhaVs3XSYmKHI9ci5yZXBsYWNlKC8tL2csIi8iKS5yZXBsYWNlKC9ULywiICIpKSxyPW5ldyBEYXRlKHIpfWVsc2Ugcj1uO2Vsc2Ugcj1udWxsO3RbZV09cn1yZXR1cm4gdH0sZWFzZUxpbmVhcjpiZixlYXNlUXVhZDpTZixlYXNlUXVhZEluOnhmLGVhc2VRdWFkT3V0OndmLGVhc2VRdWFkSW5PdXQ6U2YsZWFzZUN1YmljOlRmLGVhc2VDdWJpY0luOk1mLGVhc2VDdWJpY091dDpFZixlYXNlQ3ViaWNJbk91dDpUZixlYXNlUG9seTpYZixlYXNlUG9seUluOnFmLGVhc2VQb2x5T3V0OllmLGVhc2VQb2x5SW5PdXQ6WGYsZWFzZVNpbjpRZixlYXNlU2luSW46WmYsZWFzZVNpbk91dDpKZixlYXNlU2luSW5PdXQ6UWYsZWFzZUV4cDppbSxlYXNlRXhwSW46ZW0sZWFzZUV4cE91dDpubSxlYXNlRXhwSW5PdXQ6aW0sZWFzZUNpcmNsZTphbSxlYXNlQ2lyY2xlSW46cm0sZWFzZUNpcmNsZU91dDpvbSxlYXNlQ2lyY2xlSW5PdXQ6YW0sZWFzZUJvdW5jZTpjbSxlYXNlQm91bmNlSW46bG0sZWFzZUJvdW5jZU91dDpjbSxlYXNlQm91bmNlSW5PdXQ6dW0sZWFzZUJhY2s6Zm0sZWFzZUJhY2tJbjpkbSxlYXNlQmFja091dDpwbSxlYXNlQmFja0luT3V0OmZtLGVhc2VFbGFzdGljOl9tLGVhc2VFbGFzdGljSW46Z20sZWFzZUVsYXN0aWNPdXQ6X20sZWFzZUVsYXN0aWNJbk91dDp5bSxibG9iOmZ1bmN0aW9uIGVJKHQsZSl7cmV0dXJuIGZldGNoKHQsZSkudGhlbihmXyl9LGJ1ZmZlcjpmdW5jdGlvbiBuSSh0LGUpe3JldHVybiBmZXRjaCh0LGUpLnRoZW4obV8pfSxkc3Y6ZnVuY3Rpb24gaUkodCxlLG4saSl7Mz09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlvbiI9PXR5cGVvZiBuJiYoaT1uLG49dm9pZCAwKTt2YXIgcj1LZyh0KTtyZXR1cm4gX18oZSxuKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gci5wYXJzZSh0LGkpfSkpfSxjc3Y6dl8sdHN2OmJfLGltYWdlOmZ1bmN0aW9uIHJJKHQsZSl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihuLGkpe3ZhciByPW5ldyBJbWFnZTtmb3IodmFyIG8gaW4gZSlyW29dPWVbb107ci5vbmVycm9yPWksci5vbmxvYWQ9ZnVuY3Rpb24oKXtuKHIpfSxyLnNyYz10fSkpfSxqc29uOmZ1bmN0aW9uIG9JKHQsZSl7cmV0dXJuIGZldGNoKHQsZSkudGhlbih4Xyl9LHRleHQ6X18seG1sOlNfLGh0bWw6TV8sc3ZnOkVfLGZvcmNlQ2VudGVyOmZ1bmN0aW9uIGFJKHQsZSl7dmFyIG47ZnVuY3Rpb24gaSgpe3ZhciBpLHIsbz1uLmxlbmd0aCxhPTAscz0wO2ZvcihpPTA7aTxvOysraSlhKz0ocj1uW2ldKS54LHMrPXIueTtmb3IoYT1hL28tdCxzPXMvby1lLGk9MDtpPG87KytpKShyPW5baV0pLngtPWEsci55LT1zfXJldHVybiBudWxsPT10JiYodD0wKSxudWxsPT1lJiYoZT0wKSxpLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10fSxpLng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K2UsaSk6dH0saS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0LGkpOmV9LGl9LGZvcmNlQ29sbGlkZTpmdW5jdGlvbiBzSSh0KXt2YXIgZSxuLGk9MSxyPTE7ZnVuY3Rpb24gbygpe2Zvcih2YXIgdCxvLHMsbCxjLHUsaCxkPWUubGVuZ3RoLHA9MDtwPHI7KytwKWZvcihvPU5fKGUsel8sRF8pLnZpc2l0QWZ0ZXIoYSksdD0wO3Q8ZDsrK3QpaD0odT1uWyhzPWVbdF0pLmluZGV4XSkqdSxsPXMueCtzLnZ4LGM9cy55K3Mudnksby52aXNpdChmKTtmdW5jdGlvbiBmKHQsZSxuLHIsbyl7dmFyIGE9dC5kYXRhLGQ9dC5yLHA9dStkO2lmKCFhKXJldHVybiBlPmwrcHx8cjxsLXB8fG4+YytwfHxvPGMtcDtpZihhLmluZGV4PnMuaW5kZXgpe3ZhciBmPWwtYS54LWEudngsbT1jLWEueS1hLnZ5LGc9ZipmK20qbTtnPHAqcCYmKDA9PT1mJiYoZys9KGY9Q18oKSkqZiksMD09PW0mJihnKz0obT1DXygpKSptKSxnPShwLShnPU1hdGguc3FydChnKSkpL2cqaSxzLnZ4Kz0oZio9ZykqKHA9KGQqPWQpLyhoK2QpKSxzLnZ5Kz0obSo9ZykqcCxhLnZ4LT1mKihwPTEtcCksYS52eS09bSpwKX19fWZ1bmN0aW9uIGEodCl7aWYodC5kYXRhKXJldHVybiB0LnI9blt0LmRhdGEuaW5kZXhdO2Zvcih2YXIgZT10LnI9MDtlPDQ7KytlKXRbZV0mJnRbZV0ucj50LnImJih0LnI9dFtlXS5yKX1mdW5jdGlvbiBzKCl7aWYoZSl7dmFyIGkscixvPWUubGVuZ3RoO2ZvcihuPW5ldyBBcnJheShvKSxpPTA7aTxvOysraSluWyhyPWVbaV0pLmluZGV4XT0rdChyLGksZSl9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1UXyhudWxsPT10PzE6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7ZT10LHMoKX0sby5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0LG8pOnJ9LG8uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3Qsbyk6aX0sby5yYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpUXygrZSkscygpLG8pOnR9LG99LGZvcmNlTGluazpmdW5jdGlvbiBsSSh0KXt2YXIgZSxuLGkscixvLGE9Ql8scz1mdW5jdGlvbiBsKHQpe3JldHVybiAxL01hdGgubWluKHJbdC5zb3VyY2UuaW5kZXhdLHJbdC50YXJnZXQuaW5kZXhdKX0sYz1UXygzMCksdT0xO2Z1bmN0aW9uIGgoaSl7Zm9yKHZhciByPTAsYT10Lmxlbmd0aDtyPHU7KytyKWZvcih2YXIgcyxsLGMsaCxkLHAsZixtPTA7bTxhOysrbSloPShjPShzPXRbbV0pLnRhcmdldCkueCtjLnZ4LShsPXMuc291cmNlKS54LWwudnh8fENfKCksZD1jLnkrYy52eS1sLnktbC52eXx8Q18oKSxkKj1wPSgocD1NYXRoLnNxcnQoaCpoK2QqZCkpLW5bbV0pL3AqaSplW21dLGMudngtPShoKj1wKSooZj1vW21dKSxjLnZ5LT1kKmYsbC52eCs9aCooZj0xLWYpLGwudnkrPWQqZn1mdW5jdGlvbiBkKCl7aWYoaSl7dmFyIHMsbCxjPWkubGVuZ3RoLHU9dC5sZW5ndGgsaD13ZyhpLGEpO2ZvcihzPTAscj1uZXcgQXJyYXkoYyk7czx1OysrcykobD10W3NdKS5pbmRleD1zLCJvYmplY3QiIT10eXBlb2YgbC5zb3VyY2UmJihsLnNvdXJjZT1IXyhoLGwuc291cmNlKSksIm9iamVjdCIhPXR5cGVvZiBsLnRhcmdldCYmKGwudGFyZ2V0PUhfKGgsbC50YXJnZXQpKSxyW2wuc291cmNlLmluZGV4XT0ocltsLnNvdXJjZS5pbmRleF18fDApKzEscltsLnRhcmdldC5pbmRleF09KHJbbC50YXJnZXQuaW5kZXhdfHwwKSsxO2ZvcihzPTAsbz1uZXcgQXJyYXkodSk7czx1OysrcylvW3NdPXJbKGw9dFtzXSkuc291cmNlLmluZGV4XS8ocltsLnNvdXJjZS5pbmRleF0rcltsLnRhcmdldC5pbmRleF0pO2U9bmV3IEFycmF5KHUpLHAoKSxuPW5ldyBBcnJheSh1KSxmKCl9fWZ1bmN0aW9uIHAoKXtpZihpKWZvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyOysrbillW25dPStzKHRbbl0sbix0KX1mdW5jdGlvbiBmKCl7aWYoaSlmb3IodmFyIGU9MCxyPXQubGVuZ3RoO2U8cjsrK2UpbltlXT0rYyh0W2VdLGUsdCl9cmV0dXJuIG51bGw9PXQmJih0PVtdKSxoLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7aT10LGQoKX0saC5saW5rcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLGQoKSxoKTp0fSxoLmlkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQsaCk6YX0saC5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LGgpOnV9LGguc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpUXygrdCkscCgpLGgpOnN9LGguZGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpUXygrdCksZigpLGgpOmN9LGh9LGZvcmNlTWFueUJvZHk6ZnVuY3Rpb24gY0koKXt2YXIgdCxlLG4saSxyPVRfKC0zMCksbz0xLGE9MS8wLHM9LjgxO2Z1bmN0aW9uIGwoaSl7dmFyIHIsbz10Lmxlbmd0aCxhPU5fKHQsRl8sVl8pLnZpc2l0QWZ0ZXIodSk7Zm9yKG49aSxyPTA7cjxvOysrcillPXRbcl0sYS52aXNpdChoKX1mdW5jdGlvbiBjKCl7aWYodCl7dmFyIGUsbixvPXQubGVuZ3RoO2ZvcihpPW5ldyBBcnJheShvKSxlPTA7ZTxvOysrZSlpWyhuPXRbZV0pLmluZGV4XT0rcihuLGUsdCl9fWZ1bmN0aW9uIHUodCl7dmFyIGUsbixyLG8sYSxzPTAsbD0wO2lmKHQubGVuZ3RoKXtmb3Iocj1vPWE9MDthPDQ7KythKShlPXRbYV0pJiYobj1NYXRoLmFicyhlLnZhbHVlKSkmJihzKz1lLnZhbHVlLGwrPW4scis9biplLngsbys9biplLnkpO3QueD1yL2wsdC55PW8vbH1lbHNleyhlPXQpLng9ZS5kYXRhLngsZS55PWUuZGF0YS55O2Rve3MrPWlbZS5kYXRhLmluZGV4XX13aGlsZShlPWUubmV4dCl9dC52YWx1ZT1zfWZ1bmN0aW9uIGgodCxyLGwsYyl7aWYoIXQudmFsdWUpcmV0dXJuITA7dmFyIHU9dC54LWUueCxoPXQueS1lLnksZD1jLXIscD11KnUraCpoO2lmKGQqZC9zPHApcmV0dXJuIHA8YSYmKDA9PT11JiYocCs9KHU9Q18oKSkqdSksMD09PWgmJihwKz0oaD1DXygpKSpoKSxwPG8mJihwPU1hdGguc3FydChvKnApKSxlLnZ4Kz11KnQudmFsdWUqbi9wLGUudnkrPWgqdC52YWx1ZSpuL3ApLCEwO2lmKCEodC5sZW5ndGh8fHA+PWEpKXsodC5kYXRhIT09ZXx8dC5uZXh0KSYmKDA9PT11JiYocCs9KHU9Q18oKSkqdSksMD09PWgmJihwKz0oaD1DXygpKSpoKSxwPG8mJihwPU1hdGguc3FydChvKnApKSk7ZG97dC5kYXRhIT09ZSYmKGUudngrPXUqKGQ9aVt0LmRhdGEuaW5kZXhdKm4vcCksZS52eSs9aCpkKX13aGlsZSh0PXQubmV4dCl9fXJldHVybiBsLmluaXRpYWxpemU9ZnVuY3Rpb24oZSl7dD1lLGMoKX0sbC5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlRfKCt0KSxjKCksbCk6cn0sbC5kaXN0YW5jZU1pbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz10KnQsbCk6TWF0aC5zcXJ0KG8pfSxsLmRpc3RhbmNlTWF4PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQqdCxsKTpNYXRoLnNxcnQoYSl9LGwudGhldGE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9dCp0LGwpOk1hdGguc3FydChzKX0sbH0sZm9yY2VSYWRpYWw6ZnVuY3Rpb24gdUkodCxlLG4pe3ZhciBpLHIsbyxhPVRfKC4xKTtmdW5jdGlvbiBzKHQpe2Zvcih2YXIgYT0wLHM9aS5sZW5ndGg7YTxzOysrYSl7dmFyIGw9aVthXSxjPWwueC1lfHwxZS02LHU9bC55LW58fDFlLTYsaD1NYXRoLnNxcnQoYypjK3UqdSksZD0ob1thXS1oKSpyW2FdKnQvaDtsLnZ4Kz1jKmQsbC52eSs9dSpkfX1mdW5jdGlvbiBsKCl7aWYoaSl7dmFyIGUsbj1pLmxlbmd0aDtmb3Iocj1uZXcgQXJyYXkobiksbz1uZXcgQXJyYXkobiksZT0wO2U8bjsrK2Upb1tlXT0rdChpW2VdLGUsaSkscltlXT1pc05hTihvW2VdKT8wOithKGlbZV0sZSxpKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVRfKCt0KSksbnVsbD09ZSYmKGU9MCksbnVsbD09biYmKG49MCkscy5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2k9dCxsKCl9LHMuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpUXygrdCksbCgpLHMpOmF9LHMucmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6VF8oK2UpLGwoKSxzKTp0fSxzLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3Qscyk6ZX0scy55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0LHMpOm59LHN9LGZvcmNlU2ltdWxhdGlvbjpmdW5jdGlvbiBoSSh0KXt2YXIgZSxuPTEsaT0uMDAxLHI9MS1NYXRoLnBvdyhpLDEvMzAwKSxvPTAsYT0uNixzPXdnKCksbD1rcCh1KSxjPWxjKCJ0aWNrIiwiZW5kIik7ZnVuY3Rpb24gdSgpe2goKSxjLmNhbGwoInRpY2siLGUpLG48aSYmKGwuc3RvcCgpLGMuY2FsbCgiZW5kIixlKSl9ZnVuY3Rpb24gaChpKXt2YXIgbCxjLHU9dC5sZW5ndGg7dm9pZCAwPT09aSYmKGk9MSk7Zm9yKHZhciBoPTA7aDxpOysraClmb3Iobis9KG8tbikqcixzLmVhY2goKGZ1bmN0aW9uKHQpe3Qobil9KSksbD0wO2w8dTsrK2wpbnVsbD09KGM9dFtsXSkuZng/Yy54Kz1jLnZ4Kj1hOihjLng9Yy5meCxjLnZ4PTApLG51bGw9PWMuZnk/Yy55Kz1jLnZ5Kj1hOihjLnk9Yy5meSxjLnZ5PTApO3JldHVybiBlfWZ1bmN0aW9uIGQoKXtmb3IodmFyIGUsbj0wLGk9dC5sZW5ndGg7bjxpOysrbil7aWYoKGU9dFtuXSkuaW5kZXg9bixudWxsIT1lLmZ4JiYoZS54PWUuZngpLG51bGwhPWUuZnkmJihlLnk9ZS5meSksaXNOYU4oZS54KXx8aXNOYU4oZS55KSl7dmFyIHI9MTAqTWF0aC5zcXJ0KG4pLG89bipueTtlLng9cipNYXRoLmNvcyhvKSxlLnk9cipNYXRoLnNpbihvKX0oaXNOYU4oZS52eCl8fGlzTmFOKGUudnkpKSYmKGUudng9ZS52eT0wKX19ZnVuY3Rpb24gcChlKXtyZXR1cm4gZS5pbml0aWFsaXplJiZlLmluaXRpYWxpemUodCksZX1yZXR1cm4gbnVsbD09dCYmKHQ9W10pLGQoKSxlPXt0aWNrOmgscmVzdGFydDpmdW5jdGlvbigpe3JldHVybiBsLnJlc3RhcnQodSksZX0sc3RvcDpmdW5jdGlvbigpe3JldHVybiBsLnN0b3AoKSxlfSxub2RlczpmdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGQoKSxzLmVhY2gocCksZSk6dH0sYWxwaGE6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3QsZSk6bn0sYWxwaGFNaW46ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3QsZSk6aX0sYWxwaGFEZWNheTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxlKTorcn0sYWxwaGFUYXJnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3QsZSk6b30sdmVsb2NpdHlEZWNheTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0xLXQsZSk6MS1hfSxmb3JjZTpmdW5jdGlvbih0LG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/KG51bGw9PW4/cy5yZW1vdmUodCk6cy5zZXQodCxwKG4pKSxlKTpzLmdldCh0KX0sZmluZDpmdW5jdGlvbihlLG4saSl7dmFyIHIsbyxhLHMsbCxjPTAsdT10Lmxlbmd0aDtmb3IobnVsbD09aT9pPTEvMDppKj1pLGM9MDtjPHU7KytjKShhPShyPWUtKHM9dFtjXSkueCkqcisobz1uLXMueSkqbyk8aSYmKGw9cyxpPWEpO3JldHVybiBsfSxvbjpmdW5jdGlvbih0LG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/KGMub24odCxuKSxlKTpjLm9uKHQpfX19LGZvcmNlWDpmdW5jdGlvbiBkSSh0KXt2YXIgZSxuLGkscj1UXyguMSk7ZnVuY3Rpb24gbyh0KXtmb3IodmFyIHIsbz0wLGE9ZS5sZW5ndGg7bzxhOysrbykocj1lW29dKS52eCs9KGlbb10tci54KSpuW29dKnR9ZnVuY3Rpb24gYSgpe2lmKGUpe3ZhciBvLGE9ZS5sZW5ndGg7Zm9yKG49bmV3IEFycmF5KGEpLGk9bmV3IEFycmF5KGEpLG89MDtvPGE7KytvKW5bb109aXNOYU4oaVtvXT0rdChlW29dLG8sZSkpPzA6K3IoZVtvXSxvLGUpfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9VF8obnVsbD09dD8wOit0KSksby5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2U9dCxhKCl9LG8uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpUXygrdCksYSgpLG8pOnJ9LG8ueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOlRfKCtlKSxhKCksbyk6dH0sb30sZm9yY2VZOmZ1bmN0aW9uIHBJKHQpe3ZhciBlLG4saSxyPVRfKC4xKTtmdW5jdGlvbiBvKHQpe2Zvcih2YXIgcixvPTAsYT1lLmxlbmd0aDtvPGE7KytvKShyPWVbb10pLnZ5Kz0oaVtvXS1yLnkpKm5bb10qdH1mdW5jdGlvbiBhKCl7aWYoZSl7dmFyIG8sYT1lLmxlbmd0aDtmb3Iobj1uZXcgQXJyYXkoYSksaT1uZXcgQXJyYXkoYSksbz0wO288YTsrK28pbltvXT1pc05hTihpW29dPSt0KGVbb10sbyxlKSk/MDorcihlW29dLG8sZSl9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1UXyhudWxsPT10PzA6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7ZT10LGEoKX0sby5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlRfKCt0KSxhKCksbyk6cn0sby55PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6VF8oK2UpLGEoKSxvKTp0fSxvfSxmb3JtYXREZWZhdWx0TG9jYWxlOmJ5LGdldCBmb3JtYXQoKXtyZXR1cm4gbXl9LGdldCBmb3JtYXRQcmVmaXgoKXtyZXR1cm4gZ3l9LGZvcm1hdExvY2FsZTp2eSxmb3JtYXRTcGVjaWZpZXI6c3ksRm9ybWF0U3BlY2lmaWVyOmx5LHByZWNpc2lvbkZpeGVkOnh5LHByZWNpc2lvblByZWZpeDp3eSxwcmVjaXNpb25Sb3VuZDpTeSxnZW9BcmVhOmZ1bmN0aW9uIGZJKHQpe3JldHVybiB1di5yZXNldCgpLGl2KHQsaHYpLDIqdXZ9LGdlb0JvdW5kczpmdW5jdGlvbiBtSSh0KXt2YXIgZSxuLGkscixvLGEscztpZihUdj1Fdj0tKFN2PU12PTEvMCksUHY9W10saXYodCxLdiksbj1Qdi5sZW5ndGgpe2ZvcihQdi5zb3J0KG9iKSxlPTEsbz1baT1QdlswXV07ZTxuOysrZSlhYihpLChyPVB2W2VdKVswXSl8fGFiKGksclsxXSk/KHJiKGlbMF0sclsxXSk+cmIoaVswXSxpWzFdKSYmKGlbMV09clsxXSkscmIoclswXSxpWzFdKT5yYihpWzBdLGlbMV0pJiYoaVswXT1yWzBdKSk6by5wdXNoKGk9cik7Zm9yKGE9LTEvMCxlPTAsaT1vW249by5sZW5ndGgtMV07ZTw9bjtpPXIsKytlKShzPXJiKGlbMV0sKHI9b1tlXSlbMF0pKT5hJiYoYT1zLFN2PXJbMF0sRXY9aVsxXSl9cmV0dXJuIFB2PU52PW51bGwsU3Y9PT0xLzB8fE12PT09MS8wP1tbTmFOLE5hTl0sW05hTixOYU5dXTpbW1N2LE12XSxbRXYsVHZdXX0sZ2VvQ2VudHJvaWQ6ZnVuY3Rpb24gZ0kodCl7SXY9UnY9T3Y9enY9RHY9QnY9SHY9RnY9VnY9VXY9anY9MCxpdih0LHNiKTt2YXIgZT1WdixuPVV2LGk9anYscj1lKmUrbipuK2kqaTtyZXR1cm4gcjxreSYmKGU9QnYsbj1IdixpPUZ2LFJ2PEF5JiYoZT1PdixuPXp2LGk9RHYpLChyPWUqZStuKm4raSppKTxreSk/W05hTixOYU5dOltCeShuLGUpKlJ5LCR5KGkvcXkocikpKlJ5XX0sZ2VvQ2lyY2xlOmZ1bmN0aW9uIF9JKCl7dmFyIHQsZSxuPXliKFswLDBdKSxpPXliKDkwKSxyPXliKDYpLG89e3BvaW50OmZ1bmN0aW9uIGEobixpKXt0LnB1c2gobj1lKG4saSkpLG5bMF0qPVJ5LG5bMV0qPVJ5fX07ZnVuY3Rpb24gcygpe3ZhciBhPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHM9aS5hcHBseSh0aGlzLGFyZ3VtZW50cykqT3ksbD1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSpPeTtyZXR1cm4gdD1bXSxlPXhiKC1hWzBdKk95LC1hWzFdKk95LDApLmludmVydCxUYihvLHMsbCwxKSxhPXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbdF19LHQ9ZT1udWxsLGF9cmV0dXJuIHMuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eWIoWyt0WzBdLCt0WzFdXSkscyk6bn0scy5yYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5YigrdCkscyk6aX0scy5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5YigrdCkscyk6cn0sc30sZ2VvQ2xpcEFudGltZXJpZGlhbjpIYixnZW9DbGlwQ2lyY2xlOlViLGdlb0NsaXBFeHRlbnQ6ZnVuY3Rpb24geUkoKXt2YXIgdCxlLG4saT0wLHI9MCxvPTk2MCxhPTUwMDtyZXR1cm4gbj17c3RyZWFtOmZ1bmN0aW9uKG4pe3JldHVybiB0JiZlPT09bj90OnQ9V2IoaSxyLG8sYSkoZT1uKX0sZXh0ZW50OmZ1bmN0aW9uKHMpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPStzWzBdWzBdLHI9K3NbMF1bMV0sbz0rc1sxXVswXSxhPStzWzFdWzFdLHQ9ZT1udWxsLG4pOltbaSxyXSxbbyxhXV19fX0sZ2VvQ2xpcFJlY3RhbmdsZTpXYixnZW9Db250YWluczpmdW5jdGlvbiB2SSh0LGUpe3JldHVybih0JiZveC5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpP294W3QudHlwZV06c3gpKHQsZSl9LGdlb0Rpc3RhbmNlOnJ4LGdlb0dyYXRpY3VsZTpteCxnZW9HcmF0aWN1bGUxMDpmdW5jdGlvbiBiSSgpe3JldHVybiBteCgpKCl9LGdlb0ludGVycG9sYXRlOmZ1bmN0aW9uIHhJKHQsZSl7dmFyIG49dFswXSpPeSxpPXRbMV0qT3kscj1lWzBdKk95LG89ZVsxXSpPeSxhPUh5KGkpLHM9R3koaSksbD1IeShvKSxjPUd5KG8pLHU9YSpIeShuKSxoPWEqR3kobiksZD1sKkh5KHIpLHA9bCpHeShyKSxmPTIqJHkocXkoS3koby1pKSthKmwqS3koci1uKSkpLG09R3koZiksZz1mP2Z1bmN0aW9uKHQpe3ZhciBlPUd5KHQqPWYpL20sbj1HeShmLXQpL20saT1uKnUrZSpkLHI9bipoK2UqcCxvPW4qcytlKmM7cmV0dXJuW0J5KHIsaSkqUnksQnkobyxxeShpKmkrcipyKSkqUnldfTpmdW5jdGlvbigpe3JldHVybltuKlJ5LGkqUnldfTtyZXR1cm4gZy5kaXN0YW5jZT1mLGd9LGdlb0xlbmd0aDpleCxnZW9QYXRoOmZ1bmN0aW9uIHdJKHQsZSl7dmFyIG4saSxyPTQuNTtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHImJmkucG9pbnRSYWRpdXMoK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxpdih0LG4oaSkpKSxpLnJlc3VsdCgpfXJldHVybiBvLmFyZWE9ZnVuY3Rpb24odCl7cmV0dXJuIGl2KHQsbihOeCkpLE54LnJlc3VsdCgpfSxvLm1lYXN1cmU9ZnVuY3Rpb24odCl7cmV0dXJuIGl2KHQsbihtdykpLG13LnJlc3VsdCgpfSxvLmJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gaXYodCxuKER4KSksRHgucmVzdWx0KCl9LG8uY2VudHJvaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGl2KHQsbihydykpLHJ3LnJlc3VsdCgpfSxvLnByb2plY3Rpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09ZT8odD1udWxsLGd4KToodD1lKS5zdHJlYW0sbyk6dH0sby5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/KGU9bnVsbCxuZXcgZ3cpOm5ldyBvdyhlPXQpLCJmdW5jdGlvbiIhPXR5cGVvZiByJiZpLnBvaW50UmFkaXVzKHIpLG8pOmV9LG8ucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooaS5wb2ludFJhZGl1cygrdCksK3QpLG8pOnJ9LG8ucHJvamVjdGlvbih0KS5jb250ZXh0KGUpfSxnZW9BbGJlcnM6T3csZ2VvQWxiZXJzVXNhOmZ1bmN0aW9uIFNJKCl7dmFyIHQsZSxuLGkscixvLGE9T3coKSxzPVJ3KCkucm90YXRlKFsxNTQsMF0pLmNlbnRlcihbLTIsNTguNV0pLnBhcmFsbGVscyhbNTUsNjVdKSxsPVJ3KCkucm90YXRlKFsxNTcsMF0pLmNlbnRlcihbLTMsMTkuOV0pLnBhcmFsbGVscyhbOCwxOF0pLGM9e3BvaW50OmZ1bmN0aW9uKHQsZSl7bz1bdCxlXX19O2Z1bmN0aW9uIHUodCl7dmFyIGU9dFswXSxhPXRbMV07cmV0dXJuIG89bnVsbCxuLnBvaW50KGUsYSksb3x8KGkucG9pbnQoZSxhKSxvKXx8KHIucG9pbnQoZSxhKSxvKX1mdW5jdGlvbiBoKCl7cmV0dXJuIHQ9ZT1udWxsLHV9cmV0dXJuIHUuaW52ZXJ0PWZ1bmN0aW9uKHQpe3ZhciBlPWEuc2NhbGUoKSxuPWEudHJhbnNsYXRlKCksaT0odFswXS1uWzBdKS9lLHI9KHRbMV0tblsxXSkvZTtyZXR1cm4ocj49LjEyJiZyPC4yMzQmJmk+PS0uNDI1JiZpPC0uMjE0P3M6cj49LjE2NiYmcjwuMjM0JiZpPj0tLjIxNCYmaTwtLjExNT9sOmEpLmludmVydCh0KX0sdS5zdHJlYW09ZnVuY3Rpb24obil7cmV0dXJuIHQmJmU9PT1uP3Q6dD0oZnVuY3Rpb24gaSh0KXt2YXIgZT10Lmxlbmd0aDtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24obixpKXtmb3IodmFyIHI9LTE7KytyPGU7KXRbcl0ucG9pbnQobixpKX0sc3BoZXJlOmZ1bmN0aW9uKCl7Zm9yKHZhciBuPS0xOysrbjxlOyl0W25dLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtmb3IodmFyIG49LTE7KytuPGU7KXRbbl0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtmb3IodmFyIG49LTE7KytuPGU7KXRbbl0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtmb3IodmFyIG49LTE7KytuPGU7KXRbbl0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtmb3IodmFyIG49LTE7KytuPGU7KXRbbl0ucG9seWdvbkVuZCgpfX19KShbYS5zdHJlYW0oZT1uKSxzLnN0cmVhbShuKSxsLnN0cmVhbShuKV0pfSx1LnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYS5wcmVjaXNpb24odCkscy5wcmVjaXNpb24odCksbC5wcmVjaXNpb24odCksaCgpKTphLnByZWNpc2lvbigpfSx1LnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhLnNjYWxlKHQpLHMuc2NhbGUoLjM1KnQpLGwuc2NhbGUodCksdS50cmFuc2xhdGUoYS50cmFuc2xhdGUoKSkpOmEuc2NhbGUoKX0sdS50cmFuc2xhdGU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGEudHJhbnNsYXRlKCk7dmFyIGU9YS5zY2FsZSgpLG89K3RbMF0sdT0rdFsxXTtyZXR1cm4gbj1hLnRyYW5zbGF0ZSh0KS5jbGlwRXh0ZW50KFtbby0uNDU1KmUsdS0uMjM4KmVdLFtvKy40NTUqZSx1Ky4yMzgqZV1dKS5zdHJlYW0oYyksaT1zLnRyYW5zbGF0ZShbby0uMzA3KmUsdSsuMjAxKmVdKS5jbGlwRXh0ZW50KFtbby0uNDI1KmUrQXksdSsuMTIqZStBeV0sW28tLjIxNCplLUF5LHUrLjIzNCplLUF5XV0pLnN0cmVhbShjKSxyPWwudHJhbnNsYXRlKFtvLS4yMDUqZSx1Ky4yMTIqZV0pLmNsaXBFeHRlbnQoW1tvLS4yMTQqZStBeSx1Ky4xNjYqZStBeV0sW28tLjExNSplLUF5LHUrLjIzNCplLUF5XV0pLnN0cmVhbShjKSxoKCl9LHUuZml0RXh0ZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHh3KHUsdCxlKX0sdS5maXRTaXplPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHd3KHUsdCxlKX0sdS5maXRXaWR0aD1mdW5jdGlvbih0LGUpe3JldHVybiBTdyh1LHQsZSl9LHUuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE13KHUsdCxlKX0sdS5zY2FsZSgxMDcwKX0sZ2VvQXppbXV0aGFsRXF1YWxBcmVhOmZ1bmN0aW9uIE1JKCl7cmV0dXJuIEx3KEJ3KS5zY2FsZSgxMjQuNzUpLmNsaXBBbmdsZSgxNzkuOTk5KX0sZ2VvQXppbXV0aGFsRXF1YWxBcmVhUmF3OkJ3LGdlb0F6aW11dGhhbEVxdWlkaXN0YW50OmZ1bmN0aW9uIEVJKCl7cmV0dXJuIEx3KEh3KS5zY2FsZSg3OS40MTg4KS5jbGlwQW5nbGUoMTc5Ljk5OSl9LGdlb0F6aW11dGhhbEVxdWlkaXN0YW50UmF3Okh3LGdlb0NvbmljQ29uZm9ybWFsOmZ1bmN0aW9uIFRJKCl7cmV0dXJuIE53KGp3KS5zY2FsZSgxMDkuNSkucGFyYWxsZWxzKFszMCwzMF0pfSxnZW9Db25pY0NvbmZvcm1hbFJhdzpqdyxnZW9Db25pY0VxdWFsQXJlYTpSdyxnZW9Db25pY0VxdWFsQXJlYVJhdzpJdyxnZW9Db25pY0VxdWlkaXN0YW50OmZ1bmN0aW9uIENJKCl7cmV0dXJuIE53KFd3KS5zY2FsZSgxMzEuMTU0KS5jZW50ZXIoWzAsMTMuOTM4OV0pfSxnZW9Db25pY0VxdWlkaXN0YW50UmF3Old3LGdlb0VxdWFsRWFydGg6ZnVuY3Rpb24gQUkoKXtyZXR1cm4gTHcoWncpLnNjYWxlKDE3Ny4xNTgpfSxnZW9FcXVhbEVhcnRoUmF3Olp3LGdlb0VxdWlyZWN0YW5ndWxhcjpmdW5jdGlvbiBrSSgpe3JldHVybiBMdyhHdykuc2NhbGUoMTUyLjYzKX0sZ2VvRXF1aXJlY3Rhbmd1bGFyUmF3Okd3LGdlb0dub21vbmljOmZ1bmN0aW9uIExJKCl7cmV0dXJuIEx3KEp3KS5zY2FsZSgxNDQuMDQ5KS5jbGlwQW5nbGUoNjApfSxnZW9Hbm9tb25pY1JhdzpKdyxnZW9JZGVudGl0eTpmdW5jdGlvbiBQSSgpe3ZhciB0LGUsbixpLHIsbyxhLHM9MSxsPTAsYz0wLHU9MSxoPTEsZD0wLHA9bnVsbCxmPTEsbT0xLGc9eXcoe3BvaW50OmZ1bmN0aW9uKHQsZSl7dmFyIG49dihbdCxlXSk7dGhpcy5zdHJlYW0ucG9pbnQoblswXSxuWzFdKX19KSxfPWd4O2Z1bmN0aW9uIHkoKXtyZXR1cm4gZj1zKnUsbT1zKmgsbz1hPW51bGwsdn1mdW5jdGlvbiB2KG4pe3ZhciBpPW5bMF0qZixyPW5bMV0qbTtpZihkKXt2YXIgbz1yKnQtaSplO2k9aSp0K3IqZSxyPW99cmV0dXJuW2krbCxyK2NdfXJldHVybiB2LmludmVydD1mdW5jdGlvbihuKXt2YXIgaT1uWzBdLWwscj1uWzFdLWM7aWYoZCl7dmFyIG89cip0K2kqZTtpPWkqdC1yKmUscj1vfXJldHVybltpL2Ysci9tXX0sdi5zdHJlYW09ZnVuY3Rpb24odCl7cmV0dXJuIG8mJmE9PT10P286bz1nKF8oYT10KSl9LHYucG9zdGNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KF89dCxwPW49aT1yPW51bGwseSgpKTpffSx2LmNsaXBFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KF89bnVsbD09dD8ocD1uPWk9cj1udWxsLGd4KTpXYihwPSt0WzBdWzBdLG49K3RbMF1bMV0saT0rdFsxXVswXSxyPSt0WzFdWzFdKSx5KCkpOm51bGw9PXA/bnVsbDpbW3Asbl0sW2kscl1dfSx2LnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0LHkoKSk6c30sdi50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9K3RbMF0sYz0rdFsxXSx5KCkpOltsLGNdfSx2LmFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPUd5KGQ9biUzNjAqT3kpLHQ9SHkoZCkseSgpKTpkKlJ5fSx2LnJlZmxlY3RYPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQ/LTE6MSx5KCkpOnU8MH0sdi5yZWZsZWN0WT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD10Py0xOjEseSgpKTpoPDB9LHYuZml0RXh0ZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHh3KHYsdCxlKX0sdi5maXRTaXplPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHd3KHYsdCxlKX0sdi5maXRXaWR0aD1mdW5jdGlvbih0LGUpe3JldHVybiBTdyh2LHQsZSl9LHYuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE13KHYsdCxlKX0sdn0sZ2VvUHJvamVjdGlvbjpMdyxnZW9Qcm9qZWN0aW9uTXV0YXRvcjpQdyxnZW9NZXJjYXRvcjpmdW5jdGlvbiBOSSgpe3JldHVybiBWdyhGdykuc2NhbGUoOTYxL0l5KX0sZ2VvTWVyY2F0b3JSYXc6RncsZ2VvTmF0dXJhbEVhcnRoMTpmdW5jdGlvbiBJSSgpe3JldHVybiBMdyhRdykuc2NhbGUoMTc1LjI5NSl9LGdlb05hdHVyYWxFYXJ0aDFSYXc6UXcsZ2VvT3J0aG9ncmFwaGljOmZ1bmN0aW9uIFJJKCl7cmV0dXJuIEx3KHRTKS5zY2FsZSgyNDkuNSkuY2xpcEFuZ2xlKDkwLjAwMDAwMSl9LGdlb09ydGhvZ3JhcGhpY1Jhdzp0UyxnZW9TdGVyZW9ncmFwaGljOmZ1bmN0aW9uIE9JKCl7cmV0dXJuIEx3KGVTKS5zY2FsZSgyNTApLmNsaXBBbmdsZSgxNDIpfSxnZW9TdGVyZW9ncmFwaGljUmF3OmVTLGdlb1RyYW5zdmVyc2VNZXJjYXRvcjpmdW5jdGlvbiB6SSgpe3ZhciB0PVZ3KG5TKSxlPXQuY2VudGVyLG49dC5yb3RhdGU7cmV0dXJuIHQuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoWy10WzFdLHRbMF1dKTpbKHQ9ZSgpKVsxXSwtdFswXV19LHQucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oW3RbMF0sdFsxXSx0Lmxlbmd0aD4yP3RbMl0rOTA6OTBdKTpbKHQ9bigpKVswXSx0WzFdLHRbMl0tOTBdfSxuKFswLDAsOTBdKS5zY2FsZSgxNTkuMTU1KX0sZ2VvVHJhbnN2ZXJzZU1lcmNhdG9yUmF3Om5TLGdlb1JvdGF0aW9uOkViLGdlb1N0cmVhbTppdixnZW9UcmFuc2Zvcm06ZnVuY3Rpb24gREkodCl7cmV0dXJue3N0cmVhbTp5dyh0KX19LGNsdXN0ZXI6ZnVuY3Rpb24gQkkoKXt2YXIgdD1pUyxlPTEsbj0xLGk9ITE7ZnVuY3Rpb24gcihyKXt2YXIgbyxhPTA7ci5lYWNoQWZ0ZXIoKGZ1bmN0aW9uKGUpe3ZhciBuPWUuY2hpbGRyZW47bj8oZS54PShmdW5jdGlvbiBpKHQpe3JldHVybiB0LnJlZHVjZShyUywwKS90Lmxlbmd0aH0pKG4pLGUueT0oZnVuY3Rpb24gcih0KXtyZXR1cm4gMSt0LnJlZHVjZShvUywwKX0pKG4pKTooZS54PW8/YSs9dChlLG8pOjAsZS55PTAsbz1lKX0pKTt2YXIgcz0oZnVuY3Rpb24gbCh0KXtmb3IodmFyIGU7ZT10LmNoaWxkcmVuOyl0PWVbMF07cmV0dXJuIHR9KShyKSxjPShmdW5jdGlvbiB1KHQpe2Zvcih2YXIgZTtlPXQuY2hpbGRyZW47KXQ9ZVtlLmxlbmd0aC0xXTtyZXR1cm4gdH0pKHIpLGg9cy54LXQocyxjKS8yLGQ9Yy54K3QoYyxzKS8yO3JldHVybiByLmVhY2hBZnRlcihpP2Z1bmN0aW9uKHQpe3QueD0odC54LXIueCkqZSx0Lnk9KHIueS10LnkpKm59OmZ1bmN0aW9uKHQpe3QueD0odC54LWgpLyhkLWgpKmUsdC55PSgxLShyLnk/dC55L3IueToxKSkqbn0pfXJldHVybiByLnNlcGFyYXRpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxyKTp0fSxyLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ITEsZT0rdFswXSxuPSt0WzFdLHIpOmk/bnVsbDpbZSxuXX0sci5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0hMCxlPSt0WzBdLG49K3RbMV0scik6aT9bZSxuXTpudWxsfSxyfSxoaWVyYXJjaHk6c1MscGFjazpmdW5jdGlvbiBISSgpe3ZhciB0PW51bGwsZT0xLG49MSxpPUZTO2Z1bmN0aW9uIHIocil7cmV0dXJuIHIueD1lLzIsci55PW4vMix0P3IuZWFjaEJlZm9yZShqUyh0KSkuZWFjaEFmdGVyKEdTKGksLjUpKS5lYWNoQmVmb3JlKFdTKDEpKTpyLmVhY2hCZWZvcmUoalMoVVMpKS5lYWNoQWZ0ZXIoR1MoRlMsMSkpLmVhY2hBZnRlcihHUyhpLHIuci9NYXRoLm1pbihlLG4pKSkuZWFjaEJlZm9yZShXUyhNYXRoLm1pbihlLG4pLygyKnIucikpKSxyfXJldHVybiByLnJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1CUyhlKSxyKTp0fSxyLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3RbMF0sbj0rdFsxXSxyKTpbZSxuXX0sci5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VlMoK3QpLHIpOml9LHJ9LHBhY2tTaWJsaW5nczpmdW5jdGlvbiBGSSh0KXtyZXR1cm4gRFModCksdH0scGFja0VuY2xvc2U6RVMscGFydGl0aW9uOmZ1bmN0aW9uIFZJKCl7dmFyIHQ9MSxlPTEsbj0wLGk9ITE7ZnVuY3Rpb24gcihyKXt2YXIgbz1yLmhlaWdodCsxO3JldHVybiByLngwPXIueTA9bixyLngxPXQsci55MT1lL28sci5lYWNoQmVmb3JlKChmdW5jdGlvbiBhKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKGkpe2kuY2hpbGRyZW4mJllTKGksaS54MCx0KihpLmRlcHRoKzEpL2UsaS54MSx0KihpLmRlcHRoKzIpL2UpO3ZhciByPWkueDAsbz1pLnkwLGE9aS54MS1uLHM9aS55MS1uO2E8ciYmKHI9YT0ocithKS8yKSxzPG8mJihvPXM9KG8rcykvMiksaS54MD1yLGkueTA9byxpLngxPWEsaS55MT1zfX0pKGUsbykpLGkmJnIuZWFjaEJlZm9yZShxUykscn1yZXR1cm4gci5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0hIXQscik6aX0sci5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStuWzBdLGU9K25bMV0scik6W3QsZV19LHIucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdCxyKTpufSxyfSxzdHJhdGlmeTpmdW5jdGlvbiBVSSgpe3ZhciB0PUtTLGU9WlM7ZnVuY3Rpb24gbihuKXt2YXIgaSxyLG8sYSxzLGwsYyx1PW4ubGVuZ3RoLGg9bmV3IEFycmF5KHUpLGQ9e307Zm9yKHI9MDtyPHU7KytyKXM9aFtyXT1uZXcgaFMoaT1uW3JdKSxudWxsIT0obD10KGkscixuKSkmJihsKz0iIikmJihkW2M9IiQiKyhzLmlkPWwpXT1jIGluIGQ/JFM6cyk7Zm9yKHI9MDtyPHU7KytyKWlmKHM9aFtyXSxudWxsIT0obD1lKG5bcl0scixuKSkmJihsKz0iIikpe2lmKCEoYT1kWyIkIitsXSkpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nOiAiK2wpO2lmKGE9PT0kUyl0aHJvdyBuZXcgRXJyb3IoImFtYmlndW91czogIitsKTthLmNoaWxkcmVuP2EuY2hpbGRyZW4ucHVzaChzKTphLmNoaWxkcmVuPVtzXSxzLnBhcmVudD1hfWVsc2V7aWYobyl0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIHJvb3RzIik7bz1zfWlmKCFvKXRocm93IG5ldyBFcnJvcigibm8gcm9vdCIpO2lmKG8ucGFyZW50PVhTLG8uZWFjaEJlZm9yZSgoZnVuY3Rpb24odCl7dC5kZXB0aD10LnBhcmVudC5kZXB0aCsxLC0tdX0pKS5lYWNoQmVmb3JlKHVTKSxvLnBhcmVudD1udWxsLHU+MCl0aHJvdyBuZXcgRXJyb3IoImN5Y2xlIik7cmV0dXJuIG99cmV0dXJuIG4uaWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9SFMoZSksbik6dH0sbi5wYXJlbnRJZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1IUyh0KSxuKTplfSxufSx0cmVlOmZ1bmN0aW9uIGpJKCl7dmFyIHQ9SlMsZT0xLG49MSxpPW51bGw7ZnVuY3Rpb24gcihyKXt2YXIgbD0oZnVuY3Rpb24gYyh0KXtmb3IodmFyIGUsbixpLHIsbyxhPW5ldyBpTSh0LDApLHM9W2FdO2U9cy5wb3AoKTspaWYoaT1lLl8uY2hpbGRyZW4pZm9yKGUuY2hpbGRyZW49bmV3IEFycmF5KG89aS5sZW5ndGgpLHI9by0xO3I+PTA7LS1yKXMucHVzaChuPWUuY2hpbGRyZW5bcl09bmV3IGlNKGlbcl0scikpLG4ucGFyZW50PWU7cmV0dXJuKGEucGFyZW50PW5ldyBpTShudWxsLDApKS5jaGlsZHJlbj1bYV0sYX0pKHIpO2lmKGwuZWFjaEFmdGVyKG8pLGwucGFyZW50Lm09LWwueixsLmVhY2hCZWZvcmUoYSksaSlyLmVhY2hCZWZvcmUocyk7ZWxzZXt2YXIgdT1yLGg9cixkPXI7ci5lYWNoQmVmb3JlKChmdW5jdGlvbih0KXt0Lng8dS54JiYodT10KSx0Lng+aC54JiYoaD10KSx0LmRlcHRoPmQuZGVwdGgmJihkPXQpfSkpO3ZhciBwPXU9PT1oPzE6dCh1LGgpLzIsZj1wLXUueCxtPWUvKGgueCtwK2YpLGc9bi8oZC5kZXB0aHx8MSk7ci5lYWNoQmVmb3JlKChmdW5jdGlvbih0KXt0Lng9KHQueCtmKSptLHQueT10LmRlcHRoKmd9KSl9cmV0dXJuIHJ9ZnVuY3Rpb24gbyhlKXt2YXIgbj1lLmNoaWxkcmVuLGk9ZS5wYXJlbnQuY2hpbGRyZW4scj1lLmk/aVtlLmktMV06bnVsbDtpZihuKXshKGZ1bmN0aW9uIG8odCl7Zm9yKHZhciBlLG49MCxpPTAscj10LmNoaWxkcmVuLG89ci5sZW5ndGg7LS1vPj0wOykoZT1yW29dKS56Kz1uLGUubSs9bixuKz1lLnMrKGkrPWUuYyl9KShlKTt2YXIgYT0oblswXS56K25bbi5sZW5ndGgtMV0ueikvMjtyPyhlLno9ci56K3QoZS5fLHIuXyksZS5tPWUuei1hKTplLno9YX1lbHNlIHImJihlLno9ci56K3QoZS5fLHIuXykpO2UucGFyZW50LkE9KGZ1bmN0aW9uIHMoZSxuLGkpe2lmKG4pe2Zvcih2YXIgcixvPWUsYT1lLHM9bixsPW8ucGFyZW50LmNoaWxkcmVuWzBdLGM9by5tLHU9YS5tLGg9cy5tLGQ9bC5tO3M9dE0ocyksbz1RUyhvKSxzJiZvOylsPVFTKGwpLChhPXRNKGEpKS5hPWUsKHI9cy56K2gtby56LWMrdChzLl8sby5fKSk+MCYmKGVNKG5NKHMsZSxpKSxlLHIpLGMrPXIsdSs9ciksaCs9cy5tLGMrPW8ubSxkKz1sLm0sdSs9YS5tO3MmJiF0TShhKSYmKGEudD1zLGEubSs9aC11KSxvJiYhUVMobCkmJihsLnQ9byxsLm0rPWMtZCxpPWUpfXJldHVybiBpfSkoZSxyLGUucGFyZW50LkF8fGlbMF0pfWZ1bmN0aW9uIGEodCl7dC5fLng9dC56K3QucGFyZW50Lm0sdC5tKz10LnBhcmVudC5tfWZ1bmN0aW9uIHModCl7dC54Kj1lLHQueT10LmRlcHRoKm59cmV0dXJuIHIuc2VwYXJhdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLHIpOnR9LHIuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0hMSxlPSt0WzBdLG49K3RbMV0scik6aT9udWxsOltlLG5dfSxyLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSEwLGU9K3RbMF0sbj0rdFsxXSxyKTppP1tlLG5dOm51bGx9LHJ9LHRyZWVtYXA6ZnVuY3Rpb24gR0koKXt2YXIgdD1zTSxlPSExLG49MSxpPTEscj1bMF0sbz1GUyxhPUZTLHM9RlMsbD1GUyxjPUZTO2Z1bmN0aW9uIHUodCl7cmV0dXJuIHQueDA9dC55MD0wLHQueDE9bix0LnkxPWksdC5lYWNoQmVmb3JlKGgpLHI9WzBdLGUmJnQuZWFjaEJlZm9yZShxUyksdH1mdW5jdGlvbiBoKGUpe3ZhciBuPXJbZS5kZXB0aF0saT1lLngwK24sdT1lLnkwK24saD1lLngxLW4sZD1lLnkxLW47aDxpJiYoaT1oPShpK2gpLzIpLGQ8dSYmKHU9ZD0odStkKS8yKSxlLngwPWksZS55MD11LGUueDE9aCxlLnkxPWQsZS5jaGlsZHJlbiYmKG49cltlLmRlcHRoKzFdPW8oZSkvMixpKz1jKGUpLW4sdSs9YShlKS1uLChoLT1zKGUpLW4pPGkmJihpPWg9KGkraCkvMiksKGQtPWwoZSktbik8dSYmKHU9ZD0odStkKS8yKSx0KGUsaSx1LGgsZCkpfXJldHVybiB1LnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSEhdCx1KTplfSx1LnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3RbMF0saT0rdFsxXSx1KTpbbixpXX0sdS50aWxlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PUhTKGUpLHUpOnR9LHUucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD91LnBhZGRpbmdJbm5lcih0KS5wYWRkaW5nT3V0ZXIodCk6dS5wYWRkaW5nSW5uZXIoKX0sdS5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWUygrdCksdSk6b30sdS5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dS5wYWRkaW5nVG9wKHQpLnBhZGRpbmdSaWdodCh0KS5wYWRkaW5nQm90dG9tKHQpLnBhZGRpbmdMZWZ0KHQpOnUucGFkZGluZ1RvcCgpfSx1LnBhZGRpbmdUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWUygrdCksdSk6YX0sdS5wYWRkaW5nUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWUygrdCksdSk6c30sdS5wYWRkaW5nQm90dG9tPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VlMoK3QpLHUpOmx9LHUucGFkZGluZ0xlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWUygrdCksdSk6Y30sdX0sdHJlZW1hcEJpbmFyeTpmdW5jdGlvbiBXSSh0LGUsbixpLHIpe3ZhciBvLGEscz10LmNoaWxkcmVuLGw9cy5sZW5ndGgsYz1uZXcgQXJyYXkobCsxKTtmb3IoY1swXT1hPW89MDtvPGw7KytvKWNbbysxXT1hKz1zW29dLnZhbHVlOyEoZnVuY3Rpb24gdChlLG4saSxyLG8sYSxsKXtpZihlPj1uLTEpe3ZhciB1PXNbZV07cmV0dXJuIHUueDA9cix1LnkwPW8sdS54MT1hLHZvaWQodS55MT1sKX1mb3IodmFyIGg9Y1tlXSxkPWkvMitoLHA9ZSsxLGY9bi0xO3A8Zjspe3ZhciBtPXArZj4+PjE7Y1ttXTxkP3A9bSsxOmY9bX1kLWNbcC0xXTxjW3BdLWQmJmUrMTxwJiYtLXA7dmFyIGc9Y1twXS1oLF89aS1nO2lmKGEtcj5sLW8pe3ZhciB5PShyKl8rYSpnKS9pO3QoZSxwLGcscixvLHksbCksdChwLG4sXyx5LG8sYSxsKX1lbHNle3ZhciB2PShvKl8rbCpnKS9pO3QoZSxwLGcscixvLGEsdiksdChwLG4sXyxyLHYsYSxsKX19KSgwLGwsdC52YWx1ZSxlLG4saSxyKX0sdHJlZW1hcERpY2U6WVMsdHJlZW1hcFNsaWNlOnJNLHRyZWVtYXBTbGljZURpY2U6ZnVuY3Rpb24gcUkodCxlLG4saSxyKXsoMSZ0LmRlcHRoP3JNOllTKSh0LGUsbixpLHIpfSx0cmVlbWFwU3F1YXJpZnk6c00sdHJlZW1hcFJlc3F1YXJpZnk6bE0saW50ZXJwb2xhdGU6amQsaW50ZXJwb2xhdGVBcnJheTpmdW5jdGlvbiBZSSh0LGUpe3JldHVybihPZChlKT9SZDp6ZCkodCxlKX0saW50ZXJwb2xhdGVCYXNpczpNZCxpbnRlcnBvbGF0ZUJhc2lzQ2xvc2VkOkVkLGludGVycG9sYXRlRGF0ZTpEZCxpbnRlcnBvbGF0ZURpc2NyZXRlOmZ1bmN0aW9uIFhJKHQpe3ZhciBlPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdFtNYXRoLm1heCgwLE1hdGgubWluKGUtMSxNYXRoLmZsb29yKG4qZSkpKV19fSxpbnRlcnBvbGF0ZUh1ZTpmdW5jdGlvbiAkSSh0LGUpe3ZhciBuPUFkKCt0LCtlKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9bih0KTtyZXR1cm4gZS0zNjAqTWF0aC5mbG9vcihlLzM2MCl9fSxpbnRlcnBvbGF0ZU51bWJlcjpCZCxpbnRlcnBvbGF0ZU51bWJlckFycmF5OlJkLGludGVycG9sYXRlT2JqZWN0OkhkLGludGVycG9sYXRlUm91bmQ6R2QsaW50ZXJwb2xhdGVTdHJpbmc6VWQsaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3M6UWQsaW50ZXJwb2xhdGVUcmFuc2Zvcm1Tdmc6ZXAsaW50ZXJwb2xhdGVab29tOm9wLGludGVycG9sYXRlUmdiOkxkLGludGVycG9sYXRlUmdiQmFzaXM6TmQsaW50ZXJwb2xhdGVSZ2JCYXNpc0Nsb3NlZDpJZCxpbnRlcnBvbGF0ZUhzbDpzcCxpbnRlcnBvbGF0ZUhzbExvbmc6bHAsaW50ZXJwb2xhdGVMYWI6Y3AsaW50ZXJwb2xhdGVIY2w6aHAsaW50ZXJwb2xhdGVIY2xMb25nOmRwLGludGVycG9sYXRlQ3ViZWhlbGl4OmdwLGludGVycG9sYXRlQ3ViZWhlbGl4TG9uZzpfcCxwaWVjZXdpc2U6ZnVuY3Rpb24gS0kodCxlKXtmb3IodmFyIG49MCxpPWUubGVuZ3RoLTEscj1lWzBdLG89bmV3IEFycmF5KGk8MD8wOmkpO248aTspb1tuXT10KHIscj1lWysrbl0pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1NYXRoLm1heCgwLE1hdGgubWluKGktMSxNYXRoLmZsb29yKHQqPWkpKSk7cmV0dXJuIG9bZV0odC1lKX19LHF1YW50aXplOmZ1bmN0aW9uIFpJKHQsZSl7Zm9yKHZhciBuPW5ldyBBcnJheShlKSxpPTA7aTxlOysraSluW2ldPXQoaS8oZS0xKSk7cmV0dXJuIG59LHBhdGg6ZmcscG9seWdvbkFyZWE6ZnVuY3Rpb24gSkkodCl7Zm9yKHZhciBlLG49LTEsaT10Lmxlbmd0aCxyPXRbaS0xXSxvPTA7KytuPGk7KW8rPShlPXIpWzFdKihyPXRbbl0pWzBdLWVbMF0qclsxXTtyZXR1cm4gby8yfSxwb2x5Z29uQ2VudHJvaWQ6ZnVuY3Rpb24gUUkodCl7Zm9yKHZhciBlLG4saT0tMSxyPXQubGVuZ3RoLG89MCxhPTAscz10W3ItMV0sbD0wOysraTxyOylsKz1uPShlPXMpWzBdKihzPXRbaV0pWzFdLXNbMF0qZVsxXSxvKz0oZVswXStzWzBdKSpuLGErPShlWzFdK3NbMV0pKm47cmV0dXJuW28vKGwqPTMpLGEvbF19LHBvbHlnb25IdWxsOmZ1bmN0aW9uIHRSKHQpe2lmKChuPXQubGVuZ3RoKTwzKXJldHVybiBudWxsO3ZhciBlLG4saT1uZXcgQXJyYXkobikscj1uZXcgQXJyYXkobik7Zm9yKGU9MDtlPG47KytlKWlbZV09Wyt0W2VdWzBdLCt0W2VdWzFdLGVdO2ZvcihpLnNvcnQodU0pLGU9MDtlPG47KytlKXJbZV09W2lbZV1bMF0sLWlbZV1bMV1dO3ZhciBvPWhNKGkpLGE9aE0ocikscz1hWzBdPT09b1swXSxsPWFbYS5sZW5ndGgtMV09PT1vW28ubGVuZ3RoLTFdLGM9W107Zm9yKGU9by5sZW5ndGgtMTtlPj0wOy0tZSljLnB1c2godFtpW29bZV1dWzJdXSk7Zm9yKGU9K3M7ZTxhLmxlbmd0aC1sOysrZSljLnB1c2godFtpW2FbZV1dWzJdXSk7cmV0dXJuIGN9LHBvbHlnb25Db250YWluczpmdW5jdGlvbiBlUih0LGUpe2Zvcih2YXIgbixpLHI9dC5sZW5ndGgsbz10W3ItMV0sYT1lWzBdLHM9ZVsxXSxsPW9bMF0sYz1vWzFdLHU9ITEsaD0wO2g8cjsrK2gpbj0obz10W2hdKVswXSwoaT1vWzFdKT5zIT1jPnMmJmE8KGwtbikqKHMtaSkvKGMtaSkrbiYmKHU9IXUpLGw9bixjPWk7cmV0dXJuIHV9LHBvbHlnb25MZW5ndGg6ZnVuY3Rpb24gblIodCl7Zm9yKHZhciBlLG4saT0tMSxyPXQubGVuZ3RoLG89dFtyLTFdLGE9b1swXSxzPW9bMV0sbD0wOysraTxyOyllPWEsbj1zLGUtPWE9KG89dFtpXSlbMF0sbi09cz1vWzFdLGwrPU1hdGguc3FydChlKmUrbipuKTtyZXR1cm4gbH0scXVhZHRyZWU6Tl8scmFuZG9tVW5pZm9ybTpwTSxyYW5kb21Ob3JtYWw6Zk0scmFuZG9tTG9nTm9ybWFsOm1NLHJhbmRvbUJhdGVzOl9NLHJhbmRvbUlyd2luSGFsbDpnTSxyYW5kb21FeHBvbmVudGlhbDp5TSxzY2FsZUJhbmQ6VE0sc2NhbGVQb2ludDpBTSxzY2FsZUlkZW50aXR5OmZ1bmN0aW9uIHQoZSl7dmFyIG47ZnVuY3Rpb24gaSh0KXtyZXR1cm4gaXNOYU4odD0rdCk/bjp0fXJldHVybiBpLmludmVydD1pLGkuZG9tYWluPWkucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9d00uY2FsbCh0LGtNKSxpKTplLnNsaWNlKCl9LGkudW5rbm93bj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGkpOm59LGkuY29weT1mdW5jdGlvbigpe3JldHVybiB0KGUpLnVua25vd24obil9LGU9YXJndW1lbnRzLmxlbmd0aD93TS5jYWxsKGUsa00pOlswLDFdLEZNKGkpfSxzY2FsZUxpbmVhcjpWTSxzY2FsZUxvZzpLTSxzY2FsZVN5bWxvZzpmdW5jdGlvbiB0KCl7dmFyIGU9UU0oRE0oKSk7cmV0dXJuIGUuY29weT1mdW5jdGlvbigpe3JldHVybiB6TShlLHQoKSkuY29uc3RhbnQoZS5jb25zdGFudCgpKX0sdk0uYXBwbHkoZSxhcmd1bWVudHMpfSxzY2FsZU9yZGluYWw6RU0sc2NhbGVJbXBsaWNpdDpNTSxzY2FsZVBvdzpyRSxzY2FsZVNxcnQ6ZnVuY3Rpb24gaVIoKXtyZXR1cm4gckUuYXBwbHkobnVsbCxhcmd1bWVudHMpLmV4cG9uZW50KC41KX0sc2NhbGVRdWFudGlsZTpvRSxzY2FsZVF1YW50aXplOmFFLHNjYWxlVGhyZXNob2xkOmZ1bmN0aW9uIHQoKXt2YXIgZSxuPVsuNV0saT1bMCwxXSxyPTE7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdDw9dD9pW1NsKG4sdCwwLHIpXTplfXJldHVybiBvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1TTS5jYWxsKHQpLHI9TWF0aC5taW4obi5sZW5ndGgsaS5sZW5ndGgtMSksbyk6bi5zbGljZSgpfSxvLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPVNNLmNhbGwodCkscj1NYXRoLm1pbihuLmxlbmd0aCxpLmxlbmd0aC0xKSxvKTppLnNsaWNlKCl9LG8uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBlPWkuaW5kZXhPZih0KTtyZXR1cm5bbltlLTFdLG5bZV1dfSxvLnVua25vd249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxvKTplfSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihuKS5yYW5nZShpKS51bmtub3duKGUpfSx2TS5hcHBseShvLGFyZ3VtZW50cyl9LHNjYWxlVGltZTpjQSxzY2FsZVV0YzpmdW5jdGlvbiByUigpe3JldHVybiB2TS5hcHBseShsQShFVCx3VCxzVCxyVCxlVCxKRSx2RSxoRSxSVCkuZG9tYWluKFtEYXRlLlVUQygyZTMsMCwxKSxEYXRlLlVUQygyZTMsMCwyKV0pLGFyZ3VtZW50cyl9LHNjYWxlU2VxdWVudGlhbDpmdW5jdGlvbiB0KCl7dmFyIGU9Rk0odUEoKShQTSkpO3JldHVybiBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gaEEoZSx0KCkpfSxiTS5hcHBseShlLGFyZ3VtZW50cyl9LHNjYWxlU2VxdWVudGlhbExvZzpmdW5jdGlvbiB0KCl7dmFyIGU9JE0odUEoKSkuZG9tYWluKFsxLDEwXSk7cmV0dXJuIGUuY29weT1mdW5jdGlvbigpe3JldHVybiBoQShlLHQoKSkuYmFzZShlLmJhc2UoKSl9LGJNLmFwcGx5KGUsYXJndW1lbnRzKX0sc2NhbGVTZXF1ZW50aWFsUG93OmRBLHNjYWxlU2VxdWVudGlhbFNxcnQ6ZnVuY3Rpb24gb1IoKXtyZXR1cm4gZEEuYXBwbHkobnVsbCxhcmd1bWVudHMpLmV4cG9uZW50KC41KX0sc2NhbGVTZXF1ZW50aWFsU3ltbG9nOmZ1bmN0aW9uIHQoKXt2YXIgZT1RTSh1QSgpKTtyZXR1cm4gZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGhBKGUsdCgpKS5jb25zdGFudChlLmNvbnN0YW50KCkpfSxiTS5hcHBseShlLGFyZ3VtZW50cyl9LHNjYWxlU2VxdWVudGlhbFF1YW50aWxlOmZ1bmN0aW9uIHQoKXt2YXIgZT1bXSxuPVBNO2Z1bmN0aW9uIGkodCl7aWYoIWlzTmFOKHQ9K3QpKXJldHVybiBuKChTbChlLHQpLTEpLyhlLmxlbmd0aC0xKSl9cmV0dXJuIGkuZG9tYWluPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBlLnNsaWNlKCk7ZT1bXTtmb3IodmFyIG4scj0wLG89dC5sZW5ndGg7cjxvOysrciludWxsPT0obj10W3JdKXx8aXNOYU4obj0rbil8fGUucHVzaChuKTtyZXR1cm4gZS5zb3J0KGJsKSxpfSxpLmludGVycG9sYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGkpOm59LGkuY29weT1mdW5jdGlvbigpe3JldHVybiB0KG4pLmRvbWFpbihlKX0sYk0uYXBwbHkoaSxhcmd1bWVudHMpfSxzY2FsZURpdmVyZ2luZzpmdW5jdGlvbiB0KCl7dmFyIGU9Rk0ocEEoKShQTSkpO3JldHVybiBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gaEEoZSx0KCkpfSxiTS5hcHBseShlLGFyZ3VtZW50cyl9LHNjYWxlRGl2ZXJnaW5nTG9nOmZ1bmN0aW9uIHQoKXt2YXIgZT0kTShwQSgpKS5kb21haW4oWy4xLDEsMTBdKTtyZXR1cm4gZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGhBKGUsdCgpKS5iYXNlKGUuYmFzZSgpKX0sYk0uYXBwbHkoZSxhcmd1bWVudHMpfSxzY2FsZURpdmVyZ2luZ1BvdzpmQSxzY2FsZURpdmVyZ2luZ1NxcnQ6ZnVuY3Rpb24gYVIoKXtyZXR1cm4gZkEuYXBwbHkobnVsbCxhcmd1bWVudHMpLmV4cG9uZW50KC41KX0sc2NhbGVEaXZlcmdpbmdTeW1sb2c6ZnVuY3Rpb24gdCgpe3ZhciBlPVFNKHBBKCkpO3JldHVybiBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gaEEoZSx0KCkpLmNvbnN0YW50KGUuY29uc3RhbnQoKSl9LGJNLmFwcGx5KGUsYXJndW1lbnRzKX0sdGlja0Zvcm1hdDpITSxzY2hlbWVDYXRlZ29yeTEwOmdBLHNjaGVtZUFjY2VudDpfQSxzY2hlbWVEYXJrMjp5QSxzY2hlbWVQYWlyZWQ6dkEsc2NoZW1lUGFzdGVsMTpiQSxzY2hlbWVQYXN0ZWwyOnhBLHNjaGVtZVNldDE6d0Esc2NoZW1lU2V0MjpTQSxzY2hlbWVTZXQzOk1BLHNjaGVtZVRhYmxlYXUxMDpFQSxpbnRlcnBvbGF0ZUJyQkc6QUEsc2NoZW1lQnJCRzpDQSxpbnRlcnBvbGF0ZVBSR246TEEsc2NoZW1lUFJHbjprQSxpbnRlcnBvbGF0ZVBpWUc6TkEsc2NoZW1lUGlZRzpQQSxpbnRlcnBvbGF0ZVB1T3I6UkEsc2NoZW1lUHVPcjpJQSxpbnRlcnBvbGF0ZVJkQnU6ekEsc2NoZW1lUmRCdTpPQSxpbnRlcnBvbGF0ZVJkR3k6QkEsc2NoZW1lUmRHeTpEQSxpbnRlcnBvbGF0ZVJkWWxCdTpGQSxzY2hlbWVSZFlsQnU6SEEsaW50ZXJwb2xhdGVSZFlsR246VUEsc2NoZW1lUmRZbEduOlZBLGludGVycG9sYXRlU3BlY3RyYWw6R0Esc2NoZW1lU3BlY3RyYWw6akEsaW50ZXJwb2xhdGVCdUduOnFBLHNjaGVtZUJ1R246V0EsaW50ZXJwb2xhdGVCdVB1OlhBLHNjaGVtZUJ1UHU6WUEsaW50ZXJwb2xhdGVHbkJ1OktBLHNjaGVtZUduQnU6JEEsaW50ZXJwb2xhdGVPclJkOkpBLHNjaGVtZU9yUmQ6WkEsaW50ZXJwb2xhdGVQdUJ1R246dGssc2NoZW1lUHVCdUduOlFBLGludGVycG9sYXRlUHVCdTpuayxzY2hlbWVQdUJ1OmVrLGludGVycG9sYXRlUHVSZDpyayxzY2hlbWVQdVJkOmlrLGludGVycG9sYXRlUmRQdTphayxzY2hlbWVSZFB1Om9rLGludGVycG9sYXRlWWxHbkJ1OmxrLHNjaGVtZVlsR25CdTpzayxpbnRlcnBvbGF0ZVlsR246dWssc2NoZW1lWWxHbjpjayxpbnRlcnBvbGF0ZVlsT3JCcjpkayxzY2hlbWVZbE9yQnI6aGssaW50ZXJwb2xhdGVZbE9yUmQ6Zmssc2NoZW1lWWxPclJkOnBrLGludGVycG9sYXRlQmx1ZXM6Z2ssc2NoZW1lQmx1ZXM6bWssaW50ZXJwb2xhdGVHcmVlbnM6eWssc2NoZW1lR3JlZW5zOl9rLGludGVycG9sYXRlR3JleXM6Ymssc2NoZW1lR3JleXM6dmssaW50ZXJwb2xhdGVQdXJwbGVzOndrLHNjaGVtZVB1cnBsZXM6eGssaW50ZXJwb2xhdGVSZWRzOk1rLHNjaGVtZVJlZHM6U2ssaW50ZXJwb2xhdGVPcmFuZ2VzOlRrLHNjaGVtZU9yYW5nZXM6RWssaW50ZXJwb2xhdGVDaXZpZGlzOmZ1bmN0aW9uIHNSKHQpe3JldHVybiB0PU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSksInJnYigiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQoLTQuNTQtdCooMzUuMzQtdCooMjM4MS43My10Kig2NDAyLjctdCooNzAyNC43Mi0yNzEwLjU3KnQpKSkpKSkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCgzMi40OSt0KigxNzAuNzMrdCooNTIuODItdCooMTMxLjQ2LXQqKDE3Ni41OC02Ny4zNyp0KSkpKSkpKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQoODEuMjQrdCooNDQyLjM2LXQqKDI0ODIuNDMtdCooNjE2Ny4yNC10Kig2NjE0Ljk0LTI0NzUuNjcqdCkpKSkpKSkrIikifSxpbnRlcnBvbGF0ZUN1YmVoZWxpeERlZmF1bHQ6Q2ssaW50ZXJwb2xhdGVSYWluYm93OmZ1bmN0aW9uIGxSKHQpeyh0PDB8fHQ+MSkmJih0LT1NYXRoLmZsb29yKHQpKTt2YXIgZT1NYXRoLmFicyh0LS41KTtyZXR1cm4gTGsuaD0zNjAqdC0xMDAsTGsucz0xLjUtMS41KmUsTGsubD0uOC0uOSplLExrKyIifSxpbnRlcnBvbGF0ZVdhcm06QWssaW50ZXJwb2xhdGVDb29sOmtrLGludGVycG9sYXRlU2luZWJvdzpmdW5jdGlvbiBjUih0KXt2YXIgZTtyZXR1cm4gdD0oLjUtdCkqTWF0aC5QSSxQay5yPTI1NSooZT1NYXRoLnNpbih0KSkqZSxQay5nPTI1NSooZT1NYXRoLnNpbih0K05rKSkqZSxQay5iPTI1NSooZT1NYXRoLnNpbih0K0lrKSkqZSxQaysiIn0saW50ZXJwb2xhdGVUdXJibzpmdW5jdGlvbiB1Uih0KXtyZXR1cm4gdD1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLCJyZ2IoIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKDM0LjYxK3QqKDExNzIuMzMtdCooMTA3OTMuNTYtdCooMzMzMDAuMTItdCooMzgzOTQuNDktMTQ4MjUuMDUqdCkpKSkpKSkrIiwgIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKDIzLjMxK3QqKDU1Ny4zMyt0KigxMjI1LjMzLXQqKDM1NzQuOTYtdCooMTA3My43Nys3MDcuNTYqdCkpKSkpKSkrIiwgIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKDI3LjIrdCooMzIxMS4xLXQqKDE1MzI3Ljk3LXQqKDI3ODE0LXQqKDIyNTY5LjE4LTY4MzguNjYqdCkpKSkpKSkrIikifSxpbnRlcnBvbGF0ZVZpcmlkaXM6T2ssaW50ZXJwb2xhdGVNYWdtYTp6ayxpbnRlcnBvbGF0ZUluZmVybm86RGssaW50ZXJwb2xhdGVQbGFzbWE6QmssY3JlYXRlOmZ1bmN0aW9uIGhSKHQpe3JldHVybiBTdSh5Yyh0KS5jYWxsKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpfSxjcmVhdG9yOnljLGxvY2FsOm5oLG1hdGNoZXI6U2MsbW91c2U6YWgsbmFtZXNwYWNlOm1jLG5hbWVzcGFjZXM6ZmMsY2xpZW50UG9pbnQ6b2gsc2VsZWN0OlN1LHNlbGVjdEFsbDpzaCxzZWxlY3Rpb246d3Usc2VsZWN0b3I6YmMsc2VsZWN0b3JBbGw6d2Msc3R5bGU6SGMsdG91Y2g6bGgsdG91Y2hlczpmdW5jdGlvbiBkUih0LGUpe251bGw9PWUmJihlPXJoKCkudG91Y2hlcyk7Zm9yKHZhciBuPTAsaT1lP2UubGVuZ3RoOjAscj1uZXcgQXJyYXkoaSk7bjxpOysrbilyW25dPW9oKHQsZVtuXSk7cmV0dXJuIHJ9LHdpbmRvdzpPYyxnZXQgZXZlbnQoKXtyZXR1cm4gdXV9LGN1c3RvbUV2ZW50Omd1LGFyYzpmdW5jdGlvbiBwUigpe3ZhciB0PVFrLGU9dEwsbj1IaygwKSxpPW51bGwscj1lTCxvPW5MLGE9aUwscz1udWxsO2Z1bmN0aW9uIGwoKXt2YXIgbCxjLHU9K3QuYXBwbHkodGhpcyxhcmd1bWVudHMpLGg9K2UuYXBwbHkodGhpcyxhcmd1bWVudHMpLGQ9ci5hcHBseSh0aGlzLGFyZ3VtZW50cyktJGsscD1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKS0kayxmPUZrKHAtZCksbT1wPmQ7aWYoc3x8KHM9bD1mZygpKSxoPHUmJihjPWgsaD11LHU9YyksaD5ZaylpZihmPktrLVlrKXMubW92ZVRvKGgqVWsoZCksaCpXayhkKSkscy5hcmMoMCwwLGgsZCxwLCFtKSx1PllrJiYocy5tb3ZlVG8odSpVayhwKSx1KldrKHApKSxzLmFyYygwLDAsdSxwLGQsbSkpO2Vsc2V7dmFyIGcsXyx5PWQsdj1wLGI9ZCx4PXAsdz1mLFM9ZixNPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpLzIsRT1NPllrJiYoaT8raS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6cWsodSp1K2gqaCkpLFQ9R2soRmsoaC11KS8yLCtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksQz1ULEE9VDtpZihFPllrKXt2YXIgaz1KayhFL3UqV2soTSkpLEw9SmsoRS9oKldrKE0pKTsody09MiprKT5Zaz8oYis9ayo9bT8xOi0xLHgtPWspOih3PTAsYj14PShkK3ApLzIpLChTLT0yKkwpPllrPyh5Kz1MKj1tPzE6LTEsdi09TCk6KFM9MCx5PXY9KGQrcCkvMil9dmFyIFA9aCpVayh5KSxOPWgqV2soeSksST11KlVrKHgpLFI9dSpXayh4KTtpZihUPllrKXt2YXIgTyx6PWgqVWsodiksRD1oKldrKHYpLEI9dSpVayhiKSxIPXUqV2soYik7aWYoZjxYayYmKE89ckwoUCxOLEIsSCx6LEQsSSxSKSkpe3ZhciBGPVAtT1swXSxWPU4tT1sxXSxVPXotT1swXSxqPUQtT1sxXSxHPTEvV2soWmsoKEYqVStWKmopLyhxayhGKkYrVipWKSpxayhVKlUraipqKSkpLzIpLFc9cWsoT1swXSpPWzBdK09bMV0qT1sxXSk7Qz1HayhULCh1LVcpLyhHLTEpKSxBPUdrKFQsKGgtVykvKEcrMSkpfX1TPllrP0E+WWs/KGc9b0woQixILFAsTixoLEEsbSksXz1vTCh6LEQsSSxSLGgsQSxtKSxzLm1vdmVUbyhnLmN4K2cueDAxLGcuY3krZy55MDEpLEE8VD9zLmFyYyhnLmN4LGcuY3ksQSxWayhnLnkwMSxnLngwMSksVmsoXy55MDEsXy54MDEpLCFtKToocy5hcmMoZy5jeCxnLmN5LEEsVmsoZy55MDEsZy54MDEpLFZrKGcueTExLGcueDExKSwhbSkscy5hcmMoMCwwLGgsVmsoZy5jeStnLnkxMSxnLmN4K2cueDExKSxWayhfLmN5K18ueTExLF8uY3grXy54MTEpLCFtKSxzLmFyYyhfLmN4LF8uY3ksQSxWayhfLnkxMSxfLngxMSksVmsoXy55MDEsXy54MDEpLCFtKSkpOihzLm1vdmVUbyhQLE4pLHMuYXJjKDAsMCxoLHksdiwhbSkpOnMubW92ZVRvKFAsTiksdT5ZayYmdz5Zaz9DPllrPyhnPW9MKEksUix6LEQsdSwtQyxtKSxfPW9MKFAsTixCLEgsdSwtQyxtKSxzLmxpbmVUbyhnLmN4K2cueDAxLGcuY3krZy55MDEpLEM8VD9zLmFyYyhnLmN4LGcuY3ksQyxWayhnLnkwMSxnLngwMSksVmsoXy55MDEsXy54MDEpLCFtKToocy5hcmMoZy5jeCxnLmN5LEMsVmsoZy55MDEsZy54MDEpLFZrKGcueTExLGcueDExKSwhbSkscy5hcmMoMCwwLHUsVmsoZy5jeStnLnkxMSxnLmN4K2cueDExKSxWayhfLmN5K18ueTExLF8uY3grXy54MTEpLG0pLHMuYXJjKF8uY3gsXy5jeSxDLFZrKF8ueTExLF8ueDExKSxWayhfLnkwMSxfLngwMSksIW0pKSk6cy5hcmMoMCwwLHUseCxiLG0pOnMubGluZVRvKEksUil9ZWxzZSBzLm1vdmVUbygwLDApO2lmKHMuY2xvc2VQYXRoKCksbClyZXR1cm4gcz1udWxsLGwrIiJ8fG51bGx9cmV0dXJuIGwuY2VudHJvaWQ9ZnVuY3Rpb24oKXt2YXIgbj0oK3QuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzIsaT0oK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArby5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzItWGsvMjtyZXR1cm5bVWsoaSkqbixXayhpKSpuXX0sbC5pbm5lclJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOkhrKCtlKSxsKTp0fSxsLm91dGVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SGsoK3QpLGwpOmV9LGwuY29ybmVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SGsoK3QpLGwpOm59LGwucGFkUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OkhrKCt0KSxsKTppfSxsLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpIaygrdCksbCk6cn0sbC5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkhrKCt0KSxsKTpvfSxsLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SGsoK3QpLGwpOmF9LGwuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1udWxsPT10P251bGw6dCxsKTpzfSxsfSxhcmVhOmhMLGxpbmU6dUwscGllOmZ1bmN0aW9uIGZSKCl7dmFyIHQ9cEwsZT1kTCxuPW51bGwsaT1IaygwKSxyPUhrKEtrKSxvPUhrKDApO2Z1bmN0aW9uIGEoYSl7dmFyIHMsbCxjLHUsaCxkPWEubGVuZ3RoLHA9MCxmPW5ldyBBcnJheShkKSxtPW5ldyBBcnJheShkKSxnPStpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxfPU1hdGgubWluKEtrLE1hdGgubWF4KC1LayxyLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1nKSkseT1NYXRoLm1pbihNYXRoLmFicyhfKS9kLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpKSx2PXkqKF88MD8tMToxKTtmb3Iocz0wO3M8ZDsrK3MpKGg9bVtmW3NdPXNdPSt0KGFbc10scyxhKSk+MCYmKHArPWgpO2ZvcihudWxsIT1lP2Yuc29ydCgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZShtW3RdLG1bbl0pfSkpOm51bGwhPW4mJmYuc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gbihhW3RdLGFbZV0pfSkpLHM9MCxjPXA/KF8tZCp2KS9wOjA7czxkOysrcyxnPXUpbVtsPWZbc11dPXtkYXRhOmFbbF0saW5kZXg6cyx2YWx1ZTpoPW1bbF0sc3RhcnRBbmdsZTpnLGVuZEFuZ2xlOnU9ZysoaD4wP2gqYzowKSt2LHBhZEFuZ2xlOnl9O3JldHVybiBtfXJldHVybiBhLnZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6SGsoK2UpLGEpOnR9LGEuc29ydFZhbHVlcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG49bnVsbCxhKTplfSxhLnNvcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxlPW51bGwsYSk6bn0sYS5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SGsoK3QpLGEpOml9LGEuZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpIaygrdCksYSk6cn0sYS5wYWRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkhrKCt0KSxhKTpvfSxhfSxhcmVhUmFkaWFsOnZMLHJhZGlhbEFyZWE6dkwsbGluZVJhZGlhbDp5TCxyYWRpYWxMaW5lOnlMLHBvaW50UmFkaWFsOmJMLGxpbmtIb3Jpem9udGFsOmZ1bmN0aW9uIG1SKCl7cmV0dXJuIE1MKEVMKX0sbGlua1ZlcnRpY2FsOmZ1bmN0aW9uIGdSKCl7cmV0dXJuIE1MKFRMKX0sbGlua1JhZGlhbDpmdW5jdGlvbiBfUigpe3ZhciB0PU1MKENMKTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0fSxzeW1ib2w6ZnVuY3Rpb24geVIoKXt2YXIgdD1IayhBTCksZT1Iayg2NCksbj1udWxsO2Z1bmN0aW9uIGkoKXt2YXIgaTtpZihufHwobj1pPWZnKCkpLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpLmRyYXcobiwrZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGkpcmV0dXJuIG49bnVsbCxpKyIifHxudWxsfXJldHVybiBpLnR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpIayhlKSxpKTp0fSxpLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpIaygrdCksaSk6ZX0saS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPW51bGw9PXQ/bnVsbDp0LGkpOm59LGl9LHN5bWJvbHM6V0wsc3ltYm9sQ2lyY2xlOkFMLHN5bWJvbENyb3NzOmtMLHN5bWJvbERpYW1vbmQ6Tkwsc3ltYm9sU3F1YXJlOkRMLHN5bWJvbFN0YXI6ekwsc3ltYm9sVHJpYW5nbGU6SEwsc3ltYm9sV3llOkdMLGN1cnZlQmFzaXNDbG9zZWQ6ZnVuY3Rpb24gdlIodCl7cmV0dXJuIG5ldyBLTCh0KX0sY3VydmVCYXNpc09wZW46ZnVuY3Rpb24gYlIodCl7cmV0dXJuIG5ldyBaTCh0KX0sY3VydmVCYXNpczokTCxjdXJ2ZUJ1bmRsZTpRTCxjdXJ2ZUNhcmRpbmFsQ2xvc2VkOnJQLGN1cnZlQ2FyZGluYWxPcGVuOmFQLGN1cnZlQ2FyZGluYWw6blAsY3VydmVDYXRtdWxsUm9tQ2xvc2VkOmhQLGN1cnZlQ2F0bXVsbFJvbU9wZW46cFAsY3VydmVDYXRtdWxsUm9tOmNQLGN1cnZlTGluZWFyQ2xvc2VkOmZ1bmN0aW9uIHhSKHQpe3JldHVybiBuZXcgZlAodCl9LGN1cnZlTGluZWFyOnNMLGN1cnZlTW9ub3RvbmVYOmZ1bmN0aW9uIHdSKHQpe3JldHVybiBuZXcgdlAodCl9LGN1cnZlTW9ub3RvbmVZOmZ1bmN0aW9uIFNSKHQpe3JldHVybiBuZXcgYlAodCl9LGN1cnZlTmF0dXJhbDpmdW5jdGlvbiBNUih0KXtyZXR1cm4gbmV3IHdQKHQpfSxjdXJ2ZVN0ZXA6ZnVuY3Rpb24gRVIodCl7cmV0dXJuIG5ldyBNUCh0LC41KX0sY3VydmVTdGVwQWZ0ZXI6ZnVuY3Rpb24gVFIodCl7cmV0dXJuIG5ldyBNUCh0LDEpfSxjdXJ2ZVN0ZXBCZWZvcmU6ZnVuY3Rpb24gQ1IodCl7cmV0dXJuIG5ldyBNUCh0LDApfSxzdGFjazpmdW5jdGlvbiBBUigpe3ZhciB0PUhrKFtdKSxlPVRQLG49RVAsaT1DUDtmdW5jdGlvbiByKHIpe3ZhciBvLGEscz10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxsPXIubGVuZ3RoLGM9cy5sZW5ndGgsdT1uZXcgQXJyYXkoYyk7Zm9yKG89MDtvPGM7KytvKXtmb3IodmFyIGgsZD1zW29dLHA9dVtvXT1uZXcgQXJyYXkobCksZj0wO2Y8bDsrK2YpcFtmXT1oPVswLCtpKHJbZl0sZCxmLHIpXSxoLmRhdGE9cltmXTtwLmtleT1kfWZvcihvPTAsYT1lKHUpO288YzsrK28pdVthW29dXS5pbmRleD1vO3JldHVybiBuKHUsYSksdX1yZXR1cm4gci5rZXlzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6SGsoeEwuY2FsbChlKSkscik6dH0sci52YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkhrKCt0KSxyKTppfSxyLm9yZGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/VFA6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpIayh4TC5jYWxsKHQpKSxyKTplfSxyLm9mZnNldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P0VQOnQscik6bn0scn0sc3RhY2tPZmZzZXRFeHBhbmQ6ZnVuY3Rpb24ga1IodCxlKXtpZigoaT10Lmxlbmd0aCk+MCl7Zm9yKHZhciBuLGkscixvPTAsYT10WzBdLmxlbmd0aDtvPGE7KytvKXtmb3Iocj1uPTA7bjxpOysrbilyKz10W25dW29dWzFdfHwwO2lmKHIpZm9yKG49MDtuPGk7KytuKXRbbl1bb11bMV0vPXJ9RVAodCxlKX19LHN0YWNrT2Zmc2V0RGl2ZXJnaW5nOmZ1bmN0aW9uIExSKHQsZSl7aWYoKHM9dC5sZW5ndGgpPjApZm9yKHZhciBuLGkscixvLGEscyxsPTAsYz10W2VbMF1dLmxlbmd0aDtsPGM7KytsKWZvcihvPWE9MCxuPTA7bjxzOysrbikocj0oaT10W2Vbbl1dW2xdKVsxXS1pWzBdKT4wPyhpWzBdPW8saVsxXT1vKz1yKTpyPDA/KGlbMV09YSxpWzBdPWErPXIpOihpWzBdPTAsaVsxXT1yKX0sc3RhY2tPZmZzZXROb25lOkVQLHN0YWNrT2Zmc2V0U2lsaG91ZXR0ZTpmdW5jdGlvbiBQUih0LGUpe2lmKChuPXQubGVuZ3RoKT4wKXtmb3IodmFyIG4saT0wLHI9dFtlWzBdXSxvPXIubGVuZ3RoO2k8bzsrK2kpe2Zvcih2YXIgYT0wLHM9MDthPG47KythKXMrPXRbYV1baV1bMV18fDA7cltpXVsxXSs9cltpXVswXT0tcy8yfUVQKHQsZSl9fSxzdGFja09mZnNldFdpZ2dsZTpmdW5jdGlvbiBOUih0LGUpe2lmKChyPXQubGVuZ3RoKT4wJiYoaT0obj10W2VbMF1dKS5sZW5ndGgpPjApe2Zvcih2YXIgbixpLHIsbz0wLGE9MTthPGk7KythKXtmb3IodmFyIHM9MCxsPTAsYz0wO3M8cjsrK3Mpe2Zvcih2YXIgdT10W2Vbc11dLGg9dVthXVsxXXx8MCxkPShoLSh1W2EtMV1bMV18fDApKS8yLHA9MDtwPHM7KytwKXt2YXIgZj10W2VbcF1dO2QrPShmW2FdWzFdfHwwKS0oZlthLTFdWzFdfHwwKX1sKz1oLGMrPWQqaH1uW2EtMV1bMV0rPW5bYS0xXVswXT1vLGwmJihvLT1jL2wpfW5bYS0xXVsxXSs9blthLTFdWzBdPW8sRVAodCxlKX19LHN0YWNrT3JkZXJBcHBlYXJhbmNlOkFQLHN0YWNrT3JkZXJBc2NlbmRpbmc6TFAsc3RhY2tPcmRlckRlc2NlbmRpbmc6ZnVuY3Rpb24gSVIodCl7cmV0dXJuIExQKHQpLnJldmVyc2UoKX0sc3RhY2tPcmRlckluc2lkZU91dDpmdW5jdGlvbiBSUih0KXt2YXIgZSxuLGk9dC5sZW5ndGgscj10Lm1hcChQUCksbz1BUCh0KSxhPTAscz0wLGw9W10sYz1bXTtmb3IoZT0wO2U8aTsrK2Upbj1vW2VdLGE8cz8oYSs9cltuXSxsLnB1c2gobikpOihzKz1yW25dLGMucHVzaChuKSk7cmV0dXJuIGMucmV2ZXJzZSgpLmNvbmNhdChsKX0sc3RhY2tPcmRlck5vbmU6VFAsc3RhY2tPcmRlclJldmVyc2U6ZnVuY3Rpb24gT1IodCl7cmV0dXJuIFRQKHQpLnJldmVyc2UoKX0sdGltZUludGVydmFsOmNFLHRpbWVNaWxsaXNlY29uZDpoRSx0aW1lTWlsbGlzZWNvbmRzOmRFLHV0Y01pbGxpc2Vjb25kOmhFLHV0Y01pbGxpc2Vjb25kczpkRSx0aW1lU2Vjb25kOnZFLHRpbWVTZWNvbmRzOmJFLHV0Y1NlY29uZDp2RSx1dGNTZWNvbmRzOmJFLHRpbWVNaW51dGU6d0UsdGltZU1pbnV0ZXM6U0UsdGltZUhvdXI6RUUsdGltZUhvdXJzOlRFLHRpbWVEYXk6QUUsdGltZURheXM6a0UsdGltZVdlZWs6UEUsdGltZVdlZWtzOkJFLHRpbWVTdW5kYXk6UEUsdGltZVN1bmRheXM6QkUsdGltZU1vbmRheTpORSx0aW1lTW9uZGF5czpIRSx0aW1lVHVlc2RheTpJRSx0aW1lVHVlc2RheXM6RkUsdGltZVdlZG5lc2RheTpSRSx0aW1lV2VkbmVzZGF5czpWRSx0aW1lVGh1cnNkYXk6T0UsdGltZVRodXJzZGF5czpVRSx0aW1lRnJpZGF5OnpFLHRpbWVGcmlkYXlzOmpFLHRpbWVTYXR1cmRheTpERSx0aW1lU2F0dXJkYXlzOkdFLHRpbWVNb250aDpxRSx0aW1lTW9udGhzOllFLHRpbWVZZWFyOiRFLHRpbWVZZWFyczpLRSx1dGNNaW51dGU6SkUsdXRjTWludXRlczpRRSx1dGNIb3VyOmVULHV0Y0hvdXJzOm5ULHV0Y0RheTpyVCx1dGNEYXlzOm9ULHV0Y1dlZWs6c1QsdXRjV2Vla3M6ZlQsdXRjU3VuZGF5OnNULHV0Y1N1bmRheXM6ZlQsdXRjTW9uZGF5OmxULHV0Y01vbmRheXM6bVQsdXRjVHVlc2RheTpjVCx1dGNUdWVzZGF5czpnVCx1dGNXZWRuZXNkYXk6dVQsdXRjV2VkbmVzZGF5czpfVCx1dGNUaHVyc2RheTpoVCx1dGNUaHVyc2RheXM6eVQsdXRjRnJpZGF5OmRULHV0Y0ZyaWRheXM6dlQsdXRjU2F0dXJkYXk6cFQsdXRjU2F0dXJkYXlzOmJULHV0Y01vbnRoOndULHV0Y01vbnRoczpTVCx1dGNZZWFyOkVULHV0Y1llYXJzOlRULHRpbWVGb3JtYXREZWZhdWx0TG9jYWxlOlFDLGdldCB0aW1lRm9ybWF0KCl7cmV0dXJuIE5UfSxnZXQgdGltZVBhcnNlKCl7cmV0dXJuIElUfSxnZXQgdXRjRm9ybWF0KCl7cmV0dXJuIFJUfSxnZXQgdXRjUGFyc2UoKXtyZXR1cm4gT1R9LHRpbWVGb3JtYXRMb2NhbGU6TFQsaXNvRm9ybWF0OmVBLGlzb1BhcnNlOmlBLG5vdzpUcCx0aW1lcjprcCx0aW1lckZsdXNoOkxwLHRpbWVvdXQ6UnAsaW50ZXJ2YWw6ZnVuY3Rpb24gelIodCxlLG4pe3ZhciBpPW5ldyBBcCxyPWU7cmV0dXJuIG51bGw9PWU/KGkucmVzdGFydCh0LGUsbiksaSk6KGU9K2Usbj1udWxsPT1uP1RwKCk6K24saS5yZXN0YXJ0KChmdW5jdGlvbiBvKGEpe2ErPXIsaS5yZXN0YXJ0KG8scis9ZSxuKSx0KGEpfSksZSxuKSxpKX0sdHJhbnNpdGlvbjpfZixhY3RpdmU6ZnVuY3Rpb24gRFIodCxlKXt2YXIgbixpLHI9dC5fX3RyYW5zaXRpb247aWYocilmb3IoaSBpbiBlPW51bGw9PWU/bnVsbDplKyIiLHIpaWYoKG49cltpXSkuc3RhdGU+MSYmbi5uYW1lPT09ZSlyZXR1cm4gbmV3IGdmKFtbdF1dLE1tLGUsK2kpO3JldHVybiBudWxsfSxpbnRlcnJ1cHQ6VnAsdm9yb25vaTpmdW5jdGlvbiBCUigpe3ZhciB0PUlQLGU9UlAsbj1udWxsO2Z1bmN0aW9uIGkoaSl7cmV0dXJuIG5ldyBtTihpLm1hcCgoZnVuY3Rpb24obixyKXt2YXIgbz1bTWF0aC5yb3VuZCh0KG4scixpKS9oTikqaE4sTWF0aC5yb3VuZChlKG4scixpKS9oTikqaE5dO3JldHVybiBvLmluZGV4PXIsby5kYXRhPW4sb30pKSxuKX1yZXR1cm4gaS5wb2x5Z29ucz1mdW5jdGlvbih0KXtyZXR1cm4gaSh0KS5wb2x5Z29ucygpfSxpLmxpbmtzPWZ1bmN0aW9uKHQpe3JldHVybiBpKHQpLmxpbmtzKCl9LGkudHJpYW5nbGVzPWZ1bmN0aW9uKHQpe3JldHVybiBpKHQpLnRyaWFuZ2xlcygpfSxpLng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpOUCgrZSksaSk6dH0saS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6TlAoK3QpLGkpOmV9LGkuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPW51bGw9PXQ/bnVsbDpbWyt0WzBdWzBdLCt0WzBdWzFdXSxbK3RbMV1bMF0sK3RbMV1bMV1dXSxpKTpuJiZbW25bMF1bMF0sblswXVsxXV0sW25bMV1bMF0sblsxXVsxXV1dfSxpLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09dD9udWxsOltbMCwwXSxbK3RbMF0sK3RbMV1dXSxpKTpuJiZbblsxXVswXS1uWzBdWzBdLG5bMV1bMV0tblswXVsxXV19LGl9LHpvb206a04sem9vbVRyYW5zZm9ybTpiTix6b29tSWRlbnRpdHk6dk59KTtjb25zdCBIUj1bIiNmZjcwNDMiLCIjMDA3N2JiIiwiI2NjMzMxMSIsIiMzM2JiZWUiLCIjZWUzMzc3IiwiIzAwOTk4OCIsIiNiYmJiYmIiXTtjbGFzcyBGUiBleHRlbmRzIG1se2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9leHBlcmltZW50cz1bXX1sb2FkKCl7Y29uc3QgdD1fcigpLmV4cGVyaW1lbnRzKCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0KS50aGVuKCh0PT57U2UuZXhwb3J0cy5pc0VxdWFsKHRoaXMuX2V4cGVyaW1lbnRzLHQpfHwodGhpcy5fZXhwZXJpbWVudHM9dCx0aGlzLmVtaXRDaGFuZ2UoKSl9KSl9Z2V0RXhwZXJpbWVudHMoKXtyZXR1cm4gdGhpcy5fZXhwZXJpbWVudHMuc2xpY2UoKX19Y29uc3QgVlI9bmV3IEZSO2NsYXNzIFVSe2NvbnN0cnVjdG9yKHQ9SFIpe3RoaXMucGFsZXR0ZT10LHRoaXMuaWRlbnRpZmllcnM9d2coKX1zZXREb21haW4odCl7cmV0dXJuIHRoaXMuaWRlbnRpZmllcnM9d2coKSx0LmZvckVhY2goKCh0LGUpPT57dGhpcy5pZGVudGlmaWVycy5zZXQodCx0aGlzLnBhbGV0dGVbZSV0aGlzLnBhbGV0dGUubGVuZ3RoXSl9KSksdGhpc31nZXRDb2xvcih0KXtpZighdGhpcy5pZGVudGlmaWVycy5oYXModCkpdGhyb3cgbmV3IEVycm9yKGBTdHJpbmcgJHt0fSB3YXMgbm90IGluIHRoZSBkb21haW4uYCk7cmV0dXJuIHRoaXMuaWRlbnRpZmllcnMuZ2V0KHQpfX1mdW5jdGlvbiBqUih0LGUpe2NvbnN0IG49bmV3IFVSO2Z1bmN0aW9uIGkoKXtuLnNldERvbWFpbihlKCkpfXJldHVybiB0LmFkZExpc3RlbmVyKGkpLGkoKSx0PT5uLmdldENvbG9yKHQpfWNvbnN0IEdSPWpSKHZsLCgoKT0+dmwuZ2V0UnVucygpKSk7alIoVlIsKCgpPT5WUi5nZXRFeHBlcmltZW50cygpLm1hcCgoKHtuYW1lOnR9KT0+dCkpKSksZWwoe21vZHVsZU5hbWU6InJ1bi1jb2xvci1zdHlsZSIsc3R5bGVDb250ZW50OiJcbiAgICBbY29sb3ItY2xhc3M9J2xpZ2h0LWJsdWUnXSBwYXBlci1jaGVja2JveCB7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1saWdodC1ibHVlLTkwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtOTAwKTtcbiAgICB9XG4gICAgW2NvbG9yLWNsYXNzPSdyZWQnXSBwYXBlci1jaGVja2JveCB7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXJlZC01MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTUwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTkwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXJlZC05MDApO1xuICAgIH1cbiAgICBbY29sb3ItY2xhc3M9J2dyZWVuJ10gcGFwZXItY2hlY2tib3gge1xuICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1ncmVlbi01MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItZ3JlZW4tNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1ncmVlbi05MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1ncmVlbi05MDApO1xuICAgIH1cbiAgICBbY29sb3ItY2xhc3M9J3B1cnBsZSddIHBhcGVyLWNoZWNrYm94IHtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTUwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtOTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTkwMCk7XG4gICAgfVxuICAgIFtjb2xvci1jbGFzcz0ndGVhbCddIHBhcGVyLWNoZWNrYm94IHtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC01MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC01MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXRlYWwtOTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC05MDApO1xuICAgIH1cbiAgICBbY29sb3ItY2xhc3M9J3BpbmsnXSBwYXBlci1jaGVja2JveCB7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXBpbmstNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXBpbmstNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1waW5rLTkwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXBpbmstOTAwKTtcbiAgICB9XG4gICAgW2NvbG9yLWNsYXNzPSdvcmFuZ2UnXSBwYXBlci1jaGVja2JveCB7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS01MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTkwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS05MDApO1xuICAgIH1cbiAgICBbY29sb3ItY2xhc3M9J2Jyb3duJ10gcGFwZXItY2hlY2tib3gge1xuICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1icm93bi01MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItYnJvd24tNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1icm93bi05MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1icm93bi05MDApO1xuICAgIH1cbiAgICBbY29sb3ItY2xhc3M9J2luZGlnbyddIHBhcGVyLWNoZWNrYm94IHtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTUwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tOTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTkwMCk7XG4gICAgfVxuICAifSk7bGV0IFdSPWNsYXNzIGV4dGVuZHMoZXIoeWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5uYW1lcz1bXSx0aGlzLmNvbG9yaW5nPXtnZXRDb2xvcjooKT0+IiJ9LHRoaXMucmVnZXg9IiIsdGhpcy5zZWxlY3Rpb25TdGF0ZT17fSx0aGlzLm1heE5hbWVzVG9FbmFibGVCeURlZmF1bHQ9NDAsdGhpcy5fZGVib3VuY2VkUmVnZXhDaGFuZ2U9dGhpcy5fZGVib3VuY2VkUmVnZXhDaGFuZ2VJbXBsKCl9X2RlYm91bmNlZFJlZ2V4Q2hhbmdlSW1wbCgpe3ZhciB0PVNlLmV4cG9ydHMuZGVib3VuY2UoKHQ9Pnt0aGlzLnJlZ2V4PXR9KSwxNTAse2xlYWRpbmc6ITF9KTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLiQkKCIjbmFtZXMtcmVnZXgiKS52YWx1ZTsiIj09ZT90aGlzLmFzeW5jKCgoKT0+e3RoaXMucmVnZXg9ZX0pLDMwKTp0KGUpfX1nZXQgX3JlZ2V4KCl7dmFyIHQ9dGhpcy5yZWdleDt0cnl7cmV0dXJuIG5ldyBSZWdFeHAodCl9Y2F0Y2godCl7cmV0dXJuIG51bGx9fV9zZXRJc29sYXRvckljb24oKXt2YXIgdD10aGlzLnNlbGVjdGlvblN0YXRlLGU9U2UuZXhwb3J0cy5maWx0ZXIoU2UuZXhwb3J0cy52YWx1ZXModCkpLmxlbmd0aDtBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmlzb2xhdG9yIikpLmZvckVhY2goKGZ1bmN0aW9uKG4pe24uaWNvbj0xPT09ZSYmdFtuLm5hbWVdPyJyYWRpby1idXR0b24tY2hlY2tlZCI6InJhZGlvLWJ1dHRvbi11bmNoZWNrZWQifSkpfWNvbXB1dGVOYW1lc01hdGNoaW5nUmVnZXgodCxlKXtjb25zdCBuPXRoaXMuX3JlZ2V4O3JldHVybiBuP3RoaXMubmFtZXMuZmlsdGVyKCh0PT5uLnRlc3QodCkpKTp0aGlzLm5hbWVzfWNvbXB1dGVPdXRTZWxlY3RlZCh0LGUpe3ZhciBuPXRoaXMuc2VsZWN0aW9uU3RhdGUsaT10aGlzLm5hbWVzTWF0Y2hpbmdSZWdleC5sZW5ndGg8PXRoaXMubWF4TmFtZXNUb0VuYWJsZUJ5RGVmYXVsdDtyZXR1cm4gdGhpcy5uYW1lc01hdGNoaW5nUmVnZXguZmlsdGVyKCh0PT5udWxsPT1uW3RdP2k6blt0XSkpfXN5bmNocm9uaXplQ29sb3JzKHQpe3RoaXMuX3NldElzb2xhdG9ySWNvbigpLHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJwYXBlci1jaGVja2JveCIpLmZvckVhY2goKHQ9Pntjb25zdCBlPXRoaXMuY29sb3JpbmcuZ2V0Q29sb3IodC5uYW1lKTt0LnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvciI6ZSwiLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvciI6ZSwiLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3IiOmUsIi0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvciI6ZX0pfSkpLHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuaXNvbGF0b3IiKS5mb3JFYWNoKCh0PT57Y29uc3QgZT10aGlzLmNvbG9yaW5nLmdldENvbG9yKHQubmFtZSk7dC5zdHlsZS5jb2xvcj1lfSkpLHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT57dGhpcy51cGRhdGVTdHlsZXMoKX0pKX1faXNvbGF0ZU5hbWUodCl7dmFyIGU9dC50YXJnZXQubmFtZSxuPXt9O3RoaXMubmFtZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7blt0XT10PT1lfSkpLHRoaXMuc2VsZWN0aW9uU3RhdGU9bn1fY2hlY2tib3hDaGFuZ2UodCl7dmFyIGU9dC50YXJnZXQ7Y29uc3Qgbj1TZS5leHBvcnRzLmNsb25lKHRoaXMuc2VsZWN0aW9uU3RhdGUpO25bZS5uYW1lXT1lLmNoZWNrZWQsdGhpcy5zZWxlY3Rpb25TdGF0ZT1ufV9pc0NoZWNrZWQodCxlKXtyZXR1cm4tMSE9dGhpcy5vdXRTZWxlY3RlZC5pbmRleE9mKHQpfXRvZ2dsZUFsbCgpe2NvbnN0IHQ9dGhpcy5uYW1lc01hdGNoaW5nUmVnZXguc29tZSgodD0+dGhpcy5vdXRTZWxlY3RlZC5pbmNsdWRlcyh0KSkpLGU9e307dGhpcy5uYW1lcy5mb3JFYWNoKChuPT57ZVtuXT0hdH0pKSx0aGlzLnNlbGVjdGlvblN0YXRlPWV9fTtXUi50ZW1wbGF0ZT1fZWAKICAgIDxzdHlsZSBpbmNsdWRlPSJzY3JvbGxiYXItc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icnVuLWNvbG9yLXN0eWxlIj48L3N0eWxlPgoKICAgIDxwYXBlci1pbnB1dAogICAgICBpZD0ibmFtZXMtcmVnZXgiCiAgICAgIG5vLWxhYmVsLWZsb2F0PSIiCiAgICAgIGxhYmVsPSJXcml0ZSBhIHJlZ2V4IHRvIGZpbHRlciBydW5zIgogICAgICB2YWx1ZT0iW1tyZWdleF1dIgogICAgICBvbi1iaW5kLXZhbHVlLWNoYW5nZWQ9Il9kZWJvdW5jZWRSZWdleENoYW5nZSIKICAgID48L3BhcGVyLWlucHV0PgogICAgPGRpdiBpZD0ib3V0ZXItY29udGFpbmVyIiBjbGFzcz0ic2Nyb2xsYmFyIj4KICAgICAgPHRlbXBsYXRlCiAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgaXRlbXM9IltbbmFtZXNNYXRjaGluZ1JlZ2V4XV0iCiAgICAgICAgb24tZG9tLWNoYW5nZT0ic3luY2hyb25pemVDb2xvcnMiCiAgICAgID4KICAgICAgICA8ZGl2IGNsYXNzPSJuYW1lLXJvdyI+CiAgICAgICAgICA8ZGl2CiAgICAgICAgICAgIGNsYXNzPSJpY29uLWNvbnRhaW5lciBjaGVja2JveC1jb250YWluZXIgdmVydGljYWwtYWxpZ24tY29udGFpbmVyIgogICAgICAgICAgPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3gKICAgICAgICAgICAgICBjbGFzcz0iY2hlY2tib3ggdmVydGljYWwtYWxpZ24tY2VudGVyIgogICAgICAgICAgICAgIGlkJD0iY2hlY2tib3gtW1tpdGVtXV0iCiAgICAgICAgICAgICAgbmFtZT0iW1tpdGVtXV0iCiAgICAgICAgICAgICAgY2hlY2tlZCQ9IltbX2lzQ2hlY2tlZChpdGVtLCBzZWxlY3Rpb25TdGF0ZS4qKV1dIgogICAgICAgICAgICAgIG9uLWNoYW5nZT0iX2NoZWNrYm94Q2hhbmdlIgogICAgICAgICAgICA+PC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdgogICAgICAgICAgICBjbGFzcz0iaWNvbi1jb250YWluZXIgaXNvbGF0b3ItY29udGFpbmVyIHZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciIKICAgICAgICAgID4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgICAgICAgaWNvbj0icmFkaW8tYnV0dG9uLXVuY2hlY2tlZCIKICAgICAgICAgICAgICBjbGFzcz0iaXNvbGF0b3IgdmVydGljYWwtYWxpZ24tY2VudGVyIgogICAgICAgICAgICAgIG9uLXRhcD0iX2lzb2xhdGVOYW1lIgogICAgICAgICAgICAgIG5hbWU9IltbaXRlbV1dIgogICAgICAgICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaXRlbS1sYWJlbC1jb250YWluZXIiPgogICAgICAgICAgICA8c3Bhbj5bW2l0ZW1dXTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLWlucHV0IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgIH0KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAjb3V0ZXItY29udGFpbmVyIHsKICAgICAgICBjb250YWluOiBjb250ZW50OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgfQogICAgICAubmFtZS1yb3cgewogICAgICAgIGNvbnRhaW46IGNvbnRlbnQ7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogNXB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOyAvKiBtYWtlcyB3cmFwcGluZyBvZiBoeXBlcnBhcmFtIHN0cmluZ3MgYmV0dGVyICovCiAgICAgIH0KICAgICAgLmljb24tY29udGFpbmVyIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAycHg7CiAgICAgIH0KICAgICAgLmNoZWNrYm94IHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgIH0KICAgICAgLmlzb2xhdG9yIHsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgICAgcGFkZGluZzogMHB4OwogICAgICB9CiAgICAgIC5pc29sYXRvci1jb250YWluZXIgewogICAgICAgIHBhZGRpbmctbGVmdDogNnB4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgfQogICAgICAuY2hlY2tib3gtY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgfQogICAgICAuaXRlbS1sYWJlbC1jb250YWluZXIgewogICAgICAgIHBhZGRpbmctbGVmdDogNXB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICB3aWR0aDogMHB4OyAvKiBoYWNrIHRvIGdldCB0aGUgZmxleC1ncm93IHRvIHdvcmsgcHJvcGVybHkgKi8KICAgICAgfQogICAgICAudG9vbHRpcC12YWx1ZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIHBhZGRpbmctbGVmdDogMnB4OwogICAgICB9CiAgICAgIC52ZXJ0aWNhbC1hbGlnbi1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciAudmVydGljYWwtYWxpZ24tY2VudGVyIHsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciAudmVydGljYWwtYWxpZ24tdG9wIHsKICAgICAgICBhbGlnbi1zZWxmOiBzdGFydDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxXUi5wcm90b3R5cGUsIm5hbWVzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFdSLnByb3RvdHlwZSwiY29sb3JpbmciLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFdSLnByb3RvdHlwZSwicmVnZXgiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheSxjb21wdXRlZDoiY29tcHV0ZU5hbWVzTWF0Y2hpbmdSZWdleChuYW1lcy4qLCBfcmVnZXgpIn0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLFdSLnByb3RvdHlwZSwibmFtZXNNYXRjaGluZ1JlZ2V4Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxXUi5wcm90b3R5cGUsInNlbGVjdGlvblN0YXRlIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXksbm90aWZ5OiEwLGNvbXB1dGVkOiJjb21wdXRlT3V0U2VsZWN0ZWQobmFtZXNNYXRjaGluZ1JlZ2V4LiosIHNlbGVjdGlvblN0YXRlLiopIn0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLFdSLnByb3RvdHlwZSwib3V0U2VsZWN0ZWQiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sV1IucHJvdG90eXBlLCJtYXhOYW1lc1RvRW5hYmxlQnlEZWZhdWx0Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFdSLnByb3RvdHlwZSwiX2RlYm91bmNlZFJlZ2V4Q2hhbmdlIix2b2lkIDApLHQoW3MoInJlZ2V4IiksZSgiZGVzaWduOnR5cGUiLFJlZ0V4cCksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sV1IucHJvdG90eXBlLCJfcmVnZXgiLG51bGwpLHQoW2EoInNlbGVjdGlvblN0YXRlIiwibmFtZXMiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLFdSLnByb3RvdHlwZSwiX3NldElzb2xhdG9ySWNvbiIsbnVsbCksV1I9dChbaSgidGYtbXVsdGktY2hlY2tib3giKV0sV1IpO2xldCBxUj1jbGFzcyBleHRlbmRzIHlle2dldCBfcGFydHMoKXt2YXIgdD10aGlzLnZhbHVlLGU9dGhpcy5kZWxpbWl0ZXJQYXR0ZXJuO2NvbnN0IG49W107Zm9yKDs7KXtjb25zdCBpPW5ldyBSZWdFeHAoZSwiZyIpO2lmKGkudGVzdCh0KSwwPT09aS5sYXN0SW5kZXgpe24ucHVzaCh0KTticmVha31uLnB1c2godC5zbGljZSgwLGkubGFzdEluZGV4KSksdD10LnNsaWNlKGkubGFzdEluZGV4KX1yZXR1cm4gbn19O3FSLnRlbXBsYXRlPV9lYAogICAgPCEtLQogICAgICBUaGlzIHVnbHkgZm9ybWF0dGluZyBpcyByZXF1aXJlZCB0byBwcmV2ZW50IHNwYWNlcyBmcm9tIHNsaXBwaW5nCiAgICAgIGludG8gdGhlIEhUTUwuCiAgICAtLT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3BhcnRzXV0iIGFzPSJwYXJ0IgogICAgICA+W1twYXJ0XV08d2JyCiAgICAvPjwvdGVtcGxhdGU+CiAgYCx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxxUi5wcm90b3R5cGUsInZhbHVlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHFSLnByb3RvdHlwZSwiZGVsaW1pdGVyUGF0dGVybiIsdm9pZCAwKSx0KFtzKCJ2YWx1ZSIsImRlbGltaXRlclBhdHRlcm4iKSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLHFSLnByb3RvdHlwZSwiX3BhcnRzIixudWxsKSxxUj10KFtpKCJ0Zi13YnItc3RyaW5nIildLHFSKTtsZXQgWVI9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnJ1blNlbGVjdGlvblN0YXRlPSRzKCJydW5TZWxlY3Rpb25TdGF0ZSIse2RlZmF1bHRWYWx1ZTp7fX0pLmNhbGwodGhpcyksdGhpcy5yZWdleElucHV0PVJzKCJyZWdleElucHV0Iix7ZGVmYXVsdFZhbHVlOiIifSkuY2FsbCh0aGlzKSx0aGlzLl9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoPTI1MCx0aGlzLl9kYXRhTG9jYXRpb25EZWxpbWl0ZXJQYXR0ZXJuPSJbLz1fLC1dIix0aGlzLmNvbG9yaW5nPXtnZXRDb2xvcjpHUn0sdGhpcy5fc3RvcmVSdW5TZWxlY3Rpb25TdGF0ZT1LcygicnVuU2VsZWN0aW9uU3RhdGUiLHtkZWZhdWx0VmFsdWU6e319KSx0aGlzLl9yZWdleE9ic2VydmVyPU9zKCJyZWdleElucHV0Iix7ZGVmYXVsdFZhbHVlOiIifSl9YXR0YWNoZWQoKXt0aGlzLl9ydW5TdG9yZUxpc3RlbmVyPXZsLmFkZExpc3RlbmVyKCgoKT0+e3RoaXMuc2V0KCJydW5zIix2bC5nZXRSdW5zKCkpfSkpLHRoaXMuc2V0KCJydW5zIix2bC5nZXRSdW5zKCkpLHRoaXMuX2VudlN0b3JlTGlzdGVuZXI9X2wuYWRkTGlzdGVuZXIoKCgpPT57dGhpcy5zZXQoImRhdGFMb2NhdGlvbiIsX2wuZ2V0RGF0YUxvY2F0aW9uKCkpfSkpLHRoaXMuc2V0KCJkYXRhTG9jYXRpb24iLF9sLmdldERhdGFMb2NhdGlvbigpKX1kZXRhY2hlZCgpe3ZsLnJlbW92ZUxpc3RlbmVyQnlLZXkodGhpcy5fcnVuU3RvcmVMaXN0ZW5lciksX2wucmVtb3ZlTGlzdGVuZXJCeUtleSh0aGlzLl9lbnZTdG9yZUxpc3RlbmVyKX1fdG9nZ2xlQWxsKCl7dGhpcy4kLm11bHRpQ2hlY2tib3gudG9nZ2xlQWxsKCl9Z2V0IF9jbGlwcGVkRGF0YUxvY2F0aW9uKCl7dmFyIHQ9dGhpcy5kYXRhTG9jYXRpb24sZT10aGlzLl9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoO2lmKHZvaWQgMCE9PXQpcmV0dXJuIHQubGVuZ3RoPmU/dC5zdWJzdHJpbmcoMCxlKTp0fV9vcGVuRGF0YUxvY2F0aW9uRGlhbG9nKHQpe3QucHJldmVudERlZmF1bHQoKSx0aGlzLiQkKCIjZGF0YS1sb2NhdGlvbi1kaWFsb2ciKS5vcGVuKCl9X3Nob3VsZFNob3dFeHBhbmREYXRhTG9jYXRpb25CdXR0b24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg+ZX19O1lSLnRlbXBsYXRlPV9lYAogICAgPHBhcGVyLWRpYWxvZyB3aXRoLWJhY2tkcm9wPSIiIGlkPSJkYXRhLWxvY2F0aW9uLWRpYWxvZyI+CiAgICAgIDxoMj5EYXRhIExvY2F0aW9uPC9oMj4KICAgICAgPHRmLXdici1zdHJpbmcKICAgICAgICB2YWx1ZT0iW1tkYXRhTG9jYXRpb25dXSIKICAgICAgICBkZWxpbWl0ZXItcGF0dGVybj0iW1tfZGF0YUxvY2F0aW9uRGVsaW1pdGVyUGF0dGVybl1dIgogICAgICA+CiAgICAgIDwvdGYtd2JyLXN0cmluZwogICAgPjwvcGFwZXItZGlhbG9nPgogICAgPGRpdiBpZD0idG9wLXRleHQiPgogICAgICA8aDMgaWQ9InRvb2x0aXAtaGVscCIgY2xhc3M9InRvb2x0aXAtY29udGFpbmVyIj5SdW5zPC9oMz4KICAgIDwvZGl2PgogICAgPHRmLW11bHRpLWNoZWNrYm94CiAgICAgIGlkPSJtdWx0aUNoZWNrYm94IgogICAgICBuYW1lcz0iW1tydW5zXV0iCiAgICAgIHNlbGVjdGlvbi1zdGF0ZT0ie3tydW5TZWxlY3Rpb25TdGF0ZX19IgogICAgICBvdXQtc2VsZWN0ZWQ9Int7c2VsZWN0ZWRSdW5zfX0iCiAgICAgIHJlZ2V4PSJ7e3JlZ2V4SW5wdXR9fSIKICAgICAgY29sb3Jpbmc9IltbY29sb3JpbmddXSIKICAgID48L3RmLW11bHRpLWNoZWNrYm94PgogICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIGlkPSJ0b2dnbGUtYWxsIiBvbi10YXA9Il90b2dnbGVBbGwiPgogICAgICBUb2dnbGUgQWxsIFJ1bnMKICAgIDwvcGFwZXItYnV0dG9uPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2RhdGFMb2NhdGlvbl1dIj4KICAgICAgPGRpdiBpZD0iZGF0YS1sb2NhdGlvbiI+CiAgICAgICAgPHRmLXdici1zdHJpbmcKICAgICAgICAgIHZhbHVlPSJbW19jbGlwcGVkRGF0YUxvY2F0aW9uXV0iCiAgICAgICAgICBkZWxpbWl0ZXItcGF0dGVybj0iW1tfZGF0YUxvY2F0aW9uRGVsaW1pdGVyUGF0dGVybl1dIgogICAgICAgID48L3RmLXdici1zdHJpbmcKICAgICAgICA+PCEtLQogICAgICAgICAgV2UgdXNlIEhUTUwgY29tbWVudHMgdG8gcmVtb3ZlIHNwYWNlcyBiZWZvcmUgdGhlIGVsbGlwc2lzLgogICAgICAgIC0tPjx0ZW1wbGF0ZQogICAgICAgICAgaXM9ImRvbS1pZiIKICAgICAgICAgIGlmPSJbW19zaG91bGRTaG93RXhwYW5kRGF0YUxvY2F0aW9uQnV0dG9uKGRhdGFMb2NhdGlvbiwgX2RhdGFMb2NhdGlvbkNsaXBMZW5ndGgpXV0iCiAgICAgICAgICA+PCEtLQogICAgICAgICAgLS0+PGEgaHJlZj0iIiBvbi1jbGljaz0iX29wZW5EYXRhTG9jYXRpb25EaWFsb2ciPuKApjwvYT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTBweDsKICAgICAgfQogICAgICAjdG9wLXRleHQgewogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1zZWNvbmRhcnktdGV4dC1jb2xvcik7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDE2cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfQogICAgICB0Zi13YnItc3RyaW5nIHsKICAgICAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIHRmLW11bHRpLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIC54LWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgfQogICAgICAjdG9vbHRpcC1oZWxwIHsKICAgICAgICBjb2xvcjogdmFyKC0tdGItc2Vjb25kYXJ5LXRleHQtY29sb3IpOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KICAgICAgcGFwZXItYnV0dG9uIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAjZGF0YS1sb2NhdGlvbiB7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbWFyZ2luOiA1cHggMCAwIDA7CiAgICAgICAgbWF4LXdpZHRoOiAyODhweDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfc3RvcmVSdW5TZWxlY3Rpb25TdGF0ZSJ9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sWVIucHJvdG90eXBlLCJydW5TZWxlY3Rpb25TdGF0ZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX3JlZ2V4T2JzZXJ2ZXIifSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFlSLnByb3RvdHlwZSwicmVnZXhJbnB1dCIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLFlSLnByb3RvdHlwZSwic2VsZWN0ZWRSdW5zIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxZUi5wcm90b3R5cGUsInJ1bnMiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFlSLnByb3RvdHlwZSwiZGF0YUxvY2F0aW9uIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLFlSLnByb3RvdHlwZSwiX2RhdGFMb2NhdGlvbkNsaXBMZW5ndGgiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sWVIucHJvdG90eXBlLCJfZGF0YUxvY2F0aW9uRGVsaW1pdGVyUGF0dGVybiIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxZUi5wcm90b3R5cGUsImNvbG9yaW5nIix2b2lkIDApLHQoW3MoImRhdGFMb2NhdGlvbiIsIl9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sWVIucHJvdG90eXBlLCJfY2xpcHBlZERhdGFMb2NhdGlvbiIsbnVsbCksWVI9dChbaSgidGYtcnVucy1zZWxlY3RvciIpXSxZUik7Y2xhc3MgWFJ7Y29uc3RydWN0b3IoKXt0aGlzLmNhbmNlbGxhdGlvbkNvdW50PTB9Y2FuY2VsbGFibGUodCl7Y29uc3QgZT10aGlzLmNhbmNlbGxhdGlvbkNvdW50O3JldHVybiBuPT50KHt2YWx1ZTpuLGNhbmNlbGxlZDp0aGlzLmNhbmNlbGxhdGlvbkNvdW50IT09ZX0pfWNhbmNlbEFsbCgpe3RoaXMuY2FuY2VsbGF0aW9uQ291bnQrK319bGV0ICRSPWNsYXNzIGV4dGVuZHMoZXIoeWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5odG1sPSIifWdldCBzYW5pdGl6ZWRIdG1sKCl7cmV0dXJuIHRoaXMuaHRtbH1hdHRhY2hlZCgpe3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT57dGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLm1hcmtkb3duLCEwKX0pKX19O2Z1bmN0aW9uIEtSKHQpe3JldHVybiB0P3QudG9TdHJpbmcoKS5yZXBsYWNlKC9HTVQtXGQrIFwoKFteKV0rKVwpLywiJDEiKToiIn0kUi50ZW1wbGF0ZT1fZWAKICAgIDxkaXYgaWQ9Im1hcmtkb3duIiBpbm5lci1oLXQtbS1sPSJbW3Nhbml0aXplZEh0bWxdXSI+PC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIC8qCiAgICAgICAqIFJlZHVjZSB0b3Btb3N0IGFuZCBib3R0b21tb3N0IG1hcmdpbnMgZnJvbSAxNnB4IHRvIDAuM2VtIChyZW5kZXJzCiAgICAgICAqIGF0IGFib3V0IDQuOHB4KSB0byBrZWVwIHRoZSBsYXlvdXQgY29tcGFjdC4gVGhpcyBpbXByb3ZlcyB0aGUKICAgICAgICogYXBwZWFyYW5jZSB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIGxpbmUgb2YgdGV4dDsgc3RhbmRhcmQgTWFya2Rvd24KICAgICAgICogcmVuZGVyZXJzIHdpbGwgc3RpbGwgaW5jbHVkZSBhIFxgPHA+XGAgZWxlbWVudC4KICAgICAgICoKICAgICAgICogQnkgdGFyZ2V0aW5nIG9ubHkgdGhlIHRvcC1sZXZlbCwgZXh0cmVtYWwgZWxlbWVudHMsIHdlIHByZXNlcnZlIGFueQogICAgICAgKiBhY3R1YWwgcGFyYWdyYXBoIGJyZWFrcyBhbmQgb25seSBjaGFuZ2UgdGhlIHBhZGRpbmcgYWdhaW5zdCB0aGUKICAgICAgICogY29tcG9uZW50IGVkZ2VzLgogICAgICAgKi8KICAgICAgI21hcmtkb3duID4gcDpmaXJzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLXRvcDogMC4zZW07CiAgICAgIH0KICAgICAgI21hcmtkb3duID4gcDpsYXN0LWNoaWxkIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjNlbTsKICAgICAgfQoKICAgICAgLyogUGxlYXNhbnQgc3R5bGVzIGZvciBNYXJrZG93biB0YWJsZXMuICovCiAgICAgICNtYXJrZG93biB0YWJsZSB7CiAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgICAgfQogICAgICAjbWFya2Rvd24gdGFibGUgdGggewogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgIH0KICAgICAgI21hcmtkb3duIHRhYmxlIHRoLAogICAgICAjbWFya2Rvd24gdGFibGUgdGQgewogICAgICAgIHBhZGRpbmc6IDZweCAxM3B4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXRiLXVpLWJvcmRlciwgI2RmZTJlNSk7CiAgICAgIH0KICAgICAgI21hcmtkb3duIHRhYmxlIHRyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS10Yi11aS1ib3JkZXIsICNjNmNiZDEpOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sJFIucHJvdG90eXBlLCJodG1sIix2b2lkIDApLHQoW3MoImh0bWwiKSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSwkUi5wcm90b3R5cGUsInNhbml0aXplZEh0bWwiLG51bGwpLCRSPXQoW2koInRmLW1hcmtkb3duLXZpZXciKV0sJFIpLGVsKHttb2R1bGVOYW1lOiJ0Zi1jYXJkLWhlYWRpbmctc3R5bGUiLHN0eWxlQ29udGVudDoiXG4gICAgZmlnY2FwdGlvbiB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAvKiogSG9yaXpvbnRhbCBsaW5lIG9mIGxhYmVscy4gKi9cbiAgICAuaGVhZGluZy1yb3cge1xuICAgICAgbWFyZ2luLXRvcDogLTRweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgIH1cblxuICAgIC8qKiBQaWVjZSBvZiB0ZXh0IGluIHRoZSBmaWd1cmUgY2FwdGlvbi4gKi9cbiAgICAuaGVhZGluZy1sYWJlbCB7XG4gICAgICBmbGV4LWdyb3c6IDE7XG4gICAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XG4gICAgfVxuXG4gICAgLyoqIE1ha2VzIGxhYmVsIHNob3cgb24gdGhlIHJpZ2h0LiAqL1xuICAgIC5oZWFkaW5nLXJpZ2h0IHtcbiAgICAgIGZsZXgtZ3JvdzogMDtcbiAgICB9XG4gICJ9KTtsZXQgWlI9Y2xhc3MgZXh0ZW5kcyB5ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5kaXNwbGF5TmFtZT1udWxsLHRoaXMudGFnPW51bGwsdGhpcy5ydW49bnVsbCx0aGlzLmRlc2NyaXB0aW9uPW51bGwsdGhpcy5jb2xvcj1udWxsfV91cGRhdGVIZWFkaW5nU3R5bGUoKXt0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tdGYtY2FyZC1oZWFkaW5nLWJhY2tncm91bmQtY29sb3IiOnRoaXMuX3J1bkJhY2tncm91bmQsIi0tdGYtY2FyZC1oZWFkaW5nLWNvbG9yIjp0aGlzLl9ydW5Db2xvcn0pfV9jb21wdXRlUnVuQmFja2dyb3VuZCh0KXtyZXR1cm4gdHx8Im5vbmUifV9jb21wdXRlUnVuQ29sb3IodCl7cmV0dXJuKGZ1bmN0aW9uIGUodCl7Y29uc3QgZT0oZnVuY3Rpb24gbih0KXtpZighdClyZXR1cm4gbnVsbDtsZXQgZT10Lm1hdGNoKC9eIyhbMC05YS1mXXsxLDJ9KShbMC05YS1mXXsxLDJ9KShbMC05YS1mXXsxLDJ9KSQvKTtpZighZSlyZXR1cm4gbnVsbDtpZig0PT10Lmxlbmd0aClmb3IodmFyIG49MTtuPD0zO24rKyllW25dPWVbbl0rZVtuXTtyZXR1cm5bcGFyc2VJbnQoZVsxXSwxNikscGFyc2VJbnQoZVsyXSwxNikscGFyc2VJbnQoZVszXSwxNildfSkodCk7cmV0dXJuIGU/TWF0aC5yb3VuZCgoMjk5KmVbMF0rNTg3KmVbMV0rMTE0KmVbMl0pLzFlMyk+MTI1PyJpbmhlcml0IjoiI2VlZSI6ImluaGVyaXQifSkodCl9Z2V0IF9uYW1lTGFiZWwoKXtyZXR1cm4gdGhpcy5kaXNwbGF5TmFtZXx8dGhpcy50YWd8fCIifWdldCBfdGFnTGFiZWwoKXt2YXIgdD10aGlzLnRhZztyZXR1cm4gdCYmdCE9PXRoaXMuZGlzcGxheU5hbWU/dDoiIn1fdG9nZ2xlRGVzY3JpcHRpb25EaWFsb2codCl7Y29uc3QgZT10aGlzLiQuZGVzY3JpcHRpb25EaWFsb2c7ZS5wb3NpdGlvblRhcmdldD10LnRhcmdldCxlLnRvZ2dsZSgpfX07WlIudGVtcGxhdGU9X2VgCiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICA8ZmlnY2FwdGlvbiBjbGFzcz0iY29udGVudCI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19uYW1lTGFiZWxdXSI+CiAgICAgICAgICAgIDxkaXYgaXRlbXByb3A9Im5hbWUiIGNsYXNzPSJoZWFkaW5nLWxhYmVsIG5hbWUiPltbX25hbWVMYWJlbF1dPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3J1bl1dIj4KICAgICAgICAgICAgPCEtLSBFeHRyYSB3cmFwcGluZyBzcGFuIG5lZWRlZCB0byBhdm9pZCBmbGV4Ym94IGJsb2NraWZpY2F0aW9uLiAtLT4KICAgICAgICAgICAgPCEtLSAoc2VlIGZsZXhib3ggc3BlYywgc2VjdGlvbiA0ICJGbGV4IEl0ZW1zIikgLS0+CiAgICAgICAgICAgIDxzcGFuPgogICAgICAgICAgICAgIDxzcGFuCiAgICAgICAgICAgICAgICBpdGVtcHJvcD0icnVuIgogICAgICAgICAgICAgICAgaWQ9ImhlYWRpbmctcnVuIgogICAgICAgICAgICAgICAgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCBydW4iCiAgICAgICAgICAgICAgICA+W1tydW5dXTwvc3BhbgogICAgICAgICAgICAgID4KICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3RhZ0xhYmVsXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgICB0YWc6IDxzcGFuIGl0ZW1wcm9wPSJ0YWciPltbX3RhZ0xhYmVsXV08L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8c2xvdD48L3Nsb3Q+CiAgICAgIDwvZmlnY2FwdGlvbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2Rlc2NyaXB0aW9uXV0iPgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgICAgaWNvbj0iaW5mbyIKICAgICAgICAgIG9uLXRhcD0iX3RvZ2dsZURlc2NyaXB0aW9uRGlhbG9nIgogICAgICAgICAgdGl0bGU9IlNob3cgc3VtbWFyeSBkZXNjcmlwdGlvbiIKICAgICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHBhcGVyLWRpYWxvZwogICAgICAgIGlkPSJkZXNjcmlwdGlvbkRpYWxvZyIKICAgICAgICBuby1vdmVybGFwPSIiCiAgICAgICAgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIKICAgICAgICB2ZXJ0aWNhbC1hbGlnbj0iYXV0byIKICAgICAgPgogICAgICAgIDxwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZT4KICAgICAgICAgIDx0Zi1tYXJrZG93bi12aWV3IGh0bWw9IltbZGVzY3JpcHRpb25dXSI+PC90Zi1tYXJrZG93bi12aWV3PgogICAgICAgIDwvcGFwZXItZGlhbG9nLXNjcm9sbGFibGU+CiAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgPC9kaXY+CiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAuY29udGVudCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAubmFtZSB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CiAgICAgIC5ydW4gewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgcGFkZGluZzogMXB4IDRweCAycHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICBwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZSB7CiAgICAgICAgbWF4LXdpZHRoOiA2NDBweDsKICAgICAgfQogICAgICAjaGVhZGluZy1ydW4gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRmLWNhcmQtaGVhZGluZy1iYWNrZ3JvdW5kLWNvbG9yKTsKICAgICAgICBjb2xvcjogdmFyKC0tdGYtY2FyZC1oZWFkaW5nLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFpSLnByb3RvdHlwZSwiZGlzcGxheU5hbWUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sWlIucHJvdG90eXBlLCJ0YWciLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sWlIucHJvdG90eXBlLCJydW4iLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sWlIucHJvdG90eXBlLCJkZXNjcmlwdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxaUi5wcm90b3R5cGUsImNvbG9yIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkJhY2tncm91bmQoY29sb3IpIixyZWFkT25seTohMCxvYnNlcnZlcjoiX3VwZGF0ZUhlYWRpbmdTdHlsZSJ9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sWlIucHJvdG90eXBlLCJfcnVuQmFja2dyb3VuZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihjb2xvcikiLHJlYWRPbmx5OiEwLG9ic2VydmVyOiJfdXBkYXRlSGVhZGluZ1N0eWxlIn0pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxaUi5wcm90b3R5cGUsIl9ydW5Db2xvciIsdm9pZCAwKSx0KFtzKCJkaXNwbGF5TmFtZSIsInRhZyIpLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLFpSLnByb3RvdHlwZSwiX25hbWVMYWJlbCIsbnVsbCksdChbcygiZGlzcGxheU5hbWUiLCJ0YWciKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxaUi5wcm90b3R5cGUsIl90YWdMYWJlbCIsbnVsbCksWlI9dChbaSgidGYtY2FyZC1oZWFkaW5nIildLFpSKTtsZXQgSlI9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9tZXRhZGF0YUNhbmNlbGxlcj1uZXcgWFIsdGhpcy5fc3RlcHM9W10sdGhpcy5fYXR0YWNoZWQ9ITF9Z2V0IF9ydW5Db2xvcigpe3JldHVybiBHUih0aGlzLnJ1bil9Z2V0IF9oYXNBdExlYXN0T25lU3RlcCgpe3ZhciB0PXRoaXMuX3N0ZXBzO3JldHVybiEhdCYmdC5sZW5ndGg+MH1nZXQgX2hhc011bHRpcGxlU3RlcHMoKXt2YXIgdD10aGlzLl9zdGVwcztyZXR1cm4hIXQmJnQubGVuZ3RoPjF9Z2V0IF9tYXhTdGVwSW5kZXgoKXtyZXR1cm4gdGhpcy5fc3RlcHMubGVuZ3RoLTF9Z2V0IF9jdXJyZW50RGF0dW0oKXtyZXR1cm4gdGhpcy5fc3RlcHNbdGhpcy5fc3RlcEluZGV4XX1nZXQgX3NhbXBsZVRleHQoKXtyZXR1cm5gJHt0aGlzLnNhbXBsZSsxfWB9Z2V0IF9oYXNNdWx0aXBsZVNhbXBsZXMoKXtyZXR1cm4gdGhpcy50b3RhbFNhbXBsZXM+MX1hdHRhY2hlZCgpe3RoaXMuX2F0dGFjaGVkPSEwLHRoaXMucmVsb2FkKCl9X3JlbG9hZE9uUnVuVGFnQ2hhbmdlKCl7dGhpcy5yZWxvYWQoKX1yZWxvYWQoKXtpZighdGhpcy5fYXR0YWNoZWQpcmV0dXJuO3RoaXMuX21ldGFkYXRhQ2FuY2VsbGVyLmNhbmNlbEFsbCgpO2NvbnN0IHQ9X3IoKS5wbHVnaW5Sb3V0ZSgiYXVkaW8iLCIvYXVkaW8iLG5ldyBVUkxTZWFyY2hQYXJhbXMoe3RhZzp0aGlzLnRhZyxydW46dGhpcy5ydW4sc2FtcGxlOlN0cmluZyh0aGlzLnNhbXBsZSl9KSksZT10aGlzLl9tZXRhZGF0YUNhbmNlbGxlci5jYW5jZWxsYWJsZSgodD0+e2lmKHQuY2FuY2VsbGVkKXJldHVybjtjb25zdCBlPXQudmFsdWUubWFwKHRoaXMuX2NyZWF0ZVN0ZXBEYXR1bS5iaW5kKHRoaXMpKTt0aGlzLnNldCgiX3N0ZXBzIixlKSx0aGlzLnNldCgiX3N0ZXBJbmRleCIsZS5sZW5ndGgtMSl9KSk7dGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHQpLnRoZW4oZSl9X2NyZWF0ZVN0ZXBEYXR1bSh0KXtjb25zdCBlPW5ldyBVUkxTZWFyY2hQYXJhbXModC5xdWVyeSk7ZS5hcHBlbmQoInRzIixTdHJpbmcodC53YWxsX3RpbWUpKTtjb25zdCBuPV9yKCkucGx1Z2luUm91dGUoImF1ZGlvIiwiL2luZGl2aWR1YWxBdWRpbyIsZSk7cmV0dXJue3dhbGxfdGltZTpLUihuZXcgRGF0ZSgxZTMqdC53YWxsX3RpbWUpKSxzdGVwOnQuc3RlcCxsYWJlbDp0LmxhYmVsLGNvbnRlbnRUeXBlOnQuY29udGVudFR5cGUsdXJsOm59fX07SlIudGVtcGxhdGU9X2VgCiAgICA8dGYtY2FyZC1oZWFkaW5nCiAgICAgIHRhZz0iW1t0YWddXSIKICAgICAgcnVuPSJbW3J1bl1dIgogICAgICBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIKICAgICAgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSIKICAgICAgY29sb3I9IltbX3J1bkNvbG9yXV0iCiAgICA+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVTYW1wbGVzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwiPgogICAgICAgICAgICBzYW1wbGU6IFtbX3NhbXBsZVRleHRdXSBvZiBbW3RvdGFsU2FtcGxlc11dCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNBdExlYXN0T25lU3RlcF1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgc3RlcCA8c3Ryb25nPltbX2N1cnJlbnREYXR1bS5zdGVwXV08L3N0cm9uZz4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19jdXJyZW50RGF0dW0ud2FsbF90aW1lXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIGhlYWRpbmctcmlnaHQiPgogICAgICAgICAgICAgIFtbX2N1cnJlbnREYXR1bS53YWxsX3RpbWVdXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVTdGVwc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICA8cGFwZXItc2xpZGVyCiAgICAgICAgICAgIGlkPSJzdGVwcyIKICAgICAgICAgICAgaW1tZWRpYXRlLXZhbHVlPSJ7e19zdGVwSW5kZXh9fSIKICAgICAgICAgICAgbWF4PSJbW19tYXhTdGVwSW5kZXhdXSIKICAgICAgICAgICAgbWF4LW1hcmtlcnM9IltbX21heFN0ZXBJbmRleF1dIgogICAgICAgICAgICBzbmFwcz0iIgogICAgICAgICAgICBzdGVwPSIxIgogICAgICAgICAgICB2YWx1ZT0ie3tfc3RlcEluZGV4fX0iCiAgICAgICAgICA+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXBdXSI+CiAgICAgIDxhdWRpbwogICAgICAgIGNvbnRyb2xzPSIiCiAgICAgICAgc3JjJD0iW1tfY3VycmVudERhdHVtLnVybF1dIgogICAgICAgIHR5cGUkPSJbW19jdXJyZW50RGF0dW0uY29udGVudFR5cGVdXSIKICAgICAgPjwvYXVkaW8+CiAgICAgIDx0Zi1tYXJrZG93bi12aWV3IGh0bWw9IltbX2N1cnJlbnREYXR1bS5sYWJlbF1dIj48L3RmLW1hcmtkb3duLXZpZXc+CiAgICA8L3RlbXBsYXRlPgogICAgPGRpdiBpZD0ibWFpbi1hdWRpby1jb250YWluZXIiPjwvZGl2PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1jYXJkLWhlYWRpbmctc3R5bGUiPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yOiAjNDI0MjQyOwogICAgICAgIG1hcmdpbi1yaWdodDogMTVweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CgogICAgICAjc3RlcHMgewogICAgICAgIGhlaWdodDogMTVweDsKICAgICAgICBtYXJnaW46IDAgMCAwIC0xNXB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgcGFkZGluZzogMCA1cHg7IC8qIHNvIHRoZSBzbGlkZXIga25vYiBkb2Vzbid0IGJ1dHQgb3V0ICovCiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogdmFyKC0tc3RlcC1zbGlkZXIta25vYi1jb2xvcik7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogdmFyKC0tc3RlcC1zbGlkZXIta25vYi1jb2xvcik7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tc3RlcC1zbGlkZXIta25vYi1jb2xvcik7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLEpSLnByb3RvdHlwZSwicnVuIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLEpSLnByb3RvdHlwZSwidGFnIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLEpSLnByb3RvdHlwZSwic2FtcGxlIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLEpSLnByb3RvdHlwZSwidG90YWxTYW1wbGVzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEpSLnByb3RvdHlwZSwidGFnTWV0YWRhdGEiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsZHIpXSxKUi5wcm90b3R5cGUsInJlcXVlc3RNYW5hZ2VyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLFhSKV0sSlIucHJvdG90eXBlLCJfbWV0YWRhdGFDYW5jZWxsZXIiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLEpSLnByb3RvdHlwZSwiX3N0ZXBzIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLEpSLnByb3RvdHlwZSwiX3N0ZXBJbmRleCIsdm9pZCAwKSx0KFtzKCJydW4iKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxKUi5wcm90b3R5cGUsIl9ydW5Db2xvciIsbnVsbCksdChbcygiX3N0ZXBzIiksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLEpSLnByb3RvdHlwZSwiX2hhc0F0TGVhc3RPbmVTdGVwIixudWxsKSx0KFtzKCJfc3RlcHMiKSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sSlIucHJvdG90eXBlLCJfaGFzTXVsdGlwbGVTdGVwcyIsbnVsbCksdChbcygiX3N0ZXBzIiksZSgiZGVzaWduOnR5cGUiLE51bWJlciksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sSlIucHJvdG90eXBlLCJfbWF4U3RlcEluZGV4IixudWxsKSx0KFtzKCJfc3RlcHMiLCJfc3RlcEluZGV4IiksZSgiZGVzaWduOnR5cGUiLE9iamVjdCksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sSlIucHJvdG90eXBlLCJfY3VycmVudERhdHVtIixudWxsKSx0KFtzKCJzYW1wbGUiKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxKUi5wcm90b3R5cGUsIl9zYW1wbGVUZXh0IixudWxsKSx0KFtzKCJ0b3RhbFNhbXBsZXMiKSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sSlIucHJvdG90eXBlLCJfaGFzTXVsdGlwbGVTYW1wbGVzIixudWxsKSx0KFthKCJydW4iLCJ0YWciKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLEpSLnByb3RvdHlwZSwiX3JlbG9hZE9uUnVuVGFnQ2hhbmdlIixudWxsKSxKUj10KFtpKCJ0Zi1hdWRpby1sb2FkZXIiKV0sSlIpO2xldCBRUj1jbGFzcyBleHRlbmRzKGVyKHllKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMucmVsb2FkT25SZWFkeT0hMCx0aGlzLl90YWdGaWx0ZXI9IiIsdGhpcy5fcmVxdWVzdE1hbmFnZXI9bmV3IGRyfXJlYWR5KCl7c3VwZXIucmVhZHkoKSx0aGlzLnJlbG9hZE9uUmVhZHkmJnRoaXMucmVsb2FkKCl9cmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKCk9Pnt0aGlzLl9yZWxvYWRBdWRpbygpfSkpfV9mZXRjaFRhZ3MoKXtjb25zdCB0PV9yKCkucGx1Z2luUm91dGUoImF1ZGlvIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0KS50aGVuKCh0PT57aWYoU2UuZXhwb3J0cy5pc0VxdWFsKHQsdGhpcy5fcnVuVG9UYWdJbmZvKSlyZXR1cm47Y29uc3QgZT1hcihTZS5leHBvcnRzLm1hcFZhbHVlcyh0LCh0PT5PYmplY3Qua2V5cyh0KSkpKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWUubGVuZ3RoKSx0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsdCl9KSl9X3JlbG9hZEF1ZGlvKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWF1ZGlvLWxvYWRlciIpLmZvckVhY2goKHQ9Pnt0LnJlbG9hZCgpfSkpfV9zaG91bGRPcGVuKHQpe3JldHVybiB0PD0yfWdldCBfY2F0ZWdvcmllcygpe3ZhciB0PXRoaXMuX3J1blRvVGFnSW5mbyxlPXRoaXMuX3NlbGVjdGVkUnVucyxuPXRoaXMuX3RhZ0ZpbHRlcjtmdW5jdGlvbiBpKGUpe2NvbnN0IG49dFtlLnJ1bl1bZS50YWddLnNhbXBsZXM7cmV0dXJuIFNlLmV4cG9ydHMucmFuZ2UobikubWFwKCh0PT5PYmplY3QuYXNzaWduKHt9LGUse3NhbXBsZTp0LHRvdGFsU2FtcGxlczpufSkpKX1yZXR1cm4gTXIoU2UuZXhwb3J0cy5tYXBWYWx1ZXModCwodD0+T2JqZWN0LmtleXModCkpKSxlLG4pLm1hcCgodD0+T2JqZWN0LmFzc2lnbih7fSx0LHtpdGVtczpbXS5jb25jYXQuYXBwbHkoW10sdC5pdGVtcy5tYXAoaSkpfSkpKX1fdGFnTWV0YWRhdGEodCxlLG4pe3JldHVybiB0W2VdW25dfX07UVIudGVtcGxhdGU9X2VgCiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3IKICAgICAgICAgICAgaWQ9InJ1bnMtc2VsZWN0b3IiCiAgICAgICAgICAgIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319IgogICAgICAgICAgPjwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBhdWRpbyBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6PC9wPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgYXVkaW8gZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiCiAgICAgICAgICAgICAgICA+UkVBRE1FPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIgogICAgICAgICAgICAgICAgPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hCiAgICAgICAgICAgICAgPi4KICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyIKICAgICAgICAgICAgICAgID50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcKICAgICAgICAgICAgICBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIgogICAgICAgICAgICAgIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLWF1ZGlvLWxvYWRlcgogICAgICAgICAgICAgICAgICBhY3RpdmU9IltbYWN0aXZlXV0iCiAgICAgICAgICAgICAgICAgIHJ1bj0iW1tpdGVtLnJ1bl1dIgogICAgICAgICAgICAgICAgICB0YWc9IltbaXRlbS50YWddXSIKICAgICAgICAgICAgICAgICAgc2FtcGxlPSJbW2l0ZW0uc2FtcGxlXV0iCiAgICAgICAgICAgICAgICAgIHRvdGFsLXNhbXBsZXM9IltbaXRlbS50b3RhbFNhbXBsZXNdXSIKICAgICAgICAgICAgICAgICAgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iCiAgICAgICAgICAgICAgICAgIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgICAgICAgICAgID48L3RmLWF1ZGlvLWxvYWRlcj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxRUi5wcm90b3R5cGUsInJlbG9hZE9uUmVhZHkiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLFFSLnByb3RvdHlwZSwiX3NlbGVjdGVkUnVucyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxRUi5wcm90b3R5cGUsIl9ydW5Ub1RhZ0luZm8iLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxRUi5wcm90b3R5cGUsIl9kYXRhTm90Rm91bmQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sUVIucHJvdG90eXBlLCJfdGFnRmlsdGVyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLGRyKV0sUVIucHJvdG90eXBlLCJfcmVxdWVzdE1hbmFnZXIiLHZvaWQgMCksdChbcygiX3J1blRvVGFnSW5mbyIsIl9zZWxlY3RlZFJ1bnMiLCJfdGFnRmlsdGVyIiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxRUi5wcm90b3R5cGUsIl9jYXRlZ29yaWVzIixudWxsKSxRUj10KFtpKCJ0Zi1hdWRpby1kYXNoYm9hcmQiKV0sUVIpO2xldCB0Tz1jbGFzcyBleHRlbmRzKGVyKHllKSl7YXR0YWNoZWQoKXt0aGlzLmFzeW5jKChmdW5jdGlvbigpe3RoaXMuZ2V0RWZmZWN0aXZlQ2hpbGRyZW4oKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3RoaXMubGlzdGVuKHQsInRhcCIsIl9zZWxlY3RUYXJnZXQiKX0uYmluZCh0aGlzKSl9KSl9X3NlbGVjdFRhcmdldCh0KXt0aGlzLnNlbGVjdGVkSWQ9dC5jdXJyZW50VGFyZ2V0LmlkfV9zZWxlY3RlZElkQ2hhbmdlZCgpe3ZhciB0PXRoaXMucXVlcnlFZmZlY3RpdmVDaGlsZHJlbigiIyIrdGhpcy5zZWxlY3RlZElkKTt0JiYodGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LnJlbW92ZSgic2VsZWN0ZWQiKX0pKSx0LmNsYXNzTGlzdC5hZGQoInNlbGVjdGVkIikpfX07ZnVuY3Rpb24gZU8odCxlKXtsZXQgbjtjb25zdCBpPXt9O3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChlPT57Y29uc3Qgcj10W2VdO3ZvaWQgMD09PW4mJihuPXIuZGlzcGxheU5hbWUpLG4hPT1yLmRpc3BsYXlOYW1lJiYobj1udWxsKSx2b2lkIDA9PT1pW3IuZGVzY3JpcHRpb25dJiYoaVtyLmRlc2NyaXB0aW9uXT1bXSksaVtyLmRlc2NyaXB0aW9uXS5wdXNoKGUpfSkpLHtkaXNwbGF5TmFtZTpudWxsIT1uP246ZSxkZXNjcmlwdGlvbjooKCk9Pntjb25zdCB0PU9iamVjdC5rZXlzKGkpO3JldHVybiAwPT09dC5sZW5ndGg/IiI6MT09PXQubGVuZ3RoP3RbMF06YDxwPjxzdHJvbmc+TXVsdGlwbGUgZGVzY3JpcHRpb25zOjwvc3Ryb25nPjwvcD48dWw+JHt0Lm1hcCgodD0+e2NvbnN0IGU9aVt0XS5tYXAoKHQ9PmA8Y29kZT4ke3QucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvJi9nLCImYW1wOyIpfTwvY29kZT5gKSksbj1lLmxlbmd0aD4yP2Uuc2xpY2UoMCxlLmxlbmd0aC0xKS5qb2luKCIsICIpKyIsIGFuZCAiK2VbZS5sZW5ndGgtMV06ZS5qb2luKCIgYW5kICIpO3JldHVybmA8bGk+PHA+Rm9yICR7KGZ1bmN0aW9uIHIodCxlLG4pe3JldHVybiAxPT09dD9lOm59KShlLmxlbmd0aCwicnVuIiwicnVucyIpfSAke259OjwvcD4ke3R9PC9saT5gfSkpLmpvaW4oIiIpfTwvdWw+YH0pKCl9fXRPLnRlbXBsYXRlPV9lYAogICAgPGRpdiBpZD0id3JhcCI+CiAgICAgIDxoMz5bW25hbWVdXTwvaDM+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQtd3JhcHBlciI+PHNsb3Q+PC9zbG90PjwvZGl2PgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIC5jb250ZW50LXdyYXBwZXIgOjpzbG90dGVkKCopIHsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5jb250ZW50LXdyYXBwZXIgOjpzbG90dGVkKCopIHsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5jb250ZW50LXdyYXBwZXIgOjpzbG90dGVkKC5zZWxlY3RlZCkgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICBjb2xvcjogd2hpdGUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgaDMgewogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1zZWNvbmRhcnktdGV4dC1jb2xvcik7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgbWFyZ2luOiAwIDAgNXB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sdE8ucHJvdG90eXBlLCJuYW1lIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLG5vdGlmeTohMCxvYnNlcnZlcjoiX3NlbGVjdGVkSWRDaGFuZ2VkIn0pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx0Ty5wcm90b3R5cGUsInNlbGVjdGVkSWQiLHZvaWQgMCksdE89dChbaSgidGYtb3B0aW9uLXNlbGVjdG9yIildLHRPKTtsZXQgbk89Y2xhc3MgZXh0ZW5kcyB5ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy53ZWlnaHQ9LjYsdGhpcy5fdXBkYXRlV2VpZ2h0PVNlLmV4cG9ydHMuZGVib3VuY2UoKGZ1bmN0aW9uKHQpe3RoaXMud2VpZ2h0PXR9KSwyNTApfV9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlckNoYW5nZWQoKXt0aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ9dGhpcy5faW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXIudG9TdHJpbmcoKSx0aGlzLl91cGRhdGVXZWlnaHQuY2FsbCh0aGlzLHRoaXMuX2ltbWVkaWF0ZVdlaWdodE51bWJlckZvclBhcGVyU2xpZGVyKX1faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0Q2hhbmdlZCgpeyt0aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ8MD90aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ9IjAiOit0aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ+MSYmKHRoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dD0iMSIpO3ZhciB0PSt0aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ7aXNOYU4odCl8fHRoaXMuX3VwZGF0ZVdlaWdodC5jYWxsKHRoaXMsdCl9fTtmdW5jdGlvbiBpTyh0LGUpe2NvbnN0IG49T2JqZWN0LmtleXMoZSkuc29ydCgpLmZpbHRlcigodD0+dm9pZCAwIT09ZVt0XSkpO2lmKCFuLmxlbmd0aClyZXR1cm4gdDtjb25zdCBpPS0xIT09dC5pbmRleE9mKCI/Iik/IiYiOiI/IjtyZXR1cm4gdCtpK1tdLmNvbmNhdCguLi5uLm1hcCgodD0+e2NvbnN0IG49ZVt0XTtyZXR1cm4oQXJyYXkuaXNBcnJheShuKT9uOltuXSkubWFwKChlPT5gJHt0fT0keyhmdW5jdGlvbiBuKHQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQodCkucmVwbGFjZSgvXCgvZywiJTI4IikucmVwbGFjZSgvXCkvZywiJTI5Iil9KShlKX1gKSl9KSkpLmpvaW4oIiYiKX1uTy50ZW1wbGF0ZT1fZWAKICAgIDxoMyBjbGFzcz0idGl0bGUiPlNtb290aGluZzwvaDM+CiAgICA8ZGl2IGNsYXNzPSJzbW9vdGhpbmctYmxvY2siPgogICAgICA8cGFwZXItc2xpZGVyCiAgICAgICAgaWQ9InNsaWRlciIKICAgICAgICBpbW1lZGlhdGUtdmFsdWU9Int7X2ltbWVkaWF0ZVdlaWdodE51bWJlckZvclBhcGVyU2xpZGVyfX0iCiAgICAgICAgbWF4PSJbW21heF1dIgogICAgICAgIG1pbj0iW1ttaW5dXSIKICAgICAgICBwaW4KICAgICAgICBzdGVwPSJbW3N0ZXBdXSIKICAgICAgICB0eXBlPSJudW1iZXIiCiAgICAgICAgdmFsdWU9Int7d2VpZ2h0fX0iCiAgICAgID48L3BhcGVyLXNsaWRlcj4KICAgICAgPHBhcGVyLWlucHV0CiAgICAgICAgaWQ9ImlucHV0IgogICAgICAgIGxhYmVsPSJ3ZWlnaHQiCiAgICAgICAgbm8tbGFiZWwtZmxvYXQKICAgICAgICB2YWx1ZT0ie3tfaW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0fX0iCiAgICAgICAgdHlwZT0ibnVtYmVyIgogICAgICAgIHN0ZXA9Iltbc3RlcF1dIgogICAgICAgIG1pbj0iW1ttaW5dXSIKICAgICAgICBtYXg9IltbbWF4XV0iCiAgICAgID48L3BhcGVyLWlucHV0PgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIC50aXRsZSB7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXNlY29uZGFyeS10ZXh0LWNvbG9yKTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICB9CgogICAgICAuc21vb3RoaW5nLWJsb2NrIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICBmbGV4LWdyb3c6IDI7CiAgICAgIH0KCiAgICAgIHBhcGVyLWlucHV0IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgICAgd2lkdGg6IDYwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxuTy5wcm90b3R5cGUsInN0ZXAiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sbk8ucHJvdG90eXBlLCJtYXgiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sbk8ucHJvdG90eXBlLCJtaW4iLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLG5PLnByb3RvdHlwZSwid2VpZ2h0Iix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLG5vdGlmeTohMCxvYnNlcnZlcjoiX2ltbWVkaWF0ZVdlaWdodE51bWJlckZvclBhcGVyU2xpZGVyQ2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sbk8ucHJvdG90eXBlLCJfaW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXIiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLG9ic2VydmVyOiJfaW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0Q2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sbk8ucHJvdG90eXBlLCJfaW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0Iix2b2lkIDApLG5PPXQoW2koInRmLXNtb290aGluZy1pbnB1dCIpXSxuTyk7dmFyIHJPPXt9LG9PPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxhTz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbiB0KGUpe2Zvcih2YXIgbixpPTEscj1hcmd1bWVudHMubGVuZ3RoO2k8cjtpKyspZm9yKHZhciBvIGluIG49YXJndW1lbnRzW2ldKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLG8pJiYoZVtvXT1uW29dKTtyZXR1cm4gZX07Ci8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlCiAgICB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZQogICAgTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBUSElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCiAgICBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVECiAgICBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLAogICAgTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC4KCiAgICBTZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKICAgIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovZnVuY3Rpb24gc08odCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdLG49MDtyZXR1cm4gZT9lLmNhbGwodCk6e25leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdCYmbj49dC5sZW5ndGgmJih0PXZvaWQgMCkse3ZhbHVlOnQmJnRbbisrXSxkb25lOiF0fX19fWZ1bmN0aW9uIGxPKHQsZSl7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdO2lmKCFuKXJldHVybiB0O3ZhciBpLHIsbz1uLmNhbGwodCksYT1bXTt0cnl7Zm9yKDsodm9pZCAwPT09ZXx8ZS0tID4wKSYmIShpPW8ubmV4dCgpKS5kb25lOylhLnB1c2goaS52YWx1ZSl9Y2F0Y2godCl7cj17ZXJyb3I6dH19ZmluYWxseXt0cnl7aSYmIWkuZG9uZSYmKG49by5yZXR1cm4pJiZuLmNhbGwobyl9ZmluYWxseXtpZihyKXRocm93IHIuZXJyb3J9fXJldHVybiBhfWZ1bmN0aW9uIGNPKHQpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgY08/KHRoaXMudj10LHRoaXMpOm5ldyBjTyh0KX12YXIgdU89YmUoT2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsX19leHRlbmRzOmZ1bmN0aW9uIGhPKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1vTyh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0sX19hc3NpZ246YU8sX19yZXN0OmZ1bmN0aW9uIGRPKHQsZSl7dmFyIG49e307Zm9yKHZhciBpIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsaSkmJmUuaW5kZXhPZihpKTwwJiYobltpXT10W2ldKTtpZihudWxsIT10JiYiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9MDtmb3IoaT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO3I8aS5sZW5ndGg7cisrKWUuaW5kZXhPZihpW3JdKTwwJiYobltpW3JdXT10W2lbcl1dKX1yZXR1cm4gbn0sX19kZWNvcmF0ZTpmdW5jdGlvbiBwTyh0LGUsbixpKXt2YXIgcixvPWFyZ3VtZW50cy5sZW5ndGgsYT1vPDM/ZTpudWxsPT09aT9pPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxuKTppO2lmKCJvYmplY3QiPT10eXBlb2YgUmVmbGVjdCYmImZ1bmN0aW9uIj09dHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUpYT1SZWZsZWN0LmRlY29yYXRlKHQsZSxuLGkpO2Vsc2UgZm9yKHZhciBzPXQubGVuZ3RoLTE7cz49MDtzLS0pKHI9dFtzXSkmJihhPShvPDM/cihhKTpvPjM/cihlLG4sYSk6cihlLG4pKXx8YSk7cmV0dXJuIG8+MyYmYSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbixhKSxhfSxfX3BhcmFtOmZ1bmN0aW9uIGZPKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSl7ZShuLGksdCl9fSxfX21ldGFkYXRhOmZ1bmN0aW9uIG1PKHQsZSl7aWYoIm9iamVjdCI9PXR5cGVvZiBSZWZsZWN0JiYiZnVuY3Rpb24iPT10eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSlyZXR1cm4gUmVmbGVjdC5tZXRhZGF0YSh0LGUpfSxfX2F3YWl0ZXI6ZnVuY3Rpb24gZ08odCxlLG4saSl7cmV0dXJuIG5ldyhufHwobj1Qcm9taXNlKSkoKGZ1bmN0aW9uKHIsbyl7ZnVuY3Rpb24gYSh0KXt0cnl7bChpLm5leHQodCkpfWNhdGNoKHQpe28odCl9fWZ1bmN0aW9uIHModCl7dHJ5e2woaS50aHJvdyh0KSl9Y2F0Y2godCl7byh0KX19ZnVuY3Rpb24gbCh0KXt0LmRvbmU/cih0LnZhbHVlKTpuZXcgbigoZnVuY3Rpb24oZSl7ZSh0LnZhbHVlKX0pKS50aGVuKGEscyl9bCgoaT1pLmFwcGx5KHQsZXx8W10pKS5uZXh0KCkpfSkpfSxfX2dlbmVyYXRvcjpmdW5jdGlvbiBfTyh0LGUpe3ZhciBuLGkscixvLGE9e2xhYmVsOjAsc2VudDpmdW5jdGlvbigpe2lmKDEmclswXSl0aHJvdyByWzFdO3JldHVybiByWzFdfSx0cnlzOltdLG9wczpbXX07cmV0dXJuIG89e25leHQ6cygwKSx0aHJvdzpzKDEpLHJldHVybjpzKDIpfSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYob1tTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxvO2Z1bmN0aW9uIHMobyl7cmV0dXJuIGZ1bmN0aW9uKHMpe3JldHVybihmdW5jdGlvbiBsKG8pe2lmKG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLiIpO2Zvcig7YTspdHJ5e2lmKG49MSxpJiYocj1pWzImb1swXT8icmV0dXJuIjpvWzBdPyJ0aHJvdyI6Im5leHQiXSkmJiEocj1yLmNhbGwoaSxvWzFdKSkuZG9uZSlyZXR1cm4gcjtzd2l0Y2goaT0wLHImJihvPVswLHIudmFsdWVdKSxvWzBdKXtjYXNlIDA6Y2FzZSAxOnI9bzticmVhaztjYXNlIDQ6cmV0dXJuIGEubGFiZWwrKyx7dmFsdWU6b1sxXSxkb25lOiExfTtjYXNlIDU6YS5sYWJlbCsrLGk9b1sxXSxvPVswXTtjb250aW51ZTtjYXNlIDc6bz1hLm9wcy5wb3AoKSxhLnRyeXMucG9wKCk7Y29udGludWU7ZGVmYXVsdDppZighKChyPShyPWEudHJ5cykubGVuZ3RoPjAmJnJbci5sZW5ndGgtMV0pfHw2IT09b1swXSYmMiE9PW9bMF0pKXthPTA7Y29udGludWV9aWYoMz09PW9bMF0mJighcnx8b1sxXT5yWzBdJiZvWzFdPHJbM10pKXthLmxhYmVsPW9bMV07YnJlYWt9aWYoNj09PW9bMF0mJmEubGFiZWw8clsxXSl7YS5sYWJlbD1yWzFdLHI9bzticmVha31pZihyJiZhLmxhYmVsPHJbMl0pe2EubGFiZWw9clsyXSxhLm9wcy5wdXNoKG8pO2JyZWFrfXJbMl0mJmEub3BzLnBvcCgpLGEudHJ5cy5wb3AoKTtjb250aW51ZX1vPWUuY2FsbCh0LGEpfWNhdGNoKHQpe289WzYsdF0saT0wfWZpbmFsbHl7bj1yPTB9aWYoNSZvWzBdKXRocm93IG9bMV07cmV0dXJue3ZhbHVlOm9bMF0/b1sxXTp2b2lkIDAsZG9uZTohMH19KShbbyxzXSl9fX0sX19leHBvcnRTdGFyOmZ1bmN0aW9uIHlPKHQsZSl7Zm9yKHZhciBuIGluIHQpZS5oYXNPd25Qcm9wZXJ0eShuKXx8KGVbbl09dFtuXSl9LF9fdmFsdWVzOnNPLF9fcmVhZDpsTyxfX3NwcmVhZDpmdW5jdGlvbiB2Tygpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0PXQuY29uY2F0KGxPKGFyZ3VtZW50c1tlXSkpO3JldHVybiB0fSxfX2F3YWl0OmNPLF9fYXN5bmNHZW5lcmF0b3I6ZnVuY3Rpb24gYk8odCxlLG4pe2lmKCFTeW1ib2wuYXN5bmNJdGVyYXRvcil0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTt2YXIgaSxyPW4uYXBwbHkodCxlfHxbXSksbz1bXTtyZXR1cm4gaT17fSxhKCJuZXh0IiksYSgidGhyb3ciKSxhKCJyZXR1cm4iKSxpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxpO2Z1bmN0aW9uIGEodCl7clt0XSYmKGlbdF09ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihuLGkpe28ucHVzaChbdCxlLG4saV0pPjF8fHModCxlKX0pKX0pfWZ1bmN0aW9uIHModCxlKXt0cnl7IShmdW5jdGlvbiBuKHQpe3QudmFsdWUgaW5zdGFuY2VvZiBjTz9Qcm9taXNlLnJlc29sdmUodC52YWx1ZS52KS50aGVuKGwsYyk6dShvWzBdWzJdLHQpfSkoclt0XShlKSl9Y2F0Y2godCl7dShvWzBdWzNdLHQpfX1mdW5jdGlvbiBsKHQpe3MoIm5leHQiLHQpfWZ1bmN0aW9uIGModCl7cygidGhyb3ciLHQpfWZ1bmN0aW9uIHUodCxlKXt0KGUpLG8uc2hpZnQoKSxvLmxlbmd0aCYmcyhvWzBdWzBdLG9bMF1bMV0pfX0sX19hc3luY0RlbGVnYXRvcjpmdW5jdGlvbiB4Tyh0KXt2YXIgZSxuO3JldHVybiBlPXt9LGkoIm5leHQiKSxpKCJ0aHJvdyIsKGZ1bmN0aW9uKHQpe3Rocm93IHR9KSksaSgicmV0dXJuIiksZVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGU7ZnVuY3Rpb24gaShpLHIpe3RbaV0mJihlW2ldPWZ1bmN0aW9uKGUpe3JldHVybihuPSFuKT97dmFsdWU6Y08odFtpXShlKSksZG9uZToicmV0dXJuIj09PWl9OnI/cihlKTplfSl9fSxfX2FzeW5jVmFsdWVzOmZ1bmN0aW9uIHdPKHQpe2lmKCFTeW1ib2wuYXN5bmNJdGVyYXRvcil0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTt2YXIgZT10W1N5bWJvbC5hc3luY0l0ZXJhdG9yXTtyZXR1cm4gZT9lLmNhbGwodCk6c08odCl9LF9fbWFrZVRlbXBsYXRlT2JqZWN0OmZ1bmN0aW9uIFNPKHQsZSl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eT9PYmplY3QuZGVmaW5lUHJvcGVydHkodCwicmF3Iix7dmFsdWU6ZX0pOnQucmF3PWUsdH19KSk7ZnVuY3Rpb24gTU8odCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOnQ+PWU/MDpOYU59ZnVuY3Rpb24gRU8odCl7cmV0dXJuIDE9PT10Lmxlbmd0aCYmKHQ9KGZ1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuIE1PKHQoZSksbil9fSkodCkpLHtsZWZ0OmZ1bmN0aW9uKGUsbixpLHIpe2ZvcihudWxsPT1pJiYoaT0wKSxudWxsPT1yJiYocj1lLmxlbmd0aCk7aTxyOyl7dmFyIG89aStyPj4+MTt0KGVbb10sbik8MD9pPW8rMTpyPW99cmV0dXJuIGl9LHJpZ2h0OmZ1bmN0aW9uKGUsbixpLHIpe2ZvcihudWxsPT1pJiYoaT0wKSxudWxsPT1yJiYocj1lLmxlbmd0aCk7aTxyOyl7dmFyIG89aStyPj4+MTt0KGVbb10sbik+MD9yPW86aT1vKzF9cmV0dXJuIGl9fX12YXIgVE89RU8oTU8pLENPPVRPLnJpZ2h0LEFPPVRPLmxlZnQ7ZnVuY3Rpb24ga08odCxlKXtyZXR1cm5bdCxlXX1mdW5jdGlvbiBMTyh0KXtyZXR1cm4gbnVsbD09PXQ/TmFOOit0fWZ1bmN0aW9uIFBPKHQsZSl7dmFyIG4saSxyPXQubGVuZ3RoLG89MCxhPS0xLHM9MCxsPTA7aWYobnVsbD09ZSlmb3IoOysrYTxyOylpc05hTihuPUxPKHRbYV0pKXx8KGwrPShpPW4tcykqKG4tKHMrPWkvKytvKSkpO2Vsc2UgZm9yKDsrK2E8cjspaXNOYU4obj1MTyhlKHRbYV0sYSx0KSkpfHwobCs9KGk9bi1zKSoobi0ocys9aS8rK28pKSk7aWYobz4xKXJldHVybiBsLyhvLTEpfWZ1bmN0aW9uIE5PKHQsZSl7dmFyIG49UE8odCxlKTtyZXR1cm4gbj9NYXRoLnNxcnQobik6bn1mdW5jdGlvbiBJTyh0LGUpe3ZhciBuLGkscixvPXQubGVuZ3RoLGE9LTE7aWYobnVsbD09ZSl7Zm9yKDsrK2E8bzspaWYobnVsbCE9KG49dFthXSkmJm4+PW4pZm9yKGk9cj1uOysrYTxvOyludWxsIT0obj10W2FdKSYmKGk+biYmKGk9bikscjxuJiYocj1uKSl9ZWxzZSBmb3IoOysrYTxvOylpZihudWxsIT0obj1lKHRbYV0sYSx0KSkmJm4+PW4pZm9yKGk9cj1uOysrYTxvOyludWxsIT0obj1lKHRbYV0sYSx0KSkmJihpPm4mJihpPW4pLHI8biYmKHI9bikpO3JldHVybltpLHJdfXZhciBSTz1BcnJheS5wcm90b3R5cGUsT089Uk8uc2xpY2Usek89Uk8ubWFwO2Z1bmN0aW9uIERPKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBCTyh0KXtyZXR1cm4gdH1mdW5jdGlvbiBITyh0LGUsbil7dD0rdCxlPStlLG49KHI9YXJndW1lbnRzLmxlbmd0aCk8Mj8oZT10LHQ9MCwxKTpyPDM/MTorbjtmb3IodmFyIGk9LTEscj0wfE1hdGgubWF4KDAsTWF0aC5jZWlsKChlLXQpL24pKSxvPW5ldyBBcnJheShyKTsrK2k8cjspb1tpXT10K2kqbjtyZXR1cm4gb312YXIgRk89TWF0aC5zcXJ0KDUwKSxWTz1NYXRoLnNxcnQoMTApLFVPPU1hdGguc3FydCgyKTtmdW5jdGlvbiBqTyh0LGUsbil7dmFyIGk9KGUtdCkvTWF0aC5tYXgoMCxuKSxyPU1hdGguZmxvb3IoTWF0aC5sb2coaSkvTWF0aC5MTjEwKSxvPWkvTWF0aC5wb3coMTAscik7cmV0dXJuIHI+PTA/KG8+PUZPPzEwOm8+PVZPPzU6bz49VU8/MjoxKSpNYXRoLnBvdygxMCxyKTotTWF0aC5wb3coMTAsLXIpLyhvPj1GTz8xMDpvPj1WTz81Om8+PVVPPzI6MSl9ZnVuY3Rpb24gR08odCxlLG4pe3ZhciBpPU1hdGguYWJzKGUtdCkvTWF0aC5tYXgoMCxuKSxyPU1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2coaSkvTWF0aC5MTjEwKSksbz1pL3I7cmV0dXJuIG8+PUZPP3IqPTEwOm8+PVZPP3IqPTU6bz49VU8mJihyKj0yKSxlPHQ/LXI6cn1mdW5jdGlvbiBXTyh0KXtyZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nKHQubGVuZ3RoKS9NYXRoLkxOMikrMX1mdW5jdGlvbiBxTyh0LGUsbil7aWYobnVsbD09biYmKG49TE8pLGk9dC5sZW5ndGgpe2lmKChlPStlKTw9MHx8aTwyKXJldHVybituKHRbMF0sMCx0KTtpZihlPj0xKXJldHVybituKHRbaS0xXSxpLTEsdCk7dmFyIGkscj0oaS0xKSplLG89TWF0aC5mbG9vcihyKSxhPStuKHRbb10sbyx0KTtyZXR1cm4gYSsoK24odFtvKzFdLG8rMSx0KS1hKSooci1vKX19ZnVuY3Rpb24gWU8odCxlKXt2YXIgbixpLHI9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1lKXtmb3IoOysrbzxyOylpZihudWxsIT0obj10W29dKSYmbj49bilmb3IoaT1uOysrbzxyOyludWxsIT0obj10W29dKSYmaT5uJiYoaT1uKX1lbHNlIGZvcig7KytvPHI7KWlmKG51bGwhPShuPWUodFtvXSxvLHQpKSYmbj49bilmb3IoaT1uOysrbzxyOyludWxsIT0obj1lKHRbb10sbyx0KSkmJmk+biYmKGk9bik7cmV0dXJuIGl9ZnVuY3Rpb24gWE8odCl7aWYoIShyPXQubGVuZ3RoKSlyZXR1cm5bXTtmb3IodmFyIGU9LTEsbj1ZTyh0LCRPKSxpPW5ldyBBcnJheShuKTsrK2U8bjspZm9yKHZhciByLG89LTEsYT1pW2VdPW5ldyBBcnJheShyKTsrK288cjspYVtvXT10W29dW2VdO3JldHVybiBpfWZ1bmN0aW9uICRPKHQpe3JldHVybiB0Lmxlbmd0aH12YXIgS089QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIFpPKHQpe3JldHVybiB0fXZhciBKTz0xZS02O2Z1bmN0aW9uIFFPKHQpe3JldHVybiJ0cmFuc2xhdGUoIisodCsuNSkrIiwwKSJ9ZnVuY3Rpb24gdHoodCl7cmV0dXJuInRyYW5zbGF0ZSgwLCIrKHQrLjUpKyIpIn1mdW5jdGlvbiBleih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuK3QoZSl9fWZ1bmN0aW9uIG56KHQpe3ZhciBlPU1hdGgubWF4KDAsdC5iYW5kd2lkdGgoKS0xKS8yO3JldHVybiB0LnJvdW5kKCkmJihlPU1hdGgucm91bmQoZSkpLGZ1bmN0aW9uKG4pe3JldHVybit0KG4pK2V9fWZ1bmN0aW9uIGl6KCl7cmV0dXJuIXRoaXMuX19heGlzfWZ1bmN0aW9uIHJ6KHQsZSl7dmFyIG49W10saT1udWxsLHI9bnVsbCxvPTYsYT02LHM9MyxsPTE9PT10fHw0PT09dD8tMToxLGM9ND09PXR8fDI9PT10PyJ4IjoieSIsdT0xPT09dHx8Mz09PXQ/UU86dHo7ZnVuY3Rpb24gaChoKXt2YXIgZD1udWxsPT1pP2UudGlja3M/ZS50aWNrcy5hcHBseShlLG4pOmUuZG9tYWluKCk6aSxwPW51bGw9PXI/ZS50aWNrRm9ybWF0P2UudGlja0Zvcm1hdC5hcHBseShlLG4pOlpPOnIsZj1NYXRoLm1heChvLDApK3MsbT1lLnJhbmdlKCksZz0rbVswXSsuNSxfPSttW20ubGVuZ3RoLTFdKy41LHk9KGUuYmFuZHdpZHRoP256OmV6KShlLmNvcHkoKSksdj1oLnNlbGVjdGlvbj9oLnNlbGVjdGlvbigpOmgsYj12LnNlbGVjdEFsbCgiLmRvbWFpbiIpLmRhdGEoW251bGxdKSx4PXYuc2VsZWN0QWxsKCIudGljayIpLmRhdGEoZCxlKS5vcmRlcigpLHc9eC5leGl0KCksUz14LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJ0aWNrIiksTT14LnNlbGVjdCgibGluZSIpLEU9eC5zZWxlY3QoInRleHQiKTtiPWIubWVyZ2UoYi5lbnRlcigpLmluc2VydCgicGF0aCIsIi50aWNrIikuYXR0cigiY2xhc3MiLCJkb21haW4iKS5hdHRyKCJzdHJva2UiLCIjMDAwIikpLHg9eC5tZXJnZShTKSxNPU0ubWVyZ2UoUy5hcHBlbmQoImxpbmUiKS5hdHRyKCJzdHJva2UiLCIjMDAwIikuYXR0cihjKyIyIixsKm8pKSxFPUUubWVyZ2UoUy5hcHBlbmQoInRleHQiKS5hdHRyKCJmaWxsIiwiIzAwMCIpLmF0dHIoYyxsKmYpLmF0dHIoImR5IiwxPT09dD8iMGVtIjozPT09dD8iMC43MWVtIjoiMC4zMmVtIikpLGghPT12JiYoYj1iLnRyYW5zaXRpb24oaCkseD14LnRyYW5zaXRpb24oaCksTT1NLnRyYW5zaXRpb24oaCksRT1FLnRyYW5zaXRpb24oaCksdz13LnRyYW5zaXRpb24oaCkuYXR0cigib3BhY2l0eSIsSk8pLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PXkodCkpP3UodCk6dGhpcy5nZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIpfSkpLFMuYXR0cigib3BhY2l0eSIsSk8pLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucGFyZW50Tm9kZS5fX2F4aXM7cmV0dXJuIHUoZSYmaXNGaW5pdGUoZT1lKHQpKT9lOnkodCkpfSkpKSx3LnJlbW92ZSgpLGIuYXR0cigiZCIsND09PXR8fDI9PXQ/Ik0iK2wqYSsiLCIrZysiSDAuNVYiK18rIkgiK2wqYToiTSIrZysiLCIrbCphKyJWMC41SCIrXysiViIrbCphKSx4LmF0dHIoIm9wYWNpdHkiLDEpLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3JldHVybiB1KHkodCkpfSkpLE0uYXR0cihjKyIyIixsKm8pLEUuYXR0cihjLGwqZikudGV4dChwKSx2LmZpbHRlcihpeikuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJmb250LXNpemUiLDEwKS5hdHRyKCJmb250LWZhbWlseSIsInNhbnMtc2VyaWYiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsMj09PXQ/InN0YXJ0Ijo0PT09dD8iZW5kIjoibWlkZGxlIiksdi5lYWNoKChmdW5jdGlvbigpe3RoaXMuX19heGlzPXl9KSl9cmV0dXJuIGguc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxoKTplfSxoLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIG49S08uY2FsbChhcmd1bWVudHMpLGh9LGgudGlja0FyZ3VtZW50cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P1tdOktPLmNhbGwodCksaCk6bi5zbGljZSgpfSxoLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09dD9udWxsOktPLmNhbGwodCksaCk6aSYmaS5zbGljZSgpfSxoLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxoKTpyfSxoLnRpY2tTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWE9K3QsaCk6b30saC50aWNrU2l6ZUlubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSt0LGgpOm99LGgudGlja1NpemVPdXRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rdCxoKTphfSxoLnRpY2tQYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0LGgpOnN9LGh9dmFyIG96PXt2YWx1ZTpmdW5jdGlvbigpe319O2Z1bmN0aW9uIGF6KCl7Zm9yKHZhciB0LGU9MCxuPWFyZ3VtZW50cy5sZW5ndGgsaT17fTtlPG47KytlKXtpZighKHQ9YXJndW1lbnRzW2VdKyIiKXx8dCBpbiBpfHwvW1xzLl0vLnRlc3QodCkpdGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIHR5cGU6ICIrdCk7aVt0XT1bXX1yZXR1cm4gbmV3IHN6KGkpfWZ1bmN0aW9uIHN6KHQpe3RoaXMuXz10fWZ1bmN0aW9uIGx6KHQsZSl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcCgoZnVuY3Rpb24odCl7dmFyIG49IiIsaT10LmluZGV4T2YoIi4iKTtpZihpPj0wJiYobj10LnNsaWNlKGkrMSksdD10LnNsaWNlKDAsaSkpLHQmJiFlLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO3JldHVybnt0eXBlOnQsbmFtZTpufX0pKX1mdW5jdGlvbiBjeih0LGUpe2Zvcih2YXIgbixpPTAscj10Lmxlbmd0aDtpPHI7KytpKWlmKChuPXRbaV0pLm5hbWU9PT1lKXJldHVybiBuLnZhbHVlfWZ1bmN0aW9uIHV6KHQsZSxuKXtmb3IodmFyIGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpaWYodFtpXS5uYW1lPT09ZSl7dFtpXT1veix0PXQuc2xpY2UoMCxpKS5jb25jYXQodC5zbGljZShpKzEpKTticmVha31yZXR1cm4gbnVsbCE9biYmdC5wdXNoKHtuYW1lOmUsdmFsdWU6bn0pLHR9c3oucHJvdG90eXBlPWF6LnByb3RvdHlwZT17Y29uc3RydWN0b3I6c3osb246ZnVuY3Rpb24odCxlKXt2YXIgbixpPXRoaXMuXyxyPWx6KHQrIiIsaSksbz0tMSxhPXIubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7aWYobnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK2UpO2Zvcig7KytvPGE7KWlmKG49KHQ9cltvXSkudHlwZSlpW25dPXV6KGlbbl0sdC5uYW1lLGUpO2Vsc2UgaWYobnVsbD09ZSlmb3IobiBpbiBpKWlbbl09dXooaVtuXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK288YTspaWYoKG49KHQ9cltvXSkudHlwZSkmJihuPWN6KGlbbl0sdC5uYW1lKSkpcmV0dXJuIG59LGNvcHk6ZnVuY3Rpb24oKXt2YXIgdD17fSxlPXRoaXMuXztmb3IodmFyIG4gaW4gZSl0W25dPWVbbl0uc2xpY2UoKTtyZXR1cm4gbmV3IHN6KHQpfSxjYWxsOmZ1bmN0aW9uKHQsZSl7aWYoKG49YXJndW1lbnRzLmxlbmd0aC0yKT4wKWZvcih2YXIgbixpLHI9bmV3IEFycmF5KG4pLG89MDtvPG47KytvKXJbb109YXJndW1lbnRzW28rMl07aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3Iobz0wLG49KGk9dGhpcy5fW3RdKS5sZW5ndGg7bzxuOysrbylpW29dLnZhbHVlLmFwcGx5KGUscil9LGFwcGx5OmZ1bmN0aW9uKHQsZSxuKXtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2Zvcih2YXIgaT10aGlzLl9bdF0scj0wLG89aS5sZW5ndGg7cjxvOysrcilpW3JdLnZhbHVlLmFwcGx5KGUsbil9fTt2YXIgaHo9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLGR6PXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDpoeix4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyJ9O2Z1bmN0aW9uIHB6KHQpe3ZhciBlPXQrPSIiLG49ZS5pbmRleE9mKCI6Iik7cmV0dXJuIG4+PTAmJiJ4bWxucyIhPT0oZT10LnNsaWNlKDAsbikpJiYodD10LnNsaWNlKG4rMSkpLGR6Lmhhc093blByb3BlcnR5KGUpP3tzcGFjZTpkeltlXSxsb2NhbDp0fTp0fWZ1bmN0aW9uIGZ6KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMub3duZXJEb2N1bWVudCxuPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBuPT09aHomJmUuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PWh6P2UuY3JlYXRlRWxlbWVudCh0KTplLmNyZWF0ZUVsZW1lbnROUyhuLHQpfX1mdW5jdGlvbiBteih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBneih0KXt2YXIgZT1weih0KTtyZXR1cm4oZS5sb2NhbD9tejpmeikoZSl9ZnVuY3Rpb24gX3ooKXt9ZnVuY3Rpb24geXoodCl7cmV0dXJuIG51bGw9PXQ/X3o6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpfX1mdW5jdGlvbiB2eigpe3JldHVybltdfWZ1bmN0aW9uIGJ6KHQpe3JldHVybiBudWxsPT10P3Z6OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbCh0KX19ZnVuY3Rpb24geHoodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2hlcyh0KX19ZnVuY3Rpb24gd3oodCl7cmV0dXJuIG5ldyBBcnJheSh0Lmxlbmd0aCl9ZnVuY3Rpb24gU3oodCxlKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPWV9ZnVuY3Rpb24gTXoodCxlLG4saSxyLG8pe2Zvcih2YXIgYSxzPTAsbD1lLmxlbmd0aCxjPW8ubGVuZ3RoO3M8YzsrK3MpKGE9ZVtzXSk/KGEuX19kYXRhX189b1tzXSxpW3NdPWEpOm5bc109bmV3IFN6KHQsb1tzXSk7Zm9yKDtzPGw7KytzKShhPWVbc10pJiYocltzXT1hKX1mdW5jdGlvbiBFeih0LGUsbixpLHIsbyxhKXt2YXIgcyxsLGMsdT17fSxoPWUubGVuZ3RoLGQ9by5sZW5ndGgscD1uZXcgQXJyYXkoaCk7Zm9yKHM9MDtzPGg7KytzKShsPWVbc10pJiYocFtzXT1jPSIkIithLmNhbGwobCxsLl9fZGF0YV9fLHMsZSksYyBpbiB1P3Jbc109bDp1W2NdPWwpO2ZvcihzPTA7czxkOysrcykobD11W2M9IiQiK2EuY2FsbCh0LG9bc10scyxvKV0pPyhpW3NdPWwsbC5fX2RhdGFfXz1vW3NdLHVbY109bnVsbCk6bltzXT1uZXcgU3oodCxvW3NdKTtmb3Iocz0wO3M8aDsrK3MpKGw9ZVtzXSkmJnVbcFtzXV09PT1sJiYocltzXT1sKX1mdW5jdGlvbiBUeih0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6dD49ZT8wOk5hTn1mdW5jdGlvbiBDeih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19ZnVuY3Rpb24gQXoodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBreih0LGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKHQsZSl9fWZ1bmN0aW9uIEx6KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsZSl9fWZ1bmN0aW9uIFB6KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj90aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KTp0aGlzLnNldEF0dHJpYnV0ZSh0LG4pfX1mdW5jdGlvbiBOeih0LGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PW4/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLG4pfX1mdW5jdGlvbiBJeih0KXtyZXR1cm4gdC5vd25lckRvY3VtZW50JiZ0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHQuZG9jdW1lbnQmJnR8fHQuZGVmYXVsdFZpZXd9ZnVuY3Rpb24gUnoodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KX19ZnVuY3Rpb24gT3oodCxlLG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxlLG4pfX1mdW5jdGlvbiB6eih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09aT90aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpOnRoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxpLG4pfX1mdW5jdGlvbiBEeih0LGUpe3JldHVybiB0LnN0eWxlLmdldFByb3BlcnR5VmFsdWUoZSl8fEl6KHQpLmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKGUpfWZ1bmN0aW9uIEJ6KHQpe3JldHVybiBmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW3RdfX1mdW5jdGlvbiBIeih0LGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXNbdF09ZX19ZnVuY3Rpb24gRnoodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP2RlbGV0ZSB0aGlzW3RdOnRoaXNbdF09bn19ZnVuY3Rpb24gVnoodCl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uIFV6KHQpe3JldHVybiB0LmNsYXNzTGlzdHx8bmV3IGp6KHQpfWZ1bmN0aW9uIGp6KHQpe3RoaXMuX25vZGU9dCx0aGlzLl9uYW1lcz1Weih0LmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfWZ1bmN0aW9uIEd6KHQsZSl7Zm9yKHZhciBuPVV6KHQpLGk9LTEscj1lLmxlbmd0aDsrK2k8cjspbi5hZGQoZVtpXSl9ZnVuY3Rpb24gV3oodCxlKXtmb3IodmFyIG49VXoodCksaT0tMSxyPWUubGVuZ3RoOysraTxyOyluLnJlbW92ZShlW2ldKX1mdW5jdGlvbiBxeih0KXtyZXR1cm4gZnVuY3Rpb24oKXtHeih0aGlzLHQpfX1mdW5jdGlvbiBZeih0KXtyZXR1cm4gZnVuY3Rpb24oKXtXeih0aGlzLHQpfX1mdW5jdGlvbiBYeih0LGUpe3JldHVybiBmdW5jdGlvbigpeyhlLmFwcGx5KHRoaXMsYXJndW1lbnRzKT9HejpXeikodGhpcyx0KX19ZnVuY3Rpb24gJHooKXt0aGlzLnRleHRDb250ZW50PSIifWZ1bmN0aW9uIEt6KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19ZnVuY3Rpb24gWnoodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT1lPyIiOmV9fWZ1bmN0aW9uIEp6KCl7dGhpcy5pbm5lckhUTUw9IiJ9ZnVuY3Rpb24gUXoodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9dH19ZnVuY3Rpb24gdEQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pbm5lckhUTUw9bnVsbD09ZT8iIjplfX1mdW5jdGlvbiBlRCgpe3RoaXMubmV4dFNpYmxpbmcmJnRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKX1mdW5jdGlvbiBuRCgpe3RoaXMucHJldmlvdXNTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIGlEKCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gckQoKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7dCYmdC5yZW1vdmVDaGlsZCh0aGlzKX1mdW5jdGlvbiBvRCgpe3ZhciB0PXRoaXMuY2xvbmVOb2RlKCExKSxlPXRoaXMucGFyZW50Tm9kZTtyZXR1cm4gZT9lLmluc2VydEJlZm9yZSh0LHRoaXMubmV4dFNpYmxpbmcpOnR9ZnVuY3Rpb24gYUQoKXt2YXIgdD10aGlzLmNsb25lTm9kZSghMCksZT10aGlzLnBhcmVudE5vZGU7cmV0dXJuIGU/ZS5pbnNlcnRCZWZvcmUodCx0aGlzLm5leHRTaWJsaW5nKTp0fVN6LnByb3RvdHlwZT17Y29uc3RydWN0b3I6U3osYXBwZW5kQ2hpbGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUodCx0aGlzLl9uZXh0KX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUodCxlKX0scXVlcnlTZWxlY3RvcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3IodCl9LHF1ZXJ5U2VsZWN0b3JBbGw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHQpfX0sanoucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtlPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKGUsMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgc0Q9e30sbEQ9bnVsbDtmdW5jdGlvbiBjRCh0LGUsbil7cmV0dXJuIHQ9dUQodCxlLG4pLGZ1bmN0aW9uKGUpe3ZhciBuPWUucmVsYXRlZFRhcmdldDtuJiYobj09PXRoaXN8fDgmbi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzKSl8fHQuY2FsbCh0aGlzLGUpfX1mdW5jdGlvbiB1RCh0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKGkpe3ZhciByPWxEO2xEPWk7dHJ5e3QuY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZSxuKX1maW5hbGx5e2xEPXJ9fX1mdW5jdGlvbiBoRCh0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKChmdW5jdGlvbih0KXt2YXIgZT0iIixuPXQuaW5kZXhPZigiLiIpO3JldHVybiBuPj0wJiYoZT10LnNsaWNlKG4rMSksdD10LnNsaWNlKDAsbikpLHt0eXBlOnQsbmFtZTplfX0pKX1mdW5jdGlvbiBkRCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9fb247aWYoZSl7Zm9yKHZhciBuLGk9MCxyPS0xLG89ZS5sZW5ndGg7aTxvOysraSluPWVbaV0sdC50eXBlJiZuLnR5cGUhPT10LnR5cGV8fG4ubmFtZSE9PXQubmFtZT9lWysrcl09bjp0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobi50eXBlLG4ubGlzdGVuZXIsbi5jYXB0dXJlKTsrK3I/ZS5sZW5ndGg9cjpkZWxldGUgdGhpcy5fX29ufX19ZnVuY3Rpb24gcEQodCxlLG4pe3ZhciBpPXNELmhhc093blByb3BlcnR5KHQudHlwZSk/Y0Q6dUQ7cmV0dXJuIGZ1bmN0aW9uKHIsbyxhKXt2YXIgcyxsPXRoaXMuX19vbixjPWkoZSxvLGEpO2lmKGwpZm9yKHZhciB1PTAsaD1sLmxlbmd0aDt1PGg7Kyt1KWlmKChzPWxbdV0pLnR5cGU9PT10LnR5cGUmJnMubmFtZT09PXQubmFtZSlyZXR1cm4gdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHMudHlwZSxzLmxpc3RlbmVyLHMuY2FwdHVyZSksdGhpcy5hZGRFdmVudExpc3RlbmVyKHMudHlwZSxzLmxpc3RlbmVyPWMscy5jYXB0dXJlPW4pLHZvaWQocy52YWx1ZT1lKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIodC50eXBlLGMsbikscz17dHlwZTp0LnR5cGUsbmFtZTp0Lm5hbWUsdmFsdWU6ZSxsaXN0ZW5lcjpjLGNhcHR1cmU6bn0sbD9sLnB1c2gocyk6dGhpcy5fX29uPVtzXX19ZnVuY3Rpb24gZkQodCxlLG4pe3ZhciBpPUl6KHQpLHI9aS5DdXN0b21FdmVudDsiZnVuY3Rpb24iPT10eXBlb2Ygcj9yPW5ldyByKGUsbik6KHI9aS5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxuPyhyLmluaXRFdmVudChlLG4uYnViYmxlcyxuLmNhbmNlbGFibGUpLHIuZGV0YWlsPW4uZGV0YWlsKTpyLmluaXRFdmVudChlLCExLCExKSksdC5kaXNwYXRjaEV2ZW50KHIpfWZ1bmN0aW9uIG1EKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGZEKHRoaXMsdCxlKX19ZnVuY3Rpb24gZ0QodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZkQodGhpcyx0LGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX19InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmKCJvbm1vdXNlZW50ZXIiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHwoc0Q9e21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSkpO3ZhciBfRD1bbnVsbF07ZnVuY3Rpb24geUQodCxlKXt0aGlzLl9ncm91cHM9dCx0aGlzLl9wYXJlbnRzPWV9ZnVuY3Rpb24gdkQoKXtyZXR1cm4gbmV3IHlEKFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sX0QpfWZ1bmN0aW9uIGJEKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9uZXcgeUQoW1tkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQpXV0sW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pOm5ldyB5RChbW3RdXSxfRCl9ZnVuY3Rpb24geEQodCl7dmFyIGU9KGZ1bmN0aW9uIG4oKXtmb3IodmFyIHQsZT1sRDt0PWUuc291cmNlRXZlbnQ7KWU9dDtyZXR1cm4gZX0pKCk7cmV0dXJuIGUuY2hhbmdlZFRvdWNoZXMmJihlPWUuY2hhbmdlZFRvdWNoZXNbMF0pLChmdW5jdGlvbiBpKHQsZSl7dmFyIG49dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYobi5jcmVhdGVTVkdQb2ludCl7dmFyIGk9bi5jcmVhdGVTVkdQb2ludCgpO3JldHVybiBpLng9ZS5jbGllbnRYLGkueT1lLmNsaWVudFksWyhpPWkubWF0cml4VHJhbnNmb3JtKHQuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSkueCxpLnldfXZhciByPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW2UuY2xpZW50WC1yLmxlZnQtdC5jbGllbnRMZWZ0LGUuY2xpZW50WS1yLnRvcC10LmNsaWVudFRvcF19KSh0LGUpfWZ1bmN0aW9uIHdEKCl7bEQucHJldmVudERlZmF1bHQoKSxsRC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBTRCh0KXt2YXIgZT10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxuPWJEKHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIsd0QsITApOyJvbnNlbGVjdHN0YXJ0ImluIGU/bi5vbigic2VsZWN0c3RhcnQuZHJhZyIsd0QsITApOihlLl9fbm9zZWxlY3Q9ZS5zdHlsZS5Nb3pVc2VyU2VsZWN0LGUuc3R5bGUuTW96VXNlclNlbGVjdD0ibm9uZSIpfWZ1bmN0aW9uIE1EKHQsZSl7dmFyIG49dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsaT1iRCh0KS5vbigiZHJhZ3N0YXJ0LmRyYWciLG51bGwpO2UmJihpLm9uKCJjbGljay5kcmFnIix3RCwhMCksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtpLm9uKCJjbGljay5kcmFnIixudWxsKX0pLDApKSwib25zZWxlY3RzdGFydCJpbiBuP2kub24oInNlbGVjdHN0YXJ0LmRyYWciLG51bGwpOihuLnN0eWxlLk1velVzZXJTZWxlY3Q9bi5fX25vc2VsZWN0LGRlbGV0ZSBuLl9fbm9zZWxlY3QpfWZ1bmN0aW9uIEVEKHQsZSxuKXt0LnByb3RvdHlwZT1lLnByb3RvdHlwZT1uLG4uY29uc3RydWN0b3I9dH1mdW5jdGlvbiBURCh0LGUpe3ZhciBuPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpO2Zvcih2YXIgaSBpbiBlKW5baV09ZVtpXTtyZXR1cm4gbn1mdW5jdGlvbiBDRCgpe315RC5wcm90b3R5cGU9dkQucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp5RCxzZWxlY3Q6ZnVuY3Rpb24gQUQodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXl6KHQpKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49ZS5sZW5ndGgsaT1uZXcgQXJyYXkobikscj0wO3I8bjsrK3IpZm9yKHZhciBvLGEscz1lW3JdLGw9cy5sZW5ndGgsYz1pW3JdPW5ldyBBcnJheShsKSx1PTA7dTxsOysrdSkobz1zW3VdKSYmKGE9dC5jYWxsKG8sby5fX2RhdGFfXyx1LHMpKSYmKCJfX2RhdGFfXyJpbiBvJiYoYS5fX2RhdGFfXz1vLl9fZGF0YV9fKSxjW3VdPWEpO3JldHVybiBuZXcgeUQoaSx0aGlzLl9wYXJlbnRzKX0sc2VsZWN0QWxsOmZ1bmN0aW9uIGtEKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1ieih0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9W10scj1bXSxvPTA7bzxuOysrbylmb3IodmFyIGEscz1lW29dLGw9cy5sZW5ndGgsYz0wO2M8bDsrK2MpKGE9c1tjXSkmJihpLnB1c2godC5jYWxsKGEsYS5fX2RhdGFfXyxjLHMpKSxyLnB1c2goYSkpO3JldHVybiBuZXcgeUQoaSxyKX0sZmlsdGVyOmZ1bmN0aW9uIExEKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD14eih0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWZvcih2YXIgbyxhPWVbcl0scz1hLmxlbmd0aCxsPWlbcl09W10sYz0wO2M8czsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmbC5wdXNoKG8pO3JldHVybiBuZXcgeUQoaSx0aGlzLl9wYXJlbnRzKX0sZGF0YTpmdW5jdGlvbiBQRCh0LGUpe2lmKCF0KXJldHVybiBmPW5ldyBBcnJheSh0aGlzLnNpemUoKSksdT0tMSx0aGlzLmVhY2goKGZ1bmN0aW9uKHQpe2ZbKyt1XT10fSkpLGY7dmFyIG49ZT9FejpNeixpPXRoaXMuX3BhcmVudHMscj10aGlzLl9ncm91cHM7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PShmdW5jdGlvbiBvKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0pKHQpKTtmb3IodmFyIGE9ci5sZW5ndGgscz1uZXcgQXJyYXkoYSksbD1uZXcgQXJyYXkoYSksYz1uZXcgQXJyYXkoYSksdT0wO3U8YTsrK3Upe3ZhciBoPWlbdV0sZD1yW3VdLHA9ZC5sZW5ndGgsZj10LmNhbGwoaCxoJiZoLl9fZGF0YV9fLHUsaSksbT1mLmxlbmd0aCxnPWxbdV09bmV3IEFycmF5KG0pLF89c1t1XT1uZXcgQXJyYXkobSk7bihoLGQsZyxfLGNbdV09bmV3IEFycmF5KHApLGYsZSk7Zm9yKHZhciB5LHYsYj0wLHg9MDtiPG07KytiKWlmKHk9Z1tiXSl7Zm9yKGI+PXgmJih4PWIrMSk7ISh2PV9beF0pJiYrK3g8bTspO3kuX25leHQ9dnx8bnVsbH19cmV0dXJuKHM9bmV3IHlEKHMsaSkpLl9lbnRlcj1sLHMuX2V4aXQ9YyxzfSxlbnRlcjpmdW5jdGlvbiBORCgpe3JldHVybiBuZXcgeUQodGhpcy5fZW50ZXJ8fHRoaXMuX2dyb3Vwcy5tYXAod3opLHRoaXMuX3BhcmVudHMpfSxleGl0OmZ1bmN0aW9uIElEKCl7cmV0dXJuIG5ldyB5RCh0aGlzLl9leGl0fHx0aGlzLl9ncm91cHMubWFwKHd6KSx0aGlzLl9wYXJlbnRzKX0sam9pbjpmdW5jdGlvbiBSRCh0LGUsbil7dmFyIGk9dGhpcy5lbnRlcigpLHI9dGhpcyxvPXRoaXMuZXhpdCgpO3JldHVybiBpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3QoaSk6aS5hcHBlbmQodCsiIiksbnVsbCE9ZSYmKHI9ZShyKSksbnVsbD09bj9vLnJlbW92ZSgpOm4obyksaSYmcj9pLm1lcmdlKHIpLm9yZGVyKCk6cn0sbWVyZ2U6ZnVuY3Rpb24gT0QodCl7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPXQuX2dyb3VwcyxpPWUubGVuZ3RoLHI9TWF0aC5taW4oaSxuLmxlbmd0aCksbz1uZXcgQXJyYXkoaSksYT0wO2E8cjsrK2EpZm9yKHZhciBzLGw9ZVthXSxjPW5bYV0sdT1sLmxlbmd0aCxoPW9bYV09bmV3IEFycmF5KHUpLGQ9MDtkPHU7KytkKShzPWxbZF18fGNbZF0pJiYoaFtkXT1zKTtmb3IoO2E8aTsrK2Epb1thXT1lW2FdO3JldHVybiBuZXcgeUQobyx0aGlzLl9wYXJlbnRzKX0sb3JkZXI6ZnVuY3Rpb24gekQoKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLGU9LTEsbj10Lmxlbmd0aDsrK2U8bjspZm9yKHZhciBpLHI9dFtlXSxvPXIubGVuZ3RoLTEsYT1yW29dOy0tbz49MDspKGk9cltvXSkmJihhJiY0XmkuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSkmJmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaSxhKSxhPWkpO3JldHVybiB0aGlzfSxzb3J0OmZ1bmN0aW9uIEREKHQpe2Z1bmN0aW9uIGUoZSxuKXtyZXR1cm4gZSYmbj90KGUuX19kYXRhX18sbi5fX2RhdGFfXyk6IWUtIW59dHx8KHQ9VHopO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsaT1uLmxlbmd0aCxyPW5ldyBBcnJheShpKSxvPTA7bzxpOysrbyl7Zm9yKHZhciBhLHM9bltvXSxsPXMubGVuZ3RoLGM9cltvXT1uZXcgQXJyYXkobCksdT0wO3U8bDsrK3UpKGE9c1t1XSkmJihjW3VdPWEpO2Muc29ydChlKX1yZXR1cm4gbmV3IHlEKHIsdGhpcy5fcGFyZW50cykub3JkZXIoKX0sY2FsbDpmdW5jdGlvbiBCRCgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gYXJndW1lbnRzWzBdPXRoaXMsdC5hcHBseShudWxsLGFyZ3VtZW50cyksdGhpc30sbm9kZXM6ZnVuY3Rpb24gSEQoKXt2YXIgdD1uZXcgQXJyYXkodGhpcy5zaXplKCkpLGU9LTE7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXt0WysrZV09dGhpc30pKSx0fSxub2RlOmZ1bmN0aW9uIEZEKCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxlPTAsbj10Lmxlbmd0aDtlPG47KytlKWZvcih2YXIgaT10W2VdLHI9MCxvPWkubGVuZ3RoO3I8bzsrK3Ipe3ZhciBhPWlbcl07aWYoYSlyZXR1cm4gYX1yZXR1cm4gbnVsbH0sc2l6ZTpmdW5jdGlvbiBWRCgpe3ZhciB0PTA7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXsrK3R9KSksdH0sZW1wdHk6ZnVuY3Rpb24gVUQoKXtyZXR1cm4hdGhpcy5ub2RlKCl9LGVhY2g6ZnVuY3Rpb24gakQodCl7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPTAsaT1lLmxlbmd0aDtuPGk7KytuKWZvcih2YXIgcixvPWVbbl0sYT0wLHM9by5sZW5ndGg7YTxzOysrYSkocj1vW2FdKSYmdC5jYWxsKHIsci5fX2RhdGFfXyxhLG8pO3JldHVybiB0aGlzfSxhdHRyOmZ1bmN0aW9uIEdEKHQsZSl7dmFyIG49cHoodCk7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgaT10aGlzLm5vZGUoKTtyZXR1cm4gbi5sb2NhbD9pLmdldEF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCk6aS5nZXRBdHRyaWJ1dGUobil9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09ZT9uLmxvY2FsP0F6OkN6OiJmdW5jdGlvbiI9PXR5cGVvZiBlP24ubG9jYWw/Tno6UHo6bi5sb2NhbD9MejpreikobixlKSl9LHN0eWxlOmZ1bmN0aW9uIFdEKHQsZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09ZT9SejoiZnVuY3Rpb24iPT10eXBlb2YgZT96ejpPeikodCxlLG51bGw9PW4/IiI6bikpOkR6KHRoaXMubm9kZSgpLHQpfSxwcm9wZXJ0eTpmdW5jdGlvbiBxRCh0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKChudWxsPT1lP0J6OiJmdW5jdGlvbiI9PXR5cGVvZiBlP0Z6Okh6KSh0LGUpKTp0aGlzLm5vZGUoKVt0XX0sY2xhc3NlZDpmdW5jdGlvbiBZRCh0LGUpe3ZhciBuPVZ6KHQrIiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciBpPVV6KHRoaXMubm9kZSgpKSxyPS0xLG89bi5sZW5ndGg7KytyPG87KWlmKCFpLmNvbnRhaW5zKG5bcl0pKXJldHVybiExO3JldHVybiEwfXJldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBlP1h6OmU/cXo6WXopKG4sZSkpfSx0ZXh0OmZ1bmN0aW9uIFhEKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10PyR6OigiZnVuY3Rpb24iPT10eXBlb2YgdD9aejpLeikodCkpOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxodG1sOmZ1bmN0aW9uICREKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P0p6OigiZnVuY3Rpb24iPT10eXBlb2YgdD90RDpReikodCkpOnRoaXMubm9kZSgpLmlubmVySFRNTH0scmFpc2U6ZnVuY3Rpb24gS0QoKXtyZXR1cm4gdGhpcy5lYWNoKGVEKX0sbG93ZXI6ZnVuY3Rpb24gWkQoKXtyZXR1cm4gdGhpcy5lYWNoKG5EKX0sYXBwZW5kOmZ1bmN0aW9uIEpEKHQpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Z3oodCk7cmV0dXJuIHRoaXMuc2VsZWN0KChmdW5jdGlvbigpe3JldHVybiB0aGlzLmFwcGVuZENoaWxkKGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0pKX0saW5zZXJ0OmZ1bmN0aW9uIFFEKHQsZSl7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpneih0KSxpPW51bGw9PWU/aUQ6ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTp5eihlKTtyZXR1cm4gdGhpcy5zZWxlY3QoKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpfHxudWxsKX0pKX0scmVtb3ZlOmZ1bmN0aW9uIHRCKCl7cmV0dXJuIHRoaXMuZWFjaChyRCl9LGNsb25lOmZ1bmN0aW9uIGVCKHQpe3JldHVybiB0aGlzLnNlbGVjdCh0P2FEOm9EKX0sZGF0dW06ZnVuY3Rpb24gbkIodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLHQpOnRoaXMubm9kZSgpLl9fZGF0YV9ffSxvbjpmdW5jdGlvbiBpQih0LGUsbil7dmFyIGkscixvPWhEKHQrIiIpLGE9by5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtmb3Iocz1lP3BEOmRELG51bGw9PW4mJihuPSExKSxpPTA7aTxhOysraSl0aGlzLmVhY2gocyhvW2ldLGUsbikpO3JldHVybiB0aGlzfXZhciBzPXRoaXMubm9kZSgpLl9fb247aWYocylmb3IodmFyIGwsYz0wLHU9cy5sZW5ndGg7Yzx1OysrYylmb3IoaT0wLGw9c1tjXTtpPGE7KytpKWlmKChyPW9baV0pLnR5cGU9PT1sLnR5cGUmJnIubmFtZT09PWwubmFtZSlyZXR1cm4gbC52YWx1ZX0sZGlzcGF0Y2g6ZnVuY3Rpb24gckIodCxlKXtyZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgZT9nRDptRCkodCxlKSl9fTt2YXIgb0I9LjcsYUI9MS9vQixzQj0iXFxzKihbKy1dP1xcZCspXFxzKiIsbEI9IlxccyooWystXT9cXGQqXFwuP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pXFxzKiIsY0I9IlxccyooWystXT9cXGQqXFwuP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pJVxccyoiLHVCPS9eIyhbMC05YS1mXXszLDh9KSQvLGhCPW5ldyBSZWdFeHAoIl5yZ2JcXCgiK1tzQixzQixzQl0rIlxcKSQiKSxkQj1uZXcgUmVnRXhwKCJecmdiXFwoIitbY0IsY0IsY0JdKyJcXCkkIikscEI9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tzQixzQixzQixsQl0rIlxcKSQiKSxmQj1uZXcgUmVnRXhwKCJecmdiYVxcKCIrW2NCLGNCLGNCLGxCXSsiXFwpJCIpLG1CPW5ldyBSZWdFeHAoIl5oc2xcXCgiK1tsQixjQixjQl0rIlxcKSQiKSxnQj1uZXcgUmVnRXhwKCJeaHNsYVxcKCIrW2xCLGNCLGNCLGxCXSsiXFwpJCIpLF9CPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O2Z1bmN0aW9uIHlCKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4KCl9ZnVuY3Rpb24gdkIoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKX1mdW5jdGlvbiBiQih0KXt2YXIgZSxuO3JldHVybiB0PSh0KyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwoZT11Qi5leGVjKHQpKT8obj1lWzFdLmxlbmd0aCxlPXBhcnNlSW50KGVbMV0sMTYpLDY9PT1uP3hCKGUpOjM9PT1uP25ldyBFQihlPj44JjE1fGU+PjQmMjQwLGU+PjQmMTV8MjQwJmUsKDE1JmUpPDw0fDE1JmUsMSk6OD09PW4/d0IoZT4+MjQmMjU1LGU+PjE2JjI1NSxlPj44JjI1NSwoMjU1JmUpLzI1NSk6ND09PW4/d0IoZT4+MTImMTV8ZT4+OCYyNDAsZT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgoMTUmZSk8PDR8MTUmZSkvMjU1KTpudWxsKTooZT1oQi5leGVjKHQpKT9uZXcgRUIoZVsxXSxlWzJdLGVbM10sMSk6KGU9ZEIuZXhlYyh0KSk/bmV3IEVCKDI1NSplWzFdLzEwMCwyNTUqZVsyXS8xMDAsMjU1KmVbM10vMTAwLDEpOihlPXBCLmV4ZWModCkpP3dCKGVbMV0sZVsyXSxlWzNdLGVbNF0pOihlPWZCLmV4ZWModCkpP3dCKDI1NSplWzFdLzEwMCwyNTUqZVsyXS8xMDAsMjU1KmVbM10vMTAwLGVbNF0pOihlPW1CLmV4ZWModCkpP2tCKGVbMV0sZVsyXS8xMDAsZVszXS8xMDAsMSk6KGU9Z0IuZXhlYyh0KSk/a0IoZVsxXSxlWzJdLzEwMCxlWzNdLzEwMCxlWzRdKTpfQi5oYXNPd25Qcm9wZXJ0eSh0KT94QihfQlt0XSk6InRyYW5zcGFyZW50Ij09PXQ/bmV3IEVCKE5hTixOYU4sTmFOLDApOm51bGx9ZnVuY3Rpb24geEIodCl7cmV0dXJuIG5ldyBFQih0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQsMSl9ZnVuY3Rpb24gd0IodCxlLG4saSl7cmV0dXJuIGk8PTAmJih0PWU9bj1OYU4pLG5ldyBFQih0LGUsbixpKX1mdW5jdGlvbiBTQih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIENEfHwodD1iQih0KSksdD9uZXcgRUIoKHQ9dC5yZ2IoKSkucix0LmcsdC5iLHQub3BhY2l0eSk6bmV3IEVCfWZ1bmN0aW9uIE1CKHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9TQih0KTpuZXcgRUIodCxlLG4sbnVsbD09aT8xOmkpfWZ1bmN0aW9uIEVCKHQsZSxuLGkpe3RoaXMucj0rdCx0aGlzLmc9K2UsdGhpcy5iPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiBUQigpe3JldHVybiIjIitBQih0aGlzLnIpK0FCKHRoaXMuZykrQUIodGhpcy5iKX1mdW5jdGlvbiBDQigpe3ZhciB0PXRoaXMub3BhY2l0eTtyZXR1cm4oMT09PSh0PWlzTmFOKHQpPzE6TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSk/InJnYigiOiJyZ2JhKCIpK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5yKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmcpfHwwKSkrIiwgIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMuYil8fDApKSsoMT09PXQ/IikiOiIsICIrdCsiKSIpfWZ1bmN0aW9uIEFCKHQpe3JldHVybigodD1NYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHQpfHwwKSkpPDE2PyIwIjoiIikrdC50b1N0cmluZygxNil9ZnVuY3Rpb24ga0IodCxlLG4saSl7cmV0dXJuIGk8PTA/dD1lPW49TmFOOm48PTB8fG4+PTE/dD1lPU5hTjplPD0wJiYodD1OYU4pLG5ldyBQQih0LGUsbixpKX1mdW5jdGlvbiBMQih0KXtpZih0IGluc3RhbmNlb2YgUEIpcmV0dXJuIG5ldyBQQih0LmgsdC5zLHQubCx0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiBDRHx8KHQ9YkIodCkpLCF0KXJldHVybiBuZXcgUEI7aWYodCBpbnN0YW5jZW9mIFBCKXJldHVybiB0O3ZhciBlPSh0PXQucmdiKCkpLnIvMjU1LG49dC5nLzI1NSxpPXQuYi8yNTUscj1NYXRoLm1pbihlLG4saSksbz1NYXRoLm1heChlLG4saSksYT1OYU4scz1vLXIsbD0obytyKS8yO3JldHVybiBzPyhhPWU9PT1vPyhuLWkpL3MrNioobjxpKTpuPT09bz8oaS1lKS9zKzI6KGUtbikvcys0LHMvPWw8LjU/bytyOjItby1yLGEqPTYwKTpzPWw+MCYmbDwxPzA6YSxuZXcgUEIoYSxzLGwsdC5vcGFjaXR5KX1mdW5jdGlvbiBQQih0LGUsbixpKXt0aGlzLmg9K3QsdGhpcy5zPStlLHRoaXMubD0rbix0aGlzLm9wYWNpdHk9K2l9ZnVuY3Rpb24gTkIodCxlLG4pe3JldHVybiAyNTUqKHQ8NjA/ZSsobi1lKSp0LzYwOnQ8MTgwP246dDwyNDA/ZSsobi1lKSooMjQwLXQpLzYwOmUpfWZ1bmN0aW9uIElCKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBSQih0LGUpe3ZhciBuPWUtdDtyZXR1cm4gbj8oZnVuY3Rpb24gaSh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdCtuKmV9fSkodCxuKTpJQihpc05hTih0KT9lOnQpfUVEKENELGJCLHtjb3B5OmZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLHRoaXMsdCl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKX0saGV4OnlCLGZvcm1hdEhleDp5Qixmb3JtYXRIc2w6ZnVuY3Rpb24gT0IoKXtyZXR1cm4gTEIodGhpcykuZm9ybWF0SHNsKCl9LGZvcm1hdFJnYjp2Qix0b1N0cmluZzp2Qn0pLEVEKEVCLE1CLFREKENELHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P2FCOk1hdGgucG93KGFCLHQpLG5ldyBFQih0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9vQjpNYXRoLnBvdyhvQix0KSxuZXcgRUIodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuLS41PD10aGlzLnImJnRoaXMucjwyNTUuNSYmLS41PD10aGlzLmcmJnRoaXMuZzwyNTUuNSYmLS41PD10aGlzLmImJnRoaXMuYjwyNTUuNSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGhleDpUQixmb3JtYXRIZXg6VEIsZm9ybWF0UmdiOkNCLHRvU3RyaW5nOkNCfSkpLEVEKFBCLChmdW5jdGlvbiB6Qih0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/TEIodCk6bmV3IFBCKHQsZSxuLG51bGw9PWk/MTppKX0pLFREKENELHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P2FCOk1hdGgucG93KGFCLHQpLG5ldyBQQih0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P29COk1hdGgucG93KG9CLHQpLG5ldyBQQih0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaCUzNjArMzYwKih0aGlzLmg8MCksZT1pc05hTih0KXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxuPXRoaXMubCxpPW4rKG48LjU/bjoxLW4pKmUscj0yKm4taTtyZXR1cm4gbmV3IEVCKE5CKHQ+PTI0MD90LTI0MDp0KzEyMCxyLGkpLE5CKHQscixpKSxOQih0PDEyMD90KzI0MDp0LTEyMCxyLGkpLHRoaXMub3BhY2l0eSl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxmb3JtYXRIc2w6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJoc2woIjoiaHNsYSgiKSsodGhpcy5ofHwwKSsiLCAiKzEwMCoodGhpcy5zfHwwKSsiJSwgIisxMDAqKHRoaXMubHx8MCkrIiUiKygxPT09dD8iKSI6IiwgIit0KyIpIil9fSkpO3ZhciBEQj0oZnVuY3Rpb24gdChlKXt2YXIgbj0oZnVuY3Rpb24gaSh0KXtyZXR1cm4gMT09KHQ9K3QpP1JCOmZ1bmN0aW9uKGUsbil7cmV0dXJuIG4tZT8oZnVuY3Rpb24gaSh0LGUsbil7cmV0dXJuIHQ9TWF0aC5wb3codCxuKSxlPU1hdGgucG93KGUsbiktdCxuPTEvbixmdW5jdGlvbihpKXtyZXR1cm4gTWF0aC5wb3codCtpKmUsbil9fSkoZSxuLHQpOklCKGlzTmFOKGUpP246ZSl9fSkoZSk7ZnVuY3Rpb24gcih0LGUpe3ZhciBpPW4oKHQ9TUIodCkpLnIsKGU9TUIoZSkpLnIpLHI9bih0LmcsZS5nKSxvPW4odC5iLGUuYiksYT1SQih0Lm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQucj1pKGUpLHQuZz1yKGUpLHQuYj1vKGUpLHQub3BhY2l0eT1hKGUpLHQrIiJ9fXJldHVybiByLmdhbW1hPXQscn0pKDEpO2Z1bmN0aW9uIEJCKHQsZSl7ZXx8KGU9W10pO3ZhciBuLGk9dD9NYXRoLm1pbihlLmxlbmd0aCx0Lmxlbmd0aCk6MCxyPWUuc2xpY2UoKTtyZXR1cm4gZnVuY3Rpb24obyl7Zm9yKG49MDtuPGk7KytuKXJbbl09dFtuXSooMS1vKStlW25dKm87cmV0dXJuIHJ9fWZ1bmN0aW9uIEhCKHQsZSl7dmFyIG4saT1lP2UubGVuZ3RoOjAscj10P01hdGgubWluKGksdC5sZW5ndGgpOjAsbz1uZXcgQXJyYXkociksYT1uZXcgQXJyYXkoaSk7Zm9yKG49MDtuPHI7KytuKW9bbl09cUIodFtuXSxlW25dKTtmb3IoO248aTsrK24pYVtuXT1lW25dO3JldHVybiBmdW5jdGlvbih0KXtmb3Iobj0wO248cjsrK24pYVtuXT1vW25dKHQpO3JldHVybiBhfX1mdW5jdGlvbiBGQih0LGUpe3ZhciBuPW5ldyBEYXRlO3JldHVybiB0PSt0LGU9K2UsZnVuY3Rpb24oaSl7cmV0dXJuIG4uc2V0VGltZSh0KigxLWkpK2UqaSksbn19ZnVuY3Rpb24gVkIodCxlKXtyZXR1cm4gdD0rdCxlPStlLGZ1bmN0aW9uKG4pe3JldHVybiB0KigxLW4pK2Uqbn19ZnVuY3Rpb24gVUIodCxlKXt2YXIgbixpPXt9LHI9e307Zm9yKG4gaW4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdHx8KHQ9e30pLG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV8fChlPXt9KSxlKW4gaW4gdD9pW25dPXFCKHRbbl0sZVtuXSk6cltuXT1lW25dO3JldHVybiBmdW5jdGlvbih0KXtmb3IobiBpbiBpKXJbbl09aVtuXSh0KTtyZXR1cm4gcn19dmFyIGpCPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxHQj1uZXcgUmVnRXhwKGpCLnNvdXJjZSwiZyIpO2Z1bmN0aW9uIFdCKHQsZSl7dmFyIG4saSxyLG89akIubGFzdEluZGV4PUdCLmxhc3RJbmRleD0wLGE9LTEscz1bXSxsPVtdO2Zvcih0Kz0iIixlKz0iIjsobj1qQi5leGVjKHQpKSYmKGk9R0IuZXhlYyhlKSk7KShyPWkuaW5kZXgpPm8mJihyPWUuc2xpY2UobyxyKSxzW2FdP3NbYV0rPXI6c1srK2FdPXIpLChuPW5bMF0pPT09KGk9aVswXSk/c1thXT9zW2FdKz1pOnNbKythXT1pOihzWysrYV09bnVsbCxsLnB1c2goe2k6YSx4OlZCKG4saSl9KSksbz1HQi5sYXN0SW5kZXg7cmV0dXJuIG88ZS5sZW5ndGgmJihyPWUuc2xpY2Uobyksc1thXT9zW2FdKz1yOnNbKythXT1yKSxzLmxlbmd0aDwyP2xbMF0/KGZ1bmN0aW9uIGModCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpKyIifX0pKGxbMF0ueCk6KGZ1bmN0aW9uIHUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSkoZSk6KGU9bC5sZW5ndGgsZnVuY3Rpb24odCl7Zm9yKHZhciBuLGk9MDtpPGU7KytpKXNbKG49bFtpXSkuaV09bi54KHQpO3JldHVybiBzLmpvaW4oIiIpfSl9ZnVuY3Rpb24gcUIodCxlKXt2YXIgbixpPXR5cGVvZiBlO3JldHVybiBudWxsPT1lfHwiYm9vbGVhbiI9PT1pP0lCKGUpOigibnVtYmVyIj09PWk/VkI6InN0cmluZyI9PT1pPyhuPWJCKGUpKT8oZT1uLERCKTpXQjplIGluc3RhbmNlb2YgYkI/REI6ZSBpbnN0YW5jZW9mIERhdGU/RkI6KGZ1bmN0aW9uIHIodCl7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyh0KSYmISh0IGluc3RhbmNlb2YgRGF0YVZpZXcpfSkoZSk/QkI6QXJyYXkuaXNBcnJheShlKT9IQjoiZnVuY3Rpb24iIT10eXBlb2YgZS52YWx1ZU9mJiYiZnVuY3Rpb24iIT10eXBlb2YgZS50b1N0cmluZ3x8aXNOYU4oZSk/VUI6VkIpKHQsZSl9dmFyIFlCLFhCLCRCLEtCLFpCPTE4MC9NYXRoLlBJLEpCPXt0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTowLHJvdGF0ZTowLHNrZXdYOjAsc2NhbGVYOjEsc2NhbGVZOjF9O2Z1bmN0aW9uIFFCKHQsZSxuLGkscixvKXt2YXIgYSxzLGw7cmV0dXJuKGE9TWF0aC5zcXJ0KHQqdCtlKmUpKSYmKHQvPWEsZS89YSksKGw9dCpuK2UqaSkmJihuLT10KmwsaS09ZSpsKSwocz1NYXRoLnNxcnQobipuK2kqaSkpJiYobi89cyxpLz1zLGwvPXMpLHQqaTxlKm4mJih0PS10LGU9LWUsbD0tbCxhPS1hKSx7dHJhbnNsYXRlWDpyLHRyYW5zbGF0ZVk6byxyb3RhdGU6TWF0aC5hdGFuMihlLHQpKlpCLHNrZXdYOk1hdGguYXRhbihsKSpaQixzY2FsZVg6YSxzY2FsZVk6c319ZnVuY3Rpb24gdEgodCxlLG4saSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdC5sZW5ndGg/dC5wb3AoKSsiICI6IiJ9cmV0dXJuIGZ1bmN0aW9uKG8sYSl7dmFyIHM9W10sbD1bXTtyZXR1cm4gbz10KG8pLGE9dChhKSwoZnVuY3Rpb24gYyh0LGkscixvLGEscyl7aWYodCE9PXJ8fGkhPT1vKXt2YXIgbD1hLnB1c2goInRyYW5zbGF0ZSgiLG51bGwsZSxudWxsLG4pO3MucHVzaCh7aTpsLTQseDpWQih0LHIpfSx7aTpsLTIseDpWQihpLG8pfSl9ZWxzZShyfHxvKSYmYS5wdXNoKCJ0cmFuc2xhdGUoIityK2UrbytuKX0pKG8udHJhbnNsYXRlWCxvLnRyYW5zbGF0ZVksYS50cmFuc2xhdGVYLGEudHJhbnNsYXRlWSxzLGwpLChmdW5jdGlvbiB1KHQsZSxuLG8pe3QhPT1lPyh0LWU+MTgwP2UrPTM2MDplLXQ+MTgwJiYodCs9MzYwKSxvLnB1c2goe2k6bi5wdXNoKHIobikrInJvdGF0ZSgiLG51bGwsaSktMix4OlZCKHQsZSl9KSk6ZSYmbi5wdXNoKHIobikrInJvdGF0ZSgiK2UraSl9KShvLnJvdGF0ZSxhLnJvdGF0ZSxzLGwpLChmdW5jdGlvbiBoKHQsZSxuLG8pe3QhPT1lP28ucHVzaCh7aTpuLnB1c2gocihuKSsic2tld1goIixudWxsLGkpLTIseDpWQih0LGUpfSk6ZSYmbi5wdXNoKHIobikrInNrZXdYKCIrZStpKX0pKG8uc2tld1gsYS5za2V3WCxzLGwpLChmdW5jdGlvbiBkKHQsZSxuLGksbyxhKXtpZih0IT09bnx8ZSE9PWkpe3ZhciBzPW8ucHVzaChyKG8pKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKTthLnB1c2goe2k6cy00LHg6VkIodCxuKX0se2k6cy0yLHg6VkIoZSxpKX0pfWVsc2UgMT09PW4mJjE9PT1pfHxvLnB1c2gocihvKSsic2NhbGUoIituKyIsIitpKyIpIil9KShvLnNjYWxlWCxvLnNjYWxlWSxhLnNjYWxlWCxhLnNjYWxlWSxzLGwpLG89YT1udWxsLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPS0xLGk9bC5sZW5ndGg7KytuPGk7KXNbKGU9bFtuXSkuaV09ZS54KHQpO3JldHVybiBzLmpvaW4oIiIpfX19dmFyIGVILG5ILGlIPXRIKChmdW5jdGlvbiBySCh0KXtyZXR1cm4ibm9uZSI9PT10P0pCOihZQnx8KFlCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLFhCPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwkQj1kb2N1bWVudC5kZWZhdWx0VmlldyksWUIuc3R5bGUudHJhbnNmb3JtPXQsdD0kQi5nZXRDb21wdXRlZFN0eWxlKFhCLmFwcGVuZENoaWxkKFlCKSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKSxYQi5yZW1vdmVDaGlsZChZQiksUUIoKyh0PXQuc2xpY2UoNywtMSkuc3BsaXQoIiwiKSlbMF0sK3RbMV0sK3RbMl0sK3RbM10sK3RbNF0sK3RbNV0pKX0pLCJweCwgIiwicHgpIiwiZGVnKSIpLG9IPXRIKChmdW5jdGlvbiBhSCh0KXtyZXR1cm4gbnVsbD09dD9KQjooS0J8fChLQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwiZyIpKSxLQi5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsdCksKHQ9S0IudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKSk/UUIoKHQ9dC5tYXRyaXgpLmEsdC5iLHQuYyx0LmQsdC5lLHQuZik6SkIpfSksIiwgIiwiKSIsIikiKSxzSD0wLGxIPTAsY0g9MCx1SD0wLGhIPTAsZEg9MCxwSD0ib2JqZWN0Ij09dHlwZW9mIHBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2U6RGF0ZSxmSD0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTcpfTtmdW5jdGlvbiBtSCgpe3JldHVybiBoSHx8KGZIKGdIKSxoSD1wSC5ub3coKStkSCl9ZnVuY3Rpb24gZ0goKXtoSD0wfWZ1bmN0aW9uIF9IKCl7dGhpcy5fY2FsbD10aGlzLl90aW1lPXRoaXMuX25leHQ9bnVsbH1mdW5jdGlvbiB5SCh0LGUsbil7dmFyIGk9bmV3IF9IO3JldHVybiBpLnJlc3RhcnQodCxlLG4pLGl9ZnVuY3Rpb24gdkgoKXtoSD0odUg9cEgubm93KCkpK2RILHNIPWxIPTA7dHJ5eyEoZnVuY3Rpb24gdCgpe21IKCksKytzSDtmb3IodmFyIHQsZT1lSDtlOykodD1oSC1lLl90aW1lKT49MCYmZS5fY2FsbC5jYWxsKG51bGwsdCksZT1lLl9uZXh0Oy0tc0h9KSgpfWZpbmFsbHl7c0g9MCwoZnVuY3Rpb24gZSgpe2Zvcih2YXIgdCxlLG49ZUgsaT0xLzA7bjspbi5fY2FsbD8oaT5uLl90aW1lJiYoaT1uLl90aW1lKSx0PW4sbj1uLl9uZXh0KTooZT1uLl9uZXh0LG4uX25leHQ9bnVsbCxuPXQ/dC5fbmV4dD1lOmVIPWUpO25IPXQseEgoaSl9KSgpLGhIPTB9fWZ1bmN0aW9uIGJIKCl7dmFyIHQ9cEgubm93KCksZT10LXVIO2U+MWUzJiYoZEgtPWUsdUg9dCl9ZnVuY3Rpb24geEgodCl7c0h8fChsSCYmKGxIPWNsZWFyVGltZW91dChsSCkpLHQtaEg+MjQ/KHQ8MS8wJiYobEg9c2V0VGltZW91dCh2SCx0LXBILm5vdygpLWRIKSksY0gmJihjSD1jbGVhckludGVydmFsKGNIKSkpOihjSHx8KHVIPXBILm5vdygpLGNIPXNldEludGVydmFsKGJILDFlMykpLHNIPTEsZkgodkgpKSl9ZnVuY3Rpb24gd0godCxlLG4pe3ZhciBpPW5ldyBfSDtyZXR1cm4gaS5yZXN0YXJ0KChmdW5jdGlvbihuKXtpLnN0b3AoKSx0KG4rZSl9KSxlPW51bGw9PWU/MDorZSxuKSxpfV9ILnByb3RvdHlwZT15SC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOl9ILHJlc3RhcnQ6ZnVuY3Rpb24odCxlLG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uIik7bj0obnVsbD09bj9tSCgpOituKSsobnVsbD09ZT8wOitlKSx0aGlzLl9uZXh0fHxuSD09PXRoaXN8fChuSD9uSC5fbmV4dD10aGlzOmVIPXRoaXMsbkg9dGhpcyksdGhpcy5fY2FsbD10LHRoaXMuX3RpbWU9bix4SCgpfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5fY2FsbCYmKHRoaXMuX2NhbGw9bnVsbCx0aGlzLl90aW1lPTEvMCx4SCgpKX19O3ZhciBTSD1heigic3RhcnQiLCJlbmQiLCJjYW5jZWwiLCJpbnRlcnJ1cHQiKSxNSD1bXTtmdW5jdGlvbiBFSCh0LGUsbixpLHIsbyl7dmFyIGE9dC5fX3RyYW5zaXRpb247aWYoYSl7aWYobiBpbiBhKXJldHVybn1lbHNlIHQuX190cmFuc2l0aW9uPXt9OyEoZnVuY3Rpb24gcyh0LGUsbil7dmFyIGkscj10Ll9fdHJhbnNpdGlvbjtmdW5jdGlvbiBvKGwpe3ZhciBjLHUsaCxkO2lmKDEhPT1uLnN0YXRlKXJldHVybiBzKCk7Zm9yKGMgaW4gcilpZigoZD1yW2NdKS5uYW1lPT09bi5uYW1lKXtpZigzPT09ZC5zdGF0ZSlyZXR1cm4gd0gobyk7ND09PWQuc3RhdGU/KGQuc3RhdGU9NixkLnRpbWVyLnN0b3AoKSxkLm9uLmNhbGwoImludGVycnVwdCIsdCx0Ll9fZGF0YV9fLGQuaW5kZXgsZC5ncm91cCksZGVsZXRlIHJbY10pOitjPGUmJihkLnN0YXRlPTYsZC50aW1lci5zdG9wKCksZC5vbi5jYWxsKCJjYW5jZWwiLHQsdC5fX2RhdGFfXyxkLmluZGV4LGQuZ3JvdXApLGRlbGV0ZSByW2NdKX1pZih3SCgoZnVuY3Rpb24oKXszPT09bi5zdGF0ZSYmKG4uc3RhdGU9NCxuLnRpbWVyLnJlc3RhcnQoYSxuLmRlbGF5LG4udGltZSksYShsKSl9KSksbi5zdGF0ZT0yLG4ub24uY2FsbCgic3RhcnQiLHQsdC5fX2RhdGFfXyxuLmluZGV4LG4uZ3JvdXApLDI9PT1uLnN0YXRlKXtmb3Iobi5zdGF0ZT0zLGk9bmV3IEFycmF5KGg9bi50d2Vlbi5sZW5ndGgpLGM9MCx1PS0xO2M8aDsrK2MpKGQ9bi50d2VlbltjXS52YWx1ZS5jYWxsKHQsdC5fX2RhdGFfXyxuLmluZGV4LG4uZ3JvdXApKSYmKGlbKyt1XT1kKTtpLmxlbmd0aD11KzF9fWZ1bmN0aW9uIGEoZSl7Zm9yKHZhciByPWU8bi5kdXJhdGlvbj9uLmVhc2UuY2FsbChudWxsLGUvbi5kdXJhdGlvbik6KG4udGltZXIucmVzdGFydChzKSxuLnN0YXRlPTUsMSksbz0tMSxhPWkubGVuZ3RoOysrbzxhOylpW29dLmNhbGwodCxyKTs1PT09bi5zdGF0ZSYmKG4ub24uY2FsbCgiZW5kIix0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSxzKCkpfWZ1bmN0aW9uIHMoKXtmb3IodmFyIGkgaW4gbi5zdGF0ZT02LG4udGltZXIuc3RvcCgpLGRlbGV0ZSByW2VdLHIpcmV0dXJuO2RlbGV0ZSB0Ll9fdHJhbnNpdGlvbn1yW2VdPW4sbi50aW1lcj15SCgoZnVuY3Rpb24gbCh0KXtuLnN0YXRlPTEsbi50aW1lci5yZXN0YXJ0KG8sbi5kZWxheSxuLnRpbWUpLG4uZGVsYXk8PXQmJm8odC1uLmRlbGF5KX0pLDAsbi50aW1lKX0pKHQsbix7bmFtZTplLGluZGV4OmksZ3JvdXA6cixvbjpTSCx0d2VlbjpNSCx0aW1lOm8udGltZSxkZWxheTpvLmRlbGF5LGR1cmF0aW9uOm8uZHVyYXRpb24sZWFzZTpvLmVhc2UsdGltZXI6bnVsbCxzdGF0ZTowfSl9ZnVuY3Rpb24gVEgodCxlKXt2YXIgbj1BSCh0LGUpO2lmKG4uc3RhdGU+MCl0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZCIpO3JldHVybiBufWZ1bmN0aW9uIENIKHQsZSl7dmFyIG49QUgodCxlKTtpZihuLnN0YXRlPjMpdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFkeSBydW5uaW5nIik7cmV0dXJuIG59ZnVuY3Rpb24gQUgodCxlKXt2YXIgbj10Ll9fdHJhbnNpdGlvbjtpZighbnx8IShuPW5bZV0pKXRocm93IG5ldyBFcnJvcigidHJhbnNpdGlvbiBub3QgZm91bmQiKTtyZXR1cm4gbn1mdW5jdGlvbiBrSCh0LGUpe3ZhciBuLGkscixvPXQuX190cmFuc2l0aW9uLGE9ITA7aWYobyl7Zm9yKHIgaW4gZT1udWxsPT1lP251bGw6ZSsiIixvKShuPW9bcl0pLm5hbWU9PT1lPyhpPW4uc3RhdGU+MiYmbi5zdGF0ZTw1LG4uc3RhdGU9NixuLnRpbWVyLnN0b3AoKSxuLm9uLmNhbGwoaT8iaW50ZXJydXB0IjoiY2FuY2VsIix0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSxkZWxldGUgb1tyXSk6YT0hMTthJiZkZWxldGUgdC5fX3RyYW5zaXRpb259fWZ1bmN0aW9uIExIKHQsZSl7dmFyIG4saTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1DSCh0aGlzLHQpLG89ci50d2VlbjtpZihvIT09bilmb3IodmFyIGE9MCxzPShpPW49bykubGVuZ3RoO2E8czsrK2EpaWYoaVthXS5uYW1lPT09ZSl7KGk9aS5zbGljZSgpKS5zcGxpY2UoYSwxKTticmVha31yLnR3ZWVuPWl9fWZ1bmN0aW9uIFBIKHQsZSxuKXt2YXIgaSxyO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1DSCh0aGlzLHQpLGE9by50d2VlbjtpZihhIT09aSl7cj0oaT1hKS5zbGljZSgpO2Zvcih2YXIgcz17bmFtZTplLHZhbHVlOm59LGw9MCxjPXIubGVuZ3RoO2w8YzsrK2wpaWYocltsXS5uYW1lPT09ZSl7cltsXT1zO2JyZWFrfWw9PT1jJiZyLnB1c2gocyl9by50d2Vlbj1yfX1mdW5jdGlvbiBOSCh0LGUsbil7dmFyIGk9dC5faWQ7cmV0dXJuIHQuZWFjaCgoZnVuY3Rpb24oKXt2YXIgdD1DSCh0aGlzLGkpOyh0LnZhbHVlfHwodC52YWx1ZT17fSkpW2VdPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpfSkpLGZ1bmN0aW9uKHQpe3JldHVybiBBSCh0LGkpLnZhbHVlW2VdfX1mdW5jdGlvbiBJSCh0LGUpe3ZhciBuO3JldHVybigibnVtYmVyIj09dHlwZW9mIGU/VkI6ZSBpbnN0YW5jZW9mIGJCP0RCOihuPWJCKGUpKT8oZT1uLERCKTpXQikodCxlKX1mdW5jdGlvbiBSSCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19ZnVuY3Rpb24gT0godCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiB6SCh0LGUsbil7dmFyIGkscixvPW4rIiI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRBdHRyaWJ1dGUodCk7cmV0dXJuIGE9PT1vP251bGw6YT09PWk/cjpyPWUoaT1hLG4pfX1mdW5jdGlvbiBESCh0LGUsbil7dmFyIGkscixvPW4rIiI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpO3JldHVybiBhPT09bz9udWxsOmE9PT1pP3I6cj1lKGk9YSxuKX19ZnVuY3Rpb24gQkgodCxlLG4pe3ZhciBpLHIsbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYSxzLGw9bih0aGlzKTtpZihudWxsIT1sKXJldHVybihhPXRoaXMuZ2V0QXR0cmlidXRlKHQpKT09PShzPWwrIiIpP251bGw6YT09PWkmJnM9PT1yP286KHI9cyxvPWUoaT1hLGwpKTt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19ZnVuY3Rpb24gSEgodCxlLG4pe3ZhciBpLHIsbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYSxzLGw9bih0aGlzKTtpZihudWxsIT1sKXJldHVybihhPXRoaXMuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKSk9PT0ocz1sKyIiKT9udWxsOmE9PT1pJiZzPT09cj9vOihyPXMsbz1lKGk9YSxsKSk7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBGSCh0LGUpe3JldHVybiBmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZSh0LGUuY2FsbCh0aGlzLG4pKX19ZnVuY3Rpb24gVkgodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsZS5jYWxsKHRoaXMsbikpfX1mdW5jdGlvbiBVSCh0LGUpe3ZhciBuLGk7ZnVuY3Rpb24gcigpe3ZhciByPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiByIT09aSYmKG49KGk9cikmJlZIKHQscikpLG59cmV0dXJuIHIuX3ZhbHVlPWUscn1mdW5jdGlvbiBqSCh0LGUpe3ZhciBuLGk7ZnVuY3Rpb24gcigpe3ZhciByPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiByIT09aSYmKG49KGk9cikmJkZIKHQscikpLG59cmV0dXJuIHIuX3ZhbHVlPWUscn1mdW5jdGlvbiBHSCh0LGUpe3JldHVybiBmdW5jdGlvbigpe1RIKHRoaXMsdCkuZGVsYXk9K2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBXSCh0LGUpe3JldHVybiBlPStlLGZ1bmN0aW9uKCl7VEgodGhpcyx0KS5kZWxheT1lfX1mdW5jdGlvbiBxSCh0LGUpe3JldHVybiBmdW5jdGlvbigpe0NIKHRoaXMsdCkuZHVyYXRpb249K2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBZSCh0LGUpe3JldHVybiBlPStlLGZ1bmN0aW9uKCl7Q0godGhpcyx0KS5kdXJhdGlvbj1lfX1mdW5jdGlvbiBYSCh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZnVuY3Rpb24oKXtDSCh0aGlzLHQpLmVhc2U9ZX19ZnVuY3Rpb24gJEgodCxlLG4pe3ZhciBpLHIsbz0oZnVuY3Rpb24gYSh0KXtyZXR1cm4odCsiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pLmV2ZXJ5KChmdW5jdGlvbih0KXt2YXIgZT10LmluZGV4T2YoIi4iKTtyZXR1cm4gZT49MCYmKHQ9dC5zbGljZSgwLGUpKSwhdHx8InN0YXJ0Ij09PXR9KSl9KShlKT9USDpDSDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1vKHRoaXMsdCkscz1hLm9uO3MhPT1pJiYocj0oaT1zKS5jb3B5KCkpLm9uKGUsbiksYS5vbj1yfX12YXIgS0g9dkQucHJvdG90eXBlLmNvbnN0cnVjdG9yO2Z1bmN0aW9uIFpIKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fWZ1bmN0aW9uIEpIKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oaSl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LGUuY2FsbCh0aGlzLGkpLG4pfX1mdW5jdGlvbiBRSCh0LGUsbil7dmFyIGkscjtmdW5jdGlvbiBvKCl7dmFyIG89ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG8hPT1yJiYoaT0ocj1vKSYmSkgodCxvLG4pKSxpfXJldHVybiBvLl92YWx1ZT1lLG99ZnVuY3Rpb24gdEYodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3RoaXMudGV4dENvbnRlbnQ9dC5jYWxsKHRoaXMsZSl9fWZ1bmN0aW9uIGVGKHQpe3ZhciBlLG47ZnVuY3Rpb24gaSgpe3ZhciBpPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBpIT09biYmKGU9KG49aSkmJnRGKGkpKSxlfXJldHVybiBpLl92YWx1ZT10LGl9dmFyIG5GPTA7ZnVuY3Rpb24gaUYodCxlLG4saSl7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1lLHRoaXMuX25hbWU9bix0aGlzLl9pZD1pfWZ1bmN0aW9uIHJGKCl7cmV0dXJuKytuRn12YXIgb0Y9dkQucHJvdG90eXBlO2lGLnByb3RvdHlwZT17Y29uc3RydWN0b3I6aUYsc2VsZWN0OmZ1bmN0aW9uIGFGKHQpe3ZhciBlPXRoaXMuX25hbWUsbj10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9eXoodCkpO2Zvcih2YXIgaT10aGlzLl9ncm91cHMscj1pLmxlbmd0aCxvPW5ldyBBcnJheShyKSxhPTA7YTxyOysrYSlmb3IodmFyIHMsbCxjPWlbYV0sdT1jLmxlbmd0aCxoPW9bYV09bmV3IEFycmF5KHUpLGQ9MDtkPHU7KytkKShzPWNbZF0pJiYobD10LmNhbGwocyxzLl9fZGF0YV9fLGQsYykpJiYoIl9fZGF0YV9fImluIHMmJihsLl9fZGF0YV9fPXMuX19kYXRhX18pLGhbZF09bCxFSChoW2RdLGUsbixkLGgsQUgocyxuKSkpO3JldHVybiBuZXcgaUYobyx0aGlzLl9wYXJlbnRzLGUsbil9LHNlbGVjdEFsbDpmdW5jdGlvbiBzRih0KXt2YXIgZT10aGlzLl9uYW1lLG49dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PWJ6KHQpKTtmb3IodmFyIGk9dGhpcy5fZ3JvdXBzLHI9aS5sZW5ndGgsbz1bXSxhPVtdLHM9MDtzPHI7KytzKWZvcih2YXIgbCxjPWlbc10sdT1jLmxlbmd0aCxoPTA7aDx1OysraClpZihsPWNbaF0pe2Zvcih2YXIgZCxwPXQuY2FsbChsLGwuX19kYXRhX18saCxjKSxmPUFIKGwsbiksbT0wLGc9cC5sZW5ndGg7bTxnOysrbSkoZD1wW21dKSYmRUgoZCxlLG4sbSxwLGYpO28ucHVzaChwKSxhLnB1c2gobCl9cmV0dXJuIG5ldyBpRihvLGEsZSxuKX0sZmlsdGVyOmZ1bmN0aW9uIGxGKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD14eih0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWZvcih2YXIgbyxhPWVbcl0scz1hLmxlbmd0aCxsPWlbcl09W10sYz0wO2M8czsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmbC5wdXNoKG8pO3JldHVybiBuZXcgaUYoaSx0aGlzLl9wYXJlbnRzLHRoaXMuX25hbWUsdGhpcy5faWQpfSxtZXJnZTpmdW5jdGlvbiBjRih0KXtpZih0Ll9pZCE9PXRoaXMuX2lkKXRocm93IG5ldyBFcnJvcjtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49dC5fZ3JvdXBzLGk9ZS5sZW5ndGgscj1NYXRoLm1pbihpLG4ubGVuZ3RoKSxvPW5ldyBBcnJheShpKSxhPTA7YTxyOysrYSlmb3IodmFyIHMsbD1lW2FdLGM9blthXSx1PWwubGVuZ3RoLGg9b1thXT1uZXcgQXJyYXkodSksZD0wO2Q8dTsrK2QpKHM9bFtkXXx8Y1tkXSkmJihoW2RdPXMpO2Zvcig7YTxpOysrYSlvW2FdPWVbYV07cmV0dXJuIG5ldyBpRihvLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LHNlbGVjdGlvbjpmdW5jdGlvbiB1Rigpe3JldHVybiBuZXcgS0godGhpcy5fZ3JvdXBzLHRoaXMuX3BhcmVudHMpfSx0cmFuc2l0aW9uOmZ1bmN0aW9uIGhGKCl7Zm9yKHZhciB0PXRoaXMuX25hbWUsZT10aGlzLl9pZCxuPXJGKCksaT10aGlzLl9ncm91cHMscj1pLmxlbmd0aCxvPTA7bzxyOysrbylmb3IodmFyIGEscz1pW29dLGw9cy5sZW5ndGgsYz0wO2M8bDsrK2MpaWYoYT1zW2NdKXt2YXIgdT1BSChhLGUpO0VIKGEsdCxuLGMscyx7dGltZTp1LnRpbWUrdS5kZWxheSt1LmR1cmF0aW9uLGRlbGF5OjAsZHVyYXRpb246dS5kdXJhdGlvbixlYXNlOnUuZWFzZX0pfXJldHVybiBuZXcgaUYoaSx0aGlzLl9wYXJlbnRzLHQsbil9LGNhbGw6b0YuY2FsbCxub2RlczpvRi5ub2Rlcyxub2RlOm9GLm5vZGUsc2l6ZTpvRi5zaXplLGVtcHR5Om9GLmVtcHR5LGVhY2g6b0YuZWFjaCxvbjpmdW5jdGlvbiBkRih0LGUpe3ZhciBuPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/QUgodGhpcy5ub2RlKCksbikub24ub24odCk6dGhpcy5lYWNoKCRIKG4sdCxlKSl9LGF0dHI6ZnVuY3Rpb24gcEYodCxlKXt2YXIgbj1weih0KSxpPSJ0cmFuc2Zvcm0iPT09bj9vSDpJSDtyZXR1cm4gdGhpcy5hdHRyVHdlZW4odCwiZnVuY3Rpb24iPT10eXBlb2YgZT8obi5sb2NhbD9ISDpCSCkobixpLE5IKHRoaXMsImF0dHIuIit0LGUpKTpudWxsPT1lPyhuLmxvY2FsP09IOlJIKShuKToobi5sb2NhbD9ESDp6SCkobixpLGUpKX0sYXR0clR3ZWVuOmZ1bmN0aW9uIGZGKHQsZSl7dmFyIG49ImF0dHIuIit0O2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4obj10aGlzLnR3ZWVuKG4pKSYmbi5fdmFsdWU7aWYobnVsbD09ZSlyZXR1cm4gdGhpcy50d2VlbihuLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcjt2YXIgaT1weih0KTtyZXR1cm4gdGhpcy50d2VlbihuLChpLmxvY2FsP1VIOmpIKShpLGUpKX0sc3R5bGU6ZnVuY3Rpb24gbUYodCxlLG4pe3ZhciBpPSJ0cmFuc2Zvcm0iPT0odCs9IiIpP2lIOklIO3JldHVybiBudWxsPT1lP3RoaXMuc3R5bGVUd2Vlbih0LChmdW5jdGlvbiByKHQsZSl7dmFyIG4saSxyO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPUR6KHRoaXMsdCksYT0odGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KSxEeih0aGlzLHQpKTtyZXR1cm4gbz09PWE/bnVsbDpvPT09biYmYT09PWk/cjpyPWUobj1vLGk9YSl9fSkodCxpKSkub24oImVuZC5zdHlsZS4iK3QsWkgodCkpOiJmdW5jdGlvbiI9PXR5cGVvZiBlP3RoaXMuc3R5bGVUd2Vlbih0LChmdW5jdGlvbiBhKHQsZSxuKXt2YXIgaSxyLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9RHoodGhpcyx0KSxzPW4odGhpcyksbD1zKyIiO3JldHVybiBudWxsPT1zJiYodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KSxsPXM9RHoodGhpcyx0KSksYT09PWw/bnVsbDphPT09aSYmbD09PXI/bzoocj1sLG89ZShpPWEscykpfX0pKHQsaSxOSCh0aGlzLCJzdHlsZS4iK3QsZSkpKS5lYWNoKChmdW5jdGlvbiBvKHQsZSl7dmFyIG4saSxyLG8sYT0ic3R5bGUuIitlLHM9ImVuZC4iK2E7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGw9Q0godGhpcyx0KSxjPWwub24sdT1udWxsPT1sLnZhbHVlW2FdP298fChvPVpIKGUpKTp2b2lkIDA7Yz09PW4mJnI9PT11fHwoaT0obj1jKS5jb3B5KCkpLm9uKHMscj11KSxsLm9uPWl9fSkodGhpcy5faWQsdCkpOnRoaXMuc3R5bGVUd2Vlbih0LChmdW5jdGlvbiBzKHQsZSxuKXt2YXIgaSxyLG89bisiIjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1Eeih0aGlzLHQpO3JldHVybiBhPT09bz9udWxsOmE9PT1pP3I6cj1lKGk9YSxuKX19KSh0LGksZSksbikub24oImVuZC5zdHlsZS4iK3QsbnVsbCl9LHN0eWxlVHdlZW46ZnVuY3Rpb24gZ0YodCxlLG4pe3ZhciBpPSJzdHlsZS4iKyh0Kz0iIik7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXJldHVybihpPXRoaXMudHdlZW4oaSkpJiZpLl92YWx1ZTtpZihudWxsPT1lKXJldHVybiB0aGlzLnR3ZWVuKGksbnVsbCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO3JldHVybiB0aGlzLnR3ZWVuKGksUUgodCxlLG51bGw9PW4/IiI6bikpfSx0ZXh0OmZ1bmN0aW9uIF9GKHQpe3JldHVybiB0aGlzLnR3ZWVuKCJ0ZXh0IiwiZnVuY3Rpb24iPT10eXBlb2YgdD8oZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09ZT8iIjplfX0pKE5IKHRoaXMsInRleHQiLHQpKTooZnVuY3Rpb24gbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fSkobnVsbD09dD8iIjp0KyIiKSl9LHRleHRUd2VlbjpmdW5jdGlvbiB5Rih0KXt2YXIgZT0idGV4dCI7aWYoYXJndW1lbnRzLmxlbmd0aDwxKXJldHVybihlPXRoaXMudHdlZW4oZSkpJiZlLl92YWx1ZTtpZihudWxsPT10KXJldHVybiB0aGlzLnR3ZWVuKGUsbnVsbCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yO3JldHVybiB0aGlzLnR3ZWVuKGUsZUYodCkpfSxyZW1vdmU6ZnVuY3Rpb24gdkYoKXtyZXR1cm4gdGhpcy5vbigiZW5kLnJlbW92ZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO2Zvcih2YXIgbiBpbiB0aGlzLl9fdHJhbnNpdGlvbilpZigrbiE9PWUpcmV0dXJuO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9fSkodGhpcy5faWQpKX0sdHdlZW46ZnVuY3Rpb24gYkYodCxlKXt2YXIgbj10aGlzLl9pZDtpZih0Kz0iIixhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgaSxyPUFIKHRoaXMubm9kZSgpLG4pLnR3ZWVuLG89MCxhPXIubGVuZ3RoO288YTsrK28paWYoKGk9cltvXSkubmFtZT09PXQpcmV0dXJuIGkudmFsdWU7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09ZT9MSDpQSCkobix0LGUpKX0sZGVsYXk6ZnVuY3Rpb24geEYodCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9HSDpXSCkoZSx0KSk6QUgodGhpcy5ub2RlKCksZSkuZGVsYXl9LGR1cmF0aW9uOmZ1bmN0aW9uIHdGKHQpe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIHQ/cUg6WUgpKGUsdCkpOkFIKHRoaXMubm9kZSgpLGUpLmR1cmF0aW9ufSxlYXNlOmZ1bmN0aW9uIFNGKHQpe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChYSChlLHQpKTpBSCh0aGlzLm5vZGUoKSxlKS5lYXNlfSxlbmQ6ZnVuY3Rpb24gTUYoKXt2YXIgdCxlLG49dGhpcyxpPW4uX2lkLHI9bi5zaXplKCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGEpe3ZhciBzPXt2YWx1ZTphfSxsPXt2YWx1ZTpmdW5jdGlvbigpezA9PS0tciYmbygpfX07bi5lYWNoKChmdW5jdGlvbigpe3ZhciBuPUNIKHRoaXMsaSkscj1uLm9uO3IhPT10JiYoKGU9KHQ9cikuY29weSgpKS5fLmNhbmNlbC5wdXNoKHMpLGUuXy5pbnRlcnJ1cHQucHVzaChzKSxlLl8uZW5kLnB1c2gobCkpLG4ub249ZX0pKX0pKX19O3ZhciBFRj17dGltZTpudWxsLGRlbGF5OjAsZHVyYXRpb246MjUwLGVhc2U6VGZ9O2Z1bmN0aW9uIFRGKHQsZSl7Zm9yKHZhciBuOyEobj10Ll9fdHJhbnNpdGlvbil8fCEobj1uW2VdKTspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuIEVGLnRpbWU9bUgoKSxFRjtyZXR1cm4gbn1mdW5jdGlvbiBDRih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gQUYodCxlLG4pe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPWUsdGhpcy5zZWxlY3Rpb249bn1mdW5jdGlvbiBrRigpe2xELnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIExGKCl7bEQucHJldmVudERlZmF1bHQoKSxsRC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX12RC5wcm90b3R5cGUuaW50ZXJydXB0PWZ1bmN0aW9uIFBGKHQpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7a0godGhpcyx0KX0pKX0sdkQucHJvdG90eXBlLnRyYW5zaXRpb249ZnVuY3Rpb24gTkYodCl7dmFyIGUsbjt0IGluc3RhbmNlb2YgaUY/KGU9dC5faWQsdD10Ll9uYW1lKTooZT1yRigpLChuPUVGKS50aW1lPW1IKCksdD1udWxsPT10P251bGw6dCsiIik7Zm9yKHZhciBpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89MDtvPHI7KytvKWZvcih2YXIgYSxzPWlbb10sbD1zLmxlbmd0aCxjPTA7YzxsOysrYykoYT1zW2NdKSYmRUgoYSx0LGUsYyxzLG58fFRGKGEsZSkpO3JldHVybiBuZXcgaUYoaSx0aGlzLl9wYXJlbnRzLHQsZSl9O3ZhciBJRj17bmFtZToiZHJhZyJ9LFJGPXtuYW1lOiJzcGFjZSJ9LE9GPXtuYW1lOiJoYW5kbGUifSx6Rj17bmFtZToiY2VudGVyIn0sREY9e25hbWU6IngiLGhhbmRsZXM6WyJlIiwidyJdLm1hcChXRiksaW5wdXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmW1t0WzBdLGVbMF1bMV1dLFt0WzFdLGVbMV1bMV1dXX0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZbdFswXVswXSx0WzFdWzBdXX19LEJGPXtuYW1lOiJ5IixoYW5kbGVzOlsibiIsInMiXS5tYXAoV0YpLGlucHV0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJltbZVswXVswXSx0WzBdXSxbZVsxXVswXSx0WzFdXV19LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmW3RbMF1bMV0sdFsxXVsxXV19fSxIRj17bmFtZToieHkiLGhhbmRsZXM6WyJuIiwiZSIsInMiLCJ3IiwibnciLCJuZSIsInNlIiwic3ciXS5tYXAoV0YpLGlucHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0fSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHR9fSxGRj17b3ZlcmxheToiY3Jvc3NoYWlyIixzZWxlY3Rpb246Im1vdmUiLG46Im5zLXJlc2l6ZSIsZToiZXctcmVzaXplIixzOiJucy1yZXNpemUiLHc6ImV3LXJlc2l6ZSIsbnc6Im53c2UtcmVzaXplIixuZToibmVzdy1yZXNpemUiLHNlOiJud3NlLXJlc2l6ZSIsc3c6Im5lc3ctcmVzaXplIn0sVkY9e2U6InciLHc6ImUiLG53OiJuZSIsbmU6Im53IixzZToic3ciLHN3OiJzZSJ9LFVGPXtuOiJzIixzOiJuIixudzoic3ciLG5lOiJzZSIsc2U6Im5lIixzdzoibncifSxqRj17b3ZlcmxheToxLHNlbGVjdGlvbjoxLG46bnVsbCxlOjEsczpudWxsLHc6LTEsbnc6LTEsbmU6MSxzZToxLHN3Oi0xfSxHRj17b3ZlcmxheToxLHNlbGVjdGlvbjoxLG46LTEsZTpudWxsLHM6MSx3Om51bGwsbnc6LTEsbmU6LTEsc2U6MSxzdzoxfTtmdW5jdGlvbiBXRih0KXtyZXR1cm57dHlwZTp0fX1mdW5jdGlvbiBxRigpe3JldHVybiFsRC5idXR0b259ZnVuY3Rpb24gWUYoKXt2YXIgdD10aGlzLm93bmVyU1ZHRWxlbWVudHx8dGhpcztyZXR1cm5bWzAsMF0sW3Qud2lkdGguYmFzZVZhbC52YWx1ZSx0LmhlaWdodC5iYXNlVmFsLnZhbHVlXV19ZnVuY3Rpb24gWEYodCl7Zm9yKDshdC5fX2JydXNoOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHQuX19icnVzaH1mdW5jdGlvbiAkRih0KXtyZXR1cm4gdFswXVswXT09PXRbMV1bMF18fHRbMF1bMV09PT10WzFdWzFdfWZ1bmN0aW9uIEtGKHQpe3ZhciBlLG49WUYsaT1xRixyPWF6KGEsInN0YXJ0IiwiYnJ1c2giLCJlbmQiKSxvPTY7ZnVuY3Rpb24gYShlKXt2YXIgbj1lLnByb3BlcnR5KCJfX2JydXNoIixoKS5zZWxlY3RBbGwoIi5vdmVybGF5IikuZGF0YShbV0YoIm92ZXJsYXkiKV0pO24uZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsIm92ZXJsYXkiKS5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLmF0dHIoImN1cnNvciIsRkYub3ZlcmxheSkubWVyZ2UobikuZWFjaCgoZnVuY3Rpb24oKXt2YXIgdD1YRih0aGlzKS5leHRlbnQ7YkQodGhpcykuYXR0cigieCIsdFswXVswXSkuYXR0cigieSIsdFswXVsxXSkuYXR0cigid2lkdGgiLHRbMV1bMF0tdFswXVswXSkuYXR0cigiaGVpZ2h0Iix0WzFdWzFdLXRbMF1bMV0pfSkpLGUuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuZGF0YShbV0YoInNlbGVjdGlvbiIpXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsInNlbGVjdGlvbiIpLmF0dHIoImN1cnNvciIsRkYuc2VsZWN0aW9uKS5hdHRyKCJmaWxsIiwiIzc3NyIpLmF0dHIoImZpbGwtb3BhY2l0eSIsLjMpLmF0dHIoInN0cm9rZSIsIiNmZmYiKS5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIik7dmFyIGk9ZS5zZWxlY3RBbGwoIi5oYW5kbGUiKS5kYXRhKHQuaGFuZGxlcywoZnVuY3Rpb24odCl7cmV0dXJuIHQudHlwZX0pKTtpLmV4aXQoKS5yZW1vdmUoKSxpLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLChmdW5jdGlvbih0KXtyZXR1cm4iaGFuZGxlIGhhbmRsZS0tIit0LnR5cGV9KSkuYXR0cigiY3Vyc29yIiwoZnVuY3Rpb24odCl7cmV0dXJuIEZGW3QudHlwZV19KSksZS5lYWNoKHMpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2ggdG91Y2hzdGFydC5icnVzaCIsdSl9ZnVuY3Rpb24gcygpe3ZhciB0PWJEKHRoaXMpLGU9WEYodGhpcykuc2VsZWN0aW9uO2U/KHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLGVbMF1bMF0pLmF0dHIoInkiLGVbMF1bMV0pLmF0dHIoIndpZHRoIixlWzFdWzBdLWVbMF1bMF0pLmF0dHIoImhlaWdodCIsZVsxXVsxXS1lWzBdWzFdKSx0LnNlbGVjdEFsbCgiLmhhbmRsZSIpLnN0eWxlKCJkaXNwbGF5IixudWxsKS5hdHRyKCJ4IiwoZnVuY3Rpb24odCl7cmV0dXJuImUiPT09dC50eXBlW3QudHlwZS5sZW5ndGgtMV0/ZVsxXVswXS1vLzI6ZVswXVswXS1vLzJ9KSkuYXR0cigieSIsKGZ1bmN0aW9uKHQpe3JldHVybiJzIj09PXQudHlwZVswXT9lWzFdWzFdLW8vMjplWzBdWzFdLW8vMn0pKS5hdHRyKCJ3aWR0aCIsKGZ1bmN0aW9uKHQpe3JldHVybiJuIj09PXQudHlwZXx8InMiPT09dC50eXBlP2VbMV1bMF0tZVswXVswXStvOm99KSkuYXR0cigiaGVpZ2h0IiwoZnVuY3Rpb24odCl7cmV0dXJuImUiPT09dC50eXBlfHwidyI9PT10LnR5cGU/ZVsxXVsxXS1lWzBdWzFdK286b30pKSk6dC5zZWxlY3RBbGwoIi5zZWxlY3Rpb24sLmhhbmRsZSIpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLmF0dHIoIngiLG51bGwpLmF0dHIoInkiLG51bGwpLmF0dHIoIndpZHRoIixudWxsKS5hdHRyKCJoZWlnaHQiLG51bGwpfWZ1bmN0aW9uIGwodCxlKXtyZXR1cm4gdC5fX2JydXNoLmVtaXR0ZXJ8fG5ldyBjKHQsZSl9ZnVuY3Rpb24gYyh0LGUpe3RoaXMudGhhdD10LHRoaXMuYXJncz1lLHRoaXMuc3RhdGU9dC5fX2JydXNoLHRoaXMuYWN0aXZlPTB9ZnVuY3Rpb24gdSgpe2lmKGxELnRvdWNoZXMpe2lmKGxELmNoYW5nZWRUb3VjaGVzLmxlbmd0aDxsRC50b3VjaGVzLmxlbmd0aClyZXR1cm4gTEYoKX1lbHNlIGlmKGUpcmV0dXJuO2lmKGkuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbixyLG8sYSxjLHUsaCxkLHAsZixtLGcsXyx5PXRoaXMsdj1sRC50YXJnZXQuX19kYXRhX18udHlwZSxiPSJzZWxlY3Rpb24iPT09KGxELm1ldGFLZXk/dj0ib3ZlcmxheSI6dik/SUY6bEQuYWx0S2V5P3pGOk9GLHg9dD09PUJGP251bGw6akZbdl0sdz10PT09REY/bnVsbDpHRlt2XSxTPVhGKHkpLE09Uy5leHRlbnQsRT1TLnNlbGVjdGlvbixUPU1bMF1bMF0sQz1NWzBdWzFdLEE9TVsxXVswXSxrPU1bMV1bMV0sTD14JiZ3JiZsRC5zaGlmdEtleSxQPXhEKHkpLE49UCxJPWwoeSxhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCk7Im92ZXJsYXkiPT09dj9TLnNlbGVjdGlvbj1FPVtbbj10PT09QkY/VDpQWzBdLG89dD09PURGP0M6UFsxXV0sW2M9dD09PUJGP0E6bixoPXQ9PT1ERj9rOm9dXToobj1FWzBdWzBdLG89RVswXVsxXSxjPUVbMV1bMF0saD1FWzFdWzFdKSxyPW4sYT1vLHU9YyxkPWg7dmFyIFI9YkQoeSkuYXR0cigicG9pbnRlci1ldmVudHMiLCJub25lIiksTz1SLnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5hdHRyKCJjdXJzb3IiLEZGW3ZdKTtpZihsRC50b3VjaGVzKVIub24oInRvdWNobW92ZS5icnVzaCIsRCwhMCkub24oInRvdWNoZW5kLmJydXNoIHRvdWNoY2FuY2VsLmJydXNoIixILCEwKTtlbHNle3ZhciB6PWJEKGxELnZpZXcpLm9uKCJrZXlkb3duLmJydXNoIixGLCEwKS5vbigia2V5dXAuYnJ1c2giLFYsITApLm9uKCJtb3VzZW1vdmUuYnJ1c2giLEQsITApLm9uKCJtb3VzZXVwLmJydXNoIixILCEwKTtTRChsRC52aWV3KX1rRigpLGtIKHkpLHMuY2FsbCh5KSxJLnN0YXJ0KCl9ZnVuY3Rpb24gRCgpe3ZhciB0PXhEKHkpOyFMfHxnfHxffHwoTWF0aC5hYnModFswXS1OWzBdKT5NYXRoLmFicyh0WzFdLU5bMV0pP189ITA6Zz0hMCksTj10LG09ITAsTEYoKSxCKCl9ZnVuY3Rpb24gQigpe3ZhciB0O3N3aXRjaChwPU5bMF0tUFswXSxmPU5bMV0tUFsxXSxiKXtjYXNlIFJGOmNhc2UgSUY6eCYmKHA9TWF0aC5tYXgoVC1uLE1hdGgubWluKEEtYyxwKSkscj1uK3AsdT1jK3ApLHcmJihmPU1hdGgubWF4KEMtbyxNYXRoLm1pbihrLWgsZikpLGE9bytmLGQ9aCtmKTticmVhaztjYXNlIE9GOng8MD8ocD1NYXRoLm1heChULW4sTWF0aC5taW4oQS1uLHApKSxyPW4rcCx1PWMpOng+MCYmKHA9TWF0aC5tYXgoVC1jLE1hdGgubWluKEEtYyxwKSkscj1uLHU9YytwKSx3PDA/KGY9TWF0aC5tYXgoQy1vLE1hdGgubWluKGstbyxmKSksYT1vK2YsZD1oKTp3PjAmJihmPU1hdGgubWF4KEMtaCxNYXRoLm1pbihrLWgsZikpLGE9byxkPWgrZik7YnJlYWs7Y2FzZSB6Rjp4JiYocj1NYXRoLm1heChULE1hdGgubWluKEEsbi1wKngpKSx1PU1hdGgubWF4KFQsTWF0aC5taW4oQSxjK3AqeCkpKSx3JiYoYT1NYXRoLm1heChDLE1hdGgubWluKGssby1mKncpKSxkPU1hdGgubWF4KEMsTWF0aC5taW4oayxoK2YqdykpKX11PHImJih4Kj0tMSx0PW4sbj1jLGM9dCx0PXIscj11LHU9dCx2IGluIFZGJiZPLmF0dHIoImN1cnNvciIsRkZbdj1WRlt2XV0pKSxkPGEmJih3Kj0tMSx0PW8sbz1oLGg9dCx0PWEsYT1kLGQ9dCx2IGluIFVGJiZPLmF0dHIoImN1cnNvciIsRkZbdj1VRlt2XV0pKSxTLnNlbGVjdGlvbiYmKEU9Uy5zZWxlY3Rpb24pLGcmJihyPUVbMF1bMF0sdT1FWzFdWzBdKSxfJiYoYT1FWzBdWzFdLGQ9RVsxXVsxXSksRVswXVswXT09PXImJkVbMF1bMV09PT1hJiZFWzFdWzBdPT09dSYmRVsxXVsxXT09PWR8fChTLnNlbGVjdGlvbj1bW3IsYV0sW3UsZF1dLHMuY2FsbCh5KSxJLmJydXNoKCkpfWZ1bmN0aW9uIEgoKXtpZihrRigpLGxELnRvdWNoZXMpe2lmKGxELnRvdWNoZXMubGVuZ3RoKXJldHVybjtlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2U9bnVsbH0pLDUwMCksUi5vbigidG91Y2htb3ZlLmJydXNoIHRvdWNoZW5kLmJydXNoIHRvdWNoY2FuY2VsLmJydXNoIixudWxsKX1lbHNlIE1EKGxELnZpZXcsbSksei5vbigia2V5ZG93bi5icnVzaCBrZXl1cC5icnVzaCBtb3VzZW1vdmUuYnJ1c2ggbW91c2V1cC5icnVzaCIsbnVsbCk7Ui5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLE8uYXR0cigiY3Vyc29yIixGRi5vdmVybGF5KSxTLnNlbGVjdGlvbiYmKEU9Uy5zZWxlY3Rpb24pLCRGKEUpJiYoUy5zZWxlY3Rpb249bnVsbCxzLmNhbGwoeSkpLEkuZW5kKCl9ZnVuY3Rpb24gRigpe3N3aXRjaChsRC5rZXlDb2RlKXtjYXNlIDE2Okw9eCYmdzticmVhaztjYXNlIDE4OmI9PT1PRiYmKHgmJihjPXUtcCp4LG49citwKngpLHcmJihoPWQtZip3LG89YStmKncpLGI9ekYsQigpKTticmVhaztjYXNlIDMyOmIhPT1PRiYmYiE9PXpGfHwoeDwwP2M9dS1wOng+MCYmKG49ci1wKSx3PDA/aD1kLWY6dz4wJiYobz1hLWYpLGI9UkYsTy5hdHRyKCJjdXJzb3IiLEZGLnNlbGVjdGlvbiksQigpKTticmVhaztkZWZhdWx0OnJldHVybn1MRigpfWZ1bmN0aW9uIFYoKXtzd2l0Y2gobEQua2V5Q29kZSl7Y2FzZSAxNjpMJiYoZz1fPUw9ITEsQigpKTticmVhaztjYXNlIDE4OmI9PT16RiYmKHg8MD9jPXU6eD4wJiYobj1yKSx3PDA/aD1kOnc+MCYmKG89YSksYj1PRixCKCkpO2JyZWFrO2Nhc2UgMzI6Yj09PVJGJiYobEQuYWx0S2V5Pyh4JiYoYz11LXAqeCxuPXIrcCp4KSx3JiYoaD1kLWYqdyxvPWErZip3KSxiPXpGKTooeDwwP2M9dTp4PjAmJihuPXIpLHc8MD9oPWQ6dz4wJiYobz1hKSxiPU9GKSxPLmF0dHIoImN1cnNvciIsRkZbdl0pLEIoKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59TEYoKX19ZnVuY3Rpb24gaCgpe3ZhciBlPXRoaXMuX19icnVzaHx8e3NlbGVjdGlvbjpudWxsfTtyZXR1cm4gZS5leHRlbnQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS5kaW09dCxlfXJldHVybiBhLm1vdmU9ZnVuY3Rpb24oZSxuKXtlLnNlbGVjdGlvbj9lLm9uKCJzdGFydC5icnVzaCIsKGZ1bmN0aW9uKCl7bCh0aGlzLGFyZ3VtZW50cykuYmVmb3Jlc3RhcnQoKS5zdGFydCgpfSkpLm9uKCJpbnRlcnJ1cHQuYnJ1c2ggZW5kLmJydXNoIiwoZnVuY3Rpb24oKXtsKHRoaXMsYXJndW1lbnRzKS5lbmQoKX0pKS50d2VlbigiYnJ1c2giLChmdW5jdGlvbigpe3ZhciBlPXRoaXMsaT1lLl9fYnJ1c2gscj1sKGUsYXJndW1lbnRzKSxvPWkuc2VsZWN0aW9uLGE9dC5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuLGkuZXh0ZW50KSxjPXFCKG8sYSk7ZnVuY3Rpb24gdSh0KXtpLnNlbGVjdGlvbj0xPT09dCYmJEYoYSk/bnVsbDpjKHQpLHMuY2FsbChlKSxyLmJydXNoKCl9cmV0dXJuIG8mJmE/dTp1KDEpfSkpOmUuZWFjaCgoZnVuY3Rpb24oKXt2YXIgZT10aGlzLGk9YXJndW1lbnRzLHI9ZS5fX2JydXNoLG89dC5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KGUsaSk6bixyLmV4dGVudCksYT1sKGUsaSkuYmVmb3Jlc3RhcnQoKTtrSChlKSxyLnNlbGVjdGlvbj1udWxsPT1vfHwkRihvKT9udWxsOm8scy5jYWxsKGUpLGEuc3RhcnQoKS5icnVzaCgpLmVuZCgpfSkpfSxjLnByb3RvdHlwZT17YmVmb3Jlc3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gMT09Kyt0aGlzLmFjdGl2ZSYmKHRoaXMuc3RhdGUuZW1pdHRlcj10aGlzLHRoaXMuc3RhcnRpbmc9ITApLHRoaXN9LHN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhcnRpbmcmJih0aGlzLnN0YXJ0aW5nPSExLHRoaXMuZW1pdCgic3RhcnQiKSksdGhpc30sYnJ1c2g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbWl0KCJicnVzaCIpLHRoaXN9LGVuZDpmdW5jdGlvbigpe3JldHVybiAwPT0tLXRoaXMuYWN0aXZlJiYoZGVsZXRlIHRoaXMuc3RhdGUuZW1pdHRlcix0aGlzLmVtaXQoImVuZCIpKSx0aGlzfSxlbWl0OmZ1bmN0aW9uKGUpeyEoZnVuY3Rpb24gbih0LGUsaSxyKXt2YXIgbz1sRDt0LnNvdXJjZUV2ZW50PWxELGxEPXQ7dHJ5e2UuYXBwbHkoaSxyKX1maW5hbGx5e2xEPW99fSkobmV3IEFGKGEsZSx0Lm91dHB1dCh0aGlzLnN0YXRlLnNlbGVjdGlvbikpLHIuYXBwbHkscixbZSx0aGlzLnRoYXQsdGhpcy5hcmdzXSl9fSxhLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkNGKFtbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dKSxhKTpufSxhLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkNGKCEhdCksYSk6aX0sYS5oYW5kbGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSt0LGEpOm99LGEub249ZnVuY3Rpb24oKXt2YXIgdD1yLm9uLmFwcGx5KHIsYXJndW1lbnRzKTtyZXR1cm4gdD09PXI/YTp0fSxhfWZ1bmN0aW9uIFpGKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTp0Pj1lPzA6TmFOfWZ1bmN0aW9uIEpGKHQsZSxuKXt0PSt0LGU9K2Usbj0ocj1hcmd1bWVudHMubGVuZ3RoKTwyPyhlPXQsdD0wLDEpOnI8Mz8xOituO2Zvcih2YXIgaT0tMSxyPTB8TWF0aC5tYXgoMCxNYXRoLmNlaWwoKGUtdCkvbikpLG89bmV3IEFycmF5KHIpOysraTxyOylvW2ldPXQraSpuO3JldHVybiBvfSEoZnVuY3Rpb24gUUYodCl7MT09PXQubGVuZ3RoJiYodD0oZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtyZXR1cm4gWkYodChlKSxuKX19KSh0KSl9KShaRik7dmFyIHRWPU1hdGguY29zLGVWPU1hdGguc2luLG5WPU1hdGguUEksaVY9blYvMixyVj0yKm5WLG9WPU1hdGgubWF4O2Z1bmN0aW9uIGFWKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiB0KGUuc291cmNlLnZhbHVlK2UudGFyZ2V0LnZhbHVlLG4uc291cmNlLnZhbHVlK24udGFyZ2V0LnZhbHVlKX19dmFyIHNWPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBsVih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19dmFyIGNWPU1hdGguUEksdVY9MipjVixoVj0xZS02LGRWPXVWLWhWO2Z1bmN0aW9uIHBWKCl7dGhpcy5feDA9dGhpcy5feTA9dGhpcy5feDE9dGhpcy5feTE9bnVsbCx0aGlzLl89IiJ9ZnVuY3Rpb24gZlYoKXtyZXR1cm4gbmV3IHBWfWZ1bmN0aW9uIG1WKHQpe3JldHVybiB0LnNvdXJjZX1mdW5jdGlvbiBnVih0KXtyZXR1cm4gdC50YXJnZXR9ZnVuY3Rpb24gX1YodCl7cmV0dXJuIHQucmFkaXVzfWZ1bmN0aW9uIHlWKHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gdlYodCl7cmV0dXJuIHQuZW5kQW5nbGV9cFYucHJvdG90eXBlPWZWLnByb3RvdHlwZT17Y29uc3RydWN0b3I6cFYsbW92ZVRvOmZ1bmN0aW9uKHQsZSl7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStlKX0sY2xvc2VQYXRoOmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuX3gxJiYodGhpcy5feDE9dGhpcy5feDAsdGhpcy5feTE9dGhpcy5feTAsdGhpcy5fKz0iWiIpfSxsaW5lVG86ZnVuY3Rpb24odCxlKXt0aGlzLl8rPSJMIisodGhpcy5feDE9K3QpKyIsIisodGhpcy5feTE9K2UpfSxxdWFkcmF0aWNDdXJ2ZVRvOmZ1bmN0aW9uKHQsZSxuLGkpe3RoaXMuXys9IlEiKyArdCsiLCIrICtlKyIsIisodGhpcy5feDE9K24pKyIsIisodGhpcy5feTE9K2kpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsZSxuLGkscixvKXt0aGlzLl8rPSJDIisgK3QrIiwiKyArZSsiLCIrICtuKyIsIisgK2krIiwiKyh0aGlzLl94MT0rcikrIiwiKyh0aGlzLl95MT0rbyl9LGFyY1RvOmZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIG89dGhpcy5feDEsYT10aGlzLl95MSxzPShuPStuKS0odD0rdCksbD0oaT0raSktKGU9K2UpLGM9by10LHU9YS1lLGg9YypjK3UqdTtpZigocj0rcik8MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIityKTtpZihudWxsPT09dGhpcy5feDEpdGhpcy5fKz0iTSIrKHRoaXMuX3gxPXQpKyIsIisodGhpcy5feTE9ZSk7ZWxzZSBpZihoPmhWKWlmKE1hdGguYWJzKHUqcy1sKmMpPmhWJiZyKXt2YXIgZD1uLW8scD1pLWEsZj1zKnMrbCpsLG09ZCpkK3AqcCxnPU1hdGguc3FydChmKSxfPU1hdGguc3FydChoKSx5PXIqTWF0aC50YW4oKGNWLU1hdGguYWNvcygoZitoLW0pLygyKmcqXykpKS8yKSx2PXkvXyxiPXkvZztNYXRoLmFicyh2LTEpPmhWJiYodGhpcy5fKz0iTCIrKHQrdipjKSsiLCIrKGUrdip1KSksdGhpcy5fKz0iQSIrcisiLCIrcisiLDAsMCwiKyArKHUqZD5jKnApKyIsIisodGhpcy5feDE9dCtiKnMpKyIsIisodGhpcy5feTE9ZStiKmwpfWVsc2UgdGhpcy5fKz0iTCIrKHRoaXMuX3gxPXQpKyIsIisodGhpcy5feTE9ZSl9LGFyYzpmdW5jdGlvbih0LGUsbixpLHIsbyl7dD0rdCxlPStlLG89ISFvO3ZhciBhPShuPStuKSpNYXRoLmNvcyhpKSxzPW4qTWF0aC5zaW4oaSksbD10K2EsYz1lK3MsdT0xXm8saD1vP2ktcjpyLWk7aWYobjwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiK24pO251bGw9PT10aGlzLl94MT90aGlzLl8rPSJNIitsKyIsIitjOihNYXRoLmFicyh0aGlzLl94MS1sKT5oVnx8TWF0aC5hYnModGhpcy5feTEtYyk+aFYpJiYodGhpcy5fKz0iTCIrbCsiLCIrYyksbiYmKGg8MCYmKGg9aCV1Vit1ViksaD5kVj90aGlzLl8rPSJBIituKyIsIituKyIsMCwxLCIrdSsiLCIrKHQtYSkrIiwiKyhlLXMpKyJBIituKyIsIituKyIsMCwxLCIrdSsiLCIrKHRoaXMuX3gxPWwpKyIsIisodGhpcy5feTE9Yyk6aD5oViYmKHRoaXMuXys9IkEiK24rIiwiK24rIiwwLCIrICsoaD49Y1YpKyIsIit1KyIsIisodGhpcy5feDE9dCtuKk1hdGguY29zKHIpKSsiLCIrKHRoaXMuX3kxPWUrbipNYXRoLnNpbihyKSkpKX0scmVjdDpmdW5jdGlvbih0LGUsbixpKXt0aGlzLl8rPSJNIisodGhpcy5feDA9dGhpcy5feDE9K3QpKyIsIisodGhpcy5feTA9dGhpcy5feTE9K2UpKyJoIisgK24rInYiKyAraSsiaCIrLW4rIloifSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl99fTt2YXIgYlY9IiQiO2Z1bmN0aW9uIHhWKCl7fWZ1bmN0aW9uIHdWKHQsZSl7dmFyIG49bmV3IHhWO2lmKHQgaW5zdGFuY2VvZiB4Vil0LmVhY2goKGZ1bmN0aW9uKHQsZSl7bi5zZXQoZSx0KX0pKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkodCkpe3ZhciBpLHI9LTEsbz10Lmxlbmd0aDtpZihudWxsPT1lKWZvcig7KytyPG87KW4uc2V0KHIsdFtyXSk7ZWxzZSBmb3IoOysrcjxvOyluLnNldChlKGk9dFtyXSxyLHQpLGkpfWVsc2UgaWYodClmb3IodmFyIGEgaW4gdCluLnNldChhLHRbYV0pO3JldHVybiBufWZ1bmN0aW9uIFNWKCl7cmV0dXJue319ZnVuY3Rpb24gTVYodCxlLG4pe3RbZV09bn1mdW5jdGlvbiBFVigpe3JldHVybiB3VigpfWZ1bmN0aW9uIFRWKHQsZSxuKXt0LnNldChlLG4pfWZ1bmN0aW9uIENWKCl7fXhWLnByb3RvdHlwZT13Vi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnhWLGhhczpmdW5jdGlvbih0KXtyZXR1cm4gYlYrdCBpbiB0aGlzfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbYlYrdF19LHNldDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzW2JWK3RdPWUsdGhpc30scmVtb3ZlOmZ1bmN0aW9uKHQpe3ZhciBlPWJWK3Q7cmV0dXJuIGUgaW4gdGhpcyYmZGVsZXRlIHRoaXNbZV19LGNsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpdFswXT09PWJWJiZkZWxldGUgdGhpc1t0XX0sa2V5czpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT1iViYmdC5wdXNoKGUuc2xpY2UoMSkpO3JldHVybiB0fSx2YWx1ZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gdGhpcyllWzBdPT09YlYmJnQucHVzaCh0aGlzW2VdKTtyZXR1cm4gdH0sZW50cmllczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT1iViYmdC5wdXNoKHtrZXk6ZS5zbGljZSgxKSx2YWx1ZTp0aGlzW2VdfSk7cmV0dXJuIHR9LHNpemU6ZnVuY3Rpb24oKXt2YXIgdD0wO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT1iViYmKyt0O3JldHVybiB0fSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzKWlmKHRbMF09PT1iVilyZXR1cm4hMTtyZXR1cm4hMH0sZWFjaDpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdGhpcyllWzBdPT09YlYmJnQodGhpc1tlXSxlLnNsaWNlKDEpLHRoaXMpfX07dmFyIEFWPXdWLnByb3RvdHlwZTtmdW5jdGlvbiBrVih0LGUpe3ZhciBuPW5ldyBDVjtpZih0IGluc3RhbmNlb2YgQ1YpdC5lYWNoKChmdW5jdGlvbih0KXtuLmFkZCh0KX0pKTtlbHNlIGlmKHQpe3ZhciBpPS0xLHI9dC5sZW5ndGg7aWYobnVsbD09ZSlmb3IoOysraTxyOyluLmFkZCh0W2ldKTtlbHNlIGZvcig7KytpPHI7KW4uYWRkKGUodFtpXSxpLHQpKX1yZXR1cm4gbn1mdW5jdGlvbiBMVih0LGUsbil7dC5wcm90b3R5cGU9ZS5wcm90b3R5cGU9bixuLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24gUFYodCxlKXt2YXIgbj1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIGkgaW4gZSluW2ldPWVbaV07cmV0dXJuIG59ZnVuY3Rpb24gTlYoKXt9Q1YucHJvdG90eXBlPWtWLnByb3RvdHlwZT17Y29uc3RydWN0b3I6Q1YsaGFzOkFWLmhhcyxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbYlYrKHQrPSIiKV09dCx0aGlzfSxyZW1vdmU6QVYucmVtb3ZlLGNsZWFyOkFWLmNsZWFyLHZhbHVlczpBVi5rZXlzLHNpemU6QVYuc2l6ZSxlbXB0eTpBVi5lbXB0eSxlYWNoOkFWLmVhY2h9O3ZhciBJVj0uNyxSVj0xL0lWLE9WPSJcXHMqKFsrLV0/XFxkKylcXHMqIix6Vj0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIixEVj0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIsQlY9L14jKFswLTlhLWZdezN9KSQvLEhWPS9eIyhbMC05YS1mXXs2fSkkLyxGVj1uZXcgUmVnRXhwKCJecmdiXFwoIitbT1YsT1YsT1ZdKyJcXCkkIiksVlY9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW0RWLERWLERWXSsiXFwpJCIpLFVWPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbT1YsT1YsT1YselZdKyJcXCkkIiksalY9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tEVixEVixEVix6Vl0rIlxcKSQiKSxHVj1uZXcgUmVnRXhwKCJeaHNsXFwoIitbelYsRFYsRFZdKyJcXCkkIiksV1Y9bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1t6VixEVixEVix6Vl0rIlxcKSQiKSxxVj17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtmdW5jdGlvbiBZVih0KXt2YXIgZTtyZXR1cm4gdD0odCsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKGU9QlYuZXhlYyh0KSk/bmV3IEpWKChlPXBhcnNlSW50KGVbMV0sMTYpKT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgxNSZlKTw8NHwxNSZlLDEpOihlPUhWLmV4ZWModCkpP1hWKHBhcnNlSW50KGVbMV0sMTYpKTooZT1GVi5leGVjKHQpKT9uZXcgSlYoZVsxXSxlWzJdLGVbM10sMSk6KGU9VlYuZXhlYyh0KSk/bmV3IEpWKDI1NSplWzFdLzEwMCwyNTUqZVsyXS8xMDAsMjU1KmVbM10vMTAwLDEpOihlPVVWLmV4ZWModCkpPyRWKGVbMV0sZVsyXSxlWzNdLGVbNF0pOihlPWpWLmV4ZWModCkpPyRWKDI1NSplWzFdLzEwMCwyNTUqZVsyXS8xMDAsMjU1KmVbM10vMTAwLGVbNF0pOihlPUdWLmV4ZWModCkpP1FWKGVbMV0sZVsyXS8xMDAsZVszXS8xMDAsMSk6KGU9V1YuZXhlYyh0KSk/UVYoZVsxXSxlWzJdLzEwMCxlWzNdLzEwMCxlWzRdKTpxVi5oYXNPd25Qcm9wZXJ0eSh0KT9YVihxVlt0XSk6InRyYW5zcGFyZW50Ij09PXQ/bmV3IEpWKE5hTixOYU4sTmFOLDApOm51bGx9ZnVuY3Rpb24gWFYodCl7cmV0dXJuIG5ldyBKVih0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQsMSl9ZnVuY3Rpb24gJFYodCxlLG4saSl7cmV0dXJuIGk8PTAmJih0PWU9bj1OYU4pLG5ldyBKVih0LGUsbixpKX1mdW5jdGlvbiBLVih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIE5WfHwodD1ZVih0KSksdD9uZXcgSlYoKHQ9dC5yZ2IoKSkucix0LmcsdC5iLHQub3BhY2l0eSk6bmV3IEpWfWZ1bmN0aW9uIFpWKHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9LVih0KTpuZXcgSlYodCxlLG4sbnVsbD09aT8xOmkpfWZ1bmN0aW9uIEpWKHQsZSxuLGkpe3RoaXMucj0rdCx0aGlzLmc9K2UsdGhpcy5iPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiBRVih0LGUsbixpKXtyZXR1cm4gaTw9MD90PWU9bj1OYU46bjw9MHx8bj49MT90PWU9TmFOOmU8PTAmJih0PU5hTiksbmV3IG5VKHQsZSxuLGkpfWZ1bmN0aW9uIHRVKHQpe2lmKHQgaW5zdGFuY2VvZiBuVSlyZXR1cm4gbmV3IG5VKHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIE5WfHwodD1ZVih0KSksIXQpcmV0dXJuIG5ldyBuVTtpZih0IGluc3RhbmNlb2YgblUpcmV0dXJuIHQ7dmFyIGU9KHQ9dC5yZ2IoKSkuci8yNTUsbj10LmcvMjU1LGk9dC5iLzI1NSxyPU1hdGgubWluKGUsbixpKSxvPU1hdGgubWF4KGUsbixpKSxhPU5hTixzPW8tcixsPShvK3IpLzI7cmV0dXJuIHM/KGE9ZT09PW8/KG4taSkvcys2KihuPGkpOm49PT1vPyhpLWUpL3MrMjooZS1uKS9zKzQscy89bDwuNT9vK3I6Mi1vLXIsYSo9NjApOnM9bD4wJiZsPDE/MDphLG5ldyBuVShhLHMsbCx0Lm9wYWNpdHkpfWZ1bmN0aW9uIGVVKHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90VSh0KTpuZXcgblUodCxlLG4sbnVsbD09aT8xOmkpfWZ1bmN0aW9uIG5VKHQsZSxuLGkpe3RoaXMuaD0rdCx0aGlzLnM9K2UsdGhpcy5sPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiBpVSh0LGUsbil7cmV0dXJuIDI1NSoodDw2MD9lKyhuLWUpKnQvNjA6dDwxODA/bjp0PDI0MD9lKyhuLWUpKigyNDAtdCkvNjA6ZSl9TFYoTlYsWVYse2Rpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKSsiIn19KSxMVihKVixaVixQVihOVix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9SVjpNYXRoLnBvdyhSVix0KSxuZXcgSlYodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/SVY6TWF0aC5wb3coSVYsdCksbmV3IEpWKHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybiAwPD10aGlzLnImJnRoaXMucjw9MjU1JiYwPD10aGlzLmcmJnRoaXMuZzw9MjU1JiYwPD10aGlzLmImJnRoaXMuYjw9MjU1JiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX19KSksTFYoblUsZVUsUFYoTlYse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/UlY6TWF0aC5wb3coUlYsdCksbmV3IG5VKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/SVY6TWF0aC5wb3coSVYsdCksbmV3IG5VKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5oJTM2MCszNjAqKHRoaXMuaDwwKSxlPWlzTmFOKHQpfHxpc05hTih0aGlzLnMpPzA6dGhpcy5zLG49dGhpcy5sLGk9bisobjwuNT9uOjEtbikqZSxyPTIqbi1pO3JldHVybiBuZXcgSlYoaVUodD49MjQwP3QtMjQwOnQrMTIwLHIsaSksaVUodCxyLGkpLGlVKHQ8MTIwP3QrMjQwOnQtMTIwLHIsaSksdGhpcy5vcGFjaXR5KX0sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4oMDw9dGhpcy5zJiZ0aGlzLnM8PTF8fGlzTmFOKHRoaXMucykpJiYwPD10aGlzLmwmJnRoaXMubDw9MSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9fSkpO3ZhciByVT1NYXRoLlBJLzE4MCxvVT0xODAvTWF0aC5QSSxhVT0uOTUwNDcsc1U9MS4wODg4MyxsVT00LzI5LGNVPTYvMjksdVU9MypjVSpjVTtmdW5jdGlvbiBoVSh0KXtpZih0IGluc3RhbmNlb2YgcFUpcmV0dXJuIG5ldyBwVSh0LmwsdC5hLHQuYix0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiBiVSl7dmFyIGU9dC5oKnJVO3JldHVybiBuZXcgcFUodC5sLE1hdGguY29zKGUpKnQuYyxNYXRoLnNpbihlKSp0LmMsdC5vcGFjaXR5KX10IGluc3RhbmNlb2YgSlZ8fCh0PUtWKHQpKTt2YXIgbj1fVSh0LnIpLGk9X1UodC5nKSxyPV9VKHQuYiksbz1mVSgoLjQxMjQ1NjQqbisuMzU3NTc2MSppKy4xODA0Mzc1KnIpL2FVKSxhPWZVKCguMjEyNjcyOSpuKy43MTUxNTIyKmkrLjA3MjE3NSpyKS8xKTtyZXR1cm4gbmV3IHBVKDExNiphLTE2LDUwMCooby1hKSwyMDAqKGEtZlUoKC4wMTkzMzM5Km4rLjExOTE5MippKy45NTAzMDQxKnIpL3NVKSksdC5vcGFjaXR5KX1mdW5jdGlvbiBkVSh0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/aFUodCk6bmV3IHBVKHQsZSxuLG51bGw9PWk/MTppKX1mdW5jdGlvbiBwVSh0LGUsbixpKXt0aGlzLmw9K3QsdGhpcy5hPStlLHRoaXMuYj0rbix0aGlzLm9wYWNpdHk9K2l9ZnVuY3Rpb24gZlUodCl7cmV0dXJuIHQ+LjAwODg1NjQ1MTY3OTAzNTYzMT9NYXRoLnBvdyh0LDEvMyk6dC91VStsVX1mdW5jdGlvbiBtVSh0KXtyZXR1cm4gdD5jVT90KnQqdDp1VSoodC1sVSl9ZnVuY3Rpb24gZ1UodCl7cmV0dXJuIDI1NSoodDw9LjAwMzEzMDg/MTIuOTIqdDoxLjA1NSpNYXRoLnBvdyh0LDEvMi40KS0uMDU1KX1mdW5jdGlvbiBfVSh0KXtyZXR1cm4odC89MjU1KTw9LjA0MDQ1P3QvMTIuOTI6TWF0aC5wb3coKHQrLjA1NSkvMS4wNTUsMi40KX1mdW5jdGlvbiB5VSh0KXtpZih0IGluc3RhbmNlb2YgYlUpcmV0dXJuIG5ldyBiVSh0LmgsdC5jLHQubCx0Lm9wYWNpdHkpO3QgaW5zdGFuY2VvZiBwVXx8KHQ9aFUodCkpO3ZhciBlPU1hdGguYXRhbjIodC5iLHQuYSkqb1U7cmV0dXJuIG5ldyBiVShlPDA/ZSszNjA6ZSxNYXRoLnNxcnQodC5hKnQuYSt0LmIqdC5iKSx0LmwsdC5vcGFjaXR5KX1mdW5jdGlvbiB2VSh0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/eVUodCk6bmV3IGJVKHQsZSxuLG51bGw9PWk/MTppKX1mdW5jdGlvbiBiVSh0LGUsbixpKXt0aGlzLmg9K3QsdGhpcy5jPStlLHRoaXMubD0rbix0aGlzLm9wYWNpdHk9K2l9TFYocFUsZFUsUFYoTlYse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcFUodGhpcy5sKzE4KihudWxsPT10PzE6dCksdGhpcy5hLHRoaXMuYix0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBwVSh0aGlzLmwtMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PSh0aGlzLmwrMTYpLzExNixlPWlzTmFOKHRoaXMuYSk/dDp0K3RoaXMuYS81MDAsbj1pc05hTih0aGlzLmIpP3Q6dC10aGlzLmIvMjAwO3JldHVybiB0PTEqbVUodCksbmV3IEpWKGdVKDMuMjQwNDU0MiooZT1hVSptVShlKSktMS41MzcxMzg1KnQtLjQ5ODUzMTQqKG49c1UqbVUobikpKSxnVSgtLjk2OTI2NiplKzEuODc2MDEwOCp0Ky4wNDE1NTYqbiksZ1UoLjA1NTY0MzQqZS0uMjA0MDI1OSp0KzEuMDU3MjI1MipuKSx0aGlzLm9wYWNpdHkpfX0pKSxMVihiVSx2VSxQVihOVix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBiVSh0aGlzLmgsdGhpcy5jLHRoaXMubCsxOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGJVKHRoaXMuaCx0aGlzLmMsdGhpcy5sLTE4KihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIGhVKHRoaXMpLnJnYigpfX0pKTt2YXIgeFU9LS4yOTIyNyx3VT0tLjkwNjQ5LFNVPTEuOTcyOTQ7ZnVuY3Rpb24gTVUodCl7aWYodCBpbnN0YW5jZW9mIFRVKXJldHVybiBuZXcgVFUodC5oLHQucyx0LmwsdC5vcGFjaXR5KTt0IGluc3RhbmNlb2YgSlZ8fCh0PUtWKHQpKTt2YXIgZT10LmcvMjU1LG49dC5iLzI1NSxpPSgtLjY1NTc2MzY2Njc5OTk5OTkqbit0LnIvMjU1Ki0xLjc4ODQ1MDM4MDYtMy41MTcyOTgyNDM4KmUpLy01Ljk2MTUxMjI5MTIscj1uLWksbz0oU1UqKGUtaSkteFUqcikvd1UsYT1NYXRoLnNxcnQobypvK3IqcikvKFNVKmkqKDEtaSkpLHM9YT9NYXRoLmF0YW4yKG8scikqb1UtMTIwOk5hTjtyZXR1cm4gbmV3IFRVKHM8MD9zKzM2MDpzLGEsaSx0Lm9wYWNpdHkpfWZ1bmN0aW9uIEVVKHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9NVSh0KTpuZXcgVFUodCxlLG4sbnVsbD09aT8xOmkpfWZ1bmN0aW9uIFRVKHQsZSxuLGkpe3RoaXMuaD0rdCx0aGlzLnM9K2UsdGhpcy5sPStuLHRoaXMub3BhY2l0eT0raX1MVihUVSxFVSxQVihOVix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9SVjpNYXRoLnBvdyhSVix0KSxuZXcgVFUodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9JVjpNYXRoLnBvdyhJVix0KSxuZXcgVFUodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD1pc05hTih0aGlzLmgpPzA6KHRoaXMuaCsxMjApKnJVLGU9K3RoaXMubCxuPWlzTmFOKHRoaXMucyk/MDp0aGlzLnMqZSooMS1lKSxpPU1hdGguY29zKHQpLHI9TWF0aC5zaW4odCk7cmV0dXJuIG5ldyBKVigyNTUqKGUrbiooLS4xNDg2MSppKzEuNzgyNzcqcikpLDI1NSooZStuKih4VSppK3dVKnIpKSwyNTUqKGUrbiooU1UqaSkpLHRoaXMub3BhY2l0eSl9fSkpO3ZhciBDVT17dmFsdWU6ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBBVSgpe2Zvcih2YXIgdCxlPTAsbj1hcmd1bWVudHMubGVuZ3RoLGk9e307ZTxuOysrZSl7aWYoISh0PWFyZ3VtZW50c1tlXSsiIil8fHQgaW4gaSl0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgdHlwZTogIit0KTtpW3RdPVtdfXJldHVybiBuZXcga1UoaSl9ZnVuY3Rpb24ga1UodCl7dGhpcy5fPXR9ZnVuY3Rpb24gTFUodCxlKXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKChmdW5jdGlvbih0KXt2YXIgbj0iIixpPXQuaW5kZXhPZigiLiIpO2lmKGk+PTAmJihuPXQuc2xpY2UoaSsxKSx0PXQuc2xpY2UoMCxpKSksdCYmIWUuaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7cmV0dXJue3R5cGU6dCxuYW1lOm59fSkpfWZ1bmN0aW9uIFBVKHQsZSl7Zm9yKHZhciBuLGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpaWYoKG49dFtpXSkubmFtZT09PWUpcmV0dXJuIG4udmFsdWV9ZnVuY3Rpb24gTlUodCxlLG4pe2Zvcih2YXIgaT0wLHI9dC5sZW5ndGg7aTxyOysraSlpZih0W2ldLm5hbWU9PT1lKXt0W2ldPUNVLHQ9dC5zbGljZSgwLGkpLmNvbmNhdCh0LnNsaWNlKGkrMSkpO2JyZWFrfXJldHVybiBudWxsIT1uJiZ0LnB1c2goe25hbWU6ZSx2YWx1ZTpufSksdH1rVS5wcm90b3R5cGU9QVUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjprVSxvbjpmdW5jdGlvbih0LGUpe3ZhciBuLGk9dGhpcy5fLHI9TFUodCsiIixpKSxvPS0xLGE9ci5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrZSk7Zm9yKDsrK288YTspaWYobj0odD1yW29dKS50eXBlKWlbbl09TlUoaVtuXSx0Lm5hbWUsZSk7ZWxzZSBpZihudWxsPT1lKWZvcihuIGluIGkpaVtuXT1OVShpW25dLHQubmFtZSxudWxsKTtyZXR1cm4gdGhpc31mb3IoOysrbzxhOylpZigobj0odD1yW29dKS50eXBlKSYmKG49UFUoaVtuXSx0Lm5hbWUpKSlyZXR1cm4gbn0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LGU9dGhpcy5fO2Zvcih2YXIgbiBpbiBlKXRbbl09ZVtuXS5zbGljZSgpO3JldHVybiBuZXcga1UodCl9LGNhbGw6ZnVuY3Rpb24odCxlKXtpZigobj1hcmd1bWVudHMubGVuZ3RoLTIpPjApZm9yKHZhciBuLGkscj1uZXcgQXJyYXkobiksbz0wO288bjsrK28pcltvXT1hcmd1bWVudHNbbysyXTtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2ZvcihvPTAsbj0oaT10aGlzLl9bdF0pLmxlbmd0aDtvPG47KytvKWlbb10udmFsdWUuYXBwbHkoZSxyKX0sYXBwbHk6ZnVuY3Rpb24odCxlLG4pe2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKHZhciBpPXRoaXMuX1t0XSxyPTAsbz1pLmxlbmd0aDtyPG87KytyKWlbcl0udmFsdWUuYXBwbHkoZSxuKX19O3ZhciBJVT17dmFsdWU6ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBSVSgpe2Zvcih2YXIgdCxlPTAsbj1hcmd1bWVudHMubGVuZ3RoLGk9e307ZTxuOysrZSl7aWYoISh0PWFyZ3VtZW50c1tlXSsiIil8fHQgaW4gaXx8L1tccy5dLy50ZXN0KHQpKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO2lbdF09W119cmV0dXJuIG5ldyBPVShpKX1mdW5jdGlvbiBPVSh0KXt0aGlzLl89dH1mdW5jdGlvbiB6VSh0LGUpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBuPSIiLGk9dC5pbmRleE9mKCIuIik7aWYoaT49MCYmKG49dC5zbGljZShpKzEpLHQ9dC5zbGljZSgwLGkpKSx0JiYhZS5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtyZXR1cm57dHlwZTp0LG5hbWU6bn19KSl9ZnVuY3Rpb24gRFUodCxlKXtmb3IodmFyIG4saT0wLHI9dC5sZW5ndGg7aTxyOysraSlpZigobj10W2ldKS5uYW1lPT09ZSlyZXR1cm4gbi52YWx1ZX1mdW5jdGlvbiBCVSh0LGUsbil7Zm9yKHZhciBpPTAscj10Lmxlbmd0aDtpPHI7KytpKWlmKHRbaV0ubmFtZT09PWUpe3RbaV09SVUsdD10LnNsaWNlKDAsaSkuY29uY2F0KHQuc2xpY2UoaSsxKSk7YnJlYWt9cmV0dXJuIG51bGwhPW4mJnQucHVzaCh7bmFtZTplLHZhbHVlOm59KSx0fU9VLnByb3RvdHlwZT1SVS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk9VLG9uOmZ1bmN0aW9uKHQsZSl7dmFyIG4saT10aGlzLl8scj16VSh0KyIiLGkpLG89LTEsYT1yLmxlbmd0aDtpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2lmKG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjazogIitlKTtmb3IoOysrbzxhOylpZihuPSh0PXJbb10pLnR5cGUpaVtuXT1CVShpW25dLHQubmFtZSxlKTtlbHNlIGlmKG51bGw9PWUpZm9yKG4gaW4gaSlpW25dPUJVKGlbbl0sdC5uYW1lLG51bGwpO3JldHVybiB0aGlzfWZvcig7KytvPGE7KWlmKChuPSh0PXJbb10pLnR5cGUpJiYobj1EVShpW25dLHQubmFtZSkpKXJldHVybiBufSxjb3B5OmZ1bmN0aW9uKCl7dmFyIHQ9e30sZT10aGlzLl87Zm9yKHZhciBuIGluIGUpdFtuXT1lW25dLnNsaWNlKCk7cmV0dXJuIG5ldyBPVSh0KX0sY2FsbDpmdW5jdGlvbih0LGUpe2lmKChuPWFyZ3VtZW50cy5sZW5ndGgtMik+MClmb3IodmFyIG4saSxyPW5ldyBBcnJheShuKSxvPTA7bzxuOysrbylyW29dPWFyZ3VtZW50c1tvKzJdO2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKG89MCxuPShpPXRoaXMuX1t0XSkubGVuZ3RoO288bjsrK28paVtvXS52YWx1ZS5hcHBseShlLHIpfSxhcHBseTpmdW5jdGlvbih0LGUsbil7aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3IodmFyIGk9dGhpcy5fW3RdLHI9MCxvPWkubGVuZ3RoO3I8bzsrK3IpaVtyXS52YWx1ZS5hcHBseShlLG4pfX07dmFyIEhVPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixGVT17c3ZnOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIseGh0bWw6SFUseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTtmdW5jdGlvbiBWVSh0KXt2YXIgZT10Kz0iIixuPWUuaW5kZXhPZigiOiIpO3JldHVybiBuPj0wJiYieG1sbnMiIT09KGU9dC5zbGljZSgwLG4pKSYmKHQ9dC5zbGljZShuKzEpKSxGVS5oYXNPd25Qcm9wZXJ0eShlKT97c3BhY2U6RlVbZV0sbG9jYWw6dH06dH1mdW5jdGlvbiBVVSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLm93bmVyRG9jdW1lbnQsbj10aGlzLm5hbWVzcGFjZVVSSTtyZXR1cm4gbj09PUhVJiZlLmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkk9PT1IVT9lLmNyZWF0ZUVsZW1lbnQodCk6ZS5jcmVhdGVFbGVtZW50TlMobix0KX19ZnVuY3Rpb24galUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gR1UodCl7dmFyIGU9VlUodCk7cmV0dXJuKGUubG9jYWw/alU6VVUpKGUpfWZ1bmN0aW9uIFdVKCl7fWZ1bmN0aW9uIHFVKHQpe3JldHVybiBudWxsPT10P1dVOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3Rvcih0KX19ZnVuY3Rpb24gWVUoKXtyZXR1cm5bXX1mdW5jdGlvbiBYVSh0KXtyZXR1cm4gbmV3IEFycmF5KHQubGVuZ3RoKX1mdW5jdGlvbiAkVSh0LGUpe3RoaXMub3duZXJEb2N1bWVudD10Lm93bmVyRG9jdW1lbnQsdGhpcy5uYW1lc3BhY2VVUkk9dC5uYW1lc3BhY2VVUkksdGhpcy5fbmV4dD1udWxsLHRoaXMuX3BhcmVudD10LHRoaXMuX19kYXRhX189ZX1mdW5jdGlvbiBLVSh0LGUsbixpLHIsbyl7Zm9yKHZhciBhLHM9MCxsPWUubGVuZ3RoLGM9by5sZW5ndGg7czxjOysrcykoYT1lW3NdKT8oYS5fX2RhdGFfXz1vW3NdLGlbc109YSk6bltzXT1uZXcgJFUodCxvW3NdKTtmb3IoO3M8bDsrK3MpKGE9ZVtzXSkmJihyW3NdPWEpfWZ1bmN0aW9uIFpVKHQsZSxuLGkscixvLGEpe3ZhciBzLGwsYyx1PXt9LGg9ZS5sZW5ndGgsZD1vLmxlbmd0aCxwPW5ldyBBcnJheShoKTtmb3Iocz0wO3M8aDsrK3MpKGw9ZVtzXSkmJihwW3NdPWM9IiQiK2EuY2FsbChsLGwuX19kYXRhX18scyxlKSxjIGluIHU/cltzXT1sOnVbY109bCk7Zm9yKHM9MDtzPGQ7KytzKShsPXVbYz0iJCIrYS5jYWxsKHQsb1tzXSxzLG8pXSk/KGlbc109bCxsLl9fZGF0YV9fPW9bc10sdVtjXT1udWxsKTpuW3NdPW5ldyAkVSh0LG9bc10pO2ZvcihzPTA7czxoOysrcykobD1lW3NdKSYmdVtwW3NdXT09PWwmJihyW3NdPWwpfWZ1bmN0aW9uIEpVKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTp0Pj1lPzA6TmFOfWZ1bmN0aW9uIFFVKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX1mdW5jdGlvbiB0aih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIGVqKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUodCxlKX19ZnVuY3Rpb24gbmoodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxlKX19ZnVuY3Rpb24gaWoodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpOnRoaXMuc2V0QXR0cmlidXRlKHQsbil9fWZ1bmN0aW9uIHJqKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk6dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsbil9fWZ1bmN0aW9uIG9qKHQpe3JldHVybiB0Lm93bmVyRG9jdW1lbnQmJnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8dC5kb2N1bWVudCYmdHx8dC5kZWZhdWx0Vmlld31mdW5jdGlvbiBhaih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX1mdW5jdGlvbiBzaih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LGUsbil9fWZ1bmN0aW9uIGxqKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1pP3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCk6dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LGksbil9fWZ1bmN0aW9uIGNqKHQsZSl7cmV0dXJuIHQuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShlKXx8b2oodCkuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpLmdldFByb3BlcnR5VmFsdWUoZSl9ZnVuY3Rpb24gdWoodCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbdF19fWZ1bmN0aW9uIGhqKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpc1t0XT1lfX1mdW5jdGlvbiBkaih0LGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PW4/ZGVsZXRlIHRoaXNbdF06dGhpc1t0XT1ufX1mdW5jdGlvbiBwaih0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLyl9ZnVuY3Rpb24gZmoodCl7cmV0dXJuIHQuY2xhc3NMaXN0fHxuZXcgbWoodCl9ZnVuY3Rpb24gbWoodCl7dGhpcy5fbm9kZT10LHRoaXMuX25hbWVzPXBqKHQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9ZnVuY3Rpb24gZ2oodCxlKXtmb3IodmFyIG49ZmoodCksaT0tMSxyPWUubGVuZ3RoOysraTxyOyluLmFkZChlW2ldKX1mdW5jdGlvbiBfaih0LGUpe2Zvcih2YXIgbj1maih0KSxpPS0xLHI9ZS5sZW5ndGg7KytpPHI7KW4ucmVtb3ZlKGVbaV0pfWZ1bmN0aW9uIHlqKHQpe3JldHVybiBmdW5jdGlvbigpe2dqKHRoaXMsdCl9fWZ1bmN0aW9uIHZqKHQpe3JldHVybiBmdW5jdGlvbigpe19qKHRoaXMsdCl9fWZ1bmN0aW9uIGJqKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7KGUuYXBwbHkodGhpcyxhcmd1bWVudHMpP2dqOl9qKSh0aGlzLHQpfX1mdW5jdGlvbiB4aigpe3RoaXMudGV4dENvbnRlbnQ9IiJ9ZnVuY3Rpb24gd2oodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD10fX1mdW5jdGlvbiBTaih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PWU/IiI6ZX19ZnVuY3Rpb24gTWooKXt0aGlzLmlubmVySFRNTD0iIn1mdW5jdGlvbiBFaih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD10fX1mdW5jdGlvbiBUaih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT1lPyIiOmV9fWZ1bmN0aW9uIENqKCl7dGhpcy5uZXh0U2libGluZyYmdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpfWZ1bmN0aW9uIEFqKCl7dGhpcy5wcmV2aW91c1NpYmxpbmcmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcyx0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCl9ZnVuY3Rpb24ga2ooKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBMaigpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTt0JiZ0LnJlbW92ZUNoaWxkKHRoaXMpfWZ1bmN0aW9uIFBqKCl7dmFyIHQ9dGhpcy5jbG9uZU5vZGUoITEpLGU9dGhpcy5wYXJlbnROb2RlO3JldHVybiBlP2UuaW5zZXJ0QmVmb3JlKHQsdGhpcy5uZXh0U2libGluZyk6dH1mdW5jdGlvbiBOaigpe3ZhciB0PXRoaXMuY2xvbmVOb2RlKCEwKSxlPXRoaXMucGFyZW50Tm9kZTtyZXR1cm4gZT9lLmluc2VydEJlZm9yZSh0LHRoaXMubmV4dFNpYmxpbmcpOnR9JFUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjokVSxhcHBlbmRDaGlsZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LHRoaXMuX25leHQpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LGUpfSxxdWVyeVNlbGVjdG9yOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3Rvcih0KX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCl9fSxtai5wcm90b3R5cGU9e2FkZDpmdW5jdGlvbih0KXt0aGlzLl9uYW1lcy5pbmRleE9mKHQpPDAmJih0aGlzLl9uYW1lcy5wdXNoKHQpLHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5fbmFtZXMuam9pbigiICIpKSl9LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9uYW1lcy5pbmRleE9mKHQpO2U+PTAmJih0aGlzLl9uYW1lcy5zcGxpY2UoZSwxKSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxjb250YWluczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZih0KT49MH19O3ZhciBJaj17fSxSaj1udWxsO2Z1bmN0aW9uIE9qKHQsZSxuKXtyZXR1cm4gdD16aih0LGUsbiksZnVuY3Rpb24oZSl7dmFyIG49ZS5yZWxhdGVkVGFyZ2V0O24mJihuPT09dGhpc3x8OCZuLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpKXx8dC5jYWxsKHRoaXMsZSl9fWZ1bmN0aW9uIHpqKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIHI9Umo7Umo9aTt0cnl7dC5jYWxsKHRoaXMsdGhpcy5fX2RhdGFfXyxlLG4pfWZpbmFsbHl7Umo9cn19fWZ1bmN0aW9uIERqKHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlPSIiLG49dC5pbmRleE9mKCIuIik7cmV0dXJuIG4+PTAmJihlPXQuc2xpY2UobisxKSx0PXQuc2xpY2UoMCxuKSkse3R5cGU6dCxuYW1lOmV9fSkpfWZ1bmN0aW9uIEJqKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuX19vbjtpZihlKXtmb3IodmFyIG4saT0wLHI9LTEsbz1lLmxlbmd0aDtpPG87KytpKW49ZVtpXSx0LnR5cGUmJm4udHlwZSE9PXQudHlwZXx8bi5uYW1lIT09dC5uYW1lP2VbKytyXT1uOnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLnR5cGUsbi5saXN0ZW5lcixuLmNhcHR1cmUpOysrcj9lLmxlbmd0aD1yOmRlbGV0ZSB0aGlzLl9fb259fX1mdW5jdGlvbiBIaih0LGUsbil7dmFyIGk9SWouaGFzT3duUHJvcGVydHkodC50eXBlKT9Pajp6ajtyZXR1cm4gZnVuY3Rpb24ocixvLGEpe3ZhciBzLGw9dGhpcy5fX29uLGM9aShlLG8sYSk7aWYobClmb3IodmFyIHU9MCxoPWwubGVuZ3RoO3U8aDsrK3UpaWYoKHM9bFt1XSkudHlwZT09PXQudHlwZSYmcy5uYW1lPT09dC5uYW1lKXJldHVybiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIocy50eXBlLHMubGlzdGVuZXIscy5jYXB0dXJlKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIocy50eXBlLHMubGlzdGVuZXI9YyxzLmNhcHR1cmU9biksdm9pZChzLnZhbHVlPWUpO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LnR5cGUsYyxuKSxzPXt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSx2YWx1ZTplLGxpc3RlbmVyOmMsY2FwdHVyZTpufSxsP2wucHVzaChzKTp0aGlzLl9fb249W3NdfX1mdW5jdGlvbiBGaih0LGUsbixpKXt2YXIgcj1Sajt0LnNvdXJjZUV2ZW50PVJqLFJqPXQ7dHJ5e3JldHVybiBlLmFwcGx5KG4saSl9ZmluYWxseXtSaj1yfX1mdW5jdGlvbiBWaih0LGUsbil7dmFyIGk9b2oodCkscj1pLkN1c3RvbUV2ZW50OyJmdW5jdGlvbiI9PXR5cGVvZiByP3I9bmV3IHIoZSxuKToocj1pLmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLG4/KHIuaW5pdEV2ZW50KGUsbi5idWJibGVzLG4uY2FuY2VsYWJsZSksci5kZXRhaWw9bi5kZXRhaWwpOnIuaW5pdEV2ZW50KGUsITEsITEpKSx0LmRpc3BhdGNoRXZlbnQocil9ZnVuY3Rpb24gVWoodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gVmoodGhpcyx0LGUpfX1mdW5jdGlvbiBqaih0LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBWaih0aGlzLHQsZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX0idW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiYoIm9ubW91c2VlbnRlciJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fChJaj17bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9KSk7dmFyIEdqPVtudWxsXTtmdW5jdGlvbiBXaih0LGUpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9ZX1mdW5jdGlvbiBxaih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFdqKFtbZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0KV1dLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgV2ooW1t0XV0sR2opfWZ1bmN0aW9uIFlqKCl7Zm9yKHZhciB0LGU9Umo7dD1lLnNvdXJjZUV2ZW50OyllPXQ7cmV0dXJuIGV9ZnVuY3Rpb24gWGoodCxlKXt2YXIgbj10Lm93bmVyU1ZHRWxlbWVudHx8dDtpZihuLmNyZWF0ZVNWR1BvaW50KXt2YXIgaT1uLmNyZWF0ZVNWR1BvaW50KCk7cmV0dXJuIGkueD1lLmNsaWVudFgsaS55PWUuY2xpZW50WSxbKGk9aS5tYXRyaXhUcmFuc2Zvcm0odC5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpKS54LGkueV19dmFyIHI9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm5bZS5jbGllbnRYLXIubGVmdC10LmNsaWVudExlZnQsZS5jbGllbnRZLXIudG9wLXQuY2xpZW50VG9wXX1mdW5jdGlvbiAkaih0KXt2YXIgZT1ZaigpO3JldHVybiBlLmNoYW5nZWRUb3VjaGVzJiYoZT1lLmNoYW5nZWRUb3VjaGVzWzBdKSxYaih0LGUpfWZ1bmN0aW9uIEtqKHQsZSxuKXthcmd1bWVudHMubGVuZ3RoPDMmJihuPWUsZT1ZaigpLmNoYW5nZWRUb3VjaGVzKTtmb3IodmFyIGkscj0wLG89ZT9lLmxlbmd0aDowO3I8bzsrK3IpaWYoKGk9ZVtyXSkuaWRlbnRpZmllcj09PW4pcmV0dXJuIFhqKHQsaSk7cmV0dXJuIG51bGx9ZnVuY3Rpb24gWmooKXtSai5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBKaigpe1JqLnByZXZlbnREZWZhdWx0KCksUmouc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gUWoodCl7dmFyIGU9dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbj1xaih0KS5vbigiZHJhZ3N0YXJ0LmRyYWciLEpqLCEwKTsib25zZWxlY3RzdGFydCJpbiBlP24ub24oInNlbGVjdHN0YXJ0LmRyYWciLEpqLCEwKTooZS5fX25vc2VsZWN0PWUuc3R5bGUuTW96VXNlclNlbGVjdCxlLnN0eWxlLk1velVzZXJTZWxlY3Q9Im5vbmUiKX1mdW5jdGlvbiB0Ryh0LGUpe3ZhciBuPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGk9cWoodCkub24oImRyYWdzdGFydC5kcmFnIixudWxsKTtlJiYoaS5vbigiY2xpY2suZHJhZyIsSmosITApLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aS5vbigiY2xpY2suZHJhZyIsbnVsbCl9KSwwKSksIm9uc2VsZWN0c3RhcnQiaW4gbj9pLm9uKCJzZWxlY3RzdGFydC5kcmFnIixudWxsKToobi5zdHlsZS5Nb3pVc2VyU2VsZWN0PW4uX19ub3NlbGVjdCxkZWxldGUgbi5fX25vc2VsZWN0KX1mdW5jdGlvbiBlRyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gbkcodCxlLG4saSxyLG8sYSxzLGwsYyl7dGhpcy50YXJnZXQ9dCx0aGlzLnR5cGU9ZSx0aGlzLnN1YmplY3Q9bix0aGlzLmlkZW50aWZpZXI9aSx0aGlzLmFjdGl2ZT1yLHRoaXMueD1vLHRoaXMueT1hLHRoaXMuZHg9cyx0aGlzLmR5PWwsdGhpcy5fPWN9ZnVuY3Rpb24gaUcoKXtyZXR1cm4hUmouYnV0dG9ufWZ1bmN0aW9uIHJHKCl7cmV0dXJuIHRoaXMucGFyZW50Tm9kZX1mdW5jdGlvbiBvRyh0KXtyZXR1cm4gbnVsbD09dD97eDpSai54LHk6UmoueX06dH1mdW5jdGlvbiBhRygpe3JldHVybiJvbnRvdWNoc3RhcnQiaW4gdGhpc31Xai5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOldqLHNlbGVjdDpmdW5jdGlvbiBzRyh0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9cVUodCkpO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj1lLmxlbmd0aCxpPW5ldyBBcnJheShuKSxyPTA7cjxuOysrcilmb3IodmFyIG8sYSxzPWVbcl0sbD1zLmxlbmd0aCxjPWlbcl09bmV3IEFycmF5KGwpLHU9MDt1PGw7Kyt1KShvPXNbdV0pJiYoYT10LmNhbGwobyxvLl9fZGF0YV9fLHUscykpJiYoIl9fZGF0YV9fImluIG8mJihhLl9fZGF0YV9fPW8uX19kYXRhX18pLGNbdV09YSk7cmV0dXJuIG5ldyBXaihpLHRoaXMuX3BhcmVudHMpfSxzZWxlY3RBbGw6ZnVuY3Rpb24gbEcodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PShmdW5jdGlvbiBlKHQpe3JldHVybiBudWxsPT10P1lVOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbCh0KX19KSh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxpPW4ubGVuZ3RoLHI9W10sbz1bXSxhPTA7YTxpOysrYSlmb3IodmFyIHMsbD1uW2FdLGM9bC5sZW5ndGgsdT0wO3U8YzsrK3UpKHM9bFt1XSkmJihyLnB1c2godC5jYWxsKHMscy5fX2RhdGFfXyx1LGwpKSxvLnB1c2gocykpO3JldHVybiBuZXcgV2oocixvKX0sZmlsdGVyOmZ1bmN0aW9uIGNHKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD0oZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXRjaGVzKHQpfX0pKHQpKTtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGk9bi5sZW5ndGgscj1uZXcgQXJyYXkoaSksbz0wO288aTsrK28pZm9yKHZhciBhLHM9bltvXSxsPXMubGVuZ3RoLGM9cltvXT1bXSx1PTA7dTxsOysrdSkoYT1zW3VdKSYmdC5jYWxsKGEsYS5fX2RhdGFfXyx1LHMpJiZjLnB1c2goYSk7cmV0dXJuIG5ldyBXaihyLHRoaXMuX3BhcmVudHMpfSxkYXRhOmZ1bmN0aW9uIHVHKHQsZSl7aWYoIXQpcmV0dXJuIGY9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSx1PS0xLHRoaXMuZWFjaCgoZnVuY3Rpb24odCl7ZlsrK3VdPXR9KSksZjt2YXIgbj1lP1pVOktVLGk9dGhpcy5fcGFyZW50cyxyPXRoaXMuX2dyb3VwczsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9KGZ1bmN0aW9uIG8odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSkodCkpO2Zvcih2YXIgYT1yLmxlbmd0aCxzPW5ldyBBcnJheShhKSxsPW5ldyBBcnJheShhKSxjPW5ldyBBcnJheShhKSx1PTA7dTxhOysrdSl7dmFyIGg9aVt1XSxkPXJbdV0scD1kLmxlbmd0aCxmPXQuY2FsbChoLGgmJmguX19kYXRhX18sdSxpKSxtPWYubGVuZ3RoLGc9bFt1XT1uZXcgQXJyYXkobSksXz1zW3VdPW5ldyBBcnJheShtKTtuKGgsZCxnLF8sY1t1XT1uZXcgQXJyYXkocCksZixlKTtmb3IodmFyIHksdixiPTAseD0wO2I8bTsrK2IpaWYoeT1nW2JdKXtmb3IoYj49eCYmKHg9YisxKTshKHY9X1t4XSkmJisreDxtOyk7eS5fbmV4dD12fHxudWxsfX1yZXR1cm4ocz1uZXcgV2oocyxpKSkuX2VudGVyPWwscy5fZXhpdD1jLHN9LGVudGVyOmZ1bmN0aW9uIGhHKCl7cmV0dXJuIG5ldyBXaih0aGlzLl9lbnRlcnx8dGhpcy5fZ3JvdXBzLm1hcChYVSksdGhpcy5fcGFyZW50cyl9LGV4aXQ6ZnVuY3Rpb24gZEcoKXtyZXR1cm4gbmV3IFdqKHRoaXMuX2V4aXR8fHRoaXMuX2dyb3Vwcy5tYXAoWFUpLHRoaXMuX3BhcmVudHMpfSxqb2luOmZ1bmN0aW9uIHBHKHQsZSxuKXt2YXIgaT10aGlzLmVudGVyKCkscj10aGlzLG89dGhpcy5leGl0KCk7cmV0dXJuIGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dChpKTppLmFwcGVuZCh0KyIiKSxudWxsIT1lJiYocj1lKHIpKSxudWxsPT1uP28ucmVtb3ZlKCk6bihvKSxpJiZyP2kubWVyZ2Uocikub3JkZXIoKTpyfSxtZXJnZTpmdW5jdGlvbiBmRyh0KXtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49dC5fZ3JvdXBzLGk9ZS5sZW5ndGgscj1NYXRoLm1pbihpLG4ubGVuZ3RoKSxvPW5ldyBBcnJheShpKSxhPTA7YTxyOysrYSlmb3IodmFyIHMsbD1lW2FdLGM9blthXSx1PWwubGVuZ3RoLGg9b1thXT1uZXcgQXJyYXkodSksZD0wO2Q8dTsrK2QpKHM9bFtkXXx8Y1tkXSkmJihoW2RdPXMpO2Zvcig7YTxpOysrYSlvW2FdPWVbYV07cmV0dXJuIG5ldyBXaihvLHRoaXMuX3BhcmVudHMpfSxvcmRlcjpmdW5jdGlvbiBtRygpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsZT0tMSxuPXQubGVuZ3RoOysrZTxuOylmb3IodmFyIGkscj10W2VdLG89ci5sZW5ndGgtMSxhPXJbb107LS1vPj0wOykoaT1yW29dKSYmKGEmJjReaS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhKSYmYS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShpLGEpLGE9aSk7cmV0dXJuIHRoaXN9LHNvcnQ6ZnVuY3Rpb24gZ0codCl7ZnVuY3Rpb24gZShlLG4pe3JldHVybiBlJiZuP3QoZS5fX2RhdGFfXyxuLl9fZGF0YV9fKTohZS0hbn10fHwodD1KVSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxpPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGkpLG89MDtvPGk7KytvKXtmb3IodmFyIGEscz1uW29dLGw9cy5sZW5ndGgsYz1yW29dPW5ldyBBcnJheShsKSx1PTA7dTxsOysrdSkoYT1zW3VdKSYmKGNbdV09YSk7Yy5zb3J0KGUpfXJldHVybiBuZXcgV2oocix0aGlzLl9wYXJlbnRzKS5vcmRlcigpfSxjYWxsOmZ1bmN0aW9uIF9HKCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMF09dGhpcyx0LmFwcGx5KG51bGwsYXJndW1lbnRzKSx0aGlzfSxub2RlczpmdW5jdGlvbiB5Rygpe3ZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSksZT0tMTtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3RbKytlXT10aGlzfSkpLHR9LG5vZGU6ZnVuY3Rpb24gdkcoKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLGU9MCxuPXQubGVuZ3RoO2U8bjsrK2UpZm9yKHZhciBpPXRbZV0scj0wLG89aS5sZW5ndGg7cjxvOysrcil7dmFyIGE9aVtyXTtpZihhKXJldHVybiBhfXJldHVybiBudWxsfSxzaXplOmZ1bmN0aW9uIGJHKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpeysrdH0pKSx0fSxlbXB0eTpmdW5jdGlvbiB4Rygpe3JldHVybiF0aGlzLm5vZGUoKX0sZWFjaDpmdW5jdGlvbiB3Ryh0KXtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49MCxpPWUubGVuZ3RoO248aTsrK24pZm9yKHZhciByLG89ZVtuXSxhPTAscz1vLmxlbmd0aDthPHM7KythKShyPW9bYV0pJiZ0LmNhbGwocixyLl9fZGF0YV9fLGEsbyk7cmV0dXJuIHRoaXN9LGF0dHI6ZnVuY3Rpb24gU0codCxlKXt2YXIgbj1WVSh0KTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciBpPXRoaXMubm9kZSgpO3JldHVybiBuLmxvY2FsP2kuZ2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsKTppLmdldEF0dHJpYnV0ZShuKX1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1lP24ubG9jYWw/dGo6UVU6ImZ1bmN0aW9uIj09dHlwZW9mIGU/bi5sb2NhbD9yajppajpuLmxvY2FsP25qOmVqKShuLGUpKX0sc3R5bGU6ZnVuY3Rpb24gTUcodCxlLG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKChudWxsPT1lP2FqOiJmdW5jdGlvbiI9PXR5cGVvZiBlP2xqOnNqKSh0LGUsbnVsbD09bj8iIjpuKSk6Y2oodGhpcy5ub2RlKCksdCl9LHByb3BlcnR5OmZ1bmN0aW9uIEVHKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PWU/dWo6ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZGo6aGopKHQsZSkpOnRoaXMubm9kZSgpW3RdfSxjbGFzc2VkOmZ1bmN0aW9uIFRHKHQsZSl7dmFyIG49cGoodCsiIik7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodmFyIGk9ZmoodGhpcy5ub2RlKCkpLHI9LTEsbz1uLmxlbmd0aDsrK3I8bzspaWYoIWkuY29udGFpbnMobltyXSkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIGU/Ymo6ZT95ajp2aikobixlKSl9LHRleHQ6ZnVuY3Rpb24gQ0codCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKG51bGw9PXQ/eGo6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P1NqOndqKSh0KSk6dGhpcy5ub2RlKCkudGV4dENvbnRlbnR9LGh0bWw6ZnVuY3Rpb24gQUcodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKG51bGw9PXQ/TWo6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P1RqOkVqKSh0KSk6dGhpcy5ub2RlKCkuaW5uZXJIVE1MfSxyYWlzZTpmdW5jdGlvbiBrRygpe3JldHVybiB0aGlzLmVhY2goQ2opfSxsb3dlcjpmdW5jdGlvbiBMRygpe3JldHVybiB0aGlzLmVhY2goQWopfSxhcHBlbmQ6ZnVuY3Rpb24gUEcodCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpHVSh0KTtyZXR1cm4gdGhpcy5zZWxlY3QoKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSkpfSxpbnNlcnQ6ZnVuY3Rpb24gTkcodCxlKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkdVKHQpLGk9bnVsbD09ZT9rajoiZnVuY3Rpb24iPT10eXBlb2YgZT9lOnFVKGUpO3JldHVybiB0aGlzLnNlbGVjdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUobi5hcHBseSh0aGlzLGFyZ3VtZW50cyksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSkpfSxyZW1vdmU6ZnVuY3Rpb24gSUcoKXtyZXR1cm4gdGhpcy5lYWNoKExqKX0sY2xvbmU6ZnVuY3Rpb24gUkcodCl7cmV0dXJuIHRoaXMuc2VsZWN0KHQ/Tmo6UGopfSxkYXR1bTpmdW5jdGlvbiBPRyh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsdCk6dGhpcy5ub2RlKCkuX19kYXRhX199LG9uOmZ1bmN0aW9uIHpHKHQsZSxuKXt2YXIgaSxyLG89RGoodCsiIiksYT1vLmxlbmd0aDtpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2ZvcihzPWU/SGo6QmosbnVsbD09biYmKG49ITEpLGk9MDtpPGE7KytpKXRoaXMuZWFjaChzKG9baV0sZSxuKSk7cmV0dXJuIHRoaXN9dmFyIHM9dGhpcy5ub2RlKCkuX19vbjtpZihzKWZvcih2YXIgbCxjPTAsdT1zLmxlbmd0aDtjPHU7KytjKWZvcihpPTAsbD1zW2NdO2k8YTsrK2kpaWYoKHI9b1tpXSkudHlwZT09PWwudHlwZSYmci5uYW1lPT09bC5uYW1lKXJldHVybiBsLnZhbHVlfSxkaXNwYXRjaDpmdW5jdGlvbiBERyh0LGUpe3JldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBlP2pqOlVqKSh0LGUpKX19LG5HLnByb3RvdHlwZS5vbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuXy5vbi5hcHBseSh0aGlzLl8sYXJndW1lbnRzKTtyZXR1cm4gdD09PXRoaXMuXz90aGlzOnR9O3ZhciBCRz17fSxIRz17fTtmdW5jdGlvbiBGRyh0KXtyZXR1cm4gbmV3IEZ1bmN0aW9uKCJkIiwicmV0dXJuIHsiK3QubWFwKChmdW5jdGlvbih0LGUpe3JldHVybiBKU09OLnN0cmluZ2lmeSh0KSsiOiBkWyIrZSsiXSJ9KSkuam9pbigiLCIpKyJ9Iil9ZnVuY3Rpb24gVkcodCl7dmFyIGU9bmV3IFJlZ0V4cCgnWyInK3QrIlxuXHJdIiksbj10LmNoYXJDb2RlQXQoMCk7ZnVuY3Rpb24gaSh0LGUpe3ZhciBpLHI9W10sbz10Lmxlbmd0aCxhPTAscz0wLGw9bzw9MCxjPSExO2Z1bmN0aW9uIHUoKXtpZihsKXJldHVybiBIRztpZihjKXJldHVybiBjPSExLEJHO3ZhciBlLGkscj1hO2lmKDM0PT09dC5jaGFyQ29kZUF0KHIpKXtmb3IoO2ErKzxvJiYzNCE9PXQuY2hhckNvZGVBdChhKXx8MzQ9PT10LmNoYXJDb2RlQXQoKythKTspO3JldHVybihlPWEpPj1vP2w9ITA6MTA9PT0oaT10LmNoYXJDb2RlQXQoYSsrKSk/Yz0hMDoxMz09PWkmJihjPSEwLDEwPT09dC5jaGFyQ29kZUF0KGEpJiYrK2EpLHQuc2xpY2UocisxLGUtMSkucmVwbGFjZSgvIiIvZywnIicpfWZvcig7YTxvOyl7aWYoMTA9PT0oaT10LmNoYXJDb2RlQXQoZT1hKyspKSljPSEwO2Vsc2UgaWYoMTM9PT1pKWM9ITAsMTA9PT10LmNoYXJDb2RlQXQoYSkmJisrYTtlbHNlIGlmKGkhPT1uKWNvbnRpbnVlO3JldHVybiB0LnNsaWNlKHIsZSl9cmV0dXJuIGw9ITAsdC5zbGljZShyLG8pfWZvcigxMD09PXQuY2hhckNvZGVBdChvLTEpJiYtLW8sMTM9PT10LmNoYXJDb2RlQXQoby0xKSYmLS1vOyhpPXUoKSkhPT1IRzspe2Zvcih2YXIgaD1bXTtpIT09QkcmJmkhPT1IRzspaC5wdXNoKGkpLGk9dSgpO2UmJm51bGw9PShoPWUoaCxzKyspKXx8ci5wdXNoKGgpfXJldHVybiByfWZ1bmN0aW9uIHIoZSl7cmV0dXJuIGUubWFwKG8pLmpvaW4odCl9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbnVsbD09dD8iIjplLnRlc3QodCs9IiIpPyciJyt0LnJlcGxhY2UoLyIvZywnIiInKSsnIic6dH1yZXR1cm57cGFyc2U6ZnVuY3Rpb24gYSh0LGUpe3ZhciBuLHIsbz1pKHQsKGZ1bmN0aW9uKHQsaSl7aWYobilyZXR1cm4gbih0LGktMSk7cj10LG49ZT8oZnVuY3Rpb24gbyh0LGUpe3ZhciBuPUZHKHQpO3JldHVybiBmdW5jdGlvbihpLHIpe3JldHVybiBlKG4oaSkscix0KX19KSh0LGUpOkZHKHQpfSkpO3JldHVybiBvLmNvbHVtbnM9cnx8W10sb30scGFyc2VSb3dzOmksZm9ybWF0OmZ1bmN0aW9uIHMoZSxuKXtyZXR1cm4gbnVsbD09biYmKG49KGZ1bmN0aW9uIGkodCl7dmFyIGU9T2JqZWN0LmNyZWF0ZShudWxsKSxuPVtdO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2Zvcih2YXIgaSBpbiB0KWkgaW4gZXx8bi5wdXNoKGVbaV09aSl9KSksbn0pKGUpKSxbbi5tYXAobykuam9pbih0KV0uY29uY2F0KGUubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gbi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBvKGVbdF0pfSkpLmpvaW4odCl9KSkpLmpvaW4oIlxuIil9LGZvcm1hdFJvd3M6ZnVuY3Rpb24gbCh0KXtyZXR1cm4gdC5tYXAocikuam9pbigiXG4iKX19fXZhciBVRz1WRygiLCIpLGpHPVVHLnBhcnNlLEdHPVVHLnBhcnNlUm93cyxXRz1VRy5mb3JtYXQscUc9VUcuZm9ybWF0Um93cyxZRz1WRygiXHQiKSxYRz1ZRy5wYXJzZSwkRz1ZRy5wYXJzZVJvd3MsS0c9WUcuZm9ybWF0LFpHPVlHLmZvcm1hdFJvd3M7ZnVuY3Rpb24gSkcodCl7cmV0dXJuKCh0Kj0yKTw9MT90KnQ6LS10KigyLXQpKzEpLzJ9ZnVuY3Rpb24gUUcodCl7cmV0dXJuKCh0Kj0yKTw9MT90KnQqdDoodC09MikqdCp0KzIpLzJ9dmFyIHRXPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIE1hdGgucG93KHQsZSl9cmV0dXJuIGU9K2Usbi5leHBvbmVudD10LG59KSgzKSxlVz0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiAxLU1hdGgucG93KDEtdCxlKX1yZXR1cm4gZT0rZSxuLmV4cG9uZW50PXQsbn0pKDMpLG5XPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuKCh0Kj0yKTw9MT9NYXRoLnBvdyh0LGUpOjItTWF0aC5wb3coMi10LGUpKS8yfXJldHVybiBlPStlLG4uZXhwb25lbnQ9dCxufSkoMyksaVc9TWF0aC5QSSxyVz1pVy8yO2Z1bmN0aW9uIG9XKHQpe3JldHVybigxLU1hdGguY29zKGlXKnQpKS8yfWZ1bmN0aW9uIGFXKHQpe3JldHVybigodCo9Mik8PTE/TWF0aC5wb3coMiwxMCp0LTEwKToyLU1hdGgucG93KDIsMTAtMTAqdCkpLzJ9ZnVuY3Rpb24gc1codCl7cmV0dXJuKCh0Kj0yKTw9MT8xLU1hdGguc3FydCgxLXQqdCk6TWF0aC5zcXJ0KDEtKHQtPTIpKnQpKzEpLzJ9dmFyIGxXPTcuNTYyNTtmdW5jdGlvbiBjVyh0KXtyZXR1cm4odD0rdCk8LjM2MzYzNjM2MzYzNjM2MzY1P2xXKnQqdDp0PC43MjcyNzI3MjcyNzI3MjczP2xXKih0LT0uNTQ1NDU0NTQ1NDU0NTQ1NCkqdCsuNzU6dDwuOTA5MDkwOTA5MDkwOTA5MT9sVyoodC09LjgxODE4MTgxODE4MTgxODIpKnQrLjkzNzU6bFcqKHQtPS45NTQ1NDU0NTQ1NDU0NTQ2KSp0Ky45ODQzNzV9dmFyIHVXPTEuNzAxNTgsaFc9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdCp0KigoZSsxKSp0LWUpfXJldHVybiBlPStlLG4ub3ZlcnNob290PXQsbn0pKHVXKSxkVz0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybi0tdCp0KigoZSsxKSp0K2UpKzF9cmV0dXJuIGU9K2Usbi5vdmVyc2hvb3Q9dCxufSkodVcpLHBXPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuKCh0Kj0yKTwxP3QqdCooKGUrMSkqdC1lKToodC09MikqdCooKGUrMSkqdCtlKSsyKS8yfXJldHVybiBlPStlLG4ub3ZlcnNob290PXQsbn0pKHVXKSxmVz0yKk1hdGguUEksbVc9KGZ1bmN0aW9uIHQoZSxuKXt2YXIgaT1NYXRoLmFzaW4oMS8oZT1NYXRoLm1heCgxLGUpKSkqKG4vPWZXKTtmdW5jdGlvbiByKHQpe3JldHVybiBlKk1hdGgucG93KDIsMTAqLS10KSpNYXRoLnNpbigoaS10KS9uKX1yZXR1cm4gci5hbXBsaXR1ZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSxuKmZXKX0sci5wZXJpb2Q9ZnVuY3Rpb24obil7cmV0dXJuIHQoZSxuKX0scn0pKDEsLjMpLGdXPShmdW5jdGlvbiB0KGUsbil7dmFyIGk9TWF0aC5hc2luKDEvKGU9TWF0aC5tYXgoMSxlKSkpKihuLz1mVyk7ZnVuY3Rpb24gcih0KXtyZXR1cm4gMS1lKk1hdGgucG93KDIsLTEwKih0PSt0KSkqTWF0aC5zaW4oKHQraSkvbil9cmV0dXJuIHIuYW1wbGl0dWRlPWZ1bmN0aW9uKGUpe3JldHVybiB0KGUsbipmVyl9LHIucGVyaW9kPWZ1bmN0aW9uKG4pe3JldHVybiB0KGUsbil9LHJ9KSgxLC4zKSxfVz0oZnVuY3Rpb24gdChlLG4pe3ZhciBpPU1hdGguYXNpbigxLyhlPU1hdGgubWF4KDEsZSkpKSoobi89ZlcpO2Z1bmN0aW9uIHIodCl7cmV0dXJuKCh0PTIqdC0xKTwwP2UqTWF0aC5wb3coMiwxMCp0KSpNYXRoLnNpbigoaS10KS9uKToyLWUqTWF0aC5wb3coMiwtMTAqdCkqTWF0aC5zaW4oKGkrdCkvbikpLzJ9cmV0dXJuIHIuYW1wbGl0dWRlPWZ1bmN0aW9uKGUpe3JldHVybiB0KGUsbipmVyl9LHIucGVyaW9kPWZ1bmN0aW9uKG4pe3JldHVybiB0KGUsbil9LHJ9KSgxLC4zKTtmdW5jdGlvbiB5Vyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gdlcoKXtyZXR1cm4gMWUtNiooTWF0aC5yYW5kb20oKS0uNSl9ZnVuY3Rpb24gYlcodCxlLG4saSl7aWYoaXNOYU4oZSl8fGlzTmFOKG4pKXJldHVybiB0O3ZhciByLG8sYSxzLGwsYyx1LGgsZCxwPXQuX3Jvb3QsZj17ZGF0YTppfSxtPXQuX3gwLGc9dC5feTAsXz10Ll94MSx5PXQuX3kxO2lmKCFwKXJldHVybiB0Ll9yb290PWYsdDtmb3IoO3AubGVuZ3RoOylpZigoYz1lPj0obz0obStfKS8yKSk/bT1vOl89bywodT1uPj0oYT0oZyt5KS8yKSk/Zz1hOnk9YSxyPXAsIShwPXBbaD11PDwxfGNdKSlyZXR1cm4gcltoXT1mLHQ7aWYocz0rdC5feC5jYWxsKG51bGwscC5kYXRhKSxsPSt0Ll95LmNhbGwobnVsbCxwLmRhdGEpLGU9PT1zJiZuPT09bClyZXR1cm4gZi5uZXh0PXAscj9yW2hdPWY6dC5fcm9vdD1mLHQ7ZG97cj1yP3JbaF09bmV3IEFycmF5KDQpOnQuX3Jvb3Q9bmV3IEFycmF5KDQpLChjPWU+PShvPShtK18pLzIpKT9tPW86Xz1vLCh1PW4+PShhPShnK3kpLzIpKT9nPWE6eT1hfXdoaWxlKChoPXU8PDF8Yyk9PShkPShsPj1hKTw8MXxzPj1vKSk7cmV0dXJuIHJbZF09cCxyW2hdPWYsdH1mdW5jdGlvbiB4Vyh0LGUsbixpLHIpe3RoaXMubm9kZT10LHRoaXMueDA9ZSx0aGlzLnkwPW4sdGhpcy54MT1pLHRoaXMueTE9cn1mdW5jdGlvbiB3Vyh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBTVyh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBNVyh0LGUsbil7dmFyIGk9bmV3IEVXKG51bGw9PWU/d1c6ZSxudWxsPT1uP1NXOm4sTmFOLE5hTixOYU4sTmFOKTtyZXR1cm4gbnVsbD09dD9pOmkuYWRkQWxsKHQpfWZ1bmN0aW9uIEVXKHQsZSxuLGkscixvKXt0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3gwPW4sdGhpcy5feTA9aSx0aGlzLl94MT1yLHRoaXMuX3kxPW8sdGhpcy5fcm9vdD12b2lkIDB9ZnVuY3Rpb24gVFcodCl7Zm9yKHZhciBlPXtkYXRhOnQuZGF0YX0sbj1lO3Q9dC5uZXh0OyluPW4ubmV4dD17ZGF0YTp0LmRhdGF9O3JldHVybiBlfXZhciBDVz1NVy5wcm90b3R5cGU9RVcucHJvdG90eXBlO2Z1bmN0aW9uIEFXKHQpe3JldHVybiB0LngrdC52eH1mdW5jdGlvbiBrVyh0KXtyZXR1cm4gdC55K3Qudnl9Q1cuY29weT1mdW5jdGlvbigpe3ZhciB0LGUsbj1uZXcgRVcodGhpcy5feCx0aGlzLl95LHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSxpPXRoaXMuX3Jvb3Q7aWYoIWkpcmV0dXJuIG47aWYoIWkubGVuZ3RoKXJldHVybiBuLl9yb290PVRXKGkpLG47Zm9yKHQ9W3tzb3VyY2U6aSx0YXJnZXQ6bi5fcm9vdD1uZXcgQXJyYXkoNCl9XTtpPXQucG9wKCk7KWZvcih2YXIgcj0wO3I8NDsrK3IpKGU9aS5zb3VyY2Vbcl0pJiYoZS5sZW5ndGg/dC5wdXNoKHtzb3VyY2U6ZSx0YXJnZXQ6aS50YXJnZXRbcl09bmV3IEFycmF5KDQpfSk6aS50YXJnZXRbcl09VFcoZSkpO3JldHVybiBufSxDVy5hZGQ9ZnVuY3Rpb24gTFcodCl7dmFyIGU9K3RoaXMuX3guY2FsbChudWxsLHQpLG49K3RoaXMuX3kuY2FsbChudWxsLHQpO3JldHVybiBiVyh0aGlzLmNvdmVyKGUsbiksZSxuLHQpfSxDVy5hZGRBbGw9ZnVuY3Rpb24gUFcodCl7dmFyIGUsbixpLHIsbz10Lmxlbmd0aCxhPW5ldyBBcnJheShvKSxzPW5ldyBBcnJheShvKSxsPTEvMCxjPTEvMCx1PS0xLzAsaD0tMS8wO2ZvcihuPTA7bjxvOysrbilpc05hTihpPSt0aGlzLl94LmNhbGwobnVsbCxlPXRbbl0pKXx8aXNOYU4ocj0rdGhpcy5feS5jYWxsKG51bGwsZSkpfHwoYVtuXT1pLHNbbl09cixpPGwmJihsPWkpLGk+dSYmKHU9aSkscjxjJiYoYz1yKSxyPmgmJihoPXIpKTtpZihsPnV8fGM+aClyZXR1cm4gdGhpcztmb3IodGhpcy5jb3ZlcihsLGMpLmNvdmVyKHUsaCksbj0wO248bzsrK24pYlcodGhpcyxhW25dLHNbbl0sdFtuXSk7cmV0dXJuIHRoaXN9LENXLmNvdmVyPWZ1bmN0aW9uIE5XKHQsZSl7aWYoaXNOYU4odD0rdCl8fGlzTmFOKGU9K2UpKXJldHVybiB0aGlzO3ZhciBuPXRoaXMuX3gwLGk9dGhpcy5feTAscj10aGlzLl94MSxvPXRoaXMuX3kxO2lmKGlzTmFOKG4pKXI9KG49TWF0aC5mbG9vcih0KSkrMSxvPShpPU1hdGguZmxvb3IoZSkpKzE7ZWxzZXtmb3IodmFyIGEscyxsPXItbixjPXRoaXMuX3Jvb3Q7bj50fHx0Pj1yfHxpPmV8fGU+PW87KXN3aXRjaChzPShlPGkpPDwxfHQ8biwoYT1uZXcgQXJyYXkoNCkpW3NdPWMsYz1hLGwqPTIscyl7Y2FzZSAwOnI9bitsLG89aStsO2JyZWFrO2Nhc2UgMTpuPXItbCxvPWkrbDticmVhaztjYXNlIDI6cj1uK2wsaT1vLWw7YnJlYWs7Y2FzZSAzOm49ci1sLGk9by1sfXRoaXMuX3Jvb3QmJnRoaXMuX3Jvb3QubGVuZ3RoJiYodGhpcy5fcm9vdD1jKX1yZXR1cm4gdGhpcy5feDA9bix0aGlzLl95MD1pLHRoaXMuX3gxPXIsdGhpcy5feTE9byx0aGlzfSxDVy5kYXRhPWZ1bmN0aW9uIElXKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMudmlzaXQoKGZ1bmN0aW9uKGUpe2lmKCFlLmxlbmd0aClkb3t0LnB1c2goZS5kYXRhKX13aGlsZShlPWUubmV4dCl9KSksdH0sQ1cuZXh0ZW50PWZ1bmN0aW9uIFJXKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuY292ZXIoK3RbMF1bMF0sK3RbMF1bMV0pLmNvdmVyKCt0WzFdWzBdLCt0WzFdWzFdKTppc05hTih0aGlzLl94MCk/dm9pZCAwOltbdGhpcy5feDAsdGhpcy5feTBdLFt0aGlzLl94MSx0aGlzLl95MV1dfSxDVy5maW5kPWZ1bmN0aW9uIE9XKHQsZSxuKXt2YXIgaSxyLG8sYSxzLGwsYyx1PXRoaXMuX3gwLGg9dGhpcy5feTAsZD10aGlzLl94MSxwPXRoaXMuX3kxLGY9W10sbT10aGlzLl9yb290O2ZvcihtJiZmLnB1c2gobmV3IHhXKG0sdSxoLGQscCkpLG51bGw9PW4/bj0xLzA6KHU9dC1uLGg9ZS1uLGQ9dCtuLHA9ZStuLG4qPW4pO2w9Zi5wb3AoKTspaWYoISghKG09bC5ub2RlKXx8KHI9bC54MCk+ZHx8KG89bC55MCk+cHx8KGE9bC54MSk8dXx8KHM9bC55MSk8aCkpaWYobS5sZW5ndGgpe3ZhciBnPShyK2EpLzIsXz0obytzKS8yO2YucHVzaChuZXcgeFcobVszXSxnLF8sYSxzKSxuZXcgeFcobVsyXSxyLF8sZyxzKSxuZXcgeFcobVsxXSxnLG8sYSxfKSxuZXcgeFcobVswXSxyLG8sZyxfKSksKGM9KGU+PV8pPDwxfHQ+PWcpJiYobD1mW2YubGVuZ3RoLTFdLGZbZi5sZW5ndGgtMV09ZltmLmxlbmd0aC0xLWNdLGZbZi5sZW5ndGgtMS1jXT1sKX1lbHNle3ZhciB5PXQtK3RoaXMuX3guY2FsbChudWxsLG0uZGF0YSksdj1lLSt0aGlzLl95LmNhbGwobnVsbCxtLmRhdGEpLGI9eSp5K3YqdjtpZihiPG4pe3ZhciB4PU1hdGguc3FydChuPWIpO3U9dC14LGg9ZS14LGQ9dCt4LHA9ZSt4LGk9bS5kYXRhfX1yZXR1cm4gaX0sQ1cucmVtb3ZlPWZ1bmN0aW9uIHpXKHQpe2lmKGlzTmFOKG89K3RoaXMuX3guY2FsbChudWxsLHQpKXx8aXNOYU4oYT0rdGhpcy5feS5jYWxsKG51bGwsdCkpKXJldHVybiB0aGlzO3ZhciBlLG4saSxyLG8sYSxzLGwsYyx1LGgsZCxwPXRoaXMuX3Jvb3QsZj10aGlzLl94MCxtPXRoaXMuX3kwLGc9dGhpcy5feDEsXz10aGlzLl95MTtpZighcClyZXR1cm4gdGhpcztpZihwLmxlbmd0aClmb3IoOzspe2lmKChjPW8+PShzPShmK2cpLzIpKT9mPXM6Zz1zLCh1PWE+PShsPShtK18pLzIpKT9tPWw6Xz1sLGU9cCwhKHA9cFtoPXU8PDF8Y10pKXJldHVybiB0aGlzO2lmKCFwLmxlbmd0aClicmVhazsoZVtoKzEmM118fGVbaCsyJjNdfHxlW2grMyYzXSkmJihuPWUsZD1oKX1mb3IoO3AuZGF0YSE9PXQ7KWlmKGk9cCwhKHA9cC5uZXh0KSlyZXR1cm4gdGhpcztyZXR1cm4ocj1wLm5leHQpJiZkZWxldGUgcC5uZXh0LGk/KHI/aS5uZXh0PXI6ZGVsZXRlIGkubmV4dCx0aGlzKTplPyhyP2VbaF09cjpkZWxldGUgZVtoXSwocD1lWzBdfHxlWzFdfHxlWzJdfHxlWzNdKSYmcD09PShlWzNdfHxlWzJdfHxlWzFdfHxlWzBdKSYmIXAubGVuZ3RoJiYobj9uW2RdPXA6dGhpcy5fcm9vdD1wKSx0aGlzKToodGhpcy5fcm9vdD1yLHRoaXMpfSxDVy5yZW1vdmVBbGw9ZnVuY3Rpb24gRFcodCl7Zm9yKHZhciBlPTAsbj10Lmxlbmd0aDtlPG47KytlKXRoaXMucmVtb3ZlKHRbZV0pO3JldHVybiB0aGlzfSxDVy5yb290PWZ1bmN0aW9uIEJXKCl7cmV0dXJuIHRoaXMuX3Jvb3R9LENXLnNpemU9ZnVuY3Rpb24gSFcoKXt2YXIgdD0wO3JldHVybiB0aGlzLnZpc2l0KChmdW5jdGlvbihlKXtpZighZS5sZW5ndGgpZG97Kyt0fXdoaWxlKGU9ZS5uZXh0KX0pKSx0fSxDVy52aXNpdD1mdW5jdGlvbiBGVyh0KXt2YXIgZSxuLGkscixvLGEscz1bXSxsPXRoaXMuX3Jvb3Q7Zm9yKGwmJnMucHVzaChuZXcgeFcobCx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkpO2U9cy5wb3AoKTspaWYoIXQobD1lLm5vZGUsaT1lLngwLHI9ZS55MCxvPWUueDEsYT1lLnkxKSYmbC5sZW5ndGgpe3ZhciBjPShpK28pLzIsdT0ocithKS8yOyhuPWxbM10pJiZzLnB1c2gobmV3IHhXKG4sYyx1LG8sYSkpLChuPWxbMl0pJiZzLnB1c2gobmV3IHhXKG4saSx1LGMsYSkpLChuPWxbMV0pJiZzLnB1c2gobmV3IHhXKG4sYyxyLG8sdSkpLChuPWxbMF0pJiZzLnB1c2gobmV3IHhXKG4saSxyLGMsdSkpfXJldHVybiB0aGlzfSxDVy52aXNpdEFmdGVyPWZ1bmN0aW9uIFZXKHQpe3ZhciBlLG49W10saT1bXTtmb3IodGhpcy5fcm9vdCYmbi5wdXNoKG5ldyB4Vyh0aGlzLl9yb290LHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSk7ZT1uLnBvcCgpOyl7dmFyIHI9ZS5ub2RlO2lmKHIubGVuZ3RoKXt2YXIgbyxhPWUueDAscz1lLnkwLGw9ZS54MSxjPWUueTEsdT0oYStsKS8yLGg9KHMrYykvMjsobz1yWzBdKSYmbi5wdXNoKG5ldyB4VyhvLGEscyx1LGgpKSwobz1yWzFdKSYmbi5wdXNoKG5ldyB4VyhvLHUscyxsLGgpKSwobz1yWzJdKSYmbi5wdXNoKG5ldyB4VyhvLGEsaCx1LGMpKSwobz1yWzNdKSYmbi5wdXNoKG5ldyB4VyhvLHUsaCxsLGMpKX1pLnB1c2goZSl9Zm9yKDtlPWkucG9wKCk7KXQoZS5ub2RlLGUueDAsZS55MCxlLngxLGUueTEpO3JldHVybiB0aGlzfSxDVy54PWZ1bmN0aW9uIFVXKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl94PXQsdGhpcyk6dGhpcy5feH0sQ1cueT1mdW5jdGlvbiBqVyh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5feT10LHRoaXMpOnRoaXMuX3l9O3ZhciBHVz0iJCI7ZnVuY3Rpb24gV1coKXt9ZnVuY3Rpb24gcVcodCxlKXt2YXIgbj1uZXcgV1c7aWYodCBpbnN0YW5jZW9mIFdXKXQuZWFjaCgoZnVuY3Rpb24odCxlKXtuLnNldChlLHQpfSkpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSl7dmFyIGkscj0tMSxvPXQubGVuZ3RoO2lmKG51bGw9PWUpZm9yKDsrK3I8bzspbi5zZXQocix0W3JdKTtlbHNlIGZvcig7KytyPG87KW4uc2V0KGUoaT10W3JdLHIsdCksaSl9ZWxzZSBpZih0KWZvcih2YXIgYSBpbiB0KW4uc2V0KGEsdFthXSk7cmV0dXJuIG59ZnVuY3Rpb24gWVcoKXt9V1cucHJvdG90eXBlPXFXLnByb3RvdHlwZT17Y29uc3RydWN0b3I6V1csaGFzOmZ1bmN0aW9uKHQpe3JldHVybiBHVyt0IGluIHRoaXN9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpc1tHVyt0XX0sc2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXNbR1crdF09ZSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9R1crdDtyZXR1cm4gZSBpbiB0aGlzJiZkZWxldGUgdGhpc1tlXX0sY2xlYXI6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcyl0WzBdPT09R1cmJmRlbGV0ZSB0aGlzW3RdfSxrZXlzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PUdXJiZ0LnB1c2goZS5zbGljZSgxKSk7cmV0dXJuIHR9LHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT1HVyYmdC5wdXNoKHRoaXNbZV0pO3JldHVybiB0fSxlbnRyaWVzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PUdXJiZ0LnB1c2goe2tleTplLnNsaWNlKDEpLHZhbHVlOnRoaXNbZV19KTtyZXR1cm4gdH0sc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTA7Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PUdXJiYrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpaWYodFswXT09PUdXKXJldHVybiExO3JldHVybiEwfSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT1HVyYmdCh0aGlzW2VdLGUuc2xpY2UoMSksdGhpcyl9fTt2YXIgWFc9cVcucHJvdG90eXBlO2Z1bmN0aW9uICRXKHQpe3JldHVybiB0LmluZGV4fWZ1bmN0aW9uIEtXKHQsZSl7dmFyIG49dC5nZXQoZSk7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nOiAiK2UpO3JldHVybiBufVlXLnByb3RvdHlwZT17Y29uc3RydWN0b3I6WVcsaGFzOlhXLmhhcyxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbR1crKHQrPSIiKV09dCx0aGlzfSxyZW1vdmU6WFcucmVtb3ZlLGNsZWFyOlhXLmNsZWFyLHZhbHVlczpYVy5rZXlzLHNpemU6WFcuc2l6ZSxlbXB0eTpYVy5lbXB0eSxlYWNoOlhXLmVhY2h9O3ZhciBaVz17dmFsdWU6ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBKVygpe2Zvcih2YXIgdCxlPTAsbj1hcmd1bWVudHMubGVuZ3RoLGk9e307ZTxuOysrZSl7aWYoISh0PWFyZ3VtZW50c1tlXSsiIil8fHQgaW4gaXx8L1tccy5dLy50ZXN0KHQpKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO2lbdF09W119cmV0dXJuIG5ldyBRVyhpKX1mdW5jdGlvbiBRVyh0KXt0aGlzLl89dH1mdW5jdGlvbiB0cSh0LGUpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBuPSIiLGk9dC5pbmRleE9mKCIuIik7aWYoaT49MCYmKG49dC5zbGljZShpKzEpLHQ9dC5zbGljZSgwLGkpKSx0JiYhZS5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtyZXR1cm57dHlwZTp0LG5hbWU6bn19KSl9ZnVuY3Rpb24gZXEodCxlKXtmb3IodmFyIG4saT0wLHI9dC5sZW5ndGg7aTxyOysraSlpZigobj10W2ldKS5uYW1lPT09ZSlyZXR1cm4gbi52YWx1ZX1mdW5jdGlvbiBucSh0LGUsbil7Zm9yKHZhciBpPTAscj10Lmxlbmd0aDtpPHI7KytpKWlmKHRbaV0ubmFtZT09PWUpe3RbaV09WlcsdD10LnNsaWNlKDAsaSkuY29uY2F0KHQuc2xpY2UoaSsxKSk7YnJlYWt9cmV0dXJuIG51bGwhPW4mJnQucHVzaCh7bmFtZTplLHZhbHVlOm59KSx0fVFXLnByb3RvdHlwZT1KVy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlFXLG9uOmZ1bmN0aW9uKHQsZSl7dmFyIG4saT10aGlzLl8scj10cSh0KyIiLGkpLG89LTEsYT1yLmxlbmd0aDtpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2lmKG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjazogIitlKTtmb3IoOysrbzxhOylpZihuPSh0PXJbb10pLnR5cGUpaVtuXT1ucShpW25dLHQubmFtZSxlKTtlbHNlIGlmKG51bGw9PWUpZm9yKG4gaW4gaSlpW25dPW5xKGlbbl0sdC5uYW1lLG51bGwpO3JldHVybiB0aGlzfWZvcig7KytvPGE7KWlmKChuPSh0PXJbb10pLnR5cGUpJiYobj1lcShpW25dLHQubmFtZSkpKXJldHVybiBufSxjb3B5OmZ1bmN0aW9uKCl7dmFyIHQ9e30sZT10aGlzLl87Zm9yKHZhciBuIGluIGUpdFtuXT1lW25dLnNsaWNlKCk7cmV0dXJuIG5ldyBRVyh0KX0sY2FsbDpmdW5jdGlvbih0LGUpe2lmKChuPWFyZ3VtZW50cy5sZW5ndGgtMik+MClmb3IodmFyIG4saSxyPW5ldyBBcnJheShuKSxvPTA7bzxuOysrbylyW29dPWFyZ3VtZW50c1tvKzJdO2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKG89MCxuPShpPXRoaXMuX1t0XSkubGVuZ3RoO288bjsrK28paVtvXS52YWx1ZS5hcHBseShlLHIpfSxhcHBseTpmdW5jdGlvbih0LGUsbil7aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3IodmFyIGk9dGhpcy5fW3RdLHI9MCxvPWkubGVuZ3RoO3I8bzsrK3IpaVtyXS52YWx1ZS5hcHBseShlLG4pfX07dmFyIGlxLHJxLG9xPTAsYXE9MCxzcT0wLGxxPTAsY3E9MCx1cT0wLGhxPSJvYmplY3QiPT10eXBlb2YgcGVyZm9ybWFuY2UmJnBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZTpEYXRlLGRxPSJvYmplY3QiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lP3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpOmZ1bmN0aW9uKHQpe3NldFRpbWVvdXQodCwxNyl9O2Z1bmN0aW9uIHBxKCl7cmV0dXJuIGNxfHwoZHEoZnEpLGNxPWhxLm5vdygpK3VxKX1mdW5jdGlvbiBmcSgpe2NxPTB9ZnVuY3Rpb24gbXEoKXt0aGlzLl9jYWxsPXRoaXMuX3RpbWU9dGhpcy5fbmV4dD1udWxsfWZ1bmN0aW9uIGdxKHQsZSxuKXt2YXIgaT1uZXcgbXE7cmV0dXJuIGkucmVzdGFydCh0LGUsbiksaX1mdW5jdGlvbiBfcSgpe2NxPShscT1ocS5ub3coKSkrdXEsb3E9YXE9MDt0cnl7IShmdW5jdGlvbiB0KCl7cHEoKSwrK29xO2Zvcih2YXIgdCxlPWlxO2U7KSh0PWNxLWUuX3RpbWUpPj0wJiZlLl9jYWxsLmNhbGwobnVsbCx0KSxlPWUuX25leHQ7LS1vcX0pKCl9ZmluYWxseXtvcT0wLChmdW5jdGlvbiBlKCl7Zm9yKHZhciB0LGUsbj1pcSxpPTEvMDtuOyluLl9jYWxsPyhpPm4uX3RpbWUmJihpPW4uX3RpbWUpLHQ9bixuPW4uX25leHQpOihlPW4uX25leHQsbi5fbmV4dD1udWxsLG49dD90Ll9uZXh0PWU6aXE9ZSk7cnE9dCx2cShpKX0pKCksY3E9MH19ZnVuY3Rpb24geXEoKXt2YXIgdD1ocS5ub3coKSxlPXQtbHE7ZT4xZTMmJih1cS09ZSxscT10KX1mdW5jdGlvbiB2cSh0KXtvcXx8KGFxJiYoYXE9Y2xlYXJUaW1lb3V0KGFxKSksdC1jcT4yND8odDwxLzAmJihhcT1zZXRUaW1lb3V0KF9xLHQtaHEubm93KCktdXEpKSxzcSYmKHNxPWNsZWFySW50ZXJ2YWwoc3EpKSk6KHNxfHwobHE9aHEubm93KCksc3E9c2V0SW50ZXJ2YWwoeXEsMWUzKSksb3E9MSxkcShfcSkpKX1mdW5jdGlvbiBicSh0KXtyZXR1cm4gdC54fWZ1bmN0aW9uIHhxKHQpe3JldHVybiB0Lnl9bXEucHJvdG90eXBlPWdxLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bXEscmVzdGFydDpmdW5jdGlvbih0LGUsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24iKTtuPShudWxsPT1uP3BxKCk6K24pKyhudWxsPT1lPzA6K2UpLHRoaXMuX25leHR8fHJxPT09dGhpc3x8KHJxP3JxLl9uZXh0PXRoaXM6aXE9dGhpcyxycT10aGlzKSx0aGlzLl9jYWxsPXQsdGhpcy5fdGltZT1uLHZxKCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9jYWxsJiYodGhpcy5fY2FsbD1udWxsLHRoaXMuX3RpbWU9MS8wLHZxKCkpfX07dmFyIHdxLFNxPU1hdGguUEkqKDMtTWF0aC5zcXJ0KDUpKTtmdW5jdGlvbiBNcSh0LGUpe2lmKChuPSh0PWU/dC50b0V4cG9uZW50aWFsKGUtMSk6dC50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoImUiKSk8MClyZXR1cm4gbnVsbDt2YXIgbixpPXQuc2xpY2UoMCxuKTtyZXR1cm5baS5sZW5ndGg+MT9pWzBdK2kuc2xpY2UoMik6aSwrdC5zbGljZShuKzEpXX1mdW5jdGlvbiBFcSh0KXtyZXR1cm4odD1NcShNYXRoLmFicyh0KSkpP3RbMV06TmFOfWZ1bmN0aW9uIFRxKHQsZSl7dmFyIG49TXEodCxlKTtpZighbilyZXR1cm4gdCsiIjt2YXIgaT1uWzBdLHI9blsxXTtyZXR1cm4gcjwwPyIwLiIrbmV3IEFycmF5KC1yKS5qb2luKCIwIikraTppLmxlbmd0aD5yKzE/aS5zbGljZSgwLHIrMSkrIi4iK2kuc2xpY2UocisxKTppK25ldyBBcnJheShyLWkubGVuZ3RoKzIpLmpvaW4oIjAiKX12YXIgQ3E9eyIiOmZ1bmN0aW9uIEFxKHQsZSl7dDpmb3IodmFyIG4saT0odD10LnRvUHJlY2lzaW9uKGUpKS5sZW5ndGgscj0xLG89LTE7cjxpOysrcilzd2l0Y2godFtyXSl7Y2FzZSIuIjpvPW49cjticmVhaztjYXNlIjAiOjA9PT1vJiYobz1yKSxuPXI7YnJlYWs7Y2FzZSJlIjpicmVhayB0O2RlZmF1bHQ6bz4wJiYobz0wKX1yZXR1cm4gbz4wP3Quc2xpY2UoMCxvKSt0LnNsaWNlKG4rMSk6dH0sIiUiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuKDEwMCp0KS50b0ZpeGVkKGUpfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDIpfSxjOmZ1bmN0aW9uKHQpe3JldHVybiB0KyIifSxkOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDEwKX0sZTpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRvRXhwb25lbnRpYWwoZSl9LGY6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50b0ZpeGVkKGUpfSxnOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9QcmVjaXNpb24oZSl9LG86ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoOCl9LHA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gVHEoMTAwKnQsZSl9LHI6VHEsczpmdW5jdGlvbiBrcSh0LGUpe3ZhciBuPU1xKHQsZSk7aWYoIW4pcmV0dXJuIHQrIiI7dmFyIGk9blswXSxyPW5bMV0sbz1yLSh3cT0zKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihyLzMpKSkpKzEsYT1pLmxlbmd0aDtyZXR1cm4gbz09PWE/aTpvPmE/aStuZXcgQXJyYXkoby1hKzEpLmpvaW4oIjAiKTpvPjA/aS5zbGljZSgwLG8pKyIuIitpLnNsaWNlKG8pOiIwLiIrbmV3IEFycmF5KDEtbykuam9pbigiMCIpK01xKHQsTWF0aC5tYXgoMCxlK28tMSkpWzBdfSxYOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSx4OmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KX19LExxPS9eKD86KC4pPyhbPD49Xl0pKT8oWytcLVwoIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KFthLXolXSk/JC9pO2Z1bmN0aW9uIFBxKHQpe3JldHVybiBuZXcgTnEodCl9ZnVuY3Rpb24gTnEodCl7aWYoIShlPUxxLmV4ZWModCkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIrdCk7dmFyIGUsbj1lWzFdfHwiICIsaT1lWzJdfHwiPiIscj1lWzNdfHwiLSIsbz1lWzRdfHwiIixhPSEhZVs1XSxzPWVbNl0mJitlWzZdLGw9ISFlWzddLGM9ZVs4XSYmK2VbOF0uc2xpY2UoMSksdT1lWzldfHwiIjsibiI9PT11PyhsPSEwLHU9ImciKTpDcVt1XXx8KHU9IiIpLChhfHwiMCI9PT1uJiYiPSI9PT1pKSYmKGE9ITAsbj0iMCIsaT0iPSIpLHRoaXMuZmlsbD1uLHRoaXMuYWxpZ249aSx0aGlzLnNpZ249cix0aGlzLnN5bWJvbD1vLHRoaXMuemVybz1hLHRoaXMud2lkdGg9cyx0aGlzLmNvbW1hPWwsdGhpcy5wcmVjaXNpb249Yyx0aGlzLnR5cGU9dX1mdW5jdGlvbiBJcSh0KXtyZXR1cm4gdH1QcS5wcm90b3R5cGU9TnEucHJvdG90eXBlLE5xLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbGwrdGhpcy5hbGlnbit0aGlzLnNpZ24rdGhpcy5zeW1ib2wrKHRoaXMuemVybz8iMCI6IiIpKyhudWxsPT10aGlzLndpZHRoPyIiOk1hdGgubWF4KDEsMHx0aGlzLndpZHRoKSkrKHRoaXMuY29tbWE/IiwiOiIiKSsobnVsbD09dGhpcy5wcmVjaXNpb24/IiI6Ii4iK01hdGgubWF4KDAsMHx0aGlzLnByZWNpc2lvbikpK3RoaXMudHlwZX07dmFyIFJxLE9xLHpxLERxPVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTtmdW5jdGlvbiBCcSh0KXt2YXIgZT10Lmdyb3VwaW5nJiZ0LnRob3VzYW5kcz8oZnVuY3Rpb24gbih0LGUpe3JldHVybiBmdW5jdGlvbihuLGkpe2Zvcih2YXIgcj1uLmxlbmd0aCxvPVtdLGE9MCxzPXRbMF0sbD0wO3I+MCYmcz4wJiYobCtzKzE+aSYmKHM9TWF0aC5tYXgoMSxpLWwpKSxvLnB1c2gobi5zdWJzdHJpbmcoci09cyxyK3MpKSwhKChsKz1zKzEpPmkpKTspcz10W2E9KGErMSkldC5sZW5ndGhdO3JldHVybiBvLnJldmVyc2UoKS5qb2luKGUpfX0pKHQuZ3JvdXBpbmcsdC50aG91c2FuZHMpOklxLGk9dC5jdXJyZW5jeSxyPXQuZGVjaW1hbCxvPXQubnVtZXJhbHM/KGZ1bmN0aW9uIGEodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1swLTldL2csKGZ1bmN0aW9uKGUpe3JldHVybiB0WytlXX0pKX19KSh0Lm51bWVyYWxzKTpJcSxzPXQucGVyY2VudHx8IiUiO2Z1bmN0aW9uIGwodCl7dmFyIG49KHQ9UHEodCkpLmZpbGwsYT10LmFsaWduLGw9dC5zaWduLGM9dC5zeW1ib2wsdT10Lnplcm8saD10LndpZHRoLGQ9dC5jb21tYSxwPXQucHJlY2lzaW9uLGY9dC50eXBlLG09IiQiPT09Yz9pWzBdOiIjIj09PWMmJi9bYm94WF0vLnRlc3QoZik/IjAiK2YudG9Mb3dlckNhc2UoKToiIixnPSIkIj09PWM/aVsxXTovWyVwXS8udGVzdChmKT9zOiIiLF89Q3FbZl0seT0hZnx8L1tkZWZncHJzJV0vLnRlc3QoZik7ZnVuY3Rpb24gdih0KXt2YXIgaSxzLGMsdj1tLGI9ZztpZigiYyI9PT1mKWI9Xyh0KStiLHQ9IiI7ZWxzZXt2YXIgeD0odD0rdCk8MDtpZih0PV8oTWF0aC5hYnModCkscCkseCYmMD09K3QmJih4PSExKSx2PSh4PyIoIj09PWw/bDoiLSI6Ii0iPT09bHx8IigiPT09bD8iIjpsKSt2LGI9KCJzIj09PWY/RHFbOCt3cS8zXToiIikrYisoeCYmIigiPT09bD8iKSI6IiIpLHkpZm9yKGk9LTEscz10Lmxlbmd0aDsrK2k8czspaWYoNDg+KGM9dC5jaGFyQ29kZUF0KGkpKXx8Yz41Nyl7Yj0oNDY9PT1jP3IrdC5zbGljZShpKzEpOnQuc2xpY2UoaSkpK2IsdD10LnNsaWNlKDAsaSk7YnJlYWt9fWQmJiF1JiYodD1lKHQsMS8wKSk7dmFyIHc9di5sZW5ndGgrdC5sZW5ndGgrYi5sZW5ndGgsUz13PGg/bmV3IEFycmF5KGgtdysxKS5qb2luKG4pOiIiO3N3aXRjaChkJiZ1JiYodD1lKFMrdCxTLmxlbmd0aD9oLWIubGVuZ3RoOjEvMCksUz0iIiksYSl7Y2FzZSI8Ijp0PXYrdCtiK1M7YnJlYWs7Y2FzZSI9Ijp0PXYrUyt0K2I7YnJlYWs7Y2FzZSJeIjp0PVMuc2xpY2UoMCx3PVMubGVuZ3RoPj4xKSt2K3QrYitTLnNsaWNlKHcpO2JyZWFrO2RlZmF1bHQ6dD1TK3YrdCtifXJldHVybiBvKHQpfXJldHVybiBwPW51bGw9PXA/Zj82OjEyOi9bZ3Byc10vLnRlc3QoZik/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxwKSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxwKSksdi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0KyIifSx2fXJldHVybntmb3JtYXQ6bCxmb3JtYXRQcmVmaXg6ZnVuY3Rpb24gYyh0LGUpe3ZhciBuPWwoKCh0PVBxKHQpKS50eXBlPSJmIix0KSksaT0zKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihFcShlKS8zKSkpLHI9TWF0aC5wb3coMTAsLWkpLG89RHFbOCtpLzNdO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbihyKnQpK299fX19ZnVuY3Rpb24gSHEodCl7cmV0dXJuIFJxPUJxKHQpLE9xPVJxLmZvcm1hdCx6cT1ScS5mb3JtYXRQcmVmaXgsUnF9ZnVuY3Rpb24gRnEoKXtyZXR1cm4gbmV3IFZxfWZ1bmN0aW9uIFZxKCl7dGhpcy5yZXNldCgpfUhxKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXX0pLFZxLnByb3RvdHlwZT17Y29uc3RydWN0b3I6VnEscmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LGFkZDpmdW5jdGlvbih0KXtqcShVcSx0LHRoaXMudCksanEodGhpcyxVcS5zLHRoaXMucyksdGhpcy5zP3RoaXMudCs9VXEudDp0aGlzLnM9VXEudH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN9fTt2YXIgVXE9bmV3IFZxO2Z1bmN0aW9uIGpxKHQsZSxuKXt2YXIgaT10LnM9ZStuLHI9aS1lO3QudD1lLShpLXIpKyhuLXIpfXZhciBHcT0xZS02LFdxPU1hdGguUEkscXE9V3EvMixZcT1XcS80LFhxPTIqV3EsJHE9MTgwL1dxLEtxPVdxLzE4MCxacT1NYXRoLmFicyxKcT1NYXRoLmF0YW4sUXE9TWF0aC5hdGFuMix0WT1NYXRoLmNvcyxlWT1NYXRoLmNlaWwsblk9TWF0aC5leHAsaVk9TWF0aC5sb2csclk9TWF0aC5wb3csb1k9TWF0aC5zaW4sYVk9TWF0aC5zaWdufHxmdW5jdGlvbih0KXtyZXR1cm4gdD4wPzE6dDwwPy0xOjB9LHNZPU1hdGguc3FydCxsWT1NYXRoLnRhbjtmdW5jdGlvbiBjWSh0KXtyZXR1cm4gdD4xPzA6dDwtMT9XcTpNYXRoLmFjb3ModCl9ZnVuY3Rpb24gdVkodCl7cmV0dXJuIHQ+MT9xcTp0PC0xPy1xcTpNYXRoLmFzaW4odCl9ZnVuY3Rpb24gaFkodCl7cmV0dXJuKHQ9b1kodC8yKSkqdH1mdW5jdGlvbiBkWSgpe31mdW5jdGlvbiBwWSh0LGUpe3QmJm1ZLmhhc093blByb3BlcnR5KHQudHlwZSkmJm1ZW3QudHlwZV0odCxlKX12YXIgZlk9e0ZlYXR1cmU6ZnVuY3Rpb24odCxlKXtwWSh0Lmdlb21ldHJ5LGUpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmZlYXR1cmVzLGk9LTEscj1uLmxlbmd0aDsrK2k8cjspcFkobltpXS5nZW9tZXRyeSxlKX19LG1ZPXtTcGhlcmU6ZnVuY3Rpb24odCxlKXtlLnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbih0LGUpe2UucG9pbnQoKHQ9dC5jb29yZGluYXRlcylbMF0sdFsxXSx0WzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmNvb3JkaW5hdGVzLGk9LTEscj1uLmxlbmd0aDsrK2k8cjspZS5wb2ludCgodD1uW2ldKVswXSx0WzFdLHRbMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsZSl7Z1kodC5jb29yZGluYXRlcyxlLDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5jb29yZGluYXRlcyxpPS0xLHI9bi5sZW5ndGg7KytpPHI7KWdZKG5baV0sZSwwKX0sUG9seWdvbjpmdW5jdGlvbih0LGUpe19ZKHQuY29vcmRpbmF0ZXMsZSl9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmNvb3JkaW5hdGVzLGk9LTEscj1uLmxlbmd0aDsrK2k8cjspX1kobltpXSxlKX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZ2VvbWV0cmllcyxpPS0xLHI9bi5sZW5ndGg7KytpPHI7KXBZKG5baV0sZSl9fTtmdW5jdGlvbiBnWSh0LGUsbil7dmFyIGkscj0tMSxvPXQubGVuZ3RoLW47Zm9yKGUubGluZVN0YXJ0KCk7KytyPG87KWUucG9pbnQoKGk9dFtyXSlbMF0saVsxXSxpWzJdKTtlLmxpbmVFbmQoKX1mdW5jdGlvbiBfWSh0LGUpe3ZhciBuPS0xLGk9dC5sZW5ndGg7Zm9yKGUucG9seWdvblN0YXJ0KCk7KytuPGk7KWdZKHRbbl0sZSwxKTtlLnBvbHlnb25FbmQoKX1mdW5jdGlvbiB5WSh0LGUpe3QmJmZZLmhhc093blByb3BlcnR5KHQudHlwZSk/ZllbdC50eXBlXSh0LGUpOnBZKHQsZSl9dmFyIHZZLGJZLHhZLHdZLFNZLE1ZPUZxKCksRVk9RnEoKSxUWT17cG9pbnQ6ZFksbGluZVN0YXJ0OmRZLGxpbmVFbmQ6ZFkscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7TVkucmVzZXQoKSxUWS5saW5lU3RhcnQ9Q1ksVFkubGluZUVuZD1BWX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciB0PStNWTtFWS5hZGQodDwwP1hxK3Q6dCksdGhpcy5saW5lU3RhcnQ9dGhpcy5saW5lRW5kPXRoaXMucG9pbnQ9ZFl9LHNwaGVyZTpmdW5jdGlvbigpe0VZLmFkZChYcSl9fTtmdW5jdGlvbiBDWSgpe1RZLnBvaW50PWtZfWZ1bmN0aW9uIEFZKCl7TFkodlksYlkpfWZ1bmN0aW9uIGtZKHQsZSl7VFkucG9pbnQ9TFksdlk9dCxiWT1lLHhZPXQqPUtxLHdZPXRZKGU9KGUqPUtxKS8yK1lxKSxTWT1vWShlKX1mdW5jdGlvbiBMWSh0LGUpe3ZhciBuPSh0Kj1LcSkteFksaT1uPj0wPzE6LTEscj1pKm4sbz10WShlPShlKj1LcSkvMitZcSksYT1vWShlKSxzPVNZKmEsbD13WSpvK3MqdFkociksYz1zKmkqb1kocik7TVkuYWRkKFFxKGMsbCkpLHhZPXQsd1k9byxTWT1hfWZ1bmN0aW9uIFBZKHQpe3JldHVybltRcSh0WzFdLHRbMF0pLHVZKHRbMl0pXX1mdW5jdGlvbiBOWSh0KXt2YXIgZT10WzBdLG49dFsxXSxpPXRZKG4pO3JldHVybltpKnRZKGUpLGkqb1koZSksb1kobildfWZ1bmN0aW9uIElZKHQsZSl7cmV0dXJuIHRbMF0qZVswXSt0WzFdKmVbMV0rdFsyXSplWzJdfWZ1bmN0aW9uIFJZKHQsZSl7cmV0dXJuW3RbMV0qZVsyXS10WzJdKmVbMV0sdFsyXSplWzBdLXRbMF0qZVsyXSx0WzBdKmVbMV0tdFsxXSplWzBdXX1mdW5jdGlvbiBPWSh0LGUpe3RbMF0rPWVbMF0sdFsxXSs9ZVsxXSx0WzJdKz1lWzJdfWZ1bmN0aW9uIHpZKHQsZSl7cmV0dXJuW3RbMF0qZSx0WzFdKmUsdFsyXSplXX1mdW5jdGlvbiBEWSh0KXt2YXIgZT1zWSh0WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSk7dFswXS89ZSx0WzFdLz1lLHRbMl0vPWV9dmFyIEJZLEhZLEZZLFZZLFVZLGpZLEdZLFdZLHFZLFlZLFhZLCRZLEtZLFpZLEpZLFFZLHRYLGVYLG5YLGlYLHJYLG9YLGFYLHNYLGxYLGNYLHVYPUZxKCksaFg9e3BvaW50OmRYLGxpbmVTdGFydDpmWCxsaW5lRW5kOm1YLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2hYLnBvaW50PWdYLGhYLmxpbmVTdGFydD1fWCxoWC5saW5lRW5kPXlYLHVYLnJlc2V0KCksVFkucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtUWS5wb2x5Z29uRW5kKCksaFgucG9pbnQ9ZFgsaFgubGluZVN0YXJ0PWZYLGhYLmxpbmVFbmQ9bVgsTVk8MD8oQlk9LShGWT0xODApLEhZPS0oVlk9OTApKTp1WD5HcT9WWT05MDp1WDwtMWUtNiYmKEhZPS05MCksWVlbMF09QlksWVlbMV09Rll9fTtmdW5jdGlvbiBkWCh0LGUpe3FZLnB1c2goWVk9W0JZPXQsRlk9dF0pLGU8SFkmJihIWT1lKSxlPlZZJiYoVlk9ZSl9ZnVuY3Rpb24gcFgodCxlKXt2YXIgbj1OWShbdCpLcSxlKktxXSk7aWYoV1kpe3ZhciBpPVJZKFdZLG4pLHI9UlkoW2lbMV0sLWlbMF0sMF0saSk7RFkocikscj1QWShyKTt2YXIgbyxhPXQtVVkscz1hPjA/MTotMSxsPXJbMF0qJHEqcyxjPVpxKGEpPjE4MDtjXihzKlVZPGwmJmw8cyp0KT8obz1yWzFdKiRxKT5WWSYmKFZZPW8pOmNeKHMqVVk8KGw9KGwrMzYwKSUzNjAtMTgwKSYmbDxzKnQpPyhvPS1yWzFdKiRxKTxIWSYmKEhZPW8pOihlPEhZJiYoSFk9ZSksZT5WWSYmKFZZPWUpKSxjP3Q8VVk/dlgoQlksdCk+dlgoQlksRlkpJiYoRlk9dCk6dlgodCxGWSk+dlgoQlksRlkpJiYoQlk9dCk6Rlk+PUJZPyh0PEJZJiYoQlk9dCksdD5GWSYmKEZZPXQpKTp0PlVZP3ZYKEJZLHQpPnZYKEJZLEZZKSYmKEZZPXQpOnZYKHQsRlkpPnZYKEJZLEZZKSYmKEJZPXQpfWVsc2UgcVkucHVzaChZWT1bQlk9dCxGWT10XSk7ZTxIWSYmKEhZPWUpLGU+VlkmJihWWT1lKSxXWT1uLFVZPXR9ZnVuY3Rpb24gZlgoKXtoWC5wb2ludD1wWH1mdW5jdGlvbiBtWCgpe1lZWzBdPUJZLFlZWzFdPUZZLGhYLnBvaW50PWRYLFdZPW51bGx9ZnVuY3Rpb24gZ1godCxlKXtpZihXWSl7dmFyIG49dC1VWTt1WC5hZGQoWnEobik+MTgwP24rKG4+MD8zNjA6LTM2MCk6bil9ZWxzZSBqWT10LEdZPWU7VFkucG9pbnQodCxlKSxwWCh0LGUpfWZ1bmN0aW9uIF9YKCl7VFkubGluZVN0YXJ0KCl9ZnVuY3Rpb24geVgoKXtnWChqWSxHWSksVFkubGluZUVuZCgpLFpxKHVYKT5HcSYmKEJZPS0oRlk9MTgwKSksWVlbMF09QlksWVlbMV09RlksV1k9bnVsbH1mdW5jdGlvbiB2WCh0LGUpe3JldHVybihlLT10KTwwP2UrMzYwOmV9ZnVuY3Rpb24gYlgodCxlKXtyZXR1cm4gdFswXS1lWzBdfWZ1bmN0aW9uIHhYKHQsZSl7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9ZSYmZTw9dFsxXTplPHRbMF18fHRbMV08ZX12YXIgd1g9e3NwaGVyZTpkWSxwb2ludDpTWCxsaW5lU3RhcnQ6RVgsbGluZUVuZDpBWCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt3WC5saW5lU3RhcnQ9a1gsd1gubGluZUVuZD1MWH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3dYLmxpbmVTdGFydD1FWCx3WC5saW5lRW5kPUFYfX07ZnVuY3Rpb24gU1godCxlKXt0Kj1LcTt2YXIgbj10WShlKj1LcSk7TVgobip0WSh0KSxuKm9ZKHQpLG9ZKGUpKX1mdW5jdGlvbiBNWCh0LGUsbil7KytYWSxLWSs9KHQtS1kpL1hZLFpZKz0oZS1aWSkvWFksSlkrPShuLUpZKS9YWX1mdW5jdGlvbiBFWCgpe3dYLnBvaW50PVRYfWZ1bmN0aW9uIFRYKHQsZSl7dCo9S3E7dmFyIG49dFkoZSo9S3EpO3NYPW4qdFkodCksbFg9bipvWSh0KSxjWD1vWShlKSx3WC5wb2ludD1DWCxNWChzWCxsWCxjWCl9ZnVuY3Rpb24gQ1godCxlKXt0Kj1LcTt2YXIgbj10WShlKj1LcSksaT1uKnRZKHQpLHI9bipvWSh0KSxvPW9ZKGUpLGE9UXEoc1koKGE9bFgqby1jWCpyKSphKyhhPWNYKmktc1gqbykqYSsoYT1zWCpyLWxYKmkpKmEpLHNYKmkrbFgqcitjWCpvKTskWSs9YSxRWSs9YSooc1grKHNYPWkpKSx0WCs9YSoobFgrKGxYPXIpKSxlWCs9YSooY1grKGNYPW8pKSxNWChzWCxsWCxjWCl9ZnVuY3Rpb24gQVgoKXt3WC5wb2ludD1TWH1mdW5jdGlvbiBrWCgpe3dYLnBvaW50PVBYfWZ1bmN0aW9uIExYKCl7Tlgob1gsYVgpLHdYLnBvaW50PVNYfWZ1bmN0aW9uIFBYKHQsZSl7b1g9dCxhWD1lLHQqPUtxLGUqPUtxLHdYLnBvaW50PU5YO3ZhciBuPXRZKGUpO3NYPW4qdFkodCksbFg9bipvWSh0KSxjWD1vWShlKSxNWChzWCxsWCxjWCl9ZnVuY3Rpb24gTlgodCxlKXt0Kj1LcTt2YXIgbj10WShlKj1LcSksaT1uKnRZKHQpLHI9bipvWSh0KSxvPW9ZKGUpLGE9bFgqby1jWCpyLHM9Y1gqaS1zWCpvLGw9c1gqci1sWCppLGM9c1koYSphK3MqcytsKmwpLHU9dVkoYyksaD1jJiYtdS9jO25YKz1oKmEsaVgrPWgqcyxyWCs9aCpsLCRZKz11LFFZKz11KihzWCsoc1g9aSkpLHRYKz11KihsWCsobFg9cikpLGVYKz11KihjWCsoY1g9bykpLE1YKHNYLGxYLGNYKX1mdW5jdGlvbiBJWCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gUlgodCxlKXtmdW5jdGlvbiBuKG4saSl7cmV0dXJuIG49dChuLGkpLGUoblswXSxuWzFdKX1yZXR1cm4gdC5pbnZlcnQmJmUuaW52ZXJ0JiYobi5pbnZlcnQ9ZnVuY3Rpb24obixpKXtyZXR1cm4obj1lLmludmVydChuLGkpKSYmdC5pbnZlcnQoblswXSxuWzFdKX0pLG59ZnVuY3Rpb24gT1godCxlKXtyZXR1cm5bdD5XcT90LVhxOnQ8LVdxP3QrWHE6dCxlXX1mdW5jdGlvbiB6WCh0LGUsbil7cmV0dXJuKHQlPVhxKT9lfHxuP1JYKEJYKHQpLEhYKGUsbikpOkJYKHQpOmV8fG4/SFgoZSxuKTpPWH1mdW5jdGlvbiBEWCh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtyZXR1cm5bKGUrPXQpPldxP2UtWHE6ZTwtV3E/ZStYcTplLG5dfX1mdW5jdGlvbiBCWCh0KXt2YXIgZT1EWCh0KTtyZXR1cm4gZS5pbnZlcnQ9RFgoLXQpLGV9ZnVuY3Rpb24gSFgodCxlKXt2YXIgbj10WSh0KSxpPW9ZKHQpLHI9dFkoZSksbz1vWShlKTtmdW5jdGlvbiBhKHQsZSl7dmFyIGE9dFkoZSkscz10WSh0KSphLGw9b1kodCkqYSxjPW9ZKGUpLHU9YypuK3MqaTtyZXR1cm5bUXEobCpyLXUqbyxzKm4tYyppKSx1WSh1KnIrbCpvKV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIGE9dFkoZSkscz10WSh0KSphLGw9b1kodCkqYSxjPW9ZKGUpLHU9YypyLWwqbztyZXR1cm5bUXEobCpyK2MqbyxzKm4rdSppKSx1WSh1Km4tcyppKV19LGF9ZnVuY3Rpb24gRlgodCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4oZT10KGVbMF0qS3EsZVsxXSpLcSkpWzBdKj0kcSxlWzFdKj0kcSxlfXJldHVybiB0PXpYKHRbMF0qS3EsdFsxXSpLcSx0Lmxlbmd0aD4yP3RbMl0qS3E6MCksZS5pbnZlcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuKGU9dC5pbnZlcnQoZVswXSpLcSxlWzFdKktxKSlbMF0qPSRxLGVbMV0qPSRxLGV9LGV9ZnVuY3Rpb24gVlgodCxlLG4saSxyLG8pe2lmKG4pe3ZhciBhPXRZKGUpLHM9b1koZSksbD1pKm47bnVsbD09cj8ocj1lK2kqWHEsbz1lLWwvMik6KHI9VVgoYSxyKSxvPVVYKGEsbyksKGk+MD9yPG86cj5vKSYmKHIrPWkqWHEpKTtmb3IodmFyIGMsdT1yO2k+MD91Pm86dTxvO3UtPWwpYz1QWShbYSwtcyp0WSh1KSwtcypvWSh1KV0pLHQucG9pbnQoY1swXSxjWzFdKX19ZnVuY3Rpb24gVVgodCxlKXsoZT1OWShlKSlbMF0tPXQsRFkoZSk7dmFyIG49Y1koLWVbMV0pO3JldHVybigoLWVbMl08MD8tbjpuKStYcS1HcSklWHF9ZnVuY3Rpb24galgoKXt2YXIgdCxlPVtdO3JldHVybntwb2ludDpmdW5jdGlvbihlLG4pe3QucHVzaChbZSxuXSl9LGxpbmVTdGFydDpmdW5jdGlvbigpe2UucHVzaCh0PVtdKX0sbGluZUVuZDpkWSxyZWpvaW46ZnVuY3Rpb24oKXtlLmxlbmd0aD4xJiZlLnB1c2goZS5wb3AoKS5jb25jYXQoZS5zaGlmdCgpKSl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciBuPWU7cmV0dXJuIGU9W10sdD1udWxsLG59fX1mdW5jdGlvbiBHWCh0LGUpe3JldHVybiBacSh0WzBdLWVbMF0pPEdxJiZacSh0WzFdLWVbMV0pPEdxfWZ1bmN0aW9uIFdYKHQsZSxuLGkpe3RoaXMueD10LHRoaXMuej1lLHRoaXMubz1uLHRoaXMuZT1pLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gcVgodCxlLG4saSxyKXt2YXIgbyxhLHM9W10sbD1bXTtpZih0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCEoKGU9dC5sZW5ndGgtMSk8PTApKXt2YXIgZSxuLGk9dFswXSxhPXRbZV07aWYoR1goaSxhKSl7Zm9yKHIubGluZVN0YXJ0KCksbz0wO288ZTsrK28pci5wb2ludCgoaT10W29dKVswXSxpWzFdKTtyLmxpbmVFbmQoKX1lbHNlIHMucHVzaChuPW5ldyBXWChpLHQsbnVsbCwhMCkpLGwucHVzaChuLm89bmV3IFdYKGksbnVsbCxuLCExKSkscy5wdXNoKG49bmV3IFdYKGEsdCxudWxsLCExKSksbC5wdXNoKG4ubz1uZXcgV1goYSxudWxsLG4sITApKX19KSkscy5sZW5ndGgpe2ZvcihsLnNvcnQoZSksWVgocyksWVgobCksbz0wLGE9bC5sZW5ndGg7bzxhOysrbylsW29dLmU9bj0hbjtmb3IodmFyIGMsdSxoPXNbMF07Oyl7Zm9yKHZhciBkPWgscD0hMDtkLnY7KWlmKChkPWQubik9PT1oKXJldHVybjtjPWQueixyLmxpbmVTdGFydCgpO2Rve2lmKGQudj1kLm8udj0hMCxkLmUpe2lmKHApZm9yKG89MCxhPWMubGVuZ3RoO288YTsrK28pci5wb2ludCgodT1jW29dKVswXSx1WzFdKTtlbHNlIGkoZC54LGQubi54LDEscik7ZD1kLm59ZWxzZXtpZihwKWZvcihvPShjPWQucC56KS5sZW5ndGgtMTtvPj0wOy0tbylyLnBvaW50KCh1PWNbb10pWzBdLHVbMV0pO2Vsc2UgaShkLngsZC5wLngsLTEscik7ZD1kLnB9Yz0oZD1kLm8pLnoscD0hcH13aGlsZSghZC52KTtyLmxpbmVFbmQoKX19fWZ1bmN0aW9uIFlYKHQpe2lmKGU9dC5sZW5ndGgpe2Zvcih2YXIgZSxuLGk9MCxyPXRbMF07KytpPGU7KXIubj1uPXRbaV0sbi5wPXIscj1uO3Iubj1uPXRbMF0sbi5wPXJ9fU9YLmludmVydD1PWDt2YXIgWFg9RnEoKTtmdW5jdGlvbiAkWCh0LGUpe3ZhciBuPWVbMF0saT1lWzFdLHI9W29ZKG4pLC10WShuKSwwXSxvPTAsYT0wO1hYLnJlc2V0KCk7Zm9yKHZhciBzPTAsbD10Lmxlbmd0aDtzPGw7KytzKWlmKHU9KGM9dFtzXSkubGVuZ3RoKWZvcih2YXIgYyx1LGg9Y1t1LTFdLGQ9aFswXSxwPWhbMV0vMitZcSxmPW9ZKHApLG09dFkocCksZz0wO2c8dTsrK2csZD15LGY9YixtPXgsaD1fKXt2YXIgXz1jW2ddLHk9X1swXSx2PV9bMV0vMitZcSxiPW9ZKHYpLHg9dFkodiksdz15LWQsUz13Pj0wPzE6LTEsTT1TKncsRT1NPldxLFQ9ZipiO2lmKFhYLmFkZChRcShUKlMqb1koTSksbSp4K1QqdFkoTSkpKSxvKz1FP3crUypYcTp3LEVeZD49bl55Pj1uKXt2YXIgQz1SWShOWShoKSxOWShfKSk7RFkoQyk7dmFyIEE9UlkocixDKTtEWShBKTt2YXIgaz0oRV53Pj0wPy0xOjEpKnVZKEFbMl0pOyhpPmt8fGk9PT1rJiYoQ1swXXx8Q1sxXSkpJiYoYSs9RV53Pj0wPzE6LTEpfX1yZXR1cm4obzwtMWUtNnx8bzxHcSYmWFg8LTFlLTYpXjEmYX1mdW5jdGlvbiBLWCh0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6dD49ZT8wOk5hTn1mdW5jdGlvbiBaWCh0LGUsbil7dD0rdCxlPStlLG49KHI9YXJndW1lbnRzLmxlbmd0aCk8Mj8oZT10LHQ9MCwxKTpyPDM/MTorbjtmb3IodmFyIGk9LTEscj0wfE1hdGgubWF4KDAsTWF0aC5jZWlsKChlLXQpL24pKSxvPW5ldyBBcnJheShyKTsrK2k8cjspb1tpXT10K2kqbjtyZXR1cm4gb31mdW5jdGlvbiBKWCh0KXtmb3IodmFyIGUsbixpLHI9dC5sZW5ndGgsbz0tMSxhPTA7KytvPHI7KWErPXRbb10ubGVuZ3RoO2ZvcihuPW5ldyBBcnJheShhKTstLXI+PTA7KWZvcihlPShpPXRbcl0pLmxlbmd0aDstLWU+PTA7KW5bLS1hXT1pW2VdO3JldHVybiBufWZ1bmN0aW9uIFFYKHQsZSxuLGkpe3JldHVybiBmdW5jdGlvbihyKXt2YXIgbyxhLHMsbD1lKHIpLGM9algoKSx1PWUoYyksaD0hMSxkPXtwb2ludDpwLGxpbmVTdGFydDptLGxpbmVFbmQ6Zyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtkLnBvaW50PV8sZC5saW5lU3RhcnQ9eSxkLmxpbmVFbmQ9dixhPVtdLG89W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtkLnBvaW50PXAsZC5saW5lU3RhcnQ9bSxkLmxpbmVFbmQ9ZyxhPUpYKGEpO3ZhciB0PSRYKG8saSk7YS5sZW5ndGg/KGh8fChyLnBvbHlnb25TdGFydCgpLGg9ITApLHFYKGEsZSQsdCxuLHIpKTp0JiYoaHx8KHIucG9seWdvblN0YXJ0KCksaD0hMCksci5saW5lU3RhcnQoKSxuKG51bGwsbnVsbCwxLHIpLHIubGluZUVuZCgpKSxoJiYoci5wb2x5Z29uRW5kKCksaD0hMSksYT1vPW51bGx9LHNwaGVyZTpmdW5jdGlvbigpe3IucG9seWdvblN0YXJ0KCksci5saW5lU3RhcnQoKSxuKG51bGwsbnVsbCwxLHIpLHIubGluZUVuZCgpLHIucG9seWdvbkVuZCgpfX07ZnVuY3Rpb24gcChlLG4pe3QoZSxuKSYmci5wb2ludChlLG4pfWZ1bmN0aW9uIGYodCxlKXtsLnBvaW50KHQsZSl9ZnVuY3Rpb24gbSgpe2QucG9pbnQ9ZixsLmxpbmVTdGFydCgpfWZ1bmN0aW9uIGcoKXtkLnBvaW50PXAsbC5saW5lRW5kKCl9ZnVuY3Rpb24gXyh0LGUpe3MucHVzaChbdCxlXSksdS5wb2ludCh0LGUpfWZ1bmN0aW9uIHkoKXt1LmxpbmVTdGFydCgpLHM9W119ZnVuY3Rpb24gdigpe18oc1swXVswXSxzWzBdWzFdKSx1LmxpbmVFbmQoKTt2YXIgdCxlLG4saSxsPXUuY2xlYW4oKSxkPWMucmVzdWx0KCkscD1kLmxlbmd0aDtpZihzLnBvcCgpLG8ucHVzaChzKSxzPW51bGwscClpZigxJmwpe2lmKChlPShuPWRbMF0pLmxlbmd0aC0xKT4wKXtmb3IoaHx8KHIucG9seWdvblN0YXJ0KCksaD0hMCksci5saW5lU3RhcnQoKSx0PTA7dDxlOysrdClyLnBvaW50KChpPW5bdF0pWzBdLGlbMV0pO3IubGluZUVuZCgpfX1lbHNlIHA+MSYmMiZsJiZkLnB1c2goZC5wb3AoKS5jb25jYXQoZC5zaGlmdCgpKSksYS5wdXNoKGQuZmlsdGVyKHQkKSl9cmV0dXJuIGR9fWZ1bmN0aW9uIHQkKHQpe3JldHVybiB0Lmxlbmd0aD4xfWZ1bmN0aW9uIGUkKHQsZSl7cmV0dXJuKCh0PXQueClbMF08MD90WzFdLXFxLUdxOnFxLXRbMV0pLSgoZT1lLngpWzBdPDA/ZVsxXS1xcS1HcTpxcS1lWzFdKX0hKGZ1bmN0aW9uIG4kKHQpezE9PT10Lmxlbmd0aCYmKHQ9KGZ1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuIEtYKHQoZSksbil9fSkodCkpfSkoS1gpO3ZhciBpJD1RWCgoZnVuY3Rpb24oKXtyZXR1cm4hMH0pLChmdW5jdGlvbiByJCh0KXt2YXIgZSxuPU5hTixpPU5hTixyPU5hTjtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5saW5lU3RhcnQoKSxlPTF9LHBvaW50OmZ1bmN0aW9uKG8sYSl7dmFyIHM9bz4wP1dxOi1XcSxsPVpxKG8tbik7WnEobC1XcSk8R3E/KHQucG9pbnQobixpPShpK2EpLzI+MD9xcTotcXEpLHQucG9pbnQocixpKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQocyxpKSx0LnBvaW50KG8saSksZT0wKTpyIT09cyYmbD49V3EmJihacShuLXIpPEdxJiYobi09cipHcSksWnEoby1zKTxHcSYmKG8tPXMqR3EpLGk9KGZ1bmN0aW9uIGModCxlLG4saSl7dmFyIHIsbyxhPW9ZKHQtbik7cmV0dXJuIFpxKGEpPkdxP0pxKChvWShlKSoobz10WShpKSkqb1kobiktb1koaSkqKHI9dFkoZSkpKm9ZKHQpKS8ocipvKmEpKTooZStpKS8yfSkobixpLG8sYSksdC5wb2ludChyLGkpLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludChzLGkpLGU9MCksdC5wb2ludChuPW8saT1hKSxyPXN9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0LmxpbmVFbmQoKSxuPWk9TmFOfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiAyLWV9fX0pLChmdW5jdGlvbiBvJCh0LGUsbixpKXt2YXIgcjtpZihudWxsPT10KWkucG9pbnQoLVdxLHI9bipxcSksaS5wb2ludCgwLHIpLGkucG9pbnQoV3EsciksaS5wb2ludChXcSwwKSxpLnBvaW50KFdxLC1yKSxpLnBvaW50KDAsLXIpLGkucG9pbnQoLVdxLC1yKSxpLnBvaW50KC1XcSwwKSxpLnBvaW50KC1XcSxyKTtlbHNlIGlmKFpxKHRbMF0tZVswXSk+R3Epe3ZhciBvPXRbMF08ZVswXT9XcTotV3E7aS5wb2ludCgtbyxyPW4qby8yKSxpLnBvaW50KDAsciksaS5wb2ludChvLHIpfWVsc2UgaS5wb2ludChlWzBdLGVbMV0pfSksWy1XcSwtcXFdKTtmdW5jdGlvbiBhJCh0KXt2YXIgZT10WSh0KSxuPTYqS3EsaT1lPjAscj1acShlKT5HcTtmdW5jdGlvbiBvKHQsbil7cmV0dXJuIHRZKHQpKnRZKG4pPmV9ZnVuY3Rpb24gYSh0LG4saSl7dmFyIHI9WzEsMCwwXSxvPVJZKE5ZKHQpLE5ZKG4pKSxhPUlZKG8sbykscz1vWzBdLGw9YS1zKnM7aWYoIWwpcmV0dXJuIWkmJnQ7dmFyIGM9ZSphL2wsdT0tZSpzL2wsaD1SWShyLG8pLGQ9elkocixjKTtPWShkLHpZKG8sdSkpO3ZhciBwPWgsZj1JWShkLHApLG09SVkocCxwKSxnPWYqZi1tKihJWShkLGQpLTEpO2lmKCEoZzwwKSl7dmFyIF89c1koZykseT16WShwLCgtZi1fKS9tKTtpZihPWSh5LGQpLHk9UFkoeSksIWkpcmV0dXJuIHk7dmFyIHYsYj10WzBdLHg9blswXSx3PXRbMV0sUz1uWzFdO3g8YiYmKHY9YixiPXgseD12KTt2YXIgTT14LWIsRT1acShNLVdxKTxHcTtpZighRSYmUzx3JiYodj13LHc9UyxTPXYpLEV8fE08R3E/RT93K1M+MF55WzFdPChacSh5WzBdLWIpPEdxP3c6Uyk6dzw9eVsxXSYmeVsxXTw9UzpNPldxXihiPD15WzBdJiZ5WzBdPD14KSl7dmFyIFQ9elkocCwoLWYrXykvbSk7cmV0dXJuIE9ZKFQsZCksW3ksUFkoVCldfX19ZnVuY3Rpb24gcyhlLG4pe3ZhciByPWk/dDpXcS10LG89MDtyZXR1cm4gZTwtcj9vfD0xOmU+ciYmKG98PTIpLG48LXI/b3w9NDpuPnImJihvfD04KSxvfXJldHVybiBRWChvLChmdW5jdGlvbiBsKHQpe3ZhciBlLG4sbCxjLHU7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2M9bD0hMSx1PTF9LHBvaW50OmZ1bmN0aW9uKGgsZCl7dmFyIHAsZj1baCxkXSxtPW8oaCxkKSxnPWk/bT8wOnMoaCxkKTptP3MoaCsoaDwwP1dxOi1XcSksZCk6MDtpZighZSYmKGM9bD1tKSYmdC5saW5lU3RhcnQoKSxtIT09bCYmKCEocD1hKGUsZikpfHxHWChlLHApfHxHWChmLHApKSYmKGZbMF0rPUdxLGZbMV0rPUdxLG09byhmWzBdLGZbMV0pKSxtIT09bCl1PTAsbT8odC5saW5lU3RhcnQoKSxwPWEoZixlKSx0LnBvaW50KHBbMF0scFsxXSkpOihwPWEoZSxmKSx0LnBvaW50KHBbMF0scFsxXSksdC5saW5lRW5kKCkpLGU9cDtlbHNlIGlmKHImJmUmJmlebSl7dmFyIF87ZyZufHwhKF89YShmLGUsITApKXx8KHU9MCxpPyh0LmxpbmVTdGFydCgpLHQucG9pbnQoX1swXVswXSxfWzBdWzFdKSx0LnBvaW50KF9bMV1bMF0sX1sxXVsxXSksdC5saW5lRW5kKCkpOih0LnBvaW50KF9bMV1bMF0sX1sxXVsxXSksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KF9bMF1bMF0sX1swXVsxXSkpKX0hbXx8ZSYmR1goZSxmKXx8dC5wb2ludChmWzBdLGZbMV0pLGU9ZixsPW0sbj1nfSxsaW5lRW5kOmZ1bmN0aW9uKCl7bCYmdC5saW5lRW5kKCksZT1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiB1fChjJiZsKTw8MX19fSksKGZ1bmN0aW9uIGMoZSxpLHIsbyl7Vlgobyx0LG4scixlLGkpfSksaT9bMCwtdF06Wy1XcSx0LVdxXSl9dmFyIHMkPTFlOSxsJD0tcyQ7ZnVuY3Rpb24gYyQodCxlLG4saSl7ZnVuY3Rpb24gcihyLG8pe3JldHVybiB0PD1yJiZyPD1uJiZlPD1vJiZvPD1pfWZ1bmN0aW9uIG8ocixvLHMsYyl7dmFyIHU9MCxoPTA7aWYobnVsbD09cnx8KHU9YShyLHMpKSE9PShoPWEobyxzKSl8fGwocixvKTwwXnM+MClkb3tjLnBvaW50KDA9PT11fHwzPT09dT90Om4sdT4xP2k6ZSl9d2hpbGUoKHU9KHUrcys0KSU0KSE9PWgpO2Vsc2UgYy5wb2ludChvWzBdLG9bMV0pfWZ1bmN0aW9uIGEoaSxyKXtyZXR1cm4gWnEoaVswXS10KTxHcT9yPjA/MDozOlpxKGlbMF0tbik8R3E/cj4wPzI6MTpacShpWzFdLWUpPEdxP3I+MD8xOjA6cj4wPzM6Mn1mdW5jdGlvbiBzKHQsZSl7cmV0dXJuIGwodC54LGUueCl9ZnVuY3Rpb24gbCh0LGUpe3ZhciBuPWEodCwxKSxpPWEoZSwxKTtyZXR1cm4gbiE9PWk/bi1pOjA9PT1uP2VbMV0tdFsxXToxPT09bj90WzBdLWVbMF06Mj09PW4/dFsxXS1lWzFdOmVbMF0tdFswXX1yZXR1cm4gZnVuY3Rpb24oYSl7dmFyIGwsYyx1LGgsZCxwLGYsbSxnLF8seSx2PWEsYj1qWCgpLHg9e3BvaW50OlQsbGluZVN0YXJ0OmZ1bmN0aW9uIHcoKXt4LnBvaW50PUMsYyYmYy5wdXNoKHU9W10pLF89ITAsZz0hMSxmPW09TmFOfSxsaW5lRW5kOmZ1bmN0aW9uIFMoKXtsJiYoQyhoLGQpLHAmJmcmJmIucmVqb2luKCksbC5wdXNoKGIucmVzdWx0KCkpKSx4LnBvaW50PVQsZyYmdi5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbiBNKCl7dj1iLGw9W10sYz1bXSx5PSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uIEUoKXt2YXIgZT0oZnVuY3Rpb24gbigpe2Zvcih2YXIgZT0wLG49MCxyPWMubGVuZ3RoO248cjsrK24pZm9yKHZhciBvLGEscz1jW25dLGw9MSx1PXMubGVuZ3RoLGg9c1swXSxkPWhbMF0scD1oWzFdO2w8dTsrK2wpbz1kLGE9cCxkPShoPXNbbF0pWzBdLHA9aFsxXSxhPD1pP3A+aSYmKGQtbykqKGktYSk+KHAtYSkqKHQtbykmJisrZTpwPD1pJiYoZC1vKSooaS1hKTwocC1hKSoodC1vKSYmLS1lO3JldHVybiBlfSkoKSxyPXkmJmUsaD0obD1KWChsKSkubGVuZ3RoOyhyfHxoKSYmKGEucG9seWdvblN0YXJ0KCksciYmKGEubGluZVN0YXJ0KCksbyhudWxsLG51bGwsMSxhKSxhLmxpbmVFbmQoKSksaCYmcVgobCxzLGUsbyxhKSxhLnBvbHlnb25FbmQoKSksdj1hLGw9Yz11PW51bGx9fTtmdW5jdGlvbiBUKHQsZSl7cih0LGUpJiZ2LnBvaW50KHQsZSl9ZnVuY3Rpb24gQyhvLGEpe3ZhciBzPXIobyxhKTtpZihjJiZ1LnB1c2goW28sYV0pLF8paD1vLGQ9YSxwPXMsXz0hMSxzJiYodi5saW5lU3RhcnQoKSx2LnBvaW50KG8sYSkpO2Vsc2UgaWYocyYmZyl2LnBvaW50KG8sYSk7ZWxzZXt2YXIgbD1bZj1NYXRoLm1heChsJCxNYXRoLm1pbihzJCxmKSksbT1NYXRoLm1heChsJCxNYXRoLm1pbihzJCxtKSldLGI9W289TWF0aC5tYXgobCQsTWF0aC5taW4ocyQsbykpLGE9TWF0aC5tYXgobCQsTWF0aC5taW4ocyQsYSkpXTshKGZ1bmN0aW9uIHgodCxlLG4saSxyLG8pe3ZhciBhLHM9dFswXSxsPXRbMV0sYz0wLHU9MSxoPWVbMF0tcyxkPWVbMV0tbDtpZihhPW4tcyxofHwhKGE+MCkpe2lmKGEvPWgsaDwwKXtpZihhPGMpcmV0dXJuO2E8dSYmKHU9YSl9ZWxzZSBpZihoPjApe2lmKGE+dSlyZXR1cm47YT5jJiYoYz1hKX1pZihhPXItcyxofHwhKGE8MCkpe2lmKGEvPWgsaDwwKXtpZihhPnUpcmV0dXJuO2E+YyYmKGM9YSl9ZWxzZSBpZihoPjApe2lmKGE8YylyZXR1cm47YTx1JiYodT1hKX1pZihhPWktbCxkfHwhKGE+MCkpe2lmKGEvPWQsZDwwKXtpZihhPGMpcmV0dXJuO2E8dSYmKHU9YSl9ZWxzZSBpZihkPjApe2lmKGE+dSlyZXR1cm47YT5jJiYoYz1hKX1pZihhPW8tbCxkfHwhKGE8MCkpe2lmKGEvPWQsZDwwKXtpZihhPnUpcmV0dXJuO2E+YyYmKGM9YSl9ZWxzZSBpZihkPjApe2lmKGE8YylyZXR1cm47YTx1JiYodT1hKX1yZXR1cm4gYz4wJiYodFswXT1zK2MqaCx0WzFdPWwrYypkKSx1PDEmJihlWzBdPXMrdSpoLGVbMV09bCt1KmQpLCEwfX19fX0pKGwsYix0LGUsbixpKT9zJiYodi5saW5lU3RhcnQoKSx2LnBvaW50KG8sYSkseT0hMSk6KGd8fCh2LmxpbmVTdGFydCgpLHYucG9pbnQobFswXSxsWzFdKSksdi5wb2ludChiWzBdLGJbMV0pLHN8fHYubGluZUVuZCgpLHk9ITEpfWY9byxtPWEsZz1zfXJldHVybiB4fX12YXIgdSQsaCQsZCQscCQ9RnEoKSxmJD17c3BoZXJlOmRZLHBvaW50OmRZLGxpbmVTdGFydDpmdW5jdGlvbiBtJCgpe2YkLnBvaW50PV8kLGYkLmxpbmVFbmQ9ZyR9LGxpbmVFbmQ6ZFkscG9seWdvblN0YXJ0OmRZLHBvbHlnb25FbmQ6ZFl9O2Z1bmN0aW9uIGckKCl7ZiQucG9pbnQ9ZiQubGluZUVuZD1kWX1mdW5jdGlvbiBfJCh0LGUpe3UkPXQqPUtxLGgkPW9ZKGUqPUtxKSxkJD10WShlKSxmJC5wb2ludD15JH1mdW5jdGlvbiB5JCh0LGUpe3QqPUtxO3ZhciBuPW9ZKGUqPUtxKSxpPXRZKGUpLHI9WnEodC11JCksbz10WShyKSxhPWkqb1kocikscz1kJCpuLWgkKmkqbyxsPWgkKm4rZCQqaSpvO3AkLmFkZChRcShzWShhKmErcypzKSxsKSksdSQ9dCxoJD1uLGQkPWl9ZnVuY3Rpb24gdiQodCl7cmV0dXJuIHAkLnJlc2V0KCkseVkodCxmJCksK3AkfXZhciBiJD1bbnVsbCxudWxsXSx4JD17dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6YiR9O2Z1bmN0aW9uIHckKHQsZSl7cmV0dXJuIGIkWzBdPXQsYiRbMV09ZSx2JCh4JCl9dmFyIFMkPXtGZWF0dXJlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEUkKHQuZ2VvbWV0cnksZSl9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZmVhdHVyZXMsaT0tMSxyPW4ubGVuZ3RoOysraTxyOylpZihFJChuW2ldLmdlb21ldHJ5LGUpKXJldHVybiEwO3JldHVybiExfX0sTSQ9e1NwaGVyZTpmdW5jdGlvbigpe3JldHVybiEwfSxQb2ludDpmdW5jdGlvbih0LGUpe3JldHVybiBUJCh0LmNvb3JkaW5hdGVzLGUpfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuY29vcmRpbmF0ZXMsaT0tMSxyPW4ubGVuZ3RoOysraTxyOylpZihUJChuW2ldLGUpKXJldHVybiEwO3JldHVybiExfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEMkKHQuY29vcmRpbmF0ZXMsZSl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmNvb3JkaW5hdGVzLGk9LTEscj1uLmxlbmd0aDsrK2k8cjspaWYoQyQobltpXSxlKSlyZXR1cm4hMDtyZXR1cm4hMX0sUG9seWdvbjpmdW5jdGlvbih0LGUpe3JldHVybiBBJCh0LmNvb3JkaW5hdGVzLGUpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5jb29yZGluYXRlcyxpPS0xLHI9bi5sZW5ndGg7KytpPHI7KWlmKEEkKG5baV0sZSkpcmV0dXJuITA7cmV0dXJuITF9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10Lmdlb21ldHJpZXMsaT0tMSxyPW4ubGVuZ3RoOysraTxyOylpZihFJChuW2ldLGUpKXJldHVybiEwO3JldHVybiExfX07ZnVuY3Rpb24gRSQodCxlKXtyZXR1cm4hKCF0fHwhTSQuaGFzT3duUHJvcGVydHkodC50eXBlKSkmJk0kW3QudHlwZV0odCxlKX1mdW5jdGlvbiBUJCh0LGUpe3JldHVybiAwPT09dyQodCxlKX1mdW5jdGlvbiBDJCh0LGUpe3ZhciBuPXckKHRbMF0sdFsxXSk7cmV0dXJuIHckKHRbMF0sZSkrdyQoZSx0WzFdKTw9bitHcX1mdW5jdGlvbiBBJCh0LGUpe3JldHVybiEhJFgodC5tYXAoayQpLEwkKGUpKX1mdW5jdGlvbiBrJCh0KXtyZXR1cm4odD10Lm1hcChMJCkpLnBvcCgpLHR9ZnVuY3Rpb24gTCQodCl7cmV0dXJuW3RbMF0qS3EsdFsxXSpLcV19ZnVuY3Rpb24gUCQodCxlLG4pe3ZhciBpPVpYKHQsZS1HcSxuKS5jb25jYXQoZSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuW3QsZV19KSl9fWZ1bmN0aW9uIE4kKHQsZSxuKXt2YXIgaT1aWCh0LGUtR3EsbikuY29uY2F0KGUpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybltlLHRdfSkpfX1mdW5jdGlvbiBJJCgpe3ZhciB0LGUsbixpLHIsbyxhLHMsbCxjLHUsaCxkPTEwLHA9ZCxmPTkwLG09MzYwLGc9Mi41O2Z1bmN0aW9uIF8oKXtyZXR1cm57dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczp5KCl9fWZ1bmN0aW9uIHkoKXtyZXR1cm4gWlgoZVkoaS9mKSpmLG4sZikubWFwKHUpLmNvbmNhdChaWChlWShzL20pKm0sYSxtKS5tYXAoaCkpLmNvbmNhdChaWChlWShlL2QpKmQsdCxkKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBacSh0JWYpPkdxfSkpLm1hcChsKSkuY29uY2F0KFpYKGVZKG8vcCkqcCxyLHApLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIFpxKHQlbSk+R3F9KSkubWFwKGMpKX1yZXR1cm4gXy5saW5lcz1mdW5jdGlvbigpe3JldHVybiB5KCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dH19KSl9LF8ub3V0bGluZT1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbdShpKS5jb25jYXQoaChhKS5zbGljZSgxKSx1KG4pLnJldmVyc2UoKS5zbGljZSgxKSxoKHMpLnJldmVyc2UoKS5zbGljZSgxKSldfX0sXy5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/Xy5leHRlbnRNYWpvcih0KS5leHRlbnRNaW5vcih0KTpfLmV4dGVudE1pbm9yKCl9LF8uZXh0ZW50TWFqb3I9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9K3RbMF1bMV0sYT0rdFsxXVsxXSwoaT0rdFswXVswXSk+KG49K3RbMV1bMF0pJiYodD1pLGk9bixuPXQpLHM+YSYmKHQ9cyxzPWEsYT10KSxfLnByZWNpc2lvbihnKSk6W1tpLHNdLFtuLGFdXX0sXy5leHRlbnRNaW5vcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0rblswXVsxXSxyPStuWzFdWzFdLChlPStuWzBdWzBdKT4odD0rblsxXVswXSkmJihuPWUsZT10LHQ9biksbz5yJiYobj1vLG89cixyPW4pLF8ucHJlY2lzaW9uKGcpKTpbW2Usb10sW3Qscl1dfSxfLnN0ZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/Xy5zdGVwTWFqb3IodCkuc3RlcE1pbm9yKHQpOl8uc3RlcE1pbm9yKCl9LF8uc3RlcE1ham9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSt0WzBdLG09K3RbMV0sXyk6W2YsbV19LF8uc3RlcE1pbm9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSt0WzBdLHA9K3RbMV0sXyk6W2QscF19LF8ucHJlY2lzaW9uPWZ1bmN0aW9uKGQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPStkLGw9UCQobyxyLDkwKSxjPU4kKGUsdCxnKSx1PVAkKHMsYSw5MCksaD1OJChpLG4sZyksXyk6Z30sXy5leHRlbnRNYWpvcihbWy0xODAsLTg5Ljk5OTk5OV0sWzE4MCw4OS45OTk5OTldXSkuZXh0ZW50TWlub3IoW1stMTgwLC04MC4wMDAwMDFdLFsxODAsODAuMDAwMDAxXV0pfWZ1bmN0aW9uIFIkKHQpe3JldHVybiB0fXZhciBPJCx6JCxEJCxCJCxIJD1GcSgpLEYkPUZxKCksViQ9e3BvaW50OmRZLGxpbmVTdGFydDpkWSxsaW5lRW5kOmRZLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1YkLmxpbmVTdGFydD1VJCxWJC5saW5lRW5kPVckfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7ViQubGluZVN0YXJ0PVYkLmxpbmVFbmQ9ViQucG9pbnQ9ZFksSCQuYWRkKFpxKEYkKSksRiQucmVzZXQoKX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9SCQvMjtyZXR1cm4gSCQucmVzZXQoKSx0fX07ZnVuY3Rpb24gVSQoKXtWJC5wb2ludD1qJH1mdW5jdGlvbiBqJCh0LGUpe1YkLnBvaW50PUckLE8kPUQkPXQseiQ9QiQ9ZX1mdW5jdGlvbiBHJCh0LGUpe0YkLmFkZChCJCp0LUQkKmUpLEQkPXQsQiQ9ZX1mdW5jdGlvbiBXJCgpe0ckKE8kLHokKX12YXIgcSQsWSQsWCQsJCQsSyQ9MS8wLFokPUskLEokPS1LJCxRJD1KJCx0Sz17cG9pbnQ6ZnVuY3Rpb24gZUsodCxlKXt0PEskJiYoSyQ9dCksdD5KJCYmKEokPXQpLGU8WiQmJihaJD1lKSxlPlEkJiYoUSQ9ZSl9LGxpbmVTdGFydDpkWSxsaW5lRW5kOmRZLHBvbHlnb25TdGFydDpkWSxwb2x5Z29uRW5kOmRZLHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVtbSyQsWiRdLFtKJCxRJF1dO3JldHVybiBKJD1RJD0tKFokPUskPTEvMCksdH19LG5LPTAsaUs9MCxySz0wLG9LPTAsYUs9MCxzSz0wLGxLPTAsY0s9MCx1Sz0wLGhLPXtwb2ludDpkSyxsaW5lU3RhcnQ6cEssbGluZUVuZDpnSyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtoSy5saW5lU3RhcnQ9X0ssaEsubGluZUVuZD15S30scG9seWdvbkVuZDpmdW5jdGlvbigpe2hLLnBvaW50PWRLLGhLLmxpbmVTdGFydD1wSyxoSy5saW5lRW5kPWdLfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD11Sz9bbEsvdUssY0svdUtdOnNLP1tvSy9zSyxhSy9zS106cks/W25LL3JLLGlLL3JLXTpbTmFOLE5hTl07cmV0dXJuIG5LPWlLPXJLPW9LPWFLPXNLPWxLPWNLPXVLPTAsdH19O2Z1bmN0aW9uIGRLKHQsZSl7bksrPXQsaUsrPWUsKytyS31mdW5jdGlvbiBwSygpe2hLLnBvaW50PWZLfWZ1bmN0aW9uIGZLKHQsZSl7aEsucG9pbnQ9bUssZEsoWCQ9dCwkJD1lKX1mdW5jdGlvbiBtSyh0LGUpe3ZhciBuPXQtWCQsaT1lLSQkLHI9c1kobipuK2kqaSk7b0srPXIqKFgkK3QpLzIsYUsrPXIqKCQkK2UpLzIsc0srPXIsZEsoWCQ9dCwkJD1lKX1mdW5jdGlvbiBnSygpe2hLLnBvaW50PWRLfWZ1bmN0aW9uIF9LKCl7aEsucG9pbnQ9dkt9ZnVuY3Rpb24geUsoKXtiSyhxJCxZJCl9ZnVuY3Rpb24gdksodCxlKXtoSy5wb2ludD1iSyxkSyhxJD1YJD10LFkkPSQkPWUpfWZ1bmN0aW9uIGJLKHQsZSl7dmFyIG49dC1YJCxpPWUtJCQscj1zWShuKm4raSppKTtvSys9ciooWCQrdCkvMixhSys9ciooJCQrZSkvMixzSys9cixsSys9KHI9JCQqdC1YJCplKSooWCQrdCksY0srPXIqKCQkK2UpLHVLKz0zKnIsZEsoWCQ9dCwkJD1lKX1mdW5jdGlvbiB4Syh0KXt0aGlzLl9jb250ZXh0PXR9eEsucHJvdG90eXBlPXtfcmFkaXVzOjQuNSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmFkaXVzPXQsdGhpc30scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPT09dGhpcy5fbGluZSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9wb2ludD1OYU59LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxlKSx0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpO2JyZWFrO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5tb3ZlVG8odCt0aGlzLl9yYWRpdXMsZSksdGhpcy5fY29udGV4dC5hcmModCxlLHRoaXMuX3JhZGl1cywwLFhxKX19LHJlc3VsdDpkWX07dmFyIHdLLFNLLE1LLEVLLFRLLENLPUZxKCksQUs9e3BvaW50OmRZLGxpbmVTdGFydDpmdW5jdGlvbigpe0FLLnBvaW50PWtLfSxsaW5lRW5kOmZ1bmN0aW9uKCl7d0smJkxLKFNLLE1LKSxBSy5wb2ludD1kWX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7d0s9ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt3Sz1udWxsfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD0rQ0s7cmV0dXJuIENLLnJlc2V0KCksdH19O2Z1bmN0aW9uIGtLKHQsZSl7QUsucG9pbnQ9TEssU0s9RUs9dCxNSz1USz1lfWZ1bmN0aW9uIExLKHQsZSl7Q0suYWRkKHNZKChFSy09dCkqRUsrKFRLLT1lKSpUSykpLEVLPXQsVEs9ZX1mdW5jdGlvbiBQSygpe3RoaXMuX3N0cmluZz1bXX1mdW5jdGlvbiBOSyh0KXtyZXR1cm4ibTAsIit0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKy0yKnQrImEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrMip0KyJ6In1mdW5jdGlvbiBJSyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49bmV3IFJLO2Zvcih2YXIgaSBpbiB0KW5baV09dFtpXTtyZXR1cm4gbi5zdHJlYW09ZSxufX1mdW5jdGlvbiBSSygpe31mdW5jdGlvbiBPSyh0LGUsbil7dmFyIGk9dC5jbGlwRXh0ZW50JiZ0LmNsaXBFeHRlbnQoKTtyZXR1cm4gdC5zY2FsZSgxNTApLnRyYW5zbGF0ZShbMCwwXSksbnVsbCE9aSYmdC5jbGlwRXh0ZW50KG51bGwpLHlZKG4sdC5zdHJlYW0odEspKSxlKHRLLnJlc3VsdCgpKSxudWxsIT1pJiZ0LmNsaXBFeHRlbnQoaSksdH1mdW5jdGlvbiB6Syh0LGUsbil7cmV0dXJuIE9LKHQsKGZ1bmN0aW9uKG4pe3ZhciBpPWVbMV1bMF0tZVswXVswXSxyPWVbMV1bMV0tZVswXVsxXSxvPU1hdGgubWluKGkvKG5bMV1bMF0tblswXVswXSksci8oblsxXVsxXS1uWzBdWzFdKSksYT0rZVswXVswXSsoaS1vKihuWzFdWzBdK25bMF1bMF0pKS8yLHM9K2VbMF1bMV0rKHItbyooblsxXVsxXStuWzBdWzFdKSkvMjt0LnNjYWxlKDE1MCpvKS50cmFuc2xhdGUoW2Esc10pfSksbil9ZnVuY3Rpb24gREsodCxlLG4pe3JldHVybiB6Syh0LFtbMCwwXSxlXSxuKX1mdW5jdGlvbiBCSyh0LGUsbil7cmV0dXJuIE9LKHQsKGZ1bmN0aW9uKG4pe3ZhciBpPStlLHI9aS8oblsxXVswXS1uWzBdWzBdKSxvPShpLXIqKG5bMV1bMF0rblswXVswXSkpLzIsYT0tcipuWzBdWzFdO3Quc2NhbGUoMTUwKnIpLnRyYW5zbGF0ZShbbyxhXSl9KSxuKX1mdW5jdGlvbiBISyh0LGUsbil7cmV0dXJuIE9LKHQsKGZ1bmN0aW9uKG4pe3ZhciBpPStlLHI9aS8oblsxXVsxXS1uWzBdWzFdKSxvPS1yKm5bMF1bMF0sYT0oaS1yKihuWzFdWzFdK25bMF1bMV0pKS8yO3Quc2NhbGUoMTUwKnIpLnRyYW5zbGF0ZShbbyxhXSl9KSxuKX1QSy5wcm90b3R5cGU9e19yYWRpdXM6NC41LF9jaXJjbGU6TksoNC41KSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4odD0rdCkhPT10aGlzLl9yYWRpdXMmJih0aGlzLl9yYWRpdXM9dCx0aGlzLl9jaXJjbGU9bnVsbCksdGhpc30scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPT09dGhpcy5fbGluZSYmdGhpcy5fc3RyaW5nLnB1c2goIloiKSx0aGlzLl9wb2ludD1OYU59LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fc3RyaW5nLnB1c2goIk0iLHQsIiwiLGUpLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3N0cmluZy5wdXNoKCJMIix0LCIsIixlKTticmVhaztkZWZhdWx0Om51bGw9PXRoaXMuX2NpcmNsZSYmKHRoaXMuX2NpcmNsZT1OSyh0aGlzLl9yYWRpdXMpKSx0aGlzLl9zdHJpbmcucHVzaCgiTSIsdCwiLCIsZSx0aGlzLl9jaXJjbGUpfX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYodGhpcy5fc3RyaW5nLmxlbmd0aCl7dmFyIHQ9dGhpcy5fc3RyaW5nLmpvaW4oIiIpO3JldHVybiB0aGlzLl9zdHJpbmc9W10sdH1yZXR1cm4gbnVsbH19LFJLLnByb3RvdHlwZT17Y29uc3RydWN0b3I6UksscG9pbnQ6ZnVuY3Rpb24odCxlKXt0aGlzLnN0cmVhbS5wb2ludCh0LGUpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX07dmFyIEZLPXRZKDMwKktxKTtmdW5jdGlvbiBWSyh0LGUpe3JldHVybitlPyhmdW5jdGlvbiBuKHQsZSl7ZnVuY3Rpb24gbihpLHIsbyxhLHMsbCxjLHUsaCxkLHAsZixtLGcpe3ZhciBfPWMtaSx5PXUtcix2PV8qXyt5Knk7aWYodj40KmUmJm0tLSl7dmFyIGI9YStkLHg9cytwLHc9bCtmLFM9c1koYipiK3gqeCt3KncpLE09dVkody89UyksRT1acShacSh3KS0xKTxHcXx8WnEoby1oKTxHcT8obytoKS8yOlFxKHgsYiksVD10KEUsTSksQz1UWzBdLEE9VFsxXSxrPUMtaSxMPUEtcixQPXkqay1fKkw7KFAqUC92PmV8fFpxKChfKmsreSpMKS92LS41KT4uM3x8YSpkK3MqcCtsKmY8RkspJiYobihpLHIsbyxhLHMsbCxDLEEsRSxiLz1TLHgvPVMsdyxtLGcpLGcucG9pbnQoQyxBKSxuKEMsQSxFLGIseCx3LGMsdSxoLGQscCxmLG0sZykpfX1yZXR1cm4gZnVuY3Rpb24oZSl7dmFyIGkscixvLGEscyxsLGMsdSxoLGQscCxmLG09e3BvaW50OmcsbGluZVN0YXJ0Ol8sbGluZUVuZDp2LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2UucG9seWdvblN0YXJ0KCksbS5saW5lU3RhcnQ9Yn0scG9seWdvbkVuZDpmdW5jdGlvbigpe2UucG9seWdvbkVuZCgpLG0ubGluZVN0YXJ0PV99fTtmdW5jdGlvbiBnKG4saSl7bj10KG4saSksZS5wb2ludChuWzBdLG5bMV0pfWZ1bmN0aW9uIF8oKXt1PU5hTixtLnBvaW50PXksZS5saW5lU3RhcnQoKX1mdW5jdGlvbiB5KGkscil7dmFyIG89TlkoW2kscl0pLGE9dChpLHIpO24odSxoLGMsZCxwLGYsdT1hWzBdLGg9YVsxXSxjPWksZD1vWzBdLHA9b1sxXSxmPW9bMl0sMTYsZSksZS5wb2ludCh1LGgpfWZ1bmN0aW9uIHYoKXttLnBvaW50PWcsZS5saW5lRW5kKCl9ZnVuY3Rpb24gYigpe18oKSxtLnBvaW50PXgsbS5saW5lRW5kPXd9ZnVuY3Rpb24geCh0LGUpe3koaT10LGUpLHI9dSxvPWgsYT1kLHM9cCxsPWYsbS5wb2ludD15fWZ1bmN0aW9uIHcoKXtuKHUsaCxjLGQscCxmLHIsbyxpLGEscyxsLDE2LGUpLG0ubGluZUVuZD12LHYoKX1yZXR1cm4gbX19KSh0LGUpOihmdW5jdGlvbiBpKHQpe3JldHVybiBJSyh7cG9pbnQ6ZnVuY3Rpb24oZSxuKXtlPXQoZSxuKSx0aGlzLnN0cmVhbS5wb2ludChlWzBdLGVbMV0pfX0pfSkodCl9dmFyIFVLPUlLKHtwb2ludDpmdW5jdGlvbih0LGUpe3RoaXMuc3RyZWFtLnBvaW50KHQqS3EsZSpLcSl9fSk7ZnVuY3Rpb24gaksodCl7cmV0dXJuIEdLKChmdW5jdGlvbigpe3JldHVybiB0fSkpKCl9ZnVuY3Rpb24gR0sodCl7dmFyIGUsbixpLHIsbyxhLHMsbCxjLHUsaD0xNTAsZD00ODAscD0yNTAsZj0wLG09MCxnPTAsXz0wLHk9MCx2PW51bGwsYj1pJCx4PW51bGwsdz1SJCxTPS41LE09VksoQyxTKTtmdW5jdGlvbiBFKHQpe3JldHVyblsodD1vKHRbMF0qS3EsdFsxXSpLcSkpWzBdKmgrbixpLXRbMV0qaF19ZnVuY3Rpb24gVCh0KXtyZXR1cm4odD1vLmludmVydCgodFswXS1uKS9oLChpLXRbMV0pL2gpKSYmW3RbMF0qJHEsdFsxXSokcV19ZnVuY3Rpb24gQyh0LHIpe3JldHVyblsodD1lKHQscikpWzBdKmgrbixpLXRbMV0qaF19ZnVuY3Rpb24gQSgpe289Ulgocj16WChnLF8seSksZSk7dmFyIHQ9ZShmLG0pO3JldHVybiBuPWQtdFswXSpoLGk9cCt0WzFdKmgsaygpfWZ1bmN0aW9uIGsoKXtyZXR1cm4gYz11PW51bGwsRX1yZXR1cm4gRS5zdHJlYW09ZnVuY3Rpb24odCl7cmV0dXJuIGMmJnU9PT10P2M6Yz1VSygoZnVuY3Rpb24gZSh0KXtyZXR1cm4gSUsoe3BvaW50OmZ1bmN0aW9uKGUsbil7dmFyIGk9dChlLG4pO3JldHVybiB0aGlzLnN0cmVhbS5wb2ludChpWzBdLGlbMV0pfX0pfSkocikoYihNKHcodT10KSkpKSl9LEUucHJlY2xpcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj10LHY9dm9pZCAwLGsoKSk6Yn0sRS5wb3N0Y2xpcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odz10LHg9YT1zPWw9bnVsbCxrKCkpOnd9LEUuY2xpcEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPSt0P2EkKHY9dCpLcSk6KHY9bnVsbCxpJCksaygpKTp2KiRxfSxFLmNsaXBFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHc9bnVsbD09dD8oeD1hPXM9bD1udWxsLFIkKTpjJCh4PSt0WzBdWzBdLGE9K3RbMF1bMV0scz0rdFsxXVswXSxsPSt0WzFdWzFdKSxrKCkpOm51bGw9PXg/bnVsbDpbW3gsYV0sW3MsbF1dfSxFLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSt0LEEoKSk6aH0sRS50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9K3RbMF0scD0rdFsxXSxBKCkpOltkLHBdfSxFLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj10WzBdJTM2MCpLcSxtPXRbMV0lMzYwKktxLEEoKSk6W2YqJHEsbSokcV19LEUucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPXRbMF0lMzYwKktxLF89dFsxXSUzNjAqS3EseT10Lmxlbmd0aD4yP3RbMl0lMzYwKktxOjAsQSgpKTpbZyokcSxfKiRxLHkqJHFdfSxFLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTT1WSyhDLFM9dCp0KSxrKCkpOnNZKFMpfSxFLmZpdEV4dGVudD1mdW5jdGlvbih0LGUpe3JldHVybiB6SyhFLHQsZSl9LEUuZml0U2l6ZT1mdW5jdGlvbih0LGUpe3JldHVybiBESyhFLHQsZSl9LEUuZml0V2lkdGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gQksoRSx0LGUpfSxFLmZpdEhlaWdodD1mdW5jdGlvbih0LGUpe3JldHVybiBISyhFLHQsZSl9LGZ1bmN0aW9uKCl7cmV0dXJuIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksRS5pbnZlcnQ9ZS5pbnZlcnQmJlQsQSgpfX1mdW5jdGlvbiBXSyh0KXt2YXIgZT0wLG49V3EvMyxpPUdLKHQpLHI9aShlLG4pO3JldHVybiByLnBhcmFsbGVscz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9pKGU9dFswXSpLcSxuPXRbMV0qS3EpOltlKiRxLG4qJHFdfSxyfWZ1bmN0aW9uIHFLKHQsZSl7dmFyIG49b1kodCksaT0obitvWShlKSkvMjtpZihacShpKTxHcSlyZXR1cm4oZnVuY3Rpb24gcih0KXt2YXIgZT10WSh0KTtmdW5jdGlvbiBuKHQsbil7cmV0dXJuW3QqZSxvWShuKS9lXX1yZXR1cm4gbi5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtyZXR1cm5bdC9lLHVZKG4qZSldfSxufSkodCk7dmFyIG89MStuKigyKmktbiksYT1zWShvKS9pO2Z1bmN0aW9uIHModCxlKXt2YXIgbj1zWShvLTIqaSpvWShlKSkvaTtyZXR1cm5bbipvWSh0Kj1pKSxhLW4qdFkodCldfXJldHVybiBzLmludmVydD1mdW5jdGlvbih0LGUpe3ZhciBuPWEtZTtyZXR1cm5bUXEodCxacShuKSkvaSphWShuKSx1WSgoby0odCp0K24qbikqaSppKS8oMippKSldfSxzfWZ1bmN0aW9uIFlLKCl7cmV0dXJuIFdLKHFLKS5zY2FsZSgxNTUuNDI0KS5jZW50ZXIoWzAsMzMuNjQ0Ml0pfWZ1bmN0aW9uIFhLKCl7cmV0dXJuIFlLKCkucGFyYWxsZWxzKFsyOS41LDQ1LjVdKS5zY2FsZSgxMDcwKS50cmFuc2xhdGUoWzQ4MCwyNTBdKS5yb3RhdGUoWzk2LDBdKS5jZW50ZXIoWy0uNiwzOC43XSl9ZnVuY3Rpb24gJEsodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIGk9dFkoZSkscj10WShuKSxvPXQoaSpyKTtyZXR1cm5bbypyKm9ZKGUpLG8qb1kobildfX1mdW5jdGlvbiBLSyh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgaT1zWShlKmUrbipuKSxyPXQoaSksbz1vWShyKSxhPXRZKHIpO3JldHVybltRcShlKm8saSphKSx1WShpJiZuKm8vaSldfX12YXIgWks9JEsoKGZ1bmN0aW9uKHQpe3JldHVybiBzWSgyLygxK3QpKX0pKTtaSy5pbnZlcnQ9S0soKGZ1bmN0aW9uKHQpe3JldHVybiAyKnVZKHQvMil9KSk7dmFyIEpLPSRLKChmdW5jdGlvbih0KXtyZXR1cm4odD1jWSh0KSkmJnQvb1kodCl9KSk7ZnVuY3Rpb24gUUsodCxlKXtyZXR1cm5bdCxpWShsWSgocXErZSkvMikpXX1mdW5jdGlvbiB0Wih0KXt2YXIgZSxuLGkscj1qSyh0KSxvPXIuY2VudGVyLGE9ci5zY2FsZSxzPXIudHJhbnNsYXRlLGw9ci5jbGlwRXh0ZW50LGM9bnVsbDtmdW5jdGlvbiB1KCl7dmFyIG89V3EqYSgpLHM9cihGWChyLnJvdGF0ZSgpKS5pbnZlcnQoWzAsMF0pKTtyZXR1cm4gbChudWxsPT1jP1tbc1swXS1vLHNbMV0tb10sW3NbMF0rbyxzWzFdK29dXTp0PT09UUs/W1tNYXRoLm1heChzWzBdLW8sYyksZV0sW01hdGgubWluKHNbMF0rbyxuKSxpXV06W1tjLE1hdGgubWF4KHNbMV0tbyxlKV0sW24sTWF0aC5taW4oc1sxXStvLGkpXV0pfXJldHVybiByLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhKHQpLHUoKSk6YSgpfSxyLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocyh0KSx1KCkpOnMoKX0sci5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG8odCksdSgpKTpvKCl9LHIuY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9jPWU9bj1pPW51bGw6KGM9K3RbMF1bMF0sZT0rdFswXVsxXSxuPSt0WzFdWzBdLGk9K3RbMV1bMV0pLHUoKSk6bnVsbD09Yz9udWxsOltbYyxlXSxbbixpXV19LHUoKX1mdW5jdGlvbiBlWih0KXtyZXR1cm4gbFkoKHFxK3QpLzIpfWZ1bmN0aW9uIG5aKHQsZSl7dmFyIG49dFkodCksaT10PT09ZT9vWSh0KTppWShuL3RZKGUpKS9pWShlWihlKS9lWih0KSkscj1uKnJZKGVaKHQpLGkpL2k7aWYoIWkpcmV0dXJuIFFLO2Z1bmN0aW9uIG8odCxlKXtyPjA/ZTwtcXErR3EmJihlPS1xcStHcSk6ZT5xcS1HcSYmKGU9cXEtR3EpO3ZhciBuPXIvclkoZVooZSksaSk7cmV0dXJuW24qb1koaSp0KSxyLW4qdFkoaSp0KV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ci1lLG89YVkoaSkqc1kodCp0K24qbik7cmV0dXJuW1FxKHQsWnEobikpL2kqYVkobiksMipKcShyWShyL28sMS9pKSktcXFdfSxvfWZ1bmN0aW9uIGlaKHQsZSl7cmV0dXJuW3QsZV19ZnVuY3Rpb24gcloodCxlKXt2YXIgbj10WSh0KSxpPXQ9PT1lP29ZKHQpOihuLXRZKGUpKS8oZS10KSxyPW4vaSt0O2lmKFpxKGkpPEdxKXJldHVybiBpWjtmdW5jdGlvbiBvKHQsZSl7dmFyIG49ci1lLG89aSp0O3JldHVybltuKm9ZKG8pLHItbip0WShvKV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ci1lO3JldHVybltRcSh0LFpxKG4pKS9pKmFZKG4pLHItYVkoaSkqc1kodCp0K24qbildfSxvfWZ1bmN0aW9uIG9aKHQsZSl7dmFyIG49dFkoZSksaT10WSh0KSpuO3JldHVybltuKm9ZKHQpL2ksb1koZSkvaV19ZnVuY3Rpb24gYVoodCxlLG4saSl7cmV0dXJuIDE9PT10JiYxPT09ZSYmMD09PW4mJjA9PT1pP1IkOklLKHtwb2ludDpmdW5jdGlvbihyLG8pe3RoaXMuc3RyZWFtLnBvaW50KHIqdCtuLG8qZStpKX19KX1mdW5jdGlvbiBzWih0LGUpe3ZhciBuPWUqZSxpPW4qbjtyZXR1cm5bdCooLjg3MDctLjEzMTk3OSpuK2kqKGkqKC4wMDM5NzEqbi0uMDAxNTI5KmkpLS4wMTM3OTEpKSxlKigxLjAwNzIyNituKiguMDE1MDg1K2kqKC4wMjg4NzQqbi0uMDQ0NDc1LS4wMDU5MTYqaSkpKV19ZnVuY3Rpb24gbFoodCxlKXtyZXR1cm5bdFkoZSkqb1kodCksb1koZSldfWZ1bmN0aW9uIGNaKHQsZSl7dmFyIG49dFkoZSksaT0xK3RZKHQpKm47cmV0dXJuW24qb1kodCkvaSxvWShlKS9pXX1mdW5jdGlvbiB1Wih0LGUpe3JldHVybltpWShsWSgocXErZSkvMikpLC10XX1mdW5jdGlvbiBoWih0LGUpe3JldHVybiB0LnBhcmVudD09PWUucGFyZW50PzE6Mn1mdW5jdGlvbiBkWih0LGUpe3JldHVybiB0K2UueH1mdW5jdGlvbiBwWih0LGUpe3JldHVybiBNYXRoLm1heCh0LGUueSl9ZnVuY3Rpb24gZloodCl7dmFyIGU9MCxuPXQuY2hpbGRyZW4saT1uJiZuLmxlbmd0aDtpZihpKWZvcig7LS1pPj0wOyllKz1uW2ldLnZhbHVlO2Vsc2UgZT0xO3QudmFsdWU9ZX1mdW5jdGlvbiBtWih0LGUpe3ZhciBuLGkscixvLGEscz1uZXcgdloodCksbD0rdC52YWx1ZSYmKHMudmFsdWU9dC52YWx1ZSksYz1bc107Zm9yKG51bGw9PWUmJihlPWdaKTtuPWMucG9wKCk7KWlmKGwmJihuLnZhbHVlPStuLmRhdGEudmFsdWUpLChyPWUobi5kYXRhKSkmJihhPXIubGVuZ3RoKSlmb3Iobi5jaGlsZHJlbj1uZXcgQXJyYXkoYSksbz1hLTE7bz49MDstLW8pYy5wdXNoKGk9bi5jaGlsZHJlbltvXT1uZXcgdloocltvXSkpLGkucGFyZW50PW4saS5kZXB0aD1uLmRlcHRoKzE7cmV0dXJuIHMuZWFjaEJlZm9yZSh5Wil9ZnVuY3Rpb24gZ1oodCl7cmV0dXJuIHQuY2hpbGRyZW59ZnVuY3Rpb24gX1oodCl7dC5kYXRhPXQuZGF0YS5kYXRhfWZ1bmN0aW9uIHlaKHQpe3ZhciBlPTA7ZG97dC5oZWlnaHQ9ZX13aGlsZSgodD10LnBhcmVudCkmJnQuaGVpZ2h0PCsrZSl9ZnVuY3Rpb24gdloodCl7dGhpcy5kYXRhPXQsdGhpcy5kZXB0aD10aGlzLmhlaWdodD0wLHRoaXMucGFyZW50PW51bGx9SksuaW52ZXJ0PUtLKChmdW5jdGlvbih0KXtyZXR1cm4gdH0pKSxRSy5pbnZlcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm5bdCwyKkpxKG5ZKGUpKS1xcV19LGlaLmludmVydD1pWixvWi5pbnZlcnQ9S0soSnEpLHNaLmludmVydD1mdW5jdGlvbih0LGUpe3ZhciBuLGk9ZSxyPTI1O2Rve3ZhciBvPWkqaSxhPW8qbztpLT1uPShpKigxLjAwNzIyNitvKiguMDE1MDg1K2EqKC4wMjg4NzQqby0uMDQ0NDc1LS4wMDU5MTYqYSkpKS1lKS8oMS4wMDcyMjYrbyooLjA0NTI1NSthKiguMjU5ODY2Km8tLjMxMTMyNS0uMDA1OTE2KjExKmEpKSl9d2hpbGUoWnEobik+R3EmJi0tcj4wKTtyZXR1cm5bdC8oLjg3MDcrKG89aSppKSoobyoobypvKm8qKC4wMDM5NzEtLjAwMTUyOSpvKS0uMDEzNzkxKS0uMTMxOTc5KSksaV19LGxaLmludmVydD1LSyh1WSksY1ouaW52ZXJ0PUtLKChmdW5jdGlvbih0KXtyZXR1cm4gMipKcSh0KX0pKSx1Wi5pbnZlcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm5bLWUsMipKcShuWSh0KSktcXFdfSx2Wi5wcm90b3R5cGU9bVoucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp2Wixjb3VudDpmdW5jdGlvbiBiWigpe3JldHVybiB0aGlzLmVhY2hBZnRlcihmWil9LGVhY2g6ZnVuY3Rpb24geFoodCl7dmFyIGUsbixpLHIsbz10aGlzLGE9W29dO2Rve2ZvcihlPWEucmV2ZXJzZSgpLGE9W107bz1lLnBvcCgpOylpZih0KG8pLG49by5jaGlsZHJlbilmb3IoaT0wLHI9bi5sZW5ndGg7aTxyOysraSlhLnB1c2gobltpXSl9d2hpbGUoYS5sZW5ndGgpO3JldHVybiB0aGlzfSxlYWNoQWZ0ZXI6ZnVuY3Rpb24gd1oodCl7Zm9yKHZhciBlLG4saSxyPXRoaXMsbz1bcl0sYT1bXTtyPW8ucG9wKCk7KWlmKGEucHVzaChyKSxlPXIuY2hpbGRyZW4pZm9yKG49MCxpPWUubGVuZ3RoO248aTsrK24pby5wdXNoKGVbbl0pO2Zvcig7cj1hLnBvcCgpOyl0KHIpO3JldHVybiB0aGlzfSxlYWNoQmVmb3JlOmZ1bmN0aW9uIFNaKHQpe2Zvcih2YXIgZSxuLGk9dGhpcyxyPVtpXTtpPXIucG9wKCk7KWlmKHQoaSksZT1pLmNoaWxkcmVuKWZvcihuPWUubGVuZ3RoLTE7bj49MDstLW4pci5wdXNoKGVbbl0pO3JldHVybiB0aGlzfSxzdW06ZnVuY3Rpb24gTVoodCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKChmdW5jdGlvbihlKXtmb3IodmFyIG49K3QoZS5kYXRhKXx8MCxpPWUuY2hpbGRyZW4scj1pJiZpLmxlbmd0aDstLXI+PTA7KW4rPWlbcl0udmFsdWU7ZS52YWx1ZT1ufSkpfSxzb3J0OmZ1bmN0aW9uIEVaKHQpe3JldHVybiB0aGlzLmVhY2hCZWZvcmUoKGZ1bmN0aW9uKGUpe2UuY2hpbGRyZW4mJmUuY2hpbGRyZW4uc29ydCh0KX0pKX0scGF0aDpmdW5jdGlvbiBUWih0KXtmb3IodmFyIGU9dGhpcyxuPShmdW5jdGlvbiBpKHQsZSl7aWYodD09PWUpcmV0dXJuIHQ7dmFyIG49dC5hbmNlc3RvcnMoKSxpPWUuYW5jZXN0b3JzKCkscj1udWxsO2Zvcih0PW4ucG9wKCksZT1pLnBvcCgpO3Q9PT1lOylyPXQsdD1uLnBvcCgpLGU9aS5wb3AoKTtyZXR1cm4gcn0pKGUsdCkscj1bZV07ZSE9PW47KXIucHVzaChlPWUucGFyZW50KTtmb3IodmFyIG89ci5sZW5ndGg7dCE9PW47KXIuc3BsaWNlKG8sMCx0KSx0PXQucGFyZW50O3JldHVybiByfSxhbmNlc3RvcnM6ZnVuY3Rpb24gQ1ooKXtmb3IodmFyIHQ9dGhpcyxlPVt0XTt0PXQucGFyZW50OyllLnB1c2godCk7cmV0dXJuIGV9LGRlc2NlbmRhbnRzOmZ1bmN0aW9uIEFaKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oZSl7dC5wdXNoKGUpfSkpLHR9LGxlYXZlczpmdW5jdGlvbiBrWigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2hCZWZvcmUoKGZ1bmN0aW9uKGUpe2UuY2hpbGRyZW58fHQucHVzaChlKX0pKSx0fSxsaW5rczpmdW5jdGlvbiBMWigpe3ZhciB0PXRoaXMsZT1bXTtyZXR1cm4gdC5lYWNoKChmdW5jdGlvbihuKXtuIT09dCYmZS5wdXNoKHtzb3VyY2U6bi5wYXJlbnQsdGFyZ2V0Om59KX0pKSxlfSxjb3B5OmZ1bmN0aW9uIFBaKCl7cmV0dXJuIG1aKHRoaXMpLmVhY2hCZWZvcmUoX1opfX07dmFyIE5aPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBJWih0KXtmb3IodmFyIGUsbixpPTAscj0odD0oZnVuY3Rpb24gbyh0KXtmb3IodmFyIGUsbixpPXQubGVuZ3RoO2k7KW49TWF0aC5yYW5kb20oKSppLS18MCxlPXRbaV0sdFtpXT10W25dLHRbbl09ZTtyZXR1cm4gdH0pKE5aLmNhbGwodCkpKS5sZW5ndGgsYT1bXTtpPHI7KWU9dFtpXSxuJiZ6WihuLGUpPysraToobj1CWihhPVJaKGEsZSkpLGk9MCk7cmV0dXJuIG59ZnVuY3Rpb24gUloodCxlKXt2YXIgbixpO2lmKERaKGUsdCkpcmV0dXJuW2VdO2ZvcihuPTA7bjx0Lmxlbmd0aDsrK24paWYoT1ooZSx0W25dKSYmRFooSFoodFtuXSxlKSx0KSlyZXR1cm5bdFtuXSxlXTtmb3Iobj0wO248dC5sZW5ndGgtMTsrK24pZm9yKGk9bisxO2k8dC5sZW5ndGg7KytpKWlmKE9aKEhaKHRbbl0sdFtpXSksZSkmJk9aKEhaKHRbbl0sZSksdFtpXSkmJk9aKEhaKHRbaV0sZSksdFtuXSkmJkRaKEZaKHRbbl0sdFtpXSxlKSx0KSlyZXR1cm5bdFtuXSx0W2ldLGVdO3Rocm93IG5ldyBFcnJvcn1mdW5jdGlvbiBPWih0LGUpe3ZhciBuPXQuci1lLnIsaT1lLngtdC54LHI9ZS55LXQueTtyZXR1cm4gbjwwfHxuKm48aSppK3Iqcn1mdW5jdGlvbiB6Wih0LGUpe3ZhciBuPXQuci1lLnIrMWUtNixpPWUueC10Lngscj1lLnktdC55O3JldHVybiBuPjAmJm4qbj5pKmkrcipyfWZ1bmN0aW9uIERaKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDsrK24paWYoIXpaKHQsZVtuXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gQloodCl7c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDE6cmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJue3g6dC54LHk6dC55LHI6dC5yfX0pKHRbMF0pO2Nhc2UgMjpyZXR1cm4gSFoodFswXSx0WzFdKTtjYXNlIDM6cmV0dXJuIEZaKHRbMF0sdFsxXSx0WzJdKX19ZnVuY3Rpb24gSFoodCxlKXt2YXIgbj10LngsaT10Lnkscj10LnIsbz1lLngsYT1lLnkscz1lLnIsbD1vLW4sYz1hLWksdT1zLXIsaD1NYXRoLnNxcnQobCpsK2MqYyk7cmV0dXJue3g6KG4rbytsL2gqdSkvMix5OihpK2ErYy9oKnUpLzIscjooaCtyK3MpLzJ9fWZ1bmN0aW9uIEZaKHQsZSxuKXt2YXIgaT10Lngscj10Lnksbz10LnIsYT1lLngscz1lLnksbD1lLnIsYz1uLngsdT1uLnksaD1uLnIsZD1pLWEscD1pLWMsZj1yLXMsbT1yLXUsZz1sLW8sXz1oLW8seT1pKmkrcipyLW8qbyx2PXktYSphLXMqcytsKmwsYj15LWMqYy11KnUraCpoLHg9cCpmLWQqbSx3PShmKmItbSp2KS8oMip4KS1pLFM9KG0qZy1mKl8pL3gsTT0ocCp2LWQqYikvKDIqeCktcixFPShkKl8tcCpnKS94LFQ9UypTK0UqRS0xLEM9Mioobyt3KlMrTSpFKSxBPXcqdytNKk0tbypvLGs9LShUPyhDK01hdGguc3FydChDKkMtNCpUKkEpKS8oMipUKTpBL0MpO3JldHVybnt4OmkrdytTKmsseTpyK00rRSprLHI6a319ZnVuY3Rpb24gVloodCxlLG4pe3ZhciBpPXQueCxyPXQueSxvPWUucituLnIsYT10LnIrbi5yLHM9ZS54LWksbD1lLnktcixjPXMqcytsKmw7aWYoYyl7dmFyIHU9LjUrKChhKj1hKS0obyo9bykpLygyKmMpLGg9TWF0aC5zcXJ0KE1hdGgubWF4KDAsMipvKihhK2MpLShhLT1jKSphLW8qbykpLygyKmMpO24ueD1pK3UqcytoKmwsbi55PXIrdSpsLWgqc31lbHNlIG4ueD1pK2Esbi55PXJ9ZnVuY3Rpb24gVVoodCxlKXt2YXIgbj1lLngtdC54LGk9ZS55LXQueSxyPXQucitlLnI7cmV0dXJuIHIqci0xZS02Pm4qbitpKml9ZnVuY3Rpb24galoodCl7dmFyIGU9dC5fLG49dC5uZXh0Ll8saT1lLnIrbi5yLHI9KGUueCpuLnIrbi54KmUucikvaSxvPShlLnkqbi5yK24ueSplLnIpL2k7cmV0dXJuIHIqcitvKm99ZnVuY3Rpb24gR1oodCl7dGhpcy5fPXQsdGhpcy5uZXh0PW51bGwsdGhpcy5wcmV2aW91cz1udWxsfWZ1bmN0aW9uIFdaKHQpe2lmKCEocj10Lmxlbmd0aCkpcmV0dXJuIDA7dmFyIGUsbixpLHIsbyxhLHMsbCxjLHUsaDtpZigoZT10WzBdKS54PTAsZS55PTAsIShyPjEpKXJldHVybiBlLnI7aWYoZS54PS0obj10WzFdKS5yLG4ueD1lLnIsbi55PTAsIShyPjIpKXJldHVybiBlLnIrbi5yO1ZaKG4sZSxpPXRbMl0pLGU9bmV3IEdaKGUpLG49bmV3IEdaKG4pLGk9bmV3IEdaKGkpLGUubmV4dD1pLnByZXZpb3VzPW4sbi5uZXh0PWUucHJldmlvdXM9aSxpLm5leHQ9bi5wcmV2aW91cz1lO3Q6Zm9yKHM9MztzPHI7KytzKXtWWihlLl8sbi5fLGk9dFtzXSksaT1uZXcgR1ooaSksbD1uLm5leHQsYz1lLnByZXZpb3VzLHU9bi5fLnIsaD1lLl8ucjtkb3tpZih1PD1oKXtpZihVWihsLl8saS5fKSl7ZS5uZXh0PW49bCxuLnByZXZpb3VzPWUsLS1zO2NvbnRpbnVlIHR9dSs9bC5fLnIsbD1sLm5leHR9ZWxzZXtpZihVWihjLl8saS5fKSl7KGU9YykubmV4dD1uLG4ucHJldmlvdXM9ZSwtLXM7Y29udGludWUgdH1oKz1jLl8ucixjPWMucHJldmlvdXN9fXdoaWxlKGwhPT1jLm5leHQpO2ZvcihpLnByZXZpb3VzPWUsaS5uZXh0PW4sZS5uZXh0PW4ucHJldmlvdXM9bj1pLG89alooZSk7KGk9aS5uZXh0KSE9PW47KShhPWpaKGkpKTxvJiYoZT1pLG89YSk7bj1lLm5leHR9Zm9yKGU9W24uX10saT1uOyhpPWkubmV4dCkhPT1uOyllLnB1c2goaS5fKTtmb3IoaT1JWihlKSxzPTA7czxyOysrcykoZT10W3NdKS54LT1pLngsZS55LT1pLnk7cmV0dXJuIGkucn1mdW5jdGlvbiBxWih0KXtyZXR1cm4gbnVsbD09dD9udWxsOllaKHQpfWZ1bmN0aW9uIFlaKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdH1mdW5jdGlvbiBYWigpe3JldHVybiAwfWZ1bmN0aW9uICRaKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBLWih0KXtyZXR1cm4gTWF0aC5zcXJ0KHQudmFsdWUpfWZ1bmN0aW9uIFpaKHQpe3JldHVybiBmdW5jdGlvbihlKXtlLmNoaWxkcmVufHwoZS5yPU1hdGgubWF4KDAsK3QoZSl8fDApKX19ZnVuY3Rpb24gSloodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7aWYoaT1uLmNoaWxkcmVuKXt2YXIgaSxyLG8sYT1pLmxlbmd0aCxzPXQobikqZXx8MDtpZihzKWZvcihyPTA7cjxhOysrcilpW3JdLnIrPXM7aWYobz1XWihpKSxzKWZvcihyPTA7cjxhOysrcilpW3JdLnItPXM7bi5yPW8rc319fWZ1bmN0aW9uIFFaKHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj1lLnBhcmVudDtlLnIqPXQsbiYmKGUueD1uLngrdCplLngsZS55PW4ueSt0KmUueSl9fWZ1bmN0aW9uIHRKKHQpe3QueDA9TWF0aC5yb3VuZCh0LngwKSx0LnkwPU1hdGgucm91bmQodC55MCksdC54MT1NYXRoLnJvdW5kKHQueDEpLHQueTE9TWF0aC5yb3VuZCh0LnkxKX1mdW5jdGlvbiBlSih0LGUsbixpLHIpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4scz0tMSxsPWEubGVuZ3RoLGM9dC52YWx1ZSYmKGktZSkvdC52YWx1ZTsrK3M8bDspKG89YVtzXSkueTA9bixvLnkxPXIsby54MD1lLG8ueDE9ZSs9by52YWx1ZSpjfXZhciBuSj17ZGVwdGg6LTF9LGlKPXt9O2Z1bmN0aW9uIHJKKHQpe3JldHVybiB0LmlkfWZ1bmN0aW9uIG9KKHQpe3JldHVybiB0LnBhcmVudElkfWZ1bmN0aW9uIGFKKHQsZSl7cmV0dXJuIHQucGFyZW50PT09ZS5wYXJlbnQ/MToyfWZ1bmN0aW9uIHNKKHQpe3ZhciBlPXQuY2hpbGRyZW47cmV0dXJuIGU/ZVswXTp0LnR9ZnVuY3Rpb24gbEoodCl7dmFyIGU9dC5jaGlsZHJlbjtyZXR1cm4gZT9lW2UubGVuZ3RoLTFdOnQudH1mdW5jdGlvbiBjSih0LGUsbil7dmFyIGk9bi8oZS5pLXQuaSk7ZS5jLT1pLGUucys9bix0LmMrPWksZS56Kz1uLGUubSs9bn1mdW5jdGlvbiB1Sih0LGUsbil7cmV0dXJuIHQuYS5wYXJlbnQ9PT1lLnBhcmVudD90LmE6bn1mdW5jdGlvbiBoSih0LGUpe3RoaXMuXz10LHRoaXMucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbj1udWxsLHRoaXMuQT1udWxsLHRoaXMuYT10aGlzLHRoaXMuej0wLHRoaXMubT0wLHRoaXMuYz0wLHRoaXMucz0wLHRoaXMudD1udWxsLHRoaXMuaT1lfWZ1bmN0aW9uIGRKKHQsZSxuLGkscil7Zm9yKHZhciBvLGE9dC5jaGlsZHJlbixzPS0xLGw9YS5sZW5ndGgsYz10LnZhbHVlJiYoci1uKS90LnZhbHVlOysrczxsOykobz1hW3NdKS54MD1lLG8ueDE9aSxvLnkwPW4sby55MT1uKz1vLnZhbHVlKmN9aEoucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodloucHJvdG90eXBlKTt2YXIgcEo9KDErTWF0aC5zcXJ0KDUpKS8yO2Z1bmN0aW9uIGZKKHQsZSxuLGkscixvKXtmb3IodmFyIGEscyxsLGMsdSxoLGQscCxmLG0sZyxfPVtdLHk9ZS5jaGlsZHJlbix2PTAsYj0wLHg9eS5sZW5ndGgsdz1lLnZhbHVlO3Y8eDspe2w9ci1uLGM9by1pO2Rve3U9eVtiKytdLnZhbHVlfXdoaWxlKCF1JiZiPHgpO2ZvcihoPWQ9dSxnPXUqdSoobT1NYXRoLm1heChjL2wsbC9jKS8odyp0KSksZj1NYXRoLm1heChkL2csZy9oKTtiPHg7KytiKXtpZih1Kz1zPXlbYl0udmFsdWUsczxoJiYoaD1zKSxzPmQmJihkPXMpLGc9dSp1Km0sKHA9TWF0aC5tYXgoZC9nLGcvaCkpPmYpe3UtPXM7YnJlYWt9Zj1wfV8ucHVzaChhPXt2YWx1ZTp1LGRpY2U6bDxjLGNoaWxkcmVuOnkuc2xpY2UodixiKX0pLGEuZGljZT9lSihhLG4saSxyLHc/aSs9Yyp1L3c6byk6ZEooYSxuLGksdz9uKz1sKnUvdzpyLG8pLHctPXUsdj1ifXJldHVybiBffXZhciBtSj0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQsbixpLHIsbyl7ZkooZSx0LG4saSxyLG8pfXJldHVybiBuLnJhdGlvPWZ1bmN0aW9uKGUpe3JldHVybiB0KChlPStlKT4xP2U6MSl9LG59KShwSiksZ0o9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0LG4saSxyLG8pe2lmKChhPXQuX3NxdWFyaWZ5KSYmYS5yYXRpbz09PWUpZm9yKHZhciBhLHMsbCxjLHUsaD0tMSxkPWEubGVuZ3RoLHA9dC52YWx1ZTsrK2g8ZDspe2ZvcihsPShzPWFbaF0pLmNoaWxkcmVuLGM9cy52YWx1ZT0wLHU9bC5sZW5ndGg7Yzx1OysrYylzLnZhbHVlKz1sW2NdLnZhbHVlO3MuZGljZT9lSihzLG4saSxyLGkrPShvLWkpKnMudmFsdWUvcCk6ZEoocyxuLGksbis9KHItbikqcy52YWx1ZS9wLG8pLHAtPXMudmFsdWV9ZWxzZSB0Ll9zcXVhcmlmeT1hPWZKKGUsdCxuLGkscixvKSxhLnJhdGlvPWV9cmV0dXJuIG4ucmF0aW89ZnVuY3Rpb24oZSl7cmV0dXJuIHQoKGU9K2UpPjE/ZToxKX0sbn0pKHBKKTtmdW5jdGlvbiBfSih0LGUsbil7dC5wcm90b3R5cGU9ZS5wcm90b3R5cGU9bixuLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24geUoodCxlKXt2YXIgbj1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIGkgaW4gZSluW2ldPWVbaV07cmV0dXJuIG59ZnVuY3Rpb24gdkooKXt9dmFyIGJKPS43LHhKPTEvYkosd0o9IlxccyooWystXT9cXGQrKVxccyoiLFNKPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLE1KPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixFSj0vXiMoWzAtOWEtZl17Myw4fSkkLyxUSj1uZXcgUmVnRXhwKCJecmdiXFwoIitbd0osd0osd0pdKyJcXCkkIiksQ0o9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW01KLE1KLE1KXSsiXFwpJCIpLEFKPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbd0osd0osd0osU0pdKyJcXCkkIiksa0o9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tNSixNSixNSixTSl0rIlxcKSQiKSxMSj1uZXcgUmVnRXhwKCJeaHNsXFwoIitbU0osTUosTUpdKyJcXCkkIiksUEo9bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1tTSixNSixNSixTSl0rIlxcKSQiKSxOSj17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtmdW5jdGlvbiBJSigpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpfWZ1bmN0aW9uIFJKKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCl9ZnVuY3Rpb24gT0oodCl7dmFyIGUsbjtyZXR1cm4gdD0odCsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKGU9RUouZXhlYyh0KSk/KG49ZVsxXS5sZW5ndGgsZT1wYXJzZUludChlWzFdLDE2KSw2PT09bj96SihlKTozPT09bj9uZXcgRkooZT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgxNSZlKTw8NHwxNSZlLDEpOjg9PT1uP0RKKGU+PjI0JjI1NSxlPj4xNiYyNTUsZT4+OCYyNTUsKDI1NSZlKS8yNTUpOjQ9PT1uP0RKKGU+PjEyJjE1fGU+PjgmMjQwLGU+PjgmMTV8ZT4+NCYyNDAsZT4+NCYxNXwyNDAmZSwoKDE1JmUpPDw0fDE1JmUpLzI1NSk6bnVsbCk6KGU9VEouZXhlYyh0KSk/bmV3IEZKKGVbMV0sZVsyXSxlWzNdLDEpOihlPUNKLmV4ZWModCkpP25ldyBGSigyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCwxKTooZT1BSi5leGVjKHQpKT9ESihlWzFdLGVbMl0sZVszXSxlWzRdKTooZT1rSi5leGVjKHQpKT9ESigyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCxlWzRdKTooZT1MSi5leGVjKHQpKT9HSihlWzFdLGVbMl0vMTAwLGVbM10vMTAwLDEpOihlPVBKLmV4ZWModCkpP0dKKGVbMV0sZVsyXS8xMDAsZVszXS8xMDAsZVs0XSk6TkouaGFzT3duUHJvcGVydHkodCk/ekooTkpbdF0pOiJ0cmFuc3BhcmVudCI9PT10P25ldyBGSihOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIHpKKHQpe3JldHVybiBuZXcgRkoodD4+MTYmMjU1LHQ+PjgmMjU1LDI1NSZ0LDEpfWZ1bmN0aW9uIERKKHQsZSxuLGkpe3JldHVybiBpPD0wJiYodD1lPW49TmFOKSxuZXcgRkoodCxlLG4saSl9ZnVuY3Rpb24gQkoodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiB2Snx8KHQ9T0oodCkpLHQ/bmV3IEZKKCh0PXQucmdiKCkpLnIsdC5nLHQuYix0Lm9wYWNpdHkpOm5ldyBGSn1mdW5jdGlvbiBISih0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/QkoodCk6bmV3IEZKKHQsZSxuLG51bGw9PWk/MTppKX1mdW5jdGlvbiBGSih0LGUsbixpKXt0aGlzLnI9K3QsdGhpcy5nPStlLHRoaXMuYj0rbix0aGlzLm9wYWNpdHk9K2l9ZnVuY3Rpb24gVkooKXtyZXR1cm4iIyIrakoodGhpcy5yKStqSih0aGlzLmcpK2pKKHRoaXMuYil9ZnVuY3Rpb24gVUooKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX1mdW5jdGlvbiBqSih0KXtyZXR1cm4oKHQ9TWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0KXx8MCkpKTwxNj8iMCI6IiIpK3QudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIEdKKHQsZSxuLGkpe3JldHVybiBpPD0wP3Q9ZT1uPU5hTjpuPD0wfHxuPj0xP3Q9ZT1OYU46ZTw9MCYmKHQ9TmFOKSxuZXcgWUoodCxlLG4saSl9ZnVuY3Rpb24gV0oodCl7aWYodCBpbnN0YW5jZW9mIFlKKXJldHVybiBuZXcgWUoodC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2Ygdkp8fCh0PU9KKHQpKSwhdClyZXR1cm4gbmV3IFlKO2lmKHQgaW5zdGFuY2VvZiBZSilyZXR1cm4gdDt2YXIgZT0odD10LnJnYigpKS5yLzI1NSxuPXQuZy8yNTUsaT10LmIvMjU1LHI9TWF0aC5taW4oZSxuLGkpLG89TWF0aC5tYXgoZSxuLGkpLGE9TmFOLHM9by1yLGw9KG8rcikvMjtyZXR1cm4gcz8oYT1lPT09bz8obi1pKS9zKzYqKG48aSk6bj09PW8/KGktZSkvcysyOihlLW4pL3MrNCxzLz1sPC41P28rcjoyLW8tcixhKj02MCk6cz1sPjAmJmw8MT8wOmEsbmV3IFlKKGEscyxsLHQub3BhY2l0eSl9ZnVuY3Rpb24gcUoodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP1dKKHQpOm5ldyBZSih0LGUsbixudWxsPT1pPzE6aSl9ZnVuY3Rpb24gWUoodCxlLG4saSl7dGhpcy5oPSt0LHRoaXMucz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIFhKKHQsZSxuKXtyZXR1cm4gMjU1Kih0PDYwP2UrKG4tZSkqdC82MDp0PDE4MD9uOnQ8MjQwP2UrKG4tZSkqKDI0MC10KS82MDplKX1fSih2SixPSix7Y29weTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3Rvcix0aGlzLHQpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCl9LGhleDpJSixmb3JtYXRIZXg6SUosZm9ybWF0SHNsOmZ1bmN0aW9uICRKKCl7cmV0dXJuIFdKKHRoaXMpLmZvcm1hdEhzbCgpfSxmb3JtYXRSZ2I6UkosdG9TdHJpbmc6Ukp9KSxfSihGSixISix5Sih2Six7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD94SjpNYXRoLnBvdyh4Six0KSxuZXcgRkoodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/Yko6TWF0aC5wb3coYkosdCksbmV3IEZKKHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybi0uNTw9dGhpcy5yJiZ0aGlzLnI8MjU1LjUmJi0uNTw9dGhpcy5nJiZ0aGlzLmc8MjU1LjUmJi0uNTw9dGhpcy5iJiZ0aGlzLmI8MjU1LjUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxoZXg6VkosZm9ybWF0SGV4OlZKLGZvcm1hdFJnYjpVSix0b1N0cmluZzpVSn0pKSxfSihZSixxSix5Sih2Six7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD94SjpNYXRoLnBvdyh4Six0KSxuZXcgWUoodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9iSjpNYXRoLnBvdyhiSix0KSxuZXcgWUoodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmglMzYwKzM2MCoodGhpcy5oPDApLGU9aXNOYU4odCl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsbj10aGlzLmwsaT1uKyhuPC41P246MS1uKSplLHI9MipuLWk7cmV0dXJuIG5ldyBGSihYSih0Pj0yNDA/dC0yNDA6dCsxMjAscixpKSxYSih0LHIsaSksWEoodDwxMjA/dCsyNDA6dC0xMjAscixpKSx0aGlzLm9wYWNpdHkpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybigwPD10aGlzLnMmJnRoaXMuczw9MXx8aXNOYU4odGhpcy5zKSkmJjA8PXRoaXMubCYmdGhpcy5sPD0xJiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sZm9ybWF0SHNsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcGFjaXR5O3JldHVybigxPT09KHQ9aXNOYU4odCk/MTpNYXRoLm1heCgwLE1hdGgubWluKDEsdCkpKT8iaHNsKCI6ImhzbGEoIikrKHRoaXMuaHx8MCkrIiwgIisxMDAqKHRoaXMuc3x8MCkrIiUsICIrMTAwKih0aGlzLmx8fDApKyIlIisoMT09PXQ/IikiOiIsICIrdCsiKSIpfX0pKTt2YXIgS0o9TWF0aC5QSS8xODAsWko9MTgwL01hdGguUEksSko9Ljk2NDIyLFFKPS44MjUyMSx0UT00LzI5LGVRPTYvMjksblE9MyplUSplUTtmdW5jdGlvbiBpUSh0KXtpZih0IGluc3RhbmNlb2Ygb1EpcmV0dXJuIG5ldyBvUSh0LmwsdC5hLHQuYix0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiBkUSlyZXR1cm4gcFEodCk7dCBpbnN0YW5jZW9mIEZKfHwodD1CSih0KSk7dmFyIGUsbixpPWNRKHQucikscj1jUSh0LmcpLG89Y1EodC5iKSxhPWFRKCguMjIyNTA0NSppKy43MTY4Nzg2KnIrLjA2MDYxNjkqbykvMSk7cmV0dXJuIGk9PT1yJiZyPT09bz9lPW49YTooZT1hUSgoLjQzNjA3NDcqaSsuMzg1MDY0OSpyKy4xNDMwODA0Km8pL0pKKSxuPWFRKCguMDEzOTMyMippKy4wOTcxMDQ1KnIrLjcxNDE3MzMqbykvUUopKSxuZXcgb1EoMTE2KmEtMTYsNTAwKihlLWEpLDIwMCooYS1uKSx0Lm9wYWNpdHkpfWZ1bmN0aW9uIHJRKHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9pUSh0KTpuZXcgb1EodCxlLG4sbnVsbD09aT8xOmkpfWZ1bmN0aW9uIG9RKHQsZSxuLGkpe3RoaXMubD0rdCx0aGlzLmE9K2UsdGhpcy5iPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiBhUSh0KXtyZXR1cm4gdD4uMDA4ODU2NDUxNjc5MDM1NjMxP01hdGgucG93KHQsMS8zKTp0L25RK3RRfWZ1bmN0aW9uIHNRKHQpe3JldHVybiB0PmVRP3QqdCp0Om5RKih0LXRRKX1mdW5jdGlvbiBsUSh0KXtyZXR1cm4gMjU1Kih0PD0uMDAzMTMwOD8xMi45Mip0OjEuMDU1Kk1hdGgucG93KHQsMS8yLjQpLS4wNTUpfWZ1bmN0aW9uIGNRKHQpe3JldHVybih0Lz0yNTUpPD0uMDQwNDU/dC8xMi45MjpNYXRoLnBvdygodCsuMDU1KS8xLjA1NSwyLjQpfWZ1bmN0aW9uIHVRKHQpe2lmKHQgaW5zdGFuY2VvZiBkUSlyZXR1cm4gbmV3IGRRKHQuaCx0LmMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIG9RfHwodD1pUSh0KSksMD09PXQuYSYmMD09PXQuYilyZXR1cm4gbmV3IGRRKE5hTiwwPHQubCYmdC5sPDEwMD8wOk5hTix0LmwsdC5vcGFjaXR5KTt2YXIgZT1NYXRoLmF0YW4yKHQuYix0LmEpKlpKO3JldHVybiBuZXcgZFEoZTwwP2UrMzYwOmUsTWF0aC5zcXJ0KHQuYSp0LmErdC5iKnQuYiksdC5sLHQub3BhY2l0eSl9ZnVuY3Rpb24gaFEodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3VRKHQpOm5ldyBkUSh0LGUsbixudWxsPT1pPzE6aSl9ZnVuY3Rpb24gZFEodCxlLG4saSl7dGhpcy5oPSt0LHRoaXMuYz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIHBRKHQpe2lmKGlzTmFOKHQuaCkpcmV0dXJuIG5ldyBvUSh0LmwsMCwwLHQub3BhY2l0eSk7dmFyIGU9dC5oKktKO3JldHVybiBuZXcgb1EodC5sLE1hdGguY29zKGUpKnQuYyxNYXRoLnNpbihlKSp0LmMsdC5vcGFjaXR5KX1fSihvUSxyUSx5Sih2Six7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBvUSh0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG9RKHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9KHRoaXMubCsxNikvMTE2LGU9aXNOYU4odGhpcy5hKT90OnQrdGhpcy5hLzUwMCxuPWlzTmFOKHRoaXMuYik/dDp0LXRoaXMuYi8yMDA7cmV0dXJuIG5ldyBGSihsUSgzLjEzMzg1NjEqKGU9Skoqc1EoZSkpLTEuNjE2ODY2NyoodD0xKnNRKHQpKS0uNDkwNjE0Nioobj1RSipzUShuKSkpLGxRKC0uOTc4NzY4NCplKzEuOTE2MTQxNSp0Ky4wMzM0NTQqbiksbFEoLjA3MTk0NTMqZS0uMjI4OTkxNCp0KzEuNDA1MjQyNypuKSx0aGlzLm9wYWNpdHkpfX0pKSxfSihkUSxoUSx5Sih2Six7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBkUSh0aGlzLmgsdGhpcy5jLHRoaXMubCsxOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGRRKHRoaXMuaCx0aGlzLmMsdGhpcy5sLTE4KihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIHBRKHRoaXMpLnJnYigpfX0pKTt2YXIgZlE9LS4yOTIyNyxtUT0tLjkwNjQ5LGdRPTEuOTcyOTQ7ZnVuY3Rpb24gX1EodCl7aWYodCBpbnN0YW5jZW9mIHZRKXJldHVybiBuZXcgdlEodC5oLHQucyx0LmwsdC5vcGFjaXR5KTt0IGluc3RhbmNlb2YgRkp8fCh0PUJKKHQpKTt2YXIgZT10LmcvMjU1LG49dC5iLzI1NSxpPSgtLjY1NTc2MzY2Njc5OTk5OTkqbit0LnIvMjU1Ki0xLjc4ODQ1MDM4MDYtMy41MTcyOTgyNDM4KmUpLy01Ljk2MTUxMjI5MTIscj1uLWksbz0oZ1EqKGUtaSktZlEqcikvbVEsYT1NYXRoLnNxcnQobypvK3IqcikvKGdRKmkqKDEtaSkpLHM9YT9NYXRoLmF0YW4yKG8scikqWkotMTIwOk5hTjtyZXR1cm4gbmV3IHZRKHM8MD9zKzM2MDpzLGEsaSx0Lm9wYWNpdHkpfWZ1bmN0aW9uIHlRKHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9fUSh0KTpuZXcgdlEodCxlLG4sbnVsbD09aT8xOmkpfWZ1bmN0aW9uIHZRKHQsZSxuLGkpe3RoaXMuaD0rdCx0aGlzLnM9K2UsdGhpcy5sPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiBiUSh0LGUsbixpLHIpe3ZhciBvPXQqdCxhPW8qdDtyZXR1cm4oKDEtMyp0KzMqby1hKSplKyg0LTYqbyszKmEpKm4rKDErMyp0KzMqby0zKmEpKmkrYSpyKS82fWZ1bmN0aW9uIHhRKHQpe3ZhciBlPXQubGVuZ3RoLTE7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBpPW48PTA/bj0wOm4+PTE/KG49MSxlLTEpOk1hdGguZmxvb3IobiplKSxyPXRbaV0sbz10W2krMV07cmV0dXJuIGJRKChuLWkvZSkqZSxpPjA/dFtpLTFdOjIqci1vLHIsbyxpPGUtMT90W2krMl06MipvLXIpfX1mdW5jdGlvbiB3USh0KXt2YXIgZT10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGk9TWF0aC5mbG9vcigoKG4lPTEpPDA/KytuOm4pKmUpO3JldHVybiBiUSgobi1pL2UpKmUsdFsoaStlLTEpJWVdLHRbaSVlXSx0WyhpKzEpJWVdLHRbKGkrMiklZV0pfX1mdW5jdGlvbiBTUSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gTVEodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQrbiplfX1mdW5jdGlvbiBFUSh0LGUpe3ZhciBuPWUtdDtyZXR1cm4gbj9NUSh0LG4+MTgwfHxuPC0xODA/bi0zNjAqTWF0aC5yb3VuZChuLzM2MCk6bik6U1EoaXNOYU4odCk/ZTp0KX1mdW5jdGlvbiBUUSh0LGUpe3ZhciBuPWUtdDtyZXR1cm4gbj9NUSh0LG4pOlNRKGlzTmFOKHQpP2U6dCl9X0oodlEseVEseUoodkose2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/eEo6TWF0aC5wb3coeEosdCksbmV3IHZRKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/Yko6TWF0aC5wb3coYkosdCksbmV3IHZRKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9aXNOYU4odGhpcy5oKT8wOih0aGlzLmgrMTIwKSpLSixlPSt0aGlzLmwsbj1pc05hTih0aGlzLnMpPzA6dGhpcy5zKmUqKDEtZSksaT1NYXRoLmNvcyh0KSxyPU1hdGguc2luKHQpO3JldHVybiBuZXcgRkooMjU1KihlK24qKC0uMTQ4NjEqaSsxLjc4Mjc3KnIpKSwyNTUqKGUrbiooZlEqaSttUSpyKSksMjU1KihlK24qKGdRKmkpKSx0aGlzLm9wYWNpdHkpfX0pKTt2YXIgQ1E9KGZ1bmN0aW9uIHQoZSl7dmFyIG49KGZ1bmN0aW9uIGkodCl7cmV0dXJuIDE9PSh0PSt0KT9UUTpmdW5jdGlvbihlLG4pe3JldHVybiBuLWU/KGZ1bmN0aW9uIGkodCxlLG4pe3JldHVybiB0PU1hdGgucG93KHQsbiksZT1NYXRoLnBvdyhlLG4pLXQsbj0xL24sZnVuY3Rpb24oaSl7cmV0dXJuIE1hdGgucG93KHQraSplLG4pfX0pKGUsbix0KTpTUShpc05hTihlKT9uOmUpfX0pKGUpO2Z1bmN0aW9uIHIodCxlKXt2YXIgaT1uKCh0PUhKKHQpKS5yLChlPUhKKGUpKS5yKSxyPW4odC5nLGUuZyksbz1uKHQuYixlLmIpLGE9VFEodC5vcGFjaXR5LGUub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0LnI9aShlKSx0Lmc9cihlKSx0LmI9byhlKSx0Lm9wYWNpdHk9YShlKSx0KyIifX1yZXR1cm4gci5nYW1tYT10LHJ9KSgxKTtmdW5jdGlvbiBBUSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG4saSxyPWUubGVuZ3RoLG89bmV3IEFycmF5KHIpLGE9bmV3IEFycmF5KHIpLHM9bmV3IEFycmF5KHIpO2ZvcihuPTA7bjxyOysrbilpPUhKKGVbbl0pLG9bbl09aS5yfHwwLGFbbl09aS5nfHwwLHNbbl09aS5ifHwwO3JldHVybiBvPXQobyksYT10KGEpLHM9dChzKSxpLm9wYWNpdHk9MSxmdW5jdGlvbih0KXtyZXR1cm4gaS5yPW8odCksaS5nPWEodCksaS5iPXModCksaSsiIn19fXZhciBrUT1BUSh4USksTFE9QVEod1EpO2Z1bmN0aW9uIFBRKHQsZSl7dmFyIG4saT1lP2UubGVuZ3RoOjAscj10P01hdGgubWluKGksdC5sZW5ndGgpOjAsbz1uZXcgQXJyYXkociksYT1uZXcgQXJyYXkoaSk7Zm9yKG49MDtuPHI7KytuKW9bbl09QlEodFtuXSxlW25dKTtmb3IoO248aTsrK24pYVtuXT1lW25dO3JldHVybiBmdW5jdGlvbih0KXtmb3Iobj0wO248cjsrK24pYVtuXT1vW25dKHQpO3JldHVybiBhfX1mdW5jdGlvbiBOUSh0LGUpe3ZhciBuPW5ldyBEYXRlO3JldHVybiBlLT10PSt0LGZ1bmN0aW9uKGkpe3JldHVybiBuLnNldFRpbWUodCtlKmkpLG59fWZ1bmN0aW9uIElRKHQsZSl7cmV0dXJuIGUtPXQ9K3QsZnVuY3Rpb24obil7cmV0dXJuIHQrZSpufX1mdW5jdGlvbiBSUSh0LGUpe3ZhciBuLGk9e30scj17fTtmb3IobiBpbiBudWxsIT09dCYmIm9iamVjdCI9PXR5cGVvZiB0fHwodD17fSksbnVsbCE9PWUmJiJvYmplY3QiPT10eXBlb2YgZXx8KGU9e30pLGUpbiBpbiB0P2lbbl09QlEodFtuXSxlW25dKTpyW25dPWVbbl07cmV0dXJuIGZ1bmN0aW9uKHQpe2ZvcihuIGluIGkpcltuXT1pW25dKHQpO3JldHVybiByfX12YXIgT1E9L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLHpRPW5ldyBSZWdFeHAoT1Euc291cmNlLCJnIik7ZnVuY3Rpb24gRFEodCxlKXt2YXIgbixpLHIsbz1PUS5sYXN0SW5kZXg9elEubGFzdEluZGV4PTAsYT0tMSxzPVtdLGw9W107Zm9yKHQrPSIiLGUrPSIiOyhuPU9RLmV4ZWModCkpJiYoaT16US5leGVjKGUpKTspKHI9aS5pbmRleCk+byYmKHI9ZS5zbGljZShvLHIpLHNbYV0/c1thXSs9cjpzWysrYV09ciksKG49blswXSk9PT0oaT1pWzBdKT9zW2FdP3NbYV0rPWk6c1srK2FdPWk6KHNbKythXT1udWxsLGwucHVzaCh7aTphLHg6SVEobixpKX0pKSxvPXpRLmxhc3RJbmRleDtyZXR1cm4gbzxlLmxlbmd0aCYmKHI9ZS5zbGljZShvKSxzW2FdP3NbYV0rPXI6c1srK2FdPXIpLHMubGVuZ3RoPDI/bFswXT8oZnVuY3Rpb24gYyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSkrIiJ9fSkobFswXS54KTooZnVuY3Rpb24gdSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KShlKTooZT1sLmxlbmd0aCxmdW5jdGlvbih0KXtmb3IodmFyIG4saT0wO2k8ZTsrK2kpc1sobj1sW2ldKS5pXT1uLngodCk7cmV0dXJuIHMuam9pbigiIil9KX1mdW5jdGlvbiBCUSh0LGUpe3ZhciBuLGk9dHlwZW9mIGU7cmV0dXJuIG51bGw9PWV8fCJib29sZWFuIj09PWk/U1EoZSk6KCJudW1iZXIiPT09aT9JUToic3RyaW5nIj09PWk/KG49T0ooZSkpPyhlPW4sQ1EpOkRROmUgaW5zdGFuY2VvZiBPSj9DUTplIGluc3RhbmNlb2YgRGF0ZT9OUTpBcnJheS5pc0FycmF5KGUpP1BROiJmdW5jdGlvbiIhPXR5cGVvZiBlLnZhbHVlT2YmJiJmdW5jdGlvbiIhPXR5cGVvZiBlLnRvU3RyaW5nfHxpc05hTihlKT9SUTpJUSkodCxlKX12YXIgSFEsRlEsVlEsVVEsalE9MTgwL01hdGguUEksR1E9e3RyYW5zbGF0ZVg6MCx0cmFuc2xhdGVZOjAscm90YXRlOjAsc2tld1g6MCxzY2FsZVg6MSxzY2FsZVk6MX07ZnVuY3Rpb24gV1EodCxlLG4saSxyLG8pe3ZhciBhLHMsbDtyZXR1cm4oYT1NYXRoLnNxcnQodCp0K2UqZSkpJiYodC89YSxlLz1hKSwobD10Km4rZSppKSYmKG4tPXQqbCxpLT1lKmwpLChzPU1hdGguc3FydChuKm4raSppKSkmJihuLz1zLGkvPXMsbC89cyksdCppPGUqbiYmKHQ9LXQsZT0tZSxsPS1sLGE9LWEpLHt0cmFuc2xhdGVYOnIsdHJhbnNsYXRlWTpvLHJvdGF0ZTpNYXRoLmF0YW4yKGUsdCkqalEsc2tld1g6TWF0aC5hdGFuKGwpKmpRLHNjYWxlWDphLHNjYWxlWTpzfX1mdW5jdGlvbiBxUSh0LGUsbixpKXtmdW5jdGlvbiByKHQpe3JldHVybiB0Lmxlbmd0aD90LnBvcCgpKyIgIjoiIn1yZXR1cm4gZnVuY3Rpb24obyxhKXt2YXIgcz1bXSxsPVtdO3JldHVybiBvPXQobyksYT10KGEpLChmdW5jdGlvbiBjKHQsaSxyLG8sYSxzKXtpZih0IT09cnx8aSE9PW8pe3ZhciBsPWEucHVzaCgidHJhbnNsYXRlKCIsbnVsbCxlLG51bGwsbik7cy5wdXNoKHtpOmwtNCx4OklRKHQscil9LHtpOmwtMix4OklRKGksbyl9KX1lbHNlKHJ8fG8pJiZhLnB1c2goInRyYW5zbGF0ZSgiK3IrZStvK24pfSkoby50cmFuc2xhdGVYLG8udHJhbnNsYXRlWSxhLnRyYW5zbGF0ZVgsYS50cmFuc2xhdGVZLHMsbCksKGZ1bmN0aW9uIHUodCxlLG4sbyl7dCE9PWU/KHQtZT4xODA/ZSs9MzYwOmUtdD4xODAmJih0Kz0zNjApLG8ucHVzaCh7aTpuLnB1c2gocihuKSsicm90YXRlKCIsbnVsbCxpKS0yLHg6SVEodCxlKX0pKTplJiZuLnB1c2gocihuKSsicm90YXRlKCIrZStpKX0pKG8ucm90YXRlLGEucm90YXRlLHMsbCksKGZ1bmN0aW9uIGgodCxlLG4sbyl7dCE9PWU/by5wdXNoKHtpOm4ucHVzaChyKG4pKyJza2V3WCgiLG51bGwsaSktMix4OklRKHQsZSl9KTplJiZuLnB1c2gocihuKSsic2tld1goIitlK2kpfSkoby5za2V3WCxhLnNrZXdYLHMsbCksKGZ1bmN0aW9uIGQodCxlLG4saSxvLGEpe2lmKHQhPT1ufHxlIT09aSl7dmFyIHM9by5wdXNoKHIobykrInNjYWxlKCIsbnVsbCwiLCIsbnVsbCwiKSIpO2EucHVzaCh7aTpzLTQseDpJUSh0LG4pfSx7aTpzLTIseDpJUShlLGkpfSl9ZWxzZSAxPT09biYmMT09PWl8fG8ucHVzaChyKG8pKyJzY2FsZSgiK24rIiwiK2krIikiKX0pKG8uc2NhbGVYLG8uc2NhbGVZLGEuc2NhbGVYLGEuc2NhbGVZLHMsbCksbz1hPW51bGwsZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49LTEsaT1sLmxlbmd0aDsrK248aTspc1soZT1sW25dKS5pXT1lLngodCk7cmV0dXJuIHMuam9pbigiIil9fX12YXIgWVE9cVEoKGZ1bmN0aW9uIFhRKHQpe3JldHVybiJub25lIj09PXQ/R1E6KEhRfHwoSFE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksRlE9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFZRPWRvY3VtZW50LmRlZmF1bHRWaWV3KSxIUS5zdHlsZS50cmFuc2Zvcm09dCx0PVZRLmdldENvbXB1dGVkU3R5bGUoRlEuYXBwZW5kQ2hpbGQoSFEpLG51bGwpLmdldFByb3BlcnR5VmFsdWUoInRyYW5zZm9ybSIpLEZRLnJlbW92ZUNoaWxkKEhRKSxXUSgrKHQ9dC5zbGljZSg3LC0xKS5zcGxpdCgiLCIpKVswXSwrdFsxXSwrdFsyXSwrdFszXSwrdFs0XSwrdFs1XSkpfSksInB4LCAiLCJweCkiLCJkZWcpIiksJFE9cVEoKGZ1bmN0aW9uIEtRKHQpe3JldHVybiBudWxsPT10P0dROihVUXx8KFVRPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJnIikpLFVRLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIix0KSwodD1VUS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKT9XUSgodD10Lm1hdHJpeCkuYSx0LmIsdC5jLHQuZCx0LmUsdC5mKTpHUSl9KSwiLCAiLCIpIiwiKSIpLFpRPU1hdGguU1FSVDI7ZnVuY3Rpb24gSlEodCl7cmV0dXJuKCh0PU1hdGguZXhwKHQpKSsxL3QpLzJ9ZnVuY3Rpb24gUVEodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIGk9dCgoZT1xSihlKSkuaCwobj1xSihuKSkuaCkscj1UUShlLnMsbi5zKSxvPVRRKGUubCxuLmwpLGE9VFEoZS5vcGFjaXR5LG4ub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmg9aSh0KSxlLnM9cih0KSxlLmw9byh0KSxlLm9wYWNpdHk9YSh0KSxlKyIifX19dmFyIHQxPVFRKEVRKSxlMT1RUShUUSk7ZnVuY3Rpb24gbjEodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIGk9dCgoZT1oUShlKSkuaCwobj1oUShuKSkuaCkscj1UUShlLmMsbi5jKSxvPVRRKGUubCxuLmwpLGE9VFEoZS5vcGFjaXR5LG4ub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmg9aSh0KSxlLmM9cih0KSxlLmw9byh0KSxlLm9wYWNpdHk9YSh0KSxlKyIifX19dmFyIGkxPW4xKEVRKSxyMT1uMShUUSk7ZnVuY3Rpb24gbzEodCl7cmV0dXJuKGZ1bmN0aW9uIGUobil7ZnVuY3Rpb24gaShlLGkpe3ZhciByPXQoKGU9eVEoZSkpLmgsKGk9eVEoaSkpLmgpLG89VFEoZS5zLGkucyksYT1UUShlLmwsaS5sKSxzPVRRKGUub3BhY2l0eSxpLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5oPXIodCksZS5zPW8odCksZS5sPWEoTWF0aC5wb3codCxuKSksZS5vcGFjaXR5PXModCksZSsiIn19cmV0dXJuIG49K24saS5nYW1tYT1lLGl9KSgxKX12YXIgYTE9bzEoRVEpLHMxPW8xKFRRKSxsMT1NYXRoLlBJLGMxPTIqbDEsdTE9MWUtNixoMT1jMS11MTtmdW5jdGlvbiBkMSgpe3RoaXMuX3gwPXRoaXMuX3kwPXRoaXMuX3gxPXRoaXMuX3kxPW51bGwsdGhpcy5fPSIifWZ1bmN0aW9uIHAxKCl7cmV0dXJuIG5ldyBkMX1mdW5jdGlvbiBmMSh0LGUsbil7cmV0dXJuKGVbMF0tdFswXSkqKG5bMV0tdFsxXSktKGVbMV0tdFsxXSkqKG5bMF0tdFswXSl9ZnVuY3Rpb24gbTEodCxlKXtyZXR1cm4gdFswXS1lWzBdfHx0WzFdLWVbMV19ZnVuY3Rpb24gZzEodCl7Zm9yKHZhciBlPXQubGVuZ3RoLG49WzAsMV0saT0yLHI9MjtyPGU7KytyKXtmb3IoO2k+MSYmZjEodFtuW2ktMl1dLHRbbltpLTFdXSx0W3JdKTw9MDspLS1pO25baSsrXT1yfXJldHVybiBuLnNsaWNlKDAsaSl9ZnVuY3Rpb24gXzEodCxlLG4saSl7aWYoaXNOYU4oZSl8fGlzTmFOKG4pKXJldHVybiB0O3ZhciByLG8sYSxzLGwsYyx1LGgsZCxwPXQuX3Jvb3QsZj17ZGF0YTppfSxtPXQuX3gwLGc9dC5feTAsXz10Ll94MSx5PXQuX3kxO2lmKCFwKXJldHVybiB0Ll9yb290PWYsdDtmb3IoO3AubGVuZ3RoOylpZigoYz1lPj0obz0obStfKS8yKSk/bT1vOl89bywodT1uPj0oYT0oZyt5KS8yKSk/Zz1hOnk9YSxyPXAsIShwPXBbaD11PDwxfGNdKSlyZXR1cm4gcltoXT1mLHQ7aWYocz0rdC5feC5jYWxsKG51bGwscC5kYXRhKSxsPSt0Ll95LmNhbGwobnVsbCxwLmRhdGEpLGU9PT1zJiZuPT09bClyZXR1cm4gZi5uZXh0PXAscj9yW2hdPWY6dC5fcm9vdD1mLHQ7ZG97cj1yP3JbaF09bmV3IEFycmF5KDQpOnQuX3Jvb3Q9bmV3IEFycmF5KDQpLChjPWU+PShvPShtK18pLzIpKT9tPW86Xz1vLCh1PW4+PShhPShnK3kpLzIpKT9nPWE6eT1hfXdoaWxlKChoPXU8PDF8Yyk9PShkPShsPj1hKTw8MXxzPj1vKSk7cmV0dXJuIHJbZF09cCxyW2hdPWYsdH1mdW5jdGlvbiB5MSh0LGUsbixpLHIpe3RoaXMubm9kZT10LHRoaXMueDA9ZSx0aGlzLnkwPW4sdGhpcy54MT1pLHRoaXMueTE9cn1mdW5jdGlvbiB2MSh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBiMSh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiB4MSh0LGUsbil7dmFyIGk9bmV3IHcxKG51bGw9PWU/djE6ZSxudWxsPT1uP2IxOm4sTmFOLE5hTixOYU4sTmFOKTtyZXR1cm4gbnVsbD09dD9pOmkuYWRkQWxsKHQpfWZ1bmN0aW9uIHcxKHQsZSxuLGkscixvKXt0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3gwPW4sdGhpcy5feTA9aSx0aGlzLl94MT1yLHRoaXMuX3kxPW8sdGhpcy5fcm9vdD12b2lkIDB9ZnVuY3Rpb24gUzEodCl7Zm9yKHZhciBlPXtkYXRhOnQuZGF0YX0sbj1lO3Q9dC5uZXh0OyluPW4ubmV4dD17ZGF0YTp0LmRhdGF9O3JldHVybiBlfWQxLnByb3RvdHlwZT1wMS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmQxLG1vdmVUbzpmdW5jdGlvbih0LGUpe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rZSl9LGNsb3NlUGF0aDpmdW5jdGlvbigpe251bGwhPT10aGlzLl94MSYmKHRoaXMuX3gxPXRoaXMuX3gwLHRoaXMuX3kxPXRoaXMuX3kwLHRoaXMuXys9IloiKX0sbGluZVRvOmZ1bmN0aW9uKHQsZSl7dGhpcy5fKz0iTCIrKHRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kxPStlKX0scXVhZHJhdGljQ3VydmVUbzpmdW5jdGlvbih0LGUsbixpKXt0aGlzLl8rPSJRIisgK3QrIiwiKyArZSsiLCIrKHRoaXMuX3gxPStuKSsiLCIrKHRoaXMuX3kxPStpKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LGUsbixpLHIsbyl7dGhpcy5fKz0iQyIrICt0KyIsIisgK2UrIiwiKyArbisiLCIrICtpKyIsIisodGhpcy5feDE9K3IpKyIsIisodGhpcy5feTE9K28pfSxhcmNUbzpmdW5jdGlvbih0LGUsbixpLHIpe3ZhciBvPXRoaXMuX3gxLGE9dGhpcy5feTEscz0obj0rbiktKHQ9K3QpLGw9KGk9K2kpLShlPStlKSxjPW8tdCx1PWEtZSxoPWMqYyt1KnU7aWYoKHI9K3IpPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIrcik7aWYobnVsbD09PXRoaXMuX3gxKXRoaXMuXys9Ik0iKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPWUpO2Vsc2UgaWYoaD51MSlpZihNYXRoLmFicyh1KnMtbCpjKT51MSYmcil7dmFyIGQ9bi1vLHA9aS1hLGY9cypzK2wqbCxtPWQqZCtwKnAsZz1NYXRoLnNxcnQoZiksXz1NYXRoLnNxcnQoaCkseT1yKk1hdGgudGFuKChsMS1NYXRoLmFjb3MoKGYraC1tKS8oMipnKl8pKSkvMiksdj15L18sYj15L2c7TWF0aC5hYnModi0xKT51MSYmKHRoaXMuXys9IkwiKyh0K3YqYykrIiwiKyhlK3YqdSkpLHRoaXMuXys9IkEiK3IrIiwiK3IrIiwwLDAsIisgKyh1KmQ+YypwKSsiLCIrKHRoaXMuX3gxPXQrYipzKSsiLCIrKHRoaXMuX3kxPWUrYipsKX1lbHNlIHRoaXMuXys9IkwiKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPWUpfSxhcmM6ZnVuY3Rpb24odCxlLG4saSxyLG8pe3Q9K3QsZT0rZTt2YXIgYT0obj0rbikqTWF0aC5jb3MoaSkscz1uKk1hdGguc2luKGkpLGw9dCthLGM9ZStzLHU9MV5vLGg9bz9pLXI6ci1pO2lmKG48MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIituKTtudWxsPT09dGhpcy5feDE/dGhpcy5fKz0iTSIrbCsiLCIrYzooTWF0aC5hYnModGhpcy5feDEtbCk+dTF8fE1hdGguYWJzKHRoaXMuX3kxLWMpPnUxKSYmKHRoaXMuXys9IkwiK2wrIiwiK2MpLG4mJihoPDAmJihoPWglYzErYzEpLGg+aDE/dGhpcy5fKz0iQSIrbisiLCIrbisiLDAsMSwiK3UrIiwiKyh0LWEpKyIsIisoZS1zKSsiQSIrbisiLCIrbisiLDAsMSwiK3UrIiwiKyh0aGlzLl94MT1sKSsiLCIrKHRoaXMuX3kxPWMpOmg+dTEmJih0aGlzLl8rPSJBIituKyIsIituKyIsMCwiKyArKGg+PWwxKSsiLCIrdSsiLCIrKHRoaXMuX3gxPXQrbipNYXRoLmNvcyhyKSkrIiwiKyh0aGlzLl95MT1lK24qTWF0aC5zaW4ocikpKSl9LHJlY3Q6ZnVuY3Rpb24odCxlLG4saSl7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStlKSsiaCIrICtuKyJ2IisgK2krImgiKy1uKyJaIn0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX07dmFyIE0xPXgxLnByb3RvdHlwZT13MS5wcm90b3R5cGU7TTEuY29weT1mdW5jdGlvbigpe3ZhciB0LGUsbj1uZXcgdzEodGhpcy5feCx0aGlzLl95LHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSxpPXRoaXMuX3Jvb3Q7aWYoIWkpcmV0dXJuIG47aWYoIWkubGVuZ3RoKXJldHVybiBuLl9yb290PVMxKGkpLG47Zm9yKHQ9W3tzb3VyY2U6aSx0YXJnZXQ6bi5fcm9vdD1uZXcgQXJyYXkoNCl9XTtpPXQucG9wKCk7KWZvcih2YXIgcj0wO3I8NDsrK3IpKGU9aS5zb3VyY2Vbcl0pJiYoZS5sZW5ndGg/dC5wdXNoKHtzb3VyY2U6ZSx0YXJnZXQ6aS50YXJnZXRbcl09bmV3IEFycmF5KDQpfSk6aS50YXJnZXRbcl09UzEoZSkpO3JldHVybiBufSxNMS5hZGQ9ZnVuY3Rpb24gRTEodCl7dmFyIGU9K3RoaXMuX3guY2FsbChudWxsLHQpLG49K3RoaXMuX3kuY2FsbChudWxsLHQpO3JldHVybiBfMSh0aGlzLmNvdmVyKGUsbiksZSxuLHQpfSxNMS5hZGRBbGw9ZnVuY3Rpb24gVDEodCl7dmFyIGUsbixpLHIsbz10Lmxlbmd0aCxhPW5ldyBBcnJheShvKSxzPW5ldyBBcnJheShvKSxsPTEvMCxjPTEvMCx1PS0xLzAsaD0tMS8wO2ZvcihuPTA7bjxvOysrbilpc05hTihpPSt0aGlzLl94LmNhbGwobnVsbCxlPXRbbl0pKXx8aXNOYU4ocj0rdGhpcy5feS5jYWxsKG51bGwsZSkpfHwoYVtuXT1pLHNbbl09cixpPGwmJihsPWkpLGk+dSYmKHU9aSkscjxjJiYoYz1yKSxyPmgmJihoPXIpKTtmb3IodTxsJiYobD10aGlzLl94MCx1PXRoaXMuX3gxKSxoPGMmJihjPXRoaXMuX3kwLGg9dGhpcy5feTEpLHRoaXMuY292ZXIobCxjKS5jb3Zlcih1LGgpLG49MDtuPG87KytuKV8xKHRoaXMsYVtuXSxzW25dLHRbbl0pO3JldHVybiB0aGlzfSxNMS5jb3Zlcj1mdW5jdGlvbiBDMSh0LGUpe2lmKGlzTmFOKHQ9K3QpfHxpc05hTihlPStlKSlyZXR1cm4gdGhpczt2YXIgbj10aGlzLl94MCxpPXRoaXMuX3kwLHI9dGhpcy5feDEsbz10aGlzLl95MTtpZihpc05hTihuKSlyPShuPU1hdGguZmxvb3IodCkpKzEsbz0oaT1NYXRoLmZsb29yKGUpKSsxO2Vsc2V7aWYoIShuPnR8fHQ+cnx8aT5lfHxlPm8pKXJldHVybiB0aGlzO3ZhciBhLHMsbD1yLW4sYz10aGlzLl9yb290O3N3aXRjaChzPShlPChpK28pLzIpPDwxfHQ8KG4rcikvMil7Y2FzZSAwOmRveyhhPW5ldyBBcnJheSg0KSlbc109YyxjPWF9d2hpbGUobz1pKyhsKj0yKSx0PihyPW4rbCl8fGU+byk7YnJlYWs7Y2FzZSAxOmRveyhhPW5ldyBBcnJheSg0KSlbc109YyxjPWF9d2hpbGUobz1pKyhsKj0yKSwobj1yLWwpPnR8fGU+byk7YnJlYWs7Y2FzZSAyOmRveyhhPW5ldyBBcnJheSg0KSlbc109YyxjPWF9d2hpbGUoaT1vLShsKj0yKSx0PihyPW4rbCl8fGk+ZSk7YnJlYWs7Y2FzZSAzOmRveyhhPW5ldyBBcnJheSg0KSlbc109YyxjPWF9d2hpbGUoaT1vLShsKj0yKSwobj1yLWwpPnR8fGk+ZSl9dGhpcy5fcm9vdCYmdGhpcy5fcm9vdC5sZW5ndGgmJih0aGlzLl9yb290PWMpfXJldHVybiB0aGlzLl94MD1uLHRoaXMuX3kwPWksdGhpcy5feDE9cix0aGlzLl95MT1vLHRoaXN9LE0xLmRhdGE9ZnVuY3Rpb24gQTEoKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy52aXNpdCgoZnVuY3Rpb24oZSl7aWYoIWUubGVuZ3RoKWRve3QucHVzaChlLmRhdGEpfXdoaWxlKGU9ZS5uZXh0KX0pKSx0fSxNMS5leHRlbnQ9ZnVuY3Rpb24gazEodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5jb3ZlcigrdFswXVswXSwrdFswXVsxXSkuY292ZXIoK3RbMV1bMF0sK3RbMV1bMV0pOmlzTmFOKHRoaXMuX3gwKT92b2lkIDA6W1t0aGlzLl94MCx0aGlzLl95MF0sW3RoaXMuX3gxLHRoaXMuX3kxXV19LE0xLmZpbmQ9ZnVuY3Rpb24gTDEodCxlLG4pe3ZhciBpLHIsbyxhLHMsbCxjLHU9dGhpcy5feDAsaD10aGlzLl95MCxkPXRoaXMuX3gxLHA9dGhpcy5feTEsZj1bXSxtPXRoaXMuX3Jvb3Q7Zm9yKG0mJmYucHVzaChuZXcgeTEobSx1LGgsZCxwKSksbnVsbD09bj9uPTEvMDoodT10LW4saD1lLW4sZD10K24scD1lK24sbio9bik7bD1mLnBvcCgpOylpZighKCEobT1sLm5vZGUpfHwocj1sLngwKT5kfHwobz1sLnkwKT5wfHwoYT1sLngxKTx1fHwocz1sLnkxKTxoKSlpZihtLmxlbmd0aCl7dmFyIGc9KHIrYSkvMixfPShvK3MpLzI7Zi5wdXNoKG5ldyB5MShtWzNdLGcsXyxhLHMpLG5ldyB5MShtWzJdLHIsXyxnLHMpLG5ldyB5MShtWzFdLGcsbyxhLF8pLG5ldyB5MShtWzBdLHIsbyxnLF8pKSwoYz0oZT49Xyk8PDF8dD49ZykmJihsPWZbZi5sZW5ndGgtMV0sZltmLmxlbmd0aC0xXT1mW2YubGVuZ3RoLTEtY10sZltmLmxlbmd0aC0xLWNdPWwpfWVsc2V7dmFyIHk9dC0rdGhpcy5feC5jYWxsKG51bGwsbS5kYXRhKSx2PWUtK3RoaXMuX3kuY2FsbChudWxsLG0uZGF0YSksYj15Knkrdip2O2lmKGI8bil7dmFyIHg9TWF0aC5zcXJ0KG49Yik7dT10LXgsaD1lLXgsZD10K3gscD1lK3gsaT1tLmRhdGF9fXJldHVybiBpfSxNMS5yZW1vdmU9ZnVuY3Rpb24gUDEodCl7aWYoaXNOYU4obz0rdGhpcy5feC5jYWxsKG51bGwsdCkpfHxpc05hTihhPSt0aGlzLl95LmNhbGwobnVsbCx0KSkpcmV0dXJuIHRoaXM7dmFyIGUsbixpLHIsbyxhLHMsbCxjLHUsaCxkLHA9dGhpcy5fcm9vdCxmPXRoaXMuX3gwLG09dGhpcy5feTAsZz10aGlzLl94MSxfPXRoaXMuX3kxO2lmKCFwKXJldHVybiB0aGlzO2lmKHAubGVuZ3RoKWZvcig7Oyl7aWYoKGM9bz49KHM9KGYrZykvMikpP2Y9czpnPXMsKHU9YT49KGw9KG0rXykvMikpP209bDpfPWwsZT1wLCEocD1wW2g9dTw8MXxjXSkpcmV0dXJuIHRoaXM7aWYoIXAubGVuZ3RoKWJyZWFrOyhlW2grMSYzXXx8ZVtoKzImM118fGVbaCszJjNdKSYmKG49ZSxkPWgpfWZvcig7cC5kYXRhIT09dDspaWYoaT1wLCEocD1wLm5leHQpKXJldHVybiB0aGlzO3JldHVybihyPXAubmV4dCkmJmRlbGV0ZSBwLm5leHQsaT8ocj9pLm5leHQ9cjpkZWxldGUgaS5uZXh0LHRoaXMpOmU/KHI/ZVtoXT1yOmRlbGV0ZSBlW2hdLChwPWVbMF18fGVbMV18fGVbMl18fGVbM10pJiZwPT09KGVbM118fGVbMl18fGVbMV18fGVbMF0pJiYhcC5sZW5ndGgmJihuP25bZF09cDp0aGlzLl9yb290PXApLHRoaXMpOih0aGlzLl9yb290PXIsdGhpcyl9LE0xLnJlbW92ZUFsbD1mdW5jdGlvbiBOMSh0KXtmb3IodmFyIGU9MCxuPXQubGVuZ3RoO2U8bjsrK2UpdGhpcy5yZW1vdmUodFtlXSk7cmV0dXJuIHRoaXN9LE0xLnJvb3Q9ZnVuY3Rpb24gSTEoKXtyZXR1cm4gdGhpcy5fcm9vdH0sTTEuc2l6ZT1mdW5jdGlvbiBSMSgpe3ZhciB0PTA7cmV0dXJuIHRoaXMudmlzaXQoKGZ1bmN0aW9uKGUpe2lmKCFlLmxlbmd0aClkb3srK3R9d2hpbGUoZT1lLm5leHQpfSkpLHR9LE0xLnZpc2l0PWZ1bmN0aW9uIE8xKHQpe3ZhciBlLG4saSxyLG8sYSxzPVtdLGw9dGhpcy5fcm9vdDtmb3IobCYmcy5wdXNoKG5ldyB5MShsLHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSk7ZT1zLnBvcCgpOylpZighdChsPWUubm9kZSxpPWUueDAscj1lLnkwLG89ZS54MSxhPWUueTEpJiZsLmxlbmd0aCl7dmFyIGM9KGkrbykvMix1PShyK2EpLzI7KG49bFszXSkmJnMucHVzaChuZXcgeTEobixjLHUsbyxhKSksKG49bFsyXSkmJnMucHVzaChuZXcgeTEobixpLHUsYyxhKSksKG49bFsxXSkmJnMucHVzaChuZXcgeTEobixjLHIsbyx1KSksKG49bFswXSkmJnMucHVzaChuZXcgeTEobixpLHIsYyx1KSl9cmV0dXJuIHRoaXN9LE0xLnZpc2l0QWZ0ZXI9ZnVuY3Rpb24gejEodCl7dmFyIGUsbj1bXSxpPVtdO2Zvcih0aGlzLl9yb290JiZuLnB1c2gobmV3IHkxKHRoaXMuX3Jvb3QsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtlPW4ucG9wKCk7KXt2YXIgcj1lLm5vZGU7aWYoci5sZW5ndGgpe3ZhciBvLGE9ZS54MCxzPWUueTAsbD1lLngxLGM9ZS55MSx1PShhK2wpLzIsaD0ocytjKS8yOyhvPXJbMF0pJiZuLnB1c2gobmV3IHkxKG8sYSxzLHUsaCkpLChvPXJbMV0pJiZuLnB1c2gobmV3IHkxKG8sdSxzLGwsaCkpLChvPXJbMl0pJiZuLnB1c2gobmV3IHkxKG8sYSxoLHUsYykpLChvPXJbM10pJiZuLnB1c2gobmV3IHkxKG8sdSxoLGwsYykpfWkucHVzaChlKX1mb3IoO2U9aS5wb3AoKTspdChlLm5vZGUsZS54MCxlLnkwLGUueDEsZS55MSk7cmV0dXJuIHRoaXN9LE0xLng9ZnVuY3Rpb24gRDEodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3g9dCx0aGlzKTp0aGlzLl94fSxNMS55PWZ1bmN0aW9uIEIxKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl95PXQsdGhpcyk6dGhpcy5feX07dmFyIEgxPVtdLnNsaWNlLEYxPXt9O2Z1bmN0aW9uIFYxKHQpe3RoaXMuX3NpemU9dCx0aGlzLl9jYWxsPXRoaXMuX2Vycm9yPW51bGwsdGhpcy5fdGFza3M9W10sdGhpcy5fZGF0YT1bXSx0aGlzLl93YWl0aW5nPXRoaXMuX2FjdGl2ZT10aGlzLl9lbmRlZD10aGlzLl9zdGFydD0wfWZ1bmN0aW9uIFUxKHQpe2lmKCF0Ll9zdGFydCl0cnl7IShmdW5jdGlvbiBlKHQpe2Zvcig7dC5fc3RhcnQ9dC5fd2FpdGluZyYmdC5fYWN0aXZlPHQuX3NpemU7KXt2YXIgZT10Ll9lbmRlZCt0Ll9hY3RpdmUsbj10Ll90YXNrc1tlXSxpPW4ubGVuZ3RoLTEscj1uW2ldO25baV09ajEodCxlKSwtLXQuX3dhaXRpbmcsKyt0Ll9hY3RpdmUsbj1yLmFwcGx5KG51bGwsbiksdC5fdGFza3NbZV0mJih0Ll90YXNrc1tlXT1ufHxGMSl9fSkodCl9Y2F0Y2goZSl7aWYodC5fdGFza3NbdC5fZW5kZWQrdC5fYWN0aXZlLTFdKUcxKHQsZSk7ZWxzZSBpZighdC5fZGF0YSl0aHJvdyBlfX1mdW5jdGlvbiBqMSh0LGUpe3JldHVybiBmdW5jdGlvbihuLGkpe3QuX3Rhc2tzW2VdJiYoLS10Ll9hY3RpdmUsKyt0Ll9lbmRlZCx0Ll90YXNrc1tlXT1udWxsLG51bGw9PXQuX2Vycm9yJiYobnVsbCE9bj9HMSh0LG4pOih0Ll9kYXRhW2VdPWksdC5fd2FpdGluZz9VMSh0KTpXMSh0KSkpKX19ZnVuY3Rpb24gRzEodCxlKXt2YXIgbixpPXQuX3Rhc2tzLmxlbmd0aDtmb3IodC5fZXJyb3I9ZSx0Ll9kYXRhPXZvaWQgMCx0Ll93YWl0aW5nPU5hTjstLWk+PTA7KWlmKChuPXQuX3Rhc2tzW2ldKSYmKHQuX3Rhc2tzW2ldPW51bGwsbi5hYm9ydCkpdHJ5e24uYWJvcnQoKX1jYXRjaChlKXt9dC5fYWN0aXZlPU5hTixXMSh0KX1mdW5jdGlvbiBXMSh0KXtpZighdC5fYWN0aXZlJiZ0Ll9jYWxsKXt2YXIgZT10Ll9kYXRhO3QuX2RhdGE9dm9pZCAwLHQuX2NhbGwodC5fZXJyb3IsZSl9fWZ1bmN0aW9uIHExKHQpe2lmKG51bGw9PXQpdD0xLzA7ZWxzZSBpZighKCh0PSt0KT49MSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNvbmN1cnJlbmN5Iik7cmV0dXJuIG5ldyBWMSh0KX1mdW5jdGlvbiBZMSgpe3JldHVybiBNYXRoLnJhbmRvbSgpfVYxLnByb3RvdHlwZT1xMS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlYxLGRlZmVyOmZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjayIpO2lmKHRoaXMuX2NhbGwpdGhyb3cgbmV3IEVycm9yKCJkZWZlciBhZnRlciBhd2FpdCIpO2lmKG51bGwhPXRoaXMuX2Vycm9yKXJldHVybiB0aGlzO3ZhciBlPUgxLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBlLnB1c2godCksKyt0aGlzLl93YWl0aW5nLHRoaXMuX3Rhc2tzLnB1c2goZSksVTEodGhpcyksdGhpc30sYWJvcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09dGhpcy5fZXJyb3ImJkcxKHRoaXMsbmV3IEVycm9yKCJhYm9ydCIpKSx0aGlzfSxhd2FpdDpmdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2siKTtpZih0aGlzLl9jYWxsKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgYXdhaXQiKTtyZXR1cm4gdGhpcy5fY2FsbD1mdW5jdGlvbihlLG4pe3QuYXBwbHkobnVsbCxbZV0uY29uY2F0KG4pKX0sVzEodGhpcyksdGhpc30sYXdhaXRBbGw6ZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrIik7aWYodGhpcy5fY2FsbCl0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIGF3YWl0Iik7cmV0dXJuIHRoaXMuX2NhbGw9dCxXMSh0aGlzKSx0aGlzfX07dmFyIFgxPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCxuKXtyZXR1cm4gdD1udWxsPT10PzA6K3Qsbj1udWxsPT1uPzE6K24sMT09PWFyZ3VtZW50cy5sZW5ndGg/KG49dCx0PTApOm4tPXQsZnVuY3Rpb24oKXtyZXR1cm4gZSgpKm4rdH19cmV0dXJuIG4uc291cmNlPXQsbn0pKFkxKSwkMT0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQsbil7dmFyIGkscjtyZXR1cm4gdD1udWxsPT10PzA6K3Qsbj1udWxsPT1uPzE6K24sZnVuY3Rpb24oKXt2YXIgbztpZihudWxsIT1pKW89aSxpPW51bGw7ZWxzZSBkb3tpPTIqZSgpLTEsbz0yKmUoKS0xLHI9aSppK28qb313aGlsZSghcnx8cj4xKTtyZXR1cm4gdCtuKm8qTWF0aC5zcXJ0KC0yKk1hdGgubG9nKHIpL3IpfX1yZXR1cm4gbi5zb3VyY2U9dCxufSkoWTEpLEsxPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4oKXt2YXIgdD0kMS5zb3VyY2UoZSkuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBNYXRoLmV4cCh0KCkpfX1yZXR1cm4gbi5zb3VyY2U9dCxufSkoWTEpLFoxPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBuPTAsaT0wO2k8dDsrK2kpbis9ZSgpO3JldHVybiBufX1yZXR1cm4gbi5zb3VyY2U9dCxufSkoWTEpLEoxPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7dmFyIG49WjEuc291cmNlKGUpKHQpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBuKCkvdH19cmV0dXJuIG4uc291cmNlPXQsbn0pKFkxKSxRMT0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybi1NYXRoLmxvZygxLWUoKSkvdH19cmV0dXJuIG4uc291cmNlPXQsbn0pKFkxKTtmdW5jdGlvbiB0MCh0LGUpe3ZhciBuLGkscixvLGE9bGMoImJlZm9yZXNlbmQiLCJwcm9ncmVzcyIsImxvYWQiLCJlcnJvciIpLHM9d2coKSxsPW5ldyBYTUxIdHRwUmVxdWVzdCxjPW51bGwsdT1udWxsLGg9MDtmdW5jdGlvbiBkKHQpe3ZhciBlLGk9bC5zdGF0dXM7aWYoIWkmJihmdW5jdGlvbiBvKHQpe3ZhciBlPXQucmVzcG9uc2VUeXBlO3JldHVybiBlJiYidGV4dCIhPT1lP3QucmVzcG9uc2U6dC5yZXNwb25zZVRleHR9KShsKXx8aT49MjAwJiZpPDMwMHx8MzA0PT09aSl7aWYocil0cnl7ZT1yLmNhbGwobixsKX1jYXRjaCh0KXtyZXR1cm4gdm9pZCBhLmNhbGwoImVycm9yIixuLHQpfWVsc2UgZT1sO2EuY2FsbCgibG9hZCIsbixlKX1lbHNlIGEuY2FsbCgiZXJyb3IiLG4sdCl9aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBYRG9tYWluUmVxdWVzdCYmISgid2l0aENyZWRlbnRpYWxzImluIGwpJiYvXihodHRwKHMpPzopP1wvXC8vLnRlc3QodCkmJihsPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBsP2wub25sb2FkPWwub25lcnJvcj1sLm9udGltZW91dD1kOmwub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKHQpe2wucmVhZHlTdGF0ZT4zJiZkKHQpfSxsLm9ucHJvZ3Jlc3M9ZnVuY3Rpb24odCl7YS5jYWxsKCJwcm9ncmVzcyIsbix0KX0sbj17aGVhZGVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9KHQrIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRzLmxlbmd0aDwyP3MuZ2V0KHQpOihudWxsPT1lP3MucmVtb3ZlKHQpOnMuc2V0KHQsZSsiIiksbil9LG1pbWVUeXBlOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/bnVsbDp0KyIiLG4pOml9LHJlc3BvbnNlVHlwZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz10LG4pOm99LHRpbWVvdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9K3Qsbik6aH0sdXNlcjpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP2M6KGM9bnVsbD09dD9udWxsOnQrIiIsbil9LHBhc3N3b3JkOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dToodT1udWxsPT10P251bGw6dCsiIixuKX0scmVzcG9uc2U6ZnVuY3Rpb24odCl7cmV0dXJuIHI9dCxufSxnZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5zZW5kKCJHRVQiLHQsZSl9LHBvc3Q6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5zZW5kKCJQT1NUIix0LGUpfSxzZW5kOmZ1bmN0aW9uKGUscixkKXtyZXR1cm4gbC5vcGVuKGUsdCwhMCxjLHUpLG51bGw9PWl8fHMuaGFzKCJhY2NlcHQiKXx8cy5zZXQoImFjY2VwdCIsaSsiLCovKiIpLGwuc2V0UmVxdWVzdEhlYWRlciYmcy5lYWNoKChmdW5jdGlvbih0LGUpe2wuc2V0UmVxdWVzdEhlYWRlcihlLHQpfSkpLG51bGwhPWkmJmwub3ZlcnJpZGVNaW1lVHlwZSYmbC5vdmVycmlkZU1pbWVUeXBlKGkpLG51bGwhPW8mJihsLnJlc3BvbnNlVHlwZT1vKSxoPjAmJihsLnRpbWVvdXQ9aCksbnVsbD09ZCYmImZ1bmN0aW9uIj09dHlwZW9mIHImJihkPXIscj1udWxsKSxudWxsIT1kJiYxPT09ZC5sZW5ndGgmJihkPShmdW5jdGlvbiBwKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3QobnVsbD09ZT9uOm51bGwpfX0pKGQpKSxudWxsIT1kJiZuLm9uKCJlcnJvciIsZCkub24oImxvYWQiLChmdW5jdGlvbih0KXtkKG51bGwsdCl9KSksYS5jYWxsKCJiZWZvcmVzZW5kIixuLGwpLGwuc2VuZChudWxsPT1yP251bGw6ciksbn0sYWJvcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gbC5hYm9ydCgpLG59LG9uOmZ1bmN0aW9uKCl7dmFyIHQ9YS5vbi5hcHBseShhLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1hP246dH19LG51bGwhPWUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjazogIitlKTtyZXR1cm4gbi5nZXQoZSl9cmV0dXJuIG59ZnVuY3Rpb24gZTAodCxlKXtyZXR1cm4gZnVuY3Rpb24obixpKXt2YXIgcj10MChuKS5taW1lVHlwZSh0KS5yZXNwb25zZShlKTtpZihudWxsIT1pKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgaSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIraSk7cmV0dXJuIHIuZ2V0KGkpfXJldHVybiByfX12YXIgbjA9ZTAoInRleHQvaHRtbCIsKGZ1bmN0aW9uKHQpe3JldHVybiBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0LnJlc3BvbnNlVGV4dCl9KSksaTA9ZTAoImFwcGxpY2F0aW9uL2pzb24iLChmdW5jdGlvbih0KXtyZXR1cm4gSlNPTi5wYXJzZSh0LnJlc3BvbnNlVGV4dCl9KSkscjA9ZTAoInRleHQvcGxhaW4iLChmdW5jdGlvbih0KXtyZXR1cm4gdC5yZXNwb25zZVRleHR9KSksbzA9ZTAoImFwcGxpY2F0aW9uL3htbCIsKGZ1bmN0aW9uKHQpe3ZhciBlPXQucmVzcG9uc2VYTUw7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJwYXJzZSBlcnJvciIpO3JldHVybiBlfSkpO2Z1bmN0aW9uIGEwKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSxyKXthcmd1bWVudHMubGVuZ3RoPDMmJihyPWksaT1udWxsKTt2YXIgbz10MChuKS5taW1lVHlwZSh0KTtyZXR1cm4gby5yb3c9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/by5yZXNwb25zZShzMChlLGk9dCkpOml9LG8ucm93KGkpLHI/by5nZXQocik6b319ZnVuY3Rpb24gczAodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQobi5yZXNwb25zZVRleHQsZSl9fXZhciBsMD1hMCgidGV4dC9jc3YiLEpnKSxjMD1hMCgidGV4dC90YWItc2VwYXJhdGVkLXZhbHVlcyIsYV8pO2Z1bmN0aW9uIHUwKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTp0Pj1lPzA6TmFOfWZ1bmN0aW9uIGgwKHQpe3JldHVybiAxPT09dC5sZW5ndGgmJih0PShmdW5jdGlvbiBlKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiB1MCh0KGUpLG4pfX0pKHQpKSx7bGVmdDpmdW5jdGlvbihlLG4saSxyKXtmb3IobnVsbD09aSYmKGk9MCksbnVsbD09ciYmKHI9ZS5sZW5ndGgpO2k8cjspe3ZhciBvPWkrcj4+PjE7dChlW29dLG4pPDA/aT1vKzE6cj1vfXJldHVybiBpfSxyaWdodDpmdW5jdGlvbihlLG4saSxyKXtmb3IobnVsbD09aSYmKGk9MCksbnVsbD09ciYmKHI9ZS5sZW5ndGgpO2k8cjspe3ZhciBvPWkrcj4+PjE7dChlW29dLG4pPjA/cj1vOmk9bysxfXJldHVybiBpfX19dmFyIGQwPWgwKHUwKS5yaWdodDtmdW5jdGlvbiBwMCh0KXtyZXR1cm4gbnVsbD09PXQ/TmFOOit0fXZhciBmMD1NYXRoLnNxcnQoNTApLG0wPU1hdGguc3FydCgxMCksZzA9TWF0aC5zcXJ0KDIpO2Z1bmN0aW9uIF8wKHQsZSxuKXt2YXIgaSxyLG8sYSxzPS0xO2lmKG49K24sKHQ9K3QpPT0oZT0rZSkmJm4+MClyZXR1cm5bdF07aWYoKGk9ZTx0KSYmKHI9dCx0PWUsZT1yKSwwPT09KGE9eTAodCxlLG4pKXx8IWlzRmluaXRlKGEpKXJldHVybltdO2lmKGE+MClmb3IodD1NYXRoLmNlaWwodC9hKSxlPU1hdGguZmxvb3IoZS9hKSxvPW5ldyBBcnJheShyPU1hdGguY2VpbChlLXQrMSkpOysrczxyOylvW3NdPSh0K3MpKmE7ZWxzZSBmb3IodD1NYXRoLmZsb29yKHQqYSksZT1NYXRoLmNlaWwoZSphKSxvPW5ldyBBcnJheShyPU1hdGguY2VpbCh0LWUrMSkpOysrczxyOylvW3NdPSh0LXMpL2E7cmV0dXJuIGkmJm8ucmV2ZXJzZSgpLG99ZnVuY3Rpb24geTAodCxlLG4pe3ZhciBpPShlLXQpL01hdGgubWF4KDAsbikscj1NYXRoLmZsb29yKE1hdGgubG9nKGkpL01hdGguTE4xMCksbz1pL01hdGgucG93KDEwLHIpO3JldHVybiByPj0wPyhvPj1mMD8xMDpvPj1tMD81Om8+PWcwPzI6MSkqTWF0aC5wb3coMTAscik6LU1hdGgucG93KDEwLC1yKS8obz49ZjA/MTA6bz49bTA/NTpvPj1nMD8yOjEpfWZ1bmN0aW9uIHYwKHQsZSxuKXt2YXIgaT1NYXRoLmFicyhlLXQpL01hdGgubWF4KDAsbikscj1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKGkpL01hdGguTE4xMCkpLG89aS9yO3JldHVybiBvPj1mMD9yKj0xMDpvPj1tMD9yKj01Om8+PWcwJiYocio9MiksZTx0Py1yOnJ9ZnVuY3Rpb24gYjAodCxlLG4pe2lmKG51bGw9PW4mJihuPXAwKSxpPXQubGVuZ3RoKXtpZigoZT0rZSk8PTB8fGk8MilyZXR1cm4rbih0WzBdLDAsdCk7aWYoZT49MSlyZXR1cm4rbih0W2ktMV0saS0xLHQpO3ZhciBpLHI9KGktMSkqZSxvPU1hdGguZmxvb3IociksYT0rbih0W29dLG8sdCk7cmV0dXJuIGErKCtuKHRbbysxXSxvKzEsdCktYSkqKHItbyl9fXZhciB4MD0iJCI7ZnVuY3Rpb24gdzAoKXt9ZnVuY3Rpb24gUzAodCxlKXt2YXIgbj1uZXcgdzA7aWYodCBpbnN0YW5jZW9mIHcwKXQuZWFjaCgoZnVuY3Rpb24odCxlKXtuLnNldChlLHQpfSkpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSl7dmFyIGkscj0tMSxvPXQubGVuZ3RoO2lmKG51bGw9PWUpZm9yKDsrK3I8bzspbi5zZXQocix0W3JdKTtlbHNlIGZvcig7KytyPG87KW4uc2V0KGUoaT10W3JdLHIsdCksaSl9ZWxzZSBpZih0KWZvcih2YXIgYSBpbiB0KW4uc2V0KGEsdFthXSk7cmV0dXJuIG59ZnVuY3Rpb24gTTAoKXt9dzAucHJvdG90eXBlPVMwLnByb3RvdHlwZT17Y29uc3RydWN0b3I6dzAsaGFzOmZ1bmN0aW9uKHQpe3JldHVybiB4MCt0IGluIHRoaXN9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpc1t4MCt0XX0sc2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXNbeDArdF09ZSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9eDArdDtyZXR1cm4gZSBpbiB0aGlzJiZkZWxldGUgdGhpc1tlXX0sY2xlYXI6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcyl0WzBdPT09eDAmJmRlbGV0ZSB0aGlzW3RdfSxrZXlzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PXgwJiZ0LnB1c2goZS5zbGljZSgxKSk7cmV0dXJuIHR9LHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT14MCYmdC5wdXNoKHRoaXNbZV0pO3JldHVybiB0fSxlbnRyaWVzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PXgwJiZ0LnB1c2goe2tleTplLnNsaWNlKDEpLHZhbHVlOnRoaXNbZV19KTtyZXR1cm4gdH0sc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTA7Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PXgwJiYrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpaWYodFswXT09PXgwKXJldHVybiExO3JldHVybiEwfSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT14MCYmdCh0aGlzW2VdLGUuc2xpY2UoMSksdGhpcyl9fTt2YXIgRTA9UzAucHJvdG90eXBlO00wLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TTAsaGFzOkUwLmhhcyxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbeDArKHQrPSIiKV09dCx0aGlzfSxyZW1vdmU6RTAucmVtb3ZlLGNsZWFyOkUwLmNsZWFyLHZhbHVlczpFMC5rZXlzLHNpemU6RTAuc2l6ZSxlbXB0eTpFMC5lbXB0eSxlYWNoOkUwLmVhY2h9O3ZhciBUMD1BcnJheS5wcm90b3R5cGUsQzA9VDAubWFwLEEwPVQwLnNsaWNlLGswPXtuYW1lOiJpbXBsaWNpdCJ9O2Z1bmN0aW9uIEwwKHQpe3ZhciBlPVMwKCksbj1bXSxpPWswO2Z1bmN0aW9uIHIocil7dmFyIG89cisiIixhPWUuZ2V0KG8pO2lmKCFhKXtpZihpIT09azApcmV0dXJuIGk7ZS5zZXQobyxhPW4ucHVzaChyKSl9cmV0dXJuIHRbKGEtMSkldC5sZW5ndGhdfXJldHVybiB0PW51bGw9PXQ/W106QTAuY2FsbCh0KSxyLmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbi5zbGljZSgpO249W10sZT1TMCgpO2Zvcih2YXIgaSxvLGE9LTEscz10Lmxlbmd0aDsrK2E8czspZS5oYXMobz0oaT10W2FdKSsiIil8fGUuc2V0KG8sbi5wdXNoKGkpKTtyZXR1cm4gcn0sci5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1BMC5jYWxsKGUpLHIpOnQuc2xpY2UoKX0sci51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQscik6aX0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEwwKCkuZG9tYWluKG4pLnJhbmdlKHQpLnVua25vd24oaSl9LHJ9ZnVuY3Rpb24gUDAoKXt2YXIgdCxlLG49TDAoKS51bmtub3duKHZvaWQgMCksaT1uLmRvbWFpbixyPW4ucmFuZ2Usbz1bMCwxXSxhPSExLHM9MCxsPTAsYz0uNTtmdW5jdGlvbiB1KCl7dmFyIG49aSgpLmxlbmd0aCx1PW9bMV08b1swXSxoPW9bdS0wXSxkPW9bMS11XTt0PShkLWgpL01hdGgubWF4KDEsbi1zKzIqbCksYSYmKHQ9TWF0aC5mbG9vcih0KSksaCs9KGQtaC10KihuLXMpKSpjLGU9dCooMS1zKSxhJiYoaD1NYXRoLnJvdW5kKGgpLGU9TWF0aC5yb3VuZChlKSk7dmFyIHA9KGZ1bmN0aW9uIGYodCxlLG4pe3Q9K3QsZT0rZSxuPShyPWFyZ3VtZW50cy5sZW5ndGgpPDI/KGU9dCx0PTAsMSk6cjwzPzE6K247Zm9yKHZhciBpPS0xLHI9MHxNYXRoLm1heCgwLE1hdGguY2VpbCgoZS10KS9uKSksbz1uZXcgQXJyYXkocik7KytpPHI7KW9baV09dCtpKm47cmV0dXJuIG99KShuKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBoK3QqZX0pKTtyZXR1cm4gcih1P3AucmV2ZXJzZSgpOnApfXJldHVybiBkZWxldGUgbi51bmtub3duLG4uZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpKHQpLHUoKSk6aSgpfSxuLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPVsrdFswXSwrdFsxXV0sdSgpKTpvLnNsaWNlKCl9LG4ucmFuZ2VSb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gbz1bK3RbMF0sK3RbMV1dLGE9ITAsdSgpfSxuLmJhbmR3aWR0aD1mdW5jdGlvbigpe3JldHVybiBlfSxuLnN0ZXA9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sbi5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0hIXQsdSgpKTphfSxuLnBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9bD1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHUoKSk6c30sbi5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSx1KCkpOnN9LG4ucGFkZGluZ091dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSksdSgpKTpsfSxuLmFsaWduPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSksdSgpKTpjfSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gUDAoKS5kb21haW4oaSgpKS5yYW5nZShvKS5yb3VuZChhKS5wYWRkaW5nSW5uZXIocykucGFkZGluZ091dGVyKGwpLmFsaWduKGMpfSx1KCl9ZnVuY3Rpb24gTjAodCl7dmFyIGU9dC5jb3B5O3JldHVybiB0LnBhZGRpbmc9dC5wYWRkaW5nT3V0ZXIsZGVsZXRlIHQucGFkZGluZ0lubmVyLGRlbGV0ZSB0LnBhZGRpbmdPdXRlcix0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gTjAoZSgpKX0sdH1mdW5jdGlvbiBJMCh0LGUsbil7dC5wcm90b3R5cGU9ZS5wcm90b3R5cGU9bixuLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24gUjAodCxlKXt2YXIgbj1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIGkgaW4gZSluW2ldPWVbaV07cmV0dXJuIG59ZnVuY3Rpb24gTzAoKXt9dmFyIHowPS43LEQwPTEvejAsQjA9IlxccyooWystXT9cXGQrKVxccyoiLEgwPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLEYwPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixWMD0vXiMoWzAtOWEtZl17Myw4fSkkLyxVMD1uZXcgUmVnRXhwKCJecmdiXFwoIitbQjAsQjAsQjBdKyJcXCkkIiksajA9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW0YwLEYwLEYwXSsiXFwpJCIpLEcwPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbQjAsQjAsQjAsSDBdKyJcXCkkIiksVzA9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tGMCxGMCxGMCxIMF0rIlxcKSQiKSxxMD1uZXcgUmVnRXhwKCJeaHNsXFwoIitbSDAsRjAsRjBdKyJcXCkkIiksWTA9bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1tIMCxGMCxGMCxIMF0rIlxcKSQiKSxYMD17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtmdW5jdGlvbiAkMCgpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpfWZ1bmN0aW9uIEswKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCl9ZnVuY3Rpb24gWjAodCl7dmFyIGUsbjtyZXR1cm4gdD0odCsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKGU9VjAuZXhlYyh0KSk/KG49ZVsxXS5sZW5ndGgsZT1wYXJzZUludChlWzFdLDE2KSw2PT09bj9KMChlKTozPT09bj9uZXcgbjIoZT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgxNSZlKTw8NHwxNSZlLDEpOjg9PT1uP1EwKGU+PjI0JjI1NSxlPj4xNiYyNTUsZT4+OCYyNTUsKDI1NSZlKS8yNTUpOjQ9PT1uP1EwKGU+PjEyJjE1fGU+PjgmMjQwLGU+PjgmMTV8ZT4+NCYyNDAsZT4+NCYxNXwyNDAmZSwoKDE1JmUpPDw0fDE1JmUpLzI1NSk6bnVsbCk6KGU9VTAuZXhlYyh0KSk/bmV3IG4yKGVbMV0sZVsyXSxlWzNdLDEpOihlPWowLmV4ZWModCkpP25ldyBuMigyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCwxKTooZT1HMC5leGVjKHQpKT9RMChlWzFdLGVbMl0sZVszXSxlWzRdKTooZT1XMC5leGVjKHQpKT9RMCgyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCxlWzRdKTooZT1xMC5leGVjKHQpKT9hMihlWzFdLGVbMl0vMTAwLGVbM10vMTAwLDEpOihlPVkwLmV4ZWModCkpP2EyKGVbMV0sZVsyXS8xMDAsZVszXS8xMDAsZVs0XSk6WDAuaGFzT3duUHJvcGVydHkodCk/SjAoWDBbdF0pOiJ0cmFuc3BhcmVudCI9PT10P25ldyBuMihOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIEowKHQpe3JldHVybiBuZXcgbjIodD4+MTYmMjU1LHQ+PjgmMjU1LDI1NSZ0LDEpfWZ1bmN0aW9uIFEwKHQsZSxuLGkpe3JldHVybiBpPD0wJiYodD1lPW49TmFOKSxuZXcgbjIodCxlLG4saSl9ZnVuY3Rpb24gdDIodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBPMHx8KHQ9WjAodCkpLHQ/bmV3IG4yKCh0PXQucmdiKCkpLnIsdC5nLHQuYix0Lm9wYWNpdHkpOm5ldyBuMn1mdW5jdGlvbiBlMih0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dDIodCk6bmV3IG4yKHQsZSxuLG51bGw9PWk/MTppKX1mdW5jdGlvbiBuMih0LGUsbixpKXt0aGlzLnI9K3QsdGhpcy5nPStlLHRoaXMuYj0rbix0aGlzLm9wYWNpdHk9K2l9ZnVuY3Rpb24gaTIoKXtyZXR1cm4iIyIrbzIodGhpcy5yKStvMih0aGlzLmcpK28yKHRoaXMuYil9ZnVuY3Rpb24gcjIoKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX1mdW5jdGlvbiBvMih0KXtyZXR1cm4oKHQ9TWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0KXx8MCkpKTwxNj8iMCI6IiIpK3QudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIGEyKHQsZSxuLGkpe3JldHVybiBpPD0wP3Q9ZT1uPU5hTjpuPD0wfHxuPj0xP3Q9ZT1OYU46ZTw9MCYmKHQ9TmFOKSxuZXcgbDIodCxlLG4saSl9ZnVuY3Rpb24gczIodCl7aWYodCBpbnN0YW5jZW9mIGwyKXJldHVybiBuZXcgbDIodC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YgTzB8fCh0PVowKHQpKSwhdClyZXR1cm4gbmV3IGwyO2lmKHQgaW5zdGFuY2VvZiBsMilyZXR1cm4gdDt2YXIgZT0odD10LnJnYigpKS5yLzI1NSxuPXQuZy8yNTUsaT10LmIvMjU1LHI9TWF0aC5taW4oZSxuLGkpLG89TWF0aC5tYXgoZSxuLGkpLGE9TmFOLHM9by1yLGw9KG8rcikvMjtyZXR1cm4gcz8oYT1lPT09bz8obi1pKS9zKzYqKG48aSk6bj09PW8/KGktZSkvcysyOihlLW4pL3MrNCxzLz1sPC41P28rcjoyLW8tcixhKj02MCk6cz1sPjAmJmw8MT8wOmEsbmV3IGwyKGEscyxsLHQub3BhY2l0eSl9ZnVuY3Rpb24gbDIodCxlLG4saSl7dGhpcy5oPSt0LHRoaXMucz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIGMyKHQsZSxuKXtyZXR1cm4gMjU1Kih0PDYwP2UrKG4tZSkqdC82MDp0PDE4MD9uOnQ8MjQwP2UrKG4tZSkqKDI0MC10KS82MDplKX1JMChPMCxaMCx7Y29weTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3Rvcix0aGlzLHQpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCl9LGhleDokMCxmb3JtYXRIZXg6JDAsZm9ybWF0SHNsOmZ1bmN0aW9uIHUyKCl7cmV0dXJuIHMyKHRoaXMpLmZvcm1hdEhzbCgpfSxmb3JtYXRSZ2I6SzAsdG9TdHJpbmc6SzB9KSxJMChuMixlMixSMChPMCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9EMDpNYXRoLnBvdyhEMCx0KSxuZXcgbjIodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/ejA6TWF0aC5wb3coejAsdCksbmV3IG4yKHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybi0uNTw9dGhpcy5yJiZ0aGlzLnI8MjU1LjUmJi0uNTw9dGhpcy5nJiZ0aGlzLmc8MjU1LjUmJi0uNTw9dGhpcy5iJiZ0aGlzLmI8MjU1LjUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxoZXg6aTIsZm9ybWF0SGV4OmkyLGZvcm1hdFJnYjpyMix0b1N0cmluZzpyMn0pKSxJMChsMiwoZnVuY3Rpb24gaDIodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3MyKHQpOm5ldyBsMih0LGUsbixudWxsPT1pPzE6aSl9KSxSMChPMCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9EMDpNYXRoLnBvdyhEMCx0KSxuZXcgbDIodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD96MDpNYXRoLnBvdyh6MCx0KSxuZXcgbDIodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmglMzYwKzM2MCoodGhpcy5oPDApLGU9aXNOYU4odCl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsbj10aGlzLmwsaT1uKyhuPC41P246MS1uKSplLHI9MipuLWk7cmV0dXJuIG5ldyBuMihjMih0Pj0yNDA/dC0yNDA6dCsxMjAscixpKSxjMih0LHIsaSksYzIodDwxMjA/dCsyNDA6dC0xMjAscixpKSx0aGlzLm9wYWNpdHkpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybigwPD10aGlzLnMmJnRoaXMuczw9MXx8aXNOYU4odGhpcy5zKSkmJjA8PXRoaXMubCYmdGhpcy5sPD0xJiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sZm9ybWF0SHNsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcGFjaXR5O3JldHVybigxPT09KHQ9aXNOYU4odCk/MTpNYXRoLm1heCgwLE1hdGgubWluKDEsdCkpKT8iaHNsKCI6ImhzbGEoIikrKHRoaXMuaHx8MCkrIiwgIisxMDAqKHRoaXMuc3x8MCkrIiUsICIrMTAwKih0aGlzLmx8fDApKyIlIisoMT09PXQ/IikiOiIsICIrdCsiKSIpfX0pKTt2YXIgZDI9TWF0aC5QSS8xODAscDI9MTgwL01hdGguUEksZjI9LS4xNDg2MSxtMj0xLjc4Mjc3LGcyPS0uMjkyMjcsXzI9LS45MDY0OSx5Mj0xLjk3Mjk0LHYyPXkyKl8yLGIyPXkyKm0yLHgyPW0yKmcyLV8yKmYyO2Z1bmN0aW9uIHcyKHQpe2lmKHQgaW5zdGFuY2VvZiBNMilyZXR1cm4gbmV3IE0yKHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7dCBpbnN0YW5jZW9mIG4yfHwodD10Mih0KSk7dmFyIGU9dC5nLzI1NSxuPXQuYi8yNTUsaT0oeDIqbit2MioodC5yLzI1NSktYjIqZSkvKHgyK3YyLWIyKSxyPW4taSxvPSh5MiooZS1pKS1nMipyKS9fMixhPU1hdGguc3FydChvKm8rcipyKS8oeTIqaSooMS1pKSkscz1hP01hdGguYXRhbjIobyxyKSpwMi0xMjA6TmFOO3JldHVybiBuZXcgTTIoczwwP3MrMzYwOnMsYSxpLHQub3BhY2l0eSl9ZnVuY3Rpb24gUzIodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3cyKHQpOm5ldyBNMih0LGUsbixudWxsPT1pPzE6aSl9ZnVuY3Rpb24gTTIodCxlLG4saSl7dGhpcy5oPSt0LHRoaXMucz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIEUyKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBUMih0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdCtuKmV9fWZ1bmN0aW9uIEMyKHQsZSl7dmFyIG49ZS10O3JldHVybiBuP1QyKHQsbik6RTIoaXNOYU4odCk/ZTp0KX1JMChNMixTMixSMChPMCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9EMDpNYXRoLnBvdyhEMCx0KSxuZXcgTTIodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD96MDpNYXRoLnBvdyh6MCx0KSxuZXcgTTIodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD1pc05hTih0aGlzLmgpPzA6KHRoaXMuaCsxMjApKmQyLGU9K3RoaXMubCxuPWlzTmFOKHRoaXMucyk/MDp0aGlzLnMqZSooMS1lKSxpPU1hdGguY29zKHQpLHI9TWF0aC5zaW4odCk7cmV0dXJuIG5ldyBuMigyNTUqKGUrbiooZjIqaSttMipyKSksMjU1KihlK24qKGcyKmkrXzIqcikpLDI1NSooZStuKih5MippKSksdGhpcy5vcGFjaXR5KX19KSk7dmFyIEEyPShmdW5jdGlvbiB0KGUpe3ZhciBuPShmdW5jdGlvbiBpKHQpe3JldHVybiAxPT0odD0rdCk/QzI6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gbi1lPyhmdW5jdGlvbiBpKHQsZSxuKXtyZXR1cm4gdD1NYXRoLnBvdyh0LG4pLGU9TWF0aC5wb3coZSxuKS10LG49MS9uLGZ1bmN0aW9uKGkpe3JldHVybiBNYXRoLnBvdyh0K2kqZSxuKX19KShlLG4sdCk6RTIoaXNOYU4oZSk/bjplKX19KShlKTtmdW5jdGlvbiByKHQsZSl7dmFyIGk9bigodD1lMih0KSkuciwoZT1lMihlKSkucikscj1uKHQuZyxlLmcpLG89bih0LmIsZS5iKSxhPUMyKHQub3BhY2l0eSxlLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5yPWkoZSksdC5nPXIoZSksdC5iPW8oZSksdC5vcGFjaXR5PWEoZSksdCsiIn19cmV0dXJuIHIuZ2FtbWE9dCxyfSkoMSk7ZnVuY3Rpb24gazIodCxlKXtlfHwoZT1bXSk7dmFyIG4saT10P01hdGgubWluKGUubGVuZ3RoLHQubGVuZ3RoKTowLHI9ZS5zbGljZSgpO3JldHVybiBmdW5jdGlvbihvKXtmb3Iobj0wO248aTsrK24pcltuXT10W25dKigxLW8pK2Vbbl0qbztyZXR1cm4gcn19ZnVuY3Rpb24gTDIodCxlKXt2YXIgbixpPWU/ZS5sZW5ndGg6MCxyPXQ/TWF0aC5taW4oaSx0Lmxlbmd0aCk6MCxvPW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShpKTtmb3Iobj0wO248cjsrK24pb1tuXT1EMih0W25dLGVbbl0pO2Zvcig7bjxpOysrbilhW25dPWVbbl07cmV0dXJuIGZ1bmN0aW9uKHQpe2ZvcihuPTA7bjxyOysrbilhW25dPW9bbl0odCk7cmV0dXJuIGF9fWZ1bmN0aW9uIFAyKHQsZSl7dmFyIG49bmV3IERhdGU7cmV0dXJuIHQ9K3QsZT0rZSxmdW5jdGlvbihpKXtyZXR1cm4gbi5zZXRUaW1lKHQqKDEtaSkrZSppKSxufX1mdW5jdGlvbiBOMih0LGUpe3JldHVybiB0PSt0LGU9K2UsZnVuY3Rpb24obil7cmV0dXJuIHQqKDEtbikrZSpufX1mdW5jdGlvbiBJMih0LGUpe3ZhciBuLGk9e30scj17fTtmb3IobiBpbiBudWxsIT09dCYmIm9iamVjdCI9PXR5cGVvZiB0fHwodD17fSksbnVsbCE9PWUmJiJvYmplY3QiPT10eXBlb2YgZXx8KGU9e30pLGUpbiBpbiB0P2lbbl09RDIodFtuXSxlW25dKTpyW25dPWVbbl07cmV0dXJuIGZ1bmN0aW9uKHQpe2ZvcihuIGluIGkpcltuXT1pW25dKHQpO3JldHVybiByfX12YXIgUjI9L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLE8yPW5ldyBSZWdFeHAoUjIuc291cmNlLCJnIik7ZnVuY3Rpb24gejIodCxlKXt2YXIgbixpLHIsbz1SMi5sYXN0SW5kZXg9TzIubGFzdEluZGV4PTAsYT0tMSxzPVtdLGw9W107Zm9yKHQrPSIiLGUrPSIiOyhuPVIyLmV4ZWModCkpJiYoaT1PMi5leGVjKGUpKTspKHI9aS5pbmRleCk+byYmKHI9ZS5zbGljZShvLHIpLHNbYV0/c1thXSs9cjpzWysrYV09ciksKG49blswXSk9PT0oaT1pWzBdKT9zW2FdP3NbYV0rPWk6c1srK2FdPWk6KHNbKythXT1udWxsLGwucHVzaCh7aTphLHg6TjIobixpKX0pKSxvPU8yLmxhc3RJbmRleDtyZXR1cm4gbzxlLmxlbmd0aCYmKHI9ZS5zbGljZShvKSxzW2FdP3NbYV0rPXI6c1srK2FdPXIpLHMubGVuZ3RoPDI/bFswXT8oZnVuY3Rpb24gYyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSkrIiJ9fSkobFswXS54KTooZnVuY3Rpb24gdSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KShlKTooZT1sLmxlbmd0aCxmdW5jdGlvbih0KXtmb3IodmFyIG4saT0wO2k8ZTsrK2kpc1sobj1sW2ldKS5pXT1uLngodCk7cmV0dXJuIHMuam9pbigiIil9KX1mdW5jdGlvbiBEMih0LGUpe3ZhciBuLGk9dHlwZW9mIGU7cmV0dXJuIG51bGw9PWV8fCJib29sZWFuIj09PWk/RTIoZSk6KCJudW1iZXIiPT09aT9OMjoic3RyaW5nIj09PWk/KG49WjAoZSkpPyhlPW4sQTIpOnoyOmUgaW5zdGFuY2VvZiBaMD9BMjplIGluc3RhbmNlb2YgRGF0ZT9QMjooZnVuY3Rpb24gcih0KXtyZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KHQpJiYhKHQgaW5zdGFuY2VvZiBEYXRhVmlldyl9KShlKT9rMjpBcnJheS5pc0FycmF5KGUpP0wyOiJmdW5jdGlvbiIhPXR5cGVvZiBlLnZhbHVlT2YmJiJmdW5jdGlvbiIhPXR5cGVvZiBlLnRvU3RyaW5nfHxpc05hTihlKT9JMjpOMikodCxlKX1mdW5jdGlvbiBCMih0LGUpe3JldHVybiB0PSt0LGU9K2UsZnVuY3Rpb24obil7cmV0dXJuIE1hdGgucm91bmQodCooMS1uKStlKm4pfX1mdW5jdGlvbiBIMih0KXtyZXR1cm4oZnVuY3Rpb24gZShuKXtmdW5jdGlvbiBpKGUsaSl7dmFyIHI9dCgoZT1TMihlKSkuaCwoaT1TMihpKSkuaCksbz1DMihlLnMsaS5zKSxhPUMyKGUubCxpLmwpLHM9QzIoZS5vcGFjaXR5LGkub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmg9cih0KSxlLnM9byh0KSxlLmw9YShNYXRoLnBvdyh0LG4pKSxlLm9wYWNpdHk9cyh0KSxlKyIifX1yZXR1cm4gbj0rbixpLmdhbW1hPWUsaX0pKDEpfUgyKChmdW5jdGlvbiBGMih0LGUpe3ZhciBuPWUtdDtyZXR1cm4gbj9UMih0LG4+MTgwfHxuPC0xODA/bi0zNjAqTWF0aC5yb3VuZChuLzM2MCk6bik6RTIoaXNOYU4odCk/ZTp0KX0pKTt2YXIgVjI9SDIoQzIpO2Z1bmN0aW9uIFUyKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBqMih0KXtyZXR1cm4rdH12YXIgRzI9WzAsMV07ZnVuY3Rpb24gVzIodCxlKXtyZXR1cm4oZS09dD0rdCk/ZnVuY3Rpb24obil7cmV0dXJuKG4tdCkvZX06VTIoZSl9ZnVuY3Rpb24gcTIodCxlLG4saSl7dmFyIHI9dFswXSxvPXRbMV0sYT1lWzBdLHM9ZVsxXTtyZXR1cm4gbzxyPyhyPW4obyxyKSxhPWkocyxhKSk6KHI9bihyLG8pLGE9aShhLHMpKSxmdW5jdGlvbih0KXtyZXR1cm4gYShyKHQpKX19ZnVuY3Rpb24gWTIodCxlLG4saSl7dmFyIHI9TWF0aC5taW4odC5sZW5ndGgsZS5sZW5ndGgpLTEsbz1uZXcgQXJyYXkociksYT1uZXcgQXJyYXkocikscz0tMTtmb3IodFtyXTx0WzBdJiYodD10LnNsaWNlKCkucmV2ZXJzZSgpLGU9ZS5zbGljZSgpLnJldmVyc2UoKSk7KytzPHI7KW9bc109bih0W3NdLHRbcysxXSksYVtzXT1pKGVbc10sZVtzKzFdKTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49ZDAodCxlLDEsciktMTtyZXR1cm4gYVtuXShvW25dKGUpKX19ZnVuY3Rpb24gWDIodCxlKXtyZXR1cm4gZS5kb21haW4odC5kb21haW4oKSkucmFuZ2UodC5yYW5nZSgpKS5pbnRlcnBvbGF0ZSh0LmludGVycG9sYXRlKCkpLmNsYW1wKHQuY2xhbXAoKSl9ZnVuY3Rpb24gJDIodCxlKXt2YXIgbixpLHIsbz1HMixhPUcyLHM9RDIsbD0hMTtmdW5jdGlvbiBjKCl7cmV0dXJuIG49TWF0aC5taW4oby5sZW5ndGgsYS5sZW5ndGgpPjI/WTI6cTIsaT1yPW51bGwsdX1mdW5jdGlvbiB1KGUpe3JldHVybihpfHwoaT1uKG8sYSxsPyhmdW5jdGlvbiByKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciBpPXQoZT0rZSxuPStuKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ8PWU/MDp0Pj1uPzE6aSh0KX19fSkodCk6dCxzKSkpKCtlKX1yZXR1cm4gdS5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuKHJ8fChyPW4oYSxvLFcyLGw/KGZ1bmN0aW9uIGkodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIGk9dChlPStlLG49K24pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdDw9MD9lOnQ+PTE/bjppKHQpfX19KShlKTplKSkpKCt0KX0sdS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89QzAuY2FsbCh0LGoyKSxjKCkpOm8uc2xpY2UoKX0sdS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1BMC5jYWxsKHQpLGMoKSk6YS5zbGljZSgpfSx1LnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGE9QTAuY2FsbCh0KSxzPUIyLGMoKX0sdS5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD0hIXQsYygpKTpsfSx1LmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPXQsYygpKTpzfSxjKCl9ZnVuY3Rpb24gSzIodCxlKXtpZigobj0odD1lP3QudG9FeHBvbmVudGlhbChlLTEpOnQudG9FeHBvbmVudGlhbCgpKS5pbmRleE9mKCJlIikpPDApcmV0dXJuIG51bGw7dmFyIG4saT10LnNsaWNlKDAsbik7cmV0dXJuW2kubGVuZ3RoPjE/aVswXStpLnNsaWNlKDIpOmksK3Quc2xpY2UobisxKV19ZnVuY3Rpb24gWjIodCl7cmV0dXJuKHQ9SzIoTWF0aC5hYnModCkpKT90WzFdOk5hTn12YXIgSjIsUTI9L14oPzooLik/KFs8Pj1eXSkpPyhbK1wtKCBdKT8oWyQjXSk/KDApPyhcZCspPygsKT8oXC5cZCspPyh+KT8oW2EteiVdKT8kL2k7ZnVuY3Rpb24gdDUodCl7aWYoIShlPVEyLmV4ZWModCkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIrdCk7dmFyIGU7cmV0dXJuIG5ldyBlNSh7ZmlsbDplWzFdLGFsaWduOmVbMl0sc2lnbjplWzNdLHN5bWJvbDplWzRdLHplcm86ZVs1XSx3aWR0aDplWzZdLGNvbW1hOmVbN10scHJlY2lzaW9uOmVbOF0mJmVbOF0uc2xpY2UoMSksdHJpbTplWzldLHR5cGU6ZVsxMF19KX1mdW5jdGlvbiBlNSh0KXt0aGlzLmZpbGw9dm9pZCAwPT09dC5maWxsPyIgIjp0LmZpbGwrIiIsdGhpcy5hbGlnbj12b2lkIDA9PT10LmFsaWduPyI+Ijp0LmFsaWduKyIiLHRoaXMuc2lnbj12b2lkIDA9PT10LnNpZ24/Ii0iOnQuc2lnbisiIix0aGlzLnN5bWJvbD12b2lkIDA9PT10LnN5bWJvbD8iIjp0LnN5bWJvbCsiIix0aGlzLnplcm89ISF0Lnplcm8sdGhpcy53aWR0aD12b2lkIDA9PT10LndpZHRoP3ZvaWQgMDordC53aWR0aCx0aGlzLmNvbW1hPSEhdC5jb21tYSx0aGlzLnByZWNpc2lvbj12b2lkIDA9PT10LnByZWNpc2lvbj92b2lkIDA6K3QucHJlY2lzaW9uLHRoaXMudHJpbT0hIXQudHJpbSx0aGlzLnR5cGU9dm9pZCAwPT09dC50eXBlPyIiOnQudHlwZSsiIn1mdW5jdGlvbiBuNSh0LGUpe3ZhciBuPUsyKHQsZSk7aWYoIW4pcmV0dXJuIHQrIiI7dmFyIGk9blswXSxyPW5bMV07cmV0dXJuIHI8MD8iMC4iK25ldyBBcnJheSgtcikuam9pbigiMCIpK2k6aS5sZW5ndGg+cisxP2kuc2xpY2UoMCxyKzEpKyIuIitpLnNsaWNlKHIrMSk6aStuZXcgQXJyYXkoci1pLmxlbmd0aCsyKS5qb2luKCIwIil9dDUucHJvdG90eXBlPWU1LnByb3RvdHlwZSxlNS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxsK3RoaXMuYWxpZ24rdGhpcy5zaWduK3RoaXMuc3ltYm9sKyh0aGlzLnplcm8/IjAiOiIiKSsodm9pZCAwPT09dGhpcy53aWR0aD8iIjpNYXRoLm1heCgxLDB8dGhpcy53aWR0aCkpKyh0aGlzLmNvbW1hPyIsIjoiIikrKHZvaWQgMD09PXRoaXMucHJlY2lzaW9uPyIiOiIuIitNYXRoLm1heCgwLDB8dGhpcy5wcmVjaXNpb24pKSsodGhpcy50cmltPyJ+IjoiIikrdGhpcy50eXBlfTt2YXIgaTU9eyIlIjpmdW5jdGlvbih0LGUpe3JldHVybigxMDAqdCkudG9GaXhlZChlKX0sYjpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZygyKX0sYzpmdW5jdGlvbih0KXtyZXR1cm4gdCsiIn0sZDpmdW5jdGlvbiByNSh0KXtyZXR1cm4gTWF0aC5hYnModD1NYXRoLnJvdW5kKHQpKT49MWUyMT90LnRvTG9jYWxlU3RyaW5nKCJlbiIpLnJlcGxhY2UoLywvZywiIik6dC50b1N0cmluZygxMCl9LGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50b0V4cG9uZW50aWFsKGUpfSxmOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9GaXhlZChlKX0sZzpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRvUHJlY2lzaW9uKGUpfSxvOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDgpfSxwOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG41KDEwMCp0LGUpfSxyOm41LHM6ZnVuY3Rpb24gbzUodCxlKXt2YXIgbj1LMih0LGUpO2lmKCFuKXJldHVybiB0KyIiO3ZhciBpPW5bMF0scj1uWzFdLG89ci0oSjI9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3Ioci8zKSkpKSsxLGE9aS5sZW5ndGg7cmV0dXJuIG89PT1hP2k6bz5hP2krbmV3IEFycmF5KG8tYSsxKS5qb2luKCIwIik6bz4wP2kuc2xpY2UoMCxvKSsiLiIraS5zbGljZShvKToiMC4iK25ldyBBcnJheSgxLW8pLmpvaW4oIjAiKStLMih0LE1hdGgubWF4KDAsZStvLTEpKVswXX0sWDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX0seDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZygxNil9fTtmdW5jdGlvbiBhNSh0KXtyZXR1cm4gdH12YXIgczUsbDUsYzUsdTU9QXJyYXkucHJvdG90eXBlLm1hcCxoNT1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIsK1IiwibSIsIiIsImsiLCJNIiwiRyIsIlQiLCJQIiwiRSIsIloiLCJZIl07ZnVuY3Rpb24gZDUodCl7dmFyIGU9dC5kb21haW47cmV0dXJuIHQudGlja3M9ZnVuY3Rpb24odCl7dmFyIG49ZSgpO3JldHVybiBfMChuWzBdLG5bbi5sZW5ndGgtMV0sbnVsbD09dD8xMDp0KX0sdC50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsbil7cmV0dXJuKGZ1bmN0aW9uIGkodCxlLG4pe3ZhciBpLHI9dFswXSxvPXRbdC5sZW5ndGgtMV0sYT12MChyLG8sbnVsbD09ZT8xMDplKTtzd2l0Y2goKG49dDUobnVsbD09bj8iLGYiOm4pKS50eXBlKXtjYXNlInMiOnZhciBzPU1hdGgubWF4KE1hdGguYWJzKHIpLE1hdGguYWJzKG8pKTtyZXR1cm4gbnVsbCE9bi5wcmVjaXNpb258fGlzTmFOKGk9KGZ1bmN0aW9uIGwodCxlKXtyZXR1cm4gTWF0aC5tYXgoMCwzKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihaMihlKS8zKSkpLVoyKE1hdGguYWJzKHQpKSl9KShhLHMpKXx8KG4ucHJlY2lzaW9uPWkpLGM1KG4scyk7Y2FzZSIiOmNhc2UiZSI6Y2FzZSJnIjpjYXNlInAiOmNhc2UiciI6bnVsbCE9bi5wcmVjaXNpb258fGlzTmFOKGk9KGZ1bmN0aW9uIGModCxlKXtyZXR1cm4gdD1NYXRoLmFicyh0KSxlPU1hdGguYWJzKGUpLXQsTWF0aC5tYXgoMCxaMihlKS1aMih0KSkrMX0pKGEsTWF0aC5tYXgoTWF0aC5hYnMociksTWF0aC5hYnMobykpKSl8fChuLnByZWNpc2lvbj1pLSgiZSI9PT1uLnR5cGUpKTticmVhaztjYXNlImYiOmNhc2UiJSI6bnVsbCE9bi5wcmVjaXNpb258fGlzTmFOKGk9KGZ1bmN0aW9uIHUodCl7cmV0dXJuIE1hdGgubWF4KDAsLVoyKE1hdGguYWJzKHQpKSl9KShhKSl8fChuLnByZWNpc2lvbj1pLTIqKCIlIj09PW4udHlwZSkpfXJldHVybiBsNShuKX0pKGUoKSx0LG4pfSx0Lm5pY2U9ZnVuY3Rpb24obil7bnVsbD09biYmKG49MTApO3ZhciBpLHI9ZSgpLG89MCxhPXIubGVuZ3RoLTEscz1yW29dLGw9clthXTtyZXR1cm4gbDxzJiYoaT1zLHM9bCxsPWksaT1vLG89YSxhPWkpLChpPXkwKHMsbCxuKSk+MD9pPXkwKHM9TWF0aC5mbG9vcihzL2kpKmksbD1NYXRoLmNlaWwobC9pKSppLG4pOmk8MCYmKGk9eTAocz1NYXRoLmNlaWwocyppKS9pLGw9TWF0aC5mbG9vcihsKmkpL2ksbikpLGk+MD8ocltvXT1NYXRoLmZsb29yKHMvaSkqaSxyW2FdPU1hdGguY2VpbChsL2kpKmksZShyKSk6aTwwJiYocltvXT1NYXRoLmNlaWwocyppKS9pLHJbYV09TWF0aC5mbG9vcihsKmkpL2ksZShyKSksdH0sdH1mdW5jdGlvbiBwNSh0LGUpe3ZhciBuLGk9MCxyPSh0PXQuc2xpY2UoKSkubGVuZ3RoLTEsbz10W2ldLGE9dFtyXTtyZXR1cm4gYTxvJiYobj1pLGk9cixyPW4sbj1vLG89YSxhPW4pLHRbaV09ZS5mbG9vcihvKSx0W3JdPWUuY2VpbChhKSx0fWZ1bmN0aW9uIGY1KHQsZSl7cmV0dXJuKGU9TWF0aC5sb2coZS90KSk/ZnVuY3Rpb24obil7cmV0dXJuIE1hdGgubG9nKG4vdCkvZX06VTIoZSl9ZnVuY3Rpb24gbTUodCxlKXtyZXR1cm4gdDwwP2Z1bmN0aW9uKG4pe3JldHVybi1NYXRoLnBvdygtZSxuKSpNYXRoLnBvdygtdCwxLW4pfTpmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5wb3coZSxuKSpNYXRoLnBvdyh0LDEtbil9fWZ1bmN0aW9uIGc1KHQpe3JldHVybiBpc0Zpbml0ZSh0KT8rKCIxZSIrdCk6dDwwPzA6dH1mdW5jdGlvbiBfNSh0KXtyZXR1cm4gMTA9PT10P2c1OnQ9PT1NYXRoLkU/TWF0aC5leHA6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucG93KHQsZSl9fWZ1bmN0aW9uIHk1KHQpe3JldHVybiB0PT09TWF0aC5FP01hdGgubG9nOjEwPT09dCYmTWF0aC5sb2cxMHx8Mj09PXQmJk1hdGgubG9nMnx8KHQ9TWF0aC5sb2codCksZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubG9nKGUpL3R9KX1mdW5jdGlvbiB2NSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuLXQoLWUpfX1mdW5jdGlvbiBiNSh0LGUpe3JldHVybiB0PDA/LU1hdGgucG93KC10LGUpOk1hdGgucG93KHQsZSl9ZnVuY3Rpb24geDUoKXt2YXIgdD0xLGU9JDIoKGZ1bmN0aW9uIG4oZSxpKXtyZXR1cm4oaT1iNShpLHQpLShlPWI1KGUsdCkpKT9mdW5jdGlvbihuKXtyZXR1cm4oYjUobix0KS1lKS9pfTpVMihpKX0pLChmdW5jdGlvbiBpKGUsbil7cmV0dXJuIG49YjUobix0KS0oZT1iNShlLHQpKSxmdW5jdGlvbihpKXtyZXR1cm4gYjUoZStuKmksMS90KX19KSkscj1lLmRvbWFpbjtyZXR1cm4gZS5leHBvbmVudD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rZSxyKHIoKSkpOnR9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBYMihlLHg1KCkuZXhwb25lbnQodCkpfSxkNShlKX0hKGZ1bmN0aW9uIHc1KHQpe3M1PShmdW5jdGlvbiBlKHQpe3ZhciBlPXZvaWQgMD09PXQuZ3JvdXBpbmd8fHZvaWQgMD09PXQudGhvdXNhbmRzP2E1OihmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSl7Zm9yKHZhciByPW4ubGVuZ3RoLG89W10sYT0wLHM9dFswXSxsPTA7cj4wJiZzPjAmJihsK3MrMT5pJiYocz1NYXRoLm1heCgxLGktbCkpLG8ucHVzaChuLnN1YnN0cmluZyhyLT1zLHIrcykpLCEoKGwrPXMrMSk+aSkpOylzPXRbYT0oYSsxKSV0Lmxlbmd0aF07cmV0dXJuIG8ucmV2ZXJzZSgpLmpvaW4oZSl9fSkodTUuY2FsbCh0Lmdyb3VwaW5nLE51bWJlciksdC50aG91c2FuZHMrIiIpLGk9dm9pZCAwPT09dC5jdXJyZW5jeT8iIjp0LmN1cnJlbmN5WzBdKyIiLHI9dm9pZCAwPT09dC5jdXJyZW5jeT8iIjp0LmN1cnJlbmN5WzFdKyIiLG89dm9pZCAwPT09dC5kZWNpbWFsPyIuIjp0LmRlY2ltYWwrIiIsYT12b2lkIDA9PT10Lm51bWVyYWxzP2E1OihmdW5jdGlvbiBzKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9bMC05XS9nLChmdW5jdGlvbihlKXtyZXR1cm4gdFsrZV19KSl9fSkodTUuY2FsbCh0Lm51bWVyYWxzLFN0cmluZykpLGw9dm9pZCAwPT09dC5wZXJjZW50PyIlIjp0LnBlcmNlbnQrIiIsYz12b2lkIDA9PT10Lm1pbnVzPyItIjp0Lm1pbnVzKyIiLHU9dm9pZCAwPT09dC5uYW4/Ik5hTiI6dC5uYW4rIiI7ZnVuY3Rpb24gaCh0KXt2YXIgbj0odD10NSh0KSkuZmlsbCxzPXQuYWxpZ24saD10LnNpZ24sZD10LnN5bWJvbCxwPXQuemVybyxmPXQud2lkdGgsbT10LmNvbW1hLGc9dC5wcmVjaXNpb24sXz10LnRyaW0seT10LnR5cGU7Im4iPT09eT8obT0hMCx5PSJnIik6aTVbeV18fCh2b2lkIDA9PT1nJiYoZz0xMiksXz0hMCx5PSJnIiksKHB8fCIwIj09PW4mJiI9Ij09PXMpJiYocD0hMCxuPSIwIixzPSI9Iik7dmFyIHY9IiQiPT09ZD9pOiIjIj09PWQmJi9bYm94WF0vLnRlc3QoeSk/IjAiK3kudG9Mb3dlckNhc2UoKToiIixiPSIkIj09PWQ/cjovWyVwXS8udGVzdCh5KT9sOiIiLHg9aTVbeV0sdz0vW2RlZmdwcnMlXS8udGVzdCh5KTtmdW5jdGlvbiBTKHQpe3ZhciBpLHIsbCxkPXYsUz1iO2lmKCJjIj09PXkpUz14KHQpK1MsdD0iIjtlbHNle3ZhciBNPSh0PSt0KTwwfHwxL3Q8MDtpZih0PWlzTmFOKHQpP3U6eChNYXRoLmFicyh0KSxnKSxfJiYodD0oZnVuY3Rpb24gRSh0KXt0OmZvcih2YXIgZSxuPXQubGVuZ3RoLGk9MSxyPS0xO2k8bjsrK2kpc3dpdGNoKHRbaV0pe2Nhc2UiLiI6cj1lPWk7YnJlYWs7Y2FzZSIwIjowPT09ciYmKHI9aSksZT1pO2JyZWFrO2RlZmF1bHQ6aWYoISt0W2ldKWJyZWFrIHQ7cj4wJiYocj0wKX1yZXR1cm4gcj4wP3Quc2xpY2UoMCxyKSt0LnNsaWNlKGUrMSk6dH0pKHQpKSxNJiYwPT0rdCYmIisiIT09aCYmKE09ITEpLGQ9KE0/IigiPT09aD9oOmM6Ii0iPT09aHx8IigiPT09aD8iIjpoKStkLFM9KCJzIj09PXk/aDVbOCtKMi8zXToiIikrUysoTSYmIigiPT09aD8iKSI6IiIpLHcpZm9yKGk9LTEscj10Lmxlbmd0aDsrK2k8cjspaWYoNDg+KGw9dC5jaGFyQ29kZUF0KGkpKXx8bD41Nyl7Uz0oNDY9PT1sP28rdC5zbGljZShpKzEpOnQuc2xpY2UoaSkpK1MsdD10LnNsaWNlKDAsaSk7YnJlYWt9fW0mJiFwJiYodD1lKHQsMS8wKSk7dmFyIFQ9ZC5sZW5ndGgrdC5sZW5ndGgrUy5sZW5ndGgsQz1UPGY/bmV3IEFycmF5KGYtVCsxKS5qb2luKG4pOiIiO3N3aXRjaChtJiZwJiYodD1lKEMrdCxDLmxlbmd0aD9mLVMubGVuZ3RoOjEvMCksQz0iIikscyl7Y2FzZSI8Ijp0PWQrdCtTK0M7YnJlYWs7Y2FzZSI9Ijp0PWQrQyt0K1M7YnJlYWs7Y2FzZSJeIjp0PUMuc2xpY2UoMCxUPUMubGVuZ3RoPj4xKStkK3QrUytDLnNsaWNlKFQpO2JyZWFrO2RlZmF1bHQ6dD1DK2QrdCtTfXJldHVybiBhKHQpfXJldHVybiBnPXZvaWQgMD09PWc/NjovW2dwcnNdLy50ZXN0KHkpP01hdGgubWF4KDEsTWF0aC5taW4oMjEsZykpOk1hdGgubWF4KDAsTWF0aC5taW4oMjAsZykpLFMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdCsiIn0sU31yZXR1cm57Zm9ybWF0OmgsZm9ybWF0UHJlZml4OmZ1bmN0aW9uIGQodCxlKXt2YXIgbj1oKCgodD10NSh0KSkudHlwZT0iZiIsdCkpLGk9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoWjIoZSkvMykpKSxyPU1hdGgucG93KDEwLC1pKSxvPWg1WzgraS8zXTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4ocip0KStvfX19fSkodCksbDU9czUuZm9ybWF0LGM1PXM1LmZvcm1hdFByZWZpeH0pKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXSxtaW51czoiLSJ9KTt2YXIgUzU9bmV3IERhdGUsTTU9bmV3IERhdGU7ZnVuY3Rpb24gRTUodCxlLG4saSl7ZnVuY3Rpb24gcihlKXtyZXR1cm4gdChlPTA9PT1hcmd1bWVudHMubGVuZ3RoP25ldyBEYXRlOm5ldyBEYXRlKCtlKSksZX1yZXR1cm4gci5mbG9vcj1mdW5jdGlvbihlKXtyZXR1cm4gdChlPW5ldyBEYXRlKCtlKSksZX0sci5jZWlsPWZ1bmN0aW9uKG4pe3JldHVybiB0KG49bmV3IERhdGUobi0xKSksZShuLDEpLHQobiksbn0sci5yb3VuZD1mdW5jdGlvbih0KXt2YXIgZT1yKHQpLG49ci5jZWlsKHQpO3JldHVybiB0LWU8bi10P2U6bn0sci5vZmZzZXQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZSh0PW5ldyBEYXRlKCt0KSxudWxsPT1uPzE6TWF0aC5mbG9vcihuKSksdH0sci5yYW5nZT1mdW5jdGlvbihuLGksbyl7dmFyIGEscz1bXTtpZihuPXIuY2VpbChuKSxvPW51bGw9PW8/MTpNYXRoLmZsb29yKG8pLCEobjxpJiZvPjApKXJldHVybiBzO2Rve3MucHVzaChhPW5ldyBEYXRlKCtuKSksZShuLG8pLHQobil9d2hpbGUoYTxuJiZuPGkpO3JldHVybiBzfSxyLmZpbHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gRTUoKGZ1bmN0aW9uKGUpe2lmKGU+PWUpZm9yKDt0KGUpLCFuKGUpOyllLnNldFRpbWUoZS0xKX0pLChmdW5jdGlvbih0LGkpe2lmKHQ+PXQpaWYoaTwwKWZvcig7KytpPD0wOylmb3IoO2UodCwtMSksIW4odCk7KTtlbHNlIGZvcig7LS1pPj0wOylmb3IoO2UodCwxKSwhbih0KTspO30pKX0sbiYmKHIuY291bnQ9ZnVuY3Rpb24oZSxpKXtyZXR1cm4gUzUuc2V0VGltZSgrZSksTTUuc2V0VGltZSgraSksdChTNSksdChNNSksTWF0aC5mbG9vcihuKFM1LE01KSl9LHIuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9yLmZpbHRlcihpP2Z1bmN0aW9uKGUpe3JldHVybiBpKGUpJXQ9PTB9OmZ1bmN0aW9uKGUpe3JldHVybiByLmNvdW50KDAsZSkldD09MH0pOnI6bnVsbH0pLHJ9dmFyIFQ1PUU1KChmdW5jdGlvbigpe30pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybiBlLXR9KSk7VDUuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9FNSgoZnVuY3Rpb24oZSl7ZS5zZXRUaW1lKE1hdGguZmxvb3IoZS90KSp0KX0pLChmdW5jdGlvbihlLG4pe2Uuc2V0VGltZSgrZStuKnQpfSksKGZ1bmN0aW9uKGUsbil7cmV0dXJuKG4tZSkvdH0pKTpUNTpudWxsfTt2YXIgQzU9VDUsQTU9MWUzLGs1PTZlNCxMNT0zNmU1LFA1PTg2NGU1LE41PTYwNDhlNSxJNT1FNSgoZnVuY3Rpb24odCl7dC5zZXRUaW1lKHQtdC5nZXRNaWxsaXNlY29uZHMoKSl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFRpbWUoK3QrZSpBNSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS9BNX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENTZWNvbmRzKCl9KSksUjU9RTUoKGZ1bmN0aW9uKHQpe3Quc2V0VGltZSh0LXQuZ2V0TWlsbGlzZWNvbmRzKCktdC5nZXRTZWNvbmRzKCkqQTUpfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UqazUpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvazV9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TWludXRlcygpfSkpLE81PUU1KChmdW5jdGlvbih0KXt0LnNldFRpbWUodC10LmdldE1pbGxpc2Vjb25kcygpLXQuZ2V0U2Vjb25kcygpKkE1LXQuZ2V0TWludXRlcygpKms1KX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKkw1KX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL0w1fSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEhvdXJzKCl9KSksejU9RTUoKGZ1bmN0aW9uKHQpe3Quc2V0SG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldERhdGUodC5nZXREYXRlKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10LShlLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSprNSkvUDV9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RGF0ZSgpLTF9KSk7ZnVuY3Rpb24gRDUodCl7cmV0dXJuIEU1KChmdW5jdGlvbihlKXtlLnNldERhdGUoZS5nZXREYXRlKCktKGUuZ2V0RGF5KCkrNy10KSU3KSxlLnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpKzcqZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10LShlLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSprNSkvTjV9KSl9dmFyIEI1PUQ1KDApLEg1PUQ1KDEpO0Q1KDIpLEQ1KDMpO3ZhciBGNT1ENSg0KTtENSg1KSxENSg2KTt2YXIgVjU9RTUoKGZ1bmN0aW9uKHQpe3Quc2V0RGF0ZSgxKSx0LnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRNb250aCh0LmdldE1vbnRoKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5nZXRNb250aCgpLXQuZ2V0TW9udGgoKSsxMiooZS5nZXRGdWxsWWVhcigpLXQuZ2V0RnVsbFllYXIoKSl9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TW9udGgoKX0pKSxVNT1FNSgoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldEZ1bGxZZWFyKHQuZ2V0RnVsbFllYXIoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybiBlLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KSk7VTUuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9FNSgoZnVuY3Rpb24oZSl7ZS5zZXRGdWxsWWVhcihNYXRoLmZsb29yKGUuZ2V0RnVsbFllYXIoKS90KSp0KSxlLnNldE1vbnRoKDAsMSksZS5zZXRIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbihlLG4pe2Uuc2V0RnVsbFllYXIoZS5nZXRGdWxsWWVhcigpK24qdCl9KSk6bnVsbH07dmFyIGo1PVU1LEc1PUU1KChmdW5jdGlvbih0KXt0LnNldFVUQ1NlY29uZHMoMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKms1KX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL2s1fSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01pbnV0ZXMoKX0pKSxXNT1FNSgoZnVuY3Rpb24odCl7dC5zZXRVVENNaW51dGVzKDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKkw1KX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL0w1fSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0hvdXJzKCl9KSkscTU9RTUoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS9QNX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENEYXRlKCktMX0pKTtmdW5jdGlvbiBZNSh0KXtyZXR1cm4gRTUoKGZ1bmN0aW9uKGUpe2Uuc2V0VVRDRGF0ZShlLmdldFVUQ0RhdGUoKS0oZS5nZXRVVENEYXkoKSs3LXQpJTcpLGUuc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrNyplKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL041fSkpfXZhciBYNT1ZNSgwKSwkNT1ZNSgxKTtZNSgyKSxZNSgzKTt2YXIgSzU9WTUoNCk7WTUoNSksWTUoNik7dmFyIFo1PUU1KChmdW5jdGlvbih0KXt0LnNldFVUQ0RhdGUoMSksdC5zZXRVVENIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VVRDTW9udGgodC5nZXRVVENNb250aCgpK2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZ2V0VVRDTW9udGgoKS10LmdldFVUQ01vbnRoKCkrMTIqKGUuZ2V0VVRDRnVsbFllYXIoKS10LmdldFVUQ0Z1bGxZZWFyKCkpfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01vbnRoKCl9KSksSjU9RTUoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTW9udGgoMCwxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRVVENGdWxsWWVhcih0LmdldFVUQ0Z1bGxZZWFyKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5nZXRVVENGdWxsWWVhcigpLXQuZ2V0VVRDRnVsbFllYXIoKX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENGdWxsWWVhcigpfSkpO0o1LmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PU1hdGguZmxvb3IodCkpJiZ0PjA/RTUoKGZ1bmN0aW9uKGUpe2Uuc2V0VVRDRnVsbFllYXIoTWF0aC5mbG9vcihlLmdldFVUQ0Z1bGxZZWFyKCkvdCkqdCksZS5zZXRVVENNb250aCgwLDEpLGUuc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24oZSxuKXtlLnNldFVUQ0Z1bGxZZWFyKGUuZ2V0VVRDRnVsbFllYXIoKStuKnQpfSkpOm51bGx9O3ZhciBRNT1KNTtmdW5jdGlvbiB0Myh0KXtpZigwPD10LnkmJnQueTwxMDApe3ZhciBlPW5ldyBEYXRlKC0xLHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKTtyZXR1cm4gZS5zZXRGdWxsWWVhcih0LnkpLGV9cmV0dXJuIG5ldyBEYXRlKHQueSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCl9ZnVuY3Rpb24gZTModCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgZT1uZXcgRGF0ZShEYXRlLlVUQygtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpO3JldHVybiBlLnNldFVUQ0Z1bGxZZWFyKHQueSksZX1yZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEModC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKSl9ZnVuY3Rpb24gbjModCxlLG4pe3JldHVybnt5OnQsbTplLGQ6bixIOjAsTTowLFM6MCxMOjB9fXZhciBpMyxyMyxvMyxhMz17Ii0iOiIiLF86IiAiLDA6IjAifSxzMz0vXlxzKlxkKy8sbDM9L14lLyxjMz0vW1xcXiQqKz98W1xdKCkue31dL2c7ZnVuY3Rpb24gdTModCxlLG4pe3ZhciBpPXQ8MD8iLSI6IiIscj0oaT8tdDp0KSsiIixvPXIubGVuZ3RoO3JldHVybiBpKyhvPG4/bmV3IEFycmF5KG4tbysxKS5qb2luKGUpK3I6cil9ZnVuY3Rpb24gaDModCl7cmV0dXJuIHQucmVwbGFjZShjMywiXFwkJiIpfWZ1bmN0aW9uIGQzKHQpe3JldHVybiBuZXcgUmVnRXhwKCJeKD86Iit0Lm1hcChoMykuam9pbigifCIpKyIpIiwiaSIpfWZ1bmN0aW9uIHAzKHQpe2Zvcih2YXIgZT17fSxuPS0xLGk9dC5sZW5ndGg7KytuPGk7KWVbdFtuXS50b0xvd2VyQ2FzZSgpXT1uO3JldHVybiBlfWZ1bmN0aW9uIGYzKHQsZSxuKXt2YXIgaT1zMy5leGVjKGUuc2xpY2UobixuKzEpKTtyZXR1cm4gaT8odC53PStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG0zKHQsZSxuKXt2YXIgaT1zMy5leGVjKGUuc2xpY2UobixuKzEpKTtyZXR1cm4gaT8odC51PStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGczKHQsZSxuKXt2YXIgaT1zMy5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5VPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIF8zKHQsZSxuKXt2YXIgaT1zMy5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5WPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHkzKHQsZSxuKXt2YXIgaT1zMy5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5XPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHYzKHQsZSxuKXt2YXIgaT1zMy5leGVjKGUuc2xpY2UobixuKzQpKTtyZXR1cm4gaT8odC55PStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGIzKHQsZSxuKXt2YXIgaT1zMy5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC55PStpWzBdKygraVswXT42OD8xOTAwOjJlMyksbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24geDModCxlLG4pe3ZhciBpPS9eKFopfChbKy1dXGRcZCkoPzo6PyhcZFxkKSk/Ly5leGVjKGUuc2xpY2UobixuKzYpKTtyZXR1cm4gaT8odC5aPWlbMV0/MDotKGlbMl0rKGlbM118fCIwMCIpKSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB3Myh0LGUsbil7dmFyIGk9czMuZXhlYyhlLnNsaWNlKG4sbisxKSk7cmV0dXJuIGk/KHQucT0zKmlbMF0tMyxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBTMyh0LGUsbil7dmFyIGk9czMuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQubT1pWzBdLTEsbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gTTModCxlLG4pe3ZhciBpPXMzLmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0LmQ9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gRTModCxlLG4pe3ZhciBpPXMzLmV4ZWMoZS5zbGljZShuLG4rMykpO3JldHVybiBpPyh0Lm09MCx0LmQ9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gVDModCxlLG4pe3ZhciBpPXMzLmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0Lkg9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gQzModCxlLG4pe3ZhciBpPXMzLmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0Lk09K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gQTModCxlLG4pe3ZhciBpPXMzLmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0LlM9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gazModCxlLG4pe3ZhciBpPXMzLmV4ZWMoZS5zbGljZShuLG4rMykpO3JldHVybiBpPyh0Lkw9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gTDModCxlLG4pe3ZhciBpPXMzLmV4ZWMoZS5zbGljZShuLG4rNikpO3JldHVybiBpPyh0Lkw9TWF0aC5mbG9vcihpWzBdLzFlMyksbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gUDModCxlLG4pe3ZhciBpPWwzLmV4ZWMoZS5zbGljZShuLG4rMSkpO3JldHVybiBpP24raVswXS5sZW5ndGg6LTF9ZnVuY3Rpb24gTjModCxlLG4pe3ZhciBpPXMzLmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIGk/KHQuUT0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBJMyh0LGUsbil7dmFyIGk9czMuZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC5zPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFIzKHQsZSl7cmV0dXJuIHUzKHQuZ2V0RGF0ZSgpLGUsMil9ZnVuY3Rpb24gTzModCxlKXtyZXR1cm4gdTModC5nZXRIb3VycygpLGUsMil9ZnVuY3Rpb24gejModCxlKXtyZXR1cm4gdTModC5nZXRIb3VycygpJTEyfHwxMixlLDIpfWZ1bmN0aW9uIEQzKHQsZSl7cmV0dXJuIHUzKDErejUuY291bnQoajUodCksdCksZSwzKX1mdW5jdGlvbiBCMyh0LGUpe3JldHVybiB1Myh0LmdldE1pbGxpc2Vjb25kcygpLGUsMyl9ZnVuY3Rpb24gSDModCxlKXtyZXR1cm4gQjModCxlKSsiMDAwIn1mdW5jdGlvbiBGMyh0LGUpe3JldHVybiB1Myh0LmdldE1vbnRoKCkrMSxlLDIpfWZ1bmN0aW9uIFYzKHQsZSl7cmV0dXJuIHUzKHQuZ2V0TWludXRlcygpLGUsMil9ZnVuY3Rpb24gVTModCxlKXtyZXR1cm4gdTModC5nZXRTZWNvbmRzKCksZSwyKX1mdW5jdGlvbiBqMyh0KXt2YXIgZT10LmdldERheSgpO3JldHVybiAwPT09ZT83OmV9ZnVuY3Rpb24gRzModCxlKXtyZXR1cm4gdTMoQjUuY291bnQoajUodCktMSx0KSxlLDIpfWZ1bmN0aW9uIFczKHQpe3ZhciBlPXQuZ2V0RGF5KCk7cmV0dXJuIGU+PTR8fDA9PT1lP0Y1KHQpOkY1LmNlaWwodCl9ZnVuY3Rpb24gcTModCxlKXtyZXR1cm4gdD1XMyh0KSx1MyhGNS5jb3VudChqNSh0KSx0KSsoND09PWo1KHQpLmdldERheSgpKSxlLDIpfWZ1bmN0aW9uIFkzKHQpe3JldHVybiB0LmdldERheSgpfWZ1bmN0aW9uIFgzKHQsZSl7cmV0dXJuIHUzKEg1LmNvdW50KGo1KHQpLTEsdCksZSwyKX1mdW5jdGlvbiAkMyh0LGUpe3JldHVybiB1Myh0LmdldEZ1bGxZZWFyKCklMTAwLGUsMil9ZnVuY3Rpb24gSzModCxlKXtyZXR1cm4gdTMoKHQ9VzModCkpLmdldEZ1bGxZZWFyKCklMTAwLGUsMil9ZnVuY3Rpb24gWjModCxlKXtyZXR1cm4gdTModC5nZXRGdWxsWWVhcigpJTFlNCxlLDQpfWZ1bmN0aW9uIEozKHQsZSl7dmFyIG49dC5nZXREYXkoKTtyZXR1cm4gdTMoKHQ9bj49NHx8MD09PW4/RjUodCk6RjUuY2VpbCh0KSkuZ2V0RnVsbFllYXIoKSUxZTQsZSw0KX1mdW5jdGlvbiBRMyh0KXt2YXIgZT10LmdldFRpbWV6b25lT2Zmc2V0KCk7cmV0dXJuKGU+MD8iLSI6KGUqPS0xLCIrIikpK3UzKGUvNjB8MCwiMCIsMikrdTMoZSU2MCwiMCIsMil9ZnVuY3Rpb24gdDQodCxlKXtyZXR1cm4gdTModC5nZXRVVENEYXRlKCksZSwyKX1mdW5jdGlvbiBlNCh0LGUpe3JldHVybiB1Myh0LmdldFVUQ0hvdXJzKCksZSwyKX1mdW5jdGlvbiBuNCh0LGUpe3JldHVybiB1Myh0LmdldFVUQ0hvdXJzKCklMTJ8fDEyLGUsMil9ZnVuY3Rpb24gaTQodCxlKXtyZXR1cm4gdTMoMStxNS5jb3VudChRNSh0KSx0KSxlLDMpfWZ1bmN0aW9uIHI0KHQsZSl7cmV0dXJuIHUzKHQuZ2V0VVRDTWlsbGlzZWNvbmRzKCksZSwzKX1mdW5jdGlvbiBvNCh0LGUpe3JldHVybiByNCh0LGUpKyIwMDAifWZ1bmN0aW9uIGE0KHQsZSl7cmV0dXJuIHUzKHQuZ2V0VVRDTW9udGgoKSsxLGUsMil9ZnVuY3Rpb24gczQodCxlKXtyZXR1cm4gdTModC5nZXRVVENNaW51dGVzKCksZSwyKX1mdW5jdGlvbiBsNCh0LGUpe3JldHVybiB1Myh0LmdldFVUQ1NlY29uZHMoKSxlLDIpfWZ1bmN0aW9uIGM0KHQpe3ZhciBlPXQuZ2V0VVRDRGF5KCk7cmV0dXJuIDA9PT1lPzc6ZX1mdW5jdGlvbiB1NCh0LGUpe3JldHVybiB1MyhYNS5jb3VudChRNSh0KS0xLHQpLGUsMil9ZnVuY3Rpb24gaDQodCl7dmFyIGU9dC5nZXRVVENEYXkoKTtyZXR1cm4gZT49NHx8MD09PWU/SzUodCk6SzUuY2VpbCh0KX1mdW5jdGlvbiBkNCh0LGUpe3JldHVybiB0PWg0KHQpLHUzKEs1LmNvdW50KFE1KHQpLHQpKyg0PT09UTUodCkuZ2V0VVRDRGF5KCkpLGUsMil9ZnVuY3Rpb24gcDQodCl7cmV0dXJuIHQuZ2V0VVRDRGF5KCl9ZnVuY3Rpb24gZjQodCxlKXtyZXR1cm4gdTMoJDUuY291bnQoUTUodCktMSx0KSxlLDIpfWZ1bmN0aW9uIG00KHQsZSl7cmV0dXJuIHUzKHQuZ2V0VVRDRnVsbFllYXIoKSUxMDAsZSwyKX1mdW5jdGlvbiBnNCh0LGUpe3JldHVybiB1MygodD1oNCh0KSkuZ2V0VVRDRnVsbFllYXIoKSUxMDAsZSwyKX1mdW5jdGlvbiBfNCh0LGUpe3JldHVybiB1Myh0LmdldFVUQ0Z1bGxZZWFyKCklMWU0LGUsNCl9ZnVuY3Rpb24geTQodCxlKXt2YXIgbj10LmdldFVUQ0RheSgpO3JldHVybiB1MygodD1uPj00fHwwPT09bj9LNSh0KTpLNS5jZWlsKHQpKS5nZXRVVENGdWxsWWVhcigpJTFlNCxlLDQpfWZ1bmN0aW9uIHY0KCl7cmV0dXJuIiswMDAwIn1mdW5jdGlvbiBiNCgpe3JldHVybiIlIn1mdW5jdGlvbiB4NCh0KXtyZXR1cm4rdH1mdW5jdGlvbiB3NCh0KXtyZXR1cm4gTWF0aC5mbG9vcigrdC8xZTMpfSEoZnVuY3Rpb24gUzQodCl7aTM9KGZ1bmN0aW9uIGUodCl7dmFyIGU9dC5kYXRlVGltZSxuPXQuZGF0ZSxpPXQudGltZSxyPXQucGVyaW9kcyxvPXQuZGF5cyxhPXQuc2hvcnREYXlzLHM9dC5tb250aHMsbD10LnNob3J0TW9udGhzLGM9ZDMociksdT1wMyhyKSxoPWQzKG8pLGQ9cDMobykscD1kMyhhKSxmPXAzKGEpLG09ZDMocyksZz1wMyhzKSxfPWQzKGwpLHk9cDMobCksdj17YTpmdW5jdGlvbiBiKHQpe3JldHVybiBhW3QuZ2V0RGF5KCldfSxBOmZ1bmN0aW9uIHgodCl7cmV0dXJuIG9bdC5nZXREYXkoKV19LGI6ZnVuY3Rpb24gdyh0KXtyZXR1cm4gbFt0LmdldE1vbnRoKCldfSxCOmZ1bmN0aW9uIFModCl7cmV0dXJuIHNbdC5nZXRNb250aCgpXX0sYzpudWxsLGQ6UjMsZTpSMyxmOkgzLGc6SzMsRzpKMyxIOk8zLEk6ejMsajpEMyxMOkIzLG06RjMsTTpWMyxwOmZ1bmN0aW9uIE0odCl7cmV0dXJuIHJbKyh0LmdldEhvdXJzKCk+PTEyKV19LHE6ZnVuY3Rpb24gRSh0KXtyZXR1cm4gMSt+fih0LmdldE1vbnRoKCkvMyl9LFE6eDQsczp3NCxTOlUzLHU6ajMsVTpHMyxWOnEzLHc6WTMsVzpYMyx4Om51bGwsWDpudWxsLHk6JDMsWTpaMyxaOlEzLCIlIjpiNH0sVD17YTpmdW5jdGlvbiBDKHQpe3JldHVybiBhW3QuZ2V0VVRDRGF5KCldfSxBOmZ1bmN0aW9uIEEodCl7cmV0dXJuIG9bdC5nZXRVVENEYXkoKV19LGI6ZnVuY3Rpb24gayh0KXtyZXR1cm4gbFt0LmdldFVUQ01vbnRoKCldfSxCOmZ1bmN0aW9uIEwodCl7cmV0dXJuIHNbdC5nZXRVVENNb250aCgpXX0sYzpudWxsLGQ6dDQsZTp0NCxmOm80LGc6ZzQsRzp5NCxIOmU0LEk6bjQsajppNCxMOnI0LG06YTQsTTpzNCxwOmZ1bmN0aW9uIFAodCl7cmV0dXJuIHJbKyh0LmdldFVUQ0hvdXJzKCk+PTEyKV19LHE6ZnVuY3Rpb24gTih0KXtyZXR1cm4gMSt+fih0LmdldFVUQ01vbnRoKCkvMyl9LFE6eDQsczp3NCxTOmw0LHU6YzQsVTp1NCxWOmQ0LHc6cDQsVzpmNCx4Om51bGwsWDpudWxsLHk6bTQsWTpfNCxaOnY0LCIlIjpiNH0sST17YTpmdW5jdGlvbiBSKHQsZSxuKXt2YXIgaT1wLmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIGk/KHQudz1mW2lbMF0udG9Mb3dlckNhc2UoKV0sbitpWzBdLmxlbmd0aCk6LTF9LEE6ZnVuY3Rpb24gTyh0LGUsbil7dmFyIGk9aC5leGVjKGUuc2xpY2UobikpO3JldHVybiBpPyh0Lnc9ZFtpWzBdLnRvTG93ZXJDYXNlKCldLG4raVswXS5sZW5ndGgpOi0xfSxiOmZ1bmN0aW9uIHoodCxlLG4pe3ZhciBpPV8uZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC5tPXlbaVswXS50b0xvd2VyQ2FzZSgpXSxuK2lbMF0ubGVuZ3RoKTotMX0sQjpmdW5jdGlvbiBEKHQsZSxuKXt2YXIgaT1tLmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIGk/KHQubT1nW2lbMF0udG9Mb3dlckNhc2UoKV0sbitpWzBdLmxlbmd0aCk6LTF9LGM6ZnVuY3Rpb24gQih0LG4saSl7cmV0dXJuIEcodCxlLG4saSl9LGQ6TTMsZTpNMyxmOkwzLGc6YjMsRzp2MyxIOlQzLEk6VDMsajpFMyxMOmszLG06UzMsTTpDMyxwOmZ1bmN0aW9uIEgodCxlLG4pe3ZhciBpPWMuZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC5wPXVbaVswXS50b0xvd2VyQ2FzZSgpXSxuK2lbMF0ubGVuZ3RoKTotMX0scTp3MyxROk4zLHM6STMsUzpBMyx1Om0zLFU6ZzMsVjpfMyx3OmYzLFc6eTMseDpmdW5jdGlvbiBGKHQsZSxpKXtyZXR1cm4gRyh0LG4sZSxpKX0sWDpmdW5jdGlvbiBWKHQsZSxuKXtyZXR1cm4gRyh0LGksZSxuKX0seTpiMyxZOnYzLFo6eDMsIiUiOlAzfTtmdW5jdGlvbiBVKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBpLHIsbyxhPVtdLHM9LTEsbD0wLGM9dC5sZW5ndGg7Zm9yKG4gaW5zdGFuY2VvZiBEYXRlfHwobj1uZXcgRGF0ZSgrbikpOysrczxjOykzNz09PXQuY2hhckNvZGVBdChzKSYmKGEucHVzaCh0LnNsaWNlKGwscykpLG51bGwhPShyPWEzW2k9dC5jaGFyQXQoKytzKV0pP2k9dC5jaGFyQXQoKytzKTpyPSJlIj09PWk/IiAiOiIwIiwobz1lW2ldKSYmKGk9byhuLHIpKSxhLnB1c2goaSksbD1zKzEpO3JldHVybiBhLnB1c2godC5zbGljZShsLHMpKSxhLmpvaW4oIiIpfX1mdW5jdGlvbiBqKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBpLHIsbz1uMygxOTAwLHZvaWQgMCwxKTtpZihHKG8sdCxuKz0iIiwwKSE9bi5sZW5ndGgpcmV0dXJuIG51bGw7aWYoIlEiaW4gbylyZXR1cm4gbmV3IERhdGUoby5RKTtpZigicyJpbiBvKXJldHVybiBuZXcgRGF0ZSgxZTMqby5zKygiTCJpbiBvP28uTDowKSk7aWYoZSYmISgiWiJpbiBvKSYmKG8uWj0wKSwicCJpbiBvJiYoby5IPW8uSCUxMisxMipvLnApLHZvaWQgMD09PW8ubSYmKG8ubT0icSJpbiBvP28ucTowKSwiViJpbiBvKXtpZihvLlY8MXx8by5WPjUzKXJldHVybiBudWxsOyJ3ImluIG98fChvLnc9MSksIloiaW4gbz8ocj0oaT1lMyhuMyhvLnksMCwxKSkpLmdldFVUQ0RheSgpLGk9cj40fHwwPT09cj8kNS5jZWlsKGkpOiQ1KGkpLGk9cTUub2Zmc2V0KGksNyooby5WLTEpKSxvLnk9aS5nZXRVVENGdWxsWWVhcigpLG8ubT1pLmdldFVUQ01vbnRoKCksby5kPWkuZ2V0VVRDRGF0ZSgpKyhvLncrNiklNyk6KHI9KGk9dDMobjMoby55LDAsMSkpKS5nZXREYXkoKSxpPXI+NHx8MD09PXI/SDUuY2VpbChpKTpINShpKSxpPXo1Lm9mZnNldChpLDcqKG8uVi0xKSksby55PWkuZ2V0RnVsbFllYXIoKSxvLm09aS5nZXRNb250aCgpLG8uZD1pLmdldERhdGUoKSsoby53KzYpJTcpfWVsc2UoIlciaW4gb3x8IlUiaW4gbykmJigidyJpbiBvfHwoby53PSJ1ImluIG8/by51JTc6IlciaW4gbz8xOjApLHI9IloiaW4gbz9lMyhuMyhvLnksMCwxKSkuZ2V0VVRDRGF5KCk6dDMobjMoby55LDAsMSkpLmdldERheSgpLG8ubT0wLG8uZD0iVyJpbiBvPyhvLncrNiklNys3Km8uVy0ocis1KSU3Om8udys3Km8uVS0ocis2KSU3KTtyZXR1cm4iWiJpbiBvPyhvLkgrPW8uWi8xMDB8MCxvLk0rPW8uWiUxMDAsZTMobykpOnQzKG8pfX1mdW5jdGlvbiBHKHQsZSxuLGkpe2Zvcih2YXIgcixvLGE9MCxzPWUubGVuZ3RoLGw9bi5sZW5ndGg7YTxzOyl7aWYoaT49bClyZXR1cm4tMTtpZigzNz09PShyPWUuY2hhckNvZGVBdChhKyspKSl7aWYocj1lLmNoYXJBdChhKyspLCEobz1JW3IgaW4gYTM/ZS5jaGFyQXQoYSsrKTpyXSl8fChpPW8odCxuLGkpKTwwKXJldHVybi0xfWVsc2UgaWYociE9bi5jaGFyQ29kZUF0KGkrKykpcmV0dXJuLTF9cmV0dXJuIGl9cmV0dXJuIHYueD1VKG4sdiksdi5YPVUoaSx2KSx2LmM9VShlLHYpLFQueD1VKG4sVCksVC5YPVUoaSxUKSxULmM9VShlLFQpLHtmb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIGU9VSh0Kz0iIix2KTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfSxwYXJzZTpmdW5jdGlvbih0KXt2YXIgZT1qKHQrPSIiLCExKTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfSx1dGNGb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIGU9VSh0Kz0iIixUKTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfSx1dGNQYXJzZTpmdW5jdGlvbih0KXt2YXIgZT1qKHQrPSIiLCEwKTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfX19KSh0KSxyMz1pMy5mb3JtYXQsbzM9aTMudXRjRm9ybWF0fSkoe2RhdGVUaW1lOiIleCwgJVgiLGRhdGU6IiUtbS8lLWQvJVkiLHRpbWU6IiUtSTolTTolUyAlcCIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTt2YXIgTTQ9MzE1MzZlNjtmdW5jdGlvbiBFNCh0KXtyZXR1cm4gbmV3IERhdGUodCl9ZnVuY3Rpb24gVDQodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlPyt0OituZXcgRGF0ZSgrdCl9ZnVuY3Rpb24gQzQodCxlLG4saSxyLG8sYSxzLGwpe3ZhciBjPSQyKFcyLE4yKSx1PWMuaW52ZXJ0LGg9Yy5kb21haW4sZD1sKCIuJUwiKSxwPWwoIjolUyIpLGY9bCgiJUk6JU0iKSxtPWwoIiVJICVwIiksZz1sKCIlYSAlZCIpLF89bCgiJWIgJWQiKSx5PWwoIiVCIiksdj1sKCIlWSIpLGI9W1thLDEsMWUzXSxbYSw1LDVlM10sW2EsMTUsMTVlM10sW2EsMzAsM2U0XSxbbywxLDZlNF0sW28sNSwzZTVdLFtvLDE1LDllNV0sW28sMzAsMThlNV0sW3IsMSwzNmU1XSxbciwzLDEwOGU1XSxbciw2LDIxNmU1XSxbciwxMiw0MzJlNV0sW2ksMSw4NjRlNV0sW2ksMiwxNzI4ZTVdLFtuLDEsNjA0OGU1XSxbZSwxLDI1OTJlNl0sW2UsMyw3Nzc2ZTZdLFt0LDEsTTRdXTtmdW5jdGlvbiB4KHMpe3JldHVybihhKHMpPHM/ZDpvKHMpPHM/cDpyKHMpPHM/ZjppKHMpPHM/bTplKHMpPHM/bihzKTxzP2c6Xzp0KHMpPHM/eTp2KShzKX1mdW5jdGlvbiB3KGUsbixpLHIpe2lmKG51bGw9PWUmJihlPTEwKSwibnVtYmVyIj09dHlwZW9mIGUpe3ZhciBvPU1hdGguYWJzKGktbikvZSxhPWgwKChmdW5jdGlvbih0KXtyZXR1cm4gdFsyXX0pKS5yaWdodChiLG8pO2E9PT1iLmxlbmd0aD8ocj12MChuL000LGkvTTQsZSksZT10KTphPyhyPShhPWJbby9iW2EtMV1bMl08YlthXVsyXS9vP2EtMTphXSlbMV0sZT1hWzBdKToocj1NYXRoLm1heCh2MChuLGksZSksMSksZT1zKX1yZXR1cm4gbnVsbD09cj9lOmUuZXZlcnkocil9cmV0dXJuIGMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRGF0ZSh1KHQpKX0sYy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/aChDMC5jYWxsKHQsVDQpKTpoKCkubWFwKEU0KX0sYy50aWNrcz1mdW5jdGlvbih0LGUpe3ZhciBuLGk9aCgpLHI9aVswXSxvPWlbaS5sZW5ndGgtMV0sYT1vPHI7cmV0dXJuIGEmJihuPXIscj1vLG89biksbj0obj13KHQscixvLGUpKT9uLnJhbmdlKHIsbysxKTpbXSxhP24ucmV2ZXJzZSgpOm59LGMudGlja0Zvcm1hdD1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT1lP3g6bChlKX0sYy5uaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIG49aCgpO3JldHVybih0PXcodCxuWzBdLG5bbi5sZW5ndGgtMV0sZSkpP2gocDUobix0KSk6Y30sYy5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFgyKGMsQzQodCxlLG4saSxyLG8sYSxzLGwpKX0sY31mdW5jdGlvbiBBNCh0KXtyZXR1cm4gdC5tYXRjaCgvLns2fS9nKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIjIit0fSkpfXZhciBrND1BNCgiMWY3N2I0ZmY3ZjBlMmNhMDJjZDYyNzI4OTQ2N2JkOGM1NjRiZTM3N2MyN2Y3ZjdmYmNiZDIyMTdiZWNmIiksTDQ9QTQoIjM5M2I3OTUyNTRhMzZiNmVjZjljOWVkZTYzNzkzOThjYTI1MmI1Y2Y2YmNlZGI5YzhjNmQzMWJkOWUzOWU3YmE1MmU3Y2I5NDg0M2MzOWFkNDk0YWQ2NjE2YmU3OTY5YzdiNDE3M2E1NTE5NGNlNmRiZGRlOWVkNiIpLFA0PUE0KCIzMTgyYmQ2YmFlZDY5ZWNhZTFjNmRiZWZlNjU1MGRmZDhkM2NmZGFlNmJmZGQwYTIzMWEzNTQ3NGM0NzZhMWQ5OWJjN2U5YzA3NTZiYjE5ZTlhYzhiY2JkZGNkYWRhZWI2MzYzNjM5Njk2OTZiZGJkYmRkOWQ5ZDkiKSxOND1BNCgiMWY3N2I0YWVjN2U4ZmY3ZjBlZmZiYjc4MmNhMDJjOThkZjhhZDYyNzI4ZmY5ODk2OTQ2N2JkYzViMGQ1OGM1NjRiYzQ5Yzk0ZTM3N2MyZjdiNmQyN2Y3ZjdmYzdjN2M3YmNiZDIyZGJkYjhkMTdiZWNmOWVkYWU1IiksSTQ9VjIoUzIoMzAwLC41LDApLFMyKC0yNDAsLjUsMSkpLFI0PVYyKFMyKC0xMDAsLjc1LC4zNSksUzIoODAsMS41LC44KSksTzQ9VjIoUzIoMjYwLC43NSwuMzUpLFMyKDgwLDEuNSwuOCkpLHo0PVMyKCk7ZnVuY3Rpb24gRDQodCl7dmFyIGU9dC5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0W01hdGgubWF4KDAsTWF0aC5taW4oZS0xLE1hdGguZmxvb3IobiplKSkpXX19dmFyIEI0PUQ0KEE0KCI0NDAxNTQ0NDAyNTY0NTA0NTc0NTA1NTk0NjA3NWE0NjA4NWM0NjBhNWQ0NjBiNWU0NzBkNjA0NzBlNjE0NzEwNjM0NzExNjQ0NzEzNjU0ODE0Njc0ODE2Njg0ODE3Njk0ODE4NmE0ODFhNmM0ODFiNmQ0ODFjNmU0ODFkNmY0ODFmNzA0ODIwNzE0ODIxNzM0ODIzNzQ0ODI0NzU0ODI1NzY0ODI2Nzc0ODI4Nzg0ODI5Nzk0NzJhN2E0NzJjN2E0NzJkN2I0NzJlN2M0NzJmN2Q0NjMwN2U0NjMyN2U0NjMzN2Y0NjM0ODA0NTM1ODE0NTM3ODE0NTM4ODI0NDM5ODM0NDNhODM0NDNiODQ0MzNkODQ0MzNlODU0MjNmODU0MjQwODY0MjQxODY0MTQyODc0MTQ0ODc0MDQ1ODg0MDQ2ODgzZjQ3ODgzZjQ4ODkzZTQ5ODkzZTRhODkzZTRjOGEzZDRkOGEzZDRlOGEzYzRmOGEzYzUwOGIzYjUxOGIzYjUyOGIzYTUzOGIzYTU0OGMzOTU1OGMzOTU2OGMzODU4OGMzODU5OGMzNzVhOGMzNzViOGQzNjVjOGQzNjVkOGQzNTVlOGQzNTVmOGQzNDYwOGQzNDYxOGQzMzYyOGQzMzYzOGQzMjY0OGUzMjY1OGUzMTY2OGUzMTY3OGUzMTY4OGUzMDY5OGUzMDZhOGUyZjZiOGUyZjZjOGUyZTZkOGUyZTZlOGUyZTZmOGUyZDcwOGUyZDcxOGUyYzcxOGUyYzcyOGUyYzczOGUyYjc0OGUyYjc1OGUyYTc2OGUyYTc3OGUyYTc4OGUyOTc5OGUyOTdhOGUyOTdiOGUyODdjOGUyODdkOGUyNzdlOGUyNzdmOGUyNzgwOGUyNjgxOGUyNjgyOGUyNjgyOGUyNTgzOGUyNTg0OGUyNTg1OGUyNDg2OGUyNDg3OGUyMzg4OGUyMzg5OGUyMzhhOGQyMjhiOGQyMjhjOGQyMjhkOGQyMThlOGQyMThmOGQyMTkwOGQyMTkxOGMyMDkyOGMyMDkyOGMyMDkzOGMxZjk0OGMxZjk1OGIxZjk2OGIxZjk3OGIxZjk4OGIxZjk5OGExZjlhOGExZTliOGExZTljODkxZTlkODkxZjllODkxZjlmODgxZmEwODgxZmExODgxZmExODcxZmEyODcyMGEzODYyMGE0ODYyMWE1ODUyMWE2ODUyMmE3ODUyMmE4ODQyM2E5ODMyNGFhODMyNWFiODIyNWFjODIyNmFkODEyN2FkODEyOGFlODAyOWFmN2YyYWIwN2YyY2IxN2UyZGIyN2QyZWIzN2MyZmI0N2MzMWI1N2IzMmI2N2EzNGI2NzkzNWI3NzkzN2I4NzgzOGI5NzczYWJhNzYzYmJiNzUzZGJjNzQzZmJjNzM0MGJkNzI0MmJlNzE0NGJmNzA0NmMwNmY0OGMxNmU0YWMxNmQ0Y2MyNmM0ZWMzNmI1MGM0NmE1MmM1Njk1NGM1Njg1NmM2Njc1OGM3NjU1YWM4NjQ1Y2M4NjM1ZWM5NjI2MGNhNjA2M2NiNWY2NWNiNWU2N2NjNWM2OWNkNWI2Y2NkNWE2ZWNlNTg3MGNmNTc3M2QwNTY3NWQwNTQ3N2QxNTM3YWQxNTE3Y2QyNTA3ZmQzNGU4MWQzNGQ4NGQ0NGI4NmQ1NDk4OWQ1NDg4YmQ2NDY4ZWQ2NDU5MGQ3NDM5M2Q3NDE5NWQ4NDA5OGQ4M2U5YmQ5M2M5ZGQ5M2JhMGRhMzlhMmRhMzdhNWRiMzZhOGRiMzRhYWRjMzJhZGRjMzBiMGRkMmZiMmRkMmRiNWRlMmJiOGRlMjliYWRlMjhiZGRmMjZjMGRmMjVjMmRmMjNjNWUwMjFjOGUwMjBjYWUxMWZjZGUxMWRkMGUxMWNkMmUyMWJkNWUyMWFkOGUyMTlkYWUzMTlkZGUzMThkZmUzMThlMmU0MThlNWU0MTllN2U0MTllYWU1MWFlY2U1MWJlZmU1MWNmMWU1MWRmNGU2MWVmNmU2MjBmOGU2MjFmYmU3MjNmZGU3MjUiKSksSDQ9RDQoQTQoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwOTAyMDIwYjAyMDIwZDAzMDMwZjAzMDMxMjA0MDQxNDA1MDQxNjA2MDUxODA2MDUxYTA3MDYxYzA4MDcxZTA5MDcyMDBhMDgyMjBiMDkyNDBjMDkyNjBkMGEyOTBlMGIyYjEwMGIyZDExMGMyZjEyMGQzMTEzMGQzNDE0MGUzNjE1MGUzODE2MGYzYjE4MGYzZDE5MTAzZjFhMTA0MjFjMTA0NDFkMTE0NzFlMTE0OTIwMTE0YjIxMTE0ZTIyMTE1MDI0MTI1MzI1MTI1NTI3MTI1ODI5MTE1YTJhMTE1YzJjMTE1ZjJkMTE2MTJmMTE2MzMxMTE2NTMzMTA2NzM0MTA2OTM2MTA2YjM4MTA2YzM5MGY2ZTNiMGY3MDNkMGY3MTNmMGY3MjQwMGY3NDQyMGY3NTQ0MGY3NjQ1MTA3NzQ3MTA3ODQ5MTA3ODRhMTA3OTRjMTE3YTRlMTE3YjRmMTI3YjUxMTI3YzUyMTM3YzU0MTM3ZDU2MTQ3ZDU3MTU3ZTU5MTU3ZTVhMTY3ZTVjMTY3ZjVkMTc3ZjVmMTg3ZjYwMTg4MDYyMTk4MDY0MWE4MDY1MWE4MDY3MWI4MDY4MWM4MTZhMWM4MTZiMWQ4MTZkMWQ4MTZlMWU4MTcwMWY4MTcyMWY4MTczMjA4MTc1MjE4MTc2MjE4MTc4MjI4MTc5MjI4MjdiMjM4MjdjMjM4MjdlMjQ4MjgwMjU4MjgxMjU4MTgzMjY4MTg0MjY4MTg2Mjc4MTg4Mjc4MTg5Mjg4MThiMjk4MThjMjk4MThlMmE4MTkwMmE4MTkxMmI4MTkzMmI4MDk0MmM4MDk2MmM4MDk4MmQ4MDk5MmQ4MDliMmU3ZjljMmU3ZjllMmY3ZmEwMmY3ZmExMzA3ZWEzMzA3ZWE1MzE3ZWE2MzE3ZGE4MzI3ZGFhMzM3ZGFiMzM3Y2FkMzQ3Y2FlMzQ3YmIwMzU3YmIyMzU3YmIzMzY3YWI1MzY3YWI3Mzc3OWI4Mzc3OWJhMzg3OGJjMzk3OGJkMzk3N2JmM2E3N2MwM2E3NmMyM2I3NWM0M2M3NWM1M2M3NGM3M2Q3M2M4M2U3M2NhM2U3MmNjM2Y3MWNkNDA3MWNmNDA3MGQwNDE2ZmQyNDI2ZmQzNDM2ZWQ1NDQ2ZGQ2NDU2Y2Q4NDU2Y2Q5NDY2YmRiNDc2YWRjNDg2OWRlNDk2OGRmNGE2OGUwNGM2N2UyNGQ2NmUzNGU2NWU0NGY2NGU1NTA2NGU3NTI2M2U4NTM2MmU5NTQ2MmVhNTY2MWViNTc2MGVjNTg2MGVkNWE1ZmVlNWI1ZWVmNWQ1ZWYwNWY1ZWYxNjA1ZGYyNjI1ZGYyNjQ1Y2YzNjU1Y2Y0Njc1Y2Y0Njk1Y2Y1NmI1Y2Y2NmM1Y2Y2NmU1Y2Y3NzA1Y2Y3NzI1Y2Y4NzQ1Y2Y4NzY1Y2Y5Nzg1ZGY5Nzk1ZGY5N2I1ZGZhN2Q1ZWZhN2Y1ZWZhODE1ZmZiODM1ZmZiODU2MGZiODc2MWZjODk2MWZjOGE2MmZjOGM2M2ZjOGU2NGZjOTA2NWZkOTI2NmZkOTQ2N2ZkOTY2OGZkOTg2OWZkOWE2YWZkOWI2YmZlOWQ2Y2ZlOWY2ZGZlYTE2ZWZlYTM2ZmZlYTU3MWZlYTc3MmZlYTk3M2ZlYWE3NGZlYWM3NmZlYWU3N2ZlYjA3OGZlYjI3YWZlYjQ3YmZlYjY3Y2ZlYjc3ZWZlYjk3ZmZlYmI4MWZlYmQ4MmZlYmY4NGZlYzE4NWZlYzI4N2ZlYzQ4OGZlYzY4YWZlYzg4Y2ZlY2E4ZGZlY2M4ZmZlY2Q5MGZlY2Y5MmZlZDE5NGZlZDM5NWZlZDU5N2ZlZDc5OWZlZDg5YWZkZGE5Y2ZkZGM5ZWZkZGVhMGZkZTBhMWZkZTJhM2ZkZTNhNWZkZTVhN2ZkZTdhOWZkZTlhYWZkZWJhY2ZjZWNhZWZjZWViMGZjZjBiMmZjZjJiNGZjZjRiNmZjZjZiOGZjZjdiOWZjZjliYmZjZmJiZGZjZmRiZiIpKSxGND1ENChBNCgiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTBhMDIwMjBjMDIwMjBlMDMwMjEwMDQwMzEyMDQwMzE0MDUwNDE3MDYwNDE5MDcwNTFiMDgwNTFkMDkwNjFmMGEwNzIyMGIwNzI0MGMwODI2MGQwODI5MGUwOTJiMTAwOTJkMTEwYTMwMTIwYTMyMTQwYjM0MTUwYjM3MTYwYjM5MTgwYzNjMTkwYzNlMWIwYzQxMWMwYzQzMWUwYzQ1MWYwYzQ4MjEwYzRhMjMwYzRjMjQwYzRmMjYwYzUxMjgwYjUzMjkwYjU1MmIwYjU3MmQwYjU5MmYwYTViMzEwYTVjMzIwYTVlMzQwYTVmMzYwOTYxMzgwOTYyMzkwOTYzM2IwOTY0M2QwOTY1M2UwOTY2NDAwYTY3NDIwYTY4NDQwYTY4NDUwYTY5NDcwYjZhNDkwYjZhNGEwYzZiNGMwYzZiNGQwZDZjNGYwZDZjNTEwZTZjNTIwZTZkNTQwZjZkNTUwZjZkNTcxMDZlNTkxMDZlNWExMTZlNWMxMjZlNWQxMjZlNWYxMzZlNjExMzZlNjIxNDZlNjQxNTZlNjUxNTZlNjcxNjZlNjkxNjZlNmExNzZlNmMxODZlNmQxODZlNmYxOTZlNzExOTZlNzIxYTZlNzQxYTZlNzUxYjZlNzcxYzZkNzgxYzZkN2ExZDZkN2MxZDZkN2QxZTZkN2YxZTZjODAxZjZjODIyMDZjODQyMDZiODUyMTZiODcyMTZiODgyMjZhOGEyMjZhOGMyMzY5OGQyMzY5OGYyNDY5OTAyNTY4OTIyNTY4OTMyNjY3OTUyNjY3OTcyNzY2OTgyNzY2OWEyODY1OWIyOTY0OWQyOTY0OWYyYTYzYTAyYTYzYTIyYjYyYTMyYzYxYTUyYzYwYTYyZDYwYTgyZTVmYTkyZTVlYWIyZjVlYWQzMDVkYWUzMDVjYjAzMTViYjEzMjVhYjMzMjVhYjQzMzU5YjYzNDU4YjczNTU3YjkzNTU2YmEzNjU1YmMzNzU0YmQzODUzYmYzOTUyYzAzYTUxYzEzYTUwYzMzYjRmYzQzYzRlYzYzZDRkYzczZTRjYzgzZjRiY2E0MDRhY2I0MTQ5Y2M0MjQ4Y2U0MzQ3Y2Y0NDQ2ZDA0NTQ1ZDI0NjQ0ZDM0NzQzZDQ0ODQyZDU0YTQxZDc0YjNmZDg0YzNlZDk0ZDNkZGE0ZTNjZGI1MDNiZGQ1MTNhZGU1MjM4ZGY1MzM3ZTA1NTM2ZTE1NjM1ZTI1NzM0ZTM1OTMzZTQ1YTMxZTU1YzMwZTY1ZDJmZTc1ZTJlZTg2MDJkZTk2MTJiZWE2MzJhZWI2NDI5ZWI2NjI4ZWM2NzI2ZWQ2OTI1ZWU2YTI0ZWY2YzIzZWY2ZTIxZjA2ZjIwZjE3MTFmZjE3MzFkZjI3NDFjZjM3NjFiZjM3ODE5ZjQ3OTE4ZjU3YjE3ZjU3ZDE1ZjY3ZTE0ZjY4MDEzZjc4MjEyZjc4NDEwZjg4NTBmZjg4NzBlZjg4OTBjZjk4YjBiZjk4YzBhZjk4ZTA5ZmE5MDA4ZmE5MjA3ZmE5NDA3ZmI5NjA2ZmI5NzA2ZmI5OTA2ZmI5YjA2ZmI5ZDA3ZmM5ZjA3ZmNhMTA4ZmNhMzA5ZmNhNTBhZmNhNjBjZmNhODBkZmNhYTBmZmNhYzExZmNhZTEyZmNiMDE0ZmNiMjE2ZmNiNDE4ZmJiNjFhZmJiODFkZmJiYTFmZmJiYzIxZmJiZTIzZmFjMDI2ZmFjMjI4ZmFjNDJhZmFjNjJkZjljNzJmZjljOTMyZjljYjM1ZjhjZDM3ZjhjZjNhZjdkMTNkZjdkMzQwZjZkNTQzZjZkNzQ2ZjVkOTQ5ZjVkYjRjZjRkZDRmZjRkZjUzZjRlMTU2ZjNlMzVhZjNlNTVkZjJlNjYxZjJlODY1ZjJlYTY5ZjFlYzZkZjFlZDcxZjFlZjc1ZjFmMTc5ZjJmMjdkZjJmNDgyZjNmNTg2ZjNmNjhhZjRmODhlZjVmOTkyZjZmYTk2ZjhmYjlhZjlmYzlkZmFmZGExZmNmZmE0IikpLFY0PUQ0KEE0KCIwZDA4ODcxMDA3ODgxMzA3ODkxNjA3OGExOTA2OGMxYjA2OGQxZDA2OGUyMDA2OGYyMjA2OTAyNDA2OTEyNjA1OTEyODA1OTIyYTA1OTMyYzA1OTQyZTA1OTUyZjA1OTYzMTA1OTczMzA1OTczNTA0OTgzNzA0OTkzODA0OWEzYTA0OWEzYzA0OWIzZTA0OWMzZjA0OWM0MTA0OWQ0MzAzOWU0NDAzOWU0NjAzOWY0ODAzOWY0OTAzYTA0YjAzYTE0YzAyYTE0ZTAyYTI1MDAyYTI1MTAyYTM1MzAyYTM1NTAyYTQ1NjAxYTQ1ODAxYTQ1OTAxYTU1YjAxYTU1YzAxYTY1ZTAxYTY2MDAxYTY2MTAwYTc2MzAwYTc2NDAwYTc2NjAwYTc2NzAwYTg2OTAwYTg2YTAwYTg2YzAwYTg2ZTAwYTg2ZjAwYTg3MTAwYTg3MjAxYTg3NDAxYTg3NTAxYTg3NzAxYTg3ODAxYTg3YTAyYTg3YjAyYTg3ZDAzYTg3ZTAzYTg4MDA0YTg4MTA0YTc4MzA1YTc4NDA1YTc4NjA2YTY4NzA3YTY4ODA4YTY4YTA5YTU4YjBhYTU4ZDBiYTU4ZTBjYTQ4ZjBkYTQ5MTBlYTM5MjBmYTM5NDEwYTI5NTExYTE5NjEzYTE5ODE0YTA5OTE1OWY5YTE2OWY5YzE3OWU5ZDE4OWQ5ZTE5OWRhMDFhOWNhMTFiOWJhMjFkOWFhMzFlOWFhNTFmOTlhNjIwOThhNzIxOTdhODIyOTZhYTIzOTVhYjI0OTRhYzI2OTRhZDI3OTNhZTI4OTJiMDI5OTFiMTJhOTBiMjJiOGZiMzJjOGViNDJlOGRiNTJmOGNiNjMwOGJiNzMxOGFiODMyODliYTMzODhiYjM0ODhiYzM1ODdiZDM3ODZiZTM4ODViZjM5ODRjMDNhODNjMTNiODJjMjNjODFjMzNkODBjNDNlN2ZjNTQwN2VjNjQxN2RjNzQyN2NjODQzN2JjOTQ0N2FjYTQ1N2FjYjQ2NzljYzQ3NzhjYzQ5NzdjZDRhNzZjZTRiNzVjZjRjNzRkMDRkNzNkMTRlNzJkMjRmNzFkMzUxNzFkNDUyNzBkNTUzNmZkNTU0NmVkNjU1NmRkNzU2NmNkODU3NmJkOTU4NmFkYTVhNmFkYTViNjlkYjVjNjhkYzVkNjdkZDVlNjZkZTVmNjVkZTYxNjRkZjYyNjNlMDYzNjNlMTY0NjJlMjY1NjFlMjY2NjBlMzY4NWZlNDY5NWVlNTZhNWRlNTZiNWRlNjZjNWNlNzZlNWJlNzZmNWFlODcwNTllOTcxNThlOTcyNTdlYTc0NTdlYjc1NTZlYjc2NTVlYzc3NTRlZDc5NTNlZDdhNTJlZTdiNTFlZjdjNTFlZjdlNTBmMDdmNGZmMDgwNGVmMTgxNGRmMTgzNGNmMjg0NGJmMzg1NGJmMzg3NGFmNDg4NDlmNDg5NDhmNThiNDdmNThjNDZmNjhkNDVmNjhmNDRmNzkwNDRmNzkxNDNmNzkzNDJmODk0NDFmODk1NDBmOTk3M2ZmOTk4M2VmOTlhM2VmYTliM2RmYTljM2NmYTllM2JmYjlmM2FmYmExMzlmYmEyMzhmY2EzMzhmY2E1MzdmY2E2MzZmY2E4MzVmY2E5MzRmZGFiMzNmZGFjMzNmZGFlMzJmZGFmMzFmZGIxMzBmZGIyMmZmZGI0MmZmZGI1MmVmZWI3MmRmZWI4MmNmZWJhMmNmZWJiMmJmZWJkMmFmZWJlMmFmZWMwMjlmZGMyMjlmZGMzMjhmZGM1MjdmZGM2MjdmZGM4MjdmZGNhMjZmZGNiMjZmY2NkMjVmY2NlMjVmY2QwMjVmY2QyMjVmYmQzMjRmYmQ1MjRmYmQ3MjRmYWQ4MjRmYWRhMjRmOWRjMjRmOWRkMjVmOGRmMjVmOGUxMjVmN2UyMjVmN2U0MjVmNmU2MjZmNmU4MjZmNWU5MjZmNWViMjdmNGVkMjdmM2VlMjdmM2YwMjdmMmYyMjdmMWY0MjZmMWY1MjVmMGY3MjRmMGY5MjEiKSksVTQ9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLGo0PXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDpVNCx4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyJ9O2Z1bmN0aW9uIEc0KHQpe3ZhciBlPXQrPSIiLG49ZS5pbmRleE9mKCI6Iik7cmV0dXJuIG4+PTAmJiJ4bWxucyIhPT0oZT10LnNsaWNlKDAsbikpJiYodD10LnNsaWNlKG4rMSkpLGo0Lmhhc093blByb3BlcnR5KGUpP3tzcGFjZTpqNFtlXSxsb2NhbDp0fTp0fWZ1bmN0aW9uIFc0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMub3duZXJEb2N1bWVudCxuPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBuPT09VTQmJmUuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PVU0P2UuY3JlYXRlRWxlbWVudCh0KTplLmNyZWF0ZUVsZW1lbnROUyhuLHQpfX1mdW5jdGlvbiBxNCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBZNCh0KXt2YXIgZT1HNCh0KTtyZXR1cm4oZS5sb2NhbD9xNDpXNCkoZSl9ZnVuY3Rpb24gWDQoKXt9ZnVuY3Rpb24gJDQodCl7cmV0dXJuIG51bGw9PXQ/WDQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpfX1mdW5jdGlvbiBLNCgpe3JldHVybltdfWZ1bmN0aW9uIFo0KHQpe3JldHVybiBudWxsPT10P0s0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbCh0KX19dmFyIEo0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hdGNoZXModCl9fTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KXt2YXIgUTQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2lmKCFRNC5tYXRjaGVzKXt2YXIgdDY9UTQud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxRNC5tc01hdGNoZXNTZWxlY3Rvcnx8UTQubW96TWF0Y2hlc1NlbGVjdG9yfHxRNC5vTWF0Y2hlc1NlbGVjdG9yO0o0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0Ni5jYWxsKHRoaXMsdCl9fX19dmFyIGU2PUo0O2Z1bmN0aW9uIG42KHQpe3JldHVybiBuZXcgQXJyYXkodC5sZW5ndGgpfWZ1bmN0aW9uIGk2KHQsZSl7dGhpcy5vd25lckRvY3VtZW50PXQub3duZXJEb2N1bWVudCx0aGlzLm5hbWVzcGFjZVVSST10Lm5hbWVzcGFjZVVSSSx0aGlzLl9uZXh0PW51bGwsdGhpcy5fcGFyZW50PXQsdGhpcy5fX2RhdGFfXz1lfWZ1bmN0aW9uIHI2KHQsZSxuLGkscixvKXtmb3IodmFyIGEscz0wLGw9ZS5sZW5ndGgsYz1vLmxlbmd0aDtzPGM7KytzKShhPWVbc10pPyhhLl9fZGF0YV9fPW9bc10saVtzXT1hKTpuW3NdPW5ldyBpNih0LG9bc10pO2Zvcig7czxsOysrcykoYT1lW3NdKSYmKHJbc109YSl9ZnVuY3Rpb24gbzYodCxlLG4saSxyLG8sYSl7dmFyIHMsbCxjLHU9e30saD1lLmxlbmd0aCxkPW8ubGVuZ3RoLHA9bmV3IEFycmF5KGgpO2ZvcihzPTA7czxoOysrcykobD1lW3NdKSYmKHBbc109Yz0iJCIrYS5jYWxsKGwsbC5fX2RhdGFfXyxzLGUpLGMgaW4gdT9yW3NdPWw6dVtjXT1sKTtmb3Iocz0wO3M8ZDsrK3MpKGw9dVtjPSIkIithLmNhbGwodCxvW3NdLHMsbyldKT8oaVtzXT1sLGwuX19kYXRhX189b1tzXSx1W2NdPW51bGwpOm5bc109bmV3IGk2KHQsb1tzXSk7Zm9yKHM9MDtzPGg7KytzKShsPWVbc10pJiZ1W3Bbc11dPT09bCYmKHJbc109bCl9ZnVuY3Rpb24gYTYodCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOnQ+PWU/MDpOYU59ZnVuY3Rpb24gczYodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIGw2KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gYzYodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZSh0LGUpfX1mdW5jdGlvbiB1Nih0LGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGUpfX1mdW5jdGlvbiBoNih0LGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PW4/dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCk6dGhpcy5zZXRBdHRyaWJ1dGUodCxuKX19ZnVuY3Rpb24gZDYodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTp0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxuKX19ZnVuY3Rpb24gcDYodCl7cmV0dXJuIHQub3duZXJEb2N1bWVudCYmdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx0LmRvY3VtZW50JiZ0fHx0LmRlZmF1bHRWaWV3fWZ1bmN0aW9uIGY2KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fWZ1bmN0aW9uIG02KHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsZSxuKX19ZnVuY3Rpb24gZzYodCxlLG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBpPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWk/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsaSxuKX19ZnVuY3Rpb24gXzYodCxlKXtyZXR1cm4gdC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKGUpfHxwNih0KS5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShlKX1mdW5jdGlvbiB5Nih0KXtyZXR1cm4gZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t0XX19ZnVuY3Rpb24gdjYodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzW3RdPWV9fWZ1bmN0aW9uIGI2KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj9kZWxldGUgdGhpc1t0XTp0aGlzW3RdPW59fWZ1bmN0aW9uIHg2KHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiB3Nih0KXtyZXR1cm4gdC5jbGFzc0xpc3R8fG5ldyBTNih0KX1mdW5jdGlvbiBTNih0KXt0aGlzLl9ub2RlPXQsdGhpcy5fbmFtZXM9eDYodC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX1mdW5jdGlvbiBNNih0LGUpe2Zvcih2YXIgbj13Nih0KSxpPS0xLHI9ZS5sZW5ndGg7KytpPHI7KW4uYWRkKGVbaV0pfWZ1bmN0aW9uIEU2KHQsZSl7Zm9yKHZhciBuPXc2KHQpLGk9LTEscj1lLmxlbmd0aDsrK2k8cjspbi5yZW1vdmUoZVtpXSl9ZnVuY3Rpb24gVDYodCl7cmV0dXJuIGZ1bmN0aW9uKCl7TTYodGhpcyx0KX19ZnVuY3Rpb24gQzYodCl7cmV0dXJuIGZ1bmN0aW9uKCl7RTYodGhpcyx0KX19ZnVuY3Rpb24gQTYodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXsoZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk/TTY6RTYpKHRoaXMsdCl9fWZ1bmN0aW9uIGs2KCl7dGhpcy50ZXh0Q29udGVudD0iIn1mdW5jdGlvbiBMNih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fWZ1bmN0aW9uIFA2KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09ZT8iIjplfX1mdW5jdGlvbiBONigpe3RoaXMuaW5uZXJIVE1MPSIifWZ1bmN0aW9uIEk2KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPXR9fWZ1bmN0aW9uIFI2KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaW5uZXJIVE1MPW51bGw9PWU/IiI6ZX19ZnVuY3Rpb24gTzYoKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gejYoKXt0aGlzLnByZXZpb3VzU2libGluZyYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKX1mdW5jdGlvbiBENigpe3JldHVybiBudWxsfWZ1bmN0aW9uIEI2KCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gSDYoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZSghMSksdGhpcy5uZXh0U2libGluZyl9ZnVuY3Rpb24gRjYoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZSghMCksdGhpcy5uZXh0U2libGluZyl9aTYucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjppNixhcHBlbmRDaGlsZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LHRoaXMuX25leHQpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LGUpfSxxdWVyeVNlbGVjdG9yOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3Rvcih0KX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCl9fSxTNi5wcm90b3R5cGU9e2FkZDpmdW5jdGlvbih0KXt0aGlzLl9uYW1lcy5pbmRleE9mKHQpPDAmJih0aGlzLl9uYW1lcy5wdXNoKHQpLHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5fbmFtZXMuam9pbigiICIpKSl9LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9uYW1lcy5pbmRleE9mKHQpO2U+PTAmJih0aGlzLl9uYW1lcy5zcGxpY2UoZSwxKSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxjb250YWluczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZih0KT49MH19O3ZhciBWNj17fSxVNj1udWxsO2Z1bmN0aW9uIGo2KHQsZSxuKXtyZXR1cm4gdD1HNih0LGUsbiksZnVuY3Rpb24oZSl7dmFyIG49ZS5yZWxhdGVkVGFyZ2V0O24mJihuPT09dGhpc3x8OCZuLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpKXx8dC5jYWxsKHRoaXMsZSl9fWZ1bmN0aW9uIEc2KHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIHI9VTY7VTY9aTt0cnl7dC5jYWxsKHRoaXMsdGhpcy5fX2RhdGFfXyxlLG4pfWZpbmFsbHl7VTY9cn19fWZ1bmN0aW9uIFc2KHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlPSIiLG49dC5pbmRleE9mKCIuIik7cmV0dXJuIG4+PTAmJihlPXQuc2xpY2UobisxKSx0PXQuc2xpY2UoMCxuKSkse3R5cGU6dCxuYW1lOmV9fSkpfWZ1bmN0aW9uIHE2KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuX19vbjtpZihlKXtmb3IodmFyIG4saT0wLHI9LTEsbz1lLmxlbmd0aDtpPG87KytpKW49ZVtpXSx0LnR5cGUmJm4udHlwZSE9PXQudHlwZXx8bi5uYW1lIT09dC5uYW1lP2VbKytyXT1uOnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLnR5cGUsbi5saXN0ZW5lcixuLmNhcHR1cmUpOysrcj9lLmxlbmd0aD1yOmRlbGV0ZSB0aGlzLl9fb259fX1mdW5jdGlvbiBZNih0LGUsbil7dmFyIGk9VjYuaGFzT3duUHJvcGVydHkodC50eXBlKT9qNjpHNjtyZXR1cm4gZnVuY3Rpb24ocixvLGEpe3ZhciBzLGw9dGhpcy5fX29uLGM9aShlLG8sYSk7aWYobClmb3IodmFyIHU9MCxoPWwubGVuZ3RoO3U8aDsrK3UpaWYoKHM9bFt1XSkudHlwZT09PXQudHlwZSYmcy5uYW1lPT09dC5uYW1lKXJldHVybiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIocy50eXBlLHMubGlzdGVuZXIscy5jYXB0dXJlKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIocy50eXBlLHMubGlzdGVuZXI9YyxzLmNhcHR1cmU9biksdm9pZChzLnZhbHVlPWUpO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LnR5cGUsYyxuKSxzPXt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSx2YWx1ZTplLGxpc3RlbmVyOmMsY2FwdHVyZTpufSxsP2wucHVzaChzKTp0aGlzLl9fb249W3NdfX1mdW5jdGlvbiBYNih0LGUsbil7dmFyIGk9cDYodCkscj1pLkN1c3RvbUV2ZW50OyJmdW5jdGlvbiI9PXR5cGVvZiByP3I9bmV3IHIoZSxuKToocj1pLmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLG4/KHIuaW5pdEV2ZW50KGUsbi5idWJibGVzLG4uY2FuY2VsYWJsZSksci5kZXRhaWw9bi5kZXRhaWwpOnIuaW5pdEV2ZW50KGUsITEsITEpKSx0LmRpc3BhdGNoRXZlbnQocil9ZnVuY3Rpb24gJDYodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gWDYodGhpcyx0LGUpfX1mdW5jdGlvbiBLNih0LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBYNih0aGlzLHQsZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX0idW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiYoIm9ubW91c2VlbnRlciJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fChWNj17bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9KSk7dmFyIFo2PVtudWxsXTtmdW5jdGlvbiBKNih0LGUpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9ZX1mdW5jdGlvbiBRNigpe3JldHVybiBuZXcgSjYoW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSxaNil9ZnVuY3Rpb24gdDkodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P25ldyBKNihbW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCldXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IEo2KFtbdF1dLFo2KX1KNi5wcm90b3R5cGU9UTYucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpKNixzZWxlY3Q6ZnVuY3Rpb24gZTkodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PSQ0KHQpKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49ZS5sZW5ndGgsaT1uZXcgQXJyYXkobikscj0wO3I8bjsrK3IpZm9yKHZhciBvLGEscz1lW3JdLGw9cy5sZW5ndGgsYz1pW3JdPW5ldyBBcnJheShsKSx1PTA7dTxsOysrdSkobz1zW3VdKSYmKGE9dC5jYWxsKG8sby5fX2RhdGFfXyx1LHMpKSYmKCJfX2RhdGFfXyJpbiBvJiYoYS5fX2RhdGFfXz1vLl9fZGF0YV9fKSxjW3VdPWEpO3JldHVybiBuZXcgSjYoaSx0aGlzLl9wYXJlbnRzKX0sc2VsZWN0QWxsOmZ1bmN0aW9uIG45KHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1aNCh0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9W10scj1bXSxvPTA7bzxuOysrbylmb3IodmFyIGEscz1lW29dLGw9cy5sZW5ndGgsYz0wO2M8bDsrK2MpKGE9c1tjXSkmJihpLnB1c2godC5jYWxsKGEsYS5fX2RhdGFfXyxjLHMpKSxyLnB1c2goYSkpO3JldHVybiBuZXcgSjYoaSxyKX0sZmlsdGVyOmZ1bmN0aW9uIGk5KHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1lNih0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWZvcih2YXIgbyxhPWVbcl0scz1hLmxlbmd0aCxsPWlbcl09W10sYz0wO2M8czsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmbC5wdXNoKG8pO3JldHVybiBuZXcgSjYoaSx0aGlzLl9wYXJlbnRzKX0sZGF0YTpmdW5jdGlvbiByOSh0LGUpe2lmKCF0KXJldHVybiBmPW5ldyBBcnJheSh0aGlzLnNpemUoKSksdT0tMSx0aGlzLmVhY2goKGZ1bmN0aW9uKHQpe2ZbKyt1XT10fSkpLGY7dmFyIG49ZT9vNjpyNixpPXRoaXMuX3BhcmVudHMscj10aGlzLl9ncm91cHM7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PShmdW5jdGlvbiBvKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0pKHQpKTtmb3IodmFyIGE9ci5sZW5ndGgscz1uZXcgQXJyYXkoYSksbD1uZXcgQXJyYXkoYSksYz1uZXcgQXJyYXkoYSksdT0wO3U8YTsrK3Upe3ZhciBoPWlbdV0sZD1yW3VdLHA9ZC5sZW5ndGgsZj10LmNhbGwoaCxoJiZoLl9fZGF0YV9fLHUsaSksbT1mLmxlbmd0aCxnPWxbdV09bmV3IEFycmF5KG0pLF89c1t1XT1uZXcgQXJyYXkobSk7bihoLGQsZyxfLGNbdV09bmV3IEFycmF5KHApLGYsZSk7Zm9yKHZhciB5LHYsYj0wLHg9MDtiPG07KytiKWlmKHk9Z1tiXSl7Zm9yKGI+PXgmJih4PWIrMSk7ISh2PV9beF0pJiYrK3g8bTspO3kuX25leHQ9dnx8bnVsbH19cmV0dXJuKHM9bmV3IEo2KHMsaSkpLl9lbnRlcj1sLHMuX2V4aXQ9YyxzfSxlbnRlcjpmdW5jdGlvbiBvOSgpe3JldHVybiBuZXcgSjYodGhpcy5fZW50ZXJ8fHRoaXMuX2dyb3Vwcy5tYXAobjYpLHRoaXMuX3BhcmVudHMpfSxleGl0OmZ1bmN0aW9uIGE5KCl7cmV0dXJuIG5ldyBKNih0aGlzLl9leGl0fHx0aGlzLl9ncm91cHMubWFwKG42KSx0aGlzLl9wYXJlbnRzKX0sbWVyZ2U6ZnVuY3Rpb24gczkodCl7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPXQuX2dyb3VwcyxpPWUubGVuZ3RoLHI9TWF0aC5taW4oaSxuLmxlbmd0aCksbz1uZXcgQXJyYXkoaSksYT0wO2E8cjsrK2EpZm9yKHZhciBzLGw9ZVthXSxjPW5bYV0sdT1sLmxlbmd0aCxoPW9bYV09bmV3IEFycmF5KHUpLGQ9MDtkPHU7KytkKShzPWxbZF18fGNbZF0pJiYoaFtkXT1zKTtmb3IoO2E8aTsrK2Epb1thXT1lW2FdO3JldHVybiBuZXcgSjYobyx0aGlzLl9wYXJlbnRzKX0sb3JkZXI6ZnVuY3Rpb24gbDkoKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLGU9LTEsbj10Lmxlbmd0aDsrK2U8bjspZm9yKHZhciBpLHI9dFtlXSxvPXIubGVuZ3RoLTEsYT1yW29dOy0tbz49MDspKGk9cltvXSkmJihhJiZhIT09aS5uZXh0U2libGluZyYmYS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShpLGEpLGE9aSk7cmV0dXJuIHRoaXN9LHNvcnQ6ZnVuY3Rpb24gYzkodCl7ZnVuY3Rpb24gZShlLG4pe3JldHVybiBlJiZuP3QoZS5fX2RhdGFfXyxuLl9fZGF0YV9fKTohZS0hbn10fHwodD1hNik7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxpPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGkpLG89MDtvPGk7KytvKXtmb3IodmFyIGEscz1uW29dLGw9cy5sZW5ndGgsYz1yW29dPW5ldyBBcnJheShsKSx1PTA7dTxsOysrdSkoYT1zW3VdKSYmKGNbdV09YSk7Yy5zb3J0KGUpfXJldHVybiBuZXcgSjYocix0aGlzLl9wYXJlbnRzKS5vcmRlcigpfSxjYWxsOmZ1bmN0aW9uIHU5KCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMF09dGhpcyx0LmFwcGx5KG51bGwsYXJndW1lbnRzKSx0aGlzfSxub2RlczpmdW5jdGlvbiBoOSgpe3ZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSksZT0tMTtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3RbKytlXT10aGlzfSkpLHR9LG5vZGU6ZnVuY3Rpb24gZDkoKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLGU9MCxuPXQubGVuZ3RoO2U8bjsrK2UpZm9yKHZhciBpPXRbZV0scj0wLG89aS5sZW5ndGg7cjxvOysrcil7dmFyIGE9aVtyXTtpZihhKXJldHVybiBhfXJldHVybiBudWxsfSxzaXplOmZ1bmN0aW9uIHA5KCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpeysrdH0pKSx0fSxlbXB0eTpmdW5jdGlvbiBmOSgpe3JldHVybiF0aGlzLm5vZGUoKX0sZWFjaDpmdW5jdGlvbiBtOSh0KXtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49MCxpPWUubGVuZ3RoO248aTsrK24pZm9yKHZhciByLG89ZVtuXSxhPTAscz1vLmxlbmd0aDthPHM7KythKShyPW9bYV0pJiZ0LmNhbGwocixyLl9fZGF0YV9fLGEsbyk7cmV0dXJuIHRoaXN9LGF0dHI6ZnVuY3Rpb24gZzkodCxlKXt2YXIgbj1HNCh0KTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciBpPXRoaXMubm9kZSgpO3JldHVybiBuLmxvY2FsP2kuZ2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsKTppLmdldEF0dHJpYnV0ZShuKX1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1lP24ubG9jYWw/bDY6czY6ImZ1bmN0aW9uIj09dHlwZW9mIGU/bi5sb2NhbD9kNjpoNjpuLmxvY2FsP3U2OmM2KShuLGUpKX0sc3R5bGU6ZnVuY3Rpb24gXzkodCxlLG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKChudWxsPT1lP2Y2OiJmdW5jdGlvbiI9PXR5cGVvZiBlP2c2Om02KSh0LGUsbnVsbD09bj8iIjpuKSk6XzYodGhpcy5ub2RlKCksdCl9LHByb3BlcnR5OmZ1bmN0aW9uIHk5KHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PWU/eTY6ImZ1bmN0aW9uIj09dHlwZW9mIGU/YjY6djYpKHQsZSkpOnRoaXMubm9kZSgpW3RdfSxjbGFzc2VkOmZ1bmN0aW9uIHY5KHQsZSl7dmFyIG49eDYodCsiIik7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodmFyIGk9dzYodGhpcy5ub2RlKCkpLHI9LTEsbz1uLmxlbmd0aDsrK3I8bzspaWYoIWkuY29udGFpbnMobltyXSkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIGU/QTY6ZT9UNjpDNikobixlKSl9LHRleHQ6ZnVuY3Rpb24gYjkodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKG51bGw9PXQ/azY6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P1A2Okw2KSh0KSk6dGhpcy5ub2RlKCkudGV4dENvbnRlbnR9LGh0bWw6ZnVuY3Rpb24geDkodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKG51bGw9PXQ/TjY6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P1I2Okk2KSh0KSk6dGhpcy5ub2RlKCkuaW5uZXJIVE1MfSxyYWlzZTpmdW5jdGlvbiB3OSgpe3JldHVybiB0aGlzLmVhY2goTzYpfSxsb3dlcjpmdW5jdGlvbiBTOSgpe3JldHVybiB0aGlzLmVhY2goejYpfSxhcHBlbmQ6ZnVuY3Rpb24gTTkodCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpZNCh0KTtyZXR1cm4gdGhpcy5zZWxlY3QoKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSkpfSxpbnNlcnQ6ZnVuY3Rpb24gRTkodCxlKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Olk0KHQpLGk9bnVsbD09ZT9ENjoiZnVuY3Rpb24iPT10eXBlb2YgZT9lOiQ0KGUpO3JldHVybiB0aGlzLnNlbGVjdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUobi5hcHBseSh0aGlzLGFyZ3VtZW50cyksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSkpfSxyZW1vdmU6ZnVuY3Rpb24gVDkoKXtyZXR1cm4gdGhpcy5lYWNoKEI2KX0sY2xvbmU6ZnVuY3Rpb24gQzkodCl7cmV0dXJuIHRoaXMuc2VsZWN0KHQ/RjY6SDYpfSxkYXR1bTpmdW5jdGlvbiBBOSh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsdCk6dGhpcy5ub2RlKCkuX19kYXRhX199LG9uOmZ1bmN0aW9uIGs5KHQsZSxuKXt2YXIgaSxyLG89VzYodCsiIiksYT1vLmxlbmd0aDtpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2ZvcihzPWU/WTY6cTYsbnVsbD09biYmKG49ITEpLGk9MDtpPGE7KytpKXRoaXMuZWFjaChzKG9baV0sZSxuKSk7cmV0dXJuIHRoaXN9dmFyIHM9dGhpcy5ub2RlKCkuX19vbjtpZihzKWZvcih2YXIgbCxjPTAsdT1zLmxlbmd0aDtjPHU7KytjKWZvcihpPTAsbD1zW2NdO2k8YTsrK2kpaWYoKHI9b1tpXSkudHlwZT09PWwudHlwZSYmci5uYW1lPT09bC5uYW1lKXJldHVybiBsLnZhbHVlfSxkaXNwYXRjaDpmdW5jdGlvbiBMOSh0LGUpe3JldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBlP0s2OiQ2KSh0LGUpKX19O3ZhciBQOT0wO2Z1bmN0aW9uIE45KCl7cmV0dXJuIG5ldyBJOX1mdW5jdGlvbiBJOSgpe3RoaXMuXz0iQCIrKCsrUDkpLnRvU3RyaW5nKDM2KX1mdW5jdGlvbiBSOSgpe2Zvcih2YXIgdCxlPVU2O3Q9ZS5zb3VyY2VFdmVudDspZT10O3JldHVybiBlfWZ1bmN0aW9uIE85KHQsZSl7dmFyIG49dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYobi5jcmVhdGVTVkdQb2ludCl7dmFyIGk9bi5jcmVhdGVTVkdQb2ludCgpO3JldHVybiBpLng9ZS5jbGllbnRYLGkueT1lLmNsaWVudFksWyhpPWkubWF0cml4VHJhbnNmb3JtKHQuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSkueCxpLnldfXZhciByPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW2UuY2xpZW50WC1yLmxlZnQtdC5jbGllbnRMZWZ0LGUuY2xpZW50WS1yLnRvcC10LmNsaWVudFRvcF19STkucHJvdG90eXBlPU45LnByb3RvdHlwZT17Y29uc3RydWN0b3I6STksZ2V0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl87IShlIGluIHQpOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHRbZV19LHNldDpmdW5jdGlvbih0LGUpe3JldHVybiB0W3RoaXMuX109ZX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl8gaW4gdCYmZGVsZXRlIHRbdGhpcy5fXX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX07dmFyIHo5PU1hdGguUEksRDk9Mip6OSxCOT0xZS02LEg5PUQ5LUI5O2Z1bmN0aW9uIEY5KCl7dGhpcy5feDA9dGhpcy5feTA9dGhpcy5feDE9dGhpcy5feTE9bnVsbCx0aGlzLl89IiJ9ZnVuY3Rpb24gVjkoKXtyZXR1cm4gbmV3IEY5fWZ1bmN0aW9uIFU5KHQpe3JldHVybiBmdW5jdGlvbiBlKCl7cmV0dXJuIHR9fUY5LnByb3RvdHlwZT1WOS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkY5LG1vdmVUbzpmdW5jdGlvbih0LGUpe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rZSl9LGNsb3NlUGF0aDpmdW5jdGlvbigpe251bGwhPT10aGlzLl94MSYmKHRoaXMuX3gxPXRoaXMuX3gwLHRoaXMuX3kxPXRoaXMuX3kwLHRoaXMuXys9IloiKX0sbGluZVRvOmZ1bmN0aW9uKHQsZSl7dGhpcy5fKz0iTCIrKHRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kxPStlKX0scXVhZHJhdGljQ3VydmVUbzpmdW5jdGlvbih0LGUsbixpKXt0aGlzLl8rPSJRIisgK3QrIiwiKyArZSsiLCIrKHRoaXMuX3gxPStuKSsiLCIrKHRoaXMuX3kxPStpKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LGUsbixpLHIsbyl7dGhpcy5fKz0iQyIrICt0KyIsIisgK2UrIiwiKyArbisiLCIrICtpKyIsIisodGhpcy5feDE9K3IpKyIsIisodGhpcy5feTE9K28pfSxhcmNUbzpmdW5jdGlvbih0LGUsbixpLHIpe3ZhciBvPXRoaXMuX3gxLGE9dGhpcy5feTEscz0obj0rbiktKHQ9K3QpLGw9KGk9K2kpLShlPStlKSxjPW8tdCx1PWEtZSxoPWMqYyt1KnU7aWYoKHI9K3IpPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIrcik7aWYobnVsbD09PXRoaXMuX3gxKXRoaXMuXys9Ik0iKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPWUpO2Vsc2UgaWYoaD5COSlpZihNYXRoLmFicyh1KnMtbCpjKT5COSYmcil7dmFyIGQ9bi1vLHA9aS1hLGY9cypzK2wqbCxtPWQqZCtwKnAsZz1NYXRoLnNxcnQoZiksXz1NYXRoLnNxcnQoaCkseT1yKk1hdGgudGFuKCh6OS1NYXRoLmFjb3MoKGYraC1tKS8oMipnKl8pKSkvMiksdj15L18sYj15L2c7TWF0aC5hYnModi0xKT5COSYmKHRoaXMuXys9IkwiKyh0K3YqYykrIiwiKyhlK3YqdSkpLHRoaXMuXys9IkEiK3IrIiwiK3IrIiwwLDAsIisgKyh1KmQ+YypwKSsiLCIrKHRoaXMuX3gxPXQrYipzKSsiLCIrKHRoaXMuX3kxPWUrYipsKX1lbHNlIHRoaXMuXys9IkwiKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPWUpfSxhcmM6ZnVuY3Rpb24odCxlLG4saSxyLG8pe3Q9K3QsZT0rZSxvPSEhbzt2YXIgYT0obj0rbikqTWF0aC5jb3MoaSkscz1uKk1hdGguc2luKGkpLGw9dCthLGM9ZStzLHU9MV5vLGg9bz9pLXI6ci1pO2lmKG48MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIituKTtudWxsPT09dGhpcy5feDE/dGhpcy5fKz0iTSIrbCsiLCIrYzooTWF0aC5hYnModGhpcy5feDEtbCk+Qjl8fE1hdGguYWJzKHRoaXMuX3kxLWMpPkI5KSYmKHRoaXMuXys9IkwiK2wrIiwiK2MpLG4mJihoPDAmJihoPWglRDkrRDkpLGg+SDk/dGhpcy5fKz0iQSIrbisiLCIrbisiLDAsMSwiK3UrIiwiKyh0LWEpKyIsIisoZS1zKSsiQSIrbisiLCIrbisiLDAsMSwiK3UrIiwiKyh0aGlzLl94MT1sKSsiLCIrKHRoaXMuX3kxPWMpOmg+QjkmJih0aGlzLl8rPSJBIituKyIsIituKyIsMCwiKyArKGg+PXo5KSsiLCIrdSsiLCIrKHRoaXMuX3gxPXQrbipNYXRoLmNvcyhyKSkrIiwiKyh0aGlzLl95MT1lK24qTWF0aC5zaW4ocikpKSl9LHJlY3Q6ZnVuY3Rpb24odCxlLG4saSl7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStlKSsiaCIrICtuKyJ2IisgK2krImgiKy1uKyJaIn0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX07dmFyIGo5PU1hdGguYWJzLEc5PU1hdGguYXRhbjIsVzk9TWF0aC5jb3MscTk9TWF0aC5tYXgsWTk9TWF0aC5taW4sWDk9TWF0aC5zaW4sJDk9TWF0aC5zcXJ0LEs5PTFlLTEyLFo5PU1hdGguUEksSjk9WjkvMixROT0yKlo5O2Z1bmN0aW9uIHQ4KHQpe3JldHVybiB0PjE/MDp0PC0xP1o5Ok1hdGguYWNvcyh0KX1mdW5jdGlvbiBlOCh0KXtyZXR1cm4gdD49MT9KOTp0PD0tMT8tSjk6TWF0aC5hc2luKHQpfWZ1bmN0aW9uIG44KHQpe3JldHVybiB0LmlubmVyUmFkaXVzfWZ1bmN0aW9uIGk4KHQpe3JldHVybiB0Lm91dGVyUmFkaXVzfWZ1bmN0aW9uIHI4KHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gbzgodCl7cmV0dXJuIHQuZW5kQW5nbGV9ZnVuY3Rpb24gYTgodCl7cmV0dXJuIHQmJnQucGFkQW5nbGV9ZnVuY3Rpb24gczgodCxlLG4saSxyLG8sYSxzKXt2YXIgbD1uLXQsYz1pLWUsdT1hLXIsaD1zLW8sZD0odSooZS1vKS1oKih0LXIpKS8oaCpsLXUqYyk7cmV0dXJuW3QrZCpsLGUrZCpjXX1mdW5jdGlvbiBsOCh0LGUsbixpLHIsbyxhKXt2YXIgcz10LW4sbD1lLWksYz0oYT9vOi1vKS8kOShzKnMrbCpsKSx1PWMqbCxoPS1jKnMsZD10K3UscD1lK2gsZj1uK3UsbT1pK2gsZz0oZCtmKS8yLF89KHArbSkvMix5PWYtZCx2PW0tcCxiPXkqeSt2KnYseD1yLW8sdz1kKm0tZipwLFM9KHY8MD8tMToxKSokOShxOSgwLHgqeCpiLXcqdykpLE09KHcqdi15KlMpL2IsRT0oLXcqeS12KlMpL2IsVD0odyp2K3kqUykvYixDPSgtdyp5K3YqUykvYixBPU0tZyxrPUUtXyxMPVQtZyxQPUMtXztyZXR1cm4gQSpBK2sqaz5MKkwrUCpQJiYoTT1ULEU9Qykse2N4Ok0sY3k6RSx4MDE6LXUseTAxOi1oLHgxMTpNKihyL3gtMSkseTExOkUqKHIveC0xKX19ZnVuY3Rpb24gYzgodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIHU4KHQpe3JldHVybiBuZXcgYzgodCl9ZnVuY3Rpb24gaDgodCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gZDgodCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gcDgoKXt2YXIgdD1oOCxlPWQ4LG49VTkoITApLGk9bnVsbCxyPXU4LG89bnVsbDtmdW5jdGlvbiBhKGEpe3ZhciBzLGwsYyx1PWEubGVuZ3RoLGg9ITE7Zm9yKG51bGw9PWkmJihvPXIoYz1WOSgpKSkscz0wO3M8PXU7KytzKSEoczx1JiZuKGw9YVtzXSxzLGEpKT09PWgmJigoaD0haCk/by5saW5lU3RhcnQoKTpvLmxpbmVFbmQoKSksaCYmby5wb2ludCgrdChsLHMsYSksK2UobCxzLGEpKTtpZihjKXJldHVybiBvPW51bGwsYysiInx8bnVsbH1yZXR1cm4gYS54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6VTkoK2UpLGEpOnR9LGEueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlU5KCt0KSxhKTplfSxhLmRlZmluZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpVOSghIXQpLGEpOm59LGEuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxudWxsIT1pJiYobz1yKGkpKSxhKTpyfSxhLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/aT1vPW51bGw6bz1yKGk9dCksYSk6aX0sYX1mdW5jdGlvbiBmOCgpe3ZhciB0PWg4LGU9bnVsbCxuPVU5KDApLGk9ZDgscj1VOSghMCksbz1udWxsLGE9dTgscz1udWxsO2Z1bmN0aW9uIGwobCl7dmFyIGMsdSxoLGQscCxmPWwubGVuZ3RoLG09ITEsZz1uZXcgQXJyYXkoZiksXz1uZXcgQXJyYXkoZik7Zm9yKG51bGw9PW8mJihzPWEocD1WOSgpKSksYz0wO2M8PWY7KytjKXtpZighKGM8ZiYmcihkPWxbY10sYyxsKSk9PT1tKWlmKG09IW0pdT1jLHMuYXJlYVN0YXJ0KCkscy5saW5lU3RhcnQoKTtlbHNle2ZvcihzLmxpbmVFbmQoKSxzLmxpbmVTdGFydCgpLGg9Yy0xO2g+PXU7LS1oKXMucG9pbnQoZ1toXSxfW2hdKTtzLmxpbmVFbmQoKSxzLmFyZWFFbmQoKX1tJiYoZ1tjXT0rdChkLGMsbCksX1tjXT0rbihkLGMsbCkscy5wb2ludChlPytlKGQsYyxsKTpnW2NdLGk/K2koZCxjLGwpOl9bY10pKX1pZihwKXJldHVybiBzPW51bGwscCsiInx8bnVsbH1mdW5jdGlvbiBjKCl7cmV0dXJuIHA4KCkuZGVmaW5lZChyKS5jdXJ2ZShhKS5jb250ZXh0KG8pfXJldHVybiBsLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpVOSgrbiksZT1udWxsLGwpOnR9LGwueDA9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpVOSgrZSksbCk6dH0sbC54MT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpVOSgrdCksbCk6ZX0sbC55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VTkoK3QpLGk9bnVsbCxsKTpufSxsLnkwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VTkoK3QpLGwpOm59LGwueTE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VTkoK3QpLGwpOml9LGwubGluZVgwPWwubGluZVkwPWZ1bmN0aW9uKCl7cmV0dXJuIGMoKS54KHQpLnkobil9LGwubGluZVkxPWZ1bmN0aW9uKCl7cmV0dXJuIGMoKS54KHQpLnkoaSl9LGwubGluZVgxPWZ1bmN0aW9uKCl7cmV0dXJuIGMoKS54KGUpLnkobil9LGwuZGVmaW5lZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlU5KCEhdCksbCk6cn0sbC5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT10LG51bGwhPW8mJihzPWEobykpLGwpOmF9LGwuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9vPXM9bnVsbDpzPWEobz10KSxsKTpvfSxsfWZ1bmN0aW9uIG04KHQsZSl7cmV0dXJuIGU8dD8tMTplPnQ/MTplPj10PzA6TmFOfWZ1bmN0aW9uIGc4KHQpe3JldHVybiB0fWM4LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsZSk7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7ZGVmYXVsdDp0aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpfX19O3ZhciBfOD12OCh1OCk7ZnVuY3Rpb24geTgodCl7dGhpcy5fY3VydmU9dH1mdW5jdGlvbiB2OCh0KXtmdW5jdGlvbiBlKGUpe3JldHVybiBuZXcgeTgodChlKSl9cmV0dXJuIGUuX2N1cnZlPXQsZX1mdW5jdGlvbiBiOCh0KXt2YXIgZT10LmN1cnZlO3JldHVybiB0LmFuZ2xlPXQueCxkZWxldGUgdC54LHQucmFkaXVzPXQueSxkZWxldGUgdC55LHQuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/ZSh2OCh0KSk6ZSgpLl9jdXJ2ZX0sdH1mdW5jdGlvbiB4OCgpe3JldHVybiBiOChwOCgpLmN1cnZlKF84KSl9ZnVuY3Rpb24gdzgoKXt2YXIgdD1mOCgpLmN1cnZlKF84KSxlPXQuY3VydmUsbj10LmxpbmVYMCxpPXQubGluZVgxLHI9dC5saW5lWTAsbz10LmxpbmVZMTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnN0YXJ0QW5nbGU9dC54MCxkZWxldGUgdC54MCx0LmVuZEFuZ2xlPXQueDEsZGVsZXRlIHQueDEsdC5yYWRpdXM9dC55LGRlbGV0ZSB0LnksdC5pbm5lclJhZGl1cz10LnkwLGRlbGV0ZSB0LnkwLHQub3V0ZXJSYWRpdXM9dC55MSxkZWxldGUgdC55MSx0LmxpbmVTdGFydEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIGI4KG4oKSl9LGRlbGV0ZSB0LmxpbmVYMCx0LmxpbmVFbmRBbmdsZT1mdW5jdGlvbigpe3JldHVybiBiOChpKCkpfSxkZWxldGUgdC5saW5lWDEsdC5saW5lSW5uZXJSYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gYjgocigpKX0sZGVsZXRlIHQubGluZVkwLHQubGluZU91dGVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIGI4KG8oKSl9LGRlbGV0ZSB0LmxpbmVZMSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UodjgodCkpOmUoKS5fY3VydmV9LHR9ZnVuY3Rpb24gUzgodCxlKXtyZXR1cm5bKGU9K2UpKk1hdGguY29zKHQtPU1hdGguUEkvMiksZSpNYXRoLnNpbih0KV19eTgucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5hcmVhU3RhcnQoKX0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmFyZWFFbmQoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5saW5lRW5kKCl9LHBvaW50OmZ1bmN0aW9uKHQsZSl7dGhpcy5fY3VydmUucG9pbnQoZSpNYXRoLnNpbih0KSxlKi1NYXRoLmNvcyh0KSl9fTt2YXIgTTg9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIEU4KHQpe3JldHVybiB0LnNvdXJjZX1mdW5jdGlvbiBUOCh0KXtyZXR1cm4gdC50YXJnZXR9ZnVuY3Rpb24gQzgodCl7dmFyIGU9RTgsbj1UOCxpPWg4LHI9ZDgsbz1udWxsO2Z1bmN0aW9uIGEoKXt2YXIgYSxzPU04LmNhbGwoYXJndW1lbnRzKSxsPWUuYXBwbHkodGhpcyxzKSxjPW4uYXBwbHkodGhpcyxzKTtpZihvfHwobz1hPVY5KCkpLHQobywraS5hcHBseSh0aGlzLChzWzBdPWwscykpLCtyLmFwcGx5KHRoaXMscyksK2kuYXBwbHkodGhpcywoc1swXT1jLHMpKSwrci5hcHBseSh0aGlzLHMpKSxhKXJldHVybiBvPW51bGwsYSsiInx8bnVsbH1yZXR1cm4gYS5zb3VyY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxhKTplfSxhLnRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGEpOm59LGEueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlU5KCt0KSxhKTppfSxhLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpVOSgrdCksYSk6cn0sYS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW51bGw9PXQ/bnVsbDp0LGEpOm99LGF9ZnVuY3Rpb24gQTgodCxlLG4saSxyKXt0Lm1vdmVUbyhlLG4pLHQuYmV6aWVyQ3VydmVUbyhlPShlK2kpLzIsbixlLHIsaSxyKX1mdW5jdGlvbiBrOCh0LGUsbixpLHIpe3QubW92ZVRvKGUsbiksdC5iZXppZXJDdXJ2ZVRvKGUsbj0obityKS8yLGksbixpLHIpfWZ1bmN0aW9uIEw4KHQsZSxuLGkscil7dmFyIG89UzgoZSxuKSxhPVM4KGUsbj0obityKS8yKSxzPVM4KGksbiksbD1TOChpLHIpO3QubW92ZVRvKG9bMF0sb1sxXSksdC5iZXppZXJDdXJ2ZVRvKGFbMF0sYVsxXSxzWzBdLHNbMV0sbFswXSxsWzFdKX12YXIgUDg9e2RyYXc6ZnVuY3Rpb24odCxlKXt2YXIgbj1NYXRoLnNxcnQoZS9aOSk7dC5tb3ZlVG8obiwwKSx0LmFyYygwLDAsbiwwLFE5KX19LE44PXtkcmF3OmZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5zcXJ0KGUvNSkvMjt0Lm1vdmVUbygtMypuLC1uKSx0LmxpbmVUbygtbiwtbiksdC5saW5lVG8oLW4sLTMqbiksdC5saW5lVG8obiwtMypuKSx0LmxpbmVUbyhuLC1uKSx0LmxpbmVUbygzKm4sLW4pLHQubGluZVRvKDMqbixuKSx0LmxpbmVUbyhuLG4pLHQubGluZVRvKG4sMypuKSx0LmxpbmVUbygtbiwzKm4pLHQubGluZVRvKC1uLG4pLHQubGluZVRvKC0zKm4sbiksdC5jbG9zZVBhdGgoKX19LEk4PU1hdGguc3FydCgxLzMpLFI4PTIqSTgsTzg9e2RyYXc6ZnVuY3Rpb24odCxlKXt2YXIgbj1NYXRoLnNxcnQoZS9SOCksaT1uKkk4O3QubW92ZVRvKDAsLW4pLHQubGluZVRvKGksMCksdC5saW5lVG8oMCxuKSx0LmxpbmVUbygtaSwwKSx0LmNsb3NlUGF0aCgpfX0sejg9TWF0aC5zaW4oWjkvMTApL01hdGguc2luKDcqWjkvMTApLEQ4PU1hdGguc2luKFE5LzEwKSp6OCxCOD0tTWF0aC5jb3MoUTkvMTApKno4LEg4PXtkcmF3OmZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5zcXJ0KC44OTA4MTMwOTE1MjkyODUyKmUpLGk9RDgqbixyPUI4Km47dC5tb3ZlVG8oMCwtbiksdC5saW5lVG8oaSxyKTtmb3IodmFyIG89MTtvPDU7KytvKXt2YXIgYT1ROSpvLzUscz1NYXRoLmNvcyhhKSxsPU1hdGguc2luKGEpO3QubGluZVRvKGwqbiwtcypuKSx0LmxpbmVUbyhzKmktbCpyLGwqaStzKnIpfXQuY2xvc2VQYXRoKCl9fSxGOD17ZHJhdzpmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguc3FydChlKSxpPS1uLzI7dC5yZWN0KGksaSxuLG4pfX0sVjg9TWF0aC5zcXJ0KDMpLFU4PXtkcmF3OmZ1bmN0aW9uKHQsZSl7dmFyIG49LU1hdGguc3FydChlLygzKlY4KSk7dC5tb3ZlVG8oMCwyKm4pLHQubGluZVRvKC1WOCpuLC1uKSx0LmxpbmVUbyhWOCpuLC1uKSx0LmNsb3NlUGF0aCgpfX0sajg9LS41LEc4PU1hdGguc3FydCgzKS8yLFc4PTEvTWF0aC5zcXJ0KDEyKSxxOD0zKihXOC8yKzEpLFk4PXtkcmF3OmZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5zcXJ0KGUvcTgpLGk9bi8yLHI9bipXOCxvPWksYT1uKlc4K24scz0tbyxsPWE7dC5tb3ZlVG8oaSxyKSx0LmxpbmVUbyhvLGEpLHQubGluZVRvKHMsbCksdC5saW5lVG8oajgqaS1HOCpyLEc4KmkrajgqciksdC5saW5lVG8oajgqby1HOCphLEc4Km8rajgqYSksdC5saW5lVG8oajgqcy1HOCpsLEc4KnMrajgqbCksdC5saW5lVG8oajgqaStHOCpyLGo4KnItRzgqaSksdC5saW5lVG8oajgqbytHOCphLGo4KmEtRzgqbyksdC5saW5lVG8oajgqcytHOCpsLGo4KmwtRzgqcyksdC5jbG9zZVBhdGgoKX19LFg4PVtQOCxOOCxPOCxGOCxIOCxVOCxZOF07ZnVuY3Rpb24gJDgoKXt9ZnVuY3Rpb24gSzgodCxlLG4pe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbygoMip0Ll94MCt0Ll94MSkvMywoMip0Ll95MCt0Ll95MSkvMywodC5feDArMip0Ll94MSkvMywodC5feTArMip0Ll95MSkvMywodC5feDArNCp0Ll94MStlKS82LCh0Ll95MCs0KnQuX3kxK24pLzYpfWZ1bmN0aW9uIFo4KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBKOCh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gUTgodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIHQ3KHQsZSl7dGhpcy5fYmFzaXM9bmV3IFo4KHQpLHRoaXMuX2JldGE9ZX1aOC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAzOks4KHRoaXMsdGhpcy5feDEsdGhpcy5feTEpO2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxlKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2NvbnRleHQubGluZVRvKCg1KnRoaXMuX3gwK3RoaXMuX3gxKS82LCg1KnRoaXMuX3kwK3RoaXMuX3kxKS82KTtkZWZhdWx0Oks4KHRoaXMsdCxlKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPWV9fSxKOC5wcm90b3R5cGU9e2FyZWFTdGFydDokOCxhcmVhRW5kOiQ4LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MisyKnRoaXMuX3gzKS8zLCh0aGlzLl95MisyKnRoaXMuX3kzKS8zKSx0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMrMip0aGlzLl94MikvMywodGhpcy5feTMrMip0aGlzLl95MikvMyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95MiksdGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCl9fSxwb2ludDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gyPXQsdGhpcy5feTI9ZTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94Mz10LHRoaXMuX3kzPWU7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDQ9dCx0aGlzLl95ND1lLHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYsKHRoaXMuX3kwKzQqdGhpcy5feTErZSkvNik7YnJlYWs7ZGVmYXVsdDpLOCh0aGlzLHQsZSl9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1lfX0sUTgucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7dmFyIG49KHRoaXMuX3gwKzQqdGhpcy5feDErdCkvNixpPSh0aGlzLl95MCs0KnRoaXMuX3kxK2UpLzY7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyhuLGkpOnRoaXMuX2NvbnRleHQubW92ZVRvKG4saSk7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpLOCh0aGlzLHQsZSl9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1lfX0sdDcucHJvdG90eXBlPXtsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PVtdLHRoaXMuX3k9W10sdGhpcy5fYmFzaXMubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl94LGU9dGhpcy5feSxuPXQubGVuZ3RoLTE7aWYobj4wKWZvcih2YXIgaSxyPXRbMF0sbz1lWzBdLGE9dFtuXS1yLHM9ZVtuXS1vLGw9LTE7KytsPD1uOyl0aGlzLl9iYXNpcy5wb2ludCh0aGlzLl9iZXRhKnRbbF0rKDEtdGhpcy5fYmV0YSkqKHIrKGk9bC9uKSphKSx0aGlzLl9iZXRhKmVbbF0rKDEtdGhpcy5fYmV0YSkqKG8raSpzKSk7dGhpcy5feD10aGlzLl95PW51bGwsdGhpcy5fYmFzaXMubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LGUpe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtlKX19O3ZhciBlNz0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiAxPT09ZT9uZXcgWjgodCk6bmV3IHQ3KHQsZSl9cmV0dXJuIG4uYmV0YT1mdW5jdGlvbihlKXtyZXR1cm4gdCgrZSl9LG59KSguODUpO2Z1bmN0aW9uIG43KHQsZSxuKXt0Ll9jb250ZXh0LmJlemllckN1cnZlVG8odC5feDErdC5fayoodC5feDItdC5feDApLHQuX3kxK3QuX2sqKHQuX3kyLXQuX3kwKSx0Ll94Mit0Ll9rKih0Ll94MS1lKSx0Ll95Mit0Ll9rKih0Ll95MS1uKSx0Ll94Mix0Ll95Mil9ZnVuY3Rpb24gaTcodCxlKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1lKS82fWk3LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzpuNyh0aGlzLHRoaXMuX3gxLHRoaXMuX3kxKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsZSk7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5feDE9dCx0aGlzLl95MT1lO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO2RlZmF1bHQ6bjcodGhpcyx0LGUpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9ZX19O3ZhciByNz0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBuZXcgaTcodCxlKX1yZXR1cm4gbi50ZW5zaW9uPWZ1bmN0aW9uKGUpe3JldHVybiB0KCtlKX0sbn0pKDApO2Z1bmN0aW9uIG83KHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtZSkvNn1vNy5wcm90b3R5cGU9e2FyZWFTdGFydDokOCxhcmVhRW5kOiQ4LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1lO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9ZSk7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1lO2JyZWFrO2RlZmF1bHQ6bjcodGhpcyx0LGUpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9ZX19O3ZhciBhNz0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBuZXcgbzcodCxlKX1yZXR1cm4gbi50ZW5zaW9uPWZ1bmN0aW9uKGUpe3JldHVybiB0KCtlKX0sbn0pKDApO2Z1bmN0aW9uIHM3KHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtZSkvNn1zNy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtzd2l0Y2godD0rdCxlPStlLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpuNyh0aGlzLHQsZSl9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1lfX07dmFyIGw3PShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIG5ldyBzNyh0LGUpfXJldHVybiBuLnRlbnNpb249ZnVuY3Rpb24oZSl7cmV0dXJuIHQoK2UpfSxufSkoMCk7ZnVuY3Rpb24gYzcodCxlLG4pe3ZhciBpPXQuX3gxLHI9dC5feTEsbz10Ll94MixhPXQuX3kyO2lmKHQuX2wwMV9hPks5KXt2YXIgcz0yKnQuX2wwMV8yYSszKnQuX2wwMV9hKnQuX2wxMl9hK3QuX2wxMl8yYSxsPTMqdC5fbDAxX2EqKHQuX2wwMV9hK3QuX2wxMl9hKTtpPShpKnMtdC5feDAqdC5fbDEyXzJhK3QuX3gyKnQuX2wwMV8yYSkvbCxyPShyKnMtdC5feTAqdC5fbDEyXzJhK3QuX3kyKnQuX2wwMV8yYSkvbH1pZih0Ll9sMjNfYT5LOSl7dmFyIGM9Mip0Ll9sMjNfMmErMyp0Ll9sMjNfYSp0Ll9sMTJfYSt0Ll9sMTJfMmEsdT0zKnQuX2wyM19hKih0Ll9sMjNfYSt0Ll9sMTJfYSk7bz0obypjK3QuX3gxKnQuX2wyM18yYS1lKnQuX2wxMl8yYSkvdSxhPShhKmMrdC5feTEqdC5fbDIzXzJhLW4qdC5fbDEyXzJhKS91fXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhpLHIsbyxhLHQuX3gyLHQuX3kyKX1mdW5jdGlvbiB1Nyh0LGUpe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1lfXU3LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gyLHRoaXMuX3kyKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7aWYodD0rdCxlPStlLHRoaXMuX3BvaW50KXt2YXIgbj10aGlzLl94Mi10LGk9dGhpcy5feTItZTt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KG4qbitpKmksdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxlKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO2RlZmF1bHQ6YzcodGhpcyx0LGUpfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPWV9fTt2YXIgaDc9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gZT9uZXcgdTcodCxlKTpuZXcgaTcodCwwKX1yZXR1cm4gbi5hbHBoYT1mdW5jdGlvbihlKXtyZXR1cm4gdCgrZSl9LG59KSguNSk7ZnVuY3Rpb24gZDcodCxlKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9ZX1kNy5wcm90b3R5cGU9e2FyZWFTdGFydDokOCxhcmVhRW5kOiQ4LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsZSl7aWYodD0rdCxlPStlLHRoaXMuX3BvaW50KXt2YXIgbj10aGlzLl94Mi10LGk9dGhpcy5feTItZTt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KG4qbitpKmksdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gzPXQsdGhpcy5feTM9ZTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94ND10LHRoaXMuX3k0PWUpO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX3g1PXQsdGhpcy5feTU9ZTticmVhaztkZWZhdWx0OmM3KHRoaXMsdCxlKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1lfX07dmFyIHA3PShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIGU/bmV3IGQ3KHQsZSk6bmV3IG83KHQsMCl9cmV0dXJuIG4uYWxwaGE9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoK2UpfSxufSkoLjUpO2Z1bmN0aW9uIGY3KHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPWV9ZjcucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7aWYodD0rdCxlPStlLHRoaXMuX3BvaW50KXt2YXIgbj10aGlzLl94Mi10LGk9dGhpcy5feTItZTt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KG4qbitpKmksdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0OmM3KHRoaXMsdCxlKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1lfX07dmFyIG03PShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIGU/bmV3IGY3KHQsZSk6bmV3IHM3KHQsMCl9cmV0dXJuIG4uYWxwaGE9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoK2UpfSxufSkoLjUpO2Z1bmN0aW9uIGc3KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBfNyh0KXtyZXR1cm4gdDwwPy0xOjF9ZnVuY3Rpb24geTcodCxlLG4pe3ZhciBpPXQuX3gxLXQuX3gwLHI9ZS10Ll94MSxvPSh0Ll95MS10Ll95MCkvKGl8fHI8MCYmLTApLGE9KG4tdC5feTEpLyhyfHxpPDAmJi0wKSxzPShvKnIrYSppKS8oaStyKTtyZXR1cm4oXzcobykrXzcoYSkpKk1hdGgubWluKE1hdGguYWJzKG8pLE1hdGguYWJzKGEpLC41Kk1hdGguYWJzKHMpKXx8MH1mdW5jdGlvbiB2Nyh0LGUpe3ZhciBuPXQuX3gxLXQuX3gwO3JldHVybiBuPygzKih0Ll95MS10Ll95MCkvbi1lKS8yOmV9ZnVuY3Rpb24gYjcodCxlLG4pe3ZhciBpPXQuX3gwLHI9dC5feDEsbz10Ll95MSxhPShyLWkpLzM7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKGkrYSx0Ll95MCthKmUsci1hLG8tYSpuLHIsbyl9ZnVuY3Rpb24geDcodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIHc3KHQpe3RoaXMuX2NvbnRleHQ9bmV3IFM3KHQpfWZ1bmN0aW9uIFM3KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBNNyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gRTcodCl7dmFyIGUsbixpPXQubGVuZ3RoLTEscj1uZXcgQXJyYXkoaSksbz1uZXcgQXJyYXkoaSksYT1uZXcgQXJyYXkoaSk7Zm9yKHJbMF09MCxvWzBdPTIsYVswXT10WzBdKzIqdFsxXSxlPTE7ZTxpLTE7KytlKXJbZV09MSxvW2VdPTQsYVtlXT00KnRbZV0rMip0W2UrMV07Zm9yKHJbaS0xXT0yLG9baS0xXT03LGFbaS0xXT04KnRbaS0xXSt0W2ldLGU9MTtlPGk7KytlKW9bZV0tPW49cltlXS9vW2UtMV0sYVtlXS09biphW2UtMV07Zm9yKHJbaS0xXT1hW2ktMV0vb1tpLTFdLGU9aS0yO2U+PTA7LS1lKXJbZV09KGFbZV0tcltlKzFdKS9vW2VdO2ZvcihvW2ktMV09KHRbaV0rcltpLTFdKS8yLGU9MDtlPGktMTsrK2Upb1tlXT0yKnRbZSsxXS1yW2UrMV07cmV0dXJuW3Isb119ZnVuY3Rpb24gVDcodCxlKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fdD1lfWZ1bmN0aW9uIEM3KHQsZSl7aWYoKHI9dC5sZW5ndGgpPjEpZm9yKHZhciBuLGkscixvPTEsYT10W2VbMF1dLHM9YS5sZW5ndGg7bzxyOysrbylmb3IoaT1hLGE9dFtlW29dXSxuPTA7bjxzOysrbilhW25dWzFdKz1hW25dWzBdPWlzTmFOKGlbbl1bMV0pP2lbbl1bMF06aVtuXVsxXX1mdW5jdGlvbiBBNyh0KXtmb3IodmFyIGU9dC5sZW5ndGgsbj1uZXcgQXJyYXkoZSk7LS1lPj0wOyluW2VdPWU7cmV0dXJuIG59ZnVuY3Rpb24gazcodCxlKXtyZXR1cm4gdFtlXX1mdW5jdGlvbiBMNyh0KXt2YXIgZT10Lm1hcChQNyk7cmV0dXJuIEE3KHQpLnNvcnQoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGVbdF0tZVtuXX0pKX1mdW5jdGlvbiBQNyh0KXtmb3IodmFyIGUsbj0wLGk9LTEscj10Lmxlbmd0aDsrK2k8cjspKGU9K3RbaV1bMV0pJiYobis9ZSk7cmV0dXJuIG59ZzcucHJvdG90eXBlPXthcmVhU3RhcnQ6JDgsYXJlYUVuZDokOCxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCl9LHBvaW50OmZ1bmN0aW9uKHQsZSl7dD0rdCxlPStlLHRoaXMuX3BvaW50P3RoaXMuX2NvbnRleHQubGluZVRvKHQsZSk6KHRoaXMuX3BvaW50PTEsdGhpcy5fY29udGV4dC5tb3ZlVG8odCxlKSl9fSx4Ny5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT10aGlzLl90MD1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLHRoaXMuX3kxKTticmVhaztjYXNlIDM6YjcodGhpcyx0aGlzLl90MCx2Nyh0aGlzLHRoaXMuX3QwKSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LGUpe3ZhciBuPU5hTjtpZihlPStlLCh0PSt0KSE9PXRoaXMuX3gxfHxlIT09dGhpcy5feTEpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsZSk7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsYjcodGhpcyx2Nyh0aGlzLG49eTcodGhpcyx0LGUpKSxuKTticmVhaztkZWZhdWx0OmI3KHRoaXMsdGhpcy5fdDAsbj15Nyh0aGlzLHQsZSkpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9ZSx0aGlzLl90MD1ufX19LCh3Ny5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4Ny5wcm90b3R5cGUpKS5wb2ludD1mdW5jdGlvbih0LGUpe3g3LnByb3RvdHlwZS5wb2ludC5jYWxsKHRoaXMsZSx0KX0sUzcucHJvdG90eXBlPXttb3ZlVG86ZnVuY3Rpb24odCxlKXt0aGlzLl9jb250ZXh0Lm1vdmVUbyhlLHQpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxsaW5lVG86ZnVuY3Rpb24odCxlKXt0aGlzLl9jb250ZXh0LmxpbmVUbyhlLHQpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsZSxuLGkscixvKXt0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8oZSx0LGksbixvLHIpfX0sTTcucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxlPXRoaXMuX3ksbj10Lmxlbmd0aDtpZihuKWlmKHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odFswXSxlWzBdKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0WzBdLGVbMF0pLDI9PT1uKXRoaXMuX2NvbnRleHQubGluZVRvKHRbMV0sZVsxXSk7ZWxzZSBmb3IodmFyIGk9RTcodCkscj1FNyhlKSxvPTAsYT0xO2E8bjsrK28sKythKXRoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhpWzBdW29dLHJbMF1bb10saVsxXVtvXSxyWzFdW29dLHRbYV0sZVthXSk7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09bikmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmUsdGhpcy5feD10aGlzLl95PW51bGx9LHBvaW50OmZ1bmN0aW9uKHQsZSl7dGhpcy5feC5wdXNoKCt0KSx0aGlzLl95LnB1c2goK2UpfX0sVDcucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD10aGlzLl95PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MDx0aGlzLl90JiZ0aGlzLl90PDEmJjI9PT10aGlzLl9wb2ludCYmdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCx0aGlzLl95KSwodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT49MCYmKHRoaXMuX3Q9MS10aGlzLl90LHRoaXMuX2xpbmU9MS10aGlzLl9saW5lKX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtzd2l0Y2godD0rdCxlPStlLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsZSk6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxlKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OmlmKHRoaXMuX3Q8PTApdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCxlKSx0aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpO2Vsc2V7dmFyIG49dGhpcy5feCooMS10aGlzLl90KSt0KnRoaXMuX3Q7dGhpcy5fY29udGV4dC5saW5lVG8obix0aGlzLl95KSx0aGlzLl9jb250ZXh0LmxpbmVUbyhuLGUpfX10aGlzLl94PXQsdGhpcy5feT1lfX07dmFyIE43PW5ldyBEYXRlLEk3PW5ldyBEYXRlO2Z1bmN0aW9uIFI3KHQsZSxuLGkpe2Z1bmN0aW9uIHIoZSl7cmV0dXJuIHQoZT1uZXcgRGF0ZSgrZSkpLGV9cmV0dXJuIHIuZmxvb3I9cixyLmNlaWw9ZnVuY3Rpb24obil7cmV0dXJuIHQobj1uZXcgRGF0ZShuLTEpKSxlKG4sMSksdChuKSxufSxyLnJvdW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXIodCksbj1yLmNlaWwodCk7cmV0dXJuIHQtZTxuLXQ/ZTpufSxyLm9mZnNldD1mdW5jdGlvbih0LG4pe3JldHVybiBlKHQ9bmV3IERhdGUoK3QpLG51bGw9PW4/MTpNYXRoLmZsb29yKG4pKSx0fSxyLnJhbmdlPWZ1bmN0aW9uKG4saSxvKXt2YXIgYSxzPVtdO2lmKG49ci5jZWlsKG4pLG89bnVsbD09bz8xOk1hdGguZmxvb3IobyksIShuPGkmJm8+MCkpcmV0dXJuIHM7ZG97cy5wdXNoKGE9bmV3IERhdGUoK24pKSxlKG4sbyksdChuKX13aGlsZShhPG4mJm48aSk7cmV0dXJuIHN9LHIuZmlsdGVyPWZ1bmN0aW9uKG4pe3JldHVybiBSNygoZnVuY3Rpb24oZSl7aWYoZT49ZSlmb3IoO3QoZSksIW4oZSk7KWUuc2V0VGltZShlLTEpfSksKGZ1bmN0aW9uKHQsaSl7aWYodD49dClpZihpPDApZm9yKDsrK2k8PTA7KWZvcig7ZSh0LC0xKSwhbih0KTspO2Vsc2UgZm9yKDstLWk+PTA7KWZvcig7ZSh0LDEpLCFuKHQpOyk7fSkpfSxuJiYoci5jb3VudD1mdW5jdGlvbihlLGkpe3JldHVybiBONy5zZXRUaW1lKCtlKSxJNy5zZXRUaW1lKCtpKSx0KE43KSx0KEk3KSxNYXRoLmZsb29yKG4oTjcsSTcpKX0sci5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP3IuZmlsdGVyKGk/ZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSkldD09MH06ZnVuY3Rpb24oZSl7cmV0dXJuIHIuY291bnQoMCxlKSV0PT0wfSk6cjpudWxsfSkscn12YXIgTzc9UjcoKGZ1bmN0aW9uKCl7fSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUtdH0pKTtPNy5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP1I3KChmdW5jdGlvbihlKXtlLnNldFRpbWUoTWF0aC5mbG9vcihlL3QpKnQpfSksKGZ1bmN0aW9uKGUsbil7ZS5zZXRUaW1lKCtlK24qdCl9KSwoZnVuY3Rpb24oZSxuKXtyZXR1cm4obi1lKS90fSkpOk83Om51bGx9O3ZhciB6Nz1PNy5yYW5nZSxENz0xZTMsQjc9NmU0LEg3PTM2ZTUsRjc9ODY0ZTUsVjc9NjA0OGU1LFU3PVI3KChmdW5jdGlvbih0KXt0LnNldFRpbWUoTWF0aC5mbG9vcih0L0Q3KSpENyl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFRpbWUoK3QrZSpENyl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS9EN30pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENTZWNvbmRzKCl9KSksajc9VTcucmFuZ2UsRzc9UjcoKGZ1bmN0aW9uKHQpe3Quc2V0VGltZShNYXRoLmZsb29yKHQvQjcpKkI3KX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKkI3KX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL0I3fSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE1pbnV0ZXMoKX0pKSxXNz1HNy5yYW5nZSxxNz1SNygoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRUaW1lem9uZU9mZnNldCgpKkI3JUg3O2U8MCYmKGUrPUg3KSx0LnNldFRpbWUoTWF0aC5mbG9vcigoK3QtZSkvSDcpKkg3K2UpfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UqSDcpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvSDd9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0SG91cnMoKX0pKSxZNz1xNy5yYW5nZSxYNz1SNygoZnVuY3Rpb24odCl7dC5zZXRIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0RGF0ZSh0LmdldERhdGUoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQtKGUuZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKkI3KS9GN30pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXREYXRlKCktMX0pKSwkNz1YNy5yYW5nZTtmdW5jdGlvbiBLNyh0KXtyZXR1cm4gUjcoKGZ1bmN0aW9uKGUpe2Uuc2V0RGF0ZShlLmdldERhdGUoKS0oZS5nZXREYXkoKSs3LXQpJTcpLGUuc2V0SG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldERhdGUodC5nZXREYXRlKCkrNyplKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQtKGUuZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKkI3KS9WN30pKX12YXIgWjc9SzcoMCksSjc9SzcoMSksUTc9SzcoMiksdHR0PUs3KDMpLGV0dD1LNyg0KSxudHQ9SzcoNSksaXR0PUs3KDYpLHJ0dD1aNy5yYW5nZSxvdHQ9SjcucmFuZ2UsYXR0PVE3LnJhbmdlLHN0dD10dHQucmFuZ2UsbHR0PWV0dC5yYW5nZSxjdHQ9bnR0LnJhbmdlLHV0dD1pdHQucmFuZ2UsaHR0PVI3KChmdW5jdGlvbih0KXt0LnNldERhdGUoMSksdC5zZXRIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0TW9udGgodC5nZXRNb250aCgpK2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZ2V0TW9udGgoKS10LmdldE1vbnRoKCkrMTIqKGUuZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCkpfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE1vbnRoKCl9KSksZHR0PWh0dC5yYW5nZSxwdHQ9UjcoKGZ1bmN0aW9uKHQpe3Quc2V0TW9udGgoMCwxKSx0LnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRGdWxsWWVhcih0LmdldEZ1bGxZZWFyKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5nZXRGdWxsWWVhcigpLXQuZ2V0RnVsbFllYXIoKX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRGdWxsWWVhcigpfSkpO3B0dC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP1I3KChmdW5jdGlvbihlKXtlLnNldEZ1bGxZZWFyKE1hdGguZmxvb3IoZS5nZXRGdWxsWWVhcigpL3QpKnQpLGUuc2V0TW9udGgoMCwxKSxlLnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKGUsbil7ZS5zZXRGdWxsWWVhcihlLmdldEZ1bGxZZWFyKCkrbip0KX0pKTpudWxsfTt2YXIgZnR0PXB0dC5yYW5nZSxtdHQ9UjcoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDU2Vjb25kcygwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UqQjcpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvQjd9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTWludXRlcygpfSkpLGd0dD1tdHQucmFuZ2UsX3R0PVI3KChmdW5jdGlvbih0KXt0LnNldFVUQ01pbnV0ZXMoMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UqSDcpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvSDd9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDSG91cnMoKX0pKSx5dHQ9X3R0LnJhbmdlLHZ0dD1SNygoZnVuY3Rpb24odCl7dC5zZXRVVENIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VVRDRGF0ZSh0LmdldFVUQ0RhdGUoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL0Y3fSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0RhdGUoKS0xfSkpLGJ0dD12dHQucmFuZ2U7ZnVuY3Rpb24geHR0KHQpe3JldHVybiBSNygoZnVuY3Rpb24oZSl7ZS5zZXRVVENEYXRlKGUuZ2V0VVRDRGF0ZSgpLShlLmdldFVUQ0RheSgpKzctdCklNyksZS5zZXRVVENIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VVRDRGF0ZSh0LmdldFVUQ0RhdGUoKSs3KmUpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvVjd9KSl9dmFyIHd0dD14dHQoMCksU3R0PXh0dCgxKSxNdHQ9eHR0KDIpLEV0dD14dHQoMyksVHR0PXh0dCg0KSxDdHQ9eHR0KDUpLEF0dD14dHQoNiksa3R0PXd0dC5yYW5nZSxMdHQ9U3R0LnJhbmdlLFB0dD1NdHQucmFuZ2UsTnR0PUV0dC5yYW5nZSxJdHQ9VHR0LnJhbmdlLFJ0dD1DdHQucmFuZ2UsT3R0PUF0dC5yYW5nZSx6dHQ9UjcoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDRGF0ZSgxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRVVENNb250aCh0LmdldFVUQ01vbnRoKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5nZXRVVENNb250aCgpLXQuZ2V0VVRDTW9udGgoKSsxMiooZS5nZXRVVENGdWxsWWVhcigpLXQuZ2V0VVRDRnVsbFllYXIoKSl9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTW9udGgoKX0pKSxEdHQ9enR0LnJhbmdlLEJ0dD1SNygoZnVuY3Rpb24odCl7dC5zZXRVVENNb250aCgwLDEpLHQuc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFVUQ0Z1bGxZZWFyKHQuZ2V0VVRDRnVsbFllYXIoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybiBlLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0Z1bGxZZWFyKCl9KSk7QnR0LmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PU1hdGguZmxvb3IodCkpJiZ0PjA/UjcoKGZ1bmN0aW9uKGUpe2Uuc2V0VVRDRnVsbFllYXIoTWF0aC5mbG9vcihlLmdldFVUQ0Z1bGxZZWFyKCkvdCkqdCksZS5zZXRVVENNb250aCgwLDEpLGUuc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24oZSxuKXtlLnNldFVUQ0Z1bGxZZWFyKGUuZ2V0VVRDRnVsbFllYXIoKStuKnQpfSkpOm51bGx9O3ZhciBIdHQ9QnR0LnJhbmdlLEZ0dD1uZXcgRGF0ZSxWdHQ9bmV3IERhdGU7ZnVuY3Rpb24gVXR0KHQsZSxuLGkpe2Z1bmN0aW9uIHIoZSl7cmV0dXJuIHQoZT0wPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgRGF0ZTpuZXcgRGF0ZSgrZSkpLGV9cmV0dXJuIHIuZmxvb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZT1uZXcgRGF0ZSgrZSkpLGV9LHIuY2VpbD1mdW5jdGlvbihuKXtyZXR1cm4gdChuPW5ldyBEYXRlKG4tMSkpLGUobiwxKSx0KG4pLG59LHIucm91bmQ9ZnVuY3Rpb24odCl7dmFyIGU9cih0KSxuPXIuY2VpbCh0KTtyZXR1cm4gdC1lPG4tdD9lOm59LHIub2Zmc2V0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIGUodD1uZXcgRGF0ZSgrdCksbnVsbD09bj8xOk1hdGguZmxvb3IobikpLHR9LHIucmFuZ2U9ZnVuY3Rpb24obixpLG8pe3ZhciBhLHM9W107aWYobj1yLmNlaWwobiksbz1udWxsPT1vPzE6TWF0aC5mbG9vcihvKSwhKG48aSYmbz4wKSlyZXR1cm4gcztkb3tzLnB1c2goYT1uZXcgRGF0ZSgrbikpLGUobixvKSx0KG4pfXdoaWxlKGE8biYmbjxpKTtyZXR1cm4gc30sci5maWx0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIFV0dCgoZnVuY3Rpb24oZSl7aWYoZT49ZSlmb3IoO3QoZSksIW4oZSk7KWUuc2V0VGltZShlLTEpfSksKGZ1bmN0aW9uKHQsaSl7aWYodD49dClpZihpPDApZm9yKDsrK2k8PTA7KWZvcig7ZSh0LC0xKSwhbih0KTspO2Vsc2UgZm9yKDstLWk+PTA7KWZvcig7ZSh0LDEpLCFuKHQpOyk7fSkpfSxuJiYoci5jb3VudD1mdW5jdGlvbihlLGkpe3JldHVybiBGdHQuc2V0VGltZSgrZSksVnR0LnNldFRpbWUoK2kpLHQoRnR0KSx0KFZ0dCksTWF0aC5mbG9vcihuKEZ0dCxWdHQpKX0sci5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP3IuZmlsdGVyKGk/ZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSkldD09MH06ZnVuY3Rpb24oZSl7cmV0dXJuIHIuY291bnQoMCxlKSV0PT0wfSk6cjpudWxsfSkscn12YXIganR0PTg2NGU1LEd0dD02MDQ4ZTUsV3R0PVV0dCgoZnVuY3Rpb24odCl7dC5zZXRIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0RGF0ZSh0LmdldERhdGUoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQtNmU0KihlLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSkvanR0fSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldERhdGUoKS0xfSkpO2Z1bmN0aW9uIHF0dCh0KXtyZXR1cm4gVXR0KChmdW5jdGlvbihlKXtlLnNldERhdGUoZS5nZXREYXRlKCktKGUuZ2V0RGF5KCkrNy10KSU3KSxlLnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpKzcqZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10LTZlNCooZS5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkpL0d0dH0pKX12YXIgWXR0PXF0dCgwKSxYdHQ9cXR0KDEpO3F0dCgyKSxxdHQoMyk7dmFyICR0dD1xdHQoNCk7cXR0KDUpLHF0dCg2KTt2YXIgS3R0PVV0dCgoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldEZ1bGxZZWFyKHQuZ2V0RnVsbFllYXIoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybiBlLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KSk7S3R0LmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PU1hdGguZmxvb3IodCkpJiZ0PjA/VXR0KChmdW5jdGlvbihlKXtlLnNldEZ1bGxZZWFyKE1hdGguZmxvb3IoZS5nZXRGdWxsWWVhcigpL3QpKnQpLGUuc2V0TW9udGgoMCwxKSxlLnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKGUsbil7ZS5zZXRGdWxsWWVhcihlLmdldEZ1bGxZZWFyKCkrbip0KX0pKTpudWxsfTt2YXIgWnR0PUt0dCxKdHQ9VXR0KChmdW5jdGlvbih0KXt0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpK2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvanR0fSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0RhdGUoKS0xfSkpO2Z1bmN0aW9uIFF0dCh0KXtyZXR1cm4gVXR0KChmdW5jdGlvbihlKXtlLnNldFVUQ0RhdGUoZS5nZXRVVENEYXRlKCktKGUuZ2V0VVRDRGF5KCkrNy10KSU3KSxlLnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpKzcqZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS9HdHR9KSl9dmFyIHRldD1RdHQoMCksZWV0PVF0dCgxKTtRdHQoMiksUXR0KDMpO3ZhciBuZXQ9UXR0KDQpO1F0dCg1KSxRdHQoNik7dmFyIGlldD1VdHQoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTW9udGgoMCwxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRVVENGdWxsWWVhcih0LmdldFVUQ0Z1bGxZZWFyKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5nZXRVVENGdWxsWWVhcigpLXQuZ2V0VVRDRnVsbFllYXIoKX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENGdWxsWWVhcigpfSkpO2lldC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP1V0dCgoZnVuY3Rpb24oZSl7ZS5zZXRVVENGdWxsWWVhcihNYXRoLmZsb29yKGUuZ2V0VVRDRnVsbFllYXIoKS90KSp0KSxlLnNldFVUQ01vbnRoKDAsMSksZS5zZXRVVENIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbihlLG4pe2Uuc2V0VVRDRnVsbFllYXIoZS5nZXRVVENGdWxsWWVhcigpK24qdCl9KSk6bnVsbH07dmFyIHJldD1pZXQ7ZnVuY3Rpb24gb2V0KHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIGU9bmV3IERhdGUoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpO3JldHVybiBlLnNldEZ1bGxZZWFyKHQueSksZX1yZXR1cm4gbmV3IERhdGUodC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKX1mdW5jdGlvbiBhZXQodCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgZT1uZXcgRGF0ZShEYXRlLlVUQygtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpO3JldHVybiBlLnNldFVUQ0Z1bGxZZWFyKHQueSksZX1yZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEModC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKSl9ZnVuY3Rpb24gc2V0KHQpe3JldHVybnt5OnQsbTowLGQ6MSxIOjAsTTowLFM6MCxMOjB9fWZ1bmN0aW9uIGNldCh0KXt2YXIgZT10LmRhdGVUaW1lLG49dC5kYXRlLGk9dC50aW1lLHI9dC5wZXJpb2RzLG89dC5kYXlzLGE9dC5zaG9ydERheXMscz10Lm1vbnRocyxsPXQuc2hvcnRNb250aHMsYz14ZXQociksdT13ZXQociksaD14ZXQobyksZD13ZXQobykscD14ZXQoYSksZj13ZXQoYSksbT14ZXQocyksZz13ZXQocyksXz14ZXQobCkseT13ZXQobCksdj17YTpmdW5jdGlvbiBiKHQpe3JldHVybiBhW3QuZ2V0RGF5KCldfSxBOmZ1bmN0aW9uIHgodCl7cmV0dXJuIG9bdC5nZXREYXkoKV19LGI6ZnVuY3Rpb24gdyh0KXtyZXR1cm4gbFt0LmdldE1vbnRoKCldfSxCOmZ1bmN0aW9uIFModCl7cmV0dXJuIHNbdC5nZXRNb250aCgpXX0sYzpudWxsLGQ6amV0LGU6amV0LGY6WGV0LEg6R2V0LEk6V2V0LGo6cWV0LEw6WWV0LG06JGV0LE06S2V0LHA6ZnVuY3Rpb24gTSh0KXtyZXR1cm4gclsrKHQuZ2V0SG91cnMoKT49MTIpXX0sUTpNbnQsczpFbnQsUzpaZXQsdTpKZXQsVTpRZXQsVjp0bnQsdzplbnQsVzpubnQseDpudWxsLFg6bnVsbCx5OmludCxZOnJudCxaOm9udCwiJSI6U250fSxFPXthOmZ1bmN0aW9uIFQodCl7cmV0dXJuIGFbdC5nZXRVVENEYXkoKV19LEE6ZnVuY3Rpb24gQyh0KXtyZXR1cm4gb1t0LmdldFVUQ0RheSgpXX0sYjpmdW5jdGlvbiBBKHQpe3JldHVybiBsW3QuZ2V0VVRDTW9udGgoKV19LEI6ZnVuY3Rpb24gayh0KXtyZXR1cm4gc1t0LmdldFVUQ01vbnRoKCldfSxjOm51bGwsZDphbnQsZTphbnQsZjpobnQsSDpzbnQsSTpsbnQsajpjbnQsTDp1bnQsbTpkbnQsTTpwbnQscDpmdW5jdGlvbiBMKHQpe3JldHVybiByWysodC5nZXRVVENIb3VycygpPj0xMildfSxROk1udCxzOkVudCxTOmZudCx1Om1udCxVOmdudCxWOl9udCx3OnludCxXOnZudCx4Om51bGwsWDpudWxsLHk6Ym50LFk6eG50LFo6d250LCIlIjpTbnR9LFA9e2E6ZnVuY3Rpb24gTih0LGUsbil7dmFyIGk9cC5leGVjKGUuc2xpY2UobikpO3JldHVybiBpPyh0Lnc9ZltpWzBdLnRvTG93ZXJDYXNlKCldLG4raVswXS5sZW5ndGgpOi0xfSxBOmZ1bmN0aW9uIEkodCxlLG4pe3ZhciBpPWguZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC53PWRbaVswXS50b0xvd2VyQ2FzZSgpXSxuK2lbMF0ubGVuZ3RoKTotMX0sYjpmdW5jdGlvbiBSKHQsZSxuKXt2YXIgaT1fLmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIGk/KHQubT15W2lbMF0udG9Mb3dlckNhc2UoKV0sbitpWzBdLmxlbmd0aCk6LTF9LEI6ZnVuY3Rpb24gTyh0LGUsbil7dmFyIGk9bS5leGVjKGUuc2xpY2UobikpO3JldHVybiBpPyh0Lm09Z1tpWzBdLnRvTG93ZXJDYXNlKCldLG4raVswXS5sZW5ndGgpOi0xfSxjOmZ1bmN0aW9uIHoodCxuLGkpe3JldHVybiBVKHQsZSxuLGkpfSxkOklldCxlOklldCxmOkhldCxIOk9ldCxJOk9ldCxqOlJldCxMOkJldCxtOk5ldCxNOnpldCxwOmZ1bmN0aW9uIEQodCxlLG4pe3ZhciBpPWMuZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC5wPXVbaVswXS50b0xvd2VyQ2FzZSgpXSxuK2lbMF0ubGVuZ3RoKTotMX0sUTpWZXQsczpVZXQsUzpEZXQsdTpFZXQsVTpUZXQsVjpDZXQsdzpNZXQsVzpBZXQseDpmdW5jdGlvbiBCKHQsZSxpKXtyZXR1cm4gVSh0LG4sZSxpKX0sWDpmdW5jdGlvbiBIKHQsZSxuKXtyZXR1cm4gVSh0LGksZSxuKX0seTpMZXQsWTprZXQsWjpQZXQsIiUiOkZldH07ZnVuY3Rpb24gRih0LGUpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgaSxyLG8sYT1bXSxzPS0xLGw9MCxjPXQubGVuZ3RoO2ZvcihuIGluc3RhbmNlb2YgRGF0ZXx8KG49bmV3IERhdGUoK24pKTsrK3M8YzspMzc9PT10LmNoYXJDb2RlQXQocykmJihhLnB1c2godC5zbGljZShsLHMpKSxudWxsIT0ocj1tZXRbaT10LmNoYXJBdCgrK3MpXSk/aT10LmNoYXJBdCgrK3MpOnI9ImUiPT09aT8iICI6IjAiLChvPWVbaV0pJiYoaT1vKG4scikpLGEucHVzaChpKSxsPXMrMSk7cmV0dXJuIGEucHVzaCh0LnNsaWNlKGwscykpLGEuam9pbigiIil9fWZ1bmN0aW9uIFYodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGkscixvPXNldCgxOTAwKTtpZihVKG8sdCxuKz0iIiwwKSE9bi5sZW5ndGgpcmV0dXJuIG51bGw7aWYoIlEiaW4gbylyZXR1cm4gbmV3IERhdGUoby5RKTtpZigicCJpbiBvJiYoby5IPW8uSCUxMisxMipvLnApLCJWImluIG8pe2lmKG8uVjwxfHxvLlY+NTMpcmV0dXJuIG51bGw7InciaW4gb3x8KG8udz0xKSwiWiJpbiBvPyhyPShpPWFldChzZXQoby55KSkpLmdldFVUQ0RheSgpLGk9cj40fHwwPT09cj9lZXQuY2VpbChpKTplZXQoaSksaT1KdHQub2Zmc2V0KGksNyooby5WLTEpKSxvLnk9aS5nZXRVVENGdWxsWWVhcigpLG8ubT1pLmdldFVUQ01vbnRoKCksby5kPWkuZ2V0VVRDRGF0ZSgpKyhvLncrNiklNyk6KHI9KGk9ZShzZXQoby55KSkpLmdldERheSgpLGk9cj40fHwwPT09cj9YdHQuY2VpbChpKTpYdHQoaSksaT1XdHQub2Zmc2V0KGksNyooby5WLTEpKSxvLnk9aS5nZXRGdWxsWWVhcigpLG8ubT1pLmdldE1vbnRoKCksby5kPWkuZ2V0RGF0ZSgpKyhvLncrNiklNyl9ZWxzZSgiVyJpbiBvfHwiVSJpbiBvKSYmKCJ3ImluIG98fChvLnc9InUiaW4gbz9vLnUlNzoiVyJpbiBvPzE6MCkscj0iWiJpbiBvP2FldChzZXQoby55KSkuZ2V0VVRDRGF5KCk6ZShzZXQoby55KSkuZ2V0RGF5KCksby5tPTAsby5kPSJXImluIG8/KG8udys2KSU3Kzcqby5XLShyKzUpJTc6by53Kzcqby5VLShyKzYpJTcpO3JldHVybiJaImluIG8/KG8uSCs9by5aLzEwMHwwLG8uTSs9by5aJTEwMCxhZXQobykpOmUobyl9fWZ1bmN0aW9uIFUodCxlLG4saSl7Zm9yKHZhciByLG8sYT0wLHM9ZS5sZW5ndGgsbD1uLmxlbmd0aDthPHM7KXtpZihpPj1sKXJldHVybi0xO2lmKDM3PT09KHI9ZS5jaGFyQ29kZUF0KGErKykpKXtpZihyPWUuY2hhckF0KGErKyksIShvPVBbciBpbiBtZXQ/ZS5jaGFyQXQoYSsrKTpyXSl8fChpPW8odCxuLGkpKTwwKXJldHVybi0xfWVsc2UgaWYociE9bi5jaGFyQ29kZUF0KGkrKykpcmV0dXJuLTF9cmV0dXJuIGl9cmV0dXJuIHYueD1GKG4sdiksdi5YPUYoaSx2KSx2LmM9RihlLHYpLEUueD1GKG4sRSksRS5YPUYoaSxFKSxFLmM9RihlLEUpLHtmb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIGU9Rih0Kz0iIix2KTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfSxwYXJzZTpmdW5jdGlvbih0KXt2YXIgZT1WKHQrPSIiLG9ldCk7cmV0dXJuIGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sZX0sdXRjRm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBlPUYodCs9IiIsRSk7cmV0dXJuIGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sZX0sdXRjUGFyc2U6ZnVuY3Rpb24odCl7dmFyIGU9Vih0LGFldCk7cmV0dXJuIGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sZX19fXZhciB1ZXQsaGV0LGRldCxwZXQsZmV0LG1ldD17Ii0iOiIiLF86IiAiLDA6IjAifSxnZXQ9L15ccypcZCsvLF9ldD0vXiUvLHlldD0vW1xcXiQqKz98W1xdKCkue31dL2c7ZnVuY3Rpb24gdmV0KHQsZSxuKXt2YXIgaT10PDA/Ii0iOiIiLHI9KGk/LXQ6dCkrIiIsbz1yLmxlbmd0aDtyZXR1cm4gaSsobzxuP25ldyBBcnJheShuLW8rMSkuam9pbihlKStyOnIpfWZ1bmN0aW9uIGJldCh0KXtyZXR1cm4gdC5yZXBsYWNlKHlldCwiXFwkJiIpfWZ1bmN0aW9uIHhldCh0KXtyZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIrdC5tYXAoYmV0KS5qb2luKCJ8IikrIikiLCJpIil9ZnVuY3Rpb24gd2V0KHQpe2Zvcih2YXIgZT17fSxuPS0xLGk9dC5sZW5ndGg7KytuPGk7KWVbdFtuXS50b0xvd2VyQ2FzZSgpXT1uO3JldHVybiBlfWZ1bmN0aW9uIE1ldCh0LGUsbil7dmFyIGk9Z2V0LmV4ZWMoZS5zbGljZShuLG4rMSkpO3JldHVybiBpPyh0Lnc9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gRWV0KHQsZSxuKXt2YXIgaT1nZXQuZXhlYyhlLnNsaWNlKG4sbisxKSk7cmV0dXJuIGk/KHQudT0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBUZXQodCxlLG4pe3ZhciBpPWdldC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5VPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIENldCh0LGUsbil7dmFyIGk9Z2V0LmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0LlY9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gQWV0KHQsZSxuKXt2YXIgaT1nZXQuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQuVz0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBrZXQodCxlLG4pe3ZhciBpPWdldC5leGVjKGUuc2xpY2UobixuKzQpKTtyZXR1cm4gaT8odC55PStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIExldCh0LGUsbil7dmFyIGk9Z2V0LmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0Lnk9K2lbMF0rKCtpWzBdPjY4PzE5MDA6MmUzKSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBQZXQodCxlLG4pe3ZhciBpPS9eKFopfChbKy1dXGRcZCkoPzo6PyhcZFxkKSk/Ly5leGVjKGUuc2xpY2UobixuKzYpKTtyZXR1cm4gaT8odC5aPWlbMV0/MDotKGlbMl0rKGlbM118fCIwMCIpKSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBOZXQodCxlLG4pe3ZhciBpPWdldC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5tPWlbMF0tMSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBJZXQodCxlLG4pe3ZhciBpPWdldC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5kPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFJldCh0LGUsbil7dmFyIGk9Z2V0LmV4ZWMoZS5zbGljZShuLG4rMykpO3JldHVybiBpPyh0Lm09MCx0LmQ9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gT2V0KHQsZSxuKXt2YXIgaT1nZXQuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQuSD0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB6ZXQodCxlLG4pe3ZhciBpPWdldC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5NPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIERldCh0LGUsbil7dmFyIGk9Z2V0LmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0LlM9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gQmV0KHQsZSxuKXt2YXIgaT1nZXQuZXhlYyhlLnNsaWNlKG4sbiszKSk7cmV0dXJuIGk/KHQuTD0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBIZXQodCxlLG4pe3ZhciBpPWdldC5leGVjKGUuc2xpY2UobixuKzYpKTtyZXR1cm4gaT8odC5MPU1hdGguZmxvb3IoaVswXS8xZTMpLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEZldCh0LGUsbil7dmFyIGk9X2V0LmV4ZWMoZS5zbGljZShuLG4rMSkpO3JldHVybiBpP24raVswXS5sZW5ndGg6LTF9ZnVuY3Rpb24gVmV0KHQsZSxuKXt2YXIgaT1nZXQuZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC5RPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFVldCh0LGUsbil7dmFyIGk9Z2V0LmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIGk/KHQuUT0xZTMqK2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gamV0KHQsZSl7cmV0dXJuIHZldCh0LmdldERhdGUoKSxlLDIpfWZ1bmN0aW9uIEdldCh0LGUpe3JldHVybiB2ZXQodC5nZXRIb3VycygpLGUsMil9ZnVuY3Rpb24gV2V0KHQsZSl7cmV0dXJuIHZldCh0LmdldEhvdXJzKCklMTJ8fDEyLGUsMil9ZnVuY3Rpb24gcWV0KHQsZSl7cmV0dXJuIHZldCgxK1d0dC5jb3VudChadHQodCksdCksZSwzKX1mdW5jdGlvbiBZZXQodCxlKXtyZXR1cm4gdmV0KHQuZ2V0TWlsbGlzZWNvbmRzKCksZSwzKX1mdW5jdGlvbiBYZXQodCxlKXtyZXR1cm4gWWV0KHQsZSkrIjAwMCJ9ZnVuY3Rpb24gJGV0KHQsZSl7cmV0dXJuIHZldCh0LmdldE1vbnRoKCkrMSxlLDIpfWZ1bmN0aW9uIEtldCh0LGUpe3JldHVybiB2ZXQodC5nZXRNaW51dGVzKCksZSwyKX1mdW5jdGlvbiBaZXQodCxlKXtyZXR1cm4gdmV0KHQuZ2V0U2Vjb25kcygpLGUsMil9ZnVuY3Rpb24gSmV0KHQpe3ZhciBlPXQuZ2V0RGF5KCk7cmV0dXJuIDA9PT1lPzc6ZX1mdW5jdGlvbiBRZXQodCxlKXtyZXR1cm4gdmV0KFl0dC5jb3VudChadHQodCksdCksZSwyKX1mdW5jdGlvbiB0bnQodCxlKXt2YXIgbj10LmdldERheSgpO3JldHVybiB0PW4+PTR8fDA9PT1uPyR0dCh0KTokdHQuY2VpbCh0KSx2ZXQoJHR0LmNvdW50KFp0dCh0KSx0KSsoND09PVp0dCh0KS5nZXREYXkoKSksZSwyKX1mdW5jdGlvbiBlbnQodCl7cmV0dXJuIHQuZ2V0RGF5KCl9ZnVuY3Rpb24gbm50KHQsZSl7cmV0dXJuIHZldChYdHQuY291bnQoWnR0KHQpLHQpLGUsMil9ZnVuY3Rpb24gaW50KHQsZSl7cmV0dXJuIHZldCh0LmdldEZ1bGxZZWFyKCklMTAwLGUsMil9ZnVuY3Rpb24gcm50KHQsZSl7cmV0dXJuIHZldCh0LmdldEZ1bGxZZWFyKCklMWU0LGUsNCl9ZnVuY3Rpb24gb250KHQpe3ZhciBlPXQuZ2V0VGltZXpvbmVPZmZzZXQoKTtyZXR1cm4oZT4wPyItIjooZSo9LTEsIisiKSkrdmV0KGUvNjB8MCwiMCIsMikrdmV0KGUlNjAsIjAiLDIpfWZ1bmN0aW9uIGFudCh0LGUpe3JldHVybiB2ZXQodC5nZXRVVENEYXRlKCksZSwyKX1mdW5jdGlvbiBzbnQodCxlKXtyZXR1cm4gdmV0KHQuZ2V0VVRDSG91cnMoKSxlLDIpfWZ1bmN0aW9uIGxudCh0LGUpe3JldHVybiB2ZXQodC5nZXRVVENIb3VycygpJTEyfHwxMixlLDIpfWZ1bmN0aW9uIGNudCh0LGUpe3JldHVybiB2ZXQoMStKdHQuY291bnQocmV0KHQpLHQpLGUsMyl9ZnVuY3Rpb24gdW50KHQsZSl7cmV0dXJuIHZldCh0LmdldFVUQ01pbGxpc2Vjb25kcygpLGUsMyl9ZnVuY3Rpb24gaG50KHQsZSl7cmV0dXJuIHVudCh0LGUpKyIwMDAifWZ1bmN0aW9uIGRudCh0LGUpe3JldHVybiB2ZXQodC5nZXRVVENNb250aCgpKzEsZSwyKX1mdW5jdGlvbiBwbnQodCxlKXtyZXR1cm4gdmV0KHQuZ2V0VVRDTWludXRlcygpLGUsMil9ZnVuY3Rpb24gZm50KHQsZSl7cmV0dXJuIHZldCh0LmdldFVUQ1NlY29uZHMoKSxlLDIpfWZ1bmN0aW9uIG1udCh0KXt2YXIgZT10LmdldFVUQ0RheSgpO3JldHVybiAwPT09ZT83OmV9ZnVuY3Rpb24gZ250KHQsZSl7cmV0dXJuIHZldCh0ZXQuY291bnQocmV0KHQpLHQpLGUsMil9ZnVuY3Rpb24gX250KHQsZSl7dmFyIG49dC5nZXRVVENEYXkoKTtyZXR1cm4gdD1uPj00fHwwPT09bj9uZXQodCk6bmV0LmNlaWwodCksdmV0KG5ldC5jb3VudChyZXQodCksdCkrKDQ9PT1yZXQodCkuZ2V0VVRDRGF5KCkpLGUsMil9ZnVuY3Rpb24geW50KHQpe3JldHVybiB0LmdldFVUQ0RheSgpfWZ1bmN0aW9uIHZudCh0LGUpe3JldHVybiB2ZXQoZWV0LmNvdW50KHJldCh0KSx0KSxlLDIpfWZ1bmN0aW9uIGJudCh0LGUpe3JldHVybiB2ZXQodC5nZXRVVENGdWxsWWVhcigpJTEwMCxlLDIpfWZ1bmN0aW9uIHhudCh0LGUpe3JldHVybiB2ZXQodC5nZXRVVENGdWxsWWVhcigpJTFlNCxlLDQpfWZ1bmN0aW9uIHdudCgpe3JldHVybiIrMDAwMCJ9ZnVuY3Rpb24gU250KCl7cmV0dXJuIiUifWZ1bmN0aW9uIE1udCh0KXtyZXR1cm4rdH1mdW5jdGlvbiBFbnQodCl7cmV0dXJuIE1hdGguZmxvb3IoK3QvMWUzKX1mdW5jdGlvbiBUbnQodCl7cmV0dXJuIHVldD1jZXQodCksaGV0PXVldC5mb3JtYXQsZGV0PXVldC5wYXJzZSxwZXQ9dWV0LnV0Y0Zvcm1hdCxmZXQ9dWV0LnV0Y1BhcnNlLHVldH1UbnQoe2RhdGVUaW1lOiIleCwgJVgiLGRhdGU6IiUtbS8lLWQvJVkiLHRpbWU6IiUtSTolTTolUyAlcCIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTt2YXIgQ250LEFudCxrbnQ9IiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIsTG50PURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nP2Z1bmN0aW9uIFBudCh0KXtyZXR1cm4gdC50b0lTT1N0cmluZygpfTpwZXQoa250KSxObnQ9K25ldyBEYXRlKCIyMDAwLTAxLTAxVDAwOjAwOjAwLjAwMFoiKT9mdW5jdGlvbiBJbnQodCl7dmFyIGU9bmV3IERhdGUodCk7cmV0dXJuIGlzTmFOKGUpP251bGw6ZX06ZmV0KGtudCksUm50PTAsT250PTAsem50PTAsRG50PTAsQm50PTAsSG50PTAsRm50PSJvYmplY3QiPT10eXBlb2YgcGVyZm9ybWFuY2UmJnBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZTpEYXRlLFZudD0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTcpfTtmdW5jdGlvbiBVbnQoKXtyZXR1cm4gQm50fHwoVm50KGpudCksQm50PUZudC5ub3coKStIbnQpfWZ1bmN0aW9uIGpudCgpe0JudD0wfWZ1bmN0aW9uIEdudCgpe3RoaXMuX2NhbGw9dGhpcy5fdGltZT10aGlzLl9uZXh0PW51bGx9ZnVuY3Rpb24gV250KHQsZSxuKXt2YXIgaT1uZXcgR250O3JldHVybiBpLnJlc3RhcnQodCxlLG4pLGl9ZnVuY3Rpb24gcW50KCl7VW50KCksKytSbnQ7Zm9yKHZhciB0LGU9Q250O2U7KSh0PUJudC1lLl90aW1lKT49MCYmZS5fY2FsbC5jYWxsKG51bGwsdCksZT1lLl9uZXh0Oy0tUm50fWZ1bmN0aW9uIFludCgpe0JudD0oRG50PUZudC5ub3coKSkrSG50LFJudD1PbnQ9MDt0cnl7cW50KCl9ZmluYWxseXtSbnQ9MCwoZnVuY3Rpb24gdCgpe2Zvcih2YXIgdCxlLG49Q250LGk9MS8wO247KW4uX2NhbGw/KGk+bi5fdGltZSYmKGk9bi5fdGltZSksdD1uLG49bi5fbmV4dCk6KGU9bi5fbmV4dCxuLl9uZXh0PW51bGwsbj10P3QuX25leHQ9ZTpDbnQ9ZSk7QW50PXQsJG50KGkpfSkoKSxCbnQ9MH19ZnVuY3Rpb24gWG50KCl7dmFyIHQ9Rm50Lm5vdygpLGU9dC1EbnQ7ZT4xZTMmJihIbnQtPWUsRG50PXQpfWZ1bmN0aW9uICRudCh0KXtSbnR8fChPbnQmJihPbnQ9Y2xlYXJUaW1lb3V0KE9udCkpLHQtQm50PjI0Pyh0PDEvMCYmKE9udD1zZXRUaW1lb3V0KFludCx0LUZudC5ub3coKS1IbnQpKSx6bnQmJih6bnQ9Y2xlYXJJbnRlcnZhbCh6bnQpKSk6KHpudHx8KERudD1GbnQubm93KCksem50PXNldEludGVydmFsKFhudCwxZTMpKSxSbnQ9MSxWbnQoWW50KSkpfUdudC5wcm90b3R5cGU9V250LnByb3RvdHlwZT17Y29uc3RydWN0b3I6R250LHJlc3RhcnQ6ZnVuY3Rpb24odCxlLG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uIik7bj0obnVsbD09bj9VbnQoKTorbikrKG51bGw9PWU/MDorZSksdGhpcy5fbmV4dHx8QW50PT09dGhpc3x8KEFudD9BbnQuX25leHQ9dGhpczpDbnQ9dGhpcyxBbnQ9dGhpcyksdGhpcy5fY2FsbD10LHRoaXMuX3RpbWU9biwkbnQoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2NhbGwmJih0aGlzLl9jYWxsPW51bGwsdGhpcy5fdGltZT0xLzAsJG50KCkpfX07dmFyIEtudD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsWm50PXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDpLbnQseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTtmdW5jdGlvbiBKbnQodCl7dmFyIGU9dCs9IiIsbj1lLmluZGV4T2YoIjoiKTtyZXR1cm4gbj49MCYmInhtbG5zIiE9PShlPXQuc2xpY2UoMCxuKSkmJih0PXQuc2xpY2UobisxKSksWm50Lmhhc093blByb3BlcnR5KGUpP3tzcGFjZTpabnRbZV0sbG9jYWw6dH06dH1mdW5jdGlvbiBRbnQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vd25lckRvY3VtZW50LG49dGhpcy5uYW1lc3BhY2VVUkk7cmV0dXJuIG49PT1LbnQmJmUuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PUtudD9lLmNyZWF0ZUVsZW1lbnQodCk6ZS5jcmVhdGVFbGVtZW50TlMobix0KX19ZnVuY3Rpb24gdGl0KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIGVpdCh0KXt2YXIgZT1KbnQodCk7cmV0dXJuKGUubG9jYWw/dGl0OlFudCkoZSl9ZnVuY3Rpb24gbml0KCl7fWZ1bmN0aW9uIGlpdCh0KXtyZXR1cm4gbnVsbD09dD9uaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpfX1mdW5jdGlvbiByaXQoKXtyZXR1cm5bXX1mdW5jdGlvbiBvaXQodCl7cmV0dXJuIG51bGw9PXQ/cml0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbCh0KX19ZnVuY3Rpb24gYWl0KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hdGNoZXModCl9fWZ1bmN0aW9uIHNpdCh0KXtyZXR1cm4gbmV3IEFycmF5KHQubGVuZ3RoKX1mdW5jdGlvbiBsaXQodCxlKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPWV9ZnVuY3Rpb24gY2l0KHQsZSxuLGkscixvKXtmb3IodmFyIGEscz0wLGw9ZS5sZW5ndGgsYz1vLmxlbmd0aDtzPGM7KytzKShhPWVbc10pPyhhLl9fZGF0YV9fPW9bc10saVtzXT1hKTpuW3NdPW5ldyBsaXQodCxvW3NdKTtmb3IoO3M8bDsrK3MpKGE9ZVtzXSkmJihyW3NdPWEpfWZ1bmN0aW9uIHVpdCh0LGUsbixpLHIsbyxhKXt2YXIgcyxsLGMsdT17fSxoPWUubGVuZ3RoLGQ9by5sZW5ndGgscD1uZXcgQXJyYXkoaCk7Zm9yKHM9MDtzPGg7KytzKShsPWVbc10pJiYocFtzXT1jPSIkIithLmNhbGwobCxsLl9fZGF0YV9fLHMsZSksYyBpbiB1P3Jbc109bDp1W2NdPWwpO2ZvcihzPTA7czxkOysrcykobD11W2M9IiQiK2EuY2FsbCh0LG9bc10scyxvKV0pPyhpW3NdPWwsbC5fX2RhdGFfXz1vW3NdLHVbY109bnVsbCk6bltzXT1uZXcgbGl0KHQsb1tzXSk7Zm9yKHM9MDtzPGg7KytzKShsPWVbc10pJiZ1W3Bbc11dPT09bCYmKHJbc109bCl9ZnVuY3Rpb24gaGl0KHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTp0Pj1lPzA6TmFOfWZ1bmN0aW9uIGRpdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19ZnVuY3Rpb24gcGl0KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gZml0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUodCxlKX19ZnVuY3Rpb24gbWl0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsZSl9fWZ1bmN0aW9uIGdpdCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PW4/dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCk6dGhpcy5zZXRBdHRyaWJ1dGUodCxuKX19ZnVuY3Rpb24gX2l0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk6dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsbil9fWZ1bmN0aW9uIHlpdCh0KXtyZXR1cm4gdC5vd25lckRvY3VtZW50JiZ0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHQuZG9jdW1lbnQmJnR8fHQuZGVmYXVsdFZpZXd9ZnVuY3Rpb24gdml0KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fWZ1bmN0aW9uIGJpdCh0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LGUsbil9fWZ1bmN0aW9uIHhpdCh0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09aT90aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpOnRoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxpLG4pfX1mdW5jdGlvbiB3aXQodCxlKXtyZXR1cm4gdC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKGUpfHx5aXQodCkuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpLmdldFByb3BlcnR5VmFsdWUoZSl9ZnVuY3Rpb24gU2l0KHQpe3JldHVybiBmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW3RdfX1mdW5jdGlvbiBNaXQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzW3RdPWV9fWZ1bmN0aW9uIEVpdCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PW4/ZGVsZXRlIHRoaXNbdF06dGhpc1t0XT1ufX1mdW5jdGlvbiBUaXQodCl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uIENpdCh0KXtyZXR1cm4gdC5jbGFzc0xpc3R8fG5ldyBBaXQodCl9ZnVuY3Rpb24gQWl0KHQpe3RoaXMuX25vZGU9dCx0aGlzLl9uYW1lcz1UaXQodC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX1mdW5jdGlvbiBraXQodCxlKXtmb3IodmFyIG49Q2l0KHQpLGk9LTEscj1lLmxlbmd0aDsrK2k8cjspbi5hZGQoZVtpXSl9ZnVuY3Rpb24gTGl0KHQsZSl7Zm9yKHZhciBuPUNpdCh0KSxpPS0xLHI9ZS5sZW5ndGg7KytpPHI7KW4ucmVtb3ZlKGVbaV0pfWZ1bmN0aW9uIFBpdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtraXQodGhpcyx0KX19ZnVuY3Rpb24gTml0KHQpe3JldHVybiBmdW5jdGlvbigpe0xpdCh0aGlzLHQpfX1mdW5jdGlvbiBJaXQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXsoZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk/a2l0OkxpdCkodGhpcyx0KX19ZnVuY3Rpb24gUml0KCl7dGhpcy50ZXh0Q29udGVudD0iIn1mdW5jdGlvbiBPaXQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD10fX1mdW5jdGlvbiB6aXQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT1lPyIiOmV9fWZ1bmN0aW9uIERpdCgpe3RoaXMuaW5uZXJIVE1MPSIifWZ1bmN0aW9uIEJpdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD10fX1mdW5jdGlvbiBIaXQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pbm5lckhUTUw9bnVsbD09ZT8iIjplfX1mdW5jdGlvbiBGaXQoKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gVml0KCl7dGhpcy5wcmV2aW91c1NpYmxpbmcmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcyx0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gVWl0KCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gaml0KCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gR2l0KCl7dmFyIHQ9dGhpcy5jbG9uZU5vZGUoITEpLGU9dGhpcy5wYXJlbnROb2RlO3JldHVybiBlP2UuaW5zZXJ0QmVmb3JlKHQsdGhpcy5uZXh0U2libGluZyk6dH1mdW5jdGlvbiBXaXQoKXt2YXIgdD10aGlzLmNsb25lTm9kZSghMCksZT10aGlzLnBhcmVudE5vZGU7cmV0dXJuIGU/ZS5pbnNlcnRCZWZvcmUodCx0aGlzLm5leHRTaWJsaW5nKTp0fWxpdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmxpdCxhcHBlbmRDaGlsZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LHRoaXMuX25leHQpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LGUpfSxxdWVyeVNlbGVjdG9yOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3Rvcih0KX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCl9fSxBaXQucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtlPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKGUsMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgcWl0PXt9O2Z1bmN0aW9uIFlpdCh0LGUsbil7cmV0dXJuIHQ9WGl0KHQsZSxuKSxmdW5jdGlvbihlKXt2YXIgbj1lLnJlbGF0ZWRUYXJnZXQ7biYmKG49PT10aGlzfHw4Jm4uY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcykpfHx0LmNhbGwodGhpcyxlKX19ZnVuY3Rpb24gWGl0KHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oaSl7dHJ5e3QuY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZSxuKX1maW5hbGx5e319fWZ1bmN0aW9uICRpdCh0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKChmdW5jdGlvbih0KXt2YXIgZT0iIixuPXQuaW5kZXhPZigiLiIpO3JldHVybiBuPj0wJiYoZT10LnNsaWNlKG4rMSksdD10LnNsaWNlKDAsbikpLHt0eXBlOnQsbmFtZTplfX0pKX1mdW5jdGlvbiBLaXQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fX29uO2lmKGUpe2Zvcih2YXIgbixpPTAscj0tMSxvPWUubGVuZ3RoO2k8bzsrK2kpbj1lW2ldLHQudHlwZSYmbi50eXBlIT09dC50eXBlfHxuLm5hbWUhPT10Lm5hbWU/ZVsrK3JdPW46dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG4udHlwZSxuLmxpc3RlbmVyLG4uY2FwdHVyZSk7KytyP2UubGVuZ3RoPXI6ZGVsZXRlIHRoaXMuX19vbn19fWZ1bmN0aW9uIFppdCh0LGUsbil7dmFyIGk9cWl0Lmhhc093blByb3BlcnR5KHQudHlwZSk/WWl0OlhpdDtyZXR1cm4gZnVuY3Rpb24ocixvLGEpe3ZhciBzLGw9dGhpcy5fX29uLGM9aShlLG8sYSk7aWYobClmb3IodmFyIHU9MCxoPWwubGVuZ3RoO3U8aDsrK3UpaWYoKHM9bFt1XSkudHlwZT09PXQudHlwZSYmcy5uYW1lPT09dC5uYW1lKXJldHVybiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIocy50eXBlLHMubGlzdGVuZXIscy5jYXB0dXJlKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIocy50eXBlLHMubGlzdGVuZXI9YyxzLmNhcHR1cmU9biksdm9pZChzLnZhbHVlPWUpO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LnR5cGUsYyxuKSxzPXt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSx2YWx1ZTplLGxpc3RlbmVyOmMsY2FwdHVyZTpufSxsP2wucHVzaChzKTp0aGlzLl9fb249W3NdfX1mdW5jdGlvbiBKaXQodCxlLG4pe3ZhciBpPXlpdCh0KSxyPWkuQ3VzdG9tRXZlbnQ7ImZ1bmN0aW9uIj09dHlwZW9mIHI/cj1uZXcgcihlLG4pOihyPWkuZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iiksbj8oci5pbml0RXZlbnQoZSxuLmJ1YmJsZXMsbi5jYW5jZWxhYmxlKSxyLmRldGFpbD1uLmRldGFpbCk6ci5pbml0RXZlbnQoZSwhMSwhMSkpLHQuZGlzcGF0Y2hFdmVudChyKX1mdW5jdGlvbiBRaXQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gSml0KHRoaXMsdCxlKX19ZnVuY3Rpb24gdHJ0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEppdCh0aGlzLHQsZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX0idW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiYoIm9ubW91c2VlbnRlciJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fChxaXQ9e21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSkpO3ZhciBlcnQ9W251bGxdO2Z1bmN0aW9uIG5ydCh0LGUpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9ZX1mdW5jdGlvbiBpcnQoKXtyZXR1cm4gbmV3IG5ydChbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLGVydCl9bnJ0LnByb3RvdHlwZT1pcnQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpucnQsc2VsZWN0OmZ1bmN0aW9uIHJydCh0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9aWl0KHQpKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49ZS5sZW5ndGgsaT1uZXcgQXJyYXkobikscj0wO3I8bjsrK3IpZm9yKHZhciBvLGEscz1lW3JdLGw9cy5sZW5ndGgsYz1pW3JdPW5ldyBBcnJheShsKSx1PTA7dTxsOysrdSkobz1zW3VdKSYmKGE9dC5jYWxsKG8sby5fX2RhdGFfXyx1LHMpKSYmKCJfX2RhdGFfXyJpbiBvJiYoYS5fX2RhdGFfXz1vLl9fZGF0YV9fKSxjW3VdPWEpO3JldHVybiBuZXcgbnJ0KGksdGhpcy5fcGFyZW50cyl9LHNlbGVjdEFsbDpmdW5jdGlvbiBvcnQodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PW9pdCh0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9W10scj1bXSxvPTA7bzxuOysrbylmb3IodmFyIGEscz1lW29dLGw9cy5sZW5ndGgsYz0wO2M8bDsrK2MpKGE9c1tjXSkmJihpLnB1c2godC5jYWxsKGEsYS5fX2RhdGFfXyxjLHMpKSxyLnB1c2goYSkpO3JldHVybiBuZXcgbnJ0KGkscil9LGZpbHRlcjpmdW5jdGlvbiBhcnQodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PWFpdCh0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWZvcih2YXIgbyxhPWVbcl0scz1hLmxlbmd0aCxsPWlbcl09W10sYz0wO2M8czsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmbC5wdXNoKG8pO3JldHVybiBuZXcgbnJ0KGksdGhpcy5fcGFyZW50cyl9LGRhdGE6ZnVuY3Rpb24gc3J0KHQsZSl7aWYoIXQpcmV0dXJuIGY9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSx1PS0xLHRoaXMuZWFjaCgoZnVuY3Rpb24odCl7ZlsrK3VdPXR9KSksZjt2YXIgbj1lP3VpdDpjaXQsaT10aGlzLl9wYXJlbnRzLHI9dGhpcy5fZ3JvdXBzOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD0oZnVuY3Rpb24gbyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KSh0KSk7Zm9yKHZhciBhPXIubGVuZ3RoLHM9bmV3IEFycmF5KGEpLGw9bmV3IEFycmF5KGEpLGM9bmV3IEFycmF5KGEpLHU9MDt1PGE7Kyt1KXt2YXIgaD1pW3VdLGQ9clt1XSxwPWQubGVuZ3RoLGY9dC5jYWxsKGgsaCYmaC5fX2RhdGFfXyx1LGkpLG09Zi5sZW5ndGgsZz1sW3VdPW5ldyBBcnJheShtKSxfPXNbdV09bmV3IEFycmF5KG0pO24oaCxkLGcsXyxjW3VdPW5ldyBBcnJheShwKSxmLGUpO2Zvcih2YXIgeSx2LGI9MCx4PTA7YjxtOysrYilpZih5PWdbYl0pe2ZvcihiPj14JiYoeD1iKzEpOyEodj1fW3hdKSYmKyt4PG07KTt5Ll9uZXh0PXZ8fG51bGx9fXJldHVybihzPW5ldyBucnQocyxpKSkuX2VudGVyPWwscy5fZXhpdD1jLHN9LGVudGVyOmZ1bmN0aW9uIGxydCgpe3JldHVybiBuZXcgbnJ0KHRoaXMuX2VudGVyfHx0aGlzLl9ncm91cHMubWFwKHNpdCksdGhpcy5fcGFyZW50cyl9LGV4aXQ6ZnVuY3Rpb24gY3J0KCl7cmV0dXJuIG5ldyBucnQodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChzaXQpLHRoaXMuX3BhcmVudHMpfSxqb2luOmZ1bmN0aW9uIHVydCh0LGUsbil7dmFyIGk9dGhpcy5lbnRlcigpLHI9dGhpcyxvPXRoaXMuZXhpdCgpO3JldHVybiBpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3QoaSk6aS5hcHBlbmQodCsiIiksbnVsbCE9ZSYmKHI9ZShyKSksbnVsbD09bj9vLnJlbW92ZSgpOm4obyksaSYmcj9pLm1lcmdlKHIpLm9yZGVyKCk6cn0sbWVyZ2U6ZnVuY3Rpb24gaHJ0KHQpe2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj10Ll9ncm91cHMsaT1lLmxlbmd0aCxyPU1hdGgubWluKGksbi5sZW5ndGgpLG89bmV3IEFycmF5KGkpLGE9MDthPHI7KythKWZvcih2YXIgcyxsPWVbYV0sYz1uW2FdLHU9bC5sZW5ndGgsaD1vW2FdPW5ldyBBcnJheSh1KSxkPTA7ZDx1OysrZCkocz1sW2RdfHxjW2RdKSYmKGhbZF09cyk7Zm9yKDthPGk7KythKW9bYV09ZVthXTtyZXR1cm4gbmV3IG5ydChvLHRoaXMuX3BhcmVudHMpfSxvcmRlcjpmdW5jdGlvbiBkcnQoKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLGU9LTEsbj10Lmxlbmd0aDsrK2U8bjspZm9yKHZhciBpLHI9dFtlXSxvPXIubGVuZ3RoLTEsYT1yW29dOy0tbz49MDspKGk9cltvXSkmJihhJiY0XmkuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSkmJmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaSxhKSxhPWkpO3JldHVybiB0aGlzfSxzb3J0OmZ1bmN0aW9uIHBydCh0KXtmdW5jdGlvbiBlKGUsbil7cmV0dXJuIGUmJm4/dChlLl9fZGF0YV9fLG4uX19kYXRhX18pOiFlLSFufXR8fCh0PWhpdCk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxpPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGkpLG89MDtvPGk7KytvKXtmb3IodmFyIGEscz1uW29dLGw9cy5sZW5ndGgsYz1yW29dPW5ldyBBcnJheShsKSx1PTA7dTxsOysrdSkoYT1zW3VdKSYmKGNbdV09YSk7Yy5zb3J0KGUpfXJldHVybiBuZXcgbnJ0KHIsdGhpcy5fcGFyZW50cykub3JkZXIoKX0sY2FsbDpmdW5jdGlvbiBmcnQoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGFyZ3VtZW50c1swXT10aGlzLHQuYXBwbHkobnVsbCxhcmd1bWVudHMpLHRoaXN9LG5vZGVzOmZ1bmN0aW9uIG1ydCgpe3ZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSksZT0tMTtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3RbKytlXT10aGlzfSkpLHR9LG5vZGU6ZnVuY3Rpb24gZ3J0KCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxlPTAsbj10Lmxlbmd0aDtlPG47KytlKWZvcih2YXIgaT10W2VdLHI9MCxvPWkubGVuZ3RoO3I8bzsrK3Ipe3ZhciBhPWlbcl07aWYoYSlyZXR1cm4gYX1yZXR1cm4gbnVsbH0sc2l6ZTpmdW5jdGlvbiBfcnQoKXt2YXIgdD0wO3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7Kyt0fSkpLHR9LGVtcHR5OmZ1bmN0aW9uIHlydCgpe3JldHVybiF0aGlzLm5vZGUoKX0sZWFjaDpmdW5jdGlvbiB2cnQodCl7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPTAsaT1lLmxlbmd0aDtuPGk7KytuKWZvcih2YXIgcixvPWVbbl0sYT0wLHM9by5sZW5ndGg7YTxzOysrYSkocj1vW2FdKSYmdC5jYWxsKHIsci5fX2RhdGFfXyxhLG8pO3JldHVybiB0aGlzfSxhdHRyOmZ1bmN0aW9uIGJydCh0LGUpe3ZhciBuPUpudCh0KTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciBpPXRoaXMubm9kZSgpO3JldHVybiBuLmxvY2FsP2kuZ2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsKTppLmdldEF0dHJpYnV0ZShuKX1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1lP24ubG9jYWw/cGl0OmRpdDoiZnVuY3Rpb24iPT10eXBlb2YgZT9uLmxvY2FsP19pdDpnaXQ6bi5sb2NhbD9taXQ6Zml0KShuLGUpKX0sc3R5bGU6ZnVuY3Rpb24geHJ0KHQsZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09ZT92aXQ6ImZ1bmN0aW9uIj09dHlwZW9mIGU/eGl0OmJpdCkodCxlLG51bGw9PW4/IiI6bikpOndpdCh0aGlzLm5vZGUoKSx0KX0scHJvcGVydHk6ZnVuY3Rpb24gd3J0KHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PWU/U2l0OiJmdW5jdGlvbiI9PXR5cGVvZiBlP0VpdDpNaXQpKHQsZSkpOnRoaXMubm9kZSgpW3RdfSxjbGFzc2VkOmZ1bmN0aW9uIFNydCh0LGUpe3ZhciBuPVRpdCh0KyIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgaT1DaXQodGhpcy5ub2RlKCkpLHI9LTEsbz1uLmxlbmd0aDsrK3I8bzspaWYoIWkuY29udGFpbnMobltyXSkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIGU/SWl0OmU/UGl0Ok5pdCkobixlKSl9LHRleHQ6ZnVuY3Rpb24gTXJ0KHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P1JpdDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/eml0Ok9pdCkodCkpOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxodG1sOmZ1bmN0aW9uIEVydCh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9EaXQ6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P0hpdDpCaXQpKHQpKTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LHJhaXNlOmZ1bmN0aW9uIFRydCgpe3JldHVybiB0aGlzLmVhY2goRml0KX0sbG93ZXI6ZnVuY3Rpb24gQ3J0KCl7cmV0dXJuIHRoaXMuZWFjaChWaXQpfSxhcHBlbmQ6ZnVuY3Rpb24gQXJ0KHQpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZWl0KHQpO3JldHVybiB0aGlzLnNlbGVjdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KSl9LGluc2VydDpmdW5jdGlvbiBrcnQodCxlKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmVpdCh0KSxpPW51bGw9PWU/VWl0OiJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6aWl0KGUpO3JldHVybiB0aGlzLnNlbGVjdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUobi5hcHBseSh0aGlzLGFyZ3VtZW50cyksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSkpfSxyZW1vdmU6ZnVuY3Rpb24gTHJ0KCl7cmV0dXJuIHRoaXMuZWFjaChqaXQpfSxjbG9uZTpmdW5jdGlvbiBQcnQodCl7cmV0dXJuIHRoaXMuc2VsZWN0KHQ/V2l0OkdpdCl9LGRhdHVtOmZ1bmN0aW9uIE5ydCh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsdCk6dGhpcy5ub2RlKCkuX19kYXRhX199LG9uOmZ1bmN0aW9uIElydCh0LGUsbil7dmFyIGkscixvPSRpdCh0KyIiKSxhPW8ubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7Zm9yKHM9ZT9aaXQ6S2l0LG51bGw9PW4mJihuPSExKSxpPTA7aTxhOysraSl0aGlzLmVhY2gocyhvW2ldLGUsbikpO3JldHVybiB0aGlzfXZhciBzPXRoaXMubm9kZSgpLl9fb247aWYocylmb3IodmFyIGwsYz0wLHU9cy5sZW5ndGg7Yzx1OysrYylmb3IoaT0wLGw9c1tjXTtpPGE7KytpKWlmKChyPW9baV0pLnR5cGU9PT1sLnR5cGUmJnIubmFtZT09PWwubmFtZSlyZXR1cm4gbC52YWx1ZX0sZGlzcGF0Y2g6ZnVuY3Rpb24gUnJ0KHQsZSl7cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIGU/dHJ0OlFpdCkodCxlKSl9fTt2YXIgT3J0PXt2YWx1ZTpmdW5jdGlvbigpe319O2Z1bmN0aW9uIHpydCgpe2Zvcih2YXIgdCxlPTAsbj1hcmd1bWVudHMubGVuZ3RoLGk9e307ZTxuOysrZSl7aWYoISh0PWFyZ3VtZW50c1tlXSsiIil8fHQgaW4gaXx8L1tccy5dLy50ZXN0KHQpKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO2lbdF09W119cmV0dXJuIG5ldyBEcnQoaSl9ZnVuY3Rpb24gRHJ0KHQpe3RoaXMuXz10fWZ1bmN0aW9uIEJydCh0LGUpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBuPSIiLGk9dC5pbmRleE9mKCIuIik7aWYoaT49MCYmKG49dC5zbGljZShpKzEpLHQ9dC5zbGljZSgwLGkpKSx0JiYhZS5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtyZXR1cm57dHlwZTp0LG5hbWU6bn19KSl9ZnVuY3Rpb24gSHJ0KHQsZSl7Zm9yKHZhciBuLGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpaWYoKG49dFtpXSkubmFtZT09PWUpcmV0dXJuIG4udmFsdWV9ZnVuY3Rpb24gRnJ0KHQsZSxuKXtmb3IodmFyIGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpaWYodFtpXS5uYW1lPT09ZSl7dFtpXT1PcnQsdD10LnNsaWNlKDAsaSkuY29uY2F0KHQuc2xpY2UoaSsxKSk7YnJlYWt9cmV0dXJuIG51bGwhPW4mJnQucHVzaCh7bmFtZTplLHZhbHVlOm59KSx0fURydC5wcm90b3R5cGU9enJ0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6RHJ0LG9uOmZ1bmN0aW9uKHQsZSl7dmFyIG4saT10aGlzLl8scj1CcnQodCsiIixpKSxvPS0xLGE9ci5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrZSk7Zm9yKDsrK288YTspaWYobj0odD1yW29dKS50eXBlKWlbbl09RnJ0KGlbbl0sdC5uYW1lLGUpO2Vsc2UgaWYobnVsbD09ZSlmb3IobiBpbiBpKWlbbl09RnJ0KGlbbl0sdC5uYW1lLG51bGwpO3JldHVybiB0aGlzfWZvcig7KytvPGE7KWlmKChuPSh0PXJbb10pLnR5cGUpJiYobj1IcnQoaVtuXSx0Lm5hbWUpKSlyZXR1cm4gbn0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LGU9dGhpcy5fO2Zvcih2YXIgbiBpbiBlKXRbbl09ZVtuXS5zbGljZSgpO3JldHVybiBuZXcgRHJ0KHQpfSxjYWxsOmZ1bmN0aW9uKHQsZSl7aWYoKG49YXJndW1lbnRzLmxlbmd0aC0yKT4wKWZvcih2YXIgbixpLHI9bmV3IEFycmF5KG4pLG89MDtvPG47KytvKXJbb109YXJndW1lbnRzW28rMl07aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3Iobz0wLG49KGk9dGhpcy5fW3RdKS5sZW5ndGg7bzxuOysrbylpW29dLnZhbHVlLmFwcGx5KGUscil9LGFwcGx5OmZ1bmN0aW9uKHQsZSxuKXtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2Zvcih2YXIgaT10aGlzLl9bdF0scj0wLG89aS5sZW5ndGg7cjxvOysrcilpW3JdLnZhbHVlLmFwcGx5KGUsbil9fTt2YXIgVnJ0LFVydCxqcnQ9MCxHcnQ9MCxXcnQ9MCxxcnQ9MCxZcnQ9MCxYcnQ9MCwkcnQ9Im9iamVjdCI9PXR5cGVvZiBwZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlOkRhdGUsS3J0PSJvYmplY3QiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lP3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpOmZ1bmN0aW9uKHQpe3NldFRpbWVvdXQodCwxNyl9O2Z1bmN0aW9uIFpydCgpe3JldHVybiBZcnR8fChLcnQoSnJ0KSxZcnQ9JHJ0Lm5vdygpK1hydCl9ZnVuY3Rpb24gSnJ0KCl7WXJ0PTB9ZnVuY3Rpb24gUXJ0KCl7dGhpcy5fY2FsbD10aGlzLl90aW1lPXRoaXMuX25leHQ9bnVsbH1mdW5jdGlvbiB0b3QodCxlLG4pe3ZhciBpPW5ldyBRcnQ7cmV0dXJuIGkucmVzdGFydCh0LGUsbiksaX1mdW5jdGlvbiBlb3QoKXtZcnQ9KHFydD0kcnQubm93KCkpK1hydCxqcnQ9R3J0PTA7dHJ5eyEoZnVuY3Rpb24gdCgpe1pydCgpLCsranJ0O2Zvcih2YXIgdCxlPVZydDtlOykodD1ZcnQtZS5fdGltZSk+PTAmJmUuX2NhbGwuY2FsbChudWxsLHQpLGU9ZS5fbmV4dDstLWpydH0pKCl9ZmluYWxseXtqcnQ9MCwoZnVuY3Rpb24gZSgpe2Zvcih2YXIgdCxlLG49VnJ0LGk9MS8wO247KW4uX2NhbGw/KGk+bi5fdGltZSYmKGk9bi5fdGltZSksdD1uLG49bi5fbmV4dCk6KGU9bi5fbmV4dCxuLl9uZXh0PW51bGwsbj10P3QuX25leHQ9ZTpWcnQ9ZSk7VXJ0PXQsaW90KGkpfSkoKSxZcnQ9MH19ZnVuY3Rpb24gbm90KCl7dmFyIHQ9JHJ0Lm5vdygpLGU9dC1xcnQ7ZT4xZTMmJihYcnQtPWUscXJ0PXQpfWZ1bmN0aW9uIGlvdCh0KXtqcnR8fChHcnQmJihHcnQ9Y2xlYXJUaW1lb3V0KEdydCkpLHQtWXJ0PjI0Pyh0PDEvMCYmKEdydD1zZXRUaW1lb3V0KGVvdCx0LSRydC5ub3coKS1YcnQpKSxXcnQmJihXcnQ9Y2xlYXJJbnRlcnZhbChXcnQpKSk6KFdydHx8KHFydD0kcnQubm93KCksV3J0PXNldEludGVydmFsKG5vdCwxZTMpKSxqcnQ9MSxLcnQoZW90KSkpfWZ1bmN0aW9uIHJvdCh0LGUsbil7dmFyIGk9bmV3IFFydDtyZXR1cm4gaS5yZXN0YXJ0KChmdW5jdGlvbihuKXtpLnN0b3AoKSx0KG4rZSl9KSxlPW51bGw9PWU/MDorZSxuKSxpfVFydC5wcm90b3R5cGU9dG90LnByb3RvdHlwZT17Y29uc3RydWN0b3I6UXJ0LHJlc3RhcnQ6ZnVuY3Rpb24odCxlLG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uIik7bj0obnVsbD09bj9acnQoKTorbikrKG51bGw9PWU/MDorZSksdGhpcy5fbmV4dHx8VXJ0PT09dGhpc3x8KFVydD9VcnQuX25leHQ9dGhpczpWcnQ9dGhpcyxVcnQ9dGhpcyksdGhpcy5fY2FsbD10LHRoaXMuX3RpbWU9bixpb3QoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2NhbGwmJih0aGlzLl9jYWxsPW51bGwsdGhpcy5fdGltZT0xLzAsaW90KCkpfX07dmFyIG9vdD16cnQoInN0YXJ0IiwiZW5kIiwiaW50ZXJydXB0IiksYW90PVtdO2Z1bmN0aW9uIHNvdCh0LGUsbixpLHIsbyl7dmFyIGE9dC5fX3RyYW5zaXRpb247aWYoYSl7aWYobiBpbiBhKXJldHVybn1lbHNlIHQuX190cmFuc2l0aW9uPXt9OyEoZnVuY3Rpb24gcyh0LGUsbil7dmFyIGkscj10Ll9fdHJhbnNpdGlvbjtmdW5jdGlvbiBvKGwpe3ZhciBjLHUsaCxkO2lmKDEhPT1uLnN0YXRlKXJldHVybiBzKCk7Zm9yKGMgaW4gcilpZigoZD1yW2NdKS5uYW1lPT09bi5uYW1lKXtpZigzPT09ZC5zdGF0ZSlyZXR1cm4gcm90KG8pOzQ9PT1kLnN0YXRlPyhkLnN0YXRlPTYsZC50aW1lci5zdG9wKCksZC5vbi5jYWxsKCJpbnRlcnJ1cHQiLHQsdC5fX2RhdGFfXyxkLmluZGV4LGQuZ3JvdXApLGRlbGV0ZSByW2NdKTorYzxlJiYoZC5zdGF0ZT02LGQudGltZXIuc3RvcCgpLGRlbGV0ZSByW2NdKX1pZihyb3QoKGZ1bmN0aW9uKCl7Mz09PW4uc3RhdGUmJihuLnN0YXRlPTQsbi50aW1lci5yZXN0YXJ0KGEsbi5kZWxheSxuLnRpbWUpLGEobCkpfSkpLG4uc3RhdGU9MixuLm9uLmNhbGwoInN0YXJ0Iix0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSwyPT09bi5zdGF0ZSl7Zm9yKG4uc3RhdGU9MyxpPW5ldyBBcnJheShoPW4udHdlZW4ubGVuZ3RoKSxjPTAsdT0tMTtjPGg7KytjKShkPW4udHdlZW5bY10udmFsdWUuY2FsbCh0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSkmJihpWysrdV09ZCk7aS5sZW5ndGg9dSsxfX1mdW5jdGlvbiBhKGUpe2Zvcih2YXIgcj1lPG4uZHVyYXRpb24/bi5lYXNlLmNhbGwobnVsbCxlL24uZHVyYXRpb24pOihuLnRpbWVyLnJlc3RhcnQocyksbi5zdGF0ZT01LDEpLG89LTEsYT1pLmxlbmd0aDsrK288YTspaVtvXS5jYWxsKG51bGwscik7NT09PW4uc3RhdGUmJihuLm9uLmNhbGwoImVuZCIsdCx0Ll9fZGF0YV9fLG4uaW5kZXgsbi5ncm91cCkscygpKX1mdW5jdGlvbiBzKCl7Zm9yKHZhciBpIGluIG4uc3RhdGU9NixuLnRpbWVyLnN0b3AoKSxkZWxldGUgcltlXSxyKXJldHVybjtkZWxldGUgdC5fX3RyYW5zaXRpb259cltlXT1uLG4udGltZXI9dG90KChmdW5jdGlvbiBsKHQpe24uc3RhdGU9MSxuLnRpbWVyLnJlc3RhcnQobyxuLmRlbGF5LG4udGltZSksbi5kZWxheTw9dCYmbyh0LW4uZGVsYXkpfSksMCxuLnRpbWUpfSkodCxuLHtuYW1lOmUsaW5kZXg6aSxncm91cDpyLG9uOm9vdCx0d2Vlbjphb3QsdGltZTpvLnRpbWUsZGVsYXk6by5kZWxheSxkdXJhdGlvbjpvLmR1cmF0aW9uLGVhc2U6by5lYXNlLHRpbWVyOm51bGwsc3RhdGU6MH0pfWZ1bmN0aW9uIGxvdCh0LGUpe3ZhciBuPXVvdCh0LGUpO2lmKG4uc3RhdGU+MCl0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZCIpO3JldHVybiBufWZ1bmN0aW9uIGNvdCh0LGUpe3ZhciBuPXVvdCh0LGUpO2lmKG4uc3RhdGU+Mil0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHN0YXJ0ZWQiKTtyZXR1cm4gbn1mdW5jdGlvbiB1b3QodCxlKXt2YXIgbj10Ll9fdHJhbnNpdGlvbjtpZighbnx8IShuPW5bZV0pKXRocm93IG5ldyBFcnJvcigidHJhbnNpdGlvbiBub3QgZm91bmQiKTtyZXR1cm4gbn1mdW5jdGlvbiBob3QodCxlKXt2YXIgbixpLHIsbz10Ll9fdHJhbnNpdGlvbixhPSEwO2lmKG8pe2ZvcihyIGluIGU9bnVsbD09ZT9udWxsOmUrIiIsbykobj1vW3JdKS5uYW1lPT09ZT8oaT1uLnN0YXRlPjImJm4uc3RhdGU8NSxuLnN0YXRlPTYsbi50aW1lci5zdG9wKCksaSYmbi5vbi5jYWxsKCJpbnRlcnJ1cHQiLHQsdC5fX2RhdGFfXyxuLmluZGV4LG4uZ3JvdXApLGRlbGV0ZSBvW3JdKTphPSExO2EmJmRlbGV0ZSB0Ll9fdHJhbnNpdGlvbn19ZnVuY3Rpb24gZG90KHQsZSxuKXt0LnByb3RvdHlwZT1lLnByb3RvdHlwZT1uLG4uY29uc3RydWN0b3I9dH1mdW5jdGlvbiBwb3QodCxlKXt2YXIgbj1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIGkgaW4gZSluW2ldPWVbaV07cmV0dXJuIG59ZnVuY3Rpb24gZm90KCl7fXZhciBtb3Q9LjcsZ290PTEvbW90LF9vdD0iXFxzKihbKy1dP1xcZCspXFxzKiIseW90PSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLHZvdD0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIsYm90PS9eIyhbMC05YS1mXXszLDh9KSQvLHhvdD1uZXcgUmVnRXhwKCJecmdiXFwoIitbX290LF9vdCxfb3RdKyJcXCkkIiksd290PW5ldyBSZWdFeHAoIl5yZ2JcXCgiK1t2b3Qsdm90LHZvdF0rIlxcKSQiKSxTb3Q9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tfb3QsX290LF9vdCx5b3RdKyJcXCkkIiksTW90PW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbdm90LHZvdCx2b3QseW90XSsiXFwpJCIpLEVvdD1uZXcgUmVnRXhwKCJeaHNsXFwoIitbeW90LHZvdCx2b3RdKyJcXCkkIiksVG90PW5ldyBSZWdFeHAoIl5oc2xhXFwoIitbeW90LHZvdCx2b3QseW90XSsiXFwpJCIpLENvdD17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtmdW5jdGlvbiBBb3QoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKX1mdW5jdGlvbiBrb3QoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKX1mdW5jdGlvbiBMb3QodCl7dmFyIGUsbjtyZXR1cm4gdD0odCsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKGU9Ym90LmV4ZWModCkpPyhuPWVbMV0ubGVuZ3RoLGU9cGFyc2VJbnQoZVsxXSwxNiksNj09PW4/UG90KGUpOjM9PT1uP25ldyBPb3QoZT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgxNSZlKTw8NHwxNSZlLDEpOjg9PT1uP05vdChlPj4yNCYyNTUsZT4+MTYmMjU1LGU+PjgmMjU1LCgyNTUmZSkvMjU1KTo0PT09bj9Ob3QoZT4+MTImMTV8ZT4+OCYyNDAsZT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgoMTUmZSk8PDR8MTUmZSkvMjU1KTpudWxsKTooZT14b3QuZXhlYyh0KSk/bmV3IE9vdChlWzFdLGVbMl0sZVszXSwxKTooZT13b3QuZXhlYyh0KSk/bmV3IE9vdCgyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCwxKTooZT1Tb3QuZXhlYyh0KSk/Tm90KGVbMV0sZVsyXSxlWzNdLGVbNF0pOihlPU1vdC5leGVjKHQpKT9Ob3QoMjU1KmVbMV0vMTAwLDI1NSplWzJdLzEwMCwyNTUqZVszXS8xMDAsZVs0XSk6KGU9RW90LmV4ZWModCkpP0hvdChlWzFdLGVbMl0vMTAwLGVbM10vMTAwLDEpOihlPVRvdC5leGVjKHQpKT9Ib3QoZVsxXSxlWzJdLzEwMCxlWzNdLzEwMCxlWzRdKTpDb3QuaGFzT3duUHJvcGVydHkodCk/UG90KENvdFt0XSk6InRyYW5zcGFyZW50Ij09PXQ/bmV3IE9vdChOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIFBvdCh0KXtyZXR1cm4gbmV3IE9vdCh0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQsMSl9ZnVuY3Rpb24gTm90KHQsZSxuLGkpe3JldHVybiBpPD0wJiYodD1lPW49TmFOKSxuZXcgT290KHQsZSxuLGkpfWZ1bmN0aW9uIElvdCh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGZvdHx8KHQ9TG90KHQpKSx0P25ldyBPb3QoKHQ9dC5yZ2IoKSkucix0LmcsdC5iLHQub3BhY2l0eSk6bmV3IE9vdH1mdW5jdGlvbiBSb3QodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP0lvdCh0KTpuZXcgT290KHQsZSxuLG51bGw9PWk/MTppKX1mdW5jdGlvbiBPb3QodCxlLG4saSl7dGhpcy5yPSt0LHRoaXMuZz0rZSx0aGlzLmI9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIHpvdCgpe3JldHVybiIjIitCb3QodGhpcy5yKStCb3QodGhpcy5nKStCb3QodGhpcy5iKX1mdW5jdGlvbiBEb3QoKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX1mdW5jdGlvbiBCb3QodCl7cmV0dXJuKCh0PU1hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodCl8fDApKSk8MTY/IjAiOiIiKSt0LnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBIb3QodCxlLG4saSl7cmV0dXJuIGk8PTA/dD1lPW49TmFOOm48PTB8fG4+PTE/dD1lPU5hTjplPD0wJiYodD1OYU4pLG5ldyBWb3QodCxlLG4saSl9ZnVuY3Rpb24gRm90KHQpe2lmKHQgaW5zdGFuY2VvZiBWb3QpcmV0dXJuIG5ldyBWb3QodC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YgZm90fHwodD1Mb3QodCkpLCF0KXJldHVybiBuZXcgVm90O2lmKHQgaW5zdGFuY2VvZiBWb3QpcmV0dXJuIHQ7dmFyIGU9KHQ9dC5yZ2IoKSkuci8yNTUsbj10LmcvMjU1LGk9dC5iLzI1NSxyPU1hdGgubWluKGUsbixpKSxvPU1hdGgubWF4KGUsbixpKSxhPU5hTixzPW8tcixsPShvK3IpLzI7cmV0dXJuIHM/KGE9ZT09PW8/KG4taSkvcys2KihuPGkpOm49PT1vPyhpLWUpL3MrMjooZS1uKS9zKzQscy89bDwuNT9vK3I6Mi1vLXIsYSo9NjApOnM9bD4wJiZsPDE/MDphLG5ldyBWb3QoYSxzLGwsdC5vcGFjaXR5KX1mdW5jdGlvbiBWb3QodCxlLG4saSl7dGhpcy5oPSt0LHRoaXMucz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIFVvdCh0LGUsbil7cmV0dXJuIDI1NSoodDw2MD9lKyhuLWUpKnQvNjA6dDwxODA/bjp0PDI0MD9lKyhuLWUpKigyNDAtdCkvNjA6ZSl9ZnVuY3Rpb24gam90KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBHb3QodCxlKXt2YXIgbj1lLXQ7cmV0dXJuIG4/KGZ1bmN0aW9uIGkodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQrbiplfX0pKHQsbik6am90KGlzTmFOKHQpP2U6dCl9ZG90KGZvdCxMb3Qse2NvcHk6ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IHRoaXMuY29uc3RydWN0b3IsdGhpcyx0KX0sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSxoZXg6QW90LGZvcm1hdEhleDpBb3QsZm9ybWF0SHNsOmZ1bmN0aW9uIFdvdCgpe3JldHVybiBGb3QodGhpcykuZm9ybWF0SHNsKCl9LGZvcm1hdFJnYjprb3QsdG9TdHJpbmc6a290fSksZG90KE9vdCxSb3QscG90KGZvdCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9nb3Q6TWF0aC5wb3coZ290LHQpLG5ldyBPb3QodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/bW90Ok1hdGgucG93KG1vdCx0KSxuZXcgT290KHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybi0uNTw9dGhpcy5yJiZ0aGlzLnI8MjU1LjUmJi0uNTw9dGhpcy5nJiZ0aGlzLmc8MjU1LjUmJi0uNTw9dGhpcy5iJiZ0aGlzLmI8MjU1LjUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxoZXg6em90LGZvcm1hdEhleDp6b3QsZm9ybWF0UmdiOkRvdCx0b1N0cmluZzpEb3R9KSksZG90KFZvdCwoZnVuY3Rpb24gcW90KHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Gb3QodCk6bmV3IFZvdCh0LGUsbixudWxsPT1pPzE6aSl9KSxwb3QoZm90LHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P2dvdDpNYXRoLnBvdyhnb3QsdCksbmV3IFZvdCh0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P21vdDpNYXRoLnBvdyhtb3QsdCksbmV3IFZvdCh0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaCUzNjArMzYwKih0aGlzLmg8MCksZT1pc05hTih0KXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxuPXRoaXMubCxpPW4rKG48LjU/bjoxLW4pKmUscj0yKm4taTtyZXR1cm4gbmV3IE9vdChVb3QodD49MjQwP3QtMjQwOnQrMTIwLHIsaSksVW90KHQscixpKSxVb3QodDwxMjA/dCsyNDA6dC0xMjAscixpKSx0aGlzLm9wYWNpdHkpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybigwPD10aGlzLnMmJnRoaXMuczw9MXx8aXNOYU4odGhpcy5zKSkmJjA8PXRoaXMubCYmdGhpcy5sPD0xJiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sZm9ybWF0SHNsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcGFjaXR5O3JldHVybigxPT09KHQ9aXNOYU4odCk/MTpNYXRoLm1heCgwLE1hdGgubWluKDEsdCkpKT8iaHNsKCI6ImhzbGEoIikrKHRoaXMuaHx8MCkrIiwgIisxMDAqKHRoaXMuc3x8MCkrIiUsICIrMTAwKih0aGlzLmx8fDApKyIlIisoMT09PXQ/IikiOiIsICIrdCsiKSIpfX0pKTt2YXIgWW90PShmdW5jdGlvbiB0KGUpe3ZhciBuPShmdW5jdGlvbiBpKHQpe3JldHVybiAxPT0odD0rdCk/R290OmZ1bmN0aW9uKGUsbil7cmV0dXJuIG4tZT8oZnVuY3Rpb24gaSh0LGUsbil7cmV0dXJuIHQ9TWF0aC5wb3codCxuKSxlPU1hdGgucG93KGUsbiktdCxuPTEvbixmdW5jdGlvbihpKXtyZXR1cm4gTWF0aC5wb3codCtpKmUsbil9fSkoZSxuLHQpOmpvdChpc05hTihlKT9uOmUpfX0pKGUpO2Z1bmN0aW9uIHIodCxlKXt2YXIgaT1uKCh0PVJvdCh0KSkuciwoZT1Sb3QoZSkpLnIpLHI9bih0LmcsZS5nKSxvPW4odC5iLGUuYiksYT1Hb3QodC5vcGFjaXR5LGUub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0LnI9aShlKSx0Lmc9cihlKSx0LmI9byhlKSx0Lm9wYWNpdHk9YShlKSx0KyIifX1yZXR1cm4gci5nYW1tYT10LHJ9KSgxKTtmdW5jdGlvbiBYb3QodCxlKXtyZXR1cm4gdD0rdCxlPStlLGZ1bmN0aW9uKG4pe3JldHVybiB0KigxLW4pK2Uqbn19dmFyICRvdD0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2csS290PW5ldyBSZWdFeHAoJG90LnNvdXJjZSwiZyIpO2Z1bmN0aW9uIFpvdCh0LGUpe3ZhciBuLGkscixvPSRvdC5sYXN0SW5kZXg9S290Lmxhc3RJbmRleD0wLGE9LTEscz1bXSxsPVtdO2Zvcih0Kz0iIixlKz0iIjsobj0kb3QuZXhlYyh0KSkmJihpPUtvdC5leGVjKGUpKTspKHI9aS5pbmRleCk+byYmKHI9ZS5zbGljZShvLHIpLHNbYV0/c1thXSs9cjpzWysrYV09ciksKG49blswXSk9PT0oaT1pWzBdKT9zW2FdP3NbYV0rPWk6c1srK2FdPWk6KHNbKythXT1udWxsLGwucHVzaCh7aTphLHg6WG90KG4saSl9KSksbz1Lb3QubGFzdEluZGV4O3JldHVybiBvPGUubGVuZ3RoJiYocj1lLnNsaWNlKG8pLHNbYV0/c1thXSs9cjpzWysrYV09cikscy5sZW5ndGg8Mj9sWzBdPyhmdW5jdGlvbiBjKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlKSsiIn19KShsWzBdLngpOihmdW5jdGlvbiB1KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0pKGUpOihlPWwubGVuZ3RoLGZ1bmN0aW9uKHQpe2Zvcih2YXIgbixpPTA7aTxlOysraSlzWyhuPWxbaV0pLmldPW4ueCh0KTtyZXR1cm4gcy5qb2luKCIiKX0pfXZhciBKb3QsUW90LHRhdCxlYXQsbmF0PTE4MC9NYXRoLlBJLGlhdD17dHJhbnNsYXRlWDowLHRyYW5zbGF0ZVk6MCxyb3RhdGU6MCxza2V3WDowLHNjYWxlWDoxLHNjYWxlWToxfTtmdW5jdGlvbiByYXQodCxlLG4saSxyLG8pe3ZhciBhLHMsbDtyZXR1cm4oYT1NYXRoLnNxcnQodCp0K2UqZSkpJiYodC89YSxlLz1hKSwobD10Km4rZSppKSYmKG4tPXQqbCxpLT1lKmwpLChzPU1hdGguc3FydChuKm4raSppKSkmJihuLz1zLGkvPXMsbC89cyksdCppPGUqbiYmKHQ9LXQsZT0tZSxsPS1sLGE9LWEpLHt0cmFuc2xhdGVYOnIsdHJhbnNsYXRlWTpvLHJvdGF0ZTpNYXRoLmF0YW4yKGUsdCkqbmF0LHNrZXdYOk1hdGguYXRhbihsKSpuYXQsc2NhbGVYOmEsc2NhbGVZOnN9fWZ1bmN0aW9uIG9hdCh0LGUsbixpKXtmdW5jdGlvbiByKHQpe3JldHVybiB0Lmxlbmd0aD90LnBvcCgpKyIgIjoiIn1yZXR1cm4gZnVuY3Rpb24obyxhKXt2YXIgcz1bXSxsPVtdO3JldHVybiBvPXQobyksYT10KGEpLChmdW5jdGlvbiBjKHQsaSxyLG8sYSxzKXtpZih0IT09cnx8aSE9PW8pe3ZhciBsPWEucHVzaCgidHJhbnNsYXRlKCIsbnVsbCxlLG51bGwsbik7cy5wdXNoKHtpOmwtNCx4OlhvdCh0LHIpfSx7aTpsLTIseDpYb3QoaSxvKX0pfWVsc2Uocnx8bykmJmEucHVzaCgidHJhbnNsYXRlKCIrcitlK28rbil9KShvLnRyYW5zbGF0ZVgsby50cmFuc2xhdGVZLGEudHJhbnNsYXRlWCxhLnRyYW5zbGF0ZVkscyxsKSwoZnVuY3Rpb24gdSh0LGUsbixvKXt0IT09ZT8odC1lPjE4MD9lKz0zNjA6ZS10PjE4MCYmKHQrPTM2MCksby5wdXNoKHtpOm4ucHVzaChyKG4pKyJyb3RhdGUoIixudWxsLGkpLTIseDpYb3QodCxlKX0pKTplJiZuLnB1c2gocihuKSsicm90YXRlKCIrZStpKX0pKG8ucm90YXRlLGEucm90YXRlLHMsbCksKGZ1bmN0aW9uIGgodCxlLG4sbyl7dCE9PWU/by5wdXNoKHtpOm4ucHVzaChyKG4pKyJza2V3WCgiLG51bGwsaSktMix4OlhvdCh0LGUpfSk6ZSYmbi5wdXNoKHIobikrInNrZXdYKCIrZStpKX0pKG8uc2tld1gsYS5za2V3WCxzLGwpLChmdW5jdGlvbiBkKHQsZSxuLGksbyxhKXtpZih0IT09bnx8ZSE9PWkpe3ZhciBzPW8ucHVzaChyKG8pKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKTthLnB1c2goe2k6cy00LHg6WG90KHQsbil9LHtpOnMtMix4OlhvdChlLGkpfSl9ZWxzZSAxPT09biYmMT09PWl8fG8ucHVzaChyKG8pKyJzY2FsZSgiK24rIiwiK2krIikiKX0pKG8uc2NhbGVYLG8uc2NhbGVZLGEuc2NhbGVYLGEuc2NhbGVZLHMsbCksbz1hPW51bGwsZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49LTEsaT1sLmxlbmd0aDsrK248aTspc1soZT1sW25dKS5pXT1lLngodCk7cmV0dXJuIHMuam9pbigiIil9fX12YXIgYWF0PW9hdCgoZnVuY3Rpb24gc2F0KHQpe3JldHVybiJub25lIj09PXQ/aWF0OihKb3R8fChKb3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksUW90PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCx0YXQ9ZG9jdW1lbnQuZGVmYXVsdFZpZXcpLEpvdC5zdHlsZS50cmFuc2Zvcm09dCx0PXRhdC5nZXRDb21wdXRlZFN0eWxlKFFvdC5hcHBlbmRDaGlsZChKb3QpLG51bGwpLmdldFByb3BlcnR5VmFsdWUoInRyYW5zZm9ybSIpLFFvdC5yZW1vdmVDaGlsZChKb3QpLHJhdCgrKHQ9dC5zbGljZSg3LC0xKS5zcGxpdCgiLCIpKVswXSwrdFsxXSwrdFsyXSwrdFszXSwrdFs0XSwrdFs1XSkpfSksInB4LCAiLCJweCkiLCJkZWcpIiksbGF0PW9hdCgoZnVuY3Rpb24gY2F0KHQpe3JldHVybiBudWxsPT10P2lhdDooZWF0fHwoZWF0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJnIikpLGVhdC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsdCksKHQ9ZWF0LnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpP3JhdCgodD10Lm1hdHJpeCkuYSx0LmIsdC5jLHQuZCx0LmUsdC5mKTppYXQpfSksIiwgIiwiKSIsIikiKTtmdW5jdGlvbiB1YXQodCxlKXt2YXIgbixpO3JldHVybiBmdW5jdGlvbigpe3ZhciByPWNvdCh0aGlzLHQpLG89ci50d2VlbjtpZihvIT09bilmb3IodmFyIGE9MCxzPShpPW49bykubGVuZ3RoO2E8czsrK2EpaWYoaVthXS5uYW1lPT09ZSl7KGk9aS5zbGljZSgpKS5zcGxpY2UoYSwxKTticmVha31yLnR3ZWVuPWl9fWZ1bmN0aW9uIGhhdCh0LGUsbil7dmFyIGkscjtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89Y290KHRoaXMsdCksYT1vLnR3ZWVuO2lmKGEhPT1pKXtyPShpPWEpLnNsaWNlKCk7Zm9yKHZhciBzPXtuYW1lOmUsdmFsdWU6bn0sbD0wLGM9ci5sZW5ndGg7bDxjOysrbClpZihyW2xdLm5hbWU9PT1lKXtyW2xdPXM7YnJlYWt9bD09PWMmJnIucHVzaChzKX1vLnR3ZWVuPXJ9fWZ1bmN0aW9uIGRhdCh0LGUsbil7dmFyIGk9dC5faWQ7cmV0dXJuIHQuZWFjaCgoZnVuY3Rpb24oKXt2YXIgdD1jb3QodGhpcyxpKTsodC52YWx1ZXx8KHQudmFsdWU9e30pKVtlXT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pKSxmdW5jdGlvbih0KXtyZXR1cm4gdW90KHQsaSkudmFsdWVbZV19fWZ1bmN0aW9uIHBhdCh0LGUpe3ZhciBuO3JldHVybigibnVtYmVyIj09dHlwZW9mIGU/WG90OmUgaW5zdGFuY2VvZiBMb3Q/WW90OihuPUxvdChlKSk/KGU9bixZb3QpOlpvdCkodCxlKX1mdW5jdGlvbiBmYXQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIG1hdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIGdhdCh0LGUsbil7dmFyIGkscjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZSh0KTtyZXR1cm4gbz09PW4/bnVsbDpvPT09aT9yOnI9ZShpPW8sbil9fWZ1bmN0aW9uIF9hdCh0LGUsbil7dmFyIGkscjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk7cmV0dXJuIG89PT1uP251bGw6bz09PWk/cjpyPWUoaT1vLG4pfX1mdW5jdGlvbiB5YXQodCxlLG4pe3ZhciBpLHIsbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYSxzPW4odGhpcyk7aWYobnVsbCE9cylyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZSh0KSk9PT1zP251bGw6YT09PWkmJnM9PT1yP286bz1lKGk9YSxyPXMpO3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX1mdW5jdGlvbiB2YXQodCxlLG4pe3ZhciBpLHIsbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYSxzPW4odGhpcyk7aWYobnVsbCE9cylyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCkpPT09cz9udWxsOmE9PT1pJiZzPT09cj9vOm89ZShpPWEscj1zKTt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIGJhdCh0LGUpe2Z1bmN0aW9uIG4oKXt2YXIgbj10aGlzLGk9ZS5hcHBseShuLGFyZ3VtZW50cyk7cmV0dXJuIGkmJmZ1bmN0aW9uKGUpe24uc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGkoZSkpfX1yZXR1cm4gbi5fdmFsdWU9ZSxufWZ1bmN0aW9uIHhhdCh0LGUpe2Z1bmN0aW9uIG4oKXt2YXIgbj10aGlzLGk9ZS5hcHBseShuLGFyZ3VtZW50cyk7cmV0dXJuIGkmJmZ1bmN0aW9uKGUpe24uc2V0QXR0cmlidXRlKHQsaShlKSl9fXJldHVybiBuLl92YWx1ZT1lLG59ZnVuY3Rpb24gd2F0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7bG90KHRoaXMsdCkuZGVsYXk9K2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBTYXQodCxlKXtyZXR1cm4gZT0rZSxmdW5jdGlvbigpe2xvdCh0aGlzLHQpLmRlbGF5PWV9fWZ1bmN0aW9uIE1hdCh0LGUpe3JldHVybiBmdW5jdGlvbigpe2NvdCh0aGlzLHQpLmR1cmF0aW9uPStlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gRWF0KHQsZSl7cmV0dXJuIGU9K2UsZnVuY3Rpb24oKXtjb3QodGhpcyx0KS5kdXJhdGlvbj1lfX1mdW5jdGlvbiBUYXQodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7Y290KHRoaXMsdCkuZWFzZT1lfX1mdW5jdGlvbiBDYXQodCxlLG4pe3ZhciBpLHIsbz0oZnVuY3Rpb24gYSh0KXtyZXR1cm4odCsiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pLmV2ZXJ5KChmdW5jdGlvbih0KXt2YXIgZT10LmluZGV4T2YoIi4iKTtyZXR1cm4gZT49MCYmKHQ9dC5zbGljZSgwLGUpKSwhdHx8InN0YXJ0Ij09PXR9KSl9KShlKT9sb3Q6Y290O3JldHVybiBmdW5jdGlvbigpe3ZhciBhPW8odGhpcyx0KSxzPWEub247cyE9PWkmJihyPShpPXMpLmNvcHkoKSkub24oZSxuKSxhLm9uPXJ9fXZhciBBYXQ9aXJ0LnByb3RvdHlwZS5jb25zdHJ1Y3RvcjtmdW5jdGlvbiBrYXQodCxlLG4pe2Z1bmN0aW9uIGkoKXt2YXIgaT10aGlzLHI9ZS5hcHBseShpLGFyZ3VtZW50cyk7cmV0dXJuIHImJmZ1bmN0aW9uKGUpe2kuc3R5bGUuc2V0UHJvcGVydHkodCxyKGUpLG4pfX1yZXR1cm4gaS5fdmFsdWU9ZSxpfXZhciBMYXQ9MDtmdW5jdGlvbiBQYXQodCxlLG4saSl7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1lLHRoaXMuX25hbWU9bix0aGlzLl9pZD1pfWZ1bmN0aW9uIE5hdCh0KXtyZXR1cm4gaXJ0KCkudHJhbnNpdGlvbih0KX1mdW5jdGlvbiBJYXQoKXtyZXR1cm4rK0xhdH12YXIgUmF0PWlydC5wcm90b3R5cGU7UGF0LnByb3RvdHlwZT1OYXQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpQYXQsc2VsZWN0OmZ1bmN0aW9uIE9hdCh0KXt2YXIgZT10aGlzLl9uYW1lLG49dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PWlpdCh0KSk7Zm9yKHZhciBpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89bmV3IEFycmF5KHIpLGE9MDthPHI7KythKWZvcih2YXIgcyxsLGM9aVthXSx1PWMubGVuZ3RoLGg9b1thXT1uZXcgQXJyYXkodSksZD0wO2Q8dTsrK2QpKHM9Y1tkXSkmJihsPXQuY2FsbChzLHMuX19kYXRhX18sZCxjKSkmJigiX19kYXRhX18iaW4gcyYmKGwuX19kYXRhX189cy5fX2RhdGFfXyksaFtkXT1sLHNvdChoW2RdLGUsbixkLGgsdW90KHMsbikpKTtyZXR1cm4gbmV3IFBhdChvLHRoaXMuX3BhcmVudHMsZSxuKX0sc2VsZWN0QWxsOmZ1bmN0aW9uIHphdCh0KXt2YXIgZT10aGlzLl9uYW1lLG49dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PW9pdCh0KSk7Zm9yKHZhciBpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89W10sYT1bXSxzPTA7czxyOysrcylmb3IodmFyIGwsYz1pW3NdLHU9Yy5sZW5ndGgsaD0wO2g8dTsrK2gpaWYobD1jW2hdKXtmb3IodmFyIGQscD10LmNhbGwobCxsLl9fZGF0YV9fLGgsYyksZj11b3QobCxuKSxtPTAsZz1wLmxlbmd0aDttPGc7KyttKShkPXBbbV0pJiZzb3QoZCxlLG4sbSxwLGYpO28ucHVzaChwKSxhLnB1c2gobCl9cmV0dXJuIG5ldyBQYXQobyxhLGUsbil9LGZpbHRlcjpmdW5jdGlvbiBEYXQodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PWFpdCh0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWZvcih2YXIgbyxhPWVbcl0scz1hLmxlbmd0aCxsPWlbcl09W10sYz0wO2M8czsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmbC5wdXNoKG8pO3JldHVybiBuZXcgUGF0KGksdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sbWVyZ2U6ZnVuY3Rpb24gQmF0KHQpe2lmKHQuX2lkIT09dGhpcy5faWQpdGhyb3cgbmV3IEVycm9yO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj10Ll9ncm91cHMsaT1lLmxlbmd0aCxyPU1hdGgubWluKGksbi5sZW5ndGgpLG89bmV3IEFycmF5KGkpLGE9MDthPHI7KythKWZvcih2YXIgcyxsPWVbYV0sYz1uW2FdLHU9bC5sZW5ndGgsaD1vW2FdPW5ldyBBcnJheSh1KSxkPTA7ZDx1OysrZCkocz1sW2RdfHxjW2RdKSYmKGhbZF09cyk7Zm9yKDthPGk7KythKW9bYV09ZVthXTtyZXR1cm4gbmV3IFBhdChvLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LHNlbGVjdGlvbjpmdW5jdGlvbiBIYXQoKXtyZXR1cm4gbmV3IEFhdCh0aGlzLl9ncm91cHMsdGhpcy5fcGFyZW50cyl9LHRyYW5zaXRpb246ZnVuY3Rpb24gRmF0KCl7Zm9yKHZhciB0PXRoaXMuX25hbWUsZT10aGlzLl9pZCxuPUlhdCgpLGk9dGhpcy5fZ3JvdXBzLHI9aS5sZW5ndGgsbz0wO288cjsrK28pZm9yKHZhciBhLHM9aVtvXSxsPXMubGVuZ3RoLGM9MDtjPGw7KytjKWlmKGE9c1tjXSl7dmFyIHU9dW90KGEsZSk7c290KGEsdCxuLGMscyx7dGltZTp1LnRpbWUrdS5kZWxheSt1LmR1cmF0aW9uLGRlbGF5OjAsZHVyYXRpb246dS5kdXJhdGlvbixlYXNlOnUuZWFzZX0pfXJldHVybiBuZXcgUGF0KGksdGhpcy5fcGFyZW50cyx0LG4pfSxjYWxsOlJhdC5jYWxsLG5vZGVzOlJhdC5ub2Rlcyxub2RlOlJhdC5ub2RlLHNpemU6UmF0LnNpemUsZW1wdHk6UmF0LmVtcHR5LGVhY2g6UmF0LmVhY2gsb246ZnVuY3Rpb24gVmF0KHQsZSl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj91b3QodGhpcy5ub2RlKCksbikub24ub24odCk6dGhpcy5lYWNoKENhdChuLHQsZSkpfSxhdHRyOmZ1bmN0aW9uIFVhdCh0LGUpe3ZhciBuPUpudCh0KSxpPSJ0cmFuc2Zvcm0iPT09bj9sYXQ6cGF0O3JldHVybiB0aGlzLmF0dHJUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBlPyhuLmxvY2FsP3ZhdDp5YXQpKG4saSxkYXQodGhpcywiYXR0ci4iK3QsZSkpOm51bGw9PWU/KG4ubG9jYWw/bWF0OmZhdCkobik6KG4ubG9jYWw/X2F0OmdhdCkobixpLGUrIiIpKX0sYXR0clR3ZWVuOmZ1bmN0aW9uIGphdCh0LGUpe3ZhciBuPSJhdHRyLiIrdDtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKG49dGhpcy50d2VlbihuKSkmJm4uX3ZhbHVlO2lmKG51bGw9PWUpcmV0dXJuIHRoaXMudHdlZW4obixudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7dmFyIGk9Sm50KHQpO3JldHVybiB0aGlzLnR3ZWVuKG4sKGkubG9jYWw/YmF0OnhhdCkoaSxlKSl9LHN0eWxlOmZ1bmN0aW9uIEdhdCh0LGUsbil7dmFyIGk9InRyYW5zZm9ybSI9PSh0Kz0iIik/YWF0OnBhdDtyZXR1cm4gbnVsbD09ZT90aGlzLnN0eWxlVHdlZW4odCwoZnVuY3Rpb24gbyh0LGUpe3ZhciBuLGkscjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz13aXQodGhpcyx0KSxhPSh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLHdpdCh0aGlzLHQpKTtyZXR1cm4gbz09PWE/bnVsbDpvPT09biYmYT09PWk/cjpyPWUobj1vLGk9YSl9fSkodCxpKSkub24oImVuZC5zdHlsZS4iK3QsKGZ1bmN0aW9uIHIodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KX19KSh0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIGU/KGZ1bmN0aW9uIGEodCxlLG4pe3ZhciBpLHIsbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT13aXQodGhpcyx0KSxzPW4odGhpcyk7cmV0dXJuIG51bGw9PXMmJih0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLHM9d2l0KHRoaXMsdCkpLGE9PT1zP251bGw6YT09PWkmJnM9PT1yP286bz1lKGk9YSxyPXMpfX0pKHQsaSxkYXQodGhpcywic3R5bGUuIit0LGUpKTooZnVuY3Rpb24gcyh0LGUsbil7dmFyIGkscjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz13aXQodGhpcyx0KTtyZXR1cm4gbz09PW4/bnVsbDpvPT09aT9yOnI9ZShpPW8sbil9fSkodCxpLGUrIiIpLG4pfSxzdHlsZVR3ZWVuOmZ1bmN0aW9uIFdhdCh0LGUsbil7dmFyIGk9InN0eWxlLiIrKHQrPSIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKGk9dGhpcy50d2VlbihpKSkmJmkuX3ZhbHVlO2lmKG51bGw9PWUpcmV0dXJuIHRoaXMudHdlZW4oaSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4oaSxrYXQodCxlLG51bGw9PW4/IiI6bikpfSx0ZXh0OmZ1bmN0aW9uIHFhdCh0KXtyZXR1cm4gdGhpcy50d2VlbigidGV4dCIsImZ1bmN0aW9uIj09dHlwZW9mIHQ/KGZ1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dCh0aGlzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PWU/IiI6ZX19KShkYXQodGhpcywidGV4dCIsdCkpOihmdW5jdGlvbiBuKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KShudWxsPT10PyIiOnQrIiIpKX0scmVtb3ZlOmZ1bmN0aW9uIFlhdCgpe3JldHVybiB0aGlzLm9uKCJlbmQucmVtb3ZlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7Zm9yKHZhciBuIGluIHRoaXMuX190cmFuc2l0aW9uKWlmKCtuIT09ZSlyZXR1cm47dCYmdC5yZW1vdmVDaGlsZCh0aGlzKX19KSh0aGlzLl9pZCkpfSx0d2VlbjpmdW5jdGlvbiBYYXQodCxlKXt2YXIgbj10aGlzLl9pZDtpZih0Kz0iIixhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgaSxyPXVvdCh0aGlzLm5vZGUoKSxuKS50d2VlbixvPTAsYT1yLmxlbmd0aDtvPGE7KytvKWlmKChpPXJbb10pLm5hbWU9PT10KXJldHVybiBpLnZhbHVlO3JldHVybiBudWxsfXJldHVybiB0aGlzLmVhY2goKG51bGw9PWU/dWF0OmhhdCkobix0LGUpKX0sZGVsYXk6ZnVuY3Rpb24gJGF0KHQpe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIHQ/d2F0OlNhdCkoZSx0KSk6dW90KHRoaXMubm9kZSgpLGUpLmRlbGF5fSxkdXJhdGlvbjpmdW5jdGlvbiBLYXQodCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9NYXQ6RWF0KShlLHQpKTp1b3QodGhpcy5ub2RlKCksZSkuZHVyYXRpb259LGVhc2U6ZnVuY3Rpb24gWmF0KHQpe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChUYXQoZSx0KSk6dW90KHRoaXMubm9kZSgpLGUpLmVhc2V9fTt2YXIgSmF0PXt0aW1lOm51bGwsZGVsYXk6MCxkdXJhdGlvbjoyNTAsZWFzZTpUZn07ZnVuY3Rpb24gUWF0KHQsZSl7Zm9yKHZhciBuOyEobj10Ll9fdHJhbnNpdGlvbil8fCEobj1uW2VdKTspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuIEphdC50aW1lPVpydCgpLEphdDtyZXR1cm4gbn1pcnQucHJvdG90eXBlLmludGVycnVwdD1mdW5jdGlvbiB0c3QodCl7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXtob3QodGhpcyx0KX0pKX0saXJ0LnByb3RvdHlwZS50cmFuc2l0aW9uPWZ1bmN0aW9uIGVzdCh0KXt2YXIgZSxuO3QgaW5zdGFuY2VvZiBQYXQ/KGU9dC5faWQsdD10Ll9uYW1lKTooZT1JYXQoKSwobj1KYXQpLnRpbWU9WnJ0KCksdD1udWxsPT10P251bGw6dCsiIik7Zm9yKHZhciBpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89MDtvPHI7KytvKWZvcih2YXIgYSxzPWlbb10sbD1zLmxlbmd0aCxjPTA7YzxsOysrYykoYT1zW2NdKSYmc290KGEsdCxlLGMscyxufHxRYXQoYSxlKSk7cmV0dXJuIG5ldyBQYXQoaSx0aGlzLl9wYXJlbnRzLHQsZSl9O3ZhciBuc3Q9W251bGxdO2Z1bmN0aW9uIGlzdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gcnN0KHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIG9zdCh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBhc3QoKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBzc3QodCl7dC5VPXQuQz10Lkw9dC5SPXQuUD10Lk49bnVsbH1mdW5jdGlvbiBsc3QodCxlKXt2YXIgbj1lLGk9ZS5SLHI9bi5VO3I/ci5MPT09bj9yLkw9aTpyLlI9aTp0Ll89aSxpLlU9cixuLlU9aSxuLlI9aS5MLG4uUiYmKG4uUi5VPW4pLGkuTD1ufWZ1bmN0aW9uIGNzdCh0LGUpe3ZhciBuPWUsaT1lLkwscj1uLlU7cj9yLkw9PT1uP3IuTD1pOnIuUj1pOnQuXz1pLGkuVT1yLG4uVT1pLG4uTD1pLlIsbi5MJiYobi5MLlU9biksaS5SPW59ZnVuY3Rpb24gdXN0KHQpe2Zvcig7dC5MOyl0PXQuTDtyZXR1cm4gdH1mdW5jdGlvbiBoc3QodCxlLG4saSl7dmFyIHI9W251bGwsbnVsbF0sbz1Pc3QucHVzaChyKS0xO3JldHVybiByLmxlZnQ9dCxyLnJpZ2h0PWUsbiYmcHN0KHIsdCxlLG4pLGkmJnBzdChyLGUsdCxpKSxJc3RbdC5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksSXN0W2UuaW5kZXhdLmhhbGZlZGdlcy5wdXNoKG8pLHJ9ZnVuY3Rpb24gZHN0KHQsZSxuKXt2YXIgaT1bZSxuXTtyZXR1cm4gaS5sZWZ0PXQsaX1mdW5jdGlvbiBwc3QodCxlLG4saSl7dFswXXx8dFsxXT90LmxlZnQ9PT1uP3RbMV09aTp0WzBdPWk6KHRbMF09aSx0LmxlZnQ9ZSx0LnJpZ2h0PW4pfWZ1bmN0aW9uIGZzdCh0LGUsbixpLHIpe3ZhciBvLGE9dFswXSxzPXRbMV0sbD1hWzBdLGM9YVsxXSx1PTAsaD0xLGQ9c1swXS1sLHA9c1sxXS1jO2lmKG89ZS1sLGR8fCEobz4wKSl7aWYoby89ZCxkPDApe2lmKG88dSlyZXR1cm47bzxoJiYoaD1vKX1lbHNlIGlmKGQ+MCl7aWYobz5oKXJldHVybjtvPnUmJih1PW8pfWlmKG89aS1sLGR8fCEobzwwKSl7aWYoby89ZCxkPDApe2lmKG8+aClyZXR1cm47bz51JiYodT1vKX1lbHNlIGlmKGQ+MCl7aWYobzx1KXJldHVybjtvPGgmJihoPW8pfWlmKG89bi1jLHB8fCEobz4wKSl7aWYoby89cCxwPDApe2lmKG88dSlyZXR1cm47bzxoJiYoaD1vKX1lbHNlIGlmKHA+MCl7aWYobz5oKXJldHVybjtvPnUmJih1PW8pfWlmKG89ci1jLHB8fCEobzwwKSl7aWYoby89cCxwPDApe2lmKG8+aClyZXR1cm47bz51JiYodT1vKX1lbHNlIGlmKHA+MCl7aWYobzx1KXJldHVybjtvPGgmJihoPW8pfXJldHVybiEodT4wfHxoPDEpfHwodT4wJiYodFswXT1bbCt1KmQsYyt1KnBdKSxoPDEmJih0WzFdPVtsK2gqZCxjK2gqcF0pLCEwKX19fX19ZnVuY3Rpb24gbXN0KHQsZSxuLGkscil7dmFyIG89dFsxXTtpZihvKXJldHVybiEwO3ZhciBhLHMsbD10WzBdLGM9dC5sZWZ0LHU9dC5yaWdodCxoPWNbMF0sZD1jWzFdLHA9dVswXSxmPXVbMV0sbT0oaCtwKS8yO2lmKGY9PT1kKXtpZihtPGV8fG0+PWkpcmV0dXJuO2lmKGg+cCl7aWYobCl7aWYobFsxXT49cilyZXR1cm59ZWxzZSBsPVttLG5dO289W20scl19ZWxzZXtpZihsKXtpZihsWzFdPG4pcmV0dXJufWVsc2UgbD1bbSxyXTtvPVttLG5dfX1lbHNlIGlmKHM9KGQrZikvMi0oYT0oaC1wKS8oZi1kKSkqbSxhPC0xfHxhPjEpaWYoaD5wKXtpZihsKXtpZihsWzFdPj1yKXJldHVybn1lbHNlIGw9WyhuLXMpL2Esbl07bz1bKHItcykvYSxyXX1lbHNle2lmKGwpe2lmKGxbMV08bilyZXR1cm59ZWxzZSBsPVsoci1zKS9hLHJdO289WyhuLXMpL2Esbl19ZWxzZSBpZihkPGYpe2lmKGwpe2lmKGxbMF0+PWkpcmV0dXJufWVsc2UgbD1bZSxhKmUrc107bz1baSxhKmkrc119ZWxzZXtpZihsKXtpZihsWzBdPGUpcmV0dXJufWVsc2UgbD1baSxhKmkrc107bz1bZSxhKmUrc119cmV0dXJuIHRbMF09bCx0WzFdPW8sITB9ZnVuY3Rpb24gZ3N0KHQsZSl7dmFyIG49dC5zaXRlLGk9ZS5sZWZ0LHI9ZS5yaWdodDtyZXR1cm4gbj09PXImJihyPWksaT1uKSxyP01hdGguYXRhbjIoclsxXS1pWzFdLHJbMF0taVswXSk6KG49PT1pPyhpPWVbMV0scj1lWzBdKTooaT1lWzBdLHI9ZVsxXSksTWF0aC5hdGFuMihpWzBdLXJbMF0sclsxXS1pWzFdKSl9ZnVuY3Rpb24gX3N0KHQsZSl7cmV0dXJuIGVbKyhlLmxlZnQhPT10LnNpdGUpXX1mdW5jdGlvbiB5c3QodCxlKXtyZXR1cm4gZVsrKGUubGVmdD09PXQuc2l0ZSldfWFzdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmFzdCxpbnNlcnQ6ZnVuY3Rpb24odCxlKXt2YXIgbixpLHI7aWYodCl7aWYoZS5QPXQsZS5OPXQuTix0Lk4mJih0Lk4uUD1lKSx0Lk49ZSx0LlIpe2Zvcih0PXQuUjt0Lkw7KXQ9dC5MO3QuTD1lfWVsc2UgdC5SPWU7bj10fWVsc2UgdGhpcy5fPyh0PXVzdCh0aGlzLl8pLGUuUD1udWxsLGUuTj10LHQuUD10Lkw9ZSxuPXQpOihlLlA9ZS5OPW51bGwsdGhpcy5fPWUsbj1udWxsKTtmb3IoZS5MPWUuUj1udWxsLGUuVT1uLGUuQz0hMCx0PWU7biYmbi5DOyluPT09KGk9bi5VKS5MPyhyPWkuUikmJnIuQz8obi5DPXIuQz0hMSxpLkM9ITAsdD1pKToodD09PW4uUiYmKGxzdCh0aGlzLG4pLG49KHQ9bikuVSksbi5DPSExLGkuQz0hMCxjc3QodGhpcyxpKSk6KHI9aS5MKSYmci5DPyhuLkM9ci5DPSExLGkuQz0hMCx0PWkpOih0PT09bi5MJiYoY3N0KHRoaXMsbiksbj0odD1uKS5VKSxuLkM9ITEsaS5DPSEwLGxzdCh0aGlzLGkpKSxuPXQuVTt0aGlzLl8uQz0hMX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3QuTiYmKHQuTi5QPXQuUCksdC5QJiYodC5QLk49dC5OKSx0Lk49dC5QPW51bGw7dmFyIGUsbixpLHI9dC5VLG89dC5MLGE9dC5SO2lmKG49bz9hP3VzdChhKTpvOmEscj9yLkw9PT10P3IuTD1uOnIuUj1uOnRoaXMuXz1uLG8mJmE/KGk9bi5DLG4uQz10LkMsbi5MPW8sby5VPW4sbiE9PWE/KHI9bi5VLG4uVT10LlUsci5MPXQ9bi5SLG4uUj1hLGEuVT1uKToobi5VPXIscj1uLHQ9bi5SKSk6KGk9dC5DLHQ9biksdCYmKHQuVT1yKSwhaSlpZih0JiZ0LkMpdC5DPSExO2Vsc2V7ZG97aWYodD09PXRoaXMuXylicmVhaztpZih0PT09ci5MKXtpZigoZT1yLlIpLkMmJihlLkM9ITEsci5DPSEwLGxzdCh0aGlzLHIpLGU9ci5SKSxlLkwmJmUuTC5DfHxlLlImJmUuUi5DKXtlLlImJmUuUi5DfHwoZS5MLkM9ITEsZS5DPSEwLGNzdCh0aGlzLGUpLGU9ci5SKSxlLkM9ci5DLHIuQz1lLlIuQz0hMSxsc3QodGhpcyxyKSx0PXRoaXMuXzticmVha319ZWxzZSBpZigoZT1yLkwpLkMmJihlLkM9ITEsci5DPSEwLGNzdCh0aGlzLHIpLGU9ci5MKSxlLkwmJmUuTC5DfHxlLlImJmUuUi5DKXtlLkwmJmUuTC5DfHwoZS5SLkM9ITEsZS5DPSEwLGxzdCh0aGlzLGUpLGU9ci5MKSxlLkM9ci5DLHIuQz1lLkwuQz0hMSxjc3QodGhpcyxyKSx0PXRoaXMuXzticmVha31lLkM9ITAsdD1yLHI9ci5VfXdoaWxlKCF0LkMpO3QmJih0LkM9ITEpfX19O3ZhciB2c3QsYnN0PVtdO2Z1bmN0aW9uIHhzdCgpe3NzdCh0aGlzKSx0aGlzLng9dGhpcy55PXRoaXMuYXJjPXRoaXMuc2l0ZT10aGlzLmN5PW51bGx9ZnVuY3Rpb24gd3N0KHQpe3ZhciBlPXQuUCxuPXQuTjtpZihlJiZuKXt2YXIgaT1lLnNpdGUscj10LnNpdGUsbz1uLnNpdGU7aWYoaSE9PW8pe3ZhciBhPXJbMF0scz1yWzFdLGw9aVswXS1hLGM9aVsxXS1zLHU9b1swXS1hLGg9b1sxXS1zLGQ9MioobCpoLWMqdSk7aWYoIShkPj0tRHN0KSl7dmFyIHA9bCpsK2MqYyxmPXUqdStoKmgsbT0oaCpwLWMqZikvZCxnPShsKmYtdSpwKS9kLF89YnN0LnBvcCgpfHxuZXcgeHN0O18uYXJjPXQsXy5zaXRlPXIsXy54PW0rYSxfLnk9KF8uY3k9ZytzKStNYXRoLnNxcnQobSptK2cqZyksdC5jaXJjbGU9Xztmb3IodmFyIHk9bnVsbCx2PVJzdC5fO3Y7KWlmKF8ueTx2Lnl8fF8ueT09PXYueSYmXy54PD12Lngpe2lmKCF2Lkwpe3k9di5QO2JyZWFrfXY9di5MfWVsc2V7aWYoIXYuUil7eT12O2JyZWFrfXY9di5SfVJzdC5pbnNlcnQoeSxfKSx5fHwodnN0PV8pfX19fWZ1bmN0aW9uIFNzdCh0KXt2YXIgZT10LmNpcmNsZTtlJiYoZS5QfHwodnN0PWUuTiksUnN0LnJlbW92ZShlKSxic3QucHVzaChlKSxzc3QoZSksdC5jaXJjbGU9bnVsbCl9dmFyIE1zdD1bXTtmdW5jdGlvbiBFc3QoKXtzc3QodGhpcyksdGhpcy5lZGdlPXRoaXMuc2l0ZT10aGlzLmNpcmNsZT1udWxsfWZ1bmN0aW9uIFRzdCh0KXt2YXIgZT1Nc3QucG9wKCl8fG5ldyBFc3Q7cmV0dXJuIGUuc2l0ZT10LGV9ZnVuY3Rpb24gQ3N0KHQpe1NzdCh0KSxOc3QucmVtb3ZlKHQpLE1zdC5wdXNoKHQpLHNzdCh0KX1mdW5jdGlvbiBBc3QodCl7dmFyIGU9dC5jaXJjbGUsbj1lLngsaT1lLmN5LHI9W24saV0sbz10LlAsYT10Lk4scz1bdF07Q3N0KHQpO2Zvcih2YXIgbD1vO2wuY2lyY2xlJiZNYXRoLmFicyhuLWwuY2lyY2xlLngpPHpzdCYmTWF0aC5hYnMoaS1sLmNpcmNsZS5jeSk8enN0OylvPWwuUCxzLnVuc2hpZnQobCksQ3N0KGwpLGw9bztzLnVuc2hpZnQobCksU3N0KGwpO2Zvcih2YXIgYz1hO2MuY2lyY2xlJiZNYXRoLmFicyhuLWMuY2lyY2xlLngpPHpzdCYmTWF0aC5hYnMoaS1jLmNpcmNsZS5jeSk8enN0OylhPWMuTixzLnB1c2goYyksQ3N0KGMpLGM9YTtzLnB1c2goYyksU3N0KGMpO3ZhciB1LGg9cy5sZW5ndGg7Zm9yKHU9MTt1PGg7Kyt1KXBzdCgoYz1zW3VdKS5lZGdlLChsPXNbdS0xXSkuc2l0ZSxjLnNpdGUscik7KGM9c1toLTFdKS5lZGdlPWhzdCgobD1zWzBdKS5zaXRlLGMuc2l0ZSxudWxsLHIpLHdzdChsKSx3c3QoYyl9ZnVuY3Rpb24ga3N0KHQpe2Zvcih2YXIgZSxuLGkscixvPXRbMF0sYT10WzFdLHM9TnN0Ll87czspaWYoKGk9THN0KHMsYSktbyk+enN0KXM9cy5MO2Vsc2V7aWYoISgocj1vLVBzdChzLGEpKT56c3QpKXtpPi16c3Q/KGU9cy5QLG49cyk6cj4tenN0PyhlPXMsbj1zLk4pOmU9bj1zO2JyZWFrfWlmKCFzLlIpe2U9czticmVha31zPXMuUn0hKGZ1bmN0aW9uIGwodCl7SXN0W3QuaW5kZXhdPXtzaXRlOnQsaGFsZmVkZ2VzOltdfX0pKHQpO3ZhciBjPVRzdCh0KTtpZihOc3QuaW5zZXJ0KGUsYyksZXx8bil7aWYoZT09PW4pcmV0dXJuIFNzdChlKSxuPVRzdChlLnNpdGUpLE5zdC5pbnNlcnQoYyxuKSxjLmVkZ2U9bi5lZGdlPWhzdChlLnNpdGUsYy5zaXRlKSx3c3QoZSksdm9pZCB3c3Qobik7aWYobil7U3N0KGUpLFNzdChuKTt2YXIgdT1lLnNpdGUsaD11WzBdLGQ9dVsxXSxwPXRbMF0taCxmPXRbMV0tZCxtPW4uc2l0ZSxnPW1bMF0taCxfPW1bMV0tZCx5PTIqKHAqXy1mKmcpLHY9cCpwK2YqZixiPWcqZytfKl8seD1bKF8qdi1mKmIpL3kraCwocCpiLWcqdikveStkXTtwc3Qobi5lZGdlLHUsbSx4KSxjLmVkZ2U9aHN0KHUsdCxudWxsLHgpLG4uZWRnZT1oc3QodCxtLG51bGwseCksd3N0KGUpLHdzdChuKX1lbHNlIGMuZWRnZT1oc3QoZS5zaXRlLGMuc2l0ZSl9fWZ1bmN0aW9uIExzdCh0LGUpe3ZhciBuPXQuc2l0ZSxpPW5bMF0scj1uWzFdLG89ci1lO2lmKCFvKXJldHVybiBpO3ZhciBhPXQuUDtpZighYSlyZXR1cm4tMS8wO3ZhciBzPShuPWEuc2l0ZSlbMF0sbD1uWzFdLGM9bC1lO2lmKCFjKXJldHVybiBzO3ZhciB1PXMtaSxoPTEvby0xL2MsZD11L2M7cmV0dXJuIGg/KC1kK01hdGguc3FydChkKmQtMipoKih1KnUvKC0yKmMpLWwrYy8yK3Itby8yKSkpL2graTooaStzKS8yfWZ1bmN0aW9uIFBzdCh0LGUpe3ZhciBuPXQuTjtpZihuKXJldHVybiBMc3QobixlKTt2YXIgaT10LnNpdGU7cmV0dXJuIGlbMV09PT1lP2lbMF06MS8wfXZhciBOc3QsSXN0LFJzdCxPc3QsenN0PTFlLTYsRHN0PTFlLTEyO2Z1bmN0aW9uIEJzdCh0LGUsbil7cmV0dXJuKHRbMF0tblswXSkqKGVbMV0tdFsxXSktKHRbMF0tZVswXSkqKG5bMV0tdFsxXSl9ZnVuY3Rpb24gSHN0KHQsZSl7cmV0dXJuIGVbMV0tdFsxXXx8ZVswXS10WzBdfWZ1bmN0aW9uIEZzdCh0LGUpe3ZhciBuLGkscixvPXQuc29ydChIc3QpLnBvcCgpO2ZvcihPc3Q9W10sSXN0PW5ldyBBcnJheSh0Lmxlbmd0aCksTnN0PW5ldyBhc3QsUnN0PW5ldyBhc3Q7OylpZihyPXZzdCxvJiYoIXJ8fG9bMV08ci55fHxvWzFdPT09ci55JiZvWzBdPHIueCkpb1swXT09PW4mJm9bMV09PT1pfHwoa3N0KG8pLG49b1swXSxpPW9bMV0pLG89dC5wb3AoKTtlbHNle2lmKCFyKWJyZWFrO0FzdChyLmFyYyl9aWYoKGZ1bmN0aW9uIGEoKXtmb3IodmFyIHQsZSxuLGkscj0wLG89SXN0Lmxlbmd0aDtyPG87KytyKWlmKCh0PUlzdFtyXSkmJihpPShlPXQuaGFsZmVkZ2VzKS5sZW5ndGgpKXt2YXIgYT1uZXcgQXJyYXkoaSkscz1uZXcgQXJyYXkoaSk7Zm9yKG49MDtuPGk7KytuKWFbbl09bixzW25dPWdzdCh0LE9zdFtlW25dXSk7Zm9yKGEuc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gc1tlXS1zW3RdfSkpLG49MDtuPGk7KytuKXNbbl09ZVthW25dXTtmb3Iobj0wO248aTsrK24pZVtuXT1zW25dfX0pKCksZSl7dmFyIHM9K2VbMF1bMF0sbD0rZVswXVsxXSxjPStlWzFdWzBdLHU9K2VbMV1bMV07IShmdW5jdGlvbiBoKHQsZSxuLGkpe2Zvcih2YXIgcixvPU9zdC5sZW5ndGg7by0tOyltc3Qocj1Pc3Rbb10sdCxlLG4saSkmJmZzdChyLHQsZSxuLGkpJiYoTWF0aC5hYnMoclswXVswXS1yWzFdWzBdKT56c3R8fE1hdGguYWJzKHJbMF1bMV0tclsxXVsxXSk+enN0KXx8ZGVsZXRlIE9zdFtvXX0pKHMsbCxjLHUpLChmdW5jdGlvbiBkKHQsZSxuLGkpe3ZhciByLG8sYSxzLGwsYyx1LGgsZCxwLGYsbSxnPUlzdC5sZW5ndGgsXz0hMDtmb3Iocj0wO3I8ZzsrK3IpaWYobz1Jc3Rbcl0pe2ZvcihhPW8uc2l0ZSxzPShsPW8uaGFsZmVkZ2VzKS5sZW5ndGg7cy0tOylPc3RbbFtzXV18fGwuc3BsaWNlKHMsMSk7Zm9yKHM9MCxjPWwubGVuZ3RoO3M8YzspZj0ocD15c3QobyxPc3RbbFtzXV0pKVswXSxtPXBbMV0saD0odT1fc3QobyxPc3RbbFsrK3MlY11dKSlbMF0sZD11WzFdLChNYXRoLmFicyhmLWgpPnpzdHx8TWF0aC5hYnMobS1kKT56c3QpJiYobC5zcGxpY2UocywwLE9zdC5wdXNoKGRzdChhLHAsTWF0aC5hYnMoZi10KTx6c3QmJmktbT56c3Q/W3QsTWF0aC5hYnMoaC10KTx6c3Q/ZDppXTpNYXRoLmFicyhtLWkpPHpzdCYmbi1mPnpzdD9bTWF0aC5hYnMoZC1pKTx6c3Q/aDpuLGldOk1hdGguYWJzKGYtbik8enN0JiZtLWU+enN0P1tuLE1hdGguYWJzKGgtbik8enN0P2Q6ZV06TWF0aC5hYnMobS1lKTx6c3QmJmYtdD56c3Q/W01hdGguYWJzKGQtZSk8enN0P2g6dCxlXTpudWxsKSktMSksKytjKTtjJiYoXz0hMSl9aWYoXyl7dmFyIHksdixiLHg9MS8wO2ZvcihyPTAsXz1udWxsO3I8ZzsrK3IpKG89SXN0W3JdKSYmKGI9KHk9KGE9by5zaXRlKVswXS10KSp5Kyh2PWFbMV0tZSkqdik8eCYmKHg9YixfPW8pO2lmKF8pe3ZhciB3PVt0LGVdLFM9W3QsaV0sTT1bbixpXSxFPVtuLGVdO18uaGFsZmVkZ2VzLnB1c2goT3N0LnB1c2goZHN0KGE9Xy5zaXRlLHcsUykpLTEsT3N0LnB1c2goZHN0KGEsUyxNKSktMSxPc3QucHVzaChkc3QoYSxNLEUpKS0xLE9zdC5wdXNoKGRzdChhLEUsdykpLTEpfX1mb3Iocj0wO3I8ZzsrK3IpKG89SXN0W3JdKSYmKG8uaGFsZmVkZ2VzLmxlbmd0aHx8ZGVsZXRlIElzdFtyXSl9KShzLGwsYyx1KX10aGlzLmVkZ2VzPU9zdCx0aGlzLmNlbGxzPUlzdCxOc3Q9UnN0PU9zdD1Jc3Q9bnVsbH1Gc3QucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpGc3QscG9seWdvbnM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVkZ2VzO3JldHVybiB0aGlzLmNlbGxzLm1hcCgoZnVuY3Rpb24oZSl7dmFyIG49ZS5oYWxmZWRnZXMubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gX3N0KGUsdFtuXSl9KSk7cmV0dXJuIG4uZGF0YT1lLnNpdGUuZGF0YSxufSkpfSx0cmlhbmdsZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXSxlPXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMuZm9yRWFjaCgoZnVuY3Rpb24obixpKXtpZihvPShyPW4uaGFsZmVkZ2VzKS5sZW5ndGgpZm9yKHZhciByLG8sYSxzPW4uc2l0ZSxsPS0xLGM9ZVtyW28tMV1dLHU9Yy5sZWZ0PT09cz9jLnJpZ2h0OmMubGVmdDsrK2w8bzspYT11LHU9KGM9ZVtyW2xdXSkubGVmdD09PXM/Yy5yaWdodDpjLmxlZnQsYSYmdSYmaTxhLmluZGV4JiZpPHUuaW5kZXgmJkJzdChzLGEsdSk8MCYmdC5wdXNoKFtzLmRhdGEsYS5kYXRhLHUuZGF0YV0pfSkpLHR9LGxpbmtzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZXMuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5yaWdodH0pKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybntzb3VyY2U6dC5sZWZ0LmRhdGEsdGFyZ2V0OnQucmlnaHQuZGF0YX19KSl9LGZpbmQ6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaSxyLG89dGhpcyxhPW8uX2ZvdW5kfHwwLHM9by5jZWxscy5sZW5ndGg7IShyPW8uY2VsbHNbYV0pOylpZigrK2E+PXMpcmV0dXJuIG51bGw7dmFyIGw9dC1yLnNpdGVbMF0sYz1lLXIuc2l0ZVsxXSx1PWwqbCtjKmM7ZG97cj1vLmNlbGxzW2k9YV0sYT1udWxsLHIuaGFsZmVkZ2VzLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBpPW8uZWRnZXNbbl0scz1pLmxlZnQ7aWYocyE9PXIuc2l0ZSYmc3x8KHM9aS5yaWdodCkpe3ZhciBsPXQtc1swXSxjPWUtc1sxXSxoPWwqbCtjKmM7aDx1JiYodT1oLGE9cy5pbmRleCl9fSkpfXdoaWxlKG51bGwhPT1hKTtyZXR1cm4gby5fZm91bmQ9aSxudWxsPT1ufHx1PD1uKm4/ci5zaXRlOm51bGx9fTt2YXIgVnN0PXt2YWx1ZTpmdW5jdGlvbigpe319O2Z1bmN0aW9uIFVzdCgpe2Zvcih2YXIgdCxlPTAsbj1hcmd1bWVudHMubGVuZ3RoLGk9e307ZTxuOysrZSl7aWYoISh0PWFyZ3VtZW50c1tlXSsiIil8fHQgaW4gaXx8L1tccy5dLy50ZXN0KHQpKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO2lbdF09W119cmV0dXJuIG5ldyBqc3QoaSl9ZnVuY3Rpb24ganN0KHQpe3RoaXMuXz10fWZ1bmN0aW9uIEdzdCh0LGUpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBuPSIiLGk9dC5pbmRleE9mKCIuIik7aWYoaT49MCYmKG49dC5zbGljZShpKzEpLHQ9dC5zbGljZSgwLGkpKSx0JiYhZS5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtyZXR1cm57dHlwZTp0LG5hbWU6bn19KSl9ZnVuY3Rpb24gV3N0KHQsZSl7Zm9yKHZhciBuLGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpaWYoKG49dFtpXSkubmFtZT09PWUpcmV0dXJuIG4udmFsdWV9ZnVuY3Rpb24gcXN0KHQsZSxuKXtmb3IodmFyIGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpaWYodFtpXS5uYW1lPT09ZSl7dFtpXT1Wc3QsdD10LnNsaWNlKDAsaSkuY29uY2F0KHQuc2xpY2UoaSsxKSk7YnJlYWt9cmV0dXJuIG51bGwhPW4mJnQucHVzaCh7bmFtZTplLHZhbHVlOm59KSx0fWpzdC5wcm90b3R5cGU9VXN0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6anN0LG9uOmZ1bmN0aW9uKHQsZSl7dmFyIG4saT10aGlzLl8scj1Hc3QodCsiIixpKSxvPS0xLGE9ci5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrZSk7Zm9yKDsrK288YTspaWYobj0odD1yW29dKS50eXBlKWlbbl09cXN0KGlbbl0sdC5uYW1lLGUpO2Vsc2UgaWYobnVsbD09ZSlmb3IobiBpbiBpKWlbbl09cXN0KGlbbl0sdC5uYW1lLG51bGwpO3JldHVybiB0aGlzfWZvcig7KytvPGE7KWlmKChuPSh0PXJbb10pLnR5cGUpJiYobj1Xc3QoaVtuXSx0Lm5hbWUpKSlyZXR1cm4gbn0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LGU9dGhpcy5fO2Zvcih2YXIgbiBpbiBlKXRbbl09ZVtuXS5zbGljZSgpO3JldHVybiBuZXcganN0KHQpfSxjYWxsOmZ1bmN0aW9uKHQsZSl7aWYoKG49YXJndW1lbnRzLmxlbmd0aC0yKT4wKWZvcih2YXIgbixpLHI9bmV3IEFycmF5KG4pLG89MDtvPG47KytvKXJbb109YXJndW1lbnRzW28rMl07aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3Iobz0wLG49KGk9dGhpcy5fW3RdKS5sZW5ndGg7bzxuOysrbylpW29dLnZhbHVlLmFwcGx5KGUscil9LGFwcGx5OmZ1bmN0aW9uKHQsZSxuKXtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2Zvcih2YXIgaT10aGlzLl9bdF0scj0wLG89aS5sZW5ndGg7cjxvOysrcilpW3JdLnZhbHVlLmFwcGx5KGUsbil9fTt2YXIgWXN0PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixYc3Q9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOllzdCx4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyJ9O2Z1bmN0aW9uICRzdCh0KXt2YXIgZT10Kz0iIixuPWUuaW5kZXhPZigiOiIpO3JldHVybiBuPj0wJiYieG1sbnMiIT09KGU9dC5zbGljZSgwLG4pKSYmKHQ9dC5zbGljZShuKzEpKSxYc3QuaGFzT3duUHJvcGVydHkoZSk/e3NwYWNlOlhzdFtlXSxsb2NhbDp0fTp0fWZ1bmN0aW9uIEtzdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLm93bmVyRG9jdW1lbnQsbj10aGlzLm5hbWVzcGFjZVVSSTtyZXR1cm4gbj09PVlzdCYmZS5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJPT09WXN0P2UuY3JlYXRlRWxlbWVudCh0KTplLmNyZWF0ZUVsZW1lbnROUyhuLHQpfX1mdW5jdGlvbiBac3QodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gSnN0KHQpe3ZhciBlPSRzdCh0KTtyZXR1cm4oZS5sb2NhbD9ac3Q6S3N0KShlKX1mdW5jdGlvbiBRc3QoKXt9ZnVuY3Rpb24gdGx0KHQpe3JldHVybiBudWxsPT10P1FzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IodCl9fWZ1bmN0aW9uIGVsdCgpe3JldHVybltdfWZ1bmN0aW9uIG5sdCh0KXtyZXR1cm4gbnVsbD09dD9lbHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHQpfX1mdW5jdGlvbiBpbHQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2hlcyh0KX19ZnVuY3Rpb24gcmx0KHQpe3JldHVybiBuZXcgQXJyYXkodC5sZW5ndGgpfWZ1bmN0aW9uIG9sdCh0LGUpe3RoaXMub3duZXJEb2N1bWVudD10Lm93bmVyRG9jdW1lbnQsdGhpcy5uYW1lc3BhY2VVUkk9dC5uYW1lc3BhY2VVUkksdGhpcy5fbmV4dD1udWxsLHRoaXMuX3BhcmVudD10LHRoaXMuX19kYXRhX189ZX1mdW5jdGlvbiBhbHQodCxlLG4saSxyLG8pe2Zvcih2YXIgYSxzPTAsbD1lLmxlbmd0aCxjPW8ubGVuZ3RoO3M8YzsrK3MpKGE9ZVtzXSk/KGEuX19kYXRhX189b1tzXSxpW3NdPWEpOm5bc109bmV3IG9sdCh0LG9bc10pO2Zvcig7czxsOysrcykoYT1lW3NdKSYmKHJbc109YSl9ZnVuY3Rpb24gc2x0KHQsZSxuLGkscixvLGEpe3ZhciBzLGwsYyx1PXt9LGg9ZS5sZW5ndGgsZD1vLmxlbmd0aCxwPW5ldyBBcnJheShoKTtmb3Iocz0wO3M8aDsrK3MpKGw9ZVtzXSkmJihwW3NdPWM9IiQiK2EuY2FsbChsLGwuX19kYXRhX18scyxlKSxjIGluIHU/cltzXT1sOnVbY109bCk7Zm9yKHM9MDtzPGQ7KytzKShsPXVbYz0iJCIrYS5jYWxsKHQsb1tzXSxzLG8pXSk/KGlbc109bCxsLl9fZGF0YV9fPW9bc10sdVtjXT1udWxsKTpuW3NdPW5ldyBvbHQodCxvW3NdKTtmb3Iocz0wO3M8aDsrK3MpKGw9ZVtzXSkmJnVbcFtzXV09PT1sJiYocltzXT1sKX1mdW5jdGlvbiBsbHQodCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOnQ+PWU/MDpOYU59ZnVuY3Rpb24gY2x0KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX1mdW5jdGlvbiB1bHQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBobHQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZSh0LGUpfX1mdW5jdGlvbiBkbHQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxlKX19ZnVuY3Rpb24gcGx0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj90aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KTp0aGlzLnNldEF0dHJpYnV0ZSh0LG4pfX1mdW5jdGlvbiBmbHQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTp0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxuKX19ZnVuY3Rpb24gbWx0KHQpe3JldHVybiB0Lm93bmVyRG9jdW1lbnQmJnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8dC5kb2N1bWVudCYmdHx8dC5kZWZhdWx0Vmlld31mdW5jdGlvbiBnbHQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KX19ZnVuY3Rpb24gX2x0KHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsZSxuKX19ZnVuY3Rpb24geWx0KHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1pP3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCk6dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LGksbil9fWZ1bmN0aW9uIHZsdCh0LGUpe3JldHVybiB0LnN0eWxlLmdldFByb3BlcnR5VmFsdWUoZSl8fG1sdCh0KS5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShlKX1mdW5jdGlvbiBibHQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbdF19fWZ1bmN0aW9uIHhsdCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXNbdF09ZX19ZnVuY3Rpb24gd2x0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj9kZWxldGUgdGhpc1t0XTp0aGlzW3RdPW59fWZ1bmN0aW9uIFNsdCh0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLyl9ZnVuY3Rpb24gTWx0KHQpe3JldHVybiB0LmNsYXNzTGlzdHx8bmV3IEVsdCh0KX1mdW5jdGlvbiBFbHQodCl7dGhpcy5fbm9kZT10LHRoaXMuX25hbWVzPVNsdCh0LmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfWZ1bmN0aW9uIFRsdCh0LGUpe2Zvcih2YXIgbj1NbHQodCksaT0tMSxyPWUubGVuZ3RoOysraTxyOyluLmFkZChlW2ldKX1mdW5jdGlvbiBDbHQodCxlKXtmb3IodmFyIG49TWx0KHQpLGk9LTEscj1lLmxlbmd0aDsrK2k8cjspbi5yZW1vdmUoZVtpXSl9ZnVuY3Rpb24gQWx0KHQpe3JldHVybiBmdW5jdGlvbigpe1RsdCh0aGlzLHQpfX1mdW5jdGlvbiBrbHQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7Q2x0KHRoaXMsdCl9fWZ1bmN0aW9uIExsdCh0LGUpe3JldHVybiBmdW5jdGlvbigpeyhlLmFwcGx5KHRoaXMsYXJndW1lbnRzKT9UbHQ6Q2x0KSh0aGlzLHQpfX1mdW5jdGlvbiBQbHQoKXt0aGlzLnRleHRDb250ZW50PSIifWZ1bmN0aW9uIE5sdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fWZ1bmN0aW9uIElsdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PWU/IiI6ZX19ZnVuY3Rpb24gUmx0KCl7dGhpcy5pbm5lckhUTUw9IiJ9ZnVuY3Rpb24gT2x0KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPXR9fWZ1bmN0aW9uIHpsdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT1lPyIiOmV9fWZ1bmN0aW9uIERsdCgpe3RoaXMubmV4dFNpYmxpbmcmJnRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKX1mdW5jdGlvbiBCbHQoKXt0aGlzLnByZXZpb3VzU2libGluZyYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKX1mdW5jdGlvbiBIbHQoKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBGbHQoKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7dCYmdC5yZW1vdmVDaGlsZCh0aGlzKX1mdW5jdGlvbiBWbHQoKXt2YXIgdD10aGlzLmNsb25lTm9kZSghMSksZT10aGlzLnBhcmVudE5vZGU7cmV0dXJuIGU/ZS5pbnNlcnRCZWZvcmUodCx0aGlzLm5leHRTaWJsaW5nKTp0fWZ1bmN0aW9uIFVsdCgpe3ZhciB0PXRoaXMuY2xvbmVOb2RlKCEwKSxlPXRoaXMucGFyZW50Tm9kZTtyZXR1cm4gZT9lLmluc2VydEJlZm9yZSh0LHRoaXMubmV4dFNpYmxpbmcpOnR9b2x0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6b2x0LGFwcGVuZENoaWxkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsdGhpcy5fbmV4dCl9LGluc2VydEJlZm9yZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsZSl9LHF1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHQpfSxxdWVyeVNlbGVjdG9yQWxsOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbCh0KX19LEVsdC5wcm90b3R5cGU9e2FkZDpmdW5jdGlvbih0KXt0aGlzLl9uYW1lcy5pbmRleE9mKHQpPDAmJih0aGlzLl9uYW1lcy5wdXNoKHQpLHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5fbmFtZXMuam9pbigiICIpKSl9LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9uYW1lcy5pbmRleE9mKHQpO2U+PTAmJih0aGlzLl9uYW1lcy5zcGxpY2UoZSwxKSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxjb250YWluczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZih0KT49MH19O3ZhciBqbHQ9e30sR2x0PW51bGw7ZnVuY3Rpb24gV2x0KHQsZSxuKXtyZXR1cm4gdD1xbHQodCxlLG4pLGZ1bmN0aW9uKGUpe3ZhciBuPWUucmVsYXRlZFRhcmdldDtuJiYobj09PXRoaXN8fDgmbi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzKSl8fHQuY2FsbCh0aGlzLGUpfX1mdW5jdGlvbiBxbHQodCxlLG4pe3JldHVybiBmdW5jdGlvbihpKXt2YXIgcj1HbHQ7R2x0PWk7dHJ5e3QuY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZSxuKX1maW5hbGx5e0dsdD1yfX19ZnVuY3Rpb24gWWx0KHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlPSIiLG49dC5pbmRleE9mKCIuIik7cmV0dXJuIG4+PTAmJihlPXQuc2xpY2UobisxKSx0PXQuc2xpY2UoMCxuKSkse3R5cGU6dCxuYW1lOmV9fSkpfWZ1bmN0aW9uIFhsdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9fb247aWYoZSl7Zm9yKHZhciBuLGk9MCxyPS0xLG89ZS5sZW5ndGg7aTxvOysraSluPWVbaV0sdC50eXBlJiZuLnR5cGUhPT10LnR5cGV8fG4ubmFtZSE9PXQubmFtZT9lWysrcl09bjp0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobi50eXBlLG4ubGlzdGVuZXIsbi5jYXB0dXJlKTsrK3I/ZS5sZW5ndGg9cjpkZWxldGUgdGhpcy5fX29ufX19ZnVuY3Rpb24gJGx0KHQsZSxuKXt2YXIgaT1qbHQuaGFzT3duUHJvcGVydHkodC50eXBlKT9XbHQ6cWx0O3JldHVybiBmdW5jdGlvbihyLG8sYSl7dmFyIHMsbD10aGlzLl9fb24sYz1pKGUsbyxhKTtpZihsKWZvcih2YXIgdT0wLGg9bC5sZW5ndGg7dTxoOysrdSlpZigocz1sW3VdKS50eXBlPT09dC50eXBlJiZzLm5hbWU9PT10Lm5hbWUpcmV0dXJuIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihzLnR5cGUscy5saXN0ZW5lcixzLmNhcHR1cmUpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihzLnR5cGUscy5saXN0ZW5lcj1jLHMuY2FwdHVyZT1uKSx2b2lkKHMudmFsdWU9ZSk7dGhpcy5hZGRFdmVudExpc3RlbmVyKHQudHlwZSxjLG4pLHM9e3R5cGU6dC50eXBlLG5hbWU6dC5uYW1lLHZhbHVlOmUsbGlzdGVuZXI6YyxjYXB0dXJlOm59LGw/bC5wdXNoKHMpOnRoaXMuX19vbj1bc119fWZ1bmN0aW9uIEtsdCh0LGUsbil7dmFyIGk9bWx0KHQpLHI9aS5DdXN0b21FdmVudDsiZnVuY3Rpb24iPT10eXBlb2Ygcj9yPW5ldyByKGUsbik6KHI9aS5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxuPyhyLmluaXRFdmVudChlLG4uYnViYmxlcyxuLmNhbmNlbGFibGUpLHIuZGV0YWlsPW4uZGV0YWlsKTpyLmluaXRFdmVudChlLCExLCExKSksdC5kaXNwYXRjaEV2ZW50KHIpfWZ1bmN0aW9uIFpsdCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBLbHQodGhpcyx0LGUpfX1mdW5jdGlvbiBKbHQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gS2x0KHRoaXMsdCxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJigib25tb3VzZWVudGVyImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8KGpsdD17bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9KSk7dmFyIFFsdD1bbnVsbF07ZnVuY3Rpb24gdGN0KHQsZSl7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1lfWZ1bmN0aW9uIGVjdCgpe3JldHVybiBuZXcgdGN0KFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sUWx0KX1mdW5jdGlvbiBuY3QodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P25ldyB0Y3QoW1tkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQpXV0sW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pOm5ldyB0Y3QoW1t0XV0sUWx0KX1mdW5jdGlvbiBpY3QoKXtmb3IodmFyIHQsZT1HbHQ7dD1lLnNvdXJjZUV2ZW50OyllPXQ7cmV0dXJuIGV9ZnVuY3Rpb24gcmN0KHQsZSl7dmFyIG49dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYobi5jcmVhdGVTVkdQb2ludCl7dmFyIGk9bi5jcmVhdGVTVkdQb2ludCgpO3JldHVybiBpLng9ZS5jbGllbnRYLGkueT1lLmNsaWVudFksWyhpPWkubWF0cml4VHJhbnNmb3JtKHQuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSkueCxpLnldfXZhciByPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW2UuY2xpZW50WC1yLmxlZnQtdC5jbGllbnRMZWZ0LGUuY2xpZW50WS1yLnRvcC10LmNsaWVudFRvcF19ZnVuY3Rpb24gb2N0KHQpe3ZhciBlPWljdCgpO3JldHVybiBlLmNoYW5nZWRUb3VjaGVzJiYoZT1lLmNoYW5nZWRUb3VjaGVzWzBdKSxyY3QodCxlKX1mdW5jdGlvbiBhY3QodCxlLG4pe2FyZ3VtZW50cy5sZW5ndGg8MyYmKG49ZSxlPWljdCgpLmNoYW5nZWRUb3VjaGVzKTtmb3IodmFyIGkscj0wLG89ZT9lLmxlbmd0aDowO3I8bzsrK3IpaWYoKGk9ZVtyXSkuaWRlbnRpZmllcj09PW4pcmV0dXJuIHJjdCh0LGkpO3JldHVybiBudWxsfWZ1bmN0aW9uIHNjdCgpe0dsdC5wcmV2ZW50RGVmYXVsdCgpLEdsdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBsY3QodCl7dmFyIGU9dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbj1uY3QodCkub24oImRyYWdzdGFydC5kcmFnIixzY3QsITApOyJvbnNlbGVjdHN0YXJ0ImluIGU/bi5vbigic2VsZWN0c3RhcnQuZHJhZyIsc2N0LCEwKTooZS5fX25vc2VsZWN0PWUuc3R5bGUuTW96VXNlclNlbGVjdCxlLnN0eWxlLk1velVzZXJTZWxlY3Q9Im5vbmUiKX1mdW5jdGlvbiBjY3QodCxlKXt2YXIgbj10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxpPW5jdCh0KS5vbigiZHJhZ3N0YXJ0LmRyYWciLG51bGwpO2UmJihpLm9uKCJjbGljay5kcmFnIixzY3QsITApLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aS5vbigiY2xpY2suZHJhZyIsbnVsbCl9KSwwKSksIm9uc2VsZWN0c3RhcnQiaW4gbj9pLm9uKCJzZWxlY3RzdGFydC5kcmFnIixudWxsKToobi5zdHlsZS5Nb3pVc2VyU2VsZWN0PW4uX19ub3NlbGVjdCxkZWxldGUgbi5fX25vc2VsZWN0KX1mdW5jdGlvbiB1Y3QodCxlLG4pe3QucHJvdG90eXBlPWUucHJvdG90eXBlPW4sbi5jb25zdHJ1Y3Rvcj10fWZ1bmN0aW9uIGhjdCh0LGUpe3ZhciBuPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpO2Zvcih2YXIgaSBpbiBlKW5baV09ZVtpXTtyZXR1cm4gbn1mdW5jdGlvbiBkY3QoKXt9dGN0LnByb3RvdHlwZT1lY3QucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp0Y3Qsc2VsZWN0OmZ1bmN0aW9uIHBjdCh0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9dGx0KHQpKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49ZS5sZW5ndGgsaT1uZXcgQXJyYXkobikscj0wO3I8bjsrK3IpZm9yKHZhciBvLGEscz1lW3JdLGw9cy5sZW5ndGgsYz1pW3JdPW5ldyBBcnJheShsKSx1PTA7dTxsOysrdSkobz1zW3VdKSYmKGE9dC5jYWxsKG8sby5fX2RhdGFfXyx1LHMpKSYmKCJfX2RhdGFfXyJpbiBvJiYoYS5fX2RhdGFfXz1vLl9fZGF0YV9fKSxjW3VdPWEpO3JldHVybiBuZXcgdGN0KGksdGhpcy5fcGFyZW50cyl9LHNlbGVjdEFsbDpmdW5jdGlvbiBmY3QodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PW5sdCh0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9W10scj1bXSxvPTA7bzxuOysrbylmb3IodmFyIGEscz1lW29dLGw9cy5sZW5ndGgsYz0wO2M8bDsrK2MpKGE9c1tjXSkmJihpLnB1c2godC5jYWxsKGEsYS5fX2RhdGFfXyxjLHMpKSxyLnB1c2goYSkpO3JldHVybiBuZXcgdGN0KGkscil9LGZpbHRlcjpmdW5jdGlvbiBtY3QodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PWlsdCh0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWZvcih2YXIgbyxhPWVbcl0scz1hLmxlbmd0aCxsPWlbcl09W10sYz0wO2M8czsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmbC5wdXNoKG8pO3JldHVybiBuZXcgdGN0KGksdGhpcy5fcGFyZW50cyl9LGRhdGE6ZnVuY3Rpb24gZ2N0KHQsZSl7aWYoIXQpcmV0dXJuIGY9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSx1PS0xLHRoaXMuZWFjaCgoZnVuY3Rpb24odCl7ZlsrK3VdPXR9KSksZjt2YXIgbj1lP3NsdDphbHQsaT10aGlzLl9wYXJlbnRzLHI9dGhpcy5fZ3JvdXBzOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD0oZnVuY3Rpb24gbyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KSh0KSk7Zm9yKHZhciBhPXIubGVuZ3RoLHM9bmV3IEFycmF5KGEpLGw9bmV3IEFycmF5KGEpLGM9bmV3IEFycmF5KGEpLHU9MDt1PGE7Kyt1KXt2YXIgaD1pW3VdLGQ9clt1XSxwPWQubGVuZ3RoLGY9dC5jYWxsKGgsaCYmaC5fX2RhdGFfXyx1LGkpLG09Zi5sZW5ndGgsZz1sW3VdPW5ldyBBcnJheShtKSxfPXNbdV09bmV3IEFycmF5KG0pO24oaCxkLGcsXyxjW3VdPW5ldyBBcnJheShwKSxmLGUpO2Zvcih2YXIgeSx2LGI9MCx4PTA7YjxtOysrYilpZih5PWdbYl0pe2ZvcihiPj14JiYoeD1iKzEpOyEodj1fW3hdKSYmKyt4PG07KTt5Ll9uZXh0PXZ8fG51bGx9fXJldHVybihzPW5ldyB0Y3QocyxpKSkuX2VudGVyPWwscy5fZXhpdD1jLHN9LGVudGVyOmZ1bmN0aW9uIF9jdCgpe3JldHVybiBuZXcgdGN0KHRoaXMuX2VudGVyfHx0aGlzLl9ncm91cHMubWFwKHJsdCksdGhpcy5fcGFyZW50cyl9LGV4aXQ6ZnVuY3Rpb24geWN0KCl7cmV0dXJuIG5ldyB0Y3QodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChybHQpLHRoaXMuX3BhcmVudHMpfSxqb2luOmZ1bmN0aW9uIHZjdCh0LGUsbil7dmFyIGk9dGhpcy5lbnRlcigpLHI9dGhpcyxvPXRoaXMuZXhpdCgpO3JldHVybiBpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3QoaSk6aS5hcHBlbmQodCsiIiksbnVsbCE9ZSYmKHI9ZShyKSksbnVsbD09bj9vLnJlbW92ZSgpOm4obyksaSYmcj9pLm1lcmdlKHIpLm9yZGVyKCk6cn0sbWVyZ2U6ZnVuY3Rpb24gYmN0KHQpe2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj10Ll9ncm91cHMsaT1lLmxlbmd0aCxyPU1hdGgubWluKGksbi5sZW5ndGgpLG89bmV3IEFycmF5KGkpLGE9MDthPHI7KythKWZvcih2YXIgcyxsPWVbYV0sYz1uW2FdLHU9bC5sZW5ndGgsaD1vW2FdPW5ldyBBcnJheSh1KSxkPTA7ZDx1OysrZCkocz1sW2RdfHxjW2RdKSYmKGhbZF09cyk7Zm9yKDthPGk7KythKW9bYV09ZVthXTtyZXR1cm4gbmV3IHRjdChvLHRoaXMuX3BhcmVudHMpfSxvcmRlcjpmdW5jdGlvbiB4Y3QoKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLGU9LTEsbj10Lmxlbmd0aDsrK2U8bjspZm9yKHZhciBpLHI9dFtlXSxvPXIubGVuZ3RoLTEsYT1yW29dOy0tbz49MDspKGk9cltvXSkmJihhJiY0XmkuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSkmJmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaSxhKSxhPWkpO3JldHVybiB0aGlzfSxzb3J0OmZ1bmN0aW9uIHdjdCh0KXtmdW5jdGlvbiBlKGUsbil7cmV0dXJuIGUmJm4/dChlLl9fZGF0YV9fLG4uX19kYXRhX18pOiFlLSFufXR8fCh0PWxsdCk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxpPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGkpLG89MDtvPGk7KytvKXtmb3IodmFyIGEscz1uW29dLGw9cy5sZW5ndGgsYz1yW29dPW5ldyBBcnJheShsKSx1PTA7dTxsOysrdSkoYT1zW3VdKSYmKGNbdV09YSk7Yy5zb3J0KGUpfXJldHVybiBuZXcgdGN0KHIsdGhpcy5fcGFyZW50cykub3JkZXIoKX0sY2FsbDpmdW5jdGlvbiBTY3QoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGFyZ3VtZW50c1swXT10aGlzLHQuYXBwbHkobnVsbCxhcmd1bWVudHMpLHRoaXN9LG5vZGVzOmZ1bmN0aW9uIE1jdCgpe3ZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSksZT0tMTtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3RbKytlXT10aGlzfSkpLHR9LG5vZGU6ZnVuY3Rpb24gRWN0KCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxlPTAsbj10Lmxlbmd0aDtlPG47KytlKWZvcih2YXIgaT10W2VdLHI9MCxvPWkubGVuZ3RoO3I8bzsrK3Ipe3ZhciBhPWlbcl07aWYoYSlyZXR1cm4gYX1yZXR1cm4gbnVsbH0sc2l6ZTpmdW5jdGlvbiBUY3QoKXt2YXIgdD0wO3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7Kyt0fSkpLHR9LGVtcHR5OmZ1bmN0aW9uIENjdCgpe3JldHVybiF0aGlzLm5vZGUoKX0sZWFjaDpmdW5jdGlvbiBBY3QodCl7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPTAsaT1lLmxlbmd0aDtuPGk7KytuKWZvcih2YXIgcixvPWVbbl0sYT0wLHM9by5sZW5ndGg7YTxzOysrYSkocj1vW2FdKSYmdC5jYWxsKHIsci5fX2RhdGFfXyxhLG8pO3JldHVybiB0aGlzfSxhdHRyOmZ1bmN0aW9uIGtjdCh0LGUpe3ZhciBuPSRzdCh0KTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciBpPXRoaXMubm9kZSgpO3JldHVybiBuLmxvY2FsP2kuZ2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsKTppLmdldEF0dHJpYnV0ZShuKX1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1lP24ubG9jYWw/dWx0OmNsdDoiZnVuY3Rpb24iPT10eXBlb2YgZT9uLmxvY2FsP2ZsdDpwbHQ6bi5sb2NhbD9kbHQ6aGx0KShuLGUpKX0sc3R5bGU6ZnVuY3Rpb24gTGN0KHQsZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09ZT9nbHQ6ImZ1bmN0aW9uIj09dHlwZW9mIGU/eWx0Ol9sdCkodCxlLG51bGw9PW4/IiI6bikpOnZsdCh0aGlzLm5vZGUoKSx0KX0scHJvcGVydHk6ZnVuY3Rpb24gUGN0KHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PWU/Ymx0OiJmdW5jdGlvbiI9PXR5cGVvZiBlP3dsdDp4bHQpKHQsZSkpOnRoaXMubm9kZSgpW3RdfSxjbGFzc2VkOmZ1bmN0aW9uIE5jdCh0LGUpe3ZhciBuPVNsdCh0KyIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgaT1NbHQodGhpcy5ub2RlKCkpLHI9LTEsbz1uLmxlbmd0aDsrK3I8bzspaWYoIWkuY29udGFpbnMobltyXSkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIGU/TGx0OmU/QWx0OmtsdCkobixlKSl9LHRleHQ6ZnVuY3Rpb24gSWN0KHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P1BsdDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/SWx0Ok5sdCkodCkpOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxodG1sOmZ1bmN0aW9uIFJjdCh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9SbHQ6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P3psdDpPbHQpKHQpKTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LHJhaXNlOmZ1bmN0aW9uIE9jdCgpe3JldHVybiB0aGlzLmVhY2goRGx0KX0sbG93ZXI6ZnVuY3Rpb24gemN0KCl7cmV0dXJuIHRoaXMuZWFjaChCbHQpfSxhcHBlbmQ6ZnVuY3Rpb24gRGN0KHQpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SnN0KHQpO3JldHVybiB0aGlzLnNlbGVjdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KSl9LGluc2VydDpmdW5jdGlvbiBCY3QodCxlKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkpzdCh0KSxpPW51bGw9PWU/SGx0OiJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6dGx0KGUpO3JldHVybiB0aGlzLnNlbGVjdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUobi5hcHBseSh0aGlzLGFyZ3VtZW50cyksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSkpfSxyZW1vdmU6ZnVuY3Rpb24gSGN0KCl7cmV0dXJuIHRoaXMuZWFjaChGbHQpfSxjbG9uZTpmdW5jdGlvbiBGY3QodCl7cmV0dXJuIHRoaXMuc2VsZWN0KHQ/VWx0OlZsdCl9LGRhdHVtOmZ1bmN0aW9uIFZjdCh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsdCk6dGhpcy5ub2RlKCkuX19kYXRhX199LG9uOmZ1bmN0aW9uIFVjdCh0LGUsbil7dmFyIGkscixvPVlsdCh0KyIiKSxhPW8ubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7Zm9yKHM9ZT8kbHQ6WGx0LG51bGw9PW4mJihuPSExKSxpPTA7aTxhOysraSl0aGlzLmVhY2gocyhvW2ldLGUsbikpO3JldHVybiB0aGlzfXZhciBzPXRoaXMubm9kZSgpLl9fb247aWYocylmb3IodmFyIGwsYz0wLHU9cy5sZW5ndGg7Yzx1OysrYylmb3IoaT0wLGw9c1tjXTtpPGE7KytpKWlmKChyPW9baV0pLnR5cGU9PT1sLnR5cGUmJnIubmFtZT09PWwubmFtZSlyZXR1cm4gbC52YWx1ZX0sZGlzcGF0Y2g6ZnVuY3Rpb24gamN0KHQsZSl7cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIGU/Smx0OlpsdCkodCxlKSl9fTt2YXIgR2N0PS43LFdjdD0xL0djdCxxY3Q9IlxccyooWystXT9cXGQrKVxccyoiLFljdD0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIixYY3Q9IlxccyooWystXT9cXGQqXFwuP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pJVxccyoiLCRjdD0vXiMoWzAtOWEtZl17Myw4fSkkLyxLY3Q9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW3FjdCxxY3QscWN0XSsiXFwpJCIpLFpjdD1uZXcgUmVnRXhwKCJecmdiXFwoIitbWGN0LFhjdCxYY3RdKyJcXCkkIiksSmN0PW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbcWN0LHFjdCxxY3QsWWN0XSsiXFwpJCIpLFFjdD1uZXcgUmVnRXhwKCJecmdiYVxcKCIrW1hjdCxYY3QsWGN0LFljdF0rIlxcKSQiKSx0dXQ9bmV3IFJlZ0V4cCgiXmhzbFxcKCIrW1ljdCxYY3QsWGN0XSsiXFwpJCIpLGV1dD1uZXcgUmVnRXhwKCJeaHNsYVxcKCIrW1ljdCxYY3QsWGN0LFljdF0rIlxcKSQiKSxudXQ9e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH07ZnVuY3Rpb24gaXV0KCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4KCl9ZnVuY3Rpb24gcnV0KCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCl9ZnVuY3Rpb24gb3V0KHQpe3ZhciBlLG47cmV0dXJuIHQ9KHQrIiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLChlPSRjdC5leGVjKHQpKT8obj1lWzFdLmxlbmd0aCxlPXBhcnNlSW50KGVbMV0sMTYpLDY9PT1uP2F1dChlKTozPT09bj9uZXcgdXV0KGU+PjgmMTV8ZT4+NCYyNDAsZT4+NCYxNXwyNDAmZSwoMTUmZSk8PDR8MTUmZSwxKTo4PT09bj9zdXQoZT4+MjQmMjU1LGU+PjE2JjI1NSxlPj44JjI1NSwoMjU1JmUpLzI1NSk6ND09PW4/c3V0KGU+PjEyJjE1fGU+PjgmMjQwLGU+PjgmMTV8ZT4+NCYyNDAsZT4+NCYxNXwyNDAmZSwoKDE1JmUpPDw0fDE1JmUpLzI1NSk6bnVsbCk6KGU9S2N0LmV4ZWModCkpP25ldyB1dXQoZVsxXSxlWzJdLGVbM10sMSk6KGU9WmN0LmV4ZWModCkpP25ldyB1dXQoMjU1KmVbMV0vMTAwLDI1NSplWzJdLzEwMCwyNTUqZVszXS8xMDAsMSk6KGU9SmN0LmV4ZWModCkpP3N1dChlWzFdLGVbMl0sZVszXSxlWzRdKTooZT1RY3QuZXhlYyh0KSk/c3V0KDI1NSplWzFdLzEwMCwyNTUqZVsyXS8xMDAsMjU1KmVbM10vMTAwLGVbNF0pOihlPXR1dC5leGVjKHQpKT9mdXQoZVsxXSxlWzJdLzEwMCxlWzNdLzEwMCwxKTooZT1ldXQuZXhlYyh0KSk/ZnV0KGVbMV0sZVsyXS8xMDAsZVszXS8xMDAsZVs0XSk6bnV0Lmhhc093blByb3BlcnR5KHQpP2F1dChudXRbdF0pOiJ0cmFuc3BhcmVudCI9PT10P25ldyB1dXQoTmFOLE5hTixOYU4sMCk6bnVsbH1mdW5jdGlvbiBhdXQodCl7cmV0dXJuIG5ldyB1dXQodD4+MTYmMjU1LHQ+PjgmMjU1LDI1NSZ0LDEpfWZ1bmN0aW9uIHN1dCh0LGUsbixpKXtyZXR1cm4gaTw9MCYmKHQ9ZT1uPU5hTiksbmV3IHV1dCh0LGUsbixpKX1mdW5jdGlvbiBsdXQodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBkY3R8fCh0PW91dCh0KSksdD9uZXcgdXV0KCh0PXQucmdiKCkpLnIsdC5nLHQuYix0Lm9wYWNpdHkpOm5ldyB1dXR9ZnVuY3Rpb24gY3V0KHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9sdXQodCk6bmV3IHV1dCh0LGUsbixudWxsPT1pPzE6aSl9ZnVuY3Rpb24gdXV0KHQsZSxuLGkpe3RoaXMucj0rdCx0aGlzLmc9K2UsdGhpcy5iPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiBodXQoKXtyZXR1cm4iIyIrcHV0KHRoaXMucikrcHV0KHRoaXMuZykrcHV0KHRoaXMuYil9ZnVuY3Rpb24gZHV0KCl7dmFyIHQ9dGhpcy5vcGFjaXR5O3JldHVybigxPT09KHQ9aXNOYU4odCk/MTpNYXRoLm1heCgwLE1hdGgubWluKDEsdCkpKT8icmdiKCI6InJnYmEoIikrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLnIpfHwwKSkrIiwgIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMuZyl8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5iKXx8MCkpKygxPT09dD8iKSI6IiwgIit0KyIpIil9ZnVuY3Rpb24gcHV0KHQpe3JldHVybigodD1NYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHQpfHwwKSkpPDE2PyIwIjoiIikrdC50b1N0cmluZygxNil9ZnVuY3Rpb24gZnV0KHQsZSxuLGkpe3JldHVybiBpPD0wP3Q9ZT1uPU5hTjpuPD0wfHxuPj0xP3Q9ZT1OYU46ZTw9MCYmKHQ9TmFOKSxuZXcgZ3V0KHQsZSxuLGkpfWZ1bmN0aW9uIG11dCh0KXtpZih0IGluc3RhbmNlb2YgZ3V0KXJldHVybiBuZXcgZ3V0KHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIGRjdHx8KHQ9b3V0KHQpKSwhdClyZXR1cm4gbmV3IGd1dDtpZih0IGluc3RhbmNlb2YgZ3V0KXJldHVybiB0O3ZhciBlPSh0PXQucmdiKCkpLnIvMjU1LG49dC5nLzI1NSxpPXQuYi8yNTUscj1NYXRoLm1pbihlLG4saSksbz1NYXRoLm1heChlLG4saSksYT1OYU4scz1vLXIsbD0obytyKS8yO3JldHVybiBzPyhhPWU9PT1vPyhuLWkpL3MrNioobjxpKTpuPT09bz8oaS1lKS9zKzI6KGUtbikvcys0LHMvPWw8LjU/bytyOjItby1yLGEqPTYwKTpzPWw+MCYmbDwxPzA6YSxuZXcgZ3V0KGEscyxsLHQub3BhY2l0eSl9ZnVuY3Rpb24gZ3V0KHQsZSxuLGkpe3RoaXMuaD0rdCx0aGlzLnM9K2UsdGhpcy5sPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiBfdXQodCxlLG4pe3JldHVybiAyNTUqKHQ8NjA/ZSsobi1lKSp0LzYwOnQ8MTgwP246dDwyNDA/ZSsobi1lKSooMjQwLXQpLzYwOmUpfWZ1bmN0aW9uIHl1dCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gdnV0KHQsZSl7dmFyIG49ZS10O3JldHVybiBuPyhmdW5jdGlvbiBpKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0K24qZX19KSh0LG4pOnl1dChpc05hTih0KT9lOnQpfXVjdChkY3Qsb3V0LHtjb3B5OmZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLHRoaXMsdCl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKX0saGV4Oml1dCxmb3JtYXRIZXg6aXV0LGZvcm1hdEhzbDpmdW5jdGlvbiBidXQoKXtyZXR1cm4gbXV0KHRoaXMpLmZvcm1hdEhzbCgpfSxmb3JtYXRSZ2I6cnV0LHRvU3RyaW5nOnJ1dH0pLHVjdCh1dXQsY3V0LGhjdChkY3Qse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/V2N0Ok1hdGgucG93KFdjdCx0KSxuZXcgdXV0KHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P0djdDpNYXRoLnBvdyhHY3QsdCksbmV3IHV1dCh0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4tLjU8PXRoaXMuciYmdGhpcy5yPDI1NS41JiYtLjU8PXRoaXMuZyYmdGhpcy5nPDI1NS41JiYtLjU8PXRoaXMuYiYmdGhpcy5iPDI1NS41JiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0saGV4Omh1dCxmb3JtYXRIZXg6aHV0LGZvcm1hdFJnYjpkdXQsdG9TdHJpbmc6ZHV0fSkpLHVjdChndXQsKGZ1bmN0aW9uIHh1dCh0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/bXV0KHQpOm5ldyBndXQodCxlLG4sbnVsbD09aT8xOmkpfSksaGN0KGRjdCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9XY3Q6TWF0aC5wb3coV2N0LHQpLG5ldyBndXQodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9HY3Q6TWF0aC5wb3coR2N0LHQpLG5ldyBndXQodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmglMzYwKzM2MCoodGhpcy5oPDApLGU9aXNOYU4odCl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsbj10aGlzLmwsaT1uKyhuPC41P246MS1uKSplLHI9MipuLWk7cmV0dXJuIG5ldyB1dXQoX3V0KHQ+PTI0MD90LTI0MDp0KzEyMCxyLGkpLF91dCh0LHIsaSksX3V0KHQ8MTIwP3QrMjQwOnQtMTIwLHIsaSksdGhpcy5vcGFjaXR5KX0sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4oMDw9dGhpcy5zJiZ0aGlzLnM8PTF8fGlzTmFOKHRoaXMucykpJiYwPD10aGlzLmwmJnRoaXMubDw9MSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGZvcm1hdEhzbDpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3BhY2l0eTtyZXR1cm4oMT09PSh0PWlzTmFOKHQpPzE6TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSk/ImhzbCgiOiJoc2xhKCIpKyh0aGlzLmh8fDApKyIsICIrMTAwKih0aGlzLnN8fDApKyIlLCAiKzEwMCoodGhpcy5sfHwwKSsiJSIrKDE9PT10PyIpIjoiLCAiK3QrIikiKX19KSk7dmFyIHd1dD0oZnVuY3Rpb24gdChlKXt2YXIgbj0oZnVuY3Rpb24gaSh0KXtyZXR1cm4gMT09KHQ9K3QpP3Z1dDpmdW5jdGlvbihlLG4pe3JldHVybiBuLWU/KGZ1bmN0aW9uIGkodCxlLG4pe3JldHVybiB0PU1hdGgucG93KHQsbiksZT1NYXRoLnBvdyhlLG4pLXQsbj0xL24sZnVuY3Rpb24oaSl7cmV0dXJuIE1hdGgucG93KHQraSplLG4pfX0pKGUsbix0KTp5dXQoaXNOYU4oZSk/bjplKX19KShlKTtmdW5jdGlvbiByKHQsZSl7dmFyIGk9bigodD1jdXQodCkpLnIsKGU9Y3V0KGUpKS5yKSxyPW4odC5nLGUuZyksbz1uKHQuYixlLmIpLGE9dnV0KHQub3BhY2l0eSxlLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5yPWkoZSksdC5nPXIoZSksdC5iPW8oZSksdC5vcGFjaXR5PWEoZSksdCsiIn19cmV0dXJuIHIuZ2FtbWE9dCxyfSkoMSk7ZnVuY3Rpb24gU3V0KHQsZSl7cmV0dXJuIHQ9K3QsZT0rZSxmdW5jdGlvbihuKXtyZXR1cm4gdCooMS1uKStlKm59fXZhciBNdXQ9L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLEV1dD1uZXcgUmVnRXhwKE11dC5zb3VyY2UsImciKTtmdW5jdGlvbiBUdXQodCxlKXt2YXIgbixpLHIsbz1NdXQubGFzdEluZGV4PUV1dC5sYXN0SW5kZXg9MCxhPS0xLHM9W10sbD1bXTtmb3IodCs9IiIsZSs9IiI7KG49TXV0LmV4ZWModCkpJiYoaT1FdXQuZXhlYyhlKSk7KShyPWkuaW5kZXgpPm8mJihyPWUuc2xpY2UobyxyKSxzW2FdP3NbYV0rPXI6c1srK2FdPXIpLChuPW5bMF0pPT09KGk9aVswXSk/c1thXT9zW2FdKz1pOnNbKythXT1pOihzWysrYV09bnVsbCxsLnB1c2goe2k6YSx4OlN1dChuLGkpfSkpLG89RXV0Lmxhc3RJbmRleDtyZXR1cm4gbzxlLmxlbmd0aCYmKHI9ZS5zbGljZShvKSxzW2FdP3NbYV0rPXI6c1srK2FdPXIpLHMubGVuZ3RoPDI/bFswXT8oZnVuY3Rpb24gYyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSkrIiJ9fSkobFswXS54KTooZnVuY3Rpb24gdSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KShlKTooZT1sLmxlbmd0aCxmdW5jdGlvbih0KXtmb3IodmFyIG4saT0wO2k8ZTsrK2kpc1sobj1sW2ldKS5pXT1uLngodCk7cmV0dXJuIHMuam9pbigiIil9KX12YXIgQ3V0LEF1dCxrdXQsTHV0LFB1dD0xODAvTWF0aC5QSSxOdXQ9e3RyYW5zbGF0ZVg6MCx0cmFuc2xhdGVZOjAscm90YXRlOjAsc2tld1g6MCxzY2FsZVg6MSxzY2FsZVk6MX07ZnVuY3Rpb24gSXV0KHQsZSxuLGkscixvKXt2YXIgYSxzLGw7cmV0dXJuKGE9TWF0aC5zcXJ0KHQqdCtlKmUpKSYmKHQvPWEsZS89YSksKGw9dCpuK2UqaSkmJihuLT10KmwsaS09ZSpsKSwocz1NYXRoLnNxcnQobipuK2kqaSkpJiYobi89cyxpLz1zLGwvPXMpLHQqaTxlKm4mJih0PS10LGU9LWUsbD0tbCxhPS1hKSx7dHJhbnNsYXRlWDpyLHRyYW5zbGF0ZVk6byxyb3RhdGU6TWF0aC5hdGFuMihlLHQpKlB1dCxza2V3WDpNYXRoLmF0YW4obCkqUHV0LHNjYWxlWDphLHNjYWxlWTpzfX1mdW5jdGlvbiBSdXQodCxlLG4saSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdC5sZW5ndGg/dC5wb3AoKSsiICI6IiJ9cmV0dXJuIGZ1bmN0aW9uKG8sYSl7dmFyIHM9W10sbD1bXTtyZXR1cm4gbz10KG8pLGE9dChhKSwoZnVuY3Rpb24gYyh0LGkscixvLGEscyl7aWYodCE9PXJ8fGkhPT1vKXt2YXIgbD1hLnB1c2goInRyYW5zbGF0ZSgiLG51bGwsZSxudWxsLG4pO3MucHVzaCh7aTpsLTQseDpTdXQodCxyKX0se2k6bC0yLHg6U3V0KGksbyl9KX1lbHNlKHJ8fG8pJiZhLnB1c2goInRyYW5zbGF0ZSgiK3IrZStvK24pfSkoby50cmFuc2xhdGVYLG8udHJhbnNsYXRlWSxhLnRyYW5zbGF0ZVgsYS50cmFuc2xhdGVZLHMsbCksKGZ1bmN0aW9uIHUodCxlLG4sbyl7dCE9PWU/KHQtZT4xODA/ZSs9MzYwOmUtdD4xODAmJih0Kz0zNjApLG8ucHVzaCh7aTpuLnB1c2gocihuKSsicm90YXRlKCIsbnVsbCxpKS0yLHg6U3V0KHQsZSl9KSk6ZSYmbi5wdXNoKHIobikrInJvdGF0ZSgiK2UraSl9KShvLnJvdGF0ZSxhLnJvdGF0ZSxzLGwpLChmdW5jdGlvbiBoKHQsZSxuLG8pe3QhPT1lP28ucHVzaCh7aTpuLnB1c2gocihuKSsic2tld1goIixudWxsLGkpLTIseDpTdXQodCxlKX0pOmUmJm4ucHVzaChyKG4pKyJza2V3WCgiK2UraSl9KShvLnNrZXdYLGEuc2tld1gscyxsKSwoZnVuY3Rpb24gZCh0LGUsbixpLG8sYSl7aWYodCE9PW58fGUhPT1pKXt2YXIgcz1vLnB1c2gocihvKSsic2NhbGUoIixudWxsLCIsIixudWxsLCIpIik7YS5wdXNoKHtpOnMtNCx4OlN1dCh0LG4pfSx7aTpzLTIseDpTdXQoZSxpKX0pfWVsc2UgMT09PW4mJjE9PT1pfHxvLnB1c2gocihvKSsic2NhbGUoIituKyIsIitpKyIpIil9KShvLnNjYWxlWCxvLnNjYWxlWSxhLnNjYWxlWCxhLnNjYWxlWSxzLGwpLG89YT1udWxsLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPS0xLGk9bC5sZW5ndGg7KytuPGk7KXNbKGU9bFtuXSkuaV09ZS54KHQpO3JldHVybiBzLmpvaW4oIiIpfX19dmFyIE91dD1SdXQoKGZ1bmN0aW9uIHp1dCh0KXtyZXR1cm4ibm9uZSI9PT10P051dDooQ3V0fHwoQ3V0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLEF1dD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsa3V0PWRvY3VtZW50LmRlZmF1bHRWaWV3KSxDdXQuc3R5bGUudHJhbnNmb3JtPXQsdD1rdXQuZ2V0Q29tcHV0ZWRTdHlsZShBdXQuYXBwZW5kQ2hpbGQoQ3V0KSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKSxBdXQucmVtb3ZlQ2hpbGQoQ3V0KSxJdXQoKyh0PXQuc2xpY2UoNywtMSkuc3BsaXQoIiwiKSlbMF0sK3RbMV0sK3RbMl0sK3RbM10sK3RbNF0sK3RbNV0pKX0pLCJweCwgIiwicHgpIiwiZGVnKSIpLER1dD1SdXQoKGZ1bmN0aW9uIEJ1dCh0KXtyZXR1cm4gbnVsbD09dD9OdXQ6KEx1dHx8KEx1dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwiZyIpKSxMdXQuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLHQpLCh0PUx1dC50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKT9JdXQoKHQ9dC5tYXRyaXgpLmEsdC5iLHQuYyx0LmQsdC5lLHQuZik6TnV0KX0pLCIsICIsIikiLCIpIiksSHV0PU1hdGguU1FSVDI7ZnVuY3Rpb24gRnV0KHQpe3JldHVybigodD1NYXRoLmV4cCh0KSkrMS90KS8yfWZ1bmN0aW9uIFZ1dCh0LGUpe3ZhciBuLGkscj10WzBdLG89dFsxXSxhPXRbMl0scz1lWzJdLGw9ZVswXS1yLGM9ZVsxXS1vLHU9bCpsK2MqYztpZih1PDFlLTEyKWk9TWF0aC5sb2cocy9hKS9IdXQsbj1mdW5jdGlvbih0KXtyZXR1cm5bcit0Kmwsbyt0KmMsYSpNYXRoLmV4cChIdXQqdCppKV19O2Vsc2V7dmFyIGg9TWF0aC5zcXJ0KHUpLGQ9KHMqcy1hKmErNCp1KS8oMiphKjIqaCkscD0ocypzLWEqYS00KnUpLygyKnMqMipoKSxmPU1hdGgubG9nKE1hdGguc3FydChkKmQrMSktZCksbT1NYXRoLmxvZyhNYXRoLnNxcnQocCpwKzEpLXApO2k9KG0tZikvSHV0LG49ZnVuY3Rpb24odCl7dmFyIGU9dCppLG49RnV0KGYpLHM9YS8oMipoKSoobiooZnVuY3Rpb24gdSh0KXtyZXR1cm4oKHQ9TWF0aC5leHAoMip0KSktMSkvKHQrMSl9KShIdXQqZStmKS0oZnVuY3Rpb24gZCh0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpLTEvdCkvMn0pKGYpKTtyZXR1cm5bcitzKmwsbytzKmMsYSpuL0Z1dChIdXQqZStmKV19fXJldHVybiBuLmR1cmF0aW9uPTFlMyppLG59dmFyIFV1dCxqdXQsR3V0PTAsV3V0PTAscXV0PTAsWXV0PTAsWHV0PTAsJHV0PTAsS3V0PSJvYmplY3QiPT10eXBlb2YgcGVyZm9ybWFuY2UmJnBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZTpEYXRlLFp1dD0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTcpfTtmdW5jdGlvbiBKdXQoKXtyZXR1cm4gWHV0fHwoWnV0KFF1dCksWHV0PUt1dC5ub3coKSskdXQpfWZ1bmN0aW9uIFF1dCgpe1h1dD0wfWZ1bmN0aW9uIHRodCgpe3RoaXMuX2NhbGw9dGhpcy5fdGltZT10aGlzLl9uZXh0PW51bGx9ZnVuY3Rpb24gZWh0KHQsZSxuKXt2YXIgaT1uZXcgdGh0O3JldHVybiBpLnJlc3RhcnQodCxlLG4pLGl9ZnVuY3Rpb24gbmh0KCl7WHV0PShZdXQ9S3V0Lm5vdygpKSskdXQsR3V0PVd1dD0wO3RyeXshKGZ1bmN0aW9uIHQoKXtKdXQoKSwrK0d1dDtmb3IodmFyIHQsZT1VdXQ7ZTspKHQ9WHV0LWUuX3RpbWUpPj0wJiZlLl9jYWxsLmNhbGwobnVsbCx0KSxlPWUuX25leHQ7LS1HdXR9KSgpfWZpbmFsbHl7R3V0PTAsKGZ1bmN0aW9uIGUoKXtmb3IodmFyIHQsZSxuPVV1dCxpPTEvMDtuOyluLl9jYWxsPyhpPm4uX3RpbWUmJihpPW4uX3RpbWUpLHQ9bixuPW4uX25leHQpOihlPW4uX25leHQsbi5fbmV4dD1udWxsLG49dD90Ll9uZXh0PWU6VXV0PWUpO2p1dD10LHJodChpKX0pKCksWHV0PTB9fWZ1bmN0aW9uIGlodCgpe3ZhciB0PUt1dC5ub3coKSxlPXQtWXV0O2U+MWUzJiYoJHV0LT1lLFl1dD10KX1mdW5jdGlvbiByaHQodCl7R3V0fHwoV3V0JiYoV3V0PWNsZWFyVGltZW91dChXdXQpKSx0LVh1dD4yND8odDwxLzAmJihXdXQ9c2V0VGltZW91dChuaHQsdC1LdXQubm93KCktJHV0KSkscXV0JiYocXV0PWNsZWFySW50ZXJ2YWwocXV0KSkpOihxdXR8fChZdXQ9S3V0Lm5vdygpLHF1dD1zZXRJbnRlcnZhbChpaHQsMWUzKSksR3V0PTEsWnV0KG5odCkpKX1mdW5jdGlvbiBvaHQodCxlLG4pe3ZhciBpPW5ldyB0aHQ7cmV0dXJuIGkucmVzdGFydCgoZnVuY3Rpb24obil7aS5zdG9wKCksdChuK2UpfSksZT1udWxsPT1lPzA6K2UsbiksaX10aHQucHJvdG90eXBlPWVodC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnRodCxyZXN0YXJ0OmZ1bmN0aW9uKHQsZSxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbiIpO249KG51bGw9PW4/SnV0KCk6K24pKyhudWxsPT1lPzA6K2UpLHRoaXMuX25leHR8fGp1dD09PXRoaXN8fChqdXQ/anV0Ll9uZXh0PXRoaXM6VXV0PXRoaXMsanV0PXRoaXMpLHRoaXMuX2NhbGw9dCx0aGlzLl90aW1lPW4scmh0KCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9jYWxsJiYodGhpcy5fY2FsbD1udWxsLHRoaXMuX3RpbWU9MS8wLHJodCgpKX19O3ZhciBhaHQ9VXN0KCJzdGFydCIsImVuZCIsImNhbmNlbCIsImludGVycnVwdCIpLHNodD1bXTtmdW5jdGlvbiBsaHQodCxlLG4saSxyLG8pe3ZhciBhPXQuX190cmFuc2l0aW9uO2lmKGEpe2lmKG4gaW4gYSlyZXR1cm59ZWxzZSB0Ll9fdHJhbnNpdGlvbj17fTshKGZ1bmN0aW9uIHModCxlLG4pe3ZhciBpLHI9dC5fX3RyYW5zaXRpb247ZnVuY3Rpb24gbyhsKXt2YXIgYyx1LGgsZDtpZigxIT09bi5zdGF0ZSlyZXR1cm4gcygpO2ZvcihjIGluIHIpaWYoKGQ9cltjXSkubmFtZT09PW4ubmFtZSl7aWYoMz09PWQuc3RhdGUpcmV0dXJuIG9odChvKTs0PT09ZC5zdGF0ZT8oZC5zdGF0ZT02LGQudGltZXIuc3RvcCgpLGQub24uY2FsbCgiaW50ZXJydXB0Iix0LHQuX19kYXRhX18sZC5pbmRleCxkLmdyb3VwKSxkZWxldGUgcltjXSk6K2M8ZSYmKGQuc3RhdGU9NixkLnRpbWVyLnN0b3AoKSxkLm9uLmNhbGwoImNhbmNlbCIsdCx0Ll9fZGF0YV9fLGQuaW5kZXgsZC5ncm91cCksZGVsZXRlIHJbY10pfWlmKG9odCgoZnVuY3Rpb24oKXszPT09bi5zdGF0ZSYmKG4uc3RhdGU9NCxuLnRpbWVyLnJlc3RhcnQoYSxuLmRlbGF5LG4udGltZSksYShsKSl9KSksbi5zdGF0ZT0yLG4ub24uY2FsbCgic3RhcnQiLHQsdC5fX2RhdGFfXyxuLmluZGV4LG4uZ3JvdXApLDI9PT1uLnN0YXRlKXtmb3Iobi5zdGF0ZT0zLGk9bmV3IEFycmF5KGg9bi50d2Vlbi5sZW5ndGgpLGM9MCx1PS0xO2M8aDsrK2MpKGQ9bi50d2VlbltjXS52YWx1ZS5jYWxsKHQsdC5fX2RhdGFfXyxuLmluZGV4LG4uZ3JvdXApKSYmKGlbKyt1XT1kKTtpLmxlbmd0aD11KzF9fWZ1bmN0aW9uIGEoZSl7Zm9yKHZhciByPWU8bi5kdXJhdGlvbj9uLmVhc2UuY2FsbChudWxsLGUvbi5kdXJhdGlvbik6KG4udGltZXIucmVzdGFydChzKSxuLnN0YXRlPTUsMSksbz0tMSxhPWkubGVuZ3RoOysrbzxhOylpW29dLmNhbGwodCxyKTs1PT09bi5zdGF0ZSYmKG4ub24uY2FsbCgiZW5kIix0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSxzKCkpfWZ1bmN0aW9uIHMoKXtmb3IodmFyIGkgaW4gbi5zdGF0ZT02LG4udGltZXIuc3RvcCgpLGRlbGV0ZSByW2VdLHIpcmV0dXJuO2RlbGV0ZSB0Ll9fdHJhbnNpdGlvbn1yW2VdPW4sbi50aW1lcj1laHQoKGZ1bmN0aW9uIGwodCl7bi5zdGF0ZT0xLG4udGltZXIucmVzdGFydChvLG4uZGVsYXksbi50aW1lKSxuLmRlbGF5PD10JiZvKHQtbi5kZWxheSl9KSwwLG4udGltZSl9KSh0LG4se25hbWU6ZSxpbmRleDppLGdyb3VwOnIsb246YWh0LHR3ZWVuOnNodCx0aW1lOm8udGltZSxkZWxheTpvLmRlbGF5LGR1cmF0aW9uOm8uZHVyYXRpb24sZWFzZTpvLmVhc2UsdGltZXI6bnVsbCxzdGF0ZTowfSl9ZnVuY3Rpb24gY2h0KHQsZSl7dmFyIG49aGh0KHQsZSk7aWYobi5zdGF0ZT4wKXRocm93IG5ldyBFcnJvcigidG9vIGxhdGU7IGFscmVhZHkgc2NoZWR1bGVkIik7cmV0dXJuIG59ZnVuY3Rpb24gdWh0KHQsZSl7dmFyIG49aGh0KHQsZSk7aWYobi5zdGF0ZT4zKXRocm93IG5ldyBFcnJvcigidG9vIGxhdGU7IGFscmVhZHkgcnVubmluZyIpO3JldHVybiBufWZ1bmN0aW9uIGhodCh0LGUpe3ZhciBuPXQuX190cmFuc2l0aW9uO2lmKCFufHwhKG49bltlXSkpdGhyb3cgbmV3IEVycm9yKCJ0cmFuc2l0aW9uIG5vdCBmb3VuZCIpO3JldHVybiBufWZ1bmN0aW9uIGRodCh0LGUpe3ZhciBuLGkscixvPXQuX190cmFuc2l0aW9uLGE9ITA7aWYobyl7Zm9yKHIgaW4gZT1udWxsPT1lP251bGw6ZSsiIixvKShuPW9bcl0pLm5hbWU9PT1lPyhpPW4uc3RhdGU+MiYmbi5zdGF0ZTw1LG4uc3RhdGU9NixuLnRpbWVyLnN0b3AoKSxuLm9uLmNhbGwoaT8iaW50ZXJydXB0IjoiY2FuY2VsIix0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSxkZWxldGUgb1tyXSk6YT0hMTthJiZkZWxldGUgdC5fX3RyYW5zaXRpb259fWZ1bmN0aW9uIHBodCh0LGUpe3ZhciBuLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9dWh0KHRoaXMsdCksbz1yLnR3ZWVuO2lmKG8hPT1uKWZvcih2YXIgYT0wLHM9KGk9bj1vKS5sZW5ndGg7YTxzOysrYSlpZihpW2FdLm5hbWU9PT1lKXsoaT1pLnNsaWNlKCkpLnNwbGljZShhLDEpO2JyZWFrfXIudHdlZW49aX19ZnVuY3Rpb24gZmh0KHQsZSxuKXt2YXIgaSxyO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz11aHQodGhpcyx0KSxhPW8udHdlZW47aWYoYSE9PWkpe3I9KGk9YSkuc2xpY2UoKTtmb3IodmFyIHM9e25hbWU6ZSx2YWx1ZTpufSxsPTAsYz1yLmxlbmd0aDtsPGM7KytsKWlmKHJbbF0ubmFtZT09PWUpe3JbbF09czticmVha31sPT09YyYmci5wdXNoKHMpfW8udHdlZW49cn19ZnVuY3Rpb24gbWh0KHQsZSxuKXt2YXIgaT10Ll9pZDtyZXR1cm4gdC5lYWNoKChmdW5jdGlvbigpe3ZhciB0PXVodCh0aGlzLGkpOyh0LnZhbHVlfHwodC52YWx1ZT17fSkpW2VdPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpfSkpLGZ1bmN0aW9uKHQpe3JldHVybiBoaHQodCxpKS52YWx1ZVtlXX19ZnVuY3Rpb24gZ2h0KHQsZSl7dmFyIG47cmV0dXJuKCJudW1iZXIiPT10eXBlb2YgZT9TdXQ6ZSBpbnN0YW5jZW9mIG91dD93dXQ6KG49b3V0KGUpKT8oZT1uLHd1dCk6VHV0KSh0LGUpfWZ1bmN0aW9uIF9odCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19ZnVuY3Rpb24geWh0KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gdmh0KHQsZSxuKXt2YXIgaSxyLG89bisiIjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEF0dHJpYnV0ZSh0KTtyZXR1cm4gYT09PW8/bnVsbDphPT09aT9yOnI9ZShpPWEsbil9fWZ1bmN0aW9uIGJodCh0LGUsbil7dmFyIGkscixvPW4rIiI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpO3JldHVybiBhPT09bz9udWxsOmE9PT1pP3I6cj1lKGk9YSxuKX19ZnVuY3Rpb24geGh0KHQsZSxuKXt2YXIgaSxyLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEscyxsPW4odGhpcyk7aWYobnVsbCE9bClyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZSh0KSk9PT0ocz1sKyIiKT9udWxsOmE9PT1pJiZzPT09cj9vOihyPXMsbz1lKGk9YSxsKSk7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIHdodCh0LGUsbil7dmFyIGkscixvO3JldHVybiBmdW5jdGlvbigpe3ZhciBhLHMsbD1uKHRoaXMpO2lmKG51bGwhPWwpcmV0dXJuKGE9dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpKT09PShzPWwrIiIpP251bGw6YT09PWkmJnM9PT1yP286KHI9cyxvPWUoaT1hLGwpKTt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIFNodCh0LGUpe3JldHVybiBmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZSh0LGUuY2FsbCh0aGlzLG4pKX19ZnVuY3Rpb24gTWh0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGUuY2FsbCh0aGlzLG4pKX19ZnVuY3Rpb24gRWh0KHQsZSl7dmFyIG4saTtmdW5jdGlvbiByKCl7dmFyIHI9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHIhPT1pJiYobj0oaT1yKSYmTWh0KHQscikpLG59cmV0dXJuIHIuX3ZhbHVlPWUscn1mdW5jdGlvbiBUaHQodCxlKXt2YXIgbixpO2Z1bmN0aW9uIHIoKXt2YXIgcj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gciE9PWkmJihuPShpPXIpJiZTaHQodCxyKSksbn1yZXR1cm4gci5fdmFsdWU9ZSxyfWZ1bmN0aW9uIENodCh0LGUpe3JldHVybiBmdW5jdGlvbigpe2NodCh0aGlzLHQpLmRlbGF5PStlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gQWh0KHQsZSl7cmV0dXJuIGU9K2UsZnVuY3Rpb24oKXtjaHQodGhpcyx0KS5kZWxheT1lfX1mdW5jdGlvbiBraHQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt1aHQodGhpcyx0KS5kdXJhdGlvbj0rZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIExodCh0LGUpe3JldHVybiBlPStlLGZ1bmN0aW9uKCl7dWh0KHRoaXMsdCkuZHVyYXRpb249ZX19ZnVuY3Rpb24gUGh0KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO3JldHVybiBmdW5jdGlvbigpe3VodCh0aGlzLHQpLmVhc2U9ZX19ZnVuY3Rpb24gTmh0KHQsZSxuKXt2YXIgaSxyLG89KGZ1bmN0aW9uIGEodCl7cmV0dXJuKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5ldmVyeSgoZnVuY3Rpb24odCl7dmFyIGU9dC5pbmRleE9mKCIuIik7cmV0dXJuIGU+PTAmJih0PXQuc2xpY2UoMCxlKSksIXR8fCJzdGFydCI9PT10fSkpfSkoZSk/Y2h0OnVodDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1vKHRoaXMsdCkscz1hLm9uO3MhPT1pJiYocj0oaT1zKS5jb3B5KCkpLm9uKGUsbiksYS5vbj1yfX12YXIgSWh0PWVjdC5wcm90b3R5cGUuY29uc3RydWN0b3I7ZnVuY3Rpb24gUmh0KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fWZ1bmN0aW9uIE9odCh0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKGkpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxlLmNhbGwodGhpcyxpKSxuKX19ZnVuY3Rpb24gemh0KHQsZSxuKXt2YXIgaSxyO2Z1bmN0aW9uIG8oKXt2YXIgbz1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbyE9PXImJihpPShyPW8pJiZPaHQodCxvLG4pKSxpfXJldHVybiBvLl92YWx1ZT1lLG99ZnVuY3Rpb24gRGh0KHQpe3JldHVybiBmdW5jdGlvbihlKXt0aGlzLnRleHRDb250ZW50PXQuY2FsbCh0aGlzLGUpfX1mdW5jdGlvbiBCaHQodCl7dmFyIGUsbjtmdW5jdGlvbiBpKCl7dmFyIGk9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGkhPT1uJiYoZT0obj1pKSYmRGh0KGkpKSxlfXJldHVybiBpLl92YWx1ZT10LGl9dmFyIEhodD0wO2Z1bmN0aW9uIEZodCh0LGUsbixpKXt0aGlzLl9ncm91cHM9dCx0aGlzLl9wYXJlbnRzPWUsdGhpcy5fbmFtZT1uLHRoaXMuX2lkPWl9ZnVuY3Rpb24gVmh0KCl7cmV0dXJuKytIaHR9dmFyIFVodD1lY3QucHJvdG90eXBlO0ZodC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkZodCxzZWxlY3Q6ZnVuY3Rpb24gamh0KHQpe3ZhciBlPXRoaXMuX25hbWUsbj10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9dGx0KHQpKTtmb3IodmFyIGk9dGhpcy5fZ3JvdXBzLHI9aS5sZW5ndGgsbz1uZXcgQXJyYXkociksYT0wO2E8cjsrK2EpZm9yKHZhciBzLGwsYz1pW2FdLHU9Yy5sZW5ndGgsaD1vW2FdPW5ldyBBcnJheSh1KSxkPTA7ZDx1OysrZCkocz1jW2RdKSYmKGw9dC5jYWxsKHMscy5fX2RhdGFfXyxkLGMpKSYmKCJfX2RhdGFfXyJpbiBzJiYobC5fX2RhdGFfXz1zLl9fZGF0YV9fKSxoW2RdPWwsbGh0KGhbZF0sZSxuLGQsaCxoaHQocyxuKSkpO3JldHVybiBuZXcgRmh0KG8sdGhpcy5fcGFyZW50cyxlLG4pfSxzZWxlY3RBbGw6ZnVuY3Rpb24gR2h0KHQpe3ZhciBlPXRoaXMuX25hbWUsbj10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9bmx0KHQpKTtmb3IodmFyIGk9dGhpcy5fZ3JvdXBzLHI9aS5sZW5ndGgsbz1bXSxhPVtdLHM9MDtzPHI7KytzKWZvcih2YXIgbCxjPWlbc10sdT1jLmxlbmd0aCxoPTA7aDx1OysraClpZihsPWNbaF0pe2Zvcih2YXIgZCxwPXQuY2FsbChsLGwuX19kYXRhX18saCxjKSxmPWhodChsLG4pLG09MCxnPXAubGVuZ3RoO208ZzsrK20pKGQ9cFttXSkmJmxodChkLGUsbixtLHAsZik7by5wdXNoKHApLGEucHVzaChsKX1yZXR1cm4gbmV3IEZodChvLGEsZSxuKX0sZmlsdGVyOmZ1bmN0aW9uIFdodCh0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9aWx0KHQpKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49ZS5sZW5ndGgsaT1uZXcgQXJyYXkobikscj0wO3I8bjsrK3IpZm9yKHZhciBvLGE9ZVtyXSxzPWEubGVuZ3RoLGw9aVtyXT1bXSxjPTA7YzxzOysrYykobz1hW2NdKSYmdC5jYWxsKG8sby5fX2RhdGFfXyxjLGEpJiZsLnB1c2gobyk7cmV0dXJuIG5ldyBGaHQoaSx0aGlzLl9wYXJlbnRzLHRoaXMuX25hbWUsdGhpcy5faWQpfSxtZXJnZTpmdW5jdGlvbiBxaHQodCl7aWYodC5faWQhPT10aGlzLl9pZCl0aHJvdyBuZXcgRXJyb3I7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPXQuX2dyb3VwcyxpPWUubGVuZ3RoLHI9TWF0aC5taW4oaSxuLmxlbmd0aCksbz1uZXcgQXJyYXkoaSksYT0wO2E8cjsrK2EpZm9yKHZhciBzLGw9ZVthXSxjPW5bYV0sdT1sLmxlbmd0aCxoPW9bYV09bmV3IEFycmF5KHUpLGQ9MDtkPHU7KytkKShzPWxbZF18fGNbZF0pJiYoaFtkXT1zKTtmb3IoO2E8aTsrK2Epb1thXT1lW2FdO3JldHVybiBuZXcgRmh0KG8sdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sc2VsZWN0aW9uOmZ1bmN0aW9uIFlodCgpe3JldHVybiBuZXcgSWh0KHRoaXMuX2dyb3Vwcyx0aGlzLl9wYXJlbnRzKX0sdHJhbnNpdGlvbjpmdW5jdGlvbiBYaHQoKXtmb3IodmFyIHQ9dGhpcy5fbmFtZSxlPXRoaXMuX2lkLG49Vmh0KCksaT10aGlzLl9ncm91cHMscj1pLmxlbmd0aCxvPTA7bzxyOysrbylmb3IodmFyIGEscz1pW29dLGw9cy5sZW5ndGgsYz0wO2M8bDsrK2MpaWYoYT1zW2NdKXt2YXIgdT1oaHQoYSxlKTtsaHQoYSx0LG4sYyxzLHt0aW1lOnUudGltZSt1LmRlbGF5K3UuZHVyYXRpb24sZGVsYXk6MCxkdXJhdGlvbjp1LmR1cmF0aW9uLGVhc2U6dS5lYXNlfSl9cmV0dXJuIG5ldyBGaHQoaSx0aGlzLl9wYXJlbnRzLHQsbil9LGNhbGw6VWh0LmNhbGwsbm9kZXM6VWh0Lm5vZGVzLG5vZGU6VWh0Lm5vZGUsc2l6ZTpVaHQuc2l6ZSxlbXB0eTpVaHQuZW1wdHksZWFjaDpVaHQuZWFjaCxvbjpmdW5jdGlvbiAkaHQodCxlKXt2YXIgbj10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP2hodCh0aGlzLm5vZGUoKSxuKS5vbi5vbih0KTp0aGlzLmVhY2goTmh0KG4sdCxlKSl9LGF0dHI6ZnVuY3Rpb24gS2h0KHQsZSl7dmFyIG49JHN0KHQpLGk9InRyYW5zZm9ybSI9PT1uP0R1dDpnaHQ7cmV0dXJuIHRoaXMuYXR0clR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIGU/KG4ubG9jYWw/d2h0OnhodCkobixpLG1odCh0aGlzLCJhdHRyLiIrdCxlKSk6bnVsbD09ZT8obi5sb2NhbD95aHQ6X2h0KShuKToobi5sb2NhbD9iaHQ6dmh0KShuLGksZSkpfSxhdHRyVHdlZW46ZnVuY3Rpb24gWmh0KHQsZSl7dmFyIG49ImF0dHIuIit0O2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4obj10aGlzLnR3ZWVuKG4pKSYmbi5fdmFsdWU7aWYobnVsbD09ZSlyZXR1cm4gdGhpcy50d2VlbihuLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcjt2YXIgaT0kc3QodCk7cmV0dXJuIHRoaXMudHdlZW4obiwoaS5sb2NhbD9FaHQ6VGh0KShpLGUpKX0sc3R5bGU6ZnVuY3Rpb24gSmh0KHQsZSxuKXt2YXIgaT0idHJhbnNmb3JtIj09KHQrPSIiKT9PdXQ6Z2h0O3JldHVybiBudWxsPT1lP3RoaXMuc3R5bGVUd2Vlbih0LChmdW5jdGlvbiByKHQsZSl7dmFyIG4saSxyO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPXZsdCh0aGlzLHQpLGE9KHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCksdmx0KHRoaXMsdCkpO3JldHVybiBvPT09YT9udWxsOm89PT1uJiZhPT09aT9yOnI9ZShuPW8saT1hKX19KSh0LGkpKS5vbigiZW5kLnN0eWxlLiIrdCxSaHQodCkpOiJmdW5jdGlvbiI9PXR5cGVvZiBlP3RoaXMuc3R5bGVUd2Vlbih0LChmdW5jdGlvbiBhKHQsZSxuKXt2YXIgaSxyLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9dmx0KHRoaXMsdCkscz1uKHRoaXMpLGw9cysiIjtyZXR1cm4gbnVsbD09cyYmKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCksbD1zPXZsdCh0aGlzLHQpKSxhPT09bD9udWxsOmE9PT1pJiZsPT09cj9vOihyPWwsbz1lKGk9YSxzKSl9fSkodCxpLG1odCh0aGlzLCJzdHlsZS4iK3QsZSkpKS5lYWNoKChmdW5jdGlvbiBvKHQsZSl7dmFyIG4saSxyLG8sYT0ic3R5bGUuIitlLHM9ImVuZC4iK2E7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGw9dWh0KHRoaXMsdCksYz1sLm9uLHU9bnVsbD09bC52YWx1ZVthXT9vfHwobz1SaHQoZSkpOnZvaWQgMDtjPT09biYmcj09PXV8fChpPShuPWMpLmNvcHkoKSkub24ocyxyPXUpLGwub249aX19KSh0aGlzLl9pZCx0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsKGZ1bmN0aW9uIHModCxlLG4pe3ZhciBpLHIsbz1uKyIiO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPXZsdCh0aGlzLHQpO3JldHVybiBhPT09bz9udWxsOmE9PT1pP3I6cj1lKGk9YSxuKX19KSh0LGksZSksbikub24oImVuZC5zdHlsZS4iK3QsbnVsbCl9LHN0eWxlVHdlZW46ZnVuY3Rpb24gUWh0KHQsZSxuKXt2YXIgaT0ic3R5bGUuIisodCs9IiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4oaT10aGlzLnR3ZWVuKGkpKSYmaS5fdmFsdWU7aWYobnVsbD09ZSlyZXR1cm4gdGhpcy50d2VlbihpLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy50d2VlbihpLHpodCh0LGUsbnVsbD09bj8iIjpuKSl9LHRleHQ6ZnVuY3Rpb24gdGR0KHQpe3JldHVybiB0aGlzLnR3ZWVuKCJ0ZXh0IiwiZnVuY3Rpb24iPT10eXBlb2YgdD8oZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09ZT8iIjplfX0pKG1odCh0aGlzLCJ0ZXh0Iix0KSk6KGZ1bmN0aW9uIG4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD10fX0pKG51bGw9PXQ/IiI6dCsiIikpfSx0ZXh0VHdlZW46ZnVuY3Rpb24gZWR0KHQpe3ZhciBlPSJ0ZXh0IjtpZihhcmd1bWVudHMubGVuZ3RoPDEpcmV0dXJuKGU9dGhpcy50d2VlbihlKSkmJmUuX3ZhbHVlO2lmKG51bGw9PXQpcmV0dXJuIHRoaXMudHdlZW4oZSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4oZSxCaHQodCkpfSxyZW1vdmU6ZnVuY3Rpb24gbmR0KCl7cmV0dXJuIHRoaXMub24oImVuZC5yZW1vdmUiLChmdW5jdGlvbiB0KGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTtmb3IodmFyIG4gaW4gdGhpcy5fX3RyYW5zaXRpb24paWYoK24hPT1lKXJldHVybjt0JiZ0LnJlbW92ZUNoaWxkKHRoaXMpfX0pKHRoaXMuX2lkKSl9LHR3ZWVuOmZ1bmN0aW9uIGlkdCh0LGUpe3ZhciBuPXRoaXMuX2lkO2lmKHQrPSIiLGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciBpLHI9aGh0KHRoaXMubm9kZSgpLG4pLnR3ZWVuLG89MCxhPXIubGVuZ3RoO288YTsrK28paWYoKGk9cltvXSkubmFtZT09PXQpcmV0dXJuIGkudmFsdWU7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09ZT9waHQ6Zmh0KShuLHQsZSkpfSxkZWxheTpmdW5jdGlvbiByZHQodCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9DaHQ6QWh0KShlLHQpKTpoaHQodGhpcy5ub2RlKCksZSkuZGVsYXl9LGR1cmF0aW9uOmZ1bmN0aW9uIG9kdCh0KXt2YXIgZT10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiB0P2todDpMaHQpKGUsdCkpOmhodCh0aGlzLm5vZGUoKSxlKS5kdXJhdGlvbn0sZWFzZTpmdW5jdGlvbiBhZHQodCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKFBodChlLHQpKTpoaHQodGhpcy5ub2RlKCksZSkuZWFzZX0sZW5kOmZ1bmN0aW9uIHNkdCgpe3ZhciB0LGUsbj10aGlzLGk9bi5faWQscj1uLnNpemUoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG8sYSl7dmFyIHM9e3ZhbHVlOmF9LGw9e3ZhbHVlOmZ1bmN0aW9uKCl7MD09LS1yJiZvKCl9fTtuLmVhY2goKGZ1bmN0aW9uKCl7dmFyIG49dWh0KHRoaXMsaSkscj1uLm9uO3IhPT10JiYoKGU9KHQ9cikuY29weSgpKS5fLmNhbmNlbC5wdXNoKHMpLGUuXy5pbnRlcnJ1cHQucHVzaChzKSxlLl8uZW5kLnB1c2gobCkpLG4ub249ZX0pKX0pKX19O3ZhciBsZHQ9e3RpbWU6bnVsbCxkZWxheTowLGR1cmF0aW9uOjI1MCxlYXNlOlRmfTtmdW5jdGlvbiBjZHQodCxlKXtmb3IodmFyIG47IShuPXQuX190cmFuc2l0aW9uKXx8IShuPW5bZV0pOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm4gbGR0LnRpbWU9SnV0KCksbGR0O3JldHVybiBufWZ1bmN0aW9uIHVkdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gaGR0KHQsZSxuKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1lLHRoaXMudHJhbnNmb3JtPW59ZnVuY3Rpb24gZGR0KHQsZSxuKXt0aGlzLms9dCx0aGlzLng9ZSx0aGlzLnk9bn1lY3QucHJvdG90eXBlLmludGVycnVwdD1mdW5jdGlvbiBwZHQodCl7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXtkaHQodGhpcyx0KX0pKX0sZWN0LnByb3RvdHlwZS50cmFuc2l0aW9uPWZ1bmN0aW9uIGZkdCh0KXt2YXIgZSxuO3QgaW5zdGFuY2VvZiBGaHQ/KGU9dC5faWQsdD10Ll9uYW1lKTooZT1WaHQoKSwobj1sZHQpLnRpbWU9SnV0KCksdD1udWxsPT10P251bGw6dCsiIik7Zm9yKHZhciBpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89MDtvPHI7KytvKWZvcih2YXIgYSxzPWlbb10sbD1zLmxlbmd0aCxjPTA7YzxsOysrYykoYT1zW2NdKSYmbGh0KGEsdCxlLGMscyxufHxjZHQoYSxlKSk7cmV0dXJuIG5ldyBGaHQoaSx0aGlzLl9wYXJlbnRzLHQsZSl9LGRkdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmRkdCxzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQ/dGhpczpuZXcgZGR0KHRoaXMuayp0LHRoaXMueCx0aGlzLnkpfSx0cmFuc2xhdGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gMD09PXQmMD09PWU/dGhpczpuZXcgZGR0KHRoaXMuayx0aGlzLngrdGhpcy5rKnQsdGhpcy55K3RoaXMuayplKX0sYXBwbHk6ZnVuY3Rpb24odCl7cmV0dXJuW3RbMF0qdGhpcy5rK3RoaXMueCx0WzFdKnRoaXMuayt0aGlzLnldfSxhcHBseVg6ZnVuY3Rpb24odCl7cmV0dXJuIHQqdGhpcy5rK3RoaXMueH0sYXBwbHlZOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuayt0aGlzLnl9LGludmVydDpmdW5jdGlvbih0KXtyZXR1cm5bKHRbMF0tdGhpcy54KS90aGlzLmssKHRbMV0tdGhpcy55KS90aGlzLmtdfSxpbnZlcnRYOmZ1bmN0aW9uKHQpe3JldHVybih0LXRoaXMueCkvdGhpcy5rfSxpbnZlcnRZOmZ1bmN0aW9uKHQpe3JldHVybih0LXRoaXMueSkvdGhpcy5rfSxyZXNjYWxlWDpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCkuZG9tYWluKHQucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRYLHRoaXMpLm1hcCh0LmludmVydCx0KSl9LHJlc2NhbGVZOmZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoKS5kb21haW4odC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksdGhpcykubWFwKHQuaW52ZXJ0LHQpKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4idHJhbnNsYXRlKCIrdGhpcy54KyIsIit0aGlzLnkrIikgc2NhbGUoIit0aGlzLmsrIikifX07dmFyIG1kdD1uZXcgZGR0KDEsMCwwKTtmdW5jdGlvbiBnZHQodCl7cmV0dXJuIHQuX196b29tfHxtZHR9ZnVuY3Rpb24gX2R0KCl7R2x0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIHlkdCgpe0dsdC5wcmV2ZW50RGVmYXVsdCgpLEdsdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiB2ZHQoKXtyZXR1cm4hR2x0LmJ1dHRvbn1mdW5jdGlvbiBiZHQoKXt2YXIgdCxlLG49dGhpcztyZXR1cm4gbiBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ/KHQ9KG49bi5vd25lclNWR0VsZW1lbnR8fG4pLndpZHRoLmJhc2VWYWwudmFsdWUsZT1uLmhlaWdodC5iYXNlVmFsLnZhbHVlKToodD1uLmNsaWVudFdpZHRoLGU9bi5jbGllbnRIZWlnaHQpLFtbMCwwXSxbdCxlXV19ZnVuY3Rpb24geGR0KCl7cmV0dXJuIHRoaXMuX196b29tfHxtZHR9ZnVuY3Rpb24gd2R0KCl7cmV0dXJuLUdsdC5kZWx0YVkqKEdsdC5kZWx0YU1vZGU/MTIwOjEpLzUwMH1mdW5jdGlvbiBTZHQoKXtyZXR1cm4ib250b3VjaHN0YXJ0ImluIHRoaXN9ZnVuY3Rpb24gTWR0KHQsZSxuKXt2YXIgaT10LmludmVydFgoZVswXVswXSktblswXVswXSxyPXQuaW52ZXJ0WChlWzFdWzBdKS1uWzFdWzBdLG89dC5pbnZlcnRZKGVbMF1bMV0pLW5bMF1bMV0sYT10LmludmVydFkoZVsxXVsxXSktblsxXVsxXTtyZXR1cm4gdC50cmFuc2xhdGUocj5pPyhpK3IpLzI6TWF0aC5taW4oMCxpKXx8TWF0aC5tYXgoMCxyKSxhPm8/KG8rYSkvMjpNYXRoLm1pbigwLG8pfHxNYXRoLm1heCgwLGEpKX1nZHQucHJvdG90eXBlPWRkdC5wcm90b3R5cGU7dmFyIEVkdD1iZShPYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCx2ZXJzaW9uOiI0LjEzLjAiLGJpc2VjdDpDTyxiaXNlY3RSaWdodDpDTyxiaXNlY3RMZWZ0OkFPLGFzY2VuZGluZzpNTyxiaXNlY3RvcjpFTyxjcm9zczpmdW5jdGlvbiBUZHQodCxlLG4pe3ZhciBpLHIsbyxhLHM9dC5sZW5ndGgsbD1lLmxlbmd0aCxjPW5ldyBBcnJheShzKmwpO2ZvcihudWxsPT1uJiYobj1rTyksaT1vPTA7aTxzOysraSlmb3IoYT10W2ldLHI9MDtyPGw7KytyLCsrbyljW29dPW4oYSxlW3JdKTtyZXR1cm4gY30sZGVzY2VuZGluZzpmdW5jdGlvbiBDZHQodCxlKXtyZXR1cm4gZTx0Py0xOmU+dD8xOmU+PXQ/MDpOYU59LGRldmlhdGlvbjpOTyxleHRlbnQ6SU8saGlzdG9ncmFtOmZ1bmN0aW9uIEFkdCgpe3ZhciB0PUJPLGU9SU8sbj1XTztmdW5jdGlvbiBpKGkpe3ZhciByLG8sYT1pLmxlbmd0aCxzPW5ldyBBcnJheShhKTtmb3Iocj0wO3I8YTsrK3Ipc1tyXT10KGlbcl0scixpKTt2YXIgbD1lKHMpLGM9bFswXSx1PWxbMV0saD1uKHMsYyx1KTtBcnJheS5pc0FycmF5KGgpfHwoaD1HTyhjLHUsaCksaD1ITyhNYXRoLmNlaWwoYy9oKSpoLE1hdGguZmxvb3IodS9oKSpoLGgpKTtmb3IodmFyIGQ9aC5sZW5ndGg7aFswXTw9YzspaC5zaGlmdCgpLC0tZDtmb3IoO2hbZC0xXT51OyloLnBvcCgpLC0tZDt2YXIgcCxmPW5ldyBBcnJheShkKzEpO2ZvcihyPTA7cjw9ZDsrK3IpKHA9ZltyXT1bXSkueDA9cj4wP2hbci0xXTpjLHAueDE9cjxkP2hbcl06dTtmb3Iocj0wO3I8YTsrK3IpYzw9KG89c1tyXSkmJm88PXUmJmZbQ08oaCxvLDAsZCldLnB1c2goaVtyXSk7cmV0dXJuIGZ9cmV0dXJuIGkudmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpETyhlKSxpKTp0fSxpLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkRPKFt0WzBdLHRbMV1dKSxpKTplfSxpLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP0RPKE9PLmNhbGwodCkpOkRPKHQpLGkpOm59LGl9LHRocmVzaG9sZEZyZWVkbWFuRGlhY29uaXM6ZnVuY3Rpb24ga2R0KHQsZSxuKXtyZXR1cm4gdD16Ty5jYWxsKHQsTE8pLnNvcnQoTU8pLE1hdGguY2VpbCgobi1lKS8oMioocU8odCwuNzUpLXFPKHQsLjI1KSkqTWF0aC5wb3codC5sZW5ndGgsLTEvMykpKX0sdGhyZXNob2xkU2NvdHQ6ZnVuY3Rpb24gTGR0KHQsZSxuKXtyZXR1cm4gTWF0aC5jZWlsKChuLWUpLygzLjUqTk8odCkqTWF0aC5wb3codC5sZW5ndGgsLTEvMykpKX0sdGhyZXNob2xkU3R1cmdlczpXTyxtYXg6ZnVuY3Rpb24gUGR0KHQsZSl7dmFyIG4saSxyPXQubGVuZ3RoLG89LTE7aWYobnVsbD09ZSl7Zm9yKDsrK288cjspaWYobnVsbCE9KG49dFtvXSkmJm4+PW4pZm9yKGk9bjsrK288cjspbnVsbCE9KG49dFtvXSkmJm4+aSYmKGk9bil9ZWxzZSBmb3IoOysrbzxyOylpZihudWxsIT0obj1lKHRbb10sbyx0KSkmJm4+PW4pZm9yKGk9bjsrK288cjspbnVsbCE9KG49ZSh0W29dLG8sdCkpJiZuPmkmJihpPW4pO3JldHVybiBpfSxtZWFuOmZ1bmN0aW9uIE5kdCh0LGUpe3ZhciBuLGk9dC5sZW5ndGgscj1pLG89LTEsYT0wO2lmKG51bGw9PWUpZm9yKDsrK288aTspaXNOYU4obj1MTyh0W29dKSk/LS1yOmErPW47ZWxzZSBmb3IoOysrbzxpOylpc05hTihuPUxPKGUodFtvXSxvLHQpKSk/LS1yOmErPW47aWYocilyZXR1cm4gYS9yfSxtZWRpYW46ZnVuY3Rpb24gSWR0KHQsZSl7dmFyIG4saT10Lmxlbmd0aCxyPS0xLG89W107aWYobnVsbD09ZSlmb3IoOysrcjxpOylpc05hTihuPUxPKHRbcl0pKXx8by5wdXNoKG4pO2Vsc2UgZm9yKDsrK3I8aTspaXNOYU4obj1MTyhlKHRbcl0scix0KSkpfHxvLnB1c2gobik7cmV0dXJuIHFPKG8uc29ydChNTyksLjUpfSxtZXJnZTpmdW5jdGlvbiBSZHQodCl7Zm9yKHZhciBlLG4saSxyPXQubGVuZ3RoLG89LTEsYT0wOysrbzxyOylhKz10W29dLmxlbmd0aDtmb3Iobj1uZXcgQXJyYXkoYSk7LS1yPj0wOylmb3IoZT0oaT10W3JdKS5sZW5ndGg7LS1lPj0wOyluWy0tYV09aVtlXTtyZXR1cm4gbn0sbWluOllPLHBhaXJzOmZ1bmN0aW9uIE9kdCh0LGUpe251bGw9PWUmJihlPWtPKTtmb3IodmFyIG49MCxpPXQubGVuZ3RoLTEscj10WzBdLG89bmV3IEFycmF5KGk8MD8wOmkpO248aTspb1tuXT1lKHIscj10Wysrbl0pO3JldHVybiBvfSxwZXJtdXRlOmZ1bmN0aW9uIHpkdCh0LGUpe2Zvcih2YXIgbj1lLmxlbmd0aCxpPW5ldyBBcnJheShuKTtuLS07KWlbbl09dFtlW25dXTtyZXR1cm4gaX0scXVhbnRpbGU6cU8scmFuZ2U6SE8sc2NhbjpmdW5jdGlvbiBEZHQodCxlKXtpZihuPXQubGVuZ3RoKXt2YXIgbixpLHI9MCxvPTAsYT10W29dO2ZvcihudWxsPT1lJiYoZT1NTyk7KytyPG47KShlKGk9dFtyXSxhKTwwfHwwIT09ZShhLGEpKSYmKGE9aSxvPXIpO3JldHVybiAwPT09ZShhLGEpP286dm9pZCAwfX0sc2h1ZmZsZTpmdW5jdGlvbiBCZHQodCxlLG4pe2Zvcih2YXIgaSxyLG89KG51bGw9PW4/dC5sZW5ndGg6biktKGU9bnVsbD09ZT8wOitlKTtvOylyPU1hdGgucmFuZG9tKCkqby0tfDAsaT10W28rZV0sdFtvK2VdPXRbcitlXSx0W3IrZV09aTtyZXR1cm4gdH0sc3VtOmZ1bmN0aW9uIEhkdCh0LGUpe3ZhciBuLGk9dC5sZW5ndGgscj0tMSxvPTA7aWYobnVsbD09ZSlmb3IoOysrcjxpOykobj0rdFtyXSkmJihvKz1uKTtlbHNlIGZvcig7KytyPGk7KShuPStlKHRbcl0scix0KSkmJihvKz1uKTtyZXR1cm4gb30sdGlja3M6ZnVuY3Rpb24gRmR0KHQsZSxuKXt2YXIgaSxyLG8sYSxzPS0xO2lmKG49K24sKHQ9K3QpPT0oZT0rZSkmJm4+MClyZXR1cm5bdF07aWYoKGk9ZTx0KSYmKHI9dCx0PWUsZT1yKSwwPT09KGE9ak8odCxlLG4pKXx8IWlzRmluaXRlKGEpKXJldHVybltdO2lmKGE+MClmb3IodD1NYXRoLmNlaWwodC9hKSxlPU1hdGguZmxvb3IoZS9hKSxvPW5ldyBBcnJheShyPU1hdGguY2VpbChlLXQrMSkpOysrczxyOylvW3NdPSh0K3MpKmE7ZWxzZSBmb3IodD1NYXRoLmZsb29yKHQqYSksZT1NYXRoLmNlaWwoZSphKSxvPW5ldyBBcnJheShyPU1hdGguY2VpbCh0LWUrMSkpOysrczxyOylvW3NdPSh0LXMpL2E7cmV0dXJuIGkmJm8ucmV2ZXJzZSgpLG99LHRpY2tJbmNyZW1lbnQ6ak8sdGlja1N0ZXA6R08sdHJhbnNwb3NlOlhPLHZhcmlhbmNlOlBPLHppcDpmdW5jdGlvbiBWZHQoKXtyZXR1cm4gWE8oYXJndW1lbnRzKX0sYXhpc1RvcDpmdW5jdGlvbiBVZHQodCl7cmV0dXJuIHJ6KDEsdCl9LGF4aXNSaWdodDpmdW5jdGlvbiBqZHQodCl7cmV0dXJuIHJ6KDIsdCl9LGF4aXNCb3R0b206ZnVuY3Rpb24gR2R0KHQpe3JldHVybiByeigzLHQpfSxheGlzTGVmdDpmdW5jdGlvbiBXZHQodCl7cmV0dXJuIHJ6KDQsdCl9LGJydXNoOmZ1bmN0aW9uIHFkdCgpe3JldHVybiBLRihIRil9LGJydXNoWDpmdW5jdGlvbiBZZHQoKXtyZXR1cm4gS0YoREYpfSxicnVzaFk6ZnVuY3Rpb24gWGR0KCl7cmV0dXJuIEtGKEJGKX0sYnJ1c2hTZWxlY3Rpb246ZnVuY3Rpb24gJGR0KHQpe3ZhciBlPXQuX19icnVzaDtyZXR1cm4gZT9lLmRpbS5vdXRwdXQoZS5zZWxlY3Rpb24pOm51bGx9LGNob3JkOmZ1bmN0aW9uIEtkdCgpe3ZhciB0PTAsZT1udWxsLG49bnVsbCxpPW51bGw7ZnVuY3Rpb24gcihyKXt2YXIgbyxhLHMsbCxjLHUsaD1yLmxlbmd0aCxkPVtdLHA9SkYoaCksZj1bXSxtPVtdLGc9bS5ncm91cHM9bmV3IEFycmF5KGgpLF89bmV3IEFycmF5KGgqaCk7Zm9yKG89MCxjPS0xOysrYzxoOyl7Zm9yKGE9MCx1PS0xOysrdTxoOylhKz1yW2NdW3VdO2QucHVzaChhKSxmLnB1c2goSkYoaCkpLG8rPWF9Zm9yKGUmJnAuc29ydCgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZShkW3RdLGRbbl0pfSkpLG4mJmYuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt0LnNvcnQoKGZ1bmN0aW9uKHQsaSl7cmV0dXJuIG4ocltlXVt0XSxyW2VdW2ldKX0pKX0pKSxsPShvPW9WKDAsclYtdCpoKS9vKT90OnJWL2gsYT0wLGM9LTE7KytjPGg7KXtmb3Iocz1hLHU9LTE7Kyt1PGg7KXt2YXIgeT1wW2NdLHY9Zlt5XVt1XSxiPXJbeV1bdl0seD1hLHc9YSs9YipvO19bdipoK3ldPXtpbmRleDp5LHN1YmluZGV4OnYsc3RhcnRBbmdsZTp4LGVuZEFuZ2xlOncsdmFsdWU6Yn19Z1t5XT17aW5kZXg6eSxzdGFydEFuZ2xlOnMsZW5kQW5nbGU6YSx2YWx1ZTpkW3ldfSxhKz1sfWZvcihjPS0xOysrYzxoOylmb3IodT1jLTE7Kyt1PGg7KXt2YXIgUz1fW3UqaCtjXSxNPV9bYypoK3VdOyhTLnZhbHVlfHxNLnZhbHVlKSYmbS5wdXNoKFMudmFsdWU8TS52YWx1ZT97c291cmNlOk0sdGFyZ2V0OlN9Ontzb3VyY2U6Uyx0YXJnZXQ6TX0pfXJldHVybiBpP20uc29ydChpKTptfXJldHVybiByLnBhZEFuZ2xlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW9WKDAsZSkscik6dH0sci5zb3J0R3JvdXBzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQscik6ZX0sci5zb3J0U3ViZ3JvdXBzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQscik6bn0sci5zb3J0Q2hvcmRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P2k9bnVsbDooaT1hVih0KSkuXz10LHIpOmkmJmkuX30scn0scmliYm9uOmZ1bmN0aW9uIFpkdCgpe3ZhciB0PW1WLGU9Z1Ysbj1fVixpPXlWLHI9dlYsbz1udWxsO2Z1bmN0aW9uIGEoKXt2YXIgYSxzPXNWLmNhbGwoYXJndW1lbnRzKSxsPXQuYXBwbHkodGhpcyxzKSxjPWUuYXBwbHkodGhpcyxzKSx1PStuLmFwcGx5KHRoaXMsKHNbMF09bCxzKSksaD1pLmFwcGx5KHRoaXMscyktaVYsZD1yLmFwcGx5KHRoaXMscyktaVYscD11KnRWKGgpLGY9dSplVihoKSxtPStuLmFwcGx5KHRoaXMsKHNbMF09YyxzKSksZz1pLmFwcGx5KHRoaXMscyktaVYsXz1yLmFwcGx5KHRoaXMscyktaVY7aWYob3x8KG89YT1mVigpKSxvLm1vdmVUbyhwLGYpLG8uYXJjKDAsMCx1LGgsZCksaD09PWcmJmQ9PT1ffHwoby5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCxtKnRWKGcpLG0qZVYoZykpLG8uYXJjKDAsMCxtLGcsXykpLG8ucXVhZHJhdGljQ3VydmVUbygwLDAscCxmKSxvLmNsb3NlUGF0aCgpLGEpcmV0dXJuIG89bnVsbCxhKyIifHxudWxsfXJldHVybiBhLnJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmxWKCt0KSxhKTpufSxhLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpsVigrdCksYSk6aX0sYS5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmxWKCt0KSxhKTpyfSxhLnNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLGEpOnR9LGEudGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsYSk6ZX0sYS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW51bGw9PXQ/bnVsbDp0LGEpOm99LGF9LG5lc3Q6ZnVuY3Rpb24gSmR0KCl7dmFyIHQsZSxuLGk9W10scj1bXTtmdW5jdGlvbiBvKG4scixhLHMpe2lmKHI+PWkubGVuZ3RoKXJldHVybiBudWxsIT10JiZuLnNvcnQodCksbnVsbCE9ZT9lKG4pOm47Zm9yKHZhciBsLGMsdSxoPS0xLGQ9bi5sZW5ndGgscD1pW3IrK10sZj13VigpLG09YSgpOysraDxkOykodT1mLmdldChsPXAoYz1uW2hdKSsiIikpP3UucHVzaChjKTpmLnNldChsLFtjXSk7cmV0dXJuIGYuZWFjaCgoZnVuY3Rpb24odCxlKXtzKG0sZSxvKHQscixhLHMpKX0pKSxtfWZ1bmN0aW9uIGEodCxuKXtpZigrK24+aS5sZW5ndGgpcmV0dXJuIHQ7dmFyIG8scz1yW24tMV07cmV0dXJuIG51bGwhPWUmJm4+PWkubGVuZ3RoP289dC5lbnRyaWVzKCk6KG89W10sdC5lYWNoKChmdW5jdGlvbih0LGUpe28ucHVzaCh7a2V5OmUsdmFsdWVzOmEodCxuKX0pfSkpKSxudWxsIT1zP28uc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gcyh0LmtleSxlLmtleSl9KSk6b31yZXR1cm4gbj17b2JqZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBvKHQsMCxTVixNVil9LG1hcDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LDAsRVYsVFYpfSxlbnRyaWVzOmZ1bmN0aW9uKHQpe3JldHVybiBhKG8odCwwLEVWLFRWKSwwKX0sa2V5OmZ1bmN0aW9uKHQpe3JldHVybiBpLnB1c2godCksbn0sc29ydEtleXM6ZnVuY3Rpb24odCl7cmV0dXJuIHJbaS5sZW5ndGgtMV09dCxufSxzb3J0VmFsdWVzOmZ1bmN0aW9uKGUpe3JldHVybiB0PWUsbn0scm9sbHVwOmZ1bmN0aW9uKHQpe3JldHVybiBlPXQsbn19fSxzZXQ6a1YsbWFwOndWLGtleXM6ZnVuY3Rpb24gUWR0KHQpe3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KWUucHVzaChuKTtyZXR1cm4gZX0sdmFsdWVzOmZ1bmN0aW9uIHRwdCh0KXt2YXIgZT1bXTtmb3IodmFyIG4gaW4gdCllLnB1c2godFtuXSk7cmV0dXJuIGV9LGVudHJpZXM6ZnVuY3Rpb24gZXB0KHQpe3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KWUucHVzaCh7a2V5Om4sdmFsdWU6dFtuXX0pO3JldHVybiBlfSxjb2xvcjpZVixyZ2I6WlYsaHNsOmVVLGxhYjpkVSxoY2w6dlUsY3ViZWhlbGl4OkVVLGRpc3BhdGNoOkFVLGRyYWc6ZnVuY3Rpb24gbnB0KCl7dmFyIHQsZSxuLGkscj1pRyxvPXJHLGE9b0cscz1hRyxsPXt9LGM9UlUoInN0YXJ0IiwiZHJhZyIsImVuZCIpLHU9MCxoPTA7ZnVuY3Rpb24gZCh0KXt0Lm9uKCJtb3VzZWRvd24uZHJhZyIscCkuZmlsdGVyKHMpLm9uKCJ0b3VjaHN0YXJ0LmRyYWciLGcpLm9uKCJ0b3VjaG1vdmUuZHJhZyIsXykub24oInRvdWNoZW5kLmRyYWcgdG91Y2hjYW5jZWwuZHJhZyIseSkuc3R5bGUoInRvdWNoLWFjdGlvbiIsIm5vbmUiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpfWZ1bmN0aW9uIHAoKXtpZighaSYmci5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBhPXYoIm1vdXNlIixvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwkaix0aGlzLGFyZ3VtZW50cyk7YSYmKHFqKFJqLnZpZXcpLm9uKCJtb3VzZW1vdmUuZHJhZyIsZiwhMCkub24oIm1vdXNldXAuZHJhZyIsbSwhMCksUWooUmoudmlldyksWmooKSxuPSExLHQ9UmouY2xpZW50WCxlPVJqLmNsaWVudFksYSgic3RhcnQiKSl9fWZ1bmN0aW9uIGYoKXtpZihKaigpLCFuKXt2YXIgaT1Sai5jbGllbnRYLXQscj1Sai5jbGllbnRZLWU7bj1pKmkrcipyPmh9bC5tb3VzZSgiZHJhZyIpfWZ1bmN0aW9uIG0oKXtxaihSai52aWV3KS5vbigibW91c2Vtb3ZlLmRyYWcgbW91c2V1cC5kcmFnIixudWxsKSx0RyhSai52aWV3LG4pLEpqKCksbC5tb3VzZSgiZW5kIil9ZnVuY3Rpb24gZygpe2lmKHIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdCxlLG49UmouY2hhbmdlZFRvdWNoZXMsaT1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhPW4ubGVuZ3RoO2Zvcih0PTA7dDxhOysrdCkoZT12KG5bdF0uaWRlbnRpZmllcixpLEtqLHRoaXMsYXJndW1lbnRzKSkmJihaaigpLGUoInN0YXJ0IikpfX1mdW5jdGlvbiBfKCl7dmFyIHQsZSxuPVJqLmNoYW5nZWRUb3VjaGVzLGk9bi5sZW5ndGg7Zm9yKHQ9MDt0PGk7Kyt0KShlPWxbblt0XS5pZGVudGlmaWVyXSkmJihKaigpLGUoImRyYWciKSl9ZnVuY3Rpb24geSgpe3ZhciB0LGUsbj1Sai5jaGFuZ2VkVG91Y2hlcyxyPW4ubGVuZ3RoO2ZvcihpJiZjbGVhclRpbWVvdXQoaSksaT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2k9bnVsbH0pLDUwMCksdD0wO3Q8cjsrK3QpKGU9bFtuW3RdLmlkZW50aWZpZXJdKSYmKFpqKCksZSgiZW5kIikpfWZ1bmN0aW9uIHYodCxlLG4saSxyKXt2YXIgbyxzLGgscD1uKGUsdCksZj1jLmNvcHkoKTtpZihGaihuZXcgbkcoZCwiYmVmb3Jlc3RhcnQiLG8sdCx1LHBbMF0scFsxXSwwLDAsZiksKGZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPShSai5zdWJqZWN0PW89YS5hcHBseShpLHIpKSYmKHM9by54LXBbMF18fDAsaD1vLnktcFsxXXx8MCwhMCl9KSkpcmV0dXJuIGZ1bmN0aW9uIGEoYyl7dmFyIG0sZz1wO3N3aXRjaChjKXtjYXNlInN0YXJ0IjpsW3RdPWEsbT11Kys7YnJlYWs7Y2FzZSJlbmQiOmRlbGV0ZSBsW3RdLC0tdTtjYXNlImRyYWciOnA9bihlLHQpLG09dX1GaihuZXcgbkcoZCxjLG8sdCxtLHBbMF0rcyxwWzFdK2gscFswXS1nWzBdLHBbMV0tZ1sxXSxmKSxmLmFwcGx5LGYsW2MsaSxyXSl9fXJldHVybiBkLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmVHKCEhdCksZCk6cn0sZC5jb250YWluZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDplRyh0KSxkKTpvfSxkLnN1YmplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDplRyh0KSxkKTphfSxkLnRvdWNoYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmVHKCEhdCksZCk6c30sZC5vbj1mdW5jdGlvbigpe3ZhciB0PWMub24uYXBwbHkoYyxhcmd1bWVudHMpO3JldHVybiB0PT09Yz9kOnR9LGQuY2xpY2tEaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0odD0rdCkqdCxkKTpNYXRoLnNxcnQoaCl9LGR9LGRyYWdEaXNhYmxlOlFqLGRyYWdFbmFibGU6dEcsZHN2Rm9ybWF0OlZHLGNzdlBhcnNlOmpHLGNzdlBhcnNlUm93czpHRyxjc3ZGb3JtYXQ6V0csY3N2Rm9ybWF0Um93czpxRyx0c3ZQYXJzZTpYRyx0c3ZQYXJzZVJvd3M6JEcsdHN2Rm9ybWF0OktHLHRzdkZvcm1hdFJvd3M6WkcsZWFzZUxpbmVhcjpmdW5jdGlvbiBpcHQodCl7cmV0dXJuK3R9LGVhc2VRdWFkOkpHLGVhc2VRdWFkSW46ZnVuY3Rpb24gcnB0KHQpe3JldHVybiB0KnR9LGVhc2VRdWFkT3V0OmZ1bmN0aW9uIG9wdCh0KXtyZXR1cm4gdCooMi10KX0sZWFzZVF1YWRJbk91dDpKRyxlYXNlQ3ViaWM6UUcsZWFzZUN1YmljSW46ZnVuY3Rpb24gYXB0KHQpe3JldHVybiB0KnQqdH0sZWFzZUN1YmljT3V0OmZ1bmN0aW9uIHNwdCh0KXtyZXR1cm4tLXQqdCp0KzF9LGVhc2VDdWJpY0luT3V0OlFHLGVhc2VQb2x5Om5XLGVhc2VQb2x5SW46dFcsZWFzZVBvbHlPdXQ6ZVcsZWFzZVBvbHlJbk91dDpuVyxlYXNlU2luOm9XLGVhc2VTaW5JbjpmdW5jdGlvbiBscHQodCl7cmV0dXJuIDEtTWF0aC5jb3ModCpyVyl9LGVhc2VTaW5PdXQ6ZnVuY3Rpb24gY3B0KHQpe3JldHVybiBNYXRoLnNpbih0KnJXKX0sZWFzZVNpbkluT3V0Om9XLGVhc2VFeHA6YVcsZWFzZUV4cEluOmZ1bmN0aW9uIHVwdCh0KXtyZXR1cm4gTWF0aC5wb3coMiwxMCp0LTEwKX0sZWFzZUV4cE91dDpmdW5jdGlvbiBocHQodCl7cmV0dXJuIDEtTWF0aC5wb3coMiwtMTAqdCl9LGVhc2VFeHBJbk91dDphVyxlYXNlQ2lyY2xlOnNXLGVhc2VDaXJjbGVJbjpmdW5jdGlvbiBkcHQodCl7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtdCp0KX0sZWFzZUNpcmNsZU91dDpmdW5jdGlvbiBwcHQodCl7cmV0dXJuIE1hdGguc3FydCgxLSAtLXQqdCl9LGVhc2VDaXJjbGVJbk91dDpzVyxlYXNlQm91bmNlOmNXLGVhc2VCb3VuY2VJbjpmdW5jdGlvbiBmcHQodCl7cmV0dXJuIDEtY1coMS10KX0sZWFzZUJvdW5jZU91dDpjVyxlYXNlQm91bmNlSW5PdXQ6ZnVuY3Rpb24gbXB0KHQpe3JldHVybigodCo9Mik8PTE/MS1jVygxLXQpOmNXKHQtMSkrMSkvMn0sZWFzZUJhY2s6cFcsZWFzZUJhY2tJbjpoVyxlYXNlQmFja091dDpkVyxlYXNlQmFja0luT3V0OnBXLGVhc2VFbGFzdGljOmdXLGVhc2VFbGFzdGljSW46bVcsZWFzZUVsYXN0aWNPdXQ6Z1csZWFzZUVsYXN0aWNJbk91dDpfVyxmb3JjZUNlbnRlcjpmdW5jdGlvbiBncHQodCxlKXt2YXIgbjtmdW5jdGlvbiBpKCl7dmFyIGkscixvPW4ubGVuZ3RoLGE9MCxzPTA7Zm9yKGk9MDtpPG87KytpKWErPShyPW5baV0pLngscys9ci55O2ZvcihhPWEvby10LHM9cy9vLWUsaT0wO2k8bzsrK2kpKHI9bltpXSkueC09YSxyLnktPXN9cmV0dXJuIG51bGw9PXQmJih0PTApLG51bGw9PWUmJihlPTApLGkuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtuPXR9LGkueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rZSxpKTp0fSxpLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3QsaSk6ZX0saX0sZm9yY2VDb2xsaWRlOmZ1bmN0aW9uIF9wdCh0KXt2YXIgZSxuLGk9MSxyPTE7ZnVuY3Rpb24gbygpe2Zvcih2YXIgdCxvLHMsbCxjLHUsaCxkPWUubGVuZ3RoLHA9MDtwPHI7KytwKWZvcihvPU1XKGUsQVcsa1cpLnZpc2l0QWZ0ZXIoYSksdD0wO3Q8ZDsrK3QpaD0odT1uWyhzPWVbdF0pLmluZGV4XSkqdSxsPXMueCtzLnZ4LGM9cy55K3Mudnksby52aXNpdChmKTtmdW5jdGlvbiBmKHQsZSxuLHIsbyl7dmFyIGE9dC5kYXRhLGQ9dC5yLHA9dStkO2lmKCFhKXJldHVybiBlPmwrcHx8cjxsLXB8fG4+YytwfHxvPGMtcDtpZihhLmluZGV4PnMuaW5kZXgpe3ZhciBmPWwtYS54LWEudngsbT1jLWEueS1hLnZ5LGc9ZipmK20qbTtnPHAqcCYmKDA9PT1mJiYoZys9KGY9dlcoKSkqZiksMD09PW0mJihnKz0obT12VygpKSptKSxnPShwLShnPU1hdGguc3FydChnKSkpL2cqaSxzLnZ4Kz0oZio9ZykqKHA9KGQqPWQpLyhoK2QpKSxzLnZ5Kz0obSo9ZykqcCxhLnZ4LT1mKihwPTEtcCksYS52eS09bSpwKX19fWZ1bmN0aW9uIGEodCl7aWYodC5kYXRhKXJldHVybiB0LnI9blt0LmRhdGEuaW5kZXhdO2Zvcih2YXIgZT10LnI9MDtlPDQ7KytlKXRbZV0mJnRbZV0ucj50LnImJih0LnI9dFtlXS5yKX1mdW5jdGlvbiBzKCl7aWYoZSl7dmFyIGkscixvPWUubGVuZ3RoO2ZvcihuPW5ldyBBcnJheShvKSxpPTA7aTxvOysraSluWyhyPWVbaV0pLmluZGV4XT0rdChyLGksZSl9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD15VyhudWxsPT10PzE6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7ZT10LHMoKX0sby5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0LG8pOnJ9LG8uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3Qsbyk6aX0sby5yYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTp5VygrZSkscygpLG8pOnR9LG99LGZvcmNlTGluazpmdW5jdGlvbiB5cHQodCl7dmFyIGUsbixpLHIsbyxhPSRXLHM9ZnVuY3Rpb24gbCh0KXtyZXR1cm4gMS9NYXRoLm1pbihyW3Quc291cmNlLmluZGV4XSxyW3QudGFyZ2V0LmluZGV4XSl9LGM9eVcoMzApLHU9MTtmdW5jdGlvbiBoKGkpe2Zvcih2YXIgcj0wLGE9dC5sZW5ndGg7cjx1Oysrcilmb3IodmFyIHMsbCxjLGgsZCxwLGYsbT0wO208YTsrK20paD0oYz0ocz10W21dKS50YXJnZXQpLngrYy52eC0obD1zLnNvdXJjZSkueC1sLnZ4fHx2VygpLGQ9Yy55K2MudnktbC55LWwudnl8fHZXKCksZCo9cD0oKHA9TWF0aC5zcXJ0KGgqaCtkKmQpKS1uW21dKS9wKmkqZVttXSxjLnZ4LT0oaCo9cCkqKGY9b1ttXSksYy52eS09ZCpmLGwudngrPWgqKGY9MS1mKSxsLnZ5Kz1kKmZ9ZnVuY3Rpb24gZCgpe2lmKGkpe3ZhciBzLGwsYz1pLmxlbmd0aCx1PXQubGVuZ3RoLGg9cVcoaSxhKTtmb3Iocz0wLHI9bmV3IEFycmF5KGMpO3M8dTsrK3MpKGw9dFtzXSkuaW5kZXg9cywib2JqZWN0IiE9dHlwZW9mIGwuc291cmNlJiYobC5zb3VyY2U9S1coaCxsLnNvdXJjZSkpLCJvYmplY3QiIT10eXBlb2YgbC50YXJnZXQmJihsLnRhcmdldD1LVyhoLGwudGFyZ2V0KSkscltsLnNvdXJjZS5pbmRleF09KHJbbC5zb3VyY2UuaW5kZXhdfHwwKSsxLHJbbC50YXJnZXQuaW5kZXhdPShyW2wudGFyZ2V0LmluZGV4XXx8MCkrMTtmb3Iocz0wLG89bmV3IEFycmF5KHUpO3M8dTsrK3Mpb1tzXT1yWyhsPXRbc10pLnNvdXJjZS5pbmRleF0vKHJbbC5zb3VyY2UuaW5kZXhdK3JbbC50YXJnZXQuaW5kZXhdKTtlPW5ldyBBcnJheSh1KSxwKCksbj1uZXcgQXJyYXkodSksZigpfX1mdW5jdGlvbiBwKCl7aWYoaSlmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjsrK24pZVtuXT0rcyh0W25dLG4sdCl9ZnVuY3Rpb24gZigpe2lmKGkpZm9yKHZhciBlPTAscj10Lmxlbmd0aDtlPHI7KytlKW5bZV09K2ModFtlXSxlLHQpfXJldHVybiBudWxsPT10JiYodD1bXSksaC5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2k9dCxkKCl9LGgubGlua3M9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxkKCksaCk6dH0saC5pZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT10LGgpOmF9LGguaXRlcmF0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0rdCxoKTp1fSxoLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eVcoK3QpLHAoKSxoKTpzfSxoLmRpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eVcoK3QpLGYoKSxoKTpjfSxofSxmb3JjZU1hbnlCb2R5OmZ1bmN0aW9uIHZwdCgpe3ZhciB0LGUsbixpLHI9eVcoLTMwKSxvPTEsYT0xLzAscz0uODE7ZnVuY3Rpb24gbChpKXt2YXIgcixvPXQubGVuZ3RoLGE9TVcodCxicSx4cSkudmlzaXRBZnRlcih1KTtmb3Iobj1pLHI9MDtyPG87KytyKWU9dFtyXSxhLnZpc2l0KGgpfWZ1bmN0aW9uIGMoKXtpZih0KXt2YXIgZSxuLG89dC5sZW5ndGg7Zm9yKGk9bmV3IEFycmF5KG8pLGU9MDtlPG87KytlKWlbKG49dFtlXSkuaW5kZXhdPStyKG4sZSx0KX19ZnVuY3Rpb24gdSh0KXt2YXIgZSxuLHIsbyxhLHM9MCxsPTA7aWYodC5sZW5ndGgpe2ZvcihyPW89YT0wO2E8NDsrK2EpKGU9dFthXSkmJihuPU1hdGguYWJzKGUudmFsdWUpKSYmKHMrPWUudmFsdWUsbCs9bixyKz1uKmUueCxvKz1uKmUueSk7dC54PXIvbCx0Lnk9by9sfWVsc2V7KGU9dCkueD1lLmRhdGEueCxlLnk9ZS5kYXRhLnk7ZG97cys9aVtlLmRhdGEuaW5kZXhdfXdoaWxlKGU9ZS5uZXh0KX10LnZhbHVlPXN9ZnVuY3Rpb24gaCh0LHIsbCxjKXtpZighdC52YWx1ZSlyZXR1cm4hMDt2YXIgdT10LngtZS54LGg9dC55LWUueSxkPWMtcixwPXUqdStoKmg7aWYoZCpkL3M8cClyZXR1cm4gcDxhJiYoMD09PXUmJihwKz0odT12VygpKSp1KSwwPT09aCYmKHArPShoPXZXKCkpKmgpLHA8byYmKHA9TWF0aC5zcXJ0KG8qcCkpLGUudngrPXUqdC52YWx1ZSpuL3AsZS52eSs9aCp0LnZhbHVlKm4vcCksITA7aWYoISh0Lmxlbmd0aHx8cD49YSkpeyh0LmRhdGEhPT1lfHx0Lm5leHQpJiYoMD09PXUmJihwKz0odT12VygpKSp1KSwwPT09aCYmKHArPShoPXZXKCkpKmgpLHA8byYmKHA9TWF0aC5zcXJ0KG8qcCkpKTtkb3t0LmRhdGEhPT1lJiYoZS52eCs9dSooZD1pW3QuZGF0YS5pbmRleF0qbi9wKSxlLnZ5Kz1oKmQpfXdoaWxlKHQ9dC5uZXh0KX19cmV0dXJuIGwuaW5pdGlhbGl6ZT1mdW5jdGlvbihlKXt0PWUsYygpfSxsLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eVcoK3QpLGMoKSxsKTpyfSxsLmRpc3RhbmNlTWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQqdCxsKTpNYXRoLnNxcnQobyl9LGwuZGlzdGFuY2VNYXg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCp0LGwpOk1hdGguc3FydChhKX0sbC50aGV0YT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz10KnQsbCk6TWF0aC5zcXJ0KHMpfSxsfSxmb3JjZVJhZGlhbDpmdW5jdGlvbiBicHQodCxlLG4pe3ZhciBpLHIsbyxhPXlXKC4xKTtmdW5jdGlvbiBzKHQpe2Zvcih2YXIgYT0wLHM9aS5sZW5ndGg7YTxzOysrYSl7dmFyIGw9aVthXSxjPWwueC1lfHwxZS02LHU9bC55LW58fDFlLTYsaD1NYXRoLnNxcnQoYypjK3UqdSksZD0ob1thXS1oKSpyW2FdKnQvaDtsLnZ4Kz1jKmQsbC52eSs9dSpkfX1mdW5jdGlvbiBsKCl7aWYoaSl7dmFyIGUsbj1pLmxlbmd0aDtmb3Iocj1uZXcgQXJyYXkobiksbz1uZXcgQXJyYXkobiksZT0wO2U8bjsrK2Upb1tlXT0rdChpW2VdLGUsaSkscltlXT1pc05hTihvW2VdKT8wOithKGlbZV0sZSxpKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXlXKCt0KSksbnVsbD09ZSYmKGU9MCksbnVsbD09biYmKG49MCkscy5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2k9dCxsKCl9LHMuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5VygrdCksbCgpLHMpOmF9LHMucmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6eVcoK2UpLGwoKSxzKTp0fSxzLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3Qscyk6ZX0scy55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0LHMpOm59LHN9LGZvcmNlU2ltdWxhdGlvbjpmdW5jdGlvbiB4cHQodCl7dmFyIGUsbj0xLGk9LjAwMSxyPTEtTWF0aC5wb3coaSwxLzMwMCksbz0wLGE9LjYscz1xVygpLGw9Z3EodSksYz1KVygidGljayIsImVuZCIpO2Z1bmN0aW9uIHUoKXtoKCksYy5jYWxsKCJ0aWNrIixlKSxuPGkmJihsLnN0b3AoKSxjLmNhbGwoImVuZCIsZSkpfWZ1bmN0aW9uIGgoKXt2YXIgZSxpLGw9dC5sZW5ndGg7Zm9yKG4rPShvLW4pKnIscy5lYWNoKChmdW5jdGlvbih0KXt0KG4pfSkpLGU9MDtlPGw7KytlKW51bGw9PShpPXRbZV0pLmZ4P2kueCs9aS52eCo9YTooaS54PWkuZngsaS52eD0wKSxudWxsPT1pLmZ5P2kueSs9aS52eSo9YTooaS55PWkuZnksaS52eT0wKX1mdW5jdGlvbiBkKCl7Zm9yKHZhciBlLG49MCxpPXQubGVuZ3RoO248aTsrK24pe2lmKChlPXRbbl0pLmluZGV4PW4saXNOYU4oZS54KXx8aXNOYU4oZS55KSl7dmFyIHI9MTAqTWF0aC5zcXJ0KG4pLG89bipTcTtlLng9cipNYXRoLmNvcyhvKSxlLnk9cipNYXRoLnNpbihvKX0oaXNOYU4oZS52eCl8fGlzTmFOKGUudnkpKSYmKGUudng9ZS52eT0wKX19ZnVuY3Rpb24gcChlKXtyZXR1cm4gZS5pbml0aWFsaXplJiZlLmluaXRpYWxpemUodCksZX1yZXR1cm4gbnVsbD09dCYmKHQ9W10pLGQoKSxlPXt0aWNrOmgscmVzdGFydDpmdW5jdGlvbigpe3JldHVybiBsLnJlc3RhcnQodSksZX0sc3RvcDpmdW5jdGlvbigpe3JldHVybiBsLnN0b3AoKSxlfSxub2RlczpmdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGQoKSxzLmVhY2gocCksZSk6dH0sYWxwaGE6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3QsZSk6bn0sYWxwaGFNaW46ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3QsZSk6aX0sYWxwaGFEZWNheTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxlKTorcn0sYWxwaGFUYXJnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3QsZSk6b30sdmVsb2NpdHlEZWNheTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0xLXQsZSk6MS1hfSxmb3JjZTpmdW5jdGlvbih0LG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/KG51bGw9PW4/cy5yZW1vdmUodCk6cy5zZXQodCxwKG4pKSxlKTpzLmdldCh0KX0sZmluZDpmdW5jdGlvbihlLG4saSl7dmFyIHIsbyxhLHMsbCxjPTAsdT10Lmxlbmd0aDtmb3IobnVsbD09aT9pPTEvMDppKj1pLGM9MDtjPHU7KytjKShhPShyPWUtKHM9dFtjXSkueCkqcisobz1uLXMueSkqbyk8aSYmKGw9cyxpPWEpO3JldHVybiBsfSxvbjpmdW5jdGlvbih0LG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/KGMub24odCxuKSxlKTpjLm9uKHQpfX19LGZvcmNlWDpmdW5jdGlvbiB3cHQodCl7dmFyIGUsbixpLHI9eVcoLjEpO2Z1bmN0aW9uIG8odCl7Zm9yKHZhciByLG89MCxhPWUubGVuZ3RoO288YTsrK28pKHI9ZVtvXSkudngrPShpW29dLXIueCkqbltvXSp0fWZ1bmN0aW9uIGEoKXtpZihlKXt2YXIgbyxhPWUubGVuZ3RoO2ZvcihuPW5ldyBBcnJheShhKSxpPW5ldyBBcnJheShhKSxvPTA7bzxhOysrbyluW29dPWlzTmFOKGlbb109K3QoZVtvXSxvLGUpKT8wOityKGVbb10sbyxlKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXlXKG51bGw9PXQ/MDordCkpLG8uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtlPXQsYSgpfSxvLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eVcoK3QpLGEoKSxvKTpyfSxvLng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTp5VygrZSksYSgpLG8pOnR9LG99LGZvcmNlWTpmdW5jdGlvbiBTcHQodCl7dmFyIGUsbixpLHI9eVcoLjEpO2Z1bmN0aW9uIG8odCl7Zm9yKHZhciByLG89MCxhPWUubGVuZ3RoO288YTsrK28pKHI9ZVtvXSkudnkrPShpW29dLXIueSkqbltvXSp0fWZ1bmN0aW9uIGEoKXtpZihlKXt2YXIgbyxhPWUubGVuZ3RoO2ZvcihuPW5ldyBBcnJheShhKSxpPW5ldyBBcnJheShhKSxvPTA7bzxhOysrbyluW29dPWlzTmFOKGlbb109K3QoZVtvXSxvLGUpKT8wOityKGVbb10sbyxlKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXlXKG51bGw9PXQ/MDordCkpLG8uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtlPXQsYSgpfSxvLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eVcoK3QpLGEoKSxvKTpyfSxvLnk9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTp5VygrZSksYSgpLG8pOnR9LG99LGZvcm1hdERlZmF1bHRMb2NhbGU6SHEsZ2V0IGZvcm1hdCgpe3JldHVybiBPcX0sZ2V0IGZvcm1hdFByZWZpeCgpe3JldHVybiB6cX0sZm9ybWF0TG9jYWxlOkJxLGZvcm1hdFNwZWNpZmllcjpQcSxwcmVjaXNpb25GaXhlZDpmdW5jdGlvbiBNcHQodCl7cmV0dXJuIE1hdGgubWF4KDAsLUVxKE1hdGguYWJzKHQpKSl9LHByZWNpc2lvblByZWZpeDpmdW5jdGlvbiBFcHQodCxlKXtyZXR1cm4gTWF0aC5tYXgoMCwzKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihFcShlKS8zKSkpLUVxKE1hdGguYWJzKHQpKSl9LHByZWNpc2lvblJvdW5kOmZ1bmN0aW9uIFRwdCh0LGUpe3JldHVybiB0PU1hdGguYWJzKHQpLGU9TWF0aC5hYnMoZSktdCxNYXRoLm1heCgwLEVxKGUpLUVxKHQpKSsxfSxnZW9BcmVhOmZ1bmN0aW9uIENwdCh0KXtyZXR1cm4gRVkucmVzZXQoKSx5WSh0LFRZKSwyKkVZfSxnZW9Cb3VuZHM6ZnVuY3Rpb24gQXB0KHQpe3ZhciBlLG4saSxyLG8sYSxzO2lmKFZZPUZZPS0oQlk9SFk9MS8wKSxxWT1bXSx5WSh0LGhYKSxuPXFZLmxlbmd0aCl7Zm9yKHFZLnNvcnQoYlgpLGU9MSxvPVtpPXFZWzBdXTtlPG47KytlKXhYKGksKHI9cVlbZV0pWzBdKXx8eFgoaSxyWzFdKT8odlgoaVswXSxyWzFdKT52WChpWzBdLGlbMV0pJiYoaVsxXT1yWzFdKSx2WChyWzBdLGlbMV0pPnZYKGlbMF0saVsxXSkmJihpWzBdPXJbMF0pKTpvLnB1c2goaT1yKTtmb3IoYT0tMS8wLGU9MCxpPW9bbj1vLmxlbmd0aC0xXTtlPD1uO2k9ciwrK2UpKHM9dlgoaVsxXSwocj1vW2VdKVswXSkpPmEmJihhPXMsQlk9clswXSxGWT1pWzFdKX1yZXR1cm4gcVk9WVk9bnVsbCxCWT09PTEvMHx8SFk9PT0xLzA/W1tOYU4sTmFOXSxbTmFOLE5hTl1dOltbQlksSFldLFtGWSxWWV1dfSxnZW9DZW50cm9pZDpmdW5jdGlvbiBrcHQodCl7WFk9JFk9S1k9Wlk9Slk9UVk9dFg9ZVg9blg9aVg9clg9MCx5WSh0LHdYKTt2YXIgZT1uWCxuPWlYLGk9clgscj1lKmUrbipuK2kqaTtyZXR1cm4gcjwxZS0xMiYmKGU9UVksbj10WCxpPWVYLCRZPEdxJiYoZT1LWSxuPVpZLGk9SlkpLChyPWUqZStuKm4raSppKTwxZS0xMik/W05hTixOYU5dOltRcShuLGUpKiRxLHVZKGkvc1kocikpKiRxXX0sZ2VvQ2lyY2xlOmZ1bmN0aW9uIExwdCgpe3ZhciB0LGUsbj1JWChbMCwwXSksaT1JWCg5MCkscj1JWCg2KSxvPXtwb2ludDpmdW5jdGlvbiBhKG4saSl7dC5wdXNoKG49ZShuLGkpKSxuWzBdKj0kcSxuWzFdKj0kcX19O2Z1bmN0aW9uIHMoKXt2YXIgYT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxzPWkuYXBwbHkodGhpcyxhcmd1bWVudHMpKktxLGw9ci5hcHBseSh0aGlzLGFyZ3VtZW50cykqS3E7cmV0dXJuIHQ9W10sZT16WCgtYVswXSpLcSwtYVsxXSpLcSwwKS5pbnZlcnQsVlgobyxzLGwsMSksYT17dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3RdfSx0PWU9bnVsbCxhfXJldHVybiBzLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OklYKFsrdFswXSwrdFsxXV0pLHMpOm59LHMucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SVgoK3QpLHMpOml9LHMucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SVgoK3QpLHMpOnJ9LHN9LGdlb0NsaXBBbnRpbWVyaWRpYW46aSQsZ2VvQ2xpcENpcmNsZTphJCxnZW9DbGlwRXh0ZW50OmZ1bmN0aW9uIFBwdCgpe3ZhciB0LGUsbixpPTAscj0wLG89OTYwLGE9NTAwO3JldHVybiBuPXtzdHJlYW06ZnVuY3Rpb24obil7cmV0dXJuIHQmJmU9PT1uP3Q6dD1jJChpLHIsbyxhKShlPW4pfSxleHRlbnQ6ZnVuY3Rpb24ocyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3NbMF1bMF0scj0rc1swXVsxXSxvPStzWzFdWzBdLGE9K3NbMV1bMV0sdD1lPW51bGwsbik6W1tpLHJdLFtvLGFdXX19fSxnZW9DbGlwUmVjdGFuZ2xlOmMkLGdlb0NvbnRhaW5zOmZ1bmN0aW9uIE5wdCh0LGUpe3JldHVybih0JiZTJC5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpP1MkW3QudHlwZV06RSQpKHQsZSl9LGdlb0Rpc3RhbmNlOnckLGdlb0dyYXRpY3VsZTpJJCxnZW9HcmF0aWN1bGUxMDpmdW5jdGlvbiBJcHQoKXtyZXR1cm4gSSQoKSgpfSxnZW9JbnRlcnBvbGF0ZTpmdW5jdGlvbiBScHQodCxlKXt2YXIgbj10WzBdKktxLGk9dFsxXSpLcSxyPWVbMF0qS3Esbz1lWzFdKktxLGE9dFkoaSkscz1vWShpKSxsPXRZKG8pLGM9b1kobyksdT1hKnRZKG4pLGg9YSpvWShuKSxkPWwqdFkocikscD1sKm9ZKHIpLGY9Mip1WShzWShoWShvLWkpK2EqbCpoWShyLW4pKSksbT1vWShmKSxnPWY/ZnVuY3Rpb24odCl7dmFyIGU9b1kodCo9ZikvbSxuPW9ZKGYtdCkvbSxpPW4qdStlKmQscj1uKmgrZSpwLG89bipzK2UqYztyZXR1cm5bUXEocixpKSokcSxRcShvLHNZKGkqaStyKnIpKSokcV19OmZ1bmN0aW9uKCl7cmV0dXJuW24qJHEsaSokcV19O3JldHVybiBnLmRpc3RhbmNlPWYsZ30sZ2VvTGVuZ3RoOnYkLGdlb1BhdGg6ZnVuY3Rpb24gT3B0KHQsZSl7dmFyIG4saSxyPTQuNTtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHImJmkucG9pbnRSYWRpdXMoK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKSx5WSh0LG4oaSkpKSxpLnJlc3VsdCgpfXJldHVybiBvLmFyZWE9ZnVuY3Rpb24odCl7cmV0dXJuIHlZKHQsbihWJCkpLFYkLnJlc3VsdCgpfSxvLm1lYXN1cmU9ZnVuY3Rpb24odCl7cmV0dXJuIHlZKHQsbihBSykpLEFLLnJlc3VsdCgpfSxvLmJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4geVkodCxuKHRLKSksdEsucmVzdWx0KCl9LG8uY2VudHJvaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHlZKHQsbihoSykpLGhLLnJlc3VsdCgpfSxvLnByb2plY3Rpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09ZT8odD1udWxsLFIkKToodD1lKS5zdHJlYW0sbyk6dH0sby5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/KGU9bnVsbCxuZXcgUEspOm5ldyB4SyhlPXQpLCJmdW5jdGlvbiIhPXR5cGVvZiByJiZpLnBvaW50UmFkaXVzKHIpLG8pOmV9LG8ucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooaS5wb2ludFJhZGl1cygrdCksK3QpLG8pOnJ9LG8ucHJvamVjdGlvbih0KS5jb250ZXh0KGUpfSxnZW9BbGJlcnM6WEssZ2VvQWxiZXJzVXNhOmZ1bmN0aW9uIHpwdCgpe3ZhciB0LGUsbixpLHIsbyxhPVhLKCkscz1ZSygpLnJvdGF0ZShbMTU0LDBdKS5jZW50ZXIoWy0yLDU4LjVdKS5wYXJhbGxlbHMoWzU1LDY1XSksbD1ZSygpLnJvdGF0ZShbMTU3LDBdKS5jZW50ZXIoWy0zLDE5LjldKS5wYXJhbGxlbHMoWzgsMThdKSxjPXtwb2ludDpmdW5jdGlvbih0LGUpe289W3QsZV19fTtmdW5jdGlvbiB1KHQpe3ZhciBlPXRbMF0sYT10WzFdO3JldHVybiBvPW51bGwsbi5wb2ludChlLGEpLG98fChpLnBvaW50KGUsYSksbyl8fChyLnBvaW50KGUsYSksbyl9ZnVuY3Rpb24gaCgpe3JldHVybiB0PWU9bnVsbCx1fXJldHVybiB1LmludmVydD1mdW5jdGlvbih0KXt2YXIgZT1hLnNjYWxlKCksbj1hLnRyYW5zbGF0ZSgpLGk9KHRbMF0tblswXSkvZSxyPSh0WzFdLW5bMV0pL2U7cmV0dXJuKHI+PS4xMiYmcjwuMjM0JiZpPj0tLjQyNSYmaTwtLjIxND9zOnI+PS4xNjYmJnI8LjIzNCYmaT49LS4yMTQmJmk8LS4xMTU/bDphKS5pbnZlcnQodCl9LHUuc3RyZWFtPWZ1bmN0aW9uKG4pe3JldHVybiB0JiZlPT09bj90OnQ9KGZ1bmN0aW9uIGkodCl7dmFyIGU9dC5sZW5ndGg7cmV0dXJue3BvaW50OmZ1bmN0aW9uKG4saSl7Zm9yKHZhciByPS0xOysrcjxlOyl0W3JdLnBvaW50KG4saSl9LHNwaGVyZTpmdW5jdGlvbigpe2Zvcih2YXIgbj0tMTsrK248ZTspdFtuXS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciBuPS0xOysrbjxlOyl0W25dLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciBuPS0xOysrbjxlOyl0W25dLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciBuPS0xOysrbjxlOyl0W25dLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciBuPS0xOysrbjxlOyl0W25dLnBvbHlnb25FbmQoKX19fSkoW2Euc3RyZWFtKGU9bikscy5zdHJlYW0obiksbC5zdHJlYW0obildKX0sdS5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGEucHJlY2lzaW9uKHQpLHMucHJlY2lzaW9uKHQpLGwucHJlY2lzaW9uKHQpLGgoKSk6YS5wcmVjaXNpb24oKX0sdS5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYS5zY2FsZSh0KSxzLnNjYWxlKC4zNSp0KSxsLnNjYWxlKHQpLHUudHJhbnNsYXRlKGEudHJhbnNsYXRlKCkpKTphLnNjYWxlKCl9LHUudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBhLnRyYW5zbGF0ZSgpO3ZhciBlPWEuc2NhbGUoKSxvPSt0WzBdLHU9K3RbMV07cmV0dXJuIG49YS50cmFuc2xhdGUodCkuY2xpcEV4dGVudChbW28tLjQ1NSplLHUtLjIzOCplXSxbbysuNDU1KmUsdSsuMjM4KmVdXSkuc3RyZWFtKGMpLGk9cy50cmFuc2xhdGUoW28tLjMwNyplLHUrLjIwMSplXSkuY2xpcEV4dGVudChbW28tLjQyNSplK0dxLHUrLjEyKmUrR3FdLFtvLS4yMTQqZS1HcSx1Ky4yMzQqZS1HcV1dKS5zdHJlYW0oYykscj1sLnRyYW5zbGF0ZShbby0uMjA1KmUsdSsuMjEyKmVdKS5jbGlwRXh0ZW50KFtbby0uMjE0KmUrR3EsdSsuMTY2KmUrR3FdLFtvLS4xMTUqZS1HcSx1Ky4yMzQqZS1HcV1dKS5zdHJlYW0oYyksaCgpfSx1LmZpdEV4dGVudD1mdW5jdGlvbih0LGUpe3JldHVybiB6Syh1LHQsZSl9LHUuZml0U2l6ZT1mdW5jdGlvbih0LGUpe3JldHVybiBESyh1LHQsZSl9LHUuZml0V2lkdGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gQksodSx0LGUpfSx1LmZpdEhlaWdodD1mdW5jdGlvbih0LGUpe3JldHVybiBISyh1LHQsZSl9LHUuc2NhbGUoMTA3MCl9LGdlb0F6aW11dGhhbEVxdWFsQXJlYTpmdW5jdGlvbiBEcHQoKXtyZXR1cm4gaksoWkspLnNjYWxlKDEyNC43NSkuY2xpcEFuZ2xlKDE3OS45OTkpfSxnZW9BemltdXRoYWxFcXVhbEFyZWFSYXc6WkssZ2VvQXppbXV0aGFsRXF1aWRpc3RhbnQ6ZnVuY3Rpb24gQnB0KCl7cmV0dXJuIGpLKEpLKS5zY2FsZSg3OS40MTg4KS5jbGlwQW5nbGUoMTc5Ljk5OSl9LGdlb0F6aW11dGhhbEVxdWlkaXN0YW50UmF3OkpLLGdlb0NvbmljQ29uZm9ybWFsOmZ1bmN0aW9uIEhwdCgpe3JldHVybiBXSyhuWikuc2NhbGUoMTA5LjUpLnBhcmFsbGVscyhbMzAsMzBdKX0sZ2VvQ29uaWNDb25mb3JtYWxSYXc6blosZ2VvQ29uaWNFcXVhbEFyZWE6WUssZ2VvQ29uaWNFcXVhbEFyZWFSYXc6cUssZ2VvQ29uaWNFcXVpZGlzdGFudDpmdW5jdGlvbiBGcHQoKXtyZXR1cm4gV0soclopLnNjYWxlKDEzMS4xNTQpLmNlbnRlcihbMCwxMy45Mzg5XSl9LGdlb0NvbmljRXF1aWRpc3RhbnRSYXc6closZ2VvRXF1aXJlY3Rhbmd1bGFyOmZ1bmN0aW9uIFZwdCgpe3JldHVybiBqSyhpWikuc2NhbGUoMTUyLjYzKX0sZ2VvRXF1aXJlY3Rhbmd1bGFyUmF3OmlaLGdlb0dub21vbmljOmZ1bmN0aW9uIFVwdCgpe3JldHVybiBqSyhvWikuc2NhbGUoMTQ0LjA0OSkuY2xpcEFuZ2xlKDYwKX0sZ2VvR25vbW9uaWNSYXc6b1osZ2VvSWRlbnRpdHk6ZnVuY3Rpb24ganB0KCl7dmFyIHQsZSxuLGkscixvLGE9MSxzPTAsbD0wLGM9MSx1PTEsaD1SJCxkPW51bGwscD1SJDtmdW5jdGlvbiBmKCl7cmV0dXJuIGk9cj1udWxsLG99cmV0dXJuIG89e3N0cmVhbTpmdW5jdGlvbih0KXtyZXR1cm4gaSYmcj09PXQ/aTppPWgocChyPXQpKX0scG9zdGNsaXA6ZnVuY3Rpb24oaSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9aSxkPXQ9ZT1uPW51bGwsZigpKTpwfSxjbGlwRXh0ZW50OmZ1bmN0aW9uKGkpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPW51bGw9PWk/KGQ9dD1lPW49bnVsbCxSJCk6YyQoZD0raVswXVswXSx0PStpWzBdWzFdLGU9K2lbMV1bMF0sbj0raVsxXVsxXSksZigpKTpudWxsPT1kP251bGw6W1tkLHRdLFtlLG5dXX0sc2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9YVooKGE9K3QpKmMsYSp1LHMsbCksZigpKTphfSx0cmFuc2xhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9YVooYSpjLGEqdSxzPSt0WzBdLGw9K3RbMV0pLGYoKSk6W3MsbF19LHJlZmxlY3RYOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPWFaKGEqKGM9dD8tMToxKSxhKnUscyxsKSxmKCkpOmM8MH0scmVmbGVjdFk6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9YVooYSpjLGEqKHU9dD8tMToxKSxzLGwpLGYoKSk6dTwwfSxmaXRFeHRlbnQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4geksobyx0LGUpfSxmaXRTaXplOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIERLKG8sdCxlKX0sZml0V2lkdGg6ZnVuY3Rpb24odCxlKXtyZXR1cm4gQksobyx0LGUpfSxmaXRIZWlnaHQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gSEsobyx0LGUpfX19LGdlb1Byb2plY3Rpb246akssZ2VvUHJvamVjdGlvbk11dGF0b3I6R0ssZ2VvTWVyY2F0b3I6ZnVuY3Rpb24gR3B0KCl7cmV0dXJuIHRaKFFLKS5zY2FsZSg5NjEvWHEpfSxnZW9NZXJjYXRvclJhdzpRSyxnZW9OYXR1cmFsRWFydGgxOmZ1bmN0aW9uIFdwdCgpe3JldHVybiBqSyhzWikuc2NhbGUoMTc1LjI5NSl9LGdlb05hdHVyYWxFYXJ0aDFSYXc6c1osZ2VvT3J0aG9ncmFwaGljOmZ1bmN0aW9uIHFwdCgpe3JldHVybiBqSyhsWikuc2NhbGUoMjQ5LjUpLmNsaXBBbmdsZSg5MC4wMDAwMDEpfSxnZW9PcnRob2dyYXBoaWNSYXc6bFosZ2VvU3RlcmVvZ3JhcGhpYzpmdW5jdGlvbiBZcHQoKXtyZXR1cm4gaksoY1opLnNjYWxlKDI1MCkuY2xpcEFuZ2xlKDE0Mil9LGdlb1N0ZXJlb2dyYXBoaWNSYXc6Y1osZ2VvVHJhbnN2ZXJzZU1lcmNhdG9yOmZ1bmN0aW9uIFhwdCgpe3ZhciB0PXRaKHVaKSxlPXQuY2VudGVyLG49dC5yb3RhdGU7cmV0dXJuIHQuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoWy10WzFdLHRbMF1dKTpbKHQ9ZSgpKVsxXSwtdFswXV19LHQucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oW3RbMF0sdFsxXSx0Lmxlbmd0aD4yP3RbMl0rOTA6OTBdKTpbKHQ9bigpKVswXSx0WzFdLHRbMl0tOTBdfSxuKFswLDAsOTBdKS5zY2FsZSgxNTkuMTU1KX0sZ2VvVHJhbnN2ZXJzZU1lcmNhdG9yUmF3OnVaLGdlb1JvdGF0aW9uOkZYLGdlb1N0cmVhbTp5WSxnZW9UcmFuc2Zvcm06ZnVuY3Rpb24gJHB0KHQpe3JldHVybntzdHJlYW06SUsodCl9fSxjbHVzdGVyOmZ1bmN0aW9uIEtwdCgpe3ZhciB0PWhaLGU9MSxuPTEsaT0hMTtmdW5jdGlvbiByKHIpe3ZhciBvLGE9MDtyLmVhY2hBZnRlcigoZnVuY3Rpb24oZSl7dmFyIG49ZS5jaGlsZHJlbjtuPyhlLng9KGZ1bmN0aW9uIGkodCl7cmV0dXJuIHQucmVkdWNlKGRaLDApL3QubGVuZ3RofSkobiksZS55PShmdW5jdGlvbiByKHQpe3JldHVybiAxK3QucmVkdWNlKHBaLDApfSkobikpOihlLng9bz9hKz10KGUsbyk6MCxlLnk9MCxvPWUpfSkpO3ZhciBzPShmdW5jdGlvbiBsKHQpe2Zvcih2YXIgZTtlPXQuY2hpbGRyZW47KXQ9ZVswXTtyZXR1cm4gdH0pKHIpLGM9KGZ1bmN0aW9uIHUodCl7Zm9yKHZhciBlO2U9dC5jaGlsZHJlbjspdD1lW2UubGVuZ3RoLTFdO3JldHVybiB0fSkociksaD1zLngtdChzLGMpLzIsZD1jLngrdChjLHMpLzI7cmV0dXJuIHIuZWFjaEFmdGVyKGk/ZnVuY3Rpb24odCl7dC54PSh0Lngtci54KSplLHQueT0oci55LXQueSkqbn06ZnVuY3Rpb24odCl7dC54PSh0LngtaCkvKGQtaCkqZSx0Lnk9KDEtKHIueT90Lnkvci55OjEpKSpufSl9cmV0dXJuIHIuc2VwYXJhdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLHIpOnR9LHIuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0hMSxlPSt0WzBdLG49K3RbMV0scik6aT9udWxsOltlLG5dfSxyLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSEwLGU9K3RbMF0sbj0rdFsxXSxyKTppP1tlLG5dOm51bGx9LHJ9LGhpZXJhcmNoeTptWixwYWNrOmZ1bmN0aW9uIFpwdCgpe3ZhciB0PW51bGwsZT0xLG49MSxpPVhaO2Z1bmN0aW9uIHIocil7cmV0dXJuIHIueD1lLzIsci55PW4vMix0P3IuZWFjaEJlZm9yZShaWih0KSkuZWFjaEFmdGVyKEpaKGksLjUpKS5lYWNoQmVmb3JlKFFaKDEpKTpyLmVhY2hCZWZvcmUoWlooS1opKS5lYWNoQWZ0ZXIoSlooWFosMSkpLmVhY2hBZnRlcihKWihpLHIuci9NYXRoLm1pbihlLG4pKSkuZWFjaEJlZm9yZShRWihNYXRoLm1pbihlLG4pLygyKnIucikpKSxyfXJldHVybiByLnJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1xWihlKSxyKTp0fSxyLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3RbMF0sbj0rdFsxXSxyKTpbZSxuXX0sci5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6JFooK3QpLHIpOml9LHJ9LHBhY2tTaWJsaW5nczpmdW5jdGlvbiBKcHQodCl7cmV0dXJuIFdaKHQpLHR9LHBhY2tFbmNsb3NlOklaLHBhcnRpdGlvbjpmdW5jdGlvbiBRcHQoKXt2YXIgdD0xLGU9MSxuPTAsaT0hMTtmdW5jdGlvbiByKHIpe3ZhciBvPXIuaGVpZ2h0KzE7cmV0dXJuIHIueDA9ci55MD1uLHIueDE9dCxyLnkxPWUvbyxyLmVhY2hCZWZvcmUoKGZ1bmN0aW9uIGEodCxlKXtyZXR1cm4gZnVuY3Rpb24oaSl7aS5jaGlsZHJlbiYmZUooaSxpLngwLHQqKGkuZGVwdGgrMSkvZSxpLngxLHQqKGkuZGVwdGgrMikvZSk7dmFyIHI9aS54MCxvPWkueTAsYT1pLngxLW4scz1pLnkxLW47YTxyJiYocj1hPShyK2EpLzIpLHM8byYmKG89cz0obytzKS8yKSxpLngwPXIsaS55MD1vLGkueDE9YSxpLnkxPXN9fSkoZSxvKSksaSYmci5lYWNoQmVmb3JlKHRKKSxyfXJldHVybiByLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSEhdCxyKTppfSxyLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K25bMF0sZT0rblsxXSxyKTpbdCxlXX0sci5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0LHIpOm59LHJ9LHN0cmF0aWZ5OmZ1bmN0aW9uIHRmdCgpe3ZhciB0PXJKLGU9b0o7ZnVuY3Rpb24gbihuKXt2YXIgaSxyLG8sYSxzLGwsYyx1PW4ubGVuZ3RoLGg9bmV3IEFycmF5KHUpLGQ9e307Zm9yKHI9MDtyPHU7KytyKXM9aFtyXT1uZXcgdlooaT1uW3JdKSxudWxsIT0obD10KGkscixuKSkmJihsKz0iIikmJihkW2M9IiQiKyhzLmlkPWwpXT1jIGluIGQ/aUo6cyk7Zm9yKHI9MDtyPHU7KytyKWlmKHM9aFtyXSxudWxsIT0obD1lKG5bcl0scixuKSkmJihsKz0iIikpe2lmKCEoYT1kWyIkIitsXSkpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nOiAiK2wpO2lmKGE9PT1pSil0aHJvdyBuZXcgRXJyb3IoImFtYmlndW91czogIitsKTthLmNoaWxkcmVuP2EuY2hpbGRyZW4ucHVzaChzKTphLmNoaWxkcmVuPVtzXSxzLnBhcmVudD1hfWVsc2V7aWYobyl0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIHJvb3RzIik7bz1zfWlmKCFvKXRocm93IG5ldyBFcnJvcigibm8gcm9vdCIpO2lmKG8ucGFyZW50PW5KLG8uZWFjaEJlZm9yZSgoZnVuY3Rpb24odCl7dC5kZXB0aD10LnBhcmVudC5kZXB0aCsxLC0tdX0pKS5lYWNoQmVmb3JlKHlaKSxvLnBhcmVudD1udWxsLHU+MCl0aHJvdyBuZXcgRXJyb3IoImN5Y2xlIik7cmV0dXJuIG99cmV0dXJuIG4uaWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9WVooZSksbik6dH0sbi5wYXJlbnRJZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1ZWih0KSxuKTplfSxufSx0cmVlOmZ1bmN0aW9uIGVmdCgpe3ZhciB0PWFKLGU9MSxuPTEsaT1udWxsO2Z1bmN0aW9uIHIocil7dmFyIGw9KGZ1bmN0aW9uIGModCl7Zm9yKHZhciBlLG4saSxyLG8sYT1uZXcgaEoodCwwKSxzPVthXTtlPXMucG9wKCk7KWlmKGk9ZS5fLmNoaWxkcmVuKWZvcihlLmNoaWxkcmVuPW5ldyBBcnJheShvPWkubGVuZ3RoKSxyPW8tMTtyPj0wOy0tcilzLnB1c2gobj1lLmNoaWxkcmVuW3JdPW5ldyBoSihpW3JdLHIpKSxuLnBhcmVudD1lO3JldHVybihhLnBhcmVudD1uZXcgaEoobnVsbCwwKSkuY2hpbGRyZW49W2FdLGF9KShyKTtpZihsLmVhY2hBZnRlcihvKSxsLnBhcmVudC5tPS1sLnosbC5lYWNoQmVmb3JlKGEpLGkpci5lYWNoQmVmb3JlKHMpO2Vsc2V7dmFyIHU9cixoPXIsZD1yO3IuZWFjaEJlZm9yZSgoZnVuY3Rpb24odCl7dC54PHUueCYmKHU9dCksdC54PmgueCYmKGg9dCksdC5kZXB0aD5kLmRlcHRoJiYoZD10KX0pKTt2YXIgcD11PT09aD8xOnQodSxoKS8yLGY9cC11LngsbT1lLyhoLngrcCtmKSxnPW4vKGQuZGVwdGh8fDEpO3IuZWFjaEJlZm9yZSgoZnVuY3Rpb24odCl7dC54PSh0LngrZikqbSx0Lnk9dC5kZXB0aCpnfSkpfXJldHVybiByfWZ1bmN0aW9uIG8oZSl7dmFyIG49ZS5jaGlsZHJlbixpPWUucGFyZW50LmNoaWxkcmVuLHI9ZS5pP2lbZS5pLTFdOm51bGw7aWYobil7IShmdW5jdGlvbiBvKHQpe2Zvcih2YXIgZSxuPTAsaT0wLHI9dC5jaGlsZHJlbixvPXIubGVuZ3RoOy0tbz49MDspKGU9cltvXSkueis9bixlLm0rPW4sbis9ZS5zKyhpKz1lLmMpfSkoZSk7dmFyIGE9KG5bMF0ueituW24ubGVuZ3RoLTFdLnopLzI7cj8oZS56PXIueit0KGUuXyxyLl8pLGUubT1lLnotYSk6ZS56PWF9ZWxzZSByJiYoZS56PXIueit0KGUuXyxyLl8pKTtlLnBhcmVudC5BPShmdW5jdGlvbiBzKGUsbixpKXtpZihuKXtmb3IodmFyIHIsbz1lLGE9ZSxzPW4sbD1vLnBhcmVudC5jaGlsZHJlblswXSxjPW8ubSx1PWEubSxoPXMubSxkPWwubTtzPWxKKHMpLG89c0oobykscyYmbzspbD1zSihsKSwoYT1sSihhKSkuYT1lLChyPXMueitoLW8uei1jK3Qocy5fLG8uXykpPjAmJihjSih1SihzLGUsaSksZSxyKSxjKz1yLHUrPXIpLGgrPXMubSxjKz1vLm0sZCs9bC5tLHUrPWEubTtzJiYhbEooYSkmJihhLnQ9cyxhLm0rPWgtdSksbyYmIXNKKGwpJiYobC50PW8sbC5tKz1jLWQsaT1lKX1yZXR1cm4gaX0pKGUscixlLnBhcmVudC5BfHxpWzBdKX1mdW5jdGlvbiBhKHQpe3QuXy54PXQueit0LnBhcmVudC5tLHQubSs9dC5wYXJlbnQubX1mdW5jdGlvbiBzKHQpe3QueCo9ZSx0Lnk9dC5kZXB0aCpufXJldHVybiByLnNlcGFyYXRpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxyKTp0fSxyLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ITEsZT0rdFswXSxuPSt0WzFdLHIpOmk/bnVsbDpbZSxuXX0sci5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0hMCxlPSt0WzBdLG49K3RbMV0scik6aT9bZSxuXTpudWxsfSxyfSx0cmVlbWFwOmZ1bmN0aW9uIG5mdCgpe3ZhciB0PW1KLGU9ITEsbj0xLGk9MSxyPVswXSxvPVhaLGE9WFoscz1YWixsPVhaLGM9WFo7ZnVuY3Rpb24gdSh0KXtyZXR1cm4gdC54MD10LnkwPTAsdC54MT1uLHQueTE9aSx0LmVhY2hCZWZvcmUoaCkscj1bMF0sZSYmdC5lYWNoQmVmb3JlKHRKKSx0fWZ1bmN0aW9uIGgoZSl7dmFyIG49cltlLmRlcHRoXSxpPWUueDArbix1PWUueTArbixoPWUueDEtbixkPWUueTEtbjtoPGkmJihpPWg9KGkraCkvMiksZDx1JiYodT1kPSh1K2QpLzIpLGUueDA9aSxlLnkwPXUsZS54MT1oLGUueTE9ZCxlLmNoaWxkcmVuJiYobj1yW2UuZGVwdGgrMV09byhlKS8yLGkrPWMoZSktbix1Kz1hKGUpLW4sKGgtPXMoZSktbik8aSYmKGk9aD0oaStoKS8yKSwoZC09bChlKS1uKTx1JiYodT1kPSh1K2QpLzIpLHQoZSxpLHUsaCxkKSl9cmV0dXJuIHUucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ISF0LHUpOmV9LHUuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdFswXSxpPSt0WzFdLHUpOltuLGldfSx1LnRpbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9WVooZSksdSk6dH0sdS5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3UucGFkZGluZ0lubmVyKHQpLnBhZGRpbmdPdXRlcih0KTp1LnBhZGRpbmdJbm5lcigpfSx1LnBhZGRpbmdJbm5lcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OiRaKCt0KSx1KTpvfSx1LnBhZGRpbmdPdXRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD91LnBhZGRpbmdUb3AodCkucGFkZGluZ1JpZ2h0KHQpLnBhZGRpbmdCb3R0b20odCkucGFkZGluZ0xlZnQodCk6dS5wYWRkaW5nVG9wKCl9LHUucGFkZGluZ1RvcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OiRaKCt0KSx1KTphfSx1LnBhZGRpbmdSaWdodD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OiRaKCt0KSx1KTpzfSx1LnBhZGRpbmdCb3R0b209ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDokWigrdCksdSk6bH0sdS5wYWRkaW5nTGVmdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OiRaKCt0KSx1KTpjfSx1fSx0cmVlbWFwQmluYXJ5OmZ1bmN0aW9uIGlmdCh0LGUsbixpLHIpe3ZhciBvLGEscz10LmNoaWxkcmVuLGw9cy5sZW5ndGgsYz1uZXcgQXJyYXkobCsxKTtmb3IoY1swXT1hPW89MDtvPGw7KytvKWNbbysxXT1hKz1zW29dLnZhbHVlOyEoZnVuY3Rpb24gdChlLG4saSxyLG8sYSxsKXtpZihlPj1uLTEpe3ZhciB1PXNbZV07cmV0dXJuIHUueDA9cix1LnkwPW8sdS54MT1hLHZvaWQodS55MT1sKX1mb3IodmFyIGg9Y1tlXSxkPWkvMitoLHA9ZSsxLGY9bi0xO3A8Zjspe3ZhciBtPXArZj4+PjE7Y1ttXTxkP3A9bSsxOmY9bX1kLWNbcC0xXTxjW3BdLWQmJmUrMTxwJiYtLXA7dmFyIGc9Y1twXS1oLF89aS1nO2lmKGEtcj5sLW8pe3ZhciB5PShyKl8rYSpnKS9pO3QoZSxwLGcscixvLHksbCksdChwLG4sXyx5LG8sYSxsKX1lbHNle3ZhciB2PShvKl8rbCpnKS9pO3QoZSxwLGcscixvLGEsdiksdChwLG4sXyxyLHYsYSxsKX19KSgwLGwsdC52YWx1ZSxlLG4saSxyKX0sdHJlZW1hcERpY2U6ZUosdHJlZW1hcFNsaWNlOmRKLHRyZWVtYXBTbGljZURpY2U6ZnVuY3Rpb24gcmZ0KHQsZSxuLGkscil7KDEmdC5kZXB0aD9kSjplSikodCxlLG4saSxyKX0sdHJlZW1hcFNxdWFyaWZ5Om1KLHRyZWVtYXBSZXNxdWFyaWZ5OmdKLGludGVycG9sYXRlOkJRLGludGVycG9sYXRlQXJyYXk6UFEsaW50ZXJwb2xhdGVCYXNpczp4USxpbnRlcnBvbGF0ZUJhc2lzQ2xvc2VkOndRLGludGVycG9sYXRlRGF0ZTpOUSxpbnRlcnBvbGF0ZU51bWJlcjpJUSxpbnRlcnBvbGF0ZU9iamVjdDpSUSxpbnRlcnBvbGF0ZVJvdW5kOmZ1bmN0aW9uIG9mdCh0LGUpe3JldHVybiBlLT10PSt0LGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnJvdW5kKHQrZSpuKX19LGludGVycG9sYXRlU3RyaW5nOkRRLGludGVycG9sYXRlVHJhbnNmb3JtQ3NzOllRLGludGVycG9sYXRlVHJhbnNmb3JtU3ZnOiRRLGludGVycG9sYXRlWm9vbTpmdW5jdGlvbiBhZnQodCxlKXt2YXIgbixpLHI9dFswXSxvPXRbMV0sYT10WzJdLHM9ZVsyXSxsPWVbMF0tcixjPWVbMV0tbyx1PWwqbCtjKmM7aWYodTwxZS0xMilpPU1hdGgubG9nKHMvYSkvWlEsbj1mdW5jdGlvbih0KXtyZXR1cm5bcit0Kmwsbyt0KmMsYSpNYXRoLmV4cChaUSp0KmkpXX07ZWxzZXt2YXIgaD1NYXRoLnNxcnQodSksZD0ocypzLWEqYSs0KnUpLygyKmEqMipoKSxwPShzKnMtYSphLTQqdSkvKDIqcyoyKmgpLGY9TWF0aC5sb2coTWF0aC5zcXJ0KGQqZCsxKS1kKSxtPU1hdGgubG9nKE1hdGguc3FydChwKnArMSktcCk7aT0obS1mKS9aUSxuPWZ1bmN0aW9uKHQpe3ZhciBlPXQqaSxuPUpRKGYpLHM9YS8oMipoKSoobiooZnVuY3Rpb24gdSh0KXtyZXR1cm4oKHQ9TWF0aC5leHAoMip0KSktMSkvKHQrMSl9KShaUSplK2YpLShmdW5jdGlvbiBkKHQpe3JldHVybigodD1NYXRoLmV4cCh0KSktMS90KS8yfSkoZikpO3JldHVybltyK3MqbCxvK3MqYyxhKm4vSlEoWlEqZStmKV19fXJldHVybiBuLmR1cmF0aW9uPTFlMyppLG59LGludGVycG9sYXRlUmdiOkNRLGludGVycG9sYXRlUmdiQmFzaXM6a1EsaW50ZXJwb2xhdGVSZ2JCYXNpc0Nsb3NlZDpMUSxpbnRlcnBvbGF0ZUhzbDp0MSxpbnRlcnBvbGF0ZUhzbExvbmc6ZTEsaW50ZXJwb2xhdGVMYWI6ZnVuY3Rpb24gc2Z0KHQsZSl7dmFyIG49VFEoKHQ9clEodCkpLmwsKGU9clEoZSkpLmwpLGk9VFEodC5hLGUuYSkscj1UUSh0LmIsZS5iKSxvPVRRKHQub3BhY2l0eSxlLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5sPW4oZSksdC5hPWkoZSksdC5iPXIoZSksdC5vcGFjaXR5PW8oZSksdCsiIn19LGludGVycG9sYXRlSGNsOmkxLGludGVycG9sYXRlSGNsTG9uZzpyMSxpbnRlcnBvbGF0ZUN1YmVoZWxpeDphMSxpbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmc6czEscXVhbnRpemU6ZnVuY3Rpb24gbGZ0KHQsZSl7Zm9yKHZhciBuPW5ldyBBcnJheShlKSxpPTA7aTxlOysraSluW2ldPXQoaS8oZS0xKSk7cmV0dXJuIG59LHBhdGg6cDEscG9seWdvbkFyZWE6ZnVuY3Rpb24gY2Z0KHQpe2Zvcih2YXIgZSxuPS0xLGk9dC5sZW5ndGgscj10W2ktMV0sbz0wOysrbjxpOylvKz0oZT1yKVsxXSoocj10W25dKVswXS1lWzBdKnJbMV07cmV0dXJuIG8vMn0scG9seWdvbkNlbnRyb2lkOmZ1bmN0aW9uIHVmdCh0KXtmb3IodmFyIGUsbixpPS0xLHI9dC5sZW5ndGgsbz0wLGE9MCxzPXRbci0xXSxsPTA7KytpPHI7KWwrPW49KGU9cylbMF0qKHM9dFtpXSlbMV0tc1swXSplWzFdLG8rPShlWzBdK3NbMF0pKm4sYSs9KGVbMV0rc1sxXSkqbjtyZXR1cm5bby8obCo9MyksYS9sXX0scG9seWdvbkh1bGw6ZnVuY3Rpb24gaGZ0KHQpe2lmKChuPXQubGVuZ3RoKTwzKXJldHVybiBudWxsO3ZhciBlLG4saT1uZXcgQXJyYXkobikscj1uZXcgQXJyYXkobik7Zm9yKGU9MDtlPG47KytlKWlbZV09Wyt0W2VdWzBdLCt0W2VdWzFdLGVdO2ZvcihpLnNvcnQobTEpLGU9MDtlPG47KytlKXJbZV09W2lbZV1bMF0sLWlbZV1bMV1dO3ZhciBvPWcxKGkpLGE9ZzEocikscz1hWzBdPT09b1swXSxsPWFbYS5sZW5ndGgtMV09PT1vW28ubGVuZ3RoLTFdLGM9W107Zm9yKGU9by5sZW5ndGgtMTtlPj0wOy0tZSljLnB1c2godFtpW29bZV1dWzJdXSk7Zm9yKGU9K3M7ZTxhLmxlbmd0aC1sOysrZSljLnB1c2godFtpW2FbZV1dWzJdXSk7cmV0dXJuIGN9LHBvbHlnb25Db250YWluczpmdW5jdGlvbiBkZnQodCxlKXtmb3IodmFyIG4saSxyPXQubGVuZ3RoLG89dFtyLTFdLGE9ZVswXSxzPWVbMV0sbD1vWzBdLGM9b1sxXSx1PSExLGg9MDtoPHI7KytoKW49KG89dFtoXSlbMF0sKGk9b1sxXSk+cyE9Yz5zJiZhPChsLW4pKihzLWkpLyhjLWkpK24mJih1PSF1KSxsPW4sYz1pO3JldHVybiB1fSxwb2x5Z29uTGVuZ3RoOmZ1bmN0aW9uIHBmdCh0KXtmb3IodmFyIGUsbixpPS0xLHI9dC5sZW5ndGgsbz10W3ItMV0sYT1vWzBdLHM9b1sxXSxsPTA7KytpPHI7KWU9YSxuPXMsZS09YT0obz10W2ldKVswXSxuLT1zPW9bMV0sbCs9TWF0aC5zcXJ0KGUqZStuKm4pO3JldHVybiBsfSxxdWFkdHJlZTp4MSxxdWV1ZTpxMSxyYW5kb21Vbmlmb3JtOlgxLHJhbmRvbU5vcm1hbDokMSxyYW5kb21Mb2dOb3JtYWw6SzEscmFuZG9tQmF0ZXM6SjEscmFuZG9tSXJ3aW5IYWxsOloxLHJhbmRvbUV4cG9uZW50aWFsOlExLHJlcXVlc3Q6dDAsaHRtbDpuMCxqc29uOmkwLHRleHQ6cjAseG1sOm8wLGNzdjpsMCx0c3Y6YzAsc2NhbGVCYW5kOlAwLHNjYWxlUG9pbnQ6ZnVuY3Rpb24gZmZ0KCl7cmV0dXJuIE4wKFAwKCkucGFkZGluZ0lubmVyKDEpKX0sc2NhbGVJZGVudGl0eTpmdW5jdGlvbiB0KCl7dmFyIGU9WzAsMV07ZnVuY3Rpb24gbih0KXtyZXR1cm4rdH1yZXR1cm4gbi5pbnZlcnQ9bixuLmRvbWFpbj1uLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPUMwLmNhbGwodCxqMiksbik6ZS5zbGljZSgpfSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihlKX0sZDUobil9LHNjYWxlTGluZWFyOmZ1bmN0aW9uIHQoKXt2YXIgZT0kMihXMixOMik7cmV0dXJuIGUuY29weT1mdW5jdGlvbigpe3JldHVybiBYMihlLHQoKSl9LGQ1KGUpfSxzY2FsZUxvZzpmdW5jdGlvbiB0KCl7dmFyIGU9JDIoZjUsbTUpLmRvbWFpbihbMSwxMF0pLG49ZS5kb21haW4saT0xMCxyPXk1KDEwKSxvPV81KDEwKTtmdW5jdGlvbiBhKCl7cmV0dXJuIHI9eTUoaSksbz1fNShpKSxuKClbMF08MCYmKHI9djUociksbz12NShvKSksZX1yZXR1cm4gZS5iYXNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LGEoKSk6aX0sZS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG4odCksYSgpKTpuKCl9LGUudGlja3M9ZnVuY3Rpb24odCl7dmFyIGUsYT1uKCkscz1hWzBdLGw9YVthLmxlbmd0aC0xXTsoZT1sPHMpJiYoZD1zLHM9bCxsPWQpO3ZhciBjLHUsaCxkPXIocykscD1yKGwpLGY9bnVsbD09dD8xMDordCxtPVtdO2lmKCEoaSUxKSYmcC1kPGYpe2lmKGQ9TWF0aC5yb3VuZChkKS0xLHA9TWF0aC5yb3VuZChwKSsxLHM+MCl7Zm9yKDtkPHA7KytkKWZvcih1PTEsYz1vKGQpO3U8aTsrK3UpaWYoISgoaD1jKnUpPHMpKXtpZihoPmwpYnJlYWs7bS5wdXNoKGgpfX1lbHNlIGZvcig7ZDxwOysrZClmb3IodT1pLTEsYz1vKGQpO3U+PTE7LS11KWlmKCEoKGg9Yyp1KTxzKSl7aWYoaD5sKWJyZWFrO20ucHVzaChoKX19ZWxzZSBtPV8wKGQscCxNYXRoLm1pbihwLWQsZikpLm1hcChvKTtyZXR1cm4gZT9tLnJldmVyc2UoKTptfSxlLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxuKXtpZihudWxsPT1uJiYobj0xMD09PWk/Ii4wZSI6IiwiKSwiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49bDUobikpLHQ9PT0xLzApcmV0dXJuIG47bnVsbD09dCYmKHQ9MTApO3ZhciBhPU1hdGgubWF4KDEsaSp0L2UudGlja3MoKS5sZW5ndGgpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT10L28oTWF0aC5yb3VuZChyKHQpKSk7cmV0dXJuIGUqaTxpLS41JiYoZSo9aSksZTw9YT9uKHQpOiIifX0sZS5uaWNlPWZ1bmN0aW9uKCl7cmV0dXJuIG4ocDUobigpLHtmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gbyhNYXRoLmZsb29yKHIodCkpKX0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gbyhNYXRoLmNlaWwocih0KSkpfX0pKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFgyKGUsdCgpLmJhc2UoaSkpfSxlfSxzY2FsZU9yZGluYWw6TDAsc2NhbGVJbXBsaWNpdDprMCxzY2FsZVBvdzp4NSxzY2FsZVNxcnQ6ZnVuY3Rpb24gbWZ0KCl7cmV0dXJuIHg1KCkuZXhwb25lbnQoLjUpfSxzY2FsZVF1YW50aWxlOmZ1bmN0aW9uIHQoKXt2YXIgZT1bXSxuPVtdLGk9W107ZnVuY3Rpb24gcigpe3ZhciB0PTAscj1NYXRoLm1heCgxLG4ubGVuZ3RoKTtmb3IoaT1uZXcgQXJyYXkoci0xKTsrK3Q8cjspaVt0LTFdPWIwKGUsdC9yKTtyZXR1cm4gb31mdW5jdGlvbiBvKHQpe2lmKCFpc05hTih0PSt0KSlyZXR1cm4gbltkMChpLHQpXX1yZXR1cm4gby5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIHI9bi5pbmRleE9mKHQpO3JldHVybiByPDA/W05hTixOYU5dOltyPjA/aVtyLTFdOmVbMF0scjxpLmxlbmd0aD9pW3JdOmVbZS5sZW5ndGgtMV1dfSxvLmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZS5zbGljZSgpO2U9W107Zm9yKHZhciBuLGk9MCxvPXQubGVuZ3RoO2k8bzsrK2kpbnVsbD09KG49dFtpXSl8fGlzTmFOKG49K24pfHxlLnB1c2gobik7cmV0dXJuIGUuc29ydCh1MCkscigpfSxvLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPUEwLmNhbGwodCkscigpKTpuLnNsaWNlKCl9LG8ucXVhbnRpbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIGkuc2xpY2UoKX0sby5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4oZSkucmFuZ2Uobil9LG99LHNjYWxlUXVhbnRpemU6ZnVuY3Rpb24gdCgpe3ZhciBlPTAsbj0xLGk9MSxyPVsuNV0sbz1bMCwxXTtmdW5jdGlvbiBhKHQpe2lmKHQ8PXQpcmV0dXJuIG9bZDAocix0LDAsaSldfWZ1bmN0aW9uIHMoKXt2YXIgdD0tMTtmb3Iocj1uZXcgQXJyYXkoaSk7Kyt0PGk7KXJbdF09KCh0KzEpKm4tKHQtaSkqZSkvKGkrMSk7cmV0dXJuIGF9cmV0dXJuIGEuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLG49K3RbMV0scygpKTpbZSxuXX0sYS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0obz1BMC5jYWxsKHQpKS5sZW5ndGgtMSxzKCkpOm8uc2xpY2UoKX0sYS5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIGE9by5pbmRleE9mKHQpO3JldHVybiBhPDA/W05hTixOYU5dOmE8MT9bZSxyWzBdXTphPj1pP1tyW2ktMV0sbl06W3JbYS0xXSxyW2FdXX0sYS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4oW2Usbl0pLnJhbmdlKG8pfSxkNShhKX0sc2NhbGVUaHJlc2hvbGQ6ZnVuY3Rpb24gdCgpe3ZhciBlPVsuNV0sbj1bMCwxXSxpPTE7ZnVuY3Rpb24gcih0KXtpZih0PD10KXJldHVybiBuW2QwKGUsdCwwLGkpXX1yZXR1cm4gci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9QTAuY2FsbCh0KSxpPU1hdGgubWluKGUubGVuZ3RoLG4ubGVuZ3RoLTEpLHIpOmUuc2xpY2UoKX0sci5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1BMC5jYWxsKHQpLGk9TWF0aC5taW4oZS5sZW5ndGgsbi5sZW5ndGgtMSkscik6bi5zbGljZSgpfSxyLmludmVydEV4dGVudD1mdW5jdGlvbih0KXt2YXIgaT1uLmluZGV4T2YodCk7cmV0dXJuW2VbaS0xXSxlW2ldXX0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4oZSkucmFuZ2Uobil9LHJ9LHNjYWxlVGltZTpmdW5jdGlvbiBnZnQoKXtyZXR1cm4gQzQoajUsVjUsQjUsejUsTzUsUjUsSTUsQzUscjMpLmRvbWFpbihbbmV3IERhdGUoMmUzLDAsMSksbmV3IERhdGUoMmUzLDAsMildKX0sc2NhbGVVdGM6ZnVuY3Rpb24gX2Z0KCl7cmV0dXJuIEM0KFE1LFo1LFg1LHE1LFc1LEc1LEk1LEM1LG8zKS5kb21haW4oW0RhdGUuVVRDKDJlMywwLDEpLERhdGUuVVRDKDJlMywwLDIpXSl9LHNjaGVtZUNhdGVnb3J5MTA6azQsc2NoZW1lQ2F0ZWdvcnkyMGI6TDQsc2NoZW1lQ2F0ZWdvcnkyMGM6UDQsc2NoZW1lQ2F0ZWdvcnkyMDpONCxpbnRlcnBvbGF0ZUN1YmVoZWxpeERlZmF1bHQ6STQsaW50ZXJwb2xhdGVSYWluYm93OmZ1bmN0aW9uIHlmdCh0KXsodDwwfHx0PjEpJiYodC09TWF0aC5mbG9vcih0KSk7dmFyIGU9TWF0aC5hYnModC0uNSk7cmV0dXJuIHo0Lmg9MzYwKnQtMTAwLHo0LnM9MS41LTEuNSplLHo0Lmw9LjgtLjkqZSx6NCsiIn0saW50ZXJwb2xhdGVXYXJtOlI0LGludGVycG9sYXRlQ29vbDpPNCxpbnRlcnBvbGF0ZVZpcmlkaXM6QjQsaW50ZXJwb2xhdGVNYWdtYTpINCxpbnRlcnBvbGF0ZUluZmVybm86RjQsaW50ZXJwb2xhdGVQbGFzbWE6VjQsc2NhbGVTZXF1ZW50aWFsOmZ1bmN0aW9uIHQoZSl7dmFyIG49MCxpPTEscj0hMTtmdW5jdGlvbiBvKHQpe3ZhciBvPSh0LW4pLyhpLW4pO3JldHVybiBlKHI/TWF0aC5tYXgoMCxNYXRoLm1pbigxLG8pKTpvKX1yZXR1cm4gby5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3RbMF0saT0rdFsxXSxvKTpbbixpXX0sby5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hIXQsbyk6cn0sby5pbnRlcnBvbGF0b3I9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxvKTplfSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdChlKS5kb21haW4oW24saV0pLmNsYW1wKHIpfSxkNShvKX0sY3JlYXRlOmZ1bmN0aW9uIHZmdCh0KXtyZXR1cm4gdDkoWTQodCkuY2FsbChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKX0sY3JlYXRvcjpZNCxsb2NhbDpOOSxtYXRjaGVyOmU2LG1vdXNlOmZ1bmN0aW9uIGJmdCh0KXt2YXIgZT1SOSgpO3JldHVybiBlLmNoYW5nZWRUb3VjaGVzJiYoZT1lLmNoYW5nZWRUb3VjaGVzWzBdKSxPOSh0LGUpfSxuYW1lc3BhY2U6RzQsbmFtZXNwYWNlczpqNCxjbGllbnRQb2ludDpPOSxzZWxlY3Q6dDksc2VsZWN0QWxsOmZ1bmN0aW9uIHhmdCh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IEo2KFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IEo2KFtudWxsPT10P1tdOnRdLFo2KX0sc2VsZWN0aW9uOlE2LHNlbGVjdG9yOiQ0LHNlbGVjdG9yQWxsOlo0LHN0eWxlOl82LHRvdWNoOmZ1bmN0aW9uIHdmdCh0LGUsbil7YXJndW1lbnRzLmxlbmd0aDwzJiYobj1lLGU9UjkoKS5jaGFuZ2VkVG91Y2hlcyk7Zm9yKHZhciBpLHI9MCxvPWU/ZS5sZW5ndGg6MDtyPG87KytyKWlmKChpPWVbcl0pLmlkZW50aWZpZXI9PT1uKXJldHVybiBPOSh0LGkpO3JldHVybiBudWxsfSx0b3VjaGVzOmZ1bmN0aW9uIFNmdCh0LGUpe251bGw9PWUmJihlPVI5KCkudG91Y2hlcyk7Zm9yKHZhciBuPTAsaT1lP2UubGVuZ3RoOjAscj1uZXcgQXJyYXkoaSk7bjxpOysrbilyW25dPU85KHQsZVtuXSk7cmV0dXJuIHJ9LHdpbmRvdzpwNixnZXQgZXZlbnQoKXtyZXR1cm4gVTZ9LGN1c3RvbUV2ZW50OmZ1bmN0aW9uIE1mdCh0LGUsbixpKXt2YXIgcj1VNjt0LnNvdXJjZUV2ZW50PVU2LFU2PXQ7dHJ5e3JldHVybiBlLmFwcGx5KG4saSl9ZmluYWxseXtVNj1yfX0sYXJjOmZ1bmN0aW9uIEVmdCgpe3ZhciB0PW44LGU9aTgsbj1VOSgwKSxpPW51bGwscj1yOCxvPW84LGE9YTgscz1udWxsO2Z1bmN0aW9uIGwoKXt2YXIgbCxjLHU9K3QuYXBwbHkodGhpcyxhcmd1bWVudHMpLGg9K2UuYXBwbHkodGhpcyxhcmd1bWVudHMpLGQ9ci5hcHBseSh0aGlzLGFyZ3VtZW50cyktSjkscD1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1KOSxmPWo5KHAtZCksbT1wPmQ7aWYoc3x8KHM9bD1WOSgpKSxoPHUmJihjPWgsaD11LHU9YyksaD5LOSlpZihmPlE5LUs5KXMubW92ZVRvKGgqVzkoZCksaCpYOShkKSkscy5hcmMoMCwwLGgsZCxwLCFtKSx1Pks5JiYocy5tb3ZlVG8odSpXOShwKSx1Klg5KHApKSxzLmFyYygwLDAsdSxwLGQsbSkpO2Vsc2V7dmFyIGcsXyx5PWQsdj1wLGI9ZCx4PXAsdz1mLFM9ZixNPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpLzIsRT1NPks5JiYoaT8raS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6JDkodSp1K2gqaCkpLFQ9WTkoajkoaC11KS8yLCtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksQz1ULEE9VDtpZihFPks5KXt2YXIgaz1lOChFL3UqWDkoTSkpLEw9ZTgoRS9oKlg5KE0pKTsody09MiprKT5LOT8oYis9ayo9bT8xOi0xLHgtPWspOih3PTAsYj14PShkK3ApLzIpLChTLT0yKkwpPks5Pyh5Kz1MKj1tPzE6LTEsdi09TCk6KFM9MCx5PXY9KGQrcCkvMil9dmFyIFA9aCpXOSh5KSxOPWgqWDkoeSksST11Klc5KHgpLFI9dSpYOSh4KTtpZihUPks5KXt2YXIgTz1oKlc5KHYpLHo9aCpYOSh2KSxEPXUqVzkoYiksQj11Klg5KGIpO2lmKGY8Wjkpe3ZhciBIPXc+Szk/czgoUCxOLEQsQixPLHosSSxSKTpbSSxSXSxGPVAtSFswXSxWPU4tSFsxXSxVPU8tSFswXSxqPXotSFsxXSxHPTEvWDkodDgoKEYqVStWKmopLygkOShGKkYrVipWKSokOShVKlUraipqKSkpLzIpLFc9JDkoSFswXSpIWzBdK0hbMV0qSFsxXSk7Qz1ZOShULCh1LVcpLyhHLTEpKSxBPVk5KFQsKGgtVykvKEcrMSkpfX1TPks5P0E+Szk/KGc9bDgoRCxCLFAsTixoLEEsbSksXz1sOChPLHosSSxSLGgsQSxtKSxzLm1vdmVUbyhnLmN4K2cueDAxLGcuY3krZy55MDEpLEE8VD9zLmFyYyhnLmN4LGcuY3ksQSxHOShnLnkwMSxnLngwMSksRzkoXy55MDEsXy54MDEpLCFtKToocy5hcmMoZy5jeCxnLmN5LEEsRzkoZy55MDEsZy54MDEpLEc5KGcueTExLGcueDExKSwhbSkscy5hcmMoMCwwLGgsRzkoZy5jeStnLnkxMSxnLmN4K2cueDExKSxHOShfLmN5K18ueTExLF8uY3grXy54MTEpLCFtKSxzLmFyYyhfLmN4LF8uY3ksQSxHOShfLnkxMSxfLngxMSksRzkoXy55MDEsXy54MDEpLCFtKSkpOihzLm1vdmVUbyhQLE4pLHMuYXJjKDAsMCxoLHksdiwhbSkpOnMubW92ZVRvKFAsTiksdT5LOSYmdz5LOT9DPks5PyhnPWw4KEksUixPLHosdSwtQyxtKSxfPWw4KFAsTixELEIsdSwtQyxtKSxzLmxpbmVUbyhnLmN4K2cueDAxLGcuY3krZy55MDEpLEM8VD9zLmFyYyhnLmN4LGcuY3ksQyxHOShnLnkwMSxnLngwMSksRzkoXy55MDEsXy54MDEpLCFtKToocy5hcmMoZy5jeCxnLmN5LEMsRzkoZy55MDEsZy54MDEpLEc5KGcueTExLGcueDExKSwhbSkscy5hcmMoMCwwLHUsRzkoZy5jeStnLnkxMSxnLmN4K2cueDExKSxHOShfLmN5K18ueTExLF8uY3grXy54MTEpLG0pLHMuYXJjKF8uY3gsXy5jeSxDLEc5KF8ueTExLF8ueDExKSxHOShfLnkwMSxfLngwMSksIW0pKSk6cy5hcmMoMCwwLHUseCxiLG0pOnMubGluZVRvKEksUil9ZWxzZSBzLm1vdmVUbygwLDApO2lmKHMuY2xvc2VQYXRoKCksbClyZXR1cm4gcz1udWxsLGwrIiJ8fG51bGx9cmV0dXJuIGwuY2VudHJvaWQ9ZnVuY3Rpb24oKXt2YXIgbj0oK3QuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzIsaT0oK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArby5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzItWjkvMjtyZXR1cm5bVzkoaSkqbixYOShpKSpuXX0sbC5pbm5lclJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOlU5KCtlKSxsKTp0fSxsLm91dGVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VTkoK3QpLGwpOmV9LGwuY29ybmVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VTkoK3QpLGwpOm59LGwucGFkUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OlU5KCt0KSxsKTppfSxsLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpVOSgrdCksbCk6cn0sbC5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlU5KCt0KSxsKTpvfSxsLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VTkoK3QpLGwpOmF9LGwuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1udWxsPT10P251bGw6dCxsKTpzfSxsfSxhcmVhOmY4LGxpbmU6cDgscGllOmZ1bmN0aW9uIFRmdCgpe3ZhciB0PWc4LGU9bTgsbj1udWxsLGk9VTkoMCkscj1VOShROSksbz1VOSgwKTtmdW5jdGlvbiBhKGEpe3ZhciBzLGwsYyx1LGgsZD1hLmxlbmd0aCxwPTAsZj1uZXcgQXJyYXkoZCksbT1uZXcgQXJyYXkoZCksZz0raS5hcHBseSh0aGlzLGFyZ3VtZW50cyksXz1NYXRoLm1pbihROSxNYXRoLm1heCgtUTksci5hcHBseSh0aGlzLGFyZ3VtZW50cyktZykpLHk9TWF0aC5taW4oTWF0aC5hYnMoXykvZCxvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksdj15KihfPDA/LTE6MSk7Zm9yKHM9MDtzPGQ7KytzKShoPW1bZltzXT1zXT0rdChhW3NdLHMsYSkpPjAmJihwKz1oKTtmb3IobnVsbCE9ZT9mLnNvcnQoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUobVt0XSxtW25dKX0pKTpudWxsIT1uJiZmLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oYVt0XSxhW2VdKX0pKSxzPTAsYz1wPyhfLWQqdikvcDowO3M8ZDsrK3MsZz11KW1bbD1mW3NdXT17ZGF0YTphW2xdLGluZGV4OnMsdmFsdWU6aD1tW2xdLHN0YXJ0QW5nbGU6ZyxlbmRBbmdsZTp1PWcrKGg+MD9oKmM6MCkrdixwYWRBbmdsZTp5fTtyZXR1cm4gbX1yZXR1cm4gYS52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOlU5KCtlKSxhKTp0fSxhLnNvcnRWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuPW51bGwsYSk6ZX0sYS5zb3J0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZT1udWxsLGEpOm59LGEuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlU5KCt0KSxhKTppfSxhLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VTkoK3QpLGEpOnJ9LGEucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpVOSgrdCksYSk6b30sYX0sYXJlYVJhZGlhbDp3OCxyYWRpYWxBcmVhOnc4LGxpbmVSYWRpYWw6eDgscmFkaWFsTGluZTp4OCxwb2ludFJhZGlhbDpTOCxsaW5rSG9yaXpvbnRhbDpmdW5jdGlvbiBDZnQoKXtyZXR1cm4gQzgoQTgpfSxsaW5rVmVydGljYWw6ZnVuY3Rpb24gQWZ0KCl7cmV0dXJuIEM4KGs4KX0sbGlua1JhZGlhbDpmdW5jdGlvbiBrZnQoKXt2YXIgdD1DOChMOCk7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5yYWRpdXM9dC55LGRlbGV0ZSB0LnksdH0sc3ltYm9sOmZ1bmN0aW9uIExmdCgpe3ZhciB0PVU5KFA4KSxlPVU5KDY0KSxuPW51bGw7ZnVuY3Rpb24gaSgpe3ZhciBpO2lmKG58fChuPWk9VjkoKSksdC5hcHBseSh0aGlzLGFyZ3VtZW50cykuZHJhdyhuLCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksaSlyZXR1cm4gbj1udWxsLGkrIiJ8fG51bGx9cmV0dXJuIGkudHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOlU5KGUpLGkpOnR9LGkuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlU5KCt0KSxpKTplfSxpLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09dD9udWxsOnQsaSk6bn0saX0sc3ltYm9sczpYOCxzeW1ib2xDaXJjbGU6UDgsc3ltYm9sQ3Jvc3M6Tjgsc3ltYm9sRGlhbW9uZDpPOCxzeW1ib2xTcXVhcmU6Rjgsc3ltYm9sU3RhcjpIOCxzeW1ib2xUcmlhbmdsZTpVOCxzeW1ib2xXeWU6WTgsY3VydmVCYXNpc0Nsb3NlZDpmdW5jdGlvbiBQZnQodCl7cmV0dXJuIG5ldyBKOCh0KX0sY3VydmVCYXNpc09wZW46ZnVuY3Rpb24gTmZ0KHQpe3JldHVybiBuZXcgUTgodCl9LGN1cnZlQmFzaXM6ZnVuY3Rpb24gSWZ0KHQpe3JldHVybiBuZXcgWjgodCl9LGN1cnZlQnVuZGxlOmU3LGN1cnZlQ2FyZGluYWxDbG9zZWQ6YTcsY3VydmVDYXJkaW5hbE9wZW46bDcsY3VydmVDYXJkaW5hbDpyNyxjdXJ2ZUNhdG11bGxSb21DbG9zZWQ6cDcsY3VydmVDYXRtdWxsUm9tT3BlbjptNyxjdXJ2ZUNhdG11bGxSb206aDcsY3VydmVMaW5lYXJDbG9zZWQ6ZnVuY3Rpb24gUmZ0KHQpe3JldHVybiBuZXcgZzcodCl9LGN1cnZlTGluZWFyOnU4LGN1cnZlTW9ub3RvbmVYOmZ1bmN0aW9uIE9mdCh0KXtyZXR1cm4gbmV3IHg3KHQpfSxjdXJ2ZU1vbm90b25lWTpmdW5jdGlvbiB6ZnQodCl7cmV0dXJuIG5ldyB3Nyh0KX0sY3VydmVOYXR1cmFsOmZ1bmN0aW9uIERmdCh0KXtyZXR1cm4gbmV3IE03KHQpfSxjdXJ2ZVN0ZXA6ZnVuY3Rpb24gQmZ0KHQpe3JldHVybiBuZXcgVDcodCwuNSl9LGN1cnZlU3RlcEFmdGVyOmZ1bmN0aW9uIEhmdCh0KXtyZXR1cm4gbmV3IFQ3KHQsMSl9LGN1cnZlU3RlcEJlZm9yZTpmdW5jdGlvbiBGZnQodCl7cmV0dXJuIG5ldyBUNyh0LDApfSxzdGFjazpmdW5jdGlvbiBWZnQoKXt2YXIgdD1VOShbXSksZT1BNyxuPUM3LGk9azc7ZnVuY3Rpb24gcihyKXt2YXIgbyxhLHM9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksbD1yLmxlbmd0aCxjPXMubGVuZ3RoLHU9bmV3IEFycmF5KGMpO2ZvcihvPTA7bzxjOysrbyl7Zm9yKHZhciBoLGQ9c1tvXSxwPXVbb109bmV3IEFycmF5KGwpLGY9MDtmPGw7KytmKXBbZl09aD1bMCwraShyW2ZdLGQsZixyKV0saC5kYXRhPXJbZl07cC5rZXk9ZH1mb3Iobz0wLGE9ZSh1KTtvPGM7KytvKXVbYVtvXV0uaW5kZXg9bztyZXR1cm4gbih1LGEpLHV9cmV0dXJuIHIua2V5cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOlU5KE04LmNhbGwoZSkpLHIpOnR9LHIudmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpVOSgrdCkscik6aX0sci5vcmRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P0E3OiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VTkoTTguY2FsbCh0KSkscik6ZX0sci5vZmZzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09dD9DNzp0LHIpOm59LHJ9LHN0YWNrT2Zmc2V0RXhwYW5kOmZ1bmN0aW9uIFVmdCh0LGUpe2lmKChpPXQubGVuZ3RoKT4wKXtmb3IodmFyIG4saSxyLG89MCxhPXRbMF0ubGVuZ3RoO288YTsrK28pe2ZvcihyPW49MDtuPGk7KytuKXIrPXRbbl1bb11bMV18fDA7aWYocilmb3Iobj0wO248aTsrK24pdFtuXVtvXVsxXS89cn1DNyh0LGUpfX0sc3RhY2tPZmZzZXREaXZlcmdpbmc6ZnVuY3Rpb24gamZ0KHQsZSl7aWYoKHM9dC5sZW5ndGgpPjEpZm9yKHZhciBuLGkscixvLGEscyxsPTAsYz10W2VbMF1dLmxlbmd0aDtsPGM7KytsKWZvcihvPWE9MCxuPTA7bjxzOysrbikocj0oaT10W2Vbbl1dW2xdKVsxXS1pWzBdKT49MD8oaVswXT1vLGlbMV09bys9cik6cjwwPyhpWzFdPWEsaVswXT1hKz1yKTppWzBdPW99LHN0YWNrT2Zmc2V0Tm9uZTpDNyxzdGFja09mZnNldFNpbGhvdWV0dGU6ZnVuY3Rpb24gR2Z0KHQsZSl7aWYoKG49dC5sZW5ndGgpPjApe2Zvcih2YXIgbixpPTAscj10W2VbMF1dLG89ci5sZW5ndGg7aTxvOysraSl7Zm9yKHZhciBhPTAscz0wO2E8bjsrK2Epcys9dFthXVtpXVsxXXx8MDtyW2ldWzFdKz1yW2ldWzBdPS1zLzJ9QzcodCxlKX19LHN0YWNrT2Zmc2V0V2lnZ2xlOmZ1bmN0aW9uIFdmdCh0LGUpe2lmKChyPXQubGVuZ3RoKT4wJiYoaT0obj10W2VbMF1dKS5sZW5ndGgpPjApe2Zvcih2YXIgbixpLHIsbz0wLGE9MTthPGk7KythKXtmb3IodmFyIHM9MCxsPTAsYz0wO3M8cjsrK3Mpe2Zvcih2YXIgdT10W2Vbc11dLGg9dVthXVsxXXx8MCxkPShoLSh1W2EtMV1bMV18fDApKS8yLHA9MDtwPHM7KytwKXt2YXIgZj10W2VbcF1dO2QrPShmW2FdWzFdfHwwKS0oZlthLTFdWzFdfHwwKX1sKz1oLGMrPWQqaH1uW2EtMV1bMV0rPW5bYS0xXVswXT1vLGwmJihvLT1jL2wpfW5bYS0xXVsxXSs9blthLTFdWzBdPW8sQzcodCxlKX19LHN0YWNrT3JkZXJBc2NlbmRpbmc6TDcsc3RhY2tPcmRlckRlc2NlbmRpbmc6ZnVuY3Rpb24gcWZ0KHQpe3JldHVybiBMNyh0KS5yZXZlcnNlKCl9LHN0YWNrT3JkZXJJbnNpZGVPdXQ6ZnVuY3Rpb24gWWZ0KHQpe3ZhciBlLG4saT10Lmxlbmd0aCxyPXQubWFwKFA3KSxvPUE3KHQpLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHJbZV0tclt0XX0pKSxhPTAscz0wLGw9W10sYz1bXTtmb3IoZT0wO2U8aTsrK2Upbj1vW2VdLGE8cz8oYSs9cltuXSxsLnB1c2gobikpOihzKz1yW25dLGMucHVzaChuKSk7cmV0dXJuIGMucmV2ZXJzZSgpLmNvbmNhdChsKX0sc3RhY2tPcmRlck5vbmU6QTcsc3RhY2tPcmRlclJldmVyc2U6ZnVuY3Rpb24gWGZ0KHQpe3JldHVybiBBNyh0KS5yZXZlcnNlKCl9LHRpbWVJbnRlcnZhbDpSNyx0aW1lTWlsbGlzZWNvbmQ6TzcsdGltZU1pbGxpc2Vjb25kczp6Nyx1dGNNaWxsaXNlY29uZDpPNyx1dGNNaWxsaXNlY29uZHM6ejcsdGltZVNlY29uZDpVNyx0aW1lU2Vjb25kczpqNyx1dGNTZWNvbmQ6VTcsdXRjU2Vjb25kczpqNyx0aW1lTWludXRlOkc3LHRpbWVNaW51dGVzOlc3LHRpbWVIb3VyOnE3LHRpbWVIb3VyczpZNyx0aW1lRGF5Olg3LHRpbWVEYXlzOiQ3LHRpbWVXZWVrOlo3LHRpbWVXZWVrczpydHQsdGltZVN1bmRheTpaNyx0aW1lU3VuZGF5czpydHQsdGltZU1vbmRheTpKNyx0aW1lTW9uZGF5czpvdHQsdGltZVR1ZXNkYXk6UTcsdGltZVR1ZXNkYXlzOmF0dCx0aW1lV2VkbmVzZGF5OnR0dCx0aW1lV2VkbmVzZGF5czpzdHQsdGltZVRodXJzZGF5OmV0dCx0aW1lVGh1cnNkYXlzOmx0dCx0aW1lRnJpZGF5Om50dCx0aW1lRnJpZGF5czpjdHQsdGltZVNhdHVyZGF5Oml0dCx0aW1lU2F0dXJkYXlzOnV0dCx0aW1lTW9udGg6aHR0LHRpbWVNb250aHM6ZHR0LHRpbWVZZWFyOnB0dCx0aW1lWWVhcnM6ZnR0LHV0Y01pbnV0ZTptdHQsdXRjTWludXRlczpndHQsdXRjSG91cjpfdHQsdXRjSG91cnM6eXR0LHV0Y0RheTp2dHQsdXRjRGF5czpidHQsdXRjV2Vlazp3dHQsdXRjV2Vla3M6a3R0LHV0Y1N1bmRheTp3dHQsdXRjU3VuZGF5czprdHQsdXRjTW9uZGF5OlN0dCx1dGNNb25kYXlzOkx0dCx1dGNUdWVzZGF5Ok10dCx1dGNUdWVzZGF5czpQdHQsdXRjV2VkbmVzZGF5OkV0dCx1dGNXZWRuZXNkYXlzOk50dCx1dGNUaHVyc2RheTpUdHQsdXRjVGh1cnNkYXlzOkl0dCx1dGNGcmlkYXk6Q3R0LHV0Y0ZyaWRheXM6UnR0LHV0Y1NhdHVyZGF5OkF0dCx1dGNTYXR1cmRheXM6T3R0LHV0Y01vbnRoOnp0dCx1dGNNb250aHM6RHR0LHV0Y1llYXI6QnR0LHV0Y1llYXJzOkh0dCx0aW1lRm9ybWF0RGVmYXVsdExvY2FsZTpUbnQsZ2V0IHRpbWVGb3JtYXQoKXtyZXR1cm4gaGV0fSxnZXQgdGltZVBhcnNlKCl7cmV0dXJuIGRldH0sZ2V0IHV0Y0Zvcm1hdCgpe3JldHVybiBwZXR9LGdldCB1dGNQYXJzZSgpe3JldHVybiBmZXR9LHRpbWVGb3JtYXRMb2NhbGU6Y2V0LGlzb0Zvcm1hdDpMbnQsaXNvUGFyc2U6Tm50LG5vdzpVbnQsdGltZXI6V250LHRpbWVyRmx1c2g6cW50LHRpbWVvdXQ6ZnVuY3Rpb24gJGZ0KHQsZSxuKXt2YXIgaT1uZXcgR250O3JldHVybiBpLnJlc3RhcnQoKGZ1bmN0aW9uKG4pe2kuc3RvcCgpLHQobitlKX0pLGU9bnVsbD09ZT8wOitlLG4pLGl9LGludGVydmFsOmZ1bmN0aW9uIEtmdCh0LGUsbil7dmFyIGk9bmV3IEdudCxyPWU7cmV0dXJuIG51bGw9PWU/KGkucmVzdGFydCh0LGUsbiksaSk6KGU9K2Usbj1udWxsPT1uP1VudCgpOituLGkucmVzdGFydCgoZnVuY3Rpb24gbyhhKXthKz1yLGkucmVzdGFydChvLHIrPWUsbiksdChhKX0pLGUsbiksaSl9LHRyYW5zaXRpb246TmF0LGFjdGl2ZTpmdW5jdGlvbiBaZnQodCxlKXt2YXIgbixpLHI9dC5fX3RyYW5zaXRpb247aWYocilmb3IoaSBpbiBlPW51bGw9PWU/bnVsbDplKyIiLHIpaWYoKG49cltpXSkuc3RhdGU+MSYmbi5uYW1lPT09ZSlyZXR1cm4gbmV3IFBhdChbW3RdXSxuc3QsZSwraSk7cmV0dXJuIG51bGx9LGludGVycnVwdDpob3Qsdm9yb25vaTpmdW5jdGlvbiBKZnQoKXt2YXIgdD1yc3QsZT1vc3Qsbj1udWxsO2Z1bmN0aW9uIGkoaSl7cmV0dXJuIG5ldyBGc3QoaS5tYXAoKGZ1bmN0aW9uKG4scil7dmFyIG89W01hdGgucm91bmQodChuLHIsaSkvenN0KSp6c3QsTWF0aC5yb3VuZChlKG4scixpKS96c3QpKnpzdF07cmV0dXJuIG8uaW5kZXg9cixvLmRhdGE9bixvfSkpLG4pfXJldHVybiBpLnBvbHlnb25zPWZ1bmN0aW9uKHQpe3JldHVybiBpKHQpLnBvbHlnb25zKCl9LGkubGlua3M9ZnVuY3Rpb24odCl7cmV0dXJuIGkodCkubGlua3MoKX0saS50cmlhbmdsZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGkodCkudHJpYW5nbGVzKCl9LGkueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOmlzdCgrZSksaSk6dH0saS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6aXN0KCt0KSxpKTplfSxpLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P251bGw6W1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0saSk6biYmW1tuWzBdWzBdLG5bMF1bMV1dLFtuWzFdWzBdLG5bMV1bMV1dXX0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPW51bGw9PXQ/bnVsbDpbWzAsMF0sWyt0WzBdLCt0WzFdXV0saSk6biYmW25bMV1bMF0tblswXVswXSxuWzFdWzFdLW5bMF1bMV1dfSxpfSx6b29tOmZ1bmN0aW9uIFFmdCgpe3ZhciB0LGUsbj12ZHQsaT1iZHQscj1NZHQsbz13ZHQsYT1TZHQscz1bMCwxLzBdLGw9W1stMS8wLC0xLzBdLFsxLzAsMS8wXV0sYz0yNTAsdT1WdXQsaD1bXSxkPVVzdCgic3RhcnQiLCJ6b29tIiwiZW5kIikscD01MDAsZj0wO2Z1bmN0aW9uIG0odCl7dC5wcm9wZXJ0eSgiX196b29tIix4ZHQpLm9uKCJ3aGVlbC56b29tIix3KS5vbigibW91c2Vkb3duLnpvb20iLFMpLm9uKCJkYmxjbGljay56b29tIixNKS5maWx0ZXIoYSkub24oInRvdWNoc3RhcnQuem9vbSIsRSkub24oInRvdWNobW92ZS56b29tIixUKS5vbigidG91Y2hlbmQuem9vbSB0b3VjaGNhbmNlbC56b29tIixDKS5zdHlsZSgidG91Y2gtYWN0aW9uIiwibm9uZSIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIil9ZnVuY3Rpb24gZyh0LGUpe3JldHVybihlPU1hdGgubWF4KHNbMF0sTWF0aC5taW4oc1sxXSxlKSkpPT09dC5rP3Q6bmV3IGRkdChlLHQueCx0LnkpfWZ1bmN0aW9uIF8odCxlLG4pe3ZhciBpPWVbMF0tblswXSp0Lmsscj1lWzFdLW5bMV0qdC5rO3JldHVybiBpPT09dC54JiZyPT09dC55P3Q6bmV3IGRkdCh0LmssaSxyKX1mdW5jdGlvbiB5KHQpe3JldHVyblsoK3RbMF1bMF0rICt0WzFdWzBdKS8yLCgrdFswXVsxXSsgK3RbMV1bMV0pLzJdfWZ1bmN0aW9uIHYodCxlLG4pe3Qub24oInN0YXJ0Lnpvb20iLChmdW5jdGlvbigpe2IodGhpcyxhcmd1bWVudHMpLnN0YXJ0KCl9KSkub24oImludGVycnVwdC56b29tIGVuZC56b29tIiwoZnVuY3Rpb24oKXtiKHRoaXMsYXJndW1lbnRzKS5lbmQoKX0pKS50d2Vlbigiem9vbSIsKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxyPWFyZ3VtZW50cyxvPWIodCxyKSxhPWkuYXBwbHkodCxyKSxzPW58fHkoYSksbD1NYXRoLm1heChhWzFdWzBdLWFbMF1bMF0sYVsxXVsxXS1hWzBdWzFdKSxjPXQuX196b29tLGg9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0LHIpOmUsZD11KGMuaW52ZXJ0KHMpLmNvbmNhdChsL2MuayksaC5pbnZlcnQocykuY29uY2F0KGwvaC5rKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKDE9PT10KXQ9aDtlbHNle3ZhciBlPWQodCksbj1sL2VbMl07dD1uZXcgZGR0KG4sc1swXS1lWzBdKm4sc1sxXS1lWzFdKm4pfW8uem9vbShudWxsLHQpfX0pKX1mdW5jdGlvbiBiKHQsZSl7Zm9yKHZhciBuLGk9MCxyPWgubGVuZ3RoO2k8cjsrK2kpaWYoKG49aFtpXSkudGhhdD09PXQpcmV0dXJuIG47cmV0dXJuIG5ldyB4KHQsZSl9ZnVuY3Rpb24geCh0LGUpe3RoaXMudGhhdD10LHRoaXMuYXJncz1lLHRoaXMuaW5kZXg9LTEsdGhpcy5hY3RpdmU9MCx0aGlzLmV4dGVudD1pLmFwcGx5KHQsZSl9ZnVuY3Rpb24gdygpe2lmKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdD1iKHRoaXMsYXJndW1lbnRzKSxlPXRoaXMuX196b29tLGk9TWF0aC5tYXgoc1swXSxNYXRoLm1pbihzWzFdLGUuaypNYXRoLnBvdygyLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpKSkpLGE9b2N0KHRoaXMpO2lmKHQud2hlZWwpdC5tb3VzZVswXVswXT09PWFbMF0mJnQubW91c2VbMF1bMV09PT1hWzFdfHwodC5tb3VzZVsxXT1lLmludmVydCh0Lm1vdXNlWzBdPWEpKSxjbGVhclRpbWVvdXQodC53aGVlbCk7ZWxzZXtpZihlLms9PT1pKXJldHVybjt0Lm1vdXNlPVthLGUuaW52ZXJ0KGEpXSxkaHQodGhpcyksdC5zdGFydCgpfXlkdCgpLHQud2hlZWw9c2V0VGltZW91dChjLDE1MCksdC56b29tKCJtb3VzZSIscihfKGcoZSxpKSx0Lm1vdXNlWzBdLHQubW91c2VbMV0pLHQuZXh0ZW50LGwpKX1mdW5jdGlvbiBjKCl7dC53aGVlbD1udWxsLHQuZW5kKCl9fWZ1bmN0aW9uIFMoKXtpZighZSYmbi5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciB0PWIodGhpcyxhcmd1bWVudHMpLGk9bmN0KEdsdC52aWV3KS5vbigibW91c2Vtb3ZlLnpvb20iLGMsITApLm9uKCJtb3VzZXVwLnpvb20iLHUsITApLG89b2N0KHRoaXMpLGE9R2x0LmNsaWVudFgscz1HbHQuY2xpZW50WTtsY3QoR2x0LnZpZXcpLF9kdCgpLHQubW91c2U9W28sdGhpcy5fX3pvb20uaW52ZXJ0KG8pXSxkaHQodGhpcyksdC5zdGFydCgpfWZ1bmN0aW9uIGMoKXtpZih5ZHQoKSwhdC5tb3ZlZCl7dmFyIGU9R2x0LmNsaWVudFgtYSxuPUdsdC5jbGllbnRZLXM7dC5tb3ZlZD1lKmUrbipuPmZ9dC56b29tKCJtb3VzZSIscihfKHQudGhhdC5fX3pvb20sdC5tb3VzZVswXT1vY3QodC50aGF0KSx0Lm1vdXNlWzFdKSx0LmV4dGVudCxsKSl9ZnVuY3Rpb24gdSgpe2kub24oIm1vdXNlbW92ZS56b29tIG1vdXNldXAuem9vbSIsbnVsbCksY2N0KEdsdC52aWV3LHQubW92ZWQpLHlkdCgpLHQuZW5kKCl9fWZ1bmN0aW9uIE0oKXtpZihuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIHQ9dGhpcy5fX3pvb20sZT1vY3QodGhpcyksbz10LmludmVydChlKSxhPXQuayooR2x0LnNoaWZ0S2V5Py41OjIpLHM9cihfKGcodCxhKSxlLG8pLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpLGwpO3lkdCgpLGM+MD9uY3QodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKGMpLmNhbGwodixzLGUpOm5jdCh0aGlzKS5jYWxsKG0udHJhbnNmb3JtLHMpfX1mdW5jdGlvbiBFKCl7aWYobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBlLGkscixvLGE9Yih0aGlzLGFyZ3VtZW50cykscz1HbHQuY2hhbmdlZFRvdWNoZXMsbD1zLmxlbmd0aDtmb3IoX2R0KCksaT0wO2k8bDsrK2kpbz1bbz1hY3QodGhpcyxzLChyPXNbaV0pLmlkZW50aWZpZXIpLHRoaXMuX196b29tLmludmVydChvKSxyLmlkZW50aWZpZXJdLGEudG91Y2gwP2EudG91Y2gxfHwoYS50b3VjaDE9byk6KGEudG91Y2gwPW8sZT0hMCk7aWYodCYmKHQ9Y2xlYXJUaW1lb3V0KHQpLCFhLnRvdWNoMSkpcmV0dXJuIGEuZW5kKCksdm9pZCgobz1uY3QodGhpcykub24oImRibGNsaWNrLnpvb20iKSkmJm8uYXBwbHkodGhpcyxhcmd1bWVudHMpKTtlJiYodD1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3Q9bnVsbH0pLHApLGRodCh0aGlzKSxhLnN0YXJ0KCkpfX1mdW5jdGlvbiBUKCl7dmFyIGUsbixpLG8sYT1iKHRoaXMsYXJndW1lbnRzKSxzPUdsdC5jaGFuZ2VkVG91Y2hlcyxjPXMubGVuZ3RoO2Zvcih5ZHQoKSx0JiYodD1jbGVhclRpbWVvdXQodCkpLGU9MDtlPGM7KytlKWk9YWN0KHRoaXMscywobj1zW2VdKS5pZGVudGlmaWVyKSxhLnRvdWNoMCYmYS50b3VjaDBbMl09PT1uLmlkZW50aWZpZXI/YS50b3VjaDBbMF09aTphLnRvdWNoMSYmYS50b3VjaDFbMl09PT1uLmlkZW50aWZpZXImJihhLnRvdWNoMVswXT1pKTtpZihuPWEudGhhdC5fX3pvb20sYS50b3VjaDEpe3ZhciB1PWEudG91Y2gwWzBdLGg9YS50b3VjaDBbMV0sZD1hLnRvdWNoMVswXSxwPWEudG91Y2gxWzFdLGY9KGY9ZFswXS11WzBdKSpmKyhmPWRbMV0tdVsxXSkqZixtPShtPXBbMF0taFswXSkqbSsobT1wWzFdLWhbMV0pKm07bj1nKG4sTWF0aC5zcXJ0KGYvbSkpLGk9Wyh1WzBdK2RbMF0pLzIsKHVbMV0rZFsxXSkvMl0sbz1bKGhbMF0rcFswXSkvMiwoaFsxXStwWzFdKS8yXX1lbHNle2lmKCFhLnRvdWNoMClyZXR1cm47aT1hLnRvdWNoMFswXSxvPWEudG91Y2gwWzFdfWEuem9vbSgidG91Y2giLHIoXyhuLGksbyksYS5leHRlbnQsbCkpfWZ1bmN0aW9uIEMoKXt2YXIgdCxuLGk9Yih0aGlzLGFyZ3VtZW50cykscj1HbHQuY2hhbmdlZFRvdWNoZXMsbz1yLmxlbmd0aDtmb3IoX2R0KCksZSYmY2xlYXJUaW1lb3V0KGUpLGU9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtlPW51bGx9KSxwKSx0PTA7dDxvOysrdCluPXJbdF0saS50b3VjaDAmJmkudG91Y2gwWzJdPT09bi5pZGVudGlmaWVyP2RlbGV0ZSBpLnRvdWNoMDppLnRvdWNoMSYmaS50b3VjaDFbMl09PT1uLmlkZW50aWZpZXImJmRlbGV0ZSBpLnRvdWNoMTtpLnRvdWNoMSYmIWkudG91Y2gwJiYoaS50b3VjaDA9aS50b3VjaDEsZGVsZXRlIGkudG91Y2gxKSxpLnRvdWNoMD9pLnRvdWNoMFsxXT10aGlzLl9fem9vbS5pbnZlcnQoaS50b3VjaDBbMF0pOmkuZW5kKCl9cmV0dXJuIG0udHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5zZWxlY3Rpb24/dC5zZWxlY3Rpb24oKTp0O24ucHJvcGVydHkoIl9fem9vbSIseGR0KSx0IT09bj92KHQsZSk6bi5pbnRlcnJ1cHQoKS5lYWNoKChmdW5jdGlvbigpe2IodGhpcyxhcmd1bWVudHMpLnN0YXJ0KCkuem9vbShudWxsLCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUpLmVuZCgpfSkpfSxtLnNjYWxlQnk9ZnVuY3Rpb24odCxlKXttLnNjYWxlVG8odCwoZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9fem9vbS5rLG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZTtyZXR1cm4gdCpufSkpfSxtLnNjYWxlVG89ZnVuY3Rpb24odCxlKXttLnRyYW5zZm9ybSh0LChmdW5jdGlvbigpe3ZhciB0PWkuYXBwbHkodGhpcyxhcmd1bWVudHMpLG49dGhpcy5fX3pvb20sbz15KHQpLGE9bi5pbnZlcnQobykscz0iZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplO3JldHVybiByKF8oZyhuLHMpLG8sYSksdCxsKX0pKX0sbS50cmFuc2xhdGVCeT1mdW5jdGlvbih0LGUsbil7bS50cmFuc2Zvcm0odCwoZnVuY3Rpb24oKXtyZXR1cm4gcih0aGlzLl9fem9vbS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZSwiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuKSxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxsKX0pKX0sbS50cmFuc2xhdGVUbz1mdW5jdGlvbih0LGUsbil7bS50cmFuc2Zvcm0odCwoZnVuY3Rpb24oKXt2YXIgdD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxvPXRoaXMuX196b29tLGE9eSh0KTtyZXR1cm4gcihtZHQudHJhbnNsYXRlKGFbMF0sYVsxXSkuc2NhbGUoby5rKS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIGU/LWUuYXBwbHkodGhpcyxhcmd1bWVudHMpOi1lLCJmdW5jdGlvbiI9PXR5cGVvZiBuPy1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTotbiksdCxsKX0pKX0seC5wcm90b3R5cGU9e3N0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLmluZGV4PWgucHVzaCh0aGlzKS0xLHRoaXMuZW1pdCgic3RhcnQiKSksdGhpc30sem9vbTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm1vdXNlJiYibW91c2UiIT09dCYmKHRoaXMubW91c2VbMV09ZS5pbnZlcnQodGhpcy5tb3VzZVswXSkpLHRoaXMudG91Y2gwJiYidG91Y2giIT09dCYmKHRoaXMudG91Y2gwWzFdPWUuaW52ZXJ0KHRoaXMudG91Y2gwWzBdKSksdGhpcy50b3VjaDEmJiJ0b3VjaCIhPT10JiYodGhpcy50b3VjaDFbMV09ZS5pbnZlcnQodGhpcy50b3VjaDFbMF0pKSx0aGlzLnRoYXQuX196b29tPWUsdGhpcy5lbWl0KCJ6b29tIiksdGhpc30sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PS0tdGhpcy5hY3RpdmUmJihoLnNwbGljZSh0aGlzLmluZGV4LDEpLHRoaXMuaW5kZXg9LTEsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXshKGZ1bmN0aW9uIGUodCxuLGkscil7dmFyIG89R2x0O3Quc291cmNlRXZlbnQ9R2x0LEdsdD10O3RyeXtuLmFwcGx5KGkscil9ZmluYWxseXtHbHQ9b319KShuZXcgaGR0KG0sdCx0aGlzLnRoYXQuX196b29tKSxkLmFwcGx5LGQsW3QsdGhpcy50aGF0LHRoaXMuYXJnc10pfX0sbS53aGVlbERlbHRhPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dWR0KCt0KSxtKTpvfSxtLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnVkdCghIXQpLG0pOm59LG0udG91Y2hhYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dWR0KCEhdCksbSk6YX0sbS5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp1ZHQoW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLG0pOml9LG0uc2NhbGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHNbMF09K3RbMF0sc1sxXT0rdFsxXSxtKTpbc1swXSxzWzFdXX0sbS50cmFuc2xhdGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGxbMF1bMF09K3RbMF1bMF0sbFsxXVswXT0rdFsxXVswXSxsWzBdWzFdPSt0WzBdWzFdLGxbMV1bMV09K3RbMV1bMV0sbSk6W1tsWzBdWzBdLGxbMF1bMV1dLFtsWzFdWzBdLGxbMV1bMV1dXX0sbS5jb25zdHJhaW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxtKTpyfSxtLmR1cmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSt0LG0pOmN9LG0uaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxtKTp1fSxtLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9ZC5vbi5hcHBseShkLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1kP206dH0sbS5jbGlja0Rpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSh0PSt0KSp0LG0pOk1hdGguc3FydChmKX0sbX0sem9vbVRyYW5zZm9ybTpnZHQsem9vbUlkZW50aXR5Om1kdH0pKTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKgogICAgICogQGZpbGVvdmVydmlldyBtYW51YWxseSBhZGQgZDMtc2VsZWN0aW9uLW11bHRpIHRvIGQzIGRlZmF1bHQgYnVuZGxlLiBNb3N0IG9mIHRoaXMgY29kZSBpcwogICAgICogY29waWVkIGZyb20gZDMtc2VsZWN0aW9uLW11bHRpQDEuMC4wLgogICAgICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1zZWxlY3Rpb24tbXVsdGkvaXNzdWVzLzExIGZvciB3aHkgd2UgaGF2ZSB0byBkbyB0aGlzCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgdG10PUVkdCxlbXQ9RWR0O2Z1bmN0aW9uIG5tdCh0LGUpe3JldHVybiB0LmVhY2goKGZ1bmN0aW9uKCl7dmFyIHQ9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksbj10bXQuc2VsZWN0KHRoaXMpO2Zvcih2YXIgaSBpbiB0KW4uYXR0cihpLHRbaV0pfSkpfWZ1bmN0aW9uIGltdCh0LGUpe2Zvcih2YXIgbiBpbiBlKXQuYXR0cihuLGVbbl0pO3JldHVybiB0fWZ1bmN0aW9uIHJtdCh0LGUsbil7cmV0dXJuIHQuZWFjaCgoZnVuY3Rpb24oKXt2YXIgdD1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxpPXRtdC5zZWxlY3QodGhpcyk7Zm9yKHZhciByIGluIHQpaS5zdHlsZShyLHRbcl0sbil9KSl9ZnVuY3Rpb24gb210KHQsZSxuKXtmb3IodmFyIGkgaW4gZSl0LnN0eWxlKGksZVtpXSxuKTtyZXR1cm4gdH1mdW5jdGlvbiBhbXQodCxlKXtyZXR1cm4gdC5lYWNoKChmdW5jdGlvbigpe3ZhciB0PWUuYXBwbHkodGhpcyxhcmd1bWVudHMpLG49dG10LnNlbGVjdCh0aGlzKTtmb3IodmFyIGkgaW4gdCluLnByb3BlcnR5KGksdFtpXSl9KSl9ZnVuY3Rpb24gc210KHQsZSl7Zm9yKHZhciBuIGluIGUpdC5wcm9wZXJ0eShuLGVbbl0pO3JldHVybiB0fWZ1bmN0aW9uIGxtdCh0LGUpe3JldHVybiB0LmVhY2goKGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksaT10bXQuc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24odCk7Zm9yKHZhciByIGluIG4paS5hdHRyKHIsbltyXSl9KSl9ZnVuY3Rpb24gY210KHQsZSl7Zm9yKHZhciBuIGluIGUpdC5hdHRyKG4sZVtuXSk7cmV0dXJuIHR9ZnVuY3Rpb24gdW10KHQsZSxuKXtyZXR1cm4gdC5lYWNoKChmdW5jdGlvbigpe3ZhciBpPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHI9dG10LnNlbGVjdCh0aGlzKS50cmFuc2l0aW9uKHQpO2Zvcih2YXIgbyBpbiBpKXIuc3R5bGUobyxpW29dLG4pfSkpfWZ1bmN0aW9uIGhtdCh0LGUsbil7Zm9yKHZhciBpIGluIGUpdC5zdHlsZShpLGVbaV0sbik7cmV0dXJuIHR9dG10LnNlbGVjdGlvbi5wcm90b3R5cGUuYXR0cnM9ZnVuY3Rpb24gZG10KHQpe3JldHVybigiZnVuY3Rpb24iPT10eXBlb2YgdD9ubXQ6aW10KSh0aGlzLHQpfSx0bXQuc2VsZWN0aW9uLnByb3RvdHlwZS5zdHlsZXM9ZnVuY3Rpb24gcG10KHQsZSl7cmV0dXJuKCJmdW5jdGlvbiI9PXR5cGVvZiB0P3JtdDpvbXQpKHRoaXMsdCxudWxsPT1lPyIiOmUpfSx0bXQuc2VsZWN0aW9uLnByb3RvdHlwZS5wcm9wZXJ0aWVzPWZ1bmN0aW9uIGZtdCh0KXtyZXR1cm4oImZ1bmN0aW9uIj09dHlwZW9mIHQ/YW10OnNtdCkodGhpcyx0KX0sZW10LnRyYW5zaXRpb24ucHJvdG90eXBlLmF0dHJzPWZ1bmN0aW9uIG1tdCh0KXtyZXR1cm4oImZ1bmN0aW9uIj09dHlwZW9mIHQ/bG10OmNtdCkodGhpcyx0KX0sZW10LnRyYW5zaXRpb24ucHJvdG90eXBlLnN0eWxlcz1mdW5jdGlvbiBnbXQodCxlKXtyZXR1cm4oImZ1bmN0aW9uIj09dHlwZW9mIHQ/dW10OmhtdCkodGhpcyx0LG51bGw9PWU/IiI6ZSl9O3ZhciBfbXQ9e30seW10PXt9LHZtdD1iZSh2bSksYm10PXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShibXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB4bXQ9RWR0O2JtdC5jb2VyY2VFeHRlcm5hbEQzPWZ1bmN0aW9uIHdtdCh0KXtpZihudWxsPT10LmF0dHJzKXtpZihudWxsPT10Lm5vZGVzKXt2YXIgZT1bXTtyZXR1cm4gdC5lYWNoKChmdW5jdGlvbigpe2UucHVzaCh0aGlzKX0pKSx4bXQuc2VsZWN0QWxsKGUpfXJldHVybiB4bXQuc2VsZWN0QWxsKHQubm9kZXMoKSl9cmV0dXJuIHR9O3ZhciBTbXQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KFNtdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksU210Lm1ha2VFbnVtPWZ1bmN0aW9uIE1tdCh0KXtyZXR1cm4gdC5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbZV09ZSx0fSkse30pfSwKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHltdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIEVtdD1ibXQsVG10PXtsaW5lYXI6dm10LmVhc2VMaW5lYXIscXVhZDp2bXQuZWFzZVF1YWQscXVhZEluOnZtdC5lYXNlUXVhZEluLHF1YWRPdXQ6dm10LmVhc2VRdWFkT3V0LHF1YWRJbk91dDp2bXQuZWFzZVF1YWRJbk91dCxjdWJpYzp2bXQuZWFzZUN1YmljLGN1YmljSW46dm10LmVhc2VDdWJpY0luLGN1YmljT3V0OnZtdC5lYXNlQ3ViaWNPdXQsY3ViaWNJbk91dDp2bXQuZWFzZUN1YmljSW5PdXQscG9seTp2bXQuZWFzZVBvbHkscG9seUluOnZtdC5lYXNlUG9seUluLHBvbHlPdXQ6dm10LmVhc2VQb2x5T3V0LHBvbHlJbk91dDp2bXQuZWFzZVBvbHlJbk91dCxzaW46dm10LmVhc2VTaW4sc2luSW46dm10LmVhc2VTaW5JbixzaW5PdXQ6dm10LmVhc2VTaW5PdXQsc2luSW5PdXQ6dm10LmVhc2VTaW5Jbk91dCxleHA6dm10LmVhc2VFeHAsZXhwSW46dm10LmVhc2VFeHBJbixleHBPdXQ6dm10LmVhc2VFeHBPdXQsZXhwSW5PdXQ6dm10LmVhc2VFeHBJbk91dCxjaXJjbGU6dm10LmVhc2VDaXJjbGUsY2lyY2xlSW46dm10LmVhc2VDaXJjbGVJbixjaXJjbGVPdXQ6dm10LmVhc2VDaXJjbGVPdXQsY2lyY2xlSW5PdXQ6dm10LmVhc2VDaXJjbGVJbk91dCxib3VuY2U6dm10LmVhc2VCb3VuY2UsYm91bmNlSW46dm10LmVhc2VCb3VuY2VJbixib3VuY2VPdXQ6dm10LmVhc2VCb3VuY2VPdXQsYm91bmNlSW5PdXQ6dm10LmVhc2VCb3VuY2VJbk91dCxiYWNrOnZtdC5lYXNlQmFjayxiYWNrSW46dm10LmVhc2VCYWNrSW4sYmFja091dDp2bXQuZWFzZUJhY2tPdXQsYmFja0luT3V0OnZtdC5lYXNlQmFja0luT3V0LGVsYXN0aWM6dm10LmVhc2VFbGFzdGljLGVsYXN0aWNJbjp2bXQuZWFzZUVsYXN0aWNJbixlbGFzdGljT3V0OnZtdC5lYXNlRWxhc3RpY091dCxlbGFzdGljSW5PdXQ6dm10LmVhc2VFbGFzdGljSW5PdXR9O3ltdC5FYXNlTmFtZT1TbXQubWFrZUVudW0oWyJsaW5lYXIiLCJxdWFkIiwicXVhZEluIiwicXVhZE91dCIsInF1YWRJbk91dCIsImN1YmljIiwiY3ViaWNJbiIsImN1YmljT3V0IiwiY3ViaWNJbk91dCIsInBvbHkiLCJwb2x5SW4iLCJwb2x5T3V0IiwicG9seUluT3V0Iiwic2luIiwic2luSW4iLCJzaW5PdXQiLCJzaW5Jbk91dCIsImV4cCIsImV4cEluIiwiZXhwT3V0IiwiZXhwSW5PdXQiLCJjaXJjbGUiLCJjaXJjbGVJbiIsImNpcmNsZU91dCIsImNpcmNsZUluT3V0IiwiYm91bmNlIiwiYm91bmNlSW4iLCJib3VuY2VPdXQiLCJib3VuY2VJbk91dCIsImJhY2siLCJiYWNrSW4iLCJiYWNrT3V0IiwiYmFja0luT3V0IiwiZWxhc3RpYyIsImVsYXN0aWNJbiIsImVsYXN0aWNPdXQiLCJlbGFzdGljSW5PdXQiXSk7dmFyIENtdD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fc3RhcnREZWxheT10Ll9ERUZBVUxUX1NUQVJUX0RFTEFZX01JTExJU0VDT05EUyx0aGlzLl9zdGVwRHVyYXRpb249dC5fREVGQVVMVF9TVEVQX0RVUkFUSU9OX01JTExJU0VDT05EUyx0aGlzLl9zdGVwRGVsYXk9dC5fREVGQVVMVF9JVEVSQVRJVkVfREVMQVlfTUlMTElTRUNPTkRTLHRoaXMuX21heFRvdGFsRHVyYXRpb249dC5fREVGQVVMVF9NQVhfVE9UQUxfRFVSQVRJT05fTUlMTElTRUNPTkRTLHRoaXMuX2Vhc2luZ01vZGU9dC5fREVGQVVMVF9FQVNJTkdfTU9ERX1yZXR1cm4gdC5wcm90b3R5cGUudG90YWxUaW1lPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2dldEFkanVzdGVkSXRlcmF0aXZlRGVsYXkodCk7cmV0dXJuIHRoaXMuc3RhcnREZWxheSgpK2UqTWF0aC5tYXgodC0xLDApK3RoaXMuc3RlcER1cmF0aW9uKCl9LHQucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLGk9KHQ9RW10LmNvZXJjZUV4dGVybmFsRDModCkpLnNpemUoKSxyPXRoaXMuX2dldEFkanVzdGVkSXRlcmF0aXZlRGVsYXkoaSk7cmV0dXJuIHQudHJhbnNpdGlvbigpLmVhc2UodGhpcy5fZ2V0RWFzZUZhY3RvcnkoKSkuZHVyYXRpb24odGhpcy5zdGVwRHVyYXRpb24oKSkuZGVsYXkoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uc3RhcnREZWxheSgpK3IqZX0pKS5hdHRycyhlKX0sdC5wcm90b3R5cGUuc3RhcnREZWxheT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9zdGFydERlbGF5Oih0aGlzLl9zdGFydERlbGF5PXQsdGhpcyl9LHQucHJvdG90eXBlLnN0ZXBEdXJhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9NYXRoLm1pbih0aGlzLl9zdGVwRHVyYXRpb24sdGhpcy5fbWF4VG90YWxEdXJhdGlvbik6KHRoaXMuX3N0ZXBEdXJhdGlvbj10LHRoaXMpfSx0LnByb3RvdHlwZS5zdGVwRGVsYXk9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fc3RlcERlbGF5Oih0aGlzLl9zdGVwRGVsYXk9dCx0aGlzKX0sdC5wcm90b3R5cGUubWF4VG90YWxEdXJhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9tYXhUb3RhbER1cmF0aW9uOih0aGlzLl9tYXhUb3RhbER1cmF0aW9uPXQsdGhpcyl9LHQucHJvdG90eXBlLmVhc2luZ01vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZWFzaW5nTW9kZToodGhpcy5fZWFzaW5nTW9kZT10LHRoaXMpfSx0LnByb3RvdHlwZS5fZ2V0RWFzZUZhY3Rvcnk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVhc2luZ01vZGUoKTtpZigic3RyaW5nIj09dHlwZW9mIHQpe3ZhciBlPVRtdFt0XTtyZXR1cm4gbnVsbD09ZT9UbXQubGluZWFyOmV9cmV0dXJuIHR9LHQucHJvdG90eXBlLl9nZXRBZGp1c3RlZEl0ZXJhdGl2ZURlbGF5PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubWF4VG90YWxEdXJhdGlvbigpLXRoaXMuc3RlcER1cmF0aW9uKCksbj0oZT1NYXRoLm1heChlLDApKS9NYXRoLm1heCh0LTEsMSk7cmV0dXJuIE1hdGgubWluKHRoaXMuc3RlcERlbGF5KCksbil9LHQuX0RFRkFVTFRfU1RBUlRfREVMQVlfTUlMTElTRUNPTkRTPTAsdC5fREVGQVVMVF9TVEVQX0RVUkFUSU9OX01JTExJU0VDT05EUz0zMDAsdC5fREVGQVVMVF9JVEVSQVRJVkVfREVMQVlfTUlMTElTRUNPTkRTPTE1LHQuX0RFRkFVTFRfTUFYX1RPVEFMX0RVUkFUSU9OX01JTExJU0VDT05EUz0xLzAsdC5fREVGQVVMVF9FQVNJTkdfTU9ERT0iZXhwT3V0Iix0fSkoKTt5bXQuRWFzaW5nPUNtdDt2YXIgQW10PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShBbXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBrbXQ9Ym10LExtdD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS50b3RhbFRpbWU9ZnVuY3Rpb24odCl7cmV0dXJuIDB9LHQucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4odD1rbXQuY29lcmNlRXh0ZXJuYWxEMyh0KSkuYXR0cnMoZSl9LHR9KSgpO0FtdC5OdWxsPUxtdCwoZnVuY3Rpb24odCl7Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZT11TztlLl9fZXhwb3J0U3Rhcih5bXQsdCksZS5fX2V4cG9ydFN0YXIoQW10LHQpfSkoX210KTt2YXIgUG10PXt9LE5tdD17fSxJbXQ9e30sUm10PXt9LE9tdD17fSx6bXQ9e30sRG10PXt9LEJtdD17fSxIbXQ9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KEhtdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIEZtdD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuY2FjaGU9e30sdGhpcy5jb21wdXRlPXR9cmV0dXJuIHQucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jYWNoZS5oYXNPd25Qcm9wZXJ0eSh0KXx8KHRoaXMuY2FjaGVbdF09dGhpcy5jb21wdXRlKHQpKSx0aGlzLmNhY2hlW3RdfSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNhY2hlPXt9LHRoaXN9LHR9KSgpO0htdC5DYWNoZT1GbXQ7dmFyIFZtdD17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVm10LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgVW10PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQuYXJyYXlFcT1mdW5jdGlvbih0LGUpe2lmKG51bGw9PXR8fG51bGw9PWUpcmV0dXJuIHQ9PT1lO2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspaWYodFtuXSE9PWVbbl0pcmV0dXJuITE7cmV0dXJuITB9LHQub2JqRXE9ZnVuY3Rpb24oZSxuKXtpZihudWxsPT1lfHxudWxsPT1uKXJldHVybiBlPT09bjt2YXIgaT1PYmplY3Qua2V5cyhlKS5zb3J0KCkscj1PYmplY3Qua2V5cyhuKS5zb3J0KCksbz1pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGVbdF19KSksYT1yLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIG5bdF19KSk7cmV0dXJuIHQuYXJyYXlFcShpLHIpJiZ0LmFycmF5RXEobyxhKX0sdC5zdHJpY3RFcT1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZX0sdC5kZWZhdWx0cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZVtuLTFdPWFyZ3VtZW50c1tuXTtpZihudWxsPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCIpO3ZhciBpPU9iamVjdCh0KTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbih0KXtpZihudWxsIT10KWZvcih2YXIgZSBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpJiYoaVtlXT10W2VdKX0pKSxpfSx0fSkoKTtWbXQuTWV0aG9kcz1VbXQ7dmFyIGptdD17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoam10LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgR210PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQuY29tYmluZVdoaXRlc3BhY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZSgvWyBcdF0rL2csIiAiKX0sdC5pc05vdEVtcHR5U3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0JiYiIiE9PXQudHJpbSgpfSx0LnRyaW1TdGFydD1mdW5jdGlvbihlLG4pe2lmKCFlKXJldHVybiBlO3ZhciBpPWUuc3BsaXQoIiIpLHI9bj9mdW5jdGlvbihlKXtyZXR1cm4gZS5zcGxpdChuKS5zb21lKHQuaXNOb3RFbXB0eVN0cmluZyl9OnQuaXNOb3RFbXB0eVN0cmluZztyZXR1cm4gaS5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIodCtlKT90K2U6dH0pLCIiKX0sdC50cmltRW5kPWZ1bmN0aW9uKGUsbil7aWYoIWUpcmV0dXJuIGU7dmFyIGk9ZS5zcGxpdCgiIik7cmV0dXJuIGkucmV2ZXJzZSgpLChpPXQudHJpbVN0YXJ0KGkuam9pbigiIiksbikuc3BsaXQoIiIpKS5yZXZlcnNlKCksaS5qb2luKCIiKX0sdH0pKCk7am10LlN0cmluZ01ldGhvZHM9R210O3ZhciBXbXQ9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KFdtdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHFtdD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5Xb3JkRGl2aWRlclJlZ0V4cD1uZXcgUmVnRXhwKCJcXFciKSx0aGlzLldoaXRlc3BhY2VSZWdFeHA9bmV3IFJlZ0V4cCgiXFxzIil9cmV0dXJuIHQucHJvdG90eXBlLnRva2VuaXplPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7cmV0dXJuIHQuc3BsaXQoIiIpLnJlZHVjZSgoZnVuY3Rpb24odCxuKXtyZXR1cm4gdC5zbGljZSgwLC0xKS5jb25jYXQoZS5zaG91bGRDcmVhdGVOZXdUb2tlbih0W3QubGVuZ3RoLTFdLG4pKX0pLFsiIl0pfSx0LnByb3RvdHlwZS5zaG91bGRDcmVhdGVOZXdUb2tlbj1mdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybltlXTt2YXIgbj10W3QubGVuZ3RoLTFdO3JldHVybiB0aGlzLldoaXRlc3BhY2VSZWdFeHAudGVzdChuKSYmdGhpcy5XaGl0ZXNwYWNlUmVnRXhwLnRlc3QoZSk/W3QrZV06dGhpcy5XaGl0ZXNwYWNlUmVnRXhwLnRlc3Qobil8fHRoaXMuV2hpdGVzcGFjZVJlZ0V4cC50ZXN0KGUpP1t0LGVdOnRoaXMuV29yZERpdmlkZXJSZWdFeHAudGVzdChuKT9uPT09ZT9bdCtlXTpbdCxlXTpbdCtlXX0sdH0pKCk7V210LlRva2VuaXplcj1xbXQsKGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7Zm9yKHZhciBuIGluIGUpdC5oYXNPd25Qcm9wZXJ0eShuKXx8KHRbbl09ZVtuXSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUoSG10KSxlKFZtdCksZShqbXQpLGUoV210KX0pKEJtdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KERtdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFltdD1CbXQsWG10PXt0ZXh0Um90YXRpb246MCx0ZXh0U2hlYXI6MCx4QWxpZ246ImxlZnQiLHlBbGlnbjoidG9wIn0sJG10PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4pe3RoaXMuX21lYXN1cmVyPXQsdGhpcy5fcGVuRmFjdG9yeT1lLHRoaXMuX3dyYXBwZXI9bn1yZXR1cm4gdC5wcm90b3R5cGUubWVhc3VyZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX21lYXN1cmVyPXQsdGhpc30sdC5wcm90b3R5cGUud3JhcHBlcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fd3JhcHBlcj10LHRoaXN9LHQucHJvdG90eXBlLnBlbkZhY3Rvcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BlbkZhY3Rvcnk9dCx0aGlzfSx0LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLG4saSxyLG8pe2lmKHZvaWQgMD09PXImJihyPXt9KSxyPVltdC5NZXRob2RzLmRlZmF1bHRzKHt9LFhtdCxyKSwtMT09PXQuU3VwcG9ydGVkUm90YXRpb24uaW5kZXhPZihyLnRleHRSb3RhdGlvbikpdGhyb3cgbmV3IEVycm9yKCJ1bnN1cHBvcnRlZCByb3RhdGlvbiAtICIrci50ZXh0Um90YXRpb24rIi4gU3VwcG9ydGVkIHJvdGF0aW9ucyBhcmUgIit0LlN1cHBvcnRlZFJvdGF0aW9uLmpvaW4oIiwgIikpO2lmKG51bGwhPXIudGV4dFNoZWFyJiZyLnRleHRTaGVhcjwtODB8fHIudGV4dFNoZWFyPjgwKXRocm93IG5ldyBFcnJvcigidW5zdXBwb3J0ZWQgc2hlYXIgYW5nbGUgLSAiK3IudGV4dFNoZWFyKyIuIE11c3QgYmUgYmV0d2VlbiAtODAgYW5kIDgwIik7dmFyIGE9TWF0aC5hYnMoTWF0aC5hYnMoci50ZXh0Um90YXRpb24pLTkwKT40NSxzPWE/bjppLGw9YT9pOm4sYz1yLnRleHRTaGVhcix1PWMqTWF0aC5QSS8xODAsaD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0LGQ9aCpNYXRoLnRhbih1KSxwPXMvTWF0aC5jb3ModSktTWF0aC5hYnMoZCksZj1sKk1hdGguY29zKHUpLG09WW10LlN0cmluZ01ldGhvZHMuY29tYmluZVdoaXRlc3BhY2UoZSksZz0odGhpcy5fd3JhcHBlcj90aGlzLl93cmFwcGVyLndyYXAobSx0aGlzLl9tZWFzdXJlcixwLGYpLndyYXBwZWRUZXh0Om0pLnNwbGl0KCJcbiIpLF89dC5YT2Zmc2V0RmFjdG9yW3IueEFsaWduXSpwKk1hdGguc2luKHUpLXQuWU9mZnNldEZhY3RvcltyLnlBbGlnbl0qKGYtZy5sZW5ndGgqaCkseT1bMCwwXSx2PXIudGV4dFJvdGF0aW9uK2M7c3dpdGNoKHIudGV4dFJvdGF0aW9uKXtjYXNlIDkwOnk9W24rXywwXTticmVhaztjYXNlLTkwOnk9Wy1fLGldO2JyZWFrO2Nhc2UgMTgwOnk9W24saStfXTticmVhaztkZWZhdWx0Onk9WzAsLV9dfXZhciBiPXRoaXMuX3BlbkZhY3RvcnkuY3JlYXRlUGVuKGUse3RyYW5zbGF0ZTp5LHJvdGF0ZTp2fSxvKTt0aGlzLndyaXRlTGluZXMoZyxiLHAsaCxkLHIueEFsaWduKSxudWxsIT1iLmRlc3Ryb3kmJmIuZGVzdHJveSgpfSx0LnByb3RvdHlwZS53cml0ZUxpbmVzPWZ1bmN0aW9uKHQsZSxuLGkscixvKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQsYSl7ZS53cml0ZSh0LG4sbyxyPjA/KGErMSkqcjphKnIsKGErMSkqaSl9KSl9LHR9KSgpOyRtdC5YT2Zmc2V0RmFjdG9yPXtjZW50ZXI6LjUsbGVmdDowLHJpZ2h0OjF9LCRtdC5ZT2Zmc2V0RmFjdG9yPXtib3R0b206MSxjZW50ZXI6LjUsdG9wOjB9LCRtdC5TdXBwb3J0ZWRSb3RhdGlvbj1bLTkwLDAsMTgwLDkwXSxEbXQuV3JpdGVyPSRtdCwoZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLChmdW5jdGlvbiBlKG4pe2Zvcih2YXIgaSBpbiBuKXQuaGFzT3duUHJvcGVydHkoaSl8fCh0W2ldPW5baV0pfSkoRG10KX0pKHptdCk7dmFyIEttdD17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoS210LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgWm10PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQuYXBwZW5kPWZ1bmN0aW9uKGUsbil7Zm9yKHZhciBpPVtdLHI9MjtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKWlbci0yXT1hcmd1bWVudHNbcl07dmFyIG89dC5jcmVhdGUuYXBwbHkodCxbbl0uY29uY2F0KGkpKTtyZXR1cm4gZS5hcHBlbmRDaGlsZChvKSxvfSx0LmNyZWF0ZT1mdW5jdGlvbihlKXtmb3IodmFyIG49W10saT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspbltpLTFdPWFyZ3VtZW50c1tpXTt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpO3JldHVybiB0LmFkZENsYXNzZXMuYXBwbHkodCxbcl0uY29uY2F0KG4pKSxyfSx0LmFkZENsYXNzZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWVbbi0xXT1hcmd1bWVudHNbbl07ZT1lLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXR9KSksbnVsbCE9dC5jbGFzc0xpc3Q/ZS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmNsYXNzTGlzdC5hZGQoZSl9KSk6dC5zZXRBdHRyaWJ1dGUoImNsYXNzIixlLmpvaW4oIiAiKSl9LHQuZ2V0RGltZW5zaW9ucz1mdW5jdGlvbih0KXtpZih0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCl0cnl7dmFyIGU9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57d2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHR9fWNhdGNoKHQpe31yZXR1cm57aGVpZ2h0OjAsd2lkdGg6MH19LHR9KSgpO0ttdC5IdG1sVXRpbHM9Wm10O3ZhciBKbXQ9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dm9pZCAwPT09biYmKG49ITEpO3ZhciBpPXRoaXM7dGhpcy5lbGVtZW50PXQsdGhpcy5jbGFzc05hbWU9ZSx0aGlzLmFkZFRpdGxlPW4sdGhpcy5jcmVhdGVSdWxlcj1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1abXQuYXBwZW5kKGkuZWxlbWVudCwic3BhbiIsInRleHQtdG1wIixpLmNsYXNzTmFtZSk7ZS50ZXh0Q29udGVudD10O3ZhciBuPVptdC5nZXREaW1lbnNpb25zKGUpO3JldHVybiBpLmVsZW1lbnQucmVtb3ZlQ2hpbGQoZSksbn19LHRoaXMuY3JlYXRlUGVuPWZ1bmN0aW9uKHQsZSxuKXtudWxsPT1uJiYobj1pLmVsZW1lbnQpO3ZhciByPVptdC5hcHBlbmQobiwiZGl2IiwidGV4dC1ibG9jayIsaS5jbGFzc05hbWUpO3JldHVybiByLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsci5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAtMWVtKSB0cmFuc2xhdGUoIitlLnRyYW5zbGF0ZVswXSsicHgsICIrZS50cmFuc2xhdGVbMV0rInB4KSByb3RhdGUoIitlLnJvdGF0ZSsiZGVnKSIsci5zdHlsZS50cmFuc2Zvcm1PcmlnaW49IjAgMS4yZW0iLGkuYWRkVGl0bGUmJnIuc2V0QXR0cmlidXRlKCJ0aXRsZSIsdCksaS5jcmVhdGVIdG1sTGluZVBlbihyKX19cmV0dXJuIHQucHJvdG90eXBlLnNldEFkZFRpdGxlPWZ1bmN0aW9uKHQpe3RoaXMuYWRkVGl0bGU9dH0sdC5wcm90b3R5cGUuY3JlYXRlSHRtbExpbmVQZW49ZnVuY3Rpb24odCl7cmV0dXJue3dyaXRlOmZ1bmN0aW9uKGUsbixpLHIsbyl7dmFyIGE9Wm10LmFwcGVuZCh0LCJkaXYiLCJ0ZXh0LWxpbmUiKTthLnRleHRDb250ZW50PWUsYS5zdHlsZS53aWR0aD1uKyJweCIsYS5zdHlsZS50ZXh0QWxpZ249aSxhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aGl0ZVNwYWNlPSJub3dyYXAiLGEuc3R5bGUudG9wPW8rInB4IixhLnN0eWxlLmxlZnQ9cisicHgifX19LHR9KSgpO0ttdC5IdG1sQ29udGV4dD1KbXQsT2JqZWN0LmRlZmluZVByb3BlcnR5KE9tdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFFtdD16bXQsdGd0PUttdCxlZ3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5hcHBlbmQ9ZnVuY3Rpb24oZSxuKXtmb3IodmFyIGk9W10scj0yO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspaVtyLTJdPWFyZ3VtZW50c1tyXTt2YXIgbz10LmNyZWF0ZS5hcHBseSh0LFtuXS5jb25jYXQoaSkpO3JldHVybiBlLmFwcGVuZENoaWxkKG8pLG99LHQuY3JlYXRlPWZ1bmN0aW9uKGUpe2Zvcih2YXIgbj1bXSxpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyluW2ktMV09YXJndW1lbnRzW2ldO3ZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0LlNWR19OUyxlKTtyZXR1cm4gdGd0Lkh0bWxVdGlscy5hZGRDbGFzc2VzLmFwcGx5KHRndC5IdG1sVXRpbHMsW3JdLmNvbmNhdChuKSkscn0sdC5nZXREaW1lbnNpb25zPWZ1bmN0aW9uKHQpe2lmKHQuZ2V0QkJveCl0cnl7dmFyIGU9dC5nZXRCQm94KCk7cmV0dXJue3dpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0fX1jYXRjaCh0KXt9cmV0dXJue2hlaWdodDowLHdpZHRoOjB9fSx0fSkoKTtlZ3QuU1ZHX05TPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsT210LlN2Z1V0aWxzPWVndDt2YXIgbmd0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4pe3ZvaWQgMD09PW4mJihuPSExKTt2YXIgaT10aGlzO3RoaXMuZWxlbWVudD10LHRoaXMuY2xhc3NOYW1lPWUsdGhpcy5hZGRUaXRsZUVsZW1lbnQ9bix0aGlzLmNyZWF0ZVJ1bGVyPWZ1bmN0aW9uKCl7dmFyIHQ9aS5nZXRUZXh0RWxlbWVudHMoaS5lbGVtZW50KSxlPXQucGFyZW50RWxlbWVudCxuPXQuY29udGFpbmVyRWxlbWVudCxyPXQudGV4dEVsZW1lbnQ7cmV0dXJuIGZ1bmN0aW9uKHQpe2UuYXBwZW5kQ2hpbGQobiksci50ZXh0Q29udGVudD10O3ZhciBpPWVndC5nZXREaW1lbnNpb25zKHIpO3JldHVybiBlLnJlbW92ZUNoaWxkKG4pLGl9fSx0aGlzLmNyZWF0ZVBlbj1mdW5jdGlvbih0LGUsbil7bnVsbD09biYmKG49aS5lbGVtZW50KTt2YXIgcj1lZ3QuYXBwZW5kKG4sImciLCJ0ZXh0LWNvbnRhaW5lciIsaS5jbGFzc05hbWUpO2kuYWRkVGl0bGVFbGVtZW50JiYoZWd0LmFwcGVuZChyLCJ0aXRsZSIpLnRleHRDb250ZW50PXQsci5zZXRBdHRyaWJ1dGUoInRpdGxlIix0KSk7dmFyIG89ZWd0LmFwcGVuZChyLCJnIiwidGV4dC1hcmVhIik7cmV0dXJuIG8uc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitlLnRyYW5zbGF0ZVswXSsiLCIrZS50cmFuc2xhdGVbMV0rIilyb3RhdGUoIitlLnJvdGF0ZSsiKSIpLGkuY3JlYXRlU3ZnTGluZVBlbihvKX19cmV0dXJuIHQucHJvdG90eXBlLnNldEFkZFRpdGxlRWxlbWVudD1mdW5jdGlvbih0KXt0aGlzLmFkZFRpdGxlRWxlbWVudD10fSx0LnByb3RvdHlwZS5jcmVhdGVTdmdMaW5lUGVuPWZ1bmN0aW9uKGUpe3JldHVybnt3cml0ZTpmdW5jdGlvbihuLGkscixvLGEpe28rPWkqUW10LldyaXRlci5YT2Zmc2V0RmFjdG9yW3JdO3ZhciBzPWVndC5hcHBlbmQoZSwidGV4dCIsInRleHQtbGluZSIpO3MudGV4dENvbnRlbnQ9bixzLnNldEF0dHJpYnV0ZSgidGV4dC1hbmNob3IiLHQuQW5jaG9yTWFwW3JdKSxzLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrbysiLCIrYSsiKSIpLHMuc2V0QXR0cmlidXRlKCJ5IiwiLTAuMjVlbSIpfX19LHQucHJvdG90eXBlLmdldFRleHRFbGVtZW50cz1mdW5jdGlvbih0KXtpZigidGV4dCI9PT10LnRhZ05hbWUpcmV0dXJuIG51bGw9PShlPXQucGFyZW50RWxlbWVudCkmJihlPXQucGFyZW50Tm9kZSksZS5yZW1vdmVDaGlsZCh0KSx7Y29udGFpbmVyRWxlbWVudDp0LHBhcmVudEVsZW1lbnQ6ZSx0ZXh0RWxlbWVudDp0fTt2YXIgZSxuPXQucXVlcnlTZWxlY3RvcigidGV4dCIpO2lmKG51bGwhPW4pcmV0dXJuIG51bGw9PShlPW4ucGFyZW50RWxlbWVudCkmJihlPW4ucGFyZW50Tm9kZSksZS5yZW1vdmVDaGlsZChuKSx7Y29udGFpbmVyRWxlbWVudDpuLHBhcmVudEVsZW1lbnQ6ZSx0ZXh0RWxlbWVudDpufTt2YXIgaT1lZ3QuY3JlYXRlKCJ0ZXh0Iix0aGlzLmNsYXNzTmFtZSk7cmV0dXJue2NvbnRhaW5lckVsZW1lbnQ6aSxwYXJlbnRFbGVtZW50OnQsdGV4dEVsZW1lbnQ6aX19LHR9KSgpO25ndC5BbmNob3JNYXA9e2NlbnRlcjoibWlkZGxlIixsZWZ0OiJzdGFydCIscmlnaHQ6ImVuZCJ9LE9tdC5TdmdDb250ZXh0PW5ndDt2YXIgaWd0PXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShpZ3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByZ3Q9em10LG9ndD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXt2b2lkIDA9PT1lJiYoZT0xMCksdm9pZCAwPT09biYmKG49e30pO3ZhciBpPXRoaXM7dGhpcy5jdHg9dCx0aGlzLmxpbmVIZWlnaHQ9ZSx0aGlzLnN0eWxlPW4sdGhpcy5jcmVhdGVSdWxlcj1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaS5jdHguZm9udD1pLnN0eWxlLmZvbnQse3dpZHRoOmkuY3R4Lm1lYXN1cmVUZXh0KHQpLndpZHRoLGhlaWdodDppLmxpbmVIZWlnaHR9fX0sdGhpcy5jcmVhdGVQZW49ZnVuY3Rpb24odCxlLG4pe3JldHVybiBudWxsPT1uJiYobj1pLmN0eCksbi5zYXZlKCksbi50cmFuc2xhdGUoZS50cmFuc2xhdGVbMF0sZS50cmFuc2xhdGVbMV0pLG4ucm90YXRlKGUucm90YXRlKk1hdGguUEkvMTgwKSxpLmNyZWF0ZUNhbnZhc1BlbihuKX0sdm9pZCAwPT09dGhpcy5zdHlsZS5maWxsJiYodGhpcy5zdHlsZS5maWxsPSIjNDQ0Iil9cmV0dXJuIHQucHJvdG90eXBlLmNyZWF0ZUNhbnZhc1Blbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybntkZXN0cm95OmZ1bmN0aW9uKCl7dC5yZXN0b3JlKCl9LHdyaXRlOmZ1bmN0aW9uKG4saSxyLG8sYSl7bys9aSpyZ3QuV3JpdGVyLlhPZmZzZXRGYWN0b3Jbcl0sdC50ZXh0QWxpZ249cixudWxsIT1lLnN0eWxlLmZvbnQmJih0LmZvbnQ9ZS5zdHlsZS5mb250KSxudWxsIT1lLnN0eWxlLmZpbGwmJih0LmZpbGxTdHlsZT1lLnN0eWxlLmZpbGwsdC5maWxsVGV4dChuLG8sYSkpLG51bGwhPWUuc3R5bGUuc3Ryb2tlJiYodC5zdHJva2VTdHlsZT1lLnN0eWxlLmZpbGwsdC5zdHJva2VUZXh0KG4sbyxhKSl9fX0sdH0pKCk7aWd0LkNhbnZhc0NvbnRleHQ9b2d0LChmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe2Zvcih2YXIgbiBpbiBlKXQuaGFzT3duUHJvcGVydHkobil8fCh0W25dPWVbbl0pfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlKE9tdCksZShpZ3QpLGUoS210KX0pKFJtdCk7dmFyIGFndD17fSxzZ3Q9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KHNndCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGxndD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMucnVsZXI9bnVsbCE9dC5jcmVhdGVSdWxlcj90LmNyZWF0ZVJ1bGVyKCk6dH1yZXR1cm4gdC5wcm90b3R5cGUubWVhc3VyZT1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dC5IRUlHSFRfVEVYVCksdGhpcy5ydWxlcihlKX0sdH0pKCk7bGd0LkhFSUdIVF9URVhUPSJiZHBxbCIsc2d0LkFic3RyYWN0TWVhc3VyZXI9bGd0O3ZhciBjZ3Q9e30sdWd0PXt9LGhndD17fSxkZ3Q9dmUmJnZlLl9fZXh0ZW5kc3x8KGZ1bmN0aW9uKCl7dmFyIHQ9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9O3JldHVybiBmdW5jdGlvbihlLG4pe2Z1bmN0aW9uIGkoKXt0aGlzLmNvbnN0cnVjdG9yPWV9dChlLG4pLGUucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KGkucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyBpKX19KSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShoZ3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBwZ3Q9c2d0LGZndD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZvaWQgMD09PW4mJihuPSExKTt2YXIgaT10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gaS51c2VHdWFyZHM9bixpfXJldHVybiBkZ3QoZSx0KSxlLnByb3RvdHlwZS5fYWRkR3VhcmRzPWZ1bmN0aW9uKHQpe3JldHVybiBwZ3QuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVCt0K3BndC5BYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUfSxlLnByb3RvdHlwZS5fbWVhc3VyZUxpbmU9ZnVuY3Rpb24oZSxuKXt2b2lkIDA9PT1uJiYobj0hMSk7dmFyIGk9dGhpcy51c2VHdWFyZHN8fG58fC9eW1x0IF0kLy50ZXN0KGUpLHI9aT90aGlzLl9hZGRHdWFyZHMoZSk6ZSxvPXQucHJvdG90eXBlLm1lYXN1cmUuY2FsbCh0aGlzLHIpO3JldHVybiBvLndpZHRoLT1pPzIqdGhpcy5nZXRHdWFyZFdpZHRoKCk6MCxvfSxlLnByb3RvdHlwZS5tZWFzdXJlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYodm9pZCAwPT09dCYmKHQ9cGd0LkFic3RyYWN0TWVhc3VyZXIuSEVJR0hUX1RFWFQpLCIiPT09dC50cmltKCkpcmV0dXJue3dpZHRoOjAsaGVpZ2h0OjB9O3ZhciBuPXQudHJpbSgpLnNwbGl0KCJcbiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX21lYXN1cmVMaW5lKHQpfSkpO3JldHVybntoZWlnaHQ6bi5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZS5oZWlnaHR9KSwwKSx3aWR0aDpuLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5tYXgodCxlLndpZHRoKX0pLDApfX0sZS5wcm90b3R5cGUuZ2V0R3VhcmRXaWR0aD1mdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLmd1YXJkV2lkdGgmJih0aGlzLmd1YXJkV2lkdGg9dC5wcm90b3R5cGUubWVhc3VyZS5jYWxsKHRoaXMpLndpZHRoKSx0aGlzLmd1YXJkV2lkdGh9LGV9KShwZ3QuQWJzdHJhY3RNZWFzdXJlcik7aGd0Lk1lYXN1cmVyPWZndDt2YXIgbWd0PXZlJiZ2ZS5fX2V4dGVuZHN8fChmdW5jdGlvbigpe3ZhciB0PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfTtyZXR1cm4gZnVuY3Rpb24oZSxuKXtmdW5jdGlvbiBpKCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfXQoZSxuKSxlLnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihpLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgaSl9fSkoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodWd0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZ2d0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gbWd0KGUsdCksZS5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIHQucHJvdG90eXBlLl9tZWFzdXJlTGluZS5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLl9tZWFzdXJlTGluZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dC5zcGxpdCgiIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fbWVhc3VyZUNoYXJhY3Rlcih0KX0pKTtyZXR1cm57aGVpZ2h0Om4ucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLm1heCh0LGUuaGVpZ2h0KX0pLDApLHdpZHRoOm4ucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiB0K2Uud2lkdGh9KSwwKX19LGV9KShoZ3QuTWVhc3VyZXIpO3VndC5DaGFyYWN0ZXJNZWFzdXJlcj1nZ3Q7dmFyIF9ndD12ZSYmdmUuX19leHRlbmRzfHwoZnVuY3Rpb24oKXt2YXIgdD1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX07cmV0dXJuIGZ1bmN0aW9uKGUsbil7ZnVuY3Rpb24gaSgpe3RoaXMuY29uc3RydWN0b3I9ZX10KGUsbiksZS5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKTooaS5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IGkpfX0pKCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNndCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHlndD1CbXQsdmd0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7dmFyIGk9dC5jYWxsKHRoaXMsZSxuKXx8dGhpcztyZXR1cm4gaS5jYWNoZT1uZXcgeWd0LkNhY2hlKChmdW5jdGlvbih0KXtyZXR1cm4gaS5fbWVhc3VyZUNoYXJhY3Rlck5vdEZyb21DYWNoZSh0KX0pKSxpfXJldHVybiBfZ3QoZSx0KSxlLnByb3RvdHlwZS5fbWVhc3VyZUNoYXJhY3Rlck5vdEZyb21DYWNoZT1mdW5jdGlvbihlKXtyZXR1cm4gdC5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXIuY2FsbCh0aGlzLGUpfSxlLnByb3RvdHlwZS5fbWVhc3VyZUNoYXJhY3Rlcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jYWNoZS5nZXQodCl9LGUucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5jYWNoZS5jbGVhcigpfSxlfSkodWd0LkNoYXJhY3Rlck1lYXN1cmVyKTtjZ3QuQ2FjaGVDaGFyYWN0ZXJNZWFzdXJlcj12Z3Q7dmFyIGJndD17fSx4Z3Q9dmUmJnZlLl9fZXh0ZW5kc3x8KGZ1bmN0aW9uKCl7dmFyIHQ9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9O3JldHVybiBmdW5jdGlvbihlLG4pe2Z1bmN0aW9uIGkoKXt0aGlzLmNvbnN0cnVjdG9yPWV9dChlLG4pLGUucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KGkucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyBpKX19KSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShiZ3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB3Z3Q9Qm10LFNndD1zZ3QsTWd0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiBuLmRpbUNhY2hlPW5ldyB3Z3QuQ2FjaGUoKGZ1bmN0aW9uKHQpe3JldHVybiBuLl9tZWFzdXJlTm90RnJvbUNhY2hlKHQpfSkpLG59cmV0dXJuIHhndChlLHQpLGUucHJvdG90eXBlLl9tZWFzdXJlTm90RnJvbUNhY2hlPWZ1bmN0aW9uKGUpe3JldHVybiB0LnByb3RvdHlwZS5tZWFzdXJlLmNhbGwodGhpcyxlKX0sZS5wcm90b3R5cGUubWVhc3VyZT1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9U2d0LkFic3RyYWN0TWVhc3VyZXIuSEVJR0hUX1RFWFQpLHRoaXMuZGltQ2FjaGUuZ2V0KHQpfSxlLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuZGltQ2FjaGUuY2xlYXIoKSx0LnByb3RvdHlwZS5yZXNldC5jYWxsKHRoaXMpfSxlfSkoY2d0LkNhY2hlQ2hhcmFjdGVyTWVhc3VyZXIpO2JndC5DYWNoZU1lYXN1cmVyPU1ndCwoZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXtmb3IodmFyIG4gaW4gZSl0Lmhhc093blByb3BlcnR5KG4pfHwodFtuXT1lW25dKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZShzZ3QpLGUoY2d0KSxlKGJndCksZSh1Z3QpLGUoaGd0KX0pKGFndCk7dmFyIEVndD17fSxUZ3Q9e30sQ2d0PXt9LEFndD17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQWd0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIga2d0PUJtdCxMZ3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMubWF4TGluZXMoMS8wKSx0aGlzLnRleHRUcmltbWluZygiZWxsaXBzaXMiKSx0aGlzLmFsbG93QnJlYWtpbmdXb3JkcyghMSksdGhpcy5fdG9rZW5pemVyPW5ldyBrZ3QuVG9rZW5pemVyLHRoaXMuX2JyZWFraW5nQ2hhcmFjdGVyPSItIn1yZXR1cm4gdC5wcm90b3R5cGUubWF4TGluZXM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fbWF4TGluZXM6KHRoaXMuX21heExpbmVzPXQsdGhpcyl9LHQucHJvdG90eXBlLnRleHRUcmltbWluZz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl90ZXh0VHJpbW1pbmc7aWYoImVsbGlwc2lzIiE9PXQmJiJub25lIiE9PXQpdGhyb3cgbmV3IEVycm9yKHQrIiAtIHVuc3VwcG9ydGVkIHRleHQgdHJpbW1pbmcgb3B0aW9uLiIpO3JldHVybiB0aGlzLl90ZXh0VHJpbW1pbmc9dCx0aGlzfSx0LnByb3RvdHlwZS5hbGxvd0JyZWFraW5nV29yZHM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fYWxsb3dCcmVha2luZ1dvcmRzOih0aGlzLl9hbGxvd0JyZWFraW5nV29yZHM9dCx0aGlzKX0sdC5wcm90b3R5cGUud3JhcD1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10aGlzO3ZvaWQgMD09PWkmJihpPTEvMCk7dmFyIG89e25vQnJva2VXb3JkczowLG5vTGluZXM6MCxvcmlnaW5hbFRleHQ6dCx0cnVuY2F0ZWRUZXh0OiIiLHdyYXBwZWRUZXh0OiIifSxhPXthdmFpbGFibGVMaW5lczpNYXRoLm1pbihNYXRoLmZsb29yKGkvZS5tZWFzdXJlKCkuaGVpZ2h0KSx0aGlzLl9tYXhMaW5lcyksYXZhaWxhYmxlV2lkdGg6bixjYW5GaXRUZXh0OiEwLGN1cnJlbnRMaW5lOiIiLHdyYXBwaW5nOm99LHM9dC5zcGxpdCgiXG4iKTtyZXR1cm4gcy5yZWR1Y2UoKGZ1bmN0aW9uKHQsbixpKXtyZXR1cm4gci5icmVha0xpbmVUb0ZpdFdpZHRoKHQsbixpIT09cy5sZW5ndGgtMSxlKX0pLGEpLndyYXBwaW5nfSx0LnByb3RvdHlwZS5icmVha0xpbmVUb0ZpdFdpZHRoPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPXRoaXM7dC5jYW5GaXRUZXh0fHwiIj09PXQud3JhcHBpbmcudHJ1bmNhdGVkVGV4dHx8KHQud3JhcHBpbmcudHJ1bmNhdGVkVGV4dCs9IlxuIiksdD10aGlzLl90b2tlbml6ZXIudG9rZW5pemUoZSkucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiByLndyYXBOZXh0VG9rZW4oZSx0LGkpfSksdCk7dmFyIG89a2d0LlN0cmluZ01ldGhvZHMudHJpbUVuZCh0LmN1cnJlbnRMaW5lKTtyZXR1cm4gdC53cmFwcGluZy5ub0xpbmVzKz0rKCIiIT09byksdC53cmFwcGluZy5ub0xpbmVzPT09dC5hdmFpbGFibGVMaW5lcyYmIm5vbmUiIT09dGhpcy5fdGV4dFRyaW1taW5nJiZuP3QuY2FuRml0VGV4dD0hMTp0LndyYXBwaW5nLndyYXBwZWRUZXh0Kz1vLHQuY3VycmVudExpbmU9IlxuIix0fSx0LnByb3RvdHlwZS5jYW5GaXRUb2tlbj1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcyxyPXQuc3BsaXQoIiIpLm1hcCgoZnVuY3Rpb24oZSxuKXtyZXR1cm4gbiE9PXQubGVuZ3RoLTE/ZStpLl9icmVha2luZ0NoYXJhY3RlcjplfSkpO3JldHVybiBuLm1lYXN1cmUodCkud2lkdGg8PWV8fHIuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiBuLm1lYXN1cmUodCkud2lkdGg8PWV9KSl9LHQucHJvdG90eXBlLmFkZEVsbGlwc2lzPWZ1bmN0aW9uKHQsZSxuKXtpZigibm9uZSI9PT10aGlzLl90ZXh0VHJpbW1pbmcpcmV0dXJue3JlbWFpbmluZ1Rva2VuOiIiLHdyYXBwZWRUb2tlbjp0fTt2YXIgaT10LnN1YnN0cmluZygwKS50cmltKCkscj1uLm1lYXN1cmUoaSkud2lkdGgsbz1uLm1lYXN1cmUoIi4uLiIpLndpZHRoLGE9dC5sZW5ndGg+MCYmIlxuIj09PXRbMF0/IlxuIjoiIjtpZihlPD1vKXt2YXIgcz1NYXRoLmZsb29yKGUvKG8vMykpO3JldHVybntyZW1haW5pbmdUb2tlbjp0LHdyYXBwZWRUb2tlbjphKyIuLi4iLnN1YnN0cigwLHMpfX1mb3IoO3Irbz5lOylpPWtndC5TdHJpbmdNZXRob2RzLnRyaW1FbmQoaS5zdWJzdHIoMCxpLmxlbmd0aC0xKSkscj1uLm1lYXN1cmUoaSkud2lkdGg7cmV0dXJue3JlbWFpbmluZ1Rva2VuOmtndC5TdHJpbmdNZXRob2RzLnRyaW1FbmQodC5zdWJzdHJpbmcoaS5sZW5ndGgpLCItIikudHJpbSgpLHdyYXBwZWRUb2tlbjphK2krIi4uLiJ9fSx0LnByb3RvdHlwZS53cmFwTmV4dFRva2VuPWZ1bmN0aW9uKHQsZSxuKXtpZighZS5jYW5GaXRUZXh0fHxlLmF2YWlsYWJsZUxpbmVzPT09ZS53cmFwcGluZy5ub0xpbmVzfHwhdGhpcy5jYW5GaXRUb2tlbih0LGUuYXZhaWxhYmxlV2lkdGgsbikpcmV0dXJuIHRoaXMuZmluaXNoV3JhcHBpbmcodCxlLG4pO2Zvcih2YXIgaT10O2k7KXt2YXIgcj10aGlzLmJyZWFrVG9rZW5Ub0ZpdEluV2lkdGgoaSxlLmN1cnJlbnRMaW5lLGUuYXZhaWxhYmxlV2lkdGgsbik7aWYoZS5jdXJyZW50TGluZT1yLmxpbmUsbnVsbCE9KGk9ci5yZW1haW5pbmdUb2tlbikpe2lmKGUud3JhcHBpbmcubm9Ccm9rZVdvcmRzKz0rci5icmVha1dvcmQsKytlLndyYXBwaW5nLm5vTGluZXMsZS5hdmFpbGFibGVMaW5lcz09PWUud3JhcHBpbmcubm9MaW5lcyl7dmFyIG89dGhpcy5hZGRFbGxpcHNpcyhlLmN1cnJlbnRMaW5lLGUuYXZhaWxhYmxlV2lkdGgsbik7cmV0dXJuIGUud3JhcHBpbmcud3JhcHBlZFRleHQrPW8ud3JhcHBlZFRva2VuLGUud3JhcHBpbmcudHJ1bmNhdGVkVGV4dCs9by5yZW1haW5pbmdUb2tlbitpLGUuY3VycmVudExpbmU9IlxuIixlfWUud3JhcHBpbmcud3JhcHBlZFRleHQrPWtndC5TdHJpbmdNZXRob2RzLnRyaW1FbmQoZS5jdXJyZW50TGluZSksZS5jdXJyZW50TGluZT0iXG4ifX1yZXR1cm4gZX0sdC5wcm90b3R5cGUuZmluaXNoV3JhcHBpbmc9ZnVuY3Rpb24odCxlLG4pe2lmKGUuY2FuRml0VGV4dCYmZS5hdmFpbGFibGVMaW5lcyE9PWUud3JhcHBpbmcubm9MaW5lcyYmIm5vbmUiIT09dGhpcy5fdGV4dFRyaW1taW5nKXt2YXIgaT10aGlzLmFkZEVsbGlwc2lzKGUuY3VycmVudExpbmUrdCxlLmF2YWlsYWJsZVdpZHRoLG4pO2Uud3JhcHBpbmcud3JhcHBlZFRleHQrPWkud3JhcHBlZFRva2VuLGUud3JhcHBpbmcudHJ1bmNhdGVkVGV4dCs9aS5yZW1haW5pbmdUb2tlbixlLndyYXBwaW5nLm5vQnJva2VXb3Jkcys9KyhpLnJlbWFpbmluZ1Rva2VuLmxlbmd0aDx0Lmxlbmd0aCksZS53cmFwcGluZy5ub0xpbmVzKz0rKGkud3JhcHBlZFRva2VuLmxlbmd0aD4wKSxlLmN1cnJlbnRMaW5lPSIifWVsc2UgZS53cmFwcGluZy50cnVuY2F0ZWRUZXh0Kz10O3JldHVybiBlLmNhbkZpdFRleHQ9ITEsZX0sdC5wcm90b3R5cGUuYnJlYWtUb2tlblRvRml0SW5XaWR0aD1mdW5jdGlvbih0LGUsbixpLHIpe2lmKHZvaWQgMD09PXImJihyPXRoaXMuX2JyZWFraW5nQ2hhcmFjdGVyKSxpLm1lYXN1cmUoZSt0KS53aWR0aDw9bilyZXR1cm57YnJlYWtXb3JkOiExLGxpbmU6ZSt0LHJlbWFpbmluZ1Rva2VuOm51bGx9O2lmKCIiPT09dC50cmltKCkpcmV0dXJue2JyZWFrV29yZDohMSxsaW5lOmUscmVtYWluaW5nVG9rZW46IiJ9O2lmKCF0aGlzLl9hbGxvd0JyZWFraW5nV29yZHMmJiIiIT09ZS50cmltKCkpcmV0dXJue2JyZWFrV29yZDohMSxsaW5lOmUscmVtYWluaW5nVG9rZW46dH07Zm9yKHZhciBvPTA7bzx0Lmxlbmd0aCYmaS5tZWFzdXJlKGUrdC5zdWJzdHJpbmcoMCxvKzEpK3IpLndpZHRoPD1uOykrK287dmFyIGE9IiI7cmV0dXJuIG8+MCYmKGE9cikse2JyZWFrV29yZDpvPjAsbGluZTplK3Quc3Vic3RyaW5nKDAsbykrYSxyZW1haW5pbmdUb2tlbjp0LnN1YnN0cmluZyhvKX19LHR9KSgpO0FndC5XcmFwcGVyPUxndDt2YXIgUGd0PXZlJiZ2ZS5fX2V4dGVuZHN8fChmdW5jdGlvbigpe3ZhciB0PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfTtyZXR1cm4gZnVuY3Rpb24oZSxuKXtmdW5jdGlvbiBpKCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfXQoZSxuKSxlLnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihpLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgaSl9fSkoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQ2d0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgTmd0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gUGd0KGUsdCksZS5wcm90b3R5cGUud3JhcD1mdW5jdGlvbihuLGkscixvKXt2YXIgYT10aGlzO2lmKHZvaWQgMD09PW8mJihvPTEvMCksbi5zcGxpdCgiXG4iKS5sZW5ndGg+MSl0aHJvdyBuZXcgRXJyb3IoIlNpbmdsZUxpbmVXcmFwcGVyIGlzIGRlc2lnbmVkIHRvIHdvcmsgb25seSBvbiBzaW5nbGUgbGluZSIpO3ZhciBzPWZ1bmN0aW9uKGUpe3JldHVybiB0LnByb3RvdHlwZS53cmFwLmNhbGwoYSxuLGksZSxvKX0sbD1zKHIpO2lmKGwubm9MaW5lczwyKXJldHVybiBsO2Zvcih2YXIgYz0wLHU9cixoPTA7aDxlLk5PX1dSQVBfSVRFUkFUSU9OUyYmdT5jOysraCl7dmFyIGQ9KHUrYykvMixwPXMoZCk7dGhpcy5hcmVTYW1lUmVzdWx0cyhsLHApPyh1PWQsbD1wKTpjPWR9cmV0dXJuIGx9LGUucHJvdG90eXBlLmFyZVNhbWVSZXN1bHRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubm9MaW5lcz09PWUubm9MaW5lcyYmdC50cnVuY2F0ZWRUZXh0PT09ZS50cnVuY2F0ZWRUZXh0fSxlfSkoQWd0LldyYXBwZXIpO05ndC5OT19XUkFQX0lURVJBVElPTlM9NSxDZ3QuU2luZ2xlTGluZVdyYXBwZXI9Tmd0LChmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe2Zvcih2YXIgbiBpbiBlKXQuaGFzT3duUHJvcGVydHkobil8fCh0W25dPWVbbl0pfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlKENndCksZShBZ3QpfSkoVGd0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRWd0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgSWd0PVJtdCxSZ3Q9YWd0LE9ndD1UZ3Qsemd0PXptdCxEZ3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLmNvbnRleHQ9dCx0aGlzLm1lYXN1cmVyPW5ldyBSZ3QuQ2FjaGVNZWFzdXJlcih0aGlzLmNvbnRleHQpLHRoaXMud3JhcHBlcj1uZXcgT2d0LldyYXBwZXIsdGhpcy53cml0ZXI9bmV3IHpndC5Xcml0ZXIodGhpcy5tZWFzdXJlcix0aGlzLmNvbnRleHQsdGhpcy53cmFwcGVyKX1yZXR1cm4gdC5zdmc9ZnVuY3Rpb24oZSxuLGkpe3JldHVybiBuZXcgdChuZXcgSWd0LlN2Z0NvbnRleHQoZSxuLGkpKX0sdC5jYW52YXM9ZnVuY3Rpb24oZSxuLGkpe3JldHVybiBuZXcgdChuZXcgSWd0LkNhbnZhc0NvbnRleHQoZSxuLGkpKX0sdC5odG1sPWZ1bmN0aW9uKGUsbixpKXtyZXR1cm4gbmV3IHQobmV3IElndC5IdG1sQ29udGV4dChlLG4saSkpfSx0LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LGUsbixpLHIpe3RoaXMud3JpdGVyLndyaXRlKHQsZSxuLGkscil9LHQucHJvdG90eXBlLmNsZWFyTWVhc3VyZXJDYWNoZT1mdW5jdGlvbigpe3RoaXMubWVhc3VyZXIucmVzZXQoKX0sdH0pKCk7RWd0LlR5cGVzZXR0ZXI9RGd0LChmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe2Zvcih2YXIgbiBpbiBlKXQuaGFzT3duUHJvcGVydHkobil8fCh0W25dPWVbbl0pfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlKFJtdCksZShhZ3QpLGUoRWd0KSxlKEJtdCksZShUZ3QpLGUoem10KX0pKEltdCk7dmFyIEJndD17fSxIZ3Q9e30sRmd0PXt9LFZndD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KFZndCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFVndD1FZHQsamd0PXdpbmRvdy5BcnJheTtWZ3QuYWRkPWZ1bmN0aW9uIEdndCh0LGUpe2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJhdHRlbXB0ZWQgdG8gYWRkIGFycmF5cyBvZiB1bmVxdWFsIGxlbmd0aCIpO3JldHVybiB0Lm1hcCgoZnVuY3Rpb24obixpKXtyZXR1cm4gdFtpXStlW2ldfSkpfSxWZ3QudW5pcT1mdW5jdGlvbiBXZ3QodCl7dmFyIGU9VWd0LnNldCgpLG49W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7ZS5oYXMoU3RyaW5nKHQpKXx8KGUuYWRkKFN0cmluZyh0KSksbi5wdXNoKHQpKX0pKSxufSxWZ3QuZmxhdHRlbj1mdW5jdGlvbiBxZ3QodCl7cmV0dXJuIGpndC5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLHQpfSxWZ3QuY3JlYXRlRmlsbGVkQXJyYXk9ZnVuY3Rpb24gWWd0KHQsZSl7Zm9yKHZhciBuPVtdLGk9MDtpPGU7aSsrKW5baV09ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dChpKTp0O3JldHVybiBufTt2YXIgWGd0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShYZ3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciAkZ3Q9RWR0LEtndD13aW5kb3cuTWF0aDtmdW5jdGlvbiBaZ3QodCl7dmFyIGU9JGd0LnJnYih0KSxuPWZ1bmN0aW9uKHQpe3JldHVybih0Lz0yNTUpPD0uMDM5Mjg/dC8xMi45MjpLZ3QucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCl9O3JldHVybi4yMTI2Km4oZS5yKSsuNzE1MipuKGUuZykrLjA3MjIqbihlLmIpfVhndC5jb250cmFzdD1mdW5jdGlvbiBKZ3QodCxlKXt2YXIgbj1aZ3QodCkrLjA1LGk9Wmd0KGUpKy4wNTtyZXR1cm4gbj5pP24vaTppL259LFhndC5saWdodGVuQ29sb3I9ZnVuY3Rpb24gUWd0KHQsZSl7cmV0dXJuICRndC5jb2xvcih0KS5icmlnaHRlcihlKS5yZ2IoKS50b1N0cmluZygpfSxYZ3QuY29sb3JUZXN0PWZ1bmN0aW9uIHRfdCh0LGUpe3QuY2xhc3NlZChlLCEwKTt2YXIgbj10LnN0eWxlKCJiYWNrZ3JvdW5kLWNvbG9yIik7aWYoInRyYW5zcGFyZW50Ij09PW4pcmV0dXJuIG51bGw7dmFyIGk9L1woKC4rKVwpLy5leGVjKG4pO2lmKCFpKXJldHVybiBudWxsO3ZhciByPWlbMV0uc3BsaXQoIiwiKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlPSt0LG49ZS50b1N0cmluZygxNik7cmV0dXJuIGU8MTY/IjAiK246bn0pKTtpZig0PT09ci5sZW5ndGgmJiIwMCI9PT1yWzNdKXJldHVybiBudWxsO3ZhciBvPSIjIityLmpvaW4oIiIpO3JldHVybiB0LmNsYXNzZWQoZSwhMSksb307dmFyIGVfdD17fTshKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9RWR0LG49d2luZG93Lk1hdGg7ZnVuY3Rpb24gaSh0KXt2YXIgZTt0cnl7ZT10Lm5vZGUoKS5nZXRCQm94KCl9Y2F0Y2godCl7ZT17eDowLHk6MCx3aWR0aDowLGhlaWdodDowfX1yZXR1cm4gZX10LmNvbnRhaW5zPWZ1bmN0aW9uIHIodCxlKXtmb3IodmFyIG49ZTtudWxsIT1uJiZuIT09dDspbj1uLnBhcmVudE5vZGU7cmV0dXJuIG49PT10fSx0LmVsZW1lbnRCQm94PWksdC5lbnRpdHlCb3VuZHM9ZnVuY3Rpb24gbyh0KXtpZih0IGluc3RhbmNlb2YgU1ZHRWxlbWVudClyZXR1cm4gaShlLnNlbGVjdCh0KSk7aWYodCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KXt2YXIgbj10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt4Om4ubGVmdCx5Om4udG9wLHdpZHRoOm4ud2lkdGgsaGVpZ2h0Om4uaGVpZ2h0fX1yZXR1cm57eDowLHk6MCx3aWR0aDowLGhlaWdodDowfX0sdC5TQ1JFRU5fUkVGUkVTSF9SQVRFX01JTExJU0VDT05EUz0xZTMvNjAsdC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbD1mdW5jdGlvbiBhKGUpe251bGwhPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShlKTpzZXRUaW1lb3V0KGUsdC5TQ1JFRU5fUkVGUkVTSF9SQVRFX01JTExJU0VDT05EUyl9LHQuZWxlbWVudFdpZHRoPWZ1bmN0aW9uIHModCl7dmFyIG49dCBpbnN0YW5jZW9mIGUuc2VsZWN0aW9uP3Qubm9kZSgpOnQsaT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShuKTtyZXR1cm4gbShpLCJ3aWR0aCIpK20oaSwicGFkZGluZy1sZWZ0IikrbShpLCJwYWRkaW5nLXJpZ2h0IikrbShpLCJib3JkZXItbGVmdC13aWR0aCIpK20oaSwiYm9yZGVyLXJpZ2h0LXdpZHRoIil9LHQuZWxlbWVudEhlaWdodD1mdW5jdGlvbiBsKHQpe3ZhciBuPXQgaW5zdGFuY2VvZiBlLnNlbGVjdGlvbj90Lm5vZGUoKTp0LGk9d2luZG93LmdldENvbXB1dGVkU3R5bGUobik7cmV0dXJuIG0oaSwiaGVpZ2h0IikrbShpLCJwYWRkaW5nLXRvcCIpK20oaSwicGFkZGluZy1ib3R0b20iKSttKGksImJvcmRlci10b3Atd2lkdGgiKSttKGksImJvcmRlci1ib3R0b20td2lkdGgiKX07dmFyIGM9Iig/OlstK10/WzAtOV0qXFwuP1swLTldKykiLHU9Iig/Oig/OlxccyssP1xccyopfCg/OixcXHMqKSkiLGg9bmV3IFJlZ0V4cCgidHJhbnNsYXRlXFxzKlxcKFxccyooIitjKyIpKD86Iit1KyIoIitjKyIpKT9cXHMqXFwpIiksZD1uZXcgUmVnRXhwKCJyb3RhdGVcXHMqXFwoXFxzKigiK2MrIilcXHMqXFwpIikscD1uZXcgUmVnRXhwKCJzY2FsZVxccypcXChcXHMqKCIrYysiKSg/OiIrdSsiKCIrYysiKSk/XFxzKlxcKSIpO2Z1bmN0aW9uIGYodCl7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybnttaW46dCxtYXg6dH07aWYodCBpbnN0YW5jZW9mIE9iamVjdCYmIm1pbiJpbiB0JiYibWF4ImluIHQpcmV0dXJuIHQ7dGhyb3cgbmV3IEVycm9yKCJpbnB1dCAnIit0KyInIGNhbid0IGJlIHBhcnNlZCBhcyBhbiBSYW5nZSIpfWZ1bmN0aW9uIG0odCxlKXt2YXIgbj10LmdldFByb3BlcnR5VmFsdWUoZSk7cmV0dXJuIHBhcnNlRmxvYXQobil8fDB9dC5nZXRUcmFuc2xhdGVWYWx1ZXM9ZnVuY3Rpb24gZyh0KXt2YXIgZT1oLmV4ZWModC5hdHRyKCJ0cmFuc2Zvcm0iKSk7aWYobnVsbCE9ZSl7dmFyIG49ZVsyXTtyZXR1cm5bK2VbMV0sKyh2b2lkIDA9PT1uPzA6bildfXJldHVyblswLDBdfSx0LmdldFJvdGF0ZT1mdW5jdGlvbiBfKHQpe3ZhciBlPWQuZXhlYyh0LmF0dHIoInRyYW5zZm9ybSIpKTtyZXR1cm4gbnVsbCE9ZT8rZVsxXTowfSx0LmdldFNjYWxlVmFsdWVzPWZ1bmN0aW9uIHkodCl7dmFyIGU9cC5leGVjKHQuYXR0cigidHJhbnNmb3JtIikpO2lmKG51bGwhPWUpe3ZhciBuPWVbMV0saT1lWzJdO3JldHVyblsrbixudWxsPT1pPytuOitpXX1yZXR1cm5bMCwwXX0sdC5jbGllbnRSZWN0c092ZXJsYXA9ZnVuY3Rpb24gdih0LGUpe3JldHVybiEobi5mbG9vcih0LnJpZ2h0KTw9bi5jZWlsKGUubGVmdCl8fG4uY2VpbCh0LmxlZnQpPj1uLmZsb29yKGUucmlnaHQpfHxuLmZsb29yKHQuYm90dG9tKTw9bi5jZWlsKGUudG9wKXx8bi5jZWlsKHQudG9wKT49bi5mbG9vcihlLmJvdHRvbSkpfSx0LmV4cGFuZFJlY3Q9ZnVuY3Rpb24gYih0LGUpe3JldHVybntsZWZ0OnQubGVmdC1lLHRvcDp0LnRvcC1lLHJpZ2h0OnQucmlnaHQrZSxib3R0b206dC5ib3R0b20rZSx3aWR0aDp0LndpZHRoKzIqZSxoZWlnaHQ6dC5oZWlnaHQrMiplfX0sdC5jbGllbnRSZWN0SW5zaWRlPWZ1bmN0aW9uIHgodCxlKXtyZXR1cm4gbi5mbG9vcihlLmxlZnQpPD1uLmNlaWwodC5sZWZ0KSYmbi5mbG9vcihlLnRvcCk8PW4uY2VpbCh0LnRvcCkmJm4uZmxvb3IodC5yaWdodCk8PW4uY2VpbChlLnJpZ2h0KSYmbi5mbG9vcih0LmJvdHRvbSk8PW4uY2VpbChlLmJvdHRvbSl9LHQuaW50ZXJzZWN0c0JCb3g9ZnVuY3Rpb24gdyh0LGUsbixpKXt2b2lkIDA9PT1pJiYoaT0uNSk7dmFyIHI9Zih0KSxvPWYoZSk7cmV0dXJuIG4ueCtuLndpZHRoPj1yLm1pbi1pJiZuLng8PXIubWF4K2kmJm4ueStuLmhlaWdodD49by5taW4taSYmbi55PD1vLm1heCtpfSx0LmdldEh0bWxFbGVtZW50QW5jZXN0b3JzPWZ1bmN0aW9uIFModCl7Zm9yKHZhciBlPVtdO3QmJnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDspZS5wdXNoKHQpLHQ9dC5wYXJlbnRFbGVtZW50O3JldHVybiBlfSx0LmdldEVsZW1lbnRUcmFuc2Zvcm09ZnVuY3Rpb24gTSh0KXt2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpO3JldHVybihmdW5jdGlvbiBuKHQpe2lmKG51bGw9PXR8fCJub25lIj09PXQpcmV0dXJuIG51bGw7dmFyIGU9dC5tYXRjaChFKTtpZihudWxsPT1lfHxlLmxlbmd0aDwyKXJldHVybiBudWxsO3ZhciBuPWVbMV0uc3BsaXQoVCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gcGFyc2VGbG9hdCh0KX0pKTtyZXR1cm4gNiE9bi5sZW5ndGg/bnVsbDpufSkoZS5nZXRQcm9wZXJ0eVZhbHVlKCItd2Via2l0LXRyYW5zZm9ybSIpfHxlLmdldFByb3BlcnR5VmFsdWUoIi1tb3otdHJhbnNmb3JtIil8fGUuZ2V0UHJvcGVydHlWYWx1ZSgiLW1zLXRyYW5zZm9ybSIpfHxlLmdldFByb3BlcnR5VmFsdWUoIi1vLXRyYW5zZm9ybSIpfHxlLmdldFByb3BlcnR5VmFsdWUoInRyYW5zZm9ybSIpKX07dmFyIEU9L15tYXRyaXhcKChbXildKylcKSQvLFQ9L1ssIF0rL30pKGVfdCk7dmFyIG5fdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkobl90LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgaV90PUVkdCxyX3Q9ZV90LG9fdD13aW5kb3cuTWF0aCxhX3Q9WzEsMCwwLDEsMCwwXTtmdW5jdGlvbiBzX3QodCxlKXtyZXR1cm5bdFswXSplWzBdK3RbMl0qZVsxXSx0WzFdKmVbMF0rdFszXSplWzFdLHRbMF0qZVsyXSt0WzJdKmVbM10sdFsxXSplWzJdK3RbM10qZVszXSx0WzBdKmVbNF0rdFsyXSplWzVdK3RbNF0sdFsxXSplWzRdK3RbM10qZVs1XSt0WzVdXX1mdW5jdGlvbiBsX3QodCxlKXtyZXR1cm5bdFswXSx0WzFdLHRbMl0sdFszXSx0WzBdKmVbMF0rdFsyXSplWzFdK3RbNF0sdFsxXSplWzBdK3RbM10qZVsxXSt0WzVdXX1mdW5jdGlvbiBjX3QodCl7dmFyIGU9dFswXSp0WzNdLXRbMV0qdFsyXTtpZigwPT09ZSl0aHJvdyBuZXcgRXJyb3IoInNpbmd1bGFyIG1hdHJpeCIpO3ZhciBuPTEvZTtyZXR1cm5bbip0WzNdLG4qLXRbMV0sbiotdFsyXSxuKnRbMF0sbiooLXRbM10qdFs0XSt0WzJdKnRbNV0pLG4qKHRbMV0qdFs0XSstdFswXSp0WzVdKV19bl90LmluUmFuZ2U9ZnVuY3Rpb24gdV90KHQsZSxuKXtyZXR1cm4gb190Lm1pbihlLG4pPD10JiZ0PD1vX3QubWF4KGUsbil9LG5fdC5jbGFtcD1mdW5jdGlvbiBoX3QodCxlLG4pe3JldHVybiBvX3QubWluKG9fdC5tYXgoZSx0KSxuKX0sbl90Lm1heD1mdW5jdGlvbiBkX3QodCxlLG4pe3ZhciBpPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bnVsbCxyPW51bGw9PWk/ZTpuLG89bnVsbD09aT9pX3QubWF4KHQpOmlfdC5tYXgodCxpKTtyZXR1cm4gdm9pZCAwIT09bz9vOnJ9LG5fdC5taW49ZnVuY3Rpb24gcF90KHQsZSxuKXt2YXIgaT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm51bGwscj1udWxsPT1pP2U6bixvPW51bGw9PWk/aV90Lm1pbih0KTppX3QubWluKHQsaSk7cmV0dXJuIHZvaWQgMCE9PW8/bzpyfSxuX3QuaXNOYU49ZnVuY3Rpb24gZl90KHQpe3JldHVybiB0IT10fSxuX3QuaXNWYWxpZE51bWJlcj1mdW5jdGlvbiBtX3QodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0LXQ8MX0sbl90LnJhbmdlPWZ1bmN0aW9uIGdfdCh0LGUsbil7aWYodm9pZCAwPT09biYmKG49MSksMD09PW4pdGhyb3cgbmV3IEVycm9yKCJzdGVwIGNhbm5vdCBiZSAwIik7Zm9yKHZhciBpPW9fdC5tYXgob190LmNlaWwoKGUtdCkvbiksMCkscj1bXSxvPTA7bzxpOysrbylyW29dPXQrbipvO3JldHVybiByfSxuX3QuZGlzdGFuY2VTcXVhcmVkPWZ1bmN0aW9uIF9fdCh0LGUpe3JldHVybiBvX3QucG93KGUueS10LnksMikrb190LnBvdyhlLngtdC54LDIpfSxuX3QuZGVncmVlc1RvUmFkaWFucz1mdW5jdGlvbiB5X3QodCl7cmV0dXJuIHQvMzYwKm9fdC5QSSoyfSxuX3Qud2l0aGluPWZ1bmN0aW9uIHZfdCh0LGUpe3JldHVybiBlLnRvcExlZnQueDw9dC54JiZlLmJvdHRvbVJpZ2h0Lng+PXQueCYmZS50b3BMZWZ0Lnk8PXQueSYmZS5ib3R0b21SaWdodC55Pj10Lnl9LG5fdC5ib3VuZHNJbnRlcnNlY3RzPWZ1bmN0aW9uIGJfdCh0LGUsbixpLHIsbyxhLHMpe3JldHVybiB0PD1yK2EmJnI8PXQrbiYmZTw9bytzJiZvPD1lK2l9LG5fdC5nZXRDdW11bGF0aXZlVHJhbnNmb3JtPWZ1bmN0aW9uIHhfdCh0KXtmb3IodmFyIGU9cl90LmdldEh0bWxFbGVtZW50QW5jZXN0b3JzKHQpLG49YV90LGk9bnVsbCxyPTAsbz1lO3I8by5sZW5ndGg7cisrKXt2YXIgYT1vW3JdLHM9cl90LmdldEVsZW1lbnRUcmFuc2Zvcm0oYSk7aWYobnVsbCE9cyl7dmFyIGw9YS5jbGllbnRXaWR0aC8yLGM9YS5jbGllbnRIZWlnaHQvMjtuPWxfdChuLFtsLGNdKSxuPWxfdChuPXNfdChuLGNfdChzKSksWy1sLC1jXSl9dmFyIHU9YS5zY3JvbGxMZWZ0LGg9YS5zY3JvbGxUb3A7bnVsbCE9PWkmJmEhPT1pfHwodS09YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxoLT1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxpPWEub2Zmc2V0UGFyZW50KSxuPWxfdChuLFt1LGhdKX1yZXR1cm4gbn0sbl90Lm11bHRpcGx5TWF0cml4PXNfdCxuX3QucHJlbXVsdGlwbHlUcmFuc2xhdGU9ZnVuY3Rpb24gd190KHQsZSl7cmV0dXJuW2VbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSt0WzBdLGVbNV0rdFsxXV19LG5fdC5tdWx0aXBseVRyYW5zbGF0ZT1sX3Qsbl90LmludmVydE1hdHJpeD1jX3Qsbl90LmFwcGx5VHJhbnNmb3JtPWZ1bmN0aW9uIFNfdCh0LGUpe3JldHVybnt4OnRbMF0qZS54K3RbMl0qZS55K3RbNF0seTp0WzFdKmUueCt0WzNdKmUueSt0WzVdfX07dmFyIE1fdD17fSxFX3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTctcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFX3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBUX3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49TWF0aC5jZWlsKHQubGVuZ3RoLzIpLGk9MDtpPG47aSsrKWVbMF0uaW5zZXJ0KHRbaV0pO2ZvcihpPW47aTx0Lmxlbmd0aDtpKyspZVsxXS5pbnNlcnQodFtpXSl9LHR9KSgpO0VfdC5TcGxpdFN0cmF0ZWd5VHJpdmlhbD1UX3Q7dmFyIENfdD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbih0LGUpe2Zvcih0PXQuc2xpY2UoKSx0aGlzLmNob29zZUZpcnN0U3BsaXQodCxlKTt0Lmxlbmd0aD4wOyl0aGlzLmFkZE5leHQodCxlKX0sdC5wcm90b3R5cGUuY2hvb3NlRmlyc3RTcGxpdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLGk9MCxyPXQubGVuZ3RoLTEsbz10Lmxlbmd0aC0xLGE9MTthPHQubGVuZ3RoLTE7YSsrKXt2YXIgcz10W2FdO3MuYm91bmRzLnhsPnRbcl0uYm91bmRzLnhsP3I9YTpzLmJvdW5kcy54aDx0W25dLmJvdW5kcy54aCYmKG49YSkscy5ib3VuZHMueWw+dFtvXS5ib3VuZHMueWw/bz1hOnMuYm91bmRzLnloPHRbaV0uYm91bmRzLnloJiYoaT1hKX12YXIgbD1NYXRoLmFicyh0W25dLmJvdW5kcy54aC10W3JdLmJvdW5kcy54bCk+TWF0aC5hYnModFtpXS5ib3VuZHMueWgtdFtvXS5ib3VuZHMueWwpP1tuLHJdOltpLG9dLGM9bFswXSx1PWxbMV07Yz09PXUmJihjPTAsdT10Lmxlbmd0aC0xKSxlWzBdLmluc2VydCh0LnNwbGljZShNYXRoLm1heChjLHUpLDEpWzBdKSxlWzFdLmluc2VydCh0LnNwbGljZShNYXRoLm1pbihjLHUpLDEpWzBdKX0sdC5wcm90b3R5cGUuYWRkTmV4dD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1udWxsLGk9bnVsbCxyPW51bGwsbz0wO288dC5sZW5ndGg7bysrKXt2YXIgYT10W29dLHM9ZVswXS51bmlvbkFyZWFEaWZmZXJlbmNlKGEuYm91bmRzKSxsPWVbMV0udW5pb25BcmVhRGlmZmVyZW5jZShhLmJvdW5kcyk7KHM8aXx8bnVsbD09bikmJihuPW8saT1zLHI9ZVswXSksbDxpJiYobj1vLGk9bCxyPWVbMV0pfXIuaW5zZXJ0KHQuc3BsaWNlKG4sMSlbMF0pfSx0fSkoKTtFX3QuU3BsaXRTdHJhdGVneUxpbmVhcj1DX3QsKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE3LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGUsbj1uZXcgRV90LlNwbGl0U3RyYXRlZ3lMaW5lYXI7ZnVuY3Rpb24gaSh0LG4saSl7dmFyIHI9MS8wLG89MS8wO3JldHVybiBmdW5jdGlvbihhKXt2YXIgcz1uKGEuYm91bmRzLHQpLGw9aShhLmJvdW5kcyx0KTtyZXR1cm4gbnVsbCE9YS52YWx1ZT9zPHI/KHI9cyxvPWwsZS5QQVNTX0FORF9PVkVSV1JJVEUpOnM9PT1yP2UuUEFTUzplLkZBSUw6cz5vP2UuRkFJTDoobz1NYXRoLm1heChsLG8pLGUuUEFTUyl9fWZ1bmN0aW9uIHIodCxlKXtyZXR1cm4gZnVuY3Rpb24obixpKXtyZXR1cm4gZShpLmJvdW5kcyx0KS1lKG4uYm91bmRzLHQpfX0hKGZ1bmN0aW9uKHQpe3RbdC5QQVNTPTBdPSJQQVNTIix0W3QuRkFJTD0xXT0iRkFJTCIsdFt0LlBBU1NfQU5EX09WRVJXUklURT0yXT0iUEFTU19BTkRfT1ZFUldSSVRFIn0pKGU9dC5RdWVyeVByZWRpY2F0ZVJlc3VsdHx8KHQuUXVlcnlQcmVkaWNhdGVSZXN1bHQ9e30pKSx0LmNyZWF0ZU1pbmltaXppbmdOb2RlUHJlZGljYXRlPWksdC5jcmVhdGVOb2RlU29ydD1yO3ZhciBvPShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt2b2lkIDA9PT10JiYodD01KSx2b2lkIDA9PT1lJiYoZT1uKSx0aGlzLm1heE5vZGVDaGlsZHJlbj10LHRoaXMuc3BsaXRTdHJhdGVneT1lLHRoaXMucm9vdD1uZXcgYSghMCksdGhpcy5zaXplPTB9cmV0dXJuIHQucHJvdG90eXBlLmdldFJvb3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb290fSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMucm9vdD1uZXcgYSghMCksdGhpcy5zaXplPTB9LHQucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLnJvb3Q7IW4ubGVhZjspbj1uLnN1YnRyZWUodCk7dmFyIGk9YS52YWx1ZU5vZGUodCxlKTtmb3Iobi5pbnNlcnQoaSksdGhpcy5zaXplKz0xO24ub3ZlcmZsb3codGhpcy5tYXhOb2RlQ2hpbGRyZW4pOyludWxsPT0obj1uLnNwbGl0KHRoaXMuc3BsaXRTdHJhdGVneSkpLnBhcmVudCYmKHRoaXMucm9vdD1uKTtyZXR1cm4gaX0sdC5wcm90b3R5cGUubG9jYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnF1ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4gZS5jb250YWlucyh0KX0pKX0sdC5wcm90b3R5cGUubG9jYXRlTmVhcmVzdD1mdW5jdGlvbih0KXt2YXIgZT1pKHQscy5kaXN0YW5jZVNxdWFyZWRUb05lYXJFZGdlLHMuZGlzdGFuY2VTcXVhcmVkVG9GYXJFZGdlKTtyZXR1cm4gdGhpcy5xdWVyeU5vZGVzKGUpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQudmFsdWV9KSl9LHQucHJvdG90eXBlLmxvY2F0ZU5lYXJlc3RYPWZ1bmN0aW9uKHQpe3ZhciBlPWkodCxzLmFic29sdXRlRGlzdGFuY2VUb05lYXJFZGdlWCxzLmFic29sdXRlRGlzdGFuY2VUb0ZhckVkZ2VYKSxuPXRoaXMucXVlcnlOb2RlcyhlKTtyZXR1cm4gbi5zb3J0KHIodCxzLmFic29sdXRlRGlzdGFuY2VUb05lYXJFZGdlWSkpLG4ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC52YWx1ZX0pKX0sdC5wcm90b3R5cGUubG9jYXRlTmVhcmVzdFk9ZnVuY3Rpb24odCl7dmFyIGU9aSh0LHMuYWJzb2x1dGVEaXN0YW5jZVRvTmVhckVkZ2VZLHMuYWJzb2x1dGVEaXN0YW5jZVRvRmFyRWRnZVkpLG49dGhpcy5xdWVyeU5vZGVzKGUpO3JldHVybiBuLnNvcnQocih0LHMuYWJzb2x1dGVEaXN0YW5jZVRvTmVhckVkZ2VYKSksbi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnZhbHVlfSkpfSx0LnByb3RvdHlwZS5pbnRlcnNlY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucXVlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiBzLmlzQm91bmRzT3ZlcmxhcEJvdW5kcyhlLHQpfSkpfSx0LnByb3RvdHlwZS5pbnRlcnNlY3RYPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnF1ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4gcy5pc0JvdW5kc092ZXJsYXBYKGUsdCl9KSl9LHQucHJvdG90eXBlLmludGVyc2VjdFk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucXVlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiBzLmlzQm91bmRzT3ZlcmxhcFkoZSx0KX0pKX0sdC5wcm90b3R5cGUucXVlcnk9ZnVuY3Rpb24odCl7dmFyIGU9W107aWYobnVsbCE9dGhpcy5yb290LmJvdW5kcyYmIXQodGhpcy5yb290LmJvdW5kcykpcmV0dXJuIGU7Zm9yKHZhciBuPVt0aGlzLnJvb3RdO24ubGVuZ3RoPjA7KWZvcih2YXIgaT1uLnNoaWZ0KCkscj0wO3I8aS5lbnRyaWVzLmxlbmd0aDtyKyspe3ZhciBvPWkuZW50cmllc1tyXTt0KG8uYm91bmRzKSYmKGkubGVhZj9lLnB1c2goby52YWx1ZSk6bi5wdXNoKG8pKX1yZXR1cm4gZX0sdC5wcm90b3R5cGUucXVlcnlOb2Rlcz1mdW5jdGlvbih0KXt2YXIgbj1bXTtpZihudWxsIT10aGlzLnJvb3QuYm91bmRzJiZ0KHRoaXMucm9vdCk9PT1lLkZBSUwpcmV0dXJuIG47Zm9yKHZhciBpPVt0aGlzLnJvb3RdO2kubGVuZ3RoPjA7KWZvcih2YXIgcj1pLnNoaWZ0KCksbz0wO288ci5lbnRyaWVzLmxlbmd0aDtvKyspe3ZhciBhPXIuZW50cmllc1tvXSxzPXQoYSk7cz09PWUuUEFTU19BTkRfT1ZFUldSSVRFJiYobj1bXSkscyE9PWUuUEFTUyYmcyE9PWUuUEFTU19BTkRfT1ZFUldSSVRFfHwoci5sZWFmP24ucHVzaChhKTppLnB1c2goYSkpfXJldHVybiBufSx0fSkoKTt0LlJUcmVlPW87dmFyIGE9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLmxlYWY9dCx0aGlzLmJvdW5kcz1udWxsLHRoaXMuZW50cmllcz1bXSx0aGlzLnBhcmVudD1udWxsLHRoaXMudmFsdWU9bnVsbH1yZXR1cm4gdC52YWx1ZU5vZGU9ZnVuY3Rpb24oZSxuKXt2YXIgaT1uZXcgdCghMCk7cmV0dXJuIGkuYm91bmRzPWUsaS52YWx1ZT1uLGl9LHQucHJvdG90eXBlLm92ZXJmbG93PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVudHJpZXMubGVuZ3RoPnR9LHQucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0KXt0aGlzLmVudHJpZXMucHVzaCh0KSx0LnBhcmVudD10aGlzO2Zvcih2YXIgZT10aGlzO251bGwhPWU7KWUuYm91bmRzPXMudW5pb25BbGwoW2UuYm91bmRzLHQuYm91bmRzXSksZT1lLnBhcmVudDtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZW50cmllcy5pbmRleE9mKHQpO2lmKGU+PTApe3RoaXMuZW50cmllcy5zcGxpY2UoZSwxKTtmb3IodmFyIG49dGhpcztudWxsIT1uOyluLmJvdW5kcz1zLnVuaW9uQWxsKG4uZW50cmllcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmJvdW5kc30pKSksbj1uLnBhcmVudH1yZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuc3VidHJlZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MS8wLG49bnVsbCxpPTA7aTx0aGlzLmVudHJpZXMubGVuZ3RoO2krKyl7dmFyIHI9dGhpcy5lbnRyaWVzW2ldLG89ci51bmlvbkFyZWFEaWZmZXJlbmNlKHQpOyhvPGV8fG89PT1lJiZudWxsIT1uJiZyLmVudHJpZXMubGVuZ3RoPG4uZW50cmllcy5sZW5ndGgpJiYobj1yKX1yZXR1cm4gbn0sdC5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24oZSl7bnVsbCE9dGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJlbW92ZSh0aGlzKTt2YXIgbj1bbmV3IHQodGhpcy5sZWFmKSxuZXcgdCh0aGlzLmxlYWYpXTtlLnNwbGl0KHRoaXMuZW50cmllcyxuKTt2YXIgaT1udWxsIT10aGlzLnBhcmVudD90aGlzLnBhcmVudDpuZXcgdCghMSk7cmV0dXJuIGkuaW5zZXJ0KG5bMF0pLGkuaW5zZXJ0KG5bMV0pLGkubGVhZj0hMSxpfSx0LnByb3RvdHlwZS51bmlvbkFyZWFEaWZmZXJlbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmFicyhzLnVuaW9uKHRoaXMuYm91bmRzLHQpLmFyZWEoKS10aGlzLmJvdW5kcy5hcmVhKCkpfSx0LnByb3RvdHlwZS5tYXhEZXB0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxlYWY/MToxK3RoaXMuZW50cmllcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm1heERlcHRoKCl9KSkucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLm1heCh0LGUpfSkpfSx0fSkoKTt0LlJUcmVlTm9kZT1hO3ZhciBzPShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4saSl7dGhpcy54bD10LHRoaXMueWw9ZSx0aGlzLnhoPW4sdGhpcy55aD1pLHRoaXMud2lkdGg9dGhpcy54aC10aGlzLnhsLHRoaXMuaGVpZ2h0PXRoaXMueWgtdGhpcy55bH1yZXR1cm4gdC54eXdoPWZ1bmN0aW9uKGUsbixpLHIpe3JldHVybiBuZXcgdChlLG4sZStpLG4rcil9LHQuZW50aXR5Qm91bmRzPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdChlLngsZS55LGUueCtlLndpZHRoLGUueStlLmhlaWdodCl9LHQuYm91bmRzPWZ1bmN0aW9uKGUpe3JldHVybiB0LnBvaW50UGFpcihlLnRvcExlZnQsZS5ib3R0b21SaWdodCl9LHQucG9pbnRQYWlyPWZ1bmN0aW9uKGUsbil7cmV0dXJuIG5ldyB0KE1hdGgubWluKGUueCxuLngpLE1hdGgubWluKGUueSxuLnkpLE1hdGgubWF4KGUueCxuLngpLE1hdGgubWF4KGUueSxuLnkpKX0sdC5wb2ludHM9ZnVuY3Rpb24oZSl7aWYoZS5sZW5ndGg8Mil0aHJvdyBuZXcgRXJyb3IoIm5lZWQgYXQgbGVhc3QgMiBwb2ludHMgdG8gY3JlYXRlIGJvdW5kcyIpO3ZhciBuPWUubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC54fSkpLGk9ZS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lnl9KSk7cmV0dXJuIG5ldyB0KG4ucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLm1pbih0LGUpfSkpLGkucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLm1pbih0LGUpfSkpLG4ucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLm1heCh0LGUpfSkpLGkucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLm1heCh0LGUpfSkpKX0sdC51bmlvbj1mdW5jdGlvbihlLG4pe3JldHVybiBuZXcgdChNYXRoLm1pbihlLnhsLG4ueGwpLE1hdGgubWluKGUueWwsbi55bCksTWF0aC5tYXgoZS54aCxuLnhoKSxNYXRoLm1heChlLnloLG4ueWgpKX0sdC51bmlvbkFsbD1mdW5jdGlvbihlKXtyZXR1cm4gMD09PShlPWUuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dH0pKSkubGVuZ3RoP251bGw6ZS5yZWR1Y2UoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQudW5pb24oZSxuKX0pKX0sdC5pc0JvdW5kc092ZXJsYXBCb3VuZHM9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5pc0JvdW5kc092ZXJsYXBYKGUsbikmJnQuaXNCb3VuZHNPdmVybGFwWShlLG4pfSx0LmlzQm91bmRzT3ZlcmxhcFg9ZnVuY3Rpb24odCxlKXtyZXR1cm4hKHQueGg8ZS54bHx8dC54bD5lLnhoKX0sdC5pc0JvdW5kc092ZXJsYXBZPWZ1bmN0aW9uKHQsZSl7cmV0dXJuISh0LnloPGUueWx8fHQueWw+ZS55aCl9LHQuYWJzb2x1dGVEaXN0YW5jZVRvTmVhckVkZ2VYPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC53aWR0aC8yO3JldHVybiBNYXRoLm1heChNYXRoLmFicyhlLngtKHQueGwrbikpLW4sMCl9LHQuYWJzb2x1dGVEaXN0YW5jZVRvTmVhckVkZ2VZPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5oZWlnaHQvMjtyZXR1cm4gTWF0aC5tYXgoTWF0aC5hYnMoZS55LSh0LnlsK24pKS1uLDApfSx0LmFic29sdXRlRGlzdGFuY2VUb0ZhckVkZ2VYPWZ1bmN0aW9uKGUsbil7dmFyIGk9dC5hYnNvbHV0ZURpc3RhbmNlVG9OZWFyRWRnZVgoZSxuKTtyZXR1cm4gMD09PWk/MDppK2Uud2lkdGh9LHQuYWJzb2x1dGVEaXN0YW5jZVRvRmFyRWRnZVk9ZnVuY3Rpb24oZSxuKXt2YXIgaT10LmFic29sdXRlRGlzdGFuY2VUb05lYXJFZGdlWShlLG4pO3JldHVybiAwPT09aT8wOmkrZS5oZWlnaHR9LHQuZGlzdGFuY2VTcXVhcmVkVG9OZWFyRWRnZT1mdW5jdGlvbihlLG4pe3ZhciBpPXQuYWJzb2x1dGVEaXN0YW5jZVRvTmVhckVkZ2VYKGUsbikscj10LmFic29sdXRlRGlzdGFuY2VUb05lYXJFZGdlWShlLG4pO3JldHVybiBpKmkrcipyfSx0LmRpc3RhbmNlU3F1YXJlZFRvRmFyRWRnZT1mdW5jdGlvbihlLG4pe3ZhciBpPXQuYWJzb2x1dGVEaXN0YW5jZVRvRmFyRWRnZVgoZSxuKSxyPXQuYWJzb2x1dGVEaXN0YW5jZVRvRmFyRWRnZVkoZSxuKTtyZXR1cm4gaSppK3Iqcn0sdC5wcm90b3R5cGUuYXJlYT1mdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLmFyZWFDYWNoZWQmJih0aGlzLmFyZWFDYWNoZWQ9KHRoaXMueGgtdGhpcy54bCkqKHRoaXMueWgtdGhpcy55bCkpLHRoaXMuYXJlYUNhY2hlZH0sdC5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueGw8PXQueCYmdGhpcy54aD49dC54JiZ0aGlzLnlsPD10LnkmJnRoaXMueWg+PXQueX0sdH0pKCk7dC5SVHJlZUJvdW5kcz1zfSkoTV90KTt2YXIgQV90PXt9OyEoZnVuY3Rpb24odCl7Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZT1FZHQsbj1TZS5leHBvcnRzLGk9Rmd0O3QuSVN0YWNraW5nT3JkZXI9U210Lm1ha2VFbnVtKFsidG9wZG93biIsImJvdHRvbXVwIl0pO3ZhciByPXdpbmRvdy5NYXRoO3Quc3RhY2s9ZnVuY3Rpb24gbyhuLHIsYSxzKXt2b2lkIDA9PT1zJiYocz0iYm90dG9tdXAiKTt2YXIgbD1lLm1hcCgpLGM9ZS5tYXAoKSx1PW5ldyBpLk1hcDsidG9wZG93biI9PT1zJiYobj1uLnNsaWNlKCkpLnJldmVyc2UoKTtmb3IodmFyIGg9MCxkPW47aDxkLmxlbmd0aDtoKyspe2Zvcih2YXIgcD1kW2hdLGY9bmV3IGkuTWFwLG09cC5kYXRhKCksZz1tLmxlbmd0aCxfPTA7XzxnO18rKyl7dmFyIHk9bVtfXSx2PXIoeSxfLHApLGI9dC5ub3JtYWxpemVLZXkodikseD0rYSh5LF8scCksdz12b2lkIDAsUz14Pj0wP2w6YztTLmhhcyhiKT8odz1TLmdldChiKSxTLnNldChiLHcreCkpOih3PTAsUy5zZXQoYix4KSksZi5zZXQoYix7b2Zmc2V0OncsdmFsdWU6eCxheGlzVmFsdWU6dixvcmlnaW5hbERhdHVtOnksb3JpZ2luYWxEYXRhc2V0OnAsb3JpZ2luYWxJbmRleDpffSl9dS5zZXQocCxmKX1yZXR1cm4gdX0sdC5zdGFja2VkRXh0ZW50cz1mdW5jdGlvbiBhKHQpe3ZhciBlPW5ldyBpLk1hcCxuPW5ldyBpLk1hcDtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQscil7dmFyIG89dC5vZmZzZXQrdC52YWx1ZSxhPWkuTWF0aC5tYXgoW28sdC5vZmZzZXRdLHQub2Zmc2V0KSxzPWkuTWF0aC5taW4oW28sdC5vZmZzZXRdLHQub2Zmc2V0KSxsPXQuYXhpc1ZhbHVlO2UuaGFzKHIpP2UuZ2V0KHIpLmV4dGVudDxhJiZlLnNldChyLHtleHRlbnQ6YSxheGlzVmFsdWU6bCxzdGFja2VkRGF0dW06dH0pOmUuc2V0KHIse2V4dGVudDphLGF4aXNWYWx1ZTpsLHN0YWNrZWREYXR1bTp0fSksbi5oYXMocik/bi5nZXQocikuZXh0ZW50PnMmJm4uc2V0KHIse2V4dGVudDpzLGF4aXNWYWx1ZTpsLHN0YWNrZWREYXR1bTp0fSk6bi5zZXQocix7ZXh0ZW50OnMsYXhpc1ZhbHVlOmwsc3RhY2tlZERhdHVtOnR9KX0pKX0pKSx7bWF4aW11bUV4dGVudHM6ZSxtaW5pbXVtRXh0ZW50czpufX0sdC5zdGFja2VkRXh0ZW50PWZ1bmN0aW9uIHMoZSxuLG8pe3ZhciBhPVtdO2UuZm9yRWFjaCgoZnVuY3Rpb24oZSxpKXtmb3IodmFyIHI9aS5kYXRhKCkscz1yLmxlbmd0aCxsPTA7bDxzO2wrKyl7dmFyIGM9cltsXTtpZihudWxsPT1vfHxvKGMsbCxpKSl7dmFyIHU9ZS5nZXQodC5ub3JtYWxpemVLZXkobihjLGwsaSkpKTthLnB1c2godS52YWx1ZSt1Lm9mZnNldCl9fX0pKTt2YXIgcz1pLk1hdGgubWF4KGEsMCksbD1pLk1hdGgubWluKGEsMCk7cmV0dXJuW3IubWluKGwsMCksci5tYXgoMCxzKV19LHQubm9ybWFsaXplS2V5PW4ubWVtb2l6ZSgoZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0KX0pKX0pKEFfdCk7dmFyIGtfdD17fSxMX3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShMX3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLExfdC5TSE9XX1dBUk5JTkdTPSEwLExfdC5BRERfVElUTEVfRUxFTUVOVFM9ITAsCi8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShrX3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBQX3Q9TF90O2Z1bmN0aW9uIE5fdCh0KXtQX3QuU0hPV19XQVJOSU5HUyYmY29uc29sZS53YXJuKHQpfWZ1bmN0aW9uIElfdCh0LGUpe2Zvcih2YXIgbj1bXSxpPTI7aTxhcmd1bWVudHMubGVuZ3RoO2krKyluW2ktMl09YXJndW1lbnRzW2ldO3JldHVybiAwPT09ZT8odChuKSwtMSk6d2luZG93LnNldFRpbWVvdXQodCxlLG4pfWtfdC53YXJuPU5fdCxrX3Quc2V0VGltZW91dD1JX3Qsa190LmRlYm91bmNlPWZ1bmN0aW9uIFJfdCh0LGUsbil7dmFyIGk9bnVsbCxyPVtdLG89ZnVuY3Rpb24oKXtlLmFwcGx5KG4scil9O3JldHVybiBmdW5jdGlvbigpe3I9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSxjbGVhclRpbWVvdXQoaSksaT1JX3Qobyx0KX19LGtfdC5kZXByZWNhdGVkPWZ1bmN0aW9uIE9fdCh0LGUsbil7dm9pZCAwPT09biYmKG49IiIpLE5fdCgiTWV0aG9kICIrdCsiIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAiK2UrIi4gUGxlYXNlIHJlZmVyIHRvIHRoZSByZWxlYXNlIG5vdGVzLiAiK24pfTt2YXIgel90PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE3LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eSh6X3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBEX3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dGhpcy5lbnRyeUluZGV4PXQsdGhpcy5leGl0SW5kZXg9dCx0aGlzLm1pbkluZGV4PXQsdGhpcy5tYXhJbmRleD10LHRoaXMuYnVja2V0VmFsdWU9ZSx0aGlzLm1pblZhbHVlPW4sdGhpcy5tYXhWYWx1ZT1ufXJldHVybiB0LnByb3RvdHlwZS5pc0luQnVja2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0PT10aGlzLmJ1Y2tldFZhbHVlfSx0LnByb3RvdHlwZS5hZGRUb0J1Y2tldD1mdW5jdGlvbih0LGUpe3Q8dGhpcy5taW5WYWx1ZSYmKHRoaXMubWluVmFsdWU9dCx0aGlzLm1pbkluZGV4PWUpLHQ+dGhpcy5tYXhWYWx1ZSYmKHRoaXMubWF4VmFsdWU9dCx0aGlzLm1heEluZGV4PWUpLHRoaXMuZXhpdEluZGV4PWV9LHQucHJvdG90eXBlLmdldFVuaXF1ZUluZGljZXM9ZnVuY3Rpb24oKXt2YXIgdD1bdGhpcy5lbnRyeUluZGV4LHRoaXMubWF4SW5kZXgsdGhpcy5taW5JbmRleCx0aGlzLmV4aXRJbmRleF07cmV0dXJuIHQuZmlsdGVyKChmdW5jdGlvbihlLG4pe3JldHVybiAwPT1ufHxlIT10W24tMV19KSl9LHR9KSgpO3pfdC5CdWNrZXQ9RF90O3ZhciBCX3Q9e30sSF90PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoSF90LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgRl90PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXsiZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LlNldD90aGlzLl9lczZTZXQ9bmV3IHdpbmRvdy5TZXQ6dGhpcy5fdmFsdWVzPVtdLHRoaXMuc2l6ZT0wfXJldHVybiB0LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXRoaXMuX2VzNlNldD8odGhpcy5fZXM2U2V0LmFkZCh0KSx0aGlzLnNpemU9dGhpcy5fZXM2U2V0LnNpemUsdGhpcyk6KHRoaXMuaGFzKHQpfHwodGhpcy5fdmFsdWVzLnB1c2godCksdGhpcy5zaXplPXRoaXMuX3ZhbHVlcy5sZW5ndGgpLHRoaXMpfSx0LnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7aWYobnVsbCE9dGhpcy5fZXM2U2V0KXt2YXIgZT10aGlzLl9lczZTZXQuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemU9dGhpcy5fZXM2U2V0LnNpemUsZX12YXIgbj10aGlzLl92YWx1ZXMuaW5kZXhPZih0KTtyZXR1cm4tMSE9PW4mJih0aGlzLl92YWx1ZXMuc3BsaWNlKG4sMSksdGhpcy5zaXplPXRoaXMuX3ZhbHVlcy5sZW5ndGgsITApfSx0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXRoaXMuX2VzNlNldD90aGlzLl9lczZTZXQuaGFzKHQpOi0xIT09dGhpcy5fdmFsdWVzLmluZGV4T2YodCl9LHQucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO251bGw9PXRoaXMuX2VzNlNldD90aGlzLl92YWx1ZXMuZm9yRWFjaCgoZnVuY3Rpb24oaSl7dC5jYWxsKGUsaSxpLG4pfSkpOnRoaXMuX2VzNlNldC5mb3JFYWNoKChmdW5jdGlvbihpLHIpe3JldHVybiB0LmNhbGwoZSxpLHIsbil9KSxlKX0sdH0pKCk7SF90LlNldD1GX3QsCi8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCX3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBWX3Q9dU8sVV90PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gVl90Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLmNhbGxDYWxsYmFja3M9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvckVhY2goKGZ1bmN0aW9uKG4pe24uYXBwbHkodCxlKX0pKSx0aGlzfSxlfSkoSF90LlNldCk7Ql90LkNhbGxiYWNrU2V0PVVfdDt2YXIgal90PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShqX3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBHX3Q9TV90LFdfdD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fZW50aXRpZXM9W10sdGhpcy5fcnRyZWU9bmV3IEdfdC5SVHJlZX1yZXR1cm4gdC5wcm90b3R5cGUuYWRkQWxsPWZ1bmN0aW9uKHQsZSxuKXtpZih0aGlzLl9lbnRpdGllcz10aGlzLl9lbnRpdGllcy5jb25jYXQodCksdm9pZCAwIT09bilmb3IodmFyIGk9R190LlJUcmVlQm91bmRzLmJvdW5kcyhuKSxyPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBvPUdfdC5SVHJlZUJvdW5kcy5lbnRpdHlCb3VuZHMoZShhPXRbcl0pKTtHX3QuUlRyZWVCb3VuZHMuaXNCb3VuZHNPdmVybGFwQm91bmRzKGksbykmJnRoaXMuX3J0cmVlLmluc2VydChvLGEpfWVsc2UgZm9yKHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIGE7bz1HX3QuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKGUoYT10W3JdKSksdGhpcy5fcnRyZWUuaW5zZXJ0KG8sYSl9fSx0LnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ydHJlZS5sb2NhdGVOZWFyZXN0KHQpLnBvcCgpfSx0LnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0WD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcnRyZWUubG9jYXRlTmVhcmVzdFgodCkucG9wKCl9LHQucHJvdG90eXBlLmVudGl0eU5lYXJlc3RZPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ydHJlZS5sb2NhdGVOZWFyZXN0WSh0KS5wb3AoKX0sdC5wcm90b3R5cGUuZW50aXRpZXNJbkJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcnRyZWUuaW50ZXJzZWN0KEdfdC5SVHJlZUJvdW5kcy5lbnRpdHlCb3VuZHModCkpfSx0LnByb3RvdHlwZS5lbnRpdGllc0luWEJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcnRyZWUuaW50ZXJzZWN0WChHX3QuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKHQpKX0sdC5wcm90b3R5cGUuZW50aXRpZXNJbllCb3VuZHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3J0cmVlLmludGVyc2VjdFkoR190LlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyh0KSl9LHQucHJvdG90eXBlLmVudGl0aWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VudGl0aWVzfSx0fSkoKTtqX3QuRW50aXR5U3RvcmU9V190O3ZhciBxX3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KHFfdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFlfdD1uX3QsWF90PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXsiZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Lk1hcD90aGlzLl9lczZNYXA9bmV3IHdpbmRvdy5NYXA6dGhpcy5fa2V5VmFsdWVQYWlycz1bXX1yZXR1cm4gdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7aWYoWV90LmlzTmFOKHQpKXRocm93IG5ldyBFcnJvcigiTmFOIG1heSBub3QgYmUgdXNlZCBhcyBhIGtleSB0byB0aGUgTWFwIik7aWYobnVsbCE9dGhpcy5fZXM2TWFwKXJldHVybiB0aGlzLl9lczZNYXAuc2V0KHQsZSksdGhpcztmb3IodmFyIG49MDtuPHRoaXMuX2tleVZhbHVlUGFpcnMubGVuZ3RoO24rKylpZih0aGlzLl9rZXlWYWx1ZVBhaXJzW25dLmtleT09PXQpcmV0dXJuIHRoaXMuX2tleVZhbHVlUGFpcnNbbl0udmFsdWU9ZSx0aGlzO3JldHVybiB0aGlzLl9rZXlWYWx1ZVBhaXJzLnB1c2goe2tleTp0LHZhbHVlOmV9KSx0aGlzfSx0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7aWYobnVsbCE9dGhpcy5fZXM2TWFwKXJldHVybiB0aGlzLl9lczZNYXAuZ2V0KHQpO2Zvcih2YXIgZT0wO2U8dGhpcy5fa2V5VmFsdWVQYWlycy5sZW5ndGg7ZSsrKWlmKHRoaXMuX2tleVZhbHVlUGFpcnNbZV0ua2V5PT09dClyZXR1cm4gdGhpcy5fa2V5VmFsdWVQYWlyc1tlXS52YWx1ZX0sdC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe2lmKG51bGwhPXRoaXMuX2VzNk1hcClyZXR1cm4gdGhpcy5fZXM2TWFwLmhhcyh0KTtmb3IodmFyIGU9MDtlPHRoaXMuX2tleVZhbHVlUGFpcnMubGVuZ3RoO2UrKylpZih0aGlzLl9rZXlWYWx1ZVBhaXJzW2VdLmtleT09PXQpcmV0dXJuITA7cmV0dXJuITF9LHQucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO251bGw9PXRoaXMuX2VzNk1hcD90aGlzLl9rZXlWYWx1ZVBhaXJzLmZvckVhY2goKGZ1bmN0aW9uKGkpe3QuY2FsbChlLGkudmFsdWUsaS5rZXksbil9KSk6dGhpcy5fZXM2TWFwLmZvckVhY2goKGZ1bmN0aW9uKGkscil7cmV0dXJuIHQuY2FsbChlLGkscixuKX0pLGUpfSx0LnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7aWYobnVsbCE9dGhpcy5fZXM2TWFwKXJldHVybiB0aGlzLl9lczZNYXAuZGVsZXRlKHQpO2Zvcih2YXIgZT0wO2U8dGhpcy5fa2V5VmFsdWVQYWlycy5sZW5ndGg7ZSsrKWlmKHRoaXMuX2tleVZhbHVlUGFpcnNbZV0ua2V5PT09dClyZXR1cm4gdGhpcy5fa2V5VmFsdWVQYWlycy5zcGxpY2UoZSwxKSwhMDtyZXR1cm4hMX0sdH0pKCk7cV90Lk1hcD1YX3Q7dmFyICRfdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNy1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoJF90LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSwkX3QuYXNzaWduPWZ1bmN0aW9uIEtfdCgpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTtmb3IodmFyIG49e30saT0wLHI9dDtpPHIubGVuZ3RoO2krKylmb3IodmFyIG89cltpXSxhPU9iamVjdC5rZXlzKG8pLHM9MCxsPWE7czxsLmxlbmd0aDtzKyspe3ZhciBjPWxbc107bltjXT1vW2NdfXJldHVybiBufTt2YXIgWl90PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE3LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShaX3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBKX3Q9Rmd0LFFfdD0iX19QbG90dGFibGVfQ2xpZW50VHJhbnNsYXRvciI7Wl90LmdldFRyYW5zbGF0b3I9ZnVuY3Rpb24gdHl0KHQpe3ZhciBlPXQucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpLG49ZVtRX3RdO3JldHVybiBudWxsPT1uJiYobj1uZXcgZXl0KGUpLGVbUV90XT1uKSxufTt2YXIgZXl0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5fcm9vdEVsZW1lbnQ9dH1yZXR1cm4gdC5wcm90b3R5cGUuY29tcHV0ZVBvc2l0aW9uPWZ1bmN0aW9uKHQsZSl7dmFyIG49e3g6dCx5OmV9LGk9Sl90Lk1hdGguZ2V0Q3VtdWxhdGl2ZVRyYW5zZm9ybSh0aGlzLl9yb290RWxlbWVudCk7cmV0dXJuIG51bGw9PWk/bjpKX3QuTWF0aC5hcHBseVRyYW5zZm9ybShpLG4pfSx0LmlzRXZlbnRJbnNpZGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gSl90LkRPTS5jb250YWlucyh0LnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKSxlLnRhcmdldCl9LHR9KSgpO1pfdC5UcmFuc2xhdG9yPWV5dCwoZnVuY3Rpb24odCl7Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZT11Tzt0LkFycmF5PVZndCx0LkNvbG9yPVhndCx0LkRPTT1lX3QsdC5NYXRoPW5fdCx0LlJUcmVlPU1fdCx0LlN0YWNraW5nPUFfdCx0LldpbmRvdz1rX3QsZS5fX2V4cG9ydFN0YXIoel90LHQpLGUuX19leHBvcnRTdGFyKEJfdCx0KSxlLl9fZXhwb3J0U3RhcihibXQsdCksZS5fX2V4cG9ydFN0YXIoal90LHQpLGUuX19leHBvcnRTdGFyKHFfdCx0KSxlLl9fZXhwb3J0U3RhcigkX3QsdCksZS5fX2V4cG9ydFN0YXIoSF90LHQpLGUuX19leHBvcnRTdGFyKFpfdCx0KX0pKEZndCk7dmFyIG55dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkobnl0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgaXl0PUZndCxyeXQ9SGd0LG95dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyeXQuZmx1c2goKX0sdH0pKCk7bnl0LkltbWVkaWF0ZT1veXQ7dmFyIGF5dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtpeXQuRE9NLnJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsKHJ5dC5mbHVzaCl9LHR9KSgpO255dC5BbmltYXRpb25GcmFtZT1heXQ7dmFyIHN5dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fdGltZW91dE1zZWM9aXl0LkRPTS5TQ1JFRU5fUkVGUkVTSF9SQVRFX01JTExJU0VDT05EU31yZXR1cm4gdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7c2V0VGltZW91dChyeXQuZmx1c2gsdGhpcy5fdGltZW91dE1zZWMpfSx0fSkoKTtueXQuVGltZW91dD1zeXQsKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9Rmd0LG49U210LGk9bnl0LHI9bmV3IGUuU2V0LG89bmV3IGUuU2V0LGE9ITEscz0hMTt0LlBvbGljeT1uLm1ha2VFbnVtKFsiaW1tZWRpYXRlIiwiYW5pbWF0aW9uRnJhbWUiLCJ0aW1lb3V0Il0pO3ZhciBsPW5ldyBpLkFuaW1hdGlvbkZyYW1lO2Z1bmN0aW9uIGModCl7by5hZGQodCksci5hZGQodCksdSgpfWZ1bmN0aW9uIHUoKXthfHwoYT0hMCxsLnJlbmRlcigpKX10LnJlbmRlclBvbGljeT1mdW5jdGlvbiBoKG4pe2lmKG51bGw9PW4pcmV0dXJuIGw7c3dpdGNoKG4pe2Nhc2UgdC5Qb2xpY3kuaW1tZWRpYXRlOmw9bmV3IGkuSW1tZWRpYXRlO2JyZWFrO2Nhc2UgdC5Qb2xpY3kuYW5pbWF0aW9uRnJhbWU6bD1uZXcgaS5BbmltYXRpb25GcmFtZTticmVhaztjYXNlIHQuUG9saWN5LnRpbWVvdXQ6bD1uZXcgaS5UaW1lb3V0O2JyZWFrO2RlZmF1bHQ6ZS5XaW5kb3cud2FybigiVW5yZWNvZ25pemVkIHJlbmRlclBvbGljeTogIituKX19LHQucmVnaXN0ZXJUb1JlbmRlcj1mdW5jdGlvbiBkKHQpe3MmJmUuV2luZG93Lndhcm4oIlJlZ2lzdGVyZWQgdG8gcmVuZGVyIHdoaWxlIG90aGVyIGNvbXBvbmVudHMgYXJlIGZsdXNoaW5nOiByZXF1ZXN0IG1heSBiZSBpZ25vcmVkIiksci5hZGQodCksdSgpfSx0LnJlZ2lzdGVyVG9Db21wdXRlTGF5b3V0QW5kUmVuZGVyPWMsdC5yZWdpc3RlclRvQ29tcHV0ZUxheW91dD1mdW5jdGlvbiBwKHQpe2ModCl9LHQuZmx1c2g9ZnVuY3Rpb24gZigpe2lmKGEpe28uZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY29tcHV0ZUxheW91dCgpfSkpLHIuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHQucmVuZGVyKCl9KSkscz0hMDt2YXIgdD1uZXcgZS5TZXQ7ci5mb3JFYWNoKChmdW5jdGlvbihlKXt0cnl7ZS5yZW5kZXJJbW1lZGlhdGVseSgpfWNhdGNoKG4pe3dpbmRvdy5zZXRUaW1lb3V0KChmdW5jdGlvbigpe3Rocm93IG59KSwwKSx0LmFkZChlKX19KSksbz1uZXcgZS5TZXQscj10LGE9ITEscz0hMX19fSkoSGd0KSwKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KEJndCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGx5dD1FZHQsY3l0PUhndCx1eXQ9Rmd0LGh5dD1TZS5leHBvcnRzLGR5dD1ibXQscHl0PVNtdDtCZ3QuWEFsaWdubWVudD1weXQubWFrZUVudW0oWyJsZWZ0IiwiY2VudGVyIiwicmlnaHQiXSksQmd0LllBbGlnbm1lbnQ9cHl0Lm1ha2VFbnVtKFsidG9wIiwiY2VudGVyIiwiYm90dG9tIl0pO3ZhciBmeXQ9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuX292ZXJmbG93SGlkZGVuPSExLHRoaXMuX29yaWdpbj17eDowLHk6MH0sdGhpcy5feEFsaWdubWVudD0ibGVmdCIsdGhpcy5feUFsaWdubWVudD0idG9wIix0aGlzLl9pc1NldHVwPSExLHRoaXMuX2lzQW5jaG9yZWQ9ITEsdGhpcy5fY3NzQ2xhc3Nlcz1uZXcgdXl0LlNldCx0aGlzLl9kZXN0cm95ZWQ9ITEsdGhpcy5fb25BbmNob3JDYWxsYmFja3M9bmV3IHV5dC5DYWxsYmFja1NldCx0aGlzLl9vbkRldGFjaENhbGxiYWNrcz1uZXcgdXl0LkNhbGxiYWNrU2V0LHRoaXMuX2Nzc0NsYXNzZXMuYWRkKCJjb21wb25lbnQiKX1yZXR1cm4gdC5wcm90b3R5cGUuYW5jaG9yPWZ1bmN0aW9uKHQpe2lmKHQ9ZHl0LmNvZXJjZUV4dGVybmFsRDModCksdGhpcy5fZGVzdHJveWVkKXRocm93IG5ldyBFcnJvcigiQ2FuJ3QgcmV1c2UgZGVzdHJveSgpLWVkIENvbXBvbmVudHMhIik7cmV0dXJuIHRoaXMuaXNSb290KCkmJih0aGlzLl9yb290RWxlbWVudD10LHRoaXMuX3Jvb3RFbGVtZW50LmNsYXNzZWQoInBsb3R0YWJsZSIsITApKSxudWxsIT10aGlzLl9lbGVtZW50P3Qubm9kZSgpLmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQubm9kZSgpKToodGhpcy5fZWxlbWVudD10LmFwcGVuZCgiZGl2IiksdGhpcy5fc2V0dXAoKSksdGhpcy5faXNBbmNob3JlZD0hMCx0aGlzLl9vbkFuY2hvckNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMpLHRoaXN9LHQucHJvdG90eXBlLm9uQW5jaG9yPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pc0FuY2hvcmVkJiZ0KHRoaXMpLHRoaXMuX29uQW5jaG9yQ2FsbGJhY2tzLmFkZCh0KSx0aGlzfSx0LnByb3RvdHlwZS5vZmZBbmNob3I9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX29uQW5jaG9yQ2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSx0LnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX2lzU2V0dXB8fCh0aGlzLl9jc3NDbGFzc2VzLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuX2VsZW1lbnQuY2xhc3NlZChlLCEwKX0pKSx0aGlzLl9jc3NDbGFzc2VzPW5ldyB1eXQuU2V0LHRoaXMuX2JhY2tncm91bmRDb250YWluZXI9dGhpcy5fZWxlbWVudC5hcHBlbmQoInN2ZyIpLmNsYXNzZWQoImJhY2tncm91bmQtY29udGFpbmVyIiwhMCksdGhpcy5fY29udGVudD10aGlzLl9lbGVtZW50LmFwcGVuZCgic3ZnIikuY2xhc3NlZCgiY29udGVudCIsITApLHRoaXMuX2ZvcmVncm91bmRDb250YWluZXI9dGhpcy5fZWxlbWVudC5hcHBlbmQoInN2ZyIpLmNsYXNzZWQoImZvcmVncm91bmQtY29udGFpbmVyIiwhMCksdGhpcy5fY29udGVudC5jbGFzc2VkKHRoaXMuX292ZXJmbG93SGlkZGVuPyJjb21wb25lbnQtb3ZlcmZsb3ctaGlkZGVuIjoiY29tcG9uZW50LW92ZXJmbG93LXZpc2libGUiLCEwKSx0aGlzLl9pc1NldHVwPSEwKX0sdC5wcm90b3R5cGUucmVxdWVzdGVkU3BhY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm57bWluV2lkdGg6MCxtaW5IZWlnaHQ6MH19LHQucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oZSxuLGkpe2lmKG51bGw9PWV8fG51bGw9PW58fG51bGw9PWkpe2lmKG51bGw9PXRoaXMuX2VsZW1lbnQpdGhyb3cgbmV3IEVycm9yKCJhbmNob3IoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY29tcHV0ZUxheW91dCgpIik7aWYobnVsbD09dGhpcy5fcm9vdEVsZW1lbnQpdGhyb3cgbmV3IEVycm9yKCJudWxsIGFyZ3VtZW50cyBjYW5ub3QgYmUgcGFzc2VkIHRvIGNvbXB1dGVMYXlvdXQoKSBvbiBhIG5vbi1yb290LCB1bmFuY2hvcmVkIG5vZGUiKTtlPXt4OjAseTowfTt2YXIgcj10aGlzLl9yb290RWxlbWVudC5ub2RlKCk7bj11eXQuRE9NLmVsZW1lbnRXaWR0aChyKSxpPXV5dC5ET00uZWxlbWVudEhlaWdodChyKX12YXIgbz10aGlzLl9zaXplRnJvbU9mZmVyKG4saSksYT1vLmhlaWdodCxzPW8ud2lkdGg7cmV0dXJuIHRoaXMuc2V0Qm91bmRzKHMsYSxlLngrKG4tcykqdC5feEFsaWduVG9Qcm9wb3J0aW9uW3RoaXMuX3hBbGlnbm1lbnRdLGUueSsoaS1hKSp0Ll95QWxpZ25Ub1Byb3BvcnRpb25bdGhpcy5feUFsaWdubWVudF0pLHRoaXN9LHQucHJvdG90eXBlLnNldEJvdW5kcz1mdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gdm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09aSYmKGk9MCksdGhpcy5fd2lkdGg9dCx0aGlzLl9oZWlnaHQ9ZSx0aGlzLl9vcmlnaW49e3g6bix5Oml9LG51bGwhPXRoaXMuX2VsZW1lbnQmJnRoaXMuX2VsZW1lbnQuc3R5bGVzKHtsZWZ0Om4rInB4IixoZWlnaHQ6ZSsicHgiLHRvcDppKyJweCIsd2lkdGg6dCsicHgifSksbnVsbCE9dGhpcy5fcmVzaXplSGFuZGxlciYmdGhpcy5fcmVzaXplSGFuZGxlcih7d2lkdGg6dCxoZWlnaHQ6ZX0pLHRoaXN9LHQucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5yZXF1ZXN0ZWRTcGFjZSh0LGUpO3JldHVybnt3aWR0aDp0aGlzLmZpeGVkV2lkdGgoKT9NYXRoLm1pbih0LG4ubWluV2lkdGgpOnQsaGVpZ2h0OnRoaXMuZml4ZWRIZWlnaHQoKT9NYXRoLm1pbihlLG4ubWluSGVpZ2h0KTplfX0sdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2lzU2V0dXAmJnRoaXMud2lkdGgoKT49MCYmdGhpcy5oZWlnaHQoKT49MCYmY3l0LnJlZ2lzdGVyVG9SZW5kZXIodGhpcyksdGhpc30sdC5wcm90b3R5cGUucmVuZGVyTG93UHJpb3JpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXIoKX0sdC5wcm90b3R5cGUuX3NjaGVkdWxlQ29tcHV0ZUxheW91dD1mdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2lzU2V0dXAmJmN5dC5yZWdpc3RlclRvQ29tcHV0ZUxheW91dEFuZFJlbmRlcih0aGlzKX0sdC5wcm90b3R5cGUub25SZXNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3Jlc2l6ZUhhbmRsZXI9dCx0aGlzfSx0LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNBbmNob3JlZCYmdGhpcy5faXNTZXR1cCYmKHRoaXMuaXNSb290KCk/dGhpcy5fc2NoZWR1bGVDb21wdXRlTGF5b3V0KCk6dGhpcy5wYXJlbnQoKS5yZWRyYXcoKSksdGhpc30sdC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5yZW5kZXJUbz1mdW5jdGlvbih0KXtpZih0aGlzLmRldGFjaCgpLG51bGwhPXQpe3ZhciBlPXZvaWQgMDtpZighKGU9InN0cmluZyI9PXR5cGVvZiB0fHxoeXQuaXNFbGVtZW50KHQpP2x5dC5zZWxlY3QodCk6ZHl0LmNvZXJjZUV4dGVybmFsRDModCkpLm5vZGUoKXx8bnVsbD09ZS5ub2RlKCkubm9kZU5hbWUpdGhyb3cgbmV3IEVycm9yKCJQbG90dGFibGUgcmVxdWlyZXMgYSB2YWxpZCBFbGVtZW50IHRvIHJlbmRlclRvIik7aWYoInN2ZyI9PT1lLm5vZGUoKS5ub2RlTmFtZSl0aHJvdyBuZXcgRXJyb3IoIlBsb3R0YWJsZSAzLnggYW5kIGxhdGVyIGNhbiBvbmx5IHJlbmRlclRvIGFuIEhUTUwgY29tcG9uZW50OyBwYXNzIGEgZGl2IGluc3RlYWQhIik7dGhpcy5hbmNob3IoZSl9aWYobnVsbD09dGhpcy5fZWxlbWVudCl0aHJvdyBuZXcgRXJyb3IoIklmIGEgQ29tcG9uZW50IGhhcyBuZXZlciBiZWVuIHJlbmRlcmVkIGJlZm9yZSwgdGhlbiByZW5kZXJUbyBtdXN0IGJlIGdpdmVuIGEgbm9kZSB0byByZW5kZXIgdG8sIG9yIGEgZDMuU2VsZWN0aW9uLCBvciBhIHNlbGVjdG9yIHN0cmluZyIpO3JldHVybiBjeXQucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXRBbmRSZW5kZXIodGhpcyksY3l0LmZsdXNoKCksdGhpc30sdC5wcm90b3R5cGUueEFsaWdubWVudD1mdW5jdGlvbihlKXtpZihudWxsPT1lKXJldHVybiB0aGlzLl94QWxpZ25tZW50O2lmKGU9ZS50b0xvd2VyQ2FzZSgpLG51bGw9PXQuX3hBbGlnblRvUHJvcG9ydGlvbltlXSl0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIGFsaWdubWVudDogIitlKTtyZXR1cm4gdGhpcy5feEFsaWdubWVudD1lLHRoaXMucmVkcmF3KCksdGhpc30sdC5wcm90b3R5cGUueUFsaWdubWVudD1mdW5jdGlvbihlKXtpZihudWxsPT1lKXJldHVybiB0aGlzLl95QWxpZ25tZW50O2lmKGU9ZS50b0xvd2VyQ2FzZSgpLG51bGw9PXQuX3lBbGlnblRvUHJvcG9ydGlvbltlXSl0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIGFsaWdubWVudDogIitlKTtyZXR1cm4gdGhpcy5feUFsaWdubWVudD1lLHRoaXMucmVkcmF3KCksdGhpc30sdC5wcm90b3R5cGUuaGFzQ2xhc3M9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJihudWxsPT10aGlzLl9lbGVtZW50P3RoaXMuX2Nzc0NsYXNzZXMuaGFzKHQpOnRoaXMuX2VsZW1lbnQuY2xhc3NlZCh0KSl9LHQucHJvdG90eXBlLmFkZENsYXNzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fHwobnVsbD09dGhpcy5fZWxlbWVudD90aGlzLl9jc3NDbGFzc2VzLmFkZCh0KTp0aGlzLl9lbGVtZW50LmNsYXNzZWQodCwhMCkpLHRoaXN9LHQucHJvdG90eXBlLnJlbW92ZUNsYXNzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fHwobnVsbD09dGhpcy5fZWxlbWVudD90aGlzLl9jc3NDbGFzc2VzLmRlbGV0ZSh0KTp0aGlzLl9lbGVtZW50LmNsYXNzZWQodCwhMSkpLHRoaXN9LHQucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdC5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdC5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KG51bGwpLHRoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2VsZW1lbnQucmVtb3ZlKCksdGhpcy5faXNBbmNob3JlZD0hMSx0aGlzLl9vbkRldGFjaENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMpLHRoaXN9LHQucHJvdG90eXBlLm9uRGV0YWNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9vbkRldGFjaENhbGxiYWNrcy5hZGQodCksdGhpc30sdC5wcm90b3R5cGUub2ZmRGV0YWNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9vbkRldGFjaENhbGxiYWNrcy5kZWxldGUodCksdGhpc30sdC5wcm90b3R5cGUucGFyZW50PWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuX3BhcmVudDtpZihudWxsIT09dCYmIXQuaGFzKHRoaXMpKXRocm93IG5ldyBFcnJvcigiUGFzc2VkIGludmFsaWQgcGFyZW50Iik7cmV0dXJuIHRoaXMuX3BhcmVudD10LHRoaXN9LHQucHJvdG90eXBlLmJvdW5kcz1mdW5jdGlvbigpe3ZhciB0PXRoaXMub3JpZ2luKCk7cmV0dXJue3RvcExlZnQ6dCxib3R0b21SaWdodDp7eDp0LngrdGhpcy53aWR0aCgpLHk6dC55K3RoaXMuaGVpZ2h0KCl9fX0sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX2Rlc3Ryb3llZD0hMCx0aGlzLmRldGFjaCgpfSx0LnByb3RvdHlwZS53aWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl93aWR0aH0sdC5wcm90b3R5cGUuaGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hlaWdodH0sdC5wcm90b3R5cGUub3JpZ2luPWZ1bmN0aW9uKCl7cmV0dXJue3g6dGhpcy5fb3JpZ2luLngseTp0aGlzLl9vcmlnaW4ueX19LHQucHJvdG90eXBlLm9yaWdpblRvUm9vdD1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLm9yaWdpbigpLGU9dGhpcy5wYXJlbnQoKTtudWxsIT1lOyl7dmFyIG49ZS5vcmlnaW4oKTt0LngrPW4ueCx0LnkrPW4ueSxlPWUucGFyZW50KCl9cmV0dXJuIHR9LHQucHJvdG90eXBlLnJvb3Q9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpczshdC5pc1Jvb3QoKTspdD10LnBhcmVudCgpO3JldHVybiB0fSx0LnByb3RvdHlwZS5pc1Jvb3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09dGhpcy5wYXJlbnQoKX0sdC5wcm90b3R5cGUuZm9yZWdyb3VuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9mb3JlZ3JvdW5kQ29udGFpbmVyfSx0LnByb3RvdHlwZS5jb250ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRlbnR9LHQucHJvdG90eXBlLmVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxlbWVudH0sdC5wcm90b3R5cGUucm9vdEVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb290KCkuX3Jvb3RFbGVtZW50fSx0LnByb3RvdHlwZS5iYWNrZ3JvdW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tncm91bmRDb250YWluZXJ9LHQuX3hBbGlnblRvUHJvcG9ydGlvbj17bGVmdDowLGNlbnRlcjouNSxyaWdodDoxfSx0Ll95QWxpZ25Ub1Byb3BvcnRpb249e3RvcDowLGNlbnRlcjouNSxib3R0b206MX0sdH0pKCk7Qmd0LkNvbXBvbmVudD1meXQ7dmFyIG15dD17fSxneXQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShneXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBfeXQ9RWR0O2Z1bmN0aW9uIHl5dCh0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9Myksdnl0KHQpLGZ1bmN0aW9uKGUpe3JldHVybiBlLnRvRml4ZWQodCl9fWZ1bmN0aW9uIHZ5dCh0KXtpZih0PDB8fHQ+MjApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkZvcm1hdHRlciBwcmVjaXNpb24gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDIwIik7aWYodCE9PU1hdGguZmxvb3IodCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkZvcm1hdHRlciBwcmVjaXNpb24gbXVzdCBiZSBhbiBpbnRlZ2VyIil9Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovZ3l0LmN1cnJlbmN5PWZ1bmN0aW9uIGJ5dCh0LGUsbil7dm9pZCAwPT09dCYmKHQ9Miksdm9pZCAwPT09ZSYmKGU9IiQiKSx2b2lkIDA9PT1uJiYobj0hMCk7dmFyIGk9eXl0KHQpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgcj1pKE1hdGguYWJzKHQpKTtyZXR1cm4iIiE9PXImJihuP3I9ZStyOnIrPWUsdDwwJiYocj0iLSIrcikpLHJ9fSxneXQuZml4ZWQ9eXl0LGd5dC5nZW5lcmFsPWZ1bmN0aW9uIHh5dCh0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9Myksdnl0KHQpLGZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiPT10eXBlb2YgZSl7dmFyIG49TWF0aC5wb3coMTAsdCk7cmV0dXJuIFN0cmluZyhNYXRoLnJvdW5kKGUqbikvbil9cmV0dXJuIFN0cmluZyhlKX19LGd5dC5pZGVudGl0eT1mdW5jdGlvbiB3eXQoKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0KX19LGd5dC5wZXJjZW50YWdlPWZ1bmN0aW9uIFN5dCh0KXt2b2lkIDA9PT10JiYodD0wKTt2YXIgZT15eXQodCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPTEwMCp0LGk9dC50b1N0cmluZygpLHI9TWF0aC5wb3coMTAsaS5sZW5ndGgtKGkuaW5kZXhPZigiLiIpKzEpKTtyZXR1cm4gbj1wYXJzZUludCgobipyKS50b1N0cmluZygpLDEwKS9yLGUobikrIiUifX0sZ3l0LnNpU3VmZml4PWZ1bmN0aW9uIE15dCh0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9Myksdnl0KHQpLGZ1bmN0aW9uKGUpe3JldHVybiBfeXQuZm9ybWF0KCIuIit0KyJzIikoZSl9fSxneXQuc2hvcnRTY2FsZT1mdW5jdGlvbiBFeXQodCl7dm9pZCAwPT09dCYmKHQ9Myksdnl0KHQpO3ZhciBlPSJLTUJUUSIsbj1feXQuZm9ybWF0KCIuIit0KyJlIiksaT1feXQuZm9ybWF0KCIuIit0KyJmIikscj1NYXRoLnBvdygxMCwzKihlLmxlbmd0aCsxKSksbz1NYXRoLnBvdygxMCwtdCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBhPU1hdGguYWJzKHQpO2lmKChhPG98fGE+PXIpJiYwIT09YSlyZXR1cm4gbih0KTtmb3IodmFyIHM9LTE7YT49TWF0aC5wb3coMWUzLHMrMikmJnM8ZS5sZW5ndGgtMTspcysrO3ZhciBsPSIiO3JldHVybiBsPS0xPT09cz9pKHQpOmkodC9NYXRoLnBvdygxZTMscysxKSkrZVtzXSwodD4wJiYiMTAwMCI9PT1sLnN1YnN0cigwLDQpfHx0PDAmJiItMTAwMCI9PT1sLnN1YnN0cigwLDUpKSYmKHM8ZS5sZW5ndGgtMT8ocysrLGw9aSh0L01hdGgucG93KDFlMyxzKzEpKStlW3NdKTpsPW4odCkpLGx9fSxneXQubXVsdGlUaW1lPWZ1bmN0aW9uIFR5dCgpe3ZhciB0PVt7c3BlY2lmaWVyOiIuJUwiLHByZWRpY2F0ZTpmdW5jdGlvbih0KXtyZXR1cm4gMCE9PXQuZ2V0TWlsbGlzZWNvbmRzKCl9fSx7c3BlY2lmaWVyOiI6JVMiLHByZWRpY2F0ZTpmdW5jdGlvbih0KXtyZXR1cm4gMCE9PXQuZ2V0U2Vjb25kcygpfX0se3NwZWNpZmllcjoiJUk6JU0iLHByZWRpY2F0ZTpmdW5jdGlvbih0KXtyZXR1cm4gMCE9PXQuZ2V0TWludXRlcygpfX0se3NwZWNpZmllcjoiJUkgJXAiLHByZWRpY2F0ZTpmdW5jdGlvbih0KXtyZXR1cm4gMCE9PXQuZ2V0SG91cnMoKX19LHtzcGVjaWZpZXI6IiVhICVkIixwcmVkaWNhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIDAhPT10LmdldERheSgpJiYxIT09dC5nZXREYXRlKCl9fSx7c3BlY2lmaWVyOiIlYiAlZCIscHJlZGljYXRlOmZ1bmN0aW9uKHQpe3JldHVybiAxIT09dC5nZXREYXRlKCl9fSx7c3BlY2lmaWVyOiIlYiIscHJlZGljYXRlOmZ1bmN0aW9uKHQpe3JldHVybiAwIT09dC5nZXRNb250aCgpfX1dO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj10LmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQucHJlZGljYXRlKGUpfSkpO3JldHVybiBfeXQudGltZUZvcm1hdChuLmxlbmd0aD4wP25bMF0uc3BlY2lmaWVyOiIlWSIpKGUpfX0sZ3l0LnRpbWU9ZnVuY3Rpb24gQ3l0KHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSExKSxlP195dC51dGNGb3JtYXQodCk6X3l0LnRpbWVGb3JtYXQodCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShteXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBBeXQ9dU8sa3l0PUVkdCxMeXQ9SW10LFB5dD1CZ3QsTnl0PWd5dCxJeXQ9Rmd0O215dC5BeGlzT3JpZW50YXRpb249U210Lm1ha2VFbnVtKFsiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwidG9wIl0pO3ZhciBSeXQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt2YXIgaT10LmNhbGwodGhpcyl8fHRoaXM7aWYoaS5fZW5kVGlja0xlbmd0aD01LGkuX2lubmVyVGlja0xlbmd0aD01LGkuX3RpY2tMYWJlbFBhZGRpbmc9MTAsaS5fbWFyZ2luPTE1LGkuX3Nob3dFbmRUaWNrTGFiZWxzPSExLGkuX2Fubm90YXRpb25zRW5hYmxlZD0hMSxpLl9hbm5vdGF0aW9uVGllckNvdW50PTEsbnVsbD09ZXx8bnVsbD09bil0aHJvdyBuZXcgRXJyb3IoIkF4aXMgcmVxdWlyZXMgYSBzY2FsZSBhbmQgb3JpZW50YXRpb24iKTtyZXR1cm4gaS5fc2NhbGU9ZSxpLm9yaWVudGF0aW9uKG4pLGkuX3NldERlZmF1bHRBbGlnbm1lbnQoKSxpLmFkZENsYXNzKCJheGlzIiksaS5pc0hvcml6b250YWwoKT9pLmFkZENsYXNzKCJ4LWF4aXMiKTppLmFkZENsYXNzKCJ5LWF4aXMiKSxpLmZvcm1hdHRlcihOeXQuaWRlbnRpdHkoKSksaS5fcmVzY2FsZUNhbGxiYWNrPWZ1bmN0aW9uKHQpe3JldHVybiBpLl9yZXNjYWxlKCl9LGkuX3NjYWxlLm9uVXBkYXRlKGkuX3Jlc2NhbGVDYWxsYmFjayksaS5fYW5ub3RhdGVkVGlja3M9W10saS5fYW5ub3RhdGlvbkZvcm1hdHRlcj1OeXQuaWRlbnRpdHkoKSxpfXJldHVybiBBeXQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3QucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKSx0aGlzLl9zY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVzY2FsZUNhbGxiYWNrKX0sZS5wcm90b3R5cGUudGlja0xhYmVsRGF0YU9uRWxlbWVudD1mdW5jdGlvbih0KXtpZihudWxsIT10KXtmb3IodmFyIG47bnVsbCE9dCYmdC5jbGFzc0xpc3QmJnZvaWQgMD09PW47KXQuY2xhc3NMaXN0LmNvbnRhaW5zKGUuVElDS19MQUJFTF9DTEFTUyk/bj10OnQ9dC5wYXJlbnROb2RlO3JldHVybiB2b2lkIDA9PT10P3ZvaWQgMDpreXQuc2VsZWN0KHQpLmRhdHVtKCl9fSxlLnByb3RvdHlwZS5fY29tcHV0ZVdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpfSxlLnByb3RvdHlwZS5fY29tcHV0ZUhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKX0sZS5wcm90b3R5cGUucmVxdWVzdGVkU3BhY2U9ZnVuY3Rpb24odCxuKXt2YXIgaT0wLHI9MDtyZXR1cm4gdGhpcy5pc0hvcml6b250YWwoKT8ocj10aGlzLl9jb21wdXRlSGVpZ2h0KCkrdGhpcy5fbWFyZ2luLHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkmJihyKz0odGhpcy5fYW5ub3RhdGlvbk1lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQrMiplLl9BTk5PVEFUSU9OX0xBQkVMX1BBRERJTkcpKnRoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpKSk6KGk9dGhpcy5fY29tcHV0ZVdpZHRoKCkrdGhpcy5fbWFyZ2luLHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkmJihpKz0odGhpcy5fYW5ub3RhdGlvbk1lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQrMiplLl9BTk5PVEFUSU9OX0xBQkVMX1BBRERJTkcpKnRoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpKSkse21pbldpZHRoOmksbWluSGVpZ2h0OnJ9fSxlLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzSG9yaXpvbnRhbCgpfSxlLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNIb3Jpem9udGFsKCl9LGUucHJvdG90eXBlLl9yZXNjYWxlPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXIoKX0sZS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihlLG4saSl7cmV0dXJuIHQucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLGUsbixpKSx0aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuX3NjYWxlLnJhbmdlKFswLHRoaXMud2lkdGgoKV0pOnRoaXMuX3NjYWxlLnJhbmdlKFt0aGlzLmhlaWdodCgpLDBdKSx0aGlzfSxlLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMucmVxdWVzdGVkU3BhY2UodCxlKTtyZXR1cm4gdGhpcy5pc0hvcml6b250YWwoKT97d2lkdGg6dCxoZWlnaHQ6bi5taW5IZWlnaHR9OntoZWlnaHQ6ZSx3aWR0aDpuLm1pbldpZHRofX0sZS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyksdGhpcy5fdGlja01hcmtDb250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChlLlRJQ0tfTUFSS19DTEFTUysiLWNvbnRhaW5lciIsITApLHRoaXMuX3RpY2tMYWJlbENvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKGUuVElDS19MQUJFTF9DTEFTUysiLWNvbnRhaW5lciIsITApLHRoaXMuX2Jhc2VsaW5lPXRoaXMuY29udGVudCgpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImJhc2VsaW5lIiwhMCksdGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLWNvbnRhaW5lciIsITApLHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1saW5lLWNvbnRhaW5lciIsITApLHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1jaXJjbGUtY29udGFpbmVyIiwhMCksdGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLXJlY3QtY29udGFpbmVyIiwhMCk7dmFyIG49dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLWxhYmVsLWNvbnRhaW5lciIsITApLGk9bmV3IEx5dC5TdmdDb250ZXh0KG4ubm9kZSgpKTt0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXI9bmV3IEx5dC5DYWNoZU1lYXN1cmVyKGkpLHRoaXMuX2Fubm90YXRpb25Xcml0ZXI9bmV3IEx5dC5Xcml0ZXIodGhpcy5fYW5ub3RhdGlvbk1lYXN1cmVyLGkpfSxlLnByb3RvdHlwZS5fZ2V0VGlja1ZhbHVlcz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2dldFRpY2tWYWx1ZXMoKSxuPXRoaXMuX3RpY2tNYXJrQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrZS5USUNLX01BUktfQ0xBU1MpLmRhdGEodCksaT1uLmVudGVyKCkuYXBwZW5kKCJsaW5lIikuY2xhc3NlZChlLlRJQ0tfTUFSS19DTEFTUywhMCkubWVyZ2Uobik7cmV0dXJuIGkuYXR0cnModGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCkpLGt5dC5zZWxlY3QoaS5ub2RlcygpWzBdKS5jbGFzc2VkKGUuRU5EX1RJQ0tfTUFSS19DTEFTUywhMCkuYXR0cnModGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCEwKSksa3l0LnNlbGVjdChpLm5vZGVzKClbdC5sZW5ndGgtMV0pLmNsYXNzZWQoZS5FTkRfVElDS19NQVJLX0NMQVNTLCEwKS5hdHRycyh0aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goITApKSxuLmV4aXQoKS5yZW1vdmUoKSx0aGlzLl9iYXNlbGluZS5hdHRycyh0aGlzLl9nZW5lcmF0ZUJhc2VsaW5lQXR0ckhhc2goKSksdGhpcy5hbm5vdGF0aW9uc0VuYWJsZWQoKT90aGlzLl9kcmF3QW5ub3RhdGlvbnMoKTp0aGlzLl9yZW1vdmVBbm5vdGF0aW9ucygpLHRoaXN9LGUucHJvdG90eXBlLmFubm90YXRlZFRpY2tzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2Fubm90YXRlZFRpY2tzOih0aGlzLl9hbm5vdGF0ZWRUaWNrcz10LHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLmFubm90YXRpb25Gb3JtYXR0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fYW5ub3RhdGlvbkZvcm1hdHRlcjoodGhpcy5fYW5ub3RhdGlvbkZvcm1hdHRlcj10LHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLmFubm90YXRpb25zRW5hYmxlZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9hbm5vdGF0aW9uc0VuYWJsZWQ6KHRoaXMuX2Fubm90YXRpb25zRW5hYmxlZD10LHRoaXMucmVkcmF3KCksdGhpcyl9LGUucHJvdG90eXBlLmFubm90YXRpb25UaWVyQ291bnQ9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fYW5ub3RhdGlvblRpZXJDb3VudDtpZih0PDApdGhyb3cgbmV3IEVycm9yKCJhbm5vdGF0aW9uVGllckNvdW50IGNhbm5vdCBiZSBuZWdhdGl2ZSIpO3JldHVybiB0aGlzLl9hbm5vdGF0aW9uVGllckNvdW50PXQsdGhpcy5yZWRyYXcoKSx0aGlzfSxlLnByb3RvdHlwZS5fZHJhd0Fubm90YXRpb25zPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPWUuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORyxpPW5ldyBJeXQuTWFwLHI9dGhpcy5fYW5ub3RhdGVkVGlja3NUb1JlbmRlcigpO3IuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHI9dC5fYW5ub3RhdGlvbk1lYXN1cmVyLm1lYXN1cmUodC5hbm5vdGF0aW9uRm9ybWF0dGVyKCkoZSkpO2kuc2V0KGUse3dpZHRoOnIud2lkdGgrMipuLGhlaWdodDpyLmhlaWdodCsyKm59KX0pKTt2YXIgbz10aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCsyKm4sYT10aGlzLl9hbm5vdGF0aW9uVG9UaWVyKGkpLHM9bmV3IEl5dC5TZXQsbD10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuaGVpZ2h0KCk6dGhpcy53aWR0aCgpLGM9dGhpcy5fY29yZVNpemUoKSx1PU1hdGgubWluKHRoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpLE1hdGguZmxvb3IoKGwtYykvbykpO2EuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXsoLTE9PT10fHx0Pj11KSYmcy5hZGQoZSl9KSk7dmFyIGgsZD1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5zZWxlY3RBbGwoIi4iK24pLmRhdGEociksbz1pLmVudGVyKCkuYXBwZW5kKGUpLmNsYXNzZWQobiwhMCkubWVyZ2UoaSk7cmV0dXJuIGkuZXhpdCgpLnJlbW92ZSgpLG99LHA9ZnVuY3Rpb24oZSl7c3dpdGNoKHQub3JpZW50YXRpb24oKSl7Y2FzZSJib3R0b20iOmNhc2UicmlnaHQiOnJldHVybiBhLmdldChlKSpvK2M7Y2FzZSJ0b3AiOmNhc2UibGVmdCI6cmV0dXJuIGwtYy1hLmdldChlKSpvfX0sZj1mdW5jdGlvbihlKXtyZXR1cm4gdC5fc2NhbGUuc2NhbGUoZSl9LG09ZnVuY3Rpb24odCl7cmV0dXJuIHMuaGFzKHQpPyJoaWRkZW4iOiJ2aXNpYmxlIn07c3dpdGNoKHRoaXMub3JpZW50YXRpb24oKSl7Y2FzZSJib3R0b20iOmNhc2UicmlnaHQiOmg9MDticmVhaztjYXNlInRvcCI6aD10aGlzLmhlaWdodCgpO2JyZWFrO2Nhc2UibGVmdCI6aD10aGlzLndpZHRoKCl9dmFyIGc9dGhpcy5pc0hvcml6b250YWwoKTtkKHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1saW5lLWNvbnRhaW5lciIpLCJsaW5lIixlLkFOTk9UQVRJT05fTElORV9DTEFTUykuYXR0cnMoe3gxOmc/ZjpoLHgyOmc/ZjpwLHkxOmc/aDpmLHkyOmc/cDpmLHZpc2liaWxpdHk6bX0pLGQodGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3QoIi5hbm5vdGF0aW9uLWNpcmNsZS1jb250YWluZXIiKSwiY2lyY2xlIixlLkFOTk9UQVRJT05fQ0lSQ0xFX0NMQVNTKS5hdHRycyh7Y3g6Zz9mOmgsY3k6Zz9oOmYscjozfSk7dmFyIF89ZnVuY3Rpb24oZSl7c3dpdGNoKHQub3JpZW50YXRpb24oKSl7Y2FzZSJib3R0b20iOmNhc2UicmlnaHQiOnJldHVybiBwKGUpO2Nhc2UidG9wIjpjYXNlImxlZnQiOnJldHVybiBwKGUpLWkuZ2V0KGUpLmhlaWdodH19O2QodGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3QoIi5hbm5vdGF0aW9uLXJlY3QtY29udGFpbmVyIiksInJlY3QiLGUuQU5OT1RBVElPTl9SRUNUX0NMQVNTKS5hdHRycyh7eDpnP2Y6Xyx5Omc/XzpmLHdpZHRoOmc/ZnVuY3Rpb24odCl7cmV0dXJuIGkuZ2V0KHQpLndpZHRofTpmdW5jdGlvbih0KXtyZXR1cm4gaS5nZXQodCkuaGVpZ2h0fSxoZWlnaHQ6Zz9mdW5jdGlvbih0KXtyZXR1cm4gaS5nZXQodCkuaGVpZ2h0fTpmdW5jdGlvbih0KXtyZXR1cm4gaS5nZXQodCkud2lkdGh9LHZpc2liaWxpdHk6bX0pO3ZhciB5PXRoaXMuX2Fubm90YXRpb25Xcml0ZXIsdj10aGlzLmFubm90YXRpb25Gb3JtYXR0ZXIoKSxiPWQodGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3QoIi5hbm5vdGF0aW9uLWxhYmVsLWNvbnRhaW5lciIpLCJnIixlLkFOTk9UQVRJT05fTEFCRUxfQ0xBU1MpO2Iuc2VsZWN0QWxsKCIudGV4dC1jb250YWluZXIiKS5yZW1vdmUoKSxiLmF0dHJzKHt0cmFuc2Zvcm06ZnVuY3Rpb24odCl7cmV0dXJuInRyYW5zbGF0ZSgiKyhnP2YodCk6Xyh0KSkrIiwiKyhnP18odCk6Zih0KSkrIikifSx2aXNpYmlsaXR5Om19KS5lYWNoKChmdW5jdGlvbih0KXt5LndyaXRlKHYodCksZz9pLmdldCh0KS53aWR0aDppLmdldCh0KS5oZWlnaHQsZz9pLmdldCh0KS5oZWlnaHQ6aS5nZXQodCkud2lkdGgse3hBbGlnbjoiY2VudGVyIix5QWxpZ246ImNlbnRlciIsdGV4dFJvdGF0aW9uOmc/MDo5MH0sa3l0LnNlbGVjdCh0aGlzKS5ub2RlKCkpfSkpfSxlLnByb3RvdHlwZS5fYW5ub3RhdGVkVGlja3NUb1JlbmRlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLl9zY2FsZS5yYW5nZSgpO3JldHVybiBJeXQuQXJyYXkudW5pcSh0aGlzLmFubm90YXRlZFRpY2tzKCkuZmlsdGVyKChmdW5jdGlvbihuKXtyZXR1cm4gbnVsbCE9biYmSXl0Lk1hdGguaW5SYW5nZSh0Ll9zY2FsZS5zY2FsZShuKSxlWzBdLGVbMV0pfSkpKX0sZS5wcm90b3R5cGUuX2NvcmVTaXplPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5pc0hvcml6b250YWwoKT90aGlzLmhlaWdodCgpOnRoaXMud2lkdGgoKSxlPXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5fY29tcHV0ZUhlaWdodCgpOnRoaXMuX2NvbXB1dGVXaWR0aCgpO3JldHVybiBNYXRoLm1pbihlLHQpfSxlLnByb3RvdHlwZS5fYW5ub3RhdGlvblRpZXJIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYW5ub3RhdGlvbk1lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQrMiplLl9BTk5PVEFUSU9OX0xBQkVMX1BBRERJTkd9LGUucHJvdG90eXBlLl9hbm5vdGF0aW9uVG9UaWVyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1bW11dLGk9bmV3IEl5dC5NYXAscj10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMud2lkdGgoKTp0aGlzLmhlaWdodCgpO3JldHVybiB0aGlzLl9hbm5vdGF0ZWRUaWNrc1RvUmVuZGVyKCkuZm9yRWFjaCgoZnVuY3Rpb24obyl7dmFyIGE9ZS5fc2NhbGUuc2NhbGUobykscz10LmdldChvKS53aWR0aDtpZihhPDB8fGErcz5yKWkuc2V0KG8sLTEpO2Vsc2V7Zm9yKHZhciBsPTA7bltsXS5zb21lKChmdW5jdGlvbihuKXt2YXIgaT1lLl9zY2FsZS5zY2FsZShuKSxyPXQuZ2V0KG4pLndpZHRoO3JldHVybiBhK3M+PWkmJmE8PWkrcn0pKTspbCsrLG4ubGVuZ3RoPT09bCYmbi5wdXNoKFtdKTtuW2xdLnB1c2gobyksaS5zZXQobyxsKX19KSksaX0sZS5wcm90b3R5cGUuX3JlbW92ZUFubm90YXRpb25zPWZ1bmN0aW9uKCl7dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3RBbGwoIi5hbm5vdGF0aW9uLWxpbmUiKS5yZW1vdmUoKSx0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tY2lyY2xlIikucmVtb3ZlKCksdGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3RBbGwoIi5hbm5vdGF0aW9uLXJlY3QiKS5yZW1vdmUoKSx0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tbGFiZWwiKS5yZW1vdmUoKX0sZS5wcm90b3R5cGUuX2dlbmVyYXRlQmFzZWxpbmVBdHRySGFzaD1mdW5jdGlvbigpe3ZhciB0PXt4MTowLHkxOjAseDI6MCx5MjowfTtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UiYm90dG9tIjp0LngyPXRoaXMud2lkdGgoKTticmVhaztjYXNlInRvcCI6dC54Mj10aGlzLndpZHRoKCksdC55MT10aGlzLmhlaWdodCgpLHQueTI9dGhpcy5oZWlnaHQoKTticmVhaztjYXNlImxlZnQiOnQueDE9dGhpcy53aWR0aCgpLHQueDI9dGhpcy53aWR0aCgpLHQueTI9dGhpcy5oZWlnaHQoKTticmVhaztjYXNlInJpZ2h0Ijp0LnkyPXRoaXMuaGVpZ2h0KCl9cmV0dXJuIHR9LGUucHJvdG90eXBlLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2g9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt2b2lkIDA9PT10JiYodD0hMSk7dmFyIG49e3gxOjAseTE6MCx4MjowLHkyOjB9LGk9ZnVuY3Rpb24odCl7cmV0dXJuIGUuX3NjYWxlLnNjYWxlKHQpfTt0aGlzLmlzSG9yaXpvbnRhbCgpPyhuLngxPWksbi54Mj1pKToobi55MT1pLG4ueTI9aSk7dmFyIHI9dD90aGlzLl9lbmRUaWNrTGVuZ3RoOnRoaXMuX2lubmVyVGlja0xlbmd0aDtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UiYm90dG9tIjpuLnkyPXI7YnJlYWs7Y2FzZSJ0b3AiOm4ueTE9dGhpcy5oZWlnaHQoKSxuLnkyPXRoaXMuaGVpZ2h0KCktcjticmVhaztjYXNlImxlZnQiOm4ueDE9dGhpcy53aWR0aCgpLG4ueDI9dGhpcy53aWR0aCgpLXI7YnJlYWs7Y2FzZSJyaWdodCI6bi54Mj1yfXJldHVybiBufSxlLnByb3RvdHlwZS5fc2V0RGVmYXVsdEFsaWdubWVudD1mdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9vcmllbnRhdGlvbil7Y2FzZSJib3R0b20iOnRoaXMueUFsaWdubWVudCgidG9wIik7YnJlYWs7Y2FzZSJ0b3AiOnRoaXMueUFsaWdubWVudCgiYm90dG9tIik7YnJlYWs7Y2FzZSJsZWZ0Ijp0aGlzLnhBbGlnbm1lbnQoInJpZ2h0Iik7YnJlYWs7Y2FzZSJyaWdodCI6dGhpcy54QWxpZ25tZW50KCJsZWZ0Iil9fSxlLnByb3RvdHlwZS5pc0hvcml6b250YWw9ZnVuY3Rpb24oKXtyZXR1cm4idG9wIj09PXRoaXMuX29yaWVudGF0aW9ufHwiYm90dG9tIj09PXRoaXMuX29yaWVudGF0aW9ufSxlLnByb3RvdHlwZS5nZXRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY2FsZX0sZS5wcm90b3R5cGUuZm9ybWF0dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2Zvcm1hdHRlcjoodGhpcy5fZm9ybWF0dGVyPXQsdGhpcy5yZWRyYXcoKSx0aGlzKX0sZS5wcm90b3R5cGUuaW5uZXJUaWNrTGVuZ3RoPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX2lubmVyVGlja0xlbmd0aDtpZih0PDApdGhyb3cgbmV3IEVycm9yKCJpbm5lciB0aWNrIGxlbmd0aCBtdXN0IGJlIHBvc2l0aXZlIik7cmV0dXJuIHRoaXMuX2lubmVyVGlja0xlbmd0aD10LHRoaXMucmVkcmF3KCksdGhpc30sZS5wcm90b3R5cGUuZW5kVGlja0xlbmd0aD1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9lbmRUaWNrTGVuZ3RoO2lmKHQ8MCl0aHJvdyBuZXcgRXJyb3IoImVuZCB0aWNrIGxlbmd0aCBtdXN0IGJlIHBvc2l0aXZlIik7cmV0dXJuIHRoaXMuX2VuZFRpY2tMZW5ndGg9dCx0aGlzLnJlZHJhdygpLHRoaXN9LGUucHJvdG90eXBlLl9tYXhMYWJlbFRpY2tMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaG93RW5kVGlja0xhYmVscygpP01hdGgubWF4KHRoaXMuaW5uZXJUaWNrTGVuZ3RoKCksdGhpcy5lbmRUaWNrTGVuZ3RoKCkpOnRoaXMuaW5uZXJUaWNrTGVuZ3RoKCl9LGUucHJvdG90eXBlLnRpY2tMYWJlbFBhZGRpbmc9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fdGlja0xhYmVsUGFkZGluZztpZih0PDApdGhyb3cgbmV3IEVycm9yKCJ0aWNrIGxhYmVsIHBhZGRpbmcgbXVzdCBiZSBwb3NpdGl2ZSIpO3JldHVybiB0aGlzLl90aWNrTGFiZWxQYWRkaW5nPXQsdGhpcy5yZWRyYXcoKSx0aGlzfSxlLnByb3RvdHlwZS5tYXJnaW49ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fbWFyZ2luO2lmKHQ8MCl0aHJvdyBuZXcgRXJyb3IoIm1hcmdpbiBzaXplIG11c3QgYmUgcG9zaXRpdmUiKTtyZXR1cm4gdGhpcy5fbWFyZ2luPXQsdGhpcy5yZWRyYXcoKSx0aGlzfSxlLnByb3RvdHlwZS5vcmllbnRhdGlvbj1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9vcmllbnRhdGlvbjt2YXIgZT10LnRvTG93ZXJDYXNlKCk7aWYoInRvcCIhPT1lJiYiYm90dG9tIiE9PWUmJiJsZWZ0IiE9PWUmJiJyaWdodCIhPT1lKXRocm93IG5ldyBFcnJvcigidW5zdXBwb3J0ZWQgb3JpZW50YXRpb24iKTtyZXR1cm4gdGhpcy5fb3JpZW50YXRpb249ZSx0aGlzLnJlZHJhdygpLHRoaXN9LGUucHJvdG90eXBlLnNob3dFbmRUaWNrTGFiZWxzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX3Nob3dFbmRUaWNrTGFiZWxzOih0aGlzLl9zaG93RW5kVGlja0xhYmVscz10LHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLl9zaG93QWxsVGlja01hcmtzPWZ1bmN0aW9uKCl7dGhpcy5fdGlja01hcmtDb250YWluZXIuc2VsZWN0QWxsKCIuIitlLlRJQ0tfTUFSS19DTEFTUykuZWFjaCgoZnVuY3Rpb24oKXtreXQuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaW5oZXJpdCIpfSkpfSxlLnByb3RvdHlwZS5fc2hvd0FsbFRpY2tMYWJlbHM9ZnVuY3Rpb24oKXt0aGlzLl90aWNrTGFiZWxDb250YWluZXIuc2VsZWN0QWxsKCIuIitlLlRJQ0tfTEFCRUxfQ0xBU1MpLmVhY2goKGZ1bmN0aW9uKCl7a3l0LnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIsImluaGVyaXQiKX0pKX0sZS5wcm90b3R5cGUuX2hpZGVPdmVyZmxvd2luZ1RpY2tMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsZW1lbnQoKS5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj10aGlzLl90aWNrTGFiZWxDb250YWluZXIuc2VsZWN0QWxsKCIuIitlLlRJQ0tfTEFCRUxfQ0xBU1MpO24uZW1wdHkoKXx8bi5lYWNoKChmdW5jdGlvbihlLG4pe0l5dC5ET00uY2xpZW50UmVjdEluc2lkZSh0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHQpfHxreXQuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9KSl9LGUucHJvdG90eXBlLl9oaWRlVGlja01hcmtzV2l0aG91dExhYmVsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fdGlja01hcmtDb250YWluZXIuc2VsZWN0QWxsKCIuIitlLlRJQ0tfTUFSS19DTEFTUyksbj10aGlzLl90aWNrTGFiZWxDb250YWluZXIuc2VsZWN0QWxsKCIuIitlLlRJQ0tfTEFCRUxfQ0xBU1MpLmZpbHRlcigoZnVuY3Rpb24odCxlKXt2YXIgbj1reXQuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5Iik7cmV0dXJuImluaGVyaXQiPT09bnx8InZpc2libGUiPT09bn0pKS5kYXRhKCk7dC5lYWNoKChmdW5jdGlvbih0LGUpey0xPT09bi5pbmRleE9mKHQpJiZreXQuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9KSl9LGUucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe3QucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpLHRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5yZXNldCgpfSxlLkVORF9USUNLX01BUktfQ0xBU1M9ImVuZC10aWNrLW1hcmsiLGUuVElDS19NQVJLX0NMQVNTPSJ0aWNrLW1hcmsiLGUuVElDS19MQUJFTF9DTEFTUz0idGljay1sYWJlbCIsZS5BTk5PVEFUSU9OX0xJTkVfQ0xBU1M9ImFubm90YXRpb24tbGluZSIsZS5BTk5PVEFUSU9OX1JFQ1RfQ0xBU1M9ImFubm90YXRpb24tcmVjdCIsZS5BTk5PVEFUSU9OX0NJUkNMRV9DTEFTUz0iYW5ub3RhdGlvbi1jaXJjbGUiLGUuQU5OT1RBVElPTl9MQUJFTF9DTEFTUz0iYW5ub3RhdGlvbi1sYWJlbCIsZS5fQU5OT1RBVElPTl9MQUJFTF9QQURESU5HPTQsZX0pKFB5dC5Db21wb25lbnQpO215dC5BeGlzPVJ5dCwKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KE5tdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIE95dD11Tyx6eXQ9RWR0LER5dD1JbXQsQnl0PUJndCxIeXQ9Rmd0LEZ5dD1teXQsVnl0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7dm9pZCAwPT09biYmKG49ImJvdHRvbSIpO3ZhciBpPXQuY2FsbCh0aGlzLGUsbil8fHRoaXM7cmV0dXJuIGkuX3RpY2tMYWJlbEFuZ2xlPTAsaS5fdGlja0xhYmVsU2hlYXJBbmdsZT0wLGkuYWRkQ2xhc3MoImNhdGVnb3J5LWF4aXMiKSxpfXJldHVybiBPeXQuX19leHRlbmRzKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJfd3JhcHBlciIse2dldDpmdW5jdGlvbigpe3ZhciB0PW5ldyBEeXQuV3JhcHBlcjtyZXR1cm4gbnVsbCE9dGhpcy5fdGlja0xhYmVsTWF4TGluZXMmJnQubWF4TGluZXModGhpcy5fdGlja0xhYmVsTWF4TGluZXMpLHR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJfd3JpdGVyIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBEeXQuV3JpdGVyKHRoaXMuX21lYXN1cmVyLHRoaXMuX3R5cGVzZXR0ZXJDb250ZXh0LHRoaXMuX3dyYXBwZXIpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3QucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpLHRoaXMuX3R5cGVzZXR0ZXJDb250ZXh0PW5ldyBEeXQuU3ZnQ29udGV4dCh0aGlzLl90aWNrTGFiZWxDb250YWluZXIubm9kZSgpKSx0aGlzLl9tZWFzdXJlcj1uZXcgRHl0LkNhY2hlTWVhc3VyZXIodGhpcy5fdHlwZXNldHRlckNvbnRleHQpfSxlLnByb3RvdHlwZS5fcmVzY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlZHJhdygpfSxlLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuaXNIb3Jpem9udGFsKCk/MDp0aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpK3RoaXMubWFyZ2luKCksaT10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCkrdGhpcy5tYXJnaW4oKTowO2lmKDA9PT10aGlzLl9zY2FsZS5kb21haW4oKS5sZW5ndGgpcmV0dXJue21pbldpZHRoOjAsbWluSGVpZ2h0OjB9O2lmKHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkpe3ZhciByPXRoaXMuX2Fubm90YXRpb25UaWVySGVpZ2h0KCkqdGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCk7dGhpcy5pc0hvcml6b250YWwoKT9pKz1yOm4rPXJ9dmFyIG89dGhpcy5fbWVhc3VyZVRpY2tMYWJlbHModCxlKTtyZXR1cm57bWluV2lkdGg6by51c2VkV2lkdGgrbixtaW5IZWlnaHQ6by51c2VkSGVpZ2h0K2l9fSxlLnByb3RvdHlwZS5fY29yZVNpemU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuaGVpZ2h0KCk6dGhpcy53aWR0aCgpLGU9dGhpcy5pc0hvcml6b250YWwoKT90aGlzLnJlcXVlc3RlZFNwYWNlKHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpKS5taW5IZWlnaHQ6dGhpcy5yZXF1ZXN0ZWRTcGFjZSh0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSkubWluV2lkdGgsbj10aGlzLm1hcmdpbigpK3RoaXMuX2Fubm90YXRpb25UaWVySGVpZ2h0KCk7cmV0dXJuIE1hdGgubWluKGUtbix0KX0sZS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXREb3duc2FtcGxlSW5mbygpLmRvbWFpbn0sZS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gQnl0LkNvbXBvbmVudC5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXIuY2FsbCh0aGlzLHQsZSl9LGUucHJvdG90eXBlLmdldERvd25zYW1wbGVJbmZvPWZ1bmN0aW9uKHQsbil7dm9pZCAwPT09dCYmKHQ9dGhpcy5fc2NhbGUpLHZvaWQgMD09PW4mJihuPXQuaW52ZXJ0UmFuZ2UoKSk7dmFyIGk9MD09PXRoaXMuX3RpY2tMYWJlbEFuZ2xlPzE6MS9NYXRoLmNvcyh0aGlzLl90aWNrTGFiZWxTaGVhckFuZ2xlLzE4MCpNYXRoLlBJKSxyPU1hdGguY2VpbChlLl9NSU5JTVVNX1dJRFRIX1BFUl9MQUJFTF9QWCppL3Quc3RlcFdpZHRoKCkpO3JldHVybntkb21haW46bi5maWx0ZXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUlcj09MH0pKSxzdGVwV2lkdGg6cip0LnN0ZXBXaWR0aCgpfX0sZS5wcm90b3R5cGUudGlja0xhYmVsQW5nbGU9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fdGlja0xhYmVsQW5nbGU7aWYoMCE9PXQmJjkwIT09dCYmLTkwIT09dCl0aHJvdyBuZXcgRXJyb3IoIkFuZ2xlICIrdCsiIG5vdCBzdXBwb3J0ZWQ7IG9ubHkgMCwgOTAsIGFuZCAtOTAgYXJlIHZhbGlkIHZhbHVlcyIpO3JldHVybiB0aGlzLl90aWNrTGFiZWxBbmdsZT10LHRoaXMucmVkcmF3KCksdGhpc30sZS5wcm90b3R5cGUudGlja0xhYmVsU2hlYXJBbmdsZT1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl90aWNrTGFiZWxTaGVhckFuZ2xlO2lmKHQ8LTgwfHx0PjgwKXRocm93IG5ldyBFcnJvcigiQW5nbGUgIit0KyIgbm90IHN1cHBvcnRlZDsgTXVzdCBiZSBiZXR3ZWVuIFstODAsIDgwXSIpO3JldHVybiB0aGlzLl90aWNrTGFiZWxTaGVhckFuZ2xlPXQsdGhpcy5yZWRyYXcoKSx0aGlzfSxlLnByb3RvdHlwZS50aWNrTGFiZWxNYXhXaWR0aD1mdW5jdGlvbih0KXtyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5fdGlja0xhYmVsTWF4V2lkdGg6KHRoaXMuX3RpY2tMYWJlbE1heFdpZHRoPXQsdGhpcy5yZWRyYXcoKSx0aGlzKX0sZS5wcm90b3R5cGUudGlja0xhYmVsTWF4TGluZXM9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMuX3RpY2tMYWJlbE1heExpbmVzOih0aGlzLl90aWNrTGFiZWxNYXhMaW5lcz10LHRoaXMucmVkcmF3KCksdGhpcyl9LGUucHJvdG90eXBlLl90aWNrU3BhY2VSZXF1aXJlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSt0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKX0sZS5wcm90b3R5cGUuX2RyYXdUaWNrcz1mdW5jdGlvbih0LGUpe3ZhciBuLGkscj10aGlzO3N3aXRjaCh0aGlzLnRpY2tMYWJlbEFuZ2xlKCkpe2Nhc2UgMDpuPXtsZWZ0OiJyaWdodCIscmlnaHQ6ImxlZnQiLHRvcDoiY2VudGVyIixib3R0b206ImNlbnRlciJ9LGk9e2xlZnQ6ImNlbnRlciIscmlnaHQ6ImNlbnRlciIsdG9wOiJib3R0b20iLGJvdHRvbToidG9wIn07YnJlYWs7Y2FzZSA5MDpuPXtsZWZ0OiJjZW50ZXIiLHJpZ2h0OiJjZW50ZXIiLHRvcDoicmlnaHQiLGJvdHRvbToibGVmdCJ9LGk9e2xlZnQ6InRvcCIscmlnaHQ6ImJvdHRvbSIsdG9wOiJjZW50ZXIiLGJvdHRvbToiY2VudGVyIn07YnJlYWs7Y2FzZS05MDpuPXtsZWZ0OiJjZW50ZXIiLHJpZ2h0OiJjZW50ZXIiLHRvcDoibGVmdCIsYm90dG9tOiJyaWdodCJ9LGk9e2xlZnQ6ImJvdHRvbSIscmlnaHQ6InRvcCIsdG9wOiJjZW50ZXIiLGJvdHRvbToiY2VudGVyIn19ZS5lYWNoKChmdW5jdGlvbihlKXt2YXIgbz16eXQuc2VsZWN0KHRoaXMpLGE9ci5pc0hvcml6b250YWwoKT90OnIud2lkdGgoKS1yLl90aWNrU3BhY2VSZXF1aXJlZCgpLHM9ci5pc0hvcml6b250YWwoKT9yLmhlaWdodCgpLXIuX3RpY2tTcGFjZVJlcXVpcmVkKCk6dCxsPXt4QWxpZ246bltyLm9yaWVudGF0aW9uKCldLHlBbGlnbjppW3Iub3JpZW50YXRpb24oKV0sdGV4dFJvdGF0aW9uOnIudGlja0xhYmVsQW5nbGUoKSx0ZXh0U2hlYXI6ci50aWNrTGFiZWxTaGVhckFuZ2xlKCl9O2lmKG51bGwhPXIuX3RpY2tMYWJlbE1heFdpZHRoKXtpZigibGVmdCI9PT1yLm9yaWVudGF0aW9uKCkmJmE+ci5fdGlja0xhYmVsTWF4V2lkdGgpe3ZhciBjPWEtci5fdGlja0xhYmVsTWF4V2lkdGgsdT1vLmF0dHIoInRyYW5zZm9ybSIpKyIgdHJhbnNsYXRlKCIrYysiLCAwKSI7by5hdHRyKCJ0cmFuc2Zvcm0iLHUpfWE9TWF0aC5taW4oYSxyLl90aWNrTGFiZWxNYXhXaWR0aCl9ci5fd3JpdGVyLndyaXRlKHIuZm9ybWF0dGVyKCkoZSksYSxzLGwsby5ub2RlKCkpfSkpfSxlLnByb3RvdHlwZS5fbWVhc3VyZVRpY2tMYWJlbHM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLGk9dGhpcy5fc2NhbGUuY2xvbmVXaXRob3V0UHJvdmlkZXJzKCkucmFuZ2UoWzAsdGhpcy5pc0hvcml6b250YWwoKT90OmVdKSxyPXRoaXMuZ2V0RG93bnNhbXBsZUluZm8oaSksbz1yLmRvbWFpbixhPXIuc3RlcFdpZHRoLHM9dC10aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpO3RoaXMuaXNIb3Jpem9udGFsKCkmJihzPWEsMCE9PXRoaXMuX3RpY2tMYWJlbEFuZ2xlJiYocz1lLXRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCkpLHM9TWF0aC5tYXgocywwKSk7dmFyIGw9YTt0aGlzLmlzSG9yaXpvbnRhbCgpJiYobD1lLXRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCksMCE9PXRoaXMuX3RpY2tMYWJlbEFuZ2xlJiYobD10LXRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCkpLGw9TWF0aC5tYXgobCwwKSksbnVsbCE9dGhpcy5fdGlja0xhYmVsTWF4V2lkdGgmJihzPU1hdGgubWluKHMsdGhpcy5fdGlja0xhYmVsTWF4V2lkdGgpKTt2YXIgYyx1PW8ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gbi5fd3JhcHBlci53cmFwKG4uZm9ybWF0dGVyKCkodCksbi5fbWVhc3VyZXIscyxsKX0pKSxoPXRoaXMuaXNIb3Jpem9udGFsKCkmJjA9PT10aGlzLl90aWNrTGFiZWxBbmdsZT96eXQuc3VtOkh5dC5NYXRoLm1heCxkPXRoaXMuaXNIb3Jpem9udGFsKCkmJjA9PT10aGlzLl90aWNrTGFiZWxBbmdsZT9IeXQuTWF0aC5tYXg6enl0LnN1bSxwPWgodSwoZnVuY3Rpb24odCl7cmV0dXJuIG4uX21lYXN1cmVyLm1lYXN1cmUodC53cmFwcGVkVGV4dCkud2lkdGh9KSwwKSxmPWQodSwoZnVuY3Rpb24odCl7cmV0dXJuIG4uX21lYXN1cmVyLm1lYXN1cmUodC53cmFwcGVkVGV4dCkuaGVpZ2h0fSksMCk7cmV0dXJuIDAhPT10aGlzLl90aWNrTGFiZWxBbmdsZSYmKHA9KGM9W2YscF0pWzBdLGY9Y1sxXSkse3VzZWRXaWR0aDpwLHVzZWRIZWlnaHQ6Zn19LGUucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3ZhciBuPXRoaXMuX3NjYWxlLGk9dGhpcy5nZXREb3duc2FtcGxlSW5mbyhuKSxyPWkuZG9tYWluLG89aS5zdGVwV2lkdGgsYT1vO3RoaXMuaXNIb3Jpem9udGFsKCkmJm51bGwhPXRoaXMuX3RpY2tMYWJlbE1heFdpZHRoJiYoYT1NYXRoLm1pbihhLHRoaXMuX3RpY2tMYWJlbE1heFdpZHRoKSk7dmFyIHM9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrRnl0LkF4aXMuVElDS19MQUJFTF9DTEFTUykuZGF0YShyKSxsPXMuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKEZ5dC5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MsITApLm1lcmdlKHMpO3MuZXhpdCgpLnJlbW92ZSgpLGwuYXR0cigidHJhbnNmb3JtIiwoZnVuY3Rpb24odCxpKXt2YXIgcj1uLnNjYWxlKHQpLWEvMjtyZXR1cm4idHJhbnNsYXRlKCIrKGUuaXNIb3Jpem9udGFsKCk/cjowKSsiLCIrKGUuaXNIb3Jpem9udGFsKCk/MDpyKSsiKSJ9KSksbC50ZXh0KCIiKSx0aGlzLl9kcmF3VGlja3MobyxsKTt2YXIgYz0icmlnaHQiPT09dGhpcy5vcmllbnRhdGlvbigpP3RoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCk6MCx1PSJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpP3RoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCk6MDtyZXR1cm4gdGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2MrIiwiK3UrIikiKSx0aGlzLl9zaG93QWxsVGlja01hcmtzKCksdGhpcy5fc2hvd0FsbFRpY2tMYWJlbHMoKSx0aGlzLl9oaWRlVGlja01hcmtzV2l0aG91dExhYmVsKCksdGhpc30sZS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihlLG4saSl7cmV0dXJuIHQucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLGUsbixpKSx0aGlzLmlzSG9yaXpvbnRhbCgpfHx0aGlzLl9zY2FsZS5yYW5nZShbMCx0aGlzLmhlaWdodCgpXSksdGhpc30sZS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyksdGhpcy5fbWVhc3VyZXIucmVzZXQoKX0sZS5fTUlOSU1VTV9XSURUSF9QRVJfTEFCRUxfUFg9MTUsZX0pKEZ5dC5BeGlzKTtObXQuQ2F0ZWdvcnk9Vnl0O3ZhciBVeXQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KFV5dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGp5dD11TyxHeXQ9RWR0LFd5dD1JbXQscXl0PWd5dCxZeXQ9Rmd0LFh5dD1teXQsJHl0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7dmFyIGk9dC5jYWxsKHRoaXMsZSxuKXx8dGhpcztyZXR1cm4gaS5fdGlja0xhYmVsUG9zaXRpb25pbmc9ImNlbnRlciIsaS5fdXNlc1RleHRXaWR0aEFwcHJveGltYXRpb249ITEsaS5mb3JtYXR0ZXIocXl0LmdlbmVyYWwoKSksaX1yZXR1cm4ganl0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3QucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3ZhciBlPW5ldyBXeXQuU3ZnQ29udGV4dCh0aGlzLl90aWNrTGFiZWxDb250YWluZXIubm9kZSgpLFh5dC5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpO3RoaXMuX21lYXN1cmVyPW5ldyBXeXQuQ2FjaGVNZWFzdXJlcihlKSx0aGlzLl93cmFwcGVyPShuZXcgV3l0LldyYXBwZXIpLm1heExpbmVzKDEpfSxlLnByb3RvdHlwZS5fY29tcHV0ZVdpZHRoPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fdXNlc1RleHRXaWR0aEFwcHJveGltYXRpb24/dGhpcy5fY29tcHV0ZUFwcHJveGltYXRlVGV4dFdpZHRoKCk6dGhpcy5fY29tcHV0ZUV4YWN0VGV4dFdpZHRoKCk7cmV0dXJuImNlbnRlciI9PT10aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZz90aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSt0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSt0Ok1hdGgubWF4KHRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpLHRoaXMudGlja0xhYmVsUGFkZGluZygpK3QpfSxlLnByb3RvdHlwZS5fY29tcHV0ZUV4YWN0VGV4dFdpZHRoPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuX2dldFRpY2tWYWx1ZXMoKS5tYXAoKGZ1bmN0aW9uKGUpe3ZhciBuPXQuZm9ybWF0dGVyKCkoZSk7cmV0dXJuIHQuX21lYXN1cmVyLm1lYXN1cmUobikud2lkdGh9KSk7cmV0dXJuIFl5dC5NYXRoLm1heChlLDApfSxlLnByb3RvdHlwZS5fY29tcHV0ZUFwcHJveGltYXRlVGV4dFdpZHRoPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuX2dldFRpY2tWYWx1ZXMoKSxuPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoIk0iKS53aWR0aCxpPWUubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gdC5mb3JtYXR0ZXIoKShlKS5sZW5ndGgqbn0pKTtyZXR1cm4gWXl0Lk1hdGgubWF4KGksMCl9LGUucHJvdG90eXBlLl9jb21wdXRlSGVpZ2h0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodDtyZXR1cm4iY2VudGVyIj09PXRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nP3RoaXMuX21heExhYmVsVGlja0xlbmd0aCgpK3RoaXMudGlja0xhYmVsUGFkZGluZygpK3Q6TWF0aC5tYXgodGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCksdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkrdCl9LGUucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc2NhbGUsZT10LmRvbWFpbigpLG49ZVswXTw9ZVsxXT9lWzBdOmVbMV0saT1lWzBdPj1lWzFdP2VbMF06ZVsxXTtyZXR1cm4gdC50aWNrcygpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQ+PW4mJnQ8PWl9KSl9LGUucHJvdG90eXBlLl9yZXNjYWxlPWZ1bmN0aW9uKCl7aWYodGhpcy5faXNTZXR1cCl7aWYoIXRoaXMuaXNIb3Jpem9udGFsKCkpe3ZhciB0PXRoaXMuX2NvbXB1dGVXaWR0aCgpO2lmKHQ+dGhpcy53aWR0aCgpfHx0PHRoaXMud2lkdGgoKS10aGlzLm1hcmdpbigpKXJldHVybiB2b2lkIHRoaXMucmVkcmF3KCl9dGhpcy5yZW5kZXIoKX19LGUucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3ZhciBuPXt4OjAseTowLGR4OiIwZW0iLGR5OiIwLjNlbSJ9LGk9dGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkscj10aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSxvPSJtaWRkbGUiLGE9MCxzPTAsbD0wLGM9MDtpZih0aGlzLmlzSG9yaXpvbnRhbCgpKXN3aXRjaCh0aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZyl7Y2FzZSJsZWZ0IjpvPSJlbmQiLGE9LXIsYz1yO2JyZWFrO2Nhc2UiY2VudGVyIjpjPWkrcjticmVhaztjYXNlInJpZ2h0IjpvPSJzdGFydCIsYT1yLGM9cn1lbHNlIHN3aXRjaCh0aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZyl7Y2FzZSJ0b3AiOm4uZHk9Ii0wLjNlbSIsbD1yLHM9LXI7YnJlYWs7Y2FzZSJjZW50ZXIiOmw9aStyO2JyZWFrO2Nhc2UiYm90dG9tIjpuLmR5PSIxZW0iLGw9cixzPXJ9dmFyIHU9dGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCk7c3dpdGNoKHRoaXMub3JpZW50YXRpb24oKSl7Y2FzZSJib3R0b20iOm4ueD11LngxLG4uZHk9IjAuOTVlbSIscz11LnkxK2M7YnJlYWs7Y2FzZSJ0b3AiOm4ueD11LngxLG4uZHk9Ii0uMjVlbSIscz11LnkxLWM7YnJlYWs7Y2FzZSJsZWZ0IjpvPSJlbmQiLGE9dS54MS1sLG4ueT11LnkxO2JyZWFrO2Nhc2UicmlnaHQiOm89InN0YXJ0IixhPXUueDErbCxuLnk9dS55MX12YXIgaD10aGlzLl9nZXRUaWNrVmFsdWVzKCksZD10aGlzLl90aWNrTGFiZWxDb250YWluZXIuc2VsZWN0QWxsKCIuIitYeXQuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5kYXRhKGgpO3JldHVybiBkLmV4aXQoKS5yZW1vdmUoKSxkLmVudGVyKCkuYXBwZW5kKCJ0ZXh0IikuY2xhc3NlZChYeXQuQXhpcy5USUNLX0xBQkVMX0NMQVNTLCEwKS5tZXJnZShkKS5zdHlsZSgidGV4dC1hbmNob3IiLG8pLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaW5oZXJpdCIpLmF0dHJzKG4pLnRleHQoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmZvcm1hdHRlcigpKHQpfSkpLHRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIithKyIsICIrcysiKSIpLHRoaXMuX3Nob3dBbGxUaWNrTWFya3MoKSx0aGlzLnNob3dFbmRUaWNrTGFiZWxzKCl8fHRoaXMuX2hpZGVFbmRUaWNrTGFiZWxzKCksdGhpcy5faGlkZU92ZXJmbG93aW5nVGlja0xhYmVscygpLHRoaXMuX2hpZGVPdmVybGFwcGluZ1RpY2tMYWJlbHMoKSwiY2VudGVyIiE9PXRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nJiZ0aGlzLl9oaWRlVGlja01hcmtzV2l0aG91dExhYmVsKCksdGhpc30sZS5wcm90b3R5cGUudGlja0xhYmVsUG9zaXRpb249ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc7dmFyIGU9dC50b0xvd2VyQ2FzZSgpO2lmKHRoaXMuaXNIb3Jpem9udGFsKCkpe2lmKCJsZWZ0IiE9PWUmJiJjZW50ZXIiIT09ZSYmInJpZ2h0IiE9PWUpdGhyb3cgbmV3IEVycm9yKGUrIiBpcyBub3QgYSB2YWxpZCB0aWNrIGxhYmVsIHBvc2l0aW9uIGZvciBhIGhvcml6b250YWwgTnVtZXJpY0F4aXMiKX1lbHNlIGlmKCJ0b3AiIT09ZSYmImNlbnRlciIhPT1lJiYiYm90dG9tIiE9PWUpdGhyb3cgbmV3IEVycm9yKGUrIiBpcyBub3QgYSB2YWxpZCB0aWNrIGxhYmVsIHBvc2l0aW9uIGZvciBhIHZlcnRpY2FsIE51bWVyaWNBeGlzIik7cmV0dXJuIHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nPWUsdGhpcy5yZWRyYXcoKSx0aGlzfSxlLnByb3RvdHlwZS51c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl91c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbjoodGhpcy5fdXNlc1RleHRXaWR0aEFwcHJveGltYXRpb249dCx0aGlzKX0sZS5wcm90b3R5cGUuX2hpZGVFbmRUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbGVtZW50KCkubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrWHl0LkF4aXMuVElDS19MQUJFTF9DTEFTUyk7aWYoMCE9PWUuc2l6ZSgpKXt2YXIgbj1lLm5vZGVzKClbMF07WXl0LkRPTS5jbGllbnRSZWN0SW5zaWRlKG4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdCl8fEd5dC5zZWxlY3Qobikuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKTt2YXIgaT1lLm5vZGVzKClbZS5zaXplKCktMV07WXl0LkRPTS5jbGllbnRSZWN0SW5zaWRlKGkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdCl8fEd5dC5zZWxlY3QoaSkuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX19LGUucHJvdG90eXBlLl9oaWRlT3ZlcmxhcHBpbmdUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5zZWxlY3RBbGwoIi4iK1h5dC5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmZpbHRlcigoZnVuY3Rpb24odCxlKXt2YXIgbj1HeXQuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5Iik7cmV0dXJuImluaGVyaXQiPT09bnx8InZpc2libGUiPT09bn0pKSxlPXQubm9kZXMoKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfSkpLG49MTshdGhpcy5faGFzT3ZlcmxhcFdpdGhJbnRlcnZhbChuLGUpJiZuPGUubGVuZ3RoOyluKz0xO3QuZWFjaCgoZnVuY3Rpb24odCxlKXt2YXIgaT1HeXQuc2VsZWN0KHRoaXMpO2UlbiE9MCYmaS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpfSkpfSxlLnByb3RvdHlwZS5faGFzT3ZlcmxhcFdpdGhJbnRlcnZhbD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0iY2VudGVyIj09PXRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nP3RoaXMudGlja0xhYmVsUGFkZGluZygpOjMqdGhpcy50aWNrTGFiZWxQYWRkaW5nKCksaT1lLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIFl5dC5ET00uZXhwYW5kUmVjdCh0LG4pfSkpLHI9MDtyPGkubGVuZ3RoLXQ7cis9dClpZihZeXQuRE9NLmNsaWVudFJlY3RzT3ZlcmxhcChpW3JdLGlbcit0XSkpcmV0dXJuITE7cmV0dXJuITB9LGUucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe3QucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpLHRoaXMuX21lYXN1cmVyLnJlc2V0KCl9LGV9KShYeXQuQXhpcyk7VXl0Lk51bWVyaWM9JHl0O3ZhciBLeXQ9e30sWnl0PXt9LEp5dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KEp5dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFF5dD1GZ3Q7Snl0LmludGVydmFsVGlja0dlbmVyYXRvcj1mdW5jdGlvbiB0dnQodCl7aWYodDw9MCl0aHJvdyBuZXcgRXJyb3IoImludGVydmFsIG11c3QgYmUgcG9zaXRpdmUgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPWUuZG9tYWluKCksaT1NYXRoLm1pbihuWzBdLG5bMV0pLHI9TWF0aC5tYXgoblswXSxuWzFdKSxvPU1hdGguY2VpbChpL3QpKnQsYT1NYXRoLmZsb29yKChyLW8pL3QpKzEscz1pJXQ9PTA/W106W2ldLGw9UXl0Lk1hdGgucmFuZ2UoMCxhKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBvK2UqdH0pKSxjPXIldD09MD9bXTpbcl07cmV0dXJuIHMuY29uY2F0KGwpLmNvbmNhdChjKX19LEp5dC5pbnRlZ2VyVGlja0dlbmVyYXRvcj1mdW5jdGlvbiBldnQoKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dC5kZWZhdWx0VGlja3MoKTtyZXR1cm4gZS5maWx0ZXIoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIHQlMT09MHx8MD09PW58fG49PT1lLmxlbmd0aC0xfSkpfX07dmFyIG52dD17fSxpdnQ9e307ZnVuY3Rpb24gcnZ0KHQsZSxuKXtyZXR1cm4gbi0obi10KSplfWZ1bmN0aW9uIG92dCh0LGUsbil7cmV0dXJuKHQqZS1uKS8oZS0xKX1mdW5jdGlvbiBhdnQodCxlLG4saSl7dmFyIHI9ZT4xLG89cj9pOm47aWYobnVsbD09bylyZXR1cm4gZTt2YXIgYT10LmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCkscz1NYXRoLmFicyhhWzFdLWFbMF0pO3JldHVybihyP01hdGgubWluOk1hdGgubWF4KShlLG8vcyl9ZnVuY3Rpb24gc3Z0KHQsZSxuLGkscil7aWYoZTw9MSlyZXR1cm57Y2VudGVyUG9pbnQ6bix6b29tQW1vdW50OmV9O2lmKG51bGw9PWkmJm51bGw9PXIpcmV0dXJue2NlbnRlclBvaW50Om4sem9vbUFtb3VudDplfTt2YXIgbz1sdnQodCksYT0oZnVuY3Rpb24gcyh0KXt2YXIgZT10LmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCk7cmV0dXJuIGVbMV08ZVswXX0pKHQpO2k9bnVsbD09aT9hPzEvMDotMS8wOmkscj1udWxsPT1yP2E/LTEvMDoxLzA6cjt2YXIgbD10LmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCksYz1sWzBdLHU9bFsxXSxoPXQuc2NhbGVUcmFuc2Zvcm1hdGlvbihyKSxkPXQuc2NhbGVUcmFuc2Zvcm1hdGlvbih1KSxwPXJ2dChkLGUsbiksZj10LnNjYWxlVHJhbnNmb3JtYXRpb24oaSksbT10LnNjYWxlVHJhbnNmb3JtYXRpb24oYyksZz1ydnQobSxlLG4pLF89TWF0aC5hYnMoaC1mKTtpZihNYXRoLmFicyhwLWcpPl8pe3ZhciB5PShoLWYpLyhkLW0pO3JldHVybiAxIT09eT97Y2VudGVyUG9pbnQ6b3Z0KGQseSxoKSx6b29tQW1vdW50Onl9OntjZW50ZXJQb2ludDpuLHpvb21BbW91bnQ6eX19cmV0dXJuIHA+aCE9bz97Y2VudGVyUG9pbnQ6b3Z0KGQsZSxoKSx6b29tQW1vdW50OmV9Omc8ZiE9bz97Y2VudGVyUG9pbnQ6b3Z0KG0sZSxmKSx6b29tQW1vdW50OmV9OntjZW50ZXJQb2ludDpuLHpvb21BbW91bnQ6ZX19ZnVuY3Rpb24gbHZ0KHQpe3ZhciBlPXQucmFuZ2UoKTtyZXR1cm4gZVsxXTxlWzBdfQovKioKICAgICAqIENvcHlyaWdodCAyMDE3LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoaXZ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxpdnQuem9vbU91dD1ydnQsaXZ0LmNvbnN0cmFpbmVkWm9vbT1mdW5jdGlvbiBjdnQodCxlLG4saSxyLG8sYSl7cmV0dXJuIHN2dCh0LGU9YXZ0KHQsZSxpLHIpLG4sbyxhKX0saXZ0LmNvbnN0cmFpblpvb21FeHRlbnRzPWF2dCxpdnQuY29uc3RyYWluWm9vbVZhbHVlcz1zdnQsaXZ0LmNvbnN0cmFpbmVkVHJhbnNsYXRpb249ZnVuY3Rpb24gdXZ0KHQsZSxuLGkpe3ZhciByLG89dC5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpLGE9b1swXSxzPW9bMV0sbD1sdnQodCk7aWYoZT4wIT09bCl7aWYobnVsbCE9KHI9aSkpe3ZhciBjPXQuc2NhbGVUcmFuc2Zvcm1hdGlvbihzKSx1PXQuc2NhbGVUcmFuc2Zvcm1hdGlvbihyKTtlPShsP01hdGgubWF4Ok1hdGgubWluKShjK2UsdSktY319ZWxzZSBpZihudWxsIT0ocj1uKSl7dmFyIGg9dC5zY2FsZVRyYW5zZm9ybWF0aW9uKGEpLGQ9dC5zY2FsZVRyYW5zZm9ybWF0aW9uKHIpO2U9KGw/TWF0aC5taW46TWF0aC5tYXgpKGgrZSxkKS1ofXJldHVybiBlfTt2YXIgaHZ0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShodnQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBkdnQ9Rmd0LHB2dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fYXV0b0RvbWFpbkF1dG9tYXRpY2FsbHk9ITAsdGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzcz0hMSx0aGlzLl91cGRhdGVJZD0wLHRoaXMuX2NhbGxiYWNrcz1uZXcgZHZ0LkNhbGxiYWNrU2V0LHRoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXJzPW5ldyBkdnQuU2V0fXJldHVybiB0LnByb3RvdHlwZS5leHRlbnRPZlZhbHVlcz1mdW5jdGlvbih0KXtyZXR1cm5bXX0sdC5wcm90b3R5cGUuX2dldEFsbEluY2x1ZGVkVmFsdWVzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dm9pZCAwPT09dCYmKHQ9ITEpO3ZhciBuPVtdO3JldHVybiB0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVycy5mb3JFYWNoKChmdW5jdGlvbihpKXt2YXIgcj1pKGUsdCk7bj1uLmNvbmNhdChyKX0pKSxufSx0LnByb3RvdHlwZS5fZ2V0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuW119LHQucHJvdG90eXBlLm9uVXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jYWxsYmFja3MuYWRkKHQpLHRoaXN9LHQucHJvdG90eXBlLm9mZlVwZGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSx0LnByb3RvdHlwZS5fZGlzcGF0Y2hVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVJZCsrLHRoaXMuX2NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMpfSx0LnByb3RvdHlwZS5hdXRvRG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2F1dG9Eb21haW5BdXRvbWF0aWNhbGx5PSEwLHRoaXMuX3NldERvbWFpbih0aGlzLl9nZXRFeHRlbnQoKSksdGhpc30sdC5wcm90b3R5cGUuYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZT1mdW5jdGlvbigpe3RoaXMuX2F1dG9Eb21haW5BdXRvbWF0aWNhbGx5JiZ0aGlzLmF1dG9Eb21haW4oKX0sdC5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBzY2FsZSIpfSx0LnByb3RvdHlwZS50aWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbWFpbigpfSx0LnByb3RvdHlwZS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZ2V0RG9tYWluKCk6KHRoaXMuX2F1dG9Eb21haW5BdXRvbWF0aWNhbGx5PSExLHRoaXMuX3NldERvbWFpbih0KSx0aGlzKX0sdC5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2dldERvbWFpbiIpfSx0LnByb3RvdHlwZS5fc2V0RG9tYWluPWZ1bmN0aW9uKHQpe3RoaXMuX2RvbWFpbk1vZGlmaWNhdGlvbkluUHJvZ3Jlc3N8fCh0aGlzLl9kb21haW5Nb2RpZmljYXRpb25JblByb2dyZXNzPSEwLHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbih0KSx0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpLHRoaXMuX2RvbWFpbk1vZGlmaWNhdGlvbkluUHJvZ3Jlc3M9ITEpfSx0LnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2JhY2tpbmdEb21haW4iKX0sdC5wcm90b3R5cGUucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZ2V0UmFuZ2UoKToodGhpcy5fc2V0UmFuZ2UodCksdGhpcyl9LHQucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2dldFJhbmdlIil9LHQucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIF9zZXRSYW5nZSIpfSx0LnByb3RvdHlwZS5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVycy5hZGQodCksdGhpcy5hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCksdGhpc30sdC5wcm90b3R5cGUucmVtb3ZlSW5jbHVkZWRWYWx1ZXNQcm92aWRlcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcnMuZGVsZXRlKHQpLHRoaXMuYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpLHRoaXN9LHQucHJvdG90eXBlLnVwZGF0ZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VwZGF0ZUlkfSx0fSkoKTtodnQuU2NhbGU9cHZ0LAovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkobnZ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZnZ0PXVPLG12dD1FZHQsZ3Z0PWl2dCxfdnQ9Rmd0LHl2dD1bMCwxXSx2dnQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4uX3JhbmdlPVswLDFdLG4uX2QzU2NhbGU9bXZ0LnNjYWxlQmFuZCgpLG4uX2QzU2NhbGUucmFuZ2UoeXZ0KSxuLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGU9bXZ0LnNjYWxlTGluZWFyKCksbi5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih5dnQpLG4uX2lubmVyUGFkZGluZz1lLl9jb252ZXJ0VG9QbG90dGFibGVJbm5lclBhZGRpbmcoLjMpLG4uX291dGVyUGFkZGluZz1lLl9jb252ZXJ0VG9QbG90dGFibGVPdXRlclBhZGRpbmcoLjUsLjMpLG59cmV0dXJuIGZ2dC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5jbG9uZVdpdGhvdXRQcm92aWRlcnM9ZnVuY3Rpb24oKXt2YXIgdD0obmV3IGUpLmRvbWFpbih0aGlzLmRvbWFpbigpKS5yYW5nZSh0aGlzLnJhbmdlKCkpLmlubmVyUGFkZGluZyh0aGlzLmlubmVyUGFkZGluZygpKS5vdXRlclBhZGRpbmcodGhpcy5vdXRlclBhZGRpbmcoKSk7cmV0dXJuIHQuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4odGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbigpKSx0fSxlLnByb3RvdHlwZS5leHRlbnRPZlZhbHVlcz1mdW5jdGlvbih0KXtyZXR1cm4gX3Z0LkFycmF5LnVuaXEodCl9LGUucHJvdG90eXBlLl9nZXRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gX3Z0LkFycmF5LnVuaXEodGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKSl9LGUucHJvdG90eXBlLmRvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gdC5wcm90b3R5cGUuZG9tYWluLmNhbGwodGhpcyxlKX0sZS5wcm90b3R5cGUuaW52ZXJ0UmFuZ2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt2b2lkIDA9PT10JiYodD10aGlzLnJhbmdlKCkpO3ZhciBuPXRoaXMuX2QzU2NhbGUuYmFuZHdpZHRoKCksaT10aGlzLmludmVydGVkVHJhbnNmb3JtYXRpb24odFswXSkscj10aGlzLmludmVydGVkVHJhbnNmb3JtYXRpb24odFsxXSksbz10aGlzLl9kM1NjYWxlLmRvbWFpbigpLGE9by5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9kM1NjYWxlKHQpK24vMn0pKSxzPW12dC5iaXNlY3QoYSxpKSxsPW12dC5iaXNlY3QoYSxyKTtyZXR1cm4gby5zbGljZShzLGwpfSxlLnByb3RvdHlwZS5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gdC5wcm90b3R5cGUucmFuZ2UuY2FsbCh0aGlzLGUpfSxlLl9jb252ZXJ0VG9QbG90dGFibGVJbm5lclBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIDEvKDEtdCktMX0sZS5fY29udmVydFRvUGxvdHRhYmxlT3V0ZXJQYWRkaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQvKDEtZSl9LGUucHJvdG90eXBlLl9zZXRCYW5kcz1mdW5jdGlvbigpe3ZhciB0PTEtMS8oMSt0aGlzLmlubmVyUGFkZGluZygpKSxlPXRoaXMub3V0ZXJQYWRkaW5nKCkvKDErdGhpcy5pbm5lclBhZGRpbmcoKSk7dGhpcy5fZDNTY2FsZS5wYWRkaW5nSW5uZXIodCksdGhpcy5fZDNTY2FsZS5wYWRkaW5nT3V0ZXIoZSl9LGUucHJvdG90eXBlLnJhbmdlQmFuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXNjYWxlQmFuZCh0aGlzLl9kM1NjYWxlLmJhbmR3aWR0aCgpKX0sZS5wcm90b3R5cGUuc3RlcFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc2NhbGVCYW5kKHRoaXMuX2QzU2NhbGUuYmFuZHdpZHRoKCkqKDErdGhpcy5pbm5lclBhZGRpbmcoKSkpfSxlLnByb3RvdHlwZS50aWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbWFpbigpfSxlLnByb3RvdHlwZS5pbm5lclBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5faW5uZXJQYWRkaW5nOih0aGlzLl9pbm5lclBhZGRpbmc9dCx0aGlzLnJhbmdlKHRoaXMucmFuZ2UoKSksdGhpcy5fZGlzcGF0Y2hVcGRhdGUoKSx0aGlzKX0sZS5wcm90b3R5cGUub3V0ZXJQYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX291dGVyUGFkZGluZzoodGhpcy5fb3V0ZXJQYWRkaW5nPXQsdGhpcy5yYW5nZSh0aGlzLnJhbmdlKCkpLHRoaXMuX2Rpc3BhdGNoVXBkYXRlKCksdGhpcyl9LGUucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2QzU2NhbGUodCkrdGhpcy5fZDNTY2FsZS5iYW5kd2lkdGgoKS8yO3JldHVybiB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUoZSl9LGUucHJvdG90eXBlLnpvb209ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3RoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4odGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLnJhbmdlKCkubWFwKChmdW5jdGlvbihpKXtyZXR1cm4gbi5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmludmVydChndnQuem9vbU91dChpLHQsZSkpfSkpKSx0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfSxlLnByb3RvdHlwZS5wYW49ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5yYW5nZSgpLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIGUuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5pbnZlcnQobit0KX0pKSksdGhpcy5fZGlzcGF0Y2hVcGRhdGUoKX0sZS5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlKHQpfSxlLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuaW52ZXJ0KHQpfSxlLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD1mdW5jdGlvbigpe3JldHVybiB5dnR9LGUucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4oKX0sZS5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24odCl7dGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih0KSx0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfSxlLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfSxlLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2QzU2NhbGUuZG9tYWluKCk6KHRoaXMuX2QzU2NhbGUuZG9tYWluKHQpLHRoaXMuX3NldEJhbmRzKCksdGhpcyl9LGUucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYW5nZX0sZS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHQpe3RoaXMuX3JhbmdlPXQsdGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLnJhbmdlKHQpLHRoaXMuX3NldEJhbmRzKCl9LGUucHJvdG90eXBlLl9yZXNjYWxlQmFuZD1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5hYnModGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlKHQpLXRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZSgwKSl9LGV9KShodnQuU2NhbGUpO252dC5DYXRlZ29yeT12dnQ7dmFyIGJ2dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoYnZ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgeHZ0PXVPLHd2dD1FZHQsU3Z0PUZndCxNdnQ9aHZ0LEV2dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5jb3VudD0wLHRoaXMudHJhY2tlcj17fX1yZXR1cm4gdC5wcm90b3R5cGUuZ2V0SW5kZXg9ZnVuY3Rpb24odCl7aWYobnVsbCE9dGhpcy50cmFja2VyW3RdKXJldHVybiB0aGlzLnRyYWNrZXJbdF07dmFyIGU9dGhpcy5jb3VudDtyZXR1cm4gdGhpcy50cmFja2VyW3RdPWUsdGhpcy5jb3VudCs9MSxlfSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuY291bnQ9MCx0aGlzLnRyYWNrZXI9e319LHR9KSgpLFR2dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXt2YXIgaSxyPXQuY2FsbCh0aGlzKXx8dGhpcztzd2l0Y2goci5fcmFuZ2VMZW5ndGg9MSxyLl90cmFja2VyPW5ldyBFdnQsbil7Y2FzZSBudWxsOmNhc2Ugdm9pZCAwOm51bGw9PWUuX3Bsb3R0YWJsZUNvbG9yQ2FjaGUmJihlLl9wbG90dGFibGVDb2xvckNhY2hlPWUuX2dldFBsb3R0YWJsZUNvbG9ycygpKSxpPXd2dC5zY2FsZU9yZGluYWwoKS5yYW5nZShlLl9wbG90dGFibGVDb2xvckNhY2hlKTticmVhaztjYXNlIkNhdGVnb3J5MTAiOmNhc2UiY2F0ZWdvcnkxMCI6Y2FzZSIxMCI6aT13dnQuc2NhbGVPcmRpbmFsKHd2dC5zY2hlbWVDYXRlZ29yeTEwKTticmVhaztjYXNlIkNhdGVnb3J5MjAiOmNhc2UiY2F0ZWdvcnkyMCI6Y2FzZSIyMCI6aT13dnQuc2NhbGVPcmRpbmFsKHd2dC5zY2hlbWVDYXRlZ29yeTIwKTticmVhaztjYXNlIkNhdGVnb3J5MjBiIjpjYXNlImNhdGVnb3J5MjBiIjpjYXNlIjIwYiI6aT13dnQuc2NhbGVPcmRpbmFsKHd2dC5zY2hlbWVDYXRlZ29yeTIwYik7YnJlYWs7Y2FzZSJDYXRlZ29yeTIwYyI6Y2FzZSJjYXRlZ29yeTIwYyI6Y2FzZSIyMGMiOmk9d3Z0LnNjYWxlT3JkaW5hbCh3dnQuc2NoZW1lQ2F0ZWdvcnkyMGMpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCBDb2xvclNjYWxlIHR5cGUiKX1yZXR1cm4gci5fZDNTY2FsZT1pLHIuX3JhbmdlTGVuZ3RoPXIuX2QzU2NhbGUucmFuZ2UoKS5sZW5ndGgscn1yZXR1cm4geHZ0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybiBTdnQuQXJyYXkudW5pcSh0KX0sZS5wcm90b3R5cGUuX2dldEV4dGVudD1mdW5jdGlvbigpe3JldHVybiBTdnQuQXJyYXkudW5pcSh0aGlzLl9nZXRBbGxJbmNsdWRlZFZhbHVlcygpKX0sZS5pbnZhbGlkYXRlQ29sb3JDYWNoZT1mdW5jdGlvbigpe2UuX3Bsb3R0YWJsZUNvbG9yQ2FjaGU9bnVsbH0sZS5fZ2V0UGxvdHRhYmxlQ29sb3JzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9d3Z0LnNlbGVjdCgiYm9keSIpLmFwcGVuZCgicGxvdHRhYmxlLWNvbG9yLXRlc3RlciIpLG49U3Z0LkNvbG9yLmNvbG9yVGVzdChlLCIiKSxpPTAscj1TdnQuQ29sb3IuY29sb3JUZXN0KGUsInBsb3R0YWJsZS1jb2xvcnMtMCIpO251bGwhPXImJmk8dGhpcy5fTUFYSU1VTV9DT0xPUlNfRlJPTV9DU1MmJihyIT09bnx8ciE9PXRbdC5sZW5ndGgtMV0pOyl0LnB1c2gociksaSsrLHI9U3Z0LkNvbG9yLmNvbG9yVGVzdChlLCJwbG90dGFibGUtY29sb3JzLSIraSk7cmV0dXJuIGUucmVtb3ZlKCksdH0sZS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fZDNTY2FsZSh0KSxpPXRoaXMuX3RyYWNrZXIuZ2V0SW5kZXgodCkscj1NYXRoLmZsb29yKGkvdGhpcy5fcmFuZ2VMZW5ndGgpO2lmKDA9PT1yKXJldHVybiBuO3ZhciBvPU1hdGgubG9nKHIqZS5fTE9PUF9MSUdIVEVOX0ZBQ1RPUisxKTtyZXR1cm4gU3Z0LkNvbG9yLmxpZ2h0ZW5Db2xvcihuLG8pfSxlLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfSxlLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2QzU2NhbGUuZG9tYWluKCk6KHRoaXMuX2QzU2NhbGUuZG9tYWluKHQpLHRoaXMuX3RyYWNrZXIuY2xlYXIoKSx0aGlzKX0sZS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUucmFuZ2UoKX0sZS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHQpe3RoaXMuX2QzU2NhbGUucmFuZ2UodCksdGhpcy5fcmFuZ2VMZW5ndGg9dC5sZW5ndGh9LGUuX0xPT1BfTElHSFRFTl9GQUNUT1I9MS42LGUuX01BWElNVU1fQ09MT1JTX0ZST01fQ1NTPTI1NixlfSkoTXZ0LlNjYWxlKTtidnQuQ29sb3I9VHZ0O3ZhciBDdnQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KEN2dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIEF2dD11TyxrdnQ9RWR0LEx2dD1GZ3QsUHZ0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZvaWQgMD09PW4mJihuPSJsaW5lYXIiKTt2YXIgaT10LmNhbGwodGhpcyl8fHRoaXM7c3dpdGNoKG4pe2Nhc2UibGluZWFyIjppLl9jb2xvclNjYWxlPWt2dC5zY2FsZUxpbmVhcigpO2JyZWFrO2Nhc2UibG9nIjppLl9jb2xvclNjYWxlPWt2dC5zY2FsZUxvZygpO2JyZWFrO2Nhc2Uic3FydCI6aS5fY29sb3JTY2FsZT1rdnQuc2NhbGVTcXJ0KCk7YnJlYWs7Y2FzZSJwb3ciOmkuX2NvbG9yU2NhbGU9a3Z0LnNjYWxlUG93KCl9aWYobnVsbD09aS5fY29sb3JTY2FsZSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gUXVhbnRpdGF0aXZlU2NhbGUgc2NhbGUgdHlwZSAiK24pO3JldHVybiBpLnJhbmdlKGUuUkVEUyksaX1yZXR1cm4gQXZ0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKHQpe3ZhciBlPWt2dC5leHRlbnQodCk7cmV0dXJuIG51bGw9PWVbMF18fG51bGw9PWVbMV0/W106ZX0sZS5wcm90b3R5cGUuX2QzSW50ZXJwb2xhdGVkU2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29sb3JTY2FsZS5yYW5nZShbMCwxXSkuaW50ZXJwb2xhdGUodGhpcy5faW50ZXJwb2xhdGVDb2xvcnMoKSl9LGUucHJvdG90eXBlLl9pbnRlcnBvbGF0ZUNvbG9ycz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NvbG9yUmFuZ2U7aWYodC5sZW5ndGg8Mil0aHJvdyBuZXcgRXJyb3IoIkNvbG9yIHNjYWxlIGFycmF5cyBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIGVsZW1lbnRzLiIpO3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj0oZT1NYXRoLm1heCgwLE1hdGgubWluKDEsZSkpKSoodC5sZW5ndGgtMSksaT1NYXRoLmZsb29yKG4pLHI9TWF0aC5jZWlsKG4pLG89bi1pO3JldHVybiBrdnQuaW50ZXJwb2xhdGVMYWIodFtpXSx0W3JdKShvKX19fSxlLnByb3RvdHlwZS5fcmVzZXRTY2FsZT1mdW5jdGlvbigpe3RoaXMuX2QzU2NhbGU9dGhpcy5fZDNJbnRlcnBvbGF0ZWRTY2FsZSgpLHRoaXMuYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpLHRoaXMuX2Rpc3BhdGNoVXBkYXRlKCl9LGUucHJvdG90eXBlLmF1dG9Eb21haW49ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9nZXRBbGxJbmNsdWRlZFZhbHVlcygpO3JldHVybiB0Lmxlbmd0aD4wJiZ0aGlzLl9zZXREb21haW4oW0x2dC5NYXRoLm1pbih0LDApLEx2dC5NYXRoLm1heCh0LDApXSksdGhpc30sZS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUodCl9LGUucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCl9LGUucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZDNTY2FsZS5kb21haW4oKToodGhpcy5fZDNTY2FsZS5kb21haW4odCksdGhpcyl9LGUucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb2xvclJhbmdlfSxlLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24odCl7dGhpcy5fY29sb3JSYW5nZT10LHRoaXMuX3Jlc2V0U2NhbGUoKX0sZS5SRURTPVsiI0ZGRkZGRiIsIiNGRkY2RTEiLCIjRkVGNEMwIiwiI0ZFRDk3NiIsIiNGRUIyNEMiLCIjRkQ4RDNDIiwiI0ZDNEUyQSIsIiNFMzFBMUMiLCIjQjEwMDI2Il0sZS5CTFVFUz1bIiNGRkZGRkYiLCIjQ0NGRkZGIiwiI0E1RkZGRCIsIiM4NUY3RkIiLCIjNkVEM0VGIiwiIzU1QTdFMCIsIiM0MTdGRDAiLCIjMjU0NUQzIiwiIzBCMDJFMSJdLGUuUE9TTkVHPVsiIzBCMDJFMSIsIiMyNTQ1RDMiLCIjNDE3RkQwIiwiIzU1QTdFMCIsIiM2RUQzRUYiLCIjODVGN0ZCIiwiI0E1RkZGRCIsIiNDQ0ZGRkYiLCIjRkZGRkZGIiwiI0ZGRjZFMSIsIiNGRUY0QzAiLCIjRkVEOTc2IiwiI0ZFQjI0QyIsIiNGRDhEM0MiLCIjRkM0RTJBIiwiI0UzMUExQyIsIiNCMTAwMjYiXSxlfSkoaHZ0LlNjYWxlKTtDdnQuSW50ZXJwb2xhdGVkQ29sb3I9UHZ0O3ZhciBOdnQ9e30sSXZ0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoSXZ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgUnZ0PXVPLE92dD1FZHQsenZ0PWl2dCxEdnQ9Rmd0LEJ2dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gZS5fdGlja0dlbmVyYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gdC5kZWZhdWx0VGlja3MoKX0sZS5fcGFkUHJvcG9ydGlvbj0uMDUsZS5fc25hcHBpbmdEb21haW5FbmFibGVkPSEwLGUuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzPW5ldyBEdnQuU2V0LGV9cmV0dXJuIFJ2dC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5hdXRvRG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RvbWFpbk1pbj1udWxsLHRoaXMuX2RvbWFpbk1heD1udWxsLHQucHJvdG90eXBlLmF1dG9Eb21haW4uY2FsbCh0aGlzKSx0aGlzfSxlLnByb3RvdHlwZS5hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlPWZ1bmN0aW9uKCl7aWYobnVsbD09dGhpcy5fZG9tYWluTWlufHxudWxsPT10aGlzLl9kb21haW5NYXgpe3ZhciBlPXRoaXMuX2dldEV4dGVudCgpO2lmKG51bGwhPXRoaXMuX2RvbWFpbk1pbil7dmFyIG49ZVsxXTtyZXR1cm4gdGhpcy5fZG9tYWluTWluPj1uJiYobj10aGlzLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbihbdGhpcy5fZG9tYWluTWluLHRoaXMuX2RvbWFpbk1pbl0pWzFdKSx2b2lkIHRoaXMuX3NldERvbWFpbihbdGhpcy5fZG9tYWluTWluLG5dKX1pZihudWxsIT10aGlzLl9kb21haW5NYXgpe3ZhciBpPWVbMF07cmV0dXJuIHRoaXMuX2RvbWFpbk1heDw9aSYmKGk9dGhpcy5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW4oW3RoaXMuX2RvbWFpbk1heCx0aGlzLl9kb21haW5NYXhdKVswXSksdm9pZCB0aGlzLl9zZXREb21haW4oW2ksdGhpcy5fZG9tYWluTWF4XSl9dC5wcm90b3R5cGUuYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZS5jYWxsKHRoaXMpfWVsc2UgdGhpcy5fc2V0RG9tYWluKFt0aGlzLl9kb21haW5NaW4sdGhpcy5fZG9tYWluTWF4XSl9LGUucHJvdG90eXBlLl9nZXRVbmJvdW5kZWRFeHRlbnQ9ZnVuY3Rpb24odCl7dm9pZCAwPT09dCYmKHQ9ITEpO3ZhciBlPXRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKHQpLG49dGhpcy5fZGVmYXVsdEV4dGVudCgpO2lmKDAhPT1lLmxlbmd0aCl7dmFyIGk9W0R2dC5NYXRoLm1pbihlLG5bMF0pLER2dC5NYXRoLm1heChlLG5bMV0pXTtuPXRoaXMuX3BhZERvbWFpbihpKX1yZXR1cm4gbn0sZS5wcm90b3R5cGUuX2dldEV4dGVudD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2dldFVuYm91bmRlZEV4dGVudCgpO3JldHVybiBudWxsIT10aGlzLl9kb21haW5NaW4mJih0WzBdPXRoaXMuX2RvbWFpbk1pbiksbnVsbCE9dGhpcy5fZG9tYWluTWF4JiYodFsxXT10aGlzLl9kb21haW5NYXgpLHR9LGUucHJvdG90eXBlLmFkZFBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzLmFkZCh0KSx0aGlzLmF1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKSx0aGlzfSxlLnByb3RvdHlwZS5yZW1vdmVQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVycy5kZWxldGUodCksdGhpcy5hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCksdGhpc30sZS5wcm90b3R5cGUucGFkUHJvcG9ydGlvbj1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9wYWRQcm9wb3J0aW9uO2lmKHQ8MCl0aHJvdyBuZXcgRXJyb3IoInBhZFByb3BvcnRpb24gbXVzdCBiZSBub24tbmVnYXRpdmUiKTtyZXR1cm4gdGhpcy5fcGFkUHJvcG9ydGlvbj10LHRoaXMuYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpLHRoaXN9LGUucHJvdG90eXBlLl9wYWREb21haW49ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZih0WzBdLnZhbHVlT2YoKT09PXRbMV0udmFsdWVPZigpKXJldHVybiB0aGlzLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbih0KTtpZigwPT09dGhpcy5fcGFkUHJvcG9ydGlvbilyZXR1cm4gdDt2YXIgbj10aGlzLl9wYWRQcm9wb3J0aW9uLzIsaT10WzBdLHI9dFsxXSxvPSExLGE9ITE7dGhpcy5fcGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcnMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dChlKS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnZhbHVlT2YoKT09PWkudmFsdWVPZigpJiYobz0hMCksdC52YWx1ZU9mKCk9PT1yLnZhbHVlT2YoKSYmKGE9ITApfSkpfSkpO3ZhciBzPXRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpO3RoaXMuX2JhY2tpbmdTY2FsZURvbWFpbih0KTt2YXIgbD1vP2k6dGhpcy5pbnZlcnQodGhpcy5zY2FsZShpKS0odGhpcy5zY2FsZShyKS10aGlzLnNjYWxlKGkpKSpuKSxjPWE/cjp0aGlzLmludmVydCh0aGlzLnNjYWxlKHIpKyh0aGlzLnNjYWxlKHIpLXRoaXMuc2NhbGUoaSkpKm4pO3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4ocyksdGhpcy5fc25hcHBpbmdEb21haW5FbmFibGVkP3RoaXMuX25pY2VEb21haW4oW2wsY10pOltsLGNdfSxlLnByb3RvdHlwZS5zbmFwcGluZ0RvbWFpbkVuYWJsZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fc25hcHBpbmdEb21haW5FbmFibGVkOih0aGlzLl9zbmFwcGluZ0RvbWFpbkVuYWJsZWQ9dCx0aGlzLmF1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKSx0aGlzKX0sZS5wcm90b3R5cGUuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiB0fSxlLnByb3RvdHlwZS5pbnZlcnQ9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpbnZlcnQiKX0sZS5wcm90b3R5cGUuZG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lJiYodGhpcy5fZG9tYWluTWluPWVbMF0sdGhpcy5fZG9tYWluTWF4PWVbMV0pLHQucHJvdG90eXBlLmRvbWFpbi5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLmRvbWFpbk1pbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLmRvbWFpbigpWzBdOih0aGlzLl9kb21haW5NaW49dCx0aGlzLmF1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKSx0aGlzKX0sZS5wcm90b3R5cGUuZG9tYWluTWF4PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuZG9tYWluKClbMV06KHRoaXMuX2RvbWFpbk1heD10LHRoaXMuYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpLHRoaXMpfSxlLnByb3RvdHlwZS5leHRlbnRPZlZhbHVlcz1mdW5jdGlvbih0KXt2YXIgZT1PdnQuZXh0ZW50KHQuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gRHZ0Lk1hdGguaXNWYWxpZE51bWJlcigrdCl9KSkpO3JldHVybiBudWxsPT1lWzBdfHxudWxsPT1lWzFdP1tdOmV9LGUucHJvdG90eXBlLnpvb209ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3RoaXMuZG9tYWluKHRoaXMucmFuZ2UoKS5tYXAoKGZ1bmN0aW9uKGkpe3JldHVybiBuLmludmVydCh6dnQuem9vbU91dChpLHQsZSkpfSkpKX0sZS5wcm90b3R5cGUucGFuPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5kb21haW4odGhpcy5yYW5nZSgpLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIGUuaW52ZXJ0KG4rdCl9KSkpfSxlLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgc2NhbGVUcmFuc2Zvcm1hdGlvbiIpfSxlLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbiIpfSxlLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQiKX0sZS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGdldFRyYW5zZm9ybWF0aW9uRG9tYWluIil9LGUucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgc2V0VHJhbnNmb3JtYXRpb25Eb21haW4iKX0sZS5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihlKXt2YXIgbj1mdW5jdGlvbih0KXtyZXR1cm4gRHZ0Lk1hdGguaXNOYU4odCl8fHQ9PT0xLzB8fHQ9PT0tMS8wfTtuKGVbMF0pfHxuKGVbMV0pP0R2dC5XaW5kb3cud2FybigiV2FybmluZzogUXVhbnRpdGF0aXZlU2NhbGVzIGNhbm5vdCB0YWtlIE5hTiBvciBJbmZpbml0eSBhcyBhIGRvbWFpbiB2YWx1ZS4gSWdub3JpbmcuIik6dC5wcm90b3R5cGUuX3NldERvbWFpbi5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLmRlZmF1bHRUaWNrcz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2dldERlZmF1bHRUaWNrcyIpfSxlLnByb3RvdHlwZS50aWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90aWNrR2VuZXJhdG9yKHRoaXMpfSxlLnByb3RvdHlwZS5fbmljZURvbWFpbj1mdW5jdGlvbih0LGUpe3Rocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX25pY2VEb21haW4iKX0sZS5wcm90b3R5cGUuX2RlZmF1bHRFeHRlbnQ9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIF9kZWZhdWx0RXh0ZW50Iil9LGUucHJvdG90eXBlLnRpY2tHZW5lcmF0b3I9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fdGlja0dlbmVyYXRvcjoodGhpcy5fdGlja0dlbmVyYXRvcj10LHRoaXMpfSxlLl9ERUZBVUxUX05VTV9USUNLUz0xMCxlfSkoaHZ0LlNjYWxlKTtJdnQuUXVhbnRpdGF0aXZlU2NhbGU9QnZ0LAovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoTnZ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgSHZ0PXVPLEZ2dD1FZHQsVnZ0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBlLl9kM1NjYWxlPUZ2dC5zY2FsZUxpbmVhcigpLGV9cmV0dXJuIEh2dC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3JldHVyblswLDFdfSxlLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIHRbMF09PT10WzFdP1t0WzBdLTEsdFsxXSsxXTp0fSxlLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZDNTY2FsZSh0KX0sZS5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zY2FsZSh0KX0sZS5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbnZlcnQodCl9LGUucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCl9LGUucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tYWluKCl9LGUucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKHQpe3RoaXMuZG9tYWluKHQpfSxlLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfSxlLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2QzU2NhbGUuZG9tYWluKCk6KHRoaXMuX2QzU2NhbGUuZG9tYWluKHQpLHRoaXMpfSxlLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5yYW5nZSgpfSxlLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24odCl7dGhpcy5fZDNTY2FsZS5yYW5nZSh0KX0sZS5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kM1NjYWxlLmludmVydCh0KX0sZS5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUudGlja3MoZS5fREVGQVVMVF9OVU1fVElDS1MpfSxlLnByb3RvdHlwZS5fbmljZURvbWFpbj1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9kM1NjYWxlLmNvcHkoKS5kb21haW4odCkubmljZShlKS5kb21haW4oKX0sZX0pKEl2dC5RdWFudGl0YXRpdmVTY2FsZSk7TnZ0LkxpbmVhcj1WdnQ7dmFyIFV2dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoVXZ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIganZ0PXVPLEd2dD1FZHQsV3Z0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPTEwKTt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4uX2QzU2NhbGU9R3Z0LnNjYWxlTG9nKCkuYmFzZShlKSxuLl9zZXREb21haW4obi5fZGVmYXVsdEV4dGVudCgpKSxufXJldHVybiBqdnQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX2RlZmF1bHRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm5bMSx0aGlzLl9kM1NjYWxlLmJhc2UoKV19LGUucHJvdG90eXBlLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gdFswXT09PXRbMV0/W3RbMF0vdGhpcy5fZDNTY2FsZS5iYXNlKCksdFsxXSp0aGlzLl9kM1NjYWxlLmJhc2UoKV06dH0sZS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUodCl9LGUucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc2NhbGUodCl9LGUucHJvdG90eXBlLmludmVydGVkVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW52ZXJ0KHQpfSxlLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRVbmJvdW5kZWRFeHRlbnQoITApfSxlLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbWFpbigpfSxlLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbih0KXt0aGlzLmRvbWFpbih0KX0sZS5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX0sZS5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9kM1NjYWxlLmRvbWFpbigpOih0aGlzLl9kM1NjYWxlLmRvbWFpbih0KSx0aGlzKX0sZS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUucmFuZ2UoKX0sZS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHQpe3RoaXMuX2QzU2NhbGUucmFuZ2UodCl9LGUucHJvdG90eXBlLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5pbnZlcnQodCl9LGUucHJvdG90eXBlLmRlZmF1bHRUaWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnRpY2tzKGUuX0RFRkFVTFRfTlVNX1RJQ0tTKX0sZS5wcm90b3R5cGUuX25pY2VEb21haW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5jb3B5KCkuZG9tYWluKHQpLm5pY2UoKS5kb21haW4oKX0sZX0pKEl2dC5RdWFudGl0YXRpdmVTY2FsZSk7VXZ0LkxvZz1XdnQ7dmFyIHF2dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkocXZ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgWXZ0PXVPLFh2dD1FZHQsJHZ0PUZndCxLdnQ9Wnl0LFp2dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT0xMCk7dmFyIG49dC5jYWxsKHRoaXMpfHx0aGlzO2lmKG4uX2xvZ1RpY2tHZW5lcmF0b3I9ZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24odCxlLG4pe3JldHVyblt0LGUsbl0uc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC1lfSkpWzFdfSxpPSR2dC5NYXRoLm1pbihuLl91bnRyYW5zZm9ybWVkRG9tYWluLDApLHI9JHZ0Lk1hdGgubWF4KG4uX3VudHJhbnNmb3JtZWREb21haW4sMCksbz1pLGE9ZShpLHIsLW4uX3Bpdm90KSxzPWUoaSxyLG4uX3Bpdm90KSxsPXIsYz1uLl9sb2dUaWNrcygtYSwtbykubWFwKChmdW5jdGlvbih0KXtyZXR1cm4tdH0pKS5yZXZlcnNlKCksdT1uLl9sb2dUaWNrcyhzLGwpLGg9TWF0aC5tYXgoaSwtbi5fcGl2b3QpLGQ9TWF0aC5taW4ocixuLl9waXZvdCkscD1YdnQuc2NhbGVMaW5lYXIoKS5kb21haW4oW2gsZF0pLnRpY2tzKG4uX2hvd01hbnlUaWNrcyhoLGQpKSxmPWMuY29uY2F0KHApLmNvbmNhdCh1KTtyZXR1cm4gZi5sZW5ndGg8PTEmJihmPVh2dC5zY2FsZUxpbmVhcigpLmRvbWFpbihbaSxyXSkudGlja3MoS3Z0Lk1vZGlmaWVkTG9nLl9ERUZBVUxUX05VTV9USUNLUykpLGZ9LG4uX2QzU2NhbGU9WHZ0LnNjYWxlTGluZWFyKCksbi5fYmFzZT1lLG4uX3Bpdm90PW4uX2Jhc2Usbi5fc2V0RG9tYWluKG4uX2RlZmF1bHRFeHRlbnQoKSksbi50aWNrR2VuZXJhdG9yKG4uX2xvZ1RpY2tHZW5lcmF0b3IpLGU8PTEpdGhyb3cgbmV3IEVycm9yKCJNb2RpZmllZExvZ1NjYWxlOiBUaGUgYmFzZSBtdXN0IGJlID4gMSIpO3JldHVybiBufXJldHVybiBZdnQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX2FkanVzdGVkTG9nPWZ1bmN0aW9uKHQpe3ZhciBlPXQ8MD8tMToxO3JldHVybih0Kj1lKTx0aGlzLl9waXZvdCYmKHQrPSh0aGlzLl9waXZvdC10KS90aGlzLl9waXZvdCksKHQ9TWF0aC5sb2codCkvTWF0aC5sb2codGhpcy5fYmFzZSkpKmV9LGUucHJvdG90eXBlLl9pbnZlcnRlZEFkanVzdGVkTG9nPWZ1bmN0aW9uKHQpe3ZhciBlPXQ8MD8tMToxO3JldHVybiB0Kj1lLCh0PU1hdGgucG93KHRoaXMuX2Jhc2UsdCkpPHRoaXMuX3Bpdm90JiYodD10aGlzLl9waXZvdCoodC0xKS8odGhpcy5fcGl2b3QtMSkpLHQqZX0sZS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUodGhpcy5fYWRqdXN0ZWRMb2codCkpfSxlLnByb3RvdHlwZS5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2ludmVydGVkQWRqdXN0ZWRMb2codGhpcy5fZDNTY2FsZS5pbnZlcnQodCkpfSxlLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNjYWxlKHQpfSxlLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmludmVydCh0KX0sZS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0VW5ib3VuZGVkRXh0ZW50KCEwKX0sZS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21haW4oKX0sZS5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24odCl7dGhpcy5kb21haW4odCl9LGUucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbn0sZS5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihlKXt0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluPWU7dmFyIG49W3RoaXMuX2FkanVzdGVkTG9nKGVbMF0pLHRoaXMuX2FkanVzdGVkTG9nKGVbMV0pXTt0LnByb3RvdHlwZS5fc2V0RG9tYWluLmNhbGwodGhpcyxuKX0sZS5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9kM1NjYWxlLmRvbWFpbigpOih0aGlzLl9kM1NjYWxlLmRvbWFpbih0KSx0aGlzKX0sZS5wcm90b3R5cGUuX2xvZ1RpY2tzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxpPXRoaXMuX2hvd01hbnlUaWNrcyh0LGUpO2lmKDA9PT1pKXJldHVybltdO3ZhciByPU1hdGguZmxvb3IoTWF0aC5sb2codCkvTWF0aC5sb2codGhpcy5fYmFzZSkpLG89TWF0aC5jZWlsKE1hdGgubG9nKGUpL01hdGgubG9nKHRoaXMuX2Jhc2UpKSxhPVh2dC5yYW5nZShvLHIsLU1hdGguY2VpbCgoby1yKS9pKSkscz1YdnQucmFuZ2UodGhpcy5fYmFzZSwxLC0odGhpcy5fYmFzZS0xKSkubWFwKE1hdGguZmxvb3IpLGw9JHZ0LkFycmF5LnVuaXEocyksYz1hLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGwubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5wb3cobi5fYmFzZSx0LTEpKmV9KSl9KSk7cmV0dXJuICR2dC5BcnJheS5mbGF0dGVuKGMpLmZpbHRlcigoZnVuY3Rpb24obil7cmV0dXJuIHQ8PW4mJm48PWV9KSkuc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC1lfSkpfSxlLnByb3RvdHlwZS5faG93TWFueVRpY2tzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fYWRqdXN0ZWRMb2coJHZ0Lk1hdGgubWluKHRoaXMuX3VudHJhbnNmb3JtZWREb21haW4sMCkpLGk9dGhpcy5fYWRqdXN0ZWRMb2coJHZ0Lk1hdGgubWF4KHRoaXMuX3VudHJhbnNmb3JtZWREb21haW4sMCkpLHI9dGhpcy5fYWRqdXN0ZWRMb2codCksbz10aGlzLl9hZGp1c3RlZExvZyhlKTtyZXR1cm4gTWF0aC5jZWlsKChvLXIpLyhpLW4pKkt2dC5Nb2RpZmllZExvZy5fREVGQVVMVF9OVU1fVElDS1MpfSxlLnByb3RvdHlwZS5fbmljZURvbWFpbj1mdW5jdGlvbih0LGUpe3JldHVybiB0fSxlLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3JldHVyblswLHRoaXMuX2Jhc2VdfSxlLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW49ZnVuY3Rpb24odCl7aWYodFswXT09PXRbMV0pe3ZhciBlPXRbMF07cmV0dXJuIGU+MD9bZS90aGlzLl9iYXNlLGUqdGhpcy5fYmFzZV06MD09PWU/Wy10aGlzLl9iYXNlLHRoaXMuX2Jhc2VdOltlKnRoaXMuX2Jhc2UsZS90aGlzLl9iYXNlXX1yZXR1cm4gdH0sZS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUucmFuZ2UoKX0sZS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHQpe3RoaXMuX2QzU2NhbGUucmFuZ2UodCl9LGUucHJvdG90eXBlLmRlZmF1bHRUaWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnRpY2tzKEt2dC5Nb2RpZmllZExvZy5fREVGQVVMVF9OVU1fVElDS1MpfSxlfSkoSXZ0LlF1YW50aXRhdGl2ZVNjYWxlKTtxdnQuTW9kaWZpZWRMb2c9WnZ0O3ZhciBKdnQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KEp2dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFF2dD11Tyx0YnQ9RWR0LGVidD1LeXQsbmJ0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBlLl9kM1NjYWxlPXRidC5zY2FsZVRpbWUoKSxlLmF1dG9Eb21haW4oKSxlfXJldHVybiBRdnQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUudGlja0ludGVydmFsPWZ1bmN0aW9uKHQsbixpKXt2b2lkIDA9PT1uJiYobj0xKSx2b2lkIDA9PT1pJiYoaT0hMSk7dmFyIHI9dGJ0LnNjYWxlVGltZSgpLG89ZS50aW1lSW50ZXJ2YWxUb0QzVGltZSh0LGkpLmV2ZXJ5KG4pO3JldHVybiByLmRvbWFpbih0aGlzLmRvbWFpbigpKSxyLnJhbmdlKHRoaXMucmFuZ2UoKSksci50aWNrcyhvKX0sZS5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihlKXtpZihlWzFdPGVbMF0pdGhyb3cgbmV3IEVycm9yKCJTY2FsZS5UaW1lIGRvbWFpbiB2YWx1ZXMgbXVzdCBiZSBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyIik7cmV0dXJuIHQucHJvdG90eXBlLl9zZXREb21haW4uY2FsbCh0aGlzLGUpfSxlLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3JldHVybltuZXcgRGF0ZSgiMTk3MC0wMS0wMSIpLG5ldyBEYXRlKCIxOTcwLTAxLTAyIildfSxlLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW49ZnVuY3Rpb24odCl7dmFyIGU9dFswXS5nZXRUaW1lKCksbj10WzFdLmdldFRpbWUoKTtpZihlPT09bil7dmFyIGk9bmV3IERhdGUoZSk7aS5zZXREYXRlKGkuZ2V0RGF0ZSgpLTEpO3ZhciByPW5ldyBEYXRlKG4pO3JldHVybiByLnNldERhdGUoci5nZXREYXRlKCkrMSksW2kscl19cmV0dXJuIHR9LGUucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kM1NjYWxlKHQpfSxlLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNjYWxlKG5ldyBEYXRlKHQpKX0sZS5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbnZlcnQodCkuZ2V0VGltZSgpfSxlLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCk7cmV0dXJuW3RbMF0udmFsdWVPZigpLHRbMV0udmFsdWVPZigpXX0sZS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmRvbWFpbigpO3JldHVyblt0WzBdLnZhbHVlT2YoKSx0WzFdLnZhbHVlT2YoKV19LGUucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKHQpe3ZhciBlPXRbMV07dGhpcy5kb21haW4oW25ldyBEYXRlKHRbMF0pLG5ldyBEYXRlKGUpXSl9LGUucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCl9LGUucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZDNTY2FsZS5kb21haW4oKToodGhpcy5fZDNTY2FsZS5kb21haW4odCksdGhpcyl9LGUucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnJhbmdlKCl9LGUucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbih0KXt0aGlzLl9kM1NjYWxlLnJhbmdlKHQpfSxlLnByb3RvdHlwZS5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUuaW52ZXJ0KHQpfSxlLnByb3RvdHlwZS5kZWZhdWx0VGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS50aWNrcyhlLl9ERUZBVUxUX05VTV9USUNLUyl9LGUucHJvdG90eXBlLl9uaWNlRG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kM1NjYWxlLmNvcHkoKS5kb21haW4odCkubmljZSgpLmRvbWFpbigpfSxlLnRpbWVJbnRlcnZhbFRvRDNUaW1lPWZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQpe2Nhc2UgZWJ0LlRpbWVJbnRlcnZhbC5zZWNvbmQ6cmV0dXJuIGU/dGJ0LnV0Y1NlY29uZDp0YnQudGltZVNlY29uZDtjYXNlIGVidC5UaW1lSW50ZXJ2YWwubWludXRlOnJldHVybiBlP3RidC51dGNNaW51dGU6dGJ0LnRpbWVNaW51dGU7Y2FzZSBlYnQuVGltZUludGVydmFsLmhvdXI6cmV0dXJuIGU/dGJ0LnV0Y0hvdXI6dGJ0LnRpbWVIb3VyO2Nhc2UgZWJ0LlRpbWVJbnRlcnZhbC5kYXk6cmV0dXJuIGU/dGJ0LnV0Y0RheTp0YnQudGltZURheTtjYXNlIGVidC5UaW1lSW50ZXJ2YWwud2VlazpyZXR1cm4gZT90YnQudXRjV2Vlazp0YnQudGltZVdlZWs7Y2FzZSBlYnQuVGltZUludGVydmFsLm1vbnRoOnJldHVybiBlP3RidC51dGNNb250aDp0YnQudGltZU1vbnRoO2Nhc2UgZWJ0LlRpbWVJbnRlcnZhbC55ZWFyOnJldHVybiBlP3RidC51dGNZZWFyOnRidC50aW1lWWVhcjtkZWZhdWx0OnRocm93IEVycm9yKCJUaW1lSW50ZXJ2YWwgc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0OiAiK3QpfX0sZX0pKEl2dC5RdWFudGl0YXRpdmVTY2FsZSk7SnZ0LlRpbWU9bmJ0LChmdW5jdGlvbih0KXsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBlPXVPO3QuVGlja0dlbmVyYXRvcnM9Snl0LGUuX19leHBvcnRTdGFyKG52dCx0KSxlLl9fZXhwb3J0U3RhcihidnQsdCksZS5fX2V4cG9ydFN0YXIoQ3Z0LHQpLGUuX19leHBvcnRTdGFyKE52dCx0KSxlLl9fZXhwb3J0U3RhcihVdnQsdCksZS5fX2V4cG9ydFN0YXIocXZ0LHQpLGUuX19leHBvcnRTdGFyKEp2dCx0KTt2YXIgbj1udnQsaT1JdnQ7dC5pc1RyYW5zZm9ybWFibGU9ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGkuUXVhbnRpdGF0aXZlU2NhbGV8fHQgaW5zdGFuY2VvZiBuLkNhdGVnb3J5fX0pKFp5dCksKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9dU8sbj1FZHQsaT1JbXQscj1neXQsbz1aeXQsYT1GZ3Qscz1TbXQsbD1teXQ7dC5UaW1lSW50ZXJ2YWw9cy5tYWtlRW51bShbInNlY29uZCIsIm1pbnV0ZSIsImhvdXIiLCJkYXkiLCJ3ZWVrIiwibW9udGgiLCJ5ZWFyIl0pLHQuVGltZUF4aXNPcmllbnRhdGlvbj1zLm1ha2VFbnVtKFsidG9wIiwiYm90dG9tIl0pLHQuVGllckxhYmVsUG9zaXRpb249cy5tYWtlRW51bShbImJldHdlZW4iLCJjZW50ZXIiXSk7dmFyIGMsdT0oZnVuY3Rpb24ocyl7ZnVuY3Rpb24gdSh0LGUsbil7dmFyIGk9cy5jYWxsKHRoaXMsdCxlKXx8dGhpcztyZXR1cm4gaS5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uPW51bGwsaS5fdGllckxhYmVsUG9zaXRpb25zPVtdLGkuX3VzZVVUQz1uLGkuYWRkQ2xhc3MoInRpbWUtYXhpcyIpLGkudGlja0xhYmVsUGFkZGluZyg1KSxpLmF4aXNDb25maWd1cmF0aW9ucyh1Ll9ERUZBVUxUX1RJTUVfQVhJU19DT05GSUdVUkFUSU9OUyhpLl91c2VVVEMpKSxpLmFubm90YXRpb25Gb3JtYXR0ZXIoci50aW1lKCIlYSAlYiAlZCwgJVkiLGkuX3VzZVVUQykpLGl9cmV0dXJuIGUuX19leHRlbmRzKHUscyksdS5wcm90b3R5cGUudGllckxhYmVsUG9zaXRpb25zPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3RpZXJMYWJlbFBvc2l0aW9ucztpZighdC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuImJldHdlZW4iPT09dC50b0xvd2VyQ2FzZSgpfHwiY2VudGVyIj09PXQudG9Mb3dlckNhc2UoKX0pKSl0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIHBvc2l0aW9uIGZvciB0aWVyIGxhYmVscyIpO3JldHVybiB0aGlzLl90aWVyTGFiZWxQb3NpdGlvbnM9dCx0aGlzLnJlZHJhdygpLHRoaXN9LHUucHJvdG90eXBlLm1heFRpbWVJbnRlcnZhbFByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb246KHRoaXMuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbj10LHRoaXMucmVkcmF3KCksdGhpcyl9LHUucHJvdG90eXBlLmN1cnJlbnRBeGlzQ29uZmlndXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnNbdGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleF19LHUucHJvdG90eXBlLmF4aXNDb25maWd1cmF0aW9ucz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnM7dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zPXQsdGhpcy5fbnVtVGllcnM9YS5NYXRoLm1heCh0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5sZW5ndGh9KSksMCksdGhpcy5faXNBbmNob3JlZCYmdGhpcy5fc2V0dXBEb21FbGVtZW50cygpO2Zvcih2YXIgZT10aGlzLnRpZXJMYWJlbFBvc2l0aW9ucygpLG49W10saT0wO2k8dGhpcy5fbnVtVGllcnM7aSsrKW4ucHVzaChlW2ldfHwiYmV0d2VlbiIpO3JldHVybiB0aGlzLnRpZXJMYWJlbFBvc2l0aW9ucyhuKSx0aGlzLnJlZHJhdygpLHRoaXN9LHUucHJvdG90eXBlLl9nZXRNb3N0UHJlY2lzZUNvbmZpZ3VyYXRpb25JbmRleD1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMubGVuZ3RoO3JldHVybiB0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMuZm9yRWFjaCgoZnVuY3Rpb24obixpKXtpPGUmJm4uZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiB0Ll9jaGVja1RpbWVBeGlzVGllckNvbmZpZ3VyYXRpb24oZSl9KSkmJihlPWkpfSkpLGU9PT10aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMubGVuZ3RoJiYoYS5XaW5kb3cud2Fybigiem9vbWVkIG91dCB0b28gZmFyOiBjb3VsZCBub3QgZmluZCBzdWl0YWJsZSBpbnRlcnZhbCB0byBkaXNwbGF5IGxhYmVscyIpLC0tZSksZX0sdS5wcm90b3R5cGUub3JpZW50YXRpb249ZnVuY3Rpb24odCl7aWYodCYmKCJyaWdodCI9PT10LnRvTG93ZXJDYXNlKCl8fCJsZWZ0Ij09PXQudG9Mb3dlckNhc2UoKSkpdGhyb3cgbmV3IEVycm9yKHQrIiBpcyBub3QgYSBzdXBwb3J0ZWQgb3JpZW50YXRpb24gZm9yIFRpbWVBeGlzIC0gb25seSBob3Jpem9udGFsIG9yaWVudGF0aW9ucyBhcmUgc3VwcG9ydGVkIik7cmV0dXJuIHMucHJvdG90eXBlLm9yaWVudGF0aW9uLmNhbGwodGhpcyx0KX0sdS5wcm90b3R5cGUuX2NvbXB1dGVIZWlnaHQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0O3RoaXMuX3RpZXJIZWlnaHRzPVtdO2Zvcih2YXIgZT0wO2U8dGhpcy5fbnVtVGllcnM7ZSsrKXRoaXMuX3RpZXJIZWlnaHRzLnB1c2godCt0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSsoImJldHdlZW4iPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW2VdPzA6dGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkpKTtyZXR1cm4gbi5zdW0odGhpcy5fdGllckhlaWdodHMpfSx1LnByb3RvdHlwZS5fZ2V0SW50ZXJ2YWxMZW5ndGg9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fc2NhbGUuZG9tYWluKClbMF0sbj1vLlRpbWUudGltZUludGVydmFsVG9EM1RpbWUodC5pbnRlcnZhbCx0aGlzLl91c2VVVEMpLm9mZnNldChlLHQuc3RlcCk7cmV0dXJuIG4+dGhpcy5fc2NhbGUuZG9tYWluKClbMV0/dGhpcy53aWR0aCgpOk1hdGguYWJzKHRoaXMuX3NjYWxlLnNjYWxlKG4pLXRoaXMuX3NjYWxlLnNjYWxlKGUpKX0sdS5wcm90b3R5cGUuX21heFdpZHRoRm9ySW50ZXJ2YWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX21lYXN1cmVyLm1lYXN1cmUodC5mb3JtYXR0ZXIodS5fTE9OR19EQVRFKSkud2lkdGh9LHUucHJvdG90eXBlLl9jaGVja1RpbWVBeGlzVGllckNvbmZpZ3VyYXRpb249ZnVuY3Rpb24odCl7aWYobnVsbCE9dGhpcy5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uKXt2YXIgZT11Ll9TT1JURURfVElNRV9JTlRFUlZBTF9JTkRFWFt0aGlzLl9tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb25dLG49dS5fU09SVEVEX1RJTUVfSU5URVJWQUxfSU5ERVhbdC5pbnRlcnZhbF07aWYobnVsbCE9ZSYmbnVsbCE9biYmbjxlKXJldHVybiExfXZhciBpPXRoaXMuX21heFdpZHRoRm9ySW50ZXJ2YWwodCkrMip0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTtyZXR1cm4gTWF0aC5taW4odGhpcy5fZ2V0SW50ZXJ2YWxMZW5ndGgodCksdGhpcy53aWR0aCgpKT49aX0sdS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24odCxlKXt2YXIgbj1zLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlci5jYWxsKHRoaXMsdCxlKSxpPXRoaXMuX3RpZXJIZWlnaHRzLnJlZHVjZSgoZnVuY3Rpb24odCxlLGkscil7cmV0dXJuIHQrZT5uLmhlaWdodD90OnQrZX0pKSxyPXRoaXMubWFyZ2luKCkrKHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCk/dGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCkqdGhpcy5fYW5ub3RhdGlvblRpZXJIZWlnaHQoKTowKTtyZXR1cm4gbi5oZWlnaHQ9TWF0aC5taW4obi5oZWlnaHQsaStyKSxufSx1LnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtzLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKSx0aGlzLl9zZXR1cERvbUVsZW1lbnRzKCl9LHUucHJvdG90eXBlLl9zZXR1cERvbUVsZW1lbnRzPWZ1bmN0aW9uKCl7dGhpcy5jb250ZW50KCkuc2VsZWN0QWxsKCIuIit1LlRJTUVfQVhJU19USUVSX0NMQVNTKS5yZW1vdmUoKSx0aGlzLl90aWVyTGFiZWxDb250YWluZXJzPVtdLHRoaXMuX3RpZXJNYXJrQ29udGFpbmVycz1bXSx0aGlzLl90aWVyQmFzZWxpbmVzPVtdLHRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5yZW1vdmUoKSx0aGlzLl9iYXNlbGluZS5yZW1vdmUoKTtmb3IodmFyIHQ9MDt0PHRoaXMuX251bVRpZXJzOysrdCl7dmFyIGU9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCh1LlRJTUVfQVhJU19USUVSX0NMQVNTLCEwKTt0aGlzLl90aWVyTGFiZWxDb250YWluZXJzLnB1c2goZS5hcHBlbmQoImciKS5jbGFzc2VkKGwuQXhpcy5USUNLX0xBQkVMX0NMQVNTKyItY29udGFpbmVyIiwhMCkpLHRoaXMuX3RpZXJNYXJrQ29udGFpbmVycy5wdXNoKGUuYXBwZW5kKCJnIikuY2xhc3NlZChsLkF4aXMuVElDS19NQVJLX0NMQVNTKyItY29udGFpbmVyIiwhMCkpLHRoaXMuX3RpZXJCYXNlbGluZXMucHVzaChlLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImJhc2VsaW5lIiwhMCkpfXZhciBuPW5ldyBpLlN2Z0NvbnRleHQodGhpcy5fdGllckxhYmVsQ29udGFpbmVyc1swXS5ub2RlKCkpO3RoaXMuX21lYXN1cmVyPW5ldyBpLkNhY2hlTWVhc3VyZXIobil9LHUucHJvdG90eXBlLl9nZXRUaWNrSW50ZXJ2YWxWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3NjYWxlLnRpY2tJbnRlcnZhbCh0LmludGVydmFsLHQuc3RlcCx0aGlzLl91c2VVVEMpfSx1LnByb3RvdHlwZS5fZ2V0VGlja1ZhbHVlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9uc1t0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4XS5yZWR1Y2UoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGUuY29uY2F0KHQuX2dldFRpY2tJbnRlcnZhbFZhbHVlcyhuKSl9KSxbXSl9LHUucHJvdG90eXBlLl9jbGVhblRpZXJzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLl90aWVyTGFiZWxDb250YWluZXJzLmxlbmd0aDt0KyspdGhpcy5fdGllckxhYmVsQ29udGFpbmVyc1t0XS5zZWxlY3RBbGwoIi4iK2wuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5yZW1vdmUoKSx0aGlzLl90aWVyTWFya0NvbnRhaW5lcnNbdF0uc2VsZWN0QWxsKCIuIitsLkF4aXMuVElDS19NQVJLX0NMQVNTKS5yZW1vdmUoKSx0aGlzLl90aWVyQmFzZWxpbmVzW3RdLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9LHUucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzRm9yQ29uZmlndXJhdGlvbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9zY2FsZS50aWNrSW50ZXJ2YWwodC5pbnRlcnZhbCx0LnN0ZXAsdGhpcy5fdXNlVVRDKSxuPXRoaXMuX3NjYWxlLmRvbWFpbigpLGk9ZS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnZhbHVlT2YoKX0pKTtyZXR1cm4tMT09PWkuaW5kZXhPZihuWzBdLnZhbHVlT2YoKSkmJmUudW5zaGlmdChuWzBdKSwtMT09PWkuaW5kZXhPZihuWzFdLnZhbHVlT2YoKSkmJmUucHVzaChuWzFdKSxlfSx1LnByb3RvdHlwZS5fcmVuZGVyVGllckxhYmVscz1mdW5jdGlvbih0LGUsaSl7dmFyIHI9dGhpcyxvPXRoaXMuX2dldFRpY2tWYWx1ZXNGb3JDb25maWd1cmF0aW9uKGUpLGE9W107ImJldHdlZW4iPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW2ldJiYxPT09ZS5zdGVwP28ubWFwKChmdW5jdGlvbih0LGUpe2UrMT49by5sZW5ndGh8fGEucHVzaChuZXcgRGF0ZSgob1tlKzFdLnZhbHVlT2YoKS1vW2VdLnZhbHVlT2YoKSkvMitvW2VdLnZhbHVlT2YoKSkpfSkpOmE9bzt2YXIgcz10LnNlbGVjdEFsbCgiLiIrbC5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmRhdGEoYSwoZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0LnZhbHVlT2YoKSl9KSksYz1zLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZChsLkF4aXMuVElDS19MQUJFTF9DTEFTUywhMCk7Yy5hcHBlbmQoInRleHQiKTt2YXIgdSxoPSJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW2ldfHwxPT09ZS5zdGVwPzA6dGhpcy50aWNrTGFiZWxQYWRkaW5nKCk7dT0iYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT9uLnN1bSh0aGlzLl90aWVySGVpZ2h0cy5zbGljZSgwLGkrMSkpLXRoaXMudGlja0xhYmVsUGFkZGluZygpOiJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW2ldP3RoaXMuaGVpZ2h0KCktbi5zdW0odGhpcy5fdGllckhlaWdodHMuc2xpY2UoMCxpKSktdGhpcy50aWNrTGFiZWxQYWRkaW5nKCktdGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCk6dGhpcy5oZWlnaHQoKS1uLnN1bSh0aGlzLl90aWVySGVpZ2h0cy5zbGljZSgwLGkpKS10aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTt2YXIgZD1zLm1lcmdlKGMpLHA9ZC5zZWxlY3RBbGwoInRleHQiKTtwLnNpemUoKT4wJiZwLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2grIiwiK3UrIikiKSxzLmV4aXQoKS5yZW1vdmUoKSxkLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3JldHVybiJ0cmFuc2xhdGUoIityLl9zY2FsZS5zY2FsZSh0KSsiLDApIn0pKTt2YXIgZj0iY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tpXXx8MT09PWUuc3RlcD8ibWlkZGxlIjoic3RhcnQiO2Quc2VsZWN0QWxsKCJ0ZXh0IikudGV4dChlLmZvcm1hdHRlcikuc3R5bGUoInRleHQtYW5jaG9yIixmKX0sdS5wcm90b3R5cGUuX3JlbmRlclRpY2tNYXJrcz1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX3RpZXJNYXJrQ29udGFpbmVyc1tlXS5zZWxlY3RBbGwoIi4iK2wuQXhpcy5USUNLX01BUktfQ0xBU1MpLmRhdGEodCkscj1pLmVudGVyKCkuYXBwZW5kKCJsaW5lIikuY2xhc3NlZChsLkF4aXMuVElDS19NQVJLX0NMQVNTLCEwKS5tZXJnZShpKSxvPXRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCgpLGE9dGhpcy5fdGllckhlaWdodHMuc2xpY2UoMCxlKS5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZX0pLDApOyJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpPyhvLnkxPWEsby55Mj1hKygiY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tlXT90aGlzLmlubmVyVGlja0xlbmd0aCgpOnRoaXMuX3RpZXJIZWlnaHRzW2VdKSk6KG8ueTE9dGhpcy5oZWlnaHQoKS1hLG8ueTI9dGhpcy5oZWlnaHQoKS0oYSsoImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbZV0/dGhpcy5pbm5lclRpY2tMZW5ndGgoKTp0aGlzLl90aWVySGVpZ2h0c1tlXSkpKSxyLmF0dHJzKG8pLCJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpPyhvLnkxPWEsby55Mj1hKygiY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tlXT90aGlzLmVuZFRpY2tMZW5ndGgoKTp0aGlzLl90aWVySGVpZ2h0c1tlXSkpOihvLnkxPXRoaXMuaGVpZ2h0KCktYSxvLnkyPXRoaXMuaGVpZ2h0KCktKGErKCJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW2VdP3RoaXMuZW5kVGlja0xlbmd0aCgpOnRoaXMuX3RpZXJIZWlnaHRzW2VdKSkpLG4uc2VsZWN0KHIubm9kZXMoKVswXSkuYXR0cnMobyksbi5zZWxlY3Qoci5ub2RlcygpW3Iuc2l6ZSgpLTFdKS5hdHRycyhvKSxuLnNlbGVjdChyLm5vZGVzKClbMF0pLmNsYXNzZWQobC5BeGlzLkVORF9USUNLX01BUktfQ0xBU1MsITApLG4uc2VsZWN0KHIubm9kZXMoKVtyLnNpemUoKS0xXSkuY2xhc3NlZChsLkF4aXMuRU5EX1RJQ0tfTUFSS19DTEFTUywhMCksaS5leGl0KCkucmVtb3ZlKCl9LHUucHJvdG90eXBlLl9yZW5kZXJMYWJlbGxlc3NUaWNrTWFya3M9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdGlja01hcmtDb250YWluZXIuc2VsZWN0QWxsKCIuIitsLkF4aXMuVElDS19NQVJLX0NMQVNTKS5kYXRhKHQpLG49ZS5lbnRlcigpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQobC5BeGlzLlRJQ0tfTUFSS19DTEFTUywhMCkubWVyZ2UoZSksaT10aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goKTtpLnkyPSJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpP3RoaXMudGlja0xhYmVsUGFkZGluZygpOnRoaXMuaGVpZ2h0KCktdGhpcy50aWNrTGFiZWxQYWRkaW5nKCksbi5hdHRycyhpKSxlLmV4aXQoKS5yZW1vdmUoKX0sdS5wcm90b3R5cGUuX2dlbmVyYXRlTGFiZWxsZXNzVGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleDwxP1tdOnRoaXMuX2dldFRpY2tJbnRlcnZhbFZhbHVlcyh0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnNbdGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleC0xXVswXSl9LHUucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4PXRoaXMuX2dldE1vc3RQcmVjaXNlQ29uZmlndXJhdGlvbkluZGV4KCk7dmFyIGU9dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zW3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXhdO3RoaXMuX2NsZWFuVGllcnMoKSxlLmZvckVhY2goKGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuX3JlbmRlclRpZXJMYWJlbHModC5fdGllckxhYmVsQ29udGFpbmVyc1tuXSxlLG4pfSkpO2Zvcih2YXIgbj1lLm1hcCgoZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5fZ2V0VGlja1ZhbHVlc0ZvckNvbmZpZ3VyYXRpb24oZSl9KSksaT0wLHI9MDtyPE1hdGgubWF4KGUubGVuZ3RoLDEpOysrcil7dmFyIG89dGhpcy5fZ2VuZXJhdGVCYXNlbGluZUF0dHJIYXNoKCk7by55MSs9ImJvdHRvbSI9PT10aGlzLm9yaWVudGF0aW9uKCk/aTotaSxvLnkyPW8ueTEsdGhpcy5fdGllckJhc2VsaW5lc1tyXS5hdHRycyhvKS5zdHlsZSgidmlzaWJpbGl0eSIsImluaGVyaXQiKSxpKz10aGlzLl90aWVySGVpZ2h0c1tyXX12YXIgYT1bXSxzPXRoaXMuX3NjYWxlLmRvbWFpbigpLGw9dGhpcy5fc2NhbGUuc2NhbGUoc1sxXSktdGhpcy5fc2NhbGUuc2NhbGUoc1swXSk7Zm9yKDEuNSp0aGlzLl9nZXRJbnRlcnZhbExlbmd0aChlWzBdKT49bCYmKGE9dGhpcy5fZ2VuZXJhdGVMYWJlbGxlc3NUaWNrcygpKSx0aGlzLl9yZW5kZXJMYWJlbGxlc3NUaWNrTWFya3MoYSksdGhpcy5faGlkZU92ZXJmbG93aW5nVGllcnMoKSxyPTA7cjxlLmxlbmd0aDsrK3IpdGhpcy5fcmVuZGVyVGlja01hcmtzKG5bcl0sciksdGhpcy5faGlkZU92ZXJsYXBwaW5nQW5kQ3V0T2ZmTGFiZWxzKHIpO3JldHVybiB0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpP3RoaXMuX2RyYXdBbm5vdGF0aW9ucygpOnRoaXMuX3JlbW92ZUFubm90YXRpb25zKCksdGhpc30sdS5wcm90b3R5cGUuX2hpZGVPdmVyZmxvd2luZ1RpZXJzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuaGVpZ2h0KCksbj0wO3RoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiLiIrdS5USU1FX0FYSVNfVElFUl9DTEFTUykuYXR0cigidmlzaWJpbGl0eSIsKGZ1bmN0aW9uKGkscil7cmV0dXJuKG4rPXQuX3RpZXJIZWlnaHRzW3JdKTw9ZT8iaW5oZXJpdCI6ImhpZGRlbiJ9KSl9LHUucHJvdG90eXBlLl9oaWRlT3ZlcmxhcHBpbmdBbmRDdXRPZmZMYWJlbHM9ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzLHI9dGhpcy5lbGVtZW50KCkubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG89dGhpcy5fdGllck1hcmtDb250YWluZXJzW3RdLnNlbGVjdEFsbCgiLiIrbC5BeGlzLlRJQ0tfTUFSS19DTEFTUykuZmlsdGVyKChmdW5jdGlvbih0LGUpe3ZhciBpPW4uc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5Iik7cmV0dXJuInZpc2libGUiPT09aXx8ImluaGVyaXQiPT09aX0pKS5ub2RlcygpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9KSk7dGhpcy5fdGllckxhYmVsQ29udGFpbmVyc1t0XS5zZWxlY3RBbGwoIi4iK2wuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5maWx0ZXIoKGZ1bmN0aW9uKHQsZSl7dmFyIGk9bi5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiKTtyZXR1cm4idmlzaWJsZSI9PT1pfHwiaW5oZXJpdCI9PT1pfSkpLmVhY2goKGZ1bmN0aW9uKHQscyl7dmFyIGwsYz10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHU9bi5zZWxlY3QodGhpcyksaD1vW3NdLGQ9b1tzKzFdLHA9bnVsbCE9ZSYmYS5ET00uY2xpZW50UmVjdHNPdmVybGFwKGMsZSksZj1udWxsIT1oJiZhLkRPTS5jbGllbnRSZWN0c092ZXJsYXAoYyxoKSxtPW51bGwhPWQmJmEuRE9NLmNsaWVudFJlY3RzT3ZlcmxhcChjLGQpO2w9YywhKE1hdGguZmxvb3Ioci5sZWZ0KTw9TWF0aC5jZWlsKGwubGVmdCkmJk1hdGguZmxvb3Ioci50b3ApPD1NYXRoLmNlaWwobC50b3ApJiZNYXRoLmZsb29yKGwucmlnaHQpPD1NYXRoLmNlaWwoci5sZWZ0K2kud2lkdGgoKSkmJk1hdGguZmxvb3IobC5ib3R0b20pPD1NYXRoLmNlaWwoci50b3AraS5oZWlnaHQoKSkpfHxwfHxmfHxtP3Uuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKTooZT1jLHUuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0IikpfSkpfSx1LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtzLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKSx0aGlzLl9tZWFzdXJlci5yZXNldCgpfSx1LlRJTUVfQVhJU19USUVSX0NMQVNTPSJ0aW1lLWF4aXMtdGllciIsdS5fU09SVEVEX1RJTUVfSU5URVJWQUxfSU5ERVg9KChjPXt9KVt0LlRpbWVJbnRlcnZhbC5zZWNvbmRdPTAsY1t0LlRpbWVJbnRlcnZhbC5taW51dGVdPTEsY1t0LlRpbWVJbnRlcnZhbC5ob3VyXT0yLGNbdC5UaW1lSW50ZXJ2YWwuZGF5XT0zLGNbdC5UaW1lSW50ZXJ2YWwud2Vla109NCxjW3QuVGltZUludGVydmFsLm1vbnRoXT01LGNbdC5UaW1lSW50ZXJ2YWwueWVhcl09NixjKSx1Ll9ERUZBVUxUX1RJTUVfQVhJU19DT05GSUdVUkFUSU9OUz1mdW5jdGlvbihlKXt2YXIgbj1mdW5jdGlvbih0KXtyZXR1cm4gci50aW1lKHQsZSl9O3JldHVybltbe2ludGVydmFsOnQuVGltZUludGVydmFsLnNlY29uZCxzdGVwOjEsZm9ybWF0dGVyOm4oIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuc2Vjb25kLHN0ZXA6NSxmb3JtYXR0ZXI6bigiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOnQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm4oIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDoxMCxmb3JtYXR0ZXI6bigiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOnQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm4oIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDoxNSxmb3JtYXR0ZXI6bigiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOnQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm4oIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDozMCxmb3JtYXR0ZXI6bigiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOnQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm4oIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5taW51dGUsc3RlcDoxLGZvcm1hdHRlcjpuKCIlSTolTSAlcCIpfSx7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bigiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLm1pbnV0ZSxzdGVwOjUsZm9ybWF0dGVyOm4oIiVJOiVNICVwIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6MTAsZm9ybWF0dGVyOm4oIiVJOiVNICVwIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6MTUsZm9ybWF0dGVyOm4oIiVJOiVNICVwIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6MzAsZm9ybWF0dGVyOm4oIiVJOiVNICVwIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuaG91cixzdGVwOjEsZm9ybWF0dGVyOm4oIiVJICVwIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuaG91cixzdGVwOjMsZm9ybWF0dGVyOm4oIiVJICVwIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuaG91cixzdGVwOjYsZm9ybWF0dGVyOm4oIiVJICVwIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuaG91cixzdGVwOjEyLGZvcm1hdHRlcjpuKCIlSSAlcCIpfSx7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bigiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm4oIiVhICVlIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjEsZm9ybWF0dGVyOm4oIiVCICVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm4oIiVlIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjEsZm9ybWF0dGVyOm4oIiVCICVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6MSxmb3JtYXR0ZXI6bigiJUIiKX0se2ludGVydmFsOnQuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpuKCIlWSIpfV0sW3tpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjEsZm9ybWF0dGVyOm4oIiViIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6bigiJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDozLGZvcm1hdHRlcjpuKCIlYiIpfSx7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOm4oIiVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6Nixmb3JtYXR0ZXI6bigiJWIiKX0se2ludGVydmFsOnQuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpuKCIlWSIpfV0sW3tpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6bigiJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOm4oIiV5Iil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLnllYXIsc3RlcDo1LGZvcm1hdHRlcjpuKCIlWSIpfV0sW3tpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MjUsZm9ybWF0dGVyOm4oIiVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLnllYXIsc3RlcDo1MCxmb3JtYXR0ZXI6bigiJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEwMCxmb3JtYXR0ZXI6bigiJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjIwMCxmb3JtYXR0ZXI6bigiJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjUwMCxmb3JtYXR0ZXI6bigiJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjFlMyxmb3JtYXR0ZXI6bigiJVkiKX1dXX0sdS5fTE9OR19EQVRFPW5ldyBEYXRlKDk5OTksOCwyOSwxMiw1OSw5OTk5KSx1fSkobC5BeGlzKTt0LlRpbWU9dX0pKEt5dCksKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9dU87ZS5fX2V4cG9ydFN0YXIoTm10LHQpLGUuX19leHBvcnRTdGFyKFV5dCx0KSxlLl9fZXhwb3J0U3RhcihLeXQsdCl9KShQbXQpO3ZhciBpYnQ9e30scmJ0PXt9LG9idD17fSxhYnQ9e30sc2J0PXt9LGxidD17fSxjYnQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShjYnQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB1YnQ9Rmd0LGhidD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbj17fSx0aGlzLl9ldmVudFRhcmdldD1kb2N1bWVudCx0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0PXt9LHRoaXMuX2Nvbm5lY3RlZD0hMX1yZXR1cm4gdC5wcm90b3R5cGUuX2hhc05vQ2FsbGJhY2tzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PU9iamVjdC5rZXlzKHRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXQpLGU9MDtlPHQubGVuZ3RoO2UrKylpZigwIT09dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFt0W2VdXS5zaXplKXJldHVybiExO3JldHVybiEwfSx0LnByb3RvdHlwZS5fY29ubmVjdD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fY29ubmVjdGVkfHwoT2JqZWN0LmtleXModGhpcy5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbikuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5fZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihlLHQuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bZV0sIndoZWVsIj09PWU/e3Bhc3NpdmU6ITF9OnZvaWQgMCl9KSksdGhpcy5fY29ubmVjdGVkPSEwKX0sdC5wcm90b3R5cGUuX2Rpc2Nvbm5lY3Q9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX2Nvbm5lY3RlZCYmdGhpcy5faGFzTm9DYWxsYmFja3MoKSYmKE9iamVjdC5rZXlzKHRoaXMuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb24pLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuX2V2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0Ll9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW2VdKX0pKSx0aGlzLl9jb25uZWN0ZWQ9ITEpfSx0LnByb3RvdHlwZS5fYWRkQ2FsbGJhY2tGb3JFdmVudD1mdW5jdGlvbih0LGUpe251bGw9PXRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRbdF0mJih0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W3RdPW5ldyB1YnQuQ2FsbGJhY2tTZXQpLHRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRbdF0uYWRkKGUpLHRoaXMuX2Nvbm5lY3QoKX0sdC5wcm90b3R5cGUuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQ9ZnVuY3Rpb24odCxlKXtudWxsIT10aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W3RdJiZ0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W3RdLmRlbGV0ZShlKSx0aGlzLl9kaXNjb25uZWN0KCl9LHQucHJvdG90eXBlLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWVbbi0xXT1hcmd1bWVudHNbbl07dmFyIGk9dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFt0XTtudWxsIT1pJiZpLmNhbGxDYWxsYmFja3MuYXBwbHkoaSxlKX0sdH0pKCk7Y2J0LkRpc3BhdGNoZXI9aGJ0LAovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkobGJ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZGJ0PXVPLHBidD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gbi5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltlLl9LRVlET1dOX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHQpe3JldHVybiBuLl9wcm9jZXNzS2V5ZG93bih0KX0sbi5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltlLl9LRVlVUF9FVkVOVF9OQU1FXT1mdW5jdGlvbih0KXtyZXR1cm4gbi5fcHJvY2Vzc0tleXVwKHQpfSxufXJldHVybiBkYnQuX19leHRlbmRzKGUsdCksZS5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnRbZS5fRElTUEFUQ0hFUl9LRVldO3JldHVybiBudWxsPT10JiYodD1uZXcgZSxkb2N1bWVudFtlLl9ESVNQQVRDSEVSX0tFWV09dCksdH0sZS5wcm90b3R5cGUuX3Byb2Nlc3NLZXlkb3duPWZ1bmN0aW9uKHQpe3RoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChlLl9LRVlET1dOX0VWRU5UX05BTUUsdC5rZXlDb2RlLHQpfSxlLnByb3RvdHlwZS5fcHJvY2Vzc0tleXVwPWZ1bmN0aW9uKHQpe3RoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChlLl9LRVlVUF9FVkVOVF9OQU1FLHQua2V5Q29kZSx0KX0sZS5wcm90b3R5cGUub25LZXlEb3duPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGUuX0tFWURPV05fRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZLZXlEb3duPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KGUuX0tFWURPV05fRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5vbktleVVwPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGUuX0tFWVVQX0VWRU5UX05BTUUsdCksdGhpc30sZS5wcm90b3R5cGUub2ZmS2V5VXA9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQoZS5fS0VZVVBfRVZFTlRfTkFNRSx0KSx0aGlzfSxlLl9ESVNQQVRDSEVSX0tFWT0iX19QbG90dGFibGVfRGlzcGF0Y2hlcl9LZXkiLGUuX0tFWURPV05fRVZFTlRfTkFNRT0ia2V5ZG93biIsZS5fS0VZVVBfRVZFTlRfTkFNRT0ia2V5dXAiLGV9KShjYnQuRGlzcGF0Y2hlcik7bGJ0LktleT1wYnQ7dmFyIGZidD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoZmJ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbWJ0PXVPLGdidD1GZ3QsX2J0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciBpPXQuY2FsbCh0aGlzKXx8dGhpcztpLl9sYXN0TW91c2VQb3NpdGlvbj17eDotMSx5Oi0xfSxpLl90cmFuc2xhdG9yPWdidC5nZXRUcmFuc2xhdG9yKG4pO3ZhciByPWZ1bmN0aW9uKHQpe3JldHVybiBpLl9tZWFzdXJlQW5kRGlzcGF0Y2gobix0LGUuX01PVVNFTU9WRV9FVkVOVF9OQU1FLCJwYWdlIil9O3JldHVybiBpLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW2UuX01PVVNFT1ZFUl9FVkVOVF9OQU1FXT1yLGkuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bZS5fTU9VU0VNT1ZFX0VWRU5UX05BTUVdPXIsaS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltlLl9NT1VTRU9VVF9FVkVOVF9OQU1FXT1yLGkuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bZS5fTU9VU0VET1dOX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHQpe3JldHVybiBpLl9tZWFzdXJlQW5kRGlzcGF0Y2gobix0LGUuX01PVVNFRE9XTl9FVkVOVF9OQU1FKX0saS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltlLl9NT1VTRVVQX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHQpe3JldHVybiBpLl9tZWFzdXJlQW5kRGlzcGF0Y2gobix0LGUuX01PVVNFVVBfRVZFTlRfTkFNRSwicGFnZSIpfSxpLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW2UuX1dIRUVMX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHQpe3JldHVybiBpLl9tZWFzdXJlQW5kRGlzcGF0Y2gobix0LGUuX1dIRUVMX0VWRU5UX05BTUUpfSxpLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW2UuX0RCTENMSUNLX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHQpe3JldHVybiBpLl9tZWFzdXJlQW5kRGlzcGF0Y2gobix0LGUuX0RCTENMSUNLX0VWRU5UX05BTUUpfSxpfXJldHVybiBtYnQuX19leHRlbmRzKGUsdCksZS5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKHQpe3ZhciBuPXQucm9vdCgpLnJvb3RFbGVtZW50KCksaT1uW2UuX0RJU1BBVENIRVJfS0VZXTtyZXR1cm4gbnVsbD09aSYmKGk9bmV3IGUodCksbltlLl9ESVNQQVRDSEVSX0tFWV09aSksaX0sZS5wcm90b3R5cGUub25Nb3VzZU1vdmU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQoZS5fTU9VU0VNT1ZFX0VWRU5UX05BTUUsdCksdGhpc30sZS5wcm90b3R5cGUub2ZmTW91c2VNb3ZlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KGUuX01PVVNFTU9WRV9FVkVOVF9OQU1FLHQpLHRoaXN9LGUucHJvdG90eXBlLm9uTW91c2VEb3duPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGUuX01PVVNFRE9XTl9FVkVOVF9OQU1FLHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZk1vdXNlRG93bj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChlLl9NT1VTRURPV05fRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5vbk1vdXNlVXA9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQoZS5fTU9VU0VVUF9FVkVOVF9OQU1FLHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZk1vdXNlVXA9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQoZS5fTU9VU0VVUF9FVkVOVF9OQU1FLHQpLHRoaXN9LGUucHJvdG90eXBlLm9uV2hlZWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQoZS5fV0hFRUxfRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZXaGVlbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChlLl9XSEVFTF9FVkVOVF9OQU1FLHQpLHRoaXN9LGUucHJvdG90eXBlLm9uRGJsQ2xpY2s9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQoZS5fREJMQ0xJQ0tfRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZEYmxDbGljaz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChlLl9EQkxDTElDS19FVkVOVF9OQU1FLHQpLHRoaXN9LGUucHJvdG90eXBlLl9tZWFzdXJlQW5kRGlzcGF0Y2g9ZnVuY3Rpb24odCxlLG4saSl7aWYodm9pZCAwPT09aSYmKGk9ImVsZW1lbnQiKSwicGFnZSIhPT1pJiYiZWxlbWVudCIhPT1pKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzY29wZSAnIitpKyInLCBtdXN0IGJlICdlbGVtZW50JyBvciAncGFnZSciKTtpZigicGFnZSI9PT1pfHx0aGlzLmV2ZW50SW5zaWRlKHQsZSkpe3ZhciByPXRoaXMuX3RyYW5zbGF0b3IuY29tcHV0ZVBvc2l0aW9uKGUuY2xpZW50WCxlLmNsaWVudFkpO3RoaXMuX2xhc3RNb3VzZVBvc2l0aW9uPXIsdGhpcy5fY2FsbENhbGxiYWNrc0ZvckV2ZW50KG4sdGhpcy5sYXN0TW91c2VQb3NpdGlvbigpLGUpfX0sZS5wcm90b3R5cGUuZXZlbnRJbnNpZGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZ2J0LlRyYW5zbGF0b3IuaXNFdmVudEluc2lkZSh0LGUpfSxlLnByb3RvdHlwZS5sYXN0TW91c2VQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYXN0TW91c2VQb3NpdGlvbn0sZS5fRElTUEFUQ0hFUl9LRVk9Il9fUGxvdHRhYmxlX0Rpc3BhdGNoZXJfTW91c2UiLGUuX01PVVNFT1ZFUl9FVkVOVF9OQU1FPSJtb3VzZW92ZXIiLGUuX01PVVNFTU9WRV9FVkVOVF9OQU1FPSJtb3VzZW1vdmUiLGUuX01PVVNFT1VUX0VWRU5UX05BTUU9Im1vdXNlb3V0IixlLl9NT1VTRURPV05fRVZFTlRfTkFNRT0ibW91c2Vkb3duIixlLl9NT1VTRVVQX0VWRU5UX05BTUU9Im1vdXNldXAiLGUuX1dIRUVMX0VWRU5UX05BTUU9IndoZWVsIixlLl9EQkxDTElDS19FVkVOVF9OQU1FPSJkYmxjbGljayIsZX0pKGNidC5EaXNwYXRjaGVyKTtmYnQuTW91c2U9X2J0O3ZhciB5YnQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KHlidCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHZidD11TyxiYnQ9Rmd0LHhidD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXt2YXIgaT10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIGkuX3RyYW5zbGF0b3I9YmJ0LmdldFRyYW5zbGF0b3IobiksaS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltlLl9UT1VDSFNUQVJUX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHQpe3JldHVybiBpLl9tZWFzdXJlQW5kRGlzcGF0Y2gobix0LGUuX1RPVUNIU1RBUlRfRVZFTlRfTkFNRSwicGFnZSIpfSxpLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW2UuX1RPVUNITU9WRV9FVkVOVF9OQU1FXT1mdW5jdGlvbih0KXtyZXR1cm4gaS5fbWVhc3VyZUFuZERpc3BhdGNoKG4sdCxlLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSwicGFnZSIpfSxpLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW2UuX1RPVUNIRU5EX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHQpe3JldHVybiBpLl9tZWFzdXJlQW5kRGlzcGF0Y2gobix0LGUuX1RPVUNIRU5EX0VWRU5UX05BTUUsInBhZ2UiKX0saS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltlLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FXT1mdW5jdGlvbih0KXtyZXR1cm4gaS5fbWVhc3VyZUFuZERpc3BhdGNoKG4sdCxlLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FLCJwYWdlIil9LGl9cmV0dXJuIHZidC5fX2V4dGVuZHMoZSx0KSxlLmdldERpc3BhdGNoZXI9ZnVuY3Rpb24odCl7dmFyIG49dC5yb290KCkucm9vdEVsZW1lbnQoKSxpPW5bZS5fRElTUEFUQ0hFUl9LRVldO3JldHVybiBudWxsPT1pJiYoaT1uZXcgZSh0KSxuW2UuX0RJU1BBVENIRVJfS0VZXT1pKSxpfSxlLnByb3RvdHlwZS5vblRvdWNoU3RhcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQoZS5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FLHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZlRvdWNoU3RhcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQoZS5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FLHQpLHRoaXN9LGUucHJvdG90eXBlLm9uVG91Y2hNb3ZlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGUuX1RPVUNITU9WRV9FVkVOVF9OQU1FLHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZlRvdWNoTW92ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChlLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5vblRvdWNoRW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGUuX1RPVUNIRU5EX0VWRU5UX05BTUUsdCksdGhpc30sZS5wcm90b3R5cGUub2ZmVG91Y2hFbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQoZS5fVE9VQ0hFTkRfRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5vblRvdWNoQ2FuY2VsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGUuX1RPVUNIQ0FOQ0VMX0VWRU5UX05BTUUsdCksdGhpc30sZS5wcm90b3R5cGUub2ZmVG91Y2hDYW5jZWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQoZS5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5fbWVhc3VyZUFuZERpc3BhdGNoPWZ1bmN0aW9uKHQsZSxuLGkpe2lmKHZvaWQgMD09PWkmJihpPSJlbGVtZW50IiksInBhZ2UiIT09aSYmImVsZW1lbnQiIT09aSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc2NvcGUgJyIraSsiJywgbXVzdCBiZSAnZWxlbWVudCcgb3IgJ3BhZ2UnIik7aWYoImVsZW1lbnQiIT09aXx8dGhpcy5ldmVudEluc2lkZSh0LGUpKXtmb3IodmFyIHI9ZS5jaGFuZ2VkVG91Y2hlcyxvPXt9LGE9W10scz0wO3M8ci5sZW5ndGg7cysrKXt2YXIgbD1yW3NdLGM9bC5pZGVudGlmaWVyLHU9dGhpcy5fdHJhbnNsYXRvci5jb21wdXRlUG9zaXRpb24obC5jbGllbnRYLGwuY2xpZW50WSk7bnVsbCE9dSYmKG9bY109dSxhLnB1c2goYykpfWEubGVuZ3RoPjAmJnRoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChuLGEsbyxlKX19LGUucHJvdG90eXBlLmV2ZW50SW5zaWRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGJidC5UcmFuc2xhdG9yLmlzRXZlbnRJbnNpZGUodCxlKX0sZS5fRElTUEFUQ0hFUl9LRVk9Il9fUGxvdHRhYmxlX0Rpc3BhdGNoZXJfVG91Y2giLGUuX1RPVUNIU1RBUlRfRVZFTlRfTkFNRT0idG91Y2hzdGFydCIsZS5fVE9VQ0hNT1ZFX0VWRU5UX05BTUU9InRvdWNobW92ZSIsZS5fVE9VQ0hFTkRfRVZFTlRfTkFNRT0idG91Y2hlbmQiLGUuX1RPVUNIQ0FOQ0VMX0VWRU5UX05BTUU9InRvdWNoY2FuY2VsIixlfSkoY2J0LkRpc3BhdGNoZXIpO3lidC5Ub3VjaD14YnQsKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9dU87ZS5fX2V4cG9ydFN0YXIobGJ0LHQpLGUuX19leHBvcnRTdGFyKGZidCx0KSxlLl9fZXhwb3J0U3Rhcih5YnQsdCl9KShzYnQpO3ZhciB3YnQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KHdidCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFNidD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIHQ9dGhpczt0aGlzLl9hbmNob3JDYWxsYmFjaz1mdW5jdGlvbihlKXtyZXR1cm4gdC5fYW5jaG9yKGUpfSx0aGlzLl9lbmFibGVkPSEwfXJldHVybiB0LnByb3RvdHlwZS5hdHRhY2hUbz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZGlzY29ubmVjdCgpLHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG89dCx0aGlzLl9jb25uZWN0KCksdGhpc30sdC5wcm90b3R5cGUuZGV0YWNoRnJvbT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kZXRhY2goKX0sdC5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc2Nvbm5lY3QoKSx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvPW51bGwsdGhpc30sdC5wcm90b3R5cGUuZW5hYmxlZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9lbmFibGVkOih0aGlzLl9lbmFibGVkPXQsdGhpcy5fZW5hYmxlZD90aGlzLl9jb25uZWN0KCk6dGhpcy5fZGlzY29ubmVjdCgpLHRoaXMpfSx0LnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKHQpe3RoaXMuX2lzQW5jaG9yZWQ9ITB9LHQucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQ9ITF9LHQucHJvdG90eXBlLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ub3JpZ2luVG9Sb290KCk7cmV0dXJue3g6dC54LWUueCx5OnQueS1lLnl9fSx0LnByb3RvdHlwZS5faXNJbnNpZGVDb21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIDA8PXQueCYmMDw9dC55JiZ0Lng8PXRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ud2lkdGgoKSYmdC55PD10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLmhlaWdodCgpfSx0LnByb3RvdHlwZS5fY29ubmVjdD1mdW5jdGlvbigpe3RoaXMuZW5hYmxlZCgpJiZudWxsIT10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvJiYhdGhpcy5faXNBbmNob3JlZCYmdGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby5vbkFuY2hvcih0aGlzLl9hbmNob3JDYWxsYmFjayl9LHQucHJvdG90eXBlLl9kaXNjb25uZWN0PWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5fdW5hbmNob3IoKSxudWxsIT10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvJiZ0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLm9mZkFuY2hvcih0aGlzLl9hbmNob3JDYWxsYmFjayl9LHR9KSgpO3didC5JbnRlcmFjdGlvbj1TYnQsCi8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhYnQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBNYnQ9dU8sRWJ0PXNidCxUYnQ9Rmd0LENidD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5fY2xpY2tlZERvd249ITEsZS5fZG91YmxlQ2xpY2tpbmc9ITEsZS5fb25DbGlja0NhbGxiYWNrcz1uZXcgVGJ0LkNhbGxiYWNrU2V0LGUuX29uRG91YmxlQ2xpY2tDYWxsYmFja3M9bmV3IFRidC5DYWxsYmFja1NldCxlLl9tb3VzZURvd25DYWxsYmFjaz1mdW5jdGlvbih0LG4pe3JldHVybiBlLl9oYW5kbGVDbGlja0Rvd24odCxuKX0sZS5fbW91c2VVcENhbGxiYWNrPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuX2hhbmRsZUNsaWNrVXAodCxuKX0sZS5fZGJsQ2xpY2tDYWxsYmFjaz1mdW5jdGlvbih0LG4pe3JldHVybiBlLl9oYW5kbGVEYmxDbGljayh0LG4pfSxlLl90b3VjaFN0YXJ0Q2FsbGJhY2s9ZnVuY3Rpb24odCxuLGkpe3JldHVybiBlLl9oYW5kbGVDbGlja0Rvd24oblt0WzBdXSxpKX0sZS5fdG91Y2hFbmRDYWxsYmFjaz1mdW5jdGlvbih0LG4saSl7cmV0dXJuIGUuX2hhbmRsZUNsaWNrVXAoblt0WzBdXSxpKX0sZS5fdG91Y2hDYW5jZWxDYWxsYmFjaz1mdW5jdGlvbih0LG4pe3JldHVybiBlLl9jbGlja2VkRG93bj0hMX0sZX1yZXR1cm4gTWJ0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsZSksdGhpcy5fbW91c2VEaXNwYXRjaGVyPUVidC5Nb3VzZS5nZXREaXNwYXRjaGVyKGUpLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlRG93bih0aGlzLl9tb3VzZURvd25DYWxsYmFjayksdGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VVcCh0aGlzLl9tb3VzZVVwQ2FsbGJhY2spLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vbkRibENsaWNrKHRoaXMuX2RibENsaWNrQ2FsbGJhY2spLHRoaXMuX3RvdWNoRGlzcGF0Y2hlcj1FYnQuVG91Y2guZ2V0RGlzcGF0Y2hlcihlKSx0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayl9LGUucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZURvd24odGhpcy5fbW91c2VEb3duQ2FsbGJhY2spLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayksdGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZkRibENsaWNrKHRoaXMuX2RibENsaWNrQ2FsbGJhY2spLHRoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsLHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spLHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaENhbmNlbCh0aGlzLl90b3VjaENhbmNlbENhbGxiYWNrKSx0aGlzLl90b3VjaERpc3BhdGNoZXI9bnVsbH0sZS5wcm90b3R5cGUuX2hhbmRsZUNsaWNrRG93bj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UodCk7dGhpcy5faXNJbnNpZGVDb21wb25lbnQobikmJih0aGlzLl9jbGlja2VkRG93bj0hMCx0aGlzLl9jbGlja2VkUG9pbnQ9bil9LGUucHJvdG90eXBlLl9oYW5kbGVDbGlja1VwPWZ1bmN0aW9uKHQsbil7dmFyIGk9dGhpcyxyPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UodCk7dGhpcy5fY2xpY2tlZERvd24mJmUuX3BvaW50c0VxdWFsKHIsdGhpcy5fY2xpY2tlZFBvaW50KSYmc2V0VGltZW91dCgoZnVuY3Rpb24oKXtpLl9kb3VibGVDbGlja2luZ3x8aS5fb25DbGlja0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHIsbil9KSwwKSx0aGlzLl9jbGlja2VkRG93bj0hMX0sZS5wcm90b3R5cGUuX2hhbmRsZURibENsaWNrPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxpPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UodCk7dGhpcy5fZG91YmxlQ2xpY2tpbmc9ITAsdGhpcy5fb25Eb3VibGVDbGlja0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKGksZSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtyZXR1cm4gbi5fZG91YmxlQ2xpY2tpbmc9ITF9KSwwKX0sZS5fcG9pbnRzRXF1YWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC54PT09ZS54JiZ0Lnk9PT1lLnl9LGUucHJvdG90eXBlLm9uQ2xpY2s9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX29uQ2xpY2tDYWxsYmFja3MuYWRkKHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZkNsaWNrPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9vbkNsaWNrQ2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlLnByb3RvdHlwZS5vbkRvdWJsZUNsaWNrPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9vbkRvdWJsZUNsaWNrQ2FsbGJhY2tzLmFkZCh0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZEb3VibGVDbGljaz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fb25Eb3VibGVDbGlja0NhbGxiYWNrcy5kZWxldGUodCksdGhpc30sZX0pKHdidC5JbnRlcmFjdGlvbik7YWJ0LkNsaWNrPUNidDt2YXIgQWJ0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShBYnQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBrYnQ9dU8sTGJ0PXNidCxQYnQ9Rmd0LE5idD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXt2YXIgaT10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIGkuX2RyYWdnaW5nPSExLGkuX2NvbnN0cmFpbmVkVG9Db21wb25lbnQ9ITAsaS5fbW91c2VGaWx0ZXI9ZS5fREVGQVVMVF9NT1VTRV9GSUxURVIsaS5fZHJhZ1N0YXJ0Q2FsbGJhY2tzPW5ldyBQYnQuQ2FsbGJhY2tTZXQsaS5fZHJhZ0NhbGxiYWNrcz1uZXcgUGJ0LkNhbGxiYWNrU2V0LGkuX2RyYWdFbmRDYWxsYmFja3M9bmV3IFBidC5DYWxsYmFja1NldCxpLl9tb3VzZURvd25DYWxsYmFjaz1mdW5jdGlvbih0LGUpe3JldHVybiBpLl9zdGFydERyYWcodCxlKX0saS5fbW91c2VNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaS5fZG9EcmFnKHQsZSl9LGkuX21vdXNlVXBDYWxsYmFjaz1mdW5jdGlvbih0LGUpe3JldHVybiBpLl9lbmREcmFnKHQsZSl9LGkuX3RvdWNoU3RhcnRDYWxsYmFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGkuX3N0YXJ0RHJhZyhlW3RbMF1dLG4pfSxpLl90b3VjaE1vdmVDYWxsYmFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGkuX2RvRHJhZyhlW3RbMF1dLG4pfSxpLl90b3VjaEVuZENhbGxiYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaS5fZW5kRHJhZyhlW3RbMF1dLG4pfSxpLl9tb3VzZUJ1dHRvbj12b2lkIDAhPT1uP246MCxpfXJldHVybiBrYnQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX2FuY2hvcj1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5fYW5jaG9yLmNhbGwodGhpcyxlKSx0aGlzLl9tb3VzZURpc3BhdGNoZXI9TGJ0Lk1vdXNlLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyksdGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VEb3duKHRoaXMuX21vdXNlRG93bkNhbGxiYWNrKSx0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlVXAodGhpcy5fbW91c2VVcENhbGxiYWNrKSx0aGlzLl90b3VjaERpc3BhdGNoZXI9TGJ0LlRvdWNoLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyksdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spLHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoTW92ZSh0aGlzLl90b3VjaE1vdmVDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayl9LGUucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZURvd24odGhpcy5fbW91c2VEb3duQ2FsbGJhY2spLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayksdGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGwsdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKSx0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hNb3ZlKHRoaXMuX3RvdWNoTW92ZUNhbGxiYWNrKSx0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyPW51bGx9LGUucHJvdG90eXBlLl90cmFuc2xhdGVBbmRDb25zdHJhaW49ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZSh0KTtyZXR1cm4gdGhpcy5fY29uc3RyYWluZWRUb0NvbXBvbmVudD97eDpQYnQuTWF0aC5jbGFtcChlLngsMCx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkpLHk6UGJ0Lk1hdGguY2xhbXAoZS55LDAsdGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby5oZWlnaHQoKSl9OmV9LGUucHJvdG90eXBlLl9zdGFydERyYWc9ZnVuY3Rpb24odCxlKXtpZighKGUgaW5zdGFuY2VvZiBNb3VzZUV2ZW50KXx8dGhpcy5fbW91c2VGaWx0ZXIoZSkpe3ZhciBuPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UodCk7dGhpcy5faXNJbnNpZGVDb21wb25lbnQobikmJihlLnByZXZlbnREZWZhdWx0KCksdGhpcy5fZHJhZ2dpbmc9ITAsdGhpcy5fZHJhZ09yaWdpbj1uLHRoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMuX2RyYWdPcmlnaW4pKX19LGUucHJvdG90eXBlLl9kb0RyYWc9ZnVuY3Rpb24odCxlKXt0aGlzLl9kcmFnZ2luZyYmdGhpcy5fZHJhZ0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMuX2RyYWdPcmlnaW4sdGhpcy5fdHJhbnNsYXRlQW5kQ29uc3RyYWluKHQpKX0sZS5wcm90b3R5cGUuX2VuZERyYWc9ZnVuY3Rpb24odCxlKXtlIGluc3RhbmNlb2YgTW91c2VFdmVudCYmZS5idXR0b24hPT10aGlzLl9tb3VzZUJ1dHRvbnx8dGhpcy5fZHJhZ2dpbmcmJih0aGlzLl9kcmFnZ2luZz0hMSx0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcy5fZHJhZ09yaWdpbix0aGlzLl90cmFuc2xhdGVBbmRDb25zdHJhaW4odCkpKX0sZS5wcm90b3R5cGUuY29uc3RyYWluZWRUb0NvbXBvbmVudD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9jb25zdHJhaW5lZFRvQ29tcG9uZW50Oih0aGlzLl9jb25zdHJhaW5lZFRvQ29tcG9uZW50PXQsdGhpcyl9LGUucHJvdG90eXBlLm1vdXNlRmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLl9tb3VzZUZpbHRlcjoodGhpcy5fbW91c2VGaWx0ZXI9dCx0aGlzKX0sZS5wcm90b3R5cGUub25EcmFnU3RhcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUub2ZmRHJhZ1N0YXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZGVsZXRlKHQpLHRoaXN9LGUucHJvdG90eXBlLm9uRHJhZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZHJhZ0NhbGxiYWNrcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUub2ZmRHJhZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZHJhZ0NhbGxiYWNrcy5kZWxldGUodCksdGhpc30sZS5wcm90b3R5cGUub25EcmFnRW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmFkZCh0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZEcmFnRW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlLl9ERUZBVUxUX01PVVNFX0ZJTFRFUj1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXQuYnV0dG9ufSxlfSkod2J0LkludGVyYWN0aW9uKTtBYnQuRHJhZz1OYnQ7dmFyIElidD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoSWJ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgUmJ0PXVPLE9idD1zYnQsemJ0PUZndCxEYnQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUuX2tleVByZXNzQ2FsbGJhY2tzPXt9LGUuX2tleVJlbGVhc2VDYWxsYmFja3M9e30sZS5fbW91c2VNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24odCl7cmV0dXJuITF9LGUuX2Rvd25lZEtleXM9bmV3IHpidC5TZXQsZS5fa2V5RG93bkNhbGxiYWNrPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuX2hhbmRsZUtleURvd25FdmVudCh0LG4pfSxlLl9rZXlVcENhbGxiYWNrPWZ1bmN0aW9uKHQpe3JldHVybiBlLl9oYW5kbGVLZXlVcEV2ZW50KHQpfSxlfXJldHVybiBSYnQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX2FuY2hvcj1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5fYW5jaG9yLmNhbGwodGhpcyxlKSx0aGlzLl9wb3NpdGlvbkRpc3BhdGNoZXI9T2J0Lk1vdXNlLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyksdGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKSx0aGlzLl9rZXlEaXNwYXRjaGVyPU9idC5LZXkuZ2V0RGlzcGF0Y2hlcigpLHRoaXMuX2tleURpc3BhdGNoZXIub25LZXlEb3duKHRoaXMuX2tleURvd25DYWxsYmFjayksdGhpcy5fa2V5RGlzcGF0Y2hlci5vbktleVVwKHRoaXMuX2tleVVwQ2FsbGJhY2spfSxlLnByb3RvdHlwZS5fdW5hbmNob3I9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5fdW5hbmNob3IuY2FsbCh0aGlzKSx0aGlzLl9wb3NpdGlvbkRpc3BhdGNoZXIub2ZmTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKSx0aGlzLl9wb3NpdGlvbkRpc3BhdGNoZXI9bnVsbCx0aGlzLl9rZXlEaXNwYXRjaGVyLm9mZktleURvd24odGhpcy5fa2V5RG93bkNhbGxiYWNrKSx0aGlzLl9rZXlEaXNwYXRjaGVyLm9mZktleVVwKHRoaXMuX2tleVVwQ2FsbGJhY2spLHRoaXMuX2tleURpc3BhdGNoZXI9bnVsbH0sZS5wcm90b3R5cGUuX2hhbmRsZUtleURvd25FdmVudD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UodGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyLmxhc3RNb3VzZVBvc2l0aW9uKCkpO3RoaXMuX2lzSW5zaWRlQ29tcG9uZW50KG4pJiYhZS5yZXBlYXQmJih0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1t0XSYmdGhpcy5fa2V5UHJlc3NDYWxsYmFja3NbdF0uY2FsbENhbGxiYWNrcyh0KSx0aGlzLl9kb3duZWRLZXlzLmFkZCh0KSl9LGUucHJvdG90eXBlLl9oYW5kbGVLZXlVcEV2ZW50PWZ1bmN0aW9uKHQpe3RoaXMuX2Rvd25lZEtleXMuaGFzKHQpJiZ0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW3RdJiZ0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW3RdLmNhbGxDYWxsYmFja3ModCksdGhpcy5fZG93bmVkS2V5cy5kZWxldGUodCl9LGUucHJvdG90eXBlLm9uS2V5UHJlc3M9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fa2V5UHJlc3NDYWxsYmFja3NbdF18fCh0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1t0XT1uZXcgemJ0LkNhbGxiYWNrU2V0KSx0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1t0XS5hZGQoZSksdGhpc30sZS5wcm90b3R5cGUub2ZmS2V5UHJlc3M9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fa2V5UHJlc3NDYWxsYmFja3NbdF0uZGVsZXRlKGUpLDA9PT10aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1t0XS5zaXplJiZkZWxldGUgdGhpcy5fa2V5UHJlc3NDYWxsYmFja3NbdF0sdGhpc30sZS5wcm90b3R5cGUub25LZXlSZWxlYXNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3NbdF18fCh0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW3RdPW5ldyB6YnQuQ2FsbGJhY2tTZXQpLHRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3NbdF0uYWRkKGUpLHRoaXN9LGUucHJvdG90eXBlLm9mZktleVJlbGVhc2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1t0XS5kZWxldGUoZSksMD09PXRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3NbdF0uc2l6ZSYmZGVsZXRlIHRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3NbdF0sdGhpc30sZX0pKHdidC5JbnRlcmFjdGlvbik7SWJ0LktleT1EYnQ7dmFyIEJidD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoQmJ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgSGJ0PXVPLEZidD1FZHQsVmJ0PXNidCxVYnQ9Wnl0LGpidD1GZ3QsR2J0PW9idCxXYnQ9aXZ0LHFidD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZhciBpPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gaS5fd2hlZWxGaWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuITB9LGkuX3doZWVsQ2FsbGJhY2s9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaS5faGFuZGxlV2hlZWxFdmVudCh0LGUpfSxpLl90b3VjaFN0YXJ0Q2FsbGJhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBpLl9oYW5kbGVUb3VjaFN0YXJ0KHQsZSxuKX0saS5fdG91Y2hNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBpLl9oYW5kbGVQaW5jaCh0LGUsbil9LGkuX3RvdWNoRW5kQ2FsbGJhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBpLl9oYW5kbGVUb3VjaEVuZCh0LGUsbil9LGkuX3RvdWNoQ2FuY2VsQ2FsbGJhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBpLl9oYW5kbGVUb3VjaEVuZCh0LGUsbil9LGkuX3BhbkVuZENhbGxiYWNrcz1uZXcgamJ0LkNhbGxiYWNrU2V0LGkuX3pvb21FbmRDYWxsYmFja3M9bmV3IGpidC5DYWxsYmFja1NldCxpLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzPW5ldyBqYnQuQ2FsbGJhY2tTZXQsaS5feFNjYWxlcz1uZXcgamJ0LlNldCxpLl95U2NhbGVzPW5ldyBqYnQuU2V0LGkuX2RyYWdJbnRlcmFjdGlvbj1uZXcgR2J0LkRyYWcsaS5fc2V0dXBEcmFnSW50ZXJhY3Rpb24oKSxpLl90b3VjaElkcz1GYnQubWFwKCksaS5fbWluRG9tYWluRXh0ZW50cz1uZXcgamJ0Lk1hcCxpLl9tYXhEb21haW5FeHRlbnRzPW5ldyBqYnQuTWFwLGkuX21pbkRvbWFpblZhbHVlcz1uZXcgamJ0Lk1hcCxpLl9tYXhEb21haW5WYWx1ZXM9bmV3IGpidC5NYXAsbnVsbCE9ZSYmaS5hZGRYU2NhbGUoZSksbnVsbCE9biYmaS5hZGRZU2NhbGUobiksaX1yZXR1cm4gSGJ0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLmRyYWdJbnRlcmFjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb259LGUucHJvdG90eXBlLndoZWVsRmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLl93aGVlbEZpbHRlcjoodGhpcy5fd2hlZWxGaWx0ZXI9dCx0aGlzKX0sZS5wcm90b3R5cGUucGFuPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy54U2NhbGVzKCkuZm9yRWFjaCgoZnVuY3Rpb24obil7bi5wYW4oZS5fY29uc3RyYWluZWRUcmFuc2xhdGlvbihuLHQueCkpfSkpLHRoaXMueVNjYWxlcygpLmZvckVhY2goKGZ1bmN0aW9uKG4pe24ucGFuKGUuX2NvbnN0cmFpbmVkVHJhbnNsYXRpb24obix0LnkpKX0pKSx0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKX0sZS5wcm90b3R5cGUuem9vbT1mdW5jdGlvbih0LGUsbil7dmFyIGkscixvPXRoaXM7cmV0dXJuIHZvaWQgMD09PW4mJihuPSEwKSxudWxsIT1lJiYoaT1lLngscj1lLnksbiYmKHRoaXMueFNjYWxlcygpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPW8uX2NvbnN0cmFpbmVkWm9vbShlLHQsaSk7aT1uLmNlbnRlclBvaW50LHQ9bi56b29tQW1vdW50fSkpLHRoaXMueVNjYWxlcygpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPW8uX2NvbnN0cmFpbmVkWm9vbShlLHQscik7cj1uLmNlbnRlclBvaW50LHQ9bi56b29tQW1vdW50fSkpKSksdGhpcy54U2NhbGVzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49ZS5yYW5nZSgpO2Uuem9vbSh0LG51bGw9PWk/KG5bMV0rblswXSkvMjppKX0pKSx0aGlzLnlTY2FsZXMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1lLnJhbmdlKCk7ZS56b29tKHQsbnVsbD09cj8oblsxXStuWzBdKS8yOnIpfSkpLHRoaXMuX3Bhblpvb21VcGRhdGVDYWxsYmFja3MuY2FsbENhbGxiYWNrcygpLHt6b29tQW1vdW50OnQsY2VudGVyVmFsdWU6e2NlbnRlclg6aSxjZW50ZXJZOnJ9fX0sZS5wcm90b3R5cGUuX2FuY2hvcj1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5fYW5jaG9yLmNhbGwodGhpcyxlKSx0aGlzLl9kcmFnSW50ZXJhY3Rpb24uYXR0YWNoVG8oZSksdGhpcy5fbW91c2VEaXNwYXRjaGVyPVZidC5Nb3VzZS5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vbldoZWVsKHRoaXMuX3doZWVsQ2FsbGJhY2spLHRoaXMuX3RvdWNoRGlzcGF0Y2hlcj1WYnQuVG91Y2guZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKSx0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hNb3ZlKHRoaXMuX3RvdWNoTW92ZUNhbGxiYWNrKSx0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaEVuZCh0aGlzLl90b3VjaEVuZENhbGxiYWNrKSx0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaENhbmNlbCh0aGlzLl90b3VjaENhbmNlbENhbGxiYWNrKX0sZS5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuX3VuYW5jaG9yLmNhbGwodGhpcyksdGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZldoZWVsKHRoaXMuX3doZWVsQ2FsbGJhY2spLHRoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsLHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoTW92ZSh0aGlzLl90b3VjaE1vdmVDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spLHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaENhbmNlbCh0aGlzLl90b3VjaENhbmNlbENhbGxiYWNrKSx0aGlzLl90b3VjaERpc3BhdGNoZXI9bnVsbCx0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCl9LGUucHJvdG90eXBlLl9oYW5kbGVUb3VjaFN0YXJ0PWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9MDtpPHQubGVuZ3RoJiZ0aGlzLl90b3VjaElkcy5zaXplKCk8MjtpKyspe3ZhciByPXRbaV07dGhpcy5fdG91Y2hJZHMuc2V0KHIudG9TdHJpbmcoKSx0aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKGVbcl0pKX19LGUucHJvdG90eXBlLl9oYW5kbGVQaW5jaD1mdW5jdGlvbih0LG4saSl7dmFyIHI9dGhpcztpZighKHRoaXMuX3RvdWNoSWRzLnNpemUoKTwyKSl7dmFyIG89dGhpcy5fdG91Y2hJZHMudmFsdWVzKCk7aWYodGhpcy5faXNJbnNpZGVDb21wb25lbnQodGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShvWzBdKSkmJnRoaXMuX2lzSW5zaWRlQ29tcG9uZW50KHRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2Uob1sxXSkpKXt2YXIgYT1lLl9wb2ludERpc3RhbmNlKG9bMF0sb1sxXSk7aWYoMCE9PWEpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7ci5fdG91Y2hJZHMuaGFzKHQudG9TdHJpbmcoKSkmJnIuX3RvdWNoSWRzLnNldCh0LnRvU3RyaW5nKCksci5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShuW3RdKSl9KSk7dmFyIHM9dGhpcy5fdG91Y2hJZHMudmFsdWVzKCksbD1lLl9wb2ludERpc3RhbmNlKHNbMF0sc1sxXSk7aWYoMCE9PWwpe3ZhciBjPWEvbCx1PXMubWFwKChmdW5jdGlvbih0LGUpe3JldHVybnt4Oih0Lngtb1tlXS54KS9jLHk6KHQueS1vW2VdLnkpL2N9fSkpLGg9ZS5jZW50ZXJQb2ludChvWzBdLG9bMV0pLGQ9dGhpcy56b29tKGMsaCkscD1kLmNlbnRlclZhbHVlLGY9ZC56b29tQW1vdW50LG09cC5jZW50ZXJYLGc9cC5jZW50ZXJZLF89by5tYXAoKGZ1bmN0aW9uKHQsZSl7cmV0dXJue3g6dVtlXS54KmYrdC54LHk6dVtlXS55KmYrdC55fX0pKTt0aGlzLnBhbih7eDptLShfWzBdLngrX1sxXS54KS8yLHk6Zy0oX1swXS55K19bMV0ueSkvMn0pfX19fX0sZS5jZW50ZXJQb2ludD1mdW5jdGlvbih0LGUpe3ZhciBuPU1hdGgubWluKHQueCxlLngpLGk9TWF0aC5tYXgodC54LGUueCkscj1NYXRoLm1pbih0LnksZS55KTtyZXR1cm57eDoobitpKS8yLHk6KE1hdGgubWF4KHQueSxlLnkpK3IpLzJ9fSxlLl9wb2ludERpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5taW4odC54LGUueCksaT1NYXRoLm1heCh0LngsZS54KSxyPU1hdGgubWluKHQueSxlLnkpLG89TWF0aC5tYXgodC55LGUueSk7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhpLW4sMikrTWF0aC5wb3coby1yLDIpKX0sZS5wcm90b3R5cGUuX2hhbmRsZVRvdWNoRW5kPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzO3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7aS5fdG91Y2hJZHMucmVtb3ZlKHQudG9TdHJpbmcoKSl9KSksdGhpcy5fdG91Y2hJZHMuc2l6ZSgpPjAmJnRoaXMuX3pvb21FbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcygpfSxlLnByb3RvdHlwZS5faGFuZGxlV2hlZWxFdmVudD1mdW5jdGlvbih0LG4pe2lmKHRoaXMuX3doZWVsRmlsdGVyKG4pKXt2YXIgaT10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHQpO2lmKHRoaXMuX2lzSW5zaWRlQ29tcG9uZW50KGkpKXtuLnByZXZlbnREZWZhdWx0KCk7dmFyIHI9TWF0aC5wb3coMiwoMCE9PW4uZGVsdGFZP24uZGVsdGFZOm4uZGVsdGFYKSoobi5kZWx0YU1vZGU/ZS5fUElYRUxTX1BFUl9MSU5FOjEpKi4wMDIpO3RoaXMuem9vbShyLGkpLHRoaXMuX3pvb21FbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcygpfX19LGUucHJvdG90eXBlLl9jb25zdHJhaW5lZFpvb209ZnVuY3Rpb24odCxlLG4pe3JldHVybiBXYnQuY29uc3RyYWluZWRab29tKHQsZSxuLHRoaXMubWluRG9tYWluRXh0ZW50KHQpLHRoaXMubWF4RG9tYWluRXh0ZW50KHQpLHRoaXMubWluRG9tYWluVmFsdWUodCksdGhpcy5tYXhEb21haW5WYWx1ZSh0KSl9LGUucHJvdG90eXBlLl9jb25zdHJhaW5lZFRyYW5zbGF0aW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFdidC5jb25zdHJhaW5lZFRyYW5zbGF0aW9uKHQsZSx0aGlzLm1pbkRvbWFpblZhbHVlKHQpLHRoaXMubWF4RG9tYWluVmFsdWUodCkpfSxlLnByb3RvdHlwZS5fc2V0dXBEcmFnSW50ZXJhY3Rpb249ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXM7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmNvbnN0cmFpbmVkVG9Db21wb25lbnQoITEpLHRoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdTdGFydCgoZnVuY3Rpb24oKXtyZXR1cm4gdD1udWxsfSkpLHRoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWcoKGZ1bmN0aW9uKG4saSl7ZS5fdG91Y2hJZHMuc2l6ZSgpPj0yfHwoZS5wYW4oe3g6KG51bGw9PXQ/bi54OnQueCktaS54LHk6KG51bGw9PXQ/bi55OnQueSktaS55fSksdD1pKX0pKSx0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnRW5kKChmdW5jdGlvbigpe3JldHVybiBlLl9wYW5FbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcygpfSkpfSxlLnByb3RvdHlwZS5fbm9uTGluZWFyU2NhbGVXaXRoRXh0ZW50cz1mdW5jdGlvbih0KXtyZXR1cm4hKG51bGw9PXRoaXMubWluRG9tYWluRXh0ZW50KHQpfHxudWxsPT10aGlzLm1heERvbWFpbkV4dGVudCh0KXx8dCBpbnN0YW5jZW9mIFVidC5MaW5lYXJ8fHQgaW5zdGFuY2VvZiBVYnQuVGltZSl9LGUucHJvdG90eXBlLnhTY2FsZXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZihudWxsPT10KXt2YXIgbj1bXTtyZXR1cm4gdGhpcy5feFNjYWxlcy5mb3JFYWNoKChmdW5jdGlvbih0KXtuLnB1c2godCl9KSksbn1yZXR1cm4gdGhpcy5feFNjYWxlcz1uZXcgamJ0LlNldCx0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2UuYWRkWFNjYWxlKHQpfSkpLHRoaXN9LGUucHJvdG90eXBlLnlTY2FsZXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZihudWxsPT10KXt2YXIgbj1bXTtyZXR1cm4gdGhpcy5feVNjYWxlcy5mb3JFYWNoKChmdW5jdGlvbih0KXtuLnB1c2godCl9KSksbn1yZXR1cm4gdGhpcy5feVNjYWxlcz1uZXcgamJ0LlNldCx0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2UuYWRkWVNjYWxlKHQpfSkpLHRoaXN9LGUucHJvdG90eXBlLmFkZFhTY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5feFNjYWxlcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUucmVtb3ZlWFNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl94U2NhbGVzLmRlbGV0ZSh0KSx0aGlzLl9taW5Eb21haW5FeHRlbnRzLmRlbGV0ZSh0KSx0aGlzLl9tYXhEb21haW5FeHRlbnRzLmRlbGV0ZSh0KSx0aGlzLl9taW5Eb21haW5WYWx1ZXMuZGVsZXRlKHQpLHRoaXMuX21heERvbWFpblZhbHVlcy5kZWxldGUodCksdGhpc30sZS5wcm90b3R5cGUuYWRkWVNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl95U2NhbGVzLmFkZCh0KSx0aGlzfSxlLnByb3RvdHlwZS5yZW1vdmVZU2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3lTY2FsZXMuZGVsZXRlKHQpLHRoaXMuX21pbkRvbWFpbkV4dGVudHMuZGVsZXRlKHQpLHRoaXMuX21heERvbWFpbkV4dGVudHMuZGVsZXRlKHQpLHRoaXMuX21pbkRvbWFpblZhbHVlcy5kZWxldGUodCksdGhpcy5fbWF4RG9tYWluVmFsdWVzLmRlbGV0ZSh0KSx0aGlzfSxlLnByb3RvdHlwZS5taW5Eb21haW5FeHRlbnQ9ZnVuY3Rpb24odCxlKXtpZihudWxsPT1lKXJldHVybiB0aGlzLl9taW5Eb21haW5FeHRlbnRzLmdldCh0KTtpZihlLnZhbHVlT2YoKTwwKXRocm93IG5ldyBFcnJvcigiZXh0ZW50IG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7dmFyIG49dGhpcy5tYXhEb21haW5FeHRlbnQodCk7aWYobnVsbCE9biYmbi52YWx1ZU9mKCk8ZS52YWx1ZU9mKCkpdGhyb3cgbmV3IEVycm9yKCJtaW5Eb21haW5FeHRlbnQgbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4RG9tYWluRXh0ZW50IGZvciB0aGUgc2FtZSBTY2FsZSIpO3JldHVybiB0aGlzLl9ub25MaW5lYXJTY2FsZVdpdGhFeHRlbnRzKHQpJiZqYnQuV2luZG93Lndhcm4oIlBhbm5pbmcgYW5kIHpvb21pbmcgd2l0aCBleHRlbnRzIG9uIGEgbm9ubGluZWFyIHNjYWxlIG1heSBoYXZlIHVuaW50ZW5kZWQgYmVoYXZpb3IuIiksdGhpcy5fbWluRG9tYWluRXh0ZW50cy5zZXQodCxlKSx0aGlzfSxlLnByb3RvdHlwZS5tYXhEb21haW5FeHRlbnQ9ZnVuY3Rpb24odCxlKXtpZihudWxsPT1lKXJldHVybiB0aGlzLl9tYXhEb21haW5FeHRlbnRzLmdldCh0KTtpZihlLnZhbHVlT2YoKTw9MCl0aHJvdyBuZXcgRXJyb3IoImV4dGVudCBtdXN0IGJlIHBvc2l0aXZlIik7dmFyIG49dGhpcy5taW5Eb21haW5FeHRlbnQodCk7aWYobnVsbCE9biYmZS52YWx1ZU9mKCk8bi52YWx1ZU9mKCkpdGhyb3cgbmV3IEVycm9yKCJtYXhEb21haW5FeHRlbnQgbXVzdCBiZSBsYXJnZXIgdGhhbiBtaW5Eb21haW5FeHRlbnQgZm9yIHRoZSBzYW1lIFNjYWxlIik7cmV0dXJuIHRoaXMuX25vbkxpbmVhclNjYWxlV2l0aEV4dGVudHModCkmJmpidC5XaW5kb3cud2FybigiUGFubmluZyBhbmQgem9vbWluZyB3aXRoIGV4dGVudHMgb24gYSBub25saW5lYXIgc2NhbGUgbWF5IGhhdmUgdW5pbnRlbmRlZCBiZWhhdmlvci4iKSx0aGlzLl9tYXhEb21haW5FeHRlbnRzLnNldCh0LGUpLHRoaXN9LGUucHJvdG90eXBlLm1pbkRvbWFpblZhbHVlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PWU/dGhpcy5fbWluRG9tYWluVmFsdWVzLmdldCh0KToodGhpcy5fbWluRG9tYWluVmFsdWVzLnNldCh0LGUpLHRoaXMpfSxlLnByb3RvdHlwZS5tYXhEb21haW5WYWx1ZT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT1lP3RoaXMuX21heERvbWFpblZhbHVlcy5nZXQodCk6KHRoaXMuX21heERvbWFpblZhbHVlcy5zZXQodCxlKSx0aGlzKX0sZS5wcm90b3R5cGUuc2V0TWluTWF4RG9tYWluVmFsdWVzVG89ZnVuY3Rpb24odCl7dGhpcy5fbWluRG9tYWluVmFsdWVzLmRlbGV0ZSh0KSx0aGlzLl9tYXhEb21haW5WYWx1ZXMuZGVsZXRlKHQpO3ZhciBlPXQuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKSxuPWVbMV07cmV0dXJuIHRoaXMubWluRG9tYWluVmFsdWUodCxlWzBdKSx0aGlzLm1heERvbWFpblZhbHVlKHQsbiksdGhpc30sZS5wcm90b3R5cGUub25QYW5FbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhbkVuZENhbGxiYWNrcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUub2ZmUGFuRW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYW5FbmRDYWxsYmFja3MuZGVsZXRlKHQpLHRoaXN9LGUucHJvdG90eXBlLm9uWm9vbUVuZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fem9vbUVuZENhbGxiYWNrcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUub2ZmWm9vbUVuZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fem9vbUVuZENhbGxiYWNrcy5kZWxldGUodCksdGhpc30sZS5wcm90b3R5cGUub25QYW5ab29tVXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmFkZCh0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZQYW5ab29tVXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlLl9QSVhFTFNfUEVSX0xJTkU9MTIwLGV9KSh3YnQuSW50ZXJhY3Rpb24pO0JidC5QYW5ab29tPXFidDt2YXIgWWJ0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShZYnQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBYYnQ9dU8sJGJ0PXNidCxLYnQ9Rmd0LFpidD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5fb3ZlckNvbXBvbmVudD0hMSxlLl9wb2ludGVyRW50ZXJDYWxsYmFja3M9bmV3IEtidC5DYWxsYmFja1NldCxlLl9wb2ludGVyTW92ZUNhbGxiYWNrcz1uZXcgS2J0LkNhbGxiYWNrU2V0LGUuX3BvaW50ZXJFeGl0Q2FsbGJhY2tzPW5ldyBLYnQuQ2FsbGJhY2tTZXQsZS5fbW91c2VNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5faGFuZGxlTW91c2VFdmVudCh0LG4pfSxlLl90b3VjaFN0YXJ0Q2FsbGJhY2s9ZnVuY3Rpb24odCxuLGkpe3JldHVybiBlLl9oYW5kbGVUb3VjaEV2ZW50KG5bdFswXV0saSl9LGV9cmV0dXJuIFhidC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLGUpLHRoaXMuX21vdXNlRGlzcGF0Y2hlcj0kYnQuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKSx0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spLHRoaXMuX3RvdWNoRGlzcGF0Y2hlcj0kYnQuVG91Y2guZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKSx0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayl9LGUucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spLHRoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsLHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyPW51bGx9LGUucHJvdG90eXBlLl9oYW5kbGVNb3VzZUV2ZW50PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fbW91c2VEaXNwYXRjaGVyLmV2ZW50SW5zaWRlKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8sZSk7dGhpcy5faGFuZGxlUG9pbnRlckV2ZW50KHQsbil9LGUucHJvdG90eXBlLl9oYW5kbGVUb3VjaEV2ZW50PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fdG91Y2hEaXNwYXRjaGVyLmV2ZW50SW5zaWRlKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8sZSk7dGhpcy5faGFuZGxlUG9pbnRlckV2ZW50KHQsbil9LGUucHJvdG90eXBlLl9oYW5kbGVQb2ludGVyRXZlbnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHQpLGk9dGhpcy5faXNJbnNpZGVDb21wb25lbnQobik7aSYmZT8odGhpcy5fb3ZlckNvbXBvbmVudHx8dGhpcy5fcG9pbnRlckVudGVyQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MobiksdGhpcy5fcG9pbnRlck1vdmVDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhuKSk6dGhpcy5fb3ZlckNvbXBvbmVudCYmdGhpcy5fcG9pbnRlckV4aXRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhuKSx0aGlzLl9vdmVyQ29tcG9uZW50PWkmJmV9LGUucHJvdG90eXBlLm9uUG9pbnRlckVudGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wb2ludGVyRW50ZXJDYWxsYmFja3MuYWRkKHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZlBvaW50ZXJFbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcG9pbnRlckVudGVyQ2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlLnByb3RvdHlwZS5vblBvaW50ZXJNb3ZlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wb2ludGVyTW92ZUNhbGxiYWNrcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUub2ZmUG9pbnRlck1vdmU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BvaW50ZXJNb3ZlQ2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlLnByb3RvdHlwZS5vblBvaW50ZXJFeGl0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wb2ludGVyRXhpdENhbGxiYWNrcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUub2ZmUG9pbnRlckV4aXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BvaW50ZXJFeGl0Q2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlfSkod2J0LkludGVyYWN0aW9uKTtZYnQuUG9pbnRlcj1aYnQsKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9dU87ZS5fX2V4cG9ydFN0YXIoYWJ0LHQpLGUuX19leHBvcnRTdGFyKEFidCx0KSxlLl9fZXhwb3J0U3RhcihJYnQsdCksZS5fX2V4cG9ydFN0YXIoQmJ0LHQpLGUuX19leHBvcnRTdGFyKFlidCx0KSx0Lnpvb21PdXQ9aXZ0Lnpvb21PdXR9KShvYnQpO3ZhciBKYnQ9e307IShmdW5jdGlvbih0KXsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBlLG49dU8saT1GZ3Qscj1CZ3Q7IShmdW5jdGlvbih0KXt0W3QuVkFMVUU9MF09IlZBTFVFIix0W3QuUElYRUw9MV09IlBJWEVMIn0pKGU9dC5Qcm9wZXJ0eU1vZGV8fCh0LlByb3BlcnR5TW9kZT17fSkpO3ZhciBvPShmdW5jdGlvbih0KXtmdW5jdGlvbiByKCl7dmFyIG49dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBuLl9ib3hWaXNpYmxlPSExLG4uX2JveEJvdW5kcz17dG9wTGVmdDp7eDowLHk6MH0sYm90dG9tUmlnaHQ6e3g6MCx5OjB9fSxuLl94Qm91bmRzTW9kZT1lLlBJWEVMLG4uX3lCb3VuZHNNb2RlPWUuUElYRUwsbi5hZGRDbGFzcygic2VsZWN0aW9uLWJveC1sYXllciIpLG4uX2FkanVzdEJvdW5kc0NhbGxiYWNrPWZ1bmN0aW9uKCl7bi5yZW5kZXIoKX0sbi5fb3ZlcmZsb3dIaWRkZW49ITAsbi5feEV4dGVudD1bdm9pZCAwLHZvaWQgMF0sbi5feUV4dGVudD1bdm9pZCAwLHZvaWQgMF0sbn1yZXR1cm4gbi5fX2V4dGVuZHMocix0KSxyLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKSx0aGlzLl9ib3g9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgic2VsZWN0aW9uLWJveCIsITApLnJlbW92ZSgpLHRoaXMuX2JveEFyZWE9dGhpcy5fYm94LmFwcGVuZCgicmVjdCIpLmNsYXNzZWQoInNlbGVjdGlvbi1hcmVhIiwhMCl9LHIucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJue3dpZHRoOnQsaGVpZ2h0OmV9fSxyLnByb3RvdHlwZS5ib3VuZHM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZ2V0Qm91bmRzKCk6KHRoaXMuX3NldEJvdW5kcyh0KSx0aGlzLl94Qm91bmRzTW9kZT1lLlBJWEVMLHRoaXMuX3lCb3VuZHNNb2RlPWUuUElYRUwsdGhpcy5yZW5kZXIoKSx0aGlzKX0sci5wcm90b3R5cGUuX3NldEJvdW5kcz1mdW5jdGlvbih0KXt2YXIgZT17eDpNYXRoLm1pbih0LnRvcExlZnQueCx0LmJvdHRvbVJpZ2h0LngpLHk6TWF0aC5taW4odC50b3BMZWZ0LnksdC5ib3R0b21SaWdodC55KX0sbj17eDpNYXRoLm1heCh0LnRvcExlZnQueCx0LmJvdHRvbVJpZ2h0LngpLHk6TWF0aC5tYXgodC50b3BMZWZ0LnksdC5ib3R0b21SaWdodC55KX07dGhpcy5fYm94Qm91bmRzPXt0b3BMZWZ0OmUsYm90dG9tUmlnaHQ6bn19LHIucHJvdG90eXBlLl9nZXRCb3VuZHM9ZnVuY3Rpb24oKXtyZXR1cm57dG9wTGVmdDp7eDp0aGlzLl94Qm91bmRzTW9kZT09PWUuUElYRUw/dGhpcy5fYm94Qm91bmRzLnRvcExlZnQueDpudWxsPT10aGlzLl94U2NhbGU/MDpNYXRoLm1pbih0aGlzLnhTY2FsZSgpLnNjYWxlKHRoaXMueEV4dGVudCgpWzBdKSx0aGlzLnhTY2FsZSgpLnNjYWxlKHRoaXMueEV4dGVudCgpWzFdKSkseTp0aGlzLl95Qm91bmRzTW9kZT09PWUuUElYRUw/dGhpcy5fYm94Qm91bmRzLnRvcExlZnQueTpudWxsPT10aGlzLl95U2NhbGU/MDpNYXRoLm1pbih0aGlzLnlTY2FsZSgpLnNjYWxlKHRoaXMueUV4dGVudCgpWzBdKSx0aGlzLnlTY2FsZSgpLnNjYWxlKHRoaXMueUV4dGVudCgpWzFdKSl9LGJvdHRvbVJpZ2h0Ont4OnRoaXMuX3hCb3VuZHNNb2RlPT09ZS5QSVhFTD90aGlzLl9ib3hCb3VuZHMuYm90dG9tUmlnaHQueDpudWxsPT10aGlzLl94U2NhbGU/MDpNYXRoLm1heCh0aGlzLnhTY2FsZSgpLnNjYWxlKHRoaXMueEV4dGVudCgpWzBdKSx0aGlzLnhTY2FsZSgpLnNjYWxlKHRoaXMueEV4dGVudCgpWzFdKSkseTp0aGlzLl95Qm91bmRzTW9kZT09PWUuUElYRUw/dGhpcy5fYm94Qm91bmRzLmJvdHRvbVJpZ2h0Lnk6bnVsbD09dGhpcy5feVNjYWxlPzA6TWF0aC5tYXgodGhpcy55U2NhbGUoKS5zY2FsZSh0aGlzLnlFeHRlbnQoKVswXSksdGhpcy55U2NhbGUoKS5zY2FsZSh0aGlzLnlFeHRlbnQoKVsxXSkpfX19LHIucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7aWYodC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKSx0aGlzLl9ib3hWaXNpYmxlKXt2YXIgZT10aGlzLmJvdW5kcygpLG49ZS50b3BMZWZ0Lnkscj1lLmJvdHRvbVJpZ2h0Lnksbz1lLnRvcExlZnQueCxhPWUuYm90dG9tUmlnaHQueDtpZighKGkuTWF0aC5pc1ZhbGlkTnVtYmVyKG4pJiZpLk1hdGguaXNWYWxpZE51bWJlcihyKSYmaS5NYXRoLmlzVmFsaWROdW1iZXIobykmJmkuTWF0aC5pc1ZhbGlkTnVtYmVyKGEpKSl0aHJvdyBuZXcgRXJyb3IoImJvdW5kcyBoYXZlIG5vdCBiZWVuIHByb3Blcmx5IHNldCIpO3RoaXMuX2JveEFyZWEuYXR0cnMoe3g6byx5Om4sd2lkdGg6YS1vLGhlaWdodDpyLW59KSx0aGlzLmNvbnRlbnQoKS5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fYm94Lm5vZGUoKSl9ZWxzZSB0aGlzLl9ib3gucmVtb3ZlKCk7cmV0dXJuIHRoaXN9LHIucHJvdG90eXBlLmJveFZpc2libGU9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fYm94VmlzaWJsZToodGhpcy5fYm94VmlzaWJsZT10LHRoaXMucmVuZGVyKCksdGhpcyl9LHIucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sci5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sci5wcm90b3R5cGUueFNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX3hTY2FsZToobnVsbCE9dGhpcy5feFNjYWxlJiZ0aGlzLl94U2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKSx0aGlzLl94U2NhbGU9dCx0aGlzLl94Qm91bmRzTW9kZT1lLlZBTFVFLHRoaXMuX3hTY2FsZS5vblVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayksdGhpcy5yZW5kZXIoKSx0aGlzKX0sci5wcm90b3R5cGUueVNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX3lTY2FsZToobnVsbCE9dGhpcy5feVNjYWxlJiZ0aGlzLl95U2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKSx0aGlzLl95U2NhbGU9dCx0aGlzLl95Qm91bmRzTW9kZT1lLlZBTFVFLHRoaXMuX3lTY2FsZS5vblVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayksdGhpcy5yZW5kZXIoKSx0aGlzKX0sci5wcm90b3R5cGUueEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9nZXRYRXh0ZW50KCk6KHRoaXMuX3NldFhFeHRlbnQodCksdGhpcy5feEJvdW5kc01vZGU9ZS5WQUxVRSx0aGlzLnJlbmRlcigpLHRoaXMpfSxyLnByb3RvdHlwZS5fZ2V0WEV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl94Qm91bmRzTW9kZT09PWUuVkFMVUU/dGhpcy5feEV4dGVudDpudWxsPT10aGlzLl94U2NhbGU/W3ZvaWQgMCx2b2lkIDBdOlt0aGlzLl94U2NhbGUuaW52ZXJ0KHRoaXMuX2JveEJvdW5kcy50b3BMZWZ0LngpLHRoaXMuX3hTY2FsZS5pbnZlcnQodGhpcy5fYm94Qm91bmRzLmJvdHRvbVJpZ2h0LngpXX0sci5wcm90b3R5cGUuX3NldFhFeHRlbnQ9ZnVuY3Rpb24odCl7dGhpcy5feEV4dGVudD10fSxyLnByb3RvdHlwZS55RXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2dldFlFeHRlbnQoKToodGhpcy5fc2V0WUV4dGVudCh0KSx0aGlzLl95Qm91bmRzTW9kZT1lLlZBTFVFLHRoaXMucmVuZGVyKCksdGhpcyl9LHIucHJvdG90eXBlLl9nZXRZRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3lCb3VuZHNNb2RlPT09ZS5WQUxVRT90aGlzLl95RXh0ZW50Om51bGw9PXRoaXMuX3lTY2FsZT9bdm9pZCAwLHZvaWQgMF06W3RoaXMuX3lTY2FsZS5pbnZlcnQodGhpcy5fYm94Qm91bmRzLnRvcExlZnQueSksdGhpcy5feVNjYWxlLmludmVydCh0aGlzLl9ib3hCb3VuZHMuYm90dG9tUmlnaHQueSldfSxyLnByb3RvdHlwZS5fc2V0WUV4dGVudD1mdW5jdGlvbih0KXt0aGlzLl95RXh0ZW50PXR9LHIucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyksbnVsbCE9dGhpcy5feFNjYWxlJiZ0aGlzLnhTY2FsZSgpLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayksbnVsbCE9dGhpcy5feVNjYWxlJiZ0aGlzLnlTY2FsZSgpLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayl9LHJ9KShyLkNvbXBvbmVudCk7dC5TZWxlY3Rpb25Cb3hMYXllcj1vfSkoSmJ0KSwKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHJidCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFFidD11Tyx0eHQ9b2J0LGV4dD1GZ3Qsbnh0PWJtdCxpeHQ9aWJ0LHJ4dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gZS5fZGV0ZWN0aW9uUmFkaXVzPTMsZS5fcmVzaXphYmxlPSExLGUuX21vdmFibGU9ITEsZS5faGFzQ29ybmVycz0hMCxlLmFkZENsYXNzKCJkcmFnLWJveC1sYXllciIpLGUuX2RyYWdJbnRlcmFjdGlvbj1uZXcgdHh0LkRyYWcsZS5fc2V0VXBDYWxsYmFja3MoKSxlLl9kcmFnSW50ZXJhY3Rpb24uYXR0YWNoVG8oZSksZS5fZHJhZ1N0YXJ0Q2FsbGJhY2tzPW5ldyBleHQuQ2FsbGJhY2tTZXQsZS5fZHJhZ0NhbGxiYWNrcz1uZXcgZXh0LkNhbGxiYWNrU2V0LGUuX2RyYWdFbmRDYWxsYmFja3M9bmV3IGV4dC5DYWxsYmFja1NldCxlfXJldHVybiBRYnQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX3NldFVwQ2FsbGJhY2tzPWZ1bmN0aW9uKCl7dmFyIHQsZSxuLGkscj10aGlzLG89MCxhPWZ1bmN0aW9uKGEpe3Q9ci5fZ2V0UmVzaXppbmdFZGdlcyhhKTt2YXIgcz1yLmJvdW5kcygpLGw9cy50b3BMZWZ0Lng8PWEueCYmYS54PD1zLmJvdHRvbVJpZ2h0LngmJnMudG9wTGVmdC55PD1hLnkmJmEueTw9cy5ib3R0b21SaWdodC55O3IuYm94VmlzaWJsZSgpJiYodC50b3B8fHQuYm90dG9tfHx0LmxlZnR8fHQucmlnaHQpP289MTpyLmJveFZpc2libGUoKSYmci5tb3ZhYmxlKCkmJmw/bz0yOihvPTAsci5fc2V0Qm91bmRzKHt0b3BMZWZ0OmEsYm90dG9tUmlnaHQ6YX0pLHIuX3hCb3VuZHNNb2RlPT09aXh0LlByb3BlcnR5TW9kZS5WQUxVRSYmbnVsbCE9ci54U2NhbGUoKSYmci5fc2V0WEV4dGVudChbci54U2NhbGUoKS5pbnZlcnQoYS54KSxyLnhTY2FsZSgpLmludmVydChhLngpXSksci5feUJvdW5kc01vZGU9PT1peHQuUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT1yLnlTY2FsZSgpJiZyLl9zZXRZRXh0ZW50KFtyLnlTY2FsZSgpLmludmVydChhLnkpLHIueVNjYWxlKCkuaW52ZXJ0KGEueSldKSxyLnJlbmRlcigpKSxyLmJveFZpc2libGUoITApLHM9ci5ib3VuZHMoKSxlPXt4OnMudG9wTGVmdC54LHk6cy50b3BMZWZ0Lnl9LG49e3g6cy5ib3R0b21SaWdodC54LHk6cy5ib3R0b21SaWdodC55fSxpPWEsci5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3Mocyl9LHM9ZnVuY3Rpb24oYSxzKXtzd2l0Y2gobyl7Y2FzZSAwOm4ueD1zLngsbi55PXMueTticmVhaztjYXNlIDE6dC5ib3R0b20/bi55PXMueTp0LnRvcCYmKGUueT1zLnkpLHQucmlnaHQ/bi54PXMueDp0LmxlZnQmJihlLng9cy54KTticmVhaztjYXNlIDI6dmFyIGw9cy54LWkueCxjPXMueS1pLnk7ZS54Kz1sLGUueSs9YyxuLngrPWwsbi55Kz1jLGk9c31yLl9zZXRCb3VuZHMoe3RvcExlZnQ6ZSxib3R0b21SaWdodDpufSksci5feEJvdW5kc01vZGU9PT1peHQuUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT1yLnhTY2FsZSgpJiZyLl9zZXRYRXh0ZW50KFtyLnhTY2FsZSgpLmludmVydChlLngpLHIueFNjYWxlKCkuaW52ZXJ0KG4ueCldKSxyLl95Qm91bmRzTW9kZT09PWl4dC5Qcm9wZXJ0eU1vZGUuVkFMVUUmJm51bGwhPXIueVNjYWxlKCkmJnIuX3NldFlFeHRlbnQoW3IueVNjYWxlKCkuaW52ZXJ0KGUueSksci55U2NhbGUoKS5pbnZlcnQobi55KV0pLHIucmVuZGVyKCksci5fZHJhZ0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHIuYm91bmRzKCkpfSxsPWZ1bmN0aW9uKHQsZSl7MD09PW8mJnQueD09PWUueCYmdC55PT09ZS55JiZyLmJveFZpc2libGUoITEpLHIuX2RyYWdFbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhyLmJvdW5kcygpKX07dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ1N0YXJ0KGEpLHRoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWcocyksdGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZChsKSx0aGlzLl9kaXNjb25uZWN0SW50ZXJhY3Rpb249ZnVuY3Rpb24oKXtyLl9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZ1N0YXJ0KGEpLHIuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnKHMpLHIuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnRW5kKGwpLHIuX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKX19LGUucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dmFyIG49ZnVuY3Rpb24oKXtyZXR1cm4gZS5fYm94LmFwcGVuZCgibGluZSIpLnN0eWxlcyh7b3BhY2l0eTowLHN0cm9rZToicGluayIsInBvaW50ZXItZXZlbnRzIjoidmlzaWJsZVN0cm9rZSJ9KX07aWYodGhpcy5fZGV0ZWN0aW9uRWRnZVQ9bigpLmNsYXNzZWQoImRyYWctZWRnZS10YiIsITApLHRoaXMuX2RldGVjdGlvbkVkZ2VCPW4oKS5jbGFzc2VkKCJkcmFnLWVkZ2UtdGIiLCEwKSx0aGlzLl9kZXRlY3Rpb25FZGdlTD1uKCkuY2xhc3NlZCgiZHJhZy1lZGdlLWxyIiwhMCksdGhpcy5fZGV0ZWN0aW9uRWRnZVI9bigpLmNsYXNzZWQoImRyYWctZWRnZS1sciIsITApLHRoaXMuX2hhc0Nvcm5lcnMpe3ZhciBpPWZ1bmN0aW9uKCl7cmV0dXJuIGUuX2JveC5hcHBlbmQoImNpcmNsZSIpLnN0eWxlcyh7b3BhY2l0eTowLGZpbGw6InBpbmsiLCJwb2ludGVyLWV2ZW50cyI6InZpc2libGVGaWxsIn0pfTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJUTD1pKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItdGwiLCEwKSx0aGlzLl9kZXRlY3Rpb25Db3JuZXJUUj1pKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItdHIiLCEwKSx0aGlzLl9kZXRlY3Rpb25Db3JuZXJCTD1pKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItYmwiLCEwKSx0aGlzLl9kZXRlY3Rpb25Db3JuZXJCUj1pKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItYnIiLCEwKX19LGUucHJvdG90eXBlLl9nZXRSZXNpemluZ0VkZ2VzPWZ1bmN0aW9uKHQpe3ZhciBlPXt0b3A6ITEsYm90dG9tOiExLGxlZnQ6ITEscmlnaHQ6ITF9O2lmKCF0aGlzLnJlc2l6YWJsZSgpKXJldHVybiBlO3ZhciBuPXRoaXMuYm91bmRzKCksaT1uLnRvcExlZnQueSxyPW4uYm90dG9tUmlnaHQueSxvPW4udG9wTGVmdC54LGE9bi5ib3R0b21SaWdodC54LHM9dGhpcy5fZGV0ZWN0aW9uUmFkaXVzO3JldHVybiBvLXM8PXQueCYmdC54PD1hK3MmJihlLnRvcD1pLXM8PXQueSYmdC55PD1pK3MsZS5ib3R0b209ci1zPD10LnkmJnQueTw9citzKSxpLXM8PXQueSYmdC55PD1yK3MmJihlLmxlZnQ9by1zPD10LngmJnQueDw9bytzLGUucmlnaHQ9YS1zPD10LngmJnQueDw9YStzKSxlfSxlLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe2lmKHQucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyksdGhpcy5ib3hWaXNpYmxlKCkpe3ZhciBlPXRoaXMuYm91bmRzKCksbj1lLnRvcExlZnQueSxpPWUuYm90dG9tUmlnaHQueSxyPWUudG9wTGVmdC54LG89ZS5ib3R0b21SaWdodC54O3RoaXMuX2RldGVjdGlvbkVkZ2VULmF0dHJzKHt4MTpyLHkxOm4seDI6byx5MjpuLCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSksdGhpcy5fZGV0ZWN0aW9uRWRnZUIuYXR0cnMoe3gxOnIseTE6aSx4MjpvLHkyOmksInN0cm9rZS13aWR0aCI6Mip0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSx0aGlzLl9kZXRlY3Rpb25FZGdlTC5hdHRycyh7eDE6cix5MTpuLHgyOnIseTI6aSwic3Ryb2tlLXdpZHRoIjoyKnRoaXMuX2RldGVjdGlvblJhZGl1c30pLHRoaXMuX2RldGVjdGlvbkVkZ2VSLmF0dHJzKHt4MTpvLHkxOm4seDI6byx5MjppLCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSksdGhpcy5faGFzQ29ybmVycyYmKHRoaXMuX2RldGVjdGlvbkNvcm5lclRMLmF0dHJzKHtjeDpyLGN5Om4scjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSx0aGlzLl9kZXRlY3Rpb25Db3JuZXJUUi5hdHRycyh7Y3g6byxjeTpuLHI6dGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSksdGhpcy5fZGV0ZWN0aW9uQ29ybmVyQkwuYXR0cnMoe2N4OnIsY3k6aSxyOnRoaXMuX2RldGVjdGlvblJhZGl1c30pLHRoaXMuX2RldGVjdGlvbkNvcm5lckJSLmF0dHJzKHtjeDpvLGN5Omkscjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSl9cmV0dXJuIHRoaXN9LGUucHJvdG90eXBlLmRldGVjdGlvblJhZGl1cz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9kZXRlY3Rpb25SYWRpdXM7aWYodDwwKXRocm93IG5ldyBFcnJvcigiZGV0ZWN0aW9uIHJhZGl1cyBjYW5ub3QgYmUgbmVnYXRpdmUuIik7cmV0dXJuIHRoaXMuX2RldGVjdGlvblJhZGl1cz10LHRoaXMucmVuZGVyKCksdGhpc30sZS5wcm90b3R5cGUucmVzaXphYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX3Jlc2l6YWJsZToodGhpcy5fcmVzaXphYmxlPXQsdGhpcy5fc2V0UmVzaXphYmxlQ2xhc3Nlcyh0KSx0aGlzKX0sZS5wcm90b3R5cGUuX3NldFJlc2l6YWJsZUNsYXNzZXM9ZnVuY3Rpb24odCl7dCYmdGhpcy5lbmFibGVkKCk/KHRoaXMuYWRkQ2xhc3MoIngtcmVzaXphYmxlIiksdGhpcy5hZGRDbGFzcygieS1yZXNpemFibGUiKSk6KHRoaXMucmVtb3ZlQ2xhc3MoIngtcmVzaXphYmxlIiksdGhpcy5yZW1vdmVDbGFzcygieS1yZXNpemFibGUiKSl9LGUucHJvdG90eXBlLm1vdmFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fbW92YWJsZToodGhpcy5fbW92YWJsZT10LHRoaXMuX3NldE1vdmFibGVDbGFzcygpLHRoaXMpfSxlLnByb3RvdHlwZS5fc2V0TW92YWJsZUNsYXNzPWZ1bmN0aW9uKCl7dGhpcy5tb3ZhYmxlKCkmJnRoaXMuZW5hYmxlZCgpP3RoaXMuYWRkQ2xhc3MoIm1vdmFibGUiKTp0aGlzLnJlbW92ZUNsYXNzKCJtb3ZhYmxlIil9LGUucHJvdG90eXBlLm9uRHJhZ1N0YXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuYWRkKHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZkRyYWdTdGFydD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlLnByb3RvdHlwZS5vbkRyYWc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RyYWdDYWxsYmFja3MuYWRkKHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZkRyYWc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RyYWdDYWxsYmFja3MuZGVsZXRlKHQpLHRoaXN9LGUucHJvdG90eXBlLm9uRHJhZ0VuZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUub2ZmRHJhZ0VuZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUodCksdGhpc30sZS5wcm90b3R5cGUuZHJhZ0ludGVyYWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdJbnRlcmFjdGlvbn0sZS5wcm90b3R5cGUuZW5hYmxlZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9kcmFnSW50ZXJhY3Rpb24uZW5hYmxlZCgpOih0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZW5hYmxlZCh0KSx0aGlzLl9zZXRSZXNpemFibGVDbGFzc2VzKHRoaXMucmVzaXphYmxlKCkpLHRoaXMuX3NldE1vdmFibGVDbGFzcygpLHRoaXMpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyksdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZSh0KX0pKSx0aGlzLl9kcmFnQ2FsbGJhY2tzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZSh0KX0pKSx0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZSh0KX0pKSx0aGlzLl9kaXNjb25uZWN0SW50ZXJhY3Rpb24oKX0sZS5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc2V0U3RhdGUoKSx0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCksdC5wcm90b3R5cGUuZGV0YWNoLmNhbGwodGhpcyksdGhpc30sZS5wcm90b3R5cGUuYW5jaG9yPWZ1bmN0aW9uKGUpe3JldHVybiBlPW54dC5jb2VyY2VFeHRlcm5hbEQzKGUpLHRoaXMuX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyh0aGlzKSx0LnByb3RvdHlwZS5hbmNob3IuY2FsbCh0aGlzLGUpLHRoaXN9LGUucHJvdG90eXBlLl9yZXNldFN0YXRlPWZ1bmN0aW9uKCl7dGhpcy5ib3VuZHMoe3RvcExlZnQ6e3g6MCx5OjB9LGJvdHRvbVJpZ2h0Ont4OjAseTowfX0pfSxlfSkoSmJ0LlNlbGVjdGlvbkJveExheWVyKTtyYnQuRHJhZ0JveExheWVyPXJ4dDt2YXIgb3h0PXt9LGF4dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KGF4dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHN4dCxseHQ9dU8sY3h0PUZndCx1eHQ9Qmd0OyEoZnVuY3Rpb24odCl7dFt0LlZBTFVFPTBdPSJWQUxVRSIsdFt0LlBJWEVMPTFdPSJQSVhFTCJ9KShzeHR8fChzeHQ9e30pKTt2YXIgaHh0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciBpPXQuY2FsbCh0aGlzKXx8dGhpcztpZihpLl9tb2RlPXN4dC5WQUxVRSxuIT09ZS5PUklFTlRBVElPTl9WRVJUSUNBTCYmbiE9PWUuT1JJRU5UQVRJT05fSE9SSVpPTlRBTCl0aHJvdyBuZXcgRXJyb3IobisiIGlzIG5vdCBhIHZhbGlkIG9yaWVudGF0aW9uIGZvciBHdWlkZUxpbmVMYXllciIpO3JldHVybiBpLl9vcmllbnRhdGlvbj1uLGkuX292ZXJmbG93SGlkZGVuPSEwLGkuYWRkQ2xhc3MoImd1aWRlLWxpbmUtbGF5ZXIiKSxpLl9pc1ZlcnRpY2FsKCk/aS5hZGRDbGFzcygidmVydGljYWwiKTppLmFkZENsYXNzKCJob3Jpem9udGFsIiksaS5fc2NhbGVVcGRhdGVDYWxsYmFjaz1mdW5jdGlvbigpe2kuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWUoKSxpLnJlbmRlcigpfSxpfXJldHVybiBseHQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyksdGhpcy5fZ3VpZGVMaW5lPXRoaXMuY29udGVudCgpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImd1aWRlLWxpbmUiLCEwKX0sZS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm57d2lkdGg6dCxoZWlnaHQ6ZX19LGUucHJvdG90eXBlLl9pc1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGF0aW9uPT09ZS5PUklFTlRBVElPTl9WRVJUSUNBTH0sZS5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiEwfSxlLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiEwfSxlLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKGUsbixpKXtyZXR1cm4gdC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsZSxuLGkpLG51bGwhPXRoaXMuc2NhbGUoKSYmKHRoaXMuX2lzVmVydGljYWwoKT90aGlzLnNjYWxlKCkucmFuZ2UoWzAsdGhpcy53aWR0aCgpXSk6dGhpcy5zY2FsZSgpLnJhbmdlKFt0aGlzLmhlaWdodCgpLDBdKSksdGhpc30sZS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtyZXR1cm4gdC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKSx0aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCksdGhpcy5fZ3VpZGVMaW5lLmF0dHJzKHt4MTp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6MCx5MTp0aGlzLl9pc1ZlcnRpY2FsKCk/MDp0aGlzLnBpeGVsUG9zaXRpb24oKSx4Mjp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6dGhpcy53aWR0aCgpLHkyOnRoaXMuX2lzVmVydGljYWwoKT90aGlzLmhlaWdodCgpOnRoaXMucGl4ZWxQb3NpdGlvbigpfSksdGhpc30sZS5wcm90b3R5cGUuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWU9ZnVuY3Rpb24oKXtudWxsIT10aGlzLnNjYWxlKCkmJih0aGlzLl9tb2RlPT09c3h0LlZBTFVFJiZudWxsIT10aGlzLnZhbHVlKCk/dGhpcy5fcGl4ZWxQb3NpdGlvbj10aGlzLnNjYWxlKCkuc2NhbGUodGhpcy52YWx1ZSgpKTp0aGlzLl9tb2RlPT09c3h0LlBJWEVMJiZudWxsIT10aGlzLnBpeGVsUG9zaXRpb24oKSYmKHRoaXMuX3ZhbHVlPXRoaXMuc2NhbGUoKS5pbnZlcnQodGhpcy5waXhlbFBvc2l0aW9uKCkpKSl9LGUucHJvdG90eXBlLl9zZXRQaXhlbFBvc2l0aW9uV2l0aG91dENoYW5naW5nTW9kZT1mdW5jdGlvbih0KXt0aGlzLl9waXhlbFBvc2l0aW9uPXQsbnVsbCE9dGhpcy5zY2FsZSgpJiYodGhpcy5fdmFsdWU9dGhpcy5zY2FsZSgpLmludmVydCh0aGlzLnBpeGVsUG9zaXRpb24oKSkpLHRoaXMucmVuZGVyKCl9LGUucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3NjYWxlO3ZhciBlPXRoaXMuX3NjYWxlO3JldHVybiBudWxsIT1lJiZlLm9mZlVwZGF0ZSh0aGlzLl9zY2FsZVVwZGF0ZUNhbGxiYWNrKSx0aGlzLl9zY2FsZT10LHRoaXMuX3NjYWxlLm9uVXBkYXRlKHRoaXMuX3NjYWxlVXBkYXRlQ2FsbGJhY2spLHRoaXMuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWUoKSx0aGlzLnJlZHJhdygpLHRoaXN9LGUucHJvdG90eXBlLnZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX3ZhbHVlOih0aGlzLl92YWx1ZT10LHRoaXMuX21vZGU9c3h0LlZBTFVFLHRoaXMuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWUoKSx0aGlzLnJlbmRlcigpLHRoaXMpfSxlLnByb3RvdHlwZS5waXhlbFBvc2l0aW9uPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3BpeGVsUG9zaXRpb247aWYoIWN4dC5NYXRoLmlzVmFsaWROdW1iZXIodCkpdGhyb3cgbmV3IEVycm9yKCJwaXhlbFBvc2l0aW9uIG11c3QgYmUgYSBmaW5pdGUgbnVtYmVyIik7cmV0dXJuIHRoaXMuX3BpeGVsUG9zaXRpb249dCx0aGlzLl9tb2RlPXN4dC5QSVhFTCx0aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCksdGhpcy5yZW5kZXIoKSx0aGlzfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpLG51bGwhPXRoaXMuc2NhbGUoKSYmdGhpcy5zY2FsZSgpLm9mZlVwZGF0ZSh0aGlzLl9zY2FsZVVwZGF0ZUNhbGxiYWNrKX0sZS5PUklFTlRBVElPTl9WRVJUSUNBTD0idmVydGljYWwiLGUuT1JJRU5UQVRJT05fSE9SSVpPTlRBTD0iaG9yaXpvbnRhbCIsZX0pKHV4dC5Db21wb25lbnQpO2F4dC5HdWlkZUxpbmVMYXllcj1oeHQsCi8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShveHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBkeHQ9dU8scHh0PW9idCxmeHQ9Rmd0LG14dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10LmNhbGwodGhpcyxlKXx8dGhpcztuLl9kZXRlY3Rpb25SYWRpdXM9MyxuLl9lbmFibGVkPSEwLG4uYWRkQ2xhc3MoImRyYWctbGluZS1sYXllciIpLG4uYWRkQ2xhc3MoImVuYWJsZWQiKSxuLl9kcmFnSW50ZXJhY3Rpb249bmV3IHB4dC5EcmFnLG4uX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyhuKTt2YXIgaT0hMSxyPWZ1bmN0aW9uKHQpeyhmdW5jdGlvbih0KXtyZXR1cm4gbi5faXNWZXJ0aWNhbCgpJiZuLnBpeGVsUG9zaXRpb24oKS1uLmRldGVjdGlvblJhZGl1cygpPD10LngmJnQueDw9bi5waXhlbFBvc2l0aW9uKCkrbi5kZXRlY3Rpb25SYWRpdXMoKXx8IW4uX2lzVmVydGljYWwoKSYmbi5waXhlbFBvc2l0aW9uKCktbi5kZXRlY3Rpb25SYWRpdXMoKTw9dC55JiZ0Lnk8PW4ucGl4ZWxQb3NpdGlvbigpK24uZGV0ZWN0aW9uUmFkaXVzKCl9KSh0KSYmKGk9ITAsbi5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3MobikpfTtuLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQocik7dmFyIG89ZnVuY3Rpb24odCxlKXtpJiYobi5fc2V0UGl4ZWxQb3NpdGlvbldpdGhvdXRDaGFuZ2luZ01vZGUobi5faXNWZXJ0aWNhbCgpP2UueDplLnkpLG4uX2RyYWdDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhuKSl9O24uX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWcobyk7dmFyIGE9ZnVuY3Rpb24odCxlKXtpJiYoaT0hMSxuLl9kcmFnRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MobikpfTtyZXR1cm4gbi5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZChhKSxuLl9kaXNjb25uZWN0SW50ZXJhY3Rpb249ZnVuY3Rpb24oKXtuLl9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZ1N0YXJ0KHIpLG4uX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnKG8pLG4uX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnRW5kKGEpLG4uX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKX0sbi5fZHJhZ1N0YXJ0Q2FsbGJhY2tzPW5ldyBmeHQuQ2FsbGJhY2tTZXQsbi5fZHJhZ0NhbGxiYWNrcz1uZXcgZnh0LkNhbGxiYWNrU2V0LG4uX2RyYWdFbmRDYWxsYmFja3M9bmV3IGZ4dC5DYWxsYmFja1NldCxufXJldHVybiBkeHQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyksdGhpcy5fZGV0ZWN0aW9uRWRnZT10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImxpbmUiKS5zdHlsZXMoe29wYWNpdHk6MCxzdHJva2U6InBpbmsiLCJwb2ludGVyLWV2ZW50cyI6InZpc2libGVTdHJva2UifSkuY2xhc3NlZCgiZHJhZy1lZGdlIiwhMCl9LGUucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyksdGhpcy5fZGV0ZWN0aW9uRWRnZS5hdHRycyh7eDE6dGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMucGl4ZWxQb3NpdGlvbigpOjAseTE6dGhpcy5faXNWZXJ0aWNhbCgpPzA6dGhpcy5waXhlbFBvc2l0aW9uKCkseDI6dGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMucGl4ZWxQb3NpdGlvbigpOnRoaXMud2lkdGgoKSx5Mjp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLnBpeGVsUG9zaXRpb24oKSwic3Ryb2tlLXdpZHRoIjoyKnRoaXMuX2RldGVjdGlvblJhZGl1c30pLHRoaXN9LGUucHJvdG90eXBlLmRldGVjdGlvblJhZGl1cz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9kZXRlY3Rpb25SYWRpdXM7aWYodDwwKXRocm93IG5ldyBFcnJvcigiZGV0ZWN0aW9uIHJhZGl1cyBjYW5ub3QgYmUgbmVnYXRpdmUuIik7cmV0dXJuIHRoaXMuX2RldGVjdGlvblJhZGl1cz10LHRoaXMucmVuZGVyKCksdGhpc30sZS5wcm90b3R5cGUuZW5hYmxlZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9lbmFibGVkOih0aGlzLl9lbmFibGVkPXQsdD90aGlzLmFkZENsYXNzKCJlbmFibGVkIik6dGhpcy5yZW1vdmVDbGFzcygiZW5hYmxlZCIpLHRoaXMuX2RyYWdJbnRlcmFjdGlvbi5lbmFibGVkKHQpLHRoaXMpfSxlLnByb3RvdHlwZS5vbkRyYWdTdGFydD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmFkZCh0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZEcmFnU3RhcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUodCksdGhpc30sZS5wcm90b3R5cGUub25EcmFnPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kcmFnQ2FsbGJhY2tzLmFkZCh0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZEcmFnPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlLnByb3RvdHlwZS5vbkRyYWdFbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RyYWdFbmRDYWxsYmFja3MuYWRkKHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZkRyYWdFbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RyYWdFbmRDYWxsYmFja3MuZGVsZXRlKHQpLHRoaXN9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3QucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKSx0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUodCl9KSksdGhpcy5fZHJhZ0NhbGxiYWNrcy5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fZHJhZ0NhbGxiYWNrcy5kZWxldGUodCl9KSksdGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUodCl9KSksdGhpcy5fZGlzY29ubmVjdEludGVyYWN0aW9uKCl9LGV9KShheHQuR3VpZGVMaW5lTGF5ZXIpO294dC5EcmFnTGluZUxheWVyPW14dDt2YXIgZ3h0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShneHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBfeHQ9dU87ZnVuY3Rpb24geXh0KHQsZSxuKXt2YXIgaT17fTtpZih2b2lkIDAhPT1uKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKWlbbltyXV09bltyLTFdO3JldHVybiBmdW5jdGlvbihuKXt2YXIgcixvPXQuc2NhbGUobik7aWYoIWUpcmV0dXJuIG87dmFyIGE9dm9pZCAwPT09aVtuXT92b2lkIDA6dC5zY2FsZShpW25dKTtyZXR1cm4gdm9pZCAwIT09YSYmKHI9YSsoby1hKS8yKSxyfX12YXIgdnh0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7dmFyIGk9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBpLmFkZENsYXNzKCJncmlkbGluZXMiKSxpLl94U2NhbGU9ZSxpLl95U2NhbGU9bixpLl9yZW5kZXJDYWxsYmFjaz1mdW5jdGlvbih0KXtyZXR1cm4gaS5yZW5kZXIoKX0saS5feFNjYWxlJiZpLl94U2NhbGUub25VcGRhdGUoaS5fcmVuZGVyQ2FsbGJhY2spLGkuX3lTY2FsZSYmaS5feVNjYWxlLm9uVXBkYXRlKGkuX3JlbmRlckNhbGxiYWNrKSxpfXJldHVybiBfeHQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuYmV0d2Vlblg9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQ/dGhpcy5fYmV0d2Vlblg6KHQhPT10aGlzLl9iZXR3ZWVuWCYmKHRoaXMuX2JldHdlZW5YPXQsdGhpcy5yZW5kZXIoKSksdGhpcyl9LGUucHJvdG90eXBlLmJldHdlZW5ZPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10P3RoaXMuX2JldHdlZW5ZOih0IT09dGhpcy5fYmV0d2VlblkmJih0aGlzLl9iZXR3ZWVuWT10LHRoaXMucmVuZGVyKCkpLHRoaXMpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKSx0aGlzLl94U2NhbGUmJnRoaXMuX3hTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spLHRoaXMuX3lTY2FsZSYmdGhpcy5feVNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZW5kZXJDYWxsYmFjayksdGhpc30sZS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyksdGhpcy5feExpbmVzQ29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoIngtZ3JpZGxpbmVzIiwhMCksdGhpcy5feUxpbmVzQ29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoInktZ3JpZGxpbmVzIiwhMCl9LGUucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyksdGhpcy5fcmVkcmF3WExpbmVzKCksdGhpcy5fcmVkcmF3WUxpbmVzKCksdGhpc30sZS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihlLG4saSl7cmV0dXJuIHQucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLGUsbixpKSxudWxsIT10aGlzLl94U2NhbGUmJnRoaXMuX3hTY2FsZS5yYW5nZShbMCx0aGlzLndpZHRoKCldKSxudWxsIT10aGlzLl95U2NhbGUmJnRoaXMuX3lTY2FsZS5yYW5nZShbdGhpcy5oZWlnaHQoKSwwXSksdGhpc30sZS5wcm90b3R5cGUuX3JlZHJhd1hMaW5lcz1mdW5jdGlvbigpe2lmKHRoaXMuX3hTY2FsZSl7dmFyIHQ9dGhpcy5iZXR3ZWVuWCgpLGU9dGhpcy5feFNjYWxlLnRpY2tzKCkuc2xpY2UodD8xOjApLG49dGhpcy5feExpbmVzQ29udGFpbmVyLnNlbGVjdEFsbCgibGluZSIpLmRhdGEoZSk7bi5lbnRlcigpLmFwcGVuZCgibGluZSIpLm1lcmdlKG4pLmF0dHIoIngxIix5eHQodGhpcy5feFNjYWxlLHQsdGhpcy5feFNjYWxlLnRpY2tzKCkpKS5hdHRyKCJ5MSIsMCkuYXR0cigieDIiLHl4dCh0aGlzLl94U2NhbGUsdCx0aGlzLl94U2NhbGUudGlja3MoKSkpLmF0dHIoInkyIix0aGlzLmhlaWdodCgpKS5jbGFzc2VkKCJiZXR3ZWVubGluZSIsdCkuY2xhc3NlZCgiemVyb2xpbmUiLChmdW5jdGlvbih0KXtyZXR1cm4gMD09PXR9KSksbi5leGl0KCkucmVtb3ZlKCl9fSxlLnByb3RvdHlwZS5fcmVkcmF3WUxpbmVzPWZ1bmN0aW9uKCl7aWYodGhpcy5feVNjYWxlKXt2YXIgdD10aGlzLmJldHdlZW5ZKCksZT10aGlzLl95U2NhbGUudGlja3MoKS5zbGljZSh0PzE6MCksbj10aGlzLl95TGluZXNDb250YWluZXIuc2VsZWN0QWxsKCJsaW5lIikuZGF0YShlKTtuLmVudGVyKCkuYXBwZW5kKCJsaW5lIikubWVyZ2UobikuYXR0cigieDEiLDApLmF0dHIoInkxIix5eHQodGhpcy5feVNjYWxlLHQsdGhpcy5feVNjYWxlLnRpY2tzKCkpKS5hdHRyKCJ4MiIsdGhpcy53aWR0aCgpKS5hdHRyKCJ5MiIseXh0KHRoaXMuX3lTY2FsZSx0LHRoaXMuX3lTY2FsZS50aWNrcygpKSkuY2xhc3NlZCgiYmV0d2VlbmxpbmUiLHQpLmNsYXNzZWQoInplcm9saW5lIiwoZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10fSkpLG4uZXhpdCgpLnJlbW92ZSgpfX0sZX0pKEJndC5Db21wb25lbnQpO2d4dC5HcmlkbGluZXM9dnh0O3ZhciBieHQ9e30seHh0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoeHh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgd3h0PXVPLFN4dD1ibXQsTXh0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBlLl9kZXRhY2hDYWxsYmFjaz1mdW5jdGlvbih0KXtyZXR1cm4gZS5yZW1vdmUodCl9LGV9cmV0dXJuIHd4dC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5hbmNob3I9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztyZXR1cm4gZT1TeHQuY29lcmNlRXh0ZXJuYWxEMyhlKSx0LnByb3RvdHlwZS5hbmNob3IuY2FsbCh0aGlzLGUpLHRoaXMuX2ZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiB0LmFuY2hvcihuLmVsZW1lbnQoKSl9KSksdGhpc30sZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlbmRlcigpfSkpLHRoaXN9LGUucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoImhhcygpIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiBDb21wb25lbnRDb250YWluZXIiKX0sZS5wcm90b3R5cGUuX2Fkb3B0QW5kQW5jaG9yPWZ1bmN0aW9uKHQpe3QucGFyZW50KHRoaXMpLHQub25EZXRhY2godGhpcy5fZGV0YWNoQ2FsbGJhY2spLHRoaXMuX2lzQW5jaG9yZWQmJnQuYW5jaG9yKHRoaXMuZWxlbWVudCgpKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmhhcyh0KSYmKHQub2ZmRGV0YWNoKHRoaXMuX2RldGFjaENhbGxiYWNrKSx0aGlzLl9yZW1vdmUodCksdC5kZXRhY2goKSx0aGlzLnJlZHJhdygpKSx0aGlzfSxlLnByb3RvdHlwZS5fcmVtb3ZlPWZ1bmN0aW9uKHQpe3JldHVybiExfSxlLnByb3RvdHlwZS5fZm9yRWFjaD1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoIl9mb3JFYWNoKCkgaXMgbm90IGltcGxlbWVudGVkIG9uIENvbXBvbmVudENvbnRhaW5lciIpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpLHRoaXMuX2ZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiB0LmRlc3Ryb3koKX0pKX0sZS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dGhpcy5fZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuaW52YWxpZGF0ZUNhY2hlKCl9KSl9LGV9KShCZ3QuQ29tcG9uZW50KTt4eHQuQ29tcG9uZW50Q29udGFpbmVyPU14dCwKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KGJ4dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIEV4dD11TyxUeHQ9Rmd0LEN4dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT1bXSk7dmFyIG49dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBuLl9jb21wb25lbnRzPVtdLG4uYWRkQ2xhc3MoImNvbXBvbmVudC1ncm91cCIpLGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIG4uYXBwZW5kKHQpfSkpLG59cmV0dXJuIEV4dC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fZm9yRWFjaD1mdW5jdGlvbih0KXt0aGlzLmNvbXBvbmVudHMoKS5mb3JFYWNoKHQpfSxlLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudHMuaW5kZXhPZih0KT49MH0sZS5wcm90b3R5cGUucmVxdWVzdGVkU3BhY2U9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9jb21wb25lbnRzLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIG4ucmVxdWVzdGVkU3BhY2UodCxlKX0pKTtyZXR1cm57bWluV2lkdGg6VHh0Lk1hdGgubWF4KG4sKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm1pbldpZHRofSksMCksbWluSGVpZ2h0OlR4dC5NYXRoLm1heChuLChmdW5jdGlvbih0KXtyZXR1cm4gdC5taW5IZWlnaHR9KSwwKX19LGUucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oZSxuLGkpe3ZhciByPXRoaXM7cmV0dXJuIHQucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLGUsbixpKSx0aGlzLl9mb3JFYWNoKChmdW5jdGlvbih0KXt0LmNvbXB1dGVMYXlvdXQoe3g6MCx5OjB9LHIud2lkdGgoKSxyLmhlaWdodCgpKX0pKSx0aGlzfSxlLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbih0LGUpe3JldHVybnt3aWR0aDp0LGhlaWdodDplfX0sZS5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnRzLmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gdC5maXhlZFdpZHRoKCl9KSl9LGUucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudHMuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmZpeGVkSGVpZ2h0KCl9KSl9LGUucHJvdG90eXBlLmNvbXBvbmVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29tcG9uZW50cy5zbGljZSgpfSxlLnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXR8fHRoaXMuaGFzKHQpfHwodC5kZXRhY2goKSx0aGlzLl9jb21wb25lbnRzLnB1c2godCksdGhpcy5fYWRvcHRBbmRBbmNob3IodCksdGhpcy5yZWRyYXcoKSksdGhpc30sZS5wcm90b3R5cGUuX3JlbW92ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9jb21wb25lbnRzLmluZGV4T2YodCk7cmV0dXJuIGU+PTAmJih0aGlzLl9jb21wb25lbnRzLnNwbGljZShlLDEpLCEwKX0sZX0pKHh4dC5Db21wb25lbnRDb250YWluZXIpO2J4dC5Hcm91cD1DeHQ7dmFyIEF4dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoQXh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIga3h0PXVPLEx4dD1JbXQsUHh0PUxfdCxOeHQ9Z3l0LEl4dD1GZ3QsUnh0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzKXx8dGhpcztpZihuLl90ZXh0UGFkZGluZz01LG51bGw9PWUpdGhyb3cgbmV3IEVycm9yKCJJbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZCByZXF1aXJlcyBhIGludGVycG9sYXRlZENvbG9yU2NhbGUiKTtyZXR1cm4gbi5fc2NhbGU9ZSxuLl9yZWRyYXdDYWxsYmFjaz1mdW5jdGlvbih0KXtyZXR1cm4gbi5yZWRyYXcoKX0sbi5fc2NhbGUub25VcGRhdGUobi5fcmVkcmF3Q2FsbGJhY2spLG4uX2Zvcm1hdHRlcj1OeHQuZ2VuZXJhbCgpLG4uX29yaWVudGF0aW9uPSJob3Jpem9udGFsIixuLl9leHBhbmRzPSExLG4uYWRkQ2xhc3MoImxlZ2VuZCIpLG4uYWRkQ2xhc3MoImludGVycG9sYXRlZC1jb2xvci1sZWdlbmQiKSxufXJldHVybiBreHQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3QucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKSx0aGlzLl9zY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spfSxlLnByb3RvdHlwZS5mb3JtYXR0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQ/dGhpcy5fZm9ybWF0dGVyOih0aGlzLl9mb3JtYXR0ZXI9dCx0aGlzLnJlZHJhdygpLHRoaXMpfSxlLnByb3RvdHlwZS5leHBhbmRzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2V4cGFuZHM6KHRoaXMuX2V4cGFuZHM9dCx0aGlzLnJlZHJhdygpLHRoaXMpfSxlLl9lbnN1cmVPcmllbnRhdGlvbj1mdW5jdGlvbih0KXtpZigiaG9yaXpvbnRhbCI9PT0odD10LnRvTG93ZXJDYXNlKCkpfHwibGVmdCI9PT10fHwicmlnaHQiPT09dClyZXR1cm4gdDt0aHJvdyBuZXcgRXJyb3IoJyInK3QrJyIgaXMgbm90IGEgdmFsaWQgb3JpZW50YXRpb24gZm9yIEludGVycG9sYXRlZENvbG9yTGVnZW5kJyl9LGUucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX29yaWVudGF0aW9uOih0aGlzLl9vcmllbnRhdGlvbj1lLl9lbnN1cmVPcmllbnRhdGlvbih0KSx0aGlzLnJlZHJhdygpLHRoaXMpfSxlLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZXhwYW5kcygpfHx0aGlzLl9pc1ZlcnRpY2FsKCl9LGUucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZXhwYW5kcygpfHwhdGhpcy5faXNWZXJ0aWNhbCgpfSxlLnByb3RvdHlwZS5fZ2VuZXJhdGVUaWNrcz1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD1lLl9ERUZBVUxUX05VTV9TV0FUQ0hFUyk7dmFyIG49dGhpcy5fc2NhbGUuZG9tYWluKCk7aWYoMT09PXQpcmV0dXJuW25bMF1dO2Zvcih2YXIgaT0oblsxXS1uWzBdKS8odC0xKSxyPVtdLG89MDtvPHQ7bysrKXIucHVzaChuWzBdK2kqbyk7cmV0dXJuIHJ9LGUucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3QucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpLHRoaXMuX3N3YXRjaENvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJzd2F0Y2gtY29udGFpbmVyIiwhMCksdGhpcy5fc3dhdGNoQm91bmRpbmdCb3g9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJyZWN0IikuY2xhc3NlZCgic3dhdGNoLWJvdW5kaW5nLWJveCIsITApLHRoaXMuX2xvd2VyTGFiZWw9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChlLkxFR0VORF9MQUJFTF9DTEFTUywhMCksdGhpcy5fdXBwZXJMYWJlbD10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKGUuTEVHRU5EX0xBQkVMX0NMQVNTLCEwKTt2YXIgbj1uZXcgTHh0LlN2Z0NvbnRleHQodGhpcy5jb250ZW50KCkubm9kZSgpKTt0aGlzLl9tZWFzdXJlcj1uZXcgTHh0Lk1lYXN1cmVyKG4pLHRoaXMuX3dyYXBwZXI9bmV3IEx4dC5XcmFwcGVyLHRoaXMuX3dyaXRlcj1uZXcgTHh0LldyaXRlcih0aGlzLl9tZWFzdXJlcixuLHRoaXMuX3dyYXBwZXIpfSxlLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbih0LG4pe3ZhciBpLHIsbz10aGlzLGE9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCxzPWEsbD10aGlzLl9zY2FsZS5kb21haW4oKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBvLl9tZWFzdXJlci5tZWFzdXJlKG8uX2Zvcm1hdHRlcih0KSkud2lkdGh9KSksYz1lLl9ERUZBVUxUX05VTV9TV0FUQ0hFUztpZih0aGlzLl9pc1ZlcnRpY2FsKCkpe3ZhciB1PUl4dC5NYXRoLm1heChsLDApO3I9cythK3RoaXMuX3RleHRQYWRkaW5nK3UrdGhpcy5fdGV4dFBhZGRpbmcsaT1jKmF9ZWxzZSBpPXMrYStzLHI9dGhpcy5fdGV4dFBhZGRpbmcrbFswXStjKmErbFsxXSt0aGlzLl90ZXh0UGFkZGluZztyZXR1cm57bWluV2lkdGg6cixtaW5IZWlnaHQ6aX19LGUucHJvdG90eXBlLl9pc1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuImhvcml6b250YWwiIT09dGhpcy5fb3JpZW50YXRpb259LGUucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3ZhciBuLGkscixvLGEscyxsPXRoaXMuX3NjYWxlLmRvbWFpbigpLGM9dGhpcy5fZm9ybWF0dGVyKGxbMF0pLHU9dGhpcy5fbWVhc3VyZXIubWVhc3VyZShjKS53aWR0aCxoPXRoaXMuX2Zvcm1hdHRlcihsWzFdKSxkPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoaCkud2lkdGgscD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0LGY9dGhpcy5fdGV4dFBhZGRpbmcsbT17eDowLHk6MH0sZz17eDowLHk6MH0sXz17eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIix0ZXh0Um90YXRpb246MH0seT17eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIix0ZXh0Um90YXRpb246MH0sdj17eDowLHk6MCx3aWR0aDowLGhlaWdodDowfTtpZih0aGlzLl9pc1ZlcnRpY2FsKCkpe3M9TWF0aC5mbG9vcih0aGlzLmhlaWdodCgpKTt2YXIgYj1NYXRoLm1heCh1LGQpO2E9KHRoaXMud2lkdGgoKS1iLTIqdGhpcy5fdGV4dFBhZGRpbmcpLzIsbj1NYXRoLm1heCh0aGlzLndpZHRoKCktYS0yKmYtYiwwKSxpPTEsbz1mdW5jdGlvbih0LG4pe3JldHVybiBlLmhlaWdodCgpLShuKzEpfSx5LnlBbGlnbj0idG9wIixtLnk9MCxfLnlBbGlnbj0iYm90dG9tIixnLnk9MCwibGVmdCI9PT10aGlzLl9vcmllbnRhdGlvbj8ocj1mdW5jdGlvbih0LGUpe3JldHVybiBmK2IrZn0seS54QWxpZ249InJpZ2h0IixtLng9LShhK24rZiksXy54QWxpZ249InJpZ2h0IixnLng9LShhK24rZikpOihyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGF9LHkueEFsaWduPSJsZWZ0IixtLng9YStuK2YsXy54QWxpZ249ImxlZnQiLGcueD1hK24rZiksdi53aWR0aD1uLHYuaGVpZ2h0PXMqaX1lbHNlIGE9TWF0aC5tYXgoZiwodGhpcy5oZWlnaHQoKS1wKS8yKSxzPU1hdGgubWF4KE1hdGguZmxvb3IodGhpcy53aWR0aCgpLTQqZi11LWQpLDApLG49MSxpPU1hdGgubWF4KHRoaXMuaGVpZ2h0KCktMiphLDApLHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5mbG9vcih1KzIqZikrZX0sbz1mdW5jdGlvbih0LGUpe3JldHVybiBhfSx5LnhBbGlnbj0icmlnaHQiLG0ueD0tZixfLnhBbGlnbj0ibGVmdCIsZy54PWYsdi55PWEsdi53aWR0aD1zKm4sdi5oZWlnaHQ9aTt2Lng9cihudWxsLDApLHRoaXMuX3VwcGVyTGFiZWwudGV4dCgiIiksdGhpcy5fd3JpdGVyLndyaXRlKGgsdGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkseSx0aGlzLl91cHBlckxhYmVsLm5vZGUoKSksdGhpcy5fdXBwZXJMYWJlbC5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIittLngrIiwgIittLnkrIikiKSx0aGlzLl9sb3dlckxhYmVsLnRleHQoIiIpLHRoaXMuX3dyaXRlci53cml0ZShjLHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpLF8sdGhpcy5fbG93ZXJMYWJlbC5ub2RlKCkpLHRoaXMuX2xvd2VyTGFiZWwuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrZy54KyIsICIrZy55KyIpIiksdGhpcy5fc3dhdGNoQm91bmRpbmdCb3guYXR0cnModik7dmFyIHg9dGhpcy5fZ2VuZXJhdGVUaWNrcyhzKSx3PXRoaXMuX3N3YXRjaENvbnRhaW5lci5zZWxlY3RBbGwoInJlY3Quc3dhdGNoIikuZGF0YSh4KSxTPXcuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5jbGFzc2VkKCJzd2F0Y2giLCEwKSxNPXcubWVyZ2UoUyk7cmV0dXJuIHcuZXhpdCgpLnJlbW92ZSgpLE0uYXR0cnMoe2ZpbGw6ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5fc2NhbGUuc2NhbGUodCl9LHdpZHRoOm4saGVpZ2h0OmkseDpyLHk6bywic2hhcGUtcmVuZGVyaW5nIjoiY3Jpc3BFZGdlcyJ9KSxQeHQuQUREX1RJVExFX0VMRU1FTlRTJiZTLmFwcGVuZCgidGl0bGUiKS50ZXh0KChmdW5jdGlvbih0KXtyZXR1cm4gZS5fZm9ybWF0dGVyKHQpfSkpLHRoaXN9LGUuX0RFRkFVTFRfTlVNX1NXQVRDSEVTPTExLGUuTEVHRU5EX0xBQkVMX0NMQVNTPSJsZWdlbmQtbGFiZWwiLGV9KShCZ3QuQ29tcG9uZW50KTtBeHQuSW50ZXJwb2xhdGVkQ29sb3JMZWdlbmQ9Unh0O3ZhciBPeHQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KE94dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHp4dD11TyxEeHQ9SW10LEJ4dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZvaWQgMD09PWUmJihlPSIiKSx2b2lkIDA9PT1uJiYobj0wKTt2YXIgaT10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIGkuYWRkQ2xhc3MoImxhYmVsIiksaS50ZXh0KGUpLGkuYW5nbGUobiksaS54QWxpZ25tZW50KCJjZW50ZXIiKS55QWxpZ25tZW50KCJjZW50ZXIiKSxpLl9wYWRkaW5nPTAsaX1yZXR1cm4genh0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fbWVhc3VyZXIubWVhc3VyZSh0aGlzLl90ZXh0KTtyZXR1cm57bWluV2lkdGg6KDA9PT10aGlzLmFuZ2xlKCk/bi53aWR0aDpuLmhlaWdodCkrMip0aGlzLnBhZGRpbmcoKSxtaW5IZWlnaHQ6KDA9PT10aGlzLmFuZ2xlKCk/bi5oZWlnaHQ6bi53aWR0aCkrMip0aGlzLnBhZGRpbmcoKX19LGUucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3QucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpLHRoaXMuX3RleHRDb250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIik7dmFyIGU9bmV3IER4dC5TdmdDb250ZXh0KHRoaXMuX3RleHRDb250YWluZXIubm9kZSgpKTt0aGlzLl9tZWFzdXJlcj1uZXcgRHh0LkNhY2hlTWVhc3VyZXIoZSksdGhpcy5fd3JhcHBlcj1uZXcgRHh0LldyYXBwZXIsdGhpcy5fd3JpdGVyPW5ldyBEeHQuV3JpdGVyKHRoaXMuX21lYXN1cmVyLGUsdGhpcy5fd3JhcHBlciksdGhpcy50ZXh0KHRoaXMuX3RleHQpfSxlLnByb3RvdHlwZS50ZXh0PWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3RleHQ7aWYoInN0cmluZyIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcigiTGFiZWwudGV4dCgpIG9ubHkgdGFrZXMgc3RyaW5ncyBhcyBpbnB1dCIpO3JldHVybiB0aGlzLl90ZXh0PXQsdGhpcy5yZWRyYXcoKSx0aGlzfSxlLnByb3RvdHlwZS5hbmdsZT1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9hbmdsZTtpZigodCU9MzYwKT4xODA/dC09MzYwOnQ8LTE4MCYmKHQrPTM2MCksLTkwIT09dCYmMCE9PXQmJjkwIT09dCl0aHJvdyBuZXcgRXJyb3IodCsiIGlzIG5vdCBhIHZhbGlkIGFuZ2xlIGZvciBMYWJlbCIpO3JldHVybiB0aGlzLl9hbmdsZT10LHRoaXMucmVkcmF3KCksdGhpc30sZS5wcm90b3R5cGUucGFkZGluZz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9wYWRkaW5nO2lmKCh0PSt0KTwwKXRocm93IG5ldyBFcnJvcih0KyIgaXMgbm90IGEgdmFsaWQgcGFkZGluZyB2YWx1ZS4gQ2Fubm90IGJlIGxlc3MgdGhhbiAwLiIpO3JldHVybiB0aGlzLl9wYWRkaW5nPXQsdGhpcy5yZWRyYXcoKSx0aGlzfSxlLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuITB9LGUucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuITB9LGUucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKSx0aGlzLl90ZXh0Q29udGFpbmVyLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpO3ZhciBlPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUodGhpcy5fdGV4dCksbj1NYXRoLm1heChNYXRoLm1pbigodGhpcy5oZWlnaHQoKS1lLmhlaWdodCkvMix0aGlzLnBhZGRpbmcoKSksMCksaT1NYXRoLm1heChNYXRoLm1pbigodGhpcy53aWR0aCgpLWUud2lkdGgpLzIsdGhpcy5wYWRkaW5nKCkpLDApO3RoaXMuX3RleHRDb250YWluZXIuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIraSsiLCIrbisiKSIpO3ZhciByPXRoaXMud2lkdGgoKS0yKmksbz10aGlzLmhlaWdodCgpLTIqbixhPXt4QWxpZ246dGhpcy54QWxpZ25tZW50KCkseUFsaWduOnRoaXMueUFsaWdubWVudCgpLHRleHRSb3RhdGlvbjp0aGlzLmFuZ2xlKCl9O3JldHVybiB0aGlzLl93cml0ZXIud3JpdGUodGhpcy5fdGV4dCxyLG8sYSksdGhpc30sZS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyksdGhpcy5fbWVhc3VyZXIucmVzZXQoKX0sZX0pKEJndC5Db21wb25lbnQpO094dC5MYWJlbD1CeHQ7dmFyIEh4dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuLGkpe3ZhciByPXQuY2FsbCh0aGlzLG4saSl8fHRoaXM7cmV0dXJuIHIuYWRkQ2xhc3MoZS5USVRMRV9MQUJFTF9DTEFTUykscn1yZXR1cm4genh0Ll9fZXh0ZW5kcyhlLHQpLGUuVElUTEVfTEFCRUxfQ0xBU1M9InRpdGxlLWxhYmVsIixlfSkoQnh0KTtPeHQuVGl0bGVMYWJlbD1IeHQ7dmFyIEZ4dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuLGkpe3ZhciByPXQuY2FsbCh0aGlzLG4saSl8fHRoaXM7cmV0dXJuIHIuYWRkQ2xhc3MoZS5BWElTX0xBQkVMX0NMQVNTKSxyfXJldHVybiB6eHQuX19leHRlbmRzKGUsdCksZS5BWElTX0xBQkVMX0NMQVNTPSJheGlzLWxhYmVsIixlfSkoQnh0KTtPeHQuQXhpc0xhYmVsPUZ4dDt2YXIgVnh0PXt9LFV4dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KFV4dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGp4dD1FZHQ7VXh0LmNpcmNsZT1mdW5jdGlvbiBHeHQoKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGp4dC5zeW1ib2woKS50eXBlKGp4dC5zeW1ib2xDaXJjbGUpLnNpemUoTWF0aC5QSSpNYXRoLnBvdyh0LzIsMikpfX0sVXh0LnNxdWFyZT1mdW5jdGlvbiBXeHQoKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGp4dC5zeW1ib2woKS50eXBlKGp4dC5zeW1ib2xTcXVhcmUpLnNpemUoTWF0aC5wb3codCwyKSl9fSxVeHQuY3Jvc3M9ZnVuY3Rpb24gcXh0KCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBqeHQuc3ltYm9sKCkudHlwZShqeHQuc3ltYm9sQ3Jvc3MpLnNpemUoNS85Kk1hdGgucG93KHQsMikpfX0sVXh0LmRpYW1vbmQ9ZnVuY3Rpb24gWXh0KCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBqeHQuc3ltYm9sKCkudHlwZShqeHQuc3ltYm9sRGlhbW9uZCkuc2l6ZShNYXRoLnRhbihNYXRoLlBJLzYpKk1hdGgucG93KHQsMikvMil9fSxVeHQudHJpYW5nbGU9ZnVuY3Rpb24gWHh0KCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBqeHQuc3ltYm9sKCkudHlwZShqeHQuc3ltYm9sVHJpYW5nbGUpLnNpemUoTWF0aC5zcXJ0KDMpKk1hdGgucG93KHQvMiwyKSl9fSxVeHQuc3Rhcj1mdW5jdGlvbiAkeHQoKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGp4dC5zeW1ib2woKS50eXBlKGp4dC5zeW1ib2xTdGFyKS5zaXplKC44OTA4MTMwOTE1MjkyODUyKk1hdGgucG93KHQvMiwyKSl9fTt2YXIgS3h0PTMqKDEvTWF0aC5zcXJ0KDEyKS8yKzEpO1V4dC53eWU9ZnVuY3Rpb24gWnh0KCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBqeHQuc3ltYm9sKCkudHlwZShqeHQuc3ltYm9sV3llKS5zaXplKEt4dCpNYXRoLnBvdyh0LzIuNCwyKSl9fSwKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ4dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIEp4dD11TyxReHQ9RWR0LHR3dD1JbXQsZXd0PUxfdCxud3Q9Z3l0LGl3dD1VeHQscnd0PUZndCxvd3Q9Qmd0LGF3dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXt2b2lkIDA9PT10JiYodD1bXSksdm9pZCAwPT09ZSYmKGU9MCksdm9pZCAwPT09biYmKG49MS8wKSx0aGlzLmNvbHVtbnM9dCx0aGlzLmJvdHRvbVBhZGRpbmc9ZSx0aGlzLm1heFdpZHRoPW59cmV0dXJuIHQucHJvdG90eXBlLmFkZENvbHVtbj1mdW5jdGlvbih0KXt2YXIgZT10LndpZHRoLG49dGhpcy5nZXRXaWR0aEF2YWlsYWJsZSgpO3Qud2lkdGg9TWF0aC5taW4obixlKSx0aGlzLmNvbHVtbnMucHVzaCh0KX0sdC5wcm90b3R5cGUuZ2V0Qm91bmRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmNvbHVtbnNbdF0sbj0wLGk9MDtpPHQ7aSsrKW4rPXRoaXMuY29sdW1uc1tpXS53aWR0aDtyZXR1cm57dG9wTGVmdDp7eDpuLHk6MH0sYm90dG9tUmlnaHQ6e3g6bitlLndpZHRoLHk6ZS5oZWlnaHR9fX0sdC5wcm90b3R5cGUuZ2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHJ3dC5NYXRoLm1heCh0aGlzLmNvbHVtbnMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5oZWlnaHR9KSksMCkrdGhpcy5ib3R0b21QYWRkaW5nfSx0LnByb3RvdHlwZS5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1pbih0aGlzLmNvbHVtbnMucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiB0K2Uud2lkdGh9KSwwKSx0aGlzLm1heFdpZHRoKX0sdC5wcm90b3R5cGUuZ2V0V2lkdGhBdmFpbGFibGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFdpZHRoKCk7cmV0dXJuIE1hdGgubWF4KHRoaXMubWF4V2lkdGgtdCwwKX0sdH0pKCksc3d0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4saSl7dm9pZCAwPT09dCYmKHQ9MS8wKSx2b2lkIDA9PT1lJiYoZT0xLzApLHZvaWQgMD09PW4mJihuPTApLHZvaWQgMD09PWkmJihpPVtdKSx0aGlzLm1heFdpZHRoPXQsdGhpcy5tYXhIZWlnaHQ9ZSx0aGlzLnBhZGRpbmc9bix0aGlzLnJvd3M9aX1yZXR1cm4gdC5wcm90b3R5cGUuYWRkUm93PWZ1bmN0aW9uKHQpe3QubWF4V2lkdGg9dGhpcy5tYXhXaWR0aC0yKnRoaXMucGFkZGluZyx0aGlzLnJvd3MucHVzaCh0KX0sdC5wcm90b3R5cGUuZ2V0Q29sdW1uQm91bmRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRSb3dCb3VuZHModCksaT10aGlzLnJvd3NbdF0uZ2V0Qm91bmRzKGUpO3JldHVybiBpLnRvcExlZnQueCs9bi50b3BMZWZ0LngsaS5ib3R0b21SaWdodC54Kz1uLnRvcExlZnQueCxpLnRvcExlZnQueSs9bi50b3BMZWZ0LnksaS5ib3R0b21SaWdodC55Kz1uLnRvcExlZnQueSxpfSx0LnByb3RvdHlwZS5nZXRSb3dCb3VuZHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMucGFkZGluZyxuPXRoaXMucGFkZGluZyxpPTA7aTx0O2krKyluKz10aGlzLnJvd3NbaV0uZ2V0SGVpZ2h0KCk7cmV0dXJue3RvcExlZnQ6e3g6ZSx5Om59LGJvdHRvbVJpZ2h0Ont4OmUrdGhpcy5yb3dzW3RdLmdldFdpZHRoKCkseTpuK3RoaXMucm93c1t0XS5nZXRIZWlnaHQoKX19fSx0LnByb3RvdHlwZS5nZXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4odGhpcy5yb3dzLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCtlLmdldEhlaWdodCgpfSksMCkrMip0aGlzLnBhZGRpbmcsdGhpcy5tYXhIZWlnaHQpfSx0LnByb3RvdHlwZS5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1pbihyd3QuTWF0aC5tYXgodGhpcy5yb3dzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0V2lkdGgoKX0pKSwwKSsyKnRoaXMucGFkZGluZyx0aGlzLm1heFdpZHRoKX0sdH0pKCksbHd0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzKXx8dGhpcztpZihuLl9wYWRkaW5nPTUsbi5fcm93Qm90dG9tUGFkZGluZz0zLG4uYWRkQ2xhc3MoImxlZ2VuZCIpLG4ubWF4RW50cmllc1BlclJvdygxKSxudWxsPT1lKXRocm93IG5ldyBFcnJvcigiTGVnZW5kIHJlcXVpcmVzIGEgY29sb3JTY2FsZSIpO3JldHVybiBuLl9jb2xvclNjYWxlPWUsbi5fcmVkcmF3Q2FsbGJhY2s9ZnVuY3Rpb24odCl7cmV0dXJuIG4ucmVkcmF3KCl9LG4uX2NvbG9yU2NhbGUub25VcGRhdGUobi5fcmVkcmF3Q2FsbGJhY2spLG4uX2Zvcm1hdHRlcj1ud3QuaWRlbnRpdHkoKSxuLm1heExpbmVzUGVyRW50cnkoMSksbi54QWxpZ25tZW50KCJyaWdodCIpLnlBbGlnbm1lbnQoInRvcCIpLG4uY29tcGFyYXRvcigoZnVuY3Rpb24odCxlKXt2YXIgaT1uLl9jb2xvclNjYWxlLmRvbWFpbigpLnNsaWNlKCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gbi5fZm9ybWF0dGVyKHQpfSkpO3JldHVybiBpLmluZGV4T2YodCktaS5pbmRleE9mKGUpfSkpLG4uX3N5bWJvbEZhY3RvcnlBY2Nlc3Nvcj1mdW5jdGlvbigpe3JldHVybiBpd3QuY2lyY2xlKCl9LG4uX3N5bWJvbE9wYWNpdHlBY2Nlc3Nvcj1mdW5jdGlvbigpe3JldHVybiAxfSxufXJldHVybiBKeHQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dmFyIG49dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChlLkxFR0VORF9ST1dfQ0xBU1MsITApO24uYXBwZW5kKCJnIikuY2xhc3NlZChlLkxFR0VORF9FTlRSWV9DTEFTUywhMCkuYXBwZW5kKCJ0ZXh0Iik7dmFyIGk9bmV3IHR3dC5TdmdDb250ZXh0KG4ubm9kZSgpLG51bGwsZXd0LkFERF9USVRMRV9FTEVNRU5UUyk7dGhpcy5fbWVhc3VyZXI9bmV3IHR3dC5DYWNoZU1lYXN1cmVyKGkpLHRoaXMuX3dyYXBwZXI9KG5ldyB0d3QuV3JhcHBlcikubWF4TGluZXModGhpcy5tYXhMaW5lc1BlckVudHJ5KCkpLHRoaXMuX3dyaXRlcj1uZXcgdHd0LldyaXRlcih0aGlzLl9tZWFzdXJlcixpLHRoaXMuX3dyYXBwZXIpfSxlLnByb3RvdHlwZS5mb3JtYXR0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZm9ybWF0dGVyOih0aGlzLl9mb3JtYXR0ZXI9dCx0aGlzLnJlZHJhdygpLHRoaXMpfSxlLnByb3RvdHlwZS5tYXhFbnRyaWVzUGVyUm93PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX21heEVudHJpZXNQZXJSb3c6KHRoaXMuX21heEVudHJpZXNQZXJSb3c9dCx0aGlzLnJlZHJhdygpLHRoaXMpfSxlLnByb3RvdHlwZS5tYXhMaW5lc1BlckVudHJ5PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX21heExpbmVzUGVyRW50cnk6KHRoaXMuX21heExpbmVzUGVyRW50cnk9dCx0aGlzLnJlZHJhdygpLHRoaXMpfSxlLnByb3RvdHlwZS5tYXhXaWR0aD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9tYXhXaWR0aDoodGhpcy5fbWF4V2lkdGg9dCx0aGlzLnJlZHJhdygpLHRoaXMpfSxlLnByb3RvdHlwZS5jb21wYXJhdG9yPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2NvbXBhcmF0b3I6KHRoaXMuX2NvbXBhcmF0b3I9dCx0aGlzLnJlZHJhdygpLHRoaXMpfSxlLnByb3RvdHlwZS5jb2xvclNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10Pyh0aGlzLl9jb2xvclNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZWRyYXdDYWxsYmFjayksdGhpcy5fY29sb3JTY2FsZT10LHRoaXMuX2NvbG9yU2NhbGUub25VcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spLHRoaXMucmVkcmF3KCksdGhpcyk6dGhpcy5fY29sb3JTY2FsZX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3QucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKSx0aGlzLl9jb2xvclNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZWRyYXdDYWxsYmFjayl9LGUucHJvdG90eXBlLl9idWlsZExlZ2VuZFRhYmxlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxpPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQscj1uZXcgc3d0KHQsZSx0aGlzLl9wYWRkaW5nKSxvPXRoaXMuX2NvbG9yU2NhbGUuZG9tYWluKCkuc2xpY2UoKS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBuLl9jb21wYXJhdG9yKG4uX2Zvcm1hdHRlcih0KSxuLl9mb3JtYXR0ZXIoZSkpfSkpLGE9bmV3IGF3dDtyZXR1cm4gci5hZGRSb3coYSksYS5ib3R0b21QYWRkaW5nPXRoaXMuX3Jvd0JvdHRvbVBhZGRpbmcsby5mb3JFYWNoKChmdW5jdGlvbih0LGUpe2EuY29sdW1ucy5sZW5ndGgvMj09PW4ubWF4RW50cmllc1BlclJvdygpJiYoKGE9bmV3IGF3dCkuYm90dG9tUGFkZGluZz1uLl9yb3dCb3R0b21QYWRkaW5nLHIuYWRkUm93KGEpKTt2YXIgbz1hLmdldFdpZHRoQXZhaWxhYmxlKCkscz1uLl9mb3JtYXR0ZXIodCksbD1uLl9tZWFzdXJlci5tZWFzdXJlKHMpLndpZHRoO28taS1sPDAmJmEuY29sdW1ucy5sZW5ndGg+MSYmKChhPW5ldyBhd3QpLmJvdHRvbVBhZGRpbmc9bi5fcm93Qm90dG9tUGFkZGluZyxyLmFkZFJvdyhhKSksYS5hZGRDb2x1bW4oe3dpZHRoOmksaGVpZ2h0OmksZGF0YTp7bmFtZTp0LHR5cGU6InN5bWJvbCJ9fSksbz1hLmdldFdpZHRoQXZhaWxhYmxlKCk7dmFyIGM9TWF0aC5taW4obyxsKTtuLl93cmFwcGVyLm1heExpbmVzKG4ubWF4TGluZXNQZXJFbnRyeSgpKTt2YXIgdT1uLl93cmFwcGVyLndyYXAocyxuLl9tZWFzdXJlcixjKS5ub0xpbmVzO2EuYWRkQ29sdW1uKHt3aWR0aDpjLGhlaWdodDp1KmksZGF0YTp7bmFtZTp0LHR5cGU6InRleHQifX0pfSkpLHJ9LGUucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fYnVpbGRMZWdlbmRUYWJsZShyd3QuTWF0aC5taW4oW3RoaXMubWF4V2lkdGgoKSx0XSx0KSxlKTtyZXR1cm57bWluSGVpZ2h0Om4uZ2V0SGVpZ2h0KCksbWluV2lkdGg6bi5nZXRXaWR0aCgpfX0sZS5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbih0KXt2YXIgbj10aGlzO2lmKCF0aGlzLl9pc1NldHVwKXJldHVybltdO3ZhciBpPXRoaXMuX2J1aWxkTGVnZW5kVGFibGUodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpO3JldHVybiBpLnJvd3MucmVkdWNlKChmdW5jdGlvbihyLG8sYSl7aWYoMCE9PXIubGVuZ3RoKXJldHVybiByO3ZhciBzPWkuZ2V0Um93Qm91bmRzKGEpO3JldHVybiByd3QuTWF0aC53aXRoaW4odCxzKT9vLmNvbHVtbnMucmVkdWNlKChmdW5jdGlvbihyLG8scyl7dmFyIGw9aS5nZXRDb2x1bW5Cb3VuZHMoYSxzKTtpZihyd3QuTWF0aC53aXRoaW4odCxsKSl7dmFyIGM9bi5jb250ZW50KCkuc2VsZWN0QWxsKCIuIitlLkxFR0VORF9ST1dfQ0xBU1MpLm5vZGVzKClbYV0sdT1ReHQuc2VsZWN0KGMpLnNlbGVjdEFsbCgiLiIrZS5MRUdFTkRfRU5UUllfQ0xBU1MpLm5vZGVzKClbTWF0aC5mbG9vcihzLzIpXSxoPVF4dC5zZWxlY3QodSkuc2VsZWN0KCIuIitlLkxFR0VORF9TWU1CT0xfQ0xBU1MpLGQ9cnd0LkRPTS5nZXRUcmFuc2xhdGVWYWx1ZXMoUXh0LnNlbGVjdChjKSkscD1yd3QuRE9NLmdldFRyYW5zbGF0ZVZhbHVlcyhoKTtyZXR1cm5be2JvdW5kczpyd3QuRE9NLmVsZW1lbnRCQm94KFF4dC5zZWxlY3QoYykpLGRhdHVtOm8uZGF0YS5uYW1lLHBvc2l0aW9uOnt4OmRbMF0rcFswXSx5OmRbMV0rcFsxXX0sc2VsZWN0aW9uOlF4dC5zZWxlY3QodSksY29tcG9uZW50Om59XX1yZXR1cm4gcn0pLHIpOnJ9KSxbXSl9LGUucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt2YXIgbj10aGlzLl9idWlsZExlZ2VuZFRhYmxlKHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpKTt0aGlzLmNvbnRlbnQoKS5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTt2YXIgaT10aGlzLmNvbnRlbnQoKS5zZWxlY3RBbGwoImcuIitlLkxFR0VORF9ST1dfQ0xBU1MpLmRhdGEobi5yb3dzKSxyPWkuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKGUuTEVHRU5EX1JPV19DTEFTUywhMCkubWVyZ2UoaSk7aS5leGl0KCkucmVtb3ZlKCksci5hdHRyKCJ0cmFuc2Zvcm0iLChmdW5jdGlvbih0LGUpe3ZhciBpPW4uZ2V0Um93Qm91bmRzKGUpO3JldHVybiJ0cmFuc2xhdGUoIitpLnRvcExlZnQueCsiLCAiK2kudG9wTGVmdC55KyIpIn0pKTt2YXIgbz10aGlzO3JldHVybiByLmVhY2goKGZ1bmN0aW9uKHQsaSl7Zm9yKHZhciByPVtdLGE9MDthPHQuY29sdW1ucy5sZW5ndGg7YSs9MilyLnB1c2goW3QuY29sdW1uc1thXSx0LmNvbHVtbnNbYSsxXV0pO3ZhciBzPVF4dC5zZWxlY3QodGhpcykuc2VsZWN0QWxsKCJnLiIrZS5MRUdFTkRfRU5UUllfQ0xBU1MpLmRhdGEociksbD1zLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZChlLkxFR0VORF9FTlRSWV9DTEFTUywhMCkubWVyZ2Uocyk7bC5hcHBlbmQoInBhdGgiKS5hdHRyKCJkIiwoZnVuY3Rpb24odCxlKXt2YXIgbj10WzBdO3JldHVybiBvLnN5bWJvbCgpKG4uZGF0YS5uYW1lLGkpKC42Km4uaGVpZ2h0KShudWxsKX0pKS5hdHRyKCJ0cmFuc2Zvcm0iLChmdW5jdGlvbih0LGUpe3ZhciByPXRbMF0sbz1uLnJvd3NbaV0uY29sdW1ucy5pbmRleE9mKHIpO3JldHVybiJ0cmFuc2xhdGUoIisobi5nZXRDb2x1bW5Cb3VuZHMoaSxvKS50b3BMZWZ0Lngrci53aWR0aC8yKSsiLCAiK3IuaGVpZ2h0LzIrIikifSkpLmF0dHIoImZpbGwiLChmdW5jdGlvbih0KXtyZXR1cm4gby5fY29sb3JTY2FsZS5zY2FsZSh0WzBdLmRhdGEubmFtZSl9KSkuYXR0cigib3BhY2l0eSIsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG8uc3ltYm9sT3BhY2l0eSgpKHRbMF0uZGF0YS5uYW1lLGkpfSkpLmNsYXNzZWQoZS5MRUdFTkRfU1lNQk9MX0NMQVNTLCEwKSxsLmFwcGVuZCgiZyIpLmNsYXNzZWQoInRleHQtY29udGFpbmVyIiwhMCkuYXR0cigidHJhbnNmb3JtIiwoZnVuY3Rpb24odCxlKXt2YXIgcj1uLnJvd3NbaV0uY29sdW1ucy5pbmRleE9mKHRbMV0pO3JldHVybiJ0cmFuc2xhdGUoIituLmdldENvbHVtbkJvdW5kcyhpLHIpLnRvcExlZnQueCsiLCAwKSJ9KSkuZWFjaCgoZnVuY3Rpb24odCxlLG4pe3ZhciBpPVF4dC5zZWxlY3QodGhpcykscj10WzFdO28uX3dyaXRlci53cml0ZShvLl9mb3JtYXR0ZXIoci5kYXRhLm5hbWUpLHIud2lkdGgsby5oZWlnaHQoKSx7eEFsaWduOiJsZWZ0Iix5QWxpZ246InRvcCIsdGV4dFJvdGF0aW9uOjB9LGkubm9kZSgpKX0pKSxzLmV4aXQoKS5yZW1vdmUoKX0pKSx0aGlzfSxlLnByb3RvdHlwZS5zeW1ib2w9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fc3ltYm9sRmFjdG9yeUFjY2Vzc29yOih0aGlzLl9zeW1ib2xGYWN0b3J5QWNjZXNzb3I9dCx0aGlzLnJlbmRlcigpLHRoaXMpfSxlLnByb3RvdHlwZS5zeW1ib2xPcGFjaXR5PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX3N5bWJvbE9wYWNpdHlBY2Nlc3NvcjoodGhpcy5fc3ltYm9sT3BhY2l0eUFjY2Vzc29yPSJudW1iZXIiPT10eXBlb2YgdD9mdW5jdGlvbigpe3JldHVybiB0fTp0LHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyksdGhpcy5fbWVhc3VyZXIucmVzZXQoKX0sZS5MRUdFTkRfUk9XX0NMQVNTPSJsZWdlbmQtcm93IixlLkxFR0VORF9FTlRSWV9DTEFTUz0ibGVnZW5kLWVudHJ5IixlLkxFR0VORF9TWU1CT0xfQ0xBU1M9ImxlZ2VuZC1zeW1ib2wiLGV9KShvd3QuQ29tcG9uZW50KTtWeHQuTGVnZW5kPWx3dDt2YXIgY3d0PXt9LHV3dD17fSxod3Q9e307IShmdW5jdGlvbih0KXt2YXIgZTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLChlPXQuQW5pbWF0b3J8fCh0LkFuaW1hdG9yPXt9KSkuTUFJTj0ibWFpbiIsZS5SRVNFVD0icmVzZXQifSkoaHd0KTt2YXIgZHd0PXt9LHB3dD17fSxmd3Q9e307ZnVuY3Rpb24gbXd0KHQpe3JldHVybiEwPT09KGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG51bGwhPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmITE9PT1BcnJheS5pc0FycmF5KGUpfSkodCkmJiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfXZhciBnd3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShnd3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBfd3Q9Rmd0LHl3dD0wLHZ3dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dm9pZCAwPT09dCYmKHQ9W10pLHZvaWQgMD09PWUmJihlPXt9KSx0aGlzLl91cGRhdGVJZD15d3QrKyx0aGlzLl9kYXRhPXQsdGhpcy5fbWV0YWRhdGE9ZSx0aGlzLl9jYWxsYmFja3M9bmV3IF93dC5DYWxsYmFja1NldH1yZXR1cm4gdC5wcm90b3R5cGUub25VcGRhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NhbGxiYWNrcy5hZGQodCksdGhpc30sdC5wcm90b3R5cGUub2ZmVXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jYWxsYmFja3MuZGVsZXRlKHQpLHRoaXN9LHQucHJvdG90eXBlLmRhdGE9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZGF0YToodGhpcy5fZGF0YT10LHRoaXMuX2Rpc3BhdGNoVXBkYXRlKCksdGhpcyl9LHQucHJvdG90eXBlLm1ldGFkYXRhPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX21ldGFkYXRhOih0aGlzLl9tZXRhZGF0YT10LHRoaXMuX2Rpc3BhdGNoVXBkYXRlKCksdGhpcyl9LHQucHJvdG90eXBlLnVwZGF0ZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VwZGF0ZUlkfSx0LnByb3RvdHlwZS5fZGlzcGF0Y2hVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVJZD15d3QrKyx0aGlzLl9jYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKX0sdH0pKCk7Z3d0LkRhdGFzZXQ9dnd0LAovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqIEBmaWxlb3ZlcnZpZXcgSW1wbGVtZW50cyB0aGUgU2lnbmF0dXJlIEFQSSB0byBoZWxwIGluIGNvbXBhcmluZyB3aGVuIHR3bwogICAgICogUGxvdHRhYmxlIG9iamVjdHMgaGF2ZSAiY2hhbmdlZCIuCiAgICAgKgogICAgICogTWVtb2l6YXRpb24gaW4gUGxvdHRhYmxlIGlzIGNvbXBsaWNhdGVkIGJ5IG11dGFibGUgc2NhbGVzIGFuZCBkYXRhc2V0cy4gV2UgY2Fubm90IHNpbXBseQogICAgICogcmVmZXJlbmNlIGNvbXBhcmUgdHdvIGUuZy4gc2NhbGVzIHNpbmNlIGl0IG1heSBoYXZlIGludGVybmFsbHkgbXV0YXRlZC4gVG8gcmVzb2x2ZSB0aGlzLAogICAgICogd2Ugd3JpdGUgYSByZWN1cnNpdmUgU2lnbmF0dXJlIGludGVyZmFjZSB0aGF0IGhvbGRzIGFuIGltbXV0YWJsZSBzbmFwc2hvdCBvZiB3aGF0ZXZlcgogICAgICogc3RhdGUgdGhlIHNjYWxlL2RhdGEgd2FzIGluIGF0IHRoZSB0aW1lLiBUaGVuIG9uIG1lbW9pemVkIGZ1bmN0aW9uIGludm9jYXRpb24gd2Ugc2lnbiB0aGUKICAgICAqIG5ldyBpbnB1dHMgYW5kIGNvbXBhcmUgdGhlIHNpZ25hdHVyZXMgdG8gZGVjaWRlIGlmIHdlIHNob3VsZCByZWNvbXB1dGUuCiAgICAgKgogICAgICogV2UgbXVzdCBoYW5kLXdyaXRlIGEgc2lnbmF0dXJlIGZvciBlYWNoIGN1c3RvbSBjbGFzcyB3ZSB3aXNoIHRvIHN1cHBvcnQuCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KGZ3dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGJ3dD11Tyx4d3Q9Z3d0LHd3dD1odnQ7ZnVuY3Rpb24gU3d0KHQpe3JldHVybiB0IGluc3RhbmNlb2Yga3d0P3Q6dCBpbnN0YW5jZW9mIERhdGU/VHd0KHQudmFsdWVPZigpKTp0IGluc3RhbmNlb2Ygd3d0LlNjYWxlP013dCh0KTp0IGluc3RhbmNlb2YgeHd0LkRhdGFzZXQ/RXd0KHQpOihmdW5jdGlvbiB0KGUpe3ZhciBuLGk7cmV0dXJuITEhPT1td3QoZSkmJiJmdW5jdGlvbiI9PXR5cGVvZihuPWUuY29uc3RydWN0b3IpJiYhMSE9PW13dChpPW4ucHJvdG90eXBlKSYmITEhPT1pLmhhc093blByb3BlcnR5KCJpc1Byb3RvdHlwZU9mIil9KSh0KT9Bd3QodCk6QXJyYXkuaXNBcnJheSh0KT9Dd3QodCk6VHd0KHQpfWZ1bmN0aW9uIE13dCh0KXtyZXR1cm4gQXd0KHtkb21haW46dC5kb21haW4oKSxyYW5nZTp0LnJhbmdlKCksdXBkYXRlSWQ6dC51cGRhdGVJZCgpLHJlZjpUd3QodCl9KX1mdW5jdGlvbiBFd3QodCl7cmV0dXJuIEF3dCh7cmVmOlR3dCh0KSx1cGRhdGVJZDp0LnVwZGF0ZUlkKCl9KX1mdW5jdGlvbiBUd3QodCl7cmV0dXJuIG5ldyBQd3QodCl9ZnVuY3Rpb24gQ3d0KHQpe3JldHVybiBuZXcgTHd0KHQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gU3d0KHQpfSkpKX1mdW5jdGlvbiBBd3QodCl7dmFyIGU9e307Zm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmKGVbbl09U3d0KHRbbl0pKTtyZXR1cm4gbmV3IE53dChlKX1md3Quc2lnbj1Td3QsZnd0LnNpZ25TY2FsZT1Nd3QsZnd0LnNpZ25EYXRhc2V0PUV3dCxmd3Quc2lnblJlZj1Ud3QsZnd0LnNpZ25BcnJheT1Dd3QsZnd0LnNpZ25PYmo9QXd0O3ZhciBrd3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGUuaXNEaWZmZXJlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuISh0IGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcil8fHRoaXMuaXNTaWduYXR1cmVEaWZmZXJlbnQodCl9LHR9KSgpO2Z3dC5TaWduYXR1cmU9a3d0O3ZhciBMd3Q9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG49dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBuLmFycmF5PWUsbn1yZXR1cm4gYnd0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLmlzU2lnbmF0dXJlRGlmZmVyZW50PWZ1bmN0aW9uKHQpe2lmKHQuYXJyYXkubGVuZ3RoIT09dGhpcy5hcnJheS5sZW5ndGgpcmV0dXJuITA7Zm9yKHZhciBlPTA7ZTx0aGlzLmFycmF5Lmxlbmd0aDtlKyspaWYodGhpcy5hcnJheVtlXS5pc0RpZmZlcmVudCh0LmFycmF5W2VdKSlyZXR1cm4hMDtyZXR1cm4hMX0sZX0pKGt3dCk7Znd0LkFycmF5U2lnbmF0dXJlPUx3dDt2YXIgUHd0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gbi5yZWY9ZSxufXJldHVybiBid3QuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuaXNTaWduYXR1cmVEaWZmZXJlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmVmIT09dC5yZWZ9LGV9KShrd3QpO2Z3dC5SZWZlcmVuY2VTaWduYXR1cmU9UHd0O3ZhciBOd3Q9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG49dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBuLm9iaj1lLG59cmV0dXJuIGJ3dC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5pc1NpZ25hdHVyZURpZmZlcmVudD1mdW5jdGlvbih0KXt2YXIgZT1PYmplY3Qua2V5cyh0aGlzLm9iaiksbj1PYmplY3Qua2V5cyh0Lm9iaik7aWYoZS5sZW5ndGghPT1uLmxlbmd0aClyZXR1cm4hMDtmb3IodmFyIGk9MCxyPWU7aTxyLmxlbmd0aDtpKyspe3ZhciBvPXJbaV07aWYoIXQub2JqLmhhc093blByb3BlcnR5KG8pKXJldHVybiEwO2lmKHRoaXMub2JqW29dLmlzRGlmZmVyZW50KHQub2JqW29dKSlyZXR1cm4hMH1yZXR1cm4hMX0sZX0pKGt3dCk7Znd0Lk9iamVjdFNpZ25hdHVyZT1Od3QsCi8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICogQGZpbGVvdmVydmlldyBJbXBsZW1lbnRzIGEgZnVuY3Rpb24gbWVtb2l6ZXIgdXNpbmcgdGhlIFNpZ25hdHVyZSBBUEkuCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHB3dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIEl3dD1md3Q7cHd0Lm1lbW9pemU9ZnVuY3Rpb24gUnd0KHQpe3ZhciBlLG49dm9pZCAwLGk9ITEscj0hMSxvPWZ1bmN0aW9uKCl7Zm9yKHZhciBvPVtdLGE9MDthPGFyZ3VtZW50cy5sZW5ndGg7YSsrKW9bYV09YXJndW1lbnRzW2FdO2lmKGkpcmV0dXJuIGU7dmFyIHM9SXd0LnNpZ25BcnJheShvKTtyZXR1cm4gdm9pZCAwPT09bnx8bi5pc0RpZmZlcmVudChzKT8ociYmY29uc29sZS53YXJuKCJjYWNoZSBtaXNzISBjb21wdXRpbmciKSxuPXMsZT10LmFwcGx5KHRoaXMsbykpOnImJmNvbnNvbGUud2FybigiY2FjaGUgaGl0ISIpLGV9O3JldHVybiBvLmRvTG9ja2VkPWZ1bmN0aW9uKHQpe2lmKGkpdGhyb3cgbmV3IEVycm9yKCJMb2NraW5nIGFuIGFscmVhZHkgbG9ja2VkIG1lbW9pemUgZnVuY3Rpb24hIik7aT0hMDt2YXIgZT10LmFwcGx5KHRoaXMpO3JldHVybiBpPSExLGV9LG8ubG9nUGVyZm9ybWFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PSEwKSxyPXQsdGhpc30sb307dmFyIE93dD17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoT3d0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgend0PVNlLmV4cG9ydHMsRHd0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLm1hcD1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuZXhpc3RzPU9iamVjdC5jcmVhdGUobnVsbCl9cmV0dXJuIHQucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXtyZXR1cm4gZGVsZXRlIHRoaXMubWFwW3RdLGRlbGV0ZSB0aGlzLmV4aXN0c1t0XSwhMH0sdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1hcFt0XX0sdC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiEhdGhpcy5leGlzdHNbdF19LHQucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm1hcFt0XT1lLHRoaXMuZXhpc3RzW3RdPSEwLHRoaXN9LHR9KSgpLEJ3dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5tYXA9bmV3IER3dH1yZXR1cm4gdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1hcC5nZXQodFswXSkuZ2V0KHRbMV0pfSx0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubWFwLmhhcyh0WzBdKSYmdGhpcy5tYXAuZ2V0KHRbMF0pLmhhcyh0WzFdKX0sdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubWFwLmhhcyh0WzBdKXx8dGhpcy5tYXAuc2V0KHRbMF0sbmV3IER3dCksdGhpcy5tYXAuZ2V0KHRbMF0pLnNldCh0WzFdLGUpLHRoaXN9LHQucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5tYXAuaGFzKHRbMF0pJiZ0aGlzLm1hcC5nZXQodFswXSkuZGVsZXRlKHRbMV0pLCEwfSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMubWFwPW5ldyBEd3R9LHQucmVzb2x2ZXI9ZnVuY3Rpb24odCxlLG4pe3JldHVybltuLnVwZGF0ZUlkKCksZV19LHR9KSgpO2Z1bmN0aW9uIEh3dCh0KXt2YXIgZT16d3QubWVtb2l6ZSh0LEJ3dC5yZXNvbHZlcik7cmV0dXJuIGUuY2FjaGU9bmV3IEJ3dCxlfU93dC5tZW1vaXplUHJvamVjdG9yPUh3dCxPd3QubWVtb2l6ZVByb2plY3RvcnM9ZnVuY3Rpb24gRnd0KHQpe3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChmdW5jdGlvbihlKXt0W2VdPUh3dCh0W2VdKX0pKSx0fTt2YXIgVnd0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqIEBmaWxlb3ZlcnZpZXcgSW1wbGVtZW50cyBhIGNvbnZlbmllbnQgdGh1bmsgZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSBjb21tb24gY2FzZQogICAgICogb2YgY3JlYXRpbmcgYSBtZW1vaXplZCBmdW5jdGlvbiB0aGF0IHRha2VzIGl0cyBpbnB1dHMgZnJvbSBtdXRhYmxlIGNsYXNzIHByb3BlcnRpZXMuCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoVnd0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgVXd0PWR3dDtWd3QubWVtVGh1bms9ZnVuY3Rpb24gand0KCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3ZhciBuPXQuc2xpY2UoMCwtMSksaT10W3QubGVuZ3RoLTFdLHI9VXd0Lm1lbW9pemUoaSksbz1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1uLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXBwbHkodCl9KSk7cmV0dXJuIHIuYXBwbHkodm9pZCAwLGUpfTtyZXR1cm4gb30sKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9dU87ZS5fX2V4cG9ydFN0YXIocHd0LHQpLGUuX19leHBvcnRTdGFyKE93dCx0KSxlLl9fZXhwb3J0U3RhcihWd3QsdCksdC5zaWduPWZ3dC5zaWdufSkoZHd0KTt2YXIgR3d0PXt9OyEoZnVuY3Rpb24odCl7Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZT1FZHQsbj0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2RyYXdTdGVwPWV9cmV0dXJuIHQucHJvdG90eXBlLmdldERyYXdTdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYXdTdGVwfSx0LnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZVtlLmxlbmd0aC0xXS5hdHRyVG9BcHBsaWVkUHJvamVjdG9yO3RoaXMuX2NvbnRleHQuc2F2ZSgpLHRoaXMuX2RyYXdTdGVwKHRoaXMuX2NvbnRleHQsdCxuKSx0aGlzLl9jb250ZXh0LnJlc3RvcmUoKX0sdC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlcz1mdW5jdGlvbigpe3JldHVybltdfSx0LnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsfSx0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt9LHR9KSgpO2Z1bmN0aW9uIGkodCxlLG4saSl7Zm9yKHZhciByPXt9LG89MCxhPWU7bzxhLmxlbmd0aDtvKyspe3ZhciBzPWFbb107dC5oYXNPd25Qcm9wZXJ0eShzKSYmKHJbc109dFtzXShuLGkpKX1yZXR1cm4gcn1mdW5jdGlvbiByKHQpe3JldHVybiBudWxsIT10WyJzdHJva2Utd2lkdGgiXT9wYXJzZUZsb2F0KHRbInN0cm9rZS13aWR0aCJdKToxfWZ1bmN0aW9uIG8odCl7dmFyIGU9dFsic3Ryb2tlLWRhc2hhcnJheSJdO2lmKG51bGwhPWUpdHJ5e3JldHVybiBlLnNwbGl0KC9bICxdKy8pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlSW50KHQsMTApfSkpfWNhdGNoKHQpe3JldHVybiBjb25zb2xlLmVycm9yKCJnZXRTdHJva2VEYXNoQXJyYXkgZmFpbGVkIHdpdGg6ICIrdCksW119cmV0dXJuW119ZnVuY3Rpb24gYSh0LG4pe2lmKG4uc3Ryb2tlKXt0LmxpbmVXaWR0aD1yKG4pO3ZhciBpPWUuY29sb3Iobi5zdHJva2UpLGE9byhuKTt0LnNldExpbmVEYXNoKGEpLGkub3BhY2l0eSo9KGZ1bmN0aW9uIHModCl7dmFyIGU9bnVsbCE9dC5vcGFjaXR5P3BhcnNlRmxvYXQodC5vcGFjaXR5KToxO3JldHVybihudWxsIT10WyJzdHJva2Utb3BhY2l0eSJdP3BhcnNlRmxvYXQodFsic3Ryb2tlLW9wYWNpdHkiXSk6MSkqZX0pKG4pLHQuc3Ryb2tlU3R5bGU9aS50b1N0cmluZygpLHQuc3Ryb2tlKCl9aWYobi5maWxsKXt2YXIgbD1lLmNvbG9yKG4uZmlsbCk7bC5vcGFjaXR5Kj0oZnVuY3Rpb24gYyh0KXt2YXIgZT1udWxsIT10Lm9wYWNpdHk/cGFyc2VGbG9hdCh0Lm9wYWNpdHkpOjE7cmV0dXJuKG51bGwhPXRbImZpbGwtb3BhY2l0eSJdP3BhcnNlRmxvYXQodFsiZmlsbC1vcGFjaXR5Il0pOjEpKmV9KShuKSx0LmZpbGxTdHlsZT1sLnRvU3RyaW5nKCksdC5maWxsKCl9fXQuQ2FudmFzRHJhd2VyPW4sdC5Db250ZXh0U3R5bGVBdHRycz1bImZpbGwtb3BhY2l0eSIsImZpbGwiLCJvcGFjaXR5Iiwic3Ryb2tlLW9wYWNpdHkiLCJzdHJva2Utd2lkdGgiLCJzdHJva2UiLCJzdHJva2UtZGFzaGFycmF5Il0sdC5yZXNvbHZlQXR0cmlidXRlc1N1YnNldFdpdGhTdHlsZXM9ZnVuY3Rpb24gcyhlLG4scixvKXtyZXR1cm4gaShlLHQuQ29udGV4dFN0eWxlQXR0cnMuY29uY2F0KG4pLHIsbyl9LHQucmVzb2x2ZUF0dHJpYnV0ZXM9aSx0LmdldFN0cm9rZVdpZHRoPXIsdC5nZXRTdHJva2VEYXNoQXJyYXk9byx0LnJlbmRlckFyZWE9ZnVuY3Rpb24gbCh0LGUsbixpKXt0LnNhdmUoKSx0LmJlZ2luUGF0aCgpLGUuY29udGV4dCh0KSxlKG4pLHQubGluZUpvaW49InJvdW5kIixhKHQsaSksdC5yZXN0b3JlKCl9LHQucmVuZGVyTGluZT1mdW5jdGlvbiBjKHQsZSxuLGkpe3Quc2F2ZSgpLHQuYmVnaW5QYXRoKCksZS5jb250ZXh0KHQpLGUobiksdC5saW5lSm9pbj0icm91bmQiLGEodCxpKSx0LnJlc3RvcmUoKX0sdC5yZW5kZXJQYXRoV2l0aFN0eWxlPWF9KShHd3QpO3ZhciBXd3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KFd3dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHF3dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5fc3ZnRHJhd2VyRmFjdG9yeT10LHRoaXMuX2NhbnZhc0RyYXdlckZhY3Rvcnk9ZX1yZXR1cm4gdC5wcm90b3R5cGUudXNlU1ZHPWZ1bmN0aW9uKHQpe251bGwhPXRoaXMuX2N1cnJlbnREcmF3ZXImJnRoaXMuX2N1cnJlbnREcmF3ZXIucmVtb3ZlKCk7dmFyIGU9dGhpcy5fc3ZnRHJhd2VyRmFjdG9yeSgpO2UuYXR0YWNoVG8odCksdGhpcy5fY3VycmVudERyYXdlcj1lfSx0LnByb3RvdHlwZS51c2VDYW52YXM9ZnVuY3Rpb24odCl7bnVsbCE9dGhpcy5fY3VycmVudERyYXdlciYmdGhpcy5fY3VycmVudERyYXdlci5yZW1vdmUoKSx0aGlzLl9jdXJyZW50RHJhd2VyPXRoaXMuX2NhbnZhc0RyYXdlckZhY3RvcnkodC5ub2RlKCkuZ2V0Q29udGV4dCgiMmQiKSl9LHQucHJvdG90eXBlLmdldERyYXdlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jdXJyZW50RHJhd2VyfSx0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXtudWxsIT10aGlzLl9jdXJyZW50RHJhd2VyJiZ0aGlzLl9jdXJyZW50RHJhd2VyLnJlbW92ZSgpfSx0LnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKHQsZSl7dGhpcy5fY3VycmVudERyYXdlci5kcmF3KHQsZSl9LHQucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY3VycmVudERyYXdlci5nZXRWaXN1YWxQcmltaXRpdmVzKCl9LHQucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2N1cnJlbnREcmF3ZXIuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleCh0KX0sdH0pKCk7V3d0LlByb3h5RHJhd2VyPXF3dDt2YXIgWXd0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShZd3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBYd3Q9RWR0LCR3dD1GZ3QsS3d0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLl9yb290PVh3dC5zZWxlY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsImciKSksdGhpcy5fY2xhc3NOYW1lPWUsdGhpcy5fc3ZnRWxlbWVudE5hbWU9dH1yZXR1cm4gdC5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7dGhpcy5fY3JlYXRlQW5kRGVzdHJveURPTUVsZW1lbnRzKHQpO2Zvcih2YXIgaT0wLHI9ZS5sZW5ndGgsbz1mdW5jdGlvbihyKXt2YXIgbz1lW3JdOyR3dC5XaW5kb3cuc2V0VGltZW91dCgoZnVuY3Rpb24oKXtyZXR1cm4gbi5fZHJhd1N0ZXAobyl9KSxpKSxpKz1vLmFuaW1hdG9yLnRvdGFsVGltZSh0Lmxlbmd0aCl9LGE9MDthPHI7YSsrKW8oYSl9LHQucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09dGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzJiYodGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzPXRoaXMuX3NlbGVjdGlvbi5ub2RlcygpKSx0aGlzLl9jYWNoZWRWaXN1YWxQcmltaXRpdmVzTm9kZXN9LHQucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXRoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2RlTWFwP251bGw6dGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVNYXAuZ2V0KHQpfSx0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLl9yb290LnJlbW92ZSgpfSx0LnByb3RvdHlwZS5hdHRhY2hUbz1mdW5jdGlvbih0KXt0Lm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLl9yb290Lm5vZGUoKSl9LHQucHJvdG90eXBlLmdldFJvb3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm9vdH0sdC5wcm90b3R5cGUuc2VsZWN0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3ZnRWxlbWVudE5hbWV9LHQucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKHQpe30sdC5wcm90b3R5cGUuX2NyZWF0ZUFuZERlc3Ryb3lET01FbGVtZW50cz1mdW5jdGlvbih0KXt2YXIgZT10Lm1hcCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dD97ZDp0LGk6ZX06bnVsbH0pKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10fSkpLG49dGhpcy5fcm9vdC5zZWxlY3RBbGwodGhpcy5zZWxlY3RvcigpKS5kYXRhKGUpO3RoaXMuX3NlbGVjdGlvbj1uLmVudGVyKCkuYXBwZW5kKHRoaXMuX3N2Z0VsZW1lbnROYW1lKS5tZXJnZShuKSxuLmV4aXQoKS5yZW1vdmUoKTt2YXIgaT1uZXcgJHd0Lk1hcDt0aGlzLl9zZWxlY3Rpb24uZWFjaCgoZnVuY3Rpb24odCl7aS5zZXQodC5pLHRoaXMpfSkpLHRoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2RlTWFwPWksdGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzPW51bGwsdGhpcy5fc2VsZWN0aW9uLmRhdGEodGhpcy5fc2VsZWN0aW9uLmRhdGEoKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmR9KSkpLG51bGwhPXRoaXMuX2NsYXNzTmFtZSYmdGhpcy5fc2VsZWN0aW9uLmNsYXNzZWQodGhpcy5fY2xhc3NOYW1lLCEwKSx0aGlzLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzKHRoaXMuX3NlbGVjdGlvbil9LHQucHJvdG90eXBlLl9kcmF3U3RlcD1mdW5jdGlvbih0KXt2YXIgZT10aGlzO1siZmlsbCIsInN0cm9rZSJdLmZvckVhY2goKGZ1bmN0aW9uKG4pe251bGwhPXQuYXR0clRvQXBwbGllZFByb2plY3RvcltuXSYmZS5fc2VsZWN0aW9uLmF0dHIobix0LmF0dHJUb0FwcGxpZWRQcm9qZWN0b3Jbbl0pfSkpLHQuYW5pbWF0b3IuYW5pbWF0ZSh0aGlzLl9zZWxlY3Rpb24sdC5hdHRyVG9BcHBsaWVkUHJvamVjdG9yKSxudWxsIT10aGlzLl9jbGFzc05hbWUmJnRoaXMuX3NlbGVjdGlvbi5jbGFzc2VkKHRoaXMuX2NsYXNzTmFtZSwhMCl9LHR9KSgpO1l3dC5TVkdEcmF3ZXI9S3d0O3ZhciBad3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTctcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KFp3dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIEp3dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIHQ9dGhpczt0aGlzLnNjYWxlPTAsdGhpcy50cmFuc2xhdGU9MCx0aGlzLmNhY2hlZERvbWFpbj1bbnVsbCxudWxsXSx0aGlzLmxhc3RTZWVuRG9tYWluPVtudWxsLG51bGxdLHRoaXMudXBkYXRlRG9tYWluPWZ1bmN0aW9uKGUpe3QubGFzdFNlZW5Eb21haW49ZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpO3ZhciBuPWUuc2NhbGVUcmFuc2Zvcm1hdGlvbih0LmNhY2hlZERvbWFpblsxXSktZS5zY2FsZVRyYW5zZm9ybWF0aW9uKHQuY2FjaGVkRG9tYWluWzBdKSxpPWUuc2NhbGVUcmFuc2Zvcm1hdGlvbih0Lmxhc3RTZWVuRG9tYWluWzFdKS1lLnNjYWxlVHJhbnNmb3JtYXRpb24odC5sYXN0U2VlbkRvbWFpblswXSk7dC5zY2FsZT1uL2l8fDEsdC50cmFuc2xhdGU9ZS5zY2FsZVRyYW5zZm9ybWF0aW9uKHQuY2FjaGVkRG9tYWluWzBdKS1lLnNjYWxlVHJhbnNmb3JtYXRpb24odC5sYXN0U2VlbkRvbWFpblswXSkqdC5zY2FsZXx8MH19cmV0dXJuIHQucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5zY2FsZT0xLHRoaXMudHJhbnNsYXRlPTAsdGhpcy5jYWNoZWREb21haW49dGhpcy5sYXN0U2VlbkRvbWFpbn0sdC5wcm90b3R5cGUuc2V0RG9tYWluPWZ1bmN0aW9uKHQpe3RoaXMuY2FjaGVkRG9tYWluPXQuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKX0sdH0pKCksUXd0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuKXt2YXIgaT10aGlzO3RoaXMucmVuZGVyQ2FsbGJhY2s9ZSx0aGlzLmFwcGx5VHJhbnNmb3JtQ2FsbGJhY2s9bix0aGlzLmRvbWFpblRyYW5zZm9ybVg9bmV3IEp3dCx0aGlzLmRvbWFpblRyYW5zZm9ybVk9bmV3IEp3dCx0aGlzLnJlbmRlckRlZmVycmVkPWZ1bmN0aW9uKCl7aS5hcHBseVRyYW5zZm9ybSgpLGNsZWFyVGltZW91dChpLnRpbWVvdXRUb2tlbiksaS50aW1lb3V0VG9rZW49c2V0VGltZW91dCgoZnVuY3Rpb24oKXtpLnJlbmRlckNhbGxiYWNrKCl9KSx0LkRFRkVSUkVEX1JFTkRFUklOR19ERUxBWSl9fXJldHVybiB0LnByb3RvdHlwZS5zZXREb21haW5zPWZ1bmN0aW9uKHQsZSl7dCYmdGhpcy5kb21haW5UcmFuc2Zvcm1YLnNldERvbWFpbih0KSxlJiZ0aGlzLmRvbWFpblRyYW5zZm9ybVkuc2V0RG9tYWluKGUpLHRoaXMucmVuZGVyRGVmZXJyZWQoKX0sdC5wcm90b3R5cGUudXBkYXRlRG9tYWlucz1mdW5jdGlvbih0LGUpe3QmJnRoaXMuZG9tYWluVHJhbnNmb3JtWC51cGRhdGVEb21haW4odCksZSYmdGhpcy5kb21haW5UcmFuc2Zvcm1ZLnVwZGF0ZURvbWFpbihlKSx0aGlzLnJlbmRlckRlZmVycmVkKCl9LHQucHJvdG90eXBlLnJlc2V0VHJhbnNmb3Jtcz1mdW5jdGlvbigpe3RoaXMuZG9tYWluVHJhbnNmb3JtWC5yZXNldCgpLHRoaXMuZG9tYWluVHJhbnNmb3JtWS5yZXNldCgpLHRoaXMuYXBwbHlUcmFuc2Zvcm0oKX0sdC5wcm90b3R5cGUuYXBwbHlUcmFuc2Zvcm09ZnVuY3Rpb24oKXt0aGlzLmFwcGx5VHJhbnNmb3JtQ2FsbGJhY2sodGhpcy5kb21haW5UcmFuc2Zvcm1YLnRyYW5zbGF0ZSx0aGlzLmRvbWFpblRyYW5zZm9ybVkudHJhbnNsYXRlLHRoaXMuZG9tYWluVHJhbnNmb3JtWC5zY2FsZSx0aGlzLmRvbWFpblRyYW5zZm9ybVkuc2NhbGUpfSx0LkRFRkVSUkVEX1JFTkRFUklOR19ERUxBWT0yMDAsdH0pKCk7Wnd0LkRlZmVycmVkUmVuZGVyZXI9UXd0LAovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodXd0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgdFN0PXVPLGVTdD1FZHQsblN0PV9tdCxpU3Q9Rmd0LHJTdD1od3Qsb1N0PWR3dCxhU3Q9Qmd0LHNTdD1Hd3QsbFN0PVd3dCxjU3Q9WXd0LHVTdD1ibXQsaFN0PVp3dDt1d3QuUmVuZGVyZXI9U210Lm1ha2VFbnVtKFsic3ZnIiwiY2FudmFzIl0pO3ZhciBkU3Q9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7bi5fZGF0YUNoYW5nZWQ9ITEsbi5fYXR0ckV4dGVudHM9e30sbi5fYW5pbWF0ZT0hMSxuLl9hbmltYXRvcnM9e30sbi5fcHJvcGVydHlFeHRlbnRzPXt9LG4uX3Jlc2V0RW50aXR5U3RvcmU9ZnVuY3Rpb24oKXtuLl9jYWNoZWRFbnRpdHlTdG9yZT12b2lkIDB9LG4uX292ZXJmbG93SGlkZGVuPSEwLG4uYWRkQ2xhc3MoInBsb3QiKSxuLl9kYXRhc2V0VG9EcmF3ZXI9bmV3IGlTdC5NYXAsbi5fYXR0ckJpbmRpbmdzPWVTdC5tYXAoKSxuLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uX2luY2x1ZGVkVmFsdWVzRm9yU2NhbGUodCxlKX0sbi5fcmVuZGVyQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gbi5yZW5kZXIoKX0sbi5fb25EYXRhc2V0VXBkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gbi5fb25EYXRhc2V0VXBkYXRlKCl9LG4uX3Byb3BlcnR5QmluZGluZ3M9ZVN0Lm1hcCgpO3ZhciBpPShuZXcgblN0LkVhc2luZykubWF4VG90YWxEdXJhdGlvbihlLl9BTklNQVRJT05fTUFYX0RVUkFUSU9OKTtyZXR1cm4gbi5hbmltYXRvcihyU3QuQW5pbWF0b3IuTUFJTixpKSxuLmFuaW1hdG9yKHJTdC5BbmltYXRvci5SRVNFVCxuZXcgblN0Lk51bGwpLG4uX2RlZmVycmVkUmVzZXRFbnRpdHlTdG9yZT1pU3QuV2luZG93LmRlYm91bmNlKGhTdC5EZWZlcnJlZFJlbmRlcmVyLkRFRkVSUkVEX1JFTkRFUklOR19ERUxBWSxuLl9yZXNldEVudGl0eVN0b3JlKSxufXJldHVybiB0U3QuX19leHRlbmRzKGUsdCksZS5nZXRUb3RhbERyYXdUaW1lPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUucmVkdWNlKChmdW5jdGlvbihlLG4pe3JldHVybiBlK24uYW5pbWF0b3IudG90YWxUaW1lKHQubGVuZ3RoKX0pLDApfSxlLmFwcGx5RHJhd1N0ZXBzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubWFwKChmdW5jdGlvbih0KXt2YXIgbj10LmF0dHJUb1Byb2plY3RvcixpPXt9O3JldHVybiBPYmplY3Qua2V5cyhuKS5mb3JFYWNoKChmdW5jdGlvbih0KXtpW3RdPWZ1bmN0aW9uKGkscil7cmV0dXJuIG5bdF0oaSxyLGUpfX0pKSx7YXR0clRvQXBwbGllZFByb2plY3RvcjppLGFuaW1hdG9yOnQuYW5pbWF0b3J9fSkpfSxlLnByb3RvdHlwZS5hbmNob3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dVN0LmNvZXJjZUV4dGVybmFsRDMoZSksdC5wcm90b3R5cGUuYW5jaG9yLmNhbGwodGhpcyxlKSx0aGlzLl9kYXRhQ2hhbmdlZD0hMCx0aGlzLl9yZXNldEVudGl0eVN0b3JlKCksdGhpcy5fdXBkYXRlRXh0ZW50cygpLHRoaXN9LGUucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5faXNTZXR1cHx8KHQucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpLG51bGwhPXRoaXMuX2NhbnZhcyYmdGhpcy5fYXBwZW5kQ2FudmFzTm9kZSgpLHRoaXMuX3JlbmRlckFyZWE9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgicmVuZGVyLWFyZWEiLCEwKSx0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldCh0KX0pKSl9LGUucHJvdG90eXBlLl9hcHBlbmRDYW52YXNOb2RlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbGVtZW50KCkuc2VsZWN0KCIucGxvdC1jYW52YXMtY29udGFpbmVyIik7dC5lbXB0eSgpJiYodD10aGlzLmVsZW1lbnQoKS5hcHBlbmQoImRpdiIpLmNsYXNzZWQoInBsb3QtY2FudmFzLWNvbnRhaW5lciIsITApKS5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fY2FudmFzLm5vZGUoKSl9LGUucHJvdG90eXBlLnNldEJvdW5kcz1mdW5jdGlvbihlLG4saSxyKXtpZih0LnByb3RvdHlwZS5zZXRCb3VuZHMuY2FsbCh0aGlzLGUsbixpLHIpLHRoaXMuX3VwZGF0ZUV4dGVudHMoKSxudWxsIT10aGlzLl9jYW52YXMpe2lmKHRoaXMuX2J1ZmZlckNhbnZhcyYmIXRoaXMuX2J1ZmZlckNhbnZhc1ZhbGlkKXt0aGlzLl9idWZmZXJDYW52YXMuYXR0cigid2lkdGgiLHRoaXMuX2NhbnZhcy5hdHRyKCJ3aWR0aCIpKSx0aGlzLl9idWZmZXJDYW52YXMuYXR0cigiaGVpZ2h0Iix0aGlzLl9jYW52YXMuYXR0cigiaGVpZ2h0IikpO3ZhciBvPXRoaXMuX2J1ZmZlckNhbnZhcy5ub2RlKCkuZ2V0Q29udGV4dCgiMmQiKTtpZihvKXt2YXIgYT10aGlzLl9jYW52YXMubm9kZSgpO2Eud2lkdGg+MCYmYS5oZWlnaHQ+MD9vLmNhbnZhcy53aWR0aD4wJiZvLmNhbnZhcy5oZWlnaHQ+MCYmby5kcmF3SW1hZ2UoYSwwLDApOmNvbnNvbGUud2FybigiRmFpbGVkIHRvIGZpbGwgYnVmZmVyIGNhbnZhcyB3aXRoIHdpdGggMHgwIGNhbnZhcyIpfXRoaXMuX2J1ZmZlckNhbnZhc1ZhbGlkPSEwfXZhciBzPW51bGwhPXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvP3dpbmRvdy5kZXZpY2VQaXhlbFJhdGlvOjE7dGhpcy5fY2FudmFzLmF0dHIoIndpZHRoIixlKnMpLHRoaXMuX2NhbnZhcy5hdHRyKCJoZWlnaHQiLG4qcyk7dmFyIGw9dGhpcy5fY2FudmFzLm5vZGUoKS5nZXRDb250ZXh0KCIyZCIpO2lmKGwmJihsLnNldFRyYW5zZm9ybShzLDAsMCxzLDAsMCksdGhpcy5fYnVmZmVyQ2FudmFzKSl7dmFyIGM9dGhpcy5fYnVmZmVyQ2FudmFzLm5vZGUoKTtjLndpZHRoPjAmJmMuaGVpZ2h0PjA/bC5jYW52YXMud2lkdGg+MCYmbC5jYW52YXMuaGVpZ2h0PjAmJmwuZHJhd0ltYWdlKGMsMCwwLGUsbik6Y29uc29sZS53YXJuKCJGYWlsZWQgdG8gZmlsbCBjYW52YXMgd2l0aCAweDAgYnVmZmVyIGNhbnZhcyIpfX1yZXR1cm4gdGhpc30sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpLHRoaXMuX3NjYWxlcygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm9mZlVwZGF0ZShlLl9yZW5kZXJDYWxsYmFjayl9KSksdGhpcy5kYXRhc2V0cyhbXSl9LGUucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZGF0YXNldFRvRHJhd2VyLmdldCh0KTtyZXR1cm4ic3ZnIj09PXRoaXMucmVuZGVyZXIoKT9lLnVzZVNWRyh0aGlzLl9yZW5kZXJBcmVhKTplLnVzZUNhbnZhcyh0aGlzLl9jYW52YXMpLGV9LGUucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBsU3QuUHJveHlEcmF3ZXIoKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBjU3QuU1ZHRHJhd2VyKCJwYXRoIiwiIil9KSwoZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBzU3QuQ2FudmFzRHJhd2VyKHQsKGZ1bmN0aW9uKCl7fSkpfSkpfSxlLnByb3RvdHlwZS5fZ2V0QW5pbWF0b3I9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSYmdGhpcy5fYW5pbWF0b3JzW3RdfHxuZXcgblN0Lk51bGx9LGUucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVFeHRlbnRzKCksdGhpcy5fZGF0YUNoYW5nZWQ9ITAsdGhpcy5fcmVzZXRFbnRpdHlTdG9yZSgpLHRoaXMucmVuZGVyTG93UHJpb3JpdHkoKX0sZS5wcm90b3R5cGUuYXR0cj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG51bGw9PWU/dGhpcy5fYXR0ckJpbmRpbmdzLmdldCh0KToodGhpcy5fYmluZEF0dHIodCxlLG4pLHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLl9iaW5kUHJvcGVydHk9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQodCksbz1udWxsIT1yP3Iuc2NhbGU6bnVsbDt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLnNldCh0LHthY2Nlc3NvcjoiZnVuY3Rpb24iPT10eXBlb2YgZT9lOmZ1bmN0aW9uKCl7cmV0dXJuIGV9LHNjYWxlOm4scG9zdFNjYWxlOml9KSxudWxsIT1vJiZ0aGlzLl91bmluc3RhbGxTY2FsZUZvcktleShvLHQpLG51bGwhPW4mJnRoaXMuX2luc3RhbGxTY2FsZUZvcktleShuLHQpLHRoaXMuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGUoKX0sZS5wcm90b3R5cGUuX2JpbmRBdHRyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLl9hdHRyQmluZGluZ3MuZ2V0KHQpLHI9bnVsbCE9aT9pLnNjYWxlOm51bGw7dGhpcy5fYXR0ckJpbmRpbmdzLnNldCh0LHthY2Nlc3NvcjoiZnVuY3Rpb24iPT10eXBlb2YgZT9lOmZ1bmN0aW9uKCl7cmV0dXJuIGV9LHNjYWxlOm59KSxudWxsIT1yJiZ0aGlzLl91bmluc3RhbGxTY2FsZUZvcktleShyLHQpLG51bGwhPW4mJnRoaXMuX2luc3RhbGxTY2FsZUZvcktleShuLHQpLHRoaXMuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGUoKX0sZS5wcm90b3R5cGUuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGU9ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yfSxlLnByb3RvdHlwZS5fZ2V0QXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7aWYobnVsbD09dGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yKXt2YXIgdD10aGlzLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3RvcigpO2UuT1BUSU1JWkVfTUVNT0laRV9QUk9KRUNUT1JTJiYodD1vU3QubWVtb2l6ZVByb2plY3RvcnModCkpLHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3Rvcj10fXJldHVybiBpU3QuYXNzaWduKHt9LHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3Rvcil9LGUucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe3ZhciB0PXt9O3RoaXMuX2F0dHJCaW5kaW5ncy5lYWNoKChmdW5jdGlvbihuLGkpe3RbaV09ZS5fc2NhbGVkQWNjZXNzb3Iobil9KSk7dmFyIG49dGhpcy5fcHJvcGVydHlQcm9qZWN0b3JzKCk7cmV0dXJuIE9iamVjdC5rZXlzKG4pLmZvckVhY2goKGZ1bmN0aW9uKGUpe251bGw9PXRbZV0mJih0W2VdPW5bZV0pfSkpLHR9LGUucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyksdGhpcy5faXNBbmNob3JlZCYmKHRoaXMuX3BhaW50KCksdGhpcy5fZGF0YUNoYW5nZWQ9ITEpLHRoaXN9LGUucHJvdG90eXBlLnJlbmRlckxvd1ByaW9yaXR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlbmRlckNhbGxiYWNrKCksdGhpc30sZS5wcm90b3R5cGUuYW5pbWF0ZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fYW5pbWF0ZToodGhpcy5fYW5pbWF0ZT10LHRoaXMpfSxlLnByb3RvdHlwZS5kZXRhY2g9ZnVuY3Rpb24oKXtyZXR1cm4gdC5wcm90b3R5cGUuZGV0YWNoLmNhbGwodGhpcyksdGhpcy5fdXBkYXRlRXh0ZW50cygpLHRoaXN9LGUucHJvdG90eXBlLl9zY2FsZXM9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5fYXR0ckJpbmRpbmdzLmVhY2goKGZ1bmN0aW9uKGUsbil7dmFyIGk9ZS5zY2FsZTtudWxsIT1pJiYtMT09PXQuaW5kZXhPZihpKSYmdC5wdXNoKGkpfSkpLHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZWFjaCgoZnVuY3Rpb24oZSxuKXt2YXIgaT1lLnNjYWxlO251bGwhPWkmJi0xPT09dC5pbmRleE9mKGkpJiZ0LnB1c2goaSl9KSksdH0sZS5wcm90b3R5cGUuX3VwZGF0ZUV4dGVudHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX3Jlc2V0RW50aXR5U3RvcmUoKSx0aGlzLl9zY2FsZXMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXtyZXR1cm4gZS5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHQuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXIpfSkpfSxlLnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGx9LGUucHJvdG90eXBlLmdldEV4dGVudHNGb3JBdHRyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYobnVsbD09dGhpcy5fYXR0ckV4dGVudHNbdF0pe3ZhciBuPW9TdC5tZW1UaHVuaygoZnVuY3Rpb24oKXtyZXR1cm4gZS5kYXRhc2V0cygpfSksKGZ1bmN0aW9uKCl7cmV0dXJuIGUuX2F0dHJCaW5kaW5ncy5nZXQodCl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09ZXx8bnVsbD09ZS5hY2Nlc3Nvcj9udWxsOnQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gcFN0KHQsZSxudWxsKX0pKX0pKTt0aGlzLl9hdHRyRXh0ZW50c1t0XT1ufXJldHVybiB0aGlzLl9hdHRyRXh0ZW50c1t0XSgpfSxlLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZihudWxsPT10aGlzLl9wcm9wZXJ0eUV4dGVudHNbdF0pe3ZhciBuPW9TdC5tZW1UaHVuaygoZnVuY3Rpb24oKXtyZXR1cm4gZS5kYXRhc2V0cygpfSksKGZ1bmN0aW9uKCl7cmV0dXJuIGUuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHQpfSksKGZ1bmN0aW9uKCl7cmV0dXJuIGUuX2ZpbHRlckZvclByb3BlcnR5KHQpfSksKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbnVsbD09ZXx8bnVsbD09ZS5hY2Nlc3Nvcj9udWxsOnQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gcFN0KHQsZSxuKX0pKX0pKTt0aGlzLl9wcm9wZXJ0eUV4dGVudHNbdF09bn1yZXR1cm4gdGhpcy5fcHJvcGVydHlFeHRlbnRzW3RdKCl9LGUucHJvdG90eXBlLl9pbmNsdWRlZFZhbHVlc0ZvclNjYWxlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpZighdGhpcy5faXNBbmNob3JlZCYmIWUpcmV0dXJuW107dmFyIGk9W107cmV0dXJuIHRoaXMuX2F0dHJCaW5kaW5ncy5lYWNoKChmdW5jdGlvbihlLHIpe2lmKGUuc2NhbGU9PT10KXt2YXIgbz1uLmdldEV4dGVudHNGb3JBdHRyKHIpO251bGwhPW8mJihpPWkuY29uY2F0KGVTdC5tZXJnZShvKSkpfX0pKSx0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmVhY2goKGZ1bmN0aW9uKGUscil7aWYoZS5zY2FsZT09PXQpe3ZhciBvPW4uZ2V0RXh0ZW50c0ZvclByb3BlcnR5KHIpO251bGwhPW8mJihpPWkuY29uY2F0KGVTdC5tZXJnZShvKSkpfX0pKSxpfSxlLnByb3RvdHlwZS5hbmltYXRvcj1mdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lP3RoaXMuX2FuaW1hdG9yc1t0XToodGhpcy5fYW5pbWF0b3JzW3RdPWUsdGhpcyl9LGUucHJvdG90eXBlLnJlbmRlcmVyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7cmV0dXJuIHZvaWQgMD09PXQ/bnVsbD09dGhpcy5fY2FudmFzPyJzdmciOiJjYW52YXMiOihudWxsPT10aGlzLl9jYW52YXMmJiJjYW52YXMiPT09dD8odGhpcy5fY2FudmFzPWVTdC5zZWxlY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikpLmNsYXNzZWQoInBsb3QtY2FudmFzIiwhMCksdGhpcy5fYnVmZmVyQ2FudmFzPWVTdC5zZWxlY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikpLG51bGwhPXRoaXMuZWxlbWVudCgpJiZ0aGlzLl9hcHBlbmRDYW52YXNOb2RlKCksdGhpcy5fZGF0YXNldFRvRHJhd2VyLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QudXNlQ2FudmFzKGUuX2NhbnZhcyl9KSksdGhpcy5yZW5kZXIoKSk6bnVsbCE9dGhpcy5fY2FudmFzJiYic3ZnIj09dCYmKHRoaXMuX2NhbnZhcy5yZW1vdmUoKSx0aGlzLl9jYW52YXM9bnVsbCx0aGlzLl9idWZmZXJDYW52YXM9bnVsbCx0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC51c2VTVkcoZS5fcmVuZGVyQXJlYSl9KSksdGhpcy5yZW5kZXIoKSksdGhpcyl9LGUucHJvdG90eXBlLmFkZERhdGFzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FkZERhdGFzZXQodCksdGhpcy5fb25EYXRhc2V0VXBkYXRlKCksdGhpc30sZS5wcm90b3R5cGUuX2FkZERhdGFzZXQ9ZnVuY3Rpb24odCl7dGhpcy5fcmVtb3ZlRGF0YXNldCh0KTt2YXIgZT10aGlzLl9jcmVhdGVEcmF3ZXIodCk7cmV0dXJuIHRoaXMuX2RhdGFzZXRUb0RyYXdlci5zZXQodCxlKSx0aGlzLl9pc1NldHVwJiZ0aGlzLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQodCksdC5vblVwZGF0ZSh0aGlzLl9vbkRhdGFzZXRVcGRhdGVDYWxsYmFjayksdGhpc30sZS5wcm90b3R5cGUucmVtb3ZlRGF0YXNldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVtb3ZlRGF0YXNldCh0KSx0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKSx0aGlzfSxlLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldD1mdW5jdGlvbih0KXtyZXR1cm4tMT09PXRoaXMuZGF0YXNldHMoKS5pbmRleE9mKHQpfHwodGhpcy5fcmVtb3ZlRGF0YXNldE5vZGVzKHQpLHQub2ZmVXBkYXRlKHRoaXMuX29uRGF0YXNldFVwZGF0ZUNhbGxiYWNrKSx0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZGVsZXRlKHQpKSx0aGlzfSxlLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzPWZ1bmN0aW9uKHQpe3RoaXMuX2RhdGFzZXRUb0RyYXdlci5nZXQodCkucmVtb3ZlKCl9LGUucHJvdG90eXBlLmRhdGFzZXRzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1bXTtyZXR1cm4gdGhpcy5fZGF0YXNldFRvRHJhd2VyLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4ucHVzaChlKX0pKSxudWxsPT10P246KG4uZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX3JlbW92ZURhdGFzZXQodCl9KSksdC5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fYWRkRGF0YXNldCh0KX0pKSx0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKSx0aGlzKX0sZS5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7cmV0dXJuW3thdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6bmV3IG5TdC5OdWxsfV19LGUucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24odCl7fSxlLnByb3RvdHlwZS5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxpKXtmb3IodmFyIHI9ZS5fZGF0YXNldFRvRHJhd2VyLmdldCh0KSxvPTAsYT10LmRhdGEoKSxzPWEubGVuZ3RoLGw9ZnVuY3Rpb24ocyl7dmFyIGw9YVtzXSxjPWUuX3BpeGVsUG9pbnQobCxzLHQpO2lmKGlTdC5NYXRoLmlzTmFOKGMueCl8fGlTdC5NYXRoLmlzTmFOKGMueSkpcmV0dXJuImNvbnRpbnVlIjt2YXIgdT1lO24ucHVzaCh7ZGF0dW06bCxnZXQgcG9zaXRpb24oKXtyZXR1cm4gdS5fcGl4ZWxQb2ludC5jYWxsKHUsbCxzLHQpfSxpbmRleDpzLGRhdGFzZXQ6dCxkYXRhc2V0SW5kZXg6aSxjb21wb25lbnQ6ZSxkcmF3ZXI6cix2YWxpZERhdHVtSW5kZXg6b30pLG8rK30sYz0wO2M8cztjKyspbChjKX0pKSxufSxlLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciB0PW5ldyBpU3QuTWFwO3JldHVybiB0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuc2V0KGUsZS5kYXRhKCkpfSkpLHR9LGUucHJvdG90eXBlLl9wYWludD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7ZGVsZXRlIHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3Rvcjt2YXIgbj10aGlzLl9nZW5lcmF0ZURyYXdTdGVwcygpLGk9dGhpcy5fZ2V0RGF0YVRvRHJhdygpLHI9dGhpcy5kYXRhc2V0cygpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuX2RhdGFzZXRUb0RyYXdlci5nZXQoZSl9KSk7aWYoImNhbnZhcyI9PT10aGlzLnJlbmRlcmVyKCkpe3ZhciBvPXRoaXMuX2NhbnZhcy5ub2RlKCk7by5nZXRDb250ZXh0KCIyZCIpLmNsZWFyUmVjdCgwLDAsby5jbGllbnRXaWR0aCxvLmNsaWVudEhlaWdodCksdGhpcy5fYnVmZmVyQ2FudmFzVmFsaWQ9ITF9dGhpcy5kYXRhc2V0cygpLmZvckVhY2goKGZ1bmN0aW9uKHQsbyl7dmFyIGE9ZS5hcHBseURyYXdTdGVwcyhuLHQpO3Jbb10uZHJhdyhpLmdldCh0KSxhKX0pKTt2YXIgYT10aGlzLmRhdGFzZXRzKCkubWFwKChmdW5jdGlvbih0LHIpe3JldHVybiBlLmdldFRvdGFsRHJhd1RpbWUoaS5nZXQodCksbil9KSkscz1pU3QuTWF0aC5tYXgoYSwwKTt0aGlzLl9hZGRpdGlvbmFsUGFpbnQocyl9LGUucHJvdG90eXBlLnNlbGVjdGlvbnM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZih2b2lkIDA9PT10JiYodD10aGlzLmRhdGFzZXRzKCkpLCJjYW52YXMiPT09dGhpcy5yZW5kZXJlcigpKXJldHVybiBlU3Quc2VsZWN0QWxsKCk7dmFyIG49W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGk9ZS5fZGF0YXNldFRvRHJhd2VyLmdldCh0KTtpZihudWxsIT1pKXt2YXIgcj1pLmdldFZpc3VhbFByaW1pdGl2ZXMoKTtuLnB1c2guYXBwbHkobixyKX19KSksZVN0LnNlbGVjdEFsbChuKX0sZS5wcm90b3R5cGUuZW50aXRpZXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4gdGhpcy5fZ2V0RW50aXR5U3RvcmUodCkuZW50aXRpZXMoKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkodCl9KSl9LGUucHJvdG90eXBlLmZpbHRlckVudGl0aWVzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7cmV0dXJuIHRoaXMuX2dldEVudGl0eVN0b3JlKCkuZW50aXRpZXMoKS5maWx0ZXIodCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KHQpfSkpfSxlLnByb3RvdHlwZS5fZ2V0RW50aXR5U3RvcmU9ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzLGk9ZnVuY3Rpb24odCl7cmV0dXJuIG4uX2VudGl0eUJvdW5kcyh0KX07cmV0dXJuIHZvaWQgMCE9PXQ/KChlPW5ldyBpU3QuRW50aXR5U3RvcmUpLmFkZEFsbCh0aGlzLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzKHQpLGksdGhpcy5fbG9jYWxPcmlnaW5Cb3VuZHMoKSksZSk6KHZvaWQgMD09PXRoaXMuX2NhY2hlZEVudGl0eVN0b3JlJiYoKGU9bmV3IGlTdC5FbnRpdHlTdG9yZSkuYWRkQWxsKHRoaXMuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXModGhpcy5kYXRhc2V0cygpKSxpLHRoaXMuX2xvY2FsT3JpZ2luQm91bmRzKCkpLHRoaXMuX2NhY2hlZEVudGl0eVN0b3JlPWUpLHRoaXMuX2NhY2hlZEVudGl0eVN0b3JlKX0sZS5wcm90b3R5cGUuX2xvY2FsT3JpZ2luQm91bmRzPWZ1bmN0aW9uKCl7cmV0dXJue3RvcExlZnQ6e3g6MCx5OjB9LGJvdHRvbVJpZ2h0Ont4OnRoaXMud2lkdGgoKSx5OnRoaXMuaGVpZ2h0KCl9fX0sZS5wcm90b3R5cGUuX2VudGl0eUJvdW5kcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9waXhlbFBvaW50KHQuZGF0dW0sdC5pbmRleCx0LmRhdGFzZXQpO3JldHVybnt4OmUueCx5OmUueSx3aWR0aDowLGhlaWdodDowfX0sZS5wcm90b3R5cGUuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eT1mdW5jdGlvbih0KXtyZXR1cm57Ym91bmRzOnRoaXMuX2VudGl0eUJvdW5kcyh0KSxjb21wb25lbnQ6dC5jb21wb25lbnQsZGF0YXNldDp0LmRhdGFzZXQsZGF0YXNldEluZGV4OnQuZGF0YXNldEluZGV4LGRhdHVtOnQuZGF0dW0saW5kZXg6dC5pbmRleCxwb3NpdGlvbjp0LnBvc2l0aW9uLHNlbGVjdGlvbjplU3Quc2VsZWN0KHQuZHJhd2VyLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXgodC52YWxpZERhdHVtSW5kZXgpKX19LGUucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJwbG90cyBtdXN0IGltcGxlbWVudCBlbnRpdGllc0F0Iil9LGUucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdHlOZWFyZXN0KHQpO3JldHVybiB2b2lkIDA9PT1lP3ZvaWQgMDp0aGlzLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoZSl9LGUucHJvdG90eXBlLmVudGl0aWVzSW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5lbnRpdGllc0luQm91bmRzKG51bGw9PWU/e3g6dC50b3BMZWZ0LngseTp0LnRvcExlZnQueSx3aWR0aDp0LmJvdHRvbVJpZ2h0LngtdC50b3BMZWZ0LngsaGVpZ2h0OnQuYm90dG9tUmlnaHQueS10LnRvcExlZnQueX06e3g6dC5taW4seTplLm1pbix3aWR0aDp0Lm1heC10Lm1pbixoZWlnaHQ6ZS5tYXgtZS5taW59KX0sZS5wcm90b3R5cGUuZW50aXRpZXNJbkJvdW5kcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllc0luQm91bmRzKHQpO2lmKG4pcmV0dXJuIG4ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KHQpfSkpfSxlLnByb3RvdHlwZS5lbnRpdGllc0luWEJvdW5kcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllc0luWEJvdW5kcyh0KTtpZihuKXJldHVybiBuLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eSh0KX0pKX0sZS5wcm90b3R5cGUuZW50aXRpZXNJbllCb3VuZHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXRoaXMuX2dldEVudGl0eVN0b3JlKCkuZW50aXRpZXNJbllCb3VuZHModCk7aWYobilyZXR1cm4gbi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkodCl9KSl9LGUucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbih0LGUpe3Qub2ZmVXBkYXRlKHRoaXMuX3JlbmRlckNhbGxiYWNrKSx0Lm9mZlVwZGF0ZSh0aGlzLl9kZWZlcnJlZFJlc2V0RW50aXR5U3RvcmUpLHQucmVtb3ZlSW5jbHVkZWRWYWx1ZXNQcm92aWRlcih0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKX0sZS5wcm90b3R5cGUuX2luc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbih0LGUpe3Qub25VcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spLHQub25VcGRhdGUodGhpcy5fZGVmZXJyZWRSZXNldEVudGl0eVN0b3JlKSx0LmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXIodGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcil9LGUucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXtyZXR1cm57fX0sZS5fc2NhbGVkQWNjZXNzb3I9ZnVuY3Rpb24odCl7dmFyIGU9dC5zY2FsZSxuPXQuYWNjZXNzb3IsaT10LnBvc3RTY2FsZSxyPW51bGw9PWU/bjpmdW5jdGlvbih0LGkscil7cmV0dXJuIGUuc2NhbGUobih0LGkscikpfTtyZXR1cm4gbnVsbD09aT9yOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaShyKHQsZSxuKSx0LGUsbil9fSxlLnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbih0LGUsbil7cmV0dXJue3g6MCx5OjB9fSxlLnByb3RvdHlwZS5fYW5pbWF0ZU9uTmV4dFJlbmRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbmltYXRlJiZ0aGlzLl9kYXRhQ2hhbmdlZH0sZS5PUFRJTUlaRV9NRU1PSVpFX1BST0pFQ1RPUlM9ITEsZS5fQU5JTUFUSU9OX01BWF9EVVJBVElPTj02MDAsZX0pKGFTdC5Db21wb25lbnQpO2Z1bmN0aW9uIHBTdCh0LGUsbil7dmFyIGk9ZS5hY2Nlc3NvcixyPWUuc2NhbGU7aWYobnVsbD09cilyZXR1cm5bXTt2YXIgbz10LmRhdGEoKTtudWxsIT1uJiYobz1vLmZpbHRlcigoZnVuY3Rpb24oZSxpKXtyZXR1cm4gbihlLGksdCl9KSkpO3ZhciBhPW8ubWFwKChmdW5jdGlvbihlLG4pe3JldHVybiBpKGUsbix0KX0pKTtyZXR1cm4gci5leHRlbnRPZlZhbHVlcyhhKX0KLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi91d3QuUGxvdD1kU3QsT2JqZWN0LmRlZmluZVByb3BlcnR5KGN3dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGZTdD11TyxtU3Q9dXd0LGdTdD1GZ3QsX1N0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gZlN0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24odCl7dmFyIGUsbj0xLzA7cmV0dXJuIHRoaXMuY29tcG9uZW50cygpLmZvckVhY2goKGZ1bmN0aW9uKGkpe3ZhciByPWkuZW50aXR5TmVhcmVzdCh0KTtpZihudWxsIT1yKXt2YXIgbz1nU3QuTWF0aC5kaXN0YW5jZVNxdWFyZWQoci5wb3NpdGlvbix0KTtvPD1uJiYobj1vLGU9cil9fSkpLGV9LGUucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbihlKXtpZihudWxsIT1lJiYhKGUgaW5zdGFuY2VvZiBtU3QuUGxvdCkpdGhyb3cgbmV3IEVycm9yKCJQbG90IEdyb3VwIG9ubHkgYWNjZXB0cyBwbG90cyIpO3JldHVybiB0LnByb3RvdHlwZS5hcHBlbmQuY2FsbCh0aGlzLGUpLHRoaXN9LGV9KShieHQuR3JvdXApO2N3dC5QbG90R3JvdXA9X1N0O3ZhciB5U3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KHlTdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHZTdD11TyxiU3Q9RWR0LHhTdD1GZ3Qsd1N0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPVtdKTt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4uX3Jvd1BhZGRpbmc9MCxuLl9jb2x1bW5QYWRkaW5nPTAsbi5fcm93cz1bXSxuLl9yb3dXZWlnaHRzPVtdLG4uX2NvbHVtbldlaWdodHM9W10sbi5fblJvd3M9MCxuLl9uQ29scz0wLG4uX2NhbGN1bGF0ZWRMYXlvdXQ9bnVsbCxuLmFkZENsYXNzKCJ0YWJsZSIpLGUuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQsaSl7bnVsbCE9dCYmbi5hZGQodCxlLGkpfSkpfSkpLG59cmV0dXJuIHZTdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fZm9yRWFjaD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX25Sb3dzO2UrKylmb3IodmFyIG49MDtuPHRoaXMuX25Db2xzO24rKyludWxsIT10aGlzLl9yb3dzW2VdW25dJiZ0KHRoaXMuX3Jvd3NbZV1bbl0pfSxlLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9uUm93cztlKyspZm9yKHZhciBuPTA7bjx0aGlzLl9uQ29scztuKyspaWYodGhpcy5fcm93c1tlXVtuXT09PXQpcmV0dXJuITA7cmV0dXJuITF9LGUucHJvdG90eXBlLmNvbXBvbmVudEF0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8MHx8dD49dGhpcy5fblJvd3N8fGU8MHx8ZT49dGhpcy5fbkNvbHM/bnVsbDp0aGlzLl9yb3dzW3RdW2VdfSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCxlLG4pe2lmKG51bGw9PXQpdGhyb3cgRXJyb3IoIkNhbm5vdCBhZGQgbnVsbCB0byBhIHRhYmxlIGNlbGwiKTtpZighdGhpcy5oYXModCkpe2lmKG51bGwhPSh0aGlzLl9yb3dzW2VdJiZ0aGlzLl9yb3dzW2VdW25dKSl0aHJvdyBuZXcgRXJyb3IoImNlbGwgaXMgb2NjdXBpZWQiKTt0LmRldGFjaCgpLHRoaXMuX25Sb3dzPU1hdGgubWF4KGUrMSx0aGlzLl9uUm93cyksdGhpcy5fbkNvbHM9TWF0aC5tYXgobisxLHRoaXMuX25Db2xzKSx0aGlzLl9wYWRUYWJsZVRvU2l6ZSh0aGlzLl9uUm93cyx0aGlzLl9uQ29scyksdGhpcy5fcm93c1tlXVtuXT10LHRoaXMuX2Fkb3B0QW5kQW5jaG9yKHQpLHRoaXMucmVkcmF3KCl9cmV0dXJuIHRoaXN9LGUucHJvdG90eXBlLl9yZW1vdmU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9uUm93cztlKyspZm9yKHZhciBuPTA7bjx0aGlzLl9uQ29scztuKyspaWYodGhpcy5fcm93c1tlXVtuXT09PXQpcmV0dXJuIHRoaXMuX3Jvd3NbZV1bbl09bnVsbCwhMDtyZXR1cm4hMX0sZS5wcm90b3R5cGUuX2l0ZXJhdGVMYXlvdXQ9ZnVuY3Rpb24odCxuLGkpe3ZvaWQgMD09PWkmJihpPSExKTtmb3IodmFyIHIsbyxhLHMsbCxjPXRoaXMuX3Jvd3MsdT1iU3QudHJhbnNwb3NlKHRoaXMuX3Jvd3MpLGg9dC10aGlzLl9jb2x1bW5QYWRkaW5nKih0aGlzLl9uQ29scy0xKSxkPW4tdGhpcy5fcm93UGFkZGluZyoodGhpcy5fblJvd3MtMSkscD1lLl9jYWxjQ29tcG9uZW50V2VpZ2h0cyh0aGlzLl9yb3dXZWlnaHRzLGMsKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fHx0LmZpeGVkSGVpZ2h0KCl9KSksZj1lLl9jYWxjQ29tcG9uZW50V2VpZ2h0cyh0aGlzLl9jb2x1bW5XZWlnaHRzLHUsKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fHx0LmZpeGVkV2lkdGgoKX0pKSxtPWYubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQ/LjU6dH0pKSxnPXAubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQ/LjU6dH0pKSxfPWUuX2NhbGNQcm9wb3J0aW9uYWxTcGFjZShtLGgpLHk9ZS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKGcsZCksdj14U3QuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCx0aGlzLl9uQ29scyksYj14U3QuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCx0aGlzLl9uUm93cykseD0wOzspe3ZhciB3PXhTdC5BcnJheS5hZGQoYix5KSxTPXhTdC5BcnJheS5hZGQodixfKTt2PShhPXRoaXMuX2RldGVybWluZUd1YXJhbnRlZXMoUyx3LGkpKS5ndWFyYW50ZWVkV2lkdGhzLGI9YS5ndWFyYW50ZWVkSGVpZ2h0cyxzPWEud2FudHNXaWR0aEFyci5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gdH0pKSxsPWEud2FudHNIZWlnaHRBcnIuc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIHR9KSk7dmFyIE09cixFPW87cj1oLWJTdC5zdW0oYS5ndWFyYW50ZWVkV2lkdGhzKSxvPWQtYlN0LnN1bShhLmd1YXJhbnRlZWRIZWlnaHRzKTt2YXIgVD12b2lkIDA7cz8oVD1hLndhbnRzV2lkdGhBcnIubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdD8uMTowfSkpLFQ9eFN0LkFycmF5LmFkZChULGYpKTpUPWY7dmFyIEM9dm9pZCAwO2lmKGw/KEM9YS53YW50c0hlaWdodEFyci5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0Py4xOjB9KSksQz14U3QuQXJyYXkuYWRkKEMscCkpOkM9cCxfPWUuX2NhbGNQcm9wb3J0aW9uYWxTcGFjZShULHIpLHk9ZS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKEMsbykseCsrLCEocj4wJiZyIT09TXx8bz4wJiZvIT09RSkpYnJlYWs7aWYoeD41KWJyZWFrfXJldHVybiByPWgtYlN0LnN1bShhLmd1YXJhbnRlZWRXaWR0aHMpLG89ZC1iU3Quc3VtKGEuZ3VhcmFudGVlZEhlaWdodHMpLHtjb2xQcm9wb3J0aW9uYWxTcGFjZTpfPWUuX2NhbGNQcm9wb3J0aW9uYWxTcGFjZShmLHIpLHJvd1Byb3BvcnRpb25hbFNwYWNlOnk9ZS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKHAsbyksZ3VhcmFudGVlZFdpZHRoczphLmd1YXJhbnRlZWRXaWR0aHMsZ3VhcmFudGVlZEhlaWdodHM6YS5ndWFyYW50ZWVkSGVpZ2h0cyx3YW50c1dpZHRoOnMsd2FudHNIZWlnaHQ6bH19LGUucHJvdG90eXBlLl9kZXRlcm1pbmVHdWFyYW50ZWVzPWZ1bmN0aW9uKHQsZSxuKXt2b2lkIDA9PT1uJiYobj0hMSk7dmFyIGk9eFN0LkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KDAsdGhpcy5fbkNvbHMpLHI9eFN0LkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KDAsdGhpcy5fblJvd3MpLG89eFN0LkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KCExLHRoaXMuX25Db2xzKSxhPXhTdC5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSghMSx0aGlzLl9uUm93cyk7cmV0dXJuIHRoaXMuX3Jvd3MuZm9yRWFjaCgoZnVuY3Rpb24ocyxsKXtzLmZvckVhY2goKGZ1bmN0aW9uKHMsYyl7dmFyIHU7dT1udWxsIT1zP3MucmVxdWVzdGVkU3BhY2UodFtjXSxlW2xdKTp7bWluV2lkdGg6MCxtaW5IZWlnaHQ6MH07dmFyIGg9bj9NYXRoLm1pbih1Lm1pbldpZHRoLHRbY10pOnUubWluV2lkdGg7aVtjXT1NYXRoLm1heChpW2NdLGgpO3ZhciBkPW4/TWF0aC5taW4odS5taW5IZWlnaHQsZVtsXSk6dS5taW5IZWlnaHQ7cltsXT1NYXRoLm1heChyW2xdLGQpLG9bY109b1tjXXx8dS5taW5XaWR0aD50W2NdLGFbbF09YVtsXXx8dS5taW5IZWlnaHQ+ZVtsXX0pKX0pKSx7Z3VhcmFudGVlZFdpZHRoczppLGd1YXJhbnRlZWRIZWlnaHRzOnIsd2FudHNXaWR0aEFycjpvLHdhbnRzSGVpZ2h0QXJyOmF9fSxlLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9jYWxjdWxhdGVkTGF5b3V0PXRoaXMuX2l0ZXJhdGVMYXlvdXQodCxlKSx7bWluV2lkdGg6YlN0LnN1bSh0aGlzLl9jYWxjdWxhdGVkTGF5b3V0Lmd1YXJhbnRlZWRXaWR0aHMpLG1pbkhlaWdodDpiU3Quc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZEhlaWdodHMpfX0sZS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihlLG4saSl7dmFyIHI9dGhpczt0LnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxlLG4saSk7dmFyIG89YlN0LnN1bSh0aGlzLl9jYWxjdWxhdGVkTGF5b3V0Lmd1YXJhbnRlZWRXaWR0aHMpLGE9YlN0LnN1bSh0aGlzLl9jYWxjdWxhdGVkTGF5b3V0Lmd1YXJhbnRlZWRIZWlnaHRzKSxzPXRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQ7KG8+dGhpcy53aWR0aCgpfHxhPnRoaXMuaGVpZ2h0KCkpJiYocz10aGlzLl9pdGVyYXRlTGF5b3V0KHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpLCEwKSk7dmFyIGw9MCxjPXhTdC5BcnJheS5hZGQocy5yb3dQcm9wb3J0aW9uYWxTcGFjZSxzLmd1YXJhbnRlZWRIZWlnaHRzKSx1PXhTdC5BcnJheS5hZGQocy5jb2xQcm9wb3J0aW9uYWxTcGFjZSxzLmd1YXJhbnRlZWRXaWR0aHMpO3JldHVybiB0aGlzLl9yb3dzLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7dmFyIG49MDt0LmZvckVhY2goKGZ1bmN0aW9uKHQsaSl7bnVsbCE9dCYmdC5jb21wdXRlTGF5b3V0KHt4Om4seTpsfSx1W2ldLGNbZV0pLG4rPXVbaV0rci5fY29sdW1uUGFkZGluZ30pKSxsKz1jW2VdK3IuX3Jvd1BhZGRpbmd9KSksdGhpc30sZS5wcm90b3R5cGUucm93UGFkZGluZz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9yb3dQYWRkaW5nO2lmKCF4U3QuTWF0aC5pc1ZhbGlkTnVtYmVyKHQpfHx0PDApdGhyb3cgRXJyb3IoInJvd1BhZGRpbmcgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgdmFsdWUiKTtyZXR1cm4gdGhpcy5fcm93UGFkZGluZz10LHRoaXMucmVkcmF3KCksdGhpc30sZS5wcm90b3R5cGUuY29sdW1uUGFkZGluZz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9jb2x1bW5QYWRkaW5nO2lmKCF4U3QuTWF0aC5pc1ZhbGlkTnVtYmVyKHQpfHx0PDApdGhyb3cgRXJyb3IoImNvbHVtblBhZGRpbmcgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgdmFsdWUiKTtyZXR1cm4gdGhpcy5fY29sdW1uUGFkZGluZz10LHRoaXMucmVkcmF3KCksdGhpc30sZS5wcm90b3R5cGUucm93V2VpZ2h0PWZ1bmN0aW9uKHQsZSl7aWYobnVsbD09ZSlyZXR1cm4gdGhpcy5fcm93V2VpZ2h0c1t0XTtpZigheFN0Lk1hdGguaXNWYWxpZE51bWJlcihlKXx8ZTwwKXRocm93IEVycm9yKCJyb3dXZWlnaHQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgdmFsdWUiKTtyZXR1cm4gdGhpcy5fcm93V2VpZ2h0c1t0XT1lLHRoaXMucmVkcmF3KCksdGhpc30sZS5wcm90b3R5cGUuY29sdW1uV2VpZ2h0PWZ1bmN0aW9uKHQsZSl7aWYobnVsbD09ZSlyZXR1cm4gdGhpcy5fY29sdW1uV2VpZ2h0c1t0XTtpZigheFN0Lk1hdGguaXNWYWxpZE51bWJlcihlKXx8ZTwwKXRocm93IEVycm9yKCJjb2x1bW5XZWlnaHQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgdmFsdWUiKTtyZXR1cm4gdGhpcy5fY29sdW1uV2VpZ2h0c1t0XT1lLHRoaXMucmVkcmF3KCksdGhpc30sZS5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3ZhciB0PWJTdC50cmFuc3Bvc2UodGhpcy5fcm93cyk7cmV0dXJuIGUuX2ZpeGVkU3BhY2UodCwoZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXR8fHQuZml4ZWRXaWR0aCgpfSkpfSxlLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiBlLl9maXhlZFNwYWNlKHRoaXMuX3Jvd3MsKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fHx0LmZpeGVkSGVpZ2h0KCl9KSl9LGUucHJvdG90eXBlLl9wYWRUYWJsZVRvU2l6ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248dDtuKyspe3ZvaWQgMD09PXRoaXMuX3Jvd3Nbbl0mJih0aGlzLl9yb3dzW25dPVtdLHRoaXMuX3Jvd1dlaWdodHNbbl09bnVsbCk7Zm9yKHZhciBpPTA7aTxlO2krKyl2b2lkIDA9PT10aGlzLl9yb3dzW25dW2ldJiYodGhpcy5fcm93c1tuXVtpXT1udWxsKX1mb3IoaT0wO2k8ZTtpKyspdm9pZCAwPT09dGhpcy5fY29sdW1uV2VpZ2h0c1tpXSYmKHRoaXMuX2NvbHVtbldlaWdodHNbaV09bnVsbCl9LGUuX2NhbGNDb21wb25lbnRXZWlnaHRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdC5tYXAoKGZ1bmN0aW9uKHQsaSl7cmV0dXJuIG51bGwhPXQ/dDplW2ldLm1hcChuKS5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJmV9KSwhMCk/MDoxfSkpfSxlLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2U9ZnVuY3Rpb24odCxlKXt2YXIgbj1iU3Quc3VtKHQpO3JldHVybiAwPT09bj94U3QuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCx0Lmxlbmd0aCk6dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBlKnQvbn0pKX0sZS5fZml4ZWRTcGFjZT1mdW5jdGlvbih0LGUpe3ZhciBuPWZ1bmN0aW9uKHQpe3JldHVybiB0LnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmZX0pLCEwKX07cmV0dXJuIG4odC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBuKHQubWFwKGUpKX0pKSl9LGV9KSh4eHQuQ29tcG9uZW50Q29udGFpbmVyKTt5U3QuVGFibGU9d1N0O3ZhciBTU3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KFNTdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIE1TdD11TyxFU3Q9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUuX21heExpbmVzPTIsZX1yZXR1cm4gTVN0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHQsZSl7dGhpcy5fd3JhcHBlci5tYXhMaW5lcyh0aGlzLl9tYXhMaW5lcyk7dmFyIG49MD09PXRoaXMuYW5nbGUoKT90OmU7MD09PW4mJihuPTEvMCk7dmFyIGk9dGhpcy5fd3JhcHBlci53cmFwKHRoaXMuX3RleHQsdGhpcy5fbWVhc3VyZXIsbikscj10aGlzLl9tZWFzdXJlci5tZWFzdXJlKGkud3JhcHBlZFRleHQpO3JldHVybnttaW5XaWR0aDooMD09PXRoaXMuYW5nbGUoKT9yLndpZHRoOnIuaGVpZ2h0KSsyKnRoaXMucGFkZGluZygpLG1pbkhlaWdodDooMD09PXRoaXMuYW5nbGUoKT9yLmhlaWdodDpyLndpZHRoKSsyKnRoaXMucGFkZGluZygpfX0sZS5wcm90b3R5cGUubWF4TGluZXM9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMuX21heExpbmVzOih0aGlzLl9tYXhMaW5lcz10LHRoaXMucmVkcmF3KCksdGhpcyl9LGV9KShPeHQuTGFiZWwpO1NTdC5XcmFwcGVkTGFiZWw9RVN0O3ZhciBUU3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KFRTdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIENTdD11TyxBU3Q9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIGUuYWRkQ2xhc3MoIngtZHJhZy1ib3gtbGF5ZXIiKSxlLl9oYXNDb3JuZXJzPSExLGV9cmV0dXJuIENTdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKGUsbixpKXtyZXR1cm4gdC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsZSxuLGkpLHRoaXMuX3NldEJvdW5kcyh0aGlzLmJvdW5kcygpKSx0aGlzfSxlLnByb3RvdHlwZS5fc2V0Qm91bmRzPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLl9zZXRCb3VuZHMuY2FsbCh0aGlzLHt0b3BMZWZ0Ont4OmUudG9wTGVmdC54LHk6MH0sYm90dG9tUmlnaHQ6e3g6ZS5ib3R0b21SaWdodC54LHk6dGhpcy5oZWlnaHQoKX19KX0sZS5wcm90b3R5cGUuX3NldFJlc2l6YWJsZUNsYXNzZXM9ZnVuY3Rpb24odCl7dCYmdGhpcy5lbmFibGVkKCk/dGhpcy5hZGRDbGFzcygieC1yZXNpemFibGUiKTp0aGlzLnJlbW92ZUNsYXNzKCJ4LXJlc2l6YWJsZSIpfSxlLnByb3RvdHlwZS55U2NhbGU9ZnVuY3Rpb24oZSl7aWYobnVsbD09ZSlyZXR1cm4gdC5wcm90b3R5cGUueVNjYWxlLmNhbGwodGhpcyk7dGhyb3cgbmV3IEVycm9yKCJ5U2NhbGVzIGNhbm5vdCBiZSBzZXQgb24gYW4gWERyYWdCb3hMYXllciIpfSxlLnByb3RvdHlwZS55RXh0ZW50PWZ1bmN0aW9uKGUpe2lmKG51bGw9PWUpcmV0dXJuIHQucHJvdG90eXBlLnlFeHRlbnQuY2FsbCh0aGlzKTt0aHJvdyBuZXcgRXJyb3IoIlhEcmFnQm94TGF5ZXIgaGFzIG5vIHlFeHRlbnQiKX0sZX0pKHJidC5EcmFnQm94TGF5ZXIpO1RTdC5YRHJhZ0JveExheWVyPUFTdDt2YXIga1N0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShrU3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBMU3Q9dU8sUFN0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBlLmFkZENsYXNzKCJ5LWRyYWctYm94LWxheWVyIiksZS5faGFzQ29ybmVycz0hMSxlfXJldHVybiBMU3QuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihlLG4saSl7cmV0dXJuIHQucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLGUsbixpKSx0aGlzLl9zZXRCb3VuZHModGhpcy5ib3VuZHMoKSksdGhpc30sZS5wcm90b3R5cGUuX3NldEJvdW5kcz1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5fc2V0Qm91bmRzLmNhbGwodGhpcyx7dG9wTGVmdDp7eDowLHk6ZS50b3BMZWZ0Lnl9LGJvdHRvbVJpZ2h0Ont4OnRoaXMud2lkdGgoKSx5OmUuYm90dG9tUmlnaHQueX19KX0sZS5wcm90b3R5cGUuX3NldFJlc2l6YWJsZUNsYXNzZXM9ZnVuY3Rpb24odCl7dCYmdGhpcy5lbmFibGVkKCk/dGhpcy5hZGRDbGFzcygieS1yZXNpemFibGUiKTp0aGlzLnJlbW92ZUNsYXNzKCJ5LXJlc2l6YWJsZSIpfSxlLnByb3RvdHlwZS54U2NhbGU9ZnVuY3Rpb24oZSl7aWYobnVsbD09ZSlyZXR1cm4gdC5wcm90b3R5cGUueFNjYWxlLmNhbGwodGhpcyk7dGhyb3cgbmV3IEVycm9yKCJ4U2NhbGVzIGNhbm5vdCBiZSBzZXQgb24gYW4gWURyYWdCb3hMYXllciIpfSxlLnByb3RvdHlwZS54RXh0ZW50PWZ1bmN0aW9uKGUpe2lmKG51bGw9PWUpcmV0dXJuIHQucHJvdG90eXBlLnhFeHRlbnQuY2FsbCh0aGlzKTt0aHJvdyBuZXcgRXJyb3IoIllEcmFnQm94TGF5ZXIgaGFzIG5vIHhFeHRlbnQiKX0sZX0pKHJidC5EcmFnQm94TGF5ZXIpO2tTdC5ZRHJhZ0JveExheWVyPVBTdCwoZnVuY3Rpb24odCl7Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZT11TztlLl9fZXhwb3J0U3RhcihyYnQsdCksZS5fX2V4cG9ydFN0YXIob3h0LHQpLGUuX19leHBvcnRTdGFyKGd4dCx0KSxlLl9fZXhwb3J0U3RhcihieHQsdCksZS5fX2V4cG9ydFN0YXIoYXh0LHQpLGUuX19leHBvcnRTdGFyKEF4dCx0KSxlLl9fZXhwb3J0U3RhcihPeHQsdCksZS5fX2V4cG9ydFN0YXIoVnh0LHQpLGUuX19leHBvcnRTdGFyKGN3dCx0KSxlLl9fZXhwb3J0U3RhcihKYnQsdCksZS5fX2V4cG9ydFN0YXIoeVN0LHQpLGUuX19leHBvcnRTdGFyKFNTdCx0KSxlLl9fZXhwb3J0U3RhcihUU3QsdCksZS5fX2V4cG9ydFN0YXIoa1N0LHQpfSkoaWJ0KTt2YXIgTlN0PXt9LElTdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KElTdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFJTdD11TyxPU3Q9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gdC5jYWxsKHRoaXMsInBhdGgiLCJhcmMgZmlsbCIpfHx0aGlzfXJldHVybiBSU3QuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24odCl7dC5zdHlsZSgic3Ryb2tlIiwibm9uZSIpfSxlfSkoWXd0LlNWR0RyYXdlcik7SVN0LkFyY1NWR0RyYXdlcj1PU3Q7dmFyIHpTdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoelN0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgRFN0PXVPLEJTdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiB0LmNhbGwodGhpcywicGF0aCIsImFyYyBvdXRsaW5lIil8fHRoaXN9cmV0dXJuIERTdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fYXBwbHlEZWZhdWx0QXR0cmlidXRlcz1mdW5jdGlvbih0KXt0LnN0eWxlKCJmaWxsIiwibm9uZSIpfSxlfSkoWXd0LlNWR0RyYXdlcik7elN0LkFyY091dGxpbmVTVkdEcmF3ZXI9QlN0O3ZhciBIU3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KEhTdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIEZTdD11TyxWU3Q9R3d0LFVTdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiB0LmNhbGwodGhpcywicGF0aCIsImFyZWEiKXx8dGhpc31yZXR1cm4gRlN0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKHQpe3Quc3R5bGUoInN0cm9rZSIsIm5vbmUiKX0sZS5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleD1mdW5jdGlvbihlKXtyZXR1cm4gdC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleC5jYWxsKHRoaXMsMCl9LGV9KShZd3QuU1ZHRHJhd2VyKTtIU3QuQXJlYVNWR0RyYXdlcj1VU3Q7dmFyIGpTdD1bIm9wYWNpdHkiLCJmaWxsIiwiZmlsbC1vcGFjaXR5Il0sR1N0PVsib3BhY2l0eSIsInN0cm9rZSIsInN0cm9rZS13aWR0aCJdO0hTdC5tYWtlQXJlYUNhbnZhc0RyYXdTdGVwPWZ1bmN0aW9uIFdTdCh0LGUpe3JldHVybiBmdW5jdGlvbihuLGkscil7dmFyIG89VlN0LnJlc29sdmVBdHRyaWJ1dGVzKHIsalN0LGlbMF0sMCk7VlN0LnJlbmRlckFyZWEobix0KCksaVswXSxvKTt2YXIgYT1WU3QucmVzb2x2ZUF0dHJpYnV0ZXMocixHU3QsaVswXSwwKTtWU3QucmVuZGVyTGluZShuLGUoKSxpWzBdLGEpfX07dmFyIHFTdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkocVN0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgWVN0PXVPLFhTdD1Hd3QsJFN0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIHQuY2FsbCh0aGlzLCJwYXRoIiwibGluZSIpfHx0aGlzfXJldHVybiBZU3QuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24odCl7dC5zdHlsZSgiZmlsbCIsIm5vbmUiKX0sZS5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleD1mdW5jdGlvbihlKXtyZXR1cm4gdC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleC5jYWxsKHRoaXMsMCl9LGV9KShZd3QuU1ZHRHJhd2VyKTtxU3QuTGluZVNWR0RyYXdlcj0kU3Q7dmFyIEtTdD1bIm9wYWNpdHkiLCJzdHJva2Utb3BhY2l0eSIsInN0cm9rZS13aWR0aCIsInN0cm9rZSIsInN0cm9rZS1kYXNoYXJyYXkiXTtxU3QubWFrZUxpbmVDYW52YXNEcmF3U3RlcD1mdW5jdGlvbiBaU3QodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixpKXt2YXIgcj1YU3QucmVzb2x2ZUF0dHJpYnV0ZXMoaSxLU3QsblswXSwwKTtYU3QucmVuZGVyTGluZShlLHQoKSxuWzBdLHIpfX07dmFyIEpTdD17fTshKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9dU8sbj1Hd3QsaT0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlKXt2b2lkIDA9PT1lJiYoZT0iIik7dmFyIG49dC5jYWxsKHRoaXMsInJlY3QiLCIiKXx8dGhpcztyZXR1cm4gbi5fcm9vdENsYXNzTmFtZT1lLG4uX3Jvb3QuY2xhc3NlZChuLl9yb290Q2xhc3NOYW1lLCEwKSxufXJldHVybiBlLl9fZXh0ZW5kcyhuLHQpLG59KShZd3QuU1ZHRHJhd2VyKTt0LlJlY3RhbmdsZVNWR0RyYXdlcj1pO3ZhciByPW4uQ29udGV4dFN0eWxlQXR0cnMuY29uY2F0KFsieCIsInkiLCJ3aWR0aCIsImhlaWdodCJdKTt0LlJlY3RhbmdsZUNhbnZhc0RyYXdTdGVwPWZ1bmN0aW9uKHQsZSxpKXt0LnNhdmUoKTtmb3IodmFyIG89ZS5sZW5ndGgsYT0wO2E8bzthKyspe3ZhciBzPWVbYV07aWYobnVsbCE9cyl7dmFyIGw9bi5yZXNvbHZlQXR0cmlidXRlcyhpLHIscyxhKTt0LmJlZ2luUGF0aCgpLHQucmVjdChsLngsbC55LGwud2lkdGgsbC5oZWlnaHQpLG4ucmVuZGVyUGF0aFdpdGhTdHlsZSh0LGwpfX10LnJlc3RvcmUoKX07dmFyIG89KGZ1bmN0aW9uKG4pe2Z1bmN0aW9uIGkoZSl7cmV0dXJuIG4uY2FsbCh0aGlzLGUsdC5SZWN0YW5nbGVDYW52YXNEcmF3U3RlcCl8fHRoaXN9cmV0dXJuIGUuX19leHRlbmRzKGksbiksaX0pKG4uQ2FudmFzRHJhd2VyKTt0LlJlY3RhbmdsZUNhbnZhc0RyYXdlcj1vfSkoSlN0KTt2YXIgUVN0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShRU3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB0TXQ9dU8sZU10PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIHQuY2FsbCh0aGlzLCJsaW5lIiwiIil8fHRoaXN9cmV0dXJuIHRNdC5fX2V4dGVuZHMoZSx0KSxlfSkoWXd0LlNWR0RyYXdlcik7UVN0LlNlZ21lbnRTVkdEcmF3ZXI9ZU10O3ZhciBuTXQ9e30saU10PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE3LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoaU10LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgck10PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuLGkpe3ZvaWQgMD09PWkmJihpPXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKSx0aGlzLnNjcmVlbldpZHRoPWUsdGhpcy5zY3JlZW5IZWlnaHQ9bix0aGlzLmRldmljZVBpeGVsUmF0aW89aSx0aGlzLnBpeGVsV2lkdGg9ZSppLHRoaXMucGl4ZWxIZWlnaHQ9bippLHRoaXMuY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLHRoaXMuY3R4PXRoaXMuY2FudmFzLmdldENvbnRleHQoIjJkIiksdC5zaXplUGl4ZWxzKHRoaXMuY3R4LGUsbixpKX1yZXR1cm4gdC5zaXplUGl4ZWxzPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPXQuY2FudmFzO3Iud2lkdGg9ZSppLHIuaGVpZ2h0PW4qaSxyLnN0eWxlLndpZHRoPWUrInB4IixyLnN0eWxlLmhlaWdodD1uKyJweCIsdC5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLHQuc2NhbGUoaSxpKX0sdC5wcm90b3R5cGUuYmxpdD1mdW5jdGlvbih0LGUsbil7dm9pZCAwPT09ZSYmKGU9MCksdm9pZCAwPT09biYmKG49MCksdC5kcmF3SW1hZ2UodGhpcy5jYW52YXMsZSxuLHRoaXMuc2NyZWVuV2lkdGgsdGhpcy5zY3JlZW5IZWlnaHQpfSx0LnByb3RvdHlwZS5ibGl0Q2VudGVyPWZ1bmN0aW9uKHQsZSxuKXt2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1uJiYobj0wKSx0aGlzLmJsaXQodCxNYXRoLmZsb29yKGUtdGhpcy5zY3JlZW5XaWR0aC8yKSxNYXRoLmZsb29yKG4tdGhpcy5zY3JlZW5IZWlnaHQvMikpfSx0LnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oZSxuLGkpe3ZvaWQgMD09PWkmJihpPSExKTt2YXIgcj10aGlzLmRldmljZVBpeGVsUmF0aW87cmV0dXJuIHRoaXMuc2NyZWVuV2lkdGg9ZSx0aGlzLnNjcmVlbkhlaWdodD1uLHRoaXMucGl4ZWxXaWR0aD1lKnIsdGhpcy5waXhlbEhlaWdodD1uKnIsdC5zaXplUGl4ZWxzKHRoaXMuY3R4LGUsbixyKSxpJiZ0aGlzLmN0eC50cmFuc2xhdGUoZS8yLGUvMiksdGhpc30sdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWUucGl4ZWxXaWR0aCxpPWUucGl4ZWxIZWlnaHQscj1lLmN0eDtyZXR1cm4gci5zYXZlKCksci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLG51bGw9PXQ/ci5jbGVhclJlY3QoMCwwLG4saSk6KHIuZmlsbFN0eWxlPXQsci5maWxsUmVjdCgwLDAsbixpKSksci5yZXN0b3JlKCksdGhpc30sdC5wcm90b3R5cGUuZ2V0SW1hZ2VEYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3R4LmdldEltYWdlRGF0YSgwLDAsdGhpcy5waXhlbFdpZHRoLHRoaXMucGl4ZWxIZWlnaHQpfSx0fSkoKTtpTXQuQ2FudmFzQnVmZmVyPXJNdCwKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KG5NdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG9NdD11TyxhTXQ9R3d0LHNNdD1pTXQsbE10PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIHQuY2FsbCh0aGlzLCJwYXRoIiwic3ltYm9sIil8fHRoaXN9cmV0dXJuIG9NdC5fX2V4dGVuZHMoZSx0KSxlfSkoWXd0LlNWR0RyYXdlcik7bk10LlN5bWJvbFNWR0RyYXdlcj1sTXQ7dmFyIGNNdD1hTXQuQ29udGV4dFN0eWxlQXR0cnMuY29uY2F0KFsieCIsInkiXSk7ZnVuY3Rpb24gdU10KHQsZSxuLGkscil7cmV0dXJuIG4rcj49MCYmbi1yPD10JiZpK3I+PTAmJmktcjw9ZX1mdW5jdGlvbiBoTXQodCxlLG4pe2lmKG51bGw9PXQpcmV0dXJuITE7Zm9yKHZhciBpPTA7aTxuLmxlbmd0aDtpKyspe3ZhciByPW5baV07aWYodFtyXSE9ZVtyXSlyZXR1cm4hMX1yZXR1cm4hMH1uTXQubWFrZVN5bWJvbENhbnZhc0RyYXdTdGVwPWZ1bmN0aW9uIGRNdCh0LGUsbixpKXt2YXIgcj10aGlzO3JldHVybiBmdW5jdGlvbihvLGEscyl7Zm9yKHZhciBsPW8uY2FudmFzLGM9bC5jbGllbnRXaWR0aCx1PWwuY2xpZW50SGVpZ2h0LGg9dm9pZCAwPT09aT9uZXcgc010LkNhbnZhc0J1ZmZlcigwLDApOmksZD1lKCkscD1uKCksZj1udWxsLG09bnVsbCxnPW51bGwsXz0wO188YS5sZW5ndGg7XysrKXt2YXIgeT1hW19dO2lmKG51bGwhPXkpe3ZhciB2PWFNdC5yZXNvbHZlQXR0cmlidXRlcyhzLGNNdCx5LF8pLGI9cCh5LF8sdCk7aWYodU10KGMsdSx2Lngsdi55LGIpKXt2YXIgeD1oTXQoZix2LGFNdC5Db250ZXh0U3R5bGVBdHRycyksdz1kKHksXyxyLl9kYXRhc2V0KTtpZih4JiZnPT1iJiZtPT13KTtlbHNle3ZhciBTPWIrYU10LmdldFN0cm9rZVdpZHRoKHYpKzE7KFM+aC5zY3JlZW5XaWR0aHx8Uz5oLnNjcmVlbkhlaWdodCkmJmgucmVzaXplKFMsUywhMCksaC5jbGVhcigpO3ZhciBNPWguY3R4O00uYmVnaW5QYXRoKCksdyhiKS5jb250ZXh0KE0pKG51bGwpLE0uY2xvc2VQYXRoKCksYU10LnJlbmRlclBhdGhXaXRoU3R5bGUoTSx2KSxtPXcsZz1iLGY9dn1oLmJsaXRDZW50ZXIobyx2Lngsdi55KX19fX19LChmdW5jdGlvbih0KXsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBlPXVPO2UuX19leHBvcnRTdGFyKElTdCx0KSxlLl9fZXhwb3J0U3Rhcih6U3QsdCksZS5fX2V4cG9ydFN0YXIoSFN0LHQpLGUuX19leHBvcnRTdGFyKEd3dCx0KSxlLl9fZXhwb3J0U3RhcihXd3QsdCksZS5fX2V4cG9ydFN0YXIocVN0LHQpLGUuX19leHBvcnRTdGFyKEpTdCx0KSxlLl9fZXhwb3J0U3RhcihRU3QsdCksZS5fX2V4cG9ydFN0YXIoWXd0LHQpLGUuX19leHBvcnRTdGFyKG5NdCx0KX0pKE5TdCk7dmFyIHBNdD17fSxmTXQ9e30sbU10PXt9LGdNdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KGdNdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIF9NdD11Tyx5TXQ9Wnl0LHZNdD1GZ3QsYk10PVp3dCx4TXQ9dXd0LHdNdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gZS5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj0hMSxlLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluPSExLGUuX2RlZmVycmVkUmVuZGVyaW5nPSExLGUuX2FwcGx5RGVmZXJyZWRSZW5kZXJpbmdUcmFuc2Zvcm09ZnVuY3Rpb24odCxuLGkscil7ZS5faXNBbmNob3JlZCYmKG51bGwhPWUuX3JlbmRlckFyZWEmJmUuX3JlbmRlckFyZWEuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrdCsiLCAiK24rIikgc2NhbGUoIitpKyIsICIrcisiKSIpLG51bGwhPWUuX2NhbnZhcyYmZS5fY2FudmFzLnN0eWxlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit0KyJweCwgIituKyJweCkgc2NhbGUoIitpKyIsICIrcisiKSIpKX0sZS5hZGRDbGFzcygieHktcGxvdCIpLGUuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YQ2FsbGJhY2s9ZnVuY3Rpb24odCl7cmV0dXJuIGUuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YKCl9LGUuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZQ2FsbGJhY2s9ZnVuY3Rpb24odCl7cmV0dXJuIGUuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZKCl9LGUuX3JlbmRlckNhbGxiYWNrPWZ1bmN0aW9uKCl7aWYoZS5kZWZlcnJlZFJlbmRlcmluZygpKXt2YXIgdD1lLngoKSYmZS54KCkuc2NhbGUsbj1lLnkoKSYmZS55KCkuc2NhbGU7ZS5fZGVmZXJyZWRSZW5kZXJlci51cGRhdGVEb21haW5zKHQsbil9ZWxzZSBlLnJlbmRlcigpfSxlLl9kZWZlcnJlZFJlbmRlcmVyPW5ldyBiTXQuRGVmZXJyZWRSZW5kZXJlcigoZnVuY3Rpb24oKXtyZXR1cm4gZS5yZW5kZXIoKX0pLGUuX2FwcGx5RGVmZXJyZWRSZW5kZXJpbmdUcmFuc2Zvcm0pLGV9cmV0dXJuIF9NdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWZlcnJlZFJlbmRlcmluZygpJiZ0aGlzLl9kZWZlcnJlZFJlbmRlcmVyLnJlc2V0VHJhbnNmb3JtcygpLHQucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5kZWZlcnJlZFJlbmRlcmluZz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9kZWZlcnJlZFJlbmRlcmluZztpZih0KXt2YXIgZT10aGlzLngoKSYmdGhpcy54KCkuc2NhbGUsbj10aGlzLnkoKSYmdGhpcy55KCkuc2NhbGU7dGhpcy5fZGVmZXJyZWRSZW5kZXJlci5zZXREb21haW5zKGUsbil9cmV0dXJuIHRoaXMuX2RlZmVycmVkUmVuZGVyaW5nPXQsdGhpc30sZS5wcm90b3R5cGUueD1mdW5jdGlvbih0LG4saSl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoZS5fWF9LRVkpO3RoaXMuX2JpbmRQcm9wZXJ0eShlLl9YX0tFWSx0LG4saSk7dmFyIHI9dGhpcy53aWR0aCgpO3JldHVybiBudWxsIT1uJiZudWxsIT1yJiZuLnJhbmdlKFswLHJdKSx0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW4oKSx0aGlzLnJlbmRlcigpLHRoaXN9LGUucHJvdG90eXBlLnk9ZnVuY3Rpb24odCxuLGkpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KGUuX1lfS0VZKTt0aGlzLl9iaW5kUHJvcGVydHkoZS5fWV9LRVksdCxuLGkpO3ZhciByPXRoaXMuaGVpZ2h0KCk7cmV0dXJuIG51bGwhPW4mJm51bGwhPXImJm4ucmFuZ2UobiBpbnN0YW5jZW9mIHlNdC5DYXRlZ29yeT9bMCxyXTpbciwwXSksdGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbiYmdGhpcy5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluKCksdGhpcy5yZW5kZXIoKSx0aGlzfSxlLnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24odCl7cmV0dXJuIngiPT09dCYmdGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj90aGlzLl9tYWtlRmlsdGVyQnlQcm9wZXJ0eSgieSIpOiJ5IiE9PXQmJiJ5MCIhPT10fHwhdGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj9udWxsOnRoaXMuX21ha2VGaWx0ZXJCeVByb3BlcnR5KCJ4Iil9LGUucHJvdG90eXBlLl9tYWtlRmlsdGVyQnlQcm9wZXJ0eT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh0KTtpZihudWxsIT1lKXt2YXIgbj1lLmFjY2Vzc29yLGk9ZS5zY2FsZTtpZihudWxsIT1pKXJldHVybiBmdW5jdGlvbih0LGUscil7dmFyIG89aS5yYW5nZSgpO3JldHVybiB2TXQuTWF0aC5pblJhbmdlKGkuc2NhbGUobih0LGUscikpLG9bMF0sb1sxXSl9fXJldHVybiBudWxsfSxlLnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24obixpKXt0LnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXkuY2FsbCh0aGlzLG4saSksbi5vZmZVcGRhdGUoaT09PWUuX1hfS0VZP3RoaXMuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YQ2FsbGJhY2s6dGhpcy5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVlDYWxsYmFjayl9LGUucHJvdG90eXBlLl9pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24obixpKXt0LnByb3RvdHlwZS5faW5zdGFsbFNjYWxlRm9yS2V5LmNhbGwodGhpcyxuLGkpLG4ub25VcGRhdGUoaT09PWUuX1hfS0VZP3RoaXMuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YQ2FsbGJhY2s6dGhpcy5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVlDYWxsYmFjayl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtyZXR1cm4gdC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpLHRoaXMueCgpLnNjYWxlJiZ0aGlzLngoKS5zY2FsZS5vZmZVcGRhdGUodGhpcy5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVhDYWxsYmFjayksdGhpcy55KCkuc2NhbGUmJnRoaXMueSgpLnNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWUNhbGxiYWNrKSx0aGlzfSxlLnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW4/IngiOnRoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW4/InkiOiJub25lIjtzd2l0Y2godCl7Y2FzZSJ4Ijp0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluPSEwLHRoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49ITEsdGhpcy5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVkoKTticmVhaztjYXNlInkiOnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW49ITEsdGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj0hMCx0aGlzLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWCgpO2JyZWFrO2Nhc2Uibm9uZSI6dGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj0hMSx0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluPSExO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHNjYWxlIG5hbWUgJyIrdCsiJywgbXVzdCBiZSAneCcsICd5JyBvciAnbm9uZSciKX1yZXR1cm4gdGhpc30sZS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihlLG4saSl7dC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsZSxuLGkpO3ZhciByPXRoaXMueCgpLG89ciYmci5zY2FsZTtudWxsIT1vJiZvLnJhbmdlKFswLHRoaXMud2lkdGgoKV0pO3ZhciBhPXRoaXMueSgpLHM9YSYmYS5zY2FsZTtyZXR1cm4gbnVsbCE9cyYmcy5yYW5nZShzIGluc3RhbmNlb2YgeU10LkNhdGVnb3J5P1swLHRoaXMuaGVpZ2h0KCldOlt0aGlzLmhlaWdodCgpLDBdKSx0aGlzfSxlLnByb3RvdHlwZS5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy54KCkuc2NhbGU7bnVsbCE9dCYmdC5hdXRvRG9tYWluKCl9LGUucHJvdG90eXBlLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW49ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnkoKS5zY2FsZTtudWxsIT10JiZ0LmF1dG9Eb21haW4oKX0sZS5wcm90b3R5cGUuc2hvd0FsbERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluKCksdGhpcy5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluKCksdGhpc30sZS5wcm90b3R5cGUuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YPWZ1bmN0aW9uKCl7dGhpcy5fcHJvamVjdG9yc1JlYWR5KCkmJnRoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW4mJnRoaXMuX3VwZGF0ZVlFeHRlbnRzQW5kQXV0b2RvbWFpbigpfSxlLnByb3RvdHlwZS5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVk9ZnVuY3Rpb24oKXt0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKSYmdGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbiYmdGhpcy5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluKCl9LGUucHJvdG90eXBlLl9wcm9qZWN0b3JzUmVhZHk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLngoKSxlPXRoaXMueSgpO3JldHVybiBudWxsIT10JiZudWxsIT10LmFjY2Vzc29yJiZudWxsIT1lJiZudWxsIT1lLmFjY2Vzc29yfSxlLnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbih0LGUsbil7dmFyIGk9eE10LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxyPXhNdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7cmV0dXJue3g6aSh0LGUsbikseTpyKHQsZSxuKX19LGUucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPXQucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3LmNhbGwodGhpcyksaT10aGlzLmF0dHIoImRlZmluZWQiKTtyZXR1cm4gdGhpcy5kYXRhc2V0cygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe24uc2V0KHQsbi5nZXQodCkuZmlsdGVyKChmdW5jdGlvbihuLHIpe3JldHVybihmdW5jdGlvbih0LG4scil7dmFyIG89eE10LlBsb3QuX3NjYWxlZEFjY2Vzc29yKGUueCgpKSh0LG4sciksYT14TXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IoZS55KCkpKHQsbixyKTtyZXR1cm4oIWl8fCExIT09aS5hY2Nlc3Nvcih0LG4scikpJiZ2TXQuTWF0aC5pc1ZhbGlkTnVtYmVyKG8pJiZ2TXQuTWF0aC5pc1ZhbGlkTnVtYmVyKGEpfSkobixyLHQpfSkpKX0pKSxufSxlLl9YX0tFWT0ieCIsZS5fWV9LRVk9InkiLGV9KSh4TXQuUGxvdCk7Z010LlhZUGxvdD13TXQsCi8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtTXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBTTXQ9dU8sTU10PUVkdCxFTXQ9X210LFRNdD1OU3QsQ010PVd3dCxBTXQ9cVN0LGtNdD1aeXQsTE10PUl2dCxQTXQ9Rmd0LE5NdD1wTXQsSU10PXV3dCxSTXQ9Z010LE9NdD17bGluZWFyOk1NdC5jdXJ2ZUxpbmVhcixsaW5lYXJDbG9zZWQ6TU10LmN1cnZlTGluZWFyQ2xvc2VkLHN0ZXA6TU10LmN1cnZlU3RlcCxzdGVwQmVmb3JlOk1NdC5jdXJ2ZVN0ZXBCZWZvcmUsc3RlcEFmdGVyOk1NdC5jdXJ2ZVN0ZXBBZnRlcixiYXNpczpNTXQuY3VydmVCYXNpcyxiYXNpc09wZW46TU10LmN1cnZlQmFzaXNPcGVuLGJhc2lzQ2xvc2VkOk1NdC5jdXJ2ZUJhc2lzQ2xvc2VkLGJ1bmRsZTpNTXQuY3VydmVCdW5kbGUsY2FyZGluYWw6TU10LmN1cnZlQ2FyZGluYWwsY2FyZGluYWxPcGVuOk1NdC5jdXJ2ZUNhcmRpbmFsT3BlbixjYXJkaW5hbENsb3NlZDpNTXQuY3VydmVDYXJkaW5hbENsb3NlZCxtb25vdG9uZTpNTXQuY3VydmVNb25vdG9uZVh9O21NdC5DdXJ2ZU5hbWU9U210Lm1ha2VFbnVtKFsibGluZWFyIiwibGluZWFyQ2xvc2VkIiwic3RlcCIsInN0ZXBCZWZvcmUiLCJzdGVwQWZ0ZXIiLCJiYXNpcyIsImJhc2lzT3BlbiIsImJhc2lzQ2xvc2VkIiwiYnVuZGxlIiwiY2FyZGluYWwiLCJjYXJkaW5hbE9wZW4iLCJjYXJkaW5hbENsb3NlZCIsIm1vbm90b25lIl0pO3ZhciB6TXQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT10LmNhbGwodGhpcyl8fHRoaXM7ZS5fY3VydmU9ImxpbmVhciIsZS5fYXV0b3JhbmdlU21vb3RoPSExLGUuX2Nyb3BwZWRSZW5kZXJpbmdFbmFibGVkPSEwLGUuX2NvbGxhcHNlRGVuc2VWZXJ0aWNhbExpbmVzRW5hYmxlZD0hMSxlLl9kb3duc2FtcGxpbmdFbmFibGVkPSExLGUuYWRkQ2xhc3MoImxpbmUtcGxvdCIpO3ZhciBuPW5ldyBFTXQuRWFzaW5nO3JldHVybiBuLnN0ZXBEdXJhdGlvbihJTXQuUGxvdC5fQU5JTUFUSU9OX01BWF9EVVJBVElPTiksbi5lYXNpbmdNb2RlKCJleHBJbk91dCIpLG4ubWF4VG90YWxEdXJhdGlvbihJTXQuUGxvdC5fQU5JTUFUSU9OX01BWF9EVVJBVElPTiksZS5hbmltYXRvcihOTXQuQW5pbWF0b3IuTUFJTixuKSxlLmF0dHIoInN0cm9rZSIsKG5ldyBrTXQuQ29sb3IpLnJhbmdlKClbMF0pLGUuYXR0cigic3Ryb2tlLXdpZHRoIiwiMnB4IiksZX1yZXR1cm4gU010Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLng9ZnVuY3Rpb24oZSxuLGkpe3JldHVybiBudWxsPT1lP3QucHJvdG90eXBlLnguY2FsbCh0aGlzKToodC5wcm90b3R5cGUueC5jYWxsKHRoaXMsZSxuLGkpLHRoaXMuX3NldFNjYWxlU25hcHBpbmcoKSx0aGlzKX0sZS5wcm90b3R5cGUueT1mdW5jdGlvbihlLG4saSl7cmV0dXJuIG51bGw9PWU/dC5wcm90b3R5cGUueS5jYWxsKHRoaXMpOih0LnByb3RvdHlwZS55LmNhbGwodGhpcyxlLG4saSksdGhpcy5fc2V0U2NhbGVTbmFwcGluZygpLHRoaXMpfSxlLnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3QucHJvdG90eXBlLmF1dG9yYW5nZU1vZGUuY2FsbCh0aGlzKToodC5wcm90b3R5cGUuYXV0b3JhbmdlTW9kZS5jYWxsKHRoaXMsZSksdGhpcy5fc2V0U2NhbGVTbmFwcGluZygpLHRoaXMpfSxlLnByb3RvdHlwZS5hdXRvcmFuZ2VTbW9vdGg9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fYXV0b3JhbmdlU21vb3RoOih0aGlzLl9hdXRvcmFuZ2VTbW9vdGg9dCx0aGlzLl9zZXRTY2FsZVNuYXBwaW5nKCksdGhpcyl9LGUucHJvdG90eXBlLl9zZXRTY2FsZVNuYXBwaW5nPWZ1bmN0aW9uKCl7IngiPT09dGhpcy5hdXRvcmFuZ2VNb2RlKCkmJnRoaXMueCgpJiZ0aGlzLngoKS5zY2FsZSYmdGhpcy54KCkuc2NhbGUgaW5zdGFuY2VvZiBMTXQuUXVhbnRpdGF0aXZlU2NhbGUmJnRoaXMueCgpLnNjYWxlLnNuYXBwaW5nRG9tYWluRW5hYmxlZCghdGhpcy5hdXRvcmFuZ2VTbW9vdGgoKSksInkiPT09dGhpcy5hdXRvcmFuZ2VNb2RlKCkmJnRoaXMueSgpJiZ0aGlzLnkoKS5zY2FsZSYmdGhpcy55KCkuc2NhbGUgaW5zdGFuY2VvZiBMTXQuUXVhbnRpdGF0aXZlU2NhbGUmJnRoaXMueSgpLnNjYWxlLnNuYXBwaW5nRG9tYWluRW5hYmxlZCghdGhpcy5hdXRvcmFuZ2VTbW9vdGgoKSl9LGUucHJvdG90eXBlLmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2N1cnZlOih0aGlzLl9jdXJ2ZT10LHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLmRvd25zYW1wbGluZ0VuYWJsZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZG93bnNhbXBsaW5nRW5hYmxlZDoodGhpcy5fZG93bnNhbXBsaW5nRW5hYmxlZD10LHRoaXMpfSxlLnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZDoodGhpcy5fY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQ9dCx0aGlzLnJlbmRlcigpLHRoaXMpfSxlLnByb3RvdHlwZS5jb2xsYXBzZURlbnNlTGluZXNFbmFibGVkPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2NvbGxhcHNlRGVuc2VWZXJ0aWNhbExpbmVzRW5hYmxlZDoodGhpcy5fY29sbGFwc2VEZW5zZVZlcnRpY2FsTGluZXNFbmFibGVkPXQsdGhpcy5yZW5kZXIoKSx0aGlzKX0sZS5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiBuZXcgQ010LlByb3h5RHJhd2VyKChmdW5jdGlvbigpe3JldHVybiBuZXcgQU10LkxpbmVTVkdEcmF3ZXJ9KSwoZnVuY3Rpb24obil7cmV0dXJuIG5ldyBUTXQuQ2FudmFzRHJhd2VyKG4sQU10Lm1ha2VMaW5lQ2FudmFzRHJhd1N0ZXAoKGZ1bmN0aW9uKCl7cmV0dXJuIGUuX2QzTGluZUZhY3RvcnkodCl9KSkpfSkpfSxlLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oZSl7dmFyIG49dC5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5LmNhbGwodGhpcyxlKTtpZighdGhpcy5fYXV0b3JhbmdlU21vb3RoKXJldHVybiBuO2lmKHRoaXMuYXV0b3JhbmdlTW9kZSgpIT09ZSlyZXR1cm4gbjtpZigieCIhPT10aGlzLmF1dG9yYW5nZU1vZGUoKSYmInkiIT09dGhpcy5hdXRvcmFuZ2VNb2RlKCkpcmV0dXJuIG47dmFyIGkscj10aGlzLl9nZXRFZGdlSW50ZXJzZWN0aW9uUG9pbnRzKCk7cmV0dXJuIGk9InkiPT09dGhpcy5hdXRvcmFuZ2VNb2RlKCk/ci5sZWZ0LmNvbmNhdChyLnJpZ2h0KS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lnl9KSk6ci50b3AuY29uY2F0KHIuYm90dG9tKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lnh9KSksbi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBNTXQuZXh0ZW50KE1NdC5tZXJnZShbdCxpXSkpfSkpfSxlLnByb3RvdHlwZS5fZ2V0RWRnZUludGVyc2VjdGlvblBvaW50cz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoISh0aGlzLnkoKS5zY2FsZSBpbnN0YW5jZW9mIExNdC5RdWFudGl0YXRpdmVTY2FsZSYmdGhpcy54KCkuc2NhbGUgaW5zdGFuY2VvZiBMTXQuUXVhbnRpdGF0aXZlU2NhbGUpKXJldHVybntsZWZ0OltdLHJpZ2h0OltdLHRvcDpbXSxib3R0b206W119O3ZhciBlPXRoaXMueSgpLnNjYWxlLG49dGhpcy54KCkuc2NhbGUsaT17bGVmdDpbXSxyaWdodDpbXSx0b3A6W10sYm90dG9tOltdfSxyPW4uc2NhbGUobi5kb21haW4oKVswXSksbz1uLnNjYWxlKG4uZG9tYWluKClbMV0pLGE9ZS5zY2FsZShlLmRvbWFpbigpWzBdKSxzPWUuc2NhbGUoZS5kb21haW4oKVsxXSk7cmV0dXJuIHRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKChmdW5jdGlvbihsKXtmb3IodmFyIGMsdSxoLGQscD1sLmRhdGEoKSxmPTE7ZjxwLmxlbmd0aDtmKyspYz1ofHxuLnNjYWxlKHQueCgpLmFjY2Vzc29yKHBbZi0xXSxmLTEsbCkpLHU9ZHx8ZS5zY2FsZSh0LnkoKS5hY2Nlc3NvcihwW2YtMV0sZi0xLGwpKSxoPW4uc2NhbGUodC54KCkuYWNjZXNzb3IocFtmXSxmLGwpKSxkPWUuc2NhbGUodC55KCkuYWNjZXNzb3IocFtmXSxmLGwpKSxjPHI9PXI8PWgmJmkubGVmdC5wdXNoKHt4OnIseTplLmludmVydCh1KyhyLWMpKihkLXUpLyhoLWMpKX0pLGM8bz09bzw9aCYmaS5yaWdodC5wdXNoKHt4Om8seTplLmludmVydCh1KyhvLWMpKihkLXUpLyhoLWMpKX0pLHU8cz09czw9ZCYmaS50b3AucHVzaCh7eDpuLmludmVydChjKyhzLXUpKihoLWMpLyhkLXUpKSx5OnN9KSx1PGE9PWE8PWQmJmkuYm90dG9tLnB1c2goe3g6bi5pbnZlcnQoYysoYS11KSooaC1jKS8oZC11KSkseTphfSl9KSksaX0sZS5wcm90b3R5cGUuX2dldFJlc2V0WUZ1bmN0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy55KCkuc2NhbGUuZG9tYWluKCksZT1NYXRoLm1heCh0WzBdLHRbMV0pLG49TWF0aC5taW4odFswXSx0WzFdKSxpPWU8MCYmZXx8bj4wJiZufHwwLHI9dGhpcy55KCkuc2NhbGUuc2NhbGUoaSk7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcn19LGUucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz1mdW5jdGlvbigpe3ZhciB0PVtdO2lmKHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSl7dmFyIGU9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7ZS5kPXRoaXMuX2NvbnN0cnVjdExpbmVQcm9qZWN0b3IoSU10LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx0aGlzLl9nZXRSZXNldFlGdW5jdGlvbigpKSx0LnB1c2goe2F0dHJUb1Byb2plY3RvcjplLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKE5NdC5BbmltYXRvci5SRVNFVCl9KX1yZXR1cm4gdC5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoTk10LkFuaW1hdG9yLk1BSU4pfSksdH0sZS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyk7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCJkIiE9PXQpe3ZhciBuPWVbdF07ZVt0XT1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIHQubGVuZ3RoPjA/bih0WzBdLGUsaSk6bnVsbH19fSkpLGV9LGUucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5lbnRpdHlOZWFyZXN0QnlYVGhlblkodCk7cmV0dXJuIG51bGwhPWU/W2VdOltdfSxlLnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0QnlYVGhlblk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MS8wLGk9MS8wLHI9dGhpcy5ib3VuZHMoKSxvPXRoaXMuZW50aXRpZXMoKSxhPW8ubGVuZ3RoLHM9MDtzPGE7cysrKXt2YXIgbD1vW3NdO2lmKFBNdC5NYXRoLndpdGhpbihsLnBvc2l0aW9uLHIpKXt2YXIgYz1NYXRoLmFicyh0LngtbC5wb3NpdGlvbi54KSx1PU1hdGguYWJzKHQueS1sLnBvc2l0aW9uLnkpOyhjPG58fGM9PT1uJiZ1PGkpJiYoZT1sLG49YyxpPXUpfX1yZXR1cm4gZX0sZS5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBlPXQucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKTtyZXR1cm4gZS5kPXRoaXMuX2NvbnN0cnVjdExpbmVQcm9qZWN0b3IoSU10LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxJTXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpKSxlfSxlLnByb3RvdHlwZS5fY29uc3RydWN0TGluZVByb2plY3Rvcj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKGkscixvKXtyZXR1cm4gbi5fZDNMaW5lRmFjdG9yeShvLHQsZSkoaSl9fSxlLnByb3RvdHlwZS5fZDNMaW5lRmFjdG9yeT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHZvaWQgMD09PWUmJihlPUlNdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSkpLHZvaWQgMD09PW4mJihuPUlNdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkpLE1NdC5saW5lKCkueCgoZnVuY3Rpb24obixpKXtyZXR1cm4gZShuLGksdCl9KSkueSgoZnVuY3Rpb24oZSxpKXtyZXR1cm4gbihlLGksdCl9KSkuY3VydmUodGhpcy5fZ2V0Q3VydmVGYWN0b3J5KCkpLmRlZmluZWQoKGZ1bmN0aW9uKGkscil7cmV0dXJuKGZ1bmN0aW9uKHQsaSxyKXt2YXIgbz1lKHQsaSxyKSxhPW4odCxpLHIpO3JldHVybiBQTXQuTWF0aC5pc1ZhbGlkTnVtYmVyKG8pJiZQTXQuTWF0aC5pc1ZhbGlkTnVtYmVyKGEpfSkoaSxyLHQpfSkpfSxlLnByb3RvdHlwZS5fZ2V0Q3VydmVGYWN0b3J5PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jdXJ2ZSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIGU9T010W3RdO3JldHVybiBudWxsPT1lP09NdC5saW5lYXI6ZX1yZXR1cm4gdH0sZS5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9bmV3IFBNdC5NYXA7cmV0dXJuIHRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKChmdW5jdGlvbihuKXt2YXIgaT1uLmRhdGEoKTtpZih0Ll9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZHx8dC5fZG93bnNhbXBsaW5nRW5hYmxlZCl7Zm9yKHZhciByPVtdLG89aS5sZW5ndGgsYT0wO2E8bzthKyspclthXT1hO3QuX2Nyb3BwZWRSZW5kZXJpbmdFbmFibGVkJiYocj10Ll9maWx0ZXJDcm9wcGVkUmVuZGVyaW5nKG4scikpLHQuX2Rvd25zYW1wbGluZ0VuYWJsZWQmJihyPXQuX2ZpbHRlckRvd25zYW1wbGluZyhuLHIpKSx0Ll9jb2xsYXBzZURlbnNlVmVydGljYWxMaW5lc0VuYWJsZWQmJihyPXQuX2ZpbHRlckRlbnNlTGluZXMobixyKSk7dmFyIHM9W10sbD1yLmxlbmd0aDtmb3IoYT0wO2E8bDthKyspc1thXT1pW3JbYV1dO2Uuc2V0KG4sW3NdKX1lbHNlIGUuc2V0KG4sW2ldKX0pKSxlfSxlLnByb3RvdHlwZS5fZmlsdGVyQ3JvcHBlZFJlbmRlcmluZz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLGk9SU10LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxyPUlNdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSksbz10LmRhdGEoKSxhPVtdLHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gUE10Lk1hdGguaW5SYW5nZSh0LDAsbi53aWR0aCgpKSYmUE10Lk1hdGguaW5SYW5nZShlLDAsbi5oZWlnaHQoKSl9LGw9MDtsPGUubGVuZ3RoO2wrKyl7dmFyIGM9cyhpKG9bZVtsXV0sZVtsXSx0KSxyKG9bZVtsXV0sZVtsXSx0KSk7aWYoIWMmJm51bGwhPWVbbC0xXSYmbnVsbCE9b1tlW2wtMV1dKXt2YXIgdT1pKG9bZVtsLTFdXSxlW2wtMV0sdCksaD1yKG9bZVtsLTFdXSxlW2wtMV0sdCk7Yz1jfHxzKHUsaCl9aWYoIWMmJm51bGwhPWVbbCsxXSYmbnVsbCE9b1tlW2wrMV1dKXt2YXIgZD1pKG9bZVtsKzFdXSxlW2wrMV0sdCkscD1yKG9bZVtsKzFdXSxlW2wrMV0sdCk7Yz1jfHxzKGQscCl9YyYmYS5wdXNoKGVbbF0pfXJldHVybiBhfSxlLnByb3RvdHlwZS5fZmlsdGVyRG93bnNhbXBsaW5nPWZ1bmN0aW9uKHQsZSl7aWYoMD09PWUubGVuZ3RoKXJldHVybltdO2Zvcih2YXIgbj10LmRhdGEoKSxpPUlNdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSkscj1JTXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLG89W2VbMF1dLGE9ZnVuY3Rpb24obyxhKXt2YXIgcz1pKG5bZVtvXV0sZVtvXSx0KSxsPXIobltlW29dXSxlW29dLHQpLGM9aShuW2VbbysxXV0sZVtvKzFdLHQpLHU9cihuW2VbbysxXV0sZVtvKzFdLHQpO2lmKGE9PT0xLzApcmV0dXJuIE1hdGguZmxvb3Iocyk9PT1NYXRoLmZsb29yKGMpO3ZhciBoPWwrKGMtcykqYTtyZXR1cm4gTWF0aC5mbG9vcih1KT09PU1hdGguZmxvb3IoaCl9LHM9MDtzPGUubGVuZ3RoLTE7KXtmb3IodmFyIGw9ZVtzXSxjPWkobltlW3NdXSxlW3NdLHQpLHU9cihuW2Vbc11dLGVbc10sdCksaD1pKG5bZVtzKzFdXSxlW3MrMV0sdCksZD1yKG5bZVtzKzFdXSxlW3MrMV0sdCkscD1NYXRoLmZsb29yKGMpPT09TWF0aC5mbG9vcihoKT8xLzA6KGQtdSkvKGgtYyksZj1lW3NdLG09cD09PTEvMD91OmMsZz1mLF89bSx5PSEwO3M8ZS5sZW5ndGgtMSYmKHl8fGEocyxwKSk7KXtzKysseT0hMTt2YXIgdj1wPT09MS8wP3IobltlW3NdXSxlW3NdLHQpOmkobltlW3NdXSxlW3NdLHQpO3Y+XyYmKF89dixnPWVbc10pLHY8bSYmKG09dixmPWVbc10pfXZhciBiPWVbc107ZiE9PWwmJm8ucHVzaChmKSxnIT09ZiYmZyE9PWwmJm8ucHVzaChnKSxiIT09bCYmYiE9PWYmJmIhPT1nJiZvLnB1c2goYil9cmV0dXJuIG99LGUucHJvdG90eXBlLl9maWx0ZXJEZW5zZUxpbmVzPWZ1bmN0aW9uKHQsZSl7aWYoMD09PWUubGVuZ3RoKXJldHVybltdO3ZhciBuPXQuZGF0YSgpLGk9SU10LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxyPUlNdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7cmV0dXJuIHRoaXMuX2J1Y2tldEJ5WCh0LGUsKGZ1bmN0aW9uKGUpe3JldHVybiBpKG5bZV0sZSx0KX0pLChmdW5jdGlvbihlKXtyZXR1cm4gcihuW2VdLGUsdCl9KSl9LGUucHJvdG90eXBlLl9idWNrZXRCeVg9ZnVuY3Rpb24odCxlLG4saSl7Zm9yKHZhciByPVtdLG89dC5kYXRhKCksYT1udWxsLHM9ZS5sZW5ndGgsbD0wO2w8PXM7KytsKXt2YXIgYz1lW2xdO2lmKG51bGwhPW9bY10pe3ZhciB1PU1hdGguZmxvb3IobihjKSksaD1pKGMpO251bGw9PWE/YT1uZXcgUE10LkJ1Y2tldChjLHUsaCk6YS5pc0luQnVja2V0KHUpP2EuYWRkVG9CdWNrZXQoaCxjKTooci5wdXNoLmFwcGx5KHIsYS5nZXRVbmlxdWVJbmRpY2VzKCkpLGE9bmV3IFBNdC5CdWNrZXQoYyx1LGgpKX19cmV0dXJuIG51bGwhPWEmJnIucHVzaC5hcHBseShyLGEuZ2V0VW5pcXVlSW5kaWNlcygpKSxyfSxlfSkoUk10LlhZUGxvdCk7bU10LkxpbmU9ek10LAovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoZk10LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgRE10PXVPLEJNdD1FZHQsSE10PVp5dCxGTXQ9Rmd0LFZNdD1OU3QsVU10PUhTdCxqTXQ9V3d0LEdNdD1xU3QsV010PXBNdCxxTXQ9dXd0LFlNdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gZS5hZGRDbGFzcygiYXJlYS1wbG90IiksZS55MCgwKSxlLmF0dHIoImZpbGwtb3BhY2l0eSIsLjI1KSxlLmF0dHIoImZpbGwiLChuZXcgSE10LkNvbG9yKS5yYW5nZSgpWzBdKSxlLl9saW5lRHJhd2Vycz1uZXcgRk10Lk1hcCxlfXJldHVybiBETXQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUueT1mdW5jdGlvbihuLGkpe2lmKG51bGw9PW4pcmV0dXJuIHQucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtpZihudWxsPT1pP3QucHJvdG90eXBlLnkuY2FsbCh0aGlzLG4pOnQucHJvdG90eXBlLnkuY2FsbCh0aGlzLG4saSksbnVsbCE9aSl7dmFyIHI9dGhpcy55MCgpLmFjY2Vzc29yO251bGwhPXImJnRoaXMuX2JpbmRQcm9wZXJ0eShlLl9ZMF9LRVkscixpKSx0aGlzLl91cGRhdGVZU2NhbGUoKX1yZXR1cm4gdGhpc30sZS5wcm90b3R5cGUueTA9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoZS5fWTBfS0VZKTt2YXIgbj10aGlzLnkoKTtyZXR1cm4gdGhpcy5fYmluZFByb3BlcnR5KGUuX1kwX0tFWSx0LG4mJm4uc2NhbGUpLHRoaXMuX3VwZGF0ZVlTY2FsZSgpLHRoaXMucmVuZGVyKCksdGhpc30sZS5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe3QucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKSx0aGlzLl91cGRhdGVZU2NhbGUoKX0sZS5wcm90b3R5cGUuX2FkZERhdGFzZXQ9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztyZXR1cm4gdGhpcy5fbGluZURyYXdlcnMuc2V0KGUsbmV3IFZNdC5Qcm94eURyYXdlcigoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEdNdC5MaW5lU1ZHRHJhd2VyfSksKGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgVk10LkNhbnZhc0RyYXdlcih0LEdNdC5tYWtlTGluZUNhbnZhc0RyYXdTdGVwKChmdW5jdGlvbigpe3ZhciB0PXFNdC5QbG90Ll9zY2FsZWRBY2Nlc3NvcihuLngoKSksaT1xTXQuUGxvdC5fc2NhbGVkQWNjZXNzb3Iobi55KCkpO3JldHVybiBuLl9kM0xpbmVGYWN0b3J5KGUsdCxpKX0pKSl9KSkpLHQucHJvdG90eXBlLl9hZGREYXRhc2V0LmNhbGwodGhpcyxlKSx0aGlzfSxlLnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0PWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQuY2FsbCh0aGlzLGUpO3ZhciBuPXRoaXMuX2xpbmVEcmF3ZXJzLmdldChlKTtyZXR1cm4ic3ZnIj09PXRoaXMucmVuZGVyZXIoKT9uLnVzZVNWRyh0aGlzLl9yZW5kZXJBcmVhKTpuLnVzZUNhbnZhcyh0aGlzLl9jYW52YXMpLG59LGUucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXM9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcy5jYWxsKHRoaXMsZSksdGhpcy5fbGluZURyYXdlcnMuZ2V0KGUpLnJlbW92ZSgpfSxlLnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuX2dlbmVyYXRlTGluZURyYXdTdGVwcygpLG49dGhpcy5fZ2V0RGF0YVRvRHJhdygpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKChmdW5jdGlvbihpKXt2YXIgcj1xTXQuUGxvdC5hcHBseURyYXdTdGVwcyhlLGkpO3QuX2xpbmVEcmF3ZXJzLmdldChpKS5kcmF3KG4uZ2V0KGkpLHIpfSkpfSxlLnByb3RvdHlwZS5fZ2VuZXJhdGVMaW5lRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7dmFyIHQ9W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgZT10aGlzLl9nZW5lcmF0ZUxpbmVBdHRyVG9Qcm9qZWN0b3IoKTtlLmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3RvcihxTXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHRoaXMuX2dldFJlc2V0WUZ1bmN0aW9uKCkpLHQucHVzaCh7YXR0clRvUHJvamVjdG9yOmUsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoV010LkFuaW1hdG9yLlJFU0VUKX0pfXJldHVybiB0LnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZW5lcmF0ZUxpbmVBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihXTXQuQW5pbWF0b3IuTUFJTil9KSx0fSxlLnByb3RvdHlwZS5fZ2VuZXJhdGVMaW5lQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7cmV0dXJuIHQuZD10aGlzLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yKHFNdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSkscU10LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSksdH0sZS5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiBuZXcgak10LlByb3h5RHJhd2VyKChmdW5jdGlvbigpe3JldHVybiBuZXcgVU10LkFyZWFTVkdEcmF3ZXJ9KSwoZnVuY3Rpb24obil7cmV0dXJuIG5ldyBWTXQuQ2FudmFzRHJhd2VyKG4sVU10Lm1ha2VBcmVhQ2FudmFzRHJhd1N0ZXAoKGZ1bmN0aW9uKCl7dmFyIG49ZS5fY29vcmRpbmF0ZVByb2plY3RvcnMoKSxpPW5bMF0scj1uWzFdLG89blsyXSxhPWUuX2NyZWF0ZURlZmluZWRQcm9qZWN0b3IoaSxyKTtyZXR1cm4gZS5fY3JlYXRlQXJlYUdlbmVyYXRvcihpLHIsbyxhLHQpfSksKGZ1bmN0aW9uKCl7dmFyIG49ZS5fY29vcmRpbmF0ZVByb2plY3RvcnMoKSxpPW5bMF0scj1uWzFdLG89ZS5fY3JlYXRlRGVmaW5lZFByb2plY3RvcihpLHIpO3JldHVybiBlLl9jcmVhdGVUb3BMaW5lR2VuZXJhdG9yKGkscixvLHQpfSkpKX0pKX0sZS5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7dmFyIHQ9W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgZT10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTtlLmQ9dGhpcy5fY29uc3RydWN0QXJlYVByb2plY3RvcihxTXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHRoaXMuX2dldFJlc2V0WUZ1bmN0aW9uKCkscU10LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTAoKSkpLHQucHVzaCh7YXR0clRvUHJvamVjdG9yOmUsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoV010LkFuaW1hdG9yLlJFU0VUKX0pfXJldHVybiB0LnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihXTXQuQW5pbWF0b3IuTUFJTil9KSx0fSxlLnByb3RvdHlwZS5fdXBkYXRlWVNjYWxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRFeHRlbnRzRm9yUHJvcGVydHkoInkwIiksZT1GTXQuQXJyYXkuZmxhdHRlbih0KSxuPUZNdC5BcnJheS51bmlxKGUpLGk9MT09PW4ubGVuZ3RoP25bMF06bnVsbCxyPXRoaXMueSgpLG89ciYmci5zY2FsZTtudWxsIT1vJiYobnVsbCE9dGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXImJihvLnJlbW92ZVBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXIodGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXIpLHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyPW51bGwpLG51bGwhPWkmJih0aGlzLl9jb25zdGFudEJhc2VsaW5lVmFsdWVQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybltpXX0sby5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyKSkpfSxlLnByb3RvdHlwZS5fZ2V0UmVzZXRZRnVuY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gcU10LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTAoKSl9LGUucHJvdG90eXBlLl9jb29yZGluYXRlUHJvamVjdG9ycz1mdW5jdGlvbigpe3JldHVybltxTXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHFNdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkscU10LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTAoKSldfSxlLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpLG49dGhpcy5fY29vcmRpbmF0ZVByb2plY3RvcnMoKTtyZXR1cm4gZS5kPXRoaXMuX2NvbnN0cnVjdEFyZWFQcm9qZWN0b3IoblswXSxuWzFdLG5bMl0pLGV9LGUucHJvdG90eXBlLnNlbGVjdGlvbnM9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztpZih2b2lkIDA9PT1lJiYoZT10aGlzLmRhdGFzZXRzKCkpLCJjYW52YXMiPT09dGhpcy5yZW5kZXJlcigpKXJldHVybiBCTXQuc2VsZWN0QWxsKCk7dmFyIGk9dC5wcm90b3R5cGUuc2VsZWN0aW9ucy5jYWxsKHRoaXMsZSkubm9kZXMoKTtyZXR1cm4gZS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBuLl9saW5lRHJhd2Vycy5nZXQodCl9KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dH0pKS5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gaS5wdXNoLmFwcGx5KGksdC5nZXRWaXN1YWxQcmltaXRpdmVzKCkpfSkpLEJNdC5zZWxlY3RBbGwoaSl9LGUucHJvdG90eXBlLl9jb25zdHJ1Y3RBcmVhUHJvamVjdG9yPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLHI9dGhpcy5fY3JlYXRlRGVmaW5lZFByb2plY3RvcihxTXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHFNdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkpO3JldHVybiBmdW5jdGlvbihvLGEscyl7cmV0dXJuIGkuX2NyZWF0ZUFyZWFHZW5lcmF0b3IodCxlLG4scixzKShvKX19LGUucHJvdG90eXBlLl9jcmVhdGVEZWZpbmVkUHJvamVjdG9yPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSxyKXt2YXIgbz10KG4saSxyKSxhPWUobixpLHIpO3JldHVybiBGTXQuTWF0aC5pc1ZhbGlkTnVtYmVyKG8pJiZGTXQuTWF0aC5pc1ZhbGlkTnVtYmVyKGEpfX0sZS5wcm90b3R5cGUuX2NyZWF0ZUFyZWFHZW5lcmF0b3I9ZnVuY3Rpb24odCxlLG4saSxyKXt2YXIgbz10aGlzLl9nZXRDdXJ2ZUZhY3RvcnkoKTtyZXR1cm4gQk10LmFyZWEoKS54KChmdW5jdGlvbihlLG4pe3JldHVybiB0KGUsbixyKX0pKS55MSgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZSh0LG4scil9KSkueTAoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odCxlLHIpfSkpLmN1cnZlKG8pLmRlZmluZWQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkodCxlLHIpfSkpfSxlLnByb3RvdHlwZS5fY3JlYXRlVG9wTGluZUdlbmVyYXRvcj1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10aGlzLl9nZXRDdXJ2ZUZhY3RvcnkoKTtyZXR1cm4gQk10LmxpbmUoKS54KChmdW5jdGlvbihlLG4pe3JldHVybiB0KGUsbixpKX0pKS55KChmdW5jdGlvbih0LG4pe3JldHVybiBlKHQsbixpKX0pKS5jdXJ2ZShyKS5kZWZpbmVkKChmdW5jdGlvbih0LGUpe3JldHVybiBuKHQsZSxpKX0pKX0sZS5fWTBfS0VZPSJ5MCIsZX0pKG1NdC5MaW5lKTtmTXQuQXJlYT1ZTXQ7dmFyIFhNdD17fTshKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9dU8sbj1FZHQsaT1JbXQscj1fbXQsbz1neXQsYT1OU3Qscz1Xd3QsbD1KU3QsYz1kd3QsdT1aeXQsaD1JdnQsZD1GZ3QscD1TbXQsZj1wTXQsbT11d3QsZz1nTXQ7dC5CYXJPcmllbnRhdGlvbj1wLm1ha2VFbnVtKFsidmVydGljYWwiLCJob3Jpem9udGFsIl0pLHQuTGFiZWxzUG9zaXRpb249cC5tYWtlRW51bShbInN0YXJ0IiwibWlkZGxlIiwiZW5kIiwib3V0c2lkZSJdKSx0LkJhckFsaWdubWVudD1wLm1ha2VFbnVtKFsic3RhcnQiLCJtaWRkbGUiLCJlbmQiXSk7dmFyIF89KGZ1bmN0aW9uKHApe2Z1bmN0aW9uIGcoZSl7dm9pZCAwPT09ZSYmKGU9InZlcnRpY2FsIik7dmFyIG49cC5jYWxsKHRoaXMpfHx0aGlzO2lmKG4uX2xhYmVsRm9ybWF0dGVyPW8uaWRlbnRpdHkoKSxuLl9sYWJlbHNFbmFibGVkPSExLG4uX2xhYmVsc1Bvc2l0aW9uPXQuTGFiZWxzUG9zaXRpb24uZW5kLG4uX2hpZGVCYXJzSWZBbnlBcmVUb29XaWRlPSEwLG4uX2JhckFsaWdubWVudD0ibWlkZGxlIixuLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3M9Yy5tZW1vaXplKHkpLG4uX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M9ITAsbi5hZGRDbGFzcygiYmFyLXBsb3QiKSwidmVydGljYWwiIT09ZSYmImhvcml6b250YWwiIT09ZSl0aHJvdyBuZXcgRXJyb3IoZSsiIGlzIG5vdCBhIHZhbGlkIG9yaWVudGF0aW9uIGZvciBQbG90cy5CYXIiKTtyZXR1cm4gbi5faXNWZXJ0aWNhbD0idmVydGljYWwiPT09ZSxuLmFuaW1hdG9yKCJiYXNlbGluZSIsbmV3IHIuTnVsbCksbi5hdHRyKCJmaWxsIiwobmV3IHUuQ29sb3IpLnJhbmdlKClbMF0pLG4uYXR0cihnLl9CQVJfVEhJQ0tORVNTX0tFWSwoZnVuY3Rpb24oKXtyZXR1cm4gbi5fYmFyUGl4ZWxUaGlja25lc3MoKX0pKSxuLl9sYWJlbENvbmZpZz1uZXcgZC5NYXAsbi5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuW24uYmFzZWxpbmVWYWx1ZSgpXX0sbn1yZXR1cm4gZS5fX2V4dGVuZHMoZyxwKSxnLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsdCxlLG4pLHRoaXMuX3VwZGF0ZUV4dGVudHMoKSx0aGlzfSxnLnByb3RvdHlwZS54PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/cC5wcm90b3R5cGUueC5jYWxsKHRoaXMpOihudWxsPT1lP3AucHJvdG90eXBlLnguY2FsbCh0aGlzLHQpOnAucHJvdG90eXBlLnguY2FsbCh0aGlzLHQsZSksdGhpcy5fdXBkYXRlVGhpY2tuZXNzQXR0cigpLHRoaXMuX3VwZGF0ZUxlbmd0aFNjYWxlKCksdGhpcyl9LGcucHJvdG90eXBlLnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD9wLnByb3RvdHlwZS55LmNhbGwodGhpcyk6KG51bGw9PWU/cC5wcm90b3R5cGUueS5jYWxsKHRoaXMsdCk6cC5wcm90b3R5cGUueS5jYWxsKHRoaXMsdCxlKSx0aGlzLl91cGRhdGVMZW5ndGhTY2FsZSgpLHRoaXMpfSxnLnByb3RvdHlwZS5sZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNWZXJ0aWNhbD90aGlzLnkoKTp0aGlzLngoKX0sZy5wcm90b3R5cGUucG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNWZXJ0aWNhbD90aGlzLngoKTp0aGlzLnkoKX0sZy5wcm90b3R5cGUuYmFyRW5kPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KGcuX0JBUl9FTkRfS0VZKTt2YXIgZT10aGlzLnBvc2l0aW9uKCk7cmV0dXJuIHRoaXMuX2JpbmRQcm9wZXJ0eShnLl9CQVJfRU5EX0tFWSx0LGUmJmUuc2NhbGUpLHRoaXMuX3VwZGF0ZVRoaWNrbmVzc0F0dHIoKSx0aGlzLl91cGRhdGVMZW5ndGhTY2FsZSgpLHRoaXMucmVuZGVyKCksdGhpc30sZy5wcm90b3R5cGUuYmFyQWxpZ25tZW50PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2JhckFsaWdubWVudDoodGhpcy5fYmFyQWxpZ25tZW50PXQsdGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpLHRoaXMucmVuZGVyKCksdGhpcyl9LGcucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9LGcucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHMuUHJveHlEcmF3ZXIoKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBsLlJlY3RhbmdsZVNWR0RyYXdlcihnLl9CQVJfQVJFQV9DTEFTUyl9KSwoZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBhLlJlY3RhbmdsZUNhbnZhc0RyYXdlcih0KX0pKX0sZy5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyksdGhpcy5fYmFzZWxpbmU9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApfSxnLnByb3RvdHlwZS5iYXNlbGluZVZhbHVlPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpe2lmKG51bGwhPXRoaXMuX2Jhc2VsaW5lVmFsdWUpcmV0dXJuIHRoaXMuX2Jhc2VsaW5lVmFsdWU7aWYoIXRoaXMuX3Byb2plY3RvcnNSZWFkeSgpKXJldHVybiAwO3ZhciBlPXRoaXMubGVuZ3RoKCkuc2NhbGU7cmV0dXJuIGUmJmUgaW5zdGFuY2VvZiB1LlRpbWU/bmV3IERhdGUoMCk6MH1yZXR1cm4gdGhpcy5fYmFzZWxpbmVWYWx1ZT10LHRoaXMuX3VwZGF0ZUxlbmd0aFNjYWxlKCksdGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpLHRoaXMucmVuZGVyKCksdGhpc30sZy5wcm90b3R5cGUuYWRkRGF0YXNldD1mdW5jdGlvbih0KXtyZXR1cm4gcC5wcm90b3R5cGUuYWRkRGF0YXNldC5jYWxsKHRoaXMsdCksdGhpc30sZy5wcm90b3R5cGUuX2FkZERhdGFzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHAucHJvdG90eXBlLl9hZGREYXRhc2V0LmNhbGwodGhpcyx0KSx0aGlzfSxnLnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKHQpe3JldHVybiBwLnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0LmNhbGwodGhpcyx0KSx0aGlzfSxnLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldD1mdW5jdGlvbih0KXtyZXR1cm4gcC5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQuY2FsbCh0aGlzLHQpLHRoaXN9LGcucHJvdG90eXBlLmRhdGFzZXRzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3AucHJvdG90eXBlLmRhdGFzZXRzLmNhbGwodGhpcyk6KHAucHJvdG90eXBlLmRhdGFzZXRzLmNhbGwodGhpcyx0KSx0aGlzKX0sZy5wcm90b3R5cGUubGFiZWxzRW5hYmxlZD1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3RoaXMuX2xhYmVsc0VuYWJsZWQ6KHRoaXMuX2xhYmVsc0VuYWJsZWQ9dCxudWxsIT1lJiYodGhpcy5fbGFiZWxzUG9zaXRpb249ZSksdGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpLHRoaXMucmVuZGVyKCksdGhpcyl9LGcucHJvdG90eXBlLmxhYmVsRm9ybWF0dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2xhYmVsRm9ybWF0dGVyOih0aGlzLl9sYWJlbEZvcm1hdHRlcj10LHRoaXMuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGUoKSx0aGlzLnJlbmRlcigpLHRoaXMpfSxnLnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXAucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQuY2FsbCh0aGlzLHQpLG49dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImciKS5jbGFzc2VkKGcuX0xBQkVMX0FSRUFfQ0xBU1MsITApLHI9bmV3IGkuU3ZnQ29udGV4dChuLm5vZGUoKSksbz1uZXcgaS5DYWNoZU1lYXN1cmVyKHIpLGE9bmV3IGkuV3JpdGVyKG8scik7cmV0dXJuIHRoaXMuX2xhYmVsQ29uZmlnLnNldCh0LHtsYWJlbEFyZWE6bixtZWFzdXJlcjpvLHdyaXRlcjphfSksZX0sZy5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcz1mdW5jdGlvbih0KXtwLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzLmNhbGwodGhpcyx0KTt2YXIgZT10aGlzLl9sYWJlbENvbmZpZy5nZXQodCk7bnVsbCE9ZSYmKGUubGFiZWxBcmVhLnJlbW92ZSgpLHRoaXMuX2xhYmVsQ29uZmlnLmRlbGV0ZSh0KSl9LGcucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWZ1bmN0aW9uKCl7dmFyIG49ZS5faXNWZXJ0aWNhbD9lLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0eU5lYXJlc3RYKHQpOmUuX2dldEVudGl0eVN0b3JlKCkuZW50aXR5TmVhcmVzdFkodCk7cmV0dXJuIHZvaWQgMD09PW4/dm9pZCAwOmUuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShuKX07cmV0dXJuIHRoaXMuX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M/dGhpcy5fY29tcHV0ZUJhclBpeGVsVGhpY2tuZXNzLmRvTG9ja2VkKG4pOm4oKX0sZy5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49ZnVuY3Rpb24oKXtyZXR1cm4gZS5fZW50aXRpZXNJbnRlcnNlY3RpbmcodC54LHQueSl9O3JldHVybiB0aGlzLl9maXhlZEJhclBpeGVsVGhpY2tuZXNzP3RoaXMuX2NvbXB1dGVCYXJQaXhlbFRoaWNrbmVzcy5kb0xvY2tlZChuKTpuKCl9LGcucHJvdG90eXBlLmVudGl0aWVzSW5Cb3VuZHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWZ1bmN0aW9uKCl7cmV0dXJuIHAucHJvdG90eXBlLmVudGl0aWVzSW5Cb3VuZHMuY2FsbChlLHQpfTtyZXR1cm4gdGhpcy5fZml4ZWRCYXJQaXhlbFRoaWNrbmVzcz90aGlzLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3MuZG9Mb2NrZWQobik6bigpfSxnLnByb3RvdHlwZS5lbnRpdGllc0luWEJvdW5kcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49ZnVuY3Rpb24oKXtyZXR1cm4gcC5wcm90b3R5cGUuZW50aXRpZXNJblhCb3VuZHMuY2FsbChlLHQpfTtyZXR1cm4gdGhpcy5fZml4ZWRCYXJQaXhlbFRoaWNrbmVzcz90aGlzLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3MuZG9Mb2NrZWQobik6bigpfSxnLnByb3RvdHlwZS5lbnRpdGllc0luWUJvdW5kcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49ZnVuY3Rpb24oKXtyZXR1cm4gcC5wcm90b3R5cGUuZW50aXRpZXNJbllCb3VuZHMuY2FsbChlLHQpfTtyZXR1cm4gdGhpcy5fZml4ZWRCYXJQaXhlbFRoaWNrbmVzcz90aGlzLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3MuZG9Mb2NrZWQobik6bigpfSxnLnByb3RvdHlwZS5fZW50aXRpZXNJbnRlcnNlY3Rpbmc9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10saT10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzKCkscj1pLmxlbmd0aCxvPTA7bzxyO28rKyl7dmFyIGE9aVtvXTtkLkRPTS5pbnRlcnNlY3RzQkJveCh0LGUsdGhpcy5fZW50aXR5Qm91bmRzKGEpKSYmbi5wdXNoKHRoaXMuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShhKSl9cmV0dXJuIG59LGcucHJvdG90eXBlLl91cGRhdGVMZW5ndGhTY2FsZT1mdW5jdGlvbigpe2lmKHRoaXMuX3Byb2plY3RvcnNSZWFkeSgpKXt2YXIgdD10aGlzLmxlbmd0aCgpLnNjYWxlO3QgaW5zdGFuY2VvZiBoLlF1YW50aXRhdGl2ZVNjYWxlJiYodC5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlciksdC5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlcikpfX0sZy5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLl9iYXJQaXhlbFRoaWNrbmVzcygpLHRoaXMuX2NvbXB1dGVCYXJQaXhlbFRoaWNrbmVzcy5kb0xvY2tlZCgoZnVuY3Rpb24oKXtyZXR1cm4gcC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0KX0pKX0sZy5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dGhpcy5sZW5ndGgoKS5zY2FsZS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSksaT17eDE6dGhpcy5faXNWZXJ0aWNhbD8wOm4seTE6dGhpcy5faXNWZXJ0aWNhbD9uOjAseDI6dGhpcy5faXNWZXJ0aWNhbD90aGlzLndpZHRoKCk6bix5Mjp0aGlzLl9pc1ZlcnRpY2FsP246dGhpcy5oZWlnaHQoKX07dGhpcy5fZ2V0QW5pbWF0b3IoImJhc2VsaW5lIikuYW5pbWF0ZSh0aGlzLl9iYXNlbGluZSxpKSx0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX2xhYmVsQ29uZmlnLmdldCh0KS5sYWJlbEFyZWEuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCl9KSksdGhpcy5fbGFiZWxzRW5hYmxlZCYmZC5XaW5kb3cuc2V0VGltZW91dCgoZnVuY3Rpb24oKXtyZXR1cm4gZS5fZHJhd0xhYmVscygpfSksdCl9LGcucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMscj1wLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLHQpO2lmKCJ4Ij09PXQmJnRoaXMuX2lzVmVydGljYWwpZT10aGlzLngoKTtlbHNle2lmKCJ5IiE9PXR8fHRoaXMuX2lzVmVydGljYWwpcmV0dXJuIHI7ZT10aGlzLnkoKX1pZighKGUmJmUuc2NhbGUmJmUuc2NhbGUgaW5zdGFuY2VvZiBoLlF1YW50aXRhdGl2ZVNjYWxlKSlyZXR1cm4gcjt2YXIgbz1lLnNjYWxlLGE9dGhpcy5fYmFyUGl4ZWxUaGlja25lc3MoKTtyZXR1cm4gci5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBuLmV4dGVudChbby5pbnZlcnQoaS5fZ2V0UG9zaXRpb25BdHRyKG8uc2NhbGUodFswXSksYSkpLG8uaW52ZXJ0KGkuX2dldFBvc2l0aW9uQXR0cihvLnNjYWxlKHRbMF0pLGEpK2EpLG8uaW52ZXJ0KGkuX2dldFBvc2l0aW9uQXR0cihvLnNjYWxlKHRbMV0pLGEpKSxvLmludmVydChpLl9nZXRQb3NpdGlvbkF0dHIoby5zY2FsZSh0WzFdKSxhKSthKV0pfSkpfSxnLnByb3RvdHlwZS5fZ2V0UG9zaXRpb25BdHRyPWZ1bmN0aW9uKHQsZSl7c3dpdGNoKHRoaXMuX2lzVmVydGljYWx8fCh0LT1lLGUqPS0xKSx0aGlzLl9iYXJBbGlnbm1lbnQpe2Nhc2Uic3RhcnQiOnJldHVybiB0O2Nhc2UiZW5kIjpyZXR1cm4gdC1lO2Nhc2UibWlkZGxlIjpkZWZhdWx0OnJldHVybiB0LWUvMn19LGcucHJvdG90eXBlLl9kcmF3TGFiZWxzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuX2dldERhdGFUb0RyYXcoKSxuPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGk9dGhpcy5kYXRhc2V0cygpLnNvbWUoKGZ1bmN0aW9uKGkpe3JldHVybiBlLmdldChpKS5zb21lKChmdW5jdGlvbihlLHIpe3JldHVybiBudWxsIT1lJiZ0Ll9kcmF3TGFiZWwoZSxyLGksbil9KSl9KSk7dGhpcy5faGlkZUJhcnNJZkFueUFyZVRvb1dpZGUmJmkmJnRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXtyZXR1cm4gdC5fbGFiZWxDb25maWcuZ2V0KGUpLmxhYmVsQXJlYS5zZWxlY3RBbGwoImciKS5yZW1vdmUoKX0pKX0sZy5wcm90b3R5cGUuX2RyYXdMYWJlbD1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10aGlzLl9sYWJlbENvbmZpZy5nZXQobiksbz1yLmxhYmVsQXJlYSxhPXIubWVhc3VyZXIscz1yLndyaXRlcixsPSgwLHRoaXMubGVuZ3RoKCkuYWNjZXNzb3IpKHQsZSxuKSxjPXRoaXMubGVuZ3RoKCkuc2NhbGUsdT1udWxsIT1jP2Muc2NhbGUobCk6bCxoPW51bGwhPWM/Yy5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSk6dGhpcy5iYXNlbGluZVZhbHVlKCksZD17eDppLngodCxlLG4pLHk6aS55KHQsZSxuKX0scD17d2lkdGg6aS53aWR0aCh0LGUsbiksaGVpZ2h0OmkuaGVpZ2h0KHQsZSxuKX0sZj10aGlzLl9sYWJlbEZvcm1hdHRlcihsLHQsZSxuKSxtPWEubWVhc3VyZShmKSxnPXRoaXMuX3Nob3VsZFNob3dMYWJlbE9uQmFyKGQscCxtKSxfPXRoaXMuX2NhbGN1bGF0ZUxhYmVsUHJvcGVydGllcyhkLHAsbSxnLHRoaXMuX2lzVmVydGljYWw/dTw9aDp1PGgpLHk9Xy5jb250YWluZXJEaW1lbnNpb25zLHY9Xy5sYWJlbENvbnRhaW5lck9yaWdpbixiPV8ubGFiZWxPcmlnaW4seD1fLmFsaWdubWVudCx3PWkuZmlsbCh0LGUsbiksUz10aGlzLl9jcmVhdGVMYWJlbENvbnRhaW5lcihvLHYsYixtLGcsdyk7cmV0dXJuIHMud3JpdGUoZix5LndpZHRoLHkuaGVpZ2h0LHt4QWxpZ246eC54LHlBbGlnbjp4Lnl9LFMubm9kZSgpKSx0aGlzLl9pc1ZlcnRpY2FsP3Aud2lkdGg8bS53aWR0aDpwLmhlaWdodDxtLmhlaWdodH0sZy5wcm90b3R5cGUuX3Nob3VsZFNob3dMYWJlbE9uQmFyPWZ1bmN0aW9uKGUsbixpKXtpZih0aGlzLl9sYWJlbHNQb3NpdGlvbj09PXQuTGFiZWxzUG9zaXRpb24ub3V0c2lkZSlyZXR1cm4hMTt2YXIgcj10aGlzLl9pc1ZlcnRpY2FsP2UueTplLngsbz10aGlzLl9pc1ZlcnRpY2FsP24uaGVpZ2h0Om4ud2lkdGgsYT10aGlzLl9pc1ZlcnRpY2FsP3RoaXMuaGVpZ2h0KCk6dGhpcy53aWR0aCgpLHM9citvLGw9bztyZXR1cm4gcz5hP2w9YS1yOnI8MCYmKGw9cyksKHRoaXMuX2lzVmVydGljYWw/aS5oZWlnaHQ6aS53aWR0aCkrZy5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVI8PWx9LGcucHJvdG90eXBlLl9jYWxjdWxhdGVMYWJlbFByb3BlcnRpZXM9ZnVuY3Rpb24oZSxuLGkscixvKXt2YXIgYT10aGlzLHM9dGhpcy5faXNWZXJ0aWNhbD9lLnk6ZS54LGw9dGhpcy5faXNWZXJ0aWNhbD9uLmhlaWdodDpuLndpZHRoLGM9dGhpcy5faXNWZXJ0aWNhbD9pLmhlaWdodDppLndpZHRoLHU9ImNlbnRlciIsaD1sLGQ9cyxwPXMsZj1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSJ0b3BMZWZ0IjpyZXR1cm4gdT1hLl9pc1ZlcnRpY2FsPyJ0b3AiOiJsZWZ0IixkKz1nLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUix2b2lkKHArPWcuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSKTtjYXNlImNlbnRlciI6cmV0dXJuIHZvaWQocCs9KGwrYykvMik7Y2FzZSJib3R0b21SaWdodCI6cmV0dXJuIHU9YS5faXNWZXJ0aWNhbD8iYm90dG9tIjoicmlnaHQiLGQtPWcuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSLHZvaWQocCs9aC1nLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUi1jKX19O2lmKHIpc3dpdGNoKHRoaXMuX2xhYmVsc1Bvc2l0aW9uKXtjYXNlIHQuTGFiZWxzUG9zaXRpb24uc3RhcnQ6ZihvPyJib3R0b21SaWdodCI6InRvcExlZnQiKTticmVhaztjYXNlIHQuTGFiZWxzUG9zaXRpb24ubWlkZGxlOmYoImNlbnRlciIpO2JyZWFrO2Nhc2UgdC5MYWJlbHNQb3NpdGlvbi5lbmQ6ZihvPyJ0b3BMZWZ0IjoiYm90dG9tUmlnaHQiKX1lbHNlIG8/KHU9dGhpcy5faXNWZXJ0aWNhbD8idG9wIjoibGVmdCIsaD1sK2cuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSK2MsZC09Zy5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIrYyxwLT1nLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUitjKToodT10aGlzLl9pc1ZlcnRpY2FsPyJib3R0b20iOiJyaWdodCIsaD1sK2cuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSK2MscCs9bCtnLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUik7cmV0dXJue2NvbnRhaW5lckRpbWVuc2lvbnM6e3dpZHRoOnRoaXMuX2lzVmVydGljYWw/bi53aWR0aDpoLGhlaWdodDp0aGlzLl9pc1ZlcnRpY2FsP2g6bi5oZWlnaHR9LGxhYmVsQ29udGFpbmVyT3JpZ2luOnt4OnRoaXMuX2lzVmVydGljYWw/ZS54OmQseTp0aGlzLl9pc1ZlcnRpY2FsP2Q6ZS55fSxsYWJlbE9yaWdpbjp7eDp0aGlzLl9pc1ZlcnRpY2FsP2UueCtuLndpZHRoLzItaS53aWR0aC8yOnAseTp0aGlzLl9pc1ZlcnRpY2FsP3A6ZS55K24uaGVpZ2h0LzItaS5oZWlnaHQvMn0sYWxpZ25tZW50Ont4OnRoaXMuX2lzVmVydGljYWw/ImNlbnRlciI6dSx5OnRoaXMuX2lzVmVydGljYWw/dToiY2VudGVyIn19fSxnLnByb3RvdHlwZS5fY3JlYXRlTGFiZWxDb250YWluZXI9ZnVuY3Rpb24odCxlLG4saSxyLG8pe3ZhciBhPXQuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrZS54KyIsICIrZS55KyIpIik7aWYocil7YS5jbGFzc2VkKCJvbi1iYXItbGFiZWwiLCEwKTt2YXIgcz0xLjYqZC5Db2xvci5jb250cmFzdCgid2hpdGUiLG8pPGQuQ29sb3IuY29udHJhc3QoImJsYWNrIixvKTthLmNsYXNzZWQocz8iZGFyay1sYWJlbCI6ImxpZ2h0LWxhYmVsIiwhMCl9ZWxzZSBhLmNsYXNzZWQoIm9mZi1iYXItbGFiZWwiLCEwKTtyZXR1cm4gYX0sZy5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7dmFyIHQ9W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgZT10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxuPXRoaXMubGVuZ3RoKCkuc2NhbGUuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpLGk9dGhpcy5faXNWZXJ0aWNhbD8iaGVpZ2h0Ijoid2lkdGgiO2VbdGhpcy5faXNWZXJ0aWNhbD8ieSI6IngiXT1mdW5jdGlvbigpe3JldHVybiBufSxlW2ldPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LHQucHVzaCh7YXR0clRvUHJvamVjdG9yOmUsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoZi5BbmltYXRvci5SRVNFVCl9KX1yZXR1cm4gdC5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoZi5BbmltYXRvci5NQUlOKX0pLHR9LGcucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1wLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IuY2FsbCh0aGlzKSxuPXRoaXMubGVuZ3RoKCkuc2NhbGUuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpLGk9dGhpcy5faXNWZXJ0aWNhbD8ieSI6IngiLHI9dGhpcy5faXNWZXJ0aWNhbD8ieCI6InkiLG89bS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnBvc2l0aW9uKCkpLGE9bS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLmxlbmd0aCgpKSxzPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gTWF0aC5hYnMobi1hKHQsZSxpKSl9LGw9ZVtnLl9CQVJfVEhJQ0tORVNTX0tFWV0sYz1lLmdhcCx1PW51bGw9PWM/bDpmdW5jdGlvbih0LGUsbil7dmFyIGk9bCh0LGUsbik7cmV0dXJuIGk8Zy5fQkFSX0dBUExFU1NfVEhSRVNIT0xEX1BYP2k6aS1jKHQsZSxuKX07cmV0dXJuIGUud2lkdGg9dGhpcy5faXNWZXJ0aWNhbD91OnMsZS5oZWlnaHQ9dGhpcy5faXNWZXJ0aWNhbD9zOnUsZVtpXT1mdW5jdGlvbih0LGUsaSl7dmFyIHI9YSh0LGUsaSk7cmV0dXJuIHI+bj9uOnJ9LGVbcl09ZnVuY3Rpb24oZSxuLGkpe3JldHVybiB0Ll9nZXRQb3NpdGlvbkF0dHIobyhlLG4saSksbChlLG4saSkpfSxlfSxnLnByb3RvdHlwZS5fdXBkYXRlVGhpY2tuZXNzQXR0cj1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLnBvc2l0aW9uKCksbj10aGlzLmJhckVuZCgpO251bGwhPWUmJm51bGwhPW4/KHRoaXMuX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M9ITEsdGhpcy5hdHRyKGcuX0JBUl9USElDS05FU1NfS0VZLChmdW5jdGlvbih0LGkscil7dmFyIG89ZS5hY2Nlc3Nvcih0LGksciksYT1uLmFjY2Vzc29yKHQsaSxyKTtyZXR1cm4gbz1lLnNjYWxlP2Uuc2NhbGUuc2NhbGUobyk6byxhPW4uc2NhbGU/bi5zY2FsZS5zY2FsZShhKTphLE1hdGguYWJzKGEtbyl9KSkpOih0aGlzLl9maXhlZEJhclBpeGVsVGhpY2tuZXNzPSEwLHRoaXMuYXR0cihnLl9CQVJfVEhJQ0tORVNTX0tFWSwoZnVuY3Rpb24oKXtyZXR1cm4gdC5fYmFyUGl4ZWxUaGlja25lc3MoKX0pKSl9LGcucHJvdG90eXBlLl9iYXJQaXhlbFRoaWNrbmVzcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9maXhlZEJhclBpeGVsVGhpY2tuZXNzJiZ0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKT90aGlzLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3ModGhpcy5wb3NpdGlvbigpLHRoaXMuZGF0YXNldHMoKSx0aGlzLl9pc1ZlcnRpY2FsP3RoaXMud2lkdGgoKTp0aGlzLmhlaWdodCgpKTowfSxnLnByb3RvdHlwZS5lbnRpdGllcz1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9dGhpcy5kYXRhc2V0cygpKSx0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKT9wLnByb3RvdHlwZS5lbnRpdGllcy5jYWxsKHRoaXMsdCk6W119LGcucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BpeGVsQm91bmRzKHQuZGF0dW0sdC5pbmRleCx0LmRhdGFzZXQpfSxnLnByb3RvdHlwZS5fcGl4ZWxCb3VuZHM9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO3JldHVybnt4OmkueCh0LGUsbikseTppLnkodCxlLG4pLHdpZHRoOmkud2lkdGgodCxlLG4pLGhlaWdodDppLmhlaWdodCh0LGUsbil9fSxnLnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcy5fcGl4ZWxCb3VuZHModCxlLG4pLHI9bS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLl9pc1ZlcnRpY2FsP3RoaXMueSgpOnRoaXMueCgpKSh0LGUsbiksbz0odGhpcy5faXNWZXJ0aWNhbD90aGlzLnkoKS5zY2FsZTp0aGlzLngoKS5zY2FsZSkuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpO3JldHVybiB0aGlzLl9waXhlbFBvaW50QmFyKHIsbyxpKX0sZy5wcm90b3R5cGUuX3BpeGVsUG9pbnRCYXI9ZnVuY3Rpb24odCxlLG4pe3ZhciBpLHI7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/KGk9bi54K24ud2lkdGgvMixyPXQ8PWU/bi55Om4ueStuLmhlaWdodCk6KGk9dD49ZT9uLngrbi53aWR0aDpuLngscj1uLnkrbi5oZWlnaHQvMikse3g6aSx5OnJ9fSxnLnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24odCxlKXtwLnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXkuY2FsbCh0aGlzLHQsZSl9LGcucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPW5ldyBkLk1hcCxuPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGk9dGhpcy53aWR0aCgpLHI9dGhpcy5oZWlnaHQoKTtyZXR1cm4gdGhpcy5kYXRhc2V0cygpLmZvckVhY2goKGZ1bmN0aW9uKG8pe3ZhciBhPW8uZGF0YSgpLm1hcCgoZnVuY3Rpb24oZSxhKXtyZXR1cm4gdC5faXNEYXR1bU9uU2NyZWVuKG4saSxyLGUsYSxvKT9lOm51bGx9KSk7ZS5zZXQobyxhKX0pKSxlfSxnLnByb3RvdHlwZS5faXNEYXR1bU9uU2NyZWVuPWZ1bmN0aW9uKHQsZSxuLGkscixvKXt2YXIgYT10LngoaSxyLG8pLHM9dC55KGkscixvKSxsPXQud2lkdGgoaSxyLG8pLGM9dC5oZWlnaHQoaSxyLG8pO3JldHVybiEhKGQuTWF0aC5pc1ZhbGlkTnVtYmVyKGEpJiZkLk1hdGguaXNWYWxpZE51bWJlcihzKSYmZC5NYXRoLmlzVmFsaWROdW1iZXIobCkmJmQuTWF0aC5pc1ZhbGlkTnVtYmVyKGMpKSYmZC5NYXRoLmJvdW5kc0ludGVyc2VjdHMoYSxzLGwsYywwLDAsZSxuKX0sZy5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztwLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKSx0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuX2xhYmVsQ29uZmlnLmdldChlKS5tZWFzdXJlci5yZXNldCgpfSkpfSxnLl9CQVJfVEhJQ0tORVNTX1JBVElPPS45NSxnLl9CQVJfR0FQTEVTU19USFJFU0hPTERfUFg9MyxnLl9TSU5HTEVfQkFSX0RJTUVOU0lPTl9SQVRJTz0uNCxnLl9CQVJfQVJFQV9DTEFTUz0iYmFyLWFyZWEiLGcuX0JBUl9FTkRfS0VZPSJiYXJFbmQiLGcuX0JBUl9USElDS05FU1NfS0VZPSJ3aWR0aCIsZy5fTEFCRUxfQVJFQV9DTEFTUz0iYmFyLWxhYmVsLXRleHQtYXJlYSIsZy5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVI9MTAsZ30pKGcuWFlQbG90KTtmdW5jdGlvbiB5KHQsZSxpKXt2YXIgcixvPXQuc2NhbGU7aWYobyBpbnN0YW5jZW9mIHUuQ2F0ZWdvcnkpcj1vLnJhbmdlQmFuZCgpO2Vsc2V7dmFyIGE9dC5hY2Nlc3NvcixzPW4uc2V0KGQuQXJyYXkuZmxhdHRlbihlLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZGF0YSgpLm1hcCgoZnVuY3Rpb24oZSxuKXtyZXR1cm4gYShlLG4sdCl9KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dH0pKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnZhbHVlT2YoKX0pKX0pKSkpLnZhbHVlcygpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuK3R9KSk7cy5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiB0LWV9KSk7dmFyIGw9cy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBvLnNjYWxlKHQpfSkpLGM9bi5wYWlycyhsKTtyPWQuTWF0aC5taW4oYywoZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5hYnModFsxXS10WzBdKX0pLGkqXy5fU0lOR0xFX0JBUl9ESU1FTlNJT05fUkFUSU8pLHIqPV8uX0JBUl9USElDS05FU1NfUkFUSU99cmV0dXJuIHJ9dC5CYXI9X30pKFhNdCk7dmFyICRNdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoJE10LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgS010PXVPLFpNdD1aeXQsSk10PUZndCxRTXQ9WE10LHRFdD11d3QsZUV0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPSJ2ZXJ0aWNhbCIpO3ZhciBuPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiBuLl9jbHVzdGVyT2Zmc2V0cz1uZXcgSk10Lk1hcCxufXJldHVybiBLTXQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPXQucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLGk9dGhpcy5fbWFrZUlubmVyU2NhbGUoKSxyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkucmFuZ2VCYW5kKCl9O24ud2lkdGg9dGhpcy5faXNWZXJ0aWNhbD9yOm4ud2lkdGgsbi5oZWlnaHQ9dGhpcy5faXNWZXJ0aWNhbD9uLmhlaWdodDpyO3ZhciBvPW4ueCxhPW4ueTtyZXR1cm4gbi54PXRoaXMuX2lzVmVydGljYWw/ZnVuY3Rpb24odCxuLGkpe3JldHVybiBvKHQsbixpKStlLl9jbHVzdGVyT2Zmc2V0cy5nZXQoaSl9OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbyh0LGUsbil9LG4ueT10aGlzLl9pc1ZlcnRpY2FsP2Z1bmN0aW9uKHQsZSxuKXtyZXR1cm4gYSh0LGUsbil9OmZ1bmN0aW9uKHQsbixpKXtyZXR1cm4gYSh0LG4saSkrZS5fY2x1c3Rlck9mZnNldHMuZ2V0KGkpfSxufSxlLnByb3RvdHlwZS5fdXBkYXRlQ2x1c3RlclBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuX21ha2VJbm5lclNjYWxlKCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goKGZ1bmN0aW9uKG4saSl7cmV0dXJuIHQuX2NsdXN0ZXJPZmZzZXRzLnNldChuLGUuc2NhbGUoU3RyaW5nKGkpKS1lLnJhbmdlQmFuZCgpLzIpfSkpfSxlLnByb3RvdHlwZS5fbWFrZUlubmVyU2NhbGU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgWk10LkNhdGVnb3J5O3QuZG9tYWluKHRoaXMuZGF0YXNldHMoKS5tYXAoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIFN0cmluZyhlKX0pKSk7dmFyIGU9dEV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuYXR0cihRTXQuQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSkpO3JldHVybiB0LnJhbmdlKFswLGUobnVsbCwwLG51bGwpXSksdH0sZS5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXBkYXRlQ2x1c3RlclBvc2l0aW9uKCksdC5wcm90b3R5cGUuX2dldERhdGFUb0RyYXcuY2FsbCh0aGlzKX0sZX0pKFFNdC5CYXIpOyRNdC5DbHVzdGVyZWRCYXI9ZUV0O3ZhciBuRXQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KG5FdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGlFdD11TyxyRXQ9RWR0LG9FdD1JbXQsYUV0PV9tdCxzRXQ9Z3l0LGxFdD1aeXQsY0V0PUZndCx1RXQ9SVN0LGhFdD16U3QsZEV0PVd3dCxwRXQ9a190LGZFdD11d3QsbUV0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBlLl9zdGFydEFuZ2xlPTAsZS5fZW5kQW5nbGU9MipNYXRoLlBJLGUuX2xhYmVsRm9ybWF0dGVyPXNFdC5pZGVudGl0eSgpLGUuX2xhYmVsc0VuYWJsZWQ9ITEsZS5pbm5lclJhZGl1cygwKSxlLm91dGVyUmFkaXVzKChmdW5jdGlvbigpe3ZhciB0PWUuX3BpZUNlbnRlcigpO3JldHVybiBNYXRoLm1pbihNYXRoLm1heChlLndpZHRoKCktdC54LHQueCksTWF0aC5tYXgoZS5oZWlnaHQoKS10LnksdC55KSl9KSksZS5hZGRDbGFzcygicGllLXBsb3QiKSxlLmF0dHIoImZpbGwiLChmdW5jdGlvbih0LGUpe3JldHVybiBTdHJpbmcoZSl9KSxuZXcgbEV0LkNvbG9yKSxlLl9zdHJva2VEcmF3ZXJzPW5ldyBjRXQuTWFwLGV9cmV0dXJuIGlFdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3QucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpLHRoaXMuX3N0cm9rZURyYXdlcnMuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuYXR0YWNoVG8oZS5fcmVuZGVyQXJlYSl9KSl9LGUucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oZSxuLGkpe3QucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLGUsbixpKTt2YXIgcj10aGlzLl9waWVDZW50ZXIoKTt0aGlzLl9yZW5kZXJBcmVhLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK3IueCsiLCIrci55KyIpIik7dmFyIG89TWF0aC5taW4oTWF0aC5tYXgodGhpcy53aWR0aCgpLXIueCxyLngpLE1hdGgubWF4KHRoaXMuaGVpZ2h0KCktci55LHIueSkpO3JldHVybiBudWxsIT10aGlzLmlubmVyUmFkaXVzKCkuc2NhbGUmJnRoaXMuaW5uZXJSYWRpdXMoKS5zY2FsZS5yYW5nZShbMCxvXSksbnVsbCE9dGhpcy5vdXRlclJhZGl1cygpLnNjYWxlJiZ0aGlzLm91dGVyUmFkaXVzKCkuc2NhbGUucmFuZ2UoWzAsb10pLHRoaXN9LGUucHJvdG90eXBlLmFkZERhdGFzZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQucHJvdG90eXBlLmFkZERhdGFzZXQuY2FsbCh0aGlzLGUpLHRoaXN9LGUucHJvdG90eXBlLl9hZGREYXRhc2V0PWZ1bmN0aW9uKGUpe2lmKDE9PT10aGlzLmRhdGFzZXRzKCkubGVuZ3RoKXJldHVybiBjRXQuV2luZG93Lndhcm4oIk9ubHkgb25lIGRhdGFzZXQgaXMgc3VwcG9ydGVkIGluIFBpZSBwbG90cyIpLHRoaXM7dGhpcy5fdXBkYXRlUGllQW5nbGVzKCksdC5wcm90b3R5cGUuX2FkZERhdGFzZXQuY2FsbCh0aGlzLGUpO3ZhciBuPW5ldyBoRXQuQXJjT3V0bGluZVNWR0RyYXdlcjtyZXR1cm4gdGhpcy5faXNTZXR1cCYmbi5hdHRhY2hUbyh0aGlzLl9yZW5kZXJBcmVhKSx0aGlzLl9zdHJva2VEcmF3ZXJzLnNldChlLG4pLHRoaXN9LGUucHJvdG90eXBlLnJlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQucHJvdG90eXBlLnJlbW92ZURhdGFzZXQuY2FsbCh0aGlzLGUpLHRoaXN9LGUucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXM9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcy5jYWxsKHRoaXMsZSksdGhpcy5fc3Ryb2tlRHJhd2Vycy5nZXQoZSkucmVtb3ZlKCl9LGUucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKGUpe3JldHVybiB0LnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldC5jYWxsKHRoaXMsZSksdGhpcy5fc3Ryb2tlRHJhd2Vycy5kZWxldGUoZSksdGhpcy5fc3RhcnRBbmdsZXM9W10sdGhpcy5fZW5kQW5nbGVzPVtdLHRoaXN9LGUucHJvdG90eXBlLnNlbGVjdGlvbnM9ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt2b2lkIDA9PT1lJiYoZT10aGlzLmRhdGFzZXRzKCkpO3ZhciBpPXQucHJvdG90eXBlLnNlbGVjdGlvbnMuY2FsbCh0aGlzLGUpLm5vZGVzKCk7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9bi5fc3Ryb2tlRHJhd2Vycy5nZXQodCk7bnVsbCE9ZSYmaS5wdXNoLmFwcGx5KGksZS5nZXRWaXN1YWxQcmltaXRpdmVzKCkpfSkpLHJFdC5zZWxlY3RBbGwoaSl9LGUucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlLmNhbGwodGhpcyksdGhpcy5fdXBkYXRlUGllQW5nbGVzKCksdGhpcy5yZW5kZXIoKX0sZS5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbigpe3JldHVybiBuZXcgZEV0LlByb3h5RHJhd2VyKChmdW5jdGlvbigpe3JldHVybiBuZXcgdUV0LkFyY1NWR0RyYXdlcn0pLChmdW5jdGlvbigpe3JldHVybiBwRXQud2FybigiY2FudmFzIHJlbmRlcmVyIGlzIG5vdCBzdXBwb3J0ZWQgb24gUGllIFBsb3QhIiksbnVsbH0pKX0sZS5wcm90b3R5cGUuZW50aXRpZXM9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dGhpcy5kYXRhc2V0cygpKSx0LnByb3RvdHlwZS5lbnRpdGllcy5jYWxsKHRoaXMsZSkubWFwKChmdW5jdGlvbih0KXt0LnBvc2l0aW9uLngrPW4ud2lkdGgoKS8yLHQucG9zaXRpb24ueSs9bi5oZWlnaHQoKS8yO3ZhciBlPXJFdC5zZWxlY3Qobi5fc3Ryb2tlRHJhd2Vycy5nZXQodC5kYXRhc2V0KS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4KHQuaW5kZXgpKSxpPXQ7cmV0dXJuIGkuc3Ryb2tlU2VsZWN0aW9uPWUsaX0pKX0sZS5wcm90b3R5cGUuc2VjdG9yVmFsdWU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbnVsbD09dD90aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChlLl9TRUNUT1JfVkFMVUVfS0VZKToodGhpcy5fYmluZFByb3BlcnR5KGUuX1NFQ1RPUl9WQUxVRV9LRVksdCxuKSx0aGlzLl91cGRhdGVQaWVBbmdsZXMoKSx0aGlzLnJlbmRlcigpLHRoaXMpfSxlLnByb3RvdHlwZS5pbm5lclJhZGl1cz1mdW5jdGlvbih0LG4pe3JldHVybiBudWxsPT10P3RoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KGUuX0lOTkVSX1JBRElVU19LRVkpOih0aGlzLl9iaW5kUHJvcGVydHkoZS5fSU5ORVJfUkFESVVTX0tFWSx0LG4pLHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLm91dGVyUmFkaXVzPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG51bGw9PXQ/dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoZS5fT1VURVJfUkFESVVTX0tFWSk6KHRoaXMuX2JpbmRQcm9wZXJ0eShlLl9PVVRFUl9SQURJVVNfS0VZLHQsbiksdGhpcy5yZW5kZXIoKSx0aGlzKX0sZS5wcm90b3R5cGUuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9zdGFydEFuZ2xlOih0aGlzLl9zdGFydEFuZ2xlPXQsdGhpcy5fdXBkYXRlUGllQW5nbGVzKCksdGhpcy5yZW5kZXIoKSx0aGlzKX0sZS5wcm90b3R5cGUuZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZW5kQW5nbGU6KHRoaXMuX2VuZEFuZ2xlPXQsdGhpcy5fdXBkYXRlUGllQW5nbGVzKCksdGhpcy5yZW5kZXIoKSx0aGlzKX0sZS5wcm90b3R5cGUubGFiZWxzRW5hYmxlZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9sYWJlbHNFbmFibGVkOih0aGlzLl9sYWJlbHNFbmFibGVkPXQsdGhpcy5yZW5kZXIoKSx0aGlzKX0sZS5wcm90b3R5cGUubGFiZWxGb3JtYXR0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fbGFiZWxGb3JtYXR0ZXI6KHRoaXMuX2xhYmVsRm9ybWF0dGVyPXQsdGhpcy5yZW5kZXIoKSx0aGlzKX0sZS5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLndpZHRoKCkvMixuPXRoaXMuaGVpZ2h0KCkvMixpPXRoaXMuX3NsaWNlSW5kZXhGb3JQb2ludCh7eDp0LngtZSx5OnQueS1ufSk7cmV0dXJuIG51bGw9PWk/W106W3RoaXMuZW50aXRpZXMoKVtpXV19LGUucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49dC5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpLGk9ZkV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuaW5uZXJSYWRpdXMoKSkscj1mRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5vdXRlclJhZGl1cygpKTtyZXR1cm4gbi5kPWZ1bmN0aW9uKHQsbixvKXtyZXR1cm4gckV0LmFyYygpLmlubmVyUmFkaXVzKGkodCxuLG8pKS5vdXRlclJhZGl1cyhyKHQsbixvKSkuc3RhcnRBbmdsZShlLl9zdGFydEFuZ2xlc1tuXSkuZW5kQW5nbGUoZS5fZW5kQW5nbGVzW25dKSh0LG4pfSxufSxlLnByb3RvdHlwZS5fdXBkYXRlUGllQW5nbGVzPWZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5zZWN0b3JWYWx1ZSgpJiYwIT09dGhpcy5kYXRhc2V0cygpLmxlbmd0aCl7dmFyIHQ9ZkV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2VjdG9yVmFsdWUoKSksZT10aGlzLmRhdGFzZXRzKClbMF0sbj10aGlzLl9nZXREYXRhVG9EcmF3KCkuZ2V0KGUpLGk9ckV0LnBpZSgpLnNvcnQobnVsbCkuc3RhcnRBbmdsZSh0aGlzLl9zdGFydEFuZ2xlKS5lbmRBbmdsZSh0aGlzLl9lbmRBbmdsZSkudmFsdWUoKGZ1bmN0aW9uKG4saSl7cmV0dXJuIHQobixpLGUpfSkpKG4pO3RoaXMuX3N0YXJ0QW5nbGVzPWkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5zdGFydEFuZ2xlfSkpLHRoaXMuX2VuZEFuZ2xlcz1pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZW5kQW5nbGV9KSl9fSxlLnByb3RvdHlwZS5fcGllQ2VudGVyPWZ1bmN0aW9uKCl7dmFyIHQsZSxuLGkscj10aGlzLl9zdGFydEFuZ2xlPHRoaXMuX2VuZEFuZ2xlP3RoaXMuX3N0YXJ0QW5nbGU6dGhpcy5fZW5kQW5nbGUsbz10aGlzLl9zdGFydEFuZ2xlPHRoaXMuX2VuZEFuZ2xlP3RoaXMuX2VuZEFuZ2xlOnRoaXMuX3N0YXJ0QW5nbGUsYT1NYXRoLnNpbihyKSxzPU1hdGguY29zKHIpLGw9TWF0aC5zaW4obyksYz1NYXRoLmNvcyhvKTtyZXR1cm4gYT49MCYmbD49MD9zPj0wJiZjPj0wPyh0PXMsZT0wLGk9MCxuPWwpOnM8MCYmYzwwPyh0PTAsZT0tYyxpPTAsbj1hKTpzPj0wJiZjPDA/KHQ9cyxlPS1jLGk9MCxuPWEpOnM8MCYmYz49MCYmKHQ9MSxlPTEsaT0xLG49TWF0aC5tYXgoYSxsKSk6YT49MCYmbDwwP3M+PTAmJmM+PTA/KHQ9TWF0aC5tYXgocyxjKSxlPTEsaT0xLG49MSk6czwwJiZjPDA/KHQ9MCxlPTEsaT0tbCxuPWEpOnM+PTAmJmM8MD8odD1zLGU9MSxpPS1sLG49MSk6czwwJiZjPj0wJiYodD1jLGU9MSxpPTEsbj1hKTphPDAmJmw+PTA/cz49MCYmYz49MD8odD0xLGU9MCxpPS1hLG49bCk6czwwJiZjPDA/KHQ9MSxlPU1hdGgubWF4KC1zLC1jKSxpPTEsbj0xKTpzPj0wJiZjPDA/KHQ9MSxlPS1jLGk9LWEsbj0xKTpzPDAmJmM+PTAmJih0PTEsZT0tcyxpPTEsbj1sKTphPDAmJmw8MCYmKHM+PTAmJmM+PTA/KHQ9YyxlPTAsaT0tYSxuPTApOnM8MCYmYzwwPyh0PTAsZT0tcyxpPS1sLG49MCk6cz49MCYmYzwwPyh0PTEsZT0xLGk9TWF0aC5tYXgocywtYyksbj0xKTpzPDAmJmM+PTAmJih0PWMsZT0tcyxpPTEsbj0wKSkse3g6aStuPT0wPzA6aS8oaStuKSp0aGlzLndpZHRoKCkseTp0K2U9PTA/MDp0Lyh0K2UpKnRoaXMuaGVpZ2h0KCl9fSxlLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBuPXQucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3LmNhbGwodGhpcyk7aWYoMD09PXRoaXMuZGF0YXNldHMoKS5sZW5ndGgpcmV0dXJuIG47dmFyIGk9ZkV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2VjdG9yVmFsdWUoKSkscj10aGlzLmRhdGFzZXRzKClbMF0sbz1uLmdldChyKS5maWx0ZXIoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuX2lzVmFsaWREYXRhKGkodCxuLHIpKX0pKTtyZXR1cm4gbi5zZXQocixvKSxufSxlLl9pc1ZhbGlkRGF0YT1mdW5jdGlvbih0KXtyZXR1cm4gY0V0Lk1hdGguaXNWYWxpZE51bWJlcih0KSYmdD49MH0sZS5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24odCxuLGkpe3ZhciByPWZFdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnNlY3RvclZhbHVlKCkpO2lmKCFlLl9pc1ZhbGlkRGF0YShyKHQsbixpKSkpcmV0dXJue3g6TmFOLHk6TmFOfTt2YXIgbz0oZkV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuaW5uZXJSYWRpdXMoKSkodCxuLGkpK2ZFdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLm91dGVyUmFkaXVzKCkpKHQsbixpKSkvMixhPXJFdC5waWUoKS5zb3J0KG51bGwpLnZhbHVlKChmdW5jdGlvbih0LG4pe3ZhciBvPXIodCxuLGkpO3JldHVybiBlLl9pc1ZhbGlkRGF0YShvKT9vOjB9KSkuc3RhcnRBbmdsZSh0aGlzLl9zdGFydEFuZ2xlKS5lbmRBbmdsZSh0aGlzLl9lbmRBbmdsZSkoaS5kYXRhKCkpLHM9KGFbbl0uc3RhcnRBbmdsZSthW25dLmVuZEFuZ2xlKS8yO3JldHVybnt4Om8qTWF0aC5zaW4ocykseTotbypNYXRoLmNvcyhzKX19LGUucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLl9yZW5kZXJBcmVhLnNlbGVjdCgiLmxhYmVsLWFyZWEiKS5yZW1vdmUoKSx0aGlzLl9sYWJlbHNFbmFibGVkJiZjRXQuV2luZG93LnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cmV0dXJuIGUuX2RyYXdMYWJlbHMoKX0pLHQpO3ZhciBuPXRoaXMuX2dlbmVyYXRlU3Ryb2tlRHJhd1N0ZXBzKCksaT10aGlzLl9nZXREYXRhVG9EcmF3KCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciByPWZFdC5QbG90LmFwcGx5RHJhd1N0ZXBzKG4sdCk7ZS5fc3Ryb2tlRHJhd2Vycy5nZXQodCkuZHJhdyhpLmdldCh0KSxyKX0pKX0sZS5wcm90b3R5cGUuX2dlbmVyYXRlU3Ryb2tlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7cmV0dXJuW3thdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6bmV3IGFFdC5OdWxsfV19LGUucHJvdG90eXBlLl9zbGljZUluZGV4Rm9yUG9pbnQ9ZnVuY3Rpb24odCl7dmFyIGUsbj1NYXRoLnNxcnQoTWF0aC5wb3codC54LDIpK01hdGgucG93KHQueSwyKSksaT1NYXRoLmFjb3MoLXQueS9uKTt0Lng8MCYmKGk9MipNYXRoLlBJLWkpO2Zvcih2YXIgcj0wO3I8dGhpcy5fc3RhcnRBbmdsZXMubGVuZ3RoO3IrKylpZih0aGlzLl9zdGFydEFuZ2xlc1tyXTxpJiZ0aGlzLl9lbmRBbmdsZXNbcl0+aSl7ZT1yO2JyZWFrfWlmKHZvaWQgMCE9PWUpe3ZhciBvPXRoaXMuZGF0YXNldHMoKVswXSxhPW8uZGF0YSgpW2VdLHM9dGhpcy5pbm5lclJhZGl1cygpLmFjY2Vzc29yKGEsZSxvKSxsPXRoaXMub3V0ZXJSYWRpdXMoKS5hY2Nlc3NvcihhLGUsbyk7aWYobj5zJiZuPGwpcmV0dXJuIGV9cmV0dXJuIG51bGx9LGUucHJvdG90eXBlLl9kcmF3TGFiZWxzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMsZT10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxuPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZCgibGFiZWwtYXJlYSIsITApLGk9bmV3IG9FdC5TdmdDb250ZXh0KG4ubm9kZSgpKSxyPW5ldyBvRXQuQ2FjaGVNZWFzdXJlcihpKSxvPW5ldyBvRXQuV3JpdGVyKHIsaSksYT10aGlzLmRhdGFzZXRzKClbMF0scz10aGlzLl9nZXREYXRhVG9EcmF3KCkuZ2V0KGEpLGw9cy5sZW5ndGgsYz1mdW5jdGlvbihpKXt2YXIgbD1zW2ldLGM9dS5zZWN0b3JWYWx1ZSgpLmFjY2Vzc29yKGwsaSxhKTtpZighY0V0Lk1hdGguaXNWYWxpZE51bWJlcihjKSlyZXR1cm4iY29udGludWUiO2M9dS5fbGFiZWxGb3JtYXR0ZXIoYyxsLGksYSk7dmFyIGg9ci5tZWFzdXJlKGMpLGQ9KHUuX2VuZEFuZ2xlc1tpXSt1Ll9zdGFydEFuZ2xlc1tpXSkvMixwPXUub3V0ZXJSYWRpdXMoKS5hY2Nlc3NvcihsLGksYSk7dS5vdXRlclJhZGl1cygpLnNjYWxlJiYocD11Lm91dGVyUmFkaXVzKCkuc2NhbGUuc2NhbGUocCkpO3ZhciBmPXUuaW5uZXJSYWRpdXMoKS5hY2Nlc3NvcihsLGksYSk7dS5pbm5lclJhZGl1cygpLnNjYWxlJiYoZj11LmlubmVyUmFkaXVzKCkuc2NhbGUuc2NhbGUoZikpO3ZhciBtPShwK2YpLzIsZz1NYXRoLnNpbihkKSptLWgud2lkdGgvMixfPS1NYXRoLmNvcyhkKSptLWguaGVpZ2h0LzIseT1be3g6Zyx5Ol99LHt4OmcseTpfK2guaGVpZ2h0fSx7eDpnK2gud2lkdGgseTpffSx7eDpnK2gud2lkdGgseTpfK2guaGVpZ2h0fV0sdj15LmV2ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5hYnMoZS54KTw9dC53aWR0aCgpLzImJk1hdGguYWJzKGUueSk8PXQuaGVpZ2h0KCkvMn0pKTt2JiYodj15Lm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuX3NsaWNlSW5kZXhGb3JQb2ludChlKX0pKS5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1pfSkpKTt2YXIgYj1lLmZpbGwobCxpLGEpLHg9MS42KmNFdC5Db2xvci5jb250cmFzdCgid2hpdGUiLGIpPGNFdC5Db2xvci5jb250cmFzdCgiYmxhY2siLGIpLHc9bi5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitnKyIsIitfKyIpIik7dy5jbGFzc2VkKHg/ImRhcmstbGFiZWwiOiJsaWdodC1sYWJlbCIsITApLHcuc3R5bGUoInZpc2liaWxpdHkiLHY/ImluaGVyaXQiOiJoaWRkZW4iKSxvLndyaXRlKGMsaC53aWR0aCxoLmhlaWdodCx7eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIn0sdy5ub2RlKCkpfSx1PXRoaXMsaD0wO2g8bDtoKyspYyhoKX0sZS5fSU5ORVJfUkFESVVTX0tFWT0iaW5uZXItcmFkaXVzIixlLl9PVVRFUl9SQURJVVNfS0VZPSJvdXRlci1yYWRpdXMiLGUuX1NFQ1RPUl9WQUxVRV9LRVk9InNlY3Rvci12YWx1ZSIsZX0pKGZFdC5QbG90KTtuRXQuUGllPW1FdDt2YXIgZ0V0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShnRXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBfRXQ9dU8seUV0PUVkdCx2RXQ9SW10LGJFdD1fbXQseEV0PU5TdCx3RXQ9V3d0LFNFdD1KU3QsTUV0PVp5dCxFRXQ9Rmd0LFRFdD11d3QsQ0V0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBlLl9sYWJlbHNFbmFibGVkPSExLGUuX2xhYmVsPW51bGwsZS5hbmltYXRvcigicmVjdGFuZ2xlcyIsbmV3IGJFdC5OdWxsKSxlLmFkZENsYXNzKCJyZWN0YW5nbGUtcGxvdCIpLGUuYXR0cigiZmlsbCIsKG5ldyBNRXQuQ29sb3IpLnJhbmdlKClbMF0pLGV9cmV0dXJuIF9FdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB3RXQuUHJveHlEcmF3ZXIoKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTRXQuUmVjdGFuZ2xlU1ZHRHJhd2VyfSksKGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgeEV0LlJlY3RhbmdsZUNhbnZhc0RyYXdlcih0KX0pKX0sZS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIG49dGhpcyxpPXQucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLHI9VEV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxvPWlbZS5fWDJfS0VZXSxhPVRFdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkscz1pW2UuX1kyX0tFWV0sbD10aGlzLngoKS5zY2FsZSxjPXRoaXMueSgpLnNjYWxlO3JldHVybiBudWxsIT1vPyhpLndpZHRoPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTWF0aC5hYnMobyh0LGUsbiktcih0LGUsbikpfSxpLng9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBNYXRoLm1pbihvKHQsZSxuKSxyKHQsZSxuKSl9KTooaS53aWR0aD1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIG4uX3JlY3RhbmdsZVdpZHRoKGwpfSxpLng9ZnVuY3Rpb24odCxlLG4pe3JldHVybiByKHQsZSxuKS0uNSppLndpZHRoKHQsZSxuKX0pLG51bGwhPXM/KGkuaGVpZ2h0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTWF0aC5hYnMocyh0LGUsbiktYSh0LGUsbikpfSxpLnk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBNYXRoLm1heChzKHQsZSxuKSxhKHQsZSxuKSktaS5oZWlnaHQodCxlLG4pfSk6KGkuaGVpZ2h0PWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbi5fcmVjdGFuZ2xlV2lkdGgoYyl9LGkueT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGEodCxlLG4pLS41KmkuaGVpZ2h0KHQsZSxuKX0pLGRlbGV0ZSBpW2UuX1gyX0tFWV0sZGVsZXRlIGlbZS5fWTJfS0VZXSxpfSxlLnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXtyZXR1cm5be2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcigicmVjdGFuZ2xlcyIpfV19LGUucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eT1mdW5jdGlvbihlKXtyZXR1cm4gdC5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywieDIiPT09ZT8ieCI6InkyIj09PWU/InkiOmUpfSxlLnByb3RvdHlwZS54PWZ1bmN0aW9uKG4saSxyKXtpZihudWxsPT1uKXJldHVybiB0LnByb3RvdHlwZS54LmNhbGwodGhpcyk7aWYobnVsbD09aT90LnByb3RvdHlwZS54LmNhbGwodGhpcyxuKTp0LnByb3RvdHlwZS54LmNhbGwodGhpcyxuLGksciksbnVsbCE9aSl7dmFyIG89dGhpcy54MigpLGE9byYmby5hY2Nlc3NvcjtudWxsIT1hJiZ0aGlzLl9iaW5kUHJvcGVydHkoZS5fWDJfS0VZLGEsaSxvLnBvc3RTY2FsZSl9cmV0dXJuIGkgaW5zdGFuY2VvZiBNRXQuQ2F0ZWdvcnkmJmkuaW5uZXJQYWRkaW5nKDApLm91dGVyUGFkZGluZygwKSx0aGlzfSxlLnByb3RvdHlwZS54Mj1mdW5jdGlvbih0LG4pe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KGUuX1gyX0tFWSk7dmFyIGk9dGhpcy54KCk7cmV0dXJuIHRoaXMuX2JpbmRQcm9wZXJ0eShlLl9YMl9LRVksdCxpJiZpLnNjYWxlLG4pLHRoaXMucmVuZGVyKCksdGhpc30sZS5wcm90b3R5cGUueT1mdW5jdGlvbihuLGkscil7aWYobnVsbD09bilyZXR1cm4gdC5wcm90b3R5cGUueS5jYWxsKHRoaXMpO2lmKG51bGw9PWk/dC5wcm90b3R5cGUueS5jYWxsKHRoaXMsbik6dC5wcm90b3R5cGUueS5jYWxsKHRoaXMsbixpLHIpLG51bGwhPWkpe3ZhciBvPXRoaXMueTIoKSxhPW8mJm8uYWNjZXNzb3I7bnVsbCE9YSYmdGhpcy5fYmluZFByb3BlcnR5KGUuX1kyX0tFWSxhLGksby5wb3N0U2NhbGUpfXJldHVybiBpIGluc3RhbmNlb2YgTUV0LkNhdGVnb3J5JiZpLmlubmVyUGFkZGluZygwKS5vdXRlclBhZGRpbmcoMCksdGhpc30sZS5wcm90b3R5cGUueTI9ZnVuY3Rpb24odCxuKXtpZihudWxsPT10KXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChlLl9ZMl9LRVkpO3ZhciBpPXRoaXMueSgpO3JldHVybiB0aGlzLl9iaW5kUHJvcGVydHkoZS5fWTJfS0VZLHQsaSYmaS5zY2FsZSxuKSx0aGlzLnJlbmRlcigpLHRoaXN9LGUucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7cmV0dXJuIHRoaXMuZW50aXRpZXMoKS5maWx0ZXIoKGZ1bmN0aW9uKG4pe3ZhciBpPW4uZGF0dW0scj1uLmluZGV4LG89bi5kYXRhc2V0LGE9ZS54KGkscixvKSxzPWUueShpLHIsbyksbD1lLndpZHRoKGkscixvKSxjPWUuaGVpZ2h0KGkscixvKTtyZXR1cm4gYTw9dC54JiZ0Lng8PWErbCYmczw9dC55JiZ0Lnk8PXMrY30pKX0sZS5wcm90b3R5cGUuX2VudGl0eUJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZW50aXR5QkJveCh0LmRhdHVtLHQuaW5kZXgsdC5kYXRhc2V0LHRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpKX0sZS5wcm90b3R5cGUuX2VudGl0eUJCb3g9ZnVuY3Rpb24odCxlLG4saSl7cmV0dXJue3g6aS54KHQsZSxuKSx5OmkueSh0LGUsbiksd2lkdGg6aS53aWR0aCh0LGUsbiksaGVpZ2h0OmkuaGVpZ2h0KHQsZSxuKX19LGUucHJvdG90eXBlLmxhYmVsPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2xhYmVsOih0aGlzLl9sYWJlbD10LHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fbGFiZWxzRW5hYmxlZDoodGhpcy5fbGFiZWxzRW5hYmxlZD10LHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyk7cmV0dXJuIG51bGwhPXRoaXMueDIoKSYmKGUueDI9VEV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueDIoKSkpLG51bGwhPXRoaXMueTIoKSYmKGUueTI9VEV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTIoKSkpLGV9LGUucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxyPWkueCh0LGUsbiksbz1pLnkodCxlLG4pO3JldHVybnt4OnIraS53aWR0aCh0LGUsbikvMix5Om8raS5oZWlnaHQodCxlLG4pLzJ9fSxlLnByb3RvdHlwZS5fcmVjdGFuZ2xlV2lkdGg9ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIE1FdC5DYXRlZ29yeSlyZXR1cm4gdC5yYW5nZUJhbmQoKTt2YXIgZT10PT09dGhpcy54KCkuc2NhbGU/dGhpcy54KCkuYWNjZXNzb3I6dGhpcy55KCkuYWNjZXNzb3Isbj15RXQuc2V0KEVFdC5BcnJheS5mbGF0dGVuKHRoaXMuZGF0YXNldHMoKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmRhdGEoKS5tYXAoKGZ1bmN0aW9uKG4saSl7cmV0dXJuIGUobixpLHQpLnZhbHVlT2YoKX0pKX0pKSkpLnZhbHVlcygpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuK3R9KSksaT1FRXQuTWF0aC5taW4obiwwKSxyPUVFdC5NYXRoLm1heChuLDApLG89dC5zY2FsZShpKTtyZXR1cm4odC5zY2FsZShyKS1vKS9NYXRoLmFicyhyLWkpfSxlLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciB0PW5ldyBFRXQuTWFwLGU9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7cmV0dXJuIHRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKChmdW5jdGlvbihuKXt2YXIgaT1uLmRhdGEoKS5tYXAoKGZ1bmN0aW9uKHQsaSl7cmV0dXJuIEVFdC5NYXRoLmlzVmFsaWROdW1iZXIoZS54KHQsaSxuKSkmJkVFdC5NYXRoLmlzVmFsaWROdW1iZXIoZS55KHQsaSxuKSkmJkVFdC5NYXRoLmlzVmFsaWROdW1iZXIoZS53aWR0aCh0LGksbikpJiZFRXQuTWF0aC5pc1ZhbGlkTnVtYmVyKGUuaGVpZ2h0KHQsaSxuKSk/dDpudWxsfSkpO3Quc2V0KG4saSl9KSksdH0sZS5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuX3JlbmRlckFyZWEuc2VsZWN0QWxsKCIubGFiZWwtYXJlYSIpLnJlbW92ZSgpLHRoaXMuX2xhYmVsc0VuYWJsZWQmJm51bGwhPXRoaXMubGFiZWwoKSYmRUV0LldpbmRvdy5zZXRUaW1lb3V0KChmdW5jdGlvbigpe3JldHVybiBlLl9kcmF3TGFiZWxzKCl9KSx0KX0sZS5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5fZ2V0RGF0YVRvRHJhdygpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKChmdW5jdGlvbihuLGkpe3JldHVybiB0Ll9kcmF3TGFiZWwoZSxuLGkpfSkpfSxlLnByb3RvdHlwZS5fZHJhd0xhYmVsPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCkscj10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgiZyIpLmNsYXNzZWQoImxhYmVsLWFyZWEiLCEwKSxvPW5ldyB2RXQuU3ZnQ29udGV4dChyLm5vZGUoKSksYT1uZXcgdkV0LkNhY2hlTWVhc3VyZXIobykscz1uZXcgdkV0LldyaXRlcihhLG8pLGw9dGhpcy54KCkuc2NhbGUucmFuZ2UoKSxjPXRoaXMueSgpLnNjYWxlLnJhbmdlKCksdT1NYXRoLm1pbi5hcHBseShudWxsLGwpLGg9TWF0aC5tYXguYXBwbHkobnVsbCxsKSxkPU1hdGgubWluLmFwcGx5KG51bGwsYykscD1NYXRoLm1heC5hcHBseShudWxsLGMpLGY9dC5nZXQoZSksbT1mLmxlbmd0aCxnPTA7ZzxtO2crKyl7dmFyIF89ZltnXTtpZihudWxsIT1fKXt2YXIgeT0iIit0aGlzLmxhYmVsKCkoXyxnLGUpLHY9YS5tZWFzdXJlKHkpLGI9aS54KF8sZyxlKSx4PWkueShfLGcsZSksdz1pLndpZHRoKF8sZyxlKSxTPWkuaGVpZ2h0KF8sZyxlKTtpZih2LmhlaWdodDw9UyYmdi53aWR0aDw9dyl7dmFyIE09e21pbjpiKz0ody12LndpZHRoKS8yLG1heDpiK3Yud2lkdGh9LEU9e21pbjp4Kz0oUy12LmhlaWdodCkvMixtYXg6eCt2LmhlaWdodH07aWYoTS5taW48dXx8TS5tYXg+aHx8RS5taW48ZHx8RS5tYXg+cCljb250aW51ZTtpZih0aGlzLl9vdmVybGF5TGFiZWwoTSxFLGcsbix0KSljb250aW51ZTt2YXIgVD1pLmZpbGwoXyxnLGUpLEM9MS42KkVFdC5Db2xvci5jb250cmFzdCgid2hpdGUiLFQpPEVFdC5Db2xvci5jb250cmFzdCgiYmxhY2siLFQpLEE9ci5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitiKyIsIit4KyIpIik7QS5jbGFzc2VkKEM/ImRhcmstbGFiZWwiOiJsaWdodC1sYWJlbCIsITApLHMud3JpdGUoeSx2LndpZHRoLHYuaGVpZ2h0LHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIifSxBLm5vZGUoKSl9fX19LGUucHJvdG90eXBlLl9vdmVybGF5TGFiZWw9ZnVuY3Rpb24odCxlLG4saSxyKXtmb3IodmFyIG89dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYT10aGlzLmRhdGFzZXRzKCkscz1pO3M8YS5sZW5ndGg7cysrKWZvcih2YXIgbD1hW3NdLGM9ci5nZXQobCksdT1jLmxlbmd0aCxoPXM9PT1pP24rMTowO2g8dTtoKyspaWYoRUV0LkRPTS5pbnRlcnNlY3RzQkJveCh0LGUsdGhpcy5fZW50aXR5QkJveChjW2hdLGgsbCxvKSkpcmV0dXJuITA7cmV0dXJuITF9LGUuX1gyX0tFWT0ieDIiLGUuX1kyX0tFWT0ieTIiLGV9KShnTXQuWFlQbG90KTtnRXQuUmVjdGFuZ2xlPUNFdDt2YXIgQUV0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShBRXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBrRXQ9dU8sTEV0PUltdCxQRXQ9Z3l0LE5FdD1VeHQsSUV0PVd3dCxSRXQ9bk10LE9FdD1fbXQsekV0PU5TdCxERXQ9Wnl0LEJFdD1GZ3QsSEV0PXBNdCxGRXQ9dXd0LFZFdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztlLl9sYWJlbEZvcm1hdHRlcj1QRXQuaWRlbnRpdHkoKSxlLl9sYWJlbHNFbmFibGVkPSExLGUuYWRkQ2xhc3MoInNjYXR0ZXItcGxvdCIpO3ZhciBuPW5ldyBPRXQuRWFzaW5nO24uc3RhcnREZWxheSg1KSxuLnN0ZXBEdXJhdGlvbigyNTApLG4ubWF4VG90YWxEdXJhdGlvbihGRXQuUGxvdC5fQU5JTUFUSU9OX01BWF9EVVJBVElPTiksZS5hbmltYXRvcihIRXQuQW5pbWF0b3IuTUFJTixuKSxlLmF0dHIoIm9wYWNpdHkiLC42KSxlLmF0dHIoImZpbGwiLChuZXcgREV0LkNvbG9yKS5yYW5nZSgpWzBdKSxlLnNpemUoNik7dmFyIGk9TkV0LmNpcmNsZSgpO3JldHVybiBlLnN5bWJvbCgoZnVuY3Rpb24oKXtyZXR1cm4gaX0pKSxlLl9sYWJlbENvbmZpZz1uZXcgQkV0Lk1hcCxlfXJldHVybiBrRXQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXM9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztyZXR1cm4gdC5wcm90b3R5cGUuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXMuY2FsbCh0aGlzLGUpLm1hcCgoZnVuY3Rpb24odCl7dmFyIGU9RkV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKG4uc2l6ZSgpKSh0LmRhdHVtLHQuaW5kZXgsdC5kYXRhc2V0KTtyZXR1cm4gdC5kaWFtZXRlcj1lLHR9KSl9LGUucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4gbmV3IElFdC5Qcm94eURyYXdlcigoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFJFdC5TeW1ib2xTVkdEcmF3ZXJ9KSwoZnVuY3Rpb24obil7cmV0dXJuIG5ldyB6RXQuQ2FudmFzRHJhd2VyKG4sUkV0Lm1ha2VTeW1ib2xDYW52YXNEcmF3U3RlcCh0LChmdW5jdGlvbigpe3JldHVybiBGRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IoZS5zeW1ib2woKSl9KSwoZnVuY3Rpb24oKXtyZXR1cm4gRkV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKGUuc2l6ZSgpKX0pKSl9KSl9LGUucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbnVsbD09dD90aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChlLl9TSVpFX0tFWSk6KHRoaXMuX2JpbmRQcm9wZXJ0eShlLl9TSVpFX0tFWSx0LG4pLHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLnN5bWJvbD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChlLl9TWU1CT0xfS0VZKToodGhpcy5fcHJvcGVydHlCaW5kaW5ncy5zZXQoZS5fU1lNQk9MX0tFWSx7YWNjZXNzb3I6dH0pLHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz1mdW5jdGlvbigpe3ZhciB0PVtdO2lmKHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSl7dmFyIGU9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksbj1GRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zeW1ib2woKSk7ZS5kPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbih0LGUsaSkoMCkobnVsbCl9LHQucHVzaCh7YXR0clRvUHJvamVjdG9yOmUsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoSEV0LkFuaW1hdG9yLlJFU0VUKX0pfXJldHVybiB0LnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihIRXQuQW5pbWF0b3IuTUFJTil9KSx0fSxlLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpLG49RkV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxpPUZFdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7cmV0dXJuIGUueD1uLGUueT1pLGUudHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4idHJhbnNsYXRlKCIrbih0LGUscikrIiwiK2kodCxlLHIpKyIpIn0sZS5kPXRoaXMuX2NvbnN0cnVjdFN5bWJvbEdlbmVyYXRvcigpLGV9LGUucHJvdG90eXBlLl9jb25zdHJ1Y3RTeW1ib2xHZW5lcmF0b3I9ZnVuY3Rpb24oKXt2YXIgdD1GRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zeW1ib2woKSksZT1GRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zaXplKCkpO3JldHVybiBmdW5jdGlvbihuLGkscil7cmV0dXJuIHQobixpLHIpKGUobixpLHIpKShudWxsKX19LGUucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24odCl7cmV0dXJue3g6dC5wb3NpdGlvbi54LXQuZGlhbWV0ZXIvMix5OnQucG9zaXRpb24ueS10LmRpYW1ldGVyLzIsd2lkdGg6dC5kaWFtZXRlcixoZWlnaHQ6dC5kaWFtZXRlcn19LGUucHJvdG90eXBlLl9lbnRpdHlWaXNpYmxlT25QbG90PWZ1bmN0aW9uKHQsZSl7dmFyIG49e21pbjplLnRvcExlZnQueCxtYXg6ZS5ib3R0b21SaWdodC54fSxpPXttaW46ZS50b3BMZWZ0LnksbWF4OmUuYm90dG9tUmlnaHQueX0scj10aGlzLl9lbnRpdHlCb3VuZHModCk7cmV0dXJuIEJFdC5ET00uaW50ZXJzZWN0c0JCb3gobixpLHIpfSxlLnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKHQpe3ZhciBlPUZFdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksbj1GRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLGk9RkV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2l6ZSgpKTtyZXR1cm4gdGhpcy5lbnRpdGllcygpLmZpbHRlcigoZnVuY3Rpb24ocil7dmFyIG89ci5kYXR1bSxhPXIuaW5kZXgscz1yLmRhdGFzZXQsbD1lKG8sYSxzKSxjPW4obyxhLHMpLHU9aShvLGEscyk7cmV0dXJuIGwtdS8yPD10LngmJnQueDw9bCt1LzImJmMtdS8yPD10LnkmJnQueTw9Yyt1LzJ9KSl9LGUucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fbGFiZWxzRW5hYmxlZDoodGhpcy5fbGFiZWxzRW5hYmxlZD10LHRoaXMuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGUoKSx0aGlzLnJlbmRlcigpLHRoaXMpfSxlLnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0PWZ1bmN0aW9uKG4pe3ZhciBpPXQucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQuY2FsbCh0aGlzLG4pLHI9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImciKS5jbGFzc2VkKGUuX0xBQkVMX0FSRUFfQ0xBU1MsITApLG89bmV3IExFdC5TdmdDb250ZXh0KHIubm9kZSgpKSxhPW5ldyBMRXQuQ2FjaGVNZWFzdXJlcihvKSxzPW5ldyBMRXQuV3JpdGVyKGEsbyk7cmV0dXJuIHRoaXMuX2xhYmVsQ29uZmlnLnNldChuLHtsYWJlbEFyZWE6cixtZWFzdXJlcjphLHdyaXRlcjpzfSksaX0sZS5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcz1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzLmNhbGwodGhpcyxlKTt2YXIgbj10aGlzLl9sYWJlbENvbmZpZy5nZXQoZSk7bnVsbCE9biYmKG4ubGFiZWxBcmVhLnJlbW92ZSgpLHRoaXMuX2xhYmVsQ29uZmlnLmRlbGV0ZShlKSl9LGUucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX2xhYmVsQ29uZmlnLmdldCh0KS5sYWJlbEFyZWEuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCl9KSksdGhpcy5fbGFiZWxzRW5hYmxlZCYmQkV0LldpbmRvdy5zZXRUaW1lb3V0KChmdW5jdGlvbigpe3JldHVybiBlLl9kcmF3TGFiZWxzKCl9KSx0KX0sZS5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5fZ2V0RGF0YVRvRHJhdygpLG49dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goKGZ1bmN0aW9uKGkpe2Zvcih2YXIgcj1lLmdldChpKSxvPXIubGVuZ3RoLGE9MDthPG87YSsrKXt2YXIgcz1yW2FdO251bGwhPXMmJnQuX2RyYXdMYWJlbChzLGEsaSxuKX19KSl9LGUucHJvdG90eXBlLl9kcmF3TGFiZWw9ZnVuY3Rpb24odCxlLG4saSl7aWYobnVsbCE9dC5sYWJlbCl7dmFyIHI9dGhpcy5fbGFiZWxDb25maWcuZ2V0KG4pLG89ci5sYWJlbEFyZWEsYT1yLm1lYXN1cmVyLHM9ci53cml0ZXIsbD17eDppLngodCxlLG4pLHk6aS55KHQsZSxuKX0sYz1GRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zaXplKCkpKHQsZSxuKSx1PXRoaXMuX2xhYmVsRm9ybWF0dGVyKHQubGFiZWwsdCxlLG4pLGg9YS5tZWFzdXJlKHUpLGQ9dGhpcy5fY2FsY3VsYXRlTGFiZWxQcm9wZXJ0aWVzKGwsYyxoKSxwPWQuY29udGFpbmVyRGltZW5zaW9ucyxmPWQuYWxpZ25tZW50LG09dGhpcy5fY3JlYXRlTGFiZWxDb250YWluZXIobyxkLmxhYmVsQ29udGFpbmVyT3JpZ2luLGQubGFiZWxPcmlnaW4saCk7cy53cml0ZSh1LHAud2lkdGgscC5oZWlnaHQse3hBbGlnbjpmLngseUFsaWduOmYueX0sbS5ub2RlKCkpfX0sZS5wcm90b3R5cGUuX2NhbGN1bGF0ZUxhYmVsUHJvcGVydGllcz1mdW5jdGlvbih0LG4saSl7cmV0dXJue2NvbnRhaW5lckRpbWVuc2lvbnM6e3dpZHRoOmkud2lkdGgsaGVpZ2h0OmkuaGVpZ2h0fSxsYWJlbENvbnRhaW5lck9yaWdpbjp7eDp0LngtaS53aWR0aC8yLHk6dC55LWkuaGVpZ2h0LzIrKG48aS5oZWlnaHQ/bi8yK2UuX0xBQkVMX01BUkdJTl9GUk9NX0JVQkJMRTowKX0sbGFiZWxPcmlnaW46e3g6dC54LHk6dC55fSxhbGlnbm1lbnQ6e3g6ImNlbnRlciIseToiY2VudGVyIn19fSxlLnByb3RvdHlwZS5fY3JlYXRlTGFiZWxDb250YWluZXI9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dC5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitlLngrIiwgIitlLnkrIikiKTtyZXR1cm4gci5jbGFzc2VkKCJvbi1iYXItbGFiZWwiLCEwKSxyfSxlLl9TSVpFX0tFWT0ic2l6ZSIsZS5fU1lNQk9MX0tFWT0ic3ltYm9sIixlLl9MQUJFTF9BUkVBX0NMQVNTPSJzY2F0dGVyLWxhYmVsLXRleHQtYXJlYSIsZS5fTEFCRUxfTUFSR0lOX0ZST01fQlVCQkxFPTE1LGV9KShnTXQuWFlQbG90KTtBRXQuU2NhdHRlcj1WRXQ7dmFyIFVFdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoVUV0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgakV0PXVPLEdFdD1fbXQsV0V0PVd3dCxxRXQ9UVN0LFlFdD1aeXQsWEV0PWtfdCwkRXQ9dXd0LEtFdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gZS5hZGRDbGFzcygic2VnbWVudC1wbG90IiksZS5hdHRyKCJzdHJva2UiLChuZXcgWUV0LkNvbG9yKS5yYW5nZSgpWzBdKSxlLmF0dHIoInN0cm9rZS13aWR0aCIsIjJweCIpLGV9cmV0dXJuIGpFdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBXRXQuUHJveHlEcmF3ZXIoKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBxRXQuU2VnbWVudFNWR0RyYXdlcn0pLChmdW5jdGlvbigpe3JldHVybiBYRXQud2FybigiY2FudmFzIHJlbmRlcmVyIGlzIG5vdCBzdXBwb3J0ZWQgb24gU2VnbWVudCBQbG90ISIpLG51bGx9KSl9LGUucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz1mdW5jdGlvbigpe3JldHVyblt7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGFuaW1hdG9yOm5ldyBHRXQuTnVsbH1dfSxlLnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24oZSl7cmV0dXJuIHQucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsIngyIj09PWU/IngiOiJ5MiI9PT1lPyJ5IjplKX0sZS5wcm90b3R5cGUueD1mdW5jdGlvbihuLGkpe2lmKG51bGw9PW4pcmV0dXJuIHQucHJvdG90eXBlLnguY2FsbCh0aGlzKTtpZihudWxsPT1pKXQucHJvdG90eXBlLnguY2FsbCh0aGlzLG4pO2Vsc2V7dC5wcm90b3R5cGUueC5jYWxsKHRoaXMsbixpKTt2YXIgcj10aGlzLngyKCksbz1yJiZyLmFjY2Vzc29yO251bGwhPW8mJnRoaXMuX2JpbmRQcm9wZXJ0eShlLl9YMl9LRVksbyxpKX1yZXR1cm4gdGhpc30sZS5wcm90b3R5cGUueDI9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoZS5fWDJfS0VZKTt2YXIgbj10aGlzLngoKTtyZXR1cm4gdGhpcy5fYmluZFByb3BlcnR5KGUuX1gyX0tFWSx0LG4mJm4uc2NhbGUpLHRoaXMucmVuZGVyKCksdGhpc30sZS5wcm90b3R5cGUueT1mdW5jdGlvbihuLGkpe2lmKG51bGw9PW4pcmV0dXJuIHQucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtpZihudWxsPT1pKXQucHJvdG90eXBlLnkuY2FsbCh0aGlzLG4pO2Vsc2V7dC5wcm90b3R5cGUueS5jYWxsKHRoaXMsbixpKTt2YXIgcj10aGlzLnkyKCksbz1yJiZyLmFjY2Vzc29yO251bGwhPW8mJnRoaXMuX2JpbmRQcm9wZXJ0eShlLl9ZMl9LRVksbyxpKX1yZXR1cm4gdGhpc30sZS5wcm90b3R5cGUueTI9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoZS5fWTJfS0VZKTt2YXIgbj10aGlzLnkoKTtyZXR1cm4gdGhpcy5fYmluZFByb3BlcnR5KGUuX1kyX0tFWSx0LG4mJm4uc2NhbGUpLHRoaXMucmVuZGVyKCksdGhpc30sZS5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBlPXQucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKTtyZXR1cm4gZS54MT0kRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLGUueDI9bnVsbD09dGhpcy54MigpPyRFdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSk6JEV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueDIoKSksZS55MT0kRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLGUueTI9bnVsbD09dGhpcy55MigpPyRFdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk6JEV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTIoKSksZX0sZS5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmVudGl0eU5lYXJlc3QodCk7cmV0dXJuIG51bGwhPWU/W2VdOltdfSxlLnByb3RvdHlwZS5lbnRpdGllc0luPWZ1bmN0aW9uKHQsZSl7dmFyIG4saTtyZXR1cm4gbnVsbD09ZT8obj17bWluOnQudG9wTGVmdC54LG1heDp0LmJvdHRvbVJpZ2h0Lnh9LGk9e21pbjp0LnRvcExlZnQueSxtYXg6dC5ib3R0b21SaWdodC55fSk6KG49dCxpPWUpLHRoaXMuX2VudGl0aWVzSW50ZXJzZWN0aW5nKG4saSl9LGUucHJvdG90eXBlLl9lbnRpdGllc0ludGVyc2VjdGluZz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1bXSxpPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLHI9dGhpcy5lbnRpdGllcygpLG89ci5sZW5ndGgsYT0wO2E8bzthKyspe3ZhciBzPXJbYV07dGhpcy5fbGluZUludGVyc2VjdHNCb3gocyx0LGUsaSkmJm4ucHVzaChzKX1yZXR1cm4gbn0sZS5wcm90b3R5cGUuX2xpbmVJbnRlcnNlY3RzQm94PWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPXRoaXMsbz1pLngxKHQuZGF0dW0sdC5pbmRleCx0LmRhdGFzZXQpLGE9aS54Mih0LmRhdHVtLHQuaW5kZXgsdC5kYXRhc2V0KSxzPWkueTEodC5kYXR1bSx0LmluZGV4LHQuZGF0YXNldCksbD1pLnkyKHQuZGF0dW0sdC5pbmRleCx0LmRhdGFzZXQpO2lmKGUubWluPD1vJiZvPD1lLm1heCYmbi5taW48PXMmJnM8PW4ubWF4fHxlLm1pbjw9YSYmYTw9ZS5tYXgmJm4ubWluPD1sJiZsPD1uLm1heClyZXR1cm4hMDt2YXIgYz17eDpvLHk6c30sdT17eDphLHk6bH0saD1be3g6ZS5taW4seTpuLm1pbn0se3g6ZS5taW4seTpuLm1heH0se3g6ZS5tYXgseTpuLm1heH0se3g6ZS5tYXgseTpuLm1pbn1dO3JldHVybiBoLmZpbHRlcigoZnVuY3Rpb24odCxlKXtyZXR1cm4gMCE9PWUmJnIuX2xpbmVJbnRlcnNlY3RzU2VnbWVudChjLHUsdCxoW2UtMV0pJiZyLl9saW5lSW50ZXJzZWN0c1NlZ21lbnQodCxoW2UtMV0sYyx1KX0pKS5sZW5ndGg+MH0sZS5wcm90b3R5cGUuX2xpbmVJbnRlcnNlY3RzU2VnbWVudD1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuKGUueC10LngpKihuLnktZS55KS0oZS55LXQueSkqKG4ueC1lLngpfTtyZXR1cm4gcih0LGUsbikqcih0LGUsaSk8MH0sZS5fWDJfS0VZPSJ4MiIsZS5fWTJfS0VZPSJ5MiIsZX0pKGdNdC5YWVBsb3QpO1VFdC5TZWdtZW50PUtFdDt2YXIgWkV0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShaRXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBKRXQ9dU8sUUV0PUVkdCx0VHQ9X210LGVUdD1kd3QsblR0PUZndCxpVHQ9dXd0LHJUdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gZS5fc3RhY2tpbmdSZXN1bHQ9ZVR0Lm1lbVRodW5rKChmdW5jdGlvbigpe3JldHVybiBlLmRhdGFzZXRzKCl9KSwoZnVuY3Rpb24oKXtyZXR1cm4gZS54KCkuYWNjZXNzb3J9KSwoZnVuY3Rpb24oKXtyZXR1cm4gZS55KCkuYWNjZXNzb3J9KSwoZnVuY3Rpb24oKXtyZXR1cm4gZS5fc3RhY2tpbmdPcmRlcn0pLChmdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gblR0LlN0YWNraW5nLnN0YWNrKHQsZSxuLGkpfSkpLGUuX3N0YWNrZWRFeHRlbnQ9ZVR0Lm1lbVRodW5rKGUuX3N0YWNraW5nUmVzdWx0LChmdW5jdGlvbigpe3JldHVybiBlLngoKS5hY2Nlc3Nvcn0pLChmdW5jdGlvbigpe3JldHVybiBlLl9maWx0ZXJGb3JQcm9wZXJ0eSgieSIpfSksKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gblR0LlN0YWNraW5nLnN0YWNrZWRFeHRlbnQodCxlLG4pfSkpLGUuX2Jhc2VsaW5lVmFsdWU9MCxlLl9zdGFja2luZ09yZGVyPSJib3R0b211cCIsZS5hZGRDbGFzcygic3RhY2tlZC1hcmVhLXBsb3QiKSxlLl9iYXNlbGluZVZhbHVlUHJvdmlkZXI9ZnVuY3Rpb24oKXtyZXR1cm5bZS5fYmFzZWxpbmVWYWx1ZV19LGUuY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQoITEpLGV9cmV0dXJuIEpFdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT90LnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZC5jYWxsKHRoaXMpOmU/KG5UdC5XaW5kb3cud2FybigiV2FybmluZzogU3RhY2tlZCBBcmVhIFBsb3QgZG9lcyBub3Qgc3VwcG9ydCBjcm9wcGVkIHJlbmRlcmluZy4iKSx0aGlzKTp0LnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZC5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLl9nZXRBbmltYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHRUdC5OdWxsfSxlLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKSx0aGlzLl9iYXNlbGluZT10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImJhc2VsaW5lIiwhMCl9LGUucHJvdG90eXBlLng9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gbnVsbD09ZT90LnByb3RvdHlwZS54LmNhbGwodGhpcyk6KG51bGw9PW4/dC5wcm90b3R5cGUueC5jYWxsKHRoaXMsZSk6dC5wcm90b3R5cGUueC5jYWxsKHRoaXMsZSxuKSx0aGlzLl9jaGVja1NhbWVEb21haW4oKSx0aGlzKX0sZS5wcm90b3R5cGUueT1mdW5jdGlvbihlLG4pe3JldHVybiBudWxsPT1lP3QucHJvdG90eXBlLnkuY2FsbCh0aGlzKToobnVsbD09bj90LnByb3RvdHlwZS55LmNhbGwodGhpcyxlKTp0LnByb3RvdHlwZS55LmNhbGwodGhpcyxlLG4pLHRoaXMuX2NoZWNrU2FtZURvbWFpbigpLHRoaXMpfSxlLnByb3RvdHlwZS55T2Zmc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fc3RhY2tpbmdSZXN1bHQoKTtpZihudWxsIT1uKXt2YXIgaT1uLmdldCh0KTtpZihudWxsIT1pKXt2YXIgcj1pLmdldChTdHJpbmcoZSkpO2lmKG51bGwhPXIpcmV0dXJuIHIub2Zmc2V0fX19LGUucHJvdG90eXBlLnN0YWNraW5nT3JkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fc3RhY2tpbmdPcmRlcjoodGhpcy5fc3RhY2tpbmdPcmRlcj10LHRoaXMuX29uRGF0YXNldFVwZGF0ZSgpLHRoaXMpfSxlLnByb3RvdHlwZS5kb3duc2FtcGxpbmdFbmFibGVkPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3QucHJvdG90eXBlLmRvd25zYW1wbGluZ0VuYWJsZWQuY2FsbCh0aGlzKTooblR0LldpbmRvdy53YXJuKCJXYXJuaW5nOiBTdGFja2VkIEFyZWEgUGxvdCBkb2VzIG5vdCBzdXBwb3J0IGRvd25zYW1wbGluZyIpLHRoaXMpfSxlLnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy55KCkuc2NhbGUuc2NhbGUodGhpcy5fYmFzZWxpbmVWYWx1ZSksZT17eDE6MCx5MTp0LHgyOnRoaXMud2lkdGgoKSx5Mjp0fTt0aGlzLl9nZXRBbmltYXRvcigiYmFzZWxpbmUiKS5hbmltYXRlKHRoaXMuX2Jhc2VsaW5lLGUpfSxlLnByb3RvdHlwZS5fdXBkYXRlWVNjYWxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy55KCksZT10JiZ0LnNjYWxlO251bGwhPWUmJihlLmFkZFBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXIodGhpcy5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyKSxlLmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXIodGhpcy5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyKSl9LGUucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2hlY2tTYW1lRG9tYWluKCksdC5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZS5jYWxsKHRoaXMpLHRoaXN9LGUucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbihlKXtyZXR1cm4ieSI9PT1lP1t0aGlzLl9zdGFja2VkRXh0ZW50KCldOnQucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLl9jaGVja1NhbWVEb21haW49ZnVuY3Rpb24oKXtpZih0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKSl7dmFyIHQ9dGhpcy5kYXRhc2V0cygpLG49dGhpcy54KCkuYWNjZXNzb3IsaT10Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIFFFdC5zZXQodC5kYXRhKCkubWFwKChmdW5jdGlvbihlLGkpe3JldHVybiBuVHQuU3RhY2tpbmcubm9ybWFsaXplS2V5KG4oZSxpLHQpKX0pKSkudmFsdWVzKCl9KSkscj1lLl9kb21haW5LZXlzKHQsbik7aS5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gdC5sZW5ndGghPT1yLmxlbmd0aH0pKSYmblR0LldpbmRvdy53YXJuKCJ0aGUgZG9tYWlucyBhY3Jvc3MgdGhlIGRhdGFzZXRzIGFyZSBub3QgdGhlIHNhbWUuIFBsb3QgbWF5IHByb2R1Y2UgdW5pbnRlbmRlZCBiZWhhdmlvci4iKX19LGUuX2RvbWFpbktleXM9ZnVuY3Rpb24odCxlKXt2YXIgbj1RRXQuc2V0KCk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7Zm9yKHZhciBpPXQuZGF0YSgpLHI9aS5sZW5ndGgsbz0wO288cjtvKyspbi5hZGQoZShpW29dLG8sdCkpfSkpLG4udmFsdWVzKCl9LGUucHJvdG90eXBlLl9jb29yZGluYXRlUHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1pVHQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLG49dGhpcy55KCkuYWNjZXNzb3IsaT10aGlzLngoKS5hY2Nlc3NvcixyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gblR0LlN0YWNraW5nLm5vcm1hbGl6ZUtleShpKHQsZSxuKSl9LG89dGhpcy5fc3RhY2tpbmdSZXN1bHQoKTtyZXR1cm5bZSxmdW5jdGlvbihlLGksYSl7dmFyIHM9K24oZSxpLGEpLGw9by5nZXQoYSkuZ2V0KHIoZSxpLGEpKS5vZmZzZXQ7cmV0dXJuIHQueSgpLnNjYWxlLnNjYWxlKHMrbCl9LGZ1bmN0aW9uKGUsbixpKXt2YXIgYT1vLmdldChpKS5nZXQocihlLG4saSkpLm9mZnNldDtyZXR1cm4gdC55KCkuc2NhbGUuc2NhbGUoYSl9XX0sZS5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBlPXQucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKSxuPXRoaXMuX2Nvb3JkaW5hdGVQcm9qZWN0b3JzKCk7cmV0dXJuIGUuZD10aGlzLl9jb25zdHJ1Y3RBcmVhUHJvamVjdG9yKG5bMF0sblsxXSxuWzJdKSxlfSxlLnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbihlLG4saSl7dmFyIHI9dC5wcm90b3R5cGUuX3BpeGVsUG9pbnQuY2FsbCh0aGlzLGUsbixpKSxvPXRoaXMueCgpLmFjY2Vzc29yKGUsbixpKSxhPXRoaXMueSgpLmFjY2Vzc29yKGUsbixpKSxzPXRoaXMueSgpLnNjYWxlLnNjYWxlKCthK3RoaXMuX3N0YWNraW5nUmVzdWx0KCkuZ2V0KGkpLmdldChuVHQuU3RhY2tpbmcubm9ybWFsaXplS2V5KG8pKS5vZmZzZXQpO3JldHVybnt4OnIueCx5OnN9fSxlfSkoZk10LkFyZWEpO1pFdC5TdGFja2VkQXJlYT1yVHQ7dmFyIG9UdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkob1R0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgYVR0PXVPLHNUdD1JbXQsbFR0PWd5dCxjVHQ9ZHd0LHVUdD1GZ3QsaFR0PVhNdCxkVHQ9dXd0LHBUdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT0idmVydGljYWwiKTt2YXIgbj10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gbi5fZXh0cmVtYUZvcm1hdHRlcj1sVHQuaWRlbnRpdHkoKSxuLl9zdGFja2luZ1Jlc3VsdD1jVHQubWVtVGh1bmsoKGZ1bmN0aW9uKCl7cmV0dXJuIG4uZGF0YXNldHMoKX0pLChmdW5jdGlvbigpe3JldHVybiBuLnBvc2l0aW9uKCkuYWNjZXNzb3J9KSwoZnVuY3Rpb24oKXtyZXR1cm4gbi5sZW5ndGgoKS5hY2Nlc3Nvcn0pLChmdW5jdGlvbigpe3JldHVybiBuLl9zdGFja2luZ09yZGVyfSksKGZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiB1VHQuU3RhY2tpbmcuc3RhY2sodCxlLG4saSl9KSksbi5fc3RhY2tlZEV4dGVudD1jVHQubWVtVGh1bmsobi5fc3RhY2tpbmdSZXN1bHQsKGZ1bmN0aW9uKCl7cmV0dXJuIG4ucG9zaXRpb24oKS5hY2Nlc3Nvcn0pLChmdW5jdGlvbigpe3JldHVybiBuLl9maWx0ZXJGb3JQcm9wZXJ0eShuLl9pc1ZlcnRpY2FsPyJ5IjoieCIpfSksKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdVR0LlN0YWNraW5nLnN0YWNrZWRFeHRlbnQodCxlLG4pfSkpLG4uYWRkQ2xhc3MoInN0YWNrZWQtYmFyLXBsb3QiKSxuLl9zdGFja2luZ09yZGVyPSJib3R0b211cCIsbn1yZXR1cm4gYVR0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLnN0YWNraW5nT3JkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fc3RhY2tpbmdPcmRlcjoodGhpcy5fc3RhY2tpbmdPcmRlcj10LHRoaXMuX29uRGF0YXNldFVwZGF0ZSgpLHRoaXMpfSxlLnByb3RvdHlwZS5leHRyZW1hRm9ybWF0dGVyPWZ1bmN0aW9uKHQpe3JldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLl9leHRyZW1hRm9ybWF0dGVyOih0aGlzLl9leHRyZW1hRm9ybWF0dGVyPXQsdGhpcy5yZW5kZXIoKSx0aGlzKX0sZS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyksdGhpcy5fbGFiZWxBcmVhPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZChoVHQuQmFyLl9MQUJFTF9BUkVBX0NMQVNTLCEwKTt2YXIgZT1uZXcgc1R0LlN2Z0NvbnRleHQodGhpcy5fbGFiZWxBcmVhLm5vZGUoKSk7dGhpcy5fbWVhc3VyZXI9bmV3IHNUdC5DYWNoZU1lYXN1cmVyKGUpLHRoaXMuX3dyaXRlcj1uZXcgc1R0LldyaXRlcih0aGlzLl9tZWFzdXJlcixlKX0sZS5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3QucHJvdG90eXBlLl9kcmF3TGFiZWxzLmNhbGwodGhpcyksdGhpcy5fbGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpO3ZhciBpPSt0aGlzLmJhc2VsaW5lVmFsdWUoKSxyPXRoaXMucG9zaXRpb24oKS5zY2FsZSxvPXRoaXMubGVuZ3RoKCkuc2NhbGUsYT11VHQuU3RhY2tpbmcuc3RhY2tlZEV4dGVudHModGhpcy5fc3RhY2tpbmdSZXN1bHQoKSkscz1hLm1pbmltdW1FeHRlbnRzLGw9W10sYz1mdW5jdGlvbih0LGUpe3ZhciBhPW4uX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yKCkscz1uLndpZHRoKCksYz1uLmhlaWdodCgpO3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYodC5leHRlbnQhPT1pKXt2YXIgdT1uLmV4dHJlbWFGb3JtYXR0ZXIoKSh0LmV4dGVudCksaD1uLl9tZWFzdXJlci5tZWFzdXJlKHUpLGQ9dC5zdGFja2VkRGF0dW0scD1kLm9yaWdpbmFsRGF0dW0sZj1kLm9yaWdpbmFsSW5kZXgsbT1kLm9yaWdpbmFsRGF0YXNldDtpZighbi5faXNEYXR1bU9uU2NyZWVuKGEscyxjLHAsZixtKSlyZXR1cm47dmFyIGc9ZFR0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKG4uYXR0cihoVHQuQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSkpKHAsZixtKSxfPW8uc2NhbGUodC5leHRlbnQpLHk9bi5fZ2V0UG9zaXRpb25BdHRyKHIuc2NhbGUodC5heGlzVmFsdWUpLGcpK2cvMix2PWUobi5faXNWZXJ0aWNhbD97eDp5LHk6X306e3g6Xyx5Onl9LGgsZyksYj0oZnVuY3Rpb24odCxlLGkpe3ZhciByPWUudG9wTGVmdCxvPXIueCxhPXIueSxzPWUuYm90dG9tUmlnaHQueC1lLnRvcExlZnQueCxsPWUuYm90dG9tUmlnaHQueS1lLnRvcExlZnQueSxjPW4uX2lzVmVydGljYWw/cz5pOmw+aTtpZighYyl7dmFyIHU9bi5fbGFiZWxBcmVhLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK28rIiwgIithKyIpIik7dS5jbGFzc2VkKCJzdGFja2VkLWJhci1sYWJlbCIsITApLG4uX3dyaXRlci53cml0ZSh0LHMsbCx7eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIn0sdS5ub2RlKCkpfXJldHVybiBjfSkodSx7dG9wTGVmdDp2LGJvdHRvbVJpZ2h0Ont4OnYueCtoLndpZHRoLHk6di55K2guaGVpZ2h0fX0sZyk7bC5wdXNoKGIpfX0pKX07YyhhLm1heGltdW1FeHRlbnRzLChmdW5jdGlvbih0LGkscil7dmFyIG89bi5faXNWZXJ0aWNhbD9pLndpZHRoOmkuaGVpZ2h0O3JldHVybnt4Om4uX2lzVmVydGljYWw/dC54LW8vMjp0LngrZS5fRVhUUkVNQV9MQUJFTF9NQVJHSU5fRlJPTV9CQVIseTpuLl9pc1ZlcnRpY2FsP3QueS0obi5faXNWZXJ0aWNhbD9pLmhlaWdodDppLndpZHRoKTp0Lnktby8yfX0pKSxjKHMsKGZ1bmN0aW9uKHQsaSxyKXt2YXIgbz1uLl9pc1ZlcnRpY2FsP2kud2lkdGg6aS5oZWlnaHQ7cmV0dXJue3g6bi5faXNWZXJ0aWNhbD90Lngtby8yOnQueC0obi5faXNWZXJ0aWNhbD9pLmhlaWdodDppLndpZHRoKSx5Om4uX2lzVmVydGljYWw/dC55K2UuX0VYVFJFTUFfTEFCRUxfTUFSR0lOX0ZST01fQkFSOnQueS1vLzJ9fSkpLGwuc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIHR9KSkmJnRoaXMuX2xhYmVsQXJlYS5zZWxlY3RBbGwoImciKS5yZW1vdmUoKX0sZS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPXQucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLGk9dGhpcy5faXNWZXJ0aWNhbD8ieSI6IngiLHI9dGhpcy5sZW5ndGgoKS5zY2FsZSxvPXRoaXMubGVuZ3RoKCkuYWNjZXNzb3IsYT10aGlzLnBvc2l0aW9uKCkuYWNjZXNzb3Iscz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHVUdC5TdGFja2luZy5ub3JtYWxpemVLZXkoYSh0LGUsbikpfSxsPXRoaXMuX3N0YWNraW5nUmVzdWx0KCksYz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHIuc2NhbGUobC5nZXQobikuZ2V0KHModCxlLG4pKS5vZmZzZXQpfSx1PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gci5zY2FsZSgrbyh0LGUsbikrbC5nZXQobikuZ2V0KHModCxlLG4pKS5vZmZzZXQpfSxoPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTWF0aC5hYnModSh0LGUsbiktYyh0LGUsbikpfTtuW3RoaXMuX2lzVmVydGljYWw/ImhlaWdodCI6IndpZHRoIl09aDt2YXIgZD1mdW5jdGlvbih0LGUsbil7cmV0dXJuK28odCxlLG4pPDA/Yyh0LGUsbik6dSh0LGUsbil9O3JldHVybiBuW2ldPWZ1bmN0aW9uKHQsbixpKXtyZXR1cm4gZS5faXNWZXJ0aWNhbD9kKHQsbixpKTpkKHQsbixpKS1oKHQsbixpKX0sbn0sZS5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5PWZ1bmN0aW9uKGUpe3JldHVybiBlPT09KHRoaXMuX2lzVmVydGljYWw/InkiOiJ4Iik/W3RoaXMuX3N0YWNrZWRFeHRlbnQoKV06dC5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5LmNhbGwodGhpcyxlKX0sZS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyksdGhpcy5fbWVhc3VyZXIucmVzZXQoKX0sZS5fRVhUUkVNQV9MQUJFTF9NQVJHSU5fRlJPTV9CQVI9NSxlfSkoaFR0LkJhcik7b1R0LlN0YWNrZWRCYXI9cFR0O3ZhciBmVHQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KGZUdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG1UdD11TyxnVHQ9Rmd0LF9UdD11d3QseVR0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBlLl9jb25uZWN0b3JzRW5hYmxlZD0hMSxlLmFkZENsYXNzKCJ3YXRlcmZhbGwtcGxvdCIpLGV9cmV0dXJuIG1UdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5jb25uZWN0b3JzRW5hYmxlZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9jb25uZWN0b3JzRW5hYmxlZDoodGhpcy5fY29ubmVjdG9yc0VuYWJsZWQ9dCx0aGlzKX0sZS5wcm90b3R5cGUudG90YWw9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoZS5fVE9UQUxfS0VZKToodGhpcy5fYmluZFByb3BlcnR5KGUuX1RPVEFMX0tFWSx0LG51bGwpLHRoaXMpfSxlLnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5fY29ubmVjdG9yQXJlYS5zZWxlY3RBbGwoImxpbmUiKS5yZW1vdmUoKSx0aGlzLl9jb25uZWN0b3JzRW5hYmxlZCYmZ1R0LldpbmRvdy5zZXRUaW1lb3V0KChmdW5jdGlvbigpe3JldHVybiBlLl9kcmF3Q29ubmVjdG9ycygpfSksdCl9LGUucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQ9ZnVuY3Rpb24obil7dmFyIGk9dC5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldC5jYWxsKHRoaXMsbik7cmV0dXJuIHRoaXMuX2Nvbm5lY3RvckFyZWE9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImciKS5jbGFzc2VkKGUuX0NPTk5FQ1RPUl9BUkVBX0NMQVNTLCEwKSxpfSxlLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oZSl7cmV0dXJuInkiPT09ZT9bdGhpcy5fZXh0ZW50XTp0LnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLGUpfSxlLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLGk9dC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcykscj10aGlzLnkoKS5zY2FsZSxvPV9UdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnRvdGFsKCkpO3JldHVybiBudWxsPT10aGlzLmF0dHIoInkiKSYmKGkueT1mdW5jdGlvbih0LGUsaSl7dmFyIGE9bi55KCkuYWNjZXNzb3IodCxlLGkpO2lmKG8odCxlLGkpKXJldHVybiBNYXRoLm1pbihyLnNjYWxlKGEpLHIuc2NhbGUoMCkpO3ZhciBzPW4uX3N1YnRvdGFsc1tlXTtpZigwPT09ZSlyZXR1cm4gci5zY2FsZShhPDA/cy1hOnMpO3ZhciBsPW4uX3N1YnRvdGFsc1tlLTFdO3JldHVybiByLnNjYWxlKHM+bD9zOmwpfSksbnVsbD09dGhpcy5hdHRyKCJoZWlnaHQiKSYmKGkuaGVpZ2h0PWZ1bmN0aW9uKHQsZSxpKXt2YXIgYT1vKHQsZSxpKSxzPW4ueSgpLmFjY2Vzc29yKHQsZSxpKTtpZihhKXJldHVybiBNYXRoLmFicyhyLnNjYWxlKHMpLXIuc2NhbGUoMCkpO3ZhciBsPW4uX3N1YnRvdGFsc1tlXTtpZigwPT09ZSlyZXR1cm4gTWF0aC5hYnMoci5zY2FsZShsKS1yLnNjYWxlKGwtcykpO3ZhciBjPW4uX3N1YnRvdGFsc1tlLTFdO3JldHVybiBNYXRoLmFicyhyLnNjYWxlKGwpLXIuc2NhbGUoYykpfSksaS5jbGFzcz1mdW5jdGlvbih0LGkscil7dmFyIGE9IiI7cmV0dXJuIG51bGwhPW4uYXR0cigiY2xhc3MiKSYmKGE9bi5hdHRyKCJjbGFzcyIpLmFjY2Vzc29yKHQsaSxyKSsiICIpLG8odCxpLHIpP2ErZS5fQkFSX1RPVEFMX0NMQVNTOmErKG4ueSgpLmFjY2Vzc29yKHQsaSxyKT4wP2UuX0JBUl9HUk9XVEhfQ0xBU1M6ZS5fQkFSX0RFQ0xJTkVfQ0xBU1MpfSxpfSxlLnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VwZGF0ZVN1YnRvdGFscygpLHQucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKSx0aGlzfSxlLnByb3RvdHlwZS5fY2FsY3VsYXRlU3VidG90YWxzQW5kRXh0ZW50PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1OdW1iZXIuTUFYX1ZBTFVFLG49TnVtYmVyLk1JTl9WQUxVRSxpPTAscj0hMSxvPXQuZGF0YSgpLGE9by5sZW5ndGgscz0wO3M8YTtzKyspe3ZhciBsPW9bc10sYz10aGlzLnkoKS5hY2Nlc3NvcihsLHMsdCksdT10aGlzLnRvdGFsKCkuYWNjZXNzb3IobCxzLHQpO2lmKHUmJjAhPT1zfHwoaSs9YyksdGhpcy5fc3VidG90YWxzLnB1c2goaSksaTxlJiYoZT1pKSxpPm4mJihuPWkpLHUmJihjPGUmJihlPWMpLGM+biYmKG49YykpLCFyJiZ1KXtmb3IodmFyIGg9Yy1pLGQ9MDtkPHRoaXMuX3N1YnRvdGFscy5sZW5ndGg7ZCsrKXRoaXMuX3N1YnRvdGFsc1tkXSs9aDtyPSEwLGkrPWgsZSs9aCxuKz1ofX10aGlzLl9leHRlbnQ9W2Usbl19LGUucHJvdG90eXBlLl9kcmF3Q29ubmVjdG9ycz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxuPXRoaXMuZGF0YXNldHMoKVswXSxpPTE7aTxuLmRhdGEoKS5sZW5ndGg7aSsrKXt2YXIgcj1pLTEsbz1uLmRhdGEoKVtpXSxhPW4uZGF0YSgpW3JdLHM9dC54KGEscixuKSxsPXQueChvLGksbikrdC53aWR0aChvLGksbiksYz10LnkobyxpLG4pOyh0aGlzLl9zdWJ0b3RhbHNbaV0+MCYmdGhpcy5fc3VidG90YWxzW2ldPnRoaXMuX3N1YnRvdGFsc1tyXXx8dGhpcy5fc3VidG90YWxzW2ldPDAmJnRoaXMuX3N1YnRvdGFsc1tpXT49dGhpcy5fc3VidG90YWxzW3JdKSYmKGM9dC55KG8saSxuKSt0LmhlaWdodChvLGksbikpLHRoaXMuX2Nvbm5lY3RvckFyZWEuYXBwZW5kKCJsaW5lIikuY2xhc3NlZChlLl9DT05ORUNUT1JfQ0xBU1MsITApLmF0dHIoIngxIixzKS5hdHRyKCJ4MiIsbCkuYXR0cigieTEiLGMpLmF0dHIoInkyIixjKX19LGUucHJvdG90eXBlLl91cGRhdGVTdWJ0b3RhbHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmRhdGFzZXRzKCk7aWYodC5sZW5ndGg+MCl7dmFyIGU9dFt0Lmxlbmd0aC0xXTt0aGlzLl9zdWJ0b3RhbHM9bmV3IEFycmF5LHRoaXMuX2NhbGN1bGF0ZVN1YnRvdGFsc0FuZEV4dGVudChlKX19LGUuX0JBUl9ERUNMSU5FX0NMQVNTPSJ3YXRlcmZhbGwtZGVjbGluZSIsZS5fQkFSX0dST1dUSF9DTEFTUz0id2F0ZXJmYWxsLWdyb3d0aCIsZS5fQkFSX1RPVEFMX0NMQVNTPSJ3YXRlcmZhbGwtdG90YWwiLGUuX0NPTk5FQ1RPUl9DTEFTUz0iY29ubmVjdG9yIixlLl9DT05ORUNUT1JfQVJFQV9DTEFTUz0iY29ubmVjdG9yLWFyZWEiLGUuX1RPVEFMX0tFWT0idG90YWwiLGV9KShYTXQuQmFyKTtmVHQuV2F0ZXJmYWxsPXlUdCwoZnVuY3Rpb24odCl7Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZT11TztlLl9fZXhwb3J0U3RhcihmTXQsdCksZS5fX2V4cG9ydFN0YXIoWE10LHQpLGUuX19leHBvcnRTdGFyKGh3dCx0KSxlLl9fZXhwb3J0U3RhcigkTXQsdCksZS5fX2V4cG9ydFN0YXIobU10LHQpLGUuX19leHBvcnRTdGFyKG5FdCx0KSxlLl9fZXhwb3J0U3RhcihnRXQsdCksZS5fX2V4cG9ydFN0YXIoQUV0LHQpLGUuX19leHBvcnRTdGFyKFVFdCx0KSxlLl9fZXhwb3J0U3RhcihaRXQsdCksZS5fX2V4cG9ydFN0YXIob1R0LHQpLGUuX19leHBvcnRTdGFyKGZUdCx0KX0pKHBNdCk7dmFyIHZUdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkodlR0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx2VHQudmVyc2lvbj0iMy45LjAiLChmdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9dU87dC5BbmltYXRvcnM9X210LHQuQXhlcz1QbXQsdC5Db21wb25lbnRzPWlidCx0LkNvbmZpZ3M9TF90LHQuRm9ybWF0dGVycz1neXQsdC5SZW5kZXJDb250cm9sbGVyPUhndCx0LlJlbmRlclBvbGljaWVzPW55dCx0LlN5bWJvbEZhY3Rvcmllcz1VeHQsdC5EaXNwYXRjaGVycz1zYnQsdC5EcmF3ZXJzPU5TdCx0LkludGVyYWN0aW9ucz1vYnQsdC5QbG90cz1wTXQsdC5TY2FsZXM9Wnl0LHQuVXRpbHM9Rmd0LGUuX19leHBvcnRTdGFyKG15dCx0KSx0LlRpbWVJbnRlcnZhbD1LeXQuVGltZUludGVydmFsLGUuX19leHBvcnRTdGFyKEJndCx0KSxlLl9fZXhwb3J0U3Rhcih4eHQsdCksZS5fX2V4cG9ydFN0YXIoZ3d0LHQpLHQudmVyc2lvbj12VHQudmVyc2lvbixlLl9fZXhwb3J0U3RhcihjYnQsdCksZS5fX2V4cG9ydFN0YXIoV3d0LHQpLGUuX19leHBvcnRTdGFyKHdidCx0KSxlLl9fZXhwb3J0U3RhcihJYnQsdCksZS5fX2V4cG9ydFN0YXIoZ010LHQpLGUuX19leHBvcnRTdGFyKHV3dCx0KSxlLl9fZXhwb3J0U3RhcihJdnQsdCksZS5fX2V4cG9ydFN0YXIoaHZ0LHQpfSkock8pO2NvbnN0IGJUdD1be2NoYXJhY3Rlcjoi4pe8IixtZXRob2Q6ck8uU3ltYm9sRmFjdG9yaWVzLnNxdWFyZX0se2NoYXJhY3Rlcjoi4peGIixtZXRob2Q6ck8uU3ltYm9sRmFjdG9yaWVzLmRpYW1vbmR9LHtjaGFyYWN0ZXI6IuKWsiIsbWV0aG9kOnJPLlN5bWJvbEZhY3Rvcmllcy50cmlhbmdsZX0se2NoYXJhY3Rlcjoi4piFIixtZXRob2Q6ck8uU3ltYm9sRmFjdG9yaWVzLnN0YXJ9LHtjaGFyYWN0ZXI6IuKcmiIsbWV0aG9kOnJPLlN5bWJvbEZhY3Rvcmllcy5jcm9zc31dO3ZhciB4VHQ7ZnVuY3Rpb24gd1R0KHQpe3JldHVybiBlPT57bGV0IG4saT1NYXRoLmFicyhlKTtyZXR1cm4gaTwxZS0xNSYmKGk9MCksbj1teShpPj0xZTR8fGk+MCYmaTwuMDE/Ii4iK3QrIn5lIjoiLiIrdCsifmciKSxuKGUpfX0hKGZ1bmN0aW9uKHQpe3QuU1RFUD0ic3RlcCIsdC5SRUxBVElWRT0icmVsYXRpdmUiLHQuV0FMTF9USU1FPSJ3YWxsX3RpbWUifSkoeFR0fHwoeFR0PXt9KSk7Y29uc3QgU1R0PW15KCIuNH5zIik7ZnVuY3Rpb24gTVR0KCl7bGV0IHQ9bmV3IHJPLlNjYWxlcy5MaW5lYXI7dC50aWNrR2VuZXJhdG9yKHJPLlNjYWxlcy5UaWNrR2VuZXJhdG9ycy5pbnRlZ2VyVGlja0dlbmVyYXRvcigpKTtsZXQgZT1uZXcgck8uQXhlcy5OdW1lcmljKHQsImJvdHRvbSIpO3JldHVybiBlLmZvcm1hdHRlcihTVHQpLHtzY2FsZTp0LGF4aXM6ZSxhY2Nlc3Nvcjp0PT50LnN0ZXB9fWxldCBFVHQ9ck8uRm9ybWF0dGVycy50aW1lKCIlYSAlYiAlZSwgJUg6JU06JVMiKSxUVHQ9KHQsZSxuKT0+e2lmKG51bGwhPXQucmVsYXRpdmUpcmV0dXJuIHQucmVsYXRpdmU7bGV0IGk9bi5kYXRhKCk7cmV0dXJuKCt0LndhbGxfdGltZS0oaS5sZW5ndGg+MD8raVswXS53YWxsX3RpbWU6MCkpLzM2ZTV9LENUdD10PT57bGV0IGU9IiIsbj1NYXRoLmZsb29yKHQvMjQpO3QtPTI0Km4sbiYmKGUrPW4rImQgIik7bGV0IGk9TWF0aC5mbG9vcih0KTt0LT1pLHQqPTYwLChpfHxuKSYmKGUrPWkrImggIik7bGV0IHI9TWF0aC5mbG9vcih0KTtyZXR1cm4gdC09cix0Kj02MCwocnx8aXx8bikmJihlKz1yKyJtICIpLGUrTWF0aC5mbG9vcih0KSsicyJ9O2Z1bmN0aW9uIEFUdCh0KXtzd2l0Y2godCl7Y2FzZSB4VHQuU1RFUDpyZXR1cm4gTVR0KCk7Y2FzZSB4VHQuV0FMTF9USU1FOnJldHVybihmdW5jdGlvbiBlKCl7bGV0IHQ9bmV3IHJPLlNjYWxlcy5UaW1lO3JldHVybntzY2FsZTp0LGF4aXM6bmV3IHJPLkF4ZXMuVGltZSh0LCJib3R0b20iKSxhY2Nlc3Nvcjp0PT50LndhbGxfdGltZX19KSgpO2Nhc2UgeFR0LlJFTEFUSVZFOnJldHVybihmdW5jdGlvbiBuKCl7bGV0IHQ9bmV3IHJPLlNjYWxlcy5MaW5lYXI7cmV0dXJue3NjYWxlOnQsYXhpczpuZXcgck8uQXhlcy5OdW1lcmljKHQsImJvdHRvbSIpLGFjY2Vzc29yOlRUdH19KSgpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHhUeXBlOiAiK3QpfX12YXIga1R0O2Z1bmN0aW9uIExUdCh0KXtyZXR1cm4gY2xhc3MgZXh0ZW5kcyB0e2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmxvYWRLZXk9IiIsdGhpcy5kYXRhVG9Mb2FkPVtdLHRoaXMuZ2V0RGF0YUxvYWROYW1lPXQ9PlN0cmluZyh0KSx0aGlzLmRhdGFMb2FkaW5nPSExLHRoaXMuZGF0YUxvYWRlZEF0TGVhc3RPbmNlPSExLHRoaXMuX2lzQ29ubmVjdGVkPSExLHRoaXMuX2RhdGFMb2FkU3RhdGU9bmV3IE1hcCx0aGlzLl9jYW5jZWxsZXI9bmV3IFhSLHRoaXMuX2xvYWREYXRhQXN5bmM9bnVsbCx0aGlzLl9sb2FkRGF0YT1TZS5leHBvcnRzLnRocm90dGxlKHRoaXMuX2xvYWREYXRhSW1wbCwxMDAse2xlYWRpbmc6ITAsdHJhaWxpbmc6ITB9KX1jb25uZWN0ZWRDYWxsYmFjaygpe3N1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCksdGhpcy5faXNDb25uZWN0ZWQ9ITB9ZGlzY29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpLHRoaXMuX2lzQ29ubmVjdGVkPSExfXN0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybnthY3RpdmU6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2xvYWREYXRhSWZBY3RpdmUifSxfaXNDb25uZWN0ZWQ6e3R5cGU6Qm9vbGVhbn0sbG9hZEtleTp7dHlwZTpTdHJpbmd9LGRhdGFUb0xvYWQ6e3R5cGU6QXJyYXl9LGdldERhdGFMb2FkTmFtZTp7dHlwZTpPYmplY3R9LGxvYWREYXRhQ2FsbGJhY2s6e3R5cGU6T2JqZWN0fSxyZXF1ZXN0RGF0YTp7dHlwZTpPYmplY3R9fX1zdGF0aWMgZ2V0IG9ic2VydmVycygpe3JldHVyblsiX2RhdGFUb0xvYWRDaGFuZ2VkKF9pc0Nvbm5lY3RlZCwgZGF0YVRvTG9hZC4qKSJdfW9uTG9hZEZpbmlzaCgpe31yZWxvYWQoKXt0aGlzLl9kYXRhTG9hZFN0YXRlLmNsZWFyKCksdGhpcy5fbG9hZERhdGEoKX1yZXNldCgpe251bGwhPXRoaXMuX2xvYWREYXRhQXN5bmMmJihjbGVhclRpbWVvdXQodGhpcy5fbG9hZERhdGFBc3luYyksdGhpcy5fbG9hZERhdGFBc3luYz1udWxsKSx0aGlzLl9jYW5jZWxsZXImJnRoaXMuX2NhbmNlbGxlci5jYW5jZWxBbGwoKSx0aGlzLl9kYXRhTG9hZFN0YXRlJiZ0aGlzLl9kYXRhTG9hZFN0YXRlLmNsZWFyKCksdGhpcy5faXNDb25uZWN0ZWQmJnRoaXMuX2xvYWREYXRhKCl9X2RhdGFUb0xvYWRDaGFuZ2VkKCl7dGhpcy5faXNDb25uZWN0ZWQmJnRoaXMuX2xvYWREYXRhKCl9ZGV0YWNoZWQoKXtudWxsIT10aGlzLl9sb2FkRGF0YUFzeW5jJiYoY2xlYXJUaW1lb3V0KHRoaXMuX2xvYWREYXRhQXN5bmMpLHRoaXMuX2xvYWREYXRhQXN5bmM9bnVsbCl9X2xvYWREYXRhSWZBY3RpdmUoKXt0aGlzLmFjdGl2ZSYmdGhpcy5fbG9hZERhdGEoKX1fbG9hZERhdGFJbXBsKCl7dGhpcy5hY3RpdmUmJihudWxsIT09dGhpcy5fbG9hZERhdGFBc3luYyYmY2xlYXJUaW1lb3V0KHRoaXMuX2xvYWREYXRhQXN5bmMpLHRoaXMuX2xvYWREYXRhQXN5bmM9c2V0VGltZW91dCh0aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoKHQ9PntpZih0LmNhbmNlbGxlZClyZXR1cm47dGhpcy5kYXRhTG9hZGluZz0hMDtjb25zdCBlPXRoaXMuZGF0YVRvTG9hZC5maWx0ZXIoKHQ9Pntjb25zdCBlPXRoaXMuZ2V0RGF0YUxvYWROYW1lKHQpO3JldHVybiF0aGlzLl9kYXRhTG9hZFN0YXRlLmhhcyhlKX0pKTtmb3IoY29uc3QgdCBvZiBlKXtjb25zdCBlPXRoaXMuZ2V0RGF0YUxvYWROYW1lKHQpO3RoaXMuX2RhdGFMb2FkU3RhdGUuc2V0KGUsa1R0LkxPQURJTkcpfWNvbnN0IG49dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKCh0PT57aWYodC5jYW5jZWxsZWQpcmV0dXJuO2NvbnN0e2l0ZW06ZSxkYXRhOm59PXQudmFsdWUsaT10aGlzLmdldERhdGFMb2FkTmFtZShlKTt0aGlzLl9kYXRhTG9hZFN0YXRlLnNldChpLGtUdC5MT0FERUQpLHRoaXMubG9hZERhdGFDYWxsYmFjayh0aGlzLGUsbil9KSksaT10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoKHQ9PntpZighdC5jYW5jZWxsZWQpe2NvbnN0IHQ9bmV3IFNldChlLm1hcCgodD0+dGhpcy5nZXREYXRhTG9hZE5hbWUodCkpKSk7dGhpcy5kYXRhVG9Mb2FkLnNvbWUoKGU9PnQuaGFzKHRoaXMuZ2V0RGF0YUxvYWROYW1lKGUpKSkpJiZ0aGlzLm9uTG9hZEZpbmlzaCgpLHRoaXMuX2xvYWREYXRhQXN5bmM9bnVsbCx0aGlzLmRhdGFMb2FkZWRBdExlYXN0T25jZT0hMH1BcnJheS5mcm9tKHRoaXMuX2RhdGFMb2FkU3RhdGUudmFsdWVzKCkpLmluY2x1ZGVzKGtUdC5MT0FESU5HKXx8KHRoaXMuZGF0YUxvYWRpbmc9ITEpfSkpO3RoaXMucmVxdWVzdERhdGEoZSxuLCgoKT0+aSh2b2lkIDApKSl9KSkpKX19fSEoZnVuY3Rpb24odCl7dFt0LkxPQURJTkc9MF09IkxPQURJTkciLHRbdC5MT0FERUQ9MV09IkxPQURFRCJ9KShrVHR8fChrVHQ9e30pKSxlbCh7bW9kdWxlTmFtZToicGxvdHRhYmxlLXN0eWxlIixzdHlsZUNvbnRlbnQ6IlxuICAgIFxuLnBsb3R0YWJsZS1jb2xvcnMtMCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1Mjc5Yzc7IC8qIElORElHTyAqL1xufVxuXG4ucGxvdHRhYmxlLWNvbG9ycy0xIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZkMzczZTsgLyogQ09SQUxfUkVEICovXG59XG5cbi5wbG90dGFibGUtY29sb3JzLTIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjNjMjYxOyAvKiBGRVJOICovXG59XG5cbi5wbG90dGFibGUtY29sb3JzLTMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFkNDE5OyAvKiBCUklHSFRfU1VOICovXG59XG5cbi5wbG90dGFibGUtY29sb3JzLTQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMmMyYjZmOyAvKiBKQUNBUlRBICovXG59XG5cbi5wbG90dGFibGUtY29sb3JzLTUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY3OTM5OyAvKiBCVVJOSU5HX09SQU5HRSAqL1xufVxuXG4ucGxvdHRhYmxlLWNvbG9ycy02IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RiMmU2NTsgLyogQ0VSSVNFX1JFRCAqL1xufVxuXG4ucGxvdHRhYmxlLWNvbG9ycy03IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzk5Y2U1MDsgLyogQ09OSUZFUiAqL1xufVxuXG4ucGxvdHRhYmxlLWNvbG9ycy04IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzk2MjU2NTsgLyogUk9ZQUxfSEVBVEggKi9cbn1cblxuLnBsb3R0YWJsZS1jb2xvcnMtOSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwNmNjY2M7IC8qIFJPQklOU19FR0dfQkxVRSAqL1xufVxuXG4vKipcbiAqIFVzZXItc3VwcGxpZWQgcmVuZGVyVG8gZWxlbWVudC5cbiAqL1xuLnBsb3R0YWJsZSB7XG4gIGRpc3BsYXk6IGJsb2NrOyAvKiBtdXN0IGJlIGJsb2NrIGVsZW1lbnRzIGZvciB3aWR0aC9oZWlnaHQgY2FsY3VsYXRpb25zIHRvIHdvcmsgaW4gRmlyZWZveC4gKi9cbiAgcG9pbnRlci1ldmVudHM6IHZpc2libGVGaWxsO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIC8qKlxuICAgKiBQcmUgMy4wLCB1c2VycyBjb3VsZCBzZXQgdGhlIGRpbWVuc2lvbiBvZiB0aGUgcm9vdCBlbGVtZW50IGluIHR3byB3YXlzOiBlaXRoZXIgdXNpbmcgQ1NTXG4gICAqIChpbmxpbmUgb3IgdGhyb3VnaCBhIHN0eWxlc2hlZXQpLCBvciB1c2luZyB0aGUgU1ZHIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzLiBCeSBkZWZhdWx0LCB3ZVxuICAgKiBzZXQgdGhlIFNWRyB3aWR0aC9oZWlnaHQgYXR0cmlidXRlcyB0byAxMDAlLlxuICAgKlxuICAgKiBQb3N0IDMuMCB0aGUgcm9vdCBlbGVtZW50IGlzIGFsd2F5cyBhIG5vcm1hbCBkaXYgYW5kIHRoZSBvbmx5IHdheSB0byBzZXQgdGhlIGRpbWVuc2lvbnMgaXNcbiAgICogdG8gdXNlIENTUy4gVG8gcmVwbGljYXRlIHRoZSBcIjEwMCUtYnktZGVmYXVsdFwiIGJlaGF2aW9yLCB3ZSBhcHBseSB3aWR0aC9oZWlnaHQgMTAwJS5cbiAgICovXG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG59XG5cbi8qKlxuICogVGhlIF9lbGVtZW50IHRoYXQgcm9vdHMgZWFjaCBDb21wb25lbnQncyBET00uXG4gKi9cbi5wbG90dGFibGUgLmNvbXBvbmVudCB7XG4gIC8qIEFsbG93IGNvbXBvbmVudHMgdG8gYmUgcG9zaXRpb25lZCB3aXRoIGV4cGxpY2l0IGxlZnQvdG9wL3dpZHRoL2hlaWdodCBzdHlsZXMgKi9cbiAgcG9zaXRpb246IGFic29sdXRlO1xufVxuXG4ucGxvdHRhYmxlIC5iYWNrZ3JvdW5kLWNvbnRhaW5lcixcbi5wbG90dGFibGUgLmNvbnRlbnQsXG4ucGxvdHRhYmxlIC5mb3JlZ3JvdW5kLWNvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbn1cblxuLyoqXG4gKiBEb24ndCBhbGxvdyBzdmcgZWxlbWVudHMgYWJvdmUgdGhlIGNvbnRlbnQgdG8gc3RlYWwgZXZlbnRzXG4gKi9cbi5wbG90dGFibGUgLmZvcmVncm91bmQtY29udGFpbmVyIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy1oaWRkZW4ge1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ucGxvdHRhYmxlIC5jb21wb25lbnQtb3ZlcmZsb3ctdmlzaWJsZSB7XG4gIG92ZXJmbG93OiB2aXNpYmxlO1xufVxuXG4ucGxvdHRhYmxlIC5wbG90LWNhbnZhcy1jb250YWluZXIge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ucGxvdHRhYmxlIC5wbG90LWNhbnZhcyB7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIC8qKlxuICAgKiBQbGF5IHdlbGwgd2l0aCBkZWZlcnJlZCByZW5kZXJpbmcuXG4gICAqL1xuICB0cmFuc2Zvcm0tb3JpZ2luOiAwcHggMHB4IDBweDtcbn1cblxuLnBsb3R0YWJsZSB0ZXh0IHtcbiAgdGV4dC1yZW5kZXJpbmc6IGdlb21ldHJpY1ByZWNpc2lvbjtcbn1cblxuLnBsb3R0YWJsZSAubGFiZWwgdGV4dCB7XG4gIGZpbGw6ICMzMjMxM0Y7XG59XG5cbi5wbG90dGFibGUgLmJhci1sYWJlbC10ZXh0LWFyZWEgdGV4dCxcbi5wbG90dGFibGUgLnNjYXR0ZXItbGFiZWwtdGV4dC1hcmVhIHRleHQge1xuICBmb250LXNpemU6IDEycHg7XG59XG5cbi5wbG90dGFibGUgLmxhYmVsLWFyZWEgdGV4dCB7XG4gIGZpbGw6ICMzMjMxM0Y7XG4gIGZvbnQtc2l6ZTogMTRweDtcbn1cblxuLnBsb3R0YWJsZSAubGlnaHQtbGFiZWwgdGV4dCB7XG4gIGZpbGw6IHdoaXRlO1xufVxuXG4ucGxvdHRhYmxlIC5kYXJrLWxhYmVsIHRleHQge1xuICBmaWxsOiAjMzIzMTNGO1xufVxuXG4ucGxvdHRhYmxlIC5vZmYtYmFyLWxhYmVsIHRleHQge1xuICBmaWxsOiAjMzIzMTNGO1xufVxuXG4ucGxvdHRhYmxlIC5zdGFja2VkLWJhci1sYWJlbCB0ZXh0IHtcbiAgZmlsbDogIzMyMzEzRjtcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xufVxuXG4ucGxvdHRhYmxlIC5zdGFja2VkLWJhci1wbG90IC5vZmYtYmFyLWxhYmVsIHtcbiAgLyogSEFDS0hBQ0sgIzI3OTU6IGNvcnJlY3Qgb2ZmLWJhciBsYWJlbCBsb2dpYyB0byBiZSBpbXBsZW1lbnRlZCBvbiBTdGFja2VkQmFyICovXG4gIHZpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50O1xufVxuXG4ucGxvdHRhYmxlIC5heGlzLWxhYmVsIHRleHQge1xuICBmb250LXNpemU6IDEwcHg7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBsZXR0ZXItc3BhY2luZzogMXB4O1xuICBsaW5lLWhlaWdodDogbm9ybWFsO1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xufVxuXG4ucGxvdHRhYmxlIC50aXRsZS1sYWJlbCB0ZXh0IHtcbiAgZm9udC1zaXplOiAyMHB4O1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLnBsb3R0YWJsZSAuYXhpcyBsaW5lLmJhc2VsaW5lIHtcbiAgc3Ryb2tlOiAjQ0NDO1xuICBzdHJva2Utd2lkdGg6IDFweDtcbn1cblxuLnBsb3R0YWJsZSAuYXhpcyBsaW5lLnRpY2stbWFyayB7XG4gIHN0cm9rZTogI0NDQztcbiAgc3Ryb2tlLXdpZHRoOiAxcHg7XG59XG5cbi5wbG90dGFibGUgLmF4aXMgdGV4dCB7XG4gIGZpbGw6ICMzMjMxM0Y7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgZm9udC13ZWlnaHQ6IDIwMDtcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcbn1cblxuLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1jaXJjbGUge1xuICBmaWxsOiB3aGl0ZTtcbiAgc3Ryb2tlLXdpZHRoOiAxcHg7XG4gIHN0cm9rZTogI0NDQztcbn1cblxuLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1saW5lIHtcbiAgc3Ryb2tlOiAjQ0NDO1xuICBzdHJva2Utd2lkdGg6IDFweDtcbn1cblxuLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1yZWN0IHtcbiAgc3Ryb2tlOiAjQ0NDO1xuICBzdHJva2Utd2lkdGg6IDFweDtcbiAgZmlsbDogd2hpdGU7XG59XG5cbi5wbG90dGFibGUgLmJhci1wbG90IC5iYXNlbGluZSB7XG4gIHN0cm9rZTogIzk5OTtcbn1cblxuLnBsb3R0YWJsZSAuZ3JpZGxpbmVzIGxpbmUge1xuICBzdHJva2U6ICMzQzNDM0M7IC8qIGhhY2toYWNrOiBncmlkbGluZXMgc2hvdWxkIGJlIHNvbGlkOyBzZWUgIzgyMCAqL1xuICBvcGFjaXR5OiAwLjI1O1xuICBzdHJva2Utd2lkdGg6IDFweDtcbn1cblxuLnBsb3R0YWJsZSAuc2VsZWN0aW9uLWJveC1sYXllciAuc2VsZWN0aW9uLWFyZWEge1xuICBmaWxsOiBibGFjaztcbiAgZmlsbC1vcGFjaXR5OiAwLjAzO1xuICBzdHJva2U6ICNDQ0M7XG59XG4vKiBEcmFnQm94TGF5ZXIgKi9cbi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlIC5kcmFnLWVkZ2UtbHIge1xuICBjdXJzb3I6IGV3LXJlc2l6ZTtcbn1cbi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLnktcmVzaXphYmxlIC5kcmFnLWVkZ2UtdGIge1xuICBjdXJzb3I6IG5zLXJlc2l6ZTtcbn1cblxuLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLXRsIHtcbiAgY3Vyc29yOiBud3NlLXJlc2l6ZTtcbn1cbi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci10ciB7XG4gIGN1cnNvcjogbmVzdy1yZXNpemU7XG59XG4ucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItYmwge1xuICBjdXJzb3I6IG5lc3ctcmVzaXplO1xufVxuLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLWJyIHtcbiAgY3Vyc29yOiBud3NlLXJlc2l6ZTtcbn1cblxuLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIubW92YWJsZSAuc2VsZWN0aW9uLWFyZWEge1xuICBjdXJzb3I6IG1vdmU7IC8qIElFIGZhbGxiYWNrICovXG4gIGN1cnNvcjogLW1vei1ncmFiO1xuICBjdXJzb3I6IC13ZWJraXQtZ3JhYjtcbiAgY3Vyc29yOiBncmFiO1xufVxuXG4ucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci5tb3ZhYmxlIC5zZWxlY3Rpb24tYXJlYTphY3RpdmUge1xuICBjdXJzb3I6IC1tb3otZ3JhYmJpbmc7XG4gIGN1cnNvcjogLXdlYmtpdC1ncmFiYmluZztcbiAgY3Vyc29yOiBncmFiYmluZztcbn1cbi8qIC9EcmFnQm94TGF5ZXIgKi9cblxuLnBsb3R0YWJsZSAuZ3VpZGUtbGluZS1sYXllciBsaW5lLmd1aWRlLWxpbmUge1xuICBzdHJva2U6ICNDQ0M7XG4gIHN0cm9rZS13aWR0aDogMXB4O1xufVxuXG4ucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC52ZXJ0aWNhbCBsaW5lLmRyYWctZWRnZSB7XG4gIGN1cnNvcjogZXctcmVzaXplO1xufVxuXG4ucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC5ob3Jpem9udGFsIGxpbmUuZHJhZy1lZGdlIHtcbiAgY3Vyc29yOiBucy1yZXNpemU7XG59XG5cbi5wbG90dGFibGUgLmxlZ2VuZCB0ZXh0IHtcbiAgZmlsbDogIzMyMzEzRjtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcbn1cblxuLnBsb3R0YWJsZSAuaW50ZXJwb2xhdGVkLWNvbG9yLWxlZ2VuZCByZWN0LnN3YXRjaC1ib3VuZGluZy1ib3gge1xuICBmaWxsOiBub25lO1xuICBzdHJva2U6ICNDQ0M7XG4gIHN0cm9rZS13aWR0aDogMXB4O1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLnBsb3R0YWJsZSAud2F0ZXJmYWxsLXBsb3QgbGluZS5jb25uZWN0b3Ige1xuICBzdHJva2U6ICNDQ0M7XG4gIHN0cm9rZS13aWR0aDogMXB4O1xufVxuXG4ucGxvdHRhYmxlIC5waWUtcGxvdCAuYXJjLm91dGxpbmUge1xuICBzdHJva2UtbGluZWpvaW46IHJvdW5kO1xufVxuXG4ifSk7Y29uc3QgUFR0PVsxLDAsMCwxLDAsMF07Y2xhc3MgTlR0IGV4dGVuZHMgck8uVXRpbHMuVHJhbnNsYXRvcntjb21wdXRlUG9zaXRpb24odCxlKXtjb25zdCBuPXt4OnQseTplfSxpPShmdW5jdGlvbiByKHQpe2NvbnN0IGU9KGZ1bmN0aW9uIG4odCl7Y29uc3QgZT1bXTtmb3IoO3QmJnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDspaWYoZS5wdXNoKHQpLHQuYXNzaWduZWRTbG90KXQ9dC5hc3NpZ25lZFNsb3Q7ZWxzZSBpZih0LnBhcmVudEVsZW1lbnQpdD10LnBhcmVudEVsZW1lbnQ7ZWxzZXtjb25zdCBlPXQucGFyZW50Tm9kZTt0PWUgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50P2UuaG9zdDplIT09dD9lOm51bGx9cmV0dXJuIGV9KSh0KTtsZXQgaT1QVHQscj1udWxsO2Zvcihjb25zdCB0IG9mIGUpe2NvbnN0IGU9ck8uVXRpbHMuRE9NLmdldEVsZW1lbnRUcmFuc2Zvcm0odCk7aWYobnVsbCE9ZSl7Y29uc3Qgbj10LmNsaWVudFdpZHRoLzIscj10LmNsaWVudEhlaWdodC8yO2k9ck8uVXRpbHMuTWF0aC5tdWx0aXBseVRyYW5zbGF0ZShpLFtuLHJdKSxpPXJPLlV0aWxzLk1hdGgubXVsdGlwbHlNYXRyaXgoaSxyTy5VdGlscy5NYXRoLmludmVydE1hdHJpeChlKSksaT1yTy5VdGlscy5NYXRoLm11bHRpcGx5VHJhbnNsYXRlKGksWy1uLC1yXSl9bGV0IG49dC5zY3JvbGxMZWZ0LG89dC5zY3JvbGxUb3A7bnVsbCE9PXImJnQhPT1yfHwobi09dC5vZmZzZXRMZWZ0K3QuY2xpZW50TGVmdCxvLT10Lm9mZnNldFRvcCt0LmNsaWVudFRvcCxyPXQub2Zmc2V0UGFyZW50KSxpPXJPLlV0aWxzLk1hdGgubXVsdGlwbHlUcmFuc2xhdGUoaSxbbixvXSl9cmV0dXJuIGl9KSh0aGlzLl9yb290RWxlbWVudCk7cmV0dXJuIG51bGw9PWk/bjpyTy5VdGlscy5NYXRoLmFwcGx5VHJhbnNmb3JtKGksbil9fWNsYXNzIElUdCBleHRlbmRzIHJPLkRpc3BhdGNoZXJzLk1vdXNle2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuX2V2ZW50VGFyZ2V0PXQucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpLHRoaXMuX3RyYW5zbGF0b3I9bmV3IE5UdCh0LnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKSl9c3RhdGljIGdldERpc3BhdGNoZXIodCl7Y29uc3QgZT10LnJvb3QoKS5yb290RWxlbWVudCgpO2xldCBuPWVbSVR0Ll9ESVNQQVRDSEVSX0tFWV07cmV0dXJuIG58fChuPW5ldyBJVHQodCksZVtJVHQuX0RJU1BBVENIRVJfS0VZXT1uKSxufX1jbGFzcyBSVHQgZXh0ZW5kcyByTy5EaXNwYXRjaGVycy5Ub3VjaHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLl9ldmVudFRhcmdldD10LnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKSx0aGlzLl90cmFuc2xhdG9yPW5ldyBOVHQodC5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCkpfXN0YXRpYyBnZXREaXNwYXRjaGVyKHQpe2NvbnN0IGU9dC5yb290KCkucm9vdEVsZW1lbnQoKTtsZXQgbj1lW1JUdC5fRElTUEFUQ0hFUl9LRVldO3JldHVybiBufHwobj1uZXcgUlR0KHQpLGVbUlR0Ll9ESVNQQVRDSEVSX0tFWV09biksbn19ck8uSW50ZXJhY3Rpb24ucHJvdG90eXBlLl9pc0luc2lkZUNvbXBvbmVudD1mdW5jdGlvbih0KXtyZXR1cm4gMDw9dC54JiYwPD10LnkmJnQueDx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkmJnQueTx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLmhlaWdodCgpfTtjbGFzcyBPVHQgZXh0ZW5kcyByTy5JbnRlcmFjdGlvbnMuUG9pbnRlcntfYW5jaG9yKHQpe2NvbnN0IGU9dGhpcztlLl9pc0FuY2hvcmVkPSEwLGUuX21vdXNlRGlzcGF0Y2hlcj1JVHQuZ2V0RGlzcGF0Y2hlcihlLl9jb21wb25lbnRBdHRhY2hlZFRvKSxlLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZU1vdmUoZS5fbW91c2VNb3ZlQ2FsbGJhY2spLGUuX3RvdWNoRGlzcGF0Y2hlcj1SVHQuZ2V0RGlzcGF0Y2hlcihlLl9jb21wb25lbnRBdHRhY2hlZFRvKSxlLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KGUuX3RvdWNoU3RhcnRDYWxsYmFjayl9fXZhciB6VHQ7IShmdW5jdGlvbih0KXt0LkFVVE89ImF1dG8iLHQuQk9UVE9NPSJib3R0b20iLHQuUklHSFQ9InJpZ2h0In0pKHpUdHx8KHpUdD17fSkpO2NvbnN0IERUdD17Ym94U2hhZG93OiIwIDFweCA0cHggcmdiYSgwLCAwLCAwLCAuMykiLG9wYWNpdHk6MCxwb3NpdGlvbjoiZml4ZWQiLHdpbGxDaGFuZ2U6InRyYW5zZm9ybSIsekluZGV4OjV9O2xldCBCVHQ9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnBvc2l0aW9uPXpUdC5BVVRPLHRoaXMubWluRGlzdEZyb21FZGdlPTE1LHRoaXMuX3N0eWxlQ2FjaGU9bnVsbCx0aGlzLl9yYWY9bnVsbCx0aGlzLl90dW5uZWw9bnVsbH1yZWFkeSgpe3RoaXMuX3N0eWxlQ2FjaGU9bnVsbCx0aGlzLl9yYWY9bnVsbCx0aGlzLl90dW5uZWw9bnVsbH1hdHRhY2hlZCgpe3RoaXMuX3R1bm5lbD10aGlzLl9jcmVhdGVUdW5uZWwoKSx0aGlzLl9oaWRlT25CbHVyPSgpPT57ZG9jdW1lbnQuaGlkZGVuJiZ0aGlzLmhpZGUoKX0sd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHRoaXMuX2hpZGVPbkJsdXIpfWRldGFjaGVkKCl7dGhpcy5oaWRlKCksdGhpcy5fcmVtb3ZlVHVubmVsKHRoaXMuX3R1bm5lbCksdGhpcy5fdHVubmVsPW51bGwsd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHRoaXMuX2hpZGVPbkJsdXIpfWNvbnRlbnQoKXtyZXR1cm4gdGhpcy5fdHVubmVsLnNoYWRvd1Jvb3R9aGlkZSgpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yYWYpLHRoaXMuX3N0eWxlQ2FjaGU9bnVsbCx0aGlzLl90dW5uZWwuc3R5bGUub3BhY2l0eT0wfXVwZGF0ZUFuZFBvc2l0aW9uKHQpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yYWYpLHRoaXMuX3JhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+e3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5fcmVwb3NpdGlvbkltcGwodCl9KSl9X3JlcG9zaXRpb25JbXBsKHQpe2NvbnN0IGU9dGhpcy5fdHVubmVsLG49dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxpPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscj13aW5kb3cuaW5uZXJIZWlnaHQsbz1kb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLGE9bi50b3Ascz1hK24uaGVpZ2h0LGw9aS5oZWlnaHQrMjA7bGV0IGM9bnVsbCx1PU1hdGgubWF4KHRoaXMubWluRGlzdEZyb21FZGdlLG4ubGVmdCksaD1udWxsLGQ9YTt0aGlzLnBvc2l0aW9uPT16VHQuUklHSFQ/dT1uLnJpZ2h0OihkPXMrMjAsbzx1K2kud2lkdGgrdGhpcy5taW5EaXN0RnJvbUVkZ2UmJih1PW51bGwsaD10aGlzLm1pbkRpc3RGcm9tRWRnZSkpLHRoaXMucG9zaXRpb249PXpUdC5BVVRPJiZuLnRvcC1sPjAmJnI8bi50b3Arbi5oZWlnaHQrbCYmKGQ9bnVsbCxjPXItYSsyMCk7Y29uc3QgcD17Y29udGFpbjoiY29udGVudCIsb3BhY2l0eToxLGxlZnQ6dT9gJHt1fXB4YDpudWxsLHJpZ2h0Omg/YCR7aH1weGA6bnVsbCx0b3A6ZD9gJHtkfXB4YDpudWxsLGJvdHRvbTpjP2Ake2N9cHhgOm51bGx9O1NlLmV4cG9ydHMuaXNFcXVhbCh0aGlzLl9zdHlsZUNhY2hlLHApfHwoT2JqZWN0LmFzc2lnbihlLnN0eWxlLHApLHRoaXMuX3N0eWxlQ2FjaGU9cCl9X2NyZWF0ZVR1bm5lbCgpe2lmKCF0aGlzLmNvbnRlbnRDb21wb25lbnROYW1lKXRocm93IG5ldyBSYW5nZUVycm9yKCJSZXF1aXJlIGBjb250ZW50Q29tcG9uZW50TmFtZWAgdG8gYmUgYSBuYW1lIG9mIGEgUG9seW1lciBjb21wb25lbnQiKTtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5jb250ZW50Q29tcG9uZW50TmFtZSk7cmV0dXJuIE9iamVjdC5hc3NpZ24odC5zdHlsZSxEVHQpLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodCksdH1fcmVtb3ZlVHVubmVsKHQpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodCl9fTt0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxCVHQucHJvdG90eXBlLCJjb250ZW50Q29tcG9uZW50TmFtZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxCVHQucHJvdG90eXBlLCJwb3NpdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxCVHQucHJvdG90eXBlLCJtaW5EaXN0RnJvbUVkZ2UiLHZvaWQgMCksQlR0PXQoW2koInZ6LWNoYXJ0LXRvb2x0aXAiKV0sQlR0KTtjb25zdCBIVHQ9bXkoIi4yfmUiKSxGVHQ9bXkoIi40fnIiKSxWVHQ9bXkoIix+Iik7ZnVuY3Rpb24gVVR0KHQpe2lmKDA9PT10KXJldHVybiIwIjtjb25zdCBlPU1hdGguYWJzKHQpO3JldHVybiBlPj0xZTR8fGU8LjAwMT9IVHQodCk6RlR0KHQpfWNvbnN0IGpUdD17Zm9ybWF0VGljazpVVHQsZm9ybWF0U2hvcnQ6VVR0LGZvcm1hdFJlYWRhYmxlKHQpe2NvbnN0IGU9TWF0aC5hYnModCk7cmV0dXJuIGU+PTFlNHx8ZTwuMDAxP0hUdCh0KTpWVHQodCl9LGZvcm1hdExvbmc6VlR0fTtteSgiMC4zfnMiKSxteSgiLC4zfmYiKSxteSgiLjR+Iik7Y29uc3QgR1R0PWNBKCkudGlja0Zvcm1hdCgpO2xldCBXVHQ7Y29uc3QgcVR0PXtmb3JtYXRUaWNrOnQ9PkdUdChuZXcgRGF0ZSh0KSksZm9ybWF0U2hvcnQ6dD0+bmV3IERhdGUodCkudG9Mb2NhbGVTdHJpbmcoV1R0LHt5ZWFyOiJudW1lcmljIixtb250aDoic2hvcnQiLGRheToibnVtZXJpYyIsaG91cjoibnVtZXJpYyIsbWludXRlOiJudW1lcmljIixzZWNvbmQ6Im51bWVyaWMifSksZm9ybWF0UmVhZGFibGU6dD0+bmV3IERhdGUodCkudG9Mb2NhbGVTdHJpbmcoV1R0LHt5ZWFyOiJudW1lcmljIixtb250aDoic2hvcnQiLGRheToibnVtZXJpYyIsaG91cjoibnVtZXJpYyIsbWludXRlOiJudW1lcmljIixzZWNvbmQ6Im51bWVyaWMiLHRpbWVab25lTmFtZToic2hvcnQifSksZm9ybWF0TG9uZzp0PT5uZXcgRGF0ZSh0KS50b0xvY2FsZVN0cmluZyhXVHQse3llYXI6Im51bWVyaWMiLG1vbnRoOiJsb25nIixkYXk6Im51bWVyaWMiLGhvdXI6Im51bWVyaWMiLG1pbnV0ZToibnVtZXJpYyIsc2Vjb25kOiJudW1lcmljIix0aW1lWm9uZU5hbWU6InNob3J0IixmcmFjdGlvbmFsU2Vjb25kRGlnaXRzOjN9KX07dmFyIFlUdDshKGZ1bmN0aW9uKHQpe3RbdC5MSU5FQVI9MF09IkxJTkVBUiIsdFt0LkxPRzEwPTFdPSJMT0cxMCIsdFt0LlRJTUU9Ml09IlRJTUUifSkoWVR0fHwoWVR0PXt9KSk7Y2xhc3MgWFR0e2NvbnN0cnVjdG9yKCl7dGhpcy5kZWZhdWx0Rm9ybWF0dGVyPWpUdH10cmFuc2Zvcm0odCxlLG4pe2NvbnN0W2kscl09dCxvPXItaSxbYSxzXT1lO3JldHVybiAwPT09bz9hOihzLWEpL28qKG4taSkrYX1mb3J3YXJkKHQsZSxuKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0odCxlLG4pfXJldmVyc2UodCxlLG4pe3JldHVybiB0aGlzLnRyYW5zZm9ybShlLHQsbil9bmljZURvbWFpbih0KXtsZXRbZSxuXT10O2lmKG48ZSl0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgaW5wdXQ6IG1pbiBpcyBsYXJnZXIgdGhhbiBtYXgiKTtpZihuPT09ZSlyZXR1cm4gMD09PWU/Wy0xLDFdOmU8MD9bMiplLDBdOlswLDIqZV07Y29uc3QgaT1WTSgpLHI9LjA1KihuLWUrTnVtYmVyLkVQU0lMT04pLFtvLGFdPWkuZG9tYWluKFtlLXIsbityXSkubmljZSgpLmRvbWFpbigpO3JldHVybltvLGFdfXRpY2tzKHQsZSl7cmV0dXJuIFZNKCkuZG9tYWluKHQpLnRpY2tzKGUpfWlzU2FmZU51bWJlcih0KXtyZXR1cm4gTnVtYmVyLmlzRmluaXRlKHQpfX1jbGFzcyAkVHR7Y29uc3RydWN0b3IoKXt0aGlzLmRlZmF1bHRGb3JtYXR0ZXI9alR0fXRyYW5zZm9ybSh0KXtyZXR1cm4gTWF0aC5sb2cxMCh0PjA/dDpOdW1iZXIuTUlOX1ZBTFVFKX11bnRyYW5zZm9ybSh0KXtyZXR1cm4gTWF0aC5leHAodC9NYXRoLkxPRzEwRSl9Zm9yd2FyZCh0LGUsbil7aWYobjw9MClyZXR1cm4gZVswXTtjb25zdFtpLHJdPXQsW28sYV09ZSxzPXRoaXMudHJhbnNmb3JtKGkpLGw9dGhpcy50cmFuc2Zvcm0ociktcyxjPWEtbztyZXR1cm4gbj10aGlzLnRyYW5zZm9ybShuKSxjLyhsK051bWJlci5FUFNJTE9OKSoobi1zKStvfXJldmVyc2UodCxlLG4pe2NvbnN0W2kscl09dCxbbyxhXT1lLHM9dGhpcy50cmFuc2Zvcm0oaSksbD10aGlzLnRyYW5zZm9ybShyKTtyZXR1cm4gdGhpcy51bnRyYW5zZm9ybSgobC1zKS8oYS1vK051bWJlci5FUFNJTE9OKSoobi1vKStzKX1uaWNlRG9tYWluKHQpe2NvbnN0W2Usbl09dDtpZihlPm4pdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGlucHV0OiBtaW4gaXMgbGFyZ2VyIHRoYW4gbWF4Iik7Y29uc3QgaT1NYXRoLm1heChlLE51bWJlci5NSU5fVkFMVUUpLHI9TWF0aC5tYXgobixOdW1iZXIuTUlOX1ZBTFVFKTtyZXR1cm4gbjw9MD9bTnVtYmVyLk1JTl9WQUxVRSwxXTpbTWF0aC5tYXgoTnVtYmVyLk1JTl9WQUxVRSwuNSppKSwyKnJdfXRpY2tzKHQsZSl7Y29uc3Qgbj10WzBdPD0wP051bWJlci5NSU5fVkFMVUU6dFswXSxpPXRbMV08PTA/TnVtYmVyLk1JTl9WQUxVRTp0WzFdLHI9S00oKS5kb21haW4oW24saV0pLnRpY2tzKGUpO3JldHVybiByLmxlbmd0aD9yOnR9aXNTYWZlTnVtYmVyKHQpe3JldHVybiBOdW1iZXIuaXNGaW5pdGUodCkmJnQ+MH19Y2xhc3MgS1R0e2NvbnN0cnVjdG9yKCl7dGhpcy5zY2FsZT1jQSgpLHRoaXMuZGVmYXVsdEZvcm1hdHRlcj1xVHR9Zm9yd2FyZCh0LGUsbil7cmV0dXJuIHRoaXMuc2NhbGUuZG9tYWluKHQpLnJhbmdlKGUpKG4pfXJldmVyc2UodCxlLG4pe3JldHVybiB0aGlzLnNjYWxlLmRvbWFpbih0KS5yYW5nZShlKS5pbnZlcnQobikuZ2V0VGltZSgpfW5pY2VEb21haW4odCl7Y29uc3RbZSxuXT10aGlzLnNjYWxlLmRvbWFpbih0KS5uaWNlKCkuZG9tYWluKCk7cmV0dXJuW2UuZ2V0VGltZSgpLG4uZ2V0VGltZSgpXX10aWNrcyh0LGUpe3JldHVybiB0aGlzLnNjYWxlLmRvbWFpbih0KS50aWNrcyhlKS5tYXAoKHQ9PnQuZ2V0VGltZSgpKSl9aXNTYWZlTnVtYmVyKHQpe3JldHVybiBOdW1iZXIuaXNGaW5pdGUodCl9fWNsYXNzIFpUdCBleHRlbmRzIHJPLlNjYWxlcy5MaW5lYXJ7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX2lnbm9yZU91dGxpZXI9ITEsdGhpcy5wYWRQcm9wb3J0aW9uKC4yKX1zZXRWYWx1ZVByb3ZpZGVyRm9yRG9tYWluKHQpe3JldHVybiB0aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluPXQsdGhpc31fbmljZURvbWFpbih0LGUpe2NvbnN0W24saV09dDtyZXR1cm4oZnVuY3Rpb24gcih0KXtzd2l0Y2godCl7Y2FzZSBZVHQuTElORUFSOnJldHVybiBuZXcgWFR0O2Nhc2UgWVR0LkxPRzEwOnJldHVybiBuZXcgJFR0O2Nhc2UgWVR0LlRJTUU6cmV0dXJuIG5ldyBLVHQ7ZGVmYXVsdDp0aHJvdyBuZXcgUmFuZ2VFcnJvcihgU2NhbGVUeXBlICR7dH0gbm90IHN1cHBvcnRlZC5gKX19KShZVHQuTElORUFSKS5uaWNlRG9tYWluKFtuLGldKX1fZ2V0VW5ib3VuZGVkRXh0ZW50KHQpe2NvbnN0IGU9dGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXModCk7bGV0IG49dGhpcy5fZGVmYXVsdEV4dGVudCgpO2lmKDAhPT1lLmxlbmd0aCl7Y29uc3QgdD1bck8uVXRpbHMuTWF0aC5taW4oZSxuWzBdKSxyTy5VdGlscy5NYXRoLm1heChlLG5bMV0pXTtuPXRoaXMuX25pY2VEb21haW4odCl9cmV0dXJuIG59X2dldEFsbEluY2x1ZGVkVmFsdWVzKHQ9ITEpe2NvbnN0IGU9dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbj90aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluKCk6W107cmV0dXJuIHRoaXMuZXh0ZW50T2ZWYWx1ZXMoZSl9ZXh0ZW50T2ZWYWx1ZXModCl7Y29uc3QgZT10LmZpbHRlcigodD0+ck8uVXRpbHMuTWF0aC5pc1ZhbGlkTnVtYmVyKHQpKSk7bGV0IG49ZTtpZih0aGlzLmlnbm9yZU91dGxpZXIoKSl7Y29uc3QgdD1lLnNvcnQoKCh0LGUpPT50LWUpKSxpPUdsKHQsLjA1KSxyPUdsKHQsLjk1KTtuPWUuZmlsdGVyKCh0PT50Pj1pJiZ0PD1yKSl9Y29uc3QgaT1MbChuKTtyZXR1cm4gbnVsbD09aVswXXx8bnVsbD09aVsxXT9bXTppfWlnbm9yZU91dGxpZXIodCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdD8odGhpcy5faWdub3JlT3V0bGllcj10LHRoaXMpOnRoaXMuX2lnbm9yZU91dGxpZXJ9fWNsYXNzIEpUdCBleHRlbmRzIHJPLlF1YW50aXRhdGl2ZVNjYWxle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9pZ25vcmVPdXRsaWVyPSExfXNldFZhbHVlUHJvdmlkZXJGb3JEb21haW4odCl7cmV0dXJuIHRoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW49dCx0aGlzfWlnbm9yZU91dGxpZXIodCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdD8odGhpcy5faWdub3JlT3V0bGllcj10LHRoaXMpOnRoaXMuX2lnbm9yZU91dGxpZXJ9X2dldEFsbEluY2x1ZGVkVmFsdWVzKHQ9ITEpe2NvbnN0IGU9dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbj90aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluKCk6W107cmV0dXJuIHRoaXMuZXh0ZW50T2ZWYWx1ZXMoZSl9fWNvbnN0IFFUdD1NYXRoLnBvdygyLC0xMDc0KTtmdW5jdGlvbiB0Q3QodCl7cmV0dXJuIE1hdGgubG9nMTAodCl9ZnVuY3Rpb24gZUN0KHQpe3JldHVybiBNYXRoLnBvdygxMCx0KX1jbGFzcyBuQ3QgZXh0ZW5kcyBKVHR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX2QzTG9nU2NhbGU9S00oKSx0aGlzLnBhZFByb3BvcnRpb24oLjIpfXNjYWxlKHQpe3JldHVybiB0PD0wP05hTjp0aGlzLl9kM0xvZ1NjYWxlKHQpfWludmVydCh0KXtyZXR1cm4gdGhpcy5fZDNMb2dTY2FsZS5pbnZlcnQodCl9c2NhbGVUcmFuc2Zvcm1hdGlvbih0KXtyZXR1cm4gdGhpcy5zY2FsZSh0KX1pbnZlcnRlZFRyYW5zZm9ybWF0aW9uKHQpe3JldHVybiB0aGlzLmludmVydCh0KX1nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpe3JldHVybiB0aGlzLmRvbWFpbigpfXNldFRyYW5zZm9ybWF0aW9uRG9tYWluKHQpe3RoaXMuZG9tYWluKHQpfWdldFRyYW5zZm9ybWF0aW9uRXh0ZW50KCl7cmV0dXJuIHRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCl9X2dldERvbWFpbigpe3JldHVybiB0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWlufV9zZXREb21haW4odCl7dGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbj10O2NvbnN0W2Usbl09dDtzdXBlci5fc2V0RG9tYWluKFtNYXRoLm1heChRVHQsZSksbl0pfV9uaWNlRG9tYWluKHQsZSl7Y29uc3RbbixpXT10LHI9TWF0aC5tYXgodEN0KFFUdCksdEN0KG4pKSxvPXRDdChpKSxhPW8tcixzPWE/YSp0aGlzLnBhZFByb3BvcnRpb24oKToxO3JldHVybltlQ3QoTWF0aC5tYXgodEN0KFFUdCksci1zKSksZUN0KG8rcyldfV9nZXRVbmJvdW5kZWRFeHRlbnQodCl7Y29uc3QgZT10aGlzLl9nZXRBbGxJbmNsdWRlZFZhbHVlcyh0KTtsZXQgbj10aGlzLl9kZWZhdWx0RXh0ZW50KCk7aWYoMCE9PWUubGVuZ3RoKXtjb25zdCB0PVtyTy5VdGlscy5NYXRoLm1pbihlLG5bMF0pLHJPLlV0aWxzLk1hdGgubWF4KGUsblsxXSldO249dGhpcy5fbmljZURvbWFpbih0KX1yZXR1cm4gbn1fZ2V0QWxsSW5jbHVkZWRWYWx1ZXModD0hMSl7cmV0dXJuIHN1cGVyLl9nZXRBbGxJbmNsdWRlZFZhbHVlcygpLm1hcCgodD0+dD4wP3Q6UVR0KSl9X2RlZmF1bHRFeHRlbnQoKXtyZXR1cm5bMSwxMF19X2JhY2tpbmdTY2FsZURvbWFpbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9kM0xvZ1NjYWxlLmRvbWFpbigpOih0aGlzLl9kM0xvZ1NjYWxlLmRvbWFpbih0KSx0aGlzKX1fZ2V0UmFuZ2UoKXtyZXR1cm4gdGhpcy5fZDNMb2dTY2FsZS5yYW5nZSgpfV9zZXRSYW5nZSh0KXt0aGlzLl9kM0xvZ1NjYWxlLnJhbmdlKHQpfWRlZmF1bHRUaWNrcygpe3JldHVybiB0aGlzLl9kM0xvZ1NjYWxlLnRpY2tzKDEpfXRpY2tzKCl7cmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUudGlja3MoKX1leHRlbnRPZlZhbHVlcyh0KXtjb25zdCBlPXQuZmlsdGVyKCh0PT5yTy5VdGlscy5NYXRoLmlzVmFsaWROdW1iZXIodCkmJnQ+MCkpO2xldCBuPWU7aWYodGhpcy5pZ25vcmVPdXRsaWVyKCkpe2NvbnN0IHQ9ZS5tYXAodEN0KS5zb3J0KCgodCxlKT0+dC1lKSksaT1HbCh0LC4wNSkscj1HbCh0LC45NSk7bj10LmZpbHRlcigodD0+dD49aSYmdDw9cikpLm1hcChlQ3QpfWNvbnN0IGk9TGwobik7cmV0dXJuIG51bGw9PWlbMF18fG51bGw9PWlbMV0/W106aX19Y2xhc3MgaUN0IGV4dGVuZHMgck8uQ29tcG9uZW50cy5TZWxlY3Rpb25Cb3hMYXllcntjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIoKSx0aGlzLmVhc2VGbj1UZix0aGlzLl9hbmltYXRpb25UaW1lPTc1MCx0aGlzLnhTY2FsZSh0KSx0aGlzLnlTY2FsZShlKSx0aGlzLl9kcmFnSW50ZXJhY3Rpb249bmV3IHJPLkludGVyYWN0aW9ucy5EcmFnLHRoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb249bmV3IHJPLkludGVyYWN0aW9ucy5DbGljayx0aGlzLnNldHVwQ2FsbGJhY2tzKCksdGhpcy51bnpvb21NZXRob2Q9bix0aGlzLm9uRGV0YWNoKCgoKT0+e3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24uZGV0YWNoRnJvbSh0aGlzKSx0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoRnJvbSh0aGlzKX0pKSx0aGlzLm9uQW5jaG9yKCgoKT0+e3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24uYXR0YWNoVG8odGhpcyksdGhpcy5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKHRoaXMpfSkpfWludGVyYWN0aW9uU3RhcnQodCl7dGhpcy5vblN0YXJ0PXR9aW50ZXJhY3Rpb25FbmQodCl7dGhpcy5vbkVuZD10fWRyYWdJbnRlcmFjdGlvbigpe3JldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb259c2V0dXBDYWxsYmFja3MoKXtsZXQgdD0hMTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQoKHQ9Pnt0aGlzLmJvdW5kcyh7dG9wTGVmdDp0LGJvdHRvbVJpZ2h0OnR9KSx0aGlzLm9uU3RhcnQoKX0pKSx0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnKCgoZSxuKT0+e3RoaXMuYm91bmRzKHt0b3BMZWZ0OmUsYm90dG9tUmlnaHQ6bn0pLHRoaXMuYm94VmlzaWJsZSghMCksdD0hMH0pKSx0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnRW5kKCgoZSxuKT0+e3RoaXMuYm94VmlzaWJsZSghMSksdGhpcy5ib3VuZHMoe3RvcExlZnQ6ZSxib3R0b21SaWdodDpufSksdD90aGlzLnpvb20oKTp0aGlzLm9uRW5kKCksdD0hMX0pKSx0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uLm9uRG91YmxlQ2xpY2sodGhpcy51bnpvb20uYmluZCh0aGlzKSl9YW5pbWF0aW9uVGltZSh0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9hbmltYXRpb25UaW1lO2lmKHQ8MCl0aHJvdyBuZXcgRXJyb3IoImFuaW1hdGlvblRpbWUgY2Fubm90IGJlIG5lZ2F0aXZlIik7cmV0dXJuIHRoaXMuX2FuaW1hdGlvblRpbWU9dCx0aGlzfWVhc2UodCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJlYXNlIGZ1bmN0aW9uIG11c3QgYmUgYSBmdW5jdGlvbiIpO3JldHVybiAwPT09dCgwKSYmMT09PXQoMSl8fHJPLlV0aWxzLldpbmRvdy53YXJuKCJFYXNpbmcgZnVuY3Rpb24gZG9lcyBub3QgbWFpbnRhaW4gaW52YXJpYW50IGYoMCk9PTAgJiYgZigxKT09MS4gQmFkIGJlaGF2aW9yIG1heSByZXN1bHQuIiksdGhpcy5lYXNlRm49dCx0aGlzfXpvb20oKXtsZXQgdD10aGlzLnhFeHRlbnQoKVswXS52YWx1ZU9mKCksZT10aGlzLnhFeHRlbnQoKVsxXS52YWx1ZU9mKCksbj10aGlzLnlFeHRlbnQoKVsxXS52YWx1ZU9mKCksaT10aGlzLnlFeHRlbnQoKVswXS52YWx1ZU9mKCk7dCE9PWUmJm4hPT1pJiZ0aGlzLmludGVycG9sYXRlWm9vbSh0LGUsbixpKX11bnpvb20oKXtsZXQgdD10aGlzLnhTY2FsZSgpO3QuX2RvbWFpbk1pbj1udWxsLHQuX2RvbWFpbk1heD1udWxsO2xldCBlPXQuX2dldEV4dGVudCgpO3RoaXMueFNjYWxlKCkuZG9tYWluKGUpLHRoaXMudW56b29tTWV0aG9kKCl9aXNab29taW5nKHQpe3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5lbmFibGVkKCF0KSx0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uLmVuYWJsZWQoIXQpfWludGVycG9sYXRlWm9vbSh0LGUsbixpKXtsZXQgcj10aGlzLnhTY2FsZSgpLmRvbWFpbigpWzBdLnZhbHVlT2YoKSxvPXRoaXMueFNjYWxlKCkuZG9tYWluKClbMV0udmFsdWVPZigpLGE9dGhpcy55U2NhbGUoKS5kb21haW4oKVswXS52YWx1ZU9mKCkscz10aGlzLnlTY2FsZSgpLmRvbWFpbigpWzFdLnZhbHVlT2YoKSxsPXRoaXMuZWFzZUZuLGM9KHQsZSxuKT0+QmQodCxlKShsKG4pKTt0aGlzLmlzWm9vbWluZyghMCk7bGV0IHU9RGF0ZS5ub3coKSxoPSgpPT57bGV0IGw9RGF0ZS5ub3coKSxkPTA9PT10aGlzLl9hbmltYXRpb25UaW1lPzE6TWF0aC5taW4oMSwobC11KS90aGlzLl9hbmltYXRpb25UaW1lKSxwPWMocix0LGQpLGY9YyhvLGUsZCksbT1jKGEsbixkKSxnPWMocyxpLGQpO3RoaXMueFNjYWxlKCkuZG9tYWluKFtwLGZdKSx0aGlzLnlTY2FsZSgpLmRvbWFpbihbbSxnXSksZDwxP3JPLlV0aWxzLkRPTS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbChoKToodGhpcy5vbkVuZCgpLHRoaXMuaXNab29taW5nKCExKSl9O2goKX19dmFyIHJDdCxvQ3QsYUN0LHNDdDshKGZ1bmN0aW9uKHQpe3RbdC5OT05FPTBdPSJOT05FIix0W3QuRFJBR19aT09NSU5HPTFdPSJEUkFHX1pPT01JTkciLHRbdC5QQU5OSU5HPTJdPSJQQU5OSU5HIn0pKHJDdHx8KHJDdD17fSkpO2NsYXNzIGxDdCBleHRlbmRzIHJPLkNvbXBvbmVudHMuR3JvdXB7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKCksdGhpcy5zdGF0ZT1yQ3QuTk9ORSx0aGlzLnBhblN0YXJ0Q2FsbGJhY2s9bmV3IHJPLlV0aWxzLkNhbGxiYWNrU2V0LHRoaXMucGFuRW5kQ2FsbGJhY2s9bmV3IHJPLlV0aWxzLkNhbGxiYWNrU2V0LHRoaXMucGFuWm9vbT1uZXcgck8uSW50ZXJhY3Rpb25zLlBhblpvb20odCxlKSx0aGlzLnBhblpvb20uZHJhZ0ludGVyYWN0aW9uKCkubW91c2VGaWx0ZXIoKHQ9PmxDdC5pc1BhbktleSh0KSYmMD09PXQuYnV0dG9uKSksdGhpcy5wYW5ab29tLndoZWVsRmlsdGVyKHRoaXMuY2FuU2Nyb2xsWm9vbSksdGhpcy5kcmFnWm9vbUxheWVyPW5ldyBpQ3QodCxlLG4pLHRoaXMuZHJhZ1pvb21MYXllci5kcmFnSW50ZXJhY3Rpb24oKS5tb3VzZUZpbHRlcigodD0+IWxDdC5pc1BhbktleSh0KSYmMD09PXQuYnV0dG9uKSksdGhpcy5hcHBlbmQodGhpcy5kcmFnWm9vbUxheWVyKTtjb25zdCBpPXRoaXMub25XaGVlbC5iaW5kKHRoaXMpO3RoaXMub25BbmNob3IoKCgpPT57dGhpcy5fbW91c2VEaXNwYXRjaGVyPXJPLkRpc3BhdGNoZXJzLk1vdXNlLmdldERpc3BhdGNoZXIodGhpcyksdGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uV2hlZWwoaSksdGhpcy5wYW5ab29tLmF0dGFjaFRvKHRoaXMpfSkpLHRoaXMub25EZXRhY2goKCgpPT57dGhpcy5wYW5ab29tLmRldGFjaEZyb20odGhpcyksdGhpcy5fbW91c2VEaXNwYXRjaGVyJiYodGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZldoZWVsKGkpLHRoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsKX0pKSx0aGlzLnBhblpvb20uZHJhZ0ludGVyYWN0aW9uKCkub25EcmFnU3RhcnQoKCgpPT57dGhpcy5zdGF0ZT09ckN0Lk5PTkUmJnRoaXMuc2V0U3RhdGUockN0LlBBTk5JTkcpfSkpLHRoaXMucGFuWm9vbS5kcmFnSW50ZXJhY3Rpb24oKS5vbkRyYWdFbmQoKCgpPT57dGhpcy5zdGF0ZT09ckN0LlBBTk5JTkcmJnRoaXMuc2V0U3RhdGUockN0Lk5PTkUpfSkpLHRoaXMuZHJhZ1pvb21MYXllci5kcmFnSW50ZXJhY3Rpb24oKS5vbkRyYWdTdGFydCgoKCk9Pnt0aGlzLnN0YXRlPT1yQ3QuTk9ORSYmdGhpcy5zZXRTdGF0ZShyQ3QuRFJBR19aT09NSU5HKX0pKSx0aGlzLmRyYWdab29tTGF5ZXIuZHJhZ0ludGVyYWN0aW9uKCkub25EcmFnRW5kKCgoKT0+e3RoaXMuc3RhdGU9PXJDdC5EUkFHX1pPT01JTkcmJnRoaXMuc2V0U3RhdGUockN0Lk5PTkUpfSkpfW9uV2hlZWwodCxlKXtpZih0aGlzLmNhblNjcm9sbFpvb20oZSkpcmV0dXJuO2NvbnN0IG49dGhpcy5lbGVtZW50KCk7aWYoIW4uc2VsZWN0KCIuaGVscCIpLmVtcHR5KCkpcmV0dXJuO2NvbnN0IGk9bi5hcHBlbmQoImRpdiIpLmNsYXNzZWQoImhlbHAiLCEwKTtpLmFwcGVuZCgic3BhbiIpLnRleHQoIkFsdCArIFNjcm9sbCB0byBab29tIiksaS5vbigiYW5pbWF0aW9uZW5kIiwoKCk9PntpLnJlbW92ZSgpfSkpfXN0YXRpYyBpc1BhbktleSh0KXtyZXR1cm4gQm9vbGVhbih0LmFsdEtleSl8fEJvb2xlYW4odC5zaGlmdEtleSl9Y2FuU2Nyb2xsWm9vbSh0KXtyZXR1cm4gdC5hbHRLZXl9c2V0U3RhdGUodCl7aWYodGhpcy5zdGF0ZT09dClyZXR1cm47Y29uc3QgZT10aGlzLnN0YXRlO3RoaXMuc3RhdGU9dCx0aGlzLnJvb3QoKS5yZW1vdmVDbGFzcyh0aGlzLnN0YXRlQ2xhc3NOYW1lKGUpKSx0aGlzLnJvb3QoKS5hZGRDbGFzcyh0aGlzLnN0YXRlQ2xhc3NOYW1lKHQpKSxlPT1yQ3QuUEFOTklORyYmdGhpcy5wYW5FbmRDYWxsYmFjay5jYWxsQ2FsbGJhY2tzKCksdD09ckN0LlBBTk5JTkcmJnRoaXMucGFuU3RhcnRDYWxsYmFjay5jYWxsQ2FsbGJhY2tzKCl9c3RhdGVDbGFzc05hbWUodCl7c3dpdGNoKHQpe2Nhc2UgckN0LlBBTk5JTkc6cmV0dXJuInBhbm5pbmciO2Nhc2UgckN0LkRSQUdfWk9PTUlORzpyZXR1cm4iZHJhZy16b29taW5nIjtjYXNlIHJDdC5OT05FOmRlZmF1bHQ6cmV0dXJuIiJ9fW9uUGFuU3RhcnQodCl7dGhpcy5wYW5TdGFydENhbGxiYWNrLmFkZCh0KX1vblBhbkVuZCh0KXt0aGlzLnBhbkVuZENhbGxiYWNrLmFkZCh0KX1vblNjcm9sbFpvb20odCl7dGhpcy5wYW5ab29tLm9uWm9vbUVuZCh0KX1vbkRyYWdab29tU3RhcnQodCl7dGhpcy5kcmFnWm9vbUxheWVyLmludGVyYWN0aW9uU3RhcnQodCl9b25EcmFnWm9vbUVuZCh0KXt0aGlzLmRyYWdab29tTGF5ZXIuaW50ZXJhY3Rpb25FbmQodCl9fSEoZnVuY3Rpb24odCl7dFt0LlRFWFQ9MF09IlRFWFQiLHRbdC5ET009MV09IkRPTSJ9KShvQ3R8fChvQ3Q9e30pKSwoZnVuY3Rpb24odCl7dC5MT0c9ImxvZyIsdC5MSU5FQVI9ImxpbmVhciJ9KShhQ3R8fChhQ3Q9e30pKTtjbGFzcyBjQ3R7Y29uc3RydWN0b3IodCxlLG4saSxyLG8sYSxzLGwsYyx1KXt0aGlzLmRpcnR5RGF0YXNldHM9bmV3IFNldCx0aGlzLnNlcmllc05hbWVzPVtdLHRoaXMubmFtZTJkYXRhc2V0cz17fSx0aGlzLmNvbG9yU2NhbGU9aSx0aGlzLnRvb2x0aXA9cix0aGlzLmRhdGFzZXRzPVtdLHRoaXMuX2lnbm9yZVlPdXRsaWVycz0hMSx0aGlzLmxhc3RQb2ludHNEYXRhc2V0PW5ldyByTy5EYXRhc2V0LHRoaXMubmFuRGF0YXNldD1uZXcgck8uRGF0YXNldCx0aGlzLnlWYWx1ZUFjY2Vzc29yPWUsdGhpcy5zeW1ib2xGdW5jdGlvbj1jLHRoaXMuX2RlZmF1bHRYUmFuZ2U9cyx0aGlzLl9kZWZhdWx0WVJhbmdlPWwsdGhpcy50b29sdGlwQ29sdW1ucz1vLHRoaXMuYnVpbGRDaGFydCh0LGUsbixhLHUpfWJ1aWxkQ2hhcnQodCxlLG4saSxyKXt0aGlzLmRlc3Ryb3koKTtjb25zdCBvPXQoKTt0aGlzLnhBY2Nlc3Nvcj1vLmFjY2Vzc29yLHRoaXMueFNjYWxlPW8uc2NhbGUsdGhpcy54QXhpcz1vLmF4aXMsdGhpcy54QXhpcy5tYXJnaW4oMSkudGlja0xhYmVsUGFkZGluZygzKSxyJiZ0aGlzLnhBeGlzLmZvcm1hdHRlcihyKSx0aGlzLnlTY2FsZT1jQ3QuZ2V0WVNjYWxlRnJvbVR5cGUobiksdGhpcy55U2NhbGUuc2V0VmFsdWVQcm92aWRlckZvckRvbWFpbigoKCk9PnRoaXMuZ2V0VmFsdWVzRm9yWUF4aXNEb21haW5Db21wdXRlKCkpKSx0aGlzLnlBeGlzPW5ldyByTy5BeGVzLk51bWVyaWModGhpcy55U2NhbGUsImxlZnQiKTtsZXQgYT13VHQoMyk7dGhpcy55QXhpcy5tYXJnaW4oMCkudGlja0xhYmVsUGFkZGluZyg1KS5mb3JtYXR0ZXIoYSksdGhpcy55QXhpcy51c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbighMCksdGhpcy5maWxsQXJlYT1pO2NvbnN0IHM9bmV3IGxDdCh0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSwoKCk9PnRoaXMucmVzZXREb21haW4oKSkpO3RoaXMudG9vbHRpcEludGVyYWN0aW9uPXRoaXMuY3JlYXRlVG9vbHRpcEludGVyYWN0aW9uKHMpLHRoaXMudG9vbHRpcFBvaW50c0NvbXBvbmVudD1uZXcgck8uQ29tcG9uZW50O2NvbnN0IGw9dGhpcy5idWlsZFBsb3QodGhpcy54U2NhbGUsdGhpcy55U2NhbGUsaSk7dGhpcy5ncmlkbGluZXM9bmV3IHJPLkNvbXBvbmVudHMuR3JpZGxpbmVzKHRoaXMueFNjYWxlLHRoaXMueVNjYWxlKTtsZXQgYz1udWxsO24hPT1hQ3QuTE9HJiYoYz1uZXcgck8uQ29tcG9uZW50cy5HdWlkZUxpbmVMYXllcigiaG9yaXpvbnRhbCIpLGMuc2NhbGUodGhpcy55U2NhbGUpLnZhbHVlKDApKTtsZXQgdT1uZXcgck8uQ29tcG9uZW50cy5HdWlkZUxpbmVMYXllcigidmVydGljYWwiKTt1LnNjYWxlKHRoaXMueFNjYWxlKS52YWx1ZSgwKSx0aGlzLmNlbnRlcj1uZXcgck8uQ29tcG9uZW50cy5Hcm91cChbdGhpcy5ncmlkbGluZXMsYyx1LGwsdGhpcy50b29sdGlwUG9pbnRzQ29tcG9uZW50LHNdKSx0aGlzLmNlbnRlci5hZGRDbGFzcygibWFpbiIpLHRoaXMub3V0ZXI9bmV3IHJPLkNvbXBvbmVudHMuVGFibGUoW1t0aGlzLnlBeGlzLHRoaXMuY2VudGVyXSxbbnVsbCx0aGlzLnhBeGlzXV0pfWJ1aWxkUGxvdCh0LGUsbil7biYmKHRoaXMubWFyZ2luQXJlYVBsb3Q9bmV3IHJPLlBsb3RzLkFyZWEsdGhpcy5tYXJnaW5BcmVhUGxvdC54KHRoaXMueEFjY2Vzc29yLHQpLHRoaXMubWFyZ2luQXJlYVBsb3QueShuLmhpZ2hlckFjY2Vzc29yLGUpLHRoaXMubWFyZ2luQXJlYVBsb3QueTAobi5sb3dlckFjY2Vzc29yKSx0aGlzLm1hcmdpbkFyZWFQbG90LmF0dHIoImZpbGwiLCgodCxlLG4pPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUobi5tZXRhZGF0YSgpLm5hbWUpKSksdGhpcy5tYXJnaW5BcmVhUGxvdC5hdHRyKCJmaWxsLW9wYWNpdHkiLC4zKSx0aGlzLm1hcmdpbkFyZWFQbG90LmF0dHIoInN0cm9rZS13aWR0aCIsMCkpLHRoaXMuc21vb3RoZWRBY2Nlc3Nvcj10PT50LnNtb290aGVkO2xldCBpPW5ldyByTy5QbG90cy5MaW5lO2kueCh0aGlzLnhBY2Nlc3Nvcix0KSxpLnkodGhpcy55VmFsdWVBY2Nlc3NvcixlKSxpLmF0dHIoInN0cm9rZSIsKCh0LGUsbik9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShuLm1ldGFkYXRhKCkubmFtZSkpKSx0aGlzLmxpbmVQbG90PWksdGhpcy5zZXR1cFRvb2x0aXBzKGkpO2xldCByPW5ldyByTy5QbG90cy5MaW5lO2lmKHIueCh0aGlzLnhBY2Nlc3Nvcix0KSxyLnkodGhpcy5zbW9vdGhlZEFjY2Vzc29yLGUpLHIuYXR0cigic3Ryb2tlIiwoKHQsZSxuKT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKG4ubWV0YWRhdGEoKS5uYW1lKSkpLHRoaXMuc21vb3RoTGluZVBsb3Q9cix0aGlzLnN5bWJvbEZ1bmN0aW9uKXtjb25zdCBuPW5ldyByTy5QbG90cy5TY2F0dGVyO24ueCh0aGlzLnhBY2Nlc3Nvcix0KSxuLnkodGhpcy55VmFsdWVBY2Nlc3NvcixlKSxuLmF0dHIoImZpbGwiLCgodCxlLG4pPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUobi5tZXRhZGF0YSgpLm5hbWUpKSksbi5hdHRyKCJvcGFjaXR5IiwxKSxuLnNpemUoOCksbi5zeW1ib2woKCh0LGUsbik9PnRoaXMuc3ltYm9sRnVuY3Rpb24obi5tZXRhZGF0YSgpLm5hbWUpKSksdGhpcy5tYXJrZXJzU2NhdHRlclBsb3Q9bn1sZXQgbz1uZXcgck8uUGxvdHMuU2NhdHRlcjtvLngodGhpcy54QWNjZXNzb3IsdCksby55KHRoaXMueVZhbHVlQWNjZXNzb3IsZSksby5hdHRyKCJmaWxsIiwodD0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHQubmFtZSkpKSxvLmF0dHIoIm9wYWNpdHkiLDEpLG8uc2l6ZSg4KSxvLmRhdGFzZXRzKFt0aGlzLmxhc3RQb2ludHNEYXRhc2V0XSksdGhpcy5zY2F0dGVyUGxvdD1vO2xldCBhPW5ldyByTy5QbG90cy5TY2F0dGVyO2EueCh0aGlzLnhBY2Nlc3Nvcix0KSxhLnkoKHQ9PnQuZGlzcGxheVkpLGUpLGEuYXR0cigiZmlsbCIsKHQ9PnRoaXMuY29sb3JTY2FsZS5zY2FsZSh0Lm5hbWUpKSksYS5hdHRyKCJvcGFjaXR5IiwxKSxhLnNpemUoMTIpLGEuZGF0YXNldHMoW3RoaXMubmFuRGF0YXNldF0pLGEuc3ltYm9sKHJPLlN5bWJvbEZhY3Rvcmllcy50cmlhbmdsZSksdGhpcy5uYW5EaXNwbGF5PWE7Y29uc3Qgcz1bYSxvLHIsaV07cmV0dXJuIHRoaXMubWFyZ2luQXJlYVBsb3QmJnMucHVzaCh0aGlzLm1hcmdpbkFyZWFQbG90KSx0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdCYmcy5wdXNoKHRoaXMubWFya2Vyc1NjYXR0ZXJQbG90KSxuZXcgck8uQ29tcG9uZW50cy5Hcm91cChzKX1pZ25vcmVZT3V0bGllcnModCl7dCE9PXRoaXMuX2lnbm9yZVlPdXRsaWVycyYmKHRoaXMuX2lnbm9yZVlPdXRsaWVycz10LHRoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCksdGhpcy55U2NhbGUuaWdub3JlT3V0bGllcih0KSx0aGlzLnJlc2V0WURvbWFpbigpKX1nZXRWYWx1ZXNGb3JZQXhpc0RvbWFpbkNvbXB1dGUoKXtjb25zdCB0PXRoaXMuZ2V0QWNjZXNzb3JzRm9yQ29tcHV0aW5nWVJhbmdlKCk7cmV0dXJuIFNlLmV4cG9ydHMuZmxhdHRlbkRlZXAodGhpcy5kYXRhc2V0cy5tYXAoKGU9PnQubWFwKCh0PT5lLmRhdGEoKS5tYXAoKG49PnQobiwtMSxlKSkpKSkpKSkuZmlsdGVyKGlzRmluaXRlKX11cGRhdGVTcGVjaWFsRGF0YXNldHMoKXtjb25zdCB0PXRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpO2xldCBlPXRoaXMuZGF0YXNldHMubWFwKChlPT57bGV0IG49bnVsbCxpPWUuZGF0YSgpLmZpbHRlcigobj0+IWlzTmFOKHQobiwtMSxlKSkpKTtyZXR1cm4gaS5sZW5ndGg+MCYmKG49aVtpLmxlbmd0aC0xXSxuLm5hbWU9ZS5tZXRhZGF0YSgpLm5hbWUsbi5yZWxhdGl2ZT1UVHQobiwwLGUpKSxufSkpLmZpbHRlcigodD0+bnVsbCE9dCkpO3RoaXMubGFzdFBvaW50c0RhdGFzZXQuZGF0YShlKSx0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdCYmdGhpcy5tYXJrZXJzU2NhdHRlclBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cy5tYXAodGhpcy5jcmVhdGVTYW1wbGVkRGF0YXNldEZvck1hcmtlcnMpKTtsZXQgbj1TZS5leHBvcnRzLmZsYXR0ZW4odGhpcy5kYXRhc2V0cy5tYXAoKGU9PntsZXQgbj1udWxsLGk9ZS5kYXRhKCkscj0wO2Zvcig7cjxpLmxlbmd0aCYmbnVsbD09bjspaXNOYU4odChpW3JdLC0xLGUpKXx8KG49dChpW3JdLC0xLGUpKSxyKys7bnVsbD09biYmKG49MCk7bGV0IG89W107Zm9yKHI9MDtyPGkubGVuZ3RoO3IrKylpc05hTih0KGlbcl0sLTEsZSkpPyhpW3JdLm5hbWU9ZS5tZXRhZGF0YSgpLm5hbWUsaVtyXS5kaXNwbGF5WT1uLGlbcl0ucmVsYXRpdmU9VFR0KGlbcl0sMCxlKSxvLnB1c2goaVtyXSkpOm49dChpW3JdLC0xLGUpO3JldHVybiBvfSkpKTt0aGlzLm5hbkRhdGFzZXQuZGF0YShuKX1yZXNldERvbWFpbigpe3RoaXMucmVzZXRYRG9tYWluKCksdGhpcy5yZXNldFlEb21haW4oKX1yZXNldFhEb21haW4oKXtsZXQgdDtpZihudWxsIT10aGlzLl9kZWZhdWx0WFJhbmdlKXQ9dGhpcy5fZGVmYXVsdFhSYW5nZTtlbHNle2NvbnN0IGU9dGhpcy54U2NhbGU7ZS5fZG9tYWluTWluPW51bGwsZS5fZG9tYWluTWF4PW51bGwsdD1lLl9nZXRFeHRlbnQoKX10aGlzLnhTY2FsZS5kb21haW4odCl9cmVzZXRZRG9tYWluKCl7bnVsbCE9dGhpcy5fZGVmYXVsdFlSYW5nZT90aGlzLnlTY2FsZS5kb21haW4odGhpcy5fZGVmYXVsdFlSYW5nZSk6KHRoaXMueVNjYWxlLmF1dG9Eb21haW4oKSx0aGlzLnlTY2FsZS5kb21haW4odGhpcy55U2NhbGUuZG9tYWluKCkpKX1nZXRBY2Nlc3NvcnNGb3JDb21wdXRpbmdZUmFuZ2UoKXtjb25zdCB0PVt0aGlzLmdldFlBeGlzQWNjZXNzb3IoKV07cmV0dXJuIHRoaXMuZmlsbEFyZWEmJnQucHVzaCh0aGlzLmZpbGxBcmVhLmxvd2VyQWNjZXNzb3IsdGhpcy5maWxsQXJlYS5oaWdoZXJBY2Nlc3NvciksdH1nZXRZQXhpc0FjY2Vzc29yKCl7cmV0dXJuIHRoaXMuc21vb3RoaW5nRW5hYmxlZD90aGlzLnNtb290aGVkQWNjZXNzb3I6dGhpcy55VmFsdWVBY2Nlc3Nvcn1jcmVhdGVUb29sdGlwSW50ZXJhY3Rpb24odCl7Y29uc3QgZT1uZXcgT1R0LG49KCk9PntlLmVuYWJsZWQoITEpLHRoaXMuaGlkZVRvb2x0aXBzKCl9LGk9KCk9PmUuZW5hYmxlZCghMCk7cmV0dXJuIHQub25QYW5TdGFydChuKSx0Lm9uRHJhZ1pvb21TdGFydChuKSx0Lm9uUGFuRW5kKGkpLHQub25EcmFnWm9vbUVuZChpKSx0Lm9uU2Nyb2xsWm9vbSgoKCk9PnRoaXMudXBkYXRlVG9vbHRpcENvbnRlbnQodGhpcy5fbGFzdE1vdXNlUG9zaXRpb24pKSksZS5vblBvaW50ZXJNb3ZlKCh0PT57dGhpcy5fbGFzdE1vdXNlUG9zaXRpb249dCx0aGlzLnVwZGF0ZVRvb2x0aXBDb250ZW50KHQpfSkpLGUub25Qb2ludGVyRXhpdCgoKCk9PnRoaXMuaGlkZVRvb2x0aXBzKCkpKSxlfXVwZGF0ZVRvb2x0aXBDb250ZW50KHQpe3RoaXMubGluZVBsb3QmJih3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdG9vbHRpcFVwZGF0ZUFuaW1hdGlvbkZyYW1lKSx0aGlzLl90b29sdGlwVXBkYXRlQW5pbWF0aW9uRnJhbWU9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKCk9PntsZXQgZT17eDp0LngseTp0LnksZGF0dW06bnVsbCxkYXRhc2V0Om51bGx9LG49dGhpcy5ncmlkbGluZXMuY29udGVudCgpLm5vZGUoKS5nZXRCQm94KCksaT10aGlzLmxpbmVQbG90LmRhdGFzZXRzKCkubWFwKCh0PT50aGlzLmZpbmRDbG9zZXN0UG9pbnQoZSx0KSkpLmZpbHRlcihCb29sZWFuKSxyPXJPLlV0aWxzLkRPTS5pbnRlcnNlY3RzQkJveCxvPWkuZmlsdGVyKCh0PT5yKHQueCx0Lnksbil8fGlzTmFOKHRoaXMueVZhbHVlQWNjZXNzb3IodC5kYXR1bSwwLHQuZGF0YXNldCkpKSksYT1vLmZpbHRlcigodD0+IWlzTmFOKHRoaXMueVZhbHVlQWNjZXNzb3IodC5kYXR1bSwwLHQuZGF0YXNldCkpKSk7aWYoMCE9PWkubGVuZ3RoKXt0aGlzLnNjYXR0ZXJQbG90LmF0dHIoImRpc3BsYXkiLCJub25lIik7Y29uc3QgdD10aGlzLnRvb2x0aXBQb2ludHNDb21wb25lbnQuY29udGVudCgpLnNlbGVjdEFsbCgiLnBvaW50IikuZGF0YShhLCh0PT50LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSk7dC5lbnRlcigpLmFwcGVuZCgiY2lyY2xlIikuY2xhc3NlZCgicG9pbnQiLCEwKSx0LmF0dHIoInIiLDQpLmF0dHIoImN4IiwodD0+dC54KSkuYXR0cigiY3kiLCh0PT50LnkpKS5zdHlsZSgic3Ryb2tlIiwibm9uZSIpLmF0dHIoImZpbGwiLCh0PT50aGlzLmNvbG9yU2NhbGUuc2NhbGUodC5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSkpKSx0LmV4aXQoKS5yZW1vdmUoKSx0aGlzLmRyYXdUb29sdGlwcyhvLGUsdGhpcy50b29sdGlwQ29sdW1ucyl9ZWxzZSB0aGlzLmhpZGVUb29sdGlwcygpfSkpKX1oaWRlVG9vbHRpcHMoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdG9vbHRpcFVwZGF0ZUFuaW1hdGlvbkZyYW1lKSx0aGlzLnRvb2x0aXAuaGlkZSgpLHRoaXMuc2NhdHRlclBsb3QuYXR0cigiZGlzcGxheSIsImJsb2NrIiksdGhpcy50b29sdGlwUG9pbnRzQ29tcG9uZW50LmNvbnRlbnQoKS5zZWxlY3RBbGwoIi5wb2ludCIpLnJlbW92ZSgpfXNldHVwVG9vbHRpcHModCl7dC5vbkRldGFjaCgoKCk9Pnt0aGlzLnRvb2x0aXBJbnRlcmFjdGlvbi5kZXRhY2hGcm9tKHQpLHRoaXMudG9vbHRpcEludGVyYWN0aW9uLmVuYWJsZWQoITEpfSkpLHQub25BbmNob3IoKCgpPT57dGhpcy50b29sdGlwSW50ZXJhY3Rpb24uYXR0YWNoVG8odCksdGhpcy50b29sdGlwSW50ZXJhY3Rpb24uZW5hYmxlZCghMCl9KSl9ZHJhd1Rvb2x0aXBzKHQsZSxuKXtpZighdC5sZW5ndGgpcmV0dXJuIHZvaWQgdGhpcy50b29sdGlwLmhpZGUoKTtjb25zdHtjb2xvclNjYWxlOml9PXRoaXM7bj1be3RpdGxlOiIiLHN0YXRpYzohMSxldmFsVHlwZTpvQ3QuRE9NLGV2YWx1YXRlKHQpe3JldHVybiBTdSh0aGlzKS5zZWxlY3QoInNwYW4iKS5zdHlsZSgiYmFja2dyb3VuZC1jb2xvciIsKCgpPT5pLnNjYWxlKHQuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUpKSksIiJ9LGVudGVyKHQpe1N1KHRoaXMpLmFwcGVuZCgic3BhbiIpLmNsYXNzZWQoInN3YXRjaCIsITApLnN0eWxlKCJiYWNrZ3JvdW5kLWNvbG9yIiwoKCk9Pmkuc2NhbGUodC5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSkpKX19LC4uLm5dO2NvbnN0IHI9dD0+TWF0aC5wb3codC54LWUueCwyKStNYXRoLnBvdyh0LnktZS55LDIpLG89U2UuZXhwb3J0cy5taW4odC5tYXAocikpLGE9dGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuc21vb3RoZWRBY2Nlc3Nvcjp0aGlzLnlWYWx1ZUFjY2Vzc29yO3Q9ImFzY2VuZGluZyI9PT10aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kP1NlLmV4cG9ydHMuc29ydEJ5KHQsKHQ9PmEodC5kYXR1bSwtMSx0LmRhdGFzZXQpKSk6ImRlc2NlbmRpbmciPT09dGhpcy50b29sdGlwU29ydGluZ01ldGhvZD9TZS5leHBvcnRzLnNvcnRCeSh0LCh0PT5hKHQuZGF0dW0sLTEsdC5kYXRhc2V0KSkpLnJldmVyc2UoKToibmVhcmVzdCI9PT10aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kP1NlLmV4cG9ydHMuc29ydEJ5KHQscik6dC5zbGljZSgwKS5yZXZlcnNlKCk7Y29uc3Qgcz10aGlzLGw9U3UodGhpcy50b29sdGlwLmNvbnRlbnQoKSkuc2VsZWN0KCJ0YWJsZSIpLGM9bC5zZWxlY3QoInRoZWFkIikuc2VsZWN0QWxsKCJ0aCIpLmRhdGEobiwoKHQsZSxuKT0+dC50aXRsZSkpO2MuZW50ZXIoKS5hcHBlbmQoInRoIikudGV4dCgodD0+dC50aXRsZSkpLm5vZGVzKCksYy5leGl0KCkucmVtb3ZlKCk7Y29uc3QgdT1sLnNlbGVjdCgidGJvZHkiKS5zZWxlY3RBbGwoInRyIikuZGF0YSh0LCgodCxlLG4pPT50LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSk7dS5jbGFzc2VkKCJkaXN0YW50IiwodD0+e2xldCBuPXQuZGF0YXNldC5kYXRhKClbMF0saT1TZS5leHBvcnRzLmxhc3QodC5kYXRhc2V0LmRhdGEoKSkscj10aGlzLnhTY2FsZS5zY2FsZSh0aGlzLnhBY2Nlc3NvcihuLDAsdC5kYXRhc2V0KSksbz10aGlzLnhTY2FsZS5zY2FsZSh0aGlzLnhBY2Nlc3NvcihpLDAsdC5kYXRhc2V0KSksYT10aGlzLnNtb290aGluZ0VuYWJsZWQ/dC5kYXR1bS5zbW9vdGhlZDp0aGlzLnlWYWx1ZUFjY2Vzc29yKHQuZGF0dW0sMCx0LmRhdGFzZXQpO3JldHVybiBlLng8cnx8ZS54Pm98fGlzTmFOKGEpfSkpLmNsYXNzZWQoImNsb3Nlc3QiLCh0PT5yKHQpPT09bykpLmVhY2goKGZ1bmN0aW9uKHQpe3MuZHJhd1Rvb2x0aXBSb3codGhpcyxuLHQpfSkpLm9yZGVyKCksdS5leGl0KCkucmVtb3ZlKCksdS5lbnRlcigpLmFwcGVuZCgidHIiKS5lYWNoKChmdW5jdGlvbih0KXtzLmRyYXdUb29sdGlwUm93KHRoaXMsbix0KX0pKS5ub2RlcygpLHRoaXMudG9vbHRpcC51cGRhdGVBbmRQb3NpdGlvbih0aGlzLnRhcmdldFNWRy5ub2RlKCkpfWRyYXdUb29sdGlwUm93KHQsZSxuKXtjb25zdCBpPXRoaXMscj1TdSh0KS5zZWxlY3RBbGwoInRkIikuZGF0YShlKTtyLmVhY2goKGZ1bmN0aW9uKHQpe3Quc3RhdGljfHxpLmRyYXdUb29sdGlwQ29sdW1uLmNhbGwoaSx0aGlzLHQsbil9KSksci5leGl0KCkucmVtb3ZlKCksci5lbnRlcigpLmFwcGVuZCgidGQiKS5lYWNoKChmdW5jdGlvbih0KXsiZW50ZXIiaW4gdCYmdC5lbnRlciYmdC5lbnRlci5jYWxsKHRoaXMsbiksaS5kcmF3VG9vbHRpcENvbHVtbi5jYWxsKGksdGhpcyx0LG4pfSkpfWRyYXdUb29sdGlwQ29sdW1uKHQsZSxuKXtjb25zdHtzbW9vdGhpbmdFbmFibGVkOml9PXRoaXM7ImV2YWxUeXBlImluIGUmJmUuZXZhbFR5cGU9PW9DdC5ET00/ZS5ldmFsdWF0ZS5jYWxsKHQsbix7c21vb3RoaW5nRW5hYmxlZDppfSk6U3UodCkudGV4dChlLmV2YWx1YXRlLmNhbGwodCxuLHtzbW9vdGhpbmdFbmFibGVkOml9KSl9ZmluZENsb3Nlc3RQb2ludCh0LGUpe2NvbnN0IG49ZS5kYXRhKCkubWFwKCgodCxuKT0+dGhpcy54U2NhbGUuc2NhbGUodGhpcy54QWNjZXNzb3IodCxuLGUpKSkpO2xldCBpPVNlLmV4cG9ydHMuc29ydGVkSW5kZXgobix0LngpO2lmKDA9PW4ubGVuZ3RoKXJldHVybiBudWxsO2k9PT1uLmxlbmd0aD9pLT0xOjAhPT1pJiYoaT1NYXRoLmFicyhuW2ktMV0tdC54KTxNYXRoLmFicyhuW2ldLXQueCk/aS0xOmkpO2NvbnN0IHI9ZS5kYXRhKClbaV0sbz10aGlzLnNtb290aGluZ0VuYWJsZWQ/dGhpcy5zbW9vdGhlZEFjY2Vzc29yKHIsaSxlKTp0aGlzLnlWYWx1ZUFjY2Vzc29yKHIsaSxlKTtyZXR1cm57eDpuW2ldLHk6dGhpcy55U2NhbGUuc2NhbGUobyksZGF0dW06cixkYXRhc2V0OmV9fXJlc21vb3RoRGF0YXNldCh0KXtsZXQgZT10LmRhdGEoKTtjb25zdCBuPXRoaXMuc21vb3RoaW5nV2VpZ2h0O2xldCBpPWUubGVuZ3RoPjA/MDpOYU4scj0wO2NvbnN0IG89ZS5tYXAoKChlLG4pPT50aGlzLnlWYWx1ZUFjY2Vzc29yKGUsbix0KSkpLGE9by5ldmVyeSgodD0+dD09b1swXSkpO2UuZm9yRWFjaCgoKHQsZSk9Pntjb25zdCBzPW9bZV07aWYoYXx8IU51bWJlci5pc0Zpbml0ZShzKSl0LnNtb290aGVkPXM7ZWxzZXtpPWkqbisoMS1uKSpzLHIrKztsZXQgZT0xOzEhPT1uJiYoZT0xLU1hdGgucG93KG4scikpLHQuc21vb3RoZWQ9aS9lfX0pKX1nZXREYXRhc2V0KHQpe3JldHVybiB2b2lkIDA9PT10aGlzLm5hbWUyZGF0YXNldHNbdF0mJih0aGlzLm5hbWUyZGF0YXNldHNbdF09bmV3IHJPLkRhdGFzZXQoW10se25hbWU6dCxtZXRhOm51bGx9KSksdGhpcy5uYW1lMmRhdGFzZXRzW3RdfXN0YXRpYyBnZXRZU2NhbGVGcm9tVHlwZSh0KXtpZih0PT09YUN0LkxPRylyZXR1cm4gbmV3IG5DdDtpZih0PT09YUN0LkxJTkVBUilyZXR1cm4gbmV3IFpUdDt0aHJvdyBuZXcgRXJyb3IoIlVucmVjb2duaXplZCB5U2NhbGUgdHlwZSAiK3QpfXNldFZpc2libGVTZXJpZXModCl7dGhpcy5kaXNhYmxlQ2hhbmdlcygpLCh0PXQuc29ydCgpKS5yZXZlcnNlKCksdGhpcy5zZXJpZXNOYW1lcz10fWRpc2FibGVDaGFuZ2VzKCl7dGhpcy5kaXJ0eURhdGFzZXRzLnNpemV8fCh0aGlzLmxpbmVQbG90LmRhdGFzZXRzKFtdKSx0aGlzLnNtb290aExpbmVQbG90JiZ0aGlzLnNtb290aExpbmVQbG90LmRhdGFzZXRzKFtdKSx0aGlzLm1hcmdpbkFyZWFQbG90JiZ0aGlzLm1hcmdpbkFyZWFQbG90LmRhdGFzZXRzKFtdKSl9Y29tbWl0Q2hhbmdlcygpe3RoaXMuZGF0YXNldHM9dGhpcy5zZXJpZXNOYW1lcy5tYXAoKHQ9PnRoaXMuZ2V0RGF0YXNldCh0KSkpLFsuLi50aGlzLmRpcnR5RGF0YXNldHNdLmZvckVhY2goKHQ9Pnt0aGlzLnNtb290aGluZ0VuYWJsZWQmJnRoaXMucmVzbW9vdGhEYXRhc2V0KHRoaXMuZ2V0RGF0YXNldCh0KSl9KSksdGhpcy51cGRhdGVTcGVjaWFsRGF0YXNldHMoKSx0aGlzLmxpbmVQbG90LmRhdGFzZXRzKHRoaXMuZGF0YXNldHMpLHRoaXMuc21vb3RoaW5nRW5hYmxlZCYmdGhpcy5zbW9vdGhMaW5lUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKSx0aGlzLm1hcmdpbkFyZWFQbG90JiZ0aGlzLm1hcmdpbkFyZWFQbG90LmRhdGFzZXRzKHRoaXMuZGF0YXNldHMpLHRoaXMubWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXRJblJhZigpLHRoaXMuZGlydHlEYXRhc2V0cy5jbGVhcigpfWNyZWF0ZVNhbXBsZWREYXRhc2V0Rm9yTWFya2Vycyh0KXtjb25zdCBlPXQuZGF0YSgpO2lmKGUubGVuZ3RoPD0yMClyZXR1cm4gdDtjb25zdCBuPU1hdGguY2VpbChlLmxlbmd0aC8yMCksaT1uZXcgQXJyYXkoTWF0aC5mbG9vcihlLmxlbmd0aC9uKSk7Zm9yKGxldCB0PTAscj0wO3Q8aS5sZW5ndGg7dCsrLHIrPW4paVt0XT1lW3JdO3JldHVybiBuZXcgck8uRGF0YXNldChpLHQubWV0YWRhdGEoKSl9c2V0U2VyaWVzRGF0YSh0LGUpe3RoaXMuZGlzYWJsZUNoYW5nZXMoKSx0aGlzLmdldERhdGFzZXQodCkuZGF0YShlKSx0aGlzLmRpcnR5RGF0YXNldHMuYWRkKHQpfXNldFNlcmllc01ldGFkYXRhKHQsZSl7dGhpcy5kaXNhYmxlQ2hhbmdlcygpLHRoaXMuZ2V0RGF0YXNldCh0KS5tZXRhZGF0YShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5nZXREYXRhc2V0KHQpLm1ldGFkYXRhKCkpLHttZXRhOmV9KSksdGhpcy5kaXJ0eURhdGFzZXRzLmFkZCh0KX1zbW9vdGhpbmdVcGRhdGUodCl7dGhpcy5zbW9vdGhpbmdXZWlnaHQ9dCx0aGlzLmRhdGFzZXRzLmZvckVhY2goKHQ9PnRoaXMucmVzbW9vdGhEYXRhc2V0KHQpKSksdGhpcy5zbW9vdGhpbmdFbmFibGVkfHwodGhpcy5saW5lUGxvdC5hZGRDbGFzcygiZ2hvc3QiKSx0aGlzLnNjYXR0ZXJQbG90LnkodGhpcy5zbW9vdGhlZEFjY2Vzc29yLHRoaXMueVNjYWxlKSx0aGlzLnNtb290aGluZ0VuYWJsZWQ9ITAsdGhpcy5zbW9vdGhMaW5lUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKSksdGhpcy5tYXJrZXJzU2NhdHRlclBsb3QmJnRoaXMubWFya2Vyc1NjYXR0ZXJQbG90LnkodGhpcy5nZXRZQXhpc0FjY2Vzc29yKCksdGhpcy55U2NhbGUpLHRoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCl9c21vb3RoaW5nRGlzYWJsZSgpe3RoaXMuc21vb3RoaW5nRW5hYmxlZCYmKHRoaXMubGluZVBsb3QucmVtb3ZlQ2xhc3MoImdob3N0IiksdGhpcy5zY2F0dGVyUGxvdC55KHRoaXMueVZhbHVlQWNjZXNzb3IsdGhpcy55U2NhbGUpLHRoaXMuc21vb3RoTGluZVBsb3QuZGF0YXNldHMoW10pLHRoaXMuc21vb3RoaW5nRW5hYmxlZD0hMSx0aGlzLnVwZGF0ZVNwZWNpYWxEYXRhc2V0cygpKSx0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdCYmdGhpcy5tYXJrZXJzU2NhdHRlclBsb3QueSh0aGlzLmdldFlBeGlzQWNjZXNzb3IoKSx0aGlzLnlTY2FsZSl9c2V0Q29sb3JTY2FsZSh0KXt0aGlzLmNvbG9yU2NhbGU9dH1zZXRUb29sdGlwQ29sdW1ucyh0KXt0aGlzLnRvb2x0aXBDb2x1bW5zPXR9c2V0VG9vbHRpcFNvcnRpbmdNZXRob2QodCl7dGhpcy50b29sdGlwU29ydGluZ01ldGhvZD10fXJlbmRlclRvKHQpe3RoaXMudGFyZ2V0U1ZHPXQsdGhpcy5vdXRlci5yZW5kZXJUbyh0KSxudWxsIT10aGlzLl9kZWZhdWx0WFJhbmdlJiZ0aGlzLnJlc2V0WERvbWFpbigpLG51bGwhPXRoaXMuX2RlZmF1bHRZUmFuZ2UmJnRoaXMucmVzZXRZRG9tYWluKCksdGhpcy5tZWFzdXJlQkJveEFuZE1heWJlSW52YWxpZGF0ZUxheW91dEluUmFmKCl9cmVkcmF3KCl7d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlZHJhd1JhZiksdGhpcy5fcmVkcmF3UmFmPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT57dGhpcy5tZWFzdXJlQkJveEFuZE1heWJlSW52YWxpZGF0ZUxheW91dCgpLHRoaXMub3V0ZXIucmVkcmF3KCl9KSl9bWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXRJblJhZigpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9pbnZhbGlkYXRlTGF5b3V0UmFmKSx0aGlzLl9pbnZhbGlkYXRlTGF5b3V0UmFmPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT57dGhpcy5tZWFzdXJlQkJveEFuZE1heWJlSW52YWxpZGF0ZUxheW91dCgpfSkpfW1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0KCl7aWYodGhpcy5fbGFzdERyYXdCQm94KXtjb25zdHt3aWR0aDp0fT10aGlzLl9sYXN0RHJhd0JCb3gse3dpZHRoOmV9PXRoaXMudGFyZ2V0U1ZHLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTswPT10JiZ0PGUmJnRoaXMub3V0ZXIuaW52YWxpZGF0ZUNhY2hlKCl9dGhpcy5fbGFzdERyYXdCQm94PXRoaXMudGFyZ2V0U1ZHLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1kZXN0cm95KCl7d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlZHJhd1JhZiksd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX2ludmFsaWRhdGVMYXlvdXRSYWYpLHRoaXMub3V0ZXImJnRoaXMub3V0ZXIuZGVzdHJveSgpfW9uQW5jaG9yKHQpe3RoaXMub3V0ZXImJnRoaXMub3V0ZXIub25BbmNob3IodCl9aXNEYXRhRml0VG9Eb21haW4oKXtyZXR1cm4gdCh0aGlzLnhBeGlzLmdldFNjYWxlKCkpJiZ0KHRoaXMueUF4aXMuZ2V0U2NhbGUoKSk7ZnVuY3Rpb24gdCh0KXtjb25zdCBlPXQuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKSxuPXQuZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQoKTtyZXR1cm4gblswXT09PWVbMF0mJm5bMV09PT1lWzFdfX19IShmdW5jdGlvbih0KXt0LkdST1VQPSJHIix0LkRJVj0iRElWIix0LlNWRz0iU1ZHIix0LlRFWFQ9IlRFWFQifSkoc0N0fHwoc0N0PXt9KSk7Y2xhc3MgdUN0IGV4dGVuZHMgY2xhc3N7Y29uc3RydWN0b3IodCl7dGhpcy51bmlxdWVJZD0wLHRoaXMucm9vdD10fWV4cG9ydEFzU3RyaW5nKCl7Y29uc3QgdD10aGlzLmNvbnZlcnQodGhpcy5yb290KTtpZighdClyZXR1cm4iIjtjb25zdCBlPXRoaXMuY3JlYXRlUm9vdFN2ZygpO3JldHVybiBlLmFwcGVuZENoaWxkKHQpLGUub3V0ZXJIVE1MfWNyZWF0ZVVuaXF1ZUlkKHQpe3JldHVybmAke3R9XyR7dGhpcy51bmlxdWVJZCsrfWB9Z2V0U2l6ZSgpe3JldHVybiB0aGlzLnJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y3JlYXRlUm9vdFN2Zygpe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3ZnIiksZT10aGlzLmdldFNpemUoKTtyZXR1cm4gdC5zZXRBdHRyaWJ1dGVOUygic3ZnIiwidmlld0JveCIsYDAgMCAke2Uud2lkdGh9ICR7ZS5oZWlnaHR9YCksdC5zZXRBdHRyaWJ1dGUoInhtbG5zIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciKSx0fWNvbnZlcnQodCl7bGV0IGU9bnVsbDtjb25zdCBuPXQubm9kZU5hbWUudG9VcHBlckNhc2UoKTtpZih0Lm5vZGVUeXBlIT1Ob2RlLkVMRU1FTlRfTk9ERXx8biE9c0N0LkRJViYmbiE9c0N0LlNWRyllPXQuY2xvbmVOb2RlKCk7ZWxzZXtlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoc0N0LkdST1VQKTtjb25zdCBuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLGk9cGFyc2VJbnQobi5sZWZ0LDEwKSxyPXBhcnNlSW50KG4udG9wLDEwKTtpZihpfHxyKXtjb25zdCB0PXRoaXMuY3JlYXRlVW5pcXVlSWQoImNsaXAiKTtlLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIixgdHJhbnNsYXRlKCR7aX0sICR7cn0pYCksZS5zZXRBdHRyaWJ1dGUoImNsaXAtcGF0aCIsYHVybCgjJHt0fSlgKTtjb25zdCBvPXBhcnNlSW50KG4ud2lkdGgsMTApLGE9cGFyc2VJbnQobi5oZWlnaHQsMTApLHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicmVjdCIpO3Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsU3RyaW5nKG8pKSxzLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixTdHJpbmcoYSkpO2NvbnN0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJzdmciLCJjbGlwUGF0aCIpO2wuaWQ9dCxsLmFwcGVuZENoaWxkKHMpLGUuYXBwZW5kQ2hpbGQobCl9fXJldHVybiBBcnJheS5mcm9tKHQuY2hpbGROb2RlcykubWFwKCh0PT50aGlzLmNvbnZlcnQodCkpKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaCgodD0+ZS5hcHBlbmRDaGlsZCh0KSkpLGUubm9kZU5hbWUudG9VcHBlckNhc2UoKT09c0N0LkdST1VQJiYhZS5oYXNDaGlsZE5vZGVzKCl8fHRoaXMuc2hvdWxkT21pdE5vZGUodCk/bnVsbDp0aGlzLnN0cmlwQ2xhc3ModGhpcy50cmFuc2ZlclN0eWxlKHQsZSkpfXN0cmlwQ2xhc3ModCl7cmV0dXJuIHQubm9kZVR5cGU9PU5vZGUuRUxFTUVOVF9OT0RFJiZ0LnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKSx0fXRyYW5zZmVyU3R5bGUodCxlKXtpZihlLm5vZGVUeXBlIT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4gZTtjb25zdCBuPWUsaT1lLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkscj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KTtyZXR1cm4gaT09c0N0LlRFWFQmJk9iamVjdC5hc3NpZ24obi5zdHlsZSx7Zm9udEZhbWlseTpyLmZvbnRGYW1pbHksZm9udFNpemU6ci5mb250U2l6ZSxmb250V2VpZ2h0OnIuZm9udFdlaWdodH0pLGkhPXNDdC5HUk9VUCYmKG4uc2V0QXR0cmlidXRlKCJmaWxsIixyLmZpbGwpLG4uc2V0QXR0cmlidXRlKCJzdHJva2UiLHIuc3Ryb2tlKSxuLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIixyLnN0cm9rZVdpZHRoKSksIjEiIT1yLm9wYWNpdHkmJm4uc2V0QXR0cmlidXRlKCJvcGFjaXR5IixyLm9wYWNpdHkpLGV9c2hvdWxkT21pdE5vZGUodCl7cmV0dXJuITF9fXtzaG91bGRPbWl0Tm9kZSh0KXtyZXR1cm4gdC5ub2RlVHlwZT09Tm9kZS5FTEVNRU5UX05PREUmJnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzY2F0dGVyLXBsb3QiKX19ZWwoe21vZHVsZU5hbWU6InZ6LXBhbi16b29tLXN0eWxlIixzdHlsZUNvbnRlbnQ6IlxuICAgIC5oZWxwIHtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBhbmltYXRpb24tZGVsYXk6IDFzO1xuICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAxcztcbiAgICAgIGFuaW1hdGlvbi1uYW1lOiBmYWRlLW91dDtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMzAsIDMwLCAzMCwgMC42KTtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgbGVmdDogMDtcbiAgICAgIG9wYWNpdHk6IDE7XG4gICAgICBwYWRkaW5nOiAyMHB4O1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICByaWdodDogMDtcbiAgICAgIHRvcDogMDtcbiAgICB9XG5cbiAgICAuaGVscCA+IHNwYW4ge1xuICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcbiAgICB9XG5cbiAgICBAa2V5ZnJhbWVzIGZhZGUtb3V0IHtcbiAgICAgIDAlIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgIH1cblxuICAgICAgMTAwJSB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICB9XG4gICAgfVxuICAifSk7Y29uc3QgaEN0PXdUdCg0KSxkQ3Q9dD0+aXNOYU4odCk/Ik5hTiI6aEN0KHQpLHBDdD1be3RpdGxlOiJOYW1lIixldmFsdWF0ZTp0PT50LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfSx7dGl0bGU6IlNtb290aGVkIixldmFsdWF0ZSh0LGUpe2NvbnN0e3Ntb290aGluZ0VuYWJsZWQ6bn09ZTtyZXR1cm4gZEN0KG4/dC5kYXR1bS5zbW9vdGhlZDp0LmRhdHVtLnNjYWxhcil9fSx7dGl0bGU6IlZhbHVlIixldmFsdWF0ZTp0PT5kQ3QodC5kYXR1bS5zY2FsYXIpfSx7dGl0bGU6IlN0ZXAiLGV2YWx1YXRlOnQ9PlNUdCh0LmRhdHVtLnN0ZXApfSx7dGl0bGU6IlRpbWUiLGV2YWx1YXRlOnQ9PkVUdCh0LmRhdHVtLndhbGxfdGltZSl9LHt0aXRsZToiUmVsYXRpdmUiLGV2YWx1YXRlOnQ9PkNUdChUVHQodC5kYXR1bSwwLHQuZGF0YXNldCkpfV07bGV0IGZDdD1jbGFzcyBleHRlbmRzKGVyKHllKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29sb3JTY2FsZT0obmV3IHJPLlNjYWxlcy5Db2xvcikucmFuZ2UoZ0Euc2xpY2UoMCkpLHRoaXMuc21vb3RoaW5nRW5hYmxlZD0hMSx0aGlzLnNtb290aGluZ1dlaWdodD0uNix0aGlzLnhUeXBlPW51bGwsdGhpcy54Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kPW51bGwsdGhpcy55VmFsdWVBY2Nlc3Nvcj10PT50LnNjYWxhcix0aGlzLnRvb2x0aXBDb2x1bW5zPXBDdCx0aGlzLnlTY2FsZVR5cGU9YUN0LkxJTkVBUix0aGlzLmlnbm9yZVlPdXRsaWVycz0hMSx0aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kPSJkZWZhdWx0Iix0aGlzLnRvb2x0aXBQb3NpdGlvbj16VHQuQk9UVE9NLHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZT1bXSx0aGlzLl9zZXJpZXNEYXRhQ2FjaGU9e30sdGhpcy5fc2VyaWVzTWV0YWRhdGFDYWNoZT17fSx0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9bnVsbH1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLmNoYXJ0ZGl2LCEwKX1hdHRhY2hlZCgpe2NvbnN0IHQ9e2NhcHR1cmU6ITAscGFzc2l2ZTohMH07dGhpcy5fbGlzdGVuKHRoaXMsIm1vdXNlZG93biIsdGhpcy5fb25Nb3VzZURvd24uYmluZCh0aGlzKSx0KSx0aGlzLl9saXN0ZW4odGhpcywibW91c2V1cCIsdGhpcy5fb25Nb3VzZVVwLmJpbmQodGhpcyksdCksdGhpcy5fbGlzdGVuKHdpbmRvdywia2V5ZG93biIsdGhpcy5fb25LZXlEb3duLmJpbmQodGhpcyksdCksdGhpcy5fbGlzdGVuKHdpbmRvdywia2V5dXAiLHRoaXMuX29uS2V5VXAuYmluZCh0aGlzKSx0KX1kZXRhY2hlZCgpe3RoaXMuY2FuY2VsQXN5bmModGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkKSx0aGlzLl9jaGFydCYmKHRoaXMuX2NoYXJ0LmRlc3Ryb3koKSx0aGlzLl9jaGFydD12b2lkIDApLHRoaXMuX2xpc3RlbmVycyYmKHRoaXMuX2xpc3RlbmVycy5mb3JFYWNoKCgoe25vZGU6dCxldmVudE5hbWU6ZSxmdW5jOm4sb3B0aW9uOml9KT0+e3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLG4saSl9KSksdGhpcy5fbGlzdGVuZXJzLmNsZWFyKCkpfV9saXN0ZW4odCxlLG4saT17fSl7dGhpcy5fbGlzdGVuZXJzfHwodGhpcy5fbGlzdGVuZXJzPW5ldyBTZXQpLHRoaXMuX2xpc3RlbmVycy5hZGQoe25vZGU6dCxldmVudE5hbWU6ZSxmdW5jOm4sb3B0aW9uOml9KSx0LmFkZEV2ZW50TGlzdGVuZXIoZSxuLGkpfV9vbktleURvd24odCl7dGhpcy50b2dnbGVDbGFzcygicGFua2V5IixsQ3QuaXNQYW5LZXkodCkpfV9vbktleVVwKHQpe3RoaXMudG9nZ2xlQ2xhc3MoInBhbmtleSIsbEN0LmlzUGFuS2V5KHQpKX1fb25Nb3VzZURvd24odCl7dGhpcy50b2dnbGVDbGFzcygibW91c2Vkb3duIiwhMCl9X29uTW91c2VVcCh0KXt0aGlzLnRvZ2dsZUNsYXNzKCJtb3VzZWRvd24iLCExKX1pc0RhdGFGaXRUb0RvbWFpbigpe3JldHVybiF0aGlzLl9jaGFydHx8dGhpcy5fY2hhcnQuaXNEYXRhRml0VG9Eb21haW4oKX1zZXRWaXNpYmxlU2VyaWVzKHQpe1NlLmV4cG9ydHMuaXNFcXVhbCh0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUsdCl8fCh0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGU9dCl9c2V0U2VyaWVzRGF0YSh0LGUpe3RoaXMuX3Nlcmllc0RhdGFDYWNoZVt0XT1lLHRoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5zZXRTZXJpZXNEYXRhKHQsZSl9c2V0U2VyaWVzTWV0YWRhdGEodCxlKXt0aGlzLl9zZXJpZXNNZXRhZGF0YUNhY2hlW3RdPWUsdGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnNldFNlcmllc01ldGFkYXRhKHQsZSl9Y29tbWl0Q2hhbmdlcygpe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5jb21taXRDaGFuZ2VzKCl9cmVzZXREb21haW4oKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQucmVzZXREb21haW4oKX1yZWRyYXcoKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQucmVkcmF3KCl9X21ha2VDaGFydCgpe251bGwhPT10aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZCksdGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkPW51bGwpLHRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZD10aGlzLmFzeW5jKChmdW5jdGlvbigpe3RoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZD1udWxsO2xldCB0PXRoaXMueENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZDtpZih0aGlzLnhUeXBlfHx0P3RoaXMueFR5cGUmJih0PSgpPT5BVHQodGhpcy54VHlwZSkpOnQ9TVR0LHQmJnRoaXMueVZhbHVlQWNjZXNzb3ImJnRoaXMudG9vbHRpcENvbHVtbnMpe3ZhciBlPW5ldyBjQ3QodCx0aGlzLnlWYWx1ZUFjY2Vzc29yLHRoaXMueVNjYWxlVHlwZSx0aGlzLmNvbG9yU2NhbGUsdGhpcy4kLnRvb2x0aXAsdGhpcy50b29sdGlwQ29sdW1ucyx0aGlzLmZpbGxBcmVhLHRoaXMuZGVmYXVsdFhSYW5nZSx0aGlzLmRlZmF1bHRZUmFuZ2UsdGhpcy5zeW1ib2xGdW5jdGlvbix0aGlzLnhBeGlzRm9ybWF0dGVyKSxuPVN1KHRoaXMuJC5jaGFydGRpdik7ZS5yZW5kZXJUbyhuKSx0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuZGVzdHJveSgpLHRoaXMuX2NoYXJ0PWUsdGhpcy5fY2hhcnQub25BbmNob3IoKCgpPT50aGlzLmZpcmUoImNoYXJ0LWF0dGFjaGVkIikpKX19KSwzNTApfV9yZWxvYWRGcm9tQ2FjaGUoKXt0aGlzLl9jaGFydCYmKHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZS5mb3JFYWNoKCh0PT57dGhpcy5fY2hhcnQuc2V0U2VyaWVzRGF0YSh0LHRoaXMuX3Nlcmllc0RhdGFDYWNoZVt0XXx8W10pfSkpLHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZS5maWx0ZXIoKHQ9PnRoaXMuX3Nlcmllc01ldGFkYXRhQ2FjaGVbdF0pKS5mb3JFYWNoKCh0PT57dGhpcy5fY2hhcnQuc2V0U2VyaWVzTWV0YWRhdGEodCx0aGlzLl9zZXJpZXNNZXRhZGF0YUNhY2hlW3RdKX0pKSx0aGlzLl9jaGFydC5zZXRWaXNpYmxlU2VyaWVzKHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZSksdGhpcy5fY2hhcnQuY29tbWl0Q2hhbmdlcygpKX1fc21vb3RoaW5nQ2hhbmdlZCgpe3RoaXMuX2NoYXJ0JiYodGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuX2NoYXJ0LnNtb290aGluZ1VwZGF0ZSh0aGlzLnNtb290aGluZ1dlaWdodCk6dGhpcy5fY2hhcnQuc21vb3RoaW5nRGlzYWJsZSgpKX1fb3V0bGllcnNDaGFuZ2VkKCl7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0Lmlnbm9yZVlPdXRsaWVycyh0aGlzLmlnbm9yZVlPdXRsaWVycyl9X2NvbG9yU2NhbGVDaGFuZ2VkKCl7dGhpcy5fY2hhcnQmJih0aGlzLl9jaGFydC5zZXRDb2xvclNjYWxlKHRoaXMuY29sb3JTY2FsZSksdGhpcy5fY2hhcnQucmVkcmF3KCkpfV90b29sdGlwQ29sdW1uc0NoYW5nZWQoKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuc2V0VG9vbHRpcENvbHVtbnModGhpcy50b29sdGlwQ29sdW1ucyl9X3Rvb2x0aXBTb3J0aW5nTWV0aG9kQ2hhbmdlZCgpe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5zZXRUb29sdGlwU29ydGluZ01ldGhvZCh0aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kKX1nZXRFeHBvcnRlcigpe3JldHVybiBuZXcgdUN0KHRoaXMuJC5jaGFydGRpdil9fTtmQ3QudGVtcGxhdGU9X2VgCiAgICA8ZGl2IGlkPSJjaGFydGRpdiI+PC9kaXY+CiAgICA8dnotY2hhcnQtdG9vbHRpcAogICAgICBpZD0idG9vbHRpcCIKICAgICAgcG9zaXRpb249IltbdG9vbHRpcFBvc2l0aW9uXV0iCiAgICAgIGNvbnRlbnQtY29tcG9uZW50LW5hbWU9InZ6LWxpbmUtY2hhcnQtdG9vbHRpcCIKICAgID48L3Z6LWNoYXJ0LXRvb2x0aXA+CiAgICA8c3R5bGUgaW5jbHVkZT0icGxvdHRhYmxlLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZ6LXBhbi16b29tLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQogICAgICBkaXYgewogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgIH0KCiAgICAgICNjaGFydGRpdiAubWFpbiB7CiAgICAgICAgY29udGFpbjogc3RyaWN0OwogICAgICAgIGN1cnNvcjogY3Jvc3NoYWlyOwogICAgICB9CgogICAgICA6aG9zdCgucGFua2V5KSAjY2hhcnRkaXYgOm5vdCguZHJhZy16b29taW5nKSAubWFpbiB7CiAgICAgICAgY3Vyc29yOiAtd2Via2l0LWdyYWI7CiAgICAgICAgY3Vyc29yOiBncmFiOwogICAgICB9CgogICAgICA6aG9zdCgubW91c2Vkb3duKSAjY2hhcnRkaXYgLnBhbm5pbmcgLm1haW4gewogICAgICAgIGN1cnNvcjogLXdlYmtpdC1ncmFiYmluZzsKICAgICAgICBjdXJzb3I6IGdyYWJiaW5nOwogICAgICB9CgogICAgICAjY2hhcnRkaXYgewogICAgICAgIGNvbnRhaW46IHN0cmljdDsKICAgICAgfQoKICAgICAgI2NoYXJ0ZGl2IGxpbmUuZ3VpZGUtbGluZSB7CiAgICAgICAgc3Ryb2tlOiAjOTk5OwogICAgICAgIHN0cm9rZS13aWR0aDogMS41cHg7CiAgICAgIH0KICAgICAgI2NoYXJ0ZGl2OmhvdmVyIC5tYWluIHsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAuZ2hvc3QgewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQoKICAgICAgLnBsb3R0YWJsZSAuYXhpcyB0ZXh0IHsKICAgICAgICBmaWxsOiBjdXJyZW50Q29sb3I7CiAgICAgIH0KCiAgICAgIC5wbG90dGFibGUgLmdyaWRsaW5lcyBsaW5lIHsKICAgICAgICBzdHJva2U6IHZhcigtLXRiLXNlY29uZGFyeS10ZXh0LWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLHJPLlNjYWxlcy5Db2xvcildLGZDdC5wcm90b3R5cGUsImNvbG9yU2NhbGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pXSxmQ3QucHJvdG90eXBlLCJzeW1ib2xGdW5jdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxmQ3QucHJvdG90eXBlLCJzbW9vdGhpbmdFbmFibGVkIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLGZDdC5wcm90b3R5cGUsInNtb290aGluZ1dlaWdodCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxmQ3QucHJvdG90eXBlLCJ4VHlwZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLGZDdC5wcm90b3R5cGUsInhDb21wb25lbnRzQ3JlYXRpb25NZXRob2QiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pXSxmQ3QucHJvdG90eXBlLCJ4QXhpc0Zvcm1hdHRlciIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLGZDdC5wcm90b3R5cGUsInlWYWx1ZUFjY2Vzc29yIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxmQ3QucHJvdG90eXBlLCJ0b29sdGlwQ29sdW1ucyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxmQ3QucHJvdG90eXBlLCJmaWxsQXJlYSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sZkN0LnByb3RvdHlwZSwiZGVmYXVsdFhSYW5nZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sZkN0LnByb3RvdHlwZSwiZGVmYXVsdFlSYW5nZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxmQ3QucHJvdG90eXBlLCJ5U2NhbGVUeXBlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sZkN0LnByb3RvdHlwZSwiaWdub3JlWU91dGxpZXJzIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGZDdC5wcm90b3R5cGUsInRvb2x0aXBTb3J0aW5nTWV0aG9kIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGZDdC5wcm90b3R5cGUsInRvb2x0aXBQb3NpdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxmQ3QucHJvdG90eXBlLCJfY2hhcnQiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLGZDdC5wcm90b3R5cGUsIl92aXNpYmxlU2VyaWVzQ2FjaGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sZkN0LnByb3RvdHlwZSwiX3Nlcmllc0RhdGFDYWNoZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxmQ3QucHJvdG90eXBlLCJfc2VyaWVzTWV0YWRhdGFDYWNoZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxmQ3QucHJvdG90eXBlLCJfbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkIix2b2lkIDApLHQoW2EoInhDb21wb25lbnRzQ3JlYXRpb25NZXRob2QiLCJ4VHlwZSIsInlWYWx1ZUFjY2Vzc29yIiwieVNjYWxlVHlwZSIsImlzQXR0YWNoZWQiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGZDdC5wcm90b3R5cGUsIl9tYWtlQ2hhcnQiLG51bGwpLHQoW2EoIl9jaGFydCIsIl92aXNpYmxlU2VyaWVzQ2FjaGUiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGZDdC5wcm90b3R5cGUsIl9yZWxvYWRGcm9tQ2FjaGUiLG51bGwpLHQoW2EoInNtb290aGluZ0VuYWJsZWQiLCJzbW9vdGhpbmdXZWlnaHQiLCJfY2hhcnQiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGZDdC5wcm90b3R5cGUsIl9zbW9vdGhpbmdDaGFuZ2VkIixudWxsKSx0KFthKCJpZ25vcmVZT3V0bGllcnMiLCJfY2hhcnQiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGZDdC5wcm90b3R5cGUsIl9vdXRsaWVyc0NoYW5nZWQiLG51bGwpLHQoW2EoImNvbG9yU2NhbGUiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGZDdC5wcm90b3R5cGUsIl9jb2xvclNjYWxlQ2hhbmdlZCIsbnVsbCksdChbYSgidG9vbHRpcENvbHVtbnMiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGZDdC5wcm90b3R5cGUsIl90b29sdGlwQ29sdW1uc0NoYW5nZWQiLG51bGwpLHQoW2EoInRvb2x0aXBTb3J0aW5nTWV0aG9kIiwiX2NoYXJ0IiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxmQ3QucHJvdG90eXBlLCJfdG9vbHRpcFNvcnRpbmdNZXRob2RDaGFuZ2VkIixudWxsKSxmQ3Q9dChbaSgidnotbGluZS1jaGFydDIiKV0sZkN0KTtsZXQgbUN0PWNsYXNzIGV4dGVuZHMgeWV7fTttQ3QudGVtcGxhdGU9X2VgCiAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgPHRhYmxlPgogICAgICAgIDx0aGVhZD48L3RoZWFkPgogICAgICAgIDx0Ym9keT48L3Rib2R5PgogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLmNvbnRlbnQgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC44KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgdGFibGUgewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBsaW5lLWhlaWdodDogMS40ZW07CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgIH0KCiAgICAgIHRoZWFkIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KCiAgICAgIHRib2R5IHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIxcHg7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgdGQgewogICAgICAgIHBhZGRpbmc6IDAgNXB4OwogICAgICB9CgogICAgICAuc3dhdGNoIHsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICAgIHdpZHRoOiAxOHB4OwogICAgICB9CgogICAgICAuY2xvc2VzdCAuc3dhdGNoIHsKICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAycHggI2ZmZjsKICAgICAgfQoKICAgICAgdGggewogICAgICAgIHBhZGRpbmc6IDAgNXB4OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIC5kaXN0YW50IHRkOm5vdCguc3dhdGNoKSB7CiAgICAgICAgb3BhY2l0eTogMC44OwogICAgICB9CgogICAgICAuZ2hvc3QgewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLG1DdD10KFtpKCJ2ei1saW5lLWNoYXJ0LXRvb2x0aXAiKV0sbUN0KTtjb25zdCBnQ3Q9W10sX0N0PVNlLmV4cG9ydHMudGhyb3R0bGUoKGZ1bmN0aW9uIHQoKXtpZigwPT1nQ3QubGVuZ3RoKXJldHVybjtjb25zdCBlPWdDdC5zaGlmdCgpO2UmJmUuYWN0aXZlJiYoZS5yZWRyYXcoKSxlLl9tYXliZVJlbmRlcmVkSW5CYWRTdGF0ZT0hMSksd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKDApLHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodCl9KSwxMDApO2xldCB5Q3Q9Y2xhc3MgZXh0ZW5kcyhMVHQoZXIoeWUpKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX3JlZHJhd1JhZj1udWxsLHRoaXMuYWN0aXZlPSExLHRoaXMubG9nU2NhbGVBY3RpdmU9ITEsdGhpcy5jb2xvclNjYWxlPXtzY2FsZTpHUn0sdGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkPSEwLHRoaXMuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlPSExfW9uTG9hZEZpbmlzaCgpe3RoaXMuY29tbWl0Q2hhbmdlcygpLHRoaXMuZGF0YVRvTG9hZC5sZW5ndGg+MCYmdGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkJiYodGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkPSExLHRoaXMuZ2V0Q2hhcnQoKS5yZXNldERvbWFpbigpKSx0aGlzLnJlZHJhdygpfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKSxudWxsIT09dGhpcy5fcmVkcmF3UmFmJiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWRyYXdSYWYpfWV4cG9ydEFzU3ZnU3RyaW5nKCl7cmV0dXJuIHRoaXMuZ2V0Q2hhcnQoKS5nZXRFeHBvcnRlcigpLmV4cG9ydEFzU3RyaW5nKCl9Z2V0Q2hhcnQoKXtyZXR1cm4gdGhpcy4kLmNoYXJ0fXJlc2V0RG9tYWluKCl7dGhpcy5nZXRDaGFydCgpLnJlc2V0RG9tYWluKCl9c2V0U2VyaWVzRGF0YSh0LGUpe3RoaXMuZ2V0Q2hhcnQoKS5zZXRTZXJpZXNEYXRhKHQsZSl9c2V0U2VyaWVzTWV0YWRhdGEodCxlKXt0aGlzLmdldENoYXJ0KCkuc2V0U2VyaWVzTWV0YWRhdGEodCxlKX1jb21taXRDaGFuZ2VzKCl7dGhpcy5nZXRDaGFydCgpLmNvbW1pdENoYW5nZXMoKX1yZWRyYXcoKXtudWxsIT09dGhpcy5fcmVkcmF3UmFmJiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWRyYXdSYWYpLHRoaXMuX3JlZHJhd1JhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+e3RoaXMuYWN0aXZlP3RoaXMuZ2V0Q2hhcnQoKS5yZWRyYXcoKTp0aGlzLl9tYXliZVJlbmRlcmVkSW5CYWRTdGF0ZT0hMH0pKX1fbG9hZEtleUNoYW5nZWQoKXt0aGlzLnJlc2V0KCksdGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkPSEwfV9kYXRhU2VyaWVzQ2hhbmdlZCgpe3RoaXMuZ2V0Q2hhcnQoKS5zZXRWaXNpYmxlU2VyaWVzKHRoaXMuZGF0YVNlcmllcyl9X2xvZ1NjYWxlQ2hhbmdlZCh0KXt0aGlzLmdldENoYXJ0KCkueVNjYWxlVHlwZT10P2FDdC5MT0c6YUN0LkxJTkVBUix0aGlzLnJlZHJhdygpfV9maXhCYWRTdGF0ZVdoZW5BY3RpdmUoKXt0aGlzLmFjdGl2ZSYmdGhpcy5fbWF5YmVSZW5kZXJlZEluQmFkU3RhdGUmJihnQ3QucHVzaCh0aGlzKSxfQ3QoKSl9X29uQ2hhcnRBdHRhY2hlZCgpe3RoaXMuYWN0aXZlfHwodGhpcy5fbWF5YmVSZW5kZXJlZEluQmFkU3RhdGU9ITApfX07eUN0LnRlbXBsYXRlPV9lYAogICAgPGRpdiBpZD0iY2hhcnQtYW5kLXNwaW5uZXItY29udGFpbmVyIj4KICAgICAgPHZ6LWxpbmUtY2hhcnQyCiAgICAgICAgaWQ9ImNoYXJ0IgogICAgICAgIGRhdGEtbG9hZGluZyQ9IltbZGF0YUxvYWRpbmddXSIKICAgICAgICBkYXRhLWxvYWRlZC1vbmNlJD0iW1tkYXRhTG9hZGVkQXRMZWFzdE9uY2VdXSIKICAgICAgICBjb2xvci1zY2FsZT0iW1tjb2xvclNjYWxlXV0iCiAgICAgICAgZGVmYXVsdC14LXJhbmdlPSJbW2RlZmF1bHRYUmFuZ2VdXSIKICAgICAgICBkZWZhdWx0LXktcmFuZ2U9IltbZGVmYXVsdFlSYW5nZV1dIgogICAgICAgIGZpbGwtYXJlYT0iW1tmaWxsQXJlYV1dIgogICAgICAgIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIgogICAgICAgIG9uLWNoYXJ0LWF0dGFjaGVkPSJfb25DaGFydEF0dGFjaGVkIgogICAgICAgIHNtb290aGluZy1lbmFibGVkPSJbW3Ntb290aGluZ0VuYWJsZWRdXSIKICAgICAgICBzbW9vdGhpbmctd2VpZ2h0PSJbW3Ntb290aGluZ1dlaWdodF1dIgogICAgICAgIHN5bWJvbC1mdW5jdGlvbj0iW1tzeW1ib2xGdW5jdGlvbl1dIgogICAgICAgIHRvb2x0aXAtY29sdW1ucz0iW1t0b29sdGlwQ29sdW1uc11dIgogICAgICAgIHRvb2x0aXAtcG9zaXRpb249IltbdG9vbHRpcFBvc2l0aW9uXV0iCiAgICAgICAgdG9vbHRpcC1zb3J0aW5nLW1ldGhvZD0iW1t0b29sdGlwU29ydGluZ01ldGhvZF1dIgogICAgICAgIHgtY29tcG9uZW50cy1jcmVhdGlvbi1tZXRob2Q9IltbeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZF1dIgogICAgICAgIHgtdHlwZT0iW1t4VHlwZV1dIgogICAgICAgIHktdmFsdWUtYWNjZXNzb3I9IltbeVZhbHVlQWNjZXNzb3JdXSIKICAgICAgPjwvdnotbGluZS1jaGFydDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tkYXRhTG9hZGluZ11dIj4KICAgICAgICA8ZGl2IGlkPSJsb2FkaW5nLXNwaW5uZXItY29udGFpbmVyIj4KICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlPSIiPjwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICA6aG9zdChbX21heWJlLXJlbmRlcmVkLWluLWJhZC1zdGF0ZV0pIHZ6LWxpbmUtY2hhcnQgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI2NoYXJ0LWFuZC1zcGlubmVyLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjbG9hZGluZy1zcGlubmVyLWNvbnRhaW5lciB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydDIgewogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydDJbZGF0YS1sb2FkaW5nXSB7CiAgICAgICAgb3BhY2l0eTogMC4zOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfZml4QmFkU3RhdGVXaGVuQWN0aXZlIn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0seUN0LnByb3RvdHlwZSwiYWN0aXZlIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSx5Q3QucHJvdG90eXBlLCJkYXRhU2VyaWVzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLGRyKV0seUN0LnByb3RvdHlwZSwicmVxdWVzdE1hbmFnZXIiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfbG9nU2NhbGVDaGFuZ2VkIn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0seUN0LnByb3RvdHlwZSwibG9nU2NhbGVBY3RpdmUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0seUN0LnByb3RvdHlwZSwieENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx5Q3QucHJvdG90eXBlLCJ4VHlwZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLHlDdC5wcm90b3R5cGUsInlWYWx1ZUFjY2Vzc29yIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHlDdC5wcm90b3R5cGUsImZpbGxBcmVhIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0seUN0LnByb3RvdHlwZSwic21vb3RoaW5nRW5hYmxlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSx5Q3QucHJvdG90eXBlLCJzbW9vdGhpbmdXZWlnaHQiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLHlDdC5wcm90b3R5cGUsInRvb2x0aXBDb2x1bW5zIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHlDdC5wcm90b3R5cGUsInRvb2x0aXBTb3J0aW5nTWV0aG9kIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHlDdC5wcm90b3R5cGUsInRvb2x0aXBQb3NpdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLHlDdC5wcm90b3R5cGUsImlnbm9yZVlPdXRsaWVycyIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0seUN0LnByb3RvdHlwZSwiZGVmYXVsdFhSYW5nZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0seUN0LnByb3RvdHlwZSwiZGVmYXVsdFlSYW5nZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLHlDdC5wcm90b3R5cGUsInN5bWJvbEZ1bmN0aW9uIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHlDdC5wcm90b3R5cGUsImNvbG9yU2NhbGUiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSx5Q3QucHJvdG90eXBlLCJfcmVzZXREb21haW5Pbk5leHRMb2FkIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLHlDdC5wcm90b3R5cGUsIl9tYXliZVJlbmRlcmVkSW5CYWRTdGF0ZSIsdm9pZCAwKSx0KFthKCJsb2FkS2V5IiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSx5Q3QucHJvdG90eXBlLCJfbG9hZEtleUNoYW5nZWQiLG51bGwpLHQoW2EoImRhdGFTZXJpZXMuKiIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0seUN0LnByb3RvdHlwZSwiX2RhdGFTZXJpZXNDaGFuZ2VkIixudWxsKSx5Q3Q9dChbaSgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpXSx5Q3QpLGVsKHttb2R1bGVOYW1lOiJ0Zi1jdXN0b20tc2NhbGFyLWNhcmQtc3R5bGUiLHN0eWxlQ29udGVudDoiXG4gICAgOmhvc3Qge1xuICAgICAgbWFyZ2luOiA1cHggMTBweDtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIHdpZHRoOiAzMzBweDtcbiAgICAgIHZlcnRpY2FsLWFsaWduOiB0ZXh0LXRvcDtcbiAgICB9XG5cbiAgICA6aG9zdChbX2V4cGFuZGVkXSkge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgOmhvc3QoW19leHBhbmRlZF0pICN0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciB7XG4gICAgICBoZWlnaHQ6IDQwMHB4O1xuICAgIH1cblxuICAgIGgxIHtcbiAgICAgIGZvbnQtc2l6ZTogMTlweDtcbiAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgfVxuXG4gICAgI3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIHtcbiAgICAgIGhlaWdodDogMjAwcHg7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAjYnV0dG9ucyB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICB9XG5cbiAgICBwYXBlci1pY29uLWJ1dHRvbiB7XG4gICAgICBjb2xvcjogIzIxOTZmMztcbiAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgICB3aWR0aDogMzJweDtcbiAgICAgIGhlaWdodDogMzJweDtcbiAgICAgIHBhZGRpbmc6IDRweDtcbiAgICB9XG5cbiAgICBwYXBlci1pY29uLWJ1dHRvbltzZWxlY3RlZF0ge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTtcbiAgICB9XG5cbiAgICAuZG93bmxvYWQtbGlua3Mge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGhlaWdodDogMzJweDtcbiAgICB9XG5cbiAgICAuZG93bmxvYWQtbGlua3MgYSB7XG4gICAgICBmb250LXNpemU6IDEwcHg7XG4gICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7XG4gICAgICBtYXJnaW46IDJweDtcbiAgICB9XG5cbiAgICAuZG93bmxvYWQtbGlua3MgcGFwZXItZHJvcGRvd24tbWVudSB7XG4gICAgICB3aWR0aDogMTAwcHg7XG4gICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDoge1xuICAgICAgICBmb250LXNpemU6IDEwcHg7XG4gICAgICB9XG4gICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDoge1xuICAgICAgICBmb250LXNpemU6IDEwcHg7XG4gICAgICB9XG4gICAgfVxuICAifSk7Y2xhc3MgdkN0e2NvbnN0cnVjdG9yKHQsZSxuLGkscil7dGhpcy5ydW49dCx0aGlzLnRhZz1lLHRoaXMubmFtZT1uLHRoaXMuc2NhbGFyRGF0YT1pLHRoaXMuc3ltYm9sPXJ9Z2V0TmFtZSgpe3JldHVybiB0aGlzLm5hbWV9c2V0RGF0YSh0KXt0aGlzLnNjYWxhckRhdGE9dH1nZXREYXRhKCl7cmV0dXJuIHRoaXMuc2NhbGFyRGF0YX1nZXRSdW4oKXtyZXR1cm4gdGhpcy5ydW59Z2V0VGFnKCl7cmV0dXJuIHRoaXMudGFnfWdldFN5bWJvbCgpe3JldHVybiB0aGlzLnN5bWJvbH19ZnVuY3Rpb24gYkN0KHQsZSl7cmV0dXJuYCR7ZX0gKCR7dH0pYH1jbGFzcyB4Q3R7Y29uc3RydWN0b3IodCl7dGhpcy5ydW5CYXNlZENvbG9yU2NhbGU9dH1zY2FsZSh0KXtyZXR1cm4gdGhpcy5ydW5CYXNlZENvbG9yU2NhbGUuc2NhbGUodGhpcy5wYXJzZVJ1bk5hbWUodCkpfXBhcnNlUnVuTmFtZSh0KXtjb25zdCBlPXQubWF0Y2goL1woKC4qKVwpJC8pO3JldHVybiBlP2VbMV06IiJ9fWxldCB3Q3Q9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmFjdGl2ZT0hMCx0aGlzLl9jb2xvclNjYWxlPW5ldyB4Q3Qoe3NjYWxlOkdSfSksdGhpcy5fbmFtZVRvRGF0YVNlcmllcz17fSx0aGlzLl9leHBhbmRlZD0hMSx0aGlzLl9yZXF1ZXN0RGF0YT0odCxlLG4pPT57Y29uc3QgaT1fcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9zY2FsYXJzIik7UHJvbWlzZS5hbGwodC5tYXAoKHQ9Pntjb25zdCBuPWlPKGkse3RhZzp0aGlzLl90YWdGaWx0ZXIscnVuOnR9KTtyZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KG4pLnRoZW4oKG49PntlKHtpdGVtOnQsZGF0YTpufSl9KSl9KSkpLmZpbmFsbHkoKCgpPT57bigpfSkpfSx0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleD17fSx0aGlzLl9tYXRjaGVzTGlzdE9wZW5lZD0hMSx0aGlzLl9maWxsQXJlYT17bG93ZXJBY2Nlc3Nvcjp0PT50Lmxvd2VyLGhpZ2hlckFjY2Vzc29yOnQ9PnQudXBwZXJ9LHRoaXMuX3Rvb2x0aXBDb2x1bW5zPSgoKT0+e2NvbnN0IHQ9d1R0KDQpLGU9ZT0+aXNOYU4oZSk/Ik5hTiI6dChlKTtyZXR1cm5be3RpdGxlOiJOYW1lIixldmFsdWF0ZTp0PT50LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfSx7dGl0bGU6IlZhbHVlIixldmFsdWF0ZTp0PT5lKHQuZGF0dW0uc2NhbGFyKX0se3RpdGxlOiJMb3dlciBNYXJnaW4iLGV2YWx1YXRlOnQ9PmUodC5kYXR1bS5sb3dlcil9LHt0aXRsZToiVXBwZXIgTWFyZ2luIixldmFsdWF0ZTp0PT5lKHQuZGF0dW0udXBwZXIpfSx7dGl0bGU6IlN0ZXAiLGV2YWx1YXRlOnQ9PlNUdCh0LmRhdHVtLnN0ZXApfSx7dGl0bGU6IlRpbWUiLGV2YWx1YXRlOnQ9PkVUdCh0LmRhdHVtLndhbGxfdGltZSl9LHt0aXRsZToiUmVsYXRpdmUiLGV2YWx1YXRlOnQ9PkNUdChUVHQodC5kYXR1bSwwLHQuZGF0YXNldCkpfV19KSgpLHRoaXMuX21pc3NpbmdUYWdzPVtdLHRoaXMuX21pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuZWQ9ITF9cmVsb2FkKCl7dGhpcy4kLmxvYWRlci5yZWxvYWQoKX1yZWRyYXcoKXt0aGlzLiQubG9hZGVyLnJlZHJhdygpfV90b2dnbGVFeHBhbmRlZCh0KXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpLHRoaXMucmVkcmF3KCl9X3RvZ2dsZUxvZ1NjYWxlKCl7dGhpcy5zZXQoIl9sb2dTY2FsZUFjdGl2ZSIsIXRoaXMuX2xvZ1NjYWxlQWN0aXZlKX1fcmVzZXREb21haW4oKXtjb25zdCB0PXRoaXMuJC5sb2FkZXI7dCYmdC5yZXNldERvbWFpbigpfV9jc3ZVcmwodCxlKXtyZXR1cm4gZT9pTyh0aGlzLl9kb3dubG9hZERhdGFVcmwodCxlKSx7Zm9ybWF0OiJjc3YifSk6IiJ9X2pzb25VcmwodCxlKXtyZXR1cm4gZT9pTyh0aGlzLl9kb3dubG9hZERhdGFVcmwodCxlKSx7Zm9ybWF0OiJqc29uIn0pOiIifV9kb3dubG9hZERhdGFVcmwodCxlKXtjb25zdCBuPXRbZV0saT17dGFnOm4uZ2V0VGFnKCkscnVuOm4uZ2V0UnVuKCl9O3JldHVybiBpTyhfcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9kb3dubG9hZF9kYXRhIiksaSl9X2NyZWF0ZVByb2Nlc3NEYXRhRnVuY3Rpb24odCl7cmV0dXJuKGUsbixpKT0+e2lmKCFpLnJlZ2V4X3ZhbGlkKXJldHVybiB2b2lkIHRoaXMuc2V0KCJfdGFnRmlsdGVySW52YWxpZCIsITApO2NvbnN0IHI9U2UuZXhwb3J0cy5jbG9uZSh0aGlzLl9uYW1lVG9EYXRhU2VyaWVzKSxvPVtdO1NlLmV4cG9ydHMuZm9yRWFjaCh0LCh0PT57bGV0IGU9ITE7Y29uc3QgYT1pLnRhZ190b19ldmVudHNbdC52YWx1ZV0scz1pLnRhZ190b19ldmVudHNbdC5sb3dlcl0sbD1pLnRhZ190b19ldmVudHNbdC51cHBlcl07aWYoU2UuZXhwb3J0cy5pc1VuZGVmaW5lZChhKSYmKG8ucHVzaCh0LnZhbHVlKSxlPSEwKSxTZS5leHBvcnRzLmlzVW5kZWZpbmVkKHMpJiYoby5wdXNoKHQubG93ZXIpLGU9ITApLFNlLmV4cG9ydHMuaXNVbmRlZmluZWQobCkmJihvLnB1c2godC51cHBlciksZT0hMCksZSlyZXR1cm47Y29uc3QgYz10PT50WzFdLHU9dGhpcy5fZmluZFN0ZXBNaXNtYXRjaCh0LGEubWFwKGMpLHMubWFwKGMpLGwubWFwKGMpKTtpZih1KXJldHVybiB2b2lkIHRoaXMuc2V0KCJfc3RlcHNNaXNtYXRjaCIsdSk7Y29uc3QgaD10PT50WzJdLGQ9YS5tYXAoKCh0LGUpPT4oe3dhbGxfdGltZTpuZXcgRGF0ZSgxZTMqdFswXSksc3RlcDpjKHQpLHNjYWxhcjpoKHQpLGxvd2VyOmgoc1tlXSksdXBwZXI6aChsW2VdKX0pKSkscD1iQ3Qobix0LnZhbHVlKSxmPXJbcF07aWYoZilmLnNldERhdGEoZCk7ZWxzZXtjb25zdCBlPXRoaXMuX2NyZWF0ZU5ld0RhdGFTZXJpZXMobix0LnZhbHVlLHAsZCk7cltwXT1lfX0pKSx0aGlzLnNldCgiX25hbWVUb0RhdGFTZXJpZXMiLHIpO2NvbnN0IGE9U2UuZXhwb3J0cy5maW5kSW5kZXgodGhpcy5fbWlzc2luZ1RhZ3MsKHQ9PnQucnVuPT09bikpO2lmKG8ubGVuZ3RoJiYzIT1vLmxlbmd0aCl7Y29uc3QgdD17cnVuOm4sdGFnczpvfTthPj0wP3RoaXMuc3BsaWNlKCJfbWlzc2luZ1RhZ3MiLGEsMSx0KTp0aGlzLnB1c2goIl9taXNzaW5nVGFncyIsdCl9ZWxzZSBhPj0wJiZ0aGlzLnNwbGljZSgiX21pc3NpbmdUYWdzIixhLDEpfX1fZmluZFN0ZXBNaXNtYXRjaCh0LGUsbixpKXtyZXR1cm4gU2UuZXhwb3J0cy5pc0VxdWFsKG4sZSkmJlNlLmV4cG9ydHMuaXNFcXVhbChpLGUpP251bGw6e3Nlcmllc09iamVjdDp0LHZhbHVlU3RlcHM6ZSxsb3dlclN0ZXBzOm4sdXBwZXJTdGVwczppfX1fY3JlYXRlTmV3RGF0YVNlcmllcyh0LGUsbixpKXt0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFt0XXw9MDtjb25zdCByPW5ldyB2Q3QodCxlLG4saSxiVHRbdGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbdF1dKTtyZXR1cm4gdGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbdF09KHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W3RdKzEpJWJUdC5sZW5ndGgscn1fdXBkYXRlQ2hhcnQoKXtTZS5leHBvcnRzLmZvck93bih0aGlzLl9uYW1lVG9EYXRhU2VyaWVzLCh0PT57dGhpcy4kLmxvYWRlci5zZXRTZXJpZXNEYXRhKHQuZ2V0TmFtZSgpLHQuZ2V0RGF0YSgpKX0pKSx0aGlzLiQubG9hZGVyLmNvbW1pdENoYW5nZXMoKX1nZXQgX3Nlcmllc05hbWVzKCl7Y29uc3QgdD1uZXcgU2V0KHRoaXMucnVucyk7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuX25hbWVUb0RhdGFTZXJpZXMpLmZpbHRlcigoKFtlLG5dKT0+dC5oYXMobi5ydW4pKSkubWFwKCgoW3RdKT0+dCkpfV9kZXRlcm1pbmVDb2xvcih0LGUpe3JldHVybiB0LnNjYWxlKGUpfV9yZWZyZXNoRGF0YVNlcmllcygpe3RoaXMuc2V0KCJfbmFtZVRvRGF0YVNlcmllcyIse30pfV9jcmVhdGVTeW1ib2xGdW5jdGlvbigpe3JldHVybiB0PT50aGlzLl9uYW1lVG9EYXRhU2VyaWVzW3RdLmdldFN5bWJvbCgpLm1ldGhvZCgpfV9kZXRlcm1pbmVTeW1ib2wodCxlKXtyZXR1cm4gdFtlXS5nZXRTeW1ib2woKS5jaGFyYWN0ZXJ9Z2V0IF90YWdGaWx0ZXIoKXtyZXR1cm4gU2UuZXhwb3J0cy5mbGF0dGVuKHRoaXMubWFyZ2luQ2hhcnRTZXJpZXMubWFwKCh0PT5bdC52YWx1ZSx0Lmxvd2VyLHQudXBwZXJdKSkpLm1hcCgodD0+IigiK3RoaXMuX2VzY2FwZVJlZ2V4Q2hhcmFjdGVycyh0KSsiKSIpKS5qb2luKCJ8Iil9X2VzY2FwZVJlZ2V4Q2hhcmFjdGVycyh0KXtyZXR1cm4gdC5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywiXFwkJiIpfV9nZXRUb2dnbGVDb2xsYXBzaWJsZUljb24odCl7cmV0dXJuIHQ/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifV90b2dnbGVNYXRjaGVzT3Blbigpe3RoaXMuc2V0KCJfbWF0Y2hlc0xpc3RPcGVuZWQiLCF0aGlzLl9tYXRjaGVzTGlzdE9wZW5lZCl9Z2V0IF90aXRsZURpc3BsYXlTdHJpbmcoKXtyZXR1cm4gdGhpcy50aXRsZXx8InVudGl0bGVkIn1fc2VwYXJhdGVXaXRoQ29tbWFzKHQpe3JldHVybiB0LmpvaW4oIiwgIil9X3RvZ2dsZU1pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuKCl7dGhpcy5zZXQoIl9taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkIiwhdGhpcy5fbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZCl9X21hdGNoTGlzdEVudHJ5Q29sb3JVcGRhdGVkKCl7Y29uc3QgdD10aGlzLiQkKCIjbWF0Y2gtbGlzdC1yZXBlYXQiKTt0JiZ0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLm1hdGNoLWxpc3QtZW50cnkiKS5mb3JFYWNoKChlPT57Y29uc3Qgbj10Lml0ZW1Gb3JFbGVtZW50KGUpO2Uuc3R5bGUuY29sb3I9dGhpcy5fZGV0ZXJtaW5lQ29sb3IodGhpcy5fY29sb3JTY2FsZSxuKX0pKX19O3dDdC50ZW1wbGF0ZT1fZWAKICAgIDx0Zi1jYXJkLWhlYWRpbmcgZGlzcGxheS1uYW1lPSJbW190aXRsZURpc3BsYXlTdHJpbmddXSI+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8ZGl2IGlkPSJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciI+CiAgICAgIDx0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyCiAgICAgICAgaWQ9ImxvYWRlciIKICAgICAgICBhY3RpdmU9IltbYWN0aXZlXV0iCiAgICAgICAgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIKICAgICAgICBkYXRhLXNlcmllcz0iW1tfc2VyaWVzTmFtZXNdXSIKICAgICAgICBmaWxsLWFyZWE9IltbX2ZpbGxBcmVhXV0iCiAgICAgICAgaWdub3JlLXktb3V0bGllcnM9IltbaWdub3JlWU91dGxpZXJzXV0iCiAgICAgICAgbG9hZC1rZXk9IltbX3RhZ0ZpbHRlcl1dIgogICAgICAgIGRhdGEtdG8tbG9hZD0iW1tydW5zXV0iCiAgICAgICAgcmVxdWVzdC1kYXRhPSJbW19yZXF1ZXN0RGF0YV1dIgogICAgICAgIGxvZy1zY2FsZS1hY3RpdmU9IltbX2xvZ1NjYWxlQWN0aXZlXV0iCiAgICAgICAgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKG1hcmdpbkNoYXJ0U2VyaWVzKV1dIgogICAgICAgIHJlcXVlc3QtbWFuYWdlcj0iW1tyZXF1ZXN0TWFuYWdlcl1dIgogICAgICAgIHN5bWJvbC1mdW5jdGlvbj0iW1tfY3JlYXRlU3ltYm9sRnVuY3Rpb24oKV1dIgogICAgICAgIHRvb2x0aXAtY29sdW1ucz0iW1tfdG9vbHRpcENvbHVtbnNdXSIKICAgICAgICB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iCiAgICAgICAgeC10eXBlPSJbW3hUeXBlXV0iCiAgICAgID4KICAgICAgPC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJidXR0b25zIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIgogICAgICAgIGljb249ImZ1bGxzY3JlZW4iCiAgICAgICAgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiCiAgICAgID48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICBzZWxlY3RlZCQ9IltbX2xvZ1NjYWxlQWN0aXZlXV0iCiAgICAgICAgaWNvbj0ibGluZS13ZWlnaHQiCiAgICAgICAgb24tdGFwPSJfdG9nZ2xlTG9nU2NhbGUiCiAgICAgICAgdGl0bGU9IlRvZ2dsZSB5LWF4aXMgbG9nIHNjYWxlIgogICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgaWNvbj0ic2V0dGluZ3Mtb3ZlcnNjYW4iCiAgICAgICAgb24tdGFwPSJfcmVzZXREb21haW4iCiAgICAgICAgdGl0bGU9IkZpdCBkb21haW4gdG8gZGF0YSIKICAgICAgPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxzcGFuIHN0eWxlPSJmbGV4LWdyb3c6IDEiPjwvc3Bhbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dEb3dubG9hZExpbmtzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImRvd25sb2FkLWxpbmtzIj4KICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51CiAgICAgICAgICAgIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIgogICAgICAgICAgICBsYWJlbD0ic2VyaWVzIHRvIGRvd25sb2FkIgogICAgICAgICAgICBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWR9fSIKICAgICAgICAgID4KICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgICAgICAgICBpdGVtcz0iW1tfc2VyaWVzTmFtZXNdXSIKICAgICAgICAgICAgICAgIGFzPSJkYXRhU2VyaWVzTmFtZSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSIKICAgICAgICAgICAgICAgICAgPltbZGF0YVNlcmllc05hbWVdXTwvcGFwZXItaXRlbQogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDxhCiAgICAgICAgICAgIGRvd25sb2FkPSJbW19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWRdXS5jc3YiCiAgICAgICAgICAgIGhyZWY9IltbX2NzdlVybChfbmFtZVRvRGF0YVNlcmllcywgX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZCldXSIKICAgICAgICAgICAgPkNTVjwvYQogICAgICAgICAgPgogICAgICAgICAgPGEKICAgICAgICAgICAgZG93bmxvYWQ9IltbX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZF1dLmpzb24iCiAgICAgICAgICAgIGhyZWY9IltbX2pzb25VcmwoX25hbWVUb0RhdGFTZXJpZXMsIF9kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWQpXV0iCiAgICAgICAgICAgID5KU09OPC9hCiAgICAgICAgICA+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KCiAgICA8IS0tIGhlcmUgLS0+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX21pc3NpbmdUYWdzLmxlbmd0aF1dIj4KICAgICAgPGRpdiBjbGFzcz0iY29sbGFwc2libGUtbGlzdC10aXRsZSI+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgICBpY29uPSJbW19nZXRUb2dnbGVDb2xsYXBzaWJsZUljb24oX21pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuZWQpXV0iCiAgICAgICAgICBvbi1jbGljaz0iX3RvZ2dsZU1pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuIgogICAgICAgICAgY2xhc3M9InRvZ2dsZS1jb2xsYXBzaWJsZS1idXR0b24iCiAgICAgICAgPgogICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNvbGxhcHNpYmxlLXRpdGxlLXRleHQiPgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJpY29uczplcnJvciI+PC9pcm9uLWljb24+IE1pc3NpbmcgVGFncwogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZF1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJlcnJvci1jb250ZW50Ij4KICAgICAgICAgIDxpcm9uLWljb24gY2xhc3M9ImVycm9yLWljb24iIGljb249Imljb25zOmVycm9yIj48L2lyb24taWNvbj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX21pc3NpbmdUYWdzXV0iIGFzPSJtaXNzaW5nRW50cnkiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtaXNzaW5nLXRhZ3MtZm9yLXJ1bi1jb250YWluZXIiPgogICAgICAgICAgICAgIFJ1biAiW1ttaXNzaW5nRW50cnkucnVuXV0iIGxhY2tzIGRhdGEgZm9yIHRhZ3MKICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUKICAgICAgICAgICAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgICAgICAgICAgIGl0ZW1zPSJbW21pc3NpbmdFbnRyeS50YWdzXV0iCiAgICAgICAgICAgICAgICAgIGFzPSJ0YWciCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIDxsaT5bW3RhZ11dPC9saT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tY29sbGFwc2U+CiAgICA8L3RlbXBsYXRlPgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdGFnRmlsdGVySW52YWxpZF1dIj4KICAgICAgPGRpdiBjbGFzcz0iZXJyb3ItY29udGVudCI+CiAgICAgICAgPGlyb24taWNvbiBjbGFzcz0iZXJyb3ItaWNvbiIgaWNvbj0iaWNvbnM6ZXJyb3IiPjwvaXJvbi1pY29uPgogICAgICAgIFRoaXMgcmVndWxhciBleHByZXNpb24gaXMgaW52YWxpZDo8YnIgLz4KICAgICAgICA8c3BhbiBjbGFzcz0iaW52YWxpZC1yZWdleCI+W1tfdGFnRmlsdGVyXV08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3N0ZXBzTWlzbWF0Y2hdXSI+CiAgICAgIDxkaXYgY2xhc3M9ImVycm9yLWNvbnRlbnQiPgogICAgICAgIDxpcm9uLWljb24gY2xhc3M9ImVycm9yLWljb24iIGljb249Imljb25zOmVycm9yIj48L2lyb24taWNvbj4KICAgICAgICBUaGUgc3RlcHMgZm9yIHZhbHVlLCBsb3dlciwgYW5kIHVwcGVyIHRhZ3MgZG8gbm90IG1hdGNoOgogICAgICAgIDx1bD4KICAgICAgICAgIDxsaT4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRhZy1uYW1lIj5bW19zdGVwc01pc21hdGNoLnNlcmllc09iamVjdC52YWx1ZV1dPC9zcGFuPjoKICAgICAgICAgICAgW1tfc2VwYXJhdGVXaXRoQ29tbWFzKF9zdGVwc01pc21hdGNoLnZhbHVlU3RlcHMpXV0KICAgICAgICAgIDwvbGk+CiAgICAgICAgICA8bGk+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0YWctbmFtZSI+W1tfc3RlcHNNaXNtYXRjaC5zZXJpZXNPYmplY3QubG93ZXJdXTwvc3Bhbj46CiAgICAgICAgICAgIFtbX3NlcGFyYXRlV2l0aENvbW1hcyhfc3RlcHNNaXNtYXRjaC5sb3dlclN0ZXBzKV1dCiAgICAgICAgICA8L2xpPgogICAgICAgICAgPGxpPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0idGFnLW5hbWUiPltbX3N0ZXBzTWlzbWF0Y2guc2VyaWVzT2JqZWN0LnVwcGVyXV08L3NwYW4+OgogICAgICAgICAgICBbW19zZXBhcmF0ZVdpdGhDb21tYXMoX3N0ZXBzTWlzbWF0Y2gudXBwZXJTdGVwcyldXQogICAgICAgICAgPC9saT4KICAgICAgICA8L3VsPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPGRpdiBpZD0ibWF0Y2hlcy1jb250YWluZXIiPgogICAgICA8ZGl2IGNsYXNzPSJjb2xsYXBzaWJsZS1saXN0LXRpdGxlIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nlcmllc05hbWVzLmxlbmd0aF1dIj4KICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgICAgICBpY29uPSJbW19nZXRUb2dnbGVDb2xsYXBzaWJsZUljb24oX21hdGNoZXNMaXN0T3BlbmVkKV1dIgogICAgICAgICAgICBvbi1jbGljaz0iX3RvZ2dsZU1hdGNoZXNPcGVuIgogICAgICAgICAgICBjbGFzcz0idG9nZ2xlLW1hdGNoZXMtYnV0dG9uIgogICAgICAgICAgPgogICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8c3BhbiBjbGFzcz0iY29sbGFwc2libGUtdGl0bGUtdGV4dCI+CiAgICAgICAgICBNYXRjaGVzIChbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSkKICAgICAgICA8L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nlcmllc05hbWVzLmxlbmd0aF1dIj4KICAgICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9IltbX21hdGNoZXNMaXN0T3BlbmVkXV0iPgogICAgICAgICAgPGRpdiBpZD0ibWF0Y2hlcy1saXN0Ij4KICAgICAgICAgICAgPHRlbXBsYXRlCiAgICAgICAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgICAgICAgaXRlbXM9IltbX3Nlcmllc05hbWVzXV0iCiAgICAgICAgICAgICAgYXM9InNlcmllc05hbWUiCiAgICAgICAgICAgICAgaWQ9Im1hdGNoLWxpc3QtcmVwZWF0IgogICAgICAgICAgICAgIG9uLWRvbS1jaGFuZ2U9Il9tYXRjaExpc3RFbnRyeUNvbG9yVXBkYXRlZCIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1hdGNoLWxpc3QtZW50cnkiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1hdGNoLWVudHJ5LXN5bWJvbCI+CiAgICAgICAgICAgICAgICAgIFtbX2RldGVybWluZVN5bWJvbChfbmFtZVRvRGF0YVNlcmllcywgc2VyaWVzTmFtZSldXQogICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgW1tzZXJpZXNOYW1lXV0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1jdXN0b20tc2NhbGFyLWNhcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5lcnJvci1jb250ZW50IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZjAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBtYXJnaW46IDEwcHggMCAwIDA7CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgfQoKICAgICAgLmVycm9yLWljb24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgICAgbWFyZ2luOiAwIGF1dG8gNXB4IGF1dG87CiAgICAgIH0KCiAgICAgIC5pbnZhbGlkLXJlZ2V4IHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQoKICAgICAgLmVycm9yLWNvbnRlbnQgdWwgewogICAgICAgIG1hcmdpbjogMXB4IDAgMCAwOwogICAgICAgIHBhZGRpbmc6IDAgMCAwIDE5cHg7CiAgICAgIH0KCiAgICAgIC50YWctbmFtZSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5jb2xsYXBzaWJsZS1saXN0LXRpdGxlIHsKICAgICAgICBtYXJnaW46IDEwcHggMCA1cHggMDsKICAgICAgfQoKICAgICAgLmNvbGxhcHNpYmxlLXRpdGxlLXRleHQgewogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgICNtYXRjaGVzLWxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIC5tYXRjaC1saXN0LWVudHJ5IHsKICAgICAgICBtYXJnaW46IDAgMCA1cHggMDsKICAgICAgfQoKICAgICAgLm1hdGNoLWVudHJ5LXN5bWJvbCB7CiAgICAgICAgZm9udC1mYW1pbHk6IGFyaWFsLCBzYW5zLXNlcmlmOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgfQoKICAgICAgLm1pc3NpbmctdGFncy1mb3ItcnVuLWNvbnRhaW5lciB7CiAgICAgICAgbWFyZ2luOiA4cHggMCAwIDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sd0N0LnByb3RvdHlwZSwicnVucyIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx3Q3QucHJvdG90eXBlLCJ4VHlwZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLHdDdC5wcm90b3R5cGUsImFjdGl2ZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx3Q3QucHJvdG90eXBlLCJ0aXRsZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sd0N0LnByb3RvdHlwZSwibWFyZ2luQ2hhcnRTZXJpZXMiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSx3Q3QucHJvdG90eXBlLCJpZ25vcmVZT3V0bGllcnMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsZHIpXSx3Q3QucHJvdG90eXBlLCJyZXF1ZXN0TWFuYWdlciIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLHdDdC5wcm90b3R5cGUsInNob3dEb3dubG9hZExpbmtzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHdDdC5wcm90b3R5cGUsInRhZ01ldGFkYXRhIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHdDdC5wcm90b3R5cGUsInRvb2x0aXBTb3J0aW5nTWV0aG9kIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHdDdC5wcm90b3R5cGUsIl9jb2xvclNjYWxlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sd0N0LnByb3RvdHlwZSwiX3RhZ0ZpbHRlckludmFsaWQiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sd0N0LnByb3RvdHlwZSwiX25hbWVUb0RhdGFTZXJpZXMiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sd0N0LnByb3RvdHlwZSwiX2V4cGFuZGVkIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sd0N0LnByb3RvdHlwZSwiX2xvZ1NjYWxlQWN0aXZlIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKV0sd0N0LnByb3RvdHlwZSwiX3JlcXVlc3REYXRhIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHdDdC5wcm90b3R5cGUsIl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLHdDdC5wcm90b3R5cGUsIl9tYXRjaGVzTGlzdE9wZW5lZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSx3Q3QucHJvdG90eXBlLCJfZmlsbEFyZWEiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLHdDdC5wcm90b3R5cGUsIl90b29sdGlwQ29sdW1ucyIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sd0N0LnByb3RvdHlwZSwiX21pc3NpbmdUYWdzIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sd0N0LnByb3RvdHlwZSwiX21pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuZWQiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sd0N0LnByb3RvdHlwZSwiX3N0ZXBzTWlzbWF0Y2giLHZvaWQgMCksdChbYSgiX25hbWVUb0RhdGFTZXJpZXMiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLHdDdC5wcm90b3R5cGUsIl91cGRhdGVDaGFydCIsbnVsbCksdChbcygiX25hbWVUb0RhdGFTZXJpZXMiLCJydW5zIiksZSgiZGVzaWduOnR5cGUiLE9iamVjdCksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sd0N0LnByb3RvdHlwZSwiX3Nlcmllc05hbWVzIixudWxsKSx0KFthKCJfdGFnRmlsdGVyIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSx3Q3QucHJvdG90eXBlLCJfcmVmcmVzaERhdGFTZXJpZXMiLG51bGwpLHQoW3MoIm1hcmdpbkNoYXJ0U2VyaWVzIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sd0N0LnByb3RvdHlwZSwiX3RhZ0ZpbHRlciIsbnVsbCksdChbcygidGl0bGUiKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSx3Q3QucHJvdG90eXBlLCJfdGl0bGVEaXNwbGF5U3RyaW5nIixudWxsKSx3Q3Q9dChbaSgidGYtY3VzdG9tLXNjYWxhci1tYXJnaW4tY2hhcnQtY2FyZCIpXSx3Q3QpO3ZhciBTQ3Q9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsVFlQRVM6W10sZ2V0UnVuc05hbWVkOmZ1bmN0aW9uIE1DdCh0KXtyZXR1cm4gU2UuZXhwb3J0cy5rZXlzKHQpLnNvcnQobnIpfSxnZXRUYWdzOmFyLGZpbHRlclRhZ3M6ZnVuY3Rpb24gRUN0KHQsZSl7bGV0IG49W107cmV0dXJuIGUuZm9yRWFjaCgoZT0+bj1uLmNvbmNhdCh0W2VdKSkpLFNlLmV4cG9ydHMudW5pcShuKS5zb3J0KG5yKX0sTGlzdGVuS2V5OmZsLEJhc2VTdG9yZTptbCxDYW5jZWxsZXI6WFIsRW52aXJvbm1lbnRTdG9yZTpnbCxlbnZpcm9ubWVudFN0b3JlOl9sLEV4cGVyaW1lbnRzU3RvcmU6RlIsZXhwZXJpbWVudHNTdG9yZTpWUixSZXF1ZXN0Q2FuY2VsbGF0aW9uRXJyb3I6c3IsSW52YWxpZFJlcXVlc3RPcHRpb25zRXJyb3I6bHIsUmVxdWVzdE5ldHdvcmtFcnJvcjpjcixnZXQgSHR0cE1ldGhvZFR5cGUoKXtyZXR1cm4gdXJ9LFJlcXVlc3RPcHRpb25zOmhyLFJlcXVlc3RNYW5hZ2VyOmRyLGNyZWF0ZVJvdXRlcjpncixnZXRSb3V0ZXI6X3Isc2V0Um91dGVyOmZ1bmN0aW9uIFRDdCh0KXtpZihudWxsPT10KXRocm93IG5ldyBFcnJvcigiUm91dGVyIHJlcXVpcmVkLCBidXQgZ290OiAiK3QpO21yPXR9LGNyZWF0ZVNlYXJjaFBhcmFtOnZyLFJ1bnNTdG9yZTp5bCxydW5zU3RvcmU6dmwsYWRkUGFyYW1zOmlPfSk7bGV0IENDdD1jbGFzcyBleHRlbmRzKGVyKHllKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuYWN0aXZlPSEwLHRoaXMuX2NvbG9yU2NhbGU9bmV3IHhDdCh7c2NhbGU6R1J9KSx0aGlzLl9uYW1lVG9EYXRhU2VyaWVzPXt9LHRoaXMuX2V4cGFuZGVkPSExLHRoaXMuX3JlcXVlc3REYXRhPSh0LGUsbik9Pntjb25zdCBpPV9yKCkucGx1Z2luUm91dGUoImN1c3RvbV9zY2FsYXJzIiwiL3NjYWxhcnMiKTtQcm9taXNlLmFsbCh0Lm1hcCgodD0+e2NvbnN0IG49aU8oaSx7dGFnOnRoaXMuX3RhZ0ZpbHRlcixydW46dH0pO3JldHVybiB0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QobikudGhlbigobj0+e2Uoe2l0ZW06dCxkYXRhOm59KX0pKX0pKSkuZmluYWxseSgoKCk9PntuKCl9KSl9LHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4PXt9LHRoaXMuX21hdGNoZXNMaXN0T3BlbmVkPSExfXJlbG9hZCgpe3RoaXMuJC5sb2FkZXIucmVsb2FkKCl9cmVkcmF3KCl7dGhpcy4kLmxvYWRlci5yZWRyYXcoKX1fdG9nZ2xlRXhwYW5kZWQodCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKSx0aGlzLnJlZHJhdygpfV90b2dnbGVMb2dTY2FsZSgpe3RoaXMuc2V0KCJfbG9nU2NhbGVBY3RpdmUiLCF0aGlzLl9sb2dTY2FsZUFjdGl2ZSl9X3Jlc2V0RG9tYWluKCl7Y29uc3QgdD10aGlzLiQubG9hZGVyO3QmJnQucmVzZXREb21haW4oKX1fY3N2VXJsKHQsZSl7cmV0dXJuIGU/aU8odGhpcy5fZG93bmxvYWREYXRhVXJsKHQsZSkse2Zvcm1hdDoiY3N2In0pOiIifV9qc29uVXJsKHQsZSl7cmV0dXJuIGU/aU8odGhpcy5fZG93bmxvYWREYXRhVXJsKHQsZSkse2Zvcm1hdDoianNvbiJ9KToiIn1fZG93bmxvYWREYXRhVXJsKHQsZSl7Y29uc3Qgbj10W2VdLGk9e3RhZzpuLmdldFRhZygpLHJ1bjpuLmdldFJ1bigpfTtyZXR1cm4gaU8oX3IoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvZG93bmxvYWRfZGF0YSIpLGkpfV9jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKCl7cmV0dXJuKHQsZSxuKT0+e2lmKG4ucmVnZXhfdmFsaWQpe2NvbnN0IHQ9U2UuZXhwb3J0cy5jbG9uZSh0aGlzLl9uYW1lVG9EYXRhU2VyaWVzKTtTZS5leHBvcnRzLmZvck93bihuLnRhZ190b19ldmVudHMsKChuLGkpPT57Y29uc3Qgcj1uLm1hcCgodD0+KHt3YWxsX3RpbWU6bmV3IERhdGUoMWUzKnRbMF0pLHN0ZXA6dFsxXSxzY2FsYXI6dFsyXX0pKSksbz1iQ3QoZSxpKSxhPXRbb107aWYoYSlhLnNldERhdGEocik7ZWxzZXtTZS5leHBvcnRzLmlzVW5kZWZpbmVkKHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2VdKSYmKHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2VdPTApO2NvbnN0IG49bmV3IHZDdChlLGksbyxyLGJUdFt0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtlXV0pO3Rbb109bix0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtlXT0odGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbZV0rMSklYlR0Lmxlbmd0aH19KSksdGhpcy5zZXQoIl9uYW1lVG9EYXRhU2VyaWVzIix0KX19fV91cGRhdGVDaGFydCgpe09iamVjdC5lbnRyaWVzKHRoaXMuX25hbWVUb0RhdGFTZXJpZXMpLmZvckVhY2goKChbdCxlXSk9Pnt0aGlzLiQubG9hZGVyLnNldFNlcmllc0RhdGEodCxlLmdldERhdGEoKSl9KSksdGhpcy4kLmxvYWRlci5jb21taXRDaGFuZ2VzKCl9X2NvbXB1dGVTZWxlY3RlZFJ1bnNTZXQodCl7Y29uc3QgZT17fTtyZXR1cm4gU2UuZXhwb3J0cy5mb3JFYWNoKHQsKHQ9PntlW3RdPTF9KSksZX1nZXQgX3Nlcmllc05hbWVzKCl7Y29uc3QgdD1uZXcgU2V0KHRoaXMucnVucyk7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuX25hbWVUb0RhdGFTZXJpZXMpLmZpbHRlcigoKFtlLG5dKT0+dC5oYXMobi5ydW4pKSkubWFwKCgoW3RdKT0+dCkpfV9kZXRlcm1pbmVDb2xvcih0LGUpe3JldHVybiB0LnNjYWxlKGUpfV9yZWZyZXNoRGF0YVNlcmllcygpe3RoaXMuc2V0KCJfbmFtZVRvRGF0YVNlcmllcyIse30pfV9jcmVhdGVTeW1ib2xGdW5jdGlvbigpe3JldHVybiB0PT50aGlzLl9uYW1lVG9EYXRhU2VyaWVzW3RdLmdldFN5bWJvbCgpLm1ldGhvZCgpfV9kZXRlcm1pbmVTeW1ib2wodCxlKXtyZXR1cm4gdFtlXS5nZXRTeW1ib2woKS5jaGFyYWN0ZXJ9Z2V0IF90YWdGaWx0ZXIoKXt2YXIgdD10aGlzLnRhZ1JlZ2V4ZXM7cmV0dXJuIDE9PT10Lmxlbmd0aD90WzBdOnQubWFwKCh0PT4iKCIrdCsiKSIpKS5qb2luKCJ8Iil9X2dldFRvZ2dsZU1hdGNoZXNJY29uKHQpe3JldHVybiB0PyJleHBhbmQtbGVzcyI6ImV4cGFuZC1tb3JlIn1fdG9nZ2xlTWF0Y2hlc09wZW4oKXt0aGlzLnNldCgiX21hdGNoZXNMaXN0T3BlbmVkIiwhdGhpcy5fbWF0Y2hlc0xpc3RPcGVuZWQpfWdldCBfdGl0bGVEaXNwbGF5U3RyaW5nKCl7cmV0dXJuIHRoaXMudGl0bGV8fCJ1bnRpdGxlZCJ9X21hdGNoTGlzdEVudHJ5Q29sb3JVcGRhdGVkKHQpe2NvbnN0IGU9dGhpcy4kJCgiI21hdGNoLWxpc3QtcmVwZWF0Iik7ZSYmdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5tYXRjaC1saXN0LWVudHJ5IikuZm9yRWFjaCgodD0+e2NvbnN0IG49ZS5pdGVtRm9yRWxlbWVudCh0KTt0LnN0eWxlLmNvbG9yPXRoaXMuX2RldGVybWluZUNvbG9yKHRoaXMuX2NvbG9yU2NhbGUsbil9KSl9fTtDQ3QudGVtcGxhdGU9X2VgCiAgICA8dGYtY2FyZC1oZWFkaW5nIGRpc3BsYXktbmFtZT0iW1tfdGl0bGVEaXNwbGF5U3RyaW5nXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgPGRpdiBpZD0idGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIiPgogICAgICA8dGYtbGluZS1jaGFydC1kYXRhLWxvYWRlcgogICAgICAgIGlkPSJsb2FkZXIiCiAgICAgICAgYWN0aXZlPSJbW2FjdGl2ZV1dIgogICAgICAgIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlXV0iCiAgICAgICAgZGF0YS1zZXJpZXM9IltbX3Nlcmllc05hbWVzXV0iCiAgICAgICAgaWdub3JlLXktb3V0bGllcnM9IltbaWdub3JlWU91dGxpZXJzXV0iCiAgICAgICAgbG9hZC1rZXk9IltbX3RhZ0ZpbHRlcl1dIgogICAgICAgIGRhdGEtdG8tbG9hZD0iW1tydW5zXV0iCiAgICAgICAgcmVxdWVzdC1kYXRhPSJbW19yZXF1ZXN0RGF0YV1dIgogICAgICAgIGxvZy1zY2FsZS1hY3RpdmU9IltbX2xvZ1NjYWxlQWN0aXZlXV0iCiAgICAgICAgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKCldXSIKICAgICAgICByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgICBzbW9vdGhpbmctZW5hYmxlZD0iW1tzbW9vdGhpbmdFbmFibGVkXV0iCiAgICAgICAgc21vb3RoaW5nLXdlaWdodD0iW1tzbW9vdGhpbmdXZWlnaHRdXSIKICAgICAgICBzeW1ib2wtZnVuY3Rpb249IltbX2NyZWF0ZVN5bWJvbEZ1bmN0aW9uKCldXSIKICAgICAgICB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iCiAgICAgICAgeC10eXBlPSJbW3hUeXBlXV0iCiAgICAgID4KICAgICAgPC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJidXR0b25zIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIgogICAgICAgIGljb249ImZ1bGxzY3JlZW4iCiAgICAgICAgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiCiAgICAgID48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICBzZWxlY3RlZCQ9IltbX2xvZ1NjYWxlQWN0aXZlXV0iCiAgICAgICAgaWNvbj0ibGluZS13ZWlnaHQiCiAgICAgICAgb24tdGFwPSJfdG9nZ2xlTG9nU2NhbGUiCiAgICAgICAgdGl0bGU9IlRvZ2dsZSB5LWF4aXMgbG9nIHNjYWxlIgogICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgaWNvbj0ic2V0dGluZ3Mtb3ZlcnNjYW4iCiAgICAgICAgb24tdGFwPSJfcmVzZXREb21haW4iCiAgICAgICAgdGl0bGU9IkZpdCBkb21haW4gdG8gZGF0YSIKICAgICAgPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxzcGFuIHN0eWxlPSJmbGV4LWdyb3c6IDEiPjwvc3Bhbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dEb3dubG9hZExpbmtzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImRvd25sb2FkLWxpbmtzIj4KICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51CiAgICAgICAgICAgIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIgogICAgICAgICAgICBsYWJlbD0ic2VyaWVzIHRvIGRvd25sb2FkIgogICAgICAgICAgICBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWR9fSIKICAgICAgICAgID4KICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgICAgICAgICBpdGVtcz0iW1tfc2VyaWVzTmFtZXNdXSIKICAgICAgICAgICAgICAgIGFzPSJkYXRhU2VyaWVzTmFtZSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSIKICAgICAgICAgICAgICAgICAgPltbZGF0YVNlcmllc05hbWVdXTwvcGFwZXItaXRlbQogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDxhCiAgICAgICAgICAgIGRvd25sb2FkPSJbW19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWRdXS5jc3YiCiAgICAgICAgICAgIGhyZWY9IltbX2NzdlVybChfbmFtZVRvRGF0YVNlcmllcywgX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZCldXSIKICAgICAgICAgICAgPkNTVjwvYQogICAgICAgICAgPgogICAgICAgICAgPGEKICAgICAgICAgICAgZG93bmxvYWQ9IltbX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZF1dLmpzb24iCiAgICAgICAgICAgIGhyZWY9IltbX2pzb25VcmwoX25hbWVUb0RhdGFTZXJpZXMsIF9kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWQpXV0iCiAgICAgICAgICAgID5KU09OPC9hCiAgICAgICAgICA+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9Im1hdGNoZXMtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0ibWF0Y2hlcy1saXN0LXRpdGxlIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nlcmllc05hbWVzLmxlbmd0aF1dIj4KICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgICAgICBpY29uPSJbW19nZXRUb2dnbGVNYXRjaGVzSWNvbihfbWF0Y2hlc0xpc3RPcGVuZWQpXV0iCiAgICAgICAgICAgIG9uLWNsaWNrPSJfdG9nZ2xlTWF0Y2hlc09wZW4iCiAgICAgICAgICAgIGNsYXNzPSJ0b2dnbGUtbWF0Y2hlcy1idXR0b24iCiAgICAgICAgICA+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgIDxzcGFuIGNsYXNzPSJtYXRjaGVzLXRleHQiPiBNYXRjaGVzIChbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSkgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSI+CiAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW19tYXRjaGVzTGlzdE9wZW5lZF1dIj4KICAgICAgICAgIDxkaXYgaWQ9Im1hdGNoZXMtbGlzdCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgICAgIGlzPSJkb20tcmVwZWF0IgogICAgICAgICAgICAgIGl0ZW1zPSJbW19zZXJpZXNOYW1lc11dIgogICAgICAgICAgICAgIGFzPSJzZXJpZXNOYW1lIgogICAgICAgICAgICAgIGlkPSJtYXRjaC1saXN0LXJlcGVhdCIKICAgICAgICAgICAgICBvbi1kb20tY2hhbmdlPSJfbWF0Y2hMaXN0RW50cnlDb2xvclVwZGF0ZWQiCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYXRjaC1saXN0LWVudHJ5Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtYXRjaC1lbnRyeS1zeW1ib2wiPgogICAgICAgICAgICAgICAgICBbW19kZXRlcm1pbmVTeW1ib2woX25hbWVUb0RhdGFTZXJpZXMsIHNlcmllc05hbWUpXV0KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgIFtbc2VyaWVzTmFtZV1dCiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY3VzdG9tLXNjYWxhci1jYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAjbWF0Y2hlcy1saXN0LXRpdGxlIHsKICAgICAgICBtYXJnaW46IDEwcHggMCA1cHggMDsKICAgICAgfQoKICAgICAgI21hdGNoZXMtbGlzdCB7CiAgICAgICAgbWF4LWhlaWdodDogMjAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgLm1hdGNoLWxpc3QtZW50cnkgewogICAgICAgIG1hcmdpbjogMCAwIDVweCAwOwogICAgICB9CgogICAgICAubWF0Y2gtZW50cnktc3ltYm9sIHsKICAgICAgICBmb250LWZhbWlseTogYXJpYWwsIHNhbnMtc2VyaWY7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICB9CgogICAgICAubWF0Y2hlcy10ZXh0IHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLENDdC5wcm90b3R5cGUsInJ1bnMiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sQ0N0LnByb3RvdHlwZSwieFR5cGUiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxDQ3QucHJvdG90eXBlLCJhY3RpdmUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sQ0N0LnByb3RvdHlwZSwidGl0bGUiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLENDdC5wcm90b3R5cGUsInRhZ1JlZ2V4ZXMiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxDQ3QucHJvdG90eXBlLCJpZ25vcmVZT3V0bGllcnMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsZHIpXSxDQ3QucHJvdG90eXBlLCJyZXF1ZXN0TWFuYWdlciIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLENDdC5wcm90b3R5cGUsInNob3dEb3dubG9hZExpbmtzIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sQ0N0LnByb3RvdHlwZSwic21vb3RoaW5nRW5hYmxlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxDQ3QucHJvdG90eXBlLCJzbW9vdGhpbmdXZWlnaHQiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sQ0N0LnByb3RvdHlwZSwidGFnTWV0YWRhdGEiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sQ0N0LnByb3RvdHlwZSwidG9vbHRpcFNvcnRpbmdNZXRob2QiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIseEN0KV0sQ0N0LnByb3RvdHlwZSwiX2NvbG9yU2NhbGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sQ0N0LnByb3RvdHlwZSwiX25hbWVUb0RhdGFTZXJpZXMiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sQ0N0LnByb3RvdHlwZSwiX2V4cGFuZGVkIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sQ0N0LnByb3RvdHlwZSwiX2xvZ1NjYWxlQWN0aXZlIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKV0sQ0N0LnByb3RvdHlwZSwiX3JlcXVlc3REYXRhIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLENDdC5wcm90b3R5cGUsIl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLENDdC5wcm90b3R5cGUsIl9tYXRjaGVzTGlzdE9wZW5lZCIsdm9pZCAwKSx0KFthKCJfbmFtZVRvRGF0YVNlcmllcyIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sQ0N0LnByb3RvdHlwZSwiX3VwZGF0ZUNoYXJ0IixudWxsKSx0KFtzKCJfbmFtZVRvRGF0YVNlcmllcyIsInJ1bnMiKSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxDQ3QucHJvdG90eXBlLCJfc2VyaWVzTmFtZXMiLG51bGwpLHQoW2EoIl90YWdGaWx0ZXIiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLENDdC5wcm90b3R5cGUsIl9yZWZyZXNoRGF0YVNlcmllcyIsbnVsbCksdChbcygidGFnUmVnZXhlcyIpLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLENDdC5wcm90b3R5cGUsIl90YWdGaWx0ZXIiLG51bGwpLHQoW3MoInRpdGxlIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sQ0N0LnByb3RvdHlwZSwiX3RpdGxlRGlzcGxheVN0cmluZyIsbnVsbCksQ0N0PXQoW2koInRmLWN1c3RvbS1zY2FsYXItbXVsdGktbGluZS1jaGFydC1jYXJkIildLENDdCk7bGV0IEFDdD1jbGFzcyBleHRlbmRzIHlle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9yZXF1ZXN0TWFuYWdlcj1uZXcgZHIoNTApLHRoaXMuX2NhbmNlbGxlcj1uZXcgWFIsdGhpcy5fc2hvd0Rvd25sb2FkTGlua3M9SHMoIl9zaG93RG93bmxvYWRMaW5rcyIse2RlZmF1bHRWYWx1ZTohMSx1c2VMb2NhbFN0b3JhZ2U6ITB9KS5jYWxsKHRoaXMpLHRoaXMuX3Ntb290aGluZ1dlaWdodD1HcygiX3Ntb290aGluZ1dlaWdodCIse2RlZmF1bHRWYWx1ZTouNn0pLmNhbGwodGhpcyksdGhpcy5faWdub3JlWU91dGxpZXJzPUhzKCJfaWdub3JlWU91dGxpZXJzIix7ZGVmYXVsdFZhbHVlOiEwLHVzZUxvY2FsU3RvcmFnZTohMH0pLmNhbGwodGhpcyksdGhpcy5feFR5cGU9InN0ZXAiLHRoaXMuX2FjdGl2ZT0hMCx0aGlzLnJlbG9hZE9uUmVhZHk9ITAsdGhpcy5fc2hvd0Rvd25sb2FkTGlua3NPYnNlcnZlcj1GcygiX3Nob3dEb3dubG9hZExpbmtzIix7ZGVmYXVsdFZhbHVlOiExLHVzZUxvY2FsU3RvcmFnZTohMH0pLHRoaXMuX3Ntb290aGluZ1dlaWdodE9ic2VydmVyPVdzKCJfc21vb3RoaW5nV2VpZ2h0Iix7ZGVmYXVsdFZhbHVlOi42fSksdGhpcy5faWdub3JlWU91dGxpZXJzT2JzZXJ2ZXI9RnMoIl9pZ25vcmVZT3V0bGllcnMiLHtkZWZhdWx0VmFsdWU6ITAsdXNlTG9jYWxTdG9yYWdlOiEwfSl9cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMucmVsb2FkT25SZWFkeSYmdGhpcy5yZWxvYWQoKX1yZWxvYWQoKXtjb25zdCB0PV9yKCkucGx1Z2luc0xpc3RpbmcoKSxlPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZSgodD0+e3QuY2FuY2VsbGVkfHwodGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLCF0LnZhbHVlLmN1c3RvbV9zY2FsYXJzKSx0aGlzLl9kYXRhTm90Rm91bmR8fHRoaXMuX3JldHJpZXZlTGF5b3V0QW5kRGF0YSgpKX0pKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHQpLnRoZW4oZSl9X3JlbG9hZENoYXJ0cygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkLCB0Zi1jdXN0b20tc2NhbGFyLW11bHRpLWxpbmUtY2hhcnQtY2FyZCIpLmZvckVhY2goKHQ9Pnt0LnJlbG9hZCgpfSkpfV9yZXRyaWV2ZUxheW91dEFuZERhdGEoKXtjb25zdCB0PV9yKCkucGx1Z2luUm91dGUoImN1c3RvbV9zY2FsYXJzIiwiL2xheW91dCIpLGU9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKCh0PT57dC5jYW5jZWxsZWR8fCh0aGlzLnNldCgiX2xheW91dCIsdC52YWx1ZSksdGhpcy5fZGF0YU5vdEZvdW5kfHx0aGlzLl9yZWxvYWRDaGFydHMoKSl9KSk7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0KS50aGVuKGUpfWdldCBfc21vb3RoaW5nRW5hYmxlZCgpe3JldHVybiB0aGlzLl9zbW9vdGhpbmdXZWlnaHQ+MH1nZXQgX2NhdGVnb3JpZXMoKXt2YXIgdD10aGlzLl9sYXlvdXQ7aWYoIXQuY2F0ZWdvcnkpcmV0dXJuW107bGV0IGU9ITE7cmV0dXJuIHRoaXMuX29wZW5lZENhdGVnb3JpZXN8fChlPSEwLHRoaXMuX29wZW5lZENhdGVnb3JpZXM9e30pLHQuY2F0ZWdvcnkubWFwKCh0PT4oZSYmIXQuY2xvc2VkJiYodGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1t0LnRpdGxlXT0hMCkse25hbWU6dC50aXRsZSxpdGVtczp0LmNoYXJ0LG1ldGFkYXRhOnt0eXBlOmJyLlBSRUZJWF9HUk9VUCxvcGVuZWQ6ISF0aGlzLl9vcGVuZWRDYXRlZ29yaWVzW3QudGl0bGVdfX0pKSl9X2NhdGVnb3J5T3BlbmVkVG9nZ2xlZCh0KXtjb25zdCBlPXQudGFyZ2V0O2Uub3BlbmVkP3RoaXMuX29wZW5lZENhdGVnb3JpZXNbZS5jYXRlZ29yeS5uYW1lXT0hMDpkZWxldGUgdGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1tlLmNhdGVnb3J5Lm5hbWVdfX07QUN0LnRlbXBsYXRlPV9lYAogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxpbmUtaXRlbSI+CiAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7X3Nob3dEb3dubG9hZExpbmtzfX0iCiAgICAgICAgICAgICAgICA+U2hvdyBkYXRhIGRvd25sb2FkIGxpbmtzPC9wYXBlci1jaGVja2JveAogICAgICAgICAgICAgID4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxpbmUtaXRlbSI+CiAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7X2lnbm9yZVlPdXRsaWVyc319IgogICAgICAgICAgICAgICAgPklnbm9yZSBvdXRsaWVycyBpbiBjaGFydCBzY2FsaW5nPC9wYXBlci1jaGVja2JveAogICAgICAgICAgICAgID4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZyI+CiAgICAgICAgICAgICAgPGRpdiBpZD0idG9vbHRpcC1zb3J0aW5nLWxhYmVsIj5Ub29sdGlwIHNvcnRpbmcgbWV0aG9kOjwvZGl2PgogICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51CiAgICAgICAgICAgICAgICBuby1sYWJlbC1mbG9hdD0iIgogICAgICAgICAgICAgICAgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfdG9vbHRpcFNvcnRpbmdNZXRob2R9fSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveAogICAgICAgICAgICAgICAgICBjbGFzcz0iZHJvcGRvd24tY29udGVudCIKICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ9IjAiCiAgICAgICAgICAgICAgICAgIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlZmF1bHQ8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlc2NlbmRpbmc8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmFzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bmVhcmVzdDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8dGYtc21vb3RoaW5nLWlucHV0CiAgICAgICAgICAgICAgd2VpZ2h0PSJ7e19zbW9vdGhpbmdXZWlnaHR9fSIKICAgICAgICAgICAgICBzdGVwPSIwLjAwMSIKICAgICAgICAgICAgICBtaW49IjAiCiAgICAgICAgICAgICAgbWF4PSIxIgogICAgICAgICAgICA+PC90Zi1zbW9vdGhpbmctaW5wdXQ+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IKICAgICAgICAgICAgICBpZD0ieC10eXBlLXNlbGVjdG9yIgogICAgICAgICAgICAgIG5hbWU9Ikhvcml6b250YWwgQXhpcyIKICAgICAgICAgICAgICBzZWxlY3RlZC1pZD0ie3tfeFR5cGV9fSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InN0ZXAiPnN0ZXA8L3BhcGVyLWJ1dHRvbgogICAgICAgICAgICAgID48IS0tCiAgICAgICAgICAgIC0tPjxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgPjwhLS0KICAgICAgICAgICAgLS0+PHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiIGlkPSJjYXRlZ29yaWVzLWNvbnRhaW5lciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+VGhlIGN1c3RvbSBzY2FsYXJzIGRhc2hib2FyZCBpcyBpbmFjdGl2ZS48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6PC9wPgogICAgICAgICAgICA8b2w+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbid0IGxhaWQgb3V0IHRoZSBkYXNoYm9hcmQuPC9saT4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBzY2FsYXIgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvb2w+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBUbyBsYXkgb3V0IHRoZSBkYXNoYm9hcmQsIHBhc3MgYSA8Y29kZT5MYXlvdXQ8L2NvZGU+IHByb3RvYnVmZmVyCiAgICAgICAgICAgICAgdG8gdGhlIDxjb2RlPnNldF9sYXlvdXQ8L2NvZGU+IG1ldGhvZC4gRm9yIGV4YW1wbGUsCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgPHByZT4KZnJvbSB0ZW5zb3Jib2FyZCBpbXBvcnQgc3VtbWFyeQpmcm9tIHRlbnNvcmJvYXJkLnBsdWdpbnMuY3VzdG9tX3NjYWxhciBpbXBvcnQgbGF5b3V0X3BiMgouLi4KIyBUaGlzIGFjdGlvbiBkb2VzIG5vdCBoYXZlIHRvIGJlIHBlcmZvcm1lZCBhdCBldmVyeSBzdGVwLCBzbyB0aGUgYWN0aW9uIGlzIG5vdAojIHRha2VuIGNhcmUgb2YgYnkgYW4gb3AgaW4gdGhlIGdyYXBoLiBXZSBvbmx5IG5lZWQgdG8gc3BlY2lmeSB0aGUgbGF5b3V0IG9uY2UKIyAoaW5zdGVhZCBvZiBwZXIgc3RlcCkuCmxheW91dF9zdW1tYXJ5ID0gc3VtbWFyeV9saWIuY3VzdG9tX3NjYWxhcl9wYihsYXlvdXRfcGIyLkxheW91dCgKICBjYXRlZ29yeT1bCiAgICBsYXlvdXRfcGIyLkNhdGVnb3J5KAogICAgICB0aXRsZT0nbG9zc2VzJywKICAgICAgY2hhcnQ9WwogICAgICAgICAgbGF5b3V0X3BiMi5DaGFydCgKICAgICAgICAgICAgICB0aXRsZT0nbG9zc2VzJywKICAgICAgICAgICAgICBtdWx0aWxpbmU9bGF5b3V0X3BiMi5NdWx0aWxpbmVDaGFydENvbnRlbnQoCiAgICAgICAgICAgICAgICB0YWc9W3InbG9zcy4qJ10sCiAgICAgICAgICAgICAgKSksCiAgICAgICAgICBsYXlvdXRfcGIyLkNoYXJ0KAogICAgICAgICAgICAgIHRpdGxlPSdiYXonLAogICAgICAgICAgICAgIG1hcmdpbj1sYXlvdXRfcGIyLk1hcmdpbkNoYXJ0Q29udGVudCgKICAgICAgICAgICAgICAgIHNlcmllcz1bCiAgICAgICAgICAgICAgICAgIGxheW91dF9wYjIuTWFyZ2luQ2hhcnRDb250ZW50LlNlcmllcygKICAgICAgICAgICAgICAgICAgICB2YWx1ZT0nbG9zcy9iYXovc2NhbGFyX3N1bW1hcnknLAogICAgICAgICAgICAgICAgICAgIGxvd2VyPSdiYXpfbG93ZXIvYmF6L3NjYWxhcl9zdW1tYXJ5JywKICAgICAgICAgICAgICAgICAgICB1cHBlcj0nYmF6X3VwcGVyL2Jhei9zY2FsYXJfc3VtbWFyeScpLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICApKSwKICAgICAgXSksCiAgICBsYXlvdXRfcGIyLkNhdGVnb3J5KAogICAgICB0aXRsZT0ndHJpZyBmdW5jdGlvbnMnLAogICAgICBjaGFydD1bCiAgICAgICAgICBsYXlvdXRfcGIyLkNoYXJ0KAogICAgICAgICAgICAgIHRpdGxlPSd3YXZlIHRyaWcgZnVuY3Rpb25zJywKICAgICAgICAgICAgICBtdWx0aWxpbmU9bGF5b3V0X3BiMi5NdWx0aWxpbmVDaGFydENvbnRlbnQoCiAgICAgICAgICAgICAgICB0YWc9W3IndHJpZ0Z1bmN0aW9ucy9jb3NpbmUnLCByJ3RyaWdGdW5jdGlvbnMvc2luZSddLAogICAgICAgICAgICAgICkpLAogICAgICAgICAgIyBUaGUgcmFuZ2Ugb2YgdGFuZ2VudCBpcyBkaWZmZXJlbnQuIExldCdzIGdpdmUgaXQgaXRzIG93biBjaGFydC4KICAgICAgICAgIGxheW91dF9wYjIuQ2hhcnQoCiAgICAgICAgICAgICAgdGl0bGU9J3RhbicsCiAgICAgICAgICAgICAgbXVsdGlsaW5lPWxheW91dF9wYjIuTXVsdGlsaW5lQ2hhcnRDb250ZW50KAogICAgICAgICAgICAgICAgdGFnPVtyJ3RyaWdGdW5jdGlvbnMvdGFuZ2VudCddLAogICAgICAgICAgICAgICkpLAogICAgICBdLAogICAgICAjIFRoaXMgY2F0ZWdvcnkgd2UgY2FyZSBsZXNzIGFib3V0LiBMZXQncyBtYWtlIGl0IGluaXRpYWxseSBjbG9zZWQuCiAgICAgIGNsb3NlZD1UcnVlKSwKICBdKSkKd3JpdGVyLmFkZF9zdW1tYXJ5KGxheW91dF9zdW1tYXJ5KQo8L3ByZQogICAgICAgICAgICA+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIKICAgICAgICAgICAgICAgID5SRUFETUU8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiCiAgICAgICAgICAgICAgICA+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2EKICAgICAgICAgICAgICA+LgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3CiAgICAgICAgICAgICAgYXM9ImNoYXJ0IgogICAgICAgICAgICAgIGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iCiAgICAgICAgICAgICAgZGlzYWJsZS1wYWdpbmF0aW9uCiAgICAgICAgICAgICAgaW5pdGlhbC1vcGVuZWQ9IltbY2F0ZWdvcnkubWV0YWRhdGEub3BlbmVkXV0iCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbY2hhcnQubXVsdGlsaW5lXV0iPgogICAgICAgICAgICAgICAgICA8dGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQKICAgICAgICAgICAgICAgICAgICBhY3RpdmU9IltbYWN0aXZlXV0iCiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIgogICAgICAgICAgICAgICAgICAgIHJ1bnM9IltbX3NlbGVjdGVkUnVuc11dIgogICAgICAgICAgICAgICAgICAgIHRpdGxlPSJbW2NoYXJ0LnRpdGxlXV0iCiAgICAgICAgICAgICAgICAgICAgeC10eXBlPSJbW194VHlwZV1dIgogICAgICAgICAgICAgICAgICAgIHNtb290aGluZy1lbmFibGVkPSJbW19zbW9vdGhpbmdFbmFibGVkXV0iCiAgICAgICAgICAgICAgICAgICAgc21vb3RoaW5nLXdlaWdodD0iW1tfc21vb3RoaW5nV2VpZ2h0XV0iCiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcC1zb3J0aW5nLW1ldGhvZD0iW1t0b29sdGlwU29ydGluZ01ldGhvZF1dIgogICAgICAgICAgICAgICAgICAgIGlnbm9yZS15LW91dGxpZXJzPSJbW19pZ25vcmVZT3V0bGllcnNdXSIKICAgICAgICAgICAgICAgICAgICBzaG93LWRvd25sb2FkLWxpbmtzPSJbW19zaG93RG93bmxvYWRMaW5rc11dIgogICAgICAgICAgICAgICAgICAgIHRhZy1yZWdleGVzPSJbW2NoYXJ0Lm11bHRpbGluZS50YWddXSIKICAgICAgICAgICAgICAgICAgPjwvdGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQ+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJ0Lm1hcmdpbl1dIj4KICAgICAgICAgICAgICAgICAgPHRmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQKICAgICAgICAgICAgICAgICAgICBhY3RpdmU9IltbYWN0aXZlXV0iCiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIgogICAgICAgICAgICAgICAgICAgIHJ1bnM9IltbX3NlbGVjdGVkUnVuc11dIgogICAgICAgICAgICAgICAgICAgIHRpdGxlPSJbW2NoYXJ0LnRpdGxlXV0iCiAgICAgICAgICAgICAgICAgICAgeC10eXBlPSJbW194VHlwZV1dIgogICAgICAgICAgICAgICAgICAgIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIKICAgICAgICAgICAgICAgICAgICBpZ25vcmUteS1vdXRsaWVycz0iW1tfaWdub3JlWU91dGxpZXJzXV0iCiAgICAgICAgICAgICAgICAgICAgc2hvdy1kb3dubG9hZC1saW5rcz0iW1tfc2hvd0Rvd25sb2FkTGlua3NdXSIKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tY2hhcnQtc2VyaWVzPSJbW2NoYXJ0Lm1hcmdpbi5zZXJpZXNdXSIKICAgICAgICAgICAgICAgICAgPjwvdGYtY3VzdG9tLXNjYWxhci1tYXJnaW4tY2hhcnQtY2FyZD4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgI3Rvb2x0aXAtc29ydGluZyB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tdG9wOiAxNXB4OwogICAgICB9CiAgICAgICN0b29sdGlwLXNvcnRpbmcgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIHdpZHRoOiAxMDVweDsKICAgICAgfQogICAgICAubGluZS1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nLXRvcDogNXB4OwogICAgICB9CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsZHIpXSxBQ3QucHJvdG90eXBlLCJfcmVxdWVzdE1hbmFnZXIiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsWFIpXSxBQ3QucHJvdG90eXBlLCJfY2FuY2VsbGVyIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxBQ3QucHJvdG90eXBlLCJfc2VsZWN0ZWRSdW5zIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixub3RpZnk6ITAsb2JzZXJ2ZXI6Il9zaG93RG93bmxvYWRMaW5rc09ic2VydmVyIn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sQUN0LnByb3RvdHlwZSwiX3Nob3dEb3dubG9hZExpbmtzIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLG5vdGlmeTohMCxvYnNlcnZlcjoiX3Ntb290aGluZ1dlaWdodE9ic2VydmVyIn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxBQ3QucHJvdG90eXBlLCJfc21vb3RoaW5nV2VpZ2h0Iix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2lnbm9yZVlPdXRsaWVyc09ic2VydmVyIn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sQUN0LnByb3RvdHlwZSwiX2lnbm9yZVlPdXRsaWVycyIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxBQ3QucHJvdG90eXBlLCJfeFR5cGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sQUN0LnByb3RvdHlwZSwiX2xheW91dCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLEFDdC5wcm90b3R5cGUsIl9kYXRhTm90Rm91bmQiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sQUN0LnByb3RvdHlwZSwiX29wZW5lZENhdGVnb3JpZXMiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxBQ3QucHJvdG90eXBlLCJfYWN0aXZlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sQUN0LnByb3RvdHlwZSwicmVsb2FkT25SZWFkeSIsdm9pZCAwKSx0KFtzKCJfc21vb3RoaW5nV2VpZ2h0IiksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLEFDdC5wcm90b3R5cGUsIl9zbW9vdGhpbmdFbmFibGVkIixudWxsKSx0KFtzKCJfbGF5b3V0IiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxBQ3QucHJvdG90eXBlLCJfY2F0ZWdvcmllcyIsbnVsbCksQUN0PXQoW2koInRmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkIildLEFDdCk7Y2xhc3Mga0N0e2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5ydW4yZGF0YXNldHM9e30sdGhpcy5jb2xvclNjYWxlPWUsdGhpcy5idWlsZENoYXJ0KHQpfWdldERhdGFzZXQodCl7cmV0dXJuIHZvaWQgMD09PXRoaXMucnVuMmRhdGFzZXRzW3RdJiYodGhpcy5ydW4yZGF0YXNldHNbdF09bmV3IHJPLkRhdGFzZXQoW10se3J1bjp0fSkpLHRoaXMucnVuMmRhdGFzZXRzW3RdfWJ1aWxkQ2hhcnQodCl7dGhpcy5vdXRlciYmdGhpcy5vdXRlci5kZXN0cm95KCk7bGV0IGU9QVR0KHQpO3RoaXMueEFjY2Vzc29yPWUuYWNjZXNzb3IsdGhpcy54U2NhbGU9ZS5zY2FsZSx0aGlzLnhBeGlzPWUuYXhpcyx0aGlzLnhBeGlzLm1hcmdpbigwKSx0aGlzLnhBeGlzLnRpY2tMYWJlbFBhZGRpbmcoMyksdGhpcy55U2NhbGU9bmV3IHJPLlNjYWxlcy5MaW5lYXIsdGhpcy55QXhpcz1uZXcgck8uQXhlcy5OdW1lcmljKHRoaXMueVNjYWxlLCJsZWZ0Iik7bGV0IG49d1R0KDMpO3RoaXMueUF4aXMubWFyZ2luKDApLnRpY2tMYWJlbFBhZGRpbmcoNSkuZm9ybWF0dGVyKG4pLHRoaXMueUF4aXMudXNlc1RleHRXaWR0aEFwcHJveGltYXRpb24oITApO2xldCBpPXRoaXMuYnVpbGRQbG90KHRoaXMueEFjY2Vzc29yLHRoaXMueFNjYWxlLHRoaXMueVNjYWxlKTt0aGlzLmdyaWRsaW5lcz1uZXcgck8uQ29tcG9uZW50cy5HcmlkbGluZXModGhpcy54U2NhbGUsdGhpcy55U2NhbGUpLHRoaXMuY2VudGVyPW5ldyByTy5Db21wb25lbnRzLkdyb3VwKFt0aGlzLmdyaWRsaW5lcyxpXSksdGhpcy5vdXRlcj1uZXcgck8uQ29tcG9uZW50cy5UYWJsZShbW3RoaXMueUF4aXMsdGhpcy5jZW50ZXJdLFtudWxsLHRoaXMueEF4aXNdXSl9YnVpbGRQbG90KHQsZSxuKXtsZXQgaT1bMCwyMjgsMTU4NywzMDg1LDVlMyw2OTE1LDg0MTMsOTc3MiwxZTRdLHI9U2UuZXhwb3J0cy5yYW5nZShpLmxlbmd0aC0xKS5tYXAoKHQ9PihpW3QrMV0taVt0XSkvMjUwMCkpLG89aS5tYXAoKCh0LGUpPT50PT50W2VdWzFdKSksYT1vWzRdLHM9U2UuZXhwb3J0cy5yYW5nZShvLmxlbmd0aC0xKS5tYXAoKGk9PntsZXQgYT1uZXcgck8uUGxvdHMuQXJlYTthLngodCxlKTtsZXQgcz1pPjQ/b1tpXTpvW2krMV07cmV0dXJuIGEueShpPjQ/b1tpKzFdOm9baV0sbiksYS55MChzKSxhLmF0dHIoImZpbGwiLCgodCxlLG4pPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUobi5tZXRhZGF0YSgpLnJ1bikpKSxhLmF0dHIoInN0cm9rZSIsKCh0LGUsbik9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShuLm1ldGFkYXRhKCkucnVuKSkpLGEuYXR0cigic3Ryb2tlLXdlaWdodCIsKCh0LGUsbik9PiIwLjVweCIpKSxhLmF0dHIoInN0cm9rZS1vcGFjaXR5IiwoKCk9PnJbaV0pKSxhLmF0dHIoImZpbGwtb3BhY2l0eSIsKCgpPT5yW2ldKSksYX0pKSxsPW5ldyByTy5QbG90cy5MaW5lO3JldHVybiBsLngodCxlKSxsLnkoYSxuKSxsLmF0dHIoInN0cm9rZSIsKCh0LGUsbik9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShuLnJ1bikpKSx0aGlzLnBsb3RzPXMsbmV3IHJPLkNvbXBvbmVudHMuR3JvdXAocyl9c2V0VmlzaWJsZVNlcmllcyh0KXt0aGlzLnJ1bnM9dDtsZXQgZT10Lm1hcCgodD0+dGhpcy5nZXREYXRhc2V0KHQpKSk7dGhpcy5wbG90cy5mb3JFYWNoKCh0PT50LmRhdGFzZXRzKGUpKSl9c2V0U2VyaWVzRGF0YSh0LGUpe3RoaXMuZ2V0RGF0YXNldCh0KS5kYXRhKGUpfXJlbmRlclRvKHQpe3RoaXMudGFyZ2V0U1ZHPXQsdGhpcy5vdXRlci5yZW5kZXJUbyh0KX1yZWRyYXcoKXt0aGlzLm91dGVyLnJlZHJhdygpfWRlc3Ryb3koKXt0aGlzLm91dGVyLmRlc3Ryb3koKX19bGV0IExDdD1jbGFzcyBleHRlbmRzKGVyKHllKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29sb3JTY2FsZT0obmV3IHJPLlNjYWxlcy5Db2xvcikucmFuZ2UoZ0Euc2xpY2UoKSksdGhpcy54VHlwZT0ic3RlcCIsdGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlPVtdLHRoaXMuX3Nlcmllc0RhdGFDYWNoZT17fSx0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9bnVsbH1zZXRWaXNpYmxlU2VyaWVzKHQpe3RoaXMuX3Zpc2libGVTZXJpZXNDYWNoZT10LHRoaXMuX2NoYXJ0JiYodGhpcy5fY2hhcnQuc2V0VmlzaWJsZVNlcmllcyh0KSx0aGlzLnJlZHJhdygpKX1zZXRTZXJpZXNEYXRhKHQsZSl7dGhpcy5fc2VyaWVzRGF0YUNhY2hlW3RdPWUsdGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnNldFNlcmllc0RhdGEodCxlKX1yZWRyYXcoKXt0aGlzLl9jaGFydC5yZWRyYXcoKX1fbWFrZUNoYXJ0KCl7dmFyIHQ9dGhpcy54VHlwZSxlPXRoaXMuY29sb3JTY2FsZSxuPXRoaXMuX2F0dGFjaGVkO251bGw9PT10aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQmJnRoaXMuY2FuY2VsQXN5bmModGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkKSx0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9dGhpcy5hc3luYygoZnVuY3Rpb24oKXtpZih0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9bnVsbCxuKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuZGVzdHJveSgpO3ZhciBpPW5ldyBrQ3QodCxlKSxyPVN1KHRoaXMuJC5jaGFydGRpdik7aS5yZW5kZXJUbyhyKSx0aGlzLl9jaGFydD1pfX0pLDM1MCl9X3JlbG9hZEZyb21DYWNoZSgpe3RoaXMuX2NoYXJ0JiYodGhpcy5fY2hhcnQuc2V0VmlzaWJsZVNlcmllcyh0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUpLHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3RoaXMuX2NoYXJ0LnNldFNlcmllc0RhdGEodCx0aGlzLl9zZXJpZXNEYXRhQ2FjaGVbdF18fFtdKX0uYmluZCh0aGlzKSkpfWF0dGFjaGVkKCl7dGhpcy5fYXR0YWNoZWQ9ITB9ZGV0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMX19O0xDdC50ZW1wbGF0ZT1fZWAKICAgIDxzdHlsZSBpbmNsdWRlPSJwbG90dGFibGUtc3R5bGUiPjwvc3R5bGU+CiAgICA8ZGl2IGlkPSJjaGFydGRpdiI+PC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgI2NoYXJ0ZGl2IHsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICB9CiAgICAgIC5wbG90dGFibGUgLmF4aXMgdGV4dCB7CiAgICAgICAgZmlsbDogY3VycmVudENvbG9yOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsck8uU2NhbGVzLkNvbG9yKV0sTEN0LnByb3RvdHlwZSwiY29sb3JTY2FsZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxMQ3QucHJvdG90eXBlLCJ4VHlwZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLExDdC5wcm90b3R5cGUsIl9hdHRhY2hlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixrQ3QpXSxMQ3QucHJvdG90eXBlLCJfY2hhcnQiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLExDdC5wcm90b3R5cGUsIl92aXNpYmxlU2VyaWVzQ2FjaGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTEN0LnByb3RvdHlwZSwiX3Nlcmllc0RhdGFDYWNoZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxMQ3QucHJvdG90eXBlLCJfbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkIix2b2lkIDApLHQoW2EoInhUeXBlIiwiY29sb3JTY2FsZSIsIl9hdHRhY2hlZCIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sTEN0LnByb3RvdHlwZSwiX21ha2VDaGFydCIsbnVsbCksdChbYSgiX2NoYXJ0IiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxMQ3QucHJvdG90eXBlLCJfcmVsb2FkRnJvbUNhY2hlIixudWxsKSxMQ3Q9dChbaSgidnotZGlzdHJpYnV0aW9uLWNoYXJ0IildLExDdCk7bGV0IFBDdD1jbGFzcyBleHRlbmRzKExUdChlcih5ZSkpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5nZXREYXRhTG9hZE5hbWU9KHtydW46dH0pPT50LHRoaXMucmVxdWVzdERhdGE9KHQsZSxuKT0+e2NvbnN0IGk9X3IoKS5wbHVnaW5Sb3V0ZSgiZGlzdHJpYnV0aW9ucyIsIi9kaXN0cmlidXRpb25zIik7UHJvbWlzZS5hbGwodC5tYXAoKHQ9Pntjb25zdCBuPWlPKGkse3RhZzp0LnRhZyxydW46dC5ydW59KTtyZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KG4pLnRoZW4oKG49PntlKHtpdGVtOnQsZGF0YTpufSl9KSl9KSkpLmZpbmFsbHkoKCgpPT57bigpfSkpfSx0aGlzLmxvYWREYXRhQ2FsbGJhY2s9KHQsZSxuKT0+e2NvbnN0IGk9bi5tYXAoKHQ9Pntjb25zdFtlLG4saV09dDtyZXR1cm4gaS53YWxsX3RpbWU9bmV3IERhdGUoMWUzKmUpLGkuc3RlcD1uLGl9KSkscj10aGlzLmdldERhdGFMb2FkTmFtZShlKTt0aGlzLiQuY2hhcnQuc2V0U2VyaWVzRGF0YShyLGkpLHRoaXMuJC5jaGFydC5zZXRWaXNpYmxlU2VyaWVzKFtyXSl9LHRoaXMuX2NvbG9yU2NhbGU9e3NjYWxlOkdSfSx0aGlzLl9leHBhbmRlZD0hMSx0aGlzLl9jYW5jZWxsZXI9bmV3IFhSfV9yZWxvYWRPblJ1blRhZ0NoYW5nZSgpe3RoaXMucmVsb2FkKCl9X3VwZGF0ZURhdGFUb0xvYWQoKXt0aGlzLmRhdGFUb0xvYWQ9W3tydW46dGhpcy5ydW4sdGFnOnRoaXMudGFnfV19Z2V0IF9ydW5Db2xvcigpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlLnNjYWxlKHRoaXMucnVuKX1yZWRyYXcoKXt0aGlzLiQuY2hhcnQucmVkcmF3KCl9X3RvZ2dsZUV4cGFuZGVkKHQpe3RoaXMuc2V0KCJfZXhwYW5kZWQiLCF0aGlzLl9leHBhbmRlZCksdGhpcy5yZWRyYXcoKX19O1BDdC50ZW1wbGF0ZT1fZWAKICAgIDx0Zi1jYXJkLWhlYWRpbmcKICAgICAgdGFnPSJbW3RhZ11dIgogICAgICBydW49IltbcnVuXV0iCiAgICAgIGRpc3BsYXktbmFtZT0iW1t0YWdNZXRhZGF0YS5kaXNwbGF5TmFtZV1dIgogICAgICBkZXNjcmlwdGlvbj0iW1t0YWdNZXRhZGF0YS5kZXNjcmlwdGlvbl1dIgogICAgICBjb2xvcj0iW1tfcnVuQ29sb3JdXSIKICAgID48L3RmLWNhcmQtaGVhZGluZz4KICAgIDwhLS0KICAgICAgVGhlIG1haW4gZGlzdHJpYnV0aW9uIHRoYXQgd2UgcmVuZGVyLiBEYXRhIGlzIHNldCBkaXJlY3RseSB3aXRoCiAgICAgIFxgc2V0U2VyaWVzRGF0YVxgLCBub3Qgd2l0aCBhIGJvdW5kIHByb3BlcnR5LgogICAgLS0+CiAgICA8dnotZGlzdHJpYnV0aW9uLWNoYXJ0CiAgICAgIGlkPSJjaGFydCIKICAgICAgeC10eXBlPSJbW3hUeXBlXV0iCiAgICAgIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlXV0iCiAgICA+PC92ei1kaXN0cmlidXRpb24tY2hhcnQ+CiAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogcm93OyI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIKICAgICAgICBpY29uPSJmdWxsc2NyZWVuIgogICAgICAgIG9uLXRhcD0iX3RvZ2dsZUV4cGFuZGVkIgogICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHdpZHRoOiAzMzBweDsKICAgICAgICBoZWlnaHQ6IDIzNXB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDcwMHB4OwogICAgICAgIGhlaWdodDogNTAwcHg7CiAgICAgIH0KCiAgICAgIHZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIHsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICB0Zi1jYXJkLWhlYWRpbmcgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxQQ3QucHJvdG90eXBlLCJydW4iLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sUEN0LnByb3RvdHlwZSwidGFnIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFBDdC5wcm90b3R5cGUsInRhZ01ldGFkYXRhIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFBDdC5wcm90b3R5cGUsInhUeXBlIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFBDdC5wcm90b3R5cGUsImdldERhdGFMb2FkTmFtZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxQQ3QucHJvdG90eXBlLCJsb2FkRGF0YUNhbGxiYWNrIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFBDdC5wcm90b3R5cGUsIl9jb2xvclNjYWxlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFBDdC5wcm90b3R5cGUsIl9leHBhbmRlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixkcildLFBDdC5wcm90b3R5cGUsInJlcXVlc3RNYW5hZ2VyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLFhSKV0sUEN0LnByb3RvdHlwZSwiX2NhbmNlbGxlciIsdm9pZCAwKSx0KFthKCJydW4iLCJ0YWciKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLFBDdC5wcm90b3R5cGUsIl9yZWxvYWRPblJ1blRhZ0NoYW5nZSIsbnVsbCksdChbYSgicnVuIiwidGFnIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxQQ3QucHJvdG90eXBlLCJfdXBkYXRlRGF0YVRvTG9hZCIsbnVsbCksdChbcygicnVuIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sUEN0LnByb3RvdHlwZSwiX3J1bkNvbG9yIixudWxsKSxQQ3Q9dChbaSgidGYtZGlzdHJpYnV0aW9uLWxvYWRlciIpXSxQQ3QpO2xldCBOQ3Q9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnJlbG9hZE9uUmVhZHk9ITAsdGhpcy5feFR5cGU9InN0ZXAiLHRoaXMuX3JlcXVlc3RNYW5hZ2VyPW5ldyBkcn1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5yZWxvYWRPblJlYWR5JiZ0aGlzLnJlbG9hZCgpfXJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCgpPT57dGhpcy5fcmVsb2FkRGlzdHJpYnV0aW9ucygpfSkpfV9mZXRjaFRhZ3MoKXtjb25zdCB0PV9yKCkucGx1Z2luUm91dGUoImRpc3RyaWJ1dGlvbnMiLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHQpLnRoZW4oKHQ9PntpZihTZS5leHBvcnRzLmlzRXF1YWwodCx0aGlzLl9ydW5Ub1RhZ0luZm8pKXJldHVybjtjb25zdCBlPVNlLmV4cG9ydHMubWFwVmFsdWVzKHQsKHQ9Pk9iamVjdC5rZXlzKHQpKSksbj1hcihlKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PW4ubGVuZ3RoKSx0aGlzLnNldCgiX3J1blRvVGFnIixlKSx0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsdCksdGhpcy5hc3luYygoKCk9Pnt0aGlzLnNldCgiX2NhdGVnb3JpZXNEb21SZWFkeSIsITApfSkpfSkpfV9yZWxvYWREaXN0cmlidXRpb25zKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWRpc3RyaWJ1dGlvbi1sb2FkZXIiKS5mb3JFYWNoKCh0PT57dC5yZWxvYWQoKX0pKX1fc2hvdWxkT3Blbih0KXtyZXR1cm4gdDw9Mn1nZXQgX2NhdGVnb3JpZXMoKXtyZXR1cm4gTXIodGhpcy5fcnVuVG9UYWcsdGhpcy5fc2VsZWN0ZWRSdW5zLHRoaXMuX3RhZ0ZpbHRlcil9X3RhZ01ldGFkYXRhKHQsZSxuKXtyZXR1cm4gdFtlXVtuXX19O05DdC50ZW1wbGF0ZT1fZWAKICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZXR0aW5ncyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yCiAgICAgICAgICAgICAgaWQ9InhUeXBlU2VsZWN0b3IiCiAgICAgICAgICAgICAgbmFtZT0iSG9yaXpvbnRhbCBheGlzIgogICAgICAgICAgICAgIHNlbGVjdGVkLWlkPSJ7e194VHlwZX19IgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9IndhbGxfdGltZSI+d2FsbDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBydW5zLXNlbGVjdG9yIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gZGlzdHJpYnV0aW9uIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczo8L3A+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGhpc3RvZ3JhbSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuCiAgICAgICAgICAgICAgICAoSGlzdG9ncmFtcyBhbmQgZGlzdHJpYnV0aW9ucyBib3RoIHVzZSB0aGUgaGlzdG9ncmFtIHN1bW1hcnkKICAgICAgICAgICAgICAgIG9wZXJhdGlvbi4pCiAgICAgICAgICAgICAgPC9saT4KCiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiCiAgICAgICAgICAgICAgICA+UkVBRE1FPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIgogICAgICAgICAgICAgICAgPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hCiAgICAgICAgICAgICAgPi4KICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyIKICAgICAgICAgICAgICAgID50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcKICAgICAgICAgICAgICBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIgogICAgICAgICAgICAgIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLWRpc3RyaWJ1dGlvbi1sb2FkZXIKICAgICAgICAgICAgICAgICAgYWN0aXZlPSJbW2FjdGl2ZV1dIgogICAgICAgICAgICAgICAgICBydW49IltbaXRlbS5ydW5dXSIKICAgICAgICAgICAgICAgICAgdGFnPSJbW2l0ZW0udGFnXV0iCiAgICAgICAgICAgICAgICAgIHRhZy1tZXRhZGF0YT0iW1tfdGFnTWV0YWRhdGEoX3J1blRvVGFnSW5mbywgaXRlbS5ydW4sIGl0ZW0udGFnKV1dIgogICAgICAgICAgICAgICAgICB4LXR5cGU9IltbX3hUeXBlXV0iCiAgICAgICAgICAgICAgICAgIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgICAgICAgICAgID48L3RmLWRpc3RyaWJ1dGlvbi1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLE5DdC5wcm90b3R5cGUsInJlbG9hZE9uUmVhZHkiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sTkN0LnByb3RvdHlwZSwiX3hUeXBlIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxOQ3QucHJvdG90eXBlLCJfc2VsZWN0ZWRSdW5zIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLE5DdC5wcm90b3R5cGUsIl9ydW5Ub1RhZyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxOQ3QucHJvdG90eXBlLCJfcnVuVG9UYWdJbmZvIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sTkN0LnByb3RvdHlwZSwiX2RhdGFOb3RGb3VuZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxOQ3QucHJvdG90eXBlLCJfdGFnRmlsdGVyIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sTkN0LnByb3RvdHlwZSwiX2NhdGVnb3JpZXNEb21SZWFkeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixkcildLE5DdC5wcm90b3R5cGUsIl9yZXF1ZXN0TWFuYWdlciIsdm9pZCAwKSx0KFtzKCJfcnVuVG9UYWciLCJfc2VsZWN0ZWRSdW5zIiwiX3RhZ0ZpbHRlciIsIl9jYXRlZ29yaWVzRG9tUmVhZHkiKSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLE5DdC5wcm90b3R5cGUsIl9jYXRlZ29yaWVzIixudWxsKSxOQ3Q9dChbaSgidGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZCIpXSxOQ3QpO3ZhciBJQ3Q9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsTGlzdGVuS2V5OmRzLGFkZEhhc2hMaXN0ZW5lcjptcyxhZGRTdG9yYWdlTGlzdGVuZXI6Z3MsZmlyZVN0b3JhZ2VDaGFuZ2VkOl9zLHJlbW92ZUhhc2hMaXN0ZW5lckJ5S2V5OnlzLHJlbW92ZVN0b3JhZ2VMaXN0ZW5lckJ5S2V5OnZzLGdldFVybEhhc2hEaWN0OmZ1bmN0aW9uIFJDdCgpe3JldHVybiBDc30sRElTQU1CSUdVQVRPUjoiZGlzYW1iaWd1YXRvciIsZ2V0U3RyaW5nOk5zLHNldFN0cmluZzpJcyxnZXRTdHJpbmdJbml0aWFsaXplcjpScyxnZXRTdHJpbmdPYnNlcnZlcjpPcyxkaXNwb3NlU3RyaW5nQmluZGluZzp6cyxnZXRCb29sZWFuOkRzLHNldEJvb2xlYW46QnMsZ2V0Qm9vbGVhbkluaXRpYWxpemVyOkhzLGdldEJvb2xlYW5PYnNlcnZlcjpGcyxkaXNwb3NlQm9vbGVhbkJpbmRpbmc6VnMsZ2V0TnVtYmVyOlVzLHNldE51bWJlcjpqcyxnZXROdW1iZXJJbml0aWFsaXplcjpHcyxnZXROdW1iZXJPYnNlcnZlcjpXcyxkaXNwb3NlTnVtYmVyQmluZGluZzpxcyxnZXRPYmplY3Q6WXMsc2V0T2JqZWN0OlhzLGdldE9iamVjdEluaXRpYWxpemVyOiRzLGdldE9iamVjdE9ic2VydmVyOktzLGRpc3Bvc2VPYmplY3RCaW5kaW5nOlpzLG1ha2VCaW5kaW5nczpKcyxtaWdyYXRlTGVnYWN5VVJMU2NoZW1lOmZ1bmN0aW9uIE9DdCgpe2NvbnN0IHQ9bmV3IFNldChbImV4YW1wbGVzUGF0aCIsImhpZGVNb2RlbFBhbmUyIiwibW9kZWxOYW1lMSIsIm1vZGVsTmFtZTIiLCJpbmZlcmVuY2VBZGRyZXNzMSIsImluZmVyZW5jZUFkZHJlc3MyIiwibW9kZWxUeXBlIiwibW9kZWxWZXJzaW9uMSIsIm1vZGVsVmVyc2lvbjIiLCJtb2RlbFNpZ25hdHVyZTEiLCJtb2RlbFNpZ25hdHVyZTIiLCJtYXhFeGFtcGxlcyIsImxhYmVsVm9jYWJQYXRoIiwibXVsdGlDbGFzcyIsInNlcXVlbmNlRXhhbXBsZXMiLCJtYXhDbGFzc2VzVG9EaXNwbGF5Iiwic2FtcGxpbmdPZGRzIiwidXNlUHJlZGljdEFwaSIsInByZWRpY3RJbnB1dFRlbnNvciIsInByZWRpY3RPdXRwdXRUZW5zb3IiXSksZT1rcyhBcygpKTtpZigid2hhdGlmIj09PWUuX190YWJfXylmb3IobGV0IG4gb2YgdCluIGluIGUmJihlW2BwLndoYXRpZi4ke259YF09ZVtuXSk7THMoUHMoZSkpLChmdW5jdGlvbiBuKHQpe0NzPXR9KShlKX19KSx6Q3Q9ZnVuY3Rpb24gREN0KHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfSxCQ3Q9ekN0LEhDdD1mdW5jdGlvbiBGQ3QodCxlKXtmb3IodmFyIG49dC5sZW5ndGg7bi0tOylpZihCQ3QodFtuXVswXSxlKSlyZXR1cm4gbjtyZXR1cm4tMX0sVkN0PUhDdCxVQ3Q9QXJyYXkucHJvdG90eXBlLnNwbGljZSxqQ3Q9SEN0LEdDdD1IQ3QsV0N0PUhDdDtmdW5jdGlvbiBxQ3QodCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciBpPXRbZV07dGhpcy5zZXQoaVswXSxpWzFdKX19cUN0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbiBZQ3QoKXt0aGlzLl9fZGF0YV9fPVtdLHRoaXMuc2l6ZT0wfSxxQ3QucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbiBYQ3QodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPVZDdChlLHQpO3JldHVybiEobjwwfHwobj09ZS5sZW5ndGgtMT9lLnBvcCgpOlVDdC5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwwKSl9LHFDdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uICRDdCh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49akN0KGUsdCk7cmV0dXJuIG48MD92b2lkIDA6ZVtuXVsxXX0scUN0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24gS0N0KHQpe3JldHVybiBHQ3QodGhpcy5fX2RhdGFfXyx0KT4tMX0scUN0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24gWkN0KHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxpPVdDdChuLHQpO3JldHVybiBpPDA/KCsrdGhpcy5zaXplLG4ucHVzaChbdCxlXSkpOm5baV1bMV09ZSx0aGlzfTt2YXIgSkN0LFFDdD1xQ3QsdEF0PVFDdCxlQXQ9Im9iamVjdCI9PXR5cGVvZiB2ZSYmdmUmJnZlLk9iamVjdD09PU9iamVjdCYmdmUsbkF0PSJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsaUF0PWVBdHx8bkF0fHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLHJBdD1pQXQuU3ltYm9sLG9BdD1PYmplY3QucHJvdG90eXBlLGFBdD1vQXQuaGFzT3duUHJvcGVydHksc0F0PW9BdC50b1N0cmluZyxsQXQ9ckF0P3JBdC50b1N0cmluZ1RhZzp2b2lkIDAsY0F0PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsdUF0PXJBdD9yQXQudG9TdHJpbmdUYWc6dm9pZCAwLGhBdD1mdW5jdGlvbiBkQXQodCl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwPT09dD8iW29iamVjdCBVbmRlZmluZWRdIjoiW29iamVjdCBOdWxsXSI6dUF0JiZ1QXQgaW4gT2JqZWN0KHQpPyhmdW5jdGlvbiBlKHQpe3ZhciBlPWFBdC5jYWxsKHQsbEF0KSxuPXRbbEF0XTt0cnl7dFtsQXRdPXZvaWQgMDt2YXIgaT0hMH1jYXRjaCh0KXt9dmFyIHI9c0F0LmNhbGwodCk7cmV0dXJuIGkmJihlP3RbbEF0XT1uOmRlbGV0ZSB0W2xBdF0pLHJ9KSh0KTooZnVuY3Rpb24gbih0KXtyZXR1cm4gY0F0LmNhbGwodCl9KSh0KX0scEF0PWZ1bmN0aW9uIGZBdCh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX0sbUF0PWhBdCxnQXQ9cEF0LF9BdD1mdW5jdGlvbiB5QXQodCl7aWYoIWdBdCh0KSlyZXR1cm4hMTt2YXIgZT1tQXQodCk7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBQcm94eV0iPT1lfSx2QXQ9aUF0WyJfX2NvcmUtanNfc2hhcmVkX18iXSxiQXQ9KEpDdD0vW14uXSskLy5leGVjKHZBdCYmdkF0LmtleXMmJnZBdC5rZXlzLklFX1BST1RPfHwiIikpPyJTeW1ib2woc3JjKV8xLiIrSkN0OiIiLHhBdD1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcsd0F0PWZ1bmN0aW9uIFNBdCh0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIHhBdC5jYWxsKHQpfWNhdGNoKHQpe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2godCl7fX1yZXR1cm4iIn0sTUF0PV9BdCxFQXQ9cEF0LFRBdD13QXQsQ0F0PS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLEFBdD1SZWdFeHAoIl4iK0Z1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpLnJlcGxhY2UoL1tcXF4kLiorPygpW1xde318XS9nLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpLGtBdD1mdW5jdGlvbiBMQXQodCxlKXt2YXIgbj0oZnVuY3Rpb24gaSh0LGUpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfSkodCxlKTtyZXR1cm4oZnVuY3Rpb24gcih0KXtyZXR1cm4hKCFFQXQodCl8fChmdW5jdGlvbiBlKHQpe3JldHVybiEhYkF0JiZiQXQgaW4gdH0pKHQpKSYmKE1BdCh0KT9BQXQ6Q0F0KS50ZXN0KFRBdCh0KSl9KShuKT9uOnZvaWQgMH0sUEF0PWtBdChpQXQsIk1hcCIpLE5BdD1rQXQoT2JqZWN0LCJjcmVhdGUiKSxJQXQ9TkF0LFJBdD1OQXQsT0F0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksekF0PU5BdCxEQXQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxCQXQ9TkF0O2Z1bmN0aW9uIEhBdCh0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIGk9dFtlXTt0aGlzLnNldChpWzBdLGlbMV0pfX1IQXQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uIEZBdCgpe3RoaXMuX19kYXRhX189SUF0P0lBdChudWxsKTp7fSx0aGlzLnNpemU9MH0sSEF0LnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24gVkF0KHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxIQXQucHJvdG90eXBlLmdldD1mdW5jdGlvbiBVQXQodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihSQXQpe3ZhciBuPWVbdF07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09bj92b2lkIDA6bn1yZXR1cm4gT0F0LmNhbGwoZSx0KT9lW3RdOnZvaWQgMH0sSEF0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24gakF0KHQpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIHpBdD92b2lkIDAhPT1lW3RdOkRBdC5jYWxsKGUsdCl9LEhBdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uIEdBdCh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLG5bdF09QkF0JiZ2b2lkIDA9PT1lPyJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjplLHRoaXN9O3ZhciBXQXQ9SEF0LHFBdD1RQ3QsWUF0PVBBdCxYQXQ9ZnVuY3Rpb24gJEF0KHQsZSl7dmFyIG49dC5fX2RhdGFfXztyZXR1cm4oZnVuY3Rpb24gaSh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ic3RyaW5nIj09ZXx8Im51bWJlciI9PWV8fCJzeW1ib2wiPT1lfHwiYm9vbGVhbiI9PWU/Il9fcHJvdG9fXyIhPT10Om51bGw9PT10fSkoZSk/blsic3RyaW5nIj09dHlwZW9mIGU/InN0cmluZyI6Imhhc2giXTpuLm1hcH0sS0F0PVhBdCxaQXQ9WEF0LEpBdD1YQXQsUUF0PVhBdDtmdW5jdGlvbiB0a3QodCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciBpPXRbZV07dGhpcy5zZXQoaVswXSxpWzFdKX19dGt0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbiBla3QoKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyBXQXQsbWFwOm5ldyhZQXR8fHFBdCksc3RyaW5nOm5ldyBXQXR9fSx0a3QucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbiBua3QodCl7dmFyIGU9S0F0KHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LHRrdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uIGlrdCh0KXtyZXR1cm4gWkF0KHRoaXMsdCkuZ2V0KHQpfSx0a3QucHJvdG90eXBlLmhhcz1mdW5jdGlvbiBya3QodCl7cmV0dXJuIEpBdCh0aGlzLHQpLmhhcyh0KX0sdGt0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24gb2t0KHQsZSl7dmFyIG49UUF0KHRoaXMsdCksaT1uLnNpemU7cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplKz1uLnNpemU9PWk/MDoxLHRoaXN9O3ZhciBha3Q9dGt0LHNrdD1RQ3QsbGt0PVBBdCxja3Q9YWt0LHVrdD1RQ3Q7ZnVuY3Rpb24gaGt0KHQpe3ZhciBlPXRoaXMuX19kYXRhX189bmV3IHVrdCh0KTt0aGlzLnNpemU9ZS5zaXplfWhrdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24gZGt0KCl7dGhpcy5fX2RhdGFfXz1uZXcgdEF0LHRoaXMuc2l6ZT0wfSxoa3QucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbiBwa3QodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWUuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemU9ZS5zaXplLG59LGhrdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uIGZrdCh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9LGhrdC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uIG1rdCh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9LGhrdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uIGdrdCh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187aWYobiBpbnN0YW5jZW9mIHNrdCl7dmFyIGk9bi5fX2RhdGFfXztpZighbGt0fHxpLmxlbmd0aDwxOTkpcmV0dXJuIGkucHVzaChbdCxlXSksdGhpcy5zaXplPSsrbi5zaXplLHRoaXM7bj10aGlzLl9fZGF0YV9fPW5ldyBja3QoaSl9cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplPW4uc2l6ZSx0aGlzfTt2YXIgX2t0PWhrdCx5a3Q9ZnVuY3Rpb24gdmt0KHQsZSl7Zm9yKHZhciBuPS0xLGk9bnVsbD09dD8wOnQubGVuZ3RoOysrbjxpJiYhMSE9PWUodFtuXSxuLHQpOyk7cmV0dXJuIHR9LGJrdD1rQXQseGt0PShmdW5jdGlvbigpe3RyeXt2YXIgdD1ia3QoT2JqZWN0LCJkZWZpbmVQcm9wZXJ0eSIpO3JldHVybiB0KHt9LCIiLHt9KSx0fWNhdGNoKHQpe319KSgpLHdrdD14a3QsU2t0PWZ1bmN0aW9uIE1rdCh0LGUsbil7Il9fcHJvdG9fXyI9PWUmJndrdD93a3QodCxlLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpuLHdyaXRhYmxlOiEwfSk6dFtlXT1ufSxFa3Q9U2t0LFRrdD16Q3QsQ2t0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksQWt0PWZ1bmN0aW9uIGtrdCh0LGUsbil7dmFyIGk9dFtlXTtDa3QuY2FsbCh0LGUpJiZUa3QoaSxuKSYmKHZvaWQgMCE9PW58fGUgaW4gdCl8fEVrdCh0LGUsbil9LExrdD1Ba3QsUGt0PVNrdCxOa3Q9ZnVuY3Rpb24gSWt0KHQsZSxuLGkpe3ZhciByPSFuO258fChuPXt9KTtmb3IodmFyIG89LTEsYT1lLmxlbmd0aDsrK288YTspe3ZhciBzPWVbb10sbD1pP2kobltzXSx0W3NdLHMsbix0KTp2b2lkIDA7dm9pZCAwPT09bCYmKGw9dFtzXSkscj9Qa3QobixzLGwpOkxrdChuLHMsbCl9cmV0dXJuIG59LFJrdD1mdW5jdGlvbiBPa3QodCl7cmV0dXJuIG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdH0semt0PWhBdCxEa3Q9Umt0LEJrdD1mdW5jdGlvbiBIa3QodCl7cmV0dXJuIERrdCh0KSYmIltvYmplY3QgQXJndW1lbnRzXSI9PXprdCh0KX0sRmt0PVJrdCxWa3Q9T2JqZWN0LnByb3RvdHlwZSxVa3Q9Vmt0Lmhhc093blByb3BlcnR5LGprdD1Wa3QucHJvcGVydHlJc0VudW1lcmFibGUsR2t0PUJrdCgoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSkoKSk/Qmt0OmZ1bmN0aW9uKHQpe3JldHVybiBGa3QodCkmJlVrdC5jYWxsKHQsImNhbGxlZSIpJiYhamt0LmNhbGwodCwiY2FsbGVlIil9LFdrdD1BcnJheS5pc0FycmF5LHFrdD17ZXhwb3J0czp7fX0sWWt0PWZ1bmN0aW9uIFhrdCgpe3JldHVybiExfTshKGZ1bmN0aW9uKHQsZSl7dmFyIG49ZSYmIWUubm9kZVR5cGUmJmUsaT1uJiZ0JiYhdC5ub2RlVHlwZSYmdCxyPWkmJmkuZXhwb3J0cz09PW4/aUF0LkJ1ZmZlcjp2b2lkIDA7dC5leHBvcnRzPShyP3IuaXNCdWZmZXI6dm9pZCAwKXx8WWt0fSkocWt0LHFrdC5leHBvcnRzKTt2YXIgJGt0PS9eKD86MHxbMS05XVxkKikkLyxLa3Q9ZnVuY3Rpb24gWmt0KHQsZSl7dmFyIG49dHlwZW9mIHQ7cmV0dXJuISEoZT1udWxsPT1lPzkwMDcxOTkyNTQ3NDA5OTE6ZSkmJigibnVtYmVyIj09bnx8InN5bWJvbCIhPW4mJiRrdC50ZXN0KHQpKSYmdD4tMSYmdCUxPT0wJiZ0PGV9LEprdD1mdW5jdGlvbiBRa3QodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0Pi0xJiZ0JTE9PTAmJnQ8PTkwMDcxOTkyNTQ3NDA5OTF9LHRMdD1oQXQsZUx0PUprdCxuTHQ9Umt0LGlMdD17fTtpTHRbIltvYmplY3QgRmxvYXQzMkFycmF5XSJdPWlMdFsiW29iamVjdCBGbG9hdDY0QXJyYXldIl09aUx0WyJbb2JqZWN0IEludDhBcnJheV0iXT1pTHRbIltvYmplY3QgSW50MTZBcnJheV0iXT1pTHRbIltvYmplY3QgSW50MzJBcnJheV0iXT1pTHRbIltvYmplY3QgVWludDhBcnJheV0iXT1pTHRbIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIl09aUx0WyJbb2JqZWN0IFVpbnQxNkFycmF5XSJdPWlMdFsiW29iamVjdCBVaW50MzJBcnJheV0iXT0hMCxpTHRbIltvYmplY3QgQXJndW1lbnRzXSJdPWlMdFsiW29iamVjdCBBcnJheV0iXT1pTHRbIltvYmplY3QgQXJyYXlCdWZmZXJdIl09aUx0WyJbb2JqZWN0IEJvb2xlYW5dIl09aUx0WyJbb2JqZWN0IERhdGFWaWV3XSJdPWlMdFsiW29iamVjdCBEYXRlXSJdPWlMdFsiW29iamVjdCBFcnJvcl0iXT1pTHRbIltvYmplY3QgRnVuY3Rpb25dIl09aUx0WyJbb2JqZWN0IE1hcF0iXT1pTHRbIltvYmplY3QgTnVtYmVyXSJdPWlMdFsiW29iamVjdCBPYmplY3RdIl09aUx0WyJbb2JqZWN0IFJlZ0V4cF0iXT1pTHRbIltvYmplY3QgU2V0XSJdPWlMdFsiW29iamVjdCBTdHJpbmddIl09aUx0WyJbb2JqZWN0IFdlYWtNYXBdIl09ITE7dmFyIHJMdD1mdW5jdGlvbiBvTHQodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX0sYUx0PXtleHBvcnRzOnt9fTshKGZ1bmN0aW9uKHQsZSl7dmFyIG49ZSYmIWUubm9kZVR5cGUmJmUsaT1uJiZ0JiYhdC5ub2RlVHlwZSYmdCxyPWkmJmkuZXhwb3J0cz09PW4mJmVBdC5wcm9jZXNzLG89KGZ1bmN0aW9uKCl7dHJ5e3JldHVybiBpJiZpLnJlcXVpcmUmJmkucmVxdWlyZSgidXRpbCIpLnR5cGVzfHxyJiZyLmJpbmRpbmcmJnIuYmluZGluZygidXRpbCIpfWNhdGNoKHQpe319KSgpO3QuZXhwb3J0cz1vfSkoYUx0LGFMdC5leHBvcnRzKTt2YXIgc0x0PWFMdC5leHBvcnRzLGxMdD1zTHQmJnNMdC5pc1R5cGVkQXJyYXksY0x0PWxMdD9yTHQobEx0KTpmdW5jdGlvbiB1THQodCl7cmV0dXJuIG5MdCh0KSYmZUx0KHQubGVuZ3RoKSYmISFpTHRbdEx0KHQpXX0saEx0PUdrdCxkTHQ9V2t0LHBMdD1xa3QuZXhwb3J0cyxmTHQ9S2t0LG1MdD1jTHQsZ0x0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksX0x0PWZ1bmN0aW9uIHlMdCh0LGUpe3ZhciBuPWRMdCh0KSxpPSFuJiZoTHQodCkscj0hbiYmIWkmJnBMdCh0KSxvPSFuJiYhaSYmIXImJm1MdCh0KSxhPW58fGl8fHJ8fG8scz1hPyhmdW5jdGlvbiBsKHQsZSl7Zm9yKHZhciBuPS0xLGk9QXJyYXkodCk7KytuPHQ7KWlbbl09ZShuKTtyZXR1cm4gaX0pKHQubGVuZ3RoLFN0cmluZyk6W10sYz1zLmxlbmd0aDtmb3IodmFyIHUgaW4gdCkhZSYmIWdMdC5jYWxsKHQsdSl8fGEmJigibGVuZ3RoIj09dXx8ciYmKCJvZmZzZXQiPT11fHwicGFyZW50Ij09dSl8fG8mJigiYnVmZmVyIj09dXx8ImJ5dGVMZW5ndGgiPT11fHwiYnl0ZU9mZnNldCI9PXUpfHxmTHQodSxjKSl8fHMucHVzaCh1KTtyZXR1cm4gc30sdkx0PU9iamVjdC5wcm90b3R5cGUsYkx0PWZ1bmN0aW9uIHhMdCh0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yO3JldHVybiB0PT09KCJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLnByb3RvdHlwZXx8dkx0KX0sd0x0PWZ1bmN0aW9uIFNMdCh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChlKG4pKX19LE1MdD13THQoT2JqZWN0LmtleXMsT2JqZWN0KSxFTHQ9Ykx0LFRMdD1NTHQsQ0x0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksQUx0PWZ1bmN0aW9uIGtMdCh0KXtpZighRUx0KHQpKXJldHVybiBUTHQodCk7dmFyIGU9W107Zm9yKHZhciBuIGluIE9iamVjdCh0KSlDTHQuY2FsbCh0LG4pJiYiY29uc3RydWN0b3IiIT1uJiZlLnB1c2gobik7cmV0dXJuIGV9LExMdD1fQXQsUEx0PUprdCxOTHQ9ZnVuY3Rpb24gSUx0KHQpe3JldHVybiBudWxsIT10JiZQTHQodC5sZW5ndGgpJiYhTEx0KHQpfSxSTHQ9X0x0LE9MdD1BTHQsekx0PU5MdCxETHQ9ZnVuY3Rpb24gQkx0KHQpe3JldHVybiB6THQodCk/Ukx0KHQpOk9MdCh0KX0sSEx0PU5rdCxGTHQ9REx0LFZMdD1wQXQsVUx0PWJMdCxqTHQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxHTHQ9X0x0LFdMdD1OTHQscUx0PWZ1bmN0aW9uIFlMdCh0KXtyZXR1cm4gV0x0KHQpP0dMdCh0LCEwKTooZnVuY3Rpb24gZSh0KXtpZighVkx0KHQpKXJldHVybihmdW5jdGlvbiBlKHQpe3ZhciBlPVtdO2lmKG51bGwhPXQpZm9yKHZhciBuIGluIE9iamVjdCh0KSllLnB1c2gobik7cmV0dXJuIGV9KSh0KTt2YXIgbj1VTHQodCksaT1bXTtmb3IodmFyIHIgaW4gdCkoImNvbnN0cnVjdG9yIiE9cnx8IW4mJmpMdC5jYWxsKHQscikpJiZpLnB1c2gocik7cmV0dXJuIGl9KSh0KX0sWEx0PU5rdCwkTHQ9cUx0LEtMdD17ZXhwb3J0czp7fX07IShmdW5jdGlvbih0LGUpe3ZhciBuPWUmJiFlLm5vZGVUeXBlJiZlLGk9biYmdCYmIXQubm9kZVR5cGUmJnQscj1pJiZpLmV4cG9ydHM9PT1uP2lBdC5CdWZmZXI6dm9pZCAwLG89cj9yLmFsbG9jVW5zYWZlOnZvaWQgMDt0LmV4cG9ydHM9ZnVuY3Rpb24gYSh0LGUpe2lmKGUpcmV0dXJuIHQuc2xpY2UoKTt2YXIgbj10Lmxlbmd0aCxpPW8/byhuKTpuZXcgdC5jb25zdHJ1Y3RvcihuKTtyZXR1cm4gdC5jb3B5KGkpLGl9fSkoS0x0LEtMdC5leHBvcnRzKTt2YXIgWkx0PWZ1bmN0aW9uIEpMdCh0LGUpe3ZhciBuPS0xLGk9dC5sZW5ndGg7Zm9yKGV8fChlPUFycmF5KGkpKTsrK248aTspZVtuXT10W25dO3JldHVybiBlfSxRTHQ9ZnVuY3Rpb24gdFB0KHQsZSl7Zm9yKHZhciBuPS0xLGk9bnVsbD09dD8wOnQubGVuZ3RoLHI9MCxvPVtdOysrbjxpOyl7dmFyIGE9dFtuXTtlKGEsbix0KSYmKG9bcisrXT1hKX1yZXR1cm4gb30sZVB0PWZ1bmN0aW9uIG5QdCgpe3JldHVybltdfSxpUHQ9UUx0LHJQdD1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLG9QdD1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLGFQdD1vUHQ/ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106KHQ9T2JqZWN0KHQpLGlQdChvUHQodCksKGZ1bmN0aW9uKGUpe3JldHVybiByUHQuY2FsbCh0LGUpfSkpKX06ZVB0LHNQdD1Oa3QsbFB0PWFQdCxjUHQ9ZnVuY3Rpb24gdVB0KHQsZSl7Zm9yKHZhciBuPS0xLGk9ZS5sZW5ndGgscj10Lmxlbmd0aDsrK248aTspdFtyK25dPWVbbl07cmV0dXJuIHR9LGhQdD13THQoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCksZFB0PWNQdCxwUHQ9aFB0LGZQdD1hUHQsbVB0PU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM/ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdO3Q7KWRQdChlLGZQdCh0KSksdD1wUHQodCk7cmV0dXJuIGV9OmVQdCxnUHQ9Tmt0LF9QdD1tUHQseVB0PWNQdCx2UHQ9V2t0LGJQdD1mdW5jdGlvbiB4UHQodCxlLG4pe3ZhciBpPWUodCk7cmV0dXJuIHZQdCh0KT9pOnlQdChpLG4odCkpfSx3UHQ9YlB0LFNQdD1hUHQsTVB0PURMdCxFUHQ9ZnVuY3Rpb24gVFB0KHQpe3JldHVybiB3UHQodCxNUHQsU1B0KX0sQ1B0PWJQdCxBUHQ9bVB0LGtQdD1xTHQsTFB0PWtBdChpQXQsIkRhdGFWaWV3IiksUFB0PWtBdChpQXQsIlByb21pc2UiKSxOUHQ9a0F0KGlBdCwiU2V0IiksSVB0PUxQdCxSUHQ9UEF0LE9QdD1QUHQselB0PU5QdCxEUHQ9a0F0KGlBdCwiV2Vha01hcCIpLEJQdD1oQXQsSFB0PXdBdCxGUHQ9IltvYmplY3QgTWFwXSIsVlB0PSJbb2JqZWN0IFByb21pc2VdIixVUHQ9IltvYmplY3QgU2V0XSIsalB0PSJbb2JqZWN0IFdlYWtNYXBdIixHUHQ9IltvYmplY3QgRGF0YVZpZXddIixXUHQ9SFB0KElQdCkscVB0PUhQdChSUHQpLFlQdD1IUHQoT1B0KSxYUHQ9SFB0KHpQdCksJFB0PUhQdChEUHQpLEtQdD1CUHQ7KElQdCYmS1B0KG5ldyBJUHQobmV3IEFycmF5QnVmZmVyKDEpKSkhPUdQdHx8UlB0JiZLUHQobmV3IFJQdCkhPUZQdHx8T1B0JiZLUHQoT1B0LnJlc29sdmUoKSkhPVZQdHx8elB0JiZLUHQobmV3IHpQdCkhPVVQdHx8RFB0JiZLUHQobmV3IERQdCkhPWpQdCkmJihLUHQ9ZnVuY3Rpb24odCl7dmFyIGU9QlB0KHQpLG49IltvYmplY3QgT2JqZWN0XSI9PWU/dC5jb25zdHJ1Y3Rvcjp2b2lkIDAsaT1uP0hQdChuKToiIjtpZihpKXN3aXRjaChpKXtjYXNlIFdQdDpyZXR1cm4gR1B0O2Nhc2UgcVB0OnJldHVybiBGUHQ7Y2FzZSBZUHQ6cmV0dXJuIFZQdDtjYXNlIFhQdDpyZXR1cm4gVVB0O2Nhc2UgJFB0OnJldHVybiBqUHR9cmV0dXJuIGV9KTt2YXIgWlB0PUtQdCxKUHQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxRUHQ9aUF0LlVpbnQ4QXJyYXksdE50PVFQdCxlTnQ9ZnVuY3Rpb24gbk50KHQpe3ZhciBlPW5ldyB0LmNvbnN0cnVjdG9yKHQuYnl0ZUxlbmd0aCk7cmV0dXJuIG5ldyB0TnQoZSkuc2V0KG5ldyB0TnQodCkpLGV9LGlOdD1lTnQsck50PS9cdyokLyxvTnQ9ckF0P3JBdC5wcm90b3R5cGU6dm9pZCAwLGFOdD1vTnQ/b050LnZhbHVlT2Y6dm9pZCAwLHNOdD1lTnQsbE50PWZ1bmN0aW9uIGNOdCh0LGUpe3ZhciBuPWU/c050KHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3Iobix0LmJ5dGVPZmZzZXQsdC5sZW5ndGgpfSx1TnQ9ZU50LGhOdD1sTnQsZE50PXBBdCxwTnQ9T2JqZWN0LmNyZWF0ZSxmTnQ9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gZnVuY3Rpb24oZSl7aWYoIWROdChlKSlyZXR1cm57fTtpZihwTnQpcmV0dXJuIHBOdChlKTt0LnByb3RvdHlwZT1lO3ZhciBuPW5ldyB0O3JldHVybiB0LnByb3RvdHlwZT12b2lkIDAsbn19KSgpLG1OdD1mTnQsZ050PWhQdCxfTnQ9Ykx0LHlOdD1mdW5jdGlvbiB2TnQodCl7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQuY29uc3RydWN0b3J8fF9OdCh0KT97fTptTnQoZ050KHQpKX0sYk50PVpQdCx4TnQ9Umt0LHdOdD1hTHQuZXhwb3J0cyxTTnQ9d050JiZ3TnQuaXNNYXAsTU50PVNOdD9yTHQoU050KTpmdW5jdGlvbiBFTnQodCl7cmV0dXJuIHhOdCh0KSYmIltvYmplY3QgTWFwXSI9PWJOdCh0KX0sVE50PVpQdCxDTnQ9Umt0LEFOdD1hTHQuZXhwb3J0cyxrTnQ9QU50JiZBTnQuaXNTZXQsTE50PWtOdD9yTHQoa050KTpmdW5jdGlvbiBQTnQodCl7cmV0dXJuIENOdCh0KSYmIltvYmplY3QgU2V0XSI9PVROdCh0KX0sTk50PV9rdCxJTnQ9eWt0LFJOdD1Ba3QsT050PUtMdC5leHBvcnRzLHpOdD1aTHQsRE50PUVQdCxCTnQ9ZnVuY3Rpb24gSE50KHQpe3JldHVybiBDUHQodCxrUHQsQVB0KX0sRk50PVpQdCxWTnQ9eU50LFVOdD1Xa3Qsak50PXFrdC5leHBvcnRzLEdOdD1NTnQsV050PXBBdCxxTnQ9TE50LFlOdD1ETHQsWE50PXFMdCwkTnQ9IltvYmplY3QgQXJndW1lbnRzXSIsS050PSJbb2JqZWN0IEZ1bmN0aW9uXSIsWk50PSJbb2JqZWN0IE9iamVjdF0iLEpOdD17fTtKTnRbJE50XT1KTnRbIltvYmplY3QgQXJyYXldIl09Sk50WyJbb2JqZWN0IEFycmF5QnVmZmVyXSJdPUpOdFsiW29iamVjdCBEYXRhVmlld10iXT1KTnRbIltvYmplY3QgQm9vbGVhbl0iXT1KTnRbIltvYmplY3QgRGF0ZV0iXT1KTnRbIltvYmplY3QgRmxvYXQzMkFycmF5XSJdPUpOdFsiW29iamVjdCBGbG9hdDY0QXJyYXldIl09Sk50WyJbb2JqZWN0IEludDhBcnJheV0iXT1KTnRbIltvYmplY3QgSW50MTZBcnJheV0iXT1KTnRbIltvYmplY3QgSW50MzJBcnJheV0iXT1KTnRbIltvYmplY3QgTWFwXSJdPUpOdFsiW29iamVjdCBOdW1iZXJdIl09Sk50W1pOdF09Sk50WyJbb2JqZWN0IFJlZ0V4cF0iXT1KTnRbIltvYmplY3QgU2V0XSJdPUpOdFsiW29iamVjdCBTdHJpbmddIl09Sk50WyJbb2JqZWN0IFN5bWJvbF0iXT1KTnRbIltvYmplY3QgVWludDhBcnJheV0iXT1KTnRbIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIl09Sk50WyJbb2JqZWN0IFVpbnQxNkFycmF5XSJdPUpOdFsiW29iamVjdCBVaW50MzJBcnJheV0iXT0hMCxKTnRbIltvYmplY3QgRXJyb3JdIl09Sk50W0tOdF09Sk50WyJbb2JqZWN0IFdlYWtNYXBdIl09ITE7dmFyIFFOdD1mdW5jdGlvbiB0KGUsbixpLHIsbyxhKXt2YXIgcyxsPTEmbixjPTImbix1PTQmbjtpZihpJiYocz1vP2koZSxyLG8sYSk6aShlKSksdm9pZCAwIT09cylyZXR1cm4gcztpZighV050KGUpKXJldHVybiBlO3ZhciBoPVVOdChlKTtpZihoKXtpZihzPShmdW5jdGlvbiBkKHQpe3ZhciBlPXQubGVuZ3RoLG49bmV3IHQuY29uc3RydWN0b3IoZSk7cmV0dXJuIGUmJiJzdHJpbmciPT10eXBlb2YgdFswXSYmSlB0LmNhbGwodCwiaW5kZXgiKSYmKG4uaW5kZXg9dC5pbmRleCxuLmlucHV0PXQuaW5wdXQpLG59KShlKSwhbClyZXR1cm4gek50KGUscyl9ZWxzZXt2YXIgcD1GTnQoZSksZj1wPT1LTnR8fCJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSI9PXA7aWYoak50KGUpKXJldHVybiBPTnQoZSxsKTtpZihwPT1aTnR8fHA9PSROdHx8ZiYmIW8pe2lmKHM9Y3x8Zj97fTpWTnQoZSksIWwpcmV0dXJuIGM/KGZ1bmN0aW9uIGcodCxlKXtyZXR1cm4gZ1B0KHQsX1B0KHQpLGUpfSkoZSwoZnVuY3Rpb24gbSh0LGUpe3JldHVybiB0JiZYTHQoZSwkTHQoZSksdCl9KShzLGUpKTooZnVuY3Rpb24geSh0LGUpe3JldHVybiBzUHQodCxsUHQodCksZSl9KShlLChmdW5jdGlvbiBfKHQsZSl7cmV0dXJuIHQmJkhMdChlLEZMdChlKSx0KX0pKHMsZSkpfWVsc2V7aWYoIUpOdFtwXSlyZXR1cm4gbz9lOnt9O3M9KGZ1bmN0aW9uIHYodCxlLG4pe3ZhciBpPXQuY29uc3RydWN0b3I7c3dpdGNoKGUpe2Nhc2UiW29iamVjdCBBcnJheUJ1ZmZlcl0iOnJldHVybiB1TnQodCk7Y2FzZSJbb2JqZWN0IEJvb2xlYW5dIjpjYXNlIltvYmplY3QgRGF0ZV0iOnJldHVybiBuZXcgaSgrdCk7Y2FzZSJbb2JqZWN0IERhdGFWaWV3XSI6cmV0dXJuKGZ1bmN0aW9uIHIodCxlKXt2YXIgbj1lP2lOdCh0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKG4sdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aCl9KSh0LG4pO2Nhc2UiW29iamVjdCBGbG9hdDMyQXJyYXldIjpjYXNlIltvYmplY3QgRmxvYXQ2NEFycmF5XSI6Y2FzZSJbb2JqZWN0IEludDhBcnJheV0iOmNhc2UiW29iamVjdCBJbnQxNkFycmF5XSI6Y2FzZSJbb2JqZWN0IEludDMyQXJyYXldIjpjYXNlIltvYmplY3QgVWludDhBcnJheV0iOmNhc2UiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iOmNhc2UiW29iamVjdCBVaW50MTZBcnJheV0iOmNhc2UiW29iamVjdCBVaW50MzJBcnJheV0iOnJldHVybiBoTnQodCxuKTtjYXNlIltvYmplY3QgTWFwXSI6cmV0dXJuIG5ldyBpO2Nhc2UiW29iamVjdCBOdW1iZXJdIjpjYXNlIltvYmplY3QgU3RyaW5nXSI6cmV0dXJuIG5ldyBpKHQpO2Nhc2UiW29iamVjdCBSZWdFeHBdIjpyZXR1cm4oZnVuY3Rpb24gbyh0KXt2YXIgZT1uZXcgdC5jb25zdHJ1Y3Rvcih0LnNvdXJjZSxyTnQuZXhlYyh0KSk7cmV0dXJuIGUubGFzdEluZGV4PXQubGFzdEluZGV4LGV9KSh0KTtjYXNlIltvYmplY3QgU2V0XSI6cmV0dXJuIG5ldyBpO2Nhc2UiW29iamVjdCBTeW1ib2xdIjpyZXR1cm4oZnVuY3Rpb24gYSh0KXtyZXR1cm4gYU50P09iamVjdChhTnQuY2FsbCh0KSk6e319KSh0KX19KShlLHAsbCl9fWF8fChhPW5ldyBOTnQpO3ZhciBiPWEuZ2V0KGUpO2lmKGIpcmV0dXJuIGI7YS5zZXQoZSxzKSxxTnQoZSk/ZS5mb3JFYWNoKChmdW5jdGlvbihyKXtzLmFkZCh0KHIsbixpLHIsZSxhKSl9KSk6R050KGUpJiZlLmZvckVhY2goKGZ1bmN0aW9uKHIsbyl7cy5zZXQobyx0KHIsbixpLG8sZSxhKSl9KSk7dmFyIHg9aD92b2lkIDA6KHU/Yz9CTnQ6RE50OmM/WE50OllOdCkoZSk7cmV0dXJuIElOdCh4fHxlLChmdW5jdGlvbihyLG8pe3gmJihyPWVbbz1yXSksUk50KHMsbyx0KHIsbixpLG8sZSxhKSl9KSksc30sdEl0PVFOdCxlSXQ9ZnVuY3Rpb24gbkl0KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0saUl0PShmdW5jdGlvbiBySXQodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixpKXtmb3IodmFyIHI9LTEsbz1PYmplY3QoZSksYT1pKGUpLHM9YS5sZW5ndGg7cy0tOyl7dmFyIGw9YVt0P3M6KytyXTtpZighMT09PW4ob1tsXSxsLG8pKWJyZWFrfXJldHVybiBlfX0pKCksb0l0PWlJdCxhSXQ9REx0LHNJdD1mdW5jdGlvbiBsSXQodCxlKXtyZXR1cm4gdCYmb0l0KHQsZSxhSXQpfSxjSXQ9Tkx0LHVJdD0oZnVuY3Rpb24gaEl0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSl7aWYobnVsbD09bilyZXR1cm4gbjtpZighY0l0KG4pKXJldHVybiB0KG4saSk7Zm9yKHZhciByPW4ubGVuZ3RoLG89ZT9yOi0xLGE9T2JqZWN0KG4pOyhlP28tLTorK288cikmJiExIT09aShhW29dLG8sYSk7KTtyZXR1cm4gbn19KShzSXQpLGRJdD1mdW5jdGlvbiBwSXQodCl7cmV0dXJuIHR9LGZJdD1kSXQsbUl0PWZ1bmN0aW9uIGdJdCh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OmZJdH0sX0l0PXlrdCx5SXQ9dUl0LHZJdD1tSXQsYkl0PVdrdCx4SXQ9ZnVuY3Rpb24gd0l0KHQsZSl7cmV0dXJuKGJJdCh0KT9fSXQ6eUl0KSh0LHZJdChlKSl9LFNJdD14SXQsTUl0PXVJdCxFSXQ9YWt0O2Z1bmN0aW9uIFRJdCh0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgRUl0OysrZTxuOyl0aGlzLmFkZCh0W2VdKX1USXQucHJvdG90eXBlLmFkZD1USXQucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24gQ0l0KHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLnNldCh0LCJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIiksdGhpc30sVEl0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24gQUl0KHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX07dmFyIGtJdD1USXQsTEl0PWZ1bmN0aW9uIFBJdCh0LGUpe3JldHVybiB0LmhhcyhlKX0sTkl0PWtJdCxJSXQ9ZnVuY3Rpb24gUkl0KHQsZSl7Zm9yKHZhciBuPS0xLGk9bnVsbD09dD8wOnQubGVuZ3RoOysrbjxpOylpZihlKHRbbl0sbix0KSlyZXR1cm4hMDtyZXR1cm4hMX0sT0l0PUxJdCx6SXQ9ZnVuY3Rpb24gREl0KHQsZSxuLGkscixvKXt2YXIgYT0xJm4scz10Lmxlbmd0aCxsPWUubGVuZ3RoO2lmKHMhPWwmJiEoYSYmbD5zKSlyZXR1cm4hMTt2YXIgYz1vLmdldCh0KSx1PW8uZ2V0KGUpO2lmKGMmJnUpcmV0dXJuIGM9PWUmJnU9PXQ7dmFyIGg9LTEsZD0hMCxwPTImbj9uZXcgTkl0OnZvaWQgMDtmb3Ioby5zZXQodCxlKSxvLnNldChlLHQpOysraDxzOyl7dmFyIGY9dFtoXSxtPWVbaF07aWYoaSl2YXIgZz1hP2kobSxmLGgsZSx0LG8pOmkoZixtLGgsdCxlLG8pO2lmKHZvaWQgMCE9PWcpe2lmKGcpY29udGludWU7ZD0hMTticmVha31pZihwKXtpZighSUl0KGUsKGZ1bmN0aW9uKHQsZSl7aWYoIU9JdChwLGUpJiYoZj09PXR8fHIoZix0LG4saSxvKSkpcmV0dXJuIHAucHVzaChlKX0pKSl7ZD0hMTticmVha319ZWxzZSBpZihmIT09bSYmIXIoZixtLG4saSxvKSl7ZD0hMTticmVha319cmV0dXJuIG8uZGVsZXRlKHQpLG8uZGVsZXRlKGUpLGR9LEJJdD1mdW5jdGlvbiBISXQodCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe25bKytlXT10fSkpLG59LEZJdD1RUHQsVkl0PXpDdCxVSXQ9ekl0LGpJdD1mdW5jdGlvbiBHSXQodCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQsaSl7blsrK2VdPVtpLHRdfSkpLG59LFdJdD1CSXQscUl0PXJBdD9yQXQucHJvdG90eXBlOnZvaWQgMCxZSXQ9cUl0P3FJdC52YWx1ZU9mOnZvaWQgMCxYSXQ9RVB0LCRJdD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEtJdD1fa3QsWkl0PXpJdCxKSXQ9WlB0LFFJdD1Xa3QsdFJ0PXFrdC5leHBvcnRzLGVSdD1jTHQsblJ0PSJbb2JqZWN0IEFyZ3VtZW50c10iLGlSdD0iW29iamVjdCBBcnJheV0iLHJSdD0iW29iamVjdCBPYmplY3RdIixvUnQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxhUnQ9Umt0LHNSdD1mdW5jdGlvbiB0KGUsbixpLHIsbyl7cmV0dXJuIGU9PT1ufHwobnVsbD09ZXx8bnVsbD09bnx8IWFSdChlKSYmIWFSdChuKT9lIT1lJiZuIT1uOihmdW5jdGlvbiBhKHQsZSxuLGkscixvKXt2YXIgYT1RSXQodCkscz1RSXQoZSksbD1hP2lSdDpKSXQodCksYz1zP2lSdDpKSXQoZSksdT0obD1sPT1uUnQ/clJ0OmwpPT1yUnQsaD0oYz1jPT1uUnQ/clJ0OmMpPT1yUnQsZD1sPT1jO2lmKGQmJnRSdCh0KSl7aWYoIXRSdChlKSlyZXR1cm4hMTthPSEwLHU9ITF9aWYoZCYmIXUpcmV0dXJuIG98fChvPW5ldyBLSXQpLGF8fGVSdCh0KT9aSXQodCxlLG4saSxyLG8pOihmdW5jdGlvbiBwKHQsZSxuLGkscixvLGEpe3N3aXRjaChuKXtjYXNlIltvYmplY3QgRGF0YVZpZXddIjppZih0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8dC5ieXRlT2Zmc2V0IT1lLmJ5dGVPZmZzZXQpcmV0dXJuITE7dD10LmJ1ZmZlcixlPWUuYnVmZmVyO2Nhc2UiW29iamVjdCBBcnJheUJ1ZmZlcl0iOnJldHVybiEodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fCFvKG5ldyBGSXQodCksbmV3IEZJdChlKSkpO2Nhc2UiW29iamVjdCBCb29sZWFuXSI6Y2FzZSJbb2JqZWN0IERhdGVdIjpjYXNlIltvYmplY3QgTnVtYmVyXSI6cmV0dXJuIFZJdCgrdCwrZSk7Y2FzZSJbb2JqZWN0IEVycm9yXSI6cmV0dXJuIHQubmFtZT09ZS5uYW1lJiZ0Lm1lc3NhZ2U9PWUubWVzc2FnZTtjYXNlIltvYmplY3QgUmVnRXhwXSI6Y2FzZSJbb2JqZWN0IFN0cmluZ10iOnJldHVybiB0PT1lKyIiO2Nhc2UiW29iamVjdCBNYXBdIjp2YXIgcz1qSXQ7Y2FzZSJbb2JqZWN0IFNldF0iOmlmKHN8fChzPVdJdCksdC5zaXplIT1lLnNpemUmJiEoMSZpKSlyZXR1cm4hMTt2YXIgbD1hLmdldCh0KTtpZihsKXJldHVybiBsPT1lO2l8PTIsYS5zZXQodCxlKTt2YXIgYz1VSXQocyh0KSxzKGUpLGkscixvLGEpO3JldHVybiBhLmRlbGV0ZSh0KSxjO2Nhc2UiW29iamVjdCBTeW1ib2xdIjppZihZSXQpcmV0dXJuIFlJdC5jYWxsKHQpPT1ZSXQuY2FsbChlKX1yZXR1cm4hMX0pKHQsZSxsLG4saSxyLG8pO2lmKCEoMSZuKSl7dmFyIGY9dSYmb1J0LmNhbGwodCwiX193cmFwcGVkX18iKSxtPWgmJm9SdC5jYWxsKGUsIl9fd3JhcHBlZF9fIik7aWYoZnx8bSl7dmFyIGc9Zj90LnZhbHVlKCk6dCxfPW0/ZS52YWx1ZSgpOmU7cmV0dXJuIG98fChvPW5ldyBLSXQpLHIoZyxfLG4saSxvKX19cmV0dXJuISFkJiYob3x8KG89bmV3IEtJdCksKGZ1bmN0aW9uIHkodCxlLG4saSxyLG8pe3ZhciBhPTEmbixzPVhJdCh0KSxsPXMubGVuZ3RoO2lmKGwhPVhJdChlKS5sZW5ndGgmJiFhKXJldHVybiExO2Zvcih2YXIgYz1sO2MtLTspe3ZhciB1PXNbY107aWYoIShhP3UgaW4gZTokSXQuY2FsbChlLHUpKSlyZXR1cm4hMX12YXIgaD1vLmdldCh0KSxkPW8uZ2V0KGUpO2lmKGgmJmQpcmV0dXJuIGg9PWUmJmQ9PXQ7dmFyIHA9ITA7by5zZXQodCxlKSxvLnNldChlLHQpO2Zvcih2YXIgZj1hOysrYzxsOyl7dmFyIG09dFt1PXNbY11dLGc9ZVt1XTtpZihpKXZhciBfPWE/aShnLG0sdSxlLHQsbyk6aShtLGcsdSx0LGUsbyk7aWYoISh2b2lkIDA9PT1fP209PT1nfHxyKG0sZyxuLGksbyk6Xykpe3A9ITE7YnJlYWt9Znx8KGY9ImNvbnN0cnVjdG9yIj09dSl9aWYocCYmIWYpe3ZhciB5PXQuY29uc3RydWN0b3Isdj1lLmNvbnN0cnVjdG9yO3k9PXZ8fCEoImNvbnN0cnVjdG9yImluIHQpfHwhKCJjb25zdHJ1Y3RvciJpbiBlKXx8ImZ1bmN0aW9uIj09dHlwZW9mIHkmJnkgaW5zdGFuY2VvZiB5JiYiZnVuY3Rpb24iPT10eXBlb2YgdiYmdiBpbnN0YW5jZW9mIHZ8fChwPSExKX1yZXR1cm4gby5kZWxldGUodCksby5kZWxldGUoZSkscH0pKHQsZSxuLGkscixvKSl9KShlLG4saSxyLHQsbykpfSxsUnQ9X2t0LGNSdD1zUnQsdVJ0PXBBdCxoUnQ9ZnVuY3Rpb24gZFJ0KHQpe3JldHVybiB0PT10JiYhdVJ0KHQpfSxwUnQ9aFJ0LGZSdD1ETHQsbVJ0PWZ1bmN0aW9uIGdSdCh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbnVsbCE9biYmblt0XT09PWUmJih2b2lkIDAhPT1lfHx0IGluIE9iamVjdChuKSl9fSxfUnQ9bVJ0LHlSdD1oQXQsdlJ0PVJrdCxiUnQ9ZnVuY3Rpb24geFJ0KHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdHx8dlJ0KHQpJiYiW29iamVjdCBTeW1ib2xdIj09eVJ0KHQpfSx3UnQ9V2t0LFNSdD1iUnQsTVJ0PS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLEVSdD0vXlx3KiQvLFRSdD1mdW5jdGlvbiBDUnQodCxlKXtpZih3UnQodCkpcmV0dXJuITE7dmFyIG49dHlwZW9mIHQ7cmV0dXJuISgibnVtYmVyIiE9biYmInN5bWJvbCIhPW4mJiJib29sZWFuIiE9biYmbnVsbCE9dCYmIVNSdCh0KSl8fEVSdC50ZXN0KHQpfHwhTVJ0LnRlc3QodCl8fG51bGwhPWUmJnQgaW4gT2JqZWN0KGUpfSxBUnQ9YWt0O2Z1bmN0aW9uIGtSdCh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0fHxudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBhIGZ1bmN0aW9uIik7dmFyIG49ZnVuY3Rpb24oKXt2YXIgaT1hcmd1bWVudHMscj1lP2UuYXBwbHkodGhpcyxpKTppWzBdLG89bi5jYWNoZTtpZihvLmhhcyhyKSlyZXR1cm4gby5nZXQocik7dmFyIGE9dC5hcHBseSh0aGlzLGkpO3JldHVybiBuLmNhY2hlPW8uc2V0KHIsYSl8fG8sYX07cmV0dXJuIG4uY2FjaGU9bmV3KGtSdC5DYWNoZXx8QVJ0KSxufWtSdC5DYWNoZT1BUnQ7dmFyIExSdCxQUnQ9a1J0LE5SdD0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxJUnQ9L1xcKFxcKT8vZyxSUnQ9KGZ1bmN0aW9uIE9SdCh0KXt2YXIgZT1QUnQodCwoZnVuY3Rpb24odCl7cmV0dXJuIDUwMD09PW4uc2l6ZSYmbi5jbGVhcigpLHR9KSksbj1lLmNhY2hlO3JldHVybiBlfSkoKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKCIiKSx0LnJlcGxhY2UoTlJ0LChmdW5jdGlvbih0LG4saSxyKXtlLnB1c2goaT9yLnJlcGxhY2UoSVJ0LCIkMSIpOm58fHQpfSkpLGV9KSkselJ0PWZ1bmN0aW9uIERSdCh0LGUpe2Zvcih2YXIgbj0tMSxpPW51bGw9PXQ/MDp0Lmxlbmd0aCxyPUFycmF5KGkpOysrbjxpOylyW25dPWUodFtuXSxuLHQpO3JldHVybiByfSxCUnQ9elJ0LEhSdD1Xa3QsRlJ0PWJSdCxWUnQ9ckF0P3JBdC5wcm90b3R5cGU6dm9pZCAwLFVSdD1WUnQ/VlJ0LnRvU3RyaW5nOnZvaWQgMCxqUnQ9ZnVuY3Rpb24gdChlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIGU7aWYoSFJ0KGUpKXJldHVybiBCUnQoZSx0KSsiIjtpZihGUnQoZSkpcmV0dXJuIFVSdD9VUnQuY2FsbChlKToiIjt2YXIgbj1lKyIiO3JldHVybiIwIj09biYmMS9lPT0tMS8wPyItMCI6bn0sR1J0PWZ1bmN0aW9uIFdSdCh0KXtyZXR1cm4gbnVsbD09dD8iIjpqUnQodCl9LHFSdD1Xa3QsWVJ0PVRSdCxYUnQ9UlJ0LCRSdD1HUnQsS1J0PWZ1bmN0aW9uIFpSdCh0LGUpe3JldHVybiBxUnQodCk/dDpZUnQodCxlKT9bdF06WFJ0KCRSdCh0KSl9LEpSdD1iUnQsUVJ0PWZ1bmN0aW9uIHRPdCh0KXtpZigic3RyaW5nIj09dHlwZW9mIHR8fEpSdCh0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0tMS8wPyItMCI6ZX0sZU90PUtSdCxuT3Q9UVJ0LGlPdD1mdW5jdGlvbiByT3QodCxlKXtmb3IodmFyIG49MCxpPShlPWVPdChlLHQpKS5sZW5ndGg7bnVsbCE9dCYmbjxpOyl0PXRbbk90KGVbbisrXSldO3JldHVybiBuJiZuPT1pP3Q6dm9pZCAwfSxvT3Q9aU90LGFPdD1LUnQsc090PUdrdCxsT3Q9V2t0LGNPdD1La3QsdU90PUprdCxoT3Q9UVJ0LGRPdD1mdW5jdGlvbiBwT3QodCxlLG4pe2Zvcih2YXIgaT0tMSxyPShlPWFPdChlLHQpKS5sZW5ndGgsbz0hMTsrK2k8cjspe3ZhciBhPWhPdChlW2ldKTtpZighKG89bnVsbCE9dCYmbih0LGEpKSlicmVhazt0PXRbYV19cmV0dXJuIG98fCsraSE9cj9vOiEhKHI9bnVsbD09dD8wOnQubGVuZ3RoKSYmdU90KHIpJiZjT3QoYSxyKSYmKGxPdCh0KXx8c090KHQpKX0sZk90PWZ1bmN0aW9uIG1PdCh0LGUpe3JldHVybiBudWxsIT10JiZlIGluIE9iamVjdCh0KX0sZ090PWRPdCxfT3Q9ZnVuY3Rpb24geU90KHQsZSl7cmV0dXJuIG51bGwhPXQmJmdPdCh0LGUsZk90KX0sdk90PXNSdCxiT3Q9X090LHhPdD1UUnQsd090PWhSdCxTT3Q9bVJ0LE1PdD1RUnQsRU90PWZ1bmN0aW9uIFRPdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/dm9pZCAwOmVbdF19fSxDT3Q9aU90LEFPdD1FT3Qsa090PVRSdCxMT3Q9UVJ0LFBPdD1kSXQsTk90PVdrdCxJT3Q9ZnVuY3Rpb24gUk90KHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bnVsbD09dD9QT3Q6Im9iamVjdCI9PXR5cGVvZiB0P05PdCh0KT8oZnVuY3Rpb24gZSh0LG4pe3JldHVybiB4T3QodCkmJndPdChuKT9TT3QoTU90KHQpLG4pOmZ1bmN0aW9uKGUpe3ZhciBpPShmdW5jdGlvbiByKHQsZSxuKXt2YXIgaT1udWxsPT10P3ZvaWQgMDpvT3QodCxlKTtyZXR1cm4gdm9pZCAwPT09aT9uOml9KShlLHQpO3JldHVybiB2b2lkIDA9PT1pJiZpPT09bj9iT3QoZSx0KTp2T3QobixpLDMpfX0pKHRbMF0sdFsxXSk6KGZ1bmN0aW9uIG4odCl7dmFyIGU9KGZ1bmN0aW9uIG4odCl7Zm9yKHZhciBlPWZSdCh0KSxuPWUubGVuZ3RoO24tLTspe3ZhciBpPWVbbl0scj10W2ldO2Vbbl09W2kscixwUnQocildfXJldHVybiBlfSkodCk7cmV0dXJuIDE9PWUubGVuZ3RoJiZlWzBdWzJdP19SdChlWzBdWzBdLGVbMF1bMV0pOmZ1bmN0aW9uKG4pe3JldHVybiBuPT09dHx8KGZ1bmN0aW9uIGkodCxlLG4scil7dmFyIG89bi5sZW5ndGgsYT1vLHM9IXI7aWYobnVsbD09dClyZXR1cm4hYTtmb3IodD1PYmplY3QodCk7by0tOyl7dmFyIGw9bltvXTtpZihzJiZsWzJdP2xbMV0hPT10W2xbMF1dOiEobFswXWluIHQpKXJldHVybiExfWZvcig7KytvPGE7KXt2YXIgYz0obD1uW29dKVswXSx1PXRbY10saD1sWzFdO2lmKHMmJmxbMl0pe2lmKHZvaWQgMD09PXUmJiEoYyBpbiB0KSlyZXR1cm4hMX1lbHNle3ZhciBkPW5ldyBsUnQ7aWYocil2YXIgcD1yKHUsaCxjLHQsZSxkKTtpZighKHZvaWQgMD09PXA/Y1J0KGgsdSwzLHIsZCk6cCkpcmV0dXJuITF9fXJldHVybiEwfSkobix0LGUpfX0pKHQpOihmdW5jdGlvbiBpKHQpe3JldHVybiBrT3QodCk/QU90KExPdCh0KSk6KGZ1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBDT3QoZSx0KX19KSh0KX0pKHQpfSxPT3Q9UUx0LHpPdD1mdW5jdGlvbiBET3QodCxlKXt2YXIgbj1bXTtyZXR1cm4gTUl0KHQsKGZ1bmN0aW9uKHQsaSxyKXtlKHQsaSxyKSYmbi5wdXNoKHQpfSkpLG59LEJPdD1JT3QsSE90PVdrdCxGT3Q9ZnVuY3Rpb24gVk90KHQsZSl7cmV0dXJuKEhPdCh0KT9PT3Q6ek90KSh0LEJPdChlKSl9LFVPdD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGpPdD1mdW5jdGlvbiBHT3QodCxlKXtyZXR1cm4gbnVsbCE9dCYmVU90LmNhbGwodCxlKX0sV090PWRPdCxxT3Q9ZnVuY3Rpb24gWU90KHQsZSl7cmV0dXJuIG51bGwhPXQmJldPdCh0LGUsak90KX0sWE90PUFMdCwkT3Q9WlB0LEtPdD1Ha3QsWk90PVdrdCxKT3Q9Tkx0LFFPdD1xa3QuZXhwb3J0cyx0enQ9Ykx0LGV6dD1jTHQsbnp0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksaXp0PWZ1bmN0aW9uIHJ6dCh0KXtyZXR1cm4gdm9pZCAwPT09dH0sb3p0PXVJdCxhenQ9Tkx0LHN6dD1mdW5jdGlvbiBsenQodCxlKXt2YXIgbj0tMSxpPWF6dCh0KT9BcnJheSh0Lmxlbmd0aCk6W107cmV0dXJuIG96dCh0LChmdW5jdGlvbih0LHIsbyl7aVsrK25dPWUodCxyLG8pfSkpLGl9LGN6dD16UnQsdXp0PUlPdCxoenQ9c3p0LGR6dD1Xa3QscHp0PWZ1bmN0aW9uIGZ6dCh0LGUpe3JldHVybihkenQodCk/Y3p0Omh6dCkodCx1enQoZSkpfSxtenQ9ZnVuY3Rpb24gZ3p0KHQsZSxuLGkpe3ZhciByPS0xLG89bnVsbD09dD8wOnQubGVuZ3RoO2ZvcihpJiZvJiYobj10Wysrcl0pOysrcjxvOyluPWUobix0W3JdLHIsdCk7cmV0dXJuIG59LF96dD11SXQseXp0PUlPdCx2enQ9ZnVuY3Rpb24gYnp0KHQsZSxuLGkscil7cmV0dXJuIHIodCwoZnVuY3Rpb24odCxyLG8pe249aT8oaT0hMSx0KTplKG4sdCxyLG8pfSkpLG59LHh6dD1Xa3Qsd3p0PWZ1bmN0aW9uIFN6dCh0LGUsbil7dmFyIGk9eHp0KHQpP216dDp2enQscj1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIGkodCx5enQoZSksbixyLF96dCl9LE16dD1oQXQsRXp0PVdrdCxUenQ9Umt0LEN6dD1FT3QoImxlbmd0aCIpLEF6dD1SZWdFeHAoIltcXHUyMDBkXFx1ZDgwMC1cXHVkZmZmXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXFx1ZmUwZVxcdWZlMGZdIiksa3p0PSJbXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXSIsTHp0PSJcXHVkODNjW1xcdWRmZmItXFx1ZGZmZl0iLFB6dD0iW15cXHVkODAwLVxcdWRmZmZdIixOenQ9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLEl6dD0iW1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXSIsUnp0PSIoPzoiK2t6dCsifCIrTHp0KyIpPyIsT3p0PSJbXFx1ZmUwZVxcdWZlMGZdPyIsenp0PU96dCtSenQrIig/OlxcdTIwMGQoPzoiK1tQenQsTnp0LEl6dF0uam9pbigifCIpKyIpIitPenQrUnp0KyIpKiIsRHp0PSIoPzoiK1tQenQra3p0KyI/IixrenQsTnp0LEl6dCwiW1xcdWQ4MDAtXFx1ZGZmZl0iXS5qb2luKCJ8IikrIikiLEJ6dD1SZWdFeHAoTHp0KyIoPz0iK0x6dCsiKXwiK0R6dCt6enQsImciKSxIenQ9Q3p0LEZ6dD1BTHQsVnp0PVpQdCxVenQ9Tkx0LGp6dD1mdW5jdGlvbiBHenQodCl7cmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJuIEF6dC50ZXN0KHQpfSkodCk/KGZ1bmN0aW9uIG4odCl7Zm9yKHZhciBlPUJ6dC5sYXN0SW5kZXg9MDtCenQudGVzdCh0KTspKytlO3JldHVybiBlfSkodCk6SHp0KHQpfSxXenQ9eWt0LHF6dD1mTnQsWXp0PXNJdCxYenQ9SU90LCR6dD1oUHQsS3p0PVdrdCxaenQ9cWt0LmV4cG9ydHMsSnp0PV9BdCxRenQ9cEF0LHREdD1jTHQsZUR0PUdrdCxuRHQ9V2t0LGlEdD1yQXQ/ckF0LmlzQ29uY2F0U3ByZWFkYWJsZTp2b2lkIDAsckR0PWNQdCxvRHQ9ZnVuY3Rpb24gYUR0KHQpe3JldHVybiBuRHQodCl8fGVEdCh0KXx8ISEoaUR0JiZ0JiZ0W2lEdF0pfSxzRHQ9ZnVuY3Rpb24gdChlLG4saSxyLG8pe3ZhciBhPS0xLHM9ZS5sZW5ndGg7Zm9yKGl8fChpPW9EdCksb3x8KG89W10pOysrYTxzOyl7dmFyIGw9ZVthXTtuPjAmJmkobCk/bj4xP3QobCxuLTEsaSxyLG8pOnJEdChvLGwpOnJ8fChvW28ubGVuZ3RoXT1sKX1yZXR1cm4gb30sbER0PWZ1bmN0aW9uIGNEdCh0LGUsbil7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHQuY2FsbChlKTtjYXNlIDE6cmV0dXJuIHQuY2FsbChlLG5bMF0pO2Nhc2UgMjpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSxuWzJdKX1yZXR1cm4gdC5hcHBseShlLG4pfSx1RHQ9TWF0aC5tYXgsaER0PWZ1bmN0aW9uIGREdCh0LGUsbil7cmV0dXJuIGU9dUR0KHZvaWQgMD09PWU/dC5sZW5ndGgtMTplLDApLGZ1bmN0aW9uKCl7Zm9yKHZhciBpPWFyZ3VtZW50cyxyPS0xLG89dUR0KGkubGVuZ3RoLWUsMCksYT1BcnJheShvKTsrK3I8bzspYVtyXT1pW2Urcl07cj0tMTtmb3IodmFyIHM9QXJyYXkoZSsxKTsrK3I8ZTspc1tyXT1pW3JdO3JldHVybiBzW2VdPW4oYSksbER0KHQsdGhpcyxzKX19LHBEdD1lSXQsZkR0PXhrdCxtRHQ9RGF0ZS5ub3csZ0R0PShmdW5jdGlvbiBfRHQodCl7dmFyIGU9MCxuPTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9bUR0KCkscj0xNi0oaS1uKTtpZihuPWkscj4wKXtpZigrK2U+PTgwMClyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgZT0wO3JldHVybiB0LmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpfX0pKGZEdD9mdW5jdGlvbih0LGUpe3JldHVybiBmRHQodCwidG9TdHJpbmciLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTpwRHQoZSksd3JpdGFibGU6ITB9KX06ZEl0KSx5RHQ9ZEl0LHZEdD1oRHQsYkR0PWdEdCx4RHQ9ZnVuY3Rpb24gd0R0KHQsZSl7cmV0dXJuIGJEdCh2RHQodCxlLHlEdCksdCsiIil9LFNEdD1mdW5jdGlvbiBNRHQodCxlLG4saSl7Zm9yKHZhciByPXQubGVuZ3RoLG89bisoaT8xOi0xKTtpP28tLTorK288cjspaWYoZSh0W29dLG8sdCkpcmV0dXJuIG87cmV0dXJuLTF9LEVEdD1TRHQsVER0PWZ1bmN0aW9uIENEdCh0KXtyZXR1cm4gdCE9dH0sQUR0PU5QdCxrRHQ9QUR0JiYxL0JJdChuZXcgQUR0KFssLTBdKSlbMV09PTEvMD9mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEFEdCh0KX06ZnVuY3Rpb24gTER0KCl7fSxQRHQ9a0l0LE5EdD1mdW5jdGlvbiBJRHQodCxlKXtyZXR1cm4hKG51bGw9PXR8fCF0Lmxlbmd0aCkmJihmdW5jdGlvbiBuKHQsZSxpKXtyZXR1cm4gZT09ZT8oZnVuY3Rpb24gcih0LGUsbil7Zm9yKHZhciBpPW4tMSxyPXQubGVuZ3RoOysraTxyOylpZih0W2ldPT09ZSlyZXR1cm4gaTtyZXR1cm4tMX0pKHQsZSxpKTpFRHQodCxURHQsaSl9KSh0LGUsMCk+LTF9LFJEdD1mdW5jdGlvbiBPRHQodCxlLG4pe2Zvcih2YXIgaT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK2k8cjspaWYobihlLHRbaV0pKXJldHVybiEwO3JldHVybiExfSx6RHQ9TEl0LEREdD1rRHQsQkR0PUJJdCxIRHQ9Tkx0LEZEdD1Sa3QsVkR0PWZ1bmN0aW9uIFVEdCh0KXtyZXR1cm4gRkR0KHQpJiZIRHQodCl9LGpEdD1zRHQsR0R0PVZEdCxXRHQ9eER0KChmdW5jdGlvbih0KXtyZXR1cm4oZnVuY3Rpb24gZSh0LG4saSl7dmFyIHI9LTEsbz1ORHQsYT10Lmxlbmd0aCxzPSEwLGw9W10sYz1sO2lmKGkpcz0hMSxvPVJEdDtlbHNlIGlmKGE+PTIwMCl7dmFyIHU9bj9udWxsOkREdCh0KTtpZih1KXJldHVybiBCRHQodSk7cz0hMSxvPXpEdCxjPW5ldyBQRHR9ZWxzZSBjPW4/W106bDt0OmZvcig7KytyPGE7KXt2YXIgaD10W3JdLGQ9bj9uKGgpOmg7aWYoaD1pfHwwIT09aD9oOjAscyYmZD09ZCl7Zm9yKHZhciBwPWMubGVuZ3RoO3AtLTspaWYoY1twXT09PWQpY29udGludWUgdDtuJiZjLnB1c2goZCksbC5wdXNoKGgpfWVsc2UgbyhjLGQsaSl8fChjIT09bCYmYy5wdXNoKGQpLGwucHVzaChoKSl9cmV0dXJuIGx9KShqRHQodCwxLEdEdCwhMCkpfSkpLHFEdD16UnQsWUR0PURMdCxYRHQ9ZnVuY3Rpb24gJER0KHQpe3JldHVybiBudWxsPT10P1tdOihmdW5jdGlvbiBlKHQsbil7cmV0dXJuIHFEdChuLChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pKX0pKHQsWUR0KHQpKX07dHJ5e0xSdD17Y2xvbmU6ZnVuY3Rpb24gS0R0KHQpe3JldHVybiB0SXQodCw0KX0sY29uc3RhbnQ6ZUl0LGVhY2g6U0l0LGZpbHRlcjpGT3QsaGFzOnFPdCxpc0FycmF5OldrdCxpc0VtcHR5OmZ1bmN0aW9uIFpEdCh0KXtpZihudWxsPT10KXJldHVybiEwO2lmKEpPdCh0KSYmKFpPdCh0KXx8InN0cmluZyI9PXR5cGVvZiB0fHwiZnVuY3Rpb24iPT10eXBlb2YgdC5zcGxpY2V8fFFPdCh0KXx8ZXp0KHQpfHxLT3QodCkpKXJldHVybiF0Lmxlbmd0aDt2YXIgZT0kT3QodCk7aWYoIltvYmplY3QgTWFwXSI9PWV8fCJbb2JqZWN0IFNldF0iPT1lKXJldHVybiF0LnNpemU7aWYodHp0KHQpKXJldHVybiFYT3QodCkubGVuZ3RoO2Zvcih2YXIgbiBpbiB0KWlmKG56dC5jYWxsKHQsbikpcmV0dXJuITE7cmV0dXJuITB9LGlzRnVuY3Rpb246X0F0LGlzVW5kZWZpbmVkOml6dCxrZXlzOkRMdCxtYXA6cHp0LHJlZHVjZTp3enQsc2l6ZTpmdW5jdGlvbiBKRHQodCl7aWYobnVsbD09dClyZXR1cm4gMDtpZihVenQodCkpcmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHwhRXp0KHQpJiZUenQodCkmJiJbb2JqZWN0IFN0cmluZ10iPT1NenQodCl9KSh0KT9qenQodCk6dC5sZW5ndGg7dmFyIG49Vnp0KHQpO3JldHVybiJbb2JqZWN0IE1hcF0iPT1ufHwiW29iamVjdCBTZXRdIj09bj90LnNpemU6Rnp0KHQpLmxlbmd0aH0sdHJhbnNmb3JtOmZ1bmN0aW9uIFFEdCh0LGUsbil7dmFyIGk9S3p0KHQpLHI9aXx8Wnp0KHQpfHx0RHQodCk7aWYoZT1YenQoZSksbnVsbD09bil7dmFyIG89dCYmdC5jb25zdHJ1Y3RvcjtuPXI/aT9uZXcgbzpbXTpRenQodCkmJkp6dChvKT9xenQoJHp0KHQpKTp7fX1yZXR1cm4ocj9XenQ6WXp0KSh0LChmdW5jdGlvbih0LGkscil7cmV0dXJuIGUobix0LGkscil9KSksbn0sdW5pb246V0R0LHZhbHVlczpYRHR9fWNhdGNoKHQpe31MUnR8fChMUnQ9d2luZG93Ll8pO3ZhciB0QnQ9TFJ0LGVCdD10QnQsbkJ0PXJCdCxpQnQ9IlwwIjtmdW5jdGlvbiByQnQodCl7dGhpcy5faXNEaXJlY3RlZD0hZUJ0Lmhhcyh0LCJkaXJlY3RlZCIpfHx0LmRpcmVjdGVkLHRoaXMuX2lzTXVsdGlncmFwaD0hIWVCdC5oYXModCwibXVsdGlncmFwaCIpJiZ0Lm11bHRpZ3JhcGgsdGhpcy5faXNDb21wb3VuZD0hIWVCdC5oYXModCwiY29tcG91bmQiKSYmdC5jb21wb3VuZCx0aGlzLl9sYWJlbD12b2lkIDAsdGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuPWVCdC5jb25zdGFudCh2b2lkIDApLHRoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbj1lQnQuY29uc3RhbnQodm9pZCAwKSx0aGlzLl9ub2Rlcz17fSx0aGlzLl9pc0NvbXBvdW5kJiYodGhpcy5fcGFyZW50PXt9LHRoaXMuX2NoaWxkcmVuPXt9LHRoaXMuX2NoaWxkcmVuWyJcMCJdPXt9KSx0aGlzLl9pbj17fSx0aGlzLl9wcmVkcz17fSx0aGlzLl9vdXQ9e30sdGhpcy5fc3Vjcz17fSx0aGlzLl9lZGdlT2Jqcz17fSx0aGlzLl9lZGdlTGFiZWxzPXt9fWZ1bmN0aW9uIG9CdCh0LGUpe3RbZV0/dFtlXSsrOnRbZV09MX1mdW5jdGlvbiBhQnQodCxlKXstLXRbZV18fGRlbGV0ZSB0W2VdfWZ1bmN0aW9uIHNCdCh0LGUsbixpKXt2YXIgcj0iIitlLG89IiIrbjtpZighdCYmcj5vKXt2YXIgYT1yO3I9byxvPWF9cmV0dXJuIHIrIgEiK28rIgEiKyhlQnQuaXNVbmRlZmluZWQoaSk/IlwwIjppKX1mdW5jdGlvbiBsQnQodCxlLG4saSl7dmFyIHI9IiIrZSxvPSIiK247aWYoIXQmJnI+byl7dmFyIGE9cjtyPW8sbz1hfXZhciBzPXt2OnIsdzpvfTtyZXR1cm4gaSYmKHMubmFtZT1pKSxzfWZ1bmN0aW9uIGNCdCh0LGUpe3JldHVybiBzQnQodCxlLnYsZS53LGUubmFtZSl9ckJ0LnByb3RvdHlwZS5fbm9kZUNvdW50PTAsckJ0LnByb3RvdHlwZS5fZWRnZUNvdW50PTAsckJ0LnByb3RvdHlwZS5pc0RpcmVjdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzRGlyZWN0ZWR9LHJCdC5wcm90b3R5cGUuaXNNdWx0aWdyYXBoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzTXVsdGlncmFwaH0sckJ0LnByb3RvdHlwZS5pc0NvbXBvdW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzQ29tcG91bmR9LHJCdC5wcm90b3R5cGUuc2V0R3JhcGg9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2xhYmVsPXQsdGhpc30sckJ0LnByb3RvdHlwZS5ncmFwaD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYWJlbH0sckJ0LnByb3RvdHlwZS5zZXREZWZhdWx0Tm9kZUxhYmVsPWZ1bmN0aW9uKHQpe3JldHVybiBlQnQuaXNGdW5jdGlvbih0KXx8KHQ9ZUJ0LmNvbnN0YW50KHQpKSx0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm49dCx0aGlzfSxyQnQucHJvdG90eXBlLm5vZGVDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2RlQ291bnR9LHJCdC5wcm90b3R5cGUubm9kZXM9ZnVuY3Rpb24oKXtyZXR1cm4gZUJ0LmtleXModGhpcy5fbm9kZXMpfSxyQnQucHJvdG90eXBlLnNvdXJjZXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiBlQnQuZmlsdGVyKHRoaXMubm9kZXMoKSwoZnVuY3Rpb24oZSl7cmV0dXJuIGVCdC5pc0VtcHR5KHQuX2luW2VdKX0pKX0sckJ0LnByb3RvdHlwZS5zaW5rcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIGVCdC5maWx0ZXIodGhpcy5ub2RlcygpLChmdW5jdGlvbihlKXtyZXR1cm4gZUJ0LmlzRW1wdHkodC5fb3V0W2VdKX0pKX0sckJ0LnByb3RvdHlwZS5zZXROb2Rlcz1mdW5jdGlvbih0LGUpe3ZhciBuPWFyZ3VtZW50cyxpPXRoaXM7cmV0dXJuIGVCdC5lYWNoKHQsKGZ1bmN0aW9uKHQpe24ubGVuZ3RoPjE/aS5zZXROb2RlKHQsZSk6aS5zZXROb2RlKHQpfSkpLHRoaXN9LHJCdC5wcm90b3R5cGUuc2V0Tm9kZT1mdW5jdGlvbih0LGUpe3JldHVybiBlQnQuaGFzKHRoaXMuX25vZGVzLHQpPyhhcmd1bWVudHMubGVuZ3RoPjEmJih0aGlzLl9ub2Rlc1t0XT1lKSx0aGlzKToodGhpcy5fbm9kZXNbdF09YXJndW1lbnRzLmxlbmd0aD4xP2U6dGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuKHQpLHRoaXMuX2lzQ29tcG91bmQmJih0aGlzLl9wYXJlbnRbdF09aUJ0LHRoaXMuX2NoaWxkcmVuW3RdPXt9LHRoaXMuX2NoaWxkcmVuWyJcMCJdW3RdPSEwKSx0aGlzLl9pblt0XT17fSx0aGlzLl9wcmVkc1t0XT17fSx0aGlzLl9vdXRbdF09e30sdGhpcy5fc3Vjc1t0XT17fSwrK3RoaXMuX25vZGVDb3VudCx0aGlzKX0sckJ0LnByb3RvdHlwZS5ub2RlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ub2Rlc1t0XX0sckJ0LnByb3RvdHlwZS5oYXNOb2RlPWZ1bmN0aW9uKHQpe3JldHVybiBlQnQuaGFzKHRoaXMuX25vZGVzLHQpfSxyQnQucHJvdG90eXBlLnJlbW92ZU5vZGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZihlQnQuaGFzKHRoaXMuX25vZGVzLHQpKXt2YXIgbj1mdW5jdGlvbih0KXtlLnJlbW92ZUVkZ2UoZS5fZWRnZU9ianNbdF0pfTtkZWxldGUgdGhpcy5fbm9kZXNbdF0sdGhpcy5faXNDb21wb3VuZCYmKHRoaXMuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0KHQpLGRlbGV0ZSB0aGlzLl9wYXJlbnRbdF0sZUJ0LmVhY2godGhpcy5jaGlsZHJlbih0KSwoZnVuY3Rpb24odCl7ZS5zZXRQYXJlbnQodCl9KSksZGVsZXRlIHRoaXMuX2NoaWxkcmVuW3RdKSxlQnQuZWFjaChlQnQua2V5cyh0aGlzLl9pblt0XSksbiksZGVsZXRlIHRoaXMuX2luW3RdLGRlbGV0ZSB0aGlzLl9wcmVkc1t0XSxlQnQuZWFjaChlQnQua2V5cyh0aGlzLl9vdXRbdF0pLG4pLGRlbGV0ZSB0aGlzLl9vdXRbdF0sZGVsZXRlIHRoaXMuX3N1Y3NbdF0sLS10aGlzLl9ub2RlQ291bnR9cmV0dXJuIHRoaXN9LHJCdC5wcm90b3R5cGUuc2V0UGFyZW50PWZ1bmN0aW9uKHQsZSl7aWYoIXRoaXMuX2lzQ29tcG91bmQpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qgc2V0IHBhcmVudCBpbiBhIG5vbi1jb21wb3VuZCBncmFwaCIpO2lmKGVCdC5pc1VuZGVmaW5lZChlKSllPWlCdDtlbHNle2Zvcih2YXIgbj1lKz0iIjshZUJ0LmlzVW5kZWZpbmVkKG4pO249dGhpcy5wYXJlbnQobikpaWYobj09PXQpdGhyb3cgbmV3IEVycm9yKCJTZXR0aW5nICIrZSsiIGFzIHBhcmVudCBvZiAiK3QrIiB3b3VsZCBjcmVhdGUgYSBjeWNsZSIpO3RoaXMuc2V0Tm9kZShlKX1yZXR1cm4gdGhpcy5zZXROb2RlKHQpLHRoaXMuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0KHQpLHRoaXMuX3BhcmVudFt0XT1lLHRoaXMuX2NoaWxkcmVuW2VdW3RdPSEwLHRoaXN9LHJCdC5wcm90b3R5cGUuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0PWZ1bmN0aW9uKHQpe2RlbGV0ZSB0aGlzLl9jaGlsZHJlblt0aGlzLl9wYXJlbnRbdF1dW3RdfSxyQnQucHJvdG90eXBlLnBhcmVudD1mdW5jdGlvbih0KXtpZih0aGlzLl9pc0NvbXBvdW5kKXt2YXIgZT10aGlzLl9wYXJlbnRbdF07aWYoZSE9PWlCdClyZXR1cm4gZX19LHJCdC5wcm90b3R5cGUuY2hpbGRyZW49ZnVuY3Rpb24odCl7aWYoZUJ0LmlzVW5kZWZpbmVkKHQpJiYodD1pQnQpLHRoaXMuX2lzQ29tcG91bmQpe3ZhciBlPXRoaXMuX2NoaWxkcmVuW3RdO2lmKGUpcmV0dXJuIGVCdC5rZXlzKGUpfWVsc2V7aWYodD09PWlCdClyZXR1cm4gdGhpcy5ub2RlcygpO2lmKHRoaXMuaGFzTm9kZSh0KSlyZXR1cm5bXX19LHJCdC5wcm90b3R5cGUucHJlZGVjZXNzb3JzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3ByZWRzW3RdO2lmKGUpcmV0dXJuIGVCdC5rZXlzKGUpfSxyQnQucHJvdG90eXBlLnN1Y2Nlc3NvcnM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fc3Vjc1t0XTtpZihlKXJldHVybiBlQnQua2V5cyhlKX0sckJ0LnByb3RvdHlwZS5uZWlnaGJvcnM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wcmVkZWNlc3NvcnModCk7aWYoZSlyZXR1cm4gZUJ0LnVuaW9uKGUsdGhpcy5zdWNjZXNzb3JzKHQpKX0sckJ0LnByb3RvdHlwZS5pc0xlYWY9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT0odGhpcy5pc0RpcmVjdGVkKCk/dGhpcy5zdWNjZXNzb3JzKHQpOnRoaXMubmVpZ2hib3JzKHQpKS5sZW5ndGh9LHJCdC5wcm90b3R5cGUuZmlsdGVyTm9kZXM9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHRoaXMuY29uc3RydWN0b3Ioe2RpcmVjdGVkOnRoaXMuX2lzRGlyZWN0ZWQsbXVsdGlncmFwaDp0aGlzLl9pc011bHRpZ3JhcGgsY29tcG91bmQ6dGhpcy5faXNDb21wb3VuZH0pO2Uuc2V0R3JhcGgodGhpcy5ncmFwaCgpKTt2YXIgbj10aGlzO2VCdC5lYWNoKHRoaXMuX25vZGVzLChmdW5jdGlvbihuLGkpe3QoaSkmJmUuc2V0Tm9kZShpLG4pfSkpLGVCdC5lYWNoKHRoaXMuX2VkZ2VPYmpzLChmdW5jdGlvbih0KXtlLmhhc05vZGUodC52KSYmZS5oYXNOb2RlKHQudykmJmUuc2V0RWRnZSh0LG4uZWRnZSh0KSl9KSk7dmFyIGk9e307ZnVuY3Rpb24gcih0KXt2YXIgbz1uLnBhcmVudCh0KTtyZXR1cm4gdm9pZCAwPT09b3x8ZS5oYXNOb2RlKG8pPyhpW3RdPW8sbyk6byBpbiBpP2lbb106cihvKX1yZXR1cm4gdGhpcy5faXNDb21wb3VuZCYmZUJ0LmVhY2goZS5ub2RlcygpLChmdW5jdGlvbih0KXtlLnNldFBhcmVudCh0LHIodCkpfSkpLGV9LHJCdC5wcm90b3R5cGUuc2V0RGVmYXVsdEVkZ2VMYWJlbD1mdW5jdGlvbih0KXtyZXR1cm4gZUJ0LmlzRnVuY3Rpb24odCl8fCh0PWVCdC5jb25zdGFudCh0KSksdGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuPXQsdGhpc30sckJ0LnByb3RvdHlwZS5lZGdlQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZUNvdW50fSxyQnQucHJvdG90eXBlLmVkZ2VzPWZ1bmN0aW9uKCl7cmV0dXJuIGVCdC52YWx1ZXModGhpcy5fZWRnZU9ianMpfSxyQnQucHJvdG90eXBlLnNldFBhdGg9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLGk9YXJndW1lbnRzO3JldHVybiBlQnQucmVkdWNlKHQsKGZ1bmN0aW9uKHQscil7cmV0dXJuIGkubGVuZ3RoPjE/bi5zZXRFZGdlKHQscixlKTpuLnNldEVkZ2UodCxyKSxyfSkpLHRoaXN9LHJCdC5wcm90b3R5cGUuc2V0RWRnZT1mdW5jdGlvbigpe3ZhciB0LGUsbixpLHI9ITEsbz1hcmd1bWVudHNbMF07Im9iamVjdCI9PXR5cGVvZiBvJiZudWxsIT09byYmInYiaW4gbz8odD1vLnYsZT1vLncsbj1vLm5hbWUsMj09PWFyZ3VtZW50cy5sZW5ndGgmJihpPWFyZ3VtZW50c1sxXSxyPSEwKSk6KHQ9byxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1szXSxhcmd1bWVudHMubGVuZ3RoPjImJihpPWFyZ3VtZW50c1syXSxyPSEwKSksdD0iIit0LGU9IiIrZSxlQnQuaXNVbmRlZmluZWQobil8fChuPSIiK24pO3ZhciBhPXNCdCh0aGlzLl9pc0RpcmVjdGVkLHQsZSxuKTtpZihlQnQuaGFzKHRoaXMuX2VkZ2VMYWJlbHMsYSkpcmV0dXJuIHImJih0aGlzLl9lZGdlTGFiZWxzW2FdPWkpLHRoaXM7aWYoIWVCdC5pc1VuZGVmaW5lZChuKSYmIXRoaXMuX2lzTXVsdGlncmFwaCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBzZXQgYSBuYW1lZCBlZGdlIHdoZW4gaXNNdWx0aWdyYXBoID0gZmFsc2UiKTt0aGlzLnNldE5vZGUodCksdGhpcy5zZXROb2RlKGUpLHRoaXMuX2VkZ2VMYWJlbHNbYV09cj9pOnRoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbih0LGUsbik7dmFyIHM9bEJ0KHRoaXMuX2lzRGlyZWN0ZWQsdCxlLG4pO3JldHVybiB0PXMudixlPXMudyxPYmplY3QuZnJlZXplKHMpLHRoaXMuX2VkZ2VPYmpzW2FdPXMsb0J0KHRoaXMuX3ByZWRzW2VdLHQpLG9CdCh0aGlzLl9zdWNzW3RdLGUpLHRoaXMuX2luW2VdW2FdPXMsdGhpcy5fb3V0W3RdW2FdPXMsdGhpcy5fZWRnZUNvdW50KyssdGhpc30sckJ0LnByb3RvdHlwZS5lZGdlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT0xPT09YXJndW1lbnRzLmxlbmd0aD9jQnQodGhpcy5faXNEaXJlY3RlZCxhcmd1bWVudHNbMF0pOnNCdCh0aGlzLl9pc0RpcmVjdGVkLHQsZSxuKTtyZXR1cm4gdGhpcy5fZWRnZUxhYmVsc1tpXX0sckJ0LnByb3RvdHlwZS5oYXNFZGdlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT0xPT09YXJndW1lbnRzLmxlbmd0aD9jQnQodGhpcy5faXNEaXJlY3RlZCxhcmd1bWVudHNbMF0pOnNCdCh0aGlzLl9pc0RpcmVjdGVkLHQsZSxuKTtyZXR1cm4gZUJ0Lmhhcyh0aGlzLl9lZGdlTGFiZWxzLGkpfSxyQnQucHJvdG90eXBlLnJlbW92ZUVkZ2U9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPTE9PT1hcmd1bWVudHMubGVuZ3RoP2NCdCh0aGlzLl9pc0RpcmVjdGVkLGFyZ3VtZW50c1swXSk6c0J0KHRoaXMuX2lzRGlyZWN0ZWQsdCxlLG4pLHI9dGhpcy5fZWRnZU9ianNbaV07cmV0dXJuIHImJih0PXIudixlPXIudyxkZWxldGUgdGhpcy5fZWRnZUxhYmVsc1tpXSxkZWxldGUgdGhpcy5fZWRnZU9ianNbaV0sYUJ0KHRoaXMuX3ByZWRzW2VdLHQpLGFCdCh0aGlzLl9zdWNzW3RdLGUpLGRlbGV0ZSB0aGlzLl9pbltlXVtpXSxkZWxldGUgdGhpcy5fb3V0W3RdW2ldLHRoaXMuX2VkZ2VDb3VudC0tKSx0aGlzfSxyQnQucHJvdG90eXBlLmluRWRnZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9pblt0XTtpZihuKXt2YXIgaT1lQnQudmFsdWVzKG4pO3JldHVybiBlP2VCdC5maWx0ZXIoaSwoZnVuY3Rpb24odCl7cmV0dXJuIHQudj09PWV9KSk6aX19LHJCdC5wcm90b3R5cGUub3V0RWRnZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9vdXRbdF07aWYobil7dmFyIGk9ZUJ0LnZhbHVlcyhuKTtyZXR1cm4gZT9lQnQuZmlsdGVyKGksKGZ1bmN0aW9uKHQpe3JldHVybiB0Lnc9PT1lfSkpOml9fSxyQnQucHJvdG90eXBlLm5vZGVFZGdlcz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuaW5FZGdlcyh0LGUpO2lmKG4pcmV0dXJuIG4uY29uY2F0KHRoaXMub3V0RWRnZXModCxlKSl9O3ZhciB1QnQ9e0dyYXBoOm5CdCx2ZXJzaW9uOiIyLjEuOCJ9LGhCdD10QnQsZEJ0PW5CdCxwQnQ9e3dyaXRlOmZ1bmN0aW9uIGZCdCh0KXt2YXIgZT17b3B0aW9uczp7ZGlyZWN0ZWQ6dC5pc0RpcmVjdGVkKCksbXVsdGlncmFwaDp0LmlzTXVsdGlncmFwaCgpLGNvbXBvdW5kOnQuaXNDb21wb3VuZCgpfSxub2RlczpnQnQodCksZWRnZXM6X0J0KHQpfTtyZXR1cm4gaEJ0LmlzVW5kZWZpbmVkKHQuZ3JhcGgoKSl8fChlLnZhbHVlPWhCdC5jbG9uZSh0LmdyYXBoKCkpKSxlfSxyZWFkOmZ1bmN0aW9uIG1CdCh0KXt2YXIgZT1uZXcgZEJ0KHQub3B0aW9ucykuc2V0R3JhcGgodC52YWx1ZSk7cmV0dXJuIGhCdC5lYWNoKHQubm9kZXMsKGZ1bmN0aW9uKHQpe2Uuc2V0Tm9kZSh0LnYsdC52YWx1ZSksdC5wYXJlbnQmJmUuc2V0UGFyZW50KHQudix0LnBhcmVudCl9KSksaEJ0LmVhY2godC5lZGdlcywoZnVuY3Rpb24odCl7ZS5zZXRFZGdlKHt2OnQudix3OnQudyxuYW1lOnQubmFtZX0sdC52YWx1ZSl9KSksZX19O2Z1bmN0aW9uIGdCdCh0KXtyZXR1cm4gaEJ0Lm1hcCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGUpe3ZhciBuPXQubm9kZShlKSxpPXQucGFyZW50KGUpLHI9e3Y6ZX07cmV0dXJuIGhCdC5pc1VuZGVmaW5lZChuKXx8KHIudmFsdWU9biksaEJ0LmlzVW5kZWZpbmVkKGkpfHwoci5wYXJlbnQ9aSkscn0pKX1mdW5jdGlvbiBfQnQodCl7cmV0dXJuIGhCdC5tYXAodC5lZGdlcygpLChmdW5jdGlvbihlKXt2YXIgbj10LmVkZ2UoZSksaT17djplLnYsdzplLnd9O3JldHVybiBoQnQuaXNVbmRlZmluZWQoZS5uYW1lKXx8KGkubmFtZT1lLm5hbWUpLGhCdC5pc1VuZGVmaW5lZChuKXx8KGkudmFsdWU9biksaX0pKX12YXIgeUJ0PXRCdCx2QnQ9dEJ0LGJCdD14QnQ7ZnVuY3Rpb24geEJ0KCl7dGhpcy5fYXJyPVtdLHRoaXMuX2tleUluZGljZXM9e319eEJ0LnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fyci5sZW5ndGh9LHhCdC5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcnIubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5rZXl9KSl9LHhCdC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB2QnQuaGFzKHRoaXMuX2tleUluZGljZXMsdCl9LHhCdC5wcm90b3R5cGUucHJpb3JpdHk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fa2V5SW5kaWNlc1t0XTtpZih2b2lkIDAhPT1lKXJldHVybiB0aGlzLl9hcnJbZV0ucHJpb3JpdHl9LHhCdC5wcm90b3R5cGUubWluPWZ1bmN0aW9uKCl7aWYoMD09PXRoaXMuc2l6ZSgpKXRocm93IG5ldyBFcnJvcigiUXVldWUgdW5kZXJmbG93Iik7cmV0dXJuIHRoaXMuX2FyclswXS5rZXl9LHhCdC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fa2V5SW5kaWNlcztpZih0PVN0cmluZyh0KSwhdkJ0LmhhcyhuLHQpKXt2YXIgaT10aGlzLl9hcnIscj1pLmxlbmd0aDtyZXR1cm4gblt0XT1yLGkucHVzaCh7a2V5OnQscHJpb3JpdHk6ZX0pLHRoaXMuX2RlY3JlYXNlKHIpLCEwfXJldHVybiExfSx4QnQucHJvdG90eXBlLnJlbW92ZU1pbj1mdW5jdGlvbigpe3RoaXMuX3N3YXAoMCx0aGlzLl9hcnIubGVuZ3RoLTEpO3ZhciB0PXRoaXMuX2Fyci5wb3AoKTtyZXR1cm4gZGVsZXRlIHRoaXMuX2tleUluZGljZXNbdC5rZXldLHRoaXMuX2hlYXBpZnkoMCksdC5rZXl9LHhCdC5wcm90b3R5cGUuZGVjcmVhc2U9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9rZXlJbmRpY2VzW3RdO2lmKGU+dGhpcy5fYXJyW25dLnByaW9yaXR5KXRocm93IG5ldyBFcnJvcigiTmV3IHByaW9yaXR5IGlzIGdyZWF0ZXIgdGhhbiBjdXJyZW50IHByaW9yaXR5LiBLZXk6ICIrdCsiIE9sZDogIit0aGlzLl9hcnJbbl0ucHJpb3JpdHkrIiBOZXc6ICIrZSk7dGhpcy5fYXJyW25dLnByaW9yaXR5PWUsdGhpcy5fZGVjcmVhc2Uobil9LHhCdC5wcm90b3R5cGUuX2hlYXBpZnk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYXJyLG49Mip0LGk9bisxLHI9dDtuPGUubGVuZ3RoJiYocj1lW25dLnByaW9yaXR5PGVbcl0ucHJpb3JpdHk/bjpyLGk8ZS5sZW5ndGgmJihyPWVbaV0ucHJpb3JpdHk8ZVtyXS5wcmlvcml0eT9pOnIpLHIhPT10JiYodGhpcy5fc3dhcCh0LHIpLHRoaXMuX2hlYXBpZnkocikpKX0seEJ0LnByb3RvdHlwZS5fZGVjcmVhc2U9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49dGhpcy5fYXJyLGk9blt0XS5wcmlvcml0eTswIT09dCYmIShuW2U9dD4+MV0ucHJpb3JpdHk8aSk7KXRoaXMuX3N3YXAodCxlKSx0PWV9LHhCdC5wcm90b3R5cGUuX3N3YXA9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9hcnIsaT10aGlzLl9rZXlJbmRpY2VzLHI9blt0XSxvPW5bZV07blt0XT1vLG5bZV09cixpW28ua2V5XT10LGlbci5rZXldPWV9O3ZhciB3QnQ9YkJ0LFNCdD1mdW5jdGlvbiBNQnQodCxlLG4saSl7cmV0dXJuKGZ1bmN0aW9uIHIodCxlLG4saSl7dmFyIHIsbyxhPXt9LHM9bmV3IHdCdCxsPWZ1bmN0aW9uKHQpe3ZhciBlPXQudiE9PXI/dC52OnQudyxpPWFbZV0sbD1uKHQpLGM9by5kaXN0YW5jZStsO2lmKGw8MCl0aHJvdyBuZXcgRXJyb3IoImRpamtzdHJhIGRvZXMgbm90IGFsbG93IG5lZ2F0aXZlIGVkZ2Ugd2VpZ2h0cy4gQmFkIGVkZ2U6ICIrdCsiIFdlaWdodDogIitsKTtjPGkuZGlzdGFuY2UmJihpLmRpc3RhbmNlPWMsaS5wcmVkZWNlc3Nvcj1yLHMuZGVjcmVhc2UoZSxjKSl9O2Zvcih0Lm5vZGVzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG49dD09PWU/MDpOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7YVt0XT17ZGlzdGFuY2U6bn0scy5hZGQodCxuKX0pKTtzLnNpemUoKT4wJiYocj1zLnJlbW92ZU1pbigpLChvPWFbcl0pLmRpc3RhbmNlIT09TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTspaShyKS5mb3JFYWNoKGwpO3JldHVybiBhfSkodCxTdHJpbmcoZSksbnx8RUJ0LGl8fGZ1bmN0aW9uKGUpe3JldHVybiB0Lm91dEVkZ2VzKGUpfSl9LEVCdD10QnQuY29uc3RhbnQoMSksVEJ0PVNCdCxDQnQ9dEJ0LEFCdD10QnQsa0J0PWZ1bmN0aW9uIExCdCh0KXt2YXIgZT0wLG49W10saT17fSxyPVtdO2Z1bmN0aW9uIG8oYSl7dmFyIHM9aVthXT17b25TdGFjazohMCxsb3dsaW5rOmUsaW5kZXg6ZSsrfTtpZihuLnB1c2goYSksdC5zdWNjZXNzb3JzKGEpLmZvckVhY2goKGZ1bmN0aW9uKHQpe0FCdC5oYXMoaSx0KT9pW3RdLm9uU3RhY2smJihzLmxvd2xpbms9TWF0aC5taW4ocy5sb3dsaW5rLGlbdF0uaW5kZXgpKToobyh0KSxzLmxvd2xpbms9TWF0aC5taW4ocy5sb3dsaW5rLGlbdF0ubG93bGluaykpfSkpLHMubG93bGluaz09PXMuaW5kZXgpe3ZhciBsLGM9W107ZG97bD1uLnBvcCgpLGlbbF0ub25TdGFjaz0hMSxjLnB1c2gobCl9d2hpbGUoYSE9PWwpO3IucHVzaChjKX19cmV0dXJuIHQubm9kZXMoKS5mb3JFYWNoKChmdW5jdGlvbih0KXtBQnQuaGFzKGksdCl8fG8odCl9KSkscn0sUEJ0PXRCdCxOQnQ9a0J0LElCdD10QnQuY29uc3RhbnQoMSksUkJ0PXRCdCxPQnQ9ekJ0O2Z1bmN0aW9uIHpCdCh0KXt2YXIgZT17fSxuPXt9LGk9W107aWYoUkJ0LmVhY2godC5zaW5rcygpLChmdW5jdGlvbiByKG8pe2lmKFJCdC5oYXMobixvKSl0aHJvdyBuZXcgREJ0O1JCdC5oYXMoZSxvKXx8KG5bb109ITAsZVtvXT0hMCxSQnQuZWFjaCh0LnByZWRlY2Vzc29ycyhvKSxyKSxkZWxldGUgbltvXSxpLnB1c2gobykpfSkpLFJCdC5zaXplKGUpIT09dC5ub2RlQ291bnQoKSl0aHJvdyBuZXcgREJ0O3JldHVybiBpfWZ1bmN0aW9uIERCdCgpe316QnQuQ3ljbGVFeGNlcHRpb249REJ0LERCdC5wcm90b3R5cGU9bmV3IEVycm9yO3ZhciBCQnQ9T0J0LEhCdD10QnQsRkJ0PWZ1bmN0aW9uIFZCdCh0LGUsbil7SEJ0LmlzQXJyYXkoZSl8fChlPVtlXSk7dmFyIGk9KHQuaXNEaXJlY3RlZCgpP3Quc3VjY2Vzc29yczp0Lm5laWdoYm9ycykuYmluZCh0KSxyPVtdLG89e307cmV0dXJuIEhCdC5lYWNoKGUsKGZ1bmN0aW9uKGUpe2lmKCF0Lmhhc05vZGUoZSkpdGhyb3cgbmV3IEVycm9yKCJHcmFwaCBkb2VzIG5vdCBoYXZlIG5vZGU6ICIrZSk7VUJ0KHQsZSwicG9zdCI9PT1uLG8saSxyKX0pKSxyfTtmdW5jdGlvbiBVQnQodCxlLG4saSxyLG8pe0hCdC5oYXMoaSxlKXx8KGlbZV09ITAsbnx8by5wdXNoKGUpLEhCdC5lYWNoKHIoZSksKGZ1bmN0aW9uKGUpe1VCdCh0LGUsbixpLHIsbyl9KSksbiYmby5wdXNoKGUpKX12YXIgakJ0LEdCdD1GQnQsV0J0PUZCdCxxQnQ9dEJ0LFlCdD1uQnQsWEJ0PWJCdCwkQnQ9e0dyYXBoOnVCdC5HcmFwaCxqc29uOnBCdCxhbGc6e2NvbXBvbmVudHM6ZnVuY3Rpb24gS0J0KHQpe3ZhciBlLG49e30saT1bXTtmdW5jdGlvbiByKGkpe3lCdC5oYXMobixpKXx8KG5baV09ITAsZS5wdXNoKGkpLHlCdC5lYWNoKHQuc3VjY2Vzc29ycyhpKSxyKSx5QnQuZWFjaCh0LnByZWRlY2Vzc29ycyhpKSxyKSl9cmV0dXJuIHlCdC5lYWNoKHQubm9kZXMoKSwoZnVuY3Rpb24odCl7ZT1bXSxyKHQpLGUubGVuZ3RoJiZpLnB1c2goZSl9KSksaX0sZGlqa3N0cmE6U0J0LGRpamtzdHJhQWxsOmZ1bmN0aW9uIFpCdCh0LGUsbil7cmV0dXJuIENCdC50cmFuc2Zvcm0odC5ub2RlcygpLChmdW5jdGlvbihpLHIpe2lbcl09VEJ0KHQscixlLG4pfSkse30pfSxmaW5kQ3ljbGVzOmZ1bmN0aW9uIEpCdCh0KXtyZXR1cm4gUEJ0LmZpbHRlcihOQnQodCksKGZ1bmN0aW9uKGUpe3JldHVybiBlLmxlbmd0aD4xfHwxPT09ZS5sZW5ndGgmJnQuaGFzRWRnZShlWzBdLGVbMF0pfSkpfSxmbG95ZFdhcnNoYWxsOmZ1bmN0aW9uIFFCdCh0LGUsbil7cmV0dXJuKGZ1bmN0aW9uIGkodCxlLG4pe3ZhciBpPXt9LHI9dC5ub2RlcygpO3JldHVybiByLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lbdF09e30saVt0XVt0XT17ZGlzdGFuY2U6MH0sci5mb3JFYWNoKChmdW5jdGlvbihlKXt0IT09ZSYmKGlbdF1bZV09e2Rpc3RhbmNlOk51bWJlci5QT1NJVElWRV9JTkZJTklUWX0pfSkpLG4odCkuZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIHI9bi52PT09dD9uLnc6bi52LG89ZShuKTtpW3RdW3JdPXtkaXN0YW5jZTpvLHByZWRlY2Vzc29yOnR9fSkpfSkpLHIuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9aVt0XTtyLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBvPWlbbl07ci5mb3JFYWNoKChmdW5jdGlvbihuKXt2YXIgaT1lW25dLHI9b1tuXSxhPW9bdF0uZGlzdGFuY2UraS5kaXN0YW5jZTthPHIuZGlzdGFuY2UmJihyLmRpc3RhbmNlPWEsci5wcmVkZWNlc3Nvcj1pLnByZWRlY2Vzc29yKX0pKX0pKX0pKSxpfSkodCxlfHxJQnQsbnx8ZnVuY3Rpb24oZSl7cmV0dXJuIHQub3V0RWRnZXMoZSl9KX0saXNBY3ljbGljOmZ1bmN0aW9uIHRIdCh0KXt0cnl7QkJ0KHQpfWNhdGNoKHQpe2lmKHQgaW5zdGFuY2VvZiBCQnQuQ3ljbGVFeGNlcHRpb24pcmV0dXJuITE7dGhyb3cgdH1yZXR1cm4hMH0scG9zdG9yZGVyOmZ1bmN0aW9uIGVIdCh0LGUpe3JldHVybiBHQnQodCxlLCJwb3N0Iil9LHByZW9yZGVyOmZ1bmN0aW9uIG5IdCh0LGUpe3JldHVybiBXQnQodCxlLCJwcmUiKX0scHJpbTpmdW5jdGlvbiBpSHQodCxlKXt2YXIgbixpPW5ldyBZQnQscj17fSxvPW5ldyBYQnQ7ZnVuY3Rpb24gYSh0KXt2YXIgaT10LnY9PT1uP3Qudzp0LnYsYT1vLnByaW9yaXR5KGkpO2lmKHZvaWQgMCE9PWEpe3ZhciBzPWUodCk7czxhJiYocltpXT1uLG8uZGVjcmVhc2UoaSxzKSl9fWlmKDA9PT10Lm5vZGVDb3VudCgpKXJldHVybiBpO3FCdC5lYWNoKHQubm9kZXMoKSwoZnVuY3Rpb24odCl7by5hZGQodCxOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpLGkuc2V0Tm9kZSh0KX0pKSxvLmRlY3JlYXNlKHQubm9kZXMoKVswXSwwKTtmb3IodmFyIHM9ITE7by5zaXplKCk+MDspe2lmKG49by5yZW1vdmVNaW4oKSxxQnQuaGFzKHIsbikpaS5zZXRFZGdlKG4scltuXSk7ZWxzZXtpZihzKXRocm93IG5ldyBFcnJvcigiSW5wdXQgZ3JhcGggaXMgbm90IGNvbm5lY3RlZDogIit0KTtzPSEwfXQubm9kZUVkZ2VzKG4pLmZvckVhY2goYSl9cmV0dXJuIGl9LHRhcmphbjprQnQsdG9wc29ydDpPQnR9LHZlcnNpb246dUJ0LnZlcnNpb259O3RyeXtqQnQ9JEJ0fWNhdGNoKHQpe31qQnR8fChqQnQ9d2luZG93LmdyYXBobGliKTt2YXIgckh0LG9IdD1qQnQsYUh0PVFOdCxzSHQ9ekN0LGxIdD1OTHQsY0h0PUtrdCx1SHQ9cEF0LGhIdD1mdW5jdGlvbiBkSHQodCxlLG4pe2lmKCF1SHQobikpcmV0dXJuITE7dmFyIGk9dHlwZW9mIGU7cmV0dXJuISEoIm51bWJlciI9PWk/bEh0KG4pJiZjSHQoZSxuLmxlbmd0aCk6InN0cmluZyI9PWkmJmUgaW4gbikmJnNIdChuW2VdLHQpfSxwSHQ9ekN0LGZIdD1oSHQsbUh0PXFMdCxnSHQ9T2JqZWN0LnByb3RvdHlwZSxfSHQ9Z0h0Lmhhc093blByb3BlcnR5LHlIdD14RHQoKGZ1bmN0aW9uKHQsZSl7dD1PYmplY3QodCk7dmFyIG49LTEsaT1lLmxlbmd0aCxyPWk+Mj9lWzJdOnZvaWQgMDtmb3IociYmZkh0KGVbMF0sZVsxXSxyKSYmKGk9MSk7KytuPGk7KWZvcih2YXIgbz1lW25dLGE9bUh0KG8pLHM9LTEsbD1hLmxlbmd0aDsrK3M8bDspe3ZhciBjPWFbc10sdT10W2NdOyh2b2lkIDA9PT11fHxwSHQodSxnSHRbY10pJiYhX0h0LmNhbGwodCxjKSkmJih0W2NdPW9bY10pfXJldHVybiB0fSkpLHZIdD1JT3QsYkh0PU5MdCx4SHQ9REx0LHdIdD0vXHMvLFNIdD0vXlxzKy8sTUh0PXBBdCxFSHQ9YlJ0LFRIdD0vXlstK10weFswLTlhLWZdKyQvaSxDSHQ9L14wYlswMV0rJC9pLEFIdD0vXjBvWzAtN10rJC9pLGtIdD1wYXJzZUludCxMSHQ9ZnVuY3Rpb24gUEh0KHQpe3JldHVybiB0PzEvMD09PSh0PShmdW5jdGlvbiBlKHQpe2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdDtpZihFSHQodCkpcmV0dXJuIE5hTjtpZihNSHQodCkpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2Y/dC52YWx1ZU9mKCk6dDt0PU1IdChlKT9lKyIiOmV9aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiAwPT09dD90Oit0O3Q9KGZ1bmN0aW9uIG4odCl7cmV0dXJuIHQ/dC5zbGljZSgwLChmdW5jdGlvbiBlKHQpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS0mJndIdC50ZXN0KHQuY2hhckF0KGUpKTspO3JldHVybiBlfSkodCkrMSkucmVwbGFjZShTSHQsIiIpOnR9KSh0KTt2YXIgaT1DSHQudGVzdCh0KTtyZXR1cm4gaXx8QUh0LnRlc3QodCk/a0h0KHQuc2xpY2UoMiksaT8yOjgpOlRIdC50ZXN0KHQpP05hTjordH0pKHQpKXx8dD09PS0xLzA/MTc5NzY5MzEzNDg2MjMxNTdlMjkyKih0PDA/LTE6MSk6dD09dD90OjA6MD09PXQ/dDowfSxOSHQ9TEh0LElIdD1TRHQsUkh0PUlPdCxPSHQ9TWF0aC5tYXgsekh0PShmdW5jdGlvbiBCSHQodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixpKXt2YXIgcj1PYmplY3QoZSk7aWYoIWJIdChlKSl7dmFyIG89dkh0KG4pO2U9eEh0KGUpLG49ZnVuY3Rpb24odCl7cmV0dXJuIG8oclt0XSx0LHIpfX12YXIgYT10KGUsbixpKTtyZXR1cm4gYT4tMT9yW28/ZVthXTphXTp2b2lkIDB9fSkoKGZ1bmN0aW9uIERIdCh0LGUsbil7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO2lmKCFpKXJldHVybi0xO3ZhciByPW51bGw9PW4/MDooZnVuY3Rpb24gbyh0KXt2YXIgZT1OSHQodCksbj1lJTE7cmV0dXJuIGU9PWU/bj9lLW46ZTowfSkobik7cmV0dXJuIHI8MCYmKHI9T0h0KGkrciwwKSksSUh0KHQsUkh0KGUpLHIpfSkpLEhIdD1zRHQsRkh0PWZ1bmN0aW9uIFZIdCh0KXtyZXR1cm4gbnVsbCE9dCYmdC5sZW5ndGg/SEh0KHQsMSk6W119LFVIdD1pSXQsakh0PW1JdCxHSHQ9cUx0LFdIdD1Ta3QscUh0PXNJdCxZSHQ9SU90LFhIdD1iUnQsJEh0PWZ1bmN0aW9uIEtIdCh0LGUsbil7Zm9yKHZhciBpPS0xLHI9dC5sZW5ndGg7KytpPHI7KXt2YXIgbz10W2ldLGE9ZShvKTtpZihudWxsIT1hJiYodm9pZCAwPT09cz9hPT1hJiYhWEh0KGEpOm4oYSxzKSkpdmFyIHM9YSxsPW99cmV0dXJuIGx9LFpIdD0kSHQsSkh0PWZ1bmN0aW9uIFFIdCh0LGUpe3JldHVybiB0PmV9LHRGdD1kSXQsZUZ0PVNrdCxuRnQ9ekN0LGlGdD1mdW5jdGlvbiByRnQodCxlLG4peyh2b2lkIDAhPT1uJiYhbkZ0KHRbZV0sbil8fHZvaWQgMD09PW4mJiEoZSBpbiB0KSkmJmVGdCh0LGUsbil9LG9GdD1oQXQsYUZ0PWhQdCxzRnQ9Umt0LGxGdD1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcsY0Z0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksdUZ0PWxGdC5jYWxsKE9iamVjdCksaEZ0PWZ1bmN0aW9uIGRGdCh0LGUpe2lmKCgiY29uc3RydWN0b3IiIT09ZXx8ImZ1bmN0aW9uIiE9dHlwZW9mIHRbZV0pJiYiX19wcm90b19fIiE9ZSlyZXR1cm4gdFtlXX0scEZ0PU5rdCxmRnQ9cUx0LG1GdD1pRnQsZ0Z0PUtMdC5leHBvcnRzLF9GdD1sTnQseUZ0PVpMdCx2RnQ9eU50LGJGdD1Ha3QseEZ0PVdrdCx3RnQ9VkR0LFNGdD1xa3QuZXhwb3J0cyxNRnQ9X0F0LEVGdD1wQXQsVEZ0PWNMdCxDRnQ9aEZ0LEFGdD1fa3Qsa0Z0PWlGdCxMRnQ9aUl0LFBGdD1wQXQsTkZ0PXFMdCxJRnQ9aEZ0LFJGdD14RHQsT0Z0PWhIdCx6RnQ9ZnVuY3Rpb24gdChlLG4saSxyLG8pe2UhPT1uJiZMRnQobiwoZnVuY3Rpb24oYSxzKXtpZihvfHwobz1uZXcgQUZ0KSxQRnQoYSkpIShmdW5jdGlvbiBsKHQsZSxuLGkscixvLGEpe3ZhciBzPUNGdCh0LG4pLGw9Q0Z0KGUsbiksYz1hLmdldChsKTtpZihjKW1GdCh0LG4sYyk7ZWxzZXt2YXIgdT1vP28ocyxsLG4rIiIsdCxlLGEpOnZvaWQgMCxoPXZvaWQgMD09PXU7aWYoaCl7dmFyIGQ9eEZ0KGwpLHA9IWQmJlNGdChsKSxmPSFkJiYhcCYmVEZ0KGwpO3U9bCxkfHxwfHxmP3hGdChzKT91PXM6d0Z0KHMpP3U9eUZ0KHMpOnA/KGg9ITEsdT1nRnQobCwhMCkpOmY/KGg9ITEsdT1fRnQobCwhMCkpOnU9W106KGZ1bmN0aW9uIG0odCl7aWYoIXNGdCh0KXx8IltvYmplY3QgT2JqZWN0XSIhPW9GdCh0KSlyZXR1cm4hMTt2YXIgZT1hRnQodCk7aWYobnVsbD09PWUpcmV0dXJuITA7dmFyIG49Y0Z0LmNhbGwoZSwiY29uc3RydWN0b3IiKSYmZS5jb25zdHJ1Y3RvcjtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgbiYmbiBpbnN0YW5jZW9mIG4mJmxGdC5jYWxsKG4pPT11RnR9KShsKXx8YkZ0KGwpPyh1PXMsYkZ0KHMpP3U9KGZ1bmN0aW9uIGcodCl7cmV0dXJuIHBGdCh0LGZGdCh0KSl9KShzKTpFRnQocykmJiFNRnQocyl8fCh1PXZGdChsKSkpOmg9ITF9aCYmKGEuc2V0KGwsdSkscih1LGwsaSxvLGEpLGEuZGVsZXRlKGwpKSxtRnQodCxuLHUpfX0pKGUsbixzLGksdCxyLG8pO2Vsc2V7dmFyIGM9cj9yKElGdChlLHMpLGEscysiIixlLG4sbyk6dm9pZCAwO3ZvaWQgMD09PWMmJihjPWEpLGtGdChlLHMsYyl9fSksTkZ0KX0sREZ0PShmdW5jdGlvbiBCRnQodCl7cmV0dXJuIFJGdCgoZnVuY3Rpb24oZSxuKXt2YXIgaT0tMSxyPW4ubGVuZ3RoLG89cj4xP25bci0xXTp2b2lkIDAsYT1yPjI/blsyXTp2b2lkIDA7Zm9yKG89dC5sZW5ndGg+MyYmImZ1bmN0aW9uIj09dHlwZW9mIG8/KHItLSxvKTp2b2lkIDAsYSYmT0Z0KG5bMF0sblsxXSxhKSYmKG89cjwzP3ZvaWQgMDpvLHI9MSksZT1PYmplY3QoZSk7KytpPHI7KXt2YXIgcz1uW2ldO3MmJnQoZSxzLGksbyl9cmV0dXJuIGV9KSl9KSgoZnVuY3Rpb24odCxlLG4pe3pGdCh0LGUsbil9KSksSEZ0PWZ1bmN0aW9uIEZGdCh0LGUpe3JldHVybiB0PGV9LFZGdD0kSHQsVUZ0PUhGdCxqRnQ9ZEl0LEdGdD0kSHQsV0Z0PUlPdCxxRnQ9SEZ0LFlGdD1pQXQsWEZ0PUFrdCwkRnQ9S1J0LEtGdD1La3QsWkZ0PXBBdCxKRnQ9UVJ0LFFGdD1pT3QsdFZ0PWZ1bmN0aW9uIGVWdCh0LGUsbixpKXtpZighWkZ0KHQpKXJldHVybiB0O2Zvcih2YXIgcj0tMSxvPShlPSRGdChlLHQpKS5sZW5ndGgsYT1vLTEscz10O251bGwhPXMmJisrcjxvOyl7dmFyIGw9SkZ0KGVbcl0pLGM9bjtpZigiX19wcm90b19fIj09PWx8fCJjb25zdHJ1Y3RvciI9PT1sfHwicHJvdG90eXBlIj09PWwpcmV0dXJuIHQ7aWYociE9YSl7dmFyIHU9c1tsXTt2b2lkIDA9PT0oYz1pP2kodSxsLHMpOnZvaWQgMCkmJihjPVpGdCh1KT91OktGdChlW3IrMV0pP1tdOnt9KX1YRnQocyxsLGMpLHM9c1tsXX1yZXR1cm4gdH0sblZ0PUtSdCxpVnQ9X090LHJWdD1GSHQsb1Z0PWhEdCxhVnQ9Z0R0LHNWdD0oZnVuY3Rpb24gbFZ0KHQpe3JldHVybiBhVnQob1Z0KHQsdm9pZCAwLHJWdCksdCsiIil9KSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD97fTooZnVuY3Rpb24gbih0LGUpe3JldHVybihmdW5jdGlvbiBuKHQsZSxpKXtmb3IodmFyIHI9LTEsbz1lLmxlbmd0aCxhPXt9OysrcjxvOyl7dmFyIHM9ZVtyXSxsPVFGdCh0LHMpO2kobCxzKSYmdFZ0KGEsblZ0KHMsdCksbCl9cmV0dXJuIGF9KSh0LGUsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGlWdCh0LG4pfSkpfSkodCxlKX0pKSxjVnQ9TWF0aC5jZWlsLHVWdD1NYXRoLm1heCxoVnQ9aEh0LGRWdD1MSHQscFZ0PShmdW5jdGlvbiBmVnQodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixpKXtyZXR1cm4gaSYmIm51bWJlciIhPXR5cGVvZiBpJiZoVnQoZSxuLGkpJiYobj1pPXZvaWQgMCksZT1kVnQoZSksdm9pZCAwPT09bj8obj1lLGU9MCk6bj1kVnQobiksKGZ1bmN0aW9uIHIodCxlLG4saSl7Zm9yKHZhciByPS0xLG89dVZ0KGNWdCgoZS10KS8obnx8MSkpLDApLGE9QXJyYXkobyk7by0tOylhW2k/bzorK3JdPXQsdCs9bjtyZXR1cm4gYX0pKGUsbixpPXZvaWQgMD09PWk/ZTxuPzE6LTE6ZFZ0KGkpLHQpfX0pKCksbVZ0PWJSdCxnVnQ9ZnVuY3Rpb24gX1Z0KHQsZSl7aWYodCE9PWUpe3ZhciBuPXZvaWQgMCE9PXQsaT1udWxsPT09dCxyPXQ9PXQsbz1tVnQodCksYT12b2lkIDAhPT1lLHM9bnVsbD09PWUsbD1lPT1lLGM9bVZ0KGUpO2lmKCFzJiYhYyYmIW8mJnQ+ZXx8byYmYSYmbCYmIXMmJiFjfHxpJiZhJiZsfHwhbiYmbHx8IXIpcmV0dXJuIDE7aWYoIWkmJiFvJiYhYyYmdDxlfHxjJiZuJiZyJiYhaSYmIW98fHMmJm4mJnJ8fCFhJiZyfHwhbClyZXR1cm4tMX1yZXR1cm4gMH0seVZ0PXpSdCx2VnQ9aU90LGJWdD1JT3QseFZ0PXN6dCx3VnQ9ckx0LFNWdD1kSXQsTVZ0PVdrdCxFVnQ9c0R0LFRWdD1oSHQsQ1Z0PXhEdCgoZnVuY3Rpb24odCxlKXtpZihudWxsPT10KXJldHVybltdO3ZhciBuPWUubGVuZ3RoO3JldHVybiBuPjEmJlRWdCh0LGVbMF0sZVsxXSk/ZT1bXTpuPjImJlRWdChlWzBdLGVbMV0sZVsyXSkmJihlPVtlWzBdXSksKGZ1bmN0aW9uIGkodCxlLG4pe2U9ZS5sZW5ndGg/eVZ0KGUsKGZ1bmN0aW9uKHQpe3JldHVybiBNVnQodCk/ZnVuY3Rpb24oZSl7cmV0dXJuIHZWdChlLDE9PT10Lmxlbmd0aD90WzBdOnQpfTp0fSkpOltTVnRdO3ZhciBpPS0xO3JldHVybiBlPXlWdChlLHdWdChiVnQpKSwoZnVuY3Rpb24gcih0LGUpe3ZhciBuPXQubGVuZ3RoO2Zvcih0LnNvcnQoZSk7bi0tOyl0W25dPXRbbl0udmFsdWU7cmV0dXJuIHR9KSh4VnQodCwoZnVuY3Rpb24odCxuLHIpe3JldHVybntjcml0ZXJpYTp5VnQoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUodCl9KSksaW5kZXg6KytpLHZhbHVlOnR9fSkpLChmdW5jdGlvbih0LGUpe3JldHVybihmdW5jdGlvbiBpKHQsZSxuKXtmb3IodmFyIGk9LTEscj10LmNyaXRlcmlhLG89ZS5jcml0ZXJpYSxhPXIubGVuZ3RoLHM9bi5sZW5ndGg7KytpPGE7KXt2YXIgbD1nVnQocltpXSxvW2ldKTtpZihsKXJldHVybiBpPj1zP2w6bCooImRlc2MiPT1uW2ldPy0xOjEpfXJldHVybiB0LmluZGV4LWUuaW5kZXh9KSh0LGUsbil9KSl9KSh0LEVWdChlLDEpLFtdKX0pKSxBVnQ9R1J0LGtWdD0wLExWdD1Ba3Q7dHJ5e3JIdD17Y2xvbmVEZWVwOmZ1bmN0aW9uIFBWdCh0KXtyZXR1cm4gYUh0KHQsNSl9LGNvbnN0YW50OmVJdCxkZWZhdWx0czp5SHQsZWFjaDpTSXQsZmlsdGVyOkZPdCxmaW5kOnpIdCxmbGF0dGVuOkZIdCxmb3JFYWNoOnhJdCxmb3JJbjpmdW5jdGlvbiBOVnQodCxlKXtyZXR1cm4gbnVsbD09dD90OlVIdCh0LGpIdChlKSxHSHQpfSxoYXM6cU90LGlzVW5kZWZpbmVkOml6dCxsYXN0OmZ1bmN0aW9uIElWdCh0KXt2YXIgZT1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIGU/dFtlLTFdOnZvaWQgMH0sbWFwOnB6dCxtYXBWYWx1ZXM6ZnVuY3Rpb24gUlZ0KHQsZSl7dmFyIG49e307cmV0dXJuIGU9WUh0KGUpLHFIdCh0LChmdW5jdGlvbih0LGkscil7V0h0KG4saSxlKHQsaSxyKSl9KSksbn0sbWF4OmZ1bmN0aW9uIE9WdCh0KXtyZXR1cm4gdCYmdC5sZW5ndGg/Wkh0KHQsdEZ0LEpIdCk6dm9pZCAwfSxtZXJnZTpERnQsbWluOmZ1bmN0aW9uIHpWdCh0KXtyZXR1cm4gdCYmdC5sZW5ndGg/VkZ0KHQsakZ0LFVGdCk6dm9pZCAwfSxtaW5CeTpmdW5jdGlvbiBEVnQodCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/R0Z0KHQsV0Z0KGUpLHFGdCk6dm9pZCAwfSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4gWUZ0LkRhdGUubm93KCl9LHBpY2s6c1Z0LHJhbmdlOnBWdCxyZWR1Y2U6d3p0LHNvcnRCeTpDVnQsdW5pcXVlSWQ6ZnVuY3Rpb24gQlZ0KHQpe3ZhciBlPSsra1Z0O3JldHVybiBBVnQodCkrZX0sdmFsdWVzOlhEdCx6aXBPYmplY3Q6ZnVuY3Rpb24gSFZ0KHQsZSl7cmV0dXJuKGZ1bmN0aW9uIG4odCxlLGkpe2Zvcih2YXIgcj0tMSxvPXQubGVuZ3RoLGE9ZS5sZW5ndGgscz17fTsrK3I8bzspaShzLHRbcl0scjxhP2Vbcl06dm9pZCAwKTtyZXR1cm4gc30pKHR8fFtdLGV8fFtdLExWdCl9fX1jYXRjaCh0KXt9ckh0fHwockh0PXdpbmRvdy5fKTt2YXIgRlZ0PXJIdCxWVnQ9VVZ0O2Z1bmN0aW9uIFVWdCgpe3ZhciB0PXt9O3QuX25leHQ9dC5fcHJldj10LHRoaXMuX3NlbnRpbmVsPXR9ZnVuY3Rpb24galZ0KHQpe3QuX3ByZXYuX25leHQ9dC5fbmV4dCx0Ll9uZXh0Ll9wcmV2PXQuX3ByZXYsZGVsZXRlIHQuX25leHQsZGVsZXRlIHQuX3ByZXZ9ZnVuY3Rpb24gR1Z0KHQsZSl7aWYoIl9uZXh0IiE9PXQmJiJfcHJldiIhPT10KXJldHVybiBlfVVWdC5wcm90b3R5cGUuZGVxdWV1ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3NlbnRpbmVsLGU9dC5fcHJldjtpZihlIT09dClyZXR1cm4galZ0KGUpLGV9LFVWdC5wcm90b3R5cGUuZW5xdWV1ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9zZW50aW5lbDt0Ll9wcmV2JiZ0Ll9uZXh0JiZqVnQodCksdC5fbmV4dD1lLl9uZXh0LGUuX25leHQuX3ByZXY9dCxlLl9uZXh0PXQsdC5fcHJldj1lfSxVVnQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9dGhpcy5fc2VudGluZWwsbj1lLl9wcmV2O24hPT1lOyl0LnB1c2goSlNPTi5zdHJpbmdpZnkobixHVnQpKSxuPW4uX3ByZXY7cmV0dXJuIlsiK3Quam9pbigiLCAiKSsiXSJ9O3ZhciBXVnQ9RlZ0LHFWdD1vSHQuR3JhcGgsWVZ0PVZWdCxYVnQ9V1Z0LmNvbnN0YW50KDEpO2Z1bmN0aW9uICRWdCh0LGUsbixpLHIpe3ZhciBvPXI/W106dm9pZCAwO3JldHVybiBXVnQuZm9yRWFjaCh0LmluRWRnZXMoaS52KSwoZnVuY3Rpb24oaSl7dmFyIGE9dC5lZGdlKGkpLHM9dC5ub2RlKGkudik7ciYmby5wdXNoKHt2Omkudix3Omkud30pLHMub3V0LT1hLEtWdChlLG4scyl9KSksV1Z0LmZvckVhY2godC5vdXRFZGdlcyhpLnYpLChmdW5jdGlvbihpKXt2YXIgcj10LmVkZ2UoaSksbz10Lm5vZGUoaS53KTtvLmluLT1yLEtWdChlLG4sbyl9KSksdC5yZW1vdmVOb2RlKGkudiksb31mdW5jdGlvbiBLVnQodCxlLG4pe24ub3V0P24uaW4/dFtuLm91dC1uLmluK2VdLmVucXVldWUobik6dFt0Lmxlbmd0aC0xXS5lbnF1ZXVlKG4pOnRbMF0uZW5xdWV1ZShuKX12YXIgWlZ0PUZWdCxKVnQ9e3J1bjpmdW5jdGlvbiBRVnQodCl7dmFyIGU9ImdyZWVkeSI9PT10LmdyYXBoKCkuYWN5Y2xpY2VyPyhmdW5jdGlvbiBpKHQsZSl7aWYodC5ub2RlQ291bnQoKTw9MSlyZXR1cm5bXTt2YXIgbj0oZnVuY3Rpb24gaSh0LGUpe3ZhciBuPW5ldyBxVnQsaT0wLHI9MDtXVnQuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKHQpe24uc2V0Tm9kZSh0LHt2OnQsaW46MCxvdXQ6MH0pfSkpLFdWdC5mb3JFYWNoKHQuZWRnZXMoKSwoZnVuY3Rpb24odCl7dmFyIG89bi5lZGdlKHQudix0LncpfHwwLGE9ZSh0KTtuLnNldEVkZ2UodC52LHQudyxvK2EpLHI9TWF0aC5tYXgocixuLm5vZGUodC52KS5vdXQrPWEpLGk9TWF0aC5tYXgoaSxuLm5vZGUodC53KS5pbis9YSl9KSk7dmFyIG89V1Z0LnJhbmdlKHIraSszKS5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBZVnR9KSksYT1pKzE7cmV0dXJuIFdWdC5mb3JFYWNoKG4ubm9kZXMoKSwoZnVuY3Rpb24odCl7S1Z0KG8sYSxuLm5vZGUodCkpfSkpLHtncmFwaDpuLGJ1Y2tldHM6byx6ZXJvSWR4OmF9fSkodCxlfHxYVnQpLHI9KGZ1bmN0aW9uIG8odCxlLG4pe2Zvcih2YXIgaSxyPVtdLG89ZVtlLmxlbmd0aC0xXSxhPWVbMF07dC5ub2RlQ291bnQoKTspe2Zvcig7aT1hLmRlcXVldWUoKTspJFZ0KHQsZSxuLGkpO2Zvcig7aT1vLmRlcXVldWUoKTspJFZ0KHQsZSxuLGkpO2lmKHQubm9kZUNvdW50KCkpZm9yKHZhciBzPWUubGVuZ3RoLTI7cz4wOy0tcylpZihpPWVbc10uZGVxdWV1ZSgpKXtyPXIuY29uY2F0KCRWdCh0LGUsbixpLCEwKSk7YnJlYWt9fXJldHVybiByfSkobi5ncmFwaCxuLmJ1Y2tldHMsbi56ZXJvSWR4KTtyZXR1cm4gV1Z0LmZsYXR0ZW4oV1Z0Lm1hcChyLChmdW5jdGlvbihlKXtyZXR1cm4gdC5vdXRFZGdlcyhlLnYsZS53KX0pKSwhMCl9KSh0LChmdW5jdGlvbiBuKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5lZGdlKGUpLndlaWdodH19KSh0KSk6KGZ1bmN0aW9uIHIodCl7dmFyIGU9W10sbj17fSxpPXt9O3JldHVybiBaVnQuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uIHIobyl7WlZ0LmhhcyhpLG8pfHwoaVtvXT0hMCxuW29dPSEwLFpWdC5mb3JFYWNoKHQub3V0RWRnZXMobyksKGZ1bmN0aW9uKHQpe1pWdC5oYXMobix0LncpP2UucHVzaCh0KTpyKHQudyl9KSksZGVsZXRlIG5bb10pfSkpLGV9KSh0KTtaVnQuZm9yRWFjaChlLChmdW5jdGlvbihlKXt2YXIgbj10LmVkZ2UoZSk7dC5yZW1vdmVFZGdlKGUpLG4uZm9yd2FyZE5hbWU9ZS5uYW1lLG4ucmV2ZXJzZWQ9ITAsdC5zZXRFZGdlKGUudyxlLnYsbixaVnQudW5pcXVlSWQoInJldiIpKX0pKX0sdW5kbzpmdW5jdGlvbiB0VXQodCl7WlZ0LmZvckVhY2godC5lZGdlcygpLChmdW5jdGlvbihlKXt2YXIgbj10LmVkZ2UoZSk7aWYobi5yZXZlcnNlZCl7dC5yZW1vdmVFZGdlKGUpO3ZhciBpPW4uZm9yd2FyZE5hbWU7ZGVsZXRlIG4ucmV2ZXJzZWQsZGVsZXRlIG4uZm9yd2FyZE5hbWUsdC5zZXRFZGdlKGUudyxlLnYsbixpKX19KSl9fSxlVXQ9RlZ0LG5VdD1vSHQuR3JhcGgsaVV0PXthZGREdW1teU5vZGU6Z1V0LHNpbXBsaWZ5OmZ1bmN0aW9uIHJVdCh0KXt2YXIgZT0obmV3IG5VdCkuc2V0R3JhcGgodC5ncmFwaCgpKTtyZXR1cm4gZVV0LmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbihuKXtlLnNldE5vZGUobix0Lm5vZGUobikpfSkpLGVVdC5mb3JFYWNoKHQuZWRnZXMoKSwoZnVuY3Rpb24obil7dmFyIGk9ZS5lZGdlKG4udixuLncpfHx7d2VpZ2h0OjAsbWlubGVuOjF9LHI9dC5lZGdlKG4pO2Uuc2V0RWRnZShuLnYsbi53LHt3ZWlnaHQ6aS53ZWlnaHQrci53ZWlnaHQsbWlubGVuOk1hdGgubWF4KGkubWlubGVuLHIubWlubGVuKX0pfSkpLGV9LGFzTm9uQ29tcG91bmRHcmFwaDpmdW5jdGlvbiBvVXQodCl7dmFyIGU9bmV3IG5VdCh7bXVsdGlncmFwaDp0LmlzTXVsdGlncmFwaCgpfSkuc2V0R3JhcGgodC5ncmFwaCgpKTtyZXR1cm4gZVV0LmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbihuKXt0LmNoaWxkcmVuKG4pLmxlbmd0aHx8ZS5zZXROb2RlKG4sdC5ub2RlKG4pKX0pKSxlVXQuZm9yRWFjaCh0LmVkZ2VzKCksKGZ1bmN0aW9uKG4pe2Uuc2V0RWRnZShuLHQuZWRnZShuKSl9KSksZX0sc3VjY2Vzc29yV2VpZ2h0czpmdW5jdGlvbiBhVXQodCl7dmFyIGU9ZVV0Lm1hcCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGUpe3ZhciBuPXt9O3JldHVybiBlVXQuZm9yRWFjaCh0Lm91dEVkZ2VzKGUpLChmdW5jdGlvbihlKXtuW2Uud109KG5bZS53XXx8MCkrdC5lZGdlKGUpLndlaWdodH0pKSxufSkpO3JldHVybiBlVXQuemlwT2JqZWN0KHQubm9kZXMoKSxlKX0scHJlZGVjZXNzb3JXZWlnaHRzOmZ1bmN0aW9uIHNVdCh0KXt2YXIgZT1lVXQubWFwKHQubm9kZXMoKSwoZnVuY3Rpb24oZSl7dmFyIG49e307cmV0dXJuIGVVdC5mb3JFYWNoKHQuaW5FZGdlcyhlKSwoZnVuY3Rpb24oZSl7bltlLnZdPShuW2Uudl18fDApK3QuZWRnZShlKS53ZWlnaHR9KSksbn0pKTtyZXR1cm4gZVV0LnppcE9iamVjdCh0Lm5vZGVzKCksZSl9LGludGVyc2VjdFJlY3Q6ZnVuY3Rpb24gbFV0KHQsZSl7dmFyIG4saSxyPXQueCxvPXQueSxhPWUueC1yLHM9ZS55LW8sbD10LndpZHRoLzIsYz10LmhlaWdodC8yO2lmKCFhJiYhcyl0aHJvdyBuZXcgRXJyb3IoIk5vdCBwb3NzaWJsZSB0byBmaW5kIGludGVyc2VjdGlvbiBpbnNpZGUgb2YgdGhlIHJlY3RhbmdsZSIpO3JldHVybiBNYXRoLmFicyhzKSpsPk1hdGguYWJzKGEpKmM/KHM8MCYmKGM9LWMpLG49YyphL3MsaT1jKTooYTwwJiYobD0tbCksbj1sLGk9bCpzL2EpLHt4OnIrbix5Om8raX19LGJ1aWxkTGF5ZXJNYXRyaXg6ZnVuY3Rpb24gY1V0KHQpe3ZhciBlPWVVdC5tYXAoZVV0LnJhbmdlKF9VdCh0KSsxKSwoZnVuY3Rpb24oKXtyZXR1cm5bXX0pKTtyZXR1cm4gZVV0LmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbihuKXt2YXIgaT10Lm5vZGUobikscj1pLnJhbms7ZVV0LmlzVW5kZWZpbmVkKHIpfHwoZVtyXVtpLm9yZGVyXT1uKX0pKSxlfSxub3JtYWxpemVSYW5rczpmdW5jdGlvbiB1VXQodCl7dmFyIGU9ZVV0Lm1pbihlVXQubWFwKHQubm9kZXMoKSwoZnVuY3Rpb24oZSl7cmV0dXJuIHQubm9kZShlKS5yYW5rfSkpKTtlVXQuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKG4pe3ZhciBpPXQubm9kZShuKTtlVXQuaGFzKGksInJhbmsiKSYmKGkucmFuay09ZSl9KSl9LHJlbW92ZUVtcHR5UmFua3M6ZnVuY3Rpb24gaFV0KHQpe3ZhciBlPWVVdC5taW4oZVV0Lm1hcCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGUpe3JldHVybiB0Lm5vZGUoZSkucmFua30pKSksbj1bXTtlVXQuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGkpe3ZhciByPXQubm9kZShpKS5yYW5rLWU7bltyXXx8KG5bcl09W10pLG5bcl0ucHVzaChpKX0pKTt2YXIgaT0wLHI9dC5ncmFwaCgpLm5vZGVSYW5rRmFjdG9yO2VVdC5mb3JFYWNoKG4sKGZ1bmN0aW9uKGUsbil7ZVV0LmlzVW5kZWZpbmVkKGUpJiZuJXIhPTA/LS1pOmkmJmVVdC5mb3JFYWNoKGUsKGZ1bmN0aW9uKGUpe3Qubm9kZShlKS5yYW5rKz1pfSkpfSkpfSxhZGRCb3JkZXJOb2RlOmZ1bmN0aW9uIGRVdCh0LGUsbixpKXt2YXIgcj17d2lkdGg6MCxoZWlnaHQ6MH07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+PTQmJihyLnJhbms9bixyLm9yZGVyPWkpLGdVdCh0LCJib3JkZXIiLHIsZSl9LG1heFJhbms6X1V0LHBhcnRpdGlvbjpmdW5jdGlvbiBwVXQodCxlKXt2YXIgbj17bGhzOltdLHJoczpbXX07cmV0dXJuIGVVdC5mb3JFYWNoKHQsKGZ1bmN0aW9uKHQpe2UodCk/bi5saHMucHVzaCh0KTpuLnJocy5wdXNoKHQpfSkpLG59LHRpbWU6ZnVuY3Rpb24gZlV0KHQsZSl7dmFyIG49ZVV0Lm5vdygpO3RyeXtyZXR1cm4gZSgpfWZpbmFsbHl7Y29uc29sZS5sb2codCsiIHRpbWU6ICIrKGVVdC5ub3coKS1uKSsibXMiKX19LG5vdGltZTpmdW5jdGlvbiBtVXQodCxlKXtyZXR1cm4gZSgpfX07ZnVuY3Rpb24gZ1V0KHQsZSxuLGkpe3ZhciByO2Rve3I9ZVV0LnVuaXF1ZUlkKGkpfXdoaWxlKHQuaGFzTm9kZShyKSk7cmV0dXJuIG4uZHVtbXk9ZSx0LnNldE5vZGUocixuKSxyfWZ1bmN0aW9uIF9VdCh0KXtyZXR1cm4gZVV0Lm1heChlVXQubWFwKHQubm9kZXMoKSwoZnVuY3Rpb24oZSl7dmFyIG49dC5ub2RlKGUpLnJhbms7aWYoIWVVdC5pc1VuZGVmaW5lZChuKSlyZXR1cm4gbn0pKSl9dmFyIHlVdD1GVnQsdlV0PWlVdCxiVXQ9e3J1bjpmdW5jdGlvbiB4VXQodCl7dC5ncmFwaCgpLmR1bW15Q2hhaW5zPVtdLHlVdC5mb3JFYWNoKHQuZWRnZXMoKSwoZnVuY3Rpb24oZSl7IShmdW5jdGlvbiBuKHQsZSl7dmFyIG4saSxyLG89ZS52LGE9dC5ub2RlKG8pLnJhbmsscz1lLncsbD10Lm5vZGUocykucmFuayxjPWUubmFtZSx1PXQuZWRnZShlKSxoPXUubGFiZWxSYW5rO2lmKGwhPT1hKzEpe2Zvcih0LnJlbW92ZUVkZ2UoZSkscj0wLCsrYTthPGw7KytyLCsrYSl1LnBvaW50cz1bXSxuPXZVdC5hZGREdW1teU5vZGUodCwiZWRnZSIsaT17d2lkdGg6MCxoZWlnaHQ6MCxlZGdlTGFiZWw6dSxlZGdlT2JqOmUscmFuazphfSwiX2QiKSxhPT09aCYmKGkud2lkdGg9dS53aWR0aCxpLmhlaWdodD11LmhlaWdodCxpLmR1bW15PSJlZGdlLWxhYmVsIixpLmxhYmVscG9zPXUubGFiZWxwb3MpLHQuc2V0RWRnZShvLG4se3dlaWdodDp1LndlaWdodH0sYyksMD09PXImJnQuZ3JhcGgoKS5kdW1teUNoYWlucy5wdXNoKG4pLG89bjt0LnNldEVkZ2UobyxzLHt3ZWlnaHQ6dS53ZWlnaHR9LGMpfX0pKHQsZSl9KSl9LHVuZG86ZnVuY3Rpb24gd1V0KHQpe3lVdC5mb3JFYWNoKHQuZ3JhcGgoKS5kdW1teUNoYWlucywoZnVuY3Rpb24oZSl7dmFyIG4saT10Lm5vZGUoZSkscj1pLmVkZ2VMYWJlbDtmb3IodC5zZXRFZGdlKGkuZWRnZU9iaixyKTtpLmR1bW15OyluPXQuc3VjY2Vzc29ycyhlKVswXSx0LnJlbW92ZU5vZGUoZSksci5wb2ludHMucHVzaCh7eDppLngseTppLnl9KSwiZWRnZS1sYWJlbCI9PT1pLmR1bW15JiYoci54PWkueCxyLnk9aS55LHIud2lkdGg9aS53aWR0aCxyLmhlaWdodD1pLmhlaWdodCksaT10Lm5vZGUoZT1uKX0pKX19LFNVdD1GVnQsTVV0PWZ1bmN0aW9uIEVVdCh0KXt2YXIgZT17fTtTVXQuZm9yRWFjaCh0LnNvdXJjZXMoKSwoZnVuY3Rpb24gbihpKXt2YXIgcj10Lm5vZGUoaSk7aWYoU1V0LmhhcyhlLGkpKXJldHVybiByLnJhbms7ZVtpXT0hMDt2YXIgbz1TVXQubWluKFNVdC5tYXAodC5vdXRFZGdlcyhpKSwoZnVuY3Rpb24oZSl7cmV0dXJuIG4oZS53KS10LmVkZ2UoZSkubWlubGVufSkpKTtyZXR1cm4gbyE9PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSYmbnVsbCE9b3x8KG89MCksci5yYW5rPW99KSl9LFRVdD1mdW5jdGlvbiBDVXQodCxlKXtyZXR1cm4gdC5ub2RlKGUudykucmFuay10Lm5vZGUoZS52KS5yYW5rLXQuZWRnZShlKS5taW5sZW59LEFVdD1GVnQsa1V0PW9IdC5HcmFwaCxMVXQ9VFV0LFBVdD1mdW5jdGlvbiBOVXQodCl7dmFyIGUsbixpPW5ldyBrVXQoe2RpcmVjdGVkOiExfSkscj10Lm5vZGVzKClbMF0sbz10Lm5vZGVDb3VudCgpO2ZvcihpLnNldE5vZGUocix7fSk7SVV0KGksdCk8bzspZT1SVXQoaSx0KSxuPWkuaGFzTm9kZShlLnYpP0xVdCh0LGUpOi1MVXQodCxlKSxPVXQoaSx0LG4pO3JldHVybiBpfTtmdW5jdGlvbiBJVXQodCxlKXtyZXR1cm4gQVV0LmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbiBuKGkpe0FVdC5mb3JFYWNoKGUubm9kZUVkZ2VzKGkpLChmdW5jdGlvbihyKXt2YXIgbz1yLnYsYT1pPT09bz9yLnc6bzt0Lmhhc05vZGUoYSl8fExVdChlLHIpfHwodC5zZXROb2RlKGEse30pLHQuc2V0RWRnZShpLGEse30pLG4oYSkpfSkpfSkpLHQubm9kZUNvdW50KCl9ZnVuY3Rpb24gUlV0KHQsZSl7cmV0dXJuIEFVdC5taW5CeShlLmVkZ2VzKCksKGZ1bmN0aW9uKG4pe2lmKHQuaGFzTm9kZShuLnYpIT09dC5oYXNOb2RlKG4udykpcmV0dXJuIExVdChlLG4pfSkpfWZ1bmN0aW9uIE9VdCh0LGUsbil7QVV0LmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbih0KXtlLm5vZGUodCkucmFuays9bn0pKX12YXIgelV0PUZWdCxEVXQ9UFV0LEJVdD1UVXQsSFV0PU1VdCxGVXQ9b0h0LmFsZy5wcmVvcmRlcixWVXQ9b0h0LmFsZy5wb3N0b3JkZXIsVVV0PWlVdC5zaW1wbGlmeSxqVXQ9R1V0O2Z1bmN0aW9uIEdVdCh0KXt0PVVVdCh0KSxIVXQodCk7dmFyIGUsbj1EVXQodCk7Zm9yKFlVdChuKSxXVXQobix0KTtlPSRVdChuKTspWlV0KG4sdCxlLEtVdChuLHQsZSkpfWZ1bmN0aW9uIFdVdCh0LGUpe3ZhciBuPVZVdCh0LHQubm9kZXMoKSk7bj1uLnNsaWNlKDAsbi5sZW5ndGgtMSkselV0LmZvckVhY2gobiwoZnVuY3Rpb24obil7IShmdW5jdGlvbiBpKHQsZSxuKXt2YXIgaT10Lm5vZGUobik7dC5lZGdlKG4saS5wYXJlbnQpLmN1dHZhbHVlPXFVdCh0LGUsbil9KSh0LGUsbil9KSl9ZnVuY3Rpb24gcVV0KHQsZSxuKXt2YXIgaT10Lm5vZGUobikucGFyZW50LHI9ITAsbz1lLmVkZ2UobixpKSxhPTA7cmV0dXJuIG98fChyPSExLG89ZS5lZGdlKGksbikpLGE9by53ZWlnaHQselV0LmZvckVhY2goZS5ub2RlRWRnZXMobiksKGZ1bmN0aW9uKG8pe3ZhciBzPW8udj09PW4sbD1zP28udzpvLnY7aWYobCE9PWkpe3ZhciBjPXM9PT1yLHU9ZS5lZGdlKG8pLndlaWdodDtpZihhKz1jP3U6LXUsKGZ1bmN0aW9uIGgodCxlLG4pe3JldHVybiB0Lmhhc0VkZ2UoZSxuKX0pKHQsbixsKSl7dmFyIGQ9dC5lZGdlKG4sbCkuY3V0dmFsdWU7YSs9Yz8tZDpkfX19KSksYX1mdW5jdGlvbiBZVXQodCxlKXthcmd1bWVudHMubGVuZ3RoPDImJihlPXQubm9kZXMoKVswXSksWFV0KHQse30sMSxlKX1mdW5jdGlvbiBYVXQodCxlLG4saSxyKXt2YXIgbz1uLGE9dC5ub2RlKGkpO3JldHVybiBlW2ldPSEwLHpVdC5mb3JFYWNoKHQubmVpZ2hib3JzKGkpLChmdW5jdGlvbihyKXt6VXQuaGFzKGUscil8fChuPVhVdCh0LGUsbixyLGkpKX0pKSxhLmxvdz1vLGEubGltPW4rKyxyP2EucGFyZW50PXI6ZGVsZXRlIGEucGFyZW50LG59ZnVuY3Rpb24gJFV0KHQpe3JldHVybiB6VXQuZmluZCh0LmVkZ2VzKCksKGZ1bmN0aW9uKGUpe3JldHVybiB0LmVkZ2UoZSkuY3V0dmFsdWU8MH0pKX1mdW5jdGlvbiBLVXQodCxlLG4pe3ZhciBpPW4udixyPW4udztlLmhhc0VkZ2UoaSxyKXx8KGk9bi53LHI9bi52KTt2YXIgbz10Lm5vZGUoaSksYT10Lm5vZGUocikscz1vLGw9ITE7by5saW0+YS5saW0mJihzPWEsbD0hMCk7dmFyIGM9elV0LmZpbHRlcihlLmVkZ2VzKCksKGZ1bmN0aW9uKGUpe3JldHVybiBsPT09SlV0KDAsdC5ub2RlKGUudikscykmJmwhPT1KVXQoMCx0Lm5vZGUoZS53KSxzKX0pKTtyZXR1cm4gelV0Lm1pbkJ5KGMsKGZ1bmN0aW9uKHQpe3JldHVybiBCVXQoZSx0KX0pKX1mdW5jdGlvbiBaVXQodCxlLG4saSl7dC5yZW1vdmVFZGdlKG4udixuLncpLHQuc2V0RWRnZShpLnYsaS53LHt9KSxZVXQodCksV1V0KHQsZSksKGZ1bmN0aW9uIHIodCxlKXt2YXIgbj16VXQuZmluZCh0Lm5vZGVzKCksKGZ1bmN0aW9uKHQpe3JldHVybiFlLm5vZGUodCkucGFyZW50fSkpLGk9RlV0KHQsbik7aT1pLnNsaWNlKDEpLHpVdC5mb3JFYWNoKGksKGZ1bmN0aW9uKG4pe3ZhciBpPXQubm9kZShuKS5wYXJlbnQscj1lLmVkZ2UobixpKSxvPSExO3J8fChyPWUuZWRnZShpLG4pLG89ITApLGUubm9kZShuKS5yYW5rPWUubm9kZShpKS5yYW5rKyhvP3IubWlubGVuOi1yLm1pbmxlbil9KSl9KSh0LGUpfWZ1bmN0aW9uIEpVdCh0LGUsbil7cmV0dXJuIG4ubG93PD1lLmxpbSYmZS5saW08PW4ubGltfUdVdC5pbml0TG93TGltVmFsdWVzPVlVdCxHVXQuaW5pdEN1dFZhbHVlcz1XVXQsR1V0LmNhbGNDdXRWYWx1ZT1xVXQsR1V0LmxlYXZlRWRnZT0kVXQsR1V0LmVudGVyRWRnZT1LVXQsR1V0LmV4Y2hhbmdlRWRnZXM9WlV0O3ZhciBRVXQ9TVV0LHRqdD1QVXQsZWp0PWpVdCxuanQ9UVV0O2Z1bmN0aW9uIGlqdCh0KXtlanQodCl9dmFyIHJqdD1GVnQsb2p0PUZWdCxhanQ9aVV0O2Z1bmN0aW9uIHNqdCh0LGUsbixpLHIsbyxhKXt2YXIgcz10LmNoaWxkcmVuKGEpO2lmKHMubGVuZ3RoKXt2YXIgbD1hanQuYWRkQm9yZGVyTm9kZSh0LCJfYnQiKSxjPWFqdC5hZGRCb3JkZXJOb2RlKHQsIl9iYiIpLHU9dC5ub2RlKGEpO3Quc2V0UGFyZW50KGwsYSksdS5ib3JkZXJUb3A9bCx0LnNldFBhcmVudChjLGEpLHUuYm9yZGVyQm90dG9tPWMsb2p0LmZvckVhY2gocywoZnVuY3Rpb24ocyl7c2p0KHQsZSxuLGkscixvLHMpO3ZhciB1PXQubm9kZShzKSxoPXUuYm9yZGVyVG9wP3UuYm9yZGVyVG9wOnMsZD11LmJvcmRlckJvdHRvbT91LmJvcmRlckJvdHRvbTpzLHA9dS5ib3JkZXJUb3A/aToyKmksZj1oIT09ZD8xOnItb1thXSsxO3Quc2V0RWRnZShsLGgse3dlaWdodDpwLG1pbmxlbjpmLG5lc3RpbmdFZGdlOiEwfSksdC5zZXRFZGdlKGQsYyx7d2VpZ2h0OnAsbWlubGVuOmYsbmVzdGluZ0VkZ2U6ITB9KX0pKSx0LnBhcmVudChhKXx8dC5zZXRFZGdlKGUsbCx7d2VpZ2h0OjAsbWlubGVuOnIrb1thXX0pfWVsc2UgYSE9PWUmJnQuc2V0RWRnZShlLGEse3dlaWdodDowLG1pbmxlbjpufSl9dmFyIGxqdD1GVnQsY2p0PWlVdDtmdW5jdGlvbiB1anQodCxlLG4saSxyLG8pe3ZhciBhPXJbZV1bby0xXSxzPWNqdC5hZGREdW1teU5vZGUodCwiYm9yZGVyIix7d2lkdGg6MCxoZWlnaHQ6MCxyYW5rOm8sYm9yZGVyVHlwZTplfSxuKTtyW2VdW29dPXMsdC5zZXRQYXJlbnQocyxpKSxhJiZ0LnNldEVkZ2UoYSxzLHt3ZWlnaHQ6MX0pfXZhciBoanQ9RlZ0O2Z1bmN0aW9uIGRqdCh0KXtoanQuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGUpe3BqdCh0Lm5vZGUoZSkpfSkpLGhqdC5mb3JFYWNoKHQuZWRnZXMoKSwoZnVuY3Rpb24oZSl7cGp0KHQuZWRnZShlKSl9KSl9ZnVuY3Rpb24gcGp0KHQpe3ZhciBlPXQud2lkdGg7dC53aWR0aD10LmhlaWdodCx0LmhlaWdodD1lfWZ1bmN0aW9uIGZqdCh0KXt0Lnk9LXQueX1mdW5jdGlvbiBtanQodCl7dmFyIGU9dC54O3QueD10LnksdC55PWV9dmFyIGdqdD1GVnQsX2p0PUZWdDtmdW5jdGlvbiB5anQodCxlLG4pe2Zvcih2YXIgaT1fanQuemlwT2JqZWN0KG4sX2p0Lm1hcChuLChmdW5jdGlvbih0LGUpe3JldHVybiBlfSkpKSxyPV9qdC5mbGF0dGVuKF9qdC5tYXAoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIF9qdC5zb3J0QnkoX2p0Lm1hcCh0Lm91dEVkZ2VzKGUpLChmdW5jdGlvbihlKXtyZXR1cm57cG9zOmlbZS53XSx3ZWlnaHQ6dC5lZGdlKGUpLndlaWdodH19KSksInBvcyIpfSkpLCEwKSxvPTE7bzxuLmxlbmd0aDspbzw8PTE7dmFyIGE9MipvLTE7by09MTt2YXIgcz1fanQubWFwKG5ldyBBcnJheShhKSwoZnVuY3Rpb24oKXtyZXR1cm4gMH0pKSxsPTA7cmV0dXJuIF9qdC5mb3JFYWNoKHIuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5wb3MrbztzW2VdKz10LndlaWdodDtmb3IodmFyIG49MDtlPjA7KWUlMiYmKG4rPXNbZSsxXSksc1tlPWUtMT4+MV0rPXQud2VpZ2h0O2wrPXQud2VpZ2h0Km59KSkpLGx9dmFyIHZqdD1GVnQsYmp0PUZWdCx4anQ9RlZ0LHdqdD1pVXQ7ZnVuY3Rpb24gU2p0KHQsZSxuKXtmb3IodmFyIGk7ZS5sZW5ndGgmJihpPXhqdC5sYXN0KGUpKS5pPD1uOyllLnBvcCgpLHQucHVzaChpLnZzKSxuKys7cmV0dXJuIG59dmFyIE1qdD1GVnQsRWp0PUZWdCxUanQ9b0h0LkdyYXBoLENqdD1GVnQsQWp0PUZWdCxranQ9ZnVuY3Rpb24gTGp0KHQsZSl7Zm9yKHZhciBuPTAsaT0xO2k8ZS5sZW5ndGg7KytpKW4rPXlqdCh0LGVbaS0xXSxlW2ldKTtyZXR1cm4gbn0sUGp0PWZ1bmN0aW9uIHQoZSxuLGkscil7dmFyIG89ZS5jaGlsZHJlbihuKSxhPWUubm9kZShuKSxzPWE/YS5ib3JkZXJMZWZ0OnZvaWQgMCxsPWE/YS5ib3JkZXJSaWdodDp2b2lkIDAsYz17fTtzJiYobz1NanQuZmlsdGVyKG8sKGZ1bmN0aW9uKHQpe3JldHVybiB0IT09cyYmdCE9PWx9KSkpO3ZhciB1PShmdW5jdGlvbiBoKHQsZSl7cmV0dXJuIHZqdC5tYXAoZSwoZnVuY3Rpb24oZSl7dmFyIG49dC5pbkVkZ2VzKGUpO2lmKG4ubGVuZ3RoKXt2YXIgaT12anQucmVkdWNlKG4sKGZ1bmN0aW9uKGUsbil7dmFyIGk9dC5lZGdlKG4pLHI9dC5ub2RlKG4udik7cmV0dXJue3N1bTplLnN1bStpLndlaWdodCpyLm9yZGVyLHdlaWdodDplLndlaWdodCtpLndlaWdodH19KSx7c3VtOjAsd2VpZ2h0OjB9KTtyZXR1cm57djplLGJhcnljZW50ZXI6aS5zdW0vaS53ZWlnaHQsd2VpZ2h0Omkud2VpZ2h0fX1yZXR1cm57djplfX0pKX0pKGUsbyk7TWp0LmZvckVhY2godSwoZnVuY3Rpb24obil7aWYoZS5jaGlsZHJlbihuLnYpLmxlbmd0aCl7dmFyIG89dChlLG4udixpLHIpO2Nbbi52XT1vLE1qdC5oYXMobywiYmFyeWNlbnRlciIpJiYoZnVuY3Rpb24gYSh0LGUpe01qdC5pc1VuZGVmaW5lZCh0LmJhcnljZW50ZXIpPyh0LmJhcnljZW50ZXI9ZS5iYXJ5Y2VudGVyLHQud2VpZ2h0PWUud2VpZ2h0KToodC5iYXJ5Y2VudGVyPSh0LmJhcnljZW50ZXIqdC53ZWlnaHQrZS5iYXJ5Y2VudGVyKmUud2VpZ2h0KS8odC53ZWlnaHQrZS53ZWlnaHQpLHQud2VpZ2h0Kz1lLndlaWdodCl9KShuLG8pfX0pKTt2YXIgZD0oZnVuY3Rpb24gcCh0LGUpe3ZhciBuPXt9O3JldHVybiBianQuZm9yRWFjaCh0LChmdW5jdGlvbih0LGUpe3ZhciBpPW5bdC52XT17aW5kZWdyZWU6MCxpbjpbXSxvdXQ6W10sdnM6W3Qudl0saTplfTtianQuaXNVbmRlZmluZWQodC5iYXJ5Y2VudGVyKXx8KGkuYmFyeWNlbnRlcj10LmJhcnljZW50ZXIsaS53ZWlnaHQ9dC53ZWlnaHQpfSkpLGJqdC5mb3JFYWNoKGUuZWRnZXMoKSwoZnVuY3Rpb24odCl7dmFyIGU9blt0LnZdLGk9blt0LnddO2JqdC5pc1VuZGVmaW5lZChlKXx8Ymp0LmlzVW5kZWZpbmVkKGkpfHwoaS5pbmRlZ3JlZSsrLGUub3V0LnB1c2goblt0LnddKSl9KSksKGZ1bmN0aW9uIGkodCl7dmFyIGU9W107ZnVuY3Rpb24gbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7ZS5tZXJnZWR8fChianQuaXNVbmRlZmluZWQoZS5iYXJ5Y2VudGVyKXx8Ymp0LmlzVW5kZWZpbmVkKHQuYmFyeWNlbnRlcil8fGUuYmFyeWNlbnRlcj49dC5iYXJ5Y2VudGVyKSYmKGZ1bmN0aW9uIG4odCxlKXt2YXIgbj0wLGk9MDt0LndlaWdodCYmKG4rPXQuYmFyeWNlbnRlcip0LndlaWdodCxpKz10LndlaWdodCksZS53ZWlnaHQmJihuKz1lLmJhcnljZW50ZXIqZS53ZWlnaHQsaSs9ZS53ZWlnaHQpLHQudnM9ZS52cy5jb25jYXQodC52cyksdC5iYXJ5Y2VudGVyPW4vaSx0LndlaWdodD1pLHQuaT1NYXRoLm1pbihlLmksdC5pKSxlLm1lcmdlZD0hMH0pKHQsZSl9fWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe24uaW4ucHVzaChlKSwwPT0tLW4uaW5kZWdyZWUmJnQucHVzaChuKX19Zm9yKDt0Lmxlbmd0aDspe3ZhciByPXQucG9wKCk7ZS5wdXNoKHIpLGJqdC5mb3JFYWNoKHIuaW4ucmV2ZXJzZSgpLG4ocikpLGJqdC5mb3JFYWNoKHIub3V0LGkocikpfXJldHVybiBianQubWFwKGJqdC5maWx0ZXIoZSwoZnVuY3Rpb24odCl7cmV0dXJuIXQubWVyZ2VkfSkpLChmdW5jdGlvbih0KXtyZXR1cm4gYmp0LnBpY2sodCxbInZzIiwiaSIsImJhcnljZW50ZXIiLCJ3ZWlnaHQiXSl9KSl9KShianQuZmlsdGVyKG4sKGZ1bmN0aW9uKHQpe3JldHVybiF0LmluZGVncmVlfSkpKX0pKHUsaSk7IShmdW5jdGlvbiBmKHQsZSl7TWp0LmZvckVhY2godCwoZnVuY3Rpb24odCl7dC52cz1NanQuZmxhdHRlbih0LnZzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGVbdF0/ZVt0XS52czp0fSkpLCEwKX0pKX0pKGQsYyk7dmFyIG09KGZ1bmN0aW9uIGcodCxlKXt2YXIgbj13anQucGFydGl0aW9uKHQsKGZ1bmN0aW9uKHQpe3JldHVybiB4anQuaGFzKHQsImJhcnljZW50ZXIiKX0pKSxpPW4ubGhzLHI9eGp0LnNvcnRCeShuLnJocywoZnVuY3Rpb24odCl7cmV0dXJuLXQuaX0pKSxvPVtdLGE9MCxzPTAsbD0wO2kuc29ydCgoZnVuY3Rpb24gYyh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtyZXR1cm4gZS5iYXJ5Y2VudGVyPG4uYmFyeWNlbnRlcj8tMTplLmJhcnljZW50ZXI+bi5iYXJ5Y2VudGVyPzE6dD9uLmktZS5pOmUuaS1uLml9fSkoISFlKSksbD1TanQobyxyLGwpLHhqdC5mb3JFYWNoKGksKGZ1bmN0aW9uKHQpe2wrPXQudnMubGVuZ3RoLG8ucHVzaCh0LnZzKSxhKz10LmJhcnljZW50ZXIqdC53ZWlnaHQscys9dC53ZWlnaHQsbD1TanQobyxyLGwpfSkpO3ZhciB1PXt2czp4anQuZmxhdHRlbihvLCEwKX07cmV0dXJuIHMmJih1LmJhcnljZW50ZXI9YS9zLHUud2VpZ2h0PXMpLHV9KShkLHIpO2lmKHMmJihtLnZzPU1qdC5mbGF0dGVuKFtzLG0udnMsbF0sITApLGUucHJlZGVjZXNzb3JzKHMpLmxlbmd0aCkpe3ZhciBfPWUubm9kZShlLnByZWRlY2Vzc29ycyhzKVswXSkseT1lLm5vZGUoZS5wcmVkZWNlc3NvcnMobClbMF0pO01qdC5oYXMobSwiYmFyeWNlbnRlciIpfHwobS5iYXJ5Y2VudGVyPTAsbS53ZWlnaHQ9MCksbS5iYXJ5Y2VudGVyPShtLmJhcnljZW50ZXIqbS53ZWlnaHQrXy5vcmRlcit5Lm9yZGVyKS8obS53ZWlnaHQrMiksbS53ZWlnaHQrPTJ9cmV0dXJuIG19LE5qdD1vSHQuR3JhcGgsSWp0PWlVdDtmdW5jdGlvbiBSanQodCxlLG4pe3JldHVybiBBanQubWFwKGUsKGZ1bmN0aW9uKGUpe3JldHVybihmdW5jdGlvbiBpKHQsZSxuKXt2YXIgaT0oZnVuY3Rpb24gcih0KXtmb3IodmFyIGU7dC5oYXNOb2RlKGU9RWp0LnVuaXF1ZUlkKCJfcm9vdCIpKTspO3JldHVybiBlfSkodCksbz1uZXcgVGp0KHtjb21wb3VuZDohMH0pLnNldEdyYXBoKHtyb290Oml9KS5zZXREZWZhdWx0Tm9kZUxhYmVsKChmdW5jdGlvbihlKXtyZXR1cm4gdC5ub2RlKGUpfSkpO3JldHVybiBFanQuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKHIpe3ZhciBhPXQubm9kZShyKSxzPXQucGFyZW50KHIpOyhhLnJhbms9PT1lfHxhLm1pblJhbms8PWUmJmU8PWEubWF4UmFuaykmJihvLnNldE5vZGUociksby5zZXRQYXJlbnQocixzfHxpKSxFanQuZm9yRWFjaCh0W25dKHIpLChmdW5jdGlvbihlKXt2YXIgbj1lLnY9PT1yP2UudzplLnYsaT1vLmVkZ2UobixyKSxhPUVqdC5pc1VuZGVmaW5lZChpKT8wOmkud2VpZ2h0O28uc2V0RWRnZShuLHIse3dlaWdodDp0LmVkZ2UoZSkud2VpZ2h0K2F9KX0pKSxFanQuaGFzKGEsIm1pblJhbmsiKSYmby5zZXROb2RlKHIse2JvcmRlckxlZnQ6YS5ib3JkZXJMZWZ0W2VdLGJvcmRlclJpZ2h0OmEuYm9yZGVyUmlnaHRbZV19KSl9KSksb30pKHQsZSxuKX0pKX1mdW5jdGlvbiBPanQodCxlKXt2YXIgbj1uZXcgTmp0O0FqdC5mb3JFYWNoKHQsKGZ1bmN0aW9uKHQpe3ZhciBpPXQuZ3JhcGgoKS5yb290LHI9UGp0KHQsaSxuLGUpO0FqdC5mb3JFYWNoKHIudnMsKGZ1bmN0aW9uKGUsbil7dC5ub2RlKGUpLm9yZGVyPW59KSksKGZ1bmN0aW9uIG8odCxlLG4pe3ZhciBpLHI9e307Q2p0LmZvckVhY2gobiwoZnVuY3Rpb24obil7Zm9yKHZhciBvLGEscz10LnBhcmVudChuKTtzOyl7aWYoKG89dC5wYXJlbnQocykpPyhhPXJbb10scltvXT1zKTooYT1pLGk9cyksYSYmYSE9PXMpcmV0dXJuIHZvaWQgZS5zZXRFZGdlKGEscyk7cz1vfX0pKX0pKHQsbixyLnZzKX0pKX1mdW5jdGlvbiB6anQodCxlKXtBanQuZm9yRWFjaChlLChmdW5jdGlvbihlKXtBanQuZm9yRWFjaChlLChmdW5jdGlvbihlLG4pe3Qubm9kZShlKS5vcmRlcj1ufSkpfSkpfXZhciBEanQ9RlZ0LEJqdD1vSHQuR3JhcGgsSGp0PWlVdDtmdW5jdGlvbiBGanQodCxlLG4pe2lmKGU+bil7dmFyIGk9ZTtlPW4sbj1pfXZhciByPXRbZV07cnx8KHRbZV09cj17fSkscltuXT0hMH1mdW5jdGlvbiBWanQodCxlLG4pe2lmKGU+bil7dmFyIGk9ZTtlPW4sbj1pfXJldHVybiBEanQuaGFzKHRbZV0sbil9dmFyIFVqdD1GVnQsamp0PWlVdCxHanQ9RlZ0LFdqdD1KVnQscWp0PWJVdCxZanQ9aVV0Lm5vcm1hbGl6ZVJhbmtzLFhqdD1pVXQucmVtb3ZlRW1wdHlSYW5rcywkanQ9ZnVuY3Rpb24gS2p0KHQpe3ZhciBlPWFqdC5hZGREdW1teU5vZGUodCwicm9vdCIse30sIl9yb290Iiksbj0oZnVuY3Rpb24gaSh0KXt2YXIgZT17fTtmdW5jdGlvbiBuKGkscil7dmFyIG89dC5jaGlsZHJlbihpKTtvJiZvLmxlbmd0aCYmb2p0LmZvckVhY2gobywoZnVuY3Rpb24odCl7bih0LHIrMSl9KSksZVtpXT1yfXJldHVybiBvanQuZm9yRWFjaCh0LmNoaWxkcmVuKCksKGZ1bmN0aW9uKHQpe24odCwxKX0pKSxlfSkodCkscj1vanQubWF4KG9qdC52YWx1ZXMobikpLTEsbz0yKnIrMTt0LmdyYXBoKCkubmVzdGluZ1Jvb3Q9ZSxvanQuZm9yRWFjaCh0LmVkZ2VzKCksKGZ1bmN0aW9uKGUpe3QuZWRnZShlKS5taW5sZW4qPW99KSk7dmFyIGE9KGZ1bmN0aW9uIHModCl7cmV0dXJuIG9qdC5yZWR1Y2UodC5lZGdlcygpLChmdW5jdGlvbihlLG4pe3JldHVybiBlK3QuZWRnZShuKS53ZWlnaHR9KSwwKX0pKHQpKzE7b2p0LmZvckVhY2godC5jaGlsZHJlbigpLChmdW5jdGlvbihpKXtzanQodCxlLG8sYSxyLG4saSl9KSksdC5ncmFwaCgpLm5vZGVSYW5rRmFjdG9yPW99LFpqdD1pVXQsSmp0PW9IdC5HcmFwaCxRanQ9WyJub2Rlc2VwIiwiZWRnZXNlcCIsInJhbmtzZXAiLCJtYXJnaW54IiwibWFyZ2lueSJdLHRHdD17cmFua3NlcDo1MCxlZGdlc2VwOjIwLG5vZGVzZXA6NTAscmFua2RpcjoidGIifSxlR3Q9WyJhY3ljbGljZXIiLCJyYW5rZXIiLCJyYW5rZGlyIiwiYWxpZ24iXSxuR3Q9WyJ3aWR0aCIsImhlaWdodCJdLGlHdD17d2lkdGg6MCxoZWlnaHQ6MH0sckd0PVsibWlubGVuIiwid2VpZ2h0Iiwid2lkdGgiLCJoZWlnaHQiLCJsYWJlbG9mZnNldCJdLG9HdD17bWlubGVuOjEsd2VpZ2h0OjEsd2lkdGg6MCxoZWlnaHQ6MCxsYWJlbG9mZnNldDoxMCxsYWJlbHBvczoiciJ9LGFHdD1bImxhYmVscG9zIl07ZnVuY3Rpb24gc0d0KHQsZSl7cmV0dXJuIEdqdC5tYXBWYWx1ZXMoR2p0LnBpY2sodCxlKSxOdW1iZXIpfWZ1bmN0aW9uIGxHdCh0KXt2YXIgZT17fTtyZXR1cm4gR2p0LmZvckVhY2godCwoZnVuY3Rpb24odCxuKXtlW24udG9Mb3dlckNhc2UoKV09dH0pKSxlfXZhciBjR3QsdUd0LGhHdD1GVnQsZEd0PWlVdCxwR3Q9b0h0LkdyYXBoLGZHdD17Z3JhcGhsaWI6b0h0LGxheW91dDpmdW5jdGlvbiBtR3QodCxlKXt2YXIgbj1lJiZlLmRlYnVnVGltaW5nP1pqdC50aW1lOlpqdC5ub3RpbWU7bigibGF5b3V0IiwoZnVuY3Rpb24oKXt2YXIgZT1uKCIgIGJ1aWxkTGF5b3V0R3JhcGgiLChmdW5jdGlvbigpe3JldHVybihmdW5jdGlvbiBlKHQpe3ZhciBlPW5ldyBKanQoe211bHRpZ3JhcGg6ITAsY29tcG91bmQ6ITB9KSxuPWxHdCh0LmdyYXBoKCkpO3JldHVybiBlLnNldEdyYXBoKEdqdC5tZXJnZSh7fSx0R3Qsc0d0KG4sUWp0KSxHanQucGljayhuLGVHdCkpKSxHanQuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKG4pe3ZhciBpPWxHdCh0Lm5vZGUobikpO2Uuc2V0Tm9kZShuLEdqdC5kZWZhdWx0cyhzR3QoaSxuR3QpLGlHdCkpLGUuc2V0UGFyZW50KG4sdC5wYXJlbnQobikpfSkpLEdqdC5mb3JFYWNoKHQuZWRnZXMoKSwoZnVuY3Rpb24obil7dmFyIGk9bEd0KHQuZWRnZShuKSk7ZS5zZXRFZGdlKG4sR2p0Lm1lcmdlKHt9LG9HdCxzR3QoaSxyR3QpLEdqdC5waWNrKGksYUd0KSkpfSkpLGV9KSh0KX0pKTtuKCIgIHJ1bkxheW91dCIsKGZ1bmN0aW9uKCl7IShmdW5jdGlvbiB0KGUsbil7bigiICAgIG1ha2VTcGFjZUZvckVkZ2VMYWJlbHMiLChmdW5jdGlvbigpeyEoZnVuY3Rpb24gdChlKXt2YXIgbj1lLmdyYXBoKCk7bi5yYW5rc2VwLz0yLEdqdC5mb3JFYWNoKGUuZWRnZXMoKSwoZnVuY3Rpb24odCl7dmFyIGk9ZS5lZGdlKHQpO2kubWlubGVuKj0yLCJjIiE9PWkubGFiZWxwb3MudG9Mb3dlckNhc2UoKSYmKCJUQiI9PT1uLnJhbmtkaXJ8fCJCVCI9PT1uLnJhbmtkaXI/aS53aWR0aCs9aS5sYWJlbG9mZnNldDppLmhlaWdodCs9aS5sYWJlbG9mZnNldCl9KSl9KShlKX0pKSxuKCIgICAgcmVtb3ZlU2VsZkVkZ2VzIiwoZnVuY3Rpb24oKXshKGZ1bmN0aW9uIHQoZSl7R2p0LmZvckVhY2goZS5lZGdlcygpLChmdW5jdGlvbih0KXtpZih0LnY9PT10Lncpe3ZhciBuPWUubm9kZSh0LnYpO24uc2VsZkVkZ2VzfHwobi5zZWxmRWRnZXM9W10pLG4uc2VsZkVkZ2VzLnB1c2goe2U6dCxsYWJlbDplLmVkZ2UodCl9KSxlLnJlbW92ZUVkZ2UodCl9fSkpfSkoZSl9KSksbigiICAgIGFjeWNsaWMiLChmdW5jdGlvbigpe1dqdC5ydW4oZSl9KSksbigiICAgIG5lc3RpbmdHcmFwaC5ydW4iLChmdW5jdGlvbigpeyRqdChlKX0pKSxuKCIgICAgcmFuayIsKGZ1bmN0aW9uKCl7IShmdW5jdGlvbiB0KGUpe3N3aXRjaChlLmdyYXBoKCkucmFua2VyKXtjYXNlIm5ldHdvcmstc2ltcGxleCI6aWp0KGUpO2JyZWFrO2Nhc2UidGlnaHQtdHJlZSI6IShmdW5jdGlvbiBuKHQpe1FVdCh0KSx0anQodCl9KShlKTticmVhaztjYXNlImxvbmdlc3QtcGF0aCI6bmp0KGUpO2JyZWFrO2RlZmF1bHQ6aWp0KGUpfX0pKFpqdC5hc05vbkNvbXBvdW5kR3JhcGgoZSkpfSkpLG4oIiAgICBpbmplY3RFZGdlTGFiZWxQcm94aWVzIiwoZnVuY3Rpb24oKXshKGZ1bmN0aW9uIHQoZSl7R2p0LmZvckVhY2goZS5lZGdlcygpLChmdW5jdGlvbih0KXt2YXIgbj1lLmVkZ2UodCk7aWYobi53aWR0aCYmbi5oZWlnaHQpe3ZhciBpPWUubm9kZSh0LnYpLHI9ZS5ub2RlKHQudyk7Wmp0LmFkZER1bW15Tm9kZShlLCJlZGdlLXByb3h5Iix7cmFuazooci5yYW5rLWkucmFuaykvMitpLnJhbmssZTp0fSwiX2VwIil9fSkpfSkoZSl9KSksbigiICAgIHJlbW92ZUVtcHR5UmFua3MiLChmdW5jdGlvbigpe1hqdChlKX0pKSxuKCIgICAgbmVzdGluZ0dyYXBoLmNsZWFudXAiLChmdW5jdGlvbigpeyEoZnVuY3Rpb24gdChlKXt2YXIgbj1lLmdyYXBoKCk7ZS5yZW1vdmVOb2RlKG4ubmVzdGluZ1Jvb3QpLGRlbGV0ZSBuLm5lc3RpbmdSb290LG9qdC5mb3JFYWNoKGUuZWRnZXMoKSwoZnVuY3Rpb24odCl7ZS5lZGdlKHQpLm5lc3RpbmdFZGdlJiZlLnJlbW92ZUVkZ2UodCl9KSl9KShlKX0pKSxuKCIgICAgbm9ybWFsaXplUmFua3MiLChmdW5jdGlvbigpe1lqdChlKX0pKSxuKCIgICAgYXNzaWduUmFua01pbk1heCIsKGZ1bmN0aW9uKCl7IShmdW5jdGlvbiB0KGUpe3ZhciBuPTA7R2p0LmZvckVhY2goZS5ub2RlcygpLChmdW5jdGlvbih0KXt2YXIgaT1lLm5vZGUodCk7aS5ib3JkZXJUb3AmJihpLm1pblJhbms9ZS5ub2RlKGkuYm9yZGVyVG9wKS5yYW5rLGkubWF4UmFuaz1lLm5vZGUoaS5ib3JkZXJCb3R0b20pLnJhbmssbj1HanQubWF4KG4saS5tYXhSYW5rKSl9KSksZS5ncmFwaCgpLm1heFJhbms9bn0pKGUpfSkpLG4oIiAgICByZW1vdmVFZGdlTGFiZWxQcm94aWVzIiwoZnVuY3Rpb24oKXshKGZ1bmN0aW9uIHQoZSl7R2p0LmZvckVhY2goZS5ub2RlcygpLChmdW5jdGlvbih0KXt2YXIgbj1lLm5vZGUodCk7ImVkZ2UtcHJveHkiPT09bi5kdW1teSYmKGUuZWRnZShuLmUpLmxhYmVsUmFuaz1uLnJhbmssZS5yZW1vdmVOb2RlKHQpKX0pKX0pKGUpfSkpLG4oIiAgICBub3JtYWxpemUucnVuIiwoZnVuY3Rpb24oKXtxanQucnVuKGUpfSkpLG4oIiAgICBwYXJlbnREdW1teUNoYWlucyIsKGZ1bmN0aW9uKCl7IShmdW5jdGlvbiB0KGUpe3ZhciBuPShmdW5jdGlvbiBpKHQpe3ZhciBlPXt9LG49MDtyZXR1cm4gcmp0LmZvckVhY2godC5jaGlsZHJlbigpLChmdW5jdGlvbiBpKHIpe3ZhciBvPW47cmp0LmZvckVhY2godC5jaGlsZHJlbihyKSxpKSxlW3JdPXtsb3c6byxsaW06bisrfX0pKSxlfSkoZSk7cmp0LmZvckVhY2goZS5ncmFwaCgpLmR1bW15Q2hhaW5zLChmdW5jdGlvbih0KXtmb3IodmFyIGk9ZS5ub2RlKHQpLHI9aS5lZGdlT2JqLG89KGZ1bmN0aW9uIGEodCxlLG4saSl7dmFyIHIsbyxhPVtdLHM9W10sbD1NYXRoLm1pbihlW25dLmxvdyxlW2ldLmxvdyksYz1NYXRoLm1heChlW25dLmxpbSxlW2ldLmxpbSk7cj1uO2Rve3I9dC5wYXJlbnQociksYS5wdXNoKHIpfXdoaWxlKHImJihlW3JdLmxvdz5sfHxjPmVbcl0ubGltKSk7Zm9yKG89cixyPWk7KHI9dC5wYXJlbnQocikpIT09bzspcy5wdXNoKHIpO3JldHVybntwYXRoOmEuY29uY2F0KHMucmV2ZXJzZSgpKSxsY2E6b319KShlLG4sci52LHIudykscz1vLnBhdGgsbD1vLmxjYSxjPTAsdT1zW2NdLGg9ITA7dCE9PXIudzspe2lmKGk9ZS5ub2RlKHQpLGgpe2Zvcig7KHU9c1tjXSkhPT1sJiZlLm5vZGUodSkubWF4UmFuazxpLnJhbms7KWMrKzt1PT09bCYmKGg9ITEpfWlmKCFoKXtmb3IoO2M8cy5sZW5ndGgtMSYmZS5ub2RlKHU9c1tjKzFdKS5taW5SYW5rPD1pLnJhbms7KWMrKzt1PXNbY119ZS5zZXRQYXJlbnQodCx1KSx0PWUuc3VjY2Vzc29ycyh0KVswXX19KSl9KShlKX0pKSxuKCIgICAgYWRkQm9yZGVyU2VnbWVudHMiLChmdW5jdGlvbigpeyEoZnVuY3Rpb24gdChlKXtsanQuZm9yRWFjaChlLmNoaWxkcmVuKCksKGZ1bmN0aW9uIHQobil7dmFyIGk9ZS5jaGlsZHJlbihuKSxyPWUubm9kZShuKTtpZihpLmxlbmd0aCYmbGp0LmZvckVhY2goaSx0KSxsanQuaGFzKHIsIm1pblJhbmsiKSl7ci5ib3JkZXJMZWZ0PVtdLHIuYm9yZGVyUmlnaHQ9W107Zm9yKHZhciBvPXIubWluUmFuayxhPXIubWF4UmFuaysxO288YTsrK28pdWp0KGUsImJvcmRlckxlZnQiLCJfYmwiLG4scixvKSx1anQoZSwiYm9yZGVyUmlnaHQiLCJfYnIiLG4scixvKX19KSl9KShlKX0pKSxuKCIgICAgb3JkZXIiLChmdW5jdGlvbigpeyEoZnVuY3Rpb24gdChlKXt2YXIgbj1JanQubWF4UmFuayhlKSxpPVJqdChlLEFqdC5yYW5nZSgxLG4rMSksImluRWRnZXMiKSxyPVJqdChlLEFqdC5yYW5nZShuLTEsLTEsLTEpLCJvdXRFZGdlcyIpLG89KGZ1bmN0aW9uIGEodCl7dmFyIGU9e30sbj1nanQuZmlsdGVyKHQubm9kZXMoKSwoZnVuY3Rpb24oZSl7cmV0dXJuIXQuY2hpbGRyZW4oZSkubGVuZ3RofSkpLGk9Z2p0Lm1heChnanQubWFwKG4sKGZ1bmN0aW9uKGUpe3JldHVybiB0Lm5vZGUoZSkucmFua30pKSkscj1nanQubWFwKGdqdC5yYW5nZShpKzEpLChmdW5jdGlvbigpe3JldHVybltdfSkpLG89Z2p0LnNvcnRCeShuLChmdW5jdGlvbihlKXtyZXR1cm4gdC5ub2RlKGUpLnJhbmt9KSk7cmV0dXJuIGdqdC5mb3JFYWNoKG8sKGZ1bmN0aW9uIG4oaSl7aWYoIWdqdC5oYXMoZSxpKSl7ZVtpXT0hMDt2YXIgbz10Lm5vZGUoaSk7cltvLnJhbmtdLnB1c2goaSksZ2p0LmZvckVhY2godC5zdWNjZXNzb3JzKGkpLG4pfX0pKSxyfSkoZSk7emp0KGUsbyk7Zm9yKHZhciBzLGw9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGM9MCx1PTA7dTw0OysrYywrK3Upe09qdChjJTI/aTpyLGMlND49Miksbz1JanQuYnVpbGRMYXllck1hdHJpeChlKTt2YXIgaD1ranQoZSxvKTtoPGwmJih1PTAscz1BanQuY2xvbmVEZWVwKG8pLGw9aCl9emp0KGUscyl9KShlKX0pKSxuKCIgICAgaW5zZXJ0U2VsZkVkZ2VzIiwoZnVuY3Rpb24oKXshKGZ1bmN0aW9uIHQoZSl7dmFyIG49Wmp0LmJ1aWxkTGF5ZXJNYXRyaXgoZSk7R2p0LmZvckVhY2gobiwoZnVuY3Rpb24odCl7dmFyIG49MDtHanQuZm9yRWFjaCh0LChmdW5jdGlvbih0LGkpe3ZhciByPWUubm9kZSh0KTtyLm9yZGVyPWkrbixHanQuZm9yRWFjaChyLnNlbGZFZGdlcywoZnVuY3Rpb24odCl7Wmp0LmFkZER1bW15Tm9kZShlLCJzZWxmZWRnZSIse3dpZHRoOnQubGFiZWwud2lkdGgsaGVpZ2h0OnQubGFiZWwuaGVpZ2h0LHJhbms6ci5yYW5rLG9yZGVyOmkrICsrbixlOnQuZSxsYWJlbDp0LmxhYmVsfSwiX3NlIil9KSksZGVsZXRlIHIuc2VsZkVkZ2VzfSkpfSkpfSkoZSl9KSksbigiICAgIGFkanVzdENvb3JkaW5hdGVTeXN0ZW0iLChmdW5jdGlvbigpeyEoZnVuY3Rpb24gdChlKXt2YXIgbj1lLmdyYXBoKCkucmFua2Rpci50b0xvd2VyQ2FzZSgpOyJsciIhPT1uJiYicmwiIT09bnx8ZGp0KGUpfSkoZSl9KSksbigiICAgIHBvc2l0aW9uIiwoZnVuY3Rpb24oKXshKGZ1bmN0aW9uIHQoZSl7KGZ1bmN0aW9uIG4odCl7dmFyIGU9amp0LmJ1aWxkTGF5ZXJNYXRyaXgodCksbj10LmdyYXBoKCkucmFua3NlcCxpPTA7VWp0LmZvckVhY2goZSwoZnVuY3Rpb24oZSl7dmFyIHI9VWp0Lm1heChVanQubWFwKGUsKGZ1bmN0aW9uKGUpe3JldHVybiB0Lm5vZGUoZSkuaGVpZ2h0fSkpKTtVanQuZm9yRWFjaChlLChmdW5jdGlvbihlKXt0Lm5vZGUoZSkueT1pK3IvMn0pKSxpKz1yK259KSl9KShlPWpqdC5hc05vbkNvbXBvdW5kR3JhcGgoZSkpLFVqdC5mb3JFYWNoKChmdW5jdGlvbiBpKHQpe3ZhciBlLG49SGp0LmJ1aWxkTGF5ZXJNYXRyaXgodCksaT1EanQubWVyZ2UoKGZ1bmN0aW9uIHIodCxlKXt2YXIgbj17fTtyZXR1cm4gRGp0LnJlZHVjZShlLChmdW5jdGlvbiBpKGUscil7dmFyIG89MCxhPTAscz1lLmxlbmd0aCxsPURqdC5sYXN0KHIpO3JldHVybiBEanQuZm9yRWFjaChyLChmdW5jdGlvbihlLGkpe3ZhciBjPShmdW5jdGlvbiB1KHQsZSl7aWYodC5ub2RlKGUpLmR1bW15KXJldHVybiBEanQuZmluZCh0LnByZWRlY2Vzc29ycyhlKSwoZnVuY3Rpb24oZSl7cmV0dXJuIHQubm9kZShlKS5kdW1teX0pKX0pKHQsZSksaD1jP3Qubm9kZShjKS5vcmRlcjpzOyhjfHxlPT09bCkmJihEanQuZm9yRWFjaChyLnNsaWNlKGEsaSsxKSwoZnVuY3Rpb24oZSl7RGp0LmZvckVhY2godC5wcmVkZWNlc3NvcnMoZSksKGZ1bmN0aW9uKGkpe3ZhciByPXQubm9kZShpKSxhPXIub3JkZXI7IShhPG98fGg8YSl8fHIuZHVtbXkmJnQubm9kZShlKS5kdW1teXx8Rmp0KG4saSxlKX0pKX0pKSxhPWkrMSxvPWgpfSkpLHJ9KSksbn0pKHQsbiksKGZ1bmN0aW9uIG8odCxlKXt2YXIgbj17fTtmdW5jdGlvbiBpKGUsaSxyLG8sYSl7dmFyIHM7RGp0LmZvckVhY2goRGp0LnJhbmdlKGksciksKGZ1bmN0aW9uKGkpe3Qubm9kZShzPWVbaV0pLmR1bW15JiZEanQuZm9yRWFjaCh0LnByZWRlY2Vzc29ycyhzKSwoZnVuY3Rpb24oZSl7dmFyIGk9dC5ub2RlKGUpO2kuZHVtbXkmJihpLm9yZGVyPG98fGkub3JkZXI+YSkmJkZqdChuLGUscyl9KSl9KSl9cmV0dXJuIERqdC5yZWR1Y2UoZSwoZnVuY3Rpb24gcihlLG4pe3ZhciByLG89LTEsYT0wO3JldHVybiBEanQuZm9yRWFjaChuLChmdW5jdGlvbihzLGwpe2lmKCJib3JkZXIiPT09dC5ub2RlKHMpLmR1bW15KXt2YXIgYz10LnByZWRlY2Vzc29ycyhzKTtjLmxlbmd0aCYmKHI9dC5ub2RlKGNbMF0pLm9yZGVyLGkobixhLGwsbyxyKSxhPWwsbz1yKX1pKG4sYSxuLmxlbmd0aCxyLGUubGVuZ3RoKX0pKSxufSkpLG59KSh0LG4pKSxhPXt9O0RqdC5mb3JFYWNoKFsidSIsImQiXSwoZnVuY3Rpb24ocil7ZT0idSI9PT1yP246RGp0LnZhbHVlcyhuKS5yZXZlcnNlKCksRGp0LmZvckVhY2goWyJsIiwiciJdLChmdW5jdGlvbihuKXsiciI9PT1uJiYoZT1EanQubWFwKGUsKGZ1bmN0aW9uKHQpe3JldHVybiBEanQudmFsdWVzKHQpLnJldmVyc2UoKX0pKSk7dmFyIG89KCJ1Ij09PXI/dC5wcmVkZWNlc3NvcnM6dC5zdWNjZXNzb3JzKS5iaW5kKHQpLHM9KGZ1bmN0aW9uIGwodCxlLG4saSl7dmFyIHI9e30sbz17fSxhPXt9O3JldHVybiBEanQuZm9yRWFjaChlLChmdW5jdGlvbih0KXtEanQuZm9yRWFjaCh0LChmdW5jdGlvbih0LGUpe3JbdF09dCxvW3RdPXQsYVt0XT1lfSkpfSkpLERqdC5mb3JFYWNoKGUsKGZ1bmN0aW9uKHQpe3ZhciBlPS0xO0RqdC5mb3JFYWNoKHQsKGZ1bmN0aW9uKHQpe3ZhciBzPWkodCk7aWYocy5sZW5ndGgpZm9yKHZhciBsPSgocz1EanQuc29ydEJ5KHMsKGZ1bmN0aW9uKHQpe3JldHVybiBhW3RdfSkpKS5sZW5ndGgtMSkvMixjPU1hdGguZmxvb3IobCksdT1NYXRoLmNlaWwobCk7Yzw9dTsrK2Mpe3ZhciBoPXNbY107b1t0XT09PXQmJmU8YVtoXSYmIVZqdChuLHQsaCkmJihvW2hdPXQsb1t0XT1yW3RdPXJbaF0sZT1hW2hdKX19KSl9KSkse3Jvb3Q6cixhbGlnbjpvfX0pKDAsZSxpLG8pLGM9KGZ1bmN0aW9uIHUodCxlLG4saSxyKXt2YXIgbz17fSxhPShmdW5jdGlvbiBzKHQsZSxuLGkpe3ZhciByPW5ldyBCanQsbz10LmdyYXBoKCksYT0oZnVuY3Rpb24gcyh0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKGkscixvKXt2YXIgYSxzPWkubm9kZShyKSxsPWkubm9kZShvKSxjPTA7aWYoYys9cy53aWR0aC8yLERqdC5oYXMocywibGFiZWxwb3MiKSlzd2l0Y2gocy5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpKXtjYXNlImwiOmE9LXMud2lkdGgvMjticmVhaztjYXNlInIiOmE9cy53aWR0aC8yfWlmKGEmJihjKz1uP2E6LWEpLGE9MCxjKz0ocy5kdW1teT9lOnQpLzIsYys9KGwuZHVtbXk/ZTp0KS8yLGMrPWwud2lkdGgvMixEanQuaGFzKGwsImxhYmVscG9zIikpc3dpdGNoKGwubGFiZWxwb3MudG9Mb3dlckNhc2UoKSl7Y2FzZSJsIjphPWwud2lkdGgvMjticmVhaztjYXNlInIiOmE9LWwud2lkdGgvMn1yZXR1cm4gYSYmKGMrPW4/YTotYSksYT0wLGN9fSkoby5ub2Rlc2VwLG8uZWRnZXNlcCxpKTtyZXR1cm4gRGp0LmZvckVhY2goZSwoZnVuY3Rpb24oZSl7dmFyIGk7RGp0LmZvckVhY2goZSwoZnVuY3Rpb24oZSl7dmFyIG89bltlXTtpZihyLnNldE5vZGUobyksaSl7dmFyIHM9bltpXSxsPXIuZWRnZShzLG8pO3Iuc2V0RWRnZShzLG8sTWF0aC5tYXgoYSh0LGUsaSksbHx8MCkpfWk9ZX0pKX0pKSxyfSkodCxlLG4sciksbD1yPyJib3JkZXJMZWZ0IjoiYm9yZGVyUmlnaHQiO2Z1bmN0aW9uIGModCxlKXtmb3IodmFyIG49YS5ub2RlcygpLGk9bi5wb3AoKSxyPXt9O2k7KXJbaV0/dChpKToocltpXT0hMCxuLnB1c2goaSksbj1uLmNvbmNhdChlKGkpKSksaT1uLnBvcCgpfXJldHVybiBjKChmdW5jdGlvbiB1KHQpe29bdF09YS5pbkVkZ2VzKHQpLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5tYXgodCxvW2Uudl0rYS5lZGdlKGUpKX0pLDApfSksYS5wcmVkZWNlc3NvcnMuYmluZChhKSksYygoZnVuY3Rpb24gaChlKXt2YXIgbj1hLm91dEVkZ2VzKGUpLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5taW4odCxvW2Uud10tYS5lZGdlKGUpKX0pLE51bWJlci5QT1NJVElWRV9JTkZJTklUWSksaT10Lm5vZGUoZSk7biE9PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSYmaS5ib3JkZXJUeXBlIT09bCYmKG9bZV09TWF0aC5tYXgob1tlXSxuKSl9KSxhLnN1Y2Nlc3NvcnMuYmluZChhKSksRGp0LmZvckVhY2goaSwoZnVuY3Rpb24odCl7b1t0XT1vW25bdF1dfSkpLG99KSh0LGUscy5yb290LHMuYWxpZ24sInIiPT09bik7InIiPT09biYmKGM9RGp0Lm1hcFZhbHVlcyhjLChmdW5jdGlvbih0KXtyZXR1cm4tdH0pKSksYVtyK25dPWN9KSl9KSk7dmFyIHM9KGZ1bmN0aW9uIGwodCxlKXtyZXR1cm4gRGp0Lm1pbkJ5KERqdC52YWx1ZXMoZSksKGZ1bmN0aW9uKGUpe3ZhciBuPU51bWJlci5ORUdBVElWRV9JTkZJTklUWSxpPU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtyZXR1cm4gRGp0LmZvckluKGUsKGZ1bmN0aW9uKGUscil7dmFyIG89KGZ1bmN0aW9uIGEodCxlKXtyZXR1cm4gdC5ub2RlKGUpLndpZHRofSkodCxyKS8yO249TWF0aC5tYXgoZStvLG4pLGk9TWF0aC5taW4oZS1vLGkpfSkpLG4taX0pKX0pKHQsYSk7cmV0dXJuKGZ1bmN0aW9uIGModCxlKXt2YXIgbj1EanQudmFsdWVzKGUpLGk9RGp0Lm1pbihuKSxyPURqdC5tYXgobik7RGp0LmZvckVhY2goWyJ1IiwiZCJdLChmdW5jdGlvbihuKXtEanQuZm9yRWFjaChbImwiLCJyIl0sKGZ1bmN0aW9uKG8pe3ZhciBhLHM9bitvLGw9dFtzXTtpZihsIT09ZSl7dmFyIGM9RGp0LnZhbHVlcyhsKTsoYT0ibCI9PT1vP2ktRGp0Lm1pbihjKTpyLURqdC5tYXgoYykpJiYodFtzXT1EanQubWFwVmFsdWVzKGwsKGZ1bmN0aW9uKHQpe3JldHVybiB0K2F9KSkpfX0pKX0pKX0pKGEscyksKGZ1bmN0aW9uIHUodCxlKXtyZXR1cm4gRGp0Lm1hcFZhbHVlcyh0LnVsLChmdW5jdGlvbihuLGkpe2lmKGUpcmV0dXJuIHRbZS50b0xvd2VyQ2FzZSgpXVtpXTt2YXIgcj1EanQuc29ydEJ5KERqdC5tYXAodCxpKSk7cmV0dXJuKHJbMV0rclsyXSkvMn0pKX0pKGEsdC5ncmFwaCgpLmFsaWduKX0pKGUpLChmdW5jdGlvbih0LG4pe2Uubm9kZShuKS54PXR9KSl9KShlKX0pKSxuKCIgICAgcG9zaXRpb25TZWxmRWRnZXMiLChmdW5jdGlvbigpeyEoZnVuY3Rpb24gdChlKXtHanQuZm9yRWFjaChlLm5vZGVzKCksKGZ1bmN0aW9uKHQpe3ZhciBuPWUubm9kZSh0KTtpZigic2VsZmVkZ2UiPT09bi5kdW1teSl7dmFyIGk9ZS5ub2RlKG4uZS52KSxyPWkueCtpLndpZHRoLzIsbz1pLnksYT1uLngtcixzPWkuaGVpZ2h0LzI7ZS5zZXRFZGdlKG4uZSxuLmxhYmVsKSxlLnJlbW92ZU5vZGUodCksbi5sYWJlbC5wb2ludHM9W3t4OnIrMiphLzMseTpvLXN9LHt4OnIrNSphLzYseTpvLXN9LHt4OnIrYSx5Om99LHt4OnIrNSphLzYseTpvK3N9LHt4OnIrMiphLzMseTpvK3N9XSxuLmxhYmVsLng9bi54LG4ubGFiZWwueT1uLnl9fSkpfSkoZSl9KSksbigiICAgIHJlbW92ZUJvcmRlck5vZGVzIiwoZnVuY3Rpb24oKXshKGZ1bmN0aW9uIHQoZSl7R2p0LmZvckVhY2goZS5ub2RlcygpLChmdW5jdGlvbih0KXtpZihlLmNoaWxkcmVuKHQpLmxlbmd0aCl7dmFyIG49ZS5ub2RlKHQpLGk9ZS5ub2RlKG4uYm9yZGVyVG9wKSxyPWUubm9kZShuLmJvcmRlckJvdHRvbSksbz1lLm5vZGUoR2p0Lmxhc3Qobi5ib3JkZXJMZWZ0KSksYT1lLm5vZGUoR2p0Lmxhc3Qobi5ib3JkZXJSaWdodCkpO24ud2lkdGg9TWF0aC5hYnMoYS54LW8ueCksbi5oZWlnaHQ9TWF0aC5hYnMoci55LWkueSksbi54PW8ueCtuLndpZHRoLzIsbi55PWkueStuLmhlaWdodC8yfX0pKSxHanQuZm9yRWFjaChlLm5vZGVzKCksKGZ1bmN0aW9uKHQpeyJib3JkZXIiPT09ZS5ub2RlKHQpLmR1bW15JiZlLnJlbW92ZU5vZGUodCl9KSl9KShlKX0pKSxuKCIgICAgbm9ybWFsaXplLnVuZG8iLChmdW5jdGlvbigpe3FqdC51bmRvKGUpfSkpLG4oIiAgICBmaXh1cEVkZ2VMYWJlbENvb3JkcyIsKGZ1bmN0aW9uKCl7IShmdW5jdGlvbiB0KGUpe0dqdC5mb3JFYWNoKGUuZWRnZXMoKSwoZnVuY3Rpb24odCl7dmFyIG49ZS5lZGdlKHQpO2lmKEdqdC5oYXMobiwieCIpKXN3aXRjaCgibCIhPT1uLmxhYmVscG9zJiYiciIhPT1uLmxhYmVscG9zfHwobi53aWR0aC09bi5sYWJlbG9mZnNldCksbi5sYWJlbHBvcyl7Y2FzZSJsIjpuLngtPW4ud2lkdGgvMituLmxhYmVsb2Zmc2V0O2JyZWFrO2Nhc2UiciI6bi54Kz1uLndpZHRoLzIrbi5sYWJlbG9mZnNldH19KSl9KShlKX0pKSxuKCIgICAgdW5kb0Nvb3JkaW5hdGVTeXN0ZW0iLChmdW5jdGlvbigpeyEoZnVuY3Rpb24gdChlKXt2YXIgbj1lLmdyYXBoKCkucmFua2Rpci50b0xvd2VyQ2FzZSgpOyJidCIhPT1uJiYicmwiIT09bnx8KGZ1bmN0aW9uIGkodCl7aGp0LmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbihlKXtmanQodC5ub2RlKGUpKX0pKSxoanQuZm9yRWFjaCh0LmVkZ2VzKCksKGZ1bmN0aW9uKGUpe3ZhciBuPXQuZWRnZShlKTtoanQuZm9yRWFjaChuLnBvaW50cyxmanQpLGhqdC5oYXMobiwieSIpJiZmanQobil9KSl9KShlKSwibHIiIT09biYmInJsIiE9PW58fCgoZnVuY3Rpb24gcih0KXtoanQuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGUpe21qdCh0Lm5vZGUoZSkpfSkpLGhqdC5mb3JFYWNoKHQuZWRnZXMoKSwoZnVuY3Rpb24oZSl7dmFyIG49dC5lZGdlKGUpO2hqdC5mb3JFYWNoKG4ucG9pbnRzLG1qdCksaGp0LmhhcyhuLCJ4IikmJm1qdChuKX0pKX0pKGUpLGRqdChlKSl9KShlKX0pKSxuKCIgICAgdHJhbnNsYXRlR3JhcGgiLChmdW5jdGlvbigpeyEoZnVuY3Rpb24gdChlKXt2YXIgbj1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksaT0wLHI9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLG89MCxhPWUuZ3JhcGgoKSxzPWEubWFyZ2lueHx8MCxsPWEubWFyZ2lueXx8MDtmdW5jdGlvbiBjKHQpe3ZhciBlPXQueCxhPXQueSxzPXQud2lkdGgsbD10LmhlaWdodDtuPU1hdGgubWluKG4sZS1zLzIpLGk9TWF0aC5tYXgoaSxlK3MvMikscj1NYXRoLm1pbihyLGEtbC8yKSxvPU1hdGgubWF4KG8sYStsLzIpfUdqdC5mb3JFYWNoKGUubm9kZXMoKSwoZnVuY3Rpb24odCl7YyhlLm5vZGUodCkpfSkpLEdqdC5mb3JFYWNoKGUuZWRnZXMoKSwoZnVuY3Rpb24odCl7dmFyIG49ZS5lZGdlKHQpO0dqdC5oYXMobiwieCIpJiZjKG4pfSkpLG4tPXMsci09bCxHanQuZm9yRWFjaChlLm5vZGVzKCksKGZ1bmN0aW9uKHQpe3ZhciBpPWUubm9kZSh0KTtpLngtPW4saS55LT1yfSkpLEdqdC5mb3JFYWNoKGUuZWRnZXMoKSwoZnVuY3Rpb24odCl7dmFyIGk9ZS5lZGdlKHQpO0dqdC5mb3JFYWNoKGkucG9pbnRzLChmdW5jdGlvbih0KXt0LngtPW4sdC55LT1yfSkpLEdqdC5oYXMoaSwieCIpJiYoaS54LT1uKSxHanQuaGFzKGksInkiKSYmKGkueS09cil9KSksYS53aWR0aD1pLW4rcyxhLmhlaWdodD1vLXIrbH0pKGUpfSkpLG4oIiAgICBhc3NpZ25Ob2RlSW50ZXJzZWN0cyIsKGZ1bmN0aW9uKCl7IShmdW5jdGlvbiB0KGUpe0dqdC5mb3JFYWNoKGUuZWRnZXMoKSwoZnVuY3Rpb24odCl7dmFyIG4saSxyPWUuZWRnZSh0KSxvPWUubm9kZSh0LnYpLGE9ZS5ub2RlKHQudyk7ci5wb2ludHM/KG49ci5wb2ludHNbMF0saT1yLnBvaW50c1tyLnBvaW50cy5sZW5ndGgtMV0pOihyLnBvaW50cz1bXSxuPWEsaT1vKSxyLnBvaW50cy51bnNoaWZ0KFpqdC5pbnRlcnNlY3RSZWN0KG8sbikpLHIucG9pbnRzLnB1c2goWmp0LmludGVyc2VjdFJlY3QoYSxpKSl9KSl9KShlKX0pKSxuKCIgICAgcmV2ZXJzZVBvaW50cyIsKGZ1bmN0aW9uKCl7IShmdW5jdGlvbiB0KGUpe0dqdC5mb3JFYWNoKGUuZWRnZXMoKSwoZnVuY3Rpb24odCl7dmFyIG49ZS5lZGdlKHQpO24ucmV2ZXJzZWQmJm4ucG9pbnRzLnJldmVyc2UoKX0pKX0pKGUpfSkpLG4oIiAgICBhY3ljbGljLnVuZG8iLChmdW5jdGlvbigpe1dqdC51bmRvKGUpfSkpfSkoZSxuKX0pKSxuKCIgIHVwZGF0ZUlucHV0R3JhcGgiLChmdW5jdGlvbigpeyEoZnVuY3Rpb24gbih0LGUpe0dqdC5mb3JFYWNoKHQubm9kZXMoKSwoZnVuY3Rpb24obil7dmFyIGk9dC5ub2RlKG4pLHI9ZS5ub2RlKG4pO2kmJihpLng9ci54LGkueT1yLnksZS5jaGlsZHJlbihuKS5sZW5ndGgmJihpLndpZHRoPXIud2lkdGgsaS5oZWlnaHQ9ci5oZWlnaHQpKX0pKSxHanQuZm9yRWFjaCh0LmVkZ2VzKCksKGZ1bmN0aW9uKG4pe3ZhciBpPXQuZWRnZShuKSxyPWUuZWRnZShuKTtpLnBvaW50cz1yLnBvaW50cyxHanQuaGFzKHIsIngiKSYmKGkueD1yLngsaS55PXIueSl9KSksdC5ncmFwaCgpLndpZHRoPWUuZ3JhcGgoKS53aWR0aCx0LmdyYXBoKCkuaGVpZ2h0PWUuZ3JhcGgoKS5oZWlnaHR9KSh0LGUpfSkpfSkpfSxkZWJ1Zzp7ZGVidWdPcmRlcmluZzpmdW5jdGlvbiBnR3QodCl7dmFyIGU9ZEd0LmJ1aWxkTGF5ZXJNYXRyaXgodCksbj1uZXcgcEd0KHtjb21wb3VuZDohMCxtdWx0aWdyYXBoOiEwfSkuc2V0R3JhcGgoe30pO3JldHVybiBoR3QuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGUpe24uc2V0Tm9kZShlLHtsYWJlbDplfSksbi5zZXRQYXJlbnQoZSwibGF5ZXIiK3Qubm9kZShlKS5yYW5rKX0pKSxoR3QuZm9yRWFjaCh0LmVkZ2VzKCksKGZ1bmN0aW9uKHQpe24uc2V0RWRnZSh0LnYsdC53LHt9LHQubmFtZSl9KSksaEd0LmZvckVhY2goZSwoZnVuY3Rpb24odCxlKXtuLnNldE5vZGUoImxheWVyIitlLHtyYW5rOiJzYW1lIn0pLGhHdC5yZWR1Y2UodCwoZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5zZXRFZGdlKHQsZSx7c3R5bGU6ImludmlzIn0pLGV9KSl9KSksbn19LHV0aWw6e3RpbWU6aVV0LnRpbWUsbm90aW1lOmlVdC5ub3RpbWV9LHZlcnNpb246IjAuOC41In07IShmdW5jdGlvbih0KXt0LkZFVENIX1BCVFhUX0JZVEVTPSJGRVRDSF9QQlRYVF9CWVRFUyIsdC5GRVRDSF9QQlRYVF9CWVRFU19GUk9NX0ZJTEVTWVNURU09IkZFVENIX1BCVFhUX0JZVEVTX0ZST01fRklMRVNZU1RFTSIsdC5GRVRDSF9QQlRYVF9CWVRFU19GUk9NX1NFUlZFUj0iRkVUQ0hfUEJUWFRfQllURVNfRlJPTV9TRVJWRVIiLHQuUEFSU0VfUEJUWFRfSU5UT19PQkpFQ1Q9IlBBUlNFX1BCVFhUX0lOVE9fT0JKRUNUIix0LkZFVENIX01FVEFEQVRBX1BCVFhUX0JZVEVTPSJGRVRDSF9NRVRBREFUQV9QQlRYVF9CWVRFUyIsdC5QQVJTRV9NRVRBREFUQV9QQlRYVF9JTlRPX09CSkVDVD0iUEFSU0VfTUVUQURBVEFfUEJUWFRfSU5UT19PQkpFQ1QiLHQuTk9STUFMSVpJTkdfTkFNRVM9Ik5PUk1BTElaSU5HX05BTUVTIix0LkJVSUxEX1NMSU1fR1JBUEg9IkJVSUxEX1NMSU1fR1JBUEgiLHQuSElFUkFSQ0hZX0FERF9OT0RFUz0iSElFUkFSQ0hZX0FERF9OT0RFUyIsdC5ISUVSQVJDSFlfREVURUNUX1NFUklFUz0iSElFUkFSQ0hZX0RFVEVDVF9TRVJJRVMiLHQuSElFUkFSQ0hZX0FERF9FREdFUz0iSElFUkFSQ0hZX0FERF9FREdFUyIsdC5ISUVSQVJDSFlfRklORF9TSU1JTEFSX1NVQkdSQVBIUz0iSElFUkFSQ0hZX0ZJTkRfU0lNSUxBUl9TVUJHUkFQSFMiLHQuUkVOREVSX0JVSUxEX0hJRVJBUkNIWT0iUkVOREVSX0JVSUxEX0hJRVJBUkNIWSIsdC5SRU5ERVJfU0NFTkVfTEFZT1VUPSJSRU5ERVJfU0NFTkVfTEFZT1VUIix0LlJFTkRFUl9TQ0VORV9CVUlMRF9TQ0VORT0iUkVOREVSX1NDRU5FX0JVSUxEX1NDRU5FIix0LkdSQVBIX0xPQURfU1VDQ0VFREVEPSJHUkFQSF9MT0FEX1NVQ0NFRURFRCIsdC5HUkFQSF9MT0FEX0ZBSUxFRD0iR1JBUEhfTE9BRF9GQUlMRUQifSkoY0d0fHwoY0d0PXt9KSksKGZ1bmN0aW9uKHQpe3QuTk9ERV9FWFBBTlNJT05fVE9HR0xFRD0iTk9ERV9FWFBBTlNJT05fVE9HR0xFRCIsdC5OT0RFX1NFQVJDSF9SRVNVTFRfRk9DVVNFRD0iTk9ERV9TRUFSQ0hfUkVTVUxUX0ZPQ1VTRUQiLHQuTk9ERV9BVVhJTElBUllfRVhUUkFDVElPTl9DSEFOR0VEPSJOT0RFX0FVWElMSUFSWV9FWFRSQUNUSU9OX0NIQU5HRUQiLHQuR1JBUEhfVFlQRV9DSEFOR0VEPSJHUkFQSF9UWVBFX0NIQU5HRUQiLHQuVFJBQ0VfSU5QVVRfTU9ERV9UT0dHTEVEPSJUUkFDRV9JTlBVVF9NT0RFX1RPR0dMRUQiLHQuTk9ERV9DT0xPUl9NT0RFX0NIQU5HRUQ9Ik5PREVfQ09MT1JfTU9ERV9DSEFOR0VEIix0LlVQTE9BREVEX0dSQVBIX0ZST01fRklMRVNZU1RFTT0iVVBMT0FERURfR1JBUEhfRlJPTV9GSUxFU1lTVEVNIn0pKHVHdHx8KHVHdD17fSkpO2NvbnN0IF9HdD1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sY0d0KSx1R3QpO3ZhciB5R3Q7IShmdW5jdGlvbih0KXt0Lk9QX0dSQVBIPSJvcF9ncmFwaCIsdC5DT05DRVBUVUFMX0dSQVBIPSJjb25jZXB0dWFsX2dyYXBoIix0LlBST0ZJTEU9InByb2ZpbGUifSkoeUd0fHwoeUd0PXt9KSk7bGV0IHZHdD17Tm9kZTp7Q09OVEFJTkVSOiJub2RlcyIsR1JPVVA6Im5vZGUiLFNIQVBFOiJub2Rlc2hhcGUiLENPTE9SX1RBUkdFVDoibm9kZWNvbG9ydGFyZ2V0IixMQUJFTDoibm9kZWxhYmVsIixCVVRUT05fQ09OVEFJTkVSOiJidXR0b25jb250YWluZXIiLEJVVFRPTl9DSVJDTEU6ImJ1dHRvbmNpcmNsZSIsRVhQQU5EX0JVVFRPTjoiZXhwYW5kYnV0dG9uIixDT0xMQVBTRV9CVVRUT046ImNvbGxhcHNlYnV0dG9uIn0sRWRnZTp7Q09OVEFJTkVSOiJlZGdlcyIsR1JPVVA6ImVkZ2UiLExJTkU6ImVkZ2VsaW5lIixSRUZFUkVOQ0VfRURHRToicmVmZXJlbmNlZWRnZSIsUkVGX0xJTkU6InJlZmxpbmUiLFNFTEVDVEFCTEU6InNlbGVjdGFibGVlZGdlIixTRUxFQ1RFRDoic2VsZWN0ZWRlZGdlIixTVFJVQ1RVUkFMOiJzdHJ1Y3R1cmFsIn0sQW5ub3RhdGlvbjp7T1VUQk9YOiJvdXQtYW5ub3RhdGlvbnMiLElOQk9YOiJpbi1hbm5vdGF0aW9ucyIsR1JPVVA6ImFubm90YXRpb24iLE5PREU6ImFubm90YXRpb24tbm9kZSIsRURHRToiYW5ub3RhdGlvbi1lZGdlIixDT05UUk9MX0VER0U6ImFubm90YXRpb24tY29udHJvbC1lZGdlIixMQUJFTDoiYW5ub3RhdGlvbi1sYWJlbCIsRUxMSVBTSVM6ImFubm90YXRpb24tZWxsaXBzaXMifSxTY2VuZTp7R1JPVVA6InNjZW5lIixDT1JFOiJjb3JlIixGVU5DVElPTl9MSUJSQVJZOiJmdW5jdGlvbi1saWJyYXJ5IixJTkVYVFJBQ1Q6ImluLWV4dHJhY3QiLE9VVEVYVFJBQ1Q6Im91dC1leHRyYWN0In0sU3Vic2NlbmU6e0dST1VQOiJzdWJzY2VuZSJ9LE9QTk9ERToib3AiLE1FVEFOT0RFOiJtZXRhIixTRVJJRVNOT0RFOiJzZXJpZXMiLEJSSURHRU5PREU6ImJyaWRnZSIsRUxMSVBTSVNOT0RFOiJlbGxpcHNpcyJ9O2NvbnN0IGJHdD0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciO2Z1bmN0aW9uIHhHdCh0LGUsbil7bGV0IGk9dC5ub2RlKCkuY2hpbGROb2Rlcztmb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrKyl7bGV0IHI9aVt0XTtpZihyLnRhZ05hbWU9PT1lKWlmKG4gaW5zdGFuY2VvZiBBcnJheSl7bGV0IHQ9ITA7Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspdD10JiZyLmNsYXNzTGlzdC5jb250YWlucyhuW2VdKTtpZih0KXJldHVybiBTdShyKX1lbHNlIGlmKCFufHxyLmNsYXNzTGlzdC5jb250YWlucyhuKSlyZXR1cm4gU3Uocil9cmV0dXJuIFN1KG51bGwpfWZ1bmN0aW9uIHdHdCh0LGUsbixpKXtsZXQgcj14R3QodCxlLG4pO2lmKCFyLmVtcHR5KCkpcmV0dXJuIHI7bGV0IG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsZSk7aWYobiBpbnN0YW5jZW9mIEFycmF5KWZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKW8uY2xhc3NMaXN0LmFkZChuW3RdKTtlbHNlIG8uY2xhc3NMaXN0LmFkZChuKTtyZXR1cm4gaT90Lm5vZGUoKS5pbnNlcnRCZWZvcmUobyxpKTp0Lm5vZGUoKS5hcHBlbmRDaGlsZChvKSxTdShvKS5kYXR1bSh0LmRhdHVtKCkpfWNsYXNzIFNHdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnRvdGFsQnl0ZXM9MCx0aGlzLm91dHB1dFNpemU9dH1hZGRFeGVjdXRpb25UaW1lKHQsZSl7dGhpcy5zdGFydFRpbWU9bnVsbCE9dGhpcy5zdGFydFRpbWU/TWF0aC5taW4odGhpcy5zdGFydFRpbWUsdCk6dCx0aGlzLmVuZFRpbWU9bnVsbCE9dGhpcy5lbmRUaW1lP01hdGgubWF4KHRoaXMuZW5kVGltZSxlKTplfWFkZEJ5dGVzQWxsb2NhdGlvbih0KXt0aGlzLnRvdGFsQnl0ZXM9bnVsbCE9dGhpcy50b3RhbEJ5dGVzP01hdGgubWF4KHRoaXMudG90YWxCeXRlcyx0KTp0fWNvbWJpbmUodCl7bnVsbCE9dC50b3RhbEJ5dGVzJiYodGhpcy50b3RhbEJ5dGVzKz10LnRvdGFsQnl0ZXMpLG51bGwhPXQuZ2V0VG90YWxNaWNyb3MoKSYmdGhpcy5hZGRFeGVjdXRpb25UaW1lKHQuc3RhcnRUaW1lLHQuZW5kVGltZSl9Z2V0VG90YWxNaWNyb3MoKXtyZXR1cm4gbnVsbD09dGhpcy5zdGFydFRpbWV8fG51bGw9PXRoaXMuZW5kVGltZT9udWxsOnRoaXMuZW5kVGltZS10aGlzLnN0YXJ0VGltZX19Y29uc3QgTUd0PS43NSxFR3Q9ckUoKS5leHBvbmVudCguMykuZG9tYWluKFsxLDVlNl0pLnJhbmdlKFtNR3QsMTJdKS5jbGFtcCghMCk7ZnVuY3Rpb24gVEd0KHQpeyEoZnVuY3Rpb24gZSh0KXt0Lmhhc093blByb3BlcnR5KCJ0aW1pbmdJZCIpfSkodCl9ZnVuY3Rpb24gQ0d0KHQsZSxuKXtsZXQgaT1EYXRlLm5vdygpLHI9ZSgpO2NvbnN0IG89RGF0ZS5ub3coKS1pO3JldHVybiBjb25zb2xlLmxvZyh0LCI6IixvLCJtcyIpLG4mJlRHdCh7dGltaW5nSWQ6bixldmVudFZhbHVlOm99KSxyfWZ1bmN0aW9uIEFHdCh0KXtyZXR1cm57c2V0TWVzc2FnZTpmdW5jdGlvbihlKXt0LnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTp0LnByb2dyZXNzLnZhbHVlLG1zZzplfSl9LHVwZGF0ZVByb2dyZXNzOmZ1bmN0aW9uKGUpe3Quc2V0KCJwcm9ncmVzcyIse3ZhbHVlOnQucHJvZ3Jlc3MudmFsdWUrZSxtc2c6dC5wcm9ncmVzcy5tc2d9KX0scmVwb3J0RXJyb3I6ZnVuY3Rpb24oZSxuKXtjb25zb2xlLmVycm9yKG4uc3RhY2spLHQuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOnQucHJvZ3Jlc3MudmFsdWUsbXNnOmUsZXJyb3I6ITB9KX19fWZ1bmN0aW9uIGtHdCh0LGUsbil7cmV0dXJue3NldE1lc3NhZ2U6ZnVuY3Rpb24oZSl7dC5zZXRNZXNzYWdlKG4rIjogIitlKX0sdXBkYXRlUHJvZ3Jlc3M6ZnVuY3Rpb24obil7dC51cGRhdGVQcm9ncmVzcyhuKmUvMTAwKX0scmVwb3J0RXJyb3I6ZnVuY3Rpb24oZSxpKXt0LnJlcG9ydEVycm9yKG4rIjogIitlLGkpfX19ZnVuY3Rpb24gTEd0KHQsZSxuLGkscil7cmV0dXJuIG5ldyBQcm9taXNlKCgobyxhKT0+e2kuc2V0TWVzc2FnZSh0KSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3RyeXtsZXQgYT1DR3QodCxuLHIpO2kudXBkYXRlUHJvZ3Jlc3MoZSksbyhhKX1jYXRjaChlKXtpLnJlcG9ydEVycm9yKCJGYWlsZWQgIit0LGUpfX0pLDIwKX0pKX1mdW5jdGlvbiBQR3QodCxlLG4saSxyKXtyZXR1cm4gbmV3IFByb21pc2UoKChvLGEpPT57bGV0IHM9ZnVuY3Rpb24oZSl7aS5yZXBvcnRFcnJvcigiRmFpbGVkICIrdCxlKSxhKGUpfTtpLnNldE1lc3NhZ2UodCksc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0cnl7bGV0IGE9RGF0ZS5ub3coKTtuKCkudGhlbigoZnVuY3Rpb24obil7Y29uc3Qgcz1EYXRlLm5vdygpLWE7Y29uc29sZS5sb2codCwiOiIscywibXMiKSxpLnVwZGF0ZVByb2dyZXNzKGUpLFRHdCh7dGltaW5nSWQ6cixldmVudFZhbHVlOnN9KSxvKG4pfSkpLmNhdGNoKHMpfWNhdGNoKHQpe3ModCl9fSksMjApfSkpfWNvbnN0IE5HdD1be3N5bWJvbDoiQiJ9LHtzeW1ib2w6IktCIixudW1Vbml0czoxMDI0fSx7c3ltYm9sOiJNQiIsbnVtVW5pdHM6MTAyNH0se3N5bWJvbDoiR0IiLG51bVVuaXRzOjEwMjR9LHtzeW1ib2w6IlRCIixudW1Vbml0czoxMDI0fSx7c3ltYm9sOiJQQiIsbnVtVW5pdHM6MTAyNH1dLElHdD1be3N5bWJvbDoiwrVzIn0se3N5bWJvbDoibXMiLG51bVVuaXRzOjFlM30se3N5bWJvbDoicyIsbnVtVW5pdHM6MWUzfSx7c3ltYm9sOiJtaW4iLG51bVVuaXRzOjYwfSx7c3ltYm9sOiJociIsbnVtVW5pdHM6NjB9LHtzeW1ib2w6ImRheXMiLG51bVVuaXRzOjI0fV07ZnVuY3Rpb24gUkd0KHQsZSxuPTApe3JldHVybiBuKzE8ZS5sZW5ndGgmJnQ+PWVbbisxXS5udW1Vbml0cz9SR3QodC9lW24rMV0ubnVtVW5pdHMsZSxuKzEpOk51bWJlcih0LnRvUHJlY2lzaW9uKDMpKSsiICIrZVtuXS5zeW1ib2x9ZnVuY3Rpb24gT0d0KHQpe3JldHVybiEoIXR8fCEodC50b3RhbEJ5dGVzPjB8fHQuZ2V0VG90YWxNaWNyb3MoKT4wfHx0Lm91dHB1dFNpemUpKX1mdW5jdGlvbiB6R3QodCl7aWYodC5sZW5ndGg8MilyZXR1cm4gdDtsZXQgZT0wLG49MCxpPVNlLmV4cG9ydHMubWluKFNlLmV4cG9ydHMubWFwKHQsKHQ9PnQubGVuZ3RoKSkpO2Zvcig7Oyl7ZSsrO2xldCByPVNlLmV4cG9ydHMubWFwKHQsKHQ9PnQuc3Vic3RyaW5nKDAsZSkpKTtpZighci5ldmVyeSgoKHQsZSk9PjA9PT1lfHx0PT09cltlLTFdKSkpYnJlYWs7aWYoZT49aSlyZXR1cm4gdDtuPWV9cmV0dXJuIFNlLmV4cG9ydHMubWFwKHQsKHQ9PnQuc3Vic3RyaW5nKG4pKSl9Y29uc3QgREd0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHQoIjJkIik7ZnVuY3Rpb24gQkd0KHQsZSl7cmV0dXJuIERHdC5mb250PWAke2V9cHggUm9ib3RvLCBzYW5zLXNlcmlmYCxER3QubWVhc3VyZVRleHQodCkud2lkdGh9Y29uc3QgSEd0PSIvIixGR3Q9Il9fcm9vdF9fIixWR3Q9Il9fZnVuY3Rpb25fbGlicmFyeV9fIjt2YXIgVUd0LGpHdCxHR3QsV0d0OyEoZnVuY3Rpb24odCl7dFt0LkZVTEw9MF09IkZVTEwiLHRbdC5FTUJFRERFRD0xXT0iRU1CRURERUQiLHRbdC5NRVRBPTJdPSJNRVRBIix0W3QuU0VSSUVTPTNdPSJTRVJJRVMiLHRbdC5DT1JFPTRdPSJDT1JFIix0W3QuU0hBRE9XPTVdPSJTSEFET1ciLHRbdC5CUklER0U9Nl09IkJSSURHRSIsdFt0LkVER0U9N109IkVER0UifSkoVUd0fHwoVUd0PXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5NRVRBPTBdPSJNRVRBIix0W3QuT1A9MV09Ik9QIix0W3QuU0VSSUVTPTJdPSJTRVJJRVMiLHRbdC5CUklER0U9M109IkJSSURHRSIsdFt0LkVMTElQU0lTPTRdPSJFTExJUFNJUyJ9KShqR3R8fChqR3Q9e30pKSwoZnVuY3Rpb24odCl7dFt0LklOQ0xVREU9MF09IklOQ0xVREUiLHRbdC5FWENMVURFPTFdPSJFWENMVURFIix0W3QuVU5TUEVDSUZJRUQ9Ml09IlVOU1BFQ0lGSUVEIn0pKEdHdHx8KEdHdD17fSkpLChmdW5jdGlvbih0KXt0W3QuR1JPVVA9MF09IkdST1VQIix0W3QuVU5HUk9VUD0xXT0iVU5HUk9VUCJ9KShXR3R8fChXR3Q9e30pKTtjbGFzcyBxR3R7Y29uc3RydWN0b3IoKXt0aGlzLm5vZGVzPXt9LHRoaXMuZWRnZXM9W119fWNsYXNzIFlHdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnR5cGU9akd0LkVMTElQU0lTLHRoaXMuaXNHcm91cE5vZGU9ITEsdGhpcy5jYXJkaW5hbGl0eT0xLHRoaXMucGFyZW50Tm9kZT1udWxsLHRoaXMuc3RhdHM9bnVsbCx0aGlzLnNldE51bU1vcmVOb2Rlcyh0KSx0aGlzLmluY2x1ZGU9R0d0LlVOU1BFQ0lGSUVEfXNldE51bU1vcmVOb2Rlcyh0KXt0aGlzLm51bU1vcmVOb2Rlcz10LHRoaXMubmFtZT0iLi4uICIrdCsiIG1vcmUifX1jbGFzcyBYR3R7Y29uc3RydWN0b3IodCl7dGhpcy5vcD10Lm9wLHRoaXMubmFtZT10Lm5hbWUsdGhpcy5kZXZpY2U9dC5kZXZpY2UsdGhpcy5hdHRyPXQuYXR0cix0aGlzLmlucHV0cz0oZnVuY3Rpb24gZSh0KXtjb25zdCBlPVtdO2xldCBuPW51bGw7Zm9yKGxldCBpIG9mIHR8fFtdKXtjb25zdCB0PWkuc3RhcnRzV2l0aCgiXiIpO3QmJihpPWkuc3Vic3RyaW5nKDEpKTtsZXQgcj1pLG89IjAiO2NvbnN0IGE9aS5pbmNsdWRlcygiOiIpJiZpLm1hdGNoKG5XdCk7YSYmKHI9YVsxXSxvPWFbMl0pLG4hPT1yJiYobj1yLGUucHVzaCh7bmFtZTpyLG91dHB1dFRlbnNvcktleTpvLGlzQ29udHJvbERlcGVuZGVuY3k6dH0pKX1yZXR1cm4gZX0pKHQuaW5wdXQpLHRoaXMub3V0cHV0U2hhcGVzPShmdW5jdGlvbiBuKHQpe2lmKCF0KXJldHVybiBudWxsO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtsZXR7a2V5Om4sdmFsdWU6aX09dFtlXTtpZigiX291dHB1dF9zaGFwZXMiPT09bil7aWYoIWkubGlzdHx8IWkubGlzdC5zaGFwZSlyZXR1cm4gbnVsbDtsZXQgbj1pLmxpc3Quc2hhcGUubWFwKCh0PT50LnVua25vd25fcmFuaz9udWxsOm51bGw9PXQuZGltfHwxPT09dC5kaW0ubGVuZ3RoJiZudWxsPT10LmRpbVswXS5zaXplP1tdOnQuZGltLm1hcCgodD0+dC5zaXplKSkpKTtyZXR1cm4gdC5zcGxpY2UoZSwxKSxufX1yZXR1cm4gbnVsbH0pKHQuYXR0ciksdGhpcy54bGFDbHVzdGVyPShmdW5jdGlvbiBpKHQpe2lmKCF0KXJldHVybiBudWxsO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKCJfWGxhQ2x1c3RlciI9PT10W2VdLmtleSlyZXR1cm4gdFtlXS52YWx1ZS5zfHxudWxsO3JldHVybiBudWxsfSkodC5hdHRyKSx0aGlzLmNvbXBhdGlibGU9ITEsdGhpcy50eXBlPWpHdC5PUCx0aGlzLmlzR3JvdXBOb2RlPSExLHRoaXMuY2FyZGluYWxpdHk9MSx0aGlzLmluRW1iZWRkaW5ncz1bXSx0aGlzLm91dEVtYmVkZGluZ3M9W10sdGhpcy5wYXJlbnROb2RlPW51bGwsdGhpcy5pbmNsdWRlPUdHdC5VTlNQRUNJRklFRCx0aGlzLm93bmluZ1Nlcmllcz1udWxsfX1mdW5jdGlvbiAkR3QodCxlPXt9KXtyZXR1cm4gbmV3IEtHdCh0LGUpfWNsYXNzIEtHdHtjb25zdHJ1Y3Rvcih0LGU9e30pe3RoaXMubmFtZT10LHRoaXMudHlwZT1qR3QuTUVUQSx0aGlzLmRlcHRoPTEsdGhpcy5pc0dyb3VwTm9kZT0hMCx0aGlzLmNhcmRpbmFsaXR5PTAsdGhpcy5tZXRhZ3JhcGg9b1d0KHQsVUd0Lk1FVEEsZSksdGhpcy5icmlkZ2VncmFwaD1udWxsLHRoaXMub3BIaXN0b2dyYW09e30sdGhpcy5kZXZpY2VIaXN0b2dyYW09e30sdGhpcy54bGFDbHVzdGVySGlzdG9ncmFtPXt9LHRoaXMuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbT17Y29tcGF0aWJsZTowLGluY29tcGF0aWJsZTowfSx0aGlzLnRlbXBsYXRlSWQ9bnVsbCx0aGlzLnBhcmVudE5vZGU9bnVsbCx0aGlzLmhhc05vbkNvbnRyb2xFZGdlcz0hMSx0aGlzLmluY2x1ZGU9R0d0LlVOU1BFQ0lGSUVELHRoaXMuYXNzb2NpYXRlZEZ1bmN0aW9uPSIifWdldEZpcnN0Q2hpbGQoKXtyZXR1cm4gdGhpcy5tZXRhZ3JhcGgubm9kZSh0aGlzLm1ldGFncmFwaC5ub2RlcygpWzBdKX1nZXRSb290T3AoKXtsZXQgdD10aGlzLm5hbWUuc3BsaXQoIi8iKTtyZXR1cm4gdGhpcy5tZXRhZ3JhcGgubm9kZSh0aGlzLm5hbWUrIi8oIit0W3QubGVuZ3RoLTFdKyIpIil9bGVhdmVzKCl7bGV0IHQsZT1bXSxuPVt0aGlzXTtmb3IoO24ubGVuZ3RoOyl7bGV0IGk9bi5zaGlmdCgpO2kuaXNHcm91cE5vZGU/KHQ9aS5tZXRhZ3JhcGgsU2UuZXhwb3J0cy5lYWNoKHQubm9kZXMoKSwoZT0+bi5wdXNoKHQubm9kZShlKSkpKSk6ZS5wdXNoKGkubmFtZSl9cmV0dXJuIGV9fWZ1bmN0aW9uIFpHdCh0LGUpe3JldHVybiBuZXcgSkd0KHQsZSl9Y2xhc3MgSkd0e2NvbnN0cnVjdG9yKHQsZSl7dGhpcy52PXQsdGhpcy53PWUsdGhpcy5iYXNlRWRnZUxpc3Q9W10sdGhpcy5pbmJvdW5kPW51bGwsdGhpcy5udW1SZWd1bGFyRWRnZXM9MCx0aGlzLm51bUNvbnRyb2xFZGdlcz0wLHRoaXMubnVtUmVmRWRnZXM9MCx0aGlzLnRvdGFsU2l6ZT0wfWFkZEJhc2VFZGdlKHQsZSl7dGhpcy5iYXNlRWRnZUxpc3QucHVzaCh0KSx0LmlzQ29udHJvbERlcGVuZGVuY3k/dGhpcy5udW1Db250cm9sRWRnZXMrPTE6dGhpcy5udW1SZWd1bGFyRWRnZXMrPTEsdC5pc1JlZmVyZW5jZUVkZ2UmJih0aGlzLm51bVJlZkVkZ2VzKz0xKSx0aGlzLnRvdGFsU2l6ZSs9Skd0LmNvbXB1dGVTaXplT2ZFZGdlKHQsZSksZS5tYXhNZXRhRWRnZVNpemU9TWF0aC5tYXgoZS5tYXhNZXRhRWRnZVNpemUsdGhpcy50b3RhbFNpemUpfXN0YXRpYyBjb21wdXRlU2l6ZU9mRWRnZSh0LGUpe2xldCBuPWUubm9kZSh0LnYpO2lmKCFuLm91dHB1dFNoYXBlcylyZXR1cm4gMTtlLmhhc1NoYXBlSW5mbz0hMDtjb25zdCBpPU9iamVjdC5rZXlzKG4ub3V0cHV0U2hhcGVzKS5tYXAoKHQ9Pm4ub3V0cHV0U2hhcGVzW3RdKSkubWFwKCh0PT5udWxsPT10PzE6dC5yZWR1Y2UoKCh0LGUpPT4oLTE9PT1lJiYoZT0xKSx0KmUpKSwxKSkpO3JldHVybiBTZS5leHBvcnRzLnN1bShpKX19ZnVuY3Rpb24gUUd0KHQsZSxuLGkscixvKXtyZXR1cm4gbmV3IGVXdCh0LGUsbixpLHIsbyl9ZnVuY3Rpb24gdFd0KHQsZSxuLGkscil7cmV0dXJuKG4/bisiLyI6IiIpK3QrKHZvaWQgMCE9PWkmJnZvaWQgMCE9PXI/IlsiK2krIi0iK3IrIl0iOiIjIikrZX1jbGFzcyBlV3R7Y29uc3RydWN0b3IodCxlLG4saSxyLG8pe3RoaXMubmFtZT1yfHx0V3QodCxlLG4pLHRoaXMudHlwZT1qR3QuU0VSSUVTLHRoaXMuaGFzTG9vcD0hMSx0aGlzLnByZWZpeD10LHRoaXMuc3VmZml4PWUsdGhpcy5jbHVzdGVySWQ9aSx0aGlzLmlkcz1bXSx0aGlzLnBhcmVudD1uLHRoaXMuaXNHcm91cE5vZGU9ITAsdGhpcy5jYXJkaW5hbGl0eT0wLHRoaXMubWV0YWdyYXBoPW9XdChyLFVHdC5TRVJJRVMsbyksdGhpcy5icmlkZ2VncmFwaD1udWxsLHRoaXMucGFyZW50Tm9kZT1udWxsLHRoaXMuZGV2aWNlSGlzdG9ncmFtPXt9LHRoaXMueGxhQ2x1c3Rlckhpc3RvZ3JhbT17fSx0aGlzLmNvbXBhdGliaWxpdHlIaXN0b2dyYW09e2NvbXBhdGlibGU6MCxpbmNvbXBhdGlibGU6MH0sdGhpcy5oYXNOb25Db250cm9sRWRnZXM9ITEsdGhpcy5pbmNsdWRlPUdHdC5VTlNQRUNJRklFRH19Y29uc3Qgbld0PS9eKFteOl0rKTooKFx3Kzp8KVxkKykkLztmdW5jdGlvbiBpV3QodCxlLG4saSxyLG8pe2UhPT1uLm5hbWUmJnQuZWRnZXMucHVzaCh7djplLHc6bi5uYW1lLG91dHB1dFRlbnNvcktleTppLm91dHB1dFRlbnNvcktleSxpc0NvbnRyb2xEZXBlbmRlbmN5OmkuaXNDb250cm9sRGVwZW5kZW5jeSxpc1JlZmVyZW5jZUVkZ2U6ITA9PT1yLnJlZkVkZ2VzW24ub3ArIiAiK29dfSl9Y29uc3Qgcld0PXtlbmFibGVFbWJlZGRpbmc6ITAsaW5FbWJlZGRpbmdUeXBlczpbIkNvbnN0Il0sb3V0RW1iZWRkaW5nVHlwZXM6WyJeW2EtekEtWl0rU3VtbWFyeSQiXSxyZWZFZGdlczp7IkFzc2lnbiAwIjohMCwiQXNzaWduQWRkIDAiOiEwLCJBc3NpZ25TdWIgMCI6ITAsImFzc2lnbiAwIjohMCwiYXNzaWduX2FkZCAwIjohMCwiYXNzaWduX3N1YiAwIjohMCwiY291bnRfdXBfdG8gMCI6ITAsIlNjYXR0ZXJBZGQgMCI6ITAsIlNjYXR0ZXJTdWIgMCI6ITAsIlNjYXR0ZXJVcGRhdGUgMCI6ITAsInNjYXR0ZXJfYWRkIDAiOiEwLCJzY2F0dGVyX3N1YiAwIjohMCwic2NhdHRlcl91cGRhdGUgMCI6ITB9fTtmdW5jdGlvbiBvV3QodCxlLG49e30pe2NvbnN0IGk9bmV3IGZHdC5ncmFwaGxpYi5HcmFwaChuKTtyZXR1cm4gaS5zZXRHcmFwaCh7bmFtZTp0LHJhbmtkaXI6bi5yYW5rZGlyfHwiQlQiLHR5cGU6ZX0pLGl9ZnVuY3Rpb24gYVd0KHQpe3JldHVybiBmdW5jdGlvbihlKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7bGV0IGk9bmV3IFJlZ0V4cCh0W25dKTtpZigic3RyaW5nIj09dHlwZW9mIGUub3AmJmUub3AubWF0Y2goaSkpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIHNXdCh0KXtsZXQgZT10LnNwbGl0KEhHdCk7cmV0dXJuIHQrSEd0KyIoIitlW2UubGVuZ3RoLTFdKyIpIn1mdW5jdGlvbiBsV3QodCl7bGV0IGU9dC5ub2RlcygpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQubmVpZ2hib3JzKGUpLmxlbmd0aH0pKTtyZXR1cm4gZS5zb3J0KCksZX1mdW5jdGlvbiBjV3QodCxlKXtsZXQgbj1bXSxpPXQuaW5kZXhPZihIR3QpO2Zvcig7aT49MDspbi5wdXNoKHQuc3Vic3RyaW5nKDAsaSkpLGk9dC5pbmRleE9mKEhHdCxpKzEpO2lmKGUpe2xldCBpPWVbdF07aSYmbi5wdXNoKGkpfXJldHVybiBuLnB1c2godCksbn1mdW5jdGlvbiB1V3QodCl7cmV0dXJuIHQ9PT1HR3QuRVhDTFVERT8iQWRkIHRvIG1haW4gZ3JhcGgiOiJSZW1vdmUgZnJvbSBtYWluIGdyYXBoIn1sZXQgaFd0PSIjMGY5ZDU4IixkV3Q9IiNkYjQ0MzciLHBXdD17REVGQVVMVF9GSUxMOiIjZDlkOWQ5IixERUZBVUxUX1NUUk9LRToiI2E2YTZhNiIsU0FUVVJBVElPTjouNixMSUdIVE5FU1M6Ljg1LEVYUEFOREVEX0NPTE9SOiIjZjBmMGYwIixIVUVTOlsyMjAsMTAwLDE4MCw0MCwyMCwzNDAsMjYwLDMwMCwxNDAsNjBdLFNUUlVDVFVSRV9QQUxFVFRFKHQsZSl7bGV0IG49cFd0LkhVRVMsaT1uW3Qlbi5sZW5ndGhdLHI9TWF0aC5zaW4oaSpNYXRoLlBJLzM2MCk7cmV0dXJuICRoKGksLjAxKihlPzMwOjkwLTYwKnIpLC4wMSooZT85NTo4MCkpLnRvU3RyaW5nKCl9LERFVklDRV9QQUxFVFRFOnQ9PnBXdC5TVFJVQ1RVUkVfUEFMRVRURSh0KSxYTEFfQ0xVU1RFUl9QQUxFVFRFOnQ9PnBXdC5TVFJVQ1RVUkVfUEFMRVRURSh0KSxVTktOT1dOOiIjZWVlIixHUkFESUVOVF9PVVRMSU5FOiIjODg4In07Y29uc3QgZld0PVsiTm9PcCJdLG1XdD1bXSxnV3Q9WyIjZmZmNWYwIiwiI2ZiNmE0YSJdLF9XdD1uZXcgUmVnRXhwKCJeKD86X19mdW5jdGlvbl9saWJyYXJ5X18pPyhcXHcrKV9bYS16MC05XXs4fSg/Ol9cXGQrKT8kIik7Y2xhc3MgeVd0e2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLmhpZXJhcmNoeT10LHRoaXMuZGlzcGxheWluZ1N0YXRzPWUsdGhpcy5hdXRvRXh0cmFjdE5vZGVzPW4sdGhpcy5pbmRleD17fSx0aGlzLnJlbmRlcmVkT3BOYW1lcz1bXSx0aGlzLmNvbXB1dGVTY2FsZXMoKSx0aGlzLmhhc1N1YmhpZXJhcmNoeT17fSx0aGlzLnJvb3Q9bmV3IFRXdCh0LnJvb3QsdC5ncmFwaE9wdGlvbnMpLHRoaXMuaW5kZXhbdC5yb290Lm5hbWVdPXRoaXMucm9vdCx0aGlzLnJlbmRlcmVkT3BOYW1lcy5wdXNoKHQucm9vdC5uYW1lKSx0aGlzLmJ1aWxkU3ViaGllcmFyY2h5KHQucm9vdC5uYW1lKSx0aGlzLnJvb3QuZXhwYW5kZWQ9ITAsdGhpcy50cmFjZUlucHV0cz0hMX1jb21wdXRlU2NhbGVzKCl7dGhpcy5kZXZpY2VDb2xvck1hcD1FTSgpLmRvbWFpbih0aGlzLmhpZXJhcmNoeS5kZXZpY2VzKS5yYW5nZShTZS5leHBvcnRzLm1hcCh6bCh0aGlzLmhpZXJhcmNoeS5kZXZpY2VzLmxlbmd0aCkscFd0LkRFVklDRV9QQUxFVFRFKSksdGhpcy54bGFDbHVzdGVyQ29sb3JNYXA9RU0oKS5kb21haW4odGhpcy5oaWVyYXJjaHkueGxhQ2x1c3RlcnMpLnJhbmdlKFNlLmV4cG9ydHMubWFwKHpsKHRoaXMuaGllcmFyY2h5LnhsYUNsdXN0ZXJzLmxlbmd0aCkscFd0LlhMQV9DTFVTVEVSX1BBTEVUVEUpKTtsZXQgdD10aGlzLmhpZXJhcmNoeS5yb290Lm1ldGFncmFwaCxlPVdsKHQubm9kZXMoKSwoKGUsbik9PntsZXQgaT10Lm5vZGUoZSk7aWYobnVsbCE9aS5zdGF0cylyZXR1cm4gaS5zdGF0cy50b3RhbEJ5dGVzfSkpO3RoaXMubWVtb3J5VXNhZ2VTY2FsZT1WTSgpLmRvbWFpbihbMCxlXSkucmFuZ2UoZ1d0KTtsZXQgbj1XbCh0Lm5vZGVzKCksKChlLG4pPT57bGV0IGk9dC5ub2RlKGUpO2lmKG51bGwhPWkuc3RhdHMpcmV0dXJuIGkuc3RhdHMuZ2V0VG90YWxNaWNyb3MoKX0pKTt0aGlzLmNvbXB1dGVUaW1lU2NhbGU9Vk0oKS5kb21haW4oWzAsbl0pLnJhbmdlKGdXdCksdGhpcy5lZGdlV2lkdGhTaXplZEJhc2VkU2NhbGU9dGhpcy5oaWVyYXJjaHkuaGFzU2hhcGVJbmZvP0VHdDpWTSgpLmRvbWFpbihbMSx0aGlzLmhpZXJhcmNoeS5tYXhNZXRhRWRnZVNpemVdKS5yYW5nZShbTUd0LDEyXSl9Z2V0UmVuZGVyTm9kZUJ5TmFtZSh0KXtyZXR1cm4gdGhpcy5pbmRleFt0XX1nZXROb2RlQnlOYW1lKHQpe3JldHVybiB0aGlzLmhpZXJhcmNoeS5ub2RlKHQpfWNvbG9ySGlzdG9ncmFtKHQsZSl7aWYoT2JqZWN0LmtleXModCkubGVuZ3RoPjApe2NvbnN0IG49U2UuZXhwb3J0cy5zdW0oT2JqZWN0LmtleXModCkubWFwKChlPT50W2VdKSkpO3JldHVybiBPYmplY3Qua2V5cyh0KS5tYXAoKGk9Pih7Y29sb3I6ZShpKSxwcm9wb3J0aW9uOnRbaV0vbn0pKSl9cmV0dXJuIG51bGx9Z2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKHQpe2lmKCF0KXJldHVybiBudWxsO2lmKHQgaW4gdGhpcy5pbmRleClyZXR1cm4gdGhpcy5pbmRleFt0XTtsZXQgZT10aGlzLmhpZXJhcmNoeS5ub2RlKHQpO2lmKCFlKXJldHVybiBudWxsO2xldCBuPWUuaXNHcm91cE5vZGU/bmV3IFRXdChlLHRoaXMuaGllcmFyY2h5LmdyYXBoT3B0aW9ucyk6bmV3IHdXdChlKTt0aGlzLmluZGV4W3RdPW4sdGhpcy5yZW5kZXJlZE9wTmFtZXMucHVzaCh0KSxlLnN0YXRzJiYobi5tZW1vcnlDb2xvcj10aGlzLm1lbW9yeVVzYWdlU2NhbGUoZS5zdGF0cy50b3RhbEJ5dGVzKSxuLmNvbXB1dGVUaW1lQ29sb3I9dGhpcy5jb21wdXRlVGltZVNjYWxlKGUuc3RhdHMuZ2V0VG90YWxNaWNyb3MoKSkpLG4uaXNGYWRlZE91dD10aGlzLmRpc3BsYXlpbmdTdGF0cyYmIU9HdChlLnN0YXRzKTt2YXIgaT1udWxsLHI9bnVsbCxvPW51bGw7aWYoZS5pc0dyb3VwTm9kZSl7aT1lLmRldmljZUhpc3RvZ3JhbSxyPWUueGxhQ2x1c3Rlckhpc3RvZ3JhbTtsZXQgdD1lLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZSxuPWUuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU7MD09dCYmMD09bnx8KG89dC8odCtuKSl9ZWxzZXtsZXQgdD1uLm5vZGUuZGV2aWNlO3QmJihpPXtbdF06MX0pO2xldCBlPW4ubm9kZS54bGFDbHVzdGVyO2UmJihyPXtbZV06MX0pLG4ubm9kZS50eXBlPT09akd0Lk9QJiYobz1uLm5vZGUuY29tcGF0aWJsZT8xOjApfXJldHVybiBpJiYobi5kZXZpY2VDb2xvcnM9dGhpcy5jb2xvckhpc3RvZ3JhbShpLHRoaXMuZGV2aWNlQ29sb3JNYXApKSxyJiYobi54bGFDbHVzdGVyQ29sb3JzPXRoaXMuY29sb3JIaXN0b2dyYW0ocix0aGlzLnhsYUNsdXN0ZXJDb2xvck1hcCkpLG51bGwhPW8mJihuLmNvbXBhdGliaWxpdHlDb2xvcnM9W3tjb2xvcjpoV3QscHJvcG9ydGlvbjpvfSx7Y29sb3I6ZFd0LHByb3BvcnRpb246MS1vfV0pLHRoaXMuaW5kZXhbdF19Z2V0TmVhcmVzdFZpc2libGVBbmNlc3Rvcih0KXtsZXQgZT1jV3QodCksbj0wLGk9bnVsbCxyPXQ7Zm9yKDtuPGUubGVuZ3RoJiYocj1lW25dLGk9dGhpcy5nZXRSZW5kZXJOb2RlQnlOYW1lKHIpLGkuZXhwYW5kZWQpO24rKyk7aWYobj09ZS5sZW5ndGgtMil7bGV0IHQ9ZVtuKzFdO2lmKGkuaW5Bbm5vdGF0aW9ucy5ub2RlTmFtZXNbdF0pcmV0dXJuIHQ7aWYoaS5vdXRBbm5vdGF0aW9ucy5ub2RlTmFtZXNbdF0pcmV0dXJuIHR9cmV0dXJuIHJ9c2V0RGVwdGgodCl7Q1d0KHRoaXMucm9vdCwrdCl9aXNOb2RlQXV4aWxpYXJ5KHQpe2xldCBlPXRoaXMuZ2V0UmVuZGVyTm9kZUJ5TmFtZSh0Lm5vZGUucGFyZW50Tm9kZS5uYW1lKSxuPVNlLmV4cG9ydHMuZmluZChlLmlzb2xhdGVkSW5FeHRyYWN0LChlPT5lLm5vZGUubmFtZT09PXQubm9kZS5uYW1lKSk7cmV0dXJuISFufHwobj1TZS5leHBvcnRzLmZpbmQoZS5pc29sYXRlZE91dEV4dHJhY3QsKGU9PmUubm9kZS5uYW1lPT09dC5ub2RlLm5hbWUpKSwhIW4pfWdldE5hbWVzT2ZSZW5kZXJlZE9wcygpe3JldHVybiB0aGlzLnJlbmRlcmVkT3BOYW1lc31jbG9uZUFuZEFkZEZ1bmN0aW9uT3BOb2RlKHQsZSxuLGkpe2NvbnN0IHI9bi5uYW1lLnJlcGxhY2UoZSxpKTtsZXQgbz10Lm1ldGFncmFwaC5ub2RlKHIpO2lmKG8pcmV0dXJuIG87bz1uZXcgWEd0KHtuYW1lOnIsaW5wdXQ6W10sZGV2aWNlOm4uZGV2aWNlLG9wOm4ub3AsYXR0cjpTZS5leHBvcnRzLmNsb25lRGVlcChuLmF0dHIpfSksby5jYXJkaW5hbGl0eT1uLmNhcmRpbmFsaXR5LG8uaW5jbHVkZT1uLmluY2x1ZGUsby5vdXRwdXRTaGFwZXM9U2UuZXhwb3J0cy5jbG9uZURlZXAobi5vdXRwdXRTaGFwZXMpLG8ueGxhQ2x1c3Rlcj1uLnhsYUNsdXN0ZXIsby5mdW5jdGlvbklucHV0SW5kZXg9bi5mdW5jdGlvbklucHV0SW5kZXgsby5mdW5jdGlvbk91dHB1dEluZGV4PW4uZnVuY3Rpb25PdXRwdXRJbmRleCxvLmlucHV0cz1uLmlucHV0cy5tYXAoKHQ9Pntjb25zdCBuPVNlLmV4cG9ydHMuY2xvbmUodCk7cmV0dXJuIG4ubmFtZT10Lm5hbWUucmVwbGFjZShlLGkpLG59KSksby5wYXJlbnROb2RlPXQsdC5tZXRhZ3JhcGguc2V0Tm9kZShvLm5hbWUsbyksdGhpcy5oaWVyYXJjaHkuc2V0Tm9kZShvLm5hbWUsbyk7Y29uc3QgYT1uPT50aGlzLmNsb25lQW5kQWRkRnVuY3Rpb25PcE5vZGUodCxlLG4saSk7cmV0dXJuIG8uaW5FbWJlZGRpbmdzPW4uaW5FbWJlZGRpbmdzLm1hcChhKSxvLm91dEVtYmVkZGluZ3M9bi5vdXRFbWJlZGRpbmdzLm1hcChhKSxvfWNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGUodCxlLG4saSxyKXtjb25zdCBvPXt9LGE9dGhpcy5jbG9uZUZ1bmN0aW9uTGlicmFyeU1ldGFub2RlSGVscGVyKHQsZSxuLGkscixvKTtyZXR1cm4gU2UuZXhwb3J0cy5pc0VtcHR5KG8pfHx0aGlzLnBhdGNoRWRnZXNGcm9tRnVuY3Rpb25PdXRwdXRzKGUsbyksYX1jbG9uZUZ1bmN0aW9uTGlicmFyeU1ldGFub2RlSGVscGVyKHQsZSxuLGkscixvKXtjb25zdCBhPSRHdChuLm5hbWUucmVwbGFjZShpLHIpKTtyZXR1cm4gYS5kZXB0aD1uLmRlcHRoLGEuY2FyZGluYWxpdHk9bi5jYXJkaW5hbGl0eSxhLnRlbXBsYXRlSWQ9bi50ZW1wbGF0ZUlkLGEub3BIaXN0b2dyYW09U2UuZXhwb3J0cy5jbG9uZShuLm9wSGlzdG9ncmFtKSxhLmRldmljZUhpc3RvZ3JhbT1TZS5leHBvcnRzLmNsb25lKG4uZGV2aWNlSGlzdG9ncmFtKSxhLnhsYUNsdXN0ZXJIaXN0b2dyYW09U2UuZXhwb3J0cy5jbG9uZShuLnhsYUNsdXN0ZXJIaXN0b2dyYW0pLGEuaGFzTm9uQ29udHJvbEVkZ2VzPW4uaGFzTm9uQ29udHJvbEVkZ2VzLGEuaW5jbHVkZT1uLmluY2x1ZGUsYS5ub2RlQXR0cmlidXRlcz1TZS5leHBvcnRzLmNsb25lKG4ubm9kZUF0dHJpYnV0ZXMpLGEuYXNzb2NpYXRlZEZ1bmN0aW9uPW4uYXNzb2NpYXRlZEZ1bmN0aW9uLFNlLmV4cG9ydHMuZWFjaChuLm1ldGFncmFwaC5ub2RlcygpLChzPT57Y29uc3QgbD1uLm1ldGFncmFwaC5ub2RlKHMpO3N3aXRjaChsLnR5cGUpe2Nhc2Ugakd0Lk1FVEE6Y29uc3Qgbj10aGlzLmNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGVIZWxwZXIodCxlLGwsaSxyLG8pO24ucGFyZW50Tm9kZT1hLGEubWV0YWdyYXBoLnNldE5vZGUobi5uYW1lLG4pLHRoaXMuaGllcmFyY2h5LnNldE5vZGUobi5uYW1lLG4pO2JyZWFrO2Nhc2Ugakd0Lk9QOmNvbnN0IHM9dGhpcy5jbG9uZUFuZEFkZEZ1bmN0aW9uT3BOb2RlKGEsaSxsLHIpO1NlLmV4cG9ydHMuaXNOdW1iZXIocy5mdW5jdGlvbklucHV0SW5kZXgpJiZ0aGlzLnBhdGNoRWRnZXNJbnRvRnVuY3Rpb25JbnB1dHMoZSxzKSxTZS5leHBvcnRzLmlzTnVtYmVyKHMuZnVuY3Rpb25PdXRwdXRJbmRleCkmJihvW3MuZnVuY3Rpb25PdXRwdXRJbmRleF09cyk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4obC5uYW1lKyIgaXMgb2RkbHkgbmVpdGhlciBhIG1ldGFub2RlIG5vciBhbiBvcG5vZGUuIil9fSkpLHRoaXMuY2xvbmVMaWJyYXJ5TWV0YW5vZGVFZGdlcyhuLGEsaSxyKSxhfWNsb25lTGlicmFyeU1ldGFub2RlRWRnZXModCxlLG4saSl7U2UuZXhwb3J0cy5lYWNoKHQubWV0YWdyYXBoLmVkZ2VzKCksKHI9Pntjb25zdCBvPXQubWV0YWdyYXBoLmVkZ2UociksYT1vLnYucmVwbGFjZShuLGkpLHM9by53LnJlcGxhY2UobixpKSxsPW5ldyBKR3QoYSxzKTtsLmluYm91bmQ9by5pbmJvdW5kLGwubnVtUmVndWxhckVkZ2VzPW8ubnVtUmVndWxhckVkZ2VzLGwubnVtQ29udHJvbEVkZ2VzPW8ubnVtQ29udHJvbEVkZ2VzLGwubnVtUmVmRWRnZXM9by5udW1SZWZFZGdlcyxsLnRvdGFsU2l6ZT1vLnRvdGFsU2l6ZSxvLmJhc2VFZGdlTGlzdCYmKGwuYmFzZUVkZ2VMaXN0PW8uYmFzZUVkZ2VMaXN0Lm1hcCgodD0+e2NvbnN0IGU9U2UuZXhwb3J0cy5jbG9uZSh0KTtyZXR1cm4gZS52PXQudi5yZXBsYWNlKG4saSksZS53PXQudy5yZXBsYWNlKG4saSksZX0pKSksZS5tZXRhZ3JhcGgubm9kZShzKT9lLm1ldGFncmFwaC5zZXRFZGdlKGEscyxsKTplLm1ldGFncmFwaC5zZXRFZGdlKHMsYSxsKX0pKX1wYXRjaEVkZ2VzSW50b0Z1bmN0aW9uSW5wdXRzKHQsZSl7bGV0IG49TWF0aC5taW4oZS5mdW5jdGlvbklucHV0SW5kZXgsdC5pbnB1dHMubGVuZ3RoLTEpLGk9U2UuZXhwb3J0cy5jbG9uZSh0LmlucHV0c1tuXSk7Zm9yKDtpLmlzQ29udHJvbERlcGVuZGVuY3k7KW4rKyxpPXQuaW5wdXRzW25dO2UuaW5wdXRzLnB1c2goaSk7Y29uc3Qgcj10aGlzLmhpZXJhcmNoeS5nZXRQcmVkZWNlc3NvcnModC5uYW1lKTtsZXQgbyxhPTA7U2UuZXhwb3J0cy5lYWNoKHIucmVndWxhciwodD0+e2lmKGErPXQubnVtUmVndWxhckVkZ2VzLGE+bilyZXR1cm4gbz10LCExfSkpLFNlLmV4cG9ydHMuZWFjaChvLmJhc2VFZGdlTGlzdCwobj0+e24udz09PXQubmFtZSYmKG4udz1lLm5hbWUpLG4udj09PXQubmFtZSYmKG4udj1lLm5hbWUpfSkpfXBhdGNoRWRnZXNGcm9tRnVuY3Rpb25PdXRwdXRzKHQsZSl7Y29uc3Qgbj10aGlzLmhpZXJhcmNoeS5nZXRTdWNjZXNzb3JzKHQubmFtZSk7U2UuZXhwb3J0cy5lYWNoKG4ucmVndWxhciwobj0+e1NlLmV4cG9ydHMuZWFjaChuLmJhc2VFZGdlTGlzdCwobj0+e2NvbnN0IGk9dGhpcy5oaWVyYXJjaHkubm9kZShuLncpO1NlLmV4cG9ydHMuZWFjaChpLmlucHV0cywoaT0+e2kubmFtZT09PXQubmFtZSYmKGkubmFtZT1lW2kub3V0cHV0VGVuc29yS2V5XS5uYW1lLGkub3V0cHV0VGVuc29yS2V5PW4ub3V0cHV0VGVuc29yS2V5KX0pKX0pKSxTZS5leHBvcnRzLmVhY2gobi5iYXNlRWRnZUxpc3QsKHQ9Pnt0LnY9ZVt0Lm91dHB1dFRlbnNvcktleV0ubmFtZSx0Lm91dHB1dFRlbnNvcktleT0iMCJ9KSl9KSl9YnVpbGRTdWJoaWVyYXJjaHkodCl7aWYodCBpbiB0aGlzLmhhc1N1YmhpZXJhcmNoeSlyZXR1cm47dGhpcy5oYXNTdWJoaWVyYXJjaHlbdF09ITA7bGV0IGU9dGhpcy5pbmRleFt0XTtpZihlLm5vZGUudHlwZSE9PWpHdC5NRVRBJiZlLm5vZGUudHlwZSE9PWpHdC5TRVJJRVMpcmV0dXJuO2xldCBuPWUsaT1uLm5vZGUubWV0YWdyYXBoLHI9bi5jb3JlR3JhcGg7Y29uc3Qgbz1bXSxhPVtdO1NlLmV4cG9ydHMuaXNFbXB0eSh0aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zKXx8KFNlLmV4cG9ydHMuZWFjaChpLm5vZGVzKCksKHQ9Pntjb25zdCBlPWkubm9kZSh0KSxuPXRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnNbZS5vcF07aWYoIW4pcmV0dXJuO2lmKDA9PT10LmluZGV4T2YoVkd0KSlyZXR1cm47Y29uc3Qgcj10aGlzLmNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGUoaSxlLG4ubm9kZSxuLm5vZGUubmFtZSxlLm5hbWUpO28ucHVzaChlKSxhLnB1c2gocil9KSksU2UuZXhwb3J0cy5lYWNoKGEsKCh0LGUpPT57Y29uc3Qgbj1vW2VdO3QucGFyZW50Tm9kZT1uLnBhcmVudE5vZGUsaS5zZXROb2RlKG4ubmFtZSx0KSx0aGlzLmhpZXJhcmNoeS5zZXROb2RlKG4ubmFtZSx0KX0pKSksU2UuZXhwb3J0cy5lYWNoKGkubm9kZXMoKSwodD0+e2xldCBlPXRoaXMuZ2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKHQpLG49ZS5ub2RlO3Iuc2V0Tm9kZSh0LGUpLG4uaXNHcm91cE5vZGV8fChTZS5leHBvcnRzLmVhY2gobi5pbkVtYmVkZGluZ3MsKHQ9PntsZXQgbj1uZXcgU1d0KG51bGwpLGk9bmV3IHdXdCh0KTtNV3QoZSx0LGksbixiV3QuQ09OU1RBTlQpLHRoaXMuaW5kZXhbdC5uYW1lXT1pfSkpLFNlLmV4cG9ydHMuZWFjaChuLm91dEVtYmVkZGluZ3MsKHQ9PntsZXQgbj1uZXcgU1d0KG51bGwpLGk9bmV3IHdXdCh0KTtFV3QoZSx0LGksbixiV3QuU1VNTUFSWSksdGhpcy5pbmRleFt0Lm5hbWVdPWl9KSkpfSkpLFNlLmV4cG9ydHMuZWFjaChpLmVkZ2VzKCksKHQ9PntsZXQgZT1pLmVkZ2UodCksbj1uZXcgU1d0KGUpO24uaXNGYWRlZE91dD10aGlzLmluZGV4W3Qudl0uaXNGYWRlZE91dHx8dGhpcy5pbmRleFt0LnddLmlzRmFkZWRPdXQsci5zZXRFZGdlKHQudix0Lncsbil9KSksbi5ub2RlLnR5cGU9PT1qR3QuTUVUQSYmKGZ1bmN0aW9uIHModCxlKXsoZnVuY3Rpb24gbih0KXtsZXQgZT10LmNvcmVHcmFwaDtTZS5leHBvcnRzLmVhY2goZS5ub2RlcygpLChuPT57ZS5ub2RlKG4pLm5vZGUuaW5jbHVkZSE9PUdHdC5FWENMVURFfHxuLnN0YXJ0c1dpdGgoVkd0KXx8KHQuY29yZUdyYXBoLm91dEVkZ2VzKG4pLmxlbmd0aD50LmNvcmVHcmFwaC5pbkVkZ2VzKG4pLmxlbmd0aD9rV3QodCxuKTpMV3QodCxuKSl9KSl9KSh0KSxmV3QubGVuZ3RoJiYoZnVuY3Rpb24gaSh0KXtsZXQgZT10LmNvcmVHcmFwaDtTZS5leHBvcnRzLmVhY2goZS5ub2RlcygpLChuPT57bGV0IGk9ZS5ub2RlKG4pO2kubm9kZS5pbmNsdWRlPT09R0d0LlVOU1BFQ0lGSUVEJiZQV3QoaS5ub2RlLGZXdCkmJmtXdCh0LG4pfSkpfSkodCksbVd0Lmxlbmd0aCYmKGZ1bmN0aW9uIHIodCl7bGV0IGU9dC5jb3JlR3JhcGg7U2UuZXhwb3J0cy5lYWNoKGUubm9kZXMoKSwobj0+e2xldCBpPWUubm9kZShuKTtpLm5vZGUuaW5jbHVkZT09PUdHdC5VTlNQRUNJRklFRCYmUFd0KGkubm9kZSxtV3QpJiZMV3QodCxuKX0pKX0pKHQpLGUmJihmdW5jdGlvbiBvKHQpe2xldCBlPXQuY29yZUdyYXBoLG49e30saT17fSxyPTA7aWYoU2UuZXhwb3J0cy5lYWNoKGUubm9kZXMoKSwodD0+e2lmKGUubm9kZSh0KS5ub2RlLmluY2x1ZGUhPT1HR3QuVU5TUEVDSUZJRUQpcmV0dXJuO2xldCBvPVNlLmV4cG9ydHMucmVkdWNlKGUucHJlZGVjZXNzb3JzKHQpLCgobixpKT0+bisoZS5lZGdlKGksdCkubWV0YWVkZ2UubnVtUmVndWxhckVkZ2VzPzE6MCkpLDApOzA9PT1vJiZlLnByZWRlY2Vzc29ycyh0KS5sZW5ndGg+MCYmKG89ZS5wcmVkZWNlc3NvcnModCkubGVuZ3RoKTtsZXQgYT1TZS5leHBvcnRzLnJlZHVjZShlLnN1Y2Nlc3NvcnModCksKChuLGkpPT5uKyhlLmVkZ2UodCxpKS5tZXRhZWRnZS5udW1SZWd1bGFyRWRnZXM/MTowKSksMCk7MD09PWEmJmUuc3VjY2Vzc29ycyh0KS5sZW5ndGg+MCYmKGE9ZS5zdWNjZXNzb3JzKHQpLmxlbmd0aCksblt0XT1vLGlbdF09YSxyKyt9KSkscjwxNSlyZXR1cm47bGV0IG89TWF0aC5yb3VuZCguNzUqciksYT1NYXRoLnJvdW5kKC4yNSpyKSxzPU9iamVjdC5rZXlzKG4pLnNvcnQoKCh0LGUpPT5uW3RdLW5bZV0pKSxsPW5bc1tvXV0sYz1sK2wtbltzW2FdXTtjPU1hdGgubWF4KGMsNCk7Zm9yKGxldCBlPXItMTtuW3NbZV1dPmM7ZS0tKUxXdCh0LHNbZV0pO2xldCB1PU9iamVjdC5rZXlzKGkpLnNvcnQoKCh0LGUpPT5pW3RdLWlbZV0pKSxoPWlbdVtvXV0sZD1oKzQqKGgtaVt1W2FdXSk7ZD1NYXRoLm1heChkLDQpO2ZvcihsZXQgbj1yLTE7aVt1W25dXT5kO24tLSl7bGV0IGk9ZS5ub2RlKHVbbl0pO2kmJiFpLmlzSW5FeHRyYWN0JiZrV3QodCx1W25dKX19KSh0KSwoZnVuY3Rpb24gYSh0KXtsZXQgZT10LmNvcmVHcmFwaCxuPXt9O1NlLmV4cG9ydHMuZWFjaChlLmVkZ2VzKCksKHQ9PntlLmVkZ2UodCkubWV0YWVkZ2UubnVtUmVndWxhckVkZ2VzfHwoKG5bdC52XT1uW3Qudl18fFtdKS5wdXNoKHQpLChuW3Qud109blt0LnddfHxbXSkucHVzaCh0KSl9KSksU2UuZXhwb3J0cy5lYWNoKG4sKCh0LG4pPT57dC5sZW5ndGg+NCYmU2UuZXhwb3J0cy5lYWNoKHQsKHQ9PkFXdChlLHQudix0LncpKSl9KSl9KSh0KTtsZXQgcz10LmNvcmVHcmFwaDtTZS5leHBvcnRzLmVhY2gocy5ub2RlcygpLChlPT57bGV0IG49cy5ub2RlKGUpLGk9cy5uZWlnaGJvcnMoZSkubGVuZ3RoO2lmKG4ubm9kZS5pbmNsdWRlPT09R0d0LlVOU1BFQ0lGSUVEJiYwPT09aSl7bGV0IGk9bi5vdXRBbm5vdGF0aW9ucy5saXN0Lmxlbmd0aD4wLHI9bi5pbkFubm90YXRpb25zLmxpc3QubGVuZ3RoPjA7bi5pc0luRXh0cmFjdD8odC5pc29sYXRlZEluRXh0cmFjdC5wdXNoKG4pLG4ubm9kZS5pbmNsdWRlPUdHdC5FWENMVURFLHMucmVtb3ZlTm9kZShlKSk6bi5pc091dEV4dHJhY3Q/KHQuaXNvbGF0ZWRPdXRFeHRyYWN0LnB1c2gobiksbi5ub2RlLmluY2x1ZGU9R0d0LkVYQ0xVREUscy5yZW1vdmVOb2RlKGUpKTppJiYhcj8obi5pc0luRXh0cmFjdD0hMCx0Lmlzb2xhdGVkSW5FeHRyYWN0LnB1c2gobiksbi5ub2RlLmluY2x1ZGU9R0d0LkVYQ0xVREUscy5yZW1vdmVOb2RlKGUpKTpyJiYhaSYmKG4uaXNPdXRFeHRyYWN0PSEwLHQuaXNvbGF0ZWRPdXRFeHRyYWN0LnB1c2gobiksbi5ub2RlLmluY2x1ZGU9R0d0LkVYQ0xVREUscy5yZW1vdmVOb2RlKGUpKX19KSl9KShuLHRoaXMuYXV0b0V4dHJhY3ROb2RlcyksU2UuZXhwb3J0cy5pc0VtcHR5KHRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnMpfHx0aGlzLmJ1aWxkU3ViaGllcmFyY2hpZXNGb3JOZWVkZWRGdW5jdGlvbnMoaSksdD09PUZHdCYmU2UuZXhwb3J0cy5mb3JPd24odGhpcy5oaWVyYXJjaHkubGlicmFyeUZ1bmN0aW9ucywoKHQsZSk9Pntjb25zdCBpPXQubm9kZSxvPXRoaXMuZ2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKGkubmFtZSk7bi5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5wdXNoKG8pLG8ubm9kZS5pbmNsdWRlPUdHdC5FWENMVURFLHIucmVtb3ZlTm9kZShpLm5hbWUpfSkpO2xldCBsPW4ubm9kZS5wYXJlbnROb2RlO2lmKCFsKXJldHVybjtsZXQgYz10aGlzLmluZGV4W2wubmFtZV0sdT0odCwuLi5lKT0+ZS5jb25jYXQoW3Q/IklOIjoiT1VUIl0pLmpvaW4oIn5+IiksaD10aGlzLmhpZXJhcmNoeS5nZXRCcmlkZ2VncmFwaCh0KSxkPXtpbjp7fSxvdXQ6e30sY29udHJvbDp7fX07U2UuZXhwb3J0cy5lYWNoKGguZWRnZXMoKSwodD0+e2xldCBlPSEhaS5ub2RlKHQudyksbj1lP3Qudjp0Lnc7aC5lZGdlKHQpLm51bVJlZ3VsYXJFZGdlcz9lP2Qub3V0W25dPShkLm91dFtuXXx8MCkrMTpkLmluW25dPShkLmluW25dfHwwKSsxOmQuY29udHJvbFtuXT0oZC5jb250cm9sW25dfHwwKSsxfSkpO2xldCBwPXRoaXMuaGllcmFyY2h5LmdldE5vZGVNYXAoKTtTZS5leHBvcnRzLmVhY2goaC5lZGdlcygpLChuPT57bGV0IG89aC5lZGdlKG4pLGE9ISFpLm5vZGUobi53KSxbcyxmXT1hP1tuLncsbi52XTpbbi52LG4ud10sbT10aGlzLmluZGV4W3NdLGc9dGhpcy5pbmRleFtmXSxfPWc/Zy5ub2RlOnBbZl0seT0hby5udW1SZWd1bGFyRWRnZXMmJmQuY29udHJvbFtmXT40LFssdl09YT9bZS5pbkFubm90YXRpb25zLG0uaW5Bbm5vdGF0aW9uc106W2Uub3V0QW5ub3RhdGlvbnMsbS5vdXRBbm5vdGF0aW9uc10sYj1udWxsLHg9ITE7aWYoISgoYT9kLm91dDpkLmluKVtmXT40KSYmIXkmJm0uaXNJbkNvcmUoKSl7bGV0IGU9ZT0+Yy5jb3JlR3JhcGguZWRnZShhP3t2OmUsdzp0fTp7djp0LHc6ZX0pO2I9ZShmKSxifHwoYj1lKHUoYSxmLGwubmFtZSkpKSx4PSEhYn1sZXQgdz0hMTtpZihiJiYhby5udW1SZWd1bGFyRWRnZXMpe2xldCB0PWIsZT1jLm5vZGU7Zm9yKDt0LmFkam9pbmluZ01ldGFlZGdlOyl0PXQuYWRqb2luaW5nTWV0YWVkZ2UsZT1lLnBhcmVudE5vZGU7bGV0IG49dGhpcy5oaWVyYXJjaHkuZ2V0VG9wb2xvZ2ljYWxPcmRlcmluZyhlLm5hbWUpLGk9dC5tZXRhZWRnZTt3PW5baS52XT5uW2kud119aWYoeD14JiYhdywheClyZXR1cm4gdm9pZCB2LnB1c2gobmV3IHZXdChfLGcsbmV3IFNXdChvKSxiV3QuU0hPUlRDVVQsYSkpO2xldCBTPXUoYSx0KSxNPXUoYSxmLHQpLEU9ci5ub2RlKE0pO2lmKCFFKXtsZXQgdD1yLm5vZGUoUyk7dHx8KHQ9bmV3IHdXdCh7bmFtZTpTLHR5cGU6akd0LkJSSURHRSxpc0dyb3VwTm9kZTohMSxjYXJkaW5hbGl0eTowLHBhcmVudE5vZGU6bnVsbCxzdGF0czpudWxsLGluY2x1ZGU6R0d0LlVOU1BFQ0lGSUVELGluYm91bmQ6YSxub2RlQXR0cmlidXRlczp7fX0pLHRoaXMuaW5kZXhbU109dCxyLnNldE5vZGUoUyx0KSksRT1uZXcgd1d0KHtuYW1lOk0sdHlwZTpqR3QuQlJJREdFLGlzR3JvdXBOb2RlOiExLGNhcmRpbmFsaXR5OjEscGFyZW50Tm9kZTpudWxsLHN0YXRzOm51bGwsaW5jbHVkZTpHR3QuVU5TUEVDSUZJRUQsaW5ib3VuZDphLG5vZGVBdHRyaWJ1dGVzOnt9fSksdGhpcy5pbmRleFtNXT1FLHIuc2V0Tm9kZShNLEUpLHIuc2V0UGFyZW50KE0sUyksdC5ub2RlLmNhcmRpbmFsaXR5Kyt9bGV0IFQ9bmV3IFNXdChvKTtULmFkam9pbmluZ01ldGFlZGdlPWIsYT9yLnNldEVkZ2UoTSxzLFQpOnIuc2V0RWRnZShzLE0sVCl9KSksU2UuZXhwb3J0cy5lYWNoKFshMCwhMV0sKGU9PntsZXQgbj11KGUsdCksaT1yLm5vZGUobik7aSYmU2UuZXhwb3J0cy5lYWNoKHIubm9kZXMoKSwobz0+e2lmKHIubm9kZShvKS5ub2RlLnR5cGU9PT1qR3QuQlJJREdFKXJldHVybjtpZighKGU/IXIucHJlZGVjZXNzb3JzKG8pLmxlbmd0aDohci5zdWNjZXNzb3JzKG8pLmxlbmd0aCkpcmV0dXJuO2xldCBhPXUoZSx0LCJTVFJVQ1RVUkFMX1RBUkdFVCIpLHM9ci5ub2RlKGEpO3N8fChzPW5ldyB3V3Qoe25hbWU6YSx0eXBlOmpHdC5CUklER0UsaXNHcm91cE5vZGU6ITEsY2FyZGluYWxpdHk6MSxwYXJlbnROb2RlOm51bGwsc3RhdHM6bnVsbCxpbmNsdWRlOkdHdC5VTlNQRUNJRklFRCxpbmJvdW5kOmUsbm9kZUF0dHJpYnV0ZXM6e319KSxzLnN0cnVjdHVyYWw9ITAsdGhpcy5pbmRleFthXT1zLHIuc2V0Tm9kZShhLHMpLGkubm9kZS5jYXJkaW5hbGl0eSsrLHIuc2V0UGFyZW50KGEsbikpO2xldCBsPW5ldyBTV3QobnVsbCk7bC5zdHJ1Y3R1cmFsPSEwLGwud2VpZ2h0LS0sZT9yLnNldEVkZ2UoYSxvLGwpOnIuc2V0RWRnZShvLGEsbCl9KSl9KSl9YnVpbGRTdWJoaWVyYXJjaGllc0Zvck5lZWRlZEZ1bmN0aW9ucyh0KXtTZS5leHBvcnRzLmVhY2godC5lZGdlcygpLChlPT57bGV0IG49dC5lZGdlKGUpLGk9bmV3IFNXdChuKTtTZS5leHBvcnRzLmZvckVhY2goaS5tZXRhZWRnZS5iYXNlRWRnZUxpc3QsKHQ9Pntjb25zdCBlPXQudi5zcGxpdChIR3QpO2ZvcihsZXQgdD1lLmxlbmd0aDt0Pj0wO3QtLSl7Y29uc3Qgbj1lLnNsaWNlKDAsdCksaT10aGlzLmhpZXJhcmNoeS5ub2RlKG4uam9pbihIR3QpKTtpZihpKXtpZihpLnR5cGU9PT1qR3QuT1AmJnRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnNbaS5vcF0pZm9yKGxldCB0PTE7dDxuLmxlbmd0aDt0Kyspe2NvbnN0IGU9bi5zbGljZSgwLHQpLmpvaW4oSEd0KTtlJiZ0aGlzLmJ1aWxkU3ViaGllcmFyY2h5KGUpfWJyZWFrfX19KSl9KSl9fWNsYXNzIHZXdHtjb25zdHJ1Y3Rvcih0LGUsbixpLHIpe3RoaXMubm9kZT10LHRoaXMucmVuZGVyTm9kZUluZm89ZSx0aGlzLnJlbmRlck1ldGFlZGdlSW5mbz1uLHRoaXMuYW5ub3RhdGlvblR5cGU9aSx0aGlzLmR4PTAsdGhpcy5keT0wLHRoaXMud2lkdGg9MCx0aGlzLmhlaWdodD0wLG4mJm4ubWV0YWVkZ2UmJih0aGlzLnY9bi5tZXRhZWRnZS52LHRoaXMudz1uLm1ldGFlZGdlLncpLHRoaXMuaXNJbj1yLHRoaXMucG9pbnRzPVtdfX12YXIgYld0OyEoZnVuY3Rpb24odCl7dFt0LlNIT1JUQ1VUPTBdPSJTSE9SVENVVCIsdFt0LkNPTlNUQU5UPTFdPSJDT05TVEFOVCIsdFt0LlNVTU1BUlk9Ml09IlNVTU1BUlkiLHRbdC5FTExJUFNJUz0zXT0iRUxMSVBTSVMifSkoYld0fHwoYld0PXt9KSk7Y2xhc3MgeFd0e2NvbnN0cnVjdG9yKCl7dGhpcy5saXN0PVtdLHRoaXMubm9kZU5hbWVzPXt9fXB1c2godCl7aWYodC5ub2RlLm5hbWUgaW4gdGhpcy5ub2RlTmFtZXMpcmV0dXJuO2lmKHRoaXMubm9kZU5hbWVzW3Qubm9kZS5uYW1lXT0hMCx0aGlzLmxpc3QubGVuZ3RoPDUpcmV0dXJuIHZvaWQgdGhpcy5saXN0LnB1c2godCk7bGV0IGU9dGhpcy5saXN0W3RoaXMubGlzdC5sZW5ndGgtMV07aWYoZS5hbm5vdGF0aW9uVHlwZT09PWJXdC5FTExJUFNJUyl7bGV0IHQ9ZS5ub2RlO3JldHVybiB2b2lkIHQuc2V0TnVtTW9yZU5vZGVzKCsrdC5udW1Nb3JlTm9kZXMpfWxldCBuPW5ldyBZR3QoMSk7dGhpcy5saXN0LnB1c2gobmV3IHZXdChuLG5ldyB3V3QobiksbnVsbCxiV3QuRUxMSVBTSVMsdC5pc0luKSl9fWNsYXNzIHdXdHtjb25zdHJ1Y3Rvcih0KXtpZih0aGlzLm5vZGU9dCx0aGlzLmV4cGFuZGVkPSExLHRoaXMuaW5Bbm5vdGF0aW9ucz1uZXcgeFd0LHRoaXMub3V0QW5ub3RhdGlvbnM9bmV3IHhXdCx0aGlzLng9MCx0aGlzLnk9MCx0aGlzLndpZHRoPTAsdGhpcy5oZWlnaHQ9MCx0aGlzLmluYm94V2lkdGg9MCx0aGlzLm91dGJveFdpZHRoPTAsdGhpcy5leGNsdWRlZD0hMSx0aGlzLnN0cnVjdHVyYWw9ITEsdGhpcy5sYWJlbE9mZnNldD0wLHRoaXMucmFkaXVzPTAsdGhpcy5sYWJlbEhlaWdodD0wLHRoaXMucGFkZGluZ1RvcD0wLHRoaXMucGFkZGluZ0xlZnQ9MCx0aGlzLnBhZGRpbmdSaWdodD0wLHRoaXMucGFkZGluZ0JvdHRvbT0wLHRoaXMuaXNJbkV4dHJhY3Q9ITEsdGhpcy5pc091dEV4dHJhY3Q9ITEsdGhpcy5jb3JlQm94PXt3aWR0aDowLGhlaWdodDowfSx0aGlzLmlzRmFkZWRPdXQ9ITEsdGhpcy5kaXNwbGF5TmFtZT10Lm5hbWUuc3Vic3RyaW5nKHQubmFtZS5sYXN0SW5kZXhPZihIR3QpKzEpLHQudHlwZT09PWpHdC5NRVRBJiZ0LmFzc29jaWF0ZWRGdW5jdGlvbil7Y29uc3QgdD10aGlzLmRpc3BsYXlOYW1lLm1hdGNoKF9XdCk7dD90aGlzLmRpc3BsYXlOYW1lPXRbMV06U2UuZXhwb3J0cy5zdGFydHNXaXRoKHRoaXMuZGlzcGxheU5hbWUsVkd0KSYmKHRoaXMuZGlzcGxheU5hbWU9dGhpcy5kaXNwbGF5TmFtZS5zdWJzdHJpbmcoVkd0Lmxlbmd0aCkpfX1pc0luQ29yZSgpe3JldHVybiF0aGlzLmlzSW5FeHRyYWN0JiYhdGhpcy5pc091dEV4dHJhY3QmJiF0aGlzLmlzTGlicmFyeUZ1bmN0aW9ufX1jbGFzcyBTV3R7Y29uc3RydWN0b3IodCl7dGhpcy5tZXRhZWRnZT10LHRoaXMuYWRqb2luaW5nTWV0YWVkZ2U9bnVsbCx0aGlzLnN0cnVjdHVyYWw9ITEsdGhpcy53ZWlnaHQ9MSx0aGlzLmlzRmFkZWRPdXQ9ITF9fWZ1bmN0aW9uIE1XdCh0LGUsbixpLHIpe2xldCBvPW5ldyB2V3QoZSxuLGksciwhMCk7dC5pbkFubm90YXRpb25zLnB1c2gobyl9ZnVuY3Rpb24gRVd0KHQsZSxuLGkscil7bGV0IG89bmV3IHZXdChlLG4saSxyLCExKTt0Lm91dEFubm90YXRpb25zLnB1c2gobyl9Y2xhc3MgVFd0IGV4dGVuZHMgd1d0e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCk7bGV0IG49dC5tZXRhZ3JhcGguZ3JhcGgoKTt0aGlzLmNvcmVHcmFwaD1vV3Qobi5uYW1lLFVHdC5DT1JFLGUpLHRoaXMuaW5FeHRyYWN0Qm94PXt3aWR0aDowLGhlaWdodDowfSx0aGlzLm91dEV4dHJhY3RCb3g9e3dpZHRoOjAsaGVpZ2h0OjB9LHRoaXMubGlicmFyeUZ1bmN0aW9uc0JveD17d2lkdGg6MCxoZWlnaHQ6MH0sdGhpcy5pc29sYXRlZEluRXh0cmFjdD1bXSx0aGlzLmlzb2xhdGVkT3V0RXh0cmFjdD1bXSx0aGlzLmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0PVtdfX1mdW5jdGlvbiBDV3QodCxlKXt0LmNvcmVHcmFwaCYmKGZ1bmN0aW9uIG4odCxlKXtTZS5leHBvcnRzLmVhY2godC5ub2RlcygpLChuPT57bGV0IGk9dC5ub2RlKG4pO2lmKGkuZXhwYW5kZWQ9ZT4xLGU+MClzd2l0Y2goaS5ub2RlLnR5cGUpe2Nhc2Ugakd0Lk1FVEE6Y2FzZSBqR3QuU0VSSUVTOkNXdChpLGUtMSl9fSkpfSkodC5jb3JlR3JhcGgsZSl9ZnVuY3Rpb24gQVd0KHQsZSxuKXtsZXQgaT10Lm5vZGUoZSkscj10Lm5vZGUobiksbz10LmVkZ2UoZSxuKTsoaS5ub2RlLmluY2x1ZGUhPT1HR3QuSU5DTFVERSYmci5ub2RlLmluY2x1ZGUhPT1HR3QuSU5DTFVERXx8aS5ub2RlLmluY2x1ZGU9PT1HR3QuRVhDTFVERXx8ci5ub2RlLmluY2x1ZGU9PT1HR3QuRVhDTFVERSkmJihFV3QoaSxyLm5vZGUscixvLGJXdC5TSE9SVENVVCksTVd0KHIsaS5ub2RlLGksbyxiV3QuU0hPUlRDVVQpLHQucmVtb3ZlRWRnZShlLG4pKX1mdW5jdGlvbiBrV3QodCxlLG4pe2xldCBpPXQuY29yZUdyYXBoLHI9aS5ub2RlKGUpO3IuaXNPdXRFeHRyYWN0PSEwLFNlLmV4cG9ydHMuZWFjaChpLnByZWRlY2Vzc29ycyhlKSwoKHQsbik9PntBV3QoaSx0LGUpfSkpLFNlLmV4cG9ydHMuZWFjaChpLnN1Y2Nlc3NvcnMoZSksKCh0LG4pPT57QVd0KGksZSx0KX0pKSwwPT09aS5uZWlnaGJvcnMoZSkubGVuZ3RoJiYoci5ub2RlLmluY2x1ZGU9R0d0LkVYQ0xVREUsdC5pc29sYXRlZE91dEV4dHJhY3QucHVzaChyKSxpLnJlbW92ZU5vZGUoZSkpfWZ1bmN0aW9uIExXdCh0LGUsbil7bGV0IGk9dC5jb3JlR3JhcGgscj1pLm5vZGUoZSk7ci5pc0luRXh0cmFjdD0hMCxTZS5leHBvcnRzLmVhY2goaS5zdWNjZXNzb3JzKGUpLCgodCxuKT0+e0FXdChpLGUsdCl9KSksU2UuZXhwb3J0cy5lYWNoKGkucHJlZGVjZXNzb3JzKGUpLCgodCxuKT0+e0FXdChpLHQsZSl9KSksMD09PWkubmVpZ2hib3JzKGUpLmxlbmd0aCYmKHIubm9kZS5pbmNsdWRlPUdHdC5FWENMVURFLHQuaXNvbGF0ZWRJbkV4dHJhY3QucHVzaChyKSxpLnJlbW92ZU5vZGUoZSkpfWZ1bmN0aW9uIFBXdCh0LGUpe2lmKHQudHlwZT09PWpHdC5PUCl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspaWYodC5vcD09PWVbbl0pcmV0dXJuITB9ZWxzZSBpZih0LnR5cGU9PT1qR3QuTUVUQSl7bGV0IG49dC5nZXRSb290T3AoKTtpZihuKWZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWlmKG4ub3A9PT1lW3RdKXJldHVybiEwfXJldHVybiExfWNvbnN0IE5XdD17YW5pbWF0aW9uOntkdXJhdGlvbjoyNTB9LGdyYXBoOnttZXRhOntub2RlU2VwOjUscmFua1NlcDoyNSxlZGdlU2VwOjV9LHNlcmllczp7bm9kZVNlcDo1LHJhbmtTZXA6MjUsZWRnZVNlcDo1fSxwYWRkaW5nOntwYWRkaW5nVG9wOjQwLHBhZGRpbmdMZWZ0OjIwfX0sc3Vic2NlbmU6e21ldGE6e3BhZGRpbmdUb3A6MTAscGFkZGluZ0JvdHRvbToxMCxwYWRkaW5nTGVmdDoxMCxwYWRkaW5nUmlnaHQ6MTAsbGFiZWxIZWlnaHQ6MjAsZXh0cmFjdFhPZmZzZXQ6MTUsZXh0cmFjdFlPZmZzZXQ6MjB9LHNlcmllczp7cGFkZGluZ1RvcDoxMCxwYWRkaW5nQm90dG9tOjEwLHBhZGRpbmdMZWZ0OjEwLHBhZGRpbmdSaWdodDoxMCxsYWJlbEhlaWdodDoxMH19LG5vZGVTaXplOnttZXRhOntyYWRpdXM6NSx3aWR0aDo2MCxtYXhMYWJlbFdpZHRoOjUyLGhlaWdodDpWTSgpLmRvbWFpbihbMSwyMDBdKS5yYW5nZShbMTUsNjBdKS5jbGFtcCghMCksZXhwYW5kQnV0dG9uUmFkaXVzOjN9LG9wOnt3aWR0aDoxNSxoZWlnaHQ6NixyYWRpdXM6MyxsYWJlbE9mZnNldDotOCxtYXhMYWJlbFdpZHRoOjMwfSxzZXJpZXM6e2V4cGFuZGVkOntyYWRpdXM6MTAsbGFiZWxPZmZzZXQ6MH0sdmVydGljYWw6e3dpZHRoOjE2LGhlaWdodDoxMyxsYWJlbE9mZnNldDotMTN9LGhvcml6b250YWw6e3dpZHRoOjI0LGhlaWdodDo4LHJhZGl1czoxMCxsYWJlbE9mZnNldDotMTB9fSxicmlkZ2U6e3dpZHRoOjIwLGhlaWdodDoyMCxyYWRpdXM6MixsYWJlbE9mZnNldDowfX0sc2hvcnRjdXRTaXplOntvcDp7d2lkdGg6MTAsaGVpZ2h0OjR9LG1ldGE6e3dpZHRoOjEyLGhlaWdodDo0LHJhZGl1czoxfSxzZXJpZXM6e3dpZHRoOjE0LGhlaWdodDo0fX0sYW5ub3RhdGlvbnM6e2luYm94V2lkdGg6NTAsb3V0Ym94V2lkdGg6NTAseE9mZnNldDoxMCx5T2Zmc2V0OjMsbGFiZWxPZmZzZXQ6MixtYXhMYWJlbFdpZHRoOjQwfSxjb25zdGFudDp7c2l6ZTp7d2lkdGg6NCxoZWlnaHQ6NH19LHNlcmllczp7bWF4U3RhY2tDb3VudDozLHBhcmFsbGVsU3RhY2tPZmZzZXRSYXRpbzouMix0b3dlclN0YWNrT2Zmc2V0UmF0aW86LjV9LG1pbmltYXA6e3NpemU6MTUwfX0sSVd0PTE0MDtmdW5jdGlvbiBSV3QodCl7dC5ub2RlLmlzR3JvdXBOb2RlJiYoZnVuY3Rpb24gZSh0KXtsZXQgZT10LmNvcmVHcmFwaC5ub2RlcygpLm1hcCgoZT0+dC5jb3JlR3JhcGgubm9kZShlKSkpLmNvbmNhdCh0Lmlzb2xhdGVkSW5FeHRyYWN0LHQuaXNvbGF0ZWRPdXRFeHRyYWN0LHQubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QpO1NlLmV4cG9ydHMuZWFjaChlLCh0PT57c3dpdGNoKHQubm9kZS50eXBlKXtjYXNlIGpHdC5PUDpTZS5leHBvcnRzLmV4dGVuZCh0LE5XdC5ub2RlU2l6ZS5vcCk7YnJlYWs7Y2FzZSBqR3QuQlJJREdFOlNlLmV4cG9ydHMuZXh0ZW5kKHQsTld0Lm5vZGVTaXplLmJyaWRnZSk7YnJlYWs7Y2FzZSBqR3QuTUVUQTp0LmV4cGFuZGVkP1JXdCh0KTooU2UuZXhwb3J0cy5leHRlbmQodCxOV3Qubm9kZVNpemUubWV0YSksdC5oZWlnaHQ9Tld0Lm5vZGVTaXplLm1ldGEuaGVpZ2h0KHQubm9kZS5jYXJkaW5hbGl0eSkpO2JyZWFrO2Nhc2Ugakd0LlNFUklFUzp0LmV4cGFuZGVkPyhTZS5leHBvcnRzLmV4dGVuZCh0LE5XdC5ub2RlU2l6ZS5zZXJpZXMuZXhwYW5kZWQpLFJXdCh0KSk6U2UuZXhwb3J0cy5leHRlbmQodCx0Lm5vZGUuaGFzTm9uQ29udHJvbEVkZ2VzP05XdC5ub2RlU2l6ZS5zZXJpZXMudmVydGljYWw6Tld0Lm5vZGVTaXplLnNlcmllcy5ob3Jpem9udGFsKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJVbnJlY29nbml6ZWQgbm9kZSB0eXBlOiAiK3Qubm9kZS50eXBlKX10LmV4cGFuZGVkfHwoZnVuY3Rpb24gZSh0KXt0LmluYm94V2lkdGg9dC5pbkFubm90YXRpb25zLmxpc3QubGVuZ3RoPjA/Tld0LmFubm90YXRpb25zLmluYm94V2lkdGg6MCx0Lm91dGJveFdpZHRoPXQub3V0QW5ub3RhdGlvbnMubGlzdC5sZW5ndGg+MD9OV3QuYW5ub3RhdGlvbnMub3V0Ym94V2lkdGg6MCx0LmNvcmVCb3gud2lkdGg9dC53aWR0aCx0LmNvcmVCb3guaGVpZ2h0PXQuaGVpZ2h0LHQud2lkdGg9TWF0aC5tYXgodC5jb3JlQm94LndpZHRoK3QuaW5ib3hXaWR0aCt0Lm91dGJveFdpZHRoLDMqdC5kaXNwbGF5TmFtZS5sZW5ndGgpfSkodCksKGZ1bmN0aW9uIG4odCl7aWYodC5leHBhbmRlZClyZXR1cm47bGV0IGU9dC5pbkFubm90YXRpb25zLmxpc3Qsbj10Lm91dEFubm90YXRpb25zLmxpc3Q7U2UuZXhwb3J0cy5lYWNoKGUsKHQ9PnpXdCh0KSkpLFNlLmV4cG9ydHMuZWFjaChuLCh0PT56V3QodCkpKTtsZXQgaT1OV3QuYW5ub3RhdGlvbnMscj1TZS5leHBvcnRzLnJlZHVjZShlLCgoZSxuLHIpPT57bGV0IG89cj4wP2kueU9mZnNldDowO3JldHVybiBuLmR4PS0odC5jb3JlQm94LndpZHRoK24ud2lkdGgpLzItaS54T2Zmc2V0LG4uZHk9ZStvK24uaGVpZ2h0LzIsZStvK24uaGVpZ2h0fSksMCk7U2UuZXhwb3J0cy5lYWNoKGUsKHQ9Pnt0LmR5LT1yLzIsdC5sYWJlbE9mZnNldD1pLmxhYmVsT2Zmc2V0fSkpO2xldCBvPVNlLmV4cG9ydHMucmVkdWNlKG4sKChlLG4scik9PntsZXQgbz1yPjA/aS55T2Zmc2V0OjA7cmV0dXJuIG4uZHg9KHQuY29yZUJveC53aWR0aCtuLndpZHRoKS8yK2kueE9mZnNldCxuLmR5PWUrbytuLmhlaWdodC8yLGUrbytuLmhlaWdodH0pLDApO1NlLmV4cG9ydHMuZWFjaChuLCh0PT57dC5keS09by8yLHQubGFiZWxPZmZzZXQ9aS5sYWJlbE9mZnNldH0pKTtsZXQgYT1NYXRoLm1pbih0LmhlaWdodC8yLXQucmFkaXVzLHIvMik7YT1hPDA/MDphO2xldCBzPVZNKCkuZG9tYWluKFswLGUubGVuZ3RoLTFdKS5yYW5nZShbLWEsYV0pO1NlLmV4cG9ydHMuZWFjaChlLCgobixpKT0+e24ucG9pbnRzPVt7ZHg6bi5keCtuLndpZHRoLzIsZHk6bi5keX0se2R4Oi10LmNvcmVCb3gud2lkdGgvMixkeTplLmxlbmd0aD4xP3MoaSk6MH1dfSkpO2xldCBsPU1hdGgubWluKHQuaGVpZ2h0LzItdC5yYWRpdXMsby8yKTtsPWw8MD8wOmw7bGV0IGM9Vk0oKS5kb21haW4oWzAsbi5sZW5ndGgtMV0pLnJhbmdlKFstbCxsXSk7U2UuZXhwb3J0cy5lYWNoKG4sKChlLGkpPT57ZS5wb2ludHM9W3tkeDp0LmNvcmVCb3gud2lkdGgvMixkeTpuLmxlbmd0aD4xP2MoaSk6MH0se2R4OmUuZHgtZS53aWR0aC8yLGR5OmUuZHl9XX0pKSx0LmhlaWdodD1NYXRoLm1heCh0LmhlaWdodCxyLG8pfSkodCl9KSl9KSh0KSx0Lm5vZGUudHlwZT09PWpHdC5NRVRBPyhmdW5jdGlvbiBuKHQpe2xldCBlPU5XdC5zdWJzY2VuZS5tZXRhO1NlLmV4cG9ydHMuZXh0ZW5kKHQsZSksU2UuZXhwb3J0cy5leHRlbmQodC5jb3JlQm94LE9XdCh0LmNvcmVHcmFwaCxOV3QuZ3JhcGgubWV0YSkpO2xldCBuPXQuaXNvbGF0ZWRJbkV4dHJhY3QubGVuZ3RoP1NlLmV4cG9ydHMubWF4QnkodC5pc29sYXRlZEluRXh0cmFjdCwodD0+dC53aWR0aCkpLndpZHRoOm51bGw7dC5pbkV4dHJhY3RCb3gud2lkdGg9bnVsbCE9bj9uOjAsdC5pbkV4dHJhY3RCb3guaGVpZ2h0PVNlLmV4cG9ydHMucmVkdWNlKHQuaXNvbGF0ZWRJbkV4dHJhY3QsKCh0LG4saSk9PntsZXQgcj1pPjA/ZS5leHRyYWN0WU9mZnNldDowO3JldHVybiBuLng9MCxuLnk9dCtyK24uaGVpZ2h0LzIsdCtyK24uaGVpZ2h0fSksMCk7bGV0IGk9dC5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoP1NlLmV4cG9ydHMubWF4QnkodC5pc29sYXRlZE91dEV4dHJhY3QsKHQ9PnQud2lkdGgpKS53aWR0aDpudWxsO3Qub3V0RXh0cmFjdEJveC53aWR0aD1udWxsIT1pP2k6MCx0Lm91dEV4dHJhY3RCb3guaGVpZ2h0PVNlLmV4cG9ydHMucmVkdWNlKHQuaXNvbGF0ZWRPdXRFeHRyYWN0LCgodCxuLGkpPT57bGV0IHI9aT4wP2UuZXh0cmFjdFlPZmZzZXQ6MDtyZXR1cm4gbi54PTAsbi55PXQrcituLmhlaWdodC8yLHQrcituLmhlaWdodH0pLDApO2xldCByPXQubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QubGVuZ3RoP1NlLmV4cG9ydHMubWF4QnkodC5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdCwodD0+dC53aWR0aCkpLndpZHRoOm51bGw7dC5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoPW51bGwhPXI/cjowLHQubGlicmFyeUZ1bmN0aW9uc0JveC5oZWlnaHQ9U2UuZXhwb3J0cy5yZWR1Y2UodC5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdCwoKHQsbixpKT0+e2xldCByPWk+MD9lLmV4dHJhY3RZT2Zmc2V0OjA7cmV0dXJuIG4ueD0wLG4ueT10K3Irbi5oZWlnaHQvMix0K3Irbi5oZWlnaHR9KSwwKTtsZXQgbz0wO3QuaXNvbGF0ZWRJbkV4dHJhY3QubGVuZ3RoPjAmJm8rKyx0Lmlzb2xhdGVkT3V0RXh0cmFjdC5sZW5ndGg+MCYmbysrLHQubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QubGVuZ3RoPjAmJm8rKyx0LmNvcmVHcmFwaC5ub2RlQ291bnQoKT4wJiZvKys7bGV0IGE9bzw9MT8wOm8qTld0LnN1YnNjZW5lLm1ldGEuZXh0cmFjdFhPZmZzZXQ7Y29uc3Qgcz1NYXRoLm1heChJV3QsdC5pbkV4dHJhY3RCb3gud2lkdGgrdC5vdXRFeHRyYWN0Qm94LndpZHRoKTt0LmNvcmVCb3gud2lkdGgrPXMrYSt0LmxpYnJhcnlGdW5jdGlvbnNCb3gud2lkdGgrYSx0LmNvcmVCb3guaGVpZ2h0PWUubGFiZWxIZWlnaHQrTWF0aC5tYXgodC5pbkV4dHJhY3RCb3guaGVpZ2h0LHQuY29yZUJveC5oZWlnaHQsdC5saWJyYXJ5RnVuY3Rpb25zQm94LmhlaWdodCx0Lm91dEV4dHJhY3RCb3guaGVpZ2h0KSx0LndpZHRoPXQuY29yZUJveC53aWR0aCtlLnBhZGRpbmdMZWZ0K2UucGFkZGluZ1JpZ2h0LHQuaGVpZ2h0PXQucGFkZGluZ1RvcCt0LmNvcmVCb3guaGVpZ2h0K3QucGFkZGluZ0JvdHRvbX0pKHQpOnQubm9kZS50eXBlPT09akd0LlNFUklFUyYmKGZ1bmN0aW9uIGkodCl7bGV0IGU9dC5jb3JlR3JhcGgsbj1OV3Quc3Vic2NlbmUuc2VyaWVzO1NlLmV4cG9ydHMuZXh0ZW5kKHQsbiksU2UuZXhwb3J0cy5leHRlbmQodC5jb3JlQm94LE9XdCh0LmNvcmVHcmFwaCxOV3QuZ3JhcGguc2VyaWVzKSksU2UuZXhwb3J0cy5lYWNoKGUubm9kZXMoKSwodD0+e2Uubm9kZSh0KS5leGNsdWRlZD0hMX0pKSx0LndpZHRoPXQuY29yZUJveC53aWR0aCtuLnBhZGRpbmdMZWZ0K24ucGFkZGluZ1JpZ2h0LHQuaGVpZ2h0PXQuY29yZUJveC5oZWlnaHQrbi5wYWRkaW5nVG9wK24ucGFkZGluZ0JvdHRvbX0pKHQpfWZ1bmN0aW9uIE9XdCh0LGUpe1NlLmV4cG9ydHMuZXh0ZW5kKHQuZ3JhcGgoKSx7bm9kZXNlcDplLm5vZGVTZXAscmFua3NlcDplLnJhbmtTZXAsZWRnZXNlcDplLmVkZ2VTZXB9KTtsZXQgbj1bXTtpZihTZS5leHBvcnRzLmVhY2godC5ub2RlcygpLChlPT57dC5ub2RlKGUpLm5vZGUudHlwZT09PWpHdC5CUklER0V8fG4ucHVzaChlKX0pKSwhbi5sZW5ndGgpcmV0dXJue3dpZHRoOjAsaGVpZ2h0OjB9O2ZHdC5sYXlvdXQodCk7bGV0IGk9MS8wLHI9MS8wLG89LTEvMCxhPS0xLzA7cmV0dXJuIFNlLmV4cG9ydHMuZWFjaChuLChlPT57bGV0IG49dC5ub2RlKGUpLHM9LjUqbi53aWR0aCxsPW4ueC1zLGM9bi54K3M7aT1sPGk/bDppLG89Yz5vP2M6bztsZXQgdT0uNSpuLmhlaWdodCxoPW4ueS11LGQ9bi55K3U7cj1oPHI/aDpyLGE9ZD5hP2Q6YX0pKSxTZS5leHBvcnRzLmVhY2godC5lZGdlcygpLChlPT57bGV0IG49dC5lZGdlKGUpO2lmKG4uc3RydWN0dXJhbClyZXR1cm47bGV0IHM9dC5ub2RlKG4ubWV0YWVkZ2UudiksbD10Lm5vZGUobi5tZXRhZWRnZS53KTtpZigzPT09bi5wb2ludHMubGVuZ3RoJiYoZnVuY3Rpb24gYyh0KXtsZXQgZT1CV3QodFswXSx0WzFdKTtmb3IobGV0IG49MTtuPHQubGVuZ3RoLTE7bisrKXtsZXQgaT1CV3QodFtuXSx0W24rMV0pO2lmKE1hdGguYWJzKGktZSk+MSlyZXR1cm4hMTtlPWl9cmV0dXJuITB9KShuLnBvaW50cykpe2lmKG51bGwhPXMpe2xldCB0PXMuZXhwYW5kZWQ/cy54OkRXdChzKTtuLnBvaW50c1swXS54PXR9aWYobnVsbCE9bCl7bGV0IHQ9bC5leHBhbmRlZD9sLng6RFd0KGwpO24ucG9pbnRzWzJdLng9dH1uLnBvaW50cz1bbi5wb2ludHNbMF0sbi5wb2ludHNbMV1dfW51bGwhPWwmJihuLnBvaW50c1tuLnBvaW50cy5sZW5ndGgtMV09SFd0KG4ucG9pbnRzW24ucG9pbnRzLmxlbmd0aC0yXSxsKSksbnVsbCE9cyYmKG4ucG9pbnRzWzBdPUhXdChuLnBvaW50c1sxXSxzKSksU2UuZXhwb3J0cy5lYWNoKG4ucG9pbnRzLCh0PT57aT10Lng8aT90Lng6aSxvPXQueD5vP3QueDpvLHI9dC55PHI/dC55OnIsYT10Lnk+YT90Lnk6YX0pKX0pKSxTZS5leHBvcnRzLmVhY2godC5ub2RlcygpLChlPT57bGV0IG49dC5ub2RlKGUpO24ueC09aSxuLnktPXJ9KSksU2UuZXhwb3J0cy5lYWNoKHQuZWRnZXMoKSwoZT0+e1NlLmV4cG9ydHMuZWFjaCh0LmVkZ2UoZSkucG9pbnRzLCh0PT57dC54LT1pLHQueS09cn0pKX0pKSx7d2lkdGg6by1pLGhlaWdodDphLXJ9fWZ1bmN0aW9uIHpXdCh0KXtzd2l0Y2godC5hbm5vdGF0aW9uVHlwZSl7Y2FzZSBiV3QuQ09OU1RBTlQ6U2UuZXhwb3J0cy5leHRlbmQodCxOV3QuY29uc3RhbnQuc2l6ZSk7YnJlYWs7Y2FzZSBiV3QuU0hPUlRDVVQ6aWYodC5ub2RlLnR5cGU9PT1qR3QuT1ApU2UuZXhwb3J0cy5leHRlbmQodCxOV3Quc2hvcnRjdXRTaXplLm9wKTtlbHNlIGlmKHQubm9kZS50eXBlPT09akd0Lk1FVEEpU2UuZXhwb3J0cy5leHRlbmQodCxOV3Quc2hvcnRjdXRTaXplLm1ldGEpO2Vsc2V7aWYodC5ub2RlLnR5cGUhPT1qR3QuU0VSSUVTKXRocm93IEVycm9yKCJJbnZhbGlkIG5vZGUgdHlwZTogIit0Lm5vZGUudHlwZSk7U2UuZXhwb3J0cy5leHRlbmQodCxOV3Quc2hvcnRjdXRTaXplLnNlcmllcyl9YnJlYWs7Y2FzZSBiV3QuU1VNTUFSWTpTZS5leHBvcnRzLmV4dGVuZCh0LE5XdC5jb25zdGFudC5zaXplKX19ZnVuY3Rpb24gRFd0KHQpe3JldHVybiB0LmV4cGFuZGVkP3QueDp0LngtdC53aWR0aC8yKyh0LmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGg/dC5pbmJveFdpZHRoOjApK3QuY29yZUJveC53aWR0aC8yfWZ1bmN0aW9uIEJXdCh0LGUpe3JldHVybiAxODAqTWF0aC5hdGFuKChlLnktdC55KS8oZS54LXQueCkpL01hdGguUEl9ZnVuY3Rpb24gSFd0KHQsZSl7bGV0IG4saSxyPWUuZXhwYW5kZWQ/ZS54OkRXdChlKSxvPWUueSxhPXQueC1yLHM9dC55LW8sbD1lLmV4cGFuZGVkP2Uud2lkdGg6ZS5jb3JlQm94LndpZHRoLGM9ZS5leHBhbmRlZD9lLmhlaWdodDplLmNvcmVCb3guaGVpZ2h0O3JldHVybiBNYXRoLmFicyhzKSpsLzI+TWF0aC5hYnMoYSkqYy8yPyhzPDAmJihjPS1jKSxuPTA9PT1zPzA6Yy8yKmEvcyxpPWMvMik6KGE8MCYmKGw9LWwpLG49bC8yLGk9MD09PWE/MDpsLzIqcy9hKSx7eDpyK24seTpvK2l9fWNvbnN0IEZXdD14R3QsVld0PXZHdDtsZXQgVVd0PVt7YmFja2dyb3VuZF9jb2xvcjoiI0NDMkYyQyIsbGFiZWw6Ik5hTiJ9LHtiYWNrZ3JvdW5kX2NvbG9yOiIjRkY4RDAwIixsYWJlbDoiLeKIniJ9LHtiYWNrZ3JvdW5kX2NvbG9yOiIjRUFFQUVBIixsYWJlbDoiLSJ9LHtiYWNrZ3JvdW5kX2NvbG9yOiIjQTVBNUE1IixsYWJlbDoiMCJ9LHtiYWNrZ3JvdW5kX2NvbG9yOiIjMjYyNjI2IixsYWJlbDoiKyJ9LHtiYWNrZ3JvdW5kX2NvbG9yOiIjMDAzRUQ0IixsYWJlbDoiK+KIniJ9XTtmdW5jdGlvbiBqV3QodCxlLG4pe251bGwhPXQuYXR0cigidHJhbnNmb3JtIikmJih0PXQudHJhbnNpdGlvbigicG9zaXRpb24iKSksdC5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitlKyIsIituKyIpIil9ZnVuY3Rpb24gR1d0KHQsZSxuLGkscil7dC50cmFuc2l0aW9uKCkuYXR0cigieCIsZS1pLzIpLmF0dHIoInkiLG4tci8yKS5hdHRyKCJ3aWR0aCIsaSkuYXR0cigiaGVpZ2h0IixyKX1mdW5jdGlvbiBXV3QodCxlLG4saSxyKXt0LnRyYW5zaXRpb24oKS5hdHRyKCJjeCIsZSkuYXR0cigiY3kiLG4pLmF0dHIoInJ4IixpLzIpLmF0dHIoInJ5IixyLzIpfWZ1bmN0aW9uIHFXdCh0LGUpe3JldHVybiBlP3QudG9GaXhlZCgwKTpNYXRoLmFicyh0KT49MT90LnRvRml4ZWQoMSk6dC50b0V4cG9uZW50aWFsKDEpfWxldCBZV3Q9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnNwZWNpZmljSGVhbHRoUGlsbFN0ZXA9MCx0aGlzLmhlYWx0aFBpbGxFbnRyaWVzPVVXdH1yZWFkeSgpe3N1cGVyLnJlYWR5KCk7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1haW5Db250YWluZXIiKSxlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInRmLWRhc2hib2FyZC1sYXlvdXQgLnNjcm9sbGJhciIpO3QmJmUmJih0LnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGUuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpfV9oZWFsdGhQaWxsc0F2YWlsYWJsZSh0LGUpe3JldHVybiB0JiZlfV9jb21wdXRlVGVuc29yQ291bnRTdHJpbmcodCxlKXtyZXR1cm4gdD90W2VdLnRvRml4ZWQoMCk6IiJ9Z2V0IGhlYWx0aFBpbGxWYWx1ZXNGb3JTZWxlY3RlZE5vZGUoKXt2YXIgdD10aGlzLnNlbGVjdGVkTm9kZTtpZih0aGlzLmFyZUhlYWx0aFBpbGxzTG9hZGluZylyZXR1cm4gbnVsbDtpZighdClyZXR1cm4gbnVsbDtjb25zdCBlPXRoaXMubm9kZU5hbWVzVG9IZWFsdGhQaWxsc1t0XTtpZighZSlyZXR1cm4gbnVsbDtjb25zdCBuPWVbdGhpcy5hbGxTdGVwc01vZGVFbmFibGVkPzA6dGhpcy5oZWFsdGhQaWxsU3RlcEluZGV4XTtyZXR1cm4gbj9uLnZhbHVlLnNsaWNlKDIsOCk6bnVsbH1nZXQgX2N1cnJlbnRTdGVwRGlzcGxheVZhbHVlKCl7dmFyIHQ9dGhpcy5ub2RlTmFtZXNUb0hlYWx0aFBpbGxzLGU9dGhpcy5oZWFsdGhQaWxsU3RlcEluZGV4LG49dGhpcy5hcmVIZWFsdGhQaWxsc0xvYWRpbmc7aWYodGhpcy5hbGxTdGVwc01vZGVFbmFibGVkKXJldHVybiB0aGlzLnNwZWNpZmljSGVhbHRoUGlsbFN0ZXAudG9GaXhlZCgwKTtpZihuKXJldHVybiAwO2ZvcihsZXQgbiBpbiB0KXJldHVybiB0W25dW2VdLnN0ZXAudG9GaXhlZCgwKTtyZXR1cm4gMH1nZXQgX2JpZ2dlc3RTdGVwRXZlclNlZW4oKXt2YXIgdD10aGlzLm5vZGVOYW1lc1RvSGVhbHRoUGlsbHM7Zm9yKGxldCBuIGluIHQpe3ZhciBlPXRbbl07cmV0dXJuIE1hdGgubWF4KHRoaXMuX2JpZ2dlc3RTdGVwRXZlclNlZW4sZVtlLmxlbmd0aC0xXS5zdGVwKX1yZXR1cm4gdGhpcy5fYmlnZ2VzdFN0ZXBFdmVyU2Vlbnx8MH1nZXQgX21heFN0ZXBJbmRleCgpe3ZhciB0PXRoaXMubm9kZU5hbWVzVG9IZWFsdGhQaWxscztmb3IobGV0IGUgaW4gdClyZXR1cm4gdFtlXS5sZW5ndGgtMTtyZXR1cm4gMH1faGFzRGVidWdnZXJOdW1lcmljQWxlcnRzKHQpe3JldHVybiB0JiZ0Lmxlbmd0aH1fdXBkYXRlQWxlcnRzTGlzdCgpe3ZhciB0PXRoaXMuZGVidWdnZXJOdW1lcmljQWxlcnRzLGU9dGhpcy4kJCgiI251bWVyaWMtYWxlcnRzLWJvZHkiKTtpZihlKXtlLmlubmVyVGV4dD0iIjtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIGk9dFtuXSxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIiksbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO28uaW5uZXJUZXh0PShmPWkuZmlyc3RfdGltZXN0YW1wLChtPStuZXcgRGF0ZS0rbmV3IERhdGUoZi8xZTMpKTwzZTQ/Imp1c3Qgbm93IjptPDZlND9NYXRoLmZsb29yKG0vMWUzKSsiIHNlY29uZHMgYWdvIjptPDEyZTQ/ImEgbWludXRlIGFnbyI6bTwzNmU1P01hdGguZmxvb3IobS82ZTQpKyIgbWludXRlcyBhZ28iOjE9PU1hdGguZmxvb3IobS8zNmU1KT8iYW4gaG91ciBhZ28iOm08ODY0ZTU/TWF0aC5mbG9vcihtLzM2ZTUpKyIgaG91cnMgYWdvIjptPDE3MjhlNT8ieWVzdGVyZGF5IjpNYXRoLmZsb29yKG0vODY0ZTUpKyIgZGF5cyBhZ28iKSxvLmNsYXNzTGlzdC5hZGQoImZpcnN0LW9mZmVuc2UtdGQiKSxyLmFwcGVuZENoaWxkKG8pO3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7YS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3ItZGV2aWNlLXRkIik7dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cy5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGUiKSxzLmlubmVyVGV4dD1pLnRlbnNvcl9uYW1lLHRoaXMuX2FkZE9wRXhwYW5zaW9uTGlzdGVuZXIocyxpLnRlbnNvcl9uYW1lKSxhLmFwcGVuZENoaWxkKHMpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuY2xhc3NMaXN0LmFkZCgiZGV2aWNlLXNlY3Rpb24td2l0aGluLXRhYmxlIiksbC5pbm5lclRleHQ9IigiK2kuZGV2aWNlX25hbWUrIikiLGEuYXBwZW5kQ2hpbGQobCksci5hcHBlbmRDaGlsZChhKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmNsYXNzTGlzdC5hZGQoIm1pbmktaGVhbHRoLXBpbGwiKTt2YXIgdT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO2lmKHUuY2xhc3NMaXN0LmFkZCgibWluaS1oZWFsdGgtcGlsbC10ZCIpLHUuYXBwZW5kQ2hpbGQoYyksci5hcHBlbmRDaGlsZCh1KSxpLm5lZ19pbmZfZXZlbnRfY291bnQpe3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guY2xhc3NMaXN0LmFkZCgibmVnYXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiIpLGguaW5uZXJUZXh0PWkubmVnX2luZl9ldmVudF9jb3VudCxoLnNldEF0dHJpYnV0ZSgidGl0bGUiLGkubmVnX2luZl9ldmVudF9jb3VudCsiIGV2ZW50cyB3aXRoIC3iiJ4iKSxjLmFwcGVuZENoaWxkKGgpfWlmKGkucG9zX2luZl9ldmVudF9jb3VudCl7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5jbGFzc0xpc3QuYWRkKCJwb3NpdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIiksZC5pbm5lclRleHQ9aS5wb3NfaW5mX2V2ZW50X2NvdW50LGQuc2V0QXR0cmlidXRlKCJ0aXRsZSIsaS5wb3NfaW5mX2V2ZW50X2NvdW50KyIgZXZlbnRzIHdpdGggK+KIniIpLGMuYXBwZW5kQ2hpbGQoZCl9aWYoaS5uYW5fZXZlbnRfY291bnQpe3ZhciBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3AuY2xhc3NMaXN0LmFkZCgibmFuLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiIpLHAuaW5uZXJUZXh0PWkubmFuX2V2ZW50X2NvdW50LHAuc2V0QXR0cmlidXRlKCJ0aXRsZSIsaS5uYW5fZXZlbnRfY291bnQrIiBldmVudHMgd2l0aCBOYU4iKSxjLmFwcGVuZENoaWxkKHApfVlpKGUpLmFwcGVuZENoaWxkKHIpfXZhciBmLG19fV9hZGRPcEV4cGFuc2lvbkxpc3RlbmVyKHQsZSl7dC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCgpPT57dmFyIHQsbj0oZnVuY3Rpb24gaSh0LGUsbil7Y29uc3QgaT1uLnNwbGl0KCIvIikscj1pW2kubGVuZ3RoLTFdLm1hdGNoKC8oLiopOlx3Ky8pOzI9PT1yLmxlbmd0aCYmKGlbaS5sZW5ndGgtMV09clsxXSk7bGV0IG89aVswXSxhPWUuZ2V0UmVuZGVyTm9kZUJ5TmFtZShvKTtmb3IobGV0IG49MTtuPGkubGVuZ3RoJiZhLm5vZGUudHlwZSE9PWpHdC5PUDtuKyspZS5idWlsZFN1YmhpZXJhcmNoeShvKSxhLmV4cGFuZGVkPSEwLHQuc2V0Tm9kZUV4cGFuZGVkKGEpLG8rPSIvIitpW25dLGE9ZS5nZXRSZW5kZXJOb2RlQnlOYW1lKG8pO3JldHVybiBhLm5vZGUubmFtZX0pKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzY2VuZSIpLHRoaXMucmVuZGVySGllcmFyY2h5LGUpLHI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigidGYtZ3JhcGgtaW5mbyNncmFwaC1pbmZvIik7ciYmKHQ9ci5zY3JvbGxIZWlnaHQtci5zY3JvbGxUb3ApO3ZhciBvPXRoaXMuc2VsZWN0ZWROb2RlO3RoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLG4pO3ZhciBhPSgpPT57ci5zY3JvbGxUb3A9ci5zY3JvbGxIZWlnaHQtdH07ciYmKG8/YSgpOndpbmRvdy5zZXRUaW1lb3V0KGEsMjApKX0pKX19O3ZhciBYV3Q7WVd0LnRlbXBsYXRlPV9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtbGVnZW5kIHsKICAgICAgICBwYWRkaW5nOiAxNXB4OwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtbGVnZW5kIGgyIHsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgewogICAgICAgIG1hcmdpbjogMTBweCAxMHB4IDEwcHggMDsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLWVudHJ5IC5jb2xvci1wcmV2aWV3IHsKICAgICAgICB3aWR0aDogMjZweDsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtYXJnaW46IDAgMTBweCAwIDA7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAuY29sb3ItbGFiZWwsCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAudGVuc29yLWNvdW50IHsKICAgICAgICBjb2xvcjogIzc3NzsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMjJweDsKICAgICAgICBsaW5lLWhlaWdodDogMjZweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgLnRlbnNvci1jb3VudCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CgogICAgICAjaGVhbHRoLXBpbGwtc3RlcC1zbGlkZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1hcmdpbjogMCAwIDAgLTE1cHg7CiAgICAgICAgLyogMzEgY29tZXMgZnJvbSBhZGRpbmcgYSBwYWRkaW5nIG9mIDE1cHggZnJvbSBib3RoIHNpZGVzIG9mIHRoZSBwYXBlci1zbGlkZXIsIHN1YnRyYWN0aW5nCiAgICogMXB4IHNvIHRoYXQgdGhlIHNsaWRlciB3aWR0aCBhbGlnbnMgd2l0aCB0aGUgaW1hZ2UgKHRoZSBsYXN0IHNsaWRlciBtYXJrZXIgdGFrZXMgdXAgMXB4KSwKICAgKiBhbmQgYWRkaW5nIDJweCB0byBhY2NvdW50IGZvciBhIGJvcmRlciBvZiAxcHggb24gYm90aCBzaWRlcyBvZiB0aGUgaW1hZ2UuIDMwIC0gMSArIDIuCiAgICogQXBwYXJlbnRseSwgdGhlIHBhcGVyLXNsaWRlciBsYWNrcyBhIG1peGluIGZvciB0aG9zZSBwYWRkaW5nIHZhbHVlcy4gKi8KICAgICAgICB3aWR0aDogY2FsYygxMDAlICsgMzFweCk7CiAgICAgIH0KCiAgICAgICNoZWFsdGgtcGlsbHMtbG9hZGluZy1zcGlubmVyIHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQoKICAgICAgI2hlYWx0aC1waWxsLXN0ZXAtbnVtYmVyLWlucHV0IHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlLWNvbnRhaW5lciB7CiAgICAgICAgbWF4LWhlaWdodDogNDAwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgICNudW1lcmljLWFsZXJ0cy10YWJsZSB7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlIHRkIHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAjbnVtZXJpYy1hbGVydHMtdGFibGUgLmZpcnN0LW9mZmVuc2UtdGQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmZpcnN0LW9mZmVuc2UtdGQgewogICAgICAgIHdpZHRoOiA4MHB4OwogICAgICB9CgogICAgICAudGVuc29yLWRldmljZS10ZCB7CiAgICAgICAgbWF4LXdpZHRoOiAxNDBweDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KCiAgICAgIC50ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGUgewogICAgICAgIGNvbG9yOiAjMjY2MjM2OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KCiAgICAgIC50ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGU6aG92ZXIgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5kZXZpY2Utc2VjdGlvbi13aXRoaW4tdGFibGUgewogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAubWluaS1oZWFsdGgtcGlsbCB7CiAgICAgICAgd2lkdGg6IDEzMHB4OwogICAgICB9CgogICAgICAubWluaS1oZWFsdGgtcGlsbCA+IGRpdiB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgfQoKICAgICAgI2V2ZW50LWNvdW50cy10aCB7CiAgICAgICAgcGFkZGluZzogMCAwIDAgMTBweDsKICAgICAgfQoKICAgICAgLm5lZ2F0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24gewogICAgICAgIGJhY2tncm91bmQ6IHJnYigyNTUsIDE0MSwgMCk7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5wb3NpdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMCwgNjIsIDIxMik7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5uYW4tbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMjA0LCA0NywgNDQpOwogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICB9CgogICAgICAubmVnYXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiwKICAgICAgLnBvc2l0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24sCiAgICAgIC5uYW4tbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1hcmdpbjogMCAwIDAgMTBweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5uby1udW1lcmljLWFsZXJ0cy1ub3RpZmljYXRpb24gewogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGNsYXNzPSJjYXJkIGhlYWx0aC1waWxsLWxlZ2VuZCI+CiAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICBFbmFibGUgYWxsIChub3QganVzdCBzYW1wbGVkKSBzdGVwcy4gUmVxdWlyZXMgc2xvdyBkaXNrIHJlYWQuCiAgICAgIDwvZGl2PgogICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbgogICAgICAgIGlkPSJlbmFibGVBbGxTdGVwc01vZGVUb2dnbGUiCiAgICAgICAgY2hlY2tlZD0ie3thbGxTdGVwc01vZGVFbmFibGVkfX0iCiAgICAgID4KICAgICAgPC9wYXBlci10b2dnbGUtYnV0dG9uPgogICAgICA8aDI+CiAgICAgICAgU3RlcCBvZiBIZWFsdGggUGlsbHM6CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2FsbFN0ZXBzTW9kZUVuYWJsZWRdXSI+CiAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgdHlwZT0ibnVtYmVyIgogICAgICAgICAgICBpZD0iaGVhbHRoLXBpbGwtc3RlcC1udW1iZXItaW5wdXQiCiAgICAgICAgICAgIG1pbj0iMCIKICAgICAgICAgICAgbWF4PSJbW19iaWdnZXN0U3RlcEV2ZXJTZWVuXV0iCiAgICAgICAgICAgIHZhbHVlPSJ7e3NwZWNpZmljSGVhbHRoUGlsbFN0ZXA6OmlucHV0fX0iCiAgICAgICAgICAvPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFhbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgICAgW1tfY3VycmVudFN0ZXBEaXNwbGF5VmFsdWVdXQogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHBhcGVyLXNwaW5uZXItbGl0ZQogICAgICAgICAgYWN0aXZlCiAgICAgICAgICBoaWRkZW4kPSJbWyFhcmVIZWFsdGhQaWxsc0xvYWRpbmddXSIKICAgICAgICAgIGlkPSJoZWFsdGgtcGlsbHMtbG9hZGluZy1zcGlubmVyIgogICAgICAgID48L3BhcGVyLXNwaW5uZXItbGl0ZT4KICAgICAgPC9oMj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2FsbFN0ZXBzTW9kZUVuYWJsZWRdXSI+CiAgICAgICAgPHBhcGVyLXNsaWRlcgogICAgICAgICAgaWQ9ImhlYWx0aC1waWxsLXN0ZXAtc2xpZGVyIgogICAgICAgICAgaW1tZWRpYXRlLXZhbHVlPSJ7e3NwZWNpZmljSGVhbHRoUGlsbFN0ZXB9fSIKICAgICAgICAgIG1heD0iW1tfYmlnZ2VzdFN0ZXBFdmVyU2Vlbl1dIgogICAgICAgICAgc25hcHMKICAgICAgICAgIHN0ZXA9IjEiCiAgICAgICAgICB2YWx1ZT0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iCiAgICAgICAgPjwvcGFwZXItc2xpZGVyPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWFsbFN0ZXBzTW9kZUVuYWJsZWRdXSI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19tYXhTdGVwSW5kZXhdXSI+CiAgICAgICAgICA8cGFwZXItc2xpZGVyCiAgICAgICAgICAgIGlkPSJoZWFsdGgtcGlsbC1zdGVwLXNsaWRlciIKICAgICAgICAgICAgaW1tZWRpYXRlLXZhbHVlPSJ7e2hlYWx0aFBpbGxTdGVwSW5kZXh9fSIKICAgICAgICAgICAgbWF4PSJbW19tYXhTdGVwSW5kZXhdXSIKICAgICAgICAgICAgc25hcHMKICAgICAgICAgICAgc3RlcD0iMSIKICAgICAgICAgICAgdmFsdWU9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19IgogICAgICAgICAgPjwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxoMj4KICAgICAgICBIZWFsdGggUGlsbAogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1toZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlXV0iPgogICAgICAgICAgQ291bnRzIGZvciBTZWxlY3RlZCBOb2RlCiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWhlYWx0aFBpbGxWYWx1ZXNGb3JTZWxlY3RlZE5vZGVdXSI+CiAgICAgICAgICBMZWdlbmQKICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2gyPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2hlYWx0aFBpbGxFbnRyaWVzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWx0aC1waWxsLWVudHJ5Ij4KICAgICAgICAgIDxkaXYKICAgICAgICAgICAgY2xhc3M9ImNvbG9yLXByZXZpZXciCiAgICAgICAgICAgIHN0eWxlPSJiYWNrZ3JvdW5kOltbaXRlbS5iYWNrZ3JvdW5kX2NvbG9yXV0iCiAgICAgICAgICA+PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sYWJlbCI+W1tpdGVtLmxhYmVsXV08L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRlbnNvci1jb3VudCI+CiAgICAgICAgICAgIFtbX2NvbXB1dGVUZW5zb3JDb3VudFN0cmluZyhoZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlLAogICAgICAgICAgICBpbmRleCldXQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxkaXYgaGlkZGVuJD0iW1shX2hhc0RlYnVnZ2VyTnVtZXJpY0FsZXJ0cyhkZWJ1Z2dlck51bWVyaWNBbGVydHMpXV0iPgogICAgICAgIDxoMiBpZD0ibnVtZXJpYy1hbGVydHMtaGVhZGVyIj5OdW1lcmljIEFsZXJ0czwvaDI+CiAgICAgICAgPHA+QWxlcnRzIGFyZSBzb3J0ZWQgZnJvbSB0b3AgdG8gYm90dG9tIGJ5IGluY3JlYXNpbmcgdGltZXN0YW1wLjwvcD4KICAgICAgICA8ZGl2IGlkPSJudW1lcmljLWFsZXJ0cy10YWJsZS1jb250YWluZXIiPgogICAgICAgICAgPHRhYmxlIGlkPSJudW1lcmljLWFsZXJ0cy10YWJsZSI+CiAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGg+Rmlyc3QgT2ZmZW5zZTwvdGg+CiAgICAgICAgICAgICAgICA8dGg+VGVuc29yIChEZXZpY2UpPC90aD4KICAgICAgICAgICAgICAgIDx0aCBpZD0iZXZlbnQtY291bnRzLXRoIj5FdmVudCBDb3VudHM8L3RoPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgIDx0Ym9keSBpZD0ibnVtZXJpYy1hbGVydHMtYm9keSI+PC90Ym9keT4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUKICAgICAgICBpcz0iZG9tLWlmIgogICAgICAgIGlmPSJbWyFfaGFzRGVidWdnZXJOdW1lcmljQWxlcnRzKGRlYnVnZ2VyTnVtZXJpY0FsZXJ0cyldXSIKICAgICAgPgogICAgICAgIDxwIGNsYXNzPSJuby1udW1lcmljLWFsZXJ0cy1ub3RpZmljYXRpb24iPgogICAgICAgICAgTm8gbnVtZXJpYyBhbGVydHMgc28gZmFyLiBUaGF0IGlzIGxpa2VseSBnb29kLiBBbGVydHMgaW5kaWNhdGUgdGhlCiAgICAgICAgICBwcmVzZW5jZSBvZiBOYU4gb3IgKCsvLSkgSW5maW5pdHkgdmFsdWVzLCB3aGljaCBtYXkgYmUgY29uY2VybmluZy4KICAgICAgICA8L3A+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3BhcGVyLW1hdGVyaWFsPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIseVd0KV0sWVd0LnByb3RvdHlwZSwicmVuZGVySGllcmFyY2h5Iix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXksbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFlXdC5wcm90b3R5cGUsImRlYnVnZ2VyTnVtZXJpY0FsZXJ0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxZV3QucHJvdG90eXBlLCJub2RlTmFtZXNUb0hlYWx0aFBpbGxzIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxZV3QucHJvdG90eXBlLCJoZWFsdGhQaWxsU3RlcEluZGV4Iix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxZV3QucHJvdG90eXBlLCJzcGVjaWZpY0hlYWx0aFBpbGxTdGVwIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxZV3QucHJvdG90eXBlLCJzZWxlY3RlZE5vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFlXdC5wcm90b3R5cGUsImhpZ2hsaWdodGVkTm9kZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcixub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sWVd0LnByb3RvdHlwZSwic2VsZWN0ZWROb2RlSW5jbHVkZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sWVd0LnByb3RvdHlwZSwiYXJlSGVhbHRoUGlsbHNMb2FkaW5nIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxZV3QucHJvdG90eXBlLCJoZWFsdGhQaWxsRW50cmllcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFlXdC5wcm90b3R5cGUsImFsbFN0ZXBzTW9kZUVuYWJsZWQiLHZvaWQgMCksdChbcygibm9kZU5hbWVzVG9IZWFsdGhQaWxscyIsImhlYWx0aFBpbGxTdGVwSW5kZXgiLCJzZWxlY3RlZE5vZGUiLCJhbGxTdGVwc01vZGVFbmFibGVkIiwiYXJlSGVhbHRoUGlsbHNMb2FkaW5nIiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxZV3QucHJvdG90eXBlLCJoZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlIixudWxsKSx0KFtzKCJub2RlTmFtZXNUb0hlYWx0aFBpbGxzIiwiaGVhbHRoUGlsbFN0ZXBJbmRleCIsImFsbFN0ZXBzTW9kZUVuYWJsZWQiLCJzcGVjaWZpY0hlYWx0aFBpbGxTdGVwIiwiYXJlSGVhbHRoUGlsbHNMb2FkaW5nIiksZSgiZGVzaWduOnR5cGUiLE9iamVjdCksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sWVd0LnByb3RvdHlwZSwiX2N1cnJlbnRTdGVwRGlzcGxheVZhbHVlIixudWxsKSx0KFtzKCJub2RlTmFtZXNUb0hlYWx0aFBpbGxzIiksZSgiZGVzaWduOnR5cGUiLE51bWJlciksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sWVd0LnByb3RvdHlwZSwiX2JpZ2dlc3RTdGVwRXZlclNlZW4iLG51bGwpLHQoW3MoIm5vZGVOYW1lc1RvSGVhbHRoUGlsbHMiKSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxZV3QucHJvdG90eXBlLCJfbWF4U3RlcEluZGV4IixudWxsKSx0KFthKCJkZWJ1Z2dlck51bWVyaWNBbGVydHMiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLFlXdC5wcm90b3R5cGUsIl91cGRhdGVBbGVydHNMaXN0IixudWxsKSxZV3Q9dChbaSgidGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkIildLFlXdCksKGZ1bmN0aW9uKHQpe3QuQ09OU1Q9IkNPTlNUIix0Lk1FVEE9Ik1FVEEiLHQuT1A9Ik9QIix0LlNFUklFUz0iU0VSSUVTIix0LlNVTU1BUlk9IlNVTU1BUlkifSkoWFd0fHwoWFd0PXt9KSk7bGV0ICRXdD1jbGFzcyBleHRlbmRzKGVyKGlsKHllKSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnZlcnRpY2FsPSExLHRoaXMuZmlsbE92ZXJyaWRlPW51bGwsdGhpcy5zdHJva2VPdmVycmlkZT1udWxsLHRoaXMuaGVpZ2h0PTIwLHRoaXMuZmFkZWQ9ITF9Z2V0U3ZnRGVmaW5hYmxlRWxlbWVudCgpe3JldHVybiB0aGlzLiQuc3ZnRGVmc31nZXQgX2ZpbGwoKXt2YXIgdD10aGlzLmZpbGxPdmVycmlkZTtpZihudWxsIT10KXJldHVybiB0O3N3aXRjaCh0aGlzLnR5cGUpe2Nhc2UgWFd0Lk1FVEE6cmV0dXJuIHBXdC5ERUZBVUxUX0ZJTEw7Y2FzZSBYV3QuU0VSSUVTOnJldHVybiJ3aGl0ZSI7ZGVmYXVsdDpyZXR1cm4iI2ZmZmZmZiJ9fWdldCBfc3Ryb2tlKCl7dmFyIHQ9dGhpcy5zdHJva2VPdmVycmlkZTtpZihudWxsIT10KXJldHVybiB0O3N3aXRjaCh0aGlzLnR5cGUpe2Nhc2UgWFd0Lk1FVEE6cmV0dXJuIHBXdC5ERUZBVUxUX1NUUk9LRTtjYXNlIFhXdC5TRVJJRVM6ZGVmYXVsdDpyZXR1cm4iI2IyYjJiMiJ9fV9pc1R5cGUodCxlKXtyZXR1cm4gdD09PWV9X2ZhZGVkQ2xhc3ModCxlKXtyZXR1cm4gdD8iZmFkZWQtIitlOiIifX07JFd0LnRlbXBsYXRlPV9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAwOwogICAgICB9CgogICAgICA6aG9zdCguZGFyay1tb2RlKSBzdmcgewogICAgICAgIGZpbHRlcjogaW52ZXJ0KDEpOwogICAgICB9CgogICAgICAuZmFkZWQtcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpOwogICAgICB9CgogICAgICAuZmFkZWQtZWxsaXBzZSB7CiAgICAgICAgZmlsbDogdXJsKCNlbGxpcHNlSGF0Y2gpOwogICAgICB9CgogICAgICAuZmFkZWQtcmVjdCwKICAgICAgLmZhZGVkLWVsbGlwc2UsCiAgICAgIC5mYWRlZC1zZXJpZXMgewogICAgICAgIHN0cm9rZTogdmFyKC0tdGItZ3JhcGgtZmFkZWQpICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgI3JlY3RIYXRjaCBsaW5lLAogICAgICAjZWxsaXBzZUhhdGNoIGxpbmUgewogICAgICAgIGNvbG9yOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8IS0tIFNWRyBmb3IgZGVmaW5pdGlvbnMgLS0+CiAgICA8c3ZnIGhlaWdodD0iMCIgd2lkdGg9IjAiIGlkPSJzdmdEZWZzIj4KICAgICAgPGRlZnM+CiAgICAgICAgPCEtLSBIYXRjaCBwYXR0ZXJucyBmb3IgZmFkZWQgb3V0IG5vZGVzLiAtLT4KICAgICAgICA8cGF0dGVybgogICAgICAgICAgaWQ9InJlY3RIYXRjaCIKICAgICAgICAgIHBhdHRlcm5UcmFuc2Zvcm09InJvdGF0ZSg0NSAwIDApIgogICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICBoZWlnaHQ9IjUiCiAgICAgICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgID4KICAgICAgICAgIDxsaW5lIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSI1IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxIj48L2xpbmU+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIDxwYXR0ZXJuCiAgICAgICAgICBpZD0iZWxsaXBzZUhhdGNoIgogICAgICAgICAgcGF0dGVyblRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiCiAgICAgICAgICB3aWR0aD0iMiIKICAgICAgICAgIGhlaWdodD0iMiIKICAgICAgICAgIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICAgPgogICAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjIiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiPjwvbGluZT4KICAgICAgICA8L3BhdHRlcm4+CiAgICAgICAgPCEtLSBUZW1wbGF0ZSBmb3IgYW4gT3Agbm9kZSBlbGxpcHNlLiAtLT4KICAgICAgICA8ZWxsaXBzZQogICAgICAgICAgaWQ9Im9wLW5vZGUtc3RhbXAiCiAgICAgICAgICByeD0iNy41IgogICAgICAgICAgcnk9IjMiCiAgICAgICAgICBzdHJva2U9ImluaGVyaXQiCiAgICAgICAgICBmaWxsPSJpbmhlcml0IgogICAgICAgID48L2VsbGlwc2U+CiAgICAgICAgPCEtLSBUZW1wbGF0ZSBmb3IgYW4gT3Agbm9kZSBhbm5vdGF0aW9uIGVsbGlwc2UgKHNtYWxsZXIpLiAtLT4KICAgICAgICA8ZWxsaXBzZQogICAgICAgICAgaWQ9Im9wLW5vZGUtYW5ub3RhdGlvbi1zdGFtcCIKICAgICAgICAgIHJ4PSI1IgogICAgICAgICAgcnk9IjIiCiAgICAgICAgICBzdHJva2U9ImluaGVyaXQiCiAgICAgICAgICBmaWxsPSJpbmhlcml0IgogICAgICAgID48L2VsbGlwc2U+CiAgICAgICAgPCEtLSBWZXJ0aWNhbGx5IHN0YWNrZWQgc2VyaWVzIG9mIE9wIG5vZGVzIHdoZW4gdW5leHBhbmRlZC4gLS0+CiAgICAgICAgPGcgaWQ9Im9wLXNlcmllcy12ZXJ0aWNhbC1zdGFtcCI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSI5Ij48L3VzZT4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjYiPjwvdXNlPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iMyI+PC91c2U+CiAgICAgICAgPC9nPgogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtaG9yaXpvbnRhbC1zdGFtcCI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxNiIgeT0iNCI+PC91c2U+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxMiIgeT0iNCI+PC91c2U+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSI0Ij48L3VzZT4KICAgICAgICA8L2c+CiAgICAgICAgPGcKICAgICAgICAgIGlkPSJzdW1tYXJ5LWljb24iCiAgICAgICAgICBmaWxsPSIjODQ4NDg0IgogICAgICAgICAgaGVpZ2h0PSIxMiIKICAgICAgICAgIHZpZXdCb3g9IjAgMCAyNCAyNCIKICAgICAgICAgIHdpZHRoPSIxMiIKICAgICAgICA+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6TTkgMTdIN3YtN2gydjd6bTQgMGgtMlY3aDJ2MTB6bTQgMGgtMnYtNGgydjR6IgogICAgICAgICAgPjwvcGF0aD4KICAgICAgICA8L2c+CiAgICAgIDwvZGVmcz4KICAgIDwvc3ZnPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ0NPTlNUJyldXSI+CiAgICAgIDxzdmcKICAgICAgICBoZWlnaHQkPSJbW2hlaWdodF1dIgogICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWlkIG1lZXQiCiAgICAgICAgdmlld0JveD0iMCAwIDEwIDEwIgogICAgICA+CiAgICAgICAgPGNpcmNsZQogICAgICAgICAgY3g9IjUiCiAgICAgICAgICBjeT0iNSIKICAgICAgICAgIHI9IjMiCiAgICAgICAgICBmaWxsJD0iW1tfZmlsbF1dIgogICAgICAgICAgc3Ryb2tlJD0iW1tfc3Ryb2tlXV0iCiAgICAgICAgPjwvY2lyY2xlPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnU1VNTUFSWScpXV0iPgogICAgICA8c3ZnCiAgICAgICAgd2lkdGgkPSJbW2hlaWdodF1dIgogICAgICAgIGhlaWdodCQ9IltbaGVpZ2h0XV0iCiAgICAgICAgdmlld0JveD0iMCAwIDI0IDI0IgogICAgICAgIGZpbGw9IiM4NDg0ODQiCiAgICAgID4KICAgICAgICA8cGF0aAogICAgICAgICAgZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIKICAgICAgICA+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnT1AnKV1dIj4KICAgICAgPHN2ZwogICAgICAgIGhlaWdodCQ9IltbaGVpZ2h0XV0iCiAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pbllNaWQgbWVldCIKICAgICAgICB2aWV3Qm94PSIwIDAgMTYgOCIKICAgICAgPgogICAgICAgIDx1c2UKICAgICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICAgICAgICAgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiCiAgICAgICAgICBmaWxsJD0iW1tfZmlsbF1dIgogICAgICAgICAgc3Ryb2tlJD0iW1tfc3Ryb2tlXV0iCiAgICAgICAgICBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdlbGxpcHNlJyl9fSIKICAgICAgICAgIHg9IjgiCiAgICAgICAgICB5PSI0IgogICAgICAgID48L3VzZT4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ01FVEEnKV1dIj4KICAgICAgPHN2ZwogICAgICAgIGhlaWdodCQ9IltbaGVpZ2h0XV0iCiAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pbllNaWQgbWVldCIKICAgICAgICB2aWV3Qm94PSIwIDAgMzcgMTYiCiAgICAgID4KICAgICAgICA8cmVjdAogICAgICAgICAgeD0iMSIKICAgICAgICAgIHk9IjEiCiAgICAgICAgICBmaWxsJD0iW1tfZmlsbF1dIgogICAgICAgICAgc3Ryb2tlJD0iW1tfc3Ryb2tlXV0iCiAgICAgICAgICBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdyZWN0Jyl9fSIKICAgICAgICAgIHN0cm9rZS13aWR0aD0iMnB4IgogICAgICAgICAgaGVpZ2h0PSIxNCIKICAgICAgICAgIHdpZHRoPSIzNSIKICAgICAgICAgIHJ4PSI1IgogICAgICAgICAgcnk9IjUiCiAgICAgICAgPjwvcmVjdD4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ1NFUklFUycpXV0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbdmVydGljYWxdXSI+CiAgICAgICAgPHN2ZwogICAgICAgICAgaGVpZ2h0JD0iW1toZWlnaHRdXSIKICAgICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWlkIG1lZXQiCiAgICAgICAgICB2aWV3Qm94PSIwIDAgMTYgMTUiCiAgICAgICAgPgogICAgICAgICAgPHVzZQogICAgICAgICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgICAgICAgICAgeGxpbms6aHJlZj0iI29wLXNlcmllcy12ZXJ0aWNhbC1zdGFtcCIKICAgICAgICAgICAgZmlsbCQ9IltbX2ZpbGxdXSIKICAgICAgICAgICAgc3Ryb2tlJD0iW1tfc3Ryb2tlXV0iCiAgICAgICAgICAgIGNsYXNzJD0ie3tfZmFkZWRDbGFzcyhmYWRlZCwgJ3NlcmllcycpfX0iCiAgICAgICAgICAgIHg9IjAiCiAgICAgICAgICAgIHk9IjIiCiAgICAgICAgICA+PC91c2U+CiAgICAgICAgPC9zdmc+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shdmVydGljYWxdXSI+CiAgICAgICAgPHN2ZwogICAgICAgICAgaGVpZ2h0JD0iW1toZWlnaHRdXSIKICAgICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWlkIG1lZXQiCiAgICAgICAgICB2aWV3Qm94PSIwIDAgMjQgMTAiCiAgICAgICAgPgogICAgICAgICAgPHVzZQogICAgICAgICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgICAgICAgICAgeGxpbms6aHJlZj0iI29wLXNlcmllcy1ob3Jpem9udGFsLXN0YW1wIgogICAgICAgICAgICBmaWxsJD0iW1tfZmlsbF1dIgogICAgICAgICAgICBzdHJva2UkPSJbW19zdHJva2VdXSIKICAgICAgICAgICAgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGZhZGVkLCAnc2VyaWVzJyl9fSIKICAgICAgICAgICAgeD0iMCIKICAgICAgICAgICAgeT0iMSIKICAgICAgICAgID48L3VzZT4KICAgICAgICA8L3N2Zz4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdGVtcGxhdGU+CiAgYCx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSwkV3QucHJvdG90eXBlLCJ0eXBlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sJFd0LnByb3RvdHlwZSwidmVydGljYWwiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sJFd0LnByb3RvdHlwZSwiZmlsbE92ZXJyaWRlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLCRXdC5wcm90b3R5cGUsInN0cm9rZU92ZXJyaWRlIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLCRXdC5wcm90b3R5cGUsImhlaWdodCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLCRXdC5wcm90b3R5cGUsImZhZGVkIix2b2lkIDApLHQoW3MoInR5cGUiLCJmaWxsT3ZlcnJpZGUiKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSwkV3QucHJvdG90eXBlLCJfZmlsbCIsbnVsbCksdChbcygidHlwZSIsInN0cm9rZU92ZXJyaWRlIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sJFd0LnByb3RvdHlwZSwiX3N0cm9rZSIsbnVsbCksJFd0PXQoW2koInRmLWdyYXBoLWljb24iKV0sJFd0KTt2YXIgS1d0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldCBHcmFwaEljb25UeXBlKCl7cmV0dXJuIFhXdH19KTtmdW5jdGlvbiBaV3QodCxlKXtjb25zdCBuPXQuZ2V0Q29udGV4dE1lbnUoKSxpPVN1KHQuZ2V0Q29udGV4dE1lbnUoKSk7cmV0dXJuIGZ1bmN0aW9uKHIsbyl7bGV0IGE9dXU7Y29uc3Qgcz0oZnVuY3Rpb24gbCh0KXtsZXQgZT0wLG49MCxpPXQ7Zm9yKDtpJiZpLm9mZnNldExlZnQ+PTAmJmkub2Zmc2V0VG9wPj0wOyllKz1pLm9mZnNldExlZnQtaS5zY3JvbGxMZWZ0LG4rPWkub2Zmc2V0VG9wLWkuc2Nyb2xsVG9wLGk9aS5vZmZzZXRQYXJlbnQ7cmV0dXJue2xlZnQ6ZSx0b3A6bn19KSh0KTtmdW5jdGlvbiBjKHQpe3QmJnQuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXMobil8fChpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixjLHtjYXB0dXJlOiEwfSkpfWkuc3R5bGUoImRpc3BsYXkiLCJibG9jayIpLnN0eWxlKCJsZWZ0IixhLmNsaWVudFgtcy5sZWZ0KzErInB4Iikuc3R5bGUoInRvcCIsYS5jbGllbnRZLXMudG9wKzErInB4IiksYS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcFByb3BhZ2F0aW9uKCksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLGMse2NhcHR1cmU6ITB9KSxpLmh0bWwoIiIpLGkuYXBwZW5kKCJ1bCIpLnNlbGVjdEFsbCgibGkiKS5kYXRhKGUpLmVudGVyKCkuYXBwZW5kKCJsaSIpLm9uKCJjbGljayIsKCh0LGUpPT57dC5hY3Rpb24odGhpcyxyLG8pLGMoKX0pKS5odG1sKChmdW5jdGlvbih0KXtyZXR1cm4gdC50aXRsZShyKX0pKX19bGV0IEpXdD1hRSgpLmRvbWFpbihbTUd0LDEyXSkucmFuZ2UoWyJzbWFsbCIsIm1lZGl1bSIsImxhcmdlIiwieGxhcmdlIl0pO2Z1bmN0aW9uIFFXdCh0KXtyZXR1cm4gdC52KyItLSIrdC53fWZ1bmN0aW9uIHRxdCh0LGUpe2xldCBuPWUuZ2V0Tm9kZUJ5TmFtZSh0LnYpO2lmKG51bGw9PW4ub3V0cHV0U2hhcGVzfHxTZS5leHBvcnRzLmlzRW1wdHkobi5vdXRwdXRTaGFwZXMpKXJldHVybiBudWxsO2xldCBpPW4ub3V0cHV0U2hhcGVzW3Qub3V0cHV0VGVuc29yS2V5XTtyZXR1cm4gbnVsbD09aT9udWxsOjA9PT1pLmxlbmd0aD8ic2NhbGFyIjppLm1hcCgodD0+LTE9PT10PyI/Ijp0KSkuam9pbigiw5ciKX1mdW5jdGlvbiBlcXQodCxlKXtyZXR1cm4gZS5lZGdlTGFiZWxGdW5jdGlvbj9lLmVkZ2VMYWJlbEZ1bmN0aW9uKHQsZSk6dC5iYXNlRWRnZUxpc3QubGVuZ3RoPjE/dC5iYXNlRWRnZUxpc3QubGVuZ3RoKyIgdGVuc29ycyI6dHF0KHQuYmFzZUVkZ2VMaXN0WzBdLGUpfWZ1bmN0aW9uIG5xdCh0LGUsbil7Y29uc3QgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoYkd0LCJwYXRoIik7Zm9yKGxldCByPTE7cjx0Lmxlbmd0aDtyKyspaWYoaS5zZXRBdHRyaWJ1dGUoImQiLG4odC5zbGljZSgwLHIpKSksaS5nZXRUb3RhbExlbmd0aCgpPmUpcmV0dXJuIHItMTtyZXR1cm4gdC5sZW5ndGgtMX1mdW5jdGlvbiBpcXQodCxlLG4pe2xldCBpPXVMKCkueCgodD0+dC54KSkueSgodD0+dC55KSkscj1TdShkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwicGF0aCIpKS5hdHRyKCJkIixpKHQpKSxvPStlLmF0dHIoIm1hcmtlcldpZHRoIiksYT1lLmF0dHIoInZpZXdCb3giKS5zcGxpdCgiICIpLm1hcChOdW1iZXIpLHM9YVsyXS1hWzBdLGw9K2UuYXR0cigicmVmWCIpLGM9ci5ub2RlKCk7aWYobil7Y29uc3QgZT1vKigxLWwvcyksbj1jLmdldFBvaW50QXRMZW5ndGgoZSkscj1ucXQodCxlLGkpO3JldHVybiB0W3ItMV09e3g6bi54LHk6bi55fSx0LnNsaWNlKHItMSl9e2NvbnN0IGU9MS1sL3Msbj1jLmdldFRvdGFsTGVuZ3RoKCktbyplLHI9Yy5nZXRQb2ludEF0TGVuZ3RoKG4pLGE9bnF0KHQsbixpKTtyZXR1cm4gdFthXT17eDpyLngseTpyLnl9LHQuc2xpY2UoMCxhKzEpfX1mdW5jdGlvbiBycXQodCxlLG4saSl7aT1pfHx2R3QuRWRnZS5MSU5FLGUubGFiZWwmJmUubGFiZWwuc3RydWN0dXJhbCYmKGkrPSIgIit2R3QuRWRnZS5TVFJVQ1RVUkFMKSxlLmxhYmVsJiZlLmxhYmVsLm1ldGFlZGdlJiZlLmxhYmVsLm1ldGFlZGdlLm51bVJlZkVkZ2VzJiYoaSs9IiAiK3ZHdC5FZGdlLlJFRkVSRU5DRV9FREdFKSxuLmhhbmRsZUVkZ2VTZWxlY3RlZCYmKGkrPSIgIit2R3QuRWRnZS5TRUxFQ1RBQkxFKTtsZXQgcixvPSJwYXRoXyIrUVd0KGUpO2lmKG4ucmVuZGVySGllcmFyY2h5LmVkZ2VXaWR0aEZ1bmN0aW9uKXI9bi5yZW5kZXJIaWVyYXJjaHkuZWRnZVdpZHRoRnVuY3Rpb24oZSxpKTtlbHNle2xldCB0PTE7bnVsbCE9ZS5sYWJlbCYmbnVsbCE9ZS5sYWJlbC5tZXRhZWRnZSYmKHQ9ZS5sYWJlbC5tZXRhZWRnZS50b3RhbFNpemUpLHI9bi5yZW5kZXJIaWVyYXJjaHkuZWRnZVdpZHRoU2l6ZWRCYXNlZFNjYWxlKHQpfWxldCBhPXQuYXBwZW5kKCJwYXRoIikuYXR0cigiaWQiLG8pLmF0dHIoImNsYXNzIixpKS5zdHlsZSgic3Ryb2tlLXdpZHRoIixyKyJweCIpO2lmKGUubGFiZWwmJmUubGFiZWwubWV0YWVkZ2UpaWYoZS5sYWJlbC5tZXRhZWRnZS5udW1SZWZFZGdlcyl7Y29uc3QgdD1gcmVmZXJlbmNlLWFycm93aGVhZC0ke0pXdChyKX1gO2Euc3R5bGUoIm1hcmtlci1zdGFydCIsYHVybCgjJHt0fSlgKSxlLmxhYmVsLnN0YXJ0TWFya2VySWQ9dH1lbHNle2NvbnN0IHQ9YGRhdGFmbG93LWFycm93aGVhZC0ke0pXdChyKX1gO2Euc3R5bGUoIm1hcmtlci1lbmQiLGB1cmwoIyR7dH0pYCksZS5sYWJlbC5lbmRNYXJrZXJJZD10fWlmKG51bGw9PWUubGFiZWx8fG51bGw9PWUubGFiZWwubWV0YWVkZ2UpcmV0dXJuO2xldCBzPWVxdChlLmxhYmVsLm1ldGFlZGdlLG4ucmVuZGVySGllcmFyY2h5KTtudWxsIT1zJiZ0LmFwcGVuZCgidGV4dCIpLmFwcGVuZCgidGV4dFBhdGgiKS5hdHRyKCJ4bGluazpocmVmIiwiIyIrbykuYXR0cigic3RhcnRPZmZzZXQiLCI1MCUiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLmF0dHIoImRvbWluYW50LWJhc2VsaW5lIiwiY2VudHJhbCIpLnRleHQocyl9bGV0IG9xdD11TCgpLmN1cnZlKCRMKS54KCh0PT50LngpKS55KCh0PT50LnkpKTt2YXIgYXF0O2Z1bmN0aW9uIHNxdCh0LGUsbil7bGV0IGk9d0d0KHQsImciLHZHdC5Ob2RlLkNPTlRBSU5FUikuc2VsZWN0QWxsKChmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9KSkuZGF0YShlLCh0PT50Lm5vZGUubmFtZSsiOiIrdC5ub2RlLnR5cGUpKTtyZXR1cm4gaS5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImRhdGEtbmFtZSIsKHQ9PnQubm9kZS5uYW1lKSkuZWFjaCgoZnVuY3Rpb24odCl7bGV0IGU9U3UodGhpcyk7bi5hZGROb2RlR3JvdXAodC5ub2RlLm5hbWUsZSl9KSkubWVyZ2UoaSkuYXR0cigiY2xhc3MiLCh0PT52R3QuTm9kZS5HUk9VUCsiICIreXF0KHQpKSkuZWFjaCgoZnVuY3Rpb24odCl7bGV0IGU9U3UodGhpcyk7QXF0KHdHdChlLCJnIix2R3QuQW5ub3RhdGlvbi5JTkJPWCksdC5pbkFubm90YXRpb25zLHQsbiksQXF0KHdHdChlLCJnIix2R3QuQW5ub3RhdGlvbi5PVVRCT1gpLHQub3V0QW5ub3RhdGlvbnMsdCxuKTtsZXQgaT1fcXQoZSx0LHZHdC5Ob2RlLlNIQVBFKTt0Lm5vZGUuaXNHcm91cE5vZGUmJihmdW5jdGlvbiByKHQsZSxuKXtsZXQgaT13R3QodCwiZyIsdkd0Lk5vZGUuQlVUVE9OX0NPTlRBSU5FUik7d0d0KGksImNpcmNsZSIsdkd0Lk5vZGUuQlVUVE9OX0NJUkNMRSksd0d0KGksInBhdGgiLHZHdC5Ob2RlLkVYUEFORF9CVVRUT04pLmF0dHIoImQiLCJNMCwtMi4yIFYyLjIgTS0yLjIsMCBIMi4yIiksd0d0KGksInBhdGgiLHZHdC5Ob2RlLkNPTExBUFNFX0JVVFRPTikuYXR0cigiZCIsIk0tMi4yLDAgSDIuMiIpLGkub24oImNsaWNrIiwodD0+e3V1LnN0b3BQcm9wYWdhdGlvbigpLG4uZmlyZSgibm9kZS10b2dnbGUtZXhwYW5kIix7bmFtZTp0Lm5vZGUubmFtZX0pfSkpLChmdW5jdGlvbiByKHQsZSl7bGV0IG49RFd0KGUpKyhlLmV4cGFuZGVkP2Uud2lkdGg6ZS5jb3JlQm94LndpZHRoKS8yLTYsaT1lLnktKGUuZXhwYW5kZWQ/ZS5oZWlnaHQ6ZS5jb3JlQm94LmhlaWdodCkvMis2O2Uubm9kZS50eXBlIT09akd0LlNFUklFU3x8ZS5leHBhbmRlZHx8KG4rPTEwLGktPTIpO2xldCByPSJ0cmFuc2xhdGUoIituKyIsIitpKyIpIjt0LnNlbGVjdEFsbCgicGF0aCIpLnRyYW5zaXRpb24oKS5hdHRyKCJ0cmFuc2Zvcm0iLHIpLHQuc2VsZWN0KCJjaXJjbGUiKS50cmFuc2l0aW9uKCkuYXR0cih7Y3g6bixjeTppLHI6Tld0Lm5vZGVTaXplLm1ldGEuZXhwYW5kQnV0dG9uUmFkaXVzfSl9KShpLGUpfSkoaSx0LG4pLGNxdChpLHQsbiksKGZ1bmN0aW9uIG8odCxlLG4pe2lmKGUubm9kZS5pc0dyb3VwTm9kZSl7aWYoZS5leHBhbmRlZClyZXR1cm4gTHF0KHQsZSxuLHZHdC5TdWJzY2VuZS5HUk9VUCk7Rld0KHQsImciLHZHdC5TdWJzY2VuZS5HUk9VUCkucmVtb3ZlKCl9fSkoZSx0LG4pLGNxdCgoZnVuY3Rpb24gYSh0LGUsbil7bGV0IGk9ZS5kaXNwbGF5TmFtZSxyPWUubm9kZS50eXBlPT09akd0Lk1FVEEmJiFlLmV4cGFuZGVkLG89d0d0KHQsInRleHQiLHZHdC5Ob2RlLkxBQkVMKSxhPW8ubm9kZSgpO2EucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChhKSxvLmF0dHIoImR5IiwiLjM1ZW0iKS5hdHRyKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpO2xldCBzPTg7c3dpdGNoKGUubm9kZS50eXBlKXtjYXNlIGpHdC5NRVRBOnM9ZS5leHBhbmRlZD85Ojg7YnJlYWs7Y2FzZSBqR3QuT1A6cz02fWlmKHIpe2kubGVuZ3RoPm4ubWF4TWV0YW5vZGVMYWJlbExlbmd0aCYmKGk9aS5zdWJzdHIoMCxuLm1heE1ldGFub2RlTGFiZWxMZW5ndGgtMikrIuKApiIpO2xldCB0PShmdW5jdGlvbiBsKHQpe3JldHVybiBtcXR8fChtcXQ9Vk0oKS5kb21haW4oW3QubWF4TWV0YW5vZGVMYWJlbExlbmd0aExhcmdlRm9udCx0Lm1heE1ldGFub2RlTGFiZWxMZW5ndGhdKS5yYW5nZShbdC5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemUsdC5taW5NZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemVdKS5jbGFtcCghMCkpLG1xdH0pKG4pO28uYXR0cigiZm9udC1zaXplIix0KGkubGVuZ3RoKSsicHgiKSxzPXQoaS5sZW5ndGgpfXJldHVybiBmcXQoby50ZXh0KGkpLGUubm9kZS50eXBlLHMsZSksb30pKGUsdCxuKSx0LG4sdC5ub2RlLnR5cGU9PT1qR3QuTUVUQSksd3F0KGUsdCxuKSwoZnVuY3Rpb24gcyh0LGUpe2xldCBuPUZXdCh0LCJnIix2R3QuTm9kZS5TSEFQRSksaT1EV3QoZSk7c3dpdGNoKGUubm9kZS50eXBlKXtjYXNlIGpHdC5PUDp7Y29uc3Qgcj1lLm5vZGU7U2UuZXhwb3J0cy5pc051bWJlcihyLmZ1bmN0aW9uSW5wdXRJbmRleCl8fFNlLmV4cG9ydHMuaXNOdW1iZXIoci5mdW5jdGlvbk91dHB1dEluZGV4KT8oZnVuY3Rpb24gcih0LGUsbixpLG8pe2NvbnN0IGE9by8yLHM9aS8yLGw9W1tlLG4tYV0sW2UrcyxuK2FdLFtlLXMsbithXV07dC50cmFuc2l0aW9uKCkuYXR0cigicG9pbnRzIixsLm1hcCgodD0+dC5qb2luKCIsIikpKS5qb2luKCIgIikpfSkoRld0KG4sInBvbHlnb24iKSxlLngsZS55LGUuY29yZUJveC53aWR0aCxlLmNvcmVCb3guaGVpZ2h0KTpXV3QoRld0KG4sImVsbGlwc2UiKSxpLGUueSxlLmNvcmVCb3gud2lkdGgsZS5jb3JlQm94LmhlaWdodCksZ3F0KHQsaSxlLnksZS5sYWJlbE9mZnNldCk7YnJlYWt9Y2FzZSBqR3QuTUVUQTp7bGV0IHI9bi5zZWxlY3RBbGwoInJlY3QiKTtlLmV4cGFuZGVkPyhHV3QocixlLngsZS55LGUud2lkdGgsZS5oZWlnaHQpLGxxdCh0LGUpLGdxdCh0LGksZS55LC1lLmhlaWdodC8yK2UubGFiZWxIZWlnaHQvMikpOihHV3QocixpLGUueSxlLmNvcmVCb3gud2lkdGgsZS5jb3JlQm94LmhlaWdodCksZ3F0KHQsaSxlLnksMCkpO2JyZWFrfWNhc2Ugakd0LlNFUklFUzp7bGV0IHI9Rld0KG4sInVzZSIpO2UuZXhwYW5kZWQ/KEdXdChyLGUueCxlLnksZS53aWR0aCxlLmhlaWdodCksbHF0KHQsZSksZ3F0KHQsaSxlLnksLWUuaGVpZ2h0LzIrZS5sYWJlbEhlaWdodC8yKSk6KEdXdChyLGksZS55LGUuY29yZUJveC53aWR0aCxlLmNvcmVCb3guaGVpZ2h0KSxncXQodCxpLGUueSxlLmxhYmVsT2Zmc2V0KSk7YnJlYWt9Y2FzZSBqR3QuQlJJREdFOkdXdChGV3QobiwicmVjdCIpLGUueCxlLnksZS53aWR0aCxlLmhlaWdodCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIG5vZGUgdHlwZTogIitlLm5vZGUudHlwZSl9fSkoZSx0KX0pKSxpLmV4aXQoKS5lYWNoKChmdW5jdGlvbih0KXtuLnJlbW92ZU5vZGVHcm91cCh0Lm5vZGUubmFtZSk7bGV0IGU9U3UodGhpcyk7dC5pbkFubm90YXRpb25zLmxpc3QubGVuZ3RoPjAmJmUuc2VsZWN0KCIuIit2R3QuQW5ub3RhdGlvbi5JTkJPWCkuc2VsZWN0QWxsKCIuIit2R3QuQW5ub3RhdGlvbi5HUk9VUCkuZWFjaCgoZT0+e24ucmVtb3ZlQW5ub3RhdGlvbkdyb3VwKGUsdCl9KSksdC5vdXRBbm5vdGF0aW9ucy5saXN0Lmxlbmd0aD4wJiZlLnNlbGVjdCgiLiIrdkd0LkFubm90YXRpb24uT1VUQk9YKS5zZWxlY3RBbGwoIi4iK3ZHdC5Bbm5vdGF0aW9uLkdST1VQKS5lYWNoKChlPT57bi5yZW1vdmVBbm5vdGF0aW9uR3JvdXAoZSx0KX0pKX0pKS5yZW1vdmUoKSxpfWZ1bmN0aW9uIGxxdCh0LGUpe2xldCBuPWUueC1lLndpZHRoLzIrZS5wYWRkaW5nTGVmdCxpPWUueS1lLmhlaWdodC8yK2UucGFkZGluZ1RvcDtqV3QoRld0KHQsImciLHZHdC5TdWJzY2VuZS5HUk9VUCksbixpKX1mdW5jdGlvbiBjcXQodCxlLG4saSl7aWYoaSlyZXR1cm4gdm9pZCB0LmF0dHIoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpO2xldCByPVpXdChuLHVxdChlLm5vZGUsbikpO3Qub24oImRibGNsaWNrIiwodD0+e24uZmlyZSgibm9kZS10b2dnbGUtZXhwYW5kIix7bmFtZTp0Lm5vZGUubmFtZX0pfSkpLm9uKCJtb3VzZW92ZXIiLCh0PT57bi5pc05vZGVFeHBhbmRlZCh0KXx8bi5maXJlKCJub2RlLWhpZ2hsaWdodCIse25hbWU6dC5ub2RlLm5hbWV9KX0pKS5vbigibW91c2VvdXQiLCh0PT57bi5pc05vZGVFeHBhbmRlZCh0KXx8bi5maXJlKCJub2RlLXVuaGlnaGxpZ2h0Iix7bmFtZTp0Lm5vZGUubmFtZX0pfSkpLm9uKCJjbGljayIsKHQ9Pnt1dS5zdG9wUHJvcGFnYXRpb24oKSxuLmZpcmUoIm5vZGUtc2VsZWN0Iix7bmFtZTp0Lm5vZGUubmFtZX0pfSkpLm9uKCJjb250ZXh0bWVudSIsKCh0LGUpPT57bi5maXJlKCJub2RlLXNlbGVjdCIse25hbWU6dC5ub2RlLm5hbWV9KSxyLmNhbGwodCxlKX0pKX1mdW5jdGlvbiB1cXQodCxlKXtsZXQgbj1be3RpdGxlOmU9PnVXdCh0LmluY2x1ZGUpLGFjdGlvbjoobixpLHIpPT57ZS5maXJlKCJub2RlLXRvZ2dsZS1leHRyYWN0Iix7bmFtZTp0Lm5hbWV9KX19XTtyZXR1cm4gZS5ub2RlQ29udGV4dE1lbnVJdGVtcyYmKG49bi5jb25jYXQoZS5ub2RlQ29udGV4dE1lbnVJdGVtcykpLGhxdCh0KSYmbi5wdXNoKHt0aXRsZTplPT5wcXQodCksYWN0aW9uOihuLGkscik9PntlLmZpcmUoIm5vZGUtdG9nZ2xlLXNlcmllc2dyb3VwIix7bmFtZTpkcXQodCl9KX19KSxufWZ1bmN0aW9uIGhxdCh0KXtyZXR1cm4gbnVsbCE9PWRxdCh0KX1mdW5jdGlvbiBkcXQodCl7cmV0dXJuIHQ/dC50eXBlPT09akd0LlNFUklFUz90Lm5hbWU6dC50eXBlPT09akd0Lk9QP3Qub3duaW5nU2VyaWVzOm51bGw6bnVsbH1mdW5jdGlvbiBwcXQodCl7cmV0dXJuKGZ1bmN0aW9uIG4odCl7cmV0dXJuIHQ9PT1XR3QuR1JPVVA/IlVuZ3JvdXAgdGhpcyBzZXJpZXMgb2Ygbm9kZXMiOiJHcm91cCB0aGlzIHNlcmllcyBvZiBub2RlcyJ9KShudWxsIT09KGZ1bmN0aW9uIGUodCl7bGV0IGU9bnVsbDtyZXR1cm4gdD8odC50eXBlPT09akd0LlNFUklFUz9lPXQ6dC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUudHlwZT09PWpHdC5TRVJJRVMmJihlPXQucGFyZW50Tm9kZSksZSk6bnVsbH0pKHQpP1dHdC5HUk9VUDpXR3QuVU5HUk9VUCl9ZnVuY3Rpb24gZnF0KHQsZSxuLGkpe2xldCByPXQubm9kZSgpLG89ci50ZXh0Q29udGVudCxhPW51bGw7c3dpdGNoKGUpe2Nhc2Ugakd0Lk1FVEE6aSYmIWkuZXhwYW5kZWQmJihhPU5XdC5ub2RlU2l6ZS5tZXRhLm1heExhYmVsV2lkdGgpO2JyZWFrO2Nhc2Ugakd0Lk9QOmE9Tld0Lm5vZGVTaXplLm9wLm1heExhYmVsV2lkdGg7YnJlYWs7Y2FzZS0xOmE9Tld0LmFubm90YXRpb25zLm1heExhYmVsV2lkdGh9aWYobnVsbCE9PWEpcmV0dXJuIHIudGV4dENvbnRlbnQ9KGZ1bmN0aW9uIHModCxlLG4pe2lmKCF0KXJldHVybiIiO2lmKEJHdCh0LGUpPD1uKXJldHVybiB0O2xldCBpPTAscj10Lmxlbmd0aDtmb3IoO2k8cjspe2NvbnN0IG89aStNYXRoLnJvdW5kKChyLWkpLzIpO0JHdCh0LnNsaWNlKDAsbykrIuKApiIsZSk8PW4/aT1vOnI9by0xfXJldHVybiAwPT09aT90WzBdOnQuc2xpY2UoMCxpKSsi4oCmIn0pKHIudGV4dENvbnRlbnQsbixhKSx0LmFwcGVuZCgidGl0bGUiKS50ZXh0KG8pfSEoZnVuY3Rpb24odCl7dC5OT05FPSJub25lIix0LkNPTVBVVEVfVElNRT0iY29tcHV0ZV90aW1lIix0LkRFVklDRT0iZGV2aWNlIix0Lk1FTU9SWT0ibWVtb3J5Iix0Lk9QX0NPTVBBVElCSUxJVFk9Im9wX2NvbXBhdGliaWxpdHkiLHQuU1RSVUNUVVJFPSJzdHJ1Y3R1cmUiLHQuWExBX0NMVVNURVI9InhsYV9jbHVzdGVyIn0pKGFxdHx8KGFxdD17fSkpO2xldCBtcXQ9bnVsbDtmdW5jdGlvbiBncXQodCxlLG4saSl7Rld0KHQsInRleHQiLHZHdC5Ob2RlLkxBQkVMKS50cmFuc2l0aW9uKCkuYXR0cigieCIsZSkuYXR0cigieSIsbitpKX1mdW5jdGlvbiBfcXQodCxlLG4pe2xldCBpPXdHdCh0LCJnIixuKTtzd2l0Y2goZS5ub2RlLnR5cGUpe2Nhc2Ugakd0Lk9QOmNvbnN0IHQ9ZS5ub2RlO2lmKFNlLmV4cG9ydHMuaXNOdW1iZXIodC5mdW5jdGlvbklucHV0SW5kZXgpfHxTZS5leHBvcnRzLmlzTnVtYmVyKHQuZnVuY3Rpb25PdXRwdXRJbmRleCkpe3dHdChpLCJwb2x5Z29uIix2R3QuTm9kZS5DT0xPUl9UQVJHRVQpO2JyZWFrfXdHdChpLCJlbGxpcHNlIix2R3QuTm9kZS5DT0xPUl9UQVJHRVQpO2JyZWFrO2Nhc2Ugakd0LlNFUklFUzpsZXQgbj0iYW5ub3RhdGlvbiIscj1lO3IuY29yZUdyYXBoJiYobj1yLm5vZGUuaGFzTm9uQ29udHJvbEVkZ2VzPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwiKTtsZXQgbz1bdkd0Lk5vZGUuQ09MT1JfVEFSR0VUXTtyLmlzRmFkZWRPdXQmJm8ucHVzaCgiZmFkZWQtZWxsaXBzZSIpLHdHdChpLCJ1c2UiLG8pLmF0dHIoInhsaW5rOmhyZWYiLCIjb3Atc2VyaWVzLSIrbisiLXN0YW1wIiksd0d0KGksInJlY3QiLHZHdC5Ob2RlLkNPTE9SX1RBUkdFVCkuYXR0cigicngiLGUucmFkaXVzKS5hdHRyKCJyeSIsZS5yYWRpdXMpO2JyZWFrO2Nhc2Ugakd0LkJSSURHRTpjYXNlIGpHdC5NRVRBOndHdChpLCJyZWN0Iix2R3QuTm9kZS5DT0xPUl9UQVJHRVQpLmF0dHIoInJ4IixlLnJhZGl1cykuYXR0cigicnkiLGUucmFkaXVzKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJVbnJlY29nbml6ZWQgbm9kZSB0eXBlOiAiK2Uubm9kZS50eXBlKX1yZXR1cm4gaX1mdW5jdGlvbiB5cXQodCl7c3dpdGNoKHQubm9kZS50eXBlKXtjYXNlIGpHdC5PUDpyZXR1cm4gdkd0Lk9QTk9ERTtjYXNlIGpHdC5NRVRBOnJldHVybiB2R3QuTUVUQU5PREU7Y2FzZSBqR3QuU0VSSUVTOnJldHVybiB2R3QuU0VSSUVTTk9ERTtjYXNlIGpHdC5CUklER0U6cmV0dXJuIHZHdC5CUklER0VOT0RFO2Nhc2Ugakd0LkVMTElQU0lTOnJldHVybiB2R3QuRUxMSVBTSVNOT0RFfXRocm93IEVycm9yKCJVbnJlY29nbml6ZWQgbm9kZSB0eXBlOiAiK3Qubm9kZS50eXBlKX1mdW5jdGlvbiB2cXQodCxlLG4pe2xldCBpPShmdW5jdGlvbiByKHQpe3JldHVybiB0LnJlcGxhY2UoLyhbOi5cW1xdLC9cXFwoXCldKS9nLCJcXCQxIil9KSh0KTtpZighbilyZXR1cm5gdXJsKCMke2l9KWA7bGV0IG89U3UobiksYT1vLnNlbGVjdCgiZGVmcyNfZ3JhcGgtZ3JhZGllbnRzIik7YS5lbXB0eSgpJiYoYT1vLmFwcGVuZCgiZGVmcyIpLmF0dHIoImlkIiwiX2dyYXBoLWdyYWRpZW50cyIpKTtsZXQgcz1hLnNlbGVjdCgibGluZWFyR3JhZGllbnQjIitpKTtpZihzLmVtcHR5KCkpe3M9YS5hcHBlbmQoImxpbmVhckdyYWRpZW50IikuYXR0cigiaWQiLHQpLHMuc2VsZWN0QWxsKCIqIikucmVtb3ZlKCk7bGV0IG49MDtTZS5leHBvcnRzLmVhY2goZSwodD0+e2xldCBlPXQuY29sb3I7cy5hcHBlbmQoInN0b3AiKS5hdHRyKCJvZmZzZXQiLG4pLmF0dHIoInN0b3AtY29sb3IiLGUpLHMuYXBwZW5kKCJzdG9wIikuYXR0cigib2Zmc2V0IixuK3QucHJvcG9ydGlvbikuYXR0cigic3RvcC1jb2xvciIsZSksbis9dC5wcm9wb3J0aW9ufSkpfXJldHVybmB1cmwoIyR7aX0pYH1mdW5jdGlvbiBicXQodCl7U3UodCkuc2VsZWN0KCJkZWZzI19ncmFwaC1ncmFkaWVudHMiKS5yZW1vdmUoKX1mdW5jdGlvbiB4cXQodCxlLG4saSxyKXtsZXQgbz1wV3Q7c3dpdGNoKHQ9dHx8KCgpPT4wKSxlKXtjYXNlIGFxdC5OT05FOmNhc2UgYXF0LlNUUlVDVFVSRTppZihuLm5vZGUudHlwZT09PWpHdC5NRVRBKXtsZXQgcj1uLm5vZGUudGVtcGxhdGVJZDtyZXR1cm4gZT09PWFxdC5TVFJVQ1RVUkUmJm51bGwhPT1yP28uU1RSVUNUVVJFX1BBTEVUVEUodChyKSxpKTpvLlVOS05PV059cmV0dXJuIG4ubm9kZS50eXBlPT09akd0LlNFUklFUz9pP28uRVhQQU5ERURfQ09MT1I6IndoaXRlIjpuLm5vZGUudHlwZT09PWpHdC5CUklER0U/bi5zdHJ1Y3R1cmFsPyIjZjBlIjpuLm5vZGUuaW5ib3VuZD8iIzBlZiI6IiNmZTAiOlNlLmV4cG9ydHMuaXNOdW1iZXIobi5ub2RlLmZ1bmN0aW9uSW5wdXRJbmRleCk/IiM3OTU1NDgiOlNlLmV4cG9ydHMuaXNOdW1iZXIobi5ub2RlLmZ1bmN0aW9uT3V0cHV0SW5kZXgpPyIjMDA5Njg4Ijoid2hpdGUiO2Nhc2UgYXF0LkRFVklDRTpyZXR1cm4gbnVsbD09bi5kZXZpY2VDb2xvcnM/by5VTktOT1dOOmk/by5FWFBBTkRFRF9DT0xPUjp2cXQoImRldmljZS0iK24ubm9kZS5uYW1lLG4uZGV2aWNlQ29sb3JzLHIpO2Nhc2UgYXF0LlhMQV9DTFVTVEVSOnJldHVybiBudWxsPT1uLnhsYUNsdXN0ZXJDb2xvcnM/by5VTktOT1dOOmk/by5FWFBBTkRFRF9DT0xPUjp2cXQoInhsYS0iK24ubm9kZS5uYW1lLG4ueGxhQ2x1c3RlckNvbG9ycyxyKTtjYXNlIGFxdC5DT01QVVRFX1RJTUU6cmV0dXJuIGk/by5FWFBBTkRFRF9DT0xPUjpuLmNvbXB1dGVUaW1lQ29sb3J8fG8uVU5LTk9XTjtjYXNlIGFxdC5NRU1PUlk6cmV0dXJuIGk/by5FWFBBTkRFRF9DT0xPUjpuLm1lbW9yeUNvbG9yfHxvLlVOS05PV047Y2FzZSBhcXQuT1BfQ09NUEFUSUJJTElUWTpyZXR1cm4gbnVsbD09bi5jb21wYXRpYmlsaXR5Q29sb3JzP28uVU5LTk9XTjppP28uRVhQQU5ERURfQ09MT1I6dnF0KCJvcC1jb21wYXQtIituLm5vZGUubmFtZSxuLmNvbXBhdGliaWxpdHlDb2xvcnMscik7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gY2FzZSB0byBjb2xvciBub2RlcyBieSIpfX1mdW5jdGlvbiB3cXQodCxlLG4saSl7aT1pfHx2R3QuTm9kZS5TSEFQRTtjb25zdCByPW4uaXNOb2RlSGlnaGxpZ2h0ZWQoZS5ub2RlLm5hbWUpLG89bi5pc05vZGVTZWxlY3RlZChlLm5vZGUubmFtZSksYT1lLmlzSW5FeHRyYWN0fHxlLmlzT3V0RXh0cmFjdHx8ZS5pc0xpYnJhcnlGdW5jdGlvbixzPWUuZXhwYW5kZWQmJmkhPT12R3QuQW5ub3RhdGlvbi5OT0RFLGw9ZS5pc0ZhZGVkT3V0O3QuY2xhc3NlZCgiaGlnaGxpZ2h0ZWQiLHIpLHQuY2xhc3NlZCgic2VsZWN0ZWQiLG8pLHQuY2xhc3NlZCgiZXh0cmFjdCIsYSksdC5jbGFzc2VkKCJleHBhbmRlZCIscyksdC5jbGFzc2VkKCJmYWRlZCIsbCk7Y29uc3QgYz10LnNlbGVjdCgiLiIraSsiIC4iK3ZHdC5Ob2RlLkNPTE9SX1RBUkdFVCksdT14cXQobi50ZW1wbGF0ZUluZGV4LG4uY29sb3JCeSxlLHMsbi5nZXRHcmFwaFN2Z1Jvb3QoKSk7Yy5zdHlsZSgiZmlsbCIsdSksYy5zdHlsZSgic3Ryb2tlIixvP251bGw6U3F0KHUpKX1mdW5jdGlvbiBTcXQodCl7cmV0dXJuInVybCI9PT10LnN1YnN0cmluZygwLDMpP3BXdC5HUkFESUVOVF9PVVRMSU5FOlVoKHQpLmRhcmtlcigpLnRvU3RyaW5nKCl9ZnVuY3Rpb24gTXF0KHQsZSxuLGkpe2NvbnN0IHI9U3UodCk7aWYoci5zZWxlY3RBbGwoIi5pbnB1dC1oaWdobGlnaHQiKS5jbGFzc2VkKCJpbnB1dC1oaWdobGlnaHQiLCExKSxyLnNlbGVjdEFsbCgiLm5vbi1pbnB1dCIpLmNsYXNzZWQoIm5vbi1pbnB1dCIsITEpLHIuc2VsZWN0QWxsKCIuaW5wdXQtcGFyZW50IikuY2xhc3NlZCgiaW5wdXQtcGFyZW50IiwhMSksci5zZWxlY3RBbGwoIi5pbnB1dC1jaGlsZCIpLmNsYXNzZWQoImlucHV0LWNoaWxkIiwhMSksci5zZWxlY3RBbGwoIi5pbnB1dC1lZGdlLWhpZ2hsaWdodCIpLmNsYXNzZWQoImlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMSksci5zZWxlY3RBbGwoIi5ub24taW5wdXQtZWRnZS1oaWdobGlnaHQiKS5jbGFzc2VkKCJub24taW5wdXQtZWRnZS1oaWdobGlnaHQiLCExKSxyLnNlbGVjdEFsbCgiLmlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZCIpLmNsYXNzZWQoImlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZCIsITEpLCFlfHwhaXx8IW4pcmV0dXJuO2xldCBvPUVxdChuLGUpLGE9e307U2UuZXhwb3J0cy5lYWNoKG8sKGZ1bmN0aW9uKG4pe2E9VHF0KHQsZSxuLGEpfSkpO2xldCBzPU9iamVjdC5rZXlzKGEpLGw9KGZ1bmN0aW9uIGModCxlKXtsZXQgbj17fTtyZXR1cm4gU2UuZXhwb3J0cy5lYWNoKGUsKGZ1bmN0aW9uKGUpe2xldCBpPXQuZ2V0Tm9kZUJ5TmFtZShlKSxyPUNxdCh0LGkpO25bci5uYW1lXT1yfSkpLG59KShlLHMpOyEoZnVuY3Rpb24gdSh0LGUpe1NlLmV4cG9ydHMuZm9yT3duKGUsKGZ1bmN0aW9uKGUpe2xldCBuPWU7Zm9yKDtuLm5hbWUhPT1GR3Q7KXtjb25zdCBlPVN1KHQpLnNlbGVjdChgLm5vZGVbZGF0YS1uYW1lPSIke24ubmFtZX0iXWApOyFlLm5vZGVzKCkubGVuZ3RofHxlLmNsYXNzZWQoImlucHV0LWhpZ2hsaWdodCIpfHxlLmNsYXNzZWQoInNlbGVjdGVkIil8fGUuY2xhc3NlZCgib3AiKXx8ZS5jbGFzc2VkKCJpbnB1dC1wYXJlbnQiLCEwKSxuPW4ucGFyZW50Tm9kZX19KSl9KSh0LGwpLHIuc2VsZWN0QWxsKCJnLm5vZGU6bm90KC5zZWxlY3RlZCk6bm90KC5pbnB1dC1oaWdobGlnaHQpOm5vdCguaW5wdXQtcGFyZW50KTpub3QoLmlucHV0LWNoaWxkcmVuKSIpLmNsYXNzZWQoIm5vbi1pbnB1dCIsITApLmVhY2goKGZ1bmN0aW9uKHQpe3Iuc2VsZWN0QWxsKGBbZGF0YS1uYW1lPSIke3Qubm9kZS5uYW1lfSJdYCkuY2xhc3NlZCgibm9uLWlucHV0IiwhMCl9KSksci5zZWxlY3RBbGwoImcuZWRnZTpub3QoLmlucHV0LWVkZ2UtaGlnaGxpZ2h0KSIpLmNsYXNzZWQoIm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApfWZ1bmN0aW9uIEVxdCh0LGUpe2xldCBuPVtdLGk9ZS5nZXROb2RlQnlOYW1lKHQpO2lmKGkgaW5zdGFuY2VvZiBYR3QpcmV0dXJuW2ldLmNvbmNhdChpLmluRW1iZWRkaW5ncyk7bGV0IHI9aS5tZXRhZ3JhcGgubm9kZXMoKTtyZXR1cm4gU2UuZXhwb3J0cy5lYWNoKHIsKGZ1bmN0aW9uKHQpe249bi5jb25jYXQoRXF0KHQsZSkpfSkpLG59ZnVuY3Rpb24gVHF0KHQsZSxuLGkpe2lmKGlbbi5uYW1lXSlyZXR1cm4gaTtpW24ubmFtZV09ITA7bGV0IHI9bi5pbnB1dHMsbz1DcXQoZSxuKTtTdSh0KS5zZWxlY3QoYC5ub2RlW2RhdGEtbmFtZT0iJHtvLm5hbWV9Il1gKS5jbGFzc2VkKCJpbnB1dC1oaWdobGlnaHQiLCEwKTtsZXQgYT17fTtTZS5leHBvcnRzLmVhY2gociwoZnVuY3Rpb24odCl7bGV0IG49ZS5nZXROb2RlQnlOYW1lKHQubmFtZSk7aWYodm9pZCAwPT09bilyZXR1cm47aWYobiBpbnN0YW5jZW9mIEtHdCl7bGV0IHQ9c1d0KG4ubmFtZSk7bj1lLmdldE5vZGVCeU5hbWUodCl9bGV0IGk9Q3F0KGUsbikscj1hW2kubmFtZV07cj9yLm9wTm9kZXMucHVzaChuKTphW2kubmFtZV09e3Zpc2libGVQYXJlbnQ6aSxvcE5vZGVzOltuXX19KSk7bGV0IHM9e30sbD1bb107c1tvLm5hbWVdPXt0cmFjZWQ6ITEsaW5kZXg6MCxjb25uZWN0aW9uRW5kcG9pbnRzOltdfTtsZXQgYz1vO2ZvcihsZXQgdD0xO2MubmFtZSE9PUZHdDt0KyspYz1jLnBhcmVudE5vZGUsc1tjLm5hbWVdPXt0cmFjZWQ6ITEsaW5kZXg6dCxjb25uZWN0aW9uRW5kcG9pbnRzOltdfSxsW3RdPWM7cmV0dXJuIFNlLmV4cG9ydHMuZm9yT3duKGEsKGZ1bmN0aW9uKG4scil7bGV0IGE9bi52aXNpYmxlUGFyZW50O1NlLmV4cG9ydHMuZWFjaChuLm9wTm9kZXMsKGZ1bmN0aW9uKG4pe2k9VHF0KHQsZSxuLGkpfSkpLGEubmFtZSE9PW8ubmFtZSYmKGZ1bmN0aW9uIGModCxlLG4saSl7bGV0IHI9ZSxvPWUsYT1bXTtmb3IoOyFuW3IubmFtZV07KW8ubmFtZSE9PXIubmFtZSYmYS5wdXNoKFtvLHJdKSxvPXIscj1yLnBhcmVudE5vZGU7bGV0IHM9bltyLm5hbWVdLmluZGV4LGw9aVtNYXRoLm1heChzLTEsMCldLm5hbWUsYz1sLHU9by5uYW1lLGg9by5uYW1lO2NvbnN0IGQ9U3UodCk7ZC5zZWxlY3RBbGwoYFtkYXRhLWVkZ2U9IiR7aH0tLSR7bH0iXWApLmNsYXNzZWQoImlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCksU2UuZXhwb3J0cy5lYWNoKGEsKGZ1bmN0aW9uKHQpe2Quc2VsZWN0QWxsKGBbZGF0YS1lZGdlPSIke3RbMF0ubmFtZX0tLSR7Y31+fiR7dFsxXS5uYW1lfX5+T1VUIl1gKS5jbGFzc2VkKCJpbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApfSkpO2ZvcihsZXQgdD0xO3Q8czt0KyspZC5zZWxlY3RBbGwoYFtkYXRhLWVkZ2U9IiR7dX1+fiR7aVt0XS5uYW1lfX5+SU4tLSR7aVt0LTFdLm5hbWV9Il1gKS5jbGFzc2VkKCJpbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApfSkodCxhLHMsbCl9KSksaX1mdW5jdGlvbiBDcXQodCxlKXtsZXQgbj0hMSxpPWU7Zm9yKDshbjspaWYoaT0oZT1pKS5wYXJlbnROb2RlLHZvaWQgMD09PWkpbj0hMDtlbHNle2xldCBlPXQuZ2V0UmVuZGVyTm9kZUJ5TmFtZShpLm5hbWUpO2UmJihlLmV4cGFuZGVkfHxpIGluc3RhbmNlb2YgWEd0KSYmKG49ITApfXJldHVybiBlfWZ1bmN0aW9uIEFxdCh0LGUsbixpKXtsZXQgcj10LnNlbGVjdEFsbCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGlsZE5vZGVzfSkpLmRhdGEoZS5saXN0LCh0PT50Lm5vZGUubmFtZSkpO3JldHVybiByLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiZGF0YS1uYW1lIiwodD0+dC5ub2RlLm5hbWUpKS5lYWNoKChmdW5jdGlvbih0KXtsZXQgZT1TdSh0aGlzKTtpLmFkZEFubm90YXRpb25Hcm91cCh0LG4sZSk7bGV0IHI9dkd0LkFubm90YXRpb24uRURHRSxvPXQucmVuZGVyTWV0YWVkZ2VJbmZvJiZ0LnJlbmRlck1ldGFlZGdlSW5mby5tZXRhZWRnZTtvJiYhby5udW1SZWd1bGFyRWRnZXMmJihyKz0iICIrdkd0LkFubm90YXRpb24uQ09OVFJPTF9FREdFKSxvJiZvLm51bVJlZkVkZ2VzJiYocis9IiAiK3ZHdC5FZGdlLlJFRl9MSU5FKSxycXQoZSx0LGksciksdC5hbm5vdGF0aW9uVHlwZSE9PWJXdC5FTExJUFNJUz8oKGZ1bmN0aW9uIGEodCxlKXtsZXQgbj1lLm5vZGUubmFtZS5zcGxpdCgiLyIpO2txdCh0LG5bbi5sZW5ndGgtMV0sZSxudWxsKX0pKGUsdCksKGZ1bmN0aW9uIHModCxlKXtlLmFubm90YXRpb25UeXBlPT09Yld0LlNVTU1BUlk/d0d0KHQsInVzZSIpLmF0dHIoImNsYXNzIiwic3VtbWFyeSIpLmF0dHIoInhsaW5rOmhyZWYiLCIjc3VtbWFyeS1pY29uIikuYXR0cigiY3Vyc29yIiwicG9pbnRlciIpOndHdChfcXQodCxlLHZHdC5Bbm5vdGF0aW9uLk5PREUpLCJ0aXRsZSIpLnRleHQoZS5ub2RlLm5hbWUpfSkoZSx0KSk6a3F0KGUsdC5ub2RlLm5hbWUsdCx2R3QuQW5ub3RhdGlvbi5FTExJUFNJUyl9KSkubWVyZ2UocikuYXR0cigiY2xhc3MiLCh0PT52R3QuQW5ub3RhdGlvbi5HUk9VUCsiICIrKGZ1bmN0aW9uIGUodCl7cmV0dXJuKGJXdFt0XXx8IiIpLnRvTG93ZXJDYXNlKCl8fG51bGx9KSh0LmFubm90YXRpb25UeXBlKSsiICIreXF0KHQpKSkuZWFjaCgoZnVuY3Rpb24odCl7bGV0IGU9U3UodGhpcyk7IShmdW5jdGlvbiByKHQsZSxuLGkpe2xldCByPURXdChlKTtuLnJlbmRlck5vZGVJbmZvJiZuLmFubm90YXRpb25UeXBlIT09Yld0LkVMTElQU0lTJiZ3cXQodCxuLnJlbmRlck5vZGVJbmZvLGksdkd0LkFubm90YXRpb24uTk9ERSksbi5hbm5vdGF0aW9uVHlwZT09PWJXdC5TVU1NQVJZJiYobi53aWR0aCs9MTApLHQuc2VsZWN0KCJ0ZXh0LiIrdkd0LkFubm90YXRpb24uTEFCRUwpLnRyYW5zaXRpb24oKS5hdHRyKCJ4IixyK24uZHgrKG4uaXNJbj8tMToxKSoobi53aWR0aC8yK24ubGFiZWxPZmZzZXQpKS5hdHRyKCJ5IixlLnkrbi5keSksdC5zZWxlY3QoInVzZS5zdW1tYXJ5IikudHJhbnNpdGlvbigpLmF0dHIoIngiLHIrbi5keC0zKS5hdHRyKCJ5IixlLnkrbi5keS02KSxXV3QodC5zZWxlY3QoIi4iK3ZHdC5Bbm5vdGF0aW9uLk5PREUrIiBlbGxpcHNlIikscituLmR4LGUueStuLmR5LG4ud2lkdGgsbi5oZWlnaHQpLEdXdCh0LnNlbGVjdCgiLiIrdkd0LkFubm90YXRpb24uTk9ERSsiIHJlY3QiKSxyK24uZHgsZS55K24uZHksbi53aWR0aCxuLmhlaWdodCksR1d0KHQuc2VsZWN0KCIuIit2R3QuQW5ub3RhdGlvbi5OT0RFKyIgdXNlIikscituLmR4LGUueStuLmR5LG4ud2lkdGgsbi5oZWlnaHQpLHQuc2VsZWN0KCJwYXRoLiIrdkd0LkFubm90YXRpb24uRURHRSkudHJhbnNpdGlvbigpLmF0dHIoImQiLCh0PT57bGV0IG49dC5wb2ludHMubWFwKCh0PT4oe3g6dC5keCtyLHk6dC5keStlLnl9KSkpO3JldHVybiBvcXQobil9KSl9KShlLG4sdCxpKSx0LmFubm90YXRpb25UeXBlIT09Yld0LkVMTElQU0lTJiYoZnVuY3Rpb24gbyh0LGUsbixpKXt0Lm9uKCJtb3VzZW92ZXIiLCh0PT57aS5maXJlKCJhbm5vdGF0aW9uLWhpZ2hsaWdodCIse25hbWU6dC5ub2RlLm5hbWUsaG9zdE5hbWU6ZS5ub2RlLm5hbWV9KX0pKS5vbigibW91c2VvdXQiLCh0PT57aS5maXJlKCJhbm5vdGF0aW9uLXVuaGlnaGxpZ2h0Iix7bmFtZTp0Lm5vZGUubmFtZSxob3N0TmFtZTplLm5vZGUubmFtZX0pfSkpLm9uKCJjbGljayIsKHQ9Pnt1dS5zdG9wUHJvcGFnYXRpb24oKSxpLmZpcmUoImFubm90YXRpb24tc2VsZWN0Iix7bmFtZTp0Lm5vZGUubmFtZSxob3N0TmFtZTplLm5vZGUubmFtZX0pfSkpLG4uYW5ub3RhdGlvblR5cGUhPT1iV3QuU1VNTUFSWSYmbi5hbm5vdGF0aW9uVHlwZSE9PWJXdC5DT05TVEFOVCYmdC5vbigiY29udGV4dG1lbnUiLFpXdChpLHVxdChuLm5vZGUsaSkpKX0pKGUsbix0LGkpfSkpLHIuZXhpdCgpLmVhY2goKGZ1bmN0aW9uKHQpe2kucmVtb3ZlQW5ub3RhdGlvbkdyb3VwKHQsbil9KSkucmVtb3ZlKCkscn1mdW5jdGlvbiBrcXQodCxlLG4saSl7bGV0IHI9dkd0LkFubm90YXRpb24uTEFCRUw7cmV0dXJuIGkmJihyKz0iICIraSksZnF0KHQuYXBwZW5kKCJ0ZXh0IikuYXR0cigiY2xhc3MiLHIpLmF0dHIoImR5IiwiLjM1ZW0iKS5hdHRyKCJ0ZXh0LWFuY2hvciIsbi5pc0luPyJlbmQiOiJzdGFydCIpLnRleHQoZSksLTEsNSl9ZnVuY3Rpb24gTHF0KHQsZSxuLGkpe2xldCByPXhHdCh0LCJnIixpPWl8fHZHdC5TY2VuZS5HUk9VUCkuZW1wdHkoKSxvPXdHdCh0LCJnIixpKSxhPXdHdChvLCJnIix2R3QuU2NlbmUuQ09SRSkscz1TZS5leHBvcnRzLnJlZHVjZShlLmNvcmVHcmFwaC5ub2RlcygpLCgodCxuKT0+e2xldCBpPWUuY29yZUdyYXBoLm5vZGUobik7cmV0dXJuIGkuZXhjbHVkZWR8fHQucHVzaChpKSx0fSksW10pO3JldHVybiBlLm5vZGUudHlwZT09PWpHdC5TRVJJRVMmJnMucmV2ZXJzZSgpLChmdW5jdGlvbiBsKHQsZSxuKXtjb25zdCBpPW47bGV0IHI9W107cj1TZS5leHBvcnRzLnJlZHVjZShlLmVkZ2VzKCksKCh0LG4pPT57bGV0IGk9ZS5lZGdlKG4pO3JldHVybiB0LnB1c2goe3Y6bi52LHc6bi53LGxhYmVsOml9KSx0fSkscik7bGV0IG89d0d0KHQsImciLHZHdC5FZGdlLkNPTlRBSU5FUikuc2VsZWN0QWxsKChmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9KSkuZGF0YShyLFFXdCk7by5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIix2R3QuRWRnZS5HUk9VUCkuYXR0cigiZGF0YS1lZGdlIixRV3QpLmVhY2goKGZ1bmN0aW9uKHQpe2xldCBlPVN1KHRoaXMpO3QubGFiZWwuZWRnZUdyb3VwPWUsaS5fZWRnZUdyb3VwSW5kZXhbUVd0KHQpXT1lLGkuaGFuZGxlRWRnZVNlbGVjdGVkJiZlLm9uKCJjbGljayIsKHQ9Pnt1dS5zdG9wUHJvcGFnYXRpb24oKSxpLmZpcmUoImVkZ2Utc2VsZWN0Iix7ZWRnZURhdGE6dCxlZGdlR3JvdXA6ZX0pfSkpLHJxdChlLHQsaSl9KSkubWVyZ2UobykuZWFjaCgoZnVuY3Rpb24oKXshKGZ1bmN0aW9uIHQoZSxuKXtTdShuKS5zZWxlY3QoInBhdGguIit2R3QuRWRnZS5MSU5FKS50cmFuc2l0aW9uKCkuYXR0clR3ZWVuKCJkIiwoZnVuY3Rpb24odCxuLGkpe3JldHVybihmdW5jdGlvbiByKHQsZSxuLGksbyl7bGV0IGE9bi5sYWJlbCxzPWEuYWRqb2luaW5nTWV0YWVkZ2UsbD1hLnBvaW50cztjb25zdHtzaGFkb3dSb290OmN9PXQ7aWYobi5sYWJlbC5zdGFydE1hcmtlcklkJiYobD1pcXQobCxTdShjLnF1ZXJ5U2VsZWN0b3IoIiMiK24ubGFiZWwuc3RhcnRNYXJrZXJJZCkpLCEwKSksbi5sYWJlbC5lbmRNYXJrZXJJZCYmKGw9aXF0KGwsU3UoYy5xdWVyeVNlbGVjdG9yKCIjIituLmxhYmVsLmVuZE1hcmtlcklkKSksITEpKSwhcylyZXR1cm4gamQobyxvcXQobCkpO2xldCB1PXMuZWRnZUdyb3VwLm5vZGUoKS5maXJzdENoaWxkLGg9YS5tZXRhZWRnZS5pbmJvdW5kO3JldHVybiBmdW5jdGlvbih0KXtsZXQgbj11LmdldFBvaW50QXRMZW5ndGgoaD91LmdldFRvdGFsTGVuZ3RoKCk6MCkubWF0cml4VHJhbnNmb3JtKHUuZ2V0Q1RNKCkpLm1hdHJpeFRyYW5zZm9ybShlLmdldENUTSgpLmludmVyc2UoKSksaT1oPzA6bC5sZW5ndGgtMTtyZXR1cm4gbFtpXS54PW4ueCxsW2ldLnk9bi55LG9xdChsKX19KShlLHRoaXMsdCwwLGkpfSkpfSkobix0aGlzKX0pKS5lYWNoKChmdW5jdGlvbih0KXshKGZ1bmN0aW9uIGUodCxuLGkpe3QuY2xhc3NlZCgiZmFkZWQiLG4ubGFiZWwuaXNGYWRlZE91dCk7bGV0IHI9bi5sYWJlbC5tZXRhZWRnZTt0LnNlbGVjdCgicGF0aC4iK3ZHdC5FZGdlLkxJTkUpLmNsYXNzZWQoImNvbnRyb2wtZGVwIixyJiYhci5udW1SZWd1bGFyRWRnZXMpfSkoU3UodGhpcyksdCl9KSksby5leGl0KCkuZWFjaCgodD0+e2RlbGV0ZSBpLl9lZGdlR3JvdXBJbmRleFtRV3QodCldfSkpLnJlbW92ZSgpfSkoYSxlLmNvcmVHcmFwaCxuKSxzcXQoYSxzLG4pLGUuaXNvbGF0ZWRJbkV4dHJhY3QubGVuZ3RoPjA/c3F0KHdHdChvLCJnIix2R3QuU2NlbmUuSU5FWFRSQUNUKSxlLmlzb2xhdGVkSW5FeHRyYWN0LG4pOnhHdChvLCJnIix2R3QuU2NlbmUuSU5FWFRSQUNUKS5yZW1vdmUoKSxlLmlzb2xhdGVkT3V0RXh0cmFjdC5sZW5ndGg+MD9zcXQod0d0KG8sImciLHZHdC5TY2VuZS5PVVRFWFRSQUNUKSxlLmlzb2xhdGVkT3V0RXh0cmFjdCxuKTp4R3QobywiZyIsdkd0LlNjZW5lLk9VVEVYVFJBQ1QpLnJlbW92ZSgpLGUubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QubGVuZ3RoPjA/c3F0KHdHdChvLCJnIix2R3QuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSksZS5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdCxuKTp4R3QobywiZyIsdkd0LlNjZW5lLkZVTkNUSU9OX0xJQlJBUlkpLnJlbW92ZSgpLChmdW5jdGlvbiBjKHQsZSl7bGV0IG49ZS5ub2RlLnR5cGU9PT1qR3QuU0VSSUVTPzA6Tld0LnN1YnNjZW5lLm1ldGEubGFiZWxIZWlnaHQ7ald0KEZXdCh0LCJnIixWV3QuU2NlbmUuQ09SRSksMCxuKTtsZXQgaT1lLmlzb2xhdGVkSW5FeHRyYWN0Lmxlbmd0aD4wLHI9ZS5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoPjAsbz1lLmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0Lmxlbmd0aD4wLGE9Tld0LnN1YnNjZW5lLm1ldGEuZXh0cmFjdFhPZmZzZXQscz0wO2lmKGkmJihzKz1lLm91dEV4dHJhY3RCb3gud2lkdGgpLHImJihzKz1lLm91dEV4dHJhY3RCb3gud2lkdGgpLGkpe2xldCBpPWUuY29yZUJveC53aWR0aDtpPXM8SVd0P2ktSVd0K2UuaW5FeHRyYWN0Qm94LndpZHRoLzI6aS1lLmluRXh0cmFjdEJveC53aWR0aC8yLWUub3V0RXh0cmFjdEJveC53aWR0aC0ocj9hOjApLGk9aS1lLmxpYnJhcnlGdW5jdGlvbnNCb3gud2lkdGgtKG8/YTowKSxqV3QoRld0KHQsImciLFZXdC5TY2VuZS5JTkVYVFJBQ1QpLGksbil9aWYocil7bGV0IGk9ZS5jb3JlQm94LndpZHRoO3M8SVd0P2k9aS1JV3QrZS5vdXRFeHRyYWN0Qm94LndpZHRoLzI6aS09ZS5vdXRFeHRyYWN0Qm94LndpZHRoLzIsaT1pLWUubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aC0obz9hOjApLGpXdChGV3QodCwiZyIsVld0LlNjZW5lLk9VVEVYVFJBQ1QpLGksbil9aWYobyl7bGV0IGk9ZS5jb3JlQm94LndpZHRoLWUubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aC8yO2pXdChGV3QodCwiZyIsVld0LlNjZW5lLkZVTkNUSU9OX0xJQlJBUlkpLGksbil9fSkobyxlKSxyJiZvLmF0dHIoIm9wYWNpdHkiLDApLnRyYW5zaXRpb24oKS5hdHRyKCJvcGFjaXR5IiwxKSxvfWxldCBQcXQ9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLm5vZGU9bnVsbCx0aGlzLnJlbmRlckluZm89bnVsbCx0aGlzLmNvbG9yQnk9YXF0LlNUUlVDVFVSRSx0aGlzLnRlbXBsYXRlSW5kZXg9bnVsbCx0aGlzLnR5cGU9bnVsbCx0aGlzLnZlcnRpY2FsPSExLHRoaXMuY29uc3Q9ITEsdGhpcy5zdW1tYXJ5PSExLHRoaXMuZmlsbD1udWxsLHRoaXMuaGVpZ2h0PTIwfV9jb21wdXRlRmlsbE92ZXJyaWRlKHQsZSxuLGkscil7cmV0dXJuIHQmJmUmJmk/eHF0KGksbixlLCExKTpyfV9nZXRTdHJva2VPdmVycmlkZSh0KXtyZXR1cm4gdD9TcXQodCk6bnVsbH1fZ2V0VHlwZSh0LGUsbixpKXtjb25zdHtHcmFwaEljb25UeXBlOnJ9PUtXdDtpZih0KXN3aXRjaCh0LnR5cGUpe2Nhc2Ugakd0Lk9QOntjb25zdCBpPXQub3A7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBpP3IuT1A6IkNvbnN0Ij09PWl8fG4/ci5DT05TVDppLmVuZHNXaXRoKCJTdW1tYXJ5Iil8fGU/ci5TVU1NQVJZOnIuT1B9Y2FzZSBqR3QuTUVUQTpyZXR1cm4gci5NRVRBO2Nhc2Ugakd0LlNFUklFUzpyZXR1cm4gci5TRVJJRVN9cmV0dXJuIGl9X2lzVmVydGljYWwodCxlKXtyZXR1cm4gdD90Lmhhc05vbkNvbnRyb2xFZGdlczohIWV9X2dldEZhZGVkKHQpe3JldHVybiB0JiZ0LmlzRmFkZWRPdXR9X29uRmlsbE92ZXJyaWRlQ2hhbmdlZCh0LGUpe2NvbnN0e25vZGU6bixyZW5kZXJJbmZvOmksY29sb3JCeTpyLHRlbXBsYXRlSW5kZXg6b309dGhpczt0IT09ZSYmYnF0KHRoaXMuJC5pY29uLmdldFN2Z0RlZmluYWJsZUVsZW1lbnQoKSksbiYmaSYmbyYmeHF0KG8scixpLCExLHRoaXMuJC5pY29uLmdldFN2Z0RlZmluYWJsZUVsZW1lbnQoKSl9fTtQcXQudGVtcGxhdGU9X2VgCiAgICA8c3R5bGU+CiAgICAgIHRmLWdyYXBoLWljb24gewogICAgICAgIC0tdGItZ3JhcGgtZmFkZWQ6IHZhcigtLXRiLWdyYXBoLWZhZGVkKTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDx0Zi1ncmFwaC1pY29uCiAgICAgIGlkPSJpY29uIgogICAgICB0eXBlPSJbW19nZXRUeXBlKG5vZGUsIHN1bW1hcnksIGNvbnN0LCB0eXBlKV1dIgogICAgICBoZWlnaHQ9IltbaGVpZ2h0XV0iCiAgICAgIGZpbGwtb3ZlcnJpZGU9IltbX2ZpbGxPdmVycmlkZV1dIgogICAgICBzdHJva2Utb3ZlcnJpZGU9IltbX2dldFN0cm9rZU92ZXJyaWRlKF9maWxsT3ZlcnJpZGUpXV0iCiAgICAgIGZhZGVkPSJbW19nZXRGYWRlZChyZW5kZXJJbmZvKV1dIgogICAgICB2ZXJ0aWNhbD0iW1tfaXNWZXJ0aWNhbChub2RlLCB2ZXJ0aWNhbCldXSIKICAgID48L3RmLWdyYXBoLWljb24+CiAgYCx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxQcXQucHJvdG90eXBlLCJub2RlIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFBxdC5wcm90b3R5cGUsInJlbmRlckluZm8iLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sUHF0LnByb3RvdHlwZSwiY29sb3JCeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLFBxdC5wcm90b3R5cGUsInRlbXBsYXRlSW5kZXgiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sUHF0LnByb3RvdHlwZSwidHlwZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFBxdC5wcm90b3R5cGUsInZlcnRpY2FsIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sUHF0LnByb3RvdHlwZSwiY29uc3QiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxQcXQucHJvdG90eXBlLCJzdW1tYXJ5Iix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFBxdC5wcm90b3R5cGUsImZpbGwiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sUHF0LnByb3RvdHlwZSwiaGVpZ2h0Iix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUZpbGxPdmVycmlkZShub2RlLCByZW5kZXJJbmZvLCBjb2xvckJ5LCB0ZW1wbGF0ZUluZGV4LCBmaWxsKSIsb2JzZXJ2ZXI6Il9vbkZpbGxPdmVycmlkZUNoYW5nZWQifSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFBxdC5wcm90b3R5cGUsIl9maWxsT3ZlcnJpZGUiLHZvaWQgMCksUHF0PXQoW2koInRmLW5vZGUtaWNvbiIpXSxQcXQpO2xldCBOcXQ9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe19pdGVtVHlwZUNoYW5nZWQoKXsic3Vibm9kZSIhPT10aGlzLml0ZW1UeXBlP3RoaXMuJFsibGlzdC1pdGVtIl0uY2xhc3NMaXN0LmFkZCgiY2xpY2thYmxlIik6dGhpcy4kWyJsaXN0LWl0ZW0iXS5jbGFzc0xpc3QucmVtb3ZlKCJjbGlja2FibGUiKX1fbm9kZUxpc3RlbmVyKHQpe3RoaXMuZmlyZSgibm9kZS1saXN0LWl0ZW0tIit0LnR5cGUse25vZGVOYW1lOnRoaXMubmFtZSx0eXBlOnRoaXMuaXRlbVR5cGV9KX1fZmFkZWRDbGFzcyh0KXtyZXR1cm4gdCYmdC5pc0ZhZGVkT3V0PyJmYWRlZCI6IiJ9fTtmdW5jdGlvbiBJcXQodCxlLG4pe3JldHVybiBTZS5leHBvcnRzLnNvcnRCeSh0LFt0PT5lLm5vZGUodCkub3AsdD0+ZS5ub2RlKHQpLnRlbXBsYXRlSWQsdD0+ZS5uZWlnaGJvcnModCkubGVuZ3RoLHQ9PmUucHJlZGVjZXNzb3JzKHQpLmxlbmd0aCx0PT5lLnN1Y2Nlc3NvcnModCkubGVuZ3RoLHQ9PnQuc3Vic3RyKG4ubGVuZ3RoKV0pfWZ1bmN0aW9uIFJxdCh0LGUpe2lmKCEoZnVuY3Rpb24gbih0LGUpe2xldCBuPWxXdCh0KSxpPWxXdChlKTtmb3IobGV0IHQ9MDt0PG4ubGVuZ3RoO3QrKylpZihuW3RdIT09aVt0XSlyZXR1cm4hMTtyZXR1cm4hMH0pKHQsZSkpcmV0dXJuITE7bGV0IGk9dC5ncmFwaCgpLm5hbWUscj1lLmdyYXBoKCkubmFtZSxvPXt9LGE9e30scz1bXTtmdW5jdGlvbiBsKHQsZSl7bGV0IG49dC5zdWJzdHIoaS5sZW5ndGgpLGw9ZS5zdWJzdHIoci5sZW5ndGgpO3JldHVybiBvW25dXmFbbF0/KGNvbnNvbGUud2FybigiZGlmZmVyZW50IHZpc2l0IHBhdHRlcm4iLCJbIitpKyJdIixuLCJbIityKyJdIixsKSwhMCk6KG9bbl18fChvW25dPWFbbF09ITAscy5wdXNoKHtuMTp0LG4yOmV9KSksITEpfWxldCBjPXQuc291cmNlcygpLHU9ZS5zb3VyY2VzKCk7aWYoYy5sZW5ndGghPT11Lmxlbmd0aClyZXR1cm4gY29uc29sZS5sb2coImRpZmZlcmVudCBzb3VyY2UgbGVuZ3RoIiksITE7Yz1JcXQoYyx0LGkpLHU9SXF0KHUsZSxyKTtmb3IobGV0IHQ9MDt0PGMubGVuZ3RoO3QrKylpZihsKGNbdF0sdVt0XSkpcmV0dXJuITE7Zm9yKDtzLmxlbmd0aD4wOyl7bGV0IG49cy5wb3AoKTtpZighT3F0KHQubm9kZShuLm4xKSxlLm5vZGUobi5uMikpKXJldHVybiExO2xldCBvPXQuc3VjY2Vzc29ycyhuLm4xKSxhPWUuc3VjY2Vzc29ycyhuLm4yKTtpZihvLmxlbmd0aCE9PWEubGVuZ3RoKXJldHVybiBjb25zb2xlLmxvZygiIyBvZiBzdWNjZXNzb3JzIG1pc21hdGNoIixvLGEpLCExO289SXF0KG8sdCxpKSxhPUlxdChhLGUscik7Zm9yKGxldCB0PTA7dDxvLmxlbmd0aDt0KyspaWYobChvW3RdLGFbdF0pKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIE9xdCh0LGUpe2lmKHQudHlwZT09PWpHdC5NRVRBKXtsZXQgbj10LGk9ZTtyZXR1cm4gbi50ZW1wbGF0ZUlkJiZpLnRlbXBsYXRlSWQmJm4udGVtcGxhdGVJZD09PWkudGVtcGxhdGVJZH1pZih0LnR5cGU9PT1qR3QuT1AmJmUudHlwZT09PWpHdC5PUClyZXR1cm4gdC5vcD09PWUub3A7aWYodC50eXBlPT09akd0LlNFUklFUyYmZS50eXBlPT09akd0LlNFUklFUyl7bGV0IG49dCxpPWUscj1uLm1ldGFncmFwaC5ub2RlQ291bnQoKTtyZXR1cm4gcj09PWkubWV0YWdyYXBoLm5vZGVDb3VudCgpJiYoMD09PXJ8fG4ubWV0YWdyYXBoLm5vZGUobi5tZXRhZ3JhcGgubm9kZXMoKVswXSkub3A9PT1pLm1ldGFncmFwaC5ub2RlKGkubWV0YWdyYXBoLm5vZGVzKClbMF0pLm9wKX1yZXR1cm4hMX12YXIgenF0O05xdC50ZW1wbGF0ZT1fZWAKICAgIDxzdHlsZT4KICAgICAgI2xpc3QtaXRlbSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgY29sb3I6IHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKTsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICAjbGlzdC1pdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1nb29nbGUteWVsbG93LTEwMCk7CiAgICAgIH0KCiAgICAgIC5jbGlja2FibGUgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuIHsKICAgICAgICBtYXJnaW4tbGVmdDogNDBweDsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbS5leGNsdWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuLmVkZ2UtbGFiZWwgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDNweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgICAgfQoKICAgICAgLm5vZGUtaWNvbiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMXB4OwogICAgICAgIGxlZnQ6IDJweDsKICAgICAgfQoKICAgICAgLmZhZGVkIHNwYW4gewogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1ncmFwaC1mYWRlZCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdgogICAgICBpZD0ibGlzdC1pdGVtIgogICAgICBvbi1tb3VzZW92ZXI9Il9ub2RlTGlzdGVuZXIiCiAgICAgIG9uLW1vdXNlb3V0PSJfbm9kZUxpc3RlbmVyIgogICAgICBvbi1jbGljaz0iX25vZGVMaXN0ZW5lciIKICAgID4KICAgICAgPGRpdiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoaXRlbVJlbmRlckluZm8pfX0iPgogICAgICAgIDx0Zi1ub2RlLWljb24KICAgICAgICAgIGNsYXNzPSJub2RlLWljb24iCiAgICAgICAgICBoZWlnaHQ9IjEyIgogICAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgICAgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIKICAgICAgICAgIG5vZGU9IltbaXRlbU5vZGVdXSIKICAgICAgICAgIHJlbmRlci1pbmZvPSJbW2l0ZW1SZW5kZXJJbmZvXV0iCiAgICAgICAgICB0ZW1wbGF0ZS1pbmRleD0iW1t0ZW1wbGF0ZUluZGV4XV0iCiAgICAgICAgPgogICAgICAgIDwvdGYtbm9kZS1pY29uPgogICAgICAgIDxzcGFuIHRpdGxlJD0iW1tuYW1lXV0iPltbbmFtZV1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTnF0LnByb3RvdHlwZSwiY2FyZE5vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTnF0LnByb3RvdHlwZSwiaXRlbU5vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sTnF0LnByb3RvdHlwZSwiZWRnZUxhYmVsIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLE5xdC5wcm90b3R5cGUsIml0ZW1SZW5kZXJJbmZvIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLE5xdC5wcm90b3R5cGUsIm5hbWUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9pdGVtVHlwZUNoYW5nZWQifSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLE5xdC5wcm90b3R5cGUsIml0ZW1UeXBlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLE5xdC5wcm90b3R5cGUsImNvbG9yQnkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTnF0LnByb3RvdHlwZSwiY29sb3JCeVBhcmFtcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLE5xdC5wcm90b3R5cGUsInRlbXBsYXRlSW5kZXgiLHZvaWQgMCksTnF0PXQoW2koInRmLWdyYXBoLW9wLWNvbXBhdC1saXN0LWl0ZW0iKV0sTnF0KSwoZnVuY3Rpb24odCl7dFt0LlRFTVBMQVRFU19VUERBVEVEPTBdPSJURU1QTEFURVNfVVBEQVRFRCJ9KSh6cXR8fCh6cXQ9e30pKTtjbGFzcyBEcXQgZXh0ZW5kcyBjbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuZXZlbnRUeXBlVG9MaXN0ZW5lcnM9bmV3IE1hcH1nZXRMaXN0ZW5lcnModCl7cmV0dXJuIHRoaXMuZXZlbnRUeXBlVG9MaXN0ZW5lcnMuaGFzKHQpfHx0aGlzLmV2ZW50VHlwZVRvTGlzdGVuZXJzLnNldCh0LFtdKSx0aGlzLmV2ZW50VHlwZVRvTGlzdGVuZXJzLmdldCh0KX1hZGRMaXN0ZW5lcih0LGUpe3RoaXMuZ2V0TGlzdGVuZXJzKHQpLnB1c2goZSl9cmVtb3ZlTGlzdGVuZXIodCxlKXtjb25zdCBuPXRoaXMuZ2V0TGlzdGVuZXJzKHQpLmZpbHRlcigodD0+dCE9PWUpKTt0aGlzLmV2ZW50VHlwZVRvTGlzdGVuZXJzLnNldCh0LG4pfWRpc3BhdGNoRXZlbnQodCxlKXtmb3IoY29uc3QgbiBvZiB0aGlzLmdldExpc3RlbmVycyh0KSluKGUpfX17Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmhhc1NoYXBlSW5mbz0hMSx0aGlzLm1heE1ldGFFZGdlU2l6ZT0xLHRoaXMuZ3JhcGhPcHRpb25zPXt9LHRoaXMudGVtcGxhdGVzPW51bGwsdGhpcy5ncmFwaE9wdGlvbnMuY29tcG91bmQ9ITAsdGhpcy5ncmFwaE9wdGlvbnMucmFua2Rpcj10LnJhbmtEaXJlY3Rpb24sdGhpcy5yb290PSRHdChGR3QsdGhpcy5ncmFwaE9wdGlvbnMpLHRoaXMubGlicmFyeUZ1bmN0aW9ucz17fSx0aGlzLnNlcmllc0dyb3VwTWFwPW5ldyBNYXAodC5zZXJpZXNNYXApLHRoaXMuZGV2aWNlcz1udWxsLHRoaXMueGxhQ2x1c3RlcnM9bnVsbCx0aGlzLnZlcmlmeVRlbXBsYXRlPXQudmVyaWZ5VGVtcGxhdGUsdGhpcy5pbmRleD17fSx0aGlzLmluZGV4Ll9fcm9vdF9fPXRoaXMucm9vdCx0aGlzLm9yZGVyaW5ncz17fX1nZXRTZXJpZXNHcm91cFR5cGUodCl7dmFyIGU7cmV0dXJuIG51bGwhPT0oZT10aGlzLnNlcmllc0dyb3VwTWFwLmdldCh0KSkmJnZvaWQgMCE9PWU/ZTpXR3QuR1JPVVB9c2V0U2VyaWVzR3JvdXBUeXBlKHQsZSl7cmV0dXJuIHRoaXMuc2VyaWVzR3JvdXBNYXAuc2V0KHQsZSl9YnVpbGRTZXJpZXNHcm91cE1hcFRvZ2dsZWQodCl7Y29uc3QgZT10aGlzLmdldFNlcmllc0dyb3VwVHlwZSh0KT09PVdHdC5HUk9VUD9XR3QuVU5HUk9VUDpXR3QuR1JPVVA7cmV0dXJuIG5ldyBNYXAoWy4uLnRoaXMuc2VyaWVzR3JvdXBNYXAsW3QsZV1dKX1nZXROb2RlTWFwKCl7cmV0dXJuIHRoaXMuaW5kZXh9bm9kZSh0KXtyZXR1cm4gdGhpcy5pbmRleFt0XX1zZXROb2RlKHQsZSl7dGhpcy5pbmRleFt0XT1lfWdldEJyaWRnZWdyYXBoKHQpe2xldCBlPXRoaXMuaW5kZXhbdF07aWYoIWUpdGhyb3cgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIG5vZGUgaW4gaGllcmFyY2h5OiAiK3QpO2lmKCEoIm1ldGFncmFwaCJpbiBlKSlyZXR1cm4gbnVsbDtpZihlLmJyaWRnZWdyYXBoKXJldHVybiBlLmJyaWRnZWdyYXBoO2xldCBuPWUuYnJpZGdlZ3JhcGg9b1d0KCJCUklER0VHUkFQSCIsVUd0LkJSSURHRSx0aGlzLmdyYXBoT3B0aW9ucyk7aWYoIWUucGFyZW50Tm9kZXx8ISgibWV0YWdyYXBoImluIGUucGFyZW50Tm9kZSkpcmV0dXJuIG47bGV0IGk9ZS5wYXJlbnROb2RlLHI9aS5tZXRhZ3JhcGgsbz10aGlzLmdldEJyaWRnZWdyYXBoKGkubmFtZSk7cmV0dXJuIFNlLmV4cG9ydHMuZWFjaChbcixvXSwoZT0+e2UuZWRnZXMoKS5maWx0ZXIoKGU9PmUudj09PXR8fGUudz09PXQpKS5mb3JFYWNoKChpPT57bGV0IHI9aS53PT09dCxvPWUuZWRnZShpKTtTZS5leHBvcnRzLmVhY2goby5iYXNlRWRnZUxpc3QsKGU9PntsZXRbbyxhXT1yP1tlLncsaS52XTpbZS52LGkud10scz10aGlzLmdldENoaWxkTmFtZSh0LG8pLGw9e3Y6cj9hOnMsdzpyP3M6YX0sYz1uLmVkZ2UobCk7Y3x8KGM9Wkd0KGwudixsLncpLGMuaW5ib3VuZD1yLG4uc2V0RWRnZShsLnYsbC53LGMpKSxjLmFkZEJhc2VFZGdlKGUsdGhpcyl9KSl9KSl9KSksbn1nZXRDaGlsZE5hbWUodCxlKXtsZXQgbj10aGlzLmluZGV4W2VdO2Zvcig7bjspe2lmKG4ucGFyZW50Tm9kZSYmbi5wYXJlbnROb2RlLm5hbWU9PT10KXJldHVybiBuLm5hbWU7bj1uLnBhcmVudE5vZGV9dGhyb3cgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIGltbWVkaWF0ZSBjaGlsZCBmb3IgZGVzY2VuZGFudDogIitlKX1nZXRQcmVkZWNlc3NvcnModCl7bGV0IGU9dGhpcy5pbmRleFt0XTtpZighZSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSB3aXRoIG5hbWU6ICIrdCk7bGV0IG49dGhpcy5nZXRPbmVXYXlFZGdlcyhlLCEwKTtyZXR1cm4gZS5pc0dyb3VwTm9kZXx8U2UuZXhwb3J0cy5lYWNoKGUuaW5FbWJlZGRpbmdzLChpPT57U2UuZXhwb3J0cy5lYWNoKGUuaW5wdXRzLChlPT57aWYoZS5uYW1lPT09aS5uYW1lKXtsZXQgcj1uZXcgSkd0KGkubmFtZSx0KTtyLmFkZEJhc2VFZGdlKHtpc0NvbnRyb2xEZXBlbmRlbmN5OmUuaXNDb250cm9sRGVwZW5kZW5jeSxvdXRwdXRUZW5zb3JLZXk6ZS5vdXRwdXRUZW5zb3JLZXksaXNSZWZlcmVuY2VFZGdlOiExLHY6aS5uYW1lLHc6dH0sdGhpcyksbi5yZWd1bGFyLnB1c2gocil9fSkpfSkpLG59Z2V0U3VjY2Vzc29ycyh0KXtsZXQgZT10aGlzLmluZGV4W3RdO2lmKCFlKXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBub2RlIHdpdGggbmFtZTogIit0KTtsZXQgbj10aGlzLmdldE9uZVdheUVkZ2VzKGUsITEpO3JldHVybiBlLmlzR3JvdXBOb2RlfHxTZS5leHBvcnRzLmVhY2goZS5vdXRFbWJlZGRpbmdzLChlPT57U2UuZXhwb3J0cy5lYWNoKGUuaW5wdXRzLChpPT57aWYoaS5uYW1lPT09dCl7bGV0IHI9bmV3IEpHdCh0LGUubmFtZSk7ci5hZGRCYXNlRWRnZSh7aXNDb250cm9sRGVwZW5kZW5jeTppLmlzQ29udHJvbERlcGVuZGVuY3ksb3V0cHV0VGVuc29yS2V5Omkub3V0cHV0VGVuc29yS2V5LGlzUmVmZXJlbmNlRWRnZTohMSx2OnQsdzplLm5hbWV9LHRoaXMpLG4ucmVndWxhci5wdXNoKHIpfX0pKX0pKSxufWdldE9uZVdheUVkZ2VzKHQsZSl7bGV0IG49e2NvbnRyb2w6W10scmVndWxhcjpbXX07aWYoIXQucGFyZW50Tm9kZXx8IXQucGFyZW50Tm9kZS5pc0dyb3VwTm9kZSlyZXR1cm4gbjtsZXQgaT10LnBhcmVudE5vZGUscj1pLm1ldGFncmFwaCxvPXRoaXMuZ2V0QnJpZGdlZ3JhcGgoaS5uYW1lKTtyZXR1cm4gQnF0KHIsdCxlLG4pLEJxdChvLHQsZSxuKSxufWdldFRvcG9sb2dpY2FsT3JkZXJpbmcodCl7bGV0IGU9dGhpcy5pbmRleFt0XTtpZighZSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSB3aXRoIG5hbWU6ICIrdCk7aWYoIWUuaXNHcm91cE5vZGUpcmV0dXJuIG51bGw7aWYodCBpbiB0aGlzLm9yZGVyaW5ncylyZXR1cm4gdGhpcy5vcmRlcmluZ3NbdF07bGV0IG49e30saT17fSxyPWUubWV0YWdyYXBoO1NlLmV4cG9ydHMuZWFjaChyLmVkZ2VzKCksKHQ9PntyLmVkZ2UodCkubnVtUmVndWxhckVkZ2VzJiYodC52IGluIG58fChuW3Qudl09W10pLG5bdC52XS5wdXNoKHQudyksaVt0LnddPSEwKX0pKTtsZXQgbz1TZS5leHBvcnRzLmRpZmZlcmVuY2UoU2UuZXhwb3J0cy5rZXlzKG4pLFNlLmV4cG9ydHMua2V5cyhpKSksYT10aGlzLm9yZGVyaW5nc1t0XT17fSxzPTA7Zm9yKDtvLmxlbmd0aDspe2xldCB0PW8uc2hpZnQoKTthW3RdPXMrKyxTZS5leHBvcnRzLmVhY2goblt0XSwodD0+by5wdXNoKHQpKSksZGVsZXRlIG5bdF19cmV0dXJuIGF9Z2V0VGVtcGxhdGVJbmRleCgpe2lmKCF0aGlzLnRlbXBsYXRlcylyZXR1cm4gbnVsbDtsZXQgdD1MZyh0aGlzLnRlbXBsYXRlcyk7aWYoIXQubGVuZ3RoKXJldHVybiBudWxsO2xldCBlPUVNKCkuZG9tYWluKHQpLnJhbmdlKHpsKDAsdC5sZW5ndGgpKTtyZXR1cm4gdD0+ZSh0KX11cGRhdGVUZW1wbGF0ZXMoKXtDR3QoIkZpbmRpbmcgc2ltaWxhciBzdWJncmFwaHMiLCgoKT0+e3RoaXMudGVtcGxhdGVzPShmdW5jdGlvbiB0KGUsbil7bGV0IGk9KGZ1bmN0aW9uIG8odCxlKXtyZXR1cm4gU2UuZXhwb3J0cy5yZWR1Y2UodCwoZnVuY3Rpb24odCxuKXtsZXQgaT1uWzBdLHI9W107cmV0dXJuIG5bMV0ubm9kZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7Zm9yKGxldCBuPTA7bjxyLmxlbmd0aDtuKyspaWYoIWV8fFJxdChyW25dLm1ldGFub2RlLm1ldGFncmFwaCx0Lm1ldGFncmFwaCkpcmV0dXJuIHQudGVtcGxhdGVJZD1yW25dLm1ldGFub2RlLnRlbXBsYXRlSWQsdm9pZCByW25dLm1lbWJlcnMucHVzaCh0Lm5hbWUpO3QudGVtcGxhdGVJZD1pKyJbIityLmxlbmd0aCsiXSIsci5wdXNoKHttZXRhbm9kZTp0LG1lbWJlcnM6W3QubmFtZV19KX0pKSxyLmZvckVhY2goKGZ1bmN0aW9uKGUpe3RbZS5tZXRhbm9kZS50ZW1wbGF0ZUlkXT17bGV2ZWw6blsxXS5sZXZlbCxub2RlczplLm1lbWJlcnN9fSkpLHR9KSx7fSl9KSgoZnVuY3Rpb24gcih0KXtjb25zdCBlPXQuZ2V0Tm9kZU1hcCgpO2xldCBuPU9iamVjdC5rZXlzKGUpLnJlZHVjZSgoKHQsbik9Pntjb25zdCBpPWVbbl07aWYoaS50eXBlIT09akd0Lk1FVEEpcmV0dXJuIHQ7bGV0IHI9bi5zcGxpdCgiLyIpLmxlbmd0aC0xLG89KGZ1bmN0aW9uIGEodCl7cmV0dXJuIFNlLmV4cG9ydHMubWFwKHtkZXB0aDp0LmRlcHRoLCJ8VnwiOnQubWV0YWdyYXBoLm5vZGVzKCkubGVuZ3RoLCJ8RXwiOnQubWV0YWdyYXBoLmVkZ2VzKCkubGVuZ3RofSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZSsiPSIrdH0pKS5qb2luKCIgIikrIiBbb3BzXSAiK1NlLmV4cG9ydHMubWFwKHQub3BIaXN0b2dyYW0sKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUrIj0iK3R9KSkuam9pbigiLCIpfSkoaSkscz10W29dfHx7bm9kZXM6W10sbGV2ZWw6cn07cmV0dXJuIHRbb109cyxzLm5vZGVzLnB1c2goaSkscy5sZXZlbD5yJiYocy5sZXZlbD1yKSx0fSkse30pO3JldHVybiBPYmplY3Qua2V5cyhuKS5tYXAoKHQ9Plt0LG5bdF1dKSkuZmlsdGVyKCgoW3QsZV0pPT57Y29uc3R7bm9kZXM6bn09ZTtpZihuLmxlbmd0aD4xKXJldHVybiEwO2NvbnN0IGk9blswXTtyZXR1cm4gaS50eXBlPT09akd0Lk1FVEEmJmkuYXNzb2NpYXRlZEZ1bmN0aW9ufSkpLnNvcnQoKChbdCxlXSk9PmUubm9kZXNbMF0uZGVwdGgpKX0pKGUpLG4pO3JldHVybiBPYmplY3Qua2V5cyhpKS5zb3J0KCh0PT5pW3RdLmxldmVsKSkucmVkdWNlKCgodCxlKT0+KHRbZV09aVtlXSx0KSkse30pfSkodGhpcyx0aGlzLnZlcmlmeVRlbXBsYXRlKSx0aGlzLmRpc3BhdGNoRXZlbnQoenF0LlRFTVBMQVRFU19VUERBVEVEKX0pLF9HdC5ISUVSQVJDSFlfRklORF9TSU1JTEFSX1NVQkdSQVBIUyl9fWZ1bmN0aW9uIEJxdCh0LGUsbixpKXtsZXQgcj1uP3QuaW5FZGdlcyhlLm5hbWUpOnQub3V0RWRnZXMoZS5uYW1lKTtTZS5leHBvcnRzLmVhY2gociwoZT0+e2xldCBuPXQuZWRnZShlKTsobi5udW1SZWd1bGFyRWRnZXM/aS5yZWd1bGFyOmkuY29udHJvbCkucHVzaChuKX0pKX1jb25zdCBIcXQ9e3ZlcmlmeVRlbXBsYXRlOiEwLHNlcmllc05vZGVNaW5TaXplOjUsc2VyaWVzTWFwOm5ldyBNYXAscmFua0RpcmVjdGlvbjoiQlQiLHVzZUdlbmVyYWxpemVkU2VyaWVzUGF0dGVybnM6ITF9O2Z1bmN0aW9uIEZxdCh0LGUsbil7Y29uc3QgaT1uZXcgRHF0KGUpLHI9e307cmV0dXJuIExHdCgiQWRkaW5nIG5vZGVzIiwzMCwoKCk9PntsZXQgZT17fSxuPXt9O1NlLmV4cG9ydHMuZWFjaCh0Lm5vZGVzLCgodCxpKT0+e3QuZGV2aWNlJiYoZVt0LmRldmljZV09ITApLHQueGxhQ2x1c3RlciYmKG5bdC54bGFDbHVzdGVyXT0hMCl9KSksaS5kZXZpY2VzPVNlLmV4cG9ydHMua2V5cyhlKSxpLnhsYUNsdXN0ZXJzPVNlLmV4cG9ydHMua2V5cyhuKSwoZnVuY3Rpb24gcih0LGUpe2NvbnN0IG49e307U2UuZXhwb3J0cy5lYWNoKGUubm9kZXMsKChlLGkpPT57bGV0IHI9Y1d0KGUubmFtZSksbz10LnJvb3Q7by5kZXB0aD1NYXRoLm1heChyLmxlbmd0aCxvLmRlcHRoKSxuW2Uub3BdfHwobltlLm9wXT1bXSksbltlLm9wXS5wdXNoKGUpO2ZvcihsZXQgaT0wO2k8ci5sZW5ndGgmJihvLmRlcHRoPU1hdGgubWF4KG8uZGVwdGgsci5sZW5ndGgtaSksby5jYXJkaW5hbGl0eSs9ZS5jYXJkaW5hbGl0eSxvLm9wSGlzdG9ncmFtW2Uub3BdPShvLm9wSGlzdG9ncmFtW2Uub3BdfHwwKSsxLG51bGwhPWUuZGV2aWNlJiYoby5kZXZpY2VIaXN0b2dyYW1bZS5kZXZpY2VdPShvLmRldmljZUhpc3RvZ3JhbVtlLmRldmljZV18fDApKzEpLG51bGwhPWUueGxhQ2x1c3RlciYmKG8ueGxhQ2x1c3Rlckhpc3RvZ3JhbVtlLnhsYUNsdXN0ZXJdPShvLnhsYUNsdXN0ZXJIaXN0b2dyYW1bZS54bGFDbHVzdGVyXXx8MCkrMSksZS5jb21wYXRpYmxlP28uY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShvLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpvLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShvLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxLFNlLmV4cG9ydHMuZWFjaChlLmluRW1iZWRkaW5ncywodD0+e3QuY29tcGF0aWJsZT9vLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0oby5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6by5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0oby5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMX0pKSxTZS5leHBvcnRzLmVhY2goZS5vdXRFbWJlZGRpbmdzLCh0PT57dC5jb21wYXRpYmxlP28uY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShvLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpvLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShvLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxfSkpLGkhPT1yLmxlbmd0aC0xKTtpKyspe2xldCBlPXJbaV0sYT10Lm5vZGUoZSk7aWYoIWEmJihhPSRHdChlLHQuZ3JhcGhPcHRpb25zKSxhLnBhcmVudE5vZGU9byx0LnNldE5vZGUoZSxhKSxvLm1ldGFncmFwaC5zZXROb2RlKGUsYSksMD09PWUuaW5kZXhPZihWR3QpJiZvLm5hbWU9PT1GR3QpKXtjb25zdCBpPWUuc3Vic3RyaW5nKFZHdC5sZW5ndGgpO25baV18fChuW2ldPVtdKSx0LmxpYnJhcnlGdW5jdGlvbnNbaV09e25vZGU6YSx1c2FnZXM6bltpXX0sYS5hc3NvY2lhdGVkRnVuY3Rpb249aX1vPWF9dC5zZXROb2RlKGUubmFtZSxlKSxlLnBhcmVudE5vZGU9byxvLm1ldGFncmFwaC5zZXROb2RlKGUubmFtZSxlKSxTZS5leHBvcnRzLmVhY2goZS5pbkVtYmVkZGluZ3MsKGZ1bmN0aW9uKG4pe3Quc2V0Tm9kZShuLm5hbWUsbiksbi5wYXJlbnROb2RlPWV9KSksU2UuZXhwb3J0cy5lYWNoKGUub3V0RW1iZWRkaW5ncywoZnVuY3Rpb24obil7dC5zZXROb2RlKG4ubmFtZSxuKSxuLnBhcmVudE5vZGU9ZX0pKX0pKX0pKGksdCl9KSxuLF9HdC5ISUVSQVJDSFlfQUREX05PREVTKS50aGVuKCgoKT0+TEd0KCJEZXRlY3Qgc2VyaWVzIiwzMCwoKCk9PntlLnNlcmllc05vZGVNaW5TaXplPjAmJlZxdChpLnJvb3QsaSxyLGUuc2VyaWVzTm9kZU1pblNpemUsZS5zZXJpZXNNYXAsZS51c2VHZW5lcmFsaXplZFNlcmllc1BhdHRlcm5zKX0pLG4sX0d0LkhJRVJBUkNIWV9ERVRFQ1RfU0VSSUVTKSkpLnRoZW4oKCgpPT5MR3QoIkFkZGluZyBlZGdlcyIsNDAsKCgpPT57IShmdW5jdGlvbiBlKHQsbixpKXtsZXQgcj10LmdldE5vZGVNYXAoKSxvPVtdLGE9W10scz0odCxlKT0+e2xldCBuPTA7Zm9yKDt0OyllW24rK109dC5uYW1lLHQ9dC5wYXJlbnROb2RlO3JldHVybiBuLTF9O1NlLmV4cG9ydHMuZWFjaChuLmVkZ2VzLChlPT57bGV0IGk9cyhuLm5vZGVzW2Uudl0sbyksbD1zKG4ubm9kZXNbZS53XSxhKTtpZigtMT09PWl8fC0xPT09bClyZXR1cm47Zm9yKDtvW2ldPT09YVtsXTspaWYoaS0tLGwtLSxpPDB8fGw8MCl0aHJvdyBFcnJvcigiTm8gZGlmZmVyZW5jZSBmb3VuZCBiZXR3ZWVuIGFuY2VzdG9yIHBhdGhzLiIpO2xldCBjPXJbb1tpKzFdXSx1PW9baV0saD1hW2xdLGQ9Yy5tZXRhZ3JhcGguZWRnZSh1LGgpO2R8fChkPVpHdCh1LGgpLGMubWV0YWdyYXBoLnNldEVkZ2UodSxoLGQpKSxjLmhhc05vbkNvbnRyb2xFZGdlc3x8ZS5pc0NvbnRyb2xEZXBlbmRlbmN5fHwoYy5oYXNOb25Db250cm9sRWRnZXM9ITApLGQuYWRkQmFzZUVkZ2UoZSx0KX0pKX0pKGksdCl9KSxuLF9HdC5ISUVSQVJDSFlfQUREX0VER0VTKSkpLnRoZW4oKCgpPT5pKSl9ZnVuY3Rpb24gVnF0KHQsZSxuLGkscixvKXtsZXQgYT10Lm1ldGFncmFwaDtTZS5leHBvcnRzLmVhY2goYS5ub2RlcygpLCh0PT57bGV0IHM9YS5ub2RlKHQpO3MudHlwZT09PWpHdC5NRVRBJiZWcXQocyxlLG4saSxyLG8pfSkpO2xldCBzPShmdW5jdGlvbiBsKHQpe3JldHVybiBTZS5leHBvcnRzLnJlZHVjZSh0Lm5vZGVzKCksKChlLG4pPT57bGV0IGk9dC5ub2RlKG4pO2lmKGkudHlwZT09PWpHdC5NRVRBKXJldHVybiBlO2xldCByPWkub3A7cmV0dXJuIHImJihlW3JdPWVbcl18fFtdLGVbcl0ucHVzaChpLm5hbWUpKSxlfSkse30pfSkoYSksYz0obz9qcXQ6VXF0KShzLGEsZS5ncmFwaE9wdGlvbnMpO1NlLmV4cG9ydHMuZWFjaChjLChmdW5jdGlvbih0LHIpe2xldCBvPXQubWV0YWdyYXBoLm5vZGVzKCk7U2UuZXhwb3J0cy5lYWNoKG8sKHQ9PntsZXQgZT1hLm5vZGUodCk7ZS5vd25pbmdTZXJpZXN8fChlLm93bmluZ1Nlcmllcz1yKX0pKSxvLmxlbmd0aDxpJiZlLmdldFNlcmllc0dyb3VwVHlwZSh0Lm5hbWUpPT09V0d0LkdST1VQJiZlLnNldFNlcmllc0dyb3VwVHlwZSh0Lm5hbWUsV0d0LlVOR1JPVVApLGUuZ2V0U2VyaWVzR3JvdXBUeXBlKHQubmFtZSkhPT1XR3QuVU5HUk9VUCYmKGUuc2V0Tm9kZShyLHQpLGEuc2V0Tm9kZShyLHQpLFNlLmV4cG9ydHMuZWFjaChvLChlPT57bGV0IGk9YS5ub2RlKGUpO3QubWV0YWdyYXBoLnNldE5vZGUoZSxpKSx0LnBhcmVudE5vZGU9aS5wYXJlbnROb2RlLHQuY2FyZGluYWxpdHkrKyxudWxsIT1pLmRldmljZSYmKHQuZGV2aWNlSGlzdG9ncmFtW2kuZGV2aWNlXT0odC5kZXZpY2VIaXN0b2dyYW1baS5kZXZpY2VdfHwwKSsxKSxudWxsIT1pLnhsYUNsdXN0ZXImJih0LnhsYUNsdXN0ZXJIaXN0b2dyYW1baS54bGFDbHVzdGVyXT0odC54bGFDbHVzdGVySGlzdG9ncmFtW2kueGxhQ2x1c3Rlcl18fDApKzEpLGkuY29tcGF0aWJsZT90LmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0odC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6dC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0odC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMSxTZS5leHBvcnRzLmVhY2goaS5pbkVtYmVkZGluZ3MsKGU9PntlLmNvbXBhdGlibGU/dC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KHQuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOnQuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9KHQuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGV8fDApKzF9KSksU2UuZXhwb3J0cy5lYWNoKGkub3V0RW1iZWRkaW5ncywoZT0+e2UuY29tcGF0aWJsZT90LmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0odC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6dC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0odC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMX0pKSxpLnBhcmVudE5vZGU9dCxuW2VdPXIsYS5yZW1vdmVOb2RlKGUpfSkpKX0pKX1mdW5jdGlvbiBVcXQodCxlLG4pe2xldCBpPXt9O3JldHVybiBTZS5leHBvcnRzLmVhY2godCwoZnVuY3Rpb24odCxyKXtpZih0Lmxlbmd0aDw9MSlyZXR1cm47bGV0IG89e307U2UuZXhwb3J0cy5lYWNoKHQsKGZ1bmN0aW9uKHQpe2NvbnN0IGU9IioiPT09dC5jaGFyQXQodC5sZW5ndGgtMSksaT10LnNwbGl0KCIvIikscj1pW2kubGVuZ3RoLTFdLGE9aS5zbGljZSgwLGkubGVuZ3RoLTEpLmpvaW4oIi8iKSxzPXIubWF0Y2goL14oXEQqKShcZCspJC8pO2xldCBsLGMsdT0iIjtzPyhsPXNbMV0sYz1zWzJdKToobD1lP3Iuc3Vic3RyKDAsci5sZW5ndGgtMSk6cixjPTAsdT1lPyIqIjoiIik7Y29uc3QgaD10V3QobCx1LGEpO29baF09b1toXXx8W107Y29uc3QgZD1RR3QobCx1LGEsK2MsdCxuKTtvW2hdLnB1c2goZCl9KSksU2UuZXhwb3J0cy5lYWNoKG8sKGZ1bmN0aW9uKHQsbyl7aWYodC5sZW5ndGg8MilyZXR1cm47dC5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybit0LmNsdXN0ZXJJZC0rZS5jbHVzdGVySWR9KSk7bGV0IGE9W3RbMF1dO2ZvcihsZXQgbz0xO288dC5sZW5ndGg7bysrKXtsZXQgcz10W29dO3MuY2x1c3RlcklkIT09YVthLmxlbmd0aC0xXS5jbHVzdGVySWQrMT8oR3F0KGEsaSwrcixlLG4pLGE9W3NdKTphLnB1c2gocyl9R3F0KGEsaSwrcixlLG4pfSkpfSkpLGl9ZnVuY3Rpb24ganF0KHQsZSxuKXtsZXQgaT17fTtyZXR1cm4gU2UuZXhwb3J0cy5lYWNoKHQsKGZ1bmN0aW9uKHQscil7aWYodC5sZW5ndGg8PTEpcmV0dXJuO2xldCBvPXt9LGE9e307U2UuZXhwb3J0cy5lYWNoKHQsKGZ1bmN0aW9uKHQpe2xldCBlPSIqIj09PXQuY2hhckF0KHQubGVuZ3RoLTEpLGk9dC5zcGxpdCgiLyIpLHI9aVtpLmxlbmd0aC0xXSxzPWkuc2xpY2UoMCxpLmxlbmd0aC0xKS5qb2luKCIvIik7Y29uc3QgbD0vKFxkKykvZztsZXQgYyx1LGgsZCxwLGY9MDtmb3IoO2M9bC5leGVjKHIpOykrK2YsdT1yLnNsaWNlKDAsYy5pbmRleCksaD1jWzBdLGQ9ci5zbGljZShjLmluZGV4K2NbMF0ubGVuZ3RoKSxwPXRXdCh1LGQscyksb1twXT1vW3BdLG9bcF18fChvW3BdPVFHdCh1LGQscywraCx0LG4pKSxvW3BdLmlkcy5wdXNoKGgpLGFbdF09YVt0XXx8W10sYVt0XS5wdXNoKFtwLGhdKTtmPDEmJih1PWU/ci5zdWJzdHIoMCxyLmxlbmd0aC0xKTpyLGg9MCxkPWU/IioiOiIiLHA9dFd0KHUsZCxzKSxvW3BdPW9bcF0sb1twXXx8KG9bcF09UUd0KHUsZCxzLCtoLHQsbikpLG9bcF0uaWRzLnB1c2goaCksYVt0XT1hW3RdfHxbXSxhW3RdLnB1c2goW3AsaF0pKX0pKTt2YXIgcz17fTtTZS5leHBvcnRzLmVhY2goYSwoZnVuY3Rpb24odCxlKXt0LnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG9bZVswXV0uaWRzLmxlbmd0aC1vW3RbMF1dLmlkcy5sZW5ndGh9KSk7dmFyIGk9dFswXVswXSxyPXRbMF1bMV07c1tpXT1zW2ldfHxbXTtjb25zdCBhPWUuc3BsaXQoIi8iKSxsPWEuc2xpY2UoMCxhLmxlbmd0aC0xKS5qb2luKCIvIik7dmFyIGM9UUd0KG9baV0ucHJlZml4LG9baV0uc3VmZml4LGwsK3IsZSxuKTtzW2ldLnB1c2goYyl9KSksU2UuZXhwb3J0cy5lYWNoKHMsKGZ1bmN0aW9uKHQsbyl7aWYodC5sZW5ndGg8MilyZXR1cm47dC5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybit0LmNsdXN0ZXJJZC0rZS5jbHVzdGVySWR9KSk7bGV0IGE9W3RbMF1dO2ZvcihsZXQgbz0xO288dC5sZW5ndGg7bysrKXtsZXQgcz10W29dO3MuY2x1c3RlcklkIT09YVthLmxlbmd0aC0xXS5jbHVzdGVySWQrMT8oR3F0KGEsaSwrcixlLG4pLGE9W3NdKTphLnB1c2gocyl9R3F0KGEsaSwrcixlLG4pfSkpfSkpLGl9ZnVuY3Rpb24gR3F0KHQsZSxuLGkscil7aWYodC5sZW5ndGg+MSl7bGV0IG89dFd0KHRbMF0ucHJlZml4LHRbMF0uc3VmZml4LHRbMF0ucGFyZW50LHRbMF0uY2x1c3RlcklkLHRbdC5sZW5ndGgtMV0uY2x1c3RlcklkKSxhPVFHdCh0WzBdLnByZWZpeCx0WzBdLnN1ZmZpeCx0WzBdLnBhcmVudCxuLG8scik7U2UuZXhwb3J0cy5lYWNoKHQsKGZ1bmN0aW9uKHQpe2EuaWRzLnB1c2godC5jbHVzdGVySWQpLGEubWV0YWdyYXBoLnNldE5vZGUodC5uYW1lLGkubm9kZSh0Lm5hbWUpKX0pKSxlW29dPWF9fWxldCBXcXQ9Y2xhc3MgZXh0ZW5kcyhlcihpbCh5ZSkpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fZXhwYW5kZWQ9ITAsdGhpcy5fb3BDb21wYXRDb2xvcj1oV3QsdGhpcy5fb3BJbmNvbXBhdENvbG9yPWRXdCx0aGlzLl90ZW1wbGF0ZUluZGV4PW51bGx9X2dldE5vZGUodCxlKXtyZXR1cm4gZS5ub2RlKHQpfV9nZXRSZW5kZXJJbmZvKHQsZSl7cmV0dXJuIHRoaXMucmVuZGVySGllcmFyY2h5LmdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZSh0KX1fdG9nZ2xlRXhwYW5kZWQoKXt0aGlzLl9leHBhbmRlZD0hdGhpcy5fZXhwYW5kZWR9X2dldFRvZ2dsZUljb24odCl7cmV0dXJuIHQ/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifV9yZXNpemVMaXN0KHQpe3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCk7ZSYmZS5maXJlKCJpcm9uLXJlc2l6ZSIpfWdldCBfaW5jb21wYXRpYmxlT3BOb2Rlcygpe2NvbnN0IHQ9dGhpcy5ncmFwaEhpZXJhcmNoeTtyZXR1cm4gdCYmdC5yb290Pyh0aGlzLmFzeW5jKHRoaXMuX3Jlc2l6ZUxpc3QuYmluZCh0aGlzLCIjaW5jb21wYXRpYmxlT3BzTGlzdCIpKSwoZnVuY3Rpb24gZSh0KXtjb25zdCBlPVtdLG49e307cmV0dXJuIFNlLmV4cG9ydHMuZWFjaCh0LnJvb3QubGVhdmVzKCksKGk9PntsZXQgcj10Lm5vZGUoaSk7aWYoci50eXBlPT1qR3QuT1Ape2xldCBpPXI7aWYoIWkuY29tcGF0aWJsZSlpZihpLm93bmluZ1Nlcmllcyl7aWYodC5nZXRTZXJpZXNHcm91cFR5cGUoaS5vd25pbmdTZXJpZXMpPT09V0d0LlVOR1JPVVApZS5wdXNoKGkpO2Vsc2UgaWYoIW5baS5vd25pbmdTZXJpZXNdKXtsZXQgcj10Lm5vZGUoaS5vd25pbmdTZXJpZXMpO3ImJihuW2kub3duaW5nU2VyaWVzXT1yLGUucHVzaChyKSl9fWVsc2UgZS5wdXNoKGkpO1NlLmV4cG9ydHMuZWFjaChpLmluRW1iZWRkaW5ncywodD0+e3QuY29tcGF0aWJsZXx8ZS5wdXNoKHQpfSkpLFNlLmV4cG9ydHMuZWFjaChpLm91dEVtYmVkZGluZ3MsKHQ9Pnt0LmNvbXBhdGlibGV8fGUucHVzaCh0KX0pKX19KSksZX0pKHQpKTpbXX1nZXQgX29wQ29tcGF0U2NvcmUoKXt2YXIgdD10aGlzLmdyYXBoSGllcmFyY2h5O2lmKHQmJnQucm9vdCl7dmFyIGU9dC5yb290LG49ZS5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGUsaT1lLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlO3JldHVybiAwPT1uJiYwPT1pPzA6TWF0aC5mbG9vcigxMDAqbi8obitpKSkvMTAwfXJldHVybiAwfWdldCBfb3BDb21wYXRTY29yZUxhYmVsKCl7dmFyIHQ9dGhpcy5fb3BDb21wYXRTY29yZTtyZXR1cm4gbXkoIi4wJSIpKHQpfWdldCBfdG90YWxJbmNvbXBhdE9wcygpe3ZhciB0PXRoaXMuZ3JhcGhIaWVyYXJjaHk7cmV0dXJuIHQmJnQucm9vdD90LnJvb3QuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU6MH1fZ3JhcGhIaWVyYXJjaHlDaGFuZ2VkKCl7dGhpcy5fdGVtcGxhdGVJbmRleD10aGlzLmdyYXBoSGllcmFyY2h5LmdldFRlbXBsYXRlSW5kZXgoKSx0aGlzLmdyYXBoSGllcmFyY2h5LmFkZExpc3RlbmVyKHpxdC5URU1QTEFURVNfVVBEQVRFRCwoKCk9Pnt0aGlzLl90ZW1wbGF0ZUluZGV4PXRoaXMuZ3JhcGhIaWVyYXJjaHkuZ2V0VGVtcGxhdGVJbmRleCgpfSkpfX07V3F0LnRlbXBsYXRlPV9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgbWF4LWhlaWdodDogNTAwcHg7CiAgICAgIH0KCiAgICAgIC5pbmNvbXBhdGlibGUtb3BzLWxpc3QgewogICAgICAgIGhlaWdodDogMzUwcHg7CiAgICAgICAgbWF4LWhlaWdodDogNDAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgaXJvbi1saXN0IHsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfQoKICAgICAgcGFwZXItaXRlbSB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zZWNvbmRhcnktYmFja2dyb3VuZC1jb2xvcik7CiAgICAgIH0KCiAgICAgIHBhcGVyLWl0ZW0tYm9keVt0d28tbGluZV0gewogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHggNHB4OwogICAgICB9CgogICAgICAuZXhwYW5kZWRJbmZvIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLm5vZGUtbmFtZSB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgZm9udC1zaXplOiAxNHB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC5zdWJ0aXRsZSB7CiAgICAgICAgY29sb3I6IHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKTsKICAgICAgICBmb250LXNpemU6IDEycHQ7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgbWF4LWhlaWdodDogMjBweDsKICAgICAgICBtYXgtd2lkdGg6IDIwcHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLm5vbi1jb250cm9sLWxpc3QtaXRlbSB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAxMHB4OwogICAgICB9CgogICAgICBkaXYub3AtY29tcGF0LWRpc3BsYXkgewogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2FkbHksIGJlY2F1c2UgdGhlIHdob2xlIGJvZHkgaXMgaW52ZXJ0ZWQgaW4gY29sb3IsIGxlZ2VuZHMgYWxzbyBuZWVkCiAgICAgICAqIHRvIGJlIGludmVydGVkLgogICAgICAgKiovCiAgICAgIDpob3N0KC5kYXJrLW1vZGUpIGRpdi5vcC1jb21wYXQtZGlzcGxheSB7CiAgICAgICAgZmlsdGVyOiBpbnZlcnQoMSk7CiAgICAgIH0KCiAgICAgIHN2Zy5vcC1jb21wYXQgewogICAgICAgIHdpZHRoOiAyNTBweDsKICAgICAgICBoZWlnaHQ6IDI1cHg7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KCiAgICAgIGRpdi5vcC1jb21wYXQtdmFsdWUgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGNvbG9yOiBibGFjazsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaXRlbT4KICAgICAgPHBhcGVyLWl0ZW0tYm9keSB0d28tbGluZT4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgICAgIGljb249Int7X2dldFRvZ2dsZUljb24oX2V4cGFuZGVkKX19IgogICAgICAgICAgICBvbi1jbGljaz0iX3RvZ2dsZUV4cGFuZGVkIgogICAgICAgICAgICBjbGFzcz0idG9nZ2xlLWJ1dHRvbiIKICAgICAgICAgID4KICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJub2RlLW5hbWUiIGlkPSJub2RldGl0bGUiPltbbm9kZVRpdGxlXV08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHNlY29uZGFyeT4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1YnRpdGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3AtY29tcGF0LWRpc3BsYXkiPgogICAgICAgICAgICAgIDxzdmcKICAgICAgICAgICAgICAgIGNsYXNzPSJvcC1jb21wYXQiCiAgICAgICAgICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pZCBtZWV0IgogICAgICAgICAgICAgICAgdmlld0JveD0iMCAwIDI1MCAyNSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8ZGVmcz4KICAgICAgICAgICAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJvcC1jb21wYXQtZmlsbCI+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yJD0iW1tfb3BDb21wYXRDb2xvcl1dIj48L3N0b3A+CiAgICAgICAgICAgICAgICAgICAgPHN0b3AKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCQ9IltbX29wQ29tcGF0U2NvcmVdXSIKICAgICAgICAgICAgICAgICAgICAgIHN0b3AtY29sb3IkPSJbW19vcENvbXBhdENvbG9yXV0iCiAgICAgICAgICAgICAgICAgICAgPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgICA8c3RvcAogICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0JD0iW1tfb3BDb21wYXRTY29yZV1dIgogICAgICAgICAgICAgICAgICAgICAgc3RvcC1jb2xvciQ9IltbX29wSW5jb21wYXRDb2xvcl1dIgogICAgICAgICAgICAgICAgICAgID48L3N0b3A+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yJD0iW1tfb3BJbmNvbXBhdENvbG9yIF1dIj48L3N0b3A+CiAgICAgICAgICAgICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgICAgICAgICA8L2RlZnM+CiAgICAgICAgICAgICAgICA8cmVjdAogICAgICAgICAgICAgICAgICBoZWlnaHQ9IjI1IgogICAgICAgICAgICAgICAgICB3aWR0aD0iMjUwIgogICAgICAgICAgICAgICAgICByeD0iNSIKICAgICAgICAgICAgICAgICAgcnk9IjUiCiAgICAgICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiB1cmwoJyNvcC1jb21wYXQtZmlsbCcpOyIKICAgICAgICAgICAgICAgID48L3JlY3Q+CiAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3AtY29tcGF0LXZhbHVlIj5bW19vcENvbXBhdFNjb3JlTGFiZWxdXTwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3BhcGVyLWl0ZW0tYm9keT4KICAgIDwvcGFwZXItaXRlbT4KCiAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9Int7X2V4cGFuZGVkfX0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2V4cGFuZGVkfX0iIHJlc3RhbXA9InRydWUiPgogICAgICAgIDxkaXYgY2xhc3M9ImV4cGFuZGVkSW5mbyI+CiAgICAgICAgICBJbmNvbXBhdGlibGUgT3BlcmF0aW9uczogKDxzcGFuPltbX3RvdGFsSW5jb21wYXRPcHNdXTwvc3Bhbj4pCiAgICAgICAgICA8aXJvbi1saXN0CiAgICAgICAgICAgIGNsYXNzPSJpbmNvbXBhdGlibGUtb3BzLWxpc3QiCiAgICAgICAgICAgIGlkPSJpbmNvbXBhdGlibGVPcHNMaXN0IgogICAgICAgICAgICBpdGVtcz0iW1tfaW5jb21wYXRpYmxlT3BOb2Rlc11dIgogICAgICAgICAgPgogICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLW9wLWNvbXBhdC1saXN0LWl0ZW0KICAgICAgICAgICAgICAgIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iCiAgICAgICAgICAgICAgICBpdGVtLW5vZGU9IltbaXRlbV1dIgogICAgICAgICAgICAgICAgaXRlbS1yZW5kZXItaW5mbz0iW1tfZ2V0UmVuZGVySW5mbyhpdGVtLm5hbWUsIHJlbmRlckhpZXJhcmNoeSldXSIKICAgICAgICAgICAgICAgIG5hbWU9IltbaXRlbS5uYW1lXV0iCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIgogICAgICAgICAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgICAgICAgICAgaXRlbS10eXBlPSJpbmNvbXBhdGlibGUtb3BzIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICA8L3RmLWdyYXBoLW9wLWNvbXBhdC1saXN0LWl0ZW0+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvaXJvbi1jb2xsYXBzZT4KICBgLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLERxdCldLFdxdC5wcm90b3R5cGUsImdyYXBoSGllcmFyY2h5Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLHlXdCldLFdxdC5wcm90b3R5cGUsInJlbmRlckhpZXJhcmNoeSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxXcXQucHJvdG90eXBlLCJub2RlVGl0bGUiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxXcXQucHJvdG90eXBlLCJfZXhwYW5kZWQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sV3F0LnByb3RvdHlwZSwiX29wQ29tcGF0Q29sb3IiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sV3F0LnByb3RvdHlwZSwiX29wSW5jb21wYXRDb2xvciIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLFdxdC5wcm90b3R5cGUsIl90ZW1wbGF0ZUluZGV4Iix2b2lkIDApLHQoW3MoImdyYXBoSGllcmFyY2h5IiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxXcXQucHJvdG90eXBlLCJfaW5jb21wYXRpYmxlT3BOb2RlcyIsbnVsbCksdChbcygiZ3JhcGhIaWVyYXJjaHkiKSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxXcXQucHJvdG90eXBlLCJfb3BDb21wYXRTY29yZSIsbnVsbCksdChbcygiX29wQ29tcGF0U2NvcmUiKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxXcXQucHJvdG90eXBlLCJfb3BDb21wYXRTY29yZUxhYmVsIixudWxsKSx0KFtzKCJncmFwaEhpZXJhcmNoeSIpLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLFdxdC5wcm90b3R5cGUsIl90b3RhbEluY29tcGF0T3BzIixudWxsKSx0KFthKCJncmFwaEhpZXJhcmNoeSIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sV3F0LnByb3RvdHlwZSwiX2dyYXBoSGllcmFyY2h5Q2hhbmdlZCIsbnVsbCksV3F0PXQoW2koInRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIildLFdxdCk7bGV0IHFxdD1jbGFzcyBleHRlbmRzKGVyKGlsKHllKSkpe19pdGVtVHlwZUNoYW5nZWQoKXsic3Vibm9kZSIhPT10aGlzLml0ZW1UeXBlP3RoaXMuJFsibGlzdC1pdGVtIl0uY2xhc3NMaXN0LmFkZCgiY2xpY2thYmxlIik6dGhpcy4kWyJsaXN0LWl0ZW0iXS5jbGFzc0xpc3QucmVtb3ZlKCJjbGlja2FibGUiKX1fbm9kZUxpc3RlbmVyKHQpe3RoaXMuZmlyZSgibm9kZS1saXN0LWl0ZW0tIit0LnR5cGUse2NhcmROb2RlOnRoaXMuY2FyZE5vZGUubmFtZSxub2RlTmFtZTp0aGlzLm5hbWUsdHlwZTp0aGlzLml0ZW1UeXBlfSl9X2ZhZGVkQ2xhc3ModCl7cmV0dXJuIHQmJnQuaXNGYWRlZE91dD8iZmFkZWQiOiIifX07cXF0LnRlbXBsYXRlPV9lYAogICAgPHN0eWxlPgogICAgICAjbGlzdC1pdGVtIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBjb2xvcjogdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpOwogICAgICAgIGZvbnQtc2l6ZTogMTFwdDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW06aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWdvb2dsZS15ZWxsb3ctMTAwKTsKICAgICAgfQoKICAgICAgOmhvc3QoLmRhcmstbW9kZSkgI2xpc3QtaXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXIteWVsbG93LTkwMCk7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgIC5jbGlja2FibGUgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuIHsKICAgICAgICBtYXJnaW4tbGVmdDogNDBweDsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbS5leGNsdWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuLmVkZ2UtbGFiZWwgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDNweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgICAgfQoKICAgICAgLm5vZGUtaWNvbiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMXB4OwogICAgICAgIGxlZnQ6IDJweDsKICAgICAgfQoKICAgICAgLmZhZGVkIHNwYW4gewogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1ncmFwaC1mYWRlZCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2CiAgICAgIGlkPSJsaXN0LWl0ZW0iCiAgICAgIG9uLW1vdXNlb3Zlcj0iX25vZGVMaXN0ZW5lciIKICAgICAgb24tbW91c2VvdXQ9Il9ub2RlTGlzdGVuZXIiCiAgICAgIG9uLWNsaWNrPSJfbm9kZUxpc3RlbmVyIgogICAgPgogICAgICA8ZGl2IGNsYXNzJD0ie3tfZmFkZWRDbGFzcyhpdGVtUmVuZGVySW5mbyl9fSI+CiAgICAgICAgPHRmLW5vZGUtaWNvbgogICAgICAgICAgY2xhc3M9Im5vZGUtaWNvbiIKICAgICAgICAgIGhlaWdodD0iMTIiCiAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgICBjb2xvci1ieS1wYXJhbXM9IltbY29sb3JCeVBhcmFtc11dIgogICAgICAgICAgbm9kZT0iW1tpdGVtTm9kZV1dIgogICAgICAgICAgcmVuZGVyLWluZm89IltbaXRlbVJlbmRlckluZm9dXSIKICAgICAgICAgIHRlbXBsYXRlLWluZGV4PSJbW3RlbXBsYXRlSW5kZXhdXSIKICAgICAgICA+PC90Zi1ub2RlLWljb24+CiAgICAgICAgPHNwYW4gdGl0bGUkPSJbW25hbWVdXSI+W1tuYW1lXV08L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9ImVkZ2UtbGFiZWwiPltbZWRnZUxhYmVsXV08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgYCx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxxcXQucHJvdG90eXBlLCJjYXJkTm9kZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxxcXQucHJvdG90eXBlLCJpdGVtTm9kZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxxcXQucHJvdG90eXBlLCJlZGdlTGFiZWwiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0scXF0LnByb3RvdHlwZSwiaXRlbVJlbmRlckluZm8iLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0scXF0LnByb3RvdHlwZSwibmFtZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX2l0ZW1UeXBlQ2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0scXF0LnByb3RvdHlwZSwiaXRlbVR5cGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0scXF0LnByb3RvdHlwZSwiY29sb3JCeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxxcXQucHJvdG90eXBlLCJjb2xvckJ5UGFyYW1zIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHFxdC5wcm90b3R5cGUsInRlbXBsYXRlSW5kZXgiLHZvaWQgMCkscXF0PXQoW2koInRmLW5vZGUtbGlzdC1pdGVtIildLHFxdCk7bGV0IFlxdD1jbGFzcyBleHRlbmRzKGVyKHllKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX2V4cGFuZGVkPSEwLHRoaXMuX29wZW5lZENvbnRyb2xQcmVkPSExLHRoaXMuX29wZW5lZENvbnRyb2xTdWNjPSExLHRoaXMuX3RlbXBsYXRlSW5kZXg9bnVsbH1leHBhbmROb2RlKCl7dGhpcy5maXJlKCJfbm9kZS5leHBhbmQiLHRoaXMubm9kZSl9X2dldE5vZGUodCxlKXtyZXR1cm4gZS5ub2RlKHQpfV9nZXROb2RlU3RhdHModCxlKXt2YXIgbj10aGlzLl9nZXROb2RlKHQsZSk7cmV0dXJuIG4/bi5zdGF0czpudWxsfV9nZXRUb3RhbE1pY3Jvcyh0KXtyZXR1cm4gdD90LmdldFRvdGFsTWljcm9zKCk6MH1nZXQgX2hhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzKCl7cmV0dXJuIE9HdCh0aGlzLl9ub2RlU3RhdHMpfWdldCBfbm9kZVN0YXRzRm9ybWF0dGVkQnl0ZXMoKXt2YXIgdD10aGlzLl9ub2RlU3RhdHM7aWYodCYmdC50b3RhbEJ5dGVzKXJldHVybiBSR3QodC50b3RhbEJ5dGVzLE5HdCl9Z2V0IF9ub2RlU3RhdHNGb3JtYXR0ZWRDb21wdXRlVGltZSgpe3ZhciB0PXRoaXMuX25vZGVTdGF0cztpZih0JiZ0LmdldFRvdGFsTWljcm9zKCkpcmV0dXJuIFJHdCh0LmdldFRvdGFsTWljcm9zKCksSUd0KX1nZXQgX25vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzKCl7dmFyIHQ9dGhpcy5fbm9kZVN0YXRzO2lmKHQmJnQub3V0cHV0U2l6ZSYmdC5vdXRwdXRTaXplLmxlbmd0aClyZXR1cm4gU2UuZXhwb3J0cy5tYXAodC5vdXRwdXRTaXplLChmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQubGVuZ3RoPyJzY2FsYXIiOiJbIit0LmpvaW4oIiwgIikrIl0ifSkpfV9nZXRSZW5kZXJJbmZvKHQsZSl7cmV0dXJuIHRoaXMucmVuZGVySGllcmFyY2h5LmdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZSh0KX1nZXQgX2F0dHJpYnV0ZXMoKXt2YXIgdD10aGlzLl9ub2RlO2lmKHRoaXMuYXN5bmModGhpcy5fcmVzaXplTGlzdC5iaW5kKHRoaXMsIiNhdHRyaWJ1dGVzTGlzdCIpKSwhdHx8IXQuYXR0cilyZXR1cm5bXTt2YXIgZT1bXTtyZXR1cm4gU2UuZXhwb3J0cy5lYWNoKHQuYXR0ciwoZnVuY3Rpb24odCl7Il90b29fbGFyZ2VfYXR0cnMiPT09dC5rZXk/ZT1lLmNvbmNhdCh0LnZhbHVlLmxpc3Qucy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybntrZXk6dCx2YWx1ZToiVG9vIGxhcmdlIHRvIHNob3cuLi4ifX0pKSk6ZS5wdXNoKHtrZXk6dC5rZXksdmFsdWU6SlNPTi5zdHJpbmdpZnkodC52YWx1ZSl9KX0pKSxlfWdldCBfZGV2aWNlKCl7dmFyIHQ9dGhpcy5fbm9kZTtyZXR1cm4gdD90LmRldmljZTpudWxsfWdldCBfc3VjY2Vzc29ycygpe3ZhciB0PXRoaXMuX25vZGUsZT10aGlzLmdyYXBoSGllcmFyY2h5O3JldHVybiB0aGlzLl9yZWZyZXNoTm9kZUl0ZW1MaXN0KCJpbnB1dHNMaXN0IiksdD90aGlzLl9jb252ZXJ0RWRnZUxpc3RUb0VkZ2VJbmZvTGlzdChlLmdldFN1Y2Nlc3NvcnModC5uYW1lKSwhMSx0LmlzR3JvdXBOb2RlKTp7cmVndWxhcjpbXSxjb250cm9sOltdfX1nZXQgX3ByZWRlY2Vzc29ycygpe3ZhciB0PXRoaXMuX25vZGUsZT10aGlzLmdyYXBoSGllcmFyY2h5O3JldHVybiB0aGlzLl9yZWZyZXNoTm9kZUl0ZW1MaXN0KCJvdXRwdXRzTGlzdCIpLHQ/dGhpcy5fY29udmVydEVkZ2VMaXN0VG9FZGdlSW5mb0xpc3QoZS5nZXRQcmVkZWNlc3NvcnModC5uYW1lKSwhMCx0LmlzR3JvdXBOb2RlKTp7cmVndWxhcjpbXSxjb250cm9sOltdfX1nZXQgX2Z1bmN0aW9uVXNhZ2VzKCl7dmFyIHQ9dGhpcy5fbm9kZSxlPXRoaXMuZ3JhcGhIaWVyYXJjaHk7aWYodGhpcy5fcmVmcmVzaE5vZGVJdGVtTGlzdCgiZnVuY3Rpb25Vc2FnZXNMaXN0IiksIXR8fHQudHlwZSE9PWpHdC5NRVRBKXJldHVybltdO2NvbnN0IG49ZS5saWJyYXJ5RnVuY3Rpb25zW3QuYXNzb2NpYXRlZEZ1bmN0aW9uXTtyZXR1cm4gbj9uLnVzYWdlczpbXX1fcmVmcmVzaE5vZGVJdGVtTGlzdCh0KXt0aGlzLmFzeW5jKHRoaXMuX3Jlc2l6ZUxpc3QuYmluZCh0aGlzLGAjJHt0fWApKX1fY29udmVydEVkZ2VMaXN0VG9FZGdlSW5mb0xpc3QodCxlLG4pe3ZhciBpPXQ9PlNlLmV4cG9ydHMubWFwKHQuYmFzZUVkZ2VMaXN0LCh0PT57dmFyIG49ZT90LnY6dC53O3JldHVybntuYW1lOm4sbm9kZTp0aGlzLl9nZXROb2RlKG4sdGhpcy5ncmFwaEhpZXJhcmNoeSksZWRnZUxhYmVsOnRxdCh0LHRoaXMucmVuZGVySGllcmFyY2h5KSxyZW5kZXJJbmZvOnRoaXMuX2dldFJlbmRlckluZm8obix0aGlzLnJlbmRlckhpZXJhcmNoeSl9fSkpLHI9ZnVuY3Rpb24odCl7dmFyIHI9W107cmV0dXJuIFNlLmV4cG9ydHMuZWFjaCh0LCh0PT57dmFyIG89ZT90LnY6dC53O24mJjEhPXQuYmFzZUVkZ2VMaXN0Lmxlbmd0aD9yLnB1c2goe25hbWU6byxub2RlOnRoaXMuX2dldE5vZGUobyx0aGlzLmdyYXBoSGllcmFyY2h5KSxlZGdlTGFiZWw6ZXF0KHQsdGhpcy5yZW5kZXJIaWVyYXJjaHkpLHJlbmRlckluZm86dGhpcy5fZ2V0UmVuZGVySW5mbyhvLHRoaXMucmVuZGVySGllcmFyY2h5KX0pOnI9ci5jb25jYXQoaSh0KSl9KSkscn0uYmluZCh0aGlzKTtyZXR1cm57cmVndWxhcjpyKHQucmVndWxhciksY29udHJvbDpyKHQuY29udHJvbCl9fWdldCBfc3Vibm9kZXMoKXt2YXIgdD10aGlzLl9ub2RlO3JldHVybiB0JiZ0Lm1ldGFncmFwaD90Lm1ldGFncmFwaC5ub2RlcygpOm51bGx9Z2V0IF90b3RhbFByZWRlY2Vzc29ycygpe3ZhciB0PXRoaXMuX3ByZWRlY2Vzc29ycztyZXR1cm4gdC5yZWd1bGFyLmxlbmd0aCt0LmNvbnRyb2wubGVuZ3RofWdldCBfdG90YWxTdWNjZXNzb3JzKCl7dmFyIHQ9dGhpcy5fc3VjY2Vzc29ycztyZXR1cm4gdC5yZWd1bGFyLmxlbmd0aCt0LmNvbnRyb2wubGVuZ3RofV90b2dnbGVDb250cm9sUHJlZCgpe3RoaXMuX29wZW5lZENvbnRyb2xQcmVkPSF0aGlzLl9vcGVuZWRDb250cm9sUHJlZH1fdG9nZ2xlQ29udHJvbFN1Y2MoKXt0aGlzLl9vcGVuZWRDb250cm9sU3VjYz0hdGhpcy5fb3BlbmVkQ29udHJvbFN1Y2N9X3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5fZXhwYW5kZWQ9IXRoaXMuX2V4cGFuZGVkfV9nZXRUb2dnbGVJY29uKHQpe3JldHVybiB0PyJleHBhbmQtbGVzcyI6ImV4cGFuZC1tb3JlIn1fcmVzZXRTdGF0ZSgpe3RoaXMuX29wZW5lZENvbnRyb2xQcmVkPSExLHRoaXMuX29wZW5lZENvbnRyb2xTdWNjPSExLHRoaXMuc2V0KCJfZ3JvdXBCdXR0b25UZXh0IixwcXQodGhpcy5fbm9kZSkpfV9yZXNpemVMaXN0KHQpe3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCk7ZSYmZS5maXJlKCJpcm9uLXJlc2l6ZSIpfV90b2dnbGVJbmNsdWRlKCl7dGhpcy5maXJlKCJub2RlLXRvZ2dsZS1pbmNsdXNpb24iLHtuYW1lOnRoaXMuZ3JhcGhOb2RlTmFtZX0pfV9ub2RlSW5jbHVkZVN0YXRlQ2hhbmdlZCh0LGUpe3RoaXMuc2V0KCJfYXV4QnV0dG9uVGV4dCIsdVd0KHQpKX1fdG9nZ2xlR3JvdXAoKXt2YXIgdD1kcXQodGhpcy5fbm9kZSk7dGhpcy5maXJlKCJub2RlLXRvZ2dsZS1zZXJpZXNncm91cCIse25hbWU6dH0pfV9pc0xpYnJhcnlGdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5uYW1lLnN0YXJ0c1dpdGgoVkd0KX1faXNJblNlcmllcyh0KXtyZXR1cm4gaHF0KHQpfV9ncmFwaEhpZXJhcmNoeUNoYW5nZWQoKXt0aGlzLl90ZW1wbGF0ZUluZGV4PXRoaXMuZ3JhcGhIaWVyYXJjaHkuZ2V0VGVtcGxhdGVJbmRleCgpLHRoaXMuZ3JhcGhIaWVyYXJjaHkuYWRkTGlzdGVuZXIoenF0LlRFTVBMQVRFU19VUERBVEVELCgoKT0+e3RoaXMuX3RlbXBsYXRlSW5kZXg9dGhpcy5ncmFwaEhpZXJhcmNoeS5nZXRUZW1wbGF0ZUluZGV4KCl9KSl9fTtZcXQudGVtcGxhdGU9X2VgCiAgICA8c3R5bGU+CiAgICAgIC5zdWItbGlzdC1ncm91cCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBmb250LXNpemU6IDEycHQ7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDhweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0IHsKICAgICAgICBtYXgtaGVpZ2h0OiAzMDBweDsKICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7CiAgICAgIH0KCiAgICAgIC5hdHRyLWxlZnQgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIHdpZHRoOiAzMCU7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIGNvbG9yOiB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcik7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KCiAgICAgIC5hdHRyLXJpZ2h0IHsKICAgICAgICBtYXJnaW4tbGVmdDogMzAlOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBjb2xvcjogdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpOwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZSB7CiAgICAgICAgZGlzcGxheTogdGFibGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZS1yb3cgewogICAgICAgIGRpc3BsYXk6IHRhYmxlLXJvdzsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0LXRhYmxlLXJvdyAuc3ViLWxpc3QtdGFibGUtY2VsbDpsYXN0LWNoaWxkIHsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0LXRhYmxlLWNlbGwgewogICAgICAgIGNvbG9yOiB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcik7CiAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbDsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBtYXgtd2lkdGg6IDIwMHB4OwogICAgICAgIHBhZGRpbmc6IDAgNHB4OwogICAgICB9CgogICAgICBwYXBlci1pdGVtIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvcik7CiAgICAgIH0KCiAgICAgIHBhcGVyLWl0ZW0tYm9keVt0d28tbGluZV0gewogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHggNHB4OwogICAgICB9CgogICAgICAuZXhwYW5kZWRJbmZvIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgfQoKICAgICAgLmNvbnRyb2xEZXBzIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCA4cHg7CiAgICAgIH0KCiAgICAgIC5ub2RlLW5hbWUgewogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIGZvbnQtc2l6ZTogMTRwdDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICB9CgogICAgICAubm9kZS1pY29uIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KCiAgICAgIC5zdWJ0aXRsZSB7CiAgICAgICAgY29sb3I6IHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKTsKICAgICAgICBmb250LXNpemU6IDEycHQ7CiAgICAgIH0KCiAgICAgIC5jb250cm9sTGluZSB7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgbWF4LWhlaWdodDogMjBweDsKICAgICAgICBtYXgtd2lkdGg6IDIwcHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLmNvbnRyb2wtdG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgbWF4LWhlaWdodDogMjBweDsKICAgICAgICBtYXgtd2lkdGg6IDIwcHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1pbmNsdWRlLWdyb3VwIHsKICAgICAgICBwYWRkaW5nLXRvcDogNHB4OwogICAgICB9CgogICAgICAudG9nZ2xlLWluY2x1ZGUgewogICAgICAgIG1hcmdpbjogNXB4IDZweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICBwYWRkaW5nOiA0cHggNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhOwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAudG9nZ2xlLWluY2x1ZGU6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWdvb2dsZS15ZWxsb3ctMTAwKTsKICAgICAgfQoKICAgICAgLm5vbi1jb250cm9sLWxpc3QtaXRlbSB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHBhcGVyLWl0ZW0+CiAgICAgIDxwYXBlci1pdGVtLWJvZHkgdHdvLWxpbmU+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgICAgICBpY29uPSJ7e19nZXRUb2dnbGVJY29uKF9leHBhbmRlZCl9fSIKICAgICAgICAgICAgb24tY2xpY2s9Il90b2dnbGVFeHBhbmRlZCIKICAgICAgICAgICAgY2xhc3M9InRvZ2dsZS1idXR0b24iCiAgICAgICAgICA+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm9kZS1uYW1lIj4KICAgICAgICAgICAgPHRmLXdici1zdHJpbmcgdmFsdWU9IltbX25vZGUubmFtZV1dIiBkZWxpbWl0ZXItcGF0dGVybj0iLyI+CiAgICAgICAgICAgIDwvdGYtd2JyLXN0cmluZz4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgc2Vjb25kYXJ5PgogICAgICAgICAgPHRmLW5vZGUtaWNvbgogICAgICAgICAgICBjbGFzcz0ibm9kZS1pY29uIgogICAgICAgICAgICBub2RlPSJbW19ub2RlXV0iCiAgICAgICAgICAgIHJlbmRlci1pbmZvPSJbW19nZXRSZW5kZXJJbmZvKGdyYXBoTm9kZU5hbWUsIHJlbmRlckhpZXJhcmNoeSldXSIKICAgICAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgICAgICB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIgogICAgICAgICAgPjwvdGYtbm9kZS1pY29uPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19ub2RlLm9wfX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWJ0aXRsZSI+CiAgICAgICAgICAgICAgT3BlcmF0aW9uOgogICAgICAgICAgICAgIDxzcGFuPltbX25vZGUub3BdXTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19ub2RlLm1ldGFncmFwaH19Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3VidGl0bGUiPgogICAgICAgICAgICAgIFN1YmdyYXBoOgogICAgICAgICAgICAgIDxzcGFuPltbX25vZGUuY2FyZGluYWxpdHldXTwvc3Bhbj4gbm9kZXMKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3BhcGVyLWl0ZW0tYm9keT4KICAgIDwvcGFwZXItaXRlbT4KICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0ie3tfZXhwYW5kZWR9fSI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfZXhwYW5kZWR9fSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZXhwYW5kZWRJbmZvIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIGF0dHJpYnV0ZXMiPgogICAgICAgICAgICBBdHRyaWJ1dGVzICg8c3Bhbj5bW19hdHRyaWJ1dGVzLmxlbmd0aF1dPC9zcGFuPikKICAgICAgICAgICAgPGlyb24tbGlzdAogICAgICAgICAgICAgIGNsYXNzPSJzdWItbGlzdCIKICAgICAgICAgICAgICBpZD0iYXR0cmlidXRlc0xpc3QiCiAgICAgICAgICAgICAgaXRlbXM9IltbX2F0dHJpYnV0ZXNdXSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF0dHItbGVmdCI+W1tpdGVtLmtleV1dPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF0dHItcmlnaHQiPltbaXRlbS52YWx1ZV1dPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfZGV2aWNlfX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC1ncm91cCBkZXZpY2UiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF0dHItbGVmdCI+RGV2aWNlPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYXR0ci1yaWdodCI+W1tfZGV2aWNlXV08L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIHByZWRlY2Vzc29ycyI+CiAgICAgICAgICAgIElucHV0cyAoPHNwYW4+W1tfdG90YWxQcmVkZWNlc3NvcnNdXTwvc3Bhbj4pCiAgICAgICAgICAgIDxpcm9uLWxpc3QKICAgICAgICAgICAgICBjbGFzcz0ic3ViLWxpc3QiCiAgICAgICAgICAgICAgaWQ9ImlucHV0c0xpc3QiCiAgICAgICAgICAgICAgaXRlbXM9IltbX3ByZWRlY2Vzc29ycy5yZWd1bGFyXV0iCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtbm9kZS1saXN0LWl0ZW0KICAgICAgICAgICAgICAgICAgY2xhc3M9Im5vbi1jb250cm9sLWxpc3QtaXRlbSIKICAgICAgICAgICAgICAgICAgY2FyZC1ub2RlPSJbW19ub2RlXV0iCiAgICAgICAgICAgICAgICAgIGl0ZW0tbm9kZT0iW1tpdGVtLm5vZGVdXSIKICAgICAgICAgICAgICAgICAgZWRnZS1sYWJlbD0iW1tpdGVtLmVkZ2VMYWJlbF1dIgogICAgICAgICAgICAgICAgICBpdGVtLXJlbmRlci1pbmZvPSJbW2l0ZW0ucmVuZGVySW5mb11dIgogICAgICAgICAgICAgICAgICBuYW1lPSJbW2l0ZW0ubmFtZV1dIgogICAgICAgICAgICAgICAgICBpdGVtLXR5cGU9InByZWRlY2Vzc29ycyIKICAgICAgICAgICAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPC90Zi1ub2RlLWxpc3QtaXRlbT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19wcmVkZWNlc3NvcnMuY29udHJvbC5sZW5ndGhdXSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbERlcHMiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbExpbmUiPgogICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICAgICAgICAgICAgICBpY29uPSJ7e19nZXRUb2dnbGVJY29uKF9vcGVuZWRDb250cm9sUHJlZCl9fSIKICAgICAgICAgICAgICAgICAgICBvbi1jbGljaz0iX3RvZ2dsZUNvbnRyb2xQcmVkIgogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJjb250cm9sLXRvZ2dsZS1idXR0b24iCiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgQ29udHJvbCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19vcGVuZWRDb250cm9sUHJlZH19IiBuby1hbmltYXRpb24+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgICAgICAgICAgIGlzPSJkb20taWYiCiAgICAgICAgICAgICAgICAgICAgaWY9Int7X29wZW5lZENvbnRyb2xQcmVkfX0iCiAgICAgICAgICAgICAgICAgICAgcmVzdGFtcD0idHJ1ZSIKICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgIDxpcm9uLWxpc3QKICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJzdWItbGlzdCIKICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zPSJbW19wcmVkZWNlc3NvcnMuY29udHJvbF1dIgogICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC1ub2RlPSJbW19ub2RlXV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS1ub2RlPSJbW2l0ZW0ubm9kZV1dIgogICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iW1tpdGVtLm5hbWVdXSIKICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLXR5cGU9InByZWRlY2Vzc29ycyIKICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSIKICAgICAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIHN1Y2Nlc3NvcnMiPgogICAgICAgICAgICBPdXRwdXRzICg8c3Bhbj5bW190b3RhbFN1Y2Nlc3NvcnNdXTwvc3Bhbj4pCiAgICAgICAgICAgIDxpcm9uLWxpc3QKICAgICAgICAgICAgICBjbGFzcz0ic3ViLWxpc3QiCiAgICAgICAgICAgICAgaWQ9Im91dHB1dHNMaXN0IgogICAgICAgICAgICAgIGl0ZW1zPSJbW19zdWNjZXNzb3JzLnJlZ3VsYXJdXSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1ub2RlLWxpc3QtaXRlbQogICAgICAgICAgICAgICAgICBjbGFzcz0ibm9uLWNvbnRyb2wtbGlzdC1pdGVtIgogICAgICAgICAgICAgICAgICBjYXJkLW5vZGU9IltbX25vZGVdXSIKICAgICAgICAgICAgICAgICAgaXRlbS1ub2RlPSJbW2l0ZW0ubm9kZV1dIgogICAgICAgICAgICAgICAgICBlZGdlLWxhYmVsPSJbW2l0ZW0uZWRnZUxhYmVsXV0iCiAgICAgICAgICAgICAgICAgIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iCiAgICAgICAgICAgICAgICAgIG5hbWU9IltbaXRlbS5uYW1lXV0iCiAgICAgICAgICAgICAgICAgIGl0ZW0tdHlwZT0ic3VjY2Vzc29yIgogICAgICAgICAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvaXJvbi1saXN0PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3N1Y2Nlc3NvcnMuY29udHJvbC5sZW5ndGhdXSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbERlcHMiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbExpbmUiPgogICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICAgICAgICAgICAgICBpY29uPSJ7e19nZXRUb2dnbGVJY29uKF9vcGVuZWRDb250cm9sU3VjYyl9fSIKICAgICAgICAgICAgICAgICAgICBvbi1jbGljaz0iX3RvZ2dsZUNvbnRyb2xTdWNjIgogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJjb250cm9sLXRvZ2dsZS1idXR0b24iCiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgQ29udHJvbCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19vcGVuZWRDb250cm9sU3VjY319IiBuby1hbmltYXRpb24+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgICAgICAgICAgIGlzPSJkb20taWYiCiAgICAgICAgICAgICAgICAgICAgaWY9Int7X29wZW5lZENvbnRyb2xTdWNjfX0iCiAgICAgICAgICAgICAgICAgICAgcmVzdGFtcD0idHJ1ZSIKICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgIDxpcm9uLWxpc3QgY2xhc3M9InN1Yi1saXN0IiBpdGVtcz0iW1tfc3VjY2Vzc29ycy5jb250cm9sXV0iPgogICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICA8dGYtbm9kZS1saXN0LWl0ZW0KICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLW5vZGU9IltbX25vZGVdXSIKICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS1yZW5kZXItaW5mbz0iW1tpdGVtLnJlbmRlckluZm9dXSIKICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJbW2l0ZW0ubmFtZV1dIgogICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tdHlwZT0ic3VjY2Vzc29ycyIKICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSIKICAgICAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19oYXNEaXNwbGF5YWJsZU5vZGVTdGF0c319Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgbm9kZS1zdGF0cyI+CiAgICAgICAgICAgICAgTm9kZSBTdGF0cwogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlIj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfbm9kZVN0YXRzLnRvdGFsQnl0ZXN9fSI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLXJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtY2VsbCI+TWVtb3J5PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICBbW19ub2RlU3RhdHNGb3JtYXR0ZWRCeXRlc11dCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfZ2V0VG90YWxNaWNyb3MoX25vZGVTdGF0cyl9fSI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLXJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtY2VsbCI+Q29tcHV0ZSBUaW1lPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICBbW19ub2RlU3RhdHNGb3JtYXR0ZWRDb21wdXRlVGltZV1dCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfbm9kZVN0YXRzLm91dHB1dFNpemV9fSI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLXJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtY2VsbCI+VGVuc29yIE91dHB1dCBTaXplczwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPgogICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIGlzPSJkb20tcmVwZWF0IgogICAgICAgICAgICAgICAgICAgICAgICBpdGVtcz0ie3tfbm9kZVN0YXRzRm9ybWF0dGVkT3V0cHV0U2l6ZXN9fSIKICAgICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgICAgW1tpdGVtXV0gPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2Z1bmN0aW9uVXNhZ2VzLmxlbmd0aF1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgcHJlZGVjZXNzb3JzIj4KICAgICAgICAgICAgICBVc2FnZXMgb2YgdGhlIEZ1bmN0aW9uICg8c3Bhbj5bW19mdW5jdGlvblVzYWdlcy5sZW5ndGhdXTwvc3Bhbj4pCiAgICAgICAgICAgICAgPGlyb24tbGlzdAogICAgICAgICAgICAgICAgY2xhc3M9InN1Yi1saXN0IgogICAgICAgICAgICAgICAgaWQ9ImZ1bmN0aW9uVXNhZ2VzTGlzdCIKICAgICAgICAgICAgICAgIGl0ZW1zPSJbW19mdW5jdGlvblVzYWdlc11dIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtCiAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im5vbi1jb250cm9sLWxpc3QtaXRlbSIKICAgICAgICAgICAgICAgICAgICBjYXJkLW5vZGU9IltbX25vZGVdXSIKICAgICAgICAgICAgICAgICAgICBpdGVtLW5vZGU9IltbaXRlbV1dIgogICAgICAgICAgICAgICAgICAgIG5hbWU9IltbaXRlbS5uYW1lXV0iCiAgICAgICAgICAgICAgICAgICAgaXRlbS10eXBlPSJmdW5jdGlvblVzYWdlcyIKICAgICAgICAgICAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSIKICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzTGlicmFyeUZ1bmN0aW9uKF9ub2RlKV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9nZ2xlLWluY2x1ZGUtZ3JvdXAiPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24KICAgICAgICAgICAgICAgIHJhaXNlZAogICAgICAgICAgICAgICAgY2xhc3M9InRvZ2dsZS1pbmNsdWRlIgogICAgICAgICAgICAgICAgb24tY2xpY2s9Il90b2dnbGVJbmNsdWRlIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxzcGFuPltbX2F1eEJ1dHRvblRleHRdXTwvc3Bhbj4KICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfaXNJblNlcmllcyhfbm9kZSl9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1pbmNsdWRlLWdyb3VwIj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgICByYWlzZWQKICAgICAgICAgICAgICAgIGNsYXNzPSJ0b2dnbGUtaW5jbHVkZSIKICAgICAgICAgICAgICAgIG9uLWNsaWNrPSJfdG9nZ2xlR3JvdXAiCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPHNwYW4+W1tfZ3JvdXBCdXR0b25UZXh0XV08L3NwYW4+CiAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvaXJvbi1jb2xsYXBzZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFlxdC5wcm90b3R5cGUsImdyYXBoTm9kZU5hbWUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRHF0KV0sWXF0LnByb3RvdHlwZSwiZ3JhcGhIaWVyYXJjaHkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sWXF0LnByb3RvdHlwZSwicmVuZGVySGllcmFyY2h5Iix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFlxdC5wcm90b3R5cGUsImNvbG9yQnkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9nZXROb2RlKGdyYXBoTm9kZU5hbWUsIGdyYXBoSGllcmFyY2h5KSIsb2JzZXJ2ZXI6Il9yZXNldFN0YXRlIn0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxZcXQucHJvdG90eXBlLCJfbm9kZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldE5vZGVTdGF0cyhncmFwaE5vZGVOYW1lLCBncmFwaEhpZXJhcmNoeSkiLG9ic2VydmVyOiJfcmVzZXRTdGF0ZSJ9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sWXF0LnByb3RvdHlwZSwiX25vZGVTdGF0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcixvYnNlcnZlcjoiX25vZGVJbmNsdWRlU3RhdGVDaGFuZ2VkIn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxZcXQucHJvdG90eXBlLCJub2RlSW5jbHVkZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFlxdC5wcm90b3R5cGUsIl9leHBhbmRlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFlxdC5wcm90b3R5cGUsIl9vcGVuZWRDb250cm9sUHJlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFlxdC5wcm90b3R5cGUsIl9vcGVuZWRDb250cm9sU3VjYyIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxZcXQucHJvdG90eXBlLCJfYXV4QnV0dG9uVGV4dCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxZcXQucHJvdG90eXBlLCJfZ3JvdXBCdXR0b25UZXh0Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKV0sWXF0LnByb3RvdHlwZSwiX3RlbXBsYXRlSW5kZXgiLHZvaWQgMCksdChbcygiX25vZGVTdGF0cyIpLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxZcXQucHJvdG90eXBlLCJfaGFzRGlzcGxheWFibGVOb2RlU3RhdHMiLG51bGwpLHQoW3MoIl9ub2RlU3RhdHMiKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxZcXQucHJvdG90eXBlLCJfbm9kZVN0YXRzRm9ybWF0dGVkQnl0ZXMiLG51bGwpLHQoW3MoIl9ub2RlU3RhdHMiKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxZcXQucHJvdG90eXBlLCJfbm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWUiLG51bGwpLHQoW3MoIl9ub2RlU3RhdHMiKSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLFlxdC5wcm90b3R5cGUsIl9ub2RlU3RhdHNGb3JtYXR0ZWRPdXRwdXRTaXplcyIsbnVsbCksdChbcygiX25vZGUiKSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLFlxdC5wcm90b3R5cGUsIl9hdHRyaWJ1dGVzIixudWxsKSx0KFtzKCJfbm9kZSIpLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLFlxdC5wcm90b3R5cGUsIl9kZXZpY2UiLG51bGwpLHQoW3MoIl9ub2RlIiwiZ3JhcGhIaWVyYXJjaHkiKSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxZcXQucHJvdG90eXBlLCJfc3VjY2Vzc29ycyIsbnVsbCksdChbcygiX25vZGUiLCJncmFwaEhpZXJhcmNoeSIpLGUoImRlc2lnbjp0eXBlIixPYmplY3QpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLFlxdC5wcm90b3R5cGUsIl9wcmVkZWNlc3NvcnMiLG51bGwpLHQoW3MoIl9ub2RlIiwiZ3JhcGhIaWVyYXJjaHkiKSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLFlxdC5wcm90b3R5cGUsIl9mdW5jdGlvblVzYWdlcyIsbnVsbCksdChbcygiX25vZGUiKSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLFlxdC5wcm90b3R5cGUsIl9zdWJub2RlcyIsbnVsbCksdChbcygiX3ByZWRlY2Vzc29ycyIpLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLFlxdC5wcm90b3R5cGUsIl90b3RhbFByZWRlY2Vzc29ycyIsbnVsbCksdChbcygiX3N1Y2Nlc3NvcnMiKSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxZcXQucHJvdG90eXBlLCJfdG90YWxTdWNjZXNzb3JzIixudWxsKSx0KFthKCJncmFwaEhpZXJhcmNoeSIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sWXF0LnByb3RvdHlwZSwiX2dyYXBoSGllcmFyY2h5Q2hhbmdlZCIsbnVsbCksWXF0PXQoW2koInRmLW5vZGUtaW5mbyIpXSxZcXQpO2xldCBYcXQ9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe3JlYWR5KCl7c3VwZXIucmVhZHkoKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoIm5vZGUtbGlzdC1pdGVtLWNsaWNrIix0aGlzLl9ub2RlTGlzdEl0ZW1DbGlja2VkLmJpbmQodGhpcykpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigibm9kZS1saXN0LWl0ZW0tbW91c2VvdmVyIix0aGlzLl9ub2RlTGlzdEl0ZW1Nb3VzZW92ZXIuYmluZCh0aGlzKSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJub2RlLWxpc3QtaXRlbS1tb3VzZW91dCIsdGhpcy5fbm9kZUxpc3RJdGVtTW91c2VvdXQuYmluZCh0aGlzKSl9X25vZGVMaXN0SXRlbUNsaWNrZWQodCl7dGhpcy5zZWxlY3RlZE5vZGU9dC5kZXRhaWwubm9kZU5hbWV9X25vZGVMaXN0SXRlbU1vdXNlb3Zlcih0KXt0aGlzLmhpZ2hsaWdodGVkTm9kZT10LmRldGFpbC5ub2RlTmFtZX1fbm9kZUxpc3RJdGVtTW91c2VvdXQoKXt0aGlzLmhpZ2hsaWdodGVkTm9kZT1udWxsfV9oZWFsdGhQaWxsc0F2YWlsYWJsZSh0LGUpe3JldHVybiB0JiZlJiZPYmplY3Qua2V5cyhlKS5sZW5ndGg+MH1fZXF1YWxzKHQsZSl7cmV0dXJuIHQ9PT1lfX07WHF0LnRlbXBsYXRlPV9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tc2Vjb25kYXJ5LWJhY2tncm91bmQtY29sb3IpOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXgtaGVpZ2h0OiA2NTBweDsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgaDIgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tzZWxlY3RlZE5vZGV9fSI+CiAgICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGNsYXNzPSJjYXJkIj4KICAgICAgICA8dGYtbm9kZS1pbmZvCiAgICAgICAgICBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIKICAgICAgICAgIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iCiAgICAgICAgICBmbGF0LWdyYXBoPSJbW2dyYXBoXV0iCiAgICAgICAgICBncmFwaC1ub2RlLW5hbWU9Iltbc2VsZWN0ZWROb2RlXV0iCiAgICAgICAgICBub2RlLWluY2x1ZGU9Iltbc2VsZWN0ZWROb2RlSW5jbHVkZV1dIgogICAgICAgICAgaGlnaGxpZ2h0ZWQtbm9kZT0ie3toaWdobGlnaHRlZE5vZGV9fSIKICAgICAgICAgIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIKICAgICAgICA+CiAgICAgICAgPC90Zi1ub2RlLWluZm8+CiAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ29wX2NvbXBhdGliaWxpdHknKV1dIj4KICAgICAgPHRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkCiAgICAgICAgZ3JhcGgtaGllcmFyY2h5PSJbW2dyYXBoSGllcmFyY2h5XV0iCiAgICAgICAgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIKICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgbm9kZS10aXRsZT0iW1tjb21wYXROb2RlVGl0bGVdXSIKICAgICAgPgogICAgICA8L3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkPgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZQogICAgICBpcz0iZG9tLWlmIgogICAgICBpZj0iW1tfaGVhbHRoUGlsbHNBdmFpbGFibGUoZGVidWdnZXJEYXRhRW5hYmxlZCwgbm9kZU5hbWVzVG9IZWFsdGhQaWxscyldXSIKICAgID4KICAgICAgPHRmLWdyYXBoLWRlYnVnZ2VyLWRhdGEtY2FyZAogICAgICAgIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iCiAgICAgICAgZGVidWdnZXItbnVtZXJpYy1hbGVydHM9IltbZGVidWdnZXJOdW1lcmljQWxlcnRzXV0iCiAgICAgICAgbm9kZS1uYW1lcy10by1oZWFsdGgtcGlsbHM9Iltbbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIgogICAgICAgIHNlbGVjdGVkLW5vZGU9Int7c2VsZWN0ZWROb2RlfX0iCiAgICAgICAgaGlnaGxpZ2h0ZWQtbm9kZT0ie3toaWdobGlnaHRlZE5vZGV9fSIKICAgICAgICBhcmUtaGVhbHRoLXBpbGxzLWxvYWRpbmc9IltbYXJlSGVhbHRoUGlsbHNMb2FkaW5nXV0iCiAgICAgICAgYWxsLXN0ZXBzLW1vZGUtZW5hYmxlZD0ie3thbGxTdGVwc01vZGVFbmFibGVkfX0iCiAgICAgICAgc3BlY2lmaWMtaGVhbHRoLXBpbGwtc3RlcD0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iCiAgICAgICAgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0ie3toZWFsdGhQaWxsU3RlcEluZGV4fX0iCiAgICAgID4KICAgICAgPC90Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQ+CiAgICA8L3RlbXBsYXRlPgogIGAsdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sWHF0LnByb3RvdHlwZSwidGl0bGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRHF0KV0sWHF0LnByb3RvdHlwZSwiZ3JhcGhIaWVyYXJjaHkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIscUd0KV0sWHF0LnByb3RvdHlwZSwiZ3JhcGgiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIseVd0KV0sWHF0LnByb3RvdHlwZSwicmVuZGVySGllcmFyY2h5Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFhxdC5wcm90b3R5cGUsIm5vZGVOYW1lc1RvSGVhbHRoUGlsbHMiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLFhxdC5wcm90b3R5cGUsImhlYWx0aFBpbGxTdGVwSW5kZXgiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sWHF0LnByb3RvdHlwZSwiY29sb3JCeSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxYcXQucHJvdG90eXBlLCJjb21wYXROb2RlVGl0bGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFhxdC5wcm90b3R5cGUsInNlbGVjdGVkTm9kZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sWHF0LnByb3RvdHlwZSwiaGlnaGxpZ2h0ZWROb2RlIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxYcXQucHJvdG90eXBlLCJzZWxlY3RlZE5vZGVJbmNsdWRlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sWHF0LnByb3RvdHlwZSwiZGVidWdnZXJEYXRhRW5hYmxlZCIsdm9pZCAwKSxYcXQ9dChbaSgidGYtZ3JhcGgtaW5mbyIpXSxYcXQpO2NsYXNzICRxdHtjb25zdHJ1Y3Rvcih0LGUsbixpLHIsbyl7dGhpcy5zdmc9dCx0aGlzLmxhYmVsUGFkZGluZz1vLHRoaXMuem9vbUc9ZSx0aGlzLm1haW5ab29tPW4sdGhpcy5tYXhXYW5kSD1yO2xldCBhPVN1KGkuc2hhZG93Um9vdCkscz1hLnNlbGVjdCgic3ZnIiksbD1zLnNlbGVjdCgicmVjdCIpO3RoaXMudmlld3BvaW50Q29vcmQ9e3g6MCx5OjB9O2xldCBjPXZoKCkuc3ViamVjdChPYmplY3QpLm9uKCJkcmFnIiwodD0+e3RoaXMudmlld3BvaW50Q29vcmQueD11dS54LHRoaXMudmlld3BvaW50Q29vcmQueT11dS55LHRoaXMudXBkYXRlVmlld3BvaW50KCl9KSk7bC5kYXR1bSh0aGlzLnZpZXdwb2ludENvb3JkKS5jYWxsKGMpLHMub24oImNsaWNrIiwoKCk9PntpZih1dS5kZWZhdWx0UHJldmVudGVkKXJldHVybjtsZXQgdD1OdW1iZXIobC5hdHRyKCJ3aWR0aCIpKSxlPU51bWJlcihsLmF0dHIoImhlaWdodCIpKSxuPWFoKHMubm9kZSgpKTt0aGlzLnZpZXdwb2ludENvb3JkLng9blswXS10LzIsdGhpcy52aWV3cG9pbnRDb29yZC55PW5bMV0tZS8yLHRoaXMudXBkYXRlVmlld3BvaW50KCl9KSksdGhpcy52aWV3cG9pbnQ9bC5ub2RlKCksdGhpcy5taW5pbWFwU3ZnPXMubm9kZSgpLHRoaXMubWluaW1hcD1pLHRoaXMuY2FudmFzPWEuc2VsZWN0KCJjYW52YXMuZmlyc3QiKS5ub2RlKCksdGhpcy5jYW52YXNCdWZmZXI9YS5zZWxlY3QoImNhbnZhcy5zZWNvbmQiKS5ub2RlKCksdGhpcy5kb3dubG9hZENhbnZhcz1hLnNlbGVjdCgiY2FudmFzLmRvd25sb2FkIikubm9kZSgpLFN1KHRoaXMuZG93bmxvYWRDYW52YXMpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLHRoaXMudXBkYXRlKCl9dXBkYXRlVmlld3BvaW50KCl7U3UodGhpcy52aWV3cG9pbnQpLmF0dHIoIngiLHRoaXMudmlld3BvaW50Q29vcmQueCkuYXR0cigieSIsdGhpcy52aWV3cG9pbnRDb29yZC55KTtsZXQgdD0tdGhpcy52aWV3cG9pbnRDb29yZC54KnRoaXMuc2NhbGVNYWluL3RoaXMuc2NhbGVNaW5pbWFwLGU9LXRoaXMudmlld3BvaW50Q29vcmQueSp0aGlzLnNjYWxlTWFpbi90aGlzLnNjYWxlTWluaW1hcDtTdSh0aGlzLnN2ZykuY2FsbCh0aGlzLm1haW5ab29tLnRyYW5zZm9ybSx2Ti50cmFuc2xhdGUodCxlKS5zY2FsZSh0aGlzLnNjYWxlTWFpbikpfWdldEltYWdlQmxvYigpe3JldHVybiBuZXcgUHJvbWlzZSgodD0+e3RoaXMuZG93bmxvYWRDYW52YXMudG9CbG9iKChlPT57dChlKX0pLCJpbWFnZS9wbmciKX0pKX11cGRhdGUoKXtsZXQgdD1udWxsO3RyeXtpZih0PXRoaXMuem9vbUcuZ2V0QkJveCgpLDA9PT10LndpZHRoKXJldHVybn1jYXRjaCh0KXtyZXR1cm59bGV0IGU9U3UodGhpcy5zdmcpLG49IiI7Y29uc3QgaT10aGlzLnN2ZyxyPShpLmdldFJvb3ROb2RlP2kuZ2V0Um9vdE5vZGUoKTp0aGlzLnN2Zy5wYXJlbnROb2RlKS5zdHlsZVNoZWV0cztmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrKyl0cnl7bGV0IGU9clt0XS5jc3NSdWxlc3x8clt0XS5ydWxlcztpZihudWxsPT1lKWNvbnRpbnVlO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKW4rPWVbdF0uY3NzVGV4dC5yZXBsYWNlKC8gP3RmLVtcdy1dKyA/L2csIiIpKyJcbiJ9Y2F0Y2godCl7aWYoIlNlY3VyaXR5RXJyb3IiIT09dC5uYW1lKXRocm93IHR9bGV0IG89ZS5hcHBlbmQoInN0eWxlIik7by50ZXh0KG4pO2xldCBhPVN1KHRoaXMuem9vbUcpLHM9YS5hdHRyKCJ0cmFuc2Zvcm0iKTthLmF0dHIoInRyYW5zZm9ybSIsbnVsbCksdC5oZWlnaHQrPXQueSx0LndpZHRoKz10LngsdC5oZWlnaHQrPTIqdGhpcy5sYWJlbFBhZGRpbmcsdC53aWR0aCs9Mip0aGlzLmxhYmVsUGFkZGluZyxlLmF0dHIoIndpZHRoIix0LndpZHRoKS5hdHRyKCJoZWlnaHQiLHQuaGVpZ2h0KSx0aGlzLnNjYWxlTWluaW1hcD10aGlzLm1heFdhbmRIL01hdGgubWF4KHQud2lkdGgsdC5oZWlnaHQpLHRoaXMubWluaW1hcFNpemU9e3dpZHRoOnQud2lkdGgqdGhpcy5zY2FsZU1pbmltYXAsaGVpZ2h0OnQuaGVpZ2h0KnRoaXMuc2NhbGVNaW5pbWFwfSxTdSh0aGlzLm1pbmltYXBTdmcpLmF0dHIodGhpcy5taW5pbWFwU2l6ZSksU3UodGhpcy5jYW52YXNCdWZmZXIpLmF0dHIodGhpcy5taW5pbWFwU2l6ZSk7Y29uc3QgbD1TdSh0aGlzLmRvd25sb2FkQ2FudmFzKTtsLnN0eWxlKCJ3aWR0aCIsdC53aWR0aCksbC5zdHlsZSgiaGVpZ2h0Iix0LmhlaWdodCksbC5hdHRyKCJ3aWR0aCIsMyp0LndpZHRoKSxsLmF0dHIoImhlaWdodCIsMyp0LmhlaWdodCksbnVsbCE9dGhpcy50cmFuc2xhdGUmJm51bGwhPXRoaXMuem9vbSYmcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+dGhpcy56b29tKCkpKTtsZXQgYz0obmV3IFhNTFNlcmlhbGl6ZXIpLnNlcmlhbGl6ZVRvU3RyaW5nKHRoaXMuc3ZnKTtvLnJlbW92ZSgpLGUuYXR0cigid2lkdGgiLG51bGwpLmF0dHIoImhlaWdodCIsbnVsbCksYS5hdHRyKCJ0cmFuc2Zvcm0iLHMpO2xldCB1PW5ldyBJbWFnZTt1Lm9ubG9hZD0oKT0+e2xldCB0PXRoaXMuY2FudmFzQnVmZmVyLmdldENvbnRleHQoIjJkIik7dC5jbGVhclJlY3QoMCwwLHRoaXMuY2FudmFzQnVmZmVyLndpZHRoLHRoaXMuY2FudmFzQnVmZmVyLmhlaWdodCksdC5kcmF3SW1hZ2UodSwwLDAsdGhpcy5taW5pbWFwU2l6ZS53aWR0aCx0aGlzLm1pbmltYXBTaXplLmhlaWdodCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+e1N1KHRoaXMuY2FudmFzQnVmZmVyKS5zdHlsZSgiZGlzcGxheSIsbnVsbCksU3UodGhpcy5jYW52YXMpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLFt0aGlzLmNhbnZhcyx0aGlzLmNhbnZhc0J1ZmZlcl09W3RoaXMuY2FudmFzQnVmZmVyLHRoaXMuY2FudmFzXX0pKTtsZXQgZT10aGlzLmRvd25sb2FkQ2FudmFzLmdldENvbnRleHQoIjJkIik7ZS5jbGVhclJlY3QoMCwwLHRoaXMuZG93bmxvYWRDYW52YXMud2lkdGgsdGhpcy5kb3dubG9hZENhbnZhcy5oZWlnaHQpLGUuZHJhd0ltYWdlKHUsMCwwLHRoaXMuZG93bmxvYWRDYW52YXMud2lkdGgsdGhpcy5kb3dubG9hZENhbnZhcy5oZWlnaHQpfSx1Lm9uZXJyb3I9KCk9PntsZXQgdD1uZXcgQmxvYihbY10se3R5cGU6ImltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCJ9KTt1LnNyYz1VUkwuY3JlYXRlT2JqZWN0VVJMKHQpfSx1LnNyYz0iZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsIitlbmNvZGVVUklDb21wb25lbnQoYyl9em9vbSh0KXtpZihudWxsPT10aGlzLnNjYWxlTWluaW1hcClyZXR1cm47dCYmKHRoaXMudHJhbnNsYXRlPVt0LngsdC55XSx0aGlzLnNjYWxlTWFpbj10LmspO2xldCBlPXRoaXMuc3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49U3UodGhpcy52aWV3cG9pbnQpO3RoaXMudmlld3BvaW50Q29vcmQueD0tdGhpcy50cmFuc2xhdGVbMF0qdGhpcy5zY2FsZU1pbmltYXAvdGhpcy5zY2FsZU1haW4sdGhpcy52aWV3cG9pbnRDb29yZC55PS10aGlzLnRyYW5zbGF0ZVsxXSp0aGlzLnNjYWxlTWluaW1hcC90aGlzLnNjYWxlTWFpbjtsZXQgaT1lLndpZHRoKnRoaXMuc2NhbGVNaW5pbWFwL3RoaXMuc2NhbGVNYWluLHI9ZS5oZWlnaHQqdGhpcy5zY2FsZU1pbmltYXAvdGhpcy5zY2FsZU1haW47bi5hdHRyKCJ4Iix0aGlzLnZpZXdwb2ludENvb3JkLngpLmF0dHIoInkiLHRoaXMudmlld3BvaW50Q29vcmQueSkuYXR0cigid2lkdGgiLGkpLmF0dHIoImhlaWdodCIscik7bGV0IG89dGhpcy5taW5pbWFwU2l6ZS53aWR0aCxhPXRoaXMubWluaW1hcFNpemUuaGVpZ2h0LHM9dGhpcy52aWV3cG9pbnRDb29yZC54LGw9dGhpcy52aWV3cG9pbnRDb29yZC55OyhNYXRoLm1pbihNYXRoLm1heCgwLHMraSksbyktTWF0aC5taW4oTWF0aC5tYXgoMCxzKSxvKSkqKE1hdGgubWluKE1hdGgubWF4KDAsbCtyKSxhKS1NYXRoLm1pbihNYXRoLm1heCgwLGwpLGEpKS8obyphKTwuOD90aGlzLm1pbmltYXAuY2xhc3NMaXN0LnJlbW92ZSgiaGlkZGVuIik6dGhpcy5taW5pbWFwLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpfX1sZXQgS3F0PWNsYXNzIGV4dGVuZHMgeWV7aW5pdCh0LGUsbixpLHIpe3JldHVybiBuZXcgJHF0KHQsZSxuLHRoaXMsaSxyKX19O0txdC50ZW1wbGF0ZT1fZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcyBsaW5lYXI7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAgIH0KCiAgICAgIDpob3N0KC5oaWRkZW4pIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICBjYW52YXMgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM5OTk7CiAgICAgIH0KCiAgICAgIHJlY3QgewogICAgICAgIGZpbGw6IHdoaXRlOwogICAgICAgIHN0cm9rZTogIzExMTExMTsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgICBmaWxsLW9wYWNpdHk6IDA7CiAgICAgICAgZmlsdGVyOiB1cmwoI21pbmltYXBEcm9wU2hhZG93KTsKICAgICAgICBjdXJzb3I6IG1vdmU7CiAgICAgIH0KCiAgICAgIHN2ZyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHN2Zz4KICAgICAgPGRlZnM+CiAgICAgICAgPGZpbHRlcgogICAgICAgICAgaWQ9Im1pbmltYXBEcm9wU2hhZG93IgogICAgICAgICAgeD0iLTIwJSIKICAgICAgICAgIHk9Ii0yMCUiCiAgICAgICAgICB3aWR0aD0iMTUwJSIKICAgICAgICAgIGhlaWdodD0iMTUwJSIKICAgICAgICA+CiAgICAgICAgICA8ZmVPZmZzZXQgcmVzdWx0PSJvZmZPdXQiIGluPSJTb3VyY2VHcmFwaGljIiBkeD0iMSIgZHk9IjEiPjwvZmVPZmZzZXQ+CiAgICAgICAgICA8ZmVDb2xvck1hdHJpeAogICAgICAgICAgICByZXN1bHQ9Im1hdHJpeE91dCIKICAgICAgICAgICAgaW49Im9mZk91dCIKICAgICAgICAgICAgdHlwZT0ibWF0cml4IgogICAgICAgICAgICB2YWx1ZXM9IjAuMSAwIDAgMCAwIDAgMC4xIDAgMCAwIDAgMCAwLjEgMCAwIDAgMCAwIDAuNSAwIgogICAgICAgICAgPjwvZmVDb2xvck1hdHJpeD4KICAgICAgICAgIDxmZUdhdXNzaWFuQmx1cgogICAgICAgICAgICByZXN1bHQ9ImJsdXJPdXQiCiAgICAgICAgICAgIGluPSJtYXRyaXhPdXQiCiAgICAgICAgICAgIHN0ZERldmlhdGlvbj0iMiIKICAgICAgICAgID48L2ZlR2F1c3NpYW5CbHVyPgogICAgICAgICAgPGZlQmxlbmQgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iYmx1ck91dCIgbW9kZT0ibm9ybWFsIj48L2ZlQmxlbmQ+CiAgICAgICAgPC9maWx0ZXI+CiAgICAgIDwvZGVmcz4KICAgICAgPHJlY3Q+PC9yZWN0PgogICAgPC9zdmc+CiAgICA8Y2FudmFzIGNsYXNzPSJmaXJzdCI+PC9jYW52YXM+CiAgICA8IS0tIEFkZGl0aW9uYWwgY2FudmFzIHRvIHVzZSBhcyBidWZmZXIgdG8gYXZvaWQgZmxpY2tlcmluZyBiZXR3ZWVuIHVwZGF0ZXMgLS0+CiAgICA8Y2FudmFzIGNsYXNzPSJzZWNvbmQiPjwvY2FudmFzPgogICAgPGNhbnZhcyBjbGFzcz0iZG93bmxvYWQiPjwvY2FudmFzPgogIGAsS3F0PXQoW2koInRmLWdyYXBoLW1pbmltYXAiKV0sS3F0KTtjb25zdCBacXQ9X2VgCiAgPHN0eWxlPgogICAgOmhvc3QoLmRhcmstbW9kZSkgewogICAgICBmaWx0ZXI6IGludmVydCgxKTsKICAgIH0KCiAgICA6aG9zdCB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB3aWR0aDogMTAwJTsKICAgIH0KCiAgICAjc3ZnIHsKICAgICAgZmxleDogMTsKICAgICAgZm9udC1mYW1pbHk6IFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB3aWR0aDogMTAwJTsKICAgIH0KCiAgICAjaGlkZGVuIHsKICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB0b3A6IDBweDsKICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgfQoKICAgIHRleHQgewogICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIH0KCiAgICAvKiAtLS0gTm9kZSBhbmQgYW5ub3RhdGlvbi1ub2RlIGZvciBNZXRhbm9kZSAtLS0gKi8KCiAgICAubWV0YSA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgLm1ldGEgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgZmlsbDogaHNsKDAsIDAlLCA3MCUpOwogICAgfQogICAgLm5vZGUubWV0YS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgLm5vZGUubWV0YS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgfQogICAgLmFubm90YXRpb24ubWV0YS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgLmFubm90YXRpb24ubWV0YS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgc3Ryb2tlLXdpZHRoOiAxOwogICAgfQogICAgLm1ldGEuc2VsZWN0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgIC5tZXRhLnNlbGVjdGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICBzdHJva2U6IHJlZDsKICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgfQogICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgIHN0cm9rZS13aWR0aDogMzsKICAgIH0KICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgIHN0cm9rZTogcmVkOwogICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICB9CiAgICAubm9kZS5tZXRhLnNlbGVjdGVkLmV4cGFuZGVkLmhpZ2hsaWdodGVkID4gLm5vZGVzaGFwZSA+IHJlY3QsCiAgICAubm9kZS5tZXRhLnNlbGVjdGVkLmV4cGFuZGVkLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICBzdHJva2U6IHJlZDsKICAgICAgc3Ryb2tlLXdpZHRoOiA0OwogICAgfQoKICAgIC5mYWRlZCwKICAgIC5mYWRlZCByZWN0LAogICAgLmZhZGVkIGVsbGlwc2UsCiAgICAuZmFkZWQgcGF0aCwKICAgIC5mYWRlZCB1c2UsCiAgICAjcmVjdEhhdGNoIGxpbmUsCiAgICAjZWxsaXBzZUhhdGNoIGxpbmUgewogICAgICBjb2xvcjogI2UwZDRiMyAhaW1wb3J0YW50OwogICAgICBmaWxsOiB3aGl0ZTsKICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLmZhZGVkIHBhdGggewogICAgICBzdHJva2Utd2lkdGg6IDFweCAhaW1wb3J0YW50OwogICAgfQoKICAgIC5mYWRlZCByZWN0IHsKICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLmZhZGVkIGVsbGlwc2UsCiAgICAuZmFkZWQgdXNlIHsKICAgICAgZmlsbDogdXJsKCNlbGxpcHNlSGF0Y2gpICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLmZhZGVkIHRleHQgewogICAgICBvcGFjaXR5OiAwOwogICAgfQoKICAgIC8qIFJ1bGVzIHVzZWQgZm9yIGlucHV0LXRyYWNpbmcuICovCiAgICAuaW5wdXQtaGlnaGxpZ2h0ID4gKiA+IHJlY3QsCiAgICAuaW5wdXQtaGlnaGxpZ2h0ID4gKiA+IGVsbGlwc2UsCiAgICAuaW5wdXQtaGlnaGxpZ2h0ID4gKiA+IHVzZSB7CiAgICAgIGZpbGw6IHdoaXRlOwogICAgICBzdHJva2U6ICNmZjk4MDAgIWltcG9ydGFudDsKICAgIH0KCiAgICAvKiAgLSBGYWRlZCBub24taW5wdXQgc3R5bGluZyAqLwogICAgLm5vbi1pbnB1dCA+ICogPiByZWN0LAoubm9uLWlucHV0ID4gKiA+IGVsbGlwc2UsCi5ub24taW5wdXQgPiAqID4gdXNlLAovKiBGb3IgQ29uc3Qgbm9kZXMuICovCi5ub24taW5wdXQgPiAqID4gLmNvbnN0YW50Om5vdChbY2xhc3MqPSJpbnB1dC1oaWdobGlnaHQiXSkgPgogIC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlLAovKiBGb3Igc3R5bGluZyBvZiBhbm5vdGF0aW9uIG5vZGVzIG9mIG5vbi1pbnB1dCBub2Rlcy4gKi8KLm5vbi1pbnB1dCA+IGcgPiAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgIHN0cm9rZS13aWR0aDogaW5oZXJpdDsKICAgICAgc3Ryb2tlLWRhc2hhcnJheTogaW5oZXJpdDsKICAgIH0KCiAgICAubm9uLWlucHV0IHBhdGggewogICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICB9CgogICAgLm5vbi1pbnB1dCA+IC5ub2Rlc2hhcGUgPiByZWN0LAoubm9uLWlucHV0ID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QsCi8qIEZvciBzdHlsaW5nIG9mIGFubm90YXRpb24gbm9kZXMgb2Ygbm9uLWlucHV0IG5vZGVzLiAqLwoubm9uLWlucHV0ID4gZyA+IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICBmaWxsOiB1cmwoI3JlY3RIYXRjaCkgIWltcG9ydGFudDsKICAgIH0KCiAgICAubm9uLWlucHV0IGVsbGlwc2UsCiAgICAubm9uLWlucHV0IHVzZSB7CiAgICAgIGZpbGw6IHVybCgjZWxsaXBzZUhhdGNoKSAhaW1wb3J0YW50OwogICAgfQoKICAgIC5ub24taW5wdXQgPiB0ZXh0IHsKICAgICAgb3BhY2l0eTogMDsKICAgIH0KCiAgICAubm9uLWlucHV0IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZSB7CiAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgfQoKICAgIC5ub24taW5wdXQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICBtYXJrZXItc3RhcnQ6IHVybCgjcmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgIH0KCiAgICAvKiBJbnB1dCBlZGdlcy4gKi8KICAgIC5pbnB1dC1lZGdlLWhpZ2hsaWdodCA+IHRleHQgewogICAgICBmaWxsOiBibGFjayAhaW1wb3J0YW50OwogICAgfQogICAgLmlucHV0LWhpZ2hsaWdodCA+IC5pbi1hbm5vdGF0aW9ucyA+IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZSwKICAgIC5pbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQKICAgICAgPiAuaW4tYW5ub3RhdGlvbnMKICAgICAgPiAuYW5ub3RhdGlvbgogICAgICA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICBzdHJva2U6ICM5OTkgIWltcG9ydGFudDsKICAgIH0KCiAgICAvKiBOb24taW5wdXQgZWRnZXMuICovCiAgICAubm9uLWlucHV0LWVkZ2UtaGlnaGxpZ2h0LAoubm9uLWlucHV0ID4gZyA+IC5hbm5vdGF0aW9uID4gcGF0aCwKLyogQW5ub3RhdGlvbiBzdHlsZXMgKGxhYmVsIGFuZCBlZGdlcyByZXNwZWN0aXZlbHkpLiAqLwoubm9uLWlucHV0ID4gZyA+Ci5hbm5vdGF0aW9uOm5vdCguaW5wdXQtaGlnaGxpZ2h0KTpub3QoLmlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZCkgPgouYW5ub3RhdGlvbi1sYWJlbAovKi5hbm5vdGF0aW9uLWVkZ2UqLyB7CiAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIH0KCiAgICAvKiAtLS0gT3AgTm9kZSAtLS0gKi8KCiAgICAub3AgPiAubm9kZXNoYXBlID4gLm5vZGVjb2xvcnRhcmdldCwKICAgIC5vcCA+IC5hbm5vdGF0aW9uLW5vZGUgPiAubm9kZWNvbG9ydGFyZ2V0IHsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICBmaWxsOiAjZmZmOwogICAgICBzdHJva2U6ICNjY2M7CiAgICB9CgogICAgLm9wLnNlbGVjdGVkID4gLm5vZGVzaGFwZSA+IC5ub2RlY29sb3J0YXJnZXQsCiAgICAub3Auc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gLm5vZGVjb2xvcnRhcmdldCB7CiAgICAgIHN0cm9rZTogcmVkOwogICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICB9CgogICAgLm9wLmhpZ2hsaWdodGVkID4gLm5vZGVzaGFwZSA+IC5ub2RlY29sb3J0YXJnZXQsCiAgICAub3AuaGlnaGxpZ2h0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gLm5vZGVjb2xvcnRhcmdldCB7CiAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgIH0KCiAgICAvKiAtLS0gU2VyaWVzIE5vZGUgLS0tICovCgogICAgLyogQnkgZGVmYXVsdCwgZG9uJ3Qgc2hvdyB0aGUgc2VyaWVzIGJhY2tncm91bmQgPHJlY3Q+LiAqLwogICAgLnNlcmllcyA+IC5ub2Rlc2hhcGUgPiByZWN0IHsKICAgICAgZmlsbDogaHNsKDAsIDAlLCA3MCUpOwogICAgICBmaWxsLW9wYWNpdHk6IDA7CiAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDUsIDU7CiAgICAgIHN0cm9rZS1vcGFjaXR5OiAwOwogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB9CgogICAgLyogT25jZSBleHBhbmRlZCwgc2hvdyB0aGUgc2VyaWVzIGJhY2tncm91bmQgPHJlY3Q+IGFuZCBoaWRlIHRoZSA8dXNlPi4gKi8KICAgIC5zZXJpZXMuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgIGZpbGwtb3BhY2l0eTogMC4xNTsKICAgICAgc3Ryb2tlOiBoc2woMCwgMCUsIDcwJSk7CiAgICAgIHN0cm9rZS1vcGFjaXR5OiAxOwogICAgfQogICAgLnNlcmllcy5leHBhbmRlZCA+IC5ub2Rlc2hhcGUgPiB1c2UgewogICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICB9CgogICAgLyoqCiAqIFRPRE86IFNpbXBsaWZ5IHRoaXMgYnkgYXBwbHlpbmcgYSBzdGFibGUgY2xhc3MgbmFtZSB0byBhbGwgPGc+CiAqIGVsZW1lbnRzIHRoYXQgY3VycmVudGx5IGhhdmUgZWl0aGVyIHRoZSBub2Rlc2hhcGUgb3IgYW5ub3RhdGlvbi1ub2RlIGNsYXNzZXMuCiAqLwogICAgLnNlcmllcyA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAuc2VyaWVzID4gLmFubm90YXRpb24tbm9kZSA+IHVzZSB7CiAgICAgIHN0cm9rZTogI2NjYzsKICAgIH0KICAgIC5zZXJpZXMuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gdXNlLAogICAgLnNlcmllcy5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiB1c2UgewogICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICB9CiAgICAuc2VyaWVzLnNlbGVjdGVkID4gLm5vZGVzaGFwZSA+IHVzZSwKICAgIC5zZXJpZXMuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgIH0KCiAgICAuc2VyaWVzLnNlbGVjdGVkID4gLm5vZGVzaGFwZSA+IHJlY3QgewogICAgICBzdHJva2U6IHJlZDsKICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgfQoKICAgIC5hbm5vdGF0aW9uLnNlcmllcy5zZWxlY3RlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiB1c2UgewogICAgICBzdHJva2U6IHJlZDsKICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgfQoKICAgIC8qIC0tLSBCcmlkZ2UgTm9kZSAtLS0gKi8KICAgIC5icmlkZ2UgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgIHN0cm9rZTogI2YwZjsKICAgICAgb3BhY2l0eTogMC4yOwogICAgICBkaXNwbGF5OiBub25lOwogICAgfQoKICAgIC8qIC0tLSBTdHJ1Y3R1cmFsIEVsZW1lbnRzIC0tLSAqLwogICAgLmVkZ2UgPiBwYXRoLmVkZ2VsaW5lLnN0cnVjdHVyYWwgewogICAgICBzdHJva2U6ICNmMGY7CiAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgZGlzcGxheTogbm9uZTsKICAgIH0KCiAgICAvKiBSZWZlcmVuY2UgRWRnZSAqLwogICAgLmVkZ2UgPiBwYXRoLmVkZ2VsaW5lLnJlZmVyZW5jZWVkZ2UgewogICAgICBzdHJva2U6ICNmZmI3NGQ7CiAgICAgIG9wYWNpdHk6IDE7CiAgICB9CgogICAgLyogLS0tIFNlcmllcyBOb2RlcyAtLS0gKi8KCiAgICAvKiBIaWRlIHRoZSByZWN0IGZvciBhIHNlcmllcycgYW5ub3RhdGlvbi4gKi8KICAgIC5zZXJpZXMgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICB9CgogICAgLyogLS0tIE5vZGUgbGFiZWwgLS0tICovCgogICAgLm5vZGUgewogICAgICAvKiBQcm92aWRlIGEgaGludCB0byBicm93c2VycyB0byBhdm9pZCB1c2luZyB0aGVpciBzdGF0aWMgcmFzdGVyaXphdGlvbgogICAgICBhdCBpbml0aWFsIHNjYWxlLCB3aGljaCBsb29rcyB2ZXJ5IHBpeGVsYXRlZCBvbiBDaHJvbWl1bSB3aGVuIHpvb21lZCBpbi4KICAgICAgTm90ZSB0aGF0IHdlIGludGVudGlvbmFsbHkgZG8gKm5vdCogdXNlICd3aWxsLWNoYW5nZTogdHJhbnNmb3JtJyBhbmQKICAgICAgJ3RyYW5zbGF0ZVooMCkgaGVyZSwgd2hpY2ggaW50cm9kdWNlIGJsdXJyaW5lc3Mgb24gRmlyZWZveC4KICAgICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2lzc3Vlcy80NzQ0ICovCiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWigxcHgpOwogICAgfQoKICAgIC5ub2RlID4gdGV4dC5ub2RlbGFiZWwgewogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIGZpbGw6ICM0NDQ7CiAgICB9CgogICAgLm1ldGEuZXhwYW5kZWQgPiB0ZXh0Lm5vZGVsYWJlbCB7CiAgICAgIGZvbnQtc2l6ZTogOXB4OwogICAgfQoKICAgIC5zZXJpZXMgPiB0ZXh0Lm5vZGVsYWJlbCB7CiAgICAgIGZvbnQtc2l6ZTogOHB4OwogICAgfQoKICAgIC5vcCA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgZm9udC1zaXplOiA2cHg7CiAgICB9CgogICAgLmJyaWRnZSA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgZGlzcGxheTogbm9uZTsKICAgIH0KCiAgICAubm9kZS5tZXRhLmV4cGFuZGVkID4gdGV4dC5ub2RlbGFiZWwgewogICAgICBjdXJzb3I6IG5vcm1hbDsKICAgIH0KCiAgICAuYW5ub3RhdGlvbi5tZXRhLmhpZ2hsaWdodGVkID4gdGV4dC5hbm5vdGF0aW9uLWxhYmVsIHsKICAgICAgZmlsbDogIzUwYTNmNzsKICAgIH0KCiAgICAuYW5ub3RhdGlvbi5tZXRhLnNlbGVjdGVkID4gdGV4dC5hbm5vdGF0aW9uLWxhYmVsIHsKICAgICAgZmlsbDogIzQyODVmNDsKICAgIH0KCiAgICAvKiAtLS0gQW5ub3RhdGlvbiAtLS0gKi8KCiAgICAvKiBvbmx5IGFwcGxpZWQgZm9yIGFubm90YXRpb25zIHRoYXQgYXJlIG5vdCBzdW1tYXJ5IG9yIGNvbnN0YW50LgooLnN1bW1hcnksIC5jb25zdGFudCBnZXRzIG92ZXJyaWRkZW4gYmVsb3cpICovCiAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLW5vZGUgPiAqIHsKICAgICAgc3Ryb2tlLXdpZHRoOiAwLjU7CiAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDEsIDE7CiAgICB9CgogICAgLmFubm90YXRpb24uc3VtbWFyeSA+IC5hbm5vdGF0aW9uLW5vZGUgPiAqLAogICAgLmFubm90YXRpb24uY29uc3RhbnQgPiAuYW5ub3RhdGlvbi1ub2RlID4gKiB7CiAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgc3Ryb2tlLWRhc2hhcnJheTogbm9uZTsKICAgIH0KCiAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICBmaWxsOiBub25lOwogICAgICBzdHJva2U6ICNhYWE7CiAgICAgIHN0cm9rZS13aWR0aDogMC41OwogICAgICBtYXJrZXItZW5kOiB1cmwoI2Fubm90YXRpb24tYXJyb3doZWFkKTsKICAgIH0KCiAgICAuZmFkZWQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlIHsKICAgICAgbWFya2VyLWVuZDogdXJsKCNhbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCk7CiAgICB9CgogICAgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICBtYXJrZXItc3RhcnQ6IHVybCgjcmVmLWFubm90YXRpb24tYXJyb3doZWFkKTsKICAgIH0KCiAgICAuZmFkZWQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICBtYXJrZXItc3RhcnQ6IHVybCgjcmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgIH0KCiAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWNvbnRyb2wtZWRnZSB7CiAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDEsIDE7CiAgICB9CgogICAgI2Fubm90YXRpb24tYXJyb3doZWFkIHsKICAgICAgZmlsbDogI2FhYTsKICAgIH0KCiAgICAjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQgewogICAgICBmaWxsOiAjZTBkNGIzOwogICAgfQoKICAgICNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQgewogICAgICBmaWxsOiAjYWFhOwogICAgfQoKICAgICNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQgewogICAgICBmaWxsOiAjZTBkNGIzOwogICAgfQoKICAgIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tbGFiZWwgewogICAgICBmb250LXNpemU6IDVweDsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgfQogICAgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1sYWJlbC5hbm5vdGF0aW9uLWVsbGlwc2lzIHsKICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgfQoKICAgIC8qIEhpZGUgYW5ub3RhdGlvbnMgb24gZXhwYW5kZWQgbWV0YSBub2RlcyBzaW5jZSB0aGV5J3JlIHJlZHVuZGFudC4gKi8KICAgIC5leHBhbmRlZCA+IC5pbi1hbm5vdGF0aW9ucywKICAgIC5leHBhbmRlZCA+IC5vdXQtYW5ub3RhdGlvbnMgewogICAgICBkaXNwbGF5OiBub25lOwogICAgfQoKICAgIC8qIC0tLSBBbm5vdGF0aW9uOiBDb25zdGFudCAtLS0gKi8KCiAgICAuY29uc3RhbnQgPiAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSB7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgZmlsbDogd2hpdGU7CiAgICAgIHN0cm9rZTogIzg0ODQ4NDsKICAgIH0KCiAgICAuY29uc3RhbnQuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSB7CiAgICAgIGZpbGw6IHdoaXRlOwogICAgICBzdHJva2U6IHJlZDsKICAgIH0KCiAgICAuY29uc3RhbnQuaGlnaGxpZ2h0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSB7CiAgICAgIHN0cm9rZS13aWR0aDogMS41OwogICAgfQoKICAgIC8qIC0tLSBBbm5vdGF0aW9uOiBTdW1tYXJ5IC0tLSAqLwoKICAgIC5zdW1tYXJ5ID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIGZpbGw6ICNkYjQ0Mzc7CiAgICAgIHN0cm9rZTogI2RiNDQzNzsKICAgIH0KCiAgICAuc3VtbWFyeS5zZWxlY3RlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgZmlsbDogI2E1MjcxNDsKICAgICAgc3Ryb2tlOiAjYTUyNzE0OwogICAgfQoKICAgIC5zdW1tYXJ5LmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgIH0KCiAgICAvKiAtLS0gRWRnZSAtLS0gKi8KCiAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUgewogICAgICBmaWxsOiBub25lOwogICAgICBzdHJva2U6ICNiYmI7CiAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgc3Ryb2tlLXdpZHRoOiAwLjc1OwogICAgfQoKICAgIC5lZGdlIC5zZWxlY3RhYmxlZWRnZSB7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIH0KCiAgICAuc2VsZWN0ZWRlZGdlID4gcGF0aC5lZGdlbGluZSB7CiAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgc3Ryb2tlOiAjZjAwOwogICAgfQoKICAgIC5lZGdlLnNlbGVjdGVkZWRnZSB0ZXh0IHsKICAgICAgZmlsbDogIzAwMDsKICAgIH0KCiAgICAvKiBMYWJlbHMgc2hvd2luZyB0ZW5zb3Igc2hhcGVzIG9uIGVkZ2VzICovCiAgICAuZWRnZSA+IHRleHQgewogICAgICBmb250LXNpemU6IDMuNXB4OwogICAgICBmaWxsOiAjNjY2OwogICAgfQoKICAgIC5kYXRhZmxvdy1hcnJvd2hlYWQgewogICAgICBmaWxsOiAjYmJiOwogICAgfQoKICAgIC5yZWZlcmVuY2UtYXJyb3doZWFkIHsKICAgICAgZmlsbDogI2ZmYjc0ZDsKICAgIH0KCiAgICAuc2VsZWN0ZWQtYXJyb3doZWFkIHsKICAgICAgZmlsbDogI2YwMDsKICAgIH0KCiAgICAuZWRnZSAuY29udHJvbC1kZXAgewogICAgICBzdHJva2UtZGFzaGFycmF5OiAyLCAyOwogICAgfQoKICAgIC8qIC0tLSBHcm91cCBub2RlIGV4cGFuZC9jb2xsYXBzZSBidXR0b24gLS0tICovCgogICAgLyogSGlkZXMgZXhwYW5kL2NvbGxhcHNlIGJ1dHRvbnMgd2hlbiBhIG5vZGUgaXNuJ3QgZXhwYW5kZWQgb3IgaGlnaGxpZ2h0ZWQuIFVzaW5nCiAgIGluY3JlZGlibHkgc21hbGwgb3BhY2l0eSBzbyB0aGF0IHRoZSBib3VuZGluZyBib3ggb2YgdGhlIDxnPiBwYXJlbnQgc3RpbGwgdGFrZXMKICAgdGhpcyBjb250YWluZXIgaW50byBhY2NvdW50IGV2ZW4gd2hlbiBpdCBpc24ndCB2aXNpYmxlICovCiAgICAubm9kZTpub3QoLmhpZ2hsaWdodGVkKTpub3QoLmV4cGFuZGVkKSA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyIHsKICAgICAgb3BhY2l0eTogMC4wMTsKICAgIH0KICAgIC5ub2RlLmhpZ2hsaWdodGVkID4gLm5vZGVzaGFwZSA+IC5idXR0b25jb250YWluZXIgewogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB9CiAgICAuYnV0dG9uY2lyY2xlIHsKICAgICAgZmlsbDogI2U3ODExZDsKICAgIH0KICAgIC5idXR0b25jaXJjbGU6aG92ZXIgewogICAgICBmaWxsOiAjYjk2NzE3OwogICAgfQogICAgLmV4cGFuZGJ1dHRvbiwKICAgIC5jb2xsYXBzZWJ1dHRvbiB7CiAgICAgIHN0cm9rZTogd2hpdGU7CiAgICB9CiAgICAvKiBEbyBub3QgbGV0IHRoZSBwYXRoIGVsZW1lbnRzIGluIHRoZSBidXR0b24gdGFrZSBwb2ludGVyIGZvY3VzICovCiAgICAubm9kZSA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyID4gLmV4cGFuZGJ1dHRvbiwKICAgIC5ub2RlID4gLm5vZGVzaGFwZSA+IC5idXR0b25jb250YWluZXIgPiAuY29sbGFwc2VidXR0b24gewogICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIH0KICAgIC8qIE9ubHkgc2hvdyB0aGUgZXhwYW5kIGJ1dHRvbiB3aGVuIGEgbm9kZSBpcyBjb2xsYXBzZWQgYW5kIG9ubHkgc2hvdyB0aGUKICAgY29sbGFwc2UgYnV0dG9uIHdoZW4gYSBub2RlIGlzIGV4cGFuZGVkLiAqLwogICAgLm5vZGUuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5leHBhbmRidXR0b24gewogICAgICBkaXNwbGF5OiBub25lOwogICAgfQogICAgLm5vZGU6bm90KC5leHBhbmRlZCkgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5jb2xsYXBzZWJ1dHRvbiB7CiAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICB9CgogICAgLmhlYWx0aC1waWxsLXN0YXRzIHsKICAgICAgZm9udC1zaXplOiA0cHg7CiAgICAgIHRleHQtYW5jaG9yOiBtaWRkbGU7CiAgICB9CgogICAgLmhlYWx0aC1waWxsIHJlY3QgewogICAgICBmaWx0ZXI6IHVybCgjaGVhbHRoLXBpbGwtc2hhZG93KTsKICAgICAgcng6IDM7CiAgICAgIHJ5OiAzOwogICAgfQoKICAgIC50aXRsZUNvbnRhaW5lciB7CiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgdG9wOiAyMHB4OwogICAgfQoKICAgIC50aXRsZSwKICAgIC5hdXhUaXRsZSwKICAgIC5mdW5jdGlvbkxpYnJhcnlUaXRsZSB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIH0KCiAgICAjbWluaW1hcCB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgcmlnaHQ6IDIwcHg7CiAgICAgIGJvdHRvbTogMjBweDsKICAgIH0KCiAgICAuY29udGV4dC1tZW51IHsKICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICBkaXNwbGF5OiBub25lOwogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUyOwogICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgbWluLXdpZHRoOiAxNTBweDsKICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q0ZDRkNDsKICAgIH0KCiAgICAuY29udGV4dC1tZW51IHVsIHsKICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogICAgICBtYXJnaW46IDA7CiAgICAgIHBhZGRpbmc6IDA7CiAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIH0KCiAgICAuY29udGV4dC1tZW51IHVsIGxpIHsKICAgICAgcGFkZGluZzogNHB4IDE2cHg7CiAgICB9CgogICAgLmNvbnRleHQtbWVudSB1bCBsaTpob3ZlciB7CiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgIGNvbG9yOiB3aGl0ZTsKICAgIH0KICA8L3N0eWxlPgogIDxkaXYgY2xhc3M9InRpdGxlQ29udGFpbmVyIj4KICAgIDxkaXYgaWQ9InRpdGxlIiBjbGFzcz0idGl0bGUiPk1haW4gR3JhcGg8L2Rpdj4KICAgIDxkaXYgaWQ9ImF1eFRpdGxlIiBjbGFzcz0iYXV4VGl0bGUiPkF1eGlsaWFyeSBOb2RlczwvZGl2PgogICAgPGRpdiBpZD0iZnVuY3Rpb25MaWJyYXJ5VGl0bGUiIGNsYXNzPSJmdW5jdGlvbkxpYnJhcnlUaXRsZSI+RnVuY3Rpb25zPC9kaXY+CiAgPC9kaXY+CiAgPHN2ZyBpZD0ic3ZnIj4KICAgIDxkZWZzPgogICAgICA8IS0tIEFycm93IGhlYWRzIGZvciByZWZlcmVuY2UgZWRnZSBwYXRocyBvZiBkaWZmZXJlbnQgcHJlZGVmaW5lZCBzaXplcyBwZXIgY29sb3IuIC0tPgogICAgICA8cGF0aAogICAgICAgIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXBhdGgiCiAgICAgICAgZD0iTSAwLDAgTCAxMCw1IEwgMCwxMCBDIDMsNyAzLDMgMCwwIgogICAgICA+PC9wYXRoPgogICAgICA8bWFya2VyCiAgICAgICAgY2xhc3M9InJlZmVyZW5jZS1hcnJvd2hlYWQiCiAgICAgICAgaWQ9InJlZmVyZW5jZS1hcnJvd2hlYWQtc21hbGwiCiAgICAgICAgdmlld0JveD0iMCAwIDEwIDEwIgogICAgICAgIG1hcmtlcldpZHRoPSI1IgogICAgICAgIG1hcmtlckhlaWdodD0iNSIKICAgICAgICByZWZYPSIyIgogICAgICAgIHJlZlk9IjUiCiAgICAgICAgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiCiAgICAgICAgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICA+CiAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIj48L3VzZT4KICAgICAgPC9tYXJrZXI+CiAgICAgIDxtYXJrZXIKICAgICAgICBjbGFzcz0icmVmZXJlbmNlLWFycm93aGVhZCIKICAgICAgICBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1tZWRpdW0iCiAgICAgICAgdmlld0JveD0iMCAwIDEwIDEwIgogICAgICAgIG1hcmtlcldpZHRoPSIxMyIKICAgICAgICBtYXJrZXJIZWlnaHQ9IjEzIgogICAgICAgIHJlZlg9IjIiCiAgICAgICAgcmVmWT0iNSIKICAgICAgICBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIKICAgICAgICBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgID4KICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNyZWZlcmVuY2UtYXJyb3doZWFkLXBhdGgiPjwvdXNlPgogICAgICA8L21hcmtlcj4KICAgICAgPG1hcmtlcgogICAgICAgIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIgogICAgICAgIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLWxhcmdlIgogICAgICAgIHZpZXdCb3g9IjAgMCAxMCAxMCIKICAgICAgICBtYXJrZXJXaWR0aD0iMTYiCiAgICAgICAgbWFya2VySGVpZ2h0PSIxNiIKICAgICAgICByZWZYPSIyIgogICAgICAgIHJlZlk9IjUiCiAgICAgICAgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiCiAgICAgICAgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICA+CiAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIj48L3VzZT4KICAgICAgPC9tYXJrZXI+CiAgICAgIDxtYXJrZXIKICAgICAgICBjbGFzcz0icmVmZXJlbmNlLWFycm93aGVhZCIKICAgICAgICBpZD0icmVmZXJlbmNlLWFycm93aGVhZC14bGFyZ2UiCiAgICAgICAgdmlld0JveD0iMCAwIDEwIDEwIgogICAgICAgIG1hcmtlcldpZHRoPSIyMCIKICAgICAgICBtYXJrZXJIZWlnaHQ9IjIwIgogICAgICAgIHJlZlg9IjIiCiAgICAgICAgcmVmWT0iNSIKICAgICAgICBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIKICAgICAgICBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgID4KICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNyZWZlcmVuY2UtYXJyb3doZWFkLXBhdGgiPjwvdXNlPgogICAgICA8L21hcmtlcj4KCiAgICAgIDwhLS0gQXJyb3cgaGVhZHMgZm9yIGRhdGFmbG93IGVkZ2UgcGF0aHMgb2YgZGlmZmVyZW50IHByZWRlZmluZWQgc2l6ZXMgcGVyIGNvbG9yLiAtLT4KICAgICAgPHBhdGgKICAgICAgICBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLXBhdGgiCiAgICAgICAgZD0iTSAwLDAgTCAxMCw1IEwgMCwxMCBDIDMsNyAzLDMgMCwwIgogICAgICA+PC9wYXRoPgogICAgICA8bWFya2VyCiAgICAgICAgY2xhc3M9ImRhdGFmbG93LWFycm93aGVhZCIKICAgICAgICBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLXNtYWxsIgogICAgICAgIHZpZXdCb3g9IjAgMCAxMCAxMCIKICAgICAgICBtYXJrZXJXaWR0aD0iNSIKICAgICAgICBtYXJrZXJIZWlnaHQ9IjUiCiAgICAgICAgcmVmWD0iMiIKICAgICAgICByZWZZPSI1IgogICAgICAgIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIgogICAgICAgIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIj48L3VzZT4KICAgICAgPC9tYXJrZXI+CiAgICAgIDxtYXJrZXIKICAgICAgICBjbGFzcz0iZGF0YWZsb3ctYXJyb3doZWFkIgogICAgICAgIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbWVkaXVtIgogICAgICAgIHZpZXdCb3g9IjAgMCAxMCAxMCIKICAgICAgICBtYXJrZXJXaWR0aD0iMTMiCiAgICAgICAgbWFya2VySGVpZ2h0PSIxMyIKICAgICAgICByZWZYPSIyIgogICAgICAgIHJlZlk9IjUiCiAgICAgICAgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiCiAgICAgICAgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICA+CiAgICAgICAgPHVzZSB4bGluazpocmVmPSIjZGF0YWZsb3ctYXJyb3doZWFkLXBhdGgiPjwvdXNlPgogICAgICA8L21hcmtlcj4KICAgICAgPG1hcmtlcgogICAgICAgIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiCiAgICAgICAgaWQ9ImRhdGFmbG93LWFycm93aGVhZC1sYXJnZSIKICAgICAgICB2aWV3Qm94PSIwIDAgMTAgMTAiCiAgICAgICAgbWFya2VyV2lkdGg9IjE2IgogICAgICAgIG1hcmtlckhlaWdodD0iMTYiCiAgICAgICAgcmVmWD0iMiIKICAgICAgICByZWZZPSI1IgogICAgICAgIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIgogICAgICAgIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIj48L3VzZT4KICAgICAgPC9tYXJrZXI+CiAgICAgIDxtYXJrZXIKICAgICAgICBjbGFzcz0iZGF0YWZsb3ctYXJyb3doZWFkIgogICAgICAgIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQteGxhcmdlIgogICAgICAgIHZpZXdCb3g9IjAgMCAxMCAxMCIKICAgICAgICBtYXJrZXJXaWR0aD0iMjAiCiAgICAgICAgbWFya2VySGVpZ2h0PSIyMCIKICAgICAgICByZWZYPSIyIgogICAgICAgIHJlZlk9IjUiCiAgICAgICAgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiCiAgICAgICAgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICA+CiAgICAgICAgPHVzZSB4bGluazpocmVmPSIjZGF0YWZsb3ctYXJyb3doZWFkLXBhdGgiPjwvdXNlPgogICAgICA8L21hcmtlcj4KCiAgICAgIDwhLS0gQXJyb3cgaGVhZCBmb3IgYW5ub3RhdGlvbiBlZGdlIHBhdGhzLiAtLT4KICAgICAgPG1hcmtlcgogICAgICAgIGlkPSJhbm5vdGF0aW9uLWFycm93aGVhZCIKICAgICAgICBtYXJrZXJXaWR0aD0iNSIKICAgICAgICBtYXJrZXJIZWlnaHQ9IjUiCiAgICAgICAgcmVmWD0iNSIKICAgICAgICByZWZZPSIyLjUiCiAgICAgICAgb3JpZW50PSJhdXRvIgogICAgICA+CiAgICAgICAgPHBhdGggZD0iTSAwLDAgTCA1LDIuNSBMIDAsNSBMIDAsMCI+PC9wYXRoPgogICAgICA8L21hcmtlcj4KICAgICAgPG1hcmtlcgogICAgICAgIGlkPSJhbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCIKICAgICAgICBtYXJrZXJXaWR0aD0iNSIKICAgICAgICBtYXJrZXJIZWlnaHQ9IjUiCiAgICAgICAgcmVmWD0iNSIKICAgICAgICByZWZZPSIyLjUiCiAgICAgICAgb3JpZW50PSJhdXRvIgogICAgICA+CiAgICAgICAgPHBhdGggZD0iTSAwLDAgTCA1LDIuNSBMIDAsNSBMIDAsMCI+PC9wYXRoPgogICAgICA8L21hcmtlcj4KICAgICAgPG1hcmtlcgogICAgICAgIGlkPSJyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQiCiAgICAgICAgbWFya2VyV2lkdGg9IjUiCiAgICAgICAgbWFya2VySGVpZ2h0PSI1IgogICAgICAgIHJlZlg9IjAiCiAgICAgICAgcmVmWT0iMi41IgogICAgICAgIG9yaWVudD0iYXV0byIKICAgICAgPgogICAgICAgIDxwYXRoIGQ9Ik0gNSwwIEwgMCwyLjUgTCA1LDUgTCA1LDAiPjwvcGF0aD4KICAgICAgPC9tYXJrZXI+CiAgICAgIDxtYXJrZXIKICAgICAgICBpZD0icmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkIgogICAgICAgIG1hcmtlcldpZHRoPSI1IgogICAgICAgIG1hcmtlckhlaWdodD0iNSIKICAgICAgICByZWZYPSIwIgogICAgICAgIHJlZlk9IjIuNSIKICAgICAgICBvcmllbnQ9ImF1dG8iCiAgICAgID4KICAgICAgICA8cGF0aCBkPSJNIDUsMCBMIDAsMi41IEwgNSw1IEwgNSwwIj48L3BhdGg+CiAgICAgIDwvbWFya2VyPgogICAgICA8IS0tIFRlbXBsYXRlIGZvciBhbiBPcCBub2RlIGVsbGlwc2UuIC0tPgogICAgICA8ZWxsaXBzZQogICAgICAgIGlkPSJvcC1ub2RlLXN0YW1wIgogICAgICAgIHJ4PSI3LjUiCiAgICAgICAgcnk9IjMiCiAgICAgICAgc3Ryb2tlPSJpbmhlcml0IgogICAgICAgIGZpbGw9ImluaGVyaXQiCiAgICAgID48L2VsbGlwc2U+CiAgICAgIDwhLS0gVGVtcGxhdGUgZm9yIGFuIE9wIG5vZGUgYW5ub3RhdGlvbiBlbGxpcHNlIChzbWFsbGVyKS4gLS0+CiAgICAgIDxlbGxpcHNlCiAgICAgICAgaWQ9Im9wLW5vZGUtYW5ub3RhdGlvbi1zdGFtcCIKICAgICAgICByeD0iNSIKICAgICAgICByeT0iMiIKICAgICAgICBzdHJva2U9ImluaGVyaXQiCiAgICAgICAgZmlsbD0iaW5oZXJpdCIKICAgICAgPjwvZWxsaXBzZT4KICAgICAgPCEtLSBWZXJ0aWNhbGx5IHN0YWNrZWQgc2VyaWVzIG9mIE9wIG5vZGVzIHdoZW4gdW5leHBhbmRlZC4gLS0+CiAgICAgIDxnIGlkPSJvcC1zZXJpZXMtdmVydGljYWwtc3RhbXAiPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjkiPjwvdXNlPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjYiPjwvdXNlPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjMiPjwvdXNlPgogICAgICA8L2c+CiAgICAgIDwhLS0gSG9yaXpvbnRhbGx5IHN0YWNrZWQgc2VyaWVzIG9mIE9wIG5vZGVzIHdoZW4gdW5leHBhbmRlZC4gLS0+CiAgICAgIDxnIGlkPSJvcC1zZXJpZXMtaG9yaXpvbnRhbC1zdGFtcCI+CiAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTYiIHk9IjQiPjwvdXNlPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjEyIiB5PSI0Ij48L3VzZT4KICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSI0Ij48L3VzZT4KICAgICAgPC9nPgogICAgICA8IS0tIEhvcml6b250YWxseSBzdGFja2VkIHNlcmllcyBvZiBPcCBub2RlcyBmb3IgYW5ub3RhdGlvbi4gLS0+CiAgICAgIDxnIGlkPSJvcC1zZXJpZXMtYW5ub3RhdGlvbi1zdGFtcCI+CiAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1hbm5vdGF0aW9uLXN0YW1wIiB4PSI5IiB5PSIyIj48L3VzZT4KICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjciIHk9IjIiPjwvdXNlPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtYW5ub3RhdGlvbi1zdGFtcCIgeD0iNSIgeT0iMiI+PC91c2U+CiAgICAgIDwvZz4KICAgICAgPHN2ZwogICAgICAgIGlkPSJzdW1tYXJ5LWljb24iCiAgICAgICAgZmlsbD0iIzg0ODQ4NCIKICAgICAgICBoZWlnaHQ9IjEyIgogICAgICAgIHZpZXdCb3g9IjAgMCAyNCAyNCIKICAgICAgICB3aWR0aD0iMTIiCiAgICAgID4KICAgICAgICA8cGF0aAogICAgICAgICAgZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIKICAgICAgICA+PC9wYXRoPgogICAgICA8L3N2Zz4KCiAgICAgIDwhLS0gSGF0Y2ggcGF0dGVybnMgZm9yIGZhZGVkIG91dCBub2Rlcy4gLS0+CiAgICAgIDxwYXR0ZXJuCiAgICAgICAgaWQ9InJlY3RIYXRjaCIKICAgICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJyb3RhdGUoNDUgMCAwKSIKICAgICAgICB3aWR0aD0iNSIKICAgICAgICBoZWlnaHQ9IjUiCiAgICAgICAgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgPgogICAgICAgIDxsaW5lIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSI1IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxIj48L2xpbmU+CiAgICAgIDwvcGF0dGVybj4KICAgICAgPHBhdHRlcm4KICAgICAgICBpZD0iZWxsaXBzZUhhdGNoIgogICAgICAgIHBhdHRlcm5UcmFuc2Zvcm09InJvdGF0ZSg0NSAwIDApIgogICAgICAgIHdpZHRoPSIyIgogICAgICAgIGhlaWdodD0iMiIKICAgICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICA+CiAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjIiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiPjwvbGluZT4KICAgICAgPC9wYXR0ZXJuPgoKICAgICAgPCEtLSBBIHNoYWRvdyBmb3IgaGVhbHRoIHBpbGxzLiAtLT4KICAgICAgPGZpbHRlcgogICAgICAgIGlkPSJoZWFsdGgtcGlsbC1zaGFkb3ciCiAgICAgICAgeD0iLTQwJSIKICAgICAgICB5PSItNDAlIgogICAgICAgIHdpZHRoPSIxODAlIgogICAgICAgIGhlaWdodD0iMTgwJSIKICAgICAgPgogICAgICAgIDxmZUdhdXNzaWFuQmx1ciBpbj0iU291cmNlQWxwaGEiIHN0ZERldmlhdGlvbj0iMC44Ij48L2ZlR2F1c3NpYW5CbHVyPgogICAgICAgIDxmZU9mZnNldCBkeD0iMCIgZHk9IjAiIHJlc3VsdD0ib2Zmc2V0Ymx1ciI+PC9mZU9mZnNldD4KICAgICAgICA8ZmVGbG9vZCBmbG9vZC1jb2xvcj0iIzAwMDAwMCI+PC9mZUZsb29kPgogICAgICAgIDxmZUNvbXBvc2l0ZSBpbjI9Im9mZnNldGJsdXIiIG9wZXJhdG9yPSJpbiI+PC9mZUNvbXBvc2l0ZT4KICAgICAgICA8ZmVNZXJnZT4KICAgICAgICAgIDxmZU1lcmdlTm9kZT48L2ZlTWVyZ2VOb2RlPgogICAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIj48L2ZlTWVyZ2VOb2RlPgogICAgICAgIDwvZmVNZXJnZT4KICAgICAgPC9maWx0ZXI+CiAgICA8L2RlZnM+CiAgICA8IS0tIE1ha2UgYSBsYXJnZSByZWN0YW5nbGUgdGhhdCBmaWxscyB0aGUgc3ZnIHNwYWNlIHNvIHRoYXQKICB6b29tIGV2ZW50cyBnZXQgY2FwdHVyZWQgb24gc2FmYXJpIC0tPgogICAgPHJlY3QgZmlsbD0id2hpdGUiIHdpZHRoPSIxMDAwMCIgaGVpZ2h0PSIxMDAwMCI+PC9yZWN0PgogICAgPGcgaWQ9InJvb3QiPjwvZz4KICA8L3N2Zz4KICA8dGYtZ3JhcGgtbWluaW1hcCBpZD0ibWluaW1hcCI+PC90Zi1ncmFwaC1taW5pbWFwPgogIDxkaXYgaWQ9ImNvbnRleHRNZW51IiBjbGFzcz0iY29udGV4dC1tZW51Ij48L2Rpdj4KYDtsZXQgSnF0PWNsYXNzIGV4dGVuZHMoZXIoaWwoeWUpKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX3pvb21lZD0hMSx0aGlzLl96b29tU3RhcnRDb29yZHM9bnVsbCx0aGlzLl96b29tVHJhbnNmb3JtPW51bGwsdGhpcy5fbWF4Wm9vbURpc3RhbmNlRm9yQ2xpY2s9MjAsdGhpcy5fbm9kZUdyb3VwSW5kZXg9e30sdGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXg9e30sdGhpcy5fZWRnZUdyb3VwSW5kZXg9e30sdGhpcy5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemU9OSx0aGlzLm1pbk1ldGFub2RlTGFiZWxMZW5ndGhGb250U2l6ZT02LHRoaXMubWF4TWV0YW5vZGVMYWJlbExlbmd0aExhcmdlRm9udD0xMSx0aGlzLm1heE1ldGFub2RlTGFiZWxMZW5ndGg9MTh9Z2V0Tm9kZSh0KXtyZXR1cm4gdGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZSh0KX1pc05vZGVFeHBhbmRlZCh0KXtyZXR1cm4gdC5leHBhbmRlZH1zZXROb2RlRXhwYW5kZWQodCl7dGhpcy5fYnVpbGQodGhpcy5yZW5kZXJIaWVyYXJjaHkpLHRoaXMuX3VwZGF0ZUxhYmVscyghdGhpcy5fem9vbWVkKX1wYW5Ub05vZGUodCl7KGZ1bmN0aW9uIGUodCxuLGkscil7Y29uc3Qgbz1TdShuKS5zZWxlY3QoYFtkYXRhLW5hbWU9IiR7dH0iXWApLm5vZGUoKTtpZighbylyZXR1cm4gY29uc29sZS53YXJuKGBwYW5Ub05vZGUoKSBmYWlsZWQgZm9yIG5vZGUgbmFtZSAiJHt0fSJgKSwhMTtsZXQgYT1vLmdldEJCb3goKSxzPW8uZ2V0U2NyZWVuQ1RNKCksbD1uLmNyZWF0ZVNWR1BvaW50KCksYz1uLmNyZWF0ZVNWR1BvaW50KCk7bC54PWEueCxsLnk9YS55LGMueD1hLngrYS53aWR0aCxjLnk9YS55K2EuaGVpZ2h0LGw9bC5tYXRyaXhUcmFuc2Zvcm0ocyksYz1jLm1hdHJpeFRyYW5zZm9ybShzKTtsZXQgdT0odCxlLG4saSk9PiEodD5uJiZlPGkpLGg9bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCBkPWgudG9wK2guaGVpZ2h0LTE1MDtpZih1KGwueCxjLngsaC5sZWZ0LGgubGVmdCtoLndpZHRoLTMyMCl8fHUobC55LGMueSxoLnRvcCxkKSl7bGV0IHQ9aC5sZWZ0K2gud2lkdGgvMi0obC54K2MueCkvMixlPWgudG9wK2guaGVpZ2h0LzItKGwueStjLnkpLzI7Y29uc3QgaT1iTihuKTtyZXR1cm4gU3UobikudHJhbnNpdGlvbigpLmR1cmF0aW9uKDUwMCkuY2FsbChyLnRyYW5zbGF0ZUJ5LHQvaS5rLGUvaS5rKSwhMH1yZXR1cm4hMX0pKHQsdGhpcy4kLnN2ZywwLHRoaXMuX3pvb20pJiYodGhpcy5fem9vbWVkPSEwKX1nZXRHcmFwaFN2Z1Jvb3QoKXtyZXR1cm4gdGhpcy4kLnN2Z31nZXRDb250ZXh0TWVudSgpe3JldHVybiB0aGlzLiQuY29udGV4dE1lbnV9X3Jlc2V0U3RhdGUoKXt0aGlzLl9ub2RlR3JvdXBJbmRleD17fSx0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleD17fSx0aGlzLl9lZGdlR3JvdXBJbmRleD17fSx0aGlzLl91cGRhdGVMYWJlbHMoITEpLFN1KHRoaXMuJC5zdmcpLnNlbGVjdCgiI3Jvb3QiKS5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKSxicXQodGhpcy4kLnN2Zyl9X2J1aWxkKHQpe3RoaXMudGVtcGxhdGVJbmRleD10LmhpZXJhcmNoeS5nZXRUZW1wbGF0ZUluZGV4KCksQ0d0KCJ0Zi1ncmFwaC1zY2VuZSAobGF5b3V0KToiLGZ1bmN0aW9uKCl7Uld0KHQucm9vdCl9LmJpbmQodGhpcyksX0d0LlJFTkRFUl9TQ0VORV9MQVlPVVQpLENHdCgidGYtZ3JhcGgtc2NlbmUgKGJ1aWxkIHNjZW5lKToiLGZ1bmN0aW9uKCl7THF0KFN1KHRoaXMuJC5yb290KSx0LnJvb3QsdGhpcyksKGZ1bmN0aW9uIGUodCxuKXtTdSh0KS5vbigiY2xpY2siLCgoKT0+e24uZmlyZSgiZ3JhcGgtc2VsZWN0Iil9KSl9KSh0aGlzLiQuc3ZnLHRoaXMpLHRoaXMuX3VwZGF0ZUlucHV0VHJhY2UoKX0uYmluZCh0aGlzKSxfR3QuUkVOREVSX1NDRU5FX0JVSUxEX1NDRU5FKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSGVhbHRoUGlsbHModGhpcy5ub2RlTmFtZXNUb0hlYWx0aFBpbGxzLHRoaXMuaGVhbHRoUGlsbFN0ZXBJbmRleCksdGhpcy5taW5pbWFwLnVwZGF0ZSgpfS5iaW5kKHRoaXMpLE5XdC5hbmltYXRpb24uZHVyYXRpb24pfXJlYWR5KCl7c3VwZXIucmVhZHkoKSx0aGlzLl96b29tPWtOKCkub24oImVuZCIsZnVuY3Rpb24oKXt0aGlzLl96b29tU3RhcnRDb29yZHMmJihNYXRoLnNxcnQoTWF0aC5wb3codGhpcy5fem9vbVN0YXJ0Q29vcmRzLngtdGhpcy5fem9vbVRyYW5zZm9ybS54LDIpK01hdGgucG93KHRoaXMuX3pvb21TdGFydENvb3Jkcy55LXRoaXMuX3pvb21UcmFuc2Zvcm0ueSwyKSk8dGhpcy5fbWF4Wm9vbURpc3RhbmNlRm9yQ2xpY2s/dGhpcy5fZmlyZUVuYWJsZUNsaWNrKCk6c2V0VGltZW91dCh0aGlzLl9maXJlRW5hYmxlQ2xpY2suYmluZCh0aGlzKSw1MCkpLHRoaXMuX3pvb21TdGFydENvb3Jkcz1udWxsfS5iaW5kKHRoaXMpKS5vbigiem9vbSIsZnVuY3Rpb24oKXt0aGlzLl96b29tVHJhbnNmb3JtPXV1LnRyYW5zZm9ybSx0aGlzLl96b29tU3RhcnRDb29yZHN8fCh0aGlzLl96b29tU3RhcnRDb29yZHM9dGhpcy5fem9vbVRyYW5zZm9ybSx0aGlzLmZpcmUoImRpc2FibGUtY2xpY2siKSksdGhpcy5fem9vbWVkPSEwLFN1KHRoaXMuJC5yb290KS5hdHRyKCJ0cmFuc2Zvcm0iLHV1LnRyYW5zZm9ybSksdGhpcy5taW5pbWFwLnpvb20odXUudHJhbnNmb3JtKX0uYmluZCh0aGlzKSksU3UodGhpcy4kLnN2ZykuY2FsbCh0aGlzLl96b29tKS5vbigiZGJsY2xpY2suem9vbSIsbnVsbCksU3Uod2luZG93KS5vbigicmVzaXplIixmdW5jdGlvbigpe3RoaXMubWluaW1hcC56b29tKCl9LmJpbmQodGhpcykpLHRoaXMubWluaW1hcD10aGlzLiQubWluaW1hcC5pbml0KHRoaXMuJC5zdmcsdGhpcy4kLnJvb3QsdGhpcy5fem9vbSxOV3QubWluaW1hcC5zaXplLE5XdC5zdWJzY2VuZS5tZXRhLmxhYmVsSGVpZ2h0KX1hdHRhY2hlZCgpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITApfWRldGFjaGVkKCl7dGhpcy5zZXQoIl9pc0F0dGFjaGVkIiwhMSl9X3JlbmRlckhpZXJhcmNoeUNoYW5nZWQoKXt2YXIgdD10aGlzLnJlbmRlckhpZXJhcmNoeTt0aGlzLl9oYXNSZW5kZXJIaWVyYXJjaHlCZWVuRml0T25jZT0hMSx0aGlzLl9yZXNldFN0YXRlKCksdGhpcy5fYnVpbGQodCl9X2FuaW1hdGVBbmRGaXQoKXshdGhpcy5faGFzUmVuZGVySGllcmFyY2h5QmVlbkZpdE9uY2UmJnRoaXMuX2lzQXR0YWNoZWQmJnNldFRpbWVvdXQodGhpcy5maXQuYmluZCh0aGlzKSxOV3QuYW5pbWF0aW9uLmR1cmF0aW9uKX1fdXBkYXRlTGFiZWxzKHQpe3ZhciBlPXRoaXMuJCQoIi50aXRsZSIpLG49ZS5zdHlsZSxpPXRoaXMuJCQoIi5hdXhUaXRsZSIpLHI9aS5zdHlsZSxvPXRoaXMuJCQoIi5mdW5jdGlvbkxpYnJhcnlUaXRsZSIpLnN0eWxlO2NvbnN0IGE9U3UodGhpcy4kLnN2Zyk7dmFyIHM9YS5zZWxlY3QoIi4iK1ZXdC5TY2VuZS5HUk9VUCsiPi4iK1ZXdC5TY2VuZS5DT1JFKS5ub2RlKCk7aWYodCYmcyYmdGhpcy5wcm9ncmVzcyYmMTAwPT09dGhpcy5wcm9ncmVzcy52YWx1ZSl7dmFyIGw9YS5zZWxlY3QoIi4iK1ZXdC5TY2VuZS5HUk9VUCsiPi4iK1ZXdC5TY2VuZS5JTkVYVFJBQ1QpLm5vZGUoKXx8YS5zZWxlY3QoIi4iK1ZXdC5TY2VuZS5HUk9VUCsiPi4iK1ZXdC5TY2VuZS5PVVRFWFRSQUNUKS5ub2RlKCksYz1zLmdldENUTSgpLmUsdT1sP2wuZ2V0Q1RNKCkuZTpudWxsO24uZGlzcGxheT0iaW5saW5lIixuLmxlZnQ9YysicHgiLG51bGwhPT11JiZ1IT09Yz8oci5kaXNwbGF5PSJpbmxpbmUiLHU9TWF0aC5tYXgoYytlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLHUpLHIubGVmdD11KyJweCIpOnIuZGlzcGxheT0ibm9uZSI7bGV0IHQ9YS5zZWxlY3QoIi4iK1ZXdC5TY2VuZS5HUk9VUCsiPi4iK1ZXdC5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKS5ub2RlKCksaD10P3QuZ2V0Q1RNKCkuZTpudWxsO251bGwhPT1oJiZoIT09dT8oby5kaXNwbGF5PSJpbmxpbmUiLGg9TWF0aC5tYXgodStpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLGgpLG8ubGVmdD1oKyJweCIpOm8uZGlzcGxheT0ibm9uZSJ9ZWxzZSBuLmRpc3BsYXk9Im5vbmUiLHIuZGlzcGxheT0ibm9uZSIsby5kaXNwbGF5PSJub25lIn1ub2RlQ29sb3JzQ2hhbmdlZCgpe251bGwhPXRoaXMucmVuZGVySGllcmFyY2h5JiYodGhpcy50ZW1wbGF0ZUluZGV4PXRoaXMucmVuZGVySGllcmFyY2h5LmhpZXJhcmNoeS5nZXRUZW1wbGF0ZUluZGV4KCksU2UuZXhwb3J0cy5lYWNoKHRoaXMuX25vZGVHcm91cEluZGV4LCgodCxlKT0+e3RoaXMuX3VwZGF0ZU5vZGVTdGF0ZShlKX0pKSx0aGlzLm1pbmltYXAudXBkYXRlKCkpfWZpdCgpe3RoaXMuX2hhc1JlbmRlckhpZXJhcmNoeUJlZW5GaXRPbmNlPSEwLChmdW5jdGlvbiB0KGUsbixpLHIpe2xldCBvPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYT1udWxsO3RyeXtpZihhPW4uZ2V0QkJveCgpLDA9PT1hLndpZHRoKXJldHVybn1jYXRjaCh0KXtyZXR1cm59bGV0IHM9LjkqTWF0aC5taW4oby53aWR0aC9hLndpZHRoLG8uaGVpZ2h0L2EuaGVpZ2h0LDIpLGw9Tld0LmdyYXBoO2NvbnN0IGM9dk4uc2NhbGUocykudHJhbnNsYXRlKGwucGFkZGluZy5wYWRkaW5nTGVmdCxsLnBhZGRpbmcucGFkZGluZ1RvcCk7U3UoZSkudHJhbnNpdGlvbigpLmR1cmF0aW9uKDUwMCkuY2FsbChpLnRyYW5zZm9ybSxjKS5vbigiZW5kLmZpdHRlZCIsKCgpPT57aS5vbigiZW5kLmZpdHRlZCIsbnVsbCkscigpfSkpfSkodGhpcy4kLnN2Zyx0aGlzLiQucm9vdCx0aGlzLl96b29tLGZ1bmN0aW9uKCl7dGhpcy5fem9vbWVkPSExfS5iaW5kKHRoaXMpKX1nZXRJbWFnZUJsb2IoKXtyZXR1cm4gdGhpcy5taW5pbWFwLmdldEltYWdlQmxvYigpfWlzTm9kZVNlbGVjdGVkKHQpe3JldHVybiB0PT09dGhpcy5zZWxlY3RlZE5vZGV9aXNOb2RlSGlnaGxpZ2h0ZWQodCl7cmV0dXJuIHQ9PT10aGlzLmhpZ2hsaWdodGVkTm9kZX1hZGRBbm5vdGF0aW9uR3JvdXAodCxlLG4pe3ZhciBpPXQubm9kZS5uYW1lO3RoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2ldPXRoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2ldfHx7fSx0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleFtpXVtlLm5vZGUubmFtZV09bn1nZXRBbm5vdGF0aW9uR3JvdXBzSW5kZXgodCl7cmV0dXJuIHRoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W3RdfXJlbW92ZUFubm90YXRpb25Hcm91cCh0LGUpe2RlbGV0ZSB0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleFt0Lm5vZGUubmFtZV1bZS5ub2RlLm5hbWVdfWFkZE5vZGVHcm91cCh0LGUpe3RoaXMuX25vZGVHcm91cEluZGV4W3RdPWV9Z2V0Tm9kZUdyb3VwKHQpe3JldHVybiB0aGlzLl9ub2RlR3JvdXBJbmRleFt0XX1yZW1vdmVOb2RlR3JvdXAodCl7ZGVsZXRlIHRoaXMuX25vZGVHcm91cEluZGV4W3RdfWFkZEVkZ2VHcm91cCh0LGUpe3RoaXMuX2VkZ2VHcm91cEluZGV4W3RdPWV9Z2V0RWRnZUdyb3VwKHQpe3JldHVybiB0aGlzLl9lZGdlR3JvdXBJbmRleFt0XX1fdXBkYXRlSGVhbHRoUGlsbHMoKXshKGZ1bmN0aW9uIHQoZSxuLGkpe2lmKCFuKXJldHVybjtsZXQgcj0xO1N1KGUpLnNlbGVjdEFsbCgiZy5ub2Rlc2hhcGUiKS5lYWNoKChmdW5jdGlvbih0KXtjb25zdCBlPW5bdC5ub2RlLm5hbWVdOyEoZnVuY3Rpb24gbyh0LGUsbixpLHI9NjAsYT0xMCxzPTAsbCl7aWYoU3UodC5wYXJlbnROb2RlKS5zZWxlY3RBbGwoIi5oZWFsdGgtcGlsbCIpLnJlbW92ZSgpLCFlKXJldHVybjtjb25zdCBjPWUudmFsdWUsdT1jLnNsaWNlKDIsOCksaD11WzBdLGQ9dVsxXSxwPXVbNV07bGV0IGY9Y1sxXTtjb25zdCBtPXttaW46Y1s4XSxtYXg6Y1s5XSxtZWFuOmNbMTBdLHN0ZGRldjpNYXRoLnNxcnQoY1sxMV0pfTtudWxsPT1yJiYocj02MCksbnVsbD09YSYmKGE9MTApLG51bGw9PXMmJihzPTApLG51bGwhPW4mJm4ubm9kZS50eXBlPT09akd0Lk9QJiYoci89MixhLz0yKTtsZXQgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoYkd0LCJnIik7Zy5jbGFzc0xpc3QuYWRkKCJoZWFsdGgtcGlsbCIpO2xldCBfPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhiR3QsImRlZnMiKTtnLmFwcGVuZENoaWxkKF8pO2xldCB5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhiR3QsImxpbmVhckdyYWRpZW50Iik7Y29uc3Qgdj0iaGVhbHRoLXBpbGwtZ3JhZGllbnQtIitpO3kuc2V0QXR0cmlidXRlKCJpZCIsdik7bGV0IGI9MCx4PSIwJSI7Zm9yKGxldCB0PTA7dDx1Lmxlbmd0aDt0Kyspe2lmKCF1W3RdKWNvbnRpbnVlO2IrPXVbdF07bGV0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGJHdCwic3RvcCIpO2Uuc2V0QXR0cmlidXRlKCJvZmZzZXQiLHgpLGUuc2V0QXR0cmlidXRlKCJzdG9wLWNvbG9yIixVV3RbdF0uYmFja2dyb3VuZF9jb2xvcikseS5hcHBlbmRDaGlsZChlKTtsZXQgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoYkd0LCJzdG9wIiksaT0xMDAqYi9mKyIlIjtuLnNldEF0dHJpYnV0ZSgib2Zmc2V0IixpKSxuLnNldEF0dHJpYnV0ZSgic3RvcC1jb2xvciIsVVd0W3RdLmJhY2tncm91bmRfY29sb3IpLHkuYXBwZW5kQ2hpbGQobikseD1pfV8uYXBwZW5kQ2hpbGQoeSk7bGV0IHc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGJHdCwicmVjdCIpO3cuc2V0QXR0cmlidXRlKCJmaWxsIiwidXJsKCMiK3YrIikiKSx3LnNldEF0dHJpYnV0ZSgid2lkdGgiLFN0cmluZyhyKSksdy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsU3RyaW5nKGEpKSx3LnNldEF0dHJpYnV0ZSgieSIsU3RyaW5nKHMpKSxnLmFwcGVuZENoaWxkKHcpO2xldCBTPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhiR3QsInRpdGxlIik7Uy50ZXh0Q29udGVudD0oZnVuY3Rpb24gTSh0LGUsbixpKXtsZXQgcj0iRGV2aWNlOiAiK3QuZGV2aWNlX25hbWUrIlxuIjtyKz0iZHR5cGU6ICIrdC5kdHlwZSsiXG4iO2xldCBvPSIoc2NhbGFyKSI7dC5zaGFwZS5sZW5ndGg+MCYmKG89IigiK3Quc2hhcGUuam9pbigiLCIpKyIpIikscis9Ilxuc2hhcGU6ICIrbysiXG5cbiIscis9IiMoZWxlbWVudHMpOiAiK2UrIlxuIjtjb25zdCBhPVtdO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKW5bdF0+MCYmYS5wdXNoKCIjKCIrVVd0W3RdLmxhYmVsKyIpOiAiK25bdF0pO3JldHVybiByKz1hLmpvaW4oIiwgIikrIlxuXG4iLGkubWF4Pj1pLm1pbiYmKHIrPSJtaW46ICIraS5taW4rIiwgbWF4OiAiK2kubWF4KyJcbiIscis9Im1lYW46ICIraS5tZWFuKyIsIHN0ZGRldjogIitpLnN0ZGRldikscn0pKGUsZix1LG0pLGcuYXBwZW5kQ2hpbGQoUyk7bGV0IEU9ITE7aWYobnVsbCE9bil7bGV0IHQ9bi55LWEtbi5oZWlnaHQvMi0yO2lmKG4ubGFiZWxPZmZzZXQ8MCYmKHQrPW4ubGFiZWxPZmZzZXQpLGcuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIisobi54LXIvMikrIiwgIit0KyIpIiksdVsyXXx8dVszXXx8dVs0XSl7bGV0IHQ9bi5ub2RlLmF0dHI7aWYodCYmdC5sZW5ndGgpZm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspaWYoIlQiPT09dFtlXS5rZXkpe2xldCBuPXRbZV0udmFsdWUudHlwZTtFPW4mJi9eRFRfKEJPT0x8SU5UfFVJTlQpLy50ZXN0KG4pO2JyZWFrfX19bGV0IFQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGJHdCwidGV4dCIpO2lmKE51bWJlci5pc0Zpbml0ZShtLm1pbikmJk51bWJlci5pc0Zpbml0ZShtLm1heCkpe2NvbnN0IHQ9cVd0KG0ubWluLEUpLGU9cVd0KG0ubWF4LEUpO2lmKFQudGV4dENvbnRlbnQ9Zj4xP3QrIiB+ICIrZTp0LGg+MHx8ZD4wfHxwPjApe1QudGV4dENvbnRlbnQrPSIgKCI7Y29uc3QgdD1bXTtoPjAmJnQucHVzaChgTmFOw5cke2h9YCksZD4wJiZ0LnB1c2goYC3iiJ7DlyR7ZH1gKSxwPjAmJnQucHVzaChgK+KInsOXJHtwfWApLFQudGV4dENvbnRlbnQrPXQuam9pbigiOyAiKSsiKSJ9fWVsc2UgVC50ZXh0Q29udGVudD0iKE5vIGZpbml0ZSBlbGVtZW50cykiO1QuY2xhc3NMaXN0LmFkZCgiaGVhbHRoLXBpbGwtc3RhdHMiKSxudWxsPT1sJiYobD1yLzIpLFQuc2V0QXR0cmlidXRlKCJ4IixTdHJpbmcobCkpLFQuc2V0QXR0cmlidXRlKCJ5IixTdHJpbmcocy0yKSksZy5hcHBlbmRDaGlsZChUKSxZaSh0LnBhcmVudE5vZGUpLmFwcGVuZENoaWxkKGcpfSkodGhpcyxlP2VbaV06bnVsbCx0LHIrKyl9KSl9KSh0aGlzLiQuc3ZnLHRoaXMubm9kZU5hbWVzVG9IZWFsdGhQaWxscyx0aGlzLmhlYWx0aFBpbGxTdGVwSW5kZXgpfV91cGRhdGVOb2RlU3RhdGUodCl7dmFyIGU9dGhpcy5nZXROb2RlKHQpLG49dGhpcy5nZXROb2RlR3JvdXAodCk7biYmd3F0KG4sZSx0aGlzKSxlLm5vZGUudHlwZT09PWpHdC5NRVRBJiZlLm5vZGUuYXNzb2NpYXRlZEZ1bmN0aW9uJiYhZS5pc0xpYnJhcnlGdW5jdGlvbiYmd3F0KFN1KCIuIitWV3QuU2NlbmUuR1JPVVArIj4uIitWV3QuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSsnIGdbZGF0YS1uYW1lPSInKyhWR3QrZS5ub2RlLmFzc29jaWF0ZWRGdW5jdGlvbikrJyJdJyksZSx0aGlzKTt2YXIgaT10aGlzLmdldEFubm90YXRpb25Hcm91cHNJbmRleCh0KTtTZS5leHBvcnRzLmVhY2goaSwoKHQsbik9Pnt3cXQodCxlLHRoaXMsVld0LkFubm90YXRpb24uTk9ERSl9KSl9X3NlbGVjdGVkTm9kZUNoYW5nZWQodCxlKXtpZih0IT09ZSYmKGUmJnRoaXMuX3VwZGF0ZU5vZGVTdGF0ZShlKSx0KSl7dGhpcy5taW5pbWFwLnVwZGF0ZSgpO2Zvcih2YXIgbixpPXRoaXMucmVuZGVySGllcmFyY2h5LmhpZXJhcmNoeS5ub2RlKHQpLHI9W107bnVsbCE9aS5wYXJlbnROb2RlJiZpLnBhcmVudE5vZGUubmFtZSE9Rkd0OylyLnB1c2goKGk9aS5wYXJlbnROb2RlKS5uYW1lKTtTZS5leHBvcnRzLmZvckVhY2hSaWdodChyLCh0PT57dGhpcy5yZW5kZXJIaWVyYXJjaHkuYnVpbGRTdWJoaWVyYXJjaHkodCk7dmFyIGU9dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZSh0KTtlLm5vZGUuaXNHcm91cE5vZGUmJiFlLmV4cGFuZGVkJiYoZS5leHBhbmRlZD0hMCxufHwobj1lKSl9KSksbiYmKHRoaXMuc2V0Tm9kZUV4cGFuZGVkKG4pLHRoaXMuX3pvb21lZD0hMCksdCYmdGhpcy5fdXBkYXRlTm9kZVN0YXRlKHQpLHNldFRpbWVvdXQoKCgpPT57dGhpcy5wYW5Ub05vZGUodCl9KSxOV3QuYW5pbWF0aW9uLmR1cmF0aW9uKX19X2hpZ2hsaWdodGVkTm9kZUNoYW5nZWQodCxlKXt0IT09ZSYmKHQmJnRoaXMuX3VwZGF0ZU5vZGVTdGF0ZSh0KSxlJiZ0aGlzLl91cGRhdGVOb2RlU3RhdGUoZSkpfV9vblpvb21DaGFuZ2VkKCl7dGhpcy5fdXBkYXRlTGFiZWxzKCF0aGlzLl96b29tZWQpfV9maXJlRW5hYmxlQ2xpY2soKXt0aGlzLmZpcmUoImVuYWJsZS1jbGljayIpfV91cGRhdGVJbnB1dFRyYWNlKCl7TXF0KHRoaXMuZ2V0R3JhcGhTdmdSb290KCksdGhpcy5yZW5kZXJIaWVyYXJjaHksdGhpcy5zZWxlY3RlZE5vZGUsdGhpcy50cmFjZUlucHV0cyl9fTtKcXQudGVtcGxhdGU9WnF0LHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLHlXdCldLEpxdC5wcm90b3R5cGUsInJlbmRlckhpZXJhcmNoeSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxKcXQucHJvdG90eXBlLCJuYW1lIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLEpxdC5wcm90b3R5cGUsImNvbG9yQnkiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxKcXQucHJvdG90eXBlLCJ0cmFjZUlucHV0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLEpxdC5wcm90b3R5cGUsIl9oYXNSZW5kZXJIaWVyYXJjaHlCZWVuRml0T25jZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLEpxdC5wcm90b3R5cGUsIl9pc0F0dGFjaGVkIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEpxdC5wcm90b3R5cGUsIl96b29tIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfaGlnaGxpZ2h0ZWROb2RlQ2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sSnF0LnByb3RvdHlwZSwiaGlnaGxpZ2h0ZWROb2RlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfc2VsZWN0ZWROb2RlQ2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sSnF0LnByb3RvdHlwZSwic2VsZWN0ZWROb2RlIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEpxdC5wcm90b3R5cGUsImhhbmRsZUVkZ2VTZWxlY3RlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9vblpvb21DaGFuZ2VkIn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sSnF0LnByb3RvdHlwZSwiX3pvb21lZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxKcXQucHJvdG90eXBlLCJfem9vbVN0YXJ0Q29vcmRzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEpxdC5wcm90b3R5cGUsIl96b29tVHJhbnNmb3JtIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLEpxdC5wcm90b3R5cGUsIl9tYXhab29tRGlzdGFuY2VGb3JDbGljayIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLEpxdC5wcm90b3R5cGUsInRlbXBsYXRlSW5kZXgiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sSnF0LnByb3RvdHlwZSwiX25vZGVHcm91cEluZGV4Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEpxdC5wcm90b3R5cGUsIl9hbm5vdGF0aW9uR3JvdXBJbmRleCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxKcXQucHJvdG90eXBlLCJfZWRnZUdyb3VwSW5kZXgiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sSnF0LnByb3RvdHlwZSwibWF4TWV0YW5vZGVMYWJlbExlbmd0aEZvbnRTaXplIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLEpxdC5wcm90b3R5cGUsIm1pbk1ldGFub2RlTGFiZWxMZW5ndGhGb250U2l6ZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxKcXQucHJvdG90eXBlLCJtYXhNZXRhbm9kZUxhYmVsTGVuZ3RoTGFyZ2VGb250Iix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLEpxdC5wcm90b3R5cGUsIm1heE1ldGFub2RlTGFiZWxMZW5ndGgiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sSnF0LnByb3RvdHlwZSwicHJvZ3Jlc3MiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLEpxdC5wcm90b3R5cGUsIm5vZGVDb250ZXh0TWVudUl0ZW1zIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEpxdC5wcm90b3R5cGUsIm5vZGVOYW1lc1RvSGVhbHRoUGlsbHMiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sSnF0LnByb3RvdHlwZSwiaGVhbHRoUGlsbFN0ZXBJbmRleCIsdm9pZCAwKSx0KFthKCJyZW5kZXJIaWVyYXJjaHkiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLEpxdC5wcm90b3R5cGUsIl9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkIixudWxsKSx0KFthKCJfaXNBdHRhY2hlZCIsInJlbmRlckhpZXJhcmNoeSIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sSnF0LnByb3RvdHlwZSwiX2FuaW1hdGVBbmRGaXQiLG51bGwpLHQoW2EoImNvbG9yQnkiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLEpxdC5wcm90b3R5cGUsIm5vZGVDb2xvcnNDaGFuZ2VkIixudWxsKSx0KFthKCJub2RlTmFtZXNUb0hlYWx0aFBpbGxzIiwiaGVhbHRoUGlsbFN0ZXBJbmRleCIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sSnF0LnByb3RvdHlwZSwiX3VwZGF0ZUhlYWx0aFBpbGxzIixudWxsKSx0KFthKCJ0cmFjZUlucHV0cyIsInNlbGVjdGVkTm9kZSIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sSnF0LnByb3RvdHlwZSwiX3VwZGF0ZUlucHV0VHJhY2UiLG51bGwpLEpxdD10KFtpKCJ0Zi1ncmFwaC1zY2VuZSIpXSxKcXQpO2xldCBRcXQ9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9yZW5kZXJEZXB0aD0xLHRoaXMuX2FsbG93R3JhcGhTZWxlY3Q9ITAsdGhpcy5lZGdlV2lkdGhGdW5jdGlvbj0iIix0aGlzLmhhbmRsZU5vZGVTZWxlY3RlZD0iIix0aGlzLmVkZ2VMYWJlbEZ1bmN0aW9uPSIiLHRoaXMuaGFuZGxlRWRnZVNlbGVjdGVkPSIifXBhblRvTm9kZSh0KXt0aGlzLiQkKCJ0Zi1ncmFwaC1zY2VuZSIpLnBhblRvTm9kZSh0KX1fYXV0b0V4dHJhY3ROb2Rlc0NoYW5nZWQoKXt2YXIgdD10aGlzLmdyYXBoSGllcmFyY2h5O2lmKHQpe2Zvcihjb25zdCBlIG9mIE9iamVjdC52YWx1ZXModC5nZXROb2RlTWFwKCkpKWUuaW5jbHVkZT1HR3QuVU5TUEVDSUZJRUQ7dGhpcy5fYnVpbGRSZW5kZXJIaWVyYXJjaHkodCl9fV9idWlsZE5ld1JlbmRlckhpZXJhcmNoeSgpe3ZhciB0PXRoaXMuZ3JhcGhIaWVyYXJjaHk7dCYmdGhpcy5fYnVpbGRSZW5kZXJIaWVyYXJjaHkodCl9X3N0YXRzQ2hhbmdlZCgpe3ZhciB0PXRoaXMuc3RhdHMsZT10aGlzLmRldmljZXNGb3JTdGF0czt0aGlzLmdyYXBoSGllcmFyY2h5JiYodCYmZSYmKChmdW5jdGlvbiBuKHQsZSxpKXtTZS5leHBvcnRzLmVhY2godC5ub2RlcywodD0+e3Quc3RhdHM9bnVsbH0pKSxTZS5leHBvcnRzLmVhY2goZS5kZXZfc3RhdHMsKGU9PntpJiYhaVtlLmRldmljZV18fFNlLmV4cG9ydHMuZWFjaChlLm5vZGVfc3RhdHMsKG49PntsZXQgaT1uLm5vZGVfbmFtZSBpbiB0Lm5vZGVzP24ubm9kZV9uYW1lOnNXdChuLm5vZGVfbmFtZSk7aWYoIShpIGluIHQubm9kZXMpKXJldHVybjtsZXQgcj0wO24ubWVtb3J5JiZTZS5leHBvcnRzLmVhY2gobi5tZW1vcnksKHQ9Pnt0LnRvdGFsX2J5dGVzJiYodC50b3RhbF9ieXRlcz4wP3IrPU51bWJlcih0LnRvdGFsX2J5dGVzKTpjb25zb2xlLmxvZygiaWdub3JpbmcgbmVnYXRpdmUgbWVtb3J5IGFsbG9jYXRpb24gZm9yICIraSkpfSkpO2xldCBvPW51bGw7bi5vdXRwdXQmJihvPVNlLmV4cG9ydHMubWFwKG4ub3V0cHV0LCh0PT5TZS5leHBvcnRzLm1hcCh0LnRlbnNvcl9kZXNjcmlwdGlvbi5zaGFwZS5kaW0sKHQ9Pk51bWJlcih0LnNpemUpKSkpKSksdC5ub2Rlc1tpXS5kZXZpY2U9ZS5kZXZpY2UsbnVsbD09dC5ub2Rlc1tpXS5zdGF0cyYmKHQubm9kZXNbaV0uc3RhdHM9bmV3IFNHdChvKSksdC5ub2Rlc1tpXS5zdGF0cy5hZGRCeXRlc0FsbG9jYXRpb24ociksbi5hbGxfZW5kX3JlbF9taWNyb3MmJihuLmFsbF9lbmRfcmVsX21pY3Jvcz4wP3Qubm9kZXNbaV0uc3RhdHMuYWRkRXhlY3V0aW9uVGltZShuLmFsbF9zdGFydF9taWNyb3Msbi5hbGxfc3RhcnRfbWljcm9zK24uYWxsX2VuZF9yZWxfbWljcm9zKTpjb25zb2xlLmxvZygiaWdub3JpbmcgbmVnYXRpdmUgcnVudGltZSBmb3IgIitpKSl9KSl9KSl9KSh0aGlzLmJhc2ljR3JhcGgsdCxlKSwoZnVuY3Rpb24gaSh0LGUpe2xldCBuPXt9LGk9e307U2UuZXhwb3J0cy5lYWNoKHQucm9vdC5sZWF2ZXMoKSwoZT0+e2xldCByPXQubm9kZShlKTtudWxsIT1yLmRldmljZSYmKG5bci5kZXZpY2VdPSEwKSxudWxsIT1yLnhsYUNsdXN0ZXImJihpW3IueGxhQ2x1c3Rlcl09ITApfSkpLHQuZGV2aWNlcz1TZS5leHBvcnRzLmtleXMobiksdC54bGFDbHVzdGVycz1TZS5leHBvcnRzLmtleXMoaSksU2UuZXhwb3J0cy5lYWNoKHQuZ2V0Tm9kZU1hcCgpLCgodCxlKT0+e3QuaXNHcm91cE5vZGUmJih0LnN0YXRzPW5ldyBTR3QobnVsbCksdC5kZXZpY2VIaXN0b2dyYW09e30pfSkpLFNlLmV4cG9ydHMuZWFjaCh0LnJvb3QubGVhdmVzKCksKGU9PntsZXQgbj10Lm5vZGUoZSksaT1uO2Zvcig7bnVsbCE9aS5wYXJlbnROb2RlOyl7aWYobnVsbCE9bi5kZXZpY2Upe2xldCB0PWkucGFyZW50Tm9kZS5kZXZpY2VIaXN0b2dyYW07dFtuLmRldmljZV09KHRbbi5kZXZpY2VdfHwwKSsxfWlmKG51bGwhPW4ueGxhQ2x1c3Rlcil7bGV0IHQ9aS5wYXJlbnROb2RlLnhsYUNsdXN0ZXJIaXN0b2dyYW07dFtuLnhsYUNsdXN0ZXJdPSh0W24ueGxhQ2x1c3Rlcl18fDApKzF9bnVsbCE9bi5zdGF0cyYmaS5wYXJlbnROb2RlLnN0YXRzLmNvbWJpbmUobi5zdGF0cyksaT1pLnBhcmVudE5vZGV9fSkpfSkodGhpcy5ncmFwaEhpZXJhcmNoeSkpLHRoaXMuX2J1aWxkUmVuZGVySGllcmFyY2h5KHRoaXMuZ3JhcGhIaWVyYXJjaHkpKX1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJncmFwaC1zZWxlY3QiLHRoaXMuX2dyYXBoU2VsZWN0ZWQuYmluZCh0aGlzKSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJkaXNhYmxlLWNsaWNrIix0aGlzLl9kaXNhYmxlQ2xpY2suYmluZCh0aGlzKSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJlbmFibGUtY2xpY2siLHRoaXMuX2VuYWJsZUNsaWNrLmJpbmQodGhpcykpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigibm9kZS10b2dnbGUtZXhwYW5kIix0aGlzLl9ub2RlVG9nZ2xlRXhwYW5kLmJpbmQodGhpcykpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigibm9kZS1zZWxlY3QiLHRoaXMuX25vZGVTZWxlY3RlZC5iaW5kKHRoaXMpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoIm5vZGUtaGlnaGxpZ2h0Iix0aGlzLl9ub2RlSGlnaGxpZ2h0ZWQuYmluZCh0aGlzKSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJub2RlLXVuaGlnaGxpZ2h0Iix0aGlzLl9ub2RlVW5oaWdobGlnaHRlZC5iaW5kKHRoaXMpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoIm5vZGUtdG9nZ2xlLWV4dHJhY3QiLHRoaXMuX25vZGVUb2dnbGVFeHRyYWN0LmJpbmQodGhpcykpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigibm9kZS10b2dnbGUtc2VyaWVzZ3JvdXAiLHRoaXMuX25vZGVUb2dnbGVTZXJpZXNHcm91cC5iaW5kKHRoaXMpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImVkZ2Utc2VsZWN0Iix0aGlzLl9lZGdlU2VsZWN0ZWQuYmluZCh0aGlzKSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJhbm5vdGF0aW9uLXNlbGVjdCIsdGhpcy5fbm9kZVNlbGVjdGVkLmJpbmQodGhpcykpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiYW5ub3RhdGlvbi1oaWdobGlnaHQiLHRoaXMuX25vZGVIaWdobGlnaHRlZC5iaW5kKHRoaXMpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImFubm90YXRpb24tdW5oaWdobGlnaHQiLHRoaXMuX25vZGVVbmhpZ2hsaWdodGVkLmJpbmQodGhpcykpfV9idWlsZFJlbmRlckhpZXJhcmNoeSh0KXtpZih0LnJvb3QudHlwZSE9PWpHdC5NRVRBKXJldHVybjtjb25zdCBlPXRoaXMsbj1DR3QoIm5ldyB0Zl9ncmFwaF9yZW5kZXIuSGllcmFyY2h5IiwoKCk9Pntjb25zdCBuPW5ldyB5V3QodCwhIXRoaXMuc3RhdHMsdGhpcy5hdXRvRXh0cmFjdE5vZGVzKTtmdW5jdGlvbiBpKHQpe3JldHVybnttaW5WYWx1ZTp0LmRvbWFpbigpWzBdLG1heFZhbHVlOnQuZG9tYWluKClbMV0sc3RhcnRDb2xvcjp0LnJhbmdlKClbMF0sZW5kQ29sb3I6dC5yYW5nZSgpWzFdfX1yZXR1cm4gbi5lZGdlTGFiZWxGdW5jdGlvbj10aGlzLmVkZ2VMYWJlbEZ1bmN0aW9uLG4uZWRnZVdpZHRoRnVuY3Rpb249dGhpcy5lZGdlV2lkdGhGdW5jdGlvbixlLl9zZXRDb2xvckJ5UGFyYW1zKHtjb21wdXRlX3RpbWU6aShuLmNvbXB1dGVUaW1lU2NhbGUpLG1lbW9yeTppKG4ubWVtb3J5VXNhZ2VTY2FsZSksZGV2aWNlOlNlLmV4cG9ydHMubWFwKG4uZGV2aWNlQ29sb3JNYXAuZG9tYWluKCksKGZ1bmN0aW9uKHQpe3JldHVybntkZXZpY2U6dCxjb2xvcjpuLmRldmljZUNvbG9yTWFwKHQpfX0pKSx4bGFfY2x1c3RlcjpTZS5leHBvcnRzLm1hcChuLnhsYUNsdXN0ZXJDb2xvck1hcC5kb21haW4oKSwoZnVuY3Rpb24odCl7cmV0dXJue3hsYV9jbHVzdGVyOnQsY29sb3I6bi54bGFDbHVzdGVyQ29sb3JNYXAodCl9fSkpfSksbn0pLF9HdC5SRU5ERVJfQlVJTERfSElFUkFSQ0hZKTtlLl9zZXRSZW5kZXJIaWVyYXJjaHkobil9X2dldFZpc2libGUodCl7cmV0dXJuIHQ/dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0TmVhcmVzdFZpc2libGVBbmNlc3Rvcih0KTp0fWZpdCgpe3RoaXMuJC5zY2VuZS5maXQoKX1nZXRJbWFnZUJsb2IoKXtyZXR1cm4gdGhpcy4kLnNjZW5lLmdldEltYWdlQmxvYigpfV9ncmFwaENoYW5nZWQoKXt0aGlzLmdyYXBoSGllcmFyY2h5JiYodGhpcy5ncmFwaEhpZXJhcmNoeS5hZGRMaXN0ZW5lcih6cXQuVEVNUExBVEVTX1VQREFURUQsKCgpPT57dGhpcy4kLnNjZW5lLm5vZGVDb2xvcnNDaGFuZ2VkKCl9KSksdGhpcy5maXJlKCJncmFwaC1zZWxlY3QiKSl9X2dyYXBoU2VsZWN0ZWQodCl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdCYmKHRoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLG51bGwpLHRoaXMuc2V0KCJzZWxlY3RlZEVkZ2UiLG51bGwpKSx0aGlzLl9hbGxvd0dyYXBoU2VsZWN0PSEwfV9kaXNhYmxlQ2xpY2sodCl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMX1fZW5hYmxlQ2xpY2sodCl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMH1fc2VsZWN0ZWROb2RlQ2hhbmdlZCgpe3RoaXMuaGFuZGxlTm9kZVNlbGVjdGVkJiZ0aGlzLmhhbmRsZU5vZGVTZWxlY3RlZCh0aGlzLnNlbGVjdGVkTm9kZSl9X3NlbGVjdGVkRWRnZUNoYW5nZWQoKXt2YXIgdD10aGlzLnNlbGVjdGVkRWRnZTt0aGlzLl9kZXNlbGVjdFByZXZpb3VzRWRnZSgpLHQmJih0aGlzLl9sYXN0U2VsZWN0ZWRFZGdlR3JvdXAuY2xhc3NlZChWV3QuRWRnZS5TRUxFQ1RFRCwhMCksdGhpcy5fdXBkYXRlTWFya2VyT2ZTZWxlY3RlZEVkZ2UodCkpLHRoaXMuaGFuZGxlRWRnZVNlbGVjdGVkJiZ0aGlzLmhhbmRsZUVkZ2VTZWxlY3RlZCh0KX1fbm9kZVNlbGVjdGVkKHQpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3QmJnRoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLHQuZGV0YWlsLm5hbWUpLHRoaXMuX2FsbG93R3JhcGhTZWxlY3Q9ITB9X2VkZ2VTZWxlY3RlZCh0KXt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0JiYodGhpcy5zZXQoIl9sYXN0U2VsZWN0ZWRFZGdlR3JvdXAiLHQuZGV0YWlsLmVkZ2VHcm91cCksdGhpcy5zZXQoInNlbGVjdGVkRWRnZSIsdC5kZXRhaWwuZWRnZURhdGEpKSx0aGlzLl9hbGxvd0dyYXBoU2VsZWN0PSEwfV9ub2RlSGlnaGxpZ2h0ZWQodCl7dGhpcy5zZXQoImhpZ2hsaWdodGVkTm9kZSIsdC5kZXRhaWwubmFtZSl9X25vZGVVbmhpZ2hsaWdodGVkKHQpe3RoaXMuc2V0KCJoaWdobGlnaHRlZE5vZGUiLG51bGwpfV9ub2RlVG9nZ2xlRXhwYW5kKHQpe3RoaXMuX25vZGVTZWxlY3RlZCh0KTt2YXIgZT10LmRldGFpbC5uYW1lLG49dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShlKTtuLm5vZGUudHlwZSE9PWpHdC5PUCYmKHRoaXMucmVuZGVySGllcmFyY2h5LmJ1aWxkU3ViaGllcmFyY2h5KGUpLG4uZXhwYW5kZWQ9IW4uZXhwYW5kZWQsdGhpcy5hc3luYygoZnVuY3Rpb24oKXt0aGlzLiQuc2NlbmUuc2V0Tm9kZUV4cGFuZGVkKG4pfSksNzUpLFRHdCh7YWN0aW9uSWQ6X0d0Lk5PREVfRVhQQU5TSU9OX1RPR0dMRUQsZXZlbnRMYWJlbDpuLmV4cGFuZGVkPyJleHBhbmRlZCI6ImNvbGxhcHNlZCJ9KSl9X25vZGVUb2dnbGVFeHRyYWN0KHQpe3RoaXMubm9kZVRvZ2dsZUV4dHJhY3QodC5kZXRhaWwubmFtZSl9bm9kZVRvZ2dsZUV4dHJhY3QodCl7Y29uc3QgZT10aGlzLnJlbmRlckhpZXJhcmNoeS5nZXRSZW5kZXJOb2RlQnlOYW1lKHQpO2Uubm9kZS5pbmNsdWRlPWUubm9kZS5pbmNsdWRlPT1HR3QuSU5DTFVERT9HR3QuRVhDTFVERTplLm5vZGUuaW5jbHVkZT09R0d0LkVYQ0xVREV8fHRoaXMucmVuZGVySGllcmFyY2h5LmlzTm9kZUF1eGlsaWFyeShlKT9HR3QuSU5DTFVERTpHR3QuRVhDTFVERSx0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0aGlzLmdyYXBoSGllcmFyY2h5KSxUR3Qoe2FjdGlvbklkOl9HdC5OT0RFX0FVWElMSUFSWV9FWFRSQUNUSU9OX0NIQU5HRUQsZXZlbnRMYWJlbDplLm5vZGUuaW5jbHVkZT09PUdHdC5JTkNMVURFPyJBdXhpbGlhcnkgdG8gTWFpbiI6Ik1haW4gdG8gQXV4aWxpYXJ5In0pfV9ub2RlVG9nZ2xlU2VyaWVzR3JvdXAodCl7dGhpcy5ub2RlVG9nZ2xlU2VyaWVzR3JvdXAodC5kZXRhaWwubmFtZSl9bm9kZVRvZ2dsZVNlcmllc0dyb3VwKHQpe3RoaXMuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOjAsbXNnOiIifSk7dmFyIGU9a0d0KEFHdCh0aGlzKSwxMDAsIk5hbWVzcGFjZSBoaWVyYXJjaHkiKTtjb25zdCBuPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0aGlzLmhpZXJhcmNoeVBhcmFtcykse3Nlcmllc01hcDp0aGlzLmdyYXBoSGllcmFyY2h5LmJ1aWxkU2VyaWVzR3JvdXBNYXBUb2dnbGVkKHQpfSk7RnF0KHRoaXMuYmFzaWNHcmFwaCxuLGUpLnRoZW4oZnVuY3Rpb24odCl7dGhpcy5zZXQoImdyYXBoSGllcmFyY2h5Iix0KSx0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0aGlzLmdyYXBoSGllcmFyY2h5KX0uYmluZCh0aGlzKSl9X2Rlc2VsZWN0UHJldmlvdXNFZGdlKCl7U3UoIi4iK1ZXdC5FZGdlLlNFTEVDVEVEKS5jbGFzc2VkKFZXdC5FZGdlLlNFTEVDVEVELCExKS5lYWNoKCgodCxlKT0+e2lmKHQubGFiZWwpe2NvbnN0IGU9U3UodGhpcykuc2VsZWN0QWxsKCJwYXRoLmVkZ2VsaW5lIik7dC5sYWJlbC5zdGFydE1hcmtlcklkJiZlLnN0eWxlKCJtYXJrZXItc3RhcnQiLGB1cmwoIyR7dC5sYWJlbC5zdGFydE1hcmtlcklkfSlgKSx0LmxhYmVsLmVuZE1hcmtlcklkJiZlLnN0eWxlKCJtYXJrZXItZW5kIixgdXJsKCMke3QubGFiZWwuZW5kTWFya2VySWR9KWApfX0pKX1fdXBkYXRlTWFya2VyT2ZTZWxlY3RlZEVkZ2UodCl7aWYodC5sYWJlbCl7Y29uc3QgZT10LmxhYmVsLnN0YXJ0TWFya2VySWR8fHQubGFiZWwuZW5kTWFya2VySWQ7aWYoZSl7Y29uc3Qgbj1lLnJlcGxhY2UoImRhdGFmbG93LSIsInNlbGVjdGVkLSIpO2xldCBpPXRoaXMuJCQoIiMiK24pO2lmKCFpKXtjb25zdCB0PXRoaXMuJC5zY2VuZS5xdWVyeVNlbGVjdG9yKCIjIitlKTtpPXQuY2xvbmVOb2RlKCEwKSxpLnNldEF0dHJpYnV0ZSgiaWQiLG4pLGkuY2xhc3NMaXN0LmFkZCgic2VsZWN0ZWQtYXJyb3doZWFkIiksdC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGkpfWNvbnN0IHI9dC5sYWJlbC5zdGFydE1hcmtlcklkPyJtYXJrZXItc3RhcnQiOiJtYXJrZXItZW5kIjt0aGlzLl9sYXN0U2VsZWN0ZWRFZGdlR3JvdXAuc2VsZWN0QWxsKCJwYXRoLmVkZ2VsaW5lIikuc3R5bGUocixgdXJsKCMke259KWApfX19bm90KHQpe3JldHVybiF0fX07UXF0LnRlbXBsYXRlPV9lYAogICAgPHN0eWxlPgogICAgICAuY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4yKTsKICAgICAgfQoKICAgICAgLnZlcnRpY2FsIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICB9CgogICAgICAuYXV0byB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtdmVydGljYWw7CiAgICAgIH0KCiAgICAgIGgyIHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICA8ZGl2IGNsYXNzPSJ2ZXJ0aWNhbCI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3RpdGxlXV0iPgogICAgICAgICAgPGgyPltbdGl0bGVdXTwvaDI+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGYtZ3JhcGgtc2NlbmUKICAgICAgICAgIGlkPSJzY2VuZSIKICAgICAgICAgIGNsYXNzPSJhdXRvIgogICAgICAgICAgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIKICAgICAgICAgIGhpZ2hsaWdodGVkLW5vZGU9IltbX2dldFZpc2libGUoaGlnaGxpZ2h0ZWROb2RlKV1dIgogICAgICAgICAgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIKICAgICAgICAgIHNlbGVjdGVkLWVkZ2U9Int7c2VsZWN0ZWRFZGdlfX0iCiAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgICBwcm9ncmVzcz0iW1twcm9ncmVzc11dIgogICAgICAgICAgbm9kZS1jb250ZXh0LW1lbnUtaXRlbXM9Iltbbm9kZUNvbnRleHRNZW51SXRlbXNdXSIKICAgICAgICAgIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIKICAgICAgICAgIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19IgogICAgICAgICAgaGFuZGxlLWVkZ2Utc2VsZWN0ZWQ9IltbaGFuZGxlRWRnZVNlbGVjdGVkXV0iCiAgICAgICAgICB0cmFjZS1pbnB1dHM9IltbdHJhY2VJbnB1dHNdXSIKICAgICAgICA+PC90Zi1ncmFwaC1zY2VuZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgLHQoW28oe3R5cGU6T2JqZWN0LG5vdGlmeTohMCxvYnNlcnZlcjoiX2dyYXBoQ2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsRHF0KV0sUXF0LnByb3RvdHlwZSwiZ3JhcGhIaWVyYXJjaHkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIscUd0KV0sUXF0LnByb3RvdHlwZSwiYmFzaWNHcmFwaCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxRcXQucHJvdG90eXBlLCJzdGF0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxRcXQucHJvdG90eXBlLCJkZXZpY2VzRm9yU3RhdHMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sUXF0LnByb3RvdHlwZSwiaGllcmFyY2h5UGFyYW1zIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxRcXQucHJvdG90eXBlLCJwcm9ncmVzcyIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxRcXQucHJvdG90eXBlLCJ0aXRsZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sUXF0LnByb3RvdHlwZSwic2VsZWN0ZWROb2RlIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxRcXQucHJvdG90eXBlLCJzZWxlY3RlZEVkZ2UiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sUXF0LnByb3RvdHlwZSwiX2xhc3RTZWxlY3RlZEVkZ2VHcm91cCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sUXF0LnByb3RvdHlwZSwiaGlnaGxpZ2h0ZWROb2RlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFFxdC5wcm90b3R5cGUsImNvbG9yQnkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFFxdC5wcm90b3R5cGUsImNvbG9yQnlQYXJhbXMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLHlXdCldLFFxdC5wcm90b3R5cGUsInJlbmRlckhpZXJhcmNoeSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFFxdC5wcm90b3R5cGUsInRyYWNlSW5wdXRzIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sUXF0LnByb3RvdHlwZSwiYXV0b0V4dHJhY3ROb2RlcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sUXF0LnByb3RvdHlwZSwibm9kZUNvbnRleHRNZW51SXRlbXMiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sUXF0LnByb3RvdHlwZSwiX3JlbmRlckRlcHRoIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sUXF0LnByb3RvdHlwZSwiX2FsbG93R3JhcGhTZWxlY3QiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sUXF0LnByb3RvdHlwZSwibm9kZU5hbWVzVG9IZWFsdGhQaWxscyIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxRcXQucHJvdG90eXBlLCJoZWFsdGhQaWxsU3RlcEluZGV4Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFFxdC5wcm90b3R5cGUsImVkZ2VXaWR0aEZ1bmN0aW9uIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFFxdC5wcm90b3R5cGUsImhhbmRsZU5vZGVTZWxlY3RlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxRcXQucHJvdG90eXBlLCJlZGdlTGFiZWxGdW5jdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxRcXQucHJvdG90eXBlLCJoYW5kbGVFZGdlU2VsZWN0ZWQiLHZvaWQgMCksdChbYSgiYXV0b0V4dHJhY3ROb2RlcyIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sUXF0LnByb3RvdHlwZSwiX2F1dG9FeHRyYWN0Tm9kZXNDaGFuZ2VkIixudWxsKSx0KFthKCJncmFwaEhpZXJhcmNoeSIsImVkZ2VXaWR0aEZ1bmN0aW9uIiwiaGFuZGxlTm9kZVNlbGVjdGVkIiwiZWRnZUxhYmVsRnVuY3Rpb24iLCJoYW5kbGVFZGdlU2VsZWN0ZWQiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLFFxdC5wcm90b3R5cGUsIl9idWlsZE5ld1JlbmRlckhpZXJhcmNoeSIsbnVsbCksdChbYSgic3RhdHMiLCJkZXZpY2VzRm9yU3RhdHMiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLFFxdC5wcm90b3R5cGUsIl9zdGF0c0NoYW5nZWQiLG51bGwpLHQoW2EoInNlbGVjdGVkTm9kZSIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sUXF0LnByb3RvdHlwZSwiX3NlbGVjdGVkTm9kZUNoYW5nZWQiLG51bGwpLHQoW2EoInNlbGVjdGVkRWRnZSIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sUXF0LnByb3RvdHlwZSwiX3NlbGVjdGVkRWRnZUNoYW5nZWQiLG51bGwpLFFxdD10KFtpKCJ0Zi1ncmFwaCIpXSxRcXQpO2NvbnN0IHRZdD17TUFYX05PREVfQ09VTlQ6MWU0LE1BWF9FREdFX0NPVU5UOjFlNH07bGV0IGVZdD1jbGFzcyBleHRlbmRzKGVyKHllKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuaGllcmFyY2h5UGFyYW1zPUhxdCx0aGlzLmFsbFN0ZXBzTW9kZUVuYWJsZWQ9ITEsdGhpcy5zcGVjaWZpY0hlYWx0aFBpbGxTdGVwPTAsdGhpcy5jb21wYXROb2RlVGl0bGU9IlRQVSBDb21wYXRpYmlsaXR5In1maXQoKXt0aGlzLiQuZ3JhcGguZml0KCl9ZG93bmxvYWRBc0ltYWdlKHQpe3JldHVybiBuKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT15aWVsZCB0aGlzLiQuZ3JhcGguZ2V0SW1hZ2VCbG9iKCksbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7bi5ocmVmPVVSTC5jcmVhdGVPYmplY3RVUkwoZSksbi5kb3dubG9hZD10LG4uY2xpY2soKSxVUkwucmV2b2tlT2JqZWN0VVJMKG4uaHJlZil9KSl9X2lzTm90Q29tcGxldGUodCl7cmV0dXJuIHQudmFsdWU8MTAwfV9nZXRDb250YWluZXJDbGFzcyh0KXt2YXIgZT0iY29udGFpbmVyIjtyZXR1cm4gdC5lcnJvciYmKGUrPSIgZXJyb3IiKSx0aGlzLl9pc05vdENvbXBsZXRlKHQpJiYoZSs9IiBsb2FkaW5nIiksZX1fb25Ob2RlSW5jbHVzaW9uVG9nZ2xlZCh0KXt0aGlzLiQuZ3JhcGgubm9kZVRvZ2dsZUV4dHJhY3QodC5kZXRhaWwubmFtZSl9X29uTm9kZVNlcmllc0dyb3VwVG9nZ2xlZCh0KXt0aGlzLiQuZ3JhcGgubm9kZVRvZ2dsZVNlcmllc0dyb3VwKHQuZGV0YWlsLm5hbWUpfV91cGRhdGVOb2RlSW5jbHVkZSgpe2NvbnN0IHQ9dGhpcy5yZW5kZXJIaWVyYXJjaHk/dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0Tm9kZUJ5TmFtZSh0aGlzLnNlbGVjdGVkTm9kZSk6bnVsbDt0aGlzLl9zZWxlY3RlZE5vZGVJbmNsdWRlPXQ/dC5pbmNsdWRlOkdHdC5VTlNQRUNJRklFRH1fc2xpbUdyYXBoQ2hhbmdlZCgpe2lmKCF0aGlzLmdyYXBoKXJldHVybjtjb25zdHtNQVhfTk9ERV9DT1VOVDp0LE1BWF9FREdFX0NPVU5UOmV9PXRZdDtPYmplY3Qua2V5cyh0aGlzLmdyYXBoLm5vZGVzKS5sZW5ndGg+dCYmdGhpcy5ncmFwaC5lZGdlcy5sZW5ndGg+ZSYmdGhpcy5jb2xvckJ5PT09YXF0LlNUUlVDVFVSRSYmKHRoaXMuY29sb3JCeT1hcXQuTk9ORSl9X2Vuc3VyZVRlbXBsYXRlcygpe3RoaXMuZ3JhcGhIaWVyYXJjaHkmJnRoaXMuY29sb3JCeT09PWFxdC5TVFJVQ1RVUkUmJih0aGlzLmdyYXBoSGllcmFyY2h5LmdldFRlbXBsYXRlSW5kZXgoKXx8dGhpcy5ncmFwaEhpZXJhcmNoeS51cGRhdGVUZW1wbGF0ZXMoKSl9fTtlWXQudGVtcGxhdGU9X2VgCiAgICA8c3R5bGU+CiAgICAgIDo6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIC9kZWVwLyAuY2xvc2UgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgbGVmdDogMTVweDsKICAgICAgICBib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgIC5jb250YWluZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAuY29udGFpbmVyLmxvYWRpbmcgewogICAgICAgIGN1cnNvcjogcHJvZ3Jlc3M7CiAgICAgICAgb3BhY2l0eTogMC4xOwogICAgICB9CgogICAgICAuY29udGFpbmVyLmxvYWRpbmcuZXJyb3IgewogICAgICAgIGN1cnNvcjogYXV0bzsKICAgICAgfQoKICAgICAgI2luZm8gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogNXB4OwogICAgICAgIHRvcDogNXB4OwogICAgICAgIHBhZGRpbmc6IDBweDsKICAgICAgICBtYXgtd2lkdGg6IDM4MHB4OwogICAgICAgIG1pbi13aWR0aDogMzIwcHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMmRwOwogICAgICB9CgogICAgICAjbWFpbiB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAjcHJvZ3Jlc3MtYmFyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA0MHB4OwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICB9CgogICAgICAjcHJvZ3Jlc3MtbXNnIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgICAgIHdpZHRoOiA0MDBweDsKICAgICAgfQoKICAgICAgcGFwZXItcHJvZ3Jlc3MgewogICAgICAgIHdpZHRoOiA0MDBweDsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWhlaWdodDogNnB4OwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtYWN0aXZlLWNvbG9yOiAjZjM5MTNlOwogICAgICB9CgogICAgICAuY29udGV4dC1tZW51IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWluLXdpZHRoOiAxNTBweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZDRkNGQ0OwogICAgICB9CgogICAgICAvZGVlcC8gLmNvbnRleHQtbWVudSB1bCB7CiAgICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgL2RlZXAvIC5jb250ZXh0LW1lbnUgdWwgbGkgewogICAgICAgIHBhZGRpbmc6IDRweCAxNnB4OwogICAgICB9CgogICAgICAvZGVlcC8gLmNvbnRleHQtbWVudSB1bCBsaTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YzOTEzZTsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzTm90Q29tcGxldGUocHJvZ3Jlc3MpXV0iPgogICAgICA8ZGl2IGlkPSJwcm9ncmVzcy1iYXIiPgogICAgICAgIDxkaXYgaWQ9InByb2dyZXNzLW1zZyI+W1twcm9ncmVzcy5tc2ddXTwvZGl2PgogICAgICAgIDxwYXBlci1wcm9ncmVzcyB2YWx1ZT0iW1twcm9ncmVzcy52YWx1ZV1dIj48L3BhcGVyLXByb2dyZXNzPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzJD0iW1tfZ2V0Q29udGFpbmVyQ2xhc3MocHJvZ3Jlc3MpXV0iPgogICAgICA8ZGl2IGlkPSJtYWluIj4KICAgICAgICA8dGYtZ3JhcGgKICAgICAgICAgIGlkPSJncmFwaCIKICAgICAgICAgIGdyYXBoLWhpZXJhcmNoeT0ie3tncmFwaEhpZXJhcmNoeX19IgogICAgICAgICAgYmFzaWMtZ3JhcGg9IltbZ3JhcGhdXSIKICAgICAgICAgIGhpZXJhcmNoeS1wYXJhbXM9IltbaGllcmFyY2h5UGFyYW1zXV0iCiAgICAgICAgICByZW5kZXItaGllcmFyY2h5PSJ7e3JlbmRlckhpZXJhcmNoeX19IgogICAgICAgICAgZGV2aWNlcy1mb3Itc3RhdHM9IltbZGV2aWNlc0ZvclN0YXRzXV0iCiAgICAgICAgICBzdGF0cz0iW1tzdGF0c11dIgogICAgICAgICAgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIKICAgICAgICAgIGhpZ2hsaWdodGVkLW5vZGU9Int7X2hpZ2hsaWdodGVkTm9kZX19IgogICAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgICAgY29sb3ItYnktcGFyYW1zPSJ7e2NvbG9yQnlQYXJhbXN9fSIKICAgICAgICAgIHByb2dyZXNzPSJ7e3Byb2dyZXNzfX0iCiAgICAgICAgICBlZGdlLWxhYmVsLWZ1bmN0aW9uPSJbW2VkZ2VMYWJlbEZ1bmN0aW9uXV0iCiAgICAgICAgICBlZGdlLXdpZHRoLWZ1bmN0aW9uPSJbW2VkZ2VXaWR0aEZ1bmN0aW9uXV0iCiAgICAgICAgICBub2RlLW5hbWVzLXRvLWhlYWx0aC1waWxscz0iW1tub2RlTmFtZXNUb0hlYWx0aFBpbGxzXV0iCiAgICAgICAgICBoZWFsdGgtcGlsbC1zdGVwLWluZGV4PSJbW2hlYWx0aFBpbGxTdGVwSW5kZXhdXSIKICAgICAgICAgIGhhbmRsZS1ub2RlLXNlbGVjdGVkPSJbW2hhbmRsZU5vZGVTZWxlY3RlZF1dIgogICAgICAgICAgaGFuZGxlLWVkZ2Utc2VsZWN0ZWQ9IltbaGFuZGxlRWRnZVNlbGVjdGVkXV0iCiAgICAgICAgICB0cmFjZS1pbnB1dHM9IltbdHJhY2VJbnB1dHNdXSIKICAgICAgICAgIGF1dG8tZXh0cmFjdC1ub2Rlcz0iW1thdXRvRXh0cmFjdE5vZGVzXV0iCiAgICAgICAgPjwvdGYtZ3JhcGg+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGlkPSJpbmZvIj4KICAgICAgICA8dGYtZ3JhcGgtaW5mbwogICAgICAgICAgaWQ9ImdyYXBoLWluZm8iCiAgICAgICAgICB0aXRsZT0ic2VsZWN0ZWQiCiAgICAgICAgICBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIKICAgICAgICAgIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iCiAgICAgICAgICBncmFwaD0iW1tncmFwaF1dIgogICAgICAgICAgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIKICAgICAgICAgIHNlbGVjdGVkLW5vZGUtaW5jbHVkZT0ie3tfc2VsZWN0ZWROb2RlSW5jbHVkZX19IgogICAgICAgICAgaGlnaGxpZ2h0ZWQtbm9kZT0ie3tfaGlnaGxpZ2h0ZWROb2RlfX0iCiAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgICBjb2xvci1ieS1wYXJhbXM9IltbY29sb3JCeVBhcmFtc11dIgogICAgICAgICAgZGVidWdnZXItZGF0YS1lbmFibGVkPSJbW2RlYnVnZ2VyRGF0YUVuYWJsZWRdXSIKICAgICAgICAgIGFyZS1oZWFsdGgtcGlsbHMtbG9hZGluZz0iW1thcmVIZWFsdGhQaWxsc0xvYWRpbmddXSIKICAgICAgICAgIGRlYnVnZ2VyLW51bWVyaWMtYWxlcnRzPSJbW2RlYnVnZ2VyTnVtZXJpY0FsZXJ0c11dIgogICAgICAgICAgbm9kZS1uYW1lcy10by1oZWFsdGgtcGlsbHM9Iltbbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIgogICAgICAgICAgYWxsLXN0ZXBzLW1vZGUtZW5hYmxlZD0ie3thbGxTdGVwc01vZGVFbmFibGVkfX0iCiAgICAgICAgICBzcGVjaWZpYy1oZWFsdGgtcGlsbC1zdGVwPSJ7e3NwZWNpZmljSGVhbHRoUGlsbFN0ZXB9fSIKICAgICAgICAgIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19IgogICAgICAgICAgY29tcGF0LW5vZGUtdGl0bGU9IltbY29tcGF0Tm9kZVRpdGxlXV0iCiAgICAgICAgICBvbi1ub2RlLXRvZ2dsZS1pbmNsdXNpb249Il9vbk5vZGVJbmNsdXNpb25Ub2dnbGVkIgogICAgICAgICAgb24tbm9kZS10b2dnbGUtc2VyaWVzZ3JvdXA9Il9vbk5vZGVTZXJpZXNHcm91cFRvZ2dsZWQiCiAgICAgICAgPjwvdGYtZ3JhcGgtaW5mbz4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLERxdCldLGVZdC5wcm90b3R5cGUsImdyYXBoSGllcmFyY2h5Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLHFHdCldLGVZdC5wcm90b3R5cGUsImdyYXBoIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGVZdC5wcm90b3R5cGUsImhpZXJhcmNoeVBhcmFtcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxlWXQucHJvdG90eXBlLCJzdGF0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxlWXQucHJvdG90eXBlLCJwcm9ncmVzcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGVZdC5wcm90b3R5cGUsInRyYWNlSW5wdXRzIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sZVl0LnByb3RvdHlwZSwiYXV0b0V4dHJhY3ROb2RlcyIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sZVl0LnByb3RvdHlwZSwiY29sb3JCeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sZVl0LnByb3RvdHlwZSwiY29sb3JCeVBhcmFtcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIseVd0KV0sZVl0LnByb3RvdHlwZSwicmVuZGVySGllcmFyY2h5Iix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sZVl0LnByb3RvdHlwZSwiZGVidWdnZXJEYXRhRW5hYmxlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGVZdC5wcm90b3R5cGUsImFyZUhlYWx0aFBpbGxzTG9hZGluZyIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLGVZdC5wcm90b3R5cGUsImRlYnVnZ2VyTnVtZXJpY0FsZXJ0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxlWXQucHJvdG90eXBlLCJub2RlTmFtZXNUb0hlYWx0aFBpbGxzIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGVZdC5wcm90b3R5cGUsImFsbFN0ZXBzTW9kZUVuYWJsZWQiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLGVZdC5wcm90b3R5cGUsInNwZWNpZmljSGVhbHRoUGlsbFN0ZXAiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sZVl0LnByb3RvdHlwZSwiaGVhbHRoUGlsbFN0ZXBJbmRleCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sZVl0LnByb3RvdHlwZSwic2VsZWN0ZWROb2RlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGVZdC5wcm90b3R5cGUsImNvbXBhdE5vZGVUaXRsZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxlWXQucHJvdG90eXBlLCJlZGdlV2lkdGhGdW5jdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxlWXQucHJvdG90eXBlLCJfc2VsZWN0ZWROb2RlSW5jbHVkZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxlWXQucHJvdG90eXBlLCJfaGlnaGxpZ2h0ZWROb2RlIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGVZdC5wcm90b3R5cGUsImhhbmRsZU5vZGVTZWxlY3RlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxlWXQucHJvdG90eXBlLCJlZGdlTGFiZWxGdW5jdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxlWXQucHJvdG90eXBlLCJoYW5kbGVFZGdlU2VsZWN0ZWQiLHZvaWQgMCksdChbYSgic2VsZWN0ZWROb2RlIiwicmVuZGVySGllcmFyY2h5IiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxlWXQucHJvdG90eXBlLCJfdXBkYXRlTm9kZUluY2x1ZGUiLG51bGwpLHQoW2EoImdyYXBoIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxlWXQucHJvdG90eXBlLCJfc2xpbUdyYXBoQ2hhbmdlZCIsbnVsbCksdChbYSgiY29sb3JCeSIsImdyYXBoSGllcmFyY2h5IiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxlWXQucHJvdG90eXBlLCJfZW5zdXJlVGVtcGxhdGVzIixudWxsKSxlWXQ9dChbaSgidGYtZ3JhcGgtYm9hcmQiKV0sZVl0KTtsZXQgbll0PWNsYXNzIGV4dGVuZHMoZXIoeWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fcmF3UmVnZXhJbnB1dD0iIix0aGlzLl9wcmV2aW91c1JlZ2V4SW5wdXQ9IiIsdGhpcy5fc2VhcmNoVGltZW91dERlbGF5PTE1MCx0aGlzLl9tYXhSZWdleFJlc3VsdHM9NDJ9Z2V0IF9yZWdleElucHV0KCl7cmV0dXJuIHRoaXMuX3Jhd1JlZ2V4SW5wdXQudHJpbSgpfV9yZWdleElucHV0Q2hhbmdlZCgpe3RoaXMuX3JlcXVlc3RTZWFyY2goKX1fY2xlYXJTZWFyY2hSZXN1bHRzKCl7dGhpcy5zZXQoIl9yZWdleE1hdGNoZXMiLFtdKX1fcmVxdWVzdFNlYXJjaCgpe3RoaXMuX3NlYXJjaFBlbmRpbmd8fCh0aGlzLl9yZWdleElucHV0IT09dGhpcy5fcHJldmlvdXNSZWdleElucHV0Pyh0aGlzLl9zZWFyY2hQZW5kaW5nPSEwLHRoaXMuX2V4ZWN1dGVTZWFyY2goKSx0aGlzLmFzeW5jKCgoKT0+e3RoaXMuX3NlYXJjaFBlbmRpbmc9ITEsdGhpcy5fcmVxdWVzdFNlYXJjaCgpfSksdGhpcy5fc2VhcmNoVGltZW91dERlbGF5KSk6dGhpcy5fc2VhcmNoUGVuZGluZz0hMSl9X2V4ZWN1dGVTZWFyY2goKXtpZih0aGlzLl9wcmV2aW91c1JlZ2V4SW5wdXQ9dGhpcy5fcmVnZXhJbnB1dCwhdGhpcy5fcmVnZXhJbnB1dClyZXR1cm4gdm9pZCB0aGlzLl9jbGVhclNlYXJjaFJlc3VsdHMoKTt0cnl7dmFyIHQ9bmV3IFJlZ0V4cCh0aGlzLl9yZWdleElucHV0KX1jYXRjaCh0KXtyZXR1cm4gdm9pZCB0aGlzLl9jbGVhclNlYXJjaFJlc3VsdHMoKX1jb25zdCBlPVtdLG49dGhpcy5yZW5kZXJIaWVyYXJjaHkuaGllcmFyY2h5LmdldE5vZGVNYXAoKTtTZS5leHBvcnRzLmVhY2gobiwoKG4saSk9PntpZihlLmxlbmd0aD49dGhpcy5fbWF4UmVnZXhSZXN1bHRzKXJldHVybiExO3QudGVzdChpKSYmZS5wdXNoKGkpfSkpLHRoaXMuc2V0KCJfcmVnZXhNYXRjaGVzIixlKX1fbWF0Y2hDbGlja2VkKHQpe3RoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLHQubW9kZWwuaXRlbSksVEd0KHthY3Rpb25JZDpfR3QuTk9ERV9TRUFSQ0hfUkVTVUxUX0ZPQ1VTRUR9KX19O25ZdC50ZW1wbGF0ZT1fZWAKICAgIDxkaXYgaWQ9InNlYXJjaC1jb250YWluZXIiPgogICAgICA8cGFwZXItaW5wdXQKICAgICAgICBpZD0icnVucy1yZWdleCIKICAgICAgICBsYWJlbD0iU2VhcmNoIG5vZGVzIChyZWdleCkiCiAgICAgICAgdmFsdWU9Int7X3Jhd1JlZ2V4SW5wdXR9fSIKICAgICAgPgogICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8ZGl2IGlkPSJzZWFyY2gtcmVzdWx0cy1hbmNob3IiPgogICAgICAgIDxkaXYgaWQ9InNlYXJjaC1yZXN1bHRzIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3JlZ2V4TWF0Y2hlc11dIj4KICAgICAgICAgICAgPGRpdiBpZD0ic2VhcmNoLW1hdGNoIiBvbi1jbGljaz0iX21hdGNoQ2xpY2tlZCI+W1tpdGVtXV08L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgICNzZWFyY2gtY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgI3J1bnMtcmVnZXggewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjc2VhcmNoLXJlc3VsdHMtYW5jaG9yIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgICNzZWFyY2gtcmVzdWx0cyB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CgogICAgICAjc2VhcmNoLW1hdGNoIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlyZWN0aW9uOiBydGw7CiAgICAgIH0KCiAgICAgICNzZWFyY2gtbWF0Y2g6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLW9yYW5nZS13ZWFrKTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxuWXQucHJvdG90eXBlLCJyZW5kZXJIaWVyYXJjaHkiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLG5ZdC5wcm90b3R5cGUsInNlbGVjdGVkTm9kZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxuWXQucHJvdG90eXBlLCJfcmF3UmVnZXhJbnB1dCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxuWXQucHJvdG90eXBlLCJfcHJldmlvdXNSZWdleElucHV0Iix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLG5ZdC5wcm90b3R5cGUsIl9zZWFyY2hUaW1lb3V0RGVsYXkiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxuWXQucHJvdG90eXBlLCJfc2VhcmNoUGVuZGluZyIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxuWXQucHJvdG90eXBlLCJfbWF4UmVnZXhSZXN1bHRzIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxuWXQucHJvdG90eXBlLCJfcmVnZXhNYXRjaGVzIix2b2lkIDApLHQoW3MoInJlbmRlckhpZXJhcmNoeSIsIl9yYXdSZWdleElucHV0IiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sbll0LnByb3RvdHlwZSwiX3JlZ2V4SW5wdXQiLG51bGwpLHQoW2EoIl9yZWdleElucHV0IiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxuWXQucHJvdG90eXBlLCJfcmVnZXhJbnB1dENoYW5nZWQiLG51bGwpLG5ZdD10KFtpKCJ0Zi1ncmFwaC1ub2RlLXNlYXJjaCIpXSxuWXQpO2NvbnN0IGlZdD0vZGV2aWNlOihbXjpdKzpbMC05XSspJC8scll0PVt7cmVnZXg6aVl0fV0sb1l0PVtdLGFZdD1uZXcgU2V0KFthcXQuQ09NUFVURV9USU1FLGFxdC5NRU1PUlldKTtsZXQgc1l0PWNsYXNzIGV4dGVuZHMoZXIoaWwoeWUpKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuQ29sb3JCeT1hcXQsdGhpcy5zdGF0cz1udWxsLHRoaXMuZGV2aWNlc0ZvclN0YXRzPW51bGwsdGhpcy5jb2xvckJ5PWFxdC5TVFJVQ1RVUkUsdGhpcy5kYXRhc2V0cz1bXSx0aGlzLl9zZWxlY3RlZFJ1bkluZGV4PTAsdGhpcy50cmFjZUlucHV0cz0hMSx0aGlzLmF1dG9FeHRyYWN0Tm9kZXM9ITAsdGhpcy5fc2VsZWN0ZWRUYWdJbmRleD0wLHRoaXMuX3NlbGVjdGVkR3JhcGhUeXBlPXlHdC5PUF9HUkFQSCx0aGlzLnNob3dTZXNzaW9uUnVuc0Ryb3Bkb3duPSEwLHRoaXMuc2hvd1VwbG9hZEJ1dHRvbj0hMCx0aGlzLl9sZWdlbmRPcGVuZWQ9ITAsdGhpcy5fZG93bmxvYWRGaWxlbmFtZT0iZ3JhcGgucG5nIn1fb25HcmFwaFR5cGVDaGFuZ2VkQnlVc2VyR2VzdHVyZSgpe1RHdCh7YWN0aW9uSWQ6X0d0LkdSQVBIX1RZUEVfQ0hBTkdFRCxldmVudExhYmVsOnRoaXMuX3NlbGVjdGVkR3JhcGhUeXBlfSl9X29uQ29sb3JCeUNoYW5nZWRCeVVzZXJHZXN0dXJlKCl7VEd0KHthY3Rpb25JZDpfR3QuTk9ERV9DT0xPUl9NT0RFX0NIQU5HRUQsZXZlbnRMYWJlbDp0aGlzLmNvbG9yQnl9KX1fb25UcmFjZUlucHV0c0NoYW5nZWRCeVVzZXJHZXN0dXJlKCl7VEd0KHthY3Rpb25JZDpfR3QuVFJBQ0VfSU5QVVRfTU9ERV9UT0dHTEVEfSl9X3hsYUNsdXN0ZXJzUHJvdmlkZWQodCl7cmV0dXJuIHQmJnQuaGllcmFyY2h5JiZ0LmhpZXJhcmNoeS54bGFDbHVzdGVycy5sZW5ndGg+MH1fc3RhdHNDaGFuZ2VkKHQpe2lmKG51bGwhPXQpe3ZhciBlPXt9O1NlLmV4cG9ydHMuZWFjaCh0LmRldl9zdGF0cywoZnVuY3Rpb24odCl7dmFyIG49U2UuZXhwb3J0cy5zb21lKHJZdCwoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVnZXgudGVzdCh0LmRldmljZSl9KSksaT1TZS5leHBvcnRzLnNvbWUob1l0LChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZWdleC50ZXN0KHQuZGV2aWNlKX0pKTtuJiYhaSYmKGVbdC5kZXZpY2VdPSEwKX0pKSx0aGlzLnNldCgiZGV2aWNlc0ZvclN0YXRzIixlKX19Z2V0IF9jdXJyZW50RGV2aWNlcygpe3ZhciB0PXRoaXMuZGV2aWNlc0ZvclN0YXRzO2NvbnN0IGU9dGhpcy5zdGF0cyxuPShlP2UuZGV2X3N0YXRzOltdKS5tYXAoKHQ9PnQuZGV2aWNlKSkuZmlsdGVyKCh0PT5yWXQuc29tZSgoZT0+ZS5yZWdleC50ZXN0KHQpKSkpKSxpPXpHdChuKTtpZigxPT1pLmxlbmd0aCl7Y29uc3QgdD1pWzBdLm1hdGNoKGlZdCk7dCYmKGlbMF09dFsxXSl9cmV0dXJuIG4ubWFwKCgoZSxuKT0+e2xldCByPW51bGw7cmV0dXJuIG9ZdC5mb3JFYWNoKCh0PT57dC5yZWdleC50ZXN0KGUpJiYocj10Lm1zZyl9KSkse2RldmljZTplLHN1ZmZpeDppW25dLHVzZWQ6dFtlXSxpZ25vcmVkTXNnOnJ9fSkpfV9kZXZpY2VDaGVja2JveENsaWNrZWQodCl7Y29uc3QgZT10LnRhcmdldCxuPU9iamVjdC5hc3NpZ24oe30sdGhpcy5kZXZpY2VzRm9yU3RhdHMpLGk9ZS52YWx1ZTtlLmNoZWNrZWQ/bltpXT0hMDpkZWxldGUgbltpXSx0aGlzLnNldCgiZGV2aWNlc0ZvclN0YXRzIixuKX1fbnVtVGFncyh0LGUpe3JldHVybiB0aGlzLl9nZXRUYWdzKHQsZSkubGVuZ3RofV9nZXRUYWdzKHQsZSl7cmV0dXJuIHQmJnRbZV0/dFtlXS50YWdzOltdfV9maXQoKXt0aGlzLmZpcmUoImZpdC10YXAiKX1faXNHcmFkaWVudENvbG9yaW5nKHQsZSl7cmV0dXJuIGFZdC5oYXMoZSkmJm51bGwhPXR9X2VxdWFscyh0LGUpe3JldHVybiB0PT09ZX1nZXQgX2N1cnJlbnREZXZpY2VQYXJhbXMoKXtjb25zdCB0PXRoaXMuY29sb3JCeVBhcmFtcy5kZXZpY2UuZmlsdGVyKCh0PT5yWXQuc29tZSgoZT0+ZS5yZWdleC50ZXN0KHQuZGV2aWNlKSkpKSksZT16R3QodC5tYXAoKHQ9PnQuZGV2aWNlKSkpO2lmKDE9PWUubGVuZ3RoKXt2YXIgbj1lWzBdLm1hdGNoKGlZdCk7biYmKGVbMF09blsxXSl9cmV0dXJuIHQubWFwKCgodCxuKT0+KHtkZXZpY2U6ZVtuXSxjb2xvcjp0LmNvbG9yfSkpKX1nZXQgX2N1cnJlbnRYbGFDbHVzdGVyUGFyYW1zKCl7cmV0dXJuIHRoaXMuY29sb3JCeVBhcmFtcy54bGFfY2x1c3Rlcn1nZXQgX2N1cnJlbnRHcmFkaWVudFBhcmFtcygpe3ZhciB0PXRoaXMuY29sb3JCeVBhcmFtcyxlPXRoaXMuY29sb3JCeTtpZighdGhpcy5faXNHcmFkaWVudENvbG9yaW5nKHRoaXMuc3RhdHMsZSkpcmV0dXJuO2NvbnN0IG49dFtlXTtsZXQgaT1uLm1pblZhbHVlLHI9bi5tYXhWYWx1ZTtyZXR1cm4gZT09PWFxdC5NRU1PUlk/KGk9Ukd0KGksTkd0KSxyPVJHdChyLE5HdCkpOmU9PT1hcXQuQ09NUFVURV9USU1FJiYoaT1SR3QoaSxJR3QpLHI9Ukd0KHIsSUd0KSkse21pblZhbHVlOmksbWF4VmFsdWU6cixzdGFydENvbG9yOm4uc3RhcnRDb2xvcixlbmRDb2xvcjpuLmVuZENvbG9yfX1kb3dubG9hZCgpe3RoaXMuZmlyZSgiZG93bmxvYWQtaW1hZ2UtcmVxdWVzdGVkIix0aGlzLl9kb3dubG9hZEZpbGVuYW1lKX1fdXBkYXRlRmlsZUlucHV0KHQpe2NvbnN0IGU9dC50YXJnZXQuZmlsZXNbMF07aWYoIWUpcmV0dXJuO2xldCBuPWUubmFtZTtjb25zdCBpPW4ubGFzdEluZGV4T2YoIi4iKTtpPj0wJiYobj1uLnN1YnN0cmluZygwLGkpKTtjb25zdCByPW4ubGFzdEluZGV4T2YoIi8iKTtyPj0wJiYobj1uLnN1YnN0cmluZyhyKzEpKSx0aGlzLl9zZXREb3dubG9hZEZpbGVuYW1lKG4pLHRoaXMuc2V0KCJzZWxlY3RlZEZpbGUiLHQpLFRHdCh7YWN0aW9uSWQ6X0d0LlVQTE9BREVEX0dSQVBIX0ZST01fRklMRVNZU1RFTX0pfV9kYXRhc2V0c0NoYW5nZWQodCxlKXt2YXIgbjtudWxsIT1lJiYodGhpcy5fc2VsZWN0ZWRSdW5JbmRleD0wKSx0aGlzLl9zZXREb3dubG9hZEZpbGVuYW1lKG51bGw9PT0obj10aGlzLmRhdGFzZXRzW3RoaXMuX3NlbGVjdGVkUnVuSW5kZXhdKXx8dm9pZCAwPT09bj92b2lkIDA6bi5uYW1lKX1fY29tcHV0ZVNlbGVjdGlvbih0LGUsbixpKXtyZXR1cm4gdFtlXSYmdFtlXS50YWdzW25dP3tydW46dFtlXS5uYW1lLHRhZzp0W2VdLnRhZ3Nbbl0udGFnLHR5cGU6aX06bnVsbH1fc2VsZWN0ZWRSdW5JbmRleENoYW5nZWQodCl7dmFyIGU7dGhpcy5kYXRhc2V0cyYmKHRoaXMuY29sb3JCeT1hcXQuU1RSVUNUVVJFLHRoaXMuX3NlbGVjdGVkVGFnSW5kZXg9MCx0aGlzLl9zZWxlY3RlZEdyYXBoVHlwZT10aGlzLl9nZXREZWZhdWx0U2VsZWN0aW9uVHlwZSgpLHRoaXMudHJhY2VJbnB1dHM9ITEsdGhpcy5fc2V0RG93bmxvYWRGaWxlbmFtZShudWxsPT09KGU9dGhpcy5kYXRhc2V0c1t0XSl8fHZvaWQgMD09PWU/dm9pZCAwOmUubmFtZSkpfV9zZWxlY3RlZFRhZ0luZGV4Q2hhbmdlZCgpe3RoaXMuX3NlbGVjdGVkR3JhcGhUeXBlPXRoaXMuX2dldERlZmF1bHRTZWxlY3Rpb25UeXBlKCl9X2dldERlZmF1bHRTZWxlY3Rpb25UeXBlKCl7Y29uc3R7ZGF0YXNldHM6dCxfc2VsZWN0ZWRSdW5JbmRleDplLF9zZWxlY3RlZFRhZ0luZGV4Om59PXRoaXM7aWYoIXR8fCF0W2VdfHwhdFtlXS50YWdzW25dfHx0W2VdLnRhZ3Nbbl0ub3BHcmFwaClyZXR1cm4geUd0Lk9QX0dSQVBIO2NvbnN0IGk9dFtlXTtyZXR1cm4gaS50YWdzW25dLnByb2ZpbGU/eUd0LlBST0ZJTEU6aS50YWdzW25dLmNvbmNlcHR1YWxHcmFwaD95R3QuQ09OQ0VQVFVBTF9HUkFQSDp5R3QuT1BfR1JBUEh9X2dldEZpbGUoKXt0aGlzLiQkKCIjZmlsZSIpLmNsaWNrKCl9X3NldERvd25sb2FkRmlsZW5hbWUodCl7dGhpcy5fZG93bmxvYWRGaWxlbmFtZT0odHx8ImdyYXBoIikrIi5wbmcifV9zdGF0c05vdE51bGwodCl7cmV0dXJuIG51bGwhPT10fV90b2dnbGVMZWdlbmRPcGVuKCl7dGhpcy5zZXQoIl9sZWdlbmRPcGVuZWQiLCF0aGlzLl9sZWdlbmRPcGVuZWQpfV9nZXRUb2dnbGVMZWdlbmRJY29uKHQpe3JldHVybiB0PyJleHBhbmQtbW9yZSI6ImV4cGFuZC1sZXNzIn1fZ2V0U2VsZWN0aW9uT3BHcmFwaERpc2FibGVkKHQsZSxuKXtyZXR1cm4hdFtlXXx8IXRbZV0udGFnc1tuXXx8IXRbZV0udGFnc1tuXS5vcEdyYXBofV9nZXRTZWxlY3Rpb25Qcm9maWxlRGlzYWJsZWQodCxlLG4pe3JldHVybiF0W2VdfHwhdFtlXS50YWdzW25dfHwhdFtlXS50YWdzW25dLnByb2ZpbGV9X2dldFNlbGVjdGlvbkNvbmNlcHR1YWxHcmFwaERpc2FibGVkKHQsZSxuKXtyZXR1cm4hdFtlXXx8IXRbZV0udGFnc1tuXXx8IXRbZV0udGFnc1tuXS5jb25jZXB0dWFsR3JhcGh9fTtzWXQudGVtcGxhdGU9X2VgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBjb2xvcjogIzU1NTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIC0tdGItZ3JhcGgtY29udHJvbHMtdGl0bGUtY29sb3I6ICMwMDA7CiAgICAgICAgLS10Yi1ncmFwaC1jb250cm9scy1sZWdlbmQtdGV4dC1jb2xvcjogIzAwMDsKICAgICAgICAtLXRiLWdyYXBoLWNvbnRyb2xzLXRleHQtY29sb3I6ICM1NTU7CiAgICAgICAgLS10Yi1ncmFwaC1jb250cm9scy10aXRsZS1mb250LXNpemU6IDE0cHg7CiAgICAgICAgLS10Yi1ncmFwaC1jb250cm9scy1zdWJ0aXRsZS1mb250LXNpemU6IDE0cHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItc2hhcmVkLWlucHV0LXN0eWxlXy1fZm9udC1zaXplOiAxNHB4OwogICAgICAgIC0tcGFwZXItZm9udC1zdWJoZWFkXy1fZm9udC1zaXplOiAxNHB4OwogICAgICB9CgogICAgICA6aG9zdCguZGFyay1tb2RlKSB7CiAgICAgICAgLS10Yi1ncmFwaC1jb250cm9scy10aXRsZS1jb2xvcjogI2ZmZjsKICAgICAgICAtLXRiLWdyYXBoLWNvbnRyb2xzLWxlZ2VuZC10ZXh0LWNvbG9yOiAjZjNmM2YzOwogICAgICAgIC0tdGItZ3JhcGgtY29udHJvbHMtdGV4dC1jb2xvcjogI2VlZTsKICAgICAgfQoKICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgLS1wYXBlci1kcm9wZG93bi1tZW51LWlucHV0OiB7CiAgICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgICAgfQogICAgICAgIC0taXJvbi1pY29uLXdpZHRoOiAxNXB4OwogICAgICAgIC0taXJvbi1pY29uLWhlaWdodDogMTVweDsKICAgICAgICAtLXByaW1hcnktdGV4dC1jb2xvcjogZ3JheTsKICAgICAgICAtLXBhcGVyLWl0ZW0tbWluLWhlaWdodDogMzBweDsKICAgICAgfQoKICAgICAgcGFwZXItYnV0dG9uW3JhaXNlZF0ua2V5Ym9hcmQtZm9jdXMgewogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC5ydW4tZHJvcGRvd24gewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyOiB7CiAgICAgICAgICBwYWRkaW5nOiA1cHggMCA1cHggNXB4OwogICAgICAgIH0KICAgICAgfQoKICAgICAgdGFibGUgewogICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICAgICAgYm9yZGVyLXNwYWNpbmc6IDA7CiAgICAgIH0KCiAgICAgIHRhYmxlIHRyIHsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgIH0KCiAgICAgIHRhYmxlIHRkIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQoKICAgICAgLmFsbGNvbnRyb2xzIHsKICAgICAgICBwYWRkaW5nOiAwIDIwcHggMjBweDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgLmxlZ2VuZC1ob2xkZXIgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXNlY29uZGFyeS1iYWNrZ3JvdW5kLWNvbG9yKTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1ncmFwaC1jb250cm9scy10ZXh0LWNvbG9yKTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLmxlZ2VuZC10b29sYmFyIHsKICAgICAgICBhcHBlYXJhbmNlOiBub25lOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjY2M7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNjY2M7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiBub25lOwogICAgICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBjb2xvcjogdmFyKC0tdGItZ3JhcGgtY29udHJvbHMtbGVnZW5kLXRleHQtY29sb3IpOwogICAgICAgIGZvbnQ6IGluaGVyaXQ7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLmxlZ2VuZC10b29sYmFyLAogICAgICAubGVnZW5kLWNvbnRlbnQgewogICAgICAgIHBhZGRpbmc6IDhweCAyMHB4OwogICAgICB9CgogICAgICAudG9nZ2xlLWxlZ2VuZC1idXR0b24gewogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtbGVnZW5kLXRleHQgewogICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tdGItZ3JhcGgtY29udHJvbHMtc3VidGl0bGUtZm9udC1zaXplKTsKICAgICAgfQoKICAgICAgcGFwZXItcmFkaW8tYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiA1cHg7CiAgICAgIH0KICAgICAgc3ZnLmljb24sCiAgICAgIHRmLWdyYXBoLWljb24gewogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICAgIGhlaWdodDogMThweDsKICAgICAgfQogICAgICAuZG9tYWluVmFsdWVzIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICAgIHdpZHRoOiAxNjVweDsKICAgICAgfQogICAgICAuZG9tYWluU3RhcnQgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICB9CiAgICAgIC5kb21haW5FbmQgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQogICAgICAuY29sb3JCb3ggewogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICB9CgogICAgICAuaW1hZ2UtaWNvbiB7CiAgICAgICAgd2lkdGg6IDI0cHg7CiAgICAgICAgaGVpZ2h0OiAyNHB4OwogICAgICB9CgogICAgICAuaGVscC1pY29uIHsKICAgICAgICBoZWlnaHQ6IDE1cHg7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5ncmF5IHsKICAgICAgICBjb2xvcjogIzY2NjsKICAgICAgfQoKICAgICAgLnRpdGxlIHsKICAgICAgICBmb250LXNpemU6IHZhcigtLXRiLWdyYXBoLWNvbnRyb2xzLXRpdGxlLWZvbnQtc2l6ZSk7CiAgICAgICAgbWFyZ2luOiA4cHggNXB4IDhweCAwOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1ncmFwaC1jb250cm9scy10aXRsZS1jb2xvcik7CiAgICAgIH0KICAgICAgLnRpdGxlIHNtYWxsIHsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIC5kZXZpY2VMaXN0LAogICAgICAueGxhQ2x1c3Rlckxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgICNmaWxlIHsKICAgICAgICBwYWRkaW5nOiA4cHggMDsKICAgICAgfQoKICAgICAgLmNvbG9yLWxlZ2VuZC1yb3cgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgY2xlYXI6IGJvdGg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICB9CgogICAgICAuY29sb3ItbGVnZW5kLXJvdyAubGFiZWwsCiAgICAgIC5jb2xvci1sZWdlbmQtcm93IHN2ZywKICAgICAgLmNvbG9yLWxlZ2VuZC1yb3cgdGYtZ3JhcGgtaWNvbiB7CiAgICAgICAgZmxleDogMCAwIDQwcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyMHB4OwogICAgICB9CgogICAgICAuZGV2aWNlcy1jaGVja2JveCBpbnB1dCB7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CgogICAgICAuY29udHJvbC1ob2xkZXIgLmljb24tYnV0dG9uIHsKICAgICAgICBmb250LXNpemU6IHZhcigtLXRiLWdyYXBoLWNvbnRyb2xzLXN1YnRpdGxlLWZvbnQtc2l6ZSk7CiAgICAgICAgbWFyZ2luOiAwIC01cHg7CiAgICAgICAgcGFkZGluZzogNXB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1ncmFwaC1jb250cm9scy10ZXh0LWNvbG9yKTsKICAgICAgfQoKICAgICAgLmJ1dHRvbi10ZXh0IHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgIH0KCiAgICAgIC51cGxvYWQtYnV0dG9uIHsKICAgICAgICB3aWR0aDogMTY1cHg7CiAgICAgICAgaGVpZ2h0OiAyNXB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICAgIG1hcmdpbi10b3A6IDRweDsKICAgICAgfQoKICAgICAgLmJ1dHRvbi1pY29uIHsKICAgICAgICB3aWR0aDogMjZweDsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS01MDApOwogICAgICB9CgogICAgICAuaGlkZGVuLWlucHV0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAuYWxsY29udHJvbHMgLmNvbnRyb2wtaG9sZGVyIHsKICAgICAgICBjbGVhcjogYm90aDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQoKICAgICAgLmFsbGNvbnRyb2xzIC5jb250cm9sLWhvbGRlci5jb250cm9sLW9wdGlvbnMgewogICAgICAgIHBhZGRpbmc6IDAgMCAxNXB4IDE1cHg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgLmFsbGNvbnRyb2xzIC5jb250cm9sLWhvbGRlciBwYXBlci10b2dnbGUtYnV0dG9uIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KCiAgICAgIHNwYW4uY291bnRlciB7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS10Yi1ncmFwaC1jb250cm9scy1zdWJ0aXRsZS1mb250LXNpemUpOwogICAgICAgIGNvbG9yOiBncmF5OwogICAgICAgIG1hcmdpbi1sZWZ0OiA0cHg7CiAgICAgIH0KCiAgICAgIC5ydW5zLXJvdyAudGl0bGUsCiAgICAgIC50YWdzLXJvdyAudGl0bGUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICB9CgogICAgICAucnVucy1yb3cgcGFwZXItaXRlbSwKICAgICAgLnRhZ3Mtcm93IHBhcGVyLWl0ZW0gewogICAgICAgIC0tcGFwZXItaXRlbTogewogICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRhYmxlLmNvbnRyb2wtaG9sZGVyIHsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgICAgfQoKICAgICAgdGFibGUudGYtZ3JhcGgtY29udHJvbHMgdGQuaW5wdXQtZWxlbWVudC10YWJsZS1kYXRhIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAyMHB4OwogICAgICB9CgogICAgICAuc3BhY2VyIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KCiAgICAgIC5jb2xvci10ZXh0IHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAuY29sb3ItdGV4dC5ncmFkaWVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogMCA1cHg7CiAgICAgIH0KCiAgICAgIC8qKiBPdmVycmlkZSBpbmxpbmUgc3R5bGVzIHRoYXQgc3VwcHJlc3MgcG9pbnRlciBldmVudHMgZm9yIGRpc2FibGVkIGJ1dHRvbnMuIE90aGVyd2lzZSwgdGhlICovCiAgICAgIC8qICB0b29sdGlwcyBkbyBub3QgYXBwZWFyLiAqLwogICAgICBwYXBlci1yYWRpby1ncm91cCBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5sZWdlbmQtY2xhcmlmaWVyIHsKICAgICAgICBjb2xvcjogIzI2NjIzNjsKICAgICAgICBjdXJzb3I6IGhlbHA7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICB9CgogICAgICAubGVnZW5kLWNsYXJpZmllciBwYXBlci10b29sdGlwIHsKICAgICAgICB3aWR0aDogMTUwcHg7CiAgICAgIH0KCiAgICAgIC8qKiBPdGhlcndpc2UsIHBvbHltZXIgVUkgY29udHJvbHMgYXBwZWFyIGF0b3Agbm9kZSBzZWFyY2guICovCiAgICAgIHRmLWdyYXBoLW5vZGUtc2VhcmNoIHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iYWxsY29udHJvbHMiPgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgPHRmLWdyYXBoLW5vZGUtc2VhcmNoCiAgICAgICAgICBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IgogICAgICAgICAgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIKICAgICAgICA+PC90Zi1ncmFwaC1ub2RlLXNlYXJjaD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJpY29uLWJ1dHRvbiIgb24tdGFwPSJfZml0IiBhbHQ9IkZpdCB0byBzY3JlZW4iPgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJhc3BlY3QtcmF0aW8iIGNsYXNzPSJidXR0b24taWNvbiI+PC9pcm9uLWljb24+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iYnV0dG9uLXRleHQiPkZpdCB0byBzY3JlZW48L3NwYW4+CiAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgPHBhcGVyLWJ1dHRvbgogICAgICAgICAgY2xhc3M9Imljb24tYnV0dG9uIgogICAgICAgICAgb24tY2xpY2s9ImRvd25sb2FkIgogICAgICAgICAgYWx0PSJEb3dubG9hZCBQTkciCiAgICAgICAgPgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJmaWxlLWRvd25sb2FkIiBjbGFzcz0iYnV0dG9uLWljb24iPjwvaXJvbi1pY29uPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImJ1dHRvbi10ZXh0Ij5Eb3dubG9hZCBQTkc8L3NwYW4+CiAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd1VwbG9hZEJ1dHRvbl1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICAgIGNsYXNzPSJpY29uLWJ1dHRvbiIKICAgICAgICAgICAgb24tY2xpY2s9Il9nZXRGaWxlIgogICAgICAgICAgICBhbHQ9IlVwbG9hZCBmaWxlIgogICAgICAgICAgICB0aXRsZT0iVXBsb2FkIGEgcGJ0eHQgZmlsZSB0byB2aWV3IGEgZ3JhcGggZnJvbSB0aGUgbG9jYWwgZmlsZXN5c3RlbSIKICAgICAgICAgID4KICAgICAgICAgICAgPGlyb24taWNvbiBpY29uPSJmaWxlLXVwbG9hZCIgY2xhc3M9ImJ1dHRvbi1pY29uIj48L2lyb24taWNvbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJ1dHRvbi10ZXh0Ij5VcGxvYWQgZmlsZTwvc3Bhbj4KICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgoKICAgICAgICAgIDxkaXYgY2xhc3M9ImhpZGRlbi1pbnB1dCI+CiAgICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICAgIHR5cGU9ImZpbGUiCiAgICAgICAgICAgICAgaWQ9ImZpbGUiCiAgICAgICAgICAgICAgbmFtZT0iZmlsZSIKICAgICAgICAgICAgICBvbi1jaGFuZ2U9Il91cGRhdGVGaWxlSW5wdXQiCiAgICAgICAgICAgICAgYWNjZXB0PSIucGJ0eHQiCiAgICAgICAgICAgIC8+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIgcnVucy1yb3ciPgogICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICAgIFJ1biA8c3BhbiBjbGFzcz0iY291bnRlciI+KFtbZGF0YXNldHMubGVuZ3RoXV0pPC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51CiAgICAgICAgICBuby1sYWJlbC1mbG9hdAogICAgICAgICAgbm8tYW5pbWF0aW9ucwogICAgICAgICAgbm9pbmsKICAgICAgICAgIGhvcml6b250YWwtYWxpZ249ImxlZnQiCiAgICAgICAgICBjbGFzcz0icnVuLWRyb3Bkb3duIgogICAgICAgID4KICAgICAgICAgIDxwYXBlci1saXN0Ym94CiAgICAgICAgICAgIGNsYXNzPSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgICBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRSdW5JbmRleH19IgogICAgICAgICAgICBzbG90PSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2RhdGFzZXRzXV0iPgogICAgICAgICAgICAgIDxwYXBlci1pdGVtPltbaXRlbS5uYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dTZXNzaW9uUnVuc0Ryb3Bkb3duXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIHRhZ3Mtcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICAgICAgVGFnCiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb3VudGVyIgogICAgICAgICAgICAgID4oW1tfbnVtVGFncyhkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgpXV0pPC9zcGFuCiAgICAgICAgICAgID4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUKICAgICAgICAgICAgbm8tbGFiZWwtZmxvYXQKICAgICAgICAgICAgbm8tYW5pbWF0aW9ucwogICAgICAgICAgICBob3Jpem9udGFsLWFsaWduPSJsZWZ0IgogICAgICAgICAgICBub2luawogICAgICAgICAgICBjbGFzcz0icnVuLWRyb3Bkb3duIgogICAgICAgICAgPgogICAgICAgICAgICA8cGFwZXItbGlzdGJveAogICAgICAgICAgICAgIGNsYXNzPSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgICAgIHNlbGVjdGVkPSJ7e19zZWxlY3RlZFRhZ0luZGV4fX0iCiAgICAgICAgICAgICAgc2xvdD0iZHJvcGRvd24tY29udGVudCIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgICAgICAgICBpdGVtcz0iW1tfZ2V0VGFncyhkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgpXV0iCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+W1tpdGVtLmRpc3BsYXlOYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+R3JhcGggdHlwZTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciBjb250cm9sLW9wdGlvbnMiPgogICAgICAgIDxwYXBlci1yYWRpby1ncm91cAogICAgICAgICAgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkR3JhcGhUeXBlfX0iCiAgICAgICAgICBvbi1wYXBlci1yYWRpby1ncm91cC1jaGFuZ2VkPSJfb25HcmFwaFR5cGVDaGFuZ2VkQnlVc2VyR2VzdHVyZSIKICAgICAgICA+CiAgICAgICAgICA8IS0tIE5vdGUgdGhhdCB0aGUgbmFtZSBoYXMgdG8gbWF0Y2ggdGhhdCBvZiB0Zl9ncmFwaF9jb21tb24uU2VsZWN0aW9uVHlwZS4gLS0+CiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uCiAgICAgICAgICAgIG5hbWU9Im9wX2dyYXBoIgogICAgICAgICAgICBkaXNhYmxlZD0iW1tfZ2V0U2VsZWN0aW9uT3BHcmFwaERpc2FibGVkKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCwgX3NlbGVjdGVkVGFnSW5kZXgpXV0iCiAgICAgICAgICAgID5PcCBncmFwaDwvcGFwZXItcmFkaW8tYnV0dG9uCiAgICAgICAgICA+CiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uCiAgICAgICAgICAgIG5hbWU9ImNvbmNlcHR1YWxfZ3JhcGgiCiAgICAgICAgICAgIGRpc2FibGVkPSJbW19nZXRTZWxlY3Rpb25Db25jZXB0dWFsR3JhcGhEaXNhYmxlZChkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4KV1dIgogICAgICAgICAgICA+Q29uY2VwdHVhbCBncmFwaDwvcGFwZXItcmFkaW8tYnV0dG9uCiAgICAgICAgICA+CiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uCiAgICAgICAgICAgIG5hbWU9InByb2ZpbGUiCiAgICAgICAgICAgIGRpc2FibGVkPSJbW19nZXRTZWxlY3Rpb25Qcm9maWxlRGlzYWJsZWQoZGF0YXNldHMsIF9zZWxlY3RlZFJ1bkluZGV4LCBfc2VsZWN0ZWRUYWdJbmRleCldXSIKICAgICAgICAgICAgPlByb2ZpbGU8L3BhcGVyLXJhZGlvLWJ1dHRvbgogICAgICAgICAgPgogICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+Tm9kZSBvcHRpb25zPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIGNvbnRyb2wtb3B0aW9ucyI+CiAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24KICAgICAgICAgIGNoZWNrZWQ9Int7dHJhY2VJbnB1dHN9fSIKICAgICAgICAgIG9uLWNoYW5nZT0iX29uVHJhY2VJbnB1dHNDaGFuZ2VkQnlVc2VyR2VzdHVyZSIKICAgICAgICA+CiAgICAgICAgICBUcmFjZSBpbnB1dHMKICAgICAgICA8L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2hlY2tlZD0ie3thdXRvRXh0cmFjdE5vZGVzfX0iPgogICAgICAgICAgQXV0by1leHRyYWN0IGhpZ2gtZGVncmVlIG5vZGVzCiAgICAgICAgPC9wYXBlci10b2dnbGUtYnV0dG9uPgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hlYWx0aFBpbGxzRmVhdHVyZUVuYWJsZWRdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2hlY2tlZD0ie3toZWFsdGhQaWxsc1RvZ2dsZWRPbn19IgogICAgICAgICAgICA+U2hvdyBoZWFsdGggcGlsbHM8L3BhcGVyLXRvZ2dsZS1idXR0b24KICAgICAgICAgID4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPkNvbG9yIGJ5PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIGNvbnRyb2wtb3B0aW9ucyI+CiAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwCiAgICAgICAgICBzZWxlY3RlZD0ie3tjb2xvckJ5fX0iCiAgICAgICAgICBvbi1wYXBlci1yYWRpby1ncm91cC1jaGFuZ2VkPSJfb25Db2xvckJ5Q2hhbmdlZEJ5VXNlckdlc3R1cmUiCiAgICAgICAgPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJbW0NvbG9yQnkuTk9ORV1dIj5Ob25lPC9wYXBlci1yYWRpby1idXR0b24+CgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJbW0NvbG9yQnkuU1RSVUNUVVJFXV0iCiAgICAgICAgICAgID5TdHJ1Y3R1cmU8L3BhcGVyLXJhZGlvLWJ1dHRvbgogICAgICAgICAgPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iW1tDb2xvckJ5LkRFVklDRV1dIgogICAgICAgICAgICA+RGV2aWNlPC9wYXBlci1yYWRpby1idXR0b24KICAgICAgICAgID4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uCiAgICAgICAgICAgIGlkPSJ4bGEtY2x1c3Rlci1yYWRpby1idXR0b24iCiAgICAgICAgICAgIG5hbWU9IltbQ29sb3JCeS5YTEFfQ0xVU1RFUl1dIgogICAgICAgICAgICBkaXNhYmxlZD0iW1shX3hsYUNsdXN0ZXJzUHJvdmlkZWQocmVuZGVySGllcmFyY2h5KV1dIgogICAgICAgICAgPgogICAgICAgICAgICBYTEEgY2x1c3RlcgogICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItdG9vbHRpcAogICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgIGZvcj0ieGxhLWNsdXN0ZXItcmFkaW8tYnV0dG9uIgogICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgID4KICAgICAgICAgICAgQ29sb3JpbmcgYnkgWExBIGNsdXN0ZXIgaXMgb25seSBlbmFibGVkIGlmIGF0IGxlYXN0IDEgb3Agc3BlY2lmaWVzCiAgICAgICAgICAgIGFuIFhMQSBjbHVzdGVyLgogICAgICAgICAgPC9wYXBlci10b29sdGlwPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24KICAgICAgICAgICAgaWQ9ImNvbXB1dGUtdGltZS1yYWRpby1idXR0b24iCiAgICAgICAgICAgIG5hbWU9IltbQ29sb3JCeS5DT01QVVRFX1RJTUVdXSIKICAgICAgICAgICAgZGlzYWJsZWQ9IltbIXN0YXRzXV0iCiAgICAgICAgICA+CiAgICAgICAgICAgIENvbXB1dGUgdGltZQogICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItdG9vbHRpcAogICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgIGZvcj0iY29tcHV0ZS10aW1lLXJhZGlvLWJ1dHRvbiIKICAgICAgICAgICAgcG9zaXRpb249InJpZ2h0IgogICAgICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgICA+CiAgICAgICAgICAgIENvbG9yaW5nIGJ5IGNvbXB1dGUgdGltZSBpcyBvbmx5IGVuYWJsZWQgaWYgdGhlIFJ1bk1ldGFkYXRhIHByb3RvIGlzCiAgICAgICAgICAgIHBhc3NlZCB0byB0aGUgRmlsZVdyaXRlciB3aGVuIGEgc3BlY2lmaWMgc2Vzc2lvbiBpcyBydW4uCiAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbgogICAgICAgICAgICBpZD0ibWVtb3J5LXJhZGlvLWJ1dHRvbiIKICAgICAgICAgICAgbmFtZT0iW1tDb2xvckJ5Lk1FTU9SWV1dIgogICAgICAgICAgICBkaXNhYmxlZD0iW1shc3RhdHNdXSIKICAgICAgICAgID4KICAgICAgICAgICAgTWVtb3J5CiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci10b29sdGlwCiAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgZm9yPSJtZW1vcnktcmFkaW8tYnV0dG9uIgogICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgID4KICAgICAgICAgICAgQ29sb3JpbmcgYnkgbWVtb3J5IGlzIG9ubHkgZW5hYmxlZCBpZiB0aGUgUnVuTWV0YWRhdGEgcHJvdG8gaXMKICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSBGaWxlV3JpdGVyIHdoZW4gYSBzcGVjaWZpYyBzZXNzaW9uIGlzIHJ1bi4KICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uCiAgICAgICAgICAgIGlkPSJ0cHUtY29tcGF0aWJpbGl0eS1yYWRpby1idXR0b24iCiAgICAgICAgICAgIG5hbWU9IltbQ29sb3JCeS5PUF9DT01QQVRJQklMSVRZXV0iCiAgICAgICAgICA+CiAgICAgICAgICAgIFRQVSBjb21wYXRpYmlsaXR5CiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci10b29sdGlwCiAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgZm9yPSJ0cHUtY29tcGF0aWJpbGl0eS1yYWRpby1idXR0b24iCiAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICAgPgogICAgICAgICAgICBDb2xvcmluZyBieSB3aGV0aGVyIGFuIG9wZXJhdGlvbiBpcyBjb21wYXRpYmxlIGZvciB0aGUgVFBVIGRldmljZS4KICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgogICAgICAgIDxzcGFuIGNsYXNzPSJzcGFjZXIiPjwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1ob2xkZXIiPgogICAgICA8YnV0dG9uIGNsYXNzPSJsZWdlbmQtdG9vbGJhciIgb24tY2xpY2s9Il90b2dnbGVMZWdlbmRPcGVuIj4KICAgICAgICA8c3BhbiBjbGFzcz0idG9nZ2xlLWxlZ2VuZC10ZXh0Ij5MZWdlbmQ8L3NwYW4+CiAgICAgICAgPGlyb24taWNvbgogICAgICAgICAgaWNvbj0iW1tfZ2V0VG9nZ2xlTGVnZW5kSWNvbihfbGVnZW5kT3BlbmVkKV1dIgogICAgICAgICAgY2xhc3M9InRvZ2dsZS1sZWdlbmQtYnV0dG9uIgogICAgICAgID4KICAgICAgICA8L2lyb24taWNvbj4KICAgICAgPC9idXR0b24+CiAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbGVnZW5kT3BlbmVkXV0iIGNsYXNzPSJsZWdlbmQtY29udGVudCI+CiAgICAgICAgPCEtLSBDb2xvci1tb2RlLXNwZWNpZmljIGxlZ2VuZCBpdGVtcyAtLT4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0dyYWRpZW50Q29sb3Jpbmcoc3RhdHMsIGNvbG9yQnkpXV0iPgogICAgICAgICAgICA8c3ZnIHdpZHRoPSIxNDAiIGhlaWdodD0iMjAiIGNsYXNzPSJjb2xvci10ZXh0IGdyYWRpZW50LWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgICA8bGluZWFyR3JhZGllbnQKICAgICAgICAgICAgICAgICAgaWQ9ImxpbmVhckdyYWRpZW50IgogICAgICAgICAgICAgICAgICB4MT0iMCUiCiAgICAgICAgICAgICAgICAgIHkxPSIwJSIKICAgICAgICAgICAgICAgICAgeDI9IjEwMCUiCiAgICAgICAgICAgICAgICAgIHkyPSIwJSIKICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgPHN0b3AKICAgICAgICAgICAgICAgICAgICBjbGFzcz0ic3RhcnQiCiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwJSIKICAgICAgICAgICAgICAgICAgICBzdG9wLWNvbG9yJD0iW1tfY3VycmVudEdyYWRpZW50UGFyYW1zLnN0YXJ0Q29sb3JdXSIKICAgICAgICAgICAgICAgICAgPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgPHN0b3AKICAgICAgICAgICAgICAgICAgICBjbGFzcz0iZW5kIgogICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMTAwJSIKICAgICAgICAgICAgICAgICAgICBzdG9wLWNvbG9yJD0iW1tfY3VycmVudEdyYWRpZW50UGFyYW1zLmVuZENvbG9yXV0iCiAgICAgICAgICAgICAgICAgID48L3N0b3A+CiAgICAgICAgICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICA8cmVjdAogICAgICAgICAgICAgICAgeD0iMCIKICAgICAgICAgICAgICAgIHk9IjAiCiAgICAgICAgICAgICAgICB3aWR0aD0iMTM1IgogICAgICAgICAgICAgICAgaGVpZ2h0PSIyMCIKICAgICAgICAgICAgICAgIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQpIgogICAgICAgICAgICAgICAgc3Ryb2tlPSJibGFjayIKICAgICAgICAgICAgICA+PC9yZWN0PgogICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZG9tYWluVmFsdWVzIGNvbG9yLXRleHQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRvbWFpblN0YXJ0Ij5bW19jdXJyZW50R3JhZGllbnRQYXJhbXMubWluVmFsdWVdXTwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRvbWFpbkVuZCI+W1tfY3VycmVudEdyYWRpZW50UGFyYW1zLm1heFZhbHVlXV08L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxiciBzdHlsZT0iY2xlYXI6IGJvdGgiIC8+CiAgICAgICAgICAgIDxkaXY+RGV2aWNlcyBpbmNsdWRlZCBpbiBzdGF0czo8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGV2aWNlTGlzdCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY3VycmVudERldmljZXNdXSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93IGRldmljZXMtY2hlY2tib3giPgogICAgICAgICAgICAgICAgICA8c3BhbgogICAgICAgICAgICAgICAgICAgID48aW5wdXQKICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgICAgdmFsdWUkPSJbW2l0ZW0uZGV2aWNlXV0iCiAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkJD0iW1tpdGVtLnVzZWRdXSIKICAgICAgICAgICAgICAgICAgICAgIG9uLWNsaWNrPSJfZGV2aWNlQ2hlY2tib3hDbGlja2VkIgogICAgICAgICAgICAgICAgICAvPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHNwYW4+W1tpdGVtLnN1ZmZpeF1dPC9zcGFuPgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaXRlbS5pZ25vcmVkTXNnXV0iPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgICAgICAgICAgICAgICAgaWNvbj0iaGVscCIKICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJoZWxwLWljb24iCiAgICAgICAgICAgICAgICAgICAgPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgICAgICAgICAgID5bW2l0ZW0uaWdub3JlZE1zZ11dPC9wYXBlci10b29sdGlwCiAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ3N0cnVjdHVyZScpXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci10ZXh0Ij4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsYWJlbCI+IGNvbG9ycyA8L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5zYW1lIHN1YnN0cnVjdHVyZTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uCiAgICAgICAgICAgICAgICAgIHR5cGU9Ik1FVEEiCiAgICAgICAgICAgICAgICAgIGhlaWdodD0iMTYiCiAgICAgICAgICAgICAgICAgIGZpbGwtb3ZlcnJpZGU9IiNlZWUiCiAgICAgICAgICAgICAgICAgIHN0cm9rZS1vdmVycmlkZT0iI2E2YTZhNiIKICAgICAgICAgICAgICAgID48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj51bmlxdWUgc3Vic3RydWN0dXJlPC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2VxdWFscyhjb2xvckJ5LCAnZGV2aWNlJyldXSI+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY3VycmVudERldmljZVBhcmFtc11dIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbgogICAgICAgICAgICAgICAgICAgIHR5cGU9Ik1FVEEiCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PSIxNiIKICAgICAgICAgICAgICAgICAgICBmaWxsLW92ZXJyaWRlPSJbW2l0ZW0uY29sb3JdXSIKICAgICAgICAgICAgICAgICAgICBzdHJva2Utb3ZlcnJpZGU9IiNhNmE2YTYiCiAgICAgICAgICAgICAgICAgID48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPltbaXRlbS5kZXZpY2VdXTwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbgogICAgICAgICAgICAgICAgICB0eXBlPSJNRVRBIgogICAgICAgICAgICAgICAgICBoZWlnaHQ9IjE2IgogICAgICAgICAgICAgICAgICBmaWxsLW92ZXJyaWRlPSIjZWVlIgogICAgICAgICAgICAgICAgICBzdHJva2Utb3ZlcnJpZGU9IiNhNmE2YTYiCiAgICAgICAgICAgICAgICA+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+dW5rbm93biBkZXZpY2U8L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICd4bGFfY2x1c3RlcicpXV0iPgogICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2N1cnJlbnRYbGFDbHVzdGVyUGFyYW1zXV0iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgICAgIDxzdmc+CiAgICAgICAgICAgICAgICAgICAgPHVzZQogICAgICAgICAgICAgICAgICAgICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgICAgICAgICAgICAgICAgICAgICB4bGluazpocmVmPSIjdW5maWxsZWQtcmVjdCIKICAgICAgICAgICAgICAgICAgICAgIHg9IjAiCiAgICAgICAgICAgICAgICAgICAgICB5PSIwIgogICAgICAgICAgICAgICAgICAgICAgc3R5bGU9ImZpbGw6W1tpdGVtLmNvbG9yXV0iCiAgICAgICAgICAgICAgICAgICAgPjwvdXNlPgogICAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+W1tpdGVtLnhsYV9jbHVzdGVyXV08L3NwYW4+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgICAgPHN2Zz4KICAgICAgICAgICAgICAgICAgPHVzZQogICAgICAgICAgICAgICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICAgICAgICAgICAgICAgICAgIHhsaW5rOmhyZWY9IiNncmV5LXJlY3QiCiAgICAgICAgICAgICAgICAgICAgeD0iMCIKICAgICAgICAgICAgICAgICAgICB5PSIwIgogICAgICAgICAgICAgICAgICA+PC91c2U+CiAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPnVua25vd24gWExBIGNsdXN0ZXI8L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICdvcF9jb21wYXRpYmlsaXR5JyldXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLXRleHQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24KICAgICAgICAgICAgICAgICAgdHlwZT0iT1AiCiAgICAgICAgICAgICAgICAgIGhlaWdodD0iMTYiCiAgICAgICAgICAgICAgICAgIGZpbGwtb3ZlcnJpZGU9IiMwZjlkNTgiCiAgICAgICAgICAgICAgICAgIHN0cm9rZS1vdmVycmlkZT0iI2NjYyIKICAgICAgICAgICAgICAgID48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5WYWxpZCBPcDwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uCiAgICAgICAgICAgICAgICAgIHR5cGU9Ik9QIgogICAgICAgICAgICAgICAgICBoZWlnaHQ9IjE2IgogICAgICAgICAgICAgICAgICBmaWxsLW92ZXJyaWRlPSIjZGI0NDM3IgogICAgICAgICAgICAgICAgICBzdHJva2Utb3ZlcnJpZGU9IiNjY2MiCiAgICAgICAgICAgICAgICA+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+SW52YWxpZCBPcDwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zdGF0c05vdE51bGwoc3RhdHMpXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJNRVRBIiBoZWlnaHQ9IjE2IiBmYWRlZD48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+dW51c2VkIHN1YnN0cnVjdHVyZTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8IS0tIENvbW1vbiBsZWdlbmQgaXRlbXMgLS0+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgPHRib2R5PgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD48L3RkPgogICAgICAgICAgICAgICAgPHRkPigqID0gZXhwYW5kYWJsZSk8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbgogICAgICAgICAgICAgICAgICAgIHR5cGU9Ik1FVEEiCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PSIxNiIKICAgICAgICAgICAgICAgICAgICBmaWxsLW92ZXJyaWRlPSIjZDlkOWQ5IgogICAgICAgICAgICAgICAgICAgIHN0cm9rZS1vdmVycmlkZT0iI2NjYyIKICAgICAgICAgICAgICAgICAgPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZTxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwCiAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgRW5jYXBzdWxhdGVzIGEgc2V0IG9mIG5vZGVzLiBOYW1lc3BhY2UgaXMgaGllcmFyY2hpY2FsIGFuZAogICAgICAgICAgICAgICAgICAgICAgYmFzZWQgb24gc2NvcGUuCiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik9QIiBoZWlnaHQ9IjE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICBPcE5vZGUKICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcAogICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5PSIwIgogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249InJpZ2h0IgogICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgIE5vZGUgdGhhdCBwZXJmb3JtcyBhbiBvcGVyYXRpb24uIFRoZXNlIG5vZGVzIGNhbm5vdAogICAgICAgICAgICAgICAgICAgICAgZXhwYW5kLgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJTRVJJRVMiIGhlaWdodD0iMTYiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIFVuY29ubmVjdGVkIHNlcmllczxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwCiAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2Ugb2YgbnVtYmVyZWQgbm9kZXMgdGhhdCBhcmUgbm90IGNvbm5lY3RlZCB0byBlYWNoCiAgICAgICAgICAgICAgICAgICAgICBvdGhlci4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24KICAgICAgICAgICAgICAgICAgICB0eXBlPSJTRVJJRVMiCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PSIxNiIKICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbAogICAgICAgICAgICAgICAgICA+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgQ29ubmVjdGVkIHNlcmllczxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwCiAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2Ugb2YgbnVtYmVyZWQgbm9kZXMgdGhhdCBhcmUgY29ubmVjdGVkIHRvIGVhY2gKICAgICAgICAgICAgICAgICAgICAgIG90aGVyLgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJpY29uIj4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlCiAgICAgICAgICAgICAgICAgICAgICBmaWxsPSJ3aGl0ZSIKICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT0iIzg0ODQ4NCIKICAgICAgICAgICAgICAgICAgICAgIGN4PSIxMCIKICAgICAgICAgICAgICAgICAgICAgIGN5PSIxMCIKICAgICAgICAgICAgICAgICAgICAgIHI9IjUiCiAgICAgICAgICAgICAgICAgICAgPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIENvbnN0YW50CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICBOb2RlIHRoYXQgb3V0cHV0cyBhIGNvbnN0YW50IHZhbHVlLgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJTVU1NQVJZIiBoZWlnaHQ9IjIwIj48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICBTdW1tYXJ5CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICBOb2RlIHRoYXQgY29sbGVjdHMgZGF0YSBmb3IgdmlzdWFsaXphdGlvbiB3aXRoaW4KICAgICAgICAgICAgICAgICAgICAgIFRlbnNvckJvYXJkLgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8c3ZnCiAgICAgICAgICAgICAgICAgICAgY2xhc3M9Imljb24iCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PSIxNXB4IgogICAgICAgICAgICAgICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWlkIG1lZXQiCiAgICAgICAgICAgICAgICAgICAgdmlld0JveD0iMCAwIDE1IDE1IgogICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgICAgICAgICA8bWFya2VyCiAgICAgICAgICAgICAgICAgICAgICAgIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbGVnZW5kIgogICAgICAgICAgICAgICAgICAgICAgICBmaWxsPSIjYmJiIgogICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJXaWR0aD0iMTAiCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckhlaWdodD0iMTAiCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZlg9IjkiCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZlk9IjUiCiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIgogICAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNIDAsMCBMIDEwLDUgTCAwLDEwIEMgMyw3IDMsMyAwLDAiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgIDwvbWFya2VyPgogICAgICAgICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgICAgICAgICAgbWFya2VyLWVuZD0idXJsKCNkYXRhZmxvdy1hcnJvd2hlYWQtbGVnZW5kKSIKICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT0iI2JiYiIKICAgICAgICAgICAgICAgICAgICAgIGQ9Ik0yIDkgbCAyOSAwIgogICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogICAgICAgICAgICAgICAgICAgID48L3BhdGg+CiAgICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgRGF0YWZsb3cgZWRnZQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwCiAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgRWRnZSBzaG93aW5nIHRoZSBkYXRhIGZsb3cgYmV0d2VlbiBvcGVyYXRpb25zLiBFZGdlcyBmbG93CiAgICAgICAgICAgICAgICAgICAgICB1cHdhcmRzIHVubGVzcyBhcnJvd2hlYWRzIHNwZWNpZnkgb3RoZXJ3aXNlLgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8c3ZnCiAgICAgICAgICAgICAgICAgICAgY2xhc3M9Imljb24iCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PSIxNXB4IgogICAgICAgICAgICAgICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWlkIG1lZXQiCiAgICAgICAgICAgICAgICAgICAgdmlld0JveD0iMCAwIDE1IDE1IgogICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT0iI2JiYiIKICAgICAgICAgICAgICAgICAgICAgIGQ9Ik0yIDkgbCAyOSAwIgogICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWRhc2hhcnJheT0iMiwgMiIKICAgICAgICAgICAgICAgICAgICA+PC9wYXRoPgogICAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIENvbnRyb2wgZGVwZW5kZW5jeSBlZGdlCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICBFZGdlIHNob3dpbmcgdGhlIGNvbnRyb2wgZGVwZW5kZW5jeSBiZXR3ZWVuIG9wZXJhdGlvbnMuCiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIDxzdmcKICAgICAgICAgICAgICAgICAgICBjbGFzcz0iaWNvbiIKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9IjE1cHgiCiAgICAgICAgICAgICAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pbllNaWQgbWVldCIKICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PSIwIDAgMTUgMTUiCiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICA8ZGVmcz4KICAgICAgICAgICAgICAgICAgICAgIDxtYXJrZXIKICAgICAgICAgICAgICAgICAgICAgICAgaWQ9InJlZmVyZW5jZS1hcnJvd2hlYWQtbGVnZW5kIgogICAgICAgICAgICAgICAgICAgICAgICBmaWxsPSIjRkZCNzREIgogICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJXaWR0aD0iMTAiCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckhlaWdodD0iMTAiCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZlg9IjkiCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZlk9IjUiCiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIgogICAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNIDAsMCBMIDEwLDUgTCAwLDEwIEMgMyw3IDMsMyAwLDAiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgIDwvbWFya2VyPgogICAgICAgICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgICAgICAgICAgbWFya2VyLWVuZD0idXJsKCNyZWZlcmVuY2UtYXJyb3doZWFkLWxlZ2VuZCkiCiAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9IiNGRkI3NEQiCiAgICAgICAgICAgICAgICAgICAgICBkPSJNMiA5IGwgMjkgMCIKICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIKICAgICAgICAgICAgICAgICAgICA+PC9wYXRoPgogICAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZSBlZGdlCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICBFZGdlIHNob3dpbmcgdGhhdCB0aGUgb3V0Z29pbmcgb3BlcmF0aW9uIG5vZGUgY2FuIG11dGF0ZQogICAgICAgICAgICAgICAgICAgICAgdGhlIGluY29taW5nIHRlbnNvci4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgPC9kaXY+CiAgYCx0KFtvKHt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3N0YXRzQ2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sc1l0LnByb3RvdHlwZSwic3RhdHMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHNZdC5wcm90b3R5cGUsImRldmljZXNGb3JTdGF0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sc1l0LnByb3RvdHlwZSwiY29sb3JCeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sc1l0LnByb3RvdHlwZSwiY29sb3JCeVBhcmFtcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5LG9ic2VydmVyOiJfZGF0YXNldHNDaGFuZ2VkIn0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxzWXQucHJvdG90eXBlLCJkYXRhc2V0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIix5V3QpXSxzWXQucHJvdG90eXBlLCJyZW5kZXJIaWVyYXJjaHkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwLGNvbXB1dGVkOiJfY29tcHV0ZVNlbGVjdGlvbihkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4LCBfc2VsZWN0ZWRHcmFwaFR5cGUpIn0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxzWXQucHJvdG90eXBlLCJzZWxlY3Rpb24iLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHNZdC5wcm90b3R5cGUsInNlbGVjdGVkRmlsZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcixvYnNlcnZlcjoiX3NlbGVjdGVkUnVuSW5kZXhDaGFuZ2VkIn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxzWXQucHJvdG90eXBlLCJfc2VsZWN0ZWRSdW5JbmRleCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxzWXQucHJvdG90eXBlLCJ0cmFjZUlucHV0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxzWXQucHJvdG90eXBlLCJhdXRvRXh0cmFjdE5vZGVzIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLG9ic2VydmVyOiJfc2VsZWN0ZWRUYWdJbmRleENoYW5nZWQifSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLHNZdC5wcm90b3R5cGUsIl9zZWxlY3RlZFRhZ0luZGV4Iix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHNZdC5wcm90b3R5cGUsIl9zZWxlY3RlZEdyYXBoVHlwZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sc1l0LnByb3RvdHlwZSwic2VsZWN0ZWROb2RlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sc1l0LnByb3RvdHlwZSwic2hvd1Nlc3Npb25SdW5zRHJvcGRvd24iLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxzWXQucHJvdG90eXBlLCJzaG93VXBsb2FkQnV0dG9uIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sc1l0LnByb3RvdHlwZSwiaGVhbHRoUGlsbHNGZWF0dXJlRW5hYmxlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxzWXQucHJvdG90eXBlLCJoZWFsdGhQaWxsc1RvZ2dsZWRPbiIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLHNZdC5wcm90b3R5cGUsIl9sZWdlbmRPcGVuZWQiLHZvaWQgMCksdChbcygiZGV2aWNlc0ZvclN0YXRzIiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxzWXQucHJvdG90eXBlLCJfY3VycmVudERldmljZXMiLG51bGwpLHQoW3MoImNvbG9yQnlQYXJhbXMiKSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLHNZdC5wcm90b3R5cGUsIl9jdXJyZW50RGV2aWNlUGFyYW1zIixudWxsKSx0KFtzKCJjb2xvckJ5UGFyYW1zIiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxzWXQucHJvdG90eXBlLCJfY3VycmVudFhsYUNsdXN0ZXJQYXJhbXMiLG51bGwpLHQoW3MoImNvbG9yQnlQYXJhbXMiLCJjb2xvckJ5IiksZSgiZGVzaWduOnR5cGUiLE9iamVjdCksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sc1l0LnByb3RvdHlwZSwiX2N1cnJlbnRHcmFkaWVudFBhcmFtcyIsbnVsbCksc1l0PXQoW2koInRmLWdyYXBoLWNvbnRyb2xzIildLHNZdCk7Y2xhc3MgbFl0e2lzTm90VHB1T3AodCl7cmV0dXJuLTEhPXQudG9Mb3dlckNhc2UoKS5zZWFyY2goImNwdToiKXx8LTEhPXQudG9Mb3dlckNhc2UoKS5zZWFyY2goImdwdToiKXx8LTE9PXQudG9Mb3dlckNhc2UoKS5zZWFyY2goInRwdSIpfW9wVmFsaWQodCl7cmV0dXJuIDA9PXQubmFtZS5zZWFyY2goVkd0KXx8IXQub3B8fCEoIXQuZGV2aWNlfHwhdGhpcy5pc05vdFRwdU9wKHQuZGV2aWNlKSl8fCEoIXQuZGV2aWNlfHwtMT09dC5kZXZpY2Uuc2VhcmNoKCJUUFVfU1lTVEVNIikpfHxTZS5leHBvcnRzLmluY2x1ZGVzKGxZdC5XSElURUxJU1QsdC5vcCl9fWZ1bmN0aW9uIGNZdCh0KXtyZXR1cm4gbmV3IFByb21pc2UoKChlLG4pPT57ZmV0Y2godCkudGhlbigodD0+e3Qub2s/dC5hcnJheUJ1ZmZlcigpLnRoZW4oZSxuKTp0LnRleHQoKS50aGVuKG4sbil9KSl9KSl9bFl0LldISVRFTElTVD1bIkFicyIsIkFjb3MiLCJBY29zaCIsIkFkZCIsIkFkZE4iLCJBZGRWMiIsIkFkanVzdENvbnRyYXN0djIiLCJBZGp1c3RIdWUiLCJBZGp1c3RTYXR1cmF0aW9uIiwiQWxsIiwiQWxsVG9BbGwiLCJBbmdsZSIsIkFueSIsIkFwcHJveGltYXRlRXF1YWwiLCJBcmdNYXgiLCJBcmdNaW4iLCJBc2luIiwiQXNpbmgiLCJBc3NlcnQiLCJBc3NpZ25BZGRWYXJpYWJsZU9wIiwiQXNzaWduU3ViVmFyaWFibGVPcCIsIkFzc2lnblZhcmlhYmxlT3AiLCJBdGFuIiwiQXRhbjIiLCJBdGFuaCIsIkF2Z1Bvb2wiLCJBdmdQb29sM0QiLCJBdmdQb29sM0RHcmFkIiwiQXZnUG9vbEdyYWQiLCJCYXRjaE1hdE11bCIsIkJhdGNoTWF0TXVsVjIiLCJCYXRjaFRvU3BhY2UiLCJCYXRjaFRvU3BhY2VORCIsIkJlc3NlbEkwZSIsIkJlc3NlbEkxZSIsIkJldGFpbmMiLCJCaWFzQWRkIiwiQmlhc0FkZEdyYWQiLCJCaWFzQWRkVjEiLCJCaXRjYXN0IiwiQml0d2lzZUFuZCIsIkJpdHdpc2VPciIsIkJpdHdpc2VYb3IiLCJCcm9hZGNhc3RBcmdzIiwiQnJvYWRjYXN0R3JhZGllbnRBcmdzIiwiQnJvYWRjYXN0VG8iLCJCdWNrZXRpemUiLCJDYXNlIiwiQ2FzdCIsIkNlaWwiLCJDaGVja051bWVyaWNzIiwiQ2hvbGVza3kiLCJDbGlwQnlWYWx1ZSIsIkNvbGxlY3RpdmVQZXJtdXRlIiwiQ29sbGVjdGl2ZVJlZHVjZVYyIiwiQ29tcGxleCIsIkNvbXBsZXhBYnMiLCJDb25jYXQiLCJDb25jYXRPZmZzZXQiLCJDb25jYXRWMiIsIkNvbmoiLCJDb25qdWdhdGVUcmFuc3Bvc2UiLCJDb25zdCIsIkNvbnRyb2xUcmlnZ2VyIiwiQ29udjJEIiwiQ29udjJEQmFja3Byb3BGaWx0ZXIiLCJDb252MkRCYWNrcHJvcElucHV0IiwiQ29udjNEIiwiQ29udjNEQmFja3Byb3BGaWx0ZXJWMiIsIkNvbnYzREJhY2twcm9wSW5wdXRWMiIsIkNvcyIsIkNvc2giLCJDcm9zcyIsIkNyb3NzUmVwbGljYVN1bSIsIkN1bXByb2QiLCJDdW1zdW0iLCJEYXRhRm9ybWF0RGltTWFwIiwiRGF0YUZvcm1hdFZlY1Blcm11dGUiLCJEZXB0aFRvU3BhY2UiLCJEZXB0aHdpc2VDb252MmROYXRpdmUiLCJEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciIsIkRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQiLCJEZXF1YW50aXplIiwiRGV2aWNlSW5kZXgiLCJEaWFnIiwiRGlhZ1BhcnQiLCJEaWdhbW1hIiwiRGl2IiwiRGl2Tm9OYW4iLCJEeW5hbWljU3RpdGNoIiwiRWluc3VtIiwiRWx1IiwiRWx1R3JhZCIsIkVtcHR5IiwiRW1wdHlUZW5zb3JMaXN0IiwiRW5zdXJlU2hhcGUiLCJFcXVhbCIsIkVyZiIsIkVyZmMiLCJFcmZpbnYiLCJFeHAiLCJFeHBhbmREaW1zIiwiRXhwbTEiLCJFeHRyYWN0SW1hZ2VQYXRjaGVzIiwiRkZUIiwiRkZUMkQiLCJGRlQzRCIsIkZha2VQYXJhbSIsIkZha2VRdWFudFdpdGhNaW5NYXhBcmdzIiwiRmFrZVF1YW50V2l0aE1pbk1heEFyZ3NHcmFkaWVudCIsIkZha2VRdWFudFdpdGhNaW5NYXhWYXJzIiwiRmFrZVF1YW50V2l0aE1pbk1heFZhcnNHcmFkaWVudCIsIkZpbGwiLCJGbG9vciIsIkZsb29yRGl2IiwiRmxvb3JNb2QiLCJGdXNlZEJhdGNoTm9ybSIsIkZ1c2VkQmF0Y2hOb3JtR3JhZCIsIkZ1c2VkQmF0Y2hOb3JtR3JhZFYyIiwiRnVzZWRCYXRjaE5vcm1HcmFkVjMiLCJGdXNlZEJhdGNoTm9ybVYyIiwiRnVzZWRCYXRjaE5vcm1WMyIsIkdhdGhlciIsIkdhdGhlck5kIiwiR2F0aGVyVjIiLCJHZXRJdGVtIiwiR3JlYXRlciIsIkdyZWF0ZXJFcXVhbCIsIkhTVlRvUkdCIiwiSUZGVCIsIklGRlQyRCIsIklGRlQzRCIsIklSRkZUIiwiSVJGRlQyRCIsIklSRkZUM0QiLCJJZGVudGl0eSIsIklkZW50aXR5TiIsIklmIiwiSWdhbW1hIiwiSWdhbW1hR3JhZEEiLCJJZ2FtbWFjIiwiSW1hZyIsIkluVG9wS1YyIiwiSW5mZWVkRGVxdWV1ZSIsIkluZmVlZERlcXVldWVUdXBsZSIsIklucGxhY2VBZGQiLCJJbnBsYWNlVXBkYXRlIiwiSW52IiwiSW52ZXJ0IiwiSW52ZXJ0UGVybXV0YXRpb24iLCJJc0Zpbml0ZSIsIklzSW5mIiwiSXNOYW4iLCJLdGhPcmRlclN0YXRpc3RpYyIsIkwyTG9zcyIsIkxSTiIsIkxSTkdyYWQiLCJMZWFreVJlbHUiLCJMZWFreVJlbHVHcmFkIiwiTGVmdFNoaWZ0IiwiTGVzcyIsIkxlc3NFcXVhbCIsIkxnYW1tYSIsIkxpblNwYWNlIiwiTGlzdERpZmYiLCJMb2ciLCJMb2cxcCIsIkxvZ1NvZnRtYXgiLCJMb2dpY2FsQW5kIiwiTG9naWNhbE5vdCIsIkxvZ2ljYWxPciIsIkxvd2VyQm91bmQiLCJNYWtlVW5pcXVlIiwiTWF0TXVsIiwiTWF0cml4QmFuZFBhcnQiLCJNYXRyaXhEaWFnIiwiTWF0cml4RGlhZ1BhcnQiLCJNYXRyaXhEaWFnUGFydFYyIiwiTWF0cml4RGlhZ1BhcnRWMyIsIk1hdHJpeERpYWdWMiIsIk1hdHJpeERpYWdWMyIsIk1hdHJpeEludmVyc2UiLCJNYXRyaXhTZXREaWFnIiwiTWF0cml4U2V0RGlhZ1YyIiwiTWF0cml4U2V0RGlhZ1YzIiwiTWF0cml4U29sdmUiLCJNYXRyaXhUcmlhbmd1bGFyU29sdmUiLCJNYXgiLCJNYXhQb29sIiwiTWF4UG9vbDNEIiwiTWF4UG9vbDNER3JhZCIsIk1heFBvb2wzREdyYWRHcmFkIiwiTWF4UG9vbEdyYWQiLCJNYXhQb29sR3JhZEdyYWQiLCJNYXhQb29sR3JhZEdyYWRWMiIsIk1heFBvb2xHcmFkVjIiLCJNYXhQb29sVjIiLCJNYXhpbXVtIiwiTWVhbiIsIk1pbiIsIk1pbmltdW0iLCJNaXJyb3JQYWQiLCJNaXJyb3JQYWRHcmFkIiwiTW9kIiwiTXVsIiwiTXVsTm9OYW4iLCJNdWx0aW5vbWlhbCIsIk5kdHJpIiwiTmVnIiwiTmV4dEFmdGVyIiwiTm9PcCIsIk5vbk1heFN1cHByZXNzaW9uVjQiLCJOb3RFcXVhbCIsIk9uZUhvdCIsIk9uZXNMaWtlIiwiT3V0ZmVlZEVucXVldWUiLCJPdXRmZWVkRW5xdWV1ZVR1cGxlIiwiUGFjayIsIlBhZCIsIlBhZFYyIiwiUGFyYWxsZWxEeW5hbWljU3RpdGNoIiwiUGFyYW1ldGVyaXplZFRydW5jYXRlZE5vcm1hbCIsIlBhcnRpdGlvbmVkQ2FsbCIsIlBsYWNlaG9sZGVyV2l0aERlZmF1bHQiLCJQb2x5Z2FtbWEiLCJQb3B1bGF0aW9uQ291bnQiLCJQb3ciLCJQcmV2ZW50R3JhZGllbnQiLCJQcm9kIiwiUXIiLCJRdWFudGl6ZUFuZERlcXVhbnRpemVWMiIsIlF1YW50aXplQW5kRGVxdWFudGl6ZVYzIiwiUkZGVCIsIlJGRlQyRCIsIlJGRlQzRCIsIlJHQlRvSFNWIiwiUmFuZG9tR2FtbWFHcmFkIiwiUmFuZG9tU2h1ZmZsZSIsIlJhbmRvbVN0YW5kYXJkTm9ybWFsIiwiUmFuZG9tVW5pZm9ybSIsIlJhbmRvbVVuaWZvcm1JbnQiLCJSYW5nZSIsIlJhbmsiLCJSZWFkVmFyaWFibGVPcCIsIlJlYWwiLCJSZWFsRGl2IiwiUmVjaXByb2NhbCIsIlJlY2lwcm9jYWxHcmFkIiwiUmVsdSIsIlJlbHU2IiwiUmVsdTZHcmFkIiwiUmVsdUdyYWQiLCJSZXNoYXBlIiwiUmVzaXplQmlsaW5lYXIiLCJSZXNpemVCaWxpbmVhckdyYWQiLCJSZXNpemVOZWFyZXN0TmVpZ2hib3IiLCJSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkIiwiUmVzb3VyY2VBcHBseUFkYU1heCIsIlJlc291cmNlQXBwbHlBZGFkZWx0YSIsIlJlc291cmNlQXBwbHlBZGFncmFkIiwiUmVzb3VyY2VBcHBseUFkYWdyYWREQSIsIlJlc291cmNlQXBwbHlBZGFncmFkVjIiLCJSZXNvdXJjZUFwcGx5QWRhbSIsIlJlc291cmNlQXBwbHlBZGRTaWduIiwiUmVzb3VyY2VBcHBseUNlbnRlcmVkUk1TUHJvcCIsIlJlc291cmNlQXBwbHlGdHJsIiwiUmVzb3VyY2VBcHBseUZ0cmxWMiIsIlJlc291cmNlQXBwbHlHcmFkaWVudERlc2NlbnQiLCJSZXNvdXJjZUFwcGx5S2VyYXNNb21lbnR1bSIsIlJlc291cmNlQXBwbHlNb21lbnR1bSIsIlJlc291cmNlQXBwbHlQb3dlclNpZ24iLCJSZXNvdXJjZUFwcGx5UHJveGltYWxBZGFncmFkIiwiUmVzb3VyY2VBcHBseVByb3hpbWFsR3JhZGllbnREZXNjZW50IiwiUmVzb3VyY2VBcHBseVJNU1Byb3AiLCJSZXNvdXJjZUdhdGhlciIsIlJlc291cmNlU2NhdHRlckFkZCIsIlJlc291cmNlU2NhdHRlckRpdiIsIlJlc291cmNlU2NhdHRlck1heCIsIlJlc291cmNlU2NhdHRlck1pbiIsIlJlc291cmNlU2NhdHRlck11bCIsIlJlc291cmNlU2NhdHRlck5kQWRkIiwiUmVzb3VyY2VTY2F0dGVyTmRTdWIiLCJSZXNvdXJjZVNjYXR0ZXJOZFVwZGF0ZSIsIlJlc291cmNlU2NhdHRlclN1YiIsIlJlc291cmNlU2NhdHRlclVwZGF0ZSIsIlJlc291cmNlU3RyaWRlZFNsaWNlQXNzaWduIiwiUmV2ZXJzZSIsIlJldmVyc2VTZXF1ZW5jZSIsIlJldmVyc2VWMiIsIlJpZ2h0U2hpZnQiLCJSaW50IiwiUm5nUmVhZEFuZFNraXAiLCJSbmdTa2lwIiwiUm9sbCIsIlJvdW5kIiwiUnNxcnQiLCJSc3FydEdyYWQiLCJTY2F0dGVyTmQiLCJTZWxlY3QiLCJTZWxlY3RWMiIsIlNlbGZBZGpvaW50RWlnVjIiLCJTZWx1IiwiU2VsdUdyYWQiLCJTaGFwZSIsIlNoYXBlTiIsIlNpZ21vaWQiLCJTaWdtb2lkR3JhZCIsIlNpZ24iLCJTaW4iLCJTaW5oIiwiU2l6ZSIsIlNsaWNlIiwiU25hcHNob3QiLCJTb2Z0bWF4IiwiU29mdG1heENyb3NzRW50cm9weVdpdGhMb2dpdHMiLCJTb2Z0cGx1cyIsIlNvZnRwbHVzR3JhZCIsIlNvZnRzaWduIiwiU29mdHNpZ25HcmFkIiwiU3BhY2VUb0JhdGNoIiwiU3BhY2VUb0JhdGNoTkQiLCJTcGFjZVRvRGVwdGgiLCJTcGFyc2VNYXRNdWwiLCJTcGFyc2VTb2Z0bWF4Q3Jvc3NFbnRyb3B5V2l0aExvZ2l0cyIsIlNwYXJzZVRvRGVuc2UiLCJTcGxpdCIsIlNwbGl0ViIsIlNxcnQiLCJTcXJ0R3JhZCIsIlNxdWFyZSIsIlNxdWFyZWREaWZmZXJlbmNlIiwiU3F1ZWV6ZSIsIlN0YWNrQ2xvc2VWMiIsIlN0YWNrUG9wVjIiLCJTdGFja1B1c2hWMiIsIlN0YWNrVjIiLCJTdGF0ZWZ1bFBhcnRpdGlvbmVkQ2FsbCIsIlN0YXRlZnVsU3RhbmRhcmROb3JtYWxWMiIsIlN0YXRlZnVsVHJ1bmNhdGVkTm9ybWFsIiwiU3RhdGVmdWxVbmlmb3JtIiwiU3RhdGVmdWxVbmlmb3JtRnVsbEludCIsIlN0YXRlZnVsVW5pZm9ybUludCIsIlN0YXRlbGVzc0Nhc2UiLCJTdGF0ZWxlc3NJZiIsIlN0YXRlbGVzc011bHRpbm9taWFsIiwiU3RhdGVsZXNzUmFuZG9tR2V0QWxnIiwiU3RhdGVsZXNzUmFuZG9tR2V0S2V5Q291bnRlciIsIlN0YXRlbGVzc1JhbmRvbUdldEtleUNvdW50ZXJBbGciLCJTdGF0ZWxlc3NSYW5kb21Ob3JtYWwiLCJTdGF0ZWxlc3NSYW5kb21Ob3JtYWxWMiIsIlN0YXRlbGVzc1JhbmRvbVVuaWZvcm0iLCJTdGF0ZWxlc3NSYW5kb21Vbmlmb3JtRnVsbEludCIsIlN0YXRlbGVzc1JhbmRvbVVuaWZvcm1GdWxsSW50VjIiLCJTdGF0ZWxlc3NSYW5kb21Vbmlmb3JtSW50IiwiU3RhdGVsZXNzUmFuZG9tVW5pZm9ybUludFYyIiwiU3RhdGVsZXNzUmFuZG9tVW5pZm9ybVYyIiwiU3RhdGVsZXNzVHJ1bmNhdGVkTm9ybWFsIiwiU3RhdGVsZXNzVHJ1bmNhdGVkTm9ybWFsVjIiLCJTdGF0ZWxlc3NXaGlsZSIsIlN0b3BHcmFkaWVudCIsIlN0cmlkZWRTbGljZSIsIlN0cmlkZWRTbGljZUdyYWQiLCJTdWIiLCJTdW0iLCJTdmQiLCJTeW1ib2xpY0dyYWRpZW50IiwiVFBVRW1iZWRkaW5nQWN0aXZhdGlvbnMiLCJUYW4iLCJUYW5oIiwiVGFuaEdyYWQiLCJUZW5zb3JBcnJheUNsb3NlVjMiLCJUZW5zb3JBcnJheUNvbmNhdFYzIiwiVGVuc29yQXJyYXlHYXRoZXJWMyIsIlRlbnNvckFycmF5R3JhZFYzIiwiVGVuc29yQXJyYXlSZWFkVjMiLCJUZW5zb3JBcnJheVNjYXR0ZXJWMyIsIlRlbnNvckFycmF5U2l6ZVYzIiwiVGVuc29yQXJyYXlTcGxpdFYzIiwiVGVuc29yQXJyYXlWMyIsIlRlbnNvckFycmF5V3JpdGVWMyIsIlRlbnNvckxpc3RDb25jYXRWMiIsIlRlbnNvckxpc3RFbGVtZW50U2hhcGUiLCJUZW5zb3JMaXN0RnJvbVRlbnNvciIsIlRlbnNvckxpc3RHYXRoZXIiLCJUZW5zb3JMaXN0R2V0SXRlbSIsIlRlbnNvckxpc3RMZW5ndGgiLCJUZW5zb3JMaXN0UG9wQmFjayIsIlRlbnNvckxpc3RQdXNoQmFjayIsIlRlbnNvckxpc3RSZXNlcnZlIiwiVGVuc29yTGlzdFNldEl0ZW0iLCJUZW5zb3JMaXN0U3BsaXQiLCJUZW5zb3JMaXN0U3RhY2siLCJUZW5zb3JTY2F0dGVyQWRkIiwiVGVuc29yU2NhdHRlck1heCIsIlRlbnNvclNjYXR0ZXJNaW4iLCJUZW5zb3JTY2F0dGVyU3ViIiwiVGVuc29yU2NhdHRlclVwZGF0ZSIsIlRlbnNvclN0cmlkZWRTbGljZVVwZGF0ZSIsIlRpbGUiLCJUb3BLVW5pcXVlIiwiVG9wS1YyIiwiVG9wS1dpdGhVbmlxdWUiLCJUcmFuc3Bvc2UiLCJUcmlkaWFnb25hbFNvbHZlIiwiVHJ1bmNhdGVEaXYiLCJUcnVuY2F0ZU1vZCIsIlRydW5jYXRlZE5vcm1hbCIsIlVuaXF1ZSIsIlVucGFjayIsIlVuc29ydGVkU2VnbWVudE1heCIsIlVuc29ydGVkU2VnbWVudE1pbiIsIlVuc29ydGVkU2VnbWVudFByb2QiLCJVbnNvcnRlZFNlZ21lbnRTdW0iLCJVcHBlckJvdW5kIiwiVmFySXNJbml0aWFsaXplZE9wIiwiVmFyaWFibGVTaGFwZSIsIldoZXJlIiwiV2hpbGUiLCJYZGl2eSIsIlhsYUJyb2FkY2FzdEhlbHBlciIsIlhsYUNvbnYiLCJYbGFDb252VjIiLCJYbGFEZXF1YW50aXplIiwiWGxhRG90IiwiWGxhRG90VjIiLCJYbGFEeW5hbWljU2xpY2UiLCJYbGFEeW5hbWljVXBkYXRlU2xpY2UiLCJYbGFFaW5zdW0iLCJYbGFHYXRoZXIiLCJYbGFIb3N0Q29tcHV0ZSIsIlhsYUlmIiwiWGxhS2V5VmFsdWVTb3J0IiwiWGxhUGFkIiwiWGxhUmVjdiIsIlhsYVJlY3ZGcm9tSG9zdCIsIlhsYVJlZHVjZSIsIlhsYVJlZHVjZVdpbmRvdyIsIlhsYVJlcGxpY2FJZCIsIlhsYVNjYXR0ZXIiLCJYbGFTZWxlY3RBbmRTY2F0dGVyIiwiWGxhU2VsZkFkam9pbnRFaWciLCJYbGFTZW5kIiwiWGxhU2VuZFRvSG9zdCIsIlhsYVNldEJvdW5kIiwiWGxhU2V0RHluYW1pY0RpbWVuc2lvblNpemUiLCJYbGFTaGFyZGluZyIsIlhsYVNvcnQiLCJYbGFTcG1kRnVsbFRvU2hhcmRTaGFwZSIsIlhsYVNwbWRTaGFyZFRvRnVsbFNoYXBlIiwiWGxhU3ZkIiwiWGxhVmFyaWFkaWNSZWR1Y2UiLCJYbGFWYXJpYWRpY1NvcnQiLCJYbGFXaGlsZSIsIlhsb2cxcHkiLCJYbG9neSIsIlplcm9zTGlrZSIsIlpldGEiLCJFbnRlciIsIkV4aXQiLCJMb29wQ29uZCIsIk1lcmdlIiwiTmV4dEl0ZXJhdGlvbiIsIlN3aXRjaCIsIl9BcmciLCJfQXJyYXlUb0xpc3QiLCJfRnVzZWRCYXRjaE5vcm1FeCIsIl9MaXN0VG9BcnJheSIsIl9QYXJhbGxlbENvbmNhdFVwZGF0ZSIsIl9SZWN2VFBVRW1iZWRkaW5nQWN0aXZhdGlvbnMiLCJfUmVjdlRQVUVtYmVkZGluZ0RlZHVwbGljYXRpb25EYXRhIiwiX1JldHZhbCIsIl9TZW5kVFBVRW1iZWRkaW5nR3JhZGllbnRzIiwiX1RQVUNvbXBpbGUiLCJfVFBVRXhlY3V0ZSIsIl9VbmFyeU9wc0NvbXBvc2l0aW9uIiwiVFBVQ29tcGlsYXRpb25SZXN1bHQiLCJUUFVSZXBsaWNhdGVkSW5wdXQiLCJUUFVSZXBsaWNhdGVkT3V0cHV0IiwiVFBVUmVwbGljYXRlTWV0YWRhdGEiLCJNZXJnZVYyQ2hlY2twb2ludHMiLCJSZXN0b3JlVjIiLCJTYXZlVjIiLCJBYm9ydCIsIkFzc2VydCIsIkFzc2lnbiIsIlBsYWNlaG9sZGVyIiwiUGxhY2Vob2xkZXJWMiIsIlNoYXJkZWRGaWxlbmFtZSIsIlN0cmluZ0pvaW4iLCJWYXJpYWJsZSIsIlZhcmlhYmxlVjIiLCJWYXJIYW5kbGVPcCIsIkF1ZGlvU3VtbWFyeSIsIkF1ZGlvU3VtbWFyeVYyIiwiRGVidWdOdW1lcmljU3VtbWFyeSIsIkhpc3RvZ3JhbVN1bW1hcnkiLCJJbWFnZVN1bW1hcnkiLCJNZXJnZVN1bW1hcnkiLCJTY2FsYXJTdW1tYXJ5IiwiU3RhdHNBZ2dyZWdhdG9yU3VtbWFyeSJdO2NvbnN0IHVZdD17ImxpYnJhcnkuZnVuY3Rpb24iOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5pbnB1dCI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ciI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LmIiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5mIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QuZnVuYyI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LmkiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5zIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3Quc2hhcGUiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5zaGFwZS5kaW0iOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC50ZW5zb3IiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC50eXBlIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLnNoYXBlLmRpbSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS50ZW5zb3Iuc3RyaW5nX3ZhbCI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS50ZW5zb3IudGVuc29yX3NoYXBlLmRpbSI6ITAsImxpYnJhcnkuZnVuY3Rpb24uc2lnbmF0dXJlLmlucHV0X2FyZyI6ITAsImxpYnJhcnkuZnVuY3Rpb24uc2lnbmF0dXJlLm91dHB1dF9hcmciOiEwLCJsaWJyYXJ5LnZlcnNpb25zIjohMCxub2RlOiEwLCJub2RlLmlucHV0IjohMCwibm9kZS5hdHRyIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QuYiI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LmYiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5mdW5jIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QuaSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnMiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5zaGFwZSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnNoYXBlLmRpbSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnRlbnNvciI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnR5cGUiOiEwLCJub2RlLmF0dHIudmFsdWUuc2hhcGUuZGltIjohMCwibm9kZS5hdHRyLnZhbHVlLnRlbnNvci5zdHJpbmdfdmFsIjohMCwibm9kZS5hdHRyLnZhbHVlLnRlbnNvci50ZW5zb3Jfc2hhcGUuZGltIjohMH0saFl0PXsic3RlcF9zdGF0cy5kZXZfc3RhdHMiOiEwLCJzdGVwX3N0YXRzLmRldl9zdGF0cy5ub2RlX3N0YXRzIjohMCwic3RlcF9zdGF0cy5kZXZfc3RhdHMubm9kZV9zdGF0cy5vdXRwdXQiOiEwLCJzdGVwX3N0YXRzLmRldl9zdGF0cy5ub2RlX3N0YXRzLm1lbW9yeSI6ITAsInN0ZXBfc3RhdHMuZGV2X3N0YXRzLm5vZGVfc3RhdHMub3V0cHV0LnRlbnNvcl9kZXNjcmlwdGlvbi5zaGFwZS5kaW0iOiEwfTtmdW5jdGlvbiBkWXQodCxlKXtsZXQgbj17fSxpPVtdLHI9W10sbz1uO2Z1bmN0aW9uIGEodCxuLGkscil7bGV0IG89dFtuXTtudWxsPT1vP3Rbbl09ci5qb2luKCIuIilpbiBlP1tpXTppOkFycmF5LmlzQXJyYXkobyk/by5wdXNoKGkpOnRbbl09W28saV19cmV0dXJuKGZ1bmN0aW9uIHModCxlLG49MWU2LGk9IlxuIil7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8peyEoZnVuY3Rpb24gYShzLGwsYyl7Y29uc3QgdT1jPj10LmJ5dGVMZW5ndGgsaD1sLnNwbGl0KGkpO2hbMF09cytoWzBdO2NvbnN0IGQ9dT8iIjpoLnBvcCgpO2ZvcihsZXQgdCBvZiBoKXRyeXtlKHQpfWNhdGNoKHQpe3JldHVybiB2b2lkIG8odCl9aWYodSlyZXR1cm4gdm9pZCByKCEwKTtjb25zdCBwPW5ldyBCbG9iKFt0LnNsaWNlKGMsYytuKV0pLGY9bmV3IEZpbGVSZWFkZXI7Zi5vbmxvYWQ9ZnVuY3Rpb24odCl7YShkLHQudGFyZ2V0LnJlc3VsdCxjK24pfSxmLnJlYWRBc1RleHQocCl9KSgiIiwiIiwwKX0pKX0pKHQsKGZ1bmN0aW9uKHQpe2lmKHQ9dC50cmltKCkpc3dpdGNoKHRbdC5sZW5ndGgtMV0pe2Nhc2UieyI6bGV0IGU9dC5zdWJzdHJpbmcoMCx0Lmxlbmd0aC0yKS50cmltKCksbj17fTtpLnB1c2gobyksci5wdXNoKGUpLGEobyxlLG4sciksbz1uO2JyZWFrO2Nhc2UifSI6bz1pLnBvcCgpLHIucG9wKCk7YnJlYWs7ZGVmYXVsdDpsZXQgcz0oZnVuY3Rpb24gZSh0KXtsZXQgZT10LmluZGV4T2YoIjoiKTtyZXR1cm57bmFtZTp0LnN1YnN0cmluZygwLGUpLnRyaW0oKSx2YWx1ZTooZnVuY3Rpb24gbih0KXtpZigidHJ1ZSI9PT10KXJldHVybiEwO2lmKCJmYWxzZSI9PT10KXJldHVybiExO2lmKCciJz09PXRbMF0pcmV0dXJuIHQuc3Vic3RyaW5nKDEsdC5sZW5ndGgtMSk7bGV0IGU9cGFyc2VGbG9hdCh0KTtyZXR1cm4gaXNOYU4oZSk/dDplfSkodC5zdWJzdHJpbmcoZSsyKS50cmltKCkpfX0pKHQpO2EobyxzLm5hbWUscy52YWx1ZSxyLmNvbmNhdChzLm5hbWUpKX19KSkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gbn0pKX1sZXQgcFl0PWNsYXNzIGV4dGVuZHMoZXIoeWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb21wYXRpYmlsaXR5UHJvdmlkZXI9bmV3IGxZdCx0aGlzLmhpZXJhcmNoeVBhcmFtcz1IcXQsdGhpcy5fdGVtcGxhdGU9bnVsbH1fc2VsZWN0aW9uQ2hhbmdlZCgpe3RoaXMuc2VsZWN0aW9uJiZ0aGlzLmRlYm91bmNlKCJzZWxlY3Rpb25jaGFuZ2UiLCgoKT0+e3RoaXMuX2xvYWQodGhpcy5zZWxlY3Rpb24pfSkpfV9sb2FkKHQpe2NvbnN0e3J1bjplLHRhZzpuLHR5cGU6aX09dDtzd2l0Y2goaSl7Y2FzZSB5R3QuT1BfR1JBUEg6Y2FzZSB5R3QuQ09OQ0VQVFVBTF9HUkFQSDp7KGZ1bmN0aW9uKCl7dGhpcy5fc2V0T3V0U3RhdHMobnVsbCl9KS5iaW5kKHRoaXMpKCk7Y29uc3QgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3Quc2V0KCJydW4iLGUpLHQuc2V0KCJjb25jZXB0dWFsIixTdHJpbmcoaT09PXlHdC5DT05DRVBUVUFMX0dSQVBIKSksbiYmdC5zZXQoInRhZyIsbik7Y29uc3Qgcj1fcigpLnBsdWdpblJvdXRlKCJncmFwaHMiLCIvZ3JhcGgiLHQpO3JldHVybiB0aGlzLl9mZXRjaEFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoKHIpLnRoZW4oKCgpPT57dGhpcy5fZ3JhcGhSdW5UYWc9e3J1bjplLHRhZzpufX0pKX1jYXNlIHlHdC5QUk9GSUxFOntjb25zdHt0YWdzOnR9PXRoaXMuZGF0YXNldHMuZmluZCgoKHtuYW1lOnR9KT0+dD09PWUpKSxpPXQuZmluZCgodD0+dC50YWc9PT1uKSkub3BHcmFwaD9uOm51bGw7Y29uc29sZS5hc3NlcnQodC5maW5kKCh0PT50LnRhZz09PWkpKSxgUmVxdWlyZWQgdGFnICgke2l9KSBpcyBtaXNzaW5nLmApO2NvbnN0IHI9dGhpcy5fZ3JhcGhSdW5UYWcmJnRoaXMuX2dyYXBoUnVuVGFnLnJ1bj09PWUmJnRoaXMuX2dyYXBoUnVuVGFnLnRhZz09PWk/UHJvbWlzZS5yZXNvbHZlKCk6dGhpcy5fbG9hZCh7cnVuOmUsdGFnOmksdHlwZTp5R3QuT1BfR1JBUEh9KSxvPW5ldyBVUkxTZWFyY2hQYXJhbXM7by5zZXQoInRhZyIsbiksby5zZXQoInJ1biIsZSk7Y29uc3QgYT1fcigpLnBsdWdpblJvdXRlKCJncmFwaHMiLCIvcnVuX21ldGFkYXRhIixvKTtyZXR1cm4gci50aGVuKCgoKT0+dGhpcy5fcmVhZEFuZFBhcnNlTWV0YWRhdGEoYSkpKX1kZWZhdWx0OnJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVua25vd24gc2VsZWN0aW9uIHR5cGU6ICR7aX1gKSl9fV9yZWFkQW5kUGFyc2VNZXRhZGF0YSh0KXt0aGlzLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTowLG1zZzoiIn0pLChmdW5jdGlvbiBlKHQsbil7cmV0dXJuKGZ1bmN0aW9uIGkodCxlLG4scixvKXtyLnNldE1lc3NhZ2UodCk7dHJ5e2xldCBpPUNHdCh0LG4sbyk7cmV0dXJuIHIudXBkYXRlUHJvZ3Jlc3MoZSksaX1jYXRjaChlKXtyLnJlcG9ydEVycm9yKCJGYWlsZWQgIit0LGUpfX0pKCJSZWFkaW5nIG1ldGFkYXRhIHBidHh0Iiw0MCwoKCk9Pm51bGw9PXQ/UHJvbWlzZS5yZXNvbHZlKG51bGwpOmNZdCh0KSksbixfR3QuRkVUQ0hfTUVUQURBVEFfUEJUWFRfQllURVMpLnRoZW4oKHQ9PlBHdCgiUGFyc2luZyBtZXRhZGF0YS5wYnR4dCIsNjAsKCgpPT5udWxsIT10PyhmdW5jdGlvbiBlKHQpe3JldHVybiBkWXQodCxoWXQpLnRoZW4oKHQ9PnQuc3RlcF9zdGF0cykpfSkodCk6UHJvbWlzZS5yZXNvbHZlKG51bGwpKSxuLF9HdC5QQVJTRV9NRVRBREFUQV9QQlRYVF9JTlRPX09CSkVDVCkpKX0pKHQsQUd0KHRoaXMpKS50aGVuKGZ1bmN0aW9uKHQpe3RoaXMuX3NldE91dFN0YXRzKHQpfS5iaW5kKHRoaXMpKX1fZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaCh0LGUpe3JldHVybiB0aGlzLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTowLG1zZzoiIn0pLChmdW5jdGlvbiBpKHQsZSxyLG89bmV3IGxZdCxhPUhxdCl7Y29uc3Qgcz1rR3QodCwzMCwiRGF0YSIpLGw9a0d0KHQsMjAsIkdyYXBoIiksYz1rR3QodCw1MCwiTmFtZXNwYWNlIGhpZXJhcmNoeSIpLHU9RGF0ZS5ub3coKTtyZXR1cm4oZnVuY3Rpb24gaCh0LGUsaSl7cmV0dXJuIFBHdCgiUmVhZGluZyBncmFwaCBwYnR4dCIsNDAsKCgpPT5uKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3Qgbj1EYXRlLm5vdygpO2lmKGUpe2NvbnN0IHQ9eWllbGQgbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQsbil7bGV0IGk9bmV3IEZpbGVSZWFkZXI7aS5vbmxvYWQ9KCk9PnQoaS5yZXN1bHQpLGkub25lcnJvcj0oKT0+bihpLmVycm9yKSxpLnJlYWRBc0FycmF5QnVmZmVyKGUpfSkpO3JldHVybiBUR3Qoe3RpbWluZ0lkOl9HdC5GRVRDSF9QQlRYVF9CWVRFU19GUk9NX0ZJTEVTWVNURU0sZXZlbnRWYWx1ZTpEYXRlLm5vdygpLW59KSx0fWNvbnN0IGk9eWllbGQgY1l0KHQpO3JldHVybiBUR3Qoe3RpbWluZ0lkOl9HdC5GRVRDSF9QQlRYVF9CWVRFU19GUk9NX1NFUlZFUixldmVudFZhbHVlOkRhdGUubm93KCktbn0pLGl9KSkpLGksX0d0LkZFVENIX1BCVFhUX0JZVEVTKS50aGVuKCh0PT5QR3QoIlBhcnNpbmcgZ3JhcGgucGJ0eHQiLDYwLCgoKT0+KGZ1bmN0aW9uIGUodCl7cmV0dXJuIGRZdCh0LHVZdCl9KSh0KSksaSxfR3QuUEFSU0VfUEJUWFRfSU5UT19PQkpFQ1QpKSl9KShlLHIscykudGhlbigoZnVuY3Rpb24odCl7aWYoIXQubm9kZSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBncmFwaCBpcyBlbXB0eS4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gVGVuc29yRmxvdyBjb3VsZCBub3QgdHJhY2UgYW55IGdyYXBoLiBQbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvaXNzdWVzLzE5NjEgZm9yIG1vcmUgaW5mb3JtYXRpb24uIik7cmV0dXJuKGZ1bmN0aW9uIGUodCxuLGkpe2xldCByPXt9LG89e30sYT17fSxzPWFXdChuLmluRW1iZWRkaW5nVHlwZXMpLGw9YVd0KG4ub3V0RW1iZWRkaW5nVHlwZXMpLGM9W10sdT10Lm5vZGUsaD1uZXcgQXJyYXkodS5sZW5ndGgpO3JldHVybiBMR3QoIk5vcm1hbGl6aW5nIG5hbWVzIiwzMCwoKCk9PntsZXQgZT1uZXcgQXJyYXkodS5sZW5ndGgpLG49MDtjb25zdCBpPXQ9PntsZXQgaT1uZXcgWEd0KHQpO3JldHVybiBzKGkpPyhjLnB1c2goaS5uYW1lKSxyW2kubmFtZV09aSxpKTpsKGkpPyhjLnB1c2goaS5uYW1lKSxvW2kubmFtZV09aSxTZS5leHBvcnRzLmVhY2goaS5pbnB1dHMsKHQ9PntsZXQgZT10Lm5hbWU7YVtlXT1hW2VdfHxbXSxhW2VdLnB1c2goaSl9KSksaSk6KGVbbl09aSxoW25dPWkubmFtZSxuKyssaSl9O3JldHVybiBTZS5leHBvcnRzLmVhY2godSxpKSx0LmxpYnJhcnkmJnQubGlicmFyeS5mdW5jdGlvbiYmU2UuZXhwb3J0cy5lYWNoKHQubGlicmFyeS5mdW5jdGlvbiwodD0+e2NvbnN0IGU9Vkd0K3Quc2lnbmF0dXJlLm5hbWU7aWYoaSh7bmFtZTplLGlucHV0OltdLGRldmljZToiIixvcDoiIixhdHRyOltdfSksdC5zaWduYXR1cmUuaW5wdXRfYXJnKXtsZXQgbj0wO2NvbnN0IHI9dD0+e2koe25hbWU6ZStIR3QrdC5uYW1lLGlucHV0OltdLGRldmljZToiIixvcDoiaW5wdXRfYXJnIixhdHRyOlt7a2V5OiJUIix2YWx1ZTp7dHlwZTp0LnR5cGV9fV19KS5mdW5jdGlvbklucHV0SW5kZXg9bixuKyt9O3Quc2lnbmF0dXJlLmlucHV0X2FyZy5uYW1lP3IodC5zaWduYXR1cmUuaW5wdXRfYXJnKTpTZS5leHBvcnRzLmVhY2godC5zaWduYXR1cmUuaW5wdXRfYXJnLHIpfWxldCBuPTA7Y29uc3Qgcj17fTtpZih0LnNpZ25hdHVyZS5vdXRwdXRfYXJnKXtjb25zdCBpPXQ9PntyW2UrSEd0K3QubmFtZV09bixuKyt9O3Quc2lnbmF0dXJlLm91dHB1dF9hcmcubmFtZT9pKHQuc2lnbmF0dXJlLm91dHB1dF9hcmcpOlNlLmV4cG9ydHMuZWFjaCh0LnNpZ25hdHVyZS5vdXRwdXRfYXJnLGkpfVNlLmV4cG9ydHMuZWFjaCh0Lm5vZGVfZGVmLCh0PT57dC5uYW1lPWUrIi8iK3QubmFtZSwic3RyaW5nIj09dHlwZW9mIHQuaW5wdXQmJih0LmlucHV0PVt0LmlucHV0XSk7Y29uc3Qgbj1pKHQpO1NlLmV4cG9ydHMuaXNOdW1iZXIoclt0Lm5hbWVdKSYmKG4uZnVuY3Rpb25PdXRwdXRJbmRleD1yW3QubmFtZV0pLFNlLmV4cG9ydHMuZWFjaChuLmlucHV0cywodD0+e3QubmFtZT1lK0hHdCt0Lm5hbWV9KSl9KSl9KSksZS5zcGxpY2UobiksaC5zcGxpY2UobiksZX0pLGksX0d0Lk5PUk1BTElaSU5HX05BTUVTKS50aGVuKCh0PT5MR3QoIkJ1aWxkaW5nIHRoZSBkYXRhIHN0cnVjdHVyZSIsNzAsKCgpPT57bGV0IGU9KGZ1bmN0aW9uIGkodCxlKXtsZXQgbj17fSxpPXt9O3Quc29ydCgpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGgtMTsrK2Upe2xldCByPXRbZV07U2UuZXhwb3J0cy5lYWNoKGNXdChyKS5zbGljZSgwLC0xKSwodD0+e2lbdF09ITB9KSk7Zm9yKGxldCBpPWUrMTtpPHQubGVuZ3RoOysraSl7bGV0IGU9dFtpXTtpZighU2UuZXhwb3J0cy5zdGFydHNXaXRoKGUscikpYnJlYWs7aWYoZS5sZW5ndGg+ci5sZW5ndGgmJmUuY2hhckF0KHIubGVuZ3RoKT09PUhHdCl7bltyXT1zV3Qocik7YnJlYWt9fX1yZXR1cm4gU2UuZXhwb3J0cy5lYWNoKGUsKHQ9Pnt0IGluIGkmJihuW3RdPXNXdCh0KSl9KSksbn0pKGgsYykscz1uZXcgcUd0O3JldHVybiBTZS5leHBvcnRzLmVhY2godCwodD0+e2xldCBuPWVbdC5uYW1lXXx8dC5uYW1lO3Mubm9kZXNbbl09dCx0Lm5hbWUgaW4gYSYmKHQub3V0RW1iZWRkaW5ncz1hW3QubmFtZV0sU2UuZXhwb3J0cy5lYWNoKHQub3V0RW1iZWRkaW5ncywodD0+e3QubmFtZT1lW3QubmFtZV18fHQubmFtZX0pKSksdC5uYW1lPW59KSksU2UuZXhwb3J0cy5lYWNoKHQsKHQ9PntTZS5leHBvcnRzLmVhY2godC5pbnB1dHMsKChpLGEpPT57bGV0IGw9aS5uYW1lO2lmKGwgaW4gcil7bGV0IGk9cltsXTt0LmluRW1iZWRkaW5ncy5wdXNoKGkpO2ZvcihsZXQgciBvZiBpLmlucHV0cylpV3QocyxlW3IubmFtZV18fHIubmFtZSx0LHIsbixhKX1lbHNlIGlmKGwgaW4gbyl7bGV0IHI9b1tsXTtmb3IobGV0IG8gb2Ygci5pbnB1dHMpaVd0KHMsZVtvLm5hbWVdfHxvLm5hbWUsdCxpLG4sYSl9ZWxzZSBpV3QocyxlW2xdfHxsLHQsaSxuLGEpfSkpfSkpLFNlLmV4cG9ydHMuZWFjaChyLCgodCxuKT0+e3QubmFtZT1lW3QubmFtZV18fHQubmFtZX0pKSxzfSksaSxfR3QuQlVJTERfU0xJTV9HUkFQSCkpKX0pKHQscld0LGwpfSksKCgpPT57dGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgR3JhcGhEZWYuIFRoaXMgY2FuIHNvbWV0aW1lcyBiZSBjYXVzZWQgYnkgYSBiYWQgbmV0d29yayBjb25uZWN0aW9uIG9yIGRpZmZpY3VsdHkgcmVjb25jaWxpbmcgbXVsdGlwbGUgR3JhcGhEZWZzOyBmb3IgdGhlIGxhdHRlciBjYXNlLCBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvaXNzdWVzLzE5MjkuIil9KSkudGhlbigodD0+bih0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpeyEoZnVuY3Rpb24gZSh0LG4pe2lmKG51bGw9PT1uKXRocm93IG5ldyBFcnJvcigiQ29tcGF0aWJpbGl0eSBwcm92aWRlciByZXF1aXJlZCwgYnV0IGdvdDogIituKTtTZS5leHBvcnRzLmVhY2godC5ub2RlcywodD0+e3QuY29tcGF0aWJsZT1uLm9wVmFsaWQodCksU2UuZXhwb3J0cy5lYWNoKHQuaW5FbWJlZGRpbmdzLCh0PT57dC5jb21wYXRpYmxlPW4ub3BWYWxpZCh0KX0pKSxTZS5leHBvcnRzLmVhY2godC5vdXRFbWJlZGRpbmdzLCh0PT57dC5jb21wYXRpYmxlPW4ub3BWYWxpZCh0KX0pKX0pKX0pKHQsbyk7Y29uc3Qgbj15aWVsZCBGcXQodCxhLGMpO3JldHVybiBUR3Qoe3RpbWluZ0lkOl9HdC5HUkFQSF9MT0FEX1NVQ0NFRURFRCxldmVudFZhbHVlOkRhdGUubm93KCktdX0pLHtncmFwaDp0LGdyYXBoSGllcmFyY2h5Om59fSkpKSkuY2F0Y2goKGU9Pnt0aHJvdyB0LnJlcG9ydEVycm9yKGBHcmFwaCB2aXN1YWxpemF0aW9uIGZhaWxlZC5cblxuJHtlfWAsZSksVEd0KHt0aW1pbmdJZDpfR3QuR1JBUEhfTE9BRF9GQUlMRUQsZXZlbnRWYWx1ZTpEYXRlLm5vdygpLXV9KSxlfSkpfSkoQUd0KHRoaXMpLHQsZSx0aGlzLmNvbXBhdGliaWxpdHlQcm92aWRlcix0aGlzLmhpZXJhcmNoeVBhcmFtcykudGhlbihmdW5jdGlvbih7Z3JhcGg6dCxncmFwaEhpZXJhcmNoeTplfSl7dGhpcy5fc2V0T3V0R3JhcGgodCksdGhpcy5fc2V0T3V0R3JhcGhIaWVyYXJjaHkoZSl9LmJpbmQodGhpcykpfV9zZWxlY3RlZEZpbGVDaGFuZ2VkKCl7dmFyIHQ9dGhpcy5zZWxlY3RlZEZpbGU7aWYoIXQpcmV0dXJuO2NvbnN0IGU9dC50YXJnZXQsbj1lLmZpbGVzWzBdO24mJihlLnZhbHVlPSIiLHRoaXMuX2ZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgobnVsbCxuKSl9fTt0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0scFl0LnByb3RvdHlwZSwiZGF0YXNldHMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHBZdC5wcm90b3R5cGUsInByb2dyZXNzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHBZdC5wcm90b3R5cGUsInNlbGVjdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxwWXQucHJvdG90eXBlLCJzZWxlY3RlZEZpbGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0scFl0LnByb3RvdHlwZSwiY29tcGF0aWJpbGl0eVByb3ZpZGVyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHBZdC5wcm90b3R5cGUsImhpZXJhcmNoeVBhcmFtcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsRHF0KV0scFl0LnByb3RvdHlwZSwib3V0R3JhcGhIaWVyYXJjaHkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLHFHdCldLHBZdC5wcm90b3R5cGUsIm91dEdyYXBoIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxwWXQucHJvdG90eXBlLCJvdXRTdGF0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxwWXQucHJvdG90eXBlLCJfZ3JhcGhSdW5UYWciLHZvaWQgMCksdChbYSgic2VsZWN0aW9uIiwiY29tcGF0aWJpbGl0eVByb3ZpZGVyIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxwWXQucHJvdG90eXBlLCJfc2VsZWN0aW9uQ2hhbmdlZCIsbnVsbCksdChbYSgic2VsZWN0ZWRGaWxlIiwiY29tcGF0aWJpbGl0eVByb3ZpZGVyIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxwWXQucHJvdG90eXBlLCJfc2VsZWN0ZWRGaWxlQ2hhbmdlZCIsbnVsbCkscFl0PXQoW2koInRmLWdyYXBoLWRhc2hib2FyZC1sb2FkZXIiKV0scFl0KTtsZXQgZll0PWNsYXNzIGV4dGVuZHMoZXIoeWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fZGF0YXNldHM9W10sdGhpcy5fZGF0YXNldHNGZXRjaGVkPSExLHRoaXMuX3NlbGVjdGVkRGF0YXNldD0wLHRoaXMuX3JlcXVlc3RNYW5hZ2VyPW5ldyBkcix0aGlzLl9jYW5jZWxsZXI9bmV3IFhSLHRoaXMuc3BlY2lmaWNIZWFsdGhQaWxsU3RlcD0wLHRoaXMuaGVhbHRoUGlsbHNUb2dnbGVkT249ITEsdGhpcy5fZGVidWdnZXJOdW1lcmljQWxlcnRzPVtdLHRoaXMuX25vZGVOYW1lc1RvSGVhbHRoUGlsbHM9e30sdGhpcy5faGVhbHRoUGlsbFJlcXVlc3RJZD0xLHRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVyRGVsYXk9NTAwLHRoaXMucnVuPVJzKCJydW4iLHtkZWZhdWx0VmFsdWU6IiIsdXNlTG9jYWxTdG9yYWdlOiExfSkuY2FsbCh0aGlzKSx0aGlzLl9ydW5PYnNlcnZlcj1PcygicnVuIix7ZGVmYXVsdFZhbHVlOiIiLHBvbHltZXJQcm9wZXJ0eToicnVuIix1c2VMb2NhbFN0b3JhZ2U6ITF9KX1hdHRhY2hlZCgpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITApfWRldGFjaGVkKCl7dGhpcy5zZXQoIl9pc0F0dGFjaGVkIiwhMSl9cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigibm9kZS10b2dnbGUtZXhwYW5kIix0aGlzLl9oYW5kbGVOb2RlVG9nZ2xlRXhwYW5kLmJpbmQodGhpcykpfXJlbG9hZCgpe3RoaXMuX2RlYnVnZ2VyRGF0YUVuYWJsZWR8fHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoX3IoKS5wbHVnaW5zTGlzdGluZygpKS50aGVuKHRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZSgodD0+e3QuY2FuY2VsbGVkfHx0LnZhbHVlLmRlYnVnZ2VyJiZ0aGlzLnNldCgiX2RlYnVnZ2VyRGF0YUVuYWJsZWQiLCEwKX0pKSksdGhpcy5fbWF5YmVGZXRjaEhlYWx0aFBpbGxzKCl9X2ZpdCgpe3RoaXMuJCQoIiNncmFwaGJvYXJkIikuZml0KCl9X29uRG93bmxvYWRJbWFnZVJlcXVlc3RlZCh0KXt0aGlzLiQkKCIjZ3JhcGhib2FyZCIpLmRvd25sb2FkQXNJbWFnZSh0LmRldGFpbCl9X2dldEdyYXBoRGlzcGxheUNsYXNzTmFtZSh0LGUpe3JldHVybiB0fHxlLmxlbmd0aD8iIjoibm8tZ3JhcGgifV9mZXRjaERhdGFzZXQoKXtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChfcigpLnBsdWdpblJvdXRlKCJncmFwaHMiLCIvaW5mbyIpKX1fZmV0Y2hIZWFsdGhQaWxscyh0LGUpe2NvbnN0IG49e25vZGVfbmFtZXM6SlNPTi5zdHJpbmdpZnkodCkscnVuOiJfX2RlYnVnZ2VyX2RhdGFfXyJ9O3ZvaWQgMCE9PWUmJihuLnN0ZXA9ZSk7Y29uc3QgaT1fcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9oZWFsdGhfcGlsbHMiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChpLG4pfV9mZXRjaERlYnVnZ2VyTnVtZXJpY3NBbGVydHMoKXtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChfcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9udW1lcmljc19hbGVydF9yZXBvcnQiKSl9X2dyYXBoVXJsKHQsZSxuKXtyZXR1cm4gX3IoKS5wbHVnaW5Sb3V0ZSgiZ3JhcGhzIiwiL2dyYXBoIixuZXcgVVJMU2VhcmNoUGFyYW1zKHtydW46dCxsaW1pdF9hdHRyX3NpemU6ZSxsYXJnZV9hdHRyc19rZXk6bn0pKX1fc2hvdWxkUmVxdWVzdEhlYWx0aFBpbGxzKCl7cmV0dXJuIHRoaXMuX2RlYnVnZ2VyRGF0YUVuYWJsZWQmJnRoaXMuaGVhbHRoUGlsbHNUb2dnbGVkT24mJnRoaXMuX3JlbmRlckhpZXJhcmNoeSYmdGhpcy5fZGF0YXNldHNTdGF0ZSh0aGlzLl9kYXRhc2V0c0ZldGNoZWQsdGhpcy5fZGF0YXNldHMsIlBSRVNFTlQiKX1fbWF5YmVJbml0aWFsaXplRGFzaGJvYXJkKCl7IXRoaXMuX2luaXRpYWxpemVkJiZ0aGlzLl9pc0F0dGFjaGVkJiYodGhpcy5zZXQoIl9jb21wYXRpYmlsaXR5UHJvdmlkZXIiLG5ldyBsWXQpLHRoaXMuX2luaXRpYWxpemVkPSEwLHRoaXMuX2ZldGNoRGF0YXNldCgpLnRoZW4oKHQ9Pntjb25zdCBlPU9iamVjdC5rZXlzKHQpO3RoaXMuX2RhdGFzZXRzPWUuc29ydChucikubWFwKChlPT57Y29uc3Qgbj10W2VdLGk9T2JqZWN0LmtleXMobi50YWdzKS5zb3J0KG5yKS5tYXAoKHQ9Pm4udGFnc1t0XSkpLm1hcCgoKHt0YWc6dCxjb25jZXB0dWFsX2dyYXBoOmUsb3BfZ3JhcGg6bixwcm9maWxlOml9KT0+KHt0YWc6dCxkaXNwbGF5TmFtZTp0LGNvbmNlcHR1YWxHcmFwaDplLG9wR3JhcGg6bixwcm9maWxlOml9KSkpO3JldHVybntuYW1lOmUsdGFnczpuLnJ1bl9ncmFwaD9be3RhZzpudWxsLGRpc3BsYXlOYW1lOiJEZWZhdWx0Iixjb25jZXB0dWFsR3JhcGg6ITEsb3BHcmFwaDohMCxwcm9maWxlOiExfSwuLi5pXTppfX0pKSx0aGlzLl9kYXRhc2V0c0ZldGNoZWQ9ITB9KSkpfV9kZXRlcm1pbmVTZWxlY3RlZERhdGFzZXQoKXt2YXIgdD10aGlzLl9kYXRhc2V0c0ZldGNoZWQsZT10aGlzLl9kYXRhc2V0cyxuPXRoaXMucnVuO2lmKCFuKXJldHVybiB2b2lkIHRoaXMuc2V0KCJfc2VsZWN0ZWREYXRhc2V0IiwwKTtjb25zdCBpPWUuZmluZEluZGV4KCh0PT50Lm5hbWU9PT1uKSk7aWYoLTEhPT1pKXRoaXMuc2V0KCJfc2VsZWN0ZWREYXRhc2V0IixpKTtlbHNlIGlmKHQpe2NvbnN0IHQ9dGhpcy4kJCgiI2Vycm9yLWRpYWxvZyIpO3QudGV4dENvbnRlbnQ9YE5vIGRhdGFzZXQgbmFtZWQgIiR7bn0iIGNvdWxkIGJlIGZvdW5kLmAsdC5vcGVuKCl9fV91cGRhdGVTZWxlY3RlZERhdGFzZXROYW1lKCl7dmFyIHQ9dGhpcy5fZGF0YXNldHMsZT10aGlzLl9zZWxlY3RlZERhdGFzZXQ7dGhpcy5fZGF0YXNldHNGZXRjaGVkJiYodC5sZW5ndGg8PWV8fHRoaXMuc2V0KCJydW4iLHRbZV0ubmFtZSkpfV9yZXF1ZXN0SGVhbHRoUGlsbHMoKXt0aGlzLnNldCgiX2FyZUhlYWx0aFBpbGxzTG9hZGluZyIsITApO3ZhciB0PSsrdGhpcy5faGVhbHRoUGlsbFJlcXVlc3RJZDtudWxsIT09dGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZCksdGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZD1udWxsKSx0aGlzLmFsbFN0ZXBzTW9kZUVuYWJsZWQ/dGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZD1udWxsLHRoaXMuX2luaXRpYXRlTmV0d29ya1JlcXVlc3RGb3JIZWFsdGhQaWxscyh0KX0uYmluZCh0aGlzKSx0aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lckRlbGF5KTp0aGlzLl9pbml0aWF0ZU5ldHdvcmtSZXF1ZXN0Rm9ySGVhbHRoUGlsbHModCl9X2luaXRpYXRlTmV0d29ya1JlcXVlc3RGb3JIZWFsdGhQaWxscyh0KXtpZih0aGlzLl9oZWFsdGhQaWxsUmVxdWVzdElkIT09dClyZXR1cm47Y29uc3QgZT10aGlzLmFsbFN0ZXBzTW9kZUVuYWJsZWQ/dGhpcy5zcGVjaWZpY0hlYWx0aFBpbGxTdGVwOnZvaWQgMCxuPXRoaXMuX2ZldGNoSGVhbHRoUGlsbHModGhpcy5fcmVuZGVySGllcmFyY2h5LmdldE5hbWVzT2ZSZW5kZXJlZE9wcygpLGUpLGk9dGhpcy5fZmV0Y2hEZWJ1Z2dlck51bWVyaWNzQWxlcnRzKCk7UHJvbWlzZS5hbGwoW24saV0pLnRoZW4oZnVuY3Rpb24oZSl7dmFyIG49ZVswXSxpPWVbMV07aWYodGhpcy5oZWFsdGhQaWxsc1RvZ2dsZWRPbiYmdD09PXRoaXMuX2hlYWx0aFBpbGxSZXF1ZXN0SWQpe2Zvcih2YXIgciBpbiBuKXt0aGlzLnNldCgiX2hlYWx0aFBpbGxTdGVwSW5kZXgiLG5bcl0ubGVuZ3RoLTEpO2JyZWFrfXRoaXMuc2V0KCJfZGVidWdnZXJOdW1lcmljQWxlcnRzIixpKSx0aGlzLnNldCgiX25vZGVOYW1lc1RvSGVhbHRoUGlsbHMiLG4pLHRoaXMuc2V0KCJfYXJlSGVhbHRoUGlsbHNMb2FkaW5nIiwhMSksdGhpcy5zZXQoIl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkIixudWxsKX19LmJpbmQodGhpcykpfV9kYXRhc2V0c1N0YXRlKHQsZSxuKXtyZXR1cm4gdD9lJiZlLmxlbmd0aD8iUFJFU0VOVCI9PT1uOiJFTVBUWSI9PT1uOiJOT1RfTE9BREVEIj09PW59X3JlbmRlckhpZXJhcmNoeUNoYW5nZWQodCl7dGhpcy5yZWxvYWQoKX1faGFuZGxlTm9kZVRvZ2dsZUV4cGFuZCgpe3RoaXMuX21heWJlRmV0Y2hIZWFsdGhQaWxscygpfV9oZWFsdGhQaWxsc1RvZ2dsZWRPbkNoYW5nZWQodCl7dD90aGlzLnJlbG9hZCgpOnRoaXMuc2V0KCJfbm9kZU5hbWVzVG9IZWFsdGhQaWxscyIse30pfV9tYXliZUZldGNoSGVhbHRoUGlsbHMoKXt0aGlzLl9zaG91bGRSZXF1ZXN0SGVhbHRoUGlsbHMoKSYmdGhpcy5fcmVxdWVzdEhlYWx0aFBpbGxzKCl9fTtmWXQudGVtcGxhdGU9X2VgCiAgICA8cGFwZXItZGlhbG9nIGlkPSJlcnJvci1kaWFsb2ciIHdpdGgtYmFja2Ryb3A+PC9wYXBlci1kaWFsb2c+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPHRmLWdyYXBoLWNvbnRyb2xzCiAgICAgICAgaWQ9ImNvbnRyb2xzIgogICAgICAgIGNsYXNzPSJzaWRlYmFyIgogICAgICAgIHNsb3Q9InNpZGViYXIiCiAgICAgICAgZGV2aWNlcy1mb3Itc3RhdHM9Int7X2RldmljZXNGb3JTdGF0c319IgogICAgICAgIGNvbG9yLWJ5LXBhcmFtcz0iW1tfY29sb3JCeVBhcmFtc11dIgogICAgICAgIHN0YXRzPSJbW19zdGF0c11dIgogICAgICAgIGNvbG9yLWJ5PSJ7e19jb2xvckJ5fX0iCiAgICAgICAgZGF0YXNldHM9IltbX2RhdGFzZXRzXV0iCiAgICAgICAgcmVuZGVyLWhpZXJhcmNoeT0iW1tfcmVuZGVySGllcmFyY2h5XV0iCiAgICAgICAgc2VsZWN0aW9uPSJ7e19zZWxlY3Rpb259fSIKICAgICAgICBzZWxlY3RlZC1maWxlPSJ7e19zZWxlY3RlZEZpbGV9fSIKICAgICAgICBzZWxlY3RlZC1ub2RlPSJ7e19zZWxlY3RlZE5vZGV9fSIKICAgICAgICBoZWFsdGgtcGlsbHMtZmVhdHVyZS1lbmFibGVkPSJbW19kZWJ1Z2dlckRhdGFFbmFibGVkXV0iCiAgICAgICAgaGVhbHRoLXBpbGxzLXRvZ2dsZWQtb249Int7aGVhbHRoUGlsbHNUb2dnbGVkT259fSIKICAgICAgICBvbi1maXQtdGFwPSJfZml0IgogICAgICAgIHRyYWNlLWlucHV0cz0ie3tfdHJhY2VJbnB1dHN9fSIKICAgICAgICBhdXRvLWV4dHJhY3Qtbm9kZXM9Int7X2F1dG9FeHRyYWN0Tm9kZXN9fSIKICAgICAgICBvbi1kb3dubG9hZC1pbWFnZS1yZXF1ZXN0ZWQ9Il9vbkRvd25sb2FkSW1hZ2VSZXF1ZXN0ZWQiCiAgICAgID48L3RmLWdyYXBoLWNvbnRyb2xzPgogICAgICA8ZGl2CiAgICAgICAgY2xhc3MkPSJjZW50ZXIgW1tfZ2V0R3JhcGhEaXNwbGF5Q2xhc3NOYW1lKF9zZWxlY3RlZEZpbGUsIF9kYXRhc2V0cyldXSIKICAgICAgICBzbG90PSJjZW50ZXIiCiAgICAgID4KICAgICAgICA8dGYtZ3JhcGgtZGFzaGJvYXJkLWxvYWRlcgogICAgICAgICAgaWQ9ImxvYWRlciIKICAgICAgICAgIGRhdGFzZXRzPSJbW19kYXRhc2V0c11dIgogICAgICAgICAgc2VsZWN0aW9uPSJbW19zZWxlY3Rpb25dXSIKICAgICAgICAgIHNlbGVjdGVkLWZpbGU9IltbX3NlbGVjdGVkRmlsZV1dIgogICAgICAgICAgb3V0LWdyYXBoLWhpZXJhcmNoeT0ie3tfZ3JhcGhIaWVyYXJjaHl9fSIKICAgICAgICAgIG91dC1ncmFwaD0ie3tfZ3JhcGh9fSIKICAgICAgICAgIG91dC1zdGF0cz0ie3tfc3RhdHN9fSIKICAgICAgICAgIHByb2dyZXNzPSJ7e19wcm9ncmVzc319IgogICAgICAgICAgaGllcmFyY2h5LXBhcmFtcz0iW1tfaGllcmFyY2h5UGFyYW1zXV0iCiAgICAgICAgICBjb21wYXRpYmlsaXR5LXByb3ZpZGVyPSJbW19jb21wYXRpYmlsaXR5UHJvdmlkZXJdXSIKICAgICAgICA+PC90Zi1ncmFwaC1kYXNoYm9hcmQtbG9hZGVyPgogICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtbWVzc2FnZSI+CiAgICAgICAgICA8aDM+Tm8gZ3JhcGggZGVmaW5pdGlvbiBmaWxlcyB3ZXJlIGZvdW5kLjwvaDM+CiAgICAgICAgICA8cD4KICAgICAgICAgICAgVG8gc3RvcmUgYSBncmFwaCwgY3JlYXRlIGEKICAgICAgICAgICAgPGNvZGU+dGYuc3VtbWFyeS5GaWxlV3JpdGVyPC9jb2RlPgogICAgICAgICAgICBhbmQgcGFzcyB0aGUgZ3JhcGggZWl0aGVyIHZpYSB0aGUgY29uc3RydWN0b3IsIG9yIGJ5IGNhbGxpbmcgaXRzCiAgICAgICAgICAgIDxjb2RlPmFkZF9ncmFwaCgpPC9jb2RlPiBtZXRob2QuIFlvdSBtYXkgd2FudCB0byBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL3RlbnNvcmJvYXJkL2dyYXBocyIKICAgICAgICAgICAgICA+ZXhhbWluaW5nIHRoZSBUZW5zb3JGbG93IGdyYXBoIHR1dG9yaWFsPC9hCiAgICAgICAgICAgID4uCiAgICAgICAgICA8L3A+CgogICAgICAgICAgPHA+CiAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvIGFkZAogICAgICAgICAgICBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICA8YQogICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIKICAgICAgICAgICAgICA+UkVBRE1FPC9hCiAgICAgICAgICAgID4KICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCIKICAgICAgICAgICAgICA+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2EKICAgICAgICAgICAgPi4KICAgICAgICAgIDwvcD4KCiAgICAgICAgICA8cD4KICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgPGEKICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIgogICAgICAgICAgICAgID50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hCiAgICAgICAgICAgID4KICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICA8L3A+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iZ3JhcGhib2FyZCI+CiAgICAgICAgICA8dGYtZ3JhcGgtYm9hcmQKICAgICAgICAgICAgaWQ9ImdyYXBoYm9hcmQiCiAgICAgICAgICAgIGRldmljZXMtZm9yLXN0YXRzPSJbW19kZXZpY2VzRm9yU3RhdHNdXSIKICAgICAgICAgICAgY29sb3ItYnk9Int7X2NvbG9yQnl9fSIKICAgICAgICAgICAgY29sb3ItYnktcGFyYW1zPSJ7e19jb2xvckJ5UGFyYW1zfX0iCiAgICAgICAgICAgIGdyYXBoLWhpZXJhcmNoeT0iW1tfZ3JhcGhIaWVyYXJjaHldXSIKICAgICAgICAgICAgZ3JhcGg9IltbX2dyYXBoXV0iCiAgICAgICAgICAgIGhpZXJhcmNoeS1wYXJhbXM9IltbX2hpZXJhcmNoeVBhcmFtc11dIgogICAgICAgICAgICBwcm9ncmVzcz0iW1tfcHJvZ3Jlc3NdXSIKICAgICAgICAgICAgZGVidWdnZXItZGF0YS1lbmFibGVkPSJbW19kZWJ1Z2dlckRhdGFFbmFibGVkXV0iCiAgICAgICAgICAgIGFyZS1oZWFsdGgtcGlsbHMtbG9hZGluZz0iW1tfYXJlSGVhbHRoUGlsbHNMb2FkaW5nXV0iCiAgICAgICAgICAgIGRlYnVnZ2VyLW51bWVyaWMtYWxlcnRzPSJbW19kZWJ1Z2dlck51bWVyaWNBbGVydHNdXSIKICAgICAgICAgICAgbm9kZS1uYW1lcy10by1oZWFsdGgtcGlsbHM9IltbX25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIKICAgICAgICAgICAgYWxsLXN0ZXBzLW1vZGUtZW5hYmxlZD0ie3thbGxTdGVwc01vZGVFbmFibGVkfX0iCiAgICAgICAgICAgIHNwZWNpZmljLWhlYWx0aC1waWxsLXN0ZXA9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19IgogICAgICAgICAgICBoZWFsdGgtcGlsbC1zdGVwLWluZGV4PSJbW19oZWFsdGhQaWxsU3RlcEluZGV4XV0iCiAgICAgICAgICAgIHJlbmRlci1oaWVyYXJjaHk9Int7X3JlbmRlckhpZXJhcmNoeX19IgogICAgICAgICAgICBzZWxlY3RlZC1ub2RlPSJ7e19zZWxlY3RlZE5vZGV9fSIKICAgICAgICAgICAgc3RhdHM9IltbX3N0YXRzXV0iCiAgICAgICAgICAgIHRyYWNlLWlucHV0cz0iW1tfdHJhY2VJbnB1dHNdXSIKICAgICAgICAgICAgYXV0by1leHRyYWN0LW5vZGVzPSJbW19hdXRvRXh0cmFjdE5vZGVzXV0iCiAgICAgICAgICA+PC90Zi1ncmFwaC1ib2FyZD4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IC9kZWVwLyB7CiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8nLCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAuc2lkZWJhciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5jZW50ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWRpYWxvZyB7CiAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgfQoKICAgICAgLm5vLWRhdGEtbWVzc2FnZSB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KCiAgICAgIC5ncmFwaGJvYXJkIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5uby1ncmFwaCAuZ3JhcGhib2FyZCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLmNlbnRlcjpub3QoLm5vLWdyYXBoKSAubm8tZGF0YS1tZXNzYWdlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICBhIHsKICAgICAgICBjb2xvcjogdmFyKC0tdGItbGluayk7CiAgICAgIH0KCiAgICAgIGE6dmlzaXRlZCB7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLWxpbmstdmlzaXRlZCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sZll0LnByb3RvdHlwZSwiX2RhdGFzZXRzIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sZll0LnByb3RvdHlwZSwiX2RhdGFzZXRzRmV0Y2hlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxmWXQucHJvdG90eXBlLCJfc2VsZWN0ZWREYXRhc2V0Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfcmVuZGVySGllcmFyY2h5Q2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIseVd0KV0sZll0LnByb3RvdHlwZSwiX3JlbmRlckhpZXJhcmNoeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixkcildLGZZdC5wcm90b3R5cGUsIl9yZXF1ZXN0TWFuYWdlciIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixYUildLGZZdC5wcm90b3R5cGUsIl9jYW5jZWxsZXIiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxmWXQucHJvdG90eXBlLCJfZGVidWdnZXJEYXRhRW5hYmxlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGZZdC5wcm90b3R5cGUsImFsbFN0ZXBzTW9kZUVuYWJsZWQiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sZll0LnByb3RvdHlwZSwic3BlY2lmaWNIZWFsdGhQaWxsU3RlcCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9oZWFsdGhQaWxsc1RvZ2dsZWRPbkNoYW5nZWQifSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxmWXQucHJvdG90eXBlLCJoZWFsdGhQaWxsc1RvZ2dsZWRPbiIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sZll0LnByb3RvdHlwZSwic2VsZWN0ZWROb2RlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sZll0LnByb3RvdHlwZSwiX2lzQXR0YWNoZWQiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxmWXQucHJvdG90eXBlLCJfaW5pdGlhbGl6ZWQiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxmWXQucHJvdG90eXBlLCJfYXJlSGVhbHRoUGlsbHNMb2FkaW5nIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXksbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sZll0LnByb3RvdHlwZSwiX2RlYnVnZ2VyTnVtZXJpY0FsZXJ0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxmWXQucHJvdG90eXBlLCJfbm9kZU5hbWVzVG9IZWFsdGhQaWxscyIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxmWXQucHJvdG90eXBlLCJfaGVhbHRoUGlsbFN0ZXBJbmRleCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxmWXQucHJvdG90eXBlLCJfaGVhbHRoUGlsbFJlcXVlc3RJZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxmWXQucHJvdG90eXBlLCJfaGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxmWXQucHJvdG90eXBlLCJfaGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJEZWxheSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sZll0LnByb3RvdHlwZSwicnVucyIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9ydW5PYnNlcnZlciJ9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sZll0LnByb3RvdHlwZSwicnVuIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGZZdC5wcm90b3R5cGUsIl9zZWxlY3Rpb24iLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sZll0LnByb3RvdHlwZSwiX2NvbXBhdGliaWxpdHlQcm92aWRlciIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGZZdC5wcm90b3R5cGUsIl90cmFjZUlucHV0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGZZdC5wcm90b3R5cGUsIl9hdXRvRXh0cmFjdE5vZGVzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGZZdC5wcm90b3R5cGUsIl9zZWxlY3RlZEZpbGUiLHZvaWQgMCksdChbYSgiX2lzQXR0YWNoZWQiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGZZdC5wcm90b3R5cGUsIl9tYXliZUluaXRpYWxpemVEYXNoYm9hcmQiLG51bGwpLHQoW2EoIl9kYXRhc2V0c0ZldGNoZWQiLCJfZGF0YXNldHMiLCJydW4iKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGZZdC5wcm90b3R5cGUsIl9kZXRlcm1pbmVTZWxlY3RlZERhdGFzZXQiLG51bGwpLHQoW2EoIl9kYXRhc2V0c0ZldGNoZWQiLCJfZGF0YXNldHMiLCJfc2VsZWN0ZWREYXRhc2V0IiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxmWXQucHJvdG90eXBlLCJfdXBkYXRlU2VsZWN0ZWREYXRhc2V0TmFtZSIsbnVsbCksZll0PXQoW2koInRmLWdyYXBoLWRhc2hib2FyZCIpXSxmWXQpO2NvbnN0IG1ZdD1MTjtsZXQgZ1l0PWNsYXNzIGV4dGVuZHMoZXIoaWwoeWUpKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMubW9kZT0ib2Zmc2V0Iix0aGlzLnRpbWVQcm9wZXJ0eT0ic3RlcCIsdGhpcy5iaW5zPSJiaW5zIix0aGlzLng9IngiLHRoaXMuZHg9ImR4Iix0aGlzLnk9InkiLHRoaXMuY29sb3JTY2FsZT1tWXQuc2NhbGVPcmRpbmFsKG1ZdC5zY2hlbWVDYXRlZ29yeTEwKSx0aGlzLm1vZGVUcmFuc2l0aW9uRHVyYXRpb249NTAwLHRoaXMuX25hbWU9bnVsbCx0aGlzLl9kYXRhPW51bGx9cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5zdmcsITApfWF0dGFjaGVkKCl7dGhpcy5fYXR0YWNoZWQ9ITB9ZGV0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMX1zZXRTZXJpZXNEYXRhKHQsZSl7dGhpcy5fbmFtZT10LHRoaXMuX2RhdGE9ZSx0aGlzLnJlZHJhdygpfV9yZWRyYXdPbkNoYW5nZSgpe3RoaXMucmVkcmF3KCl9cmVkcmF3KCl7dGhpcy5fZHJhdygwKX1fbW9kZVJlZHJhdygpe3RoaXMuX2RyYXcodGhpcy5tb2RlVHJhbnNpdGlvbkR1cmF0aW9uKX1fZHJhdyh0KXtpZighdGhpcy5fYXR0YWNoZWR8fCF0aGlzLl9kYXRhKXJldHVybjtpZih2b2lkIDA9PT10KXRocm93IG5ldyBFcnJvcigidnotaGlzdG9ncmFtLXRpbWVzZXJpZXMgX2RyYXcgbmVlZHMgZHVyYXRpb24iKTtpZih0aGlzLl9kYXRhLmxlbmd0aDw9MCl0aHJvdyBuZXcgRXJyb3IoIk5vdCBlbm91Z2ggc3RlcHMgaW4gdGhlIGRhdGEiKTtpZighdGhpcy5fZGF0YVswXS5oYXNPd25Qcm9wZXJ0eSh0aGlzLmJpbnMpKXRocm93IG5ldyBFcnJvcigiTm8gYmlucyBwcm9wZXJ0eSBvZiAnIit0aGlzLmJpbnMrIicgaW4gZGF0YSIpO2lmKHRoaXMuX2RhdGFbMF1bdGhpcy5iaW5zXS5sZW5ndGg8PTApdGhyb3cgbmV3IEVycm9yKCJNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGJpbiBpbiBiaW5zIGluIGRhdGEiKTtpZighdGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdWzBdLmhhc093blByb3BlcnR5KHRoaXMueCkpdGhyb3cgbmV3IEVycm9yKCJObyB4IHByb3BlcnR5ICciK3RoaXMueCsiJyBvbiBiaW5zIGRhdGEiKTtpZighdGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdWzBdLmhhc093blByb3BlcnR5KHRoaXMuZHgpKXRocm93IG5ldyBFcnJvcigiTm8gZHggcHJvcGVydHkgJyIrdGhpcy5keCsiJyBvbiBiaW5zIGRhdGEiKTtpZighdGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdWzBdLmhhc093blByb3BlcnR5KHRoaXMueSkpdGhyb3cgbmV3IEVycm9yKCJObyB5IHByb3BlcnR5ICciK3RoaXMueSsiJyBvbiBiaW5zIGRhdGEiKTt2YXIgZT10aGlzLnRpbWVQcm9wZXJ0eSxuPXRoaXMueCxpPXRoaXMuYmlucyxyPXRoaXMuZHgsbz10aGlzLnksYT10aGlzLl9kYXRhLHM9dGhpcy5tb2RlLGw9bVl0LmhjbCh0aGlzLmNvbG9yU2NhbGUodGhpcy5fbmFtZSkpLGM9bVl0LnNlbGVjdCh0aGlzLiQudG9vbHRpcCksdT1mdW5jdGlvbih0KXtyZXR1cm4gdFtuXX0saD1mdW5jdGlvbih0KXtyZXR1cm4gdFtvXX0sZD1mdW5jdGlvbih0KXtyZXR1cm4gdFtuXSt0W3JdfSxwPWZ1bmN0aW9uKHQpe3JldHVybiB0W2VdfTsicmVsYXRpdmUiPT09ZSYmKHA9ZnVuY3Rpb24odCl7cmV0dXJuIHQud2FsbF90aW1lLWFbMF0ud2FsbF90aW1lfSk7dmFyIGYsbT10aGlzLiQuc3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGc9bS53aWR0aCxfPW0uaGVpZ2h0LHk9e3RvcDo1LHJpZ2h0OjYwLGJvdHRvbToyMCxsZWZ0OjI0fTsib2Zmc2V0Ij09PXM/eS50b3A9NSsoZj1fLzIuNSk6Zj1fLXkudG9wLXkuYm90dG9tO3ZhciB2PWcteS5sZWZ0LXkucmlnaHQsYj1fLXkudG9wLXkuYm90dG9tO21ZdC5taW4oYSx1KSxtWXQubWF4KGEsZCk7dmFyIHg9bVl0LmZvcm1hdCgiLjNuIiksdz1tWXQuZm9ybWF0KCIuMGYiKTsid2FsbF90aW1lIj09PWU/dz1tWXQudGltZUZvcm1hdCgiJW0vJWQgJVgiKToicmVsYXRpdmUiPT09ZSYmKHc9ZnVuY3Rpb24odCl7cmV0dXJuIG1ZdC5mb3JtYXQoIi4xciIpKHQvMzZlNSkrImgifSk7dmFyIFM9YS5tYXAoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuW21ZdC5taW4odFtpXSx1KSxtWXQubWF4KHRbaV0sZCldfSkpLE09YS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBtWXQuZXh0ZW50KHRbaV0saCl9KSksRT01MDAsVD1tWXQuZXh0ZW50KGEscCksQz0oIndhbGxfdGltZSI9PT1lP21ZdC5zY2FsZVRpbWUoKTptWXQuc2NhbGVMaW5lYXIoKSkuZG9tYWluKFQpLnJhbmdlKFswLCJvZmZzZXQiPT09cz9iOjBdKSxBPW1ZdC5zY2FsZUxpbmVhcigpLmRvbWFpbihbMCxtWXQubWF4KGEsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1bZV1bMV19KSldKS5yYW5nZShbZiwwXSksaz1tWXQuc2NhbGVMaW5lYXIoKS5kb21haW4oQS5kb21haW4oKSkucmFuZ2UoW0UsMF0pLEw9bVl0LnNjYWxlTGluZWFyKCkuZG9tYWluKFttWXQubWluKGEsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIFNbZV1bMF19KSksbVl0Lm1heChhLChmdW5jdGlvbih0LGUpe3JldHVybiBTW2VdWzFdfSkpXSkubmljZSgpLnJhbmdlKFswLHZdKSxQPW1ZdC5zY2FsZUxpbmVhcigpLmRvbWFpbihMLmRvbWFpbigpKS5yYW5nZShbMCxFXSk7Y29uc3QgTj1tWXQuc2NhbGVMaW5lYXIoKS5kb21haW4obVl0LmV4dGVudChhLHApKS5yYW5nZShbbC5icmlnaHRlcigpLGwuZGFya2VyKCldKS5pbnRlcnBvbGF0ZShtWXQuaW50ZXJwb2xhdGVIY2wpO3ZhciBJPW1ZdC5heGlzQm90dG9tKEwpLnRpY2tzKE1hdGgubWF4KDIsdi8yMCkpLFI9bVl0LmF4aXNSaWdodChDKS50aWNrcyhNYXRoLm1heCgyLGIvMTUpKS50aWNrRm9ybWF0KHcpLE89bVl0LmF4aXNSaWdodChBKS50aWNrcyhNYXRoLm1heCgyLGIvMTUpKS50aWNrU2l6ZSh2KzUpLnRpY2tGb3JtYXQoeCksej1mdW5jdGlvbih0KXtyZXR1cm4gdFtuXSt0W3JdLzJ9LEQ9bVl0LmxpbmUoKS54KChmdW5jdGlvbih0KXtyZXR1cm4gUCh6KHQpKX0pKS55KChmdW5jdGlvbih0KXtyZXR1cm4gayh0W29dKX0pKSxCPXRoaXMuJC5zdmcsSD1tWXQuc2VsZWN0KEIpLEY9SC50cmFuc2l0aW9uKCkuZHVyYXRpb24odCksVj1ILnNlbGVjdCgiZyIpLmNsYXNzZWQoInNtYWxsIiwoZnVuY3Rpb24oKXtyZXR1cm4gdj4wJiZ2PD0xNTB9KSkuY2xhc3NlZCgibWVkaXVtIiwoZnVuY3Rpb24oKXtyZXR1cm4gdj4xNTAmJnY8PTMwMH0pKS5jbGFzc2VkKCJsYXJnZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIHY+MzAwfSkpLFU9Ri5zZWxlY3QoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit5LmxlZnQrIiwiK3kudG9wKyIpIiksaj1tWXQuYmlzZWN0b3IoZCkubGVmdCxHPVYuc2VsZWN0KCIuc3RhZ2UiKS5vbigibW91c2VvdmVyIiwoZnVuY3Rpb24oKXtKLnN0eWxlKCJvcGFjaXR5IiwxKSxldC5zdHlsZSgib3BhY2l0eSIsMSkscnQuc3R5bGUoIm9wYWNpdHkiLDEpLHN0LnN0eWxlKCJvcGFjaXR5IiwxKSxjLnN0eWxlKCJvcGFjaXR5IiwxKX0pKS5vbigibW91c2VvdXQiLChmdW5jdGlvbigpe0ouc3R5bGUoIm9wYWNpdHkiLDApLGV0LnN0eWxlKCJvcGFjaXR5IiwwKSxydC5zdHlsZSgib3BhY2l0eSIsMCksc3Quc3R5bGUoIm9wYWNpdHkiLDApLEouY2xhc3NlZCgiaG92ZXItY2xvc2VzdCIsITEpLEsuY2xhc3NlZCgib3V0bGluZS1ob3ZlciIsITEpLGMuc3R5bGUoIm9wYWNpdHkiLDApfSkpLm9uKCJtb3VzZW1vdmUiLChmdW5jdGlvbiBXKCl7dmFyIHQsYT1tWXQubW91c2UodGhpcyksbD1MLmludmVydChhWzBdKTtmdW5jdGlvbiB1KHQpe3JldHVybiBNYXRoLm1pbih0W2ldLmxlbmd0aC0xLGoodFtpXSxsKSl9Qy5pbnZlcnQoYVsxXSk7dmFyIGgsZD0xLzA7Si5hdHRyKCJ0cmFuc2Zvcm0iLChmdW5jdGlvbihlLGwpe3ZhciBjPXUoZSk7aD1lO3ZhciBtPUwoZVtpXVtjXVtuXStlW2ldW2NdW3JdLzIpLGc9QShlW2ldW2NdW29dKSxfPSJvZmZzZXQiPT09cz9DKHAoZSkpLShmLWcpOmcseT1NYXRoLmFicyhhWzFdLV8pO3JldHVybiB5PGQmJihkPXksdD1lKSwidHJhbnNsYXRlKCIrbSsiLCIrZysiKSJ9KSksSi5zZWxlY3QoInRleHQiKS50ZXh0KChmdW5jdGlvbih0KXt2YXIgZT11KHQpO3JldHVybiB0W2ldW2VdW29dfSkpLEouY2xhc3NlZCgiaG92ZXItY2xvc2VzdCIsKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dH0pKSxLLmNsYXNzZWQoIm91dGxpbmUtaG92ZXIiLChmdW5jdGlvbihlKXtyZXR1cm4gZT09PXR9KSk7dmFyIG09dShoKTtldC5hdHRyKCJ0cmFuc2Zvcm0iLChmdW5jdGlvbih0KXtyZXR1cm4idHJhbnNsYXRlKCIrTChoW2ldW21dW25dK2hbaV1bbV1bcl0vMikrIiwgIitiKyIpIn0pKS5zZWxlY3QoInRleHQiKS50ZXh0KChmdW5jdGlvbih0KXtyZXR1cm4geChoW2ldW21dW25dK2hbaV1bbV1bcl0vMil9KSk7dmFyIGc9Ui50aWNrRm9ybWF0KCk7cnQuYXR0cigidHJhbnNmb3JtIiwoZnVuY3Rpb24oZSl7cmV0dXJuInRyYW5zbGF0ZSgiK3YrIiwgIisoIm9mZnNldCI9PT1zP0MocCh0KSk6MCkrIikifSkpLnN0eWxlKCJkaXNwbGF5Iiwib2Zmc2V0Ij09PXM/IiI6Im5vbmUiKS5zZWxlY3QoInRleHQiKS50ZXh0KChmdW5jdGlvbihlKXtyZXR1cm4gZyhwKHQpKX0pKTt2YXIgXz1PLnRpY2tGb3JtYXQoKTtzdC5hdHRyKCJ0cmFuc2Zvcm0iLChmdW5jdGlvbihlKXtyZXR1cm4idHJhbnNsYXRlKCIrdisiLCAiKygib2Zmc2V0Ij09PXM/MDpBKHRbaV1bbV1bb10pKSsiKSJ9KSkuc3R5bGUoImRpc3BsYXkiLCJvZmZzZXQiPT09cz8ibm9uZSI6IiIpLnNlbGVjdCgidGV4dCIpLnRleHQoKGZ1bmN0aW9uKGUpe3JldHVybiBfKHRbaV1bbV1bb10pfSkpO3ZhciB5PW1ZdC5tb3VzZShCKTtjLnN0eWxlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIisoeVswXSsxNSkrInB4LCIrKHlbMV0tMTUpKyJweCkiKS5zZWxlY3QoInNwYW4iKS50ZXh0KCJvZmZzZXQiPT09cz9fKHRbaV1bbV1bb10pOigic3RlcCI9PT1lPyJzdGVwICI6IiIpK2cocCh0KSkpfSkpO0cuc2VsZWN0KCIuYmFja2dyb3VuZCIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiKy15LmxlZnQrIiwiKy15LnRvcCsiKSIpLmF0dHIoIndpZHRoIixnKS5hdHRyKCJoZWlnaHQiLF8pO3ZhciBxPUcuc2VsZWN0QWxsKCIuaGlzdG9ncmFtIikuZGF0YShhKTtxLmV4aXQoKS5yZW1vdmUoKTt2YXIgWT1xLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJoaXN0b2dyYW0iKSxYPVkubWVyZ2UocSkuc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gcCh0KS1wKGUpfSkpLCQ9VS5zZWxlY3RBbGwoIi5oaXN0b2dyYW0iKS5hdHRyKCJ0cmFuc2Zvcm0iLChmdW5jdGlvbih0KXtyZXR1cm4idHJhbnNsYXRlKDAsICIrKCJvZmZzZXQiPT09cz9DKHAodCkpLWY6MCkrIikifSkpO1kuYXBwZW5kKCJsaW5lIikuYXR0cigiY2xhc3MiLCJiYXNlbGluZSIpLCQuc2VsZWN0KCIuYmFzZWxpbmUiKS5zdHlsZSgic3Ryb2tlLW9wYWNpdHkiLChmdW5jdGlvbih0KXtyZXR1cm4ib2Zmc2V0Ij09PXM/LjE6MH0pKS5hdHRyKCJ5MSIsZikuYXR0cigieTIiLGYpLmF0dHIoIngyIix2KSxZLmFwcGVuZCgicGF0aCIpLmF0dHIoImNsYXNzIiwib3V0bGluZSIpO3ZhciBLPVguc2VsZWN0KCIub3V0bGluZSIpLmF0dHIoInZlY3Rvci1lZmZlY3QiLCJub24tc2NhbGluZy1zdHJva2UiKS5hdHRyKCJkIiwoZnVuY3Rpb24odCl7cmV0dXJuKGZ1bmN0aW9uKHQpe3JldHVybiJNIitQKHoodFswXSkpKyIsIitrKDApKyJMIitEKHQpLnNsaWNlKDEpKyJMIitQKHoodFt0Lmxlbmd0aC0xXSkpKyIsIitrKDApfSkodFtpXSl9KSkuc3R5bGUoInN0cm9rZS13aWR0aCIsMSk7JC5zZWxlY3QoIi5vdXRsaW5lIikuYXR0cigidHJhbnNmb3JtIiwic2NhbGUoIit2L0UrIiwgIitmL0UrIikiKS5zdHlsZSgic3Ryb2tlIiwoZnVuY3Rpb24odCl7cmV0dXJuIm9mZnNldCI9PT1zPyIiOk4ocCh0KSl9KSkuc3R5bGUoImZpbGwtb3BhY2l0eSIsKGZ1bmN0aW9uKHQpe3JldHVybiJvZmZzZXQiPT09cz8xOjB9KSkuc3R5bGUoImZpbGwiLChmdW5jdGlvbih0KXtyZXR1cm4gTihwKHQpKX0pKTt2YXIgWj1ZLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwiaG92ZXIiKSxKPVguc2VsZWN0KCIuaG92ZXIiKS5zdHlsZSgiZmlsbCIsKGZ1bmN0aW9uKHQpe3JldHVybiBOKHAodCkpfSkpO1ouYXBwZW5kKCJjaXJjbGUiKS5hdHRyKCJyIiwyKSxaLmFwcGVuZCgidGV4dCIpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLmF0dHIoImR4Iiw0KTt2YXIgUT1WLnNlbGVjdCgiLngtYXhpcy1ob3ZlciIpLnNlbGVjdEFsbCgiLmxhYmVsIikuZGF0YShbIngiXSksdHQ9US5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibGFiZWwiKSxldD1RLm1lcmdlKHR0KTt0dC5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtMjApLmF0dHIoInkiLDYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCksdHQuYXBwZW5kKCJsaW5lIikuYXR0cigieDEiLDApLmF0dHIoIngyIiwwKS5hdHRyKCJ5MSIsMCkuYXR0cigieTIiLDYpLHR0LmFwcGVuZCgidGV4dCIpLmF0dHIoImR5IiwxOCk7dmFyIG50PVYuc2VsZWN0KCIueS1heGlzLWhvdmVyIikuc2VsZWN0QWxsKCIubGFiZWwiKS5kYXRhKFsieSJdKSxpdD1udC5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibGFiZWwiKSxydD1udC5tZXJnZShpdCk7aXQuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsOCkuYXR0cigieSIsLTYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCksaXQuYXBwZW5kKCJsaW5lIikuYXR0cigieDEiLDApLmF0dHIoIngyIiw2KS5hdHRyKCJ5MSIsMCkuYXR0cigieTIiLDApLGl0LmFwcGVuZCgidGV4dCIpLmF0dHIoImR4Iiw4KS5hdHRyKCJkeSIsNCk7dmFyIG90PVYuc2VsZWN0KCIueS1zbGljZS1heGlzLWhvdmVyIikuc2VsZWN0QWxsKCIubGFiZWwiKS5kYXRhKFsieSJdKSxhdD1vdC5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibGFiZWwiKSxzdD1vdC5tZXJnZShhdCk7YXQuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsOCkuYXR0cigieSIsLTYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCksYXQuYXBwZW5kKCJsaW5lIikuYXR0cigieDEiLDApLmF0dHIoIngyIiw2KS5hdHRyKCJ5MSIsMCkuYXR0cigieTIiLDApLGF0LmFwcGVuZCgidGV4dCIpLmF0dHIoImR4Iiw4KS5hdHRyKCJkeSIsNCksVS5zZWxlY3QoIi55LmF4aXMuc2xpY2UiKS5zdHlsZSgib3BhY2l0eSIsIm9mZnNldCI9PT1zPzA6MSkuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDAsICIrKCJvZmZzZXQiPT09cz8tZjowKSsiKSIpLmNhbGwoTyksVS5zZWxlY3QoIi54LmF4aXMiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwgIitiKyIpIikuY2FsbChJKSxVLnNlbGVjdCgiLnkuYXhpcyIpLnN0eWxlKCJvcGFjaXR5Iiwib2Zmc2V0Ij09PXM/MTowKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit2KyIsICIrKCJvZmZzZXQiPT09cz8wOmIpKyIpIikuY2FsbChSKSxVLnNlbGVjdEFsbCgiLnRpY2sgdGV4dCIpLmF0dHIoImZpbGwiLCIjYWFhIiksVS5zZWxlY3RBbGwoIi5heGlzIHBhdGguZG9tYWluIikuYXR0cigic3Ryb2tlIiwibm9uZSIpfX07ZnVuY3Rpb24gX1l0KHQpe2NvbnN0W2UsbixpXT10O3JldHVybnt3YWxsX3RpbWU6ZSxzdGVwOm4sbWluOllsKGkubWFwKCgoW3QsLF0pPT50KSkpLG1heDpXbChpLm1hcCgoKFssdF0pPT50KSkpLGJ1Y2tldHM6aS5tYXAoKChbdCxlLG5dKT0+KHtsZWZ0OnQscmlnaHQ6ZSxjb3VudDpufSkpKX19ZnVuY3Rpb24geVl0KHQsZSxuLGk9MzApe249PT1lJiYobj0xLjEqZSsxLGU9ZS8xLjEtMSk7Y29uc3Qgcj0obi1lKS9pO2xldCBvPTA7cmV0dXJuIHpsKGUsbixyKS5tYXAoKGk9Pntjb25zdCBhPWkrcjtsZXQgcz0wO2Zvcig7bzx0LmJ1Y2tldHMubGVuZ3RoOyl7Y29uc3Qgcj1NYXRoLm1pbihuLHQuYnVja2V0c1tvXS5yaWdodCksbD1NYXRoLm1heChlLHQuYnVja2V0c1tvXS5sZWZ0KSxjPU1hdGgubWluKHIsYSktTWF0aC5tYXgobCxpKSx1PWMvKHItbCkqdC5idWNrZXRzW29dLmNvdW50O2lmKHMrPWM+MD91OjAscj5hKWJyZWFrO28rK31yZXR1cm57eDppLGR4OnIseTpzfX0pKX1nWXQudGVtcGxhdGU9X2VgCiAgICA8ZGl2IGlkPSJ0b29sdGlwIj48c3Bhbj48L3NwYW4+PC9kaXY+CiAgICA8c3ZnIGlkPSJzdmciPgogICAgICA8Zz4KICAgICAgICA8ZyBjbGFzcz0iYXhpcyB4Ij48L2c+CiAgICAgICAgPGcgY2xhc3M9ImF4aXMgeSI+PC9nPgogICAgICAgIDxnIGNsYXNzPSJheGlzIHkgc2xpY2UiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0ic3RhZ2UiPgogICAgICAgICAgPHJlY3QgY2xhc3M9ImJhY2tncm91bmQiPjwvcmVjdD4KICAgICAgICA8L2c+CiAgICAgICAgPGcgY2xhc3M9IngtYXhpcy1ob3ZlciI+PC9nPgogICAgICAgIDxnIGNsYXNzPSJ5LWF4aXMtaG92ZXIiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0ieS1zbGljZS1heGlzLWhvdmVyIj48L2c+CiAgICAgIDwvZz4KICAgIDwvc3ZnPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGNvbG9yOiAjYWFhOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIC0tdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMtaG92ZXItYmctY29sb3I6ICNmZmY7CiAgICAgICAgLS12ei1oaXN0b2dyYW0tdGltZXNlcmllcy1vdXRsaW5lLWNvbG9yOiAjZmZmOwogICAgICAgIC0tdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMtaG92ZXItb3V0bGluZS1jb2xvcjogIzAwMDsKICAgICAgfQoKICAgICAgOmhvc3QoLmRhcmstbW9kZSkgewogICAgICAgIC0tdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMtaG92ZXItYmctY29sb3I6IHZhcigKICAgICAgICAgIC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yCiAgICAgICAgKTsKICAgICAgICAtLXZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzLW91dGxpbmUtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNjAwKTsKICAgICAgICAtLXZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzLWhvdmVyLW91dGxpbmUtY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgIHN2ZyB7CiAgICAgICAgZm9udC1mYW1pbHk6IHJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgIH0KCiAgICAgIHRleHQgewogICAgICAgIGZpbGw6IGN1cnJlbnRDb2xvcjsKICAgICAgfQoKICAgICAgI3Rvb2x0aXAgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgfQoKICAgICAgLmJhY2tncm91bmQgewogICAgICAgIGZpbGwtb3BhY2l0eTogMDsKICAgICAgICBmaWxsOiByZWQ7CiAgICAgIH0KCiAgICAgIC5oaXN0b2dyYW0gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAuaG92ZXIgewogICAgICAgIGZvbnQtc2l6ZTogOXB4OwogICAgICAgIGRvbWluYW50LWJhc2VsaW5lOiBtaWRkbGU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmhvdmVyIGNpcmNsZSB7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMC41OwogICAgICAgIHN0cm9rZS13aWR0aDogMXB4OwogICAgICB9CgogICAgICAuaG92ZXIgdGV4dCB7CiAgICAgICAgZmlsbDogYmxhY2s7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmhvdmVyLmhvdmVyLWNsb3Nlc3QgY2lyY2xlIHsKICAgICAgICBmaWxsOiB2YXIoLS12ei1oaXN0b2dyYW0tdGltZXNlcmllcy1ob3Zlci1vdXRsaW5lLWNvbG9yKSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaG92ZXIuaG92ZXItY2xvc2VzdCB0ZXh0IHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAuYmFzZWxpbmUgewogICAgICAgIHN0cm9rZTogYmxhY2s7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuMTsKICAgICAgfQoKICAgICAgLm91dGxpbmUgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiB2YXIoLS12ei1oaXN0b2dyYW0tdGltZXNlcmllcy1vdXRsaW5lLWNvbG9yKTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAub3V0bGluZS5vdXRsaW5lLWhvdmVyIHsKICAgICAgICBzdHJva2U6IHZhcigtLXZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzLWhvdmVyLW91dGxpbmUtY29sb3IpICFpbXBvcnRhbnQ7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIsCiAgICAgIC55LWF4aXMtaG92ZXIsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIC5sYWJlbCwKICAgICAgLnktYXhpcy1ob3ZlciAubGFiZWwsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgLmxhYmVsIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB0ZXh0LWFuY2hvcjogZW5kOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIHRleHQgewogICAgICAgIHRleHQtYW5jaG9yOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIC55LWF4aXMtaG92ZXIgdGV4dCwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciB0ZXh0IHsKICAgICAgICB0ZXh0LWFuY2hvcjogc3RhcnQ7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIgbGluZSwKICAgICAgLnktYXhpcy1ob3ZlciBsaW5lLAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIGxpbmUgewogICAgICAgIHN0cm9rZTogY3VycmVudENvbG9yOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIHJlY3QsCiAgICAgIC55LWF4aXMtaG92ZXIgcmVjdCwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciByZWN0IHsKICAgICAgICBmaWxsOiB2YXIoLS12ei1oaXN0b2dyYW0tdGltZXNlcmllcy1ob3Zlci1iZy1jb2xvcik7CiAgICAgIH0KCiAgICAgICN0b29sdGlwLAogICAgICAueC1heGlzLWhvdmVyIHRleHQsCiAgICAgIC55LWF4aXMtaG92ZXIgdGV4dCwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciB0ZXh0IHsKICAgICAgICBjb2xvcjogdmFyKC0tdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMtaG92ZXItb3V0bGluZS1jb2xvcik7CiAgICAgIH0KCiAgICAgIC5heGlzIHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgIH0KCiAgICAgIC5heGlzIHBhdGguZG9tYWluIHsKICAgICAgICBmaWxsOiBub25lOwogICAgICB9CgogICAgICAuYXhpcyAudGljayBsaW5lIHsKICAgICAgICBzdHJva2U6ICNkZGQ7CiAgICAgIH0KCiAgICAgIC5heGlzLnNsaWNlIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICB9CgogICAgICAuYXhpcy5zbGljZSAudGljayBsaW5lIHsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiAyOwogICAgICB9CgogICAgICAuc21hbGwgLmF4aXMgdGV4dCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAuc21hbGwgLmF4aXMgLnRpY2s6Zmlyc3Qtb2YtdHlwZSB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAuc21hbGwgLmF4aXMgLnRpY2s6bGFzdC1vZi10eXBlIHRleHQgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5tZWRpdW0gLmF4aXMgdGV4dCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAubWVkaXVtIC5heGlzIC50aWNrOm50aC1jaGlsZCgybiArIDEpIHRleHQgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5sYXJnZSAuYXhpcyB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIC5sYXJnZSAuYXhpcyAudGljazpudGgtY2hpbGQoMm4gKyAxKSB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGdZdC5wcm90b3R5cGUsIm1vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sZ1l0LnByb3RvdHlwZSwidGltZVByb3BlcnR5Iix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGdZdC5wcm90b3R5cGUsImJpbnMiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sZ1l0LnByb3RvdHlwZSwieCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxnWXQucHJvdG90eXBlLCJkeCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxnWXQucHJvdG90eXBlLCJ5Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGdZdC5wcm90b3R5cGUsImNvbG9yU2NhbGUiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sZ1l0LnByb3RvdHlwZSwibW9kZVRyYW5zaXRpb25EdXJhdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGdZdC5wcm90b3R5cGUsIl9hdHRhY2hlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxnWXQucHJvdG90eXBlLCJfbmFtZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sZ1l0LnByb3RvdHlwZSwiX2RhdGEiLHZvaWQgMCksdChbYSgidGltZVByb3BlcnR5IiwiY29sb3JTY2FsZSIsIl9hdHRhY2hlZCIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sZ1l0LnByb3RvdHlwZSwiX3JlZHJhd09uQ2hhbmdlIixudWxsKSx0KFthKCJtb2RlIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxnWXQucHJvdG90eXBlLCJfbW9kZVJlZHJhdyIsbnVsbCksZ1l0PXQoW2koInZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIildLGdZdCk7bGV0IHZZdD1jbGFzcyBleHRlbmRzKExUdChlcih5ZSkpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5nZXREYXRhTG9hZE5hbWU9KHtydW46dH0pPT50LHRoaXMucmVxdWVzdERhdGE9KHQsZSxuKT0+e2NvbnN0IGk9X3IoKS5wbHVnaW5Sb3V0ZSgiaGlzdG9ncmFtcyIsIi9oaXN0b2dyYW1zIik7UHJvbWlzZS5hbGwodC5tYXAoKHQ9Pntjb25zdCBuPWlPKGkse3RhZzp0LnRhZyxydW46dC5ydW59KTtyZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KG4pLnRoZW4oKG49PntlKHtpdGVtOnQsZGF0YTpufSl9KSl9KSkpLmZpbmFsbHkoKCgpPT57bigpfSkpfSx0aGlzLmxvYWREYXRhQ2FsbGJhY2s9KHQsZSxuKT0+e2NvbnN0IGk9KGZ1bmN0aW9uIHIodCl7Y29uc3QgZT10Lm1hcChfWXQpLG49WWwoZSwodD0+dC5taW4pKSxpPVdsKGUsKHQ9PnQubWF4KSk7cmV0dXJuIGUubWFwKCh0PT4oe3dhbGxfdGltZTp0LndhbGxfdGltZSxzdGVwOnQuc3RlcCxiaW5zOnlZdCh0LG4saSl9KSkpfSkobiksbz10aGlzLmdldERhdGFMb2FkTmFtZShlKTt0aGlzLiQuY2hhcnQuc2V0U2VyaWVzRGF0YShvLGkpfSx0aGlzLl9jb2xvclNjYWxlRnVuY3Rpb249R1IsdGhpcy5fZXhwYW5kZWQ9ITF9X3JlbG9hZE9uUnVuVGFnUmVxdWVzdE1hbmFnZXJDaGFuZ2UoKXt0aGlzLnJlbG9hZCgpfV91cGRhdGVEYXRhVG9Mb2FkKCl7dGhpcy5kYXRhVG9Mb2FkPVt7cnVuOnRoaXMucnVuLHRhZzp0aGlzLnRhZ31dfWdldCBfcnVuQ29sb3IoKXtyZXR1cm4gdGhpcy5fY29sb3JTY2FsZUZ1bmN0aW9uKHRoaXMucnVuKX1yZWRyYXcoKXt0aGlzLiQuY2hhcnQucmVkcmF3KCl9X3RvZ2dsZUV4cGFuZGVkKHQpe3RoaXMuc2V0KCJfZXhwYW5kZWQiLCF0aGlzLl9leHBhbmRlZCksdGhpcy5yZWRyYXcoKX19O3ZZdC50ZW1wbGF0ZT1fZWAKICAgIDx0Zi1jYXJkLWhlYWRpbmcKICAgICAgdGFnPSJbW3RhZ11dIgogICAgICBydW49IltbcnVuXV0iCiAgICAgIGRpc3BsYXktbmFtZT0iW1t0YWdNZXRhZGF0YS5kaXNwbGF5TmFtZV1dIgogICAgICBkZXNjcmlwdGlvbj0iW1t0YWdNZXRhZGF0YS5kZXNjcmlwdGlvbl1dIgogICAgICBjb2xvcj0iW1tfcnVuQ29sb3JdXSIKICAgID48L3RmLWNhcmQtaGVhZGluZz4KICAgIDwhLS0KICAgICAgVGhlIG1haW4gaGlzdG9ncmFtIHRoYXQgd2UgcmVuZGVyLiBEYXRhIGlzIHNldCBkaXJlY3RseSB3aXRoCiAgICAgIFxgc2V0U2VyaWVzRGF0YVxgLCBub3Qgd2l0aCBhIGJvdW5kIHByb3BlcnR5LgogICAgLS0+CiAgICA8dnotaGlzdG9ncmFtLXRpbWVzZXJpZXMKICAgICAgaWQ9ImNoYXJ0IgogICAgICB0aW1lLXByb3BlcnR5PSJbW3RpbWVQcm9wZXJ0eV1dIgogICAgICBtb2RlPSJbW2hpc3RvZ3JhbU1vZGVdXSIKICAgICAgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVGdW5jdGlvbl1dIgogICAgPjwvdnotaGlzdG9ncmFtLXRpbWVzZXJpZXM+CiAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogcm93OyI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIKICAgICAgICBpY29uPSJmdWxsc2NyZWVuIgogICAgICAgIG9uLXRhcD0iX3RvZ2dsZUV4cGFuZGVkIgogICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHdpZHRoOiAzMzBweDsKICAgICAgICBoZWlnaHQ6IDIzNXB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDcwMHB4OwogICAgICAgIGhlaWdodDogNTAwcHg7CiAgICAgIH0KCiAgICAgIHZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIHsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICB0Zi1jYXJkLWhlYWRpbmcgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgICAgd2lkdGg6IDkwJTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHZZdC5wcm90b3R5cGUsInJ1biIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx2WXQucHJvdG90eXBlLCJ0YWciLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sdll0LnByb3RvdHlwZSwiZ2V0RGF0YUxvYWROYW1lIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLGRyKV0sdll0LnByb3RvdHlwZSwicmVxdWVzdE1hbmFnZXIiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sdll0LnByb3RvdHlwZSwibG9hZERhdGFDYWxsYmFjayIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSx2WXQucHJvdG90eXBlLCJ0YWdNZXRhZGF0YSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx2WXQucHJvdG90eXBlLCJ0aW1lUHJvcGVydHkiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sdll0LnByb3RvdHlwZSwiaGlzdG9ncmFtTW9kZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLHZZdC5wcm90b3R5cGUsIl9jb2xvclNjYWxlRnVuY3Rpb24iLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sdll0LnByb3RvdHlwZSwiX2V4cGFuZGVkIix2b2lkIDApLHQoW2EoInJ1biIsInRhZyIsInJlcXVlc3RNYW5hZ2VyIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSx2WXQucHJvdG90eXBlLCJfcmVsb2FkT25SdW5UYWdSZXF1ZXN0TWFuYWdlckNoYW5nZSIsbnVsbCksdChbYSgicnVuIiwidGFnIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSx2WXQucHJvdG90eXBlLCJfdXBkYXRlRGF0YVRvTG9hZCIsbnVsbCksdChbcygicnVuIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sdll0LnByb3RvdHlwZSwiX3J1bkNvbG9yIixudWxsKSx2WXQ9dChbaSgidGYtaGlzdG9ncmFtLWxvYWRlciIpXSx2WXQpO2xldCBiWXQ9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnJlbG9hZE9uUmVhZHk9ITAsdGhpcy5faGlzdG9ncmFtTW9kZT0ib2Zmc2V0Iix0aGlzLl90aW1lUHJvcGVydHk9InN0ZXAiLHRoaXMuX3Jlc3RhbXA9ITEsdGhpcy5fcmVxdWVzdE1hbmFnZXI9bmV3IGRyfV9yZWRyYXdDYXRlZ29yeVBhbmUodCxlKXtlJiZ0LnRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1oaXN0b2dyYW0tbG9hZGVyIikuZm9yRWFjaCgodD0+dC5yZWRyYXcoKSkpfXJlYWR5KCl7c3VwZXIucmVhZHkoKSx0aGlzLnJlbG9hZE9uUmVhZHkmJnRoaXMucmVsb2FkKCl9cmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKCk9Pnt0aGlzLl9yZWxvYWRIaXN0b2dyYW1zKCl9KSl9X2ZldGNoVGFncygpe2NvbnN0IHQ9X3IoKS5wbHVnaW5Sb3V0ZSgiaGlzdG9ncmFtcyIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodCkudGhlbigodD0+e2lmKFNlLmV4cG9ydHMuaXNFcXVhbCh0LHRoaXMuX3J1blRvVGFnSW5mbykpcmV0dXJuO2NvbnN0IGU9U2UuZXhwb3J0cy5tYXBWYWx1ZXModCwodD0+T2JqZWN0LmtleXModCkpKSxuPWFyKGUpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09bi5sZW5ndGgpLHRoaXMuc2V0KCJfcnVuVG9UYWciLGUpLHRoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIix0KSx0aGlzLmFzeW5jKCgoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KSl9KSl9X3JlbG9hZEhpc3RvZ3JhbXMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtaGlzdG9ncmFtLWxvYWRlciIpLmZvckVhY2goKHQ9Pnt0LnJlbG9hZCgpfSkpfV9zaG91bGRPcGVuKHQpe3JldHVybiB0PD0yfWdldCBfY2F0ZWdvcmllcygpe3JldHVybiBNcih0aGlzLl9ydW5Ub1RhZyx0aGlzLl9zZWxlY3RlZFJ1bnMsdGhpcy5fdGFnRmlsdGVyKX1fdGFnTWV0YWRhdGEodCxlLG4pe3JldHVybiB0W2VdW25dfX07ZnVuY3Rpb24geFl0KHQpe3JldHVybiIiIT09dC5kaXNwbGF5TmFtZSYmdm9pZCAwIT09dC5kaXNwbGF5TmFtZT90LmRpc3BsYXlOYW1lOnQubmFtZX1mdW5jdGlvbiB3WXQodCl7aWYoIiIhPT10LmRpc3BsYXlOYW1lJiZ2b2lkIDAhPT10LmRpc3BsYXlOYW1lKXJldHVybiB0LmRpc3BsYXlOYW1lO2xldCBlPXQubmFtZS5ncm91cCxuPXQubmFtZS50YWc7cmV0dXJuIHZvaWQgMD09PWUmJihlPSIiKSx2b2lkIDA9PT1uJiYobj0iIiksIiI9PT1lP246ZSsiLiIrbn1mdW5jdGlvbiBTWXQodCxlKXtyZXR1cm4gZTx0LmhwYXJhbUNvbHVtbnMubGVuZ3RoP3hZdCh0LmhwYXJhbUNvbHVtbnNbZV0uaHBhcmFtSW5mbyk6d1l0KHQubWV0cmljQ29sdW1uc1tlLXQuaHBhcmFtQ29sdW1ucy5sZW5ndGhdLm1ldHJpY0luZm8pfWZ1bmN0aW9uIE1ZdCh0KXtyZXR1cm4gdC5ocGFyYW1Db2x1bW5zLmxlbmd0aH1mdW5jdGlvbiBFWXQodCl7cmV0dXJuIHQubWV0cmljQ29sdW1ucy5sZW5ndGh9ZnVuY3Rpb24gVFl0KHQpe3JldHVybiBNWXQodCkrRVl0KHQpfWZ1bmN0aW9uIENZdCh0LGUpe3JldHVybiB0W2VdfWZ1bmN0aW9uIEFZdCh0LGUpe3JldHVybiB0LmZpbmQoKHQ9PlNlLmV4cG9ydHMuaXNFcXVhbCh0Lm5hbWUsZSkpKX1mdW5jdGlvbiBrWXQodCxlLG4pe3JldHVybiBlLmhwYXJhbXNbdC5ocGFyYW1Db2x1bW5zW25dLmhwYXJhbUluZm8ubmFtZV19ZnVuY3Rpb24gTFl0KHQsZSxuKXtjb25zdCBpPUFZdChlLm1ldHJpY1ZhbHVlcyx0Lm1ldHJpY0NvbHVtbnNbbl0ubWV0cmljSW5mby5uYW1lKTtyZXR1cm4gdm9pZCAwPT09aT92b2lkIDA6aS52YWx1ZX1mdW5jdGlvbiBQWXQodCxlLG4pe3JldHVybiBuPHQuaHBhcmFtQ29sdW1ucy5sZW5ndGg/a1l0KHQsZSxuKTpMWXQodCxlLG4tdC5ocGFyYW1Db2x1bW5zLmxlbmd0aCl9ZnVuY3Rpb24gTll0KHQsZSxuKXtyZXR1cm4gTGwoZSwoZT0+UFl0KHQsZSxuKSkpfWZ1bmN0aW9uIElZdCh0LGUsbil7bGV0IGk7aWYobjxlLmhwYXJhbUluZm9zLmxlbmd0aClpPXQuaHBhcmFtQ29sdW1ucy5maW5kSW5kZXgoKHQ9PnQuaHBhcmFtSW5mby5uYW1lPT09ZS5ocGFyYW1JbmZvc1tuXS5uYW1lKSk7ZWxzZXtjb25zdCByPWUubWV0cmljSW5mb3Nbbi1lLmhwYXJhbUluZm9zLmxlbmd0aF0ubmFtZTtpPXQuaHBhcmFtQ29sdW1ucy5sZW5ndGgrdC5tZXRyaWNDb2x1bW5zLmZpbmRJbmRleCgodD0+dC5tZXRyaWNJbmZvLm5hbWU9PT1yKSl9cmV0dXJuIGNvbnNvbGUuYXNzZXJ0KC0xIT09aSksaX1mdW5jdGlvbiBSWXQodCl7cmV0dXJuIHQuaHBhcmFtSW5mb3MubGVuZ3RofWZ1bmN0aW9uIE9ZdCh0KXtyZXR1cm4gdC5tZXRyaWNJbmZvcy5sZW5ndGh9ZnVuY3Rpb24gell0KHQsZSxuKXtyZXR1cm4gTGwoZSwoZT0+Rll0KHQsZSxuKSkpfWZ1bmN0aW9uIERZdCh0LGUpe3JldHVybiB0LmZpbmQoKHQ9PnQubmFtZT09PWUpKX1mdW5jdGlvbiBCWXQodCxlLG4pe3JldHVybiBlLmhwYXJhbXNbdC5ocGFyYW1JbmZvc1tuXS5uYW1lXX1mdW5jdGlvbiBIWXQodCxlLG4pe2NvbnN0IGk9QVl0KGUubWV0cmljVmFsdWVzLHQubWV0cmljSW5mb3Nbbl0ubmFtZSk7cmV0dXJuIHZvaWQgMD09PWk/dm9pZCAwOmkudmFsdWV9ZnVuY3Rpb24gRll0KHQsZSxuKXtyZXR1cm4gbjx0LmhwYXJhbUluZm9zLmxlbmd0aD9CWXQodCxlLG4pOkhZdCh0LGUsbi10LmhwYXJhbUluZm9zLmxlbmd0aCl9ZnVuY3Rpb24gVll0KHQpe3JldHVybiBTZS5leHBvcnRzLmlzTnVtYmVyKHQpP3QudG9QcmVjaXNpb24oNSk6dm9pZCAwPT09dD8iIjp0LnRvU3RyaW5nKCl9ZnVuY3Rpb24gVVl0KHQsZSl7cmV0dXJuIHQqdCtlKmV9ZnVuY3Rpb24gall0KHQsZSxuLGkpe3JldHVybiBNYXRoLnNxcnQoVVl0KHQtbixlLWkpKX1mdW5jdGlvbiBHWXQodCxlLG4saSxyLG8pe2lmKHQ8biYmZTxpKXJldHVybiBqWXQodCxlLG4saSk7aWYobjw9dCYmdDxyJiZlPGkpcmV0dXJuIGktZTtpZihyPD10JiZlPGkpcmV0dXJuIGpZdCh0LGUscixpKTtpZih0PG4mJmk8PWUmJmU8bylyZXR1cm4gbi10O2lmKG48PXQmJnQ8ciYmaTw9ZSYmZTxvKXJldHVybiAwO2lmKHI8PXQmJmk8PWUmJmU8bylyZXR1cm4gdC1yO2lmKHQ8biYmbzw9ZSlyZXR1cm4gall0KHQsZSxuLG8pO2lmKG48PXQmJnQ8ciYmbzw9ZSlyZXR1cm4gZS1vO2lmKHI8PXQmJm88PWUpcmV0dXJuIGpZdCh0LGUscixvKTt0aHJvdyJQb2ludCAoeCx5KSBtdXN0IGJlIGluIG9uZSBvZiB0aGUgcmVnaW9ucyBkZWZpbmVkIGFib3ZlLiJ9ZnVuY3Rpb24gV1l0KHQsZSl7cmV0dXJuIHZvaWQgMD09PWU/InRyYW5zbGF0ZSgiK3QrIikiOiJ0cmFuc2xhdGUoIit0KyIsIitlKyIpIn1mdW5jdGlvbiBxWXQodCxlLG4pe2NvbnN0IGk9dC5nZXQoZSx0KTtBcnJheS5pc0FycmF5KGkpP3Quc3BsaWNlLmFwcGx5KHQsW2UsMCxpLmxlbmd0aF0uY29uY2F0KG4pKTp0LnNldChlLG4pfWZ1bmN0aW9uIFlZdCh0KXtsZXQgZT0wO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7KytuKWU9MzEqZSt0LmNoYXJDb2RlQXQobikmNDI5NDk2NzI5NTtyZXR1cm4gZStNYXRoLnBvdygyLDMxKX1iWXQudGVtcGxhdGU9X2VgCiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZXR0aW5ncyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yCiAgICAgICAgICAgICAgaWQ9Imhpc3RvZ3JhbU1vZGVTZWxlY3RvciIKICAgICAgICAgICAgICBuYW1lPSJIaXN0b2dyYW0gbW9kZSIKICAgICAgICAgICAgICBzZWxlY3RlZC1pZD0ie3tfaGlzdG9ncmFtTW9kZX19IgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ib3ZlcmxheSI+b3ZlcmxheTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9Im9mZnNldCI+b2Zmc2V0PC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yCiAgICAgICAgICAgICAgaWQ9InRpbWVQcm9wZXJ0eVNlbGVjdG9yIgogICAgICAgICAgICAgIG5hbWU9Ik9mZnNldCB0aW1lIGF4aXMiCiAgICAgICAgICAgICAgc2VsZWN0ZWQtaWQ9Int7X3RpbWVQcm9wZXJ0eX19IgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9IndhbGxfdGltZSI+d2FsbDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBydW5zLXNlbGVjdG9yIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBoaXN0b2dyYW0gZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIFlvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgaGlzdG9ncmFtIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy4KICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIgogICAgICAgICAgICAgICAgPlJFQURNRTwvYQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCIKICAgICAgICAgICAgICAgID5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYQogICAgICAgICAgICAgID4uCiAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciCiAgICAgICAgICAgICAgICA+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3CiAgICAgICAgICAgICAgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIKICAgICAgICAgICAgICBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1oaXN0b2dyYW0tbG9hZGVyCiAgICAgICAgICAgICAgICAgIHJ1bj0iW1tpdGVtLnJ1bl1dIgogICAgICAgICAgICAgICAgICB0YWc9IltbaXRlbS50YWddXSIKICAgICAgICAgICAgICAgICAgYWN0aXZlPSJbW2FjdGl2ZV1dIgogICAgICAgICAgICAgICAgICB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVuLCBpdGVtLnRhZyldXSIKICAgICAgICAgICAgICAgICAgdGltZS1wcm9wZXJ0eT0iW1tfdGltZVByb3BlcnR5XV0iCiAgICAgICAgICAgICAgICAgIGhpc3RvZ3JhbS1tb2RlPSJbW19oaXN0b2dyYW1Nb2RlXV0iCiAgICAgICAgICAgICAgICAgIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgICAgICAgICAgID48L3RmLWhpc3RvZ3JhbS1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGJZdC5wcm90b3R5cGUsInJlbG9hZE9uUmVhZHkiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sYll0LnByb3RvdHlwZSwiX2hpc3RvZ3JhbU1vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sYll0LnByb3RvdHlwZSwiX3RpbWVQcm9wZXJ0eSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sYll0LnByb3RvdHlwZSwiX3NlbGVjdGVkUnVucyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxiWXQucHJvdG90eXBlLCJfcnVuVG9UYWciLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sYll0LnByb3RvdHlwZSwiX3J1blRvVGFnSW5mbyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGJZdC5wcm90b3R5cGUsIl9kYXRhTm90Rm91bmQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sYll0LnByb3RvdHlwZSwiX3RhZ0ZpbHRlciIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGJZdC5wcm90b3R5cGUsIl9yZXN0YW1wIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sYll0LnByb3RvdHlwZSwiX2NhdGVnb3JpZXNEb21SZWFkeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixkcildLGJZdC5wcm90b3R5cGUsIl9yZXF1ZXN0TWFuYWdlciIsdm9pZCAwKSx0KFtzKCJfcnVuVG9UYWciLCJfc2VsZWN0ZWRSdW5zIiwiX3RhZ0ZpbHRlciIsIl9jYXRlZ29yaWVzRG9tUmVhZHkiKSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLGJZdC5wcm90b3R5cGUsIl9jYXRlZ29yaWVzIixudWxsKSxiWXQ9dChbaSgidGYtaGlzdG9ncmFtLWRhc2hib2FyZCIpXSxiWXQpO3ZhciBYWXQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsaHBhcmFtTmFtZTp4WXQsbWV0cmljTmFtZTp3WXQsc2NoZW1hQ29sdW1uTmFtZTpTWXQsbnVtSFBhcmFtczpNWXQsbnVtTWV0cmljczpFWXQsbnVtQ29sdW1uczpUWXQsaHBhcmFtVmFsdWVCeU5hbWU6Q1l0LG1ldHJpY1ZhbHVlQnlOYW1lOkFZdCxocGFyYW1WYWx1ZUJ5SW5kZXg6a1l0LG1ldHJpY1ZhbHVlQnlJbmRleDpMWXQsY29sdW1uVmFsdWVCeUluZGV4OlBZdCxudW1lcmljQ29sdW1uRXh0ZW50Ok5ZdCxnZXRBYnNvbHV0ZUNvbHVtbkluZGV4OklZdCxzY2hlbWFWaXNpYmxlQ29sdW1uTmFtZTpmdW5jdGlvbiAkWXQodCxlKXtyZXR1cm4gZTx0LmhwYXJhbUluZm9zLmxlbmd0aD94WXQodC5ocGFyYW1JbmZvc1tlXSk6d1l0KHQubWV0cmljSW5mb3NbZS10LmhwYXJhbUluZm9zLmxlbmd0aF0pfSxudW1WaXNpYmxlSFBhcmFtczpSWXQsbnVtVmlzaWJsZU1ldHJpY3M6T1l0LG51bVZpc2libGVDb2x1bW5zOmZ1bmN0aW9uIEtZdCh0KXtyZXR1cm4gUll0KHQpK09ZdCh0KX0sdmlzaWJsZU51bWVyaWNDb2x1bW5FeHRlbnQ6ell0LHByZXR0eVByaW50SFBhcmFtVmFsdWVCeU5hbWU6ZnVuY3Rpb24gWll0KHQsZSl7cmV0dXJuIFZZdChDWXQodCxlKSl9LHByZXR0eVByaW50TWV0cmljVmFsdWVCeU5hbWU6ZnVuY3Rpb24gSll0KHQsZSl7cmV0dXJuIFZZdChBWXQodCxlKSl9LHNlc3Npb25Hcm91cFdpdGhOYW1lOkRZdCxocGFyYW1WYWx1ZUJ5VmlzaWJsZUluZGV4OkJZdCxtZXRyaWNWYWx1ZUJ5VmlzaWJsZUluZGV4OkhZdCxjb2x1bW5WYWx1ZUJ5VmlzaWJsZUluZGV4OkZZdCxwcmV0dHlQcmludDpWWXQsbDJOb3JtU3F1YXJlZDpVWXQsZXVjbGlkZWFuRGlzdDpqWXQscG9pbnRUb1JlY3RhbmdsZURpc3Q6R1l0LHRyYW5zbGF0ZVN0cjpXWXQscm90YXRlU3RyOmZ1bmN0aW9uIFFZdCh0LGUsbil7bGV0IGk9InJvdGF0ZSgiK3Q7cmV0dXJuIHZvaWQgMCE9PWUmJnZvaWQgMCE9PW4mJihpPWkrIiwiK2UrIiwiK24pLGkrPSIpIixpfSxpc051bGxPclVuZGVmaW5lZDpmdW5jdGlvbiB0WHQodCl7cmV0dXJuIG51bGw9PXR9LHF1YWRUcmVlVmlzaXRQb2ludHNJblJlY3Q6ZnVuY3Rpb24gZVh0KHQsZSxuLGkscixvKXt0LnZpc2l0KCgoYSxzLGwsYyx1KT0+e2lmKHZvaWQgMD09PWEubGVuZ3RoKXtkb3tjb25zdCBzPXQueCgpKGEuZGF0YSksbD10LnkoKShhLmRhdGEpO2U8PXMmJnM8aSYmbjw9bCYmbDxyJiZvKGEuZGF0YSl9d2hpbGUoYT1hLm5leHQpO3JldHVybiEwfXJldHVybiBzPj1pfHxjPD1lfHxsPj1yfHx1PD1ufSkpfSxxdWFkVHJlZVZpc2l0UG9pbnRzSW5EaXNrOmZ1bmN0aW9uIG5YdCh0LGUsbixpLHIpe3QudmlzaXQoKChvLGEscyxsLGMpPT57aWYodm9pZCAwPT09by5sZW5ndGgpe2Rve2NvbnN0IGE9dC54KCkoby5kYXRhKSxzPXQueSgpKG8uZGF0YSksbD1qWXQoZSxuLGEscyk7bDw9aSYmcihvLmRhdGEsbCl9d2hpbGUobz1vLm5leHQpO3JldHVybiEwfXJldHVybiBHWXQoZSxuLGEscyxsLGMpPml9KSl9LGZpbHRlclNldDpmdW5jdGlvbiBpWHQodCxlKXtjb25zdCBuPW5ldyBTZXQ7cmV0dXJuIHQuZm9yRWFjaCgodD0+e2UodCkmJm4uYWRkKHQpfSkpLG59LHNldEFycmF5T2JzZXJ2YWJseTpxWXQsaGFzaE9mU3RyaW5nOllZdH0pO2xldCByWHQ9Y2xhc3MgZXh0ZW5kcyB5ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5vcmllbnRhdGlvbj0iaG9yaXpvbnRhbCJ9fTtyWHQudGVtcGxhdGU9X2VgCiAgICA8c2xvdCBuYW1lPSJjb250ZW50Ij48L3Nsb3Q+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0IHNsb3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICA6aG9zdCA6OnNsb3R0ZWQoKikgewogICAgICAgIGZsZXg6IDAgMCBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgc2xvdCB7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbb3JpZW50YXRpb249J3ZlcnRpY2FsJ10pIHNsb3QgewogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgOmhvc3QgOjpzbG90dGVkKCo6bm90KDpsYXN0LWNoaWxkKSkgewogICAgICAgIGJvcmRlcjogMCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCAjY2NjKTsKICAgICAgfQoKICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSd2ZXJ0aWNhbCddKSA6OnNsb3R0ZWQoKjpub3QoOmxhc3QtY2hpbGQpKSB7CiAgICAgICAgYm9yZGVyLWJvdHRvbS13aWR0aDogNXB4OwogICAgICB9CgogICAgICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgOjpzbG90dGVkKCo6bm90KDpsYXN0LWNoaWxkKSkgewogICAgICAgIGJvcmRlci1yaWdodC13aWR0aDogNXB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpTdHJpbmcscmVmbGVjdFRvQXR0cmlidXRlOiEwfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHJYdC5wcm90b3R5cGUsIm9yaWVudGF0aW9uIix2b2lkIDApLHJYdD10KFtpKCJocGFyYW1zLXNwbGl0LWxheW91dCIpXSxyWHQpO2xldCBvWHQ9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvbmZpZ3VyYXRpb249e3NjaGVtYTp7aHBhcmFtQ29sdW1uczpbXSxtZXRyaWNDb2x1bW5zOltdfSxjb2x1bW5zVmlzaWJpbGl0eTpbXSx2aXNpYmxlU2NoZW1hOntocGFyYW1JbmZvczpbXSxtZXRyaWNJbmZvczpbXX19LHRoaXMuc2Vzc2lvbkdyb3Vwcz1bXSx0aGlzLmRhdGFMb2FkZWRXaXRoTm9uRW1wdHlIcGFyYW1zPSExLHRoaXMuZGF0YUxvYWRlZFdpdGhFbXB0eUhwYXJhbXM9ITEsdGhpcy5fc3RhdHVzZXM9W3t2YWx1ZToiU1RBVFVTX1VOS05PV04iLGRpc3BsYXlOYW1lOiJVbmtub3duIixhbGxvd2VkOiEwfSx7dmFsdWU6IlNUQVRVU19TVUNDRVNTIixkaXNwbGF5TmFtZToiU3VjY2VzcyIsYWxsb3dlZDohMH0se3ZhbHVlOiJTVEFUVVNfRkFJTFVSRSIsZGlzcGxheU5hbWU6IkZhaWx1cmUiLGFsbG93ZWQ6ITB9LHt2YWx1ZToiU1RBVFVTX1JVTk5JTkciLGRpc3BsYXlOYW1lOiJSdW5uaW5nIixhbGxvd2VkOiEwfV0sdGhpcy5fZ2V0RXhwZXJpbWVudFJlc29sdmVkPW5ldyBQcm9taXNlKCh0PT57dGhpcy5fcmVzb2x2ZUdldEV4cGVyaW1lbnQ9dH0pKSx0aGlzLl9saXN0U2Vzc2lvbkdyb3Vwc0NhbmNlbGxlcj1uZXcgWFIsdGhpcy5fcGFnZVNpemVJbnB1dD17dmFsdWU6IjEwMCIsaW52YWxpZDohMX0sdGhpcy5fcGFnZU51bWJlcklucHV0PXt2YWx1ZToiMSIsaW52YWxpZDohMX0sdGhpcy5fcGFnZUNvdW50U3RyPSI/Iix0aGlzLl9ocGFyYW1OYW1lPXhZdCx0aGlzLl9tZXRyaWNOYW1lPXdZdCx0aGlzLl9wcmV0dHlQcmludD1WWXR9cmVsb2FkKCl7dGhpcy5fcXVlcnlTZXJ2ZXIoKX1fY3N2VXJsKHQsZSl7cmV0dXJuIHRoaXMuX2Rvd25sb2FkRGF0YVVybCh0LGUsImNzdiIpfV9qc29uVXJsKHQsZSl7cmV0dXJuIHRoaXMuX2Rvd25sb2FkRGF0YVVybCh0LGUsImpzb24iKX1fbGF0ZXhVcmwodCxlKXtyZXR1cm4gdGhpcy5fZG93bmxvYWREYXRhVXJsKHQsZSwibGF0ZXgiKX1fZG93bmxvYWREYXRhVXJsKHQsZSxuKXtyZXR1cm4gdGhpcy5iYWNrZW5kLmdldERvd25sb2FkVXJsKG4sdCxlLmNvbHVtbnNWaXNpYmlsaXR5KX1fY29tcHV0ZUV4cGVyaW1lbnRBbmRSZWxhdGVkUHJvcHMoKXtjb25zdCB0PVhZdDt0LmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuYmFja2VuZCl8fHQuaXNOdWxsT3JVbmRlZmluZWQodGhpcy5leHBlcmltZW50TmFtZSl8fHRoaXMuYmFja2VuZC5nZXRFeHBlcmltZW50KHtleHBlcmltZW50TmFtZTp0aGlzLmV4cGVyaW1lbnROYW1lfSkudGhlbigodD0+e1NlLmV4cG9ydHMuaXNFcXVhbCh0LHRoaXMuX2V4cGVyaW1lbnQpfHwodGhpcy5zZXQoIl9leHBlcmltZW50Iix0KSx0aGlzLl9jb21wdXRlSFBhcmFtcygpLHRoaXMuX2NvbXB1dGVNZXRyaWNzKCksdGhpcy5fcXVlcnlTZXJ2ZXIoKSx0aGlzLl9yZXNvbHZlR2V0RXhwZXJpbWVudCgpKX0pKS5maW5hbGx5KCgoKT0+e3RoaXMuX2NvbXB1dGVEYXRhRm91bmQoKX0pKX1fY29tcHV0ZURhdGFGb3VuZCgpe2NvbnN0IHQ9Qm9vbGVhbih0aGlzLl9leHBlcmltZW50JiZ0aGlzLl9leHBlcmltZW50LmhwYXJhbUluZm9zJiZ0aGlzLl9leHBlcmltZW50LmhwYXJhbUluZm9zLmxlbmd0aD4wJiZ0aGlzLl9leHBlcmltZW50Lm1ldHJpY0luZm9zJiZ0aGlzLl9leHBlcmltZW50Lm1ldHJpY0luZm9zLmxlbmd0aD4wKTt0aGlzLnNldCgiZGF0YUxvYWRlZFdpdGhOb25FbXB0eUhwYXJhbXMiLHQpLHRoaXMuc2V0KCJkYXRhTG9hZGVkV2l0aEVtcHR5SHBhcmFtcyIsIXQpfV9jb21wdXRlSFBhcmFtcygpe2NvbnN0IHQ9W107dGhpcy5fZXhwZXJpbWVudC5ocGFyYW1JbmZvcy5mb3JFYWNoKCgoZSxuKT0+e2NvbnN0IGk9e2luZm86ZSxkaXNwbGF5ZWQ6bjw1LGZpbHRlcjp7fX07aS5pbmZvLmhhc093blByb3BlcnR5KCJkb21haW5EaXNjcmV0ZSIpPyhpLmZpbHRlci5kb21haW5EaXNjcmV0ZT1bXSxpLmluZm8uZG9tYWluRGlzY3JldGUuZm9yRWFjaCgodD0+e2kuZmlsdGVyLmRvbWFpbkRpc2NyZXRlLnB1c2goe3ZhbHVlOnQsY2hlY2tlZDohMH0pfSkpKToiREFUQV9UWVBFX0JPT0wiPT09aS5pbmZvLnR5cGU/aS5maWx0ZXIuZG9tYWluRGlzY3JldGU9W3t2YWx1ZTohMSxjaGVja2VkOiEwfSx7dmFsdWU6ITAsY2hlY2tlZDohMH1dOiJEQVRBX1RZUEVfRkxPQVQ2NCI9PT1pLmluZm8udHlwZT9pLmZpbHRlci5pbnRlcnZhbD17bWluOnt2YWx1ZToiIixpbnZhbGlkOiExfSxtYXg6e3ZhbHVlOiIiLGludmFsaWQ6ITF9fToiREFUQV9UWVBFX1NUUklORyI9PT1pLmluZm8udHlwZT9pLmZpbHRlci5yZWdleHA9IiI6Y29uc29sZS53YXJuKCJ1bmtub3duIGhwYXJhbS5pbmZvLnR5cGU6ICVzIixpLmluZm8udHlwZSksdC5wdXNoKGkpfSkpLHRoaXMuc2V0KCJfaHBhcmFtcyIsdCl9X2NvbXB1dGVNZXRyaWNzKCl7Y29uc3QgdD1bXTt0aGlzLl9leHBlcmltZW50Lm1ldHJpY0luZm9zLmZvckVhY2goKChlLG4pPT57dC5wdXNoKHtpbmZvOmUsZmlsdGVyOntpbnRlcnZhbDp7bWluOnt2YWx1ZToiIixpbnZhbGlkOiExfSxtYXg6e3ZhbHVlOiIiLGludmFsaWQ6ITF9fX0sZGlzcGxheWVkOm48NX0pfSkpLHRoaXMuc2V0KCJfbWV0cmljcyIsdCl9X2NvbXB1dGVTY2hlbWEoKXtyZXR1cm4gdGhpcy5faHBhcmFtcyYmdGhpcy5fbWV0cmljcz97aHBhcmFtQ29sdW1uczp0aGlzLl9ocGFyYW1zLm1hcCgodD0+KHtocGFyYW1JbmZvOnQuaW5mb30pKSksbWV0cmljQ29sdW1uczp0aGlzLl9tZXRyaWNzLm1hcCgodD0+KHttZXRyaWNJbmZvOnQuaW5mb30pKSl9OntocGFyYW1Db2x1bW5zOltdLG1ldHJpY0NvbHVtbnM6W119fV91cGRhdGVDb25maWd1cmF0aW9uKCl7dGhpcy5kZWJvdW5jZSgiX3VwZGF0ZUNvbmZpZ3VyYXRpb24iLCgoKT0+e3RoaXMuY29uZmlndXJhdGlvbj17c2NoZW1hOnRoaXMuX2NvbXB1dGVTY2hlbWEoKSxjb2x1bW5zVmlzaWJpbGl0eTp0aGlzLl9jb21wdXRlQ29sdW1uc1Zpc2liaWxpdHkoKSx2aXNpYmxlU2NoZW1hOnRoaXMuX2NvbXB1dGVWaXNpYmxlU2NoZW1hKCl9fSkpfV9jb21wdXRlQ29sdW1uc1Zpc2liaWxpdHkoKXtyZXR1cm4gdGhpcy5faHBhcmFtcyYmdGhpcy5fbWV0cmljcz90aGlzLl9ocGFyYW1zLm1hcCgodD0+dC5kaXNwbGF5ZWQpKS5jb25jYXQodGhpcy5fbWV0cmljcy5tYXAoKHQ9PnQuZGlzcGxheWVkKSkpOltdfV9jb21wdXRlVmlzaWJsZVNjaGVtYSgpe3JldHVybiB0aGlzLl9ocGFyYW1zJiZ0aGlzLl9tZXRyaWNzP3tocGFyYW1JbmZvczp0aGlzLl9ocGFyYW1zLmZpbHRlcigodD0+dC5kaXNwbGF5ZWQpKS5tYXAoKHQ9PnQuaW5mbykpLG1ldHJpY0luZm9zOnRoaXMuX21ldHJpY3MuZmlsdGVyKCh0PT50LmRpc3BsYXllZCkpLm1hcCgodD0+dC5pbmZvKSl9OntocGFyYW1JbmZvczpbXSxtZXRyaWNJbmZvczpbXX19X3F1ZXJ5U2VydmVyKCl7dGhpcy5kZWJvdW5jZSgicXVlcnlTZXJ2ZXIiLCgoKT0+dGhpcy5fcXVlcnlTZXJ2ZXJOb0RlYm91bmNlKCkpLDEwMCl9X3F1ZXJ5U2VydmVyTm9EZWJvdW5jZSgpe2lmKHRoaXMuX2hwYXJhbXMmJnRoaXMuX21ldHJpY3MpcmV0dXJuIHRoaXMuX3NlbmRMaXN0U2Vzc2lvbkdyb3Vwc1JlcXVlc3QoKS50aGVuKHRoaXMuX2xpc3RTZXNzaW9uR3JvdXBzQ2FuY2VsbGVyLmNhbmNlbGxhYmxlKCgoe3ZhbHVlOnQsY2FuY2VsbGVkOmV9KT0+e2V8fCh0LnRvdGFsU2l6ZT49MD8odGhpcy5zZXQoIl9wYWdlQ291bnRTdHIiLFN0cmluZyhNYXRoLmNlaWwodC50b3RhbFNpemUvK3RoaXMuX3BhZ2VTaXplSW5wdXQudmFsdWUpKSksdGhpcy5zZXQoIl90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0ciIsdC50b3RhbFNpemUpKToodGhpcy5zZXQoIl9wYWdlQ291bnRTdHIiLCI/IiksdGhpcy5zZXQoIl90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0ciIsIlVua25vd24iKSkscVl0KHRoaXMsInNlc3Npb25Hcm91cHMiLHQuc2Vzc2lvbkdyb3VwcykpfSkpKX1fc2VuZExpc3RTZXNzaW9uR3JvdXBzUmVxdWVzdCgpe2NvbnN0IHQ9dGhpcy5fYnVpbGRMaXN0U2Vzc2lvbkdyb3Vwc1JlcXVlc3QoKTtpZihudWxsIT09dClyZXR1cm4gdGhpcy5zZXQoIl9zZXNzaW9uR3JvdXBzUmVxdWVzdCIsdCksdGhpcy5fbGlzdFNlc3Npb25Hcm91cHNDYW5jZWxsZXIuY2FuY2VsQWxsKCksdGhpcy5iYWNrZW5kLmxpc3RTZXNzaW9uR3JvdXBzKHQpfV9idWlsZExpc3RTZXNzaW9uR3JvdXBzUmVxdWVzdCgpe2NvbnN0IHQ9dGhpcztsZXQgZT0hMDtmdW5jdGlvbiBuKG4pe2NvbnN0IGk9dC5nZXQobisiLm1pbi52YWx1ZSIpO2NvbnNvbGUuYXNzZXJ0KHZvaWQgMCE9PWkpO2NvbnN0IHI9IiI9PT1pPyItSW5maW5pdHkiOitpO3Quc2V0KG4rIi5taW4uaW52YWxpZCIsaXNOYU4ocikpLGU9ZSYmIWlzTmFOKHIpO2NvbnN0IG89dC5nZXQobisiLm1heC52YWx1ZSIpO2NvbnNvbGUuYXNzZXJ0KHZvaWQgMCE9PW8pO2NvbnN0IGE9IiI9PT1vPyJJbmZpbml0eSI6K287cmV0dXJuIHQuc2V0KG4rIi5tYXguaW52YWxpZCIsaXNOYU4oYSkpLGU9ZSYmIWlzTmFOKGEpLGlzTmFOKHIpfHxpc05hTihhKT9udWxsOnttaW5WYWx1ZTpyLG1heFZhbHVlOmF9fWZ1bmN0aW9uIGkobil7Y29uc3QgaT10LmdldChuKyIudmFsdWUiKTtjb25zb2xlLmFzc2VydCh2b2lkIDAhPT1pKTtjb25zdCByPStpLG89TnVtYmVyLmlzSW50ZWdlcihyKSYmcj4wO3JldHVybiB0LnNldChuKyIuaW52YWxpZCIsIW8pLGU9ZSYmbyxvP3I6bnVsbH1jb25zdCByPXRoaXMuX3N0YXR1c2VzLmZpbHRlcigodD0+dC5hbGxvd2VkKSkubWFwKCh0PT50LnZhbHVlKSk7bGV0IG89W107aWYodGhpcy5faHBhcmFtcy5mb3JFYWNoKCgodCxlKT0+e2xldCBpPXtocGFyYW06dC5pbmZvLm5hbWV9O2lmKHQuZmlsdGVyLmRvbWFpbkRpc2NyZXRlKWkuZmlsdGVyRGlzY3JldGU9W10sdC5maWx0ZXIuZG9tYWluRGlzY3JldGUuZm9yRWFjaCgodD0+e3QuY2hlY2tlZCYmaS5maWx0ZXJEaXNjcmV0ZS5wdXNoKHQudmFsdWUpfSkpO2Vsc2UgaWYodC5maWx0ZXIuaW50ZXJ2YWwpaS5maWx0ZXJJbnRlcnZhbD1uKCJfaHBhcmFtcy4iK2UrIi5maWx0ZXIuaW50ZXJ2YWwiKTtlbHNle2lmKCF0LmZpbHRlci5yZWdleHApcmV0dXJuIGNvbnNvbGUuZXJyb3IoImhwYXJhbS5maWx0ZXIgd2l0aCBubyBkb21haW5EaXNjcmV0ZSwgaW50ZXJ2YWwgb3IgcmVnZXhwIHByb3BlcnRpZXMgc2V0OiAlcyIsdCksbnVsbDtpLmZpbHRlclJlZ2V4cD10LmZpbHRlci5yZWdleHB9by5wdXNoKGkpfSkpLHRoaXMuX21ldHJpY3MuZm9yRWFjaCgoKHQsZSk9PntsZXQgaT17bWV0cmljOnQuaW5mby5uYW1lLGZpbHRlckludGVydmFsOm4oIl9tZXRyaWNzLiIrZSsiLmZpbHRlci5pbnRlcnZhbCIpfTtvLnB1c2goaSl9KSksdm9pZCAwIT09dGhpcy5fc29ydEJ5SW5kZXgmJnZvaWQgMCE9PXRoaXMuX3NvcnREaXJlY3Rpb24pe2lmKCEodGhpcy5fc29ydEJ5SW5kZXggaW4gbykpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIk5vIGNvbHVtbiBpbiBjb2xQYXJhbXMgd2l0aCBpbmRleCBzb3J0QnlJbmRleDogJXMiLHRoaXMuX3NvcnRCeUluZGV4KSxudWxsO29bdGhpcy5fc29ydEJ5SW5kZXhdLm9yZGVyPTA9PT10aGlzLl9zb3J0RGlyZWN0aW9uPyJPUkRFUl9BU0MiOiJPUkRFUl9ERVNDIn1jb25zdCBhPWkoIl9wYWdlTnVtYmVySW5wdXQiKSxzPWkoIl9wYWdlU2l6ZUlucHV0Iik7cmV0dXJuIGU/e2V4cGVyaW1lbnROYW1lOnRoaXMuZXhwZXJpbWVudE5hbWUsYWxsb3dlZFN0YXR1c2VzOnIsY29sUGFyYW1zOm8sc3RhcnRJbmRleDpzKihhLTEpLHNsaWNlU2l6ZTpzfTpudWxsfV9tZXRyaWNTb3J0QnlJbmRleCh0KXtyZXR1cm4gdCt0aGlzLl9ocGFyYW1zLmxlbmd0aH19O29YdC50ZW1wbGF0ZT1fZWAKICAgIDxocGFyYW1zLXNwbGl0LWxheW91dCBvcmllbnRhdGlvbj0idmVydGljYWwiPgogICAgICA8ZGl2IHNsb3Q9ImNvbnRlbnQiIGNsYXNzPSJzZWN0aW9uIGh5cGVycGFyYW1ldGVycyI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+SHlwZXJwYXJhbWV0ZXJzPC9kaXY+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tfaHBhcmFtc319IiBhcz0iaHBhcmFtIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhwYXJhbSI+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveAogICAgICAgICAgICAgIGNoZWNrZWQ9Int7aHBhcmFtLmRpc3BsYXllZH19IgogICAgICAgICAgICAgIGNsYXNzPSJocGFyYW0tY2hlY2tib3giCiAgICAgICAgICAgID4KICAgICAgICAgICAgICBbW19ocGFyYW1OYW1lKGhwYXJhbS5pbmZvKV1dCiAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgIDwhLS0gUHJlY2lzZWx5IG9uZSBvZiB0aGUgdGVtcGxhdGVzIGJlbG93IHdpbGwgYmUgc3RhbXBlZC4tLT4KICAgICAgICAgICAgPCEtLSAxLiBBIGxpc3Qgb2YgY2hlY2tib3hlcyAtLT4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hwYXJhbS5maWx0ZXIuZG9tYWluRGlzY3JldGVdXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlCiAgICAgICAgICAgICAgICBpcz0iZG9tLXJlcGVhdCIKICAgICAgICAgICAgICAgIGl0ZW1zPSJbW2hwYXJhbS5maWx0ZXIuZG9tYWluRGlzY3JldGVdXSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3gKICAgICAgICAgICAgICAgICAgY2hlY2tlZD0ie3tpdGVtLmNoZWNrZWR9fSIKICAgICAgICAgICAgICAgICAgY2xhc3M9ImRpc2NyZXRlLXZhbHVlLWNoZWNrYm94IgogICAgICAgICAgICAgICAgICBvbi1jaGFuZ2U9Il9xdWVyeVNlcnZlciIKICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgW1tfcHJldHR5UHJpbnQoaXRlbS52YWx1ZSldXQogICAgICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8IS0tIDIuIEEgbnVtZXJpYyBpbnRlcnZhbCAtLT4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWxdXSI+CiAgICAgICAgICAgICAgPHBhcGVyLWlucHV0CiAgICAgICAgICAgICAgICBsYWJlbD0iTWluIgogICAgICAgICAgICAgICAgdmFsdWU9Int7aHBhcmFtLmZpbHRlci5pbnRlcnZhbC5taW4udmFsdWV9fSIKICAgICAgICAgICAgICAgIGFsbG93ZWRfcGF0dGVybj0iWzAtOS5lXFwtXSIKICAgICAgICAgICAgICAgIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIKICAgICAgICAgICAgICAgIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiCiAgICAgICAgICAgICAgICBpbnZhbGlkPSJbW2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWwubWluLmludmFsaWRdXSIKICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSItaW5maW5pdHkiCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgPHBhcGVyLWlucHV0CiAgICAgICAgICAgICAgICBsYWJlbD0iTWF4IgogICAgICAgICAgICAgICAgdmFsdWU9Int7aHBhcmFtLmZpbHRlci5pbnRlcnZhbC5tYXgudmFsdWV9fSIKICAgICAgICAgICAgICAgIGFsbG93ZWRfcGF0dGVybj0iWzAtOS5lXFwtXSIKICAgICAgICAgICAgICAgIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIKICAgICAgICAgICAgICAgIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiCiAgICAgICAgICAgICAgICBpbnZhbGlkPSJbW2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWwubWF4LmludmFsaWRdXSIKICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSIraW5maW5pdHkiCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwhLS0gMy4gQSByZWdleHAgLS0+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tocGFyYW0uZmlsdGVyLnJlZ2V4cF1dIj4KICAgICAgICAgICAgICA8cGFwZXItaW5wdXQKICAgICAgICAgICAgICAgIGxhYmVsPSJSZWd1bGFyIGV4cHJlc3Npb24iCiAgICAgICAgICAgICAgICB2YWx1ZT0ie3tocGFyYW0uZmlsdGVyLnJlZ2V4cH19IgogICAgICAgICAgICAgICAgb24tdmFsdWUtY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc2xvdD0iY29udGVudCIgY2xhc3M9InNlY3Rpb24gbWV0cmljcyI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+TWV0cmljczwvZGl2PgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7X21ldHJpY3N9fSIgYXM9Im1ldHJpYyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXRyaWMiPgogICAgICAgICAgICA8IS0tIFRPRE8oZXJleik6IE1ha2UgaXQgZWFzaWVyIHRvIGhhbmRsZSBhIGxhcmdlIG51bWJlciBvZgogICAgICAgICAgICAgICAgICBtZXRyaWNzOgogICAgICAgICAgICAgICAgICAxLiBBZGQgYW4gJ2lzb2xhdG9yJyByYWRpby1idXR0b24gdG8gc2VsZWN0IGp1c3Qgb25lCiAgICAgICAgICAgICAgICAgIG1ldHJpYyBhbmQKICAgICAgICAgICAgICAgICAgaGlkZSBhbGwgdGhlIHJlc3QKICAgICAgICAgICAgICAgICAgMi4gQWRkIGEgJ3RvZ2dsZS1hbGwnIGJ1dHRvbiB0aGF0IHdpbGwgaGlkZS91bmhpZGUKICAgICAgICAgICAgICAgICAgICBhbGwgdGhlCiAgICAgICAgICAgICAgICAgIG1ldHJpY3MuCiAgICAgICAgICAgICAgICAgIFVzZSBzaW1pbGFyIGxvZ2ljL2FwcGVhcmFuY2UgdG8gdGhlIHJ1bi1zZWxlY3RvciBvZgogICAgICAgICAgICAgICAgICBzY2FsYXJzLi0tPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3gKICAgICAgICAgICAgICBjaGVja2VkPSJ7e21ldHJpYy5kaXNwbGF5ZWR9fSIKICAgICAgICAgICAgICBjbGFzcz0ibWV0cmljLWNoZWNrYm94IgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgW1tfbWV0cmljTmFtZShtZXRyaWMuaW5mbyldXQogICAgICAgICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmxpbmUtZWxlbWVudCI+CiAgICAgICAgICAgICAgPHBhcGVyLWlucHV0CiAgICAgICAgICAgICAgICBsYWJlbD0iTWluIgogICAgICAgICAgICAgICAgdmFsdWU9Int7bWV0cmljLmZpbHRlci5pbnRlcnZhbC5taW4udmFsdWV9fSIKICAgICAgICAgICAgICAgIGFsbG93ZWQtcGF0dGVybj0iWzAtOS5lXFwtXSIKICAgICAgICAgICAgICAgIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIKICAgICAgICAgICAgICAgIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiCiAgICAgICAgICAgICAgICBpbnZhbGlkPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWluLmludmFsaWR9fSIKICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSItaW5maW5pdHkiCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmxpbmUtZWxlbWVudCI+CiAgICAgICAgICAgICAgPHBhcGVyLWlucHV0CiAgICAgICAgICAgICAgICBsYWJlbD0iTWF4IgogICAgICAgICAgICAgICAgYWxsb3dlZC1wYXR0ZXJuPSJbMC05LmVcXC1dIgogICAgICAgICAgICAgICAgdmFsdWU9Int7bWV0cmljLmZpbHRlci5pbnRlcnZhbC5tYXgudmFsdWV9fSIKICAgICAgICAgICAgICAgIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIKICAgICAgICAgICAgICAgIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiCiAgICAgICAgICAgICAgICBpbnZhbGlkPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWF4LmludmFsaWR9fSIKICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSIraW5maW5pdHkiCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc2xvdD0iY29udGVudCIgY2xhc3M9InNlY3Rpb24gc3RhdHVzIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5TdGF0dXM8L2Rpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zdGF0dXNlc11dIiBhcz0ic3RhdHVzIj4KICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e3N0YXR1cy5hbGxvd2VkfX0iIG9uLWNoYW5nZT0iX3F1ZXJ5U2VydmVyIj4KICAgICAgICAgICAgW1tzdGF0dXMuZGlzcGxheU5hbWVdXQogICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjb250ZW50IiBjbGFzcz0ic2VjdGlvbiBzb3J0aW5nIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5Tb3J0aW5nPC9kaXY+CiAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUKICAgICAgICAgIGxhYmVsPSJTb3J0IGJ5IgogICAgICAgICAgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiCiAgICAgICAgICBob3Jpem9udGFsLWFsaWduPSJsZWZ0IgogICAgICAgID4KICAgICAgICAgIDxwYXBlci1saXN0Ym94CiAgICAgICAgICAgIGNsYXNzPSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgICBzbG90PSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgICBzZWxlY3RlZD0ie3tfc29ydEJ5SW5kZXh9fSIKICAgICAgICAgICAgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiCiAgICAgICAgICA+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2hwYXJhbXNdXSIgYXM9ImhwYXJhbSI+CiAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+IFtbX2hwYXJhbU5hbWUoaHBhcmFtLmluZm8pXV0gPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19tZXRyaWNzXV0iIGFzPSJtZXRyaWMiPgogICAgICAgICAgICAgIDxwYXBlci1pdGVtPiBbW19tZXRyaWNOYW1lKG1ldHJpYy5pbmZvKV1dIDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUKICAgICAgICAgIGxhYmVsPSJEaXJlY3Rpb24iCiAgICAgICAgICBvbi1zZWxlY3RlZC1pdGVtLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIKICAgICAgICAgIGhvcml6b250YWwtYWxpZ249ImxlZnQiCiAgICAgICAgPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3gKICAgICAgICAgICAgY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiCiAgICAgICAgICAgIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiCiAgICAgICAgICAgIHNlbGVjdGVkPSJ7e19zb3J0RGlyZWN0aW9ufX0iCiAgICAgICAgICA+CiAgICAgICAgICAgIDxwYXBlci1pdGVtPkFzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0+RGVzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IHNsb3Q9ImNvbnRlbnQiIGNsYXNzPSJzZWN0aW9uIHBhZ2luZyI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+UGFnaW5nPC9kaXY+CiAgICAgICAgPGRpdj4KICAgICAgICAgIE51bWJlciBvZiBtYXRjaGluZyBzZXNzaW9uIGdyb3VwczogW1tfdG90YWxTZXNzaW9uR3JvdXBzQ291bnRTdHJdXQogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50IHBhZ2UtbnVtYmVyLWlucHV0Ij4KICAgICAgICAgIDxwYXBlci1pbnB1dAogICAgICAgICAgICBsYWJlbD0iUGFnZSAjIgogICAgICAgICAgICB2YWx1ZT0ie3tfcGFnZU51bWJlcklucHV0LnZhbHVlfX0iCiAgICAgICAgICAgIGFsbG93ZWQtcGF0dGVybj0iWzAtOV0iCiAgICAgICAgICAgIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiCiAgICAgICAgICAgIGludmFsaWQ9IltbX3BhZ2VOdW1iZXJJbnB1dC5pbnZhbGlkXV0iCiAgICAgICAgICAgIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIKICAgICAgICAgID4KICAgICAgICAgICAgPGRpdiBzbG90PSJzdWZmaXgiIGNsYXNzPSJwYWdlLXN1ZmZpeCI+LyBbW19wYWdlQ291bnRTdHJdXTwvZGl2PgogICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJpbmxpbmUtZWxlbWVudCBwYWdlLXNpemUtaW5wdXQiPgogICAgICAgICAgPHBhcGVyLWlucHV0CiAgICAgICAgICAgIGxhYmVsPSJNYXggIyBvZiBzZXNzaW9uIGdyb3VwcyBwZXIgcGFnZToiCiAgICAgICAgICAgIHZhbHVlPSJ7e19wYWdlU2l6ZUlucHV0LnZhbHVlfX0iCiAgICAgICAgICAgIGFsbG93ZWQtcGF0dGVybj0iWzAtOV0iCiAgICAgICAgICAgIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiCiAgICAgICAgICAgIGludmFsaWQ9IltbX3BhZ2VTaXplSW5wdXQuaW52YWxpZF1dIgogICAgICAgICAgICBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiCiAgICAgICAgICA+CiAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjb250ZW50IiBjbGFzcz0ic2VjdGlvbiBkb3dubG9hZCI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXNzaW9uR3JvdXBzUmVxdWVzdF1dIj4KICAgICAgICAgIERvd25sb2FkIGRhdGEgYXMKICAgICAgICAgIDxzcGFuPgogICAgICAgICAgICA8YQogICAgICAgICAgICAgIGlkPSJjc3ZMaW5rIgogICAgICAgICAgICAgIGRvd25sb2FkPSJocGFyYW1zX3RhYmxlLmNzdiIKICAgICAgICAgICAgICBocmVmPSJbW19jc3ZVcmwoX3Nlc3Npb25Hcm91cHNSZXF1ZXN0LCBjb25maWd1cmF0aW9uKV1dIgogICAgICAgICAgICAgID5DU1Y8L2EKICAgICAgICAgICAgPgogICAgICAgICAgICA8YQogICAgICAgICAgICAgIGlkPSJqc29uTGluayIKICAgICAgICAgICAgICBkb3dubG9hZD0iaHBhcmFtc190YWJsZS5qc29uIgogICAgICAgICAgICAgIGhyZWY9IltbX2pzb25VcmwoX3Nlc3Npb25Hcm91cHNSZXF1ZXN0LCBjb25maWd1cmF0aW9uKV1dIgogICAgICAgICAgICAgID5KU09OPC9hCiAgICAgICAgICAgID4KICAgICAgICAgICAgPGEKICAgICAgICAgICAgICBpZD0ibGF0ZXhMaW5rIgogICAgICAgICAgICAgIGRvd25sb2FkPSJocGFyYW1zX3RhYmxlLnRleCIKICAgICAgICAgICAgICBocmVmPSJbW19sYXRleFVybChfc2Vzc2lvbkdyb3Vwc1JlcXVlc3QsIGNvbmZpZ3VyYXRpb24pXV0iCiAgICAgICAgICAgICAgPkxhVGVYPC9hCiAgICAgICAgICAgID4KICAgICAgICAgIDwvc3Bhbj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvaHBhcmFtcy1zcGxpdC1sYXlvdXQ+CiAgICA8c3R5bGU+CiAgICAgIC5zZWN0aW9uIHsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICB9CiAgICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBtYXJnaW4tYm90dG9tOiA3cHg7CiAgICAgIH0KICAgICAgLmRpc2NyZXRlLXZhbHVlLWNoZWNrYm94LAogICAgICAubWV0cmljLWNoZWNrYm94LAogICAgICAuaHBhcmFtLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAuZGlzY3JldGUtdmFsdWUtY2hlY2tib3ggewogICAgICAgIG1hcmdpbi1sZWZ0OiAyMHB4OwogICAgICB9CiAgICAgIC5ocGFyYW0sCiAgICAgIC5tZXRyaWMgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5pbmxpbmUtZWxlbWVudCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiA0MCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgICAgLnBhZ2UtbnVtYmVyLWlucHV0IHsKICAgICAgICB3aWR0aDogMjAlOwogICAgICB9CiAgICAgIC5wYWdlLXNpemUtaW5wdXQgewogICAgICAgIHdpZHRoOiA2MCU7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIHBhcGVyLWxpc3Rib3ggewogICAgICAgIG1heC1oZWlnaHQ6IDE1ZW07CiAgICAgIH0KICAgICAgLnBhZ2Utc3VmZml4IHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sb1h0LnByb3RvdHlwZSwiZXhwZXJpbWVudE5hbWUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLG9YdC5wcm90b3R5cGUsImNvbmZpZ3VyYXRpb24iLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheSxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sb1h0LnByb3RvdHlwZSwic2Vzc2lvbkdyb3VwcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxvWHQucHJvdG90eXBlLCJkYXRhTG9hZGVkV2l0aE5vbkVtcHR5SHBhcmFtcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxvWHQucHJvdG90eXBlLCJkYXRhTG9hZGVkV2l0aEVtcHR5SHBhcmFtcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxvWHQucHJvdG90eXBlLCJfZXhwZXJpbWVudCIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sb1h0LnByb3RvdHlwZSwiX2hwYXJhbXMiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLG9YdC5wcm90b3R5cGUsIl9tZXRyaWNzIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sb1h0LnByb3RvdHlwZSwiX3N0YXR1c2VzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLG9YdC5wcm90b3R5cGUsIl9nZXRFeHBlcmltZW50UmVzb2x2ZWQiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pXSxvWHQucHJvdG90eXBlLCJfcmVzb2x2ZUdldEV4cGVyaW1lbnQiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sb1h0LnByb3RvdHlwZSwiX2xpc3RTZXNzaW9uR3JvdXBzQ2FuY2VsbGVyIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLG9YdC5wcm90b3R5cGUsIl9zb3J0QnlJbmRleCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxvWHQucHJvdG90eXBlLCJfc29ydERpcmVjdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxvWHQucHJvdG90eXBlLCJfcGFnZVNpemVJbnB1dCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxvWHQucHJvdG90eXBlLCJfcGFnZU51bWJlcklucHV0Iix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLG9YdC5wcm90b3R5cGUsIl9wYWdlQ291bnRTdHIiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sb1h0LnByb3RvdHlwZSwiX3RvdGFsU2Vzc2lvbkdyb3Vwc0NvdW50U3RyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLG9YdC5wcm90b3R5cGUsIl9zZXNzaW9uR3JvdXBzUmVxdWVzdCIsdm9pZCAwKSx0KFthKCJiYWNrZW5kIiwiZXhwZXJpbWVudE5hbWUiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLG9YdC5wcm90b3R5cGUsIl9jb21wdXRlRXhwZXJpbWVudEFuZFJlbGF0ZWRQcm9wcyIsbnVsbCksdChbYSgiX2hwYXJhbXMuKiIsIl9tZXRyaWNzLioiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLG9YdC5wcm90b3R5cGUsIl91cGRhdGVDb25maWd1cmF0aW9uIixudWxsKSxvWHQ9dChbaSgidGYtaHBhcmFtcy1xdWVyeS1wYW5lIildLG9YdCk7bGV0IGFYdD1jbGFzcyBleHRlbmRzIHlle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLm9wdGlvbnM9bnVsbH1fY29uZmlndXJhdGlvbkNoYW5nZWQoKXtjb25zdCB0PXRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLGU9dGhpcy5jb25maWd1cmF0aW9uLnNjaGVtYSxuPXtjb2x1bW5zOnQuaHBhcmFtSW5mb3MubWFwKCgobixpKT0+KHtuYW1lOnhZdChuKSxpbmRleDppLGFic29sdXRlSW5kZXg6SVl0KGUsdCxpKSxzY2FsZTp0aGlzLl9pc051bWVyaWNDb2x1bW4oaSk/IkxJTkVBUiI6Ik5PTl9OVU1FUklDIn0pKSkuY29uY2F0KHQubWV0cmljSW5mb3MubWFwKCgobixpKT0+e2NvbnN0IHI9aSt0LmhwYXJhbUluZm9zLmxlbmd0aDtyZXR1cm57c2NhbGU6IkxJTkVBUiIsbmFtZTp3WXQobiksaW5kZXg6cixhYnNvbHV0ZUluZGV4OklZdChlLHQscil9fSkpKSxtaW5Db2xvcjoiIzAwMDBGRiIsbWF4Q29sb3I6IiNGRjAwMDAiLGNvbmZpZ3VyYXRpb246dGhpcy5jb25maWd1cmF0aW9ufTt0aGlzLnNldCgib3B0aW9ucyIsbiksRGkoKSx0aGlzLnNldCgib3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgiLHRoaXMuX2RlZmF1bHRDb2xvckJ5Q29sdW1uSW5kZXgoKSl9X3Vuc2VsZWN0RGlzYWJsZWRMb2dTY2FsZXMoKXtudWxsIT09dGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMuY29sdW1ucy5mb3JFYWNoKCh0PT57Y29uc3QgZT0ib3B0aW9ucy5jb2x1bW5zLiIrdC5pbmRleDt0aGlzLl9hbGxvd0xvZ1NjYWxlKHQpfHwiTE9HIiE9PXQuc2NhbGV8fHRoaXMuc2V0KGUrIi5zY2FsZSIsIkxJTkVBUiIpfSkpfV9hbGxvd0xvZ1NjYWxlKHQpe2lmKCF0aGlzLl9pc051bWVyaWNDb2x1bW4odC5pbmRleCl8fCF0aGlzLnNlc3Npb25Hcm91cHMpcmV0dXJuITE7Y29uc3RbZSxuXT16WXQodGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEsdGhpcy5zZXNzaW9uR3JvdXBzLHQuaW5kZXgpO3JldHVybiBlPjB8fG48MH1faXNOdW1lcmljQ29sdW1uKHQpe3JldHVybiB0Pj10aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvcy5sZW5ndGh8fCJEQVRBX1RZUEVfRkxPQVQ2NCI9PT10aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvc1t0XS50eXBlfV9kZWZhdWx0Q29sb3JCeUNvbHVtbkluZGV4KCl7aWYodGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEubWV0cmljSW5mb3MubGVuZ3RoPjApcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zLmxlbmd0aDtjb25zdCB0PXRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zLmZpbmRJbmRleCgodD0+IkRBVEFfVFlQRV9GTE9BVDY0Ij09PXQudHlwZSkpO3JldHVybi0xIT09dD90OnZvaWQgMH19O2FYdC50ZW1wbGF0ZT1fZWAKICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtcGFuZWwiPgogICAgICA8IS0tICdDb2xvciBieScgZHJvcCBkb3duIG1lbnUgLS0+CiAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51CiAgICAgICAgbGFiZWw9IkNvbG9yIGJ5IgogICAgICAgIGlkPSJjb2xvckJ5RHJvcERvd25NZW51IgogICAgICAgIGhvcml6b250YWwtYWxpZ249ImxlZnQiCiAgICAgID4KICAgICAgICA8cGFwZXItbGlzdGJveAogICAgICAgICAgY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiCiAgICAgICAgICBzbG90PSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgc2VsZWN0ZWQ9Int7b3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXh9fSIKICAgICAgICAgIGlkPSJjb2xvckJ5TGlzdEJveCIKICAgICAgICA+CiAgICAgICAgICA8dGVtcGxhdGUKICAgICAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgICAgIGl0ZW1zPSJbW29wdGlvbnMuY29sdW1uc11dIgogICAgICAgICAgICBhcz0iY29sdW1uIgogICAgICAgICAgICBpZD0iY29sb3JCeUNvbHVtblRlbXBsYXRlIgogICAgICAgICAgPgogICAgICAgICAgICA8cGFwZXItaXRlbSBkaXNhYmxlZD0iW1shX2lzTnVtZXJpY0NvbHVtbihjb2x1bW4uaW5kZXgpXV0iPgogICAgICAgICAgICAgIFtbY29sdW1uLm5hbWVdXQogICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgoKICAgICAgPCEtLSBDb2x1bW5zIHNjYWxlcyAtLT4KICAgICAgPGRpdiBjbGFzcz0iY29sdW1ucy1jb250YWluZXIiPgogICAgICAgIDwhLS0gU2NhbGUgb3B0aW9ucyBmb3IgZWFjaCBudW1lcmljIGZlYXR1cmUgLS0+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tvcHRpb25zLmNvbHVtbnN9fSIgYXM9ImNvbHVtbiI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzTnVtZXJpY0NvbHVtbihjb2x1bW4uaW5kZXgpXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2x1bW4iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbHVtbi10aXRsZSI+W1tjb2x1bW4ubmFtZV1dPC9kaXY+CiAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1ncm91cAogICAgICAgICAgICAgICAgICBjbGFzcz0ic2NhbGUtcmFkaW8tZ3JvdXAiCiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkPSJ7e2NvbHVtbi5zY2FsZX19IgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9IkxJTkVBUiI+CiAgICAgICAgICAgICAgICAgICAgTGluZWFyCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICA8IS0tIFRoZSBpZCBoZXJlIGlzIHVzZWQgdG8gYWNjZXNzIHRoaXMgYnV0dG9uIGluIHVuaXQKICAgICAgICAgICAgICAgICAgICAgICB0ZXN0cy4tLT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbgogICAgICAgICAgICAgICAgICAgIGlkPSJsb2dTY2FsZUJ1dHRvbl9bW2NvbHVtbi5uYW1lXV0iCiAgICAgICAgICAgICAgICAgICAgbmFtZT0iTE9HIgogICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPSJbWyFfYWxsb3dMb2dTY2FsZShjb2x1bW4sIHNlc3Npb25Hcm91cHMuKildXSIKICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgIExvZ2FyaXRobWljCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9IlFVQU5USUxFIj4KICAgICAgICAgICAgICAgICAgICBRdWFudGlsZQogICAgICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5jb250cm9sLXBhbmVsIHsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQogICAgICAuY29sdW1uIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICAgICAgYm9yZGVyOiBzb2xpZCAxcHggZGFya2dyYXk7CiAgICAgICAgcGFkZGluZzogM3B4OwogICAgICB9CiAgICAgIC5jb2x1bW4tdGl0bGUgewogICAgICAgIC8qIEZpdCBldmVyeSB0aXRsZSBpbiBvbmUgbGluZSBzbyB0aGUgcmFkaW8gYm94ZXMgYWxpZ24gdmVydGljYWxseS4gKi8KICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICB9CiAgICAgIC5jb2x1bW5zLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CiAgICAgIC5zY2FsZS1yYWRpby1ncm91cCBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIHBhZGRpbmc6IDJweDsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICBwYXBlci1saXN0Ym94IHsKICAgICAgICBtYXgtaGVpZ2h0OiAxNWVtOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sYVh0LnByb3RvdHlwZSwiY29uZmlndXJhdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sYVh0LnByb3RvdHlwZSwic2Vzc2lvbkdyb3VwcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sYVh0LnByb3RvdHlwZSwib3B0aW9ucyIsdm9pZCAwKSx0KFthKCJjb25maWd1cmF0aW9uLioiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGFYdC5wcm90b3R5cGUsIl9jb25maWd1cmF0aW9uQ2hhbmdlZCIsbnVsbCksdChbYSgic2Vzc2lvbkdyb3Vwcy4qIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxhWHQucHJvdG90eXBlLCJfdW5zZWxlY3REaXNhYmxlZExvZ1NjYWxlcyIsbnVsbCksYVh0PXQoW2koInRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzIildLGFYdCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICAgKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICAgKiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgICogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAgKi8KY29uc3Qgc1h0PSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZudWxsIT13aW5kb3cuY3VzdG9tRWxlbWVudHMmJnZvaWQgMCE9PXdpbmRvdy5jdXN0b21FbGVtZW50cy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrLGxYdD0odCxlLG49bnVsbCk9Pntmb3IoO2UhPT1uOyl7Y29uc3Qgbj1lLm5leHRTaWJsaW5nO3QucmVtb3ZlQ2hpbGQoZSksZT1ufX0sY1h0PWB7e2xpdC0ke1N0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZSgyKX19fWAsdVh0PWBceDNjIS0tJHtjWHR9LS1ceDNlYCxoWHQ9bmV3IFJlZ0V4cChgJHtjWHR9fCR7dVh0fWApLGRYdD0iJGxpdCQiO2NsYXNzIHBYdHtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMucGFydHM9W10sdGhpcy5lbGVtZW50PWU7Y29uc3Qgbj1bXSxpPVtdLHI9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihlLmNvbnRlbnQsMTMzLG51bGwsITEpO2xldCBvPTAsYT0tMSxzPTA7Y29uc3R7c3RyaW5nczpsLHZhbHVlczp7bGVuZ3RoOmN9fT10O2Zvcig7czxjOyl7Y29uc3QgdD1yLm5leHROb2RlKCk7aWYobnVsbCE9PXQpe2lmKGErKywxPT09dC5ub2RlVHlwZSl7aWYodC5oYXNBdHRyaWJ1dGVzKCkpe2NvbnN0IGU9dC5hdHRyaWJ1dGVzLHtsZW5ndGg6bn09ZTtsZXQgaT0wO2ZvcihsZXQgdD0wO3Q8bjt0KyspZlh0KGVbdF0ubmFtZSxkWHQpJiZpKys7Zm9yKDtpLS0gPjA7KXtjb25zdCBlPV9YdC5leGVjKGxbc10pWzJdLG49ZS50b0xvd2VyQ2FzZSgpK2RYdCxpPXQuZ2V0QXR0cmlidXRlKG4pO3QucmVtb3ZlQXR0cmlidXRlKG4pO2NvbnN0IHI9aS5zcGxpdChoWHQpO3RoaXMucGFydHMucHVzaCh7dHlwZToiYXR0cmlidXRlIixpbmRleDphLG5hbWU6ZSxzdHJpbmdzOnJ9KSxzKz1yLmxlbmd0aC0xfX0iVEVNUExBVEUiPT09dC50YWdOYW1lJiYoaS5wdXNoKHQpLHIuY3VycmVudE5vZGU9dC5jb250ZW50KX1lbHNlIGlmKDM9PT10Lm5vZGVUeXBlKXtjb25zdCBlPXQuZGF0YTtpZihlLmluZGV4T2YoY1h0KT49MCl7Y29uc3QgaT10LnBhcmVudE5vZGUscj1lLnNwbGl0KGhYdCksbz1yLmxlbmd0aC0xO2ZvcihsZXQgZT0wO2U8bztlKyspe2xldCBuLG89cltlXTtpZigiIj09PW8pbj1nWHQoKTtlbHNle2NvbnN0IHQ9X1h0LmV4ZWMobyk7bnVsbCE9PXQmJmZYdCh0WzJdLGRYdCkmJihvPW8uc2xpY2UoMCx0LmluZGV4KSt0WzFdK3RbMl0uc2xpY2UoMCwtZFh0Lmxlbmd0aCkrdFszXSksbj1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShvKX1pLmluc2VydEJlZm9yZShuLHQpLHRoaXMucGFydHMucHVzaCh7dHlwZToibm9kZSIsaW5kZXg6KythfSl9IiI9PT1yW29dPyhpLmluc2VydEJlZm9yZShnWHQoKSx0KSxuLnB1c2godCkpOnQuZGF0YT1yW29dLHMrPW99fWVsc2UgaWYoOD09PXQubm9kZVR5cGUpaWYodC5kYXRhPT09Y1h0KXtjb25zdCBlPXQucGFyZW50Tm9kZTtudWxsIT09dC5wcmV2aW91c1NpYmxpbmcmJmEhPT1vfHwoYSsrLGUuaW5zZXJ0QmVmb3JlKGdYdCgpLHQpKSxvPWEsdGhpcy5wYXJ0cy5wdXNoKHt0eXBlOiJub2RlIixpbmRleDphfSksbnVsbD09PXQubmV4dFNpYmxpbmc/dC5kYXRhPSIiOihuLnB1c2godCksYS0tKSxzKyt9ZWxzZXtsZXQgZT0tMTtmb3IoOy0xIT09KGU9dC5kYXRhLmluZGV4T2YoY1h0LGUrMSkpOyl0aGlzLnBhcnRzLnB1c2goe3R5cGU6Im5vZGUiLGluZGV4Oi0xfSkscysrfX1lbHNlIHIuY3VycmVudE5vZGU9aS5wb3AoKX1mb3IoY29uc3QgdCBvZiBuKXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KX19Y29uc3QgZlh0PSh0LGUpPT57Y29uc3Qgbj10Lmxlbmd0aC1lLmxlbmd0aDtyZXR1cm4gbj49MCYmdC5zbGljZShuKT09PWV9LG1YdD10PT4tMSE9PXQuaW5kZXgsZ1h0PSgpPT5kb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSxfWHQ9LyhbIFx4MDlceDBhXHgwY1x4MGRdKShbXlwwLVx4MUZceDdGLVx4OUYgIic+PS9dKykoWyBceDA5XHgwYVx4MGNceDBkXSo9WyBceDA5XHgwYVx4MGNceDBkXSooPzpbXiBceDA5XHgwYVx4MGNceDBkIidgPD49XSp8IlteIl0qfCdbXiddKikpJC87ZnVuY3Rpb24geVh0KHQsZSl7Y29uc3R7ZWxlbWVudDp7Y29udGVudDpufSxwYXJ0czppfT10LHI9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihuLDEzMyxudWxsLCExKTtsZXQgbz1iWHQoaSksYT1pW29dLHM9LTEsbD0wO2NvbnN0IGM9W107bGV0IHU9bnVsbDtmb3IoO3IubmV4dE5vZGUoKTspe3MrKztjb25zdCB0PXIuY3VycmVudE5vZGU7Zm9yKHQucHJldmlvdXNTaWJsaW5nPT09dSYmKHU9bnVsbCksZS5oYXModCkmJihjLnB1c2godCksbnVsbD09PXUmJih1PXQpKSxudWxsIT09dSYmbCsrO3ZvaWQgMCE9PWEmJmEuaW5kZXg9PT1zOylhLmluZGV4PW51bGwhPT11Py0xOmEuaW5kZXgtbCxvPWJYdChpLG8pLGE9aVtvXX1jLmZvckVhY2goKHQ9PnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSkpfWNvbnN0IHZYdD10PT57bGV0IGU9MTE9PT10Lm5vZGVUeXBlPzA6MTtjb25zdCBuPWRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIodCwxMzMsbnVsbCwhMSk7Zm9yKDtuLm5leHROb2RlKCk7KWUrKztyZXR1cm4gZX0sYlh0PSh0LGU9LTEpPT57Zm9yKGxldCBuPWUrMTtuPHQubGVuZ3RoO24rKylpZihtWHQodFtuXSkpcmV0dXJuIG47cmV0dXJuLTF9LHhYdD1uZXcgV2Vha01hcCx3WHQ9e30sU1h0PXt9OwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgICAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgICogVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgICogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgICAqIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgICovCmNsYXNzIE1YdHtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5fX3BhcnRzPVtdLHRoaXMudGVtcGxhdGU9dCx0aGlzLnByb2Nlc3Nvcj1lLHRoaXMub3B0aW9ucz1ufXVwZGF0ZSh0KXtsZXQgZT0wO2Zvcihjb25zdCBuIG9mIHRoaXMuX19wYXJ0cyl2b2lkIDAhPT1uJiZuLnNldFZhbHVlKHRbZV0pLGUrKztmb3IoY29uc3QgdCBvZiB0aGlzLl9fcGFydHMpdm9pZCAwIT09dCYmdC5jb21taXQoKX1fY2xvbmUoKXtjb25zdCB0PXNYdD90aGlzLnRlbXBsYXRlLmVsZW1lbnQuY29udGVudC5jbG9uZU5vZGUoITApOmRvY3VtZW50LmltcG9ydE5vZGUodGhpcy50ZW1wbGF0ZS5lbGVtZW50LmNvbnRlbnQsITApLGU9W10sbj10aGlzLnRlbXBsYXRlLnBhcnRzLGk9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcih0LDEzMyxudWxsLCExKTtsZXQgcixvPTAsYT0wLHM9aS5uZXh0Tm9kZSgpO2Zvcig7bzxuLmxlbmd0aDspaWYocj1uW29dLG1YdChyKSl7Zm9yKDthPHIuaW5kZXg7KWErKywiVEVNUExBVEUiPT09cy5ub2RlTmFtZSYmKGUucHVzaChzKSxpLmN1cnJlbnROb2RlPXMuY29udGVudCksbnVsbD09PShzPWkubmV4dE5vZGUoKSkmJihpLmN1cnJlbnROb2RlPWUucG9wKCkscz1pLm5leHROb2RlKCkpO2lmKCJub2RlIj09PXIudHlwZSl7Y29uc3QgdD10aGlzLnByb2Nlc3Nvci5oYW5kbGVUZXh0RXhwcmVzc2lvbih0aGlzLm9wdGlvbnMpO3QuaW5zZXJ0QWZ0ZXJOb2RlKHMucHJldmlvdXNTaWJsaW5nKSx0aGlzLl9fcGFydHMucHVzaCh0KX1lbHNlIHRoaXMuX19wYXJ0cy5wdXNoKC4uLnRoaXMucHJvY2Vzc29yLmhhbmRsZUF0dHJpYnV0ZUV4cHJlc3Npb25zKHMsci5uYW1lLHIuc3RyaW5ncyx0aGlzLm9wdGlvbnMpKTtvKyt9ZWxzZSB0aGlzLl9fcGFydHMucHVzaCh2b2lkIDApLG8rKztyZXR1cm4gc1h0JiYoZG9jdW1lbnQuYWRvcHROb2RlKHQpLGN1c3RvbUVsZW1lbnRzLnVwZ3JhZGUodCkpLHR9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgICAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgICogVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgICogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgICAqIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgICovY29uc3QgRVh0PXdpbmRvdy50cnVzdGVkVHlwZXMmJnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImxpdC1odG1sIix7Y3JlYXRlSFRNTDp0PT50fSksVFh0PWAgJHtjWHR9IGA7Y2xhc3MgQ1h0e2NvbnN0cnVjdG9yKHQpe3RoaXMudmFsdWU9dm9pZCAwLHRoaXMuX19wZW5kaW5nVmFsdWU9dm9pZCAwLHRoaXMub3B0aW9ucz10fWFwcGVuZEludG8odCl7dGhpcy5zdGFydE5vZGU9dC5hcHBlbmRDaGlsZChnWHQoKSksdGhpcy5lbmROb2RlPXQuYXBwZW5kQ2hpbGQoZ1h0KCkpfWluc2VydEFmdGVyTm9kZSh0KXt0aGlzLnN0YXJ0Tm9kZT10LHRoaXMuZW5kTm9kZT10Lm5leHRTaWJsaW5nfWFwcGVuZEludG9QYXJ0KHQpe3QuX19pbnNlcnQodGhpcy5zdGFydE5vZGU9Z1h0KCkpLHQuX19pbnNlcnQodGhpcy5lbmROb2RlPWdYdCgpKX1pbnNlcnRBZnRlclBhcnQodCl7dC5fX2luc2VydCh0aGlzLnN0YXJ0Tm9kZT1nWHQoKSksdGhpcy5lbmROb2RlPXQuZW5kTm9kZSx0LmVuZE5vZGU9dGhpcy5zdGFydE5vZGV9c2V0VmFsdWUodCl7dGhpcy5fX3BlbmRpbmdWYWx1ZT10fWNvbW1pdCgpe2lmKG51bGw9PT10aGlzLnN0YXJ0Tm9kZS5wYXJlbnROb2RlKXJldHVybjtmb3IoOyJmdW5jdGlvbiI9PXR5cGVvZih0PXRoaXMuX19wZW5kaW5nVmFsdWUpJiZ4WHQuaGFzKHQpOyl7Y29uc3QgdD10aGlzLl9fcGVuZGluZ1ZhbHVlO3RoaXMuX19wZW5kaW5nVmFsdWU9d1h0LHQodGhpcyl9dmFyIHQ7Y29uc3QgZT10aGlzLl9fcGVuZGluZ1ZhbHVlO2UhPT13WHQmJigodD0+bnVsbD09PXR8fCEoIm9iamVjdCI9PXR5cGVvZiB0fHwiZnVuY3Rpb24iPT10eXBlb2YgdCkpKGUpP2UhPT10aGlzLnZhbHVlJiZ0aGlzLl9fY29tbWl0VGV4dChlKTplIGluc3RhbmNlb2YgY2xhc3N7Y29uc3RydWN0b3IodCxlLG4saSl7dGhpcy5zdHJpbmdzPXQsdGhpcy52YWx1ZXM9ZSx0aGlzLnR5cGU9bix0aGlzLnByb2Nlc3Nvcj1pfWdldEhUTUwoKXtjb25zdCB0PXRoaXMuc3RyaW5ncy5sZW5ndGgtMTtsZXQgZT0iIixuPSExO2ZvcihsZXQgaT0wO2k8dDtpKyspe2NvbnN0IHQ9dGhpcy5zdHJpbmdzW2ldLHI9dC5sYXN0SW5kZXhPZigiXHgzYyEtLSIpO249KHI+LTF8fG4pJiYtMT09PXQuaW5kZXhPZigiLS1ceDNlIixyKzEpO2NvbnN0IG89X1h0LmV4ZWModCk7ZSs9bnVsbD09PW8/dCsobj9UWHQ6dVh0KTp0LnN1YnN0cigwLG8uaW5kZXgpK29bMV0rb1syXStkWHQrb1szXStjWHR9cmV0dXJuIGUrPXRoaXMuc3RyaW5nc1t0XSxlfWdldFRlbXBsYXRlRWxlbWVudCgpe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtsZXQgZT10aGlzLmdldEhUTUwoKTtyZXR1cm4gdm9pZCAwIT09RVh0JiYoZT1FWHQuY3JlYXRlSFRNTChlKSksdC5pbm5lckhUTUw9ZSx0fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICAgKiBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgICAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgICAqIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICAgKiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICAqLz90aGlzLl9fY29tbWl0VGVtcGxhdGVSZXN1bHQoZSk6ZSBpbnN0YW5jZW9mIE5vZGU/dGhpcy5fX2NvbW1pdE5vZGUoZSk6KHQ9PkFycmF5LmlzQXJyYXkodCl8fCEoIXR8fCF0W1N5bWJvbC5pdGVyYXRvcl0pKShlKT90aGlzLl9fY29tbWl0SXRlcmFibGUoZSk6ZT09PVNYdD8odGhpcy52YWx1ZT1TWHQsdGhpcy5jbGVhcigpKTp0aGlzLl9fY29tbWl0VGV4dChlKSl9X19pbnNlcnQodCl7dGhpcy5lbmROb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHQsdGhpcy5lbmROb2RlKX1fX2NvbW1pdE5vZGUodCl7dGhpcy52YWx1ZSE9PXQmJih0aGlzLmNsZWFyKCksdGhpcy5fX2luc2VydCh0KSx0aGlzLnZhbHVlPXQpfV9fY29tbWl0VGV4dCh0KXtjb25zdCBlPXRoaXMuc3RhcnROb2RlLm5leHRTaWJsaW5nLG49InN0cmluZyI9PXR5cGVvZih0PW51bGw9PXQ/IiI6dCk/dDpTdHJpbmcodCk7ZT09PXRoaXMuZW5kTm9kZS5wcmV2aW91c1NpYmxpbmcmJjM9PT1lLm5vZGVUeXBlP2UuZGF0YT1uOnRoaXMuX19jb21taXROb2RlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG4pKSx0aGlzLnZhbHVlPXR9X19jb21taXRUZW1wbGF0ZVJlc3VsdCh0KXtjb25zdCBlPXRoaXMub3B0aW9ucy50ZW1wbGF0ZUZhY3RvcnkodCk7aWYodGhpcy52YWx1ZSBpbnN0YW5jZW9mIE1YdCYmdGhpcy52YWx1ZS50ZW1wbGF0ZT09PWUpdGhpcy52YWx1ZS51cGRhdGUodC52YWx1ZXMpO2Vsc2V7Y29uc3Qgbj1uZXcgTVh0KGUsdC5wcm9jZXNzb3IsdGhpcy5vcHRpb25zKSxpPW4uX2Nsb25lKCk7bi51cGRhdGUodC52YWx1ZXMpLHRoaXMuX19jb21taXROb2RlKGkpLHRoaXMudmFsdWU9bn19X19jb21taXRJdGVyYWJsZSh0KXtBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpfHwodGhpcy52YWx1ZT1bXSx0aGlzLmNsZWFyKCkpO2NvbnN0IGU9dGhpcy52YWx1ZTtsZXQgbixpPTA7Zm9yKGNvbnN0IHIgb2YgdCluPWVbaV0sdm9pZCAwPT09biYmKG49bmV3IENYdCh0aGlzLm9wdGlvbnMpLGUucHVzaChuKSwwPT09aT9uLmFwcGVuZEludG9QYXJ0KHRoaXMpOm4uaW5zZXJ0QWZ0ZXJQYXJ0KGVbaS0xXSkpLG4uc2V0VmFsdWUociksbi5jb21taXQoKSxpKys7aTxlLmxlbmd0aCYmKGUubGVuZ3RoPWksdGhpcy5jbGVhcihuJiZuLmVuZE5vZGUpKX1jbGVhcih0PXRoaXMuc3RhcnROb2RlKXtsWHQodGhpcy5zdGFydE5vZGUucGFyZW50Tm9kZSx0Lm5leHRTaWJsaW5nLHRoaXMuZW5kTm9kZSl9fWxldCBBWHQ9ITE7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICAgKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICAgKiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgICogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAgKi8KZnVuY3Rpb24ga1h0KHQpe2xldCBlPUxYdC5nZXQodC50eXBlKTt2b2lkIDA9PT1lJiYoZT17c3RyaW5nc0FycmF5Om5ldyBXZWFrTWFwLGtleVN0cmluZzpuZXcgTWFwfSxMWHQuc2V0KHQudHlwZSxlKSk7bGV0IG49ZS5zdHJpbmdzQXJyYXkuZ2V0KHQuc3RyaW5ncyk7aWYodm9pZCAwIT09bilyZXR1cm4gbjtjb25zdCBpPXQuc3RyaW5ncy5qb2luKGNYdCk7cmV0dXJuIG49ZS5rZXlTdHJpbmcuZ2V0KGkpLHZvaWQgMD09PW4mJihuPW5ldyBwWHQodCx0LmdldFRlbXBsYXRlRWxlbWVudCgpKSxlLmtleVN0cmluZy5zZXQoaSxuKSksZS5zdHJpbmdzQXJyYXkuc2V0KHQuc3RyaW5ncyxuKSxufSgoKT0+e3RyeXtjb25zdCB0PXtnZXQgY2FwdHVyZSgpe3JldHVybiBBWHQ9ITAsITF9fTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsdCx0KSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGVzdCIsdCx0KX1jYXRjaCh0KXt9fSkoKTtjb25zdCBMWHQ9bmV3IE1hcCxQWHQ9bmV3IFdlYWtNYXA7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICAgKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICAgKiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgICogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAgKi8KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICAgKiBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgICAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgICAqIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICAgKiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICAqLwoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmKHdpbmRvdy5saXRIdG1sVmVyc2lvbnN8fCh3aW5kb3cubGl0SHRtbFZlcnNpb25zPVtdKSkucHVzaCgiMS40LjEiKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICAgKiBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgICAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgICAqIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICAgKiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICAqL2NvbnN0IE5YdD0odCxlKT0+YCR7dH0tLSR7ZX1gO2xldCBJWHQ9ITA7dm9pZCAwPT09d2luZG93LlNoYWR5Q1NTP0lYdD0hMTp2b2lkIDA9PT13aW5kb3cuU2hhZHlDU1MucHJlcGFyZVRlbXBsYXRlRG9tJiYoY29uc29sZS53YXJuKCJJbmNvbXBhdGlibGUgU2hhZHlDU1MgdmVyc2lvbiBkZXRlY3RlZC4gUGxlYXNlIHVwZGF0ZSB0byBhdCBsZWFzdCBAd2ViY29tcG9uZW50cy93ZWJjb21wb25lbnRzanNAMi4wLjIgYW5kIEB3ZWJjb21wb25lbnRzL3NoYWR5Y3NzQDEuMy4xLiIpLElYdD0hMSk7Y29uc3QgUlh0PXQ9PmU9Pntjb25zdCBuPU5YdChlLnR5cGUsdCk7bGV0IGk9TFh0LmdldChuKTt2b2lkIDA9PT1pJiYoaT17c3RyaW5nc0FycmF5Om5ldyBXZWFrTWFwLGtleVN0cmluZzpuZXcgTWFwfSxMWHQuc2V0KG4saSkpO2xldCByPWkuc3RyaW5nc0FycmF5LmdldChlLnN0cmluZ3MpO2lmKHZvaWQgMCE9PXIpcmV0dXJuIHI7Y29uc3Qgbz1lLnN0cmluZ3Muam9pbihjWHQpO2lmKHI9aS5rZXlTdHJpbmcuZ2V0KG8pLHZvaWQgMD09PXIpe2NvbnN0IG49ZS5nZXRUZW1wbGF0ZUVsZW1lbnQoKTtJWHQmJndpbmRvdy5TaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGVEb20obix0KSxyPW5ldyBwWHQoZSxuKSxpLmtleVN0cmluZy5zZXQobyxyKX1yZXR1cm4gaS5zdHJpbmdzQXJyYXkuc2V0KGUuc3RyaW5ncyxyKSxyfSxPWHQ9WyJodG1sIiwic3ZnIl0selh0PW5ldyBTZXQ7d2luZG93LkpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHk9KHQsZSk9PnQ7Y29uc3QgRFh0PXt0b0F0dHJpYnV0ZSh0LGUpe3N3aXRjaChlKXtjYXNlIEJvb2xlYW46cmV0dXJuIHQ/IiI6bnVsbDtjYXNlIE9iamVjdDpjYXNlIEFycmF5OnJldHVybiBudWxsPT10P3Q6SlNPTi5zdHJpbmdpZnkodCl9cmV0dXJuIHR9LGZyb21BdHRyaWJ1dGUodCxlKXtzd2l0Y2goZSl7Y2FzZSBCb29sZWFuOnJldHVybiBudWxsIT09dDtjYXNlIE51bWJlcjpyZXR1cm4gbnVsbD09PXQ/bnVsbDpOdW1iZXIodCk7Y2FzZSBPYmplY3Q6Y2FzZSBBcnJheTpyZXR1cm4gSlNPTi5wYXJzZSh0KX1yZXR1cm4gdH19LEJYdD0odCxlKT0+ZSE9PXQmJihlPT1lfHx0PT10KSxIWHQ9e2F0dHJpYnV0ZTohMCx0eXBlOlN0cmluZyxjb252ZXJ0ZXI6RFh0LHJlZmxlY3Q6ITEsaGFzQ2hhbmdlZDpCWHR9O2NsYXNzIEZYdCBleHRlbmRzIEhUTUxFbGVtZW50e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmluaXRpYWxpemUoKX1zdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpe3RoaXMuZmluYWxpemUoKTtjb25zdCB0PVtdO3JldHVybiB0aGlzLl9jbGFzc1Byb3BlcnRpZXMuZm9yRWFjaCgoKGUsbik9Pntjb25zdCBpPXRoaXMuX2F0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShuLGUpO3ZvaWQgMCE9PWkmJih0aGlzLl9hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwLnNldChpLG4pLHQucHVzaChpKSl9KSksdH1zdGF0aWMgX2Vuc3VyZUNsYXNzUHJvcGVydGllcygpe2lmKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl9jbGFzc1Byb3BlcnRpZXMiLHRoaXMpKSl7dGhpcy5fY2xhc3NQcm9wZXJ0aWVzPW5ldyBNYXA7Y29uc3QgdD1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2NsYXNzUHJvcGVydGllczt2b2lkIDAhPT10JiZ0LmZvckVhY2goKCh0LGUpPT50aGlzLl9jbGFzc1Byb3BlcnRpZXMuc2V0KGUsdCkpKX19c3RhdGljIGNyZWF0ZVByb3BlcnR5KHQsZT1IWHQpe2lmKHRoaXMuX2Vuc3VyZUNsYXNzUHJvcGVydGllcygpLHRoaXMuX2NsYXNzUHJvcGVydGllcy5zZXQodCxlKSxlLm5vQWNjZXNzb3J8fHRoaXMucHJvdG90eXBlLmhhc093blByb3BlcnR5KHQpKXJldHVybjtjb25zdCBuPSJzeW1ib2wiPT10eXBlb2YgdD9TeW1ib2woKTpgX18ke3R9YCxpPXRoaXMuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHQsbixlKTt2b2lkIDAhPT1pJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5wcm90b3R5cGUsdCxpKX1zdGF0aWMgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHQsZSxuKXtyZXR1cm57Z2V0KCl7cmV0dXJuIHRoaXNbZV19LHNldChpKXtjb25zdCByPXRoaXNbdF07dGhpc1tlXT1pLHRoaXMucmVxdWVzdFVwZGF0ZUludGVybmFsKHQscixuKX0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITB9fXN0YXRpYyBnZXRQcm9wZXJ0eU9wdGlvbnModCl7cmV0dXJuIHRoaXMuX2NsYXNzUHJvcGVydGllcyYmdGhpcy5fY2xhc3NQcm9wZXJ0aWVzLmdldCh0KXx8SFh0fXN0YXRpYyBmaW5hbGl6ZSgpe2NvbnN0IHQ9T2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO2lmKHQuaGFzT3duUHJvcGVydHkoImZpbmFsaXplZCIpfHx0LmZpbmFsaXplKCksdGhpcy5maW5hbGl6ZWQ9ITAsdGhpcy5fZW5zdXJlQ2xhc3NQcm9wZXJ0aWVzKCksdGhpcy5fYXR0cmlidXRlVG9Qcm9wZXJ0eU1hcD1uZXcgTWFwLHRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgicHJvcGVydGllcyIsdGhpcykpKXtjb25zdCB0PXRoaXMucHJvcGVydGllcyxlPVsuLi5PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KSwuLi4iZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz9PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpOltdXTtmb3IoY29uc3QgbiBvZiBlKXRoaXMuY3JlYXRlUHJvcGVydHkobix0W25dKX19c3RhdGljIF9hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkodCxlKXtjb25zdCBuPWUuYXR0cmlidXRlO3JldHVybiExPT09bj92b2lkIDA6InN0cmluZyI9PXR5cGVvZiBuP246InN0cmluZyI9PXR5cGVvZiB0P3QudG9Mb3dlckNhc2UoKTp2b2lkIDB9c3RhdGljIF92YWx1ZUhhc0NoYW5nZWQodCxlLG49Qlh0KXtyZXR1cm4gbih0LGUpfXN0YXRpYyBfcHJvcGVydHlWYWx1ZUZyb21BdHRyaWJ1dGUodCxlKXtjb25zdCBuPWUuY29udmVydGVyfHxEWHQsaT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOm4uZnJvbUF0dHJpYnV0ZTtyZXR1cm4gaT9pKHQsZS50eXBlKTp0fXN0YXRpYyBfcHJvcGVydHlWYWx1ZVRvQXR0cmlidXRlKHQsZSl7aWYodm9pZCAwPT09ZS5yZWZsZWN0KXJldHVybjtjb25zdCBuPWUuY29udmVydGVyO3JldHVybihuJiZuLnRvQXR0cmlidXRlfHxEWHQudG9BdHRyaWJ1dGUpKHQsZS50eXBlKX1pbml0aWFsaXplKCl7dGhpcy5fdXBkYXRlU3RhdGU9MCx0aGlzLl91cGRhdGVQcm9taXNlPW5ldyBQcm9taXNlKCh0PT50aGlzLl9lbmFibGVVcGRhdGluZ1Jlc29sdmVyPXQpKSx0aGlzLl9jaGFuZ2VkUHJvcGVydGllcz1uZXcgTWFwLHRoaXMuX3NhdmVJbnN0YW5jZVByb3BlcnRpZXMoKSx0aGlzLnJlcXVlc3RVcGRhdGVJbnRlcm5hbCgpfV9zYXZlSW5zdGFuY2VQcm9wZXJ0aWVzKCl7dGhpcy5jb25zdHJ1Y3Rvci5fY2xhc3NQcm9wZXJ0aWVzLmZvckVhY2goKCh0LGUpPT57aWYodGhpcy5oYXNPd25Qcm9wZXJ0eShlKSl7Y29uc3QgdD10aGlzW2VdO2RlbGV0ZSB0aGlzW2VdLHRoaXMuX2luc3RhbmNlUHJvcGVydGllc3x8KHRoaXMuX2luc3RhbmNlUHJvcGVydGllcz1uZXcgTWFwKSx0aGlzLl9pbnN0YW5jZVByb3BlcnRpZXMuc2V0KGUsdCl9fSkpfV9hcHBseUluc3RhbmNlUHJvcGVydGllcygpe3RoaXMuX2luc3RhbmNlUHJvcGVydGllcy5mb3JFYWNoKCgodCxlKT0+dGhpc1tlXT10KSksdGhpcy5faW5zdGFuY2VQcm9wZXJ0aWVzPXZvaWQgMH1jb25uZWN0ZWRDYWxsYmFjaygpe3RoaXMuZW5hYmxlVXBkYXRpbmcoKX1lbmFibGVVcGRhdGluZygpe3ZvaWQgMCE9PXRoaXMuX2VuYWJsZVVwZGF0aW5nUmVzb2x2ZXImJih0aGlzLl9lbmFibGVVcGRhdGluZ1Jlc29sdmVyKCksdGhpcy5fZW5hYmxlVXBkYXRpbmdSZXNvbHZlcj12b2lkIDApfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7fWF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0LGUsbil7ZSE9PW4mJnRoaXMuX2F0dHJpYnV0ZVRvUHJvcGVydHkodCxuKX1fcHJvcGVydHlUb0F0dHJpYnV0ZSh0LGUsbj1IWHQpe2NvbnN0IGk9dGhpcy5jb25zdHJ1Y3RvcixyPWkuX2F0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eSh0LG4pO2lmKHZvaWQgMCE9PXIpe2NvbnN0IHQ9aS5fcHJvcGVydHlWYWx1ZVRvQXR0cmlidXRlKGUsbik7aWYodm9pZCAwPT09dClyZXR1cm47dGhpcy5fdXBkYXRlU3RhdGU9OHx0aGlzLl91cGRhdGVTdGF0ZSxudWxsPT10P3RoaXMucmVtb3ZlQXR0cmlidXRlKHIpOnRoaXMuc2V0QXR0cmlidXRlKHIsdCksdGhpcy5fdXBkYXRlU3RhdGU9LTkmdGhpcy5fdXBkYXRlU3RhdGV9fV9hdHRyaWJ1dGVUb1Byb3BlcnR5KHQsZSl7aWYoOCZ0aGlzLl91cGRhdGVTdGF0ZSlyZXR1cm47Y29uc3Qgbj10aGlzLmNvbnN0cnVjdG9yLGk9bi5fYXR0cmlidXRlVG9Qcm9wZXJ0eU1hcC5nZXQodCk7aWYodm9pZCAwIT09aSl7Y29uc3QgdD1uLmdldFByb3BlcnR5T3B0aW9ucyhpKTt0aGlzLl91cGRhdGVTdGF0ZT0xNnx0aGlzLl91cGRhdGVTdGF0ZSx0aGlzW2ldPW4uX3Byb3BlcnR5VmFsdWVGcm9tQXR0cmlidXRlKGUsdCksdGhpcy5fdXBkYXRlU3RhdGU9LTE3JnRoaXMuX3VwZGF0ZVN0YXRlfX1yZXF1ZXN0VXBkYXRlSW50ZXJuYWwodCxlLG4pe2xldCBpPSEwO2lmKHZvaWQgMCE9PXQpe2NvbnN0IHI9dGhpcy5jb25zdHJ1Y3RvcjtuPW58fHIuZ2V0UHJvcGVydHlPcHRpb25zKHQpLHIuX3ZhbHVlSGFzQ2hhbmdlZCh0aGlzW3RdLGUsbi5oYXNDaGFuZ2VkKT8odGhpcy5fY2hhbmdlZFByb3BlcnRpZXMuaGFzKHQpfHx0aGlzLl9jaGFuZ2VkUHJvcGVydGllcy5zZXQodCxlKSwhMCE9PW4ucmVmbGVjdHx8MTYmdGhpcy5fdXBkYXRlU3RhdGV8fCh2b2lkIDA9PT10aGlzLl9yZWZsZWN0aW5nUHJvcGVydGllcyYmKHRoaXMuX3JlZmxlY3RpbmdQcm9wZXJ0aWVzPW5ldyBNYXApLHRoaXMuX3JlZmxlY3RpbmdQcm9wZXJ0aWVzLnNldCh0LG4pKSk6aT0hMX0hdGhpcy5faGFzUmVxdWVzdGVkVXBkYXRlJiZpJiYodGhpcy5fdXBkYXRlUHJvbWlzZT10aGlzLl9lbnF1ZXVlVXBkYXRlKCkpfXJlcXVlc3RVcGRhdGUodCxlKXtyZXR1cm4gdGhpcy5yZXF1ZXN0VXBkYXRlSW50ZXJuYWwodCxlKSx0aGlzLnVwZGF0ZUNvbXBsZXRlfWFzeW5jIF9lbnF1ZXVlVXBkYXRlKCl7dGhpcy5fdXBkYXRlU3RhdGU9NHx0aGlzLl91cGRhdGVTdGF0ZTt0cnl7YXdhaXQgdGhpcy5fdXBkYXRlUHJvbWlzZX1jYXRjaCh0KXt9Y29uc3QgdD10aGlzLnBlcmZvcm1VcGRhdGUoKTtyZXR1cm4gbnVsbCE9dCYmYXdhaXQgdCwhdGhpcy5faGFzUmVxdWVzdGVkVXBkYXRlfWdldCBfaGFzUmVxdWVzdGVkVXBkYXRlKCl7cmV0dXJuIDQmdGhpcy5fdXBkYXRlU3RhdGV9Z2V0IGhhc1VwZGF0ZWQoKXtyZXR1cm4gMSZ0aGlzLl91cGRhdGVTdGF0ZX1wZXJmb3JtVXBkYXRlKCl7aWYoIXRoaXMuX2hhc1JlcXVlc3RlZFVwZGF0ZSlyZXR1cm47dGhpcy5faW5zdGFuY2VQcm9wZXJ0aWVzJiZ0aGlzLl9hcHBseUluc3RhbmNlUHJvcGVydGllcygpO2xldCB0PSExO2NvbnN0IGU9dGhpcy5fY2hhbmdlZFByb3BlcnRpZXM7dHJ5e3Q9dGhpcy5zaG91bGRVcGRhdGUoZSksdD90aGlzLnVwZGF0ZShlKTp0aGlzLl9tYXJrVXBkYXRlZCgpfWNhdGNoKGUpe3Rocm93IHQ9ITEsdGhpcy5fbWFya1VwZGF0ZWQoKSxlfXQmJigxJnRoaXMuX3VwZGF0ZVN0YXRlfHwodGhpcy5fdXBkYXRlU3RhdGU9MXx0aGlzLl91cGRhdGVTdGF0ZSx0aGlzLmZpcnN0VXBkYXRlZChlKSksdGhpcy51cGRhdGVkKGUpKX1fbWFya1VwZGF0ZWQoKXt0aGlzLl9jaGFuZ2VkUHJvcGVydGllcz1uZXcgTWFwLHRoaXMuX3VwZGF0ZVN0YXRlPS01JnRoaXMuX3VwZGF0ZVN0YXRlfWdldCB1cGRhdGVDb21wbGV0ZSgpe3JldHVybiB0aGlzLl9nZXRVcGRhdGVDb21wbGV0ZSgpfV9nZXRVcGRhdGVDb21wbGV0ZSgpe3JldHVybiB0aGlzLmdldFVwZGF0ZUNvbXBsZXRlKCl9Z2V0VXBkYXRlQ29tcGxldGUoKXtyZXR1cm4gdGhpcy5fdXBkYXRlUHJvbWlzZX1zaG91bGRVcGRhdGUodCl7cmV0dXJuITB9dXBkYXRlKHQpe3ZvaWQgMCE9PXRoaXMuX3JlZmxlY3RpbmdQcm9wZXJ0aWVzJiZ0aGlzLl9yZWZsZWN0aW5nUHJvcGVydGllcy5zaXplPjAmJih0aGlzLl9yZWZsZWN0aW5nUHJvcGVydGllcy5mb3JFYWNoKCgodCxlKT0+dGhpcy5fcHJvcGVydHlUb0F0dHJpYnV0ZShlLHRoaXNbZV0sdCkpKSx0aGlzLl9yZWZsZWN0aW5nUHJvcGVydGllcz12b2lkIDApLHRoaXMuX21hcmtVcGRhdGVkKCl9dXBkYXRlZCh0KXt9Zmlyc3RVcGRhdGVkKHQpe319Rlh0LmZpbmFsaXplZD0hMDsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE5IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IFZYdD13aW5kb3cuU2hhZG93Um9vdCYmKHZvaWQgMD09PXdpbmRvdy5TaGFkeUNTU3x8d2luZG93LlNoYWR5Q1NTLm5hdGl2ZVNoYWRvdykmJiJhZG9wdGVkU3R5bGVTaGVldHMiaW4gRG9jdW1lbnQucHJvdG90eXBlJiYicmVwbGFjZSJpbiBDU1NTdHlsZVNoZWV0LnByb3RvdHlwZSxVWHQ9U3ltYm9sKCk7Y2xhc3Mgalh0e2NvbnN0cnVjdG9yKHQsZSl7aWYoZSE9PVVYdCl0aHJvdyBuZXcgRXJyb3IoIkNTU1Jlc3VsdCBpcyBub3QgY29uc3RydWN0YWJsZS4gVXNlIGB1bnNhZmVDU1NgIG9yIGBjc3NgIGluc3RlYWQuIik7dGhpcy5jc3NUZXh0PXR9Z2V0IHN0eWxlU2hlZXQoKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5fc3R5bGVTaGVldCYmKFZYdD8odGhpcy5fc3R5bGVTaGVldD1uZXcgQ1NTU3R5bGVTaGVldCx0aGlzLl9zdHlsZVNoZWV0LnJlcGxhY2VTeW5jKHRoaXMuY3NzVGV4dCkpOnRoaXMuX3N0eWxlU2hlZXQ9bnVsbCksdGhpcy5fc3R5bGVTaGVldH10b1N0cmluZygpe3JldHVybiB0aGlzLmNzc1RleHR9fWNvbnN0IEdYdD0odCwuLi5lKT0+e2NvbnN0IG49ZS5yZWR1Y2UoKChlLG4saSk9PmUrKHQ9PntpZih0IGluc3RhbmNlb2Ygalh0KXJldHVybiB0LmNzc1RleHQ7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiB0O3Rocm93IG5ldyBFcnJvcihgVmFsdWUgcGFzc2VkIHRvICdjc3MnIGZ1bmN0aW9uIG11c3QgYmUgYSAnY3NzJyBmdW5jdGlvbiByZXN1bHQ6ICR7dH0uIFVzZSAndW5zYWZlQ1NTJyB0byBwYXNzIG5vbi1saXRlcmFsIHZhbHVlcywgYnV0XG4gICAgICAgICAgICB0YWtlIGNhcmUgdG8gZW5zdXJlIHBhZ2Ugc2VjdXJpdHkuYCl9KShuKSt0W2krMV0pLHRbMF0pO3JldHVybiBuZXcgalh0KG4sVVh0KX07Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICAgKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICAgKiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgICogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAgKi8KKHdpbmRvdy5saXRFbGVtZW50VmVyc2lvbnN8fCh3aW5kb3cubGl0RWxlbWVudFZlcnNpb25zPVtdKSkucHVzaCgiMi41LjEiKTtjb25zdCBXWHQ9e307Y2xhc3MgcVh0IGV4dGVuZHMgRlh0e3N0YXRpYyBnZXRTdHlsZXMoKXtyZXR1cm4gdGhpcy5zdHlsZXN9c3RhdGljIF9nZXRVbmlxdWVTdHlsZXMoKXtpZih0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl9zdHlsZXMiLHRoaXMpKSlyZXR1cm47Y29uc3QgdD10aGlzLmdldFN0eWxlcygpO2lmKEFycmF5LmlzQXJyYXkodCkpe2NvbnN0IGU9KHQsbik9PnQucmVkdWNlUmlnaHQoKCh0LG4pPT5BcnJheS5pc0FycmF5KG4pP2Uobix0KToodC5hZGQobiksdCkpLG4pLG49ZSh0LG5ldyBTZXQpLGk9W107bi5mb3JFYWNoKCh0PT5pLnVuc2hpZnQodCkpKSx0aGlzLl9zdHlsZXM9aX1lbHNlIHRoaXMuX3N0eWxlcz12b2lkIDA9PT10P1tdOlt0XTt0aGlzLl9zdHlsZXM9dGhpcy5fc3R5bGVzLm1hcCgodD0+dCBpbnN0YW5jZW9mIENTU1N0eWxlU2hlZXQmJiFWWHQ/KHQ9Pm5ldyBqWHQoU3RyaW5nKHQpLFVYdCkpKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQuY3NzUnVsZXMpLnJlZHVjZSgoKHQsZSk9PnQrZS5jc3NUZXh0KSwiIikpOnQpKX1pbml0aWFsaXplKCl7c3VwZXIuaW5pdGlhbGl6ZSgpLHRoaXMuY29uc3RydWN0b3IuX2dldFVuaXF1ZVN0eWxlcygpLHRoaXMucmVuZGVyUm9vdD10aGlzLmNyZWF0ZVJlbmRlclJvb3QoKSx3aW5kb3cuU2hhZG93Um9vdCYmdGhpcy5yZW5kZXJSb290IGluc3RhbmNlb2Ygd2luZG93LlNoYWRvd1Jvb3QmJnRoaXMuYWRvcHRTdHlsZXMoKX1jcmVhdGVSZW5kZXJSb290KCl7cmV0dXJuIHRoaXMuYXR0YWNoU2hhZG93KHRoaXMuY29uc3RydWN0b3Iuc2hhZG93Um9vdE9wdGlvbnMpfWFkb3B0U3R5bGVzKCl7Y29uc3QgdD10aGlzLmNvbnN0cnVjdG9yLl9zdHlsZXM7MCE9PXQubGVuZ3RoJiYodm9pZCAwPT09d2luZG93LlNoYWR5Q1NTfHx3aW5kb3cuU2hhZHlDU1MubmF0aXZlU2hhZG93P1ZYdD90aGlzLnJlbmRlclJvb3QuYWRvcHRlZFN0eWxlU2hlZXRzPXQubWFwKCh0PT50IGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldD90OnQuc3R5bGVTaGVldCkpOnRoaXMuX25lZWRzU2hpbUFkb3B0ZWRTdHlsZVNoZWV0cz0hMDp3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0ucHJlcGFyZUFkb3B0ZWRDc3NUZXh0KHQubWFwKCh0PT50LmNzc1RleHQpKSx0aGlzLmxvY2FsTmFtZSkpfWNvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLmhhc1VwZGF0ZWQmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLnN0eWxlRWxlbWVudCh0aGlzKX11cGRhdGUodCl7Y29uc3QgZT10aGlzLnJlbmRlcigpO3N1cGVyLnVwZGF0ZSh0KSxlIT09V1h0JiZ0aGlzLmNvbnN0cnVjdG9yLnJlbmRlcihlLHRoaXMucmVuZGVyUm9vdCx7c2NvcGVOYW1lOnRoaXMubG9jYWxOYW1lLGV2ZW50Q29udGV4dDp0aGlzfSksdGhpcy5fbmVlZHNTaGltQWRvcHRlZFN0eWxlU2hlZXRzJiYodGhpcy5fbmVlZHNTaGltQWRvcHRlZFN0eWxlU2hlZXRzPSExLHRoaXMuY29uc3RydWN0b3IuX3N0eWxlcy5mb3JFYWNoKCh0PT57Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2UudGV4dENvbnRlbnQ9dC5jc3NUZXh0LHRoaXMucmVuZGVyUm9vdC5hcHBlbmRDaGlsZChlKX0pKSl9cmVuZGVyKCl7cmV0dXJuIFdYdH19cVh0LmZpbmFsaXplZD0hMCxxWHQucmVuZGVyPSh0LGUsbik9PntpZighbnx8Im9iamVjdCIhPXR5cGVvZiBufHwhbi5zY29wZU5hbWUpdGhyb3cgbmV3IEVycm9yKCJUaGUgYHNjb3BlTmFtZWAgb3B0aW9uIGlzIHJlcXVpcmVkLiIpO2NvbnN0IGk9bi5zY29wZU5hbWUscj1QWHQuaGFzKGUpLG89SVh0JiYxMT09PWUubm9kZVR5cGUmJiEhZS5ob3N0LGE9byYmIXpYdC5oYXMoaSkscz1hP2RvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTplO2lmKCgodCxlLG4pPT57bGV0IGk9UFh0LmdldChlKTt2b2lkIDA9PT1pJiYobFh0KGUsZS5maXJzdENoaWxkKSxQWHQuc2V0KGUsaT1uZXcgQ1h0KE9iamVjdC5hc3NpZ24oe3RlbXBsYXRlRmFjdG9yeTprWHR9LG4pKSksaS5hcHBlbmRJbnRvKGUpKSxpLnNldFZhbHVlKHQpLGkuY29tbWl0KCl9KSh0LHMsT2JqZWN0LmFzc2lnbih7dGVtcGxhdGVGYWN0b3J5OlJYdChpKX0sbikpLGEpe2NvbnN0IHQ9UFh0LmdldChzKTtQWHQuZGVsZXRlKHMpLCgodCxlLG4pPT57elh0LmFkZCh0KTtjb25zdCBpPW4/bi5lbGVtZW50OmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIikscj1lLnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlIikse2xlbmd0aDpvfT1yO2lmKDA9PT1vKXJldHVybiB2b2lkIHdpbmRvdy5TaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGVTdHlsZXMoaSx0KTtjb25zdCBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7Zm9yKGxldCB0PTA7dDxvO3QrKyl7Y29uc3QgZT1yW3RdO2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSxhLnRleHRDb250ZW50Kz1lLnRleHRDb250ZW50fSh0PT57T1h0LmZvckVhY2goKGU9Pntjb25zdCBuPUxYdC5nZXQoTlh0KGUsdCkpO3ZvaWQgMCE9PW4mJm4ua2V5U3RyaW5nLmZvckVhY2goKHQ9Pntjb25zdHtlbGVtZW50Ontjb250ZW50OmV9fT10LG49bmV3IFNldDtBcnJheS5mcm9tKGUucXVlcnlTZWxlY3RvckFsbCgic3R5bGUiKSkuZm9yRWFjaCgodD0+e24uYWRkKHQpfSkpLHlYdCh0LG4pfSkpfSkpfSkodCk7Y29uc3Qgcz1pLmNvbnRlbnQ7bj8oZnVuY3Rpb24gbCh0LGUsbj1udWxsKXtjb25zdHtlbGVtZW50Ontjb250ZW50Oml9LHBhcnRzOnJ9PXQ7aWYobnVsbD09bilyZXR1cm4gdm9pZCBpLmFwcGVuZENoaWxkKGUpO2NvbnN0IG89ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihpLDEzMyxudWxsLCExKTtsZXQgYT1iWHQocikscz0wLGw9LTE7Zm9yKDtvLm5leHROb2RlKCk7KWZvcihsKyssby5jdXJyZW50Tm9kZT09PW4mJihzPXZYdChlKSxuLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsbikpOy0xIT09YSYmclthXS5pbmRleD09PWw7KXtpZihzPjApe2Zvcig7LTEhPT1hOylyW2FdLmluZGV4Kz1zLGE9Ylh0KHIsYSk7cmV0dXJufWE9Ylh0KHIsYSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgICAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgICogVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgICogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgICAqIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgICovKShuLGEscy5maXJzdENoaWxkKTpzLmluc2VydEJlZm9yZShhLHMuZmlyc3RDaGlsZCksd2luZG93LlNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZVN0eWxlcyhpLHQpO2NvbnN0IGM9cy5xdWVyeVNlbGVjdG9yKCJzdHlsZSIpO2lmKHdpbmRvdy5TaGFkeUNTUy5uYXRpdmVTaGFkb3cmJm51bGwhPT1jKWUuaW5zZXJ0QmVmb3JlKGMuY2xvbmVOb2RlKCEwKSxlLmZpcnN0Q2hpbGQpO2Vsc2UgaWYobil7cy5pbnNlcnRCZWZvcmUoYSxzLmZpcnN0Q2hpbGQpO2NvbnN0IHQ9bmV3IFNldDt0LmFkZChhKSx5WHQobix0KX19KShpLHMsdC52YWx1ZSBpbnN0YW5jZW9mIE1YdD90LnZhbHVlLnRlbXBsYXRlOnZvaWQgMCksbFh0KGUsZS5maXJzdENoaWxkKSxlLmFwcGVuZENoaWxkKHMpLFBYdC5zZXQoZSx0KX0hciYmbyYmd2luZG93LlNoYWR5Q1NTLnN0eWxlRWxlbWVudChlLmhvc3QpfSxxWHQuc2hhZG93Um9vdE9wdGlvbnM9e21vZGU6Im9wZW4ifTtsZXQgWVh0PTA7Y29uc3QgWFh0PXt9LCRYdD0odCxlLG4pPT57Y29uc3QgaT1uJiZuLm1vZHVsZUlkfHwiY3VzdG9tLXN0eWxlLW1vZHVsZS0iK1lYdCsrO0FycmF5LmlzQXJyYXkoZSl8fChlPWU/W2VdOltdKSxlLmZvckVhY2goKHQ9PntpZighKHQgaW5zdGFuY2VvZiBqWHQpKXRocm93IG5ldyBFcnJvcigiQW4gaXRlbSBpbiBzdHlsZXMgaXMgbm90IG9mIHR5cGUgQ1NTUmVzdWx0LiBVc2UgYHVuc2FmZUNTU2Agb3IgYGNzc2AuIik7aWYoIVhYdFt0XSl7Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkb20tbW9kdWxlIik7ZS5pbm5lckhUTUw9YFxuICAgICAgICA8dGVtcGxhdGU+XG4gICAgICAgICAgPHN0eWxlPiR7dC50b1N0cmluZygpfTwvc3R5bGU+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICBgO2NvbnN0IG49ImN1c3RvbS1zdHlsZS1tb2R1bGUtIitZWHQrKztlLnJlZ2lzdGVyKG4pLFhYdFt0XT1ufX0pKTtjb25zdCByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRvbS1tb2R1bGUiKTtpZih0KXtjb25zdCBlPWN1c3RvbUVsZW1lbnRzLmdldCh0KTtlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwiX19maW5hbGl6ZWQiKSYmY29uc29sZS53YXJuKGBUaGUgY3VzdG9tIGVsZW1lbnQgZGVmaW5pdGlvbiBmb3IgIiR7dH0iXG4gICAgICB3YXMgZmluYWxpemVkIGJlZm9yZSBhIHN0eWxlIG1vZHVsZSB3YXMgcmVnaXN0ZXJlZC5cbiAgICAgIE1ha2Ugc3VyZSB0byBhZGQgY29tcG9uZW50IHNwZWNpZmljIHN0eWxlIG1vZHVsZXMgYmVmb3JlXG4gICAgICBpbXBvcnRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY3VzdG9tIGVsZW1lbnQuYCksci5zZXRBdHRyaWJ1dGUoInRoZW1lLWZvciIsdCl9ci5pbm5lckhUTUw9YFxuICAgIDx0ZW1wbGF0ZT5cbiAgICAgICR7KG4mJm4uaW5jbHVkZXx8W10pLm1hcCgodD0+YDxzdHlsZSBpbmNsdWRlPSR7dH0+PC9zdHlsZT5gKSl9XG4gICAgICAke2UubWFwKCh0PT5gPHN0eWxlIGluY2x1ZGU9JHtYWHRbdF19Pjwvc3R5bGU+YCkpfVxuICAgIDwvdGVtcGxhdGU+XG4gIGAsci5yZWdpc3RlcihpKX07Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovCmNsYXNzIEtYdCBleHRlbmRzIEhUTUxFbGVtZW50e3N0YXRpYyBnZXQgdmVyc2lvbigpe3JldHVybiIyMC4wLjIifX1jdXN0b21FbGVtZW50cy5kZWZpbmUoInZhYWRpbi1sdW1vLXN0eWxlcyIsS1h0KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi8KY29uc3QgWlh0PUdYdGAKICA6aG9zdCB7CiAgICAvKiBCYXNlIChiYWNrZ3JvdW5kKSAqLwogICAgLS1sdW1vLWJhc2UtY29sb3I6ICNmZmY7CgogICAgLyogVGludCAqLwogICAgLS1sdW1vLXRpbnQtNXBjdDogaHNsYSgwLCAwJSwgMTAwJSwgMC4zKTsKICAgIC0tbHVtby10aW50LTEwcGN0OiBoc2xhKDAsIDAlLCAxMDAlLCAwLjM3KTsKICAgIC0tbHVtby10aW50LTIwcGN0OiBoc2xhKDAsIDAlLCAxMDAlLCAwLjQ0KTsKICAgIC0tbHVtby10aW50LTMwcGN0OiBoc2xhKDAsIDAlLCAxMDAlLCAwLjUpOwogICAgLS1sdW1vLXRpbnQtNDBwY3Q6IGhzbGEoMCwgMCUsIDEwMCUsIDAuNTcpOwogICAgLS1sdW1vLXRpbnQtNTBwY3Q6IGhzbGEoMCwgMCUsIDEwMCUsIDAuNjQpOwogICAgLS1sdW1vLXRpbnQtNjBwY3Q6IGhzbGEoMCwgMCUsIDEwMCUsIDAuNyk7CiAgICAtLWx1bW8tdGludC03MHBjdDogaHNsYSgwLCAwJSwgMTAwJSwgMC43Nyk7CiAgICAtLWx1bW8tdGludC04MHBjdDogaHNsYSgwLCAwJSwgMTAwJSwgMC44NCk7CiAgICAtLWx1bW8tdGludC05MHBjdDogaHNsYSgwLCAwJSwgMTAwJSwgMC45KTsKICAgIC0tbHVtby10aW50OiAjZmZmOwoKICAgIC8qIFNoYWRlICovCiAgICAtLWx1bW8tc2hhZGUtNXBjdDogaHNsYSgyMTQsIDYxJSwgMjUlLCAwLjA1KTsKICAgIC0tbHVtby1zaGFkZS0xMHBjdDogaHNsYSgyMTQsIDU3JSwgMjQlLCAwLjEpOwogICAgLS1sdW1vLXNoYWRlLTIwcGN0OiBoc2xhKDIxNCwgNTMlLCAyMyUsIDAuMTYpOwogICAgLS1sdW1vLXNoYWRlLTMwcGN0OiBoc2xhKDIxNCwgNTAlLCAyMiUsIDAuMjYpOwogICAgLS1sdW1vLXNoYWRlLTQwcGN0OiBoc2xhKDIxNCwgNDclLCAyMSUsIDAuMzgpOwogICAgLS1sdW1vLXNoYWRlLTUwcGN0OiBoc2xhKDIxNCwgNDUlLCAyMCUsIDAuNSk7CiAgICAtLWx1bW8tc2hhZGUtNjBwY3Q6IGhzbGEoMjE0LCA0MyUsIDE5JSwgMC42MSk7CiAgICAtLWx1bW8tc2hhZGUtNzBwY3Q6IGhzbGEoMjE0LCA0MiUsIDE4JSwgMC43Mik7CiAgICAtLWx1bW8tc2hhZGUtODBwY3Q6IGhzbGEoMjE0LCA0MSUsIDE3JSwgMC44Myk7CiAgICAtLWx1bW8tc2hhZGUtOTBwY3Q6IGhzbGEoMjE0LCA0MCUsIDE2JSwgMC45NCk7CiAgICAtLWx1bW8tc2hhZGU6IGhzbCgyMTQsIDM1JSwgMTUlKTsKCiAgICAvKiBDb250cmFzdCAqLwogICAgLS1sdW1vLWNvbnRyYXN0LTVwY3Q6IHZhcigtLWx1bW8tc2hhZGUtNXBjdCk7CiAgICAtLWx1bW8tY29udHJhc3QtMTBwY3Q6IHZhcigtLWx1bW8tc2hhZGUtMTBwY3QpOwogICAgLS1sdW1vLWNvbnRyYXN0LTIwcGN0OiB2YXIoLS1sdW1vLXNoYWRlLTIwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC0zMHBjdDogdmFyKC0tbHVtby1zaGFkZS0zMHBjdCk7CiAgICAtLWx1bW8tY29udHJhc3QtNDBwY3Q6IHZhcigtLWx1bW8tc2hhZGUtNDBwY3QpOwogICAgLS1sdW1vLWNvbnRyYXN0LTUwcGN0OiB2YXIoLS1sdW1vLXNoYWRlLTUwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC02MHBjdDogdmFyKC0tbHVtby1zaGFkZS02MHBjdCk7CiAgICAtLWx1bW8tY29udHJhc3QtNzBwY3Q6IHZhcigtLWx1bW8tc2hhZGUtNzBwY3QpOwogICAgLS1sdW1vLWNvbnRyYXN0LTgwcGN0OiB2YXIoLS1sdW1vLXNoYWRlLTgwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC05MHBjdDogdmFyKC0tbHVtby1zaGFkZS05MHBjdCk7CiAgICAtLWx1bW8tY29udHJhc3Q6IHZhcigtLWx1bW8tc2hhZGUpOwoKICAgIC8qIFRleHQgKi8KICAgIC0tbHVtby1oZWFkZXItdGV4dC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdCk7CiAgICAtLWx1bW8tYm9keS10ZXh0LWNvbG9yOiB2YXIoLS1sdW1vLWNvbnRyYXN0LTkwcGN0KTsKICAgIC0tbHVtby1zZWNvbmRhcnktdGV4dC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC03MHBjdCk7CiAgICAtLWx1bW8tdGVydGlhcnktdGV4dC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC01MHBjdCk7CiAgICAtLWx1bW8tZGlzYWJsZWQtdGV4dC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0zMHBjdCk7CgogICAgLyogUHJpbWFyeSAqLwogICAgLS1sdW1vLXByaW1hcnktY29sb3I6IGhzbCgyMTQsIDkwJSwgNTIlKTsKICAgIC0tbHVtby1wcmltYXJ5LWNvbG9yLTUwcGN0OiBoc2xhKDIxNCwgOTAlLCA1MiUsIDAuNSk7CiAgICAtLWx1bW8tcHJpbWFyeS1jb2xvci0xMHBjdDogaHNsYSgyMTQsIDkwJSwgNTIlLCAwLjEpOwogICAgLS1sdW1vLXByaW1hcnktdGV4dC1jb2xvcjogdmFyKC0tbHVtby1wcmltYXJ5LWNvbG9yKTsKICAgIC0tbHVtby1wcmltYXJ5LWNvbnRyYXN0LWNvbG9yOiAjZmZmOwoKICAgIC8qIEVycm9yICovCiAgICAtLWx1bW8tZXJyb3ItY29sb3I6IGhzbCgzLCAxMDAlLCA2MSUpOwogICAgLS1sdW1vLWVycm9yLWNvbG9yLTUwcGN0OiBoc2xhKDMsIDEwMCUsIDYwJSwgMC41KTsKICAgIC0tbHVtby1lcnJvci1jb2xvci0xMHBjdDogaHNsYSgzLCAxMDAlLCA2MCUsIDAuMSk7CiAgICAtLWx1bW8tZXJyb3ItdGV4dC1jb2xvcjogaHNsKDMsIDkyJSwgNTMlKTsKICAgIC0tbHVtby1lcnJvci1jb250cmFzdC1jb2xvcjogI2ZmZjsKCiAgICAvKiBTdWNjZXNzICovCiAgICAtLWx1bW8tc3VjY2Vzcy1jb2xvcjogaHNsKDE0NSwgODAlLCA0MiUpOyAvKiBoc2woMTQ0LDgyJSwzNyUpOyAqLwogICAgLS1sdW1vLXN1Y2Nlc3MtY29sb3ItNTBwY3Q6IGhzbGEoMTQ1LCA3NiUsIDQ0JSwgMC41NSk7CiAgICAtLWx1bW8tc3VjY2Vzcy1jb2xvci0xMHBjdDogaHNsYSgxNDUsIDc2JSwgNDQlLCAwLjEyKTsKICAgIC0tbHVtby1zdWNjZXNzLXRleHQtY29sb3I6IGhzbCgxNDUsIDEwMCUsIDMyJSk7CiAgICAtLWx1bW8tc3VjY2Vzcy1jb250cmFzdC1jb2xvcjogI2ZmZjsKICB9CmAsSlh0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7Slh0LmlubmVySFRNTD1gPHN0eWxlPiR7Wlh0LnRvU3RyaW5nKCkucmVwbGFjZSgiOmhvc3QiLCJodG1sIil9PC9zdHlsZT5gLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoSlh0LmNvbnRlbnQpLCRYdCgiIixHWHRgCiAgW3RoZW1lfj0nZGFyayddIHsKICAgIC8qIEJhc2UgKGJhY2tncm91bmQpICovCiAgICAtLWx1bW8tYmFzZS1jb2xvcjogaHNsKDIxNCwgMzUlLCAyMSUpOwoKICAgIC8qIFRpbnQgKi8KICAgIC0tbHVtby10aW50LTVwY3Q6IGhzbGEoMjE0LCA2NSUsIDg1JSwgMC4wNik7CiAgICAtLWx1bW8tdGludC0xMHBjdDogaHNsYSgyMTQsIDYwJSwgODAlLCAwLjE0KTsKICAgIC0tbHVtby10aW50LTIwcGN0OiBoc2xhKDIxNCwgNjQlLCA4MiUsIDAuMjMpOwogICAgLS1sdW1vLXRpbnQtMzBwY3Q6IGhzbGEoMjE0LCA2OSUsIDg0JSwgMC4zMik7CiAgICAtLWx1bW8tdGludC00MHBjdDogaHNsYSgyMTQsIDczJSwgODYlLCAwLjQxKTsKICAgIC0tbHVtby10aW50LTUwcGN0OiBoc2xhKDIxNCwgNzglLCA4OCUsIDAuNSk7CiAgICAtLWx1bW8tdGludC02MHBjdDogaHNsYSgyMTQsIDgyJSwgOTAlLCAwLjYpOwogICAgLS1sdW1vLXRpbnQtNzBwY3Q6IGhzbGEoMjE0LCA4NyUsIDkyJSwgMC43KTsKICAgIC0tbHVtby10aW50LTgwcGN0OiBoc2xhKDIxNCwgOTElLCA5NCUsIDAuOCk7CiAgICAtLWx1bW8tdGludC05MHBjdDogaHNsYSgyMTQsIDk2JSwgOTYlLCAwLjkpOwogICAgLS1sdW1vLXRpbnQ6IGhzbCgyMTQsIDEwMCUsIDk4JSk7CgogICAgLyogU2hhZGUgKi8KICAgIC0tbHVtby1zaGFkZS01cGN0OiBoc2xhKDIxNCwgMCUsIDAlLCAwLjA3KTsKICAgIC0tbHVtby1zaGFkZS0xMHBjdDogaHNsYSgyMTQsIDQlLCAyJSwgMC4xNSk7CiAgICAtLWx1bW8tc2hhZGUtMjBwY3Q6IGhzbGEoMjE0LCA4JSwgNCUsIDAuMjMpOwogICAgLS1sdW1vLXNoYWRlLTMwcGN0OiBoc2xhKDIxNCwgMTIlLCA2JSwgMC4zMik7CiAgICAtLWx1bW8tc2hhZGUtNDBwY3Q6IGhzbGEoMjE0LCAxNiUsIDglLCAwLjQxKTsKICAgIC0tbHVtby1zaGFkZS01MHBjdDogaHNsYSgyMTQsIDIwJSwgMTAlLCAwLjUpOwogICAgLS1sdW1vLXNoYWRlLTYwcGN0OiBoc2xhKDIxNCwgMjQlLCAxMiUsIDAuNik7CiAgICAtLWx1bW8tc2hhZGUtNzBwY3Q6IGhzbGEoMjE0LCAyOCUsIDEzJSwgMC43KTsKICAgIC0tbHVtby1zaGFkZS04MHBjdDogaHNsYSgyMTQsIDMyJSwgMTMlLCAwLjgpOwogICAgLS1sdW1vLXNoYWRlLTkwcGN0OiBoc2xhKDIxNCwgMzMlLCAxMyUsIDAuOSk7CiAgICAtLWx1bW8tc2hhZGU6IGhzbCgyMTQsIDMzJSwgMTMlKTsKCiAgICAvKiBDb250cmFzdCAqLwogICAgLS1sdW1vLWNvbnRyYXN0LTVwY3Q6IHZhcigtLWx1bW8tdGludC01cGN0KTsKICAgIC0tbHVtby1jb250cmFzdC0xMHBjdDogdmFyKC0tbHVtby10aW50LTEwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC0yMHBjdDogdmFyKC0tbHVtby10aW50LTIwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC0zMHBjdDogdmFyKC0tbHVtby10aW50LTMwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC00MHBjdDogdmFyKC0tbHVtby10aW50LTQwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC01MHBjdDogdmFyKC0tbHVtby10aW50LTUwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC02MHBjdDogdmFyKC0tbHVtby10aW50LTYwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC03MHBjdDogdmFyKC0tbHVtby10aW50LTcwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC04MHBjdDogdmFyKC0tbHVtby10aW50LTgwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC05MHBjdDogdmFyKC0tbHVtby10aW50LTkwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdDogdmFyKC0tbHVtby10aW50KTsKCiAgICAvKiBUZXh0ICovCiAgICAtLWx1bW8taGVhZGVyLXRleHQtY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QpOwogICAgLS1sdW1vLWJvZHktdGV4dC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC05MHBjdCk7CiAgICAtLWx1bW8tc2Vjb25kYXJ5LXRleHQtY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QtNzBwY3QpOwogICAgLS1sdW1vLXRlcnRpYXJ5LXRleHQtY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QtNTBwY3QpOwogICAgLS1sdW1vLWRpc2FibGVkLXRleHQtY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QtMzBwY3QpOwoKICAgIC8qIFByaW1hcnkgKi8KICAgIC0tbHVtby1wcmltYXJ5LWNvbG9yOiBoc2woMjE0LCA4NiUsIDU1JSk7CiAgICAtLWx1bW8tcHJpbWFyeS1jb2xvci01MHBjdDogaHNsYSgyMTQsIDg2JSwgNTUlLCAwLjUpOwogICAgLS1sdW1vLXByaW1hcnktY29sb3ItMTBwY3Q6IGhzbGEoMjE0LCA5MCUsIDYzJSwgMC4xKTsKICAgIC0tbHVtby1wcmltYXJ5LXRleHQtY29sb3I6IGhzbCgyMTQsIDEwMCUsIDcwJSk7CiAgICAtLWx1bW8tcHJpbWFyeS1jb250cmFzdC1jb2xvcjogI2ZmZjsKCiAgICAvKiBFcnJvciAqLwogICAgLS1sdW1vLWVycm9yLWNvbG9yOiBoc2woMywgOTAlLCA2MyUpOwogICAgLS1sdW1vLWVycm9yLWNvbG9yLTUwcGN0OiBoc2xhKDMsIDkwJSwgNjMlLCAwLjUpOwogICAgLS1sdW1vLWVycm9yLWNvbG9yLTEwcGN0OiBoc2xhKDMsIDkwJSwgNjMlLCAwLjEpOwogICAgLS1sdW1vLWVycm9yLXRleHQtY29sb3I6IGhzbCgzLCAxMDAlLCA2NyUpOwoKICAgIC8qIFN1Y2Nlc3MgKi8KICAgIC0tbHVtby1zdWNjZXNzLWNvbG9yOiBoc2woMTQ1LCA2NSUsIDQyJSk7CiAgICAtLWx1bW8tc3VjY2Vzcy1jb2xvci01MHBjdDogaHNsYSgxNDUsIDY1JSwgNDIlLCAwLjUpOwogICAgLS1sdW1vLXN1Y2Nlc3MtY29sb3ItMTBwY3Q6IGhzbGEoMTQ1LCA2NSUsIDQyJSwgMC4xKTsKICAgIC0tbHVtby1zdWNjZXNzLXRleHQtY29sb3I6IGhzbCgxNDUsIDg1JSwgNDclKTsKICB9CgogIGh0bWwgewogICAgY29sb3I6IHZhcigtLWx1bW8tYm9keS10ZXh0LWNvbG9yKTsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tYmFzZS1jb2xvcik7CiAgfQoKICBbdGhlbWV+PSdkYXJrJ10gewogICAgY29sb3I6IHZhcigtLWx1bW8tYm9keS10ZXh0LWNvbG9yKTsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tYmFzZS1jb2xvcik7CiAgfQoKICBoMSwKICBoMiwKICBoMywKICBoNCwKICBoNSwKICBoNiB7CiAgICBjb2xvcjogdmFyKC0tbHVtby1oZWFkZXItdGV4dC1jb2xvcik7CiAgfQoKICBhIHsKICAgIGNvbG9yOiB2YXIoLS1sdW1vLXByaW1hcnktdGV4dC1jb2xvcik7CiAgfQoKICBibG9ja3F1b3RlIHsKICAgIGNvbG9yOiB2YXIoLS1sdW1vLXNlY29uZGFyeS10ZXh0LWNvbG9yKTsKICB9CgogIGNvZGUsCiAgcHJlIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QtMTBwY3QpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbHVtby1ib3JkZXItcmFkaXVzLW0pOwogIH0KYCx7bW9kdWxlSWQ6Imx1bW8tY29sb3IifSksJFh0KCIiLEdYdGAKICA6aG9zdCB7CiAgICBjb2xvcjogdmFyKC0tbHVtby1ib2R5LXRleHQtY29sb3IpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1sdW1vLWJhc2UtY29sb3IpICFpbXBvcnRhbnQ7CiAgfQpgLHttb2R1bGVJZDoibHVtby1jb2xvci1sZWdhY3kiLGluY2x1ZGU6WyJsdW1vLWNvbG9yIl19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi8KY29uc3QgUVh0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7UVh0LmlubmVySFRNTD0nXG4gIDxzdHlsZT5cbiAgICBAZm9udC1mYWNlIHtcbiAgICAgIGZvbnQtZmFtaWx5OiBcJ2x1bW8taWNvbnNcJztcbiAgICAgIHNyYzogdXJsKGRhdGE6YXBwbGljYXRpb24vZm9udC13b2ZmO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdSZ0FCQUFBQUFCRWNBQXNBQUFBQUlpd0FBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCSFUxVkNBQUFCQ0FBQUFEc0FBQUJVSUlzbGVrOVRMeklBQUFGRUFBQUFRd0FBQUZaQUlVdUtZMjFoY0FBQUFZZ0FBQUQ0QUFBRHJzQ1U4ZDVuYkhsbUFBQUNnQUFBQzJNQUFCZDRoOVRvMldobFlXUUFBQTNrQUFBQU1BQUFBRFphLzZTc2FHaGxZUUFBRGhRQUFBQWRBQUFBSkFicEEzNW9iWFI0QUFBT05BQUFBQkFBQUFDc3BCQUFBR3h2WTJFQUFBNUVBQUFBV0FBQUFGaDU1SUFzYldGNGNBQUFEcHdBQUFBZkFBQUFJQUZLQVhCdVlXMWxBQUFPdkFBQUFURUFBQUl1VVVKWkNIQnZjM1FBQUEvd0FBQUJLd0FBQWVsbThTelZlSnhqWUdSZ1lPQmlNR0N3WTJCeWNmTUpZZURMU1N6Slk1QmlZR0dBQUpBOE1wc3hKek05a1lFRHhnUEtzWUJwRGlCbWc0Z0NBQ1k3QlVnQWVKeGpZR1MreURpQmdaV0JnYW1LYVE4REEwTVBoR1o4d0dESXlBUVVaV0JsWnNBS0F0SmNVeGdjWGpHKzBtSU8rcC9GRU1VY3hEQU5LTXdJa2dNQUJuOE1MUUI0bk8zU1dXNkRNQUJGMFV0d0NFbklQTS96aExLOExxaGZYUnliU1AxNFhVWXRIVjloR1lRd1FCTklvM2NVSVBraFFlTTdyaWIxZWtxblhnOTgxWHVDMXF2eTg0bHpvamxlaDNwdXhMMGhQakdqUlU0NzN0ZWxvRWVmQVVOR2pKa3daY2FjQlV0V3JObXdaY2VlQTBkT25MbHc1Y2FkQjA5ZWxQR2hHZitqME5USS82NUtmWGVyVDZKaHFLbnBSS3RnT3B1cWFUcnRLalBVbHFIbWh0bzIxSTdwTDZpNmhscVkzcTdxR1dyZlVBZUdPalRVa2FHT0RYVmlxRk5EblJucTNGQVhocm8wMUpXaHJnMTFZNmhiUTkwWjZ0NVFENFo2Tk5TVG9aNE45V0tvVjBPOUdlcmRVQitHK2pUVWw2R1dSdmtMMjRCa0VYaWN0Vmg5YkZ2VkZiL254dmJ6KzdSZi9ONnpIY2QyYkNmUCtXZ2MxWjlOMGpwTm5FTDZrYlJWUzZIQTJoUVlHaDlUR1IxQ2JDcWEyclhyV09rUUUvc0hOSmdtdFp2b1ZOWnFFMUIxRE5IeHpUUXhDZWhVVFlpSlRReUVOdWkwcVNMZXpyM1BkdXlRZmdtUldPZmRlOCs5NTUxejdybm4vTzRqTG9KL2JSUDBVYUtRTUxGSmpwQkF2cGhMWkMzRGswb2s3V0J6UjIvdXBKczdSeXcvbmZGYmxuL3V1Ti9hcEN2d3JLTHJTdlVxUnVmYm01cG4wZnMwdzRnWXhuR1ZQNnFIbk80YldpRFFHUWd3dFM2bG0zbEIzUW9YMU0ydndFbXV6aXJGMzl5K0VzMitESjhkMXBreXFCSXFvemUzRDErWno0RHJGb2F6eEk4ZFd3TXJEbFoyRE1xUUFSOUFST3NKVSsyY21sVFBhelRjbzUyRjF4VGEyYTIrSzh2dnE5MmRWSG10TG9QZVFYL0FaUFJZR3RoRFlPZVpqQmpLb0ZzVkd1bFIzbFdVOTVXZUNLNDRxSFU3TWhXVUdVS1pEVDNvS1VjRzJHV3VoK0VERGZVWUEvamhBaGwwVE9zSk5ZU0V1N21RbWkzVXpmWHdaS0E0QnNWc0hMWFFZR2dSVzk1dUV0cEoxVmZuOVhpTHJpUkJsRkVxeHNEakEwOXlDTlVvUXh4d2Q3S1dTVHQyeTNHVEtpZmxxSFJTb1daYzNtMTFXYS9mSmRGZ1hENHNTWWZsZUpCS2Q4R016N0o4ZFpuL2NHUkNjS0dEbkEyR2UzZkt6Y3ZsblRETnRoR1dMWHpYL1dhWHRVQW1SZ2VMbEhTcjMwcjBHOVVUWE1iMEF0bXd6T295NzNma1NsSFprZHV3L1RZdVU5Y0FENFl1dFBveFRUc0EzNzk3d1ZyNFovMU5DNXpBUkhyNHZ0eEpqeElmaVpNaE1rYldrKzE0Qm5KWkt3cUdad0Rmc3dMeXhXRFNnMTFyRkxKRjdOb3B4amQxaDEvUU9UK29lemdmdTNZcStIaytkdWY1eCs0MG8xR1RrYUlnaWtLL0lFbkM2YVl4Q1VCYVpKU040WFRZRmpVL1lNTklLcUp3aERHT0NDSThGRFhuWG1YanRHaEdKeVNocWpBT25CT2tXMkpHOVM3R2dZZU1XQVU1SnpobldtQk9hT00rQ0tFUG9xU2ZGREMyVW5xK0RMbFVnVVZVRkZMWkdKZzZqdGxvanNkc2E4a1BPYlB1SmRpNWRuQmRCc0xKTUdUV0RhNHQySnZ0d3VQbzlzK1k4NnN1di9XMzNRRzFyQWFPQVVWK3Z4NEs2ZjJEMDRQVktsQzdXTFNyWnpBaTQ1WlY2bElDN1dvWHFtUnl2VXFvVndyelVvVnNJamVUWFdRditSSDVHVGxCWGlCL0luOGxuMEliQkNBRk9hakFKcmdaWXlPSFdxT2ZVZS9hSGpJMTJSNk9RbzFqQ2d0MjE1bCs0ZjZYUGIrME1Ob3UwVis0M24yRjc3dFNmUmIyNGQ3eml0Z25LbXZZSHM2OXp1Z2FQdkJ3djZpb1hrYjJMZEw2NUF0dzUxdUxrWGx1MWJoTU1SY1hTUGNZb3FLSVJsaDM0bFFQOC81SmJ1VUZ5ZTR2eEQ2LzZNeEZGMTFDMHVWTHI5VWxndzQ0dFMzcE1WaU5MVUV4YnljRmdMSWN0K1FETWliUmlteDF5ZFV6OEZYWml1T0lEQk9NVlgyblVaYytodU5FNVhVSjgxdWlKb2lhYndxYVZGMHVhY0tiYXUvcGw0UjJWVzBYWGxKcmE2Ym9WcllHNjQ2VEY1Tll6d3k0dmpFTlZyRGxjTnBaUGw4REg2WFg4WFdDeDBtdldWWlk2S0ZMcnZzWTY2L3pQaWN0NUZueGFOVVIvanV2WkNNM1R2RDYwRTJXMXRaaXpiWFRQRHVhYmNtMG5iYnpwV0twbUExYXlCUThnaWVkTFVNK0Ewa05qQmpRam11WXo3WXJnSVhZdm1GNjNaTEJ3U1hycG45VGI5d3dkZC9VMUgwUE1RSzNYY084dWwzV1Q3UHlQUGRweTBUZW1LeE5SY0pOYXVpWEpublVEcFVwcFFXczRTblVJeTBFRVNHWXFKWVFMR0h4emFHV3dWSWFTNlk3bVFGTThaallEUTNheGpmNjFTV2pVMzNKd09aQTFwd2FHMUw5bXpmNzFhSFJkWDFKSHc2RnAwYVhoTndicXllR05nNE5iZHpHQ0J4b3o0WlhqeTROdTY5WnI2c0RZNnZNckxVNW5BMVA4SmtiZFdYSjZFUmZNcnl2TmgxSmZROStUNGRJaEd2Szl3M2R4akJCemF0c1EvTWxPSFZJRG5ZcER6Nm9kQVhsUTAxdDJQYTVJYWZkOE1NcHhBZURLUDBDNkNqZ1ZMVDVvc0I2aWNVeDAxbFdqWHh6VC9HeVJGMndlbEVNNVovN2pHM1ZqUTFTck5uNUlieXpPRzVkb2JCMy9RSHh5WnZzWGNvejhJb0V3UzdwbENnK3p4SFFrNDI0cTlCZkVwa0VTSmJGSFF1c0RCU1dGa3VCa29QTzBrTEt3UlZZanhHWGxIVGNURFFNSi9INlRYOWFma083bW5yYVRPMWZlVG5aQVhMdTRjcDdIQVhNbU5HMXllRms5VGdTL05IaFpSLzRRb0JUci9aQis2aENneWwxNU5xMVViTjZuRTEvWm5QMVUyY2l6Q0JwdnM4Y0pRWko0TGtZeDVOL3laUEFVWk5RUTBWNGYzQlFsbFdySzNZUnpsMzBkT1Q2UlZuMnVwTnVyNndvU2E4Q3FwZFQvYUtuQk00bzNqTnVyOWQ5eHF0VVQ2dmVCRXQ5Q2E5YXQrRVJ6RUVoVWtSOHNhNW1RNGFWdkpvVmVFQTh6STRlaTVtVUxYRkd5VTd6LzZUQWVZTFZjcHpTV1pZOFBZWUY1eXJUVjYwc1QwK1hWMTQxdlgrK1dmMTZWMmJGZUdWUFpYeEZwa3Z5ZUtUV0xsemZXMG1uS3hzWTZZMzI5NC8wOTk4U0NmWDFibG01cGJjdkZHbHEvcjA3TVJBTWhZSURpVzVKRktXVzN2ZHJFcENzWlNKRytvbTdadS9QU1NjWkpoTmtMYm1XNVdzcjEycFdxVzV6S3Rsd1JTNGJGT3hVdzE3bUN6eTZsc2tDRGwxV1lPR1dEWXJBRHJNQTdCRER3ZVdXTmQ1a29pSm5SMWR6K3l0TFAycTBTcVBCMWxuSzJjY0I3UlllNEZTb1BrczNpQjN0NHR4VFNIY3RiMnN5MWl2azBwdkh1Q05tNncxZjZ3eHYzK09DZ043OExxZFFuVVZoN1Iwb1RBcDB6T2YycmJXNzcwVnU1QzJkSXlHZFRuSG84elNqaTdkcHBqMFVTb1ZDeitsaFJNVGg1M1RlcTlWYkdmYmp1U2JBb29TZFhheVk0UFlIZzM3NEM2ZjdnbDFCL0RYdUo0L1FYeE9CZEpGSnNwRnNJM2VncG9XVVVDamxUSUZuTllObCtaeVpLbUJlWUtHSGtEMVF5RGxoYUtiS3dLY0lKcUo0VExKMk9tZFkvSldYYWU0RGRHQnc4SFo3ZVhjZ0ZGMnpyMlNvYWxEcnk1aUtxb2EwUHVoZTNoUFEyczNlbFRZTStNSStuM3JLMEtnTDcvTGEzR2VNTHQ2bTd1OTEydkdudnRPUmlJYTBxQm1ocVZpK1hXOVhOQm1xYjhlVmdLeklIZkdJNWJOb0c3WDBVQ3plSVNtcUljTy9uWThGSDdVOGF2WDlmeC9TVCtoeDBzZXpQdzlReThNdW0zR1dmMk40VXkveUlZR1ZCWGJKSFdJWnA3ZGZUY3B0ZE1UcjlRbXE3RGFpSy91a3FDTDRrdDRSVWZTNVhQbk10bVQyMi9tUUZxRjdlbVNxdHJsdThTVkVseERSSnJaT0RrcHV3ZTBWZlRmamRFcDFmN0E3ditmb3pOQlhVSi82V1R1SzJUdEZscEZWWkFaM0xjRnZVaTFaMnAyWVQrRU1Ba0dKVlN0T3pMVEFQZzRJcVdJQWx6UlNqT0JrbDJ6eGozVEt5Y3B6VC9NbnZYM3VhU01XTStnVTBya1hqb2hoZWZWUk1hcHMzL2tMTVNLdjIzbFQyM3V4UXJrUWp5T0psZU1Ec2RoQW5ENlpHRWxXWjVNakNYekNFL2hrV1grV0Y0a256R2hWT3lLMmVRWmVrVjNleW8wekw4a3VZV0NuREN2ampoQWtjVFBPQkRYVmRvYXYzSFZjRm5Rakx2dFY5UzJwMHpBNkplZ1B3TVF4dCt5RmIzbGw5ekdscS81ZFJLYjNjRXlRWW9hTllwaGFySjd4Q0I3QVd4c0xZM2pqWlhZMFhzWmowV2p3YzlJNlBQL2RLQUJuQ1phcUhwYVpFQUN4azRaZUxaU0tOZ1pBQmwrbFlRWDFzSlFPU1gzbjZyNDEwZXZjb3VkNUplQUdVWFZQOUgxdFpPS2VqVHE0T25vMHowZXJybzFGcm5PcG9odmExZC9oVGR0VnNRZEtONVc5UmxUM05qRDBuem55S05UZ0tBTWZXTldjeW9kVjBJR0xQSUhPRjBvNEp5cXVmYUs0ejZXSUl6dUdoM2Q4Yzhjd1FnOEVSK09WeHlyamRtOHZOdWh0czRMb09paEd4SU11VWRnendpWU43eGhoMStvWm5KTnVURzdnUVp2dTRYV1o5R0FaWmpHRXVid2VQcVlodEtEVEgrOVZRa2wxNy9pR3lic25KKzgrc0t0eVByY2xsOXR5NjVac2RzdC85aXFwRUtoN001VmRCeGgzY3NPZE5jNnRXM0kxdXlNMVB6T1hlZ1NPckxGc0ZOSTJPMjdNK1RGMkFwbk45TVV2NXVkNkxqeEl2RVFuSFJ6eEl1NElzQTlNTEZrSm4ydGNab1o3T043ZFhlN3VqcmM4SHJ1c1BLYW1scVh3ZDc3bFFVdUxwaWxhdTRQVU1hcHVlQmI3aXJVNFJvVVhFWVh1VnVJR2xSR21PcCsybE5rYVJQVnppT3FtbGFadmFxRzRkRmdTajBqeEVKV3J2MTJJVVdudG13K3JmUWFyUkUwQXBoNG9jSTZubFVsR3FzK3UzLytUL2V0aFc2MlBwSHAyZUhiWnN0bmgvd09POTV5REFIaWNZMkJrWUdBQTRwbUo2UUh4L0RaZkdiaVpYd0JGR0dwVU56UWk2UCt2bWFjeTNRSnlPUmlZUUtJQU5vVUxWWGljWTJCa1lHQU8rcDhGSkY4d0FBSHpWQVpHQmxTZ0RRQlc5Z052QUFBQWVKeGpZR0JnWUg0eE5EQUF6d1FtandBQUFBQUFUZ0NhQU9nQkNnRXNBVTRCY0FHYUFjUUI3Z0lhQXB3QzZBU2FCTHdFMWdUeUJRNEZLZ1Y2QmRBRi9nWkVCbVlHdGdjWUI1QUlHQWhTQ0dvSS9nbEdDYjRKMmdvRUNqd0tnZ3E0Q3ZBTFVBdVdDN3g0bkdOZ1pHQmcwR1pNWVJCbEFBRW1JT1lDUWdhRy8yQStBd0FZbEFHOEFIaWNiWkU5VHNNd0dJYmY5QS9SU2dnRVltSHhBZ3RxK2pOMlpHajNEdDNUMUdsVE9YSGt1Qlc5QXlmZ0VCeUNnVE53Q0E3QlcvTkpsVkJ0eWQvangrOFhLd21BYTN3aHduRkU2SWIxT0JxNDRPNlBtNlFiNFJiNVFiaU5IaDZGTy9SRDRTNmVNUkh1NFJhYVQ0aGFselIzZUJWdTRBcHZ3azM2ZCtFVytVTzRqWHQ4Q25mb3Y0VzdXT0JIdUllbjZNWHNDdHZQVTF2V2M3M2VtY1NkeElrVzJ0VzVMZFVvSHA3a1RKZmFKVjZ2MVBLZzZ2MTY3SDJtTW1jTE5iV2wxOFpZVlRtNzFhbVBOOTVYazhFZ0V4K250b0RCRGdVcytzaVJzcGFvTWVmN3J1a05Fcml6aVhOdXdTN0htb2U5d2dneHYrZTU1SXpKTXFRVGVOWVYwMHNjdU5iWTgrWXhyVWZHZmNhTVpiL0NOUFFlMDRiVDBsVGhiRXVUMHNmWWhLNksvMjNBbWYzTHgrSDI0aGNqNEdTY0FBQUFlSnh0anRsdWd6QVFSYmtKVUVKSXV1Lzd2cVI4bEdOUEFjV3gwWUFiNWUvTGtsUjk2RWdlblN1ZkdZMDM4UHFLdmY5cmhnR0c4QkVneEE0aWpCQmpqQVFUVExHTFBlempBSWM0d2pGT2NJb3puT01DbDdqQ05XNXdpenZjNHdHUGVNSXpYdkNLTjd6akF6Tjhlb25RUldaU1NhWW1qdnVnNmFzZTk4aEZsdGV4TUptbVZObVYyV0J2ZE5nWlVjK3VqQVd6WFczVURudTF3NDNhc1N0SGM4R3B6QVhYL3B5MGpxVFFaSlRna2N4SkxwYUNGMGxEMzJ4TnQrNDN0QXNuMjlEZnQwMnVES1MyY2pHVU5nc2syNnFLMmxGdGhZb1UyN0lOUHFtaURxZzVnb2UwcHFSNXFTb3FNZGVrL0NVWkZ5d0w0NnJFc2lJbWxlcWlxb015dDRiYVhsdS8xR0xkTkZmNXpiY05tZHIxWVVXQ1plNDdvK3pVbWIvRG9TdGJ3M2NWc2VmOUFMamppUFFBKSBmb3JtYXQoXCd3b2ZmXCcpO1xuICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICAgIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgICB9XG5cbiAgICBodG1sIHtcbiAgICAgIC0tbHVtby1pY29ucy1hbGlnbi1jZW50ZXI6ICJcXGVhMDEiO1xuICAgICAgLS1sdW1vLWljb25zLWFsaWduLWxlZnQ6ICJcXGVhMDIiO1xuICAgICAgLS1sdW1vLWljb25zLWFsaWduLXJpZ2h0OiAiXFxlYTAzIjtcbiAgICAgIC0tbHVtby1pY29ucy1hbmdsZS1kb3duOiAiXFxlYTA0IjtcbiAgICAgIC0tbHVtby1pY29ucy1hbmdsZS1sZWZ0OiAiXFxlYTA1IjtcbiAgICAgIC0tbHVtby1pY29ucy1hbmdsZS1yaWdodDogIlxcZWEwNiI7XG4gICAgICAtLWx1bW8taWNvbnMtYW5nbGUtdXA6ICJcXGVhMDciO1xuICAgICAgLS1sdW1vLWljb25zLWFycm93LWRvd246ICJcXGVhMDgiO1xuICAgICAgLS1sdW1vLWljb25zLWFycm93LWxlZnQ6ICJcXGVhMDkiO1xuICAgICAgLS1sdW1vLWljb25zLWFycm93LXJpZ2h0OiAiXFxlYTBhIjtcbiAgICAgIC0tbHVtby1pY29ucy1hcnJvdy11cDogIlxcZWEwYiI7XG4gICAgICAtLWx1bW8taWNvbnMtYmFyLWNoYXJ0OiAiXFxlYTBjIjtcbiAgICAgIC0tbHVtby1pY29ucy1iZWxsOiAiXFxlYTBkIjtcbiAgICAgIC0tbHVtby1pY29ucy1jYWxlbmRhcjogIlxcZWEwZSI7XG4gICAgICAtLWx1bW8taWNvbnMtY2hlY2ttYXJrOiAiXFxlYTBmIjtcbiAgICAgIC0tbHVtby1pY29ucy1jaGV2cm9uLWRvd246ICJcXGVhMTAiO1xuICAgICAgLS1sdW1vLWljb25zLWNoZXZyb24tbGVmdDogIlxcZWExMSI7XG4gICAgICAtLWx1bW8taWNvbnMtY2hldnJvbi1yaWdodDogIlxcZWExMiI7XG4gICAgICAtLWx1bW8taWNvbnMtY2hldnJvbi11cDogIlxcZWExMyI7XG4gICAgICAtLWx1bW8taWNvbnMtY2xvY2s6ICJcXGVhMTQiO1xuICAgICAgLS1sdW1vLWljb25zLWNvZzogIlxcZWExNSI7XG4gICAgICAtLWx1bW8taWNvbnMtY3Jvc3M6ICJcXGVhMTYiO1xuICAgICAgLS1sdW1vLWljb25zLWRvd25sb2FkOiAiXFxlYTE3IjtcbiAgICAgIC0tbHVtby1pY29ucy1kcm9wZG93bjogIlxcZWExOCI7XG4gICAgICAtLWx1bW8taWNvbnMtZWRpdDogIlxcZWExOSI7XG4gICAgICAtLWx1bW8taWNvbnMtZXJyb3I6ICJcXGVhMWEiO1xuICAgICAgLS1sdW1vLWljb25zLWV5ZTogIlxcZWExYiI7XG4gICAgICAtLWx1bW8taWNvbnMtZXllLWRpc2FibGVkOiAiXFxlYTFjIjtcbiAgICAgIC0tbHVtby1pY29ucy1tZW51OiAiXFxlYTFkIjtcbiAgICAgIC0tbHVtby1pY29ucy1taW51czogIlxcZWExZSI7XG4gICAgICAtLWx1bW8taWNvbnMtb3JkZXJlZC1saXN0OiAiXFxlYTFmIjtcbiAgICAgIC0tbHVtby1pY29ucy1waG9uZTogIlxcZWEyMCI7XG4gICAgICAtLWx1bW8taWNvbnMtcGhvdG86ICJcXGVhMjEiO1xuICAgICAgLS1sdW1vLWljb25zLXBsYXk6ICJcXGVhMjIiO1xuICAgICAgLS1sdW1vLWljb25zLXBsdXM6ICJcXGVhMjMiO1xuICAgICAgLS1sdW1vLWljb25zLXJlZG86ICJcXGVhMjQiO1xuICAgICAgLS1sdW1vLWljb25zLXJlbG9hZDogIlxcZWEyNSI7XG4gICAgICAtLWx1bW8taWNvbnMtc2VhcmNoOiAiXFxlYTI2IjtcbiAgICAgIC0tbHVtby1pY29ucy11bmRvOiAiXFxlYTI3IjtcbiAgICAgIC0tbHVtby1pY29ucy11bm9yZGVyZWQtbGlzdDogIlxcZWEyOCI7XG4gICAgICAtLWx1bW8taWNvbnMtdXBsb2FkOiAiXFxlYTI5IjtcbiAgICAgIC0tbHVtby1pY29ucy11c2VyOiAiXFxlYTJhIjtcbiAgICB9XG4gIDwvc3R5bGU+XG4nLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoUVh0LmNvbnRlbnQpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLwpjb25zdCB0JHQ9R1h0YAogIDpob3N0IHsKICAgIC0tbHVtby1zaXplLXhzOiAxLjYyNXJlbTsKICAgIC0tbHVtby1zaXplLXM6IDEuODc1cmVtOwogICAgLS1sdW1vLXNpemUtbTogMi4yNXJlbTsKICAgIC0tbHVtby1zaXplLWw6IDIuNzVyZW07CiAgICAtLWx1bW8tc2l6ZS14bDogMy41cmVtOwoKICAgIC8qIEljb25zICovCiAgICAtLWx1bW8taWNvbi1zaXplLXM6IDEuMjVlbTsKICAgIC0tbHVtby1pY29uLXNpemUtbTogMS41ZW07CiAgICAtLWx1bW8taWNvbi1zaXplLWw6IDIuMjVlbTsKICAgIC8qIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLwogICAgLS1sdW1vLWljb24tc2l6ZTogdmFyKC0tbHVtby1pY29uLXNpemUtbSk7CiAgfQpgLGUkdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpO2UkdC5pbm5lckhUTUw9YDxzdHlsZT4ke3QkdC50b1N0cmluZygpLnJlcGxhY2UoIjpob3N0IiwiaHRtbCIpfTwvc3R5bGU+YCxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGUkdC5jb250ZW50KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi8KY29uc3QgbiR0PUdYdGAKICA6aG9zdCB7CiAgICAvKiBTcXVhcmUgKi8KICAgIC0tbHVtby1zcGFjZS14czogMC4yNXJlbTsKICAgIC0tbHVtby1zcGFjZS1zOiAwLjVyZW07CiAgICAtLWx1bW8tc3BhY2UtbTogMXJlbTsKICAgIC0tbHVtby1zcGFjZS1sOiAxLjVyZW07CiAgICAtLWx1bW8tc3BhY2UteGw6IDIuNXJlbTsKCiAgICAvKiBXaWRlICovCiAgICAtLWx1bW8tc3BhY2Utd2lkZS14czogY2FsYyh2YXIoLS1sdW1vLXNwYWNlLXhzKSAvIDIpIHZhcigtLWx1bW8tc3BhY2UteHMpOwogICAgLS1sdW1vLXNwYWNlLXdpZGUtczogY2FsYyh2YXIoLS1sdW1vLXNwYWNlLXMpIC8gMikgdmFyKC0tbHVtby1zcGFjZS1zKTsKICAgIC0tbHVtby1zcGFjZS13aWRlLW06IGNhbGModmFyKC0tbHVtby1zcGFjZS1tKSAvIDIpIHZhcigtLWx1bW8tc3BhY2UtbSk7CiAgICAtLWx1bW8tc3BhY2Utd2lkZS1sOiBjYWxjKHZhcigtLWx1bW8tc3BhY2UtbCkgLyAyKSB2YXIoLS1sdW1vLXNwYWNlLWwpOwogICAgLS1sdW1vLXNwYWNlLXdpZGUteGw6IGNhbGModmFyKC0tbHVtby1zcGFjZS14bCkgLyAyKSB2YXIoLS1sdW1vLXNwYWNlLXhsKTsKCiAgICAvKiBUYWxsICovCiAgICAtLWx1bW8tc3BhY2UtdGFsbC14czogdmFyKC0tbHVtby1zcGFjZS14cykgY2FsYyh2YXIoLS1sdW1vLXNwYWNlLXhzKSAvIDIpOwogICAgLS1sdW1vLXNwYWNlLXRhbGwtczogdmFyKC0tbHVtby1zcGFjZS1zKSBjYWxjKHZhcigtLWx1bW8tc3BhY2UtcykgLyAyKTsKICAgIC0tbHVtby1zcGFjZS10YWxsLW06IHZhcigtLWx1bW8tc3BhY2UtbSkgY2FsYyh2YXIoLS1sdW1vLXNwYWNlLW0pIC8gMik7CiAgICAtLWx1bW8tc3BhY2UtdGFsbC1sOiB2YXIoLS1sdW1vLXNwYWNlLWwpIGNhbGModmFyKC0tbHVtby1zcGFjZS1sKSAvIDIpOwogICAgLS1sdW1vLXNwYWNlLXRhbGwteGw6IHZhcigtLWx1bW8tc3BhY2UteGwpIGNhbGModmFyKC0tbHVtby1zcGFjZS14bCkgLyAyKTsKICB9CmAsaSR0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7aSR0LmlubmVySFRNTD1gPHN0eWxlPiR7biR0LnRvU3RyaW5nKCkucmVwbGFjZSgiOmhvc3QiLCJodG1sIil9PC9zdHlsZT5gLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoaSR0LmNvbnRlbnQpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLwpjb25zdCByJHQ9R1h0YAogIDpob3N0IHsKICAgIC8qIEJvcmRlciByYWRpdXMgKi8KICAgIC0tbHVtby1ib3JkZXItcmFkaXVzLXM6IDAuMjVlbTsgLyogQ2hlY2tib3gsIGJhZGdlLCBkYXRlLXBpY2tlciB5ZWFyIGluZGljYXRvciwgZXRjICovCiAgICAtLWx1bW8tYm9yZGVyLXJhZGl1cy1tOiB2YXIoLS1sdW1vLWJvcmRlci1yYWRpdXMsIDAuMjVlbSk7IC8qIEJ1dHRvbiwgdGV4dCBmaWVsZCwgbWVudSBvdmVybGF5LCBldGMgKi8KICAgIC0tbHVtby1ib3JkZXItcmFkaXVzLWw6IDAuNWVtOyAvKiBEaWFsb2csIG5vdGlmaWNhdGlvbiwgZXRjICovCiAgICAtLWx1bW8tYm9yZGVyLXJhZGl1czogMC4yNWVtOyAvKiBEZXByZWNhdGVkICovCgogICAgLyogU2hhZG93ICovCiAgICAtLWx1bW8tYm94LXNoYWRvdy14czogMCAxcHggNHB4IC0xcHggdmFyKC0tbHVtby1zaGFkZS01MHBjdCk7CiAgICAtLWx1bW8tYm94LXNoYWRvdy1zOiAwIDJweCA0cHggLTFweCB2YXIoLS1sdW1vLXNoYWRlLTIwcGN0KSwgMCAzcHggMTJweCAtMXB4IHZhcigtLWx1bW8tc2hhZGUtMzBwY3QpOwogICAgLS1sdW1vLWJveC1zaGFkb3ctbTogMCAycHggNnB4IC0xcHggdmFyKC0tbHVtby1zaGFkZS0yMHBjdCksIDAgOHB4IDI0cHggLTRweCB2YXIoLS1sdW1vLXNoYWRlLTQwcGN0KTsKICAgIC0tbHVtby1ib3gtc2hhZG93LWw6IDAgM3B4IDE4cHggLTJweCB2YXIoLS1sdW1vLXNoYWRlLTIwcGN0KSwgMCAxMnB4IDQ4cHggLTZweCB2YXIoLS1sdW1vLXNoYWRlLTQwcGN0KTsKICAgIC0tbHVtby1ib3gtc2hhZG93LXhsOiAwIDRweCAyNHB4IC0zcHggdmFyKC0tbHVtby1zaGFkZS0yMHBjdCksIDAgMThweCA2NHB4IC04cHggdmFyKC0tbHVtby1zaGFkZS00MHBjdCk7CgogICAgLyogQ2xpY2thYmxlIGVsZW1lbnQgY3Vyc29yICovCiAgICAtLWx1bW8tY2xpY2thYmxlLWN1cnNvcjogZGVmYXVsdDsKICB9CmAsbyR0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7byR0LmlubmVySFRNTD1gPHN0eWxlPiR7ciR0LnRvU3RyaW5nKCkucmVwbGFjZSgiOmhvc3QiLCJodG1sIil9PC9zdHlsZT5gLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobyR0LmNvbnRlbnQpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLwpjb25zdCBhJHQ9R1h0YAogIDpob3N0IHsKICAgIC8qIHByZXR0aWVyLWlnbm9yZSAqLwogICAgLS1sdW1vLWZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdSb2JvdG8nLCAnU2Vnb2UgVUknLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmLCAnQXBwbGUgQ29sb3IgRW1vamknLCAnU2Vnb2UgVUkgRW1vamknLCAnU2Vnb2UgVUkgU3ltYm9sJzsKCiAgICAvKiBGb250IHNpemVzICovCiAgICAtLWx1bW8tZm9udC1zaXplLXh4czogMC43NXJlbTsKICAgIC0tbHVtby1mb250LXNpemUteHM6IDAuODEyNXJlbTsKICAgIC0tbHVtby1mb250LXNpemUtczogMC44NzVyZW07CiAgICAtLWx1bW8tZm9udC1zaXplLW06IDFyZW07CiAgICAtLWx1bW8tZm9udC1zaXplLWw6IDEuMTI1cmVtOwogICAgLS1sdW1vLWZvbnQtc2l6ZS14bDogMS4zNzVyZW07CiAgICAtLWx1bW8tZm9udC1zaXplLXh4bDogMS43NXJlbTsKICAgIC0tbHVtby1mb250LXNpemUteHh4bDogMi41cmVtOwoKICAgIC8qIExpbmUgaGVpZ2h0cyAqLwogICAgLS1sdW1vLWxpbmUtaGVpZ2h0LXhzOiAxLjI1OwogICAgLS1sdW1vLWxpbmUtaGVpZ2h0LXM6IDEuMzc1OwogICAgLS1sdW1vLWxpbmUtaGVpZ2h0LW06IDEuNjI1OwogIH0KYCxzJHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtzJHQuaW5uZXJIVE1MPWA8c3R5bGU+JHthJHQudG9TdHJpbmcoKS5yZXBsYWNlKCI6aG9zdCIsImh0bWwiKX08L3N0eWxlPmAsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzJHQuY29udGVudCksJFh0KCIiLEdYdGAKICBodG1sIHsKICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1sdW1vLWZvbnQtZmFtaWx5KTsKICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUsIHZhcigtLWx1bW8tZm9udC1zaXplLW0pKTsKICAgIGxpbmUtaGVpZ2h0OiB2YXIoLS1sdW1vLWxpbmUtaGVpZ2h0LW0pOwogICAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOwogICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlOwogIH0KCiAgLyogQ2Fu4oCZdCBjb21iaW5lIHdpdGggdGhlIGFib3ZlIHNlbGVjdG9yIGJlY2F1c2UgdGhhdCBkb2VzbuKAmXQgd29yayBpbiBicm93c2VycyB3aXRob3V0IG5hdGl2ZSBzaGFkb3cgZG9tICovCiAgOmhvc3QgewogICAgZm9udC1mYW1pbHk6IHZhcigtLWx1bW8tZm9udC1mYW1pbHkpOwogICAgZm9udC1zaXplOiB2YXIoLS1sdW1vLWZvbnQtc2l6ZSwgdmFyKC0tbHVtby1mb250LXNpemUtbSkpOwogICAgbGluZS1oZWlnaHQ6IHZhcigtLWx1bW8tbGluZS1oZWlnaHQtbSk7CiAgICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7CiAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7CiAgfQoKICBzbWFsbCwKICBbdGhlbWV+PSdmb250LXNpemUtcyddIHsKICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUtcyk7CiAgICBsaW5lLWhlaWdodDogdmFyKC0tbHVtby1saW5lLWhlaWdodC1zKTsKICB9CgogIFt0aGVtZX49J2ZvbnQtc2l6ZS14cyddIHsKICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUteHMpOwogICAgbGluZS1oZWlnaHQ6IHZhcigtLWx1bW8tbGluZS1oZWlnaHQteHMpOwogIH0KCiAgaDEsCiAgaDIsCiAgaDMsCiAgaDQsCiAgaDUsCiAgaDYgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxpbmUtaGVpZ2h0OiB2YXIoLS1sdW1vLWxpbmUtaGVpZ2h0LXhzKTsKICAgIG1hcmdpbi10b3A6IDEuMjVlbTsKICB9CgogIGgxIHsKICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUteHh4bCk7CiAgICBtYXJnaW4tYm90dG9tOiAwLjc1ZW07CiAgfQoKICBoMiB7CiAgICBmb250LXNpemU6IHZhcigtLWx1bW8tZm9udC1zaXplLXh4bCk7CiAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKICB9CgogIGgzIHsKICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUteGwpOwogICAgbWFyZ2luLWJvdHRvbTogMC41ZW07CiAgfQoKICBoNCB7CiAgICBmb250LXNpemU6IHZhcigtLWx1bW8tZm9udC1zaXplLWwpOwogICAgbWFyZ2luLWJvdHRvbTogMC41ZW07CiAgfQoKICBoNSB7CiAgICBmb250LXNpemU6IHZhcigtLWx1bW8tZm9udC1zaXplLW0pOwogICAgbWFyZ2luLWJvdHRvbTogMC4yNWVtOwogIH0KCiAgaDYgewogICAgZm9udC1zaXplOiB2YXIoLS1sdW1vLWZvbnQtc2l6ZS14cyk7CiAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAzZW07CiAgfQoKICBwLAogIGJsb2NrcXVvdGUgewogICAgbWFyZ2luLXRvcDogMC41ZW07CiAgICBtYXJnaW4tYm90dG9tOiAwLjc1ZW07CiAgfQoKICBhIHsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICB9CgogIGE6aG92ZXIgewogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgfQoKICBociB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICBoZWlnaHQ6IDFweDsKICAgIGJvcmRlcjogMDsKICAgIHBhZGRpbmc6IDA7CiAgICBtYXJnaW46IHZhcigtLWx1bW8tc3BhY2UtcykgY2FsYyh2YXIoLS1sdW1vLWJvcmRlci1yYWRpdXMtbSkgLyAyKTsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QtMTBwY3QpOwogIH0KCiAgYmxvY2txdW90ZSB7CiAgICBib3JkZXItbGVmdDogMnB4IHNvbGlkIHZhcigtLWx1bW8tY29udHJhc3QtMzBwY3QpOwogIH0KCiAgYiwKICBzdHJvbmcgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICB9CgogIC8qIFJUTCBzcGVjaWZpYyBzdHlsZXMgKi8KCiAgYmxvY2txdW90ZVtkaXI9J3J0bCddIHsKICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgYm9yZGVyLXJpZ2h0OiAycHggc29saWQgdmFyKC0tbHVtby1jb250cmFzdC0zMHBjdCk7CiAgfQpgLHttb2R1bGVJZDoibHVtby10eXBvZ3JhcGh5In0pLCRYdCgidmFhZGluLWNoZWNrYm94IixHWHRgCiAgICA6aG9zdCB7CiAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIG91dGxpbmU6IG5vbmU7CiAgICB9CgogICAgW3BhcnQ9J2xhYmVsJ106bm90KFtlbXB0eV0pIHsKICAgICAgbWFyZ2luOiAwLjE4NzVlbSAwLjg3NWVtIDAuMTg3NWVtIDAuMzc1ZW07CiAgICB9CgogICAgW3BhcnQ9J2NoZWNrYm94J10gewogICAgICB3aWR0aDogY2FsYygxZW0gKyAycHgpOwogICAgICBoZWlnaHQ6IGNhbGMoMWVtICsgMnB4KTsKICAgICAgbWFyZ2luOiAwLjE4NzVlbTsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1sdW1vLWJvcmRlci1yYWRpdXMtcyk7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QtMjBwY3QpOwogICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4ycyBjdWJpYy1iZXppZXIoMC4xMiwgMC4zMiwgMC41NCwgMiksIGJhY2tncm91bmQtY29sb3IgMC4xNXM7CiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICBsaW5lLWhlaWdodDogMS4yOwogICAgfQoKICAgIDpob3N0KFtpbmRldGVybWluYXRlXSkgW3BhcnQ9J2NoZWNrYm94J10sCiAgICA6aG9zdChbY2hlY2tlZF0pIFtwYXJ0PSdjaGVja2JveCddIHsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1wcmltYXJ5LWNvbG9yKTsKICAgIH0KCiAgICAvKiBOZWVkZWQgdG8gYWxpZ24gdGhlIGNoZWNrYm94IG5pY2VseSBvbiB0aGUgYmFzZWxpbmUgKi8KICAgIFtwYXJ0PSdjaGVja2JveCddOjpiZWZvcmUgewogICAgICBjb250ZW50OiAnXFwyMDAzJzsKICAgIH0KCiAgICAvKiBDaGVja21hcmsgKi8KICAgIFtwYXJ0PSdjaGVja2JveCddOjphZnRlciB7CiAgICAgIGNvbnRlbnQ6ICcnOwogICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIHdpZHRoOiAwOwogICAgICBoZWlnaHQ6IDA7CiAgICAgIGJvcmRlcjogMCBzb2xpZCB2YXIoLS1sdW1vLXByaW1hcnktY29udHJhc3QtY29sb3IpOwogICAgICBib3JkZXItd2lkdGg6IDAuMTg3NWVtIDAgMCAwLjE4NzVlbTsKICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgdHJhbnNmb3JtLW9yaWdpbjogMCAwOwogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHRvcDogMC44MTI1ZW07CiAgICAgIGxlZnQ6IDAuNWVtOwogICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNTUpIHJvdGF0ZSgtMTM1ZGVnKTsKICAgICAgb3BhY2l0eTogMDsKICAgIH0KCiAgICA6aG9zdChbY2hlY2tlZF0pIFtwYXJ0PSdjaGVja2JveCddOjphZnRlciB7CiAgICAgIG9wYWNpdHk6IDE7CiAgICAgIHdpZHRoOiAwLjYyNWVtOwogICAgICBoZWlnaHQ6IDEuMDYyNWVtOwogICAgfQoKICAgIC8qIEluZGV0ZXJtaW5hdGUgY2hlY2ttYXJrICovCiAgICA6aG9zdChbaW5kZXRlcm1pbmF0ZV0pIFtwYXJ0PSdjaGVja2JveCddOjphZnRlciB7CiAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgICAgb3BhY2l0eTogMTsKICAgICAgdG9wOiA0NSU7CiAgICAgIGhlaWdodDogMTAlOwogICAgICBsZWZ0OiAyMiU7CiAgICAgIHJpZ2h0OiAyMiU7CiAgICAgIHdpZHRoOiBhdXRvOwogICAgICBib3JkZXI6IDA7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tcHJpbWFyeS1jb250cmFzdC1jb2xvcik7CiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4yNXM7CiAgICB9CgogICAgLyogRm9jdXMgcmluZyAqLwogICAgOmhvc3QoW2ZvY3VzLXJpbmddKSBbcGFydD0nY2hlY2tib3gnXSB7CiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCB2YXIoLS1sdW1vLXByaW1hcnktY29sb3ItNTBwY3QpOwogICAgfQoKICAgIC8qIERpc2FibGVkICovCiAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICBjb2xvcjogdmFyKC0tbHVtby1kaXNhYmxlZC10ZXh0LWNvbG9yKTsKICAgIH0KCiAgICA6aG9zdChbZGlzYWJsZWRdKSBbcGFydD0nbGFiZWwnXSA6OnNsb3R0ZWQoKikgewogICAgICBjb2xvcjogaW5oZXJpdDsKICAgIH0KCiAgICA6aG9zdChbZGlzYWJsZWRdKSBbcGFydD0nY2hlY2tib3gnXSB7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QtMTBwY3QpOwogICAgfQoKICAgIDpob3N0KFtkaXNhYmxlZF0pIFtwYXJ0PSdjaGVja2JveCddOjphZnRlciB7CiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0zMHBjdCk7CiAgICB9CgogICAgOmhvc3QoW2luZGV0ZXJtaW5hdGVdW2Rpc2FibGVkXSkgW3BhcnQ9J2NoZWNrYm94J106OmFmdGVyIHsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0zMHBjdCk7CiAgICB9CgogICAgLyogUlRMIHNwZWNpZmljIHN0eWxlcyAqLwogICAgOmhvc3QoW2Rpcj0ncnRsJ10pIFtwYXJ0PSdsYWJlbCddOm5vdChbZW1wdHldKSB7CiAgICAgIG1hcmdpbjogMC4xODc1ZW0gMC4zNzVlbSAwLjE4NzVlbSAwLjg3NWVtOwogICAgfQoKICAgIC8qIFRyYW5zaXRpb24gdGhlIGNoZWNrbWFyayBpZiBhY3RpdmF0ZWQgd2l0aCB0aGUgbW91c2UgKGRpc2FibGVkIGZvciBncmlkIHNlbGVjdC1hbGwgdGhpcyB3YXkpICovCiAgICA6aG9zdCg6aG92ZXIpIFtwYXJ0PSdjaGVja2JveCddOjphZnRlciB7CiAgICAgIHRyYW5zaXRpb246IHdpZHRoIDAuMXMsIGhlaWdodCAwLjI1czsKICAgIH0KCiAgICAvKiBVc2VkIGZvciBhY3RpdmF0aW9uICJoYWxvIiAqLwogICAgW3BhcnQ9J2NoZWNrYm94J106OmJlZm9yZSB7CiAgICAgIGNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB3aWR0aDogMTAwJTsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0OwogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0OwogICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuNCk7CiAgICAgIG9wYWNpdHk6IDA7CiAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjFzLCBvcGFjaXR5IDAuOHM7CiAgICB9CgogICAgLyogSG92ZXIgKi8KICAgIDpob3N0KDpub3QoW2NoZWNrZWRdKTpub3QoW2luZGV0ZXJtaW5hdGVdKTpub3QoW2Rpc2FibGVkXSk6aG92ZXIpIFtwYXJ0PSdjaGVja2JveCddIHsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0zMHBjdCk7CiAgICB9CgogICAgLyogRGlzYWJsZSBob3ZlciBmb3IgdG91Y2ggZGV2aWNlcyAqLwogICAgQG1lZGlhIChwb2ludGVyOiBjb2Fyc2UpIHsKICAgICAgOmhvc3QoOm5vdChbY2hlY2tlZF0pOm5vdChbaW5kZXRlcm1pbmF0ZV0pOm5vdChbZGlzYWJsZWRdKTpob3ZlcikgW3BhcnQ9J2NoZWNrYm94J10gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QtMjBwY3QpOwogICAgICB9CiAgICB9CgogICAgLyogQWN0aXZlICovCiAgICA6aG9zdChbYWN0aXZlXSkgW3BhcnQ9J2NoZWNrYm94J10gewogICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOSk7CiAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMDVzOwogICAgfQoKICAgIDpob3N0KFthY3RpdmVdW2NoZWNrZWRdKSBbcGFydD0nY2hlY2tib3gnXSB7CiAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTsKICAgIH0KCiAgICA6aG9zdChbYWN0aXZlXTpub3QoW2NoZWNrZWRdKSkgW3BhcnQ9J2NoZWNrYm94J106OmJlZm9yZSB7CiAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMDFzLCAwLjAxczsKICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgICAgb3BhY2l0eTogMC40OwogICAgfQogIGAse21vZHVsZUlkOiJsdW1vLWNoZWNrYm94In0pO2NvbnN0IGwkdD10PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue3RoZW1lOnt0eXBlOlN0cmluZyxyZWFkT25seTohMH19fWF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0LGUsbil7c3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHQsZSxuKSwidGhlbWUiPT09dCYmdGhpcy5fc2V0VGhlbWUobil9fSxjJHQ9dD0+Y2xhc3MgZXh0ZW5kcyhsJHQodCkpe3N0YXRpYyBmaW5hbGl6ZSgpe3N1cGVyLmZpbmFsaXplKCk7Y29uc3QgdD10aGlzLnByb3RvdHlwZS5fdGVtcGxhdGUsZT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcy5wcm90b3R5cGUpLl90ZW1wbGF0ZTtlJiZBcnJheS5mcm9tKGUuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCJzdHlsZVtpbmNsdWRlXSIpKS5mb3JFYWNoKChlPT57dGhpcy5faW5jbHVkZVN0eWxlKGUuZ2V0QXR0cmlidXRlKCJpbmNsdWRlIiksdCl9KSksdGhpcy5faW5jbHVkZU1hdGNoaW5nVGhlbWVzKHQpfXN0YXRpYyBfaW5jbHVkZU1hdGNoaW5nVGhlbWVzKHQpe2NvbnN0IGU9Qi5wcm90b3R5cGUubW9kdWxlcztsZXQgbj0hMTtjb25zdCBpPXRoaXMuaXMrIi1kZWZhdWx0LXRoZW1lIjtPYmplY3Qua2V5cyhlKS5zb3J0KCgodCxlKT0+e2NvbnN0IG49MD09PXQuaW5kZXhPZigidmFhZGluLSIpLGk9MD09PWUuaW5kZXhPZigidmFhZGluLSIpLHI9WyJsdW1vLSIsIm1hdGVyaWFsLSJdLG89ci5maWx0ZXIoKGU9PjA9PT10LmluZGV4T2YoZSkpKS5sZW5ndGg+MCxhPXIuZmlsdGVyKCh0PT4wPT09ZS5pbmRleE9mKHQpKSkubGVuZ3RoPjA7cmV0dXJuIG4hPT1pP24/LTE6MTpvIT09YT9vPy0xOjE6MH0pKS5mb3JFYWNoKChyPT57aWYociE9PWkpe2NvbnN0IGk9ZVtyXS5nZXRBdHRyaWJ1dGUoInRoZW1lLWZvciIpO2kmJmkuc3BsaXQoIiAiKS5mb3JFYWNoKChlPT57bmV3IFJlZ0V4cCgiXiIrZS5zcGxpdCgiKiIpLmpvaW4oIi4qIikrIiQiKS50ZXN0KHRoaXMuaXMpJiYobj0hMCx0aGlzLl9pbmNsdWRlU3R5bGUocix0KSl9KSl9fSkpLCFuJiZlW2ldJiZ0aGlzLl9pbmNsdWRlU3R5bGUoaSx0KX1zdGF0aWMgX2luY2x1ZGVTdHlsZSh0LGUpe2lmKGUmJiFlLmNvbnRlbnQucXVlcnlTZWxlY3Rvcihgc3R5bGVbaW5jbHVkZT0iJHt0fSJdYCkpe2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtuLnNldEF0dHJpYnV0ZSgiaW5jbHVkZSIsdCksZS5jb250ZW50LmFwcGVuZENoaWxkKG4pfX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovO2xldCB1JHQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCgoKT0+e3UkdD0hMH0pLHtjYXB0dXJlOiEwfSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsKCgpPT57dSR0PSExfSkse2NhcHR1cmU6ITB9KTtjb25zdCBoJHQ9dD0+Y2xhc3MgZXh0ZW5kcygodD0+Y2xhc3MgZXh0ZW5kcyB0e3N0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybnt0YWJpbmRleDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsb2JzZXJ2ZXI6Il90YWJpbmRleENoYW5nZWQifX19fSkodCkpe3N0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybnthdXRvZm9jdXM6e3R5cGU6Qm9vbGVhbn0sX3ByZXZpb3VzVGFiSW5kZXg6e3R5cGU6TnVtYmVyfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfZGlzYWJsZWRDaGFuZ2VkIixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9pc1NoaWZ0VGFiYmluZzp7dHlwZTpCb29sZWFufX19cmVhZHkoKXt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzaW4iLCh0PT57dC5jb21wb3NlZFBhdGgoKVswXT09PXRoaXM/dGhpcy5jb250YWlucyh0LnJlbGF0ZWRUYXJnZXQpfHx0aGlzLl9mb2N1cygpOi0xPT09dC5jb21wb3NlZFBhdGgoKS5pbmRleE9mKHRoaXMuZm9jdXNFbGVtZW50KXx8dGhpcy5kaXNhYmxlZHx8dGhpcy5fc2V0Rm9jdXNlZCghMCl9KSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJmb2N1c291dCIsKCgpPT50aGlzLl9zZXRGb2N1c2VkKCExKSkpLHN1cGVyLnJlYWR5KCksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwodD0+eyF0LmRlZmF1bHRQcmV2ZW50ZWQmJjk9PT10LmtleUNvZGUmJnQuc2hpZnRLZXkmJih0aGlzLl9pc1NoaWZ0VGFiYmluZz0hMCxIVE1MRWxlbWVudC5wcm90b3R5cGUuZm9jdXMuYXBwbHkodGhpcyksdGhpcy5fc2V0Rm9jdXNlZCghMSksc2V0VGltZW91dCgoKCk9PnRoaXMuX2lzU2hpZnRUYWJiaW5nPSExKSwwKSl9KSksdGhpcy5hdXRvZm9jdXMmJiF0aGlzLmRpc2FibGVkJiZ3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+e3RoaXMuX2ZvY3VzKCksdGhpcy5fc2V0Rm9jdXNlZCghMCksdGhpcy5zZXRBdHRyaWJ1dGUoImZvY3VzLXJpbmciLCIiKX0pKX1kaXNjb25uZWN0ZWRDYWxsYmFjaygpe3N1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCksdGhpcy5oYXNBdHRyaWJ1dGUoImZvY3VzZWQiKSYmdGhpcy5fc2V0Rm9jdXNlZCghMSl9X3NldEZvY3VzZWQodCl7dD90aGlzLnNldEF0dHJpYnV0ZSgiZm9jdXNlZCIsIiIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKCJmb2N1c2VkIiksdCYmdSR0P3RoaXMuc2V0QXR0cmlidXRlKCJmb2N1cy1yaW5nIiwiIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImZvY3VzLXJpbmciKX1nZXQgZm9jdXNFbGVtZW50KCl7cmV0dXJuIHdpbmRvdy5jb25zb2xlLndhcm4oYFBsZWFzZSBpbXBsZW1lbnQgdGhlICdmb2N1c0VsZW1lbnQnIHByb3BlcnR5IGluIDwke3RoaXMubG9jYWxOYW1lfT5gKSx0aGlzfV9mb2N1cygpe3RoaXMuZm9jdXNFbGVtZW50JiYhdGhpcy5faXNTaGlmdFRhYmJpbmcmJih0aGlzLmZvY3VzRWxlbWVudC5mb2N1cygpLHRoaXMuX3NldEZvY3VzZWQoITApKX1mb2N1cygpe3RoaXMuZm9jdXNFbGVtZW50JiYhdGhpcy5kaXNhYmxlZCYmKHRoaXMuZm9jdXNFbGVtZW50LmZvY3VzKCksdGhpcy5fc2V0Rm9jdXNlZCghMCkpfWJsdXIoKXt0aGlzLmZvY3VzRWxlbWVudCYmKHRoaXMuZm9jdXNFbGVtZW50LmJsdXIoKSx0aGlzLl9zZXRGb2N1c2VkKCExKSl9X2Rpc2FibGVkQ2hhbmdlZCh0KXt0aGlzLmZvY3VzRWxlbWVudC5kaXNhYmxlZD10LHQ/KHRoaXMuYmx1cigpLHRoaXMuX3ByZXZpb3VzVGFiSW5kZXg9dGhpcy50YWJpbmRleCx0aGlzLnRhYmluZGV4PS0xLHRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWRpc2FibGVkIiwidHJ1ZSIpKToodm9pZCAwIT09dGhpcy5fcHJldmlvdXNUYWJJbmRleCYmKHRoaXMudGFiaW5kZXg9dGhpcy5fcHJldmlvdXNUYWJJbmRleCksdGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiKSl9X3RhYmluZGV4Q2hhbmdlZCh0KXt2b2lkIDAhPT10JiYodGhpcy5mb2N1c0VsZW1lbnQudGFiSW5kZXg9dCksdGhpcy5kaXNhYmxlZCYmdGhpcy50YWJpbmRleCYmKC0xIT09dGhpcy50YWJpbmRleCYmKHRoaXMuX3ByZXZpb3VzVGFiSW5kZXg9dGhpcy50YWJpbmRleCksdGhpcy50YWJpbmRleD10PXZvaWQgMCl9Y2xpY2soKXt0aGlzLmRpc2FibGVkfHxzdXBlci5jbGljaygpfX0sZCR0PS9cL1wqXCpccyt2YWFkaW4tZGV2LW1vZGU6c3RhcnQoW1xzXFNdKil2YWFkaW4tZGV2LW1vZGU6ZW5kXHMrXCpcKlwvL2kscCR0PXdpbmRvdy5WYWFkaW4mJndpbmRvdy5WYWFkaW4uRmxvdyYmd2luZG93LlZhYWRpbi5GbG93LmNsaWVudHM7ZnVuY3Rpb24gZiR0KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpcmV0dXJuO2NvbnN0IG49ZCR0LmV4ZWModC50b1N0cmluZygpKTtpZihuKXRyeXt0PW5ldyBGdW5jdGlvbihuWzFdKX1jYXRjaCh0KXtjb25zb2xlLmxvZygidmFhZGluLWRldmVsb3BtZW50LW1vZGUtZGV0ZWN0b3I6IHVuY29tbWVudEFuZFJ1bigpIGZhaWxlZCIsdCl9cmV0dXJuIHQoZSl9ZnVuY3Rpb24gbSR0KCl7fXdpbmRvdy5WYWFkaW49d2luZG93LlZhYWRpbnx8e30sdm9pZCAwPT09d2luZG93LlZhYWRpbi5kZXZlbG9wbWVudE1vZGUmJih3aW5kb3cuVmFhZGluLmRldmVsb3BtZW50TW9kZT0oZnVuY3Rpb24gZyR0KCl7dHJ5e3JldHVybiEhKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oInZhYWRpbi5kZXZlbG9wbWVudG1vZGUuZm9yY2UiKX0pKCl8fCEhKGZ1bmN0aW9uIGUoKXtyZXR1cm5bImxvY2FsaG9zdCIsIjEyNy4wLjAuMSJdLmluZGV4T2Yod2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKT49MH0pKCkmJihwJHQ/IShmdW5jdGlvbiBuKCl7cmV0dXJuISEocCR0JiZPYmplY3Qua2V5cyhwJHQpLm1hcCgodD0+cCR0W3RdKSkuZmlsdGVyKCh0PT50LnByb2R1Y3Rpb25Nb2RlKSkubGVuZ3RoPjApfSkoKTohKGZ1bmN0aW9uIGkoKXtyZXR1cm4gZiR0KChmdW5jdGlvbiB0KCl7cmV0dXJuITB9KSl9KSgpKX1jYXRjaCh0KXtyZXR1cm4hMX19KSgpKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi8KY2xhc3MgXyR0e3N0YXRpYyBkZXRlY3RTY3JvbGxUeXBlKCl7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LnRleHRDb250ZW50PSJBQkNEIix0LmRpcj0icnRsIix0LnN0eWxlLmZvbnRTaXplPSIxNHB4Iix0LnN0eWxlLndpZHRoPSI0cHgiLHQuc3R5bGUuaGVpZ2h0PSIxcHgiLHQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0LnN0eWxlLnRvcD0iLTEwMDBweCIsdC5zdHlsZS5vdmVyZmxvdz0ic2Nyb2xsIixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHQpO2xldCBlPSJyZXZlcnNlIjtyZXR1cm4gdC5zY3JvbGxMZWZ0PjA/ZT0iZGVmYXVsdCI6KHQuc2Nyb2xsTGVmdD0yLHQuc2Nyb2xsTGVmdDwyJiYoZT0ibmVnYXRpdmUiKSksZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0KSxlfXN0YXRpYyBnZXROb3JtYWxpemVkU2Nyb2xsTGVmdCh0LGUsbil7Y29uc3R7c2Nyb2xsTGVmdDppfT1uO2lmKCJydGwiIT09ZXx8IXQpcmV0dXJuIGk7c3dpdGNoKHQpe2Nhc2UibmVnYXRpdmUiOnJldHVybiBuLnNjcm9sbFdpZHRoLW4uY2xpZW50V2lkdGgraTtjYXNlInJldmVyc2UiOnJldHVybiBuLnNjcm9sbFdpZHRoLW4uY2xpZW50V2lkdGgtaX1yZXR1cm4gaX1zdGF0aWMgc2V0Tm9ybWFsaXplZFNjcm9sbExlZnQodCxlLG4saSl7aWYoInJ0bCI9PT1lJiZ0KXN3aXRjaCh0KXtjYXNlIm5lZ2F0aXZlIjpuLnNjcm9sbExlZnQ9bi5jbGllbnRXaWR0aC1uLnNjcm9sbFdpZHRoK2k7YnJlYWs7Y2FzZSJyZXZlcnNlIjpuLnNjcm9sbExlZnQ9bi5zY3JvbGxXaWR0aC1uLmNsaWVudFdpZHRoLWk7YnJlYWs7ZGVmYXVsdDpuLnNjcm9sbExlZnQ9aX1lbHNlIG4uc2Nyb2xsTGVmdD1pfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi9jb25zdCB5JHQ9W107bGV0IHYkdDtuZXcgTXV0YXRpb25PYnNlcnZlcigoZnVuY3Rpb24oKXtjb25zdCB0PXgkdCgpO3kkdC5mb3JFYWNoKChlPT57YiR0KGUsdCl9KSl9KSkub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQse2F0dHJpYnV0ZXM6ITAsYXR0cmlidXRlRmlsdGVyOlsiZGlyIl19KTtjb25zdCBiJHQ9ZnVuY3Rpb24odCxlLG49dC5nZXRBdHRyaWJ1dGUoImRpciIpKXtlP3Quc2V0QXR0cmlidXRlKCJkaXIiLGUpOm51bGwhPW4mJnQucmVtb3ZlQXR0cmlidXRlKCJkaXIiKX0seCR0PWZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoImRpciIpfSx3JHQ9dD0+Y2xhc3MgZXh0ZW5kcyB0e3N0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntkaXI6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19fXN0YXRpYyBmaW5hbGl6ZSgpe3N1cGVyLmZpbmFsaXplKCksdiR0fHwodiR0PV8kdC5kZXRlY3RTY3JvbGxUeXBlKCkpfWNvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLmhhc0F0dHJpYnV0ZSgiZGlyIil8fCh0aGlzLl9fc3Vic2NyaWJlKCksYiR0KHRoaXMseCR0KCksbnVsbCkpfWF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0LGUsbil7aWYoc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHQsZSxuKSwiZGlyIiE9PXQpcmV0dXJuO2NvbnN0IGk9eCR0KCkscj1uPT09aSYmLTE9PT15JHQuaW5kZXhPZih0aGlzKSxvPSFuJiZlJiYtMT09PXkkdC5pbmRleE9mKHRoaXMpLGE9biE9PWkmJmU9PT1pO3J8fG8/KHRoaXMuX19zdWJzY3JpYmUoKSxiJHQodGhpcyxpLG4pKTphJiZ0aGlzLl9fc3Vic2NyaWJlKCExKX1kaXNjb25uZWN0ZWRDYWxsYmFjaygpe3N1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCksdGhpcy5fX3N1YnNjcmliZSghMSksdGhpcy5yZW1vdmVBdHRyaWJ1dGUoImRpciIpfV92YWx1ZVRvTm9kZUF0dHJpYnV0ZSh0LGUsbil7KCJkaXIiIT09bnx8IiIhPT1lfHx0Lmhhc0F0dHJpYnV0ZSgiZGlyIikpJiZzdXBlci5fdmFsdWVUb05vZGVBdHRyaWJ1dGUodCxlLG4pfV9hdHRyaWJ1dGVUb1Byb3BlcnR5KHQsZSxuKXsiZGlyIiE9PXR8fGU/c3VwZXIuX2F0dHJpYnV0ZVRvUHJvcGVydHkodCxlLG4pOnRoaXMuZGlyPSIifV9fc3Vic2NyaWJlKHQ9ITApe3Q/LTE9PT15JHQuaW5kZXhPZih0aGlzKSYmeSR0LnB1c2godGhpcyk6eSR0LmluZGV4T2YodGhpcyk+LTEmJnkkdC5zcGxpY2UoeSR0LmluZGV4T2YodGhpcyksMSl9X19nZXROb3JtYWxpemVkU2Nyb2xsTGVmdCh0KXtyZXR1cm4gXyR0LmdldE5vcm1hbGl6ZWRTY3JvbGxMZWZ0KHYkdCx0aGlzLmdldEF0dHJpYnV0ZSgiZGlyIil8fCJsdHIiLHQpfV9fc2V0Tm9ybWFsaXplZFNjcm9sbExlZnQodCxlKXtyZXR1cm4gXyR0LnNldE5vcm1hbGl6ZWRTY3JvbGxMZWZ0KHYkdCx0aGlzLmdldEF0dHJpYnV0ZSgiZGlyIil8fCJsdHIiLHQsZSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLztsZXQgUyR0O3dpbmRvdy5WYWFkaW49d2luZG93LlZhYWRpbnx8e30sd2luZG93LlZhYWRpbi5yZWdpc3RyYXRpb25zPXdpbmRvdy5WYWFkaW4ucmVnaXN0cmF0aW9uc3x8W10sd2luZG93LlZhYWRpbi5kZXZlbG9wbWVudE1vZGVDYWxsYmFjaz13aW5kb3cuVmFhZGluLmRldmVsb3BtZW50TW9kZUNhbGxiYWNrfHx7fSx3aW5kb3cuVmFhZGluLmRldmVsb3BtZW50TW9kZUNhbGxiYWNrWyJ2YWFkaW4tdXNhZ2Utc3RhdGlzdGljcyJdPWZ1bmN0aW9uKCl7dmFyIHQ7dD1tJHQsd2luZG93LlZhYWRpbi5kZXZlbG9wbWVudE1vZGUmJmYkdCh0LHZvaWQgMCl9O2NvbnN0IE0kdD1uZXcgU2V0LEUkdD10PT5jbGFzcyBleHRlbmRzKHckdCh0KSl7c3RhdGljIGZpbmFsaXplKCl7c3VwZXIuZmluYWxpemUoKTtjb25zdHtpczp0fT10aGlzO3QmJiFNJHQuaGFzKHQpJiYod2luZG93LlZhYWRpbi5yZWdpc3RyYXRpb25zLnB1c2godGhpcyksTSR0LmFkZCh0KSx3aW5kb3cuVmFhZGluLmRldmVsb3BtZW50TW9kZUNhbGxiYWNrJiYoUyR0PVRuLmRlYm91bmNlKFMkdCx5dCwoKCk9Pnt3aW5kb3cuVmFhZGluLmRldmVsb3BtZW50TW9kZUNhbGxiYWNrWyJ2YWFkaW4tdXNhZ2Utc3RhdGlzdGljcyJdKCl9KSksQW4oUyR0KSkpfWNvbnN0cnVjdG9yKCl7c3VwZXIoKSxudWxsPT09ZG9jdW1lbnQuZG9jdHlwZSYmY29uc29sZS53YXJuKCdWYWFkaW4gY29tcG9uZW50cyByZXF1aXJlIHRoZSAic3RhbmRhcmRzIG1vZGUiIGRlY2xhcmF0aW9uLiBQbGVhc2UgYWRkIDwhRE9DVFlQRSBodG1sPiB0byB0aGUgSFRNTCBkb2N1bWVudC4nKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovO2NsYXNzIFQkdCBleHRlbmRzKEUkdChoJHQoYyR0KHBpKHllKSkpKSl7c3RhdGljIGdldCB0ZW1wbGF0ZSgpe3JldHVybiBfZWAKICAgICAgPHN0eWxlPgogICAgICAgIDpob3N0IHsKICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB9CgogICAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgfQoKICAgICAgICBsYWJlbCB7CiAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgfQoKICAgICAgICBbcGFydD0nY2hlY2tib3gnXSB7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICBmbGV4OiBub25lOwogICAgICAgIH0KCiAgICAgICAgaW5wdXRbdHlwZT0nY2hlY2tib3gnXSB7CiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICB0b3A6IDA7CiAgICAgICAgICBsZWZ0OiAwOwogICAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgICBjdXJzb3I6IGluaGVyaXQ7CiAgICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgfQoKICAgICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgICAgIH0KICAgICAgPC9zdHlsZT4KCiAgICAgIDxsYWJlbD4KICAgICAgICA8c3BhbiBwYXJ0PSJjaGVja2JveCI+CiAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgdHlwZT0iY2hlY2tib3giCiAgICAgICAgICAgIGNoZWNrZWQ9Int7Y2hlY2tlZDo6Y2hhbmdlfX0iCiAgICAgICAgICAgIGRpc2FibGVkJD0iW1tkaXNhYmxlZF1dIgogICAgICAgICAgICBpbmRldGVybWluYXRlPSJ7e2luZGV0ZXJtaW5hdGU6OmNoYW5nZX19IgogICAgICAgICAgICByb2xlPSJwcmVzZW50YXRpb24iCiAgICAgICAgICAgIHRhYmluZGV4PSItMSIKICAgICAgICAgIC8+CiAgICAgICAgPC9zcGFuPgoKICAgICAgICA8c3BhbiBwYXJ0PSJsYWJlbCI+CiAgICAgICAgICA8c2xvdD48L3Nsb3Q+CiAgICAgICAgPC9zcGFuPgogICAgICA8L2xhYmVsPgogICAgYH1zdGF0aWMgZ2V0IGlzKCl7cmV0dXJuInZhYWRpbi1jaGVja2JveCJ9c3RhdGljIGdldCB2ZXJzaW9uKCl7cmV0dXJuIjIwLjAuMiJ9c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue2NoZWNrZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9jaGVja2VkQ2hhbmdlZCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxpbmRldGVybWluYXRlOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLG9ic2VydmVyOiJfaW5kZXRlcm1pbmF0ZUNoYW5nZWQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMX0sdmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiJvbiJ9LF9uYXRpdmVDaGVja2JveDp7dHlwZTpPYmplY3R9fX1jb25zdHJ1Y3Rvcigpe3N1cGVyKCl9Z2V0IG5hbWUoKXtyZXR1cm4gdGhpcy5jaGVja2VkP3RoaXMuX3N0b3JlZE5hbWU6IiJ9c2V0IG5hbWUodCl7dGhpcy5fc3RvcmVkTmFtZT10fXJlYWR5KCl7c3VwZXIucmVhZHkoKSx0aGlzLnNldEF0dHJpYnV0ZSgicm9sZSIsImNoZWNrYm94IiksdGhpcy5fbmF0aXZlQ2hlY2tib3g9dGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W3R5cGU9ImNoZWNrYm94Il0nKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLl9oYW5kbGVDbGljay5iaW5kKHRoaXMpKSx0aGlzLl9hZGRBY3RpdmVMaXN0ZW5lcnMoKTtjb25zdCB0PXRoaXMuZ2V0QXR0cmlidXRlKCJuYW1lIik7dCYmKHRoaXMubmFtZT10KSx0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignW3BhcnR+PSJsYWJlbCJdJykucXVlcnlTZWxlY3Rvcigic2xvdCIpLmFkZEV2ZW50TGlzdGVuZXIoInNsb3RjaGFuZ2UiLHRoaXMuX3VwZGF0ZUxhYmVsQXR0cmlidXRlLmJpbmQodGhpcykpLHRoaXMuX3VwZGF0ZUxhYmVsQXR0cmlidXRlKCl9X3VwZGF0ZUxhYmVsQXR0cmlidXRlKCl7Y29uc3QgdD10aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignW3BhcnR+PSJsYWJlbCJdJyksZT10LmZpcnN0RWxlbWVudENoaWxkLmFzc2lnbmVkTm9kZXMoKTt0aGlzLl9pc0Fzc2lnbmVkTm9kZXNFbXB0eShlKT90LnNldEF0dHJpYnV0ZSgiZW1wdHkiLCIiKTp0LnJlbW92ZUF0dHJpYnV0ZSgiZW1wdHkiKX1faXNBc3NpZ25lZE5vZGVzRW1wdHkodCl7cmV0dXJuIDA9PT10Lmxlbmd0aHx8MT09dC5sZW5ndGgmJnRbMF0ubm9kZVR5cGU9PU5vZGUuVEVYVF9OT0RFJiYiIj09PXRbMF0udGV4dENvbnRlbnQudHJpbSgpfV9jaGVja2VkQ2hhbmdlZCh0KXt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1jaGVja2VkIix0aGlzLmluZGV0ZXJtaW5hdGU/Im1peGVkIjpCb29sZWFuKHQpKX1faW5kZXRlcm1pbmF0ZUNoYW5nZWQodCl7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIsdD8ibWl4ZWQiOnRoaXMuY2hlY2tlZCl9X2FkZEFjdGl2ZUxpc3RlbmVycygpe3RoaXMuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUodGhpcywiZG93biIsKHQ9Pnt0aGlzLl9faW50ZXJhY3Rpb25zQWxsb3dlZCh0KSYmdGhpcy5zZXRBdHRyaWJ1dGUoImFjdGl2ZSIsIiIpfSkpLHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUodGhpcywidXAiLCgoKT0+dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFjdGl2ZSIpKSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwodD0+e3RoaXMuX19pbnRlcmFjdGlvbnNBbGxvd2VkKHQpJiYzMj09PXQua2V5Q29kZSYmKHQucHJldmVudERlZmF1bHQoKSx0aGlzLnNldEF0dHJpYnV0ZSgiYWN0aXZlIiwiIikpfSkpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLCh0PT57dGhpcy5fX2ludGVyYWN0aW9uc0FsbG93ZWQodCkmJjMyPT09dC5rZXlDb2RlJiYodC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX3RvZ2dsZUNoZWNrZWQoKSx0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYWN0aXZlIiksdGhpcy5pbmRldGVybWluYXRlJiYodGhpcy5pbmRldGVybWluYXRlPSExKSl9KSl9Z2V0IGZvY3VzRWxlbWVudCgpe3JldHVybiB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiaW5wdXQiKX1fX2ludGVyYWN0aW9uc0FsbG93ZWQodCl7cmV0dXJuIXRoaXMuZGlzYWJsZWQmJiJhIiE9PXQudGFyZ2V0LmxvY2FsTmFtZX1faGFuZGxlQ2xpY2sodCl7dGhpcy5fX2ludGVyYWN0aW9uc0FsbG93ZWQodCkmJih0aGlzLmluZGV0ZXJtaW5hdGU/KHRoaXMuaW5kZXRlcm1pbmF0ZT0hMSx0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fdG9nZ2xlQ2hlY2tlZCgpKTp0LmNvbXBvc2VkUGF0aCgpWzBdIT09dGhpcy5fbmF0aXZlQ2hlY2tib3gmJih0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fdG9nZ2xlQ2hlY2tlZCgpKSl9X3RvZ2dsZUNoZWNrZWQoKXt0aGlzLmNoZWNrZWQ9IXRoaXMuY2hlY2tlZCx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjaGFuZ2UiLHtjb21wb3NlZDohMSxidWJibGVzOiEwfSkpfX1jdXN0b21FbGVtZW50cy5kZWZpbmUoVCR0LmlzLFQkdCksJFh0KCJ2YWFkaW4tZ3JpZCIsR1h0YAogICAgOmhvc3QgewogICAgICBmb250LWZhbWlseTogdmFyKC0tbHVtby1mb250LWZhbWlseSk7CiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUtbSk7CiAgICAgIGxpbmUtaGVpZ2h0OiB2YXIoLS1sdW1vLWxpbmUtaGVpZ2h0LXMpOwogICAgICBjb2xvcjogdmFyKC0tbHVtby1ib2R5LXRleHQtY29sb3IpOwogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1sdW1vLWJhc2UtY29sb3IpOwogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7CiAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlOwoKICAgICAgLyogRm9yIGludGVybmFsIHVzZSBvbmx5ICovCiAgICAgIC0tX2x1bW8tZ3JpZC1ib3JkZXItY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QtMjBwY3QpOwogICAgICAtLV9sdW1vLWdyaWQtc2Vjb25kYXJ5LWJvcmRlci1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0xMHBjdCk7CiAgICAgIC0tX2x1bW8tZ3JpZC1ib3JkZXItd2lkdGg6IDFweDsKICAgICAgLS1fbHVtby1ncmlkLXNlbGVjdGVkLXJvdy1jb2xvcjogdmFyKC0tbHVtby1wcmltYXJ5LWNvbG9yLTEwcGN0KTsKICAgIH0KCiAgICAvKiBObyAob3V0ZXIpIGJvcmRlciAqLwoKICAgIDpob3N0KDpub3QoW3RoZW1lfj0nbm8tYm9yZGVyJ10pKSB7CiAgICAgIGJvcmRlcjogdmFyKC0tX2x1bW8tZ3JpZC1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLWNvbG9yKTsKICAgIH0KCiAgICAvKiBDZWxsIHN0eWxlcyAqLwoKICAgIFtwYXJ0fj0nY2VsbCddIHsKICAgICAgbWluLWhlaWdodDogdmFyKC0tbHVtby1zaXplLW0pOwogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1sdW1vLWJhc2UtY29sb3IpOwogICAgfQoKICAgIFtwYXJ0fj0nY2VsbCddIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICBwYWRkaW5nOiB2YXIoLS1sdW1vLXNwYWNlLXhzKSB2YXIoLS1sdW1vLXNwYWNlLW0pOwogICAgfQoKICAgIC8qIEFwcGx5IHJvdyBib3JkZXJzIGJ5IGRlZmF1bHQgYW5kIGludHJvZHVjZSB0aGUgIm5vLXJvdy1ib3JkZXJzIiB2YXJpYW50ICovCiAgICA6aG9zdCg6bm90KFt0aGVtZX49J25vLXJvdy1ib3JkZXJzJ10pKSBbcGFydH49J2NlbGwnXTpub3QoW3BhcnR+PSdkZXRhaWxzLWNlbGwnXSkgewogICAgICBib3JkZXItdG9wOiB2YXIoLS1fbHVtby1ncmlkLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tX2x1bW8tZ3JpZC1zZWNvbmRhcnktYm9yZGVyLWNvbG9yKTsKICAgIH0KCiAgICAvKiBIaWRlIGZpcnN0IGJvZHkgcm93IHRvcCBib3JkZXIgKi8KICAgIDpob3N0KDpub3QoW3RoZW1lfj0nbm8tcm93LWJvcmRlcnMnXSkpIFtwYXJ0PSdyb3cnXVtmaXJzdF0gW3BhcnR+PSdjZWxsJ106bm90KFtwYXJ0fj0nZGV0YWlscy1jZWxsJ10pIHsKICAgICAgYm9yZGVyLXRvcDogMDsKICAgICAgbWluLWhlaWdodDogY2FsYyh2YXIoLS1sdW1vLXNpemUtbSkgLSB2YXIoLS1fbHVtby1ncmlkLWJvcmRlci13aWR0aCkpOwogICAgfQoKICAgIC8qIEZvY3VzLXJpbmcgKi8KCiAgICBbcGFydH49J2NlbGwnXTpmb2N1cyB7CiAgICAgIG91dGxpbmU6IG5vbmU7CiAgICB9CgogICAgOmhvc3QoW25hdmlnYXRpbmddKSBbcGFydH49J2NlbGwnXTpmb2N1czo6YmVmb3JlIHsKICAgICAgY29udGVudDogJyc7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgdG9wOiAwOwogICAgICByaWdodDogMDsKICAgICAgYm90dG9tOiAwOwogICAgICBsZWZ0OiAwOwogICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMnB4IHZhcigtLWx1bW8tcHJpbWFyeS1jb2xvci01MHBjdCk7CiAgICB9CgogICAgLyogRHJhZyBhbmQgRHJvcCBzdHlsZXMgKi8KICAgIDpob3N0KFtkcmFnb3Zlcl0pOjphZnRlciB7CiAgICAgIGNvbnRlbnQ6ICcnOwogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHotaW5kZXg6IDEwMDsKICAgICAgdG9wOiAwOwogICAgICByaWdodDogMDsKICAgICAgYm90dG9tOiAwOwogICAgICBsZWZ0OiAwOwogICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMnB4IHZhcigtLWx1bW8tcHJpbWFyeS1jb2xvci01MHBjdCk7CiAgICB9CgogICAgW3BhcnR+PSdyb3cnXVtkcmFnb3Zlcl0gewogICAgICB6LWluZGV4OiAxMDAgIWltcG9ydGFudDsKICAgIH0KCiAgICBbcGFydH49J3JvdyddW2RyYWdvdmVyXSBbcGFydH49J2NlbGwnXSB7CiAgICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgfQoKICAgIFtwYXJ0fj0ncm93J11bZHJhZ292ZXJdIFtwYXJ0fj0nY2VsbCddOjphZnRlciB7CiAgICAgIGNvbnRlbnQ6ICcnOwogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHRvcDogMDsKICAgICAgcmlnaHQ6IDA7CiAgICAgIGJvdHRvbTogMDsKICAgICAgbGVmdDogMDsKICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLXdpZHRoKSArIDJweCk7CiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1sdW1vLXByaW1hcnktY29sb3ItNTBwY3QpOwogICAgfQoKICAgIDpob3N0KFt0aGVtZX49J25vLXJvdy1ib3JkZXJzJ10pIFtkcmFnb3Zlcl0gW3BhcnR+PSdjZWxsJ106OmFmdGVyIHsKICAgICAgaGVpZ2h0OiAycHg7CiAgICB9CgogICAgW3BhcnR+PSdyb3cnXVtkcmFnb3Zlcj0nYmVsb3cnXSBbcGFydH49J2NlbGwnXTo6YWZ0ZXIgewogICAgICB0b3A6IDEwMCU7CiAgICAgIGJvdHRvbTogYXV0bzsKICAgICAgbWFyZ2luLXRvcDogLTFweDsKICAgIH0KCiAgICBbcGFydH49J3JvdyddW2RyYWdvdmVyPSdhYm92ZSddIFtwYXJ0fj0nY2VsbCddOjphZnRlciB7CiAgICAgIHRvcDogYXV0bzsKICAgICAgYm90dG9tOiAxMDAlOwogICAgICBtYXJnaW4tYm90dG9tOiAtMXB4OwogICAgfQoKICAgIFtwYXJ0fj0ncm93J11bZGV0YWlscy1vcGVuZWRdW2RyYWdvdmVyPSdiZWxvdyddIFtwYXJ0fj0nY2VsbCddOm5vdChbcGFydH49J2RldGFpbHMtY2VsbCddKTo6YWZ0ZXIsCiAgICBbcGFydH49J3JvdyddW2RldGFpbHMtb3BlbmVkXVtkcmFnb3Zlcj0nYWJvdmUnXSBbcGFydH49J2RldGFpbHMtY2VsbCddOjphZnRlciB7CiAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICB9CgogICAgW3BhcnR+PSdyb3cnXVtkcmFnb3Zlcl1bZHJhZ292ZXI9J29uLXRvcCddIFtwYXJ0fj0nY2VsbCddOjphZnRlciB7CiAgICAgIGhlaWdodDogMTAwJTsKICAgIH0KCiAgICBbcGFydH49J3JvdyddW2RyYWdzdGFydF0gewogICAgICAvKiBBZGQgYm90dG9tLXNwYWNlIHRvIHRoZSByb3cgc28gdGhlIGRyYWcgbnVtYmVyIGRvZXNuJ3QgZ2V0IGNsaXBwZWQuIE5lZWRlZCBmb3IgSUUvRWRnZSAqLwogICAgICBib3JkZXItYm90dG9tOiAxMDBweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgei1pbmRleDogMTAwICFpbXBvcnRhbnQ7CiAgICAgIG9wYWNpdHk6IDAuOTsKICAgIH0KCiAgICBbcGFydH49J3JvdyddW2RyYWdzdGFydF0gW3BhcnR+PSdjZWxsJ10gewogICAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50OwogICAgfQoKICAgIFtwYXJ0fj0ncm93J11bZHJhZ3N0YXJ0XSBbcGFydH49J2NlbGwnXVtsYXN0LWNvbHVtbl0gewogICAgICBib3JkZXItcmFkaXVzOiAwIHZhcigtLWx1bW8tYm9yZGVyLXJhZGl1cy1zKSB2YXIoLS1sdW1vLWJvcmRlci1yYWRpdXMtcykgMDsKICAgIH0KCiAgICBbcGFydH49J3JvdyddW2RyYWdzdGFydF0gW3BhcnR+PSdjZWxsJ11bZmlyc3QtY29sdW1uXSB7CiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWx1bW8tYm9yZGVyLXJhZGl1cy1zKSAwIDAgdmFyKC0tbHVtby1ib3JkZXItcmFkaXVzLXMpOwogICAgfQoKICAgIFtpb3NdIFtwYXJ0fj0ncm93J11bZHJhZ3N0YXJ0XSBbcGFydH49J2NlbGwnXSB7CiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWx1bW8tcHJpbWFyeS1jb2xvci01MHBjdCk7CiAgICB9CgogICAgI3Njcm9sbGVyOm5vdChbaW9zXSkgW3BhcnR+PSdyb3cnXVtkcmFnc3RhcnRdOm5vdChbZHJhZ3N0YXJ0PScnXSk6OmFmdGVyIHsKICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgbGVmdDogdmFyKC0tX2dyaWQtZHJhZy1zdGFydC14KTsKICAgICAgdG9wOiB2YXIoLS1fZ3JpZC1kcmFnLXN0YXJ0LXkpOwogICAgICB6LWluZGV4OiAxMDA7CiAgICAgIGNvbnRlbnQ6IGF0dHIoZHJhZ3N0YXJ0KTsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIHBhZGRpbmc6IGNhbGModmFyKC0tbHVtby1zcGFjZS14cykgKiAwLjgpOwogICAgICBjb2xvcjogdmFyKC0tbHVtby1lcnJvci1jb250cmFzdC1jb2xvcik7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tZXJyb3ItY29sb3IpOwogICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1sdW1vLWJvcmRlci1yYWRpdXMtbSk7CiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1sdW1vLWZvbnQtZmFtaWx5KTsKICAgICAgZm9udC1zaXplOiB2YXIoLS1sdW1vLWZvbnQtc2l6ZS14eHMpOwogICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgdGV4dC10cmFuc2Zvcm06IGluaXRpYWw7CiAgICAgIGxldHRlci1zcGFjaW5nOiBpbml0aWFsOwogICAgICBtaW4td2lkdGg6IGNhbGModmFyKC0tbHVtby1zaXplLXMpICogMC43KTsKICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgfQoKICAgIC8qIEhlYWRlcnMgYW5kIGZvb3RlcnMgKi8KCiAgICBbcGFydH49J2hlYWRlci1jZWxsJ10gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCksCiAgICBbcGFydH49J2Zvb3Rlci1jZWxsJ10gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCksCiAgICBbcGFydH49J3Jlb3JkZXItZ2hvc3QnXSB7CiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUtcyk7CiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICB9CgogICAgW3BhcnR+PSdmb290ZXItY2VsbCddIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgIH0KCiAgICBbcGFydD0ncm93J106b25seS1jaGlsZCBbcGFydH49J2hlYWRlci1jZWxsJ10gewogICAgICBtaW4taGVpZ2h0OiB2YXIoLS1sdW1vLXNpemUteGwpOwogICAgfQoKICAgIC8qIEhlYWRlciBib3JkZXJzICovCgogICAgLyogSGlkZSBmaXJzdCBoZWFkZXIgcm93IHRvcCBib3JkZXIgKi8KICAgIDpob3N0KDpub3QoW3RoZW1lfj0nbm8tcm93LWJvcmRlcnMnXSkpIFtwYXJ0PSdyb3cnXTpmaXJzdC1jaGlsZCBbcGFydH49J2hlYWRlci1jZWxsJ10gewogICAgICBib3JkZXItdG9wOiAwOwogICAgfQoKICAgIFtwYXJ0PSdyb3cnXTpsYXN0LWNoaWxkIFtwYXJ0fj0naGVhZGVyLWNlbGwnXSB7CiAgICAgIGJvcmRlci1ib3R0b206IHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLXdpZHRoKSBzb2xpZCB0cmFuc3BhcmVudDsKICAgIH0KCiAgICA6aG9zdCg6bm90KFt0aGVtZX49J25vLXJvdy1ib3JkZXJzJ10pKSBbcGFydD0ncm93J106bGFzdC1jaGlsZCBbcGFydH49J2hlYWRlci1jZWxsJ10gewogICAgICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1fbHVtby1ncmlkLXNlY29uZGFyeS1ib3JkZXItY29sb3IpOwogICAgfQoKICAgIC8qIE92ZXJmbG93IHVzZXMgYSBzdHJvbmdlciBib3JkZXIgY29sb3IgKi8KICAgIDpob3N0KFtvdmVyZmxvd349J3RvcCddKSBbcGFydD0ncm93J106bGFzdC1jaGlsZCBbcGFydH49J2hlYWRlci1jZWxsJ10gewogICAgICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1fbHVtby1ncmlkLWJvcmRlci1jb2xvcik7CiAgICB9CgogICAgLyogRm9vdGVyIGJvcmRlcnMgKi8KCiAgICBbcGFydD0ncm93J106Zmlyc3QtY2hpbGQgW3BhcnR+PSdmb290ZXItY2VsbCddIHsKICAgICAgYm9yZGVyLXRvcDogdmFyKC0tX2x1bW8tZ3JpZC1ib3JkZXItd2lkdGgpIHNvbGlkIHRyYW5zcGFyZW50OwogICAgfQoKICAgIDpob3N0KDpub3QoW3RoZW1lfj0nbm8tcm93LWJvcmRlcnMnXSkpIFtwYXJ0PSdyb3cnXTpmaXJzdC1jaGlsZCBbcGFydH49J2Zvb3Rlci1jZWxsJ10gewogICAgICBib3JkZXItdG9wLWNvbG9yOiB2YXIoLS1fbHVtby1ncmlkLXNlY29uZGFyeS1ib3JkZXItY29sb3IpOwogICAgfQoKICAgIC8qIE92ZXJmbG93IHVzZXMgYSBzdHJvbmdlciBib3JkZXIgY29sb3IgKi8KICAgIDpob3N0KFtvdmVyZmxvd349J2JvdHRvbSddKSBbcGFydD0ncm93J106Zmlyc3QtY2hpbGQgW3BhcnR+PSdmb290ZXItY2VsbCddIHsKICAgICAgYm9yZGVyLXRvcC1jb2xvcjogdmFyKC0tX2x1bW8tZ3JpZC1ib3JkZXItY29sb3IpOwogICAgfQoKICAgIC8qIENvbHVtbiByZW9yZGVyaW5nICovCgogICAgOmhvc3QoW3Jlb3JkZXJpbmddKSBbcGFydH49J2NlbGwnXSB7CiAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh2YXIoLS1sdW1vLXNoYWRlLTIwcGN0KSwgdmFyKC0tbHVtby1zaGFkZS0yMHBjdCkpIHZhcigtLWx1bW8tYmFzZS1jb2xvcik7CiAgICB9CgogICAgOmhvc3QoW3Jlb3JkZXJpbmddKSBbcGFydH49J2NlbGwnXVtyZW9yZGVyLXN0YXR1cz0nYWxsb3dlZCddIHsKICAgICAgYmFja2dyb3VuZDogdmFyKC0tbHVtby1iYXNlLWNvbG9yKTsKICAgIH0KCiAgICA6aG9zdChbcmVvcmRlcmluZ10pIFtwYXJ0fj0nY2VsbCddW3Jlb3JkZXItc3RhdHVzPSdkcmFnZ2luZyddIHsKICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHZhcigtLWx1bW8tY29udHJhc3QtNXBjdCksIHZhcigtLWx1bW8tY29udHJhc3QtNXBjdCkpIHZhcigtLWx1bW8tYmFzZS1jb2xvcik7CiAgICB9CgogICAgW3BhcnR+PSdyZW9yZGVyLWdob3N0J10gewogICAgICBvcGFjaXR5OiAwLjg1OwogICAgICBib3gtc2hhZG93OiB2YXIoLS1sdW1vLWJveC1zaGFkb3ctcyk7CiAgICAgIC8qIFRPRE8gVXNlIHRoZSBzYW1lIHN0eWxlcyBhcyBmb3IgdGhlIGNlbGwgZWxlbWVudCAocmVvcmRlci1naG9zdCBjb3BpZXMgc3R5bGVzIGZyb20gdGhlIGNlbGwgZWxlbWVudCkgKi8KICAgICAgcGFkZGluZzogdmFyKC0tbHVtby1zcGFjZS1zKSB2YXIoLS1sdW1vLXNwYWNlLW0pICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLyogQ29sdW1uIHJlc2l6aW5nICovCgogICAgW3BhcnQ9J3Jlc2l6ZS1oYW5kbGUnXSB7CiAgICAgIHdpZHRoOiAzcHg7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tcHJpbWFyeS1jb2xvci01MHBjdCk7CiAgICAgIG9wYWNpdHk6IDA7CiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4yczsKICAgIH0KCiAgICA6aG9zdCg6bm90KFtyZW9yZGVyaW5nXSkpICo6bm90KFtjb2x1bW4tcmVzaXppbmddKSBbcGFydH49J2NlbGwnXTpob3ZlciBbcGFydD0ncmVzaXplLWhhbmRsZSddLAogICAgW3BhcnQ9J3Jlc2l6ZS1oYW5kbGUnXTphY3RpdmUgewogICAgICBvcGFjaXR5OiAxOwogICAgICB0cmFuc2l0aW9uLWRlbGF5OiAwLjE1czsKICAgIH0KCiAgICAvKiBDb2x1bW4gYm9yZGVycyAqLwoKICAgIDpob3N0KFt0aGVtZX49J2NvbHVtbi1ib3JkZXJzJ10pIFtwYXJ0fj0nY2VsbCddOm5vdChbbGFzdC1jb2x1bW5dKTpub3QoW3BhcnR+PSdkZXRhaWxzLWNlbGwnXSkgewogICAgICBib3JkZXItcmlnaHQ6IHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1fbHVtby1ncmlkLXNlY29uZGFyeS1ib3JkZXItY29sb3IpOwogICAgfQoKICAgIC8qIEZyb3plbiBjb2x1bW5zICovCgogICAgW2xhc3QtZnJvemVuXSB7CiAgICAgIGJvcmRlci1yaWdodDogdmFyKC0tX2x1bW8tZ3JpZC1ib3JkZXItd2lkdGgpIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgfQoKICAgIDpob3N0KFtvdmVyZmxvd349J2xlZnQnXSkgW3BhcnR+PSdjZWxsJ11bbGFzdC1mcm96ZW5dOm5vdChbcGFydH49J2RldGFpbHMtY2VsbCddKSB7CiAgICAgIGJvcmRlci1yaWdodC1jb2xvcjogdmFyKC0tX2x1bW8tZ3JpZC1ib3JkZXItY29sb3IpOwogICAgfQoKICAgIC8qIFJvdyBzdHJpcGVzICovCgogICAgOmhvc3QoW3RoZW1lfj0ncm93LXN0cmlwZXMnXSkgW3BhcnR+PSdyb3cnXTpub3QoW29kZF0pIFtwYXJ0fj0nYm9keS1jZWxsJ10sCiAgICA6aG9zdChbdGhlbWV+PSdyb3ctc3RyaXBlcyddKSBbcGFydH49J3JvdyddOm5vdChbb2RkXSkgW3BhcnR+PSdkZXRhaWxzLWNlbGwnXSB7CiAgICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh2YXIoLS1sdW1vLWNvbnRyYXN0LTVwY3QpLCB2YXIoLS1sdW1vLWNvbnRyYXN0LTVwY3QpKTsKICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OwogICAgfQoKICAgIC8qIFNlbGVjdGVkIHJvdyAqLwoKICAgIC8qIFJhaXNlIHRoZSBzZWxlY3RlZCByb3dzIGFib3ZlIHVuc2VsZWN0ZWQgcm93cyAoc28gdGhhdCBib3gtc2hhZG93IGNhbiBjb3ZlciB1bnNlbGVjdGVkIHJvd3MpICovCiAgICA6aG9zdCg6bm90KFtyZW9yZGVyaW5nXSkpIFtwYXJ0fj0ncm93J11bc2VsZWN0ZWRdIHsKICAgICAgei1pbmRleDogMTsKICAgIH0KCiAgICA6aG9zdCg6bm90KFtyZW9yZGVyaW5nXSkpIFtwYXJ0fj0ncm93J11bc2VsZWN0ZWRdIFtwYXJ0fj0nYm9keS1jZWxsJ106bm90KFtwYXJ0fj0nZGV0YWlscy1jZWxsJ10pIHsKICAgICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHZhcigtLV9sdW1vLWdyaWQtc2VsZWN0ZWQtcm93LWNvbG9yKSwgdmFyKC0tX2x1bW8tZ3JpZC1zZWxlY3RlZC1yb3ctY29sb3IpKTsKICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdDsKICAgIH0KCiAgICAvKiBDb3ZlciB0aGUgYm9yZGVyIG9mIGFuIHVuc2VsZWN0ZWQgcm93ICovCiAgICA6aG9zdCg6bm90KFt0aGVtZX49J25vLXJvdy1ib3JkZXJzJ10pKSBbcGFydH49J3JvdyddW3NlbGVjdGVkXSBbcGFydH49J2NlbGwnXTpub3QoW3BhcnR+PSdkZXRhaWxzLWNlbGwnXSkgewogICAgICBib3gtc2hhZG93OiAwIHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLXdpZHRoKSAwIDAgdmFyKC0tX2x1bW8tZ3JpZC1zZWxlY3RlZC1yb3ctY29sb3IpOwogICAgfQoKICAgIC8qIENvbXBhY3QgKi8KCiAgICA6aG9zdChbdGhlbWV+PSdjb21wYWN0J10pIFtwYXJ0PSdyb3cnXTpvbmx5LWNoaWxkIFtwYXJ0fj0naGVhZGVyLWNlbGwnXSB7CiAgICAgIG1pbi1oZWlnaHQ6IHZhcigtLWx1bW8tc2l6ZS1tKTsKICAgIH0KCiAgICA6aG9zdChbdGhlbWV+PSdjb21wYWN0J10pIFtwYXJ0fj0nY2VsbCddIHsKICAgICAgbWluLWhlaWdodDogdmFyKC0tbHVtby1zaXplLXMpOwogICAgfQoKICAgIDpob3N0KFt0aGVtZX49J2NvbXBhY3QnXSkgW3BhcnQ9J3JvdyddW2ZpcnN0XSBbcGFydH49J2NlbGwnXTpub3QoW3BhcnR+PSdkZXRhaWxzLWNlbGwnXSkgewogICAgICBtaW4taGVpZ2h0OiBjYWxjKHZhcigtLWx1bW8tc2l6ZS1zKSAtIHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLXdpZHRoKSk7CiAgICB9CgogICAgOmhvc3QoW3RoZW1lfj0nY29tcGFjdCddKSBbcGFydH49J2NlbGwnXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgIHBhZGRpbmc6IHZhcigtLWx1bW8tc3BhY2UteHMpIHZhcigtLWx1bW8tc3BhY2Utcyk7CiAgICB9CgogICAgLyogV3JhcCBjZWxsIGNvbnRlbnRzICovCgogICAgOmhvc3QoW3RoZW1lfj0nd3JhcC1jZWxsLWNvbnRlbnQnXSkgW3BhcnR+PSdjZWxsJ10gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgfQoKICAgIC8qIFJUTCBzcGVjaWZpYyBzdHlsZXMgKi8KCiAgICA6aG9zdChbZGlyPSdydGwnXSkgW3BhcnR+PSdyb3cnXVtkcmFnc3RhcnRdIFtwYXJ0fj0nY2VsbCddW2xhc3QtY29sdW1uXSB7CiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWx1bW8tYm9yZGVyLXJhZGl1cy1zKSAwIDAgdmFyKC0tbHVtby1ib3JkZXItcmFkaXVzLXMpOwogICAgfQoKICAgIDpob3N0KFtkaXI9J3J0bCddKSBbcGFydH49J3JvdyddW2RyYWdzdGFydF0gW3BhcnR+PSdjZWxsJ11bZmlyc3QtY29sdW1uXSB7CiAgICAgIGJvcmRlci1yYWRpdXM6IDAgdmFyKC0tbHVtby1ib3JkZXItcmFkaXVzLXMpIHZhcigtLWx1bW8tYm9yZGVyLXJhZGl1cy1zKSAwOwogICAgfQoKICAgIDpob3N0KFtkaXI9J3J0bCddW3RoZW1lfj0nY29sdW1uLWJvcmRlcnMnXSkgW3BhcnR+PSdjZWxsJ106bm90KFtsYXN0LWNvbHVtbl0pOm5vdChbcGFydH49J2RldGFpbHMtY2VsbCddKSB7CiAgICAgIGJvcmRlci1yaWdodDogbm9uZTsKICAgICAgYm9yZGVyLWxlZnQ6IHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1fbHVtby1ncmlkLXNlY29uZGFyeS1ib3JkZXItY29sb3IpOwogICAgfQoKICAgIDpob3N0KFtkaXI9J3J0bCddKSBbbGFzdC1mcm96ZW5dIHsKICAgICAgYm9yZGVyLXJpZ2h0OiBub25lOwogICAgICBib3JkZXItbGVmdDogdmFyKC0tX2x1bW8tZ3JpZC1ib3JkZXItd2lkdGgpIHNvbGlkIHRyYW5zcGFyZW50OwogICAgfQoKICAgIDpob3N0KFtkaXI9J3J0bCddW292ZXJmbG93fj0ncmlnaHQnXSkgW3BhcnR+PSdjZWxsJ11bbGFzdC1mcm96ZW5dOm5vdChbcGFydH49J2RldGFpbHMtY2VsbCddKSB7CiAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiB2YXIoLS1fbHVtby1ncmlkLWJvcmRlci1jb2xvcik7CiAgICB9CiAgYCx7bW9kdWxlSWQ6Imx1bW8tZ3JpZCJ9KSwkWHQoInZhYWRpbi1jaGVja2JveCIsR1h0YAogICAgOmhvc3QoLnZhYWRpbi1ncmlkLXNlbGVjdC1hbGwtY2hlY2tib3gpIHsKICAgICAgZm9udC1zaXplOiB2YXIoLS1sdW1vLWZvbnQtc2l6ZS1tKTsKICAgIH0KICBgLHttb2R1bGVJZDoidmFhZGluLWdyaWQtc2VsZWN0LWFsbC1jaGVja2JveC1sdW1vIn0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBDJHQ9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpob25lfGFkOyg/OiBVOyk/IENQVSkgT1MgKFxkKykvKSxBJHQ9QyR0JiZDJHRbMV0+PTgsayR0PUlyKHtiZWhhdmlvcnM6W2dvLERvXSxfcmF0aW86LjUsX3Njcm9sbGVyUGFkZGluZ1RvcDowLF9zY3JvbGxQb3NpdGlvbjowLF9waHlzaWNhbFNpemU6MCxfcGh5c2ljYWxBdmVyYWdlOjAsX3BoeXNpY2FsQXZlcmFnZUNvdW50OjAsX3BoeXNpY2FsVG9wOjAsX3ZpcnR1YWxDb3VudDowLF9lc3RTY3JvbGxIZWlnaHQ6MCxfc2Nyb2xsSGVpZ2h0OjAsX3ZpZXdwb3J0SGVpZ2h0OjAsX3ZpZXdwb3J0V2lkdGg6MCxfcGh5c2ljYWxJdGVtczpudWxsLF9waHlzaWNhbFNpemVzOm51bGwsX2ZpcnN0VmlzaWJsZUluZGV4VmFsOm51bGwsX2xhc3RWaXNpYmxlSW5kZXhWYWw6bnVsbCxfbWF4UGFnZXM6MixfZm9jdXNlZFZpcnR1YWxJbmRleDotMSxfdGVtcGxhdGVDb3N0OjAsZ2V0IF9waHlzaWNhbEJvdHRvbSgpe3JldHVybiB0aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9waHlzaWNhbFNpemV9LGdldCBfc2Nyb2xsQm90dG9tKCl7cmV0dXJuIHRoaXMuX3Njcm9sbFBvc2l0aW9uK3RoaXMuX3ZpZXdwb3J0SGVpZ2h0fSxnZXQgX3ZpcnR1YWxFbmQoKXtyZXR1cm4gdGhpcy5fdmlydHVhbFN0YXJ0K3RoaXMuX3BoeXNpY2FsQ291bnQtMX0sZ2V0IF9oaWRkZW5Db250ZW50U2l6ZSgpe3JldHVybiB0aGlzLl9waHlzaWNhbFNpemUtdGhpcy5fdmlld3BvcnRIZWlnaHR9LGdldCBfbWF4U2Nyb2xsVG9wKCl7cmV0dXJuIHRoaXMuX2VzdFNjcm9sbEhlaWdodC10aGlzLl92aWV3cG9ydEhlaWdodCt0aGlzLl9zY3JvbGxPZmZzZXR9LGdldCBfbWF4VmlydHVhbFN0YXJ0KCl7cmV0dXJuIE1hdGgubWF4KDAsdGhpcy5fdmlydHVhbENvdW50LXRoaXMuX3BoeXNpY2FsQ291bnQpfSxzZXQgX3ZpcnR1YWxTdGFydCh0KXt0PXRoaXMuX2NsYW1wKHQsMCx0aGlzLl9tYXhWaXJ0dWFsU3RhcnQpLHRoaXMuX3ZpcnR1YWxTdGFydFZhbD10fSxnZXQgX3ZpcnR1YWxTdGFydCgpe3JldHVybiB0aGlzLl92aXJ0dWFsU3RhcnRWYWx8fDB9LHNldCBfcGh5c2ljYWxTdGFydCh0KXsodCU9dGhpcy5fcGh5c2ljYWxDb3VudCk8MCYmKHQ9dGhpcy5fcGh5c2ljYWxDb3VudCt0KSx0aGlzLl9waHlzaWNhbFN0YXJ0VmFsPXR9LGdldCBfcGh5c2ljYWxTdGFydCgpe3JldHVybiB0aGlzLl9waHlzaWNhbFN0YXJ0VmFsfHwwfSxnZXQgX3BoeXNpY2FsRW5kKCl7cmV0dXJuKHRoaXMuX3BoeXNpY2FsU3RhcnQrdGhpcy5fcGh5c2ljYWxDb3VudC0xKSV0aGlzLl9waHlzaWNhbENvdW50fSxzZXQgX3BoeXNpY2FsQ291bnQodCl7dGhpcy5fcGh5c2ljYWxDb3VudFZhbD10fSxnZXQgX3BoeXNpY2FsQ291bnQoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxDb3VudFZhbHx8MH0sZ2V0IF9vcHRQaHlzaWNhbFNpemUoKXtyZXR1cm4gMD09PXRoaXMuX3ZpZXdwb3J0SGVpZ2h0PzEvMDp0aGlzLl92aWV3cG9ydEhlaWdodCp0aGlzLl9tYXhQYWdlc30sZ2V0IF9pc1Zpc2libGUoKXtyZXR1cm4gQm9vbGVhbih0aGlzLm9mZnNldFdpZHRofHx0aGlzLm9mZnNldEhlaWdodCl9LGdldCBmaXJzdFZpc2libGVJbmRleCgpe2xldCB0PXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsO2lmKG51bGw9PXQpe2xldCBlPXRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbE9mZnNldDt0PXRoaXMuX2l0ZXJhdGVJdGVtcygoZnVuY3Rpb24odCxuKXtpZihlKz10aGlzLl9waHlzaWNhbFNpemVzW3RdLGU+dGhpcy5fc2Nyb2xsUG9zaXRpb24pcmV0dXJuIG59KSl8fDAsdGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9dH1yZXR1cm4gdH0sZ2V0IGxhc3RWaXNpYmxlSW5kZXgoKXtsZXQgdD10aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsO2lmKG51bGw9PXQpe2xldCBlPXRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbE9mZnNldDt0aGlzLl9pdGVyYXRlSXRlbXMoKGZ1bmN0aW9uKG4saSl7ZTx0aGlzLl9zY3JvbGxCb3R0b20mJih0PWkpLGUrPXRoaXMuX3BoeXNpY2FsU2l6ZXNbbl19KSksdGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10fXJldHVybiB0fSxnZXQgX3Njcm9sbE9mZnNldCgpe3JldHVybiB0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3B9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLHRoaXMuX3JlbmRlcixfdCksdGhpcy5saXN0ZW4odGhpcywiaXJvbi1yZXNpemUiLCJfcmVzaXplSGFuZGxlciIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMudW5saXN0ZW4odGhpcywiaXJvbi1yZXNpemUiLCJfcmVzaXplSGFuZGxlciIpfSx1cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXM6ZnVuY3Rpb24oKXtjb25zdCB0PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpO3RoaXMuX3Njcm9sbGVyUGFkZGluZ1RvcD10aGlzLnNjcm9sbFRhcmdldD09PXRoaXM/MDpwYXJzZUludCh0WyJwYWRkaW5nLXRvcCJdLDEwKSx0aGlzLl9pc1JUTD1Cb29sZWFuKCJydGwiPT09dC5kaXJlY3Rpb24pLHRoaXMuX3ZpZXdwb3J0V2lkdGg9dGhpcy4kLml0ZW1zLm9mZnNldFdpZHRoLHRoaXMuX3ZpZXdwb3J0SGVpZ2h0PXRoaXMuX3Njcm9sbFRhcmdldEhlaWdodH0sX3Njcm9sbEhhbmRsZXI6ZnVuY3Rpb24oKXtjb25zdCB0PU1hdGgubWF4KDAsTWF0aC5taW4odGhpcy5fbWF4U2Nyb2xsVG9wLHRoaXMuX3Njcm9sbFRvcCkpO2xldCBlPXQtdGhpcy5fc2Nyb2xsUG9zaXRpb247Y29uc3Qgbj1lPj0wO2lmKHRoaXMuX3Njcm9sbFBvc2l0aW9uPXQsdGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbCx0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPW51bGwsTWF0aC5hYnMoZSk+dGhpcy5fcGh5c2ljYWxTaXplJiZ0aGlzLl9waHlzaWNhbFNpemU+MCl7ZS09dGhpcy5fc2Nyb2xsT2Zmc2V0O2NvbnN0IHQ9TWF0aC5yb3VuZChlL3RoaXMuX3BoeXNpY2FsQXZlcmFnZSk7dGhpcy5fdmlydHVhbFN0YXJ0PXRoaXMuX3ZpcnR1YWxTdGFydCt0LHRoaXMuX3BoeXNpY2FsU3RhcnQ9dGhpcy5fcGh5c2ljYWxTdGFydCt0LHRoaXMuX3BoeXNpY2FsVG9wPU1hdGguZmxvb3IodGhpcy5fdmlydHVhbFN0YXJ0KSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2UsdGhpcy5fdXBkYXRlKCl9ZWxzZSBpZih0aGlzLl9waHlzaWNhbENvdW50PjApe2NvbnN0e3BoeXNpY2FsVG9wOnQsaW5kZXhlczplfT10aGlzLl9nZXRSZXVzYWJsZXMobik7bj8odGhpcy5fcGh5c2ljYWxUb3A9dCx0aGlzLl92aXJ0dWFsU3RhcnQ9dGhpcy5fdmlydHVhbFN0YXJ0K2UubGVuZ3RoLHRoaXMuX3BoeXNpY2FsU3RhcnQ9dGhpcy5fcGh5c2ljYWxTdGFydCtlLmxlbmd0aCk6KHRoaXMuX3ZpcnR1YWxTdGFydD10aGlzLl92aXJ0dWFsU3RhcnQtZS5sZW5ndGgsdGhpcy5fcGh5c2ljYWxTdGFydD10aGlzLl9waHlzaWNhbFN0YXJ0LWUubGVuZ3RoKSx0aGlzLl91cGRhdGUoZSxuP251bGw6ZSksdGhpcy5fZGVib3VuY2UoIl9pbmNyZWFzZVBvb2xJZk5lZWRlZCIsdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQuYmluZCh0aGlzLDApLHZ0KX19LF9nZXRSZXVzYWJsZXM6ZnVuY3Rpb24odCl7bGV0IGUsbixpO2NvbnN0IHI9W10sbz10aGlzLl9oaWRkZW5Db250ZW50U2l6ZSp0aGlzLl9yYXRpbyxhPXRoaXMuX3ZpcnR1YWxTdGFydCxzPXRoaXMuX3ZpcnR1YWxFbmQsbD10aGlzLl9waHlzaWNhbENvdW50O2xldCBjPXRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbE9mZnNldDtjb25zdCB1PXRoaXMuX3Njcm9sbFRvcCxoPXRoaXMuX3Njcm9sbEJvdHRvbTtmb3IodD8oZT10aGlzLl9waHlzaWNhbFN0YXJ0LG49dS1jKTooZT10aGlzLl9waHlzaWNhbEVuZCxuPXRoaXMuX3BoeXNpY2FsQm90dG9tK3RoaXMuX3Njcm9sbE9mZnNldC1oKTtpPXRoaXMuX3BoeXNpY2FsU2l6ZXNbZV0sbi09aSwhKHIubGVuZ3RoPj1sfHxuPD1vKTspaWYodCl7aWYocytyLmxlbmd0aCsxPj10aGlzLl92aXJ0dWFsQ291bnQpYnJlYWs7aWYoYytpPj11LXRoaXMuX3Njcm9sbE9mZnNldClicmVhaztyLnB1c2goZSksYys9aSxlPShlKzEpJWx9ZWxzZXtpZihhLXIubGVuZ3RoPD0wKWJyZWFrO2lmKGMrdGhpcy5fcGh5c2ljYWxTaXplLWk8PWgpYnJlYWs7ci5wdXNoKGUpLGMtPWksZT0wPT09ZT9sLTE6ZS0xfXJldHVybntpbmRleGVzOnIscGh5c2ljYWxUb3A6Yy10aGlzLl9zY3JvbGxPZmZzZXR9fSxfdXBkYXRlOmZ1bmN0aW9uKHQsZSl7aWYoISh0JiYwPT09dC5sZW5ndGh8fDA9PT10aGlzLl9waHlzaWNhbENvdW50KSl7aWYodGhpcy5fYXNzaWduTW9kZWxzKHQpLHRoaXMuX3VwZGF0ZU1ldHJpY3ModCksZSlmb3IoO2UubGVuZ3RoOyl7Y29uc3QgdD1lLnBvcCgpO3RoaXMuX3BoeXNpY2FsVG9wLT10aGlzLl9waHlzaWNhbFNpemVzW3RdfXRoaXMuX3Bvc2l0aW9uSXRlbXMoKSx0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoKX19LF9pc0NsaWVudEZ1bGw6ZnVuY3Rpb24oKXtyZXR1cm4gMCE9dGhpcy5fc2Nyb2xsQm90dG9tJiZ0aGlzLl9waHlzaWNhbEJvdHRvbS0xPj10aGlzLl9zY3JvbGxCb3R0b20mJnRoaXMuX3BoeXNpY2FsVG9wPD10aGlzLl9zY3JvbGxQb3NpdGlvbn0sX2luY3JlYXNlUG9vbElmTmVlZGVkOmZ1bmN0aW9uKHQpe2NvbnN0IGU9dGhpcy5fY2xhbXAodGhpcy5fcGh5c2ljYWxDb3VudCt0LDMsdGhpcy5fdmlydHVhbENvdW50LXRoaXMuX3ZpcnR1YWxTdGFydCktdGhpcy5fcGh5c2ljYWxDb3VudDtsZXQgbj1NYXRoLnJvdW5kKC41KnRoaXMuX3BoeXNpY2FsQ291bnQpO2lmKCEoZTwwKSl7aWYoZT4wKXtjb25zdCB0PXdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKTtbXS5wdXNoLmFwcGx5KHRoaXMuX3BoeXNpY2FsSXRlbXMsdGhpcy5fY3JlYXRlUG9vbChlKSk7Zm9yKGxldCB0PTA7dDxlO3QrKyl0aGlzLl9waHlzaWNhbFNpemVzLnB1c2goMCk7dGhpcy5fcGh5c2ljYWxDb3VudD10aGlzLl9waHlzaWNhbENvdW50K2UsdGhpcy5fcGh5c2ljYWxTdGFydD50aGlzLl9waHlzaWNhbEVuZCYmdGhpcy5faXNJbmRleFJlbmRlcmVkKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgpJiZ0aGlzLl9nZXRQaHlzaWNhbEluZGV4KHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgpPHRoaXMuX3BoeXNpY2FsRW5kJiYodGhpcy5fcGh5c2ljYWxTdGFydD10aGlzLl9waHlzaWNhbFN0YXJ0K2UpLHRoaXMuX3VwZGF0ZSgpLHRoaXMuX3RlbXBsYXRlQ29zdD0od2luZG93LnBlcmZvcm1hbmNlLm5vdygpLXQpL2Usbj1NYXRoLnJvdW5kKC41KnRoaXMuX3BoeXNpY2FsQ291bnQpfXRoaXMuX3ZpcnR1YWxFbmQ+PXRoaXMuX3ZpcnR1YWxDb3VudC0xfHwwPT09bnx8KHRoaXMuX2lzQ2xpZW50RnVsbCgpP3RoaXMuX3BoeXNpY2FsU2l6ZTx0aGlzLl9vcHRQaHlzaWNhbFNpemUmJnRoaXMuX2RlYm91bmNlKCJfaW5jcmVhc2VQb29sSWZOZWVkZWQiLHRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkLmJpbmQodGhpcyx0aGlzLl9jbGFtcChNYXRoLnJvdW5kKDUwL3RoaXMuX3RlbXBsYXRlQ29zdCksMSxuKSkseXQpOnRoaXMuX2RlYm91bmNlKCJfaW5jcmVhc2VQb29sSWZOZWVkZWQiLHRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkLmJpbmQodGhpcyxuKSx2dCkpfX0sX3JlbmRlcjpmdW5jdGlvbigpe2lmKHRoaXMuaXNBdHRhY2hlZCYmdGhpcy5faXNWaXNpYmxlKWlmKDAhPT10aGlzLl9waHlzaWNhbENvdW50KXtjb25zdHtwaHlzaWNhbFRvcDp0LGluZGV4ZXM6ZX09dGhpcy5fZ2V0UmV1c2FibGVzKCEwKTt0aGlzLl9waHlzaWNhbFRvcD10LHRoaXMuX3ZpcnR1YWxTdGFydD10aGlzLl92aXJ0dWFsU3RhcnQrZS5sZW5ndGgsdGhpcy5fcGh5c2ljYWxTdGFydD10aGlzLl9waHlzaWNhbFN0YXJ0K2UubGVuZ3RoLHRoaXMuX3VwZGF0ZShlKSx0aGlzLl91cGRhdGUoKSx0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgwKX1lbHNlIHRoaXMuX3ZpcnR1YWxDb3VudD4wJiYodGhpcy51cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXMoKSx0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgzKSl9LF9pdGVtc0NoYW5nZWQ6ZnVuY3Rpb24odCl7Iml0ZW1zIj09PXQucGF0aCYmKHRoaXMuX3ZpcnR1YWxTdGFydD0wLHRoaXMuX3BoeXNpY2FsVG9wPTAsdGhpcy5fdmlydHVhbENvdW50PXRoaXMuaXRlbXM/dGhpcy5pdGVtcy5sZW5ndGg6MCx0aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5PXt9LHRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPW51bGwsdGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1udWxsLHRoaXMuX3BoeXNpY2FsQ291bnQ9dGhpcy5fcGh5c2ljYWxDb3VudHx8MCx0aGlzLl9waHlzaWNhbEl0ZW1zPXRoaXMuX3BoeXNpY2FsSXRlbXN8fFtdLHRoaXMuX3BoeXNpY2FsU2l6ZXM9dGhpcy5fcGh5c2ljYWxTaXplc3x8W10sdGhpcy5fcGh5c2ljYWxTdGFydD0wLHRoaXMuX3Njcm9sbFRvcD50aGlzLl9zY3JvbGxPZmZzZXQmJnRoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24oMCksdGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLHRoaXMuX3JlbmRlcixfdCkpfSxfaXRlcmF0ZUl0ZW1zOmZ1bmN0aW9uKHQsZSl7bGV0IG4saSxyLG87aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgmJmUpe2ZvcihvPTA7bzxlLmxlbmd0aDtvKyspaWYobj1lW29dLGk9dGhpcy5fY29tcHV0ZVZpZHgobiksbnVsbCE9KHI9dC5jYWxsKHRoaXMsbixpKSkpcmV0dXJuIHJ9ZWxzZXtmb3Iobj10aGlzLl9waHlzaWNhbFN0YXJ0LGk9dGhpcy5fdmlydHVhbFN0YXJ0O248dGhpcy5fcGh5c2ljYWxDb3VudDtuKyssaSsrKWlmKG51bGwhPShyPXQuY2FsbCh0aGlzLG4saSkpKXJldHVybiByO2ZvcihuPTA7bjx0aGlzLl9waHlzaWNhbFN0YXJ0O24rKyxpKyspaWYobnVsbCE9KHI9dC5jYWxsKHRoaXMsbixpKSkpcmV0dXJuIHJ9fSxfY29tcHV0ZVZpZHg6ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PXRoaXMuX3BoeXNpY2FsU3RhcnQ/dGhpcy5fdmlydHVhbFN0YXJ0Kyh0LXRoaXMuX3BoeXNpY2FsU3RhcnQpOnRoaXMuX3ZpcnR1YWxTdGFydCsodGhpcy5fcGh5c2ljYWxDb3VudC10aGlzLl9waHlzaWNhbFN0YXJ0KSt0fSxfdXBkYXRlTWV0cmljczpmdW5jdGlvbih0KXtpZighdGhpcy5faXNWaXNpYmxlKXJldHVybjtEaSgpO2xldCBlPTAsbj0wO2NvbnN0IGk9dGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQscj10aGlzLl9waHlzaWNhbEF2ZXJhZ2U7dGhpcy5faXRlcmF0ZUl0ZW1zKChmdW5jdGlvbih0KXtuKz10aGlzLl9waHlzaWNhbFNpemVzW3RdLHRoaXMuX3BoeXNpY2FsU2l6ZXNbdF09dGhpcy5fcGh5c2ljYWxJdGVtc1t0XS5vZmZzZXRIZWlnaHQsZSs9dGhpcy5fcGh5c2ljYWxTaXplc1t0XSx0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCs9dGhpcy5fcGh5c2ljYWxTaXplc1t0XT8xOjB9KSx0KSx0aGlzLl9waHlzaWNhbFNpemU9dGhpcy5fcGh5c2ljYWxTaXplK2Utbix0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCE9PWkmJih0aGlzLl9waHlzaWNhbEF2ZXJhZ2U9TWF0aC5yb3VuZCgocippK2UpL3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50KSl9LF9wb3NpdGlvbkl0ZW1zOmZ1bmN0aW9uKCl7dGhpcy5fYWRqdXN0U2Nyb2xsUG9zaXRpb24oKTtsZXQgdD10aGlzLl9waHlzaWNhbFRvcDt0aGlzLl9pdGVyYXRlSXRlbXMoKGZ1bmN0aW9uKGUpe3RoaXMudHJhbnNsYXRlM2QoMCx0KyJweCIsMCx0aGlzLl9waHlzaWNhbEl0ZW1zW2VdKSx0Kz10aGlzLl9waHlzaWNhbFNpemVzW2VdfSkpfSxfYWRqdXN0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXtjb25zdCB0PTA9PT10aGlzLl92aXJ0dWFsU3RhcnQ/dGhpcy5fcGh5c2ljYWxUb3A6TWF0aC5taW4odGhpcy5fc2Nyb2xsUG9zaXRpb24rdGhpcy5fcGh5c2ljYWxUb3AsMCk7aWYoMCE9PXQpe3RoaXMuX3BoeXNpY2FsVG9wPXRoaXMuX3BoeXNpY2FsVG9wLXQ7Y29uc3QgZT10aGlzLl9zY3JvbGxUb3A7IUEkdCYmZT4wJiZ0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKGUtdCl9fSxfcmVzZXRTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbih0KXt0aGlzLnNjcm9sbFRhcmdldCYmdD49MCYmKHRoaXMuX3Njcm9sbFRvcD10LHRoaXMuX3Njcm9sbFBvc2l0aW9uPXRoaXMuX3Njcm9sbFRvcCl9LF91cGRhdGVTY3JvbGxlclNpemU6ZnVuY3Rpb24odCl7dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0PXRoaXMuX3BoeXNpY2FsQm90dG9tK01hdGgubWF4KHRoaXMuX3ZpcnR1YWxDb3VudC10aGlzLl9waHlzaWNhbENvdW50LXRoaXMuX3ZpcnR1YWxTdGFydCwwKSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2UsKCh0PSh0PXR8fDA9PT10aGlzLl9zY3JvbGxIZWlnaHQpfHx0aGlzLl9zY3JvbGxQb3NpdGlvbj49dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3BoeXNpY2FsU2l6ZSl8fE1hdGguYWJzKHRoaXMuX2VzdFNjcm9sbEhlaWdodC10aGlzLl9zY3JvbGxIZWlnaHQpPj10aGlzLl92aWV3cG9ydEhlaWdodCkmJih0aGlzLiQuaXRlbXMuc3R5bGUuaGVpZ2h0PXRoaXMuX2VzdFNjcm9sbEhlaWdodCsicHgiLHRoaXMuX3Njcm9sbEhlaWdodD10aGlzLl9lc3RTY3JvbGxIZWlnaHQpfSxzY3JvbGxUb0luZGV4OmZ1bmN0aW9uKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdHx8dDwwfHx0PnRoaXMuaXRlbXMubGVuZ3RoLTEpcmV0dXJuO2lmKERpKCksMD09PXRoaXMuX3BoeXNpY2FsQ291bnQpcmV0dXJuO3Q9dGhpcy5fY2xhbXAodCwwLHRoaXMuX3ZpcnR1YWxDb3VudC0xKSwoIXRoaXMuX2lzSW5kZXhSZW5kZXJlZCh0KXx8dD49dGhpcy5fbWF4VmlydHVhbFN0YXJ0KSYmKHRoaXMuX3ZpcnR1YWxTdGFydD10LTEpLHRoaXMuX2Fzc2lnbk1vZGVscygpLHRoaXMuX3VwZGF0ZU1ldHJpY3MoKSx0aGlzLl9waHlzaWNhbFRvcD1NYXRoLmZsb29yKHRoaXMuX3ZpcnR1YWxTdGFydCkqdGhpcy5fcGh5c2ljYWxBdmVyYWdlO2xldCBlPXRoaXMuX3BoeXNpY2FsU3RhcnQsbj10aGlzLl92aXJ0dWFsU3RhcnQsaT0wO2NvbnN0IHI9dGhpcy5faGlkZGVuQ29udGVudFNpemU7Zm9yKDtuPHQmJmk8PXI7KWkrPXRoaXMuX3BoeXNpY2FsU2l6ZXNbZV0sZT0oZSsxKSV0aGlzLl9waHlzaWNhbENvdW50LG4rKzt0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoITApLHRoaXMuX3Bvc2l0aW9uSXRlbXMoKSx0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKHRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbE9mZnNldCtpKSx0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgwKSx0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsLHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9bnVsbH0sX3Jlc2V0QXZlcmFnZTpmdW5jdGlvbigpe3RoaXMuX3BoeXNpY2FsQXZlcmFnZT0wLHRoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50PTB9LF9yZXNpemVIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLChmdW5jdGlvbigpe3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPW51bGwsdGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1udWxsLHRoaXMudXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzKCksdGhpcy5faXNWaXNpYmxlPyh0aGlzLnRvZ2dsZVNjcm9sbExpc3RlbmVyKCEwKSx0aGlzLl9yZXNldEF2ZXJhZ2UoKSx0aGlzLl9yZW5kZXIoKSk6dGhpcy50b2dnbGVTY3JvbGxMaXN0ZW5lcighMSl9KSxfdCl9LF9pc0luZGV4UmVuZGVyZWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PXRoaXMuX3ZpcnR1YWxTdGFydCYmdDw9dGhpcy5fdmlydHVhbEVuZH0sX2dldFBoeXNpY2FsSW5kZXg6ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMuX3BoeXNpY2FsU3RhcnQrKHQtdGhpcy5fdmlydHVhbFN0YXJ0KSkldGhpcy5fcGh5c2ljYWxDb3VudH0sX2NsYW1wOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTWF0aC5taW4obixNYXRoLm1heChlLHQpKX0sX2RlYm91bmNlOmZ1bmN0aW9uKHQsZSxuKXt0aGlzLl9kZWJvdW5jZXJzPXRoaXMuX2RlYm91bmNlcnN8fHt9LHRoaXMuX2RlYm91bmNlcnNbdF09VG4uZGVib3VuY2UodGhpcy5fZGVib3VuY2Vyc1t0XSxuLGUuYmluZCh0aGlzKSksQW4odGhpcy5fZGVib3VuY2Vyc1t0XSl9fSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovCmNsYXNzIEwkdCBleHRlbmRzIGskdHtzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKXtyZXR1cm57c2l6ZTp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxfdmlkeE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MH19fXN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCl7cmV0dXJuWyJfZWZmZWN0aXZlU2l6ZUNoYW5nZWQoX2VmZmVjdGl2ZVNpemUpIl19Y29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLHRoaXMuX3Njcm9sbEhhbmRsZXIoKX1fdXBkYXRlU2Nyb2xsZXJJdGVtKCl7fV9hZnRlclNjcm9sbCgpe31fZ2V0Um93VGFyZ2V0KCl7fV9jcmVhdGVTY3JvbGxlclJvd3MoKXt9X2NhblBvcHVsYXRlKCl7fXNjcm9sbFRvSW5kZXgodCl7dGhpcy5fd2FyblByaXZhdGVBUElBY2Nlc3MoInNjcm9sbFRvSW5kZXgiKSx0aGlzLl9zY3JvbGxpbmdUb0luZGV4PSEwLHQ9TWF0aC5taW4oTWF0aC5tYXgodCwwKSx0aGlzLl9lZmZlY3RpdmVTaXplLTEpLHRoaXMuJC50YWJsZS5zY3JvbGxUb3A9dC90aGlzLl9lZmZlY3RpdmVTaXplKih0aGlzLiQudGFibGUuc2Nyb2xsSGVpZ2h0LXRoaXMuJC50YWJsZS5vZmZzZXRIZWlnaHQpLHRoaXMuX3Njcm9sbEhhbmRsZXIoKSx0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSSgoKCk9PnRoaXMuX21heFNjcm9sbFRvcCkpJiZ0aGlzLl92aXJ0dWFsQ291bnQ8dGhpcy5fZWZmZWN0aXZlU2l6ZSYmdGhpcy5fYWRqdXN0VmlydHVhbEluZGV4T2Zmc2V0KDFlNiksdGhpcy5fYWNjZXNzSXJvbkxpc3RBUEkoKCgpPT5zdXBlci5zY3JvbGxUb0luZGV4KHQtdGhpcy5fdmlkeE9mZnNldCkpKSx0aGlzLl9zY3JvbGxIYW5kbGVyKCk7Y29uc3QgZT1BcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZmlsdGVyKChlPT5lLmluZGV4PT09dCkpWzBdO2lmKGUpe2NvbnN0IHQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AtdGhpcy4kLmhlYWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b207TWF0aC5hYnModCk+MSYmKHRoaXMuJC50YWJsZS5zY3JvbGxUb3ArPXQsdGhpcy5fc2Nyb2xsSGFuZGxlcigpKX10aGlzLl9zY3JvbGxpbmdUb0luZGV4PSExfV9lZmZlY3RpdmVTaXplQ2hhbmdlZCh0KXtsZXQgZSxuPTA7dGhpcy5faXRlcmF0ZUl0ZW1zKCgodCxpKT0+e2lmKGk9PT10aGlzLl9maXJzdFZpc2libGVJbmRleCl7Y29uc3QgaT10aGlzLl9waHlzaWNhbEl0ZW1zW3RdO2U9aS5pbmRleCxuPWkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wfX0pKSx0aGlzLml0ZW1zJiZ0PHRoaXMuaXRlbXMubGVuZ3RoJiYodGhpcy5fc2Nyb2xsVG9wPTApLEFycmF5LmlzQXJyYXkodGhpcy5pdGVtcyl8fCh0aGlzLml0ZW1zPXtsZW5ndGg6TWF0aC5taW4odCwxZTUpfSksdGhpcy5fYWNjZXNzSXJvbkxpc3RBUEkoKCgpPT5zdXBlci5faXRlbXNDaGFuZ2VkKHtwYXRoOiJpdGVtcyJ9KSkpLHRoaXMuX3ZpcnR1YWxDb3VudD1NYXRoLm1pbih0aGlzLml0ZW1zLmxlbmd0aCx0KXx8MCwwPT09dGhpcy5fc2Nyb2xsVG9wJiYodGhpcy5fYWNjZXNzSXJvbkxpc3RBUEkoKCgpPT50aGlzLl9zY3JvbGxUb0luZGV4KE1hdGgubWluKHQtMSxlKSkpKSx0aGlzLl9pdGVyYXRlSXRlbXMoKHQ9Pntjb25zdCBpPXRoaXMuX3BoeXNpY2FsSXRlbXNbdF07aWYoaS5pbmRleD09PWUmJih0aGlzLiQudGFibGUuc2Nyb2xsVG9wKz1NYXRoLnJvdW5kKGkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLW4pKSxpLmluZGV4PT09dGhpcy5fZm9jdXNlZEl0ZW1JbmRleCYmdGhpcy5faXRlbXNGb2N1c2FibGUmJnRoaXMuJC5pdGVtcy5jb250YWlucyh0aGlzLnNoYWRvd1Jvb3QuYWN0aXZlRWxlbWVudCkpe2NvbnN0IHQ9QXJyYXkuZnJvbSh0aGlzLl9pdGVtc0ZvY3VzYWJsZS5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKS5pbmRleE9mKHRoaXMuX2l0ZW1zRm9jdXNhYmxlKTtpLmNoaWxkcmVuW3RdLmZvY3VzKCl9fSkpKSx0aGlzLl9hc3NpZ25Nb2RlbHMoKSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT50aGlzLl91cGRhdGUoKSkpLHRoaXMuX191cGRhdGVGb290ZXJQb3NpdGlvbmluZygpfV9wb3NpdGlvbkl0ZW1zKCl7bGV0IHQ7dGhpcy5fYWRqdXN0U2Nyb2xsUG9zaXRpb24oKSxpc05hTih0aGlzLl9waHlzaWNhbFRvcCkmJih0PSEwLHRoaXMuX3BoeXNpY2FsVG9wPTApO2xldCBlPXRoaXMuX3BoeXNpY2FsVG9wO3RoaXMuX2l0ZXJhdGVJdGVtcygodD0+e3RoaXMuX3BoeXNpY2FsSXRlbXNbdF0uc3R5bGUudHJhbnNmb3JtPWB0cmFuc2xhdGVZKCR7ZX1weClgLGUrPXRoaXMuX3BoeXNpY2FsU2l6ZXNbdF19KSksdCYmdGhpcy5fc2Nyb2xsVG9JbmRleCgwKX1faW5jcmVhc2VQb29sSWZOZWVkZWQodCl7MD09PXQmJnRoaXMuX3Njcm9sbGluZ1RvSW5kZXh8fCF0aGlzLl9jYW5Qb3B1bGF0ZSgpfHwhdGhpcy5fZWZmZWN0aXZlU2l6ZXx8KHRoaXMuX2luaXRpYWxQb29sQ3JlYXRlZD90aGlzLl9vcHRQaHlzaWNhbFNpemUhPT0xLzAmJih0aGlzLl9kZWJvdW5jZUluY3JlYXNlUG9vbD1Ubi5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZUluY3JlYXNlUG9vbCxfdCwoKCk9Pnt0aGlzLl91cGRhdGVNZXRyaWNzKCk7bGV0IHQ9TWF0aC5jZWlsKCh0aGlzLl9vcHRQaHlzaWNhbFNpemUtdGhpcy5fcGh5c2ljYWxTaXplKS90aGlzLl9waHlzaWNhbEF2ZXJhZ2UpO3RoaXMuX3BoeXNpY2FsQ291bnQrdD50aGlzLl9lZmZlY3RpdmVTaXplJiYodD1NYXRoLm1heCgwLHRoaXMuX2VmZmVjdGl2ZVNpemUtdGhpcy5fcGh5c2ljYWxDb3VudCkpLHRoaXMuX3BoeXNpY2FsU2l6ZSYmdD4wJiZ0aGlzLl9vcHRQaHlzaWNhbFNpemUhPT0xLzAmJihzdXBlci5faW5jcmVhc2VQb29sSWZOZWVkZWQodCksdGhpcy5fX3Jlb3JkZXJDaGlsZE5vZGVzKCkpfSkpKToodGhpcy5faW5pdGlhbFBvb2xDcmVhdGVkPSEwLHN1cGVyLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgyNSkpKX1fX3Jlb3JkZXJDaGlsZE5vZGVzKCl7Y29uc3QgdD1BcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZE5vZGVzKTt0LnJlZHVjZSgoKHQsZSxuLGkpPT57aWYoMD09PW58fGlbbi0xXS5pbmRleD09PWUuaW5kZXgtMSlyZXR1cm4gdH0pLCEwKXx8dC5zb3J0KCgodCxlKT0+dC5pbmRleC1lLmluZGV4KSkuZm9yRWFjaCgodD0+dGhpcy4kLml0ZW1zLmFwcGVuZENoaWxkKHQpKSl9X2NyZWF0ZVBvb2wodCl7Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksbj10aGlzLl9jcmVhdGVTY3JvbGxlclJvd3ModCk7bi5mb3JFYWNoKCh0PT5lLmFwcGVuZENoaWxkKHQpKSksdGhpcy5fZ2V0Um93VGFyZ2V0KCkuYXBwZW5kQ2hpbGQoZSk7Y29uc3QgaT10aGlzLnF1ZXJ5U2VsZWN0b3IoIltzbG90XSIpO2lmKGkpe2NvbnN0IHQ9aS5nZXRBdHRyaWJ1dGUoInNsb3QiKTtpLnNldEF0dHJpYnV0ZSgic2xvdCIsImZvby1iYXIiKSxpLnNldEF0dHJpYnV0ZSgic2xvdCIsdCl9cmV0dXJuIExpKHRoaXMsKCgpPT50aGlzLm5vdGlmeVJlc2l6ZSgpKSksbn1fYXNzaWduTW9kZWxzKHQpe3RoaXMuX2l0ZXJhdGVJdGVtcygoKHQsZSk9Pntjb25zdCBuPXRoaXMuX3BoeXNpY2FsSXRlbXNbdF07dGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJoaWRkZW4iLGU+PXRoaXMuX2VmZmVjdGl2ZVNpemUsbiksdGhpcy5fdXBkYXRlU2Nyb2xsZXJJdGVtKG4sZSsodGhpcy5fdmlkeE9mZnNldHx8MCkpfSksdCl9X3Njcm9sbEhhbmRsZXIoKXtjb25zdCB0PXRoaXMuJC50YWJsZS5zY3JvbGxUb3AtdGhpcy5fc2Nyb2xsUG9zaXRpb247dGhpcy5fYWNjZXNzSXJvbkxpc3RBUEkoc3VwZXIuX3Njcm9sbEhhbmRsZXIpO2NvbnN0IGU9dGhpcy5fdmlkeE9mZnNldDt0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSSgoKCk9PnRoaXMuX21heFNjcm9sbFRvcCkpJiZ0aGlzLl92aXJ0dWFsQ291bnQ8dGhpcy5fZWZmZWN0aXZlU2l6ZT90aGlzLl9hZGp1c3RWaXJ0dWFsSW5kZXhPZmZzZXQodCk6dGhpcy5fdmlkeE9mZnNldD0wLHRoaXMuX3ZpZHhPZmZzZXQhPT1lJiZ0aGlzLl91cGRhdGUoKSx0aGlzLl9hZnRlclNjcm9sbCgpfV9hZGp1c3RWaXJ0dWFsSW5kZXhPZmZzZXQodCl7aWYoTWF0aC5hYnModCk+MWU0KXtpZih0aGlzLl9ub1NjYWxlKXJldHVybiB2b2lkKHRoaXMuX25vU2NhbGU9ITEpO2NvbnN0IHQ9dGhpcy4kLnRhYmxlLnNjcm9sbFRvcC8odGhpcy4kLnRhYmxlLnNjcm9sbEhlaWdodC10aGlzLiQudGFibGUub2Zmc2V0SGVpZ2h0KTt0aGlzLl92aWR4T2Zmc2V0PU1hdGgucm91bmQodCp0aGlzLl9lZmZlY3RpdmVTaXplLXQqdGhpcy5fdmlydHVhbENvdW50KX1lbHNle2NvbnN0IHQ9dGhpcy5fdmlkeE9mZnNldHx8MCxlPTFlMyxuPTEwMDswPT09dGhpcy5fc2Nyb2xsVG9wPyh0aGlzLl92aWR4T2Zmc2V0PTAsdCE9PXRoaXMuX3ZpZHhPZmZzZXQmJnN1cGVyLnNjcm9sbFRvSW5kZXgoMCkpOnRoaXMuZmlyc3RWaXNpYmxlSW5kZXg8ZSYmdGhpcy5fdmlkeE9mZnNldD4wJiYodGhpcy5fdmlkeE9mZnNldC09TWF0aC5taW4odGhpcy5fdmlkeE9mZnNldCxuKSx0IT09dGhpcy5fdmlkeE9mZnNldCYmc3VwZXIuc2Nyb2xsVG9JbmRleCh0aGlzLmZpcnN0VmlzaWJsZUluZGV4Kyh0LXRoaXMuX3ZpZHhPZmZzZXQpKSx0aGlzLl9ub1NjYWxlPSEwKTtjb25zdCBpPXRoaXMuX2VmZmVjdGl2ZVNpemUtdGhpcy5fdmlydHVhbENvdW50O3RoaXMuX3Njcm9sbFRvcD49dGhpcy5fbWF4U2Nyb2xsVG9wJiZ0aGlzLl9tYXhTY3JvbGxUb3A+MD8odGhpcy5fdmlkeE9mZnNldD1pLHQhPT10aGlzLl92aWR4T2Zmc2V0JiZzdXBlci5zY3JvbGxUb0luZGV4KHRoaXMuX3ZpcnR1YWxDb3VudCkpOnRoaXMuZmlyc3RWaXNpYmxlSW5kZXg+dGhpcy5fdmlydHVhbENvdW50LWUmJnRoaXMuX3ZpZHhPZmZzZXQ8aSYmKHRoaXMuX3ZpZHhPZmZzZXQrPU1hdGgubWluKGktdGhpcy5fdmlkeE9mZnNldCxuKSx0IT09dGhpcy5fdmlkeE9mZnNldCYmc3VwZXIuc2Nyb2xsVG9JbmRleCh0aGlzLmZpcnN0VmlzaWJsZUluZGV4LSh0aGlzLl92aWR4T2Zmc2V0LXQpKSx0aGlzLl9ub1NjYWxlPSEwKX19X2FjY2Vzc0lyb25MaXN0QVBJKHQpe3RoaXMuX3dhcm5Qcml2YXRlQVBJQWNjZXNzQXN5bmNFbmFibGVkPSExO2NvbnN0IGU9dC5hcHBseSh0aGlzKTtyZXR1cm4gdGhpcy5fZGVib3VuY2VyV2FyblByaXZhdGVBUElBY2Nlc3M9VG4uZGVib3VuY2UodGhpcy5fZGVib3VuY2VyV2FyblByaXZhdGVBUElBY2Nlc3MsX3QsKCgpPT50aGlzLl93YXJuUHJpdmF0ZUFQSUFjY2Vzc0FzeW5jRW5hYmxlZD0hMCkpLGV9X2RlYm91bmNlUmVuZGVyKHQsZSl7c3VwZXIuX2RlYm91bmNlUmVuZGVyKCgoKT0+dGhpcy5fYWNjZXNzSXJvbkxpc3RBUEkodCkpLGUpfV93YXJuUHJpdmF0ZUFQSUFjY2Vzcyh0KXt0aGlzLl93YXJuUHJpdmF0ZUFQSUFjY2Vzc0FzeW5jRW5hYmxlZCYmY29uc29sZS53YXJuKGBBY2Nlc3NpbmcgcHJpdmF0ZSBBUEkgKCR7dH0pIWApfV9yZW5kZXIoKXt0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSShzdXBlci5fcmVuZGVyKX1faXRlbXNDaGFuZ2VkKCl7fWdldCBfZmlyc3RWaXNpYmxlSW5kZXgoKXtyZXR1cm4gdGhpcy5fYWNjZXNzSXJvbkxpc3RBUEkoKCgpPT5zdXBlci5maXJzdFZpc2libGVJbmRleCkpfWdldCBfbGFzdFZpc2libGVJbmRleCgpe3JldHVybiB0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSSgoKCk9PnN1cGVyLmxhc3RWaXNpYmxlSW5kZXgpKX1fc2Nyb2xsVG9JbmRleCh0KXt0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSSgoKCk9PnRoaXMuc2Nyb2xsVG9JbmRleCh0KSkpfWdldCBmaXJzdFZpc2libGVJbmRleCgpe3JldHVybiB0aGlzLl93YXJuUHJpdmF0ZUFQSUFjY2VzcygiZmlyc3RWaXNpYmxlSW5kZXgiKSxzdXBlci5maXJzdFZpc2libGVJbmRleH1zZXQgZmlyc3RWaXNpYmxlSW5kZXgodCl7dGhpcy5fd2FyblByaXZhdGVBUElBY2Nlc3MoImZpcnN0VmlzaWJsZUluZGV4Iiksc3VwZXIuZmlyc3RWaXNpYmxlSW5kZXg9dH1nZXQgbGFzdFZpc2libGVJbmRleCgpe3JldHVybiB0aGlzLl93YXJuUHJpdmF0ZUFQSUFjY2VzcygibGFzdFZpc2libGVJbmRleCIpLHN1cGVyLmxhc3RWaXNpYmxlSW5kZXh9c2V0IGxhc3RWaXNpYmxlSW5kZXgodCl7dGhpcy5fd2FyblByaXZhdGVBUElBY2Nlc3MoImxhc3RWaXNpYmxlSW5kZXgiKSxzdXBlci5sYXN0VmlzaWJsZUluZGV4PXR9dXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzKCl7dGhpcy5fd2FyblByaXZhdGVBUElBY2Nlc3MoInVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcyIpLHN1cGVyLnVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9X3Jlc2l6ZUhhbmRsZXIoKXtzdXBlci5fcmVzaXplSGFuZGxlcigpLERpKCl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqL2NvbnN0IFAkdD10PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBvYnNlcnZlcnMoKXtyZXR1cm5bIl9hMTF5VXBkYXRlR3JpZFNpemUoc2l6ZSwgX2NvbHVtblRyZWUsIF9jb2x1bW5UcmVlLiopIl19X2ExMXlHZXRIZWFkZXJSb3dDb3VudCh0KXtyZXR1cm4gdC5maWx0ZXIoKHQ9PnQuc29tZSgodD0+dC5faGVhZGVyVGVtcGxhdGV8fHQuaGVhZGVyUmVuZGVyZXJ8fHQucGF0aHx8dC5oZWFkZXIpKSkpLmxlbmd0aH1fYTExeUdldEZvb3RlclJvd0NvdW50KHQpe3JldHVybiB0LmZpbHRlcigodD0+dC5zb21lKCh0PT50Ll9oZWFkZXJUZW1wbGF0ZXx8dC5oZWFkZXJSZW5kZXJlcikpKSkubGVuZ3RofV9hMTF5VXBkYXRlR3JpZFNpemUodCxlKXtpZih2b2lkIDA9PT10fHx2b2lkIDA9PT1lKXJldHVybjtjb25zdCBuPWVbZS5sZW5ndGgtMV07dGhpcy4kLnRhYmxlLnNldEF0dHJpYnV0ZSgiYXJpYS1yb3djb3VudCIsdCt0aGlzLl9hMTF5R2V0SGVhZGVyUm93Q291bnQoZSkrdGhpcy5fYTExeUdldEZvb3RlclJvd0NvdW50KGUpKSx0aGlzLiQudGFibGUuc2V0QXR0cmlidXRlKCJhcmlhLWNvbGNvdW50IixuJiZuLmxlbmd0aHx8MCksdGhpcy5fYTExeVVwZGF0ZUhlYWRlclJvd3MoKSx0aGlzLl9hMTF5VXBkYXRlRm9vdGVyUm93cygpfV9hMTF5VXBkYXRlSGVhZGVyUm93cygpe0FycmF5LmZyb20odGhpcy4kLmhlYWRlci5jaGlsZHJlbikuZm9yRWFjaCgoKHQsZSk9PnQuc2V0QXR0cmlidXRlKCJhcmlhLXJvd2luZGV4IixlKzEpKSl9X2ExMXlVcGRhdGVGb290ZXJSb3dzKCl7QXJyYXkuZnJvbSh0aGlzLiQuZm9vdGVyLmNoaWxkcmVuKS5mb3JFYWNoKCgodCxlKT0+dC5zZXRBdHRyaWJ1dGUoImFyaWEtcm93aW5kZXgiLHRoaXMuX2ExMXlHZXRIZWFkZXJSb3dDb3VudCh0aGlzLl9jb2x1bW5UcmVlKSt0aGlzLnNpemUrZSsxKSkpfV9hMTF5VXBkYXRlUm93Um93aW5kZXgodCxlKXt0LnNldEF0dHJpYnV0ZSgiYXJpYS1yb3dpbmRleCIsZSt0aGlzLl9hMTF5R2V0SGVhZGVyUm93Q291bnQodGhpcy5fY29sdW1uVHJlZSkrMSl9X2ExMXlVcGRhdGVSb3dTZWxlY3RlZCh0LGUpe3Quc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIixCb29sZWFuKGUpKSxBcnJheS5mcm9tKHQuY2hpbGRyZW4pLmZvckVhY2goKHQ9PnQuc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIixCb29sZWFuKGUpKSkpfV9hMTF5VXBkYXRlUm93TGV2ZWwodCxlKXt0LnNldEF0dHJpYnV0ZSgiYXJpYS1sZXZlbCIsZSsxKX1fYTExeVVwZGF0ZVJvd0RldGFpbHNPcGVuZWQodCxlKXtBcnJheS5mcm9tKHQuY2hpbGRyZW4pLmZvckVhY2goKHQ9PnsiYm9vbGVhbiI9PXR5cGVvZiBlP3Quc2V0QXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIixlKTp0Lmhhc0F0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIpJiZ0LnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIpfSkpfV9hMTF5U2V0Um93RGV0YWlsc0NlbGwodCxlKXtBcnJheS5mcm9tKHQuY2hpbGRyZW4pLmZvckVhY2goKHQ9Pnt0IT09ZSYmdC5zZXRBdHRyaWJ1dGUoImFyaWEtY29udHJvbHMiLGUuaWQpfSkpfV9hMTF5VXBkYXRlQ2VsbENvbHNwYW4odCxlKXt0LnNldEF0dHJpYnV0ZSgiYXJpYS1jb2xzcGFuIixOdW1iZXIoZSkpfV9hMTF5VXBkYXRlU29ydGVycygpe0FycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCJ2YWFkaW4tZ3JpZC1zb3J0ZXIiKSkuZm9yRWFjaCgodD0+e2xldCBlPXQucGFyZW50Tm9kZTtmb3IoO2UmJiJ2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQiIT09ZS5sb2NhbE5hbWU7KWU9ZS5wYXJlbnROb2RlO2UmJmUuYXNzaWduZWRTbG90JiZlLmFzc2lnbmVkU2xvdC5wYXJlbnROb2RlLnNldEF0dHJpYnV0ZSgiYXJpYS1zb3J0Iix7YXNjOiJhc2NlbmRpbmciLGRlc2M6ImRlc2NlbmRpbmcifVtTdHJpbmcodC5kaXJlY3Rpb24pXXx8Im5vbmUiKX0pKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovLE4kdD10PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue2FjdGl2ZUl0ZW06e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTpudWxsfX19cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMuJC5zY3JvbGxlci5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5fb25DbGljay5iaW5kKHRoaXMpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImNlbGwtYWN0aXZhdGUiLHRoaXMuX2FjdGl2YXRlSXRlbS5iaW5kKHRoaXMpKX1fYWN0aXZhdGVJdGVtKHQpe2NvbnN0IGU9dC5kZXRhaWwubW9kZWwsbj1lP2UuaXRlbTpudWxsO24mJih0aGlzLmFjdGl2ZUl0ZW09dGhpcy5faXRlbXNFcXVhbCh0aGlzLmFjdGl2ZUl0ZW0sbik/bnVsbDpuKX1fb25DbGljayh0KXtpZih0LmRlZmF1bHRQcmV2ZW50ZWQpcmV0dXJuO2NvbnN0IGU9dC5jb21wb3NlZFBhdGgoKSxuPWVbZS5pbmRleE9mKHRoaXMuJC50YWJsZSktM107aWYoIW58fG4uZ2V0QXR0cmlidXRlKCJwYXJ0IikuaW5kZXhPZigiZGV0YWlscy1jZWxsIik+LTEpcmV0dXJuO2NvbnN0IGk9bi5fY29udGVudCxyPXRoaXMuZ2V0Um9vdE5vZGUoKS5hY3RpdmVFbGVtZW50O2kuY29udGFpbnMocil8fHRoaXMuX2lzRm9jdXNhYmxlKHQudGFyZ2V0KXx8dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY2VsbC1hY3RpdmF0ZSIse2RldGFpbDp7bW9kZWw6dGhpcy5fX2dldFJvd01vZGVsKG4ucGFyZW50RWxlbWVudCl9fSkpfV9pc0ZvY3VzYWJsZSh0KXtyZXR1cm4gSSR0KHQpfX0sSSR0PXQ9PntpZighdC5wYXJlbnROb2RlKXJldHVybiExO2NvbnN0IGU9LTEhPT1BcnJheS5mcm9tKHQucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKCJbdGFiaW5kZXhdLCBidXR0b24sIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBvYmplY3QsIGlmcmFtZSwgbGFiZWwsIGFbaHJlZl0sIGFyZWFbaHJlZl0iKSkuZmlsdGVyKCh0PT4iY2VsbCBib2R5LWNlbGwiIT09dC5nZXRBdHRyaWJ1dGUoInBhcnQiKSkpLmluZGV4T2YodCk7cmV0dXJuIXQuZGlzYWJsZWQmJmV9LFIkdD10PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue2l0ZW1zOkFycmF5fX1zdGF0aWMgZ2V0IG9ic2VydmVycygpe3JldHVyblsiX2l0ZW1zQ2hhbmdlZChpdGVtcywgaXRlbXMuKiwgaXNBdHRhY2hlZCkiXX1faXRlbXNDaGFuZ2VkKHQsZSxuKXtpZihuKXtpZighQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gbnVsbD09dCYmKHRoaXMuc2l6ZT0wKSx2b2lkKHRoaXMuZGF0YVByb3ZpZGVyPT09dGhpcy5fYXJyYXlEYXRhUHJvdmlkZXImJih0aGlzLmRhdGFQcm92aWRlcj12b2lkIDApKTt0aGlzLnNpemU9dC5sZW5ndGgsdGhpcy5kYXRhUHJvdmlkZXI9dGhpcy5kYXRhUHJvdmlkZXJ8fHRoaXMuX2FycmF5RGF0YVByb3ZpZGVyLHRoaXMuY2xlYXJDYWNoZSgpLHRoaXMuX2Vuc3VyZUZpcnN0UGFnZUxvYWRlZCgpfX1fYXJyYXlEYXRhUHJvdmlkZXIodCxlKXtsZXQgbj0oQXJyYXkuaXNBcnJheSh0aGlzLml0ZW1zKT90aGlzLml0ZW1zOltdKS5zbGljZSgwKTt0aGlzLl9maWx0ZXJzJiZ0aGlzLl9jaGVja1BhdGhzKHRoaXMuX2ZpbHRlcnMsImZpbHRlcmluZyIsbikmJihuPXRoaXMuX2ZpbHRlcihuKSksdGhpcy5zaXplPW4ubGVuZ3RoLHQuc29ydE9yZGVycy5sZW5ndGgmJnRoaXMuX2NoZWNrUGF0aHModGhpcy5fc29ydGVycywic29ydGluZyIsbikmJihuPW4uc29ydCh0aGlzLl9tdWx0aVNvcnQuYmluZCh0aGlzKSkpO2NvbnN0IGk9dC5wYWdlKnQucGFnZVNpemU7ZShuLnNsaWNlKGksaSt0LnBhZ2VTaXplKSxuLmxlbmd0aCl9X2NoZWNrUGF0aHModCxlLG4pe2lmKCFuLmxlbmd0aClyZXR1cm4hMTtsZXQgaT0hMDtmb3IobGV0IHIgaW4gdCl7Y29uc3Qgbz10W3JdLnBhdGg7aWYoIW98fC0xPT09by5pbmRleE9mKCIuIikpY29udGludWU7Y29uc3QgYT1vLnJlcGxhY2UoL1wuW14uXSokLywiIik7dm9pZCAwPT09Zm8uZ2V0KGEsblswXSkmJihjb25zb2xlLndhcm4oYFBhdGggIiR7b30iIHVzZWQgZm9yICR7ZX0gZG9lcyBub3QgZXhpc3QgaW4gYWxsIG9mIHRoZSBpdGVtcywgJHtlfSBpcyBkaXNhYmxlZC5gKSxpPSExKX1yZXR1cm4gaX1fbXVsdGlTb3J0KHQsZSl7cmV0dXJuIHRoaXMuX3NvcnRlcnMubWFwKChuPT4iYXNjIj09PW4uZGlyZWN0aW9uP3RoaXMuX2NvbXBhcmUoZm8uZ2V0KG4ucGF0aCx0KSxmby5nZXQobi5wYXRoLGUpKToiZGVzYyI9PT1uLmRpcmVjdGlvbj90aGlzLl9jb21wYXJlKGZvLmdldChuLnBhdGgsZSksZm8uZ2V0KG4ucGF0aCx0KSk6MCkpLnJlZHVjZSgoKHQsZSk9PnR8fGUpLDApfV9ub3JtYWxpemVFbXB0eVZhbHVlKHQpe3JldHVyblt2b2lkIDAsbnVsbF0uaW5kZXhPZih0KT49MD8iIjppc05hTih0KT90LnRvU3RyaW5nKCk6dH1fY29tcGFyZSh0LGUpe3JldHVybih0PXRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUodCkpPChlPXRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUoZSkpPy0xOnQ+ZT8xOjB9X2ZpbHRlcih0KXtyZXR1cm4gdC5maWx0ZXIoKHQ9PjA9PT10aGlzLl9maWx0ZXJzLmZpbHRlcigoZT0+e2NvbnN0IG49dGhpcy5fbm9ybWFsaXplRW1wdHlWYWx1ZShmby5nZXQoZS5wYXRoLHQpKSxpPXRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUoZS52YWx1ZSkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO3JldHVybi0xPT09bi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihpKX0pKS5sZW5ndGgpKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovLE8kdD10PT5jbGFzcyBleHRlbmRzKHBpKHQpKXtyZWFkeSgpe3N1cGVyLnJlYWR5KCk7Y29uc3QgdD10aGlzLiQuc2Nyb2xsZXI7aWkodCwidHJhY2siLHRoaXMuX29uSGVhZGVyVHJhY2suYmluZCh0aGlzKSksdC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLChlPT50Lmhhc0F0dHJpYnV0ZSgiY29sdW1uLXJlc2l6aW5nIikmJmUucHJldmVudERlZmF1bHQoKSkpLHQuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCh0PT4icmVzaXplLWhhbmRsZSI9PXQudGFyZ2V0LmdldEF0dHJpYnV0ZSgicGFydCIpJiZ0LnByZXZlbnREZWZhdWx0KCkpKSx0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsKHQ9PiJyZXNpemUtaGFuZGxlIj09PXQudGFyZ2V0LmdldEF0dHJpYnV0ZSgicGFydCIpJiZ0LnByZXZlbnREZWZhdWx0KCkpKX1fb25IZWFkZXJUcmFjayh0KXtjb25zdCBlPXQudGFyZ2V0O2lmKCJyZXNpemUtaGFuZGxlIj09PWUuZ2V0QXR0cmlidXRlKCJwYXJ0Iikpe2xldCBuPWUucGFyZW50RWxlbWVudC5fY29sdW1uO2Zvcih0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImNvbHVtbi1yZXNpemluZyIsITAsdGhpcy4kLnNjcm9sbGVyKTsidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PW4ubG9jYWxOYW1lOyluPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG4uX2NoaWxkQ29sdW1ucywwKS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9vcmRlci1lLl9vcmRlcn0pKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiF0LmhpZGRlbn0pKS5wb3AoKTtjb25zdCBpPUFycmF5LmZyb20odGhpcy4kLmhlYWRlci5xdWVyeVNlbGVjdG9yQWxsKCdbcGFydH49InJvdyJdOmxhc3QtY2hpbGQgW3BhcnR+PSJjZWxsIl0nKSkscj1pLmZpbHRlcigodD0+dC5fY29sdW1uPT09bikpWzBdO2lmKHIub2Zmc2V0V2lkdGgpe2NvbnN0IGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUociksaT0xMCtwYXJzZUludChlLnBhZGRpbmdMZWZ0KStwYXJzZUludChlLnBhZGRpbmdSaWdodCkrcGFyc2VJbnQoZS5ib3JkZXJMZWZ0V2lkdGgpK3BhcnNlSW50KGUuYm9yZGVyUmlnaHRXaWR0aCkrcGFyc2VJbnQoZS5tYXJnaW5MZWZ0KStwYXJzZUludChlLm1hcmdpblJpZ2h0KSxvPXIub2Zmc2V0V2lkdGgrKHRoaXMuX19pc1JUTD9yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtdC5kZXRhaWwueDp0LmRldGFpbC54LXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQpO24ud2lkdGg9TWF0aC5tYXgoaSxvKSsicHgiLG4uZmxleEdyb3c9MH1pLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX2NvbHVtbi5fb3JkZXItZS5fY29sdW1uLl9vcmRlcn0pKS5mb3JFYWNoKChmdW5jdGlvbih0LGUsbil7ZTxuLmluZGV4T2YocikmJih0Ll9jb2x1bW4ud2lkdGg9dC5vZmZzZXRXaWR0aCsicHgiLHQuX2NvbHVtbi5mbGV4R3Jvdz0wKX0pKSwiZW5kIj09PXQuZGV0YWlsLnN0YXRlJiYodGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJjb2x1bW4tcmVzaXppbmciLCExLHRoaXMuJC5zY3JvbGxlciksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY29sdW1uLXJlc2l6ZSIse2RldGFpbDp7cmVzaXplZENvbHVtbjpufX0pKSksdGhpcy5fcmVzaXplSGFuZGxlcigpfX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovLHokdD1jbGFzcyB0e2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLmdyaWQ9dCx0aGlzLnBhcmVudENhY2hlPWUsdGhpcy5wYXJlbnRJdGVtPW4sdGhpcy5pdGVtQ2FjaGVzPXt9LHRoaXMuaXRlbXM9e30sdGhpcy5lZmZlY3RpdmVTaXplPTAsdGhpcy5zaXplPTAsdGhpcy5wZW5kaW5nUmVxdWVzdHM9e319aXNMb2FkaW5nKCl7cmV0dXJuIEJvb2xlYW4oT2JqZWN0LmtleXModGhpcy5wZW5kaW5nUmVxdWVzdHMpLmxlbmd0aHx8T2JqZWN0LmtleXModGhpcy5pdGVtQ2FjaGVzKS5maWx0ZXIoKHQ9PnRoaXMuaXRlbUNhY2hlc1t0XS5pc0xvYWRpbmcoKSkpWzBdKX1nZXRJdGVtRm9ySW5kZXgodCl7Y29uc3R7Y2FjaGU6ZSxzY2FsZWRJbmRleDpufT10aGlzLmdldENhY2hlQW5kSW5kZXgodCk7cmV0dXJuIGUuaXRlbXNbbl19dXBkYXRlU2l6ZSgpe3RoaXMuZWZmZWN0aXZlU2l6ZT0hdGhpcy5wYXJlbnRJdGVtfHx0aGlzLmdyaWQuX2lzRXhwYW5kZWQodGhpcy5wYXJlbnRJdGVtKT90aGlzLnNpemUrT2JqZWN0LmtleXModGhpcy5pdGVtQ2FjaGVzKS5yZWR1Y2UoKCh0LGUpPT57Y29uc3Qgbj10aGlzLml0ZW1DYWNoZXNbZV07cmV0dXJuIG4udXBkYXRlU2l6ZSgpLHQrbi5lZmZlY3RpdmVTaXplfSksMCk6MH1lbnN1cmVTdWJDYWNoZUZvclNjYWxlZEluZGV4KGUpe2lmKCF0aGlzLml0ZW1DYWNoZXNbZV0pe2NvbnN0IG49bmV3IHQodGhpcy5ncmlkLHRoaXMsdGhpcy5pdGVtc1tlXSk7dGhpcy5pdGVtQ2FjaGVzW2VdPW4sdGhpcy5ncmlkLl9sb2FkUGFnZSgwLG4pfX1nZXRDYWNoZUFuZEluZGV4KHQpe2xldCBlPXQ7Y29uc3Qgbj1PYmplY3Qua2V5cyh0aGlzLml0ZW1DYWNoZXMpO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKXtjb25zdCBpPU51bWJlcihuW3RdKSxyPXRoaXMuaXRlbUNhY2hlc1tpXTtpZihlPD1pKXJldHVybntjYWNoZTp0aGlzLHNjYWxlZEluZGV4OmV9O2lmKGU8PWkrci5lZmZlY3RpdmVTaXplKXJldHVybiByLmdldENhY2hlQW5kSW5kZXgoZS1pLTEpO2UtPXIuZWZmZWN0aXZlU2l6ZX1yZXR1cm57Y2FjaGU6dGhpcyxzY2FsZWRJbmRleDplfX19LEQkdD10PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue3BhZ2VTaXplOnt0eXBlOk51bWJlcix2YWx1ZTo1MCxvYnNlcnZlcjoiX3BhZ2VTaXplQ2hhbmdlZCJ9LGRhdGFQcm92aWRlcjp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLG9ic2VydmVyOiJfZGF0YVByb3ZpZGVyQ2hhbmdlZCJ9LGxvYWRpbmc6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAscmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfY2FjaGU6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB6JHQodGhpcyl9fSxpdGVtSWRQYXRoOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxleHBhbmRlZEl0ZW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsdmFsdWU6KCk9PltdfX19c3RhdGljIGdldCBvYnNlcnZlcnMoKXtyZXR1cm5bIl9zaXplQ2hhbmdlZChzaXplKSIsIl9pdGVtSWRQYXRoQ2hhbmdlZChpdGVtSWRQYXRoKSIsIl9leHBhbmRlZEl0ZW1zQ2hhbmdlZChleHBhbmRlZEl0ZW1zLiopIl19X3NpemVDaGFuZ2VkKHQpe2NvbnN0IGU9dC10aGlzLl9jYWNoZS5zaXplO3RoaXMuX2NhY2hlLnNpemUrPWUsdGhpcy5fY2FjaGUuZWZmZWN0aXZlU2l6ZSs9ZSx0aGlzLl9lZmZlY3RpdmVTaXplPXRoaXMuX2NhY2hlLmVmZmVjdGl2ZVNpemUsdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoMCksdGhpcy5fZGVib3VuY2VJbmNyZWFzZVBvb2wmJnRoaXMuX2RlYm91bmNlSW5jcmVhc2VQb29sLmZsdXNoKCl9X2dldEl0ZW0odCxlKXtpZih0Pj10aGlzLl9lZmZlY3RpdmVTaXplKXJldHVybjtlLmluZGV4PXQ7Y29uc3R7Y2FjaGU6bixzY2FsZWRJbmRleDppfT10aGlzLl9jYWNoZS5nZXRDYWNoZUFuZEluZGV4KHQpLHI9bi5pdGVtc1tpXTtyPyh0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImxvYWRpbmciLCExLGUpLHRoaXMuX3VwZGF0ZUl0ZW0oZSxyKSx0aGlzLl9pc0V4cGFuZGVkKHIpJiZuLmVuc3VyZVN1YkNhY2hlRm9yU2NhbGVkSW5kZXgoaSkpOih0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImxvYWRpbmciLCEwLGUpLHRoaXMuX2xvYWRQYWdlKHRoaXMuX2dldFBhZ2VGb3JJbmRleChpKSxuKSl9X2V4cGFuZGVkSW5zdGFuY2VDaGFuZ2VkQ2FsbGJhY2sodCxlKXt2b2lkIDAhPT10Lml0ZW0mJihlP3RoaXMuZXhwYW5kSXRlbSh0Lml0ZW0pOnRoaXMuY29sbGFwc2VJdGVtKHQuaXRlbSkpfWdldEl0ZW1JZCh0KXtyZXR1cm4gdGhpcy5pdGVtSWRQYXRoP3RoaXMuZ2V0KHRoaXMuaXRlbUlkUGF0aCx0KTp0fV9pc0V4cGFuZGVkKHQpe3JldHVybiB0aGlzLl9fZXhwYW5kZWRLZXlzLmhhcyh0aGlzLmdldEl0ZW1JZCh0KSl9X2V4cGFuZGVkSXRlbXNDaGFuZ2VkKCl7dGhpcy5fX2NhY2hlRXhwYW5kZWRLZXlzKCksdGhpcy5fY2FjaGUudXBkYXRlU2l6ZSgpLHRoaXMuX2VmZmVjdGl2ZVNpemU9dGhpcy5fY2FjaGUuZWZmZWN0aXZlU2l6ZSx0aGlzLl9hc3NpZ25Nb2RlbHMoKX1faXRlbUlkUGF0aENoYW5nZWQoKXt0aGlzLl9fY2FjaGVFeHBhbmRlZEtleXMoKX1fX2NhY2hlRXhwYW5kZWRLZXlzKCl7dGhpcy5leHBhbmRlZEl0ZW1zJiYodGhpcy5fX2V4cGFuZGVkS2V5cz1uZXcgU2V0LHRoaXMuZXhwYW5kZWRJdGVtcy5mb3JFYWNoKCh0PT57dGhpcy5fX2V4cGFuZGVkS2V5cy5hZGQodGhpcy5nZXRJdGVtSWQodCkpfSkpKX1leHBhbmRJdGVtKHQpe3RoaXMuX2lzRXhwYW5kZWQodCl8fCh0aGlzLmV4cGFuZGVkSXRlbXM9Wy4uLnRoaXMuZXhwYW5kZWRJdGVtcyx0XSl9Y29sbGFwc2VJdGVtKHQpe3RoaXMuX2lzRXhwYW5kZWQodCkmJih0aGlzLmV4cGFuZGVkSXRlbXM9dGhpcy5leHBhbmRlZEl0ZW1zLmZpbHRlcigoZT0+IXRoaXMuX2l0ZW1zRXF1YWwoZSx0KSkpKX1fZ2V0SW5kZXhMZXZlbCh0KXtsZXR7Y2FjaGU6ZX09dGhpcy5fY2FjaGUuZ2V0Q2FjaGVBbmRJbmRleCh0KSxuPTA7Zm9yKDtlLnBhcmVudENhY2hlOyllPWUucGFyZW50Q2FjaGUsbisrO3JldHVybiBufV9jYW5Qb3B1bGF0ZSgpe3JldHVybiBCb29sZWFuKHRoaXMuX2hhc0RhdGEmJnRoaXMuX2NvbHVtblRyZWUpfV9sb2FkUGFnZSh0LGUpe2lmKCFlLnBlbmRpbmdSZXF1ZXN0c1t0XSYmdGhpcy5kYXRhUHJvdmlkZXIpe3RoaXMuX3NldExvYWRpbmcoITApLGUucGVuZGluZ1JlcXVlc3RzW3RdPSEwO2NvbnN0IG49e3BhZ2U6dCxwYWdlU2l6ZTp0aGlzLnBhZ2VTaXplLHNvcnRPcmRlcnM6dGhpcy5fbWFwU29ydGVycygpLGZpbHRlcnM6dGhpcy5fbWFwRmlsdGVycygpLHBhcmVudEl0ZW06ZS5wYXJlbnRJdGVtfTt0aGlzLl9kZWJvdW5jZUluY3JlYXNlUG9vbCYmdGhpcy5fZGVib3VuY2VJbmNyZWFzZVBvb2wuZmx1c2goKSx0aGlzLmRhdGFQcm92aWRlcihuLCgoaSxyKT0+e3ZvaWQgMCE9PXI/ZS5zaXplPXI6bi5wYXJlbnRJdGVtJiYoZS5zaXplPWkubGVuZ3RoKTtjb25zdCBvPUFycmF5LmZyb20odGhpcy4kLml0ZW1zLmNoaWxkcmVuKS5tYXAoKHQ9PnQuX2l0ZW0pKTtpLmZvckVhY2goKChuLGkpPT57Y29uc3Qgcj10KnRoaXMucGFnZVNpemUraTtlLml0ZW1zW3JdPW4sdGhpcy5faXNFeHBhbmRlZChuKSYmby5pbmRleE9mKG4pPi0xJiZlLmVuc3VyZVN1YkNhY2hlRm9yU2NhbGVkSW5kZXgocil9KSksdGhpcy5faGFzRGF0YT0hMCxkZWxldGUgZS5wZW5kaW5nUmVxdWVzdHNbdF0sdGhpcy5fZGVib3VuY2VyQXBwbHlDYWNoZWREYXRhPVRuLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlckFwcGx5Q2FjaGVkRGF0YSxndC5hZnRlcigwKSwoKCk9Pnt0aGlzLl9zZXRMb2FkaW5nKCExKSx0aGlzLl9jYWNoZS51cGRhdGVTaXplKCksdGhpcy5fZWZmZWN0aXZlU2l6ZT10aGlzLl9jYWNoZS5lZmZlY3RpdmVTaXplLEFycmF5LmZyb20odGhpcy4kLml0ZW1zLmNoaWxkcmVuKS5maWx0ZXIoKHQ9PiF0LmhpZGRlbikpLmZvckVhY2goKHQ9Pnt0aGlzLl9jYWNoZS5nZXRJdGVtRm9ySW5kZXgodC5pbmRleCkmJnRoaXMuX2dldEl0ZW0odC5pbmRleCx0KX0pKSx0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgwKSx0aGlzLl9fc2Nyb2xsVG9QZW5kaW5nSW5kZXgoKX0pKSx0aGlzLl9jYWNoZS5pc0xvYWRpbmcoKXx8dGhpcy5fZGVib3VuY2VyQXBwbHlDYWNoZWREYXRhLmZsdXNoKCksdGhpcy5fX2l0ZW1zUmVjZWl2ZWQoKX0pKX19X2dldFBhZ2VGb3JJbmRleCh0KXtyZXR1cm4gTWF0aC5mbG9vcih0L3RoaXMucGFnZVNpemUpfWNsZWFyQ2FjaGUoKXt0aGlzLl9jYWNoZT1uZXcgeiR0KHRoaXMpLEFycmF5LmZyb20odGhpcy4kLml0ZW1zLmNoaWxkcmVuKS5mb3JFYWNoKCh0PT57QXJyYXkuZnJvbSh0LmNoaWxkcmVuKS5mb3JFYWNoKCh0PT57dC5faW5zdGFuY2UmJnQuX2luc3RhbmNlLl9zZXRQZW5kaW5nUHJvcGVydHkoIml0ZW0iLHt9LCExKX0pKX0pKSx0aGlzLl9jYWNoZS5zaXplPXRoaXMuc2l6ZXx8MCx0aGlzLl9jYWNoZS51cGRhdGVTaXplKCksdGhpcy5faGFzRGF0YT0hMSx0aGlzLl9hc3NpZ25Nb2RlbHMoKSx0aGlzLl9lZmZlY3RpdmVTaXplJiZ0aGlzLl9pbml0aWFsUG9vbENyZWF0ZWR8fHRoaXMuX2xvYWRQYWdlKDAsdGhpcy5fY2FjaGUpfV9wYWdlU2l6ZUNoYW5nZWQodCxlKXt2b2lkIDAhPT1lJiZ0IT09ZSYmdGhpcy5jbGVhckNhY2hlKCl9X2NoZWNrU2l6ZSgpe3ZvaWQgMD09PXRoaXMuc2l6ZSYmMD09PXRoaXMuX2VmZmVjdGl2ZVNpemUmJmNvbnNvbGUud2FybigiVGhlIDx2YWFkaW4tZ3JpZD4gbmVlZHMgdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBpbiBvcmRlciB0byBkaXNwbGF5IHJvd3MuIFNldCB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIHRvIHRoZSBgc2l6ZWAgcHJvcGVydHksIG9yIHByb3ZpZGUgdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIHRoZSBgZGF0YVByb3ZpZGVyYOKAmXMgYGNhbGxiYWNrYCBjYWxsLiIpfV9kYXRhUHJvdmlkZXJDaGFuZ2VkKHQsZSl7dm9pZCAwIT09ZSYmdGhpcy5jbGVhckNhY2hlKCksdCYmdGhpcy5pdGVtcyYmdGhpcy5pdGVtcy5sZW5ndGgmJnRoaXMuX3Njcm9sbFRvSW5kZXgodGhpcy5fZmlyc3RWaXNpYmxlSW5kZXgpLHRoaXMuX2Vuc3VyZUZpcnN0UGFnZUxvYWRlZCgpLHRoaXMuX2RlYm91bmNlckNoZWNrU2l6ZT1Ubi5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZXJDaGVja1NpemUsZ3QuYWZ0ZXIoMmUzKSx0aGlzLl9jaGVja1NpemUuYmluZCh0aGlzKSksdGhpcy5fc2Nyb2xsSGFuZGxlcigpfV9lbnN1cmVGaXJzdFBhZ2VMb2FkZWQoKXt0aGlzLl9oYXNEYXRhfHx0aGlzLl9sb2FkUGFnZSgwLHRoaXMuX2NhY2hlKX1faXRlbXNFcXVhbCh0LGUpe3JldHVybiB0aGlzLmdldEl0ZW1JZCh0KT09PXRoaXMuZ2V0SXRlbUlkKGUpfV9nZXRJdGVtSW5kZXhJbkFycmF5KHQsZSl7bGV0IG49LTE7cmV0dXJuIGUuZm9yRWFjaCgoKGUsaSk9Pnt0aGlzLl9pdGVtc0VxdWFsKGUsdCkmJihuPWkpfSkpLG59c2Nyb2xsVG9JbmRleCh0KXtzdXBlci5zY3JvbGxUb0luZGV4KHQpLGlzTmFOKHQpfHwhdGhpcy5fY2FjaGUuaXNMb2FkaW5nKCkmJnRoaXMuY2xpZW50SGVpZ2h0fHwodGhpcy5fX3BlbmRpbmdTY3JvbGxUb0luZGV4PXQpfV9fc2Nyb2xsVG9QZW5kaW5nSW5kZXgoKXtpZih0aGlzLl9fcGVuZGluZ1Njcm9sbFRvSW5kZXgmJnRoaXMuJC5pdGVtcy5jaGlsZHJlbi5sZW5ndGgpe2NvbnN0IHQ9dGhpcy5fX3BlbmRpbmdTY3JvbGxUb0luZGV4O2RlbGV0ZSB0aGlzLl9fcGVuZGluZ1Njcm9sbFRvSW5kZXgsdGhpcy5fZGVib3VuY2VJbmNyZWFzZVBvb2wmJnRoaXMuX2RlYm91bmNlSW5jcmVhc2VQb29sLmZsdXNoKCksdGhpcy5zY3JvbGxUb0luZGV4KHQpfX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovLEIkdD10PT5jbGFzcyBleHRlbmRzIHR7cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMuX2FkZE5vZGVPYnNlcnZlcigpfV9oYXNDb2x1bW5Hcm91cHModCl7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspaWYoInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCI9PT10W2VdLmxvY2FsTmFtZSlyZXR1cm4hMDtyZXR1cm4hMX1fZ2V0Q2hpbGRDb2x1bW5zKHQpe3JldHVybiB6aS5nZXRGbGF0dGVuZWROb2Rlcyh0KS5maWx0ZXIodGhpcy5faXNDb2x1bW5FbGVtZW50KX1fZmxhdHRlbkNvbHVtbkdyb3Vwcyh0KXtyZXR1cm4gdC5tYXAoKHQ9PiJ2YWFkaW4tZ3JpZC1jb2x1bW4tZ3JvdXAiPT09dC5sb2NhbE5hbWU/dGhpcy5fZ2V0Q2hpbGRDb2x1bW5zKHQpOlt0XSkpLnJlZHVjZSgoKHQsZSk9PnQuY29uY2F0KGUpKSxbXSl9X2dldENvbHVtblRyZWUoKXtjb25zdCB0PVtdO2ZvcihsZXQgZT16aS5nZXRGbGF0dGVuZWROb2Rlcyh0aGlzKS5maWx0ZXIodGhpcy5faXNDb2x1bW5FbGVtZW50KTt0LnB1c2goZSksdGhpcy5faGFzQ29sdW1uR3JvdXBzKGUpOyllPXRoaXMuX2ZsYXR0ZW5Db2x1bW5Hcm91cHMoZSk7cmV0dXJuIHR9X3VwZGF0ZUNvbHVtblRyZWUoKXtjb25zdCB0PXRoaXMuX2dldENvbHVtblRyZWUoKTt0aGlzLl9hcnJheUVxdWFscyh0LHRoaXMuX2NvbHVtblRyZWUpfHwodGhpcy5fY29sdW1uVHJlZT10KX1fYWRkTm9kZU9ic2VydmVyKCl7dGhpcy5fb2JzZXJ2ZXI9bmV3IHppKHRoaXMsKHQ9Pntjb25zdCBlPXQuYWRkZWROb2Rlcy5maWx0ZXIoKHQ9PiJ0ZW1wbGF0ZSI9PT10LmxvY2FsTmFtZSYmdC5jbGFzc0xpc3QuY29udGFpbnMoInJvdy1kZXRhaWxzIikpKVswXTtlJiZ0aGlzLl9yb3dEZXRhaWxzVGVtcGxhdGUhPT1lJiYodGhpcy5fcm93RGV0YWlsc1RlbXBsYXRlPWUpO2NvbnN0IG49dD0+dC5maWx0ZXIodGhpcy5faXNDb2x1bW5FbGVtZW50KS5sZW5ndGg+MDtpZihuKHQuYWRkZWROb2Rlcyl8fG4odC5yZW1vdmVkTm9kZXMpKXtjb25zdCBlPXQucmVtb3ZlZE5vZGVzLmZsYXRNYXAoKHQ9PnQuX2FsbENlbGxzKSksbj10PT5lLmZpbHRlcigoZT0+ZS5fY29udGVudC5jb250YWlucyh0KSkpLmxlbmd0aDt0aGlzLl9fcmVtb3ZlU29ydGVycyh0aGlzLl9zb3J0ZXJzLmZpbHRlcihuKSksdGhpcy5fX3JlbW92ZUZpbHRlcnModGhpcy5fZmlsdGVycy5maWx0ZXIobikpLHRoaXMuX3VwZGF0ZUNvbHVtblRyZWUoKX10aGlzLl9kZWJvdW5jZXJDaGVja0ltcG9ydHM9VG4uZGVib3VuY2UodGhpcy5fZGVib3VuY2VyQ2hlY2tJbXBvcnRzLGd0LmFmdGVyKDJlMyksdGhpcy5fY2hlY2tJbXBvcnRzLmJpbmQodGhpcykpLHRoaXMuX2Vuc3VyZUZpcnN0UGFnZUxvYWRlZCgpfSkpfV9hcnJheUVxdWFscyh0LGUpe2lmKCF0fHwhZXx8dC5sZW5ndGghPWUubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgbj0wLGk9dC5sZW5ndGg7bjxpO24rKylpZih0W25daW5zdGFuY2VvZiBBcnJheSYmZVtuXWluc3RhbmNlb2YgQXJyYXkpe2lmKCF0aGlzLl9hcnJheUVxdWFscyh0W25dLGVbbl0pKXJldHVybiExfWVsc2UgaWYodFtuXSE9ZVtuXSlyZXR1cm4hMTtyZXR1cm4hMH1fY2hlY2tJbXBvcnRzKCl7WyJ2YWFkaW4tZ3JpZC1jb2x1bW4tZ3JvdXAiLCJ2YWFkaW4tZ3JpZC1maWx0ZXIiLCJ2YWFkaW4tZ3JpZC1maWx0ZXItY29sdW1uIiwidmFhZGluLWdyaWQtdHJlZS10b2dnbGUiLCJ2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tY29sdW1uIiwidmFhZGluLWdyaWQtc29ydC1jb2x1bW4iLCJ2YWFkaW4tZ3JpZC1zb3J0ZXIiXS5mb3JFYWNoKCh0PT57Y29uc3QgZT10aGlzLnF1ZXJ5U2VsZWN0b3IodCk7IWV8fGUgaW5zdGFuY2VvZiB5ZXx8Y29uc29sZS53YXJuKGBNYWtlIHN1cmUgeW91IGhhdmUgaW1wb3J0ZWQgdGhlIHJlcXVpcmVkIG1vZHVsZSBmb3IgPCR7dH0+IGVsZW1lbnQuYCl9KSl9X3VwZGF0ZUZpcnN0QW5kTGFzdENvbHVtbigpe0FycmF5LmZyb20odGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRyIikpLmZvckVhY2goKHQ9PnRoaXMuX3VwZGF0ZUZpcnN0QW5kTGFzdENvbHVtbkZvclJvdyh0KSkpfV91cGRhdGVGaXJzdEFuZExhc3RDb2x1bW5Gb3JSb3codCl7QXJyYXkuZnJvbSh0LnF1ZXJ5U2VsZWN0b3JBbGwoJ1twYXJ0fj0iY2VsbCJdOm5vdChbcGFydH49ImRldGFpbHMtY2VsbCJdKScpKS5zb3J0KCgodCxlKT0+dC5fY29sdW1uLl9vcmRlci1lLl9jb2x1bW4uX29yZGVyKSkuZm9yRWFjaCgoKHQsZSxuKT0+e3RoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgiZmlyc3QtY29sdW1uIiwwPT09ZSx0KSx0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImxhc3QtY29sdW1uIixlPT09bi5sZW5ndGgtMSx0KX0pKX1faXNDb2x1bW5FbGVtZW50KHQpe3JldHVybiB0Lm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJi9cYmNvbHVtblxiLy50ZXN0KHQubG9jYWxOYW1lKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovLEgkdD10PT5jbGFzcyBleHRlbmRzIHR7Z2V0RXZlbnRDb250ZXh0KHQpe2NvbnN0IGU9e30sbj10LmNvbXBvc2VkUGF0aCgpLGk9bltuLmluZGV4T2YodGhpcy4kLnRhYmxlKS0zXTtyZXR1cm4gaT8oZS5zZWN0aW9uPVsiYm9keSIsImhlYWRlciIsImZvb3RlciIsImRldGFpbHMiXS5maWx0ZXIoKHQ9PmkuZ2V0QXR0cmlidXRlKCJwYXJ0IikuaW5kZXhPZih0KT4tMSkpWzBdLGkuX2NvbHVtbiYmKGUuY29sdW1uPWkuX2NvbHVtbiksImJvZHkiIT09ZS5zZWN0aW9uJiYiZGV0YWlscyIhPT1lLnNlY3Rpb258fE9iamVjdC5hc3NpZ24oZSx0aGlzLl9fZ2V0Um93TW9kZWwoaS5wYXJlbnRFbGVtZW50KSksZSk6ZX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovLEYkdD10PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue19maWx0ZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX19cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZmlsdGVyLWNoYW5nZWQiLHRoaXMuX2ZpbHRlckNoYW5nZWQuYmluZCh0aGlzKSl9X2ZpbHRlckNoYW5nZWQodCl7dC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLl9fYWRkRmlsdGVyKHQudGFyZ2V0KSx0aGlzLl9fYXBwbHlGaWx0ZXJzKCl9X19yZW1vdmVGaWx0ZXJzKHQpezAhPXQubGVuZ3RoJiYodGhpcy5fZmlsdGVycz10aGlzLl9maWx0ZXJzLmZpbHRlcigoZT0+dC5pbmRleE9mKGUpPDApKSx0aGlzLl9fYXBwbHlGaWx0ZXJzKCkpfV9fYWRkRmlsdGVyKHQpey0xPT09dGhpcy5fZmlsdGVycy5pbmRleE9mKHQpJiZ0aGlzLl9maWx0ZXJzLnB1c2godCl9X19hcHBseUZpbHRlcnMoKXt0aGlzLmRhdGFQcm92aWRlciYmdGhpcy5pc0F0dGFjaGVkJiZ0aGlzLmNsZWFyQ2FjaGUoKX1fbWFwRmlsdGVycygpe3JldHVybiB0aGlzLl9maWx0ZXJzLm1hcCgodD0+KHtwYXRoOnQucGF0aCx2YWx1ZTp0LnZhbHVlfSkpKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovO2NsYXNzIFYkdCBleHRlbmRzIHlle3N0YXRpYyBnZXQgaXMoKXtyZXR1cm4idmFhZGluLWdyaWQtdGVtcGxhdGl6ZXIifXN0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntkYXRhSG9zdDpPYmplY3QsdGVtcGxhdGU6T2JqZWN0LF90ZW1wbGF0ZUluc3RhbmNlczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX3BhcmVudFBhdGhWYWx1ZXM6e3ZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fSxfZ3JpZDpPYmplY3R9fXN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCl7cmV0dXJuWyJfdGVtcGxhdGVJbnN0YW5jZXNDaGFuZ2VkKF90ZW1wbGF0ZUluc3RhbmNlcy4qLCBfcGFyZW50UGF0aFZhbHVlcy4qKSJdfWNvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9pbnN0YW5jZVByb3BzPXtkZXRhaWxzT3BlbmVkOiEwLGluZGV4OiEwLGl0ZW06ITAsc2VsZWN0ZWQ6ITAsZXhwYW5kZWQ6ITAsbGV2ZWw6ITB9fWNyZWF0ZUluc3RhbmNlKCl7dGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKTtjb25zdCB0PW5ldyB0aGlzLl9UZW1wbGF0ZUNsYXNzKHt9KTtyZXR1cm4gdGhpcy5hZGRJbnN0YW5jZSh0KSx0fWFkZEluc3RhbmNlKHQpey0xPT09dGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMuaW5kZXhPZih0KSYmKHRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLnB1c2godCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+dGhpcy5ub3RpZnlQYXRoKCJfdGVtcGxhdGVJbnN0YW5jZXMuKiIsdGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMpKSkpfXJlbW92ZUluc3RhbmNlKHQpe2NvbnN0IGU9dGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMuaW5kZXhPZih0KTt0aGlzLnNwbGljZSgiX3RlbXBsYXRlSW5zdGFuY2VzIixlLDEpfV9lbnN1cmVUZW1wbGF0aXplZCgpe3RoaXMuX1RlbXBsYXRlQ2xhc3N8fCh0aGlzLl9UZW1wbGF0ZUNsYXNzPSRyKHRoaXMudGVtcGxhdGUsdGhpcyx7aW5zdGFuY2VQcm9wczp0aGlzLl9pbnN0YW5jZVByb3BzLHBhcmVudE1vZGVsOiEwLGZvcndhcmRIb3N0UHJvcDpmdW5jdGlvbih0LGUpe3RoaXMuX2ZvcndhcmRQYXJlbnRQcm9wKHQsZSksdGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMmJnRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmZvckVhY2goKG49Pm4ubm90aWZ5UGF0aCh0LGUpKSl9LG5vdGlmeUluc3RhbmNlUHJvcDpmdW5jdGlvbih0LGUsbil7aWYoImluZGV4Ij09PWV8fCJpdGVtIj09PWUpcmV0dXJuO2NvbnN0IGk9YF9fJHtlfV9fYDtpZih0W2ldPT09bilyZXR1cm47dFtpXT1uO2NvbnN0IHI9QXJyYXkuZnJvbSh0aGlzLl9ncmlkLiQuaXRlbXMuY2hpbGRyZW4pLmZpbHRlcigoZT0+dGhpcy5fZ3JpZC5faXRlbXNFcXVhbChlLl9pdGVtLHQuaXRlbSkpKVswXTtyJiZBcnJheS5mcm9tKHIuY2hpbGRyZW4pLmZvckVhY2goKHQ9Pnt0Ll9pbnN0YW5jZSYmKHQuX2luc3RhbmNlW2ldPW4sdC5faW5zdGFuY2Uubm90aWZ5UGF0aChlLG4pKX0pKTtjb25zdCBvPSJpdGVtLiI7aWYoQXJyYXkuaXNBcnJheSh0aGlzLl9ncmlkLml0ZW1zKSYmMD09PWUuaW5kZXhPZihvKSl7Y29uc3QgaT10aGlzLl9ncmlkLml0ZW1zLmluZGV4T2YodC5pdGVtKSxyPWUuc2xpY2Uoby5sZW5ndGgpO3RoaXMuX2dyaWQubm90aWZ5UGF0aChgaXRlbXMuJHtpfS4ke3J9YCxuKX1jb25zdCBhPWBfJHtlfUluc3RhbmNlQ2hhbmdlZENhbGxiYWNrYDt0aGlzLl9ncmlkJiZ0aGlzLl9ncmlkW2FdJiZ0aGlzLl9ncmlkW2FdKHQsbil9fSkpfV9mb3J3YXJkUGFyZW50UHJvcCh0LGUpe3RoaXMuX3BhcmVudFBhdGhWYWx1ZXNbdF09ZSx0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5mb3JFYWNoKChuPT5uLm5vdGlmeVBhdGgodCxlKSkpfV90ZW1wbGF0ZUluc3RhbmNlc0NoYW5nZWQodCl7bGV0IGUsbjtpZigiX3RlbXBsYXRlSW5zdGFuY2VzIj09PXQucGF0aCllPTAsbj10aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5sZW5ndGg7ZWxzZXtpZigiX3RlbXBsYXRlSW5zdGFuY2VzLnNwbGljZXMiIT09dC5wYXRoKXJldHVybjtlPXQudmFsdWUuaW5kZXgsbj10LnZhbHVlLmFkZGVkQ291bnR9T2JqZWN0LmtleXModGhpcy5fcGFyZW50UGF0aFZhbHVlc3x8e30pLmZvckVhY2goKHQ9Pntmb3IobGV0IGk9ZTtpPGUrbjtpKyspdGhpcy5fdGVtcGxhdGVJbnN0YW5jZXNbaV0uc2V0KHQsdGhpcy5fcGFyZW50UGF0aFZhbHVlc1t0XSl9KSl9fWN1c3RvbUVsZW1lbnRzLmRlZmluZShWJHQuaXMsViR0KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi8KY29uc3QgVSR0PXQ9PmNsYXNzIGV4dGVuZHMgdHtzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKXtyZXR1cm57ZGV0YWlsc09wZW5lZEl0ZW1zOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxfcm93RGV0YWlsc1RlbXBsYXRlOk9iamVjdCxyb3dEZXRhaWxzUmVuZGVyZXI6RnVuY3Rpb24sX2RldGFpbHNDZWxsczp7dHlwZTpBcnJheX19fXN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCl7cmV0dXJuWyJfZGV0YWlsc09wZW5lZEl0ZW1zQ2hhbmdlZChkZXRhaWxzT3BlbmVkSXRlbXMuKiwgX3Jvd0RldGFpbHNUZW1wbGF0ZSwgcm93RGV0YWlsc1JlbmRlcmVyKSIsIl9yb3dEZXRhaWxzVGVtcGxhdGVPclJlbmRlcmVyQ2hhbmdlZChfcm93RGV0YWlsc1RlbXBsYXRlLCByb3dEZXRhaWxzUmVuZGVyZXIpIl19X3Jvd0RldGFpbHNUZW1wbGF0ZU9yUmVuZGVyZXJDaGFuZ2VkKHQsZSl7aWYodCYmZSl0aHJvdyBuZXcgRXJyb3IoIllvdSBzaG91bGQgb25seSB1c2UgZWl0aGVyIGEgcmVuZGVyZXIgb3IgYSB0ZW1wbGF0ZSBmb3Igcm93IGRldGFpbHMiKTtpZih0fHxlKXtpZih0JiYhdC50ZW1wbGF0aXplcil7Y29uc3QgZT1uZXcgViR0O2UuX2dyaWQ9dGhpcyxlLmRhdGFIb3N0PXRoaXMuZGF0YUhvc3QsZS50ZW1wbGF0ZT10LHQudGVtcGxhdGl6ZXI9ZX10aGlzLl9jb2x1bW5UcmVlJiZBcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZm9yRWFjaCgodD0+e3QucXVlcnlTZWxlY3RvcigiW3BhcnR+PWRldGFpbHMtY2VsbF0iKXx8KHRoaXMuX3VwZGF0ZVJvdyh0LHRoaXMuX2NvbHVtblRyZWVbdGhpcy5fY29sdW1uVHJlZS5sZW5ndGgtMV0pLHRoaXMuX2ExMXlVcGRhdGVSb3dEZXRhaWxzT3BlbmVkKHQsITEpKSxkZWxldGUgdC5xdWVyeVNlbGVjdG9yKCJbcGFydH49ZGV0YWlscy1jZWxsXSIpLl9pbnN0YW5jZX0pKSx0aGlzLmRldGFpbHNPcGVuZWRJdGVtcy5sZW5ndGgmJihBcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZm9yRWFjaCh0aGlzLl90b2dnbGVEZXRhaWxzQ2VsbCx0aGlzKSx0aGlzLl91cGRhdGUoKSl9fV9kZXRhaWxzT3BlbmVkSXRlbXNDaGFuZ2VkKHQpeyJkZXRhaWxzT3BlbmVkSXRlbXMubGVuZ3RoIiE9PXQucGF0aCYmdC52YWx1ZSYmQXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pLmZvckVhY2goKHQ9Pnt0aGlzLl90b2dnbGVEZXRhaWxzQ2VsbCh0LHQuX2l0ZW0pLHRoaXMuX2ExMXlVcGRhdGVSb3dEZXRhaWxzT3BlbmVkKHQsdGhpcy5faXNEZXRhaWxzT3BlbmVkKHQuX2l0ZW0pKSx0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImRldGFpbHMtb3BlbmVkIix0aGlzLl9pc0RldGFpbHNPcGVuZWQodC5faXRlbSksdCl9KSl9X2NvbmZpZ3VyZURldGFpbHNDZWxsKHQpe3Quc2V0QXR0cmlidXRlKCJwYXJ0IiwiY2VsbCBkZXRhaWxzLWNlbGwiKSx0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImZyb3plbiIsITAsdCl9X3RvZ2dsZURldGFpbHNDZWxsKHQsZSl7Y29uc3Qgbj10LnF1ZXJ5U2VsZWN0b3IoJ1twYXJ0fj0iZGV0YWlscy1jZWxsIl0nKTtpZighbilyZXR1cm47Y29uc3QgaT0hdGhpcy5faXNEZXRhaWxzT3BlbmVkKGUpLHI9ISFuLmhpZGRlbiE9PWk7KG4uX2luc3RhbmNlfHxuLl9yZW5kZXJlcikmJm4uaGlkZGVuPT09aXx8KG4uaGlkZGVuPWksaT90LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJwYWRkaW5nLWJvdHRvbSIpOih0aGlzLnJvd0RldGFpbHNSZW5kZXJlcj8obi5fcmVuZGVyZXI9dGhpcy5yb3dEZXRhaWxzUmVuZGVyZXIsbi5fcmVuZGVyZXIuY2FsbCh0aGlzLG4uX2NvbnRlbnQsdGhpcyx7aW5kZXg6dC5pbmRleCxpdGVtOmV9KSk6dGhpcy5fcm93RGV0YWlsc1RlbXBsYXRlJiYhbi5faW5zdGFuY2UmJihuLl9pbnN0YW5jZT10aGlzLl9yb3dEZXRhaWxzVGVtcGxhdGUudGVtcGxhdGl6ZXIuY3JlYXRlSW5zdGFuY2UoKSxuLl9jb250ZW50LmlubmVySFRNTD0iIixuLl9jb250ZW50LmFwcGVuZENoaWxkKG4uX2luc3RhbmNlLnJvb3QpLHRoaXMuX3VwZGF0ZUl0ZW0odCxlKSksRGkoKSx0LnN0eWxlLnNldFByb3BlcnR5KCJwYWRkaW5nLWJvdHRvbSIsYCR7bi5vZmZzZXRIZWlnaHR9cHhgKSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT50aGlzLm5vdGlmeVJlc2l6ZSgpKSkpKSxyJiYodGhpcy5fdXBkYXRlTWV0cmljcygpLHRoaXMuX3Bvc2l0aW9uSXRlbXMoKSl9X3VwZGF0ZURldGFpbHNDZWxsSGVpZ2h0cygpe0FycmF5LmZyb20odGhpcy4kLml0ZW1zLnF1ZXJ5U2VsZWN0b3JBbGwoJ1twYXJ0fj0iZGV0YWlscy1jZWxsIl06bm90KFtoaWRkZW5dKScpKS5mb3JFYWNoKCh0PT57dC5wYXJlbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCJwYWRkaW5nLWJvdHRvbSIsYCR7dC5vZmZzZXRIZWlnaHR9cHhgKX0pKX1faXNEZXRhaWxzT3BlbmVkKHQpe3JldHVybiB0aGlzLmRldGFpbHNPcGVuZWRJdGVtcyYmLTEhPT10aGlzLl9nZXRJdGVtSW5kZXhJbkFycmF5KHQsdGhpcy5kZXRhaWxzT3BlbmVkSXRlbXMpfW9wZW5JdGVtRGV0YWlscyh0KXt0aGlzLl9pc0RldGFpbHNPcGVuZWQodCl8fCh0aGlzLmRldGFpbHNPcGVuZWRJdGVtcz1bLi4udGhpcy5kZXRhaWxzT3BlbmVkSXRlbXMsdF0pfWNsb3NlSXRlbURldGFpbHModCl7dGhpcy5faXNEZXRhaWxzT3BlbmVkKHQpJiYodGhpcy5kZXRhaWxzT3BlbmVkSXRlbXM9dGhpcy5kZXRhaWxzT3BlbmVkSXRlbXMuZmlsdGVyKChlPT4hdGhpcy5faXRlbXNFcXVhbChlLHQpKSkpfV9kZXRhaWxzT3BlbmVkSW5zdGFuY2VDaGFuZ2VkQ2FsbGJhY2sodCxlKXtlP3RoaXMub3Blbkl0ZW1EZXRhaWxzKHQuaXRlbSk6dGhpcy5jbG9zZUl0ZW1EZXRhaWxzKHQuaXRlbSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLyxqJHQ9dD0+Y2xhc3MgZXh0ZW5kcyB0e3N0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntfZnJvemVuQ2VsbHM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxfcm93V2l0aEZvY3VzZWRFbGVtZW50OkVsZW1lbnQsX2RlbHRhWUFjYzp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3VzZVN0aWNreTp7dHlwZTpCb29sZWFuLHZhbHVlOndpbmRvdy5DU1MmJndpbmRvdy5DU1Muc3VwcG9ydHMmJih3aW5kb3cuQ1NTLnN1cHBvcnRzKCJwb3NpdGlvbiIsInN0aWNreSIpfHx3aW5kb3cuQ1NTLnN1cHBvcnRzKCJwb3NpdGlvbiIsIi13ZWJraXQtc3RpY2t5IikpfX19c3RhdGljIGdldCBvYnNlcnZlcnMoKXtyZXR1cm5bIl9zY3JvbGxWaWV3cG9ydEhlaWdodFVwZGF0ZWQoX3ZpZXdwb3J0SGVpZ2h0KSJdfXNldCBfc2Nyb2xsVG9wKHQpe3RoaXMuJC50YWJsZS5zY3JvbGxUb3A9dH1nZXQgX3Njcm9sbFRvcCgpe3JldHVybiB0aGlzLiQudGFibGUuc2Nyb2xsVG9wfWNvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9zY3JvbGxMaW5lSGVpZ2h0PXRoaXMuX2dldFNjcm9sbExpbmVIZWlnaHQoKX1fZ2V0U2Nyb2xsTGluZUhlaWdodCgpe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5zdHlsZS5mb250U2l6ZT0iaW5pdGlhbCIsdC5zdHlsZS5kaXNwbGF5PSJub25lIixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHQpO2NvbnN0IGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUodCkuZm9udFNpemU7cmV0dXJuIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodCksZT93aW5kb3cucGFyc2VJbnQoZSk6dm9pZCAwfV9zY3JvbGxWaWV3cG9ydEhlaWdodFVwZGF0ZWQodCl7dGhpcy5fc2Nyb2xsUGFnZUhlaWdodD10LXRoaXMuJC5oZWFkZXIuY2xpZW50SGVpZ2h0LXRoaXMuJC5mb290ZXIuY2xpZW50SGVpZ2h0LXRoaXMuX3Njcm9sbExpbmVIZWlnaHR9cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMuJC5vdXRlcnNjcm9sbGVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuc2Nyb2xsVGFyZ2V0PXRoaXMuJC50YWJsZSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoIndoZWVsIix0aGlzLl9vbldoZWVsKSx0aGlzLiQuaXRlbXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXNpbiIsKHQ9Pntjb25zdCBlPXQuY29tcG9zZWRQYXRoKCkuaW5kZXhPZih0aGlzLiQuaXRlbXMpO3RoaXMuX3Jvd1dpdGhGb2N1c2VkRWxlbWVudD10LmNvbXBvc2VkUGF0aCgpW2UtMV19KSksdGhpcy4kLml0ZW1zLmFkZEV2ZW50TGlzdGVuZXIoImZvY3Vzb3V0IiwoKCk9PnRoaXMuX3Jvd1dpdGhGb2N1c2VkRWxlbWVudD12b2lkIDApKSx0aGlzLnNjcm9sbFRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLCgoKT0+dGhpcy5fX21vdXNlRG93bj0hMCkpLHRoaXMuc2Nyb2xsVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCgoKT0+e3RoaXMuX19tb3VzZURvd249ITEsdGhpcy5fX3BlbmRpbmdSZW9yZGVyJiYodGhpcy5fX3BlbmRpbmdSZW9yZGVyPSExLHNldFRpbWVvdXQoKCgpPT50aGlzLl9yZW9yZGVyUm93cygpKSw1MDApKX0pKX1zY3JvbGxUb0luZGV4KHQpe3RoaXMuX2FjY2Vzc0lyb25MaXN0QVBJKCgoKT0+c3VwZXIuc2Nyb2xsVG9JbmRleCh0KSkpfV9vbldoZWVsKHQpe2lmKHQuY3RybEtleXx8dGhpcy5faGFzU2Nyb2xsZWRBbmNlc3Rvcih0LnRhcmdldCx0LmRlbHRhWCx0LmRlbHRhWSkpcmV0dXJuO2NvbnN0IGU9dGhpcy4kLnRhYmxlO2xldCBuPXQuZGVsdGFZO2lmKHQuZGVsdGFNb2RlPT09V2hlZWxFdmVudC5ET01fREVMVEFfTElORT9uKj10aGlzLl9zY3JvbGxMaW5lSGVpZ2h0OnQuZGVsdGFNb2RlPT09V2hlZWxFdmVudC5ET01fREVMVEFfUEFHRSYmKG4qPXRoaXMuX3Njcm9sbFBhZ2VIZWlnaHQpLHRoaXMuX3doZWVsQW5pbWF0aW9uRnJhbWUpcmV0dXJuIHRoaXMuX2RlbHRhWUFjYys9bix2b2lkIHQucHJldmVudERlZmF1bHQoKTtuKz10aGlzLl9kZWx0YVlBY2MsdGhpcy5fZGVsdGFZQWNjPTAsdGhpcy5fd2hlZWxBbmltYXRpb25GcmFtZT0hMCx0aGlzLl9kZWJvdW5jZXJXaGVlbEFuaW1hdGlvbkZyYW1lPVRuLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlcldoZWVsQW5pbWF0aW9uRnJhbWUsX3QsKCgpPT50aGlzLl93aGVlbEFuaW1hdGlvbkZyYW1lPSExKSk7Y29uc3QgaT1NYXRoLmFicyh0LmRlbHRhWCkrTWF0aC5hYnMobik7dGhpcy5fY2FuU2Nyb2xsKGUsdC5kZWx0YVgsbik/KHQucHJldmVudERlZmF1bHQoKSxlLnNjcm9sbFRvcCs9bixlLnNjcm9sbExlZnQrPXQuZGVsdGFYLHRoaXMuX3Njcm9sbEhhbmRsZXIoKSx0aGlzLl9oYXNSZXNpZHVhbE1vbWVudHVtPSEwLHRoaXMuX2lnbm9yZU5ld1doZWVsPSEwLHRoaXMuX2RlYm91bmNlcklnbm9yZU5ld1doZWVsPVRuLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlcklnbm9yZU5ld1doZWVsLGd0LmFmdGVyKDUwMCksKCgpPT50aGlzLl9pZ25vcmVOZXdXaGVlbD0hMSkpKTp0aGlzLl9oYXNSZXNpZHVhbE1vbWVudHVtJiZpPD10aGlzLl9wcmV2aW91c01vbWVudHVtfHx0aGlzLl9pZ25vcmVOZXdXaGVlbD90LnByZXZlbnREZWZhdWx0KCk6aT50aGlzLl9wcmV2aW91c01vbWVudHVtJiYodGhpcy5faGFzUmVzaWR1YWxNb21lbnR1bT0hMSksdGhpcy5fcHJldmlvdXNNb21lbnR1bT1pfV9oYXNTY3JvbGxlZEFuY2VzdG9yKHQsZSxuKXtyZXR1cm4idmFhZGluLWdyaWQtY2VsbC1jb250ZW50IiE9PXQubG9jYWxOYW1lJiYoISghdGhpcy5fY2FuU2Nyb2xsKHQsZSxuKXx8LTE9PT1bImF1dG8iLCJzY3JvbGwiXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUodCkub3ZlcmZsb3cpKXx8KHQhPT10aGlzJiZ0LnBhcmVudEVsZW1lbnQ/dGhpcy5faGFzU2Nyb2xsZWRBbmNlc3Rvcih0LnBhcmVudEVsZW1lbnQsZSxuKTp2b2lkIDApKX1fY2FuU2Nyb2xsKHQsZSxuKXtyZXR1cm4gbj4wJiZ0LnNjcm9sbFRvcDx0LnNjcm9sbEhlaWdodC10Lm9mZnNldEhlaWdodHx8bjwwJiZ0LnNjcm9sbFRvcD4wfHxlPjAmJnQuc2Nyb2xsTGVmdDx0LnNjcm9sbFdpZHRoLXQub2Zmc2V0V2lkdGh8fGU8MCYmdC5zY3JvbGxMZWZ0PjB9X3NjaGVkdWxlU2Nyb2xsaW5nKCl7dGhpcy5fc2Nyb2xsaW5nRnJhbWV8fCh0aGlzLl9zY3JvbGxpbmdGcmFtZT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT50aGlzLl90b2dnbGVBdHRyaWJ1dGUoInNjcm9sbGluZyIsITAsdGhpcy4kLnNjcm9sbGVyKSkpKSx0aGlzLl9kZWJvdW5jZVNjcm9sbGluZz1Ubi5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZVNjcm9sbGluZyxndC5hZnRlcig1MDApLCgoKT0+e2NhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3Njcm9sbGluZ0ZyYW1lKSxkZWxldGUgdGhpcy5fc2Nyb2xsaW5nRnJhbWUsdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJzY3JvbGxpbmciLCExLHRoaXMuJC5zY3JvbGxlciksdGhpcy5fcmVvcmRlclJvd3MoKX0pKX1fYWZ0ZXJTY3JvbGwoKXt0aGlzLl90cmFuc2xhdGVTdGF0aW9uYXJ5RWxlbWVudHMoKSx0aGlzLmhhc0F0dHJpYnV0ZSgicmVvcmRlcmluZyIpfHx0aGlzLl9zY2hlZHVsZVNjcm9sbGluZygpLHRoaXMuX3VwZGF0ZU92ZXJmbG93KCl9X3VwZGF0ZU92ZXJmbG93KCl7bGV0IHQ9IiI7Y29uc3QgZT10aGlzLiQudGFibGU7ZS5zY3JvbGxUb3A8ZS5zY3JvbGxIZWlnaHQtZS5jbGllbnRIZWlnaHQmJih0Kz0iIGJvdHRvbSIpLGUuc2Nyb2xsVG9wPjAmJih0Kz0iIHRvcCIpLGUuc2Nyb2xsTGVmdDxlLnNjcm9sbFdpZHRoLWUuY2xpZW50V2lkdGgmJih0Kz0iIHJpZ2h0IiksZS5zY3JvbGxMZWZ0PjAmJih0Kz0iIGxlZnQiKSx0aGlzLl9kZWJvdW5jZU92ZXJmbG93PVRuLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlT3ZlcmZsb3csX3QsKCgpPT57Y29uc3QgZT10LnRyaW0oKTtlLmxlbmd0aD4wJiZ0aGlzLmdldEF0dHJpYnV0ZSgib3ZlcmZsb3ciKSE9PWU/dGhpcy5zZXRBdHRyaWJ1dGUoIm92ZXJmbG93IixlKTowPT1lLmxlbmd0aCYmdGhpcy5oYXNBdHRyaWJ1dGUoIm92ZXJmbG93IikmJnRoaXMucmVtb3ZlQXR0cmlidXRlKCJvdmVyZmxvdyIpfSkpfV9yZW9yZGVyUm93cygpe2lmKHRoaXMuX19tb3VzZURvd24pcmV0dXJuIHZvaWQodGhpcy5fX3BlbmRpbmdSZW9yZGVyPSEwKTtjb25zdCB0PXRoaXMuJC5pdGVtcyxlPXQucXVlcnlTZWxlY3RvckFsbCgidHIiKTtpZighZS5sZW5ndGgpcmV0dXJuO2NvbnN0IG49dGhpcy5fdmlydHVhbFN0YXJ0K3RoaXMuX3ZpZHhPZmZzZXQsaT10aGlzLl9yb3dXaXRoRm9jdXNlZEVsZW1lbnR8fEFycmF5LmZyb20oZSkuZmlsdGVyKCh0PT4hdC5oaWRkZW4pKVswXTtpZighaSlyZXR1cm47Y29uc3Qgcj1pLmluZGV4LW4sbz1BcnJheS5mcm9tKGUpLmluZGV4T2YoaSktcjtpZihvPjApZm9yKGxldCBuPTA7bjxvO24rKyl0LmFwcGVuZENoaWxkKGVbbl0pO2Vsc2UgaWYobzwwKWZvcihsZXQgbj1lLmxlbmd0aCtvO248ZS5sZW5ndGg7bisrKXQuaW5zZXJ0QmVmb3JlKGVbbl0sZVswXSk7aWYodGhpcy5fc2FmYXJpKXtjb25zdHt0cmFuc2Zvcm06dH09dGhpcy4kLmhlYWRlci5zdHlsZTt0aGlzLiQuaGVhZGVyLnN0eWxlLnRyYW5zZm9ybT0iIixzZXRUaW1lb3V0KCgoKT0+dGhpcy4kLmhlYWRlci5zdHlsZS50cmFuc2Zvcm09dCkpfX1fZnJvemVuQ2VsbHNDaGFuZ2VkKCl7dGhpcy5fZGVib3VuY2VyQ2FjaGVFbGVtZW50cz1Ubi5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZXJDYWNoZUVsZW1lbnRzLHZ0LCgoKT0+e0FycmF5LmZyb20odGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ1twYXJ0fj0iY2VsbCJdJykpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNmb3JtPSIifSkpLHRoaXMuX2Zyb3plbkNlbGxzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuJC50YWJsZS5xdWVyeVNlbGVjdG9yQWxsKCJbZnJvemVuXSIpKSx0aGlzLl91cGRhdGVTY3JvbGxlck1lYXN1cmVtZW50cygpLHRoaXMuX3RyYW5zbGF0ZVN0YXRpb25hcnlFbGVtZW50cygpfSkpLHRoaXMuX3VwZGF0ZUxhc3RGcm96ZW4oKX1fdXBkYXRlU2Nyb2xsZXJNZWFzdXJlbWVudHMoKXt0aGlzLl9mcm96ZW5DZWxscy5sZW5ndGg+MCYmdGhpcy5fX2lzUlRMJiYodGhpcy5fX3Njcm9sbGVyTWV0cmljcz17c2Nyb2xsV2lkdGg6dGhpcy4kLnRhYmxlLnNjcm9sbFdpZHRoLGNsaWVudFdpZHRoOnRoaXMuJC50YWJsZS5jbGllbnRXaWR0aH0pfV91cGRhdGVMYXN0RnJvemVuKCl7aWYoIXRoaXMuX2NvbHVtblRyZWUpcmV0dXJuO2NvbnN0IHQ9dGhpcy5fY29sdW1uVHJlZVt0aGlzLl9jb2x1bW5UcmVlLmxlbmd0aC0xXS5zbGljZSgwKTt0LnNvcnQoKCh0LGUpPT50Ll9vcmRlci1lLl9vcmRlcikpO2NvbnN0IGU9dC5yZWR1Y2UoKCh0LGUsbik9PihlLl9sYXN0RnJvemVuPSExLGUuZnJvemVuJiYhZS5oaWRkZW4/bjp0KSksdm9pZCAwKTt2b2lkIDAhPT1lJiYodFtlXS5fbGFzdEZyb3plbj0hMCl9X3RyYW5zbGF0ZVN0YXRpb25hcnlFbGVtZW50cygpe2NvbnN0IHQ9TWF0aC5tYXgoMCx0aGlzLl9zY3JvbGxMZWZ0KSxlPU1hdGgubWF4KDAsdGhpcy5fc2Nyb2xsVG9wKTtsZXQgbj0wLGk9MCxyPTA7aWYodGhpcy5fdXNlU3RpY2t5fHwobj10LGk9ZSxyPXRoaXMuJC50YWJsZS5jbGllbnRIZWlnaHQtdGhpcy4kLmZvb3Rlci5vZmZzZXRIZWlnaHQtdGhpcy4kLmZvb3Rlci5vZmZzZXRUb3ApLHRoaXMuJC5oZWFkZXIuc3R5bGUudHJhbnNmb3JtPXRoaXMuX2dldFRyYW5zbGF0ZSgtdCtuLGkpLHRoaXMuJC5mb290ZXIuc3R5bGUudHJhbnNmb3JtPXRoaXMuX2dldFRyYW5zbGF0ZSgtdCtuLGkrciksdGhpcy4kLml0ZW1zLnN0eWxlLnRyYW5zZm9ybT10aGlzLl9nZXRUcmFuc2xhdGUoLXQrbiwwKSx0aGlzLl9mcm96ZW5DZWxscy5sZW5ndGg+MCl7Y29uc3QgdD10aGlzLl9faXNSVEw/dGhpcy5fX2dldE5vcm1hbGl6ZWRTY3JvbGxMZWZ0KHRoaXMuJC50YWJsZSkrdGhpcy5fX3Njcm9sbGVyTWV0cmljcy5jbGllbnRXaWR0aC10aGlzLl9fc2Nyb2xsZXJNZXRyaWNzLnNjcm9sbFdpZHRoOnRoaXMuX3Njcm9sbExlZnQsZT10aGlzLl9nZXRUcmFuc2xhdGUodCwwKTtmb3IobGV0IHQ9MDt0PHRoaXMuX2Zyb3plbkNlbGxzLmxlbmd0aDt0KyspdGhpcy5fZnJvemVuQ2VsbHNbdF0uc3R5bGUudHJhbnNmb3JtPWV9fV9nZXRUcmFuc2xhdGUodCxlKXtyZXR1cm5gdHJhbnNsYXRlKCR7dH1weCwgJHtlfXB4KWB9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLyxHJHQ9dD0+Y2xhc3MgZXh0ZW5kcyB0e3N0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntzZWxlY3RlZEl0ZW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsdmFsdWU6KCk9PltdfX19c3RhdGljIGdldCBvYnNlcnZlcnMoKXtyZXR1cm5bIl9zZWxlY3RlZEl0ZW1zQ2hhbmdlZChzZWxlY3RlZEl0ZW1zLiopIl19X2lzU2VsZWN0ZWQodCl7cmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtcyYmdGhpcy5fZ2V0SXRlbUluZGV4SW5BcnJheSh0LHRoaXMuc2VsZWN0ZWRJdGVtcyk+LTF9c2VsZWN0SXRlbSh0KXt0aGlzLl9pc1NlbGVjdGVkKHQpfHwodGhpcy5zZWxlY3RlZEl0ZW1zPVsuLi50aGlzLnNlbGVjdGVkSXRlbXMsdF0pfWRlc2VsZWN0SXRlbSh0KXt0aGlzLl9pc1NlbGVjdGVkKHQpJiYodGhpcy5zZWxlY3RlZEl0ZW1zPXRoaXMuc2VsZWN0ZWRJdGVtcy5maWx0ZXIoKGU9PiF0aGlzLl9pdGVtc0VxdWFsKGUsdCkpKSl9X3RvZ2dsZUl0ZW0odCl7LTE9PT10aGlzLl9nZXRJdGVtSW5kZXhJbkFycmF5KHQsdGhpcy5zZWxlY3RlZEl0ZW1zKT90aGlzLnNlbGVjdEl0ZW0odCk6dGhpcy5kZXNlbGVjdEl0ZW0odCl9X3NlbGVjdGVkSXRlbXNDaGFuZ2VkKHQpeyF0aGlzLiQuaXRlbXMuY2hpbGRyZW4ubGVuZ3RofHwic2VsZWN0ZWRJdGVtcyIhPT10LnBhdGgmJiJzZWxlY3RlZEl0ZW1zLnNwbGljZXMiIT09dC5wYXRofHxBcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZm9yRWFjaCgodD0+e3RoaXMuX3VwZGF0ZUl0ZW0odCx0Ll9pdGVtKX0pKX1fc2VsZWN0ZWRJbnN0YW5jZUNoYW5nZWRDYWxsYmFjayh0LGUpe2U/dGhpcy5zZWxlY3RJdGVtKHQuaXRlbSk6dGhpcy5kZXNlbGVjdEl0ZW0odC5pdGVtKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovLFckdD10PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue211bHRpU29ydDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfc29ydGVyczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX3ByZXZpb3VzU29ydGVyczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19fXJlYWR5KCl7c3VwZXIucmVhZHkoKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoInNvcnRlci1jaGFuZ2VkIix0aGlzLl9vblNvcnRlckNoYW5nZWQpfV9vblNvcnRlckNoYW5nZWQodCl7Y29uc3QgZT10LnRhcmdldDt0LnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuX191cGRhdGVTb3J0ZXIoZSksdGhpcy5fX2FwcGx5U29ydGVycygpfV9fcmVtb3ZlU29ydGVycyh0KXswIT10Lmxlbmd0aCYmKHRoaXMuX3NvcnRlcnM9dGhpcy5fc29ydGVycy5maWx0ZXIoKGU9PnQuaW5kZXhPZihlKTwwKSksdGhpcy5tdWx0aVNvcnQmJnRoaXMuX191cGRhdGVTb3J0T3JkZXJzKCksdGhpcy5fX2FwcGx5U29ydGVycygpKX1fX3VwZGF0ZVNvcnRPcmRlcnMoKXt0aGlzLl9zb3J0ZXJzLmZvckVhY2goKCh0LGUpPT50Ll9vcmRlcj10aGlzLl9zb3J0ZXJzLmxlbmd0aD4xP2U6bnVsbCksdGhpcyl9X191cGRhdGVTb3J0ZXIodCl7aWYodC5kaXJlY3Rpb258fC0xIT09dGhpcy5fc29ydGVycy5pbmRleE9mKHQpKWlmKHQuX29yZGVyPW51bGwsdGhpcy5tdWx0aVNvcnQpdGhpcy5fcmVtb3ZlQXJyYXlJdGVtKHRoaXMuX3NvcnRlcnMsdCksdC5kaXJlY3Rpb24mJnRoaXMuX3NvcnRlcnMudW5zaGlmdCh0KSx0aGlzLl9fdXBkYXRlU29ydE9yZGVycygpO2Vsc2UgaWYodC5kaXJlY3Rpb24pe2NvbnN0IGU9dGhpcy5fc29ydGVycy5maWx0ZXIoKGU9PmUhPXQpKTt0aGlzLl9zb3J0ZXJzPVt0XSxlLmZvckVhY2goKHQ9Pnt0Ll9vcmRlcj1udWxsLHQuZGlyZWN0aW9uPW51bGx9KSl9fV9fYXBwbHlTb3J0ZXJzKCl7dGhpcy5kYXRhUHJvdmlkZXImJnRoaXMuaXNBdHRhY2hlZCYmSlNPTi5zdHJpbmdpZnkodGhpcy5fcHJldmlvdXNTb3J0ZXJzKSE9PUpTT04uc3RyaW5naWZ5KHRoaXMuX21hcFNvcnRlcnMoKSkmJnRoaXMuY2xlYXJDYWNoZSgpLHRoaXMuX2ExMXlVcGRhdGVTb3J0ZXJzKCksdGhpcy5fcHJldmlvdXNTb3J0ZXJzPXRoaXMuX21hcFNvcnRlcnMoKX1fbWFwU29ydGVycygpe3JldHVybiB0aGlzLl9zb3J0ZXJzLm1hcCgodD0+KHtwYXRoOnQucGF0aCxkaXJlY3Rpb246dC5kaXJlY3Rpb259KSkpfV9yZW1vdmVBcnJheUl0ZW0odCxlKXtjb25zdCBuPXQuaW5kZXhPZihlKTtuPi0xJiZ0LnNwbGljZShuLDEpfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi8scSR0PXQ9PmNsYXNzIGV4dGVuZHMgdHtzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKXtyZXR1cm57Y2VsbENsYXNzTmFtZUdlbmVyYXRvcjpGdW5jdGlvbn19c3RhdGljIGdldCBvYnNlcnZlcnMoKXtyZXR1cm5bIl9fY2VsbENsYXNzTmFtZUdlbmVyYXRvckNoYW5nZWQoY2VsbENsYXNzTmFtZUdlbmVyYXRvcikiXX1fX2NlbGxDbGFzc05hbWVHZW5lcmF0b3JDaGFuZ2VkKCl7dGhpcy5nZW5lcmF0ZUNlbGxDbGFzc05hbWVzKCl9Z2VuZXJhdGVDZWxsQ2xhc3NOYW1lcygpe0FycmF5LmZyb20odGhpcy4kLml0ZW1zLmNoaWxkcmVuKS5maWx0ZXIoKHQ9PiF0LmhpZGRlbikpLmZvckVhY2goKHQ9PnRoaXMuX2dlbmVyYXRlQ2VsbENsYXNzTmFtZXModCx0aGlzLl9fZ2V0Um93TW9kZWwodCkpKSl9X2dlbmVyYXRlQ2VsbENsYXNzTmFtZXModCxlKXtBcnJheS5mcm9tKHQuY2hpbGRyZW4pLmZvckVhY2goKHQ9PntpZih0Ll9fZ2VuZXJhdGVkQ2xhc3NlcyYmdC5fX2dlbmVyYXRlZENsYXNzZXMuZm9yRWFjaCgoZT0+dC5jbGFzc0xpc3QucmVtb3ZlKGUpKSksdGhpcy5jZWxsQ2xhc3NOYW1lR2VuZXJhdG9yKXtjb25zdCBuPXRoaXMuY2VsbENsYXNzTmFtZUdlbmVyYXRvcih0Ll9jb2x1bW4sZSk7dC5fX2dlbmVyYXRlZENsYXNzZXM9biYmbi5zcGxpdCgiICIpLmZpbHRlcigodD0+dC5sZW5ndGg+MCkpLHQuX19nZW5lcmF0ZWRDbGFzc2VzJiZ0Ll9fZ2VuZXJhdGVkQ2xhc3Nlcy5mb3JFYWNoKChlPT50LmNsYXNzTGlzdC5hZGQoZSkpKX19KSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLyxZJHQ9ImJldHdlZW4iLFgkdD0ib24tdG9wLW9yLWJldHdlZW4iLCQkdD0iYWJvdmUiLEskdD0iYmVsb3ciLFokdD0iZW1wdHkiLEokdD10PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue2Ryb3BNb2RlOlN0cmluZyxyb3dzRHJhZ2dhYmxlOkJvb2xlYW4sZHJhZ0ZpbHRlcjpGdW5jdGlvbixkcm9wRmlsdGVyOkZ1bmN0aW9uLF9fZG5kQXV0b1Njcm9sbFRocmVzaG9sZDp7dmFsdWU6NTB9fX1zdGF0aWMgZ2V0IG9ic2VydmVycygpe3JldHVyblsiX2RyYWdEcm9wQWNjZXNzQ2hhbmdlZChyb3dzRHJhZ2dhYmxlLCBkcm9wTW9kZSwgZHJhZ0ZpbHRlciwgZHJvcEZpbHRlcikiXX1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy4kLnRhYmxlLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdzdGFydCIsdGhpcy5fb25EcmFnU3RhcnQuYmluZCh0aGlzKSksdGhpcy4kLnRhYmxlLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdlbmQiLHRoaXMuX29uRHJhZ0VuZC5iaW5kKHRoaXMpKSx0aGlzLiQudGFibGUuYWRkRXZlbnRMaXN0ZW5lcigiZHJhZ292ZXIiLHRoaXMuX29uRHJhZ092ZXIuYmluZCh0aGlzKSksdGhpcy4kLnRhYmxlLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdsZWF2ZSIsdGhpcy5fb25EcmFnTGVhdmUuYmluZCh0aGlzKSksdGhpcy4kLnRhYmxlLmFkZEV2ZW50TGlzdGVuZXIoImRyb3AiLHRoaXMuX29uRHJvcC5iaW5kKHRoaXMpKSx0aGlzLiQudGFibGUuYWRkRXZlbnRMaXN0ZW5lcigiZHJhZ2VudGVyIiwodD0+e3RoaXMuZHJvcE1vZGUmJih0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSl9KSl9X29uRHJhZ1N0YXJ0KHQpe2lmKHRoaXMucm93c0RyYWdnYWJsZSl7bGV0IGU9dC50YXJnZXQ7aWYoInZhYWRpbi1ncmlkLWNlbGwtY29udGVudCI9PT1lLmxvY2FsTmFtZSYmKGU9ZS5hc3NpZ25lZFNsb3QucGFyZW50Tm9kZS5wYXJlbnROb2RlKSxlLnBhcmVudE5vZGUhPT10aGlzLiQuaXRlbXMpcmV0dXJuO2lmKHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJkcmFnZ2luZy1yb3dzIiwhMCx0aGlzKSx0aGlzLl9zYWZhcmkpe2NvbnN0IHQ9ZS5zdHlsZS50cmFuc2Zvcm07ZS5zdHlsZS50b3A9L3RyYW5zbGF0ZVlcKCguKilcKS8uZXhlYyh0KVsxXSxlLnN0eWxlLnRyYW5zZm9ybT0ibm9uZSIscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+e2Uuc3R5bGUudG9wPSIiLGUuc3R5bGUudHJhbnNmb3JtPXR9KSl9Y29uc3Qgbj1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMuX2lvcz90LmRhdGFUcmFuc2Zlci5zZXREcmFnSW1hZ2UoZSk6dC5kYXRhVHJhbnNmZXIuc2V0RHJhZ0ltYWdlKGUsdC5jbGllbnRYLW4ubGVmdCx0LmNsaWVudFktbi50b3ApO2xldCBpPVtlXTt0aGlzLl9pc1NlbGVjdGVkKGUuX2l0ZW0pJiYoaT10aGlzLl9fZ2V0Vmlld3BvcnRSb3dzKCkuZmlsdGVyKCh0PT50aGlzLl9pc1NlbGVjdGVkKHQuX2l0ZW0pKSkuZmlsdGVyKCh0PT4hdGhpcy5kcmFnRmlsdGVyfHx0aGlzLmRyYWdGaWx0ZXIodGhpcy5fX2dldFJvd01vZGVsKHQpKSkpKSx0LmRhdGFUcmFuc2Zlci5zZXREYXRhKCJ0ZXh0Iix0aGlzLl9fZm9ybWF0RGVmYXVsdFRyYW5zZmVyRGF0YShpKSksZS5zZXRBdHRyaWJ1dGUoImRyYWdzdGFydCIsaS5sZW5ndGg+MT9pLmxlbmd0aDoiIiksdGhpcy51cGRhdGVTdHlsZXMoeyItLV9ncmlkLWRyYWctc3RhcnQteCI6dC5jbGllbnRYLW4ubGVmdCsyMCsicHgiLCItLV9ncmlkLWRyYWctc3RhcnQteSI6dC5jbGllbnRZLW4udG9wKzEwKyJweCJ9KSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT57ZS5yZW1vdmVBdHRyaWJ1dGUoImRyYWdzdGFydCIpLHRoaXMudXBkYXRlU3R5bGVzKHsiLS1fZ3JpZC1kcmFnLXN0YXJ0LXgiOiIiLCItLV9ncmlkLWRyYWctc3RhcnQteSI6IiJ9KX0pKTtjb25zdCByPW5ldyBDdXN0b21FdmVudCgiZ3JpZC1kcmFnc3RhcnQiLHtkZXRhaWw6e2RyYWdnZWRJdGVtczppLm1hcCgodD0+dC5faXRlbSkpLHNldERyYWdEYXRhOihlLG4pPT50LmRhdGFUcmFuc2Zlci5zZXREYXRhKGUsbiksc2V0RHJhZ2dlZEl0ZW1zQ291bnQ6dD0+ZS5zZXRBdHRyaWJ1dGUoImRyYWdzdGFydCIsdCl9fSk7ci5vcmlnaW5hbEV2ZW50PXQsdGhpcy5kaXNwYXRjaEV2ZW50KHIpfX1fb25EcmFnRW5kKHQpe3RoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgiZHJhZ2dpbmctcm93cyIsITEsdGhpcyksdC5zdG9wUHJvcGFnYXRpb24oKTtjb25zdCBlPW5ldyBDdXN0b21FdmVudCgiZ3JpZC1kcmFnZW5kIik7ZS5vcmlnaW5hbEV2ZW50PXQsdGhpcy5kaXNwYXRjaEV2ZW50KGUpfV9vbkRyYWdMZWF2ZSh0KXt0LnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuX2NsZWFyRHJhZ1N0eWxlcygpfV9vbkRyYWdPdmVyKHQpe2lmKHRoaXMuZHJvcE1vZGUpe2lmKHRoaXMuX2Ryb3BMb2NhdGlvbj12b2lkIDAsdGhpcy5fZHJhZ092ZXJJdGVtPXZvaWQgMCx0aGlzLl9fZG5kQXV0b1Njcm9sbCh0LmNsaWVudFkpKXJldHVybiB2b2lkIHRoaXMuX2NsZWFyRHJhZ1N0eWxlcygpO2xldCBlPXQuY29tcG9zZWRQYXRoKCkuZmlsdGVyKCh0PT4idHIiPT09dC5sb2NhbE5hbWUpKVswXTtpZih0aGlzLl9lZmZlY3RpdmVTaXplJiYib24tZ3JpZCIhPT10aGlzLmRyb3BNb2RlKWlmKGUmJmUucGFyZW50Tm9kZT09PXRoaXMuJC5pdGVtcyl7Y29uc3Qgbj1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMuX2Ryb3BMb2NhdGlvbj0ib24tdG9wIix0aGlzLmRyb3BNb2RlPT09WSR0P3RoaXMuX2Ryb3BMb2NhdGlvbj10LmNsaWVudFktbi50b3A8bi5ib3R0b20tdC5jbGllbnRZPyQkdDpLJHQ6dGhpcy5kcm9wTW9kZT09PVgkdCYmKHQuY2xpZW50WS1uLnRvcDxuLmhlaWdodC8zP3RoaXMuX2Ryb3BMb2NhdGlvbj0kJHQ6dC5jbGllbnRZLW4udG9wPm4uaGVpZ2h0LzMqMiYmKHRoaXMuX2Ryb3BMb2NhdGlvbj1LJHQpKX1lbHNle2lmKGUpcmV0dXJuO2lmKHRoaXMuZHJvcE1vZGUhPT1ZJHQmJnRoaXMuZHJvcE1vZGUhPT1YJHQpcmV0dXJuO2U9QXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pLmZpbHRlcigodD0+IXQuaGlkZGVuKSkucG9wKCksdGhpcy5fZHJvcExvY2F0aW9uPUskdH1lbHNlIHRoaXMuX2Ryb3BMb2NhdGlvbj1aJHQ7aWYoZSYmZS5oYXNBdHRyaWJ1dGUoImRyb3AtZGlzYWJsZWQiKSlyZXR1cm4gdm9pZCh0aGlzLl9kcm9wTG9jYXRpb249dm9pZCAwKTt0LnN0b3BQcm9wYWdhdGlvbigpLHQucHJldmVudERlZmF1bHQoKSx0aGlzLl9kcm9wTG9jYXRpb249PT1aJHQ/dGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJkcmFnb3ZlciIsITAsdGhpcyk6ZT8odGhpcy5fZHJhZ092ZXJJdGVtPWUuX2l0ZW0sZS5nZXRBdHRyaWJ1dGUoImRyYWdvdmVyIikhPT10aGlzLl9kcm9wTG9jYXRpb24mJmUuc2V0QXR0cmlidXRlKCJkcmFnb3ZlciIsdGhpcy5fZHJvcExvY2F0aW9uKSk6dGhpcy5fY2xlYXJEcmFnU3R5bGVzKCl9fV9fZG5kQXV0b1Njcm9sbCh0KXtpZih0aGlzLl9fZG5kQXV0b1Njcm9sbGluZylyZXR1cm4hMDtjb25zdCBlPXRoaXMuJC5oZWFkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tLG49dGhpcy4kLmZvb3Rlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AsaT1lLXQrdGhpcy5fX2RuZEF1dG9TY3JvbGxUaHJlc2hvbGQscj10LW4rdGhpcy5fX2RuZEF1dG9TY3JvbGxUaHJlc2hvbGQ7bGV0IG89MDtpZihyPjA/bz0yKnI6aT4wJiYobz0yKi1pKSxvKXtjb25zdCB0PXRoaXMuJC50YWJsZS5zY3JvbGxUb3A7aWYodGhpcy4kLnRhYmxlLnNjcm9sbFRvcCs9byx0IT09dGhpcy4kLnRhYmxlLnNjcm9sbFRvcClyZXR1cm4gdGhpcy5fX2RuZEF1dG9TY3JvbGxpbmc9ITAsc2V0VGltZW91dCgoKCk9PnRoaXMuX19kbmRBdXRvU2Nyb2xsaW5nPSExKSwyMCksdGhpcy5fc2Nyb2xsSGFuZGxlcigpLCEwfX1fX2dldFZpZXdwb3J0Um93cygpe2NvbnN0IHQ9dGhpcy4kLmhlYWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20sZT10aGlzLiQuZm9vdGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pLmZpbHRlcigobj0+e2NvbnN0IGk9bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4gaS5ib3R0b20+dCYmaS50b3A8ZX0pKX1fY2xlYXJEcmFnU3R5bGVzKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImRyYWdvdmVyIiksQXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pLmZvckVhY2goKHQ9PnQucmVtb3ZlQXR0cmlidXRlKCJkcmFnb3ZlciIpKSl9X29uRHJvcCh0KXtpZih0aGlzLmRyb3BNb2RlKXt0LnN0b3BQcm9wYWdhdGlvbigpLHQucHJldmVudERlZmF1bHQoKTtjb25zdCBlPXQuZGF0YVRyYW5zZmVyLnR5cGVzJiZBcnJheS5mcm9tKHQuZGF0YVRyYW5zZmVyLnR5cGVzKS5tYXAoKGU9Pih7dHlwZTplLGRhdGE6dC5kYXRhVHJhbnNmZXIuZ2V0RGF0YShlKX0pKSk7dGhpcy5fY2xlYXJEcmFnU3R5bGVzKCk7Y29uc3Qgbj1uZXcgQ3VzdG9tRXZlbnQoImdyaWQtZHJvcCIse2J1YmJsZXM6dC5idWJibGVzLGNhbmNlbGFibGU6dC5jYW5jZWxhYmxlLGRldGFpbDp7ZHJvcFRhcmdldEl0ZW06dGhpcy5fZHJhZ092ZXJJdGVtLGRyb3BMb2NhdGlvbjp0aGlzLl9kcm9wTG9jYXRpb24sZHJhZ0RhdGE6ZX19KTtuLm9yaWdpbmFsRXZlbnQ9dCx0aGlzLmRpc3BhdGNoRXZlbnQobil9fV9fZm9ybWF0RGVmYXVsdFRyYW5zZmVyRGF0YSh0KXtyZXR1cm4gdC5tYXAoKHQ9PkFycmF5LmZyb20odC5jaGlsZHJlbikuZmlsdGVyKCh0PT4hdC5oaWRkZW4mJi0xPT09dC5nZXRBdHRyaWJ1dGUoInBhcnQiKS5pbmRleE9mKCJkZXRhaWxzLWNlbGwiKSkpLnNvcnQoKCh0LGUpPT50Ll9jb2x1bW4uX29yZGVyPmUuX2NvbHVtbi5fb3JkZXI/MTotMSkpLm1hcCgodD0+dC5fY29udGVudC50ZXh0Q29udGVudC50cmltKCkpKS5maWx0ZXIoKHQ9PnQpKS5qb2luKCJcdCIpKSkuam9pbigiXG4iKX1fZHJhZ0Ryb3BBY2Nlc3NDaGFuZ2VkKCl7dGhpcy5maWx0ZXJEcmFnQW5kRHJvcCgpfWZpbHRlckRyYWdBbmREcm9wKCl7QXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pLmZpbHRlcigodD0+IXQuaGlkZGVuKSkuZm9yRWFjaCgodD0+e3RoaXMuX2ZpbHRlckRyYWdBbmREcm9wKHQsdGhpcy5fX2dldFJvd01vZGVsKHQpKX0pKX1fZmlsdGVyRHJhZ0FuZERyb3AodCxlKXtjb25zdCBuPSF0aGlzLnJvd3NEcmFnZ2FibGV8fHRoaXMuZHJhZ0ZpbHRlciYmIXRoaXMuZHJhZ0ZpbHRlcihlKSxpPSF0aGlzLmRyb3BNb2RlfHx0aGlzLmRyb3BGaWx0ZXImJiF0aGlzLmRyb3BGaWx0ZXIoZSk7QXJyYXkuZnJvbSh0LmNoaWxkcmVuKS5tYXAoKHQ9PnQuX2NvbnRlbnQpKS5mb3JFYWNoKCh0PT57bj90LnJlbW92ZUF0dHJpYnV0ZSgiZHJhZ2dhYmxlIik6dC5zZXRBdHRyaWJ1dGUoImRyYWdnYWJsZSIsITApfSkpLHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgiZHJhZy1kaXNhYmxlZCIsbix0KSx0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImRyb3AtZGlzYWJsZWQiLGksdCl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLyxRJHQ9dD0+Y2xhc3MgZXh0ZW5kcyB0e3N0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntfaGVhZGVyRm9jdXNhYmxlOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX2ZvY3VzYWJsZUNoYW5nZWQifSxfaXRlbXNGb2N1c2FibGU6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfZm9jdXNhYmxlQ2hhbmdlZCJ9LF9mb290ZXJGb2N1c2FibGU6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfZm9jdXNhYmxlQ2hhbmdlZCJ9LF9uYXZpZ2F0aW5nSXNIaWRkZW46Qm9vbGVhbixfZm9jdXNlZEl0ZW1JbmRleDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX2ZvY3VzZWRDb2x1bW5PcmRlcjpOdW1iZXIsaW50ZXJhY3Rpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAscmVhZE9ubHk6ITAsb2JzZXJ2ZXI6Il9pbnRlcmFjdGluZ0NoYW5nZWQifX19cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMuX2lvc3x8dGhpcy5fYW5kcm9pZHx8KHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5fb25LZXlEb3duKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIix0aGlzLl9vbktleVVwKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzaW4iLHRoaXMuX29uRm9jdXNJbiksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJmb2N1c291dCIsdGhpcy5fb25Gb2N1c091dCksdGhpcy4kLnRhYmxlLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzaW4iLHRoaXMuX29uQ2VsbEZvY3VzSW4uYmluZCh0aGlzKSksdGhpcy4kLnRhYmxlLmFkZEV2ZW50TGlzdGVuZXIoImZvY3Vzb3V0Iix0aGlzLl9vbkNlbGxGb2N1c091dC5iaW5kKHRoaXMpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsKCgpPT57dGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJuYXZpZ2F0aW5nIiwhMSx0aGlzKSx0aGlzLl9pc01vdXNlZG93bj0hMH0pKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCgoKT0+dGhpcy5faXNNb3VzZWRvd249ITEpKSl9X2ZvY3VzYWJsZUNoYW5nZWQodCxlKXtlJiZlLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCItMSIpLHQmJnRoaXMuX3VwZGF0ZUdyaWRTZWN0aW9uRm9jdXNUYXJnZXQodCl9X2ludGVyYWN0aW5nQ2hhbmdlZCgpe3RoaXMuX3VwZGF0ZUdyaWRTZWN0aW9uRm9jdXNUYXJnZXQodGhpcy5faGVhZGVyRm9jdXNhYmxlKSx0aGlzLl91cGRhdGVHcmlkU2VjdGlvbkZvY3VzVGFyZ2V0KHRoaXMuX2l0ZW1zRm9jdXNhYmxlKSx0aGlzLl91cGRhdGVHcmlkU2VjdGlvbkZvY3VzVGFyZ2V0KHRoaXMuX2Zvb3RlckZvY3VzYWJsZSl9X29uS2V5RG93bih0KXtjb25zdCBlPXQua2V5O2xldCBuO3N3aXRjaChlKXtjYXNlIkFycm93VXAiOmNhc2UiQXJyb3dEb3duIjpjYXNlIkFycm93TGVmdCI6Y2FzZSJBcnJvd1JpZ2h0IjpjYXNlIlBhZ2VVcCI6Y2FzZSJQYWdlRG93biI6Y2FzZSJIb21lIjpjYXNlIkVuZCI6bj0iTmF2aWdhdGlvbiI7YnJlYWs7Y2FzZSJFbnRlciI6Y2FzZSJFc2NhcGUiOmNhc2UiRjIiOm49IkludGVyYWN0aW9uIjticmVhaztjYXNlIlRhYiI6bj0iVGFiIjticmVhaztjYXNlIiAiOm49IlNwYWNlIn10aGlzLl9kZXRlY3RJbnRlcmFjdGluZyh0KSx0aGlzLmludGVyYWN0aW5nJiYiSW50ZXJhY3Rpb24iIT09biYmKG49dm9pZCAwKSxuJiZ0aGlzW2Bfb24ke259S2V5RG93bmBdKHQsZSl9X2Vuc3VyZVNjcm9sbGVkVG9JbmRleCh0KXtBcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZmlsdGVyKChlPT5lLmluZGV4PT09dCkpWzBdfHx0aGlzLl9zY3JvbGxUb0luZGV4KHQpfV9vbk5hdmlnYXRpb25LZXlEb3duKHQsZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0LnBhcmVudE5vZGUuY2hpbGRyZW4sdCl9dGhpcy5fc2Nyb2xsSGFuZGxlcigpLHQucHJldmVudERlZmF1bHQoKTtjb25zdCBpPXRoaXMuX2xhc3RWaXNpYmxlSW5kZXgtdGhpcy5fZmlyc3RWaXNpYmxlSW5kZXgtMTtsZXQgcj0wLG89MDtzd2l0Y2goZSl7Y2FzZSJBcnJvd1JpZ2h0IjpyPXRoaXMuX19pc1JUTD8tMToxO2JyZWFrO2Nhc2UiQXJyb3dMZWZ0IjpyPXRoaXMuX19pc1JUTD8xOi0xO2JyZWFrO2Nhc2UiSG9tZSI6cj0tMS8wLHQuY3RybEtleSYmKG89LTEvMCk7YnJlYWs7Y2FzZSJFbmQiOnI9MS8wLHQuY3RybEtleSYmKG89MS8wKTticmVhaztjYXNlIkFycm93RG93biI6bz0xO2JyZWFrO2Nhc2UiQXJyb3dVcCI6bz0tMTticmVhaztjYXNlIlBhZ2VEb3duIjpvPWk7YnJlYWs7Y2FzZSJQYWdlVXAiOm89LWl9Y29uc3QgYT10LmNvbXBvc2VkUGF0aCgpWzBdLHM9bihhKSxsPXRoaXMuX2VsZW1lbnRNYXRjaGVzKGEsJ1twYXJ0fj0iZGV0YWlscy1jZWxsIl0nKSxjPWEucGFyZW50Tm9kZSx1PWMucGFyZW50Tm9kZSxoPSh1PT09dGhpcy4kLml0ZW1zP3RoaXMuX2VmZmVjdGl2ZVNpemU6dS5jaGlsZHJlbi5sZW5ndGgpLTEsZD11PT09dGhpcy4kLml0ZW1zP3ZvaWQgMCE9PXRoaXMuX2ZvY3VzZWRJdGVtSW5kZXg/dGhpcy5fZm9jdXNlZEl0ZW1JbmRleDpjLmluZGV4Om4oYyk7bGV0IHA9TWF0aC5tYXgoMCxNYXRoLm1pbihkK28saCkpLGY9ITE7aWYodT09PXRoaXMuJC5pdGVtcyl7Y29uc3QgdD1jLl9pdGVtLGU9dGhpcy5fY2FjaGUuZ2V0SXRlbUZvckluZGV4KHApO2Y9bD8wPT09bzoxPT09byYmdGhpcy5faXNEZXRhaWxzT3BlbmVkKHQpfHwtMT09PW8mJnAhPT1kJiZ0aGlzLl9pc0RldGFpbHNPcGVuZWQoZSksZiE9PWwmJigxPT09byYmZnx8LTE9PT1vJiYhZikmJihwPWQpfWlmKHUhPT10aGlzLiQuaXRlbXMpaWYocD5kKWZvcig7cDxoJiZ1LmNoaWxkcmVuW3BdLmhpZGRlbjspcCsrO2Vsc2UgaWYocDxkKWZvcig7cD4wJiZ1LmNoaWxkcmVuW3BdLmhpZGRlbjspcC0tO3ZvaWQgMD09PXRoaXMuX2ZvY3VzZWRDb2x1bW5PcmRlciYmKHRoaXMuX2ZvY3VzZWRDb2x1bW5PcmRlcj1sPzA6dGhpcy5fZ2V0Q29sdW1ucyh1LGQpLmZpbHRlcigodD0+IXQuaGlkZGVuKSlbc10uX29yZGVyKTtjb25zdCBtPXRoaXMuX2dldENvbHVtbnModSxwKS5maWx0ZXIoKHQ9PiF0LmhpZGRlbikpLGc9bS5tYXAoKHQ9PnQuX29yZGVyKSkuc29ydCgoKHQsZSk9PnQtZSkpLF89Zy5sZW5ndGgtMSx5PWcuaW5kZXhPZihnLnNsaWNlKDApLnNvcnQoKCh0LGUpPT5NYXRoLmFicyh0LXRoaXMuX2ZvY3VzZWRDb2x1bW5PcmRlciktTWF0aC5hYnMoZS10aGlzLl9mb2N1c2VkQ29sdW1uT3JkZXIpKSlbMF0pLHY9MD09PW8mJmw/eTpNYXRoLm1heCgwLE1hdGgubWluKHkrcixfKSk7diE9PXkmJih0aGlzLl9mb2N1c2VkQ29sdW1uT3JkZXI9dm9pZCAwKSx1PT09dGhpcy4kLml0ZW1zJiZ0aGlzLl9lbnN1cmVTY3JvbGxlZFRvSW5kZXgocCksdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJuYXZpZ2F0aW5nIiwhMCx0aGlzKTtjb25zdCBiPW0ucmVkdWNlKCgodCxlLG4pPT4odFtlLl9vcmRlcl09bix0KSkse30pW2dbdl1dLHg9dT09PXRoaXMuJC5pdGVtcz9BcnJheS5mcm9tKHUuY2hpbGRyZW4pLmZpbHRlcigodD0+dC5pbmRleD09PXApKVswXTp1LmNoaWxkcmVuW3BdO2lmKCF4KXJldHVybjtjb25zdCB3PWY/QXJyYXkuZnJvbSh4LmNoaWxkcmVuKS5maWx0ZXIoKHQ9PnRoaXMuX2VsZW1lbnRNYXRjaGVzKHQsJ1twYXJ0fj0iZGV0YWlscy1jZWxsIl0nKSkpWzBdOnguY2hpbGRyZW5bYl07aWYodGhpcy5fc2Nyb2xsSG9yaXpvbnRhbGx5VG9DZWxsKHcpLHU9PT10aGlzLiQuaXRlbXMmJih0aGlzLl9mb2N1c2VkSXRlbUluZGV4PXApLHU9PT10aGlzLiQuaXRlbXMpe2NvbnN0IHQ9dy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxlPXRoaXMuJC5mb290ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLG49dGhpcy4kLmhlYWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b207dC5ib3R0b20+ZT8odGhpcy4kLnRhYmxlLnNjcm9sbFRvcCs9dC5ib3R0b20tZSx0aGlzLl9zY3JvbGxIYW5kbGVyKCkpOnQudG9wPG4mJih0aGlzLiQudGFibGUuc2Nyb2xsVG9wLT1uLXQudG9wLHRoaXMuX3Njcm9sbEhhbmRsZXIoKSl9dy5mb2N1cygpfV9vbkludGVyYWN0aW9uS2V5RG93bih0LGUpe2NvbnN0IG49dC5jb21wb3NlZFBhdGgoKVswXSxpPSJpbnB1dCI9PT1uLmxvY2FsTmFtZSYmIS9eKGJ1dHRvbnxjaGVja2JveHxjb2xvcnxmaWxlfGltYWdlfHJhZGlvfHJhbmdlfHJlc2V0fHN1Ym1pdCkkL2kudGVzdChuLnR5cGUpO2xldCByO3N3aXRjaChlKXtjYXNlIkVudGVyIjpyPSF0aGlzLmludGVyYWN0aW5nfHwhaTticmVhaztjYXNlIkVzY2FwZSI6cj0hMTticmVhaztjYXNlIkYyIjpyPSF0aGlzLmludGVyYWN0aW5nfWNvbnN0e2NlbGw6b309dGhpcy5fZ2V0R3JpZEV2ZW50TG9jYXRpb24odCk7aWYodGhpcy5pbnRlcmFjdGluZyE9PXImJm51bGwhPT1vKWlmKHIpe2NvbnN0IGU9by5fY29udGVudC5xdWVyeVNlbGVjdG9yKCJbZm9jdXMtdGFyZ2V0XSIpfHxvLl9jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO2UmJih0LnByZXZlbnREZWZhdWx0KCksZS5mb2N1cygpLHRoaXMuX3NldEludGVyYWN0aW5nKCEwKSx0aGlzLl90b2dnbGVBdHRyaWJ1dGUoIm5hdmlnYXRpbmciLCExLHRoaXMpKX1lbHNlIHQucHJldmVudERlZmF1bHQoKSx0aGlzLl9mb2N1c2VkQ29sdW1uT3JkZXI9dm9pZCAwLG8uZm9jdXMoKSx0aGlzLl9zZXRJbnRlcmFjdGluZyghMSksdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJuYXZpZ2F0aW5nIiwhMCx0aGlzKX1fcHJlZGljdEZvY3VzU3RlcFRhcmdldCh0LGUpe2NvbnN0IG49W3RoaXMuJC50YWJsZSx0aGlzLl9oZWFkZXJGb2N1c2FibGUsdGhpcy5faXRlbXNGb2N1c2FibGUsdGhpcy5fZm9vdGVyRm9jdXNhYmxlLHRoaXMuJC5mb2N1c2V4aXRdO2xldCBpPW4uaW5kZXhPZih0KTtmb3IoaSs9ZTtpPj0wJiZpPD1uLmxlbmd0aC0xJiYoIW5baV18fG5baV0ucGFyZW50Tm9kZS5oaWRkZW4pOylpKz1lO3JldHVybiBuW2ldfV9vblRhYktleURvd24odCl7Y29uc3QgZT10aGlzLl9wcmVkaWN0Rm9jdXNTdGVwVGFyZ2V0KHQuY29tcG9zZWRQYXRoKClbMF0sdC5zaGlmdEtleT8tMToxKTtpZihlPT09dGhpcy4kLnRhYmxlKXRoaXMuJC50YWJsZS5mb2N1cygpO2Vsc2UgaWYoZT09PXRoaXMuJC5mb2N1c2V4aXQpdGhpcy4kLmZvY3VzZXhpdC5mb2N1cygpO2Vsc2UgaWYoZT09PXRoaXMuX2l0ZW1zRm9jdXNhYmxlKXtsZXQgbj1lO2NvbnN0IGk9dGhpcy5faXRlbXNGb2N1c2FibGUucGFyZW50Tm9kZTtpZih0aGlzLl9lbnN1cmVTY3JvbGxlZFRvSW5kZXgodGhpcy5fZm9jdXNlZEl0ZW1JbmRleCksaS5pbmRleCE9PXRoaXMuX2ZvY3VzZWRJdGVtSW5kZXgpe2NvbnN0IHQ9QXJyYXkuZnJvbShpLmNoaWxkcmVuKS5pbmRleE9mKHRoaXMuX2l0ZW1zRm9jdXNhYmxlKSxlPUFycmF5LmZyb20odGhpcy4kLml0ZW1zLmNoaWxkcmVuKS5maWx0ZXIoKHQ9PnQuaW5kZXg9PT10aGlzLl9mb2N1c2VkSXRlbUluZGV4KSlbMF07ZSYmKG49ZS5jaGlsZHJlblt0XSl9dC5wcmV2ZW50RGVmYXVsdCgpLG4uZm9jdXMoKX1lbHNlIHQucHJldmVudERlZmF1bHQoKSxlLmZvY3VzKCk7dGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJuYXZpZ2F0aW5nIiwhMCx0aGlzKX1fb25TcGFjZUtleURvd24odCl7dC5wcmV2ZW50RGVmYXVsdCgpO2NvbnN0IGU9dC5jb21wb3NlZFBhdGgoKVswXTtlLl9jb250ZW50JiZlLl9jb250ZW50LmZpcnN0RWxlbWVudENoaWxkfHx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjZWxsLWFjdGl2YXRlIix7ZGV0YWlsOnttb2RlbDp0aGlzLl9fZ2V0Um93TW9kZWwoZS5wYXJlbnRFbGVtZW50KX19KSl9X29uS2V5VXAodCl7aWYoIS9eKCB8U3BhY2VCYXIpJC8udGVzdCh0LmtleSkpcmV0dXJuO3QucHJldmVudERlZmF1bHQoKTtjb25zdCBlPXQuY29tcG9zZWRQYXRoKClbMF07aWYoZS5fY29udGVudCYmZS5fY29udGVudC5maXJzdEVsZW1lbnRDaGlsZCl7Y29uc3QgdD10aGlzLmhhc0F0dHJpYnV0ZSgibmF2aWdhdGluZyIpO2UuX2NvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQuY2xpY2soKSx0aGlzLl90b2dnbGVBdHRyaWJ1dGUoIm5hdmlnYXRpbmciLHQsdGhpcyl9fV9vbkZvY3VzSW4odCl7dGhpcy5faXNNb3VzZWRvd258fHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgibmF2aWdhdGluZyIsITAsdGhpcyk7Y29uc3QgZT10LmNvbXBvc2VkUGF0aCgpWzBdO2U9PT10aGlzLiQudGFibGV8fGU9PT10aGlzLiQuZm9jdXNleGl0Pyh0aGlzLl9wcmVkaWN0Rm9jdXNTdGVwVGFyZ2V0KGUsZT09PXRoaXMuJC50YWJsZT8xOi0xKS5mb2N1cygpLHRoaXMuX3NldEludGVyYWN0aW5nKCExKSk6dGhpcy5fZGV0ZWN0SW50ZXJhY3RpbmcodCl9X29uRm9jdXNPdXQodCl7dGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJuYXZpZ2F0aW5nIiwhMSx0aGlzKSx0aGlzLl9kZXRlY3RJbnRlcmFjdGluZyh0KX1fb25DZWxsRm9jdXNJbih0KXtjb25zdHtzZWN0aW9uOmUsY2VsbDpufT10aGlzLl9nZXRHcmlkRXZlbnRMb2NhdGlvbih0KTt0aGlzLl9kZXRlY3RJbnRlcmFjdGluZyh0KSxlJiZuJiYodGhpcy5fYWN0aXZlUm93R3JvdXA9ZSx0aGlzLiQuaGVhZGVyPT09ZT90aGlzLl9oZWFkZXJGb2N1c2FibGU9bjp0aGlzLiQuaXRlbXM9PT1lP3RoaXMuX2l0ZW1zRm9jdXNhYmxlPW46dGhpcy4kLmZvb3Rlcj09PWUmJih0aGlzLl9mb290ZXJGb2N1c2FibGU9biksbi5fY29udGVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY2VsbC1mb2N1c2luIix7YnViYmxlczohMX0pKSxuLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjZWxsLWZvY3VzIix7YnViYmxlczohMCxjb21wb3NlZDohMH0pKSksdGhpcy5fZGV0ZWN0Rm9jdXNlZEl0ZW1JbmRleCh0KX1fb25DZWxsRm9jdXNPdXQodCl7Mz09PXQuY29tcG9zZWRQYXRoKCkuaW5kZXhPZih0aGlzLiQudGFibGUpJiZ0LmNvbXBvc2VkUGF0aCgpWzBdLl9jb250ZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjZWxsLWZvY3Vzb3V0Iix7YnViYmxlczohMX0pKX1fZGV0ZWN0SW50ZXJhY3RpbmcodCl7Y29uc3QgZT10LmNvbXBvc2VkUGF0aCgpLnNvbWUoKHQ9PiJ2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQiPT09dC5sb2NhbE5hbWUpKTt0aGlzLl9zZXRJbnRlcmFjdGluZyhlKX1fZGV0ZWN0Rm9jdXNlZEl0ZW1JbmRleCh0KXtjb25zdHtzZWN0aW9uOmUscm93Om59PXRoaXMuX2dldEdyaWRFdmVudExvY2F0aW9uKHQpO2U9PT10aGlzLiQuaXRlbXMmJih0aGlzLl9mb2N1c2VkSXRlbUluZGV4PW4uaW5kZXgpfV91cGRhdGVHcmlkU2VjdGlvbkZvY3VzVGFyZ2V0KHQpe2lmKCF0KXJldHVybjtjb25zdCBlPXRoaXMuX2dldEdyaWRTZWN0aW9uRnJvbUZvY3VzVGFyZ2V0KHQpO3QudGFiSW5kZXg9dGhpcy5pbnRlcmFjdGluZyYmZT09PXRoaXMuX2FjdGl2ZVJvd0dyb3VwPy0xOjB9X3ByZXZlbnRTY3JvbGxlclJvdGF0aW5nQ2VsbEZvY3VzKHQsZSl7dC5pbmRleD09PXRoaXMuX2ZvY3VzZWRJdGVtSW5kZXgmJnRoaXMuaGFzQXR0cmlidXRlKCJuYXZpZ2F0aW5nIikmJnRoaXMuX2FjdGl2ZVJvd0dyb3VwPT09dGhpcy4kLml0ZW1zJiYodGhpcy5fbmF2aWdhdGluZ0lzSGlkZGVuPSEwLHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgibmF2aWdhdGluZyIsITEsdGhpcykpLGU9PT10aGlzLl9mb2N1c2VkSXRlbUluZGV4JiZ0aGlzLl9uYXZpZ2F0aW5nSXNIaWRkZW4mJih0aGlzLl9uYXZpZ2F0aW5nSXNIaWRkZW49ITEsdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJuYXZpZ2F0aW5nIiwhMCx0aGlzKSl9X2dldENvbHVtbnModCxlKXtsZXQgbj10aGlzLl9jb2x1bW5UcmVlLmxlbmd0aC0xO3JldHVybiB0PT09dGhpcy4kLmhlYWRlcj9uPWU6dD09PXRoaXMuJC5mb290ZXImJihuPXRoaXMuX2NvbHVtblRyZWUubGVuZ3RoLTEtZSksdGhpcy5fY29sdW1uVHJlZVtuXX1fcmVzZXRLZXlib2FyZE5hdmlnYXRpb24oKXtpZih0aGlzLiQuaGVhZGVyLmZpcnN0RWxlbWVudENoaWxkJiYodGhpcy5faGVhZGVyRm9jdXNhYmxlPUFycmF5LmZyb20odGhpcy4kLmhlYWRlci5maXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbikuZmlsdGVyKCh0PT4hdC5oaWRkZW4pKVswXSksdGhpcy4kLml0ZW1zLmZpcnN0RWxlbWVudENoaWxkKXtjb25zdCB0PXRoaXMuX2l0ZXJhdGVJdGVtcygoKHQsZSk9PntpZih0aGlzLl9maXJzdFZpc2libGVJbmRleD09PWUpcmV0dXJuIHRoaXMuJC5pdGVtcy5jaGlsZHJlblt0XX0pKTt0JiYodGhpcy5faXRlbXNGb2N1c2FibGU9QXJyYXkuZnJvbSh0LmNoaWxkcmVuKS5maWx0ZXIoKHQ9PiF0LmhpZGRlbikpWzBdKX10aGlzLiQuZm9vdGVyLmZpcnN0RWxlbWVudENoaWxkJiYodGhpcy5fZm9vdGVyRm9jdXNhYmxlPUFycmF5LmZyb20odGhpcy4kLmZvb3Rlci5maXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbikuZmlsdGVyKCh0PT4hdC5oaWRkZW4pKVswXSl9X3Njcm9sbEhvcml6b250YWxseVRvQ2VsbCh0KXtpZih0Lmhhc0F0dHJpYnV0ZSgiZnJvemVuIil8fHRoaXMuX2VsZW1lbnRNYXRjaGVzKHQsJ1twYXJ0fj0iZGV0YWlscy1jZWxsIl0nKSlyZXR1cm47Y29uc3QgZT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49dC5wYXJlbnROb2RlLGk9QXJyYXkuZnJvbShuLmNoaWxkcmVuKS5pbmRleE9mKHQpLHI9dGhpcy4kLnRhYmxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2xldCBvPXIubGVmdCxhPXIucmlnaHQ7Zm9yKGxldCB0PWktMTt0Pj0wO3QtLSl7Y29uc3QgZT1uLmNoaWxkcmVuW3RdO2lmKCFlLmhhc0F0dHJpYnV0ZSgiaGlkZGVuIikmJiF0aGlzLl9lbGVtZW50TWF0Y2hlcyhlLCdbcGFydH49ImRldGFpbHMtY2VsbCJdJykmJmUuaGFzQXR0cmlidXRlKCJmcm96ZW4iKSl7bz1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0O2JyZWFrfX1mb3IobGV0IHQ9aSsxO3Q8bi5jaGlsZHJlbi5sZW5ndGg7dCsrKXtjb25zdCBlPW4uY2hpbGRyZW5bdF07aWYoIWUuaGFzQXR0cmlidXRlKCJoaWRkZW4iKSYmIXRoaXMuX2VsZW1lbnRNYXRjaGVzKGUsJ1twYXJ0fj0iZGV0YWlscy1jZWxsIl0nKSYmZS5oYXNBdHRyaWJ1dGUoImZyb3plbiIpKXthPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDticmVha319ZS5sZWZ0PG8mJih0aGlzLiQudGFibGUuc2Nyb2xsTGVmdCs9TWF0aC5yb3VuZChlLmxlZnQtbykpLGUucmlnaHQ+YSYmKHRoaXMuJC50YWJsZS5zY3JvbGxMZWZ0Kz1NYXRoLnJvdW5kKGUucmlnaHQtYSkpfV9lbGVtZW50TWF0Y2hlcyh0LGUpe3JldHVybiB0Lm1hdGNoZXM/dC5tYXRjaGVzKGUpOi0xIT09QXJyYXkuZnJvbSh0LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbChlKSkuaW5kZXhPZih0KX1fZ2V0R3JpZEV2ZW50TG9jYXRpb24odCl7Y29uc3QgZT10LmNvbXBvc2VkUGF0aCgpLG49ZS5pbmRleE9mKHRoaXMuJC50YWJsZSk7cmV0dXJue3NlY3Rpb246bj49MT9lW24tMV06bnVsbCxyb3c6bj49Mj9lW24tMl06bnVsbCxjZWxsOm4+PTM/ZVtuLTNdOm51bGx9fV9nZXRHcmlkU2VjdGlvbkZyb21Gb2N1c1RhcmdldCh0KXtyZXR1cm4gdD09PXRoaXMuX2hlYWRlckZvY3VzYWJsZT90aGlzLiQuaGVhZGVyOnQ9PT10aGlzLl9pdGVtc0ZvY3VzYWJsZT90aGlzLiQuaXRlbXM6dD09PXRoaXMuX2Zvb3RlckZvY3VzYWJsZT90aGlzLiQuZm9vdGVyOm51bGx9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLyx0S3Q9dD0+Y2xhc3MgZXh0ZW5kcyhwaSh0KSl7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue2NvbHVtblJlb3JkZXJpbmdBbGxvd2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9vcmRlckJhc2VTY29wZTp7dHlwZTpOdW1iZXIsdmFsdWU6MWU3fX19c3RhdGljIGdldCBvYnNlcnZlcnMoKXtyZXR1cm5bIl91cGRhdGVPcmRlcnMoX2NvbHVtblRyZWUsIF9jb2x1bW5UcmVlLiopIl19cmVhZHkoKXtzdXBlci5yZWFkeSgpLGlpKHRoaXMsInRyYWNrIix0aGlzLl9vblRyYWNrRXZlbnQpLHRoaXMuX3Jlb3JkZXJHaG9zdD10aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignW3BhcnQ9InJlb3JkZXItZ2hvc3QiXScpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5fb25Ub3VjaFN0YXJ0LmJpbmQodGhpcykpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIix0aGlzLl9vblRvdWNoTW92ZS5iaW5kKHRoaXMpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix0aGlzLl9vblRvdWNoRW5kLmJpbmQodGhpcykpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLHRoaXMuX29uQ29udGV4dE1lbnUuYmluZCh0aGlzKSl9X29uQ29udGV4dE1lbnUodCl7dGhpcy5oYXNBdHRyaWJ1dGUoInJlb3JkZXJpbmciKSYmdC5wcmV2ZW50RGVmYXVsdCgpfV9vblRvdWNoU3RhcnQodCl7dGhpcy5fc3RhcnRUb3VjaFJlb3JkZXJUaW1lb3V0PXNldFRpbWVvdXQoKCgpPT57dGhpcy5fb25UcmFja1N0YXJ0KHtkZXRhaWw6e3g6dC50b3VjaGVzWzBdLmNsaWVudFgseTp0LnRvdWNoZXNbMF0uY2xpZW50WX19KX0pLDEwMCl9X29uVG91Y2hNb3ZlKHQpe3RoaXMuX2RyYWdnZWRDb2x1bW4mJnQucHJldmVudERlZmF1bHQoKSxjbGVhclRpbWVvdXQodGhpcy5fc3RhcnRUb3VjaFJlb3JkZXJUaW1lb3V0KX1fb25Ub3VjaEVuZCgpe2NsZWFyVGltZW91dCh0aGlzLl9zdGFydFRvdWNoUmVvcmRlclRpbWVvdXQpLHRoaXMuX29uVHJhY2tFbmQoKX1fb25UcmFja0V2ZW50KHQpe2lmKCJzdGFydCI9PT10LmRldGFpbC5zdGF0ZSl7Y29uc3QgZT10LmNvbXBvc2VkUGF0aCgpLG49ZVtlLmluZGV4T2YodGhpcy4kLmhlYWRlciktMl07aWYoIW58fCFuLl9jb250ZW50KXJldHVybjtpZihuLl9jb250ZW50LmNvbnRhaW5zKHRoaXMuZ2V0Um9vdE5vZGUoKS5hY3RpdmVFbGVtZW50KSlyZXR1cm47aWYodGhpcy4kLnNjcm9sbGVyLmhhc0F0dHJpYnV0ZSgiY29sdW1uLXJlc2l6aW5nIikpcmV0dXJuO3RoaXMuX3RvdWNoRGV2aWNlfHx0aGlzLl9vblRyYWNrU3RhcnQodCl9ZWxzZSJ0cmFjayI9PT10LmRldGFpbC5zdGF0ZT90aGlzLl9vblRyYWNrKHQpOiJlbmQiPT09dC5kZXRhaWwuc3RhdGUmJnRoaXMuX29uVHJhY2tFbmQodCl9X29uVHJhY2tTdGFydCh0KXtpZighdGhpcy5jb2x1bW5SZW9yZGVyaW5nQWxsb3dlZClyZXR1cm47Y29uc3QgZT10LmNvbXBvc2VkUGF0aCYmdC5jb21wb3NlZFBhdGgoKTtpZihlJiZlLmZpbHRlcigodD0+dC5oYXNBdHRyaWJ1dGUmJnQuaGFzQXR0cmlidXRlKCJkcmFnZ2FibGUiKSkpWzBdKXJldHVybjtjb25zdCBuPXRoaXMuX2NlbGxGcm9tUG9pbnQodC5kZXRhaWwueCx0LmRldGFpbC55KTtpZihuJiYtMSE9PW4uZ2V0QXR0cmlidXRlKCJwYXJ0IikuaW5kZXhPZigiaGVhZGVyLWNlbGwiKSl7Zm9yKHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgicmVvcmRlcmluZyIsITAsdGhpcyksdGhpcy5fZHJhZ2dlZENvbHVtbj1uLl9jb2x1bW47MT09PXRoaXMuX2RyYWdnZWRDb2x1bW4ucGFyZW50RWxlbWVudC5jaGlsZEVsZW1lbnRDb3VudDspdGhpcy5fZHJhZ2dlZENvbHVtbj10aGlzLl9kcmFnZ2VkQ29sdW1uLnBhcmVudEVsZW1lbnQ7dGhpcy5fc2V0U2libGluZ3NSZW9yZGVyU3RhdHVzKHRoaXMuX2RyYWdnZWRDb2x1bW4sImFsbG93ZWQiKSx0aGlzLl9kcmFnZ2VkQ29sdW1uLl9yZW9yZGVyU3RhdHVzPSJkcmFnZ2luZyIsdGhpcy5fdXBkYXRlR2hvc3QobiksdGhpcy5fcmVvcmRlckdob3N0LnN0eWxlLnZpc2liaWxpdHk9InZpc2libGUiLHRoaXMuX3VwZGF0ZUdob3N0UG9zaXRpb24odC5kZXRhaWwueCx0aGlzLl90b3VjaERldmljZT90LmRldGFpbC55LTUwOnQuZGV0YWlsLnkpLHRoaXMuX2F1dG9TY3JvbGxlcigpfX1fb25UcmFjayh0KXtpZighdGhpcy5fZHJhZ2dlZENvbHVtbilyZXR1cm47Y29uc3QgZT10aGlzLl9jZWxsRnJvbVBvaW50KHQuZGV0YWlsLngsdC5kZXRhaWwueSk7aWYoIWUpcmV0dXJuO2NvbnN0IG49dGhpcy5fZ2V0VGFyZ2V0Q29sdW1uKGUsdGhpcy5fZHJhZ2dlZENvbHVtbik7dGhpcy5faXNTd2FwQWxsb3dlZCh0aGlzLl9kcmFnZ2VkQ29sdW1uLG4pJiZ0aGlzLl9pc1N3YXBwYWJsZUJ5UG9zaXRpb24obix0LmRldGFpbC54KSYmdGhpcy5fc3dhcENvbHVtbk9yZGVycyh0aGlzLl9kcmFnZ2VkQ29sdW1uLG4pLHRoaXMuX3VwZGF0ZUdob3N0UG9zaXRpb24odC5kZXRhaWwueCx0aGlzLl90b3VjaERldmljZT90LmRldGFpbC55LTUwOnQuZGV0YWlsLnkpLHRoaXMuX2xhc3REcmFnQ2xpZW50WD10LmRldGFpbC54fV9vblRyYWNrRW5kKCl7dGhpcy5fZHJhZ2dlZENvbHVtbiYmKHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgicmVvcmRlcmluZyIsITEsdGhpcyksdGhpcy5fZHJhZ2dlZENvbHVtbi5fcmVvcmRlclN0YXR1cz0iIix0aGlzLl9zZXRTaWJsaW5nc1Jlb3JkZXJTdGF0dXModGhpcy5fZHJhZ2dlZENvbHVtbiwiIiksdGhpcy5fZHJhZ2dlZENvbHVtbj1udWxsLHRoaXMuX2xhc3REcmFnQ2xpZW50WD1udWxsLHRoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iLHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImNvbHVtbi1yZW9yZGVyIix7ZGV0YWlsOntjb2x1bW5zOnRoaXMuX2dldENvbHVtbnNJbk9yZGVyKCl9fSkpKX1fZ2V0Q29sdW1uc0luT3JkZXIoKXtyZXR1cm4gdGhpcy5fY29sdW1uVHJlZS5zbGljZSgwKS5wb3AoKS5maWx0ZXIoKHQ9PiF0LmhpZGRlbikpLnNvcnQoKCh0LGUpPT50Ll9vcmRlci1lLl9vcmRlcikpfV9jZWxsRnJvbVBvaW50KHQsZSl7dD10fHwwLGU9ZXx8MCx0aGlzLl9kcmFnZ2VkQ29sdW1ufHx0aGlzLl90b2dnbGVBdHRyaWJ1dGUoIm5vLWNvbnRlbnQtcG9pbnRlci1ldmVudHMiLCEwLHRoaXMuJC5zY3JvbGxlcik7Y29uc3Qgbj10aGlzLnNoYWRvd1Jvb3QuZWxlbWVudEZyb21Qb2ludCh0LGUpO2lmKHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgibm8tY29udGVudC1wb2ludGVyLWV2ZW50cyIsITEsdGhpcy4kLnNjcm9sbGVyKSxuJiZuLl9jb2x1bW4pcmV0dXJuIG59X3VwZGF0ZUdob3N0UG9zaXRpb24odCxlKXtjb25zdCBuPXRoaXMuX3Jlb3JkZXJHaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxpPXQtbi53aWR0aC8yLHI9ZS1uLmhlaWdodC8yLG89cGFyc2VJbnQodGhpcy5fcmVvcmRlckdob3N0Ll9sZWZ0fHwwKSxhPXBhcnNlSW50KHRoaXMuX3Jlb3JkZXJHaG9zdC5fdG9wfHwwKTt0aGlzLl9yZW9yZGVyR2hvc3QuX2xlZnQ9by0obi5sZWZ0LWkpLHRoaXMuX3Jlb3JkZXJHaG9zdC5fdG9wPWEtKG4udG9wLXIpLHRoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS50cmFuc2Zvcm09YHRyYW5zbGF0ZSgke3RoaXMuX3Jlb3JkZXJHaG9zdC5fbGVmdH1weCwgJHt0aGlzLl9yZW9yZGVyR2hvc3QuX3RvcH1weClgfV91cGRhdGVHaG9zdCh0KXtjb25zdCBlPXRoaXMuX3Jlb3JkZXJHaG9zdDtlLnRleHRDb250ZW50PXQuX2NvbnRlbnQuaW5uZXJUZXh0O2NvbnN0IG49d2luZG93LmdldENvbXB1dGVkU3R5bGUodCk7cmV0dXJuWyJib3hTaXppbmciLCJkaXNwbGF5Iiwid2lkdGgiLCJoZWlnaHQiLCJiYWNrZ3JvdW5kIiwiYWxpZ25JdGVtcyIsInBhZGRpbmciLCJib3JkZXIiLCJmbGV4LWRpcmVjdGlvbiIsIm92ZXJmbG93Il0uZm9yRWFjaCgodD0+ZS5zdHlsZVt0XT1uW3RdKSksZX1fdXBkYXRlT3JkZXJzKHQsZSl7dm9pZCAwIT09dCYmdm9pZCAwIT09ZSYmKHRbMF0uZm9yRWFjaCgodD0+dC5fb3JkZXI9MCkpLChmdW5jdGlvbiBuKHQsZSxpKXtsZXQgcj0xO3QuZm9yRWFjaCgodD0+e3IlMTA9PTAmJnIrKyx0Ll9vcmRlcj1pK3IqZSxyKyt9KSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovKSh0WzBdLHRoaXMuX29yZGVyQmFzZVNjb3BlLDApKX1fc2V0U2libGluZ3NSZW9yZGVyU3RhdHVzKHQsZSl7QXJyYXkuZnJvbSh0LnBhcmVudE5vZGUuY2hpbGRyZW4pLmZpbHRlcigoZT0+L2NvbHVtbi8udGVzdChlLmxvY2FsTmFtZSkmJnRoaXMuX2lzU3dhcEFsbG93ZWQoZSx0KSkpLmZvckVhY2goKHQ9PnQuX3Jlb3JkZXJTdGF0dXM9ZSkpfV9hdXRvU2Nyb2xsZXIoKXtpZih0aGlzLl9sYXN0RHJhZ0NsaWVudFgpe2NvbnN0IHQ9dGhpcy5fbGFzdERyYWdDbGllbnRYLXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQrNTAsZT10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtdGhpcy5fbGFzdERyYWdDbGllbnRYKzUwO3Q+MD90aGlzLiQudGFibGUuc2Nyb2xsTGVmdCs9dC8xMDplPjAmJih0aGlzLiQudGFibGUuc2Nyb2xsTGVmdC09ZS8xMCksdGhpcy5fc2Nyb2xsSGFuZGxlcigpfXRoaXMuX2RyYWdnZWRDb2x1bW4mJnRoaXMuYXN5bmModGhpcy5fYXV0b1Njcm9sbGVyLDEwKX1faXNTd2FwQWxsb3dlZCh0LGUpe2lmKHQmJmUpe2NvbnN0IG49dC5wYXJlbnRFbGVtZW50PT09ZS5wYXJlbnRFbGVtZW50LGk9dC5mcm96ZW49PT1lLmZyb3plbjtyZXR1cm4gdCE9PWUmJm4mJml9fV9pc1N3YXBwYWJsZUJ5UG9zaXRpb24odCxlKXtjb25zdCBuPUFycmF5LmZyb20odGhpcy4kLmhlYWRlci5xdWVyeVNlbGVjdG9yQWxsKCd0cjpub3QoW2hpZGRlbl0pIFtwYXJ0fj0iY2VsbCJdJykpLmZpbHRlcigoZT0+dC5jb250YWlucyhlLl9jb2x1bW4pKSlbMF0saT10aGlzLiQuaGVhZGVyLnF1ZXJ5U2VsZWN0b3IoInRyOm5vdChbaGlkZGVuXSkgW3Jlb3JkZXItc3RhdHVzPWRyYWdnaW5nXSIpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHI9bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4gci5sZWZ0PmkubGVmdD9lPnIucmlnaHQtaS53aWR0aDplPHIubGVmdCtpLndpZHRofV9zd2FwQ29sdW1uT3JkZXJzKHQsZSl7Y29uc3Qgbj10Ll9vcmRlcjt0Ll9vcmRlcj1lLl9vcmRlcixlLl9vcmRlcj1uLHRoaXMuX3VwZGF0ZUxhc3RGcm96ZW4oKSx0aGlzLl91cGRhdGVGaXJzdEFuZExhc3RDb2x1bW4oKX1fZ2V0VGFyZ2V0Q29sdW1uKHQsZSl7aWYodCYmZSl7bGV0IG49dC5fY29sdW1uO2Zvcig7bi5wYXJlbnRFbGVtZW50IT09ZS5wYXJlbnRFbGVtZW50JiZuIT09dGhpczspbj1uLnBhcmVudEVsZW1lbnQ7cmV0dXJuIG4ucGFyZW50RWxlbWVudD09PWUucGFyZW50RWxlbWVudD9uOnQuX2NvbHVtbn19fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLyxlS3Q9dD0+Y2xhc3MgZXh0ZW5kcyB0e3N0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntyZXNpemFibGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTpmdW5jdGlvbigpe2lmKCJ2YWFkaW4tZ3JpZC1jb2x1bW4tZ3JvdXAiPT09dGhpcy5sb2NhbE5hbWUpcmV0dXJuO2NvbnN0IHQ9dGhpcy5wYXJlbnROb2RlO3JldHVybiB0JiYidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PXQubG9jYWxOYW1lJiZ0LnJlc2l6YWJsZXx8ITF9fSxfaGVhZGVyVGVtcGxhdGU6e3R5cGU6T2JqZWN0fSxfZm9vdGVyVGVtcGxhdGU6e3R5cGU6T2JqZWN0fSxmcm96ZW46e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0saGlkZGVuOnt0eXBlOkJvb2xlYW59LGhlYWRlcjp7dHlwZTpTdHJpbmd9LHRleHRBbGlnbjp7dHlwZTpTdHJpbmd9LF9sYXN0RnJvemVuOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9vcmRlcjpOdW1iZXIsX3Jlb3JkZXJTdGF0dXM6Qm9vbGVhbixfZW1wdHlDZWxsczpBcnJheSxfaGVhZGVyQ2VsbDpPYmplY3QsX2Zvb3RlckNlbGw6T2JqZWN0LF9ncmlkOk9iamVjdCxoZWFkZXJSZW5kZXJlcjpGdW5jdGlvbixmb290ZXJSZW5kZXJlcjpGdW5jdGlvbn19c3RhdGljIGdldCBvYnNlcnZlcnMoKXtyZXR1cm5bIl93aWR0aENoYW5nZWQod2lkdGgsIF9oZWFkZXJDZWxsLCBfZm9vdGVyQ2VsbCwgX2NlbGxzLiopIiwiX2Zyb3plbkNoYW5nZWQoZnJvemVuLCBfaGVhZGVyQ2VsbCwgX2Zvb3RlckNlbGwsIF9jZWxscy4qKSIsIl9mbGV4R3Jvd0NoYW5nZWQoZmxleEdyb3csIF9oZWFkZXJDZWxsLCBfZm9vdGVyQ2VsbCwgX2NlbGxzLiopIiwiX3BhdGhPckhlYWRlckNoYW5nZWQocGF0aCwgaGVhZGVyLCBfaGVhZGVyQ2VsbCwgX2Zvb3RlckNlbGwsIF9jZWxscy4qLCByZW5kZXJlciwgaGVhZGVyUmVuZGVyZXIsIF9ib2R5VGVtcGxhdGUsIF9oZWFkZXJUZW1wbGF0ZSkiLCJfdGV4dEFsaWduQ2hhbmdlZCh0ZXh0QWxpZ24sIF9jZWxscy4qLCBfaGVhZGVyQ2VsbCwgX2Zvb3RlckNlbGwpIiwiX29yZGVyQ2hhbmdlZChfb3JkZXIsIF9oZWFkZXJDZWxsLCBfZm9vdGVyQ2VsbCwgX2NlbGxzLiopIiwiX2xhc3RGcm96ZW5DaGFuZ2VkKF9sYXN0RnJvemVuKSIsIl9zZXRCb2R5VGVtcGxhdGVPclJlbmRlcmVyKF9ib2R5VGVtcGxhdGUsIHJlbmRlcmVyLCBfY2VsbHMsIF9jZWxscy4qKSIsIl9zZXRIZWFkZXJUZW1wbGF0ZU9yUmVuZGVyZXIoX2hlYWRlclRlbXBsYXRlLCBoZWFkZXJSZW5kZXJlciwgX2hlYWRlckNlbGwpIiwiX3NldEZvb3RlclRlbXBsYXRlT3JSZW5kZXJlcihfZm9vdGVyVGVtcGxhdGUsIGZvb3RlclJlbmRlcmVyLCBfZm9vdGVyQ2VsbCkiLCJfcmVzaXphYmxlQ2hhbmdlZChyZXNpemFibGUsIF9oZWFkZXJDZWxsKSIsIl9yZW9yZGVyU3RhdHVzQ2hhbmdlZChfcmVvcmRlclN0YXR1cywgX2hlYWRlckNlbGwsIF9mb290ZXJDZWxsLCBfY2VsbHMuKikiLCJfaGlkZGVuQ2hhbmdlZChoaWRkZW4sIF9oZWFkZXJDZWxsLCBfZm9vdGVyQ2VsbCwgX2NlbGxzLiopIl19Y29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLHRoaXMuX2JvZHlUZW1wbGF0ZSYmKHRoaXMuX2JvZHlUZW1wbGF0ZS50ZW1wbGF0aXplci5fZ3JpZD10aGlzLl9ncmlkKSx0aGlzLl9oZWFkZXJUZW1wbGF0ZSYmKHRoaXMuX2hlYWRlclRlbXBsYXRlLnRlbXBsYXRpemVyLl9ncmlkPXRoaXMuX2dyaWQpLHRoaXMuX2Zvb3RlclRlbXBsYXRlJiYodGhpcy5fZm9vdGVyVGVtcGxhdGUudGVtcGxhdGl6ZXIuX2dyaWQ9dGhpcy5fZ3JpZCksdGhpcy5fdGVtcGxhdGVPYnNlcnZlci5mbHVzaCgpLHRoaXMuX2JvZHlUZW1wbGF0ZXx8dGhpcy5fdGVtcGxhdGVPYnNlcnZlci5jYWxsYmFjaygpLHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKCk9Pnt0aGlzLl9hbGxDZWxscy5mb3JFYWNoKCh0PT57dC5fY29udGVudC5wYXJlbnROb2RlfHx0aGlzLl9ncmlkJiZ0aGlzLl9ncmlkLmFwcGVuZENoaWxkKHQuX2NvbnRlbnQpfSkpfSkpfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT57dGhpcy5fZmluZEhvc3RHcmlkKCl8fHRoaXMuX2FsbENlbGxzLmZvckVhY2goKHQ9Pnt0Ll9jb250ZW50LnBhcmVudE5vZGUmJnQuX2NvbnRlbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0Ll9jb250ZW50KX0pKX0pKSx0aGlzLl9ncmlkVmFsdWU9dm9pZCAwfV9maW5kSG9zdEdyaWQoKXtsZXQgdD10aGlzO2Zvcig7dCYmIS9edmFhZGluLipncmlkKC1wcm8pPyQvLnRlc3QodC5sb2NhbE5hbWUpOyl0PXQuYXNzaWduZWRTbG90P3QuYXNzaWduZWRTbG90LnBhcmVudE5vZGU6dC5wYXJlbnROb2RlO3JldHVybiB0fHx2b2lkIDB9Z2V0IF9ncmlkKCl7cmV0dXJuIHRoaXMuX2dyaWRWYWx1ZXx8KHRoaXMuX2dyaWRWYWx1ZT10aGlzLl9maW5kSG9zdEdyaWQoKSksdGhpcy5fZ3JpZFZhbHVlfWdldCBfYWxsQ2VsbHMoKXtyZXR1cm5bXS5jb25jYXQodGhpcy5fY2VsbHN8fFtdKS5jb25jYXQodGhpcy5fZW1wdHlDZWxsc3x8W10pLmNvbmNhdCh0aGlzLl9oZWFkZXJDZWxsKS5jb25jYXQodGhpcy5fZm9vdGVyQ2VsbCkuZmlsdGVyKCh0PT50KSl9Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX3RlbXBsYXRlT2JzZXJ2ZXI9bmV3IHppKHRoaXMsKCgpPT57dGhpcy5faGVhZGVyVGVtcGxhdGU9dGhpcy5fcHJlcGFyZUhlYWRlclRlbXBsYXRlKCksdGhpcy5fZm9vdGVyVGVtcGxhdGU9dGhpcy5fcHJlcGFyZUZvb3RlclRlbXBsYXRlKCksdGhpcy5fYm9keVRlbXBsYXRlPXRoaXMuX3ByZXBhcmVCb2R5VGVtcGxhdGUoKX0pKX1fcHJlcGFyZUhlYWRlclRlbXBsYXRlKCl7cmV0dXJuIHRoaXMuX3ByZXBhcmVUZW1wbGF0aXplcih0aGlzLl9maW5kVGVtcGxhdGUoITApfHxudWxsLHt9KX1fcHJlcGFyZUZvb3RlclRlbXBsYXRlKCl7cmV0dXJuIHRoaXMuX3ByZXBhcmVUZW1wbGF0aXplcih0aGlzLl9maW5kVGVtcGxhdGUoITEsITApfHxudWxsLHt9KX1fcHJlcGFyZUJvZHlUZW1wbGF0ZSgpe3JldHVybiB0aGlzLl9wcmVwYXJlVGVtcGxhdGl6ZXIodGhpcy5fZmluZFRlbXBsYXRlKCl8fG51bGwpfV9wcmVwYXJlVGVtcGxhdGl6ZXIodCxlKXtpZih0JiYhdC50ZW1wbGF0aXplcil7Y29uc3Qgbj1uZXcgViR0O24uX2dyaWQ9dGhpcy5fZ3JpZCxuLmRhdGFIb3N0PXRoaXMuZGF0YUhvc3Qsbi5faW5zdGFuY2VQcm9wcz1lfHxuLl9pbnN0YW5jZVByb3BzLG4udGVtcGxhdGU9dCx0LnRlbXBsYXRpemVyPW59cmV0dXJuIHR9X3JlbmRlckhlYWRlckFuZEZvb3Rlcigpe3RoaXMuaGVhZGVyUmVuZGVyZXImJnRoaXMuX2hlYWRlckNlbGwmJnRoaXMuX19ydW5SZW5kZXJlcih0aGlzLmhlYWRlclJlbmRlcmVyLHRoaXMuX2hlYWRlckNlbGwpLHRoaXMuZm9vdGVyUmVuZGVyZXImJnRoaXMuX2Zvb3RlckNlbGwmJnRoaXMuX19ydW5SZW5kZXJlcih0aGlzLmZvb3RlclJlbmRlcmVyLHRoaXMuX2Zvb3RlckNlbGwpfV9fcnVuUmVuZGVyZXIodCxlLG4pe2NvbnN0IGk9W2UuX2NvbnRlbnQsdGhpc107biYmbi5pdGVtJiZpLnB1c2gobiksdC5hcHBseSh0aGlzLGkpfV9fc2V0Q29sdW1uVGVtcGxhdGVPclJlbmRlcmVyKHQsZSxuKXtpZighdGhpcy5oaWRkZW4pe2lmKHQmJmUpdGhyb3cgbmV3IEVycm9yKCJZb3Ugc2hvdWxkIG9ubHkgdXNlIGVpdGhlciBhIHJlbmRlcmVyIG9yIGEgdGVtcGxhdGUiKTtuLmZvckVhY2goKG49Pntjb25zdCBpPXRoaXMuX2dyaWQuX19nZXRSb3dNb2RlbChuLnBhcmVudEVsZW1lbnQpO2lmKGUpbi5fcmVuZGVyZXI9ZSwoaS5pdGVtfHxlPT09dGhpcy5oZWFkZXJSZW5kZXJlcnx8ZT09PXRoaXMuZm9vdGVyUmVuZGVyZXIpJiZ0aGlzLl9fcnVuUmVuZGVyZXIoZSxuLGkpO2Vsc2UgaWYobi5fdGVtcGxhdGUhPT10KXtuLl90ZW1wbGF0ZT10LG4uX2NvbnRlbnQuaW5uZXJIVE1MPSIiLHQudGVtcGxhdGl6ZXIuX2dyaWQ9dC50ZW1wbGF0aXplci5fZ3JpZHx8dGhpcy5fZ3JpZDtjb25zdCBlPXQudGVtcGxhdGl6ZXIuY3JlYXRlSW5zdGFuY2UoKTtuLl9jb250ZW50LmFwcGVuZENoaWxkKGUucm9vdCksbi5faW5zdGFuY2U9ZSxpLml0ZW0mJm4uX2luc3RhbmNlLnNldFByb3BlcnRpZXMoaSl9fSkpfX1fc2V0Qm9keVRlbXBsYXRlT3JSZW5kZXJlcih0LGUsbil7KHR8fGUpJiZuJiZ0aGlzLl9fc2V0Q29sdW1uVGVtcGxhdGVPclJlbmRlcmVyKHQsZSxuKX1fc2V0SGVhZGVyVGVtcGxhdGVPclJlbmRlcmVyKHQsZSxuKXsodHx8ZSkmJm4mJnRoaXMuX19zZXRDb2x1bW5UZW1wbGF0ZU9yUmVuZGVyZXIodCxlLFtuXSl9X3NldEZvb3RlclRlbXBsYXRlT3JSZW5kZXJlcih0LGUsbil7KHR8fGUpJiZuJiYodGhpcy5fX3NldENvbHVtblRlbXBsYXRlT3JSZW5kZXJlcih0LGUsW25dKSx0aGlzLl9ncmlkLl9fdXBkYXRlSGVhZGVyRm9vdGVyUm93VmlzaWJpbGl0eShuLnBhcmVudEVsZW1lbnQpKX1fc2VsZWN0Rmlyc3RUZW1wbGF0ZSh0PSExLGU9ITEpe3JldHVybiB6aS5nZXRGbGF0dGVuZWROb2Rlcyh0aGlzKS5maWx0ZXIoKG49PiJ0ZW1wbGF0ZSI9PT1uLmxvY2FsTmFtZSYmbi5jbGFzc0xpc3QuY29udGFpbnMoImhlYWRlciIpPT09dCYmbi5jbGFzc0xpc3QuY29udGFpbnMoImZvb3RlciIpPT09ZSkpWzBdfV9maW5kVGVtcGxhdGUodCxlKXtjb25zdCBuPXRoaXMuX3NlbGVjdEZpcnN0VGVtcGxhdGUodCxlKTtyZXR1cm4gbiYmdGhpcy5kYXRhSG9zdCYmKG4uX3Jvb3REYXRhSG9zdD10aGlzLmRhdGFIb3N0Ll9yb290RGF0YUhvc3R8fHRoaXMuZGF0YUhvc3QpLG59X2ZsZXhHcm93Q2hhbmdlZCh0KXt0aGlzLnBhcmVudEVsZW1lbnQmJnRoaXMucGFyZW50RWxlbWVudC5fY29sdW1uUHJvcENoYW5nZWQmJnRoaXMucGFyZW50RWxlbWVudC5fY29sdW1uUHJvcENoYW5nZWQoImZsZXhHcm93IiksdGhpcy5fYWxsQ2VsbHMuZm9yRWFjaCgoZT0+ZS5zdHlsZS5mbGV4R3Jvdz10KSl9X29yZGVyQ2hhbmdlZCh0KXt0aGlzLl9hbGxDZWxscy5mb3JFYWNoKChlPT5lLnN0eWxlLm9yZGVyPXQpKX1fd2lkdGhDaGFuZ2VkKHQpe3RoaXMucGFyZW50RWxlbWVudCYmdGhpcy5wYXJlbnRFbGVtZW50Ll9jb2x1bW5Qcm9wQ2hhbmdlZCYmdGhpcy5wYXJlbnRFbGVtZW50Ll9jb2x1bW5Qcm9wQ2hhbmdlZCgid2lkdGgiKSx0aGlzLl9hbGxDZWxscy5mb3JFYWNoKChlPT5lLnN0eWxlLndpZHRoPXQpKSx0aGlzLl9ncmlkJiZ0aGlzLl9ncmlkLl9fZm9yY2VSZWZsb3cmJnRoaXMuX2dyaWQuX19mb3JjZVJlZmxvdygpfV9mcm96ZW5DaGFuZ2VkKHQpe3RoaXMucGFyZW50RWxlbWVudCYmdGhpcy5wYXJlbnRFbGVtZW50Ll9jb2x1bW5Qcm9wQ2hhbmdlZCYmdGhpcy5wYXJlbnRFbGVtZW50Ll9jb2x1bW5Qcm9wQ2hhbmdlZCgiZnJvemVuIix0KSx0aGlzLl9hbGxDZWxscy5mb3JFYWNoKChlPT50aGlzLl90b2dnbGVBdHRyaWJ1dGUoImZyb3plbiIsdCxlKSkpLHRoaXMuX2dyaWQmJnRoaXMuX2dyaWQuX2Zyb3plbkNlbGxzQ2hhbmdlZCYmdGhpcy5fZ3JpZC5fZnJvemVuQ2VsbHNDaGFuZ2VkKCl9X2xhc3RGcm96ZW5DaGFuZ2VkKHQpe3RoaXMuX2FsbENlbGxzLmZvckVhY2goKGU9PnRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgibGFzdC1mcm96ZW4iLHQsZSkpKSx0aGlzLnBhcmVudEVsZW1lbnQmJnRoaXMucGFyZW50RWxlbWVudC5fY29sdW1uUHJvcENoYW5nZWQmJih0aGlzLnBhcmVudEVsZW1lbnQuX2xhc3RGcm96ZW49dCl9X3BhdGhPckhlYWRlckNoYW5nZWQodCxlLG4saSxyLG8sYSxzLGwpe2NvbnN0IGM9dm9pZCAwIT09ZTshYSYmIWwmJmMmJm4mJnRoaXMuX19zZXRUZXh0Q29udGVudChuLl9jb250ZW50LGUpLHQmJnIudmFsdWUmJihvfHxzfHx0aGlzLl9fc2V0Q29sdW1uVGVtcGxhdGVPclJlbmRlcmVyKHZvaWQgMCwoKGUsbix7aXRlbTppfSk9PnRoaXMuX19zZXRUZXh0Q29udGVudChlLHRoaXMuZ2V0KHQsaSkpKSxyLnZhbHVlKSxhfHxsfHxjfHwhbnx8bnVsbD09PWV8fHRoaXMuX19zZXRUZXh0Q29udGVudChuLl9jb250ZW50LHRoaXMuX2dlbmVyYXRlSGVhZGVyKHQpKSksbiYmdGhpcy5fZ3JpZC5fX3VwZGF0ZUhlYWRlckZvb3RlclJvd1Zpc2liaWxpdHkobi5wYXJlbnRFbGVtZW50KX1fX3NldFRleHRDb250ZW50KHQsZSl7dC50ZXh0Q29udGVudCE9PWUmJih0LnRleHRDb250ZW50PWUpfV9nZW5lcmF0ZUhlYWRlcih0KXtyZXR1cm4gdC5zdWJzdHIodC5sYXN0SW5kZXhPZigiLiIpKzEpLnJlcGxhY2UoLyhbQS1aXSkvZywiLSQxIikudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8tL2csIiAiKS5yZXBsYWNlKC9eLi8sKHQ9PnQudG9VcHBlckNhc2UoKSkpfV90b2dnbGVBdHRyaWJ1dGUodCxlLG4pe24uaGFzQXR0cmlidXRlKHQpPT09IWUmJihlP24uc2V0QXR0cmlidXRlKHQsIiIpOm4ucmVtb3ZlQXR0cmlidXRlKHQpKX1fcmVvcmRlclN0YXR1c0NoYW5nZWQodCl7dGhpcy5fYWxsQ2VsbHMuZm9yRWFjaCgoZT0+ZS5zZXRBdHRyaWJ1dGUoInJlb3JkZXItc3RhdHVzIix0KSkpfV9yZXNpemFibGVDaGFuZ2VkKHQsZSl7dm9pZCAwIT09dCYmdm9pZCAwIT09ZSYmZSYmW2VdLmNvbmNhdCh0aGlzLl9lbXB0eUNlbGxzKS5mb3JFYWNoKChlPT57aWYoZSl7Y29uc3Qgbj1lLnF1ZXJ5U2VsZWN0b3IoJ1twYXJ0fj0icmVzaXplLWhhbmRsZSJdJyk7aWYobiYmZS5yZW1vdmVDaGlsZChuKSx0KXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3Quc2V0QXR0cmlidXRlKCJwYXJ0IiwicmVzaXplLWhhbmRsZSIpLGUuYXBwZW5kQ2hpbGQodCl9fX0pKX1fdGV4dEFsaWduQ2hhbmdlZCh0KXtpZih2b2lkIDA9PT10KXJldHVybjtpZigtMT09PVsic3RhcnQiLCJlbmQiLCJjZW50ZXIiXS5pbmRleE9mKHQpKXJldHVybiB2b2lkIGNvbnNvbGUud2FybigndGV4dEFsaWduIGNhbiBvbmx5IGJlIHNldCBhcyAic3RhcnQiLCAiZW5kIiBvciAiY2VudGVyIicpO2xldCBlOyJsdHIiPT09Z2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9ncmlkKS5kaXJlY3Rpb24/InN0YXJ0Ij09PXQ/ZT0ibGVmdCI6ImVuZCI9PT10JiYoZT0icmlnaHQiKToic3RhcnQiPT09dD9lPSJyaWdodCI6ImVuZCI9PT10JiYoZT0ibGVmdCIpLHRoaXMuX2FsbENlbGxzLmZvckVhY2goKG49PntuLl9jb250ZW50LnN0eWxlLnRleHRBbGlnbj10LGdldENvbXB1dGVkU3R5bGUobi5fY29udGVudCkudGV4dEFsaWduIT09dCYmKG4uX2NvbnRlbnQuc3R5bGUudGV4dEFsaWduPWUpfSkpfV9oaWRkZW5DaGFuZ2VkKHQpe3RoaXMucGFyZW50RWxlbWVudCYmdGhpcy5wYXJlbnRFbGVtZW50Ll9jb2x1bW5Qcm9wQ2hhbmdlZCYmdGhpcy5wYXJlbnRFbGVtZW50Ll9jb2x1bW5Qcm9wQ2hhbmdlZCgiaGlkZGVuIix0KSwhIXQhPSEhdGhpcy5fcHJldmlvdXNIaWRkZW4mJnRoaXMuX2dyaWQmJighMD09PXQmJnRoaXMuX2FsbENlbGxzLmZvckVhY2goKHQ9Pnt0Ll9jb250ZW50LnBhcmVudE5vZGUmJnQuX2NvbnRlbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0Ll9jb250ZW50KX0pKSx0aGlzLl9ncmlkLl9kZWJvdW5jZXJIaWRkZW5DaGFuZ2VkPVRuLmRlYm91bmNlKHRoaXMuX2dyaWQuX2RlYm91bmNlckhpZGRlbkNoYW5nZWQsX3QsKCgpPT57dGhpcy5fZ3JpZCYmdGhpcy5fZ3JpZC5fcmVuZGVyQ29sdW1uVHJlZSYmdGhpcy5fZ3JpZC5fcmVuZGVyQ29sdW1uVHJlZSh0aGlzLl9ncmlkLl9jb2x1bW5UcmVlKX0pKSx0aGlzLl9ncmlkLl91cGRhdGVMYXN0RnJvemVuJiZ0aGlzLl9ncmlkLl91cGRhdGVMYXN0RnJvemVuKCksdGhpcy5fZ3JpZC5ub3RpZnlSZXNpemUmJnRoaXMuX2dyaWQubm90aWZ5UmVzaXplKCksdGhpcy5fZ3JpZC5fcmVzZXRLZXlib2FyZE5hdmlnYXRpb24mJnRoaXMuX2dyaWQuX3Jlc2V0S2V5Ym9hcmROYXZpZ2F0aW9uKCkpLHRoaXMuX3ByZXZpb3VzSGlkZGVuPXR9fTtjbGFzcyBuS3QgZXh0ZW5kcyhlS3QodyR0KHllKSkpe3N0YXRpYyBnZXQgaXMoKXtyZXR1cm4idmFhZGluLWdyaWQtY29sdW1uIn1zdGF0aWMgZ2V0IHByb3BlcnRpZXMoKXtyZXR1cm57d2lkdGg6e3R5cGU6U3RyaW5nLHZhbHVlOiIxMDBweCJ9LGZsZXhHcm93Ont0eXBlOk51bWJlcix2YWx1ZToxfSxyZW5kZXJlcjpGdW5jdGlvbixwYXRoOnt0eXBlOlN0cmluZ30sYXV0b1dpZHRoOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9ib2R5VGVtcGxhdGU6e3R5cGU6T2JqZWN0fSxfY2VsbHM6QXJyYXl9fX1jdXN0b21FbGVtZW50cy5kZWZpbmUobkt0LmlzLG5LdCksCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovCiRYdCgidmFhZGluLWdyaWQiLEdYdGAKICAgIEBrZXlmcmFtZXMgdmFhZGluLWdyaWQtYXBwZWFyIHsKICAgICAgdG8gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KICAgIH0KCiAgICA6aG9zdCB7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICBhbmltYXRpb246IDFtcyB2YWFkaW4tZ3JpZC1hcHBlYXI7CiAgICAgIGhlaWdodDogNDAwcHg7CiAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICBhbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB9CgogICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgfQoKICAgICNzY3JvbGxlciB7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgIHdpZHRoOiBhdXRvOwogICAgICBoZWlnaHQ6IGF1dG87CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgdG9wOiAwOwogICAgICByaWdodDogMDsKICAgICAgYm90dG9tOiAwOwogICAgICBsZWZ0OiAwOwogICAgfQoKICAgIDpob3N0KFtoZWlnaHQtYnktcm93c10pIHsKICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgfQoKICAgIDpob3N0KFtoZWlnaHQtYnktcm93c10pICNzY3JvbGxlciB7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIH0KCiAgICAjdGFibGUgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB3aWR0aDogMTAwJTsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICBvdXRsaW5lOiBub25lOwogICAgICAvKiBXb3JrYXJvdW5kIGZvciBhIERlc2t0b3AgU2FmYXJpIGJ1ZzogbmV3IHN0YWNraW5nIGNvbnRleHQgaGVyZSBwcmV2ZW50cyB0aGUgc2Nyb2xsYmFyIGZyb20gZ2V0dGluZyBoaWRkZW4gKi8KICAgICAgei1pbmRleDogMDsKICAgIH0KCiAgICAjaGVhZGVyLAogICAgI2Zvb3RlciB7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICBwb3NpdGlvbjogLXdlYmtpdC1zdGlja3k7CiAgICAgIHBvc2l0aW9uOiBzdGlja3k7CiAgICAgIGxlZnQ6IDA7CiAgICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgICB3aWR0aDogMTAwJTsKICAgICAgei1pbmRleDogMTsKICAgIH0KCiAgICAjaGVhZGVyIHsKICAgICAgdG9wOiAwOwogICAgfQoKICAgIHRoIHsKICAgICAgdGV4dC1hbGlnbjogaW5oZXJpdDsKICAgIH0KCiAgICAvKiBTYWZhcmkgZG9lc24ndCB3b3JrIHdpdGggImluaGVyaXQiICovCiAgICBbc2FmYXJpXSB0aCB7CiAgICAgIHRleHQtYWxpZ246IGluaXRpYWw7CiAgICB9CgogICAgI2Zvb3RlciB7CiAgICAgIGJvdHRvbTogMDsKICAgIH0KCiAgICAjaXRlbXMgewogICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgcG9zaXRpb246IC13ZWJraXQtc3RpY2t5OwogICAgICBwb3NpdGlvbjogc3RpY2t5OwogICAgICB3aWR0aDogMTAwJTsKICAgICAgbGVmdDogMDsKICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICB9CgogICAgW3BhcnR+PSdyb3cnXSB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICBtYXJnaW46IDA7CiAgICB9CgogICAgW3BhcnR+PSdyb3cnXVtsb2FkaW5nXSBbcGFydH49J2JvZHktY2VsbCddIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgb3BhY2l0eTogMDsKICAgIH0KCiAgICAjaXRlbXMgW3BhcnR+PSdyb3cnXSB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIH0KCiAgICAjaXRlbXMgW3BhcnR+PSdyb3cnXTplbXB0eSB7CiAgICAgIGhlaWdodDogMWVtOwogICAgfQoKICAgIFtwYXJ0fj0nY2VsbCddOm5vdChbcGFydH49J2RldGFpbHMtY2VsbCddKSB7CiAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIHBhZGRpbmc6IDA7CiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB9CgogICAgW3BhcnR+PSdkZXRhaWxzLWNlbGwnXSB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgYm90dG9tOiAwOwogICAgICB3aWR0aDogMTAwJTsKICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgcGFkZGluZzogMDsKICAgIH0KCiAgICBbcGFydH49J2NlbGwnXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB3aWR0aDogMTAwJTsKICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB9CgogICAgW2hpZGRlbl0gewogICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICB9CgogICAgW2Zyb3plbl0gewogICAgICB6LWluZGV4OiAyOwogICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgfQoKICAgIFtuby1zY3JvbGxiYXJzXVtzYWZhcmldICN0YWJsZSwKICAgIFtuby1zY3JvbGxiYXJzXVtmaXJlZm94XSAjdGFibGUgewogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgfQoKICAgIC8qIFJlb3JkZXJpbmcgc3R5bGVzICovCiAgICA6aG9zdChbcmVvcmRlcmluZ10pIFtwYXJ0fj0nY2VsbCddIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpLAogICAgOmhvc3QoW3Jlb3JkZXJpbmddKSBbcGFydH49J3Jlc2l6ZS1oYW5kbGUnXSwKICAgICNzY3JvbGxlcltuby1jb250ZW50LXBvaW50ZXItZXZlbnRzXSBbcGFydH49J2NlbGwnXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgfQoKICAgIFtwYXJ0fj0ncmVvcmRlci1naG9zdCddIHsKICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICBvcGFjaXR5OiAwLjU7CgogICAgICAvKiBQcmV2ZW50IG92ZXJmbG93aW5nIHRoZSBncmlkIGluIEZpcmVmb3ggKi8KICAgICAgdG9wOiAwOwogICAgICBsZWZ0OiAwOwogICAgfQoKICAgIDpob3N0KFtyZW9yZGVyaW5nXSkgewogICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIH0KCiAgICAvKiBSZXNpemluZyBzdHlsZXMgKi8KICAgIFtwYXJ0fj0ncmVzaXplLWhhbmRsZSddIHsKICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB0b3A6IDA7CiAgICAgIHJpZ2h0OiAwOwogICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgei1pbmRleDogMTsKICAgIH0KCiAgICBbcGFydH49J3Jlc2l6ZS1oYW5kbGUnXTo6YmVmb3JlIHsKICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICBjb250ZW50OiAnJzsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB3aWR0aDogMzVweDsKICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgfQoKICAgIFtsYXN0LWNvbHVtbl0gW3BhcnR+PSdyZXNpemUtaGFuZGxlJ106OmJlZm9yZSwKICAgIFtsYXN0LWZyb3plbl0gW3BhcnR+PSdyZXNpemUtaGFuZGxlJ106OmJlZm9yZSB7CiAgICAgIHdpZHRoOiAxOHB4OwogICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgIHJpZ2h0OiAwOwogICAgfQoKICAgICNzY3JvbGxlcltjb2x1bW4tcmVzaXppbmddIHsKICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIH0KCiAgICAvKiBTaXplciBzdHlsZXMgKi8KICAgICNzaXplciB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgfQoKICAgICNzaXplciBbcGFydH49J2RldGFpbHMtY2VsbCddIHsKICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgfQoKICAgICNzaXplciBbcGFydH49J2NlbGwnXVtoaWRkZW5dIHsKICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgfQoKICAgICNzaXplciBbcGFydH49J2NlbGwnXSB7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICBmbGV4LXNocmluazogMDsKICAgICAgbGluZS1oZWlnaHQ6IDA7CiAgICAgIGhlaWdodDogMCAhaW1wb3J0YW50OwogICAgICBtaW4taGVpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICAgIG1heC1oZWlnaHQ6IDAgIWltcG9ydGFudDsKICAgICAgcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgIH0KCiAgICAjc2l6ZXIgW3BhcnR+PSdjZWxsJ106OmJlZm9yZSB7CiAgICAgIGNvbnRlbnQ6ICctJzsKICAgIH0KCiAgICAjc2l6ZXIgW3BhcnR+PSdjZWxsJ10gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLyogUlRMIHNwZWNpZmljIHN0eWxlcyAqLwoKICAgIDpob3N0KFtkaXI9J3J0bCddKSAjaXRlbXMsCiAgICA6aG9zdChbZGlyPSdydGwnXSkgI2hlYWRlciwKICAgIDpob3N0KFtkaXI9J3J0bCddKSAjZm9vdGVyIHsKICAgICAgbGVmdDogYXV0bzsKICAgIH0KCiAgICA6aG9zdChbZGlyPSdydGwnXSkgW3BhcnR+PSdyZW9yZGVyLWdob3N0J10gewogICAgICBsZWZ0OiBhdXRvOwogICAgICByaWdodDogMDsKICAgIH0KCiAgICA6aG9zdChbZGlyPSdydGwnXSkgW3BhcnR+PSdyZXNpemUtaGFuZGxlJ10gewogICAgICBsZWZ0OiAwOwogICAgICByaWdodDogYXV0bzsKICAgIH0KCiAgICA6aG9zdChbZGlyPSdydGwnXSkgW3BhcnR+PSdyZXNpemUtaGFuZGxlJ106OmJlZm9yZSB7CiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg1MCUpOwogICAgfQoKICAgIDpob3N0KFtkaXI9J3J0bCddKSBbbGFzdC1jb2x1bW5dIFtwYXJ0fj0ncmVzaXplLWhhbmRsZSddOjpiZWZvcmUsCiAgICA6aG9zdChbZGlyPSdydGwnXSkgW2xhc3QtZnJvemVuXSBbcGFydH49J3Jlc2l6ZS1oYW5kbGUnXTo6YmVmb3JlIHsKICAgICAgbGVmdDogMDsKICAgICAgcmlnaHQ6IGF1dG87CiAgICB9CiAgYCx7bW9kdWxlSWQ6InZhYWRpbi1ncmlkLXN0eWxlcyJ9KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi8KY29uc3QgaUt0PSgoKT0+e3RyeXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRXZlbnQoIlRvdWNoRXZlbnQiKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KSgpO2NsYXNzIHJLdCBleHRlbmRzKEUkdChjJHQoRCR0KFIkdChCJHQoTiR0KGokdChHJHQoVyR0KFUkdChRJHQoUCR0KEYkdCh0S3QoTyR0KEgkdChKJHQocSR0KEwkdCkpKSkpKSkpKSkpKSkpKSkpKSl7c3RhdGljIGdldCB0ZW1wbGF0ZSgpe3JldHVybiBfZWAKICAgICAgPGRpdgogICAgICAgIGlkPSJzY3JvbGxlciIKICAgICAgICBzYWZhcmkkPSJbW19zYWZhcmldXSIKICAgICAgICBpb3MkPSJbW19pb3NdXSIKICAgICAgICBsb2FkaW5nJD0iW1tsb2FkaW5nXV0iCiAgICAgICAgY29sdW1uLXJlb3JkZXJpbmctYWxsb3dlZCQ9IltbY29sdW1uUmVvcmRlcmluZ0FsbG93ZWRdXSIKICAgICAgPgogICAgICAgIDx0YWJsZSBpZD0idGFibGUiIHJvbGU9ImdyaWQiIGFyaWEtbXVsdGlzZWxlY3RhYmxlPSJ0cnVlIiB0YWJpbmRleD0iMCI+CiAgICAgICAgICA8Y2FwdGlvbiBpZD0ic2l6ZXIiIHBhcnQ9InJvdyI+PC9jYXB0aW9uPgogICAgICAgICAgPHRoZWFkIGlkPSJoZWFkZXIiIHJvbGU9InJvd2dyb3VwIj48L3RoZWFkPgogICAgICAgICAgPHRib2R5IGlkPSJpdGVtcyIgcm9sZT0icm93Z3JvdXAiPjwvdGJvZHk+CiAgICAgICAgICA8dGZvb3QgaWQ9ImZvb3RlciIgcm9sZT0icm93Z3JvdXAiPjwvdGZvb3Q+CiAgICAgICAgPC90YWJsZT4KCiAgICAgICAgPGRpdiBwYXJ0PSJyZW9yZGVyLWdob3N0Ij48L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGlkPSJmb2N1c2V4aXQiIHRhYmluZGV4PSIwIj48L2Rpdj4KICAgIGB9c3RhdGljIGdldCBpcygpe3JldHVybiJ2YWFkaW4tZ3JpZCJ9c3RhdGljIGdldCB2ZXJzaW9uKCl7cmV0dXJuIjIwLjAuMiJ9c3RhdGljIGdldCBvYnNlcnZlcnMoKXtyZXR1cm5bIl9jb2x1bW5UcmVlQ2hhbmdlZChfY29sdW1uVHJlZSwgX2NvbHVtblRyZWUuKikiXX1zdGF0aWMgZ2V0IHByb3BlcnRpZXMoKXtyZXR1cm57X3NhZmFyaTp7dHlwZTpCb29sZWFuLHZhbHVlOi9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl9LF9pb3M6e3R5cGU6Qm9vbGVhbix2YWx1ZTovaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmIXdpbmRvdy5NU1N0cmVhbXx8Ik1hY0ludGVsIj09PW5hdmlnYXRvci5wbGF0Zm9ybSYmbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzPjF9LF9maXJlZm94Ont0eXBlOkJvb2xlYW4sdmFsdWU6bmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImZpcmVmb3giKT4tMX0sX2FuZHJvaWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTovYW5kcm9pZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl9LF90b3VjaERldmljZTp7dHlwZTpCb29sZWFuLHZhbHVlOmlLdH0saGVpZ2h0QnlSb3dzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLG9ic2VydmVyOiJfaGVpZ2h0QnlSb3dzQ2hhbmdlZCJ9LF9yZWNhbGN1bGF0ZUNvbHVtbldpZHRoT25jZUxvYWRpbmdGaW5pc2hlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfX19Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uZW5kIix0aGlzLl9vbkFuaW1hdGlvbkVuZCl9Y29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLHRoaXMucmVjYWxjdWxhdGVDb2x1bW5XaWR0aHMoKX1hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodCxlLG4pe3N1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0LGUsbiksImRpciI9PT10JiYodGhpcy5fX2lzUlRMPSJydGwiPT09bix0aGlzLl91cGRhdGVTY3JvbGxlck1lYXN1cmVtZW50cygpKX1fX2hhc1Jvd3NXaXRoQ2xpZW50SGVpZ2h0KCl7cmV0dXJuISFBcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZmlsdGVyKCh0PT50LmNsaWVudEhlaWdodCkpLmxlbmd0aH1fX2l0ZW1zUmVjZWl2ZWQoKXt0aGlzLl9yZWNhbGN1bGF0ZUNvbHVtbldpZHRoT25jZUxvYWRpbmdGaW5pc2hlZCYmIXRoaXMuX2NhY2hlLmlzTG9hZGluZygpJiZ0aGlzLl9faGFzUm93c1dpdGhDbGllbnRIZWlnaHQoKSYmKHRoaXMuX3JlY2FsY3VsYXRlQ29sdW1uV2lkdGhPbmNlTG9hZGluZ0ZpbmlzaGVkPSExLHRoaXMucmVjYWxjdWxhdGVDb2x1bW5XaWR0aHMoKSl9X3JlY2FsY3VsYXRlQ29sdW1uV2lkdGhzKHQpe3QuZm9yRWFjaCgodD0+e3Qud2lkdGg9ImF1dG8iLHQuX29yaWdGbGV4R3Jvdz10LmZsZXhHcm93LHQuZmxleEdyb3c9MH0pKSx0LmZvckVhY2goKHQ9Pnt0Ll9jdXJyZW50V2lkdGg9MCx0Ll9hbGxDZWxscy5mb3JFYWNoKChlPT57dC5fY3VycmVudFdpZHRoPU1hdGgubWF4KHQuX2N1cnJlbnRXaWR0aCxlLm9mZnNldFdpZHRoKzEpfSkpfSkpLHQuZm9yRWFjaCgodD0+e3Qud2lkdGg9YCR7dC5fY3VycmVudFdpZHRofXB4YCx0LmZsZXhHcm93PXQuX29yaWdGbGV4R3Jvdyx0Ll9jdXJyZW50V2lkdGg9dm9pZCAwLHQuX29yaWdGbGV4R3Jvdz12b2lkIDB9KSl9cmVjYWxjdWxhdGVDb2x1bW5XaWR0aHMoKXtpZih0aGlzLl9jb2x1bW5UcmVlKWlmKHRoaXMuX2NhY2hlLmlzTG9hZGluZygpKXRoaXMuX3JlY2FsY3VsYXRlQ29sdW1uV2lkdGhPbmNlTG9hZGluZ0ZpbmlzaGVkPSEwO2Vsc2V7Y29uc3QgdD10aGlzLl9nZXRDb2x1bW5zKCkuZmlsdGVyKCh0PT4hdC5oaWRkZW4mJnQuYXV0b1dpZHRoKSk7dGhpcy5fcmVjYWxjdWxhdGVDb2x1bW5XaWR0aHModCl9fV9jcmVhdGVTY3JvbGxlclJvd3ModCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPHQ7bisrKXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7dC5zZXRBdHRyaWJ1dGUoInBhcnQiLCJyb3ciKSx0LnNldEF0dHJpYnV0ZSgicm9sZSIsInJvdyIpLHRoaXMuX2NvbHVtblRyZWUmJnRoaXMuX3VwZGF0ZVJvdyh0LHRoaXMuX2NvbHVtblRyZWVbdGhpcy5fY29sdW1uVHJlZS5sZW5ndGgtMV0sImJvZHkiLCExLCEwKSxlLnB1c2godCl9cmV0dXJuIHRoaXMuX2NvbHVtblRyZWUmJnRoaXMuX2NvbHVtblRyZWVbdGhpcy5fY29sdW1uVHJlZS5sZW5ndGgtMV0uZm9yRWFjaCgodD0+dC5pc0Nvbm5lY3RlZCYmdC5ub3RpZnlQYXRoJiZ0Lm5vdGlmeVBhdGgoIl9jZWxscy4qIix0Ll9jZWxscykpKSwoZnVuY3Rpb24gbih0LGUsaSl7RWl8fEFpKCksVGkucHVzaChbdCxlLGldKX0pKHRoaXMsKCgpPT57dGhpcy5fdXBkYXRlRmlyc3RBbmRMYXN0Q29sdW1uKCksdGhpcy5fcmVzZXRLZXlib2FyZE5hdmlnYXRpb24oKX0pKSxlfV9nZXRSb3dUYXJnZXQoKXtyZXR1cm4gdGhpcy4kLml0ZW1zfV9jcmVhdGVDZWxsKHQpe2NvbnN0IGU9InZhYWRpbi1ncmlkLWNlbGwtY29udGVudC0iKyh0aGlzLl9jb250ZW50SW5kZXg9dGhpcy5fY29udGVudEluZGV4KzF8fDApLG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtY2VsbC1jb250ZW50Iik7bi5zZXRBdHRyaWJ1dGUoInNsb3QiLGUpO2NvbnN0IGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0KTtpLmlkPWUucmVwbGFjZSgiLWNvbnRlbnQtIiwiLSIpLGkuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIi0xIiksaS5zZXRBdHRyaWJ1dGUoInJvbGUiLCJ0ZCI9PT10PyJncmlkY2VsbCI6ImNvbHVtbmhlYWRlciIpO2NvbnN0IHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2xvdCIpO3JldHVybiByLnNldEF0dHJpYnV0ZSgibmFtZSIsZSksaS5hcHBlbmRDaGlsZChyKSxpLl9jb250ZW50PW4sbi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLCgoKT0+e2lmKHdpbmRvdy5jaHJvbWUpe2NvbnN0IHQ9KCk9PntuLmNvbnRhaW5zKHRoaXMuZ2V0Um9vdE5vZGUoKS5hY3RpdmVFbGVtZW50KXx8aS5mb2N1cygpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHQsITApfTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0LCEwKX1lbHNlIHNldFRpbWVvdXQoKCgpPT57bi5jb250YWlucyh0aGlzLmdldFJvb3ROb2RlKCkuYWN0aXZlRWxlbWVudCl8fGkuZm9jdXMoKX0pKX0pKSxpfV91cGRhdGVSb3codCxlLG4saSxyKXtuPW58fCJib2R5Ijtjb25zdCBvPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtBcnJheS5mcm9tKHQuY2hpbGRyZW4pLmZvckVhY2goKHQ9PnQuX3ZhY2FudD0hMCkpLHQuaW5uZXJIVE1MPSIiLCJzaXplciIhPT10LmlkJiYodC5oaWRkZW49ITApLGUuZmlsdGVyKCh0PT4hdC5oaWRkZW4pKS5mb3JFYWNoKCgoZSxhLHMpPT57bGV0IGw7aWYoImJvZHkiPT09bil7aWYoZS5fY2VsbHM9ZS5fY2VsbHN8fFtdLGw9ZS5fY2VsbHMuZmlsdGVyKCh0PT50Ll92YWNhbnQpKVswXSxsfHwobD10aGlzLl9jcmVhdGVDZWxsKCJ0ZCIpLGUuX2NlbGxzLnB1c2gobCkpLGwuc2V0QXR0cmlidXRlKCJwYXJ0IiwiY2VsbCBib2R5LWNlbGwiKSx0LmFwcGVuZENoaWxkKGwpLGE9PT1zLmxlbmd0aC0xJiYodGhpcy5fcm93RGV0YWlsc1RlbXBsYXRlfHx0aGlzLnJvd0RldGFpbHNSZW5kZXJlcikpe3RoaXMuX2RldGFpbHNDZWxscz10aGlzLl9kZXRhaWxzQ2VsbHN8fFtdO2NvbnN0IGU9dGhpcy5fZGV0YWlsc0NlbGxzLmZpbHRlcigodD0+dC5fdmFjYW50KSlbMF18fHRoaXMuX2NyZWF0ZUNlbGwoInRkIik7LTE9PT10aGlzLl9kZXRhaWxzQ2VsbHMuaW5kZXhPZihlKSYmdGhpcy5fZGV0YWlsc0NlbGxzLnB1c2goZSksZS5fY29udGVudC5wYXJlbnRFbGVtZW50fHxvLmFwcGVuZENoaWxkKGUuX2NvbnRlbnQpLHRoaXMuX2NvbmZpZ3VyZURldGFpbHNDZWxsKGUpLHQuYXBwZW5kQ2hpbGQoZSksdGhpcy5fYTExeVNldFJvd0RldGFpbHNDZWxsKHQsZSksZS5fdmFjYW50PSExfWUubm90aWZ5UGF0aCYmIXImJmUubm90aWZ5UGF0aCgiX2NlbGxzLioiLGUuX2NlbGxzKX1lbHNle2NvbnN0IHI9ImhlYWRlciI9PT1uPyJ0aCI6InRkIjtpfHwidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWUubG9jYWxOYW1lPyhsPWVbYF8ke259Q2VsbGBdfHx0aGlzLl9jcmVhdGVDZWxsKHIpLGwuX2NvbHVtbj1lLHQuYXBwZW5kQ2hpbGQobCksZVtgXyR7bn1DZWxsYF09bCk6KGUuX2VtcHR5Q2VsbHM9ZS5fZW1wdHlDZWxsc3x8W10sbD1lLl9lbXB0eUNlbGxzLmZpbHRlcigodD0+dC5fdmFjYW50KSlbMF18fHRoaXMuX2NyZWF0ZUNlbGwociksbC5fY29sdW1uPWUsdC5hcHBlbmRDaGlsZChsKSwtMT09PWUuX2VtcHR5Q2VsbHMuaW5kZXhPZihsKSYmZS5fZW1wdHlDZWxscy5wdXNoKGwpKSxsLnNldEF0dHJpYnV0ZSgicGFydCIsYGNlbGwgJHtufS1jZWxsYCksdGhpcy5fX3VwZGF0ZUhlYWRlckZvb3RlclJvd1Zpc2liaWxpdHkodCl9bC5fY29udGVudC5wYXJlbnRFbGVtZW50fHxvLmFwcGVuZENoaWxkKGwuX2NvbnRlbnQpLGwuX3ZhY2FudD0hMSxsLl9jb2x1bW49ZX0pKSx0aGlzLmFwcGVuZENoaWxkKG8pLHRoaXMuX2Zyb3plbkNlbGxzQ2hhbmdlZCgpLHRoaXMuX3VwZGF0ZUZpcnN0QW5kTGFzdENvbHVtbkZvclJvdyh0KX1fX3VwZGF0ZUhlYWRlckZvb3RlclJvd1Zpc2liaWxpdHkodCl7aWYoIXQpcmV0dXJuO2NvbnN0IGU9QXJyYXkuZnJvbSh0LmNoaWxkcmVuKS5maWx0ZXIoKGU9Pntjb25zdCBuPWUuX2NvbHVtbjtpZihuLl9lbXB0eUNlbGxzJiZuLl9lbXB0eUNlbGxzLmluZGV4T2YoZSk+LTEpcmV0dXJuITE7aWYodC5wYXJlbnRFbGVtZW50PT09dGhpcy4kLmhlYWRlcil7aWYobi5oZWFkZXJSZW5kZXJlcnx8bi5faGVhZGVyVGVtcGxhdGUpcmV0dXJuITA7aWYobnVsbD09PW4uaGVhZGVyKXJldHVybiExO2lmKG4ucGF0aHx8dm9pZCAwIT09bi5oZWFkZXIpcmV0dXJuITB9ZWxzZSBpZihuLmZvb3RlclJlbmRlcmVyfHxuLl9mb290ZXJUZW1wbGF0ZSlyZXR1cm4hMH0pKTt0LmhpZGRlbiE9PSFlLmxlbmd0aCYmKHQuaGlkZGVuPSFlLmxlbmd0aCx0aGlzLm5vdGlmeVJlc2l6ZSgpKX1fdXBkYXRlU2Nyb2xsZXJJdGVtKHQsZSl7dGhpcy5fcHJldmVudFNjcm9sbGVyUm90YXRpbmdDZWxsRm9jdXModCxlKSx0aGlzLl9jb2x1bW5UcmVlJiYodGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJmaXJzdCIsMD09PWUsdCksdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJvZGQiLGUlMix0KSx0aGlzLl9hMTF5VXBkYXRlUm93Um93aW5kZXgodCxlKSx0aGlzLl9nZXRJdGVtKGUsdCkpfV9jb2x1bW5UcmVlQ2hhbmdlZCh0KXt0aGlzLl9yZW5kZXJDb2x1bW5UcmVlKHQpLHRoaXMucmVjYWxjdWxhdGVDb2x1bW5XaWR0aHMoKX1fcmVuZGVyQ29sdW1uVHJlZSh0KXtmb3IoQXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pLmZvckVhY2goKGU9PnRoaXMuX3VwZGF0ZVJvdyhlLHRbdC5sZW5ndGgtMV0sbnVsbCwhMSwhMCkpKTt0aGlzLiQuaGVhZGVyLmNoaWxkcmVuLmxlbmd0aDx0Lmxlbmd0aDspe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTt0LnNldEF0dHJpYnV0ZSgicGFydCIsInJvdyIpLHQuc2V0QXR0cmlidXRlKCJyb2xlIiwicm93IiksdGhpcy4kLmhlYWRlci5hcHBlbmRDaGlsZCh0KTtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7ZS5zZXRBdHRyaWJ1dGUoInBhcnQiLCJyb3ciKSxlLnNldEF0dHJpYnV0ZSgicm9sZSIsInJvdyIpLHRoaXMuJC5mb290ZXIuYXBwZW5kQ2hpbGQoZSl9Zm9yKDt0aGlzLiQuaGVhZGVyLmNoaWxkcmVuLmxlbmd0aD50Lmxlbmd0aDspdGhpcy4kLmhlYWRlci5yZW1vdmVDaGlsZCh0aGlzLiQuaGVhZGVyLmZpcnN0RWxlbWVudENoaWxkKSx0aGlzLiQuZm9vdGVyLnJlbW92ZUNoaWxkKHRoaXMuJC5mb290ZXIuZmlyc3RFbGVtZW50Q2hpbGQpO0FycmF5LmZyb20odGhpcy4kLmhlYWRlci5jaGlsZHJlbikuZm9yRWFjaCgoKGUsbik9PnRoaXMuX3VwZGF0ZVJvdyhlLHRbbl0sImhlYWRlciIsbj09PXQubGVuZ3RoLTEpKSksQXJyYXkuZnJvbSh0aGlzLiQuZm9vdGVyLmNoaWxkcmVuKS5mb3JFYWNoKCgoZSxuKT0+dGhpcy5fdXBkYXRlUm93KGUsdFt0Lmxlbmd0aC0xLW5dLCJmb290ZXIiLDA9PT1uKSkpLHRoaXMuX3VwZGF0ZVJvdyh0aGlzLiQuc2l6ZXIsdFt0Lmxlbmd0aC0xXSksdGhpcy5fcmVzaXplSGFuZGxlcigpLHRoaXMuX2Zyb3plbkNlbGxzQ2hhbmdlZCgpLHRoaXMuX3VwZGF0ZUZpcnN0QW5kTGFzdENvbHVtbigpLHRoaXMuX3Jlc2V0S2V5Ym9hcmROYXZpZ2F0aW9uKCksdGhpcy5fYTExeVVwZGF0ZUhlYWRlclJvd3MoKSx0aGlzLl9hMTF5VXBkYXRlRm9vdGVyUm93cygpLHRoaXMuX191cGRhdGVGb290ZXJQb3NpdGlvbmluZygpfV9fdXBkYXRlRm9vdGVyUG9zaXRpb25pbmcoKXt0aGlzLl9maXJlZm94JiYodGhpcy4kLml0ZW1zLnN0eWxlLnBhZGRpbmdCb3R0b209MCx0aGlzLmhlaWdodEJ5Um93c3x8KHRoaXMuJC5pdGVtcy5zdHlsZS5wYWRkaW5nQm90dG9tPWAke3RoaXMuJC5mb290ZXIub2Zmc2V0SGVpZ2h0fXB4YCkpLHRoaXMuX2lvcyYmIXdpbmRvdy5DU1Muc3VwcG9ydHMoInBvc2l0aW9uIiwic3RpY2t5IikmJih0aGlzLiQudGFibGUuc3R5bGUuaGVpZ2h0PSIiLHRoaXMuJC50YWJsZS5zdHlsZS5taW5IZWlnaHQ9IjEwMCUiLHRoaXMuJC50YWJsZS5zdHlsZS5tYXhIZWlnaHQ9IjEwMCUiLHNldFRpbWVvdXQoKCgpPT50aGlzLiQudGFibGUuc3R5bGUuaGVpZ2h0PWAke3RoaXMuJC5zY3JvbGxlci5vZmZzZXRIZWlnaHR9cHhgKSkpfV91cGRhdGVJdGVtKHQsZSl7dC5faXRlbT1lO2NvbnN0IG49dGhpcy5fX2dldFJvd01vZGVsKHQpO3RoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgic2VsZWN0ZWQiLG4uc2VsZWN0ZWQsdCksdGhpcy5fYTExeVVwZGF0ZVJvd1NlbGVjdGVkKHQsbi5zZWxlY3RlZCksdGhpcy5fYTExeVVwZGF0ZVJvd0xldmVsKHQsbi5sZXZlbCksdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJleHBhbmRlZCIsbi5leHBhbmRlZCx0KSx0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImRldGFpbHMtb3BlbmVkIix0aGlzLl9pc0RldGFpbHNPcGVuZWQoZSksdCksKHRoaXMuX3Jvd0RldGFpbHNUZW1wbGF0ZXx8dGhpcy5yb3dEZXRhaWxzUmVuZGVyZXIpJiZ0aGlzLl90b2dnbGVEZXRhaWxzQ2VsbCh0LGUpLHRoaXMuX2dlbmVyYXRlQ2VsbENsYXNzTmFtZXModCxuKSx0aGlzLl9maWx0ZXJEcmFnQW5kRHJvcCh0LG4pLEFycmF5LmZyb20odC5jaGlsZHJlbikuZm9yRWFjaCgodD0+e2lmKHQuX3JlbmRlcmVyKXtjb25zdCBlPXQuX2NvbHVtbnx8dGhpczt0Ll9yZW5kZXJlci5jYWxsKGUsdC5fY29udGVudCxlLG4pfWVsc2UgdC5faW5zdGFuY2UmJih0Ll9pbnN0YW5jZS5fX2RldGFpbHNPcGVuZWRfXz1uLmRldGFpbHNPcGVuZWQsdC5faW5zdGFuY2UuX19zZWxlY3RlZF9fPW4uc2VsZWN0ZWQsdC5faW5zdGFuY2UuX19sZXZlbF9fPW4ubGV2ZWwsdC5faW5zdGFuY2UuX19leHBhbmRlZF9fPW4uZXhwYW5kZWQsdC5faW5zdGFuY2Uuc2V0UHJvcGVydGllcyhuKSl9KSksdGhpcy5fZGVib3VuY2VyVXBkYXRlSGVpZ2h0cz1Ubi5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZXJVcGRhdGVIZWlnaHRzLGd0LmFmdGVyKDEpLCgoKT0+e3RoaXMuX3VwZGF0ZU1ldHJpY3MoKSx0aGlzLl9wb3NpdGlvbkl0ZW1zKCksdGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCl9KSl9X3Jlc2l6ZUhhbmRsZXIoKXt0aGlzLl91cGRhdGVEZXRhaWxzQ2VsbEhlaWdodHMoKSx0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSShzdXBlci5fcmVzaXplSGFuZGxlciwhMCksdGhpcy5fdXBkYXRlU2Nyb2xsZXJNZWFzdXJlbWVudHMoKSx0aGlzLl9fdXBkYXRlRm9vdGVyUG9zaXRpb25pbmcoKX1fb25BbmltYXRpb25FbmQodCl7MD09PXQuYW5pbWF0aW9uTmFtZS5pbmRleE9mKCJ2YWFkaW4tZ3JpZC1hcHBlYXIiKSYmKHRoaXMuX3JlbmRlcigpLHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5ub3RpZnlSZXNpemUoKSx0aGlzLl9faXRlbXNSZWNlaXZlZCgpLHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKCk9Pnt0aGlzLl9fc2Nyb2xsVG9QZW5kaW5nSW5kZXgoKSx0aGlzLiQudGFibGUuc3R5bGUud2Via2l0T3ZlcmZsb3dTY3JvbGxpbmc9InRvdWNoIn0pKSl9X3RvZ2dsZUF0dHJpYnV0ZSh0LGUsbil7bi5oYXNBdHRyaWJ1dGUodCk9PT0hZSYmKGU/bi5zZXRBdHRyaWJ1dGUodCwiIik6bi5yZW1vdmVBdHRyaWJ1dGUodCkpfV9fZ2V0Um93TW9kZWwodCl7cmV0dXJue2luZGV4OnQuaW5kZXgsaXRlbTp0Ll9pdGVtLGxldmVsOnRoaXMuX2dldEluZGV4TGV2ZWwodC5pbmRleCksZXhwYW5kZWQ6dGhpcy5faXNFeHBhbmRlZCh0Ll9pdGVtKSxzZWxlY3RlZDp0aGlzLl9pc1NlbGVjdGVkKHQuX2l0ZW0pLGRldGFpbHNPcGVuZWQ6ISghdGhpcy5fcm93RGV0YWlsc1RlbXBsYXRlJiYhdGhpcy5yb3dEZXRhaWxzUmVuZGVyZXIpJiZ0aGlzLl9pc0RldGFpbHNPcGVuZWQodC5faXRlbSl9fXJlbmRlcigpe3RoaXMuX2NvbHVtblRyZWUmJih0aGlzLl9jb2x1bW5UcmVlLmZvckVhY2goKHQ9Pnt0LmZvckVhY2goKHQ9PnQuX3JlbmRlckhlYWRlckFuZEZvb3RlcigpKSl9KSksdGhpcy5fdXBkYXRlKCkpfW5vdGlmeVJlc2l6ZSgpe3N1cGVyLm5vdGlmeVJlc2l6ZSgpfV9oZWlnaHRCeVJvd3NDaGFuZ2VkKHQsZSl7KHR8fGUpJiZ0aGlzLm5vdGlmeVJlc2l6ZSgpfV9fZm9yY2VSZWZsb3coKXt0aGlzLl9kZWJvdW5jZXJGb3JjZVJlZmxvdz1Ubi5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZXJGb3JjZVJlZmxvdyxfdCwoKCk9Pnt0aGlzLiQuc2Nyb2xsZXIuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsc2V0VGltZW91dCgoKCk9PnRoaXMuJC5zY3JvbGxlci5zdHlsZS5vdmVyZmxvdz0iIikpfSkpfX1jdXN0b21FbGVtZW50cy5kZWZpbmUockt0LmlzLHJLdCk7bGV0IG9LdD1jbGFzcyBleHRlbmRzIHlle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9ydW49IiJ9X2NzdlVybCh0LGUsbil7cmV0dXJuIGU/aU8obih0LGUpLHtmb3JtYXQ6ImNzdiJ9KToiIn1fanNvblVybCh0LGUsbil7cmV0dXJuIGU/bih0LGUpOiIifV9jc3ZOYW1lKHQsZSl7cmV0dXJuIGU/YHJ1bi0ke2V9LXRhZy0ke3R9LmNzdmA6IiJ9X2pzb25OYW1lKHQsZSl7cmV0dXJuIGU/YHJ1bi0ke2V9LXRhZy0ke3R9Lmpzb25gOiIifX07b0t0LnRlbXBsYXRlPV9lYAogICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUKICAgICAgbm8tbGFiZWwtZmxvYXQ9InRydWUiCiAgICAgIGxhYmVsPSJydW4gdG8gZG93bmxvYWQiCiAgICAgIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X3J1bn19IgogICAgPgogICAgICA8cGFwZXItbGlzdGJveCBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW3J1bnNdXSI+CiAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+W1tpdGVtXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19ydW5dXSI+CiAgICAgIDxhIGRvd25sb2FkPSJbW19jc3ZOYW1lKHRhZywgX3J1bildXSIgaHJlZj0iW1tfY3N2VXJsKHRhZywgX3J1biwgdXJsRm4pXV0iCiAgICAgICAgPkNTVjwvYQogICAgICA+PCEtLQogICAgICAtLT48YQogICAgICAgIGRvd25sb2FkPSJbW19qc29uTmFtZSh0YWcsIF9ydW4pXV0iCiAgICAgICAgaHJlZj0iW1tfanNvblVybCh0YWcsIF9ydW4sIHVybEZuKV1dIgogICAgICAgID5KU09OPC9hCiAgICAgID4KICAgIDwvdGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICB9CiAgICAgIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgfQogICAgICBhIHsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbWFyZ2luOiAwIDAuMmVtOwogICAgICB9CiAgICAgIHBhcGVyLWlucHV0IHsKICAgICAgICBmb250LXNpemU6IDIycHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxvS3QucHJvdG90eXBlLCJfcnVuIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxvS3QucHJvdG90eXBlLCJydW5zIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLG9LdC5wcm90b3R5cGUsInRhZyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxvS3QucHJvdG90eXBlLCJ1cmxGbiIsdm9pZCAwKSxvS3Q9dChbaSgidGYtZG93bmxvYWRlciIpXSxvS3QpLG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7bGV0IGFLdD1jbGFzcyBleHRlbmRzIHlle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvbG9yU2NhbGU9bnVsbCx0aGlzLl9sb2FkRGF0YUNhbGxiYWNrPSh0LGUsbik9PntpZihudWxsPT1uKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBsb2FkIGRhdGEgZm9yOiIsZSk7Y29uc3QgaT1uLm1hcCgodD0+KHt3YWxsX3RpbWU6bmV3IERhdGUoMWUzKnRbMF0pLHN0ZXA6dFsxXSxzY2FsYXI6dFsyXX0pKSkscj10aGlzLl9nZXRTZXJpZXNOYW1lRnJvbURhdHVtKGUpO3Quc2V0U2VyaWVzTWV0YWRhdGEocixlKSx0LnNldFNlcmllc0RhdGEocixpKX0sdGhpcy5nZXREYXRhTG9hZFVybD0oe3RhZzp0LHJ1bjplfSk9Pl9yKCkucGx1Z2luUm91dGUoInNjYWxhcnMiLCIvc2NhbGFycyIsbmV3IFVSTFNlYXJjaFBhcmFtcyh7dGFnOnQscnVuOmV9KSksdGhpcy5fZG93bmxvYWRVcmxGbj0odCxlKT0+dGhpcy5nZXREYXRhTG9hZFVybCh7dGFnOnQscnVuOmV9KSx0aGlzLnJlcXVlc3REYXRhPSh0LGUsbik9PnRoaXMuaW5Db2xhYj90aGlzLl9yZXF1ZXN0RGF0YUdldCh0LGUsbik6dGhpcy5fcmVxdWVzdERhdGFQb3N0KHQsZSxuKSx0aGlzLl9yZXF1ZXN0RGF0YUdldD0odCxlLG4pPT57Y29uc3QgaT1fcigpLnBsdWdpblJvdXRlKCJzY2FsYXJzIiwiL3NjYWxhcnMiKTtQcm9taXNlLmFsbCh0Lm1hcCgodD0+e2NvbnN0IG49aU8oaSx7dGFnOnQudGFnLHJ1bjp0LnJ1bn0pO3JldHVybiB0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QobikudGhlbigobj0+e2Uoe2l0ZW06dCxkYXRhOm59KX0pKX0pKSkuZmluYWxseSgoKCk9PntuKCl9KSl9LHRoaXMuX3JlcXVlc3REYXRhUG9zdD0odCxlLG4pPT57dmFyIGk7Y29uc3Qgcj1fcigpLnBsdWdpblJvdXRlKCJzY2FsYXJzIiwiL3NjYWxhcnNfbXVsdGlydW4iKSxvPW5ldyBNYXA7Zm9yKGNvbnN0e3RhZzplLHJ1bjpufW9mIHQpe2xldCB0PW8uZ2V0KGUpO251bGw9PXQmJm8uc2V0KGUsdD1bXSksdC5wdXNoKG4pfWNvbnN0IGE9bnVsbCE9PShpPXRoaXMuYmF0Y2hTaXplKSYmdm9pZCAwIT09aT9pOjY0LHM9W107Zm9yKGNvbnN0W3QsZV1vZiBvKWZvcihsZXQgbj0wO248ZS5sZW5ndGg7bis9YSlzLnB1c2goe3RhZzp0LHJ1bnM6ZS5zbGljZShuLG4rYSl9KTtQcm9taXNlLmFsbChzLm1hcCgoKHt0YWc6dCxydW5zOm59KT0+dGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHIse3RhZzp0LHJ1bnM6bn0pLnRoZW4oKGk9Pntmb3IoY29uc3QgciBvZiBuKXtjb25zdCBuPXt0YWc6dCxydW46cn07T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGkscik/ZSh7aXRlbTpuLGRhdGE6aVtyXX0pOmUoe2l0ZW06bixkYXRhOm51bGx9KX19KSkpKSkuZmluYWxseSgoKCk9PntuKCl9KSl9LHRoaXMuX2dldERhdGFMb2FkTmFtZT10PT50aGlzLl9nZXRTZXJpZXNOYW1lRnJvbURhdHVtKHQpLHRoaXMuX2V4cGFuZGVkPSExLHRoaXMuX3Rvb2x0aXBDb2x1bW5zPSgoKT0+e2NvbnN0IHQ9cEN0LnNsaWNlKCksZT10LmZpbmRJbmRleCgodD0+Ik5hbWUiPT10LnRpdGxlKSk7cmV0dXJuIHQuc3BsaWNlKGUsMSx7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOnQ9Pntjb25zdCBlPXQuZGF0YXNldC5tZXRhZGF0YSgpLm1ldGE7cmV0dXJuIHRoaXMuX2dldFNlcmllc0Rpc3BsYXlOYW1lRnJvbURhdHVtKGUpfX0pLHR9KSgpfV9nZXRDaGFydERhdGFMb2FkZXIoKXtyZXR1cm4gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKX1yZWxvYWQoKXt0aGlzLl9nZXRDaGFydERhdGFMb2FkZXIoKS5yZWxvYWQoKX1yZWRyYXcoKXt0aGlzLl9nZXRDaGFydERhdGFMb2FkZXIoKS5yZWRyYXcoKX1fdG9nZ2xlRXhwYW5kZWQodCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKSx0aGlzLnJlZHJhdygpfV90b2dnbGVMb2dTY2FsZSgpe3RoaXMuc2V0KCJfbG9nU2NhbGVBY3RpdmUiLCF0aGlzLl9sb2dTY2FsZUFjdGl2ZSl9X3Jlc2V0RG9tYWluKCl7Y29uc3QgdD10aGlzLl9nZXRDaGFydERhdGFMb2FkZXIoKTt0JiZ0LnJlc2V0RG9tYWluKCl9X3VwZGF0ZURvd25sb2FkTGluaygpe2NvbnN0IHQ9dGhpcy5fZ2V0Q2hhcnREYXRhTG9hZGVyKCkuZXhwb3J0QXNTdmdTdHJpbmcoKTt0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiI3N2Z0xpbmsiKS5ocmVmPWBkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCR7YnRvYSh0KX1gfV9ydW5zRnJvbURhdGEodCl7cmV0dXJuIHQubWFwKCh0PT50LnJ1bikpfV9nZXREYXRhU2VyaWVzKCl7cmV0dXJuIHRoaXMuZGF0YVRvTG9hZC5tYXAoKHQ9PnRoaXMuX2dldFNlcmllc05hbWVGcm9tRGF0dW0odCkpKX1fZ2V0U2VyaWVzTmFtZUZyb21EYXR1bSh7cnVuOnQsZXhwZXJpbWVudDplPXtuYW1lOiJfZGVmYXVsdCJ9fSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KFtlLm5hbWUsdF0pfV9nZXRTZXJpZXNEaXNwbGF5TmFtZUZyb21EYXR1bSh0KXtyZXR1cm4gdC5ydW59X2dldENvbG9yU2NhbGUoKXtyZXR1cm4gbnVsbCE9PXRoaXMuY29sb3JTY2FsZT90aGlzLmNvbG9yU2NhbGU6e3NjYWxlOnQ9Pntjb25zdFssZV09SlNPTi5wYXJzZSh0KTtyZXR1cm4gR1IoZSl9fX19O2FLdC50ZW1wbGF0ZT1fZWAKICAgIDx0Zi1jYXJkLWhlYWRpbmcKICAgICAgdGFnPSJbW3RhZ11dIgogICAgICBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIKICAgICAgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSIKICAgID48L3RmLWNhcmQtaGVhZGluZz4KICAgIDxkaXYgaWQ9InRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIj4KICAgICAgPHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIKICAgICAgICBhY3RpdmU9IltbYWN0aXZlXV0iCiAgICAgICAgY29sb3Itc2NhbGU9IltbX2dldENvbG9yU2NhbGUoY29sb3JTY2FsZSldXSIKICAgICAgICBkYXRhLXNlcmllcz0iW1tfZ2V0RGF0YVNlcmllcyhkYXRhVG9Mb2FkLiopXV0iCiAgICAgICAgZGF0YS10by1sb2FkPSJbW2RhdGFUb0xvYWRdXSIKICAgICAgICBnZXQtZGF0YS1sb2FkLW5hbWU9IltbX2dldERhdGFMb2FkTmFtZV1dIgogICAgICAgIGdldC1kYXRhLWxvYWQtdXJsPSJbW2dldERhdGFMb2FkVXJsXV0iCiAgICAgICAgcmVxdWVzdC1kYXRhPSJbW3JlcXVlc3REYXRhXV0iCiAgICAgICAgaWdub3JlLXktb3V0bGllcnM9IltbaWdub3JlWU91dGxpZXJzXV0iCiAgICAgICAgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19sb2FkRGF0YUNhbGxiYWNrXV0iCiAgICAgICAgbG9hZC1rZXk9IltbdGFnXV0iCiAgICAgICAgbG9nLXNjYWxlLWFjdGl2ZT0iW1tfbG9nU2NhbGVBY3RpdmVdXSIKICAgICAgICByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgICBzbW9vdGhpbmctZW5hYmxlZD0iW1tzbW9vdGhpbmdFbmFibGVkXV0iCiAgICAgICAgc21vb3RoaW5nLXdlaWdodD0iW1tzbW9vdGhpbmdXZWlnaHRdXSIKICAgICAgICB0YWctbWV0YWRhdGE9IltbdGFnTWV0YWRhdGFdXSIKICAgICAgICB0b29sdGlwLWNvbHVtbnM9IltbX3Rvb2x0aXBDb2x1bW5zXV0iCiAgICAgICAgdG9vbHRpcC1wb3NpdGlvbj0iYXV0byIKICAgICAgICB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iCiAgICAgICAgeC10eXBlPSJbW3hUeXBlXV0iCiAgICAgID4KICAgICAgPC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJidXR0b25zIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIgogICAgICAgIGljb249ImZ1bGxzY3JlZW4iCiAgICAgICAgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiCiAgICAgID48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICBzZWxlY3RlZCQ9IltbX2xvZ1NjYWxlQWN0aXZlXV0iCiAgICAgICAgaWNvbj0ibGluZS13ZWlnaHQiCiAgICAgICAgb24tdGFwPSJfdG9nZ2xlTG9nU2NhbGUiCiAgICAgICAgdGl0bGU9IlRvZ2dsZSB5LWF4aXMgbG9nIHNjYWxlIgogICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgaWNvbj0ic2V0dGluZ3Mtb3ZlcnNjYW4iCiAgICAgICAgb24tdGFwPSJfcmVzZXREb21haW4iCiAgICAgICAgdGl0bGU9IkZpdCBkb21haW4gdG8gZGF0YSIKICAgICAgPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93RG93bmxvYWRMaW5rc11dIj4KICAgICAgICA8cGFwZXItbWVudS1idXR0b24gb24tcGFwZXItZHJvcGRvd24tb3Blbj0iX3VwZGF0ZURvd25sb2FkTGluayI+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICAgICAgY2xhc3M9ImRyb3Bkb3duLXRyaWdnZXIiCiAgICAgICAgICAgIHNsb3Q9ImRyb3Bkb3duLXRyaWdnZXIiCiAgICAgICAgICAgIGljb249ImZpbGUtZG93bmxvYWQiCiAgICAgICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPGEgaWQ9InN2Z0xpbmsiIGRvd25sb2FkPSJbW3RhZ11dLnN2ZyI+CiAgICAgICAgICAgICAgICBEb3dubG9hZCBDdXJyZW50IENoYXJ0IGFzIFNWRwogICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgPC9wYXBlci1pdGVtPgogICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgIDwvcGFwZXItbWVudS1idXR0b24+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxzcGFuIHN0eWxlPSJmbGV4LWdyb3c6IDEiPjwvc3Bhbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dEb3dubG9hZExpbmtzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImRvd25sb2FkLWxpbmtzIj4KICAgICAgICAgIDx0Zi1kb3dubG9hZGVyCiAgICAgICAgICAgIHJ1bnM9IltbX3J1bnNGcm9tRGF0YShkYXRhVG9Mb2FkKV1dIgogICAgICAgICAgICB0YWc9IltbdGFnXV0iCiAgICAgICAgICAgIHVybC1mbj0iW1tfZG93bmxvYWRVcmxGbl1dIgogICAgICAgICAgPjwvdGYtZG93bmxvYWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgbWFyZ2luOiA1cHg7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDMzMHB4OwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgI3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICB9CgogICAgICAjdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjAwcHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHRmLWNhcmQtaGVhZGluZyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgfQoKICAgICAgI2J1dHRvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgYSB7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBtYXJnaW46IDJweDsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgfQoKICAgICAgcGFwZXItbWVudS1idXR0b24gewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KICAgICAgcGFwZXItaXRlbSBhIHsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGFLdC5wcm90b3R5cGUsInRhZyIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sYUt0LnByb3RvdHlwZSwiZGF0YVRvTG9hZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxhS3QucHJvdG90eXBlLCJ4VHlwZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGFLdC5wcm90b3R5cGUsImFjdGl2ZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGFLdC5wcm90b3R5cGUsImlnbm9yZVlPdXRsaWVycyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixkcildLGFLdC5wcm90b3R5cGUsInJlcXVlc3RNYW5hZ2VyIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sYUt0LnByb3RvdHlwZSwic2hvd0Rvd25MaW5rcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGFLdC5wcm90b3R5cGUsInNtb290aGluZ0VuYWJsZWQiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sYUt0LnByb3RvdHlwZSwic21vb3RoaW5nV2VpZ2h0Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGFLdC5wcm90b3R5cGUsInRhZ01ldGFkYXRhIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGFLdC5wcm90b3R5cGUsImNvbG9yU2NhbGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sYUt0LnByb3RvdHlwZSwidG9vbHRpcFNvcnRpbmdNZXRob2QiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sYUt0LnByb3RvdHlwZSwiYmF0Y2hTaXplIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxhS3QucHJvdG90eXBlLCJpbkNvbGFiIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGFLdC5wcm90b3R5cGUsIl9sb2FkRGF0YUNhbGxiYWNrIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKV0sYUt0LnByb3RvdHlwZSwiZ2V0RGF0YUxvYWRVcmwiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sYUt0LnByb3RvdHlwZSwiX2Rvd25sb2FkVXJsRm4iLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pXSxhS3QucHJvdG90eXBlLCJyZXF1ZXN0RGF0YSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxhS3QucHJvdG90eXBlLCJfZ2V0RGF0YUxvYWROYW1lIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGFLdC5wcm90b3R5cGUsIl9leHBhbmRlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGFLdC5wcm90b3R5cGUsIl9sb2dTY2FsZUFjdGl2ZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sYUt0LnByb3RvdHlwZSwiX3Rvb2x0aXBDb2x1bW5zIix2b2lkIDApLGFLdD10KFtpKCJ0Zi1zY2FsYXItY2FyZCIpXSxhS3QpO2xldCBzS3Q9Y2xhc3MgZXh0ZW5kcygoZnVuY3Rpb24gdChlLG4pe3JldHVybihmdW5jdGlvbiBpKHQsZSl7cmV0dXJuIE5yKHt9LGVyKGUpLHQpfSkoZSxuKX0pKFtfb10seWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5zZXNzaW9uR3JvdXA9bnVsbCx0aGlzLl94VHlwZT14VHQuU1RFUCx0aGlzLl9ub011bHRpRXhwZXJpbWVudHM9ITEsdGhpcy5fcmVxdWVzdERhdGE9KHQsZSxuKT0+e1Byb21pc2UuYWxsKHQubWFwKCh0PT50aGlzLmJhY2tlbmQubGlzdE1ldHJpY0V2YWxzKHtleHBlcmltZW50TmFtZTp0aGlzLmV4cGVyaW1lbnROYW1lLHNlc3Npb25OYW1lOnQucnVuLG1ldHJpY05hbWU6dC50YWd9KS50aGVuKChuPT57ZSh7aXRlbTp0LGRhdGE6bn0pfSkpKSkpLmZpbmFsbHkoKCgpPT57bigpfSkpfSx0aGlzLl9jb2xvclNjYWxlPXtzY2FsZTp0PT57Y29uc3QgZT1KU09OLnBhcnNlKHQpWzFdLG49dGhpcy5faW5kZXhPZlNlc3Npb24uZ2V0KGUpO3JldHVybiBIUlsodGhpcy5fc2Vzc2lvbkdyb3VwTmFtZUhhc2grbiklSFIubGVuZ3RoXX19fWNvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImlyb24tcmVzaXplIix0aGlzLnJlZHJhdy5iaW5kKHRoaXMpKX1yZWRyYXcoKXt0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtc2NhbGFyLWNhcmQiKS5mb3JFYWNoKCh0PT50LnJlZHJhdygpKSl9X3Nlc3Npb25Hcm91cENoYW5nZWQoKXt0aGlzLnNlc3Npb25Hcm91cCYmMCE9T2JqZWN0LmtleXModGhpcy5zZXNzaW9uR3JvdXApLmxlbmd0aD8odGhpcy5faW5kZXhPZlNlc3Npb249bmV3IE1hcCh0aGlzLnNlc3Npb25Hcm91cC5zZXNzaW9ucy5tYXAoKCh0LGUpPT5bdC5uYW1lLGVdKSkpLHRoaXMuX3Nlc3Npb25Hcm91cE5hbWVIYXNoPVlZdCh0aGlzLnNlc3Npb25Hcm91cC5uYW1lKSk6KHRoaXMuX2luZGV4T2ZTZXNzaW9uPW5ldyBNYXAsdGhpcy5fc2Vzc2lvbkdyb3VwTmFtZUhhc2g9MCksdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLXNjYWxhci1jYXJkIikuZm9yRWFjaCgodD0+e2NvbnN0IGU9dCxuPWUuZ2V0KCJ0YWciKTtlLnNldCgidGFnIiwiIiksZS5zZXQoInRhZyIsbil9KSl9X2hhdmVNZXRyaWNzKCl7cmV0dXJuIHRoaXMudmlzaWJsZVNjaGVtYSYmQXJyYXkuaXNBcnJheSh0aGlzLnZpc2libGVTY2hlbWEubWV0cmljSW5mb3MpJiZ0aGlzLnZpc2libGVTY2hlbWEubWV0cmljSW5mb3MubGVuZ3RoPjB9X2hhdmVNZXRyaWNzQW5kU2Vzc2lvbkdyb3VwKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbkdyb3VwJiZ0aGlzLl9oYXZlTWV0cmljcygpfV9jb21wdXRlU2VyaWVzRm9yU2Vzc2lvbkdyb3VwTWV0cmljKHQsZSl7cmV0dXJuIG51bGw9PT10fHwwPT1PYmplY3Qua2V5cyh0KS5sZW5ndGh8fG51bGw9PT1lP1tdOnQuc2Vzc2lvbnMuZmlsdGVyKCh0PT52b2lkIDAhPT1BWXQodC5tZXRyaWNWYWx1ZXMsZS5uYW1lKSkpLm1hcCgodD0+KHt0YWc6ZS5uYW1lLHJ1bjp0Lm5hbWV9KSkpfV9jb21wdXRlVGFnTWV0YWRhdGEodCl7cmV0dXJue2Rpc3BsYXlOYW1lOndZdCh0KSxkZXNjcmlwdGlvbjp0LmRlc2NyaXB0aW9ufHwiIn19fTtzS3QudGVtcGxhdGU9X2VgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIXNlc3Npb25Hcm91cF1dIj4KICAgICAgPGRpdj4KICAgICAgICA8aDM+Tm8gc2Vzc2lvbiBncm91cCBzZWxlY3RlZDwvaDM+CiAgICAgICAgPHA+UGxlYXNlIHNlbGVjdCBhIHNlc3Npb24gZ3JvdXAgdG8gc2VlIGl0cyBtZXRyaWMtZ3JhcGhzIGhlcmUuPC9wPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9oYXZlTWV0cmljcyh2aXNpYmxlU2NoZW1hLiopXV0iPgogICAgICA8ZGl2PgogICAgICAgIDxoMz5ObyBtZXRyaWNzIGFyZSBlbmFibGVkPC9oMz4KICAgICAgICA8cD5QbGVhc2UgZW5hYmxlIHNvbWUgbWV0cmljcyB0byBzZWUgY29udGVudCBoZXJlLjwvcD4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0ibGF5b3V0IGhvcml6b250YWwgd3JhcCBzZXNzaW9uLWdyb3VwLWRldGFpbHMiPgogICAgICA8dGVtcGxhdGUKICAgICAgICBpcz0iZG9tLWlmIgogICAgICAgIGlmPSJbW19oYXZlTWV0cmljc0FuZFNlc3Npb25Hcm91cCh2aXNpYmxlU2NoZW1hLiosIHNlc3Npb25Hcm91cCldXSIKICAgICAgPgogICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgICBpdGVtcz0iW1t2aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zXV0iCiAgICAgICAgICBhcz0ibWV0cmljSW5mbyIKICAgICAgICA+CiAgICAgICAgICA8IS0tIE5vdGUgdGhhdCB3ZSBkbyBub3QgcHJvdmlkZSBhIHJlcXVlc3QtbWFuYWdlciBhdHRyaWJ1dGUgc2luY2UKICAgICAgICAgICAgICAgd2UgcHJvdmlkZSBhIGZ1bmN0aW9uIGluIHJlcXVlc3QtZGF0YSBmb3IgY2FsbGluZyB0aGUgYmFja2VuZAogICAgICAgICAgICAgICB0byBnZXQgdGhlIG1ldHJpY3MgZGF0YS4KICAgICAgICAgICAgLS0+CiAgICAgICAgICA8dGYtc2NhbGFyLWNhcmQKICAgICAgICAgICAgY2xhc3M9InNjYWxhci1jYXJkIgogICAgICAgICAgICBjb2xvci1zY2FsZT0iW1tfY29sb3JTY2FsZV1dIgogICAgICAgICAgICBkYXRhLXRvLWxvYWQ9IltbX2NvbXB1dGVTZXJpZXNGb3JTZXNzaW9uR3JvdXBNZXRyaWMoc2Vzc2lvbkdyb3VwLCBtZXRyaWNJbmZvKV1dIgogICAgICAgICAgICB0YWc9IltbbWV0cmljSW5mby5uYW1lLnRhZ11dIgogICAgICAgICAgICB0YWctbWV0YWRhdGE9IltbX2NvbXB1dGVUYWdNZXRhZGF0YShtZXRyaWNJbmZvKV1dIgogICAgICAgICAgICB4LXR5cGU9IltbX3hUeXBlXV0iCiAgICAgICAgICAgIG11bHRpLWV4cGVyaW1lbnRzPSJbW19ub011bHRpRXhwZXJpbWVudHNdXSIKICAgICAgICAgICAgcmVxdWVzdC1kYXRhPSJbW19yZXF1ZXN0RGF0YV1dIgogICAgICAgICAgICBhY3RpdmUKICAgICAgICAgID4KICAgICAgICAgIDwvdGYtc2NhbGFyLWNhcmQ+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPCEtLSAiaXJvbi1mbGV4IiBpcyBuZWVkZWQgdG8gdXNlIHRoZSBsYXlvdXQgY2xhc3NlcyBpbiB0aGUgZGl2IGFib3ZlIC0tPgogICAgPHN0eWxlIGluY2x1ZGU9Imlyb24tZmxleCI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHNLdC5wcm90b3R5cGUsImJhY2tlbmQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sc0t0LnByb3RvdHlwZSwiZXhwZXJpbWVudE5hbWUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sc0t0LnByb3RvdHlwZSwidmlzaWJsZVNjaGVtYSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxzS3QucHJvdG90eXBlLCJzZXNzaW9uR3JvdXAiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sc0t0LnByb3RvdHlwZSwiX3hUeXBlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sc0t0LnByb3RvdHlwZSwiX25vTXVsdGlFeHBlcmltZW50cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxzS3QucHJvdG90eXBlLCJfaW5kZXhPZlNlc3Npb24iLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sc0t0LnByb3RvdHlwZSwiX3Nlc3Npb25Hcm91cE5hbWVIYXNoIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKV0sc0t0LnByb3RvdHlwZSwiX3JlcXVlc3REYXRhIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHNLdC5wcm90b3R5cGUsIl9jb2xvclNjYWxlIix2b2lkIDApLHQoW2EoInNlc3Npb25Hcm91cC4qIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxzS3QucHJvdG90eXBlLCJfc2Vzc2lvbkdyb3VwQ2hhbmdlZCIsbnVsbCksc0t0PXQoW2koInRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzIildLHNLdCk7bGV0IGxLdD1jbGFzcyBleHRlbmRzKGVyKGlsKHllKSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9ocGFyYW1OYW1lPXhZdCx0aGlzLl9tZXRyaWNOYW1lPXdZdH1fdmlzaWJsZVNjaGVtYU9yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQoKXtjb25zdCB0PXRoaXMuJC5zZXNzaW9uR3JvdXBzVGFibGUuZ2V0KCJkZXRhaWxzT3BlbmVkSXRlbXMiKTt0aGlzLiQuc2Vzc2lvbkdyb3Vwc1RhYmxlLnNldCgiZGV0YWlsc09wZW5lZEl0ZW1zIixbXSksRGkoKTtjb25zdCBlPW5ldyBNYXA7dGhpcy5zZXNzaW9uR3JvdXBzLmZvckVhY2goKHQ9PntlLnNldCh0Lm5hbWUsdCl9KSksdGhpcy4kLnNlc3Npb25Hcm91cHNUYWJsZS5zZXQoImRldGFpbHNPcGVuZWRJdGVtcyIsdC5tYXAoKHQ9PmUuZ2V0KHQubmFtZSkpKS5maWx0ZXIoQm9vbGVhbikpfV9zZXNzaW9uR3JvdXBIUGFyYW0odCxlKXtyZXR1cm4gbnVsbCE9dCYmMCE9T2JqZWN0LmtleXModCkubGVuZ3RoJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodC5ocGFyYW1zLGUpP1ZZdCh0LmhwYXJhbXNbZV0pOiIifV9zZXNzaW9uR3JvdXBNZXRyaWModCxlKXtpZihudWxsPT10fHwwPT1PYmplY3Qua2V5cyh0KS5sZW5ndGgpcmV0dXJuIiI7Zm9yKGxldCBuPTA7bjx0Lm1ldHJpY1ZhbHVlcy5sZW5ndGg7KytuKXtsZXQgaT10Lm1ldHJpY1ZhbHVlc1tuXTtpZihpLm5hbWUuZ3JvdXA9PT1lLmdyb3VwJiZpLm5hbWUudGFnPT1lLnRhZylyZXR1cm4gVll0KGkudmFsdWUpfXJldHVybiIifV9yb3dOdW1iZXIodCl7cmV0dXJuIHQrMX19O2xLdC50ZW1wbGF0ZT1fZWAKICAgIDx2YWFkaW4tZ3JpZAogICAgICBjbGFzcz0ic2Vzc2lvbi1ncm91cC10YWJsZSIKICAgICAgaWQ9InNlc3Npb25Hcm91cHNUYWJsZSIKICAgICAgY29sdW1uLXJlb3JkZXJpbmctYWxsb3dlZD0iIgogICAgICBpdGVtcz0iW1tzZXNzaW9uR3JvdXBzXV0iCiAgICA+CiAgICAgIDx2YWFkaW4tZ3JpZC1jb2x1bW4gZmxleC1ncm93PSIwIiB3aWR0aD0iMTBlbSIgcmVzaXphYmxlPSIiPgogICAgICAgIDx0ZW1wbGF0ZSBjbGFzcz0iaGVhZGVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj5UcmlhbCBJRDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY2VsbCI+W1tpdGVtLm5hbWVdXTwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvdmFhZGluLWdyaWQtY29sdW1uPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbZW5hYmxlU2hvd01ldHJpY3NdXSI+CiAgICAgICAgPHZhYWRpbi1ncmlkLWNvbHVtbiBmbGV4LWdyb3c9IjAiIGF1dG9XaWR0aD0iIiByZXNpemFibGU9IiI+CiAgICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj5TaG93IE1ldHJpY3M8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjbGFzcz0idGFibGUtY2VsbCIgY2hlY2tlZD0ie3tkZXRhaWxzT3BlbmVkfX0iPgogICAgICAgICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlCiAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgaXRlbXM9IltbdmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvc11dIgogICAgICAgIGFzPSJocGFyYW1JbmZvIgogICAgICAgIGluZGV4LWFzPSJocGFyYW1JbmRleCIKICAgICAgPgogICAgICAgIDx2YWFkaW4tZ3JpZC1jb2x1bW4gZmxleC1ncm93PSIyIiB3aWR0aD0iMTBlbSIgcmVzaXphYmxlPSIiPgogICAgICAgICAgPHRlbXBsYXRlIGNsYXNzPSJoZWFkZXIiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXIgdGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgW1tfaHBhcmFtTmFtZShocGFyYW1JbmZvKV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgW1tfc2Vzc2lvbkdyb3VwSFBhcmFtKGl0ZW0sIGhwYXJhbUluZm8ubmFtZSldXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC92YWFkaW4tZ3JpZC1jb2x1bW4+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZQogICAgICAgIGlzPSJkb20tcmVwZWF0IgogICAgICAgIGl0ZW1zPSJ7e3Zpc2libGVTY2hlbWEubWV0cmljSW5mb3N9fSIKICAgICAgICBhcz0ibWV0cmljSW5mbyIKICAgICAgICBpbmRleC1hcz0ibWV0cmljSW5kZXgiCiAgICAgID4KICAgICAgICA8dmFhZGluLWdyaWQtY29sdW1uIGZsZXgtZ3Jvdz0iMiIgd2lkdGg9IjEwZW0iIHJlc2l6YWJsZT0iIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBjbGFzcz0iaGVhZGVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIHRhYmxlLWNlbGwiPgogICAgICAgICAgICAgIFtbX21ldHJpY05hbWUobWV0cmljSW5mbyldXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNlbGwiPgogICAgICAgICAgICAgIFtbX3Nlc3Npb25Hcm91cE1ldHJpYyhpdGVtLCBtZXRyaWNJbmZvLm5hbWUpXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdmFhZGluLWdyaWQtY29sdW1uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgY2xhc3M9InJvdy1kZXRhaWxzIj4KICAgICAgICA8dGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHMKICAgICAgICAgIGJhY2tlbmQ9IltbYmFja2VuZF1dIgogICAgICAgICAgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iCiAgICAgICAgICBzZXNzaW9uLWdyb3VwPSJbW2l0ZW1dXSIKICAgICAgICAgIHZpc2libGUtc2NoZW1hPSJbW3Zpc2libGVTY2hlbWFdXSIKICAgICAgICAgIGNsYXNzPSJzZXNzaW9uLWdyb3VwLWRldGFpbHMiCiAgICAgICAgPgogICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHM+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3ZhYWRpbi1ncmlkPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmRhcmstbW9kZSkgewogICAgICAgIC0tbHVtby1iYXNlLWNvbG9yOiAjMzAzMDMwOwogICAgICAgIC0tbHVtby1ib2R5LXRleHQtY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgIDpob3N0KC5kYXJrLW1vZGUpIHZhYWRpbi1ncmlkIHsKICAgICAgICAtLV9sdW1vLWdyaWQtc2Vjb25kYXJ5LWJvcmRlci1jb2xvcjogIzUwNTA1MDsKICAgICAgfQoKICAgICAgLnRhYmxlLWNlbGwgewogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAudGFibGUtaGVhZGVyIHsKICAgICAgICAvKiBsaW5lLWJyZWFrIG92ZXJmbG93aW5nIGNvbHVtbiBoZWFkZXJzICovCiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIC5zZXNzaW9uLWdyb3VwLXRhYmxlIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlc3Npb24tZ3JvdXAtZGV0YWlscyB7CiAgICAgICAgaGVpZ2h0OiAzNjBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sbEt0LnByb3RvdHlwZSwidmlzaWJsZVNjaGVtYSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sbEt0LnByb3RvdHlwZSwic2Vzc2lvbkdyb3VwcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGxLdC5wcm90b3R5cGUsImVuYWJsZVNob3dNZXRyaWNzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGxLdC5wcm90b3R5cGUsImJhY2tlbmQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sbEt0LnByb3RvdHlwZSwiZXhwZXJpbWVudE5hbWUiLHZvaWQgMCksdChbYSgidmlzaWJsZVNjaGVtYS4qIiwic2Vzc2lvbkdyb3Vwcy4qIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxsS3QucHJvdG90eXBlLCJfdmlzaWJsZVNjaGVtYU9yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQiLG51bGwpLGxLdD10KFtpKCJ0Zi1ocGFyYW1zLXRhYmxlLXZpZXciKV0sbEt0KTtsZXQgY0t0PWNsYXNzIGV4dGVuZHMgeWV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuc2Vzc2lvbkdyb3VwPW51bGwsdGhpcy52aXNpYmxlU2NoZW1hPW51bGx9X3Byb3BlcnRpZXNBcmVQb3B1bGF0ZWQodCxlKXtyZXR1cm4gbnVsbCE9dCYmbnVsbCE9ZX1fc2luZ2xldG9uU2Vzc2lvbkdyb3Vwcyh0KXtyZXR1cm4gbnVsbD09dD9bXTpbdF19fTtmdW5jdGlvbiB1S3QodCxlLG4pe2Z1bmN0aW9uIGkoKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuWzEsMl07Y29uc3RbZSxuXT1MbCh0KTtyZXR1cm4gZSE9PW4/W2Usbl06ZT4wP1suNSplLDEuNSplXTplPDA/WzEuNSplLC41KmVdOlstMSwxXX1pZigiTElORUFSIj09PW4pcmV0dXJuIFZNKCkuZG9tYWluKGkoKSkucmFuZ2UoW2UsMF0pO2lmKCJMT0ciPT09bil7Y29uc3Qgbj1pKCk7cmV0dXJuIG5bMF08PTAmJm5bMV0+PTA/dUt0KHQsZSwiTElORUFSIik6S00oKS5kb21haW4obikucmFuZ2UoW2UsMF0pfWlmKCJRVUFOVElMRSI9PT1uKXtjb25zdCBuPTIwLGk9emwobikubWFwKCh0PT5lLXQqZS8obi0xKSkpO3JldHVybiAwPT09dC5sZW5ndGgmJih0PVsxXSksb0UoKS5kb21haW4oU2UuZXhwb3J0cy51bmlxKHQpKS5yYW5nZShpKX1pZigiTk9OX05VTUVSSUMiPT09bilyZXR1cm4gQU0oKS5kb21haW4oU2UuZXhwb3J0cy51bmlxKHQuc29ydCgpKSkucmFuZ2UoW2UsMF0pLnBhZGRpbmcoLjEpO3Rocm93IFJhbmdlRXJyb3IoIlVua25vd24gc2NhbGU6ICIrbil9dmFyIGhLdCxkS3Q7Y0t0LnRlbXBsYXRlPV9lYAogICAgPCEtLSBJZiBzZXNzaW9uR3JvdXAgb3IgdmlzaWJsZVNjaGVtYSBhcmUgbm90IHBvcHVsYXRlZCwgZG8gbm90IGRpc3BsYXkKICAgICAgICAgYW55dGhpbmcuCiAgICAgIC0tPgogICAgPHRlbXBsYXRlCiAgICAgIGlzPSJkb20taWYiCiAgICAgIGlmPSJbW19wcm9wZXJ0aWVzQXJlUG9wdWxhdGVkKHZpc2libGVTY2hlbWEsIHNlc3Npb25Hcm91cCldXSIKICAgID4KICAgICAgPCEtLSBEaXNwbGF5IG9uZSByb3cgd2l0aG91dCBhICJzaG93LW1ldHJpY3MiIGNvbHVtbiAtLT4KICAgICAgPHRmLWhwYXJhbXMtdGFibGUtdmlldwogICAgICAgIHZpc2libGUtc2NoZW1hPSJbW3Zpc2libGVTY2hlbWFdXSIKICAgICAgICBzZXNzaW9uLWdyb3Vwcz0iW1tfc2luZ2xldG9uU2Vzc2lvbkdyb3VwcyhzZXNzaW9uR3JvdXApXV0iCiAgICAgID4KICAgICAgPC90Zi1ocGFyYW1zLXRhYmxlLXZpZXc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlCiAgICAgIGlzPSJkb20taWYiCiAgICAgIGlmPSJbWyFfcHJvcGVydGllc0FyZVBvcHVsYXRlZCh2aXNpYmxlU2NoZW1hLCBzZXNzaW9uR3JvdXApXV0iCiAgICA+CiAgICAgIDxkaXY+Q2xpY2sgb3IgaG92ZXIgb3ZlciBhIHNlc3Npb24gZ3JvdXAgdG8gZGlzcGxheSBpdHMgdmFsdWVzIGhlcmUuPC9kaXY+CiAgICA8L3RlbXBsYXRlPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sY0t0LnByb3RvdHlwZSwic2Vzc2lvbkdyb3VwIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGNLdC5wcm90b3R5cGUsInZpc2libGVTY2hlbWEiLHZvaWQgMCksY0t0PXQoW2koInRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMiKV0sY0t0KSwoZnVuY3Rpb24odCl7dC5MSU5FQVI9IkxJTkVBUiIsdC5MT0c9IkxPRyIsdC5RVUFOVElMRT0iUVVBTlRJTEUiLHQuTk9OX05VTUVSSUM9Ik5PTl9OVU1FUklDIn0pKGhLdHx8KGhLdD17fSkpO2NsYXNzIHBLdHtpc1Bhc3NpbmcodCl7cmV0dXJuITB9fWNsYXNzIGZLdHtjb25zdHJ1Y3Rvcih0LGUsbixpKXt0aGlzLl9sb3dlcj10LHRoaXMuX3VwcGVyPWUsdGhpcy5fbG93ZXJPcGVuPW4sdGhpcy5fdXBwZXJPcGVuPWl9aXNQYXNzaW5nKHQpe2NvbnN0IGU9dDtyZXR1cm4gdGhpcy5fYmVmb3JlKHRoaXMuX2xvd2VyLGUsIXRoaXMuX2xvd2VyT3BlbikmJnRoaXMuX2JlZm9yZShlLHRoaXMuX3VwcGVyLCF0aGlzLl91cHBlck9wZW4pfV9iZWZvcmUodCxlLG4pe3JldHVybiBuP3Q8PWU6dDxlfX1jbGFzcyBtS3R7Y29uc3RydWN0b3IodCl7dGhpcy5fZG9tYWluU2V0PXR9aXNQYXNzaW5nKHQpe3JldHVybi0xIT09dGhpcy5fZG9tYWluU2V0LmZpbmRJbmRleCgoZT0+ZT09PXQpKX19Y2xhc3MgZ0t0e2NvbnN0cnVjdG9yKHQsZSxuLGkpe3RoaXMuX3N2Z1Byb3BzPXQsdGhpcy5fc2NoZW1hPWUsdGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyPW4sdGhpcy5fY29sSW5kZXg9aSx0aGlzLl9pc0Rpc3BsYXllZD0hMSx0aGlzLl95U2NhbGU9bnVsbCx0aGlzLl9zY2FsZVR5cGU9bnVsbCx0aGlzLnNldEJydXNoU2VsZWN0aW9uKG51bGwpfWNvbEluZGV4KCl7cmV0dXJuIHRoaXMuX2NvbEluZGV4fXlTY2FsZSgpe3JldHVybiB0aGlzLl95U2NhbGV9c2NhbGVUeXBlKCl7cmV0dXJuIHRoaXMuX3NjYWxlVHlwZX1icnVzaFNlbGVjdGlvbigpe3JldHVybiB0aGlzLl9icnVzaFNlbGVjdGlvbn1pc0Rpc3BsYXllZCgpe3JldHVybiB0aGlzLl9pc0Rpc3BsYXllZH1zZXRCcnVzaFNlbGVjdGlvbih0KXt0aGlzLl9icnVzaFNlbGVjdGlvbj10LHRoaXMuX2JydXNoRmlsdGVyPXRoaXMuX2J1aWxkQnJ1c2hGaWx0ZXIodGhpcy5icnVzaFNlbGVjdGlvbigpLHRoaXMuc2NhbGVUeXBlKCksdGhpcy55U2NhbGUoKSl9c2V0RG9tYWluQW5kU2NhbGUodCxlKXt0aGlzLl9zY2FsZVR5cGU9ZSx0aGlzLl95U2NhbGU9dUt0KHQuc2xpY2UoKSx0aGlzLl9zdmdQcm9wcy5oZWlnaHQsdGhpcy5zY2FsZVR5cGUoKSksdGhpcy5fYnJ1c2hGaWx0ZXI9dGhpcy5fYnVpbGRCcnVzaEZpbHRlcih0aGlzLmJydXNoU2VsZWN0aW9uKCksdGhpcy5zY2FsZVR5cGUoKSx0aGlzLnlTY2FsZSgpKX1icnVzaEZpbHRlcigpe3JldHVybiB0aGlzLl9icnVzaEZpbHRlcn11cGRhdGVET00odCl7bGV0IGU9YWModGhpcy55U2NhbGUoKSk7dGhpcy5zY2FsZVR5cGUoKT09PWhLdC5RVUFOVElMRSYmKGU9ZS50aWNrVmFsdWVzKHRoaXMueVNjYWxlKCkucXVhbnRpbGVzKCkpLnRpY2tGb3JtYXQobXkoIi0uNmciKSkpO2NvbnN0IG49U3UodCk7bi5zZWxlY3RBbGwoImciKS5yZW1vdmUoKSxuLmFwcGVuZCgiZyIpLmNsYXNzZWQoImF4aXMiLCEwKS5jYWxsKGUpLmFwcGVuZCgidGV4dCIpLmNsYXNzZWQoImF4aXMtdGl0bGUiLCEwKS5zdHlsZSgiY3Vyc29yIiwibW92ZSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLmF0dHIoInkiLC05KS50ZXh0KCh0PT5TWXQodGhpcy5fc2NoZW1hLHQpKSksbi5jYWxsKHZoKCkub24oInN0YXJ0IiwoKCk9Pnt0LnNldEF0dHJpYnV0ZSgiaXMtZHJhZ2dpbmciLCIiKSx0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25EcmFnU3RhcnQodGhpcy5jb2xJbmRleCgpKX0pKS5vbigiZHJhZyIsKCgpPT50aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25EcmFnKHV1LngpKSkub24oImVuZCIsKCgpPT57dGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uRHJhZ0VuZCgpLHQucmVtb3ZlQXR0cmlidXRlKCJpcy1kcmFnZ2luZyIpfSkpKTtjb25zdCBpPVptKCkuZXh0ZW50KFtbLTgsMF0sWzgsdGhpcy5fc3ZnUHJvcHMuaGVpZ2h0KzFdXSkub24oInN0YXJ0IiwoKCk9Pnt5S3QodXUpJiYodC5zZXRBdHRyaWJ1dGUoImlzLWJydXNoaW5nIiwiIiksdGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uQnJ1c2hDaGFuZ2VkKHRoaXMuY29sSW5kZXgoKSx1dS5zZWxlY3Rpb24pKX0pKS5vbigiYnJ1c2giLCgoKT0+e3lLdCh1dSkmJnRoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkJydXNoQ2hhbmdlZCh0aGlzLmNvbEluZGV4KCksdXUuc2VsZWN0aW9uKX0pKS5vbigiZW5kIiwoKCk9Pnt5S3QodXUpJiYodGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uQnJ1c2hDaGFuZ2VkKHRoaXMuY29sSW5kZXgoKSx1dS5zZWxlY3Rpb24pLHQucmVtb3ZlQXR0cmlidXRlKCJpcy1icnVzaGluZyIpKX0pKSxyPVN1KHQpLmFwcGVuZCgiZyIpLmNsYXNzZWQoImJydXNoIiwhMCk7ci5jYWxsKGkpLGkubW92ZShyLHRoaXMuYnJ1c2hTZWxlY3Rpb24oKSl9c2V0RGlzcGxheWVkKHQpe3RoaXMuX2lzRGlzcGxheWVkPXR9X2J1aWxkQnJ1c2hGaWx0ZXIodCxlLG4pe2lmKG51bGw9PT10KXJldHVybiBuZXcgcEt0O2lmKG51bGw9PT1lKXJldHVybiBjb25zb2xlLmVycm9yKCJTY2FsZSB0eXBlIGlzIG51bGwsIGJ1dCBicnVzaFNlbGVjdGlvbiBpc24ndDogIix0KSxuZXcgcEt0O3N3aXRjaChlKXtjYXNlIGhLdC5MSU5FQVI6Y2FzZSBoS3QuTE9HOntjb25zdFtlLGldPShmdW5jdGlvbiByKHQsZSxuKXtyZXR1cm5bdC5pbnZlcnQoZSksdC5pbnZlcnQobildLnNvcnQoKCh0LGUpPT50LWUpKX0pKG4sdFswXSx0WzFdKTtyZXR1cm4gbmV3IGZLdChlLGksITEsITEpfWNhc2UgaEt0LlFVQU5USUxFOntjb25zdFtlLGldPShmdW5jdGlvbiByKHQsZSxuKXtjb25zdCBpPXQucmFuZ2UoKSxyPWkuZmlsdGVyKCh0PT5lPD10JiZ0PD1uKSkubWFwKChlPT57Y29uc3Qgbj10LmludmVydEV4dGVudChlKTtyZXR1cm4gZT09PWlbaS5sZW5ndGgtMV0/W25bMF0sblsxXSsxXTpufSkpO3JldHVybiAwPT1yLmxlbmd0aD9bMCwwXTpMbChxbChyKSl9KShuLHRbMF0sdFsxXSk7cmV0dXJuIG5ldyBmS3QoZSxpLCExLCEwKX1jYXNlIGhLdC5OT05fTlVNRVJJQzpyZXR1cm4gbmV3IG1LdCgoZnVuY3Rpb24gZSh0LG4saSl7cmV0dXJuIHQuZG9tYWluKCkuZmlsdGVyKChlPT57Y29uc3Qgcj10KGUpO3JldHVybiBuPD1yJiZyPD1pfSkpfSkobix0WzBdLHRbMV0pKX1yZXR1cm4gY29uc29sZS5lcnJvcigiVW5rbm93biBzY2FsZSB0eXBlOiAiLGUpLG5ldyBwS3R9fWNsYXNzIF9LdHtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5fc3ZnUHJvcHM9dCx0aGlzLl9zY2hlbWE9ZSx0aGlzLl9heGVzPXRoaXMuX2NyZWF0ZUF4ZXMobiksdGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnM9QU0oKS5yYW5nZShbMSx0aGlzLl9zdmdQcm9wcy53aWR0aC0xXSkucGFkZGluZyguNSksdGhpcy5fZHJhZ2dlZEF4aXM9bnVsbCx0aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgiZy5heGlzLXBhcmVudCIpLnJlbW92ZSgpLHRoaXMuX3BhcmVudHNTZWw9dGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoIi5heGlzLXBhcmVudCIpfXVwZGF0ZUF4ZXModCxlKXtjb25zb2xlLmFzc2VydCghdGhpcy5pc0F4aXNEcmFnZ2luZygpKTtjb25zdCBuPW5ldyBTZXQ7dC5jb2x1bW5zLmZvckVhY2goKHQ9Pntjb25zdCBpPXQuYWJzb2x1dGVJbmRleDtsZXQgcj10aGlzLl9heGVzW2ldO3Iuc2V0RGlzcGxheWVkKCEwKTtjb25zdCBvPWUubWFwKCh0PT5QWXQodGhpcy5fc2NoZW1hLHQsaSkpKTtyLnNldERvbWFpbkFuZFNjYWxlKG8sdC5zY2FsZSksbi5hZGQoaSl9KSksdGhpcy5fYXhlcy5mb3JFYWNoKCh0PT57bi5oYXModC5jb2xJbmRleCgpKXx8dC5zZXREaXNwbGF5ZWQoITEpfSkpLHRoaXMuX3VwZGF0ZVN0YXRpb25hcnlBeGVzUG9zaXRpb25zKG4pLHRoaXMuX3BhcmVudHNTZWw9dGhpcy5fcGFyZW50c1NlbC5kYXRhKEFycmF5LmZyb20obiksKHQ9PnQpKSx0aGlzLl9wYXJlbnRzU2VsLmV4aXQoKS5yZW1vdmUoKSx0aGlzLl9wYXJlbnRzU2VsPXRoaXMuX3BhcmVudHNTZWwuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJheGlzLXBhcmVudCIsITApLm1lcmdlKHRoaXMuX3BhcmVudHNTZWwpO2NvbnN0IGk9dGhpczt0aGlzLl9wYXJlbnRzU2VsLmNhbGwoKHQ9PnRoaXMuX3VwZGF0ZUF4ZXNQb3NpdGlvbnNJbkRPTSh0KSkpLmVhY2goKGZ1bmN0aW9uKHQpe2kuX2F4ZXNbdF0udXBkYXRlRE9NKHRoaXMpfSkpfW1hcFZpc2libGVBeGVzKHQpe3JldHVybiB0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4oKS5tYXAoKGU9PnQodGhpcy5nZXRBeGlzUG9zaXRpb24oZSksdGhpcy5fYXhlc1tlXSkpKX1hbGxWaXNpYmxlQXhlc1NhdGlzZnkodCl7cmV0dXJuIHRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbigpLmV2ZXJ5KChlPT50KHRoaXMuZ2V0QXhpc1Bvc2l0aW9uKGUpLHRoaXMuX2F4ZXNbZV0pKSl9Z2V0QXhpc0ZvckNvbEluZGV4KHQpe3JldHVybiB0aGlzLl9heGVzW3RdfWRyYWdTdGFydCh0KXtjb25zb2xlLmFzc2VydCghdGhpcy5pc0F4aXNEcmFnZ2luZygpKSxjb25zb2xlLmFzc2VydCh0aGlzLl9heGVzW3RdLmlzRGlzcGxheWVkKCkpLHRoaXMuX2RyYWdnZWRBeGlzPXRoaXMuX2F4ZXNbdF0sdGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbj10aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucyh0KX1kcmFnKHQpe3Q9TWF0aC5taW4oTWF0aC5tYXgodCwwKSx0aGlzLl9zdmdQcm9wcy53aWR0aCksdGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbj10O2xldCBlPXRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbigpO2Uuc29ydCgoKHQsZSk9PnRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHQpLXRoaXMuZ2V0QXhpc1Bvc2l0aW9uKGUpKSksdGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKGUpLHRoaXMuX3VwZGF0ZUF4ZXNQb3NpdGlvbnNJbkRPTSh0aGlzLl9wYXJlbnRzU2VsKX1kcmFnRW5kKHQpe2NvbnNvbGUuYXNzZXJ0KHRoaXMuaXNBeGlzRHJhZ2dpbmcoKSksdGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbj1udWxsLHRoaXMuX2RyYWdnZWRBeGlzPW51bGwsdGhpcy5fdXBkYXRlQXhlc1Bvc2l0aW9uc0luRE9NKHRoaXMuX3BhcmVudHNTZWwudHJhbnNpdGlvbigpLmR1cmF0aW9uKHQpKX1pc0F4aXNEcmFnZ2luZygpe3JldHVybiBudWxsIT09dGhpcy5fZHJhZ2dlZEF4aXN9Z2V0QXhpc1Bvc2l0aW9uKHQpe3JldHVybiBudWxsIT09dGhpcy5fZHJhZ2dlZEF4aXMmJnRoaXMuX2RyYWdnZWRBeGlzLmNvbEluZGV4KCk9PT10P3RoaXMuX2RyYWdnZWRBeGlzUG9zaXRpb246dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnModCl9X3VwZGF0ZVN0YXRpb25hcnlBeGVzUG9zaXRpb25zKHQpe2NvbnN0IGU9dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKCkuZmlsdGVyKChlPT50LmhhcyhlKSkpLG49QXJyYXkuZnJvbShuZXcgU2V0KFsuLi5lLC4uLkFycmF5LmZyb20odCldKSk7dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKG4pfV91cGRhdGVBeGVzUG9zaXRpb25zSW5ET00odCl7dC5hdHRyKCJ0cmFuc2Zvcm0iLCh0PT5XWXQodGhpcy5nZXRBeGlzUG9zaXRpb24odCkpKSl9X2NyZWF0ZUF4ZXModCl7cmV0dXJuIHpsKFRZdCh0aGlzLl9zY2hlbWEpKS5tYXAoKGU9Pm5ldyBnS3QodGhpcy5fc3ZnUHJvcHMsdGhpcy5fc2NoZW1hLHQsZSkpKX19ZnVuY3Rpb24geUt0KHQpe3JldHVybiBudWxsIT09dC5zb3VyY2VFdmVudH0hKGZ1bmN0aW9uKHQpe3RbdC5GT1JFR1JPVU5EPTBdPSJGT1JFR1JPVU5EIix0W3QuQkFDS0dST1VORD0xXT0iQkFDS0dST1VORCJ9KShkS3R8fChkS3Q9e30pKTtjbGFzcyB2S3R7Y29uc3RydWN0b3IodCl7dm9pZCAwPT09dCYmKHQ9c2gobnVsbCkpLGNvbnNvbGUuYXNzZXJ0KHQuc2l6ZSgpPD0xKSx0aGlzLl9zZXNzaW9uR3JvdXBTZWw9dH1zZXNzaW9uR3JvdXAoKXtyZXR1cm4gMT09PXRoaXMuX3Nlc3Npb25Hcm91cFNlbC5zaXplKCk/dGhpcy5fc2Vzc2lvbkdyb3VwU2VsLmRhdHVtKCk6bnVsbH1pc051bGwoKXtyZXR1cm4gbnVsbD09PXRoaXMuc2Vzc2lvbkdyb3VwKCl9c2VsZWN0aW9uKCl7cmV0dXJuIHRoaXMuX3Nlc3Npb25Hcm91cFNlbH1lcXVhbHNUbyh0KXtyZXR1cm4gdGhpcy5pc051bGwoKT90LmlzTnVsbCgpOiF0LmlzTnVsbCgpJiZ0LnNlc3Npb25Hcm91cCgpLm5hbWU9PXRoaXMuc2Vzc2lvbkdyb3VwKCkubmFtZX19Y2xhc3MgYkt0e2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLl9zdmdQcm9wcz10LHRoaXMuX3NjaGVtYT1lLHRoaXMuX2F4ZXNDb2xsZWN0aW9uPW4sdGhpcy5fc2Vzc2lvbkdyb3Vwcz1bXSx0aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgiZy5iYWNrZ3JvdW5kIikucmVtb3ZlKCksdGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoImcuZm9yZWdyb3VuZCIpLnJlbW92ZSgpLHRoaXMuX2JnUGF0aHNTZWw9dGhpcy5fc3ZnUHJvcHMuc3ZnRy5hcHBlbmQoImciKS5jbGFzc2VkKCJiYWNrZ3JvdW5kIiwhMCkuc2VsZWN0QWxsKCJwYXRoIiksdGhpcy5fZmdQYXRoc1NlbD10aGlzLl9zdmdQcm9wcy5zdmdHLmFwcGVuZCgiZyIpLmNsYXNzZWQoImZvcmVncm91bmQiLCEwKS5zZWxlY3RBbGwoInBhdGgiKSx0aGlzLl91cGRhdGVWaXNpYmxlRmdQYXRoc1NlbCgpLHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cEhhbmRsZT1uZXcgdkt0LHRoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlPW5ldyB2S3QsdGhpcy5fZDNsaW5lPXVMKCkuY3VydmUoc0wpfWdldFNlc3Npb25Hcm91cEhhbmRsZSh0KXtyZXR1cm4gbnVsbD09dD9uZXcgdkt0Om5ldyB2S3QodGhpcy5fZmdQYXRoc1NlbC5maWx0ZXIoKGU9PmUubmFtZT09PXQubmFtZSkpKX1oaWRlQmFja2dyb3VuZExpbmVzKCl7dGhpcy5fYmdQYXRoc1NlbC5hdHRyKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9c2hvd0JhY2tncm91bmRMaW5lcygpe3RoaXMuX2JnUGF0aHNTZWwuYXR0cigidmlzaWJpbGl0eSIsbnVsbCl9cGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCl7cmV0dXJuIHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cEhhbmRsZX1zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpe3JldHVybiB0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZX1yZWNvbXB1dGVDb250cm9sUG9pbnRzKHQsZT0wKXsodD09PWRLdC5GT1JFR1JPVU5EP3RoaXMuX2ZnUGF0aHNTZWw6dGhpcy5fYmdQYXRoc1NlbCkudHJhbnNpdGlvbigpLmR1cmF0aW9uKGUpLmF0dHIoImQiLCh0PT50aGlzLl9wYXRoREF0dHJpYnV0ZSh0KSkpLHQ9PT1kS3QuRk9SRUdST1VORCYmd2luZG93LnNldFRpbWVvdXQoKCgpPT57Y29uc3QgdD10aGlzO3RoaXMuX2ZnUGF0aHNTZWwuZWFjaCgoZnVuY3Rpb24oZSl7dC5fc2V0Q29udHJvbFBvaW50c1Byb3BlcnR5KHRoaXMsZSl9KSl9KSl9cmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpe3RoaXMuX2ZnUGF0aHNTZWwuY2xhc3NlZCgiaW52aXNpYmxlLXBhdGgiLCh0PT4hdGhpcy5fYXhlc0NvbGxlY3Rpb24uYWxsVmlzaWJsZUF4ZXNTYXRpc2Z5KCgoZSxuKT0+bi5icnVzaEZpbHRlcigpLmlzUGFzc2luZyhQWXQodGhpcy5fc2NoZW1hLHQsbi5jb2xJbmRleCgpKSkpKSkpLHRoaXMuX3VwZGF0ZVZpc2libGVGZ1BhdGhzU2VsKCl9c2V0Rm9yZWdyb3VuZExpbmVzQ29sb3IodCxlLG4pe2NvbnN0IGk9dGhpcy5fY3JlYXRlTGluZUNvbG9yRnVuY3Rpb24odCxlLG4pO3RoaXMuX2ZnUGF0aHNTZWwuYXR0cigic3Ryb2tlIixpKX1yZWRyYXcodCxlLG4saSl7Y29uc3Qgcj10aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2Vzc2lvbkdyb3VwKCksbz10aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZS5zZXNzaW9uR3JvdXAoKTt0aGlzLl9zZXNzaW9uR3JvdXBzPXQsdGhpcy5fZmdQYXRoc1NlbD10aGlzLl9yZWNvbXB1dGVQYXRoU2VsZWN0aW9uKHRoaXMuX2ZnUGF0aHNTZWwpLHRoaXMuX2JnUGF0aHNTZWw9dGhpcy5fcmVjb21wdXRlUGF0aFNlbGVjdGlvbih0aGlzLl9iZ1BhdGhzU2VsKSx0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGU9dGhpcy5nZXRTZXNzaW9uR3JvdXBIYW5kbGUociksdGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGU9dGhpcy5nZXRTZXNzaW9uR3JvdXBIYW5kbGUobyksdGhpcy5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGRLdC5GT1JFR1JPVU5EKSx0aGlzLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoZEt0LkJBQ0tHUk9VTkQpLHRoaXMucmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpLHRoaXMuc2V0Rm9yZWdyb3VuZExpbmVzQ29sb3IoZSxuLGkpfXVwZGF0ZVBlYWtlZFNlc3Npb25Hcm91cCh0KXt0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgicGVha2VkLXBhdGgiLCExKSx0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGU9dCx0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgicGVha2VkLXBhdGgiLCEwKX1jbGVhclBlYWtlZFNlc3Npb25Hcm91cCgpe3RoaXMudXBkYXRlUGVha2VkU2Vzc2lvbkdyb3VwKG5ldyB2S3QpfXVwZGF0ZVNlbGVjdGVkU2Vzc2lvbkdyb3VwKHQpe3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInNlbGVjdGVkLXBhdGgiLCExKSx0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZT10LHRoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInNlbGVjdGVkLXBhdGgiLCEwKX1maW5kQ2xvc2VzdFNlc3Npb25Hcm91cCh0LGUpe2NvbnN0IG49dGhpcy5fYXhlc0NvbGxlY3Rpb24ubWFwVmlzaWJsZUF4ZXMoKCh0LGUpPT50KSksaT0oZnVuY3Rpb24gcih0LGUsbixpKXtpZihlLmxlbmd0aDwyKXJldHVybiBjb25zb2xlLmVycm9yKCJMZXNzIHRoYW4gdHdvIGF4ZXMgaW4gcGFyYWxsZWwgY29vcmRpbmF0ZXMgcGxvdC4iKSxudWxsO2NvbnN0IHI9blswXSxvPW5bMV07aWYocjw9ZVswXXx8cj49ZVtlLmxlbmd0aC0xXSlyZXR1cm4gbnVsbDtjb25zdCBhPVNlLmV4cG9ydHMuc29ydGVkSW5kZXgoZSxyKTtjb25zb2xlLmFzc2VydChhPjApLGNvbnNvbGUuYXNzZXJ0KGE8ZS5sZW5ndGgpO2NvbnN0IHM9YS0xO2xldCBsPW51bGwsYz1udWxsO3JldHVybiB0LmZvckVhY2goKHQ9Pntjb25zdCBlPShmdW5jdGlvbiBuKHQsZSxpLGEpe2NvbnN0IHM9dC1pLGw9ZS1hLGM9ci1pLHU9by1hLGg9KHMqYytsKnUpLyhzKnMrbCpsKTtyZXR1cm4gaDw9MD9VWXQoYyx1KTpoPj0xP1VZdCh0LXIsZS1vKTpVWXQoYy1oKnMsdS1oKmwpfSkodC5jb250cm9sUG9pbnRzW3NdWzBdLHQuY29udHJvbFBvaW50c1tzXVsxXSx0LmNvbnRyb2xQb2ludHNbYV1bMF0sdC5jb250cm9sUG9pbnRzW2FdWzFdKTtlPml8fChudWxsPT09bHx8ZTxsKSYmKGw9ZSxjPXQpfSkpLGN9KSh0aGlzLl92aXNpYmxlRmdQYXRoc1NlbC5ub2RlcygpLG4sW3QsZV0sMTAwKTtyZXR1cm4gbnVsbD09PWk/bmV3IHZLdDpuZXcgdkt0KFN1KGkpKX1fY3JlYXRlTGluZUNvbG9yRnVuY3Rpb24odCxlLG4pe2lmKG51bGw9PT10KXJldHVybigpPT4icmVkIjtjb25zdCBpPVZNKCkuZG9tYWluKE5ZdCh0aGlzLl9zY2hlbWEsdGhpcy5fc2Vzc2lvbkdyb3Vwcyx0KSkucmFuZ2UoW2Usbl0pLmludGVycG9sYXRlKGNwKTtyZXR1cm4gZT0+aShQWXQodGhpcy5fc2NoZW1hLGUsdCkpfV9yZWNvbXB1dGVQYXRoU2VsZWN0aW9uKHQpe3JldHVybih0PXQuZGF0YSh0aGlzLl9zZXNzaW9uR3JvdXBzLCh0PT50Lm5hbWUpKSkuZXhpdCgpLnJlbW92ZSgpLHQuZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5tZXJnZSh0KX1fc2V0Q29udHJvbFBvaW50c1Byb3BlcnR5KHQsZSl7dC5jb250cm9sUG9pbnRzPXRoaXMuX2NvbXB1dGVDb250cm9sUG9pbnRzKGUpfV9jb21wdXRlQ29udHJvbFBvaW50cyh0KXtyZXR1cm4gdGhpcy5fYXhlc0NvbGxlY3Rpb24ubWFwVmlzaWJsZUF4ZXMoKChlLG4pPT5bZSxuLnlTY2FsZSgpKFBZdCh0aGlzLl9zY2hlbWEsdCxuLmNvbEluZGV4KCkpKV0pKX1fcGF0aERBdHRyaWJ1dGUodCl7cmV0dXJuIHRoaXMuX2QzbGluZSh0aGlzLl9jb21wdXRlQ29udHJvbFBvaW50cyh0KSl9X3VwZGF0ZVZpc2libGVGZ1BhdGhzU2VsKCl7dGhpcy5fdmlzaWJsZUZnUGF0aHNTZWw9dGhpcy5fZmdQYXRoc1NlbC5maWx0ZXIoIjpub3QoLmludmlzaWJsZS1wYXRoKSIpfX1jbGFzcyB4S3R7Y29uc3RydWN0b3IodCxlKXt0aGlzLnN2Zz1TdSh0KTtjb25zdCBuPTEwMCplKzEwKzEwO3RoaXMuc3ZnLmF0dHIoInZpZXdCb3giLGAwIDAgJHtufSAyNDBgKSx0aGlzLnN2Zy5hdHRyKCJwcmVzZXJ2ZUFzcGVjdFJhdGlvIiwieE1pZFlNaWQiKSx0aGlzLnN2Zy5zdHlsZSgibWluLXdpZHRoIixuKyJweCIpLHRoaXMuc3ZnLnN0eWxlKCJtaW4taGVpZ2h0IiwiMjQwcHgiKSx0aGlzLndpZHRoPW4tMTAtMTAsdGhpcy5oZWlnaHQ9MjAwLHRoaXMuc3ZnRz10aGlzLnN2Zy5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLFdZdCgxMCwzMCkpfX1jbGFzcyB3S3R7Y29uc3RydWN0b3IodCxlLG4saSl7dGhpcy5fc3ZnUHJvcHM9dCx0aGlzLl9zY2hlbWE9ZSx0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ0I9bix0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWRDQj1pLHRoaXMuX2F4ZXNDb2xsZWN0aW9uPW5ldyBfS3QodCxlLHRoaXMpLHRoaXMuX2xpbmVzQ29sbGVjdGlvbj1uZXcgYkt0KHQsZSx0aGlzLl9heGVzQ29sbGVjdGlvbiksdGhpcy5fc3ZnUHJvcHMuc3ZnLm9uKCJjbGljayIsKCgpPT50aGlzLm9uQ2xpY2soKSkpLm9uKCJtb3VzZW1vdmUgbW91c2VlbnRlciIsKCgpPT57Y29uc3RbdCxlXT1haCh0aGlzLl9zdmdQcm9wcy5zdmdHLm5vZGUoKSk7dGhpcy5vbk1vdXNlTW92ZWQodCxlKX0pKS5vbigibW91c2VsZWF2ZSIsKCgpPT50aGlzLm9uTW91c2VMZWF2ZSgpKSl9b25EcmFnU3RhcnQodCl7dGhpcy5fYXhlc0NvbGxlY3Rpb24uZHJhZ1N0YXJ0KHQpLHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5oaWRlQmFja2dyb3VuZExpbmVzKCl9b25EcmFnKHQpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmRyYWcodCksdGhpcy5fbGluZXNDb2xsZWN0aW9uLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoZEt0LkZPUkVHUk9VTkQpfW9uRHJhZ0VuZCgpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmRyYWdFbmQoNTAwKSx0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVjb21wdXRlQ29udHJvbFBvaW50cyhkS3QuRk9SRUdST1VORCw1MDApLHdpbmRvdy5zZXRUaW1lb3V0KCgoKT0+e3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGRLdC5CQUNLR1JPVU5EKSx0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2hvd0JhY2tncm91bmRMaW5lcygpfSksNTAwKX1vbkJydXNoQ2hhbmdlZCh0LGUpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmdldEF4aXNGb3JDb2xJbmRleCh0KS5zZXRCcnVzaFNlbGVjdGlvbihlKSx0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpfW9uTW91c2VNb3ZlZCh0LGUpe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi51cGRhdGVQZWFrZWRTZXNzaW9uR3JvdXAodGhpcy5fbGluZXNDb2xsZWN0aW9uLmZpbmRDbG9zZXN0U2Vzc2lvbkdyb3VwKHQsZSkpLHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCkpfW9uTW91c2VMZWF2ZSgpe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5pc051bGwoKXx8KHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5jbGVhclBlYWtlZFNlc3Npb25Hcm91cCgpLHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQihudWxsKSl9b25DbGljaygpe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKT09PXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpLnNlc3Npb25Hcm91cCgpP3RoaXMuX2xpbmVzQ29sbGVjdGlvbi51cGRhdGVTZWxlY3RlZFNlc3Npb25Hcm91cChuZXcgdkt0KTp0aGlzLl9saW5lc0NvbGxlY3Rpb24udXBkYXRlU2VsZWN0ZWRTZXNzaW9uR3JvdXAodGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpKSx0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSl9b25PcHRpb25zT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZCh0LGUpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLnVwZGF0ZUF4ZXModCxlKTtjb25zdCBuPXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSxpPXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWRyYXcoZSx2b2lkIDAhPT10LmNvbG9yQnlDb2x1bW5JbmRleD90LmNvbHVtbnNbdC5jb2xvckJ5Q29sdW1uSW5kZXhdLmFic29sdXRlSW5kZXg6bnVsbCx0Lm1pbkNvbG9yLHQubWF4Q29sb3IpLG4uZXF1YWxzVG8odGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpKXx8dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSksaS5lcXVhbHNUbyh0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSl8fHRoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpLnNlc3Npb25Hcm91cCgpKX1zY2hlbWEoKXtyZXR1cm4gdGhpcy5fc2NoZW1hfX1sZXQgU0t0PWNsYXNzIGV4dGVuZHMoZXIoaWwoeWUpKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXA9bnVsbCx0aGlzLmNsb3Nlc3RTZXNzaW9uR3JvdXA9bnVsbCx0aGlzLnJlZHJhd0NvdW50PTB9X29wdGlvbnNPclNlc3Npb25Hcm91cHNDaGFuZ2VkKCl7dmFyIHQ7aWYoIXRoaXMub3B0aW9ucylyZXR1cm47Y29uc3R7Y29uZmlndXJhdGlvbjplfT1udWxsIT09KHQ9dGhpcy5fcHJldk9wdGlvbnMpJiZ2b2lkIDAhPT10P3Q6e30se2NvbmZpZ3VyYXRpb246bn09dGhpcy5vcHRpb25zO2lmKHZvaWQgMD09PXRoaXMuX2ludGVyYWN0aW9uTWFuYWdlcnx8IVNlLmV4cG9ydHMuaXNFcXVhbChlLnNjaGVtYSxuLnNjaGVtYSl8fCFTZS5leHBvcnRzLmlzRXF1YWwoZS5jb2x1bW5zVmlzaWJpbGl0eSxuLmNvbHVtbnNWaXNpYmlsaXR5KSl7U3UodGhpcy4kLnN2Zykuc2VsZWN0QWxsKCIqIikucmVtb3ZlKCk7Y29uc3QgdD1uZXcgeEt0KHRoaXMuJC5zdmcsbi5jb2x1bW5zVmlzaWJpbGl0eS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoKTt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuc3ZnLCEwKSx0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXI9bmV3IHdLdCh0LG4uc2NoZW1hLCh0PT50aGlzLmNsb3Nlc3RTZXNzaW9uR3JvdXBDaGFuZ2VkKHQpKSwodD0+dGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWQodCkpKX10aGlzLl9jb21wdXRlVmFsaWRTZXNzaW9uR3JvdXBzKCksdGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uT3B0aW9uc09yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQodGhpcy5vcHRpb25zLHRoaXMuX3ZhbGlkU2Vzc2lvbkdyb3VwcyksdGhpcy5yZWRyYXdDb3VudCsrLHRoaXMuX3ByZXZPcHRpb25zPXRoaXMub3B0aW9uc31jbG9zZXN0U2Vzc2lvbkdyb3VwQ2hhbmdlZCh0KXt0aGlzLmNsb3Nlc3RTZXNzaW9uR3JvdXA9dH1zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWQodCl7dGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cD10fV9jb21wdXRlVmFsaWRTZXNzaW9uR3JvdXBzKCl7Y29uc3QgdD1YWXQ7aWYodm9pZCAwPT09dGhpcy5zZXNzaW9uR3JvdXBzKXJldHVybiB2b2lkKHRoaXMuX3ZhbGlkU2Vzc2lvbkdyb3Vwcz12b2lkIDApO2NvbnN0IGU9dGhpcy5vcHRpb25zLmNvbmZpZ3VyYXRpb24uc2NoZW1hO3RoaXMuX3ZhbGlkU2Vzc2lvbkdyb3Vwcz10aGlzLnNlc3Npb25Hcm91cHMuZmlsdGVyKChuPT57Zm9yKGxldCBpPTA7aTx0Lm51bUNvbHVtbnMoZSk7KytpKWlmKHRoaXMub3B0aW9ucy5jb25maWd1cmF0aW9uLmNvbHVtbnNWaXNpYmlsaXR5W2ldJiZ2b2lkIDA9PT10LmNvbHVtblZhbHVlQnlJbmRleChlLG4saSkpcmV0dXJuITE7cmV0dXJuITB9KSl9fTtTS3QudGVtcGxhdGU9X2VgCiAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICA8c3ZnIGlkPSJzdmciPjwvc3ZnPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAtLXRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QtYXhpcy1zaGFkb3c6IDAgMXB4IDAgI2ZmZiwKICAgICAgICAgIDFweCAwIDAgI2ZmZiwgMCAtMXB4IDAgI2ZmZiwgLTFweCAwIDAgI2ZmZjsKICAgICAgfQogICAgICA6aG9zdCguZGFyay1tb2RlKSB7CiAgICAgICAgLS10Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90LWF4aXMtc2hhZG93OiAwIDFweCAwICMwMDAsCiAgICAgICAgICAxcHggMCAwICMwMDAsIDAgLTFweCAwICMwMDAsIC0xcHggMCAwICMwMDA7CiAgICAgIH0KICAgICAgc3ZnIHsKICAgICAgICBmb250OiAxMHB4IHNhbnMtc2VyaWY7CiAgICAgIH0KCiAgICAgIC5iYWNrZ3JvdW5kIHBhdGggewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjZGRkOwogICAgICAgIHNoYXBlLXJlbmRlcmluZzogY3Jpc3BFZGdlczsKICAgICAgfQoKICAgICAgLmZvcmVncm91bmQgcGF0aCB7CiAgICAgICAgZmlsbDogbm9uZTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMC43OwogICAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgfQoKICAgICAgLyogV2lsbCBiZSBzZXQgb24gZm9yZWdyb3VuZCBwYXRocyB0aGF0IGFyZSBub3QgImNvbnRhaW5lZCIgaW4gdGhlIGN1cnJlbnQKICAgICAgICAgYXhlcyBicnVzaGVzLiBJZiBubyBicnVzaGVzIGFyZSBzZXQsIG5vIHBhdGggd2lsbCBoYXZlIHRoaXMgY2xhc3MuICovCiAgICAgIC5mb3JlZ3JvdW5kIC5pbnZpc2libGUtcGF0aCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLyogU3R5bGUgZm9yIHRoZSBwYXRoIGNsb3Nlc3QgdG8gdGhlIG1vdXNlIHBvaW50ZXIgKHR5cGljYWxseSB3aWxsIGJlY29tZQogICAgICB0aGUgc2VsZWN0ZWQgcGF0aCB3aGVuIHRoZSB1c2VyIGNsaWNrcykuICovCiAgICAgIC5mb3JlZ3JvdW5kIC5wZWFrZWQtcGF0aCB7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAzOwogICAgICB9CgogICAgICAvKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHBhdGggY2xhc3MuIFdlIHVzZSAhaW1wb3J0YW50IHRvIG92ZXJyaWRlIHRoZQogICAgICAgICBpbmxpbmUgc3R5bGUgdGhhdCBzZXRzIHRoZSByZWd1bGFyIGNvbG9yIG9mIGEgcGF0aC4gKi8KICAgICAgLmZvcmVncm91bmQgLnNlbGVjdGVkLXBhdGggewogICAgICAgIHN0cm9rZS13aWR0aDogMyAhaW1wb3J0YW50OwogICAgICAgIHN0cm9rZTogIzBmMCAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAjY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAuYXhpcyB0ZXh0IHsKICAgICAgICB0ZXh0LXNoYWRvdzogdmFyKC0tdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtcGxvdC1heGlzLXNoYWRvdyk7CiAgICAgICAgZmlsbDogY3VycmVudENvbG9yOwogICAgICAgIGN1cnNvcjogbW92ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxTS3QucHJvdG90eXBlLCJzZXNzaW9uR3JvdXBzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFNLdC5wcm90b3R5cGUsIm9wdGlvbnMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFNLdC5wcm90b3R5cGUsInNlbGVjdGVkU2Vzc2lvbkdyb3VwIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxTS3QucHJvdG90eXBlLCJjbG9zZXN0U2Vzc2lvbkdyb3VwIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLFNLdC5wcm90b3R5cGUsInJlZHJhd0NvdW50Iix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxTS3QucHJvdG90eXBlLCJfdmFsaWRTZXNzaW9uR3JvdXBzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFNLdC5wcm90b3R5cGUsIl9pbnRlcmFjdGlvbk1hbmFnZXIiLHZvaWQgMCksdChbYSgib3B0aW9ucy4qIiwic2Vzc2lvbkdyb3Vwcy4qIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxTS3QucHJvdG90eXBlLCJfb3B0aW9uc09yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQiLG51bGwpLFNLdD10KFtpKCJ0Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90IildLFNLdCk7bGV0IE1LdD1jbGFzcyBleHRlbmRzIHlle19jbG9zZXN0T3JTZWxlY3RlZCh0LGUpe3JldHVybiBudWxsIT09dD90OmV9fTtNS3QudGVtcGxhdGU9X2VgCiAgICA8IS0tIENvbnRyb2xzIGJlaGF2aW9yIG9mIHBhcmFsbGVsIGNvb3JkaW5hdGVzIHBsb3QKICAgICAgICAgb3V0cHV0cyBzZXQgb3B0aW9ucyB0byB0aGUgX29wdGlvbnMgcHJvcGVydHkuCiAgICAgIC0tPgogICAgPGhwYXJhbXMtc3BsaXQtbGF5b3V0IG9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CiAgICAgIDwhLS0gVGhlIHNjYWxlIGFuZCBjb2xvciBjb250cm9scy4gLS0+CiAgICAgIDx0Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scwogICAgICAgIGlkPSJjb250cm9scyIKICAgICAgICBzbG90PSJjb250ZW50IgogICAgICAgIGNsYXNzPSJzZWN0aW9uIgogICAgICAgIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIgogICAgICAgIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIKICAgICAgICBvcHRpb25zPSJ7e19vcHRpb25zfX0iCiAgICAgID4KICAgICAgPC90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scz4KICAgICAgPCEtLSBUaGUgYWN0dWFsIHBhcmFsbGVsIGNvb3JkaW5hdGVzIHBsb3QgLS0+CiAgICAgIDx0Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90CiAgICAgICAgaWQ9InBsb3QiCiAgICAgICAgc2xvdD0iY29udGVudCIKICAgICAgICBjbGFzcz0ic2VjdGlvbiIKICAgICAgICBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iCiAgICAgICAgc2VsZWN0ZWQtc2Vzc2lvbi1ncm91cD0ie3tfc2VsZWN0ZWRHcm91cH19IgogICAgICAgIGNsb3Nlc3Qtc2Vzc2lvbi1ncm91cD0ie3tfY2xvc2VzdEdyb3VwfX0iCiAgICAgICAgb3B0aW9ucz0iW1tfb3B0aW9uc11dIgogICAgICA+CiAgICAgIDwvdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtcGxvdD4KICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMKICAgICAgICBpZD0idmFsdWVzIgogICAgICAgIHNsb3Q9ImNvbnRlbnQiCiAgICAgICAgY2xhc3M9InNlY3Rpb24iCiAgICAgICAgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iCiAgICAgICAgc2Vzc2lvbi1ncm91cD0iW1tfY2xvc2VzdE9yU2VsZWN0ZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Nsb3Nlc3RHcm91cCwgX3NlbGVjdGVkR3JvdXApXV0iCiAgICAgID4KICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtdmFsdWVzPgogICAgICA8dGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHMKICAgICAgICBpZD0iZGV0YWlscyIKICAgICAgICBzbG90PSJjb250ZW50IgogICAgICAgIGNsYXNzPSJzZWN0aW9uIgogICAgICAgIGJhY2tlbmQ9IltbYmFja2VuZF1dIgogICAgICAgIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIgogICAgICAgIHNlc3Npb24tZ3JvdXA9IltbX3NlbGVjdGVkR3JvdXBdXSIKICAgICAgICB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSIKICAgICAgPgogICAgICA8L3RmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzPgogICAgPC9ocGFyYW1zLXNwbGl0LWxheW91dD4KCiAgICA8c3R5bGU+CiAgICAgIC5zZWN0aW9uIHsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICB9CiAgICAgICN2YWx1ZXMgewogICAgICAgIGhlaWdodDogMTE1cHg7CiAgICAgIH0KICAgICAgI2RldGFpbHMgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLE1LdC5wcm90b3R5cGUsImJhY2tlbmQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sTUt0LnByb3RvdHlwZSwiZXhwZXJpbWVudE5hbWUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTUt0LnByb3RvdHlwZSwiY29uZmlndXJhdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sTUt0LnByb3RvdHlwZSwic2Vzc2lvbkdyb3VwcyIsdm9pZCAwKSxNS3Q9dChbaSgidGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldyIpXSxNS3QpO2xldCBFS3Q9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwPW51bGwsdGhpcy5jbG9zZXN0U2Vzc2lvbkdyb3VwPW51bGwsdGhpcy5fY29udGFpbmVyPW51bGwsdGhpcy5fc3ZnPW51bGwsdGhpcy53aWR0aD0wLHRoaXMuaGVpZ2h0PTAsdGhpcy5fYnJ1c2hlZENlbGxJbmRleD1udWxsLHRoaXMuX2JydXNoU2VsZWN0aW9uPW51bGx9cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMuX2NvbnRhaW5lcj10aGlzLiQuY29udGFpbmVyLHRoaXMuX3N2Zz1TdSh0aGlzLiQuc3ZnKSx0aGlzLl9yZWRyYXcoKX1fc2Vzc2lvbkdyb3Vwc0NoYW5nZWQoKXtudWxsIT09dGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cCYmKHRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXA9RFl0KHRoaXMuc2Vzc2lvbkdyb3Vwcyx0aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwLm5hbWUpfHxudWxsKSx0aGlzLl9yZWRyYXcoKX1fdmlzaWJsZVNjaGVtYUNoYW5nZWQoKXt0aGlzLl9icnVzaGVkQ2VsbEluZGV4PW51bGwsdGhpcy5fYnJ1c2hTZWxlY3Rpb249bnVsbCx0aGlzLl9yZWRyYXcoKX1fcmVkcmF3KCl7dGhpcy5kZWJvdW5jZSgiX3JlZHJhdyIsKCgpPT57Y29uc3QgdD1YWXQ7dGhpcy53aWR0aD1NYXRoLm1heCgxNTAqdC5udW1WaXNpYmxlQ29sdW1ucyh0aGlzLnZpc2libGVTY2hlbWEpLDEyMDApLHRoaXMuaGVpZ2h0PU1hdGgubWF4KDExMi41KnQubnVtVmlzaWJsZU1ldHJpY3ModGhpcy52aXNpYmxlU2NoZW1hKSw0ODApLHRoaXMuX2NvbnRhaW5lci5zdHlsZS53aWR0aD10aGlzLndpZHRoKyJweCIsdGhpcy5fY29udGFpbmVyLnN0eWxlLmhlaWdodD10aGlzLmhlaWdodCsicHgiLHRoaXMuX3N2Zy5hdHRyKCJ3aWR0aCIsdGhpcy53aWR0aCkuYXR0cigiaGVpZ2h0Iix0aGlzLmhlaWdodCksdGhpcy5fc3ZnLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpLHRoaXMuX2RyYXcoKX0pLDEwMCl9X2RyYXcoKXtjb25zdCB0PVhZdCxlPXRoaXM7aWYoIXRoaXMuc2Vzc2lvbkdyb3Vwc3x8MD09dGhpcy5zZXNzaW9uR3JvdXBzLmxlbmd0aHx8IXRoaXMudmlzaWJsZVNjaGVtYXx8MD09dGhpcy52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zLmxlbmd0aClyZXR1cm47Y29uc3Qgbj16bCh0Lm51bVZpc2libGVDb2x1bW5zKGUudmlzaWJsZVNjaGVtYSkpLGk9emwodC5udW1WaXNpYmxlTWV0cmljcyhlLnZpc2libGVTY2hlbWEpKSxyPVRNKCkuZG9tYWluKG4pLnJhbmdlKFs4NSx0aGlzLndpZHRoLTEtNV0pLnBhZGRpbmdJbm5lciguMSksbz1UTSgpLmRvbWFpbihpKS5yYW5nZShbdGhpcy5oZWlnaHQtMS01LTUwLDVdKS5wYWRkaW5nSW5uZXIoLjEpLGE9ci5iYW5kd2lkdGgoKSxzPW8uYmFuZHdpZHRoKCksbD1uLm1hcCgodD0+ZS5fY2VsbFNjYWxlKHQsWzAsYS0xXSkpKSxjPWkubWFwKChuPT5lLl9jZWxsU2NhbGUobit0Lm51bVZpc2libGVIUGFyYW1zKGUudmlzaWJsZVNjaGVtYSksW3MtMSwwXSkpKSx1PXRoaXMuX3N2Zy5zZWxlY3RBbGwoIi54LWF4aXMiKS5kYXRhKG4pLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgieC1heGlzIiwhMCkuYXR0cigidHJhbnNmb3JtIiwoZT0+dC50cmFuc2xhdGVTdHIocihlKSwwKSkpO2Z1bmN0aW9uIGgodCl7cmV0dXJuIngtYXhpcy1jbGlwLXBhdGgtIit0fWZ1bmN0aW9uIGQodCl7cmV0dXJuIngtbGFiZWwtY2xpcC1wYXRoLSIrdH11LmFwcGVuZCgiY2xpcFBhdGgiKS5hdHRyKCJpZCIsaCkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLTUpLmF0dHIoInkiLDApLmF0dHIoIndpZHRoIixhKzEwKS5hdHRyKCJoZWlnaHQiLGUuaGVpZ2h0LTI1KSx1LmFwcGVuZCgiY2xpcFBhdGgiKS5hdHRyKCJpZCIsZCkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsMCkuYXR0cigieSIsZS5oZWlnaHQtMjUpLmF0dHIoIndpZHRoIixhKS5hdHRyKCJoZWlnaHQiLDI1KSx1LmFwcGVuZCgiZyIpLmF0dHIoImNsaXAtcGF0aCIsKHQ9PiJ1cmwoIyIraCh0KSsiKSIpKS5lYWNoKChmdW5jdGlvbih0KXtTdSh0aGlzKS5jYWxsKGcsb2MobFt0XSkudGlja1NpemUoZS5oZWlnaHQtNTApLGEsNDAsZS5vcHRpb25zLmNvbHVtbnNbdF0uc2NhbGUpfSkpLHUuYXBwZW5kKCJnIikuY2xhc3NlZCgieC1heGlzLWxhYmVsIiwhMCkuYXR0cigiY2xpcC1wYXRoIiwodD0+InVybCgjIitkKHQpKyIpIikpLmFwcGVuZCgidGV4dCIpLmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigieCIsYS8yKS5hdHRyKCJ5IixlLmhlaWdodC0xLTEyLjUpLnRleHQoKG49PnQuc2NoZW1hVmlzaWJsZUNvbHVtbk5hbWUoZS52aXNpYmxlU2NoZW1hLG4pKSkuYXBwZW5kKCJ0aXRsZSIpLnRleHQoKG49PnQuc2NoZW1hVmlzaWJsZUNvbHVtbk5hbWUoZS52aXNpYmxlU2NoZW1hLG4pKSk7Y29uc3QgcD10aGlzLl9zdmcuc2VsZWN0QWxsKCIueS1heGlzIikuZGF0YShpKS5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoInktYXhpcyIsITApLmF0dHIoInRyYW5zZm9ybSIsKG49PnQudHJhbnNsYXRlU3RyKGUud2lkdGgtMSxvKG4pKSkpO2Z1bmN0aW9uIGYodCl7cmV0dXJuInktYXhpcy1jbGlwLXBhdGgtIit0fWZ1bmN0aW9uIG0odCl7cmV0dXJuInktbGFiZWwtY2xpcC1wYXRoLSIrdH1mdW5jdGlvbiBnKHQsZSxuLGkscil7Y29uc3Qgbz1NYXRoLmZsb29yKG4vaSksYT1lLnNjYWxlKCk7aWYoIlFVQU5USUxFIj09PXIpe2xldCB0PWEucXVhbnRpbGVzKCk7Y29uc3Qgbj1NYXRoLmNlaWwodC5sZW5ndGgvbyk7dD16bCgwLHQubGVuZ3RoLG4pLm1hcCgoZT0+dFtlXSkpLGUudGlja1ZhbHVlcyh0KS50aWNrRm9ybWF0KG15KCItLjJnIikpfSJMSU5FQVIiIT09ciYmIkxPRyIhPT1yfHxlLnRpY2tzKG8pLHQuY2FsbChlKSx0LnNlbGVjdEFsbCgiLmRvbWFpbiIpLnJlbW92ZSgpLHQuc2VsZWN0QWxsKCIudGljayBsaW5lIikuYXR0cigic3Ryb2tlIiwiI2RkZCIpfXAuYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImlkIixmKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtKGUud2lkdGgtNDAtMSkpLmF0dHIoInkiLC01KS5hdHRyKCJ3aWR0aCIsZS53aWR0aC00MCkuYXR0cigiaGVpZ2h0IixzKzEwKSxwLmFwcGVuZCgiY2xpcFBhdGgiKS5hdHRyKCJpZCIsbSkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLShlLndpZHRoLTEpKS5hdHRyKCJ5IiwwKS5hdHRyKCJ3aWR0aCIsNDApLmF0dHIoImhlaWdodCIscykscC5hcHBlbmQoImciKS5hdHRyKCJjbGlwLXBhdGgiLCh0PT4idXJsKCMiK2YodCkrIikiKSkuZWFjaCgoZnVuY3Rpb24obil7U3UodGhpcykuY2FsbChnLGFjKGNbbl0pLnRpY2tTaXplKGUud2lkdGgtODApLHMsMjAsZS5vcHRpb25zLmNvbHVtbnNbbit0Lm51bVZpc2libGVIUGFyYW1zKGUudmlzaWJsZVNjaGVtYSldLnNjYWxlKX0pKSxwLmFwcGVuZCgiZyIpLmNsYXNzZWQoInktYXhpcy1sYWJlbCIsITApLmF0dHIoImNsaXAtcGF0aCIsKHQ9PiJ1cmwoIyIrbSh0KSsiKSIpKS5hcHBlbmQoInRleHQiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLmF0dHIoIngiLC0oZS53aWR0aC0yMC0xKSkuYXR0cigieSIscy8yKS5hdHRyKCJ0cmFuc2Zvcm0iLHQucm90YXRlU3RyKDkwLC0oZS53aWR0aC0yMC0xKSxzLzIpKS50ZXh0KChuPT50Lm1ldHJpY05hbWUoZS52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zW25dKSkpLmFwcGVuZCgidGl0bGUiKS50ZXh0KChuPT50Lm1ldHJpY05hbWUoZS52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zW25dKSkpO2NvbnN0IF89dGhpcy5fc3ZnLnNlbGVjdEFsbCgiLmNlbGwiKS5kYXRhKFRsKG4saSkpLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgiY2VsbCIsITApLmF0dHIoInRyYW5zZm9ybSIsKChbZSxuXSk9PnQudHJhbnNsYXRlU3RyKHIoZSksbyhuKSkpKTtfLmFwcGVuZCgiZyIpLmNsYXNzZWQoImZyYW1lIiwhMCkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLTUpLmF0dHIoInkiLC01KS5hdHRyKCJ3aWR0aCIsYSsxMCkuYXR0cigiaGVpZ2h0IixzKzEwKS5hdHRyKCJzdHJva2UiLCIjMDAwIikuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIik7bGV0IHk9bnVsbDt2b2lkIDAhPT1lLm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4JiYoeT1WTSgpLmRvbWFpbih0aGlzLl9jb2xFeHRlbnQodGhpcy5vcHRpb25zLmNvbG9yQnlDb2x1bW5JbmRleCkpLnJhbmdlKFt0aGlzLm9wdGlvbnMubWluQ29sb3IsdGhpcy5vcHRpb25zLm1heENvbG9yXSkuaW50ZXJwb2xhdGUoY3ApKTtjb25zdCB2PXZvaWQgMD09PWUub3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXg/KCk9PiJyZWQiOih7c2Vzc2lvbkdyb3VwOnR9KT0+eSh0aGlzLl9jb2xWYWx1ZSh0LGUub3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgpKTtmdW5jdGlvbiBiKHQsbil7cmV0dXJuIGxbbl0oZS5fY29sVmFsdWUodCxuKSl9ZnVuY3Rpb24geCh0LG4pe3JldHVybiBjW25dKGUuX21ldHJpY1ZhbHVlKHQsbikpfWNvbnN0W3csUyxNXT0oZnVuY3Rpb24gRSh0LHIpe2NvbnN0IG89dC5zZWxlY3RBbGwoIi5kYXRhLW1hcmtlciIpLmRhdGEoKChbdCxuXSk9PmUuc2Vzc2lvbkdyb3Vwcy5maWx0ZXIoKGk9PnZvaWQgMCE9PWUuX2NvbFZhbHVlKGksdCkmJnZvaWQgMCE9PWUuX21ldHJpY1ZhbHVlKGksbikpKS5tYXAoKGU9Pih7Y29sOnQsbWV0cmljOm4sc2Vzc2lvbkdyb3VwOmUseDpiKGUsdCkseTp4KGUsbiksc2Vzc2lvbkdyb3VwTWFya2VyczpudWxsfSkpKSkpLmVudGVyKCkuYXBwZW5kKCJjaXJjbGUiKS5jbGFzc2VkKCJkYXRhLW1hcmtlciIsITApLmF0dHIoImN4IiwoKHt4OnR9KT0+dCkpLmF0dHIoImN5IiwoKHt5OnR9KT0+dCkpLmF0dHIoInIiLDIpLmF0dHIoImZpbGwiLHIpLGE9bmV3IE1hcDtlLnNlc3Npb25Hcm91cHMuZm9yRWFjaCgodD0+e2Euc2V0KHQsW10pfSkpLG8uZWFjaCgoZnVuY3Rpb24odCl7YS5nZXQodC5zZXNzaW9uR3JvdXApLnB1c2godGhpcyl9KSksby5lYWNoKCh0PT57Y29uc3QgZT1hLmdldCh0LnNlc3Npb25Hcm91cCk7dC5zZXNzaW9uR3JvdXBNYXJrZXJzPW5ldyBTZXQoZSl9KSk7Y29uc3Qgcz1uLm1hcCgodD0+aS5tYXAoKGU9Pm8uZmlsdGVyKChuPT5uLmNvbD09dCYmbi5tZXRyaWM9PWUpKSkpKSk7cmV0dXJuW28scyxhXX0pKF8uYXBwZW5kKCJnIiksdiksVD1uLm1hcCgodD0+aS5tYXAoKGU9PihmdW5jdGlvbiBuKHQsZSl7Y29uc3Qgbj1bXTtyZXR1cm4gU1t0XVtlXS5lYWNoKChmdW5jdGlvbigpe24ucHVzaCh0aGlzKX0pKSxOXygpLngoKHQ9PlN1KHQpLmRhdHVtKCkueCkpLnkoKHQ9PlN1KHQpLmRhdHVtKCkueSkpLmFkZEFsbChuKX0pKHQsZSkpKSkpO2xldCBDPW51bGw7TigpJiYoQz1fLmZpbHRlcigodD0+U2UuZXhwb3J0cy5pc0VxdWFsKHQsZS5fYnJ1c2hlZENlbGxJbmRleCkpKSxjb25zb2xlLmFzc2VydCgxPT1DLnNpemUoKSxDKSk7bGV0IEE9bmV3IFNldCh3Lm5vZGVzKCkpO2Z1bmN0aW9uIGsoKXtsZXQgbj1uZXcgU2V0KHcubm9kZXMoKSk7KGZ1bmN0aW9uIGkoKXtyZXR1cm4hTigpfHxlLl9icnVzaFNlbGVjdGlvblswXVswXT09PWUuX2JydXNoU2VsZWN0aW9uWzFdWzBdfHxlLl9icnVzaFNlbGVjdGlvblswXVsxXT09PWUuX2JydXNoU2VsZWN0aW9uWzFdWzFdfSkoKXx8KG49KGZ1bmN0aW9uIHIoZSxuKXtjb25zb2xlLmFzc2VydChudWxsIT09ZSksY29uc29sZS5hc3NlcnQobnVsbCE9PW4pO2NvbnN0W2kscl09ZSxvPW5ldyBTZXQ7cmV0dXJuIHQucXVhZFRyZWVWaXNpdFBvaW50c0luUmVjdChUW2ldW3JdLG5bMF1bMF0sblswXVsxXSxuWzFdWzBdLG5bMV1bMV0sKHQ9PntTdSh0KS5kYXR1bSgpLnNlc3Npb25Hcm91cE1hcmtlcnMuZm9yRWFjaCgodD0+e28uYWRkKHQpfSkpfSkpLG99KShlLl9icnVzaGVkQ2VsbEluZGV4LGUuX2JydXNoU2VsZWN0aW9uKSksc2goQXJyYXkuZnJvbSh0LmZpbHRlclNldChuLCh0PT4hQS5oYXModCkpKSkpLmF0dHIoImZpbGwiLHYpLHNoKEFycmF5LmZyb20odC5maWx0ZXJTZXQoQSwodD0+IW4uaGFzKHQpKSkpKS5hdHRyKCJmaWxsIiwiI2RkZCIpLEE9bn1rKCk7Y29uc3QgTD1KbSgpLmV4dGVudChbWy00LC00XSxbYS0xKzUtMSxzLTErNS0xXV0pLm9uKCJzdGFydCIsKGZ1bmN0aW9uKCl7TigpJiZDLm5vZGUoKSE9dGhpcyYmTC5tb3ZlKEMsbnVsbCksUCh0aGlzKX0pKS5vbigiYnJ1c2giLChmdW5jdGlvbigpe1AodGhpcyl9KSkub24oImVuZCIsKGZ1bmN0aW9uKCl7UCh0aGlzKX0pKTtmdW5jdGlvbiBQKHQpe2NvbnN0IG49S20odCk7IU4oKSYmbnVsbD09PW58fE4oKSYmdD09PUMubm9kZSgpJiZTZS5leHBvcnRzLmlzRXF1YWwobixlLl9icnVzaFNlbGVjdGlvbil8fChlLl9icnVzaFNlbGVjdGlvbj1uLG51bGwhPT1uPyhDPVN1KHQpLGUuX2JydXNoZWRDZWxsSW5kZXg9Qy5kYXR1bSgpKTooQz1udWxsLGUuX2JydXNoZWRDZWxsSW5kZXg9bnVsbCksaygpKX1mdW5jdGlvbiBOKCl7cmV0dXJuIG51bGwhPT1lLl9icnVzaGVkQ2VsbEluZGV4JiZudWxsIT09ZS5fYnJ1c2hTZWxlY3Rpb259Xy5jYWxsKEwpLE4oKSYmTC5tb3ZlKEMsZS5fYnJ1c2hTZWxlY3Rpb24pO2xldCBJPW51bGwsUj1udWxsO251bGwhPT10aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwJiYoUj1zaChNLmdldCh0aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwKSkuY2xhc3NlZCgic2VsZWN0ZWQtbWFya2VyIiwhMCkpLF8ub24oImNsaWNrIiwoZnVuY3Rpb24oKXtjb25zdCB0PUk9PT1SP251bGw6STtpZih0PT09UilyZXR1cm47bnVsbCE9PVImJlIuY2xhc3NlZCgic2VsZWN0ZWQtbWFya2VyIiwhMSksUj10LG51bGwhPT1SJiZSLmNsYXNzZWQoInNlbGVjdGVkLW1hcmtlciIsITApO2NvbnN0IG49bnVsbD09PVI/bnVsbDpSLmRhdHVtKCkuc2Vzc2lvbkdyb3VwO2Uuc2VsZWN0ZWRTZXNzaW9uR3JvdXA9bn0pKS5vbigibW91c2Vtb3ZlIG1vdXNlZW50ZXIiLChmdW5jdGlvbihbbixpXSl7Y29uc3RbcixvXT1haCh0aGlzKSxhPShmdW5jdGlvbiBzKGUsbixpLHIsbyl7bGV0IGE9MS8wLHM9bnVsbDtyZXR1cm4gdC5xdWFkVHJlZVZpc2l0UG9pbnRzSW5EaXNrKFRbZV1bbl0saSxyLG8sKCh0LGUpPT57aWYoQS5oYXModCkmJmU8YSl7Y29uc3Qgbj1TdSh0KS5kYXR1bSgpO2E9ZSxzPW4uc2Vzc2lvbkdyb3VwfX0pKSxudWxsPT09cz9udWxsOnNoKE0uZ2V0KHMpKX0pKG4saSxyLG8sMjApO0khPT1hJiYobnVsbCE9PUkmJkkuY2xhc3NlZCgiY2xvc2VzdC1tYXJrZXIiLCExKSxJPWEsbnVsbCE9PUk/KEkuY2xhc3NlZCgiY2xvc2VzdC1tYXJrZXIiLCEwKSxlLmNsb3Nlc3RTZXNzaW9uR3JvdXA9SS5kYXR1bSgpLnNlc3Npb25Hcm91cCk6ZS5jbG9zZXN0U2Vzc2lvbkdyb3VwPW51bGwpfSkpLm9uKCJtb3VzZWxlYXZlIiwoZnVuY3Rpb24oW3Qsbl0pe251bGwhPT1JJiYoSS5jbGFzc2VkKCJjbG9zZXN0LW1hcmtlciIsITEpLEk9bnVsbCxlLmNsb3Nlc3RTZXNzaW9uR3JvdXA9bnVsbCl9KSksdGhpcy5fc3ZnLnNlbGVjdEFsbCgiKiIpLmNsYXNzZWQoInRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90IiwhMCl9X2NlbGxTY2FsZSh0LGUpe2NvbnN0IG49dGhpcy5fY29sRXh0ZW50KHQpLGk9Vk0oKS5kb21haW4obikucmFuZ2UoZSk7aWYoIkxJTkVBUiI9PT10aGlzLm9wdGlvbnMuY29sdW1uc1t0XS5zY2FsZSlyZXR1cm4gaTtpZigiTE9HIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW3RdLnNjYWxlKXJldHVybiBuWzBdPD0wJiZuWzFdPj0wP2k6S00oKS5kb21haW4obikucmFuZ2UoZSk7aWYoIlFVQU5USUxFIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW3RdLnNjYWxlKXtjb25zdCBuPShlWzFdLWVbMF0pLzE5LGk9emwoMjApLm1hcCgodD0+ZVswXStuKnQpKTtyZXR1cm4gb0UoKS5kb21haW4oU2UuZXhwb3J0cy51bmlxKHRoaXMuc2Vzc2lvbkdyb3Vwcy5tYXAoKGU9PnRoaXMuX2NvbFZhbHVlKGUsdCkpKSkpLnJhbmdlKGkpfWlmKCJOT05fTlVNRVJJQyI9PT10aGlzLm9wdGlvbnMuY29sdW1uc1t0XS5zY2FsZSlyZXR1cm4gQU0oKS5kb21haW4oU2UuZXhwb3J0cy51bmlxKHRoaXMuc2Vzc2lvbkdyb3Vwcy5tYXAoKGU9PnRoaXMuX2NvbFZhbHVlKGUsdCkpKS5zb3J0KCkpKS5yYW5nZShlKS5wYWRkaW5nKC4xKTt0aHJvdyJVbmtub3duIHNjYWxlIGZvciBjb2x1bW46ICIrdCsiLiBvcHRpb25zOiAiK3RoaXMub3B0aW9uc31fY29sVmFsdWUodCxlKXtyZXR1cm4gRll0KHRoaXMudmlzaWJsZVNjaGVtYSx0LGUpfV9tZXRyaWNWYWx1ZSh0LGUpe3JldHVybiBIWXQodGhpcy52aXNpYmxlU2NoZW1hLHQsZSl9X2NvbEV4dGVudCh0KXtyZXR1cm4gell0KHRoaXMudmlzaWJsZVNjaGVtYSx0aGlzLnNlc3Npb25Hcm91cHMsdCl9fTtFS3QudGVtcGxhdGU9X2VgCiAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICA8c3ZnIGlkPSJzdmciPjwvc3ZnPgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgc3ZnIHsKICAgICAgICBmb250OiAxMHB4IHNhbnMtc2VyaWY7CiAgICAgIH0KCiAgICAgIHRleHQgewogICAgICAgIGZpbGw6IGN1cnJlbnRDb2xvcjsKICAgICAgfQoKICAgICAgLmZyYW1lIHJlY3QgewogICAgICAgIHN0cm9rZTogY3VycmVudENvbG9yOwogICAgICB9CgogICAgICAvKiBUaGUgY2xvc2VzdCBkYXRhIHBvaW50IG1hcmtlciB0byB0aGUgbW91c2UgcG9pbnRlci4gV2UgdXNlICFpbXBvcnRhbnQKICAgICAgICAgdG8gb3ZlcnJpZGUgdGhlIGlubGluZSBzdHlsZSB0aGF0IHNldHMgdGhlIHJlZ3VsYXIgc3R5bGUgb2YgYSBtYXJrZXIuCiAgICAgICovCiAgICAgIC5jbG9zZXN0LW1hcmtlciB7CiAgICAgICAgcjogNiAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAvKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGRhdGEgcG9pbnQgbWFya2VyLiBXZSB1c2UgIWltcG9ydGFudCB0bwogICAgICAgICBvdmVycmlkZSB0aGUgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBzdHlsZSBvZiBhIG1hcmtlci4gKi8KICAgICAgLnNlbGVjdGVkLW1hcmtlciB7CiAgICAgICAgcjogNiAhaW1wb3J0YW50OwogICAgICAgIGZpbGw6ICMwZjAgIWltcG9ydGFudDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEVLdC5wcm90b3R5cGUsInZpc2libGVTY2hlbWEiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLEVLdC5wcm90b3R5cGUsInNlc3Npb25Hcm91cHMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sRUt0LnByb3RvdHlwZSwib3B0aW9ucyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sRUt0LnByb3RvdHlwZSwic2VsZWN0ZWRTZXNzaW9uR3JvdXAiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEVLdC5wcm90b3R5cGUsImNsb3Nlc3RTZXNzaW9uR3JvdXAiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsSFRNTEVsZW1lbnQpXSxFS3QucHJvdG90eXBlLCJfY29udGFpbmVyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEVLdC5wcm90b3R5cGUsIl9zdmciLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sRUt0LnByb3RvdHlwZSwid2lkdGgiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sRUt0LnByb3RvdHlwZSwiaGVpZ2h0Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEVLdC5wcm90b3R5cGUsIl9icnVzaGVkQ2VsbEluZGV4Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEVLdC5wcm90b3R5cGUsIl9icnVzaFNlbGVjdGlvbiIsdm9pZCAwKSx0KFthKCJzZXNzaW9uR3JvdXBzLioiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLEVLdC5wcm90b3R5cGUsIl9zZXNzaW9uR3JvdXBzQ2hhbmdlZCIsbnVsbCksdChbYSgidmlzaWJsZVNjaGVtYS4qIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxFS3QucHJvdG90eXBlLCJfdmlzaWJsZVNjaGVtYUNoYW5nZWQiLG51bGwpLHQoW2EoIm9wdGlvbnMuKiIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sRUt0LnByb3RvdHlwZSwiX3JlZHJhdyIsbnVsbCksRUt0PXQoW2koInRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90IildLEVLdCk7bGV0IFRLdD1jbGFzcyBleHRlbmRzIHlle19jbG9zZXN0T3JTZWxlY3RlZCh0LGUpe3JldHVybiBudWxsIT09dD90OmV9fTtUS3QudGVtcGxhdGU9X2VgCiAgICA8aHBhcmFtcy1zcGxpdC1sYXlvdXQgb3JpZW50YXRpb249InZlcnRpY2FsIj4KICAgICAgPCEtLSBDb250cm9scyBiZWhhdmlvciBvZiB0aGUgc2NhdHRlciBwbG90IG1hdHJpeAogICAgICAgICAgICAgb3V0cHV0cyB0aGUgY29uZmlndXJlZCBvcHRpb25zIHRvIHRoZSBfb3B0aW9ucyBwcm9wZXJ0eS4gLS0+CiAgICAgIDx0Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scwogICAgICAgIHNsb3Q9ImNvbnRlbnQiCiAgICAgICAgY2xhc3M9InNlY3Rpb24iCiAgICAgICAgaWQ9ImNvbnRyb2xzIgogICAgICAgIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIgogICAgICAgIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIKICAgICAgICBvcHRpb25zPSJ7e19vcHRpb25zfX0iCiAgICAgID4KICAgICAgPC90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scz4KICAgICAgPCEtLSBUaGUgYWN0dWFsIHNjYXR0ZXIgcGxvdCBtYXRyaXggLS0+CiAgICAgIDx0Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtcGxvdAogICAgICAgIHNsb3Q9ImNvbnRlbnQiCiAgICAgICAgY2xhc3M9InNlY3Rpb24iCiAgICAgICAgaWQ9InBsb3QiCiAgICAgICAgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iCiAgICAgICAgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIgogICAgICAgIHNlbGVjdGVkLXNlc3Npb24tZ3JvdXA9Int7X3NlbGVjdGVkR3JvdXB9fSIKICAgICAgICBjbG9zZXN0LXNlc3Npb24tZ3JvdXA9Int7X2Nsb3Nlc3RHcm91cH19IgogICAgICAgIG9wdGlvbnM9IltbX29wdGlvbnNdXSIKICAgICAgPgogICAgICA8L3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90PgogICAgICA8dGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcwogICAgICAgIHNsb3Q9ImNvbnRlbnQiCiAgICAgICAgY2xhc3M9InNlY3Rpb24iCiAgICAgICAgaWQ9InZhbHVlcyIKICAgICAgICB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSIKICAgICAgICBzZXNzaW9uLWdyb3VwPSJbW19jbG9zZXN0T3JTZWxlY3RlZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Nsb3Nlc3RHcm91cCwgX3NlbGVjdGVkR3JvdXApXV0iCiAgICAgID4KICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtdmFsdWVzPgogICAgICA8IS0tIFNob3dzIHNlc3Npb24gZ3JvdXAgZGV0YWlscyBmb3IgdGhlIGNsaWNrZWQgbWFya2VyLiAtLT4KICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzCiAgICAgICAgc2xvdD0iY29udGVudCIKICAgICAgICBjbGFzcz0ic2VjdGlvbiIKICAgICAgICBpZD0iZGV0YWlscyIKICAgICAgICBiYWNrZW5kPSJbW2JhY2tlbmRdXSIKICAgICAgICBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIKICAgICAgICBzZXNzaW9uLWdyb3VwPSJbW19zZWxlY3RlZEdyb3VwXV0iCiAgICAgICAgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iCiAgICAgID4KICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscz4KICAgIDwvaHBhcmFtcy1zcGxpdC1sYXlvdXQ+CiAgICA8c3R5bGU+CiAgICAgIC5zZWN0aW9uIHsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICB9CiAgICAgICNjb250cm9scyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgI3Bsb3QgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICN2YWx1ZXMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogMTE1cHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjZGV0YWlscyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sVEt0LnByb3RvdHlwZSwiYmFja2VuZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxUS3QucHJvdG90eXBlLCJleHBlcmltZW50TmFtZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxUS3QucHJvdG90eXBlLCJjb25maWd1cmF0aW9uIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxUS3QucHJvdG90eXBlLCJzZXNzaW9uR3JvdXBzIix2b2lkIDApLFRLdD10KFtpKCJ0Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldyIpXSxUS3QpO2xldCBDS3Q9Y2xhc3MgZXh0ZW5kcyB5ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fc2VsZWN0ZWRUYWI9MH19O0NLdC50ZW1wbGF0ZT1fZWAKICAgIDxwYXBlci1oZWFkZXItcGFuZWw+CiAgICAgIDxwYXBlci10b29sYmFyIHNsb3Q9ImhlYWRlciIgY2xhc3M9InRhYi1iYXIiPgogICAgICAgIDxwYXBlci10YWJzIHNlbGVjdGVkPSJ7e19zZWxlY3RlZFRhYn19IiBzbG90PSJ0b3AiPgogICAgICAgICAgPCEtLSB2aWV3LWlkIGNhbiBiZSB1c2VkIGJ5IGludGVncmF0aW9uIHRlc3RzIHRvIGxvY2F0ZSBhIHRhYi4KICAgICAgICAgICAgICAgSXQgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSByb290IGVsZW1lbnQgaW1wbGVtZW50aW5nIHRoZSB2aWV3CiAgICAgICAgICAgICAgIHdpdGhvdXQgdGhlICd0Zi1ocGFyYW1zLScgcHJlZml4LiAtLT4KICAgICAgICAgIDxwYXBlci10YWIgdmlldy1pZD0idGFibGUtdmlldyI+IFRBQkxFIFZJRVcgPC9wYXBlci10YWI+CiAgICAgICAgICA8cGFwZXItdGFiIHZpZXctaWQ9InBhcmFsbGVsLWNvb3Jkcy12aWV3Ij4KICAgICAgICAgICAgUEFSQUxMRUwgQ09PUkRJTkFURVMgVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8cGFwZXItdGFiIHZpZXctaWQ9InNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldyI+CiAgICAgICAgICAgIFNDQVRURVIgUExPVCBNQVRSSVggVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWxwLWFuZC1mZWVkYmFjayI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tidWdSZXBvcnRVcmxdXSI+CiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWYkPSJbW2J1Z1JlcG9ydFVybF1dIgogICAgICAgICAgICAgICAgdGFyZ2V0PSJfYmxhbmsiCiAgICAgICAgICAgICAgICByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbgogICAgICAgICAgICAgICAgICBpZD0iYnVnLXJlcG9ydCIKICAgICAgICAgICAgICAgICAgcmFpc2VkCiAgICAgICAgICAgICAgICAgIHRpdGxlPSJTZW5kIGEgYnVnIHJlcG9ydCBvciBmZWF0dXJlIHJlcXVlc3QiCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIEJ1ZyBSZXBvcnQgLyBGZWF0dXJlIFJlcXVlc3QKICAgICAgICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hlbHBVcmxdXSI+CiAgICAgICAgICAgICAgPGEgaHJlZiQ9IltbaGVscFVybF1dIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIj4KICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgICAgICAgICAgICBpY29uPSJoZWxwLW91dGxpbmUiCiAgICAgICAgICAgICAgICAgIHRpdGxlPSJWaWV3IGRvY3VtZW50YXRpb24iCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvcGFwZXItdGFicz4KICAgICAgPC9wYXBlci10b29sYmFyPgogICAgICA8aXJvbi1wYWdlcyBzZWxlY3RlZD0iW1tfc2VsZWN0ZWRUYWJdXSIgY2xhc3M9ImZpdCB0YWItdmlldyI+CiAgICAgICAgPGRpdiBpZD0iMCIgY2xhc3M9InRhYiI+CiAgICAgICAgICA8dGYtaHBhcmFtcy10YWJsZS12aWV3CiAgICAgICAgICAgIGJhY2tlbmQ9IltbYmFja2VuZF1dIgogICAgICAgICAgICBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIKICAgICAgICAgICAgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iCiAgICAgICAgICAgIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIKICAgICAgICAgICAgZW5hYmxlLXNob3ctbWV0cmljcwogICAgICAgICAgPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXRhYmxlLXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iMSIgY2xhc3M9InRhYiI+CiAgICAgICAgICA8dGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldwogICAgICAgICAgICBiYWNrZW5kPSJbW2JhY2tlbmRdXSIKICAgICAgICAgICAgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iCiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIgogICAgICAgICAgICBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iCiAgICAgICAgICA+CiAgICAgICAgICA8L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iMiIgY2xhc3M9InRhYiI+CiAgICAgICAgICA8dGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXZpZXcKICAgICAgICAgICAgYmFja2VuZD0iW1tiYWNrZW5kXV0iCiAgICAgICAgICAgIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIgogICAgICAgICAgICBjb25maWd1cmF0aW9uPSJbW2NvbmZpZ3VyYXRpb25dXSIKICAgICAgICAgICAgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIgogICAgICAgICAgPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldz4KICAgICAgICA8L2Rpdj4KICAgICAgPC9pcm9uLXBhZ2VzPgogICAgPC9wYXBlci1oZWFkZXItcGFuZWw+CgogICAgPHN0eWxlPgogICAgICAudGFiLXZpZXcgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAudGFiLWJhciB7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKAogICAgICAgICAgLS10Yi10b29sYmFyLWJhY2tncm91bmQtY29sb3IsCiAgICAgICAgICB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKQogICAgICAgICk7CiAgICAgIH0KICAgICAgLnRhYiB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIHBhcGVyLXRhYnMgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgLS1wYXBlci10YWJzLXNlbGVjdGlvbi1iYXItY29sb3I6IHdoaXRlOwogICAgICAgIC0tcGFwZXItdGFicy1jb250ZW50OiB7CiAgICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGYtaHBhcmFtcy10YWJsZS12aWV3IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLmhlbHAtYW5kLWZlZWRiYWNrIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsgLyogRW5zdXJlIHRoYXQgaWNvbnMgc3RheSBhbGlnbmVkICovCiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQogICAgICAjYnVnLXJlcG9ydCB7CiAgICAgICAgYm9yZGVyOiBzb2xpZCBibGFjazsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkczsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgbWF4LXdpZHRoOiAxNTBweDsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CiAgICAgIC5oZWxwLWFuZC1mZWVkYmFjayBhIHsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sQ0t0LnByb3RvdHlwZSwiYmFja2VuZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxDS3QucHJvdG90eXBlLCJoZWxwVXJsIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLENLdC5wcm90b3R5cGUsImJ1Z1JlcG9ydFVybCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxDS3QucHJvdG90eXBlLCJleHBlcmltZW50TmFtZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxDS3QucHJvdG90eXBlLCJjb25maWd1cmF0aW9uIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxDS3QucHJvdG90eXBlLCJzZXNzaW9uR3JvdXBzIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLENLdC5wcm90b3R5cGUsIl9zZWxlY3RlZFRhYiIsdm9pZCAwKSxDS3Q9dChbaSgidGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lIildLENLdCk7Y2xhc3MgQUt0e2NvbnN0cnVjdG9yKHQsZSxuPSEwKXt0aGlzLl9hcGlVcmw9dCx0aGlzLl9yZXF1ZXN0TWFuYWdlcj1lLHRoaXMuX3VzZUh0dHBHZXQ9bn1nZXRFeHBlcmltZW50KHQpe3JldHVybiB0aGlzLl9zZW5kUmVxdWVzdCgiZXhwZXJpbWVudCIsdCl9Z2V0RG93bmxvYWRVcmwodCxlLG4pe3JldHVybiB0aGlzLl9hcGlVcmwrIi9kb3dubG9hZF9kYXRhPyIrbmV3IFVSTFNlYXJjaFBhcmFtcyh7Zm9ybWF0OnQsY29sdW1uc1Zpc2liaWxpdHk6SlNPTi5zdHJpbmdpZnkobikscmVxdWVzdDpKU09OLnN0cmluZ2lmeShlKX0pfWxpc3RTZXNzaW9uR3JvdXBzKHQpe3JldHVybiB0aGlzLl9zZW5kUmVxdWVzdCgic2Vzc2lvbl9ncm91cHMiLHQpfWxpc3RNZXRyaWNFdmFscyh0KXtyZXR1cm4gdGhpcy5fc2VuZFJlcXVlc3QoIm1ldHJpY19ldmFscyIsdCl9X3NlbmRSZXF1ZXN0KHQsZSl7aWYodGhpcy5fdXNlSHR0cEdldCl7Y29uc3Qgbj1lbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoZSkpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHRoaXMuX2FwaVVybCsiLyIrdCsiP3JlcXVlc3Q9IituKX1jb25zdCBuPW5ldyBocjtyZXR1cm4gbi53aXRoQ3JlZGVudGlhbHM9ITAsbi5tZXRob2RUeXBlPXVyLlBPU1Qsbi5jb250ZW50VHlwZT0idGV4dC9wbGFpbiIsbi5ib2R5PUpTT04uc3RyaW5naWZ5KGUpLHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3RXaXRoT3B0aW9ucyh0aGlzLl9hcGlVcmwrIi8iK3Qsbil9fWxldCBrS3Q9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe3JlbG9hZCgpe3RoaXMuJFsicXVlcnktcGFuZSJdLnJlbG9hZCgpfX07a0t0LnRlbXBsYXRlPV9lYAogICAgPGhwYXJhbXMtc3BsaXQtbGF5b3V0PgogICAgICA8ZGl2IHNsb3Q9ImNvbnRlbnQiIGNsYXNzPSJzaWRlYmFyIj4KICAgICAgICA8dGYtaHBhcmFtcy1xdWVyeS1wYW5lCiAgICAgICAgICBpZD0icXVlcnktcGFuZSIKICAgICAgICAgIGJhY2tlbmQ9IltbYmFja2VuZF1dIgogICAgICAgICAgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iCiAgICAgICAgICBjb25maWd1cmF0aW9uPSJ7e19jb25maWd1cmF0aW9ufX0iCiAgICAgICAgICBzZXNzaW9uLWdyb3Vwcz0ie3tfc2Vzc2lvbkdyb3Vwc319IgogICAgICAgICAgZGF0YS1sb2FkZWQtd2l0aC1ub24tZW1wdHktaHBhcmFtcz0ie3tfZGF0YUxvYWRlZFdpdGhOb25FbXB0eUhwYXJhbXN9fSIKICAgICAgICAgIGRhdGEtbG9hZGVkLXdpdGgtZW1wdHktaHBhcmFtcz0ie3tfZGF0YUxvYWRlZFdpdGhFbXB0eUhwYXJhbXN9fSIKICAgICAgICA+CiAgICAgICAgPC90Zi1ocGFyYW1zLXF1ZXJ5LXBhbmU+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IHNsb3Q9ImNvbnRlbnQiIGNsYXNzPSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YUxvYWRlZFdpdGhFbXB0eUhwYXJhbXNdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gaHBhcmFtcyBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6PC9wPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgaHBhcmFtcyBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBFdmVudCBmaWxlcyBhcmUgc3RpbGwgYmVpbmcgbG9hZGVkICh0cnkgcmVsb2FkaW5nIHRoaXMgcGFnZSkuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIKICAgICAgICAgICAgICAgID5SRUFETUU8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiCiAgICAgICAgICAgICAgICA+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2EKICAgICAgICAgICAgICA+LgogICAgICAgICAgICA8L3A+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIgogICAgICAgICAgICAgICAgPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YUxvYWRlZFdpdGhOb25FbXB0eUhwYXJhbXNdXSI+CiAgICAgICAgICA8dGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lCiAgICAgICAgICAgIGlkPSJzZXNzaW9ucy1wYW5lIgogICAgICAgICAgICBiYWNrZW5kPSJbW2JhY2tlbmRdXSIKICAgICAgICAgICAgaGVscC11cmw9IltbaGVscFVybF1dIgogICAgICAgICAgICBidWctcmVwb3J0LXVybD0iW1tidWdSZXBvcnRVcmxdXSIKICAgICAgICAgICAgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iCiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb249IltbX2NvbmZpZ3VyYXRpb25dXSIKICAgICAgICAgICAgc2Vzc2lvbi1ncm91cHM9IltbX3Nlc3Npb25Hcm91cHNdXSIKICAgICAgICAgID4KICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC9ocGFyYW1zLXNwbGl0LWxheW91dD4KICAgIDxzdHlsZT4KICAgICAgaHBhcmFtcy1zcGxpdC1sYXlvdXQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuc2lkZWJhciB7CiAgICAgICAgd2lkdGg6IDIwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIG1pbi13aWR0aDogMTAlOwogICAgICB9CgogICAgICAuY2VudGVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgd2lkdGg6IDgwJTsKICAgICAgfQoKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CgogICAgICBhIHsKICAgICAgICBjb2xvcjogdmFyKC0tdGItbGluayk7CiAgICAgIH0KCiAgICAgIGE6dmlzaXRlZCB7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLWxpbmstdmlzaXRlZCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixBS3QpXSxrS3QucHJvdG90eXBlLCJiYWNrZW5kIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGtLdC5wcm90b3R5cGUsImV4cGVyaW1lbnROYW1lIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGtLdC5wcm90b3R5cGUsImhlbHBVcmwiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sa0t0LnByb3RvdHlwZSwiYnVnUmVwb3J0VXJsIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGtLdC5wcm90b3R5cGUsIl9jb25maWd1cmF0aW9uIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxrS3QucHJvdG90eXBlLCJfc2Vzc2lvbkdyb3VwcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGtLdC5wcm90b3R5cGUsIl9kYXRhTG9hZGVkV2l0aE5vbkVtcHR5SHBhcmFtcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGtLdC5wcm90b3R5cGUsIl9kYXRhTG9hZGVkV2l0aEVtcHR5SHBhcmFtcyIsdm9pZCAwKSxrS3Q9dChbaSgidGYtaHBhcmFtcy1tYWluIildLGtLdCk7Y29uc3QgTEt0PSJ0cnVlIj09PW5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KCJ0ZW5zb3Jib2FyZENvbGFiIik7bGV0IFBLdD1jbGFzcyBleHRlbmRzKGVyKHllKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX2JhY2tlbmQ9bmV3IEFLdChfcigpLnBsdWdpblJvdXRlKCJocGFyYW1zIiwiIiksbmV3IGRyLExLdCl9cmVsb2FkKCl7dGhpcy4kWyJocGFyYW1zLW1haW4iXS5yZWxvYWQoKX19O1BLdC50ZW1wbGF0ZT1fZWAKICAgIDwhLS0gVGVuc29yQm9hcmQgZG9lcyBub3Qgc3BlY2lmeSBhbiBleHBlcmltZW50TmFtZS4gQ3VycmVudGx5IGl0IG9ubHkKICAgICAgICAgc3VwcG9ydHMgb25lIGV4cGVyaW1lbnQgcGVyIGludm9jYXRpb24uIC0tPgogICAgPHRmLWhwYXJhbXMtbWFpbgogICAgICBpZD0iaHBhcmFtcy1tYWluIgogICAgICBiYWNrZW5kPSJbW19iYWNrZW5kXV0iCiAgICAgIGV4cGVyaW1lbnQtbmFtZT0iIgogICAgPgogICAgPC90Zi1ocGFyYW1zLW1haW4+CiAgYCx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxQS3QucHJvdG90eXBlLCJfYmFja2VuZCIsdm9pZCAwKSxQS3Q9dChbaSgidGYtaHBhcmFtcy1kYXNoYm9hcmQiKV0sUEt0KTtsZXQgTkt0PWNsYXNzIGV4dGVuZHMoZXIoeWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5hY3R1YWxTaXplPSExLHRoaXMuYnJpZ2h0bmVzc0FkanVzdG1lbnQ9LjUsdGhpcy5jb250cmFzdFBlcmNlbnRhZ2U9MCx0aGlzLl9tZXRhZGF0YUNhbmNlbGxlcj1uZXcgWFIsdGhpcy5faW1hZ2VDYW5jZWxsZXI9bmV3IFhSLHRoaXMuX3N0ZXBzPVtdLHRoaXMuX2lzSW1hZ2VMb2FkaW5nPSExfWdldCBfcnVuQ29sb3IoKXtyZXR1cm4gR1IodGhpcy5ydW4pfWdldCBfaGFzQXRMZWFzdE9uZVN0ZXAoKXt2YXIgdD10aGlzLl9zdGVwcztyZXR1cm4hIXQmJnQubGVuZ3RoPjB9Z2V0IF9oYXNNdWx0aXBsZVN0ZXBzKCl7dmFyIHQ9dGhpcy5fc3RlcHM7cmV0dXJuISF0JiZ0Lmxlbmd0aD4xfWdldCBfY3VycmVudFN0ZXAoKXtyZXR1cm4gdGhpcy5fc3RlcHNbdGhpcy5fc3RlcEluZGV4XXx8bnVsbH1nZXQgX3N0ZXBWYWx1ZSgpe3ZhciB0PXRoaXMuX2N1cnJlbnRTdGVwO3JldHVybiB0P3Quc3RlcDowfWdldCBfY3VycmVudFdhbGxUaW1lKCl7dmFyIHQ9dGhpcy5fY3VycmVudFN0ZXA7cmV0dXJuIHQ/S1IodC53YWxsX3RpbWUpOiIifWdldCBfbWF4U3RlcEluZGV4KCl7cmV0dXJuIHRoaXMuX3N0ZXBzLmxlbmd0aC0xfWdldCBfc2FtcGxlVGV4dCgpe3JldHVybmAke3RoaXMuc2FtcGxlKzF9YH1nZXQgX2hhc011bHRpcGxlU2FtcGxlcygpe3JldHVybiB0aGlzLm9mU2FtcGxlcz4xfV9nZXRBcmlhRXhwYW5kZWQoKXtyZXR1cm4gdGhpcy5hY3R1YWxTaXplPyJ0cnVlIjoiZmFsc2UifWF0dGFjaGVkKCl7dGhpcy5yZWxvYWQoKX1yZWxvYWQoKXtpZighdGhpcy5pc0F0dGFjaGVkKXJldHVybjt0aGlzLl9tZXRhZGF0YUNhbmNlbGxlci5jYW5jZWxBbGwoKTtjb25zdCB0PWlPKF9yKCkucGx1Z2luUm91dGUoImltYWdlcyIsIi9pbWFnZXMiKSx7dGFnOnRoaXMudGFnLHJ1bjp0aGlzLnJ1bixzYW1wbGU6dGhpcy5zYW1wbGV9KSxlPXRoaXMuX21ldGFkYXRhQ2FuY2VsbGVyLmNhbmNlbGxhYmxlKCh0PT57aWYodC5jYW5jZWxsZWQpcmV0dXJuO2NvbnN0IGU9dC52YWx1ZS5tYXAodGhpcy5fY3JlYXRlU3RlcERhdHVtLmJpbmQodGhpcykpO3RoaXMuc2V0KCJfc3RlcHMiLGUpLHRoaXMuc2V0KCJfc3RlcEluZGV4IixlLmxlbmd0aC0xKX0pKTt0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodCkudGhlbihlKX1fY3JlYXRlU3RlcERhdHVtKHQpe2xldCBlPV9yKCkucGx1Z2luUm91dGUoImltYWdlcyIsIi9pbmRpdmlkdWFsSW1hZ2UiKTtyZXR1cm4gZT1pTyhlLHt0czp0LndhbGxfdGltZX0pLGUrPSImIit0LnF1ZXJ5LHt3YWxsX3RpbWU6bmV3IERhdGUoMWUzKnQud2FsbF90aW1lKSxzdGVwOnQuc3RlcCx1cmw6ZX19X3VwZGF0ZUltYWdlVXJsKCl7dmFyIHQ9dGhpcy5fY3VycmVudFN0ZXAsZT10aGlzLmJyaWdodG5lc3NBZGp1c3RtZW50LG49dGhpcy5jb250cmFzdFBlcmNlbnRhZ2U7aWYoIXQpcmV0dXJuO2NvbnN0IGk9bmV3IEltYWdlO3RoaXMuX2ltYWdlQ2FuY2VsbGVyLmNhbmNlbEFsbCgpLGkub25sb2FkPWkub25lcnJvcj10aGlzLl9pbWFnZUNhbmNlbGxlci5jYW5jZWxsYWJsZSgodD0+e2lmKHQuY2FuY2VsbGVkKXJldHVybjtjb25zdCBlPXRoaXMuJCQoIiNtYWluLWltYWdlLWNvbnRhaW5lciIpO2UudGV4dENvbnRlbnQ9IiIsWWkoZSkuYXBwZW5kQ2hpbGQoaSksdGhpcy5zZXQoIl9pc0ltYWdlTG9hZGluZyIsITEpfSkpLmJpbmQodGhpcyksaS5zdHlsZS5maWx0ZXI9YGNvbnRyYXN0KCR7bn0lKSBgLGkuc3R5bGUuZmlsdGVyKz1gYnJpZ2h0bmVzcygke2V9KWAsdGhpcy5zZXQoIl9pc0ltYWdlTG9hZGluZyIsITApLGkuc3JjPXQudXJsfV9oYW5kbGVUYXAodCl7dGhpcy5zZXQoImFjdHVhbFNpemUiLCF0aGlzLmFjdHVhbFNpemUpfV90b0xvY2FsZVN0cmluZyh0KXtyZXR1cm4gdC50b0xvY2FsZVN0cmluZygpfX07Tkt0LnRlbXBsYXRlPV9lYAogICAgPHRmLWNhcmQtaGVhZGluZwogICAgICB0YWc9IltbdGFnXV0iCiAgICAgIHJ1bj0iW1tydW5dXSIKICAgICAgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iCiAgICAgIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iCiAgICAgIGNvbG9yPSJbW19ydW5Db2xvcl1dIgogICAgPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU2FtcGxlc11dIj4KICAgICAgICA8ZGl2PnNhbXBsZTogW1tfc2FtcGxlVGV4dF1dIG9mIFtbb2ZTYW1wbGVzXV08L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNBdExlYXN0T25lU3RlcF1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgc3RlcAogICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiCiAgICAgICAgICAgICAgPltbX3RvTG9jYWxlU3RyaW5nKF9zdGVwVmFsdWUpXV08L3NwYW4KICAgICAgICAgICAgPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIGhlYWRpbmctcmlnaHQgZGF0ZXRpbWUiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2N1cnJlbnRXYWxsVGltZV1dIj4KICAgICAgICAgICAgICBbW19jdXJyZW50V2FsbFRpbWVdXQogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCByaWdodCI+CiAgICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlIGhpZGRlbiQ9IltbIV9pc0ltYWdlTG9hZGluZ11dIj4KICAgICAgICAgICAgPC9wYXBlci1zcGlubmVyLWxpdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVN0ZXBzXV0iPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItc2xpZGVyCiAgICAgICAgICAgIGlkPSJzdGVwcyIKICAgICAgICAgICAgaW1tZWRpYXRlLXZhbHVlPSJ7e19zdGVwSW5kZXh9fSIKICAgICAgICAgICAgbWF4PSJbW19tYXhTdGVwSW5kZXhdXSIKICAgICAgICAgICAgbWF4LW1hcmtlcnM9IltbX21heFN0ZXBJbmRleF1dIgogICAgICAgICAgICBzbmFwcwogICAgICAgICAgICBzdGVwPSIxIgogICAgICAgICAgICB2YWx1ZT0ie3tfc3RlcEluZGV4fX0iCiAgICAgICAgICA+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KCiAgICA8IS0tIFNlbWFudGljYWxseSBhIGJ1dHRvbiBidXQgPGltZz4gaW5zaWRlIGEgPGJ1dHRvbj4gZGlzYWxsb3dzIHVzZXIgdG8gZG8KICAgIGFuIGludGVyZXN0aW5nIG9wZXJhdGlvbiBsaWtlICJDb3B5IEltYWdlIiBpbiBub24tQ2hyb21pdW0gYnJvd3NlcnMuIC0tPgogICAgPGEKICAgICAgaWQ9Im1haW4taW1hZ2UtY29udGFpbmVyIgogICAgICByb2xlPSJidXR0b24iCiAgICAgIGFyaWEtbGFiZWw9IlRvZ2dsZSBhY3R1YWwgc2l6ZSIKICAgICAgYXJpYS1leHBhbmRlZCQ9IltbX2dldEFyaWFFeHBhbmRlZChhY3R1YWxTaXplKV1dIgogICAgICBvbi10YXA9Il9oYW5kbGVUYXAiCiAgICA+PC9hPgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1jYXJkLWhlYWRpbmctc3R5bGUiPgogICAgICAvKiogTWFrZSBidXR0b24gYSBkaXYuICovCiAgICAgIGJ1dHRvbiB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLyoqIEZpcmVmb3g6IEdldCByaWQgb2YgZG90dGVkIGxpbmUgaW5zaWRlIGJ1dHRvbi4gKi8KICAgICAgYnV0dG9uOjotbW96LWZvY3VzLWlubmVyIHsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLyoqIEZpcmVmb3g6IFNpbXVsYXRlIENocm9tZSdzIG91dGVyIGdsb3cgb24gYnV0dG9uIHdoZW4gZm9jdXNlZC4gKi8KICAgICAgYnV0dG9uOi1tb3otZm9jdXNyaW5nIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJveC1zaGFkb3c6IDBweCAwcHggMXB4IDJweCBIaWdobGlnaHQ7CiAgICAgIH0KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMzUwcHg7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtYXJnaW46IDAgMTVweCA0MHB4IDA7CiAgICAgICAgb3ZlcmZsb3cteDogYXV0bzsKICAgICAgfQoKICAgICAgLyoqIFdoZW4gYWN0dWFsIHNpemUgc2hvd24gaXMgb24sIHVzZSB0aGUgYWN0dWFsIGltYWdlIHdpZHRoLiAqLwogICAgICA6aG9zdChbYWN0dWFsLXNpemVdKSB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIHdpZHRoOiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbYWN0dWFsLXNpemVdKSAjbWFpbi1pbWFnZS1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IG5vbmU7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgIH0KCiAgICAgIDpob3N0KFthY3R1YWwtc2l6ZV0pICNtYWluLWltYWdlLWNvbnRhaW5lciBpbWcgewogICAgICAgIHdpZHRoOiBhdXRvOwogICAgICB9CgogICAgICBwYXBlci1zcGlubmVyLWxpdGUgewogICAgICAgIHdpZHRoOiAxNHB4OwogICAgICAgIGhlaWdodDogMTRweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC1ib3R0b207CiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgfQoKICAgICAgI3N0ZXBzIHsKICAgICAgICBoZWlnaHQ6IDE1cHg7CiAgICAgICAgbWFyZ2luOiAwIDAgMCAtMTVweDsKICAgICAgICAvKgogICAgICAgICAqIDMxIGNvbWVzIGZyb20gYWRkaW5nIGEgcGFkZGluZyBvZiAxNXB4IGZyb20gYm90aCBzaWRlcyBvZiB0aGUKICAgICAgICAgKiBwYXBlci1zbGlkZXIsIHN1YnRyYWN0aW5nIDFweCBzbyB0aGF0IHRoZSBzbGlkZXIgd2lkdGggYWxpZ25zCiAgICAgICAgICogd2l0aCB0aGUgaW1hZ2UgKHRoZSBsYXN0IHNsaWRlciBtYXJrZXIgdGFrZXMgdXAgMXB4KSwgYW5kCiAgICAgICAgICogYWRkaW5nIDJweCB0byBhY2NvdW50IGZvciBhIGJvcmRlciBvZiAxcHggb24gYm90aCBzaWRlcyBvZgogICAgICAgICAqIHRoZSBpbWFnZS4gMzAgLSAxICsgMi4KICAgICAgICAgKi8KICAgICAgICB3aWR0aDogY2FsYygxMDAlICsgMzFweCk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICB9CgogICAgICAjbWFpbi1pbWFnZS1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IDEwMjRweDsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQoKICAgICAgI21haW4taW1hZ2UtY29udGFpbmVyIGltZyB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGltYWdlLXJlbmRlcmluZzogLW1vei1jcmlzcC1lZGdlczsKICAgICAgICBpbWFnZS1yZW5kZXJpbmc6IHBpeGVsYXRlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CiAgICAgIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sTkt0LnByb3RvdHlwZSwicnVuIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLE5LdC5wcm90b3R5cGUsInRhZyIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxOS3QucHJvdG90eXBlLCJzYW1wbGUiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sTkt0LnByb3RvdHlwZSwib2ZTYW1wbGVzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLE5LdC5wcm90b3R5cGUsInRhZ01ldGFkYXRhIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLE5LdC5wcm90b3R5cGUsImFjdHVhbFNpemUiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sTkt0LnByb3RvdHlwZSwiYnJpZ2h0bmVzc0FkanVzdG1lbnQiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sTkt0LnByb3RvdHlwZSwiY29udHJhc3RQZXJjZW50YWdlIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLGRyKV0sTkt0LnByb3RvdHlwZSwicmVxdWVzdE1hbmFnZXIiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTkt0LnByb3RvdHlwZSwiX21ldGFkYXRhQ2FuY2VsbGVyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLE5LdC5wcm90b3R5cGUsIl9pbWFnZUNhbmNlbGxlciIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLE5LdC5wcm90b3R5cGUsIl9zdGVwcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcixub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sTkt0LnByb3RvdHlwZSwiX3N0ZXBJbmRleCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLE5LdC5wcm90b3R5cGUsIl9pc0ltYWdlTG9hZGluZyIsdm9pZCAwKSx0KFtzKCJydW4iKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxOS3QucHJvdG90eXBlLCJfcnVuQ29sb3IiLG51bGwpLHQoW3MoIl9zdGVwcyIpLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxOS3QucHJvdG90eXBlLCJfaGFzQXRMZWFzdE9uZVN0ZXAiLG51bGwpLHQoW3MoIl9zdGVwcyIpLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxOS3QucHJvdG90eXBlLCJfaGFzTXVsdGlwbGVTdGVwcyIsbnVsbCksdChbcygiX3N0ZXBzIiwiX3N0ZXBJbmRleCIpLGUoImRlc2lnbjp0eXBlIixPYmplY3QpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLE5LdC5wcm90b3R5cGUsIl9jdXJyZW50U3RlcCIsbnVsbCksdChbcygiX2N1cnJlbnRTdGVwIiksZSgiZGVzaWduOnR5cGUiLE51bWJlciksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sTkt0LnByb3RvdHlwZSwiX3N0ZXBWYWx1ZSIsbnVsbCksdChbcygiX2N1cnJlbnRTdGVwIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sTkt0LnByb3RvdHlwZSwiX2N1cnJlbnRXYWxsVGltZSIsbnVsbCksdChbcygiX3N0ZXBzIiksZSgiZGVzaWduOnR5cGUiLE51bWJlciksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sTkt0LnByb3RvdHlwZSwiX21heFN0ZXBJbmRleCIsbnVsbCksdChbcygic2FtcGxlIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sTkt0LnByb3RvdHlwZSwiX3NhbXBsZVRleHQiLG51bGwpLHQoW3MoIm9mU2FtcGxlcyIpLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxOS3QucHJvdG90eXBlLCJfaGFzTXVsdGlwbGVTYW1wbGVzIixudWxsKSx0KFthKCJydW4iLCJ0YWciKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLE5LdC5wcm90b3R5cGUsInJlbG9hZCIsbnVsbCksdChbYSgiX2N1cnJlbnRTdGVwIiwiYnJpZ2h0bmVzc0FkanVzdG1lbnQiLCJjb250cmFzdFBlcmNlbnRhZ2UiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLE5LdC5wcm90b3R5cGUsIl91cGRhdGVJbWFnZVVybCIsbnVsbCksTkt0PXQoW2koInRmLWltYWdlLWxvYWRlciIpXSxOS3QpO2xldCBJS3Q9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnJlbG9hZE9uUmVhZHk9ITAsdGhpcy5fZGVmYXVsdEJyaWdodG5lc3NBZGp1c3RtZW50PTEsdGhpcy5fZGVmYXVsdENvbnRyYXN0UGVyY2VudGFnZT0xMDAsdGhpcy5fYnJpZ2h0bmVzc0FkanVzdG1lbnQ9MSx0aGlzLl9jb250cmFzdFBlcmNlbnRhZ2U9MTAwLHRoaXMuX3JlcXVlc3RNYW5hZ2VyPW5ldyBkcn1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5yZWxvYWRPblJlYWR5JiZ0aGlzLnJlbG9hZCgpfXJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCgpPT57dGhpcy5fcmVsb2FkSW1hZ2VzKCl9KSl9X2ZldGNoVGFncygpe2NvbnN0IHQ9X3IoKS5wbHVnaW5Sb3V0ZSgiaW1hZ2VzIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0KS50aGVuKCh0PT57aWYoU2UuZXhwb3J0cy5pc0VxdWFsKHQsdGhpcy5fcnVuVG9UYWdJbmZvKSlyZXR1cm47Y29uc3QgZT1hcihTZS5leHBvcnRzLm1hcFZhbHVlcyh0LCh0PT5PYmplY3Qua2V5cyh0KSkpKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWUubGVuZ3RoKSx0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsdCksdGhpcy5hc3luYygoKCk9Pnt0aGlzLnNldCgiX2NhdGVnb3JpZXNEb21SZWFkeSIsITApfSkpfSkpfV9yZWxvYWRJbWFnZXMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtaW1hZ2UtbG9hZGVyIikuZm9yRWFjaCgodD0+e3QucmVsb2FkKCl9KSl9X3Nob3VsZE9wZW4odCl7cmV0dXJuIHQ8PTJ9X3Jlc2V0QnJpZ2h0bmVzcygpe3RoaXMuX2JyaWdodG5lc3NBZGp1c3RtZW50PXRoaXMuX2RlZmF1bHRCcmlnaHRuZXNzQWRqdXN0bWVudH1fcmVzZXRDb250cmFzdCgpe3RoaXMuX2NvbnRyYXN0UGVyY2VudGFnZT10aGlzLl9kZWZhdWx0Q29udHJhc3RQZXJjZW50YWdlfWdldCBfYnJpZ2h0bmVzc0lzRGVmYXVsdCgpe3JldHVybiB0aGlzLl9icmlnaHRuZXNzQWRqdXN0bWVudD09PXRoaXMuX2RlZmF1bHRCcmlnaHRuZXNzQWRqdXN0bWVudH1nZXQgX2NvbnRyYXN0SXNEZWZhdWx0KCl7cmV0dXJuIHRoaXMuX2NvbnRyYXN0UGVyY2VudGFnZT09PXRoaXMuX2RlZmF1bHRDb250cmFzdFBlcmNlbnRhZ2V9Z2V0IF9jYXRlZ29yaWVzKCl7dmFyIHQ9dGhpcy5fcnVuVG9UYWdJbmZvLGU9dGhpcy5fc2VsZWN0ZWRSdW5zLG49dGhpcy5fdGFnRmlsdGVyO2Z1bmN0aW9uIGkoZSl7Y29uc3Qgbj10W2UucnVuXVtlLnRhZ10uc2FtcGxlcztyZXR1cm4gU2UuZXhwb3J0cy5yYW5nZShuKS5tYXAoKHQ9Pk9iamVjdC5hc3NpZ24oe30sZSx7c2FtcGxlOnQsb2ZTYW1wbGVzOm59KSkpfXJldHVybiBNcihTZS5leHBvcnRzLm1hcFZhbHVlcyh0LCh0PT5PYmplY3Qua2V5cyh0KSkpLGUsbikubWFwKCh0PT5PYmplY3QuYXNzaWduKHt9LHQse2l0ZW1zOltdLmNvbmNhdC5hcHBseShbXSx0Lml0ZW1zLm1hcChpKSl9KSkpfV90YWdNZXRhZGF0YSh0LGUsbil7cmV0dXJuIHRbZV1bbl19fTt2YXIgUkt0LE9LdCx6S3Q7SUt0LnRlbXBsYXRlPV9lYAogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxpbmUtaXRlbSI+CiAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7X2FjdHVhbFNpemV9fSIKICAgICAgICAgICAgICAgID5TaG93IGFjdHVhbCBpbWFnZSBzaXplPC9wYXBlci1jaGVja2JveAogICAgICAgICAgICAgID4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxoMyBjbGFzcz0idG9vbHRpcC1jb250YWluZXIiPkJyaWdodG5lc3MgYWRqdXN0bWVudDwvaDM+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgPHBhcGVyLXNsaWRlcgogICAgICAgICAgICAgICAgbWluPSIwIgogICAgICAgICAgICAgICAgbWF4PSIyIgogICAgICAgICAgICAgICAgc25hcHMKICAgICAgICAgICAgICAgIHBpbgogICAgICAgICAgICAgICAgc3RlcD0iMC4wMSIKICAgICAgICAgICAgICAgIHZhbHVlPSJ7e19icmlnaHRuZXNzQWRqdXN0bWVudH19IgogICAgICAgICAgICAgICAgaW1tZWRpYXRlLXZhbHVlPSJ7e19icmlnaHRuZXNzQWRqdXN0bWVudH19IgogICAgICAgICAgICAgID48L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgICBjbGFzcz0ieC1idXR0b24iCiAgICAgICAgICAgICAgICBvbi10YXA9Il9yZXNldEJyaWdodG5lc3MiCiAgICAgICAgICAgICAgICBkaXNhYmxlZD0iW1tfYnJpZ2h0bmVzc0lzRGVmYXVsdF1dIgogICAgICAgICAgICAgICAgPlJlc2V0PC9wYXBlci1idXR0b24KICAgICAgICAgICAgICA+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8aDMgY2xhc3M9InRvb2x0aXAtY29udGFpbmVyIj5Db250cmFzdCBhZGp1c3RtZW50PC9oMz4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIj4KICAgICAgICAgICAgICA8cGFwZXItc2xpZGVyCiAgICAgICAgICAgICAgICBtaW49IjAiCiAgICAgICAgICAgICAgICBtYXg9IjUwMCIKICAgICAgICAgICAgICAgIHNuYXBzCiAgICAgICAgICAgICAgICBwaW4KICAgICAgICAgICAgICAgIHN0ZXA9IjEiCiAgICAgICAgICAgICAgICB2YWx1ZT0ie3tfY29udHJhc3RQZXJjZW50YWdlfX0iCiAgICAgICAgICAgICAgICBpbW1lZGlhdGUtdmFsdWU9Int7X2NvbnRyYXN0UGVyY2VudGFnZX19IgogICAgICAgICAgICAgID48L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgICBjbGFzcz0ieC1idXR0b24iCiAgICAgICAgICAgICAgICBvbi10YXA9Il9yZXNldENvbnRyYXN0IgogICAgICAgICAgICAgICAgZGlzYWJsZWQ9IltbX2NvbnRyYXN0SXNEZWZhdWx0XV0iCiAgICAgICAgICAgICAgICA+UmVzZXQ8L3BhcGVyLWJ1dHRvbgogICAgICAgICAgICAgID4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24gcnVucy1zZWxlY3RvciI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvcgogICAgICAgICAgICBpZD0icnVucy1zZWxlY3RvciIKICAgICAgICAgICAgc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iCiAgICAgICAgICA+PC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGltYWdlIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczo8L3A+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBpbWFnZSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIKICAgICAgICAgICAgICAgID5SRUFETUU8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiCiAgICAgICAgICAgICAgICA+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2EKICAgICAgICAgICAgICA+LgogICAgICAgICAgICA8L3A+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIgogICAgICAgICAgICAgICAgPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldwogICAgICAgICAgICAgIGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iCiAgICAgICAgICAgICAgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtaW1hZ2UtbG9hZGVyCiAgICAgICAgICAgICAgICAgIGFjdGl2ZT0iW1thY3RpdmVdXSIKICAgICAgICAgICAgICAgICAgcnVuPSJbW2l0ZW0ucnVuXV0iCiAgICAgICAgICAgICAgICAgIHRhZz0iW1tpdGVtLnRhZ11dIgogICAgICAgICAgICAgICAgICBzYW1wbGU9IltbaXRlbS5zYW1wbGVdXSIKICAgICAgICAgICAgICAgICAgb2Ytc2FtcGxlcz0iW1tpdGVtLm9mU2FtcGxlc11dIgogICAgICAgICAgICAgICAgICB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVuLCBpdGVtLnRhZyldXSIKICAgICAgICAgICAgICAgICAgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIgogICAgICAgICAgICAgICAgICBhY3R1YWwtc2l6ZT0iW1tfYWN0dWFsU2l6ZV1dIgogICAgICAgICAgICAgICAgICBicmlnaHRuZXNzLWFkanVzdG1lbnQ9IltbX2JyaWdodG5lc3NBZGp1c3RtZW50XV0iCiAgICAgICAgICAgICAgICAgIGNvbnRyYXN0LXBlcmNlbnRhZ2U9IltbX2NvbnRyYXN0UGVyY2VudGFnZV1dIgogICAgICAgICAgICAgICAgPjwvdGYtaW1hZ2UtbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLnJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAucmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIHBhcGVyLXNsaWRlciB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICAgIC5yZXNldHRhYmxlLXNsaWRlci1jb250YWluZXIgcGFwZXItYnV0dG9uIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgLnJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciBwYXBlci1idXR0b25bZGlzYWJsZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB1bnNldDsKICAgICAgfQogICAgICAueC1idXR0b24gewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgIH0KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgICAgcGFwZXItc2xpZGVyIHsKICAgICAgICAtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1tYXJrZXJzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLElLdC5wcm90b3R5cGUsInJlbG9hZE9uUmVhZHkiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLElLdC5wcm90b3R5cGUsIl9zZWxlY3RlZFJ1bnMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sSUt0LnByb3RvdHlwZSwiX3J1blRvVGFnSW5mbyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLElLdC5wcm90b3R5cGUsIl9kYXRhTm90Rm91bmQiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxJS3QucHJvdG90eXBlLCJfYWN0dWFsU2l6ZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxJS3QucHJvdG90eXBlLCJfZGVmYXVsdEJyaWdodG5lc3NBZGp1c3RtZW50Iix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLElLdC5wcm90b3R5cGUsIl9kZWZhdWx0Q29udHJhc3RQZXJjZW50YWdlIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLElLdC5wcm90b3R5cGUsIl9icmlnaHRuZXNzQWRqdXN0bWVudCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxJS3QucHJvdG90eXBlLCJfY29udHJhc3RQZXJjZW50YWdlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLElLdC5wcm90b3R5cGUsIl90YWdGaWx0ZXIiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxJS3QucHJvdG90eXBlLCJfY2F0ZWdvcmllc0RvbVJlYWR5Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLElLdC5wcm90b3R5cGUsIl9yZXF1ZXN0TWFuYWdlciIsdm9pZCAwKSx0KFtzKCJfYnJpZ2h0bmVzc0FkanVzdG1lbnQiKSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sSUt0LnByb3RvdHlwZSwiX2JyaWdodG5lc3NJc0RlZmF1bHQiLG51bGwpLHQoW3MoIl9jb250cmFzdFBlcmNlbnRhZ2UiKSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sSUt0LnByb3RvdHlwZSwiX2NvbnRyYXN0SXNEZWZhdWx0IixudWxsKSx0KFtzKCJfcnVuVG9UYWdJbmZvIiwiX3NlbGVjdGVkUnVucyIsIl90YWdGaWx0ZXIiLCJfY2F0ZWdvcmllc0RvbVJlYWR5IiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxJS3QucHJvdG90eXBlLCJfY2F0ZWdvcmllcyIsbnVsbCksSUt0PXQoW2koInRmLWltYWdlLWRhc2hib2FyZCIpXSxJS3QpLChmdW5jdGlvbih0KXt0W3QuQ0FOQ0VMTEVEPTFdPSJDQU5DRUxMRUQifSkoUkt0fHwoUkt0PXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5WRVJURVg9MV09IlZFUlRFWCIsdFt0LkZBQ0U9Ml09IkZBQ0UiLHRbdC5DT0xPUj0zXT0iQ09MT1IifSkoT0t0fHwoT0t0PXt9KSksKGZ1bmN0aW9uKHQpe3QuVkVSVEVYPSJmbG9hdDMyIix0LkZBQ0U9ImludDMyIix0LkNPTE9SPSJ1aW50OCJ9KSh6S3R8fCh6S3Q9e30pKTtjbGFzcyBES3R7Y29uc3RydWN0b3IodCl7dGhpcy5fY2FuY2VsbGVyPW5ldyBYUix0aGlzLl9yZXF1ZXN0TWFuYWdlcj10fXJlbG9hZCh0LGUsbil7cmV0dXJuIHRoaXMuX2NhbmNlbGxlci5jYW5jZWxBbGwoKSx0aGlzLl9mZXRjaE1ldGFkYXRhKHQsZSxuKX1fZmV0Y2hEYXRhQnlTdGVwKHQsZSxuLGkscixvKXtjb25zdCBhPV9yKCkucGx1Z2luUm91dGUoIm1lc2giLCIvZGF0YSIsbmV3IFVSTFNlYXJjaFBhcmFtcyh7dGFnOmUscnVuOnQsY29udGVudF90eXBlOm4sc2FtcGxlOlN0cmluZyhpKSxzdGVwOlN0cmluZyhyKX0pKSxzPWZ1bmN0aW9uKHQpe2xldCBlPVtdO2ZvcihsZXQgbj0wO248dC5sZW5ndGgvMztuKyspe2xldCBpPVtdO2ZvcihsZXQgZT0wO2U8MztlKyspaS5wdXNoKHRbMypuK2VdKTtlLnB1c2goaSl9cmV0dXJuIGV9LGw9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKCh0PT57aWYodC5jYW5jZWxsZWQpcmV0dXJuIFByb21pc2UucmVqZWN0KHtjb2RlOlJLdC5DQU5DRUxMRUQsbWVzc2FnZToiUmVzcG9uc2Ugd2FzIGludmFsaWRhdGVkLiJ9KTtsZXQgZT10LnZhbHVlO3N3aXRjaChuKXtjYXNlIlZFUlRFWCI6by52ZXJ0aWNlcz1zKG5ldyBGbG9hdDMyQXJyYXkoZSkpO2JyZWFrO2Nhc2UiRkFDRSI6by5mYWNlcz1zKG5ldyBJbnQzMkFycmF5KGUpKTticmVhaztjYXNlIkNPTE9SIjpvLmNvbG9ycz1zKG5ldyBVaW50OEFycmF5KGUpKX1yZXR1cm4gb30pKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIuZmV0Y2goYSx7bWV0aG9kOiJHRVQiLGhlYWRlcnM6e3Jlc3BvbnNlVHlwZToiYXJyYXlidWZmZXIiLGNvbnRlbnRUeXBlOnpLdFtuXX19KS50aGVuKCh0PT50LmFycmF5QnVmZmVyKCkpKS50aGVuKGwpfWZldGNoRGF0YSh0LGUsbixpKXtsZXQgcj1bXSxvPW5ldyBNYXA7cmV0dXJuIE9iamVjdC5rZXlzKE9LdCkuZm9yRWFjaCgoYT0+e3QuY29tcG9uZW50cyYxPDxPS3RbYV0mJnIucHVzaCh0aGlzLl9mZXRjaERhdGFCeVN0ZXAoZSxuLGEsaSx0LnN0ZXAsbykpfSkpLFByb21pc2UuYWxsKHIpfV9mZXRjaE1ldGFkYXRhKHQsZSxuKXt0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7Y29uc3QgaT1fcigpLnBsdWdpblJvdXRlKCJtZXNoIiwiL21lc2hlcyIsbmV3IFVSTFNlYXJjaFBhcmFtcyh7dGFnOmUscnVuOnQsc2FtcGxlOm59KSkscj10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoKHQ9PnQuY2FuY2VsbGVkP1Byb21pc2UucmVqZWN0KHtjb2RlOlJLdC5DQU5DRUxMRUQsbWVzc2FnZToiUmVzcG9uc2Ugd2FzIGludmFsaWRhdGVkLiJ9KTp0LnZhbHVlKSk7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLmZldGNoKGkpLnRoZW4oKHQ9PnQuanNvbigpKSkudGhlbihyKS50aGVuKHRoaXMuX3Byb2Nlc3NNZXRhZGF0YS5iaW5kKHRoaXMpKX1fcHJvY2Vzc01ldGFkYXRhKHQpe2lmKCF0KXJldHVybjtjb25zdCBlPW5ldyBNYXA7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2xldCBpPXRbbl07ZS5oYXMoaS5zdGVwKXx8ZS5zZXQoaS5zdGVwLFtdKSxlLmdldChpLnN0ZXApLnB1c2goaSl9bGV0IG49W107cmV0dXJuIGUuZm9yRWFjaCgodD0+e2xldCBlPXRoaXMuX2NyZWF0ZVN0ZXBEYXR1bSh0WzBdKTtuLnB1c2goZSl9KSksbn1fY3JlYXRlU3RlcERhdHVtKHQpe3JldHVybnt3YWxsX3RpbWU6bmV3IERhdGUoMWUzKnQud2FsbF90aW1lKSxzdGVwOnQuc3RlcCxjb25maWc6dC5jb25maWcsY29udGVudF90eXBlOnQuY29udGVudF90eXBlLGNvbXBvbmVudHM6dC5jb21wb25lbnRzfX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAyMDEwLTIwMjEgVGhyZWUuanMgQXV0aG9ycwogICAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAogICAgICovY29uc3QgQkt0PSIxMzEiLEhLdD17TEVGVDowLE1JRERMRToxLFJJR0hUOjIsUk9UQVRFOjAsRE9MTFk6MSxQQU46Mn0sRkt0PXtST1RBVEU6MCxQQU46MSxET0xMWV9QQU46MixET0xMWV9ST1RBVEU6M30sVkt0PTEwMCxVS3Q9MzAwLGpLdD0zMDEsR0t0PTMwMixXS3Q9MzAzLHFLdD0zMDQsWUt0PTMwNixYS3Q9MzA3LCRLdD0xZTMsS0t0PTEwMDEsWkt0PTEwMDIsSkt0PTEwMDMsUUt0PTEwMDQsdFp0PTEwMDUsZVp0PTEwMDYsblp0PTEwMDcsaVp0PTEwMDgsclp0PTEwMDksb1p0PTEwMTIsYVp0PTEwMTQsc1p0PTEwMTUsbFp0PTEwMTYsY1p0PTEwMjAsdVp0PTEwMjIsaFp0PTEwMjMsZFp0PTEwMjYscFp0PTEwMjcsZlp0PTMzNzc2LG1adD0zMzc3NyxnWnQ9MzM3NzgsX1p0PTMzNzc5LHladD0zNTg0MCx2WnQ9MzU4NDEsYlp0PTM1ODQyLHhadD0zNTg0Myx3WnQ9Mzc0OTIsU1p0PTM3NDk2LE1adD0yMzAwLEVadD0yMzAxLFRadD0yMzAyLENadD0yNDAwLEFadD0yNDAxLGtadD0yNDAyLExadD0yNTAwLFBadD0yNTAxLE5adD0zZTMsSVp0PTMwMDEsUlp0PTMwMDcsT1p0PTMwMDIselp0PTMwMDQsRFp0PTMwMDUsQlp0PTMwMDYsSFp0PTc2ODAsRlp0PTM1MDQ0LFZadD0zNTA0OCxVWnQ9IjMwMCBlcyI7Y2xhc3Mgalp0e2FkZEV2ZW50TGlzdGVuZXIodCxlKXt2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMmJih0aGlzLl9saXN0ZW5lcnM9e30pO2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzO3ZvaWQgMD09PW5bdF0mJihuW3RdPVtdKSwtMT09PW5bdF0uaW5kZXhPZihlKSYmblt0XS5wdXNoKGUpfWhhc0V2ZW50TGlzdGVuZXIodCxlKXtpZih2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMpcmV0dXJuITE7Y29uc3Qgbj10aGlzLl9saXN0ZW5lcnM7cmV0dXJuIHZvaWQgMCE9PW5bdF0mJi0xIT09blt0XS5pbmRleE9mKGUpfXJlbW92ZUV2ZW50TGlzdGVuZXIodCxlKXtpZih2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMpcmV0dXJuO2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzW3RdO2lmKHZvaWQgMCE9PW4pe2NvbnN0IHQ9bi5pbmRleE9mKGUpOy0xIT09dCYmbi5zcGxpY2UodCwxKX19ZGlzcGF0Y2hFdmVudCh0KXtpZih2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMpcmV0dXJuO2NvbnN0IGU9dGhpcy5fbGlzdGVuZXJzW3QudHlwZV07aWYodm9pZCAwIT09ZSl7dC50YXJnZXQ9dGhpcztjb25zdCBuPWUuc2xpY2UoMCk7Zm9yKGxldCBlPTAsaT1uLmxlbmd0aDtlPGk7ZSsrKW5bZV0uY2FsbCh0aGlzLHQpO3QudGFyZ2V0PW51bGx9fX1jb25zdCBHWnQ9W107Zm9yKGxldCB0PTA7dDwyNTY7dCsrKUdadFt0XT0odDwxNj8iMCI6IiIpK3QudG9TdHJpbmcoMTYpO2xldCBXWnQ9MTIzNDU2Nztjb25zdCBxWnQ9TWF0aC5QSS8xODAsWVp0PTE4MC9NYXRoLlBJO2Z1bmN0aW9uIFhadCgpe2NvbnN0IHQ9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAsZT00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxuPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLGk9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDA7cmV0dXJuKEdadFsyNTUmdF0rR1p0W3Q+PjgmMjU1XStHWnRbdD4+MTYmMjU1XStHWnRbdD4+MjQmMjU1XSsiLSIrR1p0WzI1NSZlXStHWnRbZT4+OCYyNTVdKyItIitHWnRbZT4+MTYmMTV8NjRdK0dadFtlPj4yNCYyNTVdKyItIitHWnRbNjMmbnwxMjhdK0dadFtuPj44JjI1NV0rIi0iK0dadFtuPj4xNiYyNTVdK0dadFtuPj4yNCYyNTVdK0dadFsyNTUmaV0rR1p0W2k+PjgmMjU1XStHWnRbaT4+MTYmMjU1XStHWnRbaT4+MjQmMjU1XSkudG9VcHBlckNhc2UoKX1mdW5jdGlvbiAkWnQodCxlLG4pe3JldHVybiBNYXRoLm1heChlLE1hdGgubWluKG4sdCkpfWZ1bmN0aW9uIEtadCh0LGUpe3JldHVybih0JWUrZSklZX1mdW5jdGlvbiBaWnQodCxlLG4pe3JldHVybigxLW4pKnQrbiplfWZ1bmN0aW9uIEpadCh0KXtyZXR1cm4gMD09KHQmdC0xKSYmMCE9PXR9ZnVuY3Rpb24gUVp0KHQpe3JldHVybiBNYXRoLnBvdygyLE1hdGguY2VpbChNYXRoLmxvZyh0KS9NYXRoLkxOMikpfWZ1bmN0aW9uIHRKdCh0KXtyZXR1cm4gTWF0aC5wb3coMixNYXRoLmZsb29yKE1hdGgubG9nKHQpL01hdGguTE4yKSl9dmFyIGVKdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxERUcyUkFEOnFadCxSQUQyREVHOlladCxnZW5lcmF0ZVVVSUQ6WFp0LGNsYW1wOiRadCxldWNsaWRlYW5Nb2R1bG86S1p0LG1hcExpbmVhcjpmdW5jdGlvbiBuSnQodCxlLG4saSxyKXtyZXR1cm4gaSsodC1lKSooci1pKS8obi1lKX0saW52ZXJzZUxlcnA6ZnVuY3Rpb24gaUp0KHQsZSxuKXtyZXR1cm4gdCE9PWU/KG4tdCkvKGUtdCk6MH0sbGVycDpaWnQsZGFtcDpmdW5jdGlvbiBySnQodCxlLG4saSl7cmV0dXJuIFpadCh0LGUsMS1NYXRoLmV4cCgtbippKSl9LHBpbmdwb25nOmZ1bmN0aW9uIG9KdCh0LGU9MSl7cmV0dXJuIGUtTWF0aC5hYnMoS1p0KHQsMiplKS1lKX0sc21vb3Roc3RlcDpmdW5jdGlvbiBhSnQodCxlLG4pe3JldHVybiB0PD1lPzA6dD49bj8xOih0PSh0LWUpLyhuLWUpKSp0KigzLTIqdCl9LHNtb290aGVyc3RlcDpmdW5jdGlvbiBzSnQodCxlLG4pe3JldHVybiB0PD1lPzA6dD49bj8xOih0PSh0LWUpLyhuLWUpKSp0KnQqKHQqKDYqdC0xNSkrMTApfSxyYW5kSW50OmZ1bmN0aW9uIGxKdCh0LGUpe3JldHVybiB0K01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSooZS10KzEpKX0scmFuZEZsb2F0OmZ1bmN0aW9uIGNKdCh0LGUpe3JldHVybiB0K01hdGgucmFuZG9tKCkqKGUtdCl9LHJhbmRGbG9hdFNwcmVhZDpmdW5jdGlvbiB1SnQodCl7cmV0dXJuIHQqKC41LU1hdGgucmFuZG9tKCkpfSxzZWVkZWRSYW5kb206ZnVuY3Rpb24gaEp0KHQpe3JldHVybiB2b2lkIDAhPT10JiYoV1p0PXQlMjE0NzQ4MzY0NyksV1p0PTE2ODA3KldadCUyMTQ3NDgzNjQ3LChXWnQtMSkvMjE0NzQ4MzY0Nn0sZGVnVG9SYWQ6ZnVuY3Rpb24gZEp0KHQpe3JldHVybiB0KnFadH0scmFkVG9EZWc6ZnVuY3Rpb24gcEp0KHQpe3JldHVybiB0KlladH0saXNQb3dlck9mVHdvOkpadCxjZWlsUG93ZXJPZlR3bzpRWnQsZmxvb3JQb3dlck9mVHdvOnRKdCxzZXRRdWF0ZXJuaW9uRnJvbVByb3BlckV1bGVyOmZ1bmN0aW9uIGZKdCh0LGUsbixpLHIpe2NvbnN0IG89TWF0aC5jb3MsYT1NYXRoLnNpbixzPW8obi8yKSxsPWEobi8yKSxjPW8oKGUraSkvMiksdT1hKChlK2kpLzIpLGg9bygoZS1pKS8yKSxkPWEoKGUtaSkvMikscD1vKChpLWUpLzIpLGY9YSgoaS1lKS8yKTtzd2l0Y2gocil7Y2FzZSJYWVgiOnQuc2V0KHMqdSxsKmgsbCpkLHMqYyk7YnJlYWs7Y2FzZSJZWlkiOnQuc2V0KGwqZCxzKnUsbCpoLHMqYyk7YnJlYWs7Y2FzZSJaWFoiOnQuc2V0KGwqaCxsKmQscyp1LHMqYyk7YnJlYWs7Y2FzZSJYWlgiOnQuc2V0KHMqdSxsKmYsbCpwLHMqYyk7YnJlYWs7Y2FzZSJZWFkiOnQuc2V0KGwqcCxzKnUsbCpmLHMqYyk7YnJlYWs7Y2FzZSJaWVoiOnQuc2V0KGwqZixsKnAscyp1LHMqYyk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLk1hdGhVdGlsczogLnNldFF1YXRlcm5pb25Gcm9tUHJvcGVyRXVsZXIoKSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIG9yZGVyOiAiK3IpfX19KTtjbGFzcyBtSnR7Y29uc3RydWN0b3IodD0wLGU9MCl7dGhpcy54PXQsdGhpcy55PWV9Z2V0IHdpZHRoKCl7cmV0dXJuIHRoaXMueH1zZXQgd2lkdGgodCl7dGhpcy54PXR9Z2V0IGhlaWdodCgpe3JldHVybiB0aGlzLnl9c2V0IGhlaWdodCh0KXt0aGlzLnk9dH1zZXQodCxlKXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PWUsdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMueD10LHRoaXMueT10LHRoaXN9c2V0WCh0KXtyZXR1cm4gdGhpcy54PXQsdGhpc31zZXRZKHQpe3JldHVybiB0aGlzLnk9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9cmV0dXJuIHRoaXN9Z2V0Q29tcG9uZW50KHQpe3N3aXRjaCh0KXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpc31hZGQodCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5hZGRWZWN0b3JzKHQsZSkpOih0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzKX1hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzfXN1Yih0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLnN1YlZlY3RvcnModCxlKSk6KHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXMpfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnksaT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9aVswXSplK2lbM10qbitpWzZdLHRoaXMueT1pWzFdKmUraVs0XSpuK2lbN10sdGhpc31taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodC54LE1hdGgubWluKGUueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodC55LE1hdGgubWluKGUueSx0aGlzLnkpKSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnkpKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heCh0LE1hdGgubWluKGUsbikpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9dGhpcy54PDA/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT10aGlzLnk8MD9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueX1jcm9zcyh0KXtyZXR1cm4gdGhpcy54KnQueS10aGlzLnkqdC54fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueX1sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9YW5nbGUoKXtyZXR1cm4gTWF0aC5hdGFuMigtdGhpcy55LC10aGlzLngpK01hdGguUEl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnk7cmV0dXJuIGUqZStuKm59bWFuaGF0dGFuRGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5hYnModGhpcy54LXQueCkrTWF0aC5hYnModGhpcy55LXQueSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlLG4pe3JldHVybiB2b2lkIDAhPT1uJiZjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKSx0aGlzLng9dC5nZXRYKGUpLHRoaXMueT10LmdldFkoZSksdGhpc31yb3RhdGVBcm91bmQodCxlKXtjb25zdCBuPU1hdGguY29zKGUpLGk9TWF0aC5zaW4oZSkscj10aGlzLngtdC54LG89dGhpcy55LXQueTtyZXR1cm4gdGhpcy54PXIqbi1vKmkrdC54LHRoaXMueT1yKmkrbypuK3QueSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzfX1tSnQucHJvdG90eXBlLmlzVmVjdG9yMj0hMDtjbGFzcyBnSnR7Y29uc3RydWN0b3IoKXt0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDEsMCwwLDAsMV0sYXJndW1lbnRzLmxlbmd0aD4wJiZjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXgzOiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLiIpfXNldCh0LGUsbixpLHIsbyxhLHMsbCl7Y29uc3QgYz10aGlzLmVsZW1lbnRzO3JldHVybiBjWzBdPXQsY1sxXT1pLGNbMl09YSxjWzNdPWUsY1s0XT1yLGNbNV09cyxjWzZdPW4sY1s3XT1vLGNbOF09bCx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMSwwLDAsMCwxKSx0aGlzfWNvcHkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVswXT1uWzBdLGVbMV09blsxXSxlWzJdPW5bMl0sZVszXT1uWzNdLGVbNF09bls0XSxlWzVdPW5bNV0sZVs2XT1uWzZdLGVbN109bls3XSxlWzhdPW5bOF0sdGhpc31leHRyYWN0QmFzaXModCxlLG4pe3JldHVybiB0LnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMCksZS5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDEpLG4uc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywyKSx0aGlzfXNldEZyb21NYXRyaXg0KHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5zZXQoZVswXSxlWzRdLGVbOF0sZVsxXSxlWzVdLGVbOV0sZVsyXSxlWzZdLGVbMTBdKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHQsdGhpcyl9bXVsdGlwbHlNYXRyaWNlcyh0LGUpe2NvbnN0IG49dC5lbGVtZW50cyxpPWUuZWxlbWVudHMscj10aGlzLmVsZW1lbnRzLG89blswXSxhPW5bM10scz1uWzZdLGw9blsxXSxjPW5bNF0sdT1uWzddLGg9blsyXSxkPW5bNV0scD1uWzhdLGY9aVswXSxtPWlbM10sZz1pWzZdLF89aVsxXSx5PWlbNF0sdj1pWzddLGI9aVsyXSx4PWlbNV0sdz1pWzhdO3JldHVybiByWzBdPW8qZithKl8rcypiLHJbM109byptK2EqeStzKngscls2XT1vKmcrYSp2K3MqdyxyWzFdPWwqZitjKl8rdSpiLHJbNF09bCptK2MqeSt1Kngscls3XT1sKmcrYyp2K3UqdyxyWzJdPWgqZitkKl8rcCpiLHJbNV09aCptK2QqeStwKngscls4XT1oKmcrZCp2K3Aqdyx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gZVswXSo9dCxlWzNdKj10LGVbNl0qPXQsZVsxXSo9dCxlWzRdKj10LGVbN10qPXQsZVsyXSo9dCxlWzVdKj10LGVbOF0qPXQsdGhpc31kZXRlcm1pbmFudCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLGk9dFsyXSxyPXRbM10sbz10WzRdLGE9dFs1XSxzPXRbNl0sbD10WzddLGM9dFs4XTtyZXR1cm4gZSpvKmMtZSphKmwtbipyKmMrbiphKnMraSpyKmwtaSpvKnN9aW52ZXJ0KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbMV0saT10WzJdLHI9dFszXSxvPXRbNF0sYT10WzVdLHM9dFs2XSxsPXRbN10sYz10WzhdLHU9YypvLWEqbCxoPWEqcy1jKnIsZD1sKnItbypzLHA9ZSp1K24qaCtpKmQ7aWYoMD09PXApcmV0dXJuIHRoaXMuc2V0KDAsMCwwLDAsMCwwLDAsMCwwKTtjb25zdCBmPTEvcDtyZXR1cm4gdFswXT11KmYsdFsxXT0oaSpsLWMqbikqZix0WzJdPShhKm4taSpvKSpmLHRbM109aCpmLHRbNF09KGMqZS1pKnMpKmYsdFs1XT0oaSpyLWEqZSkqZix0WzZdPWQqZix0WzddPShuKnMtbCplKSpmLHRbOF09KG8qZS1uKnIpKmYsdGhpc310cmFuc3Bvc2UoKXtsZXQgdDtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQ9ZVsxXSxlWzFdPWVbM10sZVszXT10LHQ9ZVsyXSxlWzJdPWVbNl0sZVs2XT10LHQ9ZVs1XSxlWzVdPWVbN10sZVs3XT10LHRoaXN9Z2V0Tm9ybWFsTWF0cml4KHQpe3JldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KHQpLmludmVydCgpLnRyYW5zcG9zZSgpfXRyYW5zcG9zZUludG9BcnJheSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbM10sdFsyXT1lWzZdLHRbM109ZVsxXSx0WzRdPWVbNF0sdFs1XT1lWzddLHRbNl09ZVsyXSx0WzddPWVbNV0sdFs4XT1lWzhdLHRoaXN9c2V0VXZUcmFuc2Zvcm0odCxlLG4saSxyLG8sYSl7Y29uc3Qgcz1NYXRoLmNvcyhyKSxsPU1hdGguc2luKHIpO3JldHVybiB0aGlzLnNldChuKnMsbipsLC1uKihzKm8rbCphKStvK3QsLWkqbCxpKnMsLWkqKC1sKm8rcyphKSthK2UsMCwwLDEpLHRoaXN9c2NhbGUodCxlKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIG5bMF0qPXQsblszXSo9dCxuWzZdKj10LG5bMV0qPWUsbls0XSo9ZSxuWzddKj1lLHRoaXN9cm90YXRlKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KSxpPXRoaXMuZWxlbWVudHMscj1pWzBdLG89aVszXSxhPWlbNl0scz1pWzFdLGw9aVs0XSxjPWlbN107cmV0dXJuIGlbMF09ZSpyK24qcyxpWzNdPWUqbytuKmwsaVs2XT1lKmErbipjLGlbMV09LW4qcitlKnMsaVs0XT0tbipvK2UqbCxpWzddPS1uKmErZSpjLHRoaXN9dHJhbnNsYXRlKHQsZSl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO3JldHVybiBuWzBdKz10Km5bMl0sblszXSs9dCpuWzVdLG5bNl0rPXQqbls4XSxuWzFdKz1lKm5bMl0sbls0XSs9ZSpuWzVdLG5bN10rPWUqbls4XSx0aGlzfWVxdWFscyh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO2ZvcihsZXQgdD0wO3Q8OTt0KyspaWYoZVt0XSE9PW5bdF0pcmV0dXJuITE7cmV0dXJuITB9ZnJvbUFycmF5KHQsZT0wKXtmb3IobGV0IG49MDtuPDk7bisrKXRoaXMuZWxlbWVudHNbbl09dFtuK2VdO3JldHVybiB0aGlzfXRvQXJyYXkodD1bXSxlPTApe2NvbnN0IG49dGhpcy5lbGVtZW50cztyZXR1cm4gdFtlXT1uWzBdLHRbZSsxXT1uWzFdLHRbZSsyXT1uWzJdLHRbZSszXT1uWzNdLHRbZSs0XT1uWzRdLHRbZSs1XT1uWzVdLHRbZSs2XT1uWzZdLHRbZSs3XT1uWzddLHRbZSs4XT1uWzhdLHR9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmZyb21BcnJheSh0aGlzLmVsZW1lbnRzKX19bGV0IF9KdDtnSnQucHJvdG90eXBlLmlzTWF0cml4Mz0hMDtjbGFzcyB5SnR7c3RhdGljIGdldERhdGFVUkwodCl7aWYoL15kYXRhOi9pLnRlc3QodC5zcmMpKXJldHVybiB0LnNyYztpZigidW5kZWZpbmVkIj09dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50KXJldHVybiB0LnNyYztsZXQgZTtpZih0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpZT10O2Vsc2V7dm9pZCAwPT09X0p0JiYoX0p0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsImNhbnZhcyIpKSxfSnQud2lkdGg9dC53aWR0aCxfSnQuaGVpZ2h0PXQuaGVpZ2h0O2NvbnN0IG49X0p0LmdldENvbnRleHQoIjJkIik7dCBpbnN0YW5jZW9mIEltYWdlRGF0YT9uLnB1dEltYWdlRGF0YSh0LDAsMCk6bi5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCksZT1fSnR9cmV0dXJuIGUud2lkdGg+MjA0OHx8ZS5oZWlnaHQ+MjA0OD8oY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLmdldERhdGFVUkw6IEltYWdlIGNvbnZlcnRlZCB0byBqcGcgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMiLHQpLGUudG9EYXRhVVJMKCJpbWFnZS9qcGVnIiwuNikpOmUudG9EYXRhVVJMKCJpbWFnZS9wbmciKX19bGV0IHZKdD0wO2NsYXNzIGJKdCBleHRlbmRzIGpadHtjb25zdHJ1Y3Rvcih0PWJKdC5ERUZBVUxUX0lNQUdFLGU9Ykp0LkRFRkFVTFRfTUFQUElORyxuPTEwMDEsaT0xMDAxLHI9MTAwNixvPTEwMDgsYT0xMDIzLHM9MTAwOSxsPTEsYz0zZTMpe3N1cGVyKCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6dkp0Kyt9KSx0aGlzLnV1aWQ9WFp0KCksdGhpcy5uYW1lPSIiLHRoaXMuaW1hZ2U9dCx0aGlzLm1pcG1hcHM9W10sdGhpcy5tYXBwaW5nPWUsdGhpcy53cmFwUz1uLHRoaXMud3JhcFQ9aSx0aGlzLm1hZ0ZpbHRlcj1yLHRoaXMubWluRmlsdGVyPW8sdGhpcy5hbmlzb3Ryb3B5PWwsdGhpcy5mb3JtYXQ9YSx0aGlzLmludGVybmFsRm9ybWF0PW51bGwsdGhpcy50eXBlPXMsdGhpcy5vZmZzZXQ9bmV3IG1KdCgwLDApLHRoaXMucmVwZWF0PW5ldyBtSnQoMSwxKSx0aGlzLmNlbnRlcj1uZXcgbUp0KDAsMCksdGhpcy5yb3RhdGlvbj0wLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMCx0aGlzLm1hdHJpeD1uZXcgZ0p0LHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSEwLHRoaXMucHJlbXVsdGlwbHlBbHBoYT0hMSx0aGlzLmZsaXBZPSEwLHRoaXMudW5wYWNrQWxpZ25tZW50PTQsdGhpcy5lbmNvZGluZz1jLHRoaXMudmVyc2lvbj0wLHRoaXMub25VcGRhdGU9bnVsbCx0aGlzLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMX11cGRhdGVNYXRyaXgoKXt0aGlzLm1hdHJpeC5zZXRVdlRyYW5zZm9ybSh0aGlzLm9mZnNldC54LHRoaXMub2Zmc2V0LnksdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55LHRoaXMucm90YXRpb24sdGhpcy5jZW50ZXIueCx0aGlzLmNlbnRlci55KX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLm5hbWU9dC5uYW1lLHRoaXMuaW1hZ2U9dC5pbWFnZSx0aGlzLm1pcG1hcHM9dC5taXBtYXBzLnNsaWNlKDApLHRoaXMubWFwcGluZz10Lm1hcHBpbmcsdGhpcy53cmFwUz10LndyYXBTLHRoaXMud3JhcFQ9dC53cmFwVCx0aGlzLm1hZ0ZpbHRlcj10Lm1hZ0ZpbHRlcix0aGlzLm1pbkZpbHRlcj10Lm1pbkZpbHRlcix0aGlzLmFuaXNvdHJvcHk9dC5hbmlzb3Ryb3B5LHRoaXMuZm9ybWF0PXQuZm9ybWF0LHRoaXMuaW50ZXJuYWxGb3JtYXQ9dC5pbnRlcm5hbEZvcm1hdCx0aGlzLnR5cGU9dC50eXBlLHRoaXMub2Zmc2V0LmNvcHkodC5vZmZzZXQpLHRoaXMucmVwZWF0LmNvcHkodC5yZXBlYXQpLHRoaXMuY2VudGVyLmNvcHkodC5jZW50ZXIpLHRoaXMucm90YXRpb249dC5yb3RhdGlvbix0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlLHRoaXMubWF0cml4LmNvcHkodC5tYXRyaXgpLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPXQuZ2VuZXJhdGVNaXBtYXBzLHRoaXMucHJlbXVsdGlwbHlBbHBoYT10LnByZW11bHRpcGx5QWxwaGEsdGhpcy5mbGlwWT10LmZsaXBZLHRoaXMudW5wYWNrQWxpZ25tZW50PXQudW5wYWNrQWxpZ25tZW50LHRoaXMuZW5jb2Rpbmc9dC5lbmNvZGluZyx0aGlzfXRvSlNPTih0KXtjb25zdCBlPXZvaWQgMD09PXR8fCJzdHJpbmciPT10eXBlb2YgdDtpZighZSYmdm9pZCAwIT09dC50ZXh0dXJlc1t0aGlzLnV1aWRdKXJldHVybiB0LnRleHR1cmVzW3RoaXMudXVpZF07Y29uc3Qgbj17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6IlRleHR1cmUiLGdlbmVyYXRvcjoiVGV4dHVyZS50b0pTT04ifSx1dWlkOnRoaXMudXVpZCxuYW1lOnRoaXMubmFtZSxtYXBwaW5nOnRoaXMubWFwcGluZyxyZXBlYXQ6W3RoaXMucmVwZWF0LngsdGhpcy5yZXBlYXQueV0sb2Zmc2V0Olt0aGlzLm9mZnNldC54LHRoaXMub2Zmc2V0LnldLGNlbnRlcjpbdGhpcy5jZW50ZXIueCx0aGlzLmNlbnRlci55XSxyb3RhdGlvbjp0aGlzLnJvdGF0aW9uLHdyYXA6W3RoaXMud3JhcFMsdGhpcy53cmFwVF0sZm9ybWF0OnRoaXMuZm9ybWF0LHR5cGU6dGhpcy50eXBlLGVuY29kaW5nOnRoaXMuZW5jb2RpbmcsbWluRmlsdGVyOnRoaXMubWluRmlsdGVyLG1hZ0ZpbHRlcjp0aGlzLm1hZ0ZpbHRlcixhbmlzb3Ryb3B5OnRoaXMuYW5pc290cm9weSxmbGlwWTp0aGlzLmZsaXBZLHByZW11bHRpcGx5QWxwaGE6dGhpcy5wcmVtdWx0aXBseUFscGhhLHVucGFja0FsaWdubWVudDp0aGlzLnVucGFja0FsaWdubWVudH07aWYodm9pZCAwIT09dGhpcy5pbWFnZSl7Y29uc3QgaT10aGlzLmltYWdlO2lmKHZvaWQgMD09PWkudXVpZCYmKGkudXVpZD1YWnQoKSksIWUmJnZvaWQgMD09PXQuaW1hZ2VzW2kudXVpZF0pe2xldCBlO2lmKEFycmF5LmlzQXJyYXkoaSkpe2U9W107Zm9yKGxldCB0PTAsbj1pLmxlbmd0aDt0PG47dCsrKWUucHVzaCh4SnQoaVt0XS5pc0RhdGFUZXh0dXJlP2lbdF0uaW1hZ2U6aVt0XSkpfWVsc2UgZT14SnQoaSk7dC5pbWFnZXNbaS51dWlkXT17dXVpZDppLnV1aWQsdXJsOmV9fW4uaW1hZ2U9aS51dWlkfXJldHVybiBlfHwodC50ZXh0dXJlc1t0aGlzLnV1aWRdPW4pLG59ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX10cmFuc2Zvcm1Vdih0KXtpZih0aGlzLm1hcHBpbmchPT1VS3QpcmV0dXJuIHQ7aWYodC5hcHBseU1hdHJpeDModGhpcy5tYXRyaXgpLHQueDwwfHx0Lng+MSlzd2l0Y2godGhpcy53cmFwUyl7Y2FzZSAkS3Q6dC54PXQueC1NYXRoLmZsb29yKHQueCk7YnJlYWs7Y2FzZSBLS3Q6dC54PXQueDwwPzA6MTticmVhaztjYXNlIFpLdDp0Lng9MT09PU1hdGguYWJzKE1hdGguZmxvb3IodC54KSUyKT9NYXRoLmNlaWwodC54KS10Lng6dC54LU1hdGguZmxvb3IodC54KX1pZih0Lnk8MHx8dC55PjEpc3dpdGNoKHRoaXMud3JhcFQpe2Nhc2UgJEt0OnQueT10LnktTWF0aC5mbG9vcih0LnkpO2JyZWFrO2Nhc2UgS0t0OnQueT10Lnk8MD8wOjE7YnJlYWs7Y2FzZSBaS3Q6dC55PTE9PT1NYXRoLmFicyhNYXRoLmZsb29yKHQueSklMik/TWF0aC5jZWlsKHQueSktdC55OnQueS1NYXRoLmZsb29yKHQueSl9cmV0dXJuIHRoaXMuZmxpcFkmJih0Lnk9MS10LnkpLHR9c2V0IG5lZWRzVXBkYXRlKHQpeyEwPT09dCYmdGhpcy52ZXJzaW9uKyt9fWZ1bmN0aW9uIHhKdCh0KXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHwidW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50JiZ0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fCJ1bmRlZmluZWQiIT10eXBlb2YgSW1hZ2VCaXRtYXAmJnQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcD95SnQuZ2V0RGF0YVVSTCh0KTp0LmRhdGE/e2RhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodC5kYXRhKSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodCx0eXBlOnQuZGF0YS5jb25zdHJ1Y3Rvci5uYW1lfTooY29uc29sZS53YXJuKCJUSFJFRS5UZXh0dXJlOiBVbmFibGUgdG8gc2VyaWFsaXplIFRleHR1cmUuIikse30pfWJKdC5ERUZBVUxUX0lNQUdFPXZvaWQgMCxiSnQuREVGQVVMVF9NQVBQSU5HPVVLdCxiSnQucHJvdG90eXBlLmlzVGV4dHVyZT0hMDtjbGFzcyB3SnR7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAsaT0xKXt0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzLnc9aX1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpcy56fXNldCB3aWR0aCh0KXt0aGlzLno9dH1nZXQgaGVpZ2h0KCl7cmV0dXJuIHRoaXMud31zZXQgaGVpZ2h0KHQpe3RoaXMudz10fXNldCh0LGUsbixpKXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PW4sdGhpcy53PWksdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMueD10LHRoaXMueT10LHRoaXMuej10LHRoaXMudz10LHRoaXN9c2V0WCh0KXtyZXR1cm4gdGhpcy54PXQsdGhpc31zZXRZKHQpe3JldHVybiB0aGlzLnk9dCx0aGlzfXNldFoodCl7cmV0dXJuIHRoaXMuej10LHRoaXN9c2V0Vyh0KXtyZXR1cm4gdGhpcy53PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztjYXNlIDI6dGhpcy56PWU7YnJlYWs7Y2FzZSAzOnRoaXMudz1lO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9cmV0dXJuIHRoaXN9Z2V0Q29tcG9uZW50KHQpe3N3aXRjaCh0KXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtjYXNlIDI6cmV0dXJuIHRoaXMuejtjYXNlIDM6cmV0dXJuIHRoaXMudztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55LHRoaXMueix0aGlzLncpfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzLno9dC56LHRoaXMudz12b2lkIDAhPT10Lnc/dC53OjEsdGhpc31hZGQodCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3I0OiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5hZGRWZWN0b3JzKHQsZSkpOih0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzLnorPXQueix0aGlzLncrPXQudyx0aGlzKX1hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXMudys9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpcy56PXQueitlLnosdGhpcy53PXQudytlLncsdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXMueis9dC56KmUsdGhpcy53Kz10LncqZSx0aGlzfXN1Yih0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLnN1YlZlY3RvcnModCxlKSk6KHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXMuei09dC56LHRoaXMudy09dC53LHRoaXMpfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzLnotPXQsdGhpcy53LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzLnc9dC53LWUudyx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzLnoqPXQueix0aGlzLncqPXQudyx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXMueio9dCx0aGlzLncqPXQsdGhpc31hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnksaT10aGlzLnoscj10aGlzLncsbz10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9b1swXSplK29bNF0qbitvWzhdKmkrb1sxMl0qcix0aGlzLnk9b1sxXSplK29bNV0qbitvWzldKmkrb1sxM10qcix0aGlzLno9b1syXSplK29bNl0qbitvWzEwXSppK29bMTRdKnIsdGhpcy53PW9bM10qZStvWzddKm4rb1sxMV0qaStvWzE1XSpyLHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9c2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb24odCl7dGhpcy53PTIqTWF0aC5hY29zKHQudyk7Y29uc3QgZT1NYXRoLnNxcnQoMS10LncqdC53KTtyZXR1cm4gZTwxZS00Pyh0aGlzLng9MSx0aGlzLnk9MCx0aGlzLno9MCk6KHRoaXMueD10LngvZSx0aGlzLnk9dC55L2UsdGhpcy56PXQuei9lKSx0aGlzfXNldEF4aXNBbmdsZUZyb21Sb3RhdGlvbk1hdHJpeCh0KXtsZXQgZSxuLGkscjtjb25zdCBvPS4wMSxhPS4xLHM9dC5lbGVtZW50cyxsPXNbMF0sYz1zWzRdLHU9c1s4XSxoPXNbMV0sZD1zWzVdLHA9c1s5XSxmPXNbMl0sbT1zWzZdLGc9c1sxMF07aWYoTWF0aC5hYnMoYy1oKTxvJiZNYXRoLmFicyh1LWYpPG8mJk1hdGguYWJzKHAtbSk8byl7aWYoTWF0aC5hYnMoYytoKTxhJiZNYXRoLmFicyh1K2YpPGEmJk1hdGguYWJzKHArbSk8YSYmTWF0aC5hYnMobCtkK2ctMyk8YSlyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCksdGhpcztlPU1hdGguUEk7Y29uc3QgdD0obCsxKS8yLHM9KGQrMSkvMixfPShnKzEpLzIseT0oYytoKS80LHY9KHUrZikvNCxiPShwK20pLzQ7cmV0dXJuIHQ+cyYmdD5fP3Q8bz8obj0wLGk9LjcwNzEwNjc4MSxyPS43MDcxMDY3ODEpOihuPU1hdGguc3FydCh0KSxpPXkvbixyPXYvbik6cz5fP3M8bz8obj0uNzA3MTA2NzgxLGk9MCxyPS43MDcxMDY3ODEpOihpPU1hdGguc3FydChzKSxuPXkvaSxyPWIvaSk6XzxvPyhuPS43MDcxMDY3ODEsaT0uNzA3MTA2NzgxLHI9MCk6KHI9TWF0aC5zcXJ0KF8pLG49di9yLGk9Yi9yKSx0aGlzLnNldChuLGkscixlKSx0aGlzfWxldCBfPU1hdGguc3FydCgobS1wKSoobS1wKSsodS1mKSoodS1mKSsoaC1jKSooaC1jKSk7cmV0dXJuIE1hdGguYWJzKF8pPC4wMDEmJihfPTEpLHRoaXMueD0obS1wKS9fLHRoaXMueT0odS1mKS9fLHRoaXMuej0oaC1jKS9fLHRoaXMudz1NYXRoLmFjb3MoKGwrZCtnLTEpLzIpLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5taW4odGhpcy53LHQudyksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpcy56PU1hdGgubWF4KHRoaXMueix0LnopLHRoaXMudz1NYXRoLm1heCh0aGlzLncsdC53KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LngsTWF0aC5taW4oZS54LHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LnksTWF0aC5taW4oZS55LHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LnosTWF0aC5taW4oZS56LHRoaXMueikpLHRoaXMudz1NYXRoLm1heCh0LncsTWF0aC5taW4oZS53LHRoaXMudykpLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy56KSksdGhpcy53PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLncpKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heCh0LE1hdGgubWluKGUsbikpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpcy56PU1hdGguZmxvb3IodGhpcy56KSx0aGlzLnc9TWF0aC5mbG9vcih0aGlzLncpLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzLnc9TWF0aC5jZWlsKHRoaXMudyksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpcy56PU1hdGgucm91bmQodGhpcy56KSx0aGlzLnc9TWF0aC5yb3VuZCh0aGlzLncpLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PXRoaXMueDwwP01hdGguY2VpbCh0aGlzLngpOk1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9dGhpcy55PDA/TWF0aC5jZWlsKHRoaXMueSk6TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej10aGlzLno8MD9NYXRoLmNlaWwodGhpcy56KTpNYXRoLmZsb29yKHRoaXMueiksdGhpcy53PXRoaXMudzwwP01hdGguY2VpbCh0aGlzLncpOk1hdGguZmxvb3IodGhpcy53KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzLno9LXRoaXMueix0aGlzLnc9LXRoaXMudyx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55K3RoaXMueip0LnordGhpcy53KnQud31sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMudyl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopK01hdGguYWJzKHRoaXMudyl9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzLnorPSh0LnotdGhpcy56KSplLHRoaXMudys9KHQudy10aGlzLncpKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzLno9dC56KyhlLnotdC56KSpuLHRoaXMudz10LncrKGUudy10LncpKm4sdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55JiZ0Lno9PT10aGlzLnomJnQudz09PXRoaXMud31mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLng9dFtlXSx0aGlzLnk9dFtlKzFdLHRoaXMuej10W2UrMl0sdGhpcy53PXRbZSszXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHRbZSsyXT10aGlzLnosdFtlKzNdPXRoaXMudyx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlLG4pe3JldHVybiB2b2lkIDAhPT1uJiZjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKSx0aGlzLng9dC5nZXRYKGUpLHRoaXMueT10LmdldFkoZSksdGhpcy56PXQuZ2V0WihlKSx0aGlzLnc9dC5nZXRXKGUpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXMudz1NYXRoLnJhbmRvbSgpLHRoaXN9fXdKdC5wcm90b3R5cGUuaXNWZWN0b3I0PSEwO2NsYXNzIFNKdCBleHRlbmRzIGpadHtjb25zdHJ1Y3Rvcih0LGUsbj17fSl7c3VwZXIoKSx0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9ZSx0aGlzLmRlcHRoPTEsdGhpcy5zY2lzc29yPW5ldyB3SnQoMCwwLHQsZSksdGhpcy5zY2lzc29yVGVzdD0hMSx0aGlzLnZpZXdwb3J0PW5ldyB3SnQoMCwwLHQsZSksdGhpcy50ZXh0dXJlPW5ldyBiSnQodm9pZCAwLG4ubWFwcGluZyxuLndyYXBTLG4ud3JhcFQsbi5tYWdGaWx0ZXIsbi5taW5GaWx0ZXIsbi5mb3JtYXQsbi50eXBlLG4uYW5pc290cm9weSxuLmVuY29kaW5nKSx0aGlzLnRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSEwLHRoaXMudGV4dHVyZS5pbWFnZT17d2lkdGg6dCxoZWlnaHQ6ZSxkZXB0aDoxfSx0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPXZvaWQgMCE9PW4uZ2VuZXJhdGVNaXBtYXBzJiZuLmdlbmVyYXRlTWlwbWFwcyx0aGlzLnRleHR1cmUubWluRmlsdGVyPXZvaWQgMCE9PW4ubWluRmlsdGVyP24ubWluRmlsdGVyOmVadCx0aGlzLmRlcHRoQnVmZmVyPXZvaWQgMD09PW4uZGVwdGhCdWZmZXJ8fG4uZGVwdGhCdWZmZXIsdGhpcy5zdGVuY2lsQnVmZmVyPXZvaWQgMCE9PW4uc3RlbmNpbEJ1ZmZlciYmbi5zdGVuY2lsQnVmZmVyLHRoaXMuZGVwdGhUZXh0dXJlPXZvaWQgMCE9PW4uZGVwdGhUZXh0dXJlP24uZGVwdGhUZXh0dXJlOm51bGx9c2V0VGV4dHVyZSh0KXt0LmltYWdlPXt3aWR0aDp0aGlzLndpZHRoLGhlaWdodDp0aGlzLmhlaWdodCxkZXB0aDp0aGlzLmRlcHRofSx0aGlzLnRleHR1cmU9dH1zZXRTaXplKHQsZSxuPTEpe3RoaXMud2lkdGg9PT10JiZ0aGlzLmhlaWdodD09PWUmJnRoaXMuZGVwdGg9PT1ufHwodGhpcy53aWR0aD10LHRoaXMuaGVpZ2h0PWUsdGhpcy5kZXB0aD1uLHRoaXMudGV4dHVyZS5pbWFnZS53aWR0aD10LHRoaXMudGV4dHVyZS5pbWFnZS5oZWlnaHQ9ZSx0aGlzLnRleHR1cmUuaW1hZ2UuZGVwdGg9bix0aGlzLmRpc3Bvc2UoKSksdGhpcy52aWV3cG9ydC5zZXQoMCwwLHQsZSksdGhpcy5zY2lzc29yLnNldCgwLDAsdCxlKX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLndpZHRoPXQud2lkdGgsdGhpcy5oZWlnaHQ9dC5oZWlnaHQsdGhpcy5kZXB0aD10LmRlcHRoLHRoaXMudmlld3BvcnQuY29weSh0LnZpZXdwb3J0KSx0aGlzLnRleHR1cmU9dC50ZXh0dXJlLmNsb25lKCksdGhpcy50ZXh0dXJlLmltYWdlPXsuLi50aGlzLnRleHR1cmUuaW1hZ2V9LHRoaXMuZGVwdGhCdWZmZXI9dC5kZXB0aEJ1ZmZlcix0aGlzLnN0ZW5jaWxCdWZmZXI9dC5zdGVuY2lsQnVmZmVyLHRoaXMuZGVwdGhUZXh0dXJlPXQuZGVwdGhUZXh0dXJlLHRoaXN9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19U0p0LnByb3RvdHlwZS5pc1dlYkdMUmVuZGVyVGFyZ2V0PSEwO2NsYXNzIE1KdCBleHRlbmRzIFNKdHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodCxlKTtjb25zdCBpPXRoaXMudGV4dHVyZTt0aGlzLnRleHR1cmU9W107Zm9yKGxldCB0PTA7dDxuO3QrKyl0aGlzLnRleHR1cmVbdF09aS5jbG9uZSgpfXNldFNpemUodCxlLG49MSl7aWYodGhpcy53aWR0aCE9PXR8fHRoaXMuaGVpZ2h0IT09ZXx8dGhpcy5kZXB0aCE9PW4pe3RoaXMud2lkdGg9dCx0aGlzLmhlaWdodD1lLHRoaXMuZGVwdGg9bjtmb3IobGV0IGk9MCxyPXRoaXMudGV4dHVyZS5sZW5ndGg7aTxyO2krKyl0aGlzLnRleHR1cmVbaV0uaW1hZ2Uud2lkdGg9dCx0aGlzLnRleHR1cmVbaV0uaW1hZ2UuaGVpZ2h0PWUsdGhpcy50ZXh0dXJlW2ldLmltYWdlLmRlcHRoPW47dGhpcy5kaXNwb3NlKCl9cmV0dXJuIHRoaXMudmlld3BvcnQuc2V0KDAsMCx0LGUpLHRoaXMuc2Npc3Nvci5zZXQoMCwwLHQsZSksdGhpc31jb3B5KHQpe3RoaXMuZGlzcG9zZSgpLHRoaXMud2lkdGg9dC53aWR0aCx0aGlzLmhlaWdodD10LmhlaWdodCx0aGlzLmRlcHRoPXQuZGVwdGgsdGhpcy52aWV3cG9ydC5zZXQoMCwwLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLHRoaXMuc2Npc3Nvci5zZXQoMCwwLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLHRoaXMuZGVwdGhCdWZmZXI9dC5kZXB0aEJ1ZmZlcix0aGlzLnN0ZW5jaWxCdWZmZXI9dC5zdGVuY2lsQnVmZmVyLHRoaXMuZGVwdGhUZXh0dXJlPXQuZGVwdGhUZXh0dXJlLHRoaXMudGV4dHVyZS5sZW5ndGg9MDtmb3IobGV0IGU9MCxuPXQudGV4dHVyZS5sZW5ndGg7ZTxuO2UrKyl0aGlzLnRleHR1cmVbZV09dC50ZXh0dXJlW2VdLmNsb25lKCk7cmV0dXJuIHRoaXN9fU1KdC5wcm90b3R5cGUuaXNXZWJHTE11bHRpcGxlUmVuZGVyVGFyZ2V0cz0hMDtjbGFzcyBFSnQgZXh0ZW5kcyBTSnR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHQsZSxuKSx0aGlzLnNhbXBsZXM9NH1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5LmNhbGwodGhpcyx0KSx0aGlzLnNhbXBsZXM9dC5zYW1wbGVzLHRoaXN9fUVKdC5wcm90b3R5cGUuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0PSEwO2NsYXNzIFRKdHtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCxpPTEpe3RoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX3c9aX1zdGF0aWMgc2xlcnAodCxlLG4saSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogU3RhdGljIC5zbGVycCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBxbS5zbGVycFF1YXRlcm5pb25zKCBxYSwgcWIsIHQgKSBpbnN0ZWFkLiIpLG4uc2xlcnBRdWF0ZXJuaW9ucyh0LGUsaSl9c3RhdGljIHNsZXJwRmxhdCh0LGUsbixpLHIsbyxhKXtsZXQgcz1uW2krMF0sbD1uW2krMV0sYz1uW2krMl0sdT1uW2krM107Y29uc3QgaD1yW28rMF0sZD1yW28rMV0scD1yW28rMl0sZj1yW28rM107aWYoMD09PWEpcmV0dXJuIHRbZSswXT1zLHRbZSsxXT1sLHRbZSsyXT1jLHZvaWQodFtlKzNdPXUpO2lmKDE9PT1hKXJldHVybiB0W2UrMF09aCx0W2UrMV09ZCx0W2UrMl09cCx2b2lkKHRbZSszXT1mKTtpZih1IT09Znx8cyE9PWh8fGwhPT1kfHxjIT09cCl7bGV0IHQ9MS1hO2NvbnN0IGU9cypoK2wqZCtjKnArdSpmLG49ZT49MD8xOi0xLGk9MS1lKmU7aWYoaT5OdW1iZXIuRVBTSUxPTil7Y29uc3Qgcj1NYXRoLnNxcnQoaSksbz1NYXRoLmF0YW4yKHIsZSpuKTt0PU1hdGguc2luKHQqbykvcixhPU1hdGguc2luKGEqbykvcn1jb25zdCByPWEqbjtpZihzPXMqdCtoKnIsbD1sKnQrZCpyLGM9Yyp0K3Aqcix1PXUqdCtmKnIsdD09PTEtYSl7Y29uc3QgdD0xL01hdGguc3FydChzKnMrbCpsK2MqYyt1KnUpO3MqPXQsbCo9dCxjKj10LHUqPXR9fXRbZV09cyx0W2UrMV09bCx0W2UrMl09Yyx0W2UrM109dX1zdGF0aWMgbXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQodCxlLG4saSxyLG8pe2NvbnN0IGE9bltpXSxzPW5baSsxXSxsPW5baSsyXSxjPW5baSszXSx1PXJbb10saD1yW28rMV0sZD1yW28rMl0scD1yW28rM107cmV0dXJuIHRbZV09YSpwK2MqdStzKmQtbCpoLHRbZSsxXT1zKnArYypoK2wqdS1hKmQsdFtlKzJdPWwqcCtjKmQrYSpoLXMqdSx0W2UrM109YypwLWEqdS1zKmgtbCpkLHR9Z2V0IHgoKXtyZXR1cm4gdGhpcy5feH1zZXQgeCh0KXt0aGlzLl94PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3l9c2V0IHkodCl7dGhpcy5feT10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeigpe3JldHVybiB0aGlzLl96fXNldCB6KHQpe3RoaXMuX3o9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHcoKXtyZXR1cm4gdGhpcy5fd31zZXQgdyh0KXt0aGlzLl93PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldCh0LGUsbixpKXtyZXR1cm4gdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fdz1pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX3cpfWNvcHkodCl7cmV0dXJuIHRoaXMuX3g9dC54LHRoaXMuX3k9dC55LHRoaXMuX3o9dC56LHRoaXMuX3c9dC53LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21FdWxlcih0LGUpe2lmKCF0fHwhdC5pc0V1bGVyKXRocm93IG5ldyBFcnJvcigiVEhSRUUuUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIG5vdyBleHBlY3RzIGFuIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuIik7Y29uc3Qgbj10Ll94LGk9dC5feSxyPXQuX3osbz10Ll9vcmRlcixhPU1hdGguY29zLHM9TWF0aC5zaW4sbD1hKG4vMiksYz1hKGkvMiksdT1hKHIvMiksaD1zKG4vMiksZD1zKGkvMikscD1zKHIvMik7c3dpdGNoKG8pe2Nhc2UiWFlaIjp0aGlzLl94PWgqYyp1K2wqZCpwLHRoaXMuX3k9bCpkKnUtaCpjKnAsdGhpcy5fej1sKmMqcCtoKmQqdSx0aGlzLl93PWwqYyp1LWgqZCpwO2JyZWFrO2Nhc2UiWVhaIjp0aGlzLl94PWgqYyp1K2wqZCpwLHRoaXMuX3k9bCpkKnUtaCpjKnAsdGhpcy5fej1sKmMqcC1oKmQqdSx0aGlzLl93PWwqYyp1K2gqZCpwO2JyZWFrO2Nhc2UiWlhZIjp0aGlzLl94PWgqYyp1LWwqZCpwLHRoaXMuX3k9bCpkKnUraCpjKnAsdGhpcy5fej1sKmMqcCtoKmQqdSx0aGlzLl93PWwqYyp1LWgqZCpwO2JyZWFrO2Nhc2UiWllYIjp0aGlzLl94PWgqYyp1LWwqZCpwLHRoaXMuX3k9bCpkKnUraCpjKnAsdGhpcy5fej1sKmMqcC1oKmQqdSx0aGlzLl93PWwqYyp1K2gqZCpwO2JyZWFrO2Nhc2UiWVpYIjp0aGlzLl94PWgqYyp1K2wqZCpwLHRoaXMuX3k9bCpkKnUraCpjKnAsdGhpcy5fej1sKmMqcC1oKmQqdSx0aGlzLl93PWwqYyp1LWgqZCpwO2JyZWFrO2Nhc2UiWFpZIjp0aGlzLl94PWgqYyp1LWwqZCpwLHRoaXMuX3k9bCpkKnUtaCpjKnAsdGhpcy5fej1sKmMqcCtoKmQqdSx0aGlzLl93PWwqYyp1K2gqZCpwO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiAuc2V0RnJvbUV1bGVyKCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogIitvKX1yZXR1cm4hMSE9PWUmJnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21BeGlzQW5nbGUodCxlKXtjb25zdCBuPWUvMixpPU1hdGguc2luKG4pO3JldHVybiB0aGlzLl94PXQueCppLHRoaXMuX3k9dC55KmksdGhpcy5fej10LnoqaSx0aGlzLl93PU1hdGguY29zKG4pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Sb3RhdGlvbk1hdHJpeCh0KXtjb25zdCBlPXQuZWxlbWVudHMsbj1lWzBdLGk9ZVs0XSxyPWVbOF0sbz1lWzFdLGE9ZVs1XSxzPWVbOV0sbD1lWzJdLGM9ZVs2XSx1PWVbMTBdLGg9bithK3U7aWYoaD4wKXtjb25zdCB0PS41L01hdGguc3FydChoKzEpO3RoaXMuX3c9LjI1L3QsdGhpcy5feD0oYy1zKSp0LHRoaXMuX3k9KHItbCkqdCx0aGlzLl96PShvLWkpKnR9ZWxzZSBpZihuPmEmJm4+dSl7Y29uc3QgdD0yKk1hdGguc3FydCgxK24tYS11KTt0aGlzLl93PShjLXMpL3QsdGhpcy5feD0uMjUqdCx0aGlzLl95PShpK28pL3QsdGhpcy5fej0ocitsKS90fWVsc2UgaWYoYT51KXtjb25zdCB0PTIqTWF0aC5zcXJ0KDErYS1uLXUpO3RoaXMuX3c9KHItbCkvdCx0aGlzLl94PShpK28pL3QsdGhpcy5feT0uMjUqdCx0aGlzLl96PShzK2MpL3R9ZWxzZXtjb25zdCB0PTIqTWF0aC5zcXJ0KDErdS1uLWEpO3RoaXMuX3c9KG8taSkvdCx0aGlzLl94PShyK2wpL3QsdGhpcy5feT0ocytjKS90LHRoaXMuX3o9LjI1KnR9cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Vbml0VmVjdG9ycyh0LGUpe2xldCBuPXQuZG90KGUpKzE7cmV0dXJuIG48TnVtYmVyLkVQU0lMT04/KG49MCxNYXRoLmFicyh0LngpPk1hdGguYWJzKHQueik/KHRoaXMuX3g9LXQueSx0aGlzLl95PXQueCx0aGlzLl96PTAsdGhpcy5fdz1uKToodGhpcy5feD0wLHRoaXMuX3k9LXQueix0aGlzLl96PXQueSx0aGlzLl93PW4pKToodGhpcy5feD10LnkqZS56LXQueiplLnksdGhpcy5feT10LnoqZS54LXQueCplLnosdGhpcy5fej10LngqZS55LXQueSplLngsdGhpcy5fdz1uKSx0aGlzLm5vcm1hbGl6ZSgpfWFuZ2xlVG8odCl7cmV0dXJuIDIqTWF0aC5hY29zKE1hdGguYWJzKCRadCh0aGlzLmRvdCh0KSwtMSwxKSkpfXJvdGF0ZVRvd2FyZHModCxlKXtjb25zdCBuPXRoaXMuYW5nbGVUbyh0KTtpZigwPT09bilyZXR1cm4gdGhpcztjb25zdCBpPU1hdGgubWluKDEsZS9uKTtyZXR1cm4gdGhpcy5zbGVycCh0LGkpLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMSl9aW52ZXJ0KCl7cmV0dXJuIHRoaXMuY29uanVnYXRlKCl9Y29uanVnYXRlKCl7cmV0dXJuIHRoaXMuX3gqPS0xLHRoaXMuX3kqPS0xLHRoaXMuX3oqPS0xLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy5feCp0Ll94K3RoaXMuX3kqdC5feSt0aGlzLl96KnQuX3ordGhpcy5fdyp0Ll93fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fd31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fdyl9bm9ybWFsaXplKCl7bGV0IHQ9dGhpcy5sZW5ndGgoKTtyZXR1cm4gMD09PXQ/KHRoaXMuX3g9MCx0aGlzLl95PTAsdGhpcy5fej0wLHRoaXMuX3c9MSk6KHQ9MS90LHRoaXMuX3g9dGhpcy5feCp0LHRoaXMuX3k9dGhpcy5feSp0LHRoaXMuX3o9dGhpcy5feip0LHRoaXMuX3c9dGhpcy5fdyp0KSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31tdWx0aXBseSh0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlF1YXRlcm5pb246IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5UXVhdGVybmlvbnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0LGUpKTp0aGlzLm11bHRpcGx5UXVhdGVybmlvbnModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHQsdGhpcyl9bXVsdGlwbHlRdWF0ZXJuaW9ucyh0LGUpe2NvbnN0IG49dC5feCxpPXQuX3kscj10Ll96LG89dC5fdyxhPWUuX3gscz1lLl95LGw9ZS5feixjPWUuX3c7cmV0dXJuIHRoaXMuX3g9bipjK28qYStpKmwtcipzLHRoaXMuX3k9aSpjK28qcytyKmEtbipsLHRoaXMuX3o9cipjK28qbCtuKnMtaSphLHRoaXMuX3c9bypjLW4qYS1pKnMtcipsLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwKHQsZSl7aWYoMD09PWUpcmV0dXJuIHRoaXM7aWYoMT09PWUpcmV0dXJuIHRoaXMuY29weSh0KTtjb25zdCBuPXRoaXMuX3gsaT10aGlzLl95LHI9dGhpcy5feixvPXRoaXMuX3c7bGV0IGE9byp0Ll93K24qdC5feCtpKnQuX3krcip0Ll96O2lmKGE8MD8odGhpcy5fdz0tdC5fdyx0aGlzLl94PS10Ll94LHRoaXMuX3k9LXQuX3ksdGhpcy5fej0tdC5feixhPS1hKTp0aGlzLmNvcHkodCksYT49MSlyZXR1cm4gdGhpcy5fdz1vLHRoaXMuX3g9bix0aGlzLl95PWksdGhpcy5fej1yLHRoaXM7Y29uc3Qgcz0xLWEqYTtpZihzPD1OdW1iZXIuRVBTSUxPTil7Y29uc3QgdD0xLWU7cmV0dXJuIHRoaXMuX3c9dCpvK2UqdGhpcy5fdyx0aGlzLl94PXQqbitlKnRoaXMuX3gsdGhpcy5feT10KmkrZSp0aGlzLl95LHRoaXMuX3o9dCpyK2UqdGhpcy5feix0aGlzLm5vcm1hbGl6ZSgpLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNvbnN0IGw9TWF0aC5zcXJ0KHMpLGM9TWF0aC5hdGFuMihsLGEpLHU9TWF0aC5zaW4oKDEtZSkqYykvbCxoPU1hdGguc2luKGUqYykvbDtyZXR1cm4gdGhpcy5fdz1vKnUrdGhpcy5fdypoLHRoaXMuX3g9bip1K3RoaXMuX3gqaCx0aGlzLl95PWkqdSt0aGlzLl95KmgsdGhpcy5fej1yKnUrdGhpcy5feipoLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwUXVhdGVybmlvbnModCxlLG4pe3RoaXMuY29weSh0KS5zbGVycChlLG4pfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fdz09PXRoaXMuX3d9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5feD10W2VdLHRoaXMuX3k9dFtlKzFdLHRoaXMuX3o9dFtlKzJdLHRoaXMuX3c9dFtlKzNdLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX3csdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuX3g9dC5nZXRYKGUpLHRoaXMuX3k9dC5nZXRZKGUpLHRoaXMuX3o9dC5nZXRaKGUpLHRoaXMuX3c9dC5nZXRXKGUpLHRoaXN9X29uQ2hhbmdlKHQpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPXQsdGhpc31fb25DaGFuZ2VDYWxsYmFjaygpe319VEp0LnByb3RvdHlwZS5pc1F1YXRlcm5pb249ITA7Y2xhc3MgQ0p0e2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0wKXt0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bn1zZXQodCxlLG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj10aGlzLnopLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzLno9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRaKHQpe3JldHVybiB0aGlzLno9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnopfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzLno9dC56LHRoaXN9YWRkKHQsZSl7cmV0dXJuIHZvaWQgMCE9PWU/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuYWRkVmVjdG9ycyh0LGUpKToodGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpcyl9YWRkU2NhbGFyKHQpe3JldHVybiB0aGlzLngrPXQsdGhpcy55Kz10LHRoaXMueis9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpcy56PXQueitlLnosdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXMueis9dC56KmUsdGhpc31zdWIodCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5zdWJWZWN0b3JzKHQsZSkpOih0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzLnotPXQueix0aGlzKX1zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzfW11bHRpcGx5KHQsZSl7cmV0dXJuIHZvaWQgMCE9PWU/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5VmVjdG9ycyh0LGUpKToodGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpcy56Kj10LnosdGhpcyl9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpcy56Kj10LHRoaXN9bXVsdGlwbHlWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngqZS54LHRoaXMueT10LnkqZS55LHRoaXMuej10LnoqZS56LHRoaXN9YXBwbHlFdWxlcih0KXtyZXR1cm4gdCYmdC5pc0V1bGVyfHxjb25zb2xlLmVycm9yKCJUSFJFRS5WZWN0b3IzOiAuYXBwbHlFdWxlcigpIG5vdyBleHBlY3RzIGFuIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuIiksdGhpcy5hcHBseVF1YXRlcm5pb24oa0p0LnNldEZyb21FdWxlcih0KSl9YXBwbHlBeGlzQW5nbGUodCxlKXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oa0p0LnNldEZyb21BeGlzQW5nbGUodCxlKSl9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LGk9dGhpcy56LHI9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PXJbMF0qZStyWzNdKm4rcls2XSppLHRoaXMueT1yWzFdKmUrcls0XSpuK3JbN10qaSx0aGlzLno9clsyXSplK3JbNV0qbityWzhdKmksdGhpc31hcHBseU5vcm1hbE1hdHJpeCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDModCkubm9ybWFsaXplKCl9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LGk9dGhpcy56LHI9dC5lbGVtZW50cyxvPTEvKHJbM10qZStyWzddKm4rclsxMV0qaStyWzE1XSk7cmV0dXJuIHRoaXMueD0oclswXSplK3JbNF0qbityWzhdKmkrclsxMl0pKm8sdGhpcy55PShyWzFdKmUrcls1XSpuK3JbOV0qaStyWzEzXSkqbyx0aGlzLno9KHJbMl0qZStyWzZdKm4rclsxMF0qaStyWzE0XSkqbyx0aGlzfWFwcGx5UXVhdGVybmlvbih0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxpPXRoaXMueixyPXQueCxvPXQueSxhPXQueixzPXQudyxsPXMqZStvKmktYSpuLGM9cypuK2EqZS1yKmksdT1zKmkrcipuLW8qZSxoPS1yKmUtbypuLWEqaTtyZXR1cm4gdGhpcy54PWwqcytoKi1yK2MqLWEtdSotbyx0aGlzLnk9YypzK2gqLW8rdSotci1sKi1hLHRoaXMuej11KnMraCotYStsKi1vLWMqLXIsdGhpc31wcm9qZWN0KHQpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkSW52ZXJzZSkuYXBwbHlNYXRyaXg0KHQucHJvamVjdGlvbk1hdHJpeCl9dW5wcm9qZWN0KHQpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4NCh0LnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKS5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCl9dHJhbnNmb3JtRGlyZWN0aW9uKHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LGk9dGhpcy56LHI9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PXJbMF0qZStyWzRdKm4rcls4XSppLHRoaXMueT1yWzFdKmUrcls1XSpuK3JbOV0qaSx0aGlzLno9clsyXSplK3JbNl0qbityWzEwXSppLHRoaXMubm9ybWFsaXplKCl9ZGl2aWRlKHQpe3JldHVybiB0aGlzLngvPXQueCx0aGlzLnkvPXQueSx0aGlzLnovPXQueix0aGlzfWRpdmlkZVNjYWxhcih0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigxL3QpfW1pbih0KXtyZXR1cm4gdGhpcy54PU1hdGgubWluKHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1pbih0aGlzLnksdC55KSx0aGlzLno9TWF0aC5taW4odGhpcy56LHQueiksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpcy56PU1hdGgubWF4KHRoaXMueix0LnopLHRoaXN9Y2xhbXAodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQueCxNYXRoLm1pbihlLngsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQueSxNYXRoLm1pbihlLnksdGhpcy55KSksdGhpcy56PU1hdGgubWF4KHQueixNYXRoLm1pbihlLnosdGhpcy56KSksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy55KSksdGhpcy56PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnopKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heCh0LE1hdGgubWluKGUsbikpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpcy56PU1hdGguZmxvb3IodGhpcy56KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzLno9TWF0aC5jZWlsKHRoaXMueiksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpcy56PU1hdGgucm91bmQodGhpcy56KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD10aGlzLng8MD9NYXRoLmNlaWwodGhpcy54KTpNYXRoLmZsb29yKHRoaXMueCksdGhpcy55PXRoaXMueTwwP01hdGguY2VpbCh0aGlzLnkpOk1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9dGhpcy56PDA/TWF0aC5jZWlsKHRoaXMueik6TWF0aC5mbG9vcih0aGlzLnopLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXMuej0tdGhpcy56LHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLngqdC54K3RoaXMueSp0LnkrdGhpcy56KnQuen1sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMuen1sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56KX1tYW5oYXR0YW5MZW5ndGgoKXtyZXR1cm4gTWF0aC5hYnModGhpcy54KStNYXRoLmFicyh0aGlzLnkpK01hdGguYWJzKHRoaXMueil9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzLnorPSh0LnotdGhpcy56KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpcy56PXQueisoZS56LXQueikqbix0aGlzfWNyb3NzKHQsZSl7cmV0dXJuIHZvaWQgMCE9PWU/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmNyb3NzKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuY3Jvc3NWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmNyb3NzVmVjdG9ycyh0LGUpKTp0aGlzLmNyb3NzVmVjdG9ycyh0aGlzLHQpfWNyb3NzVmVjdG9ycyh0LGUpe2NvbnN0IG49dC54LGk9dC55LHI9dC56LG89ZS54LGE9ZS55LHM9ZS56O3JldHVybiB0aGlzLng9aSpzLXIqYSx0aGlzLnk9cipvLW4qcyx0aGlzLno9biphLWkqbyx0aGlzfXByb2plY3RPblZlY3Rvcih0KXtjb25zdCBlPXQubGVuZ3RoU3EoKTtpZigwPT09ZSlyZXR1cm4gdGhpcy5zZXQoMCwwLDApO2NvbnN0IG49dC5kb3QodGhpcykvZTtyZXR1cm4gdGhpcy5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKG4pfXByb2plY3RPblBsYW5lKHQpe3JldHVybiBBSnQuY29weSh0aGlzKS5wcm9qZWN0T25WZWN0b3IodCksdGhpcy5zdWIoQUp0KX1yZWZsZWN0KHQpe3JldHVybiB0aGlzLnN1YihBSnQuY29weSh0KS5tdWx0aXBseVNjYWxhcigyKnRoaXMuZG90KHQpKSl9YW5nbGVUbyh0KXtjb25zdCBlPU1hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqdC5sZW5ndGhTcSgpKTtpZigwPT09ZSlyZXR1cm4gTWF0aC5QSS8yO2NvbnN0IG49dGhpcy5kb3QodCkvZTtyZXR1cm4gTWF0aC5hY29zKCRadChuLC0xLDEpKX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LG49dGhpcy55LXQueSxpPXRoaXMuei10Lno7cmV0dXJuIGUqZStuKm4raSppfW1hbmhhdHRhbkRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC10LngpK01hdGguYWJzKHRoaXMueS10LnkpK01hdGguYWJzKHRoaXMuei10LnopfXNldEZyb21TcGhlcmljYWwodCl7cmV0dXJuIHRoaXMuc2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnBoaSx0LnRoZXRhKX1zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKHQsZSxuKXtjb25zdCBpPU1hdGguc2luKGUpKnQ7cmV0dXJuIHRoaXMueD1pKk1hdGguc2luKG4pLHRoaXMueT1NYXRoLmNvcyhlKSp0LHRoaXMuej1pKk1hdGguY29zKG4pLHRoaXN9c2V0RnJvbUN5bGluZHJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnRoZXRhLHQueSl9c2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQqTWF0aC5zaW4oZSksdGhpcy55PW4sdGhpcy56PXQqTWF0aC5jb3MoZSksdGhpc31zZXRGcm9tTWF0cml4UG9zaXRpb24odCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9ZVsxMl0sdGhpcy55PWVbMTNdLHRoaXMuej1lWzE0XSx0aGlzfXNldEZyb21NYXRyaXhTY2FsZSh0KXtjb25zdCBlPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLG49dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMSkubGVuZ3RoKCksaT10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gdGhpcy54PWUsdGhpcy55PW4sdGhpcy56PWksdGhpc31zZXRGcm9tTWF0cml4Q29sdW1uKHQsZSl7cmV0dXJuIHRoaXMuZnJvbUFycmF5KHQuZWxlbWVudHMsNCplKX1zZXRGcm9tTWF0cml4M0NvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLDMqZSl9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueSYmdC56PT09dGhpcy56fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpcy56PXRbZSsyXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHRbZSsyXT10aGlzLnosdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSxuKXtyZXR1cm4gdm9pZCAwIT09biYmY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuIiksdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXMuej10LmdldFooZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpc319Q0p0LnByb3RvdHlwZS5pc1ZlY3RvcjM9ITA7Y29uc3QgQUp0PW5ldyBDSnQsa0p0PW5ldyBUSnQ7Y2xhc3MgTEp0e2NvbnN0cnVjdG9yKHQ9bmV3IENKdCgxLzAsMS8wLDEvMCksZT1uZXcgQ0p0KC0xLzAsLTEvMCwtMS8wKSl7dGhpcy5taW49dCx0aGlzLm1heD1lfXNldCh0LGUpe3JldHVybiB0aGlzLm1pbi5jb3B5KHQpLHRoaXMubWF4LmNvcHkoZSksdGhpc31zZXRGcm9tQXJyYXkodCl7bGV0IGU9MS8wLG49MS8wLGk9MS8wLHI9LTEvMCxvPS0xLzAsYT0tMS8wO2ZvcihsZXQgcz0wLGw9dC5sZW5ndGg7czxsO3MrPTMpe2NvbnN0IGw9dFtzXSxjPXRbcysxXSx1PXRbcysyXTtsPGUmJihlPWwpLGM8biYmKG49YyksdTxpJiYoaT11KSxsPnImJihyPWwpLGM+byYmKG89YyksdT5hJiYoYT11KX1yZXR1cm4gdGhpcy5taW4uc2V0KGUsbixpKSx0aGlzLm1heC5zZXQocixvLGEpLHRoaXN9c2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KXtsZXQgZT0xLzAsbj0xLzAsaT0xLzAscj0tMS8wLG89LTEvMCxhPS0xLzA7Zm9yKGxldCBzPTAsbD10LmNvdW50O3M8bDtzKyspe2NvbnN0IGw9dC5nZXRYKHMpLGM9dC5nZXRZKHMpLHU9dC5nZXRaKHMpO2w8ZSYmKGU9bCksYzxuJiYobj1jKSx1PGkmJihpPXUpLGw+ciYmKHI9bCksYz5vJiYobz1jKSx1PmEmJihhPXUpfXJldHVybiB0aGlzLm1pbi5zZXQoZSxuLGkpLHRoaXMubWF4LnNldChyLG8sYSksdGhpc31zZXRGcm9tUG9pbnRzKHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXRoaXMuZXhwYW5kQnlQb2ludCh0W2VdKTtyZXR1cm4gdGhpc31zZXRGcm9tQ2VudGVyQW5kU2l6ZSh0LGUpe2NvbnN0IG49Tkp0LmNvcHkoZSkubXVsdGlwbHlTY2FsYXIoLjUpO3JldHVybiB0aGlzLm1pbi5jb3B5KHQpLnN1YihuKSx0aGlzLm1heC5jb3B5KHQpLmFkZChuKSx0aGlzfXNldEZyb21PYmplY3QodCl7cmV0dXJuIHRoaXMubWFrZUVtcHR5KCksdGhpcy5leHBhbmRCeU9iamVjdCh0KX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLm1pbi5jb3B5KHQubWluKSx0aGlzLm1heC5jb3B5KHQubWF4KSx0aGlzfW1ha2VFbXB0eSgpe3JldHVybiB0aGlzLm1pbi54PXRoaXMubWluLnk9dGhpcy5taW4uej0xLzAsdGhpcy5tYXgueD10aGlzLm1heC55PXRoaXMubWF4Lno9LTEvMCx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5tYXgueDx0aGlzLm1pbi54fHx0aGlzLm1heC55PHRoaXMubWluLnl8fHRoaXMubWF4Lno8dGhpcy5taW4uen1nZXRDZW50ZXIodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3Quc2V0KDAsMCwwKTp0LmFkZFZlY3RvcnModGhpcy5taW4sdGhpcy5tYXgpLm11bHRpcGx5U2NhbGFyKC41KX1nZXRTaXplKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDAsMCk6dC5zdWJWZWN0b3JzKHRoaXMubWF4LHRoaXMubWluKX1leHBhbmRCeVBvaW50KHQpe3JldHVybiB0aGlzLm1pbi5taW4odCksdGhpcy5tYXgubWF4KHQpLHRoaXN9ZXhwYW5kQnlWZWN0b3IodCl7cmV0dXJuIHRoaXMubWluLnN1Yih0KSx0aGlzLm1heC5hZGQodCksdGhpc31leHBhbmRCeVNjYWxhcih0KXtyZXR1cm4gdGhpcy5taW4uYWRkU2NhbGFyKC10KSx0aGlzLm1heC5hZGRTY2FsYXIodCksdGhpc31leHBhbmRCeU9iamVjdCh0KXt0LnVwZGF0ZVdvcmxkTWF0cml4KCExLCExKTtjb25zdCBlPXQuZ2VvbWV0cnk7dm9pZCAwIT09ZSYmKG51bGw9PT1lLmJvdW5kaW5nQm94JiZlLmNvbXB1dGVCb3VuZGluZ0JveCgpLElKdC5jb3B5KGUuYm91bmRpbmdCb3gpLElKdC5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy51bmlvbihJSnQpKTtjb25zdCBuPXQuY2hpbGRyZW47Zm9yKGxldCB0PTAsZT1uLmxlbmd0aDt0PGU7dCsrKXRoaXMuZXhwYW5kQnlPYmplY3Qoblt0XSk7cmV0dXJuIHRoaXN9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4hKHQueDx0aGlzLm1pbi54fHx0Lng+dGhpcy5tYXgueHx8dC55PHRoaXMubWluLnl8fHQueT50aGlzLm1heC55fHx0Lno8dGhpcy5taW4uenx8dC56PnRoaXMubWF4LnopfWNvbnRhaW5zQm94KHQpe3JldHVybiB0aGlzLm1pbi54PD10Lm1pbi54JiZ0Lm1heC54PD10aGlzLm1heC54JiZ0aGlzLm1pbi55PD10Lm1pbi55JiZ0Lm1heC55PD10aGlzLm1heC55JiZ0aGlzLm1pbi56PD10Lm1pbi56JiZ0Lm1heC56PD10aGlzLm1heC56fWdldFBhcmFtZXRlcih0LGUpe3JldHVybiBlLnNldCgodC54LXRoaXMubWluLngpLyh0aGlzLm1heC54LXRoaXMubWluLngpLCh0LnktdGhpcy5taW4ueSkvKHRoaXMubWF4LnktdGhpcy5taW4ueSksKHQuei10aGlzLm1pbi56KS8odGhpcy5tYXguei10aGlzLm1pbi56KSl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4hKHQubWF4Lng8dGhpcy5taW4ueHx8dC5taW4ueD50aGlzLm1heC54fHx0Lm1heC55PHRoaXMubWluLnl8fHQubWluLnk+dGhpcy5tYXgueXx8dC5tYXguejx0aGlzLm1pbi56fHx0Lm1pbi56PnRoaXMubWF4LnopfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHRoaXMuY2xhbXBQb2ludCh0LmNlbnRlcixOSnQpLE5KdC5kaXN0YW5jZVRvU3F1YXJlZCh0LmNlbnRlcik8PXQucmFkaXVzKnQucmFkaXVzfWludGVyc2VjdHNQbGFuZSh0KXtsZXQgZSxuO3JldHVybiB0Lm5vcm1hbC54PjA/KGU9dC5ub3JtYWwueCp0aGlzLm1pbi54LG49dC5ub3JtYWwueCp0aGlzLm1heC54KTooZT10Lm5vcm1hbC54KnRoaXMubWF4Lngsbj10Lm5vcm1hbC54KnRoaXMubWluLngpLHQubm9ybWFsLnk+MD8oZSs9dC5ub3JtYWwueSp0aGlzLm1pbi55LG4rPXQubm9ybWFsLnkqdGhpcy5tYXgueSk6KGUrPXQubm9ybWFsLnkqdGhpcy5tYXgueSxuKz10Lm5vcm1hbC55KnRoaXMubWluLnkpLHQubm9ybWFsLno+MD8oZSs9dC5ub3JtYWwueip0aGlzLm1pbi56LG4rPXQubm9ybWFsLnoqdGhpcy5tYXgueik6KGUrPXQubm9ybWFsLnoqdGhpcy5tYXgueixuKz10Lm5vcm1hbC56KnRoaXMubWluLnopLGU8PS10LmNvbnN0YW50JiZuPj0tdC5jb25zdGFudH1pbnRlcnNlY3RzVHJpYW5nbGUodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuITE7dGhpcy5nZXRDZW50ZXIoRkp0KSxWSnQuc3ViVmVjdG9ycyh0aGlzLm1heCxGSnQpLFJKdC5zdWJWZWN0b3JzKHQuYSxGSnQpLE9KdC5zdWJWZWN0b3JzKHQuYixGSnQpLHpKdC5zdWJWZWN0b3JzKHQuYyxGSnQpLERKdC5zdWJWZWN0b3JzKE9KdCxSSnQpLEJKdC5zdWJWZWN0b3JzKHpKdCxPSnQpLEhKdC5zdWJWZWN0b3JzKFJKdCx6SnQpO2xldCBlPVswLC1ESnQueixESnQueSwwLC1CSnQueixCSnQueSwwLC1ISnQueixISnQueSxESnQueiwwLC1ESnQueCxCSnQueiwwLC1CSnQueCxISnQueiwwLC1ISnQueCwtREp0LnksREp0LngsMCwtQkp0LnksQkp0LngsMCwtSEp0LnksSEp0LngsMF07cmV0dXJuISFHSnQoZSxSSnQsT0p0LHpKdCxWSnQpJiYoZT1bMSwwLDAsMCwxLDAsMCwwLDFdLCEhR0p0KGUsUkp0LE9KdCx6SnQsVkp0KSYmKFVKdC5jcm9zc1ZlY3RvcnMoREp0LEJKdCksZT1bVUp0LngsVUp0LnksVUp0LnpdLEdKdChlLFJKdCxPSnQsekp0LFZKdCkpKX1jbGFtcFBvaW50KHQsZSl7cmV0dXJuIGUuY29weSh0KS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCl9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiBOSnQuY29weSh0KS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCkuc3ViKHQpLmxlbmd0aCgpfWdldEJvdW5kaW5nU3BoZXJlKHQpe3JldHVybiB0aGlzLmdldENlbnRlcih0LmNlbnRlciksdC5yYWRpdXM9LjUqdGhpcy5nZXRTaXplKE5KdCkubGVuZ3RoKCksdH1pbnRlcnNlY3QodCl7cmV0dXJuIHRoaXMubWluLm1heCh0Lm1pbiksdGhpcy5tYXgubWluKHQubWF4KSx0aGlzLmlzRW1wdHkoKSYmdGhpcy5tYWtlRW1wdHkoKSx0aGlzfXVuaW9uKHQpe3JldHVybiB0aGlzLm1pbi5taW4odC5taW4pLHRoaXMubWF4Lm1heCh0Lm1heCksdGhpc31hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpfHwoUEp0WzBdLnNldCh0aGlzLm1pbi54LHRoaXMubWluLnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLFBKdFsxXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSxQSnRbMl0uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksUEp0WzNdLnNldCh0aGlzLm1pbi54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLFBKdFs0XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxQSnRbNV0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksUEp0WzZdLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLFBKdFs3XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx0aGlzLnNldEZyb21Qb2ludHMoUEp0KSksdGhpc310cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMubWluLmFkZCh0KSx0aGlzLm1heC5hZGQodCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQubWluLmVxdWFscyh0aGlzLm1pbikmJnQubWF4LmVxdWFscyh0aGlzLm1heCl9fUxKdC5wcm90b3R5cGUuaXNCb3gzPSEwO2NvbnN0IFBKdD1bbmV3IENKdCxuZXcgQ0p0LG5ldyBDSnQsbmV3IENKdCxuZXcgQ0p0LG5ldyBDSnQsbmV3IENKdCxuZXcgQ0p0XSxOSnQ9bmV3IENKdCxJSnQ9bmV3IExKdCxSSnQ9bmV3IENKdCxPSnQ9bmV3IENKdCx6SnQ9bmV3IENKdCxESnQ9bmV3IENKdCxCSnQ9bmV3IENKdCxISnQ9bmV3IENKdCxGSnQ9bmV3IENKdCxWSnQ9bmV3IENKdCxVSnQ9bmV3IENKdCxqSnQ9bmV3IENKdDtmdW5jdGlvbiBHSnQodCxlLG4saSxyKXtmb3IobGV0IG89MCxhPXQubGVuZ3RoLTM7bzw9YTtvKz0zKXtqSnQuZnJvbUFycmF5KHQsbyk7Y29uc3QgYT1yLngqTWF0aC5hYnMoakp0LngpK3IueSpNYXRoLmFicyhqSnQueSkrci56Kk1hdGguYWJzKGpKdC56KSxzPWUuZG90KGpKdCksbD1uLmRvdChqSnQpLGM9aS5kb3Qoakp0KTtpZihNYXRoLm1heCgtTWF0aC5tYXgocyxsLGMpLE1hdGgubWluKHMsbCxjKSk+YSlyZXR1cm4hMX1yZXR1cm4hMH1jb25zdCBXSnQ9bmV3IExKdCxxSnQ9bmV3IENKdCxZSnQ9bmV3IENKdCxYSnQ9bmV3IENKdDtjbGFzcyAkSnR7Y29uc3RydWN0b3IodD1uZXcgQ0p0LGU9LTEpe3RoaXMuY2VudGVyPXQsdGhpcy5yYWRpdXM9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0KSx0aGlzLnJhZGl1cz1lLHRoaXN9c2V0RnJvbVBvaW50cyh0LGUpe2NvbnN0IG49dGhpcy5jZW50ZXI7dm9pZCAwIT09ZT9uLmNvcHkoZSk6V0p0LnNldEZyb21Qb2ludHModCkuZ2V0Q2VudGVyKG4pO2xldCBpPTA7Zm9yKGxldCBlPTAscj10Lmxlbmd0aDtlPHI7ZSsrKWk9TWF0aC5tYXgoaSxuLmRpc3RhbmNlVG9TcXVhcmVkKHRbZV0pKTtyZXR1cm4gdGhpcy5yYWRpdXM9TWF0aC5zcXJ0KGkpLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5yYWRpdXM9dC5yYWRpdXMsdGhpc31pc0VtcHR5KCl7cmV0dXJuIHRoaXMucmFkaXVzPDB9bWFrZUVtcHR5KCl7cmV0dXJuIHRoaXMuY2VudGVyLnNldCgwLDAsMCksdGhpcy5yYWRpdXM9LTEsdGhpc31jb250YWluc1BvaW50KHQpe3JldHVybiB0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXN9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiB0LmRpc3RhbmNlVG8odGhpcy5jZW50ZXIpLXRoaXMucmFkaXVzfWludGVyc2VjdHNTcGhlcmUodCl7Y29uc3QgZT10aGlzLnJhZGl1cyt0LnJhZGl1cztyZXR1cm4gdC5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD1lKmV9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzU3BoZXJlKHRoaXMpfWludGVyc2VjdHNQbGFuZSh0KXtyZXR1cm4gTWF0aC5hYnModC5kaXN0YW5jZVRvUG9pbnQodGhpcy5jZW50ZXIpKTw9dGhpcy5yYWRpdXN9Y2xhbXBQb2ludCh0LGUpe2NvbnN0IG49dGhpcy5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodCk7cmV0dXJuIGUuY29weSh0KSxuPnRoaXMucmFkaXVzKnRoaXMucmFkaXVzJiYoZS5zdWIodGhpcy5jZW50ZXIpLm5vcm1hbGl6ZSgpLGUubXVsdGlwbHlTY2FsYXIodGhpcy5yYWRpdXMpLmFkZCh0aGlzLmNlbnRlcikpLGV9Z2V0Qm91bmRpbmdCb3godCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpPyh0Lm1ha2VFbXB0eSgpLHQpOih0LnNldCh0aGlzLmNlbnRlcix0aGlzLmNlbnRlciksdC5leHBhbmRCeVNjYWxhcih0aGlzLnJhZGl1cyksdCl9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLmNlbnRlci5hcHBseU1hdHJpeDQodCksdGhpcy5yYWRpdXM9dGhpcy5yYWRpdXMqdC5nZXRNYXhTY2FsZU9uQXhpcygpLHRoaXN9dHJhbnNsYXRlKHQpe3JldHVybiB0aGlzLmNlbnRlci5hZGQodCksdGhpc31leHBhbmRCeVBvaW50KHQpe1hKdC5zdWJWZWN0b3JzKHQsdGhpcy5jZW50ZXIpO2NvbnN0IGU9WEp0Lmxlbmd0aFNxKCk7aWYoZT50aGlzLnJhZGl1cyp0aGlzLnJhZGl1cyl7Y29uc3QgdD1NYXRoLnNxcnQoZSksbj0uNSoodC10aGlzLnJhZGl1cyk7dGhpcy5jZW50ZXIuYWRkKFhKdC5tdWx0aXBseVNjYWxhcihuL3QpKSx0aGlzLnJhZGl1cys9bn1yZXR1cm4gdGhpc311bmlvbih0KXtyZXR1cm4gWUp0LnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5jZW50ZXIpLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQucmFkaXVzKSx0aGlzLmV4cGFuZEJ5UG9pbnQocUp0LmNvcHkodC5jZW50ZXIpLmFkZChZSnQpKSx0aGlzLmV4cGFuZEJ5UG9pbnQocUp0LmNvcHkodC5jZW50ZXIpLnN1YihZSnQpKSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5jZW50ZXIuZXF1YWxzKHRoaXMuY2VudGVyKSYmdC5yYWRpdXM9PT10aGlzLnJhZGl1c31jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19Y29uc3QgS0p0PW5ldyBDSnQsWkp0PW5ldyBDSnQsSkp0PW5ldyBDSnQsUUp0PW5ldyBDSnQsdFF0PW5ldyBDSnQsZVF0PW5ldyBDSnQsblF0PW5ldyBDSnQ7Y2xhc3MgaVF0e2NvbnN0cnVjdG9yKHQ9bmV3IENKdCxlPW5ldyBDSnQoMCwwLC0xKSl7dGhpcy5vcmlnaW49dCx0aGlzLmRpcmVjdGlvbj1lfXNldCh0LGUpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQpLHRoaXMuZGlyZWN0aW9uLmNvcHkoZSksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQub3JpZ2luKSx0aGlzLmRpcmVjdGlvbi5jb3B5KHQuZGlyZWN0aW9uKSx0aGlzfWF0KHQsZSl7cmV0dXJuIGUuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIodCkuYWRkKHRoaXMub3JpZ2luKX1sb29rQXQodCl7cmV0dXJuIHRoaXMuZGlyZWN0aW9uLmNvcHkodCkuc3ViKHRoaXMub3JpZ2luKS5ub3JtYWxpemUoKSx0aGlzfXJlY2FzdCh0KXtyZXR1cm4gdGhpcy5vcmlnaW4uY29weSh0aGlzLmF0KHQsS0p0KSksdGhpc31jbG9zZXN0UG9pbnRUb1BvaW50KHQsZSl7ZS5zdWJWZWN0b3JzKHQsdGhpcy5vcmlnaW4pO2NvbnN0IG49ZS5kb3QodGhpcy5kaXJlY3Rpb24pO3JldHVybiBuPDA/ZS5jb3B5KHRoaXMub3JpZ2luKTplLmNvcHkodGhpcy5kaXJlY3Rpb24pLm11bHRpcGx5U2NhbGFyKG4pLmFkZCh0aGlzLm9yaWdpbil9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVNxVG9Qb2ludCh0KSl9ZGlzdGFuY2VTcVRvUG9pbnQodCl7Y29uc3QgZT1LSnQuc3ViVmVjdG9ycyh0LHRoaXMub3JpZ2luKS5kb3QodGhpcy5kaXJlY3Rpb24pO3JldHVybiBlPDA/dGhpcy5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQodCk6KEtKdC5jb3B5KHRoaXMuZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcihlKS5hZGQodGhpcy5vcmlnaW4pLEtKdC5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VTcVRvU2VnbWVudCh0LGUsbixpKXtaSnQuY29weSh0KS5hZGQoZSkubXVsdGlwbHlTY2FsYXIoLjUpLEpKdC5jb3B5KGUpLnN1Yih0KS5ub3JtYWxpemUoKSxRSnQuY29weSh0aGlzLm9yaWdpbikuc3ViKFpKdCk7Y29uc3Qgcj0uNSp0LmRpc3RhbmNlVG8oZSksbz0tdGhpcy5kaXJlY3Rpb24uZG90KEpKdCksYT1RSnQuZG90KHRoaXMuZGlyZWN0aW9uKSxzPS1RSnQuZG90KEpKdCksbD1RSnQubGVuZ3RoU3EoKSxjPU1hdGguYWJzKDEtbypvKTtsZXQgdSxoLGQscDtpZihjPjApaWYodT1vKnMtYSxoPW8qYS1zLHA9cipjLHU+PTApaWYoaD49LXApaWYoaDw9cCl7Y29uc3QgdD0xL2M7dSo9dCxoKj10LGQ9dSoodStvKmgrMiphKStoKihvKnUraCsyKnMpK2x9ZWxzZSBoPXIsdT1NYXRoLm1heCgwLC0obypoK2EpKSxkPS11KnUraCooaCsyKnMpK2w7ZWxzZSBoPS1yLHU9TWF0aC5tYXgoMCwtKG8qaCthKSksZD0tdSp1K2gqKGgrMipzKStsO2Vsc2UgaDw9LXA/KHU9TWF0aC5tYXgoMCwtKC1vKnIrYSkpLGg9dT4wPy1yOk1hdGgubWluKE1hdGgubWF4KC1yLC1zKSxyKSxkPS11KnUraCooaCsyKnMpK2wpOmg8PXA/KHU9MCxoPU1hdGgubWluKE1hdGgubWF4KC1yLC1zKSxyKSxkPWgqKGgrMipzKStsKToodT1NYXRoLm1heCgwLC0obypyK2EpKSxoPXU+MD9yOk1hdGgubWluKE1hdGgubWF4KC1yLC1zKSxyKSxkPS11KnUraCooaCsyKnMpK2wpO2Vsc2UgaD1vPjA/LXI6cix1PU1hdGgubWF4KDAsLShvKmgrYSkpLGQ9LXUqdStoKihoKzIqcykrbDtyZXR1cm4gbiYmbi5jb3B5KHRoaXMuZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcih1KS5hZGQodGhpcy5vcmlnaW4pLGkmJmkuY29weShKSnQpLm11bHRpcGx5U2NhbGFyKGgpLmFkZChaSnQpLGR9aW50ZXJzZWN0U3BoZXJlKHQsZSl7S0p0LnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5vcmlnaW4pO2NvbnN0IG49S0p0LmRvdCh0aGlzLmRpcmVjdGlvbiksaT1LSnQuZG90KEtKdCktbipuLHI9dC5yYWRpdXMqdC5yYWRpdXM7aWYoaT5yKXJldHVybiBudWxsO2NvbnN0IG89TWF0aC5zcXJ0KHItaSksYT1uLW8scz1uK287cmV0dXJuIGE8MCYmczwwP251bGw6dGhpcy5hdChhPDA/czphLGUpfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31kaXN0YW5jZVRvUGxhbmUodCl7Y29uc3QgZT10Lm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKDA9PT1lKXJldHVybiAwPT09dC5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pPzA6bnVsbDtjb25zdCBuPS0odGhpcy5vcmlnaW4uZG90KHQubm9ybWFsKSt0LmNvbnN0YW50KS9lO3JldHVybiBuPj0wP246bnVsbH1pbnRlcnNlY3RQbGFuZSh0LGUpe2NvbnN0IG49dGhpcy5kaXN0YW5jZVRvUGxhbmUodCk7cmV0dXJuIG51bGw9PT1uP251bGw6dGhpcy5hdChuLGUpfWludGVyc2VjdHNQbGFuZSh0KXtjb25zdCBlPXQuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKTtyZXR1cm4gMD09PWV8fHQubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbikqZTwwfWludGVyc2VjdEJveCh0LGUpe2xldCBuLGkscixvLGEscztjb25zdCBsPTEvdGhpcy5kaXJlY3Rpb24ueCxjPTEvdGhpcy5kaXJlY3Rpb24ueSx1PTEvdGhpcy5kaXJlY3Rpb24ueixoPXRoaXMub3JpZ2luO3JldHVybiBsPj0wPyhuPSh0Lm1pbi54LWgueCkqbCxpPSh0Lm1heC54LWgueCkqbCk6KG49KHQubWF4LngtaC54KSpsLGk9KHQubWluLngtaC54KSpsKSxjPj0wPyhyPSh0Lm1pbi55LWgueSkqYyxvPSh0Lm1heC55LWgueSkqYyk6KHI9KHQubWF4LnktaC55KSpjLG89KHQubWluLnktaC55KSpjKSxuPm98fHI+aT9udWxsOigocj5ufHxuIT1uKSYmKG49ciksKG88aXx8aSE9aSkmJihpPW8pLHU+PTA/KGE9KHQubWluLnotaC56KSp1LHM9KHQubWF4LnotaC56KSp1KTooYT0odC5tYXguei1oLnopKnUscz0odC5taW4uei1oLnopKnUpLG4+c3x8YT5pP251bGw6KChhPm58fG4hPW4pJiYobj1hKSwoczxpfHxpIT1pKSYmKGk9cyksaTwwP251bGw6dGhpcy5hdChuPj0wP246aSxlKSkpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIG51bGwhPT10aGlzLmludGVyc2VjdEJveCh0LEtKdCl9aW50ZXJzZWN0VHJpYW5nbGUodCxlLG4saSxyKXt0UXQuc3ViVmVjdG9ycyhlLHQpLGVRdC5zdWJWZWN0b3JzKG4sdCksblF0LmNyb3NzVmVjdG9ycyh0UXQsZVF0KTtsZXQgbyxhPXRoaXMuZGlyZWN0aW9uLmRvdChuUXQpO2lmKGE+MCl7aWYoaSlyZXR1cm4gbnVsbDtvPTF9ZWxzZXtpZighKGE8MCkpcmV0dXJuIG51bGw7bz0tMSxhPS1hfVFKdC5zdWJWZWN0b3JzKHRoaXMub3JpZ2luLHQpO2NvbnN0IHM9byp0aGlzLmRpcmVjdGlvbi5kb3QoZVF0LmNyb3NzVmVjdG9ycyhRSnQsZVF0KSk7aWYoczwwKXJldHVybiBudWxsO2NvbnN0IGw9byp0aGlzLmRpcmVjdGlvbi5kb3QodFF0LmNyb3NzKFFKdCkpO2lmKGw8MClyZXR1cm4gbnVsbDtpZihzK2w+YSlyZXR1cm4gbnVsbDtjb25zdCBjPS1vKlFKdC5kb3QoblF0KTtyZXR1cm4gYzwwP251bGw6dGhpcy5hdChjL2Escil9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLm9yaWdpbi5hcHBseU1hdHJpeDQodCksdGhpcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKHQpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm9yaWdpbi5lcXVhbHModGhpcy5vcmlnaW4pJiZ0LmRpcmVjdGlvbi5lcXVhbHModGhpcy5kaXJlY3Rpb24pfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfX1jbGFzcyByUXR7Y29uc3RydWN0b3IoKXt0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSxhcmd1bWVudHMubGVuZ3RoPjAmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuIil9c2V0KHQsZSxuLGkscixvLGEscyxsLGMsdSxoLGQscCxmLG0pe2NvbnN0IGc9dGhpcy5lbGVtZW50cztyZXR1cm4gZ1swXT10LGdbNF09ZSxnWzhdPW4sZ1sxMl09aSxnWzFdPXIsZ1s1XT1vLGdbOV09YSxnWzEzXT1zLGdbMl09bCxnWzZdPWMsZ1sxMF09dSxnWzE0XT1oLGdbM109ZCxnWzddPXAsZ1sxMV09ZixnWzE1XT1tLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31jbG9uZSgpe3JldHVybihuZXcgclF0KS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9Y29weSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO3JldHVybiBlWzBdPW5bMF0sZVsxXT1uWzFdLGVbMl09blsyXSxlWzNdPW5bM10sZVs0XT1uWzRdLGVbNV09bls1XSxlWzZdPW5bNl0sZVs3XT1uWzddLGVbOF09bls4XSxlWzldPW5bOV0sZVsxMF09blsxMF0sZVsxMV09blsxMV0sZVsxMl09blsxMl0sZVsxM109blsxM10sZVsxNF09blsxNF0sZVsxNV09blsxNV0sdGhpc31jb3B5UG9zaXRpb24odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVsxMl09blsxMl0sZVsxM109blsxM10sZVsxNF09blsxNF0sdGhpc31zZXRGcm9tTWF0cml4Myh0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMuc2V0KGVbMF0sZVszXSxlWzZdLDAsZVsxXSxlWzRdLGVbN10sMCxlWzJdLGVbNV0sZVs4XSwwLDAsMCwwLDEpLHRoaXN9ZXh0cmFjdEJhc2lzKHQsZSxuKXtyZXR1cm4gdC5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMCksZS5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMSksbi5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMiksdGhpc31tYWtlQmFzaXModCxlLG4pe3JldHVybiB0aGlzLnNldCh0LngsZS54LG4ueCwwLHQueSxlLnksbi55LDAsdC56LGUueixuLnosMCwwLDAsMCwxKSx0aGlzfWV4dHJhY3RSb3RhdGlvbih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzLGk9MS9vUXQuc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLHI9MS9vUXQuc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLG89MS9vUXQuc2V0RnJvbU1hdHJpeENvbHVtbih0LDIpLmxlbmd0aCgpO3JldHVybiBlWzBdPW5bMF0qaSxlWzFdPW5bMV0qaSxlWzJdPW5bMl0qaSxlWzNdPTAsZVs0XT1uWzRdKnIsZVs1XT1uWzVdKnIsZVs2XT1uWzZdKnIsZVs3XT0wLGVbOF09bls4XSpvLGVbOV09bls5XSpvLGVbMTBdPW5bMTBdKm8sZVsxMV09MCxlWzEyXT0wLGVbMTNdPTAsZVsxNF09MCxlWzE1XT0xLHRoaXN9bWFrZVJvdGF0aW9uRnJvbUV1bGVyKHQpe3QmJnQuaXNFdWxlcnx8Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLm1ha2VSb3RhdGlvbkZyb21FdWxlcigpIG5vdyBleHBlY3RzIGEgRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4iKTtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LngsaT10Lnkscj10Lnosbz1NYXRoLmNvcyhuKSxhPU1hdGguc2luKG4pLHM9TWF0aC5jb3MoaSksbD1NYXRoLnNpbihpKSxjPU1hdGguY29zKHIpLHU9TWF0aC5zaW4ocik7aWYoIlhZWiI9PT10Lm9yZGVyKXtjb25zdCB0PW8qYyxuPW8qdSxpPWEqYyxyPWEqdTtlWzBdPXMqYyxlWzRdPS1zKnUsZVs4XT1sLGVbMV09bitpKmwsZVs1XT10LXIqbCxlWzldPS1hKnMsZVsyXT1yLXQqbCxlWzZdPWkrbipsLGVbMTBdPW8qc31lbHNlIGlmKCJZWFoiPT09dC5vcmRlcil7Y29uc3QgdD1zKmMsbj1zKnUsaT1sKmMscj1sKnU7ZVswXT10K3IqYSxlWzRdPWkqYS1uLGVbOF09bypsLGVbMV09byp1LGVbNV09bypjLGVbOV09LWEsZVsyXT1uKmEtaSxlWzZdPXIrdCphLGVbMTBdPW8qc31lbHNlIGlmKCJaWFkiPT09dC5vcmRlcil7Y29uc3QgdD1zKmMsbj1zKnUsaT1sKmMscj1sKnU7ZVswXT10LXIqYSxlWzRdPS1vKnUsZVs4XT1pK24qYSxlWzFdPW4raSphLGVbNV09bypjLGVbOV09ci10KmEsZVsyXT0tbypsLGVbNl09YSxlWzEwXT1vKnN9ZWxzZSBpZigiWllYIj09PXQub3JkZXIpe2NvbnN0IHQ9bypjLG49byp1LGk9YSpjLHI9YSp1O2VbMF09cypjLGVbNF09aSpsLW4sZVs4XT10KmwrcixlWzFdPXMqdSxlWzVdPXIqbCt0LGVbOV09bipsLWksZVsyXT0tbCxlWzZdPWEqcyxlWzEwXT1vKnN9ZWxzZSBpZigiWVpYIj09PXQub3JkZXIpe2NvbnN0IHQ9bypzLG49bypsLGk9YSpzLHI9YSpsO2VbMF09cypjLGVbNF09ci10KnUsZVs4XT1pKnUrbixlWzFdPXUsZVs1XT1vKmMsZVs5XT0tYSpjLGVbMl09LWwqYyxlWzZdPW4qdStpLGVbMTBdPXQtcip1fWVsc2UgaWYoIlhaWSI9PT10Lm9yZGVyKXtjb25zdCB0PW8qcyxuPW8qbCxpPWEqcyxyPWEqbDtlWzBdPXMqYyxlWzRdPS11LGVbOF09bCpjLGVbMV09dCp1K3IsZVs1XT1vKmMsZVs5XT1uKnUtaSxlWzJdPWkqdS1uLGVbNl09YSpjLGVbMTBdPXIqdSt0fXJldHVybiBlWzNdPTAsZVs3XT0wLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLmNvbXBvc2Uoc1F0LHQsbFF0KX1sb29rQXQodCxlLG4pe2NvbnN0IGk9dGhpcy5lbGVtZW50cztyZXR1cm4gaFF0LnN1YlZlY3RvcnModCxlKSwwPT09aFF0Lmxlbmd0aFNxKCkmJihoUXQuej0xKSxoUXQubm9ybWFsaXplKCksY1F0LmNyb3NzVmVjdG9ycyhuLGhRdCksMD09PWNRdC5sZW5ndGhTcSgpJiYoMT09PU1hdGguYWJzKG4ueik/aFF0LngrPTFlLTQ6aFF0LnorPTFlLTQsaFF0Lm5vcm1hbGl6ZSgpLGNRdC5jcm9zc1ZlY3RvcnMobixoUXQpKSxjUXQubm9ybWFsaXplKCksdVF0LmNyb3NzVmVjdG9ycyhoUXQsY1F0KSxpWzBdPWNRdC54LGlbNF09dVF0LngsaVs4XT1oUXQueCxpWzFdPWNRdC55LGlbNV09dVF0LnksaVs5XT1oUXQueSxpWzJdPWNRdC56LGlbNl09dVF0LnosaVsxMF09aFF0LnosdGhpc31tdWx0aXBseSh0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5TWF0cmljZXMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LGUpKTp0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHQsdGhpcyl9bXVsdGlwbHlNYXRyaWNlcyh0LGUpe2NvbnN0IG49dC5lbGVtZW50cyxpPWUuZWxlbWVudHMscj10aGlzLmVsZW1lbnRzLG89blswXSxhPW5bNF0scz1uWzhdLGw9blsxMl0sYz1uWzFdLHU9bls1XSxoPW5bOV0sZD1uWzEzXSxwPW5bMl0sZj1uWzZdLG09blsxMF0sZz1uWzE0XSxfPW5bM10seT1uWzddLHY9blsxMV0sYj1uWzE1XSx4PWlbMF0sdz1pWzRdLFM9aVs4XSxNPWlbMTJdLEU9aVsxXSxUPWlbNV0sQz1pWzldLEE9aVsxM10saz1pWzJdLEw9aVs2XSxQPWlbMTBdLE49aVsxNF0sST1pWzNdLFI9aVs3XSxPPWlbMTFdLHo9aVsxNV07cmV0dXJuIHJbMF09byp4K2EqRStzKmsrbCpJLHJbNF09byp3K2EqVCtzKkwrbCpSLHJbOF09bypTK2EqQytzKlArbCpPLHJbMTJdPW8qTSthKkErcypOK2wqeixyWzFdPWMqeCt1KkUraCprK2QqSSxyWzVdPWMqdyt1KlQraCpMK2QqUixyWzldPWMqUyt1KkMraCpQK2QqTyxyWzEzXT1jKk0rdSpBK2gqTitkKnosclsyXT1wKngrZipFK20qaytnKkkscls2XT1wKncrZipUK20qTCtnKlIsclsxMF09cCpTK2YqQyttKlArZypPLHJbMTRdPXAqTStmKkErbSpOK2cqeixyWzNdPV8qeCt5KkUrdiprK2IqSSxyWzddPV8qdyt5KlQrdipMK2IqUixyWzExXT1fKlMreSpDK3YqUCtiKk8sclsxNV09XypNK3kqQSt2Kk4rYip6LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbNF0qPXQsZVs4XSo9dCxlWzEyXSo9dCxlWzFdKj10LGVbNV0qPXQsZVs5XSo9dCxlWzEzXSo9dCxlWzJdKj10LGVbNl0qPXQsZVsxMF0qPXQsZVsxNF0qPXQsZVszXSo9dCxlWzddKj10LGVbMTFdKj10LGVbMTVdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFs0XSxpPXRbOF0scj10WzEyXSxvPXRbMV0sYT10WzVdLHM9dFs5XSxsPXRbMTNdLGM9dFsyXSx1PXRbNl0saD10WzEwXSxkPXRbMTRdO3JldHVybiB0WzNdKigrcipzKnUtaSpsKnUtciphKmgrbipsKmgraSphKmQtbipzKmQpK3RbN10qKCtlKnMqZC1lKmwqaCtyKm8qaC1pKm8qZCtpKmwqYy1yKnMqYykrdFsxMV0qKCtlKmwqdS1lKmEqZC1yKm8qdStuKm8qZCtyKmEqYy1uKmwqYykrdFsxNV0qKC1pKmEqYy1lKnMqdStlKmEqaCtpKm8qdS1uKm8qaCtuKnMqYyl9dHJhbnNwb3NlKCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzO2xldCBlO3JldHVybiBlPXRbMV0sdFsxXT10WzRdLHRbNF09ZSxlPXRbMl0sdFsyXT10WzhdLHRbOF09ZSxlPXRbNl0sdFs2XT10WzldLHRbOV09ZSxlPXRbM10sdFszXT10WzEyXSx0WzEyXT1lLGU9dFs3XSx0WzddPXRbMTNdLHRbMTNdPWUsZT10WzExXSx0WzExXT10WzE0XSx0WzE0XT1lLHRoaXN9c2V0UG9zaXRpb24odCxlLG4pe2NvbnN0IGk9dGhpcy5lbGVtZW50cztyZXR1cm4gdC5pc1ZlY3RvcjM/KGlbMTJdPXQueCxpWzEzXT10LnksaVsxNF09dC56KTooaVsxMl09dCxpWzEzXT1lLGlbMTRdPW4pLHRoaXN9aW52ZXJ0KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbMV0saT10WzJdLHI9dFszXSxvPXRbNF0sYT10WzVdLHM9dFs2XSxsPXRbN10sYz10WzhdLHU9dFs5XSxoPXRbMTBdLGQ9dFsxMV0scD10WzEyXSxmPXRbMTNdLG09dFsxNF0sZz10WzE1XSxfPXUqbSpsLWYqaCpsK2YqcypkLWEqbSpkLXUqcypnK2EqaCpnLHk9cCpoKmwtYyptKmwtcCpzKmQrbyptKmQrYypzKmctbypoKmcsdj1jKmYqbC1wKnUqbCtwKmEqZC1vKmYqZC1jKmEqZytvKnUqZyxiPXAqdSpzLWMqZipzLXAqYSpoK28qZipoK2MqYSptLW8qdSptLHg9ZSpfK24qeStpKnYrcipiO2lmKDA9PT14KXJldHVybiB0aGlzLnNldCgwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwKTtjb25zdCB3PTEveDtyZXR1cm4gdFswXT1fKncsdFsxXT0oZipoKnItdSptKnItZippKmQrbiptKmQrdSppKmctbipoKmcpKncsdFsyXT0oYSptKnItZipzKnIrZippKmwtbiptKmwtYSppKmcrbipzKmcpKncsdFszXT0odSpzKnItYSpoKnItdSppKmwrbipoKmwrYSppKmQtbipzKmQpKncsdFs0XT15KncsdFs1XT0oYyptKnItcCpoKnIrcCppKmQtZSptKmQtYyppKmcrZSpoKmcpKncsdFs2XT0ocCpzKnItbyptKnItcCppKmwrZSptKmwrbyppKmctZSpzKmcpKncsdFs3XT0obypoKnItYypzKnIrYyppKmwtZSpoKmwtbyppKmQrZSpzKmQpKncsdFs4XT12KncsdFs5XT0ocCp1KnItYypmKnItcCpuKmQrZSpmKmQrYypuKmctZSp1KmcpKncsdFsxMF09KG8qZipyLXAqYSpyK3AqbipsLWUqZipsLW8qbipnK2UqYSpnKSp3LHRbMTFdPShjKmEqci1vKnUqci1jKm4qbCtlKnUqbCtvKm4qZC1lKmEqZCkqdyx0WzEyXT1iKncsdFsxM109KGMqZippLXAqdSppK3AqbipoLWUqZipoLWMqbiptK2UqdSptKSp3LHRbMTRdPShwKmEqaS1vKmYqaS1wKm4qcytlKmYqcytvKm4qbS1lKmEqbSkqdyx0WzE1XT0obyp1KmktYyphKmkrYypuKnMtZSp1KnMtbypuKmgrZSphKmgpKncsdGhpc31zY2FsZSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LngsaT10Lnkscj10Lno7cmV0dXJuIGVbMF0qPW4sZVs0XSo9aSxlWzhdKj1yLGVbMV0qPW4sZVs1XSo9aSxlWzldKj1yLGVbMl0qPW4sZVs2XSo9aSxlWzEwXSo9cixlWzNdKj1uLGVbN10qPWksZVsxMV0qPXIsdGhpc31nZXRNYXhTY2FsZU9uQXhpcygpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cztyZXR1cm4gTWF0aC5zcXJ0KE1hdGgubWF4KHRbMF0qdFswXSt0WzFdKnRbMV0rdFsyXSp0WzJdLHRbNF0qdFs0XSt0WzVdKnRbNV0rdFs2XSp0WzZdLHRbOF0qdFs4XSt0WzldKnRbOV0rdFsxMF0qdFsxMF0pKX1tYWtlVHJhbnNsYXRpb24odCxlLG4pe3JldHVybiB0aGlzLnNldCgxLDAsMCx0LDAsMSwwLGUsMCwwLDEsbiwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvblgodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDAsZSwtbiwwLDAsbixlLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25ZKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoZSwwLG4sMCwwLDEsMCwwLC1uLDAsZSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWih0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsLW4sMCwwLG4sZSwwLDAsMCwwLDEsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbkF4aXModCxlKXtjb25zdCBuPU1hdGguY29zKGUpLGk9TWF0aC5zaW4oZSkscj0xLW4sbz10LngsYT10Lnkscz10LnosbD1yKm8sYz1yKmE7cmV0dXJuIHRoaXMuc2V0KGwqbytuLGwqYS1pKnMsbCpzK2kqYSwwLGwqYStpKnMsYyphK24sYypzLWkqbywwLGwqcy1pKmEsYypzK2kqbyxyKnMqcytuLDAsMCwwLDAsMSksdGhpc31tYWtlU2NhbGUodCxlLG4pe3JldHVybiB0aGlzLnNldCh0LDAsMCwwLDAsZSwwLDAsMCwwLG4sMCwwLDAsMCwxKSx0aGlzfW1ha2VTaGVhcih0LGUsbixpLHIsbyl7cmV0dXJuIHRoaXMuc2V0KDEsbixyLDAsdCwxLG8sMCxlLGksMSwwLDAsMCwwLDEpLHRoaXN9Y29tcG9zZSh0LGUsbil7Y29uc3QgaT10aGlzLmVsZW1lbnRzLHI9ZS5feCxvPWUuX3ksYT1lLl96LHM9ZS5fdyxsPXIrcixjPW8rbyx1PWErYSxoPXIqbCxkPXIqYyxwPXIqdSxmPW8qYyxtPW8qdSxnPWEqdSxfPXMqbCx5PXMqYyx2PXMqdSxiPW4ueCx4PW4ueSx3PW4uejtyZXR1cm4gaVswXT0oMS0oZitnKSkqYixpWzFdPShkK3YpKmIsaVsyXT0ocC15KSpiLGlbM109MCxpWzRdPShkLXYpKngsaVs1XT0oMS0oaCtnKSkqeCxpWzZdPShtK18pKngsaVs3XT0wLGlbOF09KHAreSkqdyxpWzldPShtLV8pKncsaVsxMF09KDEtKGgrZikpKncsaVsxMV09MCxpWzEyXT10LngsaVsxM109dC55LGlbMTRdPXQueixpWzE1XT0xLHRoaXN9ZGVjb21wb3NlKHQsZSxuKXtjb25zdCBpPXRoaXMuZWxlbWVudHM7bGV0IHI9b1F0LnNldChpWzBdLGlbMV0saVsyXSkubGVuZ3RoKCk7Y29uc3Qgbz1vUXQuc2V0KGlbNF0saVs1XSxpWzZdKS5sZW5ndGgoKSxhPW9RdC5zZXQoaVs4XSxpWzldLGlbMTBdKS5sZW5ndGgoKTt0aGlzLmRldGVybWluYW50KCk8MCYmKHI9LXIpLHQueD1pWzEyXSx0Lnk9aVsxM10sdC56PWlbMTRdLGFRdC5jb3B5KHRoaXMpO2NvbnN0IHM9MS9yLGw9MS9vLGM9MS9hO3JldHVybiBhUXQuZWxlbWVudHNbMF0qPXMsYVF0LmVsZW1lbnRzWzFdKj1zLGFRdC5lbGVtZW50c1syXSo9cyxhUXQuZWxlbWVudHNbNF0qPWwsYVF0LmVsZW1lbnRzWzVdKj1sLGFRdC5lbGVtZW50c1s2XSo9bCxhUXQuZWxlbWVudHNbOF0qPWMsYVF0LmVsZW1lbnRzWzldKj1jLGFRdC5lbGVtZW50c1sxMF0qPWMsZS5zZXRGcm9tUm90YXRpb25NYXRyaXgoYVF0KSxuLng9cixuLnk9byxuLno9YSx0aGlzfW1ha2VQZXJzcGVjdGl2ZSh0LGUsbixpLHIsbyl7dm9pZCAwPT09byYmY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubWFrZVBlcnNwZWN0aXZlKCkgaGFzIGJlZW4gcmVkZWZpbmVkIGFuZCBoYXMgYSBuZXcgc2lnbmF0dXJlLiBQbGVhc2UgY2hlY2sgdGhlIGRvY3MuIik7Y29uc3QgYT10aGlzLmVsZW1lbnRzLHM9MipyLyhuLWkpLGw9KGUrdCkvKGUtdCksYz0obitpKS8obi1pKSx1PS0obytyKS8oby1yKSxoPS0yKm8qci8oby1yKTtyZXR1cm4gYVswXT0yKnIvKGUtdCksYVs0XT0wLGFbOF09bCxhWzEyXT0wLGFbMV09MCxhWzVdPXMsYVs5XT1jLGFbMTNdPTAsYVsyXT0wLGFbNl09MCxhWzEwXT11LGFbMTRdPWgsYVszXT0wLGFbN109MCxhWzExXT0tMSxhWzE1XT0wLHRoaXN9bWFrZU9ydGhvZ3JhcGhpYyh0LGUsbixpLHIsbyl7Y29uc3QgYT10aGlzLmVsZW1lbnRzLHM9MS8oZS10KSxsPTEvKG4taSksYz0xLyhvLXIpLHU9KGUrdCkqcyxoPShuK2kpKmwsZD0obytyKSpjO3JldHVybiBhWzBdPTIqcyxhWzRdPTAsYVs4XT0wLGFbMTJdPS11LGFbMV09MCxhWzVdPTIqbCxhWzldPTAsYVsxM109LWgsYVsyXT0wLGFbNl09MCxhWzEwXT0tMipjLGFbMTRdPS1kLGFbM109MCxhWzddPTAsYVsxMV09MCxhWzE1XT0xLHRoaXN9ZXF1YWxzKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7Zm9yKGxldCB0PTA7dDwxNjt0KyspaWYoZVt0XSE9PW5bdF0pcmV0dXJuITE7cmV0dXJuITB9ZnJvbUFycmF5KHQsZT0wKXtmb3IobGV0IG49MDtuPDE2O24rKyl0aGlzLmVsZW1lbnRzW25dPXRbbitlXTtyZXR1cm4gdGhpc310b0FycmF5KHQ9W10sZT0wKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbZV09blswXSx0W2UrMV09blsxXSx0W2UrMl09blsyXSx0W2UrM109blszXSx0W2UrNF09bls0XSx0W2UrNV09bls1XSx0W2UrNl09bls2XSx0W2UrN109bls3XSx0W2UrOF09bls4XSx0W2UrOV09bls5XSx0W2UrMTBdPW5bMTBdLHRbZSsxMV09blsxMV0sdFtlKzEyXT1uWzEyXSx0W2UrMTNdPW5bMTNdLHRbZSsxNF09blsxNF0sdFtlKzE1XT1uWzE1XSx0fX1yUXQucHJvdG90eXBlLmlzTWF0cml4ND0hMDtjb25zdCBvUXQ9bmV3IENKdCxhUXQ9bmV3IHJRdCxzUXQ9bmV3IENKdCgwLDAsMCksbFF0PW5ldyBDSnQoMSwxLDEpLGNRdD1uZXcgQ0p0LHVRdD1uZXcgQ0p0LGhRdD1uZXcgQ0p0LGRRdD1uZXcgclF0LHBRdD1uZXcgVEp0O2NsYXNzIGZRdHtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCxpPWZRdC5EZWZhdWx0T3JkZXIpe3RoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX29yZGVyPWl9Z2V0IHgoKXtyZXR1cm4gdGhpcy5feH1zZXQgeCh0KXt0aGlzLl94PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3l9c2V0IHkodCl7dGhpcy5feT10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeigpe3JldHVybiB0aGlzLl96fXNldCB6KHQpe3RoaXMuX3o9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IG9yZGVyKCl7cmV0dXJuIHRoaXMuX29yZGVyfXNldCBvcmRlcih0KXt0aGlzLl9vcmRlcj10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1zZXQodCxlLG4saT10aGlzLl9vcmRlcil7cmV0dXJuIHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX29yZGVyPWksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3osdGhpcy5fb3JkZXIpfWNvcHkodCl7cmV0dXJuIHRoaXMuX3g9dC5feCx0aGlzLl95PXQuX3ksdGhpcy5fej10Ll96LHRoaXMuX29yZGVyPXQuX29yZGVyLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Sb3RhdGlvbk1hdHJpeCh0LGU9dGhpcy5fb3JkZXIsbj0hMCl7Y29uc3QgaT10LmVsZW1lbnRzLHI9aVswXSxvPWlbNF0sYT1pWzhdLHM9aVsxXSxsPWlbNV0sYz1pWzldLHU9aVsyXSxoPWlbNl0sZD1pWzEwXTtzd2l0Y2goZSl7Y2FzZSJYWVoiOnRoaXMuX3k9TWF0aC5hc2luKCRadChhLC0xLDEpKSxNYXRoLmFicyhhKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1jLGQpLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxyKSk6KHRoaXMuX3g9TWF0aC5hdGFuMihoLGwpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJZWFoiOnRoaXMuX3g9TWF0aC5hc2luKC0kWnQoYywtMSwxKSksTWF0aC5hYnMoYyk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMihhLGQpLHRoaXMuX3o9TWF0aC5hdGFuMihzLGwpKToodGhpcy5feT1NYXRoLmF0YW4yKC11LHIpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9TWF0aC5hc2luKCRadChoLC0xLDEpKSxNYXRoLmFicyhoKTwuOTk5OTk5OT8odGhpcy5feT1NYXRoLmF0YW4yKC11LGQpLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxsKSk6KHRoaXMuX3k9MCx0aGlzLl96PU1hdGguYXRhbjIocyxyKSk7YnJlYWs7Y2FzZSJaWVgiOnRoaXMuX3k9TWF0aC5hc2luKC0kWnQodSwtMSwxKSksTWF0aC5hYnModSk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMihoLGQpLHRoaXMuX3o9TWF0aC5hdGFuMihzLHIpKToodGhpcy5feD0wLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxsKSk7YnJlYWs7Y2FzZSJZWlgiOnRoaXMuX3o9TWF0aC5hc2luKCRadChzLC0xLDEpKSxNYXRoLmFicyhzKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1jLGwpLHRoaXMuX3k9TWF0aC5hdGFuMigtdSxyKSk6KHRoaXMuX3g9MCx0aGlzLl95PU1hdGguYXRhbjIoYSxkKSk7YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3o9TWF0aC5hc2luKC0kWnQobywtMSwxKSksTWF0aC5hYnMobyk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMihoLGwpLHRoaXMuX3k9TWF0aC5hdGFuMihhLHIpKToodGhpcy5feD1NYXRoLmF0YW4yKC1jLGQpLHRoaXMuX3k9MCk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLkV1bGVyOiAuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogIitlKX1yZXR1cm4gdGhpcy5fb3JkZXI9ZSwhMD09PW4mJnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21RdWF0ZXJuaW9uKHQsZSxuKXtyZXR1cm4gZFF0Lm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KGRRdCxlLG4pfXNldEZyb21WZWN0b3IzKHQsZT10aGlzLl9vcmRlcil7cmV0dXJuIHRoaXMuc2V0KHQueCx0LnksdC56LGUpfXJlb3JkZXIodCl7cmV0dXJuIHBRdC5zZXRGcm9tRXVsZXIodGhpcyksdGhpcy5zZXRGcm9tUXVhdGVybmlvbihwUXQsdCl9ZXF1YWxzKHQpe3JldHVybiB0Ll94PT09dGhpcy5feCYmdC5feT09PXRoaXMuX3kmJnQuX3o9PT10aGlzLl96JiZ0Ll9vcmRlcj09PXRoaXMuX29yZGVyfWZyb21BcnJheSh0KXtyZXR1cm4gdGhpcy5feD10WzBdLHRoaXMuX3k9dFsxXSx0aGlzLl96PXRbMl0sdm9pZCAwIT09dFszXSYmKHRoaXMuX29yZGVyPXRbM10pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX29yZGVyLHR9dG9WZWN0b3IzKHQpe3JldHVybiB0P3Quc2V0KHRoaXMuX3gsdGhpcy5feSx0aGlzLl96KTpuZXcgQ0p0KHRoaXMuX3gsdGhpcy5feSx0aGlzLl96KX1fb25DaGFuZ2UodCl7cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9dCx0aGlzfV9vbkNoYW5nZUNhbGxiYWNrKCl7fX1mUXQucHJvdG90eXBlLmlzRXVsZXI9ITAsZlF0LkRlZmF1bHRPcmRlcj0iWFlaIixmUXQuUm90YXRpb25PcmRlcnM9WyJYWVoiLCJZWlgiLCJaWFkiLCJYWlkiLCJZWFoiLCJaWVgiXTtjbGFzcyBtUXR7Y29uc3RydWN0b3IoKXt0aGlzLm1hc2s9MX1zZXQodCl7dGhpcy5tYXNrPTE8PHR8MH1lbmFibGUodCl7dGhpcy5tYXNrfD0xPDx0fDB9ZW5hYmxlQWxsKCl7dGhpcy5tYXNrPS0xfXRvZ2dsZSh0KXt0aGlzLm1hc2tePTE8PHR8MH1kaXNhYmxlKHQpe3RoaXMubWFzayY9figxPDx0fDApfWRpc2FibGVBbGwoKXt0aGlzLm1hc2s9MH10ZXN0KHQpe3JldHVybiAwIT0odGhpcy5tYXNrJnQubWFzayl9fWxldCBnUXQ9MDtjb25zdCBfUXQ9bmV3IENKdCx5UXQ9bmV3IFRKdCx2UXQ9bmV3IHJRdCxiUXQ9bmV3IENKdCx4UXQ9bmV3IENKdCx3UXQ9bmV3IENKdCxTUXQ9bmV3IFRKdCxNUXQ9bmV3IENKdCgxLDAsMCksRVF0PW5ldyBDSnQoMCwxLDApLFRRdD1uZXcgQ0p0KDAsMCwxKSxDUXQ9e3R5cGU6ImFkZGVkIn0sQVF0PXt0eXBlOiJyZW1vdmVkIn07Y2xhc3Mga1F0IGV4dGVuZHMgalp0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpnUXQrK30pLHRoaXMudXVpZD1YWnQoKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJPYmplY3QzRCIsdGhpcy5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuPVtdLHRoaXMudXA9a1F0LkRlZmF1bHRVcC5jbG9uZSgpO2NvbnN0IHQ9bmV3IENKdCxlPW5ldyBmUXQsbj1uZXcgVEp0LGk9bmV3IENKdCgxLDEsMSk7ZS5fb25DaGFuZ2UoKGZ1bmN0aW9uIHIoKXtuLnNldEZyb21FdWxlcihlLCExKX0pKSxuLl9vbkNoYW5nZSgoZnVuY3Rpb24gbygpe2Uuc2V0RnJvbVF1YXRlcm5pb24obix2b2lkIDAsITEpfSkpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3Bvc2l0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTp0fSxyb3RhdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZX0scXVhdGVybmlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bn0sc2NhbGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOml9LG1vZGVsVmlld01hdHJpeDp7dmFsdWU6bmV3IHJRdH0sbm9ybWFsTWF0cml4Ont2YWx1ZTpuZXcgZ0p0fX0pLHRoaXMubWF0cml4PW5ldyByUXQsdGhpcy5tYXRyaXhXb3JsZD1uZXcgclF0LHRoaXMubWF0cml4QXV0b1VwZGF0ZT1rUXQuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGUsdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLHRoaXMubGF5ZXJzPW5ldyBtUXQsdGhpcy52aXNpYmxlPSEwLHRoaXMuY2FzdFNoYWRvdz0hMSx0aGlzLnJlY2VpdmVTaGFkb3c9ITEsdGhpcy5mcnVzdHVtQ3VsbGVkPSEwLHRoaXMucmVuZGVyT3JkZXI9MCx0aGlzLmFuaW1hdGlvbnM9W10sdGhpcy51c2VyRGF0YT17fX1vbkJlZm9yZVJlbmRlcigpe31vbkFmdGVyUmVuZGVyKCl7fWFwcGx5TWF0cml4NCh0KXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5tYXRyaXgucHJlbXVsdGlwbHkodCksdGhpcy5tYXRyaXguZGVjb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpfWFwcGx5UXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KHQpLHRoaXN9c2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlKHQsZSl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUodCxlKX1zZXRSb3RhdGlvbkZyb21FdWxlcih0KXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKHQsITApfXNldFJvdGF0aW9uRnJvbU1hdHJpeCh0KXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KHQpfXNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCl7dGhpcy5xdWF0ZXJuaW9uLmNvcHkodCl9cm90YXRlT25BeGlzKHQsZSl7cmV0dXJuIHlRdC5zZXRGcm9tQXhpc0FuZ2xlKHQsZSksdGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KHlRdCksdGhpc31yb3RhdGVPbldvcmxkQXhpcyh0LGUpe3JldHVybiB5UXQuc2V0RnJvbUF4aXNBbmdsZSh0LGUpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSh5UXQpLHRoaXN9cm90YXRlWCh0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoTVF0LHQpfXJvdGF0ZVkodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKEVRdCx0KX1yb3RhdGVaKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhUUXQsdCl9dHJhbnNsYXRlT25BeGlzKHQsZSl7cmV0dXJuIF9RdC5jb3B5KHQpLmFwcGx5UXVhdGVybmlvbih0aGlzLnF1YXRlcm5pb24pLHRoaXMucG9zaXRpb24uYWRkKF9RdC5tdWx0aXBseVNjYWxhcihlKSksdGhpc310cmFuc2xhdGVYKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhNUXQsdCl9dHJhbnNsYXRlWSh0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoRVF0LHQpfXRyYW5zbGF0ZVoodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKFRRdCx0KX1sb2NhbFRvV29ybGQodCl7cmV0dXJuIHQuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpfXdvcmxkVG9Mb2NhbCh0KXtyZXR1cm4gdC5hcHBseU1hdHJpeDQodlF0LmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkpfWxvb2tBdCh0LGUsbil7dC5pc1ZlY3RvcjM/YlF0LmNvcHkodCk6YlF0LnNldCh0LGUsbik7Y29uc3QgaT10aGlzLnBhcmVudDt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx4UXQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpLHRoaXMuaXNDYW1lcmF8fHRoaXMuaXNMaWdodD92UXQubG9va0F0KHhRdCxiUXQsdGhpcy51cCk6dlF0Lmxvb2tBdChiUXQseFF0LHRoaXMudXApLHRoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgodlF0KSxpJiYodlF0LmV4dHJhY3RSb3RhdGlvbihpLm1hdHJpeFdvcmxkKSx5UXQuc2V0RnJvbVJvdGF0aW9uTWF0cml4KHZRdCksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KHlRdC5pbnZlcnQoKSkpfWFkZCh0KXtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2ZvcihsZXQgdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspdGhpcy5hZGQoYXJndW1lbnRzW3RdKTtyZXR1cm4gdGhpc31yZXR1cm4gdD09PXRoaXM/KGNvbnNvbGUuZXJyb3IoIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IGNhbid0IGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgaXRzZWxmLiIsdCksdGhpcyk6KHQmJnQuaXNPYmplY3QzRD8obnVsbCE9PXQucGFyZW50JiZ0LnBhcmVudC5yZW1vdmUodCksdC5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkcmVuLnB1c2godCksdC5kaXNwYXRjaEV2ZW50KENRdCkpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC4iLHQpLHRoaXMpfXJlbW92ZSh0KXtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2ZvcihsZXQgdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspdGhpcy5yZW1vdmUoYXJndW1lbnRzW3RdKTtyZXR1cm4gdGhpc31jb25zdCBlPXRoaXMuY2hpbGRyZW4uaW5kZXhPZih0KTtyZXR1cm4tMSE9PWUmJih0LnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW4uc3BsaWNlKGUsMSksdC5kaXNwYXRjaEV2ZW50KEFRdCkpLHRoaXN9cmVtb3ZlRnJvbVBhcmVudCgpe2NvbnN0IHQ9dGhpcy5wYXJlbnQ7cmV0dXJuIG51bGwhPT10JiZ0LnJlbW92ZSh0aGlzKSx0aGlzfWNsZWFyKCl7Zm9yKGxldCB0PTA7dDx0aGlzLmNoaWxkcmVuLmxlbmd0aDt0Kyspe2NvbnN0IGU9dGhpcy5jaGlsZHJlblt0XTtlLnBhcmVudD1udWxsLGUuZGlzcGF0Y2hFdmVudChBUXQpfXJldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aD0wLHRoaXN9YXR0YWNoKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx2UXQuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSxudWxsIT09dC5wYXJlbnQmJih0LnBhcmVudC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdlF0Lm11bHRpcGx5KHQucGFyZW50Lm1hdHJpeFdvcmxkKSksdC5hcHBseU1hdHJpeDQodlF0KSx0aGlzLmFkZCh0KSx0LnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKSx0aGlzfWdldE9iamVjdEJ5SWQodCl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgiaWQiLHQpfWdldE9iamVjdEJ5TmFtZSh0KXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJuYW1lIix0KX1nZXRPYmplY3RCeVByb3BlcnR5KHQsZSl7aWYodGhpc1t0XT09PWUpcmV0dXJuIHRoaXM7Zm9yKGxldCBuPTAsaT10aGlzLmNoaWxkcmVuLmxlbmd0aDtuPGk7bisrKXtjb25zdCBpPXRoaXMuY2hpbGRyZW5bbl0uZ2V0T2JqZWN0QnlQcm9wZXJ0eSh0LGUpO2lmKHZvaWQgMCE9PWkpcmV0dXJuIGl9fWdldFdvcmxkUG9zaXRpb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpfWdldFdvcmxkUXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoeFF0LHQsd1F0KSx0fWdldFdvcmxkU2NhbGUodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKHhRdCxTUXQsdCksdH1nZXRXb3JsZERpcmVjdGlvbih0KXt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTtjb25zdCBlPXRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7cmV0dXJuIHQuc2V0KGVbOF0sZVs5XSxlWzEwXSkubm9ybWFsaXplKCl9cmF5Y2FzdCgpe310cmF2ZXJzZSh0KXt0KHRoaXMpO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxpPWUubGVuZ3RoO248aTtuKyspZVtuXS50cmF2ZXJzZSh0KX10cmF2ZXJzZVZpc2libGUodCl7aWYoITE9PT10aGlzLnZpc2libGUpcmV0dXJuO3QodGhpcyk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLGk9ZS5sZW5ndGg7bjxpO24rKyllW25dLnRyYXZlcnNlVmlzaWJsZSh0KX10cmF2ZXJzZUFuY2VzdG9ycyh0KXtjb25zdCBlPXRoaXMucGFyZW50O251bGwhPT1lJiYodChlKSxlLnRyYXZlcnNlQW5jZXN0b3JzKHQpKX11cGRhdGVNYXRyaXgoKXt0aGlzLm1hdHJpeC5jb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH11cGRhdGVNYXRyaXhXb3JsZCh0KXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksKHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZXx8dCkmJihudWxsPT09dGhpcy5wYXJlbnQ/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSx0PSEwKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAsaT1lLmxlbmd0aDtuPGk7bisrKWVbbl0udXBkYXRlTWF0cml4V29ybGQodCl9dXBkYXRlV29ybGRNYXRyaXgodCxlKXtjb25zdCBuPXRoaXMucGFyZW50O2lmKCEwPT09dCYmbnVsbCE9PW4mJm4udXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSxudWxsPT09dGhpcy5wYXJlbnQ/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpLCEwPT09ZSl7Y29uc3QgdD10aGlzLmNoaWxkcmVuO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl0W2VdLnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKX19dG9KU09OKHQpe2NvbnN0IGU9dm9pZCAwPT09dHx8InN0cmluZyI9PXR5cGVvZiB0LG49e307ZSYmKHQ9e2dlb21ldHJpZXM6e30sbWF0ZXJpYWxzOnt9LHRleHR1cmVzOnt9LGltYWdlczp7fSxzaGFwZXM6e30sc2tlbGV0b25zOnt9LGFuaW1hdGlvbnM6e319LG4ubWV0YWRhdGE9e3ZlcnNpb246NC41LHR5cGU6Ik9iamVjdCIsZ2VuZXJhdG9yOiJPYmplY3QzRC50b0pTT04ifSk7Y29uc3QgaT17fTtmdW5jdGlvbiByKGUsbil7cmV0dXJuIHZvaWQgMD09PWVbbi51dWlkXSYmKGVbbi51dWlkXT1uLnRvSlNPTih0KSksbi51dWlkfWlmKGkudXVpZD10aGlzLnV1aWQsaS50eXBlPXRoaXMudHlwZSwiIiE9PXRoaXMubmFtZSYmKGkubmFtZT10aGlzLm5hbWUpLCEwPT09dGhpcy5jYXN0U2hhZG93JiYoaS5jYXN0U2hhZG93PSEwKSwhMD09PXRoaXMucmVjZWl2ZVNoYWRvdyYmKGkucmVjZWl2ZVNoYWRvdz0hMCksITE9PT10aGlzLnZpc2libGUmJihpLnZpc2libGU9ITEpLCExPT09dGhpcy5mcnVzdHVtQ3VsbGVkJiYoaS5mcnVzdHVtQ3VsbGVkPSExKSwwIT09dGhpcy5yZW5kZXJPcmRlciYmKGkucmVuZGVyT3JkZXI9dGhpcy5yZW5kZXJPcmRlciksInt9IiE9PUpTT04uc3RyaW5naWZ5KHRoaXMudXNlckRhdGEpJiYoaS51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSxpLmxheWVycz10aGlzLmxheWVycy5tYXNrLGkubWF0cml4PXRoaXMubWF0cml4LnRvQXJyYXkoKSwhMT09PXRoaXMubWF0cml4QXV0b1VwZGF0ZSYmKGkubWF0cml4QXV0b1VwZGF0ZT0hMSksdGhpcy5pc0luc3RhbmNlZE1lc2gmJihpLnR5cGU9Ikluc3RhbmNlZE1lc2giLGkuY291bnQ9dGhpcy5jb3VudCxpLmluc3RhbmNlTWF0cml4PXRoaXMuaW5zdGFuY2VNYXRyaXgudG9KU09OKCksbnVsbCE9PXRoaXMuaW5zdGFuY2VDb2xvciYmKGkuaW5zdGFuY2VDb2xvcj10aGlzLmluc3RhbmNlQ29sb3IudG9KU09OKCkpKSx0aGlzLmlzU2NlbmUpdGhpcy5iYWNrZ3JvdW5kJiYodGhpcy5iYWNrZ3JvdW5kLmlzQ29sb3I/aS5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04oKTp0aGlzLmJhY2tncm91bmQuaXNUZXh0dXJlJiYoaS5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04odCkudXVpZCkpLHRoaXMuZW52aXJvbm1lbnQmJnRoaXMuZW52aXJvbm1lbnQuaXNUZXh0dXJlJiYoaS5lbnZpcm9ubWVudD10aGlzLmVudmlyb25tZW50LnRvSlNPTih0KS51dWlkKTtlbHNlIGlmKHRoaXMuaXNNZXNofHx0aGlzLmlzTGluZXx8dGhpcy5pc1BvaW50cyl7aS5nZW9tZXRyeT1yKHQuZ2VvbWV0cmllcyx0aGlzLmdlb21ldHJ5KTtjb25zdCBlPXRoaXMuZ2VvbWV0cnkucGFyYW1ldGVycztpZih2b2lkIDAhPT1lJiZ2b2lkIDAhPT1lLnNoYXBlcyl7Y29uc3Qgbj1lLnNoYXBlcztpZihBcnJheS5pc0FycmF5KG4pKWZvcihsZXQgZT0wLGk9bi5sZW5ndGg7ZTxpO2UrKylyKHQuc2hhcGVzLG5bZV0pO2Vsc2Ugcih0LnNoYXBlcyxuKX19aWYodGhpcy5pc1NraW5uZWRNZXNoJiYoaS5iaW5kTW9kZT10aGlzLmJpbmRNb2RlLGkuYmluZE1hdHJpeD10aGlzLmJpbmRNYXRyaXgudG9BcnJheSgpLHZvaWQgMCE9PXRoaXMuc2tlbGV0b24mJihyKHQuc2tlbGV0b25zLHRoaXMuc2tlbGV0b24pLGkuc2tlbGV0b249dGhpcy5za2VsZXRvbi51dWlkKSksdm9pZCAwIT09dGhpcy5tYXRlcmlhbClpZihBcnJheS5pc0FycmF5KHRoaXMubWF0ZXJpYWwpKXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wLGk9dGhpcy5tYXRlcmlhbC5sZW5ndGg7bjxpO24rKyllLnB1c2gocih0Lm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsW25dKSk7aS5tYXRlcmlhbD1lfWVsc2UgaS5tYXRlcmlhbD1yKHQubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWwpO2lmKHRoaXMuY2hpbGRyZW4ubGVuZ3RoPjApe2kuY2hpbGRyZW49W107Zm9yKGxldCBlPTA7ZTx0aGlzLmNoaWxkcmVuLmxlbmd0aDtlKyspaS5jaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5bZV0udG9KU09OKHQpLm9iamVjdCl9aWYodGhpcy5hbmltYXRpb25zLmxlbmd0aD4wKXtpLmFuaW1hdGlvbnM9W107Zm9yKGxldCBlPTA7ZTx0aGlzLmFuaW1hdGlvbnMubGVuZ3RoO2UrKylpLmFuaW1hdGlvbnMucHVzaChyKHQuYW5pbWF0aW9ucyx0aGlzLmFuaW1hdGlvbnNbZV0pKX1pZihlKXtjb25zdCBlPW8odC5nZW9tZXRyaWVzKSxpPW8odC5tYXRlcmlhbHMpLHI9byh0LnRleHR1cmVzKSxhPW8odC5pbWFnZXMpLHM9byh0LnNoYXBlcyksbD1vKHQuc2tlbGV0b25zKSxjPW8odC5hbmltYXRpb25zKTtlLmxlbmd0aD4wJiYobi5nZW9tZXRyaWVzPWUpLGkubGVuZ3RoPjAmJihuLm1hdGVyaWFscz1pKSxyLmxlbmd0aD4wJiYobi50ZXh0dXJlcz1yKSxhLmxlbmd0aD4wJiYobi5pbWFnZXM9YSkscy5sZW5ndGg+MCYmKG4uc2hhcGVzPXMpLGwubGVuZ3RoPjAmJihuLnNrZWxldG9ucz1sKSxjLmxlbmd0aD4wJiYobi5hbmltYXRpb25zPWMpfXJldHVybiBuLm9iamVjdD1pLG47ZnVuY3Rpb24gbyh0KXtjb25zdCBlPVtdO2Zvcihjb25zdCBuIGluIHQpe2NvbnN0IGk9dFtuXTtkZWxldGUgaS5tZXRhZGF0YSxlLnB1c2goaSl9cmV0dXJuIGV9fWNsb25lKHQpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzLHQpfWNvcHkodCxlPSEwKXtpZih0aGlzLm5hbWU9dC5uYW1lLHRoaXMudXAuY29weSh0LnVwKSx0aGlzLnBvc2l0aW9uLmNvcHkodC5wb3NpdGlvbiksdGhpcy5yb3RhdGlvbi5vcmRlcj10LnJvdGF0aW9uLm9yZGVyLHRoaXMucXVhdGVybmlvbi5jb3B5KHQucXVhdGVybmlvbiksdGhpcy5zY2FsZS5jb3B5KHQuc2NhbGUpLHRoaXMubWF0cml4LmNvcHkodC5tYXRyaXgpLHRoaXMubWF0cml4V29ybGQuY29weSh0Lm1hdHJpeFdvcmxkKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT10Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUsdGhpcy5sYXllcnMubWFzaz10LmxheWVycy5tYXNrLHRoaXMudmlzaWJsZT10LnZpc2libGUsdGhpcy5jYXN0U2hhZG93PXQuY2FzdFNoYWRvdyx0aGlzLnJlY2VpdmVTaGFkb3c9dC5yZWNlaXZlU2hhZG93LHRoaXMuZnJ1c3R1bUN1bGxlZD10LmZydXN0dW1DdWxsZWQsdGhpcy5yZW5kZXJPcmRlcj10LnJlbmRlck9yZGVyLHRoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnVzZXJEYXRhKSksITA9PT1lKWZvcihsZXQgZT0wO2U8dC5jaGlsZHJlbi5sZW5ndGg7ZSsrKXRoaXMuYWRkKHQuY2hpbGRyZW5bZV0uY2xvbmUoKSk7cmV0dXJuIHRoaXN9fWtRdC5EZWZhdWx0VXA9bmV3IENKdCgwLDEsMCksa1F0LkRlZmF1bHRNYXRyaXhBdXRvVXBkYXRlPSEwLGtRdC5wcm90b3R5cGUuaXNPYmplY3QzRD0hMDtjb25zdCBMUXQ9bmV3IENKdCxQUXQ9bmV3IENKdCxOUXQ9bmV3IENKdCxJUXQ9bmV3IENKdCxSUXQ9bmV3IENKdCxPUXQ9bmV3IENKdCx6UXQ9bmV3IENKdCxEUXQ9bmV3IENKdCxCUXQ9bmV3IENKdCxIUXQ9bmV3IENKdDtjbGFzcyBGUXR7Y29uc3RydWN0b3IodD1uZXcgQ0p0LGU9bmV3IENKdCxuPW5ldyBDSnQpe3RoaXMuYT10LHRoaXMuYj1lLHRoaXMuYz1ufXN0YXRpYyBnZXROb3JtYWwodCxlLG4saSl7aS5zdWJWZWN0b3JzKG4sZSksTFF0LnN1YlZlY3RvcnModCxlKSxpLmNyb3NzKExRdCk7Y29uc3Qgcj1pLmxlbmd0aFNxKCk7cmV0dXJuIHI+MD9pLm11bHRpcGx5U2NhbGFyKDEvTWF0aC5zcXJ0KHIpKTppLnNldCgwLDAsMCl9c3RhdGljIGdldEJhcnljb29yZCh0LGUsbixpLHIpe0xRdC5zdWJWZWN0b3JzKGksZSksUFF0LnN1YlZlY3RvcnMobixlKSxOUXQuc3ViVmVjdG9ycyh0LGUpO2NvbnN0IG89TFF0LmRvdChMUXQpLGE9TFF0LmRvdChQUXQpLHM9TFF0LmRvdChOUXQpLGw9UFF0LmRvdChQUXQpLGM9UFF0LmRvdChOUXQpLHU9bypsLWEqYTtpZigwPT09dSlyZXR1cm4gci5zZXQoLTIsLTEsLTEpO2NvbnN0IGg9MS91LGQ9KGwqcy1hKmMpKmgscD0obypjLWEqcykqaDtyZXR1cm4gci5zZXQoMS1kLXAscCxkKX1zdGF0aWMgY29udGFpbnNQb2ludCh0LGUsbixpKXtyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQodCxlLG4saSxJUXQpLElRdC54Pj0wJiZJUXQueT49MCYmSVF0LngrSVF0Lnk8PTF9c3RhdGljIGdldFVWKHQsZSxuLGkscixvLGEscyl7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKHQsZSxuLGksSVF0KSxzLnNldCgwLDApLHMuYWRkU2NhbGVkVmVjdG9yKHIsSVF0LngpLHMuYWRkU2NhbGVkVmVjdG9yKG8sSVF0LnkpLHMuYWRkU2NhbGVkVmVjdG9yKGEsSVF0LnopLHN9c3RhdGljIGlzRnJvbnRGYWNpbmcodCxlLG4saSl7cmV0dXJuIExRdC5zdWJWZWN0b3JzKG4sZSksUFF0LnN1YlZlY3RvcnModCxlKSxMUXQuY3Jvc3MoUFF0KS5kb3QoaSk8MH1zZXQodCxlLG4pe3JldHVybiB0aGlzLmEuY29weSh0KSx0aGlzLmIuY29weShlKSx0aGlzLmMuY29weShuKSx0aGlzfXNldEZyb21Qb2ludHNBbmRJbmRpY2VzKHQsZSxuLGkpe3JldHVybiB0aGlzLmEuY29weSh0W2VdKSx0aGlzLmIuY29weSh0W25dKSx0aGlzLmMuY29weSh0W2ldKSx0aGlzfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMuYS5jb3B5KHQuYSksdGhpcy5iLmNvcHkodC5iKSx0aGlzLmMuY29weSh0LmMpLHRoaXN9Z2V0QXJlYSgpe3JldHVybiBMUXQuc3ViVmVjdG9ycyh0aGlzLmMsdGhpcy5iKSxQUXQuc3ViVmVjdG9ycyh0aGlzLmEsdGhpcy5iKSwuNSpMUXQuY3Jvc3MoUFF0KS5sZW5ndGgoKX1nZXRNaWRwb2ludCh0KXtyZXR1cm4gdC5hZGRWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLmFkZCh0aGlzLmMpLm11bHRpcGx5U2NhbGFyKDEvMyl9Z2V0Tm9ybWFsKHQpe3JldHVybiBGUXQuZ2V0Tm9ybWFsKHRoaXMuYSx0aGlzLmIsdGhpcy5jLHQpfWdldFBsYW5lKHQpe3JldHVybiB0LnNldEZyb21Db3BsYW5hclBvaW50cyh0aGlzLmEsdGhpcy5iLHRoaXMuYyl9Z2V0QmFyeWNvb3JkKHQsZSl7cmV0dXJuIEZRdC5nZXRCYXJ5Y29vcmQodCx0aGlzLmEsdGhpcy5iLHRoaXMuYyxlKX1nZXRVVih0LGUsbixpLHIpe3JldHVybiBGUXQuZ2V0VVYodCx0aGlzLmEsdGhpcy5iLHRoaXMuYyxlLG4saSxyKX1jb250YWluc1BvaW50KHQpe3JldHVybiBGUXQuY29udGFpbnNQb2ludCh0LHRoaXMuYSx0aGlzLmIsdGhpcy5jKX1pc0Zyb250RmFjaW5nKHQpe3JldHVybiBGUXQuaXNGcm9udEZhY2luZyh0aGlzLmEsdGhpcy5iLHRoaXMuYyx0KX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNUcmlhbmdsZSh0aGlzKX1jbG9zZXN0UG9pbnRUb1BvaW50KHQsZSl7Y29uc3Qgbj10aGlzLmEsaT10aGlzLmIscj10aGlzLmM7bGV0IG8sYTtSUXQuc3ViVmVjdG9ycyhpLG4pLE9RdC5zdWJWZWN0b3JzKHIsbiksRFF0LnN1YlZlY3RvcnModCxuKTtjb25zdCBzPVJRdC5kb3QoRFF0KSxsPU9RdC5kb3QoRFF0KTtpZihzPD0wJiZsPD0wKXJldHVybiBlLmNvcHkobik7QlF0LnN1YlZlY3RvcnModCxpKTtjb25zdCBjPVJRdC5kb3QoQlF0KSx1PU9RdC5kb3QoQlF0KTtpZihjPj0wJiZ1PD1jKXJldHVybiBlLmNvcHkoaSk7Y29uc3QgaD1zKnUtYypsO2lmKGg8PTAmJnM+PTAmJmM8PTApcmV0dXJuIG89cy8ocy1jKSxlLmNvcHkobikuYWRkU2NhbGVkVmVjdG9yKFJRdCxvKTtIUXQuc3ViVmVjdG9ycyh0LHIpO2NvbnN0IGQ9UlF0LmRvdChIUXQpLHA9T1F0LmRvdChIUXQpO2lmKHA+PTAmJmQ8PXApcmV0dXJuIGUuY29weShyKTtjb25zdCBmPWQqbC1zKnA7aWYoZjw9MCYmbD49MCYmcDw9MClyZXR1cm4gYT1sLyhsLXApLGUuY29weShuKS5hZGRTY2FsZWRWZWN0b3IoT1F0LGEpO2NvbnN0IG09YypwLWQqdTtpZihtPD0wJiZ1LWM+PTAmJmQtcD49MClyZXR1cm4gelF0LnN1YlZlY3RvcnMocixpKSxhPSh1LWMpLyh1LWMrKGQtcCkpLGUuY29weShpKS5hZGRTY2FsZWRWZWN0b3IoelF0LGEpO2NvbnN0IGc9MS8obStmK2gpO3JldHVybiBvPWYqZyxhPWgqZyxlLmNvcHkobikuYWRkU2NhbGVkVmVjdG9yKFJRdCxvKS5hZGRTY2FsZWRWZWN0b3IoT1F0LGEpfWVxdWFscyh0KXtyZXR1cm4gdC5hLmVxdWFscyh0aGlzLmEpJiZ0LmIuZXF1YWxzKHRoaXMuYikmJnQuYy5lcXVhbHModGhpcy5jKX19bGV0IFZRdD0wO2NsYXNzIFVRdCBleHRlbmRzIGpadHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6VlF0Kyt9KSx0aGlzLnV1aWQ9WFp0KCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iTWF0ZXJpYWwiLHRoaXMuZm9nPSEwLHRoaXMuYmxlbmRpbmc9MSx0aGlzLnNpZGU9MCx0aGlzLnZlcnRleENvbG9ycz0hMSx0aGlzLm9wYWNpdHk9MSx0aGlzLnRyYW5zcGFyZW50PSExLHRoaXMuYmxlbmRTcmM9MjA0LHRoaXMuYmxlbmREc3Q9MjA1LHRoaXMuYmxlbmRFcXVhdGlvbj1WS3QsdGhpcy5ibGVuZFNyY0FscGhhPW51bGwsdGhpcy5ibGVuZERzdEFscGhhPW51bGwsdGhpcy5ibGVuZEVxdWF0aW9uQWxwaGE9bnVsbCx0aGlzLmRlcHRoRnVuYz0zLHRoaXMuZGVwdGhUZXN0PSEwLHRoaXMuZGVwdGhXcml0ZT0hMCx0aGlzLnN0ZW5jaWxXcml0ZU1hc2s9MjU1LHRoaXMuc3RlbmNpbEZ1bmM9NTE5LHRoaXMuc3RlbmNpbFJlZj0wLHRoaXMuc3RlbmNpbEZ1bmNNYXNrPTI1NSx0aGlzLnN0ZW5jaWxGYWlsPUhadCx0aGlzLnN0ZW5jaWxaRmFpbD1IWnQsdGhpcy5zdGVuY2lsWlBhc3M9SFp0LHRoaXMuc3RlbmNpbFdyaXRlPSExLHRoaXMuY2xpcHBpbmdQbGFuZXM9bnVsbCx0aGlzLmNsaXBJbnRlcnNlY3Rpb249ITEsdGhpcy5jbGlwU2hhZG93cz0hMSx0aGlzLnNoYWRvd1NpZGU9bnVsbCx0aGlzLmNvbG9yV3JpdGU9ITAsdGhpcy5wcmVjaXNpb249bnVsbCx0aGlzLnBvbHlnb25PZmZzZXQ9ITEsdGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yPTAsdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHM9MCx0aGlzLmRpdGhlcmluZz0hMSx0aGlzLmFscGhhVGVzdD0wLHRoaXMuYWxwaGFUb0NvdmVyYWdlPSExLHRoaXMucHJlbXVsdGlwbGllZEFscGhhPSExLHRoaXMudmlzaWJsZT0hMCx0aGlzLnRvbmVNYXBwZWQ9ITAsdGhpcy51c2VyRGF0YT17fSx0aGlzLnZlcnNpb249MH1vbkJ1aWxkKCl7fW9uQmVmb3JlQ29tcGlsZSgpe31jdXN0b21Qcm9ncmFtQ2FjaGVLZXkoKXtyZXR1cm4gdGhpcy5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKX1zZXRWYWx1ZXModCl7aWYodm9pZCAwIT09dClmb3IoY29uc3QgZSBpbiB0KXtjb25zdCBuPXRbZV07aWYodm9pZCAwPT09bil7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbDogJyIrZSsiJyBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkLiIpO2NvbnRpbnVlfWlmKCJzaGFkaW5nIj09PWUpe2NvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLiIpLHRoaXMuZmxhdFNoYWRpbmc9MT09PW47Y29udGludWV9Y29uc3QgaT10aGlzW2VdO3ZvaWQgMCE9PWk/aSYmaS5pc0NvbG9yP2kuc2V0KG4pOmkmJmkuaXNWZWN0b3IzJiZuJiZuLmlzVmVjdG9yMz9pLmNvcHkobik6dGhpc1tlXT1uOmNvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogJyIrZSsiJyBpcyBub3QgYSBwcm9wZXJ0eSBvZiB0aGlzIG1hdGVyaWFsLiIpfX10b0pTT04odCl7Y29uc3QgZT12b2lkIDA9PT10fHwic3RyaW5nIj09dHlwZW9mIHQ7ZSYmKHQ9e3RleHR1cmVzOnt9LGltYWdlczp7fX0pO2NvbnN0IG49e21ldGFkYXRhOnt2ZXJzaW9uOjQuNSx0eXBlOiJNYXRlcmlhbCIsZ2VuZXJhdG9yOiJNYXRlcmlhbC50b0pTT04ifX07ZnVuY3Rpb24gaSh0KXtjb25zdCBlPVtdO2Zvcihjb25zdCBuIGluIHQpe2NvbnN0IGk9dFtuXTtkZWxldGUgaS5tZXRhZGF0YSxlLnB1c2goaSl9cmV0dXJuIGV9aWYobi51dWlkPXRoaXMudXVpZCxuLnR5cGU9dGhpcy50eXBlLCIiIT09dGhpcy5uYW1lJiYobi5uYW1lPXRoaXMubmFtZSksdGhpcy5jb2xvciYmdGhpcy5jb2xvci5pc0NvbG9yJiYobi5jb2xvcj10aGlzLmNvbG9yLmdldEhleCgpKSx2b2lkIDAhPT10aGlzLnJvdWdobmVzcyYmKG4ucm91Z2huZXNzPXRoaXMucm91Z2huZXNzKSx2b2lkIDAhPT10aGlzLm1ldGFsbmVzcyYmKG4ubWV0YWxuZXNzPXRoaXMubWV0YWxuZXNzKSx0aGlzLnNoZWVuJiZ0aGlzLnNoZWVuLmlzQ29sb3ImJihuLnNoZWVuPXRoaXMuc2hlZW4uZ2V0SGV4KCkpLHRoaXMuZW1pc3NpdmUmJnRoaXMuZW1pc3NpdmUuaXNDb2xvciYmKG4uZW1pc3NpdmU9dGhpcy5lbWlzc2l2ZS5nZXRIZXgoKSksdGhpcy5lbWlzc2l2ZUludGVuc2l0eSYmMSE9PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkmJihuLmVtaXNzaXZlSW50ZW5zaXR5PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkpLHRoaXMuc3BlY3VsYXImJnRoaXMuc3BlY3VsYXIuaXNDb2xvciYmKG4uc3BlY3VsYXI9dGhpcy5zcGVjdWxhci5nZXRIZXgoKSksdm9pZCAwIT09dGhpcy5zcGVjdWxhckludGVuc2l0eSYmKG4uc3BlY3VsYXJJbnRlbnNpdHk9dGhpcy5zcGVjdWxhckludGVuc2l0eSksdGhpcy5zcGVjdWxhclRpbnQmJnRoaXMuc3BlY3VsYXJUaW50LmlzQ29sb3ImJihuLnNwZWN1bGFyVGludD10aGlzLnNwZWN1bGFyVGludC5nZXRIZXgoKSksdm9pZCAwIT09dGhpcy5zaGluaW5lc3MmJihuLnNoaW5pbmVzcz10aGlzLnNoaW5pbmVzcyksdm9pZCAwIT09dGhpcy5jbGVhcmNvYXQmJihuLmNsZWFyY29hdD10aGlzLmNsZWFyY29hdCksdm9pZCAwIT09dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MmJihuLmNsZWFyY29hdFJvdWdobmVzcz10aGlzLmNsZWFyY29hdFJvdWdobmVzcyksdGhpcy5jbGVhcmNvYXRNYXAmJnRoaXMuY2xlYXJjb2F0TWFwLmlzVGV4dHVyZSYmKG4uY2xlYXJjb2F0TWFwPXRoaXMuY2xlYXJjb2F0TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcCYmdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAuaXNUZXh0dXJlJiYobi5jbGVhcmNvYXRSb3VnaG5lc3NNYXA9dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwJiZ0aGlzLmNsZWFyY29hdE5vcm1hbE1hcC5pc1RleHR1cmUmJihuLmNsZWFyY29hdE5vcm1hbE1hcD10aGlzLmNsZWFyY29hdE5vcm1hbE1hcC50b0pTT04odCkudXVpZCxuLmNsZWFyY29hdE5vcm1hbFNjYWxlPXRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudG9BcnJheSgpKSx0aGlzLm1hcCYmdGhpcy5tYXAuaXNUZXh0dXJlJiYobi5tYXA9dGhpcy5tYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubWF0Y2FwJiZ0aGlzLm1hdGNhcC5pc1RleHR1cmUmJihuLm1hdGNhcD10aGlzLm1hdGNhcC50b0pTT04odCkudXVpZCksdGhpcy5hbHBoYU1hcCYmdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUmJihuLmFscGhhTWFwPXRoaXMuYWxwaGFNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubGlnaHRNYXAmJnRoaXMubGlnaHRNYXAuaXNUZXh0dXJlJiYobi5saWdodE1hcD10aGlzLmxpZ2h0TWFwLnRvSlNPTih0KS51dWlkLG4ubGlnaHRNYXBJbnRlbnNpdHk9dGhpcy5saWdodE1hcEludGVuc2l0eSksdGhpcy5hb01hcCYmdGhpcy5hb01hcC5pc1RleHR1cmUmJihuLmFvTWFwPXRoaXMuYW9NYXAudG9KU09OKHQpLnV1aWQsbi5hb01hcEludGVuc2l0eT10aGlzLmFvTWFwSW50ZW5zaXR5KSx0aGlzLmJ1bXBNYXAmJnRoaXMuYnVtcE1hcC5pc1RleHR1cmUmJihuLmJ1bXBNYXA9dGhpcy5idW1wTWFwLnRvSlNPTih0KS51dWlkLG4uYnVtcFNjYWxlPXRoaXMuYnVtcFNjYWxlKSx0aGlzLm5vcm1hbE1hcCYmdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlJiYobi5ub3JtYWxNYXA9dGhpcy5ub3JtYWxNYXAudG9KU09OKHQpLnV1aWQsbi5ub3JtYWxNYXBUeXBlPXRoaXMubm9ybWFsTWFwVHlwZSxuLm5vcm1hbFNjYWxlPXRoaXMubm9ybWFsU2NhbGUudG9BcnJheSgpKSx0aGlzLmRpc3BsYWNlbWVudE1hcCYmdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlJiYobi5kaXNwbGFjZW1lbnRNYXA9dGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKHQpLnV1aWQsbi5kaXNwbGFjZW1lbnRTY2FsZT10aGlzLmRpc3BsYWNlbWVudFNjYWxlLG4uZGlzcGxhY2VtZW50Qmlhcz10aGlzLmRpc3BsYWNlbWVudEJpYXMpLHRoaXMucm91Z2huZXNzTWFwJiZ0aGlzLnJvdWdobmVzc01hcC5pc1RleHR1cmUmJihuLnJvdWdobmVzc01hcD10aGlzLnJvdWdobmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5tZXRhbG5lc3NNYXAmJnRoaXMubWV0YWxuZXNzTWFwLmlzVGV4dHVyZSYmKG4ubWV0YWxuZXNzTWFwPXRoaXMubWV0YWxuZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVtaXNzaXZlTWFwJiZ0aGlzLmVtaXNzaXZlTWFwLmlzVGV4dHVyZSYmKG4uZW1pc3NpdmVNYXA9dGhpcy5lbWlzc2l2ZU1hcC50b0pTT04odCkudXVpZCksdGhpcy5zcGVjdWxhck1hcCYmdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFyTWFwPXRoaXMuc3BlY3VsYXJNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAmJnRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAuaXNUZXh0dXJlJiYobi5zcGVjdWxhckludGVuc2l0eU1hcD10aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnNwZWN1bGFyVGludE1hcCYmdGhpcy5zcGVjdWxhclRpbnRNYXAuaXNUZXh0dXJlJiYobi5zcGVjdWxhclRpbnRNYXA9dGhpcy5zcGVjdWxhclRpbnRNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuZW52TWFwJiZ0aGlzLmVudk1hcC5pc1RleHR1cmUmJihuLmVudk1hcD10aGlzLmVudk1hcC50b0pTT04odCkudXVpZCx2b2lkIDAhPT10aGlzLmNvbWJpbmUmJihuLmNvbWJpbmU9dGhpcy5jb21iaW5lKSksdm9pZCAwIT09dGhpcy5lbnZNYXBJbnRlbnNpdHkmJihuLmVudk1hcEludGVuc2l0eT10aGlzLmVudk1hcEludGVuc2l0eSksdm9pZCAwIT09dGhpcy5yZWZsZWN0aXZpdHkmJihuLnJlZmxlY3Rpdml0eT10aGlzLnJlZmxlY3Rpdml0eSksdm9pZCAwIT09dGhpcy5yZWZyYWN0aW9uUmF0aW8mJihuLnJlZnJhY3Rpb25SYXRpbz10aGlzLnJlZnJhY3Rpb25SYXRpbyksdGhpcy5ncmFkaWVudE1hcCYmdGhpcy5ncmFkaWVudE1hcC5pc1RleHR1cmUmJihuLmdyYWRpZW50TWFwPXRoaXMuZ3JhZGllbnRNYXAudG9KU09OKHQpLnV1aWQpLHZvaWQgMCE9PXRoaXMudHJhbnNtaXNzaW9uJiYobi50cmFuc21pc3Npb249dGhpcy50cmFuc21pc3Npb24pLHRoaXMudHJhbnNtaXNzaW9uTWFwJiZ0aGlzLnRyYW5zbWlzc2lvbk1hcC5pc1RleHR1cmUmJihuLnRyYW5zbWlzc2lvbk1hcD10aGlzLnRyYW5zbWlzc2lvbk1hcC50b0pTT04odCkudXVpZCksdm9pZCAwIT09dGhpcy50aGlja25lc3MmJihuLnRoaWNrbmVzcz10aGlzLnRoaWNrbmVzcyksdGhpcy50aGlja25lc3NNYXAmJnRoaXMudGhpY2tuZXNzTWFwLmlzVGV4dHVyZSYmKG4udGhpY2tuZXNzTWFwPXRoaXMudGhpY2tuZXNzTWFwLnRvSlNPTih0KS51dWlkKSx2b2lkIDAhPT10aGlzLmF0dGVudWF0aW9uRGlzdGFuY2UmJihuLmF0dGVudWF0aW9uRGlzdGFuY2U9dGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlKSx2b2lkIDAhPT10aGlzLmF0dGVudWF0aW9uVGludCYmKG4uYXR0ZW51YXRpb25UaW50PXRoaXMuYXR0ZW51YXRpb25UaW50LmdldEhleCgpKSx2b2lkIDAhPT10aGlzLnNpemUmJihuLnNpemU9dGhpcy5zaXplKSxudWxsIT09dGhpcy5zaGFkb3dTaWRlJiYobi5zaGFkb3dTaWRlPXRoaXMuc2hhZG93U2lkZSksdm9pZCAwIT09dGhpcy5zaXplQXR0ZW51YXRpb24mJihuLnNpemVBdHRlbnVhdGlvbj10aGlzLnNpemVBdHRlbnVhdGlvbiksMSE9PXRoaXMuYmxlbmRpbmcmJihuLmJsZW5kaW5nPXRoaXMuYmxlbmRpbmcpLDAhPT10aGlzLnNpZGUmJihuLnNpZGU9dGhpcy5zaWRlKSx0aGlzLnZlcnRleENvbG9ycyYmKG4udmVydGV4Q29sb3JzPSEwKSx0aGlzLm9wYWNpdHk8MSYmKG4ub3BhY2l0eT10aGlzLm9wYWNpdHkpLCEwPT09dGhpcy50cmFuc3BhcmVudCYmKG4udHJhbnNwYXJlbnQ9dGhpcy50cmFuc3BhcmVudCksbi5kZXB0aEZ1bmM9dGhpcy5kZXB0aEZ1bmMsbi5kZXB0aFRlc3Q9dGhpcy5kZXB0aFRlc3Qsbi5kZXB0aFdyaXRlPXRoaXMuZGVwdGhXcml0ZSxuLmNvbG9yV3JpdGU9dGhpcy5jb2xvcldyaXRlLG4uc3RlbmNpbFdyaXRlPXRoaXMuc3RlbmNpbFdyaXRlLG4uc3RlbmNpbFdyaXRlTWFzaz10aGlzLnN0ZW5jaWxXcml0ZU1hc2ssbi5zdGVuY2lsRnVuYz10aGlzLnN0ZW5jaWxGdW5jLG4uc3RlbmNpbFJlZj10aGlzLnN0ZW5jaWxSZWYsbi5zdGVuY2lsRnVuY01hc2s9dGhpcy5zdGVuY2lsRnVuY01hc2ssbi5zdGVuY2lsRmFpbD10aGlzLnN0ZW5jaWxGYWlsLG4uc3RlbmNpbFpGYWlsPXRoaXMuc3RlbmNpbFpGYWlsLG4uc3RlbmNpbFpQYXNzPXRoaXMuc3RlbmNpbFpQYXNzLHRoaXMucm90YXRpb24mJjAhPT10aGlzLnJvdGF0aW9uJiYobi5yb3RhdGlvbj10aGlzLnJvdGF0aW9uKSwhMD09PXRoaXMucG9seWdvbk9mZnNldCYmKG4ucG9seWdvbk9mZnNldD0hMCksMCE9PXRoaXMucG9seWdvbk9mZnNldEZhY3RvciYmKG4ucG9seWdvbk9mZnNldEZhY3Rvcj10aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IpLDAhPT10aGlzLnBvbHlnb25PZmZzZXRVbml0cyYmKG4ucG9seWdvbk9mZnNldFVuaXRzPXRoaXMucG9seWdvbk9mZnNldFVuaXRzKSx0aGlzLmxpbmV3aWR0aCYmMSE9PXRoaXMubGluZXdpZHRoJiYobi5saW5ld2lkdGg9dGhpcy5saW5ld2lkdGgpLHZvaWQgMCE9PXRoaXMuZGFzaFNpemUmJihuLmRhc2hTaXplPXRoaXMuZGFzaFNpemUpLHZvaWQgMCE9PXRoaXMuZ2FwU2l6ZSYmKG4uZ2FwU2l6ZT10aGlzLmdhcFNpemUpLHZvaWQgMCE9PXRoaXMuc2NhbGUmJihuLnNjYWxlPXRoaXMuc2NhbGUpLCEwPT09dGhpcy5kaXRoZXJpbmcmJihuLmRpdGhlcmluZz0hMCksdGhpcy5hbHBoYVRlc3Q+MCYmKG4uYWxwaGFUZXN0PXRoaXMuYWxwaGFUZXN0KSwhMD09PXRoaXMuYWxwaGFUb0NvdmVyYWdlJiYobi5hbHBoYVRvQ292ZXJhZ2U9dGhpcy5hbHBoYVRvQ292ZXJhZ2UpLCEwPT09dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEmJihuLnByZW11bHRpcGxpZWRBbHBoYT10aGlzLnByZW11bHRpcGxpZWRBbHBoYSksITA9PT10aGlzLndpcmVmcmFtZSYmKG4ud2lyZWZyYW1lPXRoaXMud2lyZWZyYW1lKSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD4xJiYobi53aXJlZnJhbWVMaW5ld2lkdGg9dGhpcy53aXJlZnJhbWVMaW5ld2lkdGgpLCJyb3VuZCIhPT10aGlzLndpcmVmcmFtZUxpbmVjYXAmJihuLndpcmVmcmFtZUxpbmVjYXA9dGhpcy53aXJlZnJhbWVMaW5lY2FwKSwicm91bmQiIT09dGhpcy53aXJlZnJhbWVMaW5lam9pbiYmKG4ud2lyZWZyYW1lTGluZWpvaW49dGhpcy53aXJlZnJhbWVMaW5lam9pbiksITA9PT10aGlzLmZsYXRTaGFkaW5nJiYobi5mbGF0U2hhZGluZz10aGlzLmZsYXRTaGFkaW5nKSwhMT09PXRoaXMudmlzaWJsZSYmKG4udmlzaWJsZT0hMSksITE9PT10aGlzLnRvbmVNYXBwZWQmJihuLnRvbmVNYXBwZWQ9ITEpLCJ7fSIhPT1KU09OLnN0cmluZ2lmeSh0aGlzLnVzZXJEYXRhKSYmKG4udXNlckRhdGE9dGhpcy51c2VyRGF0YSksZSl7Y29uc3QgZT1pKHQudGV4dHVyZXMpLHI9aSh0LmltYWdlcyk7ZS5sZW5ndGg+MCYmKG4udGV4dHVyZXM9ZSksci5sZW5ndGg+MCYmKG4uaW1hZ2VzPXIpfXJldHVybiBufWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfWNvcHkodCl7dGhpcy5uYW1lPXQubmFtZSx0aGlzLmZvZz10LmZvZyx0aGlzLmJsZW5kaW5nPXQuYmxlbmRpbmcsdGhpcy5zaWRlPXQuc2lkZSx0aGlzLnZlcnRleENvbG9ycz10LnZlcnRleENvbG9ycyx0aGlzLm9wYWNpdHk9dC5vcGFjaXR5LHRoaXMudHJhbnNwYXJlbnQ9dC50cmFuc3BhcmVudCx0aGlzLmJsZW5kU3JjPXQuYmxlbmRTcmMsdGhpcy5ibGVuZERzdD10LmJsZW5kRHN0LHRoaXMuYmxlbmRFcXVhdGlvbj10LmJsZW5kRXF1YXRpb24sdGhpcy5ibGVuZFNyY0FscGhhPXQuYmxlbmRTcmNBbHBoYSx0aGlzLmJsZW5kRHN0QWxwaGE9dC5ibGVuZERzdEFscGhhLHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhPXQuYmxlbmRFcXVhdGlvbkFscGhhLHRoaXMuZGVwdGhGdW5jPXQuZGVwdGhGdW5jLHRoaXMuZGVwdGhUZXN0PXQuZGVwdGhUZXN0LHRoaXMuZGVwdGhXcml0ZT10LmRlcHRoV3JpdGUsdGhpcy5zdGVuY2lsV3JpdGVNYXNrPXQuc3RlbmNpbFdyaXRlTWFzayx0aGlzLnN0ZW5jaWxGdW5jPXQuc3RlbmNpbEZ1bmMsdGhpcy5zdGVuY2lsUmVmPXQuc3RlbmNpbFJlZix0aGlzLnN0ZW5jaWxGdW5jTWFzaz10LnN0ZW5jaWxGdW5jTWFzayx0aGlzLnN0ZW5jaWxGYWlsPXQuc3RlbmNpbEZhaWwsdGhpcy5zdGVuY2lsWkZhaWw9dC5zdGVuY2lsWkZhaWwsdGhpcy5zdGVuY2lsWlBhc3M9dC5zdGVuY2lsWlBhc3MsdGhpcy5zdGVuY2lsV3JpdGU9dC5zdGVuY2lsV3JpdGU7Y29uc3QgZT10LmNsaXBwaW5nUGxhbmVzO2xldCBuPW51bGw7aWYobnVsbCE9PWUpe2NvbnN0IHQ9ZS5sZW5ndGg7bj1uZXcgQXJyYXkodCk7Zm9yKGxldCBpPTA7aSE9PXQ7KytpKW5baV09ZVtpXS5jbG9uZSgpfXJldHVybiB0aGlzLmNsaXBwaW5nUGxhbmVzPW4sdGhpcy5jbGlwSW50ZXJzZWN0aW9uPXQuY2xpcEludGVyc2VjdGlvbix0aGlzLmNsaXBTaGFkb3dzPXQuY2xpcFNoYWRvd3MsdGhpcy5zaGFkb3dTaWRlPXQuc2hhZG93U2lkZSx0aGlzLmNvbG9yV3JpdGU9dC5jb2xvcldyaXRlLHRoaXMucHJlY2lzaW9uPXQucHJlY2lzaW9uLHRoaXMucG9seWdvbk9mZnNldD10LnBvbHlnb25PZmZzZXQsdGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yPXQucG9seWdvbk9mZnNldEZhY3Rvcix0aGlzLnBvbHlnb25PZmZzZXRVbml0cz10LnBvbHlnb25PZmZzZXRVbml0cyx0aGlzLmRpdGhlcmluZz10LmRpdGhlcmluZyx0aGlzLmFscGhhVGVzdD10LmFscGhhVGVzdCx0aGlzLmFscGhhVG9Db3ZlcmFnZT10LmFscGhhVG9Db3ZlcmFnZSx0aGlzLnByZW11bHRpcGxpZWRBbHBoYT10LnByZW11bHRpcGxpZWRBbHBoYSx0aGlzLnZpc2libGU9dC52aXNpYmxlLHRoaXMudG9uZU1hcHBlZD10LnRvbmVNYXBwZWQsdGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQudXNlckRhdGEpKSx0aGlzfWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9c2V0IG5lZWRzVXBkYXRlKHQpeyEwPT09dCYmdGhpcy52ZXJzaW9uKyt9fVVRdC5wcm90b3R5cGUuaXNNYXRlcmlhbD0hMDtjb25zdCBqUXQ9e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH0sR1F0PXtoOjAsczowLGw6MH0sV1F0PXtoOjAsczowLGw6MH07ZnVuY3Rpb24gcVF0KHQsZSxuKXtyZXR1cm4gbjwwJiYobis9MSksbj4xJiYobi09MSksbjwxLzY/dCs2KihlLXQpKm46bjwuNT9lOm48Mi8zP3QrNiooZS10KSooMi8zLW4pOnR9ZnVuY3Rpb24gWVF0KHQpe3JldHVybiB0PC4wNDA0NT8uMDc3Mzk5MzgwOCp0Ok1hdGgucG93KC45NDc4NjcyOTg2KnQrLjA1MjEzMjcwMTQsMi40KX1mdW5jdGlvbiBYUXQodCl7cmV0dXJuIHQ8LjAwMzEzMDg/MTIuOTIqdDoxLjA1NSpNYXRoLnBvdyh0LC40MTY2NiktLjA1NX1jbGFzcyAkUXR7Y29uc3RydWN0b3IodCxlLG4pe3JldHVybiB2b2lkIDA9PT1lJiZ2b2lkIDA9PT1uP3RoaXMuc2V0KHQpOnRoaXMuc2V0UkdCKHQsZSxuKX1zZXQodCl7cmV0dXJuIHQmJnQuaXNDb2xvcj90aGlzLmNvcHkodCk6Im51bWJlciI9PXR5cGVvZiB0P3RoaXMuc2V0SGV4KHQpOiJzdHJpbmciPT10eXBlb2YgdCYmdGhpcy5zZXRTdHlsZSh0KSx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy5yPXQsdGhpcy5nPXQsdGhpcy5iPXQsdGhpc31zZXRIZXgodCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSx0aGlzLnI9KHQ+PjE2JjI1NSkvMjU1LHRoaXMuZz0odD4+OCYyNTUpLzI1NSx0aGlzLmI9KDI1NSZ0KS8yNTUsdGhpc31zZXRSR0IodCxlLG4pe3JldHVybiB0aGlzLnI9dCx0aGlzLmc9ZSx0aGlzLmI9bix0aGlzfXNldEhTTCh0LGUsbil7aWYodD1LWnQodCwxKSxlPSRadChlLDAsMSksbj0kWnQobiwwLDEpLDA9PT1lKXRoaXMucj10aGlzLmc9dGhpcy5iPW47ZWxzZXtjb25zdCBpPW48PS41P24qKDErZSk6bitlLW4qZSxyPTIqbi1pO3RoaXMucj1xUXQocixpLHQrMS8zKSx0aGlzLmc9cVF0KHIsaSx0KSx0aGlzLmI9cVF0KHIsaSx0LTEvMyl9cmV0dXJuIHRoaXN9c2V0U3R5bGUodCl7ZnVuY3Rpb24gZShlKXt2b2lkIDAhPT1lJiZwYXJzZUZsb2F0KGUpPDEmJmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAiK3QrIiB3aWxsIGJlIGlnbm9yZWQuIil9bGV0IG47aWYobj0vXigoPzpyZ2J8aHNsKWE/KVwoKFteXCldKilcKS8uZXhlYyh0KSl7bGV0IHQ7Y29uc3QgaT1uWzJdO3N3aXRjaChuWzFdKXtjYXNlInJnYiI6Y2FzZSJyZ2JhIjppZih0PS9eXHMqKFxkKylccyosXHMqKFxkKylccyosXHMqKFxkKylccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoaSkpcmV0dXJuIHRoaXMucj1NYXRoLm1pbigyNTUscGFyc2VJbnQodFsxXSwxMCkpLzI1NSx0aGlzLmc9TWF0aC5taW4oMjU1LHBhcnNlSW50KHRbMl0sMTApKS8yNTUsdGhpcy5iPU1hdGgubWluKDI1NSxwYXJzZUludCh0WzNdLDEwKSkvMjU1LGUodFs0XSksdGhpcztpZih0PS9eXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqLFxzKihcZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoaSkpcmV0dXJuIHRoaXMucj1NYXRoLm1pbigxMDAscGFyc2VJbnQodFsxXSwxMCkpLzEwMCx0aGlzLmc9TWF0aC5taW4oMTAwLHBhcnNlSW50KHRbMl0sMTApKS8xMDAsdGhpcy5iPU1hdGgubWluKDEwMCxwYXJzZUludCh0WzNdLDEwKSkvMTAwLGUodFs0XSksdGhpczticmVhaztjYXNlImhzbCI6Y2FzZSJoc2xhIjppZih0PS9eXHMqKFxkKlwuP1xkKylccyosXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKGkpKXtjb25zdCBuPXBhcnNlRmxvYXQodFsxXSkvMzYwLGk9cGFyc2VJbnQodFsyXSwxMCkvMTAwLHI9cGFyc2VJbnQodFszXSwxMCkvMTAwO3JldHVybiBlKHRbNF0pLHRoaXMuc2V0SFNMKG4saSxyKX19fWVsc2UgaWYobj0vXlwjKFtBLUZhLWZcZF0rKSQvLmV4ZWModCkpe2NvbnN0IHQ9blsxXSxlPXQubGVuZ3RoO2lmKDM9PT1lKXJldHVybiB0aGlzLnI9cGFyc2VJbnQodC5jaGFyQXQoMCkrdC5jaGFyQXQoMCksMTYpLzI1NSx0aGlzLmc9cGFyc2VJbnQodC5jaGFyQXQoMSkrdC5jaGFyQXQoMSksMTYpLzI1NSx0aGlzLmI9cGFyc2VJbnQodC5jaGFyQXQoMikrdC5jaGFyQXQoMiksMTYpLzI1NSx0aGlzO2lmKDY9PT1lKXJldHVybiB0aGlzLnI9cGFyc2VJbnQodC5jaGFyQXQoMCkrdC5jaGFyQXQoMSksMTYpLzI1NSx0aGlzLmc9cGFyc2VJbnQodC5jaGFyQXQoMikrdC5jaGFyQXQoMyksMTYpLzI1NSx0aGlzLmI9cGFyc2VJbnQodC5jaGFyQXQoNCkrdC5jaGFyQXQoNSksMTYpLzI1NSx0aGlzfXJldHVybiB0JiZ0Lmxlbmd0aD4wP3RoaXMuc2V0Q29sb3JOYW1lKHQpOnRoaXN9c2V0Q29sb3JOYW1lKHQpe2NvbnN0IGU9alF0W3QudG9Mb3dlckNhc2UoKV07cmV0dXJuIHZvaWQgMCE9PWU/dGhpcy5zZXRIZXgoZSk6Y29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAiK3QpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5yLHRoaXMuZyx0aGlzLmIpfWNvcHkodCl7cmV0dXJuIHRoaXMucj10LnIsdGhpcy5nPXQuZyx0aGlzLmI9dC5iLHRoaXN9Y29weUdhbW1hVG9MaW5lYXIodCxlPTIpe3JldHVybiB0aGlzLnI9TWF0aC5wb3codC5yLGUpLHRoaXMuZz1NYXRoLnBvdyh0LmcsZSksdGhpcy5iPU1hdGgucG93KHQuYixlKSx0aGlzfWNvcHlMaW5lYXJUb0dhbW1hKHQsZT0yKXtjb25zdCBuPWU+MD8xL2U6MTtyZXR1cm4gdGhpcy5yPU1hdGgucG93KHQucixuKSx0aGlzLmc9TWF0aC5wb3codC5nLG4pLHRoaXMuYj1NYXRoLnBvdyh0LmIsbiksdGhpc31jb252ZXJ0R2FtbWFUb0xpbmVhcih0KXtyZXR1cm4gdGhpcy5jb3B5R2FtbWFUb0xpbmVhcih0aGlzLHQpLHRoaXN9Y29udmVydExpbmVhclRvR2FtbWEodCl7cmV0dXJuIHRoaXMuY29weUxpbmVhclRvR2FtbWEodGhpcyx0KSx0aGlzfWNvcHlTUkdCVG9MaW5lYXIodCl7cmV0dXJuIHRoaXMucj1ZUXQodC5yKSx0aGlzLmc9WVF0KHQuZyksdGhpcy5iPVlRdCh0LmIpLHRoaXN9Y29weUxpbmVhclRvU1JHQih0KXtyZXR1cm4gdGhpcy5yPVhRdCh0LnIpLHRoaXMuZz1YUXQodC5nKSx0aGlzLmI9WFF0KHQuYiksdGhpc31jb252ZXJ0U1JHQlRvTGluZWFyKCl7cmV0dXJuIHRoaXMuY29weVNSR0JUb0xpbmVhcih0aGlzKSx0aGlzfWNvbnZlcnRMaW5lYXJUb1NSR0IoKXtyZXR1cm4gdGhpcy5jb3B5TGluZWFyVG9TUkdCKHRoaXMpLHRoaXN9Z2V0SGV4KCl7cmV0dXJuIDI1NSp0aGlzLnI8PDE2XjI1NSp0aGlzLmc8PDheMjU1KnRoaXMuYjw8MH1nZXRIZXhTdHJpbmcoKXtyZXR1cm4oIjAwMDAwMCIrdGhpcy5nZXRIZXgoKS50b1N0cmluZygxNikpLnNsaWNlKC02KX1nZXRIU0wodCl7Y29uc3QgZT10aGlzLnIsbj10aGlzLmcsaT10aGlzLmIscj1NYXRoLm1heChlLG4saSksbz1NYXRoLm1pbihlLG4saSk7bGV0IGEscztjb25zdCBsPShvK3IpLzI7aWYobz09PXIpYT0wLHM9MDtlbHNle2NvbnN0IHQ9ci1vO3N3aXRjaChzPWw8PS41P3QvKHIrbyk6dC8oMi1yLW8pLHIpe2Nhc2UgZTphPShuLWkpL3QrKG48aT82OjApO2JyZWFrO2Nhc2UgbjphPShpLWUpL3QrMjticmVhaztjYXNlIGk6YT0oZS1uKS90KzR9YS89Nn1yZXR1cm4gdC5oPWEsdC5zPXMsdC5sPWwsdH1nZXRTdHlsZSgpe3JldHVybiJyZ2IoIisoMjU1KnRoaXMucnwwKSsiLCIrKDI1NSp0aGlzLmd8MCkrIiwiKygyNTUqdGhpcy5ifDApKyIpIn1vZmZzZXRIU0wodCxlLG4pe3JldHVybiB0aGlzLmdldEhTTChHUXQpLEdRdC5oKz10LEdRdC5zKz1lLEdRdC5sKz1uLHRoaXMuc2V0SFNMKEdRdC5oLEdRdC5zLEdRdC5sKSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy5yKz10LnIsdGhpcy5nKz10LmcsdGhpcy5iKz10LmIsdGhpc31hZGRDb2xvcnModCxlKXtyZXR1cm4gdGhpcy5yPXQucitlLnIsdGhpcy5nPXQuZytlLmcsdGhpcy5iPXQuYitlLmIsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMucis9dCx0aGlzLmcrPXQsdGhpcy5iKz10LHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLnI9TWF0aC5tYXgoMCx0aGlzLnItdC5yKSx0aGlzLmc9TWF0aC5tYXgoMCx0aGlzLmctdC5nKSx0aGlzLmI9TWF0aC5tYXgoMCx0aGlzLmItdC5iKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLnIqPXQucix0aGlzLmcqPXQuZyx0aGlzLmIqPXQuYix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLnIqPXQsdGhpcy5nKj10LHRoaXMuYio9dCx0aGlzfWxlcnAodCxlKXtyZXR1cm4gdGhpcy5yKz0odC5yLXRoaXMucikqZSx0aGlzLmcrPSh0LmctdGhpcy5nKSplLHRoaXMuYis9KHQuYi10aGlzLmIpKmUsdGhpc31sZXJwQ29sb3JzKHQsZSxuKXtyZXR1cm4gdGhpcy5yPXQucisoZS5yLXQucikqbix0aGlzLmc9dC5nKyhlLmctdC5nKSpuLHRoaXMuYj10LmIrKGUuYi10LmIpKm4sdGhpc31sZXJwSFNMKHQsZSl7dGhpcy5nZXRIU0woR1F0KSx0LmdldEhTTChXUXQpO2NvbnN0IG49Wlp0KEdRdC5oLFdRdC5oLGUpLGk9Wlp0KEdRdC5zLFdRdC5zLGUpLHI9Wlp0KEdRdC5sLFdRdC5sLGUpO3JldHVybiB0aGlzLnNldEhTTChuLGksciksdGhpc31lcXVhbHModCl7cmV0dXJuIHQucj09PXRoaXMuciYmdC5nPT09dGhpcy5nJiZ0LmI9PT10aGlzLmJ9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5yPXRbZV0sdGhpcy5nPXRbZSsxXSx0aGlzLmI9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy5yLHRbZSsxXT10aGlzLmcsdFtlKzJdPXRoaXMuYix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5yPXQuZ2V0WChlKSx0aGlzLmc9dC5nZXRZKGUpLHRoaXMuYj10LmdldFooZSksITA9PT10Lm5vcm1hbGl6ZWQmJih0aGlzLnIvPTI1NSx0aGlzLmcvPTI1NSx0aGlzLmIvPTI1NSksdGhpc310b0pTT04oKXtyZXR1cm4gdGhpcy5nZXRIZXgoKX19JFF0Lk5BTUVTPWpRdCwkUXQucHJvdG90eXBlLmlzQ29sb3I9ITAsJFF0LnByb3RvdHlwZS5yPTEsJFF0LnByb3RvdHlwZS5nPTEsJFF0LnByb3RvdHlwZS5iPTE7Y2xhc3MgS1F0IGV4dGVuZHMgVVF0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy50eXBlPSJNZXNoQmFzaWNNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgJFF0KDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLnNwZWN1bGFyTWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZW52TWFwPW51bGwsdGhpcy5jb21iaW5lPTAsdGhpcy5yZWZsZWN0aXZpdHk9MSx0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTgsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIix0aGlzLndpcmVmcmFtZUxpbmVqb2luPSJyb3VuZCIsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXA9dC5tYXAsdGhpcy5saWdodE1hcD10LmxpZ2h0TWFwLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9dC5saWdodE1hcEludGVuc2l0eSx0aGlzLmFvTWFwPXQuYW9NYXAsdGhpcy5hb01hcEludGVuc2l0eT10LmFvTWFwSW50ZW5zaXR5LHRoaXMuc3BlY3VsYXJNYXA9dC5zcGVjdWxhck1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5lbnZNYXA9dC5lbnZNYXAsdGhpcy5jb21iaW5lPXQuY29tYmluZSx0aGlzLnJlZmxlY3Rpdml0eT10LnJlZmxlY3Rpdml0eSx0aGlzLnJlZnJhY3Rpb25SYXRpbz10LnJlZnJhY3Rpb25SYXRpbyx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbix0aGlzfX1LUXQucHJvdG90eXBlLmlzTWVzaEJhc2ljTWF0ZXJpYWw9ITA7Y29uc3QgWlF0PW5ldyBDSnQsSlF0PW5ldyBtSnQ7Y2xhc3MgUVF0e2NvbnN0cnVjdG9yKHQsZSxuKXtpZihBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuIik7dGhpcy5uYW1lPSIiLHRoaXMuYXJyYXk9dCx0aGlzLml0ZW1TaXplPWUsdGhpcy5jb3VudD12b2lkIDAhPT10P3QubGVuZ3RoL2U6MCx0aGlzLm5vcm1hbGl6ZWQ9ITA9PT1uLHRoaXMudXNhZ2U9Rlp0LHRoaXMudXBkYXRlUmFuZ2U9e29mZnNldDowLGNvdW50Oi0xfSx0aGlzLnZlcnNpb249MH1vblVwbG9hZENhbGxiYWNrKCl7fXNldCBuZWVkc1VwZGF0ZSh0KXshMD09PXQmJnRoaXMudmVyc2lvbisrfXNldFVzYWdlKHQpe3JldHVybiB0aGlzLnVzYWdlPXQsdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm5hbWU9dC5uYW1lLHRoaXMuYXJyYXk9bmV3IHQuYXJyYXkuY29uc3RydWN0b3IodC5hcnJheSksdGhpcy5pdGVtU2l6ZT10Lml0ZW1TaXplLHRoaXMuY291bnQ9dC5jb3VudCx0aGlzLm5vcm1hbGl6ZWQ9dC5ub3JtYWxpemVkLHRoaXMudXNhZ2U9dC51c2FnZSx0aGlzfWNvcHlBdCh0LGUsbil7dCo9dGhpcy5pdGVtU2l6ZSxuKj1lLml0ZW1TaXplO2ZvcihsZXQgaT0wLHI9dGhpcy5pdGVtU2l6ZTtpPHI7aSsrKXRoaXMuYXJyYXlbdCtpXT1lLmFycmF5W24raV07cmV0dXJuIHRoaXN9Y29weUFycmF5KHQpe3JldHVybiB0aGlzLmFycmF5LnNldCh0KSx0aGlzfWNvcHlDb2xvcnNBcnJheSh0KXtjb25zdCBlPXRoaXMuYXJyYXk7bGV0IG49MDtmb3IobGV0IGk9MCxyPXQubGVuZ3RoO2k8cjtpKyspe2xldCByPXRbaV07dm9pZCAwPT09ciYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlDb2xvcnNBcnJheSgpOiBjb2xvciBpcyB1bmRlZmluZWQiLGkpLHI9bmV3ICRRdCksZVtuKytdPXIucixlW24rK109ci5nLGVbbisrXT1yLmJ9cmV0dXJuIHRoaXN9Y29weVZlY3RvcjJzQXJyYXkodCl7Y29uc3QgZT10aGlzLmFycmF5O2xldCBuPTA7Zm9yKGxldCBpPTAscj10Lmxlbmd0aDtpPHI7aSsrKXtsZXQgcj10W2ldO3ZvaWQgMD09PXImJihjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yMnNBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkIixpKSxyPW5ldyBtSnQpLGVbbisrXT1yLngsZVtuKytdPXIueX1yZXR1cm4gdGhpc31jb3B5VmVjdG9yM3NBcnJheSh0KXtjb25zdCBlPXRoaXMuYXJyYXk7bGV0IG49MDtmb3IobGV0IGk9MCxyPXQubGVuZ3RoO2k8cjtpKyspe2xldCByPXRbaV07dm9pZCAwPT09ciYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQiLGkpLHI9bmV3IENKdCksZVtuKytdPXIueCxlW24rK109ci55LGVbbisrXT1yLnp9cmV0dXJuIHRoaXN9Y29weVZlY3RvcjRzQXJyYXkodCl7Y29uc3QgZT10aGlzLmFycmF5O2xldCBuPTA7Zm9yKGxldCBpPTAscj10Lmxlbmd0aDtpPHI7aSsrKXtsZXQgcj10W2ldO3ZvaWQgMD09PXImJihjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yNHNBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkIixpKSxyPW5ldyB3SnQpLGVbbisrXT1yLngsZVtuKytdPXIueSxlW24rK109ci56LGVbbisrXT1yLnd9cmV0dXJuIHRoaXN9YXBwbHlNYXRyaXgzKHQpe2lmKDI9PT10aGlzLml0ZW1TaXplKWZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKUpRdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksSlF0LmFwcGx5TWF0cml4Myh0KSx0aGlzLnNldFhZKGUsSlF0LngsSlF0LnkpO2Vsc2UgaWYoMz09PXRoaXMuaXRlbVNpemUpZm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspWlF0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxaUXQuYXBwbHlNYXRyaXgzKHQpLHRoaXMuc2V0WFlaKGUsWlF0LngsWlF0LnksWlF0LnopO3JldHVybiB0aGlzfWFwcGx5TWF0cml4NCh0KXtmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylaUXQueD10aGlzLmdldFgoZSksWlF0Lnk9dGhpcy5nZXRZKGUpLFpRdC56PXRoaXMuZ2V0WihlKSxaUXQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0WFlaKGUsWlF0LngsWlF0LnksWlF0LnopO3JldHVybiB0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKVpRdC54PXRoaXMuZ2V0WChlKSxaUXQueT10aGlzLmdldFkoZSksWlF0Lno9dGhpcy5nZXRaKGUpLFpRdC5hcHBseU5vcm1hbE1hdHJpeCh0KSx0aGlzLnNldFhZWihlLFpRdC54LFpRdC55LFpRdC56KTtyZXR1cm4gdGhpc310cmFuc2Zvcm1EaXJlY3Rpb24odCl7Zm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspWlF0Lng9dGhpcy5nZXRYKGUpLFpRdC55PXRoaXMuZ2V0WShlKSxaUXQuej10aGlzLmdldFooZSksWlF0LnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzLnNldFhZWihlLFpRdC54LFpRdC55LFpRdC56KTtyZXR1cm4gdGhpc31zZXQodCxlPTApe3JldHVybiB0aGlzLmFycmF5LnNldCh0LGUpLHRoaXN9Z2V0WCh0KXtyZXR1cm4gdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemVdfXNldFgodCxlKXtyZXR1cm4gdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemVdPWUsdGhpc31nZXRZKHQpe3JldHVybiB0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsxXX1zZXRZKHQsZSl7cmV0dXJuIHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzFdPWUsdGhpc31nZXRaKHQpe3JldHVybiB0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsyXX1zZXRaKHQsZSl7cmV0dXJuIHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzJdPWUsdGhpc31nZXRXKHQpe3JldHVybiB0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSszXX1zZXRXKHQsZSl7cmV0dXJuIHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzNdPWUsdGhpc31zZXRYWSh0LGUsbil7cmV0dXJuIHRoaXMuYXJyYXlbMCsodCo9dGhpcy5pdGVtU2l6ZSldPWUsdGhpcy5hcnJheVt0KzFdPW4sdGhpc31zZXRYWVoodCxlLG4saSl7cmV0dXJuIHRoaXMuYXJyYXlbMCsodCo9dGhpcy5pdGVtU2l6ZSldPWUsdGhpcy5hcnJheVt0KzFdPW4sdGhpcy5hcnJheVt0KzJdPWksdGhpc31zZXRYWVpXKHQsZSxuLGkscil7cmV0dXJuIHRoaXMuYXJyYXlbMCsodCo9dGhpcy5pdGVtU2l6ZSldPWUsdGhpcy5hcnJheVt0KzFdPW4sdGhpcy5hcnJheVt0KzJdPWksdGhpcy5hcnJheVt0KzNdPXIsdGhpc31vblVwbG9hZCh0KXtyZXR1cm4gdGhpcy5vblVwbG9hZENhbGxiYWNrPXQsdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmFycmF5LHRoaXMuaXRlbVNpemUpLmNvcHkodGhpcyl9dG9KU09OKCl7Y29uc3QgdD17aXRlbVNpemU6dGhpcy5pdGVtU2l6ZSx0eXBlOnRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLmFycmF5KSxub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH07cmV0dXJuIiIhPT10aGlzLm5hbWUmJih0Lm5hbWU9dGhpcy5uYW1lKSx0aGlzLnVzYWdlIT09Rlp0JiYodC51c2FnZT10aGlzLnVzYWdlKSwwPT09dGhpcy51cGRhdGVSYW5nZS5vZmZzZXQmJi0xPT09dGhpcy51cGRhdGVSYW5nZS5jb3VudHx8KHQudXBkYXRlUmFuZ2U9dGhpcy51cGRhdGVSYW5nZSksdH19UVF0LnByb3RvdHlwZS5pc0J1ZmZlckF0dHJpYnV0ZT0hMDtjbGFzcyB0MXQgZXh0ZW5kcyBRUXR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBJbnQ4QXJyYXkodCksZSxuKX19Y2xhc3MgZTF0IGV4dGVuZHMgUVF0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgVWludDhBcnJheSh0KSxlLG4pfX1jbGFzcyBuMXQgZXh0ZW5kcyBRUXR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBVaW50OENsYW1wZWRBcnJheSh0KSxlLG4pfX1jbGFzcyBpMXQgZXh0ZW5kcyBRUXR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBJbnQxNkFycmF5KHQpLGUsbil9fWNsYXNzIHIxdCBleHRlbmRzIFFRdHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQxNkFycmF5KHQpLGUsbil9fWNsYXNzIG8xdCBleHRlbmRzIFFRdHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IEludDMyQXJyYXkodCksZSxuKX19Y2xhc3MgYTF0IGV4dGVuZHMgUVF0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgVWludDMyQXJyYXkodCksZSxuKX19Y2xhc3MgczF0IGV4dGVuZHMgUVF0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgVWludDE2QXJyYXkodCksZSxuKX19czF0LnByb3RvdHlwZS5pc0Zsb2F0MTZCdWZmZXJBdHRyaWJ1dGU9ITA7Y2xhc3MgbDF0IGV4dGVuZHMgUVF0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgRmxvYXQzMkFycmF5KHQpLGUsbil9fWNsYXNzIGMxdCBleHRlbmRzIFFRdHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IEZsb2F0NjRBcnJheSh0KSxlLG4pfX1mdW5jdGlvbiB1MXQodCl7aWYoMD09PXQubGVuZ3RoKXJldHVybi0xLzA7bGV0IGU9dFswXTtmb3IobGV0IG49MSxpPXQubGVuZ3RoO248aTsrK24pdFtuXT5lJiYoZT10W25dKTtyZXR1cm4gZX1jb25zdCBoMXQ9e0ludDhBcnJheTpJbnQ4QXJyYXksVWludDhBcnJheTpVaW50OEFycmF5LFVpbnQ4Q2xhbXBlZEFycmF5OlVpbnQ4Q2xhbXBlZEFycmF5LEludDE2QXJyYXk6SW50MTZBcnJheSxVaW50MTZBcnJheTpVaW50MTZBcnJheSxJbnQzMkFycmF5OkludDMyQXJyYXksVWludDMyQXJyYXk6VWludDMyQXJyYXksRmxvYXQzMkFycmF5OkZsb2F0MzJBcnJheSxGbG9hdDY0QXJyYXk6RmxvYXQ2NEFycmF5fTtmdW5jdGlvbiBkMXQodCxlKXtyZXR1cm4gbmV3IGgxdFt0XShlKX1sZXQgcDF0PTA7Y29uc3QgZjF0PW5ldyByUXQsbTF0PW5ldyBrUXQsZzF0PW5ldyBDSnQsXzF0PW5ldyBMSnQseTF0PW5ldyBMSnQsdjF0PW5ldyBDSnQ7Y2xhc3MgYjF0IGV4dGVuZHMgalp0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpwMXQrK30pLHRoaXMudXVpZD1YWnQoKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJCdWZmZXJHZW9tZXRyeSIsdGhpcy5pbmRleD1udWxsLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPSExLHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGwsdGhpcy5kcmF3UmFuZ2U9e3N0YXJ0OjAsY291bnQ6MS8wfSx0aGlzLnVzZXJEYXRhPXt9fWdldEluZGV4KCl7cmV0dXJuIHRoaXMuaW5kZXh9c2V0SW5kZXgodCl7cmV0dXJuIHRoaXMuaW5kZXg9QXJyYXkuaXNBcnJheSh0KT9uZXcodTF0KHQpPjY1NTM1P2ExdDpyMXQpKHQsMSk6dCx0aGlzfWdldEF0dHJpYnV0ZSh0KXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW3RdfXNldEF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF09ZSx0aGlzfWRlbGV0ZUF0dHJpYnV0ZSh0KXtyZXR1cm4gZGVsZXRlIHRoaXMuYXR0cmlidXRlc1t0XSx0aGlzfWhhc0F0dHJpYnV0ZSh0KXtyZXR1cm4gdm9pZCAwIT09dGhpcy5hdHRyaWJ1dGVzW3RdfWFkZEdyb3VwKHQsZSxuPTApe3RoaXMuZ3JvdXBzLnB1c2goe3N0YXJ0OnQsY291bnQ6ZSxtYXRlcmlhbEluZGV4Om59KX1jbGVhckdyb3Vwcygpe3RoaXMuZ3JvdXBzPVtdfXNldERyYXdSYW5nZSh0LGUpe3RoaXMuZHJhd1JhbmdlLnN0YXJ0PXQsdGhpcy5kcmF3UmFuZ2UuY291bnQ9ZX1hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247dm9pZCAwIT09ZSYmKGUuYXBwbHlNYXRyaXg0KHQpLGUubmVlZHNVcGRhdGU9ITApO2NvbnN0IG49dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtpZih2b2lkIDAhPT1uKXtjb25zdCBlPShuZXcgZ0p0KS5nZXROb3JtYWxNYXRyaXgodCk7bi5hcHBseU5vcm1hbE1hdHJpeChlKSxuLm5lZWRzVXBkYXRlPSEwfWNvbnN0IGk9dGhpcy5hdHRyaWJ1dGVzLnRhbmdlbnQ7cmV0dXJuIHZvaWQgMCE9PWkmJihpLnRyYW5zZm9ybURpcmVjdGlvbih0KSxpLm5lZWRzVXBkYXRlPSEwKSxudWxsIT09dGhpcy5ib3VuZGluZ0JveCYmdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKSxudWxsIT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSx0aGlzfWFwcGx5UXVhdGVybmlvbih0KXtyZXR1cm4gZjF0Lm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuYXBwbHlNYXRyaXg0KGYxdCksdGhpc31yb3RhdGVYKHQpe3JldHVybiBmMXQubWFrZVJvdGF0aW9uWCh0KSx0aGlzLmFwcGx5TWF0cml4NChmMXQpLHRoaXN9cm90YXRlWSh0KXtyZXR1cm4gZjF0Lm1ha2VSb3RhdGlvblkodCksdGhpcy5hcHBseU1hdHJpeDQoZjF0KSx0aGlzfXJvdGF0ZVoodCl7cmV0dXJuIGYxdC5tYWtlUm90YXRpb25aKHQpLHRoaXMuYXBwbHlNYXRyaXg0KGYxdCksdGhpc310cmFuc2xhdGUodCxlLG4pe3JldHVybiBmMXQubWFrZVRyYW5zbGF0aW9uKHQsZSxuKSx0aGlzLmFwcGx5TWF0cml4NChmMXQpLHRoaXN9c2NhbGUodCxlLG4pe3JldHVybiBmMXQubWFrZVNjYWxlKHQsZSxuKSx0aGlzLmFwcGx5TWF0cml4NChmMXQpLHRoaXN9bG9va0F0KHQpe3JldHVybiBtMXQubG9va0F0KHQpLG0xdC51cGRhdGVNYXRyaXgoKSx0aGlzLmFwcGx5TWF0cml4NChtMXQubWF0cml4KSx0aGlzfWNlbnRlcigpe3JldHVybiB0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpLHRoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKGcxdCkubmVnYXRlKCksdGhpcy50cmFuc2xhdGUoZzF0LngsZzF0LnksZzF0LnopLHRoaXN9c2V0RnJvbVBvaW50cyh0KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wLGk9dC5sZW5ndGg7bjxpO24rKyl7Y29uc3QgaT10W25dO2UucHVzaChpLngsaS55LGkuenx8MCl9cmV0dXJuIHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGwxdChlLDMpKSx0aGlzfWNvbXB1dGVCb3VuZGluZ0JveCgpe251bGw9PT10aGlzLmJvdW5kaW5nQm94JiYodGhpcy5ib3VuZGluZ0JveD1uZXcgTEp0KTtjb25zdCB0PXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbixlPXRoaXMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKHQmJnQuaXNHTEJ1ZmZlckF0dHJpYnV0ZSlyZXR1cm4gY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk6IEdMQnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIGEgbWFudWFsIGJvdW5kaW5nIGJveC4gQWx0ZXJuYXRpdmVseSBzZXQgIm1lc2guZnJ1c3R1bUN1bGxlZCIgdG8gImZhbHNlIi4nLHRoaXMpLHZvaWQgdGhpcy5ib3VuZGluZ0JveC5zZXQobmV3IENKdCgtMS8wLC0xLzAsLTEvMCksbmV3IENKdCgxLzAsMS8wLDEvMCkpO2lmKHZvaWQgMCE9PXQpe2lmKHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KSxlKWZvcihsZXQgdD0wLG49ZS5sZW5ndGg7dDxuO3QrKylfMXQuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShlW3RdKSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPyh2MXQuYWRkVmVjdG9ycyh0aGlzLmJvdW5kaW5nQm94Lm1pbixfMXQubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQodjF0KSx2MXQuYWRkVmVjdG9ycyh0aGlzLmJvdW5kaW5nQm94Lm1heCxfMXQubWF4KSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQodjF0KSk6KHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChfMXQubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoXzF0Lm1heCkpfWVsc2UgdGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTsoaXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueCl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnkpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi56KSkmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBDb21wdXRlZCBtaW4vbWF4IGhhdmUgTmFOIHZhbHVlcy4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX1jb21wdXRlQm91bmRpbmdTcGhlcmUoKXtudWxsPT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9bmV3ICRKdCk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBzcGhlcmUuIEFsdGVybmF0aXZlbHkgc2V0ICJtZXNoLmZydXN0dW1DdWxsZWQiIHRvICJmYWxzZSIuJyx0aGlzKSx2b2lkIHRoaXMuYm91bmRpbmdTcGhlcmUuc2V0KG5ldyBDSnQsMS8wKTtpZih0KXtjb25zdCBuPXRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO2lmKF8xdC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpLGUpZm9yKGxldCB0PTAsbj1lLmxlbmd0aDt0PG47dCsrKXkxdC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKGVbdF0pLHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU/KHYxdC5hZGRWZWN0b3JzKF8xdC5taW4seTF0Lm1pbiksXzF0LmV4cGFuZEJ5UG9pbnQodjF0KSx2MXQuYWRkVmVjdG9ycyhfMXQubWF4LHkxdC5tYXgpLF8xdC5leHBhbmRCeVBvaW50KHYxdCkpOihfMXQuZXhwYW5kQnlQb2ludCh5MXQubWluKSxfMXQuZXhwYW5kQnlQb2ludCh5MXQubWF4KSk7XzF0LmdldENlbnRlcihuKTtsZXQgaT0wO2ZvcihsZXQgZT0wLHI9dC5jb3VudDtlPHI7ZSsrKXYxdC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksaT1NYXRoLm1heChpLG4uZGlzdGFuY2VUb1NxdWFyZWQodjF0KSk7aWYoZSlmb3IobGV0IHI9MCxvPWUubGVuZ3RoO3I8bztyKyspe2NvbnN0IG89ZVtyXSxhPXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7Zm9yKGxldCBlPTAscj1vLmNvdW50O2U8cjtlKyspdjF0LmZyb21CdWZmZXJBdHRyaWJ1dGUobyxlKSxhJiYoZzF0LmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSx2MXQuYWRkKGcxdCkpLGk9TWF0aC5tYXgoaSxuLmRpc3RhbmNlVG9TcXVhcmVkKHYxdCkpfXRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzPU1hdGguc3FydChpKSxpc05hTih0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cykmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBDb21wdXRlZCByYWRpdXMgaXMgTmFOLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLHRoaXMpfX1jb21wdXRlRmFjZU5vcm1hbHMoKXt9Y29tcHV0ZVRhbmdlbnRzKCl7Y29uc3QgdD10aGlzLmluZGV4LGU9dGhpcy5hdHRyaWJ1dGVzO2lmKG51bGw9PT10fHx2b2lkIDA9PT1lLnBvc2l0aW9ufHx2b2lkIDA9PT1lLm5vcm1hbHx8dm9pZCAwPT09ZS51dilyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGZhaWxlZC4gTWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzIChpbmRleCwgcG9zaXRpb24sIG5vcm1hbCBvciB1dikiKTtjb25zdCBuPXQuYXJyYXksaT1lLnBvc2l0aW9uLmFycmF5LHI9ZS5ub3JtYWwuYXJyYXksbz1lLnV2LmFycmF5LGE9aS5sZW5ndGgvMzt2b2lkIDA9PT1lLnRhbmdlbnQmJnRoaXMuc2V0QXR0cmlidXRlKCJ0YW5nZW50IixuZXcgUVF0KG5ldyBGbG9hdDMyQXJyYXkoNCphKSw0KSk7Y29uc3Qgcz1lLnRhbmdlbnQuYXJyYXksbD1bXSxjPVtdO2ZvcihsZXQgdD0wO3Q8YTt0KyspbFt0XT1uZXcgQ0p0LGNbdF09bmV3IENKdDtjb25zdCB1PW5ldyBDSnQsaD1uZXcgQ0p0LGQ9bmV3IENKdCxwPW5ldyBtSnQsZj1uZXcgbUp0LG09bmV3IG1KdCxnPW5ldyBDSnQsXz1uZXcgQ0p0O2Z1bmN0aW9uIHkodCxlLG4pe3UuZnJvbUFycmF5KGksMyp0KSxoLmZyb21BcnJheShpLDMqZSksZC5mcm9tQXJyYXkoaSwzKm4pLHAuZnJvbUFycmF5KG8sMip0KSxmLmZyb21BcnJheShvLDIqZSksbS5mcm9tQXJyYXkobywyKm4pLGguc3ViKHUpLGQuc3ViKHUpLGYuc3ViKHApLG0uc3ViKHApO2NvbnN0IHI9MS8oZi54Km0ueS1tLngqZi55KTtpc0Zpbml0ZShyKSYmKGcuY29weShoKS5tdWx0aXBseVNjYWxhcihtLnkpLmFkZFNjYWxlZFZlY3RvcihkLC1mLnkpLm11bHRpcGx5U2NhbGFyKHIpLF8uY29weShkKS5tdWx0aXBseVNjYWxhcihmLngpLmFkZFNjYWxlZFZlY3RvcihoLC1tLngpLm11bHRpcGx5U2NhbGFyKHIpLGxbdF0uYWRkKGcpLGxbZV0uYWRkKGcpLGxbbl0uYWRkKGcpLGNbdF0uYWRkKF8pLGNbZV0uYWRkKF8pLGNbbl0uYWRkKF8pKX1sZXQgdj10aGlzLmdyb3VwczswPT09di5sZW5ndGgmJih2PVt7c3RhcnQ6MCxjb3VudDpuLmxlbmd0aH1dKTtmb3IobGV0IHQ9MCxlPXYubGVuZ3RoO3Q8ZTsrK3Qpe2NvbnN0IGU9dlt0XSxpPWUuc3RhcnQ7Zm9yKGxldCB0PWkscj1pK2UuY291bnQ7dDxyO3QrPTMpeShuW3QrMF0sblt0KzFdLG5bdCsyXSl9Y29uc3QgYj1uZXcgQ0p0LHg9bmV3IENKdCx3PW5ldyBDSnQsUz1uZXcgQ0p0O2Z1bmN0aW9uIE0odCl7dy5mcm9tQXJyYXkociwzKnQpLFMuY29weSh3KTtjb25zdCBlPWxbdF07Yi5jb3B5KGUpLGIuc3ViKHcubXVsdGlwbHlTY2FsYXIody5kb3QoZSkpKS5ub3JtYWxpemUoKSx4LmNyb3NzVmVjdG9ycyhTLGUpO2NvbnN0IG49eC5kb3QoY1t0XSk8MD8tMToxO3NbNCp0XT1iLngsc1s0KnQrMV09Yi55LHNbNCp0KzJdPWIueixzWzQqdCszXT1ufWZvcihsZXQgdD0wLGU9di5sZW5ndGg7dDxlOysrdCl7Y29uc3QgZT12W3RdLGk9ZS5zdGFydDtmb3IobGV0IHQ9aSxyPWkrZS5jb3VudDt0PHI7dCs9MylNKG5bdCswXSksTShuW3QrMV0pLE0oblt0KzJdKX19Y29tcHV0ZVZlcnRleE5vcm1hbHMoKXtjb25zdCB0PXRoaXMuaW5kZXgsZT10aGlzLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtpZih2b2lkIDAhPT1lKXtsZXQgbj10aGlzLmdldEF0dHJpYnV0ZSgibm9ybWFsIik7aWYodm9pZCAwPT09biluPW5ldyBRUXQobmV3IEZsb2F0MzJBcnJheSgzKmUuY291bnQpLDMpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG4pO2Vsc2UgZm9yKGxldCB0PTAsZT1uLmNvdW50O3Q8ZTt0Kyspbi5zZXRYWVoodCwwLDAsMCk7Y29uc3QgaT1uZXcgQ0p0LHI9bmV3IENKdCxvPW5ldyBDSnQsYT1uZXcgQ0p0LHM9bmV3IENKdCxsPW5ldyBDSnQsYz1uZXcgQ0p0LHU9bmV3IENKdDtpZih0KWZvcihsZXQgaD0wLGQ9dC5jb3VudDtoPGQ7aCs9Myl7Y29uc3QgZD10LmdldFgoaCswKSxwPXQuZ2V0WChoKzEpLGY9dC5nZXRYKGgrMik7aS5mcm9tQnVmZmVyQXR0cmlidXRlKGUsZCksci5mcm9tQnVmZmVyQXR0cmlidXRlKGUscCksby5mcm9tQnVmZmVyQXR0cmlidXRlKGUsZiksYy5zdWJWZWN0b3JzKG8sciksdS5zdWJWZWN0b3JzKGksciksYy5jcm9zcyh1KSxhLmZyb21CdWZmZXJBdHRyaWJ1dGUobixkKSxzLmZyb21CdWZmZXJBdHRyaWJ1dGUobixwKSxsLmZyb21CdWZmZXJBdHRyaWJ1dGUobixmKSxhLmFkZChjKSxzLmFkZChjKSxsLmFkZChjKSxuLnNldFhZWihkLGEueCxhLnksYS56KSxuLnNldFhZWihwLHMueCxzLnkscy56KSxuLnNldFhZWihmLGwueCxsLnksbC56KX1lbHNlIGZvcihsZXQgdD0wLGE9ZS5jb3VudDt0PGE7dCs9MylpLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSx0KzApLHIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHQrMSksby5mcm9tQnVmZmVyQXR0cmlidXRlKGUsdCsyKSxjLnN1YlZlY3RvcnMobyxyKSx1LnN1YlZlY3RvcnMoaSxyKSxjLmNyb3NzKHUpLG4uc2V0WFlaKHQrMCxjLngsYy55LGMueiksbi5zZXRYWVoodCsxLGMueCxjLnksYy56KSxuLnNldFhZWih0KzIsYy54LGMueSxjLnopO3RoaXMubm9ybWFsaXplTm9ybWFscygpLG4ubmVlZHNVcGRhdGU9ITB9fW1lcmdlKHQsZSl7aWYoIXR8fCF0LmlzQnVmZmVyR2VvbWV0cnkpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkJ1ZmZlckdlb21ldHJ5LiIsdCk7dm9pZCAwPT09ZSYmKGU9MCxjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IE92ZXJ3cml0aW5nIG9yaWdpbmFsIGdlb21ldHJ5LCBzdGFydGluZyBhdCBvZmZzZXQ9MC4gVXNlIEJ1ZmZlckdlb21ldHJ5VXRpbHMubWVyZ2VCdWZmZXJHZW9tZXRyaWVzKCkgZm9yIGxvc3NsZXNzIG1lcmdlLiIpKTtjb25zdCBuPXRoaXMuYXR0cmlidXRlcztmb3IoY29uc3QgaSBpbiBuKXtpZih2b2lkIDA9PT10LmF0dHJpYnV0ZXNbaV0pY29udGludWU7Y29uc3Qgcj1uW2ldLmFycmF5LG89dC5hdHRyaWJ1dGVzW2ldLGE9by5hcnJheSxzPW8uaXRlbVNpemUqZSxsPU1hdGgubWluKGEubGVuZ3RoLHIubGVuZ3RoLXMpO2ZvcihsZXQgdD0wLGU9czt0PGw7dCsrLGUrKylyW2VdPWFbdF19cmV0dXJuIHRoaXN9bm9ybWFsaXplTm9ybWFscygpe2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtmb3IobGV0IGU9MCxuPXQuY291bnQ7ZTxuO2UrKyl2MXQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpLHYxdC5ub3JtYWxpemUoKSx0LnNldFhZWihlLHYxdC54LHYxdC55LHYxdC56KX10b05vbkluZGV4ZWQoKXtmdW5jdGlvbiB0KHQsZSl7Y29uc3Qgbj10LmFycmF5LGk9dC5pdGVtU2l6ZSxyPXQubm9ybWFsaXplZCxvPW5ldyBuLmNvbnN0cnVjdG9yKGUubGVuZ3RoKmkpO2xldCBhPTAscz0wO2ZvcihsZXQgcj0wLGw9ZS5sZW5ndGg7cjxsO3IrKyl7YT10LmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU/ZVtyXSp0LmRhdGEuc3RyaWRlK3Qub2Zmc2V0OmVbcl0qaTtmb3IobGV0IHQ9MDt0PGk7dCsrKW9bcysrXT1uW2ErK119cmV0dXJuIG5ldyBRUXQobyxpLHIpfWlmKG51bGw9PT10aGlzLmluZGV4KXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBCdWZmZXJHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLiIpLHRoaXM7Y29uc3QgZT1uZXcgYjF0LG49dGhpcy5pbmRleC5hcnJheSxpPXRoaXMuYXR0cmlidXRlcztmb3IoY29uc3QgciBpbiBpKXtjb25zdCBvPXQoaVtyXSxuKTtlLnNldEF0dHJpYnV0ZShyLG8pfWNvbnN0IHI9dGhpcy5tb3JwaEF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGkgaW4gcil7Y29uc3Qgbz1bXSxhPXJbaV07Zm9yKGxldCBlPTAsaT1hLmxlbmd0aDtlPGk7ZSsrKXtjb25zdCBpPXQoYVtlXSxuKTtvLnB1c2goaSl9ZS5tb3JwaEF0dHJpYnV0ZXNbaV09b31lLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7Y29uc3Qgbz10aGlzLmdyb3Vwcztmb3IobGV0IHQ9MCxuPW8ubGVuZ3RoO3Q8bjt0Kyspe2NvbnN0IG49b1t0XTtlLmFkZEdyb3VwKG4uc3RhcnQsbi5jb3VudCxuLm1hdGVyaWFsSW5kZXgpfXJldHVybiBlfXRvSlNPTigpe2NvbnN0IHQ9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNSx0eXBlOiJCdWZmZXJHZW9tZXRyeSIsZ2VuZXJhdG9yOiJCdWZmZXJHZW9tZXRyeS50b0pTT04ifX07aWYodC51dWlkPXRoaXMudXVpZCx0LnR5cGU9dGhpcy50eXBlLCIiIT09dGhpcy5uYW1lJiYodC5uYW1lPXRoaXMubmFtZSksT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJih0LnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLHZvaWQgMCE9PXRoaXMucGFyYW1ldGVycyl7Y29uc3QgZT10aGlzLnBhcmFtZXRlcnM7Zm9yKGNvbnN0IG4gaW4gZSl2b2lkIDAhPT1lW25dJiYodFtuXT1lW25dKTtyZXR1cm4gdH10LmRhdGE9e2F0dHJpYnV0ZXM6e319O2NvbnN0IGU9dGhpcy5pbmRleDtudWxsIT09ZSYmKHQuZGF0YS5pbmRleD17dHlwZTplLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5hcnJheSl9KTtjb25zdCBuPXRoaXMuYXR0cmlidXRlcztmb3IoY29uc3QgZSBpbiBuKXQuZGF0YS5hdHRyaWJ1dGVzW2VdPW5bZV0udG9KU09OKHQuZGF0YSk7Y29uc3QgaT17fTtsZXQgcj0hMTtmb3IoY29uc3QgZSBpbiB0aGlzLm1vcnBoQXR0cmlidXRlcyl7Y29uc3Qgbj10aGlzLm1vcnBoQXR0cmlidXRlc1tlXSxvPVtdO2ZvcihsZXQgZT0wLGk9bi5sZW5ndGg7ZTxpO2UrKylvLnB1c2gobltlXS50b0pTT04odC5kYXRhKSk7by5sZW5ndGg+MCYmKGlbZV09byxyPSEwKX1yJiYodC5kYXRhLm1vcnBoQXR0cmlidXRlcz1pLHQuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlKTtjb25zdCBvPXRoaXMuZ3JvdXBzO28ubGVuZ3RoPjAmJih0LmRhdGEuZ3JvdXBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobykpKTtjb25zdCBhPXRoaXMuYm91bmRpbmdTcGhlcmU7cmV0dXJuIG51bGwhPT1hJiYodC5kYXRhLmJvdW5kaW5nU3BoZXJlPXtjZW50ZXI6YS5jZW50ZXIudG9BcnJheSgpLHJhZGl1czphLnJhZGl1c30pLHR9Y2xvbmUoKXtyZXR1cm4obmV3IGIxdCkuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMuaW5kZXg9bnVsbCx0aGlzLmF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaEF0dHJpYnV0ZXM9e30sdGhpcy5ncm91cHM9W10sdGhpcy5ib3VuZGluZ0JveD1udWxsLHRoaXMuYm91bmRpbmdTcGhlcmU9bnVsbDtjb25zdCBlPXt9O3RoaXMubmFtZT10Lm5hbWU7Y29uc3Qgbj10LmluZGV4O251bGwhPT1uJiZ0aGlzLnNldEluZGV4KG4uY2xvbmUoZSkpO2NvbnN0IGk9dC5hdHRyaWJ1dGVzO2Zvcihjb25zdCB0IGluIGkpdGhpcy5zZXRBdHRyaWJ1dGUodCxpW3RdLmNsb25lKGUpKTtjb25zdCByPXQubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCB0IGluIHIpe2NvbnN0IG49W10saT1yW3RdO2ZvcihsZXQgdD0wLHI9aS5sZW5ndGg7dDxyO3QrKyluLnB1c2goaVt0XS5jbG9uZShlKSk7dGhpcy5tb3JwaEF0dHJpYnV0ZXNbdF09bn10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPXQubW9ycGhUYXJnZXRzUmVsYXRpdmU7Y29uc3Qgbz10Lmdyb3Vwcztmb3IobGV0IHQ9MCxlPW8ubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9b1t0XTt0aGlzLmFkZEdyb3VwKGUuc3RhcnQsZS5jb3VudCxlLm1hdGVyaWFsSW5kZXgpfWNvbnN0IGE9dC5ib3VuZGluZ0JveDtudWxsIT09YSYmKHRoaXMuYm91bmRpbmdCb3g9YS5jbG9uZSgpKTtjb25zdCBzPXQuYm91bmRpbmdTcGhlcmU7cmV0dXJuIG51bGwhPT1zJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1zLmNsb25lKCkpLHRoaXMuZHJhd1JhbmdlLnN0YXJ0PXQuZHJhd1JhbmdlLnN0YXJ0LHRoaXMuZHJhd1JhbmdlLmNvdW50PXQuZHJhd1JhbmdlLmNvdW50LHRoaXMudXNlckRhdGE9dC51c2VyRGF0YSx0aGlzfWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fWIxdC5wcm90b3R5cGUuaXNCdWZmZXJHZW9tZXRyeT0hMDtjb25zdCB4MXQ9bmV3IHJRdCx3MXQ9bmV3IGlRdCxTMXQ9bmV3ICRKdCxNMXQ9bmV3IENKdCxFMXQ9bmV3IENKdCxUMXQ9bmV3IENKdCxDMXQ9bmV3IENKdCxBMXQ9bmV3IENKdCxrMXQ9bmV3IENKdCxMMXQ9bmV3IENKdCxQMXQ9bmV3IENKdCxOMXQ9bmV3IENKdCxJMXQ9bmV3IG1KdCxSMXQ9bmV3IG1KdCxPMXQ9bmV3IG1KdCx6MXQ9bmV3IENKdCxEMXQ9bmV3IENKdDtjbGFzcyBCMXQgZXh0ZW5kcyBrUXR7Y29uc3RydWN0b3IodD1uZXcgYjF0LGU9bmV3IEtRdCl7c3VwZXIoKSx0aGlzLnR5cGU9Ik1lc2giLHRoaXMuZ2VvbWV0cnk9dCx0aGlzLm1hdGVyaWFsPWUsdGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHZvaWQgMCE9PXQubW9ycGhUYXJnZXRJbmZsdWVuY2VzJiYodGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9dC5tb3JwaFRhcmdldEluZmx1ZW5jZXMuc2xpY2UoKSksdm9pZCAwIT09dC5tb3JwaFRhcmdldERpY3Rpb25hcnkmJih0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT1PYmplY3QuYXNzaWduKHt9LHQubW9ycGhUYXJnZXREaWN0aW9uYXJ5KSksdGhpcy5tYXRlcmlhbD10Lm1hdGVyaWFsLHRoaXMuZ2VvbWV0cnk9dC5nZW9tZXRyeSx0aGlzfXVwZGF0ZU1vcnBoVGFyZ2V0cygpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeTtpZih0LmlzQnVmZmVyR2VvbWV0cnkpe2NvbnN0IGU9dC5tb3JwaEF0dHJpYnV0ZXMsbj1PYmplY3Qua2V5cyhlKTtpZihuLmxlbmd0aD4wKXtjb25zdCB0PWVbblswXV07aWYodm9pZCAwIT09dCl7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9W10sdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9e307Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXtjb25zdCBuPXRbZV0ubmFtZXx8U3RyaW5nKGUpO3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goMCksdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbbl09ZX19fX1lbHNle2NvbnN0IGU9dC5tb3JwaFRhcmdldHM7dm9pZCAwIT09ZSYmZS5sZW5ndGg+MCYmY29uc29sZS5lcnJvcigiVEhSRUUuTWVzaC51cGRhdGVNb3JwaFRhcmdldHMoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpfX1yYXljYXN0KHQsZSl7Y29uc3Qgbj10aGlzLmdlb21ldHJ5LGk9dGhpcy5tYXRlcmlhbCxyPXRoaXMubWF0cml4V29ybGQ7aWYodm9pZCAwPT09aSlyZXR1cm47aWYobnVsbD09PW4uYm91bmRpbmdTcGhlcmUmJm4uY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksUzF0LmNvcHkobi5ib3VuZGluZ1NwaGVyZSksUzF0LmFwcGx5TWF0cml4NChyKSwhMT09PXQucmF5LmludGVyc2VjdHNTcGhlcmUoUzF0KSlyZXR1cm47aWYoeDF0LmNvcHkocikuaW52ZXJ0KCksdzF0LmNvcHkodC5yYXkpLmFwcGx5TWF0cml4NCh4MXQpLG51bGwhPT1uLmJvdW5kaW5nQm94JiYhMT09PXcxdC5pbnRlcnNlY3RzQm94KG4uYm91bmRpbmdCb3gpKXJldHVybjtsZXQgbztpZihuLmlzQnVmZmVyR2VvbWV0cnkpe2NvbnN0IHI9bi5pbmRleCxhPW4uYXR0cmlidXRlcy5wb3NpdGlvbixzPW4ubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLGw9bi5tb3JwaFRhcmdldHNSZWxhdGl2ZSxjPW4uYXR0cmlidXRlcy51dix1PW4uYXR0cmlidXRlcy51djIsaD1uLmdyb3VwcyxkPW4uZHJhd1JhbmdlO2lmKG51bGwhPT1yKWlmKEFycmF5LmlzQXJyYXkoaSkpZm9yKGxldCBuPTAscD1oLmxlbmd0aDtuPHA7bisrKXtjb25zdCBwPWhbbl0sZj1pW3AubWF0ZXJpYWxJbmRleF07Zm9yKGxldCBuPU1hdGgubWF4KHAuc3RhcnQsZC5zdGFydCksaT1NYXRoLm1pbihwLnN0YXJ0K3AuY291bnQsZC5zdGFydCtkLmNvdW50KTtuPGk7bis9Myl7Y29uc3QgaT1yLmdldFgobiksaD1yLmdldFgobisxKSxkPXIuZ2V0WChuKzIpO289SDF0KHRoaXMsZix0LHcxdCxhLHMsbCxjLHUsaSxoLGQpLG8mJihvLmZhY2VJbmRleD1NYXRoLmZsb29yKG4vMyksby5mYWNlLm1hdGVyaWFsSW5kZXg9cC5tYXRlcmlhbEluZGV4LGUucHVzaChvKSl9fWVsc2UgZm9yKGxldCBuPU1hdGgubWF4KDAsZC5zdGFydCksaD1NYXRoLm1pbihyLmNvdW50LGQuc3RhcnQrZC5jb3VudCk7bjxoO24rPTMpe2NvbnN0IGg9ci5nZXRYKG4pLGQ9ci5nZXRYKG4rMSkscD1yLmdldFgobisyKTtvPUgxdCh0aGlzLGksdCx3MXQsYSxzLGwsYyx1LGgsZCxwKSxvJiYoby5mYWNlSW5kZXg9TWF0aC5mbG9vcihuLzMpLGUucHVzaChvKSl9ZWxzZSBpZih2b2lkIDAhPT1hKWlmKEFycmF5LmlzQXJyYXkoaSkpZm9yKGxldCBuPTAscj1oLmxlbmd0aDtuPHI7bisrKXtjb25zdCByPWhbbl0scD1pW3IubWF0ZXJpYWxJbmRleF07Zm9yKGxldCBuPU1hdGgubWF4KHIuc3RhcnQsZC5zdGFydCksaT1NYXRoLm1pbihyLnN0YXJ0K3IuY291bnQsZC5zdGFydCtkLmNvdW50KTtuPGk7bis9MylvPUgxdCh0aGlzLHAsdCx3MXQsYSxzLGwsYyx1LG4sbisxLG4rMiksbyYmKG8uZmFjZUluZGV4PU1hdGguZmxvb3Iobi8zKSxvLmZhY2UubWF0ZXJpYWxJbmRleD1yLm1hdGVyaWFsSW5kZXgsZS5wdXNoKG8pKX1lbHNlIGZvcihsZXQgbj1NYXRoLm1heCgwLGQuc3RhcnQpLHI9TWF0aC5taW4oYS5jb3VudCxkLnN0YXJ0K2QuY291bnQpO248cjtuKz0zKW89SDF0KHRoaXMsaSx0LHcxdCxhLHMsbCxjLHUsbixuKzEsbisyKSxvJiYoby5mYWNlSW5kZXg9TWF0aC5mbG9vcihuLzMpLGUucHVzaChvKSl9ZWxzZSBuLmlzR2VvbWV0cnkmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1lc2gucmF5Y2FzdCgpIG5vIGxvbmdlciBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIil9fWZ1bmN0aW9uIEgxdCh0LGUsbixpLHIsbyxhLHMsbCxjLHUsaCl7TTF0LmZyb21CdWZmZXJBdHRyaWJ1dGUocixjKSxFMXQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLHUpLFQxdC5mcm9tQnVmZmVyQXR0cmlidXRlKHIsaCk7Y29uc3QgZD10Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztpZihvJiZkKXtMMXQuc2V0KDAsMCwwKSxQMXQuc2V0KDAsMCwwKSxOMXQuc2V0KDAsMCwwKTtmb3IobGV0IHQ9MCxlPW8ubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9ZFt0XSxuPW9bdF07MCE9PWUmJihDMXQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLGMpLEExdC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sdSksazF0LmZyb21CdWZmZXJBdHRyaWJ1dGUobixoKSxhPyhMMXQuYWRkU2NhbGVkVmVjdG9yKEMxdCxlKSxQMXQuYWRkU2NhbGVkVmVjdG9yKEExdCxlKSxOMXQuYWRkU2NhbGVkVmVjdG9yKGsxdCxlKSk6KEwxdC5hZGRTY2FsZWRWZWN0b3IoQzF0LnN1YihNMXQpLGUpLFAxdC5hZGRTY2FsZWRWZWN0b3IoQTF0LnN1YihFMXQpLGUpLE4xdC5hZGRTY2FsZWRWZWN0b3IoazF0LnN1YihUMXQpLGUpKSl9TTF0LmFkZChMMXQpLEUxdC5hZGQoUDF0KSxUMXQuYWRkKE4xdCl9dC5pc1NraW5uZWRNZXNoJiYodC5ib25lVHJhbnNmb3JtKGMsTTF0KSx0LmJvbmVUcmFuc2Zvcm0odSxFMXQpLHQuYm9uZVRyYW5zZm9ybShoLFQxdCkpO2NvbnN0IHA9KGZ1bmN0aW9uIGYodCxlLG4saSxyLG8sYSxzKXtsZXQgbDtpZihsPTE9PT1lLnNpZGU/aS5pbnRlcnNlY3RUcmlhbmdsZShhLG8sciwhMCxzKTppLmludGVyc2VjdFRyaWFuZ2xlKHIsbyxhLDIhPT1lLnNpZGUscyksbnVsbD09PWwpcmV0dXJuIG51bGw7RDF0LmNvcHkocyksRDF0LmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKTtjb25zdCBjPW4ucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKEQxdCk7cmV0dXJuIGM8bi5uZWFyfHxjPm4uZmFyP251bGw6e2Rpc3RhbmNlOmMscG9pbnQ6RDF0LmNsb25lKCksb2JqZWN0OnR9fSkodCxlLG4saSxNMXQsRTF0LFQxdCx6MXQpO2lmKHApe3MmJihJMXQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLGMpLFIxdC5mcm9tQnVmZmVyQXR0cmlidXRlKHMsdSksTzF0LmZyb21CdWZmZXJBdHRyaWJ1dGUocyxoKSxwLnV2PUZRdC5nZXRVVih6MXQsTTF0LEUxdCxUMXQsSTF0LFIxdCxPMXQsbmV3IG1KdCkpLGwmJihJMXQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShsLGMpLFIxdC5mcm9tQnVmZmVyQXR0cmlidXRlKGwsdSksTzF0LmZyb21CdWZmZXJBdHRyaWJ1dGUobCxoKSxwLnV2Mj1GUXQuZ2V0VVYoejF0LE0xdCxFMXQsVDF0LEkxdCxSMXQsTzF0LG5ldyBtSnQpKTtjb25zdCB0PXthOmMsYjp1LGM6aCxub3JtYWw6bmV3IENKdCxtYXRlcmlhbEluZGV4OjB9O0ZRdC5nZXROb3JtYWwoTTF0LEUxdCxUMXQsdC5ub3JtYWwpLHAuZmFjZT10fXJldHVybiBwfUIxdC5wcm90b3R5cGUuaXNNZXNoPSEwO2NsYXNzIEYxdCBleHRlbmRzIGIxdHtjb25zdHJ1Y3Rvcih0PTEsZT0xLG49MSxpPTEscj0xLG89MSl7c3VwZXIoKSx0aGlzLnR5cGU9IkJveEdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOnQsaGVpZ2h0OmUsZGVwdGg6bix3aWR0aFNlZ21lbnRzOmksaGVpZ2h0U2VnbWVudHM6cixkZXB0aFNlZ21lbnRzOm99O2NvbnN0IGE9dGhpcztpPU1hdGguZmxvb3IoaSkscj1NYXRoLmZsb29yKHIpLG89TWF0aC5mbG9vcihvKTtjb25zdCBzPVtdLGw9W10sYz1bXSx1PVtdO2xldCBoPTAsZD0wO2Z1bmN0aW9uIHAodCxlLG4saSxyLG8scCxmLG0sZyxfKXtjb25zdCB5PW8vbSx2PXAvZyxiPW8vMix4PXAvMix3PWYvMixTPW0rMSxNPWcrMTtsZXQgRT0wLFQ9MDtjb25zdCBDPW5ldyBDSnQ7Zm9yKGxldCBvPTA7bzxNO28rKyl7Y29uc3QgYT1vKnYteDtmb3IobGV0IHM9MDtzPFM7cysrKUNbdF09KHMqeS1iKSppLENbZV09YSpyLENbbl09dyxsLnB1c2goQy54LEMueSxDLnopLENbdF09MCxDW2VdPTAsQ1tuXT1mPjA/MTotMSxjLnB1c2goQy54LEMueSxDLnopLHUucHVzaChzL20pLHUucHVzaCgxLW8vZyksRSs9MX1mb3IobGV0IHQ9MDt0PGc7dCsrKWZvcihsZXQgZT0wO2U8bTtlKyspe2NvbnN0IG49aCtlK1MqKHQrMSksaT1oKyhlKzEpK1MqKHQrMSkscj1oKyhlKzEpK1MqdDtzLnB1c2goaCtlK1MqdCxuLHIpLHMucHVzaChuLGksciksVCs9Nn1hLmFkZEdyb3VwKGQsVCxfKSxkKz1ULGgrPUV9cCgieiIsInkiLCJ4IiwtMSwtMSxuLGUsdCxvLHIsMCkscCgieiIsInkiLCJ4IiwxLC0xLG4sZSwtdCxvLHIsMSkscCgieCIsInoiLCJ5IiwxLDEsdCxuLGUsaSxvLDIpLHAoIngiLCJ6IiwieSIsMSwtMSx0LG4sLWUsaSxvLDMpLHAoIngiLCJ5IiwieiIsMSwtMSx0LGUsbixpLHIsNCkscCgieCIsInkiLCJ6IiwtMSwtMSx0LGUsLW4saSxyLDUpLHRoaXMuc2V0SW5kZXgocyksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KGwsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBsMXQoYywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgbDF0KHUsMikpfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IEYxdCh0LndpZHRoLHQuaGVpZ2h0LHQuZGVwdGgsdC53aWR0aFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMsdC5kZXB0aFNlZ21lbnRzKX19ZnVuY3Rpb24gVjF0KHQpe2NvbnN0IGU9e307Zm9yKGNvbnN0IG4gaW4gdCl7ZVtuXT17fTtmb3IoY29uc3QgaSBpbiB0W25dKXtjb25zdCByPXRbbl1baV07ZVtuXVtpXT1yJiYoci5pc0NvbG9yfHxyLmlzTWF0cml4M3x8ci5pc01hdHJpeDR8fHIuaXNWZWN0b3IyfHxyLmlzVmVjdG9yM3x8ci5pc1ZlY3RvcjR8fHIuaXNUZXh0dXJlfHxyLmlzUXVhdGVybmlvbik/ci5jbG9uZSgpOkFycmF5LmlzQXJyYXkocik/ci5zbGljZSgpOnJ9fXJldHVybiBlfWZ1bmN0aW9uIFUxdCh0KXtjb25zdCBlPXt9O2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCBpPVYxdCh0W25dKTtmb3IoY29uc3QgdCBpbiBpKWVbdF09aVt0XX1yZXR1cm4gZX1jb25zdCBqMXQ9e2Nsb25lOlYxdCxtZXJnZTpVMXR9O2NsYXNzIEcxdCBleHRlbmRzIFVRdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iU2hhZGVyTWF0ZXJpYWwiLHRoaXMuZGVmaW5lcz17fSx0aGlzLnVuaWZvcm1zPXt9LHRoaXMudmVydGV4U2hhZGVyPSJ2b2lkIG1haW4oKSB7XG5cdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcbn0iLHRoaXMuZnJhZ21lbnRTaGFkZXI9InZvaWQgbWFpbigpIHtcblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggMS4wLCAwLjAsIDAuMCwgMS4wICk7XG59Iix0aGlzLmxpbmV3aWR0aD0xLHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy5mb2c9ITEsdGhpcy5saWdodHM9ITEsdGhpcy5jbGlwcGluZz0hMSx0aGlzLmV4dGVuc2lvbnM9e2Rlcml2YXRpdmVzOiExLGZyYWdEZXB0aDohMSxkcmF3QnVmZmVyczohMSxzaGFkZXJUZXh0dXJlTE9EOiExfSx0aGlzLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM9e2NvbG9yOlsxLDEsMV0sdXY6WzAsMF0sdXYyOlswLDBdfSx0aGlzLmluZGV4MEF0dHJpYnV0ZU5hbWU9dm9pZCAwLHRoaXMudW5pZm9ybXNOZWVkVXBkYXRlPSExLHRoaXMuZ2xzbFZlcnNpb249bnVsbCx2b2lkIDAhPT10JiYodm9pZCAwIT09dC5hdHRyaWJ1dGVzJiZjb25zb2xlLmVycm9yKCJUSFJFRS5TaGFkZXJNYXRlcmlhbDogYXR0cmlidXRlcyBzaG91bGQgbm93IGJlIGRlZmluZWQgaW4gVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKSx0aGlzLnNldFZhbHVlcyh0KSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmZyYWdtZW50U2hhZGVyPXQuZnJhZ21lbnRTaGFkZXIsdGhpcy52ZXJ0ZXhTaGFkZXI9dC52ZXJ0ZXhTaGFkZXIsdGhpcy51bmlmb3Jtcz1WMXQodC51bmlmb3JtcyksdGhpcy5kZWZpbmVzPU9iamVjdC5hc3NpZ24oe30sdC5kZWZpbmVzKSx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLmxpZ2h0cz10LmxpZ2h0cyx0aGlzLmNsaXBwaW5nPXQuY2xpcHBpbmcsdGhpcy5leHRlbnNpb25zPU9iamVjdC5hc3NpZ24oe30sdC5leHRlbnNpb25zKSx0aGlzLmdsc2xWZXJzaW9uPXQuZ2xzbFZlcnNpb24sdGhpc310b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7ZS5nbHNsVmVyc2lvbj10aGlzLmdsc2xWZXJzaW9uLGUudW5pZm9ybXM9e307Zm9yKGNvbnN0IG4gaW4gdGhpcy51bmlmb3Jtcyl7Y29uc3QgaT10aGlzLnVuaWZvcm1zW25dLnZhbHVlO2UudW5pZm9ybXNbbl09aSYmaS5pc1RleHR1cmU/e3R5cGU6InQiLHZhbHVlOmkudG9KU09OKHQpLnV1aWR9OmkmJmkuaXNDb2xvcj97dHlwZToiYyIsdmFsdWU6aS5nZXRIZXgoKX06aSYmaS5pc1ZlY3RvcjI/e3R5cGU6InYyIix2YWx1ZTppLnRvQXJyYXkoKX06aSYmaS5pc1ZlY3RvcjM/e3R5cGU6InYzIix2YWx1ZTppLnRvQXJyYXkoKX06aSYmaS5pc1ZlY3RvcjQ/e3R5cGU6InY0Iix2YWx1ZTppLnRvQXJyYXkoKX06aSYmaS5pc01hdHJpeDM/e3R5cGU6Im0zIix2YWx1ZTppLnRvQXJyYXkoKX06aSYmaS5pc01hdHJpeDQ/e3R5cGU6Im00Iix2YWx1ZTppLnRvQXJyYXkoKX06e3ZhbHVlOml9fU9iamVjdC5rZXlzKHRoaXMuZGVmaW5lcykubGVuZ3RoPjAmJihlLmRlZmluZXM9dGhpcy5kZWZpbmVzKSxlLnZlcnRleFNoYWRlcj10aGlzLnZlcnRleFNoYWRlcixlLmZyYWdtZW50U2hhZGVyPXRoaXMuZnJhZ21lbnRTaGFkZXI7Y29uc3Qgbj17fTtmb3IoY29uc3QgdCBpbiB0aGlzLmV4dGVuc2lvbnMpITA9PT10aGlzLmV4dGVuc2lvbnNbdF0mJihuW3RdPSEwKTtyZXR1cm4gT2JqZWN0LmtleXMobikubGVuZ3RoPjAmJihlLmV4dGVuc2lvbnM9biksZX19RzF0LnByb3RvdHlwZS5pc1NoYWRlck1hdGVyaWFsPSEwO2NsYXNzIFcxdCBleHRlbmRzIGtRdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy50eXBlPSJDYW1lcmEiLHRoaXMubWF0cml4V29ybGRJbnZlcnNlPW5ldyByUXQsdGhpcy5wcm9qZWN0aW9uTWF0cml4PW5ldyByUXQsdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZT1uZXcgclF0fWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkodC5tYXRyaXhXb3JsZEludmVyc2UpLHRoaXMucHJvamVjdGlvbk1hdHJpeC5jb3B5KHQucHJvamVjdGlvbk1hdHJpeCksdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHQucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLHRoaXN9Z2V0V29ybGREaXJlY3Rpb24odCl7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSk7Y29uc3QgZT10aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO3JldHVybiB0LnNldCgtZVs4XSwtZVs5XSwtZVsxMF0pLm5vcm1hbGl6ZSgpfXVwZGF0ZU1hdHJpeFdvcmxkKHQpe3N1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKHQpLHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCl9dXBkYXRlV29ybGRNYXRyaXgodCxlKXtzdXBlci51cGRhdGVXb3JsZE1hdHJpeCh0LGUpLHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCl9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fVcxdC5wcm90b3R5cGUuaXNDYW1lcmE9ITA7Y2xhc3MgcTF0IGV4dGVuZHMgVzF0e2NvbnN0cnVjdG9yKHQ9NTAsZT0xLG49LjEsaT0yZTMpe3N1cGVyKCksdGhpcy50eXBlPSJQZXJzcGVjdGl2ZUNhbWVyYSIsdGhpcy5mb3Y9dCx0aGlzLnpvb209MSx0aGlzLm5lYXI9bix0aGlzLmZhcj1pLHRoaXMuZm9jdXM9MTAsdGhpcy5hc3BlY3Q9ZSx0aGlzLnZpZXc9bnVsbCx0aGlzLmZpbG1HYXVnZT0zNSx0aGlzLmZpbG1PZmZzZXQ9MCx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0aGlzLmZvdj10LmZvdix0aGlzLnpvb209dC56b29tLHRoaXMubmVhcj10Lm5lYXIsdGhpcy5mYXI9dC5mYXIsdGhpcy5mb2N1cz10LmZvY3VzLHRoaXMuYXNwZWN0PXQuYXNwZWN0LHRoaXMudmlldz1udWxsPT09dC52aWV3P251bGw6T2JqZWN0LmFzc2lnbih7fSx0LnZpZXcpLHRoaXMuZmlsbUdhdWdlPXQuZmlsbUdhdWdlLHRoaXMuZmlsbU9mZnNldD10LmZpbG1PZmZzZXQsdGhpc31zZXRGb2NhbExlbmd0aCh0KXtjb25zdCBlPS41KnRoaXMuZ2V0RmlsbUhlaWdodCgpL3Q7dGhpcy5mb3Y9MipZWnQqTWF0aC5hdGFuKGUpLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfWdldEZvY2FsTGVuZ3RoKCl7Y29uc3QgdD1NYXRoLnRhbiguNSpxWnQqdGhpcy5mb3YpO3JldHVybi41KnRoaXMuZ2V0RmlsbUhlaWdodCgpL3R9Z2V0RWZmZWN0aXZlRk9WKCl7cmV0dXJuIDIqWVp0Kk1hdGguYXRhbihNYXRoLnRhbiguNSpxWnQqdGhpcy5mb3YpL3RoaXMuem9vbSl9Z2V0RmlsbVdpZHRoKCl7cmV0dXJuIHRoaXMuZmlsbUdhdWdlKk1hdGgubWluKHRoaXMuYXNwZWN0LDEpfWdldEZpbG1IZWlnaHQoKXtyZXR1cm4gdGhpcy5maWxtR2F1Z2UvTWF0aC5tYXgodGhpcy5hc3BlY3QsMSl9c2V0Vmlld09mZnNldCh0LGUsbixpLHIsbyl7dGhpcy5hc3BlY3Q9dC9lLG51bGw9PT10aGlzLnZpZXcmJih0aGlzLnZpZXc9e2VuYWJsZWQ6ITAsZnVsbFdpZHRoOjEsZnVsbEhlaWdodDoxLG9mZnNldFg6MCxvZmZzZXRZOjAsd2lkdGg6MSxoZWlnaHQ6MX0pLHRoaXMudmlldy5lbmFibGVkPSEwLHRoaXMudmlldy5mdWxsV2lkdGg9dCx0aGlzLnZpZXcuZnVsbEhlaWdodD1lLHRoaXMudmlldy5vZmZzZXRYPW4sdGhpcy52aWV3Lm9mZnNldFk9aSx0aGlzLnZpZXcud2lkdGg9cix0aGlzLnZpZXcuaGVpZ2h0PW8sdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Y2xlYXJWaWV3T2Zmc2V0KCl7bnVsbCE9PXRoaXMudmlldyYmKHRoaXMudmlldy5lbmFibGVkPSExKSx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX11cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl7Y29uc3QgdD10aGlzLm5lYXI7bGV0IGU9dCpNYXRoLnRhbiguNSpxWnQqdGhpcy5mb3YpL3RoaXMuem9vbSxuPTIqZSxpPXRoaXMuYXNwZWN0Km4scj0tLjUqaTtjb25zdCBvPXRoaXMudmlldztpZihudWxsIT09dGhpcy52aWV3JiZ0aGlzLnZpZXcuZW5hYmxlZCl7Y29uc3QgdD1vLmZ1bGxXaWR0aCxhPW8uZnVsbEhlaWdodDtyKz1vLm9mZnNldFgqaS90LGUtPW8ub2Zmc2V0WSpuL2EsaSo9by53aWR0aC90LG4qPW8uaGVpZ2h0L2F9Y29uc3QgYT10aGlzLmZpbG1PZmZzZXQ7MCE9PWEmJihyKz10KmEvdGhpcy5nZXRGaWxtV2lkdGgoKSksdGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZShyLHIraSxlLGUtbix0LHRoaXMuZmFyKSx0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5wcm9qZWN0aW9uTWF0cml4KS5pbnZlcnQoKX10b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUub2JqZWN0LmZvdj10aGlzLmZvdixlLm9iamVjdC56b29tPXRoaXMuem9vbSxlLm9iamVjdC5uZWFyPXRoaXMubmVhcixlLm9iamVjdC5mYXI9dGhpcy5mYXIsZS5vYmplY3QuZm9jdXM9dGhpcy5mb2N1cyxlLm9iamVjdC5hc3BlY3Q9dGhpcy5hc3BlY3QsbnVsbCE9PXRoaXMudmlldyYmKGUub2JqZWN0LnZpZXc9T2JqZWN0LmFzc2lnbih7fSx0aGlzLnZpZXcpKSxlLm9iamVjdC5maWxtR2F1Z2U9dGhpcy5maWxtR2F1Z2UsZS5vYmplY3QuZmlsbU9mZnNldD10aGlzLmZpbG1PZmZzZXQsZX19cTF0LnByb3RvdHlwZS5pc1BlcnNwZWN0aXZlQ2FtZXJhPSEwO2NvbnN0IFkxdD05MDtjbGFzcyBYMXQgZXh0ZW5kcyBrUXR7Y29uc3RydWN0b3IodCxlLG4pe2lmKHN1cGVyKCksdGhpcy50eXBlPSJDdWJlQ2FtZXJhIiwhMCE9PW4uaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuQ3ViZUNhbWVyYTogVGhlIGNvbnN0cnVjdG9yIG5vdyBleHBlY3RzIGFuIGluc3RhbmNlIG9mIFdlYkdMQ3ViZVJlbmRlclRhcmdldCBhcyB0aGlyZCBwYXJhbWV0ZXIuIik7dGhpcy5yZW5kZXJUYXJnZXQ9bjtjb25zdCBpPW5ldyBxMXQoWTF0LDEsdCxlKTtpLmxheWVycz10aGlzLmxheWVycyxpLnVwLnNldCgwLC0xLDApLGkubG9va0F0KG5ldyBDSnQoMSwwLDApKSx0aGlzLmFkZChpKTtjb25zdCByPW5ldyBxMXQoWTF0LDEsdCxlKTtyLmxheWVycz10aGlzLmxheWVycyxyLnVwLnNldCgwLC0xLDApLHIubG9va0F0KG5ldyBDSnQoLTEsMCwwKSksdGhpcy5hZGQocik7Y29uc3Qgbz1uZXcgcTF0KFkxdCwxLHQsZSk7by5sYXllcnM9dGhpcy5sYXllcnMsby51cC5zZXQoMCwwLDEpLG8ubG9va0F0KG5ldyBDSnQoMCwxLDApKSx0aGlzLmFkZChvKTtjb25zdCBhPW5ldyBxMXQoWTF0LDEsdCxlKTthLmxheWVycz10aGlzLmxheWVycyxhLnVwLnNldCgwLDAsLTEpLGEubG9va0F0KG5ldyBDSnQoMCwtMSwwKSksdGhpcy5hZGQoYSk7Y29uc3Qgcz1uZXcgcTF0KFkxdCwxLHQsZSk7cy5sYXllcnM9dGhpcy5sYXllcnMscy51cC5zZXQoMCwtMSwwKSxzLmxvb2tBdChuZXcgQ0p0KDAsMCwxKSksdGhpcy5hZGQocyk7Y29uc3QgbD1uZXcgcTF0KFkxdCwxLHQsZSk7bC5sYXllcnM9dGhpcy5sYXllcnMsbC51cC5zZXQoMCwtMSwwKSxsLmxvb2tBdChuZXcgQ0p0KDAsMCwtMSkpLHRoaXMuYWRkKGwpfXVwZGF0ZSh0LGUpe251bGw9PT10aGlzLnBhcmVudCYmdGhpcy51cGRhdGVNYXRyaXhXb3JsZCgpO2NvbnN0IG49dGhpcy5yZW5kZXJUYXJnZXQsW2kscixvLGEscyxsXT10aGlzLmNoaWxkcmVuLGM9dC54ci5lbmFibGVkLHU9dC5nZXRSZW5kZXJUYXJnZXQoKTt0LnhyLmVuYWJsZWQ9ITE7Y29uc3QgaD1uLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzO24udGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9ITEsdC5zZXRSZW5kZXJUYXJnZXQobiwwKSx0LnJlbmRlcihlLGkpLHQuc2V0UmVuZGVyVGFyZ2V0KG4sMSksdC5yZW5kZXIoZSxyKSx0LnNldFJlbmRlclRhcmdldChuLDIpLHQucmVuZGVyKGUsbyksdC5zZXRSZW5kZXJUYXJnZXQobiwzKSx0LnJlbmRlcihlLGEpLHQuc2V0UmVuZGVyVGFyZ2V0KG4sNCksdC5yZW5kZXIoZSxzKSxuLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPWgsdC5zZXRSZW5kZXJUYXJnZXQobiw1KSx0LnJlbmRlcihlLGwpLHQuc2V0UmVuZGVyVGFyZ2V0KHUpLHQueHIuZW5hYmxlZD1jfX1jbGFzcyAkMXQgZXh0ZW5kcyBiSnR7Y29uc3RydWN0b3IodCxlLG4saSxyLG8sYSxzLGwsYyl7c3VwZXIodD12b2lkIDAhPT10P3Q6W10sZT12b2lkIDAhPT1lP2U6akt0LG4saSxyLG8sYT12b2lkIDAhPT1hP2E6dVp0LHMsbCxjKSx0aGlzLmZsaXBZPSExfWdldCBpbWFnZXMoKXtyZXR1cm4gdGhpcy5pbWFnZX1zZXQgaW1hZ2VzKHQpe3RoaXMuaW1hZ2U9dH19JDF0LnByb3RvdHlwZS5pc0N1YmVUZXh0dXJlPSEwO2NsYXNzIEsxdCBleHRlbmRzIFNKdHtjb25zdHJ1Y3Rvcih0LGUsbil7TnVtYmVyLmlzSW50ZWdlcihlKSYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xDdWJlUmVuZGVyVGFyZ2V0OiBjb25zdHJ1Y3RvciBzaWduYXR1cmUgaXMgbm93IFdlYkdMQ3ViZVJlbmRlclRhcmdldCggc2l6ZSwgb3B0aW9ucyApIiksZT1uKSxzdXBlcih0LHQsZSksdGhpcy50ZXh0dXJlPW5ldyAkMXQodm9pZCAwLChlPWV8fHt9KS5tYXBwaW5nLGUud3JhcFMsZS53cmFwVCxlLm1hZ0ZpbHRlcixlLm1pbkZpbHRlcixlLmZvcm1hdCxlLnR5cGUsZS5hbmlzb3Ryb3B5LGUuZW5jb2RpbmcpLHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITAsdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz12b2lkIDAhPT1lLmdlbmVyYXRlTWlwbWFwcyYmZS5nZW5lcmF0ZU1pcG1hcHMsdGhpcy50ZXh0dXJlLm1pbkZpbHRlcj12b2lkIDAhPT1lLm1pbkZpbHRlcj9lLm1pbkZpbHRlcjplWnQsdGhpcy50ZXh0dXJlLl9uZWVkc0ZsaXBFbnZNYXA9ITF9ZnJvbUVxdWlyZWN0YW5ndWxhclRleHR1cmUodCxlKXt0aGlzLnRleHR1cmUudHlwZT1lLnR5cGUsdGhpcy50ZXh0dXJlLmZvcm1hdD1oWnQsdGhpcy50ZXh0dXJlLmVuY29kaW5nPWUuZW5jb2RpbmcsdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz1lLmdlbmVyYXRlTWlwbWFwcyx0aGlzLnRleHR1cmUubWluRmlsdGVyPWUubWluRmlsdGVyLHRoaXMudGV4dHVyZS5tYWdGaWx0ZXI9ZS5tYWdGaWx0ZXI7Y29uc3Qgbj1uZXcgRjF0KDUsNSw1KSxpPW5ldyBHMXQoe25hbWU6IkN1YmVtYXBGcm9tRXF1aXJlY3QiLHVuaWZvcm1zOlYxdCh7dEVxdWlyZWN0Ont2YWx1ZTpudWxsfX0pLHZlcnRleFNoYWRlcjoiXG5cblx0XHRcdFx0dmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcblxuXHRcdFx0XHR2ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIG5vcm1hbGl6ZSggKCBtYXRyaXggKiB2ZWM0KCBkaXIsIDAuMCApICkueHl6ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZvaWQgbWFpbigpIHtcblxuXHRcdFx0XHRcdHZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cblx0XHRcdFx0XHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHRcdFx0XHRcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblxuXHRcdFx0XHR9XG5cdFx0XHQiLGZyYWdtZW50U2hhZGVyOiJcblxuXHRcdFx0XHR1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7XG5cblx0XHRcdFx0dmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcblxuXHRcdFx0XHQjaW5jbHVkZSA8Y29tbW9uPlxuXG5cdFx0XHRcdHZvaWQgbWFpbigpIHtcblxuXHRcdFx0XHRcdHZlYzMgZGlyZWN0aW9uID0gbm9ybWFsaXplKCB2V29ybGREaXJlY3Rpb24gKTtcblxuXHRcdFx0XHRcdHZlYzIgc2FtcGxlVVYgPSBlcXVpcmVjdFV2KCBkaXJlY3Rpb24gKTtcblxuXHRcdFx0XHRcdGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCggdEVxdWlyZWN0LCBzYW1wbGVVViApO1xuXG5cdFx0XHRcdH1cblx0XHRcdCIsc2lkZToxLGJsZW5kaW5nOjB9KTtpLnVuaWZvcm1zLnRFcXVpcmVjdC52YWx1ZT1lO2NvbnN0IHI9bmV3IEIxdChuLGkpLG89ZS5taW5GaWx0ZXI7cmV0dXJuIGUubWluRmlsdGVyPT09aVp0JiYoZS5taW5GaWx0ZXI9ZVp0KSxuZXcgWDF0KDEsMTAsdGhpcykudXBkYXRlKHQsciksZS5taW5GaWx0ZXI9byxyLmdlb21ldHJ5LmRpc3Bvc2UoKSxyLm1hdGVyaWFsLmRpc3Bvc2UoKSx0aGlzfWNsZWFyKHQsZSxuLGkpe2NvbnN0IHI9dC5nZXRSZW5kZXJUYXJnZXQoKTtmb3IobGV0IHI9MDtyPDY7cisrKXQuc2V0UmVuZGVyVGFyZ2V0KHRoaXMsciksdC5jbGVhcihlLG4saSk7dC5zZXRSZW5kZXJUYXJnZXQocil9fUsxdC5wcm90b3R5cGUuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQ9ITA7Y29uc3QgWjF0PW5ldyBDSnQsSjF0PW5ldyBDSnQsUTF0PW5ldyBnSnQ7Y2xhc3MgdDB0e2NvbnN0cnVjdG9yKHQ9bmV3IENKdCgxLDAsMCksZT0wKXt0aGlzLm5vcm1hbD10LHRoaXMuY29uc3RhbnQ9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWwuY29weSh0KSx0aGlzLmNvbnN0YW50PWUsdGhpc31zZXRDb21wb25lbnRzKHQsZSxuLGkpe3JldHVybiB0aGlzLm5vcm1hbC5zZXQodCxlLG4pLHRoaXMuY29uc3RhbnQ9aSx0aGlzfXNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodCksdGhpcy5jb25zdGFudD0tZS5kb3QodGhpcy5ub3JtYWwpLHRoaXN9c2V0RnJvbUNvcGxhbmFyUG9pbnRzKHQsZSxuKXtjb25zdCBpPVoxdC5zdWJWZWN0b3JzKG4sZSkuY3Jvc3MoSjF0LnN1YlZlY3RvcnModCxlKSkubm9ybWFsaXplKCk7cmV0dXJuIHRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoaSx0KSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodC5ub3JtYWwpLHRoaXMuY29uc3RhbnQ9dC5jb25zdGFudCx0aGlzfW5vcm1hbGl6ZSgpe2NvbnN0IHQ9MS90aGlzLm5vcm1hbC5sZW5ndGgoKTtyZXR1cm4gdGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIodCksdGhpcy5jb25zdGFudCo9dCx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLmNvbnN0YW50Kj0tMSx0aGlzLm5vcm1hbC5uZWdhdGUoKSx0aGlzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5ub3JtYWwuZG90KHQpK3RoaXMuY29uc3RhbnR9ZGlzdGFuY2VUb1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQodC5jZW50ZXIpLXQucmFkaXVzfXByb2plY3RQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmRpc3RhbmNlVG9Qb2ludCh0KSkuYWRkKHQpfWludGVyc2VjdExpbmUodCxlKXtjb25zdCBuPXQuZGVsdGEoWjF0KSxpPXRoaXMubm9ybWFsLmRvdChuKTtpZigwPT09aSlyZXR1cm4gMD09PXRoaXMuZGlzdGFuY2VUb1BvaW50KHQuc3RhcnQpP2UuY29weSh0LnN0YXJ0KTpudWxsO2NvbnN0IHI9LSh0LnN0YXJ0LmRvdCh0aGlzLm5vcm1hbCkrdGhpcy5jb25zdGFudCkvaTtyZXR1cm4gcjwwfHxyPjE/bnVsbDplLmNvcHkobikubXVsdGlwbHlTY2FsYXIocikuYWRkKHQuc3RhcnQpfWludGVyc2VjdHNMaW5lKHQpe2NvbnN0IGU9dGhpcy5kaXN0YW5jZVRvUG9pbnQodC5zdGFydCksbj10aGlzLmRpc3RhbmNlVG9Qb2ludCh0LmVuZCk7cmV0dXJuIGU8MCYmbj4wfHxuPDAmJmU+MH1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1jb3BsYW5hclBvaW50KHQpe3JldHVybiB0LmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX1hcHBseU1hdHJpeDQodCxlKXtjb25zdCBuPWV8fFExdC5nZXROb3JtYWxNYXRyaXgodCksaT10aGlzLmNvcGxhbmFyUG9pbnQoWjF0KS5hcHBseU1hdHJpeDQodCkscj10aGlzLm5vcm1hbC5hcHBseU1hdHJpeDMobikubm9ybWFsaXplKCk7cmV0dXJuIHRoaXMuY29uc3RhbnQ9LWkuZG90KHIpLHRoaXN9dHJhbnNsYXRlKHQpe3JldHVybiB0aGlzLmNvbnN0YW50LT10LmRvdCh0aGlzLm5vcm1hbCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQubm9ybWFsLmVxdWFscyh0aGlzLm5vcm1hbCkmJnQuY29uc3RhbnQ9PT10aGlzLmNvbnN0YW50fWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfX10MHQucHJvdG90eXBlLmlzUGxhbmU9ITA7Y29uc3QgZTB0PW5ldyAkSnQsbjB0PW5ldyBDSnQ7Y2xhc3MgaTB0e2NvbnN0cnVjdG9yKHQ9bmV3IHQwdCxlPW5ldyB0MHQsbj1uZXcgdDB0LGk9bmV3IHQwdCxyPW5ldyB0MHQsbz1uZXcgdDB0KXt0aGlzLnBsYW5lcz1bdCxlLG4saSxyLG9dfXNldCh0LGUsbixpLHIsbyl7Y29uc3QgYT10aGlzLnBsYW5lcztyZXR1cm4gYVswXS5jb3B5KHQpLGFbMV0uY29weShlKSxhWzJdLmNvcHkobiksYVszXS5jb3B5KGkpLGFbNF0uY29weShyKSxhWzVdLmNvcHkobyksdGhpc31jb3B5KHQpe2NvbnN0IGU9dGhpcy5wbGFuZXM7Zm9yKGxldCBuPTA7bjw2O24rKyllW25dLmNvcHkodC5wbGFuZXNbbl0pO3JldHVybiB0aGlzfXNldEZyb21Qcm9qZWN0aW9uTWF0cml4KHQpe2NvbnN0IGU9dGhpcy5wbGFuZXMsbj10LmVsZW1lbnRzLGk9blswXSxyPW5bMV0sbz1uWzJdLGE9blszXSxzPW5bNF0sbD1uWzVdLGM9bls2XSx1PW5bN10saD1uWzhdLGQ9bls5XSxwPW5bMTBdLGY9blsxMV0sbT1uWzEyXSxnPW5bMTNdLF89blsxNF0seT1uWzE1XTtyZXR1cm4gZVswXS5zZXRDb21wb25lbnRzKGEtaSx1LXMsZi1oLHktbSkubm9ybWFsaXplKCksZVsxXS5zZXRDb21wb25lbnRzKGEraSx1K3MsZitoLHkrbSkubm9ybWFsaXplKCksZVsyXS5zZXRDb21wb25lbnRzKGErcix1K2wsZitkLHkrZykubm9ybWFsaXplKCksZVszXS5zZXRDb21wb25lbnRzKGEtcix1LWwsZi1kLHktZykubm9ybWFsaXplKCksZVs0XS5zZXRDb21wb25lbnRzKGEtbyx1LWMsZi1wLHktXykubm9ybWFsaXplKCksZVs1XS5zZXRDb21wb25lbnRzKGErbyx1K2MsZitwLHkrXykubm9ybWFsaXplKCksdGhpc31pbnRlcnNlY3RzT2JqZWN0KHQpe2NvbnN0IGU9dC5nZW9tZXRyeTtyZXR1cm4gbnVsbD09PWUuYm91bmRpbmdTcGhlcmUmJmUuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksZTB0LmNvcHkoZS5ib3VuZGluZ1NwaGVyZSkuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMuaW50ZXJzZWN0c1NwaGVyZShlMHQpfWludGVyc2VjdHNTcHJpdGUodCl7cmV0dXJuIGUwdC5jZW50ZXIuc2V0KDAsMCwwKSxlMHQucmFkaXVzPS43MDcxMDY3ODExODY1NDc2LGUwdC5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy5pbnRlcnNlY3RzU3BoZXJlKGUwdCl9aW50ZXJzZWN0c1NwaGVyZSh0KXtjb25zdCBlPXRoaXMucGxhbmVzLG49dC5jZW50ZXIsaT0tdC5yYWRpdXM7Zm9yKGxldCB0PTA7dDw2O3QrKylpZihlW3RdLmRpc3RhbmNlVG9Qb2ludChuKTxpKXJldHVybiExO3JldHVybiEwfWludGVyc2VjdHNCb3godCl7Y29uc3QgZT10aGlzLnBsYW5lcztmb3IobGV0IG49MDtuPDY7bisrKXtjb25zdCBpPWVbbl07aWYobjB0Lng9aS5ub3JtYWwueD4wP3QubWF4Lng6dC5taW4ueCxuMHQueT1pLm5vcm1hbC55PjA/dC5tYXgueTp0Lm1pbi55LG4wdC56PWkubm9ybWFsLno+MD90Lm1heC56OnQubWluLnosaS5kaXN0YW5jZVRvUG9pbnQobjB0KTwwKXJldHVybiExfXJldHVybiEwfWNvbnRhaW5zUG9pbnQodCl7Y29uc3QgZT10aGlzLnBsYW5lcztmb3IobGV0IG49MDtuPDY7bisrKWlmKGVbbl0uZGlzdGFuY2VUb1BvaW50KHQpPDApcmV0dXJuITE7cmV0dXJuITB9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fWZ1bmN0aW9uIHIwdCgpe2xldCB0PW51bGwsZT0hMSxuPW51bGwsaT1udWxsO2Z1bmN0aW9uIHIoZSxvKXtuKGUsbyksaT10LnJlcXVlc3RBbmltYXRpb25GcmFtZShyKX1yZXR1cm57c3RhcnQ6ZnVuY3Rpb24oKXshMCE9PWUmJm51bGwhPT1uJiYoaT10LnJlcXVlc3RBbmltYXRpb25GcmFtZShyKSxlPSEwKX0sc3RvcDpmdW5jdGlvbigpe3QuY2FuY2VsQW5pbWF0aW9uRnJhbWUoaSksZT0hMX0sc2V0QW5pbWF0aW9uTG9vcDpmdW5jdGlvbih0KXtuPXR9LHNldENvbnRleHQ6ZnVuY3Rpb24oZSl7dD1lfX19ZnVuY3Rpb24gbzB0KHQsZSl7Y29uc3Qgbj1lLmlzV2ViR0wyLGk9bmV3IFdlYWtNYXA7cmV0dXJue2dldDpmdW5jdGlvbiByKHQpe3JldHVybiB0LmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJih0PXQuZGF0YSksaS5nZXQodCl9LHJlbW92ZTpmdW5jdGlvbiBvKGUpe2UuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKGU9ZS5kYXRhKTtjb25zdCBuPWkuZ2V0KGUpO24mJih0LmRlbGV0ZUJ1ZmZlcihuLmJ1ZmZlciksaS5kZWxldGUoZSkpfSx1cGRhdGU6ZnVuY3Rpb24gYShlLHIpe2lmKGUuaXNHTEJ1ZmZlckF0dHJpYnV0ZSl7Y29uc3QgdD1pLmdldChlKTtyZXR1cm4gdm9pZCgoIXR8fHQudmVyc2lvbjxlLnZlcnNpb24pJiZpLnNldChlLHtidWZmZXI6ZS5idWZmZXIsdHlwZTplLnR5cGUsYnl0ZXNQZXJFbGVtZW50OmUuZWxlbWVudFNpemUsdmVyc2lvbjplLnZlcnNpb259KSl9ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYoZT1lLmRhdGEpO2NvbnN0IG89aS5nZXQoZSk7dm9pZCAwPT09bz9pLnNldChlLChmdW5jdGlvbiBhKGUsaSl7Y29uc3Qgcj1lLmFycmF5LG89ZS51c2FnZSxhPXQuY3JlYXRlQnVmZmVyKCk7dC5iaW5kQnVmZmVyKGksYSksdC5idWZmZXJEYXRhKGkscixvKSxlLm9uVXBsb2FkQ2FsbGJhY2soKTtsZXQgcz01MTI2O3JldHVybiByIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5P3M9NTEyNjpyIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5P2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xBdHRyaWJ1dGVzOiBVbnN1cHBvcnRlZCBkYXRhIGJ1ZmZlciBmb3JtYXQ6IEZsb2F0NjRBcnJheS4iKTpyIGluc3RhbmNlb2YgVWludDE2QXJyYXk/ZS5pc0Zsb2F0MTZCdWZmZXJBdHRyaWJ1dGU/bj9zPTUxMzE6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTEF0dHJpYnV0ZXM6IFVzYWdlIG9mIEZsb2F0MTZCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgV2ViR0wyLiIpOnM9NTEyMzpyIGluc3RhbmNlb2YgSW50MTZBcnJheT9zPTUxMjI6ciBpbnN0YW5jZW9mIFVpbnQzMkFycmF5P3M9NTEyNTpyIGluc3RhbmNlb2YgSW50MzJBcnJheT9zPTUxMjQ6ciBpbnN0YW5jZW9mIEludDhBcnJheT9zPTUxMjA6KHIgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxyIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkpJiYocz01MTIxKSx7YnVmZmVyOmEsdHlwZTpzLGJ5dGVzUGVyRWxlbWVudDpyLkJZVEVTX1BFUl9FTEVNRU5ULHZlcnNpb246ZS52ZXJzaW9ufX0pKGUscikpOm8udmVyc2lvbjxlLnZlcnNpb24mJigoZnVuY3Rpb24gcyhlLGkscil7Y29uc3Qgbz1pLmFycmF5LGE9aS51cGRhdGVSYW5nZTt0LmJpbmRCdWZmZXIocixlKSwtMT09PWEuY291bnQ/dC5idWZmZXJTdWJEYXRhKHIsMCxvKToobj90LmJ1ZmZlclN1YkRhdGEocixhLm9mZnNldCpvLkJZVEVTX1BFUl9FTEVNRU5ULG8sYS5vZmZzZXQsYS5jb3VudCk6dC5idWZmZXJTdWJEYXRhKHIsYS5vZmZzZXQqby5CWVRFU19QRVJfRUxFTUVOVCxvLnN1YmFycmF5KGEub2Zmc2V0LGEub2Zmc2V0K2EuY291bnQpKSxhLmNvdW50PS0xKX0pKG8uYnVmZmVyLGUsciksby52ZXJzaW9uPWUudmVyc2lvbil9fX1jbGFzcyBhMHQgZXh0ZW5kcyBiMXR7Y29uc3RydWN0b3IodD0xLGU9MSxuPTEsaT0xKXtzdXBlcigpLHRoaXMudHlwZT0iUGxhbmVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXt3aWR0aDp0LGhlaWdodDplLHdpZHRoU2VnbWVudHM6bixoZWlnaHRTZWdtZW50czppfTtjb25zdCByPXQvMixvPWUvMixhPU1hdGguZmxvb3Iobikscz1NYXRoLmZsb29yKGkpLGw9YSsxLGM9cysxLHU9dC9hLGg9ZS9zLGQ9W10scD1bXSxmPVtdLG09W107Zm9yKGxldCB0PTA7dDxjO3QrKyl7Y29uc3QgZT10Kmgtbztmb3IobGV0IG49MDtuPGw7bisrKXAucHVzaChuKnUtciwtZSwwKSxmLnB1c2goMCwwLDEpLG0ucHVzaChuL2EpLG0ucHVzaCgxLXQvcyl9Zm9yKGxldCB0PTA7dDxzO3QrKylmb3IobGV0IGU9MDtlPGE7ZSsrKXtjb25zdCBuPWUrbCoodCsxKSxpPWUrMStsKih0KzEpLHI9ZSsxK2wqdDtkLnB1c2goZStsKnQsbixyKSxkLnB1c2gobixpLHIpfXRoaXMuc2V0SW5kZXgoZCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KHAsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBsMXQoZiwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgbDF0KG0sMikpfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IGEwdCh0LndpZHRoLHQuaGVpZ2h0LHQud2lkdGhTZWdtZW50cyx0LmhlaWdodFNlZ21lbnRzKX19Y29uc3QgczB0PXthbHBoYW1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9BTFBIQU1BUFxuXHRkaWZmdXNlQ29sb3IuYSAqPSB0ZXh0dXJlMkQoIGFscGhhTWFwLCB2VXYgKS5nO1xuI2VuZGlmIixhbHBoYW1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0FMUEhBTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwO1xuI2VuZGlmIixhbHBoYXRlc3RfZnJhZ21lbnQ6IiNpZmRlZiBBTFBIQVRFU1Rcblx0aWYgKCBkaWZmdXNlQ29sb3IuYSA8IEFMUEhBVEVTVCApIGRpc2NhcmQ7XG4jZW5kaWYiLGFvbWFwX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0FPTUFQXG5cdGZsb2F0IGFtYmllbnRPY2NsdXNpb24gPSAoIHRleHR1cmUyRCggYW9NYXAsIHZVdjIgKS5yIC0gMS4wICkgKiBhb01hcEludGVuc2l0eSArIDEuMDtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICo9IGFtYmllbnRPY2NsdXNpb247XG5cdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggU1RBTkRBUkQgKVxuXHRcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICo9IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggZG90TlYsIGFtYmllbnRPY2NsdXNpb24sIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzICk7XG5cdCNlbmRpZlxuI2VuZGlmIixhb21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0FPTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGFvTWFwO1xuXHR1bmlmb3JtIGZsb2F0IGFvTWFwSW50ZW5zaXR5O1xuI2VuZGlmIixiZWdpbl92ZXJ0ZXg6InZlYzMgdHJhbnNmb3JtZWQgPSB2ZWMzKCBwb3NpdGlvbiApOyIsYmVnaW5ub3JtYWxfdmVydGV4OiJ2ZWMzIG9iamVjdE5vcm1hbCA9IHZlYzMoIG5vcm1hbCApO1xuI2lmZGVmIFVTRV9UQU5HRU5UXG5cdHZlYzMgb2JqZWN0VGFuZ2VudCA9IHZlYzMoIHRhbmdlbnQueHl6ICk7XG4jZW5kaWYiLGJzZGZzOiJ2ZWMyIGludGVncmF0ZVNwZWN1bGFyQlJERiggY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0Y29uc3QgdmVjNCBjMCA9IHZlYzQoIC0gMSwgLSAwLjAyNzUsIC0gMC41NzIsIDAuMDIyICk7XG5cdGNvbnN0IHZlYzQgYzEgPSB2ZWM0KCAxLCAwLjA0MjUsIDEuMDQsIC0gMC4wNCApO1xuXHR2ZWM0IHIgPSByb3VnaG5lc3MgKiBjMCArIGMxO1xuXHRmbG9hdCBhMDA0ID0gbWluKCByLnggKiByLngsIGV4cDIoIC0gOS4yOCAqIGRvdE5WICkgKSAqIHIueCArIHIueTtcblx0cmV0dXJuIHZlYzIoIC0xLjA0LCAxLjA0ICkgKiBhMDA0ICsgci56dztcbn1cbmZsb2F0IHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGNvbnN0IGluIGZsb2F0IGxpZ2h0RGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGN1dG9mZkRpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBkZWNheUV4cG9uZW50ICkge1xuI2lmIGRlZmluZWQgKCBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTIClcblx0ZmxvYXQgZGlzdGFuY2VGYWxsb2ZmID0gMS4wIC8gbWF4KCBwb3coIGxpZ2h0RGlzdGFuY2UsIGRlY2F5RXhwb25lbnQgKSwgMC4wMSApO1xuXHRpZiggY3V0b2ZmRGlzdGFuY2UgPiAwLjAgKSB7XG5cdFx0ZGlzdGFuY2VGYWxsb2ZmICo9IHBvdzIoIHNhdHVyYXRlKCAxLjAgLSBwb3c0KCBsaWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKSApICk7XG5cdH1cblx0cmV0dXJuIGRpc3RhbmNlRmFsbG9mZjtcbiNlbHNlXG5cdGlmKCBjdXRvZmZEaXN0YW5jZSA+IDAuMCAmJiBkZWNheUV4cG9uZW50ID4gMC4wICkge1xuXHRcdHJldHVybiBwb3coIHNhdHVyYXRlKCAtbGlnaHREaXN0YW5jZSAvIGN1dG9mZkRpc3RhbmNlICsgMS4wICksIGRlY2F5RXhwb25lbnQgKTtcblx0fVxuXHRyZXR1cm4gMS4wO1xuI2VuZGlmXG59XG52ZWMzIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBjb25zdCBpbiB2ZWMzIGRpZmZ1c2VDb2xvciApIHtcblx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBkaWZmdXNlQ29sb3I7XG59XG52ZWMzIEZfU2NobGljayggY29uc3QgaW4gdmVjMyBmMCwgY29uc3QgaW4gdmVjMyBmOTAsIGNvbnN0IGluIGZsb2F0IGRvdFZIICkge1xuXHRmbG9hdCBmcmVzbmVsID0gZXhwMiggKCAtNS41NTQ3MyAqIGRvdFZIIC0gNi45ODMxNiApICogZG90VkggKTtcblx0cmV0dXJuICggZjkwIC0gZjAgKSAqIGZyZXNuZWwgKyBmMDtcbn1cbnZlYzMgRl9TY2hsaWNrX1JvdWdobmVzc0RlcGVuZGVudCggY29uc3QgaW4gdmVjMyBGMCwgY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0ZmxvYXQgZnJlc25lbCA9IGV4cDIoICggLTUuNTU0NzMgKiBkb3ROViAtIDYuOTgzMTYgKSAqIGRvdE5WICk7XG5cdHZlYzMgRnIgPSBtYXgoIHZlYzMoIDEuMCAtIHJvdWdobmVzcyApLCBGMCApIC0gRjA7XG5cdHJldHVybiBGciAqIGZyZXNuZWwgKyBGMDtcbn1cbmZsb2F0IEdfR0dYX1NtaXRoKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xuXHRmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGdsID0gZG90TkwgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTtcblx0ZmxvYXQgZ3YgPSBkb3ROViArIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xuXHRyZXR1cm4gMS4wIC8gKCBnbCAqIGd2ICk7XG59XG5mbG9hdCBHX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XG5cdGZsb2F0IGEyID0gcG93MiggYWxwaGEgKTtcblx0ZmxvYXQgZ3YgPSBkb3ROTCAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xuXHRmbG9hdCBnbCA9IGRvdE5WICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XG5cdHJldHVybiAwLjUgLyBtYXgoIGd2ICsgZ2wsIEVQU0lMT04gKTtcbn1cbmZsb2F0IERfR0dYKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7XG5cdGZsb2F0IGEyID0gcG93MiggYWxwaGEgKTtcblx0ZmxvYXQgZGVub20gPSBwb3cyKCBkb3ROSCApICogKCBhMiAtIDEuMCApICsgMS4wO1xuXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGEyIC8gcG93MiggZGVub20gKTtcbn1cbnZlYzMgQlJERl9TcGVjdWxhcl9HR1goIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBmMCwgY29uc3QgaW4gdmVjMyBmOTAsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0ZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTtcblx0dmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiArIHZpZXdEaXIgKTtcblx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApO1xuXHRmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgaGFsZkRpciApICk7XG5cdGZsb2F0IGRvdExIID0gc2F0dXJhdGUoIGRvdCggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24sIGhhbGZEaXIgKSApO1xuXHR2ZWMzIEYgPSBGX1NjaGxpY2soIGYwLCBmOTAsIGRvdExIICk7XG5cdGZsb2F0IEcgPSBHX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGFscGhhLCBkb3ROTCwgZG90TlYgKTtcblx0ZmxvYXQgRCA9IERfR0dYKCBhbHBoYSwgZG90TkggKTtcblx0cmV0dXJuIEYgKiAoIEcgKiBEICk7XG59XG52ZWMyIExUQ19VdiggY29uc3QgaW4gdmVjMyBOLCBjb25zdCBpbiB2ZWMzIFYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0Y29uc3QgZmxvYXQgTFVUX1NJWkUgPSA2NC4wO1xuXHRjb25zdCBmbG9hdCBMVVRfU0NBTEUgPSAoIExVVF9TSVpFIC0gMS4wICkgLyBMVVRfU0laRTtcblx0Y29uc3QgZmxvYXQgTFVUX0JJQVMgPSAwLjUgLyBMVVRfU0laRTtcblx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBOLCBWICkgKTtcblx0dmVjMiB1diA9IHZlYzIoIHJvdWdobmVzcywgc3FydCggMS4wIC0gZG90TlYgKSApO1xuXHR1diA9IHV2ICogTFVUX1NDQUxFICsgTFVUX0JJQVM7XG5cdHJldHVybiB1djtcbn1cbmZsb2F0IExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyBmICkge1xuXHRmbG9hdCBsID0gbGVuZ3RoKCBmICk7XG5cdHJldHVybiBtYXgoICggbCAqIGwgKyBmLnogKSAvICggbCArIDEuMCApLCAwLjAgKTtcbn1cbnZlYzMgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIHYxLCBjb25zdCBpbiB2ZWMzIHYyICkge1xuXHRmbG9hdCB4ID0gZG90KCB2MSwgdjIgKTtcblx0ZmxvYXQgeSA9IGFicyggeCApO1xuXHRmbG9hdCBhID0gMC44NTQzOTg1ICsgKCAwLjQ5NjUxNTUgKyAwLjAxNDUyMDYgKiB5ICkgKiB5O1xuXHRmbG9hdCBiID0gMy40MTc1OTQwICsgKCA0LjE2MTY3MjQgKyB5ICkgKiB5O1xuXHRmbG9hdCB2ID0gYSAvIGI7XG5cdGZsb2F0IHRoZXRhX3NpbnRoZXRhID0gKCB4ID4gMC4wICkgPyB2IDogMC41ICogaW52ZXJzZXNxcnQoIG1heCggMS4wIC0geCAqIHgsIDFlLTcgKSApIC0gdjtcblx0cmV0dXJuIGNyb3NzKCB2MSwgdjIgKSAqIHRoZXRhX3NpbnRoZXRhO1xufVxudmVjMyBMVENfRXZhbHVhdGUoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiB2ZWMzIFAsIGNvbnN0IGluIG1hdDMgbUludiwgY29uc3QgaW4gdmVjMyByZWN0Q29vcmRzWyA0IF0gKSB7XG5cdHZlYzMgdjEgPSByZWN0Q29vcmRzWyAxIF0gLSByZWN0Q29vcmRzWyAwIF07XG5cdHZlYzMgdjIgPSByZWN0Q29vcmRzWyAzIF0gLSByZWN0Q29vcmRzWyAwIF07XG5cdHZlYzMgbGlnaHROb3JtYWwgPSBjcm9zcyggdjEsIHYyICk7XG5cdGlmKCBkb3QoIGxpZ2h0Tm9ybWFsLCBQIC0gcmVjdENvb3Jkc1sgMCBdICkgPCAwLjAgKSByZXR1cm4gdmVjMyggMC4wICk7XG5cdHZlYzMgVDEsIFQyO1xuXHRUMSA9IG5vcm1hbGl6ZSggViAtIE4gKiBkb3QoIFYsIE4gKSApO1xuXHRUMiA9IC0gY3Jvc3MoIE4sIFQxICk7XG5cdG1hdDMgbWF0ID0gbUludiAqIHRyYW5zcG9zZU1hdDMoIG1hdDMoIFQxLCBUMiwgTiApICk7XG5cdHZlYzMgY29vcmRzWyA0IF07XG5cdGNvb3Jkc1sgMCBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAwIF0gLSBQICk7XG5cdGNvb3Jkc1sgMSBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAxIF0gLSBQICk7XG5cdGNvb3Jkc1sgMiBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAyIF0gLSBQICk7XG5cdGNvb3Jkc1sgMyBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAzIF0gLSBQICk7XG5cdGNvb3Jkc1sgMCBdID0gbm9ybWFsaXplKCBjb29yZHNbIDAgXSApO1xuXHRjb29yZHNbIDEgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAxIF0gKTtcblx0Y29vcmRzWyAyIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMiBdICk7XG5cdGNvb3Jkc1sgMyBdID0gbm9ybWFsaXplKCBjb29yZHNbIDMgXSApO1xuXHR2ZWMzIHZlY3RvckZvcm1GYWN0b3IgPSB2ZWMzKCAwLjAgKTtcblx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMCBdLCBjb29yZHNbIDEgXSApO1xuXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAxIF0sIGNvb3Jkc1sgMiBdICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDIgXSwgY29vcmRzWyAzIF0gKTtcblx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMyBdLCBjb29yZHNbIDAgXSApO1xuXHRmbG9hdCByZXN1bHQgPSBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIHZlY3RvckZvcm1GYWN0b3IgKTtcblx0cmV0dXJuIHZlYzMoIHJlc3VsdCApO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX0dHWF9FbnZpcm9ubWVudCggY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTtcblx0dmVjMiBicmRmID0gaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBkb3ROViwgcm91Z2huZXNzICk7XG5cdHJldHVybiBzcGVjdWxhckNvbG9yICogYnJkZi54ICsgYnJkZi55O1xufVxudm9pZCBCUkRGX1NwZWN1bGFyX011bHRpc2NhdHRlcmluZ19FbnZpcm9ubWVudCggY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGlub3V0IHZlYzMgc2luZ2xlU2NhdHRlciwgaW5vdXQgdmVjMyBtdWx0aVNjYXR0ZXIgKSB7XG5cdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0dmVjMyBGID0gRl9TY2hsaWNrX1JvdWdobmVzc0RlcGVuZGVudCggc3BlY3VsYXJDb2xvciwgZG90TlYsIHJvdWdobmVzcyApO1xuXHR2ZWMyIGJyZGYgPSBpbnRlZ3JhdGVTcGVjdWxhckJSREYoIGRvdE5WLCByb3VnaG5lc3MgKTtcblx0dmVjMyBGc3NFc3MgPSBGICogYnJkZi54ICsgYnJkZi55O1xuXHRmbG9hdCBFc3MgPSBicmRmLnggKyBicmRmLnk7XG5cdGZsb2F0IEVtcyA9IDEuMCAtIEVzcztcblx0dmVjMyBGYXZnID0gc3BlY3VsYXJDb2xvciArICggMS4wIC0gc3BlY3VsYXJDb2xvciApICogMC4wNDc2MTk7XHR2ZWMzIEZtcyA9IEZzc0VzcyAqIEZhdmcgLyAoIDEuMCAtIEVtcyAqIEZhdmcgKTtcblx0c2luZ2xlU2NhdHRlciArPSBGc3NFc3M7XG5cdG11bHRpU2NhdHRlciArPSBGbXMgKiBFbXM7XG59XG5mbG9hdCBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICkge1xuXHRyZXR1cm4gMC4yNTtcbn1cbmZsb2F0IERfQmxpbm5QaG9uZyggY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHtcblx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiAoIHNoaW5pbmVzcyAqIDAuNSArIDEuMCApICogcG93KCBkb3ROSCwgc2hpbmluZXNzICk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBpbmNpZGVudExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcyApIHtcblx0dmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiArIGdlb21ldHJ5LnZpZXdEaXIgKTtcblx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhhbGZEaXIgKSApO1xuXHRmbG9hdCBkb3RMSCA9IHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcblx0dmVjMyBGID0gRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCB2ZWMzKCAxLjAgKSwgZG90TEggKTtcblx0ZmxvYXQgRyA9IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKTtcblx0ZmxvYXQgRCA9IERfQmxpbm5QaG9uZyggc2hpbmluZXNzLCBkb3ROSCApO1xuXHRyZXR1cm4gRiAqICggRyAqIEQgKTtcbn1cbmZsb2F0IEdHWFJvdWdobmVzc1RvQmxpbm5FeHBvbmVudCggY29uc3QgaW4gZmxvYXQgZ2d4Um91Z2huZXNzICkge1xuXHRyZXR1cm4gKCAyLjAgLyBwb3cyKCBnZ3hSb3VnaG5lc3MgKyAwLjAwMDEgKSAtIDIuMCApO1xufVxuZmxvYXQgQmxpbm5FeHBvbmVudFRvR0dYUm91Z2huZXNzKCBjb25zdCBpbiBmbG9hdCBibGlubkV4cG9uZW50ICkge1xuXHRyZXR1cm4gc3FydCggMi4wIC8gKCBibGlubkV4cG9uZW50ICsgMi4wICkgKTtcbn1cbiNpZiBkZWZpbmVkKCBVU0VfU0hFRU4gKVxuZmxvYXQgRF9DaGFybGllKGZsb2F0IHJvdWdobmVzcywgZmxvYXQgTm9IKSB7XG5cdGZsb2F0IGludkFscGhhID0gMS4wIC8gcm91Z2huZXNzO1xuXHRmbG9hdCBjb3MyaCA9IE5vSCAqIE5vSDtcblx0ZmxvYXQgc2luMmggPSBtYXgoMS4wIC0gY29zMmgsIDAuMDA3ODEyNSk7XHRyZXR1cm4gKDIuMCArIGludkFscGhhKSAqIHBvdyhzaW4yaCwgaW52QWxwaGEgKiAwLjUpIC8gKDIuMCAqIFBJKTtcbn1cbmZsb2F0IFZfTmV1YmVsdChmbG9hdCBOb1YsIGZsb2F0IE5vTCkge1xuXHRyZXR1cm4gc2F0dXJhdGUoMS4wIC8gKDQuMCAqIChOb0wgKyBOb1YgLSBOb0wgKiBOb1YpKSk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfU2hlZW4oIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gdmVjMyBMLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCB2ZWMzIHNwZWN1bGFyQ29sb3IgKSB7XG5cdHZlYzMgTiA9IGdlb21ldHJ5Lm5vcm1hbDtcblx0dmVjMyBWID0gZ2VvbWV0cnkudmlld0Rpcjtcblx0dmVjMyBIID0gbm9ybWFsaXplKCBWICsgTCApO1xuXHRmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIE4sIEggKSApO1xuXHRyZXR1cm4gc3BlY3VsYXJDb2xvciAqIERfQ2hhcmxpZSggcm91Z2huZXNzLCBkb3ROSCApICogVl9OZXViZWx0KCBkb3QoTiwgViksIGRvdChOLCBMKSApO1xufVxuI2VuZGlmIixidW1wbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQlVNUE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBidW1wTWFwO1xuXHR1bmlmb3JtIGZsb2F0IGJ1bXBTY2FsZTtcblx0dmVjMiBkSGR4eV9md2QoKSB7XG5cdFx0dmVjMiBkU1RkeCA9IGRGZHgoIHZVdiApO1xuXHRcdHZlYzIgZFNUZHkgPSBkRmR5KCB2VXYgKTtcblx0XHRmbG9hdCBIbGwgPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiApLng7XG5cdFx0ZmxvYXQgZEJ4ID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKyBkU1RkeCApLnggLSBIbGw7XG5cdFx0ZmxvYXQgZEJ5ID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKyBkU1RkeSApLnggLSBIbGw7XG5cdFx0cmV0dXJuIHZlYzIoIGRCeCwgZEJ5ICk7XG5cdH1cblx0dmVjMyBwZXJ0dXJiTm9ybWFsQXJiKCB2ZWMzIHN1cmZfcG9zLCB2ZWMzIHN1cmZfbm9ybSwgdmVjMiBkSGR4eSwgZmxvYXQgZmFjZURpcmVjdGlvbiApIHtcblx0XHR2ZWMzIHZTaWdtYVggPSB2ZWMzKCBkRmR4KCBzdXJmX3Bvcy54ICksIGRGZHgoIHN1cmZfcG9zLnkgKSwgZEZkeCggc3VyZl9wb3MueiApICk7XG5cdFx0dmVjMyB2U2lnbWFZID0gdmVjMyggZEZkeSggc3VyZl9wb3MueCApLCBkRmR5KCBzdXJmX3Bvcy55ICksIGRGZHkoIHN1cmZfcG9zLnogKSApO1xuXHRcdHZlYzMgdk4gPSBzdXJmX25vcm07XG5cdFx0dmVjMyBSMSA9IGNyb3NzKCB2U2lnbWFZLCB2TiApO1xuXHRcdHZlYzMgUjIgPSBjcm9zcyggdk4sIHZTaWdtYVggKTtcblx0XHRmbG9hdCBmRGV0ID0gZG90KCB2U2lnbWFYLCBSMSApICogZmFjZURpcmVjdGlvbjtcblx0XHR2ZWMzIHZHcmFkID0gc2lnbiggZkRldCApICogKCBkSGR4eS54ICogUjEgKyBkSGR4eS55ICogUjIgKTtcblx0XHRyZXR1cm4gbm9ybWFsaXplKCBhYnMoIGZEZXQgKSAqIHN1cmZfbm9ybSAtIHZHcmFkICk7XG5cdH1cbiNlbmRpZiIsY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50OiIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcblx0dmVjNCBwbGFuZTtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBVTklPTl9DTElQUElOR19QTEFORVM7IGkgKysgKSB7XG5cdFx0cGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdO1xuXHRcdGlmICggZG90KCB2Q2xpcFBvc2l0aW9uLCBwbGFuZS54eXogKSA+IHBsYW5lLncgKSBkaXNjYXJkO1xuXHR9XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG5cdCNpZiBVTklPTl9DTElQUElOR19QTEFORVMgPCBOVU1fQ0xJUFBJTkdfUExBTkVTXG5cdFx0Ym9vbCBjbGlwcGVkID0gdHJ1ZTtcblx0XHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdFx0Zm9yICggaW50IGkgPSBVTklPTl9DTElQUElOR19QTEFORVM7IGkgPCBOVU1fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkge1xuXHRcdFx0cGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdO1xuXHRcdFx0Y2xpcHBlZCA9ICggZG90KCB2Q2xpcFBvc2l0aW9uLCBwbGFuZS54eXogKSA+IHBsYW5lLncgKSAmJiBjbGlwcGVkO1xuXHRcdH1cblx0XHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuXHRcdGlmICggY2xpcHBlZCApIGRpc2NhcmQ7XG5cdCNlbmRpZlxuI2VuZGlmIixjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudDoiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXG5cdHZhcnlpbmcgdmVjMyB2Q2xpcFBvc2l0aW9uO1xuXHR1bmlmb3JtIHZlYzQgY2xpcHBpbmdQbGFuZXNbIE5VTV9DTElQUElOR19QTEFORVMgXTtcbiNlbmRpZiIsY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4OiIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcblx0dmFyeWluZyB2ZWMzIHZDbGlwUG9zaXRpb247XG4jZW5kaWYiLGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMFxuXHR2Q2xpcFBvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcbiNlbmRpZiIsY29sb3JfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKVxuXHRkaWZmdXNlQ29sb3IgKj0gdkNvbG9yO1xuI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SIClcblx0ZGlmZnVzZUNvbG9yLnJnYiAqPSB2Q29sb3I7XG4jZW5kaWYiLGNvbG9yX3BhcnNfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKVxuXHR2YXJ5aW5nIHZlYzQgdkNvbG9yO1xuI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SIClcblx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcbiNlbmRpZiIsY29sb3JfcGFyc192ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKVxuXHR2YXJ5aW5nIHZlYzQgdkNvbG9yO1xuI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SICkgfHwgZGVmaW5lZCggVVNFX0lOU1RBTkNJTkdfQ09MT1IgKVxuXHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xuI2VuZGlmIixjb2xvcl92ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKVxuXHR2Q29sb3IgPSB2ZWM0KCAxLjAgKTtcbiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApIHx8IGRlZmluZWQoIFVTRV9JTlNUQU5DSU5HX0NPTE9SIClcblx0dkNvbG9yID0gdmVjMyggMS4wICk7XG4jZW5kaWZcbiNpZmRlZiBVU0VfQ09MT1Jcblx0dkNvbG9yICo9IGNvbG9yO1xuI2VuZGlmXG4jaWZkZWYgVVNFX0lOU1RBTkNJTkdfQ09MT1Jcblx0dkNvbG9yLnh5eiAqPSBpbnN0YW5jZUNvbG9yLnh5ejtcbiNlbmRpZiIsY29tbW9uOiIjZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTg5NzkzXG4jZGVmaW5lIFBJMiA2LjI4MzE4NTMwNzE3OTU4NlxuI2RlZmluZSBQSV9IQUxGIDEuNTcwNzk2MzI2Nzk0ODk2NlxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2MTgzNzkwN1xuI2RlZmluZSBSRUNJUFJPQ0FMX1BJMiAwLjE1OTE1NDk0MzA5MTg5NTM1XG4jZGVmaW5lIEVQU0lMT04gMWUtNlxuI2lmbmRlZiBzYXR1cmF0ZVxuI2RlZmluZSBzYXR1cmF0ZShhKSBjbGFtcCggYSwgMC4wLCAxLjAgKVxuI2VuZGlmXG4jZGVmaW5lIHdoaXRlQ29tcGxlbWVudChhKSAoIDEuMCAtIHNhdHVyYXRlKCBhICkgKVxuZmxvYXQgcG93MiggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeDsgfVxuZmxvYXQgcG93MyggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeCp4OyB9XG5mbG9hdCBwb3c0KCBjb25zdCBpbiBmbG9hdCB4ICkgeyBmbG9hdCB4MiA9IHgqeDsgcmV0dXJuIHgyKngyOyB9XG5mbG9hdCBhdmVyYWdlKCBjb25zdCBpbiB2ZWMzIGNvbG9yICkgeyByZXR1cm4gZG90KCBjb2xvciwgdmVjMyggMC4zMzMzICkgKTsgfVxuaGlnaHAgZmxvYXQgcmFuZCggY29uc3QgaW4gdmVjMiB1diApIHtcblx0Y29uc3QgaGlnaHAgZmxvYXQgYSA9IDEyLjk4OTgsIGIgPSA3OC4yMzMsIGMgPSA0Mzc1OC41NDUzO1xuXHRoaWdocCBmbG9hdCBkdCA9IGRvdCggdXYueHksIHZlYzIoIGEsYiApICksIHNuID0gbW9kKCBkdCwgUEkgKTtcblx0cmV0dXJuIGZyYWN0KHNpbihzbikgKiBjKTtcbn1cbiNpZmRlZiBISUdIX1BSRUNJU0lPTlxuXHRmbG9hdCBwcmVjaXNpb25TYWZlTGVuZ3RoKCB2ZWMzIHYgKSB7IHJldHVybiBsZW5ndGgoIHYgKTsgfVxuI2Vsc2Vcblx0ZmxvYXQgbWF4MyggdmVjMyB2ICkgeyByZXR1cm4gbWF4KCBtYXgoIHYueCwgdi55ICksIHYueiApOyB9XG5cdGZsb2F0IHByZWNpc2lvblNhZmVMZW5ndGgoIHZlYzMgdiApIHtcblx0XHRmbG9hdCBtYXhDb21wb25lbnQgPSBtYXgzKCBhYnMoIHYgKSApO1xuXHRcdHJldHVybiBsZW5ndGgoIHYgLyBtYXhDb21wb25lbnQgKSAqIG1heENvbXBvbmVudDtcblx0fVxuI2VuZGlmXG5zdHJ1Y3QgSW5jaWRlbnRMaWdodCB7XG5cdHZlYzMgY29sb3I7XG5cdHZlYzMgZGlyZWN0aW9uO1xuXHRib29sIHZpc2libGU7XG59O1xuc3RydWN0IFJlZmxlY3RlZExpZ2h0IHtcblx0dmVjMyBkaXJlY3REaWZmdXNlO1xuXHR2ZWMzIGRpcmVjdFNwZWN1bGFyO1xuXHR2ZWMzIGluZGlyZWN0RGlmZnVzZTtcblx0dmVjMyBpbmRpcmVjdFNwZWN1bGFyO1xufTtcbnN0cnVjdCBHZW9tZXRyaWNDb250ZXh0IHtcblx0dmVjMyBwb3NpdGlvbjtcblx0dmVjMyBub3JtYWw7XG5cdHZlYzMgdmlld0RpcjtcbiNpZmRlZiBDTEVBUkNPQVRcblx0dmVjMyBjbGVhcmNvYXROb3JtYWw7XG4jZW5kaWZcbn07XG52ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTtcbn1cbnZlYzMgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQoIGRpciwgMC4wICkgKiBtYXRyaXggKS54eXogKTtcbn1cbnZlYzMgcHJvamVjdE9uUGxhbmUoaW4gdmVjMyBwb2ludCwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XG5cdGZsb2F0IGRpc3RhbmNlID0gZG90KCBwbGFuZU5vcm1hbCwgcG9pbnQgLSBwb2ludE9uUGxhbmUgKTtcblx0cmV0dXJuIC0gZGlzdGFuY2UgKiBwbGFuZU5vcm1hbCArIHBvaW50O1xufVxuZmxvYXQgc2lkZU9mUGxhbmUoIGluIHZlYzMgcG9pbnQsIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xuXHRyZXR1cm4gc2lnbiggZG90KCBwb2ludCAtIHBvaW50T25QbGFuZSwgcGxhbmVOb3JtYWwgKSApO1xufVxudmVjMyBsaW5lUGxhbmVJbnRlcnNlY3QoIGluIHZlYzMgcG9pbnRPbkxpbmUsIGluIHZlYzMgbGluZURpcmVjdGlvbiwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XG5cdHJldHVybiBsaW5lRGlyZWN0aW9uICogKCBkb3QoIHBsYW5lTm9ybWFsLCBwb2ludE9uUGxhbmUgLSBwb2ludE9uTGluZSApIC8gZG90KCBwbGFuZU5vcm1hbCwgbGluZURpcmVjdGlvbiApICkgKyBwb2ludE9uTGluZTtcbn1cbm1hdDMgdHJhbnNwb3NlTWF0MyggY29uc3QgaW4gbWF0MyBtICkge1xuXHRtYXQzIHRtcDtcblx0dG1wWyAwIF0gPSB2ZWMzKCBtWyAwIF0ueCwgbVsgMSBdLngsIG1bIDIgXS54ICk7XG5cdHRtcFsgMSBdID0gdmVjMyggbVsgMCBdLnksIG1bIDEgXS55LCBtWyAyIF0ueSApO1xuXHR0bXBbIDIgXSA9IHZlYzMoIG1bIDAgXS56LCBtWyAxIF0ueiwgbVsgMiBdLnogKTtcblx0cmV0dXJuIHRtcDtcbn1cbmZsb2F0IGxpbmVhclRvUmVsYXRpdmVMdW1pbmFuY2UoIGNvbnN0IGluIHZlYzMgY29sb3IgKSB7XG5cdHZlYzMgd2VpZ2h0cyA9IHZlYzMoIDAuMjEyNiwgMC43MTUyLCAwLjA3MjIgKTtcblx0cmV0dXJuIGRvdCggd2VpZ2h0cywgY29sb3IucmdiICk7XG59XG5ib29sIGlzUGVyc3BlY3RpdmVNYXRyaXgoIG1hdDQgbSApIHtcblx0cmV0dXJuIG1bIDIgXVsgMyBdID09IC0gMS4wO1xufVxudmVjMiBlcXVpcmVjdFV2KCBpbiB2ZWMzIGRpciApIHtcblx0ZmxvYXQgdSA9IGF0YW4oIGRpci56LCBkaXIueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XG5cdGZsb2F0IHYgPSBhc2luKCBjbGFtcCggZGlyLnksIC0gMS4wLCAxLjAgKSApICogUkVDSVBST0NBTF9QSSArIDAuNTtcblx0cmV0dXJuIHZlYzIoIHUsIHYgKTtcbn0iLGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudDoiI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVZcblx0I2RlZmluZSBjdWJlVVZfbWF4TWlwTGV2ZWwgOC4wXG5cdCNkZWZpbmUgY3ViZVVWX21pbk1pcExldmVsIDQuMFxuXHQjZGVmaW5lIGN1YmVVVl9tYXhUaWxlU2l6ZSAyNTYuMFxuXHQjZGVmaW5lIGN1YmVVVl9taW5UaWxlU2l6ZSAxNi4wXG5cdGZsb2F0IGdldEZhY2UoIHZlYzMgZGlyZWN0aW9uICkge1xuXHRcdHZlYzMgYWJzRGlyZWN0aW9uID0gYWJzKCBkaXJlY3Rpb24gKTtcblx0XHRmbG9hdCBmYWNlID0gLSAxLjA7XG5cdFx0aWYgKCBhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi56ICkge1xuXHRcdFx0aWYgKCBhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi55IClcblx0XHRcdFx0ZmFjZSA9IGRpcmVjdGlvbi54ID4gMC4wID8gMC4wIDogMy4wO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRmYWNlID0gZGlyZWN0aW9uLnkgPiAwLjAgPyAxLjAgOiA0LjA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICggYWJzRGlyZWN0aW9uLnogPiBhYnNEaXJlY3Rpb24ueSApXG5cdFx0XHRcdGZhY2UgPSBkaXJlY3Rpb24ueiA+IDAuMCA/IDIuMCA6IDUuMDtcblx0XHRcdGVsc2Vcblx0XHRcdFx0ZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMS4wIDogNC4wO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFjZTtcblx0fVxuXHR2ZWMyIGdldFVWKCB2ZWMzIGRpcmVjdGlvbiwgZmxvYXQgZmFjZSApIHtcblx0XHR2ZWMyIHV2O1xuXHRcdGlmICggZmFjZSA9PSAwLjAgKSB7XG5cdFx0XHR1diA9IHZlYzIoIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueCApO1xuXHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMS4wICkge1xuXHRcdFx0dXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi54LCAtIGRpcmVjdGlvbi56ICkgLyBhYnMoIGRpcmVjdGlvbi55ICk7XG5cdFx0fSBlbHNlIGlmICggZmFjZSA9PSAyLjAgKSB7XG5cdFx0XHR1diA9IHZlYzIoIC0gZGlyZWN0aW9uLngsIGRpcmVjdGlvbi55ICkgLyBhYnMoIGRpcmVjdGlvbi56ICk7XG5cdFx0fSBlbHNlIGlmICggZmFjZSA9PSAzLjAgKSB7XG5cdFx0XHR1diA9IHZlYzIoIC0gZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55ICkgLyBhYnMoIGRpcmVjdGlvbi54ICk7XG5cdFx0fSBlbHNlIGlmICggZmFjZSA9PSA0LjAgKSB7XG5cdFx0XHR1diA9IHZlYzIoIC0gZGlyZWN0aW9uLngsIGRpcmVjdGlvbi56ICkgLyBhYnMoIGRpcmVjdGlvbi55ICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHV2ID0gdmVjMiggZGlyZWN0aW9uLngsIGRpcmVjdGlvbi55ICkgLyBhYnMoIGRpcmVjdGlvbi56ICk7XG5cdFx0fVxuXHRcdHJldHVybiAwLjUgKiAoIHV2ICsgMS4wICk7XG5cdH1cblx0dmVjMyBiaWxpbmVhckN1YmVVViggc2FtcGxlcjJEIGVudk1hcCwgdmVjMyBkaXJlY3Rpb24sIGZsb2F0IG1pcEludCApIHtcblx0XHRmbG9hdCBmYWNlID0gZ2V0RmFjZSggZGlyZWN0aW9uICk7XG5cdFx0ZmxvYXQgZmlsdGVySW50ID0gbWF4KCBjdWJlVVZfbWluTWlwTGV2ZWwgLSBtaXBJbnQsIDAuMCApO1xuXHRcdG1pcEludCA9IG1heCggbWlwSW50LCBjdWJlVVZfbWluTWlwTGV2ZWwgKTtcblx0XHRmbG9hdCBmYWNlU2l6ZSA9IGV4cDIoIG1pcEludCApO1xuXHRcdGZsb2F0IHRleGVsU2l6ZSA9IDEuMCAvICggMy4wICogY3ViZVVWX21heFRpbGVTaXplICk7XG5cdFx0dmVjMiB1diA9IGdldFVWKCBkaXJlY3Rpb24sIGZhY2UgKSAqICggZmFjZVNpemUgLSAxLjAgKTtcblx0XHR2ZWMyIGYgPSBmcmFjdCggdXYgKTtcblx0XHR1diArPSAwLjUgLSBmO1xuXHRcdGlmICggZmFjZSA+IDIuMCApIHtcblx0XHRcdHV2LnkgKz0gZmFjZVNpemU7XG5cdFx0XHRmYWNlIC09IDMuMDtcblx0XHR9XG5cdFx0dXYueCArPSBmYWNlICogZmFjZVNpemU7XG5cdFx0aWYgKCBtaXBJbnQgPCBjdWJlVVZfbWF4TWlwTGV2ZWwgKSB7XG5cdFx0XHR1di55ICs9IDIuMCAqIGN1YmVVVl9tYXhUaWxlU2l6ZTtcblx0XHR9XG5cdFx0dXYueSArPSBmaWx0ZXJJbnQgKiAyLjAgKiBjdWJlVVZfbWluVGlsZVNpemU7XG5cdFx0dXYueCArPSAzLjAgKiBtYXgoIDAuMCwgY3ViZVVWX21heFRpbGVTaXplIC0gMi4wICogZmFjZVNpemUgKTtcblx0XHR1diAqPSB0ZXhlbFNpemU7XG5cdFx0dmVjMyB0bCA9IGVudk1hcFRleGVsVG9MaW5lYXIoIHRleHR1cmUyRCggZW52TWFwLCB1diApICkucmdiO1xuXHRcdHV2LnggKz0gdGV4ZWxTaXplO1xuXHRcdHZlYzMgdHIgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCB0ZXh0dXJlMkQoIGVudk1hcCwgdXYgKSApLnJnYjtcblx0XHR1di55ICs9IHRleGVsU2l6ZTtcblx0XHR2ZWMzIGJyID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEKCBlbnZNYXAsIHV2ICkgKS5yZ2I7XG5cdFx0dXYueCAtPSB0ZXhlbFNpemU7XG5cdFx0dmVjMyBibCA9IGVudk1hcFRleGVsVG9MaW5lYXIoIHRleHR1cmUyRCggZW52TWFwLCB1diApICkucmdiO1xuXHRcdHZlYzMgdG0gPSBtaXgoIHRsLCB0ciwgZi54ICk7XG5cdFx0dmVjMyBibSA9IG1peCggYmwsIGJyLCBmLnggKTtcblx0XHRyZXR1cm4gbWl4KCB0bSwgYm0sIGYueSApO1xuXHR9XG5cdCNkZWZpbmUgcjAgMS4wXG5cdCNkZWZpbmUgdjAgMC4zMzlcblx0I2RlZmluZSBtMCAtIDIuMFxuXHQjZGVmaW5lIHIxIDAuOFxuXHQjZGVmaW5lIHYxIDAuMjc2XG5cdCNkZWZpbmUgbTEgLSAxLjBcblx0I2RlZmluZSByNCAwLjRcblx0I2RlZmluZSB2NCAwLjA0NlxuXHQjZGVmaW5lIG00IDIuMFxuXHQjZGVmaW5lIHI1IDAuMzA1XG5cdCNkZWZpbmUgdjUgMC4wMTZcblx0I2RlZmluZSBtNSAzLjBcblx0I2RlZmluZSByNiAwLjIxXG5cdCNkZWZpbmUgdjYgMC4wMDM4XG5cdCNkZWZpbmUgbTYgNC4wXG5cdGZsb2F0IHJvdWdobmVzc1RvTWlwKCBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdFx0ZmxvYXQgbWlwID0gMC4wO1xuXHRcdGlmICggcm91Z2huZXNzID49IHIxICkge1xuXHRcdFx0bWlwID0gKCByMCAtIHJvdWdobmVzcyApICogKCBtMSAtIG0wICkgLyAoIHIwIC0gcjEgKSArIG0wO1xuXHRcdH0gZWxzZSBpZiAoIHJvdWdobmVzcyA+PSByNCApIHtcblx0XHRcdG1pcCA9ICggcjEgLSByb3VnaG5lc3MgKSAqICggbTQgLSBtMSApIC8gKCByMSAtIHI0ICkgKyBtMTtcblx0XHR9IGVsc2UgaWYgKCByb3VnaG5lc3MgPj0gcjUgKSB7XG5cdFx0XHRtaXAgPSAoIHI0IC0gcm91Z2huZXNzICkgKiAoIG01IC0gbTQgKSAvICggcjQgLSByNSApICsgbTQ7XG5cdFx0fSBlbHNlIGlmICggcm91Z2huZXNzID49IHI2ICkge1xuXHRcdFx0bWlwID0gKCByNSAtIHJvdWdobmVzcyApICogKCBtNiAtIG01ICkgLyAoIHI1IC0gcjYgKSArIG01O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtaXAgPSAtIDIuMCAqIGxvZzIoIDEuMTYgKiByb3VnaG5lc3MgKTtcdFx0fVxuXHRcdHJldHVybiBtaXA7XG5cdH1cblx0dmVjNCB0ZXh0dXJlQ3ViZVVWKCBzYW1wbGVyMkQgZW52TWFwLCB2ZWMzIHNhbXBsZURpciwgZmxvYXQgcm91Z2huZXNzICkge1xuXHRcdGZsb2F0IG1pcCA9IGNsYW1wKCByb3VnaG5lc3NUb01pcCggcm91Z2huZXNzICksIG0wLCBjdWJlVVZfbWF4TWlwTGV2ZWwgKTtcblx0XHRmbG9hdCBtaXBGID0gZnJhY3QoIG1pcCApO1xuXHRcdGZsb2F0IG1pcEludCA9IGZsb29yKCBtaXAgKTtcblx0XHR2ZWMzIGNvbG9yMCA9IGJpbGluZWFyQ3ViZVVWKCBlbnZNYXAsIHNhbXBsZURpciwgbWlwSW50ICk7XG5cdFx0aWYgKCBtaXBGID09IDAuMCApIHtcblx0XHRcdHJldHVybiB2ZWM0KCBjb2xvcjAsIDEuMCApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2ZWMzIGNvbG9yMSA9IGJpbGluZWFyQ3ViZVVWKCBlbnZNYXAsIHNhbXBsZURpciwgbWlwSW50ICsgMS4wICk7XG5cdFx0XHRyZXR1cm4gdmVjNCggbWl4KCBjb2xvcjAsIGNvbG9yMSwgbWlwRiApLCAxLjAgKTtcblx0XHR9XG5cdH1cbiNlbmRpZiIsZGVmYXVsdG5vcm1hbF92ZXJ0ZXg6InZlYzMgdHJhbnNmb3JtZWROb3JtYWwgPSBvYmplY3ROb3JtYWw7XG4jaWZkZWYgVVNFX0lOU1RBTkNJTkdcblx0bWF0MyBtID0gbWF0MyggaW5zdGFuY2VNYXRyaXggKTtcblx0dHJhbnNmb3JtZWROb3JtYWwgLz0gdmVjMyggZG90KCBtWyAwIF0sIG1bIDAgXSApLCBkb3QoIG1bIDEgXSwgbVsgMSBdICksIGRvdCggbVsgMiBdLCBtWyAyIF0gKSApO1xuXHR0cmFuc2Zvcm1lZE5vcm1hbCA9IG0gKiB0cmFuc2Zvcm1lZE5vcm1hbDtcbiNlbmRpZlxudHJhbnNmb3JtZWROb3JtYWwgPSBub3JtYWxNYXRyaXggKiB0cmFuc2Zvcm1lZE5vcm1hbDtcbiNpZmRlZiBGTElQX1NJREVEXG5cdHRyYW5zZm9ybWVkTm9ybWFsID0gLSB0cmFuc2Zvcm1lZE5vcm1hbDtcbiNlbmRpZlxuI2lmZGVmIFVTRV9UQU5HRU5UXG5cdHZlYzMgdHJhbnNmb3JtZWRUYW5nZW50ID0gKCBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBvYmplY3RUYW5nZW50LCAwLjAgKSApLnh5ejtcblx0I2lmZGVmIEZMSVBfU0lERURcblx0XHR0cmFuc2Zvcm1lZFRhbmdlbnQgPSAtIHRyYW5zZm9ybWVkVGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWYiLGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgZGlzcGxhY2VtZW50TWFwO1xuXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudFNjYWxlO1xuXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudEJpYXM7XG4jZW5kaWYiLGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg6IiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5cdHRyYW5zZm9ybWVkICs9IG5vcm1hbGl6ZSggb2JqZWN0Tm9ybWFsICkgKiAoIHRleHR1cmUyRCggZGlzcGxhY2VtZW50TWFwLCB2VXYgKS54ICogZGlzcGxhY2VtZW50U2NhbGUgKyBkaXNwbGFjZW1lbnRCaWFzICk7XG4jZW5kaWYiLGVtaXNzaXZlbWFwX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXG5cdHZlYzQgZW1pc3NpdmVDb2xvciA9IHRleHR1cmUyRCggZW1pc3NpdmVNYXAsIHZVdiApO1xuXHRlbWlzc2l2ZUNvbG9yLnJnYiA9IGVtaXNzaXZlTWFwVGV4ZWxUb0xpbmVhciggZW1pc3NpdmVDb2xvciApLnJnYjtcblx0dG90YWxFbWlzc2l2ZVJhZGlhbmNlICo9IGVtaXNzaXZlQ29sb3IucmdiO1xuI2VuZGlmIixlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGVtaXNzaXZlTWFwO1xuI2VuZGlmIixlbmNvZGluZ3NfZnJhZ21lbnQ6ImdsX0ZyYWdDb2xvciA9IGxpbmVhclRvT3V0cHV0VGV4ZWwoIGdsX0ZyYWdDb2xvciApOyIsZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ6IlxudmVjNCBMaW5lYXJUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZhbHVlO1xufVxudmVjNCBHYW1tYVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBnYW1tYUZhY3RvciApIHtcblx0cmV0dXJuIHZlYzQoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCBnYW1tYUZhY3RvciApICksIHZhbHVlLmEgKTtcbn1cbnZlYzQgTGluZWFyVG9HYW1tYSggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XG5cdHJldHVybiB2ZWM0KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMS4wIC8gZ2FtbWFGYWN0b3IgKSApLCB2YWx1ZS5hICk7XG59XG52ZWM0IHNSR0JUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZlYzQoIG1peCggcG93KCB2YWx1ZS5yZ2IgKiAwLjk0Nzg2NzI5ODYgKyB2ZWMzKCAwLjA1MjEzMjcwMTQgKSwgdmVjMyggMi40ICkgKSwgdmFsdWUucmdiICogMC4wNzczOTkzODA4LCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDQwNDUgKSApICkgKSwgdmFsdWUuYSApO1xufVxudmVjNCBMaW5lYXJUb3NSR0IoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCAwLjQxNjY2ICkgKSAqIDEuMDU1IC0gdmVjMyggMC4wNTUgKSwgdmFsdWUucmdiICogMTIuOTIsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wMDMxMzA4ICkgKSApICksIHZhbHVlLmEgKTtcbn1cbnZlYzQgUkdCRVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogZXhwMiggdmFsdWUuYSAqIDI1NS4wIC0gMTI4LjAgKSwgMS4wICk7XG59XG52ZWM0IExpbmVhclRvUkdCRSggaW4gdmVjNCB2YWx1ZSApIHtcblx0ZmxvYXQgbWF4Q29tcG9uZW50ID0gbWF4KCBtYXgoIHZhbHVlLnIsIHZhbHVlLmcgKSwgdmFsdWUuYiApO1xuXHRmbG9hdCBmRXhwID0gY2xhbXAoIGNlaWwoIGxvZzIoIG1heENvbXBvbmVudCApICksIC0xMjguMCwgMTI3LjAgKTtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvIGV4cDIoIGZFeHAgKSwgKCBmRXhwICsgMTI4LjAgKSAvIDI1NS4wICk7XG59XG52ZWM0IFJHQk1Ub0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiB2YWx1ZS5hICogbWF4UmFuZ2UsIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQk0oIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRmbG9hdCBtYXhSR0IgPSBtYXgoIHZhbHVlLnIsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XG5cdGZsb2F0IE0gPSBjbGFtcCggbWF4UkdCIC8gbWF4UmFuZ2UsIDAuMCwgMS4wICk7XG5cdE0gPSBjZWlsKCBNICogMjU1LjAgKSAvIDI1NS4wO1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiIC8gKCBNICogbWF4UmFuZ2UgKSwgTSApO1xufVxudmVjNCBSR0JEVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCAoIG1heFJhbmdlIC8gMjU1LjAgKSAvIHZhbHVlLmEgKSwgMS4wICk7XG59XG52ZWM0IExpbmVhclRvUkdCRCggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XG5cdGZsb2F0IG1heFJHQiA9IG1heCggdmFsdWUuciwgbWF4KCB2YWx1ZS5nLCB2YWx1ZS5iICkgKTtcblx0ZmxvYXQgRCA9IG1heCggbWF4UmFuZ2UgLyBtYXhSR0IsIDEuMCApO1xuXHREID0gY2xhbXAoIGZsb29yKCBEICkgLyAyNTUuMCwgMC4wLCAxLjAgKTtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICggRCAqICggMjU1LjAgLyBtYXhSYW5nZSApICksIEQgKTtcbn1cbmNvbnN0IG1hdDMgY0xvZ0x1dk0gPSBtYXQzKCAwLjIyMDksIDAuMzM5MCwgMC40MTg0LCAwLjExMzgsIDAuNjc4MCwgMC43MzE5LCAwLjAxMDIsIDAuMTEzMCwgMC4yOTY5ICk7XG52ZWM0IExpbmVhclRvTG9nTHV2KCBpbiB2ZWM0IHZhbHVlICkge1xuXHR2ZWMzIFhwX1lfWFlacCA9IGNMb2dMdXZNICogdmFsdWUucmdiO1xuXHRYcF9ZX1hZWnAgPSBtYXgoIFhwX1lfWFlacCwgdmVjMyggMWUtNiwgMWUtNiwgMWUtNiApICk7XG5cdHZlYzQgdlJlc3VsdDtcblx0dlJlc3VsdC54eSA9IFhwX1lfWFlacC54eSAvIFhwX1lfWFlacC56O1xuXHRmbG9hdCBMZSA9IDIuMCAqIGxvZzIoWHBfWV9YWVpwLnkpICsgMTI3LjA7XG5cdHZSZXN1bHQudyA9IGZyYWN0KCBMZSApO1xuXHR2UmVzdWx0LnogPSAoIExlIC0gKCBmbG9vciggdlJlc3VsdC53ICogMjU1LjAgKSApIC8gMjU1LjAgKSAvIDI1NS4wO1xuXHRyZXR1cm4gdlJlc3VsdDtcbn1cbmNvbnN0IG1hdDMgY0xvZ0x1dkludmVyc2VNID0gbWF0MyggNi4wMDE0LCAtMi43MDA4LCAtMS43OTk2LCAtMS4zMzIwLCAzLjEwMjksIC01Ljc3MjEsIDAuMzAwOCwgLTEuMDg4MiwgNS42MjY4ICk7XG52ZWM0IExvZ0x1dlRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRmbG9hdCBMZSA9IHZhbHVlLnogKiAyNTUuMCArIHZhbHVlLnc7XG5cdHZlYzMgWHBfWV9YWVpwO1xuXHRYcF9ZX1hZWnAueSA9IGV4cDIoICggTGUgLSAxMjcuMCApIC8gMi4wICk7XG5cdFhwX1lfWFlacC56ID0gWHBfWV9YWVpwLnkgLyB2YWx1ZS55O1xuXHRYcF9ZX1hZWnAueCA9IHZhbHVlLnggKiBYcF9ZX1hZWnAuejtcblx0dmVjMyB2UkdCID0gY0xvZ0x1dkludmVyc2VNICogWHBfWV9YWVpwLnJnYjtcblx0cmV0dXJuIHZlYzQoIG1heCggdlJHQiwgMC4wICksIDEuMCApO1xufSIsZW52bWFwX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VOVk1BUFxuXHQjaWZkZWYgRU5WX1dPUkxEUE9TXG5cdFx0dmVjMyBjYW1lcmFUb0ZyYWc7XG5cdFx0aWYgKCBpc09ydGhvZ3JhcGhpYyApIHtcblx0XHRcdGNhbWVyYVRvRnJhZyA9IG5vcm1hbGl6ZSggdmVjMyggLSB2aWV3TWF0cml4WyAwIF1bIDIgXSwgLSB2aWV3TWF0cml4WyAxIF1bIDIgXSwgLSB2aWV3TWF0cml4WyAyIF1bIDIgXSApICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNhbWVyYVRvRnJhZyA9IG5vcm1hbGl6ZSggdldvcmxkUG9zaXRpb24gLSBjYW1lcmFQb3NpdGlvbiApO1xuXHRcdH1cblx0XHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cblx0XHRcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZmxlY3QoIGNhbWVyYVRvRnJhZywgd29ybGROb3JtYWwgKTtcblx0XHQjZWxzZVxuXHRcdFx0dmVjMyByZWZsZWN0VmVjID0gcmVmcmFjdCggY2FtZXJhVG9GcmFnLCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XG5cdFx0I2VuZGlmXG5cdCNlbHNlXG5cdFx0dmVjMyByZWZsZWN0VmVjID0gdlJlZmxlY3Q7XG5cdCNlbmRpZlxuXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxuXHRcdHZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICkgKTtcblx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXG5cdFx0dmVjNCBlbnZDb2xvciA9IHRleHR1cmVDdWJlVVYoIGVudk1hcCwgcmVmbGVjdFZlYywgMC4wICk7XG5cdCNlbHNlXG5cdFx0dmVjNCBlbnZDb2xvciA9IHZlYzQoIDAuMCApO1xuXHQjZW5kaWZcblx0I2lmbmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWXG5cdFx0ZW52Q29sb3IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZDb2xvciApO1xuXHQjZW5kaWZcblx0I2lmZGVmIEVOVk1BUF9CTEVORElOR19NVUxUSVBMWVxuXHRcdG91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIG91dGdvaW5nTGlnaHQgKiBlbnZDb2xvci54eXosIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHkgKTtcblx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX0JMRU5ESU5HX01JWCApXG5cdFx0b3V0Z29pbmdMaWdodCA9IG1peCggb3V0Z29pbmdMaWdodCwgZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19BREQgKVxuXHRcdG91dGdvaW5nTGlnaHQgKz0gZW52Q29sb3IueHl6ICogc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eTtcblx0I2VuZGlmXG4jZW5kaWYiLGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0dW5pZm9ybSBmbG9hdCBlbnZNYXBJbnRlbnNpdHk7XG5cdHVuaWZvcm0gZmxvYXQgZmxpcEVudk1hcDtcblx0dW5pZm9ybSBpbnQgbWF4TWlwTGV2ZWw7XG5cdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0dW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZNYXA7XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgZW52TWFwO1xuXHQjZW5kaWZcblx0XG4jZW5kaWYiLGVudm1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VOVk1BUFxuXHR1bmlmb3JtIGZsb2F0IHJlZmxlY3Rpdml0eTtcblx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HIClcblx0XHQjZGVmaW5lIEVOVl9XT1JMRFBPU1xuXHQjZW5kaWZcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcblx0XHR1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbztcblx0I2Vsc2Vcblx0XHR2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7XG5cdCNlbmRpZlxuI2VuZGlmIixlbnZtYXBfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fGRlZmluZWQoIFBIT05HIClcblx0XHQjZGVmaW5lIEVOVl9XT1JMRFBPU1xuXHQjZW5kaWZcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdFxuXHRcdHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcblx0I2Vsc2Vcblx0XHR2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7XG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbmRpZlxuI2VuZGlmIixlbnZtYXBfcGh5c2ljYWxfcGFyc19mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKVxuXHQjaWZkZWYgRU5WTUFQX01PREVfUkVGUkFDVElPTlxuXHRcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xuXHQjZW5kaWZcblx0dmVjMyBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGdlb21ldHJ5Lm5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0XHR2ZWMzIHF1ZXJ5VmVjID0gdmVjMyggZmxpcEVudk1hcCAqIHdvcmxkTm9ybWFsLngsIHdvcmxkTm9ybWFsLnl6ICk7XG5cdFx0XHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZUxvZEVYVCggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcblx0XHRcdCNlbHNlXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcblx0XHRcdCNlbmRpZlxuXHRcdFx0ZW52TWFwQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XG5cdFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVViggZW52TWFwLCB3b3JsZE5vcm1hbCwgMS4wICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZlYzQgZW52TWFwQ29sb3IgPSB2ZWM0KCAwLjAgKTtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gUEkgKiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7XG5cdH1cblx0ZmxvYXQgZ2V0U3BlY3VsYXJNSVBMZXZlbCggY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XG5cdFx0ZmxvYXQgbWF4TUlQTGV2ZWxTY2FsYXIgPSBmbG9hdCggbWF4TUlQTGV2ZWwgKTtcblx0XHRmbG9hdCBzaWdtYSA9IFBJICogcm91Z2huZXNzICogcm91Z2huZXNzIC8gKCAxLjAgKyByb3VnaG5lc3MgKTtcblx0XHRmbG9hdCBkZXNpcmVkTUlQTGV2ZWwgPSBtYXhNSVBMZXZlbFNjYWxhciArIGxvZzIoIHNpZ21hICk7XG5cdFx0cmV0dXJuIGNsYW1wKCBkZXNpcmVkTUlQTGV2ZWwsIDAuMCwgbWF4TUlQTGV2ZWxTY2FsYXIgKTtcblx0fVxuXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcblx0XHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxuXHRcdFx0dmVjMyByZWZsZWN0VmVjID0gcmVmbGVjdCggLXZpZXdEaXIsIG5vcm1hbCApO1xuXHRcdFx0cmVmbGVjdFZlYyA9IG5vcm1hbGl6ZSggbWl4KCByZWZsZWN0VmVjLCBub3JtYWwsIHJvdWdobmVzcyAqIHJvdWdobmVzcykgKTtcblx0XHQjZWxzZVxuXHRcdFx0dmVjMyByZWZsZWN0VmVjID0gcmVmcmFjdCggLXZpZXdEaXIsIG5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XG5cdFx0I2VuZGlmXG5cdFx0cmVmbGVjdFZlYyA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHJlZmxlY3RWZWMsIHZpZXdNYXRyaXggKTtcblx0XHRmbG9hdCBzcGVjdWxhck1JUExldmVsID0gZ2V0U3BlY3VsYXJNSVBMZXZlbCggcm91Z2huZXNzLCBtYXhNSVBMZXZlbCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0XHR2ZWMzIHF1ZXJ5UmVmbGVjdFZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlTG9kRVhUKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIHJlZmxlY3RWZWMsIHJvdWdobmVzcyApO1xuXHRcdCNlbmRpZlxuXHRcdHJldHVybiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7XG5cdH1cbiNlbmRpZiIsZW52bWFwX3ZlcnRleDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdHZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbi54eXo7XG5cdCNlbHNlXG5cdFx0dmVjMyBjYW1lcmFUb1ZlcnRleDtcblx0XHRpZiAoIGlzT3J0aG9ncmFwaGljICkge1xuXHRcdFx0Y2FtZXJhVG9WZXJ0ZXggPSBub3JtYWxpemUoIHZlYzMoIC0gdmlld01hdHJpeFsgMCBdWyAyIF0sIC0gdmlld01hdHJpeFsgMSBdWyAyIF0sIC0gdmlld01hdHJpeFsgMiBdWyAyIF0gKSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjYW1lcmFUb1ZlcnRleCA9IG5vcm1hbGl6ZSggd29ybGRQb3NpdGlvbi54eXogLSBjYW1lcmFQb3NpdGlvbiApO1xuXHRcdH1cblx0XHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggdHJhbnNmb3JtZWROb3JtYWwsIHZpZXdNYXRyaXggKTtcblx0XHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxuXHRcdFx0dlJlZmxlY3QgPSByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTtcblx0XHQjZWxzZVxuXHRcdFx0dlJlZmxlY3QgPSByZWZyYWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xuXHRcdCNlbmRpZlxuXHQjZW5kaWZcbiNlbmRpZiIsZm9nX3ZlcnRleDoiI2lmZGVmIFVTRV9GT0dcblx0Zm9nRGVwdGggPSAtIG12UG9zaXRpb24uejtcbiNlbmRpZiIsZm9nX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX0ZPR1xuXHR2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoO1xuI2VuZGlmIixmb2dfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRk9HXG5cdCNpZmRlZiBGT0dfRVhQMlxuXHRcdGZsb2F0IGZvZ0ZhY3RvciA9IDEuMCAtIGV4cCggLSBmb2dEZW5zaXR5ICogZm9nRGVuc2l0eSAqIGZvZ0RlcHRoICogZm9nRGVwdGggKTtcblx0I2Vsc2Vcblx0XHRmbG9hdCBmb2dGYWN0b3IgPSBzbW9vdGhzdGVwKCBmb2dOZWFyLCBmb2dGYXIsIGZvZ0RlcHRoICk7XG5cdCNlbmRpZlxuXHRnbF9GcmFnQ29sb3IucmdiID0gbWl4KCBnbF9GcmFnQ29sb3IucmdiLCBmb2dDb2xvciwgZm9nRmFjdG9yICk7XG4jZW5kaWYiLGZvZ19wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0ZPR1xuXHR1bmlmb3JtIHZlYzMgZm9nQ29sb3I7XG5cdHZhcnlpbmcgZmxvYXQgZm9nRGVwdGg7XG5cdCNpZmRlZiBGT0dfRVhQMlxuXHRcdHVuaWZvcm0gZmxvYXQgZm9nRGVuc2l0eTtcblx0I2Vsc2Vcblx0XHR1bmlmb3JtIGZsb2F0IGZvZ05lYXI7XG5cdFx0dW5pZm9ybSBmbG9hdCBmb2dGYXI7XG5cdCNlbmRpZlxuI2VuZGlmIixncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0dSQURJRU5UTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGdyYWRpZW50TWFwO1xuI2VuZGlmXG52ZWMzIGdldEdyYWRpZW50SXJyYWRpYW5jZSggdmVjMyBub3JtYWwsIHZlYzMgbGlnaHREaXJlY3Rpb24gKSB7XG5cdGZsb2F0IGRvdE5MID0gZG90KCBub3JtYWwsIGxpZ2h0RGlyZWN0aW9uICk7XG5cdHZlYzIgY29vcmQgPSB2ZWMyKCBkb3ROTCAqIDAuNSArIDAuNSwgMC4wICk7XG5cdCNpZmRlZiBVU0VfR1JBRElFTlRNQVBcblx0XHRyZXR1cm4gdGV4dHVyZTJEKCBncmFkaWVudE1hcCwgY29vcmQgKS5yZ2I7XG5cdCNlbHNlXG5cdFx0cmV0dXJuICggY29vcmQueCA8IDAuNyApID8gdmVjMyggMC43ICkgOiB2ZWMzKCAxLjAgKTtcblx0I2VuZGlmXG59IixsaWdodG1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9MSUdIVE1BUFxuXHR2ZWM0IGxpZ2h0TWFwVGV4ZWw9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKTtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IFBJICogbGlnaHRNYXBUZXhlbFRvTGluZWFyKCBsaWdodE1hcFRleGVsICkucmdiICogbGlnaHRNYXBJbnRlbnNpdHk7XG4jZW5kaWYiLGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTElHSFRNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbGlnaHRNYXA7XG5cdHVuaWZvcm0gZmxvYXQgbGlnaHRNYXBJbnRlbnNpdHk7XG4jZW5kaWYiLGxpZ2h0c19sYW1iZXJ0X3ZlcnRleDoidmVjMyBkaWZmdXNlID0gdmVjMyggMS4wICk7XG5HZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5O1xuZ2VvbWV0cnkucG9zaXRpb24gPSBtdlBvc2l0aW9uLnh5ejtcbmdlb21ldHJ5Lm5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcbmdlb21ldHJ5LnZpZXdEaXIgPSAoIGlzT3J0aG9ncmFwaGljICkgPyB2ZWMzKCAwLCAwLCAxICkgOiBub3JtYWxpemUoIC1tdlBvc2l0aW9uLnh5eiApO1xuR2VvbWV0cmljQ29udGV4dCBiYWNrR2VvbWV0cnk7XG5iYWNrR2VvbWV0cnkucG9zaXRpb24gPSBnZW9tZXRyeS5wb3NpdGlvbjtcbmJhY2tHZW9tZXRyeS5ub3JtYWwgPSAtZ2VvbWV0cnkubm9ybWFsO1xuYmFja0dlb21ldHJ5LnZpZXdEaXIgPSBnZW9tZXRyeS52aWV3RGlyO1xudkxpZ2h0RnJvbnQgPSB2ZWMzKCAwLjAgKTtcbnZJbmRpcmVjdEZyb250ID0gdmVjMyggMC4wICk7XG4jaWZkZWYgRE9VQkxFX1NJREVEXG5cdHZMaWdodEJhY2sgPSB2ZWMzKCAwLjAgKTtcblx0dkluZGlyZWN0QmFjayA9IHZlYzMoIDAuMCApO1xuI2VuZGlmXG5JbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0O1xuZmxvYXQgZG90Tkw7XG52ZWMzIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcbnZJbmRpcmVjdEZyb250ICs9IGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7XG52SW5kaXJlY3RGcm9udCArPSBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggbGlnaHRQcm9iZSwgZ2VvbWV0cnkgKTtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dkluZGlyZWN0QmFjayArPSBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xuXHR2SW5kaXJlY3RCYWNrICs9IGdldExpZ2h0UHJvYmVJcnJhZGlhbmNlKCBsaWdodFByb2JlLCBiYWNrR2VvbWV0cnkgKTtcbiNlbmRpZlxuI2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggcG9pbnRMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0ZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHR2TGlnaHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2TGlnaHRCYWNrICs9IHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjZW5kaWZcblx0fVxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuI2VuZGlmXG4jaWYgTlVNX1NQT1RfTElHSFRTID4gMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSA9IFBJICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0dkxpZ2h0RnJvbnQgKz0gc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2VuZGlmXG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcbiNlbmRpZlxuI2lmIE5VTV9ESVJfTElHSFRTID4gMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xuXHRcdGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHRkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgPSBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdHZMaWdodEZyb250ICs9IHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZMaWdodEJhY2sgKz0gc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNlbmRpZlxuXHR9XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG4jZW5kaWZcbiNpZiBOVU1fSEVNSV9MSUdIVFMgPiAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xuXHRcdHZJbmRpcmVjdEZyb250ICs9IGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkgKTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2SW5kaXJlY3RCYWNrICs9IGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgYmFja0dlb21ldHJ5ICk7XG5cdFx0I2VuZGlmXG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcbiNlbmRpZiIsbGlnaHRzX3BhcnNfYmVnaW46InVuaWZvcm0gYm9vbCByZWNlaXZlU2hhZG93O1xudW5pZm9ybSB2ZWMzIGFtYmllbnRMaWdodENvbG9yO1xudW5pZm9ybSB2ZWMzIGxpZ2h0UHJvYmVbIDkgXTtcbnZlYzMgc2hHZXRJcnJhZGlhbmNlQXQoIGluIHZlYzMgbm9ybWFsLCBpbiB2ZWMzIHNoQ29lZmZpY2llbnRzWyA5IF0gKSB7XG5cdGZsb2F0IHggPSBub3JtYWwueCwgeSA9IG5vcm1hbC55LCB6ID0gbm9ybWFsLno7XG5cdHZlYzMgcmVzdWx0ID0gc2hDb2VmZmljaWVudHNbIDAgXSAqIDAuODg2MjI3O1xuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDEgXSAqIDIuMCAqIDAuNTExNjY0ICogeTtcblx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyAyIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHo7XG5cdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgMyBdICogMi4wICogMC41MTE2NjQgKiB4O1xuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDQgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHk7XG5cdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNSBdICogMi4wICogMC40MjkwNDMgKiB5ICogejtcblx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA2IF0gKiAoIDAuNzQzMTI1ICogeiAqIHogLSAwLjI0NzcwOCApO1xuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDcgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHo7XG5cdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgOCBdICogMC40MjkwNDMgKiAoIHggKiB4IC0geSAqIHkgKTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cbnZlYzMgZ2V0TGlnaHRQcm9iZUlycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgbGlnaHRQcm9iZVsgOSBdLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5ICkge1xuXHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggZ2VvbWV0cnkubm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdHZlYzMgaXJyYWRpYW5jZSA9IHNoR2V0SXJyYWRpYW5jZUF0KCB3b3JsZE5vcm1hbCwgbGlnaHRQcm9iZSApO1xuXHRyZXR1cm4gaXJyYWRpYW5jZTtcbn1cbnZlYzMgZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBhbWJpZW50TGlnaHRDb2xvciApIHtcblx0dmVjMyBpcnJhZGlhbmNlID0gYW1iaWVudExpZ2h0Q29sb3I7XG5cdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdGlycmFkaWFuY2UgKj0gUEk7XG5cdCNlbmRpZlxuXHRyZXR1cm4gaXJyYWRpYW5jZTtcbn1cbiNpZiBOVU1fRElSX0xJR0hUUyA+IDBcblx0c3RydWN0IERpcmVjdGlvbmFsTGlnaHQge1xuXHRcdHZlYzMgZGlyZWN0aW9uO1xuXHRcdHZlYzMgY29sb3I7XG5cdH07XG5cdHVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0c1sgTlVNX0RJUl9MSUdIVFMgXTtcblx0dm9pZCBnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gRGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCApIHtcblx0XHRkaXJlY3RMaWdodC5jb2xvciA9IGRpcmVjdGlvbmFsTGlnaHQuY29sb3I7XG5cdFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gZGlyZWN0aW9uYWxMaWdodC5kaXJlY3Rpb247XG5cdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9IHRydWU7XG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXG5cdHN0cnVjdCBQb2ludExpZ2h0IHtcblx0XHR2ZWMzIHBvc2l0aW9uO1xuXHRcdHZlYzMgY29sb3I7XG5cdFx0ZmxvYXQgZGlzdGFuY2U7XG5cdFx0ZmxvYXQgZGVjYXk7XG5cdH07XG5cdHVuaWZvcm0gUG9pbnRMaWdodCBwb2ludExpZ2h0c1sgTlVNX1BPSU5UX0xJR0hUUyBdO1xuXHR2b2lkIGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBQb2ludExpZ2h0IHBvaW50TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICkge1xuXHRcdHZlYzMgbFZlY3RvciA9IHBvaW50TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeS5wb3NpdGlvbjtcblx0XHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUoIGxWZWN0b3IgKTtcblx0XHRmbG9hdCBsaWdodERpc3RhbmNlID0gbGVuZ3RoKCBsVmVjdG9yICk7XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBwb2ludExpZ2h0LmNvbG9yO1xuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICo9IHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGxpZ2h0RGlzdGFuY2UsIHBvaW50TGlnaHQuZGlzdGFuY2UsIHBvaW50TGlnaHQuZGVjYXkgKTtcblx0XHRkaXJlY3RMaWdodC52aXNpYmxlID0gKCBkaXJlY3RMaWdodC5jb2xvciAhPSB2ZWMzKCAwLjAgKSApO1xuXHR9XG4jZW5kaWZcbiNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXG5cdHN0cnVjdCBTcG90TGlnaHQge1xuXHRcdHZlYzMgcG9zaXRpb247XG5cdFx0dmVjMyBkaXJlY3Rpb247XG5cdFx0dmVjMyBjb2xvcjtcblx0XHRmbG9hdCBkaXN0YW5jZTtcblx0XHRmbG9hdCBkZWNheTtcblx0XHRmbG9hdCBjb25lQ29zO1xuXHRcdGZsb2F0IHBlbnVtYnJhQ29zO1xuXHR9O1xuXHR1bmlmb3JtIFNwb3RMaWdodCBzcG90TGlnaHRzWyBOVU1fU1BPVF9MSUdIVFMgXTtcblx0dm9pZCBnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBTcG90TGlnaHQgc3BvdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCApIHtcblx0XHR2ZWMzIGxWZWN0b3IgPSBzcG90TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeS5wb3NpdGlvbjtcblx0XHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUoIGxWZWN0b3IgKTtcblx0XHRmbG9hdCBsaWdodERpc3RhbmNlID0gbGVuZ3RoKCBsVmVjdG9yICk7XG5cdFx0ZmxvYXQgYW5nbGVDb3MgPSBkb3QoIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgc3BvdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGlmICggYW5nbGVDb3MgPiBzcG90TGlnaHQuY29uZUNvcyApIHtcblx0XHRcdGZsb2F0IHNwb3RFZmZlY3QgPSBzbW9vdGhzdGVwKCBzcG90TGlnaHQuY29uZUNvcywgc3BvdExpZ2h0LnBlbnVtYnJhQ29zLCBhbmdsZUNvcyApO1xuXHRcdFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBzcG90TGlnaHQuY29sb3I7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciAqPSBzcG90RWZmZWN0ICogcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggbGlnaHREaXN0YW5jZSwgc3BvdExpZ2h0LmRpc3RhbmNlLCBzcG90TGlnaHQuZGVjYXkgKTtcblx0XHRcdGRpcmVjdExpZ2h0LnZpc2libGUgPSB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciA9IHZlYzMoIDAuMCApO1xuXHRcdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9IGZhbHNlO1xuXHRcdH1cblx0fVxuI2VuZGlmXG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwXG5cdHN0cnVjdCBSZWN0QXJlYUxpZ2h0IHtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdHZlYzMgcG9zaXRpb247XG5cdFx0dmVjMyBoYWxmV2lkdGg7XG5cdFx0dmVjMyBoYWxmSGVpZ2h0O1xuXHR9O1xuXHR1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMTtcdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18yO1xuXHR1bmlmb3JtIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodHNbIE5VTV9SRUNUX0FSRUFfTElHSFRTIF07XG4jZW5kaWZcbiNpZiBOVU1fSEVNSV9MSUdIVFMgPiAwXG5cdHN0cnVjdCBIZW1pc3BoZXJlTGlnaHQge1xuXHRcdHZlYzMgZGlyZWN0aW9uO1xuXHRcdHZlYzMgc2t5Q29sb3I7XG5cdFx0dmVjMyBncm91bmRDb2xvcjtcblx0fTtcblx0dW5pZm9ybSBIZW1pc3BoZXJlTGlnaHQgaGVtaXNwaGVyZUxpZ2h0c1sgTlVNX0hFTUlfTElHSFRTIF07XG5cdHZlYzMgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gSGVtaXNwaGVyZUxpZ2h0IGhlbWlMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSApIHtcblx0XHRmbG9hdCBkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoZW1pTGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZmxvYXQgaGVtaURpZmZ1c2VXZWlnaHQgPSAwLjUgKiBkb3ROTCArIDAuNTtcblx0XHR2ZWMzIGlycmFkaWFuY2UgPSBtaXgoIGhlbWlMaWdodC5ncm91bmRDb2xvciwgaGVtaUxpZ2h0LnNreUNvbG9yLCBoZW1pRGlmZnVzZVdlaWdodCApO1xuXHRcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdFx0aXJyYWRpYW5jZSAqPSBQSTtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gaXJyYWRpYW5jZTtcblx0fVxuI2VuZGlmIixsaWdodHNfdG9vbl9mcmFnbWVudDoiVG9vbk1hdGVyaWFsIG1hdGVyaWFsO1xubWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYjsiLGxpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQ6InZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuc3RydWN0IFRvb25NYXRlcmlhbCB7XG5cdHZlYzMgZGlmZnVzZUNvbG9yO1xufTtcbnZvaWQgUkVfRGlyZWN0X1Rvb24oIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFRvb25NYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdHZlYzMgaXJyYWRpYW5jZSA9IGdldEdyYWRpZW50SXJyYWRpYW5jZSggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRpcnJhZGlhbmNlICo9IFBJO1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xufVxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfVG9vbiggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBUb29uTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbiNkZWZpbmUgUkVfRGlyZWN0XHRcdFx0XHRSRV9EaXJlY3RfVG9vblxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcdFx0UkVfSW5kaXJlY3REaWZmdXNlX1Rvb25cbiNkZWZpbmUgTWF0ZXJpYWxfTGlnaHRQcm9iZUxPRCggbWF0ZXJpYWwgKVx0KDApIixsaWdodHNfcGhvbmdfZnJhZ21lbnQ6IkJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbDtcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2I7XG5tYXRlcmlhbC5zcGVjdWxhckNvbG9yID0gc3BlY3VsYXI7XG5tYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyA9IHNoaW5pbmVzcztcbm1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGggPSBzcGVjdWxhclN0cmVuZ3RoOyIsbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQ6InZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuc3RydWN0IEJsaW5uUGhvbmdNYXRlcmlhbCB7XG5cdHZlYzMgZGlmZnVzZUNvbG9yO1xuXHR2ZWMzIHNwZWN1bGFyQ29sb3I7XG5cdGZsb2F0IHNwZWN1bGFyU2hpbmluZXNzO1xuXHRmbG9hdCBzcGVjdWxhclN0cmVuZ3RoO1xufTtcbnZvaWQgUkVfRGlyZWN0X0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xuXHR2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRpcnJhZGlhbmNlICo9IFBJO1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9CbGlublBob25nKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzICkgKiBtYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoO1xufVxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfQmxpbm5QaG9uZyggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbiNkZWZpbmUgUkVfRGlyZWN0XHRcdFx0XHRSRV9EaXJlY3RfQmxpbm5QaG9uZ1xuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcdFx0UkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmdcbiNkZWZpbmUgTWF0ZXJpYWxfTGlnaHRQcm9iZUxPRCggbWF0ZXJpYWwgKVx0KDApIixsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQ6IlBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWw7XG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiICogKCAxLjAgLSBtZXRhbG5lc3NGYWN0b3IgKTtcbnZlYzMgZHh5ID0gbWF4KCBhYnMoIGRGZHgoIGdlb21ldHJ5Tm9ybWFsICkgKSwgYWJzKCBkRmR5KCBnZW9tZXRyeU5vcm1hbCApICkgKTtcbmZsb2F0IGdlb21ldHJ5Um91Z2huZXNzID0gbWF4KCBtYXgoIGR4eS54LCBkeHkueSApLCBkeHkueiApO1xubWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgPSBtYXgoIHJvdWdobmVzc0ZhY3RvciwgMC4wNTI1ICk7bWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgKz0gZ2VvbWV0cnlSb3VnaG5lc3M7XG5tYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyA9IG1pbiggbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MsIDEuMCApO1xuI2lmZGVmIFJFRkxFQ1RJVklUWVxuXHQjaWZkZWYgU1BFQ1VMQVJcblx0XHR2ZWMzIHNwZWN1bGFySW50ZW5zaXR5RmFjdG9yID0gdmVjMyggc3BlY3VsYXJJbnRlbnNpdHkgKTtcblx0XHR2ZWMzIHNwZWN1bGFyVGludEZhY3RvciA9IHNwZWN1bGFyVGludDtcblx0XHQjaWZkZWYgVVNFX1NQRUNVTEFSSU5URU5TSVRZTUFQXG5cdFx0XHRzcGVjdWxhckludGVuc2l0eUZhY3RvciAqPSB0ZXh0dXJlMkQoIHNwZWN1bGFySW50ZW5zaXR5TWFwLCB2VXYgKS5hO1xuXHRcdCNlbmRpZlxuXHRcdCNpZmRlZiBVU0VfU1BFQ1VMQVJUSU5UTUFQXG5cdFx0XHRzcGVjdWxhclRpbnRGYWN0b3IgKj0gc3BlY3VsYXJUaW50TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEKCBzcGVjdWxhclRpbnRNYXAsIHZVdiApICkucmdiO1xuXHRcdCNlbmRpZlxuXHRcdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3JGOTAgPSBtaXgoIHNwZWN1bGFySW50ZW5zaXR5RmFjdG9yLCB2ZWMzKCAxLjAgKSwgbWV0YWxuZXNzRmFjdG9yICk7XG5cdCNlbHNlXG5cdFx0dmVjMyBzcGVjdWxhckludGVuc2l0eUZhY3RvciA9IHZlYzMoIDEuMCApO1xuXHRcdHZlYzMgc3BlY3VsYXJUaW50RmFjdG9yID0gdmVjMyggMS4wICk7XG5cdFx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvckY5MCA9IHZlYzMoIDEuMCApO1xuXHQjZW5kaWZcblx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IG1peCggbWluKCB2ZWMzKCBNQVhJTVVNX1NQRUNVTEFSX0NPRUZGSUNJRU5UICogcG93MiggcmVmbGVjdGl2aXR5ICkgKSAqIHNwZWN1bGFyVGludEZhY3RvciwgdmVjMyggMS4wICkgKSAqIHNwZWN1bGFySW50ZW5zaXR5RmFjdG9yLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcbiNlbHNlXG5cdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7XG5cdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3JGOTAgPSB2ZWMzKCAxLjAgKTtcbiNlbmRpZlxuI2lmZGVmIENMRUFSQ09BVFxuXHRtYXRlcmlhbC5jbGVhcmNvYXQgPSBjbGVhcmNvYXQ7XG5cdG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IGNsZWFyY29hdFJvdWdobmVzcztcblx0I2lmZGVmIFVTRV9DTEVBUkNPQVRNQVBcblx0XHRtYXRlcmlhbC5jbGVhcmNvYXQgKj0gdGV4dHVyZTJEKCBjbGVhcmNvYXRNYXAsIHZVdiApLng7XG5cdCNlbmRpZlxuXHQjaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVBcblx0XHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKj0gdGV4dHVyZTJEKCBjbGVhcmNvYXRSb3VnaG5lc3NNYXAsIHZVdiApLnk7XG5cdCNlbmRpZlxuXHRtYXRlcmlhbC5jbGVhcmNvYXQgPSBzYXR1cmF0ZSggbWF0ZXJpYWwuY2xlYXJjb2F0ICk7XHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgPSBtYXgoIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgMC4wNTI1ICk7XG5cdG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyArPSBnZW9tZXRyeVJvdWdobmVzcztcblx0bWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzID0gbWluKCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIDEuMCApO1xuI2VuZGlmXG4jaWZkZWYgVVNFX1NIRUVOXG5cdG1hdGVyaWFsLnNoZWVuQ29sb3IgPSBzaGVlbjtcbiNlbmRpZiIsbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ6InN0cnVjdCBQaHlzaWNhbE1hdGVyaWFsIHtcblx0dmVjMyBkaWZmdXNlQ29sb3I7XG5cdGZsb2F0IHNwZWN1bGFyUm91Z2huZXNzO1xuXHR2ZWMzIHNwZWN1bGFyQ29sb3I7XG5cdHZlYzMgc3BlY3VsYXJDb2xvckY5MDtcbiNpZmRlZiBDTEVBUkNPQVRcblx0ZmxvYXQgY2xlYXJjb2F0O1xuXHRmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7XG4jZW5kaWZcbiNpZmRlZiBVU0VfU0hFRU5cblx0dmVjMyBzaGVlbkNvbG9yO1xuI2VuZGlmXG59O1xuI2RlZmluZSBNQVhJTVVNX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMTZcbiNkZWZpbmUgREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCAwLjA0XG5mbG9hdCBjbGVhcmNvYXRESFJBcHByb3goIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkwgKSB7XG5cdHJldHVybiBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICsgKCAxLjAgLSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICkgKiAoIHBvdyggMS4wIC0gZG90TkwsIDUuMCApICogcG93KCAxLjAgLSByb3VnaG5lc3MsIDIuMCApICk7XG59XG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwXG5cdHZvaWQgUkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsKCBjb25zdCBpbiBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRcdHZlYzMgbm9ybWFsID0gZ2VvbWV0cnkubm9ybWFsO1xuXHRcdHZlYzMgdmlld0RpciA9IGdlb21ldHJ5LnZpZXdEaXI7XG5cdFx0dmVjMyBwb3NpdGlvbiA9IGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdHZlYzMgbGlnaHRQb3MgPSByZWN0QXJlYUxpZ2h0LnBvc2l0aW9uO1xuXHRcdHZlYzMgaGFsZldpZHRoID0gcmVjdEFyZWFMaWdodC5oYWxmV2lkdGg7XG5cdFx0dmVjMyBoYWxmSGVpZ2h0ID0gcmVjdEFyZWFMaWdodC5oYWxmSGVpZ2h0O1xuXHRcdHZlYzMgbGlnaHRDb2xvciA9IHJlY3RBcmVhTGlnaHQuY29sb3I7XG5cdFx0ZmxvYXQgcm91Z2huZXNzID0gbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3M7XG5cdFx0dmVjMyByZWN0Q29vcmRzWyA0IF07XG5cdFx0cmVjdENvb3Jkc1sgMCBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1x0XHRyZWN0Q29vcmRzWyAxIF0gPSBsaWdodFBvcyAtIGhhbGZXaWR0aCAtIGhhbGZIZWlnaHQ7XG5cdFx0cmVjdENvb3Jkc1sgMiBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xuXHRcdHJlY3RDb29yZHNbIDMgXSA9IGxpZ2h0UG9zICsgaGFsZldpZHRoICsgaGFsZkhlaWdodDtcblx0XHR2ZWMyIHV2ID0gTFRDX1V2KCBub3JtYWwsIHZpZXdEaXIsIHJvdWdobmVzcyApO1xuXHRcdHZlYzQgdDEgPSB0ZXh0dXJlMkQoIGx0Y18xLCB1diApO1xuXHRcdHZlYzQgdDIgPSB0ZXh0dXJlMkQoIGx0Y18yLCB1diApO1xuXHRcdG1hdDMgbUludiA9IG1hdDMoXG5cdFx0XHR2ZWMzKCB0MS54LCAwLCB0MS55ICksXG5cdFx0XHR2ZWMzKCAgICAwLCAxLCAgICAwICksXG5cdFx0XHR2ZWMzKCB0MS56LCAwLCB0MS53IClcblx0XHQpO1xuXHRcdHZlYzMgZnJlc25lbCA9ICggbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciAqIHQyLnggKyAoIHZlYzMoIDEuMCApIC0gbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciApICogdDIueSApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGxpZ2h0Q29sb3IgKiBmcmVzbmVsICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtSW52LCByZWN0Q29vcmRzICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBsaWdodENvbG9yICogbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtYXQzKCAxLjAgKSwgcmVjdENvb3JkcyApO1xuXHR9XG4jZW5kaWZcbnZvaWQgUkVfRGlyZWN0X1BoeXNpY2FsKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdHZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdGlycmFkaWFuY2UgKj0gUEk7XG5cdCNlbmRpZlxuXHQjaWZkZWYgQ0xFQVJDT0FUXG5cdFx0ZmxvYXQgY2NEb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0XHR2ZWMzIGNjSXJyYWRpYW5jZSA9IGNjRG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRcdGNjSXJyYWRpYW5jZSAqPSBQSTtcblx0XHQjZW5kaWZcblx0XHRmbG9hdCBjbGVhcmNvYXRESFIgPSBtYXRlcmlhbC5jbGVhcmNvYXQgKiBjbGVhcmNvYXRESFJBcHByb3goIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgY2NEb3ROTCApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGNjSXJyYWRpYW5jZSAqIG1hdGVyaWFsLmNsZWFyY29hdCAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIHZlYzMoIDEuMCApLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTtcblx0I2Vsc2Vcblx0XHRmbG9hdCBjbGVhcmNvYXRESFIgPSAwLjA7XG5cdCNlbmRpZlxuXHQjaWZkZWYgVVNFX1NIRUVOXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gKCAxLjAgLSBjbGVhcmNvYXRESFIgKSAqIGlycmFkaWFuY2UgKiBCUkRGX1NwZWN1bGFyX1NoZWVuKFxuXHRcdFx0bWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MsXG5cdFx0XHRkaXJlY3RMaWdodC5kaXJlY3Rpb24sXG5cdFx0XHRnZW9tZXRyeSxcblx0XHRcdG1hdGVyaWFsLnNoZWVuQ29sb3Jcblx0XHQpO1xuXHQjZWxzZVxuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9ICggMS4wIC0gY2xlYXJjb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9HR1goIGRpcmVjdExpZ2h0LCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5ub3JtYWwsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3JGOTAsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzKTtcblx0I2VuZGlmXG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gKCAxLjAgLSBjbGVhcmNvYXRESFIgKSAqIGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG59XG52b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG59XG52b2lkIFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgcmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBjbGVhcmNvYXRSYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQpIHtcblx0I2lmZGVmIENMRUFSQ09BVFxuXHRcdGZsb2F0IGNjRG90TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIgKSApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gY2xlYXJjb2F0UmFkaWFuY2UgKiBtYXRlcmlhbC5jbGVhcmNvYXQgKiBCUkRGX1NwZWN1bGFyX0dHWF9FbnZpcm9ubWVudCggZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyApO1xuXHRcdGZsb2F0IGNjRG90TkwgPSBjY0RvdE5WO1xuXHRcdGZsb2F0IGNsZWFyY29hdERIUiA9IG1hdGVyaWFsLmNsZWFyY29hdCAqIGNsZWFyY29hdERIUkFwcHJveCggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCBjY0RvdE5MICk7XG5cdCNlbHNlXG5cdFx0ZmxvYXQgY2xlYXJjb2F0REhSID0gMC4wO1xuXHQjZW5kaWZcblx0ZmxvYXQgY2xlYXJjb2F0SW52ID0gMS4wIC0gY2xlYXJjb2F0REhSO1xuXHR2ZWMzIHNpbmdsZVNjYXR0ZXJpbmcgPSB2ZWMzKCAwLjAgKTtcblx0dmVjMyBtdWx0aVNjYXR0ZXJpbmcgPSB2ZWMzKCAwLjAgKTtcblx0dmVjMyBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2UgPSBpcnJhZGlhbmNlICogUkVDSVBST0NBTF9QSTtcblx0QlJERl9TcGVjdWxhcl9NdWx0aXNjYXR0ZXJpbmdfRW52aXJvbm1lbnQoIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcywgc2luZ2xlU2NhdHRlcmluZywgbXVsdGlTY2F0dGVyaW5nICk7XG5cdHZlYzMgZGlmZnVzZSA9IG1hdGVyaWFsLmRpZmZ1c2VDb2xvciAqICggMS4wIC0gKCBzaW5nbGVTY2F0dGVyaW5nICsgbXVsdGlTY2F0dGVyaW5nICkgKTtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArPSBjbGVhcmNvYXRJbnYgKiByYWRpYW5jZSAqIHNpbmdsZVNjYXR0ZXJpbmc7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gbXVsdGlTY2F0dGVyaW5nICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlO1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gZGlmZnVzZSAqIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZTtcbn1cbiNkZWZpbmUgUkVfRGlyZWN0XHRcdFx0XHRSRV9EaXJlY3RfUGh5c2ljYWxcbiNkZWZpbmUgUkVfRGlyZWN0X1JlY3RBcmVhXHRcdFJFX0RpcmVjdF9SZWN0QXJlYV9QaHlzaWNhbFxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcdFx0UkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsXG4jZGVmaW5lIFJFX0luZGlyZWN0U3BlY3VsYXJcdFx0UkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbFxuZmxvYXQgY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgYW1iaWVudE9jY2x1c2lvbiwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRyZXR1cm4gc2F0dXJhdGUoIHBvdyggZG90TlYgKyBhbWJpZW50T2NjbHVzaW9uLCBleHAyKCAtIDE2LjAgKiByb3VnaG5lc3MgLSAxLjAgKSApIC0gMS4wICsgYW1iaWVudE9jY2x1c2lvbiApO1xufSIsbGlnaHRzX2ZyYWdtZW50X2JlZ2luOiJcbkdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnk7XG5nZW9tZXRyeS5wb3NpdGlvbiA9IC0gdlZpZXdQb3NpdGlvbjtcbmdlb21ldHJ5Lm5vcm1hbCA9IG5vcm1hbDtcbmdlb21ldHJ5LnZpZXdEaXIgPSAoIGlzT3J0aG9ncmFwaGljICkgPyB2ZWMzKCAwLCAwLCAxICkgOiBub3JtYWxpemUoIHZWaWV3UG9zaXRpb24gKTtcbiNpZmRlZiBDTEVBUkNPQVRcblx0Z2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsID0gY2xlYXJjb2F0Tm9ybWFsO1xuI2VuZGlmXG5JbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0O1xuI2lmICggTlVNX1BPSU5UX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxuXHRQb2ludExpZ2h0IHBvaW50TGlnaHQ7XG5cdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwXG5cdFBvaW50TGlnaHRTaGFkb3cgcG9pbnRMaWdodFNoYWRvdztcblx0I2VuZGlmXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcblx0XHRwb2ludExpZ2h0ID0gcG9pbnRMaWdodHNbIGkgXTtcblx0XHRnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggcG9pbnRMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyApXG5cdFx0cG9pbnRMaWdodFNoYWRvdyA9IHBvaW50TGlnaHRTaGFkb3dzWyBpIF07XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggZGlyZWN0TGlnaHQudmlzaWJsZSwgcmVjZWl2ZVNoYWRvdyApICkgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd0JpYXMsIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7XG5cdFx0I2VuZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG4jZW5kaWZcbiNpZiAoIE5VTV9TUE9UX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxuXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xuXHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwXG5cdFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHRTaGFkb3c7XG5cdCNlbmRpZlxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHRzcG90TGlnaHQgPSBzcG90TGlnaHRzWyBpIF07XG5cdFx0Z2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggc3BvdExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKVxuXHRcdHNwb3RMaWdodFNoYWRvdyA9IHNwb3RMaWdodFNoYWRvd3NbIGkgXTtcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqPSBhbGwoIGJ2ZWMyKCBkaXJlY3RMaWdodC52aXNpYmxlLCByZWNlaXZlU2hhZG93ICkgKSA/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBzcG90TGlnaHRTaGFkb3cuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0U2hhZG93LnNoYWRvd0JpYXMsIHNwb3RMaWdodFNoYWRvdy5zaGFkb3dSYWRpdXMsIHZTcG90U2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xuXHRcdCNlbmRpZlxuXHRcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcblx0fVxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuI2VuZGlmXG4jaWYgKCBOVU1fRElSX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxuXHREaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQ7XG5cdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMFxuXHREaXJlY3Rpb25hbExpZ2h0U2hhZG93IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3c7XG5cdCNlbmRpZlxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xuXHRcdGRpcmVjdGlvbmFsTGlnaHQgPSBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdO1xuXHRcdGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBkaXJlY3Rpb25hbExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9ESVJfTElHSFRfU0hBRE9XUyApXG5cdFx0ZGlyZWN0aW9uYWxMaWdodFNoYWRvdyA9IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzWyBpIF07XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggZGlyZWN0TGlnaHQudmlzaWJsZSwgcmVjZWl2ZVNoYWRvdyApICkgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3cuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodFNoYWRvdy5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xuXHRcdCNlbmRpZlxuXHRcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcblx0fVxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuI2VuZGlmXG4jaWYgKCBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3RfUmVjdEFyZWEgKVxuXHRSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1JFQ1RfQVJFQV9MSUdIVFM7IGkgKysgKSB7XG5cdFx0cmVjdEFyZWFMaWdodCA9IHJlY3RBcmVhTGlnaHRzWyBpIF07XG5cdFx0UkVfRGlyZWN0X1JlY3RBcmVhKCByZWN0QXJlYUxpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXG5cdHZlYzMgaWJsSXJyYWRpYW5jZSA9IHZlYzMoIDAuMCApO1xuXHR2ZWMzIGlycmFkaWFuY2UgPSBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xuXHRpcnJhZGlhbmNlICs9IGdldExpZ2h0UHJvYmVJcnJhZGlhbmNlKCBsaWdodFByb2JlLCBnZW9tZXRyeSApO1xuXHQjaWYgKCBOVU1fSEVNSV9MSUdIVFMgPiAwIClcblx0XHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xuXHRcdFx0aXJyYWRpYW5jZSArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5ICk7XG5cdFx0fVxuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG5cdCNlbmRpZlxuI2VuZGlmXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXG5cdHZlYzMgcmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTtcblx0dmVjMyBjbGVhcmNvYXRSYWRpYW5jZSA9IHZlYzMoIDAuMCApO1xuI2VuZGlmIixsaWdodHNfZnJhZ21lbnRfbWFwczoiI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXG5cdCNpZmRlZiBVU0VfTElHSFRNQVBcblx0XHR2ZWM0IGxpZ2h0TWFwVGV4ZWw9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKTtcblx0XHR2ZWMzIGxpZ2h0TWFwSXJyYWRpYW5jZSA9IGxpZ2h0TWFwVGV4ZWxUb0xpbmVhciggbGlnaHRNYXBUZXhlbCApLnJnYiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xuXHRcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdFx0bGlnaHRNYXBJcnJhZGlhbmNlICo9IFBJO1xuXHRcdCNlbmRpZlxuXHRcdGlycmFkaWFuY2UgKz0gbGlnaHRNYXBJcnJhZGlhbmNlO1xuXHQjZW5kaWZcblx0I2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBTVEFOREFSRCApICYmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxuXHRcdGlibElycmFkaWFuY2UgKz0gZ2V0TGlnaHRQcm9iZUluZGlyZWN0SXJyYWRpYW5jZSggZ2VvbWV0cnksIG1heE1pcExldmVsICk7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxuXHRyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcywgbWF4TWlwTGV2ZWwgKTtcblx0I2lmZGVmIENMRUFSQ09BVFxuXHRcdGNsZWFyY29hdFJhZGlhbmNlICs9IGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgbWF4TWlwTGV2ZWwgKTtcblx0I2VuZGlmXG4jZW5kaWYiLGxpZ2h0c19mcmFnbWVudF9lbmQ6IiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHRSRV9JbmRpcmVjdERpZmZ1c2UoIGlycmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxuXHRSRV9JbmRpcmVjdFNwZWN1bGFyKCByYWRpYW5jZSwgaWJsSXJyYWRpYW5jZSwgY2xlYXJjb2F0UmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcbiNlbmRpZiIsbG9nZGVwdGhidWZfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUYgKSAmJiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUZfRVhUIClcblx0Z2xfRnJhZ0RlcHRoRVhUID0gdklzUGVyc3BlY3RpdmUgPT0gMC4wID8gZ2xfRnJhZ0Nvb3JkLnogOiBsb2cyKCB2RnJhZ0RlcHRoICkgKiBsb2dEZXB0aEJ1ZkZDICogMC41O1xuI2VuZGlmIixsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGICkgJiYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGX0VYVCApXG5cdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcblx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xuXHR2YXJ5aW5nIGZsb2F0IHZJc1BlcnNwZWN0aXZlO1xuI2VuZGlmIixsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxuXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxuXHRcdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDtcblx0XHR2YXJ5aW5nIGZsb2F0IHZJc1BlcnNwZWN0aXZlO1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcblx0I2VuZGlmXG4jZW5kaWYiLGxvZ2RlcHRoYnVmX3ZlcnRleDoiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxuXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxuXHRcdHZGcmFnRGVwdGggPSAxLjAgKyBnbF9Qb3NpdGlvbi53O1xuXHRcdHZJc1BlcnNwZWN0aXZlID0gZmxvYXQoIGlzUGVyc3BlY3RpdmVNYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKSApO1xuXHQjZWxzZVxuXHRcdGlmICggaXNQZXJzcGVjdGl2ZU1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApICkge1xuXHRcdFx0Z2xfUG9zaXRpb24ueiA9IGxvZzIoIG1heCggRVBTSUxPTiwgZ2xfUG9zaXRpb24udyArIDEuMCApICkgKiBsb2dEZXB0aEJ1ZkZDIC0gMS4wO1xuXHRcdFx0Z2xfUG9zaXRpb24ueiAqPSBnbF9Qb3NpdGlvbi53O1xuXHRcdH1cblx0I2VuZGlmXG4jZW5kaWYiLG1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dmVjNCB0ZXhlbENvbG9yID0gdGV4dHVyZTJEKCBtYXAsIHZVdiApO1xuXHR0ZXhlbENvbG9yID0gbWFwVGV4ZWxUb0xpbmVhciggdGV4ZWxDb2xvciApO1xuXHRkaWZmdXNlQ29sb3IgKj0gdGV4ZWxDb2xvcjtcbiNlbmRpZiIsbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIG1hcDtcbiNlbmRpZiIsbWFwX3BhcnRpY2xlX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApXG5cdHZlYzIgdXYgPSAoIHV2VHJhbnNmb3JtICogdmVjMyggZ2xfUG9pbnRDb29yZC54LCAxLjAgLSBnbF9Qb2ludENvb3JkLnksIDEgKSApLnh5O1xuI2VuZGlmXG4jaWZkZWYgVVNFX01BUFxuXHR2ZWM0IG1hcFRleGVsID0gdGV4dHVyZTJEKCBtYXAsIHV2ICk7XG5cdGRpZmZ1c2VDb2xvciAqPSBtYXBUZXhlbFRvTGluZWFyKCBtYXBUZXhlbCApO1xuI2VuZGlmXG4jaWZkZWYgVVNFX0FMUEhBTUFQXG5cdGRpZmZ1c2VDb2xvci5hICo9IHRleHR1cmUyRCggYWxwaGFNYXAsIHV2ICkuZztcbiNlbmRpZiIsbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQIClcblx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xuI2VuZGlmXG4jaWZkZWYgVVNFX01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XG4jZW5kaWZcbiNpZmRlZiBVU0VfQUxQSEFNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgYWxwaGFNYXA7XG4jZW5kaWYiLG1ldGFsbmVzc21hcF9mcmFnbWVudDoiZmxvYXQgbWV0YWxuZXNzRmFjdG9yID0gbWV0YWxuZXNzO1xuI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcblx0dmVjNCB0ZXhlbE1ldGFsbmVzcyA9IHRleHR1cmUyRCggbWV0YWxuZXNzTWFwLCB2VXYgKTtcblx0bWV0YWxuZXNzRmFjdG9yICo9IHRleGVsTWV0YWxuZXNzLmI7XG4jZW5kaWYiLG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX01FVEFMTkVTU01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBtZXRhbG5lc3NNYXA7XG4jZW5kaWYiLG1vcnBobm9ybWFsX3ZlcnRleDoiI2lmZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0b2JqZWN0Tm9ybWFsICo9IG1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZTtcblx0b2JqZWN0Tm9ybWFsICs9IG1vcnBoTm9ybWFsMCAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xuXHRvYmplY3ROb3JtYWwgKz0gbW9ycGhOb3JtYWwxICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAxIF07XG5cdG9iamVjdE5vcm1hbCArPSBtb3JwaE5vcm1hbDIgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcblx0b2JqZWN0Tm9ybWFsICs9IG1vcnBoTm9ybWFsMyAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMyBdO1xuI2VuZGlmIixtb3JwaHRhcmdldF9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcblx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7XG5cdCNpZm5kZWYgVVNFX01PUlBITk9STUFMU1xuXHRcdHVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA4IF07XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcblx0I2VuZGlmXG4jZW5kaWYiLG1vcnBodGFyZ2V0X3ZlcnRleDoiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcblx0dHJhbnNmb3JtZWQgKj0gbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlO1xuXHR0cmFuc2Zvcm1lZCArPSBtb3JwaFRhcmdldDAgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTtcblx0dHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQxICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAxIF07XG5cdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0MiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMiBdO1xuXHR0cmFuc2Zvcm1lZCArPSBtb3JwaFRhcmdldDMgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDMgXTtcblx0I2lmbmRlZiBVU0VfTU9SUEhOT1JNQUxTXG5cdFx0dHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQ0ICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA0IF07XG5cdFx0dHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQ1ICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA1IF07XG5cdFx0dHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQ2ICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA2IF07XG5cdFx0dHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQ3ICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA3IF07XG5cdCNlbmRpZlxuI2VuZGlmIixub3JtYWxfZnJhZ21lbnRfYmVnaW46ImZsb2F0IGZhY2VEaXJlY3Rpb24gPSBnbF9Gcm9udEZhY2luZyA/IDEuMCA6IC0gMS4wO1xuI2lmZGVmIEZMQVRfU0hBREVEXG5cdHZlYzMgZmR4ID0gdmVjMyggZEZkeCggdlZpZXdQb3NpdGlvbi54ICksIGRGZHgoIHZWaWV3UG9zaXRpb24ueSApLCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnogKSApO1xuXHR2ZWMzIGZkeSA9IHZlYzMoIGRGZHkoIHZWaWV3UG9zaXRpb24ueCApLCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnkgKSwgZEZkeSggdlZpZXdQb3NpdGlvbi56ICkgKTtcblx0dmVjMyBub3JtYWwgPSBub3JtYWxpemUoIGNyb3NzKCBmZHgsIGZkeSApICk7XG4jZWxzZVxuXHR2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSggdk5vcm1hbCApO1xuXHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0bm9ybWFsID0gbm9ybWFsICogZmFjZURpcmVjdGlvbjtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZlYzMgdGFuZ2VudCA9IG5vcm1hbGl6ZSggdlRhbmdlbnQgKTtcblx0XHR2ZWMzIGJpdGFuZ2VudCA9IG5vcm1hbGl6ZSggdkJpdGFuZ2VudCApO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHRhbmdlbnQgPSB0YW5nZW50ICogZmFjZURpcmVjdGlvbjtcblx0XHRcdGJpdGFuZ2VudCA9IGJpdGFuZ2VudCAqIGZhY2VEaXJlY3Rpb247XG5cdFx0I2VuZGlmXG5cdFx0I2lmIGRlZmluZWQoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCApXG5cdFx0XHRtYXQzIHZUQk4gPSBtYXQzKCB0YW5nZW50LCBiaXRhbmdlbnQsIG5vcm1hbCApO1xuXHRcdCNlbmRpZlxuXHQjZW5kaWZcbiNlbmRpZlxudmVjMyBnZW9tZXRyeU5vcm1hbCA9IG5vcm1hbDsiLG5vcm1hbF9mcmFnbWVudF9tYXBzOiIjaWZkZWYgT0JKRUNUU1BBQ0VfTk9STUFMTUFQXG5cdG5vcm1hbCA9IHRleHR1cmUyRCggbm9ybWFsTWFwLCB2VXYgKS54eXogKiAyLjAgLSAxLjA7XG5cdCNpZmRlZiBGTElQX1NJREVEXG5cdFx0bm9ybWFsID0gLSBub3JtYWw7XG5cdCNlbmRpZlxuXHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0bm9ybWFsID0gbm9ybWFsICogZmFjZURpcmVjdGlvbjtcblx0I2VuZGlmXG5cdG5vcm1hbCA9IG5vcm1hbGl6ZSggbm9ybWFsTWF0cml4ICogbm9ybWFsICk7XG4jZWxpZiBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0dmVjMyBtYXBOID0gdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcblx0bWFwTi54eSAqPSBub3JtYWxTY2FsZTtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0bm9ybWFsID0gbm9ybWFsaXplKCB2VEJOICogbWFwTiApO1xuXHQjZWxzZVxuXHRcdG5vcm1hbCA9IHBlcnR1cmJOb3JtYWwyQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBtYXBOLCBmYWNlRGlyZWN0aW9uICk7XG5cdCNlbmRpZlxuI2VsaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKVxuXHRub3JtYWwgPSBwZXJ0dXJiTm9ybWFsQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBkSGR4eV9md2QoKSwgZmFjZURpcmVjdGlvbiApO1xuI2VuZGlmIixub3JtYWxtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9OT1JNQUxNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbm9ybWFsTWFwO1xuXHR1bmlmb3JtIHZlYzIgbm9ybWFsU2NhbGU7XG4jZW5kaWZcbiNpZmRlZiBPQkpFQ1RTUEFDRV9OT1JNQUxNQVBcblx0dW5pZm9ybSBtYXQzIG5vcm1hbE1hdHJpeDtcbiNlbmRpZlxuI2lmICEgZGVmaW5lZCAoIFVTRV9UQU5HRU5UICkgJiYgKCBkZWZpbmVkICggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQgKCBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCApIClcblx0dmVjMyBwZXJ0dXJiTm9ybWFsMkFyYiggdmVjMyBleWVfcG9zLCB2ZWMzIHN1cmZfbm9ybSwgdmVjMyBtYXBOLCBmbG9hdCBmYWNlRGlyZWN0aW9uICkge1xuXHRcdHZlYzMgcTAgPSB2ZWMzKCBkRmR4KCBleWVfcG9zLnggKSwgZEZkeCggZXllX3Bvcy55ICksIGRGZHgoIGV5ZV9wb3MueiApICk7XG5cdFx0dmVjMyBxMSA9IHZlYzMoIGRGZHkoIGV5ZV9wb3MueCApLCBkRmR5KCBleWVfcG9zLnkgKSwgZEZkeSggZXllX3Bvcy56ICkgKTtcblx0XHR2ZWMyIHN0MCA9IGRGZHgoIHZVdi5zdCApO1xuXHRcdHZlYzIgc3QxID0gZEZkeSggdlV2LnN0ICk7XG5cdFx0dmVjMyBOID0gc3VyZl9ub3JtO1xuXHRcdHZlYzMgcTFwZXJwID0gY3Jvc3MoIHExLCBOICk7XG5cdFx0dmVjMyBxMHBlcnAgPSBjcm9zcyggTiwgcTAgKTtcblx0XHR2ZWMzIFQgPSBxMXBlcnAgKiBzdDAueCArIHEwcGVycCAqIHN0MS54O1xuXHRcdHZlYzMgQiA9IHExcGVycCAqIHN0MC55ICsgcTBwZXJwICogc3QxLnk7XG5cdFx0ZmxvYXQgZGV0ID0gbWF4KCBkb3QoIFQsIFQgKSwgZG90KCBCLCBCICkgKTtcblx0XHRmbG9hdCBzY2FsZSA9ICggZGV0ID09IDAuMCApID8gMC4wIDogZmFjZURpcmVjdGlvbiAqIGludmVyc2VzcXJ0KCBkZXQgKTtcblx0XHRyZXR1cm4gbm9ybWFsaXplKCBUICogKCBtYXBOLnggKiBzY2FsZSApICsgQiAqICggbWFwTi55ICogc2NhbGUgKSArIE4gKiBtYXBOLnogKTtcblx0fVxuI2VuZGlmIixjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luOiIjaWZkZWYgQ0xFQVJDT0FUXG5cdHZlYzMgY2xlYXJjb2F0Tm9ybWFsID0gZ2VvbWV0cnlOb3JtYWw7XG4jZW5kaWYiLGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwczoiI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQXG5cdHZlYzMgY2xlYXJjb2F0TWFwTiA9IHRleHR1cmUyRCggY2xlYXJjb2F0Tm9ybWFsTWFwLCB2VXYgKS54eXogKiAyLjAgLSAxLjA7XG5cdGNsZWFyY29hdE1hcE4ueHkgKj0gY2xlYXJjb2F0Tm9ybWFsU2NhbGU7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdGNsZWFyY29hdE5vcm1hbCA9IG5vcm1hbGl6ZSggdlRCTiAqIGNsZWFyY29hdE1hcE4gKTtcblx0I2Vsc2Vcblx0XHRjbGVhcmNvYXROb3JtYWwgPSBwZXJ0dXJiTm9ybWFsMkFyYiggLSB2Vmlld1Bvc2l0aW9uLCBjbGVhcmNvYXROb3JtYWwsIGNsZWFyY29hdE1hcE4sIGZhY2VEaXJlY3Rpb24gKTtcblx0I2VuZGlmXG4jZW5kaWYiLGNsZWFyY29hdF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0NMRUFSQ09BVE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXRNYXA7XG4jZW5kaWZcbiNpZmRlZiBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXRSb3VnaG5lc3NNYXA7XG4jZW5kaWZcbiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXROb3JtYWxNYXA7XG5cdHVuaWZvcm0gdmVjMiBjbGVhcmNvYXROb3JtYWxTY2FsZTtcbiNlbmRpZiIscGFja2luZzoidmVjMyBwYWNrTm9ybWFsVG9SR0IoIGNvbnN0IGluIHZlYzMgbm9ybWFsICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCBub3JtYWwgKSAqIDAuNSArIDAuNTtcbn1cbnZlYzMgdW5wYWNrUkdCVG9Ob3JtYWwoIGNvbnN0IGluIHZlYzMgcmdiICkge1xuXHRyZXR1cm4gMi4wICogcmdiLnh5eiAtIDEuMDtcbn1cbmNvbnN0IGZsb2F0IFBhY2tVcHNjYWxlID0gMjU2LiAvIDI1NS47Y29uc3QgZmxvYXQgVW5wYWNrRG93bnNjYWxlID0gMjU1LiAvIDI1Ni47XG5jb25zdCB2ZWMzIFBhY2tGYWN0b3JzID0gdmVjMyggMjU2LiAqIDI1Ni4gKiAyNTYuLCAyNTYuICogMjU2LiwgMjU2LiApO1xuY29uc3QgdmVjNCBVbnBhY2tGYWN0b3JzID0gVW5wYWNrRG93bnNjYWxlIC8gdmVjNCggUGFja0ZhY3RvcnMsIDEuICk7XG5jb25zdCBmbG9hdCBTaGlmdFJpZ2h0OCA9IDEuIC8gMjU2LjtcbnZlYzQgcGFja0RlcHRoVG9SR0JBKCBjb25zdCBpbiBmbG9hdCB2ICkge1xuXHR2ZWM0IHIgPSB2ZWM0KCBmcmFjdCggdiAqIFBhY2tGYWN0b3JzICksIHYgKTtcblx0ci55encgLT0gci54eXogKiBTaGlmdFJpZ2h0ODtcdHJldHVybiByICogUGFja1Vwc2NhbGU7XG59XG5mbG9hdCB1bnBhY2tSR0JBVG9EZXB0aCggY29uc3QgaW4gdmVjNCB2ICkge1xuXHRyZXR1cm4gZG90KCB2LCBVbnBhY2tGYWN0b3JzICk7XG59XG52ZWM0IHBhY2sySGFsZlRvUkdCQSggdmVjMiB2ICkge1xuXHR2ZWM0IHIgPSB2ZWM0KCB2LngsIGZyYWN0KCB2LnggKiAyNTUuMCApLCB2LnksIGZyYWN0KCB2LnkgKiAyNTUuMCApKTtcblx0cmV0dXJuIHZlYzQoIHIueCAtIHIueSAvIDI1NS4wLCByLnksIHIueiAtIHIudyAvIDI1NS4wLCByLncpO1xufVxudmVjMiB1bnBhY2tSR0JBVG8ySGFsZiggdmVjNCB2ICkge1xuXHRyZXR1cm4gdmVjMiggdi54ICsgKCB2LnkgLyAyNTUuMCApLCB2LnogKyAoIHYudyAvIDI1NS4wICkgKTtcbn1cbmZsb2F0IHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuICggdmlld1ogKyBuZWFyICkgLyAoIG5lYXIgLSBmYXIgKTtcbn1cbmZsb2F0IG9ydGhvZ3JhcGhpY0RlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgbGluZWFyQ2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuIGxpbmVhckNsaXBaICogKCBuZWFyIC0gZmFyICkgLSBuZWFyO1xufVxuZmxvYXQgdmlld1pUb1BlcnNwZWN0aXZlRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiAoKCBuZWFyICsgdmlld1ogKSAqIGZhciApIC8gKCggZmFyIC0gbmVhciApICogdmlld1ogKTtcbn1cbmZsb2F0IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBpbnZDbGlwWiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xuXHRyZXR1cm4gKCBuZWFyICogZmFyICkgLyAoICggZmFyIC0gbmVhciApICogaW52Q2xpcFogLSBmYXIgKTtcbn0iLHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ6IiNpZmRlZiBQUkVNVUxUSVBMSUVEX0FMUEhBXG5cdGdsX0ZyYWdDb2xvci5yZ2IgKj0gZ2xfRnJhZ0NvbG9yLmE7XG4jZW5kaWYiLHByb2plY3RfdmVydGV4OiJ2ZWM0IG12UG9zaXRpb24gPSB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XG4jaWZkZWYgVVNFX0lOU1RBTkNJTkdcblx0bXZQb3NpdGlvbiA9IGluc3RhbmNlTWF0cml4ICogbXZQb3NpdGlvbjtcbiNlbmRpZlxubXZQb3NpdGlvbiA9IG1vZGVsVmlld01hdHJpeCAqIG12UG9zaXRpb247XG5nbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uOyIsZGl0aGVyaW5nX2ZyYWdtZW50OiIjaWZkZWYgRElUSEVSSU5HXG5cdGdsX0ZyYWdDb2xvci5yZ2IgPSBkaXRoZXJpbmcoIGdsX0ZyYWdDb2xvci5yZ2IgKTtcbiNlbmRpZiIsZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBESVRIRVJJTkdcblx0dmVjMyBkaXRoZXJpbmcoIHZlYzMgY29sb3IgKSB7XG5cdFx0ZmxvYXQgZ3JpZF9wb3NpdGlvbiA9IHJhbmQoIGdsX0ZyYWdDb29yZC54eSApO1xuXHRcdHZlYzMgZGl0aGVyX3NoaWZ0X1JHQiA9IHZlYzMoIDAuMjUgLyAyNTUuMCwgLTAuMjUgLyAyNTUuMCwgMC4yNSAvIDI1NS4wICk7XG5cdFx0ZGl0aGVyX3NoaWZ0X1JHQiA9IG1peCggMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgLTIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIGdyaWRfcG9zaXRpb24gKTtcblx0XHRyZXR1cm4gY29sb3IgKyBkaXRoZXJfc2hpZnRfUkdCO1xuXHR9XG4jZW5kaWYiLHJvdWdobmVzc21hcF9mcmFnbWVudDoiZmxvYXQgcm91Z2huZXNzRmFjdG9yID0gcm91Z2huZXNzO1xuI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcblx0dmVjNCB0ZXhlbFJvdWdobmVzcyA9IHRleHR1cmUyRCggcm91Z2huZXNzTWFwLCB2VXYgKTtcblx0cm91Z2huZXNzRmFjdG9yICo9IHRleGVsUm91Z2huZXNzLmc7XG4jZW5kaWYiLHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1JPVUdITkVTU01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCByb3VnaG5lc3NNYXA7XG4jZW5kaWYiLHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMFxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0U2hhZG93IHtcblx0XHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0XHRmbG9hdCBzaGFkb3dOb3JtYWxCaWFzO1xuXHRcdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHRcdH07XG5cdFx0dW5pZm9ybSBEaXJlY3Rpb25hbExpZ2h0U2hhZG93IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMFxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIHNwb3RTaGFkb3dNYXBbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlNwb3RTaGFkb3dDb29yZFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHN0cnVjdCBTcG90TGlnaHRTaGFkb3cge1xuXHRcdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRcdGZsb2F0IHNoYWRvd05vcm1hbEJpYXM7XG5cdFx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0XHR2ZWMyIHNoYWRvd01hcFNpemU7XG5cdFx0fTtcblx0XHR1bmlmb3JtIFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHRTaGFkb3dzWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgcG9pbnRTaGFkb3dNYXBbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHN0cnVjdCBQb2ludExpZ2h0U2hhZG93IHtcblx0XHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0XHRmbG9hdCBzaGFkb3dOb3JtYWxCaWFzO1xuXHRcdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHRcdFx0ZmxvYXQgc2hhZG93Q2FtZXJhTmVhcjtcblx0XHRcdGZsb2F0IHNoYWRvd0NhbWVyYUZhcjtcblx0XHR9O1xuXHRcdHVuaWZvcm0gUG9pbnRMaWdodFNoYWRvdyBwb2ludExpZ2h0U2hhZG93c1sgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG5cdGZsb2F0IHRleHR1cmUyRENvbXBhcmUoIHNhbXBsZXIyRCBkZXB0aHMsIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKSB7XG5cdFx0cmV0dXJuIHN0ZXAoIGNvbXBhcmUsIHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIGRlcHRocywgdXYgKSApICk7XG5cdH1cblx0dmVjMiB0ZXh0dXJlMkREaXN0cmlidXRpb24oIHNhbXBsZXIyRCBzaGFkb3csIHZlYzIgdXYgKSB7XG5cdFx0cmV0dXJuIHVucGFja1JHQkFUbzJIYWxmKCB0ZXh0dXJlMkQoIHNoYWRvdywgdXYgKSApO1xuXHR9XG5cdGZsb2F0IFZTTVNoYWRvdyAoc2FtcGxlcjJEIHNoYWRvdywgdmVjMiB1diwgZmxvYXQgY29tcGFyZSApe1xuXHRcdGZsb2F0IG9jY2x1c2lvbiA9IDEuMDtcblx0XHR2ZWMyIGRpc3RyaWJ1dGlvbiA9IHRleHR1cmUyRERpc3RyaWJ1dGlvbiggc2hhZG93LCB1diApO1xuXHRcdGZsb2F0IGhhcmRfc2hhZG93ID0gc3RlcCggY29tcGFyZSAsIGRpc3RyaWJ1dGlvbi54ICk7XG5cdFx0aWYgKGhhcmRfc2hhZG93ICE9IDEuMCApIHtcblx0XHRcdGZsb2F0IGRpc3RhbmNlID0gY29tcGFyZSAtIGRpc3RyaWJ1dGlvbi54IDtcblx0XHRcdGZsb2F0IHZhcmlhbmNlID0gbWF4KCAwLjAwMDAwLCBkaXN0cmlidXRpb24ueSAqIGRpc3RyaWJ1dGlvbi55ICk7XG5cdFx0XHRmbG9hdCBzb2Z0bmVzc19wcm9iYWJpbGl0eSA9IHZhcmlhbmNlIC8gKHZhcmlhbmNlICsgZGlzdGFuY2UgKiBkaXN0YW5jZSApO1x0XHRcdHNvZnRuZXNzX3Byb2JhYmlsaXR5ID0gY2xhbXAoICggc29mdG5lc3NfcHJvYmFiaWxpdHkgLSAwLjMgKSAvICggMC45NSAtIDAuMyApLCAwLjAsIDEuMCApO1x0XHRcdG9jY2x1c2lvbiA9IGNsYW1wKCBtYXgoIGhhcmRfc2hhZG93LCBzb2Z0bmVzc19wcm9iYWJpbGl0eSApLCAwLjAsIDEuMCApO1xuXHRcdH1cblx0XHRyZXR1cm4gb2NjbHVzaW9uO1xuXHR9XG5cdGZsb2F0IGdldFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQgKSB7XG5cdFx0ZmxvYXQgc2hhZG93ID0gMS4wO1xuXHRcdHNoYWRvd0Nvb3JkLnh5eiAvPSBzaGFkb3dDb29yZC53O1xuXHRcdHNoYWRvd0Nvb3JkLnogKz0gc2hhZG93Qmlhcztcblx0XHRidmVjNCBpbkZydXN0dW1WZWMgPSBidmVjNCAoIHNoYWRvd0Nvb3JkLnggPj0gMC4wLCBzaGFkb3dDb29yZC54IDw9IDEuMCwgc2hhZG93Q29vcmQueSA+PSAwLjAsIHNoYWRvd0Nvb3JkLnkgPD0gMS4wICk7XG5cdFx0Ym9vbCBpbkZydXN0dW0gPSBhbGwoIGluRnJ1c3R1bVZlYyApO1xuXHRcdGJ2ZWMyIGZydXN0dW1UZXN0VmVjID0gYnZlYzIoIGluRnJ1c3R1bSwgc2hhZG93Q29vcmQueiA8PSAxLjAgKTtcblx0XHRib29sIGZydXN0dW1UZXN0ID0gYWxsKCBmcnVzdHVtVGVzdFZlYyApO1xuXHRcdGlmICggZnJ1c3R1bVRlc3QgKSB7XG5cdFx0I2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApXG5cdFx0XHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcblx0XHRcdGZsb2F0IGR4MCA9IC0gdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTAgPSAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHgxID0gKyB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR5MSA9ICsgdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeDIgPSBkeDAgLyAyLjA7XG5cdFx0XHRmbG9hdCBkeTIgPSBkeTAgLyAyLjA7XG5cdFx0XHRmbG9hdCBkeDMgPSBkeDEgLyAyLjA7XG5cdFx0XHRmbG9hdCBkeTMgPSBkeTEgLyAyLjA7XG5cdFx0XHRzaGFkb3cgPSAoXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDIsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MSApLCBzaGFkb3dDb29yZC56IClcblx0XHRcdCkgKiAoIDEuMCAvIDE3LjAgKTtcblx0XHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApXG5cdFx0XHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcblx0XHRcdGZsb2F0IGR4ID0gdGV4ZWxTaXplLng7XG5cdFx0XHRmbG9hdCBkeSA9IHRleGVsU2l6ZS55O1xuXHRcdFx0dmVjMiB1diA9IHNoYWRvd0Nvb3JkLnh5O1xuXHRcdFx0dmVjMiBmID0gZnJhY3QoIHV2ICogc2hhZG93TWFwU2l6ZSArIDAuNSApO1xuXHRcdFx0dXYgLT0gZiAqIHRleGVsU2l6ZTtcblx0XHRcdHNoYWRvdyA9IChcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIGR4LCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDAuMCwgZHkgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHRleGVsU2l6ZSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0bWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCAwLjAgKSwgc2hhZG93Q29vcmQueiApLCBcblx0XHRcdFx0XHQgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCAwLjAgKSwgc2hhZG93Q29vcmQueiApLFxuXHRcdFx0XHRcdCBmLnggKSArXG5cdFx0XHRcdG1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIC1keCwgZHkgKSwgc2hhZG93Q29vcmQueiApLCBcblx0XHRcdFx0XHQgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCBkeSApLCBzaGFkb3dDb29yZC56ICksXG5cdFx0XHRcdFx0IGYueCApICtcblx0XHRcdFx0bWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMC4wLCAtZHkgKSwgc2hhZG93Q29vcmQueiApLCBcblx0XHRcdFx0XHQgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDAuMCwgMi4wICogZHkgKSwgc2hhZG93Q29vcmQueiApLFxuXHRcdFx0XHRcdCBmLnkgKSArXG5cdFx0XHRcdG1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIGR4LCAtZHkgKSwgc2hhZG93Q29vcmQueiApLCBcblx0XHRcdFx0XHQgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIGR4LCAyLjAgKiBkeSApLCBzaGFkb3dDb29yZC56ICksXG5cdFx0XHRcdFx0IGYueSApICtcblx0XHRcdFx0bWl4KCBtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIC1keSApLCBzaGFkb3dDb29yZC56ICksIFxuXHRcdFx0XHRcdFx0ICB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIC1keSApLCBzaGFkb3dDb29yZC56ICksXG5cdFx0XHRcdFx0XHQgIGYueCApLFxuXHRcdFx0XHRcdCBtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwgXG5cdFx0XHRcdFx0XHQgIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAyLjAgKiBkeCwgMi4wICogZHkgKSwgc2hhZG93Q29vcmQueiApLFxuXHRcdFx0XHRcdFx0ICBmLnggKSxcblx0XHRcdFx0XHQgZi55IClcblx0XHRcdCkgKiAoIDEuMCAvIDkuMCApO1xuXHRcdCNlbGlmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1ZTTSApXG5cdFx0XHRzaGFkb3cgPSBWU01TaGFkb3coIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKTtcblx0XHQjZWxzZVxuXHRcdFx0c2hhZG93ID0gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApO1xuXHRcdCNlbmRpZlxuXHRcdH1cblx0XHRyZXR1cm4gc2hhZG93O1xuXHR9XG5cdHZlYzIgY3ViZVRvVVYoIHZlYzMgdiwgZmxvYXQgdGV4ZWxTaXplWSApIHtcblx0XHR2ZWMzIGFic1YgPSBhYnMoIHYgKTtcblx0XHRmbG9hdCBzY2FsZVRvQ3ViZSA9IDEuMCAvIG1heCggYWJzVi54LCBtYXgoIGFic1YueSwgYWJzVi56ICkgKTtcblx0XHRhYnNWICo9IHNjYWxlVG9DdWJlO1xuXHRcdHYgKj0gc2NhbGVUb0N1YmUgKiAoIDEuMCAtIDIuMCAqIHRleGVsU2l6ZVkgKTtcblx0XHR2ZWMyIHBsYW5hciA9IHYueHk7XG5cdFx0ZmxvYXQgYWxtb3N0QVRleGVsID0gMS41ICogdGV4ZWxTaXplWTtcblx0XHRmbG9hdCBhbG1vc3RPbmUgPSAxLjAgLSBhbG1vc3RBVGV4ZWw7XG5cdFx0aWYgKCBhYnNWLnogPj0gYWxtb3N0T25lICkge1xuXHRcdFx0aWYgKCB2LnogPiAwLjAgKVxuXHRcdFx0XHRwbGFuYXIueCA9IDQuMCAtIHYueDtcblx0XHR9IGVsc2UgaWYgKCBhYnNWLnggPj0gYWxtb3N0T25lICkge1xuXHRcdFx0ZmxvYXQgc2lnblggPSBzaWduKCB2LnggKTtcblx0XHRcdHBsYW5hci54ID0gdi56ICogc2lnblggKyAyLjAgKiBzaWduWDtcblx0XHR9IGVsc2UgaWYgKCBhYnNWLnkgPj0gYWxtb3N0T25lICkge1xuXHRcdFx0ZmxvYXQgc2lnblkgPSBzaWduKCB2LnkgKTtcblx0XHRcdHBsYW5hci54ID0gdi54ICsgMi4wICogc2lnblkgKyAyLjA7XG5cdFx0XHRwbGFuYXIueSA9IHYueiAqIHNpZ25ZIC0gMi4wO1xuXHRcdH1cblx0XHRyZXR1cm4gdmVjMiggMC4xMjUsIDAuMjUgKSAqIHBsYW5hciArIHZlYzIoIDAuMzc1LCAwLjc1ICk7XG5cdH1cblx0ZmxvYXQgZ2V0UG9pbnRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkLCBmbG9hdCBzaGFkb3dDYW1lcmFOZWFyLCBmbG9hdCBzaGFkb3dDYW1lcmFGYXIgKSB7XG5cdFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvICggc2hhZG93TWFwU2l6ZSAqIHZlYzIoIDQuMCwgMi4wICkgKTtcblx0XHR2ZWMzIGxpZ2h0VG9Qb3NpdGlvbiA9IHNoYWRvd0Nvb3JkLnh5ejtcblx0XHRmbG9hdCBkcCA9ICggbGVuZ3RoKCBsaWdodFRvUG9zaXRpb24gKSAtIHNoYWRvd0NhbWVyYU5lYXIgKSAvICggc2hhZG93Q2FtZXJhRmFyIC0gc2hhZG93Q2FtZXJhTmVhciApO1x0XHRkcCArPSBzaGFkb3dCaWFzO1xuXHRcdHZlYzMgYmQzRCA9IG5vcm1hbGl6ZSggbGlnaHRUb1Bvc2l0aW9uICk7XG5cdFx0I2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApIHx8IGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRl9TT0ZUICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfVlNNIClcblx0XHRcdHZlYzIgb2Zmc2V0ID0gdmVjMiggLSAxLCAxICkgKiBzaGFkb3dSYWRpdXMgKiB0ZXhlbFNpemUueTtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl5LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eXksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh5eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh5LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXh4LCB0ZXhlbFNpemUueSApLCBkcCApXG5cdFx0XHQpICogKCAxLjAgLyA5LjAgKTtcblx0XHQjZWxzZVxuXHRcdFx0cmV0dXJuIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICk7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZiIsc2hhZG93bWFwX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMFxuXHRcdHVuaWZvcm0gbWF0NCBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0XHRzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodFNoYWRvdyB7XG5cdFx0XHRmbG9hdCBzaGFkb3dCaWFzO1xuXHRcdFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcblx0XHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcblx0XHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0XHR9O1xuXHRcdHVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDBcblx0XHR1bmlmb3JtIG1hdDQgc3BvdFNoYWRvd01hdHJpeFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2U3BvdFNoYWRvd0Nvb3JkWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0c3RydWN0IFNwb3RMaWdodFNoYWRvdyB7XG5cdFx0XHRmbG9hdCBzaGFkb3dCaWFzO1xuXHRcdFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcblx0XHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcblx0XHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0XHR9O1xuXHRcdHVuaWZvcm0gU3BvdExpZ2h0U2hhZG93IHNwb3RMaWdodFNoYWRvd3NbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcblx0XHR1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHN0cnVjdCBQb2ludExpZ2h0U2hhZG93IHtcblx0XHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0XHRmbG9hdCBzaGFkb3dOb3JtYWxCaWFzO1xuXHRcdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHRcdFx0ZmxvYXQgc2hhZG93Q2FtZXJhTmVhcjtcblx0XHRcdGZsb2F0IHNoYWRvd0NhbWVyYUZhcjtcblx0XHR9O1xuXHRcdHVuaWZvcm0gUG9pbnRMaWdodFNoYWRvdyBwb2ludExpZ2h0U2hhZG93c1sgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG4jZW5kaWYiLHNoYWRvd21hcF92ZXJ0ZXg6IiNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwIHx8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwIHx8IE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxuXHRcdHZlYzMgc2hhZG93V29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCB0cmFuc2Zvcm1lZE5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdHZlYzQgc2hhZG93V29ybGRQb3NpdGlvbjtcblx0I2VuZGlmXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHNoYWRvd1dvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uICsgdmVjNCggc2hhZG93V29ybGROb3JtYWwgKiBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgaSBdLnNoYWRvd05vcm1hbEJpYXMsIDAgKTtcblx0XHR2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdID0gZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIGkgXSAqIHNoYWRvd1dvcmxkUG9zaXRpb247XG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0c2hhZG93V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24gKyB2ZWM0KCBzaGFkb3dXb3JsZE5vcm1hbCAqIHNwb3RMaWdodFNoYWRvd3NbIGkgXS5zaGFkb3dOb3JtYWxCaWFzLCAwICk7XG5cdFx0dlNwb3RTaGFkb3dDb29yZFsgaSBdID0gc3BvdFNoYWRvd01hdHJpeFsgaSBdICogc2hhZG93V29ybGRQb3NpdGlvbjtcblx0fVxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuXHQjZW5kaWZcblx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHNoYWRvd1dvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uICsgdmVjNCggc2hhZG93V29ybGROb3JtYWwgKiBwb2ludExpZ2h0U2hhZG93c1sgaSBdLnNoYWRvd05vcm1hbEJpYXMsIDAgKTtcblx0XHR2UG9pbnRTaGFkb3dDb29yZFsgaSBdID0gcG9pbnRTaGFkb3dNYXRyaXhbIGkgXSAqIHNoYWRvd1dvcmxkUG9zaXRpb247XG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcblx0I2VuZGlmXG4jZW5kaWYiLHNoYWRvd21hc2tfcGFyc19mcmFnbWVudDoiZmxvYXQgZ2V0U2hhZG93TWFzaygpIHtcblx0ZmxvYXQgc2hhZG93ID0gMS4wO1xuXHQjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMFxuXHREaXJlY3Rpb25hbExpZ2h0U2hhZG93IGRpcmVjdGlvbmFsTGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdGRpcmVjdGlvbmFsTGlnaHQgPSBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgaSBdO1xuXHRcdHNoYWRvdyAqPSByZWNlaXZlU2hhZG93ID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93QmlhcywgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dSYWRpdXMsIHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0fVxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwXG5cdFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHRzcG90TGlnaHQgPSBzcG90TGlnaHRTaGFkb3dzWyBpIF07XG5cdFx0c2hhZG93ICo9IHJlY2VpdmVTaGFkb3cgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFkb3dCaWFzLCBzcG90TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0fVxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuXHQjZW5kaWZcblx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxuXHRQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0cG9pbnRMaWdodCA9IHBvaW50TGlnaHRTaGFkb3dzWyBpIF07XG5cdFx0c2hhZG93ICo9IHJlY2VpdmVTaGFkb3cgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7XG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcblx0I2VuZGlmXG5cdCNlbmRpZlxuXHRyZXR1cm4gc2hhZG93O1xufSIsc2tpbmJhc2VfdmVydGV4OiIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdG1hdDQgYm9uZU1hdFggPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueCApO1xuXHRtYXQ0IGJvbmVNYXRZID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnkgKTtcblx0bWF0NCBib25lTWF0WiA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC56ICk7XG5cdG1hdDQgYm9uZU1hdFcgPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgudyApO1xuI2VuZGlmIixza2lubmluZ19wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHR1bmlmb3JtIG1hdDQgYmluZE1hdHJpeDtcblx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXhJbnZlcnNlO1xuXHQjaWZkZWYgQk9ORV9URVhUVVJFXG5cdFx0dW5pZm9ybSBoaWdocCBzYW1wbGVyMkQgYm9uZVRleHR1cmU7XG5cdFx0dW5pZm9ybSBpbnQgYm9uZVRleHR1cmVTaXplO1xuXHRcdG1hdDQgZ2V0Qm9uZU1hdHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHtcblx0XHRcdGZsb2F0IGogPSBpICogNC4wO1xuXHRcdFx0ZmxvYXQgeCA9IG1vZCggaiwgZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XG5cdFx0XHRmbG9hdCB5ID0gZmxvb3IoIGogLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICkgKTtcblx0XHRcdGZsb2F0IGR4ID0gMS4wIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xuXHRcdFx0ZmxvYXQgZHkgPSAxLjAgLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICk7XG5cdFx0XHR5ID0gZHkgKiAoIHkgKyAwLjUgKTtcblx0XHRcdHZlYzQgdjEgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDAuNSApLCB5ICkgKTtcblx0XHRcdHZlYzQgdjIgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDEuNSApLCB5ICkgKTtcblx0XHRcdHZlYzQgdjMgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDIuNSApLCB5ICkgKTtcblx0XHRcdHZlYzQgdjQgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDMuNSApLCB5ICkgKTtcblx0XHRcdG1hdDQgYm9uZSA9IG1hdDQoIHYxLCB2MiwgdjMsIHY0ICk7XG5cdFx0XHRyZXR1cm4gYm9uZTtcblx0XHR9XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBtYXQ0IGJvbmVNYXRyaWNlc1sgTUFYX0JPTkVTIF07XG5cdFx0bWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xuXHRcdFx0bWF0NCBib25lID0gYm9uZU1hdHJpY2VzWyBpbnQoaSkgXTtcblx0XHRcdHJldHVybiBib25lO1xuXHRcdH1cblx0I2VuZGlmXG4jZW5kaWYiLHNraW5uaW5nX3ZlcnRleDoiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHR2ZWM0IHNraW5WZXJ0ZXggPSBiaW5kTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuXHR2ZWM0IHNraW5uZWQgPSB2ZWM0KCAwLjAgKTtcblx0c2tpbm5lZCArPSBib25lTWF0WCAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lng7XG5cdHNraW5uZWQgKz0gYm9uZU1hdFkgKiBza2luVmVydGV4ICogc2tpbldlaWdodC55O1xuXHRza2lubmVkICs9IGJvbmVNYXRaICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQuejtcblx0c2tpbm5lZCArPSBib25lTWF0VyAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnc7XG5cdHRyYW5zZm9ybWVkID0gKCBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5uZWQgKS54eXo7XG4jZW5kaWYiLHNraW5ub3JtYWxfdmVydGV4OiIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdG1hdDQgc2tpbk1hdHJpeCA9IG1hdDQoIDAuMCApO1xuXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQueCAqIGJvbmVNYXRYO1xuXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQueSAqIGJvbmVNYXRZO1xuXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQueiAqIGJvbmVNYXRaO1xuXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQudyAqIGJvbmVNYXRXO1xuXHRza2luTWF0cml4ID0gYmluZE1hdHJpeEludmVyc2UgKiBza2luTWF0cml4ICogYmluZE1hdHJpeDtcblx0b2JqZWN0Tm9ybWFsID0gdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdE5vcm1hbCwgMC4wICkgKS54eXo7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdG9iamVjdFRhbmdlbnQgPSB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0VGFuZ2VudCwgMC4wICkgKS54eXo7XG5cdCNlbmRpZlxuI2VuZGlmIixzcGVjdWxhcm1hcF9mcmFnbWVudDoiZmxvYXQgc3BlY3VsYXJTdHJlbmd0aDtcbiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcblx0dmVjNCB0ZXhlbFNwZWN1bGFyID0gdGV4dHVyZTJEKCBzcGVjdWxhck1hcCwgdlV2ICk7XG5cdHNwZWN1bGFyU3RyZW5ndGggPSB0ZXhlbFNwZWN1bGFyLnI7XG4jZWxzZVxuXHRzcGVjdWxhclN0cmVuZ3RoID0gMS4wO1xuI2VuZGlmIixzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1NQRUNVTEFSTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIHNwZWN1bGFyTWFwO1xuI2VuZGlmIix0b25lbWFwcGluZ19mcmFnbWVudDoiI2lmIGRlZmluZWQoIFRPTkVfTUFQUElORyApXG5cdGdsX0ZyYWdDb2xvci5yZ2IgPSB0b25lTWFwcGluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xuI2VuZGlmIix0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50OiIjaWZuZGVmIHNhdHVyYXRlXG4jZGVmaW5lIHNhdHVyYXRlKGEpIGNsYW1wKCBhLCAwLjAsIDEuMCApXG4jZW5kaWZcbnVuaWZvcm0gZmxvYXQgdG9uZU1hcHBpbmdFeHBvc3VyZTtcbnZlYzMgTGluZWFyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdHJldHVybiB0b25lTWFwcGluZ0V4cG9zdXJlICogY29sb3I7XG59XG52ZWMzIFJlaW5oYXJkVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggY29sb3IgLyAoIHZlYzMoIDEuMCApICsgY29sb3IgKSApO1xufVxudmVjMyBPcHRpbWl6ZWRDaW5lb25Ub25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0Y29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTtcblx0Y29sb3IgPSBtYXgoIHZlYzMoIDAuMCApLCBjb2xvciAtIDAuMDA0ICk7XG5cdHJldHVybiBwb3coICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMC41ICkgKSAvICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMS43ICkgKyAwLjA2ICksIHZlYzMoIDIuMiApICk7XG59XG52ZWMzIFJSVEFuZE9EVEZpdCggdmVjMyB2ICkge1xuXHR2ZWMzIGEgPSB2ICogKCB2ICsgMC4wMjQ1Nzg2ICkgLSAwLjAwMDA5MDUzNztcblx0dmVjMyBiID0gdiAqICggMC45ODM3MjkgKiB2ICsgMC40MzI5NTEwICkgKyAwLjIzODA4MTtcblx0cmV0dXJuIGEgLyBiO1xufVxudmVjMyBBQ0VTRmlsbWljVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbnN0IG1hdDMgQUNFU0lucHV0TWF0ID0gbWF0Myhcblx0XHR2ZWMzKCAwLjU5NzE5LCAwLjA3NjAwLCAwLjAyODQwICksXHRcdHZlYzMoIDAuMzU0NTgsIDAuOTA4MzQsIDAuMTMzODMgKSxcblx0XHR2ZWMzKCAwLjA0ODIzLCAwLjAxNTY2LCAwLjgzNzc3IClcblx0KTtcblx0Y29uc3QgbWF0MyBBQ0VTT3V0cHV0TWF0ID0gbWF0Myhcblx0XHR2ZWMzKCAgMS42MDQ3NSwgLTAuMTAyMDgsIC0wLjAwMzI3ICksXHRcdHZlYzMoIC0wLjUzMTA4LCAgMS4xMDgxMywgLTAuMDcyNzYgKSxcblx0XHR2ZWMzKCAtMC4wNzM2NywgLTAuMDA2MDUsICAxLjA3NjAyIClcblx0KTtcblx0Y29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZSAvIDAuNjtcblx0Y29sb3IgPSBBQ0VTSW5wdXRNYXQgKiBjb2xvcjtcblx0Y29sb3IgPSBSUlRBbmRPRFRGaXQoIGNvbG9yICk7XG5cdGNvbG9yID0gQUNFU091dHB1dE1hdCAqIGNvbG9yO1xuXHRyZXR1cm4gc2F0dXJhdGUoIGNvbG9yICk7XG59XG52ZWMzIEN1c3RvbVRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkgeyByZXR1cm4gY29sb3I7IH0iLHRyYW5zbWlzc2lvbl9mcmFnbWVudDoiI2lmZGVmIFVTRV9UUkFOU01JU1NJT05cblx0ZmxvYXQgdHJhbnNtaXNzaW9uRmFjdG9yID0gdHJhbnNtaXNzaW9uO1xuXHRmbG9hdCB0aGlja25lc3NGYWN0b3IgPSB0aGlja25lc3M7XG5cdCNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OTUFQXG5cdFx0dHJhbnNtaXNzaW9uRmFjdG9yICo9IHRleHR1cmUyRCggdHJhbnNtaXNzaW9uTWFwLCB2VXYgKS5yO1xuXHQjZW5kaWZcblx0I2lmZGVmIFVTRV9USElDS05FU1NNQVBcblx0XHR0aGlja25lc3NGYWN0b3IgKj0gdGV4dHVyZTJEKCB0aGlja25lc3NNYXAsIHZVdiApLmc7XG5cdCNlbmRpZlxuXHR2ZWMzIHBvcyA9IHZXb3JsZFBvc2l0aW9uLnh5eiAvIHZXb3JsZFBvc2l0aW9uLnc7XG5cdHZlYzMgdiA9IG5vcm1hbGl6ZSggY2FtZXJhUG9zaXRpb24gLSBwb3MgKTtcblx0dmVjMyBuID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdGZsb2F0IGlvciA9ICggMS4wICsgMC40ICogcmVmbGVjdGl2aXR5ICkgLyAoIDEuMCAtIDAuNCAqIHJlZmxlY3Rpdml0eSApO1xuXHR2ZWMzIHRyYW5zbWlzc2lvbiA9IHRyYW5zbWlzc2lvbkZhY3RvciAqIGdldElCTFZvbHVtZVJlZnJhY3Rpb24oXG5cdFx0biwgdiwgcm91Z2huZXNzRmFjdG9yLCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsXG5cdFx0cG9zLCBtb2RlbE1hdHJpeCwgdmlld01hdHJpeCwgcHJvamVjdGlvbk1hdHJpeCwgaW9yLCB0aGlja25lc3NGYWN0b3IsXG5cdFx0YXR0ZW51YXRpb25UaW50LCBhdHRlbnVhdGlvbkRpc3RhbmNlICk7XG5cdHRvdGFsRGlmZnVzZSA9IG1peCggdG90YWxEaWZmdXNlLCB0cmFuc21pc3Npb24sIHRyYW5zbWlzc2lvbkZhY3RvciApO1xuI2VuZGlmIix0cmFuc21pc3Npb25fcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9UUkFOU01JU1NJT05cblx0I2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCB0cmFuc21pc3Npb25NYXA7XG5cdCNlbmRpZlxuXHQjaWZkZWYgVVNFX1RISUNLTkVTU01BUFxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIHRoaWNrbmVzc01hcDtcblx0I2VuZGlmXG5cdHVuaWZvcm0gdmVjMiB0cmFuc21pc3Npb25TYW1wbGVyU2l6ZTtcblx0dW5pZm9ybSBzYW1wbGVyMkQgdHJhbnNtaXNzaW9uU2FtcGxlck1hcDtcblx0dW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4O1xuXHR1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDtcblx0dmFyeWluZyB2ZWM0IHZXb3JsZFBvc2l0aW9uO1xuXHR2ZWMzIGdldFZvbHVtZVRyYW5zbWlzc2lvblJheSh2ZWMzIG4sIHZlYzMgdiwgZmxvYXQgdGhpY2tuZXNzLCBmbG9hdCBpb3IsIG1hdDQgbW9kZWxNYXRyaXgpIHtcblx0XHR2ZWMzIHJlZnJhY3Rpb25WZWN0b3IgPSByZWZyYWN0KC12LCBub3JtYWxpemUobiksIDEuMCAvIGlvcik7XG5cdFx0dmVjMyBtb2RlbFNjYWxlO1xuXHRcdG1vZGVsU2NhbGUueCA9IGxlbmd0aCh2ZWMzKG1vZGVsTWF0cml4WzBdLnh5eikpO1xuXHRcdG1vZGVsU2NhbGUueSA9IGxlbmd0aCh2ZWMzKG1vZGVsTWF0cml4WzFdLnh5eikpO1xuXHRcdG1vZGVsU2NhbGUueiA9IGxlbmd0aCh2ZWMzKG1vZGVsTWF0cml4WzJdLnh5eikpO1xuXHRcdHJldHVybiBub3JtYWxpemUocmVmcmFjdGlvblZlY3RvcikgKiB0aGlja25lc3MgKiBtb2RlbFNjYWxlO1xuXHR9XG5cdGZsb2F0IGFwcGx5SW9yVG9Sb3VnaG5lc3MoZmxvYXQgcm91Z2huZXNzLCBmbG9hdCBpb3IpIHtcblx0XHRyZXR1cm4gcm91Z2huZXNzICogY2xhbXAoaW9yICogMi4wIC0gMi4wLCAwLjAsIDEuMCk7XG5cdH1cblx0dmVjMyBnZXRUcmFuc21pc3Npb25TYW1wbGUodmVjMiBmcmFnQ29vcmQsIGZsb2F0IHJvdWdobmVzcywgZmxvYXQgaW9yKSB7XG5cdFx0ZmxvYXQgZnJhbWVidWZmZXJMb2QgPSBsb2cyKHRyYW5zbWlzc2lvblNhbXBsZXJTaXplLngpICogYXBwbHlJb3JUb1JvdWdobmVzcyhyb3VnaG5lc3MsIGlvcik7XG5cdFx0cmV0dXJuIHRleHR1cmUyRExvZEVYVCh0cmFuc21pc3Npb25TYW1wbGVyTWFwLCBmcmFnQ29vcmQueHksIGZyYW1lYnVmZmVyTG9kKS5yZ2I7XG5cdH1cblx0dmVjMyBhcHBseVZvbHVtZUF0dGVudWF0aW9uKHZlYzMgcmFkaWFuY2UsIGZsb2F0IHRyYW5zbWlzc2lvbkRpc3RhbmNlLCB2ZWMzIGF0dGVudWF0aW9uQ29sb3IsIGZsb2F0IGF0dGVudWF0aW9uRGlzdGFuY2UpIHtcblx0XHRpZiAoYXR0ZW51YXRpb25EaXN0YW5jZSA9PSAwLjApIHtcblx0XHRcdHJldHVybiByYWRpYW5jZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmVjMyBhdHRlbnVhdGlvbkNvZWZmaWNpZW50ID0gLWxvZyhhdHRlbnVhdGlvbkNvbG9yKSAvIGF0dGVudWF0aW9uRGlzdGFuY2U7XG5cdFx0XHR2ZWMzIHRyYW5zbWl0dGFuY2UgPSBleHAoLWF0dGVudWF0aW9uQ29lZmZpY2llbnQgKiB0cmFuc21pc3Npb25EaXN0YW5jZSk7XHRcdFx0cmV0dXJuIHRyYW5zbWl0dGFuY2UgKiByYWRpYW5jZTtcblx0XHR9XG5cdH1cblx0dmVjMyBnZXRJQkxWb2x1bWVSZWZyYWN0aW9uKHZlYzMgbiwgdmVjMyB2LCBmbG9hdCBwZXJjZXB0dWFsUm91Z2huZXNzLCB2ZWMzIGJhc2VDb2xvciwgdmVjMyBzcGVjdWxhckNvbG9yLFxuXHRcdHZlYzMgcG9zaXRpb24sIG1hdDQgbW9kZWxNYXRyaXgsIG1hdDQgdmlld01hdHJpeCwgbWF0NCBwcm9qTWF0cml4LCBmbG9hdCBpb3IsIGZsb2F0IHRoaWNrbmVzcyxcblx0XHR2ZWMzIGF0dGVudWF0aW9uQ29sb3IsIGZsb2F0IGF0dGVudWF0aW9uRGlzdGFuY2UpIHtcblx0XHR2ZWMzIHRyYW5zbWlzc2lvblJheSA9IGdldFZvbHVtZVRyYW5zbWlzc2lvblJheShuLCB2LCB0aGlja25lc3MsIGlvciwgbW9kZWxNYXRyaXgpO1xuXHRcdHZlYzMgcmVmcmFjdGVkUmF5RXhpdCA9IHBvc2l0aW9uICsgdHJhbnNtaXNzaW9uUmF5O1xuXHRcdHZlYzQgbmRjUG9zID0gcHJvak1hdHJpeCAqIHZpZXdNYXRyaXggKiB2ZWM0KHJlZnJhY3RlZFJheUV4aXQsIDEuMCk7XG5cdFx0dmVjMiByZWZyYWN0aW9uQ29vcmRzID0gbmRjUG9zLnh5IC8gbmRjUG9zLnc7XG5cdFx0cmVmcmFjdGlvbkNvb3JkcyArPSAxLjA7XG5cdFx0cmVmcmFjdGlvbkNvb3JkcyAvPSAyLjA7XG5cdFx0dmVjMyB0cmFuc21pdHRlZExpZ2h0ID0gZ2V0VHJhbnNtaXNzaW9uU2FtcGxlKHJlZnJhY3Rpb25Db29yZHMsIHBlcmNlcHR1YWxSb3VnaG5lc3MsIGlvcik7XG5cdFx0dmVjMyBhdHRlbnVhdGVkQ29sb3IgPSBhcHBseVZvbHVtZUF0dGVudWF0aW9uKHRyYW5zbWl0dGVkTGlnaHQsIGxlbmd0aCh0cmFuc21pc3Npb25SYXkpLCBhdHRlbnVhdGlvbkNvbG9yLCBhdHRlbnVhdGlvbkRpc3RhbmNlKTtcblx0XHRyZXR1cm4gKDEuMCAtIHNwZWN1bGFyQ29sb3IpICogYXR0ZW51YXRlZENvbG9yICogYmFzZUNvbG9yO1xuXHR9XG4jZW5kaWYiLHV2X3BhcnNfZnJhZ21lbnQ6IiNpZiAoIGRlZmluZWQoIFVTRV9VViApICYmICEgZGVmaW5lZCggVVZTX1ZFUlRFWF9PTkxZICkgKVxuXHR2YXJ5aW5nIHZlYzIgdlV2O1xuI2VuZGlmIix1dl9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9VVlxuXHQjaWZkZWYgVVZTX1ZFUlRFWF9PTkxZXG5cdFx0dmVjMiB2VXY7XG5cdCNlbHNlXG5cdFx0dmFyeWluZyB2ZWMyIHZVdjtcblx0I2VuZGlmXG5cdHVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcbiNlbmRpZiIsdXZfdmVydGV4OiIjaWZkZWYgVVNFX1VWXG5cdHZVdiA9ICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XG4jZW5kaWYiLHV2Ml9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcblx0dmFyeWluZyB2ZWMyIHZVdjI7XG4jZW5kaWYiLHV2Ml9wYXJzX3ZlcnRleDoiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXG5cdGF0dHJpYnV0ZSB2ZWMyIHV2Mjtcblx0dmFyeWluZyB2ZWMyIHZVdjI7XG5cdHVuaWZvcm0gbWF0MyB1djJUcmFuc2Zvcm07XG4jZW5kaWYiLHV2Ml92ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxuXHR2VXYyID0gKCB1djJUcmFuc2Zvcm0gKiB2ZWMzKCB1djIsIDEgKSApLnh5O1xuI2VuZGlmIix3b3JsZHBvc192ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgfHwgZGVmaW5lZCggRElTVEFOQ0UgKSB8fCBkZWZpbmVkICggVVNFX1NIQURPV01BUCApIHx8IGRlZmluZWQgKCBVU0VfVFJBTlNNSVNTSU9OIClcblx0dmVjNCB3b3JsZFBvc2l0aW9uID0gdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuXHQjaWZkZWYgVVNFX0lOU1RBTkNJTkdcblx0XHR3b3JsZFBvc2l0aW9uID0gaW5zdGFuY2VNYXRyaXggKiB3b3JsZFBvc2l0aW9uO1xuXHQjZW5kaWZcblx0d29ybGRQb3NpdGlvbiA9IG1vZGVsTWF0cml4ICogd29ybGRQb3NpdGlvbjtcbiNlbmRpZiIsYmFja2dyb3VuZF9mcmFnOiJ1bmlmb3JtIHNhbXBsZXIyRCB0MkQ7XG52YXJ5aW5nIHZlYzIgdlV2O1xudm9pZCBtYWluKCkge1xuXHR2ZWM0IHRleENvbG9yID0gdGV4dHVyZTJEKCB0MkQsIHZVdiApO1xuXHRnbF9GcmFnQ29sb3IgPSBtYXBUZXhlbFRvTGluZWFyKCB0ZXhDb2xvciApO1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG59IixiYWNrZ3JvdW5kX3ZlcnQ6InZhcnlpbmcgdmVjMiB2VXY7XG51bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XG52b2lkIG1haW4oKSB7XG5cdHZVdiA9ICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XG5cdGdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24ueHksIDEuMCwgMS4wICk7XG59IixjdWJlX2ZyYWc6IiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG52YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0dmVjMyB2UmVmbGVjdCA9IHZXb3JsZERpcmVjdGlvbjtcblx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cblx0Z2xfRnJhZ0NvbG9yID0gZW52Q29sb3I7XG5cdGdsX0ZyYWdDb2xvci5hICo9IG9wYWNpdHk7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cbn0iLGN1YmVfdmVydDoidmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIDxjb21tb24+XG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0Z2xfUG9zaXRpb24ueiA9IGdsX1Bvc2l0aW9uLnc7XG59IixkZXB0aF9mcmFnOiIjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXG5cdHVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxwYWNraW5nPlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxudmFyeWluZyB2ZWMyIHZIaWdoUHJlY2lzaW9uWlc7XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggMS4wICk7XG5cdCNpZiBERVBUSF9QQUNLSU5HID09IDMyMDBcblx0XHRkaWZmdXNlQ29sb3IuYSA9IG9wYWNpdHk7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0ZmxvYXQgZnJhZ0Nvb3JkWiA9IDAuNSAqIHZIaWdoUHJlY2lzaW9uWldbMF0gLyB2SGlnaFByZWNpc2lvblpXWzFdICsgMC41O1xuXHQjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXG5cdFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggdmVjMyggMS4wIC0gZnJhZ0Nvb3JkWiApLCBvcGFjaXR5ICk7XG5cdCNlbGlmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMVxuXHRcdGdsX0ZyYWdDb2xvciA9IHBhY2tEZXB0aFRvUkdCQSggZnJhZ0Nvb3JkWiApO1xuXHQjZW5kaWZcbn0iLGRlcHRoX3ZlcnQ6IiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZhcnlpbmcgdmVjMiB2SGlnaFByZWNpc2lvblpXO1xudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHRcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cblx0XHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0dkhpZ2hQcmVjaXNpb25aVyA9IGdsX1Bvc2l0aW9uLnp3O1xufSIsZGlzdGFuY2VSR0JBX2ZyYWc6IiNkZWZpbmUgRElTVEFOQ0VcbnVuaWZvcm0gdmVjMyByZWZlcmVuY2VQb3NpdGlvbjtcbnVuaWZvcm0gZmxvYXQgbmVhckRpc3RhbmNlO1xudW5pZm9ybSBmbG9hdCBmYXJEaXN0YW5jZTtcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4gKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApO1xuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdGZsb2F0IGRpc3QgPSBsZW5ndGgoIHZXb3JsZFBvc2l0aW9uIC0gcmVmZXJlbmNlUG9zaXRpb24gKTtcblx0ZGlzdCA9ICggZGlzdCAtIG5lYXJEaXN0YW5jZSApIC8gKCBmYXJEaXN0YW5jZSAtIG5lYXJEaXN0YW5jZSApO1xuXHRkaXN0ID0gc2F0dXJhdGUoIGRpc3QgKTtcblx0Z2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBkaXN0ICk7XG59IixkaXN0YW5jZVJHQkFfdmVydDoiI2RlZmluZSBESVNUQU5DRVxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHRcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cblx0XHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0dldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uLnh5ejtcbn0iLGVxdWlyZWN0X2ZyYWc6InVuaWZvcm0gc2FtcGxlcjJEIHRFcXVpcmVjdDtcbnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG4jaW5jbHVkZSA8Y29tbW9uPlxudm9pZCBtYWluKCkge1xuXHR2ZWMzIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdldvcmxkRGlyZWN0aW9uICk7XG5cdHZlYzIgc2FtcGxlVVYgPSBlcXVpcmVjdFV2KCBkaXJlY3Rpb24gKTtcblx0dmVjNCB0ZXhDb2xvciA9IHRleHR1cmUyRCggdEVxdWlyZWN0LCBzYW1wbGVVViApO1xuXHRnbF9GcmFnQ29sb3IgPSBtYXBUZXhlbFRvTGluZWFyKCB0ZXhDb2xvciApO1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG59IixlcXVpcmVjdF92ZXJ0OiJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2luY2x1ZGUgPGNvbW1vbj5cbnZvaWQgbWFpbigpIHtcblx0dldvcmxkRGlyZWN0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxufSIsbGluZWRhc2hlZF9mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnVuaWZvcm0gZmxvYXQgZGFzaFNpemU7XG51bmlmb3JtIGZsb2F0IHRvdGFsU2l6ZTtcbnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHRpZiAoIG1vZCggdkxpbmVEaXN0YW5jZSwgdG90YWxTaXplICkgPiBkYXNoU2l6ZSApIHtcblx0XHRkaXNjYXJkO1xuXHR9XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApO1xuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XG5cdG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiO1xuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxufSIsbGluZWRhc2hlZF92ZXJ0OiJ1bmlmb3JtIGZsb2F0IHNjYWxlO1xuYXR0cmlidXRlIGZsb2F0IGxpbmVEaXN0YW5jZTtcbnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0dkxpbmVEaXN0YW5jZSA9IHNjYWxlICogbGluZURpc3RhbmNlO1xuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn0iLG1lc2hiYXNpY19mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHQjaWZkZWYgVVNFX0xJR0hUTUFQXG5cdFxuXHRcdHZlYzQgbGlnaHRNYXBUZXhlbD0gdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBsaWdodE1hcFRleGVsVG9MaW5lYXIoIGxpZ2h0TWFwVGV4ZWwgKS5yZ2IgKiBsaWdodE1hcEludGVuc2l0eTtcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gdmVjMyggMS4wICk7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBkaWZmdXNlQ29sb3IucmdiO1xuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2U7XG5cdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XG59IixtZXNoYmFzaWNfdmVydDoiI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx1djJfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxuXHQjaWYgZGVmaW5lZCAoIFVTRV9FTlZNQVAgKSB8fCBkZWZpbmVkICggVVNFX1NLSU5OSU5HIClcblx0XHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHRcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cblx0XHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuXHQjZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufSIsbWVzaGxhbWJlcnRfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XG52YXJ5aW5nIHZlYzMgdkluZGlyZWN0RnJvbnQ7XG4jaWZkZWYgRE9VQkxFX1NJREVEXG5cdHZhcnlpbmcgdmVjMyB2TGlnaHRCYWNrO1xuXHR2YXJ5aW5nIHZlYzMgdkluZGlyZWN0QmFjaztcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxwYWNraW5nPlxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YnNkZnM+XG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFza19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlID0gZW1pc3NpdmU7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxuXHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9ICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZJbmRpcmVjdEZyb250IDogdkluZGlyZWN0QmFjaztcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gdkluZGlyZWN0RnJvbnQ7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8bGlnaHRtYXBfZnJhZ21lbnQ+XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBCUkRGX0RpZmZ1c2VfTGFtYmVydCggZGlmZnVzZUNvbG9yLnJnYiApO1xuXHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSA9ICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZMaWdodEZyb250IDogdkxpZ2h0QmFjaztcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlID0gdkxpZ2h0RnJvbnQ7XG5cdCNlbmRpZlxuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICo9IEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBkaWZmdXNlQ29sb3IucmdiICkgKiBnZXRTaGFkb3dNYXNrKCk7XG5cdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcblx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cbn0iLG1lc2hsYW1iZXJ0X3ZlcnQ6IiNkZWZpbmUgTEFNQkVSVFxudmFyeWluZyB2ZWMzIHZMaWdodEZyb250O1xudmFyeWluZyB2ZWMzIHZJbmRpcmVjdEZyb250O1xuI2lmZGVmIERPVUJMRV9TSURFRFxuXHR2YXJ5aW5nIHZlYzMgdkxpZ2h0QmFjaztcblx0dmFyeWluZyB2ZWMzIHZJbmRpcmVjdEJhY2s7XG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxic2Rmcz5cbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPGxpZ2h0c19sYW1iZXJ0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufSIsbWVzaG1hdGNhcF9mcmFnOiIjZGVmaW5lIE1BVENBUFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG51bmlmb3JtIHNhbXBsZXIyRCBtYXRjYXA7XG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPlxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XG5cdHZlYzMgdmlld0RpciA9IG5vcm1hbGl6ZSggdlZpZXdQb3NpdGlvbiApO1xuXHR2ZWMzIHggPSBub3JtYWxpemUoIHZlYzMoIHZpZXdEaXIueiwgMC4wLCAtIHZpZXdEaXIueCApICk7XG5cdHZlYzMgeSA9IGNyb3NzKCB2aWV3RGlyLCB4ICk7XG5cdHZlYzIgdXYgPSB2ZWMyKCBkb3QoIHgsIG5vcm1hbCApLCBkb3QoIHksIG5vcm1hbCApICkgKiAwLjQ5NSArIDAuNTtcblx0I2lmZGVmIFVTRV9NQVRDQVBcblx0XHR2ZWM0IG1hdGNhcENvbG9yID0gdGV4dHVyZTJEKCBtYXRjYXAsIHV2ICk7XG5cdFx0bWF0Y2FwQ29sb3IgPSBtYXRjYXBUZXhlbFRvTGluZWFyKCBtYXRjYXBDb2xvciApO1xuXHQjZWxzZVxuXHRcdHZlYzQgbWF0Y2FwQ29sb3IgPSB2ZWM0KCAxLjAgKTtcblx0I2VuZGlmXG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2IgKiBtYXRjYXBDb2xvci5yZ2I7XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XG59IixtZXNobWF0Y2FwX3ZlcnQ6IiNkZWZpbmUgTUFUQ0FQXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuXHQjaWZuZGVmIEZMQVRfU0hBREVEXG5cdFx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcblx0XHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHRcdHZUYW5nZW50ID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZFRhbmdlbnQgKTtcblx0XHRcdHZCaXRhbmdlbnQgPSBub3JtYWxpemUoIGNyb3NzKCB2Tm9ybWFsLCB2VGFuZ2VudCApICogdGFuZ2VudC53ICk7XG5cdFx0I2VuZGlmXG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XG5cdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xufSIsbWVzaHRvb25fZnJhZzoiI2RlZmluZSBUT09OXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJzZGZzPlxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxuI2luY2x1ZGUgPGxpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPlxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XG5cdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGxpZ2h0c190b29uX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+XG5cdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPlxuXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XG59IixtZXNodG9vbl92ZXJ0OiIjZGVmaW5lIFRPT05cbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG4jZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XG59IixtZXNocGhvbmdfZnJhZzoiI2RlZmluZSBQSE9OR1xudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XG51bmlmb3JtIHZlYzMgc3BlY3VsYXI7XG51bmlmb3JtIGZsb2F0IHNoaW5pbmVzcztcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJzZGZzPlxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxuI2luY2x1ZGUgPGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz5cblx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bGlnaHRzX3Bob25nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+XG5cdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPlxuXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5cdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XG59IixtZXNocGhvbmdfdmVydDoiI2RlZmluZSBQSE9OR1xudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG4jZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufSIsbWVzaHBoeXNpY2FsX2ZyYWc6IiNkZWZpbmUgU1RBTkRBUkRcbiNpZmRlZiBQSFlTSUNBTFxuXHQjZGVmaW5lIFJFRkxFQ1RJVklUWVxuXHQjZGVmaW5lIENMRUFSQ09BVFxuXHQjZGVmaW5lIFNQRUNVTEFSXG4jZW5kaWZcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xudW5pZm9ybSBmbG9hdCByb3VnaG5lc3M7XG51bmlmb3JtIGZsb2F0IG1ldGFsbmVzcztcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OXG5cdHVuaWZvcm0gZmxvYXQgdHJhbnNtaXNzaW9uO1xuXHR1bmlmb3JtIGZsb2F0IHRoaWNrbmVzcztcblx0dW5pZm9ybSBmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlO1xuXHR1bmlmb3JtIHZlYzMgYXR0ZW51YXRpb25UaW50O1xuI2VuZGlmXG4jaWZkZWYgUkVGTEVDVElWSVRZXG5cdHVuaWZvcm0gZmxvYXQgcmVmbGVjdGl2aXR5O1xuI2VuZGlmXG4jaWZkZWYgU1BFQ1VMQVJcblx0dW5pZm9ybSBmbG9hdCBzcGVjdWxhckludGVuc2l0eTtcblx0dW5pZm9ybSB2ZWMzIHNwZWN1bGFyVGludDtcblx0I2lmZGVmIFVTRV9TUEVDVUxBUklOVEVOU0lUWU1BUFxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIHNwZWN1bGFySW50ZW5zaXR5TWFwO1xuXHQjZW5kaWZcblx0I2lmZGVmIFVTRV9TUEVDVUxBUlRJTlRNQVBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhclRpbnRNYXA7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaWZkZWYgQ0xFQVJDT0FUXG5cdHVuaWZvcm0gZmxvYXQgY2xlYXJjb2F0O1xuXHR1bmlmb3JtIGZsb2F0IGNsZWFyY29hdFJvdWdobmVzcztcbiNlbmRpZlxuI2lmZGVmIFVTRV9TSEVFTlxuXHR1bmlmb3JtIHZlYzMgc2hlZW47XG4jZW5kaWZcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxwYWNraW5nPlxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJzZGZzPlxuI2luY2x1ZGUgPHRyYW5zbWlzc2lvbl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cbiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XG4jaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsZWFyY29hdF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8cm91Z2huZXNzbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWV0YWxuZXNzbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPlxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XG5cdCNpbmNsdWRlIDxjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luPlxuXHQjaW5jbHVkZSA8Y2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzPlxuXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+XG5cdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfbWFwcz5cblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+XG5cdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cblx0dmVjMyB0b3RhbERpZmZ1c2UgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlO1xuXHR2ZWMzIHRvdGFsU3BlY3VsYXIgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXI7XG5cdCNpbmNsdWRlIDx0cmFuc21pc3Npb25fZnJhZ21lbnQ+XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHRvdGFsRGlmZnVzZSArIHRvdGFsU3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XG59IixtZXNocGh5c2ljYWxfdmVydDoiI2RlZmluZSBTVEFOREFSRFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaWZkZWYgVVNFX1RSQU5TTUlTU0lPTlxuXHR2YXJ5aW5nIHZlYzQgdldvcmxkUG9zaXRpb247XG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2VGFuZ2VudCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWRUYW5nZW50ICk7XG5cdFx0dkJpdGFuZ2VudCA9IG5vcm1hbGl6ZSggY3Jvc3MoIHZOb3JtYWwsIHZUYW5nZW50ICkgKiB0YW5nZW50LncgKTtcblx0I2VuZGlmXG4jZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XG4jaWZkZWYgVVNFX1RSQU5TTUlTU0lPTlxuXHR2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb247XG4jZW5kaWZcbn0iLG5vcm1hbF9mcmFnOiIjZGVmaW5lIE5PUk1BTFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jZW5kaWZcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIDxwYWNraW5nPlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBwYWNrTm9ybWFsVG9SR0IoIG5vcm1hbCApLCBvcGFjaXR5ICk7XG59Iixub3JtYWxfdmVydDoiI2RlZmluZSBOT1JNQUxcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2VGFuZ2VudCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWRUYW5nZW50ICk7XG5cdFx0dkJpdGFuZ2VudCA9IG5vcm1hbGl6ZSggY3Jvc3MoIHZOb3JtYWwsIHZUYW5nZW50ICkgKiB0YW5nZW50LncgKTtcblx0I2VuZGlmXG4jZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKVxuXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcbiNlbmRpZlxufSIscG9pbnRzX2ZyYWc6InVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApO1xuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWFwX3BhcnRpY2xlX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiO1xuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxufSIscG9pbnRzX3ZlcnQ6InVuaWZvcm0gZmxvYXQgc2l6ZTtcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0Z2xfUG9pbnRTaXplID0gc2l6ZTtcblx0I2lmZGVmIFVTRV9TSVpFQVRURU5VQVRJT05cblx0XHRib29sIGlzUGVyc3BlY3RpdmUgPSBpc1BlcnNwZWN0aXZlTWF0cml4KCBwcm9qZWN0aW9uTWF0cml4ICk7XG5cdFx0aWYgKCBpc1BlcnNwZWN0aXZlICkgZ2xfUG9pbnRTaXplICo9ICggc2NhbGUgLyAtIG12UG9zaXRpb24ueiApO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufSIsc2hhZG93X2ZyYWc6InVuaWZvcm0gdmVjMyBjb2xvcjtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxic2Rmcz5cbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIGNvbG9yLCBvcGFjaXR5ICogKCAxLjAgLSBnZXRTaGFkb3dNYXNrKCkgKSApO1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG59IixzaGFkb3dfdmVydDoiI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XG59IixzcHJpdGVfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTtcblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHRvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxufSIsc3ByaXRlX3ZlcnQ6InVuaWZvcm0gZmxvYXQgcm90YXRpb247XG51bmlmb3JtIHZlYzIgY2VudGVyO1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHR2ZWM0IG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTtcblx0dmVjMiBzY2FsZTtcblx0c2NhbGUueCA9IGxlbmd0aCggdmVjMyggbW9kZWxNYXRyaXhbIDAgXS54LCBtb2RlbE1hdHJpeFsgMCBdLnksIG1vZGVsTWF0cml4WyAwIF0ueiApICk7XG5cdHNjYWxlLnkgPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAxIF0ueCwgbW9kZWxNYXRyaXhbIDEgXS55LCBtb2RlbE1hdHJpeFsgMSBdLnogKSApO1xuXHQjaWZuZGVmIFVTRV9TSVpFQVRURU5VQVRJT05cblx0XHRib29sIGlzUGVyc3BlY3RpdmUgPSBpc1BlcnNwZWN0aXZlTWF0cml4KCBwcm9qZWN0aW9uTWF0cml4ICk7XG5cdFx0aWYgKCBpc1BlcnNwZWN0aXZlICkgc2NhbGUgKj0gLSBtdlBvc2l0aW9uLno7XG5cdCNlbmRpZlxuXHR2ZWMyIGFsaWduZWRQb3NpdGlvbiA9ICggcG9zaXRpb24ueHkgLSAoIGNlbnRlciAtIHZlYzIoIDAuNSApICkgKSAqIHNjYWxlO1xuXHR2ZWMyIHJvdGF0ZWRQb3NpdGlvbjtcblx0cm90YXRlZFBvc2l0aW9uLnggPSBjb3MoIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCAtIHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55O1xuXHRyb3RhdGVkUG9zaXRpb24ueSA9IHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54ICsgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7XG5cdG12UG9zaXRpb24ueHkgKz0gcm90YXRlZFBvc2l0aW9uO1xuXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XG59In0sbDB0PXtjb21tb246e2RpZmZ1c2U6e3ZhbHVlOm5ldyAkUXQoMTY3NzcyMTUpfSxvcGFjaXR5Ont2YWx1ZToxfSxtYXA6e3ZhbHVlOm51bGx9LHV2VHJhbnNmb3JtOnt2YWx1ZTpuZXcgZ0p0fSx1djJUcmFuc2Zvcm06e3ZhbHVlOm5ldyBnSnR9LGFscGhhTWFwOnt2YWx1ZTpudWxsfX0sc3BlY3VsYXJtYXA6e3NwZWN1bGFyTWFwOnt2YWx1ZTpudWxsfX0sZW52bWFwOntlbnZNYXA6e3ZhbHVlOm51bGx9LGZsaXBFbnZNYXA6e3ZhbHVlOi0xfSxyZWZsZWN0aXZpdHk6e3ZhbHVlOjF9LHJlZnJhY3Rpb25SYXRpbzp7dmFsdWU6Ljk4fSxtYXhNaXBMZXZlbDp7dmFsdWU6MH19LGFvbWFwOnthb01hcDp7dmFsdWU6bnVsbH0sYW9NYXBJbnRlbnNpdHk6e3ZhbHVlOjF9fSxsaWdodG1hcDp7bGlnaHRNYXA6e3ZhbHVlOm51bGx9LGxpZ2h0TWFwSW50ZW5zaXR5Ont2YWx1ZToxfX0sZW1pc3NpdmVtYXA6e2VtaXNzaXZlTWFwOnt2YWx1ZTpudWxsfX0sYnVtcG1hcDp7YnVtcE1hcDp7dmFsdWU6bnVsbH0sYnVtcFNjYWxlOnt2YWx1ZToxfX0sbm9ybWFsbWFwOntub3JtYWxNYXA6e3ZhbHVlOm51bGx9LG5vcm1hbFNjYWxlOnt2YWx1ZTpuZXcgbUp0KDEsMSl9fSxkaXNwbGFjZW1lbnRtYXA6e2Rpc3BsYWNlbWVudE1hcDp7dmFsdWU6bnVsbH0sZGlzcGxhY2VtZW50U2NhbGU6e3ZhbHVlOjF9LGRpc3BsYWNlbWVudEJpYXM6e3ZhbHVlOjB9fSxyb3VnaG5lc3NtYXA6e3JvdWdobmVzc01hcDp7dmFsdWU6bnVsbH19LG1ldGFsbmVzc21hcDp7bWV0YWxuZXNzTWFwOnt2YWx1ZTpudWxsfX0sZ3JhZGllbnRtYXA6e2dyYWRpZW50TWFwOnt2YWx1ZTpudWxsfX0sZm9nOntmb2dEZW5zaXR5Ont2YWx1ZToyNWUtNX0sZm9nTmVhcjp7dmFsdWU6MX0sZm9nRmFyOnt2YWx1ZToyZTN9LGZvZ0NvbG9yOnt2YWx1ZTpuZXcgJFF0KDE2Nzc3MjE1KX19LGxpZ2h0czp7YW1iaWVudExpZ2h0Q29sb3I6e3ZhbHVlOltdfSxsaWdodFByb2JlOnt2YWx1ZTpbXX0sZGlyZWN0aW9uYWxMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2RpcmVjdGlvbjp7fSxjb2xvcjp7fX19LGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntzaGFkb3dCaWFzOnt9LHNoYWRvd05vcm1hbEJpYXM6e30sc2hhZG93UmFkaXVzOnt9LHNoYWRvd01hcFNpemU6e319fSxkaXJlY3Rpb25hbFNoYWRvd01hcDp7dmFsdWU6W119LGRpcmVjdGlvbmFsU2hhZG93TWF0cml4Ont2YWx1ZTpbXX0sc3BvdExpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7Y29sb3I6e30scG9zaXRpb246e30sZGlyZWN0aW9uOnt9LGRpc3RhbmNlOnt9LGNvbmVDb3M6e30scGVudW1icmFDb3M6e30sZGVjYXk6e319fSxzcG90TGlnaHRTaGFkb3dzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntzaGFkb3dCaWFzOnt9LHNoYWRvd05vcm1hbEJpYXM6e30sc2hhZG93UmFkaXVzOnt9LHNoYWRvd01hcFNpemU6e319fSxzcG90U2hhZG93TWFwOnt2YWx1ZTpbXX0sc3BvdFNoYWRvd01hdHJpeDp7dmFsdWU6W119LHBvaW50TGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSxwb3NpdGlvbjp7fSxkZWNheTp7fSxkaXN0YW5jZTp7fX19LHBvaW50TGlnaHRTaGFkb3dzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntzaGFkb3dCaWFzOnt9LHNoYWRvd05vcm1hbEJpYXM6e30sc2hhZG93UmFkaXVzOnt9LHNoYWRvd01hcFNpemU6e30sc2hhZG93Q2FtZXJhTmVhcjp7fSxzaGFkb3dDYW1lcmFGYXI6e319fSxwb2ludFNoYWRvd01hcDp7dmFsdWU6W119LHBvaW50U2hhZG93TWF0cml4Ont2YWx1ZTpbXX0saGVtaXNwaGVyZUxpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7ZGlyZWN0aW9uOnt9LHNreUNvbG9yOnt9LGdyb3VuZENvbG9yOnt9fX0scmVjdEFyZWFMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2NvbG9yOnt9LHBvc2l0aW9uOnt9LHdpZHRoOnt9LGhlaWdodDp7fX19LGx0Y18xOnt2YWx1ZTpudWxsfSxsdGNfMjp7dmFsdWU6bnVsbH19LHBvaW50czp7ZGlmZnVzZTp7dmFsdWU6bmV3ICRRdCgxNjc3NzIxNSl9LG9wYWNpdHk6e3ZhbHVlOjF9LHNpemU6e3ZhbHVlOjF9LHNjYWxlOnt2YWx1ZToxfSxtYXA6e3ZhbHVlOm51bGx9LGFscGhhTWFwOnt2YWx1ZTpudWxsfSx1dlRyYW5zZm9ybTp7dmFsdWU6bmV3IGdKdH19LHNwcml0ZTp7ZGlmZnVzZTp7dmFsdWU6bmV3ICRRdCgxNjc3NzIxNSl9LG9wYWNpdHk6e3ZhbHVlOjF9LGNlbnRlcjp7dmFsdWU6bmV3IG1KdCguNSwuNSl9LHJvdGF0aW9uOnt2YWx1ZTowfSxtYXA6e3ZhbHVlOm51bGx9LGFscGhhTWFwOnt2YWx1ZTpudWxsfSx1dlRyYW5zZm9ybTp7dmFsdWU6bmV3IGdKdH19fSxjMHQ9e2Jhc2ljOnt1bmlmb3JtczpVMXQoW2wwdC5jb21tb24sbDB0LnNwZWN1bGFybWFwLGwwdC5lbnZtYXAsbDB0LmFvbWFwLGwwdC5saWdodG1hcCxsMHQuZm9nXSksdmVydGV4U2hhZGVyOnMwdC5tZXNoYmFzaWNfdmVydCxmcmFnbWVudFNoYWRlcjpzMHQubWVzaGJhc2ljX2ZyYWd9LGxhbWJlcnQ6e3VuaWZvcm1zOlUxdChbbDB0LmNvbW1vbixsMHQuc3BlY3VsYXJtYXAsbDB0LmVudm1hcCxsMHQuYW9tYXAsbDB0LmxpZ2h0bWFwLGwwdC5lbWlzc2l2ZW1hcCxsMHQuZm9nLGwwdC5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgJFF0KDApfX1dKSx2ZXJ0ZXhTaGFkZXI6czB0Lm1lc2hsYW1iZXJ0X3ZlcnQsZnJhZ21lbnRTaGFkZXI6czB0Lm1lc2hsYW1iZXJ0X2ZyYWd9LHBob25nOnt1bmlmb3JtczpVMXQoW2wwdC5jb21tb24sbDB0LnNwZWN1bGFybWFwLGwwdC5lbnZtYXAsbDB0LmFvbWFwLGwwdC5saWdodG1hcCxsMHQuZW1pc3NpdmVtYXAsbDB0LmJ1bXBtYXAsbDB0Lm5vcm1hbG1hcCxsMHQuZGlzcGxhY2VtZW50bWFwLGwwdC5mb2csbDB0LmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyAkUXQoMCl9LHNwZWN1bGFyOnt2YWx1ZTpuZXcgJFF0KDExMTg0ODEpfSxzaGluaW5lc3M6e3ZhbHVlOjMwfX1dKSx2ZXJ0ZXhTaGFkZXI6czB0Lm1lc2hwaG9uZ192ZXJ0LGZyYWdtZW50U2hhZGVyOnMwdC5tZXNocGhvbmdfZnJhZ30sc3RhbmRhcmQ6e3VuaWZvcm1zOlUxdChbbDB0LmNvbW1vbixsMHQuZW52bWFwLGwwdC5hb21hcCxsMHQubGlnaHRtYXAsbDB0LmVtaXNzaXZlbWFwLGwwdC5idW1wbWFwLGwwdC5ub3JtYWxtYXAsbDB0LmRpc3BsYWNlbWVudG1hcCxsMHQucm91Z2huZXNzbWFwLGwwdC5tZXRhbG5lc3NtYXAsbDB0LmZvZyxsMHQubGlnaHRzLHtlbWlzc2l2ZTp7dmFsdWU6bmV3ICRRdCgwKX0scm91Z2huZXNzOnt2YWx1ZToxfSxtZXRhbG5lc3M6e3ZhbHVlOjB9LGVudk1hcEludGVuc2l0eTp7dmFsdWU6MX19XSksdmVydGV4U2hhZGVyOnMwdC5tZXNocGh5c2ljYWxfdmVydCxmcmFnbWVudFNoYWRlcjpzMHQubWVzaHBoeXNpY2FsX2ZyYWd9LHRvb246e3VuaWZvcm1zOlUxdChbbDB0LmNvbW1vbixsMHQuYW9tYXAsbDB0LmxpZ2h0bWFwLGwwdC5lbWlzc2l2ZW1hcCxsMHQuYnVtcG1hcCxsMHQubm9ybWFsbWFwLGwwdC5kaXNwbGFjZW1lbnRtYXAsbDB0LmdyYWRpZW50bWFwLGwwdC5mb2csbDB0LmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyAkUXQoMCl9fV0pLHZlcnRleFNoYWRlcjpzMHQubWVzaHRvb25fdmVydCxmcmFnbWVudFNoYWRlcjpzMHQubWVzaHRvb25fZnJhZ30sbWF0Y2FwOnt1bmlmb3JtczpVMXQoW2wwdC5jb21tb24sbDB0LmJ1bXBtYXAsbDB0Lm5vcm1hbG1hcCxsMHQuZGlzcGxhY2VtZW50bWFwLGwwdC5mb2cse21hdGNhcDp7dmFsdWU6bnVsbH19XSksdmVydGV4U2hhZGVyOnMwdC5tZXNobWF0Y2FwX3ZlcnQsZnJhZ21lbnRTaGFkZXI6czB0Lm1lc2htYXRjYXBfZnJhZ30scG9pbnRzOnt1bmlmb3JtczpVMXQoW2wwdC5wb2ludHMsbDB0LmZvZ10pLHZlcnRleFNoYWRlcjpzMHQucG9pbnRzX3ZlcnQsZnJhZ21lbnRTaGFkZXI6czB0LnBvaW50c19mcmFnfSxkYXNoZWQ6e3VuaWZvcm1zOlUxdChbbDB0LmNvbW1vbixsMHQuZm9nLHtzY2FsZTp7dmFsdWU6MX0sZGFzaFNpemU6e3ZhbHVlOjF9LHRvdGFsU2l6ZTp7dmFsdWU6Mn19XSksdmVydGV4U2hhZGVyOnMwdC5saW5lZGFzaGVkX3ZlcnQsZnJhZ21lbnRTaGFkZXI6czB0LmxpbmVkYXNoZWRfZnJhZ30sZGVwdGg6e3VuaWZvcm1zOlUxdChbbDB0LmNvbW1vbixsMHQuZGlzcGxhY2VtZW50bWFwXSksdmVydGV4U2hhZGVyOnMwdC5kZXB0aF92ZXJ0LGZyYWdtZW50U2hhZGVyOnMwdC5kZXB0aF9mcmFnfSxub3JtYWw6e3VuaWZvcm1zOlUxdChbbDB0LmNvbW1vbixsMHQuYnVtcG1hcCxsMHQubm9ybWFsbWFwLGwwdC5kaXNwbGFjZW1lbnRtYXAse29wYWNpdHk6e3ZhbHVlOjF9fV0pLHZlcnRleFNoYWRlcjpzMHQubm9ybWFsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6czB0Lm5vcm1hbF9mcmFnfSxzcHJpdGU6e3VuaWZvcm1zOlUxdChbbDB0LnNwcml0ZSxsMHQuZm9nXSksdmVydGV4U2hhZGVyOnMwdC5zcHJpdGVfdmVydCxmcmFnbWVudFNoYWRlcjpzMHQuc3ByaXRlX2ZyYWd9LGJhY2tncm91bmQ6e3VuaWZvcm1zOnt1dlRyYW5zZm9ybTp7dmFsdWU6bmV3IGdKdH0sdDJEOnt2YWx1ZTpudWxsfX0sdmVydGV4U2hhZGVyOnMwdC5iYWNrZ3JvdW5kX3ZlcnQsZnJhZ21lbnRTaGFkZXI6czB0LmJhY2tncm91bmRfZnJhZ30sY3ViZTp7dW5pZm9ybXM6VTF0KFtsMHQuZW52bWFwLHtvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6czB0LmN1YmVfdmVydCxmcmFnbWVudFNoYWRlcjpzMHQuY3ViZV9mcmFnfSxlcXVpcmVjdDp7dW5pZm9ybXM6e3RFcXVpcmVjdDp7dmFsdWU6bnVsbH19LHZlcnRleFNoYWRlcjpzMHQuZXF1aXJlY3RfdmVydCxmcmFnbWVudFNoYWRlcjpzMHQuZXF1aXJlY3RfZnJhZ30sZGlzdGFuY2VSR0JBOnt1bmlmb3JtczpVMXQoW2wwdC5jb21tb24sbDB0LmRpc3BsYWNlbWVudG1hcCx7cmVmZXJlbmNlUG9zaXRpb246e3ZhbHVlOm5ldyBDSnR9LG5lYXJEaXN0YW5jZTp7dmFsdWU6MX0sZmFyRGlzdGFuY2U6e3ZhbHVlOjFlM319XSksdmVydGV4U2hhZGVyOnMwdC5kaXN0YW5jZVJHQkFfdmVydCxmcmFnbWVudFNoYWRlcjpzMHQuZGlzdGFuY2VSR0JBX2ZyYWd9LHNoYWRvdzp7dW5pZm9ybXM6VTF0KFtsMHQubGlnaHRzLGwwdC5mb2cse2NvbG9yOnt2YWx1ZTpuZXcgJFF0KDApfSxvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6czB0LnNoYWRvd192ZXJ0LGZyYWdtZW50U2hhZGVyOnMwdC5zaGFkb3dfZnJhZ319O2Z1bmN0aW9uIHUwdCh0LGUsbixpLHIpe2NvbnN0IG89bmV3ICRRdCgwKTtsZXQgYSxzLGw9MCxjPW51bGwsdT0wLGg9bnVsbDtmdW5jdGlvbiBkKHQsZSl7bi5idWZmZXJzLmNvbG9yLnNldENsZWFyKHQucix0LmcsdC5iLGUscil9cmV0dXJue2dldENsZWFyQ29sb3I6ZnVuY3Rpb24oKXtyZXR1cm4gb30sc2V0Q2xlYXJDb2xvcjpmdW5jdGlvbih0LGU9MSl7by5zZXQodCksbD1lLGQobyxsKX0sZ2V0Q2xlYXJBbHBoYTpmdW5jdGlvbigpe3JldHVybiBsfSxzZXRDbGVhckFscGhhOmZ1bmN0aW9uKHQpe2w9dCxkKG8sbCl9LHJlbmRlcjpmdW5jdGlvbiBwKG4scil7bGV0IHA9ITEsZj0hMD09PXIuaXNTY2VuZT9yLmJhY2tncm91bmQ6bnVsbDtmJiZmLmlzVGV4dHVyZSYmKGY9ZS5nZXQoZikpO2NvbnN0IG09dC54cixnPW0uZ2V0U2Vzc2lvbiYmbS5nZXRTZXNzaW9uKCk7ZyYmImFkZGl0aXZlIj09PWcuZW52aXJvbm1lbnRCbGVuZE1vZGUmJihmPW51bGwpLG51bGw9PT1mP2QobyxsKTpmJiZmLmlzQ29sb3ImJihkKGYsMSkscD0hMCksKHQuYXV0b0NsZWFyfHxwKSYmdC5jbGVhcih0LmF1dG9DbGVhckNvbG9yLHQuYXV0b0NsZWFyRGVwdGgsdC5hdXRvQ2xlYXJTdGVuY2lsKSxmJiYoZi5pc0N1YmVUZXh0dXJlfHxmLm1hcHBpbmc9PT1ZS3QpPyh2b2lkIDA9PT1zJiYocz1uZXcgQjF0KG5ldyBGMXQoMSwxLDEpLG5ldyBHMXQoe25hbWU6IkJhY2tncm91bmRDdWJlTWF0ZXJpYWwiLHVuaWZvcm1zOlYxdChjMHQuY3ViZS51bmlmb3JtcyksdmVydGV4U2hhZGVyOmMwdC5jdWJlLnZlcnRleFNoYWRlcixmcmFnbWVudFNoYWRlcjpjMHQuY3ViZS5mcmFnbWVudFNoYWRlcixzaWRlOjEsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsZm9nOiExfSkpLHMuZ2VvbWV0cnkuZGVsZXRlQXR0cmlidXRlKCJub3JtYWwiKSxzLmdlb21ldHJ5LmRlbGV0ZUF0dHJpYnV0ZSgidXYiKSxzLm9uQmVmb3JlUmVuZGVyPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLm1hdHJpeFdvcmxkLmNvcHlQb3NpdGlvbihuLm1hdHJpeFdvcmxkKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHMubWF0ZXJpYWwsImVudk1hcCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVuaWZvcm1zLmVudk1hcC52YWx1ZX19KSxpLnVwZGF0ZShzKSkscy5tYXRlcmlhbC51bmlmb3Jtcy5lbnZNYXAudmFsdWU9ZixzLm1hdGVyaWFsLnVuaWZvcm1zLmZsaXBFbnZNYXAudmFsdWU9Zi5pc0N1YmVUZXh0dXJlJiYhMT09PWYuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPy0xOjEsYz09PWYmJnU9PT1mLnZlcnNpb24mJmg9PT10LnRvbmVNYXBwaW5nfHwocy5tYXRlcmlhbC5uZWVkc1VwZGF0ZT0hMCxjPWYsdT1mLnZlcnNpb24saD10LnRvbmVNYXBwaW5nKSxuLnVuc2hpZnQocyxzLmdlb21ldHJ5LHMubWF0ZXJpYWwsMCwwLG51bGwpKTpmJiZmLmlzVGV4dHVyZSYmKHZvaWQgMD09PWEmJihhPW5ldyBCMXQobmV3IGEwdCgyLDIpLG5ldyBHMXQoe25hbWU6IkJhY2tncm91bmRNYXRlcmlhbCIsdW5pZm9ybXM6VjF0KGMwdC5iYWNrZ3JvdW5kLnVuaWZvcm1zKSx2ZXJ0ZXhTaGFkZXI6YzB0LmJhY2tncm91bmQudmVydGV4U2hhZGVyLGZyYWdtZW50U2hhZGVyOmMwdC5iYWNrZ3JvdW5kLmZyYWdtZW50U2hhZGVyLHNpZGU6MCxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSxmb2c6ITF9KSksYS5nZW9tZXRyeS5kZWxldGVBdHRyaWJ1dGUoIm5vcm1hbCIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLm1hdGVyaWFsLCJtYXAiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy50MkQudmFsdWV9fSksaS51cGRhdGUoYSkpLGEubWF0ZXJpYWwudW5pZm9ybXMudDJELnZhbHVlPWYsITA9PT1mLm1hdHJpeEF1dG9VcGRhdGUmJmYudXBkYXRlTWF0cml4KCksYS5tYXRlcmlhbC51bmlmb3Jtcy51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KGYubWF0cml4KSxjPT09ZiYmdT09PWYudmVyc2lvbiYmaD09PXQudG9uZU1hcHBpbmd8fChhLm1hdGVyaWFsLm5lZWRzVXBkYXRlPSEwLGM9Zix1PWYudmVyc2lvbixoPXQudG9uZU1hcHBpbmcpLG4udW5zaGlmdChhLGEuZ2VvbWV0cnksYS5tYXRlcmlhbCwwLDAsbnVsbCkpfX19ZnVuY3Rpb24gaDB0KHQsZSxuLGkpe2NvbnN0IHI9dC5nZXRQYXJhbWV0ZXIoMzQ5MjEpLG89aS5pc1dlYkdMMj9udWxsOmUuZ2V0KCJPRVNfdmVydGV4X2FycmF5X29iamVjdCIpLGE9aS5pc1dlYkdMMnx8bnVsbCE9PW8scz17fSxsPWQobnVsbCk7bGV0IGM9bDtmdW5jdGlvbiB1KGUpe3JldHVybiBpLmlzV2ViR0wyP3QuYmluZFZlcnRleEFycmF5KGUpOm8uYmluZFZlcnRleEFycmF5T0VTKGUpfWZ1bmN0aW9uIGgoZSl7cmV0dXJuIGkuaXNXZWJHTDI/dC5kZWxldGVWZXJ0ZXhBcnJheShlKTpvLmRlbGV0ZVZlcnRleEFycmF5T0VTKGUpfWZ1bmN0aW9uIGQodCl7Y29uc3QgZT1bXSxuPVtdLGk9W107Zm9yKGxldCB0PTA7dDxyO3QrKyllW3RdPTAsblt0XT0wLGlbdF09MDtyZXR1cm57Z2VvbWV0cnk6bnVsbCxwcm9ncmFtOm51bGwsd2lyZWZyYW1lOiExLG5ld0F0dHJpYnV0ZXM6ZSxlbmFibGVkQXR0cmlidXRlczpuLGF0dHJpYnV0ZURpdmlzb3JzOmksb2JqZWN0OnQsYXR0cmlidXRlczp7fSxpbmRleDpudWxsfX1mdW5jdGlvbiBwKCl7Y29uc3QgdD1jLm5ld0F0dHJpYnV0ZXM7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXRbZV09MH1mdW5jdGlvbiBmKHQpe20odCwwKX1mdW5jdGlvbiBtKG4scil7Y29uc3Qgbz1jLmVuYWJsZWRBdHRyaWJ1dGVzLGE9Yy5hdHRyaWJ1dGVEaXZpc29ycztjLm5ld0F0dHJpYnV0ZXNbbl09MSwwPT09b1tuXSYmKHQuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobiksb1tuXT0xKSxhW25dIT09ciYmKChpLmlzV2ViR0wyP3Q6ZS5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSlbaS5pc1dlYkdMMj8idmVydGV4QXR0cmliRGl2aXNvciI6InZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRSJdKG4sciksYVtuXT1yKX1mdW5jdGlvbiBnKCl7Y29uc3QgZT1jLm5ld0F0dHJpYnV0ZXMsbj1jLmVuYWJsZWRBdHRyaWJ1dGVzO2ZvcihsZXQgaT0wLHI9bi5sZW5ndGg7aTxyO2krKyluW2ldIT09ZVtpXSYmKHQuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGkpLG5baV09MCl9ZnVuY3Rpb24gXyhlLG4scixvLGEscyl7ITAhPT1pLmlzV2ViR0wyfHw1MTI0IT09ciYmNTEyNSE9PXI/dC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUsbixyLG8sYSxzKTp0LnZlcnRleEF0dHJpYklQb2ludGVyKGUsbixyLGEscyl9ZnVuY3Rpb24geSgpe3YoKSxjIT09bCYmKGM9bCx1KGMub2JqZWN0KSl9ZnVuY3Rpb24gdigpe2wuZ2VvbWV0cnk9bnVsbCxsLnByb2dyYW09bnVsbCxsLndpcmVmcmFtZT0hMX1yZXR1cm57c2V0dXA6ZnVuY3Rpb24gYihyLGwsaCx5LHYpe2xldCBiPSExO2lmKGEpe2NvbnN0IGU9KGZ1bmN0aW9uIHgoZSxuLHIpe2NvbnN0IGE9ITA9PT1yLndpcmVmcmFtZTtsZXQgbD1zW2UuaWRdO3ZvaWQgMD09PWwmJihsPXt9LHNbZS5pZF09bCk7bGV0IGM9bFtuLmlkXTt2b2lkIDA9PT1jJiYoYz17fSxsW24uaWRdPWMpO2xldCB1PWNbYV07cmV0dXJuIHZvaWQgMD09PXUmJih1PWQoKGZ1bmN0aW9uIGgoKXtyZXR1cm4gaS5pc1dlYkdMMj90LmNyZWF0ZVZlcnRleEFycmF5KCk6by5jcmVhdGVWZXJ0ZXhBcnJheU9FUygpfSkoKSksY1thXT11KSx1fSkoeSxoLGwpO2MhPT1lJiYoYz1lLHUoYy5vYmplY3QpKSxiPShmdW5jdGlvbiB3KHQsZSl7Y29uc3Qgbj1jLmF0dHJpYnV0ZXMsaT10LmF0dHJpYnV0ZXM7bGV0IHI9MDtmb3IoY29uc3QgdCBpbiBpKXtjb25zdCBlPW5bdF0sbz1pW3RdO2lmKHZvaWQgMD09PWUpcmV0dXJuITA7aWYoZS5hdHRyaWJ1dGUhPT1vKXJldHVybiEwO2lmKGUuZGF0YSE9PW8uZGF0YSlyZXR1cm4hMDtyKyt9cmV0dXJuIGMuYXR0cmlidXRlc051bSE9PXJ8fGMuaW5kZXghPT1lfSkoeSx2KSxiJiYoZnVuY3Rpb24gUyh0LGUpe2NvbnN0IG49e30saT10LmF0dHJpYnV0ZXM7bGV0IHI9MDtmb3IoY29uc3QgdCBpbiBpKXtjb25zdCBlPWlbdF0sbz17fTtvLmF0dHJpYnV0ZT1lLGUuZGF0YSYmKG8uZGF0YT1lLmRhdGEpLG5bdF09byxyKyt9Yy5hdHRyaWJ1dGVzPW4sYy5hdHRyaWJ1dGVzTnVtPXIsYy5pbmRleD1lfSkoeSx2KX1lbHNle2NvbnN0IHQ9ITA9PT1sLndpcmVmcmFtZTtjLmdlb21ldHJ5PT09eS5pZCYmYy5wcm9ncmFtPT09aC5pZCYmYy53aXJlZnJhbWU9PT10fHwoYy5nZW9tZXRyeT15LmlkLGMucHJvZ3JhbT1oLmlkLGMud2lyZWZyYW1lPXQsYj0hMCl9ITA9PT1yLmlzSW5zdGFuY2VkTWVzaCYmKGI9ITApLG51bGwhPT12JiZuLnVwZGF0ZSh2LDM0OTYzKSxiJiYoKGZ1bmN0aW9uIE0ocixvLGEscyl7aWYoITE9PT1pLmlzV2ViR0wyJiYoci5pc0luc3RhbmNlZE1lc2h8fHMuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSkmJm51bGw9PT1lLmdldCgiQU5HTEVfaW5zdGFuY2VkX2FycmF5cyIpKXJldHVybjtwKCk7Y29uc3QgbD1zLmF0dHJpYnV0ZXMsYz1hLmdldEF0dHJpYnV0ZXMoKSx1PW8uZGVmYXVsdEF0dHJpYnV0ZVZhbHVlcztmb3IoY29uc3QgZSBpbiBjKXtjb25zdCBpPWNbZV07aWYoaT49MCl7Y29uc3Qgbz1sW2VdO2lmKHZvaWQgMCE9PW8pe2NvbnN0IGU9by5ub3JtYWxpemVkLHI9by5pdGVtU2l6ZSxhPW4uZ2V0KG8pO2lmKHZvaWQgMD09PWEpY29udGludWU7Y29uc3QgbD1hLmJ1ZmZlcixjPWEudHlwZSx1PWEuYnl0ZXNQZXJFbGVtZW50O2lmKG8uaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSl7Y29uc3Qgbj1vLmRhdGEsYT1uLnN0cmlkZSxoPW8ub2Zmc2V0O24mJm4uaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcj8obShpLG4ubWVzaFBlckF0dHJpYnV0ZSksdm9pZCAwPT09cy5fbWF4SW5zdGFuY2VDb3VudCYmKHMuX21heEluc3RhbmNlQ291bnQ9bi5tZXNoUGVyQXR0cmlidXRlKm4uY291bnQpKTpmKGkpLHQuYmluZEJ1ZmZlcigzNDk2MixsKSxfKGkscixjLGUsYSp1LGgqdSl9ZWxzZSBvLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlPyhtKGksby5tZXNoUGVyQXR0cmlidXRlKSx2b2lkIDA9PT1zLl9tYXhJbnN0YW5jZUNvdW50JiYocy5fbWF4SW5zdGFuY2VDb3VudD1vLm1lc2hQZXJBdHRyaWJ1dGUqby5jb3VudCkpOmYoaSksdC5iaW5kQnVmZmVyKDM0OTYyLGwpLF8oaSxyLGMsZSwwLDApfWVsc2UgaWYoImluc3RhbmNlTWF0cml4Ij09PWUpe2NvbnN0IGU9bi5nZXQoci5pbnN0YW5jZU1hdHJpeCk7aWYodm9pZCAwPT09ZSljb250aW51ZTtjb25zdCBvPWUuYnVmZmVyLGE9ZS50eXBlO20oaSswLDEpLG0oaSsxLDEpLG0oaSsyLDEpLG0oaSszLDEpLHQuYmluZEJ1ZmZlcigzNDk2MixvKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIoaSswLDQsYSwhMSw2NCwwKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIoaSsxLDQsYSwhMSw2NCwxNiksdC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGkrMiw0LGEsITEsNjQsMzIpLHQudmVydGV4QXR0cmliUG9pbnRlcihpKzMsNCxhLCExLDY0LDQ4KX1lbHNlIGlmKCJpbnN0YW5jZUNvbG9yIj09PWUpe2NvbnN0IGU9bi5nZXQoci5pbnN0YW5jZUNvbG9yKTtpZih2b2lkIDA9PT1lKWNvbnRpbnVlO2NvbnN0IG89ZS5idWZmZXIsYT1lLnR5cGU7bShpLDEpLHQuYmluZEJ1ZmZlcigzNDk2MixvKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIoaSwzLGEsITEsMTIsMCl9ZWxzZSBpZih2b2lkIDAhPT11KXtjb25zdCBuPXVbZV07aWYodm9pZCAwIT09bilzd2l0Y2gobi5sZW5ndGgpe2Nhc2UgMjp0LnZlcnRleEF0dHJpYjJmdihpLG4pO2JyZWFrO2Nhc2UgMzp0LnZlcnRleEF0dHJpYjNmdihpLG4pO2JyZWFrO2Nhc2UgNDp0LnZlcnRleEF0dHJpYjRmdihpLG4pO2JyZWFrO2RlZmF1bHQ6dC52ZXJ0ZXhBdHRyaWIxZnYoaSxuKX19fX1nKCl9KShyLGwsaCx5KSxudWxsIT09diYmdC5iaW5kQnVmZmVyKDM0OTYzLG4uZ2V0KHYpLmJ1ZmZlcikpfSxyZXNldDp5LHJlc2V0RGVmYXVsdFN0YXRlOnYsZGlzcG9zZTpmdW5jdGlvbiB4KCl7eSgpO2Zvcihjb25zdCB0IGluIHMpe2NvbnN0IGU9c1t0XTtmb3IoY29uc3QgdCBpbiBlKXtjb25zdCBuPWVbdF07Zm9yKGNvbnN0IHQgaW4gbiloKG5bdF0ub2JqZWN0KSxkZWxldGUgblt0XTtkZWxldGUgZVt0XX1kZWxldGUgc1t0XX19LHJlbGVhc2VTdGF0ZXNPZkdlb21ldHJ5OmZ1bmN0aW9uIHcodCl7aWYodm9pZCAwPT09c1t0LmlkXSlyZXR1cm47Y29uc3QgZT1zW3QuaWRdO2Zvcihjb25zdCB0IGluIGUpe2NvbnN0IG49ZVt0XTtmb3IoY29uc3QgdCBpbiBuKWgoblt0XS5vYmplY3QpLGRlbGV0ZSBuW3RdO2RlbGV0ZSBlW3RdfWRlbGV0ZSBzW3QuaWRdfSxyZWxlYXNlU3RhdGVzT2ZQcm9ncmFtOmZ1bmN0aW9uIFModCl7Zm9yKGNvbnN0IGUgaW4gcyl7Y29uc3Qgbj1zW2VdO2lmKHZvaWQgMD09PW5bdC5pZF0pY29udGludWU7Y29uc3QgaT1uW3QuaWRdO2Zvcihjb25zdCB0IGluIGkpaChpW3RdLm9iamVjdCksZGVsZXRlIGlbdF07ZGVsZXRlIG5bdC5pZF19fSxpbml0QXR0cmlidXRlczpwLGVuYWJsZUF0dHJpYnV0ZTpmLGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzOmd9fWZ1bmN0aW9uIGQwdCh0LGUsbixpKXtjb25zdCByPWkuaXNXZWJHTDI7bGV0IG87dGhpcy5zZXRNb2RlPWZ1bmN0aW9uIGEodCl7bz10fSx0aGlzLnJlbmRlcj1mdW5jdGlvbiBzKGUsaSl7dC5kcmF3QXJyYXlzKG8sZSxpKSxuLnVwZGF0ZShpLG8sMSl9LHRoaXMucmVuZGVySW5zdGFuY2VzPWZ1bmN0aW9uIGwoaSxhLHMpe2lmKDA9PT1zKXJldHVybjtsZXQgbCxjO2lmKHIpbD10LGM9ImRyYXdBcnJheXNJbnN0YW5jZWQiO2Vsc2UgaWYobD1lLmdldCgiQU5HTEVfaW5zdGFuY2VkX2FycmF5cyIpLGM9ImRyYXdBcnJheXNJbnN0YW5jZWRBTkdMRSIsbnVsbD09PWwpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7bFtjXShvLGksYSxzKSxuLnVwZGF0ZShhLG8scyl9fWZ1bmN0aW9uIHAwdCh0LGUsbil7bGV0IGk7ZnVuY3Rpb24gcihlKXtpZigiaGlnaHAiPT09ZSl7aWYodC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoMzU2MzMsMzYzMzgpLnByZWNpc2lvbj4wJiZ0LmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCgzNTYzMiwzNjMzOCkucHJlY2lzaW9uPjApcmV0dXJuImhpZ2hwIjtlPSJtZWRpdW1wIn1yZXR1cm4ibWVkaXVtcCI9PT1lJiZ0LmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCgzNTYzMywzNjMzNykucHJlY2lzaW9uPjAmJnQuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMyLDM2MzM3KS5wcmVjaXNpb24+MD8ibWVkaXVtcCI6Imxvd3AifWNvbnN0IG89InVuZGVmaW5lZCIhPXR5cGVvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0JiZ0IGluc3RhbmNlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dHx8InVuZGVmaW5lZCIhPXR5cGVvZiBXZWJHTDJDb21wdXRlUmVuZGVyaW5nQ29udGV4dCYmdCBpbnN0YW5jZW9mIFdlYkdMMkNvbXB1dGVSZW5kZXJpbmdDb250ZXh0O2xldCBhPXZvaWQgMCE9PW4ucHJlY2lzaW9uP24ucHJlY2lzaW9uOiJoaWdocCI7Y29uc3Qgcz1yKGEpO3MhPT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiIsYSwibm90IHN1cHBvcnRlZCwgdXNpbmciLHMsImluc3RlYWQuIiksYT1zKTtjb25zdCBsPW98fGUuaGFzKCJXRUJHTF9kcmF3X2J1ZmZlcnMiKSxjPSEwPT09bi5sb2dhcml0aG1pY0RlcHRoQnVmZmVyLHU9dC5nZXRQYXJhbWV0ZXIoMzQ5MzApLGg9dC5nZXRQYXJhbWV0ZXIoMzU2NjApLGQ9dC5nZXRQYXJhbWV0ZXIoMzM3OSkscD10LmdldFBhcmFtZXRlcigzNDA3NiksZj10LmdldFBhcmFtZXRlcigzNDkyMSksbT10LmdldFBhcmFtZXRlcigzNjM0NyksZz10LmdldFBhcmFtZXRlcigzNjM0OCksXz10LmdldFBhcmFtZXRlcigzNjM0OSkseT1oPjAsdj1vfHxlLmhhcygiT0VTX3RleHR1cmVfZmxvYXQiKTtyZXR1cm57aXNXZWJHTDI6byxkcmF3QnVmZmVyczpsLGdldE1heEFuaXNvdHJvcHk6ZnVuY3Rpb24gYigpe2lmKHZvaWQgMCE9PWkpcmV0dXJuIGk7aWYoITA9PT1lLmhhcygiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIikpe2NvbnN0IG49ZS5nZXQoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpO2k9dC5nZXRQYXJhbWV0ZXIobi5NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQpfWVsc2UgaT0wO3JldHVybiBpfSxnZXRNYXhQcmVjaXNpb246cixwcmVjaXNpb246YSxsb2dhcml0aG1pY0RlcHRoQnVmZmVyOmMsbWF4VGV4dHVyZXM6dSxtYXhWZXJ0ZXhUZXh0dXJlczpoLG1heFRleHR1cmVTaXplOmQsbWF4Q3ViZW1hcFNpemU6cCxtYXhBdHRyaWJ1dGVzOmYsbWF4VmVydGV4VW5pZm9ybXM6bSxtYXhWYXJ5aW5nczpnLG1heEZyYWdtZW50VW5pZm9ybXM6Xyx2ZXJ0ZXhUZXh0dXJlczp5LGZsb2F0RnJhZ21lbnRUZXh0dXJlczp2LGZsb2F0VmVydGV4VGV4dHVyZXM6eSYmdixtYXhTYW1wbGVzOm8/dC5nZXRQYXJhbWV0ZXIoMzYxODMpOjB9fWZ1bmN0aW9uIGYwdCh0KXtjb25zdCBlPXRoaXM7bGV0IG49bnVsbCxpPTAscj0hMSxvPSExO2NvbnN0IGE9bmV3IHQwdCxzPW5ldyBnSnQsbD17dmFsdWU6bnVsbCxuZWVkc1VwZGF0ZTohMX07ZnVuY3Rpb24gYygpe2wudmFsdWUhPT1uJiYobC52YWx1ZT1uLGwubmVlZHNVcGRhdGU9aT4wKSxlLm51bVBsYW5lcz1pLGUubnVtSW50ZXJzZWN0aW9uPTB9ZnVuY3Rpb24gdSh0LG4saSxyKXtjb25zdCBvPW51bGwhPT10P3QubGVuZ3RoOjA7bGV0IGM9bnVsbDtpZigwIT09byl7aWYoYz1sLnZhbHVlLCEwIT09cnx8bnVsbD09PWMpe2NvbnN0IGU9aSs0Km8scj1uLm1hdHJpeFdvcmxkSW52ZXJzZTtzLmdldE5vcm1hbE1hdHJpeChyKSwobnVsbD09PWN8fGMubGVuZ3RoPGUpJiYoYz1uZXcgRmxvYXQzMkFycmF5KGUpKTtmb3IobGV0IGU9MCxuPWk7ZSE9PW87KytlLG4rPTQpYS5jb3B5KHRbZV0pLmFwcGx5TWF0cml4NChyLHMpLGEubm9ybWFsLnRvQXJyYXkoYyxuKSxjW24rM109YS5jb25zdGFudH1sLnZhbHVlPWMsbC5uZWVkc1VwZGF0ZT0hMH1yZXR1cm4gZS5udW1QbGFuZXM9byxlLm51bUludGVyc2VjdGlvbj0wLGN9dGhpcy51bmlmb3JtPWwsdGhpcy5udW1QbGFuZXM9MCx0aGlzLm51bUludGVyc2VjdGlvbj0wLHRoaXMuaW5pdD1mdW5jdGlvbih0LGUsbyl7Y29uc3QgYT0wIT09dC5sZW5ndGh8fGV8fDAhPT1pfHxyO3JldHVybiByPWUsbj11KHQsbywwKSxpPXQubGVuZ3RoLGF9LHRoaXMuYmVnaW5TaGFkb3dzPWZ1bmN0aW9uKCl7bz0hMCx1KG51bGwpfSx0aGlzLmVuZFNoYWRvd3M9ZnVuY3Rpb24oKXtvPSExLGMoKX0sdGhpcy5zZXRTdGF0ZT1mdW5jdGlvbihlLGEscyl7Y29uc3QgaD1lLmNsaXBwaW5nUGxhbmVzLGQ9ZS5jbGlwSW50ZXJzZWN0aW9uLHA9ZS5jbGlwU2hhZG93cyxmPXQuZ2V0KGUpO2lmKCFyfHxudWxsPT09aHx8MD09PWgubGVuZ3RofHxvJiYhcClvP3UobnVsbCk6YygpO2Vsc2V7Y29uc3QgdD1vPzA6aSxlPTQqdDtsZXQgcj1mLmNsaXBwaW5nU3RhdGV8fG51bGw7bC52YWx1ZT1yLHI9dShoLGEsZSxzKTtmb3IobGV0IHQ9MDt0IT09ZTsrK3Qpclt0XT1uW3RdO2YuY2xpcHBpbmdTdGF0ZT1yLHRoaXMubnVtSW50ZXJzZWN0aW9uPWQ/dGhpcy5udW1QbGFuZXM6MCx0aGlzLm51bVBsYW5lcys9dH19fWZ1bmN0aW9uIG0wdCh0KXtsZXQgZT1uZXcgV2Vha01hcDtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGU9PT1XS3Q/dC5tYXBwaW5nPWpLdDplPT09cUt0JiYodC5tYXBwaW5nPUdLdCksdH1mdW5jdGlvbiBpKHQpe2NvbnN0IG49dC50YXJnZXQ7bi5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixpKTtjb25zdCByPWUuZ2V0KG4pO3ZvaWQgMCE9PXImJihlLmRlbGV0ZShuKSxyLmRpc3Bvc2UoKSl9cmV0dXJue2dldDpmdW5jdGlvbiByKG8pe2lmKG8mJm8uaXNUZXh0dXJlJiYhMT09PW8uaXNSZW5kZXJUYXJnZXRUZXh0dXJlKXtjb25zdCByPW8ubWFwcGluZztpZihyPT09V0t0fHxyPT09cUt0KXtpZihlLmhhcyhvKSlyZXR1cm4gbihlLmdldChvKS50ZXh0dXJlLG8ubWFwcGluZyk7e2NvbnN0IHI9by5pbWFnZTtpZihyJiZyLmhlaWdodD4wKXtjb25zdCBhPXQuZ2V0UmVuZGVyVGFyZ2V0KCkscz1uZXcgSzF0KHIuaGVpZ2h0LzIpO3JldHVybiBzLmZyb21FcXVpcmVjdGFuZ3VsYXJUZXh0dXJlKHQsbyksZS5zZXQobyxzKSx0LnNldFJlbmRlclRhcmdldChhKSxvLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGkpLG4ocy50ZXh0dXJlLG8ubWFwcGluZyl9cmV0dXJuIG51bGx9fX1yZXR1cm4gb30sZGlzcG9zZTpmdW5jdGlvbiBvKCl7ZT1uZXcgV2Vha01hcH19fWMwdC5waHlzaWNhbD17dW5pZm9ybXM6VTF0KFtjMHQuc3RhbmRhcmQudW5pZm9ybXMse2NsZWFyY29hdDp7dmFsdWU6MH0sY2xlYXJjb2F0TWFwOnt2YWx1ZTpudWxsfSxjbGVhcmNvYXRSb3VnaG5lc3M6e3ZhbHVlOjB9LGNsZWFyY29hdFJvdWdobmVzc01hcDp7dmFsdWU6bnVsbH0sY2xlYXJjb2F0Tm9ybWFsU2NhbGU6e3ZhbHVlOm5ldyBtSnQoMSwxKX0sY2xlYXJjb2F0Tm9ybWFsTWFwOnt2YWx1ZTpudWxsfSxzaGVlbjp7dmFsdWU6bmV3ICRRdCgwKX0sdHJhbnNtaXNzaW9uOnt2YWx1ZTowfSx0cmFuc21pc3Npb25NYXA6e3ZhbHVlOm51bGx9LHRyYW5zbWlzc2lvblNhbXBsZXJTaXplOnt2YWx1ZTpuZXcgbUp0fSx0cmFuc21pc3Npb25TYW1wbGVyTWFwOnt2YWx1ZTpudWxsfSx0aGlja25lc3M6e3ZhbHVlOjB9LHRoaWNrbmVzc01hcDp7dmFsdWU6bnVsbH0sYXR0ZW51YXRpb25EaXN0YW5jZTp7dmFsdWU6MH0sYXR0ZW51YXRpb25UaW50Ont2YWx1ZTpuZXcgJFF0KDApfSxzcGVjdWxhckludGVuc2l0eTp7dmFsdWU6MH0sc3BlY3VsYXJJbnRlbnNpdHlNYXA6e3ZhbHVlOm51bGx9LHNwZWN1bGFyVGludDp7dmFsdWU6bmV3ICRRdCgxLDEsMSl9LHNwZWN1bGFyVGludE1hcDp7dmFsdWU6bnVsbH19XSksdmVydGV4U2hhZGVyOnMwdC5tZXNocGh5c2ljYWxfdmVydCxmcmFnbWVudFNoYWRlcjpzMHQubWVzaHBoeXNpY2FsX2ZyYWd9O2NsYXNzIGcwdCBleHRlbmRzIFcxdHtjb25zdHJ1Y3Rvcih0PS0xLGU9MSxuPTEsaT0tMSxyPS4xLG89MmUzKXtzdXBlcigpLHRoaXMudHlwZT0iT3J0aG9ncmFwaGljQ2FtZXJhIix0aGlzLnpvb209MSx0aGlzLnZpZXc9bnVsbCx0aGlzLmxlZnQ9dCx0aGlzLnJpZ2h0PWUsdGhpcy50b3A9bix0aGlzLmJvdHRvbT1pLHRoaXMubmVhcj1yLHRoaXMuZmFyPW8sdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5sZWZ0PXQubGVmdCx0aGlzLnJpZ2h0PXQucmlnaHQsdGhpcy50b3A9dC50b3AsdGhpcy5ib3R0b209dC5ib3R0b20sdGhpcy5uZWFyPXQubmVhcix0aGlzLmZhcj10LmZhcix0aGlzLnpvb209dC56b29tLHRoaXMudmlldz1udWxsPT09dC52aWV3P251bGw6T2JqZWN0LmFzc2lnbih7fSx0LnZpZXcpLHRoaXN9c2V0Vmlld09mZnNldCh0LGUsbixpLHIsbyl7bnVsbD09PXRoaXMudmlldyYmKHRoaXMudmlldz17ZW5hYmxlZDohMCxmdWxsV2lkdGg6MSxmdWxsSGVpZ2h0OjEsb2Zmc2V0WDowLG9mZnNldFk6MCx3aWR0aDoxLGhlaWdodDoxfSksdGhpcy52aWV3LmVuYWJsZWQ9ITAsdGhpcy52aWV3LmZ1bGxXaWR0aD10LHRoaXMudmlldy5mdWxsSGVpZ2h0PWUsdGhpcy52aWV3Lm9mZnNldFg9bix0aGlzLnZpZXcub2Zmc2V0WT1pLHRoaXMudmlldy53aWR0aD1yLHRoaXMudmlldy5oZWlnaHQ9byx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1jbGVhclZpZXdPZmZzZXQoKXtudWxsIT09dGhpcy52aWV3JiYodGhpcy52aWV3LmVuYWJsZWQ9ITEpLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfXVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKXtjb25zdCB0PSh0aGlzLnJpZ2h0LXRoaXMubGVmdCkvKDIqdGhpcy56b29tKSxlPSh0aGlzLnRvcC10aGlzLmJvdHRvbSkvKDIqdGhpcy56b29tKSxuPSh0aGlzLnJpZ2h0K3RoaXMubGVmdCkvMixpPSh0aGlzLnRvcCt0aGlzLmJvdHRvbSkvMjtsZXQgcj1uLXQsbz1uK3QsYT1pK2Uscz1pLWU7aWYobnVsbCE9PXRoaXMudmlldyYmdGhpcy52aWV3LmVuYWJsZWQpe2NvbnN0IHQ9KHRoaXMucmlnaHQtdGhpcy5sZWZ0KS90aGlzLnZpZXcuZnVsbFdpZHRoL3RoaXMuem9vbSxlPSh0aGlzLnRvcC10aGlzLmJvdHRvbSkvdGhpcy52aWV3LmZ1bGxIZWlnaHQvdGhpcy56b29tO3IrPXQqdGhpcy52aWV3Lm9mZnNldFgsbz1yK3QqdGhpcy52aWV3LndpZHRoLGEtPWUqdGhpcy52aWV3Lm9mZnNldFkscz1hLWUqdGhpcy52aWV3LmhlaWdodH10aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZU9ydGhvZ3JhcGhpYyhyLG8sYSxzLHRoaXMubmVhcix0aGlzLmZhciksdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMucHJvamVjdGlvbk1hdHJpeCkuaW52ZXJ0KCl9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO3JldHVybiBlLm9iamVjdC56b29tPXRoaXMuem9vbSxlLm9iamVjdC5sZWZ0PXRoaXMubGVmdCxlLm9iamVjdC5yaWdodD10aGlzLnJpZ2h0LGUub2JqZWN0LnRvcD10aGlzLnRvcCxlLm9iamVjdC5ib3R0b209dGhpcy5ib3R0b20sZS5vYmplY3QubmVhcj10aGlzLm5lYXIsZS5vYmplY3QuZmFyPXRoaXMuZmFyLG51bGwhPT10aGlzLnZpZXcmJihlLm9iamVjdC52aWV3PU9iamVjdC5hc3NpZ24oe30sdGhpcy52aWV3KSksZX19ZzB0LnByb3RvdHlwZS5pc09ydGhvZ3JhcGhpY0NhbWVyYT0hMDtjbGFzcyBfMHQgZXh0ZW5kcyBHMXR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy50eXBlPSJSYXdTaGFkZXJNYXRlcmlhbCJ9fV8wdC5wcm90b3R5cGUuaXNSYXdTaGFkZXJNYXRlcmlhbD0hMDtjb25zdCB5MHQ9TWF0aC5wb3coMiw4KSx2MHQ9Wy4xMjUsLjIxNSwuMzUsLjQ0NiwuNTI2LC41ODJdLGIwdD01K3YwdC5sZW5ndGgseDB0PXtbTlp0XTowLFtJWnRdOjEsW09adF06Mixbelp0XTozLFtEWnRdOjQsW0JadF06NSxbUlp0XTo2fSx3MHQ9bmV3IEtRdCh7c2lkZToxLGRlcHRoV3JpdGU6ITEsZGVwdGhUZXN0OiExfSksUzB0PW5ldyBCMXQobmV3IEYxdCx3MHQpLE0wdD1uZXcgZzB0LHtfbG9kUGxhbmVzOkUwdCxfc2l6ZUxvZHM6VDB0LF9zaWdtYXM6QzB0fT16MHQoKSxBMHQ9bmV3ICRRdDtsZXQgazB0PW51bGw7Y29uc3QgTDB0PSgxK01hdGguc3FydCg1KSkvMixQMHQ9MS9MMHQsTjB0PVtuZXcgQ0p0KDEsMSwxKSxuZXcgQ0p0KC0xLDEsMSksbmV3IENKdCgxLDEsLTEpLG5ldyBDSnQoLTEsMSwtMSksbmV3IENKdCgwLEwwdCxQMHQpLG5ldyBDSnQoMCxMMHQsLVAwdCksbmV3IENKdChQMHQsMCxMMHQpLG5ldyBDSnQoLVAwdCwwLEwwdCksbmV3IENKdChMMHQsUDB0LDApLG5ldyBDSnQoLUwwdCxQMHQsMCldO2Z1bmN0aW9uIEkwdCh0KXtjb25zdCBlPU1hdGgubWF4KHQucix0LmcsdC5iKSxuPU1hdGgubWluKE1hdGgubWF4KE1hdGguY2VpbChNYXRoLmxvZzIoZSkpLC0xMjgpLDEyNyk7cmV0dXJuIHQubXVsdGlwbHlTY2FsYXIoTWF0aC5wb3coMiwtbikpLChuKzEyOCkvMjU1fWNsYXNzIFIwdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9yZW5kZXJlcj10LHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0PW51bGwsdGhpcy5fYmx1ck1hdGVyaWFsPShmdW5jdGlvbiBlKHQpe2NvbnN0IGU9bmV3IEZsb2F0MzJBcnJheSh0KSxuPW5ldyBDSnQoMCwxLDApO3JldHVybiBuZXcgXzB0KHtuYW1lOiJTcGhlcmljYWxHYXVzc2lhbkJsdXIiLGRlZmluZXM6e246dH0sdW5pZm9ybXM6e2Vudk1hcDp7dmFsdWU6bnVsbH0sc2FtcGxlczp7dmFsdWU6MX0sd2VpZ2h0czp7dmFsdWU6ZX0sbGF0aXR1ZGluYWw6e3ZhbHVlOiExfSxkVGhldGE6e3ZhbHVlOjB9LG1pcEludDp7dmFsdWU6MH0scG9sZUF4aXM6e3ZhbHVlOm59LGlucHV0RW5jb2Rpbmc6e3ZhbHVlOngwdFszZTNdfSxvdXRwdXRFbmNvZGluZzp7dmFsdWU6eDB0WzNlM119fSx2ZXJ0ZXhTaGFkZXI6IlxuXG5cdFx0cHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cdFx0cHJlY2lzaW9uIG1lZGl1bXAgaW50O1xuXG5cdFx0YXR0cmlidXRlIHZlYzMgcG9zaXRpb247XG5cdFx0YXR0cmlidXRlIHZlYzIgdXY7XG5cdFx0YXR0cmlidXRlIGZsb2F0IGZhY2VJbmRleDtcblxuXHRcdHZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uO1xuXG5cdFx0Ly8gUkggY29vcmRpbmF0ZSBzeXN0ZW07IFBNUkVNIGZhY2UtaW5kZXhpbmcgY29udmVudGlvblxuXHRcdHZlYzMgZ2V0RGlyZWN0aW9uKCB2ZWMyIHV2LCBmbG9hdCBmYWNlICkge1xuXG5cdFx0XHR1diA9IDIuMCAqIHV2IC0gMS4wO1xuXG5cdFx0XHR2ZWMzIGRpcmVjdGlvbiA9IHZlYzMoIHV2LCAxLjAgKTtcblxuXHRcdFx0aWYgKCBmYWNlID09IDAuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24uenl4OyAvLyAoIDEsIHYsIHUgKSBwb3MgeFxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDEuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24ueHp5O1xuXHRcdFx0XHRkaXJlY3Rpb24ueHogKj0gLTEuMDsgLy8gKCAtdSwgMSwgLXYgKSBwb3MgeVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDIuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24ueCAqPSAtMS4wOyAvLyAoIC11LCB2LCAxICkgcG9zIHpcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSAzLjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnp5eDtcblx0XHRcdFx0ZGlyZWN0aW9uLnh6ICo9IC0xLjA7IC8vICggLTEsIHYsIC11ICkgbmVnIHhcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSA0LjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnh6eTtcblx0XHRcdFx0ZGlyZWN0aW9uLnh5ICo9IC0xLjA7IC8vICggLXUsIC0xLCB2ICkgbmVnIHlcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSA1LjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uLnogKj0gLTEuMDsgLy8gKCB1LCB2LCAtMSApIG5lZyB6XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRpcmVjdGlvbjtcblxuXHRcdH1cblxuXHRcdHZvaWQgbWFpbigpIHtcblxuXHRcdFx0dk91dHB1dERpcmVjdGlvbiA9IGdldERpcmVjdGlvbiggdXYsIGZhY2VJbmRleCApO1xuXHRcdFx0Z2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XG5cblx0XHR9XG5cdCIsZnJhZ21lbnRTaGFkZXI6IlxuXG5cdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblx0XHRcdHByZWNpc2lvbiBtZWRpdW1wIGludDtcblxuXHRcdFx0dmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247XG5cblx0XHRcdHVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDtcblx0XHRcdHVuaWZvcm0gaW50IHNhbXBsZXM7XG5cdFx0XHR1bmlmb3JtIGZsb2F0IHdlaWdodHNbIG4gXTtcblx0XHRcdHVuaWZvcm0gYm9vbCBsYXRpdHVkaW5hbDtcblx0XHRcdHVuaWZvcm0gZmxvYXQgZFRoZXRhO1xuXHRcdFx0dW5pZm9ybSBmbG9hdCBtaXBJbnQ7XG5cdFx0XHR1bmlmb3JtIHZlYzMgcG9sZUF4aXM7XG5cblx0XHRcdFxuXG5cdFx0dW5pZm9ybSBpbnQgaW5wdXRFbmNvZGluZztcblx0XHR1bmlmb3JtIGludCBvdXRwdXRFbmNvZGluZztcblxuXHRcdCNpbmNsdWRlIDxlbmNvZGluZ3NfcGFyc19mcmFnbWVudD5cblxuXHRcdHZlYzQgaW5wdXRUZXhlbFRvTGluZWFyKCB2ZWM0IHZhbHVlICkge1xuXG5cdFx0XHRpZiAoIGlucHV0RW5jb2RpbmcgPT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gMSApIHtcblxuXHRcdFx0XHRyZXR1cm4gc1JHQlRvTGluZWFyKCB2YWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDIgKSB7XG5cblx0XHRcdFx0cmV0dXJuIFJHQkVUb0xpbmVhciggdmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW5wdXRFbmNvZGluZyA9PSAzICkge1xuXG5cdFx0XHRcdHJldHVybiBSR0JNVG9MaW5lYXIoIHZhbHVlLCA3LjAgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW5wdXRFbmNvZGluZyA9PSA0ICkge1xuXG5cdFx0XHRcdHJldHVybiBSR0JNVG9MaW5lYXIoIHZhbHVlLCAxNi4wICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gNSApIHtcblxuXHRcdFx0XHRyZXR1cm4gUkdCRFRvTGluZWFyKCB2YWx1ZSwgMjU2LjAgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZXR1cm4gR2FtbWFUb0xpbmVhciggdmFsdWUsIDIuMiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2ZWM0IGxpbmVhclRvT3V0cHV0VGV4ZWwoIHZlYzQgdmFsdWUgKSB7XG5cblx0XHRcdGlmICggb3V0cHV0RW5jb2RpbmcgPT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDEgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvc1JHQiggdmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gMiApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9SR0JFKCB2YWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvdXRwdXRFbmNvZGluZyA9PSAzICkge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb1JHQk0oIHZhbHVlLCA3LjAgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gNCApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9SR0JNKCB2YWx1ZSwgMTYuMCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvdXRwdXRFbmNvZGluZyA9PSA1ICkge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb1JHQkQoIHZhbHVlLCAyNTYuMCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb0dhbW1hKCB2YWx1ZSwgMi4yICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZlYzQgZW52TWFwVGV4ZWxUb0xpbmVhciggdmVjNCBjb2xvciApIHtcblxuXHRcdFx0cmV0dXJuIGlucHV0VGV4ZWxUb0xpbmVhciggY29sb3IgKTtcblxuXHRcdH1cblx0XG5cblx0XHRcdCNkZWZpbmUgRU5WTUFQX1RZUEVfQ1VCRV9VVlxuXHRcdFx0I2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cblxuXHRcdFx0dmVjMyBnZXRTYW1wbGUoIGZsb2F0IHRoZXRhLCB2ZWMzIGF4aXMgKSB7XG5cblx0XHRcdFx0ZmxvYXQgY29zVGhldGEgPSBjb3MoIHRoZXRhICk7XG5cdFx0XHRcdC8vIFJvZHJpZ3VlcycgYXhpcy1hbmdsZSByb3RhdGlvblxuXHRcdFx0XHR2ZWMzIHNhbXBsZURpcmVjdGlvbiA9IHZPdXRwdXREaXJlY3Rpb24gKiBjb3NUaGV0YVxuXHRcdFx0XHRcdCsgY3Jvc3MoIGF4aXMsIHZPdXRwdXREaXJlY3Rpb24gKSAqIHNpbiggdGhldGEgKVxuXHRcdFx0XHRcdCsgYXhpcyAqIGRvdCggYXhpcywgdk91dHB1dERpcmVjdGlvbiApICogKCAxLjAgLSBjb3NUaGV0YSApO1xuXG5cdFx0XHRcdHJldHVybiBiaWxpbmVhckN1YmVVViggZW52TWFwLCBzYW1wbGVEaXJlY3Rpb24sIG1pcEludCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZvaWQgbWFpbigpIHtcblxuXHRcdFx0XHR2ZWMzIGF4aXMgPSBsYXRpdHVkaW5hbCA/IHBvbGVBeGlzIDogY3Jvc3MoIHBvbGVBeGlzLCB2T3V0cHV0RGlyZWN0aW9uICk7XG5cblx0XHRcdFx0aWYgKCBhbGwoIGVxdWFsKCBheGlzLCB2ZWMzKCAwLjAgKSApICkgKSB7XG5cblx0XHRcdFx0XHRheGlzID0gdmVjMyggdk91dHB1dERpcmVjdGlvbi56LCAwLjAsIC0gdk91dHB1dERpcmVjdGlvbi54ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF4aXMgPSBub3JtYWxpemUoIGF4aXMgKTtcblxuXHRcdFx0XHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTtcblx0XHRcdFx0Z2xfRnJhZ0NvbG9yLnJnYiArPSB3ZWlnaHRzWyAwIF0gKiBnZXRTYW1wbGUoIDAuMCwgYXhpcyApO1xuXG5cdFx0XHRcdGZvciAoIGludCBpID0gMTsgaSA8IG47IGkrKyApIHtcblxuXHRcdFx0XHRcdGlmICggaSA+PSBzYW1wbGVzICkge1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGZsb2F0IHRoZXRhID0gZFRoZXRhICogZmxvYXQoIGkgKTtcblx0XHRcdFx0XHRnbF9GcmFnQ29sb3IucmdiICs9IHdlaWdodHNbIGkgXSAqIGdldFNhbXBsZSggLTEuMCAqIHRoZXRhLCBheGlzICk7XG5cdFx0XHRcdFx0Z2xfRnJhZ0NvbG9yLnJnYiArPSB3ZWlnaHRzWyBpIF0gKiBnZXRTYW1wbGUoIHRoZXRhLCBheGlzICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGdsX0ZyYWdDb2xvciA9IGxpbmVhclRvT3V0cHV0VGV4ZWwoIGdsX0ZyYWdDb2xvciApO1xuXG5cdFx0XHR9XG5cdFx0IixibGVuZGluZzowLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExfSl9KSgyMCksdGhpcy5fZXF1aXJlY3RTaGFkZXI9bnVsbCx0aGlzLl9jdWJlbWFwU2hhZGVyPW51bGwsdGhpcy5fY29tcGlsZU1hdGVyaWFsKHRoaXMuX2JsdXJNYXRlcmlhbCl9ZnJvbVNjZW5lKHQsZT0wLG49LjEsaT0xMDApe2swdD10aGlzLl9yZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtjb25zdCByPXRoaXMuX2FsbG9jYXRlVGFyZ2V0cygpO3JldHVybiB0aGlzLl9zY2VuZVRvQ3ViZVVWKHQsbixpLHIpLGU+MCYmdGhpcy5fYmx1cihyLDAsMCxlKSx0aGlzLl9hcHBseVBNUkVNKHIpLHRoaXMuX2NsZWFudXAocikscn1mcm9tRXF1aXJlY3Rhbmd1bGFyKHQpe3JldHVybiB0aGlzLl9mcm9tVGV4dHVyZSh0KX1mcm9tQ3ViZW1hcCh0KXtyZXR1cm4gdGhpcy5fZnJvbVRleHR1cmUodCl9Y29tcGlsZUN1YmVtYXBTaGFkZXIoKXtudWxsPT09dGhpcy5fY3ViZW1hcFNoYWRlciYmKHRoaXMuX2N1YmVtYXBTaGFkZXI9RjB0KCksdGhpcy5fY29tcGlsZU1hdGVyaWFsKHRoaXMuX2N1YmVtYXBTaGFkZXIpKX1jb21waWxlRXF1aXJlY3Rhbmd1bGFyU2hhZGVyKCl7bnVsbD09PXRoaXMuX2VxdWlyZWN0U2hhZGVyJiYodGhpcy5fZXF1aXJlY3RTaGFkZXI9SDB0KCksdGhpcy5fY29tcGlsZU1hdGVyaWFsKHRoaXMuX2VxdWlyZWN0U2hhZGVyKSl9ZGlzcG9zZSgpe3RoaXMuX2JsdXJNYXRlcmlhbC5kaXNwb3NlKCksbnVsbCE9PXRoaXMuX2N1YmVtYXBTaGFkZXImJnRoaXMuX2N1YmVtYXBTaGFkZXIuZGlzcG9zZSgpLG51bGwhPT10aGlzLl9lcXVpcmVjdFNoYWRlciYmdGhpcy5fZXF1aXJlY3RTaGFkZXIuZGlzcG9zZSgpO2ZvcihsZXQgdD0wO3Q8RTB0Lmxlbmd0aDt0KyspRTB0W3RdLmRpc3Bvc2UoKX1fY2xlYW51cCh0KXt0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldC5kaXNwb3NlKCksdGhpcy5fcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KGswdCksdC5zY2lzc29yVGVzdD0hMSxCMHQodCwwLDAsdC53aWR0aCx0LmhlaWdodCl9X2Zyb21UZXh0dXJlKHQpe2swdD10aGlzLl9yZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtjb25zdCBlPXRoaXMuX2FsbG9jYXRlVGFyZ2V0cyh0KTtyZXR1cm4gdGhpcy5fdGV4dHVyZVRvQ3ViZVVWKHQsZSksdGhpcy5fYXBwbHlQTVJFTShlKSx0aGlzLl9jbGVhbnVwKGUpLGV9X2FsbG9jYXRlVGFyZ2V0cyh0KXtjb25zdCBlPXttYWdGaWx0ZXI6Skt0LG1pbkZpbHRlcjpKS3QsZ2VuZXJhdGVNaXBtYXBzOiExLHR5cGU6clp0LGZvcm1hdDoxMDIzLGVuY29kaW5nOk8wdCh0KT90LmVuY29kaW5nOk9adCxkZXB0aEJ1ZmZlcjohMX0sbj1EMHQoZSk7cmV0dXJuIG4uZGVwdGhCdWZmZXI9IXQsdGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQ9RDB0KGUpLG59X2NvbXBpbGVNYXRlcmlhbCh0KXtjb25zdCBlPW5ldyBCMXQoRTB0WzBdLHQpO3RoaXMuX3JlbmRlcmVyLmNvbXBpbGUoZSxNMHQpfV9zY2VuZVRvQ3ViZVVWKHQsZSxuLGkpe2NvbnN0IHI9bmV3IHExdCg5MCwxLGUsbiksbz1bMSwtMSwxLDEsMSwxXSxhPVsxLDEsMSwtMSwtMSwtMV0scz10aGlzLl9yZW5kZXJlcixsPXMuYXV0b0NsZWFyLGM9cy5vdXRwdXRFbmNvZGluZyx1PXMudG9uZU1hcHBpbmc7cy5nZXRDbGVhckNvbG9yKEEwdCkscy50b25lTWFwcGluZz0wLHMub3V0cHV0RW5jb2Rpbmc9Tlp0LHMuYXV0b0NsZWFyPSExO2xldCBoPSExO2NvbnN0IGQ9dC5iYWNrZ3JvdW5kO2lmKGQpe2lmKGQuaXNDb2xvcil7dzB0LmNvbG9yLmNvcHkoZCkuY29udmVydFNSR0JUb0xpbmVhcigpLHQuYmFja2dyb3VuZD1udWxsO2NvbnN0IGU9STB0KHcwdC5jb2xvcik7dzB0Lm9wYWNpdHk9ZSxoPSEwfX1lbHNle3cwdC5jb2xvci5jb3B5KEEwdCkuY29udmVydFNSR0JUb0xpbmVhcigpO2NvbnN0IHQ9STB0KHcwdC5jb2xvcik7dzB0Lm9wYWNpdHk9dCxoPSEwfWZvcihsZXQgZT0wO2U8NjtlKyspe2NvbnN0IG49ZSUzOzA9PW4/KHIudXAuc2V0KDAsb1tlXSwwKSxyLmxvb2tBdChhW2VdLDAsMCkpOjE9PW4/KHIudXAuc2V0KDAsMCxvW2VdKSxyLmxvb2tBdCgwLGFbZV0sMCkpOihyLnVwLnNldCgwLG9bZV0sMCksci5sb29rQXQoMCwwLGFbZV0pKSxCMHQoaSxuKnkwdCxlPjI/eTB0OjAseTB0LHkwdCkscy5zZXRSZW5kZXJUYXJnZXQoaSksaCYmcy5yZW5kZXIoUzB0LHIpLHMucmVuZGVyKHQscil9cy50b25lTWFwcGluZz11LHMub3V0cHV0RW5jb2Rpbmc9YyxzLmF1dG9DbGVhcj1sfV90ZXh0dXJlVG9DdWJlVVYodCxlKXtjb25zdCBuPXRoaXMuX3JlbmRlcmVyO3QuaXNDdWJlVGV4dHVyZT9udWxsPT10aGlzLl9jdWJlbWFwU2hhZGVyJiYodGhpcy5fY3ViZW1hcFNoYWRlcj1GMHQoKSk6bnVsbD09dGhpcy5fZXF1aXJlY3RTaGFkZXImJih0aGlzLl9lcXVpcmVjdFNoYWRlcj1IMHQoKSk7Y29uc3QgaT10LmlzQ3ViZVRleHR1cmU/dGhpcy5fY3ViZW1hcFNoYWRlcjp0aGlzLl9lcXVpcmVjdFNoYWRlcixyPW5ldyBCMXQoRTB0WzBdLGkpLG89aS51bmlmb3JtcztvLmVudk1hcC52YWx1ZT10LHQuaXNDdWJlVGV4dHVyZXx8by50ZXhlbFNpemUudmFsdWUuc2V0KDEvdC5pbWFnZS53aWR0aCwxL3QuaW1hZ2UuaGVpZ2h0KSxvLmlucHV0RW5jb2RpbmcudmFsdWU9eDB0W3QuZW5jb2RpbmddLG8ub3V0cHV0RW5jb2RpbmcudmFsdWU9eDB0W2UudGV4dHVyZS5lbmNvZGluZ10sQjB0KGUsMCwwLDMqeTB0LDIqeTB0KSxuLnNldFJlbmRlclRhcmdldChlKSxuLnJlbmRlcihyLE0wdCl9X2FwcGx5UE1SRU0odCl7Y29uc3QgZT10aGlzLl9yZW5kZXJlcixuPWUuYXV0b0NsZWFyO2UuYXV0b0NsZWFyPSExO2ZvcihsZXQgZT0xO2U8YjB0O2UrKyl7Y29uc3Qgbj1NYXRoLnNxcnQoQzB0W2VdKkMwdFtlXS1DMHRbZS0xXSpDMHRbZS0xXSk7dGhpcy5fYmx1cih0LGUtMSxlLG4sTjB0WyhlLTEpJU4wdC5sZW5ndGhdKX1lLmF1dG9DbGVhcj1ufV9ibHVyKHQsZSxuLGkscil7Y29uc3Qgbz10aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldDt0aGlzLl9oYWxmQmx1cih0LG8sZSxuLGksImxhdGl0dWRpbmFsIixyKSx0aGlzLl9oYWxmQmx1cihvLHQsbixuLGksImxvbmdpdHVkaW5hbCIscil9X2hhbGZCbHVyKHQsZSxuLGkscixvLGEpe2NvbnN0IHM9dGhpcy5fcmVuZGVyZXIsbD10aGlzLl9ibHVyTWF0ZXJpYWw7ImxhdGl0dWRpbmFsIiE9PW8mJiJsb25naXR1ZGluYWwiIT09byYmY29uc29sZS5lcnJvcigiYmx1ciBkaXJlY3Rpb24gbXVzdCBiZSBlaXRoZXIgbGF0aXR1ZGluYWwgb3IgbG9uZ2l0dWRpbmFsISIpO2NvbnN0IGM9bmV3IEIxdChFMHRbaV0sbCksdT1sLnVuaWZvcm1zLGg9VDB0W25dLTEsZD1pc0Zpbml0ZShyKT9NYXRoLlBJLygyKmgpOjIqTWF0aC5QSS8zOSxwPXIvZCxmPWlzRmluaXRlKHIpPzErTWF0aC5mbG9vcigzKnApOjIwO2Y+MjAmJmNvbnNvbGUud2Fybihgc2lnbWFSYWRpYW5zLCAke3J9LCBpcyB0b28gbGFyZ2UgYW5kIHdpbGwgY2xpcCwgYXMgaXQgcmVxdWVzdGVkICR7Zn0gc2FtcGxlcyB3aGVuIHRoZSBtYXhpbXVtIGlzIHNldCB0byAyMGApO2NvbnN0IG09W107bGV0IGc9MDtmb3IobGV0IHQ9MDt0PDIwOysrdCl7Y29uc3QgZT10L3Asbj1NYXRoLmV4cCgtZSplLzIpO20ucHVzaChuKSwwPT10P2crPW46dDxmJiYoZys9MipuKX1mb3IobGV0IHQ9MDt0PG0ubGVuZ3RoO3QrKyltW3RdPW1bdF0vZzt1LmVudk1hcC52YWx1ZT10LnRleHR1cmUsdS5zYW1wbGVzLnZhbHVlPWYsdS53ZWlnaHRzLnZhbHVlPW0sdS5sYXRpdHVkaW5hbC52YWx1ZT0ibGF0aXR1ZGluYWwiPT09byxhJiYodS5wb2xlQXhpcy52YWx1ZT1hKSx1LmRUaGV0YS52YWx1ZT1kLHUubWlwSW50LnZhbHVlPTgtbix1LmlucHV0RW5jb2RpbmcudmFsdWU9eDB0W3QudGV4dHVyZS5lbmNvZGluZ10sdS5vdXRwdXRFbmNvZGluZy52YWx1ZT14MHRbdC50ZXh0dXJlLmVuY29kaW5nXTtjb25zdCBfPVQwdFtpXTtCMHQoZSwzKk1hdGgubWF4KDAseTB0LTIqXyksKDA9PT1pPzA6Mip5MHQpKzIqXyooaT40P2ktOCs0OjApLDMqXywyKl8pLHMuc2V0UmVuZGVyVGFyZ2V0KGUpLHMucmVuZGVyKGMsTTB0KX19ZnVuY3Rpb24gTzB0KHQpe3JldHVybiB2b2lkIDAhPT10JiZ0LnR5cGU9PT1yWnQmJih0LmVuY29kaW5nPT09Tlp0fHx0LmVuY29kaW5nPT09SVp0fHx0LmVuY29kaW5nPT09Ulp0KX1mdW5jdGlvbiB6MHQoKXtjb25zdCB0PVtdLGU9W10sbj1bXTtsZXQgaT04O2ZvcihsZXQgcj0wO3I8YjB0O3IrKyl7Y29uc3Qgbz1NYXRoLnBvdygyLGkpO2UucHVzaChvKTtsZXQgYT0xL287cj40P2E9djB0W3ItOCs0LTFdOjA9PXImJihhPTApLG4ucHVzaChhKTtjb25zdCBzPTEvKG8tMSksbD0tcy8yLGM9MStzLzIsdT1bbCxsLGMsbCxjLGMsbCxsLGMsYyxsLGNdLGg9NixkPTYscD0zLGY9MixtPTEsZz1uZXcgRmxvYXQzMkFycmF5KHAqZCpoKSxfPW5ldyBGbG9hdDMyQXJyYXkoZipkKmgpLHk9bmV3IEZsb2F0MzJBcnJheShtKmQqaCk7Zm9yKGxldCB0PTA7dDxoO3QrKyl7Y29uc3QgZT10JTMqMi8zLTEsbj10PjI/MDotMTtnLnNldChbZSxuLDAsZSsyLzMsbiwwLGUrMi8zLG4rMSwwLGUsbiwwLGUrMi8zLG4rMSwwLGUsbisxLDBdLHAqZCp0KSxfLnNldCh1LGYqZCp0KSx5LnNldChbdCx0LHQsdCx0LHRdLG0qZCp0KX1jb25zdCB2PW5ldyBiMXQ7di5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgUVF0KGcscCkpLHYuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFFRdChfLGYpKSx2LnNldEF0dHJpYnV0ZSgiZmFjZUluZGV4IixuZXcgUVF0KHksbSkpLHQucHVzaCh2KSxpPjQmJmktLX1yZXR1cm57X2xvZFBsYW5lczp0LF9zaXplTG9kczplLF9zaWdtYXM6bn19ZnVuY3Rpb24gRDB0KHQpe2NvbnN0IGU9bmV3IFNKdCgzKnkwdCwzKnkwdCx0KTtyZXR1cm4gZS50ZXh0dXJlLm1hcHBpbmc9WUt0LGUudGV4dHVyZS5uYW1lPSJQTVJFTS5jdWJlVXYiLGUuc2Npc3NvclRlc3Q9ITAsZX1mdW5jdGlvbiBCMHQodCxlLG4saSxyKXt0LnZpZXdwb3J0LnNldChlLG4saSxyKSx0LnNjaXNzb3Iuc2V0KGUsbixpLHIpfWZ1bmN0aW9uIEgwdCgpe2NvbnN0IHQ9bmV3IG1KdCgxLDEpO3JldHVybiBuZXcgXzB0KHtuYW1lOiJFcXVpcmVjdGFuZ3VsYXJUb0N1YmVVViIsdW5pZm9ybXM6e2Vudk1hcDp7dmFsdWU6bnVsbH0sdGV4ZWxTaXplOnt2YWx1ZTp0fSxpbnB1dEVuY29kaW5nOnt2YWx1ZTp4MHRbM2UzXX0sb3V0cHV0RW5jb2Rpbmc6e3ZhbHVlOngwdFszZTNdfX0sdmVydGV4U2hhZGVyOiJcblxuXHRcdHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXHRcdHByZWNpc2lvbiBtZWRpdW1wIGludDtcblxuXHRcdGF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uO1xuXHRcdGF0dHJpYnV0ZSB2ZWMyIHV2O1xuXHRcdGF0dHJpYnV0ZSBmbG9hdCBmYWNlSW5kZXg7XG5cblx0XHR2YXJ5aW5nIHZlYzMgdk91dHB1dERpcmVjdGlvbjtcblxuXHRcdC8vIFJIIGNvb3JkaW5hdGUgc3lzdGVtOyBQTVJFTSBmYWNlLWluZGV4aW5nIGNvbnZlbnRpb25cblx0XHR2ZWMzIGdldERpcmVjdGlvbiggdmVjMiB1diwgZmxvYXQgZmFjZSApIHtcblxuXHRcdFx0dXYgPSAyLjAgKiB1diAtIDEuMDtcblxuXHRcdFx0dmVjMyBkaXJlY3Rpb24gPSB2ZWMzKCB1diwgMS4wICk7XG5cblx0XHRcdGlmICggZmFjZSA9PSAwLjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnp5eDsgLy8gKCAxLCB2LCB1ICkgcG9zIHhcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSAxLjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnh6eTtcblx0XHRcdFx0ZGlyZWN0aW9uLnh6ICo9IC0xLjA7IC8vICggLXUsIDEsIC12ICkgcG9zIHlcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSAyLjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uLnggKj0gLTEuMDsgLy8gKCAtdSwgdiwgMSApIHBvcyB6XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMy4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi56eXg7XG5cdFx0XHRcdGRpcmVjdGlvbi54eiAqPSAtMS4wOyAvLyAoIC0xLCB2LCAtdSApIG5lZyB4XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gNC4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi54enk7XG5cdFx0XHRcdGRpcmVjdGlvbi54eSAqPSAtMS4wOyAvLyAoIC11LCAtMSwgdiApIG5lZyB5XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gNS4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbi56ICo9IC0xLjA7IC8vICggdSwgdiwgLTEgKSBuZWcgelxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkaXJlY3Rpb247XG5cblx0XHR9XG5cblx0XHR2b2lkIG1haW4oKSB7XG5cblx0XHRcdHZPdXRwdXREaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oIHV2LCBmYWNlSW5kZXggKTtcblx0XHRcdGdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24sIDEuMCApO1xuXG5cdFx0fVxuXHQiLGZyYWdtZW50U2hhZGVyOiJcblxuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBpbnQ7XG5cblx0XHRcdHZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uO1xuXG5cdFx0XHR1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7XG5cdFx0XHR1bmlmb3JtIHZlYzIgdGV4ZWxTaXplO1xuXG5cdFx0XHRcblxuXHRcdHVuaWZvcm0gaW50IGlucHV0RW5jb2Rpbmc7XG5cdFx0dW5pZm9ybSBpbnQgb3V0cHV0RW5jb2Rpbmc7XG5cblx0XHQjaW5jbHVkZSA8ZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ+XG5cblx0XHR2ZWM0IGlucHV0VGV4ZWxUb0xpbmVhciggdmVjNCB2YWx1ZSApIHtcblxuXHRcdFx0aWYgKCBpbnB1dEVuY29kaW5nID09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDEgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHNSR0JUb0xpbmVhciggdmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW5wdXRFbmNvZGluZyA9PSAyICkge1xuXG5cdFx0XHRcdHJldHVybiBSR0JFVG9MaW5lYXIoIHZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gMyApIHtcblxuXHRcdFx0XHRyZXR1cm4gUkdCTVRvTGluZWFyKCB2YWx1ZSwgNy4wICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gNCApIHtcblxuXHRcdFx0XHRyZXR1cm4gUkdCTVRvTGluZWFyKCB2YWx1ZSwgMTYuMCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIFJHQkRUb0xpbmVhciggdmFsdWUsIDI1Ni4wICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIEdhbW1hVG9MaW5lYXIoIHZhbHVlLCAyLjIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmVjNCBsaW5lYXJUb091dHB1dFRleGVsKCB2ZWM0IHZhbHVlICkge1xuXG5cdFx0XHRpZiAoIG91dHB1dEVuY29kaW5nID09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvdXRwdXRFbmNvZGluZyA9PSAxICkge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb3NSR0IoIHZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDIgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvUkdCRSggdmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gMyApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9SR0JNKCB2YWx1ZSwgNy4wICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvUkdCTSggdmFsdWUsIDE2LjAgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gNSApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9SR0JEKCB2YWx1ZSwgMjU2LjAgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9HYW1tYSggdmFsdWUsIDIuMiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2ZWM0IGVudk1hcFRleGVsVG9MaW5lYXIoIHZlYzQgY29sb3IgKSB7XG5cblx0XHRcdHJldHVybiBpbnB1dFRleGVsVG9MaW5lYXIoIGNvbG9yICk7XG5cblx0XHR9XG5cdFxuXG5cdFx0XHQjaW5jbHVkZSA8Y29tbW9uPlxuXG5cdFx0XHR2b2lkIG1haW4oKSB7XG5cblx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7XG5cblx0XHRcdFx0dmVjMyBvdXRwdXREaXJlY3Rpb24gPSBub3JtYWxpemUoIHZPdXRwdXREaXJlY3Rpb24gKTtcblx0XHRcdFx0dmVjMiB1diA9IGVxdWlyZWN0VXYoIG91dHB1dERpcmVjdGlvbiApO1xuXG5cdFx0XHRcdHZlYzIgZiA9IGZyYWN0KCB1diAvIHRleGVsU2l6ZSAtIDAuNSApO1xuXHRcdFx0XHR1diAtPSBmICogdGV4ZWxTaXplO1xuXHRcdFx0XHR2ZWMzIHRsID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEICggZW52TWFwLCB1diApICkucmdiO1xuXHRcdFx0XHR1di54ICs9IHRleGVsU2l6ZS54O1xuXHRcdFx0XHR2ZWMzIHRyID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEICggZW52TWFwLCB1diApICkucmdiO1xuXHRcdFx0XHR1di55ICs9IHRleGVsU2l6ZS55O1xuXHRcdFx0XHR2ZWMzIGJyID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEICggZW52TWFwLCB1diApICkucmdiO1xuXHRcdFx0XHR1di54IC09IHRleGVsU2l6ZS54O1xuXHRcdFx0XHR2ZWMzIGJsID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEICggZW52TWFwLCB1diApICkucmdiO1xuXG5cdFx0XHRcdHZlYzMgdG0gPSBtaXgoIHRsLCB0ciwgZi54ICk7XG5cdFx0XHRcdHZlYzMgYm0gPSBtaXgoIGJsLCBiciwgZi54ICk7XG5cdFx0XHRcdGdsX0ZyYWdDb2xvci5yZ2IgPSBtaXgoIHRtLCBibSwgZi55ICk7XG5cblx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbCggZ2xfRnJhZ0NvbG9yICk7XG5cblx0XHRcdH1cblx0XHQiLGJsZW5kaW5nOjAsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITF9KX1mdW5jdGlvbiBGMHQoKXtyZXR1cm4gbmV3IF8wdCh7bmFtZToiQ3ViZW1hcFRvQ3ViZVVWIix1bmlmb3Jtczp7ZW52TWFwOnt2YWx1ZTpudWxsfSxpbnB1dEVuY29kaW5nOnt2YWx1ZTp4MHRbM2UzXX0sb3V0cHV0RW5jb2Rpbmc6e3ZhbHVlOngwdFszZTNdfX0sdmVydGV4U2hhZGVyOiJcblxuXHRcdHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXHRcdHByZWNpc2lvbiBtZWRpdW1wIGludDtcblxuXHRcdGF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uO1xuXHRcdGF0dHJpYnV0ZSB2ZWMyIHV2O1xuXHRcdGF0dHJpYnV0ZSBmbG9hdCBmYWNlSW5kZXg7XG5cblx0XHR2YXJ5aW5nIHZlYzMgdk91dHB1dERpcmVjdGlvbjtcblxuXHRcdC8vIFJIIGNvb3JkaW5hdGUgc3lzdGVtOyBQTVJFTSBmYWNlLWluZGV4aW5nIGNvbnZlbnRpb25cblx0XHR2ZWMzIGdldERpcmVjdGlvbiggdmVjMiB1diwgZmxvYXQgZmFjZSApIHtcblxuXHRcdFx0dXYgPSAyLjAgKiB1diAtIDEuMDtcblxuXHRcdFx0dmVjMyBkaXJlY3Rpb24gPSB2ZWMzKCB1diwgMS4wICk7XG5cblx0XHRcdGlmICggZmFjZSA9PSAwLjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnp5eDsgLy8gKCAxLCB2LCB1ICkgcG9zIHhcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSAxLjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnh6eTtcblx0XHRcdFx0ZGlyZWN0aW9uLnh6ICo9IC0xLjA7IC8vICggLXUsIDEsIC12ICkgcG9zIHlcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSAyLjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uLnggKj0gLTEuMDsgLy8gKCAtdSwgdiwgMSApIHBvcyB6XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMy4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi56eXg7XG5cdFx0XHRcdGRpcmVjdGlvbi54eiAqPSAtMS4wOyAvLyAoIC0xLCB2LCAtdSApIG5lZyB4XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gNC4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi54enk7XG5cdFx0XHRcdGRpcmVjdGlvbi54eSAqPSAtMS4wOyAvLyAoIC11LCAtMSwgdiApIG5lZyB5XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gNS4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbi56ICo9IC0xLjA7IC8vICggdSwgdiwgLTEgKSBuZWcgelxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkaXJlY3Rpb247XG5cblx0XHR9XG5cblx0XHR2b2lkIG1haW4oKSB7XG5cblx0XHRcdHZPdXRwdXREaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oIHV2LCBmYWNlSW5kZXggKTtcblx0XHRcdGdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24sIDEuMCApO1xuXG5cdFx0fVxuXHQiLGZyYWdtZW50U2hhZGVyOiJcblxuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBpbnQ7XG5cblx0XHRcdHZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uO1xuXG5cdFx0XHR1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcblxuXHRcdFx0XG5cblx0XHR1bmlmb3JtIGludCBpbnB1dEVuY29kaW5nO1xuXHRcdHVuaWZvcm0gaW50IG91dHB1dEVuY29kaW5nO1xuXG5cdFx0I2luY2x1ZGUgPGVuY29kaW5nc19wYXJzX2ZyYWdtZW50PlxuXG5cdFx0dmVjNCBpbnB1dFRleGVsVG9MaW5lYXIoIHZlYzQgdmFsdWUgKSB7XG5cblx0XHRcdGlmICggaW5wdXRFbmNvZGluZyA9PSAwICkge1xuXG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW5wdXRFbmNvZGluZyA9PSAxICkge1xuXG5cdFx0XHRcdHJldHVybiBzUkdCVG9MaW5lYXIoIHZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gMiApIHtcblxuXHRcdFx0XHRyZXR1cm4gUkdCRVRvTGluZWFyKCB2YWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDMgKSB7XG5cblx0XHRcdFx0cmV0dXJuIFJHQk1Ub0xpbmVhciggdmFsdWUsIDcuMCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIFJHQk1Ub0xpbmVhciggdmFsdWUsIDE2LjAgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW5wdXRFbmNvZGluZyA9PSA1ICkge1xuXG5cdFx0XHRcdHJldHVybiBSR0JEVG9MaW5lYXIoIHZhbHVlLCAyNTYuMCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBHYW1tYVRvTGluZWFyKCB2YWx1ZSwgMi4yICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZlYzQgbGluZWFyVG9PdXRwdXRUZXhlbCggdmVjNCB2YWx1ZSApIHtcblxuXHRcdFx0aWYgKCBvdXRwdXRFbmNvZGluZyA9PSAwICkge1xuXG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gMSApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9zUkdCKCB2YWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvdXRwdXRFbmNvZGluZyA9PSAyICkge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb1JHQkUoIHZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDMgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvUkdCTSggdmFsdWUsIDcuMCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvdXRwdXRFbmNvZGluZyA9PSA0ICkge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb1JHQk0oIHZhbHVlLCAxNi4wICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvUkdCRCggdmFsdWUsIDI1Ni4wICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvR2FtbWEoIHZhbHVlLCAyLjIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmVjNCBlbnZNYXBUZXhlbFRvTGluZWFyKCB2ZWM0IGNvbG9yICkge1xuXG5cdFx0XHRyZXR1cm4gaW5wdXRUZXhlbFRvTGluZWFyKCBjb2xvciApO1xuXG5cdFx0fVxuXHRcblxuXHRcdFx0dm9pZCBtYWluKCkge1xuXG5cdFx0XHRcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIDAuMCwgMC4wLCAwLjAsIDEuMCApO1xuXHRcdFx0XHRnbF9GcmFnQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZUN1YmUoIGVudk1hcCwgdmVjMyggLSB2T3V0cHV0RGlyZWN0aW9uLngsIHZPdXRwdXREaXJlY3Rpb24ueXogKSApICkucmdiO1xuXHRcdFx0XHRnbF9GcmFnQ29sb3IgPSBsaW5lYXJUb091dHB1dFRleGVsKCBnbF9GcmFnQ29sb3IgKTtcblxuXHRcdFx0fVxuXHRcdCIsYmxlbmRpbmc6MCxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMX0pfWZ1bmN0aW9uIFYwdCh0KXtsZXQgZT1uZXcgV2Vha01hcCxuPW51bGw7ZnVuY3Rpb24gaSh0KXtjb25zdCBuPXQudGFyZ2V0O24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsaSk7Y29uc3Qgcj1lLmdldChuKTt2b2lkIDAhPT1yJiYoci5kZWxldGUobiksci5kaXNwb3NlKCkpfXJldHVybntnZXQ6ZnVuY3Rpb24gcihvKXtpZihvJiZvLmlzVGV4dHVyZSYmITE9PT1vLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSl7Y29uc3Qgcj1vLm1hcHBpbmcsYT1yPT09V0t0fHxyPT09cUt0LHM9cj09PWpLdHx8cj09PUdLdDtpZihhfHxzKXtpZihlLmhhcyhvKSlyZXR1cm4gZS5nZXQobykudGV4dHVyZTt7Y29uc3Qgcj1vLmltYWdlO2lmKGEmJnImJnIuaGVpZ2h0PjB8fHMmJnImJihmdW5jdGlvbiBhKHQpe2xldCBlPTA7Zm9yKGxldCBuPTA7bjw2O24rKyl2b2lkIDAhPT10W25dJiZlKys7cmV0dXJuIDY9PT1lfSkocikpe2NvbnN0IHI9dC5nZXRSZW5kZXJUYXJnZXQoKTtudWxsPT09biYmKG49bmV3IFIwdCh0KSk7Y29uc3Qgcz1hP24uZnJvbUVxdWlyZWN0YW5ndWxhcihvKTpuLmZyb21DdWJlbWFwKG8pO3JldHVybiBlLnNldChvLHMpLHQuc2V0UmVuZGVyVGFyZ2V0KHIpLG8uYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsaSkscy50ZXh0dXJlfXJldHVybiBudWxsfX19cmV0dXJuIG99LGRpc3Bvc2U6ZnVuY3Rpb24gbygpe2U9bmV3IFdlYWtNYXAsbnVsbCE9PW4mJihuLmRpc3Bvc2UoKSxuPW51bGwpfX19ZnVuY3Rpb24gVTB0KHQpe2NvbnN0IGU9e307ZnVuY3Rpb24gbihuKXtpZih2b2lkIDAhPT1lW25dKXJldHVybiBlW25dO2xldCBpO3N3aXRjaChuKXtjYXNlIldFQkdMX2RlcHRoX3RleHR1cmUiOmk9dC5nZXRFeHRlbnNpb24oIldFQkdMX2RlcHRoX3RleHR1cmUiKXx8dC5nZXRFeHRlbnNpb24oIk1PWl9XRUJHTF9kZXB0aF90ZXh0dXJlIil8fHQuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfV0VCR0xfZGVwdGhfdGV4dHVyZSIpO2JyZWFrO2Nhc2UiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIjppPXQuZ2V0RXh0ZW5zaW9uKCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKXx8dC5nZXRFeHRlbnNpb24oIk1PWl9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKXx8dC5nZXRFeHRlbnNpb24oIldFQktJVF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTticmVhaztjYXNlIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIjppPXQuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpfHx0LmdldEV4dGVuc2lvbigiTU9aX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fHQuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKTticmVhaztjYXNlIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyI6aT10LmdldEV4dGVuc2lvbigiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIil8fHQuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIik7YnJlYWs7ZGVmYXVsdDppPXQuZ2V0RXh0ZW5zaW9uKG4pfXJldHVybiBlW25dPWksaX1yZXR1cm57aGFzOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09bih0KX0saW5pdDpmdW5jdGlvbih0KXt0LmlzV2ViR0wyP24oIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKToobigiV0VCR0xfZGVwdGhfdGV4dHVyZSIpLG4oIk9FU190ZXh0dXJlX2Zsb2F0IiksbigiT0VTX3RleHR1cmVfaGFsZl9mbG9hdCIpLG4oIk9FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyIiksbigiT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIiksbigiT0VTX2VsZW1lbnRfaW5kZXhfdWludCIpLG4oIk9FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0IiksbigiQU5HTEVfaW5zdGFuY2VkX2FycmF5cyIpKSxuKCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKSxuKCJFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQiKX0sZ2V0OmZ1bmN0aW9uKHQpe2NvbnN0IGU9bih0KTtyZXR1cm4gbnVsbD09PWUmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogIit0KyIgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQuIiksZX19fWZ1bmN0aW9uIGowdCh0LGUsbixpKXtjb25zdCByPXt9LG89bmV3IFdlYWtNYXA7ZnVuY3Rpb24gYSh0KXtjb25zdCBzPXQudGFyZ2V0O251bGwhPT1zLmluZGV4JiZlLnJlbW92ZShzLmluZGV4KTtmb3IoY29uc3QgdCBpbiBzLmF0dHJpYnV0ZXMpZS5yZW1vdmUocy5hdHRyaWJ1dGVzW3RdKTtzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGEpLGRlbGV0ZSByW3MuaWRdO2NvbnN0IGw9by5nZXQocyk7bCYmKGUucmVtb3ZlKGwpLG8uZGVsZXRlKHMpKSxpLnJlbGVhc2VTdGF0ZXNPZkdlb21ldHJ5KHMpLCEwPT09cy5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5JiZkZWxldGUgcy5fbWF4SW5zdGFuY2VDb3VudCxuLm1lbW9yeS5nZW9tZXRyaWVzLS19ZnVuY3Rpb24gcyh0KXtjb25zdCBuPVtdLGk9dC5pbmRleCxyPXQuYXR0cmlidXRlcy5wb3NpdGlvbjtsZXQgYT0wO2lmKG51bGwhPT1pKXtjb25zdCB0PWkuYXJyYXk7YT1pLnZlcnNpb247Zm9yKGxldCBlPTAsaT10Lmxlbmd0aDtlPGk7ZSs9Myl7Y29uc3QgaT10W2UrMF0scj10W2UrMV0sbz10W2UrMl07bi5wdXNoKGkscixyLG8sbyxpKX19ZWxzZXthPXIudmVyc2lvbjtmb3IobGV0IHQ9MCxlPXIuYXJyYXkubGVuZ3RoLzMtMTt0PGU7dCs9Myl7Y29uc3QgZT10KzAsaT10KzEscj10KzI7bi5wdXNoKGUsaSxpLHIscixlKX19Y29uc3Qgcz1uZXcodTF0KG4pPjY1NTM1P2ExdDpyMXQpKG4sMSk7cy52ZXJzaW9uPWE7Y29uc3QgbD1vLmdldCh0KTtsJiZlLnJlbW92ZShsKSxvLnNldCh0LHMpfXJldHVybntnZXQ6ZnVuY3Rpb24gbCh0LGUpe3JldHVybiEwPT09cltlLmlkXXx8KGUuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYSkscltlLmlkXT0hMCxuLm1lbW9yeS5nZW9tZXRyaWVzKyspLGV9LHVwZGF0ZTpmdW5jdGlvbiBjKHQpe2NvbnN0IG49dC5hdHRyaWJ1dGVzO2Zvcihjb25zdCB0IGluIG4pZS51cGRhdGUoblt0XSwzNDk2Mik7Y29uc3QgaT10Lm1vcnBoQXR0cmlidXRlcztmb3IoY29uc3QgdCBpbiBpKXtjb25zdCBuPWlbdF07Zm9yKGxldCB0PTAsaT1uLmxlbmd0aDt0PGk7dCsrKWUudXBkYXRlKG5bdF0sMzQ5NjIpfX0sZ2V0V2lyZWZyYW1lQXR0cmlidXRlOmZ1bmN0aW9uIHUodCl7Y29uc3QgZT1vLmdldCh0KTtpZihlKXtjb25zdCBuPXQuaW5kZXg7bnVsbCE9PW4mJmUudmVyc2lvbjxuLnZlcnNpb24mJnModCl9ZWxzZSBzKHQpO3JldHVybiBvLmdldCh0KX19fWZ1bmN0aW9uIEcwdCh0LGUsbixpKXtjb25zdCByPWkuaXNXZWJHTDI7bGV0IG8sYSxzO3RoaXMuc2V0TW9kZT1mdW5jdGlvbiBsKHQpe289dH0sdGhpcy5zZXRJbmRleD1mdW5jdGlvbiBjKHQpe2E9dC50eXBlLHM9dC5ieXRlc1BlckVsZW1lbnR9LHRoaXMucmVuZGVyPWZ1bmN0aW9uIHUoZSxpKXt0LmRyYXdFbGVtZW50cyhvLGksYSxlKnMpLG4udXBkYXRlKGksbywxKX0sdGhpcy5yZW5kZXJJbnN0YW5jZXM9ZnVuY3Rpb24gaChpLGwsYyl7aWYoMD09PWMpcmV0dXJuO2xldCB1LGg7aWYocil1PXQsaD0iZHJhd0VsZW1lbnRzSW5zdGFuY2VkIjtlbHNlIGlmKHU9ZS5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSxoPSJkcmF3RWxlbWVudHNJbnN0YW5jZWRBTkdMRSIsbnVsbD09PXUpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLiIpO3VbaF0obyxsLGEsaSpzLGMpLG4udXBkYXRlKGwsbyxjKX19ZnVuY3Rpb24gVzB0KHQpe2NvbnN0IGU9e2ZyYW1lOjAsY2FsbHM6MCx0cmlhbmdsZXM6MCxwb2ludHM6MCxsaW5lczowfTtyZXR1cm57bWVtb3J5OntnZW9tZXRyaWVzOjAsdGV4dHVyZXM6MH0scmVuZGVyOmUscHJvZ3JhbXM6bnVsbCxhdXRvUmVzZXQ6ITAscmVzZXQ6ZnVuY3Rpb24gbigpe2UuZnJhbWUrKyxlLmNhbGxzPTAsZS50cmlhbmdsZXM9MCxlLnBvaW50cz0wLGUubGluZXM9MH0sdXBkYXRlOmZ1bmN0aW9uIGkodCxuLHIpe3N3aXRjaChlLmNhbGxzKyssbil7Y2FzZSA0OmUudHJpYW5nbGVzKz1yKih0LzMpO2JyZWFrO2Nhc2UgMTplLmxpbmVzKz1yKih0LzIpO2JyZWFrO2Nhc2UgMzplLmxpbmVzKz1yKih0LTEpO2JyZWFrO2Nhc2UgMjplLmxpbmVzKz1yKnQ7YnJlYWs7Y2FzZSAwOmUucG9pbnRzKz1yKnQ7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTEluZm86IFVua25vd24gZHJhdyBtb2RlOiIsbil9fX19ZnVuY3Rpb24gcTB0KHQsZSl7cmV0dXJuIHRbMF0tZVswXX1mdW5jdGlvbiBZMHQodCxlKXtyZXR1cm4gTWF0aC5hYnMoZVsxXSktTWF0aC5hYnModFsxXSl9ZnVuY3Rpb24gWDB0KHQpe2NvbnN0IGU9e30sbj1uZXcgRmxvYXQzMkFycmF5KDgpLGk9W107Zm9yKGxldCB0PTA7dDw4O3QrKylpW3RdPVt0LDBdO3JldHVybnt1cGRhdGU6ZnVuY3Rpb24gcihvLGEscyxsKXtjb25zdCBjPW8ubW9ycGhUYXJnZXRJbmZsdWVuY2VzLHU9dm9pZCAwPT09Yz8wOmMubGVuZ3RoO2xldCBoPWVbYS5pZF07aWYodm9pZCAwPT09aHx8aC5sZW5ndGghPT11KXtoPVtdO2ZvcihsZXQgdD0wO3Q8dTt0KyspaFt0XT1bdCwwXTtlW2EuaWRdPWh9Zm9yKGxldCB0PTA7dDx1O3QrKyl7Y29uc3QgZT1oW3RdO2VbMF09dCxlWzFdPWNbdF19aC5zb3J0KFkwdCk7Zm9yKGxldCB0PTA7dDw4O3QrKyl0PHUmJmhbdF1bMV0/KGlbdF1bMF09aFt0XVswXSxpW3RdWzFdPWhbdF1bMV0pOihpW3RdWzBdPU51bWJlci5NQVhfU0FGRV9JTlRFR0VSLGlbdF1bMV09MCk7aS5zb3J0KHEwdCk7Y29uc3QgZD1hLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixwPWEubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbDtsZXQgZj0wO2ZvcihsZXQgdD0wO3Q8ODt0Kyspe2NvbnN0IGU9aVt0XSxyPWVbMF0sbz1lWzFdO3IhPT1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUiYmbz8oZCYmYS5nZXRBdHRyaWJ1dGUoIm1vcnBoVGFyZ2V0Iit0KSE9PWRbcl0mJmEuc2V0QXR0cmlidXRlKCJtb3JwaFRhcmdldCIrdCxkW3JdKSxwJiZhLmdldEF0dHJpYnV0ZSgibW9ycGhOb3JtYWwiK3QpIT09cFtyXSYmYS5zZXRBdHRyaWJ1dGUoIm1vcnBoTm9ybWFsIit0LHBbcl0pLG5bdF09byxmKz1vKTooZCYmITA9PT1hLmhhc0F0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK3QpJiZhLmRlbGV0ZUF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK3QpLHAmJiEwPT09YS5oYXNBdHRyaWJ1dGUoIm1vcnBoTm9ybWFsIit0KSYmYS5kZWxldGVBdHRyaWJ1dGUoIm1vcnBoTm9ybWFsIit0KSxuW3RdPTApfWNvbnN0IG09YS5tb3JwaFRhcmdldHNSZWxhdGl2ZT8xOjEtZjtsLmdldFVuaWZvcm1zKCkuc2V0VmFsdWUodCwibW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlIixtKSxsLmdldFVuaWZvcm1zKCkuc2V0VmFsdWUodCwibW9ycGhUYXJnZXRJbmZsdWVuY2VzIixuKX19fWZ1bmN0aW9uICQwdCh0LGUsbixpKXtsZXQgcj1uZXcgV2Vha01hcDtmdW5jdGlvbiBvKHQpe2NvbnN0IGU9dC50YXJnZXQ7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixvKSxuLnJlbW92ZShlLmluc3RhbmNlTWF0cml4KSxudWxsIT09ZS5pbnN0YW5jZUNvbG9yJiZuLnJlbW92ZShlLmluc3RhbmNlQ29sb3IpfXJldHVybnt1cGRhdGU6ZnVuY3Rpb24gYSh0KXtjb25zdCBhPWkucmVuZGVyLmZyYW1lLHM9ZS5nZXQodCx0Lmdlb21ldHJ5KTtyZXR1cm4gci5nZXQocykhPT1hJiYoZS51cGRhdGUocyksci5zZXQocyxhKSksdC5pc0luc3RhbmNlZE1lc2gmJighMT09PXQuaGFzRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsbykmJnQuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsbyksbi51cGRhdGUodC5pbnN0YW5jZU1hdHJpeCwzNDk2MiksbnVsbCE9PXQuaW5zdGFuY2VDb2xvciYmbi51cGRhdGUodC5pbnN0YW5jZUNvbG9yLDM0OTYyKSksc30sZGlzcG9zZTpmdW5jdGlvbiBzKCl7cj1uZXcgV2Vha01hcH19fWNsYXNzIEswdCBleHRlbmRzIGJKdHtjb25zdHJ1Y3Rvcih0PW51bGwsZT0xLG49MSxpPTEpe3N1cGVyKG51bGwpLHRoaXMuaW1hZ2U9e2RhdGE6dCx3aWR0aDplLGhlaWdodDpuLGRlcHRoOml9LHRoaXMubWFnRmlsdGVyPUpLdCx0aGlzLm1pbkZpbHRlcj1KS3QsdGhpcy53cmFwUj1LS3QsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITEsdGhpcy5mbGlwWT0hMSx0aGlzLnVucGFja0FsaWdubWVudD0xLHRoaXMubmVlZHNVcGRhdGU9ITB9fUswdC5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZTJEQXJyYXk9ITA7Y2xhc3MgWjB0IGV4dGVuZHMgYkp0e2NvbnN0cnVjdG9yKHQ9bnVsbCxlPTEsbj0xLGk9MSl7c3VwZXIobnVsbCksdGhpcy5pbWFnZT17ZGF0YTp0LHdpZHRoOmUsaGVpZ2h0Om4sZGVwdGg6aX0sdGhpcy5tYWdGaWx0ZXI9Skt0LHRoaXMubWluRmlsdGVyPUpLdCx0aGlzLndyYXBSPUtLdCx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMSx0aGlzLmZsaXBZPSExLHRoaXMudW5wYWNrQWxpZ25tZW50PTEsdGhpcy5uZWVkc1VwZGF0ZT0hMH19WjB0LnByb3RvdHlwZS5pc0RhdGFUZXh0dXJlM0Q9ITA7Y29uc3QgSjB0PW5ldyBiSnQsUTB0PW5ldyBLMHQsdDJ0PW5ldyBaMHQsZTJ0PW5ldyAkMXQsbjJ0PVtdLGkydD1bXSxyMnQ9bmV3IEZsb2F0MzJBcnJheSgxNiksbzJ0PW5ldyBGbG9hdDMyQXJyYXkoOSksYTJ0PW5ldyBGbG9hdDMyQXJyYXkoNCk7ZnVuY3Rpb24gczJ0KHQsZSxuKXtjb25zdCBpPXRbMF07aWYoaTw9MHx8aT4wKXJldHVybiB0O2NvbnN0IHI9ZSpuO2xldCBvPW4ydFtyXTtpZih2b2lkIDA9PT1vJiYobz1uZXcgRmxvYXQzMkFycmF5KHIpLG4ydFtyXT1vKSwwIT09ZSl7aS50b0FycmF5KG8sMCk7Zm9yKGxldCBpPTEscj0wO2khPT1lOysraSlyKz1uLHRbaV0udG9BcnJheShvLHIpfXJldHVybiBvfWZ1bmN0aW9uIGwydCh0LGUpe2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCBuPTAsaT10Lmxlbmd0aDtuPGk7bisrKWlmKHRbbl0hPT1lW25dKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGMydCh0LGUpe2ZvcihsZXQgbj0wLGk9ZS5sZW5ndGg7bjxpO24rKyl0W25dPWVbbl19ZnVuY3Rpb24gdTJ0KHQsZSl7bGV0IG49aTJ0W2VdO3ZvaWQgMD09PW4mJihuPW5ldyBJbnQzMkFycmF5KGUpLGkydFtlXT1uKTtmb3IobGV0IGk9MDtpIT09ZTsrK2kpbltpXT10LmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtyZXR1cm4gbn1mdW5jdGlvbiBoMnQodCxlKXtjb25zdCBuPXRoaXMuY2FjaGU7blswXSE9PWUmJih0LnVuaWZvcm0xZih0aGlzLmFkZHIsZSksblswXT1lKX1mdW5jdGlvbiBkMnQodCxlKXtjb25zdCBuPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09ZS54KW5bMF09PT1lLngmJm5bMV09PT1lLnl8fCh0LnVuaWZvcm0yZih0aGlzLmFkZHIsZS54LGUueSksblswXT1lLngsblsxXT1lLnkpO2Vsc2V7aWYobDJ0KG4sZSkpcmV0dXJuO3QudW5pZm9ybTJmdih0aGlzLmFkZHIsZSksYzJ0KG4sZSl9fWZ1bmN0aW9uIHAydCh0LGUpe2NvbnN0IG49dGhpcy5jYWNoZTtpZih2b2lkIDAhPT1lLngpblswXT09PWUueCYmblsxXT09PWUueSYmblsyXT09PWUuenx8KHQudW5pZm9ybTNmKHRoaXMuYWRkcixlLngsZS55LGUueiksblswXT1lLngsblsxXT1lLnksblsyXT1lLnopO2Vsc2UgaWYodm9pZCAwIT09ZS5yKW5bMF09PT1lLnImJm5bMV09PT1lLmcmJm5bMl09PT1lLmJ8fCh0LnVuaWZvcm0zZih0aGlzLmFkZHIsZS5yLGUuZyxlLmIpLG5bMF09ZS5yLG5bMV09ZS5nLG5bMl09ZS5iKTtlbHNle2lmKGwydChuLGUpKXJldHVybjt0LnVuaWZvcm0zZnYodGhpcy5hZGRyLGUpLGMydChuLGUpfX1mdW5jdGlvbiBmMnQodCxlKXtjb25zdCBuPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09ZS54KW5bMF09PT1lLngmJm5bMV09PT1lLnkmJm5bMl09PT1lLnomJm5bM109PT1lLnd8fCh0LnVuaWZvcm00Zih0aGlzLmFkZHIsZS54LGUueSxlLnosZS53KSxuWzBdPWUueCxuWzFdPWUueSxuWzJdPWUueixuWzNdPWUudyk7ZWxzZXtpZihsMnQobixlKSlyZXR1cm47dC51bmlmb3JtNGZ2KHRoaXMuYWRkcixlKSxjMnQobixlKX19ZnVuY3Rpb24gbTJ0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlLGk9ZS5lbGVtZW50cztpZih2b2lkIDA9PT1pKXtpZihsMnQobixlKSlyZXR1cm47dC51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxlKSxjMnQobixlKX1lbHNle2lmKGwydChuLGkpKXJldHVybjthMnQuc2V0KGkpLHQudW5pZm9ybU1hdHJpeDJmdih0aGlzLmFkZHIsITEsYTJ0KSxjMnQobixpKX19ZnVuY3Rpb24gZzJ0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlLGk9ZS5lbGVtZW50cztpZih2b2lkIDA9PT1pKXtpZihsMnQobixlKSlyZXR1cm47dC51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxlKSxjMnQobixlKX1lbHNle2lmKGwydChuLGkpKXJldHVybjtvMnQuc2V0KGkpLHQudW5pZm9ybU1hdHJpeDNmdih0aGlzLmFkZHIsITEsbzJ0KSxjMnQobixpKX19ZnVuY3Rpb24gXzJ0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlLGk9ZS5lbGVtZW50cztpZih2b2lkIDA9PT1pKXtpZihsMnQobixlKSlyZXR1cm47dC51bmlmb3JtTWF0cml4NGZ2KHRoaXMuYWRkciwhMSxlKSxjMnQobixlKX1lbHNle2lmKGwydChuLGkpKXJldHVybjtyMnQuc2V0KGkpLHQudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsITEscjJ0KSxjMnQobixpKX19ZnVuY3Rpb24geTJ0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlO25bMF0hPT1lJiYodC51bmlmb3JtMWkodGhpcy5hZGRyLGUpLG5bMF09ZSl9ZnVuY3Rpb24gdjJ0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlO2wydChuLGUpfHwodC51bmlmb3JtMml2KHRoaXMuYWRkcixlKSxjMnQobixlKSl9ZnVuY3Rpb24gYjJ0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlO2wydChuLGUpfHwodC51bmlmb3JtM2l2KHRoaXMuYWRkcixlKSxjMnQobixlKSl9ZnVuY3Rpb24geDJ0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlO2wydChuLGUpfHwodC51bmlmb3JtNGl2KHRoaXMuYWRkcixlKSxjMnQobixlKSl9ZnVuY3Rpb24gdzJ0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlO25bMF0hPT1lJiYodC51bmlmb3JtMXVpKHRoaXMuYWRkcixlKSxuWzBdPWUpfWZ1bmN0aW9uIFMydCh0LGUpe2NvbnN0IG49dGhpcy5jYWNoZTtsMnQobixlKXx8KHQudW5pZm9ybTJ1aXYodGhpcy5hZGRyLGUpLGMydChuLGUpKX1mdW5jdGlvbiBNMnQodCxlKXtjb25zdCBuPXRoaXMuY2FjaGU7bDJ0KG4sZSl8fCh0LnVuaWZvcm0zdWl2KHRoaXMuYWRkcixlKSxjMnQobixlKSl9ZnVuY3Rpb24gRTJ0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlO2wydChuLGUpfHwodC51bmlmb3JtNHVpdih0aGlzLmFkZHIsZSksYzJ0KG4sZSkpfWZ1bmN0aW9uIFQydCh0LGUsbil7Y29uc3QgaT10aGlzLmNhY2hlLHI9bi5hbGxvY2F0ZVRleHR1cmVVbml0KCk7aVswXSE9PXImJih0LnVuaWZvcm0xaSh0aGlzLmFkZHIsciksaVswXT1yKSxuLnNhZmVTZXRUZXh0dXJlMkQoZXx8SjB0LHIpfWZ1bmN0aW9uIEMydCh0LGUsbil7Y29uc3QgaT10aGlzLmNhY2hlLHI9bi5hbGxvY2F0ZVRleHR1cmVVbml0KCk7aVswXSE9PXImJih0LnVuaWZvcm0xaSh0aGlzLmFkZHIsciksaVswXT1yKSxuLnNldFRleHR1cmUzRChlfHx0MnQscil9ZnVuY3Rpb24gQTJ0KHQsZSxuKXtjb25zdCBpPXRoaXMuY2FjaGUscj1uLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtpWzBdIT09ciYmKHQudW5pZm9ybTFpKHRoaXMuYWRkcixyKSxpWzBdPXIpLG4uc2FmZVNldFRleHR1cmVDdWJlKGV8fGUydCxyKX1mdW5jdGlvbiBrMnQodCxlLG4pe2NvbnN0IGk9dGhpcy5jYWNoZSxyPW4uYWxsb2NhdGVUZXh0dXJlVW5pdCgpO2lbMF0hPT1yJiYodC51bmlmb3JtMWkodGhpcy5hZGRyLHIpLGlbMF09ciksbi5zZXRUZXh0dXJlMkRBcnJheShlfHxRMHQscil9ZnVuY3Rpb24gTDJ0KHQsZSl7dC51bmlmb3JtMWZ2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBQMnQodCxlKXtjb25zdCBuPXMydChlLHRoaXMuc2l6ZSwyKTt0LnVuaWZvcm0yZnYodGhpcy5hZGRyLG4pfWZ1bmN0aW9uIE4ydCh0LGUpe2NvbnN0IG49czJ0KGUsdGhpcy5zaXplLDMpO3QudW5pZm9ybTNmdih0aGlzLmFkZHIsbil9ZnVuY3Rpb24gSTJ0KHQsZSl7Y29uc3Qgbj1zMnQoZSx0aGlzLnNpemUsNCk7dC51bmlmb3JtNGZ2KHRoaXMuYWRkcixuKX1mdW5jdGlvbiBSMnQodCxlKXtjb25zdCBuPXMydChlLHRoaXMuc2l6ZSw0KTt0LnVuaWZvcm1NYXRyaXgyZnYodGhpcy5hZGRyLCExLG4pfWZ1bmN0aW9uIE8ydCh0LGUpe2NvbnN0IG49czJ0KGUsdGhpcy5zaXplLDkpO3QudW5pZm9ybU1hdHJpeDNmdih0aGlzLmFkZHIsITEsbil9ZnVuY3Rpb24gejJ0KHQsZSl7Y29uc3Qgbj1zMnQoZSx0aGlzLnNpemUsMTYpO3QudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsITEsbil9ZnVuY3Rpb24gRDJ0KHQsZSl7dC51bmlmb3JtMWl2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBCMnQodCxlKXt0LnVuaWZvcm0yaXYodGhpcy5hZGRyLGUpfWZ1bmN0aW9uIEgydCh0LGUpe3QudW5pZm9ybTNpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gRjJ0KHQsZSl7dC51bmlmb3JtNGl2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBWMnQodCxlKXt0LnVuaWZvcm0xdWl2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBVMnQodCxlKXt0LnVuaWZvcm0ydWl2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBqMnQodCxlKXt0LnVuaWZvcm0zdWl2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBHMnQodCxlKXt0LnVuaWZvcm00dWl2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBXMnQodCxlLG4pe2NvbnN0IGk9ZS5sZW5ndGgscj11MnQobixpKTt0LnVuaWZvcm0xaXYodGhpcy5hZGRyLHIpO2ZvcihsZXQgdD0wO3QhPT1pOysrdCluLnNhZmVTZXRUZXh0dXJlMkQoZVt0XXx8SjB0LHJbdF0pfWZ1bmN0aW9uIHEydCh0LGUsbil7Y29uc3QgaT1lLmxlbmd0aCxyPXUydChuLGkpO3QudW5pZm9ybTFpdih0aGlzLmFkZHIscik7Zm9yKGxldCB0PTA7dCE9PWk7Kyt0KW4uc2FmZVNldFRleHR1cmVDdWJlKGVbdF18fGUydCxyW3RdKX1mdW5jdGlvbiBZMnQodCxlLG4pe3RoaXMuaWQ9dCx0aGlzLmFkZHI9bix0aGlzLmNhY2hlPVtdLHRoaXMuc2V0VmFsdWU9KGZ1bmN0aW9uIGkodCl7c3dpdGNoKHQpe2Nhc2UgNTEyNjpyZXR1cm4gaDJ0O2Nhc2UgMzU2NjQ6cmV0dXJuIGQydDtjYXNlIDM1NjY1OnJldHVybiBwMnQ7Y2FzZSAzNTY2NjpyZXR1cm4gZjJ0O2Nhc2UgMzU2NzQ6cmV0dXJuIG0ydDtjYXNlIDM1Njc1OnJldHVybiBnMnQ7Y2FzZSAzNTY3NjpyZXR1cm4gXzJ0O2Nhc2UgNTEyNDpjYXNlIDM1NjcwOnJldHVybiB5MnQ7Y2FzZSAzNTY2NzpjYXNlIDM1NjcxOnJldHVybiB2MnQ7Y2FzZSAzNTY2ODpjYXNlIDM1NjcyOnJldHVybiBiMnQ7Y2FzZSAzNTY2OTpjYXNlIDM1NjczOnJldHVybiB4MnQ7Y2FzZSA1MTI1OnJldHVybiB3MnQ7Y2FzZSAzNjI5NDpyZXR1cm4gUzJ0O2Nhc2UgMzYyOTU6cmV0dXJuIE0ydDtjYXNlIDM2Mjk2OnJldHVybiBFMnQ7Y2FzZSAzNTY3ODpjYXNlIDM2MTk4OmNhc2UgMzYyOTg6Y2FzZSAzNjMwNjpjYXNlIDM1NjgyOnJldHVybiBUMnQ7Y2FzZSAzNTY3OTpjYXNlIDM2Mjk5OmNhc2UgMzYzMDc6cmV0dXJuIEMydDtjYXNlIDM1NjgwOmNhc2UgMzYzMDA6Y2FzZSAzNjMwODpjYXNlIDM2MjkzOnJldHVybiBBMnQ7Y2FzZSAzNjI4OTpjYXNlIDM2MzAzOmNhc2UgMzYzMTE6Y2FzZSAzNjI5MjpyZXR1cm4gazJ0fX0pKGUudHlwZSl9ZnVuY3Rpb24gWDJ0KHQsZSxuKXt0aGlzLmlkPXQsdGhpcy5hZGRyPW4sdGhpcy5jYWNoZT1bXSx0aGlzLnNpemU9ZS5zaXplLHRoaXMuc2V0VmFsdWU9KGZ1bmN0aW9uIGkodCl7c3dpdGNoKHQpe2Nhc2UgNTEyNjpyZXR1cm4gTDJ0O2Nhc2UgMzU2NjQ6cmV0dXJuIFAydDtjYXNlIDM1NjY1OnJldHVybiBOMnQ7Y2FzZSAzNTY2NjpyZXR1cm4gSTJ0O2Nhc2UgMzU2NzQ6cmV0dXJuIFIydDtjYXNlIDM1Njc1OnJldHVybiBPMnQ7Y2FzZSAzNTY3NjpyZXR1cm4gejJ0O2Nhc2UgNTEyNDpjYXNlIDM1NjcwOnJldHVybiBEMnQ7Y2FzZSAzNTY2NzpjYXNlIDM1NjcxOnJldHVybiBCMnQ7Y2FzZSAzNTY2ODpjYXNlIDM1NjcyOnJldHVybiBIMnQ7Y2FzZSAzNTY2OTpjYXNlIDM1NjczOnJldHVybiBGMnQ7Y2FzZSA1MTI1OnJldHVybiBWMnQ7Y2FzZSAzNjI5NDpyZXR1cm4gVTJ0O2Nhc2UgMzYyOTU6cmV0dXJuIGoydDtjYXNlIDM2Mjk2OnJldHVybiBHMnQ7Y2FzZSAzNTY3ODpjYXNlIDM2MTk4OmNhc2UgMzYyOTg6Y2FzZSAzNjMwNjpjYXNlIDM1NjgyOnJldHVybiBXMnQ7Y2FzZSAzNTY4MDpjYXNlIDM2MzAwOmNhc2UgMzYzMDg6Y2FzZSAzNjI5MzpyZXR1cm4gcTJ0fX0pKGUudHlwZSl9ZnVuY3Rpb24gJDJ0KHQpe3RoaXMuaWQ9dCx0aGlzLnNlcT1bXSx0aGlzLm1hcD17fX1YMnQucHJvdG90eXBlLnVwZGF0ZUNhY2hlPWZ1bmN0aW9uKHQpe2NvbnN0IGU9dGhpcy5jYWNoZTt0IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5JiZlLmxlbmd0aCE9PXQubGVuZ3RoJiYodGhpcy5jYWNoZT1uZXcgRmxvYXQzMkFycmF5KHQubGVuZ3RoKSksYzJ0KGUsdCl9LCQydC5wcm90b3R5cGUuc2V0VmFsdWU9ZnVuY3Rpb24odCxlLG4pe2NvbnN0IGk9dGhpcy5zZXE7Zm9yKGxldCByPTAsbz1pLmxlbmd0aDtyIT09bzsrK3Ipe2NvbnN0IG89aVtyXTtvLnNldFZhbHVlKHQsZVtvLmlkXSxuKX19O2NvbnN0IEsydD0vKFx3KykoXF0pPyhcW3xcLik/L2c7ZnVuY3Rpb24gWjJ0KHQsZSl7dC5zZXEucHVzaChlKSx0Lm1hcFtlLmlkXT1lfWZ1bmN0aW9uIEoydCh0LGUsbil7Y29uc3QgaT10Lm5hbWUscj1pLmxlbmd0aDtmb3IoSzJ0Lmxhc3RJbmRleD0wOzspe2NvbnN0IG89SzJ0LmV4ZWMoaSksYT1LMnQubGFzdEluZGV4O2xldCBzPW9bMV07Y29uc3QgbD1vWzNdO2lmKCJdIj09PW9bMl0mJihzfD0wKSx2b2lkIDA9PT1sfHwiWyI9PT1sJiZhKzI9PT1yKXtaMnQobix2b2lkIDA9PT1sP25ldyBZMnQocyx0LGUpOm5ldyBYMnQocyx0LGUpKTticmVha317bGV0IHQ9bi5tYXBbc107dm9pZCAwPT09dCYmKHQ9bmV3ICQydChzKSxaMnQobix0KSksbj10fX19ZnVuY3Rpb24gUTJ0KHQsZSl7dGhpcy5zZXE9W10sdGhpcy5tYXA9e307Y29uc3Qgbj10LmdldFByb2dyYW1QYXJhbWV0ZXIoZSwzNTcxOCk7Zm9yKGxldCBpPTA7aTxuOysraSl7Y29uc3Qgbj10LmdldEFjdGl2ZVVuaWZvcm0oZSxpKTtKMnQobix0LmdldFVuaWZvcm1Mb2NhdGlvbihlLG4ubmFtZSksdGhpcyl9fWZ1bmN0aW9uIHQ1dCh0LGUsbil7Y29uc3QgaT10LmNyZWF0ZVNoYWRlcihlKTtyZXR1cm4gdC5zaGFkZXJTb3VyY2UoaSxuKSx0LmNvbXBpbGVTaGFkZXIoaSksaX1RMnQucHJvdG90eXBlLnNldFZhbHVlPWZ1bmN0aW9uKHQsZSxuLGkpe2NvbnN0IHI9dGhpcy5tYXBbZV07dm9pZCAwIT09ciYmci5zZXRWYWx1ZSh0LG4saSl9LFEydC5wcm90b3R5cGUuc2V0T3B0aW9uYWw9ZnVuY3Rpb24odCxlLG4pe2NvbnN0IGk9ZVtuXTt2b2lkIDAhPT1pJiZ0aGlzLnNldFZhbHVlKHQsbixpKX0sUTJ0LnVwbG9hZD1mdW5jdGlvbih0LGUsbixpKXtmb3IobGV0IHI9MCxvPWUubGVuZ3RoO3IhPT1vOysrcil7Y29uc3Qgbz1lW3JdLGE9bltvLmlkXTshMSE9PWEubmVlZHNVcGRhdGUmJm8uc2V0VmFsdWUodCxhLnZhbHVlLGkpfX0sUTJ0LnNlcVdpdGhWYWx1ZT1mdW5jdGlvbih0LGUpe2NvbnN0IG49W107Zm9yKGxldCBpPTAscj10Lmxlbmd0aDtpIT09cjsrK2kpe2NvbnN0IHI9dFtpXTtyLmlkIGluIGUmJm4ucHVzaChyKX1yZXR1cm4gbn07bGV0IGU1dD0wO2Z1bmN0aW9uIG41dCh0KXtzd2l0Y2godCl7Y2FzZSBOWnQ6cmV0dXJuWyJMaW5lYXIiLCIoIHZhbHVlICkiXTtjYXNlIEladDpyZXR1cm5bInNSR0IiLCIoIHZhbHVlICkiXTtjYXNlIE9adDpyZXR1cm5bIlJHQkUiLCIoIHZhbHVlICkiXTtjYXNlIHpadDpyZXR1cm5bIlJHQk0iLCIoIHZhbHVlLCA3LjAgKSJdO2Nhc2UgRFp0OnJldHVyblsiUkdCTSIsIiggdmFsdWUsIDE2LjAgKSJdO2Nhc2UgQlp0OnJldHVyblsiUkdCRCIsIiggdmFsdWUsIDI1Ni4wICkiXTtjYXNlIFJadDpyZXR1cm5bIkdhbW1hIiwiKCB2YWx1ZSwgZmxvYXQoIEdBTU1BX0ZBQ1RPUiApICkiXTtjYXNlIDMwMDM6cmV0dXJuWyJMb2dMdXYiLCIoIHZhbHVlICkiXTtkZWZhdWx0OnJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUHJvZ3JhbTogVW5zdXBwb3J0ZWQgZW5jb2Rpbmc6Iix0KSxbIkxpbmVhciIsIiggdmFsdWUgKSJdfX1mdW5jdGlvbiBpNXQodCxlLG4pe2NvbnN0IGk9dC5nZXRTaGFkZXJQYXJhbWV0ZXIoZSwzNTcxMykscj10LmdldFNoYWRlckluZm9Mb2coZSkudHJpbSgpO3JldHVybiBpJiYiIj09PXI/IiI6IlRIUkVFLldlYkdMU2hhZGVyOiBnbC5nZXRTaGFkZXJJbmZvTG9nKCkgIituKyJcbiIrcisoZnVuY3Rpb24gbyh0KXtjb25zdCBlPXQuc3BsaXQoIlxuIik7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XT10KzErIjogIitlW3RdO3JldHVybiBlLmpvaW4oIlxuIil9KSh0LmdldFNoYWRlclNvdXJjZShlKSl9ZnVuY3Rpb24gcjV0KHQsZSl7Y29uc3Qgbj1uNXQoZSk7cmV0dXJuInZlYzQgIit0KyIoIHZlYzQgdmFsdWUgKSB7IHJldHVybiAiK25bMF0rIlRvTGluZWFyIituWzFdKyI7IH0ifWZ1bmN0aW9uIG81dCh0LGUpe2NvbnN0IG49bjV0KGUpO3JldHVybiJ2ZWM0ICIrdCsiKCB2ZWM0IHZhbHVlICkgeyByZXR1cm4gTGluZWFyVG8iK25bMF0rblsxXSsiOyB9In1mdW5jdGlvbiBhNXQodCxlKXtsZXQgbjtzd2l0Y2goZSl7Y2FzZSAxOm49IkxpbmVhciI7YnJlYWs7Y2FzZSAyOm49IlJlaW5oYXJkIjticmVhaztjYXNlIDM6bj0iT3B0aW1pemVkQ2luZW9uIjticmVhaztjYXNlIDQ6bj0iQUNFU0ZpbG1pYyI7YnJlYWs7Y2FzZSA1Om49IkN1c3RvbSI7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUHJvZ3JhbTogVW5zdXBwb3J0ZWQgdG9uZU1hcHBpbmc6IixlKSxuPSJMaW5lYXIifXJldHVybiJ2ZWMzICIrdCsiKCB2ZWMzIGNvbG9yICkgeyByZXR1cm4gIituKyJUb25lTWFwcGluZyggY29sb3IgKTsgfSJ9ZnVuY3Rpb24gczV0KHQpe3JldHVybiIiIT09dH1mdW5jdGlvbiBsNXQodCxlKXtyZXR1cm4gdC5yZXBsYWNlKC9OVU1fRElSX0xJR0hUUy9nLGUubnVtRGlyTGlnaHRzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVFMvZyxlLm51bVNwb3RMaWdodHMpLnJlcGxhY2UoL05VTV9SRUNUX0FSRUFfTElHSFRTL2csZS5udW1SZWN0QXJlYUxpZ2h0cykucmVwbGFjZSgvTlVNX1BPSU5UX0xJR0hUUy9nLGUubnVtUG9pbnRMaWdodHMpLnJlcGxhY2UoL05VTV9IRU1JX0xJR0hUUy9nLGUubnVtSGVtaUxpZ2h0cykucmVwbGFjZSgvTlVNX0RJUl9MSUdIVF9TSEFET1dTL2csZS5udW1EaXJMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUX1NIQURPV1MvZyxlLm51bVNwb3RMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9QT0lOVF9MSUdIVF9TSEFET1dTL2csZS5udW1Qb2ludExpZ2h0U2hhZG93cyl9ZnVuY3Rpb24gYzV0KHQsZSl7cmV0dXJuIHQucmVwbGFjZSgvTlVNX0NMSVBQSU5HX1BMQU5FUy9nLGUubnVtQ2xpcHBpbmdQbGFuZXMpLnJlcGxhY2UoL1VOSU9OX0NMSVBQSU5HX1BMQU5FUy9nLGUubnVtQ2xpcHBpbmdQbGFuZXMtZS5udW1DbGlwSW50ZXJzZWN0aW9uKX1jb25zdCB1NXQ9L15bIFx0XSojaW5jbHVkZSArPChbXHdcZC4vXSspPi9nbTtmdW5jdGlvbiBoNXQodCl7cmV0dXJuIHQucmVwbGFjZSh1NXQsZDV0KX1mdW5jdGlvbiBkNXQodCxlKXtjb25zdCBuPXMwdFtlXTtpZih2b2lkIDA9PT1uKXRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCByZXNvbHZlICNpbmNsdWRlIDwiK2UrIj4iKTtyZXR1cm4gaDV0KG4pfWNvbnN0IHA1dD0vI3ByYWdtYSB1bnJvbGxfbG9vcFtcc10rP2ZvciBcKCBpbnQgaSBcPSAoXGQrKVw7IGkgPCAoXGQrKVw7IGkgXCtcKyBcKSBceyhbXHNcU10rPykoPz1cfSlcfS9nLGY1dD0vI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxzK2ZvclxzKlwoXHMqaW50XHMraVxzKj1ccyooXGQrKVxzKjtccyppXHMqPFxzKihcZCspXHMqO1xzKmlccypcK1wrXHMqXClccyp7KFtcc1xTXSs/KX1ccysjcHJhZ21hIHVucm9sbF9sb29wX2VuZC9nO2Z1bmN0aW9uIG01dCh0KXtyZXR1cm4gdC5yZXBsYWNlKGY1dCxfNXQpLnJlcGxhY2UocDV0LGc1dCl9ZnVuY3Rpb24gZzV0KHQsZSxuLGkpe3JldHVybiBjb25zb2xlLndhcm4oIldlYkdMUHJvZ3JhbTogI3ByYWdtYSB1bnJvbGxfbG9vcCBzaGFkZXIgc3ludGF4IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydCBzeW50YXggaW5zdGVhZC4iKSxfNXQoMCxlLG4saSl9ZnVuY3Rpb24gXzV0KHQsZSxuLGkpe2xldCByPSIiO2ZvcihsZXQgdD1wYXJzZUludChlKTt0PHBhcnNlSW50KG4pO3QrKylyKz1pLnJlcGxhY2UoL1xbXHMqaVxzKlxdL2csIlsgIit0KyIgXSIpLnJlcGxhY2UoL1VOUk9MTEVEX0xPT1BfSU5ERVgvZyx0KTtyZXR1cm4gcn1mdW5jdGlvbiB5NXQodCl7bGV0IGU9InByZWNpc2lvbiAiK3QucHJlY2lzaW9uKyIgZmxvYXQ7XG5wcmVjaXNpb24gIit0LnByZWNpc2lvbisiIGludDsiO3JldHVybiJoaWdocCI9PT10LnByZWNpc2lvbj9lKz0iXG4jZGVmaW5lIEhJR0hfUFJFQ0lTSU9OIjoibWVkaXVtcCI9PT10LnByZWNpc2lvbj9lKz0iXG4jZGVmaW5lIE1FRElVTV9QUkVDSVNJT04iOiJsb3dwIj09PXQucHJlY2lzaW9uJiYoZSs9IlxuI2RlZmluZSBMT1dfUFJFQ0lTSU9OIiksZX1mdW5jdGlvbiB2NXQodCxlLG4saSl7Y29uc3Qgcj10LmdldENvbnRleHQoKSxvPW4uZGVmaW5lcztsZXQgYT1uLnZlcnRleFNoYWRlcixzPW4uZnJhZ21lbnRTaGFkZXI7Y29uc3QgbD0oZnVuY3Rpb24gYyh0KXtsZXQgZT0iU0hBRE9XTUFQX1RZUEVfQkFTSUMiO3JldHVybiAxPT09dC5zaGFkb3dNYXBUeXBlP2U9IlNIQURPV01BUF9UWVBFX1BDRiI6Mj09PXQuc2hhZG93TWFwVHlwZT9lPSJTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCI6Mz09PXQuc2hhZG93TWFwVHlwZSYmKGU9IlNIQURPV01BUF9UWVBFX1ZTTSIpLGV9KShuKSx1PShmdW5jdGlvbiBoKHQpe2xldCBlPSJFTlZNQVBfVFlQRV9DVUJFIjtpZih0LmVudk1hcClzd2l0Y2godC5lbnZNYXBNb2RlKXtjYXNlIGpLdDpjYXNlIEdLdDplPSJFTlZNQVBfVFlQRV9DVUJFIjticmVhaztjYXNlIFlLdDpjYXNlIFhLdDplPSJFTlZNQVBfVFlQRV9DVUJFX1VWIn1yZXR1cm4gZX0pKG4pLGQ9KGZ1bmN0aW9uIHAodCl7bGV0IGU9IkVOVk1BUF9NT0RFX1JFRkxFQ1RJT04iO2lmKHQuZW52TWFwKXN3aXRjaCh0LmVudk1hcE1vZGUpe2Nhc2UgR0t0OmNhc2UgWEt0OmU9IkVOVk1BUF9NT0RFX1JFRlJBQ1RJT04ifXJldHVybiBlfSkobiksZj0oZnVuY3Rpb24gbSh0KXtsZXQgZT0iRU5WTUFQX0JMRU5ESU5HX05PTkUiO2lmKHQuZW52TWFwKXN3aXRjaCh0LmNvbWJpbmUpe2Nhc2UgMDplPSJFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFkiO2JyZWFrO2Nhc2UgMTplPSJFTlZNQVBfQkxFTkRJTkdfTUlYIjticmVhaztjYXNlIDI6ZT0iRU5WTUFQX0JMRU5ESU5HX0FERCJ9cmV0dXJuIGV9KShuKSxnPXQuZ2FtbWFGYWN0b3I+MD90LmdhbW1hRmFjdG9yOjEsXz1uLmlzV2ViR0wyPyIiOihmdW5jdGlvbiB5KHQpe3JldHVyblt0LmV4dGVuc2lvbkRlcml2YXRpdmVzfHx0LmVudk1hcEN1YmVVVnx8dC5idW1wTWFwfHx0LnRhbmdlbnRTcGFjZU5vcm1hbE1hcHx8dC5jbGVhcmNvYXROb3JtYWxNYXB8fHQuZmxhdFNoYWRpbmd8fCJwaHlzaWNhbCI9PT10LnNoYWRlcklEPyIjZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IGVuYWJsZSI6IiIsKHQuZXh0ZW5zaW9uRnJhZ0RlcHRofHx0LmxvZ2FyaXRobWljRGVwdGhCdWZmZXIpJiZ0LnJlbmRlcmVyRXh0ZW5zaW9uRnJhZ0RlcHRoPyIjZXh0ZW5zaW9uIEdMX0VYVF9mcmFnX2RlcHRoIDogZW5hYmxlIjoiIix0LmV4dGVuc2lvbkRyYXdCdWZmZXJzJiZ0LnJlbmRlcmVyRXh0ZW5zaW9uRHJhd0J1ZmZlcnM/IiNleHRlbnNpb24gR0xfRVhUX2RyYXdfYnVmZmVycyA6IHJlcXVpcmUiOiIiLCh0LmV4dGVuc2lvblNoYWRlclRleHR1cmVMT0R8fHQuZW52TWFwfHx0LnRyYW5zbWlzc2lvbj4wKSYmdC5yZW5kZXJlckV4dGVuc2lvblNoYWRlclRleHR1cmVMb2Q/IiNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IGVuYWJsZSI6IiJdLmZpbHRlcihzNXQpLmpvaW4oIlxuIil9KShuKSx2PShmdW5jdGlvbiBiKHQpe2NvbnN0IGU9W107Zm9yKGNvbnN0IG4gaW4gdCl7Y29uc3QgaT10W25dOyExIT09aSYmZS5wdXNoKCIjZGVmaW5lICIrbisiICIraSl9cmV0dXJuIGUuam9pbigiXG4iKX0pKG8pLHg9ci5jcmVhdGVQcm9ncmFtKCk7bGV0IHcsUyxNPW4uZ2xzbFZlcnNpb24/IiN2ZXJzaW9uICIrbi5nbHNsVmVyc2lvbisiXG4iOiIiO24uaXNSYXdTaGFkZXJNYXRlcmlhbD8odz1bdl0uZmlsdGVyKHM1dCkuam9pbigiXG4iKSx3Lmxlbmd0aD4wJiYodys9IlxuIiksUz1bXyx2XS5maWx0ZXIoczV0KS5qb2luKCJcbiIpLFMubGVuZ3RoPjAmJihTKz0iXG4iKSk6KHc9W3k1dChuKSwiI2RlZmluZSBTSEFERVJfTkFNRSAiK24uc2hhZGVyTmFtZSx2LG4uaW5zdGFuY2luZz8iI2RlZmluZSBVU0VfSU5TVEFOQ0lORyI6IiIsbi5pbnN0YW5jaW5nQ29sb3I/IiNkZWZpbmUgVVNFX0lOU1RBTkNJTkdfQ09MT1IiOiIiLG4uc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcz8iI2RlZmluZSBWRVJURVhfVEVYVFVSRVMiOiIiLCIjZGVmaW5lIEdBTU1BX0ZBQ1RPUiAiK2csIiNkZWZpbmUgTUFYX0JPTkVTICIrbi5tYXhCb25lcyxuLnVzZUZvZyYmbi5mb2c/IiNkZWZpbmUgVVNFX0ZPRyI6IiIsbi51c2VGb2cmJm4uZm9nRXhwMj8iI2RlZmluZSBGT0dfRVhQMiI6IiIsbi5tYXA/IiNkZWZpbmUgVVNFX01BUCI6IiIsbi5lbnZNYXA/IiNkZWZpbmUgVVNFX0VOVk1BUCI6IiIsbi5lbnZNYXA/IiNkZWZpbmUgIitkOiIiLG4ubGlnaHRNYXA/IiNkZWZpbmUgVVNFX0xJR0hUTUFQIjoiIixuLmFvTWFwPyIjZGVmaW5lIFVTRV9BT01BUCI6IiIsbi5lbWlzc2l2ZU1hcD8iI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAiOiIiLG4uYnVtcE1hcD8iI2RlZmluZSBVU0VfQlVNUE1BUCI6IiIsbi5ub3JtYWxNYXA/IiNkZWZpbmUgVVNFX05PUk1BTE1BUCI6IiIsbi5ub3JtYWxNYXAmJm4ub2JqZWN0U3BhY2VOb3JtYWxNYXA/IiNkZWZpbmUgT0JKRUNUU1BBQ0VfTk9STUFMTUFQIjoiIixuLm5vcm1hbE1hcCYmbi50YW5nZW50U3BhY2VOb3JtYWxNYXA/IiNkZWZpbmUgVEFOR0VOVFNQQUNFX05PUk1BTE1BUCI6IiIsbi5jbGVhcmNvYXRNYXA/IiNkZWZpbmUgVVNFX0NMRUFSQ09BVE1BUCI6IiIsbi5jbGVhcmNvYXRSb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAiOiIiLG4uY2xlYXJjb2F0Tm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQIjoiIixuLmRpc3BsYWNlbWVudE1hcCYmbi5zdXBwb3J0c1ZlcnRleFRleHR1cmVzPyIjZGVmaW5lIFVTRV9ESVNQTEFDRU1FTlRNQVAiOiIiLG4uc3BlY3VsYXJNYXA/IiNkZWZpbmUgVVNFX1NQRUNVTEFSTUFQIjoiIixuLnNwZWN1bGFySW50ZW5zaXR5TWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUklOVEVOU0lUWU1BUCI6IiIsbi5zcGVjdWxhclRpbnRNYXA/IiNkZWZpbmUgVVNFX1NQRUNVTEFSVElOVE1BUCI6IiIsbi5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6IiIsbi5tZXRhbG5lc3NNYXA/IiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCI6IiIsbi5hbHBoYU1hcD8iI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLG4udHJhbnNtaXNzaW9uPyIjZGVmaW5lIFVTRV9UUkFOU01JU1NJT04iOiIiLG4udHJhbnNtaXNzaW9uTWFwPyIjZGVmaW5lIFVTRV9UUkFOU01JU1NJT05NQVAiOiIiLG4udGhpY2tuZXNzTWFwPyIjZGVmaW5lIFVTRV9USElDS05FU1NNQVAiOiIiLG4udmVydGV4VGFuZ2VudHM/IiNkZWZpbmUgVVNFX1RBTkdFTlQiOiIiLG4udmVydGV4Q29sb3JzPyIjZGVmaW5lIFVTRV9DT0xPUiI6IiIsbi52ZXJ0ZXhBbHBoYXM/IiNkZWZpbmUgVVNFX0NPTE9SX0FMUEhBIjoiIixuLnZlcnRleFV2cz8iI2RlZmluZSBVU0VfVVYiOiIiLG4udXZzVmVydGV4T25seT8iI2RlZmluZSBVVlNfVkVSVEVYX09OTFkiOiIiLG4uZmxhdFNoYWRpbmc/IiNkZWZpbmUgRkxBVF9TSEFERUQiOiIiLG4uc2tpbm5pbmc/IiNkZWZpbmUgVVNFX1NLSU5OSU5HIjoiIixuLnVzZVZlcnRleFRleHR1cmU/IiNkZWZpbmUgQk9ORV9URVhUVVJFIjoiIixuLm1vcnBoVGFyZ2V0cz8iI2RlZmluZSBVU0VfTU9SUEhUQVJHRVRTIjoiIixuLm1vcnBoTm9ybWFscyYmITE9PT1uLmZsYXRTaGFkaW5nPyIjZGVmaW5lIFVTRV9NT1JQSE5PUk1BTFMiOiIiLG4uZG91YmxlU2lkZWQ/IiNkZWZpbmUgRE9VQkxFX1NJREVEIjoiIixuLmZsaXBTaWRlZD8iI2RlZmluZSBGTElQX1NJREVEIjoiIixuLnNoYWRvd01hcEVuYWJsZWQ/IiNkZWZpbmUgVVNFX1NIQURPV01BUCI6IiIsbi5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lICIrbDoiIixuLnNpemVBdHRlbnVhdGlvbj8iI2RlZmluZSBVU0VfU0laRUFUVEVOVUFUSU9OIjoiIixuLmxvZ2FyaXRobWljRGVwdGhCdWZmZXI/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGIjoiIixuLmxvZ2FyaXRobWljRGVwdGhCdWZmZXImJm4ucmVuZGVyZXJFeHRlbnNpb25GcmFnRGVwdGg/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGX0VYVCI6IiIsInVuaWZvcm0gbWF0NCBtb2RlbE1hdHJpeDsiLCJ1bmlmb3JtIG1hdDQgbW9kZWxWaWV3TWF0cml4OyIsInVuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4OyIsInVuaWZvcm0gbWF0NCB2aWV3TWF0cml4OyIsInVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7IiwidW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOyIsInVuaWZvcm0gYm9vbCBpc09ydGhvZ3JhcGhpYzsiLCIjaWZkZWYgVVNFX0lOU1RBTkNJTkciLCJcdGF0dHJpYnV0ZSBtYXQ0IGluc3RhbmNlTWF0cml4OyIsIiNlbmRpZiIsIiNpZmRlZiBVU0VfSU5TVEFOQ0lOR19DT0xPUiIsIlx0YXR0cmlidXRlIHZlYzMgaW5zdGFuY2VDb2xvcjsiLCIjZW5kaWYiLCJhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjsiLCJhdHRyaWJ1dGUgdmVjMyBub3JtYWw7IiwiYXR0cmlidXRlIHZlYzIgdXY7IiwiI2lmZGVmIFVTRV9UQU5HRU5UIiwiXHRhdHRyaWJ1dGUgdmVjNCB0YW5nZW50OyIsIiNlbmRpZiIsIiNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKSIsIlx0YXR0cmlidXRlIHZlYzQgY29sb3I7IiwiI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SICkiLCJcdGF0dHJpYnV0ZSB2ZWMzIGNvbG9yOyIsIiNlbmRpZiIsIiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTIiwiXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDA7IiwiXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDE7IiwiXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDI7IiwiXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDM7IiwiXHQjaWZkZWYgVVNFX01PUlBITk9STUFMUyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDA7IiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMTsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwyOyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDM7IiwiXHQjZWxzZSIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDQ7IiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NTsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ2OyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDc7IiwiXHQjZW5kaWYiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX1NLSU5OSU5HIiwiXHRhdHRyaWJ1dGUgdmVjNCBza2luSW5kZXg7IiwiXHRhdHRyaWJ1dGUgdmVjNCBza2luV2VpZ2h0OyIsIiNlbmRpZiIsIlxuIl0uZmlsdGVyKHM1dCkuam9pbigiXG4iKSxTPVtfLHk1dChuKSwiI2RlZmluZSBTSEFERVJfTkFNRSAiK24uc2hhZGVyTmFtZSx2LG4uYWxwaGFUZXN0PyIjZGVmaW5lIEFMUEhBVEVTVCAiK24uYWxwaGFUZXN0KyhuLmFscGhhVGVzdCUxPyIiOiIuMCIpOiIiLCIjZGVmaW5lIEdBTU1BX0ZBQ1RPUiAiK2csbi51c2VGb2cmJm4uZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLG4udXNlRm9nJiZuLmZvZ0V4cDI/IiNkZWZpbmUgRk9HX0VYUDIiOiIiLG4ubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLG4ubWF0Y2FwPyIjZGVmaW5lIFVTRV9NQVRDQVAiOiIiLG4uZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLG4uZW52TWFwPyIjZGVmaW5lICIrdToiIixuLmVudk1hcD8iI2RlZmluZSAiK2Q6IiIsbi5lbnZNYXA/IiNkZWZpbmUgIitmOiIiLG4ubGlnaHRNYXA/IiNkZWZpbmUgVVNFX0xJR0hUTUFQIjoiIixuLmFvTWFwPyIjZGVmaW5lIFVTRV9BT01BUCI6IiIsbi5lbWlzc2l2ZU1hcD8iI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAiOiIiLG4uYnVtcE1hcD8iI2RlZmluZSBVU0VfQlVNUE1BUCI6IiIsbi5ub3JtYWxNYXA/IiNkZWZpbmUgVVNFX05PUk1BTE1BUCI6IiIsbi5ub3JtYWxNYXAmJm4ub2JqZWN0U3BhY2VOb3JtYWxNYXA/IiNkZWZpbmUgT0JKRUNUU1BBQ0VfTk9STUFMTUFQIjoiIixuLm5vcm1hbE1hcCYmbi50YW5nZW50U3BhY2VOb3JtYWxNYXA/IiNkZWZpbmUgVEFOR0VOVFNQQUNFX05PUk1BTE1BUCI6IiIsbi5jbGVhcmNvYXRNYXA/IiNkZWZpbmUgVVNFX0NMRUFSQ09BVE1BUCI6IiIsbi5jbGVhcmNvYXRSb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAiOiIiLG4uY2xlYXJjb2F0Tm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQIjoiIixuLnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsbi5zcGVjdWxhckludGVuc2l0eU1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJJTlRFTlNJVFlNQVAiOiIiLG4uc3BlY3VsYXJUaW50TWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUlRJTlRNQVAiOiIiLG4ucm91Z2huZXNzTWFwPyIjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAiOiIiLG4ubWV0YWxuZXNzTWFwPyIjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAiOiIiLG4uYWxwaGFNYXA/IiNkZWZpbmUgVVNFX0FMUEhBTUFQIjoiIixuLnNoZWVuPyIjZGVmaW5lIFVTRV9TSEVFTiI6IiIsbi50cmFuc21pc3Npb24/IiNkZWZpbmUgVVNFX1RSQU5TTUlTU0lPTiI6IiIsbi50cmFuc21pc3Npb25NYXA/IiNkZWZpbmUgVVNFX1RSQU5TTUlTU0lPTk1BUCI6IiIsbi50aGlja25lc3NNYXA/IiNkZWZpbmUgVVNFX1RISUNLTkVTU01BUCI6IiIsbi52ZXJ0ZXhUYW5nZW50cz8iI2RlZmluZSBVU0VfVEFOR0VOVCI6IiIsbi52ZXJ0ZXhDb2xvcnN8fG4uaW5zdGFuY2luZ0NvbG9yPyIjZGVmaW5lIFVTRV9DT0xPUiI6IiIsbi52ZXJ0ZXhBbHBoYXM/IiNkZWZpbmUgVVNFX0NPTE9SX0FMUEhBIjoiIixuLnZlcnRleFV2cz8iI2RlZmluZSBVU0VfVVYiOiIiLG4udXZzVmVydGV4T25seT8iI2RlZmluZSBVVlNfVkVSVEVYX09OTFkiOiIiLG4uZ3JhZGllbnRNYXA/IiNkZWZpbmUgVVNFX0dSQURJRU5UTUFQIjoiIixuLmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIixuLmRvdWJsZVNpZGVkPyIjZGVmaW5lIERPVUJMRV9TSURFRCI6IiIsbi5mbGlwU2lkZWQ/IiNkZWZpbmUgRkxJUF9TSURFRCI6IiIsbi5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lIFVTRV9TSEFET1dNQVAiOiIiLG4uc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSAiK2w6IiIsbi5wcmVtdWx0aXBsaWVkQWxwaGE/IiNkZWZpbmUgUFJFTVVMVElQTElFRF9BTFBIQSI6IiIsbi5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cz8iI2RlZmluZSBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTIjoiIixuLmxvZ2FyaXRobWljRGVwdGhCdWZmZXI/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGIjoiIixuLmxvZ2FyaXRobWljRGVwdGhCdWZmZXImJm4ucmVuZGVyZXJFeHRlbnNpb25GcmFnRGVwdGg/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGX0VYVCI6IiIsKG4uZXh0ZW5zaW9uU2hhZGVyVGV4dHVyZUxPRHx8bi5lbnZNYXApJiZuLnJlbmRlcmVyRXh0ZW5zaW9uU2hhZGVyVGV4dHVyZUxvZD8iI2RlZmluZSBURVhUVVJFX0xPRF9FWFQiOiIiLCJ1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsiLCJ1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247IiwidW5pZm9ybSBib29sIGlzT3J0aG9ncmFwaGljOyIsMCE9PW4udG9uZU1hcHBpbmc/IiNkZWZpbmUgVE9ORV9NQVBQSU5HIjoiIiwwIT09bi50b25lTWFwcGluZz9zMHQudG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudDoiIiwwIT09bi50b25lTWFwcGluZz9hNXQoInRvbmVNYXBwaW5nIixuLnRvbmVNYXBwaW5nKToiIixuLmRpdGhlcmluZz8iI2RlZmluZSBESVRIRVJJTkciOiIiLHMwdC5lbmNvZGluZ3NfcGFyc19mcmFnbWVudCxuLm1hcD9yNXQoIm1hcFRleGVsVG9MaW5lYXIiLG4ubWFwRW5jb2RpbmcpOiIiLG4ubWF0Y2FwP3I1dCgibWF0Y2FwVGV4ZWxUb0xpbmVhciIsbi5tYXRjYXBFbmNvZGluZyk6IiIsbi5lbnZNYXA/cjV0KCJlbnZNYXBUZXhlbFRvTGluZWFyIixuLmVudk1hcEVuY29kaW5nKToiIixuLmVtaXNzaXZlTWFwP3I1dCgiZW1pc3NpdmVNYXBUZXhlbFRvTGluZWFyIixuLmVtaXNzaXZlTWFwRW5jb2RpbmcpOiIiLG4uc3BlY3VsYXJUaW50TWFwP3I1dCgic3BlY3VsYXJUaW50TWFwVGV4ZWxUb0xpbmVhciIsbi5zcGVjdWxhclRpbnRNYXBFbmNvZGluZyk6IiIsbi5saWdodE1hcD9yNXQoImxpZ2h0TWFwVGV4ZWxUb0xpbmVhciIsbi5saWdodE1hcEVuY29kaW5nKToiIixvNXQoImxpbmVhclRvT3V0cHV0VGV4ZWwiLG4ub3V0cHV0RW5jb2RpbmcpLG4uZGVwdGhQYWNraW5nPyIjZGVmaW5lIERFUFRIX1BBQ0tJTkcgIituLmRlcHRoUGFja2luZzoiIiwiXG4iXS5maWx0ZXIoczV0KS5qb2luKCJcbiIpKSxhPWg1dChhKSxhPWw1dChhLG4pLGE9YzV0KGEsbikscz1oNXQocykscz1sNXQocyxuKSxzPWM1dChzLG4pLGE9bTV0KGEpLHM9bTV0KHMpLG4uaXNXZWJHTDImJiEwIT09bi5pc1Jhd1NoYWRlck1hdGVyaWFsJiYoTT0iI3ZlcnNpb24gMzAwIGVzXG4iLHc9WyIjZGVmaW5lIGF0dHJpYnV0ZSBpbiIsIiNkZWZpbmUgdmFyeWluZyBvdXQiLCIjZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlIl0uam9pbigiXG4iKSsiXG4iK3csUz1bIiNkZWZpbmUgdmFyeWluZyBpbiIsbi5nbHNsVmVyc2lvbj09PVVadD8iIjoib3V0IGhpZ2hwIHZlYzQgcGNfZnJhZ0NvbG9yOyIsbi5nbHNsVmVyc2lvbj09PVVadD8iIjoiI2RlZmluZSBnbF9GcmFnQ29sb3IgcGNfZnJhZ0NvbG9yIiwiI2RlZmluZSBnbF9GcmFnRGVwdGhFWFQgZ2xfRnJhZ0RlcHRoIiwiI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZSIsIiNkZWZpbmUgdGV4dHVyZUN1YmUgdGV4dHVyZSIsIiNkZWZpbmUgdGV4dHVyZTJEUHJvaiB0ZXh0dXJlUHJvaiIsIiNkZWZpbmUgdGV4dHVyZTJETG9kRVhUIHRleHR1cmVMb2QiLCIjZGVmaW5lIHRleHR1cmUyRFByb2pMb2RFWFQgdGV4dHVyZVByb2pMb2QiLCIjZGVmaW5lIHRleHR1cmVDdWJlTG9kRVhUIHRleHR1cmVMb2QiLCIjZGVmaW5lIHRleHR1cmUyREdyYWRFWFQgdGV4dHVyZUdyYWQiLCIjZGVmaW5lIHRleHR1cmUyRFByb2pHcmFkRVhUIHRleHR1cmVQcm9qR3JhZCIsIiNkZWZpbmUgdGV4dHVyZUN1YmVHcmFkRVhUIHRleHR1cmVHcmFkIl0uam9pbigiXG4iKSsiXG4iK1MpO2NvbnN0IEU9TStTK3MsVD10NXQociwzNTYzMyxNK3crYSksQz10NXQociwzNTYzMixFKTtpZihyLmF0dGFjaFNoYWRlcih4LFQpLHIuYXR0YWNoU2hhZGVyKHgsQyksdm9pZCAwIT09bi5pbmRleDBBdHRyaWJ1dGVOYW1lP3IuYmluZEF0dHJpYkxvY2F0aW9uKHgsMCxuLmluZGV4MEF0dHJpYnV0ZU5hbWUpOiEwPT09bi5tb3JwaFRhcmdldHMmJnIuYmluZEF0dHJpYkxvY2F0aW9uKHgsMCwicG9zaXRpb24iKSxyLmxpbmtQcm9ncmFtKHgpLHQuZGVidWcuY2hlY2tTaGFkZXJFcnJvcnMpe2NvbnN0IHQ9ci5nZXRQcm9ncmFtSW5mb0xvZyh4KS50cmltKCksZT1yLmdldFNoYWRlckluZm9Mb2coVCkudHJpbSgpLG49ci5nZXRTaGFkZXJJbmZvTG9nKEMpLnRyaW0oKTtsZXQgaT0hMCxvPSEwO2lmKCExPT09ci5nZXRQcm9ncmFtUGFyYW1ldGVyKHgsMzU3MTQpKXtpPSExO2NvbnN0IGU9aTV0KHIsVCwidmVydGV4Iiksbj1pNXQocixDLCJmcmFnbWVudCIpO2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUHJvZ3JhbTogc2hhZGVyIGVycm9yOiAiLHIuZ2V0RXJyb3IoKSwiMzU3MTUiLHIuZ2V0UHJvZ3JhbVBhcmFtZXRlcih4LDM1NzE1KSwiZ2wuZ2V0UHJvZ3JhbUluZm9Mb2ciLHQsZSxuKX1lbHNlIiIhPT10P2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtOiBnbC5nZXRQcm9ncmFtSW5mb0xvZygpIix0KToiIiE9PWUmJiIiIT09bnx8KG89ITEpO28mJih0aGlzLmRpYWdub3N0aWNzPXtydW5uYWJsZTppLHByb2dyYW1Mb2c6dCx2ZXJ0ZXhTaGFkZXI6e2xvZzplLHByZWZpeDp3fSxmcmFnbWVudFNoYWRlcjp7bG9nOm4scHJlZml4OlN9fSl9bGV0IEEsaztyZXR1cm4gci5kZWxldGVTaGFkZXIoVCksci5kZWxldGVTaGFkZXIoQyksdGhpcy5nZXRVbmlmb3Jtcz1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1BJiYoQT1uZXcgUTJ0KHIseCkpLEF9LHRoaXMuZ2V0QXR0cmlidXRlcz1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1rJiYoaz0oZnVuY3Rpb24gdChlLG4pe2NvbnN0IGk9e30scj1lLmdldFByb2dyYW1QYXJhbWV0ZXIobiwzNTcyMSk7Zm9yKGxldCB0PTA7dDxyO3QrKyl7Y29uc3Qgcj1lLmdldEFjdGl2ZUF0dHJpYihuLHQpLm5hbWU7aVtyXT1lLmdldEF0dHJpYkxvY2F0aW9uKG4scil9cmV0dXJuIGl9KShyLHgpKSxrfSx0aGlzLmRlc3Ryb3k9ZnVuY3Rpb24oKXtpLnJlbGVhc2VTdGF0ZXNPZlByb2dyYW0odGhpcyksci5kZWxldGVQcm9ncmFtKHgpLHRoaXMucHJvZ3JhbT12b2lkIDB9LHRoaXMubmFtZT1uLnNoYWRlck5hbWUsdGhpcy5pZD1lNXQrKyx0aGlzLmNhY2hlS2V5PWUsdGhpcy51c2VkVGltZXM9MSx0aGlzLnByb2dyYW09eCx0aGlzLnZlcnRleFNoYWRlcj1ULHRoaXMuZnJhZ21lbnRTaGFkZXI9Qyx0aGlzfWZ1bmN0aW9uIGI1dCh0LGUsbixpLHIsbyxhKXtjb25zdCBzPVtdLGw9ci5pc1dlYkdMMixjPXIubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcix1PXIuZmxvYXRWZXJ0ZXhUZXh0dXJlcyxoPXIubWF4VmVydGV4VW5pZm9ybXMsZD1yLnZlcnRleFRleHR1cmVzO2xldCBwPXIucHJlY2lzaW9uO2NvbnN0IGY9e01lc2hEZXB0aE1hdGVyaWFsOiJkZXB0aCIsTWVzaERpc3RhbmNlTWF0ZXJpYWw6ImRpc3RhbmNlUkdCQSIsTWVzaE5vcm1hbE1hdGVyaWFsOiJub3JtYWwiLE1lc2hCYXNpY01hdGVyaWFsOiJiYXNpYyIsTWVzaExhbWJlcnRNYXRlcmlhbDoibGFtYmVydCIsTWVzaFBob25nTWF0ZXJpYWw6InBob25nIixNZXNoVG9vbk1hdGVyaWFsOiJ0b29uIixNZXNoU3RhbmRhcmRNYXRlcmlhbDoicGh5c2ljYWwiLE1lc2hQaHlzaWNhbE1hdGVyaWFsOiJwaHlzaWNhbCIsTWVzaE1hdGNhcE1hdGVyaWFsOiJtYXRjYXAiLExpbmVCYXNpY01hdGVyaWFsOiJiYXNpYyIsTGluZURhc2hlZE1hdGVyaWFsOiJkYXNoZWQiLFBvaW50c01hdGVyaWFsOiJwb2ludHMiLFNoYWRvd01hdGVyaWFsOiJzaGFkb3ciLFNwcml0ZU1hdGVyaWFsOiJzcHJpdGUifSxtPVsicHJlY2lzaW9uIiwiaXNXZWJHTDIiLCJzdXBwb3J0c1ZlcnRleFRleHR1cmVzIiwib3V0cHV0RW5jb2RpbmciLCJpbnN0YW5jaW5nIiwiaW5zdGFuY2luZ0NvbG9yIiwibWFwIiwibWFwRW5jb2RpbmciLCJtYXRjYXAiLCJtYXRjYXBFbmNvZGluZyIsImVudk1hcCIsImVudk1hcE1vZGUiLCJlbnZNYXBFbmNvZGluZyIsImVudk1hcEN1YmVVViIsImxpZ2h0TWFwIiwibGlnaHRNYXBFbmNvZGluZyIsImFvTWFwIiwiZW1pc3NpdmVNYXAiLCJlbWlzc2l2ZU1hcEVuY29kaW5nIiwiYnVtcE1hcCIsIm5vcm1hbE1hcCIsIm9iamVjdFNwYWNlTm9ybWFsTWFwIiwidGFuZ2VudFNwYWNlTm9ybWFsTWFwIiwiY2xlYXJjb2F0TWFwIiwiY2xlYXJjb2F0Um91Z2huZXNzTWFwIiwiY2xlYXJjb2F0Tm9ybWFsTWFwIiwiZGlzcGxhY2VtZW50TWFwIiwic3BlY3VsYXJNYXAiLCJzcGVjdWxhckludGVuc2l0eU1hcCIsInNwZWN1bGFyVGludE1hcCIsInNwZWN1bGFyVGludE1hcEVuY29kaW5nIiwicm91Z2huZXNzTWFwIiwibWV0YWxuZXNzTWFwIiwiZ3JhZGllbnRNYXAiLCJhbHBoYU1hcCIsImNvbWJpbmUiLCJ2ZXJ0ZXhDb2xvcnMiLCJ2ZXJ0ZXhBbHBoYXMiLCJ2ZXJ0ZXhUYW5nZW50cyIsInZlcnRleFV2cyIsInV2c1ZlcnRleE9ubHkiLCJmb2ciLCJ1c2VGb2ciLCJmb2dFeHAyIiwiZmxhdFNoYWRpbmciLCJzaXplQXR0ZW51YXRpb24iLCJsb2dhcml0aG1pY0RlcHRoQnVmZmVyIiwic2tpbm5pbmciLCJtYXhCb25lcyIsInVzZVZlcnRleFRleHR1cmUiLCJtb3JwaFRhcmdldHMiLCJtb3JwaE5vcm1hbHMiLCJwcmVtdWx0aXBsaWVkQWxwaGEiLCJudW1EaXJMaWdodHMiLCJudW1Qb2ludExpZ2h0cyIsIm51bVNwb3RMaWdodHMiLCJudW1IZW1pTGlnaHRzIiwibnVtUmVjdEFyZWFMaWdodHMiLCJudW1EaXJMaWdodFNoYWRvd3MiLCJudW1Qb2ludExpZ2h0U2hhZG93cyIsIm51bVNwb3RMaWdodFNoYWRvd3MiLCJzaGFkb3dNYXBFbmFibGVkIiwic2hhZG93TWFwVHlwZSIsInRvbmVNYXBwaW5nIiwicGh5c2ljYWxseUNvcnJlY3RMaWdodHMiLCJhbHBoYVRlc3QiLCJkb3VibGVTaWRlZCIsImZsaXBTaWRlZCIsIm51bUNsaXBwaW5nUGxhbmVzIiwibnVtQ2xpcEludGVyc2VjdGlvbiIsImRlcHRoUGFja2luZyIsImRpdGhlcmluZyIsInNoZWVuIiwidHJhbnNtaXNzaW9uIiwidHJhbnNtaXNzaW9uTWFwIiwidGhpY2tuZXNzTWFwIl07ZnVuY3Rpb24gZyh0KXtsZXQgZTtyZXR1cm4gdCYmdC5pc1RleHR1cmU/ZT10LmVuY29kaW5nOnQmJnQuaXNXZWJHTFJlbmRlclRhcmdldD8oY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW1zLmdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXA6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksZT10LnRleHR1cmUuZW5jb2RpbmcpOmU9Tlp0LGV9cmV0dXJue2dldFBhcmFtZXRlcnM6ZnVuY3Rpb24gXyhvLHMsbSx5LHYpe2NvbnN0IGI9eS5mb2cseD0oby5pc01lc2hTdGFuZGFyZE1hdGVyaWFsP246ZSkuZ2V0KG8uZW52TWFwfHwoby5pc01lc2hTdGFuZGFyZE1hdGVyaWFsP3kuZW52aXJvbm1lbnQ6bnVsbCkpLHc9ZltvLnR5cGVdLFM9di5pc1NraW5uZWRNZXNoPyhmdW5jdGlvbiBNKHQpe2NvbnN0IGU9dC5za2VsZXRvbi5ib25lcztpZih1KXJldHVybiAxMDI0O3tjb25zdCB0PU1hdGguZmxvb3IoKGgtMjApLzQpLG49TWF0aC5taW4odCxlLmxlbmd0aCk7cmV0dXJuIG48ZS5sZW5ndGg/KGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogU2tlbGV0b24gaGFzICIrZS5sZW5ndGgrIiBib25lcy4gVGhpcyBHUFUgc3VwcG9ydHMgIituKyIuIiksMCk6bn19KSh2KTowO2xldCBFLFQ7aWYobnVsbCE9PW8ucHJlY2lzaW9uJiYocD1yLmdldE1heFByZWNpc2lvbihvLnByZWNpc2lvbikscCE9PW8ucHJlY2lzaW9uJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUHJvZ3JhbS5nZXRQYXJhbWV0ZXJzOiIsby5wcmVjaXNpb24sIm5vdCBzdXBwb3J0ZWQsIHVzaW5nIixwLCJpbnN0ZWFkLiIpKSx3KXtjb25zdCB0PWMwdFt3XTtFPXQudmVydGV4U2hhZGVyLFQ9dC5mcmFnbWVudFNoYWRlcn1lbHNlIEU9by52ZXJ0ZXhTaGFkZXIsVD1vLmZyYWdtZW50U2hhZGVyO2NvbnN0IEM9dC5nZXRSZW5kZXJUYXJnZXQoKTtyZXR1cm57aXNXZWJHTDI6bCxzaGFkZXJJRDp3LHNoYWRlck5hbWU6by50eXBlLHZlcnRleFNoYWRlcjpFLGZyYWdtZW50U2hhZGVyOlQsZGVmaW5lczpvLmRlZmluZXMsaXNSYXdTaGFkZXJNYXRlcmlhbDohMD09PW8uaXNSYXdTaGFkZXJNYXRlcmlhbCxnbHNsVmVyc2lvbjpvLmdsc2xWZXJzaW9uLHByZWNpc2lvbjpwLGluc3RhbmNpbmc6ITA9PT12LmlzSW5zdGFuY2VkTWVzaCxpbnN0YW5jaW5nQ29sb3I6ITA9PT12LmlzSW5zdGFuY2VkTWVzaCYmbnVsbCE9PXYuaW5zdGFuY2VDb2xvcixzdXBwb3J0c1ZlcnRleFRleHR1cmVzOmQsb3V0cHV0RW5jb2Rpbmc6bnVsbCE9PUM/ZyhDLnRleHR1cmUpOnQub3V0cHV0RW5jb2RpbmcsbWFwOiEhby5tYXAsbWFwRW5jb2Rpbmc6ZyhvLm1hcCksbWF0Y2FwOiEhby5tYXRjYXAsbWF0Y2FwRW5jb2Rpbmc6ZyhvLm1hdGNhcCksZW52TWFwOiEheCxlbnZNYXBNb2RlOngmJngubWFwcGluZyxlbnZNYXBFbmNvZGluZzpnKHgpLGVudk1hcEN1YmVVVjohIXgmJih4Lm1hcHBpbmc9PT1ZS3R8fHgubWFwcGluZz09PVhLdCksbGlnaHRNYXA6ISFvLmxpZ2h0TWFwLGxpZ2h0TWFwRW5jb2Rpbmc6ZyhvLmxpZ2h0TWFwKSxhb01hcDohIW8uYW9NYXAsZW1pc3NpdmVNYXA6ISFvLmVtaXNzaXZlTWFwLGVtaXNzaXZlTWFwRW5jb2Rpbmc6ZyhvLmVtaXNzaXZlTWFwKSxidW1wTWFwOiEhby5idW1wTWFwLG5vcm1hbE1hcDohIW8ubm9ybWFsTWFwLG9iamVjdFNwYWNlTm9ybWFsTWFwOjE9PT1vLm5vcm1hbE1hcFR5cGUsdGFuZ2VudFNwYWNlTm9ybWFsTWFwOjA9PT1vLm5vcm1hbE1hcFR5cGUsY2xlYXJjb2F0TWFwOiEhby5jbGVhcmNvYXRNYXAsY2xlYXJjb2F0Um91Z2huZXNzTWFwOiEhby5jbGVhcmNvYXRSb3VnaG5lc3NNYXAsY2xlYXJjb2F0Tm9ybWFsTWFwOiEhby5jbGVhcmNvYXROb3JtYWxNYXAsZGlzcGxhY2VtZW50TWFwOiEhby5kaXNwbGFjZW1lbnRNYXAscm91Z2huZXNzTWFwOiEhby5yb3VnaG5lc3NNYXAsbWV0YWxuZXNzTWFwOiEhby5tZXRhbG5lc3NNYXAsc3BlY3VsYXJNYXA6ISFvLnNwZWN1bGFyTWFwLHNwZWN1bGFySW50ZW5zaXR5TWFwOiEhby5zcGVjdWxhckludGVuc2l0eU1hcCxzcGVjdWxhclRpbnRNYXA6ISFvLnNwZWN1bGFyVGludE1hcCxzcGVjdWxhclRpbnRNYXBFbmNvZGluZzpnKG8uc3BlY3VsYXJUaW50TWFwKSxhbHBoYU1hcDohIW8uYWxwaGFNYXAsZ3JhZGllbnRNYXA6ISFvLmdyYWRpZW50TWFwLHNoZWVuOiEhby5zaGVlbix0cmFuc21pc3Npb246ISFvLnRyYW5zbWlzc2lvbix0cmFuc21pc3Npb25NYXA6ISFvLnRyYW5zbWlzc2lvbk1hcCx0aGlja25lc3NNYXA6ISFvLnRoaWNrbmVzc01hcCxjb21iaW5lOm8uY29tYmluZSx2ZXJ0ZXhUYW5nZW50czohIW8ubm9ybWFsTWFwJiYhIXYuZ2VvbWV0cnkmJiEhdi5nZW9tZXRyeS5hdHRyaWJ1dGVzLnRhbmdlbnQsdmVydGV4Q29sb3JzOm8udmVydGV4Q29sb3JzLHZlcnRleEFscGhhczohMD09PW8udmVydGV4Q29sb3JzJiYhIXYuZ2VvbWV0cnkmJiEhdi5nZW9tZXRyeS5hdHRyaWJ1dGVzLmNvbG9yJiY0PT09di5nZW9tZXRyeS5hdHRyaWJ1dGVzLmNvbG9yLml0ZW1TaXplLHZlcnRleFV2czohIShvLm1hcHx8by5idW1wTWFwfHxvLm5vcm1hbE1hcHx8by5zcGVjdWxhck1hcHx8by5hbHBoYU1hcHx8by5lbWlzc2l2ZU1hcHx8by5yb3VnaG5lc3NNYXB8fG8ubWV0YWxuZXNzTWFwfHxvLmNsZWFyY29hdE1hcHx8by5jbGVhcmNvYXRSb3VnaG5lc3NNYXB8fG8uY2xlYXJjb2F0Tm9ybWFsTWFwfHxvLmRpc3BsYWNlbWVudE1hcHx8by50cmFuc21pc3Npb25NYXB8fG8udGhpY2tuZXNzTWFwfHxvLnNwZWN1bGFySW50ZW5zaXR5TWFwfHxvLnNwZWN1bGFyVGludE1hcCksdXZzVmVydGV4T25seTohKG8ubWFwfHxvLmJ1bXBNYXB8fG8ubm9ybWFsTWFwfHxvLnNwZWN1bGFyTWFwfHxvLmFscGhhTWFwfHxvLmVtaXNzaXZlTWFwfHxvLnJvdWdobmVzc01hcHx8by5tZXRhbG5lc3NNYXB8fG8uY2xlYXJjb2F0Tm9ybWFsTWFwfHxvLnRyYW5zbWlzc2lvbnx8by50cmFuc21pc3Npb25NYXB8fG8udGhpY2tuZXNzTWFwfHxvLnNwZWN1bGFySW50ZW5zaXR5TWFwfHxvLnNwZWN1bGFyVGludE1hcHx8IW8uZGlzcGxhY2VtZW50TWFwKSxmb2c6ISFiLHVzZUZvZzpvLmZvZyxmb2dFeHAyOmImJmIuaXNGb2dFeHAyLGZsYXRTaGFkaW5nOiEhby5mbGF0U2hhZGluZyxzaXplQXR0ZW51YXRpb246by5zaXplQXR0ZW51YXRpb24sbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjpjLHNraW5uaW5nOiEwPT09di5pc1NraW5uZWRNZXNoJiZTPjAsbWF4Qm9uZXM6Uyx1c2VWZXJ0ZXhUZXh0dXJlOnUsbW9ycGhUYXJnZXRzOiEhdi5nZW9tZXRyeSYmISF2Lmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixtb3JwaE5vcm1hbHM6ISF2Lmdlb21ldHJ5JiYhIXYuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCxudW1EaXJMaWdodHM6cy5kaXJlY3Rpb25hbC5sZW5ndGgsbnVtUG9pbnRMaWdodHM6cy5wb2ludC5sZW5ndGgsbnVtU3BvdExpZ2h0czpzLnNwb3QubGVuZ3RoLG51bVJlY3RBcmVhTGlnaHRzOnMucmVjdEFyZWEubGVuZ3RoLG51bUhlbWlMaWdodHM6cy5oZW1pLmxlbmd0aCxudW1EaXJMaWdodFNoYWRvd3M6cy5kaXJlY3Rpb25hbFNoYWRvd01hcC5sZW5ndGgsbnVtUG9pbnRMaWdodFNoYWRvd3M6cy5wb2ludFNoYWRvd01hcC5sZW5ndGgsbnVtU3BvdExpZ2h0U2hhZG93czpzLnNwb3RTaGFkb3dNYXAubGVuZ3RoLG51bUNsaXBwaW5nUGxhbmVzOmEubnVtUGxhbmVzLG51bUNsaXBJbnRlcnNlY3Rpb246YS5udW1JbnRlcnNlY3Rpb24sZGl0aGVyaW5nOm8uZGl0aGVyaW5nLHNoYWRvd01hcEVuYWJsZWQ6dC5zaGFkb3dNYXAuZW5hYmxlZCYmbS5sZW5ndGg+MCxzaGFkb3dNYXBUeXBlOnQuc2hhZG93TWFwLnR5cGUsdG9uZU1hcHBpbmc6by50b25lTWFwcGVkP3QudG9uZU1hcHBpbmc6MCxwaHlzaWNhbGx5Q29ycmVjdExpZ2h0czp0LnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzLHByZW11bHRpcGxpZWRBbHBoYTpvLnByZW11bHRpcGxpZWRBbHBoYSxhbHBoYVRlc3Q6by5hbHBoYVRlc3QsZG91YmxlU2lkZWQ6Mj09PW8uc2lkZSxmbGlwU2lkZWQ6MT09PW8uc2lkZSxkZXB0aFBhY2tpbmc6dm9pZCAwIT09by5kZXB0aFBhY2tpbmcmJm8uZGVwdGhQYWNraW5nLGluZGV4MEF0dHJpYnV0ZU5hbWU6by5pbmRleDBBdHRyaWJ1dGVOYW1lLGV4dGVuc2lvbkRlcml2YXRpdmVzOm8uZXh0ZW5zaW9ucyYmby5leHRlbnNpb25zLmRlcml2YXRpdmVzLGV4dGVuc2lvbkZyYWdEZXB0aDpvLmV4dGVuc2lvbnMmJm8uZXh0ZW5zaW9ucy5mcmFnRGVwdGgsZXh0ZW5zaW9uRHJhd0J1ZmZlcnM6by5leHRlbnNpb25zJiZvLmV4dGVuc2lvbnMuZHJhd0J1ZmZlcnMsZXh0ZW5zaW9uU2hhZGVyVGV4dHVyZUxPRDpvLmV4dGVuc2lvbnMmJm8uZXh0ZW5zaW9ucy5zaGFkZXJUZXh0dXJlTE9ELHJlbmRlcmVyRXh0ZW5zaW9uRnJhZ0RlcHRoOmx8fGkuaGFzKCJFWFRfZnJhZ19kZXB0aCIpLHJlbmRlcmVyRXh0ZW5zaW9uRHJhd0J1ZmZlcnM6bHx8aS5oYXMoIldFQkdMX2RyYXdfYnVmZmVycyIpLHJlbmRlcmVyRXh0ZW5zaW9uU2hhZGVyVGV4dHVyZUxvZDpsfHxpLmhhcygiRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCIpLGN1c3RvbVByb2dyYW1DYWNoZUtleTpvLmN1c3RvbVByb2dyYW1DYWNoZUtleSgpfX0sZ2V0UHJvZ3JhbUNhY2hlS2V5OmZ1bmN0aW9uIHkoZSl7Y29uc3Qgbj1bXTtpZihlLnNoYWRlcklEP24ucHVzaChlLnNoYWRlcklEKToobi5wdXNoKGUuZnJhZ21lbnRTaGFkZXIpLG4ucHVzaChlLnZlcnRleFNoYWRlcikpLHZvaWQgMCE9PWUuZGVmaW5lcylmb3IoY29uc3QgdCBpbiBlLmRlZmluZXMpbi5wdXNoKHQpLG4ucHVzaChlLmRlZmluZXNbdF0pO2lmKCExPT09ZS5pc1Jhd1NoYWRlck1hdGVyaWFsKXtmb3IobGV0IHQ9MDt0PG0ubGVuZ3RoO3QrKyluLnB1c2goZVttW3RdXSk7bi5wdXNoKHQub3V0cHV0RW5jb2RpbmcpLG4ucHVzaCh0LmdhbW1hRmFjdG9yKX1yZXR1cm4gbi5wdXNoKGUuY3VzdG9tUHJvZ3JhbUNhY2hlS2V5KSxuLmpvaW4oKX0sZ2V0VW5pZm9ybXM6ZnVuY3Rpb24gdih0KXtjb25zdCBlPWZbdC50eXBlXTtsZXQgbjtyZXR1cm4gbj1lP2oxdC5jbG9uZShjMHRbZV0udW5pZm9ybXMpOnQudW5pZm9ybXMsbn0sYWNxdWlyZVByb2dyYW06ZnVuY3Rpb24gYihlLG4pe2xldCBpO2ZvcihsZXQgdD0wLGU9cy5sZW5ndGg7dDxlO3QrKyl7Y29uc3QgZT1zW3RdO2lmKGUuY2FjaGVLZXk9PT1uKXtpPWUsKytpLnVzZWRUaW1lczticmVha319cmV0dXJuIHZvaWQgMD09PWkmJihpPW5ldyB2NXQodCxuLGUsbykscy5wdXNoKGkpKSxpfSxyZWxlYXNlUHJvZ3JhbTpmdW5jdGlvbiB4KHQpe2lmKDA9PS0tdC51c2VkVGltZXMpe2NvbnN0IGU9cy5pbmRleE9mKHQpO3NbZV09c1tzLmxlbmd0aC0xXSxzLnBvcCgpLHQuZGVzdHJveSgpfX0scHJvZ3JhbXM6c319ZnVuY3Rpb24geDV0KCl7bGV0IHQ9bmV3IFdlYWtNYXA7cmV0dXJue2dldDpmdW5jdGlvbiBlKG4pe2xldCBpPXQuZ2V0KG4pO3JldHVybiB2b2lkIDA9PT1pJiYoaT17fSx0LnNldChuLGkpKSxpfSxyZW1vdmU6ZnVuY3Rpb24gbihlKXt0LmRlbGV0ZShlKX0sdXBkYXRlOmZ1bmN0aW9uIGkoZSxuLHIpe3QuZ2V0KGUpW25dPXJ9LGRpc3Bvc2U6ZnVuY3Rpb24gcigpe3Q9bmV3IFdlYWtNYXB9fX1mdW5jdGlvbiB3NXQodCxlKXtyZXR1cm4gdC5ncm91cE9yZGVyIT09ZS5ncm91cE9yZGVyP3QuZ3JvdXBPcmRlci1lLmdyb3VwT3JkZXI6dC5yZW5kZXJPcmRlciE9PWUucmVuZGVyT3JkZXI/dC5yZW5kZXJPcmRlci1lLnJlbmRlck9yZGVyOnQucHJvZ3JhbSE9PWUucHJvZ3JhbT90LnByb2dyYW0uaWQtZS5wcm9ncmFtLmlkOnQubWF0ZXJpYWwuaWQhPT1lLm1hdGVyaWFsLmlkP3QubWF0ZXJpYWwuaWQtZS5tYXRlcmlhbC5pZDp0LnohPT1lLno/dC56LWUuejp0LmlkLWUuaWR9ZnVuY3Rpb24gUzV0KHQsZSl7cmV0dXJuIHQuZ3JvdXBPcmRlciE9PWUuZ3JvdXBPcmRlcj90Lmdyb3VwT3JkZXItZS5ncm91cE9yZGVyOnQucmVuZGVyT3JkZXIhPT1lLnJlbmRlck9yZGVyP3QucmVuZGVyT3JkZXItZS5yZW5kZXJPcmRlcjp0LnohPT1lLno/ZS56LXQuejp0LmlkLWUuaWR9ZnVuY3Rpb24gTTV0KHQpe2NvbnN0IGU9W107bGV0IG49MDtjb25zdCBpPVtdLHI9W10sbz1bXSxhPXtpZDotMX07ZnVuY3Rpb24gcyhpLHIsbyxzLGwsYyl7bGV0IHU9ZVtuXTtjb25zdCBoPXQuZ2V0KG8pO3JldHVybiB2b2lkIDA9PT11Pyh1PXtpZDppLmlkLG9iamVjdDppLGdlb21ldHJ5OnIsbWF0ZXJpYWw6byxwcm9ncmFtOmgucHJvZ3JhbXx8YSxncm91cE9yZGVyOnMscmVuZGVyT3JkZXI6aS5yZW5kZXJPcmRlcix6OmwsZ3JvdXA6Y30sZVtuXT11KToodS5pZD1pLmlkLHUub2JqZWN0PWksdS5nZW9tZXRyeT1yLHUubWF0ZXJpYWw9byx1LnByb2dyYW09aC5wcm9ncmFtfHxhLHUuZ3JvdXBPcmRlcj1zLHUucmVuZGVyT3JkZXI9aS5yZW5kZXJPcmRlcix1Lno9bCx1Lmdyb3VwPWMpLG4rKyx1fXJldHVybntvcGFxdWU6aSx0cmFuc21pc3NpdmU6cix0cmFuc3BhcmVudDpvLGluaXQ6ZnVuY3Rpb24gbCgpe249MCxpLmxlbmd0aD0wLHIubGVuZ3RoPTAsby5sZW5ndGg9MH0scHVzaDpmdW5jdGlvbiBjKHQsZSxuLGEsbCx1KXtjb25zdCBoPXModCxlLG4sYSxsLHUpO24udHJhbnNtaXNzaW9uPjA/ci5wdXNoKGgpOiEwPT09bi50cmFuc3BhcmVudD9vLnB1c2goaCk6aS5wdXNoKGgpfSx1bnNoaWZ0OmZ1bmN0aW9uIHUodCxlLG4sYSxsLGMpe2NvbnN0IHU9cyh0LGUsbixhLGwsYyk7bi50cmFuc21pc3Npb24+MD9yLnVuc2hpZnQodSk6ITA9PT1uLnRyYW5zcGFyZW50P28udW5zaGlmdCh1KTppLnVuc2hpZnQodSl9LGZpbmlzaDpmdW5jdGlvbiBoKCl7Zm9yKGxldCB0PW4saT1lLmxlbmd0aDt0PGk7dCsrKXtjb25zdCBuPWVbdF07aWYobnVsbD09PW4uaWQpYnJlYWs7bi5pZD1udWxsLG4ub2JqZWN0PW51bGwsbi5nZW9tZXRyeT1udWxsLG4ubWF0ZXJpYWw9bnVsbCxuLnByb2dyYW09bnVsbCxuLmdyb3VwPW51bGx9fSxzb3J0OmZ1bmN0aW9uIGQodCxlKXtpLmxlbmd0aD4xJiZpLnNvcnQodHx8dzV0KSxyLmxlbmd0aD4xJiZyLnNvcnQoZXx8UzV0KSxvLmxlbmd0aD4xJiZvLnNvcnQoZXx8UzV0KX19fWZ1bmN0aW9uIEU1dCh0KXtsZXQgZT1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uIG4oaSxyKXtsZXQgbztyZXR1cm4hMT09PWUuaGFzKGkpPyhvPW5ldyBNNXQodCksZS5zZXQoaSxbb10pKTpyPj1lLmdldChpKS5sZW5ndGg/KG89bmV3IE01dCh0KSxlLmdldChpKS5wdXNoKG8pKTpvPWUuZ2V0KGkpW3JdLG99LGRpc3Bvc2U6ZnVuY3Rpb24gaSgpe2U9bmV3IFdlYWtNYXB9fX1mdW5jdGlvbiBUNXQoKXtjb25zdCB0PXt9O3JldHVybntnZXQ6ZnVuY3Rpb24oZSl7aWYodm9pZCAwIT09dFtlLmlkXSlyZXR1cm4gdFtlLmlkXTtsZXQgbjtzd2l0Y2goZS50eXBlKXtjYXNlIkRpcmVjdGlvbmFsTGlnaHQiOm49e2RpcmVjdGlvbjpuZXcgQ0p0LGNvbG9yOm5ldyAkUXR9O2JyZWFrO2Nhc2UiU3BvdExpZ2h0IjpuPXtwb3NpdGlvbjpuZXcgQ0p0LGRpcmVjdGlvbjpuZXcgQ0p0LGNvbG9yOm5ldyAkUXQsZGlzdGFuY2U6MCxjb25lQ29zOjAscGVudW1icmFDb3M6MCxkZWNheTowfTticmVhaztjYXNlIlBvaW50TGlnaHQiOm49e3Bvc2l0aW9uOm5ldyBDSnQsY29sb3I6bmV3ICRRdCxkaXN0YW5jZTowLGRlY2F5OjB9O2JyZWFrO2Nhc2UiSGVtaXNwaGVyZUxpZ2h0IjpuPXtkaXJlY3Rpb246bmV3IENKdCxza3lDb2xvcjpuZXcgJFF0LGdyb3VuZENvbG9yOm5ldyAkUXR9O2JyZWFrO2Nhc2UiUmVjdEFyZWFMaWdodCI6bj17Y29sb3I6bmV3ICRRdCxwb3NpdGlvbjpuZXcgQ0p0LGhhbGZXaWR0aDpuZXcgQ0p0LGhhbGZIZWlnaHQ6bmV3IENKdH19cmV0dXJuIHRbZS5pZF09bixufX19bGV0IEM1dD0wO2Z1bmN0aW9uIEE1dCh0LGUpe3JldHVybihlLmNhc3RTaGFkb3c/MTowKS0odC5jYXN0U2hhZG93PzE6MCl9ZnVuY3Rpb24gazV0KHQsZSl7Y29uc3Qgbj1uZXcgVDV0LGk9KGZ1bmN0aW9uIHIoKXtjb25zdCB0PXt9O3JldHVybntnZXQ6ZnVuY3Rpb24oZSl7aWYodm9pZCAwIT09dFtlLmlkXSlyZXR1cm4gdFtlLmlkXTtsZXQgbjtzd2l0Y2goZS50eXBlKXtjYXNlIkRpcmVjdGlvbmFsTGlnaHQiOmNhc2UiU3BvdExpZ2h0IjpuPXtzaGFkb3dCaWFzOjAsc2hhZG93Tm9ybWFsQmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IG1KdH07YnJlYWs7Y2FzZSJQb2ludExpZ2h0IjpuPXtzaGFkb3dCaWFzOjAsc2hhZG93Tm9ybWFsQmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IG1KdCxzaGFkb3dDYW1lcmFOZWFyOjEsc2hhZG93Q2FtZXJhRmFyOjFlM319cmV0dXJuIHRbZS5pZF09bixufX19KSgpLG89e3ZlcnNpb246MCxoYXNoOntkaXJlY3Rpb25hbExlbmd0aDotMSxwb2ludExlbmd0aDotMSxzcG90TGVuZ3RoOi0xLHJlY3RBcmVhTGVuZ3RoOi0xLGhlbWlMZW5ndGg6LTEsbnVtRGlyZWN0aW9uYWxTaGFkb3dzOi0xLG51bVBvaW50U2hhZG93czotMSxudW1TcG90U2hhZG93czotMX0sYW1iaWVudDpbMCwwLDBdLHByb2JlOltdLGRpcmVjdGlvbmFsOltdLGRpcmVjdGlvbmFsU2hhZG93OltdLGRpcmVjdGlvbmFsU2hhZG93TWFwOltdLGRpcmVjdGlvbmFsU2hhZG93TWF0cml4OltdLHNwb3Q6W10sc3BvdFNoYWRvdzpbXSxzcG90U2hhZG93TWFwOltdLHNwb3RTaGFkb3dNYXRyaXg6W10scmVjdEFyZWE6W10scmVjdEFyZWFMVEMxOm51bGwscmVjdEFyZWFMVEMyOm51bGwscG9pbnQ6W10scG9pbnRTaGFkb3c6W10scG9pbnRTaGFkb3dNYXA6W10scG9pbnRTaGFkb3dNYXRyaXg6W10saGVtaTpbXX07Zm9yKGxldCB0PTA7dDw5O3QrKylvLnByb2JlLnB1c2gobmV3IENKdCk7Y29uc3QgYT1uZXcgQ0p0LHM9bmV3IHJRdCxsPW5ldyByUXQ7cmV0dXJue3NldHVwOmZ1bmN0aW9uIGMocil7bGV0IGE9MCxzPTAsbD0wO2ZvcihsZXQgdD0wO3Q8OTt0Kyspby5wcm9iZVt0XS5zZXQoMCwwLDApO2xldCBjPTAsdT0wLGg9MCxkPTAscD0wLGY9MCxtPTAsZz0wO3Iuc29ydChBNXQpO2ZvcihsZXQgdD0wLGU9ci5sZW5ndGg7dDxlO3QrKyl7Y29uc3QgZT1yW3RdLF89ZS5jb2xvcix5PWUuaW50ZW5zaXR5LHY9ZS5kaXN0YW5jZSxiPWUuc2hhZG93JiZlLnNoYWRvdy5tYXA/ZS5zaGFkb3cubWFwLnRleHR1cmU6bnVsbDtpZihlLmlzQW1iaWVudExpZ2h0KWErPV8ucip5LHMrPV8uZyp5LGwrPV8uYip5O2Vsc2UgaWYoZS5pc0xpZ2h0UHJvYmUpZm9yKGxldCB0PTA7dDw5O3QrKylvLnByb2JlW3RdLmFkZFNjYWxlZFZlY3RvcihlLnNoLmNvZWZmaWNpZW50c1t0XSx5KTtlbHNlIGlmKGUuaXNEaXJlY3Rpb25hbExpZ2h0KXtjb25zdCB0PW4uZ2V0KGUpO2lmKHQuY29sb3IuY29weShlLmNvbG9yKS5tdWx0aXBseVNjYWxhcihlLmludGVuc2l0eSksZS5jYXN0U2hhZG93KXtjb25zdCB0PWUuc2hhZG93LG49aS5nZXQoZSk7bi5zaGFkb3dCaWFzPXQuYmlhcyxuLnNoYWRvd05vcm1hbEJpYXM9dC5ub3JtYWxCaWFzLG4uc2hhZG93UmFkaXVzPXQucmFkaXVzLG4uc2hhZG93TWFwU2l6ZT10Lm1hcFNpemUsby5kaXJlY3Rpb25hbFNoYWRvd1tjXT1uLG8uZGlyZWN0aW9uYWxTaGFkb3dNYXBbY109YixvLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4W2NdPWUuc2hhZG93Lm1hdHJpeCxmKyt9by5kaXJlY3Rpb25hbFtjXT10LGMrK31lbHNlIGlmKGUuaXNTcG90TGlnaHQpe2NvbnN0IHQ9bi5nZXQoZSk7aWYodC5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oZS5tYXRyaXhXb3JsZCksdC5jb2xvci5jb3B5KF8pLm11bHRpcGx5U2NhbGFyKHkpLHQuZGlzdGFuY2U9dix0LmNvbmVDb3M9TWF0aC5jb3MoZS5hbmdsZSksdC5wZW51bWJyYUNvcz1NYXRoLmNvcyhlLmFuZ2xlKigxLWUucGVudW1icmEpKSx0LmRlY2F5PWUuZGVjYXksZS5jYXN0U2hhZG93KXtjb25zdCB0PWUuc2hhZG93LG49aS5nZXQoZSk7bi5zaGFkb3dCaWFzPXQuYmlhcyxuLnNoYWRvd05vcm1hbEJpYXM9dC5ub3JtYWxCaWFzLG4uc2hhZG93UmFkaXVzPXQucmFkaXVzLG4uc2hhZG93TWFwU2l6ZT10Lm1hcFNpemUsby5zcG90U2hhZG93W2hdPW4sby5zcG90U2hhZG93TWFwW2hdPWIsby5zcG90U2hhZG93TWF0cml4W2hdPWUuc2hhZG93Lm1hdHJpeCxnKyt9by5zcG90W2hdPXQsaCsrfWVsc2UgaWYoZS5pc1JlY3RBcmVhTGlnaHQpe2NvbnN0IHQ9bi5nZXQoZSk7dC5jb2xvci5jb3B5KF8pLm11bHRpcGx5U2NhbGFyKHkpLHQuaGFsZldpZHRoLnNldCguNSplLndpZHRoLDAsMCksdC5oYWxmSGVpZ2h0LnNldCgwLC41KmUuaGVpZ2h0LDApLG8ucmVjdEFyZWFbZF09dCxkKyt9ZWxzZSBpZihlLmlzUG9pbnRMaWdodCl7Y29uc3QgdD1uLmdldChlKTtpZih0LmNvbG9yLmNvcHkoZS5jb2xvcikubXVsdGlwbHlTY2FsYXIoZS5pbnRlbnNpdHkpLHQuZGlzdGFuY2U9ZS5kaXN0YW5jZSx0LmRlY2F5PWUuZGVjYXksZS5jYXN0U2hhZG93KXtjb25zdCB0PWUuc2hhZG93LG49aS5nZXQoZSk7bi5zaGFkb3dCaWFzPXQuYmlhcyxuLnNoYWRvd05vcm1hbEJpYXM9dC5ub3JtYWxCaWFzLG4uc2hhZG93UmFkaXVzPXQucmFkaXVzLG4uc2hhZG93TWFwU2l6ZT10Lm1hcFNpemUsbi5zaGFkb3dDYW1lcmFOZWFyPXQuY2FtZXJhLm5lYXIsbi5zaGFkb3dDYW1lcmFGYXI9dC5jYW1lcmEuZmFyLG8ucG9pbnRTaGFkb3dbdV09bixvLnBvaW50U2hhZG93TWFwW3VdPWIsby5wb2ludFNoYWRvd01hdHJpeFt1XT1lLnNoYWRvdy5tYXRyaXgsbSsrfW8ucG9pbnRbdV09dCx1Kyt9ZWxzZSBpZihlLmlzSGVtaXNwaGVyZUxpZ2h0KXtjb25zdCB0PW4uZ2V0KGUpO3Quc2t5Q29sb3IuY29weShlLmNvbG9yKS5tdWx0aXBseVNjYWxhcih5KSx0Lmdyb3VuZENvbG9yLmNvcHkoZS5ncm91bmRDb2xvcikubXVsdGlwbHlTY2FsYXIoeSksby5oZW1pW3BdPXQscCsrfX1kPjAmJihlLmlzV2ViR0wyfHwhMD09PXQuaGFzKCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKT8oby5yZWN0QXJlYUxUQzE9bDB0LkxUQ19GTE9BVF8xLG8ucmVjdEFyZWFMVEMyPWwwdC5MVENfRkxPQVRfMik6ITA9PT10LmhhcygiT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXIiKT8oby5yZWN0QXJlYUxUQzE9bDB0LkxUQ19IQUxGXzEsby5yZWN0QXJlYUxUQzI9bDB0LkxUQ19IQUxGXzIpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVuYWJsZSB0byB1c2UgUmVjdEFyZWFMaWdodC4gTWlzc2luZyBXZWJHTCBleHRlbnNpb25zLiIpKSxvLmFtYmllbnRbMF09YSxvLmFtYmllbnRbMV09cyxvLmFtYmllbnRbMl09bDtjb25zdCBfPW8uaGFzaDtfLmRpcmVjdGlvbmFsTGVuZ3RoPT09YyYmXy5wb2ludExlbmd0aD09PXUmJl8uc3BvdExlbmd0aD09PWgmJl8ucmVjdEFyZWFMZW5ndGg9PT1kJiZfLmhlbWlMZW5ndGg9PT1wJiZfLm51bURpcmVjdGlvbmFsU2hhZG93cz09PWYmJl8ubnVtUG9pbnRTaGFkb3dzPT09bSYmXy5udW1TcG90U2hhZG93cz09PWd8fChvLmRpcmVjdGlvbmFsLmxlbmd0aD1jLG8uc3BvdC5sZW5ndGg9aCxvLnJlY3RBcmVhLmxlbmd0aD1kLG8ucG9pbnQubGVuZ3RoPXUsby5oZW1pLmxlbmd0aD1wLG8uZGlyZWN0aW9uYWxTaGFkb3cubGVuZ3RoPWYsby5kaXJlY3Rpb25hbFNoYWRvd01hcC5sZW5ndGg9ZixvLnBvaW50U2hhZG93Lmxlbmd0aD1tLG8ucG9pbnRTaGFkb3dNYXAubGVuZ3RoPW0sby5zcG90U2hhZG93Lmxlbmd0aD1nLG8uc3BvdFNoYWRvd01hcC5sZW5ndGg9ZyxvLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4Lmxlbmd0aD1mLG8ucG9pbnRTaGFkb3dNYXRyaXgubGVuZ3RoPW0sby5zcG90U2hhZG93TWF0cml4Lmxlbmd0aD1nLF8uZGlyZWN0aW9uYWxMZW5ndGg9YyxfLnBvaW50TGVuZ3RoPXUsXy5zcG90TGVuZ3RoPWgsXy5yZWN0QXJlYUxlbmd0aD1kLF8uaGVtaUxlbmd0aD1wLF8ubnVtRGlyZWN0aW9uYWxTaGFkb3dzPWYsXy5udW1Qb2ludFNoYWRvd3M9bSxfLm51bVNwb3RTaGFkb3dzPWcsby52ZXJzaW9uPUM1dCsrKX0sc2V0dXBWaWV3OmZ1bmN0aW9uIHUodCxlKXtsZXQgbj0wLGk9MCxyPTAsYz0wLHU9MDtjb25zdCBoPWUubWF0cml4V29ybGRJbnZlcnNlO2ZvcihsZXQgZT0wLGQ9dC5sZW5ndGg7ZTxkO2UrKyl7Y29uc3QgZD10W2VdO2lmKGQuaXNEaXJlY3Rpb25hbExpZ2h0KXtjb25zdCB0PW8uZGlyZWN0aW9uYWxbbl07dC5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGQubWF0cml4V29ybGQpLGEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGQudGFyZ2V0Lm1hdHJpeFdvcmxkKSx0LmRpcmVjdGlvbi5zdWIoYSksdC5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKGgpLG4rK31lbHNlIGlmKGQuaXNTcG90TGlnaHQpe2NvbnN0IHQ9by5zcG90W3JdO3QucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGQubWF0cml4V29ybGQpLHQucG9zaXRpb24uYXBwbHlNYXRyaXg0KGgpLHQuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihkLm1hdHJpeFdvcmxkKSxhLnNldEZyb21NYXRyaXhQb3NpdGlvbihkLnRhcmdldC5tYXRyaXhXb3JsZCksdC5kaXJlY3Rpb24uc3ViKGEpLHQuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihoKSxyKyt9ZWxzZSBpZihkLmlzUmVjdEFyZWFMaWdodCl7Y29uc3QgdD1vLnJlY3RBcmVhW2NdO3QucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGQubWF0cml4V29ybGQpLHQucG9zaXRpb24uYXBwbHlNYXRyaXg0KGgpLGwuaWRlbnRpdHkoKSxzLmNvcHkoZC5tYXRyaXhXb3JsZCkscy5wcmVtdWx0aXBseShoKSxsLmV4dHJhY3RSb3RhdGlvbihzKSx0LmhhbGZXaWR0aC5zZXQoLjUqZC53aWR0aCwwLDApLHQuaGFsZkhlaWdodC5zZXQoMCwuNSpkLmhlaWdodCwwKSx0LmhhbGZXaWR0aC5hcHBseU1hdHJpeDQobCksdC5oYWxmSGVpZ2h0LmFwcGx5TWF0cml4NChsKSxjKyt9ZWxzZSBpZihkLmlzUG9pbnRMaWdodCl7Y29uc3QgdD1vLnBvaW50W2ldO3QucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGQubWF0cml4V29ybGQpLHQucG9zaXRpb24uYXBwbHlNYXRyaXg0KGgpLGkrK31lbHNlIGlmKGQuaXNIZW1pc3BoZXJlTGlnaHQpe2NvbnN0IHQ9by5oZW1pW3VdO3QuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihkLm1hdHJpeFdvcmxkKSx0LmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oaCksdC5kaXJlY3Rpb24ubm9ybWFsaXplKCksdSsrfX19LHN0YXRlOm99fWZ1bmN0aW9uIEw1dCh0LGUpe2NvbnN0IG49bmV3IGs1dCh0LGUpLGk9W10scj1bXTtyZXR1cm57aW5pdDpmdW5jdGlvbiBvKCl7aS5sZW5ndGg9MCxyLmxlbmd0aD0wfSxzdGF0ZTp7bGlnaHRzQXJyYXk6aSxzaGFkb3dzQXJyYXk6cixsaWdodHM6bn0sc2V0dXBMaWdodHM6ZnVuY3Rpb24gYSgpe24uc2V0dXAoaSl9LHNldHVwTGlnaHRzVmlldzpmdW5jdGlvbiBzKHQpe24uc2V0dXBWaWV3KGksdCl9LHB1c2hMaWdodDpmdW5jdGlvbiBsKHQpe2kucHVzaCh0KX0scHVzaFNoYWRvdzpmdW5jdGlvbiBjKHQpe3IucHVzaCh0KX19fWZ1bmN0aW9uIFA1dCh0LGUpe2xldCBuPW5ldyBXZWFrTWFwO3JldHVybntnZXQ6ZnVuY3Rpb24gaShyLG89MCl7bGV0IGE7cmV0dXJuITE9PT1uLmhhcyhyKT8oYT1uZXcgTDV0KHQsZSksbi5zZXQocixbYV0pKTpvPj1uLmdldChyKS5sZW5ndGg/KGE9bmV3IEw1dCh0LGUpLG4uZ2V0KHIpLnB1c2goYSkpOmE9bi5nZXQocilbb10sYX0sZGlzcG9zZTpmdW5jdGlvbiByKCl7bj1uZXcgV2Vha01hcH19fWNsYXNzIE41dCBleHRlbmRzIFVRdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iTWVzaERlcHRoTWF0ZXJpYWwiLHRoaXMuZGVwdGhQYWNraW5nPTMyMDAsdGhpcy5tYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLmZvZz0hMSx0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuZGVwdGhQYWNraW5nPXQuZGVwdGhQYWNraW5nLHRoaXMubWFwPXQubWFwLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLmRpc3BsYWNlbWVudE1hcD10LmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPXQuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPXQuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzfX1ONXQucHJvdG90eXBlLmlzTWVzaERlcHRoTWF0ZXJpYWw9ITA7Y2xhc3MgSTV0IGV4dGVuZHMgVVF0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy50eXBlPSJNZXNoRGlzdGFuY2VNYXRlcmlhbCIsdGhpcy5yZWZlcmVuY2VQb3NpdGlvbj1uZXcgQ0p0LHRoaXMubmVhckRpc3RhbmNlPTEsdGhpcy5mYXJEaXN0YW5jZT0xZTMsdGhpcy5tYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy5mb2c9ITEsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnJlZmVyZW5jZVBvc2l0aW9uLmNvcHkodC5yZWZlcmVuY2VQb3NpdGlvbiksdGhpcy5uZWFyRGlzdGFuY2U9dC5uZWFyRGlzdGFuY2UsdGhpcy5mYXJEaXN0YW5jZT10LmZhckRpc3RhbmNlLHRoaXMubWFwPXQubWFwLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLmRpc3BsYWNlbWVudE1hcD10LmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPXQuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPXQuZGlzcGxhY2VtZW50Qmlhcyx0aGlzfX1mdW5jdGlvbiBSNXQodCxlLG4pe2xldCBpPW5ldyBpMHQ7Y29uc3Qgcj1uZXcgbUp0LG89bmV3IG1KdCxhPW5ldyB3SnQscz1uZXcgTjV0KHtkZXB0aFBhY2tpbmc6MzIwMX0pLGw9bmV3IEk1dCxjPXt9LHU9bi5tYXhUZXh0dXJlU2l6ZSxoPXswOjEsMTowLDI6Mn0sZD1uZXcgRzF0KHtkZWZpbmVzOntTQU1QTEVfUkFURToyLzgsSEFMRl9TQU1QTEVfUkFURToxLzh9LHVuaWZvcm1zOntzaGFkb3dfcGFzczp7dmFsdWU6bnVsbH0scmVzb2x1dGlvbjp7dmFsdWU6bmV3IG1KdH0scmFkaXVzOnt2YWx1ZTo0fX0sdmVydGV4U2hhZGVyOiJ2b2lkIG1haW4oKSB7XG5cdGdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24sIDEuMCApO1xufSIsZnJhZ21lbnRTaGFkZXI6InVuaWZvcm0gc2FtcGxlcjJEIHNoYWRvd19wYXNzO1xudW5pZm9ybSB2ZWMyIHJlc29sdXRpb247XG51bmlmb3JtIGZsb2F0IHJhZGl1cztcbiNpbmNsdWRlIDxwYWNraW5nPlxudm9pZCBtYWluKCkge1xuXHRmbG9hdCBtZWFuID0gMC4wO1xuXHRmbG9hdCBzcXVhcmVkX21lYW4gPSAwLjA7XG5cdGZsb2F0IGRlcHRoID0gdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggc2hhZG93X3Bhc3MsICggZ2xfRnJhZ0Nvb3JkLnh5ICkgLyByZXNvbHV0aW9uICkgKTtcblx0Zm9yICggZmxvYXQgaSA9IC0xLjA7IGkgPCAxLjAgOyBpICs9IFNBTVBMRV9SQVRFKSB7XG5cdFx0I2lmZGVmIEhPUklaT05UQUxfUEFTU1xuXHRcdFx0dmVjMiBkaXN0cmlidXRpb24gPSB1bnBhY2tSR0JBVG8ySGFsZiggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCBpLCAwLjAgKSAqIHJhZGl1cyApIC8gcmVzb2x1dGlvbiApICk7XG5cdFx0XHRtZWFuICs9IGRpc3RyaWJ1dGlvbi54O1xuXHRcdFx0c3F1YXJlZF9tZWFuICs9IGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKyBkaXN0cmlidXRpb24ueCAqIGRpc3RyaWJ1dGlvbi54O1xuXHRcdCNlbHNlXG5cdFx0XHRmbG9hdCBkZXB0aCA9IHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIHNoYWRvd19wYXNzLCAoIGdsX0ZyYWdDb29yZC54eSArIHZlYzIoIDAuMCwgaSApICogcmFkaXVzICkgLyByZXNvbHV0aW9uICkgKTtcblx0XHRcdG1lYW4gKz0gZGVwdGg7XG5cdFx0XHRzcXVhcmVkX21lYW4gKz0gZGVwdGggKiBkZXB0aDtcblx0XHQjZW5kaWZcblx0fVxuXHRtZWFuID0gbWVhbiAqIEhBTEZfU0FNUExFX1JBVEU7XG5cdHNxdWFyZWRfbWVhbiA9IHNxdWFyZWRfbWVhbiAqIEhBTEZfU0FNUExFX1JBVEU7XG5cdGZsb2F0IHN0ZF9kZXYgPSBzcXJ0KCBzcXVhcmVkX21lYW4gLSBtZWFuICogbWVhbiApO1xuXHRnbF9GcmFnQ29sb3IgPSBwYWNrMkhhbGZUb1JHQkEoIHZlYzIoIG1lYW4sIHN0ZF9kZXYgKSApO1xufSJ9KSxwPWQuY2xvbmUoKTtwLmRlZmluZXMuSE9SSVpPTlRBTF9QQVNTPTE7Y29uc3QgZj1uZXcgYjF0O2Yuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFFRdChuZXcgRmxvYXQzMkFycmF5KFstMSwtMSwuNSwzLC0xLC41LC0xLDMsLjVdKSwzKSk7Y29uc3QgbT1uZXcgQjF0KGYsZCksZz10aGlzO2Z1bmN0aW9uIF8obixpKXtjb25zdCByPWUudXBkYXRlKG0pO2QudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWU9bi5tYXAudGV4dHVyZSxkLnVuaWZvcm1zLnJlc29sdXRpb24udmFsdWU9bi5tYXBTaXplLGQudW5pZm9ybXMucmFkaXVzLnZhbHVlPW4ucmFkaXVzLHQuc2V0UmVuZGVyVGFyZ2V0KG4ubWFwUGFzcyksdC5jbGVhcigpLHQucmVuZGVyQnVmZmVyRGlyZWN0KGksbnVsbCxyLGQsbSxudWxsKSxwLnVuaWZvcm1zLnNoYWRvd19wYXNzLnZhbHVlPW4ubWFwUGFzcy50ZXh0dXJlLHAudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZT1uLm1hcFNpemUscC51bmlmb3Jtcy5yYWRpdXMudmFsdWU9bi5yYWRpdXMsdC5zZXRSZW5kZXJUYXJnZXQobi5tYXApLHQuY2xlYXIoKSx0LnJlbmRlckJ1ZmZlckRpcmVjdChpLG51bGwscixwLG0sbnVsbCl9ZnVuY3Rpb24geShlLG4saSxyLG8sYSx1KXtsZXQgZD1udWxsO2NvbnN0IHA9ITA9PT1yLmlzUG9pbnRMaWdodD9lLmN1c3RvbURpc3RhbmNlTWF0ZXJpYWw6ZS5jdXN0b21EZXB0aE1hdGVyaWFsO2lmKGQ9dm9pZCAwIT09cD9wOiEwPT09ci5pc1BvaW50TGlnaHQ/bDpzLHQubG9jYWxDbGlwcGluZ0VuYWJsZWQmJiEwPT09aS5jbGlwU2hhZG93cyYmMCE9PWkuY2xpcHBpbmdQbGFuZXMubGVuZ3RoKXtjb25zdCB0PWQudXVpZCxlPWkudXVpZDtsZXQgbj1jW3RdO3ZvaWQgMD09PW4mJihuPXt9LGNbdF09bik7bGV0IHI9bltlXTt2b2lkIDA9PT1yJiYocj1kLmNsb25lKCksbltlXT1yKSxkPXJ9cmV0dXJuIGQudmlzaWJsZT1pLnZpc2libGUsZC53aXJlZnJhbWU9aS53aXJlZnJhbWUsZC5zaWRlPTM9PT11P251bGwhPT1pLnNoYWRvd1NpZGU/aS5zaGFkb3dTaWRlOmkuc2lkZTpudWxsIT09aS5zaGFkb3dTaWRlP2kuc2hhZG93U2lkZTpoW2kuc2lkZV0sZC5jbGlwU2hhZG93cz1pLmNsaXBTaGFkb3dzLGQuY2xpcHBpbmdQbGFuZXM9aS5jbGlwcGluZ1BsYW5lcyxkLmNsaXBJbnRlcnNlY3Rpb249aS5jbGlwSW50ZXJzZWN0aW9uLGQud2lyZWZyYW1lTGluZXdpZHRoPWkud2lyZWZyYW1lTGluZXdpZHRoLGQubGluZXdpZHRoPWkubGluZXdpZHRoLCEwPT09ci5pc1BvaW50TGlnaHQmJiEwPT09ZC5pc01lc2hEaXN0YW5jZU1hdGVyaWFsJiYoZC5yZWZlcmVuY2VQb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oci5tYXRyaXhXb3JsZCksZC5uZWFyRGlzdGFuY2U9byxkLmZhckRpc3RhbmNlPWEpLGR9ZnVuY3Rpb24gdihuLHIsbyxhLHMpe2lmKCExPT09bi52aXNpYmxlKXJldHVybjtpZihuLmxheWVycy50ZXN0KHIubGF5ZXJzKSYmKG4uaXNNZXNofHxuLmlzTGluZXx8bi5pc1BvaW50cykmJihuLmNhc3RTaGFkb3d8fG4ucmVjZWl2ZVNoYWRvdyYmMz09PXMpJiYoIW4uZnJ1c3R1bUN1bGxlZHx8aS5pbnRlcnNlY3RzT2JqZWN0KG4pKSl7bi5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyhvLm1hdHJpeFdvcmxkSW52ZXJzZSxuLm1hdHJpeFdvcmxkKTtjb25zdCBpPWUudXBkYXRlKG4pLHI9bi5tYXRlcmlhbDtpZihBcnJheS5pc0FycmF5KHIpKXtjb25zdCBlPWkuZ3JvdXBzO2ZvcihsZXQgbD0wLGM9ZS5sZW5ndGg7bDxjO2wrKyl7Y29uc3QgYz1lW2xdLHU9cltjLm1hdGVyaWFsSW5kZXhdO2lmKHUmJnUudmlzaWJsZSl7Y29uc3QgZT15KG4sMCx1LGEsby5uZWFyLG8uZmFyLHMpO3QucmVuZGVyQnVmZmVyRGlyZWN0KG8sbnVsbCxpLGUsbixjKX19fWVsc2UgaWYoci52aXNpYmxlKXtjb25zdCBlPXkobiwwLHIsYSxvLm5lYXIsby5mYXIscyk7dC5yZW5kZXJCdWZmZXJEaXJlY3QobyxudWxsLGksZSxuLG51bGwpfX1jb25zdCBsPW4uY2hpbGRyZW47Zm9yKGxldCB0PTAsZT1sLmxlbmd0aDt0PGU7dCsrKXYobFt0XSxyLG8sYSxzKX10aGlzLmVuYWJsZWQ9ITEsdGhpcy5hdXRvVXBkYXRlPSEwLHRoaXMubmVlZHNVcGRhdGU9ITEsdGhpcy50eXBlPTEsdGhpcy5yZW5kZXI9ZnVuY3Rpb24oZSxuLHMpe2lmKCExPT09Zy5lbmFibGVkKXJldHVybjtpZighMT09PWcuYXV0b1VwZGF0ZSYmITE9PT1nLm5lZWRzVXBkYXRlKXJldHVybjtpZigwPT09ZS5sZW5ndGgpcmV0dXJuO2NvbnN0IGw9dC5nZXRSZW5kZXJUYXJnZXQoKSxjPXQuZ2V0QWN0aXZlQ3ViZUZhY2UoKSxoPXQuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKSxkPXQuc3RhdGU7ZC5zZXRCbGVuZGluZygwKSxkLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoMSwxLDEsMSksZC5idWZmZXJzLmRlcHRoLnNldFRlc3QoITApLGQuc2V0U2Npc3NvclRlc3QoITEpO2ZvcihsZXQgbD0wLGM9ZS5sZW5ndGg7bDxjO2wrKyl7Y29uc3QgYz1lW2xdLGg9Yy5zaGFkb3c7aWYodm9pZCAwPT09aCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFNoYWRvd01hcDoiLGMsImhhcyBubyBzaGFkb3cuIik7Y29udGludWV9aWYoITE9PT1oLmF1dG9VcGRhdGUmJiExPT09aC5uZWVkc1VwZGF0ZSljb250aW51ZTtyLmNvcHkoaC5tYXBTaXplKTtjb25zdCBwPWguZ2V0RnJhbWVFeHRlbnRzKCk7aWYoci5tdWx0aXBseShwKSxvLmNvcHkoaC5tYXBTaXplKSwoci54PnV8fHIueT51KSYmKHIueD51JiYoby54PU1hdGguZmxvb3IodS9wLngpLHIueD1vLngqcC54LGgubWFwU2l6ZS54PW8ueCksci55PnUmJihvLnk9TWF0aC5mbG9vcih1L3AueSksci55PW8ueSpwLnksaC5tYXBTaXplLnk9by55KSksbnVsbD09PWgubWFwJiYhaC5pc1BvaW50TGlnaHRTaGFkb3cmJjM9PT10aGlzLnR5cGUpe2NvbnN0IHQ9e21pbkZpbHRlcjplWnQsbWFnRmlsdGVyOmVadCxmb3JtYXQ6aFp0fTtoLm1hcD1uZXcgU0p0KHIueCxyLnksdCksaC5tYXAudGV4dHVyZS5uYW1lPWMubmFtZSsiLnNoYWRvd01hcCIsaC5tYXBQYXNzPW5ldyBTSnQoci54LHIueSx0KSxoLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9bnVsbD09PWgubWFwJiYoaC5tYXA9bmV3IFNKdChyLngsci55LHttaW5GaWx0ZXI6Skt0LG1hZ0ZpbHRlcjpKS3QsZm9ybWF0OmhadH0pLGgubWFwLnRleHR1cmUubmFtZT1jLm5hbWUrIi5zaGFkb3dNYXAiLGguY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSksdC5zZXRSZW5kZXJUYXJnZXQoaC5tYXApLHQuY2xlYXIoKTtjb25zdCBmPWguZ2V0Vmlld3BvcnRDb3VudCgpO2ZvcihsZXQgdD0wO3Q8Zjt0Kyspe2NvbnN0IGU9aC5nZXRWaWV3cG9ydCh0KTthLnNldChvLngqZS54LG8ueSplLnksby54KmUueixvLnkqZS53KSxkLnZpZXdwb3J0KGEpLGgudXBkYXRlTWF0cmljZXMoYyx0KSxpPWguZ2V0RnJ1c3R1bSgpLHYobixzLGguY2FtZXJhLGMsdGhpcy50eXBlKX1oLmlzUG9pbnRMaWdodFNoYWRvd3x8MyE9PXRoaXMudHlwZXx8XyhoLHMpLGgubmVlZHNVcGRhdGU9ITF9Zy5uZWVkc1VwZGF0ZT0hMSx0LnNldFJlbmRlclRhcmdldChsLGMsaCl9fWZ1bmN0aW9uIE81dCh0LGUsbil7Y29uc3QgaT1uLmlzV2ViR0wyLHI9bmV3KGZ1bmN0aW9uIG8oKXtsZXQgZT0hMTtjb25zdCBuPW5ldyB3SnQ7bGV0IGk9bnVsbDtjb25zdCByPW5ldyB3SnQoMCwwLDAsMCk7cmV0dXJue3NldE1hc2s6ZnVuY3Rpb24obil7aT09PW58fGV8fCh0LmNvbG9yTWFzayhuLG4sbixuKSxpPW4pfSxzZXRMb2NrZWQ6ZnVuY3Rpb24odCl7ZT10fSxzZXRDbGVhcjpmdW5jdGlvbihlLGksbyxhLHMpeyEwPT09cyYmKGUqPWEsaSo9YSxvKj1hKSxuLnNldChlLGksbyxhKSwhMT09PXIuZXF1YWxzKG4pJiYodC5jbGVhckNvbG9yKGUsaSxvLGEpLHIuY29weShuKSl9LHJlc2V0OmZ1bmN0aW9uKCl7ZT0hMSxpPW51bGwsci5zZXQoLTEsMCwwLDApfX19KSxhPW5ldyhmdW5jdGlvbiBzKCl7bGV0IGU9ITEsbj1udWxsLGk9bnVsbCxyPW51bGw7cmV0dXJue3NldFRlc3Q6ZnVuY3Rpb24odCl7dD9GKDI5MjkpOlYoMjkyOSl9LHNldE1hc2s6ZnVuY3Rpb24oaSl7bj09PWl8fGV8fCh0LmRlcHRoTWFzayhpKSxuPWkpfSxzZXRGdW5jOmZ1bmN0aW9uKGUpe2lmKGkhPT1lKXtpZihlKXN3aXRjaChlKXtjYXNlIDA6dC5kZXB0aEZ1bmMoNTEyKTticmVhaztjYXNlIDE6dC5kZXB0aEZ1bmMoNTE5KTticmVhaztjYXNlIDI6dC5kZXB0aEZ1bmMoNTEzKTticmVhaztjYXNlIDM6dC5kZXB0aEZ1bmMoNTE1KTticmVhaztjYXNlIDQ6dC5kZXB0aEZ1bmMoNTE0KTticmVhaztjYXNlIDU6dC5kZXB0aEZ1bmMoNTE4KTticmVhaztjYXNlIDY6dC5kZXB0aEZ1bmMoNTE2KTticmVhaztjYXNlIDc6dC5kZXB0aEZ1bmMoNTE3KTticmVhaztkZWZhdWx0OnQuZGVwdGhGdW5jKDUxNSl9ZWxzZSB0LmRlcHRoRnVuYyg1MTUpO2k9ZX19LHNldExvY2tlZDpmdW5jdGlvbih0KXtlPXR9LHNldENsZWFyOmZ1bmN0aW9uKGUpe3IhPT1lJiYodC5jbGVhckRlcHRoKGUpLHI9ZSl9LHJlc2V0OmZ1bmN0aW9uKCl7ZT0hMSxuPW51bGwsaT1udWxsLHI9bnVsbH19fSksbD1uZXcoZnVuY3Rpb24gYygpe2xldCBlPSExLG49bnVsbCxpPW51bGwscj1udWxsLG89bnVsbCxhPW51bGwscz1udWxsLGw9bnVsbCxjPW51bGw7cmV0dXJue3NldFRlc3Q6ZnVuY3Rpb24odCl7ZXx8KHQ/RigyOTYwKTpWKDI5NjApKX0sc2V0TWFzazpmdW5jdGlvbihpKXtuPT09aXx8ZXx8KHQuc3RlbmNpbE1hc2soaSksbj1pKX0sc2V0RnVuYzpmdW5jdGlvbihlLG4sYSl7aT09PWUmJnI9PT1uJiZvPT09YXx8KHQuc3RlbmNpbEZ1bmMoZSxuLGEpLGk9ZSxyPW4sbz1hKX0sc2V0T3A6ZnVuY3Rpb24oZSxuLGkpe2E9PT1lJiZzPT09biYmbD09PWl8fCh0LnN0ZW5jaWxPcChlLG4saSksYT1lLHM9bixsPWkpfSxzZXRMb2NrZWQ6ZnVuY3Rpb24odCl7ZT10fSxzZXRDbGVhcjpmdW5jdGlvbihlKXtjIT09ZSYmKHQuY2xlYXJTdGVuY2lsKGUpLGM9ZSl9LHJlc2V0OmZ1bmN0aW9uKCl7ZT0hMSxuPW51bGwsaT1udWxsLHI9bnVsbCxvPW51bGwsYT1udWxsLHM9bnVsbCxsPW51bGwsYz1udWxsfX19KTtsZXQgdT17fSxoPW51bGwsZD17fSxwPW51bGwsZj0hMSxtPW51bGwsZz1udWxsLF89bnVsbCx5PW51bGwsdj1udWxsLGI9bnVsbCx4PW51bGwsdz0hMSxTPW51bGwsTT1udWxsLEU9bnVsbCxUPW51bGwsQz1udWxsO2NvbnN0IEE9dC5nZXRQYXJhbWV0ZXIoMzU2NjEpO2xldCBrPSExLEw9MDtjb25zdCBQPXQuZ2V0UGFyYW1ldGVyKDc5MzgpOy0xIT09UC5pbmRleE9mKCJXZWJHTCIpPyhMPXBhcnNlRmxvYXQoL15XZWJHTCAoXGQpLy5leGVjKFApWzFdKSxrPUw+PTEpOi0xIT09UC5pbmRleE9mKCJPcGVuR0wgRVMiKSYmKEw9cGFyc2VGbG9hdCgvXk9wZW5HTCBFUyAoXGQpLy5leGVjKFApWzFdKSxrPUw+PTIpO2xldCBOPW51bGwsST17fTtjb25zdCBSPXQuZ2V0UGFyYW1ldGVyKDMwODgpLE89dC5nZXRQYXJhbWV0ZXIoMjk3OCksej0obmV3IHdKdCkuZnJvbUFycmF5KFIpLEQ9KG5ldyB3SnQpLmZyb21BcnJheShPKTtmdW5jdGlvbiBCKGUsbixpKXtjb25zdCByPW5ldyBVaW50OEFycmF5KDQpLG89dC5jcmVhdGVUZXh0dXJlKCk7dC5iaW5kVGV4dHVyZShlLG8pLHQudGV4UGFyYW1ldGVyaShlLDEwMjQxLDk3MjgpLHQudGV4UGFyYW1ldGVyaShlLDEwMjQwLDk3MjgpO2ZvcihsZXQgZT0wO2U8aTtlKyspdC50ZXhJbWFnZTJEKG4rZSwwLDY0MDgsMSwxLDAsNjQwOCw1MTIxLHIpO3JldHVybiBvfWNvbnN0IEg9e307ZnVuY3Rpb24gRihlKXshMCE9PXVbZV0mJih0LmVuYWJsZShlKSx1W2VdPSEwKX1mdW5jdGlvbiBWKGUpeyExIT09dVtlXSYmKHQuZGlzYWJsZShlKSx1W2VdPSExKX1IWzM1NTNdPUIoMzU1MywzNTUzLDEpLEhbMzQwNjddPUIoMzQwNjcsMzQwNjksNiksci5zZXRDbGVhcigwLDAsMCwxKSxhLnNldENsZWFyKDEpLGwuc2V0Q2xlYXIoMCksRigyOTI5KSxhLnNldEZ1bmMoMyksVyghMSkscSgxKSxGKDI4ODQpLEcoMCk7Y29uc3QgVT17W1ZLdF06MzI3NzQsMTAxOjMyNzc4LDEwMjozMjc3OX07aWYoaSlVWzEwM109MzI3NzUsVVsxMDRdPTMyNzc2O2Vsc2V7Y29uc3QgdD1lLmdldCgiRVhUX2JsZW5kX21pbm1heCIpO251bGwhPT10JiYoVVsxMDNdPXQuTUlOX0VYVCxVWzEwNF09dC5NQVhfRVhUKX1jb25zdCBqPXsyMDA6MCwyMDE6MSwyMDI6NzY4LDIwNDo3NzAsMjEwOjc3NiwyMDg6Nzc0LDIwNjo3NzIsMjAzOjc2OSwyMDU6NzcxLDIwOTo3NzUsMjA3Ojc3M307ZnVuY3Rpb24gRyhlLG4saSxyLG8sYSxzLGwpe2lmKDAhPT1lKXtpZighMT09PWYmJihGKDMwNDIpLGY9ITApLDU9PT1lKW89b3x8bixhPWF8fGkscz1zfHxyLG49PT1nJiZvPT09dnx8KHQuYmxlbmRFcXVhdGlvblNlcGFyYXRlKFVbbl0sVVtvXSksZz1uLHY9byksaT09PV8mJnI9PT15JiZhPT09YiYmcz09PXh8fCh0LmJsZW5kRnVuY1NlcGFyYXRlKGpbaV0saltyXSxqW2FdLGpbc10pLF89aSx5PXIsYj1hLHg9cyksbT1lLHc9bnVsbDtlbHNlIGlmKGUhPT1tfHxsIT09dyl7aWYoZz09PVZLdCYmdj09PVZLdHx8KHQuYmxlbmRFcXVhdGlvbigzMjc3NCksZz1WS3Qsdj1WS3QpLGwpc3dpdGNoKGUpe2Nhc2UgMTp0LmJsZW5kRnVuY1NlcGFyYXRlKDEsNzcxLDEsNzcxKTticmVhaztjYXNlIDI6dC5ibGVuZEZ1bmMoMSwxKTticmVhaztjYXNlIDM6dC5ibGVuZEZ1bmNTZXBhcmF0ZSgwLDAsNzY5LDc3MSk7YnJlYWs7Y2FzZSA0OnQuYmxlbmRGdW5jU2VwYXJhdGUoMCw3NjgsMCw3NzApO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZTogSW52YWxpZCBibGVuZGluZzogIixlKX1lbHNlIHN3aXRjaChlKXtjYXNlIDE6dC5ibGVuZEZ1bmNTZXBhcmF0ZSg3NzAsNzcxLDEsNzcxKTticmVhaztjYXNlIDI6dC5ibGVuZEZ1bmMoNzcwLDEpO2JyZWFrO2Nhc2UgMzp0LmJsZW5kRnVuYygwLDc2OSk7YnJlYWs7Y2FzZSA0OnQuYmxlbmRGdW5jKDAsNzY4KTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICIsZSl9Xz1udWxsLHk9bnVsbCxiPW51bGwseD1udWxsLG09ZSx3PWx9fWVsc2UhMD09PWYmJihWKDMwNDIpLGY9ITEpfWZ1bmN0aW9uIFcoZSl7UyE9PWUmJih0LmZyb250RmFjZShlPzIzMDQ6MjMwNSksUz1lKX1mdW5jdGlvbiBxKGUpezAhPT1lPyhGKDI4ODQpLGUhPT1NJiZ0LmN1bGxGYWNlKDE9PT1lPzEwMjk6Mj09PWU/MTAyODoxMDMyKSk6VigyODg0KSxNPWV9ZnVuY3Rpb24gWShlLG4saSl7ZT8oRigzMjgyMyksVD09PW4mJkM9PT1pfHwodC5wb2x5Z29uT2Zmc2V0KG4saSksVD1uLEM9aSkpOlYoMzI4MjMpfWZ1bmN0aW9uIFgoZSl7dm9pZCAwPT09ZSYmKGU9MzM5ODQrQS0xKSxOIT09ZSYmKHQuYWN0aXZlVGV4dHVyZShlKSxOPWUpfXJldHVybntidWZmZXJzOntjb2xvcjpyLGRlcHRoOmEsc3RlbmNpbDpsfSxlbmFibGU6RixkaXNhYmxlOlYsYmluZEZyYW1lYnVmZmVyOmZ1bmN0aW9uICQoZSxuKXtyZXR1cm4gbnVsbD09PW4mJm51bGwhPT1oJiYobj1oKSxkW2VdIT09biYmKHQuYmluZEZyYW1lYnVmZmVyKGUsbiksZFtlXT1uLGkmJigzNjAwOT09PWUmJihkWzM2MTYwXT1uKSwzNjE2MD09PWUmJihkWzM2MDA5XT1uKSksITApfSxiaW5kWFJGcmFtZWJ1ZmZlcjpmdW5jdGlvbiBLKGUpe2UhPT1oJiYodC5iaW5kRnJhbWVidWZmZXIoMzYxNjAsZSksaD1lKX0sdXNlUHJvZ3JhbTpmdW5jdGlvbiBaKGUpe3JldHVybiBwIT09ZSYmKHQudXNlUHJvZ3JhbShlKSxwPWUsITApfSxzZXRCbGVuZGluZzpHLHNldE1hdGVyaWFsOmZ1bmN0aW9uIEoodCxlKXsyPT09dC5zaWRlP1YoMjg4NCk6RigyODg0KTtsZXQgbj0xPT09dC5zaWRlO2UmJihuPSFuKSxXKG4pLDE9PT10LmJsZW5kaW5nJiYhMT09PXQudHJhbnNwYXJlbnQ/RygwKTpHKHQuYmxlbmRpbmcsdC5ibGVuZEVxdWF0aW9uLHQuYmxlbmRTcmMsdC5ibGVuZERzdCx0LmJsZW5kRXF1YXRpb25BbHBoYSx0LmJsZW5kU3JjQWxwaGEsdC5ibGVuZERzdEFscGhhLHQucHJlbXVsdGlwbGllZEFscGhhKSxhLnNldEZ1bmModC5kZXB0aEZ1bmMpLGEuc2V0VGVzdCh0LmRlcHRoVGVzdCksYS5zZXRNYXNrKHQuZGVwdGhXcml0ZSksci5zZXRNYXNrKHQuY29sb3JXcml0ZSk7Y29uc3QgaT10LnN0ZW5jaWxXcml0ZTtsLnNldFRlc3QoaSksaSYmKGwuc2V0TWFzayh0LnN0ZW5jaWxXcml0ZU1hc2spLGwuc2V0RnVuYyh0LnN0ZW5jaWxGdW5jLHQuc3RlbmNpbFJlZix0LnN0ZW5jaWxGdW5jTWFzayksbC5zZXRPcCh0LnN0ZW5jaWxGYWlsLHQuc3RlbmNpbFpGYWlsLHQuc3RlbmNpbFpQYXNzKSksWSh0LnBvbHlnb25PZmZzZXQsdC5wb2x5Z29uT2Zmc2V0RmFjdG9yLHQucG9seWdvbk9mZnNldFVuaXRzKSwhMD09PXQuYWxwaGFUb0NvdmVyYWdlP0YoMzI5MjYpOlYoMzI5MjYpfSxzZXRGbGlwU2lkZWQ6VyxzZXRDdWxsRmFjZTpxLHNldExpbmVXaWR0aDpmdW5jdGlvbiBRKGUpe2UhPT1FJiYoayYmdC5saW5lV2lkdGgoZSksRT1lKX0sc2V0UG9seWdvbk9mZnNldDpZLHNldFNjaXNzb3JUZXN0OmZ1bmN0aW9uIHR0KHQpe3Q/RigzMDg5KTpWKDMwODkpfSxhY3RpdmVUZXh0dXJlOlgsYmluZFRleHR1cmU6ZnVuY3Rpb24gZXQoZSxuKXtudWxsPT09TiYmWCgpO2xldCBpPUlbTl07dm9pZCAwPT09aSYmKGk9e3R5cGU6dm9pZCAwLHRleHR1cmU6dm9pZCAwfSxJW05dPWkpLGkudHlwZT09PWUmJmkudGV4dHVyZT09PW58fCh0LmJpbmRUZXh0dXJlKGUsbnx8SFtlXSksaS50eXBlPWUsaS50ZXh0dXJlPW4pfSx1bmJpbmRUZXh0dXJlOmZ1bmN0aW9uIG50KCl7Y29uc3QgZT1JW05dO3ZvaWQgMCE9PWUmJnZvaWQgMCE9PWUudHlwZSYmKHQuYmluZFRleHR1cmUoZS50eXBlLG51bGwpLGUudHlwZT12b2lkIDAsZS50ZXh0dXJlPXZvaWQgMCl9LGNvbXByZXNzZWRUZXhJbWFnZTJEOmZ1bmN0aW9uIGl0KCl7dHJ5e3QuY29tcHJlc3NlZFRleEltYWdlMkQuYXBwbHkodCxhcmd1bWVudHMpfWNhdGNoKHQpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6Iix0KX19LHRleEltYWdlMkQ6ZnVuY3Rpb24gcnQoKXt0cnl7dC50ZXhJbWFnZTJELmFwcGx5KHQsYXJndW1lbnRzKX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIsdCl9fSx0ZXhJbWFnZTNEOmZ1bmN0aW9uIG90KCl7dHJ5e3QudGV4SW1hZ2UzRC5hcHBseSh0LGFyZ3VtZW50cyl9Y2F0Y2godCl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLHQpfX0sc2Npc3NvcjpmdW5jdGlvbiBhdChlKXshMT09PXouZXF1YWxzKGUpJiYodC5zY2lzc29yKGUueCxlLnksZS56LGUudyksei5jb3B5KGUpKX0sdmlld3BvcnQ6ZnVuY3Rpb24gc3QoZSl7ITE9PT1ELmVxdWFscyhlKSYmKHQudmlld3BvcnQoZS54LGUueSxlLnosZS53KSxELmNvcHkoZSkpfSxyZXNldDpmdW5jdGlvbiBsdCgpe3QuZGlzYWJsZSgzMDQyKSx0LmRpc2FibGUoMjg4NCksdC5kaXNhYmxlKDI5MjkpLHQuZGlzYWJsZSgzMjgyMyksdC5kaXNhYmxlKDMwODkpLHQuZGlzYWJsZSgyOTYwKSx0LmRpc2FibGUoMzI5MjYpLHQuYmxlbmRFcXVhdGlvbigzMjc3NCksdC5ibGVuZEZ1bmMoMSwwKSx0LmJsZW5kRnVuY1NlcGFyYXRlKDEsMCwxLDApLHQuY29sb3JNYXNrKCEwLCEwLCEwLCEwKSx0LmNsZWFyQ29sb3IoMCwwLDAsMCksdC5kZXB0aE1hc2soITApLHQuZGVwdGhGdW5jKDUxMyksdC5jbGVhckRlcHRoKDEpLHQuc3RlbmNpbE1hc2soNDI5NDk2NzI5NSksdC5zdGVuY2lsRnVuYyg1MTksMCw0Mjk0OTY3Mjk1KSx0LnN0ZW5jaWxPcCg3NjgwLDc2ODAsNzY4MCksdC5jbGVhclN0ZW5jaWwoMCksdC5jdWxsRmFjZSgxMDI5KSx0LmZyb250RmFjZSgyMzA1KSx0LnBvbHlnb25PZmZzZXQoMCwwKSx0LmFjdGl2ZVRleHR1cmUoMzM5ODQpLHQuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpLCEwPT09aSYmKHQuYmluZEZyYW1lYnVmZmVyKDM2MDA5LG51bGwpLHQuYmluZEZyYW1lYnVmZmVyKDM2MDA4LG51bGwpKSx0LnVzZVByb2dyYW0obnVsbCksdC5saW5lV2lkdGgoMSksdC5zY2lzc29yKDAsMCx0LmNhbnZhcy53aWR0aCx0LmNhbnZhcy5oZWlnaHQpLHQudmlld3BvcnQoMCwwLHQuY2FudmFzLndpZHRoLHQuY2FudmFzLmhlaWdodCksdT17fSxOPW51bGwsST17fSxoPW51bGwsZD17fSxwPW51bGwsZj0hMSxtPW51bGwsZz1udWxsLF89bnVsbCx5PW51bGwsdj1udWxsLGI9bnVsbCx4PW51bGwsdz0hMSxTPW51bGwsTT1udWxsLEU9bnVsbCxUPW51bGwsQz1udWxsLHouc2V0KDAsMCx0LmNhbnZhcy53aWR0aCx0LmNhbnZhcy5oZWlnaHQpLEQuc2V0KDAsMCx0LmNhbnZhcy53aWR0aCx0LmNhbnZhcy5oZWlnaHQpLHIucmVzZXQoKSxhLnJlc2V0KCksbC5yZXNldCgpfX19ZnVuY3Rpb24gejV0KHQsZSxuLGkscixvLGEpe2NvbnN0IHM9ci5pc1dlYkdMMixsPXIubWF4VGV4dHVyZXMsYz1yLm1heEN1YmVtYXBTaXplLHU9ci5tYXhUZXh0dXJlU2l6ZSxoPXIubWF4U2FtcGxlcyxkPW5ldyBXZWFrTWFwO2xldCBwLGY9ITE7dHJ5e2Y9InVuZGVmaW5lZCIhPXR5cGVvZiBPZmZzY3JlZW5DYW52YXMmJm51bGwhPT1uZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSkuZ2V0Q29udGV4dCgiMmQiKX1jYXRjaCh0KXt9ZnVuY3Rpb24gbSh0LGUpe3JldHVybiBmP25ldyBPZmZzY3JlZW5DYW52YXModCxlKTpkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJjYW52YXMiKX1mdW5jdGlvbiBnKHQsZSxuLGkpe2xldCByPTE7aWYoKHQud2lkdGg+aXx8dC5oZWlnaHQ+aSkmJihyPWkvTWF0aC5tYXgodC53aWR0aCx0LmhlaWdodCkpLHI8MXx8ITA9PT1lKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHwidW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50JiZ0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fCJ1bmRlZmluZWQiIT10eXBlb2YgSW1hZ2VCaXRtYXAmJnQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCl7Y29uc3QgaT1lP3RKdDpNYXRoLmZsb29yLG89aShyKnQud2lkdGgpLGE9aShyKnQuaGVpZ2h0KTt2b2lkIDA9PT1wJiYocD1tKG8sYSkpO2NvbnN0IHM9bj9tKG8sYSk6cDtyZXR1cm4gcy53aWR0aD1vLHMuaGVpZ2h0PWEscy5nZXRDb250ZXh0KCIyZCIpLmRyYXdJbWFnZSh0LDAsMCxvLGEpLGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBoYXMgYmVlbiByZXNpemVkIGZyb20gKCIrdC53aWR0aCsieCIrdC5oZWlnaHQrIikgdG8gKCIrbysieCIrYSsiKS4iKSxzfXJldHVybiJkYXRhImluIHQmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogSW1hZ2UgaW4gRGF0YVRleHR1cmUgaXMgdG9vIGJpZyAoIit0LndpZHRoKyJ4Iit0LmhlaWdodCsiKS4iKSx0fXJldHVybiB0fWZ1bmN0aW9uIF8odCl7cmV0dXJuIEpadCh0LndpZHRoKSYmSlp0KHQuaGVpZ2h0KX1mdW5jdGlvbiB5KHQsZSl7cmV0dXJuIHQuZ2VuZXJhdGVNaXBtYXBzJiZlJiZ0Lm1pbkZpbHRlciE9PUpLdCYmdC5taW5GaWx0ZXIhPT1lWnR9ZnVuY3Rpb24gdihlLG4scixvLGE9MSl7dC5nZW5lcmF0ZU1pcG1hcChlKSxpLmdldChuKS5fX21heE1pcExldmVsPU1hdGgubG9nMihNYXRoLm1heChyLG8sYSkpfWZ1bmN0aW9uIGIobixpLHIpe2lmKCExPT09cylyZXR1cm4gaTtpZihudWxsIT09bil7aWYodm9pZCAwIT09dFtuXSlyZXR1cm4gdFtuXTtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gdXNlIG5vbi1leGlzdGluZyBXZWJHTCBpbnRlcm5hbCBmb3JtYXQgJyIrbisiJyIpfWxldCBvPWk7cmV0dXJuIDY0MDM9PT1pJiYoNTEyNj09PXImJihvPTMzMzI2KSw1MTMxPT09ciYmKG89MzMzMjUpLDUxMjE9PT1yJiYobz0zMzMyMSkpLDY0MDc9PT1pJiYoNTEyNj09PXImJihvPTM0ODM3KSw1MTMxPT09ciYmKG89MzQ4NDMpLDUxMjE9PT1yJiYobz0zMjg0OSkpLDY0MDg9PT1pJiYoNTEyNj09PXImJihvPTM0ODM2KSw1MTMxPT09ciYmKG89MzQ4NDIpLDUxMjE9PT1yJiYobz0zMjg1NikpLDMzMzI1IT09byYmMzMzMjYhPT1vJiYzNDg0MiE9PW8mJjM0ODM2IT09b3x8ZS5nZXQoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKSxvfWZ1bmN0aW9uIHgodCl7cmV0dXJuIHQ9PT1KS3R8fHQ9PT1RS3R8fHQ9PT10WnQ/OTcyODo5NzI5fWZ1bmN0aW9uIHcoZSl7Y29uc3Qgbj1lLnRhcmdldDtuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHcpLChmdW5jdGlvbiByKGUpe2NvbnN0IG49aS5nZXQoZSk7dm9pZCAwIT09bi5fX3dlYmdsSW5pdCYmKHQuZGVsZXRlVGV4dHVyZShuLl9fd2ViZ2xUZXh0dXJlKSxpLnJlbW92ZShlKSl9KShuKSxuLmlzVmlkZW9UZXh0dXJlJiZkLmRlbGV0ZShuKSxhLm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIFMoZSl7Y29uc3Qgbj1lLnRhcmdldDtuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLFMpLChmdW5jdGlvbiByKGUpe2NvbnN0IG49ZS50ZXh0dXJlLHI9aS5nZXQoZSksbz1pLmdldChuKTtpZihlKXtpZih2b2lkIDAhPT1vLl9fd2ViZ2xUZXh0dXJlJiYodC5kZWxldGVUZXh0dXJlKG8uX193ZWJnbFRleHR1cmUpLGEubWVtb3J5LnRleHR1cmVzLS0pLGUuZGVwdGhUZXh0dXJlJiZlLmRlcHRoVGV4dHVyZS5kaXNwb3NlKCksZS5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldClmb3IobGV0IGU9MDtlPDY7ZSsrKXQuZGVsZXRlRnJhbWVidWZmZXIoci5fX3dlYmdsRnJhbWVidWZmZXJbZV0pLHIuX193ZWJnbERlcHRoYnVmZmVyJiZ0LmRlbGV0ZVJlbmRlcmJ1ZmZlcihyLl9fd2ViZ2xEZXB0aGJ1ZmZlcltlXSk7ZWxzZSB0LmRlbGV0ZUZyYW1lYnVmZmVyKHIuX193ZWJnbEZyYW1lYnVmZmVyKSxyLl9fd2ViZ2xEZXB0aGJ1ZmZlciYmdC5kZWxldGVSZW5kZXJidWZmZXIoci5fX3dlYmdsRGVwdGhidWZmZXIpLHIuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyJiZ0LmRlbGV0ZUZyYW1lYnVmZmVyKHIuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKSxyLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlciYmdC5kZWxldGVSZW5kZXJidWZmZXIoci5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIpLHIuX193ZWJnbERlcHRoUmVuZGVyYnVmZmVyJiZ0LmRlbGV0ZVJlbmRlcmJ1ZmZlcihyLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcik7aWYoZS5pc1dlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzKWZvcihsZXQgZT0wLHI9bi5sZW5ndGg7ZTxyO2UrKyl7Y29uc3Qgcj1pLmdldChuW2VdKTtyLl9fd2ViZ2xUZXh0dXJlJiYodC5kZWxldGVUZXh0dXJlKHIuX193ZWJnbFRleHR1cmUpLGEubWVtb3J5LnRleHR1cmVzLS0pLGkucmVtb3ZlKG5bZV0pfWkucmVtb3ZlKG4pLGkucmVtb3ZlKGUpfX0pKG4pfWxldCBNPTA7ZnVuY3Rpb24gRSh0LGUpe2NvbnN0IHI9aS5nZXQodCk7aWYodC5pc1ZpZGVvVGV4dHVyZSYmKGZ1bmN0aW9uIG8odCl7Y29uc3QgZT1hLnJlbmRlci5mcmFtZTtkLmdldCh0KSE9PWUmJihkLnNldCh0LGUpLHQudXBkYXRlKCkpfSkodCksdC52ZXJzaW9uPjAmJnIuX192ZXJzaW9uIT09dC52ZXJzaW9uKXtjb25zdCBuPXQuaW1hZ2U7aWYodm9pZCAwPT09biljb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIHVuZGVmaW5lZCIpO2Vsc2V7aWYoITEhPT1uLmNvbXBsZXRlKXJldHVybiB2b2lkIFAocix0LGUpO2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgaW5jb21wbGV0ZSIpfX1uLmFjdGl2ZVRleHR1cmUoMzM5ODQrZSksbi5iaW5kVGV4dHVyZSgzNTUzLHIuX193ZWJnbFRleHR1cmUpfWZ1bmN0aW9uIFQoZSxyKXtjb25zdCBhPWkuZ2V0KGUpO2UudmVyc2lvbj4wJiZhLl9fdmVyc2lvbiE9PWUudmVyc2lvbj8oZnVuY3Rpb24gbChlLGkscil7aWYoNiE9PWkuaW1hZ2UubGVuZ3RoKXJldHVybjtMKGUsaSksbi5hY3RpdmVUZXh0dXJlKDMzOTg0K3IpLG4uYmluZFRleHR1cmUoMzQwNjcsZS5fX3dlYmdsVGV4dHVyZSksdC5waXhlbFN0b3JlaSgzNzQ0MCxpLmZsaXBZKSx0LnBpeGVsU3RvcmVpKDM3NDQxLGkucHJlbXVsdGlwbHlBbHBoYSksdC5waXhlbFN0b3JlaSgzMzE3LGkudW5wYWNrQWxpZ25tZW50KSx0LnBpeGVsU3RvcmVpKDM3NDQzLDApO2NvbnN0IGE9aSYmKGkuaXNDb21wcmVzc2VkVGV4dHVyZXx8aS5pbWFnZVswXS5pc0NvbXByZXNzZWRUZXh0dXJlKSxsPWkuaW1hZ2VbMF0mJmkuaW1hZ2VbMF0uaXNEYXRhVGV4dHVyZSx1PVtdO2ZvcihsZXQgdD0wO3Q8Njt0KyspdVt0XT1hfHxsP2w/aS5pbWFnZVt0XS5pbWFnZTppLmltYWdlW3RdOmcoaS5pbWFnZVt0XSwhMSwhMCxjKTtjb25zdCBoPXVbMF0sZD1fKGgpfHxzLHA9by5jb252ZXJ0KGkuZm9ybWF0KSxmPW8uY29udmVydChpLnR5cGUpLG09YihpLmludGVybmFsRm9ybWF0LHAsZik7bGV0IHg7aWYoaygzNDA2NyxpLGQpLGEpe2ZvcihsZXQgdD0wO3Q8Njt0Kyspe3g9dVt0XS5taXBtYXBzO2ZvcihsZXQgZT0wO2U8eC5sZW5ndGg7ZSsrKXtjb25zdCByPXhbZV07aS5mb3JtYXQhPT1oWnQmJmkuZm9ybWF0IT09dVp0P251bGwhPT1wP24uY29tcHJlc3NlZFRleEltYWdlMkQoMzQwNjkrdCxlLG0sci53aWR0aCxyLmhlaWdodCwwLHIuZGF0YSk6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAuc2V0VGV4dHVyZUN1YmUoKSIpOm4udGV4SW1hZ2UyRCgzNDA2OSt0LGUsbSxyLndpZHRoLHIuaGVpZ2h0LDAscCxmLHIuZGF0YSl9fWUuX19tYXhNaXBMZXZlbD14Lmxlbmd0aC0xfWVsc2V7eD1pLm1pcG1hcHM7Zm9yKGxldCB0PTA7dDw2O3QrKylpZihsKXtuLnRleEltYWdlMkQoMzQwNjkrdCwwLG0sdVt0XS53aWR0aCx1W3RdLmhlaWdodCwwLHAsZix1W3RdLmRhdGEpO2ZvcihsZXQgZT0wO2U8eC5sZW5ndGg7ZSsrKXtjb25zdCBpPXhbZV0uaW1hZ2VbdF0uaW1hZ2U7bi50ZXhJbWFnZTJEKDM0MDY5K3QsZSsxLG0saS53aWR0aCxpLmhlaWdodCwwLHAsZixpLmRhdGEpfX1lbHNle24udGV4SW1hZ2UyRCgzNDA2OSt0LDAsbSxwLGYsdVt0XSk7Zm9yKGxldCBlPTA7ZTx4Lmxlbmd0aDtlKyspbi50ZXhJbWFnZTJEKDM0MDY5K3QsZSsxLG0scCxmLHhbZV0uaW1hZ2VbdF0pfWUuX19tYXhNaXBMZXZlbD14Lmxlbmd0aH15KGksZCkmJnYoMzQwNjcsaSxoLndpZHRoLGguaGVpZ2h0KSxlLl9fdmVyc2lvbj1pLnZlcnNpb24saS5vblVwZGF0ZSYmaS5vblVwZGF0ZShpKX0pKGEsZSxyKToobi5hY3RpdmVUZXh0dXJlKDMzOTg0K3IpLG4uYmluZFRleHR1cmUoMzQwNjcsYS5fX3dlYmdsVGV4dHVyZSkpfWNvbnN0IEM9e1skS3RdOjEwNDk3LFtLS3RdOjMzMDcxLFtaS3RdOjMzNjQ4fSxBPXtbSkt0XTo5NzI4LFtRS3RdOjk5ODQsW3RadF06OTk4NixbZVp0XTo5NzI5LFtuWnRdOjk5ODUsW2ladF06OTk4N307ZnVuY3Rpb24gayhuLG8sYSl7aWYoYT8odC50ZXhQYXJhbWV0ZXJpKG4sMTAyNDIsQ1tvLndyYXBTXSksdC50ZXhQYXJhbWV0ZXJpKG4sMTAyNDMsQ1tvLndyYXBUXSksMzI4NzkhPT1uJiYzNTg2NiE9PW58fHQudGV4UGFyYW1ldGVyaShuLDMyODgyLENbby53cmFwUl0pLHQudGV4UGFyYW1ldGVyaShuLDEwMjQwLEFbby5tYWdGaWx0ZXJdKSx0LnRleFBhcmFtZXRlcmkobiwxMDI0MSxBW28ubWluRmlsdGVyXSkpOih0LnRleFBhcmFtZXRlcmkobiwxMDI0MiwzMzA3MSksdC50ZXhQYXJhbWV0ZXJpKG4sMTAyNDMsMzMwNzEpLDMyODc5IT09biYmMzU4NjYhPT1ufHx0LnRleFBhcmFtZXRlcmkobiwzMjg4MiwzMzA3MSksby53cmFwUz09PUtLdCYmby53cmFwVD09PUtLdHx8Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLiIpLHQudGV4UGFyYW1ldGVyaShuLDEwMjQwLHgoby5tYWdGaWx0ZXIpKSx0LnRleFBhcmFtZXRlcmkobiwxMDI0MSx4KG8ubWluRmlsdGVyKSksby5taW5GaWx0ZXIhPT1KS3QmJm8ubWluRmlsdGVyIT09ZVp0JiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgaXMgbm90IHBvd2VyIG9mIHR3by4gVGV4dHVyZS5taW5GaWx0ZXIgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5OZWFyZXN0RmlsdGVyIG9yIFRIUkVFLkxpbmVhckZpbHRlci4iKSksITA9PT1lLmhhcygiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIikpe2NvbnN0IGE9ZS5nZXQoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpO2lmKG8udHlwZT09PXNadCYmITE9PT1lLmhhcygiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIikpcmV0dXJuO2lmKCExPT09cyYmby50eXBlPT09bFp0JiYhMT09PWUuaGFzKCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhciIpKXJldHVybjsoby5hbmlzb3Ryb3B5PjF8fGkuZ2V0KG8pLl9fY3VycmVudEFuaXNvdHJvcHkpJiYodC50ZXhQYXJhbWV0ZXJmKG4sYS5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCxNYXRoLm1pbihvLmFuaXNvdHJvcHksci5nZXRNYXhBbmlzb3Ryb3B5KCkpKSxpLmdldChvKS5fX2N1cnJlbnRBbmlzb3Ryb3B5PW8uYW5pc290cm9weSl9fWZ1bmN0aW9uIEwoZSxuKXt2b2lkIDA9PT1lLl9fd2ViZ2xJbml0JiYoZS5fX3dlYmdsSW5pdD0hMCxuLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHcpLGUuX193ZWJnbFRleHR1cmU9dC5jcmVhdGVUZXh0dXJlKCksYS5tZW1vcnkudGV4dHVyZXMrKyl9ZnVuY3Rpb24gUChlLGkscil7bGV0IGE9MzU1MztpLmlzRGF0YVRleHR1cmUyREFycmF5JiYoYT0zNTg2NiksaS5pc0RhdGFUZXh0dXJlM0QmJihhPTMyODc5KSxMKGUsaSksbi5hY3RpdmVUZXh0dXJlKDMzOTg0K3IpLG4uYmluZFRleHR1cmUoYSxlLl9fd2ViZ2xUZXh0dXJlKSx0LnBpeGVsU3RvcmVpKDM3NDQwLGkuZmxpcFkpLHQucGl4ZWxTdG9yZWkoMzc0NDEsaS5wcmVtdWx0aXBseUFscGhhKSx0LnBpeGVsU3RvcmVpKDMzMTcsaS51bnBhY2tBbGlnbm1lbnQpLHQucGl4ZWxTdG9yZWkoMzc0NDMsMCk7Y29uc3QgbD0oZnVuY3Rpb24gYyh0KXtyZXR1cm4hcyYmKHQud3JhcFMhPT1LS3R8fHQud3JhcFQhPT1LS3R8fHQubWluRmlsdGVyIT09Skt0JiZ0Lm1pbkZpbHRlciE9PWVadCl9KShpKSYmITE9PT1fKGkuaW1hZ2UpLGg9ZyhpLmltYWdlLGwsITEsdSksZD1fKGgpfHxzLHA9by5jb252ZXJ0KGkuZm9ybWF0KTtsZXQgZixtPW8uY29udmVydChpLnR5cGUpLHg9YihpLmludGVybmFsRm9ybWF0LHAsbSk7ayhhLGksZCk7Y29uc3Qgdz1pLm1pcG1hcHM7aWYoaS5pc0RlcHRoVGV4dHVyZSl4PTY0MDIscz94PWkudHlwZT09PXNadD8zNjAxMjppLnR5cGU9PT1hWnQ/MzMxOTA6aS50eXBlPT09Y1p0PzM1MDU2OjMzMTg5OmkudHlwZT09PXNadCYmY29uc29sZS5lcnJvcigiV2ViR0xSZW5kZXJlcjogRmxvYXRpbmcgcG9pbnQgZGVwdGggdGV4dHVyZSByZXF1aXJlcyBXZWJHTDIuIiksaS5mb3JtYXQ9PT1kWnQmJjY0MDI9PT14JiZpLnR5cGUhPT1vWnQmJmkudHlwZSE9PWFadCYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVXNlIFVuc2lnbmVkU2hvcnRUeXBlIG9yIFVuc2lnbmVkSW50VHlwZSBmb3IgRGVwdGhGb3JtYXQgRGVwdGhUZXh0dXJlLiIpLGkudHlwZT1vWnQsbT1vLmNvbnZlcnQoaS50eXBlKSksaS5mb3JtYXQ9PT1wWnQmJjY0MDI9PT14JiYoeD0zNDA0MSxpLnR5cGUhPT1jWnQmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERlcHRoU3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuIiksaS50eXBlPWNadCxtPW8uY29udmVydChpLnR5cGUpKSksbi50ZXhJbWFnZTJEKDM1NTMsMCx4LGgud2lkdGgsaC5oZWlnaHQsMCxwLG0sbnVsbCk7ZWxzZSBpZihpLmlzRGF0YVRleHR1cmUpaWYody5sZW5ndGg+MCYmZCl7Zm9yKGxldCB0PTAsZT13Lmxlbmd0aDt0PGU7dCsrKWY9d1t0XSxuLnRleEltYWdlMkQoMzU1Myx0LHgsZi53aWR0aCxmLmhlaWdodCwwLHAsbSxmLmRhdGEpO2kuZ2VuZXJhdGVNaXBtYXBzPSExLGUuX19tYXhNaXBMZXZlbD13Lmxlbmd0aC0xfWVsc2Ugbi50ZXhJbWFnZTJEKDM1NTMsMCx4LGgud2lkdGgsaC5oZWlnaHQsMCxwLG0saC5kYXRhKSxlLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKGkuaXNDb21wcmVzc2VkVGV4dHVyZSl7Zm9yKGxldCB0PTAsZT13Lmxlbmd0aDt0PGU7dCsrKWY9d1t0XSxpLmZvcm1hdCE9PWhadCYmaS5mb3JtYXQhPT11WnQ/bnVsbCE9PXA/bi5jb21wcmVzc2VkVGV4SW1hZ2UyRCgzNTUzLHQseCxmLndpZHRoLGYuaGVpZ2h0LDAsZi5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC51cGxvYWRUZXh0dXJlKCkiKTpuLnRleEltYWdlMkQoMzU1Myx0LHgsZi53aWR0aCxmLmhlaWdodCwwLHAsbSxmLmRhdGEpO2UuX19tYXhNaXBMZXZlbD13Lmxlbmd0aC0xfWVsc2UgaWYoaS5pc0RhdGFUZXh0dXJlMkRBcnJheSluLnRleEltYWdlM0QoMzU4NjYsMCx4LGgud2lkdGgsaC5oZWlnaHQsaC5kZXB0aCwwLHAsbSxoLmRhdGEpLGUuX19tYXhNaXBMZXZlbD0wO2Vsc2UgaWYoaS5pc0RhdGFUZXh0dXJlM0Qpbi50ZXhJbWFnZTNEKDMyODc5LDAseCxoLndpZHRoLGguaGVpZ2h0LGguZGVwdGgsMCxwLG0saC5kYXRhKSxlLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKHcubGVuZ3RoPjAmJmQpe2ZvcihsZXQgdD0wLGU9dy5sZW5ndGg7dDxlO3QrKylmPXdbdF0sbi50ZXhJbWFnZTJEKDM1NTMsdCx4LHAsbSxmKTtpLmdlbmVyYXRlTWlwbWFwcz0hMSxlLl9fbWF4TWlwTGV2ZWw9dy5sZW5ndGgtMX1lbHNlIG4udGV4SW1hZ2UyRCgzNTUzLDAseCxwLG0saCksZS5fX21heE1pcExldmVsPTA7eShpLGQpJiZ2KGEsaSxoLndpZHRoLGguaGVpZ2h0KSxlLl9fdmVyc2lvbj1pLnZlcnNpb24saS5vblVwZGF0ZSYmaS5vblVwZGF0ZShpKX1mdW5jdGlvbiBOKGUscixhLHMsbCl7Y29uc3QgYz1vLmNvbnZlcnQoYS5mb3JtYXQpLHU9by5jb252ZXJ0KGEudHlwZSksaD1iKGEuaW50ZXJuYWxGb3JtYXQsYyx1KTszMjg3OT09PWx8fDM1ODY2PT09bD9uLnRleEltYWdlM0QobCwwLGgsci53aWR0aCxyLmhlaWdodCxyLmRlcHRoLDAsYyx1LG51bGwpOm4udGV4SW1hZ2UyRChsLDAsaCxyLndpZHRoLHIuaGVpZ2h0LDAsYyx1LG51bGwpLG4uYmluZEZyYW1lYnVmZmVyKDM2MTYwLGUpLHQuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAscyxsLGkuZ2V0KGEpLl9fd2ViZ2xUZXh0dXJlLDApLG4uYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWZ1bmN0aW9uIEkoZSxuLGkpe2lmKHQuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxlKSxuLmRlcHRoQnVmZmVyJiYhbi5zdGVuY2lsQnVmZmVyKXtsZXQgcj0zMzE4OTtpZihpKXtjb25zdCBlPW4uZGVwdGhUZXh0dXJlO2UmJmUuaXNEZXB0aFRleHR1cmUmJihlLnR5cGU9PT1zWnQ/cj0zNjAxMjplLnR5cGU9PT1hWnQmJihyPTMzMTkwKSk7Y29uc3QgaT1SKG4pO3QucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLGkscixuLndpZHRoLG4uaGVpZ2h0KX1lbHNlIHQucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSxyLG4ud2lkdGgsbi5oZWlnaHQpO3QuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoMzYxNjAsMzYwOTYsMzYxNjEsZSl9ZWxzZSBpZihuLmRlcHRoQnVmZmVyJiZuLnN0ZW5jaWxCdWZmZXIpe2lmKGkpe2NvbnN0IGU9UihuKTt0LnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSxlLDM1MDU2LG4ud2lkdGgsbi5oZWlnaHQpfWVsc2UgdC5yZW5kZXJidWZmZXJTdG9yYWdlKDM2MTYxLDM0MDQxLG4ud2lkdGgsbi5oZWlnaHQpO3QuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoMzYxNjAsMzMzMDYsMzYxNjEsZSl9ZWxzZXtjb25zdCBlPSEwPT09bi5pc1dlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzP24udGV4dHVyZVswXTpuLnRleHR1cmUscj1vLmNvbnZlcnQoZS5mb3JtYXQpLGE9by5jb252ZXJ0KGUudHlwZSkscz1iKGUuaW50ZXJuYWxGb3JtYXQscixhKTtpZihpKXtjb25zdCBlPVIobik7dC5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoMzYxNjEsZSxzLG4ud2lkdGgsbi5oZWlnaHQpfWVsc2UgdC5yZW5kZXJidWZmZXJTdG9yYWdlKDM2MTYxLHMsbi53aWR0aCxuLmhlaWdodCl9dC5iaW5kUmVuZGVyYnVmZmVyKDM2MTYxLG51bGwpfWZ1bmN0aW9uIFIodCl7cmV0dXJuIHMmJnQuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0P01hdGgubWluKGgsdC5zYW1wbGVzKTowfWxldCBPPSExLHo9ITE7dGhpcy5hbGxvY2F0ZVRleHR1cmVVbml0PWZ1bmN0aW9uIEQoKXtjb25zdCB0PU07cmV0dXJuIHQ+PWwmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlczogVHJ5aW5nIHRvIHVzZSAiK3QrIiB0ZXh0dXJlIHVuaXRzIHdoaWxlIHRoaXMgR1BVIHN1cHBvcnRzIG9ubHkgIitsKSxNKz0xLHR9LHRoaXMucmVzZXRUZXh0dXJlVW5pdHM9ZnVuY3Rpb24gQigpe009MH0sdGhpcy5zZXRUZXh0dXJlMkQ9RSx0aGlzLnNldFRleHR1cmUyREFycmF5PWZ1bmN0aW9uIEgodCxlKXtjb25zdCByPWkuZ2V0KHQpO3QudmVyc2lvbj4wJiZyLl9fdmVyc2lvbiE9PXQudmVyc2lvbj9QKHIsdCxlKToobi5hY3RpdmVUZXh0dXJlKDMzOTg0K2UpLG4uYmluZFRleHR1cmUoMzU4NjYsci5fX3dlYmdsVGV4dHVyZSkpfSx0aGlzLnNldFRleHR1cmUzRD1mdW5jdGlvbiBGKHQsZSl7Y29uc3Qgcj1pLmdldCh0KTt0LnZlcnNpb24+MCYmci5fX3ZlcnNpb24hPT10LnZlcnNpb24/UChyLHQsZSk6KG4uYWN0aXZlVGV4dHVyZSgzMzk4NCtlKSxuLmJpbmRUZXh0dXJlKDMyODc5LHIuX193ZWJnbFRleHR1cmUpKX0sdGhpcy5zZXRUZXh0dXJlQ3ViZT1ULHRoaXMuc2V0dXBSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24gVihlKXtjb25zdCBsPWUudGV4dHVyZSxjPWkuZ2V0KGUpLHU9aS5nZXQobCk7ZS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixTKSwhMCE9PWUuaXNXZWJHTE11bHRpcGxlUmVuZGVyVGFyZ2V0cyYmKHUuX193ZWJnbFRleHR1cmU9dC5jcmVhdGVUZXh0dXJlKCksdS5fX3ZlcnNpb249bC52ZXJzaW9uLGEubWVtb3J5LnRleHR1cmVzKyspO2NvbnN0IGg9ITA9PT1lLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0LGQ9ITA9PT1lLmlzV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHMscD0hMD09PWUuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0LGY9bC5pc0RhdGFUZXh0dXJlM0R8fGwuaXNEYXRhVGV4dHVyZTJEQXJyYXksbT1fKGUpfHxzO2lmKCFzfHxsLmZvcm1hdCE9PXVadHx8bC50eXBlIT09c1p0JiZsLnR5cGUhPT1sWnR8fChsLmZvcm1hdD1oWnQsY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBSZW5kZXJpbmcgdG8gdGV4dHVyZXMgd2l0aCBSR0IgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuIFVzaW5nIFJHQkEgZm9ybWF0IGluc3RlYWQuIikpLGgpe2MuX193ZWJnbEZyYW1lYnVmZmVyPVtdO2ZvcihsZXQgZT0wO2U8NjtlKyspYy5fX3dlYmdsRnJhbWVidWZmZXJbZV09dC5jcmVhdGVGcmFtZWJ1ZmZlcigpfWVsc2UgaWYoYy5fX3dlYmdsRnJhbWVidWZmZXI9dC5jcmVhdGVGcmFtZWJ1ZmZlcigpLGQpaWYoci5kcmF3QnVmZmVycyl7Y29uc3Qgbj1lLnRleHR1cmU7Zm9yKGxldCBlPTAscj1uLmxlbmd0aDtlPHI7ZSsrKXtjb25zdCByPWkuZ2V0KG5bZV0pO3ZvaWQgMD09PXIuX193ZWJnbFRleHR1cmUmJihyLl9fd2ViZ2xUZXh0dXJlPXQuY3JlYXRlVGV4dHVyZSgpLGEubWVtb3J5LnRleHR1cmVzKyspfX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHMgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFdlYkdMMiBvciBXRUJHTF9kcmF3X2J1ZmZlcnMgZXh0ZW5zaW9uLiIpO2Vsc2UgaWYocClpZihzKXtjLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcj10LmNyZWF0ZUZyYW1lYnVmZmVyKCksYy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXI9dC5jcmVhdGVSZW5kZXJidWZmZXIoKSx0LmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsYy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIpO2NvbnN0IGk9by5jb252ZXJ0KGwuZm9ybWF0KSxyPW8uY29udmVydChsLnR5cGUpLGE9YihsLmludGVybmFsRm9ybWF0LGkscikscz1SKGUpO3QucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLHMsYSxlLndpZHRoLGUuaGVpZ2h0KSxuLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxjLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciksdC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzNjA2NCwzNjE2MSxjLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlciksdC5iaW5kUmVuZGVyYnVmZmVyKDM2MTYxLG51bGwpLGUuZGVwdGhCdWZmZXImJihjLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcj10LmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLEkoYy5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIsZSwhMCkpLG4uYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIik7aWYoaCl7bi5iaW5kVGV4dHVyZSgzNDA2Nyx1Ll9fd2ViZ2xUZXh0dXJlKSxrKDM0MDY3LGwsbSk7Zm9yKGxldCB0PTA7dDw2O3QrKylOKGMuX193ZWJnbEZyYW1lYnVmZmVyW3RdLGUsbCwzNjA2NCwzNDA2OSt0KTt5KGwsbSkmJnYoMzQwNjcsbCxlLndpZHRoLGUuaGVpZ2h0KSxuLmJpbmRUZXh0dXJlKDM0MDY3LG51bGwpfWVsc2UgaWYoZCl7Y29uc3QgdD1lLnRleHR1cmU7Zm9yKGxldCByPTAsbz10Lmxlbmd0aDtyPG87cisrKXtjb25zdCBvPXRbcl0sYT1pLmdldChvKTtuLmJpbmRUZXh0dXJlKDM1NTMsYS5fX3dlYmdsVGV4dHVyZSksaygzNTUzLG8sbSksTihjLl9fd2ViZ2xGcmFtZWJ1ZmZlcixlLG8sMzYwNjQrciwzNTUzKSx5KG8sbSkmJnYoMzU1MyxvLGUud2lkdGgsZS5oZWlnaHQpfW4uYmluZFRleHR1cmUoMzU1MyxudWxsKX1lbHNle2xldCB0PTM1NTM7ZiYmKHM/dD1sLmlzRGF0YVRleHR1cmUzRD8zMjg3OTozNTg2Njpjb25zb2xlLndhcm4oIlRIUkVFLkRhdGFUZXh0dXJlM0QgYW5kIFRIUkVFLkRhdGFUZXh0dXJlMkRBcnJheSBvbmx5IHN1cHBvcnRlZCB3aXRoIFdlYkdMMi4iKSksbi5iaW5kVGV4dHVyZSh0LHUuX193ZWJnbFRleHR1cmUpLGsodCxsLG0pLE4oYy5fX3dlYmdsRnJhbWVidWZmZXIsZSxsLDM2MDY0LHQpLHkobCxtKSYmdih0LGwsZS53aWR0aCxlLmhlaWdodCxlLmRlcHRoKSxuLmJpbmRUZXh0dXJlKHQsbnVsbCl9ZS5kZXB0aEJ1ZmZlciYmKGZ1bmN0aW9uIGcoZSl7Y29uc3Qgcj1pLmdldChlKSxvPSEwPT09ZS5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldDtpZihlLmRlcHRoVGV4dHVyZSl7aWYobyl0aHJvdyBuZXcgRXJyb3IoInRhcmdldC5kZXB0aFRleHR1cmUgbm90IHN1cHBvcnRlZCBpbiBDdWJlIHJlbmRlciB0YXJnZXRzIik7IShmdW5jdGlvbiBhKGUscil7aWYociYmci5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCl0aHJvdyBuZXcgRXJyb3IoIkRlcHRoIFRleHR1cmUgd2l0aCBjdWJlIHJlbmRlciB0YXJnZXRzIGlzIG5vdCBzdXBwb3J0ZWQiKTtpZihuLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxlKSwhci5kZXB0aFRleHR1cmV8fCFyLmRlcHRoVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSl0aHJvdyBuZXcgRXJyb3IoInJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBUSFJFRS5EZXB0aFRleHR1cmUiKTtpLmdldChyLmRlcHRoVGV4dHVyZSkuX193ZWJnbFRleHR1cmUmJnIuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoPT09ci53aWR0aCYmci5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0PT09ci5oZWlnaHR8fChyLmRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aD1yLndpZHRoLHIuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodD1yLmhlaWdodCxyLmRlcHRoVGV4dHVyZS5uZWVkc1VwZGF0ZT0hMCksRShyLmRlcHRoVGV4dHVyZSwwKTtjb25zdCBvPWkuZ2V0KHIuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZTtpZihyLmRlcHRoVGV4dHVyZS5mb3JtYXQ9PT1kWnQpdC5mcmFtZWJ1ZmZlclRleHR1cmUyRCgzNjE2MCwzNjA5NiwzNTUzLG8sMCk7ZWxzZXtpZihyLmRlcHRoVGV4dHVyZS5mb3JtYXQhPT1wWnQpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGRlcHRoVGV4dHVyZSBmb3JtYXQiKTt0LmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDMzMzA2LDM1NTMsbywwKX19KShyLl9fd2ViZ2xGcmFtZWJ1ZmZlcixlKX1lbHNlIGlmKG8pe3IuX193ZWJnbERlcHRoYnVmZmVyPVtdO2ZvcihsZXQgaT0wO2k8NjtpKyspbi5iaW5kRnJhbWVidWZmZXIoMzYxNjAsci5fX3dlYmdsRnJhbWVidWZmZXJbaV0pLHIuX193ZWJnbERlcHRoYnVmZmVyW2ldPXQuY3JlYXRlUmVuZGVyYnVmZmVyKCksSShyLl9fd2ViZ2xEZXB0aGJ1ZmZlcltpXSxlLCExKX1lbHNlIG4uYmluZEZyYW1lYnVmZmVyKDM2MTYwLHIuX193ZWJnbEZyYW1lYnVmZmVyKSxyLl9fd2ViZ2xEZXB0aGJ1ZmZlcj10LmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLEkoci5fX3dlYmdsRGVwdGhidWZmZXIsZSwhMSk7bi5iaW5kRnJhbWVidWZmZXIoMzYxNjAsbnVsbCl9KShlKX0sdGhpcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA9ZnVuY3Rpb24gVSh0KXtjb25zdCBlPV8odCl8fHMscj0hMD09PXQuaXNXZWJHTE11bHRpcGxlUmVuZGVyVGFyZ2V0cz90LnRleHR1cmU6W3QudGV4dHVyZV07Zm9yKGxldCBvPTAsYT1yLmxlbmd0aDtvPGE7bysrKXtjb25zdCBhPXJbb107aWYoeShhLGUpKXtjb25zdCBlPXQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQ/MzQwNjc6MzU1MyxyPWkuZ2V0KGEpLl9fd2ViZ2xUZXh0dXJlO24uYmluZFRleHR1cmUoZSxyKSx2KGUsYSx0LndpZHRoLHQuaGVpZ2h0KSxuLmJpbmRUZXh0dXJlKGUsbnVsbCl9fX0sdGhpcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldD1mdW5jdGlvbiBqKGUpe2lmKGUuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KWlmKHMpe2NvbnN0IHI9ZS53aWR0aCxvPWUuaGVpZ2h0O2xldCBhPTE2Mzg0O2UuZGVwdGhCdWZmZXImJihhfD0yNTYpLGUuc3RlbmNpbEJ1ZmZlciYmKGF8PTEwMjQpO2NvbnN0IHM9aS5nZXQoZSk7bi5iaW5kRnJhbWVidWZmZXIoMzYwMDgscy5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIpLG4uYmluZEZyYW1lYnVmZmVyKDM2MDA5LHMuX193ZWJnbEZyYW1lYnVmZmVyKSx0LmJsaXRGcmFtZWJ1ZmZlcigwLDAscixvLDAsMCxyLG8sYSw5NzI4KSxuLmJpbmRGcmFtZWJ1ZmZlcigzNjAwOCxudWxsKSxuLmJpbmRGcmFtZWJ1ZmZlcigzNjAwOSxzLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcil9ZWxzZSBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFdlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFdlYkdMMi4iKX0sdGhpcy5zYWZlU2V0VGV4dHVyZTJEPWZ1bmN0aW9uIEcodCxlKXt0JiZ0LmlzV2ViR0xSZW5kZXJUYXJnZXQmJighMT09PU8mJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMVGV4dHVyZXMuc2FmZVNldFRleHR1cmUyRDogZG9uJ3QgdXNlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC4iKSxPPSEwKSx0PXQudGV4dHVyZSksRSh0LGUpfSx0aGlzLnNhZmVTZXRUZXh0dXJlQ3ViZT1mdW5jdGlvbiBXKHQsZSl7dCYmdC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCYmKCExPT09eiYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlcy5zYWZlU2V0VGV4dHVyZUN1YmU6IGRvbid0IHVzZSBjdWJlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC4iKSx6PSEwKSx0PXQudGV4dHVyZSksVCh0LGUpfX1mdW5jdGlvbiBENXQodCxlLG4pe2NvbnN0IGk9bi5pc1dlYkdMMjtyZXR1cm57Y29udmVydDpmdW5jdGlvbiByKHQpe2xldCBuO2lmKHQ9PT1yWnQpcmV0dXJuIDUxMjE7aWYoMTAxNz09PXQpcmV0dXJuIDMyODE5O2lmKDEwMTg9PT10KXJldHVybiAzMjgyMDtpZigxMDE5PT09dClyZXR1cm4gMzM2MzU7aWYoMTAxMD09PXQpcmV0dXJuIDUxMjA7aWYoMTAxMT09PXQpcmV0dXJuIDUxMjI7aWYodD09PW9adClyZXR1cm4gNTEyMztpZigxMDEzPT09dClyZXR1cm4gNTEyNDtpZih0PT09YVp0KXJldHVybiA1MTI1O2lmKHQ9PT1zWnQpcmV0dXJuIDUxMjY7aWYodD09PWxadClyZXR1cm4gaT81MTMxOihuPWUuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IiksbnVsbCE9PW4/bi5IQUxGX0ZMT0FUX09FUzpudWxsKTtpZigxMDIxPT09dClyZXR1cm4gNjQwNjtpZih0PT09dVp0KXJldHVybiA2NDA3O2lmKHQ9PT1oWnQpcmV0dXJuIDY0MDg7aWYoMTAyND09PXQpcmV0dXJuIDY0MDk7aWYoMTAyNT09PXQpcmV0dXJuIDY0MTA7aWYodD09PWRadClyZXR1cm4gNjQwMjtpZih0PT09cFp0KXJldHVybiAzNDA0MTtpZigxMDI4PT09dClyZXR1cm4gNjQwMztpZigxMDI5PT09dClyZXR1cm4gMzYyNDQ7aWYoMTAzMD09PXQpcmV0dXJuIDMzMzE5O2lmKDEwMzE9PT10KXJldHVybiAzMzMyMDtpZigxMDMyPT09dClyZXR1cm4gMzYyNDg7aWYoMTAzMz09PXQpcmV0dXJuIDM2MjQ5O2lmKHQ9PT1mWnR8fHQ9PT1tWnR8fHQ9PT1nWnR8fHQ9PT1fWnQpe2lmKG49ZS5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIiksbnVsbD09PW4pcmV0dXJuIG51bGw7aWYodD09PWZadClyZXR1cm4gbi5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUO2lmKHQ9PT1tWnQpcmV0dXJuIG4uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ7aWYodD09PWdadClyZXR1cm4gbi5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDtpZih0PT09X1p0KXJldHVybiBuLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUfWlmKHQ9PT15WnR8fHQ9PT12WnR8fHQ9PT1iWnR8fHQ9PT14WnQpe2lmKG49ZS5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpLG51bGw9PT1uKXJldHVybiBudWxsO2lmKHQ9PT15WnQpcmV0dXJuIG4uQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRztpZih0PT09dlp0KXJldHVybiBuLkNPTVBSRVNTRURfUkdCX1BWUlRDXzJCUFBWMV9JTUc7aWYodD09PWJadClyZXR1cm4gbi5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRztpZih0PT09eFp0KXJldHVybiBuLkNPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HfWlmKDM2MTk2PT09dClyZXR1cm4gbj1lLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEiKSxudWxsIT09bj9uLkNPTVBSRVNTRURfUkdCX0VUQzFfV0VCR0w6bnVsbDtpZigodD09PXdadHx8dD09PVNadCkmJihuPWUuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjIiksbnVsbCE9PW4pKXtpZih0PT09d1p0KXJldHVybiBuLkNPTVBSRVNTRURfUkdCOF9FVEMyO2lmKHQ9PT1TWnQpcmV0dXJuIG4uQ09NUFJFU1NFRF9SR0JBOF9FVEMyX0VBQ31yZXR1cm4gMzc4MDg9PT10fHwzNzgwOT09PXR8fDM3ODEwPT09dHx8Mzc4MTE9PT10fHwzNzgxMj09PXR8fDM3ODEzPT09dHx8Mzc4MTQ9PT10fHwzNzgxNT09PXR8fDM3ODE2PT09dHx8Mzc4MTc9PT10fHwzNzgxOD09PXR8fDM3ODE5PT09dHx8Mzc4MjA9PT10fHwzNzgyMT09PXR8fDM3ODQwPT09dHx8Mzc4NDE9PT10fHwzNzg0Mj09PXR8fDM3ODQzPT09dHx8Mzc4NDQ9PT10fHwzNzg0NT09PXR8fDM3ODQ2PT09dHx8Mzc4NDc9PT10fHwzNzg0OD09PXR8fDM3ODQ5PT09dHx8Mzc4NTA9PT10fHwzNzg1MT09PXR8fDM3ODUyPT09dHx8Mzc4NTM9PT10PyhuPWUuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfYXN0YyIpLG51bGwhPT1uP3Q6bnVsbCk6MzY0OTI9PT10PyhuPWUuZ2V0KCJFWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9icHRjIiksbnVsbCE9PW4/dDpudWxsKTp0PT09Y1p0P2k/MzQwNDI6KG49ZS5nZXQoIldFQkdMX2RlcHRoX3RleHR1cmUiKSxudWxsIT09bj9uLlVOU0lHTkVEX0lOVF8yNF84X1dFQkdMOm51bGwpOnZvaWQgMH19fUk1dC5wcm90b3R5cGUuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbD0hMDtjbGFzcyBCNXQgZXh0ZW5kcyBxMXR7Y29uc3RydWN0b3IodD1bXSl7c3VwZXIoKSx0aGlzLmNhbWVyYXM9dH19QjV0LnByb3RvdHlwZS5pc0FycmF5Q2FtZXJhPSEwO2NsYXNzIEg1dCBleHRlbmRzIGtRdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy50eXBlPSJHcm91cCJ9fUg1dC5wcm90b3R5cGUuaXNHcm91cD0hMDtjb25zdCBGNXQ9e3R5cGU6Im1vdmUifTtjbGFzcyBWNXR7Y29uc3RydWN0b3IoKXt0aGlzLl90YXJnZXRSYXk9bnVsbCx0aGlzLl9ncmlwPW51bGwsdGhpcy5faGFuZD1udWxsfWdldEhhbmRTcGFjZSgpe3JldHVybiBudWxsPT09dGhpcy5faGFuZCYmKHRoaXMuX2hhbmQ9bmV3IEg1dCx0aGlzLl9oYW5kLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5faGFuZC52aXNpYmxlPSExLHRoaXMuX2hhbmQuam9pbnRzPXt9LHRoaXMuX2hhbmQuaW5wdXRTdGF0ZT17cGluY2hpbmc6ITF9KSx0aGlzLl9oYW5kfWdldFRhcmdldFJheVNwYWNlKCl7cmV0dXJuIG51bGw9PT10aGlzLl90YXJnZXRSYXkmJih0aGlzLl90YXJnZXRSYXk9bmV3IEg1dCx0aGlzLl90YXJnZXRSYXkubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLl90YXJnZXRSYXkudmlzaWJsZT0hMSx0aGlzLl90YXJnZXRSYXkuaGFzTGluZWFyVmVsb2NpdHk9ITEsdGhpcy5fdGFyZ2V0UmF5LmxpbmVhclZlbG9jaXR5PW5ldyBDSnQsdGhpcy5fdGFyZ2V0UmF5Lmhhc0FuZ3VsYXJWZWxvY2l0eT0hMSx0aGlzLl90YXJnZXRSYXkuYW5ndWxhclZlbG9jaXR5PW5ldyBDSnQpLHRoaXMuX3RhcmdldFJheX1nZXRHcmlwU3BhY2UoKXtyZXR1cm4gbnVsbD09PXRoaXMuX2dyaXAmJih0aGlzLl9ncmlwPW5ldyBINXQsdGhpcy5fZ3JpcC5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuX2dyaXAudmlzaWJsZT0hMSx0aGlzLl9ncmlwLmhhc0xpbmVhclZlbG9jaXR5PSExLHRoaXMuX2dyaXAubGluZWFyVmVsb2NpdHk9bmV3IENKdCx0aGlzLl9ncmlwLmhhc0FuZ3VsYXJWZWxvY2l0eT0hMSx0aGlzLl9ncmlwLmFuZ3VsYXJWZWxvY2l0eT1uZXcgQ0p0KSx0aGlzLl9ncmlwfWRpc3BhdGNoRXZlbnQodCl7cmV0dXJuIG51bGwhPT10aGlzLl90YXJnZXRSYXkmJnRoaXMuX3RhcmdldFJheS5kaXNwYXRjaEV2ZW50KHQpLG51bGwhPT10aGlzLl9ncmlwJiZ0aGlzLl9ncmlwLmRpc3BhdGNoRXZlbnQodCksbnVsbCE9PXRoaXMuX2hhbmQmJnRoaXMuX2hhbmQuZGlzcGF0Y2hFdmVudCh0KSx0aGlzfWRpc2Nvbm5lY3QodCl7cmV0dXJuIHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzY29ubmVjdGVkIixkYXRhOnR9KSxudWxsIT09dGhpcy5fdGFyZ2V0UmF5JiYodGhpcy5fdGFyZ2V0UmF5LnZpc2libGU9ITEpLG51bGwhPT10aGlzLl9ncmlwJiYodGhpcy5fZ3JpcC52aXNpYmxlPSExKSxudWxsIT09dGhpcy5faGFuZCYmKHRoaXMuX2hhbmQudmlzaWJsZT0hMSksdGhpc311cGRhdGUodCxlLG4pe2xldCBpPW51bGwscj1udWxsLG89bnVsbDtjb25zdCBhPXRoaXMuX3RhcmdldFJheSxzPXRoaXMuX2dyaXAsbD10aGlzLl9oYW5kO2lmKHQmJiJ2aXNpYmxlLWJsdXJyZWQiIT09ZS5zZXNzaW9uLnZpc2liaWxpdHlTdGF0ZSlpZihudWxsIT09YSYmKGk9ZS5nZXRQb3NlKHQudGFyZ2V0UmF5U3BhY2UsbiksbnVsbCE9PWkmJihhLm1hdHJpeC5mcm9tQXJyYXkoaS50cmFuc2Zvcm0ubWF0cml4KSxhLm1hdHJpeC5kZWNvbXBvc2UoYS5wb3NpdGlvbixhLnJvdGF0aW9uLGEuc2NhbGUpLGkubGluZWFyVmVsb2NpdHk/KGEuaGFzTGluZWFyVmVsb2NpdHk9ITAsYS5saW5lYXJWZWxvY2l0eS5jb3B5KGkubGluZWFyVmVsb2NpdHkpKTphLmhhc0xpbmVhclZlbG9jaXR5PSExLGkuYW5ndWxhclZlbG9jaXR5PyhhLmhhc0FuZ3VsYXJWZWxvY2l0eT0hMCxhLmFuZ3VsYXJWZWxvY2l0eS5jb3B5KGkuYW5ndWxhclZlbG9jaXR5KSk6YS5oYXNBbmd1bGFyVmVsb2NpdHk9ITEsdGhpcy5kaXNwYXRjaEV2ZW50KEY1dCkpKSxsJiZ0LmhhbmQpe289ITA7Zm9yKGNvbnN0IGkgb2YgdC5oYW5kLnZhbHVlcygpKXtjb25zdCB0PWUuZ2V0Sm9pbnRQb3NlKGksbik7aWYodm9pZCAwPT09bC5qb2ludHNbaS5qb2ludE5hbWVdKXtjb25zdCB0PW5ldyBINXQ7dC5tYXRyaXhBdXRvVXBkYXRlPSExLHQudmlzaWJsZT0hMSxsLmpvaW50c1tpLmpvaW50TmFtZV09dCxsLmFkZCh0KX1jb25zdCByPWwuam9pbnRzW2kuam9pbnROYW1lXTtudWxsIT09dCYmKHIubWF0cml4LmZyb21BcnJheSh0LnRyYW5zZm9ybS5tYXRyaXgpLHIubWF0cml4LmRlY29tcG9zZShyLnBvc2l0aW9uLHIucm90YXRpb24sci5zY2FsZSksci5qb2ludFJhZGl1cz10LnJhZGl1cyksci52aXNpYmxlPW51bGwhPT10fWNvbnN0IGk9bC5qb2ludHNbImluZGV4LWZpbmdlci10aXAiXS5wb3NpdGlvbi5kaXN0YW5jZVRvKGwuam9pbnRzWyJ0aHVtYi10aXAiXS5wb3NpdGlvbikscj0uMDIsYT0uMDA1O2wuaW5wdXRTdGF0ZS5waW5jaGluZyYmaT5yK2E/KGwuaW5wdXRTdGF0ZS5waW5jaGluZz0hMSx0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6InBpbmNoZW5kIixoYW5kZWRuZXNzOnQuaGFuZGVkbmVzcyx0YXJnZXQ6dGhpc30pKTohbC5pbnB1dFN0YXRlLnBpbmNoaW5nJiZpPD1yLWEmJihsLmlucHV0U3RhdGUucGluY2hpbmc9ITAsdGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJwaW5jaHN0YXJ0IixoYW5kZWRuZXNzOnQuaGFuZGVkbmVzcyx0YXJnZXQ6dGhpc30pKX1lbHNlIG51bGwhPT1zJiZ0LmdyaXBTcGFjZSYmKHI9ZS5nZXRQb3NlKHQuZ3JpcFNwYWNlLG4pLG51bGwhPT1yJiYocy5tYXRyaXguZnJvbUFycmF5KHIudHJhbnNmb3JtLm1hdHJpeCkscy5tYXRyaXguZGVjb21wb3NlKHMucG9zaXRpb24scy5yb3RhdGlvbixzLnNjYWxlKSxyLmxpbmVhclZlbG9jaXR5PyhzLmhhc0xpbmVhclZlbG9jaXR5PSEwLHMubGluZWFyVmVsb2NpdHkuY29weShyLmxpbmVhclZlbG9jaXR5KSk6cy5oYXNMaW5lYXJWZWxvY2l0eT0hMSxyLmFuZ3VsYXJWZWxvY2l0eT8ocy5oYXNBbmd1bGFyVmVsb2NpdHk9ITAscy5hbmd1bGFyVmVsb2NpdHkuY29weShyLmFuZ3VsYXJWZWxvY2l0eSkpOnMuaGFzQW5ndWxhclZlbG9jaXR5PSExKSk7cmV0dXJuIG51bGwhPT1hJiYoYS52aXNpYmxlPW51bGwhPT1pKSxudWxsIT09cyYmKHMudmlzaWJsZT1udWxsIT09ciksbnVsbCE9PWwmJihsLnZpc2libGU9bnVsbCE9PW8pLHRoaXN9fWNsYXNzIFU1dCBleHRlbmRzIGpadHtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCk7Y29uc3Qgbj10aGlzLGk9dC5zdGF0ZTtsZXQgcj1udWxsLG89MSxhPW51bGwscz0ibG9jYWwtZmxvb3IiLGw9bnVsbCxjPW51bGwsdT1udWxsLGg9bnVsbCxkPW51bGw7Y29uc3QgcD1bXSxmPW5ldyBNYXAsbT1uZXcgcTF0O20ubGF5ZXJzLmVuYWJsZSgxKSxtLnZpZXdwb3J0PW5ldyB3SnQ7Y29uc3QgZz1uZXcgcTF0O2cubGF5ZXJzLmVuYWJsZSgyKSxnLnZpZXdwb3J0PW5ldyB3SnQ7Y29uc3QgXz1bbSxnXSx5PW5ldyBCNXQ7eS5sYXllcnMuZW5hYmxlKDEpLHkubGF5ZXJzLmVuYWJsZSgyKTtsZXQgdj1udWxsLGI9bnVsbDtmdW5jdGlvbiB4KHQpe2NvbnN0IGU9Zi5nZXQodC5pbnB1dFNvdXJjZSk7ZSYmZS5kaXNwYXRjaEV2ZW50KHt0eXBlOnQudHlwZSxkYXRhOnQuaW5wdXRTb3VyY2V9KX1mdW5jdGlvbiB3KCl7Zi5mb3JFYWNoKChmdW5jdGlvbih0LGUpe3QuZGlzY29ubmVjdChlKX0pKSxmLmNsZWFyKCksdj1udWxsLGI9bnVsbCxpLmJpbmRYUkZyYW1lYnVmZmVyKG51bGwpLHQuc2V0UmVuZGVyVGFyZ2V0KHQuZ2V0UmVuZGVyVGFyZ2V0KCkpLEEuc3RvcCgpLG4uaXNQcmVzZW50aW5nPSExLG4uZGlzcGF0Y2hFdmVudCh7dHlwZToic2Vzc2lvbmVuZCJ9KX1mdW5jdGlvbiBTKHQpe2NvbnN0IGU9ci5pbnB1dFNvdXJjZXM7Zm9yKGxldCB0PTA7dDxwLmxlbmd0aDt0KyspZi5zZXQoZVt0XSxwW3RdKTtmb3IobGV0IGU9MDtlPHQucmVtb3ZlZC5sZW5ndGg7ZSsrKXtjb25zdCBuPXQucmVtb3ZlZFtlXSxpPWYuZ2V0KG4pO2kmJihpLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc2Nvbm5lY3RlZCIsZGF0YTpufSksZi5kZWxldGUobikpfWZvcihsZXQgZT0wO2U8dC5hZGRlZC5sZW5ndGg7ZSsrKXtjb25zdCBuPXQuYWRkZWRbZV0saT1mLmdldChuKTtpJiZpLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImNvbm5lY3RlZCIsZGF0YTpufSl9fXRoaXMuY2FtZXJhQXV0b1VwZGF0ZT0hMCx0aGlzLmVuYWJsZWQ9ITEsdGhpcy5pc1ByZXNlbnRpbmc9ITEsdGhpcy5nZXRDb250cm9sbGVyPWZ1bmN0aW9uKHQpe2xldCBlPXBbdF07cmV0dXJuIHZvaWQgMD09PWUmJihlPW5ldyBWNXQscFt0XT1lKSxlLmdldFRhcmdldFJheVNwYWNlKCl9LHRoaXMuZ2V0Q29udHJvbGxlckdyaXA9ZnVuY3Rpb24odCl7bGV0IGU9cFt0XTtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9bmV3IFY1dCxwW3RdPWUpLGUuZ2V0R3JpcFNwYWNlKCl9LHRoaXMuZ2V0SGFuZD1mdW5jdGlvbih0KXtsZXQgZT1wW3RdO3JldHVybiB2b2lkIDA9PT1lJiYoZT1uZXcgVjV0LHBbdF09ZSksZS5nZXRIYW5kU3BhY2UoKX0sdGhpcy5zZXRGcmFtZWJ1ZmZlclNjYWxlRmFjdG9yPWZ1bmN0aW9uKHQpe289dCwhMD09PW4uaXNQcmVzZW50aW5nJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYlhSTWFuYWdlcjogQ2Fubm90IGNoYW5nZSBmcmFtZWJ1ZmZlciBzY2FsZSB3aGlsZSBwcmVzZW50aW5nLiIpfSx0aGlzLnNldFJlZmVyZW5jZVNwYWNlVHlwZT1mdW5jdGlvbih0KXtzPXQsITA9PT1uLmlzUHJlc2VudGluZyYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IENhbm5vdCBjaGFuZ2UgcmVmZXJlbmNlIHNwYWNlIHR5cGUgd2hpbGUgcHJlc2VudGluZy4iKX0sdGhpcy5nZXRSZWZlcmVuY2VTcGFjZT1mdW5jdGlvbigpe3JldHVybiBhfSx0aGlzLmdldFNlc3Npb249ZnVuY3Rpb24oKXtyZXR1cm4gcn0sdGhpcy5zZXRTZXNzaW9uPWFzeW5jIGZ1bmN0aW9uKHQpe2lmKHI9dCxudWxsIT09cil7ci5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3QiLHgpLHIuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0c3RhcnQiLHgpLHIuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0ZW5kIix4KSxyLmFkZEV2ZW50TGlzdGVuZXIoInNxdWVlemUiLHgpLHIuYWRkRXZlbnRMaXN0ZW5lcigic3F1ZWV6ZXN0YXJ0Iix4KSxyLmFkZEV2ZW50TGlzdGVuZXIoInNxdWVlemVlbmQiLHgpLHIuYWRkRXZlbnRMaXN0ZW5lcigiZW5kIix3KSxyLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0c291cmNlc2NoYW5nZSIsUyk7Y29uc3QgdD1lLmdldENvbnRleHRBdHRyaWJ1dGVzKCk7aWYoITAhPT10LnhyQ29tcGF0aWJsZSYmYXdhaXQgZS5tYWtlWFJDb21wYXRpYmxlKCksdm9pZCAwPT09ci5yZW5kZXJTdGF0ZS5sYXllcnMpZD1uZXcgWFJXZWJHTExheWVyKHIsZSx7YW50aWFsaWFzOnQuYW50aWFsaWFzLGFscGhhOnQuYWxwaGEsZGVwdGg6dC5kZXB0aCxzdGVuY2lsOnQuc3RlbmNpbCxmcmFtZWJ1ZmZlclNjYWxlRmFjdG9yOm99KSxyLnVwZGF0ZVJlbmRlclN0YXRlKHtiYXNlTGF5ZXI6ZH0pO2Vsc2V7bGV0IG49MDtpZih0LmFudGlhbGlhcylkPW5ldyBYUldlYkdMTGF5ZXIocixlLHthbnRpYWxpYXM6ITAsYWxwaGE6dC5hbHBoYSxkZXB0aDp0LmRlcHRoLHN0ZW5jaWw6dC5zdGVuY2lsLGZyYW1lYnVmZmVyU2NhbGVGYWN0b3I6b30pLHIudXBkYXRlUmVuZGVyU3RhdGUoe2xheWVyczpbZF19KTtlbHNle3QuZGVwdGgmJihuPXQuc3RlbmNpbD8zNDA0MTo2NDAyKTtjb25zdCBpPXtjb2xvckZvcm1hdDp0LmFscGhhPzY0MDg6NjQwNyxkZXB0aEZvcm1hdDpuLHNjYWxlRmFjdG9yOm99O2M9bmV3IFhSV2ViR0xCaW5kaW5nKHIsZSksaD1jLmNyZWF0ZVByb2plY3Rpb25MYXllcihpKSx1PWUuY3JlYXRlRnJhbWVidWZmZXIoKSxyLnVwZGF0ZVJlbmRlclN0YXRlKHtsYXllcnM6W2hdfSl9fWE9YXdhaXQgci5yZXF1ZXN0UmVmZXJlbmNlU3BhY2UocyksQS5zZXRDb250ZXh0KHIpLEEuc3RhcnQoKSxuLmlzUHJlc2VudGluZz0hMCxuLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25zdGFydCJ9KX19O2NvbnN0IE09bmV3IENKdCxFPW5ldyBDSnQ7ZnVuY3Rpb24gVCh0LGUpe251bGw9PT1lP3QubWF0cml4V29ybGQuY29weSh0Lm1hdHJpeCk6dC5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKGUubWF0cml4V29ybGQsdC5tYXRyaXgpLHQubWF0cml4V29ybGRJbnZlcnNlLmNvcHkodC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCl9dGhpcy51cGRhdGVDYW1lcmE9ZnVuY3Rpb24odCl7aWYobnVsbD09PXIpcmV0dXJuO3kubmVhcj1nLm5lYXI9bS5uZWFyPXQubmVhcix5LmZhcj1nLmZhcj1tLmZhcj10LmZhcix2PT09eS5uZWFyJiZiPT09eS5mYXJ8fChyLnVwZGF0ZVJlbmRlclN0YXRlKHtkZXB0aE5lYXI6eS5uZWFyLGRlcHRoRmFyOnkuZmFyfSksdj15Lm5lYXIsYj15LmZhcik7Y29uc3QgZT10LnBhcmVudCxuPXkuY2FtZXJhcztUKHksZSk7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0KyspVChuW3RdLGUpO3kubWF0cml4V29ybGQuZGVjb21wb3NlKHkucG9zaXRpb24seS5xdWF0ZXJuaW9uLHkuc2NhbGUpLHQucG9zaXRpb24uY29weSh5LnBvc2l0aW9uKSx0LnF1YXRlcm5pb24uY29weSh5LnF1YXRlcm5pb24pLHQuc2NhbGUuY29weSh5LnNjYWxlKSx0Lm1hdHJpeC5jb3B5KHkubWF0cml4KSx0Lm1hdHJpeFdvcmxkLmNvcHkoeS5tYXRyaXhXb3JsZCk7Y29uc3QgaT10LmNoaWxkcmVuO2ZvcihsZXQgdD0wLGU9aS5sZW5ndGg7dDxlO3QrKylpW3RdLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTsyPT09bi5sZW5ndGg/KGZ1bmN0aW9uIG8odCxlLG4pe00uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGUubWF0cml4V29ybGQpLEUuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG4ubWF0cml4V29ybGQpO2NvbnN0IGk9TS5kaXN0YW5jZVRvKEUpLHI9ZS5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzLG89bi5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzLGE9clsxNF0vKHJbMTBdLTEpLHM9clsxNF0vKHJbMTBdKzEpLGw9KHJbOV0rMSkvcls1XSxjPShyWzldLTEpL3JbNV0sdT0ocls4XS0xKS9yWzBdLGg9KG9bOF0rMSkvb1swXSxkPWEqdSxwPWEqaCxmPWkvKC11K2gpLG09ZiotdTtlLm1hdHJpeFdvcmxkLmRlY29tcG9zZSh0LnBvc2l0aW9uLHQucXVhdGVybmlvbix0LnNjYWxlKSx0LnRyYW5zbGF0ZVgobSksdC50cmFuc2xhdGVaKGYpLHQubWF0cml4V29ybGQuY29tcG9zZSh0LnBvc2l0aW9uLHQucXVhdGVybmlvbix0LnNjYWxlKSx0Lm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KHQubWF0cml4V29ybGQpLmludmVydCgpO2NvbnN0IGc9YStmLF89cytmO3QucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUoZC1tLHArKGktbSksbCpzL18qZyxjKnMvXypnLGcsXyl9KSh5LG0sZyk6eS5wcm9qZWN0aW9uTWF0cml4LmNvcHkobS5wcm9qZWN0aW9uTWF0cml4KX0sdGhpcy5nZXRDYW1lcmE9ZnVuY3Rpb24oKXtyZXR1cm4geX0sdGhpcy5nZXRGb3ZlYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PWg/aC5maXhlZEZvdmVhdGlvbjpudWxsIT09ZD9kLmZpeGVkRm92ZWF0aW9uOnZvaWQgMH0sdGhpcy5zZXRGb3ZlYXRpb249ZnVuY3Rpb24odCl7bnVsbCE9PWgmJihoLmZpeGVkRm92ZWF0aW9uPXQpLG51bGwhPT1kJiZ2b2lkIDAhPT1kLmZpeGVkRm92ZWF0aW9uJiYoZC5maXhlZEZvdmVhdGlvbj10KX07bGV0IEM9bnVsbDtjb25zdCBBPW5ldyByMHQ7QS5zZXRBbmltYXRpb25Mb29wKChmdW5jdGlvbiBrKHQsbil7aWYobD1uLmdldFZpZXdlclBvc2UoYSksbnVsbCE9PWwpe2NvbnN0IHQ9bC52aWV3cztudWxsIT09ZCYmaS5iaW5kWFJGcmFtZWJ1ZmZlcihkLmZyYW1lYnVmZmVyKTtsZXQgbj0hMTt0Lmxlbmd0aCE9PXkuY2FtZXJhcy5sZW5ndGgmJih5LmNhbWVyYXMubGVuZ3RoPTAsbj0hMCk7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspe2NvbnN0IG89dFtyXTtsZXQgYT1udWxsO2lmKG51bGwhPT1kKWE9ZC5nZXRWaWV3cG9ydChvKTtlbHNle2NvbnN0IHQ9Yy5nZXRWaWV3U3ViSW1hZ2UoaCxvKTtpLmJpbmRYUkZyYW1lYnVmZmVyKHUpLHZvaWQgMCE9PXQuZGVwdGhTdGVuY2lsVGV4dHVyZSYmZS5mcmFtZWJ1ZmZlclRleHR1cmUyRCgzNjE2MCwzNjA5NiwzNTUzLHQuZGVwdGhTdGVuY2lsVGV4dHVyZSwwKSxlLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDM2MDY0LDM1NTMsdC5jb2xvclRleHR1cmUsMCksYT10LnZpZXdwb3J0fWNvbnN0IHM9X1tyXTtzLm1hdHJpeC5mcm9tQXJyYXkoby50cmFuc2Zvcm0ubWF0cml4KSxzLnByb2plY3Rpb25NYXRyaXguZnJvbUFycmF5KG8ucHJvamVjdGlvbk1hdHJpeCkscy52aWV3cG9ydC5zZXQoYS54LGEueSxhLndpZHRoLGEuaGVpZ2h0KSwwPT09ciYmeS5tYXRyaXguY29weShzLm1hdHJpeCksITA9PT1uJiZ5LmNhbWVyYXMucHVzaChzKX19Y29uc3Qgbz1yLmlucHV0U291cmNlcztmb3IobGV0IHQ9MDt0PHAubGVuZ3RoO3QrKylwW3RdLnVwZGF0ZShvW3RdLG4sYSk7QyYmQyh0LG4pfSkpLHRoaXMuc2V0QW5pbWF0aW9uTG9vcD1mdW5jdGlvbih0KXtDPXR9LHRoaXMuZGlzcG9zZT1mdW5jdGlvbigpe319fWZ1bmN0aW9uIGo1dCh0KXtmdW5jdGlvbiBlKGUsbil7ZS5vcGFjaXR5LnZhbHVlPW4ub3BhY2l0eSxuLmNvbG9yJiZlLmRpZmZ1c2UudmFsdWUuY29weShuLmNvbG9yKSxuLmVtaXNzaXZlJiZlLmVtaXNzaXZlLnZhbHVlLmNvcHkobi5lbWlzc2l2ZSkubXVsdGlwbHlTY2FsYXIobi5lbWlzc2l2ZUludGVuc2l0eSksbi5tYXAmJihlLm1hcC52YWx1ZT1uLm1hcCksbi5hbHBoYU1hcCYmKGUuYWxwaGFNYXAudmFsdWU9bi5hbHBoYU1hcCksbi5zcGVjdWxhck1hcCYmKGUuc3BlY3VsYXJNYXAudmFsdWU9bi5zcGVjdWxhck1hcCk7Y29uc3QgaT10LmdldChuKS5lbnZNYXA7aWYoaSl7ZS5lbnZNYXAudmFsdWU9aSxlLmZsaXBFbnZNYXAudmFsdWU9aS5pc0N1YmVUZXh0dXJlJiYhMT09PWkuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPy0xOjEsZS5yZWZsZWN0aXZpdHkudmFsdWU9bi5yZWZsZWN0aXZpdHksZS5yZWZyYWN0aW9uUmF0aW8udmFsdWU9bi5yZWZyYWN0aW9uUmF0aW87Y29uc3Qgcj10LmdldChpKS5fX21heE1pcExldmVsO3ZvaWQgMCE9PXImJihlLm1heE1pcExldmVsLnZhbHVlPXIpfWxldCByLG87bi5saWdodE1hcCYmKGUubGlnaHRNYXAudmFsdWU9bi5saWdodE1hcCxlLmxpZ2h0TWFwSW50ZW5zaXR5LnZhbHVlPW4ubGlnaHRNYXBJbnRlbnNpdHkpLG4uYW9NYXAmJihlLmFvTWFwLnZhbHVlPW4uYW9NYXAsZS5hb01hcEludGVuc2l0eS52YWx1ZT1uLmFvTWFwSW50ZW5zaXR5KSxuLm1hcD9yPW4ubWFwOm4uc3BlY3VsYXJNYXA/cj1uLnNwZWN1bGFyTWFwOm4uZGlzcGxhY2VtZW50TWFwP3I9bi5kaXNwbGFjZW1lbnRNYXA6bi5ub3JtYWxNYXA/cj1uLm5vcm1hbE1hcDpuLmJ1bXBNYXA/cj1uLmJ1bXBNYXA6bi5yb3VnaG5lc3NNYXA/cj1uLnJvdWdobmVzc01hcDpuLm1ldGFsbmVzc01hcD9yPW4ubWV0YWxuZXNzTWFwOm4uYWxwaGFNYXA/cj1uLmFscGhhTWFwOm4uZW1pc3NpdmVNYXA/cj1uLmVtaXNzaXZlTWFwOm4uY2xlYXJjb2F0TWFwP3I9bi5jbGVhcmNvYXRNYXA6bi5jbGVhcmNvYXROb3JtYWxNYXA/cj1uLmNsZWFyY29hdE5vcm1hbE1hcDpuLmNsZWFyY29hdFJvdWdobmVzc01hcD9yPW4uY2xlYXJjb2F0Um91Z2huZXNzTWFwOm4uc3BlY3VsYXJJbnRlbnNpdHlNYXA/cj1uLnNwZWN1bGFySW50ZW5zaXR5TWFwOm4uc3BlY3VsYXJUaW50TWFwJiYocj1uLnNwZWN1bGFyVGludE1hcCksdm9pZCAwIT09ciYmKHIuaXNXZWJHTFJlbmRlclRhcmdldCYmKHI9ci50ZXh0dXJlKSwhMD09PXIubWF0cml4QXV0b1VwZGF0ZSYmci51cGRhdGVNYXRyaXgoKSxlLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoci5tYXRyaXgpKSxuLmFvTWFwP289bi5hb01hcDpuLmxpZ2h0TWFwJiYobz1uLmxpZ2h0TWFwKSx2b2lkIDAhPT1vJiYoby5pc1dlYkdMUmVuZGVyVGFyZ2V0JiYobz1vLnRleHR1cmUpLCEwPT09by5tYXRyaXhBdXRvVXBkYXRlJiZvLnVwZGF0ZU1hdHJpeCgpLGUudXYyVHJhbnNmb3JtLnZhbHVlLmNvcHkoby5tYXRyaXgpKX1mdW5jdGlvbiBuKGUsbil7ZS5yb3VnaG5lc3MudmFsdWU9bi5yb3VnaG5lc3MsZS5tZXRhbG5lc3MudmFsdWU9bi5tZXRhbG5lc3Msbi5yb3VnaG5lc3NNYXAmJihlLnJvdWdobmVzc01hcC52YWx1ZT1uLnJvdWdobmVzc01hcCksbi5tZXRhbG5lc3NNYXAmJihlLm1ldGFsbmVzc01hcC52YWx1ZT1uLm1ldGFsbmVzc01hcCksbi5lbWlzc2l2ZU1hcCYmKGUuZW1pc3NpdmVNYXAudmFsdWU9bi5lbWlzc2l2ZU1hcCksbi5idW1wTWFwJiYoZS5idW1wTWFwLnZhbHVlPW4uYnVtcE1hcCxlLmJ1bXBTY2FsZS52YWx1ZT1uLmJ1bXBTY2FsZSwxPT09bi5zaWRlJiYoZS5idW1wU2NhbGUudmFsdWUqPS0xKSksbi5ub3JtYWxNYXAmJihlLm5vcm1hbE1hcC52YWx1ZT1uLm5vcm1hbE1hcCxlLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkobi5ub3JtYWxTY2FsZSksMT09PW4uc2lkZSYmZS5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKSksbi5kaXNwbGFjZW1lbnRNYXAmJihlLmRpc3BsYWNlbWVudE1hcC52YWx1ZT1uLmRpc3BsYWNlbWVudE1hcCxlLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPW4uZGlzcGxhY2VtZW50U2NhbGUsZS5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPW4uZGlzcGxhY2VtZW50QmlhcyksdC5nZXQobikuZW52TWFwJiYoZS5lbnZNYXBJbnRlbnNpdHkudmFsdWU9bi5lbnZNYXBJbnRlbnNpdHkpfXJldHVybntyZWZyZXNoRm9nVW5pZm9ybXM6ZnVuY3Rpb24gaSh0LGUpe3QuZm9nQ29sb3IudmFsdWUuY29weShlLmNvbG9yKSxlLmlzRm9nPyh0LmZvZ05lYXIudmFsdWU9ZS5uZWFyLHQuZm9nRmFyLnZhbHVlPWUuZmFyKTplLmlzRm9nRXhwMiYmKHQuZm9nRGVuc2l0eS52YWx1ZT1lLmRlbnNpdHkpfSxyZWZyZXNoTWF0ZXJpYWxVbmlmb3JtczpmdW5jdGlvbiByKHQsaSxvLGEscyl7aS5pc01lc2hCYXNpY01hdGVyaWFsP2UodCxpKTppLmlzTWVzaExhbWJlcnRNYXRlcmlhbD8oZSh0LGkpLChmdW5jdGlvbiBsKHQsZSl7ZS5lbWlzc2l2ZU1hcCYmKHQuZW1pc3NpdmVNYXAudmFsdWU9ZS5lbWlzc2l2ZU1hcCl9KSh0LGkpKTppLmlzTWVzaFRvb25NYXRlcmlhbD8oZSh0LGkpLChmdW5jdGlvbiBjKHQsZSl7ZS5ncmFkaWVudE1hcCYmKHQuZ3JhZGllbnRNYXAudmFsdWU9ZS5ncmFkaWVudE1hcCksZS5lbWlzc2l2ZU1hcCYmKHQuZW1pc3NpdmVNYXAudmFsdWU9ZS5lbWlzc2l2ZU1hcCksZS5idW1wTWFwJiYodC5idW1wTWFwLnZhbHVlPWUuYnVtcE1hcCx0LmJ1bXBTY2FsZS52YWx1ZT1lLmJ1bXBTY2FsZSwxPT09ZS5zaWRlJiYodC5idW1wU2NhbGUudmFsdWUqPS0xKSksZS5ub3JtYWxNYXAmJih0Lm5vcm1hbE1hcC52YWx1ZT1lLm5vcm1hbE1hcCx0Lm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoZS5ub3JtYWxTY2FsZSksMT09PWUuc2lkZSYmdC5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKSksZS5kaXNwbGFjZW1lbnRNYXAmJih0LmRpc3BsYWNlbWVudE1hcC52YWx1ZT1lLmRpc3BsYWNlbWVudE1hcCx0LmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWUuZGlzcGxhY2VtZW50U2NhbGUsdC5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPWUuZGlzcGxhY2VtZW50Qmlhcyl9KSh0LGkpKTppLmlzTWVzaFBob25nTWF0ZXJpYWw/KGUodCxpKSwoZnVuY3Rpb24gdSh0LGUpe3Quc3BlY3VsYXIudmFsdWUuY29weShlLnNwZWN1bGFyKSx0LnNoaW5pbmVzcy52YWx1ZT1NYXRoLm1heChlLnNoaW5pbmVzcywxZS00KSxlLmVtaXNzaXZlTWFwJiYodC5lbWlzc2l2ZU1hcC52YWx1ZT1lLmVtaXNzaXZlTWFwKSxlLmJ1bXBNYXAmJih0LmJ1bXBNYXAudmFsdWU9ZS5idW1wTWFwLHQuYnVtcFNjYWxlLnZhbHVlPWUuYnVtcFNjYWxlLDE9PT1lLnNpZGUmJih0LmJ1bXBTY2FsZS52YWx1ZSo9LTEpKSxlLm5vcm1hbE1hcCYmKHQubm9ybWFsTWFwLnZhbHVlPWUubm9ybWFsTWFwLHQubm9ybWFsU2NhbGUudmFsdWUuY29weShlLm5vcm1hbFNjYWxlKSwxPT09ZS5zaWRlJiZ0Lm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKSxlLmRpc3BsYWNlbWVudE1hcCYmKHQuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWUuZGlzcGxhY2VtZW50TWFwLHQuZGlzcGxhY2VtZW50U2NhbGUudmFsdWU9ZS5kaXNwbGFjZW1lbnRTY2FsZSx0LmRpc3BsYWNlbWVudEJpYXMudmFsdWU9ZS5kaXNwbGFjZW1lbnRCaWFzKX0pKHQsaSkpOmkuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD8oZSh0LGkpLGkuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbD8oZnVuY3Rpb24gaCh0LGUsaSl7bih0LGUpLHQucmVmbGVjdGl2aXR5LnZhbHVlPWUucmVmbGVjdGl2aXR5LHQuY2xlYXJjb2F0LnZhbHVlPWUuY2xlYXJjb2F0LHQuY2xlYXJjb2F0Um91Z2huZXNzLnZhbHVlPWUuY2xlYXJjb2F0Um91Z2huZXNzLGUuc2hlZW4mJnQuc2hlZW4udmFsdWUuY29weShlLnNoZWVuKSxlLmNsZWFyY29hdE1hcCYmKHQuY2xlYXJjb2F0TWFwLnZhbHVlPWUuY2xlYXJjb2F0TWFwKSxlLmNsZWFyY29hdFJvdWdobmVzc01hcCYmKHQuY2xlYXJjb2F0Um91Z2huZXNzTWFwLnZhbHVlPWUuY2xlYXJjb2F0Um91Z2huZXNzTWFwKSxlLmNsZWFyY29hdE5vcm1hbE1hcCYmKHQuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudmFsdWUuY29weShlLmNsZWFyY29hdE5vcm1hbFNjYWxlKSx0LmNsZWFyY29hdE5vcm1hbE1hcC52YWx1ZT1lLmNsZWFyY29hdE5vcm1hbE1hcCwxPT09ZS5zaWRlJiZ0LmNsZWFyY29hdE5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKSx0LnRyYW5zbWlzc2lvbi52YWx1ZT1lLnRyYW5zbWlzc2lvbixlLnRyYW5zbWlzc2lvbk1hcCYmKHQudHJhbnNtaXNzaW9uTWFwLnZhbHVlPWUudHJhbnNtaXNzaW9uTWFwKSxlLnRyYW5zbWlzc2lvbj4wJiYodC50cmFuc21pc3Npb25TYW1wbGVyTWFwLnZhbHVlPWkudGV4dHVyZSx0LnRyYW5zbWlzc2lvblNhbXBsZXJTaXplLnZhbHVlLnNldChpLndpZHRoLGkuaGVpZ2h0KSksdC50aGlja25lc3MudmFsdWU9ZS50aGlja25lc3MsZS50aGlja25lc3NNYXAmJih0LnRoaWNrbmVzc01hcC52YWx1ZT1lLnRoaWNrbmVzc01hcCksdC5hdHRlbnVhdGlvbkRpc3RhbmNlLnZhbHVlPWUuYXR0ZW51YXRpb25EaXN0YW5jZSx0LmF0dGVudWF0aW9uVGludC52YWx1ZS5jb3B5KGUuYXR0ZW51YXRpb25UaW50KSx0LnNwZWN1bGFySW50ZW5zaXR5LnZhbHVlPWUuc3BlY3VsYXJJbnRlbnNpdHksdC5zcGVjdWxhclRpbnQudmFsdWUuY29weShlLnNwZWN1bGFyVGludCksZS5zcGVjdWxhckludGVuc2l0eU1hcCYmKHQuc3BlY3VsYXJJbnRlbnNpdHlNYXAudmFsdWU9ZS5zcGVjdWxhckludGVuc2l0eU1hcCksZS5zcGVjdWxhclRpbnRNYXAmJih0LnNwZWN1bGFyVGludE1hcC52YWx1ZT1lLnNwZWN1bGFyVGludE1hcCl9KSh0LGkscyk6bih0LGkpKTppLmlzTWVzaE1hdGNhcE1hdGVyaWFsPyhlKHQsaSksKGZ1bmN0aW9uIGQodCxlKXtlLm1hdGNhcCYmKHQubWF0Y2FwLnZhbHVlPWUubWF0Y2FwKSxlLmJ1bXBNYXAmJih0LmJ1bXBNYXAudmFsdWU9ZS5idW1wTWFwLHQuYnVtcFNjYWxlLnZhbHVlPWUuYnVtcFNjYWxlLDE9PT1lLnNpZGUmJih0LmJ1bXBTY2FsZS52YWx1ZSo9LTEpKSxlLm5vcm1hbE1hcCYmKHQubm9ybWFsTWFwLnZhbHVlPWUubm9ybWFsTWFwLHQubm9ybWFsU2NhbGUudmFsdWUuY29weShlLm5vcm1hbFNjYWxlKSwxPT09ZS5zaWRlJiZ0Lm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKSxlLmRpc3BsYWNlbWVudE1hcCYmKHQuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWUuZGlzcGxhY2VtZW50TWFwLHQuZGlzcGxhY2VtZW50U2NhbGUudmFsdWU9ZS5kaXNwbGFjZW1lbnRTY2FsZSx0LmRpc3BsYWNlbWVudEJpYXMudmFsdWU9ZS5kaXNwbGFjZW1lbnRCaWFzKX0pKHQsaSkpOmkuaXNNZXNoRGVwdGhNYXRlcmlhbD8oZSh0LGkpLChmdW5jdGlvbiBwKHQsZSl7ZS5kaXNwbGFjZW1lbnRNYXAmJih0LmRpc3BsYWNlbWVudE1hcC52YWx1ZT1lLmRpc3BsYWNlbWVudE1hcCx0LmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWUuZGlzcGxhY2VtZW50U2NhbGUsdC5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPWUuZGlzcGxhY2VtZW50Qmlhcyl9KSh0LGkpKTppLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWw/KGUodCxpKSwoZnVuY3Rpb24gZih0LGUpe2UuZGlzcGxhY2VtZW50TWFwJiYodC5kaXNwbGFjZW1lbnRNYXAudmFsdWU9ZS5kaXNwbGFjZW1lbnRNYXAsdC5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1lLmRpc3BsYWNlbWVudFNjYWxlLHQuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1lLmRpc3BsYWNlbWVudEJpYXMpLHQucmVmZXJlbmNlUG9zaXRpb24udmFsdWUuY29weShlLnJlZmVyZW5jZVBvc2l0aW9uKSx0Lm5lYXJEaXN0YW5jZS52YWx1ZT1lLm5lYXJEaXN0YW5jZSx0LmZhckRpc3RhbmNlLnZhbHVlPWUuZmFyRGlzdGFuY2V9KSh0LGkpKTppLmlzTWVzaE5vcm1hbE1hdGVyaWFsPyhlKHQsaSksKGZ1bmN0aW9uIG0odCxlKXtlLmJ1bXBNYXAmJih0LmJ1bXBNYXAudmFsdWU9ZS5idW1wTWFwLHQuYnVtcFNjYWxlLnZhbHVlPWUuYnVtcFNjYWxlLDE9PT1lLnNpZGUmJih0LmJ1bXBTY2FsZS52YWx1ZSo9LTEpKSxlLm5vcm1hbE1hcCYmKHQubm9ybWFsTWFwLnZhbHVlPWUubm9ybWFsTWFwLHQubm9ybWFsU2NhbGUudmFsdWUuY29weShlLm5vcm1hbFNjYWxlKSwxPT09ZS5zaWRlJiZ0Lm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKSxlLmRpc3BsYWNlbWVudE1hcCYmKHQuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWUuZGlzcGxhY2VtZW50TWFwLHQuZGlzcGxhY2VtZW50U2NhbGUudmFsdWU9ZS5kaXNwbGFjZW1lbnRTY2FsZSx0LmRpc3BsYWNlbWVudEJpYXMudmFsdWU9ZS5kaXNwbGFjZW1lbnRCaWFzKX0pKHQsaSkpOmkuaXNMaW5lQmFzaWNNYXRlcmlhbD8oKGZ1bmN0aW9uIGcodCxlKXt0LmRpZmZ1c2UudmFsdWUuY29weShlLmNvbG9yKSx0Lm9wYWNpdHkudmFsdWU9ZS5vcGFjaXR5fSkodCxpKSxpLmlzTGluZURhc2hlZE1hdGVyaWFsJiYoZnVuY3Rpb24gXyh0LGUpe3QuZGFzaFNpemUudmFsdWU9ZS5kYXNoU2l6ZSx0LnRvdGFsU2l6ZS52YWx1ZT1lLmRhc2hTaXplK2UuZ2FwU2l6ZSx0LnNjYWxlLnZhbHVlPWUuc2NhbGV9KSh0LGkpKTppLmlzUG9pbnRzTWF0ZXJpYWw/KGZ1bmN0aW9uIHkodCxlLG4saSl7bGV0IHI7dC5kaWZmdXNlLnZhbHVlLmNvcHkoZS5jb2xvciksdC5vcGFjaXR5LnZhbHVlPWUub3BhY2l0eSx0LnNpemUudmFsdWU9ZS5zaXplKm4sdC5zY2FsZS52YWx1ZT0uNSppLGUubWFwJiYodC5tYXAudmFsdWU9ZS5tYXApLGUuYWxwaGFNYXAmJih0LmFscGhhTWFwLnZhbHVlPWUuYWxwaGFNYXApLGUubWFwP3I9ZS5tYXA6ZS5hbHBoYU1hcCYmKHI9ZS5hbHBoYU1hcCksdm9pZCAwIT09ciYmKCEwPT09ci5tYXRyaXhBdXRvVXBkYXRlJiZyLnVwZGF0ZU1hdHJpeCgpLHQudXZUcmFuc2Zvcm0udmFsdWUuY29weShyLm1hdHJpeCkpfSkodCxpLG8sYSk6aS5pc1Nwcml0ZU1hdGVyaWFsPyhmdW5jdGlvbiB2KHQsZSl7bGV0IG47dC5kaWZmdXNlLnZhbHVlLmNvcHkoZS5jb2xvciksdC5vcGFjaXR5LnZhbHVlPWUub3BhY2l0eSx0LnJvdGF0aW9uLnZhbHVlPWUucm90YXRpb24sZS5tYXAmJih0Lm1hcC52YWx1ZT1lLm1hcCksZS5hbHBoYU1hcCYmKHQuYWxwaGFNYXAudmFsdWU9ZS5hbHBoYU1hcCksZS5tYXA/bj1lLm1hcDplLmFscGhhTWFwJiYobj1lLmFscGhhTWFwKSx2b2lkIDAhPT1uJiYoITA9PT1uLm1hdHJpeEF1dG9VcGRhdGUmJm4udXBkYXRlTWF0cml4KCksdC51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KG4ubWF0cml4KSl9KSh0LGkpOmkuaXNTaGFkb3dNYXRlcmlhbD8odC5jb2xvci52YWx1ZS5jb3B5KGkuY29sb3IpLHQub3BhY2l0eS52YWx1ZT1pLm9wYWNpdHkpOmkuaXNTaGFkZXJNYXRlcmlhbCYmKGkudW5pZm9ybXNOZWVkVXBkYXRlPSExKX19fWZ1bmN0aW9uIEc1dCh0PXt9KXtjb25zdCBlPXZvaWQgMCE9PXQuY2FudmFzP3QuY2FudmFzOihmdW5jdGlvbiBuKCl7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJjYW52YXMiKTtyZXR1cm4gdC5zdHlsZS5kaXNwbGF5PSJibG9jayIsdH0pKCksaT12b2lkIDAhPT10LmNvbnRleHQ/dC5jb250ZXh0Om51bGwscj12b2lkIDAhPT10LmFscGhhJiZ0LmFscGhhLG89dm9pZCAwPT09dC5kZXB0aHx8dC5kZXB0aCxhPXZvaWQgMD09PXQuc3RlbmNpbHx8dC5zdGVuY2lsLHM9dm9pZCAwIT09dC5hbnRpYWxpYXMmJnQuYW50aWFsaWFzLGw9dm9pZCAwPT09dC5wcmVtdWx0aXBsaWVkQWxwaGF8fHQucHJlbXVsdGlwbGllZEFscGhhLGM9dm9pZCAwIT09dC5wcmVzZXJ2ZURyYXdpbmdCdWZmZXImJnQucHJlc2VydmVEcmF3aW5nQnVmZmVyLHU9dm9pZCAwIT09dC5wb3dlclByZWZlcmVuY2U/dC5wb3dlclByZWZlcmVuY2U6ImRlZmF1bHQiLGg9dm9pZCAwIT09dC5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0JiZ0LmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ7bGV0IGQ9bnVsbCxwPW51bGw7Y29uc3QgZj1bXSxtPVtdO3RoaXMuZG9tRWxlbWVudD1lLHRoaXMuZGVidWc9e2NoZWNrU2hhZGVyRXJyb3JzOiEwfSx0aGlzLmF1dG9DbGVhcj0hMCx0aGlzLmF1dG9DbGVhckNvbG9yPSEwLHRoaXMuYXV0b0NsZWFyRGVwdGg9ITAsdGhpcy5hdXRvQ2xlYXJTdGVuY2lsPSEwLHRoaXMuc29ydE9iamVjdHM9ITAsdGhpcy5jbGlwcGluZ1BsYW5lcz1bXSx0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkPSExLHRoaXMuZ2FtbWFGYWN0b3I9Mix0aGlzLm91dHB1dEVuY29kaW5nPU5adCx0aGlzLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzPSExLHRoaXMudG9uZU1hcHBpbmc9MCx0aGlzLnRvbmVNYXBwaW5nRXhwb3N1cmU9MTtjb25zdCBnPXRoaXM7bGV0IF89ITEseT0wLHY9MCxiPW51bGwseD0tMSx3PW51bGw7Y29uc3QgUz1uZXcgd0p0LE09bmV3IHdKdDtsZXQgRT1udWxsLFQ9ZS53aWR0aCxDPWUuaGVpZ2h0LEE9MSxrPW51bGwsTD1udWxsO2NvbnN0IFA9bmV3IHdKdCgwLDAsVCxDKSxOPW5ldyB3SnQoMCwwLFQsQyk7bGV0IEk9ITE7Y29uc3QgUj1bXSxPPW5ldyBpMHQ7bGV0IHo9ITEsRD0hMSxCPW51bGw7Y29uc3QgSD1uZXcgclF0LEY9bmV3IENKdCxWPXtiYWNrZ3JvdW5kOm51bGwsZm9nOm51bGwsZW52aXJvbm1lbnQ6bnVsbCxvdmVycmlkZU1hdGVyaWFsOm51bGwsaXNTY2VuZTohMH07ZnVuY3Rpb24gVSgpe3JldHVybiBudWxsPT09Yj9BOjF9bGV0IGosRyxXLHEsWSxYLCQsSyxaLEosUSx0dCxldCxudCxpdCxydCxvdCxhdCxzdCxsdCxjdCx1dCxodCxkdD1pO2Z1bmN0aW9uIHB0KHQsbil7Zm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspe2NvbnN0IHI9ZS5nZXRDb250ZXh0KHRbaV0sbik7aWYobnVsbCE9PXIpcmV0dXJuIHJ9cmV0dXJuIG51bGx9dHJ5e2NvbnN0IHQ9e2FscGhhOnIsZGVwdGg6byxzdGVuY2lsOmEsYW50aWFsaWFzOnMscHJlbXVsdGlwbGllZEFscGhhOmwscHJlc2VydmVEcmF3aW5nQnVmZmVyOmMscG93ZXJQcmVmZXJlbmNlOnUsZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDpofTtpZihlLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLGd0LCExKSxlLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIixfdCwhMSksbnVsbD09PWR0KXtjb25zdCBlPVsid2ViZ2wyIiwid2ViZ2wiLCJleHBlcmltZW50YWwtd2ViZ2wiXTtpZighMD09PWcuaXNXZWJHTDFSZW5kZXJlciYmZS5zaGlmdCgpLGR0PXB0KGUsdCksbnVsbD09PWR0KXRocm93IHB0KGUpP25ldyBFcnJvcigiRXJyb3IgY3JlYXRpbmcgV2ViR0wgY29udGV4dCB3aXRoIHlvdXIgc2VsZWN0ZWQgYXR0cmlidXRlcy4iKTpuZXcgRXJyb3IoIkVycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQuIil9dm9pZCAwPT09ZHQuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0JiYoZHQuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJue3JhbmdlTWluOjEscmFuZ2VNYXg6MSxwcmVjaXNpb246MX19KX1jYXRjaCh0KXt0aHJvdyBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAiK3QubWVzc2FnZSksdH1mdW5jdGlvbiBmdCgpe2o9bmV3IFUwdChkdCksRz1uZXcgcDB0KGR0LGosdCksai5pbml0KEcpLHV0PW5ldyBENXQoZHQsaixHKSxXPW5ldyBPNXQoZHQsaixHKSxSWzBdPTEwMjkscT1uZXcgVzB0KGR0KSxZPW5ldyB4NXQsWD1uZXcgejV0KGR0LGosVyxZLEcsdXQscSksJD1uZXcgbTB0KGcpLEs9bmV3IFYwdChnKSxaPW5ldyBvMHQoZHQsRyksaHQ9bmV3IGgwdChkdCxqLFosRyksSj1uZXcgajB0KGR0LFoscSxodCksUT1uZXcgJDB0KGR0LEosWixxKSxzdD1uZXcgWDB0KGR0KSxydD1uZXcgZjB0KFkpLHR0PW5ldyBiNXQoZywkLEssaixHLGh0LHJ0KSxldD1uZXcgajV0KFkpLG50PW5ldyBFNXQoWSksaXQ9bmV3IFA1dChqLEcpLGF0PW5ldyB1MHQoZywkLFcsUSxsKSxvdD1uZXcgUjV0KGcsUSxHKSxsdD1uZXcgZDB0KGR0LGoscSxHKSxjdD1uZXcgRzB0KGR0LGoscSxHKSxxLnByb2dyYW1zPXR0LnByb2dyYW1zLGcuY2FwYWJpbGl0aWVzPUcsZy5leHRlbnNpb25zPWosZy5wcm9wZXJ0aWVzPVksZy5yZW5kZXJMaXN0cz1udCxnLnNoYWRvd01hcD1vdCxnLnN0YXRlPVcsZy5pbmZvPXF9ZnQoKTtjb25zdCBtdD1uZXcgVTV0KGcsZHQpO2Z1bmN0aW9uIGd0KHQpe3QucHJldmVudERlZmF1bHQoKSxjb25zb2xlLmxvZygiVEhSRUUuV2ViR0xSZW5kZXJlcjogQ29udGV4dCBMb3N0LiIpLF89ITB9ZnVuY3Rpb24gX3QoKXtjb25zb2xlLmxvZygiVEhSRUUuV2ViR0xSZW5kZXJlcjogQ29udGV4dCBSZXN0b3JlZC4iKSxfPSExO2NvbnN0IHQ9cS5hdXRvUmVzZXQsZT1vdC5lbmFibGVkLG49b3QuYXV0b1VwZGF0ZSxpPW90Lm5lZWRzVXBkYXRlLHI9b3QudHlwZTtmdCgpLHEuYXV0b1Jlc2V0PXQsb3QuZW5hYmxlZD1lLG90LmF1dG9VcGRhdGU9bixvdC5uZWVkc1VwZGF0ZT1pLG90LnR5cGU9cn1mdW5jdGlvbiB5dCh0KXtjb25zdCBlPXQudGFyZ2V0O2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIseXQpLChmdW5jdGlvbiBuKHQpeyhmdW5jdGlvbiBlKHQpe2NvbnN0IGU9WS5nZXQodCkucHJvZ3JhbXM7dm9pZCAwIT09ZSYmZS5mb3JFYWNoKChmdW5jdGlvbih0KXt0dC5yZWxlYXNlUHJvZ3JhbSh0KX0pKX0pKHQpLFkucmVtb3ZlKHQpfSkoZSl9dGhpcy54cj1tdCx0aGlzLmdldENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gZHR9LHRoaXMuZ2V0Q29udGV4dEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gZHQuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKX0sdGhpcy5mb3JjZUNvbnRleHRMb3NzPWZ1bmN0aW9uKCl7Y29uc3QgdD1qLmdldCgiV0VCR0xfbG9zZV9jb250ZXh0Iik7dCYmdC5sb3NlQ29udGV4dCgpfSx0aGlzLmZvcmNlQ29udGV4dFJlc3RvcmU9ZnVuY3Rpb24oKXtjb25zdCB0PWouZ2V0KCJXRUJHTF9sb3NlX2NvbnRleHQiKTt0JiZ0LnJlc3RvcmVDb250ZXh0KCl9LHRoaXMuZ2V0UGl4ZWxSYXRpbz1mdW5jdGlvbigpe3JldHVybiBBfSx0aGlzLnNldFBpeGVsUmF0aW89ZnVuY3Rpb24odCl7dm9pZCAwIT09dCYmKEE9dCx0aGlzLnNldFNpemUoVCxDLCExKSl9LHRoaXMuZ2V0U2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5zZXQoVCxDKX0sdGhpcy5zZXRTaXplPWZ1bmN0aW9uKHQsbixpKXttdC5pc1ByZXNlbnRpbmc/Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDYW4ndCBjaGFuZ2Ugc2l6ZSB3aGlsZSBWUiBkZXZpY2UgaXMgcHJlc2VudGluZy4iKTooVD10LEM9bixlLndpZHRoPU1hdGguZmxvb3IodCpBKSxlLmhlaWdodD1NYXRoLmZsb29yKG4qQSksITEhPT1pJiYoZS5zdHlsZS53aWR0aD10KyJweCIsZS5zdHlsZS5oZWlnaHQ9bisicHgiKSx0aGlzLnNldFZpZXdwb3J0KDAsMCx0LG4pKX0sdGhpcy5nZXREcmF3aW5nQnVmZmVyU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5zZXQoVCpBLEMqQSkuZmxvb3IoKX0sdGhpcy5zZXREcmF3aW5nQnVmZmVyU2l6ZT1mdW5jdGlvbih0LG4saSl7VD10LEM9bixBPWksZS53aWR0aD1NYXRoLmZsb29yKHQqaSksZS5oZWlnaHQ9TWF0aC5mbG9vcihuKmkpLHRoaXMuc2V0Vmlld3BvcnQoMCwwLHQsbil9LHRoaXMuZ2V0Q3VycmVudFZpZXdwb3J0PWZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoUyl9LHRoaXMuZ2V0Vmlld3BvcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weShQKX0sdGhpcy5zZXRWaWV3cG9ydD1mdW5jdGlvbih0LGUsbixpKXt0LmlzVmVjdG9yND9QLnNldCh0LngsdC55LHQueix0LncpOlAuc2V0KHQsZSxuLGkpLFcudmlld3BvcnQoUy5jb3B5KFApLm11bHRpcGx5U2NhbGFyKEEpLmZsb29yKCkpfSx0aGlzLmdldFNjaXNzb3I9ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weShOKX0sdGhpcy5zZXRTY2lzc29yPWZ1bmN0aW9uKHQsZSxuLGkpe3QuaXNWZWN0b3I0P04uc2V0KHQueCx0LnksdC56LHQudyk6Ti5zZXQodCxlLG4saSksVy5zY2lzc29yKE0uY29weShOKS5tdWx0aXBseVNjYWxhcihBKS5mbG9vcigpKX0sdGhpcy5nZXRTY2lzc29yVGVzdD1mdW5jdGlvbigpe3JldHVybiBJfSx0aGlzLnNldFNjaXNzb3JUZXN0PWZ1bmN0aW9uKHQpe1cuc2V0U2Npc3NvclRlc3QoST10KX0sdGhpcy5zZXRPcGFxdWVTb3J0PWZ1bmN0aW9uKHQpe2s9dH0sdGhpcy5zZXRUcmFuc3BhcmVudFNvcnQ9ZnVuY3Rpb24odCl7TD10fSx0aGlzLmdldENsZWFyQ29sb3I9ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weShhdC5nZXRDbGVhckNvbG9yKCkpfSx0aGlzLnNldENsZWFyQ29sb3I9ZnVuY3Rpb24oKXthdC5zZXRDbGVhckNvbG9yLmFwcGx5KGF0LGFyZ3VtZW50cyl9LHRoaXMuZ2V0Q2xlYXJBbHBoYT1mdW5jdGlvbigpe3JldHVybiBhdC5nZXRDbGVhckFscGhhKCl9LHRoaXMuc2V0Q2xlYXJBbHBoYT1mdW5jdGlvbigpe2F0LnNldENsZWFyQWxwaGEuYXBwbHkoYXQsYXJndW1lbnRzKX0sdGhpcy5jbGVhcj1mdW5jdGlvbih0LGUsbil7bGV0IGk9MDsodm9pZCAwPT09dHx8dCkmJihpfD0xNjM4NCksKHZvaWQgMD09PWV8fGUpJiYoaXw9MjU2KSwodm9pZCAwPT09bnx8bikmJihpfD0xMDI0KSxkdC5jbGVhcihpKX0sdGhpcy5jbGVhckNvbG9yPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMCwhMSwhMSl9LHRoaXMuY2xlYXJEZXB0aD1mdW5jdGlvbigpe3RoaXMuY2xlYXIoITEsITAsITEpfSx0aGlzLmNsZWFyU3RlbmNpbD1mdW5jdGlvbigpe3RoaXMuY2xlYXIoITEsITEsITApfSx0aGlzLmRpc3Bvc2U9ZnVuY3Rpb24oKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLGd0LCExKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIixfdCwhMSksbnQuZGlzcG9zZSgpLGl0LmRpc3Bvc2UoKSxZLmRpc3Bvc2UoKSwkLmRpc3Bvc2UoKSxLLmRpc3Bvc2UoKSxRLmRpc3Bvc2UoKSxodC5kaXNwb3NlKCksbXQuZGlzcG9zZSgpLG10LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlc3Npb25zdGFydCIsYnQpLG10LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlc3Npb25lbmQiLHh0KSxCJiYoQi5kaXNwb3NlKCksQj1udWxsKSx3dC5zdG9wKCl9LHRoaXMucmVuZGVyQnVmZmVySW1tZWRpYXRlPWZ1bmN0aW9uKHQsZSl7aHQuaW5pdEF0dHJpYnV0ZXMoKTtjb25zdCBuPVkuZ2V0KHQpO3QuaGFzUG9zaXRpb25zJiYhbi5wb3NpdGlvbiYmKG4ucG9zaXRpb249ZHQuY3JlYXRlQnVmZmVyKCkpLHQuaGFzTm9ybWFscyYmIW4ubm9ybWFsJiYobi5ub3JtYWw9ZHQuY3JlYXRlQnVmZmVyKCkpLHQuaGFzVXZzJiYhbi51diYmKG4udXY9ZHQuY3JlYXRlQnVmZmVyKCkpLHQuaGFzQ29sb3JzJiYhbi5jb2xvciYmKG4uY29sb3I9ZHQuY3JlYXRlQnVmZmVyKCkpO2NvbnN0IGk9ZS5nZXRBdHRyaWJ1dGVzKCk7dC5oYXNQb3NpdGlvbnMmJihkdC5iaW5kQnVmZmVyKDM0OTYyLG4ucG9zaXRpb24pLGR0LmJ1ZmZlckRhdGEoMzQ5NjIsdC5wb3NpdGlvbkFycmF5LDM1MDQ4KSxodC5lbmFibGVBdHRyaWJ1dGUoaS5wb3NpdGlvbiksZHQudmVydGV4QXR0cmliUG9pbnRlcihpLnBvc2l0aW9uLDMsNTEyNiwhMSwwLDApKSx0Lmhhc05vcm1hbHMmJihkdC5iaW5kQnVmZmVyKDM0OTYyLG4ubm9ybWFsKSxkdC5idWZmZXJEYXRhKDM0OTYyLHQubm9ybWFsQXJyYXksMzUwNDgpLGh0LmVuYWJsZUF0dHJpYnV0ZShpLm5vcm1hbCksZHQudmVydGV4QXR0cmliUG9pbnRlcihpLm5vcm1hbCwzLDUxMjYsITEsMCwwKSksdC5oYXNVdnMmJihkdC5iaW5kQnVmZmVyKDM0OTYyLG4udXYpLGR0LmJ1ZmZlckRhdGEoMzQ5NjIsdC51dkFycmF5LDM1MDQ4KSxodC5lbmFibGVBdHRyaWJ1dGUoaS51diksZHQudmVydGV4QXR0cmliUG9pbnRlcihpLnV2LDIsNTEyNiwhMSwwLDApKSx0Lmhhc0NvbG9ycyYmKGR0LmJpbmRCdWZmZXIoMzQ5NjIsbi5jb2xvciksZHQuYnVmZmVyRGF0YSgzNDk2Mix0LmNvbG9yQXJyYXksMzUwNDgpLGh0LmVuYWJsZUF0dHJpYnV0ZShpLmNvbG9yKSxkdC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGkuY29sb3IsMyw1MTI2LCExLDAsMCkpLGh0LmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCksZHQuZHJhd0FycmF5cyg0LDAsdC5jb3VudCksdC5jb3VudD0wfSx0aGlzLnJlbmRlckJ1ZmZlckRpcmVjdD1mdW5jdGlvbih0LGUsbixpLHIsbyl7bnVsbD09PWUmJihlPVYpO2NvbnN0IGE9ci5pc01lc2gmJnIubWF0cml4V29ybGQuZGV0ZXJtaW5hbnQoKTwwLHM9QXQodCxlLGkscik7Vy5zZXRNYXRlcmlhbChpLGEpO2xldCBsPW4uaW5kZXg7Y29uc3QgYz1uLmF0dHJpYnV0ZXMucG9zaXRpb247aWYobnVsbD09PWwpe2lmKHZvaWQgMD09PWN8fDA9PT1jLmNvdW50KXJldHVybn1lbHNlIGlmKDA9PT1sLmNvdW50KXJldHVybjtsZXQgdSxoPTE7ITA9PT1pLndpcmVmcmFtZSYmKGw9Si5nZXRXaXJlZnJhbWVBdHRyaWJ1dGUobiksaD0yKSx2b2lkIDA9PT1uLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiYmdm9pZCAwPT09bi5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsfHxzdC51cGRhdGUocixuLGkscyksaHQuc2V0dXAocixpLHMsbixsKTtsZXQgZD1sdDtudWxsIT09bCYmKHU9Wi5nZXQobCksZD1jdCxkLnNldEluZGV4KHUpKTtjb25zdCBwPW51bGwhPT1sP2wuY291bnQ6Yy5jb3VudCxmPW4uZHJhd1JhbmdlLnN0YXJ0KmgsbT1uLmRyYXdSYW5nZS5jb3VudCpoLGc9bnVsbCE9PW8/by5zdGFydCpoOjAsXz1udWxsIT09bz9vLmNvdW50Kmg6MS8wLHk9TWF0aC5tYXgoZixnKSx2PU1hdGgubWluKHAsZittLGcrXyktMSxiPU1hdGgubWF4KDAsdi15KzEpO2lmKDAhPT1iKXtpZihyLmlzTWVzaCkhMD09PWkud2lyZWZyYW1lPyhXLnNldExpbmVXaWR0aChpLndpcmVmcmFtZUxpbmV3aWR0aCpVKCkpLGQuc2V0TW9kZSgxKSk6ZC5zZXRNb2RlKDQpO2Vsc2UgaWYoci5pc0xpbmUpe2xldCB0PWkubGluZXdpZHRoO3ZvaWQgMD09PXQmJih0PTEpLFcuc2V0TGluZVdpZHRoKHQqVSgpKSxkLnNldE1vZGUoci5pc0xpbmVTZWdtZW50cz8xOnIuaXNMaW5lTG9vcD8yOjMpfWVsc2Ugci5pc1BvaW50cz9kLnNldE1vZGUoMCk6ci5pc1Nwcml0ZSYmZC5zZXRNb2RlKDQpO2lmKHIuaXNJbnN0YW5jZWRNZXNoKWQucmVuZGVySW5zdGFuY2VzKHksYixyLmNvdW50KTtlbHNlIGlmKG4uaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSl7Y29uc3QgdD1NYXRoLm1pbihuLmluc3RhbmNlQ291bnQsbi5fbWF4SW5zdGFuY2VDb3VudCk7ZC5yZW5kZXJJbnN0YW5jZXMoeSxiLHQpfWVsc2UgZC5yZW5kZXIoeSxiKX19LHRoaXMuY29tcGlsZT1mdW5jdGlvbih0LGUpe3A9aXQuZ2V0KHQpLHAuaW5pdCgpLG0ucHVzaChwKSx0LnRyYXZlcnNlVmlzaWJsZSgoZnVuY3Rpb24odCl7dC5pc0xpZ2h0JiZ0LmxheWVycy50ZXN0KGUubGF5ZXJzKSYmKHAucHVzaExpZ2h0KHQpLHQuY2FzdFNoYWRvdyYmcC5wdXNoU2hhZG93KHQpKX0pKSxwLnNldHVwTGlnaHRzKCksdC50cmF2ZXJzZSgoZnVuY3Rpb24oZSl7Y29uc3Qgbj1lLm1hdGVyaWFsO2lmKG4paWYoQXJyYXkuaXNBcnJheShuKSlmb3IobGV0IGk9MDtpPG4ubGVuZ3RoO2krKylUdChuW2ldLHQsZSk7ZWxzZSBUdChuLHQsZSl9KSksbS5wb3AoKSxwPW51bGx9O2xldCB2dD1udWxsO2Z1bmN0aW9uIGJ0KCl7d3Quc3RvcCgpfWZ1bmN0aW9uIHh0KCl7d3Quc3RhcnQoKX1jb25zdCB3dD1uZXcgcjB0O2Z1bmN0aW9uIFN0KHQsZSxuLGkpe2lmKCExPT09dC52aXNpYmxlKXJldHVybjtpZih0LmxheWVycy50ZXN0KGUubGF5ZXJzKSlpZih0LmlzR3JvdXApbj10LnJlbmRlck9yZGVyO2Vsc2UgaWYodC5pc0xPRCkhMD09PXQuYXV0b1VwZGF0ZSYmdC51cGRhdGUoZSk7ZWxzZSBpZih0LmlzTGlnaHQpcC5wdXNoTGlnaHQodCksdC5jYXN0U2hhZG93JiZwLnB1c2hTaGFkb3codCk7ZWxzZSBpZih0LmlzU3ByaXRlKXtpZighdC5mcnVzdHVtQ3VsbGVkfHxPLmludGVyc2VjdHNTcHJpdGUodCkpe2kmJkYuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQubWF0cml4V29ybGQpLmFwcGx5TWF0cml4NChIKTtjb25zdCBlPVEudXBkYXRlKHQpLHI9dC5tYXRlcmlhbDtyLnZpc2libGUmJmQucHVzaCh0LGUscixuLEYueixudWxsKX19ZWxzZSBpZih0LmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0KWkmJkYuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQubWF0cml4V29ybGQpLmFwcGx5TWF0cml4NChIKSxkLnB1c2godCxudWxsLHQubWF0ZXJpYWwsbixGLnosbnVsbCk7ZWxzZSBpZigodC5pc01lc2h8fHQuaXNMaW5lfHx0LmlzUG9pbnRzKSYmKHQuaXNTa2lubmVkTWVzaCYmdC5za2VsZXRvbi5mcmFtZSE9PXEucmVuZGVyLmZyYW1lJiYodC5za2VsZXRvbi51cGRhdGUoKSx0LnNrZWxldG9uLmZyYW1lPXEucmVuZGVyLmZyYW1lKSwhdC5mcnVzdHVtQ3VsbGVkfHxPLmludGVyc2VjdHNPYmplY3QodCkpKXtpJiZGLnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKS5hcHBseU1hdHJpeDQoSCk7Y29uc3QgZT1RLnVwZGF0ZSh0KSxyPXQubWF0ZXJpYWw7aWYoQXJyYXkuaXNBcnJheShyKSl7Y29uc3QgaT1lLmdyb3Vwcztmb3IobGV0IG89MCxhPWkubGVuZ3RoO288YTtvKyspe2NvbnN0IGE9aVtvXSxzPXJbYS5tYXRlcmlhbEluZGV4XTtzJiZzLnZpc2libGUmJmQucHVzaCh0LGUscyxuLEYueixhKX19ZWxzZSByLnZpc2libGUmJmQucHVzaCh0LGUscixuLEYueixudWxsKX1jb25zdCByPXQuY2hpbGRyZW47Zm9yKGxldCB0PTAsbz1yLmxlbmd0aDt0PG87dCsrKVN0KHJbdF0sZSxuLGkpfWZ1bmN0aW9uIE10KHQsZSxuKXtjb25zdCBpPSEwPT09ZS5pc1NjZW5lP2Uub3ZlcnJpZGVNYXRlcmlhbDpudWxsO2lmKG4uaXNBcnJheUNhbWVyYSl7Y29uc3Qgcj1uLmNhbWVyYXM7Zm9yKGxldCBuPTAsbz1yLmxlbmd0aDtuPG87bisrKXtjb25zdCBvPXJbbl07Vy52aWV3cG9ydChTLmNvcHkoby52aWV3cG9ydCkpLHAuc2V0dXBMaWdodHNWaWV3KG8pO2ZvcihsZXQgbj0wLHI9dC5sZW5ndGg7bjxyO24rKyl7Y29uc3Qgcj10W25dLGE9ci5vYmplY3Qscz1yLmdlb21ldHJ5LGw9bnVsbD09PWk/ci5tYXRlcmlhbDppLGM9ci5ncm91cDthLmxheWVycy50ZXN0KG8ubGF5ZXJzKSYmRXQoYSxlLG8scyxsLGMpfX19ZWxzZSBmb3IobGV0IHI9MCxvPXQubGVuZ3RoO3I8bztyKyspe2NvbnN0IG89dFtyXTtFdChvLm9iamVjdCxlLG4sby5nZW9tZXRyeSxudWxsPT09aT9vLm1hdGVyaWFsOmksby5ncm91cCl9fWZ1bmN0aW9uIEV0KHQsZSxuLGkscixvKXtpZih0Lm9uQmVmb3JlUmVuZGVyKGcsZSxuLGkscixvKSx0Lm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKG4ubWF0cml4V29ybGRJbnZlcnNlLHQubWF0cml4V29ybGQpLHQubm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCh0Lm1vZGVsVmlld01hdHJpeCksdC5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdCl7Y29uc3QgaT1BdChuLGUscix0KTtXLnNldE1hdGVyaWFsKHIpLGh0LnJlc2V0KCksKGZ1bmN0aW9uIGEodCxlKXt0LnJlbmRlcigoZnVuY3Rpb24odCl7Zy5yZW5kZXJCdWZmZXJJbW1lZGlhdGUodCxlKX0pKX0pKHQsaSl9ZWxzZSEwPT09ci50cmFuc3BhcmVudCYmMj09PXIuc2lkZT8oci5zaWRlPTEsci5uZWVkc1VwZGF0ZT0hMCxnLnJlbmRlckJ1ZmZlckRpcmVjdChuLGUsaSxyLHQsbyksci5zaWRlPTAsci5uZWVkc1VwZGF0ZT0hMCxnLnJlbmRlckJ1ZmZlckRpcmVjdChuLGUsaSxyLHQsbyksci5zaWRlPTIpOmcucmVuZGVyQnVmZmVyRGlyZWN0KG4sZSxpLHIsdCxvKTt0Lm9uQWZ0ZXJSZW5kZXIoZyxlLG4saSxyLG8pfWZ1bmN0aW9uIFR0KHQsZSxuKXshMCE9PWUuaXNTY2VuZSYmKGU9Vik7Y29uc3QgaT1ZLmdldCh0KSxyPXAuc3RhdGUubGlnaHRzLG89ci5zdGF0ZS52ZXJzaW9uLGE9dHQuZ2V0UGFyYW1ldGVycyh0LHIuc3RhdGUscC5zdGF0ZS5zaGFkb3dzQXJyYXksZSxuKSxzPXR0LmdldFByb2dyYW1DYWNoZUtleShhKTtsZXQgbD1pLnByb2dyYW1zO2kuZW52aXJvbm1lbnQ9dC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsP2UuZW52aXJvbm1lbnQ6bnVsbCxpLmZvZz1lLmZvZyxpLmVudk1hcD0odC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsP0s6JCkuZ2V0KHQuZW52TWFwfHxpLmVudmlyb25tZW50KSx2b2lkIDA9PT1sJiYodC5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIix5dCksbD1uZXcgTWFwLGkucHJvZ3JhbXM9bCk7bGV0IGM9bC5nZXQocyk7aWYodm9pZCAwIT09Yyl7aWYoaS5jdXJyZW50UHJvZ3JhbT09PWMmJmkubGlnaHRzU3RhdGVWZXJzaW9uPT09bylyZXR1cm4gQ3QodCxhKSxjfWVsc2UgYS51bmlmb3Jtcz10dC5nZXRVbmlmb3Jtcyh0KSx0Lm9uQnVpbGQoYSxnKSx0Lm9uQmVmb3JlQ29tcGlsZShhLGcpLGM9dHQuYWNxdWlyZVByb2dyYW0oYSxzKSxsLnNldChzLGMpLGkudW5pZm9ybXM9YS51bmlmb3Jtcztjb25zdCB1PWkudW5pZm9ybXM7KHQuaXNTaGFkZXJNYXRlcmlhbHx8dC5pc1Jhd1NoYWRlck1hdGVyaWFsKSYmITAhPT10LmNsaXBwaW5nfHwodS5jbGlwcGluZ1BsYW5lcz1ydC51bmlmb3JtKSxDdCh0LGEpLGkubmVlZHNMaWdodHM9KGZ1bmN0aW9uIGgodCl7cmV0dXJuIHQuaXNNZXNoTGFtYmVydE1hdGVyaWFsfHx0LmlzTWVzaFRvb25NYXRlcmlhbHx8dC5pc01lc2hQaG9uZ01hdGVyaWFsfHx0LmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWx8fHQuaXNTaGFkb3dNYXRlcmlhbHx8dC5pc1NoYWRlck1hdGVyaWFsJiYhMD09PXQubGlnaHRzfSkodCksaS5saWdodHNTdGF0ZVZlcnNpb249byxpLm5lZWRzTGlnaHRzJiYodS5hbWJpZW50TGlnaHRDb2xvci52YWx1ZT1yLnN0YXRlLmFtYmllbnQsdS5saWdodFByb2JlLnZhbHVlPXIuc3RhdGUucHJvYmUsdS5kaXJlY3Rpb25hbExpZ2h0cy52YWx1ZT1yLnN0YXRlLmRpcmVjdGlvbmFsLHUuZGlyZWN0aW9uYWxMaWdodFNoYWRvd3MudmFsdWU9ci5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvdyx1LnNwb3RMaWdodHMudmFsdWU9ci5zdGF0ZS5zcG90LHUuc3BvdExpZ2h0U2hhZG93cy52YWx1ZT1yLnN0YXRlLnNwb3RTaGFkb3csdS5yZWN0QXJlYUxpZ2h0cy52YWx1ZT1yLnN0YXRlLnJlY3RBcmVhLHUubHRjXzEudmFsdWU9ci5zdGF0ZS5yZWN0QXJlYUxUQzEsdS5sdGNfMi52YWx1ZT1yLnN0YXRlLnJlY3RBcmVhTFRDMix1LnBvaW50TGlnaHRzLnZhbHVlPXIuc3RhdGUucG9pbnQsdS5wb2ludExpZ2h0U2hhZG93cy52YWx1ZT1yLnN0YXRlLnBvaW50U2hhZG93LHUuaGVtaXNwaGVyZUxpZ2h0cy52YWx1ZT1yLnN0YXRlLmhlbWksdS5kaXJlY3Rpb25hbFNoYWRvd01hcC52YWx1ZT1yLnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWFwLHUuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgudmFsdWU9ci5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeCx1LnNwb3RTaGFkb3dNYXAudmFsdWU9ci5zdGF0ZS5zcG90U2hhZG93TWFwLHUuc3BvdFNoYWRvd01hdHJpeC52YWx1ZT1yLnN0YXRlLnNwb3RTaGFkb3dNYXRyaXgsdS5wb2ludFNoYWRvd01hcC52YWx1ZT1yLnN0YXRlLnBvaW50U2hhZG93TWFwLHUucG9pbnRTaGFkb3dNYXRyaXgudmFsdWU9ci5zdGF0ZS5wb2ludFNoYWRvd01hdHJpeCk7Y29uc3QgZD1jLmdldFVuaWZvcm1zKCksZj1RMnQuc2VxV2l0aFZhbHVlKGQuc2VxLHUpO3JldHVybiBpLmN1cnJlbnRQcm9ncmFtPWMsaS51bmlmb3Jtc0xpc3Q9ZixjfWZ1bmN0aW9uIEN0KHQsZSl7Y29uc3Qgbj1ZLmdldCh0KTtuLm91dHB1dEVuY29kaW5nPWUub3V0cHV0RW5jb2Rpbmcsbi5pbnN0YW5jaW5nPWUuaW5zdGFuY2luZyxuLnNraW5uaW5nPWUuc2tpbm5pbmcsbi5tb3JwaFRhcmdldHM9ZS5tb3JwaFRhcmdldHMsbi5tb3JwaE5vcm1hbHM9ZS5tb3JwaE5vcm1hbHMsbi5udW1DbGlwcGluZ1BsYW5lcz1lLm51bUNsaXBwaW5nUGxhbmVzLG4ubnVtSW50ZXJzZWN0aW9uPWUubnVtQ2xpcEludGVyc2VjdGlvbixuLnZlcnRleEFscGhhcz1lLnZlcnRleEFscGhhcyxuLnZlcnRleFRhbmdlbnRzPWUudmVydGV4VGFuZ2VudHN9ZnVuY3Rpb24gQXQodCxlLG4saSl7ITAhPT1lLmlzU2NlbmUmJihlPVYpLFgucmVzZXRUZXh0dXJlVW5pdHMoKTtjb25zdCByPWUuZm9nLG89bnVsbD09PWI/Zy5vdXRwdXRFbmNvZGluZzpiLnRleHR1cmUuZW5jb2RpbmcsYT0obi5pc01lc2hTdGFuZGFyZE1hdGVyaWFsP0s6JCkuZ2V0KG4uZW52TWFwfHwobi5pc01lc2hTdGFuZGFyZE1hdGVyaWFsP2UuZW52aXJvbm1lbnQ6bnVsbCkpLHM9ITA9PT1uLnZlcnRleENvbG9ycyYmISFpLmdlb21ldHJ5JiYhIWkuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvciYmND09PWkuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvci5pdGVtU2l6ZSxsPSEhaS5nZW9tZXRyeSYmISFpLmdlb21ldHJ5LmF0dHJpYnV0ZXMudGFuZ2VudCxjPSEhaS5nZW9tZXRyeSYmISFpLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbix1PSEhaS5nZW9tZXRyeSYmISFpLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5ub3JtYWwsaD1ZLmdldChuKSxkPXAuc3RhdGUubGlnaHRzOyEwIT09enx8ITAhPT1EJiZ0PT09d3x8cnQuc2V0U3RhdGUobix0LHQ9PT13JiZuLmlkPT09eCk7bGV0IGY9ITE7bi52ZXJzaW9uPT09aC5fX3ZlcnNpb24/aC5uZWVkc0xpZ2h0cyYmaC5saWdodHNTdGF0ZVZlcnNpb24hPT1kLnN0YXRlLnZlcnNpb258fGgub3V0cHV0RW5jb2RpbmchPT1vfHxpLmlzSW5zdGFuY2VkTWVzaCYmITE9PT1oLmluc3RhbmNpbmc/Zj0hMDppLmlzSW5zdGFuY2VkTWVzaHx8ITAhPT1oLmluc3RhbmNpbmc/aS5pc1NraW5uZWRNZXNoJiYhMT09PWguc2tpbm5pbmc/Zj0hMDppLmlzU2tpbm5lZE1lc2h8fCEwIT09aC5za2lubmluZz9oLmVudk1hcCE9PWF8fG4uZm9nJiZoLmZvZyE9PXI/Zj0hMDp2b2lkIDA9PT1oLm51bUNsaXBwaW5nUGxhbmVzfHxoLm51bUNsaXBwaW5nUGxhbmVzPT09cnQubnVtUGxhbmVzJiZoLm51bUludGVyc2VjdGlvbj09PXJ0Lm51bUludGVyc2VjdGlvbj8oaC52ZXJ0ZXhBbHBoYXMhPT1zfHxoLnZlcnRleFRhbmdlbnRzIT09bHx8aC5tb3JwaFRhcmdldHMhPT1jfHxoLm1vcnBoTm9ybWFscyE9PXUpJiYoZj0hMCk6Zj0hMDpmPSEwOmY9ITA6KGY9ITAsaC5fX3ZlcnNpb249bi52ZXJzaW9uKTtsZXQgbT1oLmN1cnJlbnRQcm9ncmFtOyEwPT09ZiYmKG09VHQobixlLGkpKTtsZXQgXz0hMSx5PSExLHY9ITE7Y29uc3QgUz1tLmdldFVuaWZvcm1zKCksTT1oLnVuaWZvcm1zO2lmKFcudXNlUHJvZ3JhbShtLnByb2dyYW0pJiYoXz0hMCx5PSEwLHY9ITApLG4uaWQhPT14JiYoeD1uLmlkLHk9ITApLF98fHchPT10KXtpZihTLnNldFZhbHVlKGR0LCJwcm9qZWN0aW9uTWF0cml4Iix0LnByb2plY3Rpb25NYXRyaXgpLEcubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciYmUy5zZXRWYWx1ZShkdCwibG9nRGVwdGhCdWZGQyIsMi8oTWF0aC5sb2codC5mYXIrMSkvTWF0aC5MTjIpKSx3IT09dCYmKHc9dCx5PSEwLHY9ITApLG4uaXNTaGFkZXJNYXRlcmlhbHx8bi5pc01lc2hQaG9uZ01hdGVyaWFsfHxuLmlzTWVzaFRvb25NYXRlcmlhbHx8bi5pc01lc2hTdGFuZGFyZE1hdGVyaWFsfHxuLmVudk1hcCl7Y29uc3QgZT1TLm1hcC5jYW1lcmFQb3NpdGlvbjt2b2lkIDAhPT1lJiZlLnNldFZhbHVlKGR0LEYuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQubWF0cml4V29ybGQpKX0obi5pc01lc2hQaG9uZ01hdGVyaWFsfHxuLmlzTWVzaFRvb25NYXRlcmlhbHx8bi5pc01lc2hMYW1iZXJ0TWF0ZXJpYWx8fG4uaXNNZXNoQmFzaWNNYXRlcmlhbHx8bi5pc01lc2hTdGFuZGFyZE1hdGVyaWFsfHxuLmlzU2hhZGVyTWF0ZXJpYWwpJiZTLnNldFZhbHVlKGR0LCJpc09ydGhvZ3JhcGhpYyIsITA9PT10LmlzT3J0aG9ncmFwaGljQ2FtZXJhKSwobi5pc01lc2hQaG9uZ01hdGVyaWFsfHxuLmlzTWVzaFRvb25NYXRlcmlhbHx8bi5pc01lc2hMYW1iZXJ0TWF0ZXJpYWx8fG4uaXNNZXNoQmFzaWNNYXRlcmlhbHx8bi5pc01lc2hTdGFuZGFyZE1hdGVyaWFsfHxuLmlzU2hhZGVyTWF0ZXJpYWx8fG4uaXNTaGFkb3dNYXRlcmlhbHx8aS5pc1NraW5uZWRNZXNoKSYmUy5zZXRWYWx1ZShkdCwidmlld01hdHJpeCIsdC5tYXRyaXhXb3JsZEludmVyc2UpfWlmKGkuaXNTa2lubmVkTWVzaCl7Uy5zZXRPcHRpb25hbChkdCxpLCJiaW5kTWF0cml4IiksUy5zZXRPcHRpb25hbChkdCxpLCJiaW5kTWF0cml4SW52ZXJzZSIpO2NvbnN0IHQ9aS5za2VsZXRvbjt0JiYoRy5mbG9hdFZlcnRleFRleHR1cmVzPyhudWxsPT09dC5ib25lVGV4dHVyZSYmdC5jb21wdXRlQm9uZVRleHR1cmUoKSxTLnNldFZhbHVlKGR0LCJib25lVGV4dHVyZSIsdC5ib25lVGV4dHVyZSxYKSxTLnNldFZhbHVlKGR0LCJib25lVGV4dHVyZVNpemUiLHQuYm9uZVRleHR1cmVTaXplKSk6Uy5zZXRPcHRpb25hbChkdCx0LCJib25lTWF0cmljZXMiKSl9cmV0dXJuKHl8fGgucmVjZWl2ZVNoYWRvdyE9PWkucmVjZWl2ZVNoYWRvdykmJihoLnJlY2VpdmVTaGFkb3c9aS5yZWNlaXZlU2hhZG93LFMuc2V0VmFsdWUoZHQsInJlY2VpdmVTaGFkb3ciLGkucmVjZWl2ZVNoYWRvdykpLHkmJihTLnNldFZhbHVlKGR0LCJ0b25lTWFwcGluZ0V4cG9zdXJlIixnLnRvbmVNYXBwaW5nRXhwb3N1cmUpLGgubmVlZHNMaWdodHMmJihmdW5jdGlvbiBFKHQsZSl7dC5hbWJpZW50TGlnaHRDb2xvci5uZWVkc1VwZGF0ZT1lLHQubGlnaHRQcm9iZS5uZWVkc1VwZGF0ZT1lLHQuZGlyZWN0aW9uYWxMaWdodHMubmVlZHNVcGRhdGU9ZSx0LmRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzLm5lZWRzVXBkYXRlPWUsdC5wb2ludExpZ2h0cy5uZWVkc1VwZGF0ZT1lLHQucG9pbnRMaWdodFNoYWRvd3MubmVlZHNVcGRhdGU9ZSx0LnNwb3RMaWdodHMubmVlZHNVcGRhdGU9ZSx0LnNwb3RMaWdodFNoYWRvd3MubmVlZHNVcGRhdGU9ZSx0LnJlY3RBcmVhTGlnaHRzLm5lZWRzVXBkYXRlPWUsdC5oZW1pc3BoZXJlTGlnaHRzLm5lZWRzVXBkYXRlPWV9KShNLHYpLHImJm4uZm9nJiZldC5yZWZyZXNoRm9nVW5pZm9ybXMoTSxyKSxldC5yZWZyZXNoTWF0ZXJpYWxVbmlmb3JtcyhNLG4sQSxDLEIpLFEydC51cGxvYWQoZHQsaC51bmlmb3Jtc0xpc3QsTSxYKSksbi5pc1NoYWRlck1hdGVyaWFsJiYhMD09PW4udW5pZm9ybXNOZWVkVXBkYXRlJiYoUTJ0LnVwbG9hZChkdCxoLnVuaWZvcm1zTGlzdCxNLFgpLG4udW5pZm9ybXNOZWVkVXBkYXRlPSExKSxuLmlzU3ByaXRlTWF0ZXJpYWwmJlMuc2V0VmFsdWUoZHQsImNlbnRlciIsaS5jZW50ZXIpLFMuc2V0VmFsdWUoZHQsIm1vZGVsVmlld01hdHJpeCIsaS5tb2RlbFZpZXdNYXRyaXgpLFMuc2V0VmFsdWUoZHQsIm5vcm1hbE1hdHJpeCIsaS5ub3JtYWxNYXRyaXgpLFMuc2V0VmFsdWUoZHQsIm1vZGVsTWF0cml4IixpLm1hdHJpeFdvcmxkKSxtfXd0LnNldEFuaW1hdGlvbkxvb3AoKGZ1bmN0aW9uIGt0KHQpe3Z0JiZ2dCh0KX0pKSwidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd3Quc2V0Q29udGV4dCh3aW5kb3cpLHRoaXMuc2V0QW5pbWF0aW9uTG9vcD1mdW5jdGlvbih0KXt2dD10LG10LnNldEFuaW1hdGlvbkxvb3AodCksbnVsbD09PXQ/d3Quc3RvcCgpOnd0LnN0YXJ0KCl9LG10LmFkZEV2ZW50TGlzdGVuZXIoInNlc3Npb25zdGFydCIsYnQpLG10LmFkZEV2ZW50TGlzdGVuZXIoInNlc3Npb25lbmQiLHh0KSx0aGlzLnJlbmRlcj1mdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PWUmJiEwIT09ZS5pc0NhbWVyYSlyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlbmRlcjogY2FtZXJhIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5DYW1lcmEuIik7aWYoITA9PT1fKXJldHVybjshMD09PXQuYXV0b1VwZGF0ZSYmdC51cGRhdGVNYXRyaXhXb3JsZCgpLG51bGw9PT1lLnBhcmVudCYmZS51cGRhdGVNYXRyaXhXb3JsZCgpLCEwPT09bXQuZW5hYmxlZCYmITA9PT1tdC5pc1ByZXNlbnRpbmcmJighMD09PW10LmNhbWVyYUF1dG9VcGRhdGUmJm10LnVwZGF0ZUNhbWVyYShlKSxlPW10LmdldENhbWVyYSgpKSwhMD09PXQuaXNTY2VuZSYmdC5vbkJlZm9yZVJlbmRlcihnLHQsZSxiKSxwPWl0LmdldCh0LG0ubGVuZ3RoKSxwLmluaXQoKSxtLnB1c2gocCksSC5tdWx0aXBseU1hdHJpY2VzKGUucHJvamVjdGlvbk1hdHJpeCxlLm1hdHJpeFdvcmxkSW52ZXJzZSksTy5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChIKSxEPXRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQsej1ydC5pbml0KHRoaXMuY2xpcHBpbmdQbGFuZXMsRCxlKSxkPW50LmdldCh0LGYubGVuZ3RoKSxkLmluaXQoKSxmLnB1c2goZCksU3QodCxlLDAsZy5zb3J0T2JqZWN0cyksZC5maW5pc2goKSwhMD09PWcuc29ydE9iamVjdHMmJmQuc29ydChrLEwpLCEwPT09eiYmcnQuYmVnaW5TaGFkb3dzKCksb3QucmVuZGVyKHAuc3RhdGUuc2hhZG93c0FycmF5LHQsZSkscC5zZXR1cExpZ2h0cygpLHAuc2V0dXBMaWdodHNWaWV3KGUpLCEwPT09eiYmcnQuZW5kU2hhZG93cygpLCEwPT09dGhpcy5pbmZvLmF1dG9SZXNldCYmdGhpcy5pbmZvLnJlc2V0KCksYXQucmVuZGVyKGQsdCk7Y29uc3Qgbj1kLm9wYXF1ZSxpPWQudHJhbnNtaXNzaXZlLHI9ZC50cmFuc3BhcmVudDtuLmxlbmd0aD4wJiZNdChuLHQsZSksaS5sZW5ndGg+MCYmKGZ1bmN0aW9uIG8odCxlLG4saSl7bnVsbD09PUImJihCPW5ldyghMD09PXMmJiEwPT09Ry5pc1dlYkdMMj9FSnQ6U0p0KSgxMDI0LDEwMjQse2dlbmVyYXRlTWlwbWFwczohMCx0eXBlOm51bGwhPT11dC5jb252ZXJ0KGxadCk/bFp0OnJadCxtaW5GaWx0ZXI6aVp0LG1hZ0ZpbHRlcjpKS3Qsd3JhcFM6S0t0LHdyYXBUOktLdH0pKTtjb25zdCByPWcuZ2V0UmVuZGVyVGFyZ2V0KCk7Zy5zZXRSZW5kZXJUYXJnZXQoQiksZy5jbGVhcigpO2NvbnN0IG89Zy50b25lTWFwcGluZztnLnRvbmVNYXBwaW5nPTAsTXQodCxuLGkpLGcudG9uZU1hcHBpbmc9byxYLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KEIpLFgudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKEIpLGcuc2V0UmVuZGVyVGFyZ2V0KHIpLE10KGUsbixpKX0pKG4saSx0LGUpLHIubGVuZ3RoPjAmJk10KHIsdCxlKSxudWxsIT09YiYmKFgudXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQoYiksWC51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoYikpLCEwPT09dC5pc1NjZW5lJiZ0Lm9uQWZ0ZXJSZW5kZXIoZyx0LGUpLFcuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCEwKSxXLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayghMCksVy5idWZmZXJzLmNvbG9yLnNldE1hc2soITApLFcuc2V0UG9seWdvbk9mZnNldCghMSksaHQucmVzZXREZWZhdWx0U3RhdGUoKSx4PS0xLHc9bnVsbCxtLnBvcCgpLHA9bS5sZW5ndGg+MD9tW20ubGVuZ3RoLTFdOm51bGwsZi5wb3AoKSxkPWYubGVuZ3RoPjA/ZltmLmxlbmd0aC0xXTpudWxsfSx0aGlzLmdldEFjdGl2ZUN1YmVGYWNlPWZ1bmN0aW9uKCl7cmV0dXJuIHl9LHRoaXMuZ2V0QWN0aXZlTWlwbWFwTGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdn0sdGhpcy5nZXRSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gYn0sdGhpcy5zZXRSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24odCxlPTAsbj0wKXtiPXQseT1lLHY9bix0JiZ2b2lkIDA9PT1ZLmdldCh0KS5fX3dlYmdsRnJhbWVidWZmZXImJlguc2V0dXBSZW5kZXJUYXJnZXQodCk7bGV0IGk9bnVsbCxyPSExLG89ITE7aWYodCl7Y29uc3Qgbj10LnRleHR1cmU7KG4uaXNEYXRhVGV4dHVyZTNEfHxuLmlzRGF0YVRleHR1cmUyREFycmF5KSYmKG89ITApO2NvbnN0IGE9WS5nZXQodCkuX193ZWJnbEZyYW1lYnVmZmVyO3QuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQ/KGk9YVtlXSxyPSEwKTppPXQuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0P1kuZ2V0KHQpLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcjphLFMuY29weSh0LnZpZXdwb3J0KSxNLmNvcHkodC5zY2lzc29yKSxFPXQuc2Npc3NvclRlc3R9ZWxzZSBTLmNvcHkoUCkubXVsdGlwbHlTY2FsYXIoQSkuZmxvb3IoKSxNLmNvcHkoTikubXVsdGlwbHlTY2FsYXIoQSkuZmxvb3IoKSxFPUk7aWYoVy5iaW5kRnJhbWVidWZmZXIoMzYxNjAsaSkmJkcuZHJhd0J1ZmZlcnMpe2xldCBlPSExO2lmKHQpaWYodC5pc1dlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzKXtjb25zdCBuPXQudGV4dHVyZTtpZihSLmxlbmd0aCE9PW4ubGVuZ3RofHwzNjA2NCE9PVJbMF0pe2ZvcihsZXQgdD0wLGU9bi5sZW5ndGg7dDxlO3QrKylSW3RdPTM2MDY0K3Q7Ui5sZW5ndGg9bi5sZW5ndGgsZT0hMH19ZWxzZSAxPT09Ui5sZW5ndGgmJjM2MDY0PT09UlswXXx8KFJbMF09MzYwNjQsUi5sZW5ndGg9MSxlPSEwKTtlbHNlIDE9PT1SLmxlbmd0aCYmMTAyOT09PVJbMF18fChSWzBdPTEwMjksUi5sZW5ndGg9MSxlPSEwKTtlJiYoRy5pc1dlYkdMMj9kdC5kcmF3QnVmZmVycyhSKTpqLmdldCgiV0VCR0xfZHJhd19idWZmZXJzIikuZHJhd0J1ZmZlcnNXRUJHTChSKSl9aWYoVy52aWV3cG9ydChTKSxXLnNjaXNzb3IoTSksVy5zZXRTY2lzc29yVGVzdChFKSxyKXtjb25zdCBpPVkuZ2V0KHQudGV4dHVyZSk7ZHQuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsMzYwNjQsMzQwNjkrZSxpLl9fd2ViZ2xUZXh0dXJlLG4pfWVsc2UgaWYobyl7Y29uc3QgaT1ZLmdldCh0LnRleHR1cmUpO2R0LmZyYW1lYnVmZmVyVGV4dHVyZUxheWVyKDM2MTYwLDM2MDY0LGkuX193ZWJnbFRleHR1cmUsbnx8MCxlfHwwKX19LHRoaXMucmVhZFJlbmRlclRhcmdldFBpeGVscz1mdW5jdGlvbih0LGUsbixpLHIsbyxhKXtpZighdHx8IXQuaXNXZWJHTFJlbmRlclRhcmdldClyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQuIik7bGV0IHM9WS5nZXQodCkuX193ZWJnbEZyYW1lYnVmZmVyO2lmKHQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQmJnZvaWQgMCE9PWEmJihzPXNbYV0pLHMpe1cuYmluZEZyYW1lYnVmZmVyKDM2MTYwLHMpO3RyeXtjb25zdCBhPXQudGV4dHVyZSxzPWEuZm9ybWF0LGw9YS50eXBlO2lmKHMhPT1oWnQmJnV0LmNvbnZlcnQocykhPT1kdC5nZXRQYXJhbWV0ZXIoMzU3MzkpKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBSR0JBIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgZm9ybWF0LiIpO2NvbnN0IGM9bD09PWxadCYmKGouaGFzKCJFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQiKXx8Ry5pc1dlYkdMMiYmai5oYXMoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKSk7aWYoIShsPT09clp0fHx1dC5jb252ZXJ0KGwpPT09ZHQuZ2V0UGFyYW1ldGVyKDM1NzM4KXx8bD09PXNadCYmKEcuaXNXZWJHTDJ8fGouaGFzKCJPRVNfdGV4dHVyZV9mbG9hdCIpfHxqLmhhcygiV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0IikpfHxjKSlyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gVW5zaWduZWRCeXRlVHlwZSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHR5cGUuIik7MzYwNTM9PT1kdC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKDM2MTYwKT9lPj0wJiZlPD10LndpZHRoLWkmJm4+PTAmJm48PXQuaGVpZ2h0LXImJmR0LnJlYWRQaXhlbHMoZSxuLGkscix1dC5jb252ZXJ0KHMpLHV0LmNvbnZlcnQobCksbyk6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZWFkUGl4ZWxzIGZyb20gcmVuZGVyVGFyZ2V0IGZhaWxlZC4gRnJhbWVidWZmZXIgbm90IGNvbXBsZXRlLiIpfWZpbmFsbHl7Y29uc3QgdD1udWxsIT09Yj9ZLmdldChiKS5fX3dlYmdsRnJhbWVidWZmZXI6bnVsbDtXLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCx0KX19fSx0aGlzLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZT1mdW5jdGlvbih0LGUsbj0wKXtjb25zdCBpPU1hdGgucG93KDIsLW4pLHI9TWF0aC5mbG9vcihlLmltYWdlLndpZHRoKmkpLG89TWF0aC5mbG9vcihlLmltYWdlLmhlaWdodCppKTtsZXQgYT11dC5jb252ZXJ0KGUuZm9ybWF0KTtHLmlzV2ViR0wyJiYoNjQwNz09PWEmJihhPTMyODQ5KSw2NDA4PT09YSYmKGE9MzI4NTYpKSxYLnNldFRleHR1cmUyRChlLDApLGR0LmNvcHlUZXhJbWFnZTJEKDM1NTMsbixhLHQueCx0LnkscixvLDApLFcudW5iaW5kVGV4dHVyZSgpfSx0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlPWZ1bmN0aW9uKHQsZSxuLGk9MCl7Y29uc3Qgcj1lLmltYWdlLndpZHRoLG89ZS5pbWFnZS5oZWlnaHQsYT11dC5jb252ZXJ0KG4uZm9ybWF0KSxzPXV0LmNvbnZlcnQobi50eXBlKTtYLnNldFRleHR1cmUyRChuLDApLGR0LnBpeGVsU3RvcmVpKDM3NDQwLG4uZmxpcFkpLGR0LnBpeGVsU3RvcmVpKDM3NDQxLG4ucHJlbXVsdGlwbHlBbHBoYSksZHQucGl4ZWxTdG9yZWkoMzMxNyxuLnVucGFja0FsaWdubWVudCksZS5pc0RhdGFUZXh0dXJlP2R0LnRleFN1YkltYWdlMkQoMzU1MyxpLHQueCx0LnkscixvLGEscyxlLmltYWdlLmRhdGEpOmUuaXNDb21wcmVzc2VkVGV4dHVyZT9kdC5jb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCgzNTUzLGksdC54LHQueSxlLm1pcG1hcHNbMF0ud2lkdGgsZS5taXBtYXBzWzBdLmhlaWdodCxhLGUubWlwbWFwc1swXS5kYXRhKTpkdC50ZXhTdWJJbWFnZTJEKDM1NTMsaSx0LngsdC55LGEscyxlLmltYWdlKSwwPT09aSYmbi5nZW5lcmF0ZU1pcG1hcHMmJmR0LmdlbmVyYXRlTWlwbWFwKDM1NTMpLFcudW5iaW5kVGV4dHVyZSgpfSx0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlM0Q9ZnVuY3Rpb24odCxlLG4saSxyPTApe2lmKGcuaXNXZWJHTDFSZW5kZXJlcilyZXR1cm4gdm9pZCBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXIuY29weVRleHR1cmVUb1RleHR1cmUzRDogY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFdlYkdMMi4iKTtjb25zdCBvPXQubWF4LngtdC5taW4ueCsxLGE9dC5tYXgueS10Lm1pbi55KzEscz10Lm1heC56LXQubWluLnorMSxsPXV0LmNvbnZlcnQoaS5mb3JtYXQpLGM9dXQuY29udmVydChpLnR5cGUpO2xldCB1O2lmKGkuaXNEYXRhVGV4dHVyZTNEKVguc2V0VGV4dHVyZTNEKGksMCksdT0zMjg3OTtlbHNle2lmKCFpLmlzRGF0YVRleHR1cmUyREFycmF5KXJldHVybiB2b2lkIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlci5jb3B5VGV4dHVyZVRvVGV4dHVyZTNEOiBvbmx5IHN1cHBvcnRzIFRIUkVFLkRhdGFUZXh0dXJlM0QgYW5kIFRIUkVFLkRhdGFUZXh0dXJlMkRBcnJheS4iKTtYLnNldFRleHR1cmUyREFycmF5KGksMCksdT0zNTg2Nn1kdC5waXhlbFN0b3JlaSgzNzQ0MCxpLmZsaXBZKSxkdC5waXhlbFN0b3JlaSgzNzQ0MSxpLnByZW11bHRpcGx5QWxwaGEpLGR0LnBpeGVsU3RvcmVpKDMzMTcsaS51bnBhY2tBbGlnbm1lbnQpO2NvbnN0IGg9ZHQuZ2V0UGFyYW1ldGVyKDMzMTQpLGQ9ZHQuZ2V0UGFyYW1ldGVyKDMyODc4KSxwPWR0LmdldFBhcmFtZXRlcigzMzE2KSxmPWR0LmdldFBhcmFtZXRlcigzMzE1KSxtPWR0LmdldFBhcmFtZXRlcigzMjg3NyksXz1uLmlzQ29tcHJlc3NlZFRleHR1cmU/bi5taXBtYXBzWzBdOm4uaW1hZ2U7ZHQucGl4ZWxTdG9yZWkoMzMxNCxfLndpZHRoKSxkdC5waXhlbFN0b3JlaSgzMjg3OCxfLmhlaWdodCksZHQucGl4ZWxTdG9yZWkoMzMxNix0Lm1pbi54KSxkdC5waXhlbFN0b3JlaSgzMzE1LHQubWluLnkpLGR0LnBpeGVsU3RvcmVpKDMyODc3LHQubWluLnopLG4uaXNEYXRhVGV4dHVyZXx8bi5pc0RhdGFUZXh0dXJlM0Q/ZHQudGV4U3ViSW1hZ2UzRCh1LHIsZS54LGUueSxlLnosbyxhLHMsbCxjLF8uZGF0YSk6bi5pc0NvbXByZXNzZWRUZXh0dXJlPyhjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXIuY29weVRleHR1cmVUb1RleHR1cmUzRDogdW50ZXN0ZWQgc3VwcG9ydCBmb3IgY29tcHJlc3NlZCBzcmNUZXh0dXJlLiIpLGR0LmNvbXByZXNzZWRUZXhTdWJJbWFnZTNEKHUscixlLngsZS55LGUueixvLGEscyxsLF8uZGF0YSkpOmR0LnRleFN1YkltYWdlM0QodSxyLGUueCxlLnksZS56LG8sYSxzLGwsYyxfKSxkdC5waXhlbFN0b3JlaSgzMzE0LGgpLGR0LnBpeGVsU3RvcmVpKDMyODc4LGQpLGR0LnBpeGVsU3RvcmVpKDMzMTYscCksZHQucGl4ZWxTdG9yZWkoMzMxNSxmKSxkdC5waXhlbFN0b3JlaSgzMjg3NyxtKSwwPT09ciYmaS5nZW5lcmF0ZU1pcG1hcHMmJmR0LmdlbmVyYXRlTWlwbWFwKHUpLFcudW5iaW5kVGV4dHVyZSgpfSx0aGlzLmluaXRUZXh0dXJlPWZ1bmN0aW9uKHQpe1guc2V0VGV4dHVyZTJEKHQsMCksVy51bmJpbmRUZXh0dXJlKCl9LHRoaXMucmVzZXRTdGF0ZT1mdW5jdGlvbigpe3k9MCx2PTAsYj1udWxsLFcucmVzZXQoKSxodC5yZXNldCgpfSwidW5kZWZpbmVkIiE9dHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyYmX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJvYnNlcnZlIix7ZGV0YWlsOnRoaXN9KSl9Y2xhc3MgVzV0IGV4dGVuZHMgRzV0e31XNXQucHJvdG90eXBlLmlzV2ViR0wxUmVuZGVyZXI9ITA7Y2xhc3MgcTV0e2NvbnN0cnVjdG9yKHQsZT0yNWUtNSl7dGhpcy5uYW1lPSIiLHRoaXMuY29sb3I9bmV3ICRRdCh0KSx0aGlzLmRlbnNpdHk9ZX1jbG9uZSgpe3JldHVybiBuZXcgcTV0KHRoaXMuY29sb3IsdGhpcy5kZW5zaXR5KX10b0pTT04oKXtyZXR1cm57dHlwZToiRm9nRXhwMiIsY29sb3I6dGhpcy5jb2xvci5nZXRIZXgoKSxkZW5zaXR5OnRoaXMuZGVuc2l0eX19fXE1dC5wcm90b3R5cGUuaXNGb2dFeHAyPSEwO2NsYXNzIFk1dHtjb25zdHJ1Y3Rvcih0LGU9MSxuPTFlMyl7dGhpcy5uYW1lPSIiLHRoaXMuY29sb3I9bmV3ICRRdCh0KSx0aGlzLm5lYXI9ZSx0aGlzLmZhcj1ufWNsb25lKCl7cmV0dXJuIG5ldyBZNXQodGhpcy5jb2xvcix0aGlzLm5lYXIsdGhpcy5mYXIpfXRvSlNPTigpe3JldHVybnt0eXBlOiJGb2ciLGNvbG9yOnRoaXMuY29sb3IuZ2V0SGV4KCksbmVhcjp0aGlzLm5lYXIsZmFyOnRoaXMuZmFyfX19WTV0LnByb3RvdHlwZS5pc0ZvZz0hMDtjbGFzcyBYNXQgZXh0ZW5kcyBrUXR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudHlwZT0iU2NlbmUiLHRoaXMuYmFja2dyb3VuZD1udWxsLHRoaXMuZW52aXJvbm1lbnQ9bnVsbCx0aGlzLmZvZz1udWxsLHRoaXMub3ZlcnJpZGVNYXRlcmlhbD1udWxsLHRoaXMuYXV0b1VwZGF0ZT0hMCwidW5kZWZpbmVkIiE9dHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyYmX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJvYnNlcnZlIix7ZGV0YWlsOnRoaXN9KSl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksbnVsbCE9PXQuYmFja2dyb3VuZCYmKHRoaXMuYmFja2dyb3VuZD10LmJhY2tncm91bmQuY2xvbmUoKSksbnVsbCE9PXQuZW52aXJvbm1lbnQmJih0aGlzLmVudmlyb25tZW50PXQuZW52aXJvbm1lbnQuY2xvbmUoKSksbnVsbCE9PXQuZm9nJiYodGhpcy5mb2c9dC5mb2cuY2xvbmUoKSksbnVsbCE9PXQub3ZlcnJpZGVNYXRlcmlhbCYmKHRoaXMub3ZlcnJpZGVNYXRlcmlhbD10Lm92ZXJyaWRlTWF0ZXJpYWwuY2xvbmUoKSksdGhpcy5hdXRvVXBkYXRlPXQuYXV0b1VwZGF0ZSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlLHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO3JldHVybiBudWxsIT09dGhpcy5mb2cmJihlLm9iamVjdC5mb2c9dGhpcy5mb2cudG9KU09OKCkpLGV9fVg1dC5wcm90b3R5cGUuaXNTY2VuZT0hMDtjbGFzcyAkNXR7Y29uc3RydWN0b3IodCxlKXt0aGlzLmFycmF5PXQsdGhpcy5zdHJpZGU9ZSx0aGlzLmNvdW50PXZvaWQgMCE9PXQ/dC5sZW5ndGgvZTowLHRoaXMudXNhZ2U9Rlp0LHRoaXMudXBkYXRlUmFuZ2U9e29mZnNldDowLGNvdW50Oi0xfSx0aGlzLnZlcnNpb249MCx0aGlzLnV1aWQ9WFp0KCl9b25VcGxvYWRDYWxsYmFjaygpe31zZXQgbmVlZHNVcGRhdGUodCl7ITA9PT10JiZ0aGlzLnZlcnNpb24rK31zZXRVc2FnZSh0KXtyZXR1cm4gdGhpcy51c2FnZT10LHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5hcnJheT1uZXcgdC5hcnJheS5jb25zdHJ1Y3Rvcih0LmFycmF5KSx0aGlzLmNvdW50PXQuY291bnQsdGhpcy5zdHJpZGU9dC5zdHJpZGUsdGhpcy51c2FnZT10LnVzYWdlLHRoaXN9Y29weUF0KHQsZSxuKXt0Kj10aGlzLnN0cmlkZSxuKj1lLnN0cmlkZTtmb3IobGV0IGk9MCxyPXRoaXMuc3RyaWRlO2k8cjtpKyspdGhpcy5hcnJheVt0K2ldPWUuYXJyYXlbbitpXTtyZXR1cm4gdGhpc31zZXQodCxlPTApe3JldHVybiB0aGlzLmFycmF5LnNldCh0LGUpLHRoaXN9Y2xvbmUodCl7dm9pZCAwPT09dC5hcnJheUJ1ZmZlcnMmJih0LmFycmF5QnVmZmVycz17fSksdm9pZCAwPT09dGhpcy5hcnJheS5idWZmZXIuX3V1aWQmJih0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZD1YWnQoKSksdm9pZCAwPT09dC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdJiYodC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPXRoaXMuYXJyYXkuc2xpY2UoMCkuYnVmZmVyKTtjb25zdCBlPW5ldyB0aGlzLmFycmF5LmNvbnN0cnVjdG9yKHQuYXJyYXlCdWZmZXJzW3RoaXMuYXJyYXkuYnVmZmVyLl91dWlkXSksbj1uZXcgdGhpcy5jb25zdHJ1Y3RvcihlLHRoaXMuc3RyaWRlKTtyZXR1cm4gbi5zZXRVc2FnZSh0aGlzLnVzYWdlKSxufW9uVXBsb2FkKHQpe3JldHVybiB0aGlzLm9uVXBsb2FkQ2FsbGJhY2s9dCx0aGlzfXRvSlNPTih0KXtyZXR1cm4gdm9pZCAwPT09dC5hcnJheUJ1ZmZlcnMmJih0LmFycmF5QnVmZmVycz17fSksdm9pZCAwPT09dGhpcy5hcnJheS5idWZmZXIuX3V1aWQmJih0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZD1YWnQoKSksdm9pZCAwPT09dC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdJiYodC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5LmJ1ZmZlcikpKSx7dXVpZDp0aGlzLnV1aWQsYnVmZmVyOnRoaXMuYXJyYXkuYnVmZmVyLl91dWlkLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLHN0cmlkZTp0aGlzLnN0cmlkZX19fSQ1dC5wcm90b3R5cGUuaXNJbnRlcmxlYXZlZEJ1ZmZlcj0hMDtjb25zdCBLNXQ9bmV3IENKdDtjbGFzcyBaNXR7Y29uc3RydWN0b3IodCxlLG4saT0hMSl7dGhpcy5uYW1lPSIiLHRoaXMuZGF0YT10LHRoaXMuaXRlbVNpemU9ZSx0aGlzLm9mZnNldD1uLHRoaXMubm9ybWFsaXplZD0hMD09PWl9Z2V0IGNvdW50KCl7cmV0dXJuIHRoaXMuZGF0YS5jb3VudH1nZXQgYXJyYXkoKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5fXNldCBuZWVkc1VwZGF0ZSh0KXt0aGlzLmRhdGEubmVlZHNVcGRhdGU9dH1hcHBseU1hdHJpeDQodCl7Zm9yKGxldCBlPTAsbj10aGlzLmRhdGEuY291bnQ7ZTxuO2UrKylLNXQueD10aGlzLmdldFgoZSksSzV0Lnk9dGhpcy5nZXRZKGUpLEs1dC56PXRoaXMuZ2V0WihlKSxLNXQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0WFlaKGUsSzV0LngsSzV0LnksSzV0LnopO3JldHVybiB0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKUs1dC54PXRoaXMuZ2V0WChlKSxLNXQueT10aGlzLmdldFkoZSksSzV0Lno9dGhpcy5nZXRaKGUpLEs1dC5hcHBseU5vcm1hbE1hdHJpeCh0KSx0aGlzLnNldFhZWihlLEs1dC54LEs1dC55LEs1dC56KTtyZXR1cm4gdGhpc310cmFuc2Zvcm1EaXJlY3Rpb24odCl7Zm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspSzV0Lng9dGhpcy5nZXRYKGUpLEs1dC55PXRoaXMuZ2V0WShlKSxLNXQuej10aGlzLmdldFooZSksSzV0LnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzLnNldFhZWihlLEs1dC54LEs1dC55LEs1dC56KTtyZXR1cm4gdGhpc31zZXRYKHQsZSl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXRdPWUsdGhpc31zZXRZKHQsZSl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMV09ZSx0aGlzfXNldFoodCxlKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCsyXT1lLHRoaXN9c2V0Vyh0LGUpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzNdPWUsdGhpc31nZXRYKHQpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0XX1nZXRZKHQpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzFdfWdldFoodCl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMl19Z2V0Vyh0KXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCszXX1zZXRYWSh0LGUsbil7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsodD10KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQpKzBdPWUsdGhpcy5kYXRhLmFycmF5W3QrMV09bix0aGlzfXNldFhZWih0LGUsbixpKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5Wyh0PXQqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCkrMF09ZSx0aGlzLmRhdGEuYXJyYXlbdCsxXT1uLHRoaXMuZGF0YS5hcnJheVt0KzJdPWksdGhpc31zZXRYWVpXKHQsZSxuLGkscil7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsodD10KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQpKzBdPWUsdGhpcy5kYXRhLmFycmF5W3QrMV09bix0aGlzLmRhdGEuYXJyYXlbdCsyXT1pLHRoaXMuZGF0YS5hcnJheVt0KzNdPXIsdGhpc31jbG9uZSh0KXtpZih2b2lkIDA9PT10KXtjb25zb2xlLmxvZygiVEhSRUUuSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUuY2xvbmUoKTogQ2xvbmluZyBhbiBpbnRlcmxhdmVkIGJ1ZmZlciBhdHRyaWJ1dGUgd2lsbCBkZWludGVybGVhdmUgYnVmZmVyIGRhdGEuIik7Y29uc3QgdD1bXTtmb3IobGV0IGU9MDtlPHRoaXMuY291bnQ7ZSsrKXtjb25zdCBuPWUqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldDtmb3IobGV0IGU9MDtlPHRoaXMuaXRlbVNpemU7ZSsrKXQucHVzaCh0aGlzLmRhdGEuYXJyYXlbbitlXSl9cmV0dXJuIG5ldyBRUXQobmV3IHRoaXMuYXJyYXkuY29uc3RydWN0b3IodCksdGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQpfXJldHVybiB2b2lkIDA9PT10LmludGVybGVhdmVkQnVmZmVycyYmKHQuaW50ZXJsZWF2ZWRCdWZmZXJzPXt9KSx2b2lkIDA9PT10LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF0mJih0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF09dGhpcy5kYXRhLmNsb25lKHQpKSxuZXcgWjV0KHQuaW50ZXJsZWF2ZWRCdWZmZXJzW3RoaXMuZGF0YS51dWlkXSx0aGlzLml0ZW1TaXplLHRoaXMub2Zmc2V0LHRoaXMubm9ybWFsaXplZCl9dG9KU09OKHQpe2lmKHZvaWQgMD09PXQpe2NvbnNvbGUubG9nKCJUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS50b0pTT04oKTogU2VyaWFsaXppbmcgYW4gaW50ZXJsYXZlZCBidWZmZXIgYXR0cmlidXRlIHdpbGwgZGVpbnRlcmxlYXZlIGJ1ZmZlciBkYXRhLiIpO2NvbnN0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLmNvdW50O2UrKyl7Y29uc3Qgbj1lKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQ7Zm9yKGxldCBlPTA7ZTx0aGlzLml0ZW1TaXplO2UrKyl0LnB1c2godGhpcy5kYXRhLmFycmF5W24rZV0pfXJldHVybntpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OnQsbm9ybWFsaXplZDp0aGlzLm5vcm1hbGl6ZWR9fXJldHVybiB2b2lkIDA9PT10LmludGVybGVhdmVkQnVmZmVycyYmKHQuaW50ZXJsZWF2ZWRCdWZmZXJzPXt9KSx2b2lkIDA9PT10LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF0mJih0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF09dGhpcy5kYXRhLnRvSlNPTih0KSkse2lzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6ITAsaXRlbVNpemU6dGhpcy5pdGVtU2l6ZSxkYXRhOnRoaXMuZGF0YS51dWlkLG9mZnNldDp0aGlzLm9mZnNldCxub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH19fVo1dC5wcm90b3R5cGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZT0hMDtjbGFzcyBKNXQgZXh0ZW5kcyBVUXR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9IlNwcml0ZU1hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyAkUXQoMTY3NzcyMTUpLHRoaXMubWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMucm90YXRpb249MCx0aGlzLnNpemVBdHRlbnVhdGlvbj0hMCx0aGlzLnRyYW5zcGFyZW50PSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubWFwPXQubWFwLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLnJvdGF0aW9uPXQucm90YXRpb24sdGhpcy5zaXplQXR0ZW51YXRpb249dC5zaXplQXR0ZW51YXRpb24sdGhpc319bGV0IFE1dDtKNXQucHJvdG90eXBlLmlzU3ByaXRlTWF0ZXJpYWw9ITA7Y29uc3QgdDN0PW5ldyBDSnQsZTN0PW5ldyBDSnQsbjN0PW5ldyBDSnQsaTN0PW5ldyBtSnQscjN0PW5ldyBtSnQsbzN0PW5ldyByUXQsYTN0PW5ldyBDSnQsczN0PW5ldyBDSnQsbDN0PW5ldyBDSnQsYzN0PW5ldyBtSnQsdTN0PW5ldyBtSnQsaDN0PW5ldyBtSnQ7Y2xhc3MgZDN0IGV4dGVuZHMga1F0e2NvbnN0cnVjdG9yKHQpe2lmKHN1cGVyKCksdGhpcy50eXBlPSJTcHJpdGUiLHZvaWQgMD09PVE1dCl7UTV0PW5ldyBiMXQ7Y29uc3QgdD1uZXcgRmxvYXQzMkFycmF5KFstLjUsLS41LDAsMCwwLC41LC0uNSwwLDEsMCwuNSwuNSwwLDEsMSwtLjUsLjUsMCwwLDFdKSxlPW5ldyAkNXQodCw1KTtRNXQuc2V0SW5kZXgoWzAsMSwyLDAsMiwzXSksUTV0LnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBaNXQoZSwzLDAsITEpKSxRNXQuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFo1dChlLDIsMywhMSkpfXRoaXMuZ2VvbWV0cnk9UTV0LHRoaXMubWF0ZXJpYWw9dm9pZCAwIT09dD90Om5ldyBKNXQsdGhpcy5jZW50ZXI9bmV3IG1KdCguNSwuNSl9cmF5Y2FzdCh0LGUpe251bGw9PT10LmNhbWVyYSYmY29uc29sZS5lcnJvcignVEhSRUUuU3ByaXRlOiAiUmF5Y2FzdGVyLmNhbWVyYSIgbmVlZHMgdG8gYmUgc2V0IGluIG9yZGVyIHRvIHJheWNhc3QgYWdhaW5zdCBzcHJpdGVzLicpLGUzdC5zZXRGcm9tTWF0cml4U2NhbGUodGhpcy5tYXRyaXhXb3JsZCksbzN0LmNvcHkodC5jYW1lcmEubWF0cml4V29ybGQpLHRoaXMubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXModC5jYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLHRoaXMubWF0cml4V29ybGQpLG4zdC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tb2RlbFZpZXdNYXRyaXgpLHQuY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEmJiExPT09dGhpcy5tYXRlcmlhbC5zaXplQXR0ZW51YXRpb24mJmUzdC5tdWx0aXBseVNjYWxhcigtbjN0LnopO2NvbnN0IG49dGhpcy5tYXRlcmlhbC5yb3RhdGlvbjtsZXQgaSxyOzAhPT1uJiYocj1NYXRoLmNvcyhuKSxpPU1hdGguc2luKG4pKTtjb25zdCBvPXRoaXMuY2VudGVyO3AzdChhM3Quc2V0KC0uNSwtLjUsMCksbjN0LG8sZTN0LGkscikscDN0KHMzdC5zZXQoLjUsLS41LDApLG4zdCxvLGUzdCxpLHIpLHAzdChsM3Quc2V0KC41LC41LDApLG4zdCxvLGUzdCxpLHIpLGMzdC5zZXQoMCwwKSx1M3Quc2V0KDEsMCksaDN0LnNldCgxLDEpO2xldCBhPXQucmF5LmludGVyc2VjdFRyaWFuZ2xlKGEzdCxzM3QsbDN0LCExLHQzdCk7aWYobnVsbD09PWEmJihwM3QoczN0LnNldCgtLjUsLjUsMCksbjN0LG8sZTN0LGksciksdTN0LnNldCgwLDEpLGE9dC5yYXkuaW50ZXJzZWN0VHJpYW5nbGUoYTN0LGwzdCxzM3QsITEsdDN0KSxudWxsPT09YSkpcmV0dXJuO2NvbnN0IHM9dC5yYXkub3JpZ2luLmRpc3RhbmNlVG8odDN0KTtzPHQubmVhcnx8cz50LmZhcnx8ZS5wdXNoKHtkaXN0YW5jZTpzLHBvaW50OnQzdC5jbG9uZSgpLHV2OkZRdC5nZXRVVih0M3QsYTN0LHMzdCxsM3QsYzN0LHUzdCxoM3QsbmV3IG1KdCksZmFjZTpudWxsLG9iamVjdDp0aGlzfSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx2b2lkIDAhPT10LmNlbnRlciYmdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5tYXRlcmlhbD10Lm1hdGVyaWFsLHRoaXN9fWZ1bmN0aW9uIHAzdCh0LGUsbixpLHIsbyl7aTN0LnN1YlZlY3RvcnModCxuKS5hZGRTY2FsYXIoLjUpLm11bHRpcGx5KGkpLHZvaWQgMCE9PXI/KHIzdC54PW8qaTN0LngtcippM3QueSxyM3QueT1yKmkzdC54K28qaTN0LnkpOnIzdC5jb3B5KGkzdCksdC5jb3B5KGUpLHQueCs9cjN0LngsdC55Kz1yM3QueSx0LmFwcGx5TWF0cml4NChvM3QpfWQzdC5wcm90b3R5cGUuaXNTcHJpdGU9ITA7Y29uc3QgZjN0PW5ldyBDSnQsbTN0PW5ldyBDSnQ7Y2xhc3MgZzN0IGV4dGVuZHMga1F0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9jdXJyZW50TGV2ZWw9MCx0aGlzLnR5cGU9IkxPRCIsT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7bGV2ZWxzOntlbnVtZXJhYmxlOiEwLHZhbHVlOltdfSxpc0xPRDp7dmFsdWU6ITB9fSksdGhpcy5hdXRvVXBkYXRlPSEwfWNvcHkodCl7c3VwZXIuY29weSh0LCExKTtjb25zdCBlPXQubGV2ZWxzO2ZvcihsZXQgdD0wLG49ZS5sZW5ndGg7dDxuO3QrKyl7Y29uc3Qgbj1lW3RdO3RoaXMuYWRkTGV2ZWwobi5vYmplY3QuY2xvbmUoKSxuLmRpc3RhbmNlKX1yZXR1cm4gdGhpcy5hdXRvVXBkYXRlPXQuYXV0b1VwZGF0ZSx0aGlzfWFkZExldmVsKHQsZT0wKXtlPU1hdGguYWJzKGUpO2NvbnN0IG49dGhpcy5sZXZlbHM7bGV0IGk7Zm9yKGk9MDtpPG4ubGVuZ3RoJiYhKGU8bltpXS5kaXN0YW5jZSk7aSsrKTtyZXR1cm4gbi5zcGxpY2UoaSwwLHtkaXN0YW5jZTplLG9iamVjdDp0fSksdGhpcy5hZGQodCksdGhpc31nZXRDdXJyZW50TGV2ZWwoKXtyZXR1cm4gdGhpcy5fY3VycmVudExldmVsfWdldE9iamVjdEZvckRpc3RhbmNlKHQpe2NvbnN0IGU9dGhpcy5sZXZlbHM7aWYoZS5sZW5ndGg+MCl7bGV0IG4saTtmb3Iobj0xLGk9ZS5sZW5ndGg7bjxpJiYhKHQ8ZVtuXS5kaXN0YW5jZSk7bisrKTtyZXR1cm4gZVtuLTFdLm9iamVjdH1yZXR1cm4gbnVsbH1yYXljYXN0KHQsZSl7aWYodGhpcy5sZXZlbHMubGVuZ3RoPjApe2YzdC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7Y29uc3Qgbj10LnJheS5vcmlnaW4uZGlzdGFuY2VUbyhmM3QpO3RoaXMuZ2V0T2JqZWN0Rm9yRGlzdGFuY2UobikucmF5Y2FzdCh0LGUpfX11cGRhdGUodCl7Y29uc3QgZT10aGlzLmxldmVscztpZihlLmxlbmd0aD4xKXtmM3Quc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQubWF0cml4V29ybGQpLG0zdC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7Y29uc3Qgbj1mM3QuZGlzdGFuY2VUbyhtM3QpL3Quem9vbTtsZXQgaSxyO2ZvcihlWzBdLm9iamVjdC52aXNpYmxlPSEwLGk9MSxyPWUubGVuZ3RoO2k8ciYmbj49ZVtpXS5kaXN0YW5jZTtpKyspZVtpLTFdLm9iamVjdC52aXNpYmxlPSExLGVbaV0ub2JqZWN0LnZpc2libGU9ITA7Zm9yKHRoaXMuX2N1cnJlbnRMZXZlbD1pLTE7aTxyO2krKyllW2ldLm9iamVjdC52aXNpYmxlPSExfX10b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7ITE9PT10aGlzLmF1dG9VcGRhdGUmJihlLm9iamVjdC5hdXRvVXBkYXRlPSExKSxlLm9iamVjdC5sZXZlbHM9W107Y29uc3Qgbj10aGlzLmxldmVscztmb3IobGV0IHQ9MCxpPW4ubGVuZ3RoO3Q8aTt0Kyspe2NvbnN0IGk9blt0XTtlLm9iamVjdC5sZXZlbHMucHVzaCh7b2JqZWN0Omkub2JqZWN0LnV1aWQsZGlzdGFuY2U6aS5kaXN0YW5jZX0pfXJldHVybiBlfX1jb25zdCBfM3Q9bmV3IENKdCx5M3Q9bmV3IHdKdCx2M3Q9bmV3IHdKdCxiM3Q9bmV3IENKdCx4M3Q9bmV3IHJRdDtjbGFzcyB3M3QgZXh0ZW5kcyBCMXR7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpLHRoaXMudHlwZT0iU2tpbm5lZE1lc2giLHRoaXMuYmluZE1vZGU9ImF0dGFjaGVkIix0aGlzLmJpbmRNYXRyaXg9bmV3IHJRdCx0aGlzLmJpbmRNYXRyaXhJbnZlcnNlPW5ldyByUXR9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmJpbmRNb2RlPXQuYmluZE1vZGUsdGhpcy5iaW5kTWF0cml4LmNvcHkodC5iaW5kTWF0cml4KSx0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkodC5iaW5kTWF0cml4SW52ZXJzZSksdGhpcy5za2VsZXRvbj10LnNrZWxldG9uLHRoaXN9YmluZCh0LGUpe3RoaXMuc2tlbGV0b249dCx2b2lkIDA9PT1lJiYodGhpcy51cGRhdGVNYXRyaXhXb3JsZCghMCksdGhpcy5za2VsZXRvbi5jYWxjdWxhdGVJbnZlcnNlcygpLGU9dGhpcy5tYXRyaXhXb3JsZCksdGhpcy5iaW5kTWF0cml4LmNvcHkoZSksdGhpcy5iaW5kTWF0cml4SW52ZXJzZS5jb3B5KGUpLmludmVydCgpfXBvc2UoKXt0aGlzLnNrZWxldG9uLnBvc2UoKX1ub3JtYWxpemVTa2luV2VpZ2h0cygpe2NvbnN0IHQ9bmV3IHdKdCxlPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0O2ZvcihsZXQgbj0wLGk9ZS5jb3VudDtuPGk7bisrKXt0Lng9ZS5nZXRYKG4pLHQueT1lLmdldFkobiksdC56PWUuZ2V0WihuKSx0Lnc9ZS5nZXRXKG4pO2NvbnN0IGk9MS90Lm1hbmhhdHRhbkxlbmd0aCgpO2khPT0xLzA/dC5tdWx0aXBseVNjYWxhcihpKTp0LnNldCgxLDAsMCwwKSxlLnNldFhZWlcobix0LngsdC55LHQueix0LncpfX11cGRhdGVNYXRyaXhXb3JsZCh0KXtzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KSwiYXR0YWNoZWQiPT09dGhpcy5iaW5kTW9kZT90aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCk6ImRldGFjaGVkIj09PXRoaXMuYmluZE1vZGU/dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMuYmluZE1hdHJpeCkuaW52ZXJ0KCk6Y29uc29sZS53YXJuKCJUSFJFRS5Ta2lubmVkTWVzaDogVW5yZWNvZ25pemVkIGJpbmRNb2RlOiAiK3RoaXMuYmluZE1vZGUpfWJvbmVUcmFuc2Zvcm0odCxlKXtjb25zdCBuPXRoaXMuc2tlbGV0b24saT10aGlzLmdlb21ldHJ5O3kzdC5mcm9tQnVmZmVyQXR0cmlidXRlKGkuYXR0cmlidXRlcy5za2luSW5kZXgsdCksdjN0LmZyb21CdWZmZXJBdHRyaWJ1dGUoaS5hdHRyaWJ1dGVzLnNraW5XZWlnaHQsdCksXzN0LmZyb21CdWZmZXJBdHRyaWJ1dGUoaS5hdHRyaWJ1dGVzLnBvc2l0aW9uLHQpLmFwcGx5TWF0cml4NCh0aGlzLmJpbmRNYXRyaXgpLGUuc2V0KDAsMCwwKTtmb3IobGV0IHQ9MDt0PDQ7dCsrKXtjb25zdCBpPXYzdC5nZXRDb21wb25lbnQodCk7aWYoMCE9PWkpe2NvbnN0IHI9eTN0LmdldENvbXBvbmVudCh0KTt4M3QubXVsdGlwbHlNYXRyaWNlcyhuLmJvbmVzW3JdLm1hdHJpeFdvcmxkLG4uYm9uZUludmVyc2VzW3JdKSxlLmFkZFNjYWxlZFZlY3RvcihiM3QuY29weShfM3QpLmFwcGx5TWF0cml4NCh4M3QpLGkpfX1yZXR1cm4gZS5hcHBseU1hdHJpeDQodGhpcy5iaW5kTWF0cml4SW52ZXJzZSl9fXczdC5wcm90b3R5cGUuaXNTa2lubmVkTWVzaD0hMDtjbGFzcyBTM3QgZXh0ZW5kcyBrUXR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudHlwZT0iQm9uZSJ9fVMzdC5wcm90b3R5cGUuaXNCb25lPSEwO2NsYXNzIE0zdCBleHRlbmRzIGJKdHtjb25zdHJ1Y3Rvcih0PW51bGwsZT0xLG49MSxpLHIsbyxhLHMsbD0xMDAzLGM9MTAwMyx1LGgpe3N1cGVyKG51bGwsbyxhLHMsbCxjLGkscix1LGgpLHRoaXMuaW1hZ2U9e2RhdGE6dCx3aWR0aDplLGhlaWdodDpufSx0aGlzLm1hZ0ZpbHRlcj1sLHRoaXMubWluRmlsdGVyPWMsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITEsdGhpcy5mbGlwWT0hMSx0aGlzLnVucGFja0FsaWdubWVudD0xLHRoaXMubmVlZHNVcGRhdGU9ITB9fU0zdC5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZT0hMDtjb25zdCBFM3Q9bmV3IHJRdCxUM3Q9bmV3IHJRdDtjbGFzcyBDM3R7Y29uc3RydWN0b3IodD1bXSxlPVtdKXt0aGlzLnV1aWQ9WFp0KCksdGhpcy5ib25lcz10LnNsaWNlKDApLHRoaXMuYm9uZUludmVyc2VzPWUsdGhpcy5ib25lTWF0cmljZXM9bnVsbCx0aGlzLmJvbmVUZXh0dXJlPW51bGwsdGhpcy5ib25lVGV4dHVyZVNpemU9MCx0aGlzLmZyYW1lPS0xLHRoaXMuaW5pdCgpfWluaXQoKXtjb25zdCB0PXRoaXMuYm9uZXMsZT10aGlzLmJvbmVJbnZlcnNlcztpZih0aGlzLmJvbmVNYXRyaWNlcz1uZXcgRmxvYXQzMkFycmF5KDE2KnQubGVuZ3RoKSwwPT09ZS5sZW5ndGgpdGhpcy5jYWxjdWxhdGVJbnZlcnNlcygpO2Vsc2UgaWYodC5sZW5ndGghPT1lLmxlbmd0aCl7Y29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbjogTnVtYmVyIG9mIGludmVyc2UgYm9uZSBtYXRyaWNlcyBkb2VzIG5vdCBtYXRjaCBhbW91bnQgb2YgYm9uZXMuIiksdGhpcy5ib25lSW52ZXJzZXM9W107Zm9yKGxldCB0PTAsZT10aGlzLmJvbmVzLmxlbmd0aDt0PGU7dCsrKXRoaXMuYm9uZUludmVyc2VzLnB1c2gobmV3IHJRdCl9fWNhbGN1bGF0ZUludmVyc2VzKCl7dGhpcy5ib25lSW52ZXJzZXMubGVuZ3RoPTA7Zm9yKGxldCB0PTAsZT10aGlzLmJvbmVzLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPW5ldyByUXQ7dGhpcy5ib25lc1t0XSYmZS5jb3B5KHRoaXMuYm9uZXNbdF0ubWF0cml4V29ybGQpLmludmVydCgpLHRoaXMuYm9uZUludmVyc2VzLnB1c2goZSl9fXBvc2UoKXtmb3IobGV0IHQ9MCxlPXRoaXMuYm9uZXMubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9dGhpcy5ib25lc1t0XTtlJiZlLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5ib25lSW52ZXJzZXNbdF0pLmludmVydCgpfWZvcihsZXQgdD0wLGU9dGhpcy5ib25lcy5sZW5ndGg7dDxlO3QrKyl7Y29uc3QgZT10aGlzLmJvbmVzW3RdO2UmJihlLnBhcmVudCYmZS5wYXJlbnQuaXNCb25lPyhlLm1hdHJpeC5jb3B5KGUucGFyZW50Lm1hdHJpeFdvcmxkKS5pbnZlcnQoKSxlLm1hdHJpeC5tdWx0aXBseShlLm1hdHJpeFdvcmxkKSk6ZS5tYXRyaXguY29weShlLm1hdHJpeFdvcmxkKSxlLm1hdHJpeC5kZWNvbXBvc2UoZS5wb3NpdGlvbixlLnF1YXRlcm5pb24sZS5zY2FsZSkpfX11cGRhdGUoKXtjb25zdCB0PXRoaXMuYm9uZXMsZT10aGlzLmJvbmVJbnZlcnNlcyxuPXRoaXMuYm9uZU1hdHJpY2VzLGk9dGhpcy5ib25lVGV4dHVyZTtmb3IobGV0IGk9MCxyPXQubGVuZ3RoO2k8cjtpKyspRTN0Lm11bHRpcGx5TWF0cmljZXModFtpXT90W2ldLm1hdHJpeFdvcmxkOlQzdCxlW2ldKSxFM3QudG9BcnJheShuLDE2KmkpO251bGwhPT1pJiYoaS5uZWVkc1VwZGF0ZT0hMCl9Y2xvbmUoKXtyZXR1cm4gbmV3IEMzdCh0aGlzLmJvbmVzLHRoaXMuYm9uZUludmVyc2VzKX1jb21wdXRlQm9uZVRleHR1cmUoKXtsZXQgdD1NYXRoLnNxcnQoNCp0aGlzLmJvbmVzLmxlbmd0aCk7dD1RWnQodCksdD1NYXRoLm1heCh0LDQpO2NvbnN0IGU9bmV3IEZsb2F0MzJBcnJheSh0KnQqNCk7ZS5zZXQodGhpcy5ib25lTWF0cmljZXMpO2NvbnN0IG49bmV3IE0zdChlLHQsdCxoWnQsc1p0KTtyZXR1cm4gdGhpcy5ib25lTWF0cmljZXM9ZSx0aGlzLmJvbmVUZXh0dXJlPW4sdGhpcy5ib25lVGV4dHVyZVNpemU9dCx0aGlzfWdldEJvbmVCeU5hbWUodCl7Zm9yKGxldCBlPTAsbj10aGlzLmJvbmVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBuPXRoaXMuYm9uZXNbZV07aWYobi5uYW1lPT09dClyZXR1cm4gbn19ZGlzcG9zZSgpe251bGwhPT10aGlzLmJvbmVUZXh0dXJlJiYodGhpcy5ib25lVGV4dHVyZS5kaXNwb3NlKCksdGhpcy5ib25lVGV4dHVyZT1udWxsKX1mcm9tSlNPTih0LGUpe3RoaXMudXVpZD10LnV1aWQ7Zm9yKGxldCBuPTAsaT10LmJvbmVzLmxlbmd0aDtuPGk7bisrKXtjb25zdCBpPXQuYm9uZXNbbl07bGV0IHI9ZVtpXTt2b2lkIDA9PT1yJiYoY29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbjogTm8gYm9uZSBmb3VuZCB3aXRoIFVVSUQ6IixpKSxyPW5ldyBTM3QpLHRoaXMuYm9uZXMucHVzaChyKSx0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKChuZXcgclF0KS5mcm9tQXJyYXkodC5ib25lSW52ZXJzZXNbbl0pKX1yZXR1cm4gdGhpcy5pbml0KCksdGhpc310b0pTT04oKXtjb25zdCB0PXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiU2tlbGV0b24iLGdlbmVyYXRvcjoiU2tlbGV0b24udG9KU09OIn0sYm9uZXM6W10sYm9uZUludmVyc2VzOltdfTt0LnV1aWQ9dGhpcy51dWlkO2NvbnN0IGU9dGhpcy5ib25lcyxuPXRoaXMuYm9uZUludmVyc2VzO2ZvcihsZXQgaT0wLHI9ZS5sZW5ndGg7aTxyO2krKyl0LmJvbmVzLnB1c2goZVtpXS51dWlkKSx0LmJvbmVJbnZlcnNlcy5wdXNoKG5baV0udG9BcnJheSgpKTtyZXR1cm4gdH19Y29uc3QgQTN0PW5ldyByUXQsazN0PW5ldyByUXQsTDN0PVtdLFAzdD1uZXcgQjF0O2NsYXNzIE4zdCBleHRlbmRzIEIxdHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodCxlKSx0aGlzLmluc3RhbmNlTWF0cml4PW5ldyBRUXQobmV3IEZsb2F0MzJBcnJheSgxNipuKSwxNiksdGhpcy5pbnN0YW5jZUNvbG9yPW51bGwsdGhpcy5jb3VudD1uLHRoaXMuZnJ1c3R1bUN1bGxlZD0hMX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuaW5zdGFuY2VNYXRyaXguY29weSh0Lmluc3RhbmNlTWF0cml4KSxudWxsIT09dC5pbnN0YW5jZUNvbG9yJiYodGhpcy5pbnN0YW5jZUNvbG9yPXQuaW5zdGFuY2VDb2xvci5jbG9uZSgpKSx0aGlzLmNvdW50PXQuY291bnQsdGhpc31nZXRDb2xvckF0KHQsZSl7ZS5mcm9tQXJyYXkodGhpcy5pbnN0YW5jZUNvbG9yLmFycmF5LDMqdCl9Z2V0TWF0cml4QXQodCxlKXtlLmZyb21BcnJheSh0aGlzLmluc3RhbmNlTWF0cml4LmFycmF5LDE2KnQpfXJheWNhc3QodCxlKXtjb25zdCBuPXRoaXMubWF0cml4V29ybGQsaT10aGlzLmNvdW50O2lmKFAzdC5nZW9tZXRyeT10aGlzLmdlb21ldHJ5LFAzdC5tYXRlcmlhbD10aGlzLm1hdGVyaWFsLHZvaWQgMCE9PVAzdC5tYXRlcmlhbClmb3IobGV0IHI9MDtyPGk7cisrKXt0aGlzLmdldE1hdHJpeEF0KHIsQTN0KSxrM3QubXVsdGlwbHlNYXRyaWNlcyhuLEEzdCksUDN0Lm1hdHJpeFdvcmxkPWszdCxQM3QucmF5Y2FzdCh0LEwzdCk7Zm9yKGxldCB0PTAsbj1MM3QubGVuZ3RoO3Q8bjt0Kyspe2NvbnN0IG49TDN0W3RdO24uaW5zdGFuY2VJZD1yLG4ub2JqZWN0PXRoaXMsZS5wdXNoKG4pfUwzdC5sZW5ndGg9MH19c2V0Q29sb3JBdCh0LGUpe251bGw9PT10aGlzLmluc3RhbmNlQ29sb3ImJih0aGlzLmluc3RhbmNlQ29sb3I9bmV3IFFRdChuZXcgRmxvYXQzMkFycmF5KDMqdGhpcy5pbnN0YW5jZU1hdHJpeC5jb3VudCksMykpLGUudG9BcnJheSh0aGlzLmluc3RhbmNlQ29sb3IuYXJyYXksMyp0KX1zZXRNYXRyaXhBdCh0LGUpe2UudG9BcnJheSh0aGlzLmluc3RhbmNlTWF0cml4LmFycmF5LDE2KnQpfXVwZGF0ZU1vcnBoVGFyZ2V0cygpe31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX1OM3QucHJvdG90eXBlLmlzSW5zdGFuY2VkTWVzaD0hMDtjbGFzcyBJM3QgZXh0ZW5kcyBVUXR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9IkxpbmVCYXNpY01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyAkUXQoMTY3NzcyMTUpLHRoaXMubGluZXdpZHRoPTEsdGhpcy5saW5lY2FwPSJyb3VuZCIsdGhpcy5saW5lam9pbj0icm91bmQiLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubGluZXdpZHRoPXQubGluZXdpZHRoLHRoaXMubGluZWNhcD10LmxpbmVjYXAsdGhpcy5saW5lam9pbj10LmxpbmVqb2luLHRoaXN9fUkzdC5wcm90b3R5cGUuaXNMaW5lQmFzaWNNYXRlcmlhbD0hMDtjb25zdCBSM3Q9bmV3IENKdCxPM3Q9bmV3IENKdCx6M3Q9bmV3IHJRdCxEM3Q9bmV3IGlRdCxCM3Q9bmV3ICRKdDtjbGFzcyBIM3QgZXh0ZW5kcyBrUXR7Y29uc3RydWN0b3IodD1uZXcgYjF0LGU9bmV3IEkzdCl7c3VwZXIoKSx0aGlzLnR5cGU9IkxpbmUiLHRoaXMuZ2VvbWV0cnk9dCx0aGlzLm1hdGVyaWFsPWUsdGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMubWF0ZXJpYWw9dC5tYXRlcmlhbCx0aGlzLmdlb21ldHJ5PXQuZ2VvbWV0cnksdGhpc31jb21wdXRlTGluZURpc3RhbmNlcygpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeTtpZih0LmlzQnVmZmVyR2VvbWV0cnkpaWYobnVsbD09PXQuaW5kZXgpe2NvbnN0IGU9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLG49WzBdO2ZvcihsZXQgdD0xLGk9ZS5jb3VudDt0PGk7dCsrKVIzdC5mcm9tQnVmZmVyQXR0cmlidXRlKGUsdC0xKSxPM3QuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHQpLG5bdF09blt0LTFdLG5bdF0rPVIzdC5kaXN0YW5jZVRvKE8zdCk7dC5zZXRBdHRyaWJ1dGUoImxpbmVEaXN0YW5jZSIsbmV3IGwxdChuLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuIik7ZWxzZSB0LmlzR2VvbWV0cnkmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzfXJheWNhc3QodCxlKXtjb25zdCBuPXRoaXMuZ2VvbWV0cnksaT10aGlzLm1hdHJpeFdvcmxkLHI9dC5wYXJhbXMuTGluZS50aHJlc2hvbGQsbz1uLmRyYXdSYW5nZTtpZihudWxsPT09bi5ib3VuZGluZ1NwaGVyZSYmbi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxCM3QuY29weShuLmJvdW5kaW5nU3BoZXJlKSxCM3QuYXBwbHlNYXRyaXg0KGkpLEIzdC5yYWRpdXMrPXIsITE9PT10LnJheS5pbnRlcnNlY3RzU3BoZXJlKEIzdCkpcmV0dXJuO3ozdC5jb3B5KGkpLmludmVydCgpLEQzdC5jb3B5KHQucmF5KS5hcHBseU1hdHJpeDQoejN0KTtjb25zdCBhPXIvKCh0aGlzLnNjYWxlLngrdGhpcy5zY2FsZS55K3RoaXMuc2NhbGUueikvMykscz1hKmEsbD1uZXcgQ0p0LGM9bmV3IENKdCx1PW5ldyBDSnQsaD1uZXcgQ0p0LGQ9dGhpcy5pc0xpbmVTZWdtZW50cz8yOjE7aWYobi5pc0J1ZmZlckdlb21ldHJ5KXtjb25zdCBpPW4uaW5kZXgscj1uLmF0dHJpYnV0ZXMucG9zaXRpb247aWYobnVsbCE9PWkpZm9yKGxldCBuPU1hdGgubWF4KDAsby5zdGFydCksYT1NYXRoLm1pbihpLmNvdW50LG8uc3RhcnQrby5jb3VudCktMTtuPGE7bis9ZCl7Y29uc3Qgbz1pLmdldFgobiksYT1pLmdldFgobisxKTtpZihsLmZyb21CdWZmZXJBdHRyaWJ1dGUocixvKSxjLmZyb21CdWZmZXJBdHRyaWJ1dGUocixhKSxEM3QuZGlzdGFuY2VTcVRvU2VnbWVudChsLGMsaCx1KT5zKWNvbnRpbnVlO2guYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpO2NvbnN0IGQ9dC5yYXkub3JpZ2luLmRpc3RhbmNlVG8oaCk7ZDx0Lm5lYXJ8fGQ+dC5mYXJ8fGUucHVzaCh7ZGlzdGFuY2U6ZCxwb2ludDp1LmNsb25lKCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLGluZGV4Om4sZmFjZTpudWxsLGZhY2VJbmRleDpudWxsLG9iamVjdDp0aGlzfSl9ZWxzZSBmb3IobGV0IG49TWF0aC5tYXgoMCxvLnN0YXJ0KSxpPU1hdGgubWluKHIuY291bnQsby5zdGFydCtvLmNvdW50KS0xO248aTtuKz1kKXtpZihsLmZyb21CdWZmZXJBdHRyaWJ1dGUocixuKSxjLmZyb21CdWZmZXJBdHRyaWJ1dGUocixuKzEpLEQzdC5kaXN0YW5jZVNxVG9TZWdtZW50KGwsYyxoLHUpPnMpY29udGludWU7aC5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCk7Y29uc3QgaT10LnJheS5vcmlnaW4uZGlzdGFuY2VUbyhoKTtpPHQubmVhcnx8aT50LmZhcnx8ZS5wdXNoKHtkaXN0YW5jZTppLHBvaW50OnUuY2xvbmUoKS5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCksaW5kZXg6bixmYWNlOm51bGwsZmFjZUluZGV4Om51bGwsb2JqZWN0OnRoaXN9KX19ZWxzZSBuLmlzR2VvbWV0cnkmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLkxpbmUucmF5Y2FzdCgpIG5vIGxvbmdlciBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIil9dXBkYXRlTW9ycGhUYXJnZXRzKCl7Y29uc3QgdD10aGlzLmdlb21ldHJ5O2lmKHQuaXNCdWZmZXJHZW9tZXRyeSl7Y29uc3QgZT10Lm1vcnBoQXR0cmlidXRlcyxuPU9iamVjdC5rZXlzKGUpO2lmKG4ubGVuZ3RoPjApe2NvbnN0IHQ9ZVtuWzBdXTtpZih2b2lkIDAhPT10KXt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1bXSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT17fTtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspe2NvbnN0IG49dFtlXS5uYW1lfHxTdHJpbmcoZSk7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCgwKSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVtuXT1lfX19fWVsc2V7Y29uc3QgZT10Lm1vcnBoVGFyZ2V0czt2b2lkIDAhPT1lJiZlLmxlbmd0aD4wJiZjb25zb2xlLmVycm9yKCJUSFJFRS5MaW5lLnVwZGF0ZU1vcnBoVGFyZ2V0cygpIGRvZXMgbm90IHN1cHBvcnQgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpfX19SDN0LnByb3RvdHlwZS5pc0xpbmU9ITA7Y29uc3QgRjN0PW5ldyBDSnQsVjN0PW5ldyBDSnQ7Y2xhc3MgVTN0IGV4dGVuZHMgSDN0e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLnR5cGU9IkxpbmVTZWdtZW50cyJ9Y29tcHV0ZUxpbmVEaXN0YW5jZXMoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnk7aWYodC5pc0J1ZmZlckdlb21ldHJ5KWlmKG51bGw9PT10LmluZGV4KXtjb25zdCBlPXQuYXR0cmlidXRlcy5wb3NpdGlvbixuPVtdO2ZvcihsZXQgdD0wLGk9ZS5jb3VudDt0PGk7dCs9MilGM3QuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHQpLFYzdC5mcm9tQnVmZmVyQXR0cmlidXRlKGUsdCsxKSxuW3RdPTA9PT10PzA6blt0LTFdLG5bdCsxXT1uW3RdK0YzdC5kaXN0YW5jZVRvKFYzdCk7dC5zZXRBdHRyaWJ1dGUoImxpbmVEaXN0YW5jZSIsbmV3IGwxdChuLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZVNlZ21lbnRzLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4iKTtlbHNlIHQuaXNHZW9tZXRyeSYmY29uc29sZS5lcnJvcigiVEhSRUUuTGluZVNlZ21lbnRzLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCkgbm8gbG9uZ2VyIHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpc319VTN0LnByb3RvdHlwZS5pc0xpbmVTZWdtZW50cz0hMDtjbGFzcyBqM3QgZXh0ZW5kcyBIM3R7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpLHRoaXMudHlwZT0iTGluZUxvb3AifX1qM3QucHJvdG90eXBlLmlzTGluZUxvb3A9ITA7Y2xhc3MgRzN0IGV4dGVuZHMgVVF0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy50eXBlPSJQb2ludHNNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgJFF0KDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLnNpemU9MSx0aGlzLnNpemVBdHRlbnVhdGlvbj0hMCx0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSx0aGlzLm1hcD10Lm1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5zaXplPXQuc2l6ZSx0aGlzLnNpemVBdHRlbnVhdGlvbj10LnNpemVBdHRlbnVhdGlvbix0aGlzfX1HM3QucHJvdG90eXBlLmlzUG9pbnRzTWF0ZXJpYWw9ITA7Y29uc3QgVzN0PW5ldyByUXQscTN0PW5ldyBpUXQsWTN0PW5ldyAkSnQsWDN0PW5ldyBDSnQ7Y2xhc3MgJDN0IGV4dGVuZHMga1F0e2NvbnN0cnVjdG9yKHQ9bmV3IGIxdCxlPW5ldyBHM3Qpe3N1cGVyKCksdGhpcy50eXBlPSJQb2ludHMiLHRoaXMuZ2VvbWV0cnk9dCx0aGlzLm1hdGVyaWFsPWUsdGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMubWF0ZXJpYWw9dC5tYXRlcmlhbCx0aGlzLmdlb21ldHJ5PXQuZ2VvbWV0cnksdGhpc31yYXljYXN0KHQsZSl7Y29uc3Qgbj10aGlzLmdlb21ldHJ5LGk9dGhpcy5tYXRyaXhXb3JsZCxyPXQucGFyYW1zLlBvaW50cy50aHJlc2hvbGQsbz1uLmRyYXdSYW5nZTtpZihudWxsPT09bi5ib3VuZGluZ1NwaGVyZSYmbi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxZM3QuY29weShuLmJvdW5kaW5nU3BoZXJlKSxZM3QuYXBwbHlNYXRyaXg0KGkpLFkzdC5yYWRpdXMrPXIsITE9PT10LnJheS5pbnRlcnNlY3RzU3BoZXJlKFkzdCkpcmV0dXJuO1czdC5jb3B5KGkpLmludmVydCgpLHEzdC5jb3B5KHQucmF5KS5hcHBseU1hdHJpeDQoVzN0KTtjb25zdCBhPXIvKCh0aGlzLnNjYWxlLngrdGhpcy5zY2FsZS55K3RoaXMuc2NhbGUueikvMykscz1hKmE7aWYobi5pc0J1ZmZlckdlb21ldHJ5KXtjb25zdCByPW4uaW5kZXgsYT1uLmF0dHJpYnV0ZXMucG9zaXRpb247aWYobnVsbCE9PXIpZm9yKGxldCBuPU1hdGgubWF4KDAsby5zdGFydCksbD1NYXRoLm1pbihyLmNvdW50LG8uc3RhcnQrby5jb3VudCk7bjxsO24rKyl7Y29uc3Qgbz1yLmdldFgobik7WDN0LmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxvKSxLM3QoWDN0LG8scyxpLHQsZSx0aGlzKX1lbHNlIGZvcihsZXQgbj1NYXRoLm1heCgwLG8uc3RhcnQpLHI9TWF0aC5taW4oYS5jb3VudCxvLnN0YXJ0K28uY291bnQpO248cjtuKyspWDN0LmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxuKSxLM3QoWDN0LG4scyxpLHQsZSx0aGlzKX1lbHNlIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlBvaW50cy5yYXljYXN0KCkgbm8gbG9uZ2VyIHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKX11cGRhdGVNb3JwaFRhcmdldHMoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnk7aWYodC5pc0J1ZmZlckdlb21ldHJ5KXtjb25zdCBlPXQubW9ycGhBdHRyaWJ1dGVzLG49T2JqZWN0LmtleXMoZSk7aWYobi5sZW5ndGg+MCl7Y29uc3QgdD1lW25bMF1dO2lmKHZvaWQgMCE9PXQpe3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPVtdLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXt9O2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgbj10W2VdLm5hbWV8fFN0cmluZyhlKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W25dPWV9fX19ZWxzZXtjb25zdCBlPXQubW9ycGhUYXJnZXRzO3ZvaWQgMCE9PWUmJmUubGVuZ3RoPjAmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLlBvaW50cy51cGRhdGVNb3JwaFRhcmdldHMoKSBkb2VzIG5vdCBzdXBwb3J0IFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKX19fWZ1bmN0aW9uIEszdCh0LGUsbixpLHIsbyxhKXtjb25zdCBzPXEzdC5kaXN0YW5jZVNxVG9Qb2ludCh0KTtpZihzPG4pe2NvbnN0IG49bmV3IENKdDtxM3QuY2xvc2VzdFBvaW50VG9Qb2ludCh0LG4pLG4uYXBwbHlNYXRyaXg0KGkpO2NvbnN0IGw9ci5yYXkub3JpZ2luLmRpc3RhbmNlVG8obik7aWYobDxyLm5lYXJ8fGw+ci5mYXIpcmV0dXJuO28ucHVzaCh7ZGlzdGFuY2U6bCxkaXN0YW5jZVRvUmF5Ok1hdGguc3FydChzKSxwb2ludDpuLGluZGV4OmUsZmFjZTpudWxsLG9iamVjdDphfSl9fSQzdC5wcm90b3R5cGUuaXNQb2ludHM9ITA7Y2xhc3MgWjN0IGV4dGVuZHMgYkp0e2NvbnN0cnVjdG9yKHQsZSxuLGkscixvLGEscyxsKXtzdXBlcih0LGUsbixpLHIsbyxhLHMsbCksdGhpcy5mb3JtYXQ9dm9pZCAwIT09YT9hOnVadCx0aGlzLm1pbkZpbHRlcj12b2lkIDAhPT1vP286ZVp0LHRoaXMubWFnRmlsdGVyPXZvaWQgMCE9PXI/cjplWnQsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITE7Y29uc3QgYz10aGlzOyJyZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrImluIHQmJnQucmVxdWVzdFZpZGVvRnJhbWVDYWxsYmFjaygoZnVuY3Rpb24gZSgpe2MubmVlZHNVcGRhdGU9ITAsdC5yZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrKGUpfSkpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuaW1hZ2UpLmNvcHkodGhpcyl9dXBkYXRlKCl7Y29uc3QgdD10aGlzLmltYWdlOzA9PSJyZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrImluIHQmJnQucmVhZHlTdGF0ZT49dC5IQVZFX0NVUlJFTlRfREFUQSYmKHRoaXMubmVlZHNVcGRhdGU9ITApfX1aM3QucHJvdG90eXBlLmlzVmlkZW9UZXh0dXJlPSEwO2NsYXNzIEozdCBleHRlbmRzIGJKdHtjb25zdHJ1Y3Rvcih0LGUsbixpLHIsbyxhLHMsbCxjLHUsaCl7c3VwZXIobnVsbCxvLGEscyxsLGMsaSxyLHUsaCksdGhpcy5pbWFnZT17d2lkdGg6ZSxoZWlnaHQ6bn0sdGhpcy5taXBtYXBzPXQsdGhpcy5mbGlwWT0hMSx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX19SjN0LnByb3RvdHlwZS5pc0NvbXByZXNzZWRUZXh0dXJlPSEwO2NsYXNzIFEzdCBleHRlbmRzIGJKdHtjb25zdHJ1Y3Rvcih0LGUsbixpLHIsbyxhLHMsbCl7c3VwZXIodCxlLG4saSxyLG8sYSxzLGwpLHRoaXMubmVlZHNVcGRhdGU9ITB9fVEzdC5wcm90b3R5cGUuaXNDYW52YXNUZXh0dXJlPSEwO2NsYXNzIHQ0dCBleHRlbmRzIGJKdHtjb25zdHJ1Y3Rvcih0LGUsbixpLHIsbyxhLHMsbCxjKXtpZigoYz12b2lkIDAhPT1jP2M6ZFp0KSE9PWRadCYmYyE9PXBadCl0aHJvdyBuZXcgRXJyb3IoIkRlcHRoVGV4dHVyZSBmb3JtYXQgbXVzdCBiZSBlaXRoZXIgVEhSRUUuRGVwdGhGb3JtYXQgb3IgVEhSRUUuRGVwdGhTdGVuY2lsRm9ybWF0Iik7dm9pZCAwPT09biYmYz09PWRadCYmKG49b1p0KSx2b2lkIDA9PT1uJiZjPT09cFp0JiYobj1jWnQpLHN1cGVyKG51bGwsaSxyLG8sYSxzLGMsbixsKSx0aGlzLmltYWdlPXt3aWR0aDp0LGhlaWdodDplfSx0aGlzLm1hZ0ZpbHRlcj12b2lkIDAhPT1hP2E6Skt0LHRoaXMubWluRmlsdGVyPXZvaWQgMCE9PXM/czpKS3QsdGhpcy5mbGlwWT0hMSx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX19dDR0LnByb3RvdHlwZS5pc0RlcHRoVGV4dHVyZT0hMDtjbGFzcyBlNHQgZXh0ZW5kcyBiMXR7Y29uc3RydWN0b3IodD0xLGU9OCxuPTAsaT0yKk1hdGguUEkpe3N1cGVyKCksdGhpcy50eXBlPSJDaXJjbGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6dCxzZWdtZW50czplLHRoZXRhU3RhcnQ6bix0aGV0YUxlbmd0aDppfSxlPU1hdGgubWF4KDMsZSk7Y29uc3Qgcj1bXSxvPVtdLGE9W10scz1bXSxsPW5ldyBDSnQsYz1uZXcgbUp0O28ucHVzaCgwLDAsMCksYS5wdXNoKDAsMCwxKSxzLnB1c2goLjUsLjUpO2ZvcihsZXQgcj0wLHU9MztyPD1lO3IrKyx1Kz0zKXtjb25zdCBoPW4rci9lKmk7bC54PXQqTWF0aC5jb3MoaCksbC55PXQqTWF0aC5zaW4oaCksby5wdXNoKGwueCxsLnksbC56KSxhLnB1c2goMCwwLDEpLGMueD0ob1t1XS90KzEpLzIsYy55PShvW3UrMV0vdCsxKS8yLHMucHVzaChjLngsYy55KX1mb3IobGV0IHQ9MTt0PD1lO3QrKylyLnB1c2godCx0KzEsMCk7dGhpcy5zZXRJbmRleChyKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBsMXQobywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGwxdChhLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBsMXQocywyKSl9c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgZTR0KHQucmFkaXVzLHQuc2VnbWVudHMsdC50aGV0YVN0YXJ0LHQudGhldGFMZW5ndGgpfX1jbGFzcyBuNHQgZXh0ZW5kcyBiMXR7Y29uc3RydWN0b3IodD0xLGU9MSxuPTEsaT04LHI9MSxvPSExLGE9MCxzPTIqTWF0aC5QSSl7c3VwZXIoKSx0aGlzLnR5cGU9IkN5bGluZGVyR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzVG9wOnQscmFkaXVzQm90dG9tOmUsaGVpZ2h0Om4scmFkaWFsU2VnbWVudHM6aSxoZWlnaHRTZWdtZW50czpyLG9wZW5FbmRlZDpvLHRoZXRhU3RhcnQ6YSx0aGV0YUxlbmd0aDpzfTtjb25zdCBsPXRoaXM7aT1NYXRoLmZsb29yKGkpLHI9TWF0aC5mbG9vcihyKTtjb25zdCBjPVtdLHU9W10saD1bXSxkPVtdO2xldCBwPTA7Y29uc3QgZj1bXSxtPW4vMjtsZXQgZz0wO2Z1bmN0aW9uIF8obil7Y29uc3Qgcj1wLG89bmV3IG1KdCxmPW5ldyBDSnQ7bGV0IF89MDtjb25zdCB5PSEwPT09bj90OmUsdj0hMD09PW4/MTotMTtmb3IobGV0IHQ9MTt0PD1pO3QrKyl1LnB1c2goMCxtKnYsMCksaC5wdXNoKDAsdiwwKSxkLnB1c2goLjUsLjUpLHArKztjb25zdCBiPXA7Zm9yKGxldCB0PTA7dDw9aTt0Kyspe2NvbnN0IGU9dC9pKnMrYSxuPU1hdGguY29zKGUpLHI9TWF0aC5zaW4oZSk7Zi54PXkqcixmLnk9bSp2LGYuej15Km4sdS5wdXNoKGYueCxmLnksZi56KSxoLnB1c2goMCx2LDApLG8ueD0uNSpuKy41LG8ueT0uNSpyKnYrLjUsZC5wdXNoKG8ueCxvLnkpLHArK31mb3IobGV0IHQ9MDt0PGk7dCsrKXtjb25zdCBlPXIrdCxpPWIrdDshMD09PW4/Yy5wdXNoKGksaSsxLGUpOmMucHVzaChpKzEsaSxlKSxfKz0zfWwuYWRkR3JvdXAoZyxfLCEwPT09bj8xOjIpLGcrPV99IShmdW5jdGlvbiB5KCl7Y29uc3Qgbz1uZXcgQ0p0LF89bmV3IENKdDtsZXQgeT0wO2NvbnN0IHY9KGUtdCkvbjtmb3IobGV0IGw9MDtsPD1yO2wrKyl7Y29uc3QgYz1bXSxnPWwvcix5PWcqKGUtdCkrdDtmb3IobGV0IHQ9MDt0PD1pO3QrKyl7Y29uc3QgZT10L2kscj1lKnMrYSxsPU1hdGguc2luKHIpLGY9TWF0aC5jb3Mocik7Xy54PXkqbCxfLnk9LWcqbittLF8uej15KmYsdS5wdXNoKF8ueCxfLnksXy56KSxvLnNldChsLHYsZikubm9ybWFsaXplKCksaC5wdXNoKG8ueCxvLnksby56KSxkLnB1c2goZSwxLWcpLGMucHVzaChwKyspfWYucHVzaChjKX1mb3IobGV0IHQ9MDt0PGk7dCsrKWZvcihsZXQgZT0wO2U8cjtlKyspe2NvbnN0IG49ZltlKzFdW3RdLGk9ZltlKzFdW3QrMV0scj1mW2VdW3QrMV07Yy5wdXNoKGZbZV1bdF0sbixyKSxjLnB1c2gobixpLHIpLHkrPTZ9bC5hZGRHcm91cChnLHksMCksZys9eX0pKCksITE9PT1vJiYodD4wJiZfKCEwKSxlPjAmJl8oITEpKSx0aGlzLnNldEluZGV4KGMpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGwxdCh1LDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgbDF0KGgsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IGwxdChkLDIpKX1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBuNHQodC5yYWRpdXNUb3AsdC5yYWRpdXNCb3R0b20sdC5oZWlnaHQsdC5yYWRpYWxTZWdtZW50cyx0LmhlaWdodFNlZ21lbnRzLHQub3BlbkVuZGVkLHQudGhldGFTdGFydCx0LnRoZXRhTGVuZ3RoKX19Y2xhc3MgaTR0IGV4dGVuZHMgbjR0e2NvbnN0cnVjdG9yKHQ9MSxlPTEsbj04LGk9MSxyPSExLG89MCxhPTIqTWF0aC5QSSl7c3VwZXIoMCx0LGUsbixpLHIsbyxhKSx0aGlzLnR5cGU9IkNvbmVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6dCxoZWlnaHQ6ZSxyYWRpYWxTZWdtZW50czpuLGhlaWdodFNlZ21lbnRzOmksb3BlbkVuZGVkOnIsdGhldGFTdGFydDpvLHRoZXRhTGVuZ3RoOmF9fXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IGk0dCh0LnJhZGl1cyx0LmhlaWdodCx0LnJhZGlhbFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMsdC5vcGVuRW5kZWQsdC50aGV0YVN0YXJ0LHQudGhldGFMZW5ndGgpfX1jbGFzcyByNHQgZXh0ZW5kcyBiMXR7Y29uc3RydWN0b3IodCxlLG49MSxpPTApe3N1cGVyKCksdGhpcy50eXBlPSJQb2x5aGVkcm9uR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17dmVydGljZXM6dCxpbmRpY2VzOmUscmFkaXVzOm4sZGV0YWlsOml9O2NvbnN0IHI9W10sbz1bXTtmdW5jdGlvbiBhKHQsZSxuLGkpe2NvbnN0IHI9aSsxLG89W107Zm9yKGxldCBpPTA7aTw9cjtpKyspe29baV09W107Y29uc3QgYT10LmNsb25lKCkubGVycChuLGkvcikscz1lLmNsb25lKCkubGVycChuLGkvciksbD1yLWk7Zm9yKGxldCB0PTA7dDw9bDt0Kyspb1tpXVt0XT0wPT09dCYmaT09PXI/YTphLmNsb25lKCkubGVycChzLHQvbCl9Zm9yKGxldCB0PTA7dDxyO3QrKylmb3IobGV0IGU9MDtlPDIqKHItdCktMTtlKyspe2NvbnN0IG49TWF0aC5mbG9vcihlLzIpO2UlMj09MD8ocyhvW3RdW24rMV0pLHMob1t0KzFdW25dKSxzKG9bdF1bbl0pKToocyhvW3RdW24rMV0pLHMob1t0KzFdW24rMV0pLHMob1t0KzFdW25dKSl9fWZ1bmN0aW9uIHModCl7ci5wdXNoKHQueCx0LnksdC56KX1mdW5jdGlvbiBsKGUsbil7Y29uc3QgaT0zKmU7bi54PXRbaSswXSxuLnk9dFtpKzFdLG4uej10W2krMl19ZnVuY3Rpb24gYyh0LGUsbixpKXtpPDAmJjE9PT10LngmJihvW2VdPXQueC0xKSwwPT09bi54JiYwPT09bi56JiYob1tlXT1pLzIvTWF0aC5QSSsuNSl9ZnVuY3Rpb24gdSh0KXtyZXR1cm4gTWF0aC5hdGFuMih0LnosLXQueCl9IShmdW5jdGlvbiBoKHQpe2NvbnN0IG49bmV3IENKdCxpPW5ldyBDSnQscj1uZXcgQ0p0O2ZvcihsZXQgbz0wO288ZS5sZW5ndGg7bys9MylsKGVbbyswXSxuKSxsKGVbbysxXSxpKSxsKGVbbysyXSxyKSxhKG4saSxyLHQpfSkoaSksKGZ1bmN0aW9uIGQodCl7Y29uc3QgZT1uZXcgQ0p0O2ZvcihsZXQgbj0wO248ci5sZW5ndGg7bis9MyllLng9cltuKzBdLGUueT1yW24rMV0sZS56PXJbbisyXSxlLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpLHJbbiswXT1lLngscltuKzFdPWUueSxyW24rMl09ZS56fSkobiksKGZ1bmN0aW9uIHAoKXtjb25zdCB0PW5ldyBDSnQ7Zm9yKGxldCBuPTA7bjxyLmxlbmd0aDtuKz0zKXt0Lng9cltuKzBdLHQueT1yW24rMV0sdC56PXJbbisyXTtjb25zdCBpPXUodCkvMi9NYXRoLlBJKy41LGE9KGU9dCxNYXRoLmF0YW4yKC1lLnksTWF0aC5zcXJ0KGUueCplLngrZS56KmUueikpL01hdGguUEkrLjUpO28ucHVzaChpLDEtYSl9dmFyIGU7KGZ1bmN0aW9uIG4oKXtjb25zdCB0PW5ldyBDSnQsZT1uZXcgQ0p0LG49bmV3IENKdCxpPW5ldyBDSnQsYT1uZXcgbUp0LHM9bmV3IG1KdCxsPW5ldyBtSnQ7Zm9yKGxldCBoPTAsZD0wO2g8ci5sZW5ndGg7aCs9OSxkKz02KXt0LnNldChyW2grMF0scltoKzFdLHJbaCsyXSksZS5zZXQocltoKzNdLHJbaCs0XSxyW2grNV0pLG4uc2V0KHJbaCs2XSxyW2grN10scltoKzhdKSxhLnNldChvW2QrMF0sb1tkKzFdKSxzLnNldChvW2QrMl0sb1tkKzNdKSxsLnNldChvW2QrNF0sb1tkKzVdKSxpLmNvcHkodCkuYWRkKGUpLmFkZChuKS5kaXZpZGVTY2FsYXIoMyk7Y29uc3QgcD11KGkpO2MoYSxkKzAsdCxwKSxjKHMsZCsyLGUscCksYyhsLGQrNCxuLHApfX0pKCksKGZ1bmN0aW9uIGkoKXtmb3IobGV0IHQ9MDt0PG8ubGVuZ3RoO3QrPTYpe2NvbnN0IGU9b1t0KzBdLG49b1t0KzJdLGk9b1t0KzRdLHI9TWF0aC5tYXgoZSxuLGkpLGE9TWF0aC5taW4oZSxuLGkpO3I+LjkmJmE8LjEmJihlPC4yJiYob1t0KzBdKz0xKSxuPC4yJiYob1t0KzJdKz0xKSxpPC4yJiYob1t0KzRdKz0xKSl9fSkoKX0pKCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KHIsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBsMXQoci5zbGljZSgpLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBsMXQobywyKSksMD09PWk/dGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpOnRoaXMubm9ybWFsaXplTm9ybWFscygpfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IHI0dCh0LnZlcnRpY2VzLHQuaW5kaWNlcyx0LnJhZGl1cyx0LmRldGFpbHMpfX1jbGFzcyBvNHQgZXh0ZW5kcyByNHR7Y29uc3RydWN0b3IodD0xLGU9MCl7Y29uc3Qgbj0oMStNYXRoLnNxcnQoNSkpLzIsaT0xL247c3VwZXIoWy0xLC0xLC0xLC0xLC0xLDEsLTEsMSwtMSwtMSwxLDEsMSwtMSwtMSwxLC0xLDEsMSwxLC0xLDEsMSwxLDAsLWksLW4sMCwtaSxuLDAsaSwtbiwwLGksbiwtaSwtbiwwLC1pLG4sMCxpLC1uLDAsaSxuLDAsLW4sMCwtaSxuLDAsLWksLW4sMCxpLG4sMCxpXSxbMywxMSw3LDMsNywxNSwzLDE1LDEzLDcsMTksMTcsNywxNyw2LDcsNiwxNSwxNyw0LDgsMTcsOCwxMCwxNywxMCw2LDgsMCwxNiw4LDE2LDIsOCwyLDEwLDAsMTIsMSwwLDEsMTgsMCwxOCwxNiw2LDEwLDIsNiwyLDEzLDYsMTMsMTUsMiwxNiwxOCwyLDE4LDMsMiwzLDEzLDE4LDEsOSwxOCw5LDExLDE4LDExLDMsNCwxNCwxMiw0LDEyLDAsNCwwLDgsMTEsOSw1LDExLDUsMTksMTEsMTksNywxOSw1LDE0LDE5LDE0LDQsMTksNCwxNywxLDEyLDE0LDEsMTQsNSwxLDUsOV0sdCxlKSx0aGlzLnR5cGU9IkRvZGVjYWhlZHJvbkdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czp0LGRldGFpbDplfX1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBvNHQodC5yYWRpdXMsdC5kZXRhaWwpfX1jb25zdCBhNHQ9bmV3IENKdCxzNHQ9bmV3IENKdCxsNHQ9bmV3IENKdCxjNHQ9bmV3IEZRdDtjbGFzcyB1NHQgZXh0ZW5kcyBiMXR7Y29uc3RydWN0b3IodCxlKXtpZihzdXBlcigpLHRoaXMudHlwZT0iRWRnZXNHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXt0aHJlc2hvbGRBbmdsZTplfSxlPXZvaWQgMCE9PWU/ZToxLCEwPT09dC5pc0dlb21ldHJ5KXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkVkZ2VzR2VvbWV0cnkgbm8gbG9uZ2VyIHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKTtjb25zdCBuPU1hdGguY29zKHFadCplKSxpPXQuZ2V0SW5kZXgoKSxyPXQuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLG89aT9pLmNvdW50OnIuY291bnQsYT1bMCwwLDBdLHM9WyJhIiwiYiIsImMiXSxsPW5ldyBBcnJheSgzKSxjPXt9LHU9W107Zm9yKGxldCB0PTA7dDxvO3QrPTMpe2k/KGFbMF09aS5nZXRYKHQpLGFbMV09aS5nZXRYKHQrMSksYVsyXT1pLmdldFgodCsyKSk6KGFbMF09dCxhWzFdPXQrMSxhWzJdPXQrMik7Y29uc3R7YTplLGI6byxjOmh9PWM0dDtpZihlLmZyb21CdWZmZXJBdHRyaWJ1dGUocixhWzBdKSxvLmZyb21CdWZmZXJBdHRyaWJ1dGUocixhWzFdKSxoLmZyb21CdWZmZXJBdHRyaWJ1dGUocixhWzJdKSxjNHQuZ2V0Tm9ybWFsKGw0dCksbFswXT1gJHtlLnh9LCR7ZS55fSwke2Uuen1gLGxbMV09YCR7by54fSwke28ueX0sJHtvLnp9YCxsWzJdPWAke2gueH0sJHtoLnl9LCR7aC56fWAsbFswXSE9PWxbMV0mJmxbMV0hPT1sWzJdJiZsWzJdIT09bFswXSlmb3IobGV0IHQ9MDt0PDM7dCsrKXtjb25zdCBlPSh0KzEpJTMsaT1sW3RdLHI9bFtlXSxvPWM0dFtzW3RdXSxoPWM0dFtzW2VdXSxkPWAke2l9XyR7cn1gLHA9YCR7cn1fJHtpfWA7cCBpbiBjJiZjW3BdPyhsNHQuZG90KGNbcF0ubm9ybWFsKTw9biYmKHUucHVzaChvLngsby55LG8ueiksdS5wdXNoKGgueCxoLnksaC56KSksY1twXT1udWxsKTpkIGluIGN8fChjW2RdPXtpbmRleDA6YVt0XSxpbmRleDE6YVtlXSxub3JtYWw6bDR0LmNsb25lKCl9KX19Zm9yKGNvbnN0IHQgaW4gYylpZihjW3RdKXtjb25zdHtpbmRleDA6ZSxpbmRleDE6bn09Y1t0XTthNHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLGUpLHM0dC5mcm9tQnVmZmVyQXR0cmlidXRlKHIsbiksdS5wdXNoKGE0dC54LGE0dC55LGE0dC56KSx1LnB1c2goczR0LngsczR0LnksczR0LnopfXRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGwxdCh1LDMpKX19Y2xhc3MgaDR0e2NvbnN0cnVjdG9yKCl7dGhpcy50eXBlPSJDdXJ2ZSIsdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9MjAwfWdldFBvaW50KCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRlZC4iKSxudWxsfWdldFBvaW50QXQodCxlKXtjb25zdCBuPXRoaXMuZ2V0VXRvVG1hcHBpbmcodCk7cmV0dXJuIHRoaXMuZ2V0UG9pbnQobixlKX1nZXRQb2ludHModD01KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248PXQ7bisrKWUucHVzaCh0aGlzLmdldFBvaW50KG4vdCkpO3JldHVybiBlfWdldFNwYWNlZFBvaW50cyh0PTUpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjw9dDtuKyspZS5wdXNoKHRoaXMuZ2V0UG9pbnRBdChuL3QpKTtyZXR1cm4gZX1nZXRMZW5ndGgoKXtjb25zdCB0PXRoaXMuZ2V0TGVuZ3RocygpO3JldHVybiB0W3QubGVuZ3RoLTFdfWdldExlbmd0aHModD10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyl7aWYodGhpcy5jYWNoZUFyY0xlbmd0aHMmJnRoaXMuY2FjaGVBcmNMZW5ndGhzLmxlbmd0aD09PXQrMSYmIXRoaXMubmVlZHNVcGRhdGUpcmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzO3RoaXMubmVlZHNVcGRhdGU9ITE7Y29uc3QgZT1bXTtsZXQgbixpPXRoaXMuZ2V0UG9pbnQoMCkscj0wO2UucHVzaCgwKTtmb3IobGV0IG89MTtvPD10O28rKyluPXRoaXMuZ2V0UG9pbnQoby90KSxyKz1uLmRpc3RhbmNlVG8oaSksZS5wdXNoKHIpLGk9bjtyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM9ZSxlfXVwZGF0ZUFyY0xlbmd0aHMoKXt0aGlzLm5lZWRzVXBkYXRlPSEwLHRoaXMuZ2V0TGVuZ3RocygpfWdldFV0b1RtYXBwaW5nKHQsZSl7Y29uc3Qgbj10aGlzLmdldExlbmd0aHMoKTtsZXQgaT0wO2NvbnN0IHI9bi5sZW5ndGg7bGV0IG87bz1lfHx0Km5bci0xXTtsZXQgYSxzPTAsbD1yLTE7Zm9yKDtzPD1sOylpZihpPU1hdGguZmxvb3IocysobC1zKS8yKSxhPW5baV0tbyxhPDApcz1pKzE7ZWxzZXtpZighKGE+MCkpe2w9aTticmVha31sPWktMX1pZihpPWwsbltpXT09PW8pcmV0dXJuIGkvKHItMSk7Y29uc3QgYz1uW2ldO3JldHVybihpKyhvLWMpLyhuW2krMV0tYykpLyhyLTEpfWdldFRhbmdlbnQodCxlKXtjb25zdCBuPTFlLTQ7bGV0IGk9dC1uLHI9dCtuO2k8MCYmKGk9MCkscj4xJiYocj0xKTtjb25zdCBvPXRoaXMuZ2V0UG9pbnQoaSksYT10aGlzLmdldFBvaW50KHIpLHM9ZXx8KG8uaXNWZWN0b3IyP25ldyBtSnQ6bmV3IENKdCk7cmV0dXJuIHMuY29weShhKS5zdWIobykubm9ybWFsaXplKCksc31nZXRUYW5nZW50QXQodCxlKXtjb25zdCBuPXRoaXMuZ2V0VXRvVG1hcHBpbmcodCk7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudChuLGUpfWNvbXB1dGVGcmVuZXRGcmFtZXModCxlKXtjb25zdCBuPW5ldyBDSnQsaT1bXSxyPVtdLG89W10sYT1uZXcgQ0p0LHM9bmV3IHJRdDtmb3IobGV0IGU9MDtlPD10O2UrKylpW2VdPXRoaXMuZ2V0VGFuZ2VudEF0KGUvdCxuZXcgQ0p0KSxpW2VdLm5vcm1hbGl6ZSgpO3JbMF09bmV3IENKdCxvWzBdPW5ldyBDSnQ7bGV0IGw9TnVtYmVyLk1BWF9WQUxVRTtjb25zdCBjPU1hdGguYWJzKGlbMF0ueCksdT1NYXRoLmFicyhpWzBdLnkpLGg9TWF0aC5hYnMoaVswXS56KTtjPD1sJiYobD1jLG4uc2V0KDEsMCwwKSksdTw9bCYmKGw9dSxuLnNldCgwLDEsMCkpLGg8PWwmJm4uc2V0KDAsMCwxKSxhLmNyb3NzVmVjdG9ycyhpWzBdLG4pLm5vcm1hbGl6ZSgpLHJbMF0uY3Jvc3NWZWN0b3JzKGlbMF0sYSksb1swXS5jcm9zc1ZlY3RvcnMoaVswXSxyWzBdKTtmb3IobGV0IGU9MTtlPD10O2UrKyl7aWYocltlXT1yW2UtMV0uY2xvbmUoKSxvW2VdPW9bZS0xXS5jbG9uZSgpLGEuY3Jvc3NWZWN0b3JzKGlbZS0xXSxpW2VdKSxhLmxlbmd0aCgpPk51bWJlci5FUFNJTE9OKXthLm5vcm1hbGl6ZSgpO2NvbnN0IHQ9TWF0aC5hY29zKCRadChpW2UtMV0uZG90KGlbZV0pLC0xLDEpKTtyW2VdLmFwcGx5TWF0cml4NChzLm1ha2VSb3RhdGlvbkF4aXMoYSx0KSl9b1tlXS5jcm9zc1ZlY3RvcnMoaVtlXSxyW2VdKX1pZighMD09PWUpe2xldCBlPU1hdGguYWNvcygkWnQoclswXS5kb3Qoclt0XSksLTEsMSkpO2UvPXQsaVswXS5kb3QoYS5jcm9zc1ZlY3RvcnMoclswXSxyW3RdKSk+MCYmKGU9LWUpO2ZvcihsZXQgbj0xO248PXQ7bisrKXJbbl0uYXBwbHlNYXRyaXg0KHMubWFrZVJvdGF0aW9uQXhpcyhpW25dLGUqbikpLG9bbl0uY3Jvc3NWZWN0b3JzKGlbbl0scltuXSl9cmV0dXJue3RhbmdlbnRzOmksbm9ybWFsczpyLGJpbm9ybWFsczpvfX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz10LmFyY0xlbmd0aERpdmlzaW9ucyx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNSx0eXBlOiJDdXJ2ZSIsZ2VuZXJhdG9yOiJDdXJ2ZS50b0pTT04ifX07cmV0dXJuIHQuYXJjTGVuZ3RoRGl2aXNpb25zPXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zLHQudHlwZT10aGlzLnR5cGUsdH1mcm9tSlNPTih0KXtyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9dC5hcmNMZW5ndGhEaXZpc2lvbnMsdGhpc319Y2xhc3MgZDR0IGV4dGVuZHMgaDR0e2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0xLGk9MSxyPTAsbz0yKk1hdGguUEksYT0hMSxzPTApe3N1cGVyKCksdGhpcy50eXBlPSJFbGxpcHNlQ3VydmUiLHRoaXMuYVg9dCx0aGlzLmFZPWUsdGhpcy54UmFkaXVzPW4sdGhpcy55UmFkaXVzPWksdGhpcy5hU3RhcnRBbmdsZT1yLHRoaXMuYUVuZEFuZ2xlPW8sdGhpcy5hQ2xvY2t3aXNlPWEsdGhpcy5hUm90YXRpb249c31nZXRQb2ludCh0LGUpe2NvbnN0IG49ZXx8bmV3IG1KdCxpPTIqTWF0aC5QSTtsZXQgcj10aGlzLmFFbmRBbmdsZS10aGlzLmFTdGFydEFuZ2xlO2NvbnN0IG89TWF0aC5hYnMocik8TnVtYmVyLkVQU0lMT047Zm9yKDtyPDA7KXIrPWk7Zm9yKDtyPmk7KXItPWk7cjxOdW1iZXIuRVBTSUxPTiYmKHI9bz8wOmkpLCEwIT09dGhpcy5hQ2xvY2t3aXNlfHxvfHwocj09PWk/cj0taTpyLT1pKTtjb25zdCBhPXRoaXMuYVN0YXJ0QW5nbGUrdCpyO2xldCBzPXRoaXMuYVgrdGhpcy54UmFkaXVzKk1hdGguY29zKGEpLGw9dGhpcy5hWSt0aGlzLnlSYWRpdXMqTWF0aC5zaW4oYSk7aWYoMCE9PXRoaXMuYVJvdGF0aW9uKXtjb25zdCB0PU1hdGguY29zKHRoaXMuYVJvdGF0aW9uKSxlPU1hdGguc2luKHRoaXMuYVJvdGF0aW9uKSxuPXMtdGhpcy5hWCxpPWwtdGhpcy5hWTtzPW4qdC1pKmUrdGhpcy5hWCxsPW4qZStpKnQrdGhpcy5hWX1yZXR1cm4gbi5zZXQocyxsKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuYVg9dC5hWCx0aGlzLmFZPXQuYVksdGhpcy54UmFkaXVzPXQueFJhZGl1cyx0aGlzLnlSYWRpdXM9dC55UmFkaXVzLHRoaXMuYVN0YXJ0QW5nbGU9dC5hU3RhcnRBbmdsZSx0aGlzLmFFbmRBbmdsZT10LmFFbmRBbmdsZSx0aGlzLmFDbG9ja3dpc2U9dC5hQ2xvY2t3aXNlLHRoaXMuYVJvdGF0aW9uPXQuYVJvdGF0aW9uLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5hWD10aGlzLmFYLHQuYVk9dGhpcy5hWSx0LnhSYWRpdXM9dGhpcy54UmFkaXVzLHQueVJhZGl1cz10aGlzLnlSYWRpdXMsdC5hU3RhcnRBbmdsZT10aGlzLmFTdGFydEFuZ2xlLHQuYUVuZEFuZ2xlPXRoaXMuYUVuZEFuZ2xlLHQuYUNsb2Nrd2lzZT10aGlzLmFDbG9ja3dpc2UsdC5hUm90YXRpb249dGhpcy5hUm90YXRpb24sdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy5hWD10LmFYLHRoaXMuYVk9dC5hWSx0aGlzLnhSYWRpdXM9dC54UmFkaXVzLHRoaXMueVJhZGl1cz10LnlSYWRpdXMsdGhpcy5hU3RhcnRBbmdsZT10LmFTdGFydEFuZ2xlLHRoaXMuYUVuZEFuZ2xlPXQuYUVuZEFuZ2xlLHRoaXMuYUNsb2Nrd2lzZT10LmFDbG9ja3dpc2UsdGhpcy5hUm90YXRpb249dC5hUm90YXRpb24sdGhpc319ZDR0LnByb3RvdHlwZS5pc0VsbGlwc2VDdXJ2ZT0hMDtjbGFzcyBwNHQgZXh0ZW5kcyBkNHR7Y29uc3RydWN0b3IodCxlLG4saSxyLG8pe3N1cGVyKHQsZSxuLG4saSxyLG8pLHRoaXMudHlwZT0iQXJjQ3VydmUifX1mdW5jdGlvbiBmNHQoKXtsZXQgdD0wLGU9MCxuPTAsaT0wO2Z1bmN0aW9uIHIocixvLGEscyl7dD1yLGU9YSxuPS0zKnIrMypvLTIqYS1zLGk9MipyLTIqbythK3N9cmV0dXJue2luaXRDYXRtdWxsUm9tOmZ1bmN0aW9uKHQsZSxuLGksbyl7cihlLG4sbyoobi10KSxvKihpLWUpKX0saW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tOmZ1bmN0aW9uKHQsZSxuLGksbyxhLHMpe2xldCBsPShlLXQpL28tKG4tdCkvKG8rYSkrKG4tZSkvYSxjPShuLWUpL2EtKGktZSkvKGErcykrKGktbikvcztsKj1hLGMqPWEscihlLG4sbCxjKX0sY2FsYzpmdW5jdGlvbihyKXtjb25zdCBvPXIqcjtyZXR1cm4gdCtlKnIrbipvK2kqKG8qcil9fX1wNHQucHJvdG90eXBlLmlzQXJjQ3VydmU9ITA7Y29uc3QgbTR0PW5ldyBDSnQsZzR0PW5ldyBmNHQsXzR0PW5ldyBmNHQseTR0PW5ldyBmNHQ7Y2xhc3MgdjR0IGV4dGVuZHMgaDR0e2NvbnN0cnVjdG9yKHQ9W10sZT0hMSxuPSJjZW50cmlwZXRhbCIsaT0uNSl7c3VwZXIoKSx0aGlzLnR5cGU9IkNhdG11bGxSb21DdXJ2ZTMiLHRoaXMucG9pbnRzPXQsdGhpcy5jbG9zZWQ9ZSx0aGlzLmN1cnZlVHlwZT1uLHRoaXMudGVuc2lvbj1pfWdldFBvaW50KHQsZT1uZXcgQ0p0KXtjb25zdCBuPWUsaT10aGlzLnBvaW50cyxyPWkubGVuZ3RoLG89KHItKHRoaXMuY2xvc2VkPzA6MSkpKnQ7bGV0IGEscyxsPU1hdGguZmxvb3IobyksYz1vLWw7dGhpcy5jbG9zZWQ/bCs9bD4wPzA6KE1hdGguZmxvb3IoTWF0aC5hYnMobCkvcikrMSkqcjowPT09YyYmbD09PXItMSYmKGw9ci0yLGM9MSksdGhpcy5jbG9zZWR8fGw+MD9hPWlbKGwtMSklcl06KG00dC5zdWJWZWN0b3JzKGlbMF0saVsxXSkuYWRkKGlbMF0pLGE9bTR0KTtjb25zdCB1PWlbbCVyXSxoPWlbKGwrMSklcl07aWYodGhpcy5jbG9zZWR8fGwrMjxyP3M9aVsobCsyKSVyXToobTR0LnN1YlZlY3RvcnMoaVtyLTFdLGlbci0yXSkuYWRkKGlbci0xXSkscz1tNHQpLCJjZW50cmlwZXRhbCI9PT10aGlzLmN1cnZlVHlwZXx8ImNob3JkYWwiPT09dGhpcy5jdXJ2ZVR5cGUpe2NvbnN0IHQ9ImNob3JkYWwiPT09dGhpcy5jdXJ2ZVR5cGU/LjU6LjI1O2xldCBlPU1hdGgucG93KGEuZGlzdGFuY2VUb1NxdWFyZWQodSksdCksbj1NYXRoLnBvdyh1LmRpc3RhbmNlVG9TcXVhcmVkKGgpLHQpLGk9TWF0aC5wb3coaC5kaXN0YW5jZVRvU3F1YXJlZChzKSx0KTtuPDFlLTQmJihuPTEpLGU8MWUtNCYmKGU9biksaTwxZS00JiYoaT1uKSxnNHQuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKGEueCx1LngsaC54LHMueCxlLG4saSksXzR0LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShhLnksdS55LGgueSxzLnksZSxuLGkpLHk0dC5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oYS56LHUueixoLnoscy56LGUsbixpKX1lbHNlImNhdG11bGxyb20iPT09dGhpcy5jdXJ2ZVR5cGUmJihnNHQuaW5pdENhdG11bGxSb20oYS54LHUueCxoLngscy54LHRoaXMudGVuc2lvbiksXzR0LmluaXRDYXRtdWxsUm9tKGEueSx1LnksaC55LHMueSx0aGlzLnRlbnNpb24pLHk0dC5pbml0Q2F0bXVsbFJvbShhLnosdS56LGgueixzLnosdGhpcy50ZW5zaW9uKSk7cmV0dXJuIG4uc2V0KGc0dC5jYWxjKGMpLF80dC5jYWxjKGMpLHk0dC5jYWxjKGMpKSxufWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXRoaXMucG9pbnRzLnB1c2godC5wb2ludHNbZV0uY2xvbmUoKSk7cmV0dXJuIHRoaXMuY2xvc2VkPXQuY2xvc2VkLHRoaXMuY3VydmVUeXBlPXQuY3VydmVUeXBlLHRoaXMudGVuc2lvbj10LnRlbnNpb24sdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5wb2ludHMubGVuZ3RoO2U8bjtlKyspdC5wb2ludHMucHVzaCh0aGlzLnBvaW50c1tlXS50b0FycmF5KCkpO3JldHVybiB0LmNsb3NlZD10aGlzLmNsb3NlZCx0LmN1cnZlVHlwZT10aGlzLmN1cnZlVHlwZSx0LnRlbnNpb249dGhpcy50ZW5zaW9uLHR9ZnJvbUpTT04odCl7c3VwZXIuZnJvbUpTT04odCksdGhpcy5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10LnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgbj10LnBvaW50c1tlXTt0aGlzLnBvaW50cy5wdXNoKChuZXcgQ0p0KS5mcm9tQXJyYXkobikpfXJldHVybiB0aGlzLmNsb3NlZD10LmNsb3NlZCx0aGlzLmN1cnZlVHlwZT10LmN1cnZlVHlwZSx0aGlzLnRlbnNpb249dC50ZW5zaW9uLHRoaXN9fWZ1bmN0aW9uIGI0dCh0LGUsbixpLHIpe2NvbnN0IG89LjUqKGktZSksYT0uNSooci1uKSxzPXQqdDtyZXR1cm4oMipuLTIqaStvK2EpKih0KnMpKygtMypuKzMqaS0yKm8tYSkqcytvKnQrbn1mdW5jdGlvbiB4NHQodCxlLG4saSl7cmV0dXJuKGZ1bmN0aW9uIHIodCxlKXtjb25zdCBuPTEtdDtyZXR1cm4gbipuKmV9KSh0LGUpKyhmdW5jdGlvbiBvKHQsZSl7cmV0dXJuIDIqKDEtdCkqdCplfSkodCxuKSsoZnVuY3Rpb24gYSh0LGUpe3JldHVybiB0KnQqZX0pKHQsaSl9ZnVuY3Rpb24gdzR0KHQsZSxuLGkscil7cmV0dXJuKGZ1bmN0aW9uIG8odCxlKXtjb25zdCBuPTEtdDtyZXR1cm4gbipuKm4qZX0pKHQsZSkrKGZ1bmN0aW9uIGEodCxlKXtjb25zdCBuPTEtdDtyZXR1cm4gMypuKm4qdCplfSkodCxuKSsoZnVuY3Rpb24gcyh0LGUpe3JldHVybiAzKigxLXQpKnQqdCplfSkodCxpKSsoZnVuY3Rpb24gbCh0LGUpe3JldHVybiB0KnQqdCplfSkodCxyKX12NHQucHJvdG90eXBlLmlzQ2F0bXVsbFJvbUN1cnZlMz0hMDtjbGFzcyBTNHQgZXh0ZW5kcyBoNHR7Y29uc3RydWN0b3IodD1uZXcgbUp0LGU9bmV3IG1KdCxuPW5ldyBtSnQsaT1uZXcgbUp0KXtzdXBlcigpLHRoaXMudHlwZT0iQ3ViaWNCZXppZXJDdXJ2ZSIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW4sdGhpcy52Mz1pfWdldFBvaW50KHQsZT1uZXcgbUp0KXtjb25zdCBuPWUsaT10aGlzLnYwLHI9dGhpcy52MSxvPXRoaXMudjIsYT10aGlzLnYzO3JldHVybiBuLnNldCh3NHQodCxpLngsci54LG8ueCxhLngpLHc0dCh0LGkueSxyLnksby55LGEueSkpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYwLmNvcHkodC52MCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzLnYzLmNvcHkodC52MyksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0LnYzPXRoaXMudjMudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjAuZnJvbUFycmF5KHQudjApLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXMudjMuZnJvbUFycmF5KHQudjMpLHRoaXN9fVM0dC5wcm90b3R5cGUuaXNDdWJpY0JlemllckN1cnZlPSEwO2NsYXNzIE00dCBleHRlbmRzIGg0dHtjb25zdHJ1Y3Rvcih0PW5ldyBDSnQsZT1uZXcgQ0p0LG49bmV3IENKdCxpPW5ldyBDSnQpe3N1cGVyKCksdGhpcy50eXBlPSJDdWJpY0JlemllckN1cnZlMyIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW4sdGhpcy52Mz1pfWdldFBvaW50KHQsZT1uZXcgQ0p0KXtjb25zdCBuPWUsaT10aGlzLnYwLHI9dGhpcy52MSxvPXRoaXMudjIsYT10aGlzLnYzO3JldHVybiBuLnNldCh3NHQodCxpLngsci54LG8ueCxhLngpLHc0dCh0LGkueSxyLnksby55LGEueSksdzR0KHQsaS56LHIueixvLnosYS56KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXMudjMuY29weSh0LnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHQudjM9dGhpcy52My50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpcy52My5mcm9tQXJyYXkodC52MyksdGhpc319TTR0LnByb3RvdHlwZS5pc0N1YmljQmV6aWVyQ3VydmUzPSEwO2NsYXNzIEU0dCBleHRlbmRzIGg0dHtjb25zdHJ1Y3Rvcih0PW5ldyBtSnQsZT1uZXcgbUp0KXtzdXBlcigpLHRoaXMudHlwZT0iTGluZUN1cnZlIix0aGlzLnYxPXQsdGhpcy52Mj1lfWdldFBvaW50KHQsZT1uZXcgbUp0KXtjb25zdCBuPWU7cmV0dXJuIDE9PT10P24uY29weSh0aGlzLnYyKToobi5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSxuLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnYxKSksbn1nZXRQb2ludEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQodCxlKX1nZXRUYW5nZW50KHQsZSl7Y29uc3Qgbj1lfHxuZXcgbUp0O3JldHVybiBuLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLm5vcm1hbGl6ZSgpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXN9fUU0dC5wcm90b3R5cGUuaXNMaW5lQ3VydmU9ITA7Y2xhc3MgVDR0IGV4dGVuZHMgaDR0e2NvbnN0cnVjdG9yKHQ9bmV3IENKdCxlPW5ldyBDSnQpe3N1cGVyKCksdGhpcy50eXBlPSJMaW5lQ3VydmUzIix0aGlzLmlzTGluZUN1cnZlMz0hMCx0aGlzLnYxPXQsdGhpcy52Mj1lfWdldFBvaW50KHQsZT1uZXcgQ0p0KXtjb25zdCBuPWU7cmV0dXJuIDE9PT10P24uY29weSh0aGlzLnYyKToobi5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSxuLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnYxKSksbn1nZXRQb2ludEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQodCxlKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpc319Y2xhc3MgQzR0IGV4dGVuZHMgaDR0e2NvbnN0cnVjdG9yKHQ9bmV3IG1KdCxlPW5ldyBtSnQsbj1uZXcgbUp0KXtzdXBlcigpLHRoaXMudHlwZT0iUXVhZHJhdGljQmV6aWVyQ3VydmUiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1ufWdldFBvaW50KHQsZT1uZXcgbUp0KXtjb25zdCBuPWUsaT10aGlzLnYwLHI9dGhpcy52MSxvPXRoaXMudjI7cmV0dXJuIG4uc2V0KHg0dCh0LGkueCxyLngsby54KSx4NHQodCxpLnksci55LG8ueSkpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYwLmNvcHkodC52MCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjAuZnJvbUFycmF5KHQudjApLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXN9fUM0dC5wcm90b3R5cGUuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZT0hMDtjbGFzcyBBNHQgZXh0ZW5kcyBoNHR7Y29uc3RydWN0b3IodD1uZXcgQ0p0LGU9bmV3IENKdCxuPW5ldyBDSnQpe3N1cGVyKCksdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1ufWdldFBvaW50KHQsZT1uZXcgQ0p0KXtjb25zdCBuPWUsaT10aGlzLnYwLHI9dGhpcy52MSxvPXRoaXMudjI7cmV0dXJuIG4uc2V0KHg0dCh0LGkueCxyLngsby54KSx4NHQodCxpLnksci55LG8ueSkseDR0KHQsaS56LHIueixvLnopKSxufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MC5jb3B5KHQudjApLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYwLmZyb21BcnJheSh0LnYwKSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX1BNHQucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUzPSEwO2NsYXNzIGs0dCBleHRlbmRzIGg0dHtjb25zdHJ1Y3Rvcih0PVtdKXtzdXBlcigpLHRoaXMudHlwZT0iU3BsaW5lQ3VydmUiLHRoaXMucG9pbnRzPXR9Z2V0UG9pbnQodCxlPW5ldyBtSnQpe2NvbnN0IG49ZSxpPXRoaXMucG9pbnRzLHI9KGkubGVuZ3RoLTEpKnQsbz1NYXRoLmZsb29yKHIpLGE9ci1vLHM9aVswPT09bz9vOm8tMV0sbD1pW29dLGM9aVtvPmkubGVuZ3RoLTI/aS5sZW5ndGgtMTpvKzFdLHU9aVtvPmkubGVuZ3RoLTM/aS5sZW5ndGgtMTpvKzJdO3JldHVybiBuLnNldChiNHQoYSxzLngsbC54LGMueCx1LngpLGI0dChhLHMueSxsLnksYy55LHUueSkpLG59Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspdGhpcy5wb2ludHMucHVzaCh0LnBvaW50c1tlXS5jbG9uZSgpKTtyZXR1cm4gdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5wb2ludHMubGVuZ3RoO2U8bjtlKyspdC5wb2ludHMucHVzaCh0aGlzLnBvaW50c1tlXS50b0FycmF5KCkpO3JldHVybiB0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IG49dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaCgobmV3IG1KdCkuZnJvbUFycmF5KG4pKX1yZXR1cm4gdGhpc319azR0LnByb3RvdHlwZS5pc1NwbGluZUN1cnZlPSEwO3ZhciBMNHQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQXJjQ3VydmU6cDR0LENhdG11bGxSb21DdXJ2ZTM6djR0LEN1YmljQmV6aWVyQ3VydmU6UzR0LEN1YmljQmV6aWVyQ3VydmUzOk00dCxFbGxpcHNlQ3VydmU6ZDR0LExpbmVDdXJ2ZTpFNHQsTGluZUN1cnZlMzpUNHQsUXVhZHJhdGljQmV6aWVyQ3VydmU6QzR0LFF1YWRyYXRpY0JlemllckN1cnZlMzpBNHQsU3BsaW5lQ3VydmU6azR0fSk7ZnVuY3Rpb24gUDR0KHQsZSxuLGkscil7bGV0IG8sYTtpZihyPT09KGZ1bmN0aW9uIHModCxlLG4saSl7bGV0IHI9MDtmb3IobGV0IG89ZSxhPW4taTtvPG47bys9aSlyKz0odFthXS10W29dKSoodFtvKzFdK3RbYSsxXSksYT1vO3JldHVybiByfSkodCxlLG4saSk+MClmb3Iobz1lO288bjtvKz1pKWE9SjR0KG8sdFtvXSx0W28rMV0sYSk7ZWxzZSBmb3Iobz1uLWk7bz49ZTtvLT1pKWE9SjR0KG8sdFtvXSx0W28rMV0sYSk7cmV0dXJuIGEmJnE0dChhLGEubmV4dCkmJihRNHQoYSksYT1hLm5leHQpLGF9ZnVuY3Rpb24gTjR0KHQsZSl7aWYoIXQpcmV0dXJuIHQ7ZXx8KGU9dCk7bGV0IG4saT10O2Rve2lmKG49ITEsaS5zdGVpbmVyfHwhcTR0KGksaS5uZXh0KSYmMCE9PVc0dChpLnByZXYsaSxpLm5leHQpKWk9aS5uZXh0O2Vsc2V7aWYoUTR0KGkpLGk9ZT1pLnByZXYsaT09PWkubmV4dClicmVhaztuPSEwfX13aGlsZShufHxpIT09ZSk7cmV0dXJuIGV9ZnVuY3Rpb24gSTR0KHQsZSxuLGkscixvLGEpe2lmKCF0KXJldHVybjshYSYmbyYmKGZ1bmN0aW9uIHModCxlLG4saSl7bGV0IHI9dDtkb3tudWxsPT09ci56JiYoci56PVY0dChyLngsci55LGUsbixpKSksci5wcmV2Wj1yLnByZXYsci5uZXh0Wj1yLm5leHQscj1yLm5leHR9d2hpbGUociE9PXQpO3IucHJldloubmV4dFo9bnVsbCxyLnByZXZaPW51bGwsKGZ1bmN0aW9uIG8odCl7bGV0IGUsbixpLHIsbyxhLHMsbCxjPTE7ZG97Zm9yKG49dCx0PW51bGwsbz1udWxsLGE9MDtuOyl7Zm9yKGErKyxpPW4scz0wLGU9MDtlPGMmJihzKyssaT1pLm5leHRaLGkpO2UrKyk7Zm9yKGw9YztzPjB8fGw+MCYmaTspMCE9PXMmJigwPT09bHx8IWl8fG4uejw9aS56KT8ocj1uLG49bi5uZXh0WixzLS0pOihyPWksaT1pLm5leHRaLGwtLSksbz9vLm5leHRaPXI6dD1yLHIucHJldlo9byxvPXI7bj1pfW8ubmV4dFo9bnVsbCxjKj0yfXdoaWxlKGE+MSl9KShyKX0pKHQsaSxyLG8pO2xldCBsLGMsdT10O2Zvcig7dC5wcmV2IT09dC5uZXh0OylpZihsPXQucHJldixjPXQubmV4dCxvP080dCh0LGkscixvKTpSNHQodCkpZS5wdXNoKGwuaS9uKSxlLnB1c2godC5pL24pLGUucHVzaChjLmkvbiksUTR0KHQpLHQ9Yy5uZXh0LHU9Yy5uZXh0O2Vsc2UgaWYoKHQ9Yyk9PT11KXthPzE9PT1hP0k0dCh0PXo0dChONHQodCksZSxuKSxlLG4saSxyLG8sMik6Mj09PWEmJkQ0dCh0LGUsbixpLHIsbyk6STR0KE40dCh0KSxlLG4saSxyLG8sMSk7YnJlYWt9fWZ1bmN0aW9uIFI0dCh0KXtjb25zdCBlPXQucHJldixuPXQsaT10Lm5leHQ7aWYoVzR0KGUsbixpKT49MClyZXR1cm4hMTtsZXQgcj10Lm5leHQubmV4dDtmb3IoO3IhPT10LnByZXY7KXtpZihqNHQoZS54LGUueSxuLngsbi55LGkueCxpLnksci54LHIueSkmJlc0dChyLnByZXYscixyLm5leHQpPj0wKXJldHVybiExO3I9ci5uZXh0fXJldHVybiEwfWZ1bmN0aW9uIE80dCh0LGUsbixpKXtjb25zdCByPXQucHJldixvPXQsYT10Lm5leHQ7aWYoVzR0KHIsbyxhKT49MClyZXR1cm4hMTtjb25zdCBzPXIueD5vLng/ci54PmEueD9yLng6YS54Om8ueD5hLng/by54OmEueCxsPXIueT5vLnk/ci55PmEueT9yLnk6YS55Om8ueT5hLnk/by55OmEueSxjPVY0dChyLng8by54P3IueDxhLng/ci54OmEueDpvLng8YS54P28ueDphLngsci55PG8ueT9yLnk8YS55P3IueTphLnk6by55PGEueT9vLnk6YS55LGUsbixpKSx1PVY0dChzLGwsZSxuLGkpO2xldCBoPXQucHJldlosZD10Lm5leHRaO2Zvcig7aCYmaC56Pj1jJiZkJiZkLno8PXU7KXtpZihoIT09dC5wcmV2JiZoIT09dC5uZXh0JiZqNHQoci54LHIueSxvLngsby55LGEueCxhLnksaC54LGgueSkmJlc0dChoLnByZXYsaCxoLm5leHQpPj0wKXJldHVybiExO2lmKGg9aC5wcmV2WixkIT09dC5wcmV2JiZkIT09dC5uZXh0JiZqNHQoci54LHIueSxvLngsby55LGEueCxhLnksZC54LGQueSkmJlc0dChkLnByZXYsZCxkLm5leHQpPj0wKXJldHVybiExO2Q9ZC5uZXh0Wn1mb3IoO2gmJmguej49Yzspe2lmKGghPT10LnByZXYmJmghPT10Lm5leHQmJmo0dChyLngsci55LG8ueCxvLnksYS54LGEueSxoLngsaC55KSYmVzR0KGgucHJldixoLGgubmV4dCk+PTApcmV0dXJuITE7aD1oLnByZXZafWZvcig7ZCYmZC56PD11Oyl7aWYoZCE9PXQucHJldiYmZCE9PXQubmV4dCYmajR0KHIueCxyLnksby54LG8ueSxhLngsYS55LGQueCxkLnkpJiZXNHQoZC5wcmV2LGQsZC5uZXh0KT49MClyZXR1cm4hMTtkPWQubmV4dFp9cmV0dXJuITB9ZnVuY3Rpb24gejR0KHQsZSxuKXtsZXQgaT10O2Rve2NvbnN0IHI9aS5wcmV2LG89aS5uZXh0Lm5leHQ7IXE0dChyLG8pJiZZNHQocixpLGkubmV4dCxvKSYmSzR0KHIsbykmJks0dChvLHIpJiYoZS5wdXNoKHIuaS9uKSxlLnB1c2goaS5pL24pLGUucHVzaChvLmkvbiksUTR0KGkpLFE0dChpLm5leHQpLGk9dD1vKSxpPWkubmV4dH13aGlsZShpIT09dCk7cmV0dXJuIE40dChpKX1mdW5jdGlvbiBENHQodCxlLG4saSxyLG8pe2xldCBhPXQ7ZG97bGV0IHQ9YS5uZXh0Lm5leHQ7Zm9yKDt0IT09YS5wcmV2Oyl7aWYoYS5pIT09dC5pJiZHNHQoYSx0KSl7bGV0IHM9WjR0KGEsdCk7cmV0dXJuIGE9TjR0KGEsYS5uZXh0KSxzPU40dChzLHMubmV4dCksSTR0KGEsZSxuLGkscixvKSx2b2lkIEk0dChzLGUsbixpLHIsbyl9dD10Lm5leHR9YT1hLm5leHR9d2hpbGUoYSE9PXQpfWZ1bmN0aW9uIEI0dCh0LGUpe3JldHVybiB0LngtZS54fWZ1bmN0aW9uIEg0dCh0LGUpe2lmKGU9KGZ1bmN0aW9uIG4odCxlKXtsZXQgbj1lO2NvbnN0IGk9dC54LHI9dC55O2xldCBvLGE9LTEvMDtkb3tpZihyPD1uLnkmJnI+PW4ubmV4dC55JiZuLm5leHQueSE9PW4ueSl7Y29uc3QgdD1uLngrKHItbi55KSoobi5uZXh0Lngtbi54KS8obi5uZXh0Lnktbi55KTtpZih0PD1pJiZ0PmEpe2lmKGE9dCx0PT09aSl7aWYocj09PW4ueSlyZXR1cm4gbjtpZihyPT09bi5uZXh0LnkpcmV0dXJuIG4ubmV4dH1vPW4ueDxuLm5leHQueD9uOm4ubmV4dH19bj1uLm5leHR9d2hpbGUobiE9PWUpO2lmKCFvKXJldHVybiBudWxsO2lmKGk9PT1hKXJldHVybiBvO2NvbnN0IHM9byxsPW8ueCxjPW8ueTtsZXQgdSxoPTEvMDtuPW87ZG97aT49bi54JiZuLng+PWwmJmkhPT1uLngmJmo0dChyPGM/aTphLHIsbCxjLHI8Yz9hOmkscixuLngsbi55KSYmKHU9TWF0aC5hYnMoci1uLnkpLyhpLW4ueCksSzR0KG4sdCkmJih1PGh8fHU9PT1oJiYobi54Pm8ueHx8bi54PT09by54JiZGNHQobyxuKSkpJiYobz1uLGg9dSkpLG49bi5uZXh0fXdoaWxlKG4hPT1zKTtyZXR1cm4gb30pKHQsZSkpe2NvbnN0IG49WjR0KGUsdCk7TjR0KGUsZS5uZXh0KSxONHQobixuLm5leHQpfX1mdW5jdGlvbiBGNHQodCxlKXtyZXR1cm4gVzR0KHQucHJldix0LGUucHJldik8MCYmVzR0KGUubmV4dCx0LHQubmV4dCk8MH1mdW5jdGlvbiBWNHQodCxlLG4saSxyKXtyZXR1cm4odD0xNDMxNjU1NzY1JigodD04NTg5OTM0NTkmKCh0PTI1MjY0NTEzNSYoKHQ9MTY3MTE5MzUmKCh0PTMyNzY3Kih0LW4pKnIpfHQ8PDgpKXx0PDw0KSl8dDw8MikpfHQ8PDEpKXwoZT0xNDMxNjU1NzY1JigoZT04NTg5OTM0NTkmKChlPTI1MjY0NTEzNSYoKGU9MTY3MTE5MzUmKChlPTMyNzY3KihlLWkpKnIpfGU8PDgpKXxlPDw0KSl8ZTw8MikpfGU8PDEpKTw8MX1mdW5jdGlvbiBVNHQodCl7bGV0IGU9dCxuPXQ7ZG97KGUueDxuLnh8fGUueD09PW4ueCYmZS55PG4ueSkmJihuPWUpLGU9ZS5uZXh0fXdoaWxlKGUhPT10KTtyZXR1cm4gbn1mdW5jdGlvbiBqNHQodCxlLG4saSxyLG8sYSxzKXtyZXR1cm4oci1hKSooZS1zKS0odC1hKSooby1zKT49MCYmKHQtYSkqKGktcyktKG4tYSkqKGUtcyk+PTAmJihuLWEpKihvLXMpLShyLWEpKihpLXMpPj0wfWZ1bmN0aW9uIEc0dCh0LGUpe3JldHVybiB0Lm5leHQuaSE9PWUuaSYmdC5wcmV2LmkhPT1lLmkmJiEoZnVuY3Rpb24gbih0LGUpe2xldCBuPXQ7ZG97aWYobi5pIT09dC5pJiZuLm5leHQuaSE9PXQuaSYmbi5pIT09ZS5pJiZuLm5leHQuaSE9PWUuaSYmWTR0KG4sbi5uZXh0LHQsZSkpcmV0dXJuITA7bj1uLm5leHR9d2hpbGUobiE9PXQpO3JldHVybiExfSkodCxlKSYmKEs0dCh0LGUpJiZLNHQoZSx0KSYmKGZ1bmN0aW9uIGkodCxlKXtsZXQgbj10LGk9ITE7Y29uc3Qgcj0odC54K2UueCkvMixvPSh0LnkrZS55KS8yO2Rve24ueT5vIT1uLm5leHQueT5vJiZuLm5leHQueSE9PW4ueSYmcjwobi5uZXh0Lngtbi54KSooby1uLnkpLyhuLm5leHQueS1uLnkpK24ueCYmKGk9IWkpLG49bi5uZXh0fXdoaWxlKG4hPT10KTtyZXR1cm4gaX0pKHQsZSkmJihXNHQodC5wcmV2LHQsZS5wcmV2KXx8VzR0KHQsZS5wcmV2LGUpKXx8cTR0KHQsZSkmJlc0dCh0LnByZXYsdCx0Lm5leHQpPjAmJlc0dChlLnByZXYsZSxlLm5leHQpPjApfWZ1bmN0aW9uIFc0dCh0LGUsbil7cmV0dXJuKGUueS10LnkpKihuLngtZS54KS0oZS54LXQueCkqKG4ueS1lLnkpfWZ1bmN0aW9uIHE0dCh0LGUpe3JldHVybiB0Lng9PT1lLngmJnQueT09PWUueX1mdW5jdGlvbiBZNHQodCxlLG4saSl7Y29uc3Qgcj0kNHQoVzR0KHQsZSxuKSksbz0kNHQoVzR0KHQsZSxpKSksYT0kNHQoVzR0KG4saSx0KSkscz0kNHQoVzR0KG4saSxlKSk7cmV0dXJuIHIhPT1vJiZhIT09c3x8ISgwIT09cnx8IVg0dCh0LG4sZSkpfHwhKDAhPT1vfHwhWDR0KHQsaSxlKSl8fCEoMCE9PWF8fCFYNHQobix0LGkpKXx8ISgwIT09c3x8IVg0dChuLGUsaSkpfWZ1bmN0aW9uIFg0dCh0LGUsbil7cmV0dXJuIGUueDw9TWF0aC5tYXgodC54LG4ueCkmJmUueD49TWF0aC5taW4odC54LG4ueCkmJmUueTw9TWF0aC5tYXgodC55LG4ueSkmJmUueT49TWF0aC5taW4odC55LG4ueSl9ZnVuY3Rpb24gJDR0KHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH1mdW5jdGlvbiBLNHQodCxlKXtyZXR1cm4gVzR0KHQucHJldix0LHQubmV4dCk8MD9XNHQodCxlLHQubmV4dCk+PTAmJlc0dCh0LHQucHJldixlKT49MDpXNHQodCxlLHQucHJldik8MHx8VzR0KHQsdC5uZXh0LGUpPDB9ZnVuY3Rpb24gWjR0KHQsZSl7Y29uc3Qgbj1uZXcgdDZ0KHQuaSx0LngsdC55KSxpPW5ldyB0NnQoZS5pLGUueCxlLnkpLHI9dC5uZXh0LG89ZS5wcmV2O3JldHVybiB0Lm5leHQ9ZSxlLnByZXY9dCxuLm5leHQ9cixyLnByZXY9bixpLm5leHQ9bixuLnByZXY9aSxvLm5leHQ9aSxpLnByZXY9byxpfWZ1bmN0aW9uIEo0dCh0LGUsbixpKXtjb25zdCByPW5ldyB0NnQodCxlLG4pO3JldHVybiBpPyhyLm5leHQ9aS5uZXh0LHIucHJldj1pLGkubmV4dC5wcmV2PXIsaS5uZXh0PXIpOihyLnByZXY9cixyLm5leHQ9cikscn1mdW5jdGlvbiBRNHQodCl7dC5uZXh0LnByZXY9dC5wcmV2LHQucHJldi5uZXh0PXQubmV4dCx0LnByZXZaJiYodC5wcmV2Wi5uZXh0Wj10Lm5leHRaKSx0Lm5leHRaJiYodC5uZXh0Wi5wcmV2Wj10LnByZXZaKX1mdW5jdGlvbiB0NnQodCxlLG4pe3RoaXMuaT10LHRoaXMueD1lLHRoaXMueT1uLHRoaXMucHJldj1udWxsLHRoaXMubmV4dD1udWxsLHRoaXMuej1udWxsLHRoaXMucHJldlo9bnVsbCx0aGlzLm5leHRaPW51bGwsdGhpcy5zdGVpbmVyPSExfWNsYXNzIGU2dHtzdGF0aWMgYXJlYSh0KXtjb25zdCBlPXQubGVuZ3RoO2xldCBuPTA7Zm9yKGxldCBpPWUtMSxyPTA7cjxlO2k9cisrKW4rPXRbaV0ueCp0W3JdLnktdFtyXS54KnRbaV0ueTtyZXR1cm4uNSpufXN0YXRpYyBpc0Nsb2NrV2lzZSh0KXtyZXR1cm4gZTZ0LmFyZWEodCk8MH1zdGF0aWMgdHJpYW5ndWxhdGVTaGFwZSh0LGUpe2NvbnN0IG49W10saT1bXSxyPVtdO242dCh0KSxpNnQobix0KTtsZXQgbz10Lmxlbmd0aDtlLmZvckVhY2gobjZ0KTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKylpLnB1c2gobyksbys9ZVt0XS5sZW5ndGgsaTZ0KG4sZVt0XSk7Y29uc3QgYT0oZnVuY3Rpb24odCxlLG49Mil7Y29uc3QgaT1lJiZlLmxlbmd0aCxyPWk/ZVswXSpuOnQubGVuZ3RoO2xldCBvPVA0dCh0LDAscixuLCEwKTtjb25zdCBhPVtdO2lmKCFvfHxvLm5leHQ9PT1vLnByZXYpcmV0dXJuIGE7bGV0IHMsbCxjLHUsaCxkLHA7aWYoaSYmKG89KGZ1bmN0aW9uIGYodCxlLG4saSl7Y29uc3Qgcj1bXTtsZXQgbyxhLHMsbCxjO2ZvcihvPTAsYT1lLmxlbmd0aDtvPGE7bysrKXM9ZVtvXSppLGw9bzxhLTE/ZVtvKzFdKmk6dC5sZW5ndGgsYz1QNHQodCxzLGwsaSwhMSksYz09PWMubmV4dCYmKGMuc3RlaW5lcj0hMCksci5wdXNoKFU0dChjKSk7Zm9yKHIuc29ydChCNHQpLG89MDtvPHIubGVuZ3RoO28rKylINHQocltvXSxuKSxuPU40dChuLG4ubmV4dCk7cmV0dXJuIG59KSh0LGUsbyxuKSksdC5sZW5ndGg+ODAqbil7cz1jPXRbMF0sbD11PXRbMV07Zm9yKGxldCBlPW47ZTxyO2UrPW4paD10W2VdLGQ9dFtlKzFdLGg8cyYmKHM9aCksZDxsJiYobD1kKSxoPmMmJihjPWgpLGQ+dSYmKHU9ZCk7cD1NYXRoLm1heChjLXMsdS1sKSxwPTAhPT1wPzEvcDowfXJldHVybiBJNHQobyxhLG4scyxsLHApLGF9KShuLGkpO2ZvcihsZXQgdD0wO3Q8YS5sZW5ndGg7dCs9MylyLnB1c2goYS5zbGljZSh0LHQrMykpO3JldHVybiByfX1mdW5jdGlvbiBuNnQodCl7Y29uc3QgZT10Lmxlbmd0aDtlPjImJnRbZS0xXS5lcXVhbHModFswXSkmJnQucG9wKCl9ZnVuY3Rpb24gaTZ0KHQsZSl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspdC5wdXNoKGVbbl0ueCksdC5wdXNoKGVbbl0ueSl9Y2xhc3MgcjZ0IGV4dGVuZHMgYjF0e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoKSx0aGlzLnR5cGU9IkV4dHJ1ZGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6dCxvcHRpb25zOmV9LHQ9QXJyYXkuaXNBcnJheSh0KT90Olt0XTtjb25zdCBuPXRoaXMsaT1bXSxyPVtdO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKylvKHRbZV0pO2Z1bmN0aW9uIG8odCl7Y29uc3Qgbz1bXSxhPXZvaWQgMCE9PWUuY3VydmVTZWdtZW50cz9lLmN1cnZlU2VnbWVudHM6MTIscz12b2lkIDAhPT1lLnN0ZXBzP2Uuc3RlcHM6MTtsZXQgbD12b2lkIDAhPT1lLmRlcHRoP2UuZGVwdGg6MTAwLGM9dm9pZCAwPT09ZS5iZXZlbEVuYWJsZWR8fGUuYmV2ZWxFbmFibGVkLHU9dm9pZCAwIT09ZS5iZXZlbFRoaWNrbmVzcz9lLmJldmVsVGhpY2tuZXNzOjYsaD12b2lkIDAhPT1lLmJldmVsU2l6ZT9lLmJldmVsU2l6ZTp1LTIsZD12b2lkIDAhPT1lLmJldmVsT2Zmc2V0P2UuYmV2ZWxPZmZzZXQ6MCxwPXZvaWQgMCE9PWUuYmV2ZWxTZWdtZW50cz9lLmJldmVsU2VnbWVudHM6Mztjb25zdCBmPWUuZXh0cnVkZVBhdGgsbT12b2lkIDAhPT1lLlVWR2VuZXJhdG9yP2UuVVZHZW5lcmF0b3I6bzZ0O3ZvaWQgMCE9PWUuYW1vdW50JiYoY29uc29sZS53YXJuKCJUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IGFtb3VudCBoYXMgYmVlbiByZW5hbWVkIHRvIGRlcHRoLiIpLGw9ZS5hbW91bnQpO2xldCBnLF8seSx2LGIseD0hMTtmJiYoZz1mLmdldFNwYWNlZFBvaW50cyhzKSx4PSEwLGM9ITEsXz1mLmNvbXB1dGVGcmVuZXRGcmFtZXMocywhMSkseT1uZXcgQ0p0LHY9bmV3IENKdCxiPW5ldyBDSnQpLGN8fChwPTAsdT0wLGg9MCxkPTApO2NvbnN0IHc9dC5leHRyYWN0UG9pbnRzKGEpO2xldCBTPXcuc2hhcGU7Y29uc3QgTT13LmhvbGVzO2lmKCFlNnQuaXNDbG9ja1dpc2UoUykpe1M9Uy5yZXZlcnNlKCk7Zm9yKGxldCB0PTAsZT1NLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPU1bdF07ZTZ0LmlzQ2xvY2tXaXNlKGUpJiYoTVt0XT1lLnJldmVyc2UoKSl9fWNvbnN0IEU9ZTZ0LnRyaWFuZ3VsYXRlU2hhcGUoUyxNKSxUPVM7Zm9yKGxldCB0PTAsZT1NLmxlbmd0aDt0PGU7dCsrKVM9Uy5jb25jYXQoTVt0XSk7ZnVuY3Rpb24gQyh0LGUsbil7cmV0dXJuIGV8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0IiksZS5jbG9uZSgpLm11bHRpcGx5U2NhbGFyKG4pLmFkZCh0KX1jb25zdCBBPVMubGVuZ3RoLGs9RS5sZW5ndGg7ZnVuY3Rpb24gTCh0LGUsbil7bGV0IGkscixvO2NvbnN0IGE9dC54LWUueCxzPXQueS1lLnksbD1uLngtdC54LGM9bi55LXQueSx1PWEqYStzKnM7aWYoTWF0aC5hYnMoYSpjLXMqbCk+TnVtYmVyLkVQU0lMT04pe2NvbnN0IGg9TWF0aC5zcXJ0KHUpLGQ9TWF0aC5zcXJ0KGwqbCtjKmMpLHA9ZS54LXMvaCxmPWUueSthL2gsbT0oKG4ueC1jL2QtcCkqYy0obi55K2wvZC1mKSpsKS8oYSpjLXMqbCk7aT1wK2EqbS10Lngscj1mK3MqbS10Lnk7Y29uc3QgZz1pKmkrcipyO2lmKGc8PTIpcmV0dXJuIG5ldyBtSnQoaSxyKTtvPU1hdGguc3FydChnLzIpfWVsc2V7bGV0IHQ9ITE7YT5OdW1iZXIuRVBTSUxPTj9sPk51bWJlci5FUFNJTE9OJiYodD0hMCk6YTwtTnVtYmVyLkVQU0lMT04/bDwtTnVtYmVyLkVQU0lMT04mJih0PSEwKTpNYXRoLnNpZ24ocyk9PT1NYXRoLnNpZ24oYykmJih0PSEwKSx0PyhpPS1zLHI9YSxvPU1hdGguc3FydCh1KSk6KGk9YSxyPXMsbz1NYXRoLnNxcnQodS8yKSl9cmV0dXJuIG5ldyBtSnQoaS9vLHIvbyl9Y29uc3QgUD1bXTtmb3IobGV0IHQ9MCxlPVQubGVuZ3RoLG49ZS0xLGk9dCsxO3Q8ZTt0KyssbisrLGkrKyluPT09ZSYmKG49MCksaT09PWUmJihpPTApLFBbdF09TChUW3RdLFRbbl0sVFtpXSk7Y29uc3QgTj1bXTtsZXQgSSxSPVAuY29uY2F0KCk7Zm9yKGxldCB0PTAsZT1NLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPU1bdF07ST1bXTtmb3IobGV0IHQ9MCxuPWUubGVuZ3RoLGk9bi0xLHI9dCsxO3Q8bjt0KyssaSsrLHIrKylpPT09biYmKGk9MCkscj09PW4mJihyPTApLElbdF09TChlW3RdLGVbaV0sZVtyXSk7Ti5wdXNoKEkpLFI9Ui5jb25jYXQoSSl9Zm9yKGxldCB0PTA7dDxwO3QrKyl7Y29uc3QgZT10L3Asbj11Kk1hdGguY29zKGUqTWF0aC5QSS8yKSxpPWgqTWF0aC5zaW4oZSpNYXRoLlBJLzIpK2Q7Zm9yKGxldCB0PTAsZT1ULmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPUMoVFt0XSxQW3RdLGkpO0QoZS54LGUueSwtbil9Zm9yKGxldCB0PTAsZT1NLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPU1bdF07ST1OW3RdO2ZvcihsZXQgdD0wLHI9ZS5sZW5ndGg7dDxyO3QrKyl7Y29uc3Qgcj1DKGVbdF0sSVt0XSxpKTtEKHIueCxyLnksLW4pfX19Y29uc3QgTz1oK2Q7Zm9yKGxldCB0PTA7dDxBO3QrKyl7Y29uc3QgZT1jP0MoU1t0XSxSW3RdLE8pOlNbdF07eD8odi5jb3B5KF8ubm9ybWFsc1swXSkubXVsdGlwbHlTY2FsYXIoZS54KSx5LmNvcHkoXy5iaW5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKGUueSksYi5jb3B5KGdbMF0pLmFkZCh2KS5hZGQoeSksRChiLngsYi55LGIueikpOkQoZS54LGUueSwwKX1mb3IobGV0IHQ9MTt0PD1zO3QrKylmb3IobGV0IGU9MDtlPEE7ZSsrKXtjb25zdCBuPWM/QyhTW2VdLFJbZV0sTyk6U1tlXTt4Pyh2LmNvcHkoXy5ub3JtYWxzW3RdKS5tdWx0aXBseVNjYWxhcihuLngpLHkuY29weShfLmJpbm9ybWFsc1t0XSkubXVsdGlwbHlTY2FsYXIobi55KSxiLmNvcHkoZ1t0XSkuYWRkKHYpLmFkZCh5KSxEKGIueCxiLnksYi56KSk6RChuLngsbi55LGwvcyp0KX1mb3IobGV0IHQ9cC0xO3Q+PTA7dC0tKXtjb25zdCBlPXQvcCxuPXUqTWF0aC5jb3MoZSpNYXRoLlBJLzIpLGk9aCpNYXRoLnNpbihlKk1hdGguUEkvMikrZDtmb3IobGV0IHQ9MCxlPVQubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9QyhUW3RdLFBbdF0saSk7RChlLngsZS55LGwrbil9Zm9yKGxldCB0PTAsZT1NLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPU1bdF07ST1OW3RdO2ZvcihsZXQgdD0wLHI9ZS5sZW5ndGg7dDxyO3QrKyl7Y29uc3Qgcj1DKGVbdF0sSVt0XSxpKTt4P0Qoci54LHIueStnW3MtMV0ueSxnW3MtMV0ueCtuKTpEKHIueCxyLnksbCtuKX19fWZ1bmN0aW9uIHoodCxlKXtsZXQgbj10Lmxlbmd0aDtmb3IoOy0tbj49MDspe2NvbnN0IGk9bjtsZXQgcj1uLTE7cjwwJiYocj10Lmxlbmd0aC0xKTtmb3IobGV0IHQ9MCxuPXMrMipwO3Q8bjt0Kyspe2NvbnN0IG49QSp0LG89QSoodCsxKTtIKGUraStuLGUrcituLGUrcitvLGUraStvKX19fWZ1bmN0aW9uIEQodCxlLG4pe28ucHVzaCh0KSxvLnB1c2goZSksby5wdXNoKG4pfWZ1bmN0aW9uIEIodCxlLHIpe0YodCksRihlKSxGKHIpO2NvbnN0IG89aS5sZW5ndGgvMyxhPW0uZ2VuZXJhdGVUb3BVVihuLGksby0zLG8tMixvLTEpO1YoYVswXSksVihhWzFdKSxWKGFbMl0pfWZ1bmN0aW9uIEgodCxlLHIsbyl7Rih0KSxGKGUpLEYobyksRihlKSxGKHIpLEYobyk7Y29uc3QgYT1pLmxlbmd0aC8zLHM9bS5nZW5lcmF0ZVNpZGVXYWxsVVYobixpLGEtNixhLTMsYS0yLGEtMSk7VihzWzBdKSxWKHNbMV0pLFYoc1szXSksVihzWzFdKSxWKHNbMl0pLFYoc1szXSl9ZnVuY3Rpb24gRih0KXtpLnB1c2gob1szKnQrMF0pLGkucHVzaChvWzMqdCsxXSksaS5wdXNoKG9bMyp0KzJdKX1mdW5jdGlvbiBWKHQpe3IucHVzaCh0LngpLHIucHVzaCh0LnkpfSEoZnVuY3Rpb24gVSgpe2NvbnN0IHQ9aS5sZW5ndGgvMztpZihjKXtsZXQgdD0wLGU9QSp0O2ZvcihsZXQgdD0wO3Q8azt0Kyspe2NvbnN0IG49RVt0XTtCKG5bMl0rZSxuWzFdK2UsblswXStlKX10PXMrMipwLGU9QSp0O2ZvcihsZXQgdD0wO3Q8azt0Kyspe2NvbnN0IG49RVt0XTtCKG5bMF0rZSxuWzFdK2UsblsyXStlKX19ZWxzZXtmb3IobGV0IHQ9MDt0PGs7dCsrKXtjb25zdCBlPUVbdF07QihlWzJdLGVbMV0sZVswXSl9Zm9yKGxldCB0PTA7dDxrO3QrKyl7Y29uc3QgZT1FW3RdO0IoZVswXStBKnMsZVsxXStBKnMsZVsyXStBKnMpfX1uLmFkZEdyb3VwKHQsaS5sZW5ndGgvMy10LDApfSkoKSwoZnVuY3Rpb24gaigpe2NvbnN0IHQ9aS5sZW5ndGgvMztsZXQgZT0wO3ooVCxlKSxlKz1ULmxlbmd0aDtmb3IobGV0IHQ9MCxuPU0ubGVuZ3RoO3Q8bjt0Kyspe2NvbnN0IG49TVt0XTt6KG4sZSksZSs9bi5sZW5ndGh9bi5hZGRHcm91cCh0LGkubGVuZ3RoLzMtdCwxKX0pKCl9dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KGksMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IGwxdChyLDIpKSx0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCl9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4oZnVuY3Rpb24gZSh0LG4saSl7aWYoaS5zaGFwZXM9W10sQXJyYXkuaXNBcnJheSh0KSlmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspaS5zaGFwZXMucHVzaCh0W2VdLnV1aWQpO2Vsc2UgaS5zaGFwZXMucHVzaCh0LnV1aWQpO3JldHVybiB2b2lkIDAhPT1uLmV4dHJ1ZGVQYXRoJiYoaS5vcHRpb25zLmV4dHJ1ZGVQYXRoPW4uZXh0cnVkZVBhdGgudG9KU09OKCkpLGl9KSh0aGlzLnBhcmFtZXRlcnMuc2hhcGVzLHRoaXMucGFyYW1ldGVycy5vcHRpb25zLHQpfXN0YXRpYyBmcm9tSlNPTih0LGUpe2NvbnN0IG49W107Zm9yKGxldCBpPTAscj10LnNoYXBlcy5sZW5ndGg7aTxyO2krKyluLnB1c2goZVt0LnNoYXBlc1tpXV0pO2NvbnN0IGk9dC5vcHRpb25zLmV4dHJ1ZGVQYXRoO3JldHVybiB2b2lkIDAhPT1pJiYodC5vcHRpb25zLmV4dHJ1ZGVQYXRoPShuZXcgTDR0W2kudHlwZV0pLmZyb21KU09OKGkpKSxuZXcgcjZ0KG4sdC5vcHRpb25zKX19Y29uc3QgbzZ0PXtnZW5lcmF0ZVRvcFVWOmZ1bmN0aW9uKHQsZSxuLGkscil7Y29uc3Qgbz1lWzMqaV0sYT1lWzMqaSsxXSxzPWVbMypyXSxsPWVbMypyKzFdO3JldHVybltuZXcgbUp0KGVbMypuXSxlWzMqbisxXSksbmV3IG1KdChvLGEpLG5ldyBtSnQocyxsKV19LGdlbmVyYXRlU2lkZVdhbGxVVjpmdW5jdGlvbih0LGUsbixpLHIsbyl7Y29uc3QgYT1lWzMqbl0scz1lWzMqbisxXSxsPWVbMypuKzJdLGM9ZVszKmldLHU9ZVszKmkrMV0saD1lWzMqaSsyXSxkPWVbMypyXSxwPWVbMypyKzFdLGY9ZVszKnIrMl0sbT1lWzMqb10sZz1lWzMqbysxXSxfPWVbMypvKzJdO3JldHVybiBNYXRoLmFicyhzLXUpPE1hdGguYWJzKGEtYyk/W25ldyBtSnQoYSwxLWwpLG5ldyBtSnQoYywxLWgpLG5ldyBtSnQoZCwxLWYpLG5ldyBtSnQobSwxLV8pXTpbbmV3IG1KdChzLDEtbCksbmV3IG1KdCh1LDEtaCksbmV3IG1KdChwLDEtZiksbmV3IG1KdChnLDEtXyldfX07Y2xhc3MgYTZ0IGV4dGVuZHMgcjR0e2NvbnN0cnVjdG9yKHQ9MSxlPTApe2NvbnN0IG49KDErTWF0aC5zcXJ0KDUpKS8yO3N1cGVyKFstMSxuLDAsMSxuLDAsLTEsLW4sMCwxLC1uLDAsMCwtMSxuLDAsMSxuLDAsLTEsLW4sMCwxLC1uLG4sMCwtMSxuLDAsMSwtbiwwLC0xLC1uLDAsMV0sWzAsMTEsNSwwLDUsMSwwLDEsNywwLDcsMTAsMCwxMCwxMSwxLDUsOSw1LDExLDQsMTEsMTAsMiwxMCw3LDYsNywxLDgsMyw5LDQsMyw0LDIsMywyLDYsMyw2LDgsMyw4LDksNCw5LDUsMiw0LDExLDYsMiwxMCw4LDYsNyw5LDgsMV0sdCxlKSx0aGlzLnR5cGU9Ikljb3NhaGVkcm9uR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOnQsZGV0YWlsOmV9fXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IGE2dCh0LnJhZGl1cyx0LmRldGFpbCl9fWNsYXNzIHM2dCBleHRlbmRzIGIxdHtjb25zdHJ1Y3Rvcih0LGU9MTIsbj0wLGk9MipNYXRoLlBJKXtzdXBlcigpLHRoaXMudHlwZT0iTGF0aGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtwb2ludHM6dCxzZWdtZW50czplLHBoaVN0YXJ0Om4scGhpTGVuZ3RoOml9LGU9TWF0aC5mbG9vcihlKSxpPSRadChpLDAsMipNYXRoLlBJKTtjb25zdCByPVtdLG89W10sYT1bXSxzPTEvZSxsPW5ldyBDSnQsYz1uZXcgbUp0O2ZvcihsZXQgcj0wO3I8PWU7cisrKXtjb25zdCB1PW4rcipzKmksaD1NYXRoLnNpbih1KSxkPU1hdGguY29zKHUpO2ZvcihsZXQgbj0wO248PXQubGVuZ3RoLTE7bisrKWwueD10W25dLngqaCxsLnk9dFtuXS55LGwuej10W25dLngqZCxvLnB1c2gobC54LGwueSxsLnopLGMueD1yL2UsYy55PW4vKHQubGVuZ3RoLTEpLGEucHVzaChjLngsYy55KX1mb3IobGV0IG49MDtuPGU7bisrKWZvcihsZXQgZT0wO2U8dC5sZW5ndGgtMTtlKyspe2NvbnN0IGk9ZStuKnQubGVuZ3RoLG89aSt0Lmxlbmd0aCxhPWkrdC5sZW5ndGgrMSxzPWkrMTtyLnB1c2goaSxvLHMpLHIucHVzaChvLGEscyl9aWYodGhpcy5zZXRJbmRleChyKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBsMXQobywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgbDF0KGEsMikpLHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKSxpPT09MipNYXRoLlBJKXtjb25zdCBuPXRoaXMuYXR0cmlidXRlcy5ub3JtYWwuYXJyYXksaT1uZXcgQ0p0LHI9bmV3IENKdCxvPW5ldyBDSnQsYT1lKnQubGVuZ3RoKjM7Zm9yKGxldCBlPTAscz0wO2U8dC5sZW5ndGg7ZSsrLHMrPTMpaS54PW5bcyswXSxpLnk9bltzKzFdLGkuej1uW3MrMl0sci54PW5bYStzKzBdLHIueT1uW2ErcysxXSxyLno9blthK3MrMl0sby5hZGRWZWN0b3JzKGkscikubm9ybWFsaXplKCksbltzKzBdPW5bYStzKzBdPW8ueCxuW3MrMV09blthK3MrMV09by55LG5bcysyXT1uW2ErcysyXT1vLnp9fXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IHM2dCh0LnBvaW50cyx0LnNlZ21lbnRzLHQucGhpU3RhcnQsdC5waGlMZW5ndGgpfX1jbGFzcyBsNnQgZXh0ZW5kcyByNHR7Y29uc3RydWN0b3IodD0xLGU9MCl7c3VwZXIoWzEsMCwwLC0xLDAsMCwwLDEsMCwwLC0xLDAsMCwwLDEsMCwwLC0xXSxbMCwyLDQsMCw0LDMsMCwzLDUsMCw1LDIsMSwyLDUsMSw1LDMsMSwzLDQsMSw0LDJdLHQsZSksdGhpcy50eXBlPSJPY3RhaGVkcm9uR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOnQsZGV0YWlsOmV9fXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IGw2dCh0LnJhZGl1cyx0LmRldGFpbCl9fWNsYXNzIGM2dCBleHRlbmRzIGIxdHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIoKSx0aGlzLnR5cGU9IlBhcmFtZXRyaWNHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtmdW5jOnQsc2xpY2VzOmUsc3RhY2tzOm59O2NvbnN0IGk9W10scj1bXSxvPVtdLGE9W10scz0xZS01LGw9bmV3IENKdCxjPW5ldyBDSnQsdT1uZXcgQ0p0LGg9bmV3IENKdCxkPW5ldyBDSnQ7dC5sZW5ndGg8MyYmY29uc29sZS5lcnJvcigiVEhSRUUuUGFyYW1ldHJpY0dlb21ldHJ5OiBGdW5jdGlvbiBtdXN0IG5vdyBtb2RpZnkgYSBWZWN0b3IzIGFzIHRoaXJkIHBhcmFtZXRlci4iKTtjb25zdCBwPWUrMTtmb3IobGV0IGk9MDtpPD1uO2krKyl7Y29uc3QgcD1pL247Zm9yKGxldCBuPTA7bjw9ZTtuKyspe2NvbnN0IGk9bi9lO3QoaSxwLGMpLHIucHVzaChjLngsYy55LGMueiksaS1zPj0wPyh0KGktcyxwLHUpLGguc3ViVmVjdG9ycyhjLHUpKToodChpK3MscCx1KSxoLnN1YlZlY3RvcnModSxjKSkscC1zPj0wPyh0KGkscC1zLHUpLGQuc3ViVmVjdG9ycyhjLHUpKToodChpLHArcyx1KSxkLnN1YlZlY3RvcnModSxjKSksbC5jcm9zc1ZlY3RvcnMoaCxkKS5ub3JtYWxpemUoKSxvLnB1c2gobC54LGwueSxsLnopLGEucHVzaChpLHApfX1mb3IobGV0IHQ9MDt0PG47dCsrKWZvcihsZXQgbj0wO248ZTtuKyspe2NvbnN0IGU9dCpwK24rMSxyPSh0KzEpKnArbisxLG89KHQrMSkqcCtuO2kucHVzaCh0KnArbixlLG8pLGkucHVzaChlLHIsbyl9dGhpcy5zZXRJbmRleChpKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBsMXQociwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGwxdChvLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBsMXQoYSwyKSl9fWNsYXNzIHU2dCBleHRlbmRzIGIxdHtjb25zdHJ1Y3Rvcih0PS41LGU9MSxuPTgsaT0xLHI9MCxvPTIqTWF0aC5QSSl7c3VwZXIoKSx0aGlzLnR5cGU9IlJpbmdHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtpbm5lclJhZGl1czp0LG91dGVyUmFkaXVzOmUsdGhldGFTZWdtZW50czpuLHBoaVNlZ21lbnRzOmksdGhldGFTdGFydDpyLHRoZXRhTGVuZ3RoOm99LG49TWF0aC5tYXgoMyxuKTtjb25zdCBhPVtdLHM9W10sbD1bXSxjPVtdO2xldCB1PXQ7Y29uc3QgaD0oZS10KS8oaT1NYXRoLm1heCgxLGkpKSxkPW5ldyBDSnQscD1uZXcgbUp0O2ZvcihsZXQgdD0wO3Q8PWk7dCsrKXtmb3IobGV0IHQ9MDt0PD1uO3QrKyl7Y29uc3QgaT1yK3QvbipvO2QueD11Kk1hdGguY29zKGkpLGQueT11Kk1hdGguc2luKGkpLHMucHVzaChkLngsZC55LGQueiksbC5wdXNoKDAsMCwxKSxwLng9KGQueC9lKzEpLzIscC55PShkLnkvZSsxKS8yLGMucHVzaChwLngscC55KX11Kz1ofWZvcihsZXQgdD0wO3Q8aTt0Kyspe2NvbnN0IGU9dCoobisxKTtmb3IobGV0IHQ9MDt0PG47dCsrKXtjb25zdCBpPXQrZSxyPWkrbisxLG89aStuKzIscz1pKzE7YS5wdXNoKGkscixzKSxhLnB1c2gocixvLHMpfX10aGlzLnNldEluZGV4KGEpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGwxdChzLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgbDF0KGwsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IGwxdChjLDIpKX1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyB1NnQodC5pbm5lclJhZGl1cyx0Lm91dGVyUmFkaXVzLHQudGhldGFTZWdtZW50cyx0LnBoaVNlZ21lbnRzLHQudGhldGFTdGFydCx0LnRoZXRhTGVuZ3RoKX19Y2xhc3MgaDZ0IGV4dGVuZHMgYjF0e2NvbnN0cnVjdG9yKHQsZT0xMil7c3VwZXIoKSx0aGlzLnR5cGU9IlNoYXBlR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17c2hhcGVzOnQsY3VydmVTZWdtZW50czplfTtjb25zdCBuPVtdLGk9W10scj1bXSxvPVtdO2xldCBhPTAscz0wO2lmKCExPT09QXJyYXkuaXNBcnJheSh0KSlsKHQpO2Vsc2UgZm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspbCh0W2VdKSx0aGlzLmFkZEdyb3VwKGEscyxlKSxhKz1zLHM9MDtmdW5jdGlvbiBsKHQpe2NvbnN0IGE9aS5sZW5ndGgvMyxsPXQuZXh0cmFjdFBvaW50cyhlKTtsZXQgYz1sLnNoYXBlO2NvbnN0IHU9bC5ob2xlczshMT09PWU2dC5pc0Nsb2NrV2lzZShjKSYmKGM9Yy5yZXZlcnNlKCkpO2ZvcihsZXQgdD0wLGU9dS5sZW5ndGg7dDxlO3QrKyl7Y29uc3QgZT11W3RdOyEwPT09ZTZ0LmlzQ2xvY2tXaXNlKGUpJiYodVt0XT1lLnJldmVyc2UoKSl9Y29uc3QgaD1lNnQudHJpYW5ndWxhdGVTaGFwZShjLHUpO2ZvcihsZXQgdD0wLGU9dS5sZW5ndGg7dDxlO3QrKyljPWMuY29uY2F0KHVbdF0pO2ZvcihsZXQgdD0wLGU9Yy5sZW5ndGg7dDxlO3QrKyl7Y29uc3QgZT1jW3RdO2kucHVzaChlLngsZS55LDApLHIucHVzaCgwLDAsMSksby5wdXNoKGUueCxlLnkpfWZvcihsZXQgdD0wLGU9aC5sZW5ndGg7dDxlO3QrKyl7Y29uc3QgZT1oW3RdO24ucHVzaChlWzBdK2EsZVsxXSthLGVbMl0rYSkscys9M319dGhpcy5zZXRJbmRleChuKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBsMXQoaSwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGwxdChyLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBsMXQobywyKSl9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4oZnVuY3Rpb24gZSh0LG4pe2lmKG4uc2hhcGVzPVtdLEFycmF5LmlzQXJyYXkodCkpZm9yKGxldCBlPTAsaT10Lmxlbmd0aDtlPGk7ZSsrKW4uc2hhcGVzLnB1c2godFtlXS51dWlkKTtlbHNlIG4uc2hhcGVzLnB1c2godC51dWlkKTtyZXR1cm4gbn0pKHRoaXMucGFyYW1ldGVycy5zaGFwZXMsdCl9c3RhdGljIGZyb21KU09OKHQsZSl7Y29uc3Qgbj1bXTtmb3IobGV0IGk9MCxyPXQuc2hhcGVzLmxlbmd0aDtpPHI7aSsrKW4ucHVzaChlW3Quc2hhcGVzW2ldXSk7cmV0dXJuIG5ldyBoNnQobix0LmN1cnZlU2VnbWVudHMpfX1jbGFzcyBkNnQgZXh0ZW5kcyBiMXR7Y29uc3RydWN0b3IodD0xLGU9MzIsbj0xNixpPTAscj0yKk1hdGguUEksbz0wLGE9TWF0aC5QSSl7c3VwZXIoKSx0aGlzLnR5cGU9IlNwaGVyZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czp0LHdpZHRoU2VnbWVudHM6ZSxoZWlnaHRTZWdtZW50czpuLHBoaVN0YXJ0OmkscGhpTGVuZ3RoOnIsdGhldGFTdGFydDpvLHRoZXRhTGVuZ3RoOmF9LGU9TWF0aC5tYXgoMyxNYXRoLmZsb29yKGUpKSxuPU1hdGgubWF4KDIsTWF0aC5mbG9vcihuKSk7Y29uc3Qgcz1NYXRoLm1pbihvK2EsTWF0aC5QSSk7bGV0IGw9MDtjb25zdCBjPVtdLHU9bmV3IENKdCxoPW5ldyBDSnQsZD1bXSxwPVtdLGY9W10sbT1bXTtmb3IobGV0IGQ9MDtkPD1uO2QrKyl7Y29uc3QgZz1bXSxfPWQvbjtsZXQgeT0wOzA9PWQmJjA9PW8/eT0uNS9lOmQ9PW4mJnM9PU1hdGguUEkmJih5PS0uNS9lKTtmb3IobGV0IG49MDtuPD1lO24rKyl7Y29uc3Qgcz1uL2U7dS54PS10Kk1hdGguY29zKGkrcypyKSpNYXRoLnNpbihvK18qYSksdS55PXQqTWF0aC5jb3MobytfKmEpLHUuej10Kk1hdGguc2luKGkrcypyKSpNYXRoLnNpbihvK18qYSkscC5wdXNoKHUueCx1LnksdS56KSxoLmNvcHkodSkubm9ybWFsaXplKCksZi5wdXNoKGgueCxoLnksaC56KSxtLnB1c2gocyt5LDEtXyksZy5wdXNoKGwrKyl9Yy5wdXNoKGcpfWZvcihsZXQgdD0wO3Q8bjt0KyspZm9yKGxldCBpPTA7aTxlO2krKyl7Y29uc3QgZT1jW3RdW2krMV0scj1jW3RdW2ldLGE9Y1t0KzFdW2ldLGw9Y1t0KzFdW2krMV07KDAhPT10fHxvPjApJiZkLnB1c2goZSxyLGwpLCh0IT09bi0xfHxzPE1hdGguUEkpJiZkLnB1c2gocixhLGwpfXRoaXMuc2V0SW5kZXgoZCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KHAsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBsMXQoZiwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgbDF0KG0sMikpfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IGQ2dCh0LnJhZGl1cyx0LndpZHRoU2VnbWVudHMsdC5oZWlnaHRTZWdtZW50cyx0LnBoaVN0YXJ0LHQucGhpTGVuZ3RoLHQudGhldGFTdGFydCx0LnRoZXRhTGVuZ3RoKX19Y2xhc3MgcDZ0IGV4dGVuZHMgcjR0e2NvbnN0cnVjdG9yKHQ9MSxlPTApe3N1cGVyKFsxLDEsMSwtMSwtMSwxLC0xLDEsLTEsMSwtMSwtMV0sWzIsMSwwLDAsMywyLDEsMywwLDIsMywxXSx0LGUpLHRoaXMudHlwZT0iVGV0cmFoZWRyb25HZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6dCxkZXRhaWw6ZX19c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgcDZ0KHQucmFkaXVzLHQuZGV0YWlsKX19Y2xhc3MgZjZ0IGV4dGVuZHMgcjZ0e2NvbnN0cnVjdG9yKHQsZT17fSl7Y29uc3Qgbj1lLmZvbnQ7aWYoIW58fCFuLmlzRm9udClyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuVGV4dEdlb21ldHJ5OiBmb250IHBhcmFtZXRlciBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuRm9udC4iKSxuZXcgYjF0O2NvbnN0IGk9bi5nZW5lcmF0ZVNoYXBlcyh0LGUuc2l6ZSk7ZS5kZXB0aD12b2lkIDAhPT1lLmhlaWdodD9lLmhlaWdodDo1MCx2b2lkIDA9PT1lLmJldmVsVGhpY2tuZXNzJiYoZS5iZXZlbFRoaWNrbmVzcz0xMCksdm9pZCAwPT09ZS5iZXZlbFNpemUmJihlLmJldmVsU2l6ZT04KSx2b2lkIDA9PT1lLmJldmVsRW5hYmxlZCYmKGUuYmV2ZWxFbmFibGVkPSExKSxzdXBlcihpLGUpLHRoaXMudHlwZT0iVGV4dEdlb21ldHJ5In19Y2xhc3MgbTZ0IGV4dGVuZHMgYjF0e2NvbnN0cnVjdG9yKHQ9MSxlPS40LG49OCxpPTYscj0yKk1hdGguUEkpe3N1cGVyKCksdGhpcy50eXBlPSJUb3J1c0dlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czp0LHR1YmU6ZSxyYWRpYWxTZWdtZW50czpuLHR1YnVsYXJTZWdtZW50czppLGFyYzpyfSxuPU1hdGguZmxvb3IobiksaT1NYXRoLmZsb29yKGkpO2NvbnN0IG89W10sYT1bXSxzPVtdLGw9W10sYz1uZXcgQ0p0LHU9bmV3IENKdCxoPW5ldyBDSnQ7Zm9yKGxldCBvPTA7bzw9bjtvKyspZm9yKGxldCBkPTA7ZDw9aTtkKyspe2NvbnN0IHA9ZC9pKnIsZj1vL24qTWF0aC5QSSoyO3UueD0odCtlKk1hdGguY29zKGYpKSpNYXRoLmNvcyhwKSx1Lnk9KHQrZSpNYXRoLmNvcyhmKSkqTWF0aC5zaW4ocCksdS56PWUqTWF0aC5zaW4oZiksYS5wdXNoKHUueCx1LnksdS56KSxjLng9dCpNYXRoLmNvcyhwKSxjLnk9dCpNYXRoLnNpbihwKSxoLnN1YlZlY3RvcnModSxjKS5ub3JtYWxpemUoKSxzLnB1c2goaC54LGgueSxoLnopLGwucHVzaChkL2kpLGwucHVzaChvL24pfWZvcihsZXQgdD0xO3Q8PW47dCsrKWZvcihsZXQgZT0xO2U8PWk7ZSsrKXtjb25zdCBuPShpKzEpKih0LTEpK2UtMSxyPShpKzEpKih0LTEpK2UsYT0oaSsxKSp0K2U7by5wdXNoKChpKzEpKnQrZS0xLG4sYSksby5wdXNoKG4scixhKX10aGlzLnNldEluZGV4KG8pLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGwxdChhLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgbDF0KHMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IGwxdChsLDIpKX1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBtNnQodC5yYWRpdXMsdC50dWJlLHQucmFkaWFsU2VnbWVudHMsdC50dWJ1bGFyU2VnbWVudHMsdC5hcmMpfX1jbGFzcyBnNnQgZXh0ZW5kcyBiMXR7Y29uc3RydWN0b3IodD0xLGU9LjQsbj02NCxpPTgscj0yLG89Myl7c3VwZXIoKSx0aGlzLnR5cGU9IlRvcnVzS25vdEdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czp0LHR1YmU6ZSx0dWJ1bGFyU2VnbWVudHM6bixyYWRpYWxTZWdtZW50czppLHA6cixxOm99LG49TWF0aC5mbG9vcihuKSxpPU1hdGguZmxvb3IoaSk7Y29uc3QgYT1bXSxzPVtdLGw9W10sYz1bXSx1PW5ldyBDSnQsaD1uZXcgQ0p0LGQ9bmV3IENKdCxwPW5ldyBDSnQsZj1uZXcgQ0p0LG09bmV3IENKdCxnPW5ldyBDSnQ7Zm9yKGxldCBhPTA7YTw9bjsrK2Epe2NvbnN0IHk9YS9uKnIqTWF0aC5QSSoyO18oeSxyLG8sdCxkKSxfKHkrLjAxLHIsbyx0LHApLG0uc3ViVmVjdG9ycyhwLGQpLGcuYWRkVmVjdG9ycyhwLGQpLGYuY3Jvc3NWZWN0b3JzKG0sZyksZy5jcm9zc1ZlY3RvcnMoZixtKSxmLm5vcm1hbGl6ZSgpLGcubm9ybWFsaXplKCk7Zm9yKGxldCB0PTA7dDw9aTsrK3Qpe2NvbnN0IHI9dC9pKk1hdGguUEkqMixvPS1lKk1hdGguY29zKHIpLHA9ZSpNYXRoLnNpbihyKTt1Lng9ZC54KyhvKmcueCtwKmYueCksdS55PWQueSsobypnLnkrcCpmLnkpLHUuej1kLnorKG8qZy56K3AqZi56KSxzLnB1c2godS54LHUueSx1LnopLGguc3ViVmVjdG9ycyh1LGQpLm5vcm1hbGl6ZSgpLGwucHVzaChoLngsaC55LGgueiksYy5wdXNoKGEvbiksYy5wdXNoKHQvaSl9fWZvcihsZXQgdD0xO3Q8PW47dCsrKWZvcihsZXQgZT0xO2U8PWk7ZSsrKXtjb25zdCBuPShpKzEpKnQrKGUtMSkscj0oaSsxKSp0K2Usbz0oaSsxKSoodC0xKStlO2EucHVzaCgoaSsxKSoodC0xKSsoZS0xKSxuLG8pLGEucHVzaChuLHIsbyl9ZnVuY3Rpb24gXyh0LGUsbixpLHIpe2NvbnN0IG89TWF0aC5jb3ModCksYT1NYXRoLnNpbih0KSxzPW4vZSp0LGw9TWF0aC5jb3Mocyk7ci54PWkqKDIrbCkqLjUqbyxyLnk9aSooMitsKSphKi41LHIuej1pKk1hdGguc2luKHMpKi41fXRoaXMuc2V0SW5kZXgoYSksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KHMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBsMXQobCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgbDF0KGMsMikpfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IGc2dCh0LnJhZGl1cyx0LnR1YmUsdC50dWJ1bGFyU2VnbWVudHMsdC5yYWRpYWxTZWdtZW50cyx0LnAsdC5xKX19Y2xhc3MgXzZ0IGV4dGVuZHMgYjF0e2NvbnN0cnVjdG9yKHQsZT02NCxuPTEsaT04LHI9ITEpe3N1cGVyKCksdGhpcy50eXBlPSJUdWJlR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cGF0aDp0LHR1YnVsYXJTZWdtZW50czplLHJhZGl1czpuLHJhZGlhbFNlZ21lbnRzOmksY2xvc2VkOnJ9O2NvbnN0IG89dC5jb21wdXRlRnJlbmV0RnJhbWVzKGUscik7dGhpcy50YW5nZW50cz1vLnRhbmdlbnRzLHRoaXMubm9ybWFscz1vLm5vcm1hbHMsdGhpcy5iaW5vcm1hbHM9by5iaW5vcm1hbHM7Y29uc3QgYT1uZXcgQ0p0LHM9bmV3IENKdCxsPW5ldyBtSnQ7bGV0IGM9bmV3IENKdDtjb25zdCB1PVtdLGg9W10sZD1bXSxwPVtdO2Z1bmN0aW9uIGYocil7Yz10LmdldFBvaW50QXQoci9lLGMpO2NvbnN0IGw9by5ub3JtYWxzW3JdLGQ9by5iaW5vcm1hbHNbcl07Zm9yKGxldCB0PTA7dDw9aTt0Kyspe2NvbnN0IGU9dC9pKk1hdGguUEkqMixyPU1hdGguc2luKGUpLG89LU1hdGguY29zKGUpO3MueD1vKmwueCtyKmQueCxzLnk9bypsLnkrcipkLnkscy56PW8qbC56K3IqZC56LHMubm9ybWFsaXplKCksaC5wdXNoKHMueCxzLnkscy56KSxhLng9Yy54K24qcy54LGEueT1jLnkrbipzLnksYS56PWMueituKnMueix1LnB1c2goYS54LGEueSxhLnopfX0hKGZ1bmN0aW9uIG0oKXtmb3IobGV0IHQ9MDt0PGU7dCsrKWYodCk7ZighMT09PXI/ZTowKSwoZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8PWU7dCsrKWZvcihsZXQgbj0wO248PWk7bisrKWwueD10L2UsbC55PW4vaSxkLnB1c2gobC54LGwueSl9KSgpLChmdW5jdGlvbiBuKCl7Zm9yKGxldCB0PTE7dDw9ZTt0KyspZm9yKGxldCBlPTE7ZTw9aTtlKyspe2NvbnN0IG49KGkrMSkqdCsoZS0xKSxyPShpKzEpKnQrZSxvPShpKzEpKih0LTEpK2U7cC5wdXNoKChpKzEpKih0LTEpKyhlLTEpLG4sbykscC5wdXNoKG4scixvKX19KSgpfSkoKSx0aGlzLnNldEluZGV4KHApLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGwxdCh1LDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgbDF0KGgsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IGwxdChkLDIpKX10b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnBhdGg9dGhpcy5wYXJhbWV0ZXJzLnBhdGgudG9KU09OKCksdH1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBfNnQoKG5ldyBMNHRbdC5wYXRoLnR5cGVdKS5mcm9tSlNPTih0LnBhdGgpLHQudHVidWxhclNlZ21lbnRzLHQucmFkaXVzLHQucmFkaWFsU2VnbWVudHMsdC5jbG9zZWQpfX1jbGFzcyB5NnQgZXh0ZW5kcyBiMXR7Y29uc3RydWN0b3IodCl7aWYoc3VwZXIoKSx0aGlzLnR5cGU9IldpcmVmcmFtZUdlb21ldHJ5IiwhMD09PXQuaXNHZW9tZXRyeSlyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5XaXJlZnJhbWVHZW9tZXRyeSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpO2NvbnN0IGU9W10sbj1uZXcgU2V0LGk9bmV3IENKdCxyPW5ldyBDSnQ7aWYobnVsbCE9PXQuaW5kZXgpe2NvbnN0IG89dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLGE9dC5pbmRleDtsZXQgcz10Lmdyb3VwczswPT09cy5sZW5ndGgmJihzPVt7c3RhcnQ6MCxjb3VudDphLmNvdW50LG1hdGVyaWFsSW5kZXg6MH1dKTtmb3IobGV0IHQ9MCxsPXMubGVuZ3RoO3Q8bDsrK3Qpe2NvbnN0IGw9c1t0XSxjPWwuc3RhcnQ7Zm9yKGxldCB0PWMscz1jK2wuY291bnQ7dDxzO3QrPTMpZm9yKGxldCBzPTA7czwzO3MrKyl7Y29uc3QgbD1hLmdldFgodCtzKSxjPWEuZ2V0WCh0KyhzKzEpJTMpO2kuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLGwpLHIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLGMpLCEwPT09djZ0KGkscixuKSYmKGUucHVzaChpLngsaS55LGkueiksZS5wdXNoKHIueCxyLnksci56KSl9fX1lbHNle2NvbnN0IG89dC5hdHRyaWJ1dGVzLnBvc2l0aW9uO2ZvcihsZXQgdD0wLGE9by5jb3VudC8zO3Q8YTt0KyspZm9yKGxldCBhPTA7YTwzO2ErKyl7Y29uc3Qgcz0zKnQrKGErMSklMztpLmZyb21CdWZmZXJBdHRyaWJ1dGUobywzKnQrYSksci5mcm9tQnVmZmVyQXR0cmlidXRlKG8scyksITA9PT12NnQoaSxyLG4pJiYoZS5wdXNoKGkueCxpLnksaS56KSxlLnB1c2goci54LHIueSxyLnopKX19dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KGUsMykpfX1mdW5jdGlvbiB2NnQodCxlLG4pe2NvbnN0IGk9YCR7dC54fSwke3QueX0sJHt0Lnp9LSR7ZS54fSwke2UueX0sJHtlLnp9YCxyPWAke2UueH0sJHtlLnl9LCR7ZS56fS0ke3QueH0sJHt0Lnl9LCR7dC56fWA7cmV0dXJuITAhPT1uLmhhcyhpKSYmITAhPT1uLmhhcyhyKSYmKG4uYWRkKGksciksITApfXZhciBiNnQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQm94R2VvbWV0cnk6RjF0LEJveEJ1ZmZlckdlb21ldHJ5OkYxdCxDaXJjbGVHZW9tZXRyeTplNHQsQ2lyY2xlQnVmZmVyR2VvbWV0cnk6ZTR0LENvbmVHZW9tZXRyeTppNHQsQ29uZUJ1ZmZlckdlb21ldHJ5Omk0dCxDeWxpbmRlckdlb21ldHJ5Om40dCxDeWxpbmRlckJ1ZmZlckdlb21ldHJ5Om40dCxEb2RlY2FoZWRyb25HZW9tZXRyeTpvNHQsRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnk6bzR0LEVkZ2VzR2VvbWV0cnk6dTR0LEV4dHJ1ZGVHZW9tZXRyeTpyNnQsRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OnI2dCxJY29zYWhlZHJvbkdlb21ldHJ5OmE2dCxJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OmE2dCxMYXRoZUdlb21ldHJ5OnM2dCxMYXRoZUJ1ZmZlckdlb21ldHJ5OnM2dCxPY3RhaGVkcm9uR2VvbWV0cnk6bDZ0LE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeTpsNnQsUGFyYW1ldHJpY0dlb21ldHJ5OmM2dCxQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnk6YzZ0LFBsYW5lR2VvbWV0cnk6YTB0LFBsYW5lQnVmZmVyR2VvbWV0cnk6YTB0LFBvbHloZWRyb25HZW9tZXRyeTpyNHQsUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5OnI0dCxSaW5nR2VvbWV0cnk6dTZ0LFJpbmdCdWZmZXJHZW9tZXRyeTp1NnQsU2hhcGVHZW9tZXRyeTpoNnQsU2hhcGVCdWZmZXJHZW9tZXRyeTpoNnQsU3BoZXJlR2VvbWV0cnk6ZDZ0LFNwaGVyZUJ1ZmZlckdlb21ldHJ5OmQ2dCxUZXRyYWhlZHJvbkdlb21ldHJ5OnA2dCxUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OnA2dCxUZXh0R2VvbWV0cnk6ZjZ0LFRleHRCdWZmZXJHZW9tZXRyeTpmNnQsVG9ydXNHZW9tZXRyeTptNnQsVG9ydXNCdWZmZXJHZW9tZXRyeTptNnQsVG9ydXNLbm90R2VvbWV0cnk6ZzZ0LFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5Omc2dCxUdWJlR2VvbWV0cnk6XzZ0LFR1YmVCdWZmZXJHZW9tZXRyeTpfNnQsV2lyZWZyYW1lR2VvbWV0cnk6eTZ0fSk7Y2xhc3MgeDZ0IGV4dGVuZHMgVVF0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy50eXBlPSJTaGFkb3dNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgJFF0KDApLHRoaXMudHJhbnNwYXJlbnQ9ITAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpc319eDZ0LnByb3RvdHlwZS5pc1NoYWRvd01hdGVyaWFsPSEwO2NsYXNzIHc2dCBleHRlbmRzIFVRdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuZGVmaW5lcz17U1RBTkRBUkQ6IiJ9LHRoaXMudHlwZT0iTWVzaFN0YW5kYXJkTWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3ICRRdCgxNjc3NzIxNSksdGhpcy5yb3VnaG5lc3M9MSx0aGlzLm1ldGFsbmVzcz0wLHRoaXMubWFwPW51bGwsdGhpcy5saWdodE1hcD1udWxsLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9MSx0aGlzLmFvTWFwPW51bGwsdGhpcy5hb01hcEludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmU9bmV3ICRRdCgwKSx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZU1hcD1udWxsLHRoaXMuYnVtcE1hcD1udWxsLHRoaXMuYnVtcFNjYWxlPTEsdGhpcy5ub3JtYWxNYXA9bnVsbCx0aGlzLm5vcm1hbE1hcFR5cGU9MCx0aGlzLm5vcm1hbFNjYWxlPW5ldyBtSnQoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLnJvdWdobmVzc01hcD1udWxsLHRoaXMubWV0YWxuZXNzTWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZW52TWFwPW51bGwsdGhpcy5lbnZNYXBJbnRlbnNpdHk9MSx0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTgsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIix0aGlzLndpcmVmcmFtZUxpbmVqb2luPSJyb3VuZCIsdGhpcy5mbGF0U2hhZGluZz0hMSx0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuZGVmaW5lcz17U1RBTkRBUkQ6IiJ9LHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSx0aGlzLnJvdWdobmVzcz10LnJvdWdobmVzcyx0aGlzLm1ldGFsbmVzcz10Lm1ldGFsbmVzcyx0aGlzLm1hcD10Lm1hcCx0aGlzLmxpZ2h0TWFwPXQubGlnaHRNYXAsdGhpcy5saWdodE1hcEludGVuc2l0eT10LmxpZ2h0TWFwSW50ZW5zaXR5LHRoaXMuYW9NYXA9dC5hb01hcCx0aGlzLmFvTWFwSW50ZW5zaXR5PXQuYW9NYXBJbnRlbnNpdHksdGhpcy5lbWlzc2l2ZS5jb3B5KHQuZW1pc3NpdmUpLHRoaXMuZW1pc3NpdmVNYXA9dC5lbWlzc2l2ZU1hcCx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PXQuZW1pc3NpdmVJbnRlbnNpdHksdGhpcy5idW1wTWFwPXQuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT10LmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD10Lm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9dC5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weSh0Lm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD10LmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPXQuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPXQuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLnJvdWdobmVzc01hcD10LnJvdWdobmVzc01hcCx0aGlzLm1ldGFsbmVzc01hcD10Lm1ldGFsbmVzc01hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5lbnZNYXA9dC5lbnZNYXAsdGhpcy5lbnZNYXBJbnRlbnNpdHk9dC5lbnZNYXBJbnRlbnNpdHksdGhpcy5yZWZyYWN0aW9uUmF0aW89dC5yZWZyYWN0aW9uUmF0aW8sdGhpcy53aXJlZnJhbWU9dC53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy53aXJlZnJhbWVMaW5lY2FwPXQud2lyZWZyYW1lTGluZWNhcCx0aGlzLndpcmVmcmFtZUxpbmVqb2luPXQud2lyZWZyYW1lTGluZWpvaW4sdGhpcy5mbGF0U2hhZGluZz10LmZsYXRTaGFkaW5nLHRoaXN9fXc2dC5wcm90b3R5cGUuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD0hMDtjbGFzcyBTNnQgZXh0ZW5kcyB3NnR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIiLFBIWVNJQ0FMOiIifSx0aGlzLnR5cGU9Ik1lc2hQaHlzaWNhbE1hdGVyaWFsIix0aGlzLmNsZWFyY29hdD0wLHRoaXMuY2xlYXJjb2F0TWFwPW51bGwsdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3M9MCx0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcD1udWxsLHRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGU9bmV3IG1KdCgxLDEpLHRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwPW51bGwsdGhpcy5yZWZsZWN0aXZpdHk9LjUsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlvciIse2dldDpmdW5jdGlvbigpe3JldHVybigxKy40KnRoaXMucmVmbGVjdGl2aXR5KS8oMS0uNCp0aGlzLnJlZmxlY3Rpdml0eSl9LHNldDpmdW5jdGlvbih0KXt0aGlzLnJlZmxlY3Rpdml0eT0kWnQoMi41Kih0LTEpLyh0KzEpLDAsMSl9fSksdGhpcy5zaGVlbj1udWxsLHRoaXMudHJhbnNtaXNzaW9uPTAsdGhpcy50cmFuc21pc3Npb25NYXA9bnVsbCx0aGlzLnRoaWNrbmVzcz0uMDEsdGhpcy50aGlja25lc3NNYXA9bnVsbCx0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2U9MCx0aGlzLmF0dGVudWF0aW9uVGludD1uZXcgJFF0KDEsMSwxKSx0aGlzLnNwZWN1bGFySW50ZW5zaXR5PTEsdGhpcy5zcGVjdWxhckludGVuc2l0eU1hcD1udWxsLHRoaXMuc3BlY3VsYXJUaW50PW5ldyAkUXQoMSwxLDEpLHRoaXMuc3BlY3VsYXJUaW50TWFwPW51bGwsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIiLFBIWVNJQ0FMOiIifSx0aGlzLmNsZWFyY29hdD10LmNsZWFyY29hdCx0aGlzLmNsZWFyY29hdE1hcD10LmNsZWFyY29hdE1hcCx0aGlzLmNsZWFyY29hdFJvdWdobmVzcz10LmNsZWFyY29hdFJvdWdobmVzcyx0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcD10LmNsZWFyY29hdFJvdWdobmVzc01hcCx0aGlzLmNsZWFyY29hdE5vcm1hbE1hcD10LmNsZWFyY29hdE5vcm1hbE1hcCx0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLmNvcHkodC5jbGVhcmNvYXROb3JtYWxTY2FsZSksdGhpcy5yZWZsZWN0aXZpdHk9dC5yZWZsZWN0aXZpdHksdGhpcy5zaGVlbj10LnNoZWVuPyh0aGlzLnNoZWVufHxuZXcgJFF0KS5jb3B5KHQuc2hlZW4pOm51bGwsdGhpcy50cmFuc21pc3Npb249dC50cmFuc21pc3Npb24sdGhpcy50cmFuc21pc3Npb25NYXA9dC50cmFuc21pc3Npb25NYXAsdGhpcy50aGlja25lc3M9dC50aGlja25lc3MsdGhpcy50aGlja25lc3NNYXA9dC50aGlja25lc3NNYXAsdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlPXQuYXR0ZW51YXRpb25EaXN0YW5jZSx0aGlzLmF0dGVudWF0aW9uVGludC5jb3B5KHQuYXR0ZW51YXRpb25UaW50KSx0aGlzLnNwZWN1bGFySW50ZW5zaXR5PXQuc3BlY3VsYXJJbnRlbnNpdHksdGhpcy5zcGVjdWxhckludGVuc2l0eU1hcD10LnNwZWN1bGFySW50ZW5zaXR5TWFwLHRoaXMuc3BlY3VsYXJUaW50LmNvcHkodC5zcGVjdWxhclRpbnQpLHRoaXMuc3BlY3VsYXJUaW50TWFwPXQuc3BlY3VsYXJUaW50TWFwLHRoaXN9fVM2dC5wcm90b3R5cGUuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbD0hMDtjbGFzcyBNNnQgZXh0ZW5kcyBVUXR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9Ik1lc2hQaG9uZ01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyAkUXQoMTY3NzcyMTUpLHRoaXMuc3BlY3VsYXI9bmV3ICRRdCgxMTE4NDgxKSx0aGlzLnNoaW5pbmVzcz0zMCx0aGlzLm1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlPW5ldyAkUXQoMCksdGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmVNYXA9bnVsbCx0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPTAsdGhpcy5ub3JtYWxTY2FsZT1uZXcgbUp0KDEsMSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy5zcGVjdWxhck1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmVudk1hcD1udWxsLHRoaXMuY29tYmluZT0wLHRoaXMucmVmbGVjdGl2aXR5PTEsdGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4LHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuZmxhdFNoYWRpbmc9ITEsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5zcGVjdWxhci5jb3B5KHQuc3BlY3VsYXIpLHRoaXMuc2hpbmluZXNzPXQuc2hpbmluZXNzLHRoaXMubWFwPXQubWFwLHRoaXMubGlnaHRNYXA9dC5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD10LmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSx0aGlzLmVtaXNzaXZlLmNvcHkodC5lbWlzc2l2ZSksdGhpcy5lbWlzc2l2ZU1hcD10LmVtaXNzaXZlTWFwLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9dC5lbWlzc2l2ZUludGVuc2l0eSx0aGlzLmJ1bXBNYXA9dC5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPXQuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPXQubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMuc3BlY3VsYXJNYXA9dC5zcGVjdWxhck1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5lbnZNYXA9dC5lbnZNYXAsdGhpcy5jb21iaW5lPXQuY29tYmluZSx0aGlzLnJlZmxlY3Rpdml0eT10LnJlZmxlY3Rpdml0eSx0aGlzLnJlZnJhY3Rpb25SYXRpbz10LnJlZnJhY3Rpb25SYXRpbyx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbix0aGlzLmZsYXRTaGFkaW5nPXQuZmxhdFNoYWRpbmcsdGhpc319TTZ0LnByb3RvdHlwZS5pc01lc2hQaG9uZ01hdGVyaWFsPSEwO2NsYXNzIEU2dCBleHRlbmRzIFVRdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuZGVmaW5lcz17VE9PTjoiIn0sdGhpcy50eXBlPSJNZXNoVG9vbk1hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyAkUXQoMTY3NzcyMTUpLHRoaXMubWFwPW51bGwsdGhpcy5ncmFkaWVudE1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlPW5ldyAkUXQoMCksdGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmVNYXA9bnVsbCx0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPTAsdGhpcy5ub3JtYWxTY2FsZT1uZXcgbUp0KDEsMSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubWFwPXQubWFwLHRoaXMuZ3JhZGllbnRNYXA9dC5ncmFkaWVudE1hcCx0aGlzLmxpZ2h0TWFwPXQubGlnaHRNYXAsdGhpcy5saWdodE1hcEludGVuc2l0eT10LmxpZ2h0TWFwSW50ZW5zaXR5LHRoaXMuYW9NYXA9dC5hb01hcCx0aGlzLmFvTWFwSW50ZW5zaXR5PXQuYW9NYXBJbnRlbnNpdHksdGhpcy5lbWlzc2l2ZS5jb3B5KHQuZW1pc3NpdmUpLHRoaXMuZW1pc3NpdmVNYXA9dC5lbWlzc2l2ZU1hcCx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PXQuZW1pc3NpdmVJbnRlbnNpdHksdGhpcy5idW1wTWFwPXQuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT10LmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD10Lm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9dC5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weSh0Lm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD10LmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPXQuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPXQuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy53aXJlZnJhbWU9dC53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy53aXJlZnJhbWVMaW5lY2FwPXQud2lyZWZyYW1lTGluZWNhcCx0aGlzLndpcmVmcmFtZUxpbmVqb2luPXQud2lyZWZyYW1lTGluZWpvaW4sdGhpc319RTZ0LnByb3RvdHlwZS5pc01lc2hUb29uTWF0ZXJpYWw9ITA7Y2xhc3MgVDZ0IGV4dGVuZHMgVVF0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy50eXBlPSJNZXNoTm9ybWFsTWF0ZXJpYWwiLHRoaXMuYnVtcE1hcD1udWxsLHRoaXMuYnVtcFNjYWxlPTEsdGhpcy5ub3JtYWxNYXA9bnVsbCx0aGlzLm5vcm1hbE1hcFR5cGU9MCx0aGlzLm5vcm1hbFNjYWxlPW5ldyBtSnQoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMuZm9nPSExLHRoaXMuZmxhdFNoYWRpbmc9ITEsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmJ1bXBNYXA9dC5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPXQuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPXQubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMud2lyZWZyYW1lPXQud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoLHRoaXMuZmxhdFNoYWRpbmc9dC5mbGF0U2hhZGluZyx0aGlzfX1UNnQucHJvdG90eXBlLmlzTWVzaE5vcm1hbE1hdGVyaWFsPSEwO2NsYXNzIEM2dCBleHRlbmRzIFVRdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iTWVzaExhbWJlcnRNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgJFF0KDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlPW5ldyAkUXQoMCksdGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmVNYXA9bnVsbCx0aGlzLnNwZWN1bGFyTWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZW52TWFwPW51bGwsdGhpcy5jb21iaW5lPTAsdGhpcy5yZWZsZWN0aXZpdHk9MSx0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTgsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIix0aGlzLndpcmVmcmFtZUxpbmVqb2luPSJyb3VuZCIsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXA9dC5tYXAsdGhpcy5saWdodE1hcD10LmxpZ2h0TWFwLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9dC5saWdodE1hcEludGVuc2l0eSx0aGlzLmFvTWFwPXQuYW9NYXAsdGhpcy5hb01hcEludGVuc2l0eT10LmFvTWFwSW50ZW5zaXR5LHRoaXMuZW1pc3NpdmUuY29weSh0LmVtaXNzaXZlKSx0aGlzLmVtaXNzaXZlTWFwPXQuZW1pc3NpdmVNYXAsdGhpcy5lbWlzc2l2ZUludGVuc2l0eT10LmVtaXNzaXZlSW50ZW5zaXR5LHRoaXMuc3BlY3VsYXJNYXA9dC5zcGVjdWxhck1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5lbnZNYXA9dC5lbnZNYXAsdGhpcy5jb21iaW5lPXQuY29tYmluZSx0aGlzLnJlZmxlY3Rpdml0eT10LnJlZmxlY3Rpdml0eSx0aGlzLnJlZnJhY3Rpb25SYXRpbz10LnJlZnJhY3Rpb25SYXRpbyx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbix0aGlzfX1DNnQucHJvdG90eXBlLmlzTWVzaExhbWJlcnRNYXRlcmlhbD0hMDtjbGFzcyBBNnQgZXh0ZW5kcyBVUXR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmRlZmluZXM9e01BVENBUDoiIn0sdGhpcy50eXBlPSJNZXNoTWF0Y2FwTWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3ICRRdCgxNjc3NzIxNSksdGhpcy5tYXRjYXA9bnVsbCx0aGlzLm1hcD1udWxsLHRoaXMuYnVtcE1hcD1udWxsLHRoaXMuYnVtcFNjYWxlPTEsdGhpcy5ub3JtYWxNYXA9bnVsbCx0aGlzLm5vcm1hbE1hcFR5cGU9MCx0aGlzLm5vcm1hbFNjYWxlPW5ldyBtSnQoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5mbGF0U2hhZGluZz0hMSx0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuZGVmaW5lcz17TUFUQ0FQOiIifSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXRjYXA9dC5tYXRjYXAsdGhpcy5tYXA9dC5tYXAsdGhpcy5idW1wTWFwPXQuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT10LmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD10Lm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9dC5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weSh0Lm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD10LmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPXQuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPXQuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5mbGF0U2hhZGluZz10LmZsYXRTaGFkaW5nLHRoaXN9fUE2dC5wcm90b3R5cGUuaXNNZXNoTWF0Y2FwTWF0ZXJpYWw9ITA7Y2xhc3MgazZ0IGV4dGVuZHMgSTN0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy50eXBlPSJMaW5lRGFzaGVkTWF0ZXJpYWwiLHRoaXMuc2NhbGU9MSx0aGlzLmRhc2hTaXplPTMsdGhpcy5nYXBTaXplPTEsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnNjYWxlPXQuc2NhbGUsdGhpcy5kYXNoU2l6ZT10LmRhc2hTaXplLHRoaXMuZ2FwU2l6ZT10LmdhcFNpemUsdGhpc319azZ0LnByb3RvdHlwZS5pc0xpbmVEYXNoZWRNYXRlcmlhbD0hMDt2YXIgTDZ0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLFNoYWRvd01hdGVyaWFsOng2dCxTcHJpdGVNYXRlcmlhbDpKNXQsUmF3U2hhZGVyTWF0ZXJpYWw6XzB0LFNoYWRlck1hdGVyaWFsOkcxdCxQb2ludHNNYXRlcmlhbDpHM3QsTWVzaFBoeXNpY2FsTWF0ZXJpYWw6UzZ0LE1lc2hTdGFuZGFyZE1hdGVyaWFsOnc2dCxNZXNoUGhvbmdNYXRlcmlhbDpNNnQsTWVzaFRvb25NYXRlcmlhbDpFNnQsTWVzaE5vcm1hbE1hdGVyaWFsOlQ2dCxNZXNoTGFtYmVydE1hdGVyaWFsOkM2dCxNZXNoRGVwdGhNYXRlcmlhbDpONXQsTWVzaERpc3RhbmNlTWF0ZXJpYWw6STV0LE1lc2hCYXNpY01hdGVyaWFsOktRdCxNZXNoTWF0Y2FwTWF0ZXJpYWw6QTZ0LExpbmVEYXNoZWRNYXRlcmlhbDprNnQsTGluZUJhc2ljTWF0ZXJpYWw6STN0LE1hdGVyaWFsOlVRdH0pO2NvbnN0IFA2dD17YXJyYXlTbGljZTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIFA2dC5pc1R5cGVkQXJyYXkodCk/bmV3IHQuY29uc3RydWN0b3IodC5zdWJhcnJheShlLHZvaWQgMCE9PW4/bjp0Lmxlbmd0aCkpOnQuc2xpY2UoZSxuKX0sY29udmVydEFycmF5OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4hdHx8IW4mJnQuY29uc3RydWN0b3I9PT1lP3Q6Im51bWJlciI9PXR5cGVvZiBlLkJZVEVTX1BFUl9FTEVNRU5UP25ldyBlKHQpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQpfSxpc1R5cGVkQXJyYXk6ZnVuY3Rpb24odCl7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyh0KSYmISh0IGluc3RhbmNlb2YgRGF0YVZpZXcpfSxnZXRLZXlmcmFtZU9yZGVyOmZ1bmN0aW9uKHQpe2NvbnN0IGU9dC5sZW5ndGgsbj1uZXcgQXJyYXkoZSk7Zm9yKGxldCB0PTA7dCE9PWU7Kyt0KW5bdF09dDtyZXR1cm4gbi5zb3J0KChmdW5jdGlvbiBpKGUsbil7cmV0dXJuIHRbZV0tdFtuXX0pKSxufSxzb3J0ZWRBcnJheTpmdW5jdGlvbih0LGUsbil7Y29uc3QgaT10Lmxlbmd0aCxyPW5ldyB0LmNvbnN0cnVjdG9yKGkpO2ZvcihsZXQgbz0wLGE9MDthIT09aTsrK28pe2NvbnN0IGk9bltvXSplO2ZvcihsZXQgbj0wO24hPT1lOysrbilyW2ErK109dFtpK25dfXJldHVybiByfSxmbGF0dGVuSlNPTjpmdW5jdGlvbih0LGUsbixpKXtsZXQgcj0xLG89dFswXTtmb3IoO3ZvaWQgMCE9PW8mJnZvaWQgMD09PW9baV07KW89dFtyKytdO2lmKHZvaWQgMD09PW8pcmV0dXJuO2xldCBhPW9baV07aWYodm9pZCAwIT09YSlpZihBcnJheS5pc0FycmF5KGEpKWRve2E9b1tpXSx2b2lkIDAhPT1hJiYoZS5wdXNoKG8udGltZSksbi5wdXNoLmFwcGx5KG4sYSkpLG89dFtyKytdfXdoaWxlKHZvaWQgMCE9PW8pO2Vsc2UgaWYodm9pZCAwIT09YS50b0FycmF5KWRve2E9b1tpXSx2b2lkIDAhPT1hJiYoZS5wdXNoKG8udGltZSksYS50b0FycmF5KG4sbi5sZW5ndGgpKSxvPXRbcisrXX13aGlsZSh2b2lkIDAhPT1vKTtlbHNlIGRve2E9b1tpXSx2b2lkIDAhPT1hJiYoZS5wdXNoKG8udGltZSksbi5wdXNoKGEpKSxvPXRbcisrXX13aGlsZSh2b2lkIDAhPT1vKX0sc3ViY2xpcDpmdW5jdGlvbih0LGUsbixpLHI9MzApe2NvbnN0IG89dC5jbG9uZSgpO28ubmFtZT1lO2NvbnN0IGE9W107Zm9yKGxldCB0PTA7dDxvLnRyYWNrcy5sZW5ndGg7Kyt0KXtjb25zdCBlPW8udHJhY2tzW3RdLHM9ZS5nZXRWYWx1ZVNpemUoKSxsPVtdLGM9W107Zm9yKGxldCB0PTA7dDxlLnRpbWVzLmxlbmd0aDsrK3Qpe2NvbnN0IG89ZS50aW1lc1t0XSpyO2lmKCEobzxufHxvPj1pKSl7bC5wdXNoKGUudGltZXNbdF0pO2ZvcihsZXQgbj0wO248czsrK24pYy5wdXNoKGUudmFsdWVzW3QqcytuXSl9fTAhPT1sLmxlbmd0aCYmKGUudGltZXM9UDZ0LmNvbnZlcnRBcnJheShsLGUudGltZXMuY29uc3RydWN0b3IpLGUudmFsdWVzPVA2dC5jb252ZXJ0QXJyYXkoYyxlLnZhbHVlcy5jb25zdHJ1Y3RvciksYS5wdXNoKGUpKX1vLnRyYWNrcz1hO2xldCBzPTEvMDtmb3IobGV0IHQ9MDt0PG8udHJhY2tzLmxlbmd0aDsrK3Qpcz5vLnRyYWNrc1t0XS50aW1lc1swXSYmKHM9by50cmFja3NbdF0udGltZXNbMF0pO2ZvcihsZXQgdD0wO3Q8by50cmFja3MubGVuZ3RoOysrdClvLnRyYWNrc1t0XS5zaGlmdCgtMSpzKTtyZXR1cm4gby5yZXNldER1cmF0aW9uKCksb30sbWFrZUNsaXBBZGRpdGl2ZTpmdW5jdGlvbih0LGU9MCxuPXQsaT0zMCl7aTw9MCYmKGk9MzApO2NvbnN0IHI9bi50cmFja3MubGVuZ3RoLG89ZS9pO2ZvcihsZXQgZT0wO2U8cjsrK2Upe2NvbnN0IGk9bi50cmFja3NbZV0scj1pLlZhbHVlVHlwZU5hbWU7aWYoImJvb2wiPT09cnx8InN0cmluZyI9PT1yKWNvbnRpbnVlO2NvbnN0IGE9dC50cmFja3MuZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuIHQubmFtZT09PWkubmFtZSYmdC5WYWx1ZVR5cGVOYW1lPT09cn0pKTtpZih2b2lkIDA9PT1hKWNvbnRpbnVlO2xldCBzPTA7Y29uc3QgbD1pLmdldFZhbHVlU2l6ZSgpO2kuY3JlYXRlSW50ZXJwb2xhbnQuaXNJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RHTFRGQ3ViaWNTcGxpbmUmJihzPWwvMyk7bGV0IGM9MDtjb25zdCB1PWEuZ2V0VmFsdWVTaXplKCk7YS5jcmVhdGVJbnRlcnBvbGFudC5pc0ludGVycG9sYW50RmFjdG9yeU1ldGhvZEdMVEZDdWJpY1NwbGluZSYmKGM9dS8zKTtjb25zdCBoPWkudGltZXMubGVuZ3RoLTE7bGV0IGQ7aWYobzw9aS50aW1lc1swXSlkPVA2dC5hcnJheVNsaWNlKGkudmFsdWVzLHMsbC1zKTtlbHNlIGlmKG8+PWkudGltZXNbaF0pe2NvbnN0IHQ9aCpsK3M7ZD1QNnQuYXJyYXlTbGljZShpLnZhbHVlcyx0LHQrbC1zKX1lbHNle2NvbnN0IHQ9aS5jcmVhdGVJbnRlcnBvbGFudCgpLGU9cyxuPWwtczt0LmV2YWx1YXRlKG8pLGQ9UDZ0LmFycmF5U2xpY2UodC5yZXN1bHRCdWZmZXIsZSxuKX0icXVhdGVybmlvbiI9PT1yJiYobmV3IFRKdCkuZnJvbUFycmF5KGQpLm5vcm1hbGl6ZSgpLmNvbmp1Z2F0ZSgpLnRvQXJyYXkoZCk7Y29uc3QgcD1hLnRpbWVzLmxlbmd0aDtmb3IobGV0IHQ9MDt0PHA7Kyt0KXtjb25zdCBlPXQqdStjO2lmKCJxdWF0ZXJuaW9uIj09PXIpVEp0Lm11bHRpcGx5UXVhdGVybmlvbnNGbGF0KGEudmFsdWVzLGUsZCwwLGEudmFsdWVzLGUpO2Vsc2V7Y29uc3QgdD11LTIqYztmb3IobGV0IG49MDtuPHQ7KytuKWEudmFsdWVzW2Urbl0tPWRbbl19fX1yZXR1cm4gdC5ibGVuZE1vZGU9UFp0LHR9fTtjbGFzcyBONnR7Y29uc3RydWN0b3IodCxlLG4saSl7dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnM9dCx0aGlzLl9jYWNoZWRJbmRleD0wLHRoaXMucmVzdWx0QnVmZmVyPXZvaWQgMCE9PWk/aTpuZXcgZS5jb25zdHJ1Y3RvcihuKSx0aGlzLnNhbXBsZVZhbHVlcz1lLHRoaXMudmFsdWVTaXplPW4sdGhpcy5zZXR0aW5ncz1udWxsLHRoaXMuRGVmYXVsdFNldHRpbmdzXz17fX1ldmFsdWF0ZSh0KXtjb25zdCBlPXRoaXMucGFyYW1ldGVyUG9zaXRpb25zO2xldCBuPXRoaXMuX2NhY2hlZEluZGV4LGk9ZVtuXSxyPWVbbi0xXTt0OntlOntsZXQgbztuOntpOmlmKCEodDxpKSl7Zm9yKGxldCBvPW4rMjs7KXtpZih2b2lkIDA9PT1pKXtpZih0PHIpYnJlYWsgaTtyZXR1cm4gbj1lLmxlbmd0aCx0aGlzLl9jYWNoZWRJbmRleD1uLHRoaXMuYWZ0ZXJFbmRfKG4tMSx0LHIpfWlmKG49PT1vKWJyZWFrO2lmKHI9aSxpPWVbKytuXSx0PGkpYnJlYWsgZX1vPWUubGVuZ3RoO2JyZWFrIG59aWYodD49cilicmVhayB0O3tjb25zdCBhPWVbMV07dDxhJiYobj0yLHI9YSk7Zm9yKGxldCBvPW4tMjs7KXtpZih2b2lkIDA9PT1yKXJldHVybiB0aGlzLl9jYWNoZWRJbmRleD0wLHRoaXMuYmVmb3JlU3RhcnRfKDAsdCxpKTtpZihuPT09bylicmVhaztpZihpPXIscj1lWy0tbi0xXSx0Pj1yKWJyZWFrIGV9bz1uLG49MH19Zm9yKDtuPG87KXtjb25zdCBpPW4rbz4+PjE7dDxlW2ldP289aTpuPWkrMX1pZihpPWVbbl0scj1lW24tMV0sdm9pZCAwPT09cilyZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXg9MCx0aGlzLmJlZm9yZVN0YXJ0XygwLHQsaSk7aWYodm9pZCAwPT09aSlyZXR1cm4gbj1lLmxlbmd0aCx0aGlzLl9jYWNoZWRJbmRleD1uLHRoaXMuYWZ0ZXJFbmRfKG4tMSxyLHQpfXRoaXMuX2NhY2hlZEluZGV4PW4sdGhpcy5pbnRlcnZhbENoYW5nZWRfKG4scixpKX1yZXR1cm4gdGhpcy5pbnRlcnBvbGF0ZV8obixyLHQsaSl9Z2V0U2V0dGluZ3NfKCl7cmV0dXJuIHRoaXMuc2V0dGluZ3N8fHRoaXMuRGVmYXVsdFNldHRpbmdzX31jb3B5U2FtcGxlVmFsdWVfKHQpe2NvbnN0IGU9dGhpcy5yZXN1bHRCdWZmZXIsbj10aGlzLnNhbXBsZVZhbHVlcyxpPXRoaXMudmFsdWVTaXplLHI9dCppO2ZvcihsZXQgdD0wO3QhPT1pOysrdCllW3RdPW5bcit0XTtyZXR1cm4gZX1pbnRlcnBvbGF0ZV8oKXt0aHJvdyBuZXcgRXJyb3IoImNhbGwgdG8gYWJzdHJhY3QgbWV0aG9kIil9aW50ZXJ2YWxDaGFuZ2VkXygpe319TjZ0LnByb3RvdHlwZS5iZWZvcmVTdGFydF89TjZ0LnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVfLE42dC5wcm90b3R5cGUuYWZ0ZXJFbmRfPU42dC5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXztjbGFzcyBJNnQgZXh0ZW5kcyBONnR7Y29uc3RydWN0b3IodCxlLG4saSl7c3VwZXIodCxlLG4saSksdGhpcy5fd2VpZ2h0UHJldj0tMCx0aGlzLl9vZmZzZXRQcmV2PS0wLHRoaXMuX3dlaWdodE5leHQ9LTAsdGhpcy5fb2Zmc2V0TmV4dD0tMCx0aGlzLkRlZmF1bHRTZXR0aW5nc189e2VuZGluZ1N0YXJ0OkNadCxlbmRpbmdFbmQ6Q1p0fX1pbnRlcnZhbENoYW5nZWRfKHQsZSxuKXtjb25zdCBpPXRoaXMucGFyYW1ldGVyUG9zaXRpb25zO2xldCByPXQtMixvPXQrMSxhPWlbcl0scz1pW29dO2lmKHZvaWQgMD09PWEpc3dpdGNoKHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nU3RhcnQpe2Nhc2UgQVp0OnI9dCxhPTIqZS1uO2JyZWFrO2Nhc2Uga1p0OnI9aS5sZW5ndGgtMixhPWUraVtyXS1pW3IrMV07YnJlYWs7ZGVmYXVsdDpyPXQsYT1ufWlmKHZvaWQgMD09PXMpc3dpdGNoKHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nRW5kKXtjYXNlIEFadDpvPXQscz0yKm4tZTticmVhaztjYXNlIGtadDpvPTEscz1uK2lbMV0taVswXTticmVhaztkZWZhdWx0Om89dC0xLHM9ZX1jb25zdCBsPS41KihuLWUpLGM9dGhpcy52YWx1ZVNpemU7dGhpcy5fd2VpZ2h0UHJldj1sLyhlLWEpLHRoaXMuX3dlaWdodE5leHQ9bC8ocy1uKSx0aGlzLl9vZmZzZXRQcmV2PXIqYyx0aGlzLl9vZmZzZXROZXh0PW8qY31pbnRlcnBvbGF0ZV8odCxlLG4saSl7Y29uc3Qgcj10aGlzLnJlc3VsdEJ1ZmZlcixvPXRoaXMuc2FtcGxlVmFsdWVzLGE9dGhpcy52YWx1ZVNpemUscz10KmEsbD1zLWEsYz10aGlzLl9vZmZzZXRQcmV2LHU9dGhpcy5fb2Zmc2V0TmV4dCxoPXRoaXMuX3dlaWdodFByZXYsZD10aGlzLl93ZWlnaHROZXh0LHA9KG4tZSkvKGktZSksZj1wKnAsbT1mKnAsZz0taCptKzIqaCpmLWgqcCxfPSgxK2gpKm0rKC0xLjUtMipoKSpmKygtLjUraCkqcCsxLHk9KC0xLWQpKm0rKDEuNStkKSpmKy41KnAsdj1kKm0tZCpmO2ZvcihsZXQgdD0wO3QhPT1hOysrdClyW3RdPWcqb1tjK3RdK18qb1tsK3RdK3kqb1tzK3RdK3Yqb1t1K3RdO3JldHVybiByfX1jbGFzcyBSNnQgZXh0ZW5kcyBONnR7Y29uc3RydWN0b3IodCxlLG4saSl7c3VwZXIodCxlLG4saSl9aW50ZXJwb2xhdGVfKHQsZSxuLGkpe2NvbnN0IHI9dGhpcy5yZXN1bHRCdWZmZXIsbz10aGlzLnNhbXBsZVZhbHVlcyxhPXRoaXMudmFsdWVTaXplLHM9dCphLGw9cy1hLGM9KG4tZSkvKGktZSksdT0xLWM7Zm9yKGxldCB0PTA7dCE9PWE7Kyt0KXJbdF09b1tsK3RdKnUrb1tzK3RdKmM7cmV0dXJuIHJ9fWNsYXNzIE82dCBleHRlbmRzIE42dHtjb25zdHJ1Y3Rvcih0LGUsbixpKXtzdXBlcih0LGUsbixpKX1pbnRlcnBvbGF0ZV8odCl7cmV0dXJuIHRoaXMuY29weVNhbXBsZVZhbHVlXyh0LTEpfX1jbGFzcyB6NnR7Y29uc3RydWN0b3IodCxlLG4saSl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIG5hbWUgaXMgdW5kZWZpbmVkIik7aWYodm9pZCAwPT09ZXx8MD09PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogbm8ga2V5ZnJhbWVzIGluIHRyYWNrIG5hbWVkICIrdCk7dGhpcy5uYW1lPXQsdGhpcy50aW1lcz1QNnQuY29udmVydEFycmF5KGUsdGhpcy5UaW1lQnVmZmVyVHlwZSksdGhpcy52YWx1ZXM9UDZ0LmNvbnZlcnRBcnJheShuLHRoaXMuVmFsdWVCdWZmZXJUeXBlKSx0aGlzLnNldEludGVycG9sYXRpb24oaXx8dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil9c3RhdGljIHRvSlNPTih0KXtjb25zdCBlPXQuY29uc3RydWN0b3I7bGV0IG47aWYoZS50b0pTT04hPT10aGlzLnRvSlNPTiluPWUudG9KU09OKHQpO2Vsc2V7bj17bmFtZTp0Lm5hbWUsdGltZXM6UDZ0LmNvbnZlcnRBcnJheSh0LnRpbWVzLEFycmF5KSx2YWx1ZXM6UDZ0LmNvbnZlcnRBcnJheSh0LnZhbHVlcyxBcnJheSl9O2NvbnN0IGU9dC5nZXRJbnRlcnBvbGF0aW9uKCk7ZSE9PXQuRGVmYXVsdEludGVycG9sYXRpb24mJihuLmludGVycG9sYXRpb249ZSl9cmV0dXJuIG4udHlwZT10LlZhbHVlVHlwZU5hbWUsbn1JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZSh0KXtyZXR1cm4gbmV3IE82dCh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksdCl9SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyKHQpe3JldHVybiBuZXcgUjZ0KHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSx0KX1JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGgodCl7cmV0dXJuIG5ldyBJNnQodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLHQpfXNldEludGVycG9sYXRpb24odCl7bGV0IGU7c3dpdGNoKHQpe2Nhc2UgTVp0OmU9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTticmVhaztjYXNlIEVadDplPXRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyO2JyZWFrO2Nhc2UgVFp0OmU9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGh9aWYodm9pZCAwPT09ZSl7Y29uc3QgZT0idW5zdXBwb3J0ZWQgaW50ZXJwb2xhdGlvbiBmb3IgIit0aGlzLlZhbHVlVHlwZU5hbWUrIiBrZXlmcmFtZSB0cmFjayBuYW1lZCAiK3RoaXMubmFtZTtpZih2b2lkIDA9PT10aGlzLmNyZWF0ZUludGVycG9sYW50KXtpZih0PT09dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil0aHJvdyBuZXcgRXJyb3IoZSk7dGhpcy5zZXRJbnRlcnBvbGF0aW9uKHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pfXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLktleWZyYW1lVHJhY2s6IixlKSx0aGlzfXJldHVybiB0aGlzLmNyZWF0ZUludGVycG9sYW50PWUsdGhpc31nZXRJbnRlcnBvbGF0aW9uKCl7c3dpdGNoKHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQpe2Nhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTpyZXR1cm4gTVp0O2Nhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6cmV0dXJuIEVadDtjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOnJldHVybiBUWnR9fWdldFZhbHVlU2l6ZSgpe3JldHVybiB0aGlzLnZhbHVlcy5sZW5ndGgvdGhpcy50aW1lcy5sZW5ndGh9c2hpZnQodCl7aWYoMCE9PXQpe2NvbnN0IGU9dGhpcy50aW1lcztmb3IobGV0IG49MCxpPWUubGVuZ3RoO24hPT1pOysrbillW25dKz10fXJldHVybiB0aGlzfXNjYWxlKHQpe2lmKDEhPT10KXtjb25zdCBlPXRoaXMudGltZXM7Zm9yKGxldCBuPTAsaT1lLmxlbmd0aDtuIT09aTsrK24pZVtuXSo9dH1yZXR1cm4gdGhpc310cmltKHQsZSl7Y29uc3Qgbj10aGlzLnRpbWVzLGk9bi5sZW5ndGg7bGV0IHI9MCxvPWktMTtmb3IoO3IhPT1pJiZuW3JdPHQ7KSsrcjtmb3IoOy0xIT09byYmbltvXT5lOyktLW87aWYoKytvLDAhPT1yfHxvIT09aSl7cj49byYmKG89TWF0aC5tYXgobywxKSxyPW8tMSk7Y29uc3QgdD10aGlzLmdldFZhbHVlU2l6ZSgpO3RoaXMudGltZXM9UDZ0LmFycmF5U2xpY2UobixyLG8pLHRoaXMudmFsdWVzPVA2dC5hcnJheVNsaWNlKHRoaXMudmFsdWVzLHIqdCxvKnQpfXJldHVybiB0aGlzfXZhbGlkYXRlKCl7bGV0IHQ9ITA7Y29uc3QgZT10aGlzLmdldFZhbHVlU2l6ZSgpO2UtTWF0aC5mbG9vcihlKSE9MCYmKGNvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IEludmFsaWQgdmFsdWUgc2l6ZSBpbiB0cmFjay4iLHRoaXMpLHQ9ITEpO2NvbnN0IG49dGhpcy50aW1lcyxpPXRoaXMudmFsdWVzLHI9bi5sZW5ndGg7MD09PXImJihjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBUcmFjayBpcyBlbXB0eS4iLHRoaXMpLHQ9ITEpO2xldCBvPW51bGw7Zm9yKGxldCBlPTA7ZSE9PXI7ZSsrKXtjb25zdCBpPW5bZV07aWYoIm51bWJlciI9PXR5cGVvZiBpJiZpc05hTihpKSl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVGltZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuIix0aGlzLGUsaSksdD0hMTticmVha31pZihudWxsIT09byYmbz5pKXtjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBPdXQgb2Ygb3JkZXIga2V5cy4iLHRoaXMsZSxpLG8pLHQ9ITE7YnJlYWt9bz1pfWlmKHZvaWQgMCE9PWkmJlA2dC5pc1R5cGVkQXJyYXkoaSkpZm9yKGxldCBlPTAsbj1pLmxlbmd0aDtlIT09bjsrK2Upe2NvbnN0IG49aVtlXTtpZihpc05hTihuKSl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVmFsdWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLiIsdGhpcyxlLG4pLHQ9ITE7YnJlYWt9fXJldHVybiB0fW9wdGltaXplKCl7Y29uc3QgdD1QNnQuYXJyYXlTbGljZSh0aGlzLnRpbWVzKSxlPVA2dC5hcnJheVNsaWNlKHRoaXMudmFsdWVzKSxuPXRoaXMuZ2V0VmFsdWVTaXplKCksaT10aGlzLmdldEludGVycG9sYXRpb24oKT09PVRadCxyPXQubGVuZ3RoLTE7bGV0IG89MTtmb3IobGV0IGE9MTthPHI7KythKXtsZXQgcj0hMTtjb25zdCBzPXRbYV07aWYocyE9PXRbYSsxXSYmKDEhPT1hfHxzIT09dFswXSkpaWYoaSlyPSEwO2Vsc2V7Y29uc3QgdD1hKm4saT10LW4sbz10K247Zm9yKGxldCBhPTA7YSE9PW47KythKXtjb25zdCBuPWVbdCthXTtpZihuIT09ZVtpK2FdfHxuIT09ZVtvK2FdKXtyPSEwO2JyZWFrfX19aWYocil7aWYoYSE9PW8pe3Rbb109dFthXTtjb25zdCBpPWEqbixyPW8qbjtmb3IobGV0IHQ9MDt0IT09bjsrK3QpZVtyK3RdPWVbaSt0XX0rK299fWlmKHI+MCl7dFtvXT10W3JdO2ZvcihsZXQgdD1yKm4saT1vKm4sYT0wO2EhPT1uOysrYSllW2krYV09ZVt0K2FdOysrb31yZXR1cm4gbyE9PXQubGVuZ3RoPyh0aGlzLnRpbWVzPVA2dC5hcnJheVNsaWNlKHQsMCxvKSx0aGlzLnZhbHVlcz1QNnQuYXJyYXlTbGljZShlLDAsbypuKSk6KHRoaXMudGltZXM9dCx0aGlzLnZhbHVlcz1lKSx0aGlzfWNsb25lKCl7Y29uc3QgdD1QNnQuYXJyYXlTbGljZSh0aGlzLnRpbWVzLDApLGU9UDZ0LmFycmF5U2xpY2UodGhpcy52YWx1ZXMsMCksbj1uZXcoMCx0aGlzLmNvbnN0cnVjdG9yKSh0aGlzLm5hbWUsdCxlKTtyZXR1cm4gbi5jcmVhdGVJbnRlcnBvbGFudD10aGlzLmNyZWF0ZUludGVycG9sYW50LG59fXo2dC5wcm90b3R5cGUuVGltZUJ1ZmZlclR5cGU9RmxvYXQzMkFycmF5LHo2dC5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlPUZsb2F0MzJBcnJheSx6NnQucHJvdG90eXBlLkRlZmF1bHRJbnRlcnBvbGF0aW9uPUVadDtjbGFzcyBENnQgZXh0ZW5kcyB6NnR7fUQ2dC5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0iYm9vbCIsRDZ0LnByb3RvdHlwZS5WYWx1ZUJ1ZmZlclR5cGU9QXJyYXksRDZ0LnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbj1NWnQsRDZ0LnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI9dm9pZCAwLEQ2dC5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoPXZvaWQgMDtjbGFzcyBCNnQgZXh0ZW5kcyB6NnR7fUI2dC5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0iY29sb3IiO2NsYXNzIEg2dCBleHRlbmRzIHo2dHt9SDZ0LnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lPSJudW1iZXIiO2NsYXNzIEY2dCBleHRlbmRzIE42dHtjb25zdHJ1Y3Rvcih0LGUsbixpKXtzdXBlcih0LGUsbixpKX1pbnRlcnBvbGF0ZV8odCxlLG4saSl7Y29uc3Qgcj10aGlzLnJlc3VsdEJ1ZmZlcixvPXRoaXMuc2FtcGxlVmFsdWVzLGE9dGhpcy52YWx1ZVNpemUscz0obi1lKS8oaS1lKTtsZXQgbD10KmE7Zm9yKGxldCB0PWwrYTtsIT09dDtsKz00KVRKdC5zbGVycEZsYXQociwwLG8sbC1hLG8sbCxzKTtyZXR1cm4gcn19Y2xhc3MgVjZ0IGV4dGVuZHMgejZ0e0ludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcih0KXtyZXR1cm4gbmV3IEY2dCh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksdCl9fVY2dC5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0icXVhdGVybmlvbiIsVjZ0LnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbj1FWnQsVjZ0LnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg9dm9pZCAwO2NsYXNzIFU2dCBleHRlbmRzIHo2dHt9VTZ0LnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lPSJzdHJpbmciLFU2dC5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlPUFycmF5LFU2dC5wcm90b3R5cGUuRGVmYXVsdEludGVycG9sYXRpb249TVp0LFU2dC5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyPXZvaWQgMCxVNnQucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aD12b2lkIDA7Y2xhc3MgajZ0IGV4dGVuZHMgejZ0e31qNnQucHJvdG90eXBlLlZhbHVlVHlwZU5hbWU9InZlY3RvciI7Y2xhc3MgRzZ0e2NvbnN0cnVjdG9yKHQsZT0tMSxuLGk9MjUwMCl7dGhpcy5uYW1lPXQsdGhpcy50cmFja3M9bix0aGlzLmR1cmF0aW9uPWUsdGhpcy5ibGVuZE1vZGU9aSx0aGlzLnV1aWQ9WFp0KCksdGhpcy5kdXJhdGlvbjwwJiZ0aGlzLnJlc2V0RHVyYXRpb24oKX1zdGF0aWMgcGFyc2UodCl7Y29uc3QgZT1bXSxuPXQudHJhY2tzLGk9MS8odC5mcHN8fDEpO2ZvcihsZXQgdD0wLHI9bi5sZW5ndGg7dCE9PXI7Kyt0KWUucHVzaChXNnQoblt0XSkuc2NhbGUoaSkpO2NvbnN0IHI9bmV3IHRoaXModC5uYW1lLHQuZHVyYXRpb24sZSx0LmJsZW5kTW9kZSk7cmV0dXJuIHIudXVpZD10LnV1aWQscn1zdGF0aWMgdG9KU09OKHQpe2NvbnN0IGU9W10sbj10LnRyYWNrcyxpPXtuYW1lOnQubmFtZSxkdXJhdGlvbjp0LmR1cmF0aW9uLHRyYWNrczplLHV1aWQ6dC51dWlkLGJsZW5kTW9kZTp0LmJsZW5kTW9kZX07Zm9yKGxldCB0PTAsaT1uLmxlbmd0aDt0IT09aTsrK3QpZS5wdXNoKHo2dC50b0pTT04oblt0XSkpO3JldHVybiBpfXN0YXRpYyBDcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZSh0LGUsbixpKXtjb25zdCByPWUubGVuZ3RoLG89W107Zm9yKGxldCB0PTA7dDxyO3QrKyl7bGV0IGE9W10scz1bXTthLnB1c2goKHQrci0xKSVyLHQsKHQrMSklcikscy5wdXNoKDAsMSwwKTtjb25zdCBsPVA2dC5nZXRLZXlmcmFtZU9yZGVyKGEpO2E9UDZ0LnNvcnRlZEFycmF5KGEsMSxsKSxzPVA2dC5zb3J0ZWRBcnJheShzLDEsbCksaXx8MCE9PWFbMF18fChhLnB1c2gocikscy5wdXNoKHNbMF0pKSxvLnB1c2gobmV3IEg2dCgiLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1siK2VbdF0ubmFtZSsiXSIsYSxzKS5zY2FsZSgxL24pKX1yZXR1cm4gbmV3IHRoaXModCwtMSxvKX1zdGF0aWMgZmluZEJ5TmFtZSh0LGUpe2xldCBuPXQ7aWYoIUFycmF5LmlzQXJyYXkodCkpe2NvbnN0IGU9dDtuPWUuZ2VvbWV0cnkmJmUuZ2VvbWV0cnkuYW5pbWF0aW9uc3x8ZS5hbmltYXRpb25zfWZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKWlmKG5bdF0ubmFtZT09PWUpcmV0dXJuIG5bdF07cmV0dXJuIG51bGx9c3RhdGljIENyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2VzKHQsZSxuKXtjb25zdCBpPXt9LHI9L14oW1x3LV0qPykoW1xkXSspJC87Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXtjb25zdCBuPXRbZV0sbz1uLm5hbWUubWF0Y2gocik7aWYobyYmby5sZW5ndGg+MSl7Y29uc3QgdD1vWzFdO2xldCBlPWlbdF07ZXx8KGlbdF09ZT1bXSksZS5wdXNoKG4pfX1jb25zdCBvPVtdO2Zvcihjb25zdCB0IGluIGkpby5wdXNoKHRoaXMuQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UodCxpW3RdLGUsbikpO3JldHVybiBvfXN0YXRpYyBwYXJzZUFuaW1hdGlvbih0LGUpe2lmKCF0KXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5BbmltYXRpb25DbGlwOiBObyBhbmltYXRpb24gaW4gSlNPTkxvYWRlciBkYXRhLiIpLG51bGw7Y29uc3Qgbj1mdW5jdGlvbih0LGUsbixpLHIpe2lmKDAhPT1uLmxlbmd0aCl7Y29uc3Qgbz1bXSxhPVtdO1A2dC5mbGF0dGVuSlNPTihuLG8sYSxpKSwwIT09by5sZW5ndGgmJnIucHVzaChuZXcgdChlLG8sYSkpfX0saT1bXSxyPXQubmFtZXx8ImRlZmF1bHQiLG89dC5mcHN8fDMwLGE9dC5ibGVuZE1vZGU7bGV0IHM9dC5sZW5ndGh8fC0xO2NvbnN0IGw9dC5oaWVyYXJjaHl8fFtdO2ZvcihsZXQgdD0wO3Q8bC5sZW5ndGg7dCsrKXtjb25zdCByPWxbdF0ua2V5cztpZihyJiYwIT09ci5sZW5ndGgpaWYoclswXS5tb3JwaFRhcmdldHMpe2NvbnN0IHQ9e307bGV0IGU7Zm9yKGU9MDtlPHIubGVuZ3RoO2UrKylpZihyW2VdLm1vcnBoVGFyZ2V0cylmb3IobGV0IG49MDtuPHJbZV0ubW9ycGhUYXJnZXRzLmxlbmd0aDtuKyspdFtyW2VdLm1vcnBoVGFyZ2V0c1tuXV09LTE7Zm9yKGNvbnN0IG4gaW4gdCl7Y29uc3QgdD1bXSxvPVtdO2ZvcihsZXQgaT0wO2khPT1yW2VdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7KytpKXtjb25zdCBpPXJbZV07dC5wdXNoKGkudGltZSksby5wdXNoKGkubW9ycGhUYXJnZXQ9PT1uPzE6MCl9aS5wdXNoKG5ldyBINnQoIi5tb3JwaFRhcmdldEluZmx1ZW5jZVsiK24rIl0iLHQsbykpfXM9dC5sZW5ndGgqKG98fDEpfWVsc2V7Y29uc3Qgbz0iLmJvbmVzWyIrZVt0XS5uYW1lKyJdIjtuKGo2dCxvKyIucG9zaXRpb24iLHIsInBvcyIsaSksbihWNnQsbysiLnF1YXRlcm5pb24iLHIsInJvdCIsaSksbihqNnQsbysiLnNjYWxlIixyLCJzY2wiLGkpfX1yZXR1cm4gMD09PWkubGVuZ3RoP251bGw6bmV3IHRoaXMocixzLGksYSl9cmVzZXREdXJhdGlvbigpe2xldCB0PTA7Zm9yKGxldCBlPTAsbj10aGlzLnRyYWNrcy5sZW5ndGg7ZSE9PW47KytlKXtjb25zdCBuPXRoaXMudHJhY2tzW2VdO3Q9TWF0aC5tYXgodCxuLnRpbWVzW24udGltZXMubGVuZ3RoLTFdKX1yZXR1cm4gdGhpcy5kdXJhdGlvbj10LHRoaXN9dHJpbSgpe2ZvcihsZXQgdD0wO3Q8dGhpcy50cmFja3MubGVuZ3RoO3QrKyl0aGlzLnRyYWNrc1t0XS50cmltKDAsdGhpcy5kdXJhdGlvbik7cmV0dXJuIHRoaXN9dmFsaWRhdGUoKXtsZXQgdD0hMDtmb3IobGV0IGU9MDtlPHRoaXMudHJhY2tzLmxlbmd0aDtlKyspdD10JiZ0aGlzLnRyYWNrc1tlXS52YWxpZGF0ZSgpO3JldHVybiB0fW9wdGltaXplKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnRyYWNrcy5sZW5ndGg7dCsrKXRoaXMudHJhY2tzW3RdLm9wdGltaXplKCk7cmV0dXJuIHRoaXN9Y2xvbmUoKXtjb25zdCB0PVtdO2ZvcihsZXQgZT0wO2U8dGhpcy50cmFja3MubGVuZ3RoO2UrKyl0LnB1c2godGhpcy50cmFja3NbZV0uY2xvbmUoKSk7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMubmFtZSx0aGlzLmR1cmF0aW9uLHQsdGhpcy5ibGVuZE1vZGUpfXRvSlNPTigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvSlNPTih0aGlzKX19ZnVuY3Rpb24gVzZ0KHQpe2lmKHZvaWQgMD09PXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIHR5cGUgdW5kZWZpbmVkLCBjYW4gbm90IHBhcnNlIik7Y29uc3QgZT0oZnVuY3Rpb24gbih0KXtzd2l0Y2godC50b0xvd2VyQ2FzZSgpKXtjYXNlInNjYWxhciI6Y2FzZSJkb3VibGUiOmNhc2UiZmxvYXQiOmNhc2UibnVtYmVyIjpjYXNlImludGVnZXIiOnJldHVybiBINnQ7Y2FzZSJ2ZWN0b3IiOmNhc2UidmVjdG9yMiI6Y2FzZSJ2ZWN0b3IzIjpjYXNlInZlY3RvcjQiOnJldHVybiBqNnQ7Y2FzZSJjb2xvciI6cmV0dXJuIEI2dDtjYXNlInF1YXRlcm5pb24iOnJldHVybiBWNnQ7Y2FzZSJib29sIjpjYXNlImJvb2xlYW4iOnJldHVybiBENnQ7Y2FzZSJzdHJpbmciOnJldHVybiBVNnR9dGhyb3cgbmV3IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBVbnN1cHBvcnRlZCB0eXBlTmFtZTogIit0KX0pKHQudHlwZSk7aWYodm9pZCAwPT09dC50aW1lcyl7Y29uc3QgZT1bXSxuPVtdO1A2dC5mbGF0dGVuSlNPTih0LmtleXMsZSxuLCJ2YWx1ZSIpLHQudGltZXM9ZSx0LnZhbHVlcz1ufXJldHVybiB2b2lkIDAhPT1lLnBhcnNlP2UucGFyc2UodCk6bmV3IGUodC5uYW1lLHQudGltZXMsdC52YWx1ZXMsdC5pbnRlcnBvbGF0aW9uKX1jb25zdCBxNnQ9e2VuYWJsZWQ6ITEsZmlsZXM6e30sYWRkOmZ1bmN0aW9uKHQsZSl7ITEhPT10aGlzLmVuYWJsZWQmJih0aGlzLmZpbGVzW3RdPWUpfSxnZXQ6ZnVuY3Rpb24odCl7aWYoITEhPT10aGlzLmVuYWJsZWQpcmV0dXJuIHRoaXMuZmlsZXNbdF19LHJlbW92ZTpmdW5jdGlvbih0KXtkZWxldGUgdGhpcy5maWxlc1t0XX0sY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLmZpbGVzPXt9fX07Y2xhc3MgWTZ0e2NvbnN0cnVjdG9yKHQsZSxuKXtjb25zdCBpPXRoaXM7bGV0IHIsbz0hMSxhPTAscz0wO2NvbnN0IGw9W107dGhpcy5vblN0YXJ0PXZvaWQgMCx0aGlzLm9uTG9hZD10LHRoaXMub25Qcm9ncmVzcz1lLHRoaXMub25FcnJvcj1uLHRoaXMuaXRlbVN0YXJ0PWZ1bmN0aW9uKHQpe3MrKywhMT09PW8mJnZvaWQgMCE9PWkub25TdGFydCYmaS5vblN0YXJ0KHQsYSxzKSxvPSEwfSx0aGlzLml0ZW1FbmQ9ZnVuY3Rpb24odCl7YSsrLHZvaWQgMCE9PWkub25Qcm9ncmVzcyYmaS5vblByb2dyZXNzKHQsYSxzKSxhPT09cyYmKG89ITEsdm9pZCAwIT09aS5vbkxvYWQmJmkub25Mb2FkKCkpfSx0aGlzLml0ZW1FcnJvcj1mdW5jdGlvbih0KXt2b2lkIDAhPT1pLm9uRXJyb3ImJmkub25FcnJvcih0KX0sdGhpcy5yZXNvbHZlVVJMPWZ1bmN0aW9uKHQpe3JldHVybiByP3IodCk6dH0sdGhpcy5zZXRVUkxNb2RpZmllcj1mdW5jdGlvbih0KXtyZXR1cm4gcj10LHRoaXN9LHRoaXMuYWRkSGFuZGxlcj1mdW5jdGlvbih0LGUpe3JldHVybiBsLnB1c2godCxlKSx0aGlzfSx0aGlzLnJlbW92ZUhhbmRsZXI9ZnVuY3Rpb24odCl7Y29uc3QgZT1sLmluZGV4T2YodCk7cmV0dXJuLTEhPT1lJiZsLnNwbGljZShlLDIpLHRoaXN9LHRoaXMuZ2V0SGFuZGxlcj1mdW5jdGlvbih0KXtmb3IobGV0IGU9MCxuPWwubGVuZ3RoO2U8bjtlKz0yKXtjb25zdCBuPWxbZV0saT1sW2UrMV07aWYobi5nbG9iYWwmJihuLmxhc3RJbmRleD0wKSxuLnRlc3QodCkpcmV0dXJuIGl9cmV0dXJuIG51bGx9fX1jb25zdCBYNnQ9bmV3IFk2dDtjbGFzcyAkNnR7Y29uc3RydWN0b3IodCl7dGhpcy5tYW5hZ2VyPXZvaWQgMCE9PXQ/dDpYNnQsdGhpcy5jcm9zc09yaWdpbj0iYW5vbnltb3VzIix0aGlzLndpdGhDcmVkZW50aWFscz0hMSx0aGlzLnBhdGg9IiIsdGhpcy5yZXNvdXJjZVBhdGg9IiIsdGhpcy5yZXF1ZXN0SGVhZGVyPXt9fWxvYWQoKXt9bG9hZEFzeW5jKHQsZSl7Y29uc3Qgbj10aGlzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oaSxyKXtuLmxvYWQodCxpLGUscil9KSl9cGFyc2UoKXt9c2V0Q3Jvc3NPcmlnaW4odCl7cmV0dXJuIHRoaXMuY3Jvc3NPcmlnaW49dCx0aGlzfXNldFdpdGhDcmVkZW50aWFscyh0KXtyZXR1cm4gdGhpcy53aXRoQ3JlZGVudGlhbHM9dCx0aGlzfXNldFBhdGgodCl7cmV0dXJuIHRoaXMucGF0aD10LHRoaXN9c2V0UmVzb3VyY2VQYXRoKHQpe3JldHVybiB0aGlzLnJlc291cmNlUGF0aD10LHRoaXN9c2V0UmVxdWVzdEhlYWRlcih0KXtyZXR1cm4gdGhpcy5yZXF1ZXN0SGVhZGVyPXQsdGhpc319Y29uc3QgSzZ0PXt9O2NsYXNzIFo2dCBleHRlbmRzICQ2dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxuLGkpe3ZvaWQgMD09PXQmJih0PSIiKSx2b2lkIDAhPT10aGlzLnBhdGgmJih0PXRoaXMucGF0aCt0KSx0PXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKHQpO2NvbnN0IHI9dGhpcyxvPXE2dC5nZXQodCk7aWYodm9pZCAwIT09bylyZXR1cm4gci5tYW5hZ2VyLml0ZW1TdGFydCh0KSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2UmJmUobyksci5tYW5hZ2VyLml0ZW1FbmQodCl9KSwwKSxvO2lmKHZvaWQgMCE9PUs2dFt0XSlyZXR1cm4gdm9pZCBLNnRbdF0ucHVzaCh7b25Mb2FkOmUsb25Qcm9ncmVzczpuLG9uRXJyb3I6aX0pO2NvbnN0IGE9dC5tYXRjaCgvXmRhdGE6KC4qPykoO2Jhc2U2NCk/LCguKikkLyk7bGV0IHM7aWYoYSl7Y29uc3Qgbj1hWzFdLG89ISFhWzJdO2xldCBzPWFbM107cz1kZWNvZGVVUklDb21wb25lbnQocyksbyYmKHM9YXRvYihzKSk7dHJ5e2xldCBpO2NvbnN0IG89KHRoaXMucmVzcG9uc2VUeXBlfHwiIikudG9Mb3dlckNhc2UoKTtzd2l0Y2gobyl7Y2FzZSJhcnJheWJ1ZmZlciI6Y2FzZSJibG9iIjpjb25zdCB0PW5ldyBVaW50OEFycmF5KHMubGVuZ3RoKTtmb3IobGV0IGU9MDtlPHMubGVuZ3RoO2UrKyl0W2VdPXMuY2hhckNvZGVBdChlKTtpPSJibG9iIj09PW8/bmV3IEJsb2IoW3QuYnVmZmVyXSx7dHlwZTpufSk6dC5idWZmZXI7YnJlYWs7Y2FzZSJkb2N1bWVudCI6Y29uc3QgZT1uZXcgRE9NUGFyc2VyO2k9ZS5wYXJzZUZyb21TdHJpbmcocyxuKTticmVhaztjYXNlImpzb24iOmk9SlNPTi5wYXJzZShzKTticmVhaztkZWZhdWx0Omk9c31zZXRUaW1lb3V0KChmdW5jdGlvbigpe2UmJmUoaSksci5tYW5hZ2VyLml0ZW1FbmQodCl9KSwwKX1jYXRjaChlKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2kmJmkoZSksci5tYW5hZ2VyLml0ZW1FcnJvcih0KSxyLm1hbmFnZXIuaXRlbUVuZCh0KX0pLDApfX1lbHNle0s2dFt0XT1bXSxLNnRbdF0ucHVzaCh7b25Mb2FkOmUsb25Qcm9ncmVzczpuLG9uRXJyb3I6aX0pLHM9bmV3IFhNTEh0dHBSZXF1ZXN0LHMub3BlbigiR0VUIix0LCEwKSxzLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbihlKXtjb25zdCBuPXRoaXMucmVzcG9uc2UsaT1LNnRbdF07aWYoZGVsZXRlIEs2dFt0XSwyMDA9PT10aGlzLnN0YXR1c3x8MD09PXRoaXMuc3RhdHVzKXswPT09dGhpcy5zdGF0dXMmJmNvbnNvbGUud2FybigiVEhSRUUuRmlsZUxvYWRlcjogSFRUUCBTdGF0dXMgMCByZWNlaXZlZC4iKSxxNnQuYWRkKHQsbik7Zm9yKGxldCB0PTAsZT1pLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPWlbdF07ZS5vbkxvYWQmJmUub25Mb2FkKG4pfXIubWFuYWdlci5pdGVtRW5kKHQpfWVsc2V7Zm9yKGxldCB0PTAsbj1pLmxlbmd0aDt0PG47dCsrKXtjb25zdCBuPWlbdF07bi5vbkVycm9yJiZuLm9uRXJyb3IoZSl9ci5tYW5hZ2VyLml0ZW1FcnJvcih0KSxyLm1hbmFnZXIuaXRlbUVuZCh0KX19KSwhMSkscy5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsKGZ1bmN0aW9uKGUpe2NvbnN0IG49SzZ0W3RdO2ZvcihsZXQgdD0wLGk9bi5sZW5ndGg7dDxpO3QrKyl7Y29uc3QgaT1uW3RdO2kub25Qcm9ncmVzcyYmaS5vblByb2dyZXNzKGUpfX0pLCExKSxzLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwoZnVuY3Rpb24oZSl7Y29uc3Qgbj1LNnRbdF07ZGVsZXRlIEs2dFt0XTtmb3IobGV0IHQ9MCxpPW4ubGVuZ3RoO3Q8aTt0Kyspe2NvbnN0IGk9blt0XTtpLm9uRXJyb3ImJmkub25FcnJvcihlKX1yLm1hbmFnZXIuaXRlbUVycm9yKHQpLHIubWFuYWdlci5pdGVtRW5kKHQpfSksITEpLHMuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLChmdW5jdGlvbihlKXtjb25zdCBuPUs2dFt0XTtkZWxldGUgSzZ0W3RdO2ZvcihsZXQgdD0wLGk9bi5sZW5ndGg7dDxpO3QrKyl7Y29uc3QgaT1uW3RdO2kub25FcnJvciYmaS5vbkVycm9yKGUpfXIubWFuYWdlci5pdGVtRXJyb3IodCksci5tYW5hZ2VyLml0ZW1FbmQodCl9KSwhMSksdm9pZCAwIT09dGhpcy5yZXNwb25zZVR5cGUmJihzLnJlc3BvbnNlVHlwZT10aGlzLnJlc3BvbnNlVHlwZSksdm9pZCAwIT09dGhpcy53aXRoQ3JlZGVudGlhbHMmJihzLndpdGhDcmVkZW50aWFscz10aGlzLndpdGhDcmVkZW50aWFscykscy5vdmVycmlkZU1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUodm9pZCAwIT09dGhpcy5taW1lVHlwZT90aGlzLm1pbWVUeXBlOiJ0ZXh0L3BsYWluIik7Zm9yKGNvbnN0IHQgaW4gdGhpcy5yZXF1ZXN0SGVhZGVyKXMuc2V0UmVxdWVzdEhlYWRlcih0LHRoaXMucmVxdWVzdEhlYWRlclt0XSk7cy5zZW5kKG51bGwpfXJldHVybiByLm1hbmFnZXIuaXRlbVN0YXJ0KHQpLHN9c2V0UmVzcG9uc2VUeXBlKHQpe3JldHVybiB0aGlzLnJlc3BvbnNlVHlwZT10LHRoaXN9c2V0TWltZVR5cGUodCl7cmV0dXJuIHRoaXMubWltZVR5cGU9dCx0aGlzfX1jbGFzcyBKNnQgZXh0ZW5kcyAkNnR7Y29uc3RydWN0b3IodCl7c3VwZXIodCl9bG9hZCh0LGUsbixpKXt2b2lkIDAhPT10aGlzLnBhdGgmJih0PXRoaXMucGF0aCt0KSx0PXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKHQpO2NvbnN0IHI9dGhpcyxvPXE2dC5nZXQodCk7aWYodm9pZCAwIT09bylyZXR1cm4gci5tYW5hZ2VyLml0ZW1TdGFydCh0KSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2UmJmUobyksci5tYW5hZ2VyLml0ZW1FbmQodCl9KSwwKSxvO2NvbnN0IGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiaW1nIik7ZnVuY3Rpb24gcygpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIscywhMSksYS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsbCwhMSkscTZ0LmFkZCh0LHRoaXMpLGUmJmUodGhpcyksci5tYW5hZ2VyLml0ZW1FbmQodCl9ZnVuY3Rpb24gbChlKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLHMsITEpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGwsITEpLGkmJmkoZSksci5tYW5hZ2VyLml0ZW1FcnJvcih0KSxyLm1hbmFnZXIuaXRlbUVuZCh0KX1yZXR1cm4gYS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixzLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixsLCExKSwiZGF0YToiIT09dC5zdWJzdHIoMCw1KSYmdm9pZCAwIT09dGhpcy5jcm9zc09yaWdpbiYmKGEuY3Jvc3NPcmlnaW49dGhpcy5jcm9zc09yaWdpbiksci5tYW5hZ2VyLml0ZW1TdGFydCh0KSxhLnNyYz10LGF9fWNsYXNzIFE2dCBleHRlbmRzICQ2dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxuLGkpe2NvbnN0IHI9bmV3ICQxdCxvPW5ldyBKNnQodGhpcy5tYW5hZ2VyKTtvLnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pLG8uc2V0UGF0aCh0aGlzLnBhdGgpO2xldCBhPTA7ZnVuY3Rpb24gcyhuKXtvLmxvYWQodFtuXSwoZnVuY3Rpb24odCl7ci5pbWFnZXNbbl09dCxhKyssNj09PWEmJihyLm5lZWRzVXBkYXRlPSEwLGUmJmUocikpfSksdm9pZCAwLGkpfWZvcihsZXQgZT0wO2U8dC5sZW5ndGg7KytlKXMoZSk7cmV0dXJuIHJ9fWNsYXNzIHQ5dCBleHRlbmRzICQ2dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxuLGkpe2NvbnN0IHI9dGhpcyxvPW5ldyBNM3QsYT1uZXcgWjZ0KHRoaXMubWFuYWdlcik7cmV0dXJuIGEuc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpLGEuc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLGEuc2V0UGF0aCh0aGlzLnBhdGgpLGEuc2V0V2l0aENyZWRlbnRpYWxzKHIud2l0aENyZWRlbnRpYWxzKSxhLmxvYWQodCwoZnVuY3Rpb24odCl7Y29uc3Qgbj1yLnBhcnNlKHQpO24mJih2b2lkIDAhPT1uLmltYWdlP28uaW1hZ2U9bi5pbWFnZTp2b2lkIDAhPT1uLmRhdGEmJihvLmltYWdlLndpZHRoPW4ud2lkdGgsby5pbWFnZS5oZWlnaHQ9bi5oZWlnaHQsby5pbWFnZS5kYXRhPW4uZGF0YSksby53cmFwUz12b2lkIDAhPT1uLndyYXBTP24ud3JhcFM6S0t0LG8ud3JhcFQ9dm9pZCAwIT09bi53cmFwVD9uLndyYXBUOktLdCxvLm1hZ0ZpbHRlcj12b2lkIDAhPT1uLm1hZ0ZpbHRlcj9uLm1hZ0ZpbHRlcjplWnQsby5taW5GaWx0ZXI9dm9pZCAwIT09bi5taW5GaWx0ZXI/bi5taW5GaWx0ZXI6ZVp0LG8uYW5pc290cm9weT12b2lkIDAhPT1uLmFuaXNvdHJvcHk/bi5hbmlzb3Ryb3B5OjEsdm9pZCAwIT09bi5lbmNvZGluZyYmKG8uZW5jb2Rpbmc9bi5lbmNvZGluZyksdm9pZCAwIT09bi5mbGlwWSYmKG8uZmxpcFk9bi5mbGlwWSksdm9pZCAwIT09bi5mb3JtYXQmJihvLmZvcm1hdD1uLmZvcm1hdCksdm9pZCAwIT09bi50eXBlJiYoby50eXBlPW4udHlwZSksdm9pZCAwIT09bi5taXBtYXBzJiYoby5taXBtYXBzPW4ubWlwbWFwcyxvLm1pbkZpbHRlcj1pWnQpLDE9PT1uLm1pcG1hcENvdW50JiYoby5taW5GaWx0ZXI9ZVp0KSx2b2lkIDAhPT1uLmdlbmVyYXRlTWlwbWFwcyYmKG8uZ2VuZXJhdGVNaXBtYXBzPW4uZ2VuZXJhdGVNaXBtYXBzKSxvLm5lZWRzVXBkYXRlPSEwLGUmJmUobyxuKSl9KSxuLGkpLG99fWNsYXNzIGU5dCBleHRlbmRzICQ2dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxuLGkpe2NvbnN0IHI9bmV3IGJKdCxvPW5ldyBKNnQodGhpcy5tYW5hZ2VyKTtyZXR1cm4gby5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKSxvLnNldFBhdGgodGhpcy5wYXRoKSxvLmxvYWQodCwoZnVuY3Rpb24obil7ci5pbWFnZT1uO2NvbnN0IGk9dC5zZWFyY2goL1wuanBlP2coJHxcPykvaSk+MHx8MD09PXQuc2VhcmNoKC9eZGF0YVw6aW1hZ2VcL2pwZWcvKTtyLmZvcm1hdD1pP3VadDpoWnQsci5uZWVkc1VwZGF0ZT0hMCx2b2lkIDAhPT1lJiZlKHIpfSksbixpKSxyfX1jbGFzcyBuOXQgZXh0ZW5kcyBoNHR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudHlwZT0iQ3VydmVQYXRoIix0aGlzLmN1cnZlcz1bXSx0aGlzLmF1dG9DbG9zZT0hMX1hZGQodCl7dGhpcy5jdXJ2ZXMucHVzaCh0KX1jbG9zZVBhdGgoKXtjb25zdCB0PXRoaXMuY3VydmVzWzBdLmdldFBvaW50KDApLGU9dGhpcy5jdXJ2ZXNbdGhpcy5jdXJ2ZXMubGVuZ3RoLTFdLmdldFBvaW50KDEpO3QuZXF1YWxzKGUpfHx0aGlzLmN1cnZlcy5wdXNoKG5ldyBFNHQoZSx0KSl9Z2V0UG9pbnQodCl7Y29uc3QgZT10KnRoaXMuZ2V0TGVuZ3RoKCksbj10aGlzLmdldEN1cnZlTGVuZ3RocygpO2xldCBpPTA7Zm9yKDtpPG4ubGVuZ3RoOyl7aWYobltpXT49ZSl7Y29uc3QgdD1uW2ldLWUscj10aGlzLmN1cnZlc1tpXSxvPXIuZ2V0TGVuZ3RoKCk7cmV0dXJuIHIuZ2V0UG9pbnRBdCgwPT09bz8wOjEtdC9vKX1pKyt9cmV0dXJuIG51bGx9Z2V0TGVuZ3RoKCl7Y29uc3QgdD10aGlzLmdldEN1cnZlTGVuZ3RocygpO3JldHVybiB0W3QubGVuZ3RoLTFdfXVwZGF0ZUFyY0xlbmd0aHMoKXt0aGlzLm5lZWRzVXBkYXRlPSEwLHRoaXMuY2FjaGVMZW5ndGhzPW51bGwsdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKX1nZXRDdXJ2ZUxlbmd0aHMoKXtpZih0aGlzLmNhY2hlTGVuZ3RocyYmdGhpcy5jYWNoZUxlbmd0aHMubGVuZ3RoPT09dGhpcy5jdXJ2ZXMubGVuZ3RoKXJldHVybiB0aGlzLmNhY2hlTGVuZ3Rocztjb25zdCB0PVtdO2xldCBlPTA7Zm9yKGxldCBuPTAsaT10aGlzLmN1cnZlcy5sZW5ndGg7bjxpO24rKyllKz10aGlzLmN1cnZlc1tuXS5nZXRMZW5ndGgoKSx0LnB1c2goZSk7cmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzPXQsdH1nZXRTcGFjZWRQb2ludHModD00MCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPD10O24rKyllLnB1c2godGhpcy5nZXRQb2ludChuL3QpKTtyZXR1cm4gdGhpcy5hdXRvQ2xvc2UmJmUucHVzaChlWzBdKSxlfWdldFBvaW50cyh0PTEyKXtjb25zdCBlPVtdO2xldCBuO2ZvcihsZXQgaT0wLHI9dGhpcy5jdXJ2ZXM7aTxyLmxlbmd0aDtpKyspe2NvbnN0IG89cltpXSxhPW8uZ2V0UG9pbnRzKG8mJm8uaXNFbGxpcHNlQ3VydmU/Mip0Om8mJihvLmlzTGluZUN1cnZlfHxvLmlzTGluZUN1cnZlMyk/MTpvJiZvLmlzU3BsaW5lQ3VydmU/dCpvLnBvaW50cy5sZW5ndGg6dCk7Zm9yKGxldCB0PTA7dDxhLmxlbmd0aDt0Kyspe2NvbnN0IGk9YVt0XTtuJiZuLmVxdWFscyhpKXx8KGUucHVzaChpKSxuPWkpfX1yZXR1cm4gdGhpcy5hdXRvQ2xvc2UmJmUubGVuZ3RoPjEmJiFlW2UubGVuZ3RoLTFdLmVxdWFscyhlWzBdKSYmZS5wdXNoKGVbMF0pLGV9Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMuY3VydmVzPVtdO2ZvcihsZXQgZT0wLG49dC5jdXJ2ZXMubGVuZ3RoO2U8bjtlKyspdGhpcy5jdXJ2ZXMucHVzaCh0LmN1cnZlc1tlXS5jbG9uZSgpKTtyZXR1cm4gdGhpcy5hdXRvQ2xvc2U9dC5hdXRvQ2xvc2UsdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QuYXV0b0Nsb3NlPXRoaXMuYXV0b0Nsb3NlLHQuY3VydmVzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5jdXJ2ZXMubGVuZ3RoO2U8bjtlKyspdC5jdXJ2ZXMucHVzaCh0aGlzLmN1cnZlc1tlXS50b0pTT04oKSk7cmV0dXJuIHR9ZnJvbUpTT04odCl7c3VwZXIuZnJvbUpTT04odCksdGhpcy5hdXRvQ2xvc2U9dC5hdXRvQ2xvc2UsdGhpcy5jdXJ2ZXM9W107Zm9yKGxldCBlPTAsbj10LmN1cnZlcy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgbj10LmN1cnZlc1tlXTt0aGlzLmN1cnZlcy5wdXNoKChuZXcgTDR0W24udHlwZV0pLmZyb21KU09OKG4pKX1yZXR1cm4gdGhpc319Y2xhc3MgaTl0IGV4dGVuZHMgbjl0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy50eXBlPSJQYXRoIix0aGlzLmN1cnJlbnRQb2ludD1uZXcgbUp0LHQmJnRoaXMuc2V0RnJvbVBvaW50cyh0KX1zZXRGcm9tUG9pbnRzKHQpe3RoaXMubW92ZVRvKHRbMF0ueCx0WzBdLnkpO2ZvcihsZXQgZT0xLG49dC5sZW5ndGg7ZTxuO2UrKyl0aGlzLmxpbmVUbyh0W2VdLngsdFtlXS55KTtyZXR1cm4gdGhpc31tb3ZlVG8odCxlKXtyZXR1cm4gdGhpcy5jdXJyZW50UG9pbnQuc2V0KHQsZSksdGhpc31saW5lVG8odCxlKXtjb25zdCBuPW5ldyBFNHQodGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgbUp0KHQsZSkpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKG4pLHRoaXMuY3VycmVudFBvaW50LnNldCh0LGUpLHRoaXN9cXVhZHJhdGljQ3VydmVUbyh0LGUsbixpKXtjb25zdCByPW5ldyBDNHQodGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgbUp0KHQsZSksbmV3IG1KdChuLGkpKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChyKSx0aGlzLmN1cnJlbnRQb2ludC5zZXQobixpKSx0aGlzfWJlemllckN1cnZlVG8odCxlLG4saSxyLG8pe2NvbnN0IGE9bmV3IFM0dCh0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBtSnQodCxlKSxuZXcgbUp0KG4saSksbmV3IG1KdChyLG8pKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChhKSx0aGlzLmN1cnJlbnRQb2ludC5zZXQocixvKSx0aGlzfXNwbGluZVRocnUodCl7Y29uc3QgZT1bdGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKV0uY29uY2F0KHQpLG49bmV3IGs0dChlKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChuKSx0aGlzLmN1cnJlbnRQb2ludC5jb3B5KHRbdC5sZW5ndGgtMV0pLHRoaXN9YXJjKHQsZSxuLGkscixvKXtyZXR1cm4gdGhpcy5hYnNhcmModCt0aGlzLmN1cnJlbnRQb2ludC54LGUrdGhpcy5jdXJyZW50UG9pbnQueSxuLGkscixvKSx0aGlzfWFic2FyYyh0LGUsbixpLHIsbyl7cmV0dXJuIHRoaXMuYWJzZWxsaXBzZSh0LGUsbixuLGkscixvKSx0aGlzfWVsbGlwc2UodCxlLG4saSxyLG8sYSxzKXtyZXR1cm4gdGhpcy5hYnNlbGxpcHNlKHQrdGhpcy5jdXJyZW50UG9pbnQueCxlK3RoaXMuY3VycmVudFBvaW50LnksbixpLHIsbyxhLHMpLHRoaXN9YWJzZWxsaXBzZSh0LGUsbixpLHIsbyxhLHMpe2NvbnN0IGw9bmV3IGQ0dCh0LGUsbixpLHIsbyxhLHMpO2lmKHRoaXMuY3VydmVzLmxlbmd0aD4wKXtjb25zdCB0PWwuZ2V0UG9pbnQoMCk7dC5lcXVhbHModGhpcy5jdXJyZW50UG9pbnQpfHx0aGlzLmxpbmVUbyh0LngsdC55KX10aGlzLmN1cnZlcy5wdXNoKGwpO2NvbnN0IGM9bC5nZXRQb2ludCgxKTtyZXR1cm4gdGhpcy5jdXJyZW50UG9pbnQuY29weShjKSx0aGlzfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jdXJyZW50UG9pbnQuY29weSh0LmN1cnJlbnRQb2ludCksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LmN1cnJlbnRQb2ludD10aGlzLmN1cnJlbnRQb2ludC50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KHQuY3VycmVudFBvaW50KSx0aGlzfX1jbGFzcyByOXQgZXh0ZW5kcyBpOXR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy51dWlkPVhadCgpLHRoaXMudHlwZT0iU2hhcGUiLHRoaXMuaG9sZXM9W119Z2V0UG9pbnRzSG9sZXModCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MCxpPXRoaXMuaG9sZXMubGVuZ3RoO248aTtuKyspZVtuXT10aGlzLmhvbGVzW25dLmdldFBvaW50cyh0KTtyZXR1cm4gZX1leHRyYWN0UG9pbnRzKHQpe3JldHVybntzaGFwZTp0aGlzLmdldFBvaW50cyh0KSxob2xlczp0aGlzLmdldFBvaW50c0hvbGVzKHQpfX1jb3B5KHQpe3N1cGVyLmNvcHkodCksdGhpcy5ob2xlcz1bXTtmb3IobGV0IGU9MCxuPXQuaG9sZXMubGVuZ3RoO2U8bjtlKyspdGhpcy5ob2xlcy5wdXNoKHQuaG9sZXNbZV0uY2xvbmUoKSk7cmV0dXJuIHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTt0LnV1aWQ9dGhpcy51dWlkLHQuaG9sZXM9W107Zm9yKGxldCBlPTAsbj10aGlzLmhvbGVzLmxlbmd0aDtlPG47ZSsrKXQuaG9sZXMucHVzaCh0aGlzLmhvbGVzW2VdLnRvSlNPTigpKTtyZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLnV1aWQ9dC51dWlkLHRoaXMuaG9sZXM9W107Zm9yKGxldCBlPTAsbj10LmhvbGVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBuPXQuaG9sZXNbZV07dGhpcy5ob2xlcy5wdXNoKChuZXcgaTl0KS5mcm9tSlNPTihuKSl9cmV0dXJuIHRoaXN9fWNsYXNzIG85dCBleHRlbmRzIGtRdHtjb25zdHJ1Y3Rvcih0LGU9MSl7c3VwZXIoKSx0aGlzLnR5cGU9IkxpZ2h0Iix0aGlzLmNvbG9yPW5ldyAkUXQodCksdGhpcy5pbnRlbnNpdHk9ZX1kaXNwb3NlKCl7fWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMuaW50ZW5zaXR5PXQuaW50ZW5zaXR5LHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO3JldHVybiBlLm9iamVjdC5jb2xvcj10aGlzLmNvbG9yLmdldEhleCgpLGUub2JqZWN0LmludGVuc2l0eT10aGlzLmludGVuc2l0eSx2b2lkIDAhPT10aGlzLmdyb3VuZENvbG9yJiYoZS5vYmplY3QuZ3JvdW5kQ29sb3I9dGhpcy5ncm91bmRDb2xvci5nZXRIZXgoKSksdm9pZCAwIT09dGhpcy5kaXN0YW5jZSYmKGUub2JqZWN0LmRpc3RhbmNlPXRoaXMuZGlzdGFuY2UpLHZvaWQgMCE9PXRoaXMuYW5nbGUmJihlLm9iamVjdC5hbmdsZT10aGlzLmFuZ2xlKSx2b2lkIDAhPT10aGlzLmRlY2F5JiYoZS5vYmplY3QuZGVjYXk9dGhpcy5kZWNheSksdm9pZCAwIT09dGhpcy5wZW51bWJyYSYmKGUub2JqZWN0LnBlbnVtYnJhPXRoaXMucGVudW1icmEpLHZvaWQgMCE9PXRoaXMuc2hhZG93JiYoZS5vYmplY3Quc2hhZG93PXRoaXMuc2hhZG93LnRvSlNPTigpKSxlfX1vOXQucHJvdG90eXBlLmlzTGlnaHQ9ITA7Y2xhc3MgYTl0IGV4dGVuZHMgbzl0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcih0LG4pLHRoaXMudHlwZT0iSGVtaXNwaGVyZUxpZ2h0Iix0aGlzLnBvc2l0aW9uLmNvcHkoa1F0LkRlZmF1bHRVcCksdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLmdyb3VuZENvbG9yPW5ldyAkUXQoZSl9Y29weSh0KXtyZXR1cm4gbzl0LnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyx0KSx0aGlzLmdyb3VuZENvbG9yLmNvcHkodC5ncm91bmRDb2xvciksdGhpc319YTl0LnByb3RvdHlwZS5pc0hlbWlzcGhlcmVMaWdodD0hMDtjb25zdCBzOXQ9bmV3IHJRdCxsOXQ9bmV3IENKdCxjOXQ9bmV3IENKdDtjbGFzcyB1OXR7Y29uc3RydWN0b3IodCl7dGhpcy5jYW1lcmE9dCx0aGlzLmJpYXM9MCx0aGlzLm5vcm1hbEJpYXM9MCx0aGlzLnJhZGl1cz0xLHRoaXMubWFwU2l6ZT1uZXcgbUp0KDUxMiw1MTIpLHRoaXMubWFwPW51bGwsdGhpcy5tYXBQYXNzPW51bGwsdGhpcy5tYXRyaXg9bmV3IHJRdCx0aGlzLmF1dG9VcGRhdGU9ITAsdGhpcy5uZWVkc1VwZGF0ZT0hMSx0aGlzLl9mcnVzdHVtPW5ldyBpMHQsdGhpcy5fZnJhbWVFeHRlbnRzPW5ldyBtSnQoMSwxKSx0aGlzLl92aWV3cG9ydENvdW50PTEsdGhpcy5fdmlld3BvcnRzPVtuZXcgd0p0KDAsMCwxLDEpXX1nZXRWaWV3cG9ydENvdW50KCl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0Q291bnR9Z2V0RnJ1c3R1bSgpe3JldHVybiB0aGlzLl9mcnVzdHVtfXVwZGF0ZU1hdHJpY2VzKHQpe2NvbnN0IGU9dGhpcy5jYW1lcmEsbj10aGlzLm1hdHJpeDtsOXQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQubWF0cml4V29ybGQpLGUucG9zaXRpb24uY29weShsOXQpLGM5dC5zZXRGcm9tTWF0cml4UG9zaXRpb24odC50YXJnZXQubWF0cml4V29ybGQpLGUubG9va0F0KGM5dCksZS51cGRhdGVNYXRyaXhXb3JsZCgpLHM5dC5tdWx0aXBseU1hdHJpY2VzKGUucHJvamVjdGlvbk1hdHJpeCxlLm1hdHJpeFdvcmxkSW52ZXJzZSksdGhpcy5fZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChzOXQpLG4uc2V0KC41LDAsMCwuNSwwLC41LDAsLjUsMCwwLC41LC41LDAsMCwwLDEpLG4ubXVsdGlwbHkoZS5wcm9qZWN0aW9uTWF0cml4KSxuLm11bHRpcGx5KGUubWF0cml4V29ybGRJbnZlcnNlKX1nZXRWaWV3cG9ydCh0KXtyZXR1cm4gdGhpcy5fdmlld3BvcnRzW3RdfWdldEZyYW1lRXh0ZW50cygpe3JldHVybiB0aGlzLl9mcmFtZUV4dGVudHN9ZGlzcG9zZSgpe3RoaXMubWFwJiZ0aGlzLm1hcC5kaXNwb3NlKCksdGhpcy5tYXBQYXNzJiZ0aGlzLm1hcFBhc3MuZGlzcG9zZSgpfWNvcHkodCl7cmV0dXJuIHRoaXMuY2FtZXJhPXQuY2FtZXJhLmNsb25lKCksdGhpcy5iaWFzPXQuYmlhcyx0aGlzLnJhZGl1cz10LnJhZGl1cyx0aGlzLm1hcFNpemUuY29weSh0Lm1hcFNpemUpLHRoaXN9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9dG9KU09OKCl7Y29uc3QgdD17fTtyZXR1cm4gMCE9PXRoaXMuYmlhcyYmKHQuYmlhcz10aGlzLmJpYXMpLDAhPT10aGlzLm5vcm1hbEJpYXMmJih0Lm5vcm1hbEJpYXM9dGhpcy5ub3JtYWxCaWFzKSwxIT09dGhpcy5yYWRpdXMmJih0LnJhZGl1cz10aGlzLnJhZGl1cyksNTEyPT09dGhpcy5tYXBTaXplLngmJjUxMj09PXRoaXMubWFwU2l6ZS55fHwodC5tYXBTaXplPXRoaXMubWFwU2l6ZS50b0FycmF5KCkpLHQuY2FtZXJhPXRoaXMuY2FtZXJhLnRvSlNPTighMSkub2JqZWN0LGRlbGV0ZSB0LmNhbWVyYS5tYXRyaXgsdH19Y2xhc3MgaDl0IGV4dGVuZHMgdTl0e2NvbnN0cnVjdG9yKCl7c3VwZXIobmV3IHExdCg1MCwxLC41LDUwMCkpLHRoaXMuZm9jdXM9MX11cGRhdGVNYXRyaWNlcyh0KXtjb25zdCBlPXRoaXMuY2FtZXJhLG49MipZWnQqdC5hbmdsZSp0aGlzLmZvY3VzLGk9dGhpcy5tYXBTaXplLndpZHRoL3RoaXMubWFwU2l6ZS5oZWlnaHQscj10LmRpc3RhbmNlfHxlLmZhcjtuPT09ZS5mb3YmJmk9PT1lLmFzcGVjdCYmcj09PWUuZmFyfHwoZS5mb3Y9bixlLmFzcGVjdD1pLGUuZmFyPXIsZS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCkpLHN1cGVyLnVwZGF0ZU1hdHJpY2VzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5mb2N1cz10LmZvY3VzLHRoaXN9fWg5dC5wcm90b3R5cGUuaXNTcG90TGlnaHRTaGFkb3c9ITA7Y2xhc3MgZDl0IGV4dGVuZHMgbzl0e2NvbnN0cnVjdG9yKHQsZSxuPTAsaT1NYXRoLlBJLzMscj0wLG89MSl7c3VwZXIodCxlKSx0aGlzLnR5cGU9IlNwb3RMaWdodCIsdGhpcy5wb3NpdGlvbi5jb3B5KGtRdC5EZWZhdWx0VXApLHRoaXMudXBkYXRlTWF0cml4KCksdGhpcy50YXJnZXQ9bmV3IGtRdCx0aGlzLmRpc3RhbmNlPW4sdGhpcy5hbmdsZT1pLHRoaXMucGVudW1icmE9cix0aGlzLmRlY2F5PW8sdGhpcy5zaGFkb3c9bmV3IGg5dH1nZXQgcG93ZXIoKXtyZXR1cm4gdGhpcy5pbnRlbnNpdHkqTWF0aC5QSX1zZXQgcG93ZXIodCl7dGhpcy5pbnRlbnNpdHk9dC9NYXRoLlBJfWRpc3Bvc2UoKXt0aGlzLnNoYWRvdy5kaXNwb3NlKCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmRpc3RhbmNlPXQuZGlzdGFuY2UsdGhpcy5hbmdsZT10LmFuZ2xlLHRoaXMucGVudW1icmE9dC5wZW51bWJyYSx0aGlzLmRlY2F5PXQuZGVjYXksdGhpcy50YXJnZXQ9dC50YXJnZXQuY2xvbmUoKSx0aGlzLnNoYWRvdz10LnNoYWRvdy5jbG9uZSgpLHRoaXN9fWQ5dC5wcm90b3R5cGUuaXNTcG90TGlnaHQ9ITA7Y29uc3QgcDl0PW5ldyByUXQsZjl0PW5ldyBDSnQsbTl0PW5ldyBDSnQ7Y2xhc3MgZzl0IGV4dGVuZHMgdTl0e2NvbnN0cnVjdG9yKCl7c3VwZXIobmV3IHExdCg5MCwxLC41LDUwMCkpLHRoaXMuX2ZyYW1lRXh0ZW50cz1uZXcgbUp0KDQsMiksdGhpcy5fdmlld3BvcnRDb3VudD02LHRoaXMuX3ZpZXdwb3J0cz1bbmV3IHdKdCgyLDEsMSwxKSxuZXcgd0p0KDAsMSwxLDEpLG5ldyB3SnQoMywxLDEsMSksbmV3IHdKdCgxLDEsMSwxKSxuZXcgd0p0KDMsMCwxLDEpLG5ldyB3SnQoMSwwLDEsMSldLHRoaXMuX2N1YmVEaXJlY3Rpb25zPVtuZXcgQ0p0KDEsMCwwKSxuZXcgQ0p0KC0xLDAsMCksbmV3IENKdCgwLDAsMSksbmV3IENKdCgwLDAsLTEpLG5ldyBDSnQoMCwxLDApLG5ldyBDSnQoMCwtMSwwKV0sdGhpcy5fY3ViZVVwcz1bbmV3IENKdCgwLDEsMCksbmV3IENKdCgwLDEsMCksbmV3IENKdCgwLDEsMCksbmV3IENKdCgwLDEsMCksbmV3IENKdCgwLDAsMSksbmV3IENKdCgwLDAsLTEpXX11cGRhdGVNYXRyaWNlcyh0LGU9MCl7Y29uc3Qgbj10aGlzLmNhbWVyYSxpPXRoaXMubWF0cml4LHI9dC5kaXN0YW5jZXx8bi5mYXI7ciE9PW4uZmFyJiYobi5mYXI9cixuLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSksZjl0LnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKSxuLnBvc2l0aW9uLmNvcHkoZjl0KSxtOXQuY29weShuLnBvc2l0aW9uKSxtOXQuYWRkKHRoaXMuX2N1YmVEaXJlY3Rpb25zW2VdKSxuLnVwLmNvcHkodGhpcy5fY3ViZVVwc1tlXSksbi5sb29rQXQobTl0KSxuLnVwZGF0ZU1hdHJpeFdvcmxkKCksaS5tYWtlVHJhbnNsYXRpb24oLWY5dC54LC1mOXQueSwtZjl0LnopLHA5dC5tdWx0aXBseU1hdHJpY2VzKG4ucHJvamVjdGlvbk1hdHJpeCxuLm1hdHJpeFdvcmxkSW52ZXJzZSksdGhpcy5fZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChwOXQpfX1nOXQucHJvdG90eXBlLmlzUG9pbnRMaWdodFNoYWRvdz0hMDtjbGFzcyBfOXQgZXh0ZW5kcyBvOXR7Y29uc3RydWN0b3IodCxlLG49MCxpPTEpe3N1cGVyKHQsZSksdGhpcy50eXBlPSJQb2ludExpZ2h0Iix0aGlzLmRpc3RhbmNlPW4sdGhpcy5kZWNheT1pLHRoaXMuc2hhZG93PW5ldyBnOXR9Z2V0IHBvd2VyKCl7cmV0dXJuIDQqdGhpcy5pbnRlbnNpdHkqTWF0aC5QSX1zZXQgcG93ZXIodCl7dGhpcy5pbnRlbnNpdHk9dC8oNCpNYXRoLlBJKX1kaXNwb3NlKCl7dGhpcy5zaGFkb3cuZGlzcG9zZSgpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5kaXN0YW5jZT10LmRpc3RhbmNlLHRoaXMuZGVjYXk9dC5kZWNheSx0aGlzLnNoYWRvdz10LnNoYWRvdy5jbG9uZSgpLHRoaXN9fV85dC5wcm90b3R5cGUuaXNQb2ludExpZ2h0PSEwO2NsYXNzIHk5dCBleHRlbmRzIHU5dHtjb25zdHJ1Y3Rvcigpe3N1cGVyKG5ldyBnMHQoLTUsNSw1LC01LC41LDUwMCkpfX15OXQucHJvdG90eXBlLmlzRGlyZWN0aW9uYWxMaWdodFNoYWRvdz0hMDtjbGFzcyB2OXQgZXh0ZW5kcyBvOXR7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpLHRoaXMudHlwZT0iRGlyZWN0aW9uYWxMaWdodCIsdGhpcy5wb3NpdGlvbi5jb3B5KGtRdC5EZWZhdWx0VXApLHRoaXMudXBkYXRlTWF0cml4KCksdGhpcy50YXJnZXQ9bmV3IGtRdCx0aGlzLnNoYWRvdz1uZXcgeTl0fWRpc3Bvc2UoKXt0aGlzLnNoYWRvdy5kaXNwb3NlKCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnRhcmdldD10LnRhcmdldC5jbG9uZSgpLHRoaXMuc2hhZG93PXQuc2hhZG93LmNsb25lKCksdGhpc319djl0LnByb3RvdHlwZS5pc0RpcmVjdGlvbmFsTGlnaHQ9ITA7Y2xhc3MgYjl0IGV4dGVuZHMgbzl0e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLnR5cGU9IkFtYmllbnRMaWdodCJ9fWI5dC5wcm90b3R5cGUuaXNBbWJpZW50TGlnaHQ9ITA7Y2xhc3MgeDl0IGV4dGVuZHMgbzl0e2NvbnN0cnVjdG9yKHQsZSxuPTEwLGk9MTApe3N1cGVyKHQsZSksdGhpcy50eXBlPSJSZWN0QXJlYUxpZ2h0Iix0aGlzLndpZHRoPW4sdGhpcy5oZWlnaHQ9aX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMud2lkdGg9dC53aWR0aCx0aGlzLmhlaWdodD10LmhlaWdodCx0aGlzfXRvSlNPTih0KXtjb25zdCBlPXN1cGVyLnRvSlNPTih0KTtyZXR1cm4gZS5vYmplY3Qud2lkdGg9dGhpcy53aWR0aCxlLm9iamVjdC5oZWlnaHQ9dGhpcy5oZWlnaHQsZX19eDl0LnByb3RvdHlwZS5pc1JlY3RBcmVhTGlnaHQ9ITA7Y2xhc3Mgdzl0e2NvbnN0cnVjdG9yKCl7dGhpcy5jb2VmZmljaWVudHM9W107Zm9yKGxldCB0PTA7dDw5O3QrKyl0aGlzLmNvZWZmaWNpZW50cy5wdXNoKG5ldyBDSnQpfXNldCh0KXtmb3IobGV0IGU9MDtlPDk7ZSsrKXRoaXMuY29lZmZpY2llbnRzW2VdLmNvcHkodFtlXSk7cmV0dXJuIHRoaXN9emVybygpe2ZvcihsZXQgdD0wO3Q8OTt0KyspdGhpcy5jb2VmZmljaWVudHNbdF0uc2V0KDAsMCwwKTtyZXR1cm4gdGhpc31nZXRBdCh0LGUpe2NvbnN0IG49dC54LGk9dC55LHI9dC56LG89dGhpcy5jb2VmZmljaWVudHM7cmV0dXJuIGUuY29weShvWzBdKS5tdWx0aXBseVNjYWxhciguMjgyMDk1KSxlLmFkZFNjYWxlZFZlY3RvcihvWzFdLC40ODg2MDMqaSksZS5hZGRTY2FsZWRWZWN0b3Iob1syXSwuNDg4NjAzKnIpLGUuYWRkU2NhbGVkVmVjdG9yKG9bM10sLjQ4ODYwMypuKSxlLmFkZFNjYWxlZFZlY3RvcihvWzRdLG4qaSoxLjA5MjU0OCksZS5hZGRTY2FsZWRWZWN0b3Iob1s1XSxpKnIqMS4wOTI1NDgpLGUuYWRkU2NhbGVkVmVjdG9yKG9bNl0sLjMxNTM5MiooMypyKnItMSkpLGUuYWRkU2NhbGVkVmVjdG9yKG9bN10sbipyKjEuMDkyNTQ4KSxlLmFkZFNjYWxlZFZlY3RvcihvWzhdLC41NDYyNzQqKG4qbi1pKmkpKSxlfWdldElycmFkaWFuY2VBdCh0LGUpe2NvbnN0IG49dC54LGk9dC55LHI9dC56LG89dGhpcy5jb2VmZmljaWVudHM7cmV0dXJuIGUuY29weShvWzBdKS5tdWx0aXBseVNjYWxhciguODg2MjI3KSxlLmFkZFNjYWxlZFZlY3RvcihvWzFdLDEuMDIzMzI4KmkpLGUuYWRkU2NhbGVkVmVjdG9yKG9bMl0sMS4wMjMzMjgqciksZS5hZGRTY2FsZWRWZWN0b3Iob1szXSwxLjAyMzMyOCpuKSxlLmFkZFNjYWxlZFZlY3RvcihvWzRdLC44NTgwODYqbippKSxlLmFkZFNjYWxlZFZlY3RvcihvWzVdLC44NTgwODYqaSpyKSxlLmFkZFNjYWxlZFZlY3RvcihvWzZdLC43NDMxMjUqcipyLS4yNDc3MDgpLGUuYWRkU2NhbGVkVmVjdG9yKG9bN10sLjg1ODA4NipuKnIpLGUuYWRkU2NhbGVkVmVjdG9yKG9bOF0sLjQyOTA0MyoobipuLWkqaSkpLGV9YWRkKHQpe2ZvcihsZXQgZT0wO2U8OTtlKyspdGhpcy5jb2VmZmljaWVudHNbZV0uYWRkKHQuY29lZmZpY2llbnRzW2VdKTtyZXR1cm4gdGhpc31hZGRTY2FsZWRTSCh0LGUpe2ZvcihsZXQgbj0wO248OTtuKyspdGhpcy5jb2VmZmljaWVudHNbbl0uYWRkU2NhbGVkVmVjdG9yKHQuY29lZmZpY2llbnRzW25dLGUpO3JldHVybiB0aGlzfXNjYWxlKHQpe2ZvcihsZXQgZT0wO2U8OTtlKyspdGhpcy5jb2VmZmljaWVudHNbZV0ubXVsdGlwbHlTY2FsYXIodCk7cmV0dXJuIHRoaXN9bGVycCh0LGUpe2ZvcihsZXQgbj0wO248OTtuKyspdGhpcy5jb2VmZmljaWVudHNbbl0ubGVycCh0LmNvZWZmaWNpZW50c1tuXSxlKTtyZXR1cm4gdGhpc31lcXVhbHModCl7Zm9yKGxldCBlPTA7ZTw5O2UrKylpZighdGhpcy5jb2VmZmljaWVudHNbZV0uZXF1YWxzKHQuY29lZmZpY2llbnRzW2VdKSlyZXR1cm4hMTtyZXR1cm4hMH1jb3B5KHQpe3JldHVybiB0aGlzLnNldCh0LmNvZWZmaWNpZW50cyl9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9ZnJvbUFycmF5KHQsZT0wKXtjb25zdCBuPXRoaXMuY29lZmZpY2llbnRzO2ZvcihsZXQgaT0wO2k8OTtpKyspbltpXS5mcm9tQXJyYXkodCxlKzMqaSk7cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgbj10aGlzLmNvZWZmaWNpZW50cztmb3IobGV0IGk9MDtpPDk7aSsrKW5baV0udG9BcnJheSh0LGUrMyppKTtyZXR1cm4gdH1zdGF0aWMgZ2V0QmFzaXNBdCh0LGUpe2NvbnN0IG49dC54LGk9dC55LHI9dC56O2VbMF09LjI4MjA5NSxlWzFdPS40ODg2MDMqaSxlWzJdPS40ODg2MDMqcixlWzNdPS40ODg2MDMqbixlWzRdPTEuMDkyNTQ4Km4qaSxlWzVdPTEuMDkyNTQ4KmkqcixlWzZdPS4zMTUzOTIqKDMqcipyLTEpLGVbN109MS4wOTI1NDgqbipyLGVbOF09LjU0NjI3NCoobipuLWkqaSl9fXc5dC5wcm90b3R5cGUuaXNTcGhlcmljYWxIYXJtb25pY3MzPSEwO2NsYXNzIFM5dCBleHRlbmRzIG85dHtjb25zdHJ1Y3Rvcih0PW5ldyB3OXQsZT0xKXtzdXBlcih2b2lkIDAsZSksdGhpcy5zaD10fWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5zaC5jb3B5KHQuc2gpLHRoaXN9ZnJvbUpTT04odCl7cmV0dXJuIHRoaXMuaW50ZW5zaXR5PXQuaW50ZW5zaXR5LHRoaXMuc2guZnJvbUFycmF5KHQuc2gpLHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO3JldHVybiBlLm9iamVjdC5zaD10aGlzLnNoLnRvQXJyYXkoKSxlfX1TOXQucHJvdG90eXBlLmlzTGlnaHRQcm9iZT0hMDtjbGFzcyBNOXQgZXh0ZW5kcyAkNnR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy50ZXh0dXJlcz17fX1sb2FkKHQsZSxuLGkpe2NvbnN0IHI9dGhpcyxvPW5ldyBaNnQoci5tYW5hZ2VyKTtvLnNldFBhdGgoci5wYXRoKSxvLnNldFJlcXVlc3RIZWFkZXIoci5yZXF1ZXN0SGVhZGVyKSxvLnNldFdpdGhDcmVkZW50aWFscyhyLndpdGhDcmVkZW50aWFscyksby5sb2FkKHQsKGZ1bmN0aW9uKG4pe3RyeXtlKHIucGFyc2UoSlNPTi5wYXJzZShuKSkpfWNhdGNoKGUpe2k/aShlKTpjb25zb2xlLmVycm9yKGUpLHIubWFuYWdlci5pdGVtRXJyb3IodCl9fSksbixpKX1wYXJzZSh0KXtjb25zdCBlPXRoaXMudGV4dHVyZXM7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdm9pZCAwPT09ZVt0XSYmY29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbExvYWRlcjogVW5kZWZpbmVkIHRleHR1cmUiLHQpLGVbdF19Y29uc3QgaT1uZXcgTDZ0W3QudHlwZV07aWYodm9pZCAwIT09dC51dWlkJiYoaS51dWlkPXQudXVpZCksdm9pZCAwIT09dC5uYW1lJiYoaS5uYW1lPXQubmFtZSksdm9pZCAwIT09dC5jb2xvciYmdm9pZCAwIT09aS5jb2xvciYmaS5jb2xvci5zZXRIZXgodC5jb2xvciksdm9pZCAwIT09dC5yb3VnaG5lc3MmJihpLnJvdWdobmVzcz10LnJvdWdobmVzcyksdm9pZCAwIT09dC5tZXRhbG5lc3MmJihpLm1ldGFsbmVzcz10Lm1ldGFsbmVzcyksdm9pZCAwIT09dC5zaGVlbiYmKGkuc2hlZW49KG5ldyAkUXQpLnNldEhleCh0LnNoZWVuKSksdm9pZCAwIT09dC5lbWlzc2l2ZSYmdm9pZCAwIT09aS5lbWlzc2l2ZSYmaS5lbWlzc2l2ZS5zZXRIZXgodC5lbWlzc2l2ZSksdm9pZCAwIT09dC5zcGVjdWxhciYmdm9pZCAwIT09aS5zcGVjdWxhciYmaS5zcGVjdWxhci5zZXRIZXgodC5zcGVjdWxhciksdm9pZCAwIT09dC5zcGVjdWxhckludGVuc2l0eSYmKGkuc3BlY3VsYXJJbnRlbnNpdHk9dC5zcGVjdWxhckludGVuc2l0eSksdm9pZCAwIT09dC5zcGVjdWxhclRpbnQmJnZvaWQgMCE9PWkuc3BlY3VsYXJUaW50JiZpLnNwZWN1bGFyVGludC5zZXRIZXgodC5zcGVjdWxhclRpbnQpLHZvaWQgMCE9PXQuc2hpbmluZXNzJiYoaS5zaGluaW5lc3M9dC5zaGluaW5lc3MpLHZvaWQgMCE9PXQuY2xlYXJjb2F0JiYoaS5jbGVhcmNvYXQ9dC5jbGVhcmNvYXQpLHZvaWQgMCE9PXQuY2xlYXJjb2F0Um91Z2huZXNzJiYoaS5jbGVhcmNvYXRSb3VnaG5lc3M9dC5jbGVhcmNvYXRSb3VnaG5lc3MpLHZvaWQgMCE9PXQudHJhbnNtaXNzaW9uJiYoaS50cmFuc21pc3Npb249dC50cmFuc21pc3Npb24pLHZvaWQgMCE9PXQudGhpY2tuZXNzJiYoaS50aGlja25lc3M9dC50aGlja25lc3MpLHZvaWQgMCE9PXQuYXR0ZW51YXRpb25EaXN0YW5jZSYmKGkuYXR0ZW51YXRpb25EaXN0YW5jZT10LmF0dGVudWF0aW9uRGlzdGFuY2UpLHZvaWQgMCE9PXQuYXR0ZW51YXRpb25UaW50JiZ2b2lkIDAhPT1pLmF0dGVudWF0aW9uVGludCYmaS5hdHRlbnVhdGlvblRpbnQuc2V0SGV4KHQuYXR0ZW51YXRpb25UaW50KSx2b2lkIDAhPT10LmZvZyYmKGkuZm9nPXQuZm9nKSx2b2lkIDAhPT10LmZsYXRTaGFkaW5nJiYoaS5mbGF0U2hhZGluZz10LmZsYXRTaGFkaW5nKSx2b2lkIDAhPT10LmJsZW5kaW5nJiYoaS5ibGVuZGluZz10LmJsZW5kaW5nKSx2b2lkIDAhPT10LmNvbWJpbmUmJihpLmNvbWJpbmU9dC5jb21iaW5lKSx2b2lkIDAhPT10LnNpZGUmJihpLnNpZGU9dC5zaWRlKSx2b2lkIDAhPT10LnNoYWRvd1NpZGUmJihpLnNoYWRvd1NpZGU9dC5zaGFkb3dTaWRlKSx2b2lkIDAhPT10Lm9wYWNpdHkmJihpLm9wYWNpdHk9dC5vcGFjaXR5KSx2b2lkIDAhPT10LnRyYW5zcGFyZW50JiYoaS50cmFuc3BhcmVudD10LnRyYW5zcGFyZW50KSx2b2lkIDAhPT10LmFscGhhVGVzdCYmKGkuYWxwaGFUZXN0PXQuYWxwaGFUZXN0KSx2b2lkIDAhPT10LmRlcHRoVGVzdCYmKGkuZGVwdGhUZXN0PXQuZGVwdGhUZXN0KSx2b2lkIDAhPT10LmRlcHRoV3JpdGUmJihpLmRlcHRoV3JpdGU9dC5kZXB0aFdyaXRlKSx2b2lkIDAhPT10LmNvbG9yV3JpdGUmJihpLmNvbG9yV3JpdGU9dC5jb2xvcldyaXRlKSx2b2lkIDAhPT10LnN0ZW5jaWxXcml0ZSYmKGkuc3RlbmNpbFdyaXRlPXQuc3RlbmNpbFdyaXRlKSx2b2lkIDAhPT10LnN0ZW5jaWxXcml0ZU1hc2smJihpLnN0ZW5jaWxXcml0ZU1hc2s9dC5zdGVuY2lsV3JpdGVNYXNrKSx2b2lkIDAhPT10LnN0ZW5jaWxGdW5jJiYoaS5zdGVuY2lsRnVuYz10LnN0ZW5jaWxGdW5jKSx2b2lkIDAhPT10LnN0ZW5jaWxSZWYmJihpLnN0ZW5jaWxSZWY9dC5zdGVuY2lsUmVmKSx2b2lkIDAhPT10LnN0ZW5jaWxGdW5jTWFzayYmKGkuc3RlbmNpbEZ1bmNNYXNrPXQuc3RlbmNpbEZ1bmNNYXNrKSx2b2lkIDAhPT10LnN0ZW5jaWxGYWlsJiYoaS5zdGVuY2lsRmFpbD10LnN0ZW5jaWxGYWlsKSx2b2lkIDAhPT10LnN0ZW5jaWxaRmFpbCYmKGkuc3RlbmNpbFpGYWlsPXQuc3RlbmNpbFpGYWlsKSx2b2lkIDAhPT10LnN0ZW5jaWxaUGFzcyYmKGkuc3RlbmNpbFpQYXNzPXQuc3RlbmNpbFpQYXNzKSx2b2lkIDAhPT10LndpcmVmcmFtZSYmKGkud2lyZWZyYW1lPXQud2lyZWZyYW1lKSx2b2lkIDAhPT10LndpcmVmcmFtZUxpbmV3aWR0aCYmKGkud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoKSx2b2lkIDAhPT10LndpcmVmcmFtZUxpbmVjYXAmJihpLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwKSx2b2lkIDAhPT10LndpcmVmcmFtZUxpbmVqb2luJiYoaS53aXJlZnJhbWVMaW5lam9pbj10LndpcmVmcmFtZUxpbmVqb2luKSx2b2lkIDAhPT10LnJvdGF0aW9uJiYoaS5yb3RhdGlvbj10LnJvdGF0aW9uKSwxIT09dC5saW5ld2lkdGgmJihpLmxpbmV3aWR0aD10LmxpbmV3aWR0aCksdm9pZCAwIT09dC5kYXNoU2l6ZSYmKGkuZGFzaFNpemU9dC5kYXNoU2l6ZSksdm9pZCAwIT09dC5nYXBTaXplJiYoaS5nYXBTaXplPXQuZ2FwU2l6ZSksdm9pZCAwIT09dC5zY2FsZSYmKGkuc2NhbGU9dC5zY2FsZSksdm9pZCAwIT09dC5wb2x5Z29uT2Zmc2V0JiYoaS5wb2x5Z29uT2Zmc2V0PXQucG9seWdvbk9mZnNldCksdm9pZCAwIT09dC5wb2x5Z29uT2Zmc2V0RmFjdG9yJiYoaS5wb2x5Z29uT2Zmc2V0RmFjdG9yPXQucG9seWdvbk9mZnNldEZhY3Rvciksdm9pZCAwIT09dC5wb2x5Z29uT2Zmc2V0VW5pdHMmJihpLnBvbHlnb25PZmZzZXRVbml0cz10LnBvbHlnb25PZmZzZXRVbml0cyksdm9pZCAwIT09dC5kaXRoZXJpbmcmJihpLmRpdGhlcmluZz10LmRpdGhlcmluZyksdm9pZCAwIT09dC5hbHBoYVRvQ292ZXJhZ2UmJihpLmFscGhhVG9Db3ZlcmFnZT10LmFscGhhVG9Db3ZlcmFnZSksdm9pZCAwIT09dC5wcmVtdWx0aXBsaWVkQWxwaGEmJihpLnByZW11bHRpcGxpZWRBbHBoYT10LnByZW11bHRpcGxpZWRBbHBoYSksdm9pZCAwIT09dC52aXNpYmxlJiYoaS52aXNpYmxlPXQudmlzaWJsZSksdm9pZCAwIT09dC50b25lTWFwcGVkJiYoaS50b25lTWFwcGVkPXQudG9uZU1hcHBlZCksdm9pZCAwIT09dC51c2VyRGF0YSYmKGkudXNlckRhdGE9dC51c2VyRGF0YSksdm9pZCAwIT09dC52ZXJ0ZXhDb2xvcnMmJihpLnZlcnRleENvbG9ycz0ibnVtYmVyIj09dHlwZW9mIHQudmVydGV4Q29sb3JzP3QudmVydGV4Q29sb3JzPjA6dC52ZXJ0ZXhDb2xvcnMpLHZvaWQgMCE9PXQudW5pZm9ybXMpZm9yKGNvbnN0IGUgaW4gdC51bmlmb3Jtcyl7Y29uc3Qgcj10LnVuaWZvcm1zW2VdO3N3aXRjaChpLnVuaWZvcm1zW2VdPXt9LHIudHlwZSl7Y2FzZSJ0IjppLnVuaWZvcm1zW2VdLnZhbHVlPW4oci52YWx1ZSk7YnJlYWs7Y2FzZSJjIjppLnVuaWZvcm1zW2VdLnZhbHVlPShuZXcgJFF0KS5zZXRIZXgoci52YWx1ZSk7YnJlYWs7Y2FzZSJ2MiI6aS51bmlmb3Jtc1tlXS52YWx1ZT0obmV3IG1KdCkuZnJvbUFycmF5KHIudmFsdWUpO2JyZWFrO2Nhc2UidjMiOmkudW5pZm9ybXNbZV0udmFsdWU9KG5ldyBDSnQpLmZyb21BcnJheShyLnZhbHVlKTticmVhaztjYXNlInY0IjppLnVuaWZvcm1zW2VdLnZhbHVlPShuZXcgd0p0KS5mcm9tQXJyYXkoci52YWx1ZSk7YnJlYWs7Y2FzZSJtMyI6aS51bmlmb3Jtc1tlXS52YWx1ZT0obmV3IGdKdCkuZnJvbUFycmF5KHIudmFsdWUpO2JyZWFrO2Nhc2UibTQiOmkudW5pZm9ybXNbZV0udmFsdWU9KG5ldyByUXQpLmZyb21BcnJheShyLnZhbHVlKTticmVhaztkZWZhdWx0OmkudW5pZm9ybXNbZV0udmFsdWU9ci52YWx1ZX19aWYodm9pZCAwIT09dC5kZWZpbmVzJiYoaS5kZWZpbmVzPXQuZGVmaW5lcyksdm9pZCAwIT09dC52ZXJ0ZXhTaGFkZXImJihpLnZlcnRleFNoYWRlcj10LnZlcnRleFNoYWRlciksdm9pZCAwIT09dC5mcmFnbWVudFNoYWRlciYmKGkuZnJhZ21lbnRTaGFkZXI9dC5mcmFnbWVudFNoYWRlciksdm9pZCAwIT09dC5leHRlbnNpb25zKWZvcihjb25zdCBlIGluIHQuZXh0ZW5zaW9ucylpLmV4dGVuc2lvbnNbZV09dC5leHRlbnNpb25zW2VdO2lmKHZvaWQgMCE9PXQuc2hhZGluZyYmKGkuZmxhdFNoYWRpbmc9MT09PXQuc2hhZGluZyksdm9pZCAwIT09dC5zaXplJiYoaS5zaXplPXQuc2l6ZSksdm9pZCAwIT09dC5zaXplQXR0ZW51YXRpb24mJihpLnNpemVBdHRlbnVhdGlvbj10LnNpemVBdHRlbnVhdGlvbiksdm9pZCAwIT09dC5tYXAmJihpLm1hcD1uKHQubWFwKSksdm9pZCAwIT09dC5tYXRjYXAmJihpLm1hdGNhcD1uKHQubWF0Y2FwKSksdm9pZCAwIT09dC5hbHBoYU1hcCYmKGkuYWxwaGFNYXA9bih0LmFscGhhTWFwKSksdm9pZCAwIT09dC5idW1wTWFwJiYoaS5idW1wTWFwPW4odC5idW1wTWFwKSksdm9pZCAwIT09dC5idW1wU2NhbGUmJihpLmJ1bXBTY2FsZT10LmJ1bXBTY2FsZSksdm9pZCAwIT09dC5ub3JtYWxNYXAmJihpLm5vcm1hbE1hcD1uKHQubm9ybWFsTWFwKSksdm9pZCAwIT09dC5ub3JtYWxNYXBUeXBlJiYoaS5ub3JtYWxNYXBUeXBlPXQubm9ybWFsTWFwVHlwZSksdm9pZCAwIT09dC5ub3JtYWxTY2FsZSl7bGV0IGU9dC5ub3JtYWxTY2FsZTshMT09PUFycmF5LmlzQXJyYXkoZSkmJihlPVtlLGVdKSxpLm5vcm1hbFNjYWxlPShuZXcgbUp0KS5mcm9tQXJyYXkoZSl9cmV0dXJuIHZvaWQgMCE9PXQuZGlzcGxhY2VtZW50TWFwJiYoaS5kaXNwbGFjZW1lbnRNYXA9bih0LmRpc3BsYWNlbWVudE1hcCkpLHZvaWQgMCE9PXQuZGlzcGxhY2VtZW50U2NhbGUmJihpLmRpc3BsYWNlbWVudFNjYWxlPXQuZGlzcGxhY2VtZW50U2NhbGUpLHZvaWQgMCE9PXQuZGlzcGxhY2VtZW50QmlhcyYmKGkuZGlzcGxhY2VtZW50Qmlhcz10LmRpc3BsYWNlbWVudEJpYXMpLHZvaWQgMCE9PXQucm91Z2huZXNzTWFwJiYoaS5yb3VnaG5lc3NNYXA9bih0LnJvdWdobmVzc01hcCkpLHZvaWQgMCE9PXQubWV0YWxuZXNzTWFwJiYoaS5tZXRhbG5lc3NNYXA9bih0Lm1ldGFsbmVzc01hcCkpLHZvaWQgMCE9PXQuZW1pc3NpdmVNYXAmJihpLmVtaXNzaXZlTWFwPW4odC5lbWlzc2l2ZU1hcCkpLHZvaWQgMCE9PXQuZW1pc3NpdmVJbnRlbnNpdHkmJihpLmVtaXNzaXZlSW50ZW5zaXR5PXQuZW1pc3NpdmVJbnRlbnNpdHkpLHZvaWQgMCE9PXQuc3BlY3VsYXJNYXAmJihpLnNwZWN1bGFyTWFwPW4odC5zcGVjdWxhck1hcCkpLHZvaWQgMCE9PXQuc3BlY3VsYXJJbnRlbnNpdHlNYXAmJihpLnNwZWN1bGFySW50ZW5zaXR5TWFwPW4odC5zcGVjdWxhckludGVuc2l0eU1hcCkpLHZvaWQgMCE9PXQuc3BlY3VsYXJUaW50TWFwJiYoaS5zcGVjdWxhclRpbnRNYXA9bih0LnNwZWN1bGFyVGludE1hcCkpLHZvaWQgMCE9PXQuZW52TWFwJiYoaS5lbnZNYXA9bih0LmVudk1hcCkpLHZvaWQgMCE9PXQuZW52TWFwSW50ZW5zaXR5JiYoaS5lbnZNYXBJbnRlbnNpdHk9dC5lbnZNYXBJbnRlbnNpdHkpLHZvaWQgMCE9PXQucmVmbGVjdGl2aXR5JiYoaS5yZWZsZWN0aXZpdHk9dC5yZWZsZWN0aXZpdHkpLHZvaWQgMCE9PXQucmVmcmFjdGlvblJhdGlvJiYoaS5yZWZyYWN0aW9uUmF0aW89dC5yZWZyYWN0aW9uUmF0aW8pLHZvaWQgMCE9PXQubGlnaHRNYXAmJihpLmxpZ2h0TWFwPW4odC5saWdodE1hcCkpLHZvaWQgMCE9PXQubGlnaHRNYXBJbnRlbnNpdHkmJihpLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHkpLHZvaWQgMCE9PXQuYW9NYXAmJihpLmFvTWFwPW4odC5hb01hcCkpLHZvaWQgMCE9PXQuYW9NYXBJbnRlbnNpdHkmJihpLmFvTWFwSW50ZW5zaXR5PXQuYW9NYXBJbnRlbnNpdHkpLHZvaWQgMCE9PXQuZ3JhZGllbnRNYXAmJihpLmdyYWRpZW50TWFwPW4odC5ncmFkaWVudE1hcCkpLHZvaWQgMCE9PXQuY2xlYXJjb2F0TWFwJiYoaS5jbGVhcmNvYXRNYXA9bih0LmNsZWFyY29hdE1hcCkpLHZvaWQgMCE9PXQuY2xlYXJjb2F0Um91Z2huZXNzTWFwJiYoaS5jbGVhcmNvYXRSb3VnaG5lc3NNYXA9bih0LmNsZWFyY29hdFJvdWdobmVzc01hcCkpLHZvaWQgMCE9PXQuY2xlYXJjb2F0Tm9ybWFsTWFwJiYoaS5jbGVhcmNvYXROb3JtYWxNYXA9bih0LmNsZWFyY29hdE5vcm1hbE1hcCkpLHZvaWQgMCE9PXQuY2xlYXJjb2F0Tm9ybWFsU2NhbGUmJihpLmNsZWFyY29hdE5vcm1hbFNjYWxlPShuZXcgbUp0KS5mcm9tQXJyYXkodC5jbGVhcmNvYXROb3JtYWxTY2FsZSkpLHZvaWQgMCE9PXQudHJhbnNtaXNzaW9uTWFwJiYoaS50cmFuc21pc3Npb25NYXA9bih0LnRyYW5zbWlzc2lvbk1hcCkpLHZvaWQgMCE9PXQudGhpY2tuZXNzTWFwJiYoaS50aGlja25lc3NNYXA9bih0LnRoaWNrbmVzc01hcCkpLGl9c2V0VGV4dHVyZXModCl7cmV0dXJuIHRoaXMudGV4dHVyZXM9dCx0aGlzfX1jbGFzcyBFOXR7c3RhdGljIGRlY29kZVRleHQodCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBUZXh0RGVjb2RlcilyZXR1cm4obmV3IFRleHREZWNvZGVyKS5kZWNvZGUodCk7bGV0IGU9IiI7Zm9yKGxldCBuPTAsaT10Lmxlbmd0aDtuPGk7bisrKWUrPVN0cmluZy5mcm9tQ2hhckNvZGUodFtuXSk7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGUpKX1jYXRjaCh0KXtyZXR1cm4gZX19c3RhdGljIGV4dHJhY3RVcmxCYXNlKHQpe2NvbnN0IGU9dC5sYXN0SW5kZXhPZigiLyIpO3JldHVybi0xPT09ZT8iLi8iOnQuc3Vic3RyKDAsZSsxKX19Y2xhc3MgVDl0IGV4dGVuZHMgYjF0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnR5cGU9Ikluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5Iix0aGlzLmluc3RhbmNlQ291bnQ9MS8wfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5pbnN0YW5jZUNvdW50PXQuaW5zdGFuY2VDb3VudCx0aGlzfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKHRoaXMpO3JldHVybiB0Lmluc3RhbmNlQ291bnQ9dGhpcy5pbnN0YW5jZUNvdW50LHQuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT0hMCx0fX1UOXQucHJvdG90eXBlLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk9ITA7Y2xhc3MgQzl0IGV4dGVuZHMgUVF0e2NvbnN0cnVjdG9yKHQsZSxuLGk9MSl7Im51bWJlciI9PXR5cGVvZiBuJiYoaT1uLG49ITEsY29uc29sZS5lcnJvcigiVEhSRUUuSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlOiBUaGUgY29uc3RydWN0b3Igbm93IGV4cGVjdHMgbm9ybWFsaXplZCBhcyB0aGUgdGhpcmQgYXJndW1lbnQuIikpLHN1cGVyKHQsZSxuKSx0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9aX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMubWVzaFBlckF0dHJpYnV0ZT10Lm1lc2hQZXJBdHRyaWJ1dGUsdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0Lm1lc2hQZXJBdHRyaWJ1dGU9dGhpcy5tZXNoUGVyQXR0cmlidXRlLHQuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU9ITAsdH19Qzl0LnByb3RvdHlwZS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZT0hMDtjbGFzcyBBOXQgZXh0ZW5kcyAkNnR7Y29uc3RydWN0b3IodCl7c3VwZXIodCl9bG9hZCh0LGUsbixpKXtjb25zdCByPXRoaXMsbz1uZXcgWjZ0KHIubWFuYWdlcik7by5zZXRQYXRoKHIucGF0aCksby5zZXRSZXF1ZXN0SGVhZGVyKHIucmVxdWVzdEhlYWRlciksby5zZXRXaXRoQ3JlZGVudGlhbHMoci53aXRoQ3JlZGVudGlhbHMpLG8ubG9hZCh0LChmdW5jdGlvbihuKXt0cnl7ZShyLnBhcnNlKEpTT04ucGFyc2UobikpKX1jYXRjaChlKXtpP2koZSk6Y29uc29sZS5lcnJvcihlKSxyLm1hbmFnZXIuaXRlbUVycm9yKHQpfX0pLG4saSl9cGFyc2UodCl7Y29uc3QgZT17fSxuPXt9O2Z1bmN0aW9uIGkodCxpKXtpZih2b2lkIDAhPT1lW2ldKXJldHVybiBlW2ldO2NvbnN0IHI9dC5pbnRlcmxlYXZlZEJ1ZmZlcnNbaV0sbz0oZnVuY3Rpb24gYSh0LGUpe2lmKHZvaWQgMCE9PW5bZV0pcmV0dXJuIG5bZV07Y29uc3QgaT1uZXcgVWludDMyQXJyYXkodC5hcnJheUJ1ZmZlcnNbZV0pLmJ1ZmZlcjtyZXR1cm4gbltlXT1pLGl9KSh0LHIuYnVmZmVyKSxzPWQxdChyLnR5cGUsbyksbD1uZXcgJDV0KHMsci5zdHJpZGUpO3JldHVybiBsLnV1aWQ9ci51dWlkLGVbaV09bCxsfWNvbnN0IHI9dC5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5P25ldyBUOXQ6bmV3IGIxdCxvPXQuZGF0YS5pbmRleDtpZih2b2lkIDAhPT1vKXtjb25zdCB0PWQxdChvLnR5cGUsby5hcnJheSk7ci5zZXRJbmRleChuZXcgUVF0KHQsMSkpfWNvbnN0IGE9dC5kYXRhLmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGUgaW4gYSl7Y29uc3Qgbj1hW2VdO2xldCBvO2lmKG4uaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSl7Y29uc3QgZT1pKHQuZGF0YSxuLmRhdGEpO289bmV3IFo1dChlLG4uaXRlbVNpemUsbi5vZmZzZXQsbi5ub3JtYWxpemVkKX1lbHNle2NvbnN0IHQ9ZDF0KG4udHlwZSxuLmFycmF5KTtvPW5ldyhuLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlP0M5dDpRUXQpKHQsbi5pdGVtU2l6ZSxuLm5vcm1hbGl6ZWQpfXZvaWQgMCE9PW4ubmFtZSYmKG8ubmFtZT1uLm5hbWUpLHZvaWQgMCE9PW4udXNhZ2UmJm8uc2V0VXNhZ2Uobi51c2FnZSksdm9pZCAwIT09bi51cGRhdGVSYW5nZSYmKG8udXBkYXRlUmFuZ2Uub2Zmc2V0PW4udXBkYXRlUmFuZ2Uub2Zmc2V0LG8udXBkYXRlUmFuZ2UuY291bnQ9bi51cGRhdGVSYW5nZS5jb3VudCksci5zZXRBdHRyaWJ1dGUoZSxvKX1jb25zdCBzPXQuZGF0YS5tb3JwaEF0dHJpYnV0ZXM7aWYocylmb3IoY29uc3QgZSBpbiBzKXtjb25zdCBuPXNbZV0sbz1bXTtmb3IobGV0IGU9MCxyPW4ubGVuZ3RoO2U8cjtlKyspe2NvbnN0IHI9bltlXTtsZXQgYTtpZihyLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IGU9aSh0LmRhdGEsci5kYXRhKTthPW5ldyBaNXQoZSxyLml0ZW1TaXplLHIub2Zmc2V0LHIubm9ybWFsaXplZCl9ZWxzZXtjb25zdCB0PWQxdChyLnR5cGUsci5hcnJheSk7YT1uZXcgUVF0KHQsci5pdGVtU2l6ZSxyLm5vcm1hbGl6ZWQpfXZvaWQgMCE9PXIubmFtZSYmKGEubmFtZT1yLm5hbWUpLG8ucHVzaChhKX1yLm1vcnBoQXR0cmlidXRlc1tlXT1vfXQuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZSYmKHIubW9ycGhUYXJnZXRzUmVsYXRpdmU9ITApO2NvbnN0IGw9dC5kYXRhLmdyb3Vwc3x8dC5kYXRhLmRyYXdjYWxsc3x8dC5kYXRhLm9mZnNldHM7aWYodm9pZCAwIT09bClmb3IobGV0IHQ9MCxlPWwubGVuZ3RoO3QhPT1lOysrdCl7Y29uc3QgZT1sW3RdO3IuYWRkR3JvdXAoZS5zdGFydCxlLmNvdW50LGUubWF0ZXJpYWxJbmRleCl9Y29uc3QgYz10LmRhdGEuYm91bmRpbmdTcGhlcmU7aWYodm9pZCAwIT09Yyl7Y29uc3QgdD1uZXcgQ0p0O3ZvaWQgMCE9PWMuY2VudGVyJiZ0LmZyb21BcnJheShjLmNlbnRlciksci5ib3VuZGluZ1NwaGVyZT1uZXcgJEp0KHQsYy5yYWRpdXMpfXJldHVybiB0Lm5hbWUmJihyLm5hbWU9dC5uYW1lKSx0LnVzZXJEYXRhJiYoci51c2VyRGF0YT10LnVzZXJEYXRhKSxyfX1jb25zdCBrOXQ9e1VWTWFwcGluZzpVS3QsQ3ViZVJlZmxlY3Rpb25NYXBwaW5nOmpLdCxDdWJlUmVmcmFjdGlvbk1hcHBpbmc6R0t0LEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOldLdCxFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzpxS3QsQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc6WUt0LEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOlhLdH0sTDl0PXtSZXBlYXRXcmFwcGluZzokS3QsQ2xhbXBUb0VkZ2VXcmFwcGluZzpLS3QsTWlycm9yZWRSZXBlYXRXcmFwcGluZzpaS3R9LFA5dD17TmVhcmVzdEZpbHRlcjpKS3QsTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXI6UUt0LE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXI6dFp0LExpbmVhckZpbHRlcjplWnQsTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcjpuWnQsTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyOmladH07Y2xhc3MgTjl0IGV4dGVuZHMgJDZ0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLCJ1bmRlZmluZWQiPT10eXBlb2YgY3JlYXRlSW1hZ2VCaXRtYXAmJmNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGNyZWF0ZUltYWdlQml0bWFwKCkgbm90IHN1cHBvcnRlZC4iKSwidW5kZWZpbmVkIj09dHlwZW9mIGZldGNoJiZjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlQml0bWFwTG9hZGVyOiBmZXRjaCgpIG5vdCBzdXBwb3J0ZWQuIiksdGhpcy5vcHRpb25zPXtwcmVtdWx0aXBseUFscGhhOiJub25lIn19c2V0T3B0aW9ucyh0KXtyZXR1cm4gdGhpcy5vcHRpb25zPXQsdGhpc31sb2FkKHQsZSxuLGkpe3ZvaWQgMD09PXQmJih0PSIiKSx2b2lkIDAhPT10aGlzLnBhdGgmJih0PXRoaXMucGF0aCt0KSx0PXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKHQpO2NvbnN0IHI9dGhpcyxvPXE2dC5nZXQodCk7aWYodm9pZCAwIT09bylyZXR1cm4gci5tYW5hZ2VyLml0ZW1TdGFydCh0KSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2UmJmUobyksci5tYW5hZ2VyLml0ZW1FbmQodCl9KSwwKSxvO2NvbnN0IGE9e307YS5jcmVkZW50aWFscz0iYW5vbnltb3VzIj09PXRoaXMuY3Jvc3NPcmlnaW4/InNhbWUtb3JpZ2luIjoiaW5jbHVkZSIsYS5oZWFkZXJzPXRoaXMucmVxdWVzdEhlYWRlcixmZXRjaCh0LGEpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiB0LmJsb2IoKX0pKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAodCxPYmplY3QuYXNzaWduKHIub3B0aW9ucyx7Y29sb3JTcGFjZUNvbnZlcnNpb246Im5vbmUifSkpfSkpLnRoZW4oKGZ1bmN0aW9uKG4pe3E2dC5hZGQodCxuKSxlJiZlKG4pLHIubWFuYWdlci5pdGVtRW5kKHQpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtpJiZpKGUpLHIubWFuYWdlci5pdGVtRXJyb3IodCksci5tYW5hZ2VyLml0ZW1FbmQodCl9KSksci5tYW5hZ2VyLml0ZW1TdGFydCh0KX19Tjl0LnByb3RvdHlwZS5pc0ltYWdlQml0bWFwTG9hZGVyPSEwO2NsYXNzIEk5dHtjb25zdHJ1Y3Rvcigpe3RoaXMudHlwZT0iU2hhcGVQYXRoIix0aGlzLmNvbG9yPW5ldyAkUXQsdGhpcy5zdWJQYXRocz1bXSx0aGlzLmN1cnJlbnRQYXRoPW51bGx9bW92ZVRvKHQsZSl7cmV0dXJuIHRoaXMuY3VycmVudFBhdGg9bmV3IGk5dCx0aGlzLnN1YlBhdGhzLnB1c2godGhpcy5jdXJyZW50UGF0aCksdGhpcy5jdXJyZW50UGF0aC5tb3ZlVG8odCxlKSx0aGlzfWxpbmVUbyh0LGUpe3JldHVybiB0aGlzLmN1cnJlbnRQYXRoLmxpbmVUbyh0LGUpLHRoaXN9cXVhZHJhdGljQ3VydmVUbyh0LGUsbixpKXtyZXR1cm4gdGhpcy5jdXJyZW50UGF0aC5xdWFkcmF0aWNDdXJ2ZVRvKHQsZSxuLGkpLHRoaXN9YmV6aWVyQ3VydmVUbyh0LGUsbixpLHIsbyl7cmV0dXJuIHRoaXMuY3VycmVudFBhdGguYmV6aWVyQ3VydmVUbyh0LGUsbixpLHIsbyksdGhpc31zcGxpbmVUaHJ1KHQpe3JldHVybiB0aGlzLmN1cnJlbnRQYXRoLnNwbGluZVRocnUodCksdGhpc310b1NoYXBlcyh0LGUpe2Z1bmN0aW9uIG4odCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MCxpPXQubGVuZ3RoO248aTtuKyspe2NvbnN0IGk9dFtuXSxyPW5ldyByOXQ7ci5jdXJ2ZXM9aS5jdXJ2ZXMsZS5wdXNoKHIpfXJldHVybiBlfWZ1bmN0aW9uIGkodCxlKXtjb25zdCBuPWUubGVuZ3RoO2xldCBpPSExO2ZvcihsZXQgcj1uLTEsbz0wO288bjtyPW8rKyl7bGV0IG49ZVtyXSxhPWVbb10scz1hLngtbi54LGw9YS55LW4ueTtpZihNYXRoLmFicyhsKT5OdW1iZXIuRVBTSUxPTil7aWYobDwwJiYobj1lW29dLHM9LXMsYT1lW3JdLGw9LWwpLHQueTxuLnl8fHQueT5hLnkpY29udGludWU7aWYodC55PT09bi55KXtpZih0Lng9PT1uLngpcmV0dXJuITB9ZWxzZXtjb25zdCBlPWwqKHQueC1uLngpLXMqKHQueS1uLnkpO2lmKDA9PT1lKXJldHVybiEwO2lmKGU8MCljb250aW51ZTtpPSFpfX1lbHNle2lmKHQueSE9PW4ueSljb250aW51ZTtpZihhLng8PXQueCYmdC54PD1uLnh8fG4ueDw9dC54JiZ0Lng8PWEueClyZXR1cm4hMH19cmV0dXJuIGl9Y29uc3Qgcj1lNnQuaXNDbG9ja1dpc2Usbz10aGlzLnN1YlBhdGhzO2lmKDA9PT1vLmxlbmd0aClyZXR1cm5bXTtpZighMD09PWUpcmV0dXJuIG4obyk7bGV0IGEscyxsO2NvbnN0IGM9W107aWYoMT09PW8ubGVuZ3RoKXJldHVybiBzPW9bMF0sbD1uZXcgcjl0LGwuY3VydmVzPXMuY3VydmVzLGMucHVzaChsKSxjO2xldCB1PSFyKG9bMF0uZ2V0UG9pbnRzKCkpO3U9dD8hdTp1O2NvbnN0IGg9W10sZD1bXTtsZXQgcCxmLG09W10sZz0wO2RbZ109dm9pZCAwLG1bZ109W107Zm9yKGxldCBlPTAsbj1vLmxlbmd0aDtlPG47ZSsrKXM9b1tlXSxwPXMuZ2V0UG9pbnRzKCksYT1yKHApLGE9dD8hYTphLGE/KCF1JiZkW2ddJiZnKyssZFtnXT17czpuZXcgcjl0LHA6cH0sZFtnXS5zLmN1cnZlcz1zLmN1cnZlcyx1JiZnKyssbVtnXT1bXSk6bVtnXS5wdXNoKHtoOnMscDpwWzBdfSk7aWYoIWRbMF0pcmV0dXJuIG4obyk7aWYoZC5sZW5ndGg+MSl7bGV0IHQ9ITE7Y29uc3QgZT1bXTtmb3IobGV0IHQ9MCxlPWQubGVuZ3RoO3Q8ZTt0KyspaFt0XT1bXTtmb3IobGV0IG49MCxyPWQubGVuZ3RoO248cjtuKyspe2NvbnN0IHI9bVtuXTtmb3IobGV0IG89MDtvPHIubGVuZ3RoO28rKyl7Y29uc3QgYT1yW29dO2xldCBzPSEwO2ZvcihsZXQgcj0wO3I8ZC5sZW5ndGg7cisrKWkoYS5wLGRbcl0ucCkmJihuIT09ciYmZS5wdXNoKHtmcm9tczpuLHRvczpyLGhvbGU6b30pLHM/KHM9ITEsaFtyXS5wdXNoKGEpKTp0PSEwKTtzJiZoW25dLnB1c2goYSl9fWUubGVuZ3RoPjAmJih0fHwobT1oKSl9Zm9yKGxldCB0PTAsZT1kLmxlbmd0aDt0PGU7dCsrKXtsPWRbdF0ucyxjLnB1c2gobCksZj1tW3RdO2ZvcihsZXQgdD0wLGU9Zi5sZW5ndGg7dDxlO3QrKylsLmhvbGVzLnB1c2goZlt0XS5oKX1yZXR1cm4gY319Y2xhc3MgUjl0e2NvbnN0cnVjdG9yKHQpe3RoaXMudHlwZT0iRm9udCIsdGhpcy5kYXRhPXR9Z2VuZXJhdGVTaGFwZXModCxlPTEwMCl7Y29uc3Qgbj1bXSxpPShmdW5jdGlvbiByKHQsZSxuKXtjb25zdCBpPUFycmF5LmZyb20odCkscj1lL24ucmVzb2x1dGlvbixvPShuLmJvdW5kaW5nQm94LnlNYXgtbi5ib3VuZGluZ0JveC55TWluK24udW5kZXJsaW5lVGhpY2tuZXNzKSpyLGE9W107bGV0IHM9MCxsPTA7Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0Kyspe2NvbnN0IGU9aVt0XTtpZigiXG4iPT09ZSlzPTAsbC09bztlbHNle2NvbnN0IHQ9Tzl0KGUscixzLGwsbik7cys9dC5vZmZzZXRYLGEucHVzaCh0LnBhdGgpfX1yZXR1cm4gYX0pKHQsZSx0aGlzLmRhdGEpO2ZvcihsZXQgdD0wLGU9aS5sZW5ndGg7dDxlO3QrKylBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShuLGlbdF0udG9TaGFwZXMoKSk7cmV0dXJuIG59fWZ1bmN0aW9uIE85dCh0LGUsbixpLHIpe2NvbnN0IG89ci5nbHlwaHNbdF18fHIuZ2x5cGhzWyI/Il07aWYoIW8pcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcignVEhSRUUuRm9udDogY2hhcmFjdGVyICInK3QrJyIgZG9lcyBub3QgZXhpc3RzIGluIGZvbnQgZmFtaWx5ICcrci5mYW1pbHlOYW1lKyIuIik7Y29uc3QgYT1uZXcgSTl0O2xldCBzLGwsYyx1LGgsZCxwLGY7aWYoby5vKXtjb25zdCB0PW8uX2NhY2hlZE91dGxpbmV8fChvLl9jYWNoZWRPdXRsaW5lPW8uby5zcGxpdCgiICIpKTtmb3IobGV0IHI9MCxvPXQubGVuZ3RoO3I8bzspc3dpdGNoKHRbcisrXSl7Y2FzZSJtIjpzPXRbcisrXSplK24sbD10W3IrK10qZStpLGEubW92ZVRvKHMsbCk7YnJlYWs7Y2FzZSJsIjpzPXRbcisrXSplK24sbD10W3IrK10qZStpLGEubGluZVRvKHMsbCk7YnJlYWs7Y2FzZSJxIjpjPXRbcisrXSplK24sdT10W3IrK10qZStpLGg9dFtyKytdKmUrbixkPXRbcisrXSplK2ksYS5xdWFkcmF0aWNDdXJ2ZVRvKGgsZCxjLHUpO2JyZWFrO2Nhc2UiYiI6Yz10W3IrK10qZStuLHU9dFtyKytdKmUraSxoPXRbcisrXSplK24sZD10W3IrK10qZStpLHA9dFtyKytdKmUrbixmPXRbcisrXSplK2ksYS5iZXppZXJDdXJ2ZVRvKGgsZCxwLGYsYyx1KX19cmV0dXJue29mZnNldFg6by5oYSplLHBhdGg6YX19bGV0IHo5dDtSOXQucHJvdG90eXBlLmlzRm9udD0hMDtjb25zdCBEOXQ9e2dldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09ejl0JiYoejl0PW5ldyh3aW5kb3cuQXVkaW9Db250ZXh0fHx3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0KSksejl0fSxzZXRDb250ZXh0OmZ1bmN0aW9uKHQpe3o5dD10fX07Y2xhc3MgQjl0IGV4dGVuZHMgJDZ0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4saSl7Y29uc3Qgcj10aGlzLG89bmV3IFo2dCh0aGlzLm1hbmFnZXIpO28uc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpLG8uc2V0UGF0aCh0aGlzLnBhdGgpLG8uc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLG8uc2V0V2l0aENyZWRlbnRpYWxzKHRoaXMud2l0aENyZWRlbnRpYWxzKSxvLmxvYWQodCwoZnVuY3Rpb24obil7dHJ5e2NvbnN0IHQ9bi5zbGljZSgwKTtEOXQuZ2V0Q29udGV4dCgpLmRlY29kZUF1ZGlvRGF0YSh0LChmdW5jdGlvbih0KXtlKHQpfSkpfWNhdGNoKGUpe2k/aShlKTpjb25zb2xlLmVycm9yKGUpLHIubWFuYWdlci5pdGVtRXJyb3IodCl9fSksbixpKX19Y2xhc3MgSDl0IGV4dGVuZHMgUzl0e2NvbnN0cnVjdG9yKHQsZSxuPTEpe3N1cGVyKHZvaWQgMCxuKTtjb25zdCBpPShuZXcgJFF0KS5zZXQodCkscj0obmV3ICRRdCkuc2V0KGUpLG89bmV3IENKdChpLnIsaS5nLGkuYiksYT1uZXcgQ0p0KHIucixyLmcsci5iKSxzPU1hdGguc3FydChNYXRoLlBJKSxsPXMqTWF0aC5zcXJ0KC43NSk7dGhpcy5zaC5jb2VmZmljaWVudHNbMF0uY29weShvKS5hZGQoYSkubXVsdGlwbHlTY2FsYXIocyksdGhpcy5zaC5jb2VmZmljaWVudHNbMV0uY29weShvKS5zdWIoYSkubXVsdGlwbHlTY2FsYXIobCl9fUg5dC5wcm90b3R5cGUuaXNIZW1pc3BoZXJlTGlnaHRQcm9iZT0hMDtjbGFzcyBGOXQgZXh0ZW5kcyBTOXR7Y29uc3RydWN0b3IodCxlPTEpe3N1cGVyKHZvaWQgMCxlKTtjb25zdCBuPShuZXcgJFF0KS5zZXQodCk7dGhpcy5zaC5jb2VmZmljaWVudHNbMF0uc2V0KG4ucixuLmcsbi5iKS5tdWx0aXBseVNjYWxhcigyKk1hdGguc3FydChNYXRoLlBJKSl9fUY5dC5wcm90b3R5cGUuaXNBbWJpZW50TGlnaHRQcm9iZT0hMDtjb25zdCBWOXQ9bmV3IHJRdCxVOXQ9bmV3IHJRdDtjbGFzcyBqOXR7Y29uc3RydWN0b3IodD0hMCl7dGhpcy5hdXRvU3RhcnQ9dCx0aGlzLnN0YXJ0VGltZT0wLHRoaXMub2xkVGltZT0wLHRoaXMuZWxhcHNlZFRpbWU9MCx0aGlzLnJ1bm5pbmc9ITF9c3RhcnQoKXt0aGlzLnN0YXJ0VGltZT1HOXQoKSx0aGlzLm9sZFRpbWU9dGhpcy5zdGFydFRpbWUsdGhpcy5lbGFwc2VkVGltZT0wLHRoaXMucnVubmluZz0hMH1zdG9wKCl7dGhpcy5nZXRFbGFwc2VkVGltZSgpLHRoaXMucnVubmluZz0hMSx0aGlzLmF1dG9TdGFydD0hMX1nZXRFbGFwc2VkVGltZSgpe3JldHVybiB0aGlzLmdldERlbHRhKCksdGhpcy5lbGFwc2VkVGltZX1nZXREZWx0YSgpe2xldCB0PTA7aWYodGhpcy5hdXRvU3RhcnQmJiF0aGlzLnJ1bm5pbmcpcmV0dXJuIHRoaXMuc3RhcnQoKSwwO2lmKHRoaXMucnVubmluZyl7Y29uc3QgZT1HOXQoKTt0PShlLXRoaXMub2xkVGltZSkvMWUzLHRoaXMub2xkVGltZT1lLHRoaXMuZWxhcHNlZFRpbWUrPXR9cmV0dXJuIHR9fWZ1bmN0aW9uIEc5dCgpe3JldHVybigidW5kZWZpbmVkIj09dHlwZW9mIHBlcmZvcm1hbmNlP0RhdGU6cGVyZm9ybWFuY2UpLm5vdygpfWNvbnN0IFc5dD1uZXcgQ0p0LHE5dD1uZXcgVEp0LFk5dD1uZXcgQ0p0LFg5dD1uZXcgQ0p0O2NsYXNzICQ5dCBleHRlbmRzIGtRdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iQXVkaW8iLHRoaXMubGlzdGVuZXI9dCx0aGlzLmNvbnRleHQ9dC5jb250ZXh0LHRoaXMuZ2Fpbj10aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpLHRoaXMuZ2Fpbi5jb25uZWN0KHQuZ2V0SW5wdXQoKSksdGhpcy5hdXRvcGxheT0hMSx0aGlzLmJ1ZmZlcj1udWxsLHRoaXMuZGV0dW5lPTAsdGhpcy5sb29wPSExLHRoaXMubG9vcFN0YXJ0PTAsdGhpcy5sb29wRW5kPTAsdGhpcy5vZmZzZXQ9MCx0aGlzLmR1cmF0aW9uPXZvaWQgMCx0aGlzLnBsYXliYWNrUmF0ZT0xLHRoaXMuaXNQbGF5aW5nPSExLHRoaXMuaGFzUGxheWJhY2tDb250cm9sPSEwLHRoaXMuc291cmNlPW51bGwsdGhpcy5zb3VyY2VUeXBlPSJlbXB0eSIsdGhpcy5fc3RhcnRlZEF0PTAsdGhpcy5fcHJvZ3Jlc3M9MCx0aGlzLl9jb25uZWN0ZWQ9ITEsdGhpcy5maWx0ZXJzPVtdfWdldE91dHB1dCgpe3JldHVybiB0aGlzLmdhaW59c2V0Tm9kZVNvdXJjZSh0KXtyZXR1cm4gdGhpcy5oYXNQbGF5YmFja0NvbnRyb2w9ITEsdGhpcy5zb3VyY2VUeXBlPSJhdWRpb05vZGUiLHRoaXMuc291cmNlPXQsdGhpcy5jb25uZWN0KCksdGhpc31zZXRNZWRpYUVsZW1lbnRTb3VyY2UodCl7cmV0dXJuIHRoaXMuaGFzUGxheWJhY2tDb250cm9sPSExLHRoaXMuc291cmNlVHlwZT0ibWVkaWFOb2RlIix0aGlzLnNvdXJjZT10aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFFbGVtZW50U291cmNlKHQpLHRoaXMuY29ubmVjdCgpLHRoaXN9c2V0TWVkaWFTdHJlYW1Tb3VyY2UodCl7cmV0dXJuIHRoaXMuaGFzUGxheWJhY2tDb250cm9sPSExLHRoaXMuc291cmNlVHlwZT0ibWVkaWFTdHJlYW1Ob2RlIix0aGlzLnNvdXJjZT10aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFTdHJlYW1Tb3VyY2UodCksdGhpcy5jb25uZWN0KCksdGhpc31zZXRCdWZmZXIodCl7cmV0dXJuIHRoaXMuYnVmZmVyPXQsdGhpcy5zb3VyY2VUeXBlPSJidWZmZXIiLHRoaXMuYXV0b3BsYXkmJnRoaXMucGxheSgpLHRoaXN9cGxheSh0PTApe2lmKCEwPT09dGhpcy5pc1BsYXlpbmcpcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogQXVkaW8gaXMgYWxyZWFkeSBwbGF5aW5nLiIpO2lmKCExPT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wpcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTt0aGlzLl9zdGFydGVkQXQ9dGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lK3Q7Y29uc3QgZT10aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7cmV0dXJuIGUuYnVmZmVyPXRoaXMuYnVmZmVyLGUubG9vcD10aGlzLmxvb3AsZS5sb29wU3RhcnQ9dGhpcy5sb29wU3RhcnQsZS5sb29wRW5kPXRoaXMubG9vcEVuZCxlLm9uZW5kZWQ9dGhpcy5vbkVuZGVkLmJpbmQodGhpcyksZS5zdGFydCh0aGlzLl9zdGFydGVkQXQsdGhpcy5fcHJvZ3Jlc3MrdGhpcy5vZmZzZXQsdGhpcy5kdXJhdGlvbiksdGhpcy5pc1BsYXlpbmc9ITAsdGhpcy5zb3VyY2U9ZSx0aGlzLnNldERldHVuZSh0aGlzLmRldHVuZSksdGhpcy5zZXRQbGF5YmFja1JhdGUodGhpcy5wbGF5YmFja1JhdGUpLHRoaXMuY29ubmVjdCgpfXBhdXNlKCl7aWYoITEhPT10aGlzLmhhc1BsYXliYWNrQ29udHJvbClyZXR1cm4hMD09PXRoaXMuaXNQbGF5aW5nJiYodGhpcy5fcHJvZ3Jlc3MrPU1hdGgubWF4KHRoaXMuY29udGV4dC5jdXJyZW50VGltZS10aGlzLl9zdGFydGVkQXQsMCkqdGhpcy5wbGF5YmFja1JhdGUsITA9PT10aGlzLmxvb3AmJih0aGlzLl9wcm9ncmVzcz10aGlzLl9wcm9ncmVzcyUodGhpcy5kdXJhdGlvbnx8dGhpcy5idWZmZXIuZHVyYXRpb24pKSx0aGlzLnNvdXJjZS5zdG9wKCksdGhpcy5zb3VyY2Uub25lbmRlZD1udWxsLHRoaXMuaXNQbGF5aW5nPSExKSx0aGlzO2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIil9c3RvcCgpe2lmKCExIT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wpcmV0dXJuIHRoaXMuX3Byb2dyZXNzPTAsdGhpcy5zb3VyY2Uuc3RvcCgpLHRoaXMuc291cmNlLm9uZW5kZWQ9bnVsbCx0aGlzLmlzUGxheWluZz0hMSx0aGlzO2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIil9Y29ubmVjdCgpe2lmKHRoaXMuZmlsdGVycy5sZW5ndGg+MCl7dGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pO2ZvcihsZXQgdD0xLGU9dGhpcy5maWx0ZXJzLmxlbmd0aDt0PGU7dCsrKXRoaXMuZmlsdGVyc1t0LTFdLmNvbm5lY3QodGhpcy5maWx0ZXJzW3RdKTt0aGlzLmZpbHRlcnNbdGhpcy5maWx0ZXJzLmxlbmd0aC0xXS5jb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpfWVsc2UgdGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKTtyZXR1cm4gdGhpcy5fY29ubmVjdGVkPSEwLHRoaXN9ZGlzY29ubmVjdCgpe2lmKHRoaXMuZmlsdGVycy5sZW5ndGg+MCl7dGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pO2ZvcihsZXQgdD0xLGU9dGhpcy5maWx0ZXJzLmxlbmd0aDt0PGU7dCsrKXRoaXMuZmlsdGVyc1t0LTFdLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXJzW3RdKTt0aGlzLmZpbHRlcnNbdGhpcy5maWx0ZXJzLmxlbmd0aC0xXS5kaXNjb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpfWVsc2UgdGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKTtyZXR1cm4gdGhpcy5fY29ubmVjdGVkPSExLHRoaXN9Z2V0RmlsdGVycygpe3JldHVybiB0aGlzLmZpbHRlcnN9c2V0RmlsdGVycyh0KXtyZXR1cm4gdHx8KHQ9W10pLCEwPT09dGhpcy5fY29ubmVjdGVkPyh0aGlzLmRpc2Nvbm5lY3QoKSx0aGlzLmZpbHRlcnM9dC5zbGljZSgpLHRoaXMuY29ubmVjdCgpKTp0aGlzLmZpbHRlcnM9dC5zbGljZSgpLHRoaXN9c2V0RGV0dW5lKHQpe2lmKHRoaXMuZGV0dW5lPXQsdm9pZCAwIT09dGhpcy5zb3VyY2UuZGV0dW5lKXJldHVybiEwPT09dGhpcy5pc1BsYXlpbmcmJnRoaXMuc291cmNlLmRldHVuZS5zZXRUYXJnZXRBdFRpbWUodGhpcy5kZXR1bmUsdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLC4wMSksdGhpc31nZXREZXR1bmUoKXtyZXR1cm4gdGhpcy5kZXR1bmV9Z2V0RmlsdGVyKCl7cmV0dXJuIHRoaXMuZ2V0RmlsdGVycygpWzBdfXNldEZpbHRlcih0KXtyZXR1cm4gdGhpcy5zZXRGaWx0ZXJzKHQ/W3RdOltdKX1zZXRQbGF5YmFja1JhdGUodCl7aWYoITEhPT10aGlzLmhhc1BsYXliYWNrQ29udHJvbClyZXR1cm4gdGhpcy5wbGF5YmFja1JhdGU9dCwhMD09PXRoaXMuaXNQbGF5aW5nJiZ0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VGFyZ2V0QXRUaW1lKHRoaXMucGxheWJhY2tSYXRlLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXM7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKX1nZXRQbGF5YmFja1JhdGUoKXtyZXR1cm4gdGhpcy5wbGF5YmFja1JhdGV9b25FbmRlZCgpe3RoaXMuaXNQbGF5aW5nPSExfWdldExvb3AoKXtyZXR1cm4hMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sPyhjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpLCExKTp0aGlzLmxvb3B9c2V0TG9vcCh0KXtpZighMSE9PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKXJldHVybiB0aGlzLmxvb3A9dCwhMD09PXRoaXMuaXNQbGF5aW5nJiYodGhpcy5zb3VyY2UubG9vcD10aGlzLmxvb3ApLHRoaXM7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKX1zZXRMb29wU3RhcnQodCl7cmV0dXJuIHRoaXMubG9vcFN0YXJ0PXQsdGhpc31zZXRMb29wRW5kKHQpe3JldHVybiB0aGlzLmxvb3BFbmQ9dCx0aGlzfWdldFZvbHVtZSgpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZX1zZXRWb2x1bWUodCl7cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSh0LHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXN9fWNvbnN0IEs5dD1uZXcgQ0p0LFo5dD1uZXcgVEp0LEo5dD1uZXcgQ0p0LFE5dD1uZXcgQ0p0O2NsYXNzIHQ4dHtjb25zdHJ1Y3Rvcih0LGU9MjA0OCl7dGhpcy5hbmFseXNlcj10LmNvbnRleHQuY3JlYXRlQW5hbHlzZXIoKSx0aGlzLmFuYWx5c2VyLmZmdFNpemU9ZSx0aGlzLmRhdGE9bmV3IFVpbnQ4QXJyYXkodGhpcy5hbmFseXNlci5mcmVxdWVuY3lCaW5Db3VudCksdC5nZXRPdXRwdXQoKS5jb25uZWN0KHRoaXMuYW5hbHlzZXIpfWdldEZyZXF1ZW5jeURhdGEoKXtyZXR1cm4gdGhpcy5hbmFseXNlci5nZXRCeXRlRnJlcXVlbmN5RGF0YSh0aGlzLmRhdGEpLHRoaXMuZGF0YX1nZXRBdmVyYWdlRnJlcXVlbmN5KCl7bGV0IHQ9MDtjb25zdCBlPXRoaXMuZ2V0RnJlcXVlbmN5RGF0YSgpO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXQrPWVbbl07cmV0dXJuIHQvZS5sZW5ndGh9fWNsYXNzIGU4dHtjb25zdHJ1Y3Rvcih0LGUsbil7bGV0IGkscixvO3N3aXRjaCh0aGlzLmJpbmRpbmc9dCx0aGlzLnZhbHVlU2l6ZT1uLGUpe2Nhc2UicXVhdGVybmlvbiI6aT10aGlzLl9zbGVycCxyPXRoaXMuX3NsZXJwQWRkaXRpdmUsbz10aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5UXVhdGVybmlvbix0aGlzLmJ1ZmZlcj1uZXcgRmxvYXQ2NEFycmF5KDYqbiksdGhpcy5fd29ya0luZGV4PTU7YnJlYWs7Y2FzZSJzdHJpbmciOmNhc2UiYm9vbCI6aT10aGlzLl9zZWxlY3Qscj10aGlzLl9zZWxlY3Qsbz10aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5T3RoZXIsdGhpcy5idWZmZXI9bmV3IEFycmF5KDUqbik7YnJlYWs7ZGVmYXVsdDppPXRoaXMuX2xlcnAscj10aGlzLl9sZXJwQWRkaXRpdmUsbz10aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYyx0aGlzLmJ1ZmZlcj1uZXcgRmxvYXQ2NEFycmF5KDUqbil9dGhpcy5fbWl4QnVmZmVyUmVnaW9uPWksdGhpcy5fbWl4QnVmZmVyUmVnaW9uQWRkaXRpdmU9cix0aGlzLl9zZXRJZGVudGl0eT1vLHRoaXMuX29yaWdJbmRleD0zLHRoaXMuX2FkZEluZGV4PTQsdGhpcy5jdW11bGF0aXZlV2VpZ2h0PTAsdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmU9MCx0aGlzLnVzZUNvdW50PTAsdGhpcy5yZWZlcmVuY2VDb3VudD0wfWFjY3VtdWxhdGUodCxlKXtjb25zdCBuPXRoaXMuYnVmZmVyLGk9dGhpcy52YWx1ZVNpemUscj10KmkraTtsZXQgbz10aGlzLmN1bXVsYXRpdmVXZWlnaHQ7aWYoMD09PW8pe2ZvcihsZXQgdD0wO3QhPT1pOysrdCluW3IrdF09blt0XTtvPWV9ZWxzZSBvKz1lLHRoaXMuX21peEJ1ZmZlclJlZ2lvbihuLHIsMCxlL28saSk7dGhpcy5jdW11bGF0aXZlV2VpZ2h0PW99YWNjdW11bGF0ZUFkZGl0aXZlKHQpe2NvbnN0IGU9dGhpcy5idWZmZXIsbj10aGlzLnZhbHVlU2l6ZSxpPW4qdGhpcy5fYWRkSW5kZXg7MD09PXRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlJiZ0aGlzLl9zZXRJZGVudGl0eSgpLHRoaXMuX21peEJ1ZmZlclJlZ2lvbkFkZGl0aXZlKGUsaSwwLHQsbiksdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUrPXR9YXBwbHkodCl7Y29uc3QgZT10aGlzLnZhbHVlU2l6ZSxuPXRoaXMuYnVmZmVyLGk9dCplK2Uscj10aGlzLmN1bXVsYXRpdmVXZWlnaHQsbz10aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSxhPXRoaXMuYmluZGluZzt0aGlzLmN1bXVsYXRpdmVXZWlnaHQ9MCx0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZT0wLHI8MSYmdGhpcy5fbWl4QnVmZmVyUmVnaW9uKG4saSxlKnRoaXMuX29yaWdJbmRleCwxLXIsZSksbz4wJiZ0aGlzLl9taXhCdWZmZXJSZWdpb25BZGRpdGl2ZShuLGksdGhpcy5fYWRkSW5kZXgqZSwxLGUpO2ZvcihsZXQgdD1lLHI9ZStlO3QhPT1yOysrdClpZihuW3RdIT09blt0K2VdKXthLnNldFZhbHVlKG4saSk7YnJlYWt9fXNhdmVPcmlnaW5hbFN0YXRlKCl7Y29uc3QgdD10aGlzLmJ1ZmZlcixlPXRoaXMudmFsdWVTaXplLG49ZSp0aGlzLl9vcmlnSW5kZXg7dGhpcy5iaW5kaW5nLmdldFZhbHVlKHQsbik7Zm9yKGxldCBpPWUscj1uO2khPT1yOysraSl0W2ldPXRbbitpJWVdO3RoaXMuX3NldElkZW50aXR5KCksdGhpcy5jdW11bGF0aXZlV2VpZ2h0PTAsdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmU9MH1yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpe3RoaXMuYmluZGluZy5zZXRWYWx1ZSh0aGlzLmJ1ZmZlciwzKnRoaXMudmFsdWVTaXplKX1fc2V0QWRkaXRpdmVJZGVudGl0eU51bWVyaWMoKXtjb25zdCB0PXRoaXMuX2FkZEluZGV4KnRoaXMudmFsdWVTaXplLGU9dCt0aGlzLnZhbHVlU2l6ZTtmb3IobGV0IG49dDtuPGU7bisrKXRoaXMuYnVmZmVyW25dPTB9X3NldEFkZGl0aXZlSWRlbnRpdHlRdWF0ZXJuaW9uKCl7dGhpcy5fc2V0QWRkaXRpdmVJZGVudGl0eU51bWVyaWMoKSx0aGlzLmJ1ZmZlclt0aGlzLl9hZGRJbmRleCp0aGlzLnZhbHVlU2l6ZSszXT0xfV9zZXRBZGRpdGl2ZUlkZW50aXR5T3RoZXIoKXtjb25zdCB0PXRoaXMuX29yaWdJbmRleCp0aGlzLnZhbHVlU2l6ZSxlPXRoaXMuX2FkZEluZGV4KnRoaXMudmFsdWVTaXplO2ZvcihsZXQgbj0wO248dGhpcy52YWx1ZVNpemU7bisrKXRoaXMuYnVmZmVyW2Urbl09dGhpcy5idWZmZXJbdCtuXX1fc2VsZWN0KHQsZSxuLGkscil7aWYoaT49LjUpZm9yKGxldCBpPTA7aSE9PXI7KytpKXRbZStpXT10W24raV19X3NsZXJwKHQsZSxuLGkpe1RKdC5zbGVycEZsYXQodCxlLHQsZSx0LG4saSl9X3NsZXJwQWRkaXRpdmUodCxlLG4saSxyKXtjb25zdCBvPXRoaXMuX3dvcmtJbmRleCpyO1RKdC5tdWx0aXBseVF1YXRlcm5pb25zRmxhdCh0LG8sdCxlLHQsbiksVEp0LnNsZXJwRmxhdCh0LGUsdCxlLHQsbyxpKX1fbGVycCh0LGUsbixpLHIpe2NvbnN0IG89MS1pO2ZvcihsZXQgYT0wO2EhPT1yOysrYSl7Y29uc3Qgcj1lK2E7dFtyXT10W3JdKm8rdFtuK2FdKml9fV9sZXJwQWRkaXRpdmUodCxlLG4saSxyKXtmb3IobGV0IG89MDtvIT09cjsrK28pe2NvbnN0IHI9ZStvO3Rbcl09dFtyXSt0W24rb10qaX19fWNvbnN0IG44dD1uZXcgUmVnRXhwKCJbXFxbXFxdXFwuOlxcL10iLCJnIiksaTh0PSJbXlxcW1xcXVxcLjpcXC9dIixyOHQ9IlteIisiXFxbXFxdXFwuOlxcLyIucmVwbGFjZSgiXFwuIiwiIikrIl0iLG84dD0vKCg/OldDK1tcLzpdKSopLy5zb3VyY2UucmVwbGFjZSgiV0MiLGk4dCksYTh0PS8oV0NPRCspPy8uc291cmNlLnJlcGxhY2UoIldDT0QiLHI4dCksczh0PS8oPzpcLihXQyspKD86XFsoLispXF0pPyk/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLGk4dCksbDh0PS9cLihXQyspKD86XFsoLispXF0pPy8uc291cmNlLnJlcGxhY2UoIldDIixpOHQpLGM4dD1uZXcgUmVnRXhwKCJeIitvOHQrYTh0K3M4dCtsOHQrIiQiKSx1OHQ9WyJtYXRlcmlhbCIsIm1hdGVyaWFscyIsImJvbmVzIl07Y2xhc3MgaDh0e2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLnBhdGg9ZSx0aGlzLnBhcnNlZFBhdGg9bnx8aDh0LnBhcnNlVHJhY2tOYW1lKGUpLHRoaXMubm9kZT1oOHQuZmluZE5vZGUodCx0aGlzLnBhcnNlZFBhdGgubm9kZU5hbWUpfHx0LHRoaXMucm9vdE5vZGU9dCx0aGlzLmdldFZhbHVlPXRoaXMuX2dldFZhbHVlX3VuYm91bmQsdGhpcy5zZXRWYWx1ZT10aGlzLl9zZXRWYWx1ZV91bmJvdW5kfXN0YXRpYyBjcmVhdGUodCxlLG4pe3JldHVybiB0JiZ0LmlzQW5pbWF0aW9uT2JqZWN0R3JvdXA/bmV3IGg4dC5Db21wb3NpdGUodCxlLG4pOm5ldyBoOHQodCxlLG4pfXN0YXRpYyBzYW5pdGl6ZU5vZGVOYW1lKHQpe3JldHVybiB0LnJlcGxhY2UoL1xzL2csIl8iKS5yZXBsYWNlKG44dCwiIil9c3RhdGljIHBhcnNlVHJhY2tOYW1lKHQpe2NvbnN0IGU9Yzh0LmV4ZWModCk7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJQcm9wZXJ0eUJpbmRpbmc6IENhbm5vdCBwYXJzZSB0cmFja05hbWU6ICIrdCk7Y29uc3Qgbj17bm9kZU5hbWU6ZVsyXSxvYmplY3ROYW1lOmVbM10sb2JqZWN0SW5kZXg6ZVs0XSxwcm9wZXJ0eU5hbWU6ZVs1XSxwcm9wZXJ0eUluZGV4OmVbNl19LGk9bi5ub2RlTmFtZSYmbi5ub2RlTmFtZS5sYXN0SW5kZXhPZigiLiIpO2lmKHZvaWQgMCE9PWkmJi0xIT09aSl7Y29uc3QgdD1uLm5vZGVOYW1lLnN1YnN0cmluZyhpKzEpOy0xIT09dTh0LmluZGV4T2YodCkmJihuLm5vZGVOYW1lPW4ubm9kZU5hbWUuc3Vic3RyaW5nKDAsaSksbi5vYmplY3ROYW1lPXQpfWlmKG51bGw9PT1uLnByb3BlcnR5TmFtZXx8MD09PW4ucHJvcGVydHlOYW1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlByb3BlcnR5QmluZGluZzogY2FuIG5vdCBwYXJzZSBwcm9wZXJ0eU5hbWUgZnJvbSB0cmFja05hbWU6ICIrdCk7cmV0dXJuIG59c3RhdGljIGZpbmROb2RlKHQsZSl7aWYoIWV8fCIiPT09ZXx8Ii4iPT09ZXx8LTE9PT1lfHxlPT09dC5uYW1lfHxlPT09dC51dWlkKXJldHVybiB0O2lmKHQuc2tlbGV0b24pe2NvbnN0IG49dC5za2VsZXRvbi5nZXRCb25lQnlOYW1lKGUpO2lmKHZvaWQgMCE9PW4pcmV0dXJuIG59aWYodC5jaGlsZHJlbil7Y29uc3Qgbj1mdW5jdGlvbih0KXtmb3IobGV0IGk9MDtpPHQubGVuZ3RoO2krKyl7Y29uc3Qgcj10W2ldO2lmKHIubmFtZT09PWV8fHIudXVpZD09PWUpcmV0dXJuIHI7Y29uc3Qgbz1uKHIuY2hpbGRyZW4pO2lmKG8pcmV0dXJuIG99cmV0dXJuIG51bGx9LGk9bih0LmNoaWxkcmVuKTtpZihpKXJldHVybiBpfXJldHVybiBudWxsfV9nZXRWYWx1ZV91bmF2YWlsYWJsZSgpe31fc2V0VmFsdWVfdW5hdmFpbGFibGUoKXt9X2dldFZhbHVlX2RpcmVjdCh0LGUpe3RbZV09dGhpcy5ub2RlW3RoaXMucHJvcGVydHlOYW1lXX1fZ2V0VmFsdWVfYXJyYXkodCxlKXtjb25zdCBuPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtmb3IobGV0IGk9MCxyPW4ubGVuZ3RoO2khPT1yOysraSl0W2UrK109bltpXX1fZ2V0VmFsdWVfYXJyYXlFbGVtZW50KHQsZSl7dFtlXT10aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XX1fZ2V0VmFsdWVfdG9BcnJheSh0LGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS50b0FycmF5KHQsZSl9X3NldFZhbHVlX2RpcmVjdCh0LGUpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT10W2VdfV9zZXRWYWx1ZV9kaXJlY3Rfc2V0TmVlZHNVcGRhdGUodCxlKXt0aGlzLnRhcmdldE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV09dFtlXSx0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH1fc2V0VmFsdWVfZGlyZWN0X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUodCxlKXt0aGlzLnRhcmdldE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV09dFtlXSx0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9hcnJheSh0LGUpe2NvbnN0IG49dGhpcy5yZXNvbHZlZFByb3BlcnR5O2ZvcihsZXQgaT0wLHI9bi5sZW5ndGg7aSE9PXI7KytpKW5baV09dFtlKytdfV9zZXRWYWx1ZV9hcnJheV9zZXROZWVkc1VwZGF0ZSh0LGUpe2NvbnN0IG49dGhpcy5yZXNvbHZlZFByb3BlcnR5O2ZvcihsZXQgaT0wLHI9bi5sZW5ndGg7aSE9PXI7KytpKW5baV09dFtlKytdO3RoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9hcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKHQsZSl7Y29uc3Qgbj10aGlzLnJlc29sdmVkUHJvcGVydHk7Zm9yKGxldCBpPTAscj1uLmxlbmd0aDtpIT09cjsrK2kpbltpXT10W2UrK107dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1fc2V0VmFsdWVfYXJyYXlFbGVtZW50KHQsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5W3RoaXMucHJvcGVydHlJbmRleF09dFtlXX1fc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE5lZWRzVXBkYXRlKHQsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5W3RoaXMucHJvcGVydHlJbmRleF09dFtlXSx0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH1fc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUodCxlKXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT10W2VdLHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2Zyb21BcnJheSh0LGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkodCxlKX1fc2V0VmFsdWVfZnJvbUFycmF5X3NldE5lZWRzVXBkYXRlKHQsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSh0LGUpLHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSh0LGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkodCxlKSx0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV9nZXRWYWx1ZV91bmJvdW5kKHQsZSl7dGhpcy5iaW5kKCksdGhpcy5nZXRWYWx1ZSh0LGUpfV9zZXRWYWx1ZV91bmJvdW5kKHQsZSl7dGhpcy5iaW5kKCksdGhpcy5zZXRWYWx1ZSh0LGUpfWJpbmQoKXtsZXQgdD10aGlzLm5vZGU7Y29uc3QgZT10aGlzLnBhcnNlZFBhdGgsbj1lLm9iamVjdE5hbWUsaT1lLnByb3BlcnR5TmFtZTtsZXQgcj1lLnByb3BlcnR5SW5kZXg7aWYodHx8KHQ9aDh0LmZpbmROb2RlKHRoaXMucm9vdE5vZGUsZS5ub2RlTmFtZSl8fHRoaXMucm9vdE5vZGUsdGhpcy5ub2RlPXQpLHRoaXMuZ2V0VmFsdWU9dGhpcy5fZ2V0VmFsdWVfdW5hdmFpbGFibGUsdGhpcy5zZXRWYWx1ZT10aGlzLl9zZXRWYWx1ZV91bmF2YWlsYWJsZSwhdClyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byB1cGRhdGUgbm9kZSBmb3IgdHJhY2s6ICIrdGhpcy5wYXRoKyIgYnV0IGl0IHdhc24ndCBmb3VuZC4iKTtpZihuKXtsZXQgaT1lLm9iamVjdEluZGV4O3N3aXRjaChuKXtjYXNlIm1hdGVyaWFscyI6aWYoIXQubWF0ZXJpYWwpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWwuIix0aGlzKTtpZighdC5tYXRlcmlhbC5tYXRlcmlhbHMpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwubWF0ZXJpYWxzIGFzIG5vZGUubWF0ZXJpYWwgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFscyBhcnJheS4iLHRoaXMpO3Q9dC5tYXRlcmlhbC5tYXRlcmlhbHM7YnJlYWs7Y2FzZSJib25lcyI6aWYoIXQuc2tlbGV0b24pcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gYm9uZXMgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgc2tlbGV0b24uIix0aGlzKTt0PXQuc2tlbGV0b24uYm9uZXM7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspaWYodFtlXS5uYW1lPT09aSl7aT1lO2JyZWFrfWJyZWFrO2RlZmF1bHQ6aWYodm9pZCAwPT09dFtuXSlyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBvYmplY3ROYW1lIG9mIG5vZGUgdW5kZWZpbmVkLiIsdGhpcyk7dD10W25dfWlmKHZvaWQgMCE9PWkpe2lmKHZvaWQgMD09PXRbaV0pcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gYmluZCB0byBvYmplY3RJbmRleCBvZiBvYmplY3ROYW1lLCBidXQgaXMgdW5kZWZpbmVkLiIsdGhpcyx0KTt0PXRbaV19fWNvbnN0IG89dFtpXTtpZih2b2lkIDA9PT1vKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIHVwZGF0ZSBwcm9wZXJ0eSBmb3IgdHJhY2s6ICIrZS5ub2RlTmFtZSsiLiIraSsiIGJ1dCBpdCB3YXNuJ3QgZm91bmQuIix0KTtsZXQgYT10aGlzLlZlcnNpb25pbmcuTm9uZTt0aGlzLnRhcmdldE9iamVjdD10LHZvaWQgMCE9PXQubmVlZHNVcGRhdGU/YT10aGlzLlZlcnNpb25pbmcuTmVlZHNVcGRhdGU6dm9pZCAwIT09dC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlJiYoYT10aGlzLlZlcnNpb25pbmcuTWF0cml4V29ybGROZWVkc1VwZGF0ZSk7bGV0IHM9dGhpcy5CaW5kaW5nVHlwZS5EaXJlY3Q7aWYodm9pZCAwIT09cil7aWYoIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyI9PT1pKXtpZighdC5nZW9tZXRyeSlyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS4iLHRoaXMpO2lmKCF0Lmdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIG9uIFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iLHRoaXMpO2lmKCF0Lmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcylyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuIix0aGlzKTt2b2lkIDAhPT10Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeVtyXSYmKHI9dC5tb3JwaFRhcmdldERpY3Rpb25hcnlbcl0pfXM9dGhpcy5CaW5kaW5nVHlwZS5BcnJheUVsZW1lbnQsdGhpcy5yZXNvbHZlZFByb3BlcnR5PW8sdGhpcy5wcm9wZXJ0eUluZGV4PXJ9ZWxzZSB2b2lkIDAhPT1vLmZyb21BcnJheSYmdm9pZCAwIT09by50b0FycmF5PyhzPXRoaXMuQmluZGluZ1R5cGUuSGFzRnJvbVRvQXJyYXksdGhpcy5yZXNvbHZlZFByb3BlcnR5PW8pOkFycmF5LmlzQXJyYXkobyk/KHM9dGhpcy5CaW5kaW5nVHlwZS5FbnRpcmVBcnJheSx0aGlzLnJlc29sdmVkUHJvcGVydHk9byk6dGhpcy5wcm9wZXJ0eU5hbWU9aTt0aGlzLmdldFZhbHVlPXRoaXMuR2V0dGVyQnlCaW5kaW5nVHlwZVtzXSx0aGlzLnNldFZhbHVlPXRoaXMuU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmdbc11bYV19dW5iaW5kKCl7dGhpcy5ub2RlPW51bGwsdGhpcy5nZXRWYWx1ZT10aGlzLl9nZXRWYWx1ZV91bmJvdW5kLHRoaXMuc2V0VmFsdWU9dGhpcy5fc2V0VmFsdWVfdW5ib3VuZH19aDh0LkNvbXBvc2l0ZT1jbGFzc3tjb25zdHJ1Y3Rvcih0LGUsbil7Y29uc3QgaT1ufHxoOHQucGFyc2VUcmFja05hbWUoZSk7dGhpcy5fdGFyZ2V0R3JvdXA9dCx0aGlzLl9iaW5kaW5ncz10LnN1YnNjcmliZV8oZSxpKX1nZXRWYWx1ZSh0LGUpe3RoaXMuYmluZCgpO2NvbnN0IG49dGhpcy5fYmluZGluZ3NbdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfXTt2b2lkIDAhPT1uJiZuLmdldFZhbHVlKHQsZSl9c2V0VmFsdWUodCxlKXtjb25zdCBuPXRoaXMuX2JpbmRpbmdzO2ZvcihsZXQgaT10aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18scj1uLmxlbmd0aDtpIT09cjsrK2kpbltpXS5zZXRWYWx1ZSh0LGUpfWJpbmQoKXtjb25zdCB0PXRoaXMuX2JpbmRpbmdzO2ZvcihsZXQgZT10aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sbj10Lmxlbmd0aDtlIT09bjsrK2UpdFtlXS5iaW5kKCl9dW5iaW5kKCl7Y29uc3QgdD10aGlzLl9iaW5kaW5ncztmb3IobGV0IGU9dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLG49dC5sZW5ndGg7ZSE9PW47KytlKXRbZV0udW5iaW5kKCl9fSxoOHQucHJvdG90eXBlLkJpbmRpbmdUeXBlPXtEaXJlY3Q6MCxFbnRpcmVBcnJheToxLEFycmF5RWxlbWVudDoyLEhhc0Zyb21Ub0FycmF5OjN9LGg4dC5wcm90b3R5cGUuVmVyc2lvbmluZz17Tm9uZTowLE5lZWRzVXBkYXRlOjEsTWF0cml4V29ybGROZWVkc1VwZGF0ZToyfSxoOHQucHJvdG90eXBlLkdldHRlckJ5QmluZGluZ1R5cGU9W2g4dC5wcm90b3R5cGUuX2dldFZhbHVlX2RpcmVjdCxoOHQucHJvdG90eXBlLl9nZXRWYWx1ZV9hcnJheSxoOHQucHJvdG90eXBlLl9nZXRWYWx1ZV9hcnJheUVsZW1lbnQsaDh0LnByb3RvdHlwZS5fZ2V0VmFsdWVfdG9BcnJheV0saDh0LnByb3RvdHlwZS5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZz1bW2g4dC5wcm90b3R5cGUuX3NldFZhbHVlX2RpcmVjdCxoOHQucHJvdG90eXBlLl9zZXRWYWx1ZV9kaXJlY3Rfc2V0TmVlZHNVcGRhdGUsaDh0LnByb3RvdHlwZS5fc2V0VmFsdWVfZGlyZWN0X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGVdLFtoOHQucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheSxoOHQucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheV9zZXROZWVkc1VwZGF0ZSxoOHQucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlXSxbaDh0LnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlFbGVtZW50LGg4dC5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5RWxlbWVudF9zZXROZWVkc1VwZGF0ZSxoOHQucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZV0sW2g4dC5wcm90b3R5cGUuX3NldFZhbHVlX2Zyb21BcnJheSxoOHQucHJvdG90eXBlLl9zZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TmVlZHNVcGRhdGUsaDh0LnByb3RvdHlwZS5fc2V0VmFsdWVfZnJvbUFycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGVdXTtjbGFzcyBkOHR7Y29uc3RydWN0b3IoKXt0aGlzLnV1aWQ9WFp0KCksdGhpcy5fb2JqZWN0cz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLHRoaXMubkNhY2hlZE9iamVjdHNfPTA7Y29uc3QgdD17fTt0aGlzLl9pbmRpY2VzQnlVVUlEPXQ7Zm9yKGxldCBlPTAsbj1hcmd1bWVudHMubGVuZ3RoO2UhPT1uOysrZSl0W2FyZ3VtZW50c1tlXS51dWlkXT1lO3RoaXMuX3BhdGhzPVtdLHRoaXMuX3BhcnNlZFBhdGhzPVtdLHRoaXMuX2JpbmRpbmdzPVtdLHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aD17fTtjb25zdCBlPXRoaXM7dGhpcy5zdGF0cz17b2JqZWN0czp7Z2V0IHRvdGFsKCl7cmV0dXJuIGUuX29iamVjdHMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gdGhpcy50b3RhbC1lLm5DYWNoZWRPYmplY3RzX319LGdldCBiaW5kaW5nc1Blck9iamVjdCgpe3JldHVybiBlLl9iaW5kaW5ncy5sZW5ndGh9fX1hZGQoKXtjb25zdCB0PXRoaXMuX29iamVjdHMsZT10aGlzLl9pbmRpY2VzQnlVVUlELG49dGhpcy5fcGF0aHMsaT10aGlzLl9wYXJzZWRQYXRocyxyPXRoaXMuX2JpbmRpbmdzLG89ci5sZW5ndGg7bGV0IGEscz10Lmxlbmd0aCxsPXRoaXMubkNhY2hlZE9iamVjdHNfO2ZvcihsZXQgYz0wLHU9YXJndW1lbnRzLmxlbmd0aDtjIT09dTsrK2Mpe2NvbnN0IHU9YXJndW1lbnRzW2NdLGg9dS51dWlkO2xldCBkPWVbaF07aWYodm9pZCAwPT09ZCl7ZD1zKyssZVtoXT1kLHQucHVzaCh1KTtmb3IobGV0IHQ9MCxlPW87dCE9PWU7Kyt0KXJbdF0ucHVzaChuZXcgaDh0KHUsblt0XSxpW3RdKSl9ZWxzZSBpZihkPGwpe2E9dFtkXTtjb25zdCBzPS0tbCxjPXRbc107ZVtjLnV1aWRdPWQsdFtkXT1jLGVbaF09cyx0W3NdPXU7Zm9yKGxldCB0PTAsZT1vO3QhPT1lOysrdCl7Y29uc3QgZT1yW3RdO2xldCBvPWVbZF07ZVtkXT1lW3NdLHZvaWQgMD09PW8mJihvPW5ldyBoOHQodSxuW3RdLGlbdF0pKSxlW3NdPW99fWVsc2UgdFtkXSE9PWEmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLkFuaW1hdGlvbk9iamVjdEdyb3VwOiBEaWZmZXJlbnQgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIFVVSUQgZGV0ZWN0ZWQuIENsZWFuIHRoZSBjYWNoZXMgb3IgcmVjcmVhdGUgeW91ciBpbmZyYXN0cnVjdHVyZSB3aGVuIHJlbG9hZGluZyBzY2VuZXMuIil9dGhpcy5uQ2FjaGVkT2JqZWN0c189bH1yZW1vdmUoKXtjb25zdCB0PXRoaXMuX29iamVjdHMsZT10aGlzLl9pbmRpY2VzQnlVVUlELG49dGhpcy5fYmluZGluZ3MsaT1uLmxlbmd0aDtsZXQgcj10aGlzLm5DYWNoZWRPYmplY3RzXztmb3IobGV0IG89MCxhPWFyZ3VtZW50cy5sZW5ndGg7byE9PWE7KytvKXtjb25zdCBhPWFyZ3VtZW50c1tvXSxzPWEudXVpZCxsPWVbc107aWYodm9pZCAwIT09bCYmbD49cil7Y29uc3Qgbz1yKyssYz10W29dO2VbYy51dWlkXT1sLHRbbF09YyxlW3NdPW8sdFtvXT1hO2ZvcihsZXQgdD0wLGU9aTt0IT09ZTsrK3Qpe2NvbnN0IGU9blt0XSxpPWVbbF07ZVtsXT1lW29dLGVbb109aX19fXRoaXMubkNhY2hlZE9iamVjdHNfPXJ9dW5jYWNoZSgpe2NvbnN0IHQ9dGhpcy5fb2JqZWN0cyxlPXRoaXMuX2luZGljZXNCeVVVSUQsbj10aGlzLl9iaW5kaW5ncyxpPW4ubGVuZ3RoO2xldCByPXRoaXMubkNhY2hlZE9iamVjdHNfLG89dC5sZW5ndGg7Zm9yKGxldCBhPTAscz1hcmd1bWVudHMubGVuZ3RoO2EhPT1zOysrYSl7Y29uc3Qgcz1hcmd1bWVudHNbYV0udXVpZCxsPWVbc107aWYodm9pZCAwIT09bClpZihkZWxldGUgZVtzXSxsPHIpe2NvbnN0IGE9LS1yLHM9dFthXSxjPS0tbyx1PXRbY107ZVtzLnV1aWRdPWwsdFtsXT1zLGVbdS51dWlkXT1hLHRbYV09dSx0LnBvcCgpO2ZvcihsZXQgdD0wLGU9aTt0IT09ZTsrK3Qpe2NvbnN0IGU9blt0XSxpPWVbY107ZVtsXT1lW2FdLGVbYV09aSxlLnBvcCgpfX1lbHNle2NvbnN0IHI9LS1vLGE9dFtyXTtyPjAmJihlW2EudXVpZF09bCksdFtsXT1hLHQucG9wKCk7Zm9yKGxldCB0PTAsZT1pO3QhPT1lOysrdCl7Y29uc3QgZT1uW3RdO2VbbF09ZVtyXSxlLnBvcCgpfX19dGhpcy5uQ2FjaGVkT2JqZWN0c189cn1zdWJzY3JpYmVfKHQsZSl7Y29uc3Qgbj10aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGg7bGV0IGk9blt0XTtjb25zdCByPXRoaXMuX2JpbmRpbmdzO2lmKHZvaWQgMCE9PWkpcmV0dXJuIHJbaV07Y29uc3Qgbz10aGlzLl9wYXRocyxhPXRoaXMuX3BhcnNlZFBhdGhzLHM9dGhpcy5fb2JqZWN0cyxsPXRoaXMubkNhY2hlZE9iamVjdHNfLGM9bmV3IEFycmF5KHMubGVuZ3RoKTtpPXIubGVuZ3RoLG5bdF09aSxvLnB1c2godCksYS5wdXNoKGUpLHIucHVzaChjKTtmb3IobGV0IG49bCxpPXMubGVuZ3RoO24hPT1pOysrbiljW25dPW5ldyBoOHQoc1tuXSx0LGUpO3JldHVybiBjfXVuc3Vic2NyaWJlXyh0KXtjb25zdCBlPXRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCxuPWVbdF07aWYodm9pZCAwIT09bil7Y29uc3QgaT10aGlzLl9wYXRocyxyPXRoaXMuX3BhcnNlZFBhdGhzLG89dGhpcy5fYmluZGluZ3MsYT1vLmxlbmd0aC0xLHM9b1thXTtlW3RbYV1dPW4sb1tuXT1zLG8ucG9wKCkscltuXT1yW2FdLHIucG9wKCksaVtuXT1pW2FdLGkucG9wKCl9fX1kOHQucHJvdG90eXBlLmlzQW5pbWF0aW9uT2JqZWN0R3JvdXA9ITA7Y2xhc3MgcDh0e2NvbnN0cnVjdG9yKHQsZSxuPW51bGwsaT1lLmJsZW5kTW9kZSl7dGhpcy5fbWl4ZXI9dCx0aGlzLl9jbGlwPWUsdGhpcy5fbG9jYWxSb290PW4sdGhpcy5ibGVuZE1vZGU9aTtjb25zdCByPWUudHJhY2tzLG89ci5sZW5ndGgsYT1uZXcgQXJyYXkobykscz17ZW5kaW5nU3RhcnQ6Q1p0LGVuZGluZ0VuZDpDWnR9O2ZvcihsZXQgdD0wO3QhPT1vOysrdCl7Y29uc3QgZT1yW3RdLmNyZWF0ZUludGVycG9sYW50KG51bGwpO2FbdF09ZSxlLnNldHRpbmdzPXN9dGhpcy5faW50ZXJwb2xhbnRTZXR0aW5ncz1zLHRoaXMuX2ludGVycG9sYW50cz1hLHRoaXMuX3Byb3BlcnR5QmluZGluZ3M9bmV3IEFycmF5KG8pLHRoaXMuX2NhY2hlSW5kZXg9bnVsbCx0aGlzLl9ieUNsaXBDYWNoZUluZGV4PW51bGwsdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ9bnVsbCx0aGlzLl93ZWlnaHRJbnRlcnBvbGFudD1udWxsLHRoaXMubG9vcD0yMjAxLHRoaXMuX2xvb3BDb3VudD0tMSx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLnRpbWU9MCx0aGlzLnRpbWVTY2FsZT0xLHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT0xLHRoaXMud2VpZ2h0PTEsdGhpcy5fZWZmZWN0aXZlV2VpZ2h0PTEsdGhpcy5yZXBldGl0aW9ucz0xLzAsdGhpcy5wYXVzZWQ9ITEsdGhpcy5lbmFibGVkPSEwLHRoaXMuY2xhbXBXaGVuRmluaXNoZWQ9ITEsdGhpcy56ZXJvU2xvcGVBdFN0YXJ0PSEwLHRoaXMuemVyb1Nsb3BlQXRFbmQ9ITB9cGxheSgpe3JldHVybiB0aGlzLl9taXhlci5fYWN0aXZhdGVBY3Rpb24odGhpcyksdGhpc31zdG9wKCl7cmV0dXJuIHRoaXMuX21peGVyLl9kZWFjdGl2YXRlQWN0aW9uKHRoaXMpLHRoaXMucmVzZXQoKX1yZXNldCgpe3JldHVybiB0aGlzLnBhdXNlZD0hMSx0aGlzLmVuYWJsZWQ9ITAsdGhpcy50aW1lPTAsdGhpcy5fbG9vcENvdW50PS0xLHRoaXMuX3N0YXJ0VGltZT1udWxsLHRoaXMuc3RvcEZhZGluZygpLnN0b3BXYXJwaW5nKCl9aXNSdW5uaW5nKCl7cmV0dXJuIHRoaXMuZW5hYmxlZCYmIXRoaXMucGF1c2VkJiYwIT09dGhpcy50aW1lU2NhbGUmJm51bGw9PT10aGlzLl9zdGFydFRpbWUmJnRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbih0aGlzKX1pc1NjaGVkdWxlZCgpe3JldHVybiB0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24odGhpcyl9c3RhcnRBdCh0KXtyZXR1cm4gdGhpcy5fc3RhcnRUaW1lPXQsdGhpc31zZXRMb29wKHQsZSl7cmV0dXJuIHRoaXMubG9vcD10LHRoaXMucmVwZXRpdGlvbnM9ZSx0aGlzfXNldEVmZmVjdGl2ZVdlaWdodCh0KXtyZXR1cm4gdGhpcy53ZWlnaHQ9dCx0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9dGhpcy5lbmFibGVkP3Q6MCx0aGlzLnN0b3BGYWRpbmcoKX1nZXRFZmZlY3RpdmVXZWlnaHQoKXtyZXR1cm4gdGhpcy5fZWZmZWN0aXZlV2VpZ2h0fWZhZGVJbih0KXtyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcodCwwLDEpfWZhZGVPdXQodCl7cmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKHQsMSwwKX1jcm9zc0ZhZGVGcm9tKHQsZSxuKXtpZih0LmZhZGVPdXQoZSksdGhpcy5mYWRlSW4oZSksbil7Y29uc3Qgbj10aGlzLl9jbGlwLmR1cmF0aW9uLGk9dC5fY2xpcC5kdXJhdGlvbixyPW4vaTt0LndhcnAoMSxpL24sZSksdGhpcy53YXJwKHIsMSxlKX1yZXR1cm4gdGhpc31jcm9zc0ZhZGVUbyh0LGUsbil7cmV0dXJuIHQuY3Jvc3NGYWRlRnJvbSh0aGlzLGUsbil9c3RvcEZhZGluZygpe2NvbnN0IHQ9dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7cmV0dXJuIG51bGwhPT10JiYodGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9bnVsbCx0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQodCkpLHRoaXN9c2V0RWZmZWN0aXZlVGltZVNjYWxlKHQpe3JldHVybiB0aGlzLnRpbWVTY2FsZT10LHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT10aGlzLnBhdXNlZD8wOnQsdGhpcy5zdG9wV2FycGluZygpfWdldEVmZmVjdGl2ZVRpbWVTY2FsZSgpe3JldHVybiB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGV9c2V0RHVyYXRpb24odCl7cmV0dXJuIHRoaXMudGltZVNjYWxlPXRoaXMuX2NsaXAuZHVyYXRpb24vdCx0aGlzLnN0b3BXYXJwaW5nKCl9c3luY1dpdGgodCl7cmV0dXJuIHRoaXMudGltZT10LnRpbWUsdGhpcy50aW1lU2NhbGU9dC50aW1lU2NhbGUsdGhpcy5zdG9wV2FycGluZygpfWhhbHQodCl7cmV0dXJuIHRoaXMud2FycCh0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUsMCx0KX13YXJwKHQsZSxuKXtjb25zdCBpPXRoaXMuX21peGVyLHI9aS50aW1lLG89dGhpcy50aW1lU2NhbGU7bGV0IGE9dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7bnVsbD09PWEmJihhPWkuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKSx0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudD1hKTtjb25zdCBzPWEucGFyYW1ldGVyUG9zaXRpb25zLGw9YS5zYW1wbGVWYWx1ZXM7cmV0dXJuIHNbMF09cixzWzFdPXIrbixsWzBdPXQvbyxsWzFdPWUvbyx0aGlzfXN0b3BXYXJwaW5nKCl7Y29uc3QgdD10aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtyZXR1cm4gbnVsbCE9PXQmJih0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudD1udWxsLHRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCh0KSksdGhpc31nZXRNaXhlcigpe3JldHVybiB0aGlzLl9taXhlcn1nZXRDbGlwKCl7cmV0dXJuIHRoaXMuX2NsaXB9Z2V0Um9vdCgpe3JldHVybiB0aGlzLl9sb2NhbFJvb3R8fHRoaXMuX21peGVyLl9yb290fV91cGRhdGUodCxlLG4saSl7aWYoIXRoaXMuZW5hYmxlZClyZXR1cm4gdm9pZCB0aGlzLl91cGRhdGVXZWlnaHQodCk7Y29uc3Qgcj10aGlzLl9zdGFydFRpbWU7aWYobnVsbCE9PXIpe2NvbnN0IGk9KHQtcikqbjtpZihpPDB8fDA9PT1uKXJldHVybjt0aGlzLl9zdGFydFRpbWU9bnVsbCxlPW4qaX1lKj10aGlzLl91cGRhdGVUaW1lU2NhbGUodCk7Y29uc3Qgbz10aGlzLl91cGRhdGVUaW1lKGUpLGE9dGhpcy5fdXBkYXRlV2VpZ2h0KHQpO2lmKGE+MCl7Y29uc3QgdD10aGlzLl9pbnRlcnBvbGFudHMsZT10aGlzLl9wcm9wZXJ0eUJpbmRpbmdzO3N3aXRjaCh0aGlzLmJsZW5kTW9kZSl7Y2FzZSBQWnQ6Zm9yKGxldCBuPTAsaT10Lmxlbmd0aDtuIT09aTsrK24pdFtuXS5ldmFsdWF0ZShvKSxlW25dLmFjY3VtdWxhdGVBZGRpdGl2ZShhKTticmVhaztjYXNlIExadDpkZWZhdWx0OmZvcihsZXQgbj0wLHI9dC5sZW5ndGg7biE9PXI7KytuKXRbbl0uZXZhbHVhdGUobyksZVtuXS5hY2N1bXVsYXRlKGksYSl9fX1fdXBkYXRlV2VpZ2h0KHQpe2xldCBlPTA7aWYodGhpcy5lbmFibGVkKXtlPXRoaXMud2VpZ2h0O2NvbnN0IG49dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7aWYobnVsbCE9PW4pe2NvbnN0IGk9bi5ldmFsdWF0ZSh0KVswXTtlKj1pLHQ+bi5wYXJhbWV0ZXJQb3NpdGlvbnNbMV0mJih0aGlzLnN0b3BGYWRpbmcoKSwwPT09aSYmKHRoaXMuZW5hYmxlZD0hMSkpfX1yZXR1cm4gdGhpcy5fZWZmZWN0aXZlV2VpZ2h0PWUsZX1fdXBkYXRlVGltZVNjYWxlKHQpe2xldCBlPTA7aWYoIXRoaXMucGF1c2VkKXtlPXRoaXMudGltZVNjYWxlO2NvbnN0IG49dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7bnVsbCE9PW4mJihlKj1uLmV2YWx1YXRlKHQpWzBdLHQ+bi5wYXJhbWV0ZXJQb3NpdGlvbnNbMV0mJih0aGlzLnN0b3BXYXJwaW5nKCksMD09PWU/dGhpcy5wYXVzZWQ9ITA6dGhpcy50aW1lU2NhbGU9ZSkpfXJldHVybiB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU9ZSxlfV91cGRhdGVUaW1lKHQpe2NvbnN0IGU9dGhpcy5fY2xpcC5kdXJhdGlvbixuPXRoaXMubG9vcDtsZXQgaT10aGlzLnRpbWUrdCxyPXRoaXMuX2xvb3BDb3VudDtjb25zdCBvPTIyMDI9PT1uO2lmKDA9PT10KXJldHVybi0xPT09cj9pOm8mJjE9PSgxJnIpP2UtaTppO2lmKDIyMDA9PT1uKXstMT09PXImJih0aGlzLl9sb29wQ291bnQ9MCx0aGlzLl9zZXRFbmRpbmdzKCEwLCEwLCExKSk7dDp7aWYoaT49ZSlpPWU7ZWxzZXtpZighKGk8MCkpe3RoaXMudGltZT1pO2JyZWFrIHR9aT0wfXRoaXMuY2xhbXBXaGVuRmluaXNoZWQ/dGhpcy5wYXVzZWQ9ITA6dGhpcy5lbmFibGVkPSExLHRoaXMudGltZT1pLHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImZpbmlzaGVkIixhY3Rpb246dGhpcyxkaXJlY3Rpb246dDwwPy0xOjF9KX19ZWxzZXtpZigtMT09PXImJih0Pj0wPyhyPTAsdGhpcy5fc2V0RW5kaW5ncyghMCwwPT09dGhpcy5yZXBldGl0aW9ucyxvKSk6dGhpcy5fc2V0RW5kaW5ncygwPT09dGhpcy5yZXBldGl0aW9ucywhMCxvKSksaT49ZXx8aTwwKXtjb25zdCBuPU1hdGguZmxvb3IoaS9lKTtpLT1lKm4scis9TWF0aC5hYnMobik7Y29uc3QgYT10aGlzLnJlcGV0aXRpb25zLXI7aWYoYTw9MCl0aGlzLmNsYW1wV2hlbkZpbmlzaGVkP3RoaXMucGF1c2VkPSEwOnRoaXMuZW5hYmxlZD0hMSxpPXQ+MD9lOjAsdGhpcy50aW1lPWksdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7dHlwZToiZmluaXNoZWQiLGFjdGlvbjp0aGlzLGRpcmVjdGlvbjp0PjA/MTotMX0pO2Vsc2V7aWYoMT09PWEpe2NvbnN0IGU9dDwwO3RoaXMuX3NldEVuZGluZ3MoZSwhZSxvKX1lbHNlIHRoaXMuX3NldEVuZGluZ3MoITEsITEsbyk7dGhpcy5fbG9vcENvdW50PXIsdGhpcy50aW1lPWksdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7dHlwZToibG9vcCIsYWN0aW9uOnRoaXMsbG9vcERlbHRhOm59KX19ZWxzZSB0aGlzLnRpbWU9aTtpZihvJiYxPT0oMSZyKSlyZXR1cm4gZS1pfXJldHVybiBpfV9zZXRFbmRpbmdzKHQsZSxuKXtjb25zdCBpPXRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M7bj8oaS5lbmRpbmdTdGFydD1BWnQsaS5lbmRpbmdFbmQ9QVp0KTooaS5lbmRpbmdTdGFydD10P3RoaXMuemVyb1Nsb3BlQXRTdGFydD9BWnQ6Q1p0OmtadCxpLmVuZGluZ0VuZD1lP3RoaXMuemVyb1Nsb3BlQXRFbmQ/QVp0OkNadDprWnQpfV9zY2hlZHVsZUZhZGluZyh0LGUsbil7Y29uc3QgaT10aGlzLl9taXhlcixyPWkudGltZTtsZXQgbz10aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtudWxsPT09byYmKG89aS5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpLHRoaXMuX3dlaWdodEludGVycG9sYW50PW8pO2NvbnN0IGE9by5wYXJhbWV0ZXJQb3NpdGlvbnMscz1vLnNhbXBsZVZhbHVlcztyZXR1cm4gYVswXT1yLHNbMF09ZSxhWzFdPXIrdCxzWzFdPW4sdGhpc319Y2xhc3MgZjh0IGV4dGVuZHMgalp0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5fcm9vdD10LHRoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCksdGhpcy5fYWNjdUluZGV4PTAsdGhpcy50aW1lPTAsdGhpcy50aW1lU2NhbGU9MX1fYmluZEFjdGlvbih0LGUpe2NvbnN0IG49dC5fbG9jYWxSb290fHx0aGlzLl9yb290LGk9dC5fY2xpcC50cmFja3Mscj1pLmxlbmd0aCxvPXQuX3Byb3BlcnR5QmluZGluZ3MsYT10Ll9pbnRlcnBvbGFudHMscz1uLnV1aWQsbD10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWU7bGV0IGM9bFtzXTt2b2lkIDA9PT1jJiYoYz17fSxsW3NdPWMpO2ZvcihsZXQgdD0wO3QhPT1yOysrdCl7Y29uc3Qgcj1pW3RdLGw9ci5uYW1lO2xldCB1PWNbbF07aWYodm9pZCAwIT09dSlvW3RdPXU7ZWxzZXtpZih1PW9bdF0sdm9pZCAwIT09dSl7bnVsbD09PXUuX2NhY2hlSW5kZXgmJigrK3UucmVmZXJlbmNlQ291bnQsdGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKHUscyxsKSk7Y29udGludWV9dT1uZXcgZTh0KGg4dC5jcmVhdGUobixsLGUmJmUuX3Byb3BlcnR5QmluZGluZ3NbdF0uYmluZGluZy5wYXJzZWRQYXRoKSxyLlZhbHVlVHlwZU5hbWUsci5nZXRWYWx1ZVNpemUoKSksKyt1LnJlZmVyZW5jZUNvdW50LHRoaXMuX2FkZEluYWN0aXZlQmluZGluZyh1LHMsbCksb1t0XT11fWFbdF0ucmVzdWx0QnVmZmVyPXUuYnVmZmVyfX1fYWN0aXZhdGVBY3Rpb24odCl7aWYoIXRoaXMuX2lzQWN0aXZlQWN0aW9uKHQpKXtpZihudWxsPT09dC5fY2FjaGVJbmRleCl7Y29uc3QgZT0odC5fbG9jYWxSb290fHx0aGlzLl9yb290KS51dWlkLG49dC5fY2xpcC51dWlkLGk9dGhpcy5fYWN0aW9uc0J5Q2xpcFtuXTt0aGlzLl9iaW5kQWN0aW9uKHQsaSYmaS5rbm93bkFjdGlvbnNbMF0pLHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKHQsbixlKX1jb25zdCBlPXQuX3Byb3BlcnR5QmluZGluZ3M7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aDt0IT09bjsrK3Qpe2NvbnN0IG49ZVt0XTswPT1uLnVzZUNvdW50KysmJih0aGlzLl9sZW5kQmluZGluZyhuKSxuLnNhdmVPcmlnaW5hbFN0YXRlKCkpfXRoaXMuX2xlbmRBY3Rpb24odCl9fV9kZWFjdGl2YXRlQWN0aW9uKHQpe2lmKHRoaXMuX2lzQWN0aXZlQWN0aW9uKHQpKXtjb25zdCBlPXQuX3Byb3BlcnR5QmluZGluZ3M7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aDt0IT09bjsrK3Qpe2NvbnN0IG49ZVt0XTswPT0tLW4udXNlQ291bnQmJihuLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCksdGhpcy5fdGFrZUJhY2tCaW5kaW5nKG4pKX10aGlzLl90YWtlQmFja0FjdGlvbih0KX19X2luaXRNZW1vcnlNYW5hZ2VyKCl7dGhpcy5fYWN0aW9ucz1bXSx0aGlzLl9uQWN0aXZlQWN0aW9ucz0wLHRoaXMuX2FjdGlvbnNCeUNsaXA9e30sdGhpcy5fYmluZGluZ3M9W10sdGhpcy5fbkFjdGl2ZUJpbmRpbmdzPTAsdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lPXt9LHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHM9W10sdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHM9MDtjb25zdCB0PXRoaXM7dGhpcy5zdGF0cz17YWN0aW9uczp7Z2V0IHRvdGFsKCl7cmV0dXJuIHQuX2FjdGlvbnMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gdC5fbkFjdGl2ZUFjdGlvbnN9fSxiaW5kaW5nczp7Z2V0IHRvdGFsKCl7cmV0dXJuIHQuX2JpbmRpbmdzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIHQuX25BY3RpdmVCaW5kaW5nc319LGNvbnRyb2xJbnRlcnBvbGFudHM6e2dldCB0b3RhbCgpe3JldHVybiB0Ll9jb250cm9sSW50ZXJwb2xhbnRzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIHQuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzfX19fV9pc0FjdGl2ZUFjdGlvbih0KXtjb25zdCBlPXQuX2NhY2hlSW5kZXg7cmV0dXJuIG51bGwhPT1lJiZlPHRoaXMuX25BY3RpdmVBY3Rpb25zfV9hZGRJbmFjdGl2ZUFjdGlvbih0LGUsbil7Y29uc3QgaT10aGlzLl9hY3Rpb25zLHI9dGhpcy5fYWN0aW9uc0J5Q2xpcDtsZXQgbz1yW2VdO2lmKHZvaWQgMD09PW8pbz17a25vd25BY3Rpb25zOlt0XSxhY3Rpb25CeVJvb3Q6e319LHQuX2J5Q2xpcENhY2hlSW5kZXg9MCxyW2VdPW87ZWxzZXtjb25zdCBlPW8ua25vd25BY3Rpb25zO3QuX2J5Q2xpcENhY2hlSW5kZXg9ZS5sZW5ndGgsZS5wdXNoKHQpfXQuX2NhY2hlSW5kZXg9aS5sZW5ndGgsaS5wdXNoKHQpLG8uYWN0aW9uQnlSb290W25dPXR9X3JlbW92ZUluYWN0aXZlQWN0aW9uKHQpe2NvbnN0IGU9dGhpcy5fYWN0aW9ucyxuPWVbZS5sZW5ndGgtMV0saT10Ll9jYWNoZUluZGV4O24uX2NhY2hlSW5kZXg9aSxlW2ldPW4sZS5wb3AoKSx0Ll9jYWNoZUluZGV4PW51bGw7Y29uc3Qgcj10Ll9jbGlwLnV1aWQsbz10aGlzLl9hY3Rpb25zQnlDbGlwLGE9b1tyXSxzPWEua25vd25BY3Rpb25zLGw9c1tzLmxlbmd0aC0xXSxjPXQuX2J5Q2xpcENhY2hlSW5kZXg7bC5fYnlDbGlwQ2FjaGVJbmRleD1jLHNbY109bCxzLnBvcCgpLHQuX2J5Q2xpcENhY2hlSW5kZXg9bnVsbCxkZWxldGUgYS5hY3Rpb25CeVJvb3RbKHQuX2xvY2FsUm9vdHx8dGhpcy5fcm9vdCkudXVpZF0sMD09PXMubGVuZ3RoJiZkZWxldGUgb1tyXSx0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKHQpfV9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKHQpe2NvbnN0IGU9dC5fcHJvcGVydHlCaW5kaW5ncztmb3IobGV0IHQ9MCxuPWUubGVuZ3RoO3QhPT1uOysrdCl7Y29uc3Qgbj1lW3RdOzA9PS0tbi5yZWZlcmVuY2VDb3VudCYmdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKG4pfX1fbGVuZEFjdGlvbih0KXtjb25zdCBlPXRoaXMuX2FjdGlvbnMsbj10Ll9jYWNoZUluZGV4LGk9dGhpcy5fbkFjdGl2ZUFjdGlvbnMrKyxyPWVbaV07dC5fY2FjaGVJbmRleD1pLGVbaV09dCxyLl9jYWNoZUluZGV4PW4sZVtuXT1yfV90YWtlQmFja0FjdGlvbih0KXtjb25zdCBlPXRoaXMuX2FjdGlvbnMsbj10Ll9jYWNoZUluZGV4LGk9LS10aGlzLl9uQWN0aXZlQWN0aW9ucyxyPWVbaV07dC5fY2FjaGVJbmRleD1pLGVbaV09dCxyLl9jYWNoZUluZGV4PW4sZVtuXT1yfV9hZGRJbmFjdGl2ZUJpbmRpbmcodCxlLG4pe2NvbnN0IGk9dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLHI9dGhpcy5fYmluZGluZ3M7bGV0IG89aVtlXTt2b2lkIDA9PT1vJiYobz17fSxpW2VdPW8pLG9bbl09dCx0Ll9jYWNoZUluZGV4PXIubGVuZ3RoLHIucHVzaCh0KX1fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKHQpe2NvbnN0IGU9dGhpcy5fYmluZGluZ3Msbj10LmJpbmRpbmcsaT1uLnJvb3ROb2RlLnV1aWQscj1uLnBhdGgsbz10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsYT1vW2ldLHM9ZVtlLmxlbmd0aC0xXSxsPXQuX2NhY2hlSW5kZXg7cy5fY2FjaGVJbmRleD1sLGVbbF09cyxlLnBvcCgpLGRlbGV0ZSBhW3JdLDA9PT1PYmplY3Qua2V5cyhhKS5sZW5ndGgmJmRlbGV0ZSBvW2ldfV9sZW5kQmluZGluZyh0KXtjb25zdCBlPXRoaXMuX2JpbmRpbmdzLG49dC5fY2FjaGVJbmRleCxpPXRoaXMuX25BY3RpdmVCaW5kaW5ncysrLHI9ZVtpXTt0Ll9jYWNoZUluZGV4PWksZVtpXT10LHIuX2NhY2hlSW5kZXg9bixlW25dPXJ9X3Rha2VCYWNrQmluZGluZyh0KXtjb25zdCBlPXRoaXMuX2JpbmRpbmdzLG49dC5fY2FjaGVJbmRleCxpPS0tdGhpcy5fbkFjdGl2ZUJpbmRpbmdzLHI9ZVtpXTt0Ll9jYWNoZUluZGV4PWksZVtpXT10LHIuX2NhY2hlSW5kZXg9bixlW25dPXJ9X2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKXtjb25zdCB0PXRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsZT10aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cysrO2xldCBuPXRbZV07cmV0dXJuIHZvaWQgMD09PW4mJihuPW5ldyBSNnQobmV3IEZsb2F0MzJBcnJheSgyKSxuZXcgRmxvYXQzMkFycmF5KDIpLDEsdGhpcy5fY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlciksbi5fX2NhY2hlSW5kZXg9ZSx0W2VdPW4pLG59X3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KHQpe2NvbnN0IGU9dGhpcy5fY29udHJvbEludGVycG9sYW50cyxuPXQuX19jYWNoZUluZGV4LGk9LS10aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyxyPWVbaV07dC5fX2NhY2hlSW5kZXg9aSxlW2ldPXQsci5fX2NhY2hlSW5kZXg9bixlW25dPXJ9Y2xpcEFjdGlvbih0LGUsbil7Y29uc3QgaT1lfHx0aGlzLl9yb290LHI9aS51dWlkO2xldCBvPSJzdHJpbmciPT10eXBlb2YgdD9HNnQuZmluZEJ5TmFtZShpLHQpOnQ7Y29uc3QgYT1udWxsIT09bz9vLnV1aWQ6dCxzPXRoaXMuX2FjdGlvbnNCeUNsaXBbYV07bGV0IGw9bnVsbDtpZih2b2lkIDA9PT1uJiYobj1udWxsIT09bz9vLmJsZW5kTW9kZTpMWnQpLHZvaWQgMCE9PXMpe2NvbnN0IHQ9cy5hY3Rpb25CeVJvb3Rbcl07aWYodm9pZCAwIT09dCYmdC5ibGVuZE1vZGU9PT1uKXJldHVybiB0O2w9cy5rbm93bkFjdGlvbnNbMF0sbnVsbD09PW8mJihvPWwuX2NsaXApfWlmKG51bGw9PT1vKXJldHVybiBudWxsO2NvbnN0IGM9bmV3IHA4dCh0aGlzLG8sZSxuKTtyZXR1cm4gdGhpcy5fYmluZEFjdGlvbihjLGwpLHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKGMsYSxyKSxjfWV4aXN0aW5nQWN0aW9uKHQsZSl7Y29uc3Qgbj1lfHx0aGlzLl9yb290LGk9bi51dWlkLHI9InN0cmluZyI9PXR5cGVvZiB0P0c2dC5maW5kQnlOYW1lKG4sdCk6dCxvPXRoaXMuX2FjdGlvbnNCeUNsaXBbcj9yLnV1aWQ6dF07cmV0dXJuIHZvaWQgMCE9PW8mJm8uYWN0aW9uQnlSb290W2ldfHxudWxsfXN0b3BBbGxBY3Rpb24oKXtjb25zdCB0PXRoaXMuX2FjdGlvbnM7Zm9yKGxldCBlPXRoaXMuX25BY3RpdmVBY3Rpb25zLTE7ZT49MDstLWUpdFtlXS5zdG9wKCk7cmV0dXJuIHRoaXN9dXBkYXRlKHQpe2NvbnN0IGU9dGhpcy5fYWN0aW9ucyxuPXRoaXMuX25BY3RpdmVBY3Rpb25zLGk9dGhpcy50aW1lKz10Kj10aGlzLnRpbWVTY2FsZSxyPU1hdGguc2lnbih0KSxvPXRoaXMuX2FjY3VJbmRleF49MTtmb3IobGV0IGE9MDthIT09bjsrK2EpZVthXS5fdXBkYXRlKGksdCxyLG8pO2NvbnN0IGE9dGhpcy5fYmluZGluZ3Mscz10aGlzLl9uQWN0aXZlQmluZGluZ3M7Zm9yKGxldCB0PTA7dCE9PXM7Kyt0KWFbdF0uYXBwbHkobyk7cmV0dXJuIHRoaXN9c2V0VGltZSh0KXt0aGlzLnRpbWU9MDtmb3IobGV0IHQ9MDt0PHRoaXMuX2FjdGlvbnMubGVuZ3RoO3QrKyl0aGlzLl9hY3Rpb25zW3RdLnRpbWU9MDtyZXR1cm4gdGhpcy51cGRhdGUodCl9Z2V0Um9vdCgpe3JldHVybiB0aGlzLl9yb290fXVuY2FjaGVDbGlwKHQpe2NvbnN0IGU9dGhpcy5fYWN0aW9ucyxuPXQudXVpZCxpPXRoaXMuX2FjdGlvbnNCeUNsaXAscj1pW25dO2lmKHZvaWQgMCE9PXIpe2NvbnN0IHQ9ci5rbm93bkFjdGlvbnM7Zm9yKGxldCBuPTAsaT10Lmxlbmd0aDtuIT09aTsrK24pe2NvbnN0IGk9dFtuXTt0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKGkpO2NvbnN0IHI9aS5fY2FjaGVJbmRleCxvPWVbZS5sZW5ndGgtMV07aS5fY2FjaGVJbmRleD1udWxsLGkuX2J5Q2xpcENhY2hlSW5kZXg9bnVsbCxvLl9jYWNoZUluZGV4PXIsZVtyXT1vLGUucG9wKCksdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbihpKX1kZWxldGUgaVtuXX19dW5jYWNoZVJvb3QodCl7Y29uc3QgZT10LnV1aWQsbj10aGlzLl9hY3Rpb25zQnlDbGlwO2Zvcihjb25zdCB0IGluIG4pe2NvbnN0IGk9blt0XS5hY3Rpb25CeVJvb3RbZV07dm9pZCAwIT09aSYmKHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oaSksdGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oaSkpfWNvbnN0IGk9dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lW2VdO2lmKHZvaWQgMCE9PWkpZm9yKGNvbnN0IHQgaW4gaSl7Y29uc3QgZT1pW3RdO2UucmVzdG9yZU9yaWdpbmFsU3RhdGUoKSx0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcoZSl9fXVuY2FjaGVBY3Rpb24odCxlKXtjb25zdCBuPXRoaXMuZXhpc3RpbmdBY3Rpb24odCxlKTtudWxsIT09biYmKHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24obiksdGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24obikpfX1mOHQucHJvdG90eXBlLl9jb250cm9sSW50ZXJwb2xhbnRzUmVzdWx0QnVmZmVyPW5ldyBGbG9hdDMyQXJyYXkoMSk7Y2xhc3MgbTh0e2NvbnN0cnVjdG9yKHQpeyJzdHJpbmciPT10eXBlb2YgdCYmKGNvbnNvbGUud2FybigiVEhSRUUuVW5pZm9ybTogVHlwZSBwYXJhbWV0ZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4iKSx0PWFyZ3VtZW50c1sxXSksdGhpcy52YWx1ZT10fWNsb25lKCl7cmV0dXJuIG5ldyBtOHQodm9pZCAwPT09dGhpcy52YWx1ZS5jbG9uZT90aGlzLnZhbHVlOnRoaXMudmFsdWUuY2xvbmUoKSl9fWNsYXNzIGc4dCBleHRlbmRzICQ1dHtjb25zdHJ1Y3Rvcih0LGUsbj0xKXtzdXBlcih0LGUpLHRoaXMubWVzaFBlckF0dHJpYnV0ZT1ufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5tZXNoUGVyQXR0cmlidXRlPXQubWVzaFBlckF0dHJpYnV0ZSx0aGlzfWNsb25lKHQpe2NvbnN0IGU9c3VwZXIuY2xvbmUodCk7cmV0dXJuIGUubWVzaFBlckF0dHJpYnV0ZT10aGlzLm1lc2hQZXJBdHRyaWJ1dGUsZX10b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcj0hMCxlLm1lc2hQZXJBdHRyaWJ1dGU9dGhpcy5tZXNoUGVyQXR0cmlidXRlLGV9fWc4dC5wcm90b3R5cGUuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcj0hMDtjbGFzcyBfOHR7Y29uc3RydWN0b3IodCxlLG4saSxyKXt0aGlzLmJ1ZmZlcj10LHRoaXMudHlwZT1lLHRoaXMuaXRlbVNpemU9bix0aGlzLmVsZW1lbnRTaXplPWksdGhpcy5jb3VudD1yLHRoaXMudmVyc2lvbj0wfXNldCBuZWVkc1VwZGF0ZSh0KXshMD09PXQmJnRoaXMudmVyc2lvbisrfXNldEJ1ZmZlcih0KXtyZXR1cm4gdGhpcy5idWZmZXI9dCx0aGlzfXNldFR5cGUodCxlKXtyZXR1cm4gdGhpcy50eXBlPXQsdGhpcy5lbGVtZW50U2l6ZT1lLHRoaXN9c2V0SXRlbVNpemUodCl7cmV0dXJuIHRoaXMuaXRlbVNpemU9dCx0aGlzfXNldENvdW50KHQpe3JldHVybiB0aGlzLmNvdW50PXQsdGhpc319ZnVuY3Rpb24geTh0KHQsZSl7cmV0dXJuIHQuZGlzdGFuY2UtZS5kaXN0YW5jZX1mdW5jdGlvbiB2OHQodCxlLG4saSl7aWYodC5sYXllcnMudGVzdChlLmxheWVycykmJnQucmF5Y2FzdChlLG4pLCEwPT09aSl7Y29uc3QgaT10LmNoaWxkcmVuO2ZvcihsZXQgdD0wLHI9aS5sZW5ndGg7dDxyO3QrKyl2OHQoaVt0XSxlLG4sITApfX1fOHQucHJvdG90eXBlLmlzR0xCdWZmZXJBdHRyaWJ1dGU9ITA7Y2xhc3MgYjh0e2NvbnN0cnVjdG9yKHQ9MSxlPTAsbj0wKXtyZXR1cm4gdGhpcy5yYWRpdXM9dCx0aGlzLnBoaT1lLHRoaXMudGhldGE9bix0aGlzfXNldCh0LGUsbil7cmV0dXJuIHRoaXMucmFkaXVzPXQsdGhpcy5waGk9ZSx0aGlzLnRoZXRhPW4sdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLnJhZGl1cz10LnJhZGl1cyx0aGlzLnBoaT10LnBoaSx0aGlzLnRoZXRhPXQudGhldGEsdGhpc31tYWtlU2FmZSgpe2NvbnN0IHQ9MWUtNjtyZXR1cm4gdGhpcy5waGk9TWF0aC5tYXgodCxNYXRoLm1pbihNYXRoLlBJLXQsdGhpcy5waGkpKSx0aGlzfXNldEZyb21WZWN0b3IzKHQpe3JldHVybiB0aGlzLnNldEZyb21DYXJ0ZXNpYW5Db29yZHModC54LHQueSx0LnopfXNldEZyb21DYXJ0ZXNpYW5Db29yZHModCxlLG4pe3JldHVybiB0aGlzLnJhZGl1cz1NYXRoLnNxcnQodCp0K2UqZStuKm4pLDA9PT10aGlzLnJhZGl1cz8odGhpcy50aGV0YT0wLHRoaXMucGhpPTApOih0aGlzLnRoZXRhPU1hdGguYXRhbjIodCxuKSx0aGlzLnBoaT1NYXRoLmFjb3MoJFp0KGUvdGhpcy5yYWRpdXMsLTEsMSkpKSx0aGlzfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfX1jb25zdCB4OHQ9bmV3IG1KdDtjbGFzcyB3OHR7Y29uc3RydWN0b3IodD1uZXcgbUp0KDEvMCwxLzApLGU9bmV3IG1KdCgtMS8wLC0xLzApKXt0aGlzLm1pbj10LHRoaXMubWF4PWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMubWluLmNvcHkodCksdGhpcy5tYXguY29weShlKSx0aGlzfXNldEZyb21Qb2ludHModCl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspdGhpcy5leHBhbmRCeVBvaW50KHRbZV0pO3JldHVybiB0aGlzfXNldEZyb21DZW50ZXJBbmRTaXplKHQsZSl7Y29uc3Qgbj14OHQuY29weShlKS5tdWx0aXBseVNjYWxhciguNSk7cmV0dXJuIHRoaXMubWluLmNvcHkodCkuc3ViKG4pLHRoaXMubWF4LmNvcHkodCkuYWRkKG4pLHRoaXN9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpc31tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5taW4ueD10aGlzLm1pbi55PTEvMCx0aGlzLm1heC54PXRoaXMubWF4Lnk9LTEvMCx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5tYXgueDx0aGlzLm1pbi54fHx0aGlzLm1heC55PHRoaXMubWluLnl9Z2V0Q2VudGVyKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDApOnQuYWRkVmVjdG9ycyh0aGlzLm1pbix0aGlzLm1heCkubXVsdGlwbHlTY2FsYXIoLjUpfWdldFNpemUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3Quc2V0KDAsMCk6dC5zdWJWZWN0b3JzKHRoaXMubWF4LHRoaXMubWluKX1leHBhbmRCeVBvaW50KHQpe3JldHVybiB0aGlzLm1pbi5taW4odCksdGhpcy5tYXgubWF4KHQpLHRoaXN9ZXhwYW5kQnlWZWN0b3IodCl7cmV0dXJuIHRoaXMubWluLnN1Yih0KSx0aGlzLm1heC5hZGQodCksdGhpc31leHBhbmRCeVNjYWxhcih0KXtyZXR1cm4gdGhpcy5taW4uYWRkU2NhbGFyKC10KSx0aGlzLm1heC5hZGRTY2FsYXIodCksdGhpc31jb250YWluc1BvaW50KHQpe3JldHVybiEodC54PHRoaXMubWluLnh8fHQueD50aGlzLm1heC54fHx0Lnk8dGhpcy5taW4ueXx8dC55PnRoaXMubWF4LnkpfWNvbnRhaW5zQm94KHQpe3JldHVybiB0aGlzLm1pbi54PD10Lm1pbi54JiZ0Lm1heC54PD10aGlzLm1heC54JiZ0aGlzLm1pbi55PD10Lm1pbi55JiZ0Lm1heC55PD10aGlzLm1heC55fWdldFBhcmFtZXRlcih0LGUpe3JldHVybiBlLnNldCgodC54LXRoaXMubWluLngpLyh0aGlzLm1heC54LXRoaXMubWluLngpLCh0LnktdGhpcy5taW4ueSkvKHRoaXMubWF4LnktdGhpcy5taW4ueSkpfWludGVyc2VjdHNCb3godCl7cmV0dXJuISh0Lm1heC54PHRoaXMubWluLnh8fHQubWluLng+dGhpcy5tYXgueHx8dC5tYXgueTx0aGlzLm1pbi55fHx0Lm1pbi55PnRoaXMubWF4LnkpfWNsYW1wUG9pbnQodCxlKXtyZXR1cm4gZS5jb3B5KHQpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KX1kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHg4dC5jb3B5KHQpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KS5zdWIodCkubGVuZ3RoKCl9aW50ZXJzZWN0KHQpe3JldHVybiB0aGlzLm1pbi5tYXgodC5taW4pLHRoaXMubWF4Lm1pbih0Lm1heCksdGhpc311bmlvbih0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQubWluKSx0aGlzLm1heC5tYXgodC5tYXgpLHRoaXN9dHJhbnNsYXRlKHQpe3JldHVybiB0aGlzLm1pbi5hZGQodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm1pbi5lcXVhbHModGhpcy5taW4pJiZ0Lm1heC5lcXVhbHModGhpcy5tYXgpfX13OHQucHJvdG90eXBlLmlzQm94Mj0hMDtjb25zdCBTOHQ9bmV3IENKdCxNOHQ9bmV3IENKdDtjbGFzcyBFOHR7Y29uc3RydWN0b3IodD1uZXcgQ0p0LGU9bmV3IENKdCl7dGhpcy5zdGFydD10LHRoaXMuZW5kPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMuc3RhcnQuY29weSh0KSx0aGlzLmVuZC5jb3B5KGUpLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5zdGFydC5jb3B5KHQuc3RhcnQpLHRoaXMuZW5kLmNvcHkodC5lbmQpLHRoaXN9Z2V0Q2VudGVyKHQpe3JldHVybiB0LmFkZFZlY3RvcnModGhpcy5zdGFydCx0aGlzLmVuZCkubXVsdGlwbHlTY2FsYXIoLjUpfWRlbHRhKHQpe3JldHVybiB0LnN1YlZlY3RvcnModGhpcy5lbmQsdGhpcy5zdGFydCl9ZGlzdGFuY2VTcSgpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuZW5kKX1kaXN0YW5jZSgpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG8odGhpcy5lbmQpfWF0KHQsZSl7cmV0dXJuIHRoaXMuZGVsdGEoZSkubXVsdGlwbHlTY2FsYXIodCkuYWRkKHRoaXMuc3RhcnQpfWNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIodCxlKXtTOHQuc3ViVmVjdG9ycyh0LHRoaXMuc3RhcnQpLE04dC5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpO2NvbnN0IG49TTh0LmRvdChNOHQpO2xldCBpPU04dC5kb3QoUzh0KS9uO3JldHVybiBlJiYoaT0kWnQoaSwwLDEpKSxpfWNsb3Nlc3RQb2ludFRvUG9pbnQodCxlLG4pe2NvbnN0IGk9dGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKHQsZSk7cmV0dXJuIHRoaXMuZGVsdGEobikubXVsdGlwbHlTY2FsYXIoaSkuYWRkKHRoaXMuc3RhcnQpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5zdGFydC5hcHBseU1hdHJpeDQodCksdGhpcy5lbmQuYXBwbHlNYXRyaXg0KHQpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0LnN0YXJ0LmVxdWFscyh0aGlzLnN0YXJ0KSYmdC5lbmQuZXF1YWxzKHRoaXMuZW5kKX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19Y2xhc3MgVDh0IGV4dGVuZHMga1F0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5tYXRlcmlhbD10LHRoaXMucmVuZGVyPWZ1bmN0aW9uKCl7fSx0aGlzLmhhc1Bvc2l0aW9ucz0hMSx0aGlzLmhhc05vcm1hbHM9ITEsdGhpcy5oYXNDb2xvcnM9ITEsdGhpcy5oYXNVdnM9ITEsdGhpcy5wb3NpdGlvbkFycmF5PW51bGwsdGhpcy5ub3JtYWxBcnJheT1udWxsLHRoaXMuY29sb3JBcnJheT1udWxsLHRoaXMudXZBcnJheT1udWxsLHRoaXMuY291bnQ9MH19VDh0LnByb3RvdHlwZS5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdD0hMDtjb25zdCBDOHQ9bmV3IENKdCxBOHQ9bmV3IENKdCxrOHQ9bmV3IHJRdCxMOHQ9bmV3IHJRdDtjbGFzcyBQOHQgZXh0ZW5kcyBVM3R7Y29uc3RydWN0b3IodCl7Y29uc3QgZT1OOHQodCksbj1uZXcgYjF0LGk9W10scj1bXSxvPW5ldyAkUXQoMCwwLDEpLGE9bmV3ICRRdCgwLDEsMCk7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2NvbnN0IG49ZVt0XTtuLnBhcmVudCYmbi5wYXJlbnQuaXNCb25lJiYoaS5wdXNoKDAsMCwwKSxpLnB1c2goMCwwLDApLHIucHVzaChvLnIsby5nLG8uYiksci5wdXNoKGEucixhLmcsYS5iKSl9bi5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KGksMykpLG4uc2V0QXR0cmlidXRlKCJjb2xvciIsbmV3IGwxdChyLDMpKSxzdXBlcihuLG5ldyBJM3Qoe3ZlcnRleENvbG9yczohMCxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSx0b25lTWFwcGVkOiExLHRyYW5zcGFyZW50OiEwfSkpLHRoaXMudHlwZT0iU2tlbGV0b25IZWxwZXIiLHRoaXMuaXNTa2VsZXRvbkhlbHBlcj0hMCx0aGlzLnJvb3Q9dCx0aGlzLmJvbmVzPWUsdGhpcy5tYXRyaXg9dC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITF9dXBkYXRlTWF0cml4V29ybGQodCl7Y29uc3QgZT10aGlzLmJvbmVzLG49dGhpcy5nZW9tZXRyeSxpPW4uZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO0w4dC5jb3B5KHRoaXMucm9vdC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCk7Zm9yKGxldCB0PTAsbj0wO3Q8ZS5sZW5ndGg7dCsrKXtjb25zdCByPWVbdF07ci5wYXJlbnQmJnIucGFyZW50LmlzQm9uZSYmKGs4dC5tdWx0aXBseU1hdHJpY2VzKEw4dCxyLm1hdHJpeFdvcmxkKSxBOHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGs4dCksaS5zZXRYWVoobixBOHQueCxBOHQueSxBOHQueiksazh0Lm11bHRpcGx5TWF0cmljZXMoTDh0LHIucGFyZW50Lm1hdHJpeFdvcmxkKSxBOHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGs4dCksaS5zZXRYWVoobisxLEE4dC54LEE4dC55LEE4dC56KSxuKz0yKX1uLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKS5uZWVkc1VwZGF0ZT0hMCxzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KX19ZnVuY3Rpb24gTjh0KHQpe2NvbnN0IGU9W107dCYmdC5pc0JvbmUmJmUucHVzaCh0KTtmb3IobGV0IG49MDtuPHQuY2hpbGRyZW4ubGVuZ3RoO24rKyllLnB1c2guYXBwbHkoZSxOOHQodC5jaGlsZHJlbltuXSkpO3JldHVybiBlfWNvbnN0IEk4dD1uZXcgQ0p0LFI4dD1uZXcgJFF0LE84dD1uZXcgJFF0O2NsYXNzIHo4dCBleHRlbmRzIFUzdHtjb25zdHJ1Y3Rvcih0PTEwLGU9MTAsbj00NDczOTI0LGk9ODk0Nzg0OCl7bj1uZXcgJFF0KG4pLGk9bmV3ICRRdChpKTtjb25zdCByPWUvMixvPXQvZSxhPXQvMixzPVtdLGw9W107Zm9yKGxldCB0PTAsYz0wLHU9LWE7dDw9ZTt0KyssdSs9byl7cy5wdXNoKC1hLDAsdSxhLDAsdSkscy5wdXNoKHUsMCwtYSx1LDAsYSk7Y29uc3QgZT10PT09cj9uOmk7ZS50b0FycmF5KGwsYyksYys9MyxlLnRvQXJyYXkobCxjKSxjKz0zLGUudG9BcnJheShsLGMpLGMrPTMsZS50b0FycmF5KGwsYyksYys9M31jb25zdCBjPW5ldyBiMXQ7Yy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KHMsMykpLGMuc2V0QXR0cmlidXRlKCJjb2xvciIsbmV3IGwxdChsLDMpKSxzdXBlcihjLG5ldyBJM3Qoe3ZlcnRleENvbG9yczohMCx0b25lTWFwcGVkOiExfSkpLHRoaXMudHlwZT0iR3JpZEhlbHBlciJ9fWNvbnN0IEQ4dD1uZXcgQ0p0LEI4dD1uZXcgQ0p0LEg4dD1uZXcgQ0p0LEY4dD1uZXcgQ0p0LFY4dD1uZXcgVzF0O2Z1bmN0aW9uIFU4dCh0LGUsbixpLHIsbyxhKXtGOHQuc2V0KHIsbyxhKS51bnByb2plY3QoaSk7Y29uc3Qgcz1lW3RdO2lmKHZvaWQgMCE9PXMpe2NvbnN0IHQ9bi5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7Zm9yKGxldCBlPTAsbj1zLmxlbmd0aDtlPG47ZSsrKXQuc2V0WFlaKHNbZV0sRjh0LngsRjh0LnksRjh0LnopfX1jb25zdCBqOHQ9bmV3IExKdDtjbGFzcyBHOHQgZXh0ZW5kcyBVM3R7Y29uc3RydWN0b3IodCxlPTE2Nzc2OTYwKXtjb25zdCBuPW5ldyBVaW50MTZBcnJheShbMCwxLDEsMiwyLDMsMywwLDQsNSw1LDYsNiw3LDcsNCwwLDQsMSw1LDIsNiwzLDddKSxpPW5ldyBGbG9hdDMyQXJyYXkoMjQpLHI9bmV3IGIxdDtyLnNldEluZGV4KG5ldyBRUXQobiwxKSksci5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgUVF0KGksMykpLHN1cGVyKHIsbmV3IEkzdCh7Y29sb3I6ZSx0b25lTWFwcGVkOiExfSkpLHRoaXMub2JqZWN0PXQsdGhpcy50eXBlPSJCb3hIZWxwZXIiLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLnVwZGF0ZSgpfXVwZGF0ZSh0KXtpZih2b2lkIDAhPT10JiZjb25zb2xlLndhcm4oIlRIUkVFLkJveEhlbHBlcjogLnVwZGF0ZSgpIGhhcyBubyBsb25nZXIgYXJndW1lbnRzLiIpLHZvaWQgMCE9PXRoaXMub2JqZWN0JiZqOHQuc2V0RnJvbU9iamVjdCh0aGlzLm9iamVjdCksajh0LmlzRW1wdHkoKSlyZXR1cm47Y29uc3QgZT1qOHQubWluLG49ajh0Lm1heCxpPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbixyPWkuYXJyYXk7clswXT1uLngsclsxXT1uLnksclsyXT1uLnosclszXT1lLngscls0XT1uLnkscls1XT1uLnoscls2XT1lLngscls3XT1lLnkscls4XT1uLnoscls5XT1uLngsclsxMF09ZS55LHJbMTFdPW4ueixyWzEyXT1uLngsclsxM109bi55LHJbMTRdPWUueixyWzE1XT1lLngsclsxNl09bi55LHJbMTddPWUueixyWzE4XT1lLngsclsxOV09ZS55LHJbMjBdPWUueixyWzIxXT1uLngsclsyMl09ZS55LHJbMjNdPWUueixpLm5lZWRzVXBkYXRlPSEwLHRoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl9c2V0RnJvbU9iamVjdCh0KXtyZXR1cm4gdGhpcy5vYmplY3Q9dCx0aGlzLnVwZGF0ZSgpLHRoaXN9Y29weSh0KXtyZXR1cm4gVTN0LnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyx0KSx0aGlzLm9iamVjdD10Lm9iamVjdCx0aGlzfX1jb25zdCBXOHQ9bmV3IENKdDtsZXQgcTh0LFk4dDtjbGFzcyBYOHQgZXh0ZW5kcyBVM3R7Y29uc3RydWN0b3IodD0xKXtjb25zdCBlPVswLDAsMCx0LDAsMCwwLDAsMCwwLHQsMCwwLDAsMCwwLDAsdF0sbj1uZXcgYjF0O24uc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGwxdChlLDMpKSxuLnNldEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBsMXQoWzEsMCwwLDEsLjYsMCwwLDEsMCwuNiwxLDAsMCwwLDEsMCwuNiwxXSwzKSksc3VwZXIobixuZXcgSTN0KHt2ZXJ0ZXhDb2xvcnM6ITAsdG9uZU1hcHBlZDohMX0pKSx0aGlzLnR5cGU9IkF4ZXNIZWxwZXIifXNldENvbG9ycyh0LGUsbil7Y29uc3QgaT1uZXcgJFF0LHI9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLmNvbG9yLmFycmF5O3JldHVybiBpLnNldCh0KSxpLnRvQXJyYXkociwwKSxpLnRvQXJyYXkociwzKSxpLnNldChlKSxpLnRvQXJyYXkociw2KSxpLnRvQXJyYXkociw5KSxpLnNldChuKSxpLnRvQXJyYXkociwxMiksaS50b0FycmF5KHIsMTUpLHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvci5uZWVkc1VwZGF0ZT0hMCx0aGlzfWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX19Y29uc3QgJDh0PW5ldyBGbG9hdDMyQXJyYXkoMSksSzh0PW5ldyBJbnQzMkFycmF5KCQ4dC5idWZmZXIpO2g0dC5jcmVhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gY29uc29sZS5sb2coIlRIUkVFLkN1cnZlLmNyZWF0ZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQiKSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGg0dC5wcm90b3R5cGUpLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXQsdC5wcm90b3R5cGUuZ2V0UG9pbnQ9ZSx0fSxpOXQucHJvdG90eXBlLmZyb21Qb2ludHM9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUGF0aDogLmZyb21Qb2ludHMoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tUG9pbnRzKCkuIiksdGhpcy5zZXRGcm9tUG9pbnRzKHQpfSx6OHQucHJvdG90eXBlLnNldENvbG9ycz1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkdyaWRIZWxwZXI6IHNldENvbG9ycygpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHBhc3MgdGhlbSBpbiB0aGUgY29uc3RydWN0b3IgaW5zdGVhZC4iKX0sUDh0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Ta2VsZXRvbkhlbHBlcjogdXBkYXRlKCkgbm8gbG9uZ2VyIG5lZWRzIHRvIGJlIGNhbGxlZC4iKX0sJDZ0LnByb3RvdHlwZS5leHRyYWN0VXJsQmFzZT1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5Mb2FkZXI6IC5leHRyYWN0VXJsQmFzZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5Mb2FkZXJVdGlscy5leHRyYWN0VXJsQmFzZSgpIGluc3RlYWQuIiksRTl0LmV4dHJhY3RVcmxCYXNlKHQpfSwkNnQuSGFuZGxlcnM9e2FkZDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkxvYWRlcjogSGFuZGxlcnMuYWRkKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIExvYWRpbmdNYW5hZ2VyLmFkZEhhbmRsZXIoKSBpbnN0ZWFkLiIpfSxnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Mb2FkZXI6IEhhbmRsZXJzLmdldCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBMb2FkaW5nTWFuYWdlci5nZXRIYW5kbGVyKCkgaW5zdGVhZC4iKX19LHc4dC5wcm90b3R5cGUuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4iKSx0aGlzLmdldENlbnRlcih0KX0sdzh0LnByb3RvdHlwZS5lbXB0eT1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5lbXB0eSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmlzRW1wdHkoKS4iKSx0aGlzLmlzRW1wdHkoKX0sdzh0LnByb3RvdHlwZS5pc0ludGVyc2VjdGlvbkJveD1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuIiksdGhpcy5pbnRlcnNlY3RzQm94KHQpfSx3OHQucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQm94MjogLnNpemUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRTaXplKCkuIiksdGhpcy5nZXRTaXplKHQpfSxMSnQucHJvdG90eXBlLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuIiksdGhpcy5nZXRDZW50ZXIodCl9LExKdC5wcm90b3R5cGUuZW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuIiksdGhpcy5pc0VtcHR5KCl9LExKdC5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb25Cb3g9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLiIpLHRoaXMuaW50ZXJzZWN0c0JveCh0KX0sTEp0LnByb3RvdHlwZS5pc0ludGVyc2VjdGlvblNwaGVyZT1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuaXNJbnRlcnNlY3Rpb25TcGhlcmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzU3BoZXJlKCkuIiksdGhpcy5pbnRlcnNlY3RzU3BoZXJlKHQpfSxMSnQucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQm94MzogLnNpemUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRTaXplKCkuIiksdGhpcy5nZXRTaXplKHQpfSwkSnQucHJvdG90eXBlLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuU3BoZXJlOiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuIiksdGhpcy5pc0VtcHR5KCl9LGkwdC5wcm90b3R5cGUuc2V0RnJvbU1hdHJpeD1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5GcnVzdHVtOiAuc2V0RnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21Qcm9qZWN0aW9uTWF0cml4KCkuIiksdGhpcy5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeCh0KX0sRTh0LnByb3RvdHlwZS5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuTGluZTM6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4iKSx0aGlzLmdldENlbnRlcih0KX0sZ0p0LnByb3RvdHlwZS5mbGF0dGVuVG9BcnJheU9mZnNldD1mdW5jdGlvbih0LGUpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDM6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuIiksdGhpcy50b0FycmF5KHQsZSl9LGdKdC5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4MyggbWF0cml4ICkgaW5zdGVhZC4iKSx0LmFwcGx5TWF0cml4Myh0aGlzKX0sZ0p0LnByb3RvdHlwZS5tdWx0aXBseVZlY3RvcjNBcnJheT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGdKdC5wcm90b3R5cGUuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZT1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXgzOiAuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBhdHRyaWJ1dGUuYXBwbHlNYXRyaXgzKCBtYXRyaXggKSBpbnN0ZWFkLiIpLHQuYXBwbHlNYXRyaXgzKHRoaXMpfSxnSnQucHJvdG90eXBlLmFwcGx5VG9WZWN0b3IzQXJyYXk9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXgzOiAuYXBwbHlUb1ZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGdKdC5wcm90b3R5cGUuZ2V0SW52ZXJzZT1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXgzOiAuZ2V0SW52ZXJzZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBtYXRyaXhJbnYuY29weSggbWF0cml4ICkuaW52ZXJ0KCk7IGluc3RlYWQuIiksdGhpcy5jb3B5KHQpLmludmVydCgpfSxyUXQucHJvdG90eXBlLmV4dHJhY3RQb3NpdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuZXh0cmFjdFBvc2l0aW9uKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY29weVBvc2l0aW9uKCkuIiksdGhpcy5jb3B5UG9zaXRpb24odCl9LHJRdC5wcm90b3R5cGUuZmxhdHRlblRvQXJyYXlPZmZzZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuZmxhdHRlblRvQXJyYXlPZmZzZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnRvQXJyYXkoKSBpbnN0ZWFkLiIpLHRoaXMudG9BcnJheSh0LGUpfSxyUXQucHJvdG90eXBlLmdldFBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmdldFBvc2l0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLiIpLChuZXcgQ0p0KS5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMyl9LHJRdC5wcm90b3R5cGUuc2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbj1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuc2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCkuIiksdGhpcy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KX0sclF0LnByb3RvdHlwZS5tdWx0aXBseVRvQXJyYXk9ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVRvQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyUXQucHJvdG90eXBlLm11bHRpcGx5VmVjdG9yMz1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuIiksdC5hcHBseU1hdHJpeDQodGhpcyl9LHJRdC5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3I0PWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjQoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4NCggbWF0cml4ICkgaW5zdGVhZC4iKSx0LmFwcGx5TWF0cml4NCh0aGlzKX0sclF0LnByb3RvdHlwZS5tdWx0aXBseVZlY3RvcjNBcnJheT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHJRdC5wcm90b3R5cGUucm90YXRlQXhpcz1mdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMudHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLiIpLHQudHJhbnNmb3JtRGlyZWN0aW9uKHRoaXMpfSxyUXQucHJvdG90eXBlLmNyb3NzVmVjdG9yPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5jcm9zc1ZlY3RvcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLiIpLHQuYXBwbHlNYXRyaXg0KHRoaXMpfSxyUXQucHJvdG90eXBlLnRyYW5zbGF0ZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyUXQucHJvdG90eXBlLnJvdGF0ZVg9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlWCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHJRdC5wcm90b3R5cGUucm90YXRlWT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVZKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sclF0LnByb3RvdHlwZS5yb3RhdGVaPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLnJvdGF0ZVooKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyUXQucHJvdG90eXBlLnJvdGF0ZUJ5QXhpcz1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVCeUF4aXMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyUXQucHJvdG90eXBlLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGU9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYXR0cmlidXRlLmFwcGx5TWF0cml4NCggbWF0cml4ICkgaW5zdGVhZC4iKSx0LmFwcGx5TWF0cml4NCh0aGlzKX0sclF0LnByb3RvdHlwZS5hcHBseVRvVmVjdG9yM0FycmF5PWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLmFwcGx5VG9WZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyUXQucHJvdG90eXBlLm1ha2VGcnVzdHVtPWZ1bmN0aW9uKHQsZSxuLGkscixvKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubWFrZUZydXN0dW0oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSBpbnN0ZWFkLiIpLHRoaXMubWFrZVBlcnNwZWN0aXZlKHQsZSxpLG4scixvKX0sclF0LnByb3RvdHlwZS5nZXRJbnZlcnNlPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5nZXRJbnZlcnNlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG1hdHJpeEludi5jb3B5KCBtYXRyaXggKS5pbnZlcnQoKTsgaW5zdGVhZC4iKSx0aGlzLmNvcHkodCkuaW52ZXJ0KCl9LHQwdC5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb25MaW5lPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlBsYW5lOiAuaXNJbnRlcnNlY3Rpb25MaW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0xpbmUoKS4iKSx0aGlzLmludGVyc2VjdHNMaW5lKHQpfSxUSnQucHJvdG90eXBlLm11bHRpcGx5VmVjdG9yMz1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGlzIG5vdyB2ZWN0b3IuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICkgaW5zdGVhZC4iKSx0LmFwcGx5UXVhdGVybmlvbih0aGlzKX0sVEp0LnByb3RvdHlwZS5pbnZlcnNlPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLmludmVyc2UoKSBoYXMgYmVlbiByZW5hbWVkIHRvIGludmVydCgpLiIpLHRoaXMuaW52ZXJ0KCl9LGlRdC5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb25Cb3g9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuIiksdGhpcy5pbnRlcnNlY3RzQm94KHQpfSxpUXQucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uUGxhbmU9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25QbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNQbGFuZSgpLiIpLHRoaXMuaW50ZXJzZWN0c1BsYW5lKHQpfSxpUXQucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uU3BoZXJlPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1NwaGVyZSgpLiIpLHRoaXMuaW50ZXJzZWN0c1NwaGVyZSh0KX0sRlF0LnByb3RvdHlwZS5hcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5hcmVhKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QXJlYSgpLiIpLHRoaXMuZ2V0QXJlYSgpfSxGUXQucHJvdG90eXBlLmJhcnljb29yZEZyb21Qb2ludD1mdW5jdGlvbih0LGUpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAuYmFyeWNvb3JkRnJvbVBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QmFyeWNvb3JkKCkuIiksdGhpcy5nZXRCYXJ5Y29vcmQodCxlKX0sRlF0LnByb3RvdHlwZS5taWRwb2ludD1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLm1pZHBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0TWlkcG9pbnQoKS4iKSx0aGlzLmdldE1pZHBvaW50KHQpfSxGUXQucHJvdG90eXBlbm9ybWFsPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAubm9ybWFsKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Tm9ybWFsKCkuIiksdGhpcy5nZXROb3JtYWwodCl9LEZRdC5wcm90b3R5cGUucGxhbmU9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5wbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFBsYW5lKCkuIiksdGhpcy5nZXRQbGFuZSh0KX0sRlF0LmJhcnljb29yZEZyb21Qb2ludD1mdW5jdGlvbih0LGUsbixpLHIpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAuYmFyeWNvb3JkRnJvbVBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QmFyeWNvb3JkKCkuIiksRlF0LmdldEJhcnljb29yZCh0LGUsbixpLHIpfSxGUXQubm9ybWFsPWZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAubm9ybWFsKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Tm9ybWFsKCkuIiksRlF0LmdldE5vcm1hbCh0LGUsbixpKX0scjl0LnByb3RvdHlwZS5leHRyYWN0QWxsUG9pbnRzPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlNoYXBlOiAuZXh0cmFjdEFsbFBvaW50cygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuZXh0cmFjdFBvaW50cygpIGluc3RlYWQuIiksdGhpcy5leHRyYWN0UG9pbnRzKHQpfSxyOXQucHJvdG90eXBlLmV4dHJ1ZGU9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuU2hhcGU6IC5leHRydWRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEV4dHJ1ZGVHZW9tZXRyeSgpIGluc3RlYWQuIiksbmV3IHI2dCh0aGlzLHQpfSxyOXQucHJvdG90eXBlLm1ha2VHZW9tZXRyeT1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5TaGFwZTogLm1ha2VHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBTaGFwZUdlb21ldHJ5KCkgaW5zdGVhZC4iKSxuZXcgaDZ0KHRoaXMsdCl9LG1KdC5wcm90b3R5cGUuZnJvbUF0dHJpYnV0ZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuIiksdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSxuKX0sbUp0LnByb3RvdHlwZS5kaXN0YW5jZVRvTWFuaGF0dGFuPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5kaXN0YW5jZVRvTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuRGlzdGFuY2VUbygpLiIpLHRoaXMubWFuaGF0dGFuRGlzdGFuY2VUbyh0KX0sbUp0LnByb3RvdHlwZS5sZW5ndGhNYW5oYXR0YW49ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiAubGVuZ3RoTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuTGVuZ3RoKCkuIiksdGhpcy5tYW5oYXR0YW5MZW5ndGgoKX0sQ0p0LnByb3RvdHlwZS5zZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeD1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlZlY3RvcjM6IC5zZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBpbnN0ZWFkLiIpfSxDSnQucHJvdG90eXBlLnNldEV1bGVyRnJvbVF1YXRlcm5pb249ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5WZWN0b3IzOiAuc2V0RXVsZXJGcm9tUXVhdGVybmlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUXVhdGVybmlvbigpIGluc3RlYWQuIil9LENKdC5wcm90b3R5cGUuZ2V0UG9zaXRpb25Gcm9tTWF0cml4PWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5nZXRQb3NpdGlvbkZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4UG9zaXRpb24oKS4iKSx0aGlzLnNldEZyb21NYXRyaXhQb3NpdGlvbih0KX0sQ0p0LnByb3RvdHlwZS5nZXRTY2FsZUZyb21NYXRyaXg9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmdldFNjYWxlRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhTY2FsZSgpLiIpLHRoaXMuc2V0RnJvbU1hdHJpeFNjYWxlKHQpfSxDSnQucHJvdG90eXBlLmdldENvbHVtbkZyb21NYXRyaXg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZ2V0Q29sdW1uRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhDb2x1bW4oKS4iKSx0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oZSx0KX0sQ0p0LnByb3RvdHlwZS5hcHBseVByb2plY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmFwcGx5UHJvamVjdGlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuYXBwbHlNYXRyaXg0KCBtICkgaW5zdGVhZC4iKSx0aGlzLmFwcGx5TWF0cml4NCh0KX0sQ0p0LnByb3RvdHlwZS5mcm9tQXR0cmlidXRlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKSx0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlLG4pfSxDSnQucHJvdG90eXBlLmRpc3RhbmNlVG9NYW5oYXR0YW49ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmRpc3RhbmNlVG9NYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5EaXN0YW5jZVRvKCkuIiksdGhpcy5tYW5oYXR0YW5EaXN0YW5jZVRvKHQpfSxDSnQucHJvdG90eXBlLmxlbmd0aE1hbmhhdHRhbj1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4iKSx0aGlzLm1hbmhhdHRhbkxlbmd0aCgpfSx3SnQucHJvdG90eXBlLmZyb21BdHRyaWJ1dGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpLHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUsbil9LHdKdC5wcm90b3R5cGUubGVuZ3RoTWFuaGF0dGFuPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yNDogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLiIpLHRoaXMubWFuaGF0dGFuTGVuZ3RoKCl9LGtRdC5wcm90b3R5cGUuZ2V0Q2hpbGRCeU5hbWU9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5nZXRDaGlsZEJ5TmFtZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE9iamVjdEJ5TmFtZSgpLiIpLHRoaXMuZ2V0T2JqZWN0QnlOYW1lKHQpfSxrUXQucHJvdG90eXBlLnJlbmRlckRlcHRoPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnJlbmRlckRlcHRoIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAucmVuZGVyT3JkZXIsIGluc3RlYWQuIil9LGtRdC5wcm90b3R5cGUudHJhbnNsYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKSBpbnN0ZWFkLiIpLHRoaXMudHJhbnNsYXRlT25BeGlzKGUsdCl9LGtRdC5wcm90b3R5cGUuZ2V0V29ybGRSb3RhdGlvbj1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRSb3RhdGlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5PYmplY3QzRC5nZXRXb3JsZFF1YXRlcm5pb24oIHRhcmdldCApIGluc3RlYWQuIil9LGtRdC5wcm90b3R5cGUuYXBwbHlNYXRyaXg9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5hcHBseU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmFwcGx5TWF0cml4NCgpLiIpLHRoaXMuYXBwbHlNYXRyaXg0KHQpfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhrUXQucHJvdG90eXBlLHtldWxlck9yZGVyOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmV1bGVyT3JkZXIgaXMgbm93IC5yb3RhdGlvbi5vcmRlci4iKSx0aGlzLnJvdGF0aW9uLm9yZGVyfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmV1bGVyT3JkZXIgaXMgbm93IC5yb3RhdGlvbi5vcmRlci4iKSx0aGlzLnJvdGF0aW9uLm9yZGVyPXR9fSx1c2VRdWF0ZXJuaW9uOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAudXNlUXVhdGVybmlvbiBoYXMgYmVlbiByZW1vdmVkLiBUaGUgbGlicmFyeSBub3cgdXNlcyBxdWF0ZXJuaW9ucyBieSBkZWZhdWx0LiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAudXNlUXVhdGVybmlvbiBoYXMgYmVlbiByZW1vdmVkLiBUaGUgbGlicmFyeSBub3cgdXNlcyBxdWF0ZXJuaW9ucyBieSBkZWZhdWx0LiIpfX19KSxCMXQucHJvdG90eXBlLnNldERyYXdNb2RlPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWVzaDogLnNldERyYXdNb2RlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIHJlbmRlcmVyIG5vdyBhbHdheXMgYXNzdW1lcyBUSFJFRS5UcmlhbmdsZXNEcmF3TW9kZS4gVHJhbnNmb3JtIHlvdXIgZ2VvbWV0cnkgdmlhIEJ1ZmZlckdlb21ldHJ5VXRpbHMudG9UcmlhbmdsZXNEcmF3TW9kZSgpIGlmIG5lY2Vzc2FyeS4iKX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQjF0LnByb3RvdHlwZSx7ZHJhd01vZGU6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5NZXNoOiAuZHJhd01vZGUgaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIHJlbmRlcmVyIG5vdyBhbHdheXMgYXNzdW1lcyBUSFJFRS5UcmlhbmdsZXNEcmF3TW9kZS4iKSwwfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NZXNoOiAuZHJhd01vZGUgaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIHJlbmRlcmVyIG5vdyBhbHdheXMgYXNzdW1lcyBUSFJFRS5UcmlhbmdsZXNEcmF3TW9kZS4gVHJhbnNmb3JtIHlvdXIgZ2VvbWV0cnkgdmlhIEJ1ZmZlckdlb21ldHJ5VXRpbHMudG9UcmlhbmdsZXNEcmF3TW9kZSgpIGlmIG5lY2Vzc2FyeS4iKX19fSksdzN0LnByb3RvdHlwZS5pbml0Qm9uZXM9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Ta2lubmVkTWVzaDogaW5pdEJvbmVzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0scTF0LnByb3RvdHlwZS5zZXRMZW5zPWZ1bmN0aW9uKHQsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYS5zZXRMZW5zIGlzIGRlcHJlY2F0ZWQuIFVzZSAuc2V0Rm9jYWxMZW5ndGggYW5kIC5maWxtR2F1Z2UgZm9yIGEgcGhvdG9ncmFwaGljIHNldHVwLiIpLHZvaWQgMCE9PWUmJih0aGlzLmZpbG1HYXVnZT1lKSx0aGlzLnNldEZvY2FsTGVuZ3RoKHQpfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvOXQucHJvdG90eXBlLHtvbmx5U2hhZG93OntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAub25seVNoYWRvdyBoYXMgYmVlbiByZW1vdmVkLiIpfX0sc2hhZG93Q2FtZXJhRm92OntzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUZvdiBpcyBub3cgLnNoYWRvdy5jYW1lcmEuZm92LiIpLHRoaXMuc2hhZG93LmNhbWVyYS5mb3Y9dH19LHNoYWRvd0NhbWVyYUxlZnQ6e3NldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhTGVmdCBpcyBub3cgLnNoYWRvdy5jYW1lcmEubGVmdC4iKSx0aGlzLnNoYWRvdy5jYW1lcmEubGVmdD10fX0sc2hhZG93Q2FtZXJhUmlnaHQ6e3NldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhUmlnaHQgaXMgbm93IC5zaGFkb3cuY2FtZXJhLnJpZ2h0LiIpLHRoaXMuc2hhZG93LmNhbWVyYS5yaWdodD10fX0sc2hhZG93Q2FtZXJhVG9wOntzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVRvcCBpcyBub3cgLnNoYWRvdy5jYW1lcmEudG9wLiIpLHRoaXMuc2hhZG93LmNhbWVyYS50b3A9dH19LHNoYWRvd0NhbWVyYUJvdHRvbTp7c2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFCb3R0b20gaXMgbm93IC5zaGFkb3cuY2FtZXJhLmJvdHRvbS4iKSx0aGlzLnNoYWRvdy5jYW1lcmEuYm90dG9tPXR9fSxzaGFkb3dDYW1lcmFOZWFyOntzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYU5lYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLm5lYXIuIiksdGhpcy5zaGFkb3cuY2FtZXJhLm5lYXI9dH19LHNoYWRvd0NhbWVyYUZhcjp7c2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZhci4iKSx0aGlzLnNoYWRvdy5jYW1lcmEuZmFyPXR9fSxzaGFkb3dDYW1lcmFWaXNpYmxlOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVmlzaWJsZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkNhbWVyYUhlbHBlciggbGlnaHQuc2hhZG93LmNhbWVyYSApIGluc3RlYWQuIil9fSxzaGFkb3dCaWFzOntzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0JpYXMgaXMgbm93IC5zaGFkb3cuYmlhcy4iKSx0aGlzLnNoYWRvdy5iaWFzPXR9fSxzaGFkb3dEYXJrbmVzczp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0RhcmtuZXNzIGhhcyBiZWVuIHJlbW92ZWQuIil9fSxzaGFkb3dNYXBXaWR0aDp7c2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBXaWR0aCBpcyBub3cgLnNoYWRvdy5tYXBTaXplLndpZHRoLiIpLHRoaXMuc2hhZG93Lm1hcFNpemUud2lkdGg9dH19LHNoYWRvd01hcEhlaWdodDp7c2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBIZWlnaHQgaXMgbm93IC5zaGFkb3cubWFwU2l6ZS5oZWlnaHQuIiksdGhpcy5zaGFkb3cubWFwU2l6ZS5oZWlnaHQ9dH19fSksT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUVF0LnByb3RvdHlwZSx7bGVuZ3RoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5sZW5ndGggaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5jb3VudCBpbnN0ZWFkLiIpLHRoaXMuYXJyYXkubGVuZ3RofX0sZHluYW1pYzp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAuZHluYW1pYyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnVzYWdlIGluc3RlYWQuIiksdGhpcy51c2FnZT09PVZadH0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5keW5hbWljIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudXNhZ2UgaW5zdGVhZC4iKSx0aGlzLnNldFVzYWdlKFZadCl9fX0pLFFRdC5wcm90b3R5cGUuc2V0RHluYW1pYz1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5zZXREeW5hbWljKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5zZXRVc2FnZSgpIGluc3RlYWQuIiksdGhpcy5zZXRVc2FnZSghMD09PXQ/Vlp0OkZadCksdGhpc30sUVF0LnByb3RvdHlwZS5jb3B5SW5kaWNlc0FycmF5PWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAuY29weUluZGljZXNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LFFRdC5wcm90b3R5cGUuc2V0QXJyYXk9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5zZXRBcnJheSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgQnVmZmVyR2VvbWV0cnkgLnNldEF0dHJpYnV0ZSB0byByZXBsYWNlL3Jlc2l6ZSBhdHRyaWJ1dGUgYnVmZmVycyIpfSxiMXQucHJvdG90eXBlLmFkZEluZGV4PWZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRJbmRleCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEluZGV4KCkuIiksdGhpcy5zZXRJbmRleCh0KX0sYjF0LnByb3RvdHlwZS5hZGRBdHRyaWJ1dGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZEF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEF0dHJpYnV0ZSgpLiIpLGUmJmUuaXNCdWZmZXJBdHRyaWJ1dGV8fGUmJmUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZT8iaW5kZXgiPT09dD8oY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS5hZGRBdHRyaWJ1dGU6IFVzZSAuc2V0SW5kZXgoKSBmb3IgaW5kZXggYXR0cmlidXRlLiIpLHRoaXMuc2V0SW5kZXgoZSksdGhpcyk6dGhpcy5zZXRBdHRyaWJ1dGUodCxlKTooY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZEF0dHJpYnV0ZSgpIG5vdyBleHBlY3RzICggbmFtZSwgYXR0cmlidXRlICkuIiksdGhpcy5zZXRBdHRyaWJ1dGUodCxuZXcgUVF0KGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pKSl9LGIxdC5wcm90b3R5cGUuYWRkRHJhd0NhbGw9ZnVuY3Rpb24odCxlLG4pe3ZvaWQgMCE9PW4mJmNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGREcmF3Q2FsbCgpIG5vIGxvbmdlciBzdXBwb3J0cyBpbmRleE9mZnNldC4iKSxjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkRHJhd0NhbGwoKSBpcyBub3cgLmFkZEdyb3VwKCkuIiksdGhpcy5hZGRHcm91cCh0LGUpfSxiMXQucHJvdG90eXBlLmNsZWFyRHJhd0NhbGxzPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNsZWFyRHJhd0NhbGxzKCkgaXMgbm93IC5jbGVhckdyb3VwcygpLiIpLHRoaXMuY2xlYXJHcm91cHMoKX0sYjF0LnByb3RvdHlwZS5jb21wdXRlT2Zmc2V0cz1mdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlT2Zmc2V0cygpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGIxdC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAucmVtb3ZlQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZGVsZXRlQXR0cmlidXRlKCkuIiksdGhpcy5kZWxldGVBdHRyaWJ1dGUodCl9LGIxdC5wcm90b3R5cGUuYXBwbHlNYXRyaXg9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hcHBseU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmFwcGx5TWF0cml4NCgpLiIpLHRoaXMuYXBwbHlNYXRyaXg0KHQpfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhiMXQucHJvdG90eXBlLHtkcmF3Y2FsbHM6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmRyYXdjYWxscyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuIiksdGhpcy5ncm91cHN9fSxvZmZzZXRzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLm9mZnNldHMgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ3JvdXBzLiIpLHRoaXMuZ3JvdXBzfX19KSwkNXQucHJvdG90eXBlLnNldER5bmFtaWM9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuSW50ZXJsZWF2ZWRCdWZmZXI6IC5zZXREeW5hbWljKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5zZXRVc2FnZSgpIGluc3RlYWQuIiksdGhpcy5zZXRVc2FnZSghMD09PXQ/Vlp0OkZadCksdGhpc30sJDV0LnByb3RvdHlwZS5zZXRBcnJheT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkludGVybGVhdmVkQnVmZmVyOiAuc2V0QXJyYXkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEJ1ZmZlckdlb21ldHJ5IC5zZXRBdHRyaWJ1dGUgdG8gcmVwbGFjZS9yZXNpemUgYXR0cmlidXRlIGJ1ZmZlcnMiKX0scjZ0LnByb3RvdHlwZS5nZXRBcnJheXM9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlR2VvbWV0cnk6IC5nZXRBcnJheXMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyNnQucHJvdG90eXBlLmFkZFNoYXBlTGlzdD1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogLmFkZFNoYXBlTGlzdCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHI2dC5wcm90b3R5cGUuYWRkU2hhcGU9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlR2VvbWV0cnk6IC5hZGRTaGFwZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LFg1dC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNjZW5lOiAuZGlzcG9zZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LG04dC5wcm90b3R5cGUub25VcGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5Vbmlmb3JtOiAub25VcGRhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4iKSx0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhVUXQucHJvdG90eXBlLHt3cmFwQXJvdW5kOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLiIpfX0sb3ZlcmRyYXc6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6IC5vdmVyZHJhdyBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAub3ZlcmRyYXcgaGFzIGJlZW4gcmVtb3ZlZC4iKX19LHdyYXBSR0I6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcFJHQiBoYXMgYmVlbiByZW1vdmVkLiIpLG5ldyAkUXR9fSxzaGFkaW5nOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS4iK3RoaXMudHlwZSsiOiAuc2hhZGluZyBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdGhlIGJvb2xlYW4gLmZsYXRTaGFkaW5nIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLiIrdGhpcy50eXBlKyI6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4iKSx0aGlzLmZsYXRTaGFkaW5nPTE9PT10fX0sc3RlbmNpbE1hc2s6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLiIrdGhpcy50eXBlKyI6IC5zdGVuY2lsTWFzayBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnN0ZW5jaWxGdW5jTWFzayBpbnN0ZWFkLiIpLHRoaXMuc3RlbmNpbEZ1bmNNYXNrfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS4iK3RoaXMudHlwZSsiOiAuc3RlbmNpbE1hc2sgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5zdGVuY2lsRnVuY01hc2sgaW5zdGVhZC4iKSx0aGlzLnN0ZW5jaWxGdW5jTWFzaz10fX0sdmVydGV4VGFuZ2VudHM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnZlcnRleFRhbmdlbnRzIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnZlcnRleFRhbmdlbnRzIGhhcyBiZWVuIHJlbW92ZWQuIil9fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEcxdC5wcm90b3R5cGUse2Rlcml2YXRpdmVzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5TaGFkZXJNYXRlcmlhbDogLmRlcml2YXRpdmVzIGhhcyBiZWVuIG1vdmVkIHRvIC5leHRlbnNpb25zLmRlcml2YXRpdmVzLiIpLHRoaXMuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlc30sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuIFNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuIiksdGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzPXR9fX0pLEc1dC5wcm90b3R5cGUuY2xlYXJUYXJnZXQ9ZnVuY3Rpb24odCxlLG4saSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuY2xlYXJUYXJnZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnNldFJlbmRlclRhcmdldCgpIGFuZCAuY2xlYXIoKSBpbnN0ZWFkLiIpLHRoaXMuc2V0UmVuZGVyVGFyZ2V0KHQpLHRoaXMuY2xlYXIoZSxuLGkpfSxHNXQucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYW5pbWF0ZSgpIGlzIG5vdyAuc2V0QW5pbWF0aW9uTG9vcCgpLiIpLHRoaXMuc2V0QW5pbWF0aW9uTG9vcCh0KX0sRzV0LnByb3RvdHlwZS5nZXRDdXJyZW50UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldEN1cnJlbnRSZW5kZXJUYXJnZXQoKSBpcyBub3cgLmdldFJlbmRlclRhcmdldCgpLiIpLHRoaXMuZ2V0UmVuZGVyVGFyZ2V0KCl9LEc1dC5wcm90b3R5cGUuZ2V0TWF4QW5pc290cm9weT1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRNYXhBbmlzb3Ryb3B5KCkgaXMgbm93IC5jYXBhYmlsaXRpZXMuZ2V0TWF4QW5pc290cm9weSgpLiIpLHRoaXMuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKX0sRzV0LnByb3RvdHlwZS5nZXRQcmVjaXNpb249ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0UHJlY2lzaW9uKCkgaXMgbm93IC5jYXBhYmlsaXRpZXMucHJlY2lzaW9uLiIpLHRoaXMuY2FwYWJpbGl0aWVzLnByZWNpc2lvbn0sRzV0LnByb3RvdHlwZS5yZXNldEdMU3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAucmVzZXRHTFN0YXRlKCkgaXMgbm93IC5zdGF0ZS5yZXNldCgpLiIpLHRoaXMuc3RhdGUucmVzZXQoKX0sRzV0LnByb3RvdHlwZS5zdXBwb3J0c0Zsb2F0VGV4dHVyZXM9ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApLiIpLHRoaXMuZXh0ZW5zaW9ucy5nZXQoIk9FU190ZXh0dXJlX2Zsb2F0Iil9LEc1dC5wcm90b3R5cGUuc3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlcz1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0hhbGZGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnICkuIiksdGhpcy5leHRlbnNpb25zLmdldCgiT0VTX3RleHR1cmVfaGFsZl9mbG9hdCIpfSxHNXQucHJvdG90eXBlLnN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlcz1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyApLiIpLHRoaXMuZXh0ZW5zaW9ucy5nZXQoIk9FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyIpfSxHNXQucHJvdG90eXBlLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApLiIpLHRoaXMuZXh0ZW5zaW9ucy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil9LEc1dC5wcm90b3R5cGUuc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICkuIiksdGhpcy5leHRlbnNpb25zLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIil9LEc1dC5wcm90b3R5cGUuc3VwcG9ydHNCbGVuZE1pbk1heD1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0JsZW5kTWluTWF4KCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICkuIiksdGhpcy5leHRlbnNpb25zLmdldCgiRVhUX2JsZW5kX21pbm1heCIpfSxHNXQucHJvdG90eXBlLnN1cHBvcnRzVmVydGV4VGV4dHVyZXM9ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcygpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzLiIpLHRoaXMuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzfSxHNXQucHJvdG90eXBlLnN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICkuIiksdGhpcy5leHRlbnNpb25zLmdldCgiQU5HTEVfaW5zdGFuY2VkX2FycmF5cyIpfSxHNXQucHJvdG90eXBlLmVuYWJsZVNjaXNzb3JUZXN0PWZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmVuYWJsZVNjaXNzb3JUZXN0KCkgaXMgbm93IC5zZXRTY2lzc29yVGVzdCgpLiIpLHRoaXMuc2V0U2Npc3NvclRlc3QodCl9LEc1dC5wcm90b3R5cGUuaW5pdE1hdGVyaWFsPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuaW5pdE1hdGVyaWFsKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sRzV0LnByb3RvdHlwZS5hZGRQcmVQbHVnaW49ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQcmVQbHVnaW4oKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxHNXQucHJvdG90eXBlLmFkZFBvc3RQbHVnaW49ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQb3N0UGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sRzV0LnByb3RvdHlwZS51cGRhdGVTaGFkb3dNYXA9ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC51cGRhdGVTaGFkb3dNYXAoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxHNXQucHJvdG90eXBlLnNldEZhY2VDdWxsaW5nPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0RmFjZUN1bGxpbmcoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxHNXQucHJvdG90eXBlLmFsbG9jVGV4dHVyZVVuaXQ9ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5hbGxvY1RleHR1cmVVbml0KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sRzV0LnByb3RvdHlwZS5zZXRUZXh0dXJlPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LEc1dC5wcm90b3R5cGUuc2V0VGV4dHVyZTJEPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZTJEKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sRzV0LnByb3RvdHlwZS5zZXRUZXh0dXJlQ3ViZT1mdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldFRleHR1cmVDdWJlKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sRzV0LnByb3RvdHlwZS5nZXRBY3RpdmVNaXBNYXBMZXZlbD1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRBY3RpdmVNaXBNYXBMZXZlbCgpIGlzIG5vdyAuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKS4iKSx0aGlzLmdldEFjdGl2ZU1pcG1hcExldmVsKCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEc1dC5wcm90b3R5cGUse3NoYWRvd01hcEVuYWJsZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNoYWRvd01hcC5lbmFibGVkfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwRW5hYmxlZCBpcyBub3cgLnNoYWRvd01hcC5lbmFibGVkLiIpLHRoaXMuc2hhZG93TWFwLmVuYWJsZWQ9dH19LHNoYWRvd01hcFR5cGU6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNoYWRvd01hcC50eXBlfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwVHlwZSBpcyBub3cgLnNoYWRvd01hcC50eXBlLiIpLHRoaXMuc2hhZG93TWFwLnR5cGU9dH19LHNoYWRvd01hcEN1bGxGYWNlOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBDdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBDdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX0sY29udGV4dDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmNvbnRleHQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5nZXRDb250ZXh0KCkgaW5zdGVhZC4iKSx0aGlzLmdldENvbnRleHQoKX19LHZyOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAudnIgaGFzIGJlZW4gcmVuYW1lZCB0byAueHIiKSx0aGlzLnhyfX0sZ2FtbWFJbnB1dDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdhbW1hSW5wdXQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IHRoZSBlbmNvZGluZyBmb3IgdGV4dHVyZXMgdmlhIFRleHR1cmUuZW5jb2RpbmcgaW5zdGVhZC4iKSwhMX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2FtbWFJbnB1dCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgdGhlIGVuY29kaW5nIGZvciB0ZXh0dXJlcyB2aWEgVGV4dHVyZS5lbmNvZGluZyBpbnN0ZWFkLiIpfX0sZ2FtbWFPdXRwdXQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5nYW1tYU91dHB1dCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgV2ViR0xSZW5kZXJlci5vdXRwdXRFbmNvZGluZyBpbnN0ZWFkLiIpLCExfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2FtbWFPdXRwdXQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IFdlYkdMUmVuZGVyZXIub3V0cHV0RW5jb2RpbmcgaW5zdGVhZC4iKSx0aGlzLm91dHB1dEVuY29kaW5nPSEwPT09dD9JWnQ6Tlp0fX0sdG9uZU1hcHBpbmdXaGl0ZVBvaW50OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAudG9uZU1hcHBpbmdXaGl0ZVBvaW50IGhhcyBiZWVuIHJlbW92ZWQuIiksMX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAudG9uZU1hcHBpbmdXaGl0ZVBvaW50IGhhcyBiZWVuIHJlbW92ZWQuIil9fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFI1dC5wcm90b3R5cGUse2N1bGxGYWNlOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAuY3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9fSxyZW5kZXJSZXZlcnNlU2lkZWQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclJldmVyc2VTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX0scmVuZGVyU2luZ2xlU2lkZWQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJTaW5nbGVTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyU2luZ2xlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX19fSksT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoU0p0LnByb3RvdHlwZSx7d3JhcFM6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLiIpLHRoaXMudGV4dHVyZS53cmFwU30sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwUyBpcyBub3cgLnRleHR1cmUud3JhcFMuIiksdGhpcy50ZXh0dXJlLndyYXBTPXR9fSx3cmFwVDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwVCBpcyBub3cgLnRleHR1cmUud3JhcFQuIiksdGhpcy50ZXh0dXJlLndyYXBUfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBUIGlzIG5vdyAudGV4dHVyZS53cmFwVC4iKSx0aGlzLnRleHR1cmUud3JhcFQ9dH19LG1hZ0ZpbHRlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5tYWdGaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1hZ0ZpbHRlci4iKSx0aGlzLnRleHR1cmUubWFnRmlsdGVyfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLiIpLHRoaXMudGV4dHVyZS5tYWdGaWx0ZXI9dH19LG1pbkZpbHRlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4iKSx0aGlzLnRleHR1cmUubWluRmlsdGVyfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1pbkZpbHRlciBpcyBub3cgLnRleHR1cmUubWluRmlsdGVyLiIpLHRoaXMudGV4dHVyZS5taW5GaWx0ZXI9dH19LGFuaXNvdHJvcHk6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4iKSx0aGlzLnRleHR1cmUuYW5pc290cm9weX0sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LiIpLHRoaXMudGV4dHVyZS5hbmlzb3Ryb3B5PXR9fSxvZmZzZXQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuIiksdGhpcy50ZXh0dXJlLm9mZnNldH0sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4iKSx0aGlzLnRleHR1cmUub2Zmc2V0PXR9fSxyZXBlYXQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuIiksdGhpcy50ZXh0dXJlLnJlcGVhdH0sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5yZXBlYXQgaXMgbm93IC50ZXh0dXJlLnJlcGVhdC4iKSx0aGlzLnRleHR1cmUucmVwZWF0PXR9fSxmb3JtYXQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZm9ybWF0IGlzIG5vdyAudGV4dHVyZS5mb3JtYXQuIiksdGhpcy50ZXh0dXJlLmZvcm1hdH0sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5mb3JtYXQgaXMgbm93IC50ZXh0dXJlLmZvcm1hdC4iKSx0aGlzLnRleHR1cmUuZm9ybWF0PXR9fSx0eXBlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnR5cGUgaXMgbm93IC50ZXh0dXJlLnR5cGUuIiksdGhpcy50ZXh0dXJlLnR5cGV9LHNldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4iKSx0aGlzLnRleHR1cmUudHlwZT10fX0sZ2VuZXJhdGVNaXBtYXBzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmdlbmVyYXRlTWlwbWFwcyBpcyBub3cgLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzLiIpLHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHN9LHNldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZ2VuZXJhdGVNaXBtYXBzIGlzIG5vdyAudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMuIiksdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz10fX19KSwkOXQucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogLmxvYWQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkF1ZGlvTG9hZGVyIGluc3RlYWQuIik7Y29uc3QgZT10aGlzO3JldHVybihuZXcgQjl0KS5sb2FkKHQsKGZ1bmN0aW9uKHQpe2Uuc2V0QnVmZmVyKHQpfSkpLHRoaXN9LHQ4dC5wcm90b3R5cGUuZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvQW5hbHlzZXI6IC5nZXREYXRhKCkgaXMgbm93IC5nZXRGcmVxdWVuY3lEYXRhKCkuIiksdGhpcy5nZXRGcmVxdWVuY3lEYXRhKCl9LFgxdC5wcm90b3R5cGUudXBkYXRlQ3ViZU1hcD1mdW5jdGlvbih0LGUpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkN1YmVDYW1lcmE6IC51cGRhdGVDdWJlTWFwKCkgaXMgbm93IC51cGRhdGUoKS4iKSx0aGlzLnVwZGF0ZSh0LGUpfSxYMXQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkN1YmVDYW1lcmE6IC5jbGVhcigpIGlzIG5vdyAucmVuZGVyVGFyZ2V0LmNsZWFyKCkuIiksdGhpcy5yZW5kZXJUYXJnZXQuY2xlYXIodCxlLG4saSl9LHlKdC5jcm9zc09yaWdpbj12b2lkIDAseUp0LmxvYWRUZXh0dXJlPWZ1bmN0aW9uKHQsZSxuLGkpe2NvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuVGV4dHVyZUxvYWRlcigpIGluc3RlYWQuIik7Y29uc3Qgcj1uZXcgZTl0O3Iuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7Y29uc3Qgbz1yLmxvYWQodCxuLHZvaWQgMCxpKTtyZXR1cm4gZSYmKG8ubWFwcGluZz1lKSxvfSx5SnQubG9hZFRleHR1cmVDdWJlPWZ1bmN0aW9uKHQsZSxuLGkpe2NvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZUN1YmUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkN1YmVUZXh0dXJlTG9hZGVyKCkgaW5zdGVhZC4iKTtjb25zdCByPW5ldyBRNnQ7ci5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTtjb25zdCBvPXIubG9hZCh0LG4sdm9pZCAwLGkpO3JldHVybiBlJiYoby5tYXBwaW5nPWUpLG99LHlKdC5sb2FkQ29tcHJlc3NlZFRleHR1cmU9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRERTTG9hZGVyIGluc3RlYWQuIil9LHlKdC5sb2FkQ29tcHJlc3NlZFRleHR1cmVDdWJlPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuSW1hZ2VVdGlscy5sb2FkQ29tcHJlc3NlZFRleHR1cmVDdWJlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5ERFNMb2FkZXIgaW5zdGVhZC4iKX07Y29uc3QgWjh0PXtjcmVhdGVNdWx0aU1hdGVyaWFsT2JqZWN0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2NlbmVVdGlscyBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanNtL3V0aWxzL1NjZW5lVXRpbHMuanMiKX0sZGV0YWNoOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2NlbmVVdGlscyBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanNtL3V0aWxzL1NjZW5lVXRpbHMuanMiKX0sYXR0YWNoOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2NlbmVVdGlscyBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanNtL3V0aWxzL1NjZW5lVXRpbHMuanMiKX19OyJ1bmRlZmluZWQiIT10eXBlb2YgX19USFJFRV9ERVZUT09MU19fJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInJlZ2lzdGVyIix7ZGV0YWlsOntyZXZpc2lvbjpCS3R9fSkpLCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYod2luZG93Ll9fVEhSRUVfXz9jb25zb2xlLndhcm4oIldBUk5JTkc6IE11bHRpcGxlIGluc3RhbmNlcyBvZiBUaHJlZS5qcyBiZWluZyBpbXBvcnRlZC4iKTp3aW5kb3cuX19USFJFRV9fPUJLdCk7dmFyIEo4dD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxBQ0VTRmlsbWljVG9uZU1hcHBpbmc6NCxBZGRFcXVhdGlvbjpWS3QsQWRkT3BlcmF0aW9uOjIsQWRkaXRpdmVBbmltYXRpb25CbGVuZE1vZGU6UFp0LEFkZGl0aXZlQmxlbmRpbmc6MixBbHBoYUZvcm1hdDoxMDIxLEFsd2F5c0RlcHRoOjEsQWx3YXlzU3RlbmNpbEZ1bmM6NTE5LEFtYmllbnRMaWdodDpiOXQsQW1iaWVudExpZ2h0UHJvYmU6Rjl0LEFuaW1hdGlvbkNsaXA6RzZ0LEFuaW1hdGlvbkxvYWRlcjpjbGFzcyBleHRlbmRzICQ2dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxuLGkpe2NvbnN0IHI9dGhpcyxvPW5ldyBaNnQodGhpcy5tYW5hZ2VyKTtvLnNldFBhdGgodGhpcy5wYXRoKSxvLnNldFJlcXVlc3RIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVyKSxvLnNldFdpdGhDcmVkZW50aWFscyh0aGlzLndpdGhDcmVkZW50aWFscyksby5sb2FkKHQsKGZ1bmN0aW9uKG4pe3RyeXtlKHIucGFyc2UoSlNPTi5wYXJzZShuKSkpfWNhdGNoKGUpe2k/aShlKTpjb25zb2xlLmVycm9yKGUpLHIubWFuYWdlci5pdGVtRXJyb3IodCl9fSksbixpKX1wYXJzZSh0KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCBpPUc2dC5wYXJzZSh0W25dKTtlLnB1c2goaSl9cmV0dXJuIGV9fSxBbmltYXRpb25NaXhlcjpmOHQsQW5pbWF0aW9uT2JqZWN0R3JvdXA6ZDh0LEFuaW1hdGlvblV0aWxzOlA2dCxBcmNDdXJ2ZTpwNHQsQXJyYXlDYW1lcmE6QjV0LEFycm93SGVscGVyOmNsYXNzIGV4dGVuZHMga1F0e2NvbnN0cnVjdG9yKHQ9bmV3IENKdCgwLDAsMSksZT1uZXcgQ0p0KDAsMCwwKSxuPTEsaT0xNjc3Njk2MCxyPS4yKm4sbz0uMipyKXtzdXBlcigpLHRoaXMudHlwZT0iQXJyb3dIZWxwZXIiLHZvaWQgMD09PXE4dCYmKHE4dD1uZXcgYjF0LHE4dC5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KFswLDAsMCwwLDEsMF0sMykpLFk4dD1uZXcgbjR0KDAsLjUsMSw1LDEpLFk4dC50cmFuc2xhdGUoMCwtLjUsMCkpLHRoaXMucG9zaXRpb24uY29weShlKSx0aGlzLmxpbmU9bmV3IEgzdChxOHQsbmV3IEkzdCh7Y29sb3I6aSx0b25lTWFwcGVkOiExfSkpLHRoaXMubGluZS5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuYWRkKHRoaXMubGluZSksdGhpcy5jb25lPW5ldyBCMXQoWTh0LG5ldyBLUXQoe2NvbG9yOmksdG9uZU1hcHBlZDohMX0pKSx0aGlzLmNvbmUubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLmFkZCh0aGlzLmNvbmUpLHRoaXMuc2V0RGlyZWN0aW9uKHQpLHRoaXMuc2V0TGVuZ3RoKG4scixvKX1zZXREaXJlY3Rpb24odCl7aWYodC55Pi45OTk5OSl0aGlzLnF1YXRlcm5pb24uc2V0KDAsMCwwLDEpO2Vsc2UgaWYodC55PC0uOTk5OTkpdGhpcy5xdWF0ZXJuaW9uLnNldCgxLDAsMCwwKTtlbHNle1c4dC5zZXQodC56LDAsLXQueCkubm9ybWFsaXplKCk7Y29uc3QgZT1NYXRoLmFjb3ModC55KTt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZShXOHQsZSl9fXNldExlbmd0aCh0LGU9LjIqdCxuPS4yKmUpe3RoaXMubGluZS5zY2FsZS5zZXQoMSxNYXRoLm1heCgxZS00LHQtZSksMSksdGhpcy5saW5lLnVwZGF0ZU1hdHJpeCgpLHRoaXMuY29uZS5zY2FsZS5zZXQobixlLG4pLHRoaXMuY29uZS5wb3NpdGlvbi55PXQsdGhpcy5jb25lLnVwZGF0ZU1hdHJpeCgpfXNldENvbG9yKHQpe3RoaXMubGluZS5tYXRlcmlhbC5jb2xvci5zZXQodCksdGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldCh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQsITEpLHRoaXMubGluZS5jb3B5KHQubGluZSksdGhpcy5jb25lLmNvcHkodC5jb25lKSx0aGlzfX0sQXVkaW86JDl0LEF1ZGlvQW5hbHlzZXI6dDh0LEF1ZGlvQ29udGV4dDpEOXQsQXVkaW9MaXN0ZW5lcjpjbGFzcyBleHRlbmRzIGtRdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy50eXBlPSJBdWRpb0xpc3RlbmVyIix0aGlzLmNvbnRleHQ9RDl0LmdldENvbnRleHQoKSx0aGlzLmdhaW49dGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKSx0aGlzLmdhaW4uY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZmlsdGVyPW51bGwsdGhpcy50aW1lRGVsdGE9MCx0aGlzLl9jbG9jaz1uZXcgajl0fWdldElucHV0KCl7cmV0dXJuIHRoaXMuZ2Fpbn1yZW1vdmVGaWx0ZXIoKXtyZXR1cm4gbnVsbCE9PXRoaXMuZmlsdGVyJiYodGhpcy5nYWluLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXIpLHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzLmdhaW4uY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZmlsdGVyPW51bGwpLHRoaXN9Z2V0RmlsdGVyKCl7cmV0dXJuIHRoaXMuZmlsdGVyfXNldEZpbHRlcih0KXtyZXR1cm4gbnVsbCE9PXRoaXMuZmlsdGVyPyh0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmZpbHRlciksdGhpcy5maWx0ZXIuZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pKTp0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZmlsdGVyPXQsdGhpcy5nYWluLmNvbm5lY3QodGhpcy5maWx0ZXIpLHRoaXMuZmlsdGVyLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzfWdldE1hc3RlclZvbHVtZSgpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZX1zZXRNYXN0ZXJWb2x1bWUodCl7cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSh0LHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXN9dXBkYXRlTWF0cml4V29ybGQodCl7c3VwZXIudXBkYXRlTWF0cml4V29ybGQodCk7Y29uc3QgZT10aGlzLmNvbnRleHQubGlzdGVuZXIsbj10aGlzLnVwO2lmKHRoaXMudGltZURlbHRhPXRoaXMuX2Nsb2NrLmdldERlbHRhKCksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoVzl0LHE5dCxZOXQpLFg5dC5zZXQoMCwwLC0xKS5hcHBseVF1YXRlcm5pb24ocTl0KSxlLnBvc2l0aW9uWCl7Y29uc3QgdD10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdGhpcy50aW1lRGVsdGE7ZS5wb3NpdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoVzl0LngsdCksZS5wb3NpdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoVzl0LnksdCksZS5wb3NpdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoVzl0LnosdCksZS5mb3J3YXJkWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShYOXQueCx0KSxlLmZvcndhcmRZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKFg5dC55LHQpLGUuZm9yd2FyZFoubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoWDl0LnosdCksZS51cFgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobi54LHQpLGUudXBZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKG4ueSx0KSxlLnVwWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShuLnosdCl9ZWxzZSBlLnNldFBvc2l0aW9uKFc5dC54LFc5dC55LFc5dC56KSxlLnNldE9yaWVudGF0aW9uKFg5dC54LFg5dC55LFg5dC56LG4ueCxuLnksbi56KX19LEF1ZGlvTG9hZGVyOkI5dCxBeGVzSGVscGVyOlg4dCxBeGlzSGVscGVyOmZ1bmN0aW9uIFE4dCh0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5BeGlzSGVscGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuQXhlc0hlbHBlci4iKSxuZXcgWDh0KHQpfSxCYWNrU2lkZToxLEJhc2ljRGVwdGhQYWNraW5nOjMyMDAsQmFzaWNTaGFkb3dNYXA6MCxCaW5hcnlUZXh0dXJlTG9hZGVyOmZ1bmN0aW9uIHQ3dCh0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CaW5hcnlUZXh0dXJlTG9hZGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuRGF0YVRleHR1cmVMb2FkZXIuIiksbmV3IHQ5dCh0KX0sQm9uZTpTM3QsQm9vbGVhbktleWZyYW1lVHJhY2s6RDZ0LEJvdW5kaW5nQm94SGVscGVyOmZ1bmN0aW9uIGU3dCh0LGUpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJvdW5kaW5nQm94SGVscGVyIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIENyZWF0aW5nIGEgVEhSRUUuQm94SGVscGVyIGluc3RlYWQuIiksbmV3IEc4dCh0LGUpfSxCb3gyOnc4dCxCb3gzOkxKdCxCb3gzSGVscGVyOmNsYXNzIGV4dGVuZHMgVTN0e2NvbnN0cnVjdG9yKHQsZT0xNjc3Njk2MCl7Y29uc3Qgbj1uZXcgVWludDE2QXJyYXkoWzAsMSwxLDIsMiwzLDMsMCw0LDUsNSw2LDYsNyw3LDQsMCw0LDEsNSwyLDYsMyw3XSksaT1uZXcgYjF0O2kuc2V0SW5kZXgobmV3IFFRdChuLDEpKSxpLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBsMXQoWzEsMSwxLC0xLDEsMSwtMSwtMSwxLDEsLTEsMSwxLDEsLTEsLTEsMSwtMSwtMSwtMSwtMSwxLC0xLC0xXSwzKSksc3VwZXIoaSxuZXcgSTN0KHtjb2xvcjplLHRvbmVNYXBwZWQ6ITF9KSksdGhpcy5ib3g9dCx0aGlzLnR5cGU9IkJveDNIZWxwZXIiLHRoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl9dXBkYXRlTWF0cml4V29ybGQodCl7Y29uc3QgZT10aGlzLmJveDtlLmlzRW1wdHkoKXx8KGUuZ2V0Q2VudGVyKHRoaXMucG9zaXRpb24pLGUuZ2V0U2l6ZSh0aGlzLnNjYWxlKSx0aGlzLnNjYWxlLm11bHRpcGx5U2NhbGFyKC41KSxzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KSl9fSxCb3hCdWZmZXJHZW9tZXRyeTpGMXQsQm94R2VvbWV0cnk6RjF0LEJveEhlbHBlcjpHOHQsQnVmZmVyQXR0cmlidXRlOlFRdCxCdWZmZXJHZW9tZXRyeTpiMXQsQnVmZmVyR2VvbWV0cnlMb2FkZXI6QTl0LEJ5dGVUeXBlOjEwMTAsQ2FjaGU6cTZ0LENhbWVyYTpXMXQsQ2FtZXJhSGVscGVyOmNsYXNzIGV4dGVuZHMgVTN0e2NvbnN0cnVjdG9yKHQpe2NvbnN0IGU9bmV3IGIxdCxuPW5ldyBJM3Qoe2NvbG9yOjE2Nzc3MjE1LHZlcnRleENvbG9yczohMCx0b25lTWFwcGVkOiExfSksaT1bXSxyPVtdLG89e30sYT1uZXcgJFF0KDE2NzU1MjAwKSxzPW5ldyAkUXQoMTY3MTE2ODApLGw9bmV3ICRRdCg0Mzc3NSksYz1uZXcgJFF0KDE2Nzc3MjE1KSx1PW5ldyAkUXQoMzM1NTQ0Myk7ZnVuY3Rpb24gaCh0LGUsbil7ZCh0LG4pLGQoZSxuKX1mdW5jdGlvbiBkKHQsZSl7aS5wdXNoKDAsMCwwKSxyLnB1c2goZS5yLGUuZyxlLmIpLHZvaWQgMD09PW9bdF0mJihvW3RdPVtdKSxvW3RdLnB1c2goaS5sZW5ndGgvMy0xKX1oKCJuMSIsIm4yIixhKSxoKCJuMiIsIm40IixhKSxoKCJuNCIsIm4zIixhKSxoKCJuMyIsIm4xIixhKSxoKCJmMSIsImYyIixhKSxoKCJmMiIsImY0IixhKSxoKCJmNCIsImYzIixhKSxoKCJmMyIsImYxIixhKSxoKCJuMSIsImYxIixhKSxoKCJuMiIsImYyIixhKSxoKCJuMyIsImYzIixhKSxoKCJuNCIsImY0IixhKSxoKCJwIiwibjEiLHMpLGgoInAiLCJuMiIscyksaCgicCIsIm4zIixzKSxoKCJwIiwibjQiLHMpLGgoInUxIiwidTIiLGwpLGgoInUyIiwidTMiLGwpLGgoInUzIiwidTEiLGwpLGgoImMiLCJ0IixjKSxoKCJwIiwiYyIsdSksaCgiY24xIiwiY24yIix1KSxoKCJjbjMiLCJjbjQiLHUpLGgoImNmMSIsImNmMiIsdSksaCgiY2YzIiwiY2Y0Iix1KSxlLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBsMXQoaSwzKSksZS5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgbDF0KHIsMykpLHN1cGVyKGUsbiksdGhpcy50eXBlPSJDYW1lcmFIZWxwZXIiLHRoaXMuY2FtZXJhPXQsdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCYmdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpLHRoaXMubWF0cml4PXQubWF0cml4V29ybGQsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMucG9pbnRNYXA9byx0aGlzLnVwZGF0ZSgpfXVwZGF0ZSgpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeSxlPXRoaXMucG9pbnRNYXA7Vjh0LnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5jYW1lcmEucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLFU4dCgiYyIsZSx0LFY4dCwwLDAsLTEpLFU4dCgidCIsZSx0LFY4dCwwLDAsMSksVTh0KCJuMSIsZSx0LFY4dCwtMSwtMSwtMSksVTh0KCJuMiIsZSx0LFY4dCwxLC0xLC0xKSxVOHQoIm4zIixlLHQsVjh0LC0xLDEsLTEpLFU4dCgibjQiLGUsdCxWOHQsMSwxLC0xKSxVOHQoImYxIixlLHQsVjh0LC0xLC0xLDEpLFU4dCgiZjIiLGUsdCxWOHQsMSwtMSwxKSxVOHQoImYzIixlLHQsVjh0LC0xLDEsMSksVTh0KCJmNCIsZSx0LFY4dCwxLDEsMSksVTh0KCJ1MSIsZSx0LFY4dCwuNywxLjEsLTEpLFU4dCgidTIiLGUsdCxWOHQsLS43LDEuMSwtMSksVTh0KCJ1MyIsZSx0LFY4dCwwLDIsLTEpLFU4dCgiY2YxIixlLHQsVjh0LC0xLDAsMSksVTh0KCJjZjIiLGUsdCxWOHQsMSwwLDEpLFU4dCgiY2YzIixlLHQsVjh0LDAsLTEsMSksVTh0KCJjZjQiLGUsdCxWOHQsMCwxLDEpLFU4dCgiY24xIixlLHQsVjh0LC0xLDAsLTEpLFU4dCgiY24yIixlLHQsVjh0LDEsMCwtMSksVTh0KCJjbjMiLGUsdCxWOHQsMCwtMSwtMSksVTh0KCJjbjQiLGUsdCxWOHQsMCwxLC0xKSx0LmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKS5uZWVkc1VwZGF0ZT0hMH1kaXNwb3NlKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9fSxDYW52YXNSZW5kZXJlcjpmdW5jdGlvbiBuN3QoKXtjb25zb2xlLmVycm9yKCJUSFJFRS5DYW52YXNSZW5kZXJlciBoYXMgYmVlbiByZW1vdmVkIil9LENhbnZhc1RleHR1cmU6UTN0LENhdG11bGxSb21DdXJ2ZTM6djR0LENpbmVvblRvbmVNYXBwaW5nOjMsQ2lyY2xlQnVmZmVyR2VvbWV0cnk6ZTR0LENpcmNsZUdlb21ldHJ5OmU0dCxDbGFtcFRvRWRnZVdyYXBwaW5nOktLdCxDbG9jazpqOXQsQ29sb3I6JFF0LENvbG9yS2V5ZnJhbWVUcmFjazpCNnQsQ29tcHJlc3NlZFRleHR1cmU6SjN0LENvbXByZXNzZWRUZXh0dXJlTG9hZGVyOmNsYXNzIGV4dGVuZHMgJDZ0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4saSl7Y29uc3Qgcj10aGlzLG89W10sYT1uZXcgSjN0LHM9bmV3IFo2dCh0aGlzLm1hbmFnZXIpO3Muc2V0UGF0aCh0aGlzLnBhdGgpLHMuc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpLHMuc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLHMuc2V0V2l0aENyZWRlbnRpYWxzKHIud2l0aENyZWRlbnRpYWxzKTtsZXQgbD0wO2Z1bmN0aW9uIGMoYyl7cy5sb2FkKHRbY10sKGZ1bmN0aW9uKHQpe2NvbnN0IG49ci5wYXJzZSh0LCEwKTtvW2NdPXt3aWR0aDpuLndpZHRoLGhlaWdodDpuLmhlaWdodCxmb3JtYXQ6bi5mb3JtYXQsbWlwbWFwczpuLm1pcG1hcHN9LGwrPTEsNj09PWwmJigxPT09bi5taXBtYXBDb3VudCYmKGEubWluRmlsdGVyPWVadCksYS5pbWFnZT1vLGEuZm9ybWF0PW4uZm9ybWF0LGEubmVlZHNVcGRhdGU9ITAsZSYmZShhKSl9KSxuLGkpfWlmKEFycmF5LmlzQXJyYXkodCkpZm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47KytlKWMoZSk7ZWxzZSBzLmxvYWQodCwoZnVuY3Rpb24odCl7Y29uc3Qgbj1yLnBhcnNlKHQsITApO2lmKG4uaXNDdWJlbWFwKXtjb25zdCB0PW4ubWlwbWFwcy5sZW5ndGgvbi5taXBtYXBDb3VudDtmb3IobGV0IGU9MDtlPHQ7ZSsrKXtvW2VdPXttaXBtYXBzOltdfTtmb3IobGV0IHQ9MDt0PG4ubWlwbWFwQ291bnQ7dCsrKW9bZV0ubWlwbWFwcy5wdXNoKG4ubWlwbWFwc1tlKm4ubWlwbWFwQ291bnQrdF0pLG9bZV0uZm9ybWF0PW4uZm9ybWF0LG9bZV0ud2lkdGg9bi53aWR0aCxvW2VdLmhlaWdodD1uLmhlaWdodH1hLmltYWdlPW99ZWxzZSBhLmltYWdlLndpZHRoPW4ud2lkdGgsYS5pbWFnZS5oZWlnaHQ9bi5oZWlnaHQsYS5taXBtYXBzPW4ubWlwbWFwczsxPT09bi5taXBtYXBDb3VudCYmKGEubWluRmlsdGVyPWVadCksYS5mb3JtYXQ9bi5mb3JtYXQsYS5uZWVkc1VwZGF0ZT0hMCxlJiZlKGEpfSksbixpKTtyZXR1cm4gYX19LENvbmVCdWZmZXJHZW9tZXRyeTppNHQsQ29uZUdlb21ldHJ5Omk0dCxDdWJlQ2FtZXJhOlgxdCxDdWJlUmVmbGVjdGlvbk1hcHBpbmc6akt0LEN1YmVSZWZyYWN0aW9uTWFwcGluZzpHS3QsQ3ViZVRleHR1cmU6JDF0LEN1YmVUZXh0dXJlTG9hZGVyOlE2dCxDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzpZS3QsQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmc6WEt0LEN1YmljQmV6aWVyQ3VydmU6UzR0LEN1YmljQmV6aWVyQ3VydmUzOk00dCxDdWJpY0ludGVycG9sYW50Okk2dCxDdWxsRmFjZUJhY2s6MSxDdWxsRmFjZUZyb250OjIsQ3VsbEZhY2VGcm9udEJhY2s6MyxDdWxsRmFjZU5vbmU6MCxDdXJ2ZTpoNHQsQ3VydmVQYXRoOm45dCxDdXN0b21CbGVuZGluZzo1LEN1c3RvbVRvbmVNYXBwaW5nOjUsQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeTpuNHQsQ3lsaW5kZXJHZW9tZXRyeTpuNHQsQ3lsaW5kcmljYWw6Y2xhc3N7Y29uc3RydWN0b3IodD0xLGU9MCxuPTApe3JldHVybiB0aGlzLnJhZGl1cz10LHRoaXMudGhldGE9ZSx0aGlzLnk9bix0aGlzfXNldCh0LGUsbil7cmV0dXJuIHRoaXMucmFkaXVzPXQsdGhpcy50aGV0YT1lLHRoaXMueT1uLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5yYWRpdXM9dC5yYWRpdXMsdGhpcy50aGV0YT10LnRoZXRhLHRoaXMueT10LnksdGhpc31zZXRGcm9tVmVjdG9yMyh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKHQueCx0LnksdC56KX1zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKHQsZSxuKXtyZXR1cm4gdGhpcy5yYWRpdXM9TWF0aC5zcXJ0KHQqdCtuKm4pLHRoaXMudGhldGE9TWF0aC5hdGFuMih0LG4pLHRoaXMueT1lLHRoaXN9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fSxEYXRhVGV4dHVyZTpNM3QsRGF0YVRleHR1cmUyREFycmF5OkswdCxEYXRhVGV4dHVyZTNEOlowdCxEYXRhVGV4dHVyZUxvYWRlcjp0OXQsRGF0YVV0aWxzOmNsYXNze3N0YXRpYyB0b0hhbGZGbG9hdCh0KXskOHRbMF09dDtjb25zdCBlPUs4dFswXTtsZXQgbj1lPj4xNiYzMjc2OCxpPWU+PjEyJjIwNDc7Y29uc3Qgcj1lPj4yMyYyNTU7cmV0dXJuIHI8MTAzP246cj4xNDI/KG58PTMxNzQ0LG58PSgyNTU9PXI/MDoxKSYmODM4ODYwNyZlLG4pOnI8MTEzPyhpfD0yMDQ4LG58PShpPj4xMTQtcikrKGk+PjExMy1yJjEpLG4pOihufD1yLTExMjw8MTB8aT4+MSxuKz0xJmksbil9fSxEZWNyZW1lbnRTdGVuY2lsT3A6NzY4MyxEZWNyZW1lbnRXcmFwU3RlbmNpbE9wOjM0MDU2LERlZmF1bHRMb2FkaW5nTWFuYWdlcjpYNnQsRGVwdGhGb3JtYXQ6ZFp0LERlcHRoU3RlbmNpbEZvcm1hdDpwWnQsRGVwdGhUZXh0dXJlOnQ0dCxEaXJlY3Rpb25hbExpZ2h0OnY5dCxEaXJlY3Rpb25hbExpZ2h0SGVscGVyOmNsYXNzIGV4dGVuZHMga1F0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcigpLHRoaXMubGlnaHQ9dCx0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCksdGhpcy5tYXRyaXg9dC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5jb2xvcj1uLHZvaWQgMD09PWUmJihlPTEpO2xldCBpPW5ldyBiMXQ7aS5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KFstZSxlLDAsZSxlLDAsZSwtZSwwLC1lLC1lLDAsLWUsZSwwXSwzKSk7Y29uc3Qgcj1uZXcgSTN0KHtmb2c6ITEsdG9uZU1hcHBlZDohMX0pO3RoaXMubGlnaHRQbGFuZT1uZXcgSDN0KGksciksdGhpcy5hZGQodGhpcy5saWdodFBsYW5lKSxpPW5ldyBiMXQsaS5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KFswLDAsMCwwLDAsMV0sMykpLHRoaXMudGFyZ2V0TGluZT1uZXcgSDN0KGksciksdGhpcy5hZGQodGhpcy50YXJnZXRMaW5lKSx0aGlzLnVwZGF0ZSgpfWRpc3Bvc2UoKXt0aGlzLmxpZ2h0UGxhbmUuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5kaXNwb3NlKCksdGhpcy50YXJnZXRMaW5lLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuZGlzcG9zZSgpfXVwZGF0ZSgpe0Q4dC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC5tYXRyaXhXb3JsZCksQjh0LnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCksSDh0LnN1YlZlY3RvcnMoQjh0LEQ4dCksdGhpcy5saWdodFBsYW5lLmxvb2tBdChCOHQpLHZvaWQgMCE9PXRoaXMuY29sb3I/KHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvciksdGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKSk6KHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpLHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpKSx0aGlzLnRhcmdldExpbmUubG9va0F0KEI4dCksdGhpcy50YXJnZXRMaW5lLnNjYWxlLno9SDh0Lmxlbmd0aCgpfX0sRGlzY3JldGVJbnRlcnBvbGFudDpPNnQsRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnk6bzR0LERvZGVjYWhlZHJvbkdlb21ldHJ5Om80dCxEb3VibGVTaWRlOjIsRHN0QWxwaGFGYWN0b3I6MjA2LERzdENvbG9yRmFjdG9yOjIwOCxEeW5hbWljQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uIGk3dCh0LGUpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkR5bmFtaWNCdWZmZXJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUoKS5zZXRVc2FnZSggVEhSRUUuRHluYW1pY0RyYXdVc2FnZSApIGluc3RlYWQuIiksbmV3IFFRdCh0LGUpLnNldFVzYWdlKFZadCl9LER5bmFtaWNDb3B5VXNhZ2U6MzUwNTAsRHluYW1pY0RyYXdVc2FnZTpWWnQsRHluYW1pY1JlYWRVc2FnZTozNTA0OSxFZGdlc0dlb21ldHJ5OnU0dCxFZGdlc0hlbHBlcjpmdW5jdGlvbiByN3QodCxlKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5FZGdlc0hlbHBlciBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRWRnZXNHZW9tZXRyeSBpbnN0ZWFkLiIpLG5ldyBVM3QobmV3IHU0dCh0Lmdlb21ldHJ5KSxuZXcgSTN0KHtjb2xvcjp2b2lkIDAhPT1lP2U6MTY3NzcyMTV9KSl9LEVsbGlwc2VDdXJ2ZTpkNHQsRXF1YWxEZXB0aDo0LEVxdWFsU3RlbmNpbEZ1bmM6NTE0LEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOldLdCxFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzpxS3QsRXVsZXI6ZlF0LEV2ZW50RGlzcGF0Y2hlcjpqWnQsRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OnI2dCxFeHRydWRlR2VvbWV0cnk6cjZ0LEZhY2VDb2xvcnM6MSxGaWxlTG9hZGVyOlo2dCxGbGF0U2hhZGluZzoxLEZsb2F0MTZCdWZmZXJBdHRyaWJ1dGU6czF0LEZsb2F0MzJBdHRyaWJ1dGU6ZnVuY3Rpb24gbzd0KHQsZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuRmxvYXQzMkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpLG5ldyBsMXQodCxlKX0sRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZTpsMXQsRmxvYXQ2NEF0dHJpYnV0ZTpmdW5jdGlvbiBhN3QodCxlKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5GbG9hdDY0QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIiksbmV3IGMxdCh0LGUpfSxGbG9hdDY0QnVmZmVyQXR0cmlidXRlOmMxdCxGbG9hdFR5cGU6c1p0LEZvZzpZNXQsRm9nRXhwMjpxNXQsRm9udDpSOXQsRm9udExvYWRlcjpjbGFzcyBleHRlbmRzICQ2dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxuLGkpe2NvbnN0IHI9dGhpcyxvPW5ldyBaNnQodGhpcy5tYW5hZ2VyKTtvLnNldFBhdGgodGhpcy5wYXRoKSxvLnNldFJlcXVlc3RIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVyKSxvLnNldFdpdGhDcmVkZW50aWFscyhyLndpdGhDcmVkZW50aWFscyksby5sb2FkKHQsKGZ1bmN0aW9uKHQpe2xldCBuO3RyeXtuPUpTT04ucGFyc2UodCl9Y2F0Y2goZSl7Y29uc29sZS53YXJuKCJUSFJFRS5Gb250TG9hZGVyOiB0eXBlZmFjZS5qcyBzdXBwb3J0IGlzIGJlaW5nIGRlcHJlY2F0ZWQuIFVzZSB0eXBlZmFjZS5qc29uIGluc3RlYWQuIiksbj1KU09OLnBhcnNlKHQuc3Vic3RyaW5nKDY1LHQubGVuZ3RoLTIpKX1jb25zdCBpPXIucGFyc2Uobik7ZSYmZShpKX0pLG4saSl9cGFyc2UodCl7cmV0dXJuIG5ldyBSOXQodCl9fSxGcm9udFNpZGU6MCxGcnVzdHVtOmkwdCxHTEJ1ZmZlckF0dHJpYnV0ZTpfOHQsR0xTTDE6IjEwMCIsR0xTTDM6VVp0LEdhbW1hRW5jb2Rpbmc6Ulp0LEdyZWF0ZXJEZXB0aDo2LEdyZWF0ZXJFcXVhbERlcHRoOjUsR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmM6NTE4LEdyZWF0ZXJTdGVuY2lsRnVuYzo1MTYsR3JpZEhlbHBlcjp6OHQsR3JvdXA6SDV0LEhhbGZGbG9hdFR5cGU6bFp0LEhlbWlzcGhlcmVMaWdodDphOXQsSGVtaXNwaGVyZUxpZ2h0SGVscGVyOmNsYXNzIGV4dGVuZHMga1F0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcigpLHRoaXMubGlnaHQ9dCx0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCksdGhpcy5tYXRyaXg9dC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5jb2xvcj1uO2NvbnN0IGk9bmV3IGw2dChlKTtpLnJvdGF0ZVkoLjUqTWF0aC5QSSksdGhpcy5tYXRlcmlhbD1uZXcgS1F0KHt3aXJlZnJhbWU6ITAsZm9nOiExLHRvbmVNYXBwZWQ6ITF9KSx2b2lkIDA9PT10aGlzLmNvbG9yJiYodGhpcy5tYXRlcmlhbC52ZXJ0ZXhDb2xvcnM9ITApO2NvbnN0IHI9aS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiksbz1uZXcgRmxvYXQzMkFycmF5KDMqci5jb3VudCk7aS5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgUVF0KG8sMykpLHRoaXMuYWRkKG5ldyBCMXQoaSx0aGlzLm1hdGVyaWFsKSksdGhpcy51cGRhdGUoKX1kaXNwb3NlKCl7dGhpcy5jaGlsZHJlblswXS5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5kaXNwb3NlKCl9dXBkYXRlKCl7Y29uc3QgdD10aGlzLmNoaWxkcmVuWzBdO2lmKHZvaWQgMCE9PXRoaXMuY29sb3IpdGhpcy5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik7ZWxzZXtjb25zdCBlPXQuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJjb2xvciIpO1I4dC5jb3B5KHRoaXMubGlnaHQuY29sb3IpLE84dC5jb3B5KHRoaXMubGlnaHQuZ3JvdW5kQ29sb3IpO2ZvcihsZXQgdD0wLG49ZS5jb3VudDt0PG47dCsrKXtjb25zdCBpPXQ8bi8yP1I4dDpPOHQ7ZS5zZXRYWVoodCxpLnIsaS5nLGkuYil9ZS5uZWVkc1VwZGF0ZT0hMH10Lmxvb2tBdChJOHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQubWF0cml4V29ybGQpLm5lZ2F0ZSgpKX19LEhlbWlzcGhlcmVMaWdodFByb2JlOkg5dCxJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OmE2dCxJY29zYWhlZHJvbkdlb21ldHJ5OmE2dCxJbWFnZUJpdG1hcExvYWRlcjpOOXQsSW1hZ2VMb2FkZXI6SjZ0LEltYWdlVXRpbHM6eUp0LEltbWVkaWF0ZVJlbmRlck9iamVjdDpUOHQsSW5jcmVtZW50U3RlbmNpbE9wOjc2ODIsSW5jcmVtZW50V3JhcFN0ZW5jaWxPcDozNDA1NSxJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6Qzl0LEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5OlQ5dCxJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcjpnOHQsSW5zdGFuY2VkTWVzaDpOM3QsSW50MTZBdHRyaWJ1dGU6ZnVuY3Rpb24gczd0KHQsZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuSW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQxNkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIiksbmV3IGkxdCh0LGUpfSxJbnQxNkJ1ZmZlckF0dHJpYnV0ZTppMXQsSW50MzJBdHRyaWJ1dGU6ZnVuY3Rpb24gbDd0KHQsZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuSW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIiksbmV3IG8xdCh0LGUpfSxJbnQzMkJ1ZmZlckF0dHJpYnV0ZTpvMXQsSW50OEF0dHJpYnV0ZTpmdW5jdGlvbiBjN3QodCxlKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5JbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIiksbmV3IHQxdCh0LGUpfSxJbnQ4QnVmZmVyQXR0cmlidXRlOnQxdCxJbnRUeXBlOjEwMTMsSW50ZXJsZWF2ZWRCdWZmZXI6JDV0LEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlOlo1dCxJbnRlcnBvbGFudDpONnQsSW50ZXJwb2xhdGVEaXNjcmV0ZTpNWnQsSW50ZXJwb2xhdGVMaW5lYXI6RVp0LEludGVycG9sYXRlU21vb3RoOlRadCxJbnZlcnRTdGVuY2lsT3A6NTM4NixKU09OTG9hZGVyOmZ1bmN0aW9uIHU3dCgpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkpTT05Mb2FkZXIgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sS2VlcFN0ZW5jaWxPcDpIWnQsS2V5ZnJhbWVUcmFjazp6NnQsTE9EOmczdCxMYXRoZUJ1ZmZlckdlb21ldHJ5OnM2dCxMYXRoZUdlb21ldHJ5OnM2dCxMYXllcnM6bVF0LExlbnNGbGFyZTpmdW5jdGlvbiBoN3QoKXtjb25zb2xlLmVycm9yKCJUSFJFRS5MZW5zRmxhcmUgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzbS9vYmplY3RzL0xlbnNmbGFyZS5qcyIpfSxMZXNzRGVwdGg6MixMZXNzRXF1YWxEZXB0aDozLExlc3NFcXVhbFN0ZW5jaWxGdW5jOjUxNSxMZXNzU3RlbmNpbEZ1bmM6NTEzLExpZ2h0Om85dCxMaWdodFByb2JlOlM5dCxMaW5lOkgzdCxMaW5lMzpFOHQsTGluZUJhc2ljTWF0ZXJpYWw6STN0LExpbmVDdXJ2ZTpFNHQsTGluZUN1cnZlMzpUNHQsTGluZURhc2hlZE1hdGVyaWFsOms2dCxMaW5lTG9vcDpqM3QsTGluZVBpZWNlczoxLExpbmVTZWdtZW50czpVM3QsTGluZVN0cmlwOjAsTGluZWFyRW5jb2Rpbmc6Tlp0LExpbmVhckZpbHRlcjplWnQsTGluZWFySW50ZXJwb2xhbnQ6UjZ0LExpbmVhck1pcE1hcExpbmVhckZpbHRlcjoxMDA4LExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXI6MTAwNyxMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXI6aVp0LExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXI6blp0LExpbmVhclRvbmVNYXBwaW5nOjEsTG9hZGVyOiQ2dCxMb2FkZXJVdGlsczpFOXQsTG9hZGluZ01hbmFnZXI6WTZ0LExvZ0x1dkVuY29kaW5nOjMwMDMsTG9vcE9uY2U6MjIwMCxMb29wUGluZ1Bvbmc6MjIwMixMb29wUmVwZWF0OjIyMDEsTHVtaW5hbmNlQWxwaGFGb3JtYXQ6MTAyNSxMdW1pbmFuY2VGb3JtYXQ6MTAyNCxNT1VTRTpIS3QsTWF0ZXJpYWw6VVF0LE1hdGVyaWFsTG9hZGVyOk05dCxNYXRoOmVKdCxNYXRoVXRpbHM6ZUp0LE1hdHJpeDM6Z0p0LE1hdHJpeDQ6clF0LE1heEVxdWF0aW9uOjEwNCxNZXNoOkIxdCxNZXNoQmFzaWNNYXRlcmlhbDpLUXQsTWVzaERlcHRoTWF0ZXJpYWw6TjV0LE1lc2hEaXN0YW5jZU1hdGVyaWFsOkk1dCxNZXNoRmFjZU1hdGVyaWFsOmZ1bmN0aW9uIGQ3dCh0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NZXNoRmFjZU1hdGVyaWFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBhbiBBcnJheSBpbnN0ZWFkLiIpLHR9LE1lc2hMYW1iZXJ0TWF0ZXJpYWw6QzZ0LE1lc2hNYXRjYXBNYXRlcmlhbDpBNnQsTWVzaE5vcm1hbE1hdGVyaWFsOlQ2dCxNZXNoUGhvbmdNYXRlcmlhbDpNNnQsTWVzaFBoeXNpY2FsTWF0ZXJpYWw6UzZ0LE1lc2hTdGFuZGFyZE1hdGVyaWFsOnc2dCxNZXNoVG9vbk1hdGVyaWFsOkU2dCxNaW5FcXVhdGlvbjoxMDMsTWlycm9yZWRSZXBlYXRXcmFwcGluZzpaS3QsTWl4T3BlcmF0aW9uOjEsTXVsdGlNYXRlcmlhbDpmdW5jdGlvbiBwN3QodD1bXSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuTXVsdGlNYXRlcmlhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4iKSx0LmlzTXVsdGlNYXRlcmlhbD0hMCx0Lm1hdGVyaWFscz10LHQuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdC5zbGljZSgpfSx0fSxNdWx0aXBseUJsZW5kaW5nOjQsTXVsdGlwbHlPcGVyYXRpb246MCxOZWFyZXN0RmlsdGVyOkpLdCxOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyOjEwMDUsTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXI6MTAwNCxOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyOnRadCxOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcjpRS3QsTmV2ZXJEZXB0aDowLE5ldmVyU3RlbmNpbEZ1bmM6NTEyLE5vQmxlbmRpbmc6MCxOb0NvbG9yczowLE5vVG9uZU1hcHBpbmc6MCxOb3JtYWxBbmltYXRpb25CbGVuZE1vZGU6TFp0LE5vcm1hbEJsZW5kaW5nOjEsTm90RXF1YWxEZXB0aDo3LE5vdEVxdWFsU3RlbmNpbEZ1bmM6NTE3LE51bWJlcktleWZyYW1lVHJhY2s6SDZ0LE9iamVjdDNEOmtRdCxPYmplY3RMb2FkZXI6Y2xhc3MgZXh0ZW5kcyAkNnR7Y29uc3RydWN0b3IodCl7c3VwZXIodCl9bG9hZCh0LGUsbixpKXtjb25zdCByPXRoaXMsbz0iIj09PXRoaXMucGF0aD9FOXQuZXh0cmFjdFVybEJhc2UodCk6dGhpcy5wYXRoO3RoaXMucmVzb3VyY2VQYXRoPXRoaXMucmVzb3VyY2VQYXRofHxvO2NvbnN0IGE9bmV3IFo2dCh0aGlzLm1hbmFnZXIpO2Euc2V0UGF0aCh0aGlzLnBhdGgpLGEuc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLGEuc2V0V2l0aENyZWRlbnRpYWxzKHRoaXMud2l0aENyZWRlbnRpYWxzKSxhLmxvYWQodCwoZnVuY3Rpb24obil7bGV0IG89bnVsbDt0cnl7bz1KU09OLnBhcnNlKG4pfWNhdGNoKGUpe3JldHVybiB2b2lkIDAhPT1pJiZpKGUpLHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUU6T2JqZWN0TG9hZGVyOiBDYW4ndCBwYXJzZSAiK3QrIi4iLGUubWVzc2FnZSl9Y29uc3QgYT1vLm1ldGFkYXRhO3ZvaWQgMCE9PWEmJnZvaWQgMCE9PWEudHlwZSYmImdlb21ldHJ5IiE9PWEudHlwZS50b0xvd2VyQ2FzZSgpP3IucGFyc2UobyxlKTpjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3RMb2FkZXI6IENhbid0IGxvYWQgIit0KX0pLG4saSl9YXN5bmMgbG9hZEFzeW5jKHQsZSl7Y29uc3Qgbj0iIj09PXRoaXMucGF0aD9FOXQuZXh0cmFjdFVybEJhc2UodCk6dGhpcy5wYXRoO3RoaXMucmVzb3VyY2VQYXRoPXRoaXMucmVzb3VyY2VQYXRofHxuO2NvbnN0IGk9bmV3IFo2dCh0aGlzLm1hbmFnZXIpO2kuc2V0UGF0aCh0aGlzLnBhdGgpLGkuc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLGkuc2V0V2l0aENyZWRlbnRpYWxzKHRoaXMud2l0aENyZWRlbnRpYWxzKTtjb25zdCByPWF3YWl0IGkubG9hZEFzeW5jKHQsZSksbz1KU09OLnBhcnNlKHIpLGE9by5tZXRhZGF0YTtpZih2b2lkIDA9PT1hfHx2b2lkIDA9PT1hLnR5cGV8fCJnZW9tZXRyeSI9PT1hLnR5cGUudG9Mb3dlckNhc2UoKSl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk9iamVjdExvYWRlcjogQ2FuJ3QgbG9hZCAiK3QpO3JldHVybiBhd2FpdCB0aGlzLnBhcnNlQXN5bmMobyl9cGFyc2UodCxlKXtjb25zdCBuPXRoaXMucGFyc2VBbmltYXRpb25zKHQuYW5pbWF0aW9ucyksaT10aGlzLnBhcnNlU2hhcGVzKHQuc2hhcGVzKSxyPXRoaXMucGFyc2VHZW9tZXRyaWVzKHQuZ2VvbWV0cmllcyxpKSxvPXRoaXMucGFyc2VJbWFnZXModC5pbWFnZXMsKGZ1bmN0aW9uKCl7dm9pZCAwIT09ZSYmZShsKX0pKSxhPXRoaXMucGFyc2VUZXh0dXJlcyh0LnRleHR1cmVzLG8pLHM9dGhpcy5wYXJzZU1hdGVyaWFscyh0Lm1hdGVyaWFscyxhKSxsPXRoaXMucGFyc2VPYmplY3QodC5vYmplY3QscixzLGEsbiksYz10aGlzLnBhcnNlU2tlbGV0b25zKHQuc2tlbGV0b25zLGwpO2lmKHRoaXMuYmluZFNrZWxldG9ucyhsLGMpLHZvaWQgMCE9PWUpe2xldCB0PSExO2Zvcihjb25zdCBlIGluIG8paWYob1tlXWluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCl7dD0hMDticmVha30hMT09PXQmJmUobCl9cmV0dXJuIGx9YXN5bmMgcGFyc2VBc3luYyh0KXtjb25zdCBlPXRoaXMucGFyc2VBbmltYXRpb25zKHQuYW5pbWF0aW9ucyksbj10aGlzLnBhcnNlU2hhcGVzKHQuc2hhcGVzKSxpPXRoaXMucGFyc2VHZW9tZXRyaWVzKHQuZ2VvbWV0cmllcyxuKSxyPWF3YWl0IHRoaXMucGFyc2VJbWFnZXNBc3luYyh0LmltYWdlcyksbz10aGlzLnBhcnNlVGV4dHVyZXModC50ZXh0dXJlcyxyKSxhPXRoaXMucGFyc2VNYXRlcmlhbHModC5tYXRlcmlhbHMsbykscz10aGlzLnBhcnNlT2JqZWN0KHQub2JqZWN0LGksYSxvLGUpLGw9dGhpcy5wYXJzZVNrZWxldG9ucyh0LnNrZWxldG9ucyxzKTtyZXR1cm4gdGhpcy5iaW5kU2tlbGV0b25zKHMsbCksc31wYXJzZVNoYXBlcyh0KXtjb25zdCBlPXt9O2lmKHZvaWQgMCE9PXQpZm9yKGxldCBuPTAsaT10Lmxlbmd0aDtuPGk7bisrKXtjb25zdCBpPShuZXcgcjl0KS5mcm9tSlNPTih0W25dKTtlW2kudXVpZF09aX1yZXR1cm4gZX1wYXJzZVNrZWxldG9ucyh0LGUpe2NvbnN0IG49e30saT17fTtpZihlLnRyYXZlcnNlKChmdW5jdGlvbih0KXt0LmlzQm9uZSYmKGlbdC51dWlkXT10KX0pKSx2b2lkIDAhPT10KWZvcihsZXQgZT0wLHI9dC5sZW5ndGg7ZTxyO2UrKyl7Y29uc3Qgcj0obmV3IEMzdCkuZnJvbUpTT04odFtlXSxpKTtuW3IudXVpZF09cn1yZXR1cm4gbn1wYXJzZUdlb21ldHJpZXModCxlKXtjb25zdCBuPXt9O2lmKHZvaWQgMCE9PXQpe2NvbnN0IGk9bmV3IEE5dDtmb3IobGV0IHI9MCxvPXQubGVuZ3RoO3I8bztyKyspe2xldCBvO2NvbnN0IGE9dFtyXTtzd2l0Y2goYS50eXBlKXtjYXNlIkJ1ZmZlckdlb21ldHJ5IjpjYXNlIkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IjpvPWkucGFyc2UoYSk7YnJlYWs7Y2FzZSJHZW9tZXRyeSI6Y29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0TG9hZGVyOiBUaGUgbGVnYWN5IEdlb21ldHJ5IHR5cGUgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4iKTticmVhaztkZWZhdWx0OmEudHlwZSBpbiBiNnQ/bz1iNnRbYS50eXBlXS5mcm9tSlNPTihhLGUpOmNvbnNvbGUud2FybihgVEhSRUUuT2JqZWN0TG9hZGVyOiBVbnN1cHBvcnRlZCBnZW9tZXRyeSB0eXBlICIke2EudHlwZX0iYCl9by51dWlkPWEudXVpZCx2b2lkIDAhPT1hLm5hbWUmJihvLm5hbWU9YS5uYW1lKSwhMD09PW8uaXNCdWZmZXJHZW9tZXRyeSYmdm9pZCAwIT09YS51c2VyRGF0YSYmKG8udXNlckRhdGE9YS51c2VyRGF0YSksblthLnV1aWRdPW99fXJldHVybiBufXBhcnNlTWF0ZXJpYWxzKHQsZSl7Y29uc3Qgbj17fSxpPXt9O2lmKHZvaWQgMCE9PXQpe2NvbnN0IHI9bmV3IE05dDtyLnNldFRleHR1cmVzKGUpO2ZvcihsZXQgZT0wLG89dC5sZW5ndGg7ZTxvO2UrKyl7Y29uc3Qgbz10W2VdO2lmKCJNdWx0aU1hdGVyaWFsIj09PW8udHlwZSl7Y29uc3QgdD1bXTtmb3IobGV0IGU9MDtlPG8ubWF0ZXJpYWxzLmxlbmd0aDtlKyspe2NvbnN0IGk9by5tYXRlcmlhbHNbZV07dm9pZCAwPT09bltpLnV1aWRdJiYobltpLnV1aWRdPXIucGFyc2UoaSkpLHQucHVzaChuW2kudXVpZF0pfWlbby51dWlkXT10fWVsc2Ugdm9pZCAwPT09bltvLnV1aWRdJiYobltvLnV1aWRdPXIucGFyc2UobykpLGlbby51dWlkXT1uW28udXVpZF19fXJldHVybiBpfXBhcnNlQW5pbWF0aW9ucyh0KXtjb25zdCBlPXt9O2lmKHZvaWQgMCE9PXQpZm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IGk9RzZ0LnBhcnNlKHRbbl0pO2VbaS51dWlkXT1pfXJldHVybiBlfXBhcnNlSW1hZ2VzKHQsZSl7Y29uc3Qgbj10aGlzLGk9e307bGV0IHI7ZnVuY3Rpb24gbyh0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2NvbnN0IGU9dDtyZXR1cm4oZnVuY3Rpb24gaSh0KXtyZXR1cm4gbi5tYW5hZ2VyLml0ZW1TdGFydCh0KSxyLmxvYWQodCwoZnVuY3Rpb24oKXtuLm1hbmFnZXIuaXRlbUVuZCh0KX0pLHZvaWQgMCwoZnVuY3Rpb24oKXtuLm1hbmFnZXIuaXRlbUVycm9yKHQpLG4ubWFuYWdlci5pdGVtRW5kKHQpfSkpfSkoL14oXC9cLyl8KFthLXpdKzooXC9cLyk/KS9pLnRlc3QoZSk/ZTpuLnJlc291cmNlUGF0aCtlKX1yZXR1cm4gdC5kYXRhP3tkYXRhOmQxdCh0LnR5cGUsdC5kYXRhKSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodH06bnVsbH1pZih2b2lkIDAhPT10JiZ0Lmxlbmd0aD4wKXtjb25zdCBuPW5ldyBZNnQoZSk7cj1uZXcgSjZ0KG4pLHIuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXtjb25zdCBuPXRbZV0scj1uLnVybDtpZihBcnJheS5pc0FycmF5KHIpKXtpW24udXVpZF09W107Zm9yKGxldCB0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPW8oclt0XSk7bnVsbCE9PWUmJihlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudD9pW24udXVpZF0ucHVzaChlKTppW24udXVpZF0ucHVzaChuZXcgTTN0KGUuZGF0YSxlLndpZHRoLGUuaGVpZ2h0KSkpfX1lbHNle2NvbnN0IHQ9byhuLnVybCk7bnVsbCE9PXQmJihpW24udXVpZF09dCl9fX1yZXR1cm4gaX1hc3luYyBwYXJzZUltYWdlc0FzeW5jKHQpe2NvbnN0IGU9dGhpcyxuPXt9O2xldCBpO2FzeW5jIGZ1bmN0aW9uIHIodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtjb25zdCBuPXQscj0vXihcL1wvKXwoW2Etel0rOihcL1wvKT8pL2kudGVzdChuKT9uOmUucmVzb3VyY2VQYXRoK247cmV0dXJuIGF3YWl0IGkubG9hZEFzeW5jKHIpfXJldHVybiB0LmRhdGE/e2RhdGE6ZDF0KHQudHlwZSx0LmRhdGEpLHdpZHRoOnQud2lkdGgsaGVpZ2h0OnQuaGVpZ2h0fTpudWxsfWlmKHZvaWQgMCE9PXQmJnQubGVuZ3RoPjApe2k9bmV3IEo2dCh0aGlzLm1hbmFnZXIpLGkuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7Zm9yKGxldCBlPTAsaT10Lmxlbmd0aDtlPGk7ZSsrKXtjb25zdCBpPXRbZV0sbz1pLnVybDtpZihBcnJheS5pc0FycmF5KG8pKXtuW2kudXVpZF09W107Zm9yKGxldCB0PTAsZT1vLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPW9bdF0sYT1hd2FpdCByKGUpO251bGwhPT1hJiYoYSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQ/bltpLnV1aWRdLnB1c2goYSk6bltpLnV1aWRdLnB1c2gobmV3IE0zdChhLmRhdGEsYS53aWR0aCxhLmhlaWdodCkpKX19ZWxzZXtjb25zdCB0PWF3YWl0IHIoaS51cmwpO251bGwhPT10JiYobltpLnV1aWRdPXQpfX19cmV0dXJuIG59cGFyc2VUZXh0dXJlcyh0LGUpe2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dDooY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VUZXh0dXJlOiBDb25zdGFudCBzaG91bGQgYmUgaW4gbnVtZXJpYyBmb3JtLiIsdCksZVt0XSl9Y29uc3QgaT17fTtpZih2b2lkIDAhPT10KWZvcihsZXQgcj0wLG89dC5sZW5ndGg7cjxvO3IrKyl7Y29uc3Qgbz10W3JdO2xldCBhO3ZvaWQgMD09PW8uaW1hZ2UmJmNvbnNvbGUud2FybignVEhSRUUuT2JqZWN0TG9hZGVyOiBObyAiaW1hZ2UiIHNwZWNpZmllZCBmb3InLG8udXVpZCksdm9pZCAwPT09ZVtvLmltYWdlXSYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBpbWFnZSIsby5pbWFnZSk7Y29uc3Qgcz1lW28uaW1hZ2VdO0FycmF5LmlzQXJyYXkocyk/KGE9bmV3ICQxdChzKSw2PT09cy5sZW5ndGgmJihhLm5lZWRzVXBkYXRlPSEwKSk6KGE9cyYmcy5kYXRhP25ldyBNM3Qocy5kYXRhLHMud2lkdGgscy5oZWlnaHQpOm5ldyBiSnQocykscyYmKGEubmVlZHNVcGRhdGU9ITApKSxhLnV1aWQ9by51dWlkLHZvaWQgMCE9PW8ubmFtZSYmKGEubmFtZT1vLm5hbWUpLHZvaWQgMCE9PW8ubWFwcGluZyYmKGEubWFwcGluZz1uKG8ubWFwcGluZyxrOXQpKSx2b2lkIDAhPT1vLm9mZnNldCYmYS5vZmZzZXQuZnJvbUFycmF5KG8ub2Zmc2V0KSx2b2lkIDAhPT1vLnJlcGVhdCYmYS5yZXBlYXQuZnJvbUFycmF5KG8ucmVwZWF0KSx2b2lkIDAhPT1vLmNlbnRlciYmYS5jZW50ZXIuZnJvbUFycmF5KG8uY2VudGVyKSx2b2lkIDAhPT1vLnJvdGF0aW9uJiYoYS5yb3RhdGlvbj1vLnJvdGF0aW9uKSx2b2lkIDAhPT1vLndyYXAmJihhLndyYXBTPW4oby53cmFwWzBdLEw5dCksYS53cmFwVD1uKG8ud3JhcFsxXSxMOXQpKSx2b2lkIDAhPT1vLmZvcm1hdCYmKGEuZm9ybWF0PW8uZm9ybWF0KSx2b2lkIDAhPT1vLnR5cGUmJihhLnR5cGU9by50eXBlKSx2b2lkIDAhPT1vLmVuY29kaW5nJiYoYS5lbmNvZGluZz1vLmVuY29kaW5nKSx2b2lkIDAhPT1vLm1pbkZpbHRlciYmKGEubWluRmlsdGVyPW4oby5taW5GaWx0ZXIsUDl0KSksdm9pZCAwIT09by5tYWdGaWx0ZXImJihhLm1hZ0ZpbHRlcj1uKG8ubWFnRmlsdGVyLFA5dCkpLHZvaWQgMCE9PW8uYW5pc290cm9weSYmKGEuYW5pc290cm9weT1vLmFuaXNvdHJvcHkpLHZvaWQgMCE9PW8uZmxpcFkmJihhLmZsaXBZPW8uZmxpcFkpLHZvaWQgMCE9PW8ucHJlbXVsdGlwbHlBbHBoYSYmKGEucHJlbXVsdGlwbHlBbHBoYT1vLnByZW11bHRpcGx5QWxwaGEpLHZvaWQgMCE9PW8udW5wYWNrQWxpZ25tZW50JiYoYS51bnBhY2tBbGlnbm1lbnQ9by51bnBhY2tBbGlnbm1lbnQpLGlbby51dWlkXT1hfXJldHVybiBpfXBhcnNlT2JqZWN0KHQsZSxuLGkscil7bGV0IG8sYSxzO2Z1bmN0aW9uIGwodCl7cmV0dXJuIHZvaWQgMD09PWVbdF0mJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgZ2VvbWV0cnkiLHQpLGVbdF19ZnVuY3Rpb24gYyh0KXtpZih2b2lkIDAhPT10KXtpZihBcnJheS5pc0FycmF5KHQpKXtjb25zdCBlPVtdO2ZvcihsZXQgaT0wLHI9dC5sZW5ndGg7aTxyO2krKyl7Y29uc3Qgcj10W2ldO3ZvaWQgMD09PW5bcl0mJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwiLHIpLGUucHVzaChuW3JdKX1yZXR1cm4gZX1yZXR1cm4gdm9pZCAwPT09blt0XSYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBtYXRlcmlhbCIsdCksblt0XX19ZnVuY3Rpb24gdSh0KXtyZXR1cm4gdm9pZCAwPT09aVt0XSYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlIix0KSxpW3RdfXN3aXRjaCh0LnR5cGUpe2Nhc2UiU2NlbmUiOm89bmV3IFg1dCx2b2lkIDAhPT10LmJhY2tncm91bmQmJihvLmJhY2tncm91bmQ9TnVtYmVyLmlzSW50ZWdlcih0LmJhY2tncm91bmQpP25ldyAkUXQodC5iYWNrZ3JvdW5kKTp1KHQuYmFja2dyb3VuZCkpLHZvaWQgMCE9PXQuZW52aXJvbm1lbnQmJihvLmVudmlyb25tZW50PXUodC5lbnZpcm9ubWVudCkpLHZvaWQgMCE9PXQuZm9nJiYoIkZvZyI9PT10LmZvZy50eXBlP28uZm9nPW5ldyBZNXQodC5mb2cuY29sb3IsdC5mb2cubmVhcix0LmZvZy5mYXIpOiJGb2dFeHAyIj09PXQuZm9nLnR5cGUmJihvLmZvZz1uZXcgcTV0KHQuZm9nLmNvbG9yLHQuZm9nLmRlbnNpdHkpKSk7YnJlYWs7Y2FzZSJQZXJzcGVjdGl2ZUNhbWVyYSI6bz1uZXcgcTF0KHQuZm92LHQuYXNwZWN0LHQubmVhcix0LmZhciksdm9pZCAwIT09dC5mb2N1cyYmKG8uZm9jdXM9dC5mb2N1cyksdm9pZCAwIT09dC56b29tJiYoby56b29tPXQuem9vbSksdm9pZCAwIT09dC5maWxtR2F1Z2UmJihvLmZpbG1HYXVnZT10LmZpbG1HYXVnZSksdm9pZCAwIT09dC5maWxtT2Zmc2V0JiYoby5maWxtT2Zmc2V0PXQuZmlsbU9mZnNldCksdm9pZCAwIT09dC52aWV3JiYoby52aWV3PU9iamVjdC5hc3NpZ24oe30sdC52aWV3KSk7YnJlYWs7Y2FzZSJPcnRob2dyYXBoaWNDYW1lcmEiOm89bmV3IGcwdCh0LmxlZnQsdC5yaWdodCx0LnRvcCx0LmJvdHRvbSx0Lm5lYXIsdC5mYXIpLHZvaWQgMCE9PXQuem9vbSYmKG8uem9vbT10Lnpvb20pLHZvaWQgMCE9PXQudmlldyYmKG8udmlldz1PYmplY3QuYXNzaWduKHt9LHQudmlldykpO2JyZWFrO2Nhc2UiQW1iaWVudExpZ2h0IjpvPW5ldyBiOXQodC5jb2xvcix0LmludGVuc2l0eSk7YnJlYWs7Y2FzZSJEaXJlY3Rpb25hbExpZ2h0IjpvPW5ldyB2OXQodC5jb2xvcix0LmludGVuc2l0eSk7YnJlYWs7Y2FzZSJQb2ludExpZ2h0IjpvPW5ldyBfOXQodC5jb2xvcix0LmludGVuc2l0eSx0LmRpc3RhbmNlLHQuZGVjYXkpO2JyZWFrO2Nhc2UiUmVjdEFyZWFMaWdodCI6bz1uZXcgeDl0KHQuY29sb3IsdC5pbnRlbnNpdHksdC53aWR0aCx0LmhlaWdodCk7YnJlYWs7Y2FzZSJTcG90TGlnaHQiOm89bmV3IGQ5dCh0LmNvbG9yLHQuaW50ZW5zaXR5LHQuZGlzdGFuY2UsdC5hbmdsZSx0LnBlbnVtYnJhLHQuZGVjYXkpO2JyZWFrO2Nhc2UiSGVtaXNwaGVyZUxpZ2h0IjpvPW5ldyBhOXQodC5jb2xvcix0Lmdyb3VuZENvbG9yLHQuaW50ZW5zaXR5KTticmVhaztjYXNlIkxpZ2h0UHJvYmUiOm89KG5ldyBTOXQpLmZyb21KU09OKHQpO2JyZWFrO2Nhc2UiU2tpbm5lZE1lc2giOmE9bCh0Lmdlb21ldHJ5KSxzPWModC5tYXRlcmlhbCksbz1uZXcgdzN0KGEscyksdm9pZCAwIT09dC5iaW5kTW9kZSYmKG8uYmluZE1vZGU9dC5iaW5kTW9kZSksdm9pZCAwIT09dC5iaW5kTWF0cml4JiZvLmJpbmRNYXRyaXguZnJvbUFycmF5KHQuYmluZE1hdHJpeCksdm9pZCAwIT09dC5za2VsZXRvbiYmKG8uc2tlbGV0b249dC5za2VsZXRvbik7YnJlYWs7Y2FzZSJNZXNoIjphPWwodC5nZW9tZXRyeSkscz1jKHQubWF0ZXJpYWwpLG89bmV3IEIxdChhLHMpO2JyZWFrO2Nhc2UiSW5zdGFuY2VkTWVzaCI6YT1sKHQuZ2VvbWV0cnkpLHM9Yyh0Lm1hdGVyaWFsKTtjb25zdCBlPXQuaW5zdGFuY2VNYXRyaXgsbj10Lmluc3RhbmNlQ29sb3I7bz1uZXcgTjN0KGEscyx0LmNvdW50KSxvLmluc3RhbmNlTWF0cml4PW5ldyBRUXQobmV3IEZsb2F0MzJBcnJheShlLmFycmF5KSwxNiksdm9pZCAwIT09biYmKG8uaW5zdGFuY2VDb2xvcj1uZXcgUVF0KG5ldyBGbG9hdDMyQXJyYXkobi5hcnJheSksbi5pdGVtU2l6ZSkpO2JyZWFrO2Nhc2UiTE9EIjpvPW5ldyBnM3Q7YnJlYWs7Y2FzZSJMaW5lIjpvPW5ldyBIM3QobCh0Lmdlb21ldHJ5KSxjKHQubWF0ZXJpYWwpKTticmVhaztjYXNlIkxpbmVMb29wIjpvPW5ldyBqM3QobCh0Lmdlb21ldHJ5KSxjKHQubWF0ZXJpYWwpKTticmVhaztjYXNlIkxpbmVTZWdtZW50cyI6bz1uZXcgVTN0KGwodC5nZW9tZXRyeSksYyh0Lm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSJQb2ludENsb3VkIjpjYXNlIlBvaW50cyI6bz1uZXcgJDN0KGwodC5nZW9tZXRyeSksYyh0Lm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSJTcHJpdGUiOm89bmV3IGQzdChjKHQubWF0ZXJpYWwpKTticmVhaztjYXNlIkdyb3VwIjpvPW5ldyBINXQ7YnJlYWs7Y2FzZSJCb25lIjpvPW5ldyBTM3Q7YnJlYWs7ZGVmYXVsdDpvPW5ldyBrUXR9aWYoby51dWlkPXQudXVpZCx2b2lkIDAhPT10Lm5hbWUmJihvLm5hbWU9dC5uYW1lKSx2b2lkIDAhPT10Lm1hdHJpeD8oby5tYXRyaXguZnJvbUFycmF5KHQubWF0cml4KSx2b2lkIDAhPT10Lm1hdHJpeEF1dG9VcGRhdGUmJihvLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlKSxvLm1hdHJpeEF1dG9VcGRhdGUmJm8ubWF0cml4LmRlY29tcG9zZShvLnBvc2l0aW9uLG8ucXVhdGVybmlvbixvLnNjYWxlKSk6KHZvaWQgMCE9PXQucG9zaXRpb24mJm8ucG9zaXRpb24uZnJvbUFycmF5KHQucG9zaXRpb24pLHZvaWQgMCE9PXQucm90YXRpb24mJm8ucm90YXRpb24uZnJvbUFycmF5KHQucm90YXRpb24pLHZvaWQgMCE9PXQucXVhdGVybmlvbiYmby5xdWF0ZXJuaW9uLmZyb21BcnJheSh0LnF1YXRlcm5pb24pLHZvaWQgMCE9PXQuc2NhbGUmJm8uc2NhbGUuZnJvbUFycmF5KHQuc2NhbGUpKSx2b2lkIDAhPT10LmNhc3RTaGFkb3cmJihvLmNhc3RTaGFkb3c9dC5jYXN0U2hhZG93KSx2b2lkIDAhPT10LnJlY2VpdmVTaGFkb3cmJihvLnJlY2VpdmVTaGFkb3c9dC5yZWNlaXZlU2hhZG93KSx0LnNoYWRvdyYmKHZvaWQgMCE9PXQuc2hhZG93LmJpYXMmJihvLnNoYWRvdy5iaWFzPXQuc2hhZG93LmJpYXMpLHZvaWQgMCE9PXQuc2hhZG93Lm5vcm1hbEJpYXMmJihvLnNoYWRvdy5ub3JtYWxCaWFzPXQuc2hhZG93Lm5vcm1hbEJpYXMpLHZvaWQgMCE9PXQuc2hhZG93LnJhZGl1cyYmKG8uc2hhZG93LnJhZGl1cz10LnNoYWRvdy5yYWRpdXMpLHZvaWQgMCE9PXQuc2hhZG93Lm1hcFNpemUmJm8uc2hhZG93Lm1hcFNpemUuZnJvbUFycmF5KHQuc2hhZG93Lm1hcFNpemUpLHZvaWQgMCE9PXQuc2hhZG93LmNhbWVyYSYmKG8uc2hhZG93LmNhbWVyYT10aGlzLnBhcnNlT2JqZWN0KHQuc2hhZG93LmNhbWVyYSkpKSx2b2lkIDAhPT10LnZpc2libGUmJihvLnZpc2libGU9dC52aXNpYmxlKSx2b2lkIDAhPT10LmZydXN0dW1DdWxsZWQmJihvLmZydXN0dW1DdWxsZWQ9dC5mcnVzdHVtQ3VsbGVkKSx2b2lkIDAhPT10LnJlbmRlck9yZGVyJiYoby5yZW5kZXJPcmRlcj10LnJlbmRlck9yZGVyKSx2b2lkIDAhPT10LnVzZXJEYXRhJiYoby51c2VyRGF0YT10LnVzZXJEYXRhKSx2b2lkIDAhPT10LmxheWVycyYmKG8ubGF5ZXJzLm1hc2s9dC5sYXllcnMpLHZvaWQgMCE9PXQuY2hpbGRyZW4pe2NvbnN0IGE9dC5jaGlsZHJlbjtmb3IobGV0IHQ9MDt0PGEubGVuZ3RoO3QrKylvLmFkZCh0aGlzLnBhcnNlT2JqZWN0KGFbdF0sZSxuLGkscikpfWlmKHZvaWQgMCE9PXQuYW5pbWF0aW9ucyl7Y29uc3QgZT10LmFuaW1hdGlvbnM7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspby5hbmltYXRpb25zLnB1c2gocltlW3RdXSl9aWYoIkxPRCI9PT10LnR5cGUpe3ZvaWQgMCE9PXQuYXV0b1VwZGF0ZSYmKG8uYXV0b1VwZGF0ZT10LmF1dG9VcGRhdGUpO2NvbnN0IGU9dC5sZXZlbHM7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2NvbnN0IG49ZVt0XSxpPW8uZ2V0T2JqZWN0QnlQcm9wZXJ0eSgidXVpZCIsbi5vYmplY3QpO3ZvaWQgMCE9PWkmJm8uYWRkTGV2ZWwoaSxuLmRpc3RhbmNlKX19cmV0dXJuIG99YmluZFNrZWxldG9ucyh0LGUpezAhPT1PYmplY3Qua2V5cyhlKS5sZW5ndGgmJnQudHJhdmVyc2UoKGZ1bmN0aW9uKHQpe2lmKCEwPT09dC5pc1NraW5uZWRNZXNoJiZ2b2lkIDAhPT10LnNrZWxldG9uKXtjb25zdCBuPWVbdC5za2VsZXRvbl07dm9pZCAwPT09bj9jb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogTm8gc2tlbGV0b24gZm91bmQgd2l0aCBVVUlEOiIsdC5za2VsZXRvbik6dC5iaW5kKG4sdC5iaW5kTWF0cml4KX19KSl9c2V0VGV4dHVyZVBhdGgodCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiAuc2V0VGV4dHVyZVBhdGgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRSZXNvdXJjZVBhdGgoKS4iKSx0aGlzLnNldFJlc291cmNlUGF0aCh0KX19LE9iamVjdFNwYWNlTm9ybWFsTWFwOjEsT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5Omw2dCxPY3RhaGVkcm9uR2VvbWV0cnk6bDZ0LE9uZUZhY3RvcjoyMDEsT25lTWludXNEc3RBbHBoYUZhY3RvcjoyMDcsT25lTWludXNEc3RDb2xvckZhY3RvcjoyMDksT25lTWludXNTcmNBbHBoYUZhY3RvcjoyMDUsT25lTWludXNTcmNDb2xvckZhY3RvcjoyMDMsT3J0aG9ncmFwaGljQ2FtZXJhOmcwdCxQQ0ZTaGFkb3dNYXA6MSxQQ0ZTb2Z0U2hhZG93TWFwOjIsUE1SRU1HZW5lcmF0b3I6UjB0LFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeTpjNnQsUGFyYW1ldHJpY0dlb21ldHJ5OmM2dCxQYXJ0aWNsZTpmdW5jdGlvbiBmN3QodCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUGFydGljbGUgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5TcHJpdGUuIiksbmV3IGQzdCh0KX0sUGFydGljbGVCYXNpY01hdGVyaWFsOmZ1bmN0aW9uIG03dCh0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZUJhc2ljTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4iKSxuZXcgRzN0KHQpfSxQYXJ0aWNsZVN5c3RlbTpmdW5jdGlvbiBnN3QodCxlKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZVN5c3RlbSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50cy4iKSxuZXcgJDN0KHQsZSl9LFBhcnRpY2xlU3lzdGVtTWF0ZXJpYWw6ZnVuY3Rpb24gXzd0KHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlBhcnRpY2xlU3lzdGVtTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4iKSxuZXcgRzN0KHQpfSxQYXRoOmk5dCxQZXJzcGVjdGl2ZUNhbWVyYTpxMXQsUGxhbmU6dDB0LFBsYW5lQnVmZmVyR2VvbWV0cnk6YTB0LFBsYW5lR2VvbWV0cnk6YTB0LFBsYW5lSGVscGVyOmNsYXNzIGV4dGVuZHMgSDN0e2NvbnN0cnVjdG9yKHQsZT0xLG49MTY3NzY5NjApe2NvbnN0IGk9bixyPW5ldyBiMXQ7ci5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KFsxLC0xLDEsLTEsMSwxLC0xLC0xLDEsMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwtMSwxLDEsMSwxLDAsMCwxLDAsMCwwXSwzKSksci5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxzdXBlcihyLG5ldyBJM3Qoe2NvbG9yOmksdG9uZU1hcHBlZDohMX0pKSx0aGlzLnR5cGU9IlBsYW5lSGVscGVyIix0aGlzLnBsYW5lPXQsdGhpcy5zaXplPWU7Y29uc3Qgbz1uZXcgYjF0O28uc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGwxdChbMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwxLDEsLTEsLTEsMSwxLC0xLDFdLDMpKSxvLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHRoaXMuYWRkKG5ldyBCMXQobyxuZXcgS1F0KHtjb2xvcjppLG9wYWNpdHk6LjIsdHJhbnNwYXJlbnQ6ITAsZGVwdGhXcml0ZTohMSx0b25lTWFwcGVkOiExfSkpKX11cGRhdGVNYXRyaXhXb3JsZCh0KXtsZXQgZT0tdGhpcy5wbGFuZS5jb25zdGFudDtNYXRoLmFicyhlKTwxZS04JiYoZT0xZS04KSx0aGlzLnNjYWxlLnNldCguNSp0aGlzLnNpemUsLjUqdGhpcy5zaXplLGUpLHRoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuc2lkZT1lPDA/MTowLHRoaXMubG9va0F0KHRoaXMucGxhbmUubm9ybWFsKSxzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KX19LFBvaW50Q2xvdWQ6ZnVuY3Rpb24geTd0KHQsZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUG9pbnRDbG91ZCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50cy4iKSxuZXcgJDN0KHQsZSl9LFBvaW50Q2xvdWRNYXRlcmlhbDpmdW5jdGlvbiB2N3QodCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUG9pbnRDbG91ZE1hdGVyaWFsIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzTWF0ZXJpYWwuIiksbmV3IEczdCh0KX0sUG9pbnRMaWdodDpfOXQsUG9pbnRMaWdodEhlbHBlcjpjbGFzcyBleHRlbmRzIEIxdHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IGQ2dChlLDQsMiksbmV3IEtRdCh7d2lyZWZyYW1lOiEwLGZvZzohMSx0b25lTWFwcGVkOiExfSkpLHRoaXMubGlnaHQ9dCx0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCksdGhpcy5jb2xvcj1uLHRoaXMudHlwZT0iUG9pbnRMaWdodEhlbHBlciIsdGhpcy5tYXRyaXg9dGhpcy5saWdodC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy51cGRhdGUoKX1kaXNwb3NlKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9dXBkYXRlKCl7dm9pZCAwIT09dGhpcy5jb2xvcj90aGlzLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKTp0aGlzLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcil9fSxQb2ludHM6JDN0LFBvaW50c01hdGVyaWFsOkczdCxQb2xhckdyaWRIZWxwZXI6Y2xhc3MgZXh0ZW5kcyBVM3R7Y29uc3RydWN0b3IodD0xMCxlPTE2LG49OCxpPTY0LHI9NDQ3MzkyNCxvPTg5NDc4NDgpe3I9bmV3ICRRdChyKSxvPW5ldyAkUXQobyk7Y29uc3QgYT1bXSxzPVtdO2ZvcihsZXQgbj0wO248PWU7bisrKXtjb25zdCBpPW4vZSooMipNYXRoLlBJKSxsPU1hdGguc2luKGkpKnQsYz1NYXRoLmNvcyhpKSp0O2EucHVzaCgwLDAsMCksYS5wdXNoKGwsMCxjKTtjb25zdCB1PTEmbj9yOm87cy5wdXNoKHUucix1LmcsdS5iKSxzLnB1c2godS5yLHUuZyx1LmIpfWZvcihsZXQgZT0wO2U8PW47ZSsrKXtjb25zdCBsPTEmZT9yOm8sYz10LXQvbiplO2ZvcihsZXQgdD0wO3Q8aTt0Kyspe2xldCBlPXQvaSooMipNYXRoLlBJKSxuPU1hdGguc2luKGUpKmMscj1NYXRoLmNvcyhlKSpjO2EucHVzaChuLDAscikscy5wdXNoKGwucixsLmcsbC5iKSxlPSh0KzEpL2kqKDIqTWF0aC5QSSksbj1NYXRoLnNpbihlKSpjLHI9TWF0aC5jb3MoZSkqYyxhLnB1c2gobiwwLHIpLHMucHVzaChsLnIsbC5nLGwuYil9fWNvbnN0IGw9bmV3IGIxdDtsLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBsMXQoYSwzKSksbC5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgbDF0KHMsMykpLHN1cGVyKGwsbmV3IEkzdCh7dmVydGV4Q29sb3JzOiEwLHRvbmVNYXBwZWQ6ITF9KSksdGhpcy50eXBlPSJQb2xhckdyaWRIZWxwZXIifX0sUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5OnI0dCxQb2x5aGVkcm9uR2VvbWV0cnk6cjR0LFBvc2l0aW9uYWxBdWRpbzpjbGFzcyBleHRlbmRzICQ5dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLnBhbm5lcj10aGlzLmNvbnRleHQuY3JlYXRlUGFubmVyKCksdGhpcy5wYW5uZXIucGFubmluZ01vZGVsPSJIUlRGIix0aGlzLnBhbm5lci5jb25uZWN0KHRoaXMuZ2Fpbil9Z2V0T3V0cHV0KCl7cmV0dXJuIHRoaXMucGFubmVyfWdldFJlZkRpc3RhbmNlKCl7cmV0dXJuIHRoaXMucGFubmVyLnJlZkRpc3RhbmNlfXNldFJlZkRpc3RhbmNlKHQpe3JldHVybiB0aGlzLnBhbm5lci5yZWZEaXN0YW5jZT10LHRoaXN9Z2V0Um9sbG9mZkZhY3Rvcigpe3JldHVybiB0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yfXNldFJvbGxvZmZGYWN0b3IodCl7cmV0dXJuIHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3I9dCx0aGlzfWdldERpc3RhbmNlTW9kZWwoKXtyZXR1cm4gdGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbH1zZXREaXN0YW5jZU1vZGVsKHQpe3JldHVybiB0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsPXQsdGhpc31nZXRNYXhEaXN0YW5jZSgpe3JldHVybiB0aGlzLnBhbm5lci5tYXhEaXN0YW5jZX1zZXRNYXhEaXN0YW5jZSh0KXtyZXR1cm4gdGhpcy5wYW5uZXIubWF4RGlzdGFuY2U9dCx0aGlzfXNldERpcmVjdGlvbmFsQ29uZSh0LGUsbil7cmV0dXJuIHRoaXMucGFubmVyLmNvbmVJbm5lckFuZ2xlPXQsdGhpcy5wYW5uZXIuY29uZU91dGVyQW5nbGU9ZSx0aGlzLnBhbm5lci5jb25lT3V0ZXJHYWluPW4sdGhpc311cGRhdGVNYXRyaXhXb3JsZCh0KXtpZihzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KSwhMD09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sJiYhMT09PXRoaXMuaXNQbGF5aW5nKXJldHVybjt0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShLOXQsWjl0LEo5dCksUTl0LnNldCgwLDAsMSkuYXBwbHlRdWF0ZXJuaW9uKFo5dCk7Y29uc3QgZT10aGlzLnBhbm5lcjtpZihlLnBvc2l0aW9uWCl7Y29uc3QgdD10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdGhpcy5saXN0ZW5lci50aW1lRGVsdGE7ZS5wb3NpdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoSzl0LngsdCksZS5wb3NpdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoSzl0LnksdCksZS5wb3NpdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoSzl0LnosdCksZS5vcmllbnRhdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoUTl0LngsdCksZS5vcmllbnRhdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoUTl0LnksdCksZS5vcmllbnRhdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoUTl0LnosdCl9ZWxzZSBlLnNldFBvc2l0aW9uKEs5dC54LEs5dC55LEs5dC56KSxlLnNldE9yaWVudGF0aW9uKFE5dC54LFE5dC55LFE5dC56KX19LFByb3BlcnR5QmluZGluZzpoOHQsUHJvcGVydHlNaXhlcjplOHQsUXVhZHJhdGljQmV6aWVyQ3VydmU6QzR0LFF1YWRyYXRpY0JlemllckN1cnZlMzpBNHQsUXVhdGVybmlvbjpUSnQsUXVhdGVybmlvbktleWZyYW1lVHJhY2s6VjZ0LFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudDpGNnQsUkVWSVNJT046Qkt0LFJHQkFEZXB0aFBhY2tpbmc6MzIwMSxSR0JBRm9ybWF0OmhadCxSR0JBSW50ZWdlckZvcm1hdDoxMDMzLFJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQ6Mzc4MTksUkdCQV9BU1RDXzEweDVfRm9ybWF0OjM3ODE2LFJHQkFfQVNUQ18xMHg2X0Zvcm1hdDozNzgxNyxSR0JBX0FTVENfMTB4OF9Gb3JtYXQ6Mzc4MTgsUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdDozNzgyMCxSR0JBX0FTVENfMTJ4MTJfRm9ybWF0OjM3ODIxLFJHQkFfQVNUQ180eDRfRm9ybWF0OjM3ODA4LFJHQkFfQVNUQ181eDRfRm9ybWF0OjM3ODA5LFJHQkFfQVNUQ181eDVfRm9ybWF0OjM3ODEwLFJHQkFfQVNUQ182eDVfRm9ybWF0OjM3ODExLFJHQkFfQVNUQ182eDZfRm9ybWF0OjM3ODEyLFJHQkFfQVNUQ184eDVfRm9ybWF0OjM3ODEzLFJHQkFfQVNUQ184eDZfRm9ybWF0OjM3ODE0LFJHQkFfQVNUQ184eDhfRm9ybWF0OjM3ODE1LFJHQkFfQlBUQ19Gb3JtYXQ6MzY0OTIsUkdCQV9FVEMyX0VBQ19Gb3JtYXQ6U1p0LFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdDp4WnQsUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0OmJadCxSR0JBX1MzVENfRFhUMV9Gb3JtYXQ6bVp0LFJHQkFfUzNUQ19EWFQzX0Zvcm1hdDpnWnQsUkdCQV9TM1RDX0RYVDVfRm9ybWF0Ol9adCxSR0JERW5jb2Rpbmc6Qlp0LFJHQkVFbmNvZGluZzpPWnQsUkdCRUZvcm1hdDoxMDIzLFJHQkZvcm1hdDp1WnQsUkdCSW50ZWdlckZvcm1hdDoxMDMyLFJHQk0xNkVuY29kaW5nOkRadCxSR0JNN0VuY29kaW5nOnpadCxSR0JfRVRDMV9Gb3JtYXQ6MzYxOTYsUkdCX0VUQzJfRm9ybWF0OndadCxSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdDp2WnQsUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQ6eVp0LFJHQl9TM1RDX0RYVDFfRm9ybWF0OmZadCxSR0Zvcm1hdDoxMDMwLFJHSW50ZWdlckZvcm1hdDoxMDMxLFJhd1NoYWRlck1hdGVyaWFsOl8wdCxSYXk6aVF0LFJheWNhc3RlcjpjbGFzc3tjb25zdHJ1Y3Rvcih0LGUsbj0wLGk9MS8wKXt0aGlzLnJheT1uZXcgaVF0KHQsZSksdGhpcy5uZWFyPW4sdGhpcy5mYXI9aSx0aGlzLmNhbWVyYT1udWxsLHRoaXMubGF5ZXJzPW5ldyBtUXQsdGhpcy5wYXJhbXM9e01lc2g6e30sTGluZTp7dGhyZXNob2xkOjF9LExPRDp7fSxQb2ludHM6e3RocmVzaG9sZDoxfSxTcHJpdGU6e319fXNldCh0LGUpe3RoaXMucmF5LnNldCh0LGUpfXNldEZyb21DYW1lcmEodCxlKXtlJiZlLmlzUGVyc3BlY3RpdmVDYW1lcmE/KHRoaXMucmF5Lm9yaWdpbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oZS5tYXRyaXhXb3JsZCksdGhpcy5yYXkuZGlyZWN0aW9uLnNldCh0LngsdC55LC41KS51bnByb2plY3QoZSkuc3ViKHRoaXMucmF5Lm9yaWdpbikubm9ybWFsaXplKCksdGhpcy5jYW1lcmE9ZSk6ZSYmZS5pc09ydGhvZ3JhcGhpY0NhbWVyYT8odGhpcy5yYXkub3JpZ2luLnNldCh0LngsdC55LChlLm5lYXIrZS5mYXIpLyhlLm5lYXItZS5mYXIpKS51bnByb2plY3QoZSksdGhpcy5yYXkuZGlyZWN0aW9uLnNldCgwLDAsLTEpLnRyYW5zZm9ybURpcmVjdGlvbihlLm1hdHJpeFdvcmxkKSx0aGlzLmNhbWVyYT1lKTpjb25zb2xlLmVycm9yKCJUSFJFRS5SYXljYXN0ZXI6IFVuc3VwcG9ydGVkIGNhbWVyYSB0eXBlOiAiK2UudHlwZSl9aW50ZXJzZWN0T2JqZWN0KHQsZT0hMSxuPVtdKXtyZXR1cm4gdjh0KHQsdGhpcyxuLGUpLG4uc29ydCh5OHQpLG59aW50ZXJzZWN0T2JqZWN0cyh0LGU9ITEsbj1bXSl7Zm9yKGxldCBpPTAscj10Lmxlbmd0aDtpPHI7aSsrKXY4dCh0W2ldLHRoaXMsbixlKTtyZXR1cm4gbi5zb3J0KHk4dCksbn19LFJlY3RBcmVhTGlnaHQ6eDl0LFJlZEZvcm1hdDoxMDI4LFJlZEludGVnZXJGb3JtYXQ6MTAyOSxSZWluaGFyZFRvbmVNYXBwaW5nOjIsUmVwZWF0V3JhcHBpbmc6JEt0LFJlcGxhY2VTdGVuY2lsT3A6NzY4MSxSZXZlcnNlU3VidHJhY3RFcXVhdGlvbjoxMDIsUmluZ0J1ZmZlckdlb21ldHJ5OnU2dCxSaW5nR2VvbWV0cnk6dTZ0LFNSR0I4X0FMUEhBOF9BU1RDXzEweDEwX0Zvcm1hdDozNzg1MSxTUkdCOF9BTFBIQThfQVNUQ18xMHg1X0Zvcm1hdDozNzg0OCxTUkdCOF9BTFBIQThfQVNUQ18xMHg2X0Zvcm1hdDozNzg0OSxTUkdCOF9BTFBIQThfQVNUQ18xMHg4X0Zvcm1hdDozNzg1MCxTUkdCOF9BTFBIQThfQVNUQ18xMngxMF9Gb3JtYXQ6Mzc4NTIsU1JHQjhfQUxQSEE4X0FTVENfMTJ4MTJfRm9ybWF0OjM3ODUzLFNSR0I4X0FMUEhBOF9BU1RDXzR4NF9Gb3JtYXQ6Mzc4NDAsU1JHQjhfQUxQSEE4X0FTVENfNXg0X0Zvcm1hdDozNzg0MSxTUkdCOF9BTFBIQThfQVNUQ181eDVfRm9ybWF0OjM3ODQyLFNSR0I4X0FMUEhBOF9BU1RDXzZ4NV9Gb3JtYXQ6Mzc4NDMsU1JHQjhfQUxQSEE4X0FTVENfNng2X0Zvcm1hdDozNzg0NCxTUkdCOF9BTFBIQThfQVNUQ184eDVfRm9ybWF0OjM3ODQ1LFNSR0I4X0FMUEhBOF9BU1RDXzh4Nl9Gb3JtYXQ6Mzc4NDYsU1JHQjhfQUxQSEE4X0FTVENfOHg4X0Zvcm1hdDozNzg0NyxTY2VuZTpYNXQsU2NlbmVVdGlsczpaOHQsU2hhZGVyQ2h1bms6czB0LFNoYWRlckxpYjpjMHQsU2hhZGVyTWF0ZXJpYWw6RzF0LFNoYWRvd01hdGVyaWFsOng2dCxTaGFwZTpyOXQsU2hhcGVCdWZmZXJHZW9tZXRyeTpoNnQsU2hhcGVHZW9tZXRyeTpoNnQsU2hhcGVQYXRoOkk5dCxTaGFwZVV0aWxzOmU2dCxTaG9ydFR5cGU6MTAxMSxTa2VsZXRvbjpDM3QsU2tlbGV0b25IZWxwZXI6UDh0LFNraW5uZWRNZXNoOnczdCxTbW9vdGhTaGFkaW5nOjIsU3BoZXJlOiRKdCxTcGhlcmVCdWZmZXJHZW9tZXRyeTpkNnQsU3BoZXJlR2VvbWV0cnk6ZDZ0LFNwaGVyaWNhbDpiOHQsU3BoZXJpY2FsSGFybW9uaWNzMzp3OXQsU3BsaW5lQ3VydmU6azR0LFNwb3RMaWdodDpkOXQsU3BvdExpZ2h0SGVscGVyOmNsYXNzIGV4dGVuZHMga1F0e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoKSx0aGlzLmxpZ2h0PXQsdGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpLHRoaXMubWF0cml4PXQubWF0cml4V29ybGQsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuY29sb3I9ZTtjb25zdCBuPW5ldyBiMXQsaT1bMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsLTEsMCwxLDAsMCwwLDAsMSwxLDAsMCwwLDAsLTEsMV07Zm9yKGxldCB0PTAsZT0xLG49MzI7dDxuO3QrKyxlKyspe2NvbnN0IHI9dC9uKk1hdGguUEkqMixvPWUvbipNYXRoLlBJKjI7aS5wdXNoKE1hdGguY29zKHIpLE1hdGguc2luKHIpLDEsTWF0aC5jb3MobyksTWF0aC5zaW4obyksMSl9bi5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KGksMykpO2NvbnN0IHI9bmV3IEkzdCh7Zm9nOiExLHRvbmVNYXBwZWQ6ITF9KTt0aGlzLmNvbmU9bmV3IFUzdChuLHIpLHRoaXMuYWRkKHRoaXMuY29uZSksdGhpcy51cGRhdGUoKX1kaXNwb3NlKCl7dGhpcy5jb25lLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLmNvbmUubWF0ZXJpYWwuZGlzcG9zZSgpfXVwZGF0ZSgpe3RoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTtjb25zdCB0PXRoaXMubGlnaHQuZGlzdGFuY2U/dGhpcy5saWdodC5kaXN0YW5jZToxZTMsZT10Kk1hdGgudGFuKHRoaXMubGlnaHQuYW5nbGUpO3RoaXMuY29uZS5zY2FsZS5zZXQoZSxlLHQpLEM4dC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC50YXJnZXQubWF0cml4V29ybGQpLHRoaXMuY29uZS5sb29rQXQoQzh0KSx2b2lkIDAhPT10aGlzLmNvbG9yP3RoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik6dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcil9fSxTcHJpdGU6ZDN0LFNwcml0ZU1hdGVyaWFsOko1dCxTcmNBbHBoYUZhY3RvcjoyMDQsU3JjQWxwaGFTYXR1cmF0ZUZhY3RvcjoyMTAsU3JjQ29sb3JGYWN0b3I6MjAyLFN0YXRpY0NvcHlVc2FnZTozNTA0NixTdGF0aWNEcmF3VXNhZ2U6Rlp0LFN0YXRpY1JlYWRVc2FnZTozNTA0NSxTdGVyZW9DYW1lcmE6Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLnR5cGU9IlN0ZXJlb0NhbWVyYSIsdGhpcy5hc3BlY3Q9MSx0aGlzLmV5ZVNlcD0uMDY0LHRoaXMuY2FtZXJhTD1uZXcgcTF0LHRoaXMuY2FtZXJhTC5sYXllcnMuZW5hYmxlKDEpLHRoaXMuY2FtZXJhTC5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuY2FtZXJhUj1uZXcgcTF0LHRoaXMuY2FtZXJhUi5sYXllcnMuZW5hYmxlKDIpLHRoaXMuY2FtZXJhUi5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuX2NhY2hlPXtmb2N1czpudWxsLGZvdjpudWxsLGFzcGVjdDpudWxsLG5lYXI6bnVsbCxmYXI6bnVsbCx6b29tOm51bGwsZXllU2VwOm51bGx9fXVwZGF0ZSh0KXtjb25zdCBlPXRoaXMuX2NhY2hlO2lmKGUuZm9jdXMhPT10LmZvY3VzfHxlLmZvdiE9PXQuZm92fHxlLmFzcGVjdCE9PXQuYXNwZWN0KnRoaXMuYXNwZWN0fHxlLm5lYXIhPT10Lm5lYXJ8fGUuZmFyIT09dC5mYXJ8fGUuem9vbSE9PXQuem9vbXx8ZS5leWVTZXAhPT10aGlzLmV5ZVNlcCl7ZS5mb2N1cz10LmZvY3VzLGUuZm92PXQuZm92LGUuYXNwZWN0PXQuYXNwZWN0KnRoaXMuYXNwZWN0LGUubmVhcj10Lm5lYXIsZS5mYXI9dC5mYXIsZS56b29tPXQuem9vbSxlLmV5ZVNlcD10aGlzLmV5ZVNlcDtjb25zdCBuPXQucHJvamVjdGlvbk1hdHJpeC5jbG9uZSgpLGk9ZS5leWVTZXAvMixyPWkqZS5uZWFyL2UuZm9jdXMsbz1lLm5lYXIqTWF0aC50YW4ocVp0KmUuZm92Ki41KS9lLnpvb207bGV0IGEscztVOXQuZWxlbWVudHNbMTJdPS1pLFY5dC5lbGVtZW50c1sxMl09aSxhPS1vKmUuYXNwZWN0K3Iscz1vKmUuYXNwZWN0K3Isbi5lbGVtZW50c1swXT0yKmUubmVhci8ocy1hKSxuLmVsZW1lbnRzWzhdPShzK2EpLyhzLWEpLHRoaXMuY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4LmNvcHkobiksYT0tbyplLmFzcGVjdC1yLHM9byplLmFzcGVjdC1yLG4uZWxlbWVudHNbMF09MiplLm5lYXIvKHMtYSksbi5lbGVtZW50c1s4XT0ocythKS8ocy1hKSx0aGlzLmNhbWVyYVIucHJvamVjdGlvbk1hdHJpeC5jb3B5KG4pfXRoaXMuY2FtZXJhTC5tYXRyaXhXb3JsZC5jb3B5KHQubWF0cml4V29ybGQpLm11bHRpcGx5KFU5dCksdGhpcy5jYW1lcmFSLm1hdHJpeFdvcmxkLmNvcHkodC5tYXRyaXhXb3JsZCkubXVsdGlwbHkoVjl0KX19LFN0cmVhbUNvcHlVc2FnZTozNTA0MixTdHJlYW1EcmF3VXNhZ2U6MzUwNDAsU3RyZWFtUmVhZFVzYWdlOjM1MDQxLFN0cmluZ0tleWZyYW1lVHJhY2s6VTZ0LFN1YnRyYWN0RXF1YXRpb246MTAxLFN1YnRyYWN0aXZlQmxlbmRpbmc6MyxUT1VDSDpGS3QsVGFuZ2VudFNwYWNlTm9ybWFsTWFwOjAsVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeTpwNnQsVGV0cmFoZWRyb25HZW9tZXRyeTpwNnQsVGV4dEJ1ZmZlckdlb21ldHJ5OmY2dCxUZXh0R2VvbWV0cnk6ZjZ0LFRleHR1cmU6Ykp0LFRleHR1cmVMb2FkZXI6ZTl0LFRvcnVzQnVmZmVyR2VvbWV0cnk6bTZ0LFRvcnVzR2VvbWV0cnk6bTZ0LFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5Omc2dCxUb3J1c0tub3RHZW9tZXRyeTpnNnQsVHJpYW5nbGU6RlF0LFRyaWFuZ2xlRmFuRHJhd01vZGU6MixUcmlhbmdsZVN0cmlwRHJhd01vZGU6MSxUcmlhbmdsZXNEcmF3TW9kZTowLFR1YmVCdWZmZXJHZW9tZXRyeTpfNnQsVHViZUdlb21ldHJ5Ol82dCxVVk1hcHBpbmc6VUt0LFVpbnQxNkF0dHJpYnV0ZTpmdW5jdGlvbiBiN3QodCxlKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5VaW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpLG5ldyByMXQodCxlKX0sVWludDE2QnVmZmVyQXR0cmlidXRlOnIxdCxVaW50MzJBdHRyaWJ1dGU6ZnVuY3Rpb24geDd0KHQsZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVWludDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKSxuZXcgYTF0KHQsZSl9LFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZTphMXQsVWludDhBdHRyaWJ1dGU6ZnVuY3Rpb24gdzd0KHQsZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVWludDhBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIiksbmV3IGUxdCh0LGUpfSxVaW50OEJ1ZmZlckF0dHJpYnV0ZTplMXQsVWludDhDbGFtcGVkQXR0cmlidXRlOmZ1bmN0aW9uIFM3dCh0LGUpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlVpbnQ4Q2xhbXBlZEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIiksbmV3IG4xdCh0LGUpfSxVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU6bjF0LFVuaWZvcm06bTh0LFVuaWZvcm1zTGliOmwwdCxVbmlmb3Jtc1V0aWxzOmoxdCxVbnNpZ25lZEJ5dGVUeXBlOnJadCxVbnNpZ25lZEludDI0OFR5cGU6Y1p0LFVuc2lnbmVkSW50VHlwZTphWnQsVW5zaWduZWRTaG9ydDQ0NDRUeXBlOjEwMTcsVW5zaWduZWRTaG9ydDU1NTFUeXBlOjEwMTgsVW5zaWduZWRTaG9ydDU2NVR5cGU6MTAxOSxVbnNpZ25lZFNob3J0VHlwZTpvWnQsVlNNU2hhZG93TWFwOjMsVmVjdG9yMjptSnQsVmVjdG9yMzpDSnQsVmVjdG9yNDp3SnQsVmVjdG9yS2V5ZnJhbWVUcmFjazpqNnQsVmVydGV4OmZ1bmN0aW9uIE03dCh0LGUsbil7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVydGV4IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5WZWN0b3IzIGluc3RlYWQuIiksbmV3IENKdCh0LGUsbil9LFZlcnRleENvbG9yczoyLFZpZGVvVGV4dHVyZTpaM3QsV2ViR0wxUmVuZGVyZXI6VzV0LFdlYkdMQ3ViZVJlbmRlclRhcmdldDpLMXQsV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHM6TUp0LFdlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQ6RUp0LFdlYkdMUmVuZGVyVGFyZ2V0OlNKdCxXZWJHTFJlbmRlclRhcmdldEN1YmU6ZnVuY3Rpb24gRTd0KHQsZSxuKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldEN1YmUoIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKSBpcyBub3cgV2ViR0xDdWJlUmVuZGVyVGFyZ2V0KCBzaXplLCBvcHRpb25zICkuIiksbmV3IEsxdCh0LG4pfSxXZWJHTFJlbmRlcmVyOkc1dCxXZWJHTFV0aWxzOkQ1dCxXaXJlZnJhbWVHZW9tZXRyeTp5NnQsV2lyZWZyYW1lSGVscGVyOmZ1bmN0aW9uIFQ3dCh0LGUpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldpcmVmcmFtZUhlbHBlciBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuV2lyZWZyYW1lR2VvbWV0cnkgaW5zdGVhZC4iKSxuZXcgVTN0KG5ldyB5NnQodC5nZW9tZXRyeSksbmV3IEkzdCh7Y29sb3I6dm9pZCAwIT09ZT9lOjE2Nzc3MjE1fSkpfSxXcmFwQXJvdW5kRW5kaW5nOmtadCxYSFJMb2FkZXI6ZnVuY3Rpb24gQzd0KHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlhIUkxvYWRlciBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkZpbGVMb2FkZXIuIiksbmV3IFo2dCh0KX0sWmVyb0N1cnZhdHVyZUVuZGluZzpDWnQsWmVyb0ZhY3RvcjoyMDAsWmVyb1Nsb3BlRW5kaW5nOkFadCxaZXJvU3RlbmNpbE9wOjAsc1JHQkVuY29kaW5nOkladH0pO2NvbnN0IEE3dD17dHlwZToiY2hhbmdlIn0sazd0PXt0eXBlOiJzdGFydCJ9LEw3dD17dHlwZToiZW5kIn07Y2xhc3MgUDd0IGV4dGVuZHMgalp0e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoKSx2b2lkIDA9PT1lJiZjb25zb2xlLndhcm4oJ1RIUkVFLk9yYml0Q29udHJvbHM6IFRoZSBzZWNvbmQgcGFyYW1ldGVyICJkb21FbGVtZW50IiBpcyBub3cgbWFuZGF0b3J5LicpLGU9PT1kb2N1bWVudCYmY29uc29sZS5lcnJvcignVEhSRUUuT3JiaXRDb250cm9sczogImRvY3VtZW50IiBzaG91bGQgbm90IGJlIHVzZWQgYXMgdGhlIHRhcmdldCAiZG9tRWxlbWVudCIuIFBsZWFzZSB1c2UgInJlbmRlcmVyLmRvbUVsZW1lbnQiIGluc3RlYWQuJyksdGhpcy5vYmplY3Q9dCx0aGlzLmRvbUVsZW1lbnQ9ZSx0aGlzLmRvbUVsZW1lbnQuc3R5bGUudG91Y2hBY3Rpb249Im5vbmUiLHRoaXMuZW5hYmxlZD0hMCx0aGlzLnRhcmdldD1uZXcgQ0p0LHRoaXMubWluRGlzdGFuY2U9MCx0aGlzLm1heERpc3RhbmNlPTEvMCx0aGlzLm1pblpvb209MCx0aGlzLm1heFpvb209MS8wLHRoaXMubWluUG9sYXJBbmdsZT0wLHRoaXMubWF4UG9sYXJBbmdsZT1NYXRoLlBJLHRoaXMubWluQXppbXV0aEFuZ2xlPS0xLzAsdGhpcy5tYXhBemltdXRoQW5nbGU9MS8wLHRoaXMuZW5hYmxlRGFtcGluZz0hMSx0aGlzLmRhbXBpbmdGYWN0b3I9LjA1LHRoaXMuZW5hYmxlWm9vbT0hMCx0aGlzLnpvb21TcGVlZD0xLHRoaXMuZW5hYmxlUm90YXRlPSEwLHRoaXMucm90YXRlU3BlZWQ9MSx0aGlzLmVuYWJsZVBhbj0hMCx0aGlzLnBhblNwZWVkPTEsdGhpcy5zY3JlZW5TcGFjZVBhbm5pbmc9ITAsdGhpcy5rZXlQYW5TcGVlZD03LHRoaXMuYXV0b1JvdGF0ZT0hMSx0aGlzLmF1dG9Sb3RhdGVTcGVlZD0yLHRoaXMua2V5cz17TEVGVDoiQXJyb3dMZWZ0IixVUDoiQXJyb3dVcCIsUklHSFQ6IkFycm93UmlnaHQiLEJPVFRPTToiQXJyb3dEb3duIn0sdGhpcy5tb3VzZUJ1dHRvbnM9e0xFRlQ6SEt0LlJPVEFURSxNSURETEU6SEt0LkRPTExZLFJJR0hUOkhLdC5QQU59LHRoaXMudG91Y2hlcz17T05FOkZLdC5ST1RBVEUsVFdPOkZLdC5ET0xMWV9QQU59LHRoaXMudGFyZ2V0MD10aGlzLnRhcmdldC5jbG9uZSgpLHRoaXMucG9zaXRpb24wPXRoaXMub2JqZWN0LnBvc2l0aW9uLmNsb25lKCksdGhpcy56b29tMD10aGlzLm9iamVjdC56b29tLHRoaXMuX2RvbUVsZW1lbnRLZXlFdmVudHM9bnVsbCx0aGlzLmdldFBvbGFyQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5waGl9LHRoaXMuZ2V0QXppbXV0aGFsQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gYS50aGV0YX0sdGhpcy5nZXREaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9iamVjdC5wb3NpdGlvbi5kaXN0YW5jZVRvKHRoaXMudGFyZ2V0KX0sdGhpcy5saXN0ZW5Ub0tleUV2ZW50cz1mdW5jdGlvbih0KXt0LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGopLHRoaXMuX2RvbUVsZW1lbnRLZXlFdmVudHM9dH0sdGhpcy5zYXZlU3RhdGU9ZnVuY3Rpb24oKXtuLnRhcmdldDAuY29weShuLnRhcmdldCksbi5wb3NpdGlvbjAuY29weShuLm9iamVjdC5wb3NpdGlvbiksbi56b29tMD1uLm9iamVjdC56b29tfSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7bi50YXJnZXQuY29weShuLnRhcmdldDApLG4ub2JqZWN0LnBvc2l0aW9uLmNvcHkobi5wb3NpdGlvbjApLG4ub2JqZWN0Lnpvb209bi56b29tMCxuLm9iamVjdC51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCksbi5kaXNwYXRjaEV2ZW50KEE3dCksbi51cGRhdGUoKSxyPWkuTk9ORX0sdGhpcy51cGRhdGU9KGZ1bmN0aW9uKCl7Y29uc3QgZT1uZXcgQ0p0LGg9KG5ldyBUSnQpLnNldEZyb21Vbml0VmVjdG9ycyh0LnVwLG5ldyBDSnQoMCwxLDApKSxkPWguY2xvbmUoKS5pbnZlcnQoKSxwPW5ldyBDSnQsZj1uZXcgVEp0LG09MipNYXRoLlBJO3JldHVybiBmdW5jdGlvbiB0KCl7Y29uc3QgZz1uLm9iamVjdC5wb3NpdGlvbjtlLmNvcHkoZykuc3ViKG4udGFyZ2V0KSxlLmFwcGx5UXVhdGVybmlvbihoKSxhLnNldEZyb21WZWN0b3IzKGUpLG4uYXV0b1JvdGF0ZSYmcj09PWkuTk9ORSYmUygoZnVuY3Rpb24gXygpe3JldHVybiAyKk1hdGguUEkvNjAvNjAqbi5hdXRvUm90YXRlU3BlZWR9KSgpKSxuLmVuYWJsZURhbXBpbmc/KGEudGhldGErPXMudGhldGEqbi5kYW1waW5nRmFjdG9yLGEucGhpKz1zLnBoaSpuLmRhbXBpbmdGYWN0b3IpOihhLnRoZXRhKz1zLnRoZXRhLGEucGhpKz1zLnBoaSk7bGV0IHk9bi5taW5BemltdXRoQW5nbGUsdj1uLm1heEF6aW11dGhBbmdsZTtyZXR1cm4gaXNGaW5pdGUoeSkmJmlzRmluaXRlKHYpJiYoeTwtTWF0aC5QST95Kz1tOnk+TWF0aC5QSSYmKHktPW0pLHY8LU1hdGguUEk/dis9bTp2Pk1hdGguUEkmJih2LT1tKSxhLnRoZXRhPXk8PXY/TWF0aC5tYXgoeSxNYXRoLm1pbih2LGEudGhldGEpKTphLnRoZXRhPih5K3YpLzI/TWF0aC5tYXgoeSxhLnRoZXRhKTpNYXRoLm1pbih2LGEudGhldGEpKSxhLnBoaT1NYXRoLm1heChuLm1pblBvbGFyQW5nbGUsTWF0aC5taW4obi5tYXhQb2xhckFuZ2xlLGEucGhpKSksYS5tYWtlU2FmZSgpLGEucmFkaXVzKj1sLGEucmFkaXVzPU1hdGgubWF4KG4ubWluRGlzdGFuY2UsTWF0aC5taW4obi5tYXhEaXN0YW5jZSxhLnJhZGl1cykpLCEwPT09bi5lbmFibGVEYW1waW5nP24udGFyZ2V0LmFkZFNjYWxlZFZlY3RvcihjLG4uZGFtcGluZ0ZhY3Rvcik6bi50YXJnZXQuYWRkKGMpLGUuc2V0RnJvbVNwaGVyaWNhbChhKSxlLmFwcGx5UXVhdGVybmlvbihkKSxnLmNvcHkobi50YXJnZXQpLmFkZChlKSxuLm9iamVjdC5sb29rQXQobi50YXJnZXQpLCEwPT09bi5lbmFibGVEYW1waW5nPyhzLnRoZXRhKj0xLW4uZGFtcGluZ0ZhY3RvcixzLnBoaSo9MS1uLmRhbXBpbmdGYWN0b3IsYy5tdWx0aXBseVNjYWxhcigxLW4uZGFtcGluZ0ZhY3RvcikpOihzLnNldCgwLDAsMCksYy5zZXQoMCwwLDApKSxsPTEsISEodXx8cC5kaXN0YW5jZVRvU3F1YXJlZChuLm9iamVjdC5wb3NpdGlvbik+b3x8OCooMS1mLmRvdChuLm9iamVjdC5xdWF0ZXJuaW9uKSk+bykmJihuLmRpc3BhdGNoRXZlbnQoQTd0KSxwLmNvcHkobi5vYmplY3QucG9zaXRpb24pLGYuY29weShuLm9iamVjdC5xdWF0ZXJuaW9uKSx1PSExLCEwKX19KSgpLHRoaXMuZGlzcG9zZT1mdW5jdGlvbigpe24uZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsRyksbi5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIixCKSxuLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcmNhbmNlbCIsViksbi5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIndoZWVsIixVKSxuLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLEgpLG4uZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLEYpLG51bGwhPT1uLl9kb21FbGVtZW50S2V5RXZlbnRzJiZuLl9kb21FbGVtZW50S2V5RXZlbnRzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLGopfTtjb25zdCBuPXRoaXMsaT17Tk9ORTotMSxST1RBVEU6MCxET0xMWToxLFBBTjoyLFRPVUNIX1JPVEFURTozLFRPVUNIX1BBTjo0LFRPVUNIX0RPTExZX1BBTjo1LFRPVUNIX0RPTExZX1JPVEFURTo2fTtsZXQgcj1pLk5PTkU7Y29uc3Qgbz0xZS02LGE9bmV3IGI4dCxzPW5ldyBiOHQ7bGV0IGw9MTtjb25zdCBjPW5ldyBDSnQ7bGV0IHU9ITE7Y29uc3QgaD1uZXcgbUp0LGQ9bmV3IG1KdCxwPW5ldyBtSnQsZj1uZXcgbUp0LG09bmV3IG1KdCxnPW5ldyBtSnQsXz1uZXcgbUp0LHk9bmV3IG1KdCx2PW5ldyBtSnQsYj1bXSx4PXt9O2Z1bmN0aW9uIHcoKXtyZXR1cm4gTWF0aC5wb3coLjk1LG4uem9vbVNwZWVkKX1mdW5jdGlvbiBTKHQpe3MudGhldGEtPXR9ZnVuY3Rpb24gTSh0KXtzLnBoaS09dH1jb25zdCBFPShmdW5jdGlvbigpe2NvbnN0IHQ9bmV3IENKdDtyZXR1cm4gZnVuY3Rpb24gZShuLGkpe3Quc2V0RnJvbU1hdHJpeENvbHVtbihpLDApLHQubXVsdGlwbHlTY2FsYXIoLW4pLGMuYWRkKHQpfX0pKCksVD0oZnVuY3Rpb24oKXtjb25zdCB0PW5ldyBDSnQ7cmV0dXJuIGZ1bmN0aW9uIGUoaSxyKXshMD09PW4uc2NyZWVuU3BhY2VQYW5uaW5nP3Quc2V0RnJvbU1hdHJpeENvbHVtbihyLDEpOih0LnNldEZyb21NYXRyaXhDb2x1bW4ociwwKSx0LmNyb3NzVmVjdG9ycyhuLm9iamVjdC51cCx0KSksdC5tdWx0aXBseVNjYWxhcihpKSxjLmFkZCh0KX19KSgpLEM9KGZ1bmN0aW9uKCl7Y29uc3QgdD1uZXcgQ0p0O3JldHVybiBmdW5jdGlvbiBlKGkscil7Y29uc3Qgbz1uLmRvbUVsZW1lbnQ7aWYobi5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYSl7dC5jb3B5KG4ub2JqZWN0LnBvc2l0aW9uKS5zdWIobi50YXJnZXQpO2xldCBlPXQubGVuZ3RoKCk7ZSo9TWF0aC50YW4obi5vYmplY3QuZm92LzIqTWF0aC5QSS8xODApLEUoMippKmUvby5jbGllbnRIZWlnaHQsbi5vYmplY3QubWF0cml4KSxUKDIqciplL28uY2xpZW50SGVpZ2h0LG4ub2JqZWN0Lm1hdHJpeCl9ZWxzZSBuLm9iamVjdC5pc09ydGhvZ3JhcGhpY0NhbWVyYT8oRShpKihuLm9iamVjdC5yaWdodC1uLm9iamVjdC5sZWZ0KS9uLm9iamVjdC56b29tL28uY2xpZW50V2lkdGgsbi5vYmplY3QubWF0cml4KSxUKHIqKG4ub2JqZWN0LnRvcC1uLm9iamVjdC5ib3R0b20pL24ub2JqZWN0Lnpvb20vby5jbGllbnRIZWlnaHQsbi5vYmplY3QubWF0cml4KSk6KGNvbnNvbGUud2FybigiV0FSTklORzogT3JiaXRDb250cm9scy5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gcGFuIGRpc2FibGVkLiIpLG4uZW5hYmxlUGFuPSExKX19KSgpO2Z1bmN0aW9uIEEodCl7bi5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYT9sLz10Om4ub2JqZWN0LmlzT3J0aG9ncmFwaGljQ2FtZXJhPyhuLm9iamVjdC56b29tPU1hdGgubWF4KG4ubWluWm9vbSxNYXRoLm1pbihuLm1heFpvb20sbi5vYmplY3Quem9vbSp0KSksbi5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpLHU9ITApOihjb25zb2xlLndhcm4oIldBUk5JTkc6IE9yYml0Q29udHJvbHMuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93biBjYW1lcmEgdHlwZSAtIGRvbGx5L3pvb20gZGlzYWJsZWQuIiksbi5lbmFibGVab29tPSExKX1mdW5jdGlvbiBrKHQpe24ub2JqZWN0LmlzUGVyc3BlY3RpdmVDYW1lcmE/bCo9dDpuLm9iamVjdC5pc09ydGhvZ3JhcGhpY0NhbWVyYT8obi5vYmplY3Quem9vbT1NYXRoLm1heChuLm1pblpvb20sTWF0aC5taW4obi5tYXhab29tLG4ub2JqZWN0Lnpvb20vdCkpLG4ub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSx1PSEwKTooY29uc29sZS53YXJuKCJXQVJOSU5HOiBPcmJpdENvbnRyb2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBkb2xseS96b29tIGRpc2FibGVkLiIpLG4uZW5hYmxlWm9vbT0hMSl9ZnVuY3Rpb24gTCh0KXtoLnNldCh0LmNsaWVudFgsdC5jbGllbnRZKX1mdW5jdGlvbiBQKHQpe2Yuc2V0KHQuY2xpZW50WCx0LmNsaWVudFkpfWZ1bmN0aW9uIE4oKXsxPT09Yi5sZW5ndGg/aC5zZXQoYlswXS5wYWdlWCxiWzBdLnBhZ2VZKTpoLnNldCguNSooYlswXS5wYWdlWCtiWzFdLnBhZ2VYKSwuNSooYlswXS5wYWdlWStiWzFdLnBhZ2VZKSl9ZnVuY3Rpb24gSSgpezE9PT1iLmxlbmd0aD9mLnNldChiWzBdLnBhZ2VYLGJbMF0ucGFnZVkpOmYuc2V0KC41KihiWzBdLnBhZ2VYK2JbMV0ucGFnZVgpLC41KihiWzBdLnBhZ2VZK2JbMV0ucGFnZVkpKX1mdW5jdGlvbiBSKCl7Y29uc3QgdD1iWzBdLnBhZ2VYLWJbMV0ucGFnZVgsZT1iWzBdLnBhZ2VZLWJbMV0ucGFnZVksbj1NYXRoLnNxcnQodCp0K2UqZSk7Xy5zZXQoMCxuKX1mdW5jdGlvbiBPKHQpe2lmKDE9PWIubGVuZ3RoKWQuc2V0KHQucGFnZVgsdC5wYWdlWSk7ZWxzZXtjb25zdCBlPVkodCk7ZC5zZXQoLjUqKHQucGFnZVgrZS54KSwuNSoodC5wYWdlWStlLnkpKX1wLnN1YlZlY3RvcnMoZCxoKS5tdWx0aXBseVNjYWxhcihuLnJvdGF0ZVNwZWVkKTtjb25zdCBlPW4uZG9tRWxlbWVudDtTKDIqTWF0aC5QSSpwLngvZS5jbGllbnRIZWlnaHQpLE0oMipNYXRoLlBJKnAueS9lLmNsaWVudEhlaWdodCksaC5jb3B5KGQpfWZ1bmN0aW9uIHoodCl7aWYoMT09PWIubGVuZ3RoKW0uc2V0KHQucGFnZVgsdC5wYWdlWSk7ZWxzZXtjb25zdCBlPVkodCk7bS5zZXQoLjUqKHQucGFnZVgrZS54KSwuNSoodC5wYWdlWStlLnkpKX1nLnN1YlZlY3RvcnMobSxmKS5tdWx0aXBseVNjYWxhcihuLnBhblNwZWVkKSxDKGcueCxnLnkpLGYuY29weShtKX1mdW5jdGlvbiBEKHQpe2NvbnN0IGU9WSh0KSxpPXQucGFnZVgtZS54LHI9dC5wYWdlWS1lLnksbz1NYXRoLnNxcnQoaSppK3Iqcik7eS5zZXQoMCxvKSx2LnNldCgwLE1hdGgucG93KHkueS9fLnksbi56b29tU3BlZWQpKSxBKHYueSksXy5jb3B5KHkpfWZ1bmN0aW9uIEIodCl7ITEhPT1uLmVuYWJsZWQmJigwPT09Yi5sZW5ndGgmJihuLmRvbUVsZW1lbnQuc2V0UG9pbnRlckNhcHR1cmUodC5wb2ludGVySWQpLG4uZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsSCksbi5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsRikpLChmdW5jdGlvbiBlKHQpe2IucHVzaCh0KX0pKHQpLCJ0b3VjaCI9PT10LnBvaW50ZXJUeXBlPyhmdW5jdGlvbiBvKHQpe3N3aXRjaChxKHQpLGIubGVuZ3RoKXtjYXNlIDE6c3dpdGNoKG4udG91Y2hlcy5PTkUpe2Nhc2UgRkt0LlJPVEFURTppZighMT09PW4uZW5hYmxlUm90YXRlKXJldHVybjtOKCkscj1pLlRPVUNIX1JPVEFURTticmVhaztjYXNlIEZLdC5QQU46aWYoITE9PT1uLmVuYWJsZVBhbilyZXR1cm47SSgpLHI9aS5UT1VDSF9QQU47YnJlYWs7ZGVmYXVsdDpyPWkuTk9ORX1icmVhaztjYXNlIDI6c3dpdGNoKG4udG91Y2hlcy5UV08pe2Nhc2UgRkt0LkRPTExZX1BBTjppZighMT09PW4uZW5hYmxlWm9vbSYmITE9PT1uLmVuYWJsZVBhbilyZXR1cm47IShmdW5jdGlvbiB0KCl7bi5lbmFibGVab29tJiZSKCksbi5lbmFibGVQYW4mJkkoKX0pKCkscj1pLlRPVUNIX0RPTExZX1BBTjticmVhaztjYXNlIEZLdC5ET0xMWV9ST1RBVEU6aWYoITE9PT1uLmVuYWJsZVpvb20mJiExPT09bi5lbmFibGVSb3RhdGUpcmV0dXJuOyEoZnVuY3Rpb24gZSgpe24uZW5hYmxlWm9vbSYmUigpLG4uZW5hYmxlUm90YXRlJiZOKCl9KSgpLHI9aS5UT1VDSF9ET0xMWV9ST1RBVEU7YnJlYWs7ZGVmYXVsdDpyPWkuTk9ORX1icmVhaztkZWZhdWx0OnI9aS5OT05FfXIhPT1pLk5PTkUmJm4uZGlzcGF0Y2hFdmVudChrN3QpfSkodCk6KGZ1bmN0aW9uIGEodCl7bGV0IGU7c3dpdGNoKHQuYnV0dG9uKXtjYXNlIDA6ZT1uLm1vdXNlQnV0dG9ucy5MRUZUO2JyZWFrO2Nhc2UgMTplPW4ubW91c2VCdXR0b25zLk1JRERMRTticmVhaztjYXNlIDI6ZT1uLm1vdXNlQnV0dG9ucy5SSUdIVDticmVhaztkZWZhdWx0OmU9LTF9c3dpdGNoKGUpe2Nhc2UgSEt0LkRPTExZOmlmKCExPT09bi5lbmFibGVab29tKXJldHVybjshKGZ1bmN0aW9uIGUodCl7Xy5zZXQodC5jbGllbnRYLHQuY2xpZW50WSl9KSh0KSxyPWkuRE9MTFk7YnJlYWs7Y2FzZSBIS3QuUk9UQVRFOmlmKHQuY3RybEtleXx8dC5tZXRhS2V5fHx0LnNoaWZ0S2V5KXtpZighMT09PW4uZW5hYmxlUGFuKXJldHVybjtQKHQpLHI9aS5QQU59ZWxzZXtpZighMT09PW4uZW5hYmxlUm90YXRlKXJldHVybjtMKHQpLHI9aS5ST1RBVEV9YnJlYWs7Y2FzZSBIS3QuUEFOOmlmKHQuY3RybEtleXx8dC5tZXRhS2V5fHx0LnNoaWZ0S2V5KXtpZighMT09PW4uZW5hYmxlUm90YXRlKXJldHVybjtMKHQpLHI9aS5ST1RBVEV9ZWxzZXtpZighMT09PW4uZW5hYmxlUGFuKXJldHVybjtQKHQpLHI9aS5QQU59YnJlYWs7ZGVmYXVsdDpyPWkuTk9ORX1yIT09aS5OT05FJiZuLmRpc3BhdGNoRXZlbnQoazd0KX0pKHQpKX1mdW5jdGlvbiBIKHQpeyExIT09bi5lbmFibGVkJiYoInRvdWNoIj09PXQucG9pbnRlclR5cGU/KGZ1bmN0aW9uIGUodCl7c3dpdGNoKHEodCkscil7Y2FzZSBpLlRPVUNIX1JPVEFURTppZighMT09PW4uZW5hYmxlUm90YXRlKXJldHVybjtPKHQpLG4udXBkYXRlKCk7YnJlYWs7Y2FzZSBpLlRPVUNIX1BBTjppZighMT09PW4uZW5hYmxlUGFuKXJldHVybjt6KHQpLG4udXBkYXRlKCk7YnJlYWs7Y2FzZSBpLlRPVUNIX0RPTExZX1BBTjppZighMT09PW4uZW5hYmxlWm9vbSYmITE9PT1uLmVuYWJsZVBhbilyZXR1cm47IShmdW5jdGlvbiBlKHQpe24uZW5hYmxlWm9vbSYmRCh0KSxuLmVuYWJsZVBhbiYmeih0KX0pKHQpLG4udXBkYXRlKCk7YnJlYWs7Y2FzZSBpLlRPVUNIX0RPTExZX1JPVEFURTppZighMT09PW4uZW5hYmxlWm9vbSYmITE9PT1uLmVuYWJsZVJvdGF0ZSlyZXR1cm47IShmdW5jdGlvbiBvKHQpe24uZW5hYmxlWm9vbSYmRCh0KSxuLmVuYWJsZVJvdGF0ZSYmTyh0KX0pKHQpLG4udXBkYXRlKCk7YnJlYWs7ZGVmYXVsdDpyPWkuTk9ORX19KSh0KTooZnVuY3Rpb24gbyh0KXtpZighMSE9PW4uZW5hYmxlZClzd2l0Y2gocil7Y2FzZSBpLlJPVEFURTppZighMT09PW4uZW5hYmxlUm90YXRlKXJldHVybjshKGZ1bmN0aW9uIGUodCl7ZC5zZXQodC5jbGllbnRYLHQuY2xpZW50WSkscC5zdWJWZWN0b3JzKGQsaCkubXVsdGlwbHlTY2FsYXIobi5yb3RhdGVTcGVlZCk7Y29uc3QgZT1uLmRvbUVsZW1lbnQ7UygyKk1hdGguUEkqcC54L2UuY2xpZW50SGVpZ2h0KSxNKDIqTWF0aC5QSSpwLnkvZS5jbGllbnRIZWlnaHQpLGguY29weShkKSxuLnVwZGF0ZSgpfSkodCk7YnJlYWs7Y2FzZSBpLkRPTExZOmlmKCExPT09bi5lbmFibGVab29tKXJldHVybjshKGZ1bmN0aW9uIHIodCl7eS5zZXQodC5jbGllbnRYLHQuY2xpZW50WSksdi5zdWJWZWN0b3JzKHksXyksdi55PjA/QSh3KCkpOnYueTwwJiZrKHcoKSksXy5jb3B5KHkpLG4udXBkYXRlKCl9KSh0KTticmVhaztjYXNlIGkuUEFOOmlmKCExPT09bi5lbmFibGVQYW4pcmV0dXJuOyEoZnVuY3Rpb24gbyh0KXttLnNldCh0LmNsaWVudFgsdC5jbGllbnRZKSxnLnN1YlZlY3RvcnMobSxmKS5tdWx0aXBseVNjYWxhcihuLnBhblNwZWVkKSxDKGcueCxnLnkpLGYuY29weShtKSxuLnVwZGF0ZSgpfSkodCl9fSkodCkpfWZ1bmN0aW9uIEYodCl7ITEhPT1uLmVuYWJsZWQmJigidG91Y2giPT09dC5wb2ludGVyVHlwZT8oZnVuY3Rpb24gZSh0KXtuLmRpc3BhdGNoRXZlbnQoTDd0KSxyPWkuTk9ORX0pKCk6KGZ1bmN0aW9uIG8odCl7bi5kaXNwYXRjaEV2ZW50KEw3dCkscj1pLk5PTkV9KSgpLFcodCksMD09PWIubGVuZ3RoJiYobi5kb21FbGVtZW50LnJlbGVhc2VQb2ludGVyQ2FwdHVyZSh0LnBvaW50ZXJJZCksbi5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIixIKSxuLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIixGKSkpfWZ1bmN0aW9uIFYodCl7Vyh0KX1mdW5jdGlvbiBVKHQpeyExPT09bi5lbmFibGVkfHwhMT09PW4uZW5hYmxlWm9vbXx8ciE9PWkuTk9ORSYmciE9PWkuUk9UQVRFfHwodC5wcmV2ZW50RGVmYXVsdCgpLG4uZGlzcGF0Y2hFdmVudChrN3QpLChmdW5jdGlvbiBlKHQpe3QuZGVsdGFZPDA/ayh3KCkpOnQuZGVsdGFZPjAmJkEodygpKSxuLnVwZGF0ZSgpfSkodCksbi5kaXNwYXRjaEV2ZW50KEw3dCkpfWZ1bmN0aW9uIGoodCl7ITEhPT1uLmVuYWJsZWQmJiExIT09bi5lbmFibGVQYW4mJihmdW5jdGlvbiBlKHQpe2xldCBlPSExO3N3aXRjaCh0LmNvZGUpe2Nhc2Ugbi5rZXlzLlVQOkMoMCxuLmtleVBhblNwZWVkKSxlPSEwO2JyZWFrO2Nhc2Ugbi5rZXlzLkJPVFRPTTpDKDAsLW4ua2V5UGFuU3BlZWQpLGU9ITA7YnJlYWs7Y2FzZSBuLmtleXMuTEVGVDpDKG4ua2V5UGFuU3BlZWQsMCksZT0hMDticmVhaztjYXNlIG4ua2V5cy5SSUdIVDpDKC1uLmtleVBhblNwZWVkLDApLGU9ITB9ZSYmKHQucHJldmVudERlZmF1bHQoKSxuLnVwZGF0ZSgpKX0pKHQpfWZ1bmN0aW9uIEcodCl7ITEhPT1uLmVuYWJsZWQmJnQucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBXKHQpe2RlbGV0ZSB4W3QucG9pbnRlcklkXTtmb3IobGV0IGU9MDtlPGIubGVuZ3RoO2UrKylpZihiW2VdLnBvaW50ZXJJZD09dC5wb2ludGVySWQpcmV0dXJuIHZvaWQgYi5zcGxpY2UoZSwxKX1mdW5jdGlvbiBxKHQpe2xldCBlPXhbdC5wb2ludGVySWRdO3ZvaWQgMD09PWUmJihlPW5ldyBtSnQseFt0LnBvaW50ZXJJZF09ZSksZS5zZXQodC5wYWdlWCx0LnBhZ2VZKX1mdW5jdGlvbiBZKHQpe3JldHVybiB4Wyh0LnBvaW50ZXJJZD09PWJbMF0ucG9pbnRlcklkP2JbMV06YlswXSkucG9pbnRlcklkXX1uLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLEcpLG4uZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsQiksbi5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJjYW5jZWwiLFYpLG4uZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsVSx7cGFzc2l2ZTohMX0pLHRoaXMudXBkYXRlKCl9fWNsYXNzIE43dCBleHRlbmRzIGpadHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuX2xhc3RNZXNoPW51bGwsdGhpcy5fY2xvY2s9bmV3IGo5dCx0aGlzLl9jYW52YXNTaXplPW51bGwsdGhpcy5fbGF5ZXJzQ29uZmlnPW51bGwsdGhpcy5fcnVuQ29sb3I9dH1faXNPYmplY3QodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT10JiYhQXJyYXkuaXNBcnJheSh0KX1fYXBwbHlEZWZhdWx0cyh0LGUpe2xldCBuPXt9O2NvbnN0IGk9W3QsZV07Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0Kyspe2NvbnN0IGU9aVt0XTtmb3IobGV0IHQgaW4gZSl7Y29uc3QgaT10IGluIG47dGhpcy5faXNPYmplY3QoZVt0XSk/blt0XT10aGlzLl9hcHBseURlZmF1bHRzKG5bdF18fHt9LGVbdF0pOml8fChuW3RdPWVbdF0pfX1yZXR1cm4gbn1fY3JlYXRlTGF5ZXJzKCl7aWYodGhpcy5fbGF5ZXJzQ29uZmlnJiZ0aGlzLl9zY2VuZSYmdGhpcy5fbGFzdE1lc2gpe2lmKHRoaXMuX2xheWVyc0NvbmZpZy5zaG93Qm91bmRpbmdCb3gpe3ZhciB0PW5ldyBHOHQodGhpcy5fbGFzdE1lc2gsbmV3ICRRdCgicmdiKDAsIDAsIDI1NSkiKSk7dGhpcy5fc2NlbmUuYWRkKHQpfWlmKHRoaXMuX2xheWVyc0NvbmZpZy5zaG93QXhlcyl7dmFyIGU9bmV3IFg4dCg1KTt0aGlzLl9zY2VuZS5hZGQoZSl9fX1zZXRMYXllcnNDb25maWcodCl7dGhpcy5fbGF5ZXJzQ29uZmlnPXRoaXMuX2FwcGx5RGVmYXVsdHModCx0aGlzLl9sYXllcnNDb25maWd8fHt9KX1fY3JlYXRlV29ybGQodCxlKXtpZih0aGlzLmlzUmVhZHkoKSlyZXR1cm47dGhpcy5fc2NlbmU9bmV3IFg1dDt2YXIgbj1uZXcgSjh0W3QuY2FtZXJhLmNsc10odC5jYW1lcmEuZm92LHRoaXMuX2NhbnZhc1NpemUud2lkdGgvdGhpcy5fY2FudmFzU2l6ZS5oZWlnaHQsdC5jYW1lcmEubmVhcix0LmNhbWVyYS5mYXIpO3RoaXMuX2NhbWVyYT1uO3ZhciBpPW5ldyBQN3QobixlKTtjb25zdCByPWk7ci5sb29rU3BlZWQ9LjQsci5tb3ZlbWVudFNwZWVkPTIwLHIubm9GbHk9ITAsci5sb29rVmVydGljYWw9ITAsci5jb25zdHJhaW5WZXJ0aWNhbD0hMCxyLnZlcnRpY2FsTWluPTEsci52ZXJ0aWNhbE1heD0yLHIuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLl9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlLmJpbmQodGhpcykpLHRoaXMuX2NhbWVyYUNvbnRyb2xzPWksdGhpcy5fcmVuZGVyZXI9bmV3IEc1dCh7YW50aWFsaWFzOiEwfSksdGhpcy5fcmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyksdGhpcy5fcmVuZGVyZXIuc2V0U2l6ZSh0aGlzLl9jYW52YXNTaXplLndpZHRoLHRoaXMuX2NhbnZhc1NpemUuaGVpZ2h0KSx0aGlzLl9yZW5kZXJlci5zZXRDbGVhckNvbG9yKDE2Nzc3MjE1LDEpfV9jbGVhclNjZW5lKCl7Zm9yKDt0aGlzLl9zY2VuZS5jaGlsZHJlbi5sZW5ndGg+MDspdGhpcy5fc2NlbmUucmVtb3ZlKHRoaXMuX3NjZW5lLmNoaWxkcmVuWzBdKX1nZXRSZW5kZXJlcigpe3JldHVybiB0aGlzLl9yZW5kZXJlcn1nZXRDYW1lcmFDb250cm9scygpe3JldHVybiB0aGlzLl9jYW1lcmFDb250cm9sc31pc1JlYWR5KCl7cmV0dXJuISF0aGlzLl9jYW1lcmEmJiEhdGhpcy5fY2FtZXJhQ29udHJvbHN9Z2V0Q2FtZXJhUG9zaXRpb24oKXtyZXR1cm57ZmFyOnRoaXMuX2NhbWVyYS5mYXIscG9zaXRpb246dGhpcy5fY2FtZXJhLnBvc2l0aW9uLmNsb25lKCksdGFyZ2V0OnRoaXMuX2NhbWVyYUNvbnRyb2xzLnRhcmdldC5jbG9uZSgpfX1zZXRDYW52YXNTaXplKHQpe3RoaXMuX2NhbnZhc1NpemU9dH1kcmF3KCl7dGhpcy5fYW5pbWF0aW9uRnJhbWVJbmRleCYmY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fYW5pbWF0aW9uRnJhbWVJbmRleCksdGhpcy5fY2FtZXJhLmFzcGVjdD10aGlzLl9jYW52YXNTaXplLndpZHRoL3RoaXMuX2NhbnZhc1NpemUuaGVpZ2h0LHRoaXMuX2NhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCksdGhpcy5fcmVuZGVyZXIuc2V0U2l6ZSh0aGlzLl9jYW52YXNTaXplLndpZHRoLHRoaXMuX2NhbnZhc1NpemUuaGVpZ2h0KTtjb25zdCB0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fY2xvY2suZ2V0RGVsdGEoKTt0aGlzLl9jYW1lcmFDb250cm9scy51cGRhdGUoZSksdGhpcy5fYW5pbWF0aW9uRnJhbWVJbmRleD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodCksdGhpcy5fcmVuZGVyZXIucmVuZGVyKHRoaXMuX3NjZW5lLHRoaXMuX2NhbWVyYSl9LmJpbmQodGhpcyk7dCgpfXVwZGF0ZVNjZW5lKHQsZSl7bGV0IG49e307ImNvbmZpZyJpbiB0JiZ0LmNvbmZpZyYmKG49SlNPTi5wYXJzZSh0LmNvbmZpZykpLHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiYmVmb3JlVXBkYXRlU2NlbmUifSksbj10aGlzLl9hcHBseURlZmF1bHRzKG4se2NhbWVyYTp7Y2xzOiJQZXJzcGVjdGl2ZUNhbWVyYSIsZm92Ojc1LG5lYXI6LjEsZmFyOjFlM30sbGlnaHRzOlt7Y2xzOiJBbWJpZW50TGlnaHQiLGNvbG9yOiIjZmZmZmZmIixpbnRlbnNpdHk6Ljc1fSx7Y2xzOiJEaXJlY3Rpb25hbExpZ2h0Iixjb2xvcjoiI2ZmZmZmZiIsaW50ZW5zaXR5Oi43NSxwb3NpdGlvbjpbMCwtMSwyXX1dfSksdGhpcy5fY3JlYXRlV29ybGQobixlKSx0aGlzLl9jbGVhclNjZW5lKCksdGhpcy5fY3JlYXRlTGlnaHRzKHRoaXMuX3NjZW5lLG4pLHRoaXMuX2NyZWF0ZUdlb21ldHJ5KHQsbiksdGhpcy5fY3JlYXRlTGF5ZXJzKCksdGhpcy5kcmF3KCl9cmVzZXRWaWV3KHQpe2lmKCF0aGlzLmlzUmVhZHkoKSlyZXR1cm47bGV0IGU7dGhpcy5fY2FtZXJhQ29udHJvbHMucmVzZXQoKSwhdCYmdGhpcy5fbGFzdE1lc2gmJihlPXRoaXMuX2xhc3RNZXNoKSxlJiYodGhpcy5fZml0T2JqZWN0VG9WaWV3cG9ydChlKSx0aGlzLl9sYXN0TWVzaD1lKSx0aGlzLl9jYW1lcmFDb250cm9scy51cGRhdGUoKX1fY3JlYXRlR2VvbWV0cnkodCxlKXtjb25zdCBuPXQubWVzaDtuLnZlcnRpY2VzJiZuLmZhY2VzJiZuLmZhY2VzLmxlbmd0aD90aGlzLl9jcmVhdGVNZXNoKG4sZSk6dGhpcy5fY3JlYXRlUG9pbnRDbG91ZChuLGUpfV9jcmVhdGVQb2ludENsb3VkKHQsZSl7Y29uc3Qgbj10LnZlcnRpY2VzLGk9dC5jb2xvcnM7bGV0IHI9e21hdGVyaWFsOntjbHM6IlBvaW50c01hdGVyaWFsIixzaXplOi4wMDV9fTtpJiZpLmxlbmd0aD09bi5sZW5ndGg/ci5tYXRlcmlhbC52ZXJ0ZXhDb2xvcnM9ITA6ci5tYXRlcmlhbC5jb2xvcj10aGlzLl9ydW5Db2xvcjtjb25zdCBvPXRoaXMuX2FwcGx5RGVmYXVsdHMoZSxyKSxhPW5ldyBiMXQscz1uZXcgRmxvYXQzMkFycmF5KG4uZmxhdCgpKTtpZihhLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBRUXQocywzKSksaSYmaS5sZW5ndGg9PW4ubGVuZ3RoKXtjb25zdCB0PW5ldyBGbG9hdDMyQXJyYXkoaS5mbGF0KCkpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXRbZV09dFtlXS8yNTU7YS5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgUVF0KHQsMykpfXZhciBsPW5ldyBKOHRbby5tYXRlcmlhbC5jbHNdKG8ubWF0ZXJpYWwpLGM9bmV3ICQzdChhLGwpO3RoaXMuX3NjZW5lLmFkZChjKSx0aGlzLl9sYXN0TWVzaD1jfXNldENhbWVyYVZpZXdwb2ludCh0LGUsbil7dGhpcy5fc2lsZW50PSEwLHRoaXMuX2NhbWVyYS5mYXI9ZSx0aGlzLl9jYW1lcmEucG9zaXRpb24uc2V0KHQueCx0LnksdC56KSx0aGlzLl9jYW1lcmEubG9va0F0KG4uY2xvbmUoKSksdGhpcy5fY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSx0aGlzLl9jYW1lcmFDb250cm9scy50YXJnZXQ9bi5jbG9uZSgpLHRoaXMuX2NhbWVyYUNvbnRyb2xzLnVwZGF0ZSgpLHRoaXMuX3NpbGVudD0hMX1fb25DYW1lcmFQb3NpdGlvbkNoYW5nZSh0KXt0aGlzLl9zaWxlbnR8fHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiY2FtZXJhUG9zaXRpb25DaGFuZ2UiLGV2ZW50OnR9KX1fZml0T2JqZWN0VG9WaWV3cG9ydCh0KXtjb25zdCBlPW5ldyBMSnQsbj1uZXcgQ0p0LGk9bmV3IENKdDtlLnNldEZyb21PYmplY3QodCksZS5nZXRDZW50ZXIobiksZS5nZXRTaXplKGkpO2NvbnN0IHI9TWF0aC5tYXgoaS54LGkueSxpLnopLG89dGhpcy5fY2FtZXJhLmZvdiooTWF0aC5QSS8xODApO2xldCBhPTEuMjUqTWF0aC5hYnMoci8oMipNYXRoLnRhbihvLzIpKSk7Y29uc3Qgcz1lLm1pbi56O3RoaXMuc2V0Q2FtZXJhVmlld3BvaW50KHt4Om4ueCx5Om4ueSx6OmF9LDMqKHM8MD8tcythOmEtcyksbil9X2NyZWF0ZU1lc2godCxlKXtjb25zdCBuPXQudmVydGljZXMsaT10LmZhY2VzLHI9dC5jb2xvcnMsbz10aGlzLl9hcHBseURlZmF1bHRzKGUse21hdGVyaWFsOntjbHM6Ik1lc2hTdGFuZGFyZE1hdGVyaWFsIixjb2xvcjoiI2EwYTBhMCIscm91Z2huZXNzOjEsbWV0YWxuZXNzOjB9fSksYT1uZXcgYjF0LHM9bmV3IEZsb2F0MzJBcnJheShuLmZsYXQoKSk7YS5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgUVF0KHMsMykpO2NvbnN0IGw9bmV3IFVpbnQxNkFycmF5KGkuZmxhdCgpKTtpZihyJiZyLmxlbmd0aCl7Y29uc3QgdD1yLmZsYXQoKTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdPXRbZV0vMjU1O2Euc2V0QXR0cmlidXRlKCJjb2xvciIsbmV3IFFRdChuZXcgRmxvYXQzMkFycmF5KHQpLDMpKSxvLm1hdGVyaWFsPW8ubWF0ZXJpYWx8fHt9LG8ubWF0ZXJpYWwudmVydGV4Q29sb3JzPSEwfWEuY2VudGVyKCksYS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxhLnNldEluZGV4KG5ldyBRUXQobCwxKSksYS5jb21wdXRlVmVydGV4Tm9ybWFscygpO2xldCBjPW5ldyBKOHRbby5tYXRlcmlhbC5jbHNdKG8ubWF0ZXJpYWwpLHU9bmV3IEIxdChhLGMpO3UuY2FzdFNoYWRvdz0hMCx1LnJlY2VpdmVTaGFkb3c9ITAsdGhpcy5fc2NlbmUuYWRkKHUpLHRoaXMuX2xhc3RNZXNoPXV9X2NyZWF0ZUxpZ2h0cyh0LGUpe2ZvcihsZXQgbj0wO248ZS5saWdodHMubGVuZ3RoO24rKyl7Y29uc3QgaT1lLmxpZ2h0c1tuXTtsZXQgcj1uZXcgSjh0W2kuY2xzXShpLmNvbG9yLGkuaW50ZW5zaXR5KTtpLnBvc2l0aW9uJiZyLnBvc2l0aW9uLnNldChpLnBvc2l0aW9uWzBdLGkucG9zaXRpb25bMV0saS5wb3NpdGlvblsyXSksdC5hZGQocil9fX1sZXQgSTd0PWNsYXNzIGV4dGVuZHMoZXIoeWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5zZWxlY3RlZFZpZXc9ImFsbCIsdGhpcy5hY3RpdmU9ITEsdGhpcy5fY29sb3JTY2FsZUZ1bmN0aW9uPUdSLHRoaXMuX3N0ZXBzPVtdLHRoaXMuX21lc2hWaWV3ZXJBdHRhY2hlZD0hMSx0aGlzLl9jYW1lcmFQb3NpdGlvbkluaXRpYWxpemVkPSExLHRoaXMuX2lzTWVzaExvYWRpbmc9ITF9Z2V0IF9ydW5Db2xvcigpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlRnVuY3Rpb24odGhpcy5ydW4pfWNvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLl9kYXRhUHJvdmlkZXI9bmV3IERLdCh0aGlzLnJlcXVlc3RNYW5hZ2VyKTtjb25zdCB0PW5ldyBON3QodGhpcy5fcnVuQ29sb3IpO3QuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JlVXBkYXRlU2NlbmUiLHRoaXMuX3VwZGF0ZUNhbnZhc1NpemUuYmluZCh0aGlzKSksdC5hZGRFdmVudExpc3RlbmVyKCJjYW1lcmFQb3NpdGlvbkNoYW5nZSIsdGhpcy5fb25DYW1lcmFQb3NpdGlvbkNoYW5nZS5iaW5kKHRoaXMpKSx0aGlzLl9tZXNoVmlld2VyPXR9cmVsb2FkKCl7dGhpcy5hY3RpdmUmJnRoaXMuX2RhdGFQcm92aWRlciYmKHRoaXMuX2lzTWVzaExvYWRpbmc9ITAsdGhpcy5fZGF0YVByb3ZpZGVyLnJlbG9hZCh0aGlzLnJ1bix0aGlzLnRhZyx0aGlzLnNhbXBsZSkudGhlbigodD0+e3QmJih0aGlzLl9zdGVwcz10LHRoaXMuX3N0ZXBJbmRleD10Lmxlbmd0aC0xKX0pKS5jYXRjaCgodD0+e2lmKCF0fHwhdC5jb2RlfHx0LmNvZGUhPVJLdC5DQU5DRUxMRUQpdGhyb3cgdD10fHwiUmVzcG9uc2UgcHJvY2Vzc2luZyBmYWlsZWQuIixuZXcgRXJyb3IodCl9KSkpfV91cGRhdGVTY2VuZSgpe2NvbnN0IHQ9dGhpcy5fY3VycmVudFN0ZXA7dCYmdC5tZXNoJiYodGhpcy5fbWVzaFZpZXdlci51cGRhdGVTY2VuZSh0LHRoaXMpLHRoaXMuX2NhbWVyYVBvc2l0aW9uSW5pdGlhbGl6ZWR8fCh0aGlzLl9tZXNoVmlld2VyLnJlc2V0VmlldygpLHRoaXMuX2NhbWVyYVBvc2l0aW9uSW5pdGlhbGl6ZWQ9ITApLHRoaXMuX21lc2hWaWV3ZXJBdHRhY2hlZHx8KHRoaXMuc2hhZG93Um9vdC5hcHBlbmRDaGlsZCh0aGlzLl9tZXNoVmlld2VyLmdldFJlbmRlcmVyKCkuZG9tRWxlbWVudCksdGhpcy5fbWVzaFZpZXdlckF0dGFjaGVkPSEwKSl9X2RlYm91bmNlZEZldGNoTWVzaCgpe3RoaXMuZGVib3VuY2UoImZldGNoTWVzaCIsKCgpPT50aGlzLl9tYXliZUZldGNoTWVzaCgpKSwxMDApfV9tYXliZUZldGNoTWVzaCgpe3JldHVybiBuKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD10aGlzLl9jdXJyZW50U3RlcDtpZih0JiYhdC5tZXNoJiYhdC5tZXNoRmV0Y2hpbmcpe3QubWVzaEZldGNoaW5nPSEwLHRoaXMuX2lzTWVzaExvYWRpbmc9ITA7dHJ5e2NvbnN0IGU9eWllbGQgdGhpcy5fZGF0YVByb3ZpZGVyLmZldGNoRGF0YSh0LHRoaXMucnVuLHRoaXMudGFnLHRoaXMuc2FtcGxlKTt0Lm1lc2g9ZVswXSx0aGlzLm5vdGlmeVBhdGgoIl9jdXJyZW50U3RlcC5tZXNoIil9Y2F0Y2godCl7aWYoIXR8fCF0LmNvZGV8fHQuY29kZSE9Ukt0LkNBTkNFTExFRCl0aHJvdyB0PXR8fCJSZXNwb25zZSBwcm9jZXNzaW5nIGZhaWxlZC4iLG5ldyBFcnJvcih0KX1maW5hbGx5e3RoaXMuX2lzTWVzaExvYWRpbmc9ITEsdC5tZXNoRmV0Y2hpbmc9ITF9fX0pKX1fb25DYW1lcmFQb3NpdGlvbkNoYW5nZSgpe2lmKCF0aGlzLl9tZXNoVmlld2VyLmlzUmVhZHkoKSlyZXR1cm47Y29uc3QgdD1uZXcgQ3VzdG9tRXZlbnQoImNhbWVyYS1wb3NpdGlvbi1jaGFuZ2UiLHtkZXRhaWw6dGhpcy5fbWVzaFZpZXdlci5nZXRDYW1lcmFQb3NpdGlvbigpfSk7dGhpcy5kaXNwYXRjaEV2ZW50KHQpfXNldENhbWVyYVZpZXdwb2ludCh0LGUsbil7dGhpcy5fbWVzaFZpZXdlci5zZXRDYW1lcmFWaWV3cG9pbnQodCxlLG4pfV91cGRhdGVDYW52YXNTaXplKCl7Y29uc3QgdD10aGlzLm9mZnNldFdpZHRoLGU9dCxuPXRoaXMuJCQoIi50Zi1tZXNoLWxvYWRlci1oZWFkZXIiKS5vZmZzZXRIZWlnaHQ7dGhpcy5fbWVzaFZpZXdlci5zZXRDYW52YXNTaXplKHt3aWR0aDp0LGhlaWdodDplLW59KX1yZWRyYXcoKXt0aGlzLl91cGRhdGVDYW52YXNTaXplKCksdGhpcy5pc0Nvbm5lY3RlZCYmdGhpcy5fbWVzaFZpZXdlci5kcmF3KCl9X2hhc0F0TGVhc3RPbmVTdGVwKHQpe3JldHVybiEhdCYmdC5sZW5ndGg+MH1faGFzTXVsdGlwbGVTdGVwcyh0KXtyZXR1cm4hIXQmJnQubGVuZ3RoPjF9Z2V0IF9jdXJyZW50U3RlcCgpe3JldHVybiB0aGlzLl9zdGVwc1t0aGlzLl9zdGVwSW5kZXhdfHxudWxsfWdldCBfc3RlcFZhbHVlKCl7Y29uc3QgdD10aGlzLl9jdXJyZW50U3RlcDtyZXR1cm4gdD90LnN0ZXA6MH1nZXQgX2N1cnJlbnRXYWxsVGltZSgpe2NvbnN0IHQ9dGhpcy5fY3VycmVudFN0ZXA7cmV0dXJuIHQ/S1IodC53YWxsX3RpbWUpOiIifV9nZXRNYXhTdGVwSW5kZXgodCl7cmV0dXJuIHQubGVuZ3RoLTF9X2dldFNhbXBsZVRleHQodCl7cmV0dXJuIFN0cmluZyh0KzEpfV9oYXNNdWx0aXBsZVNhbXBsZXModCl7cmV0dXJuIHQ+MX1fdXBkYXRlVmlldygpe3RoaXMuX21lc2hWaWV3ZXImJiJhbGwiPT10aGlzLnNlbGVjdGVkVmlldyYmdGhpcy5fbWVzaFZpZXdlci5yZXNldFZpZXcoKX10b0xvY2FsZVN0cmluZ18odCl7cmV0dXJuIHQudG9Mb2NhbGVTdHJpbmcoKX19O0k3dC50ZW1wbGF0ZT1fZWAKICAgIDx0Zi1jYXJkLWhlYWRpbmcgY29sb3I9IltbX3J1bkNvbG9yXV0iIGNsYXNzPSJ0Zi1tZXNoLWxvYWRlci1oZWFkZXIiPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU2FtcGxlcyhvZlNhbXBsZXMpXV0iPgogICAgICAgIDxkaXY+c2FtcGxlOiBbW19nZXRTYW1wbGVUZXh0KHNhbXBsZSldXSBvZiBbW29mU2FtcGxlc11dPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXAoX3N0ZXBzKV1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgc3RlcAogICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiCiAgICAgICAgICAgICAgPltbdG9Mb2NhbGVTdHJpbmdfKF9zdGVwVmFsdWUpXV08L3NwYW4KICAgICAgICAgICAgPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIGhlYWRpbmctcmlnaHQiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2N1cnJlbnRXYWxsVGltZV1dIj4KICAgICAgICAgICAgICBbW19jdXJyZW50V2FsbFRpbWVdXQogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCByaWdodCI+CiAgICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlIGhpZGRlbiQ9IltbIV9pc01lc2hMb2FkaW5nXV0iPgogICAgICAgICAgICA8L3BhcGVyLXNwaW5uZXItbGl0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU3RlcHMoX3N0ZXBzKV1dIj4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLXNsaWRlcgogICAgICAgICAgICBpZD0ic3RlcHMiCiAgICAgICAgICAgIGltbWVkaWF0ZS12YWx1ZT0ie3tfc3RlcEluZGV4fX0iCiAgICAgICAgICAgIG1heD0iW1tfZ2V0TWF4U3RlcEluZGV4KF9zdGVwcyldXSIKICAgICAgICAgICAgbWF4LW1hcmtlcnM9IltbX2dldE1heFN0ZXBJbmRleChfc3RlcHMpXV0iCiAgICAgICAgICAgIHNuYXBzCiAgICAgICAgICAgIHN0ZXA9IjEiCiAgICAgICAgICAgIHZhbHVlPSJ7e19zdGVwSW5kZXh9fSIKICAgICAgICAgID48L3BhcGVyLXNsaWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdGYtY2FyZC1oZWFkaW5nPgogICAgPHN0eWxlPgogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAxcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxcHg7CiAgICAgIH0KICAgICAgLnRmLW1lc2gtbG9hZGVyLWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDVweDsKICAgICAgfQogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLEk3dC5wcm90b3R5cGUsInJ1biIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxJN3QucHJvdG90eXBlLCJ0YWciLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sSTd0LnByb3RvdHlwZSwic2FtcGxlIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLEk3dC5wcm90b3R5cGUsIm9mU2FtcGxlcyIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxJN3QucHJvdG90eXBlLCJzZWxlY3RlZFZpZXciLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxJN3QucHJvdG90eXBlLCJhY3RpdmUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsZHIpXSxJN3QucHJvdG90eXBlLCJyZXF1ZXN0TWFuYWdlciIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixON3QpXSxJN3QucHJvdG90eXBlLCJfbWVzaFZpZXdlciIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixES3QpXSxJN3QucHJvdG90eXBlLCJfZGF0YVByb3ZpZGVyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEk3dC5wcm90b3R5cGUsIl9jb2xvclNjYWxlRnVuY3Rpb24iLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheSxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxJN3QucHJvdG90eXBlLCJfc3RlcHMiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLEk3dC5wcm90b3R5cGUsIl9zdGVwSW5kZXgiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxJN3QucHJvdG90eXBlLCJfbWVzaFZpZXdlckF0dGFjaGVkIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sSTd0LnByb3RvdHlwZSwiX2NhbWVyYVBvc2l0aW9uSW5pdGlhbGl6ZWQiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxJN3QucHJvdG90eXBlLCJfaXNNZXNoTG9hZGluZyIsdm9pZCAwKSx0KFtzKCJydW4iKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxJN3QucHJvdG90eXBlLCJfcnVuQ29sb3IiLG51bGwpLHQoW2EoInJ1biIsInRhZyIsImFjdGl2ZSIsIl9kYXRhUHJvdmlkZXIiLCJfbWVzaFZpZXdlciIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sSTd0LnByb3RvdHlwZSwicmVsb2FkIixudWxsKSx0KFthKCJfY3VycmVudFN0ZXAuKiIsIl9tZXNoVmlld2VyIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxJN3QucHJvdG90eXBlLCJfdXBkYXRlU2NlbmUiLG51bGwpLHQoW2EoIl9jdXJyZW50U3RlcCIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sSTd0LnByb3RvdHlwZSwiX2RlYm91bmNlZEZldGNoTWVzaCIsbnVsbCksdChbcygiX3N0ZXBzIiwiX3N0ZXBJbmRleCIpLGUoImRlc2lnbjp0eXBlIixPYmplY3QpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLEk3dC5wcm90b3R5cGUsIl9jdXJyZW50U3RlcCIsbnVsbCksdChbcygiX2N1cnJlbnRTdGVwIiksZSgiZGVzaWduOnR5cGUiLE51bWJlciksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sSTd0LnByb3RvdHlwZSwiX3N0ZXBWYWx1ZSIsbnVsbCksdChbcygiX2N1cnJlbnRTdGVwIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sSTd0LnByb3RvdHlwZSwiX2N1cnJlbnRXYWxsVGltZSIsbnVsbCksdChbYSgic2VsZWN0ZWRWaWV3IiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxJN3QucHJvdG90eXBlLCJfdXBkYXRlVmlldyIsbnVsbCksSTd0PXQoW2koInRmLW1lc2gtbG9hZGVyIildLEk3dCk7bGV0IFI3dD1jbGFzcyBleHRlbmRzIHlle2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnJlbG9hZE9uUmVhZHk9ITAsdGhpcy5fdGFnRmlsdGVyPSIuKiIsdGhpcy5fc2VsZWN0ZWRWaWV3PSJhbGwiLHRoaXMuX3JlcXVlc3RNYW5hZ2VyPW5ldyBkcix3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIiwoKCk9Pnt0aGlzLl9oYW5kbGVXaW5kb3dSZXNpemUoKX0pLCExKSx0aGlzLnJlbG9hZE9uUmVhZHkmJnRoaXMucmVsb2FkKCl9X2dldEFsbENoaWxkcmVuKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLW1lc2gtbG9hZGVyIikpfV9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlZCh0KXsic2hhcmUiPT10aGlzLl9zZWxlY3RlZFZpZXcmJnRoaXMuX2dldEFsbENoaWxkcmVuKCkuZm9yRWFjaCgoZT0+e3QudGFyZ2V0IT1lJiZlLnNldENhbWVyYVZpZXdwb2ludCh0LmRldGFpbC5wb3NpdGlvbix0LmRldGFpbC5mYXIsdC5kZXRhaWwudGFyZ2V0KX0pKX1fc2hvdWxkT3Blbih0KXtyZXR1cm4gdDw9Mn1yZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKHRoaXMuX3JlbG9hZE1lc2hlcy5iaW5kKHRoaXMpKX1faGFuZGxlV2luZG93UmVzaXplKCl7dGhpcy5fZ2V0QWxsQ2hpbGRyZW4oKS5mb3JFYWNoKCh0PT57dC5yZWRyYXcoKX0pKX1fZmV0Y2hUYWdzKCl7Y29uc3QgdD1fcigpLnBsdWdpblJvdXRlKCJtZXNoIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0KS50aGVuKCh0PT57aWYoU2UuZXhwb3J0cy5pc0VxdWFsKHQsdGhpcy5fcnVuVG9UYWdJbmZvKSlyZXR1cm47Y29uc3QgZT1hcihTZS5leHBvcnRzLm1hcFZhbHVlcyh0LCh0PT5PYmplY3Qua2V5cyh0KSkpKTt0aGlzLl9kYXRhTm90Rm91bmQ9MD09PWUubGVuZ3RoLHRoaXMuX3J1blRvVGFnSW5mbz10fSkpfV9yZWxvYWRNZXNoZXMoKXt0aGlzLl9nZXRBbGxDaGlsZHJlbigpLmZvckVhY2goKHQ9Pnt0LnJlbG9hZCgpfSkpfWdldCBfY2F0ZWdvcmllcygpe3ZhciB0PXRoaXMuX3J1blRvVGFnSW5mbyxlPXRoaXMuX3NlbGVjdGVkUnVucyxuPXRoaXMuX3RhZ0ZpbHRlcjtmdW5jdGlvbiBpKGUpe2NvbnN0IG49dFtlLnJ1bl1bZS50YWddLnNhbXBsZXM7cmV0dXJuIFNlLmV4cG9ydHMucmFuZ2UobikubWFwKCh0PT5PYmplY3QuYXNzaWduKHt9LGUse3NhbXBsZTp0LG9mU2FtcGxlczpufSkpKX1yZXR1cm4gTXIoU2UuZXhwb3J0cy5tYXBWYWx1ZXModCwodD0+T2JqZWN0LmtleXModCkpKSxlLG4pLm1hcCgodD0+T2JqZWN0LmFzc2lnbih7fSx0LHtpdGVtczpbXS5jb25jYXQuYXBwbHkoW10sdC5pdGVtcy5tYXAoaSkpfSkpKX19O1I3dC50ZW1wbGF0ZT1fZWAKICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IHNsb3Q9InNpZGViYXIiIGNsYXNzPSJhbGwtY29udHJvbHMiPgogICAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiB2aWV3LWNvbnRyb2wiPgogICAgICAgICAgICA8aDMgY2xhc3M9InRpdGxlIj5Qb2ludCBvZiB2aWV3PC9oMz4KICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tZ3JvdXAKICAgICAgICAgICAgICAgIGlkPSJ2aWV3LXJhZGlvLWdyb3VwIgogICAgICAgICAgICAgICAgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkVmlld319IgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9ImFsbC1yYWRpby1idXR0b24iIG5hbWU9ImFsbCI+CiAgICAgICAgICAgICAgICAgIERpc3BsYXkgYWxsIHBvaW50cwogICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcAogICAgICAgICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgICAgICAgIGZvcj0iYWxsLXJhZGlvLWJ1dHRvbiIKICAgICAgICAgICAgICAgICAgcG9zaXRpb249InJpZ2h0IgogICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIFpvb20gYW5kIGNlbnRlciBjYW1lcmEgdG8gZGlzcGxheSBhbGwgcG9pbnRzIGF0IG9uY2UuIE5vdGUsCiAgICAgICAgICAgICAgICAgIHRoYXQgc29tZSBwb2ludHMgY291bGQgYmUgdG9vIGZhciAoaS5lLiB0b28gc21hbGwpIHRvIGJlCiAgICAgICAgICAgICAgICAgIHZpc2libGUuCiAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJ1c2VyLXJhZGlvLWJ1dHRvbiIgbmFtZT0idXNlciI+CiAgICAgICAgICAgICAgICAgIEN1cnJlbnQgdmlldwogICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcAogICAgICAgICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgICAgICAgIGZvcj0idXNlci1yYWRpby1idXR0b24iCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICBLZWVwIGN1cnJlbnQgY2FtZXJhIHBvc2l0aW9uIGFuZCB6b29tIGxldmVsLgogICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ic2hhcmUtcmFkaW8tYnV0dG9uIiBuYW1lPSJzaGFyZSI+CiAgICAgICAgICAgICAgICAgIFNoYXJlIHZpZXdwb2ludAogICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcAogICAgICAgICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgICAgICAgIGZvcj0ic2hhcmUtcmFkaW8tYnV0dG9uIgogICAgICAgICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgU2hhcmUgdmlld3BvaW50IGFtb25nIGFsbCBjYW1lcmFzLgogICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHBvaW50IGNsb3VkIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczo8L3A+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IHBvaW50IGNsb3VkIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy4KICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIgogICAgICAgICAgICAgICAgPlJFQURNRTwvYQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCIKICAgICAgICAgICAgICAgID5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYQogICAgICAgICAgICAgID4uCiAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciCiAgICAgICAgICAgICAgICA+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3CiAgICAgICAgICAgICAgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIKICAgICAgICAgICAgICBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1tZXNoLWxvYWRlcgogICAgICAgICAgICAgICAgICBhY3RpdmU9IltbYWN0aXZlXV0iCiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLXZpZXc9IltbX3NlbGVjdGVkVmlld11dIgogICAgICAgICAgICAgICAgICBydW49IltbaXRlbS5ydW5dXSIKICAgICAgICAgICAgICAgICAgdGFnPSJbW2l0ZW0udGFnXV0iCiAgICAgICAgICAgICAgICAgIHNhbXBsZT0iW1tpdGVtLnNhbXBsZV1dIgogICAgICAgICAgICAgICAgICBvZi1zYW1wbGVzPSJbW2l0ZW0ub2ZTYW1wbGVzXV0iCiAgICAgICAgICAgICAgICAgIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgICAgICAgICAgICAgY2xhc3M9InRmLW1lc2gtbG9hZGVyLWNvbnRhaW5lciIKICAgICAgICAgICAgICAgICAgb24tY2FtZXJhLXBvc2l0aW9uLWNoYW5nZT0iX29uQ2FtZXJhUG9zaXRpb25DaGFuZ2VkIgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPC90Zi1tZXNoLWxvYWRlcj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDVweDsKICAgICAgfQogICAgICAuc2lkZWJhci1zZWN0aW9uIGgzIHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICB9CgogICAgICAucnVucy1zZWxlY3RvciB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CgogICAgICB0Zi1ydW5zLXNlbGVjdG9yIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAudmlldy1jb250cm9sIHsKICAgICAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAudmlldy1jb250cm9sIGgzLnRpdGxlIHsKICAgICAgICBwYWRkaW5nLXRvcDogMTZweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTZweDsKICAgICAgfQoKICAgICAgLmFsbGNvbnRyb2xzIC52aWV3LWNvbnRyb2wgcGFwZXItcmFkaW8tZ3JvdXAgewogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQogICAgICAvKiBMYXlvdXQgbXVzdCBiZSBob3Jpem9udGFsLCBpLmUuIGl0ZW1zIGFycmFuZ2VkIGluIGEgcm93LiBJZiBpdGVtcyBjYW5ub3QgZml0IGluIGEgcm93LAogICAgICAgKiB0aGV5IHNob3VsZCBiZSBtb3ZlZCB0byBuZXh0IGxpbmUuIEFsbCBpdGVtcyBtdXN0IGJlIHNxdWFyZSBhdCBhbGwgdGltZXMuIE1pbmltdW0gc2l6ZSBvZgogICAgICAgKiB0aGUgaXRlbSBpcyA0ODBweC4gVGhpcyBtZWFucyB0aGF0IG1heGltdW0gc2l6ZSBvZiB0aGUgaXRlbSBtdXN0IGJlIDQ4MHB4ICsgNDc5cHggPSA5NTlweC4KICAgICAgICogKi8KICAgICAgLmhvcml6b250YWwgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KICAgICAgdGYtbWVzaC1sb2FkZXIgewogICAgICAgIHdpZHRoOiA0ODBweDsKICAgICAgICBmbGV4LWJhc2lzOiA0ODBweDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFI3dC5wcm90b3R5cGUsInJlbG9hZE9uUmVhZHkiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLFI3dC5wcm90b3R5cGUsIl9zZWxlY3RlZFJ1bnMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sUjd0LnByb3RvdHlwZSwiX3J1blRvVGFnSW5mbyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFI3dC5wcm90b3R5cGUsIl9kYXRhTm90Rm91bmQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sUjd0LnByb3RvdHlwZSwiX3RhZ0ZpbHRlciIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sUjd0LnByb3RvdHlwZSwiX3NlbGVjdGVkVmlldyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxSN3QucHJvdG90eXBlLCJfcmVxdWVzdE1hbmFnZXIiLHZvaWQgMCksdChbcygiX3J1blRvVGFnSW5mbyIsIl9zZWxlY3RlZFJ1bnMiLCJfdGFnRmlsdGVyIiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxSN3QucHJvdG90eXBlLCJfY2F0ZWdvcmllcyIsbnVsbCksUjd0PXQoW2koIm1lc2gtZGFzaGJvYXJkIiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sUjd0KTtsZXQgTzd0PWNsYXNzIGV4dGVuZHMgeWV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX2V4cGFuZGVkPSExLHRoaXMuX3J1blRvUHJDdXJ2ZUVudHJ5PXt9LHRoaXMuX3ByZXZpb3VzUnVuVG9QckN1cnZlRW50cnk9e30sdGhpcy5fY29sb3JTY2FsZUZ1bmN0aW9uPXtzY2FsZTpHUn0sdGhpcy5fY2FuY2VsbGVyPW5ldyBYUix0aGlzLl94Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kPSgpPT57Y29uc3QgdD1uZXcgck8uU2NhbGVzLkxpbmVhcjtyZXR1cm57c2NhbGU6dCxheGlzOm5ldyByTy5BeGVzLk51bWVyaWModCwiYm90dG9tIiksYWNjZXNzb3I6dD0+dC5yZWNhbGx9fSx0aGlzLl95VmFsdWVBY2Nlc3Nvcj10PT50LnByZWNpc2lvbix0aGlzLl90b29sdGlwQ29sdW1ucz0oKCk9Pntjb25zdCB0PXdUdCg0KSxlPWU9PmlzTmFOKGUpPyJOYU4iOnQoZSk7cmV0dXJuW3t0aXRsZToiUnVuIixldmFsdWF0ZTp0PT50LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfSx7dGl0bGU6IlRocmVzaG9sZCIsZXZhbHVhdGU6dD0+ZSh0LmRhdHVtLnRocmVzaG9sZHMpfSx7dGl0bGU6IlByZWNpc2lvbiIsZXZhbHVhdGU6dD0+ZSh0LmRhdHVtLnByZWNpc2lvbil9LHt0aXRsZToiUmVjYWxsIixldmFsdWF0ZTp0PT5lKHQuZGF0dW0ucmVjYWxsKX0se3RpdGxlOiJUUCIsZXZhbHVhdGU6dD0+dC5kYXR1bS50cnVlX3Bvc2l0aXZlc30se3RpdGxlOiJGUCIsZXZhbHVhdGU6dD0+dC5kYXR1bS5mYWxzZV9wb3NpdGl2ZXN9LHt0aXRsZToiVE4iLGV2YWx1YXRlOnQ9PnQuZGF0dW0udHJ1ZV9uZWdhdGl2ZXN9LHt0aXRsZToiRk4iLGV2YWx1YXRlOnQ9PnQuZGF0dW0uZmFsc2VfbmVnYXRpdmVzfV19KSgpLHRoaXMuX3Nlcmllc0RhdGFGaWVsZHM9WyJ0aHJlc2hvbGRzIiwicHJlY2lzaW9uIiwicmVjYWxsIiwidHJ1ZV9wb3NpdGl2ZXMiLCJmYWxzZV9wb3NpdGl2ZXMiLCJ0cnVlX25lZ2F0aXZlcyIsImZhbHNlX25lZ2F0aXZlcyJdLHRoaXMuX2RlZmF1bHRYUmFuZ2U9Wy0uMDUsMS4wNV0sdGhpcy5fZGVmYXVsdFlSYW5nZT1bLS4wNSwxLjA1XSx0aGlzLl9yZXF1ZXN0RGF0YT0odCxlLG4pPT57Y29uc3QgaT1fcigpLnBsdWdpblJvdXRlKCJwcl9jdXJ2ZXMiLCIvcHJfY3VydmVzIik7UHJvbWlzZS5hbGwodC5tYXAoKHQ9Pntjb25zdCBuPWlPKGkse3RhZzp0aGlzLnRhZyxydW46dH0pO3JldHVybiB0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QobikudGhlbigobj0+e2Uoe2l0ZW06dCxkYXRhOm59KX0pKX0pKSkuZmluYWxseSgoKCk9PntuKCl9KSl9LHRoaXMuX3Ntb290aGluZ0VuYWJsZWQ9ITF9X2NyZWF0ZVByb2Nlc3NEYXRhRnVuY3Rpb24oKXtyZXR1cm4odCxlLG4pPT57dGhpcy5zZXQoIl9ydW5Ub0RhdGFPdmVyVGltZSIsT2JqZWN0LmFzc2lnbih7fSx0aGlzLl9ydW5Ub0RhdGFPdmVyVGltZSxuKSl9fV9jb21wdXRlUnVuQ29sb3IodCl7cmV0dXJuIEdSKHQpfWNvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLl9hdHRhY2hlZD0hMCx0aGlzLnJlbG9hZCgpfV9nZXRDaGFydERhdGFMb2FkZXIoKXtyZXR1cm4gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKX1yZWxvYWQoKXt0aGlzLl9hdHRhY2hlZCYmKDAhPT10aGlzLnJ1bnMubGVuZ3RoP3RoaXMuX2dldENoYXJ0RGF0YUxvYWRlcigpLnJlbG9hZCgpOnRoaXMuc2V0KCJfcnVuVG9EYXRhT3ZlclRpbWUiLHt9KSl9X3NldENoYXJ0RGF0YSgpe3ZhciB0PXRoaXMuX3J1blRvUHJDdXJ2ZUVudHJ5LGU9dGhpcy5fcHJldmlvdXNSdW5Ub1ByQ3VydmVFbnRyeSxuPXRoaXMuX3NldE9mUmVsZXZhbnRSdW5zO1NlLmV4cG9ydHMuZm9yT3duKHQsKChpLHIpPT57Y29uc3Qgbz1lW3JdO28mJnRbcl0uc3RlcD09PW8uc3RlcHx8KG5bcl0/dGhpcy5fdXBkYXRlU2VyaWVzRGF0YUZvclJ1bihyLGkpOnRoaXMuX2NsZWFyU2VyaWVzRGF0YShyKSl9KSl9X3VwZGF0ZVNlcmllc0RhdGFGb3JSdW4odCxlKXtjb25zdCBuPVNlLmV4cG9ydHMucmVkdWNlKHRoaXMuX3Nlcmllc0RhdGFGaWVsZHMsKCh0LG4pPT4odFtuXT1lW25dLnNsaWNlKCkucmV2ZXJzZSgpLHQpKSx7fSksaT1uZXcgQXJyYXkoblt0aGlzLl9zZXJpZXNEYXRhRmllbGRzWzBdXS5sZW5ndGgpO2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7dCsrKWlbdF09U2UuZXhwb3J0cy5tYXBWYWx1ZXMobiwoZT0+ZVt0XSkpO2NvbnN0IHI9dGhpcy5fZ2V0Q2hhcnREYXRhTG9hZGVyKCk7ci5zZXRTZXJpZXNEYXRhKHQsaSksci5jb21taXRDaGFuZ2VzKCl9X2NsZWFyU2VyaWVzRGF0YSh0KXtjb25zdCBlPXRoaXMuX2dldENoYXJ0RGF0YUxvYWRlcigpO2Uuc2V0U2VyaWVzRGF0YSh0LFtdKSxlLmNvbW1pdENoYW5nZXMoKX1fdXBkYXRlUnVuVG9QckN1cnZlRW50cnkoKXt2YXIgdD10aGlzLnJ1blRvU3RlcENhcDtjb25zdCBlPXt9O1NlLmV4cG9ydHMuZm9yT3duKHRoaXMuX3J1blRvRGF0YU92ZXJUaW1lLCgobixpKT0+e24mJm4ubGVuZ3RoJiYoZVtpXT10aGlzLl9jb21wdXRlRW50cnlDbG9zZXN0T3JFcXVhbFRvU3RlcENhcCh0W2ldLG4pKX0pKSx0aGlzLnNldCgiX3ByZXZpb3VzUnVuVG9QckN1cnZlRW50cnkiLHRoaXMuX3J1blRvUHJDdXJ2ZUVudHJ5KSx0aGlzLnNldCgiX3J1blRvUHJDdXJ2ZUVudHJ5IixlKX1fbm90aWZ5RGF0YUNoYW5nZSgpe3RoaXMub25EYXRhQ2hhbmdlJiZ0aGlzLm9uRGF0YUNoYW5nZSh0aGlzLl9ydW5Ub0RhdGFPdmVyVGltZSl9X2NvbXB1dGVFbnRyeUNsb3Nlc3RPckVxdWFsVG9TdGVwQ2FwKHQsZSl7Y29uc3Qgbj1NYXRoLm1pbihTZS5leHBvcnRzLnNvcnRlZEluZGV4KGUubWFwKCh0PT50LnN0ZXApKSx0KSxlLmxlbmd0aC0xKTtyZXR1cm4gZVtuXX1nZXQgX3J1bnNXaXRoU3RlcEF2YWlsYWJsZSgpe3ZhciB0PXRoaXMuX3J1blRvUHJDdXJ2ZUVudHJ5O3JldHVybiBTZS5leHBvcnRzLmZpbHRlcih0aGlzLnJ1bnMsKGU9PnRbZV0pKS5zb3J0KCl9Z2V0IF9zZXRPZlJlbGV2YW50UnVucygpe2NvbnN0IHQ9e307cmV0dXJuIFNlLmV4cG9ydHMuZm9yRWFjaCh0aGlzLl9ydW5zV2l0aFN0ZXBBdmFpbGFibGUsKGU9Pnt0W2VdPSEwfSkpLHR9X2NvbXB1dGVDdXJyZW50U3RlcEZvclJ1bih0LGUpe2NvbnN0IG49dFtlXTtyZXR1cm4gbj9uLnN0ZXA6bnVsbH1fY29tcHV0ZUN1cnJlbnRXYWxsVGltZUZvclJ1bih0LGUpe2NvbnN0IG49dFtlXTtyZXR1cm4gbj9uZXcgRGF0ZSgxZTMqbi53YWxsX3RpbWUpLnRvU3RyaW5nKCk6bnVsbH1fdG9nZ2xlRXhwYW5kZWQodCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKSx0aGlzLnJlZHJhdygpfV9yZXNldERvbWFpbigpe3RoaXMuX2dldENoYXJ0RGF0YUxvYWRlcigpLnJlc2V0RG9tYWluKCl9cmVkcmF3KCl7dGhpcy5fZ2V0Q2hhcnREYXRhTG9hZGVyKCkucmVkcmF3KCl9fTtPN3QudGVtcGxhdGU9X2VgCiAgICA8dGYtY2FyZC1oZWFkaW5nCiAgICAgIHRhZz0iW1t0YWddXSIKICAgICAgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iCiAgICAgIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iCiAgICA+PC90Zi1jYXJkLWhlYWRpbmc+CgogICAgPHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIKICAgICAgeC1jb21wb25lbnRzLWNyZWF0aW9uLW1ldGhvZD0iW1tfeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZF1dIgogICAgICB5LXZhbHVlLWFjY2Vzc29yPSJbW195VmFsdWVBY2Nlc3Nvcl1dIgogICAgICB0b29sdGlwLWNvbHVtbnM9IltbX3Rvb2x0aXBDb2x1bW5zXV0iCiAgICAgIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlRnVuY3Rpb25dXSIKICAgICAgZGVmYXVsdC14LXJhbmdlPSJbW19kZWZhdWx0WFJhbmdlXV0iCiAgICAgIGRlZmF1bHQteS1yYW5nZT0iW1tfZGVmYXVsdFlSYW5nZV1dIgogICAgICBzbW9vdGhpbmctZW5hYmxlZD0iW1tfc21vb3RoaW5nRW5hYmxlZF1dIgogICAgICByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgZGF0YS10by1sb2FkPSJbW3J1bnNdXSIKICAgICAgZGF0YS1zZXJpZXM9IltbcnVuc11dIgogICAgICBsb2FkLWtleT0iW1t0YWddXSIKICAgICAgcmVxdWVzdC1kYXRhPSJbW19yZXF1ZXN0RGF0YV1dIgogICAgICBsb2FkLWRhdGEtY2FsbGJhY2s9IltbX2NyZWF0ZVByb2Nlc3NEYXRhRnVuY3Rpb24oKV1dIgogICAgICBhY3RpdmU9IltbYWN0aXZlXV0iCiAgICA+PC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgoKICAgIDxkaXYgaWQ9ImJ1dHRvbnMtcm93Ij4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIgogICAgICAgIGljb249ImZ1bGxzY3JlZW4iCiAgICAgICAgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiCiAgICAgID48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICBpY29uPSJzZXR0aW5ncy1vdmVyc2NhbiIKICAgICAgICBvbi10YXA9Il9yZXNldERvbWFpbiIKICAgICAgICB0aXRsZT0iUmVzZXQgYXhlcyB0byBbMCwgMV0uIgogICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9InN0ZXAtbGVnZW5kIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfcnVuc1dpdGhTdGVwQXZhaWxhYmxlXV0iIGFzPSJydW4iPgogICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1yb3ciPgogICAgICAgICAgPGRpdgogICAgICAgICAgICBjbGFzcz0iY29sb3ItYm94IgogICAgICAgICAgICBzdHlsZT0iYmFja2dyb3VuZDogW1tfY29tcHV0ZVJ1bkNvbG9yKHJ1bildXTsiCiAgICAgICAgICA+PC9kaXY+CiAgICAgICAgICBbW3J1bl1dIGlzIGF0CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RlcC1sYWJlbC10ZXh0Ij4KICAgICAgICAgICAgc3RlcCBbW19jb21wdXRlQ3VycmVudFN0ZXBGb3JSdW4oX3J1blRvUHJDdXJ2ZUVudHJ5LCBydW4pXV0gPC9zcGFuCiAgICAgICAgICA+PGJyIC8+CiAgICAgICAgICA8c3BhbiBjbGFzcz0id2FsbC10aW1lLWxhYmVsLXRleHQiPgogICAgICAgICAgICAoW1tfY29tcHV0ZUN1cnJlbnRXYWxsVGltZUZvclJ1bihfcnVuVG9QckN1cnZlRW50cnksIHJ1bildXSkKICAgICAgICAgIDwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB3aWR0aDogNTAwcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDI1cHg7CiAgICAgIH0KICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICB0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIHsKICAgICAgICBoZWlnaHQ6IDMwMHB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciB7CiAgICAgICAgaGVpZ2h0OiA2MDBweDsKICAgICAgfQogICAgICAjYnV0dG9ucy1yb3cgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQogICAgICAjYnV0dG9ucy1yb3cgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQogICAgICAjYnV0dG9ucy1yb3cgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CiAgICAgICNzdGVwLWxlZ2VuZCB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBmb250LXNpemU6IDAuOGVtOwogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgcGFkZGluZzogMCAwIDAgMTBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAubGVnZW5kLXJvdyB7CiAgICAgICAgbWFyZ2luOiA1cHggMCA1cHggMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuY29sb3ItYm94IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMXB4OwogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICAgIGhlaWdodDogMTBweDsKICAgICAgfQogICAgICAuc3RlcC1sYWJlbC10ZXh0IHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAud2FsbC10aW1lLWxhYmVsLXRleHQgewogICAgICAgIGNvbG9yOiAjODg4OwogICAgICAgIGZvbnQtc2l6ZTogMC44ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sTzd0LnByb3RvdHlwZSwicnVucyIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxPN3QucHJvdG90eXBlLCJ0YWciLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTzd0LnByb3RvdHlwZSwidGFnTWV0YWRhdGEiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTzd0LnByb3RvdHlwZSwicnVuVG9TdGVwQ2FwIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLGRyKV0sTzd0LnByb3RvdHlwZSwicmVxdWVzdE1hbmFnZXIiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxPN3QucHJvdG90eXBlLCJhY3RpdmUiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sTzd0LnByb3RvdHlwZSwiX2V4cGFuZGVkIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLE83dC5wcm90b3R5cGUsIl9ydW5Ub1ByQ3VydmVFbnRyeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxPN3QucHJvdG90eXBlLCJfcHJldmlvdXNSdW5Ub1ByQ3VydmVFbnRyeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxPN3QucHJvdG90eXBlLCJfcnVuVG9EYXRhT3ZlclRpbWUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pXSxPN3QucHJvdG90eXBlLCJvbkRhdGFDaGFuZ2UiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTzd0LnByb3RvdHlwZSwiX2NvbG9yU2NhbGVGdW5jdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixYUildLE83dC5wcm90b3R5cGUsIl9jYW5jZWxsZXIiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxPN3QucHJvdG90eXBlLCJfYXR0YWNoZWQiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTzd0LnByb3RvdHlwZSwiX3hDb21wb25lbnRzQ3JlYXRpb25NZXRob2QiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTzd0LnByb3RvdHlwZSwiX3lWYWx1ZUFjY2Vzc29yIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxPN3QucHJvdG90eXBlLCJfdG9vbHRpcENvbHVtbnMiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLE83dC5wcm90b3R5cGUsIl9zZXJpZXNEYXRhRmllbGRzIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxPN3QucHJvdG90eXBlLCJfZGVmYXVsdFhSYW5nZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sTzd0LnByb3RvdHlwZSwiX2RlZmF1bHRZUmFuZ2UiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pXSxPN3QucHJvdG90eXBlLCJfcmVxdWVzdERhdGEiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxPN3QucHJvdG90eXBlLCJfc21vb3RoaW5nRW5hYmxlZCIsdm9pZCAwKSx0KFthKCJydW5zIiwidGFnIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxPN3QucHJvdG90eXBlLCJyZWxvYWQiLG51bGwpLHQoW2EoIl9ydW5Ub1ByQ3VydmVFbnRyeSIsIl9wcmV2aW91c1J1blRvUHJDdXJ2ZUVudHJ5IiwiX3NldE9mUmVsZXZhbnRSdW5zIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxPN3QucHJvdG90eXBlLCJfc2V0Q2hhcnREYXRhIixudWxsKSx0KFthKCJfcnVuVG9EYXRhT3ZlclRpbWUiLCJydW5Ub1N0ZXBDYXAiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLE83dC5wcm90b3R5cGUsIl91cGRhdGVSdW5Ub1ByQ3VydmVFbnRyeSIsbnVsbCksdChbYSgiX3J1blRvRGF0YU92ZXJUaW1lIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxPN3QucHJvdG90eXBlLCJfbm90aWZ5RGF0YUNoYW5nZSIsbnVsbCksdChbcygicnVucyIsIl9ydW5Ub1ByQ3VydmVFbnRyeSIpLGUoImRlc2lnbjp0eXBlIixBcnJheSksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sTzd0LnByb3RvdHlwZSwiX3J1bnNXaXRoU3RlcEF2YWlsYWJsZSIsbnVsbCksdChbcygiX3J1bnNXaXRoU3RlcEF2YWlsYWJsZSIpLGUoImRlc2lnbjp0eXBlIixPYmplY3QpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLE83dC5wcm90b3R5cGUsIl9zZXRPZlJlbGV2YW50UnVucyIsbnVsbCksTzd0PXQoW2koInRmLXByLWN1cnZlLWNhcmQiKV0sTzd0KTtsZXQgejd0PWNsYXNzIGV4dGVuZHMgeWV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX3J1blRvU3RlcEluZGV4PXt9fV9jb21wdXRlQ29sb3JGb3JSdW4odCl7cmV0dXJuIEdSKHQpfV9jb21wdXRlVGltZVRleHRGb3JSdW4odCxlLG4saSl7Y29uc3Qgcj1lW25dO2lmKCFTZS5leHBvcnRzLmlzTnVtYmVyKHIpKXJldHVybiIiO2NvbnN0IG89dFtuXTtpZighbylyZXR1cm4iIjtjb25zdCBhPW9bcl1baV07aWYoInN0ZXAiPT09aSlyZXR1cm5gc3RlcCAke2F9YDtpZigicmVsYXRpdmUiPT09aSlyZXR1cm4gYTwxP2AkeygxZTMqYSkudG9GaXhlZCgyKX0gbXNgOmAke2EudG9GaXhlZCgyKX0gc2A7aWYoIndhbGxfdGltZSI9PT1pKXJldHVybiBuZXcgRGF0ZSgxZTMqYSkudG9TdHJpbmcoKTt0aHJvdyBuZXcgRXJyb3IoYFRoZSBkaXNwbGF5IHR5cGUgb2YgJHtpfSBpcyBub3QgcmVjb2duaXplZC5gKX1fc2xpZGVyVmFsdWVDaGFuZ2VkKHQpe2NvbnN0IGU9dC50YXJnZXQuZGF0YXNldC5ydW4sbj10LnRhcmdldC5pbW1lZGlhdGVWYWx1ZSxpPU9iamVjdC5hc3NpZ24oe30sdGhpcy5fcnVuVG9TdGVwSW5kZXgpO2lzTmFOKG4pP2RlbGV0ZSBpW2VdOmlbZV09dC50YXJnZXQuaW1tZWRpYXRlVmFsdWUsdGhpcy5fcnVuVG9TdGVwSW5kZXg9aX1fY29tcHV0ZU1heFN0ZXBJbmRleEZvclJ1bih0LGUpe2NvbnN0IG49dFtlXTtyZXR1cm4gbiYmbi5sZW5ndGg/bi5sZW5ndGgtMTowfV91cGRhdGVTdGVwc0Zvck5ld1J1bnMoKXt2YXIgdD10aGlzLnJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXM7Y29uc3QgZT1PYmplY3QuYXNzaWduKHt9LHRoaXMuX3J1blRvU3RlcEluZGV4KTtTZS5leHBvcnRzLmZvck93bih0LCgodCxuKT0+e1NlLmV4cG9ydHMuaXNOdW1iZXIoZVtuXSl8fChlW25dPXQubGVuZ3RoLTEpfSkpLHRoaXMuX3J1blRvU3RlcEluZGV4PWV9X2dldFN0ZXAodCxlKXtyZXR1cm4gdGhpcy5fcnVuVG9TdGVwSW5kZXg/dGhpcy5fcnVuVG9TdGVwSW5kZXhbZV06MH1fY29tcHV0ZVJ1blRvU3RlcCh0LGUpe2NvbnN0IG49e307cmV0dXJuIFNlLmV4cG9ydHMuZm9yT3duKGUsKChlLGkpPT57Y29uc3Qgcj10W2ldO3ImJihuW2ldPXJbZV0uc3RlcCl9KSksbn1nZXQgX3J1bnNXaXRoU2xpZGVycygpe3ZhciB0PXRoaXMucnVuVG9BdmFpbGFibGVUaW1lRW50cmllcztyZXR1cm4gdGhpcy5ydW5zLmZpbHRlcigoZT0+dFtlXSkpfX07ejd0LnRlbXBsYXRlPV9lYAogICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfcnVuc1dpdGhTbGlkZXJzXV0iIGFzPSJydW4iPgogICAgICA8ZGl2IGNsYXNzPSJydW4td2lkZ2V0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJydW4tZGlzcGxheS1jb250YWluZXIiPgogICAgICAgICAgPGRpdgogICAgICAgICAgICBjbGFzcz0icnVuLWNvbG9yLWJveCIKICAgICAgICAgICAgc3R5bGU9ImJhY2tncm91bmQ6W1tfY29tcHV0ZUNvbG9yRm9yUnVuKHJ1bildXTsiCiAgICAgICAgICA+PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJydW4tdGV4dCI+W1tydW5dXTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InN0ZXAtZGlzcGxheS1jb250YWluZXIiPgogICAgICAgICAgW1tfY29tcHV0ZVRpbWVUZXh0Rm9yUnVuKHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMsIF9ydW5Ub1N0ZXBJbmRleCwKICAgICAgICAgIHJ1biwgdGltZURpc3BsYXlUeXBlKV1dCiAgICAgICAgPC9kaXY+CiAgICAgICAgPHBhcGVyLXNsaWRlcgogICAgICAgICAgZGF0YS1ydW4kPSJbW3J1bl1dIgogICAgICAgICAgc3RlcD0iMSIKICAgICAgICAgIHR5cGU9Im51bWJlciIKICAgICAgICAgIG1pbj0iMCIKICAgICAgICAgIG1heD0iW1tfY29tcHV0ZU1heFN0ZXBJbmRleEZvclJ1bihydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzLCBydW4pXV0iCiAgICAgICAgICB2YWx1ZT0iW1tfZ2V0U3RlcChfcnVuVG9TdGVwSW5kZXgsIHJ1bildXSIKICAgICAgICAgIG9uLWltbWVkaWF0ZS12YWx1ZS1jaGFuZ2VkPSJfc2xpZGVyVmFsdWVDaGFuZ2VkIgogICAgICAgID48L3BhcGVyLXNsaWRlcj4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAucnVuLXdpZGdldCB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgMCAwOwogICAgICB9CiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgbWFyZ2luOiAtOHB4IDAgMCAtMTVweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuc3RlcC1kaXNwbGF5LWNvbnRhaW5lciB7CiAgICAgICAgZm9udC1zaXplOiAwLjllbTsKICAgICAgICBtYXJnaW46IDAgMTVweCAwIDA7CiAgICAgIH0KICAgICAgLnJ1bi10ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgLnJ1bi1jb2xvci1ib3ggewogICAgICAgIHdpZHRoOiAxMnB4OwogICAgICAgIGhlaWdodDogMTJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLHo3dC5wcm90b3R5cGUsInJ1bnMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sejd0LnByb3RvdHlwZSwicnVuVG9BdmFpbGFibGVUaW1lRW50cmllcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxub3RpZnk6ITAsY29tcHV0ZWQ6Il9jb21wdXRlUnVuVG9TdGVwKHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMsIF9ydW5Ub1N0ZXBJbmRleCkifSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHo3dC5wcm90b3R5cGUsInJ1blRvU3RlcCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx6N3QucHJvdG90eXBlLCJ0aW1lRGlzcGxheVR5cGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sejd0LnByb3RvdHlwZSwiX3J1blRvU3RlcEluZGV4Iix2b2lkIDApLHQoW2EoInJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLHo3dC5wcm90b3R5cGUsIl91cGRhdGVTdGVwc0Zvck5ld1J1bnMiLG51bGwpLHQoW3MoInJ1bnMiLCJydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzIiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSx6N3QucHJvdG90eXBlLCJfcnVuc1dpdGhTbGlkZXJzIixudWxsKSx6N3Q9dChbaSgidGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3IiKV0sejd0KTtsZXQgRDd0PWNsYXNzIGV4dGVuZHMoZXIoeWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5yZWxvYWRPblJlYWR5PSEwLHRoaXMuX3RpbWVEaXNwbGF5VHlwZT0ic3RlcCIsdGhpcy5fc2VsZWN0ZWRSdW5zPVtdLHRoaXMuX3J1blRvVGFnSW5mbz17fSx0aGlzLl90YWdUb1J1blRvRGF0YT17fSx0aGlzLl9nZXRDYXRlZ29yeUl0ZW1LZXk9dD0+dC50YWcsdGhpcy5fcmVxdWVzdE1hbmFnZXI9bmV3IGRyLHRoaXMuX3N0ZXA9MH1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5yZWxvYWRPblJlYWR5JiZ0aGlzLnJlbG9hZCgpfXJlbG9hZCgpe1Byb21pc2UuYWxsKFt0aGlzLl9mZXRjaFRhZ3MoKV0pLnRoZW4oKCgpPT57dGhpcy5fcmVsb2FkQ2FyZHMoKX0pKX1fc2hvdWxkT3Blbih0KXtyZXR1cm4gdDw9Mn1fZmV0Y2hUYWdzKCl7Y29uc3QgdD1fcigpLnBsdWdpblJvdXRlKCJwcl9jdXJ2ZXMiLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHQpLnRoZW4oKHQ9PntpZihTZS5leHBvcnRzLmlzRXF1YWwodCx0aGlzLl9ydW5Ub1RhZ0luZm8pKXJldHVybjtjb25zdCBlPWFyKFNlLmV4cG9ydHMubWFwVmFsdWVzKHQsKHQ9PlNlLmV4cG9ydHMua2V5cyh0KSkpKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWUubGVuZ3RoKSx0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsdCksdGhpcy5hc3luYygoKCk9Pnt0aGlzLnNldCgiX2NhdGVnb3JpZXNEb21SZWFkeSIsITApfSkpfSkpfV9yZWxvYWRDYXJkcygpe1NlLmV4cG9ydHMuZm9yRWFjaCh0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtcHItY3VydmUtY2FyZCIpLCh0PT57dC5yZWxvYWQoKX0pKX1nZXQgX2NhdGVnb3JpZXMoKXt2YXIgdD10aGlzLl9zZWxlY3RlZFJ1bnMsZT10aGlzLl90YWdGaWx0ZXI7cmV0dXJuIHdyKFNlLmV4cG9ydHMubWFwVmFsdWVzKHRoaXMuX3J1blRvVGFnSW5mbywodD0+T2JqZWN0LmtleXModCkpKSx0LGUpfWdldCBfcmVsZXZhbnRTZWxlY3RlZFJ1bnMoKXt2YXIgdD10aGlzLl9ydW5Ub1RhZ0luZm87cmV0dXJuIHRoaXMuX3NlbGVjdGVkUnVucy5maWx0ZXIoKGU9PnRbZV0pKX1fdGFnTWV0YWRhdGEodCxlLG4pe2NvbnN0IGk9e307ZS5mb3JFYWNoKChlPT57aVtlXT10W2VdW25dfSkpO2NvbnN0IHI9bi5yZXBsYWNlKC9cL3ByX2N1cnZlcyQvLCIiKTtyZXR1cm4gZU8oaSxyKX1fY3JlYXRlRGF0YUNoYW5nZUNhbGxiYWNrKHQpe3JldHVybiBlPT57dGhpcy5zZXQoIl90YWdUb1J1blRvRGF0YSIsT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHRoaXMuX3RhZ1RvUnVuVG9EYXRhKSx7W3RdOmV9KSl9fWdldCBfcnVuVG9BdmFpbGFibGVUaW1lRW50cmllcygpe3ZhciB0PXRoaXMuX3RhZ1RvUnVuVG9EYXRhO2NvbnN0IGU9e307Zm9yKGNvbnN0W24saV1vZiBPYmplY3QuZW50cmllcyh0KSlmb3IoY29uc3RbdF1vZiBPYmplY3QuZW50cmllcyhpKSkobnVsbD09ZVt0XXx8bjxlW3RdKSYmKGVbdF09bik7Y29uc3Qgbj17fTtmb3IoY29uc3RbaSxyXW9mIE9iamVjdC5lbnRyaWVzKGUpKXtjb25zdCBlPXRbcl1baV07bltpXT1lLm1hcCgodD0+KHtzdGVwOnQuc3RlcCx3YWxsX3RpbWU6dC53YWxsX3RpbWUscmVsYXRpdmU6dC53YWxsX3RpbWUtZVswXS53YWxsX3RpbWV9KSkpfXJldHVybiBufX07RDd0LnRlbXBsYXRlPV9lYAogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IKICAgICAgICAgICAgICBpZD0idGltZS10eXBlLXNlbGVjdG9yIgogICAgICAgICAgICAgIG5hbWU9IlRpbWUgRGlzcGxheSBUeXBlIgogICAgICAgICAgICAgIHNlbGVjdGVkLWlkPSJ7e190aW1lRGlzcGxheVR5cGV9fSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InN0ZXAiPnN0ZXA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8IS0tCiAgICAgICAgICAgIC0tPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDwhLS0KICAgICAgICAgICAgLS0+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3J1blRvQXZhaWxhYmxlVGltZUVudHJpZXNdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiIgaWQ9InN0ZXBzLXNlbGVjdG9yLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgPHRmLXByLWN1cnZlLXN0ZXBzLXNlbGVjdG9yCiAgICAgICAgICAgICAgICBydW5zPSJbW19yZWxldmFudFNlbGVjdGVkUnVuc11dIgogICAgICAgICAgICAgICAgcnVuLXRvLXN0ZXA9Int7X3J1blRvU3RlcH19IgogICAgICAgICAgICAgICAgcnVuLXRvLWF2YWlsYWJsZS10aW1lLWVudHJpZXM9IltbX3J1blRvQXZhaWxhYmxlVGltZUVudHJpZXNdXSIKICAgICAgICAgICAgICAgIHRpbWUtZGlzcGxheS10eXBlPSJbW190aW1lRGlzcGxheVR5cGVdXSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgPC90Zi1wci1jdXJ2ZS1zdGVwcy1zZWxlY3Rvcj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBydW5zLXNlbGVjdG9yIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBwcmVjaXNpb27igJNyZWNhbGwgY3VydmUgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIFlvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgcHJlY2lzaW9u4oCTcmVjYWxsIGRhdGEgdG8geW91ciBldmVudAogICAgICAgICAgICAgICAgZmlsZXMuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIgogICAgICAgICAgICAgICAgPlJFQURNRTwvYQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCIKICAgICAgICAgICAgICAgID5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYQogICAgICAgICAgICAgID4uCiAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciCiAgICAgICAgICAgICAgICA+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3CiAgICAgICAgICAgICAgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIKICAgICAgICAgICAgICBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSIKICAgICAgICAgICAgICBnZXQtY2F0ZWdvcnktaXRlbS1rZXk9IltbX2dldENhdGVnb3J5SXRlbUtleV1dIgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLXByLWN1cnZlLWNhcmQKICAgICAgICAgICAgICAgICAgYWN0aXZlPSJbW2FjdGl2ZV1dIgogICAgICAgICAgICAgICAgICBydW5zPSJbW2l0ZW0ucnVuc11dIgogICAgICAgICAgICAgICAgICB0YWc9IltbaXRlbS50YWddXSIKICAgICAgICAgICAgICAgICAgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1bnMsIGl0ZW0udGFnKV1dIgogICAgICAgICAgICAgICAgICByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iCiAgICAgICAgICAgICAgICAgIHJ1bi10by1zdGVwLWNhcD0iW1tfcnVuVG9TdGVwXV0iCiAgICAgICAgICAgICAgICAgIG9uLWRhdGEtY2hhbmdlPSJbW19jcmVhdGVEYXRhQ2hhbmdlQ2FsbGJhY2soaXRlbS50YWcpXV0iCiAgICAgICAgICAgICAgICA+PC90Zi1wci1jdXJ2ZS1jYXJkPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CgogICAgICAvKiogRG8gbm90IGxldCB0aGUgc3RlcHMgc2VsZWN0b3Igb2NjbHVkZSB0aGUgcnVuIHNlbGVjdG9yLiAqLwogICAgICAjc3RlcHMtc2VsZWN0b3ItY29udGFpbmVyIHsKICAgICAgICBtYXgtaGVpZ2h0OiA2MCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sRDd0LnByb3RvdHlwZSwicmVsb2FkT25SZWFkeSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxEN3QucHJvdG90eXBlLCJfdGltZURpc3BsYXlUeXBlIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxEN3QucHJvdG90eXBlLCJfc2VsZWN0ZWRSdW5zIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEQ3dC5wcm90b3R5cGUsIl9ydW5Ub1RhZ0luZm8iLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sRDd0LnByb3RvdHlwZSwiX3RhZ1RvUnVuVG9EYXRhIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxEN3QucHJvdG90eXBlLCJfcnVuVG9TdGVwIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sRDd0LnByb3RvdHlwZSwiX2RhdGFOb3RGb3VuZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxEN3QucHJvdG90eXBlLCJfdGFnRmlsdGVyIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sRDd0LnByb3RvdHlwZSwiX2NhdGVnb3JpZXNEb21SZWFkeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxEN3QucHJvdG90eXBlLCJfZ2V0Q2F0ZWdvcnlJdGVtS2V5Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLGRyKV0sRDd0LnByb3RvdHlwZSwiX3JlcXVlc3RNYW5hZ2VyIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxEN3QucHJvdG90eXBlLCJfc3RlcCIsdm9pZCAwKSx0KFtzKCJfcnVuVG9UYWdJbmZvIiwiX3NlbGVjdGVkUnVucyIsIl90YWdGaWx0ZXIiLCJfY2F0ZWdvcmllc0RvbVJlYWR5IiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxEN3QucHJvdG90eXBlLCJfY2F0ZWdvcmllcyIsbnVsbCksdChbcygiX3NlbGVjdGVkUnVucyIsIl9ydW5Ub1RhZ0luZm8iKSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLEQ3dC5wcm90b3R5cGUsIl9yZWxldmFudFNlbGVjdGVkUnVucyIsbnVsbCksdChbcygiX3RhZ1RvUnVuVG9EYXRhIiksZSgiZGVzaWduOnR5cGUiLE9iamVjdCksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sRDd0LnByb3RvdHlwZSwiX3J1blRvQXZhaWxhYmxlVGltZUVudHJpZXMiLG51bGwpLEQ3dD10KFtpKCJ0Zi1wci1jdXJ2ZS1kYXNoYm9hcmQiKV0sRDd0KTtsZXQgQjd0PWNsYXNzIGV4dGVuZHMoZXIoeWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5faW5zdGFsbENvbW1hbmQ9InBpcCBpbnN0YWxsIC1VIHRlbnNvcmJvYXJkLXBsdWdpbi1wcm9maWxlIn1fY29weUluc3RhbGxDb21tYW5kKCl7cmV0dXJuIG4odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PSgpPT5uKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dGhpcy4kLmNvbW1hbmRUZXh0YXJlYS5zZWxlY3QoKTt0cnl7eWllbGQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGhpcy5faW5zdGFsbENvbW1hbmQpfWNhdGNoKHQpe2lmKCFkb2N1bWVudC5leGVjQ29tbWFuZCgiY29weSIpKXJldHVybiBQcm9taXNlLnJlamVjdCgpfX0pKSxlPXRoaXMuJC5jb3BpZWRNZXNzYWdlO3RyeXt5aWVsZCB0KCksZS5pbm5lclRleHQ9IkNvcGllZC4ifWNhdGNoKHQpe2UuaW5uZXJUZXh0PSJGYWlsZWQgdG8gY29weSB0byBjbGlwYm9hcmQuIn19KSl9X3JlbW92ZUNvcGllZE1lc3NhZ2UoKXt0aGlzLiQuY29waWVkTWVzc2FnZS5pbm5lclRleHQ9IiJ9fTtCN3QudGVtcGxhdGU9X2VgCiAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj4KICAgICAgPGgzPlRoZSBwcm9maWxlIHBsdWdpbiBoYXMgbW92ZWQuPC9oMz4KICAgICAgPHA+CiAgICAgICAgUGxlYXNlIGluc3RhbGwgdGhlIG5ldyB2ZXJzaW9uIG9mIHRoZSBwcm9maWxlIHBsdWdpbiBmcm9tIFB5UEkgYnkKICAgICAgICBydW5uaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBmcm9tIHRoZSBtYWNoaW5lIHJ1bm5pbmcgVGVuc29yQm9hcmQ6CiAgICAgIDwvcD4KICAgICAgPHRleHRhcmVhCiAgICAgICAgaWQ9ImNvbW1hbmRUZXh0YXJlYSIKICAgICAgICByZWFkb25seT0iIgogICAgICAgIHJvd3M9IjEiCiAgICAgICAgb24tYmx1cj0iX3JlbW92ZUNvcGllZE1lc3NhZ2UiCiAgICAgID4KW1tfaW5zdGFsbENvbW1hbmRdXTwvdGV4dGFyZWEKICAgICAgPgogICAgICA8ZGl2IGlkPSJjb3B5Q29udGFpbmVyIj4KICAgICAgICA8c3BhbiBpZD0iY29waWVkTWVzc2FnZSI+PC9zcGFuPgogICAgICAgIDxwYXBlci1idXR0b24gcmFpc2VkPSIiIG9uLXRhcD0iX2NvcHlJbnN0YWxsQ29tbWFuZCIKICAgICAgICAgID5Db3B5IHRvIGNsaXBib2FyZDwvcGFwZXItYnV0dG9uCiAgICAgICAgPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIC5tZXNzYWdlIHsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgfQogICAgICAjY29tbWFuZFRleHRhcmVhIHsKICAgICAgICBtYXJnaW4tdG9wOiAxZXg7CiAgICAgICAgcGFkZGluZzogMWV4IDFlbTsKICAgICAgICByZXNpemU6IHZlcnRpY2FsOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICAgICNjb3B5Q29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CiAgICAgICNjb3BpZWRNZXNzYWdlIHsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxZW07CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxCN3QucHJvdG90eXBlLCJfaW5zdGFsbENvbW1hbmQiLHZvaWQgMCksQjd0PXQoW2koInRmLXByb2ZpbGUtcmVkaXJlY3QtZGFzaGJvYXJkIildLEI3dCk7bGV0IEg3dD1jbGFzcyBleHRlbmRzKGVyKGhsKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMucmVsb2FkT25SZWFkeT0hMCx0aGlzLl9zaG93RG93bmxvYWRMaW5rcz1IcygiX3Nob3dEb3dubG9hZExpbmtzIix7ZGVmYXVsdFZhbHVlOiExLHVzZUxvY2FsU3RvcmFnZTohMH0pLmNhbGwodGhpcyksdGhpcy5fc21vb3RoaW5nV2VpZ2h0PUdzKCJfc21vb3RoaW5nV2VpZ2h0Iix7ZGVmYXVsdFZhbHVlOi42fSkuY2FsbCh0aGlzKSx0aGlzLl9pZ25vcmVZT3V0bGllcnM9SHMoIl9pZ25vcmVZT3V0bGllcnMiLHtkZWZhdWx0VmFsdWU6ITAsdXNlTG9jYWxTdG9yYWdlOiEwfSkuY2FsbCh0aGlzKSx0aGlzLl94VHlwZT14VHQuU1RFUCx0aGlzLl9zZWxlY3RlZFJ1bnM9W10sdGhpcy5fdGFnRmlsdGVyPSIiLHRoaXMuX2NhdGVnb3JpZXM9W10sdGhpcy5fZ2V0Q2F0ZWdvcnlJdGVtS2V5PXQ9PnQudGFnLHRoaXMuX3JlcXVlc3RNYW5hZ2VyPW5ldyBkcig1MCksdGhpcy5fc2hvd0Rvd25sb2FkTGlua3NPYnNlcnZlcj1GcygiX3Nob3dEb3dubG9hZExpbmtzIix7ZGVmYXVsdFZhbHVlOiExLHVzZUxvY2FsU3RvcmFnZTohMH0pLHRoaXMuX3Ntb290aGluZ1dlaWdodE9ic2VydmVyPVdzKCJfc21vb3RoaW5nV2VpZ2h0Iix7ZGVmYXVsdFZhbHVlOi42fSksdGhpcy5faWdub3JlWU91dGxpZXJzT2JzZXJ2ZXI9RnMoIl9pZ25vcmVZT3V0bGllcnMiLHtkZWZhdWx0VmFsdWU6ITAsdXNlTG9jYWxTdG9yYWdlOiEwfSl9Z2V0IF9zbW9vdGhpbmdFbmFibGVkKCl7cmV0dXJuIHRoaXMuX3Ntb290aGluZ1dlaWdodD4wfV9nZXRDYXRlZ29yeUtleSh0KXtyZXR1cm4gdC5tZXRhZGF0YS50eXBlPT1ici5TRUFSQ0hfUkVTVUxUUz8iIjp0Lm5hbWV9X3Nob3VsZE9wZW4odCl7cmV0dXJuIHQ8PTJ9cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMucmVsb2FkT25SZWFkeSYmdGhpcy5yZWxvYWQoKX1yZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgoKT0+e3RoaXMuX3JlbG9hZENoYXJ0cygpfSkpfV9mZXRjaFRhZ3MoKXtjb25zdCB0PV9yKCkucGx1Z2luUm91dGUoInNjYWxhcnMiLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHQpLnRoZW4oKHQ9PntpZihTZS5leHBvcnRzLmlzRXF1YWwodCx0aGlzLl9ydW5Ub1RhZ0luZm8pKXJldHVybjtjb25zdCBlPWFyKFNlLmV4cG9ydHMubWFwVmFsdWVzKHQsKHQ9Pk9iamVjdC5rZXlzKHQpKSkpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09ZS5sZW5ndGgpLHRoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIix0KSx0aGlzLmFzeW5jKCgoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KSl9KSl9X3JlbG9hZENoYXJ0cygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1zY2FsYXItY2FyZCIpLmZvckVhY2goKHQ9Pnt0LnJlbG9hZCgpfSkpfV91cGRhdGVDYXRlZ29yaWVzKCl7dmFyIHQ9dGhpcy5fc2VsZWN0ZWRSdW5zO2xldCBlLG49dGhpcy5fdGFnRmlsdGVyO2U9d3IoU2UuZXhwb3J0cy5tYXBWYWx1ZXModGhpcy5fcnVuVG9UYWdJbmZvLCh0PT5PYmplY3Qua2V5cyh0KSkpLHQsbiksZS5mb3JFYWNoKCh0PT57dC5pdGVtcz10Lml0ZW1zLm1hcCgodD0+KHt0YWc6dC50YWcsc2VyaWVzOnQucnVucy5tYXAoKGU9Pih7cnVuOmUsdGFnOnQudGFnfSkpKX0pKSl9KSksdGhpcy51cGRhdGVBcnJheVByb3AoIl9jYXRlZ29yaWVzIixlLHRoaXMuX2dldENhdGVnb3J5S2V5KX1fdGFnTWV0YWRhdGEodCxlLG4pe2NvbnN0IGk9dC5uYW1lLHI9bi50YWcsbz17fTtuLnNlcmllcy5mb3JFYWNoKCgoe3J1bjp0fSk9PntvW3RdPWVbdF1bcl19KSk7Y29uc3QgYT1yLnJlcGxhY2UoL1wvc2NhbGFyX3N1bW1hcnkkLywiIik7bGV0e2Rlc2NyaXB0aW9uOnMsZGlzcGxheU5hbWU6bH09ZU8obyxhKTtyZXR1cm4gdC5tZXRhZGF0YS50eXBlPT1ici5QUkVGSVhfR1JPVVAmJmwuc3RhcnRzV2l0aChpKyIvIikmJihsPWwuc2xpY2UoaS5sZW5ndGgrMSkpLHtkZXNjcmlwdGlvbjpzLGRpc3BsYXlOYW1lOmx9fX07SDd0LnRlbXBsYXRlPV9lYAogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxpbmUtaXRlbSI+CiAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94CiAgICAgICAgICAgICAgICBpZD0ic2hvdy1kb3dubG9hZC1saW5rcyIKICAgICAgICAgICAgICAgIGNoZWNrZWQ9Int7X3Nob3dEb3dubG9hZExpbmtzfX0iCiAgICAgICAgICAgICAgICA+U2hvdyBkYXRhIGRvd25sb2FkIGxpbmtzPC9wYXBlci1jaGVja2JveAogICAgICAgICAgICAgID4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxpbmUtaXRlbSI+CiAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94CiAgICAgICAgICAgICAgICBpZD0iaWdub3JlLXktb3V0bGllciIKICAgICAgICAgICAgICAgIGNoZWNrZWQ9Int7X2lnbm9yZVlPdXRsaWVyc319IgogICAgICAgICAgICAgICAgPklnbm9yZSBvdXRsaWVycyBpbiBjaGFydCBzY2FsaW5nPC9wYXBlci1jaGVja2JveAogICAgICAgICAgICAgID4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZyI+CiAgICAgICAgICAgICAgPGRpdj5Ub29sdGlwIHNvcnRpbmcgbWV0aG9kOjwvZGl2PgogICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51CiAgICAgICAgICAgICAgICBuby1sYWJlbC1mbG9hdAogICAgICAgICAgICAgICAgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfdG9vbHRpcFNvcnRpbmdNZXRob2R9fSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveAogICAgICAgICAgICAgICAgICBjbGFzcz0iZHJvcGRvd24tY29udGVudCIKICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ9IjAiCiAgICAgICAgICAgICAgICAgIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlZmF1bHQ8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlc2NlbmRpbmc8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmFzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bmVhcmVzdDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8dGYtc21vb3RoaW5nLWlucHV0CiAgICAgICAgICAgICAgd2VpZ2h0PSJ7e19zbW9vdGhpbmdXZWlnaHR9fSIKICAgICAgICAgICAgICBzdGVwPSIwLjAwMSIKICAgICAgICAgICAgICBtaW49IjAiCiAgICAgICAgICAgICAgbWF4PSIwLjk5OSIKICAgICAgICAgICAgPjwvdGYtc21vb3RoaW5nLWlucHV0PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yCiAgICAgICAgICAgICAgaWQ9IngtdHlwZS1zZWxlY3RvciIKICAgICAgICAgICAgICBuYW1lPSJIb3Jpem9udGFsIEF4aXMiCiAgICAgICAgICAgICAgc2VsZWN0ZWQtaWQ9Int7X3hUeXBlfX0iCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24KICAgICAgICAgICAgICA+PCEtLQogICAgICAgICAgICAtLT48cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbgogICAgICAgICAgICAgID48IS0tCiAgICAgICAgICAgIC0tPjxwYXBlci1idXR0b24gaWQ9IndhbGxfdGltZSI+d2FsbDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBydW5zLXNlbGVjdG9yIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBzY2FsYXIgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IHNjYWxhciBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIKICAgICAgICAgICAgICAgID5SRUFETUU8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiCiAgICAgICAgICAgICAgICA+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2EKICAgICAgICAgICAgICA+LgogICAgICAgICAgICA8L3A+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIgogICAgICAgICAgICAgICAgPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldwogICAgICAgICAgICAgIGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iCiAgICAgICAgICAgICAgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iCiAgICAgICAgICAgICAgZ2V0LWNhdGVnb3J5LWl0ZW0ta2V5PSJbW19nZXRDYXRlZ29yeUl0ZW1LZXldXSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1zY2FsYXItY2FyZAogICAgICAgICAgICAgICAgICBhY3RpdmU9IltbYWN0aXZlXV0iCiAgICAgICAgICAgICAgICAgIGRhdGEtdG8tbG9hZD0iW1tpdGVtLnNlcmllc11dIgogICAgICAgICAgICAgICAgICBpZ25vcmUteS1vdXRsaWVycz0iW1tfaWdub3JlWU91dGxpZXJzXV0iCiAgICAgICAgICAgICAgICAgIG11bHRpLWV4cGVyaW1lbnRzPSJbW19nZXRNdWx0aUV4cGVyaW1lbnRzKGRhdGFTZWxlY3Rpb24pXV0iCiAgICAgICAgICAgICAgICAgIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgICAgICAgICAgICAgc2hvdy1kb3dubG9hZC1saW5rcz0iW1tfc2hvd0Rvd25sb2FkTGlua3NdXSIKICAgICAgICAgICAgICAgICAgc21vb3RoaW5nLWVuYWJsZWQ9IltbX3Ntb290aGluZ0VuYWJsZWRdXSIKICAgICAgICAgICAgICAgICAgc21vb3RoaW5nLXdlaWdodD0iW1tfc21vb3RoaW5nV2VpZ2h0XV0iCiAgICAgICAgICAgICAgICAgIHRhZy1tZXRhZGF0YT0iW1tfdGFnTWV0YWRhdGEoY2F0ZWdvcnksIF9ydW5Ub1RhZ0luZm8sIGl0ZW0pXV0iCiAgICAgICAgICAgICAgICAgIHRhZz0iW1tpdGVtLnRhZ11dIgogICAgICAgICAgICAgICAgICB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW190b29sdGlwU29ydGluZ01ldGhvZF1dIgogICAgICAgICAgICAgICAgICB4LXR5cGU9IltbX3hUeXBlXV0iCiAgICAgICAgICAgICAgICAgIGJhdGNoLXNpemU9IltbZmVhdHVyZUZsYWdzLnNjYWxhcnNCYXRjaFNpemVdXSIKICAgICAgICAgICAgICAgICAgaW4tY29sYWI9IltbZmVhdHVyZUZsYWdzLmluQ29sYWJdXSIKICAgICAgICAgICAgICAgID48L3RmLXNjYWxhci1jYXJkPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgICN0b29sdGlwLXNvcnRpbmcgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogMTVweDsKICAgICAgfQoKICAgICAgI3Rvb2x0aXAtc29ydGluZyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CgogICAgICAubGluZS1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nLXRvcDogNXB4OwogICAgICB9CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICAgIC5jZW50ZXIgewogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sSDd0LnByb3RvdHlwZSwicmVsb2FkT25SZWFkeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxIN3QucHJvdG90eXBlLCJmZWF0dXJlRmxhZ3MiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFuLG5vdGlmeTohMCxvYnNlcnZlcjoiX3Nob3dEb3dubG9hZExpbmtzT2JzZXJ2ZXIifSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxIN3QucHJvdG90eXBlLCJfc2hvd0Rvd25sb2FkTGlua3MiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXIsbm90aWZ5OiEwLG9ic2VydmVyOiJfc21vb3RoaW5nV2VpZ2h0T2JzZXJ2ZXIifSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLEg3dC5wcm90b3R5cGUsIl9zbW9vdGhpbmdXZWlnaHQiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfaWdub3JlWU91dGxpZXJzT2JzZXJ2ZXIifSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxIN3QucHJvdG90eXBlLCJfaWdub3JlWU91dGxpZXJzIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLEg3dC5wcm90b3R5cGUsIl94VHlwZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sSDd0LnByb3RvdHlwZSwiX3NlbGVjdGVkUnVucyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxIN3QucHJvdG90eXBlLCJfcnVuVG9UYWdJbmZvIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sSDd0LnByb3RvdHlwZSwiX2RhdGFOb3RGb3VuZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxIN3QucHJvdG90eXBlLCJfdGFnRmlsdGVyIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sSDd0LnByb3RvdHlwZSwiX2NhdGVnb3JpZXNEb21SZWFkeSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sSDd0LnByb3RvdHlwZSwiX2NhdGVnb3JpZXMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sSDd0LnByb3RvdHlwZSwiX2dldENhdGVnb3J5SXRlbUtleSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixkcildLEg3dC5wcm90b3R5cGUsIl9yZXF1ZXN0TWFuYWdlciIsdm9pZCAwKSx0KFtzKCJfc21vb3RoaW5nV2VpZ2h0IiksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLEg3dC5wcm90b3R5cGUsIl9zbW9vdGhpbmdFbmFibGVkIixudWxsKSx0KFthKCJfcnVuVG9UYWdJbmZvIiwiX3NlbGVjdGVkUnVucyIsIl90YWdGaWx0ZXIiLCJfY2F0ZWdvcmllc0RvbVJlYWR5IiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxIN3QucHJvdG90eXBlLCJfdXBkYXRlQ2F0ZWdvcmllcyIsbnVsbCksSDd0PXQoW2koInRmLXNjYWxhci1kYXNoYm9hcmQiKV0sSDd0KTtsZXQgRjd0PWNsYXNzIGV4dGVuZHMoZXIoeWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fdGV4dHM9W10sdGhpcy5fY2FuY2VsbGVyPW5ldyBYUn1nZXQgX3J1bkNvbG9yKCl7cmV0dXJuIEdSKHRoaXMucnVuKX1fY2hhbmdlUnVuQ29sb3IoKXt0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tdGItdGV4dC1sb2FkZXItb3V0bGluZSI6dGhpcy5fcnVuQ29sb3J9KX1hdHRhY2hlZCgpe3RoaXMucmVsb2FkKCl9cmVsb2FkKCl7aWYoIXRoaXMuaXNBdHRhY2hlZClyZXR1cm47dGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO2NvbnN0IHQ9aU8oX3IoKS5wbHVnaW5Sb3V0ZSgidGV4dCIsIi90ZXh0Iikse3RhZzp0aGlzLnRhZyxydW46dGhpcy5ydW59KSxlPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZSgodD0+e2lmKHQuY2FuY2VsbGVkKXJldHVybjtjb25zdCBlPXQudmFsdWUubWFwKCh0PT4oe3dhbGxfdGltZTpuZXcgRGF0ZSgxZTMqdC53YWxsX3RpbWUpLHN0ZXA6dC5zdGVwLHRleHQ6dC50ZXh0fSkpKTt0aGlzLnNldCgiX3RleHRzIixlLnNsaWNlKCkucmV2ZXJzZSgpKX0pKTt0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodCkudGhlbihlKX1fZm9ybWF0U3RlcCh0KXtyZXR1cm4gbXkoIiwiKSh0KX19O0Y3dC50ZW1wbGF0ZT1fZWAKICAgIDx0Zi1jYXJkLWhlYWRpbmcgcnVuPSJbW3J1bl1dIiB0YWc9IltbdGFnXV0iIGNvbG9yPSJbW19ydW5Db2xvcl1dIj4KICAgIDwvdGYtY2FyZC1oZWFkaW5nPgogICAgPHBhcGVyLW1hdGVyaWFsCiAgICAgIGVsZXZhdGlvbj0iMSIKICAgICAgaWQ9InN0ZXBzLWNvbnRhaW5lciIKICAgICAgY2xhc3M9ImNvbnRhaW5lciBzY3JvbGxiYXIiCiAgICA+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3RleHRzXV0iPgogICAgICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGNsYXNzPSJzdGVwLWNvbnRhaW5lciI+CiAgICAgICAgICBzdGVwIDxzcGFuIGNsYXNzPSJzdGVwLXZhbHVlIj5bW19mb3JtYXRTdGVwKGl0ZW0uc3RlcCldXTwvc3Bhbj4KICAgICAgICA8L3BhcGVyLW1hdGVyaWFsPgogICAgICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGNsYXNzPSJ0ZXh0Ij4KICAgICAgICAgIDx0Zi1tYXJrZG93bi12aWV3IGh0bWw9IltbaXRlbS50ZXh0XV0iPjwvdGYtbWFya2Rvd24tdmlldz4KICAgICAgICA8L3BhcGVyLW1hdGVyaWFsPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9wYXBlci1tYXRlcmlhbD4KICAgIDxzdHlsZSBpbmNsdWRlPSJzY3JvbGxiYXItc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICAgIC5zY3JvbGxiYXIgewogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KICAgICAgI3N0ZXBzLWNvbnRhaW5lciB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIC8qIGNvbG9yIGNvbXB1dGVkIGFuZCBzZXQgYXMgaW5saW5lIHN0eWxlICovOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1heC1oZWlnaHQ6IDUwMHB4OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IDEwcHg7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS10Yi10ZXh0LWxvYWRlci1vdXRsaW5lKTsKICAgICAgfQogICAgICAudGV4dCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDsKICAgICAgICBib3JkZXItcmFkaXVzOiAwIDNweCAzcHggM3B4OwogICAgICAgIHBhZGRpbmc6IDVweDsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIC5zdGVwLWNvbnRhaW5lciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgICBib3JkZXItYm90dG9tOiBub25lOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweCAzcHggMCAwOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXRiLXVpLWJvcmRlcik7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7IC8qIHRvIGNvcnJlY3QgZm9yIGJvcmRlciAqLwogICAgICAgIHBhZGRpbmc6IDNweDsKICAgICAgfQogICAgICAuc3RlcC1jb250YWluZXI6bm90KDpmaXJzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi10b3A6IDE1cHg7CiAgICAgIH0KCiAgICAgIHRmLWNhcmQtaGVhZGluZyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLEY3dC5wcm90b3R5cGUsInJ1biIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxGN3QucHJvdG90eXBlLCJ0YWciLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLEY3dC5wcm90b3R5cGUsIl90ZXh0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixkcildLEY3dC5wcm90b3R5cGUsInJlcXVlc3RNYW5hZ2VyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLFhSKV0sRjd0LnByb3RvdHlwZSwiX2NhbmNlbGxlciIsdm9pZCAwKSx0KFtzKCJydW4iKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxGN3QucHJvdG90eXBlLCJfcnVuQ29sb3IiLG51bGwpLHQoW2EoIl9ydW5Db2xvciIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sRjd0LnByb3RvdHlwZSwiX2NoYW5nZVJ1bkNvbG9yIixudWxsKSxGN3Q9dChbaSgidGYtdGV4dC1sb2FkZXIiKV0sRjd0KTtsZXQgVjd0PWNsYXNzIGV4dGVuZHMoZXIoeWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5yZWxvYWRPblJlYWR5PSEwLHRoaXMuX3JlcXVlc3RNYW5hZ2VyPW5ldyBkcn1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5yZWxvYWRPblJlYWR5JiZ0aGlzLnJlbG9hZCgpfXJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCgpPT57dGhpcy5fcmVsb2FkVGV4dHMoKX0pKX1fc2hvdWxkT3Blbih0KXtyZXR1cm4gdDw9Mn1fZmV0Y2hUYWdzKCl7Y29uc3QgdD1fcigpLnBsdWdpblJvdXRlKCJ0ZXh0IiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0KS50aGVuKCh0PT57aWYoU2UuZXhwb3J0cy5pc0VxdWFsKHQsdGhpcy5fcnVuVG9UYWcpKXJldHVybjtjb25zdCBlPWFyKHQpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09ZS5sZW5ndGgpLHRoaXMuc2V0KCJfcnVuVG9UYWciLHQpLHRoaXMuYXN5bmMoKCgpPT57dGhpcy5zZXQoIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCEwKX0pKX0pKX1fcmVsb2FkVGV4dHMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtdGV4dC1sb2FkZXIiKS5mb3JFYWNoKCh0PT57dC5yZWxvYWQoKX0pKX1nZXQgX2NhdGVnb3JpZXMoKXtyZXR1cm4gTXIodGhpcy5fcnVuVG9UYWcsdGhpcy5fc2VsZWN0ZWRSdW5zLHRoaXMuX3RhZ0ZpbHRlcil9fTtWN3QudGVtcGxhdGU9X2VgCiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHRleHQgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IHRleHQgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiCiAgICAgICAgICAgICAgICA+UkVBRE1FPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIgogICAgICAgICAgICAgICAgPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hCiAgICAgICAgICAgICAgPi4KICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyIKICAgICAgICAgICAgICAgID50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcKICAgICAgICAgICAgICBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIgogICAgICAgICAgICAgIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLXRleHQtbG9hZGVyCiAgICAgICAgICAgICAgICAgIGFjdGl2ZT0iW1thY3RpdmVdXSIKICAgICAgICAgICAgICAgICAgdGFnPSJbW2l0ZW0udGFnXV0iCiAgICAgICAgICAgICAgICAgIHJ1bj0iW1tpdGVtLnJ1bl1dIgogICAgICAgICAgICAgICAgICByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iCiAgICAgICAgICAgICAgICA+PC90Zi10ZXh0LWxvYWRlcj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxWN3QucHJvdG90eXBlLCJyZWxvYWRPblJlYWR5Iix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxWN3QucHJvdG90eXBlLCJfc2VsZWN0ZWRSdW5zIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFY3dC5wcm90b3R5cGUsIl9ydW5Ub1RhZyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFY3dC5wcm90b3R5cGUsIl9kYXRhTm90Rm91bmQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sVjd0LnByb3RvdHlwZSwiX3RhZ0ZpbHRlciIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFY3dC5wcm90b3R5cGUsIl9jYXRlZ29yaWVzRG9tUmVhZHkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sVjd0LnByb3RvdHlwZSwiX3JlcXVlc3RNYW5hZ2VyIix2b2lkIDApLHQoW3MoIl9ydW5Ub1RhZyIsIl9zZWxlY3RlZFJ1bnMiLCJfdGFnRmlsdGVyIiwiX2NhdGVnb3JpZXNEb21SZWFkeSIpLGUoImRlc2lnbjp0eXBlIixBcnJheSksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sVjd0LnByb3RvdHlwZSwiX2NhdGVnb3JpZXMiLG51bGwpLFY3dD10KFtpKCJ0Zi10ZXh0LWRhc2hib2FyZCIpXSxWN3QpO2xldCBVN3Q9Y2xhc3MgZXh0ZW5kcyB5ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fdGVtcGxhdGU9bnVsbCx0aGlzLnRmX2JhY2tlbmQ9U0N0fX07VTd0PXQoW2koInRmLWJhY2tlbmQiKV0sVTd0KTtsZXQgajd0PWNsYXNzIGV4dGVuZHMgeWV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX3RlbXBsYXRlPW51bGwsdGhpcy50Zl9nbG9iYWxzPUVzfX07ajd0PXQoW2koInRmLWdsb2JhbHMiKV0sajd0KTtsZXQgRzd0PWNsYXNzIGV4dGVuZHMgeWV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX3RlbXBsYXRlPW51bGwsdGhpcy50Zl9zdG9yYWdlPUlDdH19O0c3dD10KFtpKCJ0Zi1zdG9yYWdlIildLEc3dCk7dmFyIFc3dD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxhZGRMaW1pdExpc3RlbmVyOmxsLHJlbW92ZUxpbWl0TGlzdGVuZXI6Y2wsZ2V0TGltaXQ6dWwsc2V0TGltaXQ6ZnVuY3Rpb24gcTd0KHQpe2lmKHQhPT1NYXRoLmZsb29yKHQpKXRocm93IG5ldyBFcnJvcihgbGltaXQgbXVzdCBiZSBhbiBpbnRlZ2VyLCBidXQgZ290OiAke3R9YCk7aWYodDw9MCl0aHJvdyBuZXcgRXJyb3IoYGxpbWl0IG11c3QgYmUgcG9zaXRpdmUsIGJ1dCBnb3Q6ICR7dH1gKTt0IT09YWwmJihhbD10LGpzKG9sLGFsLHt1c2VMb2NhbFN0b3JhZ2U6ITB9KSxzbC5mb3JFYWNoKCh0PT57dCgpfSkpKX0sVGZEb21SZXBlYXQ6ZGx9KTtsZXQgWTd0PWNsYXNzIGV4dGVuZHMgeWV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX3RlbXBsYXRlPW51bGwsdGhpcy50Zl9wYWdpbmF0ZWRfdmlldz1XN3R9fTtZN3Q9dChbaSgidGYtcGFnaW5hdGVkLXZpZXctc3RvcmUiKV0sWTd0KTtsZXQgWDd0PWNsYXNzIGV4dGVuZHMgeWV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX3RlbXBsYXRlPW51bGwsdGhpcy5ydW5zQ29sb3JTY2FsZT1HUn19O1g3dD10KFtpKCJ0Zi1jb2xvci1zY2FsZSIpXSxYN3QpfSkoKTsKCiEoZnVuY3Rpb24oKXsKLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4KCiAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKICAgIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC4KCiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSAogICAgUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCiAgICBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsCiAgICBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00KICAgIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCiAgICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAgICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KdmFyIHQ9ZnVuY3Rpb24oZSxuKXtyZXR1cm4odD1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSYmKHRbbl09ZVtuXSl9KShlLG4pfTtmdW5jdGlvbiBlKGUsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4mJm51bGwhPT1uKXRocm93IG5ldyBUeXBlRXJyb3IoIkNsYXNzIGV4dGVuZHMgdmFsdWUgIitTdHJpbmcobikrIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsIik7ZnVuY3Rpb24gbygpe3RoaXMuY29uc3RydWN0b3I9ZX10KGUsbiksZS5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKTooby5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IG8pfWZ1bmN0aW9uIG4odCxlKXt2YXIgbixvLGksYSxyPXtsYWJlbDowLHNlbnQ6ZnVuY3Rpb24oKXtpZigxJmlbMF0pdGhyb3cgaVsxXTtyZXR1cm4gaVsxXX0sdHJ5czpbXSxvcHM6W119O3JldHVybiBhPXtuZXh0OnMoMCksdGhyb3c6cygxKSxyZXR1cm46cygyKX0sImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKGFbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSksYTtmdW5jdGlvbiBzKGEpe3JldHVybiBmdW5jdGlvbihzKXtyZXR1cm4oZnVuY3Rpb24gbChhKXtpZihuKXRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4iKTtmb3IoO3I7KXRyeXtpZihuPTEsbyYmKGk9MiZhWzBdP28ucmV0dXJuOmFbMF0/by50aHJvd3x8KChpPW8ucmV0dXJuKSYmaS5jYWxsKG8pLDApOm8ubmV4dCkmJiEoaT1pLmNhbGwobyxhWzFdKSkuZG9uZSlyZXR1cm4gaTtzd2l0Y2gobz0wLGkmJihhPVsyJmFbMF0saS52YWx1ZV0pLGFbMF0pe2Nhc2UgMDpjYXNlIDE6aT1hO2JyZWFrO2Nhc2UgNDpyZXR1cm4gci5sYWJlbCsrLHt2YWx1ZTphWzFdLGRvbmU6ITF9O2Nhc2UgNTpyLmxhYmVsKyssbz1hWzFdLGE9WzBdO2NvbnRpbnVlO2Nhc2UgNzphPXIub3BzLnBvcCgpLHIudHJ5cy5wb3AoKTtjb250aW51ZTtkZWZhdWx0OmlmKCEoKGk9KGk9ci50cnlzKS5sZW5ndGg+MCYmaVtpLmxlbmd0aC0xXSl8fDYhPT1hWzBdJiYyIT09YVswXSkpe3I9MDtjb250aW51ZX1pZigzPT09YVswXSYmKCFpfHxhWzFdPmlbMF0mJmFbMV08aVszXSkpe3IubGFiZWw9YVsxXTticmVha31pZig2PT09YVswXSYmci5sYWJlbDxpWzFdKXtyLmxhYmVsPWlbMV0saT1hO2JyZWFrfWlmKGkmJnIubGFiZWw8aVsyXSl7ci5sYWJlbD1pWzJdLHIub3BzLnB1c2goYSk7YnJlYWt9aVsyXSYmci5vcHMucG9wKCksci50cnlzLnBvcCgpO2NvbnRpbnVlfWE9ZS5jYWxsKHQscil9Y2F0Y2godCl7YT1bNix0XSxvPTB9ZmluYWxseXtuPWk9MH1pZig1JmFbMF0pdGhyb3cgYVsxXTtyZXR1cm57dmFsdWU6YVswXT9hWzFdOnZvaWQgMCxkb25lOiEwfX0pKFthLHNdKX19fWZ1bmN0aW9uIG8odCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yLG49ZSYmdFtlXSxvPTA7aWYobilyZXR1cm4gbi5jYWxsKHQpO2lmKHQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgpcmV0dXJue25leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdCYmbz49dC5sZW5ndGgmJih0PXZvaWQgMCkse3ZhbHVlOnQmJnRbbysrXSxkb25lOiF0fX19O3Rocm93IG5ldyBUeXBlRXJyb3IoZT8iT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS4iOiJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuIil9ZnVuY3Rpb24gaSh0LGUpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnRbU3ltYm9sLml0ZXJhdG9yXTtpZighbilyZXR1cm4gdDt2YXIgbyxpLGE9bi5jYWxsKHQpLHI9W107dHJ5e2Zvcig7KHZvaWQgMD09PWV8fGUtLSA+MCkmJiEobz1hLm5leHQoKSkuZG9uZTspci5wdXNoKG8udmFsdWUpfWNhdGNoKHQpe2k9e2Vycm9yOnR9fWZpbmFsbHl7dHJ5e28mJiFvLmRvbmUmJihuPWEucmV0dXJuKSYmbi5jYWxsKGEpfWZpbmFsbHl7aWYoaSl0aHJvdyBpLmVycm9yfX1yZXR1cm4gcn1mdW5jdGlvbiBhKHQsZSl7Zm9yKHZhciBuPTAsbz1lLmxlbmd0aCxpPXQubGVuZ3RoO248bztuKyssaSsrKXRbaV09ZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiByKHQpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygcj8odGhpcy52PXQsdGhpcyk6bmV3IHIodCl9ZnVuY3Rpb24gcyh0LGUsbil7aWYoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpO3ZhciBvLGk9bi5hcHBseSh0LGV8fFtdKSxhPVtdO3JldHVybiBvPXt9LHMoIm5leHQiKSxzKCJ0aHJvdyIpLHMoInJldHVybiIpLG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LG87ZnVuY3Rpb24gcyh0KXtpW3RdJiYob1t0XT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG4sbyl7YS5wdXNoKFt0LGUsbixvXSk+MXx8bCh0LGUpfSkpfSl9ZnVuY3Rpb24gbCh0LGUpe3RyeXshKGZ1bmN0aW9uIG4odCl7dC52YWx1ZSBpbnN0YW5jZW9mIHI/UHJvbWlzZS5yZXNvbHZlKHQudmFsdWUudikudGhlbihjLGQpOnAoYVswXVsyXSx0KX0pKGlbdF0oZSkpfWNhdGNoKHQpe3AoYVswXVszXSx0KX19ZnVuY3Rpb24gYyh0KXtsKCJuZXh0Iix0KX1mdW5jdGlvbiBkKHQpe2woInRocm93Iix0KX1mdW5jdGlvbiBwKHQsZSl7dChlKSxhLnNoaWZ0KCksYS5sZW5ndGgmJmwoYVswXVswXSxhWzBdWzFdKX19ZnVuY3Rpb24gbCh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH1mdW5jdGlvbiBjKHQpe3ZhciBlPXQoKGZ1bmN0aW9uKHQpe0Vycm9yLmNhbGwodCksdC5zdGFjaz0obmV3IEVycm9yKS5zdGFja30pKTtyZXR1cm4gZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX12YXIgZD1jKChmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gZShuKXt0KHRoaXMpLHRoaXMubWVzc2FnZT1uP24ubGVuZ3RoKyIgZXJyb3JzIG9jY3VycmVkIGR1cmluZyB1bnN1YnNjcmlwdGlvbjpcbiIrbi5tYXAoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUrMSsiKSAiK3QudG9TdHJpbmcoKX0pKS5qb2luKCJcbiAgIik6IiIsdGhpcy5uYW1lPSJVbnN1YnNjcmlwdGlvbkVycm9yIix0aGlzLmVycm9ycz1ufX0pKTtmdW5jdGlvbiBwKHQsZSl7aWYodCl7dmFyIG49dC5pbmRleE9mKGUpOzA8PW4mJnQuc3BsaWNlKG4sMSl9fXZhciBtPShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5pbml0aWFsVGVhcmRvd249dCx0aGlzLmNsb3NlZD0hMSx0aGlzLl9wYXJlbnRhZ2U9bnVsbCx0aGlzLl90ZWFyZG93bnM9bnVsbH1yZXR1cm4gdC5wcm90b3R5cGUudW5zdWJzY3JpYmU9ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixzO2lmKCF0aGlzLmNsb3NlZCl7dGhpcy5jbG9zZWQ9ITA7dmFyIGM9dGhpcy5fcGFyZW50YWdlO2lmKGMpaWYodGhpcy5fcGFyZW50YWdlPW51bGwsQXJyYXkuaXNBcnJheShjKSl0cnl7Zm9yKHZhciBwPW8oYyksbT1wLm5leHQoKTshbS5kb25lO209cC5uZXh0KCkpbS52YWx1ZS5yZW1vdmUodGhpcyl9Y2F0Y2goZSl7dD17ZXJyb3I6ZX19ZmluYWxseXt0cnl7bSYmIW0uZG9uZSYmKGU9cC5yZXR1cm4pJiZlLmNhbGwocCl9ZmluYWxseXtpZih0KXRocm93IHQuZXJyb3J9fWVsc2UgYy5yZW1vdmUodGhpcyk7dmFyIHU9dGhpcy5pbml0aWFsVGVhcmRvd247aWYobCh1KSl0cnl7dSgpfWNhdGNoKHQpe3M9dCBpbnN0YW5jZW9mIGQ/dC5lcnJvcnM6W3RdfXZhciBmPXRoaXMuX3RlYXJkb3ducztpZihmKXt0aGlzLl90ZWFyZG93bnM9bnVsbDt0cnl7Zm9yKHZhciBoPW8oZiksYj1oLm5leHQoKTshYi5kb25lO2I9aC5uZXh0KCkpe3ZhciB5PWIudmFsdWU7dHJ5e2coeSl9Y2F0Y2godCl7cz1udWxsIT1zP3M6W10sdCBpbnN0YW5jZW9mIGQ/cz1hKGEoW10saShzKSksaSh0LmVycm9ycykpOnMucHVzaCh0KX19fWNhdGNoKHQpe249e2Vycm9yOnR9fWZpbmFsbHl7dHJ5e2ImJiFiLmRvbmUmJihyPWgucmV0dXJuKSYmci5jYWxsKGgpfWZpbmFsbHl7aWYobil0aHJvdyBuLmVycm9yfX19aWYocyl0aHJvdyBuZXcgZChzKX19LHQucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXt2YXIgbjtpZihlJiZlIT09dGhpcylpZih0aGlzLmNsb3NlZClnKGUpO2Vsc2V7aWYoZSBpbnN0YW5jZW9mIHQpe2lmKGUuY2xvc2VkfHxlLl9oYXNQYXJlbnQodGhpcykpcmV0dXJuO2UuX2FkZFBhcmVudCh0aGlzKX0odGhpcy5fdGVhcmRvd25zPW51bGwhPT0obj10aGlzLl90ZWFyZG93bnMpJiZ2b2lkIDAhPT1uP246W10pLnB1c2goZSl9fSx0LnByb3RvdHlwZS5faGFzUGFyZW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3BhcmVudGFnZTtyZXR1cm4gZT09PXR8fEFycmF5LmlzQXJyYXkoZSkmJmUuaW5jbHVkZXModCl9LHQucHJvdG90eXBlLl9hZGRQYXJlbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcGFyZW50YWdlO3RoaXMuX3BhcmVudGFnZT1BcnJheS5pc0FycmF5KGUpPyhlLnB1c2godCksZSk6ZT9bZSx0XTp0fSx0LnByb3RvdHlwZS5fcmVtb3ZlUGFyZW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3BhcmVudGFnZTtlPT09dD90aGlzLl9wYXJlbnRhZ2U9bnVsbDpBcnJheS5pc0FycmF5KGUpJiZwKGUsdCl9LHQucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihlKXt2YXIgbj10aGlzLl90ZWFyZG93bnM7biYmcChuLGUpLGUgaW5zdGFuY2VvZiB0JiZlLl9yZW1vdmVQYXJlbnQodGhpcyl9LHQuRU1QVFk9KGZ1bmN0aW9uKCl7dmFyIGU9bmV3IHQ7cmV0dXJuIGUuY2xvc2VkPSEwLGV9KSgpLHR9KSgpLHU9bS5FTVBUWTtmdW5jdGlvbiBmKHQpe3JldHVybiB0IGluc3RhbmNlb2YgbXx8dCYmImNsb3NlZCJpbiB0JiZsKHQucmVtb3ZlKSYmbCh0LmFkZCkmJmwodC51bnN1YnNjcmliZSl9ZnVuY3Rpb24gZyh0KXtsKHQpP3QoKTp0LnVuc3Vic2NyaWJlKCl9dmFyIGg9e3NldFRpbWVvdXQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07dmFyIG49aC5kZWxlZ2F0ZTtyZXR1cm4oKG51bGw9PW4/dm9pZCAwOm4uc2V0VGltZW91dCl8fHNldFRpbWVvdXQpLmFwcGx5KHZvaWQgMCxhKFtdLGkodCkpKX0sY2xlYXJUaW1lb3V0OmZ1bmN0aW9uKHQpe3ZhciBlPWguZGVsZWdhdGU7cmV0dXJuKChudWxsPT1lP3ZvaWQgMDplLmNsZWFyVGltZW91dCl8fGNsZWFyVGltZW91dCkodCl9LGRlbGVnYXRlOnZvaWQgMH07ZnVuY3Rpb24gYih0KXtoLnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dGhyb3cgdH0pKX1mdW5jdGlvbiB5KCl7fWZ1bmN0aW9uIF8odCl7dCgpfXZhciBDPShmdW5jdGlvbih0KXtmdW5jdGlvbiBuKGUpe3ZhciBuPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gbi5pc1N0b3BwZWQ9ITEsZT8obi5kZXN0aW5hdGlvbj1lLGYoZSkmJmUuYWRkKG4pKTpuLmRlc3RpbmF0aW9uPU8sbn1yZXR1cm4gZShuLHQpLG4uY3JlYXRlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3IE0odCxlLG4pfSxuLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKHQpe3RoaXMuaXNTdG9wcGVkfHx0aGlzLl9uZXh0KHQpfSxuLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbih0KXt0aGlzLmlzU3RvcHBlZHx8KHRoaXMuaXNTdG9wcGVkPSEwLHRoaXMuX2Vycm9yKHQpKX0sbi5wcm90b3R5cGUuY29tcGxldGU9ZnVuY3Rpb24oKXt0aGlzLmlzU3RvcHBlZHx8KHRoaXMuaXNTdG9wcGVkPSEwLHRoaXMuX2NvbXBsZXRlKCkpfSxuLnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbigpe3RoaXMuY2xvc2VkfHwodGhpcy5pc1N0b3BwZWQ9ITAsdC5wcm90b3R5cGUudW5zdWJzY3JpYmUuY2FsbCh0aGlzKSx0aGlzLmRlc3RpbmF0aW9uPW51bGwpfSxuLnByb3RvdHlwZS5fbmV4dD1mdW5jdGlvbih0KXt0aGlzLmRlc3RpbmF0aW9uLm5leHQodCl9LG4ucHJvdG90eXBlLl9lcnJvcj1mdW5jdGlvbih0KXt0cnl7dGhpcy5kZXN0aW5hdGlvbi5lcnJvcih0KX1maW5hbGx5e3RoaXMudW5zdWJzY3JpYmUoKX19LG4ucHJvdG90eXBlLl9jb21wbGV0ZT1mdW5jdGlvbigpe3RyeXt0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCl9ZmluYWxseXt0aGlzLnVuc3Vic2NyaWJlKCl9fSxufSkobSksTT0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlLG4sbyl7dmFyIGksYT10LmNhbGwodGhpcyl8fHRoaXM7aWYobChlKSlpPWU7ZWxzZSBpZihlKXt2YXIgcjtuPWUuZXJyb3Isbz1lLmNvbXBsZXRlLHI9ZSxpPW51bGw9PShpPWUubmV4dCk/dm9pZCAwOmkuYmluZChyKSxuPW51bGw9PW4/dm9pZCAwOm4uYmluZChyKSxvPW51bGw9PW8/dm9pZCAwOm8uYmluZChyKX1yZXR1cm4gYS5kZXN0aW5hdGlvbj17bmV4dDppP3YoaSk6eSxlcnJvcjp2KG51bGwhPW4/bjp4KSxjb21wbGV0ZTpvP3Yobyk6eX0sYX1yZXR1cm4gZShuLHQpLG59KShDKTtmdW5jdGlvbiB2KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWVbbl09YXJndW1lbnRzW25dO3RyeXt0LmFwcGx5KHZvaWQgMCxhKFtdLGkoZSkpKX1jYXRjaCh0KXtiKHQpfX19ZnVuY3Rpb24geCh0KXt0aHJvdyB0fXZhciBPPXtjbG9zZWQ6ITAsbmV4dDp5LGVycm9yOngsY29tcGxldGU6eX0sUD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wub2JzZXJ2YWJsZXx8IkBAb2JzZXJ2YWJsZSI7ZnVuY3Rpb24gdyh0KXtyZXR1cm4gdH1mdW5jdGlvbiBrKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3JldHVybiBTKHQpfWZ1bmN0aW9uIFModCl7cmV0dXJuIDA9PT10Lmxlbmd0aD93OjE9PT10Lmxlbmd0aD90WzBdOmZ1bmN0aW9uIGUobil7cmV0dXJuIHQucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBlKHQpfSksbil9fXZhciBEPShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dCYmKHRoaXMuX3N1YnNjcmliZT10KX1yZXR1cm4gdC5wcm90b3R5cGUubGlmdD1mdW5jdGlvbihlKXt2YXIgbj1uZXcgdDtyZXR1cm4gbi5zb3VyY2U9dGhpcyxuLm9wZXJhdG9yPWUsbn0sdC5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgbz10aGlzLGk9KGZ1bmN0aW9uIGEodCl7cmV0dXJuIHQmJnQgaW5zdGFuY2VvZiBDfHwoZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCYmbCh0Lm5leHQpJiZsKHQuZXJyb3IpJiZsKHQuY29tcGxldGUpfSkodCkmJmYodCl9KSh0KT90Om5ldyBNKHQsZSxuKTtyZXR1cm4gXygoZnVuY3Rpb24oKXt2YXIgdD1vLm9wZXJhdG9yLGU9by5zb3VyY2U7aS5hZGQodD90LmNhbGwoaSxlKTplP28uX3N1YnNjcmliZShpKTpvLl90cnlTdWJzY3JpYmUoaSkpfSkpLGl9LHQucHJvdG90eXBlLl90cnlTdWJzY3JpYmU9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiB0aGlzLl9zdWJzY3JpYmUodCl9Y2F0Y2goZSl7dC5lcnJvcihlKX19LHQucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3JldHVybiBuZXcoZT1FKGUpKSgoZnVuY3Rpb24oZSxvKXt2YXIgaTtpPW4uc3Vic2NyaWJlKChmdW5jdGlvbihlKXt0cnl7dChlKX1jYXRjaCh0KXtvKHQpLG51bGw9PWl8fGkudW5zdWJzY3JpYmUoKX19KSxvLGUpfSkpfSx0LnByb3RvdHlwZS5fc3Vic2NyaWJlPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiBudWxsPT09KGU9dGhpcy5zb3VyY2UpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnN1YnNjcmliZSh0KX0sdC5wcm90b3R5cGVbUF09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUucGlwZT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTtyZXR1cm4gUyh0KSh0aGlzKX0sdC5wcm90b3R5cGUudG9Qcm9taXNlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7cmV0dXJuIG5ldyh0PUUodCkpKChmdW5jdGlvbih0LG4pe3ZhciBvO2Uuc3Vic2NyaWJlKChmdW5jdGlvbih0KXtyZXR1cm4gbz10fSksKGZ1bmN0aW9uKHQpe3JldHVybiBuKHQpfSksKGZ1bmN0aW9uKCl7cmV0dXJuIHQobyl9KSl9KSl9LHQuY3JlYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdChlKX0sdH0pKCk7ZnVuY3Rpb24gRSh0KXt2YXIgZTtyZXR1cm4gbnVsbCE9PShlPW51bGwhPXQ/dDp1bmRlZmluZWQpJiZ2b2lkIDAhPT1lP2U6UHJvbWlzZX1mdW5jdGlvbiBSKHQpe3JldHVybiBmdW5jdGlvbihlKXtpZigoZnVuY3Rpb24gbih0KXtyZXR1cm4gbChudWxsPT10P3ZvaWQgMDp0LmxpZnQpfSkoZSkpcmV0dXJuIGUubGlmdCgoZnVuY3Rpb24oZSl7dHJ5e3JldHVybiB0KGUsdGhpcyl9Y2F0Y2godCl7dGhpcy5lcnJvcih0KX19KSk7dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5hYmxlIHRvIGxpZnQgdW5rbm93biBPYnNlcnZhYmxlIHR5cGUiKX19dmFyIEEsVD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlLG4sbyxpLGEpe3ZhciByPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiByLm9uRmluYWxpemU9YSxyLl9uZXh0PW4/ZnVuY3Rpb24odCl7dHJ5e24odCl9Y2F0Y2godCl7ZS5lcnJvcih0KX19OnQucHJvdG90eXBlLl9uZXh0LHIuX2Vycm9yPWk/ZnVuY3Rpb24odCl7dHJ5e2kodCl9Y2F0Y2godCl7ZS5lcnJvcih0KX1maW5hbGx5e3RoaXMudW5zdWJzY3JpYmUoKX19OnQucHJvdG90eXBlLl9lcnJvcixyLl9jb21wbGV0ZT1vP2Z1bmN0aW9uKCl7dHJ5e28oKX1jYXRjaCh0KXtlLmVycm9yKHQpfWZpbmFsbHl7dGhpcy51bnN1YnNjcmliZSgpfX06dC5wcm90b3R5cGUuX2NvbXBsZXRlLHJ9cmV0dXJuIGUobix0KSxuLnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbigpe3ZhciBlLG49dGhpcy5jbG9zZWQ7dC5wcm90b3R5cGUudW5zdWJzY3JpYmUuY2FsbCh0aGlzKSwhbiYmKG51bGw9PT0oZT10aGlzLm9uRmluYWxpemUpfHx2b2lkIDA9PT1lfHxlLmNhbGwodGhpcykpfSxufSkoQyksTj17c2NoZWR1bGU6ZnVuY3Rpb24odCl7dmFyIGU9cmVxdWVzdEFuaW1hdGlvbkZyYW1lLG49Y2FuY2VsQW5pbWF0aW9uRnJhbWUsbz1OLmRlbGVnYXRlO28mJihlPW8ucmVxdWVzdEFuaW1hdGlvbkZyYW1lLG49by5jYW5jZWxBbmltYXRpb25GcmFtZSk7dmFyIGk9ZSgoZnVuY3Rpb24oZSl7bj12b2lkIDAsdChlKX0pKTtyZXR1cm4gbmV3IG0oKGZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PW4/dm9pZCAwOm4oaSl9KSl9LHJlcXVlc3RBbmltYXRpb25GcmFtZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTt2YXIgbj1OLmRlbGVnYXRlO3JldHVybigobnVsbD09bj92b2lkIDA6bi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpfHxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUpLmFwcGx5KHZvaWQgMCxhKFtdLGkodCkpKX0sY2FuY2VsQW5pbWF0aW9uRnJhbWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07dmFyIG49Ti5kZWxlZ2F0ZTtyZXR1cm4oKG51bGw9PW4/dm9pZCAwOm4uY2FuY2VsQW5pbWF0aW9uRnJhbWUpfHxjYW5jZWxBbmltYXRpb25GcmFtZSkuYXBwbHkodm9pZCAwLGEoW10saSh0KSkpfSxkZWxlZ2F0ZTp2b2lkIDB9LHo9YygoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIGUoKXt0KHRoaXMpLHRoaXMubmFtZT0iT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IiLHRoaXMubWVzc2FnZT0ib2JqZWN0IHVuc3Vic2NyaWJlZCJ9fSkpLEk9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4oKXt2YXIgZT10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIGUuY2xvc2VkPSExLGUub2JzZXJ2ZXJzPVtdLGUuaXNTdG9wcGVkPSExLGUuaGFzRXJyb3I9ITEsZS50aHJvd25FcnJvcj1udWxsLGV9cmV0dXJuIGUobix0KSxuLnByb3RvdHlwZS5saWZ0PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBIKHRoaXMsdGhpcyk7cmV0dXJuIGUub3BlcmF0b3I9dCxlfSxuLnByb3RvdHlwZS5fdGhyb3dJZkNsb3NlZD1mdW5jdGlvbigpe2lmKHRoaXMuY2xvc2VkKXRocm93IG5ldyB6fSxuLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7XygoZnVuY3Rpb24oKXt2YXIgbixpO2lmKGUuX3Rocm93SWZDbG9zZWQoKSwhZS5pc1N0b3BwZWQpe3ZhciBhPWUub2JzZXJ2ZXJzLnNsaWNlKCk7dHJ5e2Zvcih2YXIgcj1vKGEpLHM9ci5uZXh0KCk7IXMuZG9uZTtzPXIubmV4dCgpKXMudmFsdWUubmV4dCh0KX1jYXRjaCh0KXtuPXtlcnJvcjp0fX1maW5hbGx5e3RyeXtzJiYhcy5kb25lJiYoaT1yLnJldHVybikmJmkuY2FsbChyKX1maW5hbGx5e2lmKG4pdGhyb3cgbi5lcnJvcn19fX0pKX0sbi5wcm90b3R5cGUuZXJyb3I9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztfKChmdW5jdGlvbigpe2lmKGUuX3Rocm93SWZDbG9zZWQoKSwhZS5pc1N0b3BwZWQpe2UuaGFzRXJyb3I9ZS5pc1N0b3BwZWQ9ITAsZS50aHJvd25FcnJvcj10O2Zvcih2YXIgbj1lLm9ic2VydmVycztuLmxlbmd0aDspbi5zaGlmdCgpLmVycm9yKHQpfX0pKX0sbi5wcm90b3R5cGUuY29tcGxldGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO18oKGZ1bmN0aW9uKCl7aWYodC5fdGhyb3dJZkNsb3NlZCgpLCF0LmlzU3RvcHBlZCl7dC5pc1N0b3BwZWQ9ITA7Zm9yKHZhciBlPXQub2JzZXJ2ZXJzO2UubGVuZ3RoOyllLnNoaWZ0KCkuY29tcGxldGUoKX19KSl9LG4ucHJvdG90eXBlLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKCl7dGhpcy5pc1N0b3BwZWQ9dGhpcy5jbG9zZWQ9ITAsdGhpcy5vYnNlcnZlcnM9bnVsbH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLCJvYnNlcnZlZCIse2dldDpmdW5jdGlvbigpe3ZhciB0O3JldHVybihudWxsPT09KHQ9dGhpcy5vYnNlcnZlcnMpfHx2b2lkIDA9PT10P3ZvaWQgMDp0Lmxlbmd0aCk+MH0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxuLnByb3RvdHlwZS5fdHJ5U3Vic2NyaWJlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl90aHJvd0lmQ2xvc2VkKCksdC5wcm90b3R5cGUuX3RyeVN1YnNjcmliZS5jYWxsKHRoaXMsZSl9LG4ucHJvdG90eXBlLl9zdWJzY3JpYmU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3Rocm93SWZDbG9zZWQoKSx0aGlzLl9jaGVja0ZpbmFsaXplZFN0YXR1c2VzKHQpLHRoaXMuX2lubmVyU3Vic2NyaWJlKHQpfSxuLnByb3RvdHlwZS5faW5uZXJTdWJzY3JpYmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWUub2JzZXJ2ZXJzO3JldHVybiBlLmhhc0Vycm9yfHxlLmlzU3RvcHBlZD91OihuLnB1c2godCksbmV3IG0oKGZ1bmN0aW9uKCl7cmV0dXJuIHAobix0KX0pKSl9LG4ucHJvdG90eXBlLl9jaGVja0ZpbmFsaXplZFN0YXR1c2VzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1lLmlzU3RvcHBlZDtlLmhhc0Vycm9yP3QuZXJyb3IoZS50aHJvd25FcnJvcik6biYmdC5jb21wbGV0ZSgpfSxuLnByb3RvdHlwZS5hc09ic2VydmFibGU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgRDtyZXR1cm4gdC5zb3VyY2U9dGhpcyx0fSxuLmNyZWF0ZT1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgSCh0LGUpfSxufSkoRCksSD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlLG4pe3ZhciBvPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gby5kZXN0aW5hdGlvbj1lLG8uc291cmNlPW4sb31yZXR1cm4gZShuLHQpLG4ucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24odCl7dmFyIGUsbjtudWxsPT09KG49bnVsbD09PShlPXRoaXMuZGVzdGluYXRpb24pfHx2b2lkIDA9PT1lP3ZvaWQgMDplLm5leHQpfHx2b2lkIDA9PT1ufHxuLmNhbGwoZSx0KX0sbi5wcm90b3R5cGUuZXJyb3I9ZnVuY3Rpb24odCl7dmFyIGUsbjtudWxsPT09KG49bnVsbD09PShlPXRoaXMuZGVzdGluYXRpb24pfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmVycm9yKXx8dm9pZCAwPT09bnx8bi5jYWxsKGUsdCl9LG4ucHJvdG90eXBlLmNvbXBsZXRlPWZ1bmN0aW9uKCl7dmFyIHQsZTtudWxsPT09KGU9bnVsbD09PSh0PXRoaXMuZGVzdGluYXRpb24pfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmNvbXBsZXRlKXx8dm9pZCAwPT09ZXx8ZS5jYWxsKHQpfSxuLnByb3RvdHlwZS5fc3Vic2NyaWJlPWZ1bmN0aW9uKHQpe3ZhciBlLG47cmV0dXJuIG51bGwhPT0obj1udWxsPT09KGU9dGhpcy5zb3VyY2UpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnN1YnNjcmliZSh0KSkmJnZvaWQgMCE9PW4/bjp1fSxufSkoSSksRj0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlKXt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4uX3ZhbHVlPWUsbn1yZXR1cm4gZShuLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSwidmFsdWUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRWYWx1ZSgpfSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLG4ucHJvdG90eXBlLl9zdWJzY3JpYmU9ZnVuY3Rpb24oZSl7dmFyIG49dC5wcm90b3R5cGUuX3N1YnNjcmliZS5jYWxsKHRoaXMsZSk7cmV0dXJuIW4uY2xvc2VkJiZlLm5leHQodGhpcy5fdmFsdWUpLG59LG4ucHJvdG90eXBlLmdldFZhbHVlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXQuX3ZhbHVlO2lmKHQuaGFzRXJyb3IpdGhyb3cgdC50aHJvd25FcnJvcjtyZXR1cm4gdGhpcy5fdGhyb3dJZkNsb3NlZCgpLGV9LG4ucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUubmV4dC5jYWxsKHRoaXMsdGhpcy5fdmFsdWU9ZSl9LG59KShJKSxMPXtub3c6ZnVuY3Rpb24oKXtyZXR1cm4oTC5kZWxlZ2F0ZXx8RGF0ZSkubm93KCl9LGRlbGVnYXRlOnZvaWQgMH0sQj0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlLG4sbyl7dm9pZCAwPT09ZSYmKGU9MS8wKSx2b2lkIDA9PT1uJiYobj0xLzApLHZvaWQgMD09PW8mJihvPUwpO3ZhciBpPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gaS5fYnVmZmVyU2l6ZT1lLGkuX3dpbmRvd1RpbWU9bixpLl90aW1lc3RhbXBQcm92aWRlcj1vLGkuX2J1ZmZlcj1bXSxpLl9pbmZpbml0ZVRpbWVXaW5kb3c9ITAsaS5faW5maW5pdGVUaW1lV2luZG93PW49PT0xLzAsaS5fYnVmZmVyU2l6ZT1NYXRoLm1heCgxLGUpLGkuX3dpbmRvd1RpbWU9TWF0aC5tYXgoMSxuKSxpfXJldHVybiBlKG4sdCksbi5wcm90b3R5cGUubmV4dD1mdW5jdGlvbihlKXt2YXIgbj10aGlzLG89bi5fYnVmZmVyLGk9bi5faW5maW5pdGVUaW1lV2luZG93LGE9bi5fdGltZXN0YW1wUHJvdmlkZXIscj1uLl93aW5kb3dUaW1lO24uaXNTdG9wcGVkfHwoby5wdXNoKGUpLCFpJiZvLnB1c2goYS5ub3coKStyKSksdGhpcy5fdHJpbUJ1ZmZlcigpLHQucHJvdG90eXBlLm5leHQuY2FsbCh0aGlzLGUpfSxuLnByb3RvdHlwZS5fc3Vic2NyaWJlPWZ1bmN0aW9uKHQpe3RoaXMuX3Rocm93SWZDbG9zZWQoKSx0aGlzLl90cmltQnVmZmVyKCk7Zm9yKHZhciBlPXRoaXMuX2lubmVyU3Vic2NyaWJlKHQpLG49dGhpcy5faW5maW5pdGVUaW1lV2luZG93LG89dGhpcy5fYnVmZmVyLnNsaWNlKCksaT0wO2k8by5sZW5ndGgmJiF0LmNsb3NlZDtpKz1uPzE6Mil0Lm5leHQob1tpXSk7cmV0dXJuIHRoaXMuX2NoZWNrRmluYWxpemVkU3RhdHVzZXModCksZX0sbi5wcm90b3R5cGUuX3RyaW1CdWZmZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dC5fYnVmZmVyU2l6ZSxuPXQuX3RpbWVzdGFtcFByb3ZpZGVyLG89dC5fYnVmZmVyLGk9dC5faW5maW5pdGVUaW1lV2luZG93LGE9KGk/MToyKSplO2lmKGU8MS8wJiZhPG8ubGVuZ3RoJiZvLnNwbGljZSgwLG8ubGVuZ3RoLWEpLCFpKXtmb3IodmFyIHI9bi5ub3coKSxzPTAsbD0xO2w8by5sZW5ndGgmJm9bbF08PXI7bCs9MilzPWw7cyYmby5zcGxpY2UoMCxzKzEpfX0sbn0pKEkpLFY9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4oZSxuKXtyZXR1cm4gdC5jYWxsKHRoaXMpfHx0aGlzfXJldHVybiBlKG4sdCksbi5wcm90b3R5cGUuc2NoZWR1bGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpc30sbn0pKG0pLGo9e3NldEludGVydmFsOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3ZhciBuPWouZGVsZWdhdGU7cmV0dXJuKChudWxsPT1uP3ZvaWQgMDpuLnNldEludGVydmFsKXx8c2V0SW50ZXJ2YWwpLmFwcGx5KHZvaWQgMCxhKFtdLGkodCkpKX0sY2xlYXJJbnRlcnZhbDpmdW5jdGlvbih0KXt2YXIgZT1qLmRlbGVnYXRlO3JldHVybigobnVsbD09ZT92b2lkIDA6ZS5jbGVhckludGVydmFsKXx8Y2xlYXJJbnRlcnZhbCkodCl9LGRlbGVnYXRlOnZvaWQgMH0sVT0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlLG4pe3ZhciBvPXQuY2FsbCh0aGlzLGUsbil8fHRoaXM7cmV0dXJuIG8uc2NoZWR1bGVyPWUsby53b3JrPW4sby5wZW5kaW5nPSExLG99cmV0dXJuIGUobix0KSxuLnByb3RvdHlwZS5zY2hlZHVsZT1mdW5jdGlvbih0LGUpe2lmKHZvaWQgMD09PWUmJihlPTApLHRoaXMuY2xvc2VkKXJldHVybiB0aGlzO3RoaXMuc3RhdGU9dDt2YXIgbj10aGlzLmlkLG89dGhpcy5zY2hlZHVsZXI7cmV0dXJuIG51bGwhPW4mJih0aGlzLmlkPXRoaXMucmVjeWNsZUFzeW5jSWQobyxuLGUpKSx0aGlzLnBlbmRpbmc9ITAsdGhpcy5kZWxheT1lLHRoaXMuaWQ9dGhpcy5pZHx8dGhpcy5yZXF1ZXN0QXN5bmNJZChvLHRoaXMuaWQsZSksdGhpc30sbi5wcm90b3R5cGUucmVxdWVzdEFzeW5jSWQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj0wKSxqLnNldEludGVydmFsKHQuZmx1c2guYmluZCh0LHRoaXMpLG4pfSxuLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZD1mdW5jdGlvbih0LGUsbil7aWYodm9pZCAwPT09biYmKG49MCksbnVsbCE9biYmdGhpcy5kZWxheT09PW4mJiExPT09dGhpcy5wZW5kaW5nKXJldHVybiBlO2ouY2xlYXJJbnRlcnZhbChlKX0sbi5wcm90b3R5cGUuZXhlY3V0ZT1mdW5jdGlvbih0LGUpe2lmKHRoaXMuY2xvc2VkKXJldHVybiBuZXcgRXJyb3IoImV4ZWN1dGluZyBhIGNhbmNlbGxlZCBhY3Rpb24iKTt0aGlzLnBlbmRpbmc9ITE7dmFyIG49dGhpcy5fZXhlY3V0ZSh0LGUpO2lmKG4pcmV0dXJuIG47ITE9PT10aGlzLnBlbmRpbmcmJm51bGwhPXRoaXMuaWQmJih0aGlzLmlkPXRoaXMucmVjeWNsZUFzeW5jSWQodGhpcy5zY2hlZHVsZXIsdGhpcy5pZCxudWxsKSl9LG4ucHJvdG90eXBlLl9leGVjdXRlPWZ1bmN0aW9uKHQsZSl7dmFyIG4sbz0hMTt0cnl7dGhpcy53b3JrKHQpfWNhdGNoKHQpe289ITAsbj0hIXQmJnR8fG5ldyBFcnJvcih0KX1pZihvKXJldHVybiB0aGlzLnVuc3Vic2NyaWJlKCksbn0sbi5wcm90b3R5cGUudW5zdWJzY3JpYmU9ZnVuY3Rpb24oKXtpZighdGhpcy5jbG9zZWQpe3ZhciBlPXRoaXMuaWQsbj10aGlzLnNjaGVkdWxlcixvPW4uYWN0aW9uczt0aGlzLndvcms9dGhpcy5zdGF0ZT10aGlzLnNjaGVkdWxlcj1udWxsLHRoaXMucGVuZGluZz0hMSxwKG8sdGhpcyksbnVsbCE9ZSYmKHRoaXMuaWQ9dGhpcy5yZWN5Y2xlQXN5bmNJZChuLGUsbnVsbCkpLHRoaXMuZGVsYXk9bnVsbCx0LnByb3RvdHlwZS51bnN1YnNjcmliZS5jYWxsKHRoaXMpfX0sbn0pKFYpLEc9MSxXPXt9O2Z1bmN0aW9uIFkodCl7cmV0dXJuIHQgaW4gVyYmKGRlbGV0ZSBXW3RdLCEwKX12YXIgcT1mdW5jdGlvbih0KXt2YXIgZT1HKys7cmV0dXJuIFdbZV09ITAsQXx8KEE9UHJvbWlzZS5yZXNvbHZlKCkpLEEudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gWShlKSYmdCgpfSkpLGV9LFo9ZnVuY3Rpb24odCl7WSh0KX0sWD17c2V0SW1tZWRpYXRlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3ZhciBuPVguZGVsZWdhdGU7cmV0dXJuKChudWxsPT1uP3ZvaWQgMDpuLnNldEltbWVkaWF0ZSl8fHEpLmFwcGx5KHZvaWQgMCxhKFtdLGkodCkpKX0sY2xlYXJJbW1lZGlhdGU6ZnVuY3Rpb24odCl7dmFyIGU9WC5kZWxlZ2F0ZTtyZXR1cm4oKG51bGw9PWU/dm9pZCAwOmUuY2xlYXJJbW1lZGlhdGUpfHxaKSh0KX0sZGVsZWdhdGU6dm9pZCAwfSxLPShmdW5jdGlvbih0KXtmdW5jdGlvbiBuKGUsbil7dmFyIG89dC5jYWxsKHRoaXMsZSxuKXx8dGhpcztyZXR1cm4gby5zY2hlZHVsZXI9ZSxvLndvcms9bixvfXJldHVybiBlKG4sdCksbi5wcm90b3R5cGUucmVxdWVzdEFzeW5jSWQ9ZnVuY3Rpb24oZSxuLG8pe3JldHVybiB2b2lkIDA9PT1vJiYobz0wKSxudWxsIT09byYmbz4wP3QucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkLmNhbGwodGhpcyxlLG4sbyk6KGUuYWN0aW9ucy5wdXNoKHRoaXMpLGUuX3NjaGVkdWxlZHx8KGUuX3NjaGVkdWxlZD1YLnNldEltbWVkaWF0ZShlLmZsdXNoLmJpbmQoZSx2b2lkIDApKSkpfSxuLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZD1mdW5jdGlvbihlLG4sbyl7aWYodm9pZCAwPT09byYmKG89MCksbnVsbCE9byYmbz4wfHxudWxsPT1vJiZ0aGlzLmRlbGF5PjApcmV0dXJuIHQucHJvdG90eXBlLnJlY3ljbGVBc3luY0lkLmNhbGwodGhpcyxlLG4sbyk7MD09PWUuYWN0aW9ucy5sZW5ndGgmJihYLmNsZWFySW1tZWRpYXRlKG4pLGUuX3NjaGVkdWxlZD12b2lkIDApfSxufSkoVSksSj0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbil7dm9pZCAwPT09biYmKG49dC5ub3cpLHRoaXMuc2NoZWR1bGVyQWN0aW9uQ3Rvcj1lLHRoaXMubm93PW59cmV0dXJuIHQucHJvdG90eXBlLnNjaGVkdWxlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9MCksbmV3IHRoaXMuc2NoZWR1bGVyQWN0aW9uQ3Rvcih0aGlzLHQpLnNjaGVkdWxlKG4sZSl9LHQubm93PUwubm93LHR9KSgpLFE9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4oZSxuKXt2b2lkIDA9PT1uJiYobj1KLm5vdyk7dmFyIG89dC5jYWxsKHRoaXMsZSxuKXx8dGhpcztyZXR1cm4gby5hY3Rpb25zPVtdLG8uX2FjdGl2ZT0hMSxvLl9zY2hlZHVsZWQ9dm9pZCAwLG99cmV0dXJuIGUobix0KSxuLnByb3RvdHlwZS5mbHVzaD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmFjdGlvbnM7aWYodGhpcy5fYWN0aXZlKWUucHVzaCh0KTtlbHNle3ZhciBuO3RoaXMuX2FjdGl2ZT0hMDtkb3tpZihuPXQuZXhlY3V0ZSh0LnN0YXRlLHQuZGVsYXkpKWJyZWFrfXdoaWxlKHQ9ZS5zaGlmdCgpKTtpZih0aGlzLl9hY3RpdmU9ITEsbil7Zm9yKDt0PWUuc2hpZnQoKTspdC51bnN1YnNjcmliZSgpO3Rocm93IG59fX0sbn0pKEopLCQ9bmV3KChmdW5jdGlvbih0KXtmdW5jdGlvbiBuKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gZShuLHQpLG4ucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKHQpe3RoaXMuX2FjdGl2ZT0hMCx0aGlzLl9zY2hlZHVsZWQ9dm9pZCAwO3ZhciBlLG49dGhpcy5hY3Rpb25zLG89LTE7dD10fHxuLnNoaWZ0KCk7dmFyIGk9bi5sZW5ndGg7ZG97aWYoZT10LmV4ZWN1dGUodC5zdGF0ZSx0LmRlbGF5KSlicmVha313aGlsZSgrK288aSYmKHQ9bi5zaGlmdCgpKSk7aWYodGhpcy5fYWN0aXZlPSExLGUpe2Zvcig7KytvPGkmJih0PW4uc2hpZnQoKSk7KXQudW5zdWJzY3JpYmUoKTt0aHJvdyBlfX0sbn0pKFEpKShLKSx0dD1uZXcgUShVKSxldD10dCxudD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlLG4pe3ZhciBvPXQuY2FsbCh0aGlzLGUsbil8fHRoaXM7cmV0dXJuIG8uc2NoZWR1bGVyPWUsby53b3JrPW4sb31yZXR1cm4gZShuLHQpLG4ucHJvdG90eXBlLnNjaGVkdWxlPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPTApLG4+MD90LnByb3RvdHlwZS5zY2hlZHVsZS5jYWxsKHRoaXMsZSxuKToodGhpcy5kZWxheT1uLHRoaXMuc3RhdGU9ZSx0aGlzLnNjaGVkdWxlci5mbHVzaCh0aGlzKSx0aGlzKX0sbi5wcm90b3R5cGUuZXhlY3V0ZT1mdW5jdGlvbihlLG4pe3JldHVybiBuPjB8fHRoaXMuY2xvc2VkP3QucHJvdG90eXBlLmV4ZWN1dGUuY2FsbCh0aGlzLGUsbik6dGhpcy5fZXhlY3V0ZShlLG4pfSxuLnByb3RvdHlwZS5yZXF1ZXN0QXN5bmNJZD1mdW5jdGlvbihlLG4sbyl7cmV0dXJuIHZvaWQgMD09PW8mJihvPTApLG51bGwhPW8mJm8+MHx8bnVsbD09byYmdGhpcy5kZWxheT4wP3QucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkLmNhbGwodGhpcyxlLG4sbyk6ZS5mbHVzaCh0aGlzKX0sbn0pKFUpLG90PW5ldygoZnVuY3Rpb24odCl7ZnVuY3Rpb24gbigpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIGUobix0KSxufSkoUSkpKG50KSxpdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlLG4pe3ZhciBvPXQuY2FsbCh0aGlzLGUsbil8fHRoaXM7cmV0dXJuIG8uc2NoZWR1bGVyPWUsby53b3JrPW4sb31yZXR1cm4gZShuLHQpLG4ucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkPWZ1bmN0aW9uKGUsbixvKXtyZXR1cm4gdm9pZCAwPT09byYmKG89MCksbnVsbCE9PW8mJm8+MD90LnByb3RvdHlwZS5yZXF1ZXN0QXN5bmNJZC5jYWxsKHRoaXMsZSxuLG8pOihlLmFjdGlvbnMucHVzaCh0aGlzKSxlLl9zY2hlZHVsZWR8fChlLl9zY2hlZHVsZWQ9Ti5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uKCl7cmV0dXJuIGUuZmx1c2godm9pZCAwKX0pKSkpfSxuLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZD1mdW5jdGlvbihlLG4sbyl7aWYodm9pZCAwPT09byYmKG89MCksbnVsbCE9byYmbz4wfHxudWxsPT1vJiZ0aGlzLmRlbGF5PjApcmV0dXJuIHQucHJvdG90eXBlLnJlY3ljbGVBc3luY0lkLmNhbGwodGhpcyxlLG4sbyk7MD09PWUuYWN0aW9ucy5sZW5ndGgmJihOLmNhbmNlbEFuaW1hdGlvbkZyYW1lKG4pLGUuX3NjaGVkdWxlZD12b2lkIDApfSxufSkoVSksYXQ9bmV3KChmdW5jdGlvbih0KXtmdW5jdGlvbiBuKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gZShuLHQpLG4ucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKHQpe3RoaXMuX2FjdGl2ZT0hMCx0aGlzLl9zY2hlZHVsZWQ9dm9pZCAwO3ZhciBlLG49dGhpcy5hY3Rpb25zLG89LTE7dD10fHxuLnNoaWZ0KCk7dmFyIGk9bi5sZW5ndGg7ZG97aWYoZT10LmV4ZWN1dGUodC5zdGF0ZSx0LmRlbGF5KSlicmVha313aGlsZSgrK288aSYmKHQ9bi5zaGlmdCgpKSk7aWYodGhpcy5fYWN0aXZlPSExLGUpe2Zvcig7KytvPGkmJih0PW4uc2hpZnQoKSk7KXQudW5zdWJzY3JpYmUoKTt0aHJvdyBlfX0sbn0pKFEpKShpdCkscnQ9bmV3IEQoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNvbXBsZXRlKCl9KSk7ZnVuY3Rpb24gc3QodCxlKXtyZXR1cm4gbmV3IEQoKGZ1bmN0aW9uKG4pe3ZhciBvPTA7cmV0dXJuIGUuc2NoZWR1bGUoKGZ1bmN0aW9uKCl7bz09PXQubGVuZ3RoP24uY29tcGxldGUoKToobi5uZXh0KHRbbysrXSksbi5jbG9zZWR8fHRoaXMuc2NoZWR1bGUoKSl9KSl9KSl9dmFyIGx0PWZ1bmN0aW9uKHQpe3JldHVybiB0JiYibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoJiYiZnVuY3Rpb24iIT10eXBlb2YgdH07ZnVuY3Rpb24gY3QodCl7cmV0dXJuIGwobnVsbD09dD92b2lkIDA6dC50aGVuKX12YXIgZHQscHQ9KGZ1bmN0aW9uIG10KCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yP1N5bWJvbC5pdGVyYXRvcjoiQEBpdGVyYXRvciJ9KSgpO2Z1bmN0aW9uIHV0KHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJJdGVyYWJsZSBjYW5ub3QgYmUgbnVsbCIpO3JldHVybiBuZXcgRCgoZnVuY3Rpb24obil7dmFyIG89bmV3IG07cmV0dXJuIG8uYWRkKGUuc2NoZWR1bGUoKGZ1bmN0aW9uKCl7dmFyIGk9dFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtvLmFkZChlLnNjaGVkdWxlKChmdW5jdGlvbigpe3ZhciB0PXRoaXM7aS5uZXh0KCkudGhlbigoZnVuY3Rpb24oZSl7ZS5kb25lP24uY29tcGxldGUoKToobi5uZXh0KGUudmFsdWUpLHQuc2NoZWR1bGUoKSl9KSl9KSkpfSkpKSxvfSkpfWZ1bmN0aW9uIGZ0KHQpe3JldHVybiBsKHRbUF0pfWZ1bmN0aW9uIGd0KHQpe3JldHVybiBsKG51bGw9PXQ/dm9pZCAwOnRbcHRdKX1mdW5jdGlvbiBodCh0KXtyZXR1cm4gU3ltYm9sLmFzeW5jSXRlcmF0b3ImJmwobnVsbD09dD92b2lkIDA6dFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0pfWZ1bmN0aW9uIGJ0KHQpe3JldHVybiBuZXcgVHlwZUVycm9yKCJZb3UgcHJvdmlkZWQgIisobnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdD8iYW4gaW52YWxpZCBvYmplY3QiOiInIit0KyInIikrIiB3aGVyZSBhIHN0cmVhbSB3YXMgZXhwZWN0ZWQuIFlvdSBjYW4gcHJvdmlkZSBhbiBPYnNlcnZhYmxlLCBQcm9taXNlLCBSZWFkYWJsZVN0cmVhbSwgQXJyYXksIEFzeW5jSXRlcmFibGUsIG9yIEl0ZXJhYmxlLiIpfWZ1bmN0aW9uIHl0KHQpe3JldHVybiBzKHRoaXMsYXJndW1lbnRzLChmdW5jdGlvbiBlKCl7dmFyIG8saSxhO3JldHVybiBuKHRoaXMsKGZ1bmN0aW9uKGUpe3N3aXRjaChlLmxhYmVsKXtjYXNlIDA6bz10LmdldFJlYWRlcigpLGUubGFiZWw9MTtjYXNlIDE6ZS50cnlzLnB1c2goWzEsLDksMTBdKSxlLmxhYmVsPTI7Y2FzZSAyOnJldHVybls0LHIoby5yZWFkKCkpXTtjYXNlIDM6cmV0dXJuIGk9ZS5zZW50KCksYT1pLnZhbHVlLGkuZG9uZT9bNCxyKHZvaWQgMCldOlszLDVdO2Nhc2UgNDpyZXR1cm5bMixlLnNlbnQoKV07Y2FzZSA1OnJldHVybls0LHIoYSldO2Nhc2UgNjpyZXR1cm5bNCxlLnNlbnQoKV07Y2FzZSA3OnJldHVybiBlLnNlbnQoKSxbMywyXTtjYXNlIDg6cmV0dXJuWzMsMTBdO2Nhc2UgOTpyZXR1cm4gby5yZWxlYXNlTG9jaygpLFs3XTtjYXNlIDEwOnJldHVyblsyXX19KSl9KSl9ZnVuY3Rpb24gX3QodCl7cmV0dXJuIGwobnVsbD09dD92b2lkIDA6dC5nZXRSZWFkZXIpfWZ1bmN0aW9uIEN0KHQsZSl7cmV0dXJuIGU/KGZ1bmN0aW9uIG4odCxlKXtpZihudWxsIT10KXtpZihmdCh0KSlyZXR1cm4oZnVuY3Rpb24gbih0LGUpe3JldHVybiBuZXcgRCgoZnVuY3Rpb24obil7dmFyIG89bmV3IG07cmV0dXJuIG8uYWRkKGUuc2NoZWR1bGUoKGZ1bmN0aW9uKCl7dmFyIGk9dFtQXSgpO28uYWRkKGkuc3Vic2NyaWJlKHtuZXh0OmZ1bmN0aW9uKHQpe28uYWRkKGUuc2NoZWR1bGUoKGZ1bmN0aW9uKCl7cmV0dXJuIG4ubmV4dCh0KX0pKSl9LGVycm9yOmZ1bmN0aW9uKHQpe28uYWRkKGUuc2NoZWR1bGUoKGZ1bmN0aW9uKCl7cmV0dXJuIG4uZXJyb3IodCl9KSkpfSxjb21wbGV0ZTpmdW5jdGlvbigpe28uYWRkKGUuc2NoZWR1bGUoKGZ1bmN0aW9uKCl7cmV0dXJuIG4uY29tcGxldGUoKX0pKSl9fSkpfSkpKSxvfSkpfSkodCxlKTtpZihsdCh0KSlyZXR1cm4gc3QodCxlKTtpZihjdCh0KSlyZXR1cm4oZnVuY3Rpb24gbyh0LGUpe3JldHVybiBuZXcgRCgoZnVuY3Rpb24obil7cmV0dXJuIGUuc2NoZWR1bGUoKGZ1bmN0aW9uKCl7cmV0dXJuIHQudGhlbigoZnVuY3Rpb24odCl7bi5hZGQoZS5zY2hlZHVsZSgoZnVuY3Rpb24oKXtuLm5leHQodCksbi5hZGQoZS5zY2hlZHVsZSgoZnVuY3Rpb24oKXtyZXR1cm4gbi5jb21wbGV0ZSgpfSkpKX0pKSl9KSwoZnVuY3Rpb24odCl7bi5hZGQoZS5zY2hlZHVsZSgoZnVuY3Rpb24oKXtyZXR1cm4gbi5lcnJvcih0KX0pKSl9KSl9KSl9KSl9KSh0LGUpO2lmKGh0KHQpKXJldHVybiB1dCh0LGUpO2lmKGd0KHQpKXJldHVybihmdW5jdGlvbiBpKHQsZSl7cmV0dXJuIG5ldyBEKChmdW5jdGlvbihuKXt2YXIgbztyZXR1cm4gbi5hZGQoZS5zY2hlZHVsZSgoZnVuY3Rpb24oKXtvPXRbcHRdKCksKGZ1bmN0aW9uIGkodCxlLG4sbyl7dm9pZCAwPT09byYmKG89MCk7dmFyIGk9ZS5zY2hlZHVsZSgoZnVuY3Rpb24oKXt0cnl7bi5jYWxsKHRoaXMpfWNhdGNoKGUpe3QuZXJyb3IoZSl9fSksbyk7dC5hZGQoaSl9KShuLGUsKGZ1bmN0aW9uKCl7dmFyIHQ9by5uZXh0KCksZT10LnZhbHVlO3QuZG9uZT9uLmNvbXBsZXRlKCk6KG4ubmV4dChlKSx0aGlzLnNjaGVkdWxlKCkpfSkpfSkpKSxmdW5jdGlvbigpe3JldHVybiBsKG51bGw9PW8/dm9pZCAwOm8ucmV0dXJuKSYmby5yZXR1cm4oKX19KSl9KSh0LGUpO2lmKF90KHQpKXJldHVybihmdW5jdGlvbiBhKHQsZSl7cmV0dXJuIHV0KHl0KHQpLGUpfSkodCxlKX10aHJvdyBidCh0KX0pKHQsZSk6TXQodCl9ZnVuY3Rpb24gTXQodCl7aWYodCBpbnN0YW5jZW9mIEQpcmV0dXJuIHQ7aWYobnVsbCE9dCl7aWYoZnQodCkpcmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyBEKChmdW5jdGlvbihlKXt2YXIgbj10W1BdKCk7aWYobChuLnN1YnNjcmliZSkpcmV0dXJuIG4uc3Vic2NyaWJlKGUpO3Rocm93IG5ldyBUeXBlRXJyb3IoIlByb3ZpZGVkIG9iamVjdCBkb2VzIG5vdCBjb3JyZWN0bHkgaW1wbGVtZW50IFN5bWJvbC5vYnNlcnZhYmxlIil9KSl9KSh0KTtpZihsdCh0KSlyZXR1cm4gdnQodCk7aWYoY3QodCkpcmV0dXJuKGZ1bmN0aW9uIG4odCl7cmV0dXJuIG5ldyBEKChmdW5jdGlvbihlKXt0LnRoZW4oKGZ1bmN0aW9uKHQpe2UuY2xvc2VkfHwoZS5uZXh0KHQpLGUuY29tcGxldGUoKSl9KSwoZnVuY3Rpb24odCl7cmV0dXJuIGUuZXJyb3IodCl9KSkudGhlbihudWxsLGIpfSkpfSkodCk7aWYoaHQodCkpcmV0dXJuIHh0KHQpO2lmKGd0KHQpKXJldHVybihmdW5jdGlvbiBpKHQpe3JldHVybiBuZXcgRCgoZnVuY3Rpb24oZSl7dmFyIG4saTt0cnl7Zm9yKHZhciBhPW8odCkscj1hLm5leHQoKTshci5kb25lO3I9YS5uZXh0KCkpaWYoZS5uZXh0KHIudmFsdWUpLGUuY2xvc2VkKXJldHVybn1jYXRjaCh0KXtuPXtlcnJvcjp0fX1maW5hbGx5e3RyeXtyJiYhci5kb25lJiYoaT1hLnJldHVybikmJmkuY2FsbChhKX1maW5hbGx5e2lmKG4pdGhyb3cgbi5lcnJvcn19ZS5jb21wbGV0ZSgpfSkpfSkodCk7aWYoX3QodCkpcmV0dXJuKGZ1bmN0aW9uIGEodCl7cmV0dXJuIHh0KHl0KHQpKX0pKHQpfXRocm93IGJ0KHQpfWZ1bmN0aW9uIHZ0KHQpe3JldHVybiBuZXcgRCgoZnVuY3Rpb24oZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aCYmIWUuY2xvc2VkO24rKyllLm5leHQodFtuXSk7ZS5jb21wbGV0ZSgpfSkpfWZ1bmN0aW9uIHh0KHQpe3JldHVybiBuZXcgRCgoZnVuY3Rpb24oZSl7KGZ1bmN0aW9uIGkodCxlKXt2YXIgaSxhLHIscztyZXR1cm4oZnVuY3Rpb24gbCh0LGUsbixvKXtyZXR1cm4gbmV3KG58fChuPVByb21pc2UpKSgoZnVuY3Rpb24oaSxhKXtmdW5jdGlvbiByKHQpe3RyeXtsKG8ubmV4dCh0KSl9Y2F0Y2godCl7YSh0KX19ZnVuY3Rpb24gcyh0KXt0cnl7bChvLnRocm93KHQpKX1jYXRjaCh0KXthKHQpfX1mdW5jdGlvbiBsKHQpe3QuZG9uZT9pKHQudmFsdWUpOihmdW5jdGlvbiBlKHQpe3JldHVybiB0IGluc3RhbmNlb2Ygbj90Om5ldyBuKChmdW5jdGlvbihlKXtlKHQpfSkpfSkodC52YWx1ZSkudGhlbihyLHMpfWwoKG89by5hcHBseSh0LGV8fFtdKSkubmV4dCgpKX0pKX0pKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24oKXt2YXIgbDtyZXR1cm4gbih0aGlzLChmdW5jdGlvbihuKXtzd2l0Y2gobi5sYWJlbCl7Y2FzZSAwOm4udHJ5cy5wdXNoKFswLDUsNiwxMV0pLGk9KGZ1bmN0aW9uIGModCl7aWYoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpO3ZhciBlLG49dFtTeW1ib2wuYXN5bmNJdGVyYXRvcl07cmV0dXJuIG4/bi5jYWxsKHQpOih0PW8odCksZT17fSxpKCJuZXh0IiksaSgidGhyb3ciKSxpKCJyZXR1cm4iKSxlW1N5bWJvbC5hc3luY0l0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxlKTtmdW5jdGlvbiBpKG4pe2Vbbl09dFtuXSYmZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGkpeyEoZnVuY3Rpb24gYSh0LGUsbixvKXtQcm9taXNlLnJlc29sdmUobykudGhlbigoZnVuY3Rpb24oZSl7dCh7dmFsdWU6ZSxkb25lOm59KX0pLGUpfSkobyxpLChlPXRbbl0oZSkpLmRvbmUsZS52YWx1ZSl9KSl9fX0pKHQpLG4ubGFiZWw9MTtjYXNlIDE6cmV0dXJuWzQsaS5uZXh0KCldO2Nhc2UgMjppZigoYT1uLnNlbnQoKSkuZG9uZSlyZXR1cm5bMyw0XTtpZihlLm5leHQoYS52YWx1ZSksZS5jbG9zZWQpcmV0dXJuWzJdO24ubGFiZWw9MztjYXNlIDM6cmV0dXJuWzMsMV07Y2FzZSA0OnJldHVyblszLDExXTtjYXNlIDU6cmV0dXJuIGw9bi5zZW50KCkscj17ZXJyb3I6bH0sWzMsMTFdO2Nhc2UgNjpyZXR1cm4gbi50cnlzLnB1c2goWzYsLDksMTBdKSxhJiYhYS5kb25lJiYocz1pLnJldHVybik/WzQscy5jYWxsKGkpXTpbMyw4XTtjYXNlIDc6bi5zZW50KCksbi5sYWJlbD04O2Nhc2UgODpyZXR1cm5bMywxMF07Y2FzZSA5OmlmKHIpdGhyb3cgci5lcnJvcjtyZXR1cm5bN107Y2FzZSAxMDpyZXR1cm5bN107Y2FzZSAxMTpyZXR1cm4gZS5jb21wbGV0ZSgpLFsyXX19KSl9KSl9KSh0LGUpLmNhdGNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5lcnJvcih0KX0pKX0pKX1mdW5jdGlvbiBPdCh0LGUpe3JldHVybiBlP3N0KHQsZSk6dnQodCl9ZnVuY3Rpb24gUHQodCl7cmV0dXJuIHQmJmwodC5zY2hlZHVsZSl9ZnVuY3Rpb24gd3QodCl7cmV0dXJuIHRbdC5sZW5ndGgtMV19ZnVuY3Rpb24ga3QodCl7cmV0dXJuIGwod3QodCkpP3QucG9wKCk6dm9pZCAwfWZ1bmN0aW9uIFN0KHQpe3JldHVybiBQdCh3dCh0KSk/dC5wb3AoKTp2b2lkIDB9ZnVuY3Rpb24gRHQodCxlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHd0KHQpP3QucG9wKCk6ZX1mdW5jdGlvbiBFdCgpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTt2YXIgbj1TdCh0KTtyZXR1cm4gbj9zdCh0LG4pOk90KHQpfWZ1bmN0aW9uIFJ0KHQsZSl7dmFyIG49bCh0KT90OmZ1bmN0aW9uKCl7cmV0dXJuIHR9LG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuZXJyb3IobigpKX07cmV0dXJuIG5ldyBEKGU/ZnVuY3Rpb24odCl7cmV0dXJuIGUuc2NoZWR1bGUobywwLHQpfTpvKX0hKGZ1bmN0aW9uKHQpe3QuTkVYVD0iTiIsdC5FUlJPUj0iRSIsdC5DT01QTEVURT0iQyJ9KShkdHx8KGR0PXt9KSk7dmFyIEF0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4pe3RoaXMua2luZD10LHRoaXMudmFsdWU9ZSx0aGlzLmVycm9yPW4sdGhpcy5oYXNWYWx1ZT0iTiI9PT10fXJldHVybiB0LnByb3RvdHlwZS5vYnNlcnZlPWZ1bmN0aW9uKHQpe3JldHVybiBUdCh0aGlzLHQpfSx0LnByb3RvdHlwZS5kbz1mdW5jdGlvbih0LGUsbil7dmFyIG89dGhpcyxpPW8ua2luZCxhPW8uZXJyb3I7cmV0dXJuIk4iPT09aT9udWxsPT10P3ZvaWQgMDp0KG8udmFsdWUpOiJFIj09PWk/bnVsbD09ZT92b2lkIDA6ZShhKTpudWxsPT1uP3ZvaWQgMDpuKCl9LHQucHJvdG90eXBlLmFjY2VwdD1mdW5jdGlvbih0LGUsbil7dmFyIG87cmV0dXJuIGwobnVsbD09PShvPXQpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLm5leHQpP3RoaXMub2JzZXJ2ZSh0KTp0aGlzLmRvKHQsZSxuKX0sdC5wcm90b3R5cGUudG9PYnNlcnZhYmxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXQua2luZCxuPXQuZXJyb3Isbz0iTiI9PT1lP0V0KHQudmFsdWUpOiJFIj09PWU/UnQoKGZ1bmN0aW9uKCl7cmV0dXJuIG59KSk6IkMiPT09ZT9ydDowO2lmKCFvKXRocm93IG5ldyBUeXBlRXJyb3IoIlVuZXhwZWN0ZWQgbm90aWZpY2F0aW9uIGtpbmQgIitlKTtyZXR1cm4gb30sdC5jcmVhdGVOZXh0PWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdCgiTiIsZSl9LHQuY3JlYXRlRXJyb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB0KCJFIix2b2lkIDAsZSl9LHQuY3JlYXRlQ29tcGxldGU9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb21wbGV0ZU5vdGlmaWNhdGlvbn0sdC5jb21wbGV0ZU5vdGlmaWNhdGlvbj1uZXcgdCgiQyIpLHR9KSgpO2Z1bmN0aW9uIFR0KHQsZSl7dmFyIG4sbyxpLGE9dC5raW5kLHI9dC52YWx1ZSxzPXQuZXJyb3I7aWYoInN0cmluZyIhPXR5cGVvZiBhKXRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm90aWZpY2F0aW9uLCBtaXNzaW5nICJraW5kIicpOyJOIj09PWE/bnVsbD09PShuPWUubmV4dCl8fHZvaWQgMD09PW58fG4uY2FsbChlLHIpOiJFIj09PWE/bnVsbD09PShvPWUuZXJyb3IpfHx2b2lkIDA9PT1vfHxvLmNhbGwoZSxzKTpudWxsPT09KGk9ZS5jb21wbGV0ZSl8fHZvaWQgMD09PWl8fGkuY2FsbChlKX1mdW5jdGlvbiBOdCh0KXtyZXR1cm4hIXQmJih0IGluc3RhbmNlb2YgRHx8bCh0LmxpZnQpJiZsKHQuc3Vic2NyaWJlKSl9dmFyIHp0PWMoKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBlKCl7dCh0aGlzKSx0aGlzLm5hbWU9IkVtcHR5RXJyb3IiLHRoaXMubWVzc2FnZT0ibm8gZWxlbWVudHMgaW4gc2VxdWVuY2UifX0pKTtmdW5jdGlvbiBJdCh0LGUpe3JldHVybiBSKChmdW5jdGlvbihuLG8pe3ZhciBpPTA7bi5zdWJzY3JpYmUobmV3IFQobywoZnVuY3Rpb24obil7by5uZXh0KHQuY2FsbChlLG4saSsrKSl9KSkpfSkpfXZhciBIdD1BcnJheS5pc0FycmF5O2Z1bmN0aW9uIEZ0KHQpe3JldHVybiBJdCgoZnVuY3Rpb24oZSl7cmV0dXJuKGZ1bmN0aW9uIG4odCxlKXtyZXR1cm4gSHQoZSk/dC5hcHBseSh2b2lkIDAsYShbXSxpKGUpKSk6dChlKX0pKHQsZSl9KSl9dmFyIEx0PUFycmF5LmlzQXJyYXksQnQ9T2JqZWN0LmdldFByb3RvdHlwZU9mLFZ0PU9iamVjdC5wcm90b3R5cGUsanQ9T2JqZWN0LmtleXM7ZnVuY3Rpb24gVXQodCl7aWYoMT09PXQubGVuZ3RoKXt2YXIgZT10WzBdO2lmKEx0KGUpKXJldHVybnthcmdzOmUsa2V5czpudWxsfTtpZigoZnVuY3Rpb24gbih0KXtyZXR1cm4gdCYmIm9iamVjdCI9PXR5cGVvZiB0JiZCdCh0KT09PVZ0fSkoZSkpe3ZhciBvPWp0KGUpO3JldHVybnthcmdzOm8ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0pKSxrZXlzOm99fX1yZXR1cm57YXJnczp0LGtleXM6bnVsbH19ZnVuY3Rpb24gR3QodCxlKXtyZXR1cm4gdC5yZWR1Y2UoKGZ1bmN0aW9uKHQsbixvKXtyZXR1cm4gdFtuXT1lW29dLHR9KSx7fSl9ZnVuY3Rpb24gV3QoKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07dmFyIG49U3QodCksbz1rdCh0KSxpPVV0KHQpLGE9aS5hcmdzLHI9aS5rZXlzO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gQ3QoW10sbik7dmFyIHM9bmV3IEQoWXQoYSxuLHI/ZnVuY3Rpb24odCl7cmV0dXJuIEd0KHIsdCl9OncpKTtyZXR1cm4gbz9zLnBpcGUoRnQobykpOnN9ZnVuY3Rpb24gWXQodCxlLG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj13KSxmdW5jdGlvbihvKXtxdChlLChmdW5jdGlvbigpe2Zvcih2YXIgaT10Lmxlbmd0aCxhPW5ldyBBcnJheShpKSxyPWkscz1pLGw9ZnVuY3Rpb24oaSl7cXQoZSwoZnVuY3Rpb24oKXt2YXIgbD1DdCh0W2ldLGUpLGM9ITE7bC5zdWJzY3JpYmUobmV3IFQobywoZnVuY3Rpb24odCl7YVtpXT10LGN8fChjPSEwLHMtLSksc3x8by5uZXh0KG4oYS5zbGljZSgpKSl9KSwoZnVuY3Rpb24oKXstLXJ8fG8uY29tcGxldGUoKX0pKSl9KSxvKX0sYz0wO2M8aTtjKyspbChjKX0pLG8pfX1mdW5jdGlvbiBxdCh0LGUsbil7dD9uLmFkZCh0LnNjaGVkdWxlKGUpKTplKCl9ZnVuY3Rpb24gWnQodCxlLG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj0xLzApLGwoZSk/WnQoKGZ1bmN0aW9uKG4sbyl7cmV0dXJuIEl0KChmdW5jdGlvbih0LGkpe3JldHVybiBlKG4sdCxvLGkpfSkpKE10KHQobixvKSkpfSksbik6KCJudW1iZXIiPT10eXBlb2YgZSYmKG49ZSksUigoZnVuY3Rpb24oZSxvKXtyZXR1cm4oZnVuY3Rpb24gaSh0LGUsbixvLGEscixzLGwpe3ZhciBjPVtdLGQ9MCxwPTAsbT0hMSx1PWZ1bmN0aW9uKCl7IW18fGMubGVuZ3RofHxkfHxlLmNvbXBsZXRlKCl9LGY9ZnVuY3Rpb24odCl7cmV0dXJuIGQ8bz9nKHQpOmMucHVzaCh0KX0sZz1mdW5jdGlvbih0KXtyJiZlLm5leHQodCksZCsrO3ZhciBpPSExO010KG4odCxwKyspKS5zdWJzY3JpYmUobmV3IFQoZSwoZnVuY3Rpb24odCl7bnVsbD09YXx8YSh0KSxyP2YodCk6ZS5uZXh0KHQpfSksKGZ1bmN0aW9uKCl7aT0hMH0pLHZvaWQgMCwoZnVuY3Rpb24oKXtpZihpKXRyeXtkLS07Zm9yKHZhciB0PWZ1bmN0aW9uKCl7dmFyIHQ9Yy5zaGlmdCgpO3M/ZS5hZGQocy5zY2hlZHVsZSgoZnVuY3Rpb24oKXtyZXR1cm4gZyh0KX0pKSk6Zyh0KX07Yy5sZW5ndGgmJmQ8bzspdCgpO3UoKX1jYXRjaCh0KXtlLmVycm9yKHQpfX0pKSl9O3JldHVybiB0LnN1YnNjcmliZShuZXcgVChlLGYsKGZ1bmN0aW9uKCl7bT0hMCx1KCl9KSkpLGZ1bmN0aW9uKCl7bnVsbD09bHx8bCgpfX0pKGUsbyx0LG4pfSkpKX1mdW5jdGlvbiBYdCh0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9MS8wKSxadCh3LHQpfWZ1bmN0aW9uIEt0KCl7cmV0dXJuIFh0KDEpfWZ1bmN0aW9uIEp0KCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3JldHVybiBLdCgpKE90KHQsU3QodCkpKX1mdW5jdGlvbiBRdCh0KXtyZXR1cm4gbmV3IEQoKGZ1bmN0aW9uKGUpe010KHQoKSkuc3Vic2NyaWJlKGUpfSkpfWZ1bmN0aW9uICR0KCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3ZhciBuPWt0KHQpLG89VXQodCksaT1vLmFyZ3MsYT1vLmtleXMscj1uZXcgRCgoZnVuY3Rpb24odCl7dmFyIGU9aS5sZW5ndGg7aWYoZSlmb3IodmFyIG49bmV3IEFycmF5KGUpLG89ZSxyPWUscz1mdW5jdGlvbihlKXt2YXIgcz0hMTtNdChpW2VdKS5zdWJzY3JpYmUobmV3IFQodCwoZnVuY3Rpb24odCl7c3x8KHM9ITAsci0tKSxuW2VdPXR9KSwoZnVuY3Rpb24oKXstLW8mJnN8fChyfHx0Lm5leHQoYT9HdChhLG4pOm4pLHQuY29tcGxldGUoKSl9KSkpfSxsPTA7bDxlO2wrKylzKGwpO2Vsc2UgdC5jb21wbGV0ZSgpfSkpO3JldHVybiBuP3IucGlwZShGdChuKSk6cn12YXIgdGU9WyJhZGRMaXN0ZW5lciIsInJlbW92ZUxpc3RlbmVyIl0sZWU9WyJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciJdLG5lPVsib24iLCJvZmYiXTtmdW5jdGlvbiBvZSh0LGUsbixvKXtpZihsKG4pJiYobz1uLG49dm9pZCAwKSxvKXJldHVybiBvZSh0LGUsbikucGlwZShGdChvKSk7dmFyIGE9aSgoZnVuY3Rpb24gcih0KXtyZXR1cm4gbCh0LmFkZEV2ZW50TGlzdGVuZXIpJiZsKHQucmVtb3ZlRXZlbnRMaXN0ZW5lcil9KSh0KT9lZS5tYXAoKGZ1bmN0aW9uKG8pe3JldHVybiBmdW5jdGlvbihpKXtyZXR1cm4gdFtvXShlLGksbil9fSkpOihmdW5jdGlvbiBzKHQpe3JldHVybiBsKHQuYWRkTGlzdGVuZXIpJiZsKHQucmVtb3ZlTGlzdGVuZXIpfSkodCk/dGUubWFwKGllKHQsZSkpOihmdW5jdGlvbiBjKHQpe3JldHVybiBsKHQub24pJiZsKHQub2ZmKX0pKHQpP25lLm1hcChpZSh0LGUpKTpbXSwyKSxkPWFbMF0scD1hWzFdO2lmKCFkJiZsdCh0KSlyZXR1cm4gWnQoKGZ1bmN0aW9uKHQpe3JldHVybiBvZSh0LGUsbil9KSkoT3QodCkpO2lmKCFkKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgZXZlbnQgdGFyZ2V0Iik7cmV0dXJuIG5ldyBEKChmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSxuPTA7bjxhcmd1bWVudHMubGVuZ3RoO24rKyllW25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdC5uZXh0KDE8ZS5sZW5ndGg/ZTplWzBdKX07cmV0dXJuIGQoZSksZnVuY3Rpb24oKXtyZXR1cm4gcChlKX19KSl9ZnVuY3Rpb24gaWUodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGZ1bmN0aW9uKG8pe3JldHVybiB0W25dKGUsbyl9fX1mdW5jdGlvbiBhZSh0LGUsbil7dm9pZCAwPT09dCYmKHQ9MCksdm9pZCAwPT09biYmKG49ZXQpO3ZhciBvPS0xO3JldHVybiBudWxsIT1lJiYoUHQoZSk/bj1lOm89ZSksbmV3IEQoKGZ1bmN0aW9uKGUpe3ZhciBpPShmdW5jdGlvbiBhKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZSYmIWlzTmFOKHQpfSkodCk/K3Qtbi5ub3coKTp0O2k8MCYmKGk9MCk7dmFyIHI9MDtyZXR1cm4gbi5zY2hlZHVsZSgoZnVuY3Rpb24oKXtlLmNsb3NlZHx8KGUubmV4dChyKyspLDA8PW8/dGhpcy5zY2hlZHVsZSh2b2lkIDAsbyk6ZS5jb21wbGV0ZSgpKX0pLGkpfSkpfWZ1bmN0aW9uIHJlKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3ZhciBuPVN0KHQpLG89RHQodCwxLzApLGk9dDtyZXR1cm4gaS5sZW5ndGg/MT09PWkubGVuZ3RoP010KGlbMF0pOlh0KG8pKE90KGksbikpOnJ0fXZhciBzZT1BcnJheS5pc0FycmF5O2Z1bmN0aW9uIGxlKHQpe3JldHVybiAxPT09dC5sZW5ndGgmJnNlKHRbMF0pP3RbMF06dH1mdW5jdGlvbiBjZSh0LGUpe3JldHVybiBSKChmdW5jdGlvbihuLG8pe3ZhciBpPTA7bi5zdWJzY3JpYmUobmV3IFQobywoZnVuY3Rpb24obil7cmV0dXJuIHQuY2FsbChlLG4saSsrKSYmby5uZXh0KG4pfSkpKX0pKX1mdW5jdGlvbiBkZSh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1ldCksKGZ1bmN0aW9uIG4odCl7cmV0dXJuIFIoKGZ1bmN0aW9uKGUsbil7dmFyIG89ITEsaT1udWxsLGE9bnVsbCxyPSExLHM9ZnVuY3Rpb24oKXtpZihudWxsPT1hfHxhLnVuc3Vic2NyaWJlKCksYT1udWxsLG8pe289ITE7dmFyIHQ9aTtpPW51bGwsbi5uZXh0KHQpfXImJm4uY29tcGxldGUoKX0sbD1mdW5jdGlvbigpe2E9bnVsbCxyJiZuLmNvbXBsZXRlKCl9O2Uuc3Vic2NyaWJlKG5ldyBUKG4sKGZ1bmN0aW9uKGUpe289ITAsaT1lLGF8fE10KHQoZSkpLnN1YnNjcmliZShhPW5ldyBUKG4scyxsKSl9KSwoZnVuY3Rpb24oKXtyPSEwLCghb3x8IWF8fGEuY2xvc2VkKSYmbi5jb21wbGV0ZSgpfSkpKX0pKX0pKChmdW5jdGlvbigpe3JldHVybiBhZSh0LGUpfSkpfWZ1bmN0aW9uIHBlKHQpe3JldHVybiBSKChmdW5jdGlvbihlLG4pe3ZhciBvLGk9bnVsbCxhPSExO2k9ZS5zdWJzY3JpYmUobmV3IFQobix2b2lkIDAsdm9pZCAwLChmdW5jdGlvbihyKXtvPU10KHQocixwZSh0KShlKSkpLGk/KGkudW5zdWJzY3JpYmUoKSxpPW51bGwsby5zdWJzY3JpYmUobikpOmE9ITB9KSkpLGEmJihpLnVuc3Vic2NyaWJlKCksaT1udWxsLG8uc3Vic2NyaWJlKG4pKX0pKX1mdW5jdGlvbiBtZSh0LGUsbixvLGkpe3JldHVybiBmdW5jdGlvbihhLHIpe3ZhciBzPW4sbD1lLGM9MDthLnN1YnNjcmliZShuZXcgVChyLChmdW5jdGlvbihlKXt2YXIgbj1jKys7bD1zP3QobCxlLG4pOihzPSEwLGUpLG8mJnIubmV4dChsKX0pLGkmJmZ1bmN0aW9uKCl7cyYmci5uZXh0KGwpLHIuY29tcGxldGUoKX0pKX19ZnVuY3Rpb24gdWUoKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07dmFyIG49a3QodCk7cmV0dXJuIG4/ayh1ZS5hcHBseSh2b2lkIDAsYShbXSxpKHQpKSksRnQobikpOlIoKGZ1bmN0aW9uKGUsbil7WXQoYShbZV0saShsZSh0KSkpKShuKX0pKX1mdW5jdGlvbiBmZSgpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTtyZXR1cm4gdWUuYXBwbHkodm9pZCAwLGEoW10saSh0KSkpfWZ1bmN0aW9uIGdlKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXR0KSxSKChmdW5jdGlvbihuLG8pe3ZhciBpPW51bGwsYT1udWxsLHI9bnVsbCxzPWZ1bmN0aW9uKCl7aWYoaSl7aS51bnN1YnNjcmliZSgpLGk9bnVsbDt2YXIgdD1hO2E9bnVsbCxvLm5leHQodCl9fTtmdW5jdGlvbiBsKCl7dmFyIG49cit0LGE9ZS5ub3coKTtpZihhPG4pcmV0dXJuIGk9dGhpcy5zY2hlZHVsZSh2b2lkIDAsbi1hKSx2b2lkIG8uYWRkKGkpO3MoKX1uLnN1YnNjcmliZShuZXcgVChvLChmdW5jdGlvbihuKXthPW4scj1lLm5vdygpLGl8fChpPWUuc2NoZWR1bGUobCx0KSxvLmFkZChpKSl9KSwoZnVuY3Rpb24oKXtzKCksby5jb21wbGV0ZSgpfSksdm9pZCAwLChmdW5jdGlvbigpe2E9aT1udWxsfSkpKX0pKX1mdW5jdGlvbiBoZSh0KXtyZXR1cm4gUigoZnVuY3Rpb24oZSxuKXt2YXIgbz0hMTtlLnN1YnNjcmliZShuZXcgVChuLChmdW5jdGlvbih0KXtvPSEwLG4ubmV4dCh0KX0pLChmdW5jdGlvbigpe298fG4ubmV4dCh0KSxuLmNvbXBsZXRlKCl9KSkpfSkpfWZ1bmN0aW9uIGJlKHQpe3JldHVybiB0PD0wP2Z1bmN0aW9uKCl7cmV0dXJuIHJ0fTpSKChmdW5jdGlvbihlLG4pe3ZhciBvPTA7ZS5zdWJzY3JpYmUobmV3IFQobiwoZnVuY3Rpb24oZSl7KytvPD10JiYobi5uZXh0KGUpLHQ8PW8mJm4uY29tcGxldGUoKSl9KSkpfSkpfWZ1bmN0aW9uIHllKCl7cmV0dXJuIFIoKGZ1bmN0aW9uKHQsZSl7dC5zdWJzY3JpYmUobmV3IFQoZSx5KSl9KSl9ZnVuY3Rpb24gX2UodCxlKXtyZXR1cm4gZT9mdW5jdGlvbihuKXtyZXR1cm4gSnQoZS5waXBlKGJlKDEpLHllKCkpLG4ucGlwZShfZSh0KSkpfTpadCgoZnVuY3Rpb24oZSxuKXtyZXR1cm4gdChlLG4pLnBpcGUoYmUoMSksKGZ1bmN0aW9uIG8odCl7cmV0dXJuIEl0KChmdW5jdGlvbigpe3JldHVybiB0fSkpfSkoZSkpfSkpfWZ1bmN0aW9uIENlKHQsZSl7dm9pZCAwPT09ZSYmKGU9dHQpO3ZhciBuPWFlKHQsZSk7cmV0dXJuIF9lKChmdW5jdGlvbigpe3JldHVybiBufSkpfWZ1bmN0aW9uIE1lKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXcpLHQ9bnVsbCE9dD90OnZlLFIoKGZ1bmN0aW9uKG4sbyl7dmFyIGksYT0hMDtuLnN1YnNjcmliZShuZXcgVChvLChmdW5jdGlvbihuKXt2YXIgcj1lKG4pOyFhJiZ0KGkscil8fChhPSExLGk9cixvLm5leHQobikpfSkpKX0pKX1mdW5jdGlvbiB2ZSh0LGUpe3JldHVybiB0PT09ZX1mdW5jdGlvbiB4ZSh0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9T2UpLFIoKGZ1bmN0aW9uKGUsbil7dmFyIG89ITE7ZS5zdWJzY3JpYmUobmV3IFQobiwoZnVuY3Rpb24odCl7bz0hMCxuLm5leHQodCl9KSwoZnVuY3Rpb24oKXtyZXR1cm4gbz9uLmNvbXBsZXRlKCk6bi5lcnJvcih0KCkpfSkpKX0pKX1mdW5jdGlvbiBPZSgpe3JldHVybiBuZXcgenR9ZnVuY3Rpb24gUGUodCxlKXtyZXR1cm4gZT9mdW5jdGlvbihuKXtyZXR1cm4gbi5waXBlKFBlKChmdW5jdGlvbihuLG8pe3JldHVybiBNdCh0KG4sbykpLnBpcGUoSXQoKGZ1bmN0aW9uKHQsaSl7cmV0dXJuIGUobix0LG8saSl9KSkpfSkpKX06UigoZnVuY3Rpb24oZSxuKXt2YXIgbz0wLGk9bnVsbCxhPSExO2Uuc3Vic2NyaWJlKG5ldyBUKG4sKGZ1bmN0aW9uKGUpe2l8fChpPW5ldyBUKG4sdm9pZCAwLChmdW5jdGlvbigpe2k9bnVsbCxhJiZuLmNvbXBsZXRlKCl9KSksTXQodChlLG8rKykpLnN1YnNjcmliZShpKSl9KSwoZnVuY3Rpb24oKXthPSEwLCFpJiZuLmNvbXBsZXRlKCl9KSkpfSkpfWZ1bmN0aW9uIHdlKHQsZSxuLG8pe3JldHVybiBSKChmdW5jdGlvbihpLGEpe3ZhciByO2UmJiJmdW5jdGlvbiIhPXR5cGVvZiBlPyhuPWUuZHVyYXRpb24scj1lLmVsZW1lbnQsbz1lLmNvbm5lY3Rvcik6cj1lO3ZhciBzPW5ldyBNYXAsbD1mdW5jdGlvbih0KXtzLmZvckVhY2godCksdChhKX0sYz1mdW5jdGlvbih0KXtyZXR1cm4gbCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZXJyb3IodCl9KSl9LGQ9bmV3IGtlKGEsKGZ1bmN0aW9uKGUpe3RyeXt2YXIgaT10KGUpLGw9cy5nZXQoaSk7aWYoIWwpe3Muc2V0KGksbD1vP28oKTpuZXcgSSk7dmFyIHA9KGZ1bmN0aW9uIG0odCxlKXt2YXIgbj1uZXcgRCgoZnVuY3Rpb24odCl7ZC5hY3RpdmVHcm91cHMrKzt2YXIgbj1lLnN1YnNjcmliZSh0KTtyZXR1cm4gZnVuY3Rpb24oKXtuLnVuc3Vic2NyaWJlKCksMD09LS1kLmFjdGl2ZUdyb3VwcyYmZC50ZWFyZG93bkF0dGVtcHRlZCYmZC51bnN1YnNjcmliZSgpfX0pKTtyZXR1cm4gbi5rZXk9dCxufSkoaSxsKTtpZihhLm5leHQocCksbil7dmFyIHU9bmV3IFQobCwoZnVuY3Rpb24oKXtsLmNvbXBsZXRlKCksbnVsbD09dXx8dS51bnN1YnNjcmliZSgpfSksdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24oKXtyZXR1cm4gcy5kZWxldGUoaSl9KSk7ZC5hZGQoTXQobihwKSkuc3Vic2NyaWJlKHUpKX19bC5uZXh0KHI/cihlKTplKX1jYXRjaCh0KXtjKHQpfX0pLChmdW5jdGlvbigpe3JldHVybiBsKChmdW5jdGlvbih0KXtyZXR1cm4gdC5jb21wbGV0ZSgpfSkpfSksYywoZnVuY3Rpb24oKXtyZXR1cm4gcy5jbGVhcigpfSkpO2kuc3Vic2NyaWJlKGQpfSkpfXZhciBrZT0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gbigpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5hY3RpdmVHcm91cHM9MCxlLnRlYXJkb3duQXR0ZW1wdGVkPSExLGV9cmV0dXJuIGUobix0KSxuLnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbigpe3RoaXMudGVhcmRvd25BdHRlbXB0ZWQ9ITAsMD09PXRoaXMuYWN0aXZlR3JvdXBzJiZ0LnByb3RvdHlwZS51bnN1YnNjcmliZS5jYWxsKHRoaXMpfSxufSkoVCk7ZnVuY3Rpb24gU2UodCl7cmV0dXJuIHQ8PTA/ZnVuY3Rpb24oKXtyZXR1cm4gcnR9OlIoKGZ1bmN0aW9uKGUsbil7dmFyIGk9W107ZS5zdWJzY3JpYmUobmV3IFQobiwoZnVuY3Rpb24oZSl7aS5wdXNoKGUpLHQ8aS5sZW5ndGgmJmkuc2hpZnQoKX0pLChmdW5jdGlvbigpe3ZhciB0LGU7dHJ5e2Zvcih2YXIgYT1vKGkpLHI9YS5uZXh0KCk7IXIuZG9uZTtyPWEubmV4dCgpKW4ubmV4dChyLnZhbHVlKX1jYXRjaChlKXt0PXtlcnJvcjplfX1maW5hbGx5e3RyeXtyJiYhci5kb25lJiYoZT1hLnJldHVybikmJmUuY2FsbChhKX1maW5hbGx5e2lmKHQpdGhyb3cgdC5lcnJvcn19bi5jb21wbGV0ZSgpfSksdm9pZCAwLChmdW5jdGlvbigpe2k9bnVsbH0pKSl9KSl9ZnVuY3Rpb24gRGUoKXtyZXR1cm4gUigoZnVuY3Rpb24odCxlKXt2YXIgbixvPSExO3Quc3Vic2NyaWJlKG5ldyBUKGUsKGZ1bmN0aW9uKHQpe3ZhciBpPW47bj10LG8mJmUubmV4dChbaSx0XSksbz0hMH0pKSl9KSl9ZnVuY3Rpb24gRWUodCl7dm9pZCAwPT09dCYmKHQ9e30pO3ZhciBlPXQuY29ubmVjdG9yLG49dm9pZCAwPT09ZT9mdW5jdGlvbigpe3JldHVybiBuZXcgSX06ZSxvPXQucmVzZXRPbkVycm9yLGk9dm9pZCAwPT09b3x8byxhPXQucmVzZXRPbkNvbXBsZXRlLHI9dm9pZCAwPT09YXx8YSxzPXQucmVzZXRPblJlZkNvdW50WmVybyxsPXZvaWQgMD09PXN8fHM7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPW51bGwsbz1udWxsLGE9bnVsbCxzPTAsYz0hMSxkPSExLHA9ZnVuY3Rpb24oKXtudWxsPT1vfHxvLnVuc3Vic2NyaWJlKCksbz1udWxsfSxtPWZ1bmN0aW9uKCl7cCgpLGU9YT1udWxsLGM9ZD0hMX0sdT1mdW5jdGlvbigpe3ZhciB0PWU7bSgpLG51bGw9PXR8fHQudW5zdWJzY3JpYmUoKX07cmV0dXJuIFIoKGZ1bmN0aW9uKHQsZil7cysrLGR8fGN8fHAoKTt2YXIgZz1hPW51bGwhPWE/YTpuKCk7Zi5hZGQoKGZ1bmN0aW9uKCl7MCE9LS1zfHxkfHxjfHwobz1SZSh1LGwpKX0pKSxnLnN1YnNjcmliZShmKSxlfHwoZT1uZXcgTSh7bmV4dDpmdW5jdGlvbih0KXtyZXR1cm4gZy5uZXh0KHQpfSxlcnJvcjpmdW5jdGlvbih0KXtkPSEwLHAoKSxvPVJlKG0saSx0KSxnLmVycm9yKHQpfSxjb21wbGV0ZTpmdW5jdGlvbigpe2M9ITAscCgpLG89UmUobSxyKSxnLmNvbXBsZXRlKCl9fSksQ3QodCkuc3Vic2NyaWJlKGUpKX0pKSh0KX19ZnVuY3Rpb24gUmUodCxlKXtmb3IodmFyIG49W10sbz0yO288YXJndW1lbnRzLmxlbmd0aDtvKyspbltvLTJdPWFyZ3VtZW50c1tvXTtyZXR1cm4hMD09PWU/KHQoKSxudWxsKTohMT09PWU/bnVsbDplLmFwcGx5KHZvaWQgMCxhKFtdLGkobikpKS5waXBlKGJlKDEpKS5zdWJzY3JpYmUoKGZ1bmN0aW9uKCl7cmV0dXJuIHQoKX0pKX1mdW5jdGlvbiBBZSh0LGUsbil7dmFyIG8saSxhLHI9ITE7cmV0dXJuIHQmJiJvYmplY3QiPT10eXBlb2YgdD8oYT1udWxsIT09KG89dC5idWZmZXJTaXplKSYmdm9pZCAwIT09bz9vOjEvMCxlPW51bGwhPT0oaT10LndpbmRvd1RpbWUpJiZ2b2lkIDAhPT1pP2k6MS8wLHI9ISF0LnJlZkNvdW50LG49dC5zY2hlZHVsZXIpOmE9bnVsbCE9dD90OjEvMCxFZSh7Y29ubmVjdG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBCKGEsZSxuKX0scmVzZXRPbkVycm9yOiEwLHJlc2V0T25Db21wbGV0ZTohMSxyZXNldE9uUmVmQ291bnRaZXJvOnJ9KX1mdW5jdGlvbiBUZSh0KXtyZXR1cm4gY2UoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQ8PW59KSl9ZnVuY3Rpb24gTmUoKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07dmFyIG49U3QodCk7cmV0dXJuIFIoKGZ1bmN0aW9uKGUsbyl7KG4/SnQodCxlLG4pOkp0KHQsZSkpLnN1YnNjcmliZShvKX0pKX1mdW5jdGlvbiB6ZSh0LGUpe3JldHVybiBSKChmdW5jdGlvbihuLG8pe3ZhciBpPW51bGwsYT0wLHI9ITEscz1mdW5jdGlvbigpe3JldHVybiByJiYhaSYmby5jb21wbGV0ZSgpfTtuLnN1YnNjcmliZShuZXcgVChvLChmdW5jdGlvbihuKXtudWxsPT1pfHxpLnVuc3Vic2NyaWJlKCk7dmFyIHI9MCxsPWErKztNdCh0KG4sbCkpLnN1YnNjcmliZShpPW5ldyBUKG8sKGZ1bmN0aW9uKHQpe3JldHVybiBvLm5leHQoZT9lKG4sdCxsLHIrKyk6dCl9KSwoZnVuY3Rpb24oKXtpPW51bGwscygpfSkpKX0pLChmdW5jdGlvbigpe3I9ITAscygpfSkpKX0pKX1mdW5jdGlvbiBJZSh0KXtyZXR1cm4gUigoZnVuY3Rpb24oZSxuKXtNdCh0KS5zdWJzY3JpYmUobmV3IFQobiwoZnVuY3Rpb24oKXtyZXR1cm4gbi5jb21wbGV0ZSgpfSkseSkpLCFuLmNsb3NlZCYmZS5zdWJzY3JpYmUobil9KSl9ZnVuY3Rpb24gSGUodCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9ITEpLFIoKGZ1bmN0aW9uKG4sbyl7dmFyIGk9MDtuLnN1YnNjcmliZShuZXcgVChvLChmdW5jdGlvbihuKXt2YXIgYT10KG4saSsrKTsoYXx8ZSkmJm8ubmV4dChuKSwhYSYmby5jb21wbGV0ZSgpfSkpKX0pKX1mdW5jdGlvbiBGZSh0LGUsbil7dmFyIG89bCh0KXx8ZXx8bj97bmV4dDp0LGVycm9yOmUsY29tcGxldGU6bn06dDtyZXR1cm4gbz9SKChmdW5jdGlvbih0LGUpe3ZhciBuO251bGw9PT0obj1vLnN1YnNjcmliZSl8fHZvaWQgMD09PW58fG4uY2FsbChvKTt2YXIgaT0hMDt0LnN1YnNjcmliZShuZXcgVChlLChmdW5jdGlvbih0KXt2YXIgbjtudWxsPT09KG49by5uZXh0KXx8dm9pZCAwPT09bnx8bi5jYWxsKG8sdCksZS5uZXh0KHQpfSksKGZ1bmN0aW9uKCl7dmFyIHQ7aT0hMSxudWxsPT09KHQ9by5jb21wbGV0ZSl8fHZvaWQgMD09PXR8fHQuY2FsbChvKSxlLmNvbXBsZXRlKCl9KSwoZnVuY3Rpb24odCl7dmFyIG47aT0hMSxudWxsPT09KG49by5lcnJvcil8fHZvaWQgMD09PW58fG4uY2FsbChvLHQpLGUuZXJyb3IodCl9KSwoZnVuY3Rpb24oKXt2YXIgdCxlO2kmJihudWxsPT09KHQ9by51bnN1YnNjcmliZSl8fHZvaWQgMD09PXR8fHQuY2FsbChvKSksbnVsbD09PShlPW8uZmluYWxpemUpfHx2b2lkIDA9PT1lfHxlLmNhbGwobyl9KSkpfSkpOnd9dmFyIExlPXtsZWFkaW5nOiEwLHRyYWlsaW5nOiExfTtmdW5jdGlvbiBCZSh0LGUsbil7dm9pZCAwPT09ZSYmKGU9dHQpLHZvaWQgMD09PW4mJihuPUxlKTt2YXIgbz1hZSh0LGUpO3JldHVybihmdW5jdGlvbiBpKHQsZSl7dmFyIG49dm9pZCAwPT09ZT9MZTplLG89bi5sZWFkaW5nLGk9bi50cmFpbGluZztyZXR1cm4gUigoZnVuY3Rpb24oZSxuKXt2YXIgYT0hMSxyPW51bGwscz1udWxsLGw9ITEsYz1mdW5jdGlvbigpe251bGw9PXN8fHMudW5zdWJzY3JpYmUoKSxzPW51bGwsaSYmKG0oKSxsJiZuLmNvbXBsZXRlKCkpfSxkPWZ1bmN0aW9uKCl7cz1udWxsLGwmJm4uY29tcGxldGUoKX0scD1mdW5jdGlvbihlKXtyZXR1cm4gcz1NdCh0KGUpKS5zdWJzY3JpYmUobmV3IFQobixjLGQpKX0sbT1mdW5jdGlvbigpe2lmKGEpe2E9ITE7dmFyIHQ9cjtyPW51bGwsbi5uZXh0KHQpLCFsJiZwKHQpfX07ZS5zdWJzY3JpYmUobmV3IFQobiwoZnVuY3Rpb24odCl7YT0hMCxyPXQsKCFzfHxzLmNsb3NlZCkmJihvP20oKTpwKHQpKX0pLChmdW5jdGlvbigpe2w9ITAsKCEoaSYmYSYmcyl8fHMuY2xvc2VkKSYmbi5jb21wbGV0ZSgpfSkpKX0pKX0pKChmdW5jdGlvbigpe3JldHVybiBvfSksbil9ZnVuY3Rpb24gVmUoKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07dmFyIG49a3QodCk7cmV0dXJuIFIoKGZ1bmN0aW9uKGUsbyl7Zm9yKHZhciByPXQubGVuZ3RoLHM9bmV3IEFycmF5KHIpLGw9dC5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuITF9KSksYz0hMSxkPWZ1bmN0aW9uKGUpe010KHRbZV0pLnN1YnNjcmliZShuZXcgVChvLChmdW5jdGlvbih0KXtzW2VdPXQsY3x8bFtlXXx8KGxbZV09ITAsKGM9bC5ldmVyeSh3KSkmJihsPW51bGwpKX0pLHkpKX0scD0wO3A8cjtwKyspZChwKTtlLnN1YnNjcmliZShuZXcgVChvLChmdW5jdGlvbih0KXtpZihjKXt2YXIgZT1hKFt0XSxpKHMpKTtvLm5leHQobj9uLmFwcGx5KHZvaWQgMCxhKFtdLGkoZSkpKTplKX19KSkpfSkpfQovKioKICAgICAqIEBsaWNlbnNlIEFuZ3VsYXIgdjEyLjIuMQogICAgICogKGMpIDIwMTAtMjAyMSBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vCiAgICAgKiBMaWNlbnNlOiBNSVQKICAgICAqLwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBqZSh0KXtmb3IobGV0IGUgaW4gdClpZih0W2VdPT09amUpcmV0dXJuIGU7dGhyb3cgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIHJlbmFtZWQgcHJvcGVydHkgb24gdGFyZ2V0IG9iamVjdC4iKX1mdW5jdGlvbiBVZSh0LGUpe2Zvcihjb25zdCBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmIXQuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBHZSh0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4iWyIrdC5tYXAoR2UpLmpvaW4oIiwgIikrIl0iO2lmKG51bGw9PXQpcmV0dXJuIiIrdDtpZih0Lm92ZXJyaWRkZW5OYW1lKXJldHVybmAke3Qub3ZlcnJpZGRlbk5hbWV9YDtpZih0Lm5hbWUpcmV0dXJuYCR7dC5uYW1lfWA7Y29uc3QgZT10LnRvU3RyaW5nKCk7aWYobnVsbD09ZSlyZXR1cm4iIitlO2NvbnN0IG49ZS5pbmRleE9mKCJcbiIpO3JldHVybi0xPT09bj9lOmUuc3Vic3RyaW5nKDAsbil9ZnVuY3Rpb24gV2UodCxlKXtyZXR1cm4gbnVsbD09dHx8IiI9PT10P251bGw9PT1lPyIiOmU6bnVsbD09ZXx8IiI9PT1lP3Q6dCsiICIrZX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3QgWWU9amUoe19fZm9yd2FyZF9yZWZfXzpqZX0pO2Z1bmN0aW9uIHFlKHQpe3JldHVybiB0Ll9fZm9yd2FyZF9yZWZfXz1xZSx0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIEdlKHRoaXMoKSl9LHR9ZnVuY3Rpb24gWmUodCl7cmV0dXJuIFhlKHQpP3QoKTp0fWZ1bmN0aW9uIFhlKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0Lmhhc093blByb3BlcnR5KFllKSYmdC5fX2ZvcndhcmRfcmVmX189PT1xZX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgS2UgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKFFlKHQsZSkpLHRoaXMuY29kZT10fX1jb25zdCBKZT1uZXcgU2V0KFsiMTAwIiwiMjAwIiwiMjAxIiwiMzAwIiwiMzAxIiwiMzAyIl0pO2Z1bmN0aW9uIFFlKHQsZSl7bGV0IG49YCR7dD9gTkcwJHt0fTogYDoiIn0ke2V9YDtyZXR1cm4gbmdEZXZNb2RlJiZKZS5oYXModCkmJihuPWAke259LiBGaW5kIG1vcmUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2Vycm9ycy9ORzAke3R9YCksbn0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gJGUodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P3Q6bnVsbD09dD8iIjpTdHJpbmcodCl9ZnVuY3Rpb24gdG4odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dC5uYW1lfHx0LnRvU3RyaW5nKCk6Im9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT10JiYiZnVuY3Rpb24iPT10eXBlb2YgdC50eXBlP3QudHlwZS5uYW1lfHx0LnR5cGUudG9TdHJpbmcoKTokZSh0KX1mdW5jdGlvbiBlbih0LGUpe2NvbnN0IG49ZT9gLiBEZXBlbmRlbmN5IHBhdGg6ICR7ZS5qb2luKCIgPiAiKX0gPiAke3R9YDoiIjt0aHJvdyBuZXcgS2UoIjIwMCIsYENpcmN1bGFyIGRlcGVuZGVuY3kgaW4gREkgZGV0ZWN0ZWQgZm9yICR7dH0ke259YCl9ZnVuY3Rpb24gbm4oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBtaXggbXVsdGkgcHJvdmlkZXJzIGFuZCByZWd1bGFyIHByb3ZpZGVycyIpfWZ1bmN0aW9uIG9uKHQsZSl7Y29uc3Qgbj1lP2AgaW4gJHtlfWA6IiI7dGhyb3cgbmV3IEtlKCIyMDEiLGBObyBwcm92aWRlciBmb3IgJHt0bih0KX0gZm91bmQke259YCl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIGFuKHQsZSl7Im51bWJlciIhPXR5cGVvZiB0JiZibihlLHR5cGVvZiB0LCJudW1iZXIiLCI9PT0iKX1mdW5jdGlvbiBybih0LGUsbil7YW4odCwiRXhwZWN0ZWQgYSBudW1iZXIiKSx1bih0LG4sIkV4cGVjdGVkIG51bWJlciB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8iKSxnbih0LGUsIkV4cGVjdGVkIG51bWJlciB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8iKX1mdW5jdGlvbiBzbih0LGUpeyJzdHJpbmciIT10eXBlb2YgdCYmYm4oZSxudWxsPT09dD8ibnVsbCI6dHlwZW9mIHQsInN0cmluZyIsIj09PSIpfWZ1bmN0aW9uIGxuKHQsZSxuKXt0IT1lJiZibihuLHQsZSwiPT0iKX1mdW5jdGlvbiBjbih0LGUsbil7dD09ZSYmYm4obix0LGUsIiE9Iil9ZnVuY3Rpb24gZG4odCxlLG4pe3QhPT1lJiZibihuLHQsZSwiPT09Iil9ZnVuY3Rpb24gcG4odCxlLG4pe3Q9PT1lJiZibihuLHQsZSwiIT09Iil9ZnVuY3Rpb24gbW4odCxlLG4pe3Q8ZXx8Ym4obix0LGUsIjwiKX1mdW5jdGlvbiB1bih0LGUsbil7dDw9ZXx8Ym4obix0LGUsIjw9Iil9ZnVuY3Rpb24gZm4odCxlLG4pe3Q+ZXx8Ym4obix0LGUsIj4iKX1mdW5jdGlvbiBnbih0LGUsbil7dD49ZXx8Ym4obix0LGUsIj49Iil9ZnVuY3Rpb24gaG4odCxlKXtudWxsPT10JiZibihlLHQsbnVsbCwiIT0iKX1mdW5jdGlvbiBibih0LGUsbixvKXt0aHJvdyBuZXcgRXJyb3IoYEFTU0VSVElPTiBFUlJPUjogJHt0fWArKG51bGw9PW8/IiI6YCBbRXhwZWN0ZWQ9PiAke259ICR7b30gJHtlfSA8PUFjdHVhbF1gKSl9ZnVuY3Rpb24geW4odCl7InVuZGVmaW5lZCIhPXR5cGVvZiBOb2RlJiZ0IGluc3RhbmNlb2YgTm9kZXx8Im9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT10JiYiV2ViV29ya2VyUmVuZGVyTm9kZSI9PT10LmNvbnN0cnVjdG9yLm5hbWV8fGJuKGBUaGUgcHJvdmlkZWQgdmFsdWUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBhIERPTSBOb2RlIGJ1dCBnb3QgJHtHZSh0KX1gKX1mdW5jdGlvbiBfbih0LGUpe2huKHQsIkFycmF5IG11c3QgYmUgZGVmaW5lZC4iKTtjb25zdCBuPXQubGVuZ3RoOyhlPDB8fGU+PW4pJiZibihgSW5kZXggZXhwZWN0ZWQgdG8gYmUgbGVzcyB0aGFuICR7bn0gYnV0IGdvdCAke2V9YCl9ZnVuY3Rpb24gQ24odCwuLi5lKXtpZigtMSE9PWUuaW5kZXhPZih0KSlyZXR1cm4hMDtibihgRXhwZWN0ZWQgdmFsdWUgdG8gYmUgb25lIG9mICR7SlNPTi5zdHJpbmdpZnkoZSl9IGJ1dCB3YXMgJHtKU09OLnN0cmluZ2lmeSh0KX0uYCl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIE1uKHQpe3JldHVybnt0b2tlbjp0LnRva2VuLHByb3ZpZGVkSW46dC5wcm92aWRlZElufHxudWxsLGZhY3Rvcnk6dC5mYWN0b3J5LHZhbHVlOnZvaWQgMH19ZnVuY3Rpb24gdm4odCl7cmV0dXJue3Byb3ZpZGVyczp0LnByb3ZpZGVyc3x8W10saW1wb3J0czp0LmltcG9ydHN8fFtdfX1mdW5jdGlvbiB4bih0KXtyZXR1cm4gT24odCx3bil8fE9uKHQsU24pfWZ1bmN0aW9uIE9uKHQsZSl7cmV0dXJuIHQuaGFzT3duUHJvcGVydHkoZSk/dFtlXTpudWxsfWZ1bmN0aW9uIFBuKHQpe3JldHVybiB0JiYodC5oYXNPd25Qcm9wZXJ0eShrbil8fHQuaGFzT3duUHJvcGVydHkoRG4pKT90W2tuXTpudWxsfWNvbnN0IHduPWplKHsiybVwcm92IjpqZX0pLGtuPWplKHsiybVpbmoiOmplfSksU249amUoe25nSW5qZWN0YWJsZURlZjpqZX0pLERuPWplKHtuZ0luamVjdG9yRGVmOmplfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwp2YXIgRW47Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpsZXQgUm47ZnVuY3Rpb24gQW4odCl7Y29uc3QgZT1SbjtyZXR1cm4gUm49dCxlfWZ1bmN0aW9uIFRuKHQsZSxuKXtjb25zdCBvPXhuKHQpO3JldHVybiBvJiYicm9vdCI9PW8ucHJvdmlkZWRJbj92b2lkIDA9PT1vLnZhbHVlP28udmFsdWU9by5mYWN0b3J5KCk6by52YWx1ZTpuJkVuLk9wdGlvbmFsP251bGw6dm9pZCAwIT09ZT9lOnZvaWQgb24oR2UodCksIkluamVjdG9yIil9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBObih0KXtyZXR1cm57dG9TdHJpbmc6dH0udG9TdHJpbmcoKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovdmFyIHpuLEluLEhuOyEoZnVuY3Rpb24odCl7dFt0LkRlZmF1bHQ9MF09IkRlZmF1bHQiLHRbdC5Ib3N0PTFdPSJIb3N0Iix0W3QuU2VsZj0yXT0iU2VsZiIsdFt0LlNraXBTZWxmPTRdPSJTa2lwU2VsZiIsdFt0Lk9wdGlvbmFsPThdPSJPcHRpb25hbCJ9KShFbnx8KEVuPXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5PblB1c2g9MF09Ik9uUHVzaCIsdFt0LkRlZmF1bHQ9MV09IkRlZmF1bHQifSkoem58fCh6bj17fSkpLChmdW5jdGlvbih0KXt0W3QuQ2hlY2tPbmNlPTBdPSJDaGVja09uY2UiLHRbdC5DaGVja2VkPTFdPSJDaGVja2VkIix0W3QuQ2hlY2tBbHdheXM9Ml09IkNoZWNrQWx3YXlzIix0W3QuRGV0YWNoZWQ9M109IkRldGFjaGVkIix0W3QuRXJyb3JlZD00XT0iRXJyb3JlZCIsdFt0LkRlc3Ryb3llZD01XT0iRGVzdHJveWVkIn0pKElufHwoSW49e30pKSwoZnVuY3Rpb24odCl7dFt0LkVtdWxhdGVkPTBdPSJFbXVsYXRlZCIsdFt0Lk5vbmU9Ml09Ik5vbmUiLHRbdC5TaGFkb3dEb209M109IlNoYWRvd0RvbSJ9KShIbnx8KEhuPXt9KSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBGbj0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXMmJmdsb2JhbFRoaXMsTG49InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdyxCbj0idW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYmJiJ1bmRlZmluZWQiIT10eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUmJnNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSYmc2VsZixWbj0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbCYmZ2xvYmFsLGpuPUZufHxWbnx8TG58fEJuO2Z1bmN0aW9uIFVuKCl7cmV0dXJuISgidW5kZWZpbmVkIiE9dHlwZW9mIG5nRGV2TW9kZSYmIW5nRGV2TW9kZXx8KCJvYmplY3QiIT10eXBlb2YgbmdEZXZNb2RlJiYoCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiB0KCl7Y29uc3QgdD0idW5kZWZpbmVkIiE9dHlwZW9mIGxvY2F0aW9uP2xvY2F0aW9uLnRvU3RyaW5nKCk6IiIsZT17bmFtZWRDb25zdHJ1Y3RvcnM6LTEhPXQuaW5kZXhPZigibmdEZXZNb2RlPW5hbWVkQ29uc3RydWN0b3JzIiksZmlyc3RDcmVhdGVQYXNzOjAsdE5vZGU6MCx0VmlldzowLHJlbmRlcmVyQ3JlYXRlVGV4dE5vZGU6MCxyZW5kZXJlclNldFRleHQ6MCxyZW5kZXJlckNyZWF0ZUVsZW1lbnQ6MCxyZW5kZXJlckFkZEV2ZW50TGlzdGVuZXI6MCxyZW5kZXJlclNldEF0dHJpYnV0ZTowLHJlbmRlcmVyUmVtb3ZlQXR0cmlidXRlOjAscmVuZGVyZXJTZXRQcm9wZXJ0eTowLHJlbmRlcmVyU2V0Q2xhc3NOYW1lOjAscmVuZGVyZXJBZGRDbGFzczowLHJlbmRlcmVyUmVtb3ZlQ2xhc3M6MCxyZW5kZXJlclNldFN0eWxlOjAscmVuZGVyZXJSZW1vdmVTdHlsZTowLHJlbmRlcmVyRGVzdHJveTowLHJlbmRlcmVyRGVzdHJveU5vZGU6MCxyZW5kZXJlck1vdmVOb2RlOjAscmVuZGVyZXJSZW1vdmVOb2RlOjAscmVuZGVyZXJBcHBlbmRDaGlsZDowLHJlbmRlcmVySW5zZXJ0QmVmb3JlOjAscmVuZGVyZXJDcmVhdGVDb21tZW50OjB9LG49LTE9PT10LmluZGV4T2YoIm5nRGV2TW9kZT1mYWxzZSIpO2puLm5nRGV2TW9kZT1uJiZlfSkoKSwidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8IW5nRGV2TW9kZSkpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCBHbj17fSxXbj1bXTsoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJlVuKCkmJihPYmplY3QuZnJlZXplKEduKSxPYmplY3QuZnJlZXplKFduKSkKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovO2NvbnN0IFluPWplKHsiybVjbXAiOmplfSkscW49amUoeyLJtWRpciI6amV9KSxabj1qZSh7Ism1cGlwZSI6amV9KSxYbj1qZSh7Ism1bW9kIjpqZX0pLEtuPWplKHsiybVsb2MiOmplfSksSm49amUoeyLJtWZhYyI6amV9KSxRbj1qZSh7X19OR19FTEVNRU5UX0lEX186amV9KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmxldCAkbj0wO2Z1bmN0aW9uIHRvKHQpe3JldHVybiBObigoKCk9PnsoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJlVuKCk7Y29uc3QgZT17fSxuPXt0eXBlOnQudHlwZSxwcm92aWRlcnNSZXNvbHZlcjpudWxsLGRlY2xzOnQuZGVjbHMsdmFyczp0LnZhcnMsZmFjdG9yeTpudWxsLHRlbXBsYXRlOnQudGVtcGxhdGV8fG51bGwsY29uc3RzOnQuY29uc3RzfHxudWxsLG5nQ29udGVudFNlbGVjdG9yczp0Lm5nQ29udGVudFNlbGVjdG9ycyxob3N0QmluZGluZ3M6dC5ob3N0QmluZGluZ3N8fG51bGwsaG9zdFZhcnM6dC5ob3N0VmFyc3x8MCxob3N0QXR0cnM6dC5ob3N0QXR0cnN8fG51bGwsY29udGVudFF1ZXJpZXM6dC5jb250ZW50UXVlcmllc3x8bnVsbCxkZWNsYXJlZElucHV0czplLGlucHV0czpudWxsLG91dHB1dHM6bnVsbCxleHBvcnRBczp0LmV4cG9ydEFzfHxudWxsLG9uUHVzaDp0LmNoYW5nZURldGVjdGlvbj09PXpuLk9uUHVzaCxkaXJlY3RpdmVEZWZzOm51bGwscGlwZURlZnM6bnVsbCxzZWxlY3RvcnM6dC5zZWxlY3RvcnN8fFduLHZpZXdRdWVyeTp0LnZpZXdRdWVyeXx8bnVsbCxmZWF0dXJlczp0LmZlYXR1cmVzfHxudWxsLGRhdGE6dC5kYXRhfHx7fSxlbmNhcHN1bGF0aW9uOnQuZW5jYXBzdWxhdGlvbnx8SG4uRW11bGF0ZWQsaWQ6ImMiLHN0eWxlczp0LnN0eWxlc3x8V24sXzpudWxsLHNldElucHV0Om51bGwsc2NoZW1hczp0LnNjaGVtYXN8fG51bGwsdFZpZXc6bnVsbH0sbz10LmRpcmVjdGl2ZXMsaT10LmZlYXR1cmVzLGE9dC5waXBlcztyZXR1cm4gbi5pZCs9JG4rKyxuLmlucHV0cz1zbyh0LmlucHV0cyxlKSxuLm91dHB1dHM9c28odC5vdXRwdXRzKSxpJiZpLmZvckVhY2goKHQ9PnQobikpKSxuLmRpcmVjdGl2ZURlZnM9bz8oKT0+KCJmdW5jdGlvbiI9PXR5cGVvZiBvP28oKTpvKS5tYXAobm8pOm51bGwsbi5waXBlRGVmcz1hPygpPT4oImZ1bmN0aW9uIj09dHlwZW9mIGE/YSgpOmEpLm1hcChvbyk6bnVsbCxufSkpfWZ1bmN0aW9uIGVvKHQsZSxuKXtjb25zdCBvPXQuybVjbXA7by5kaXJlY3RpdmVEZWZzPSgpPT5lLm1hcChubyksby5waXBlRGVmcz0oKT0+bi5tYXAob28pfWZ1bmN0aW9uIG5vKHQpe2NvbnN0IGU9cG8odCl8fG1vKHQpO2lmKG5nRGV2TW9kZSYmIWUpdGhyb3cgbmV3IEVycm9yKGAnJHt0Lm5hbWV9JyBpcyBuZWl0aGVyICdDb21wb25lbnRUeXBlJyBvciAnRGlyZWN0aXZlVHlwZScuYCk7cmV0dXJuIGV9ZnVuY3Rpb24gb28odCl7Y29uc3QgZT11byh0KTtpZihuZ0Rldk1vZGUmJiFlKXRocm93IG5ldyBFcnJvcihgJyR7dC5uYW1lfScgaXMgbm90IGEgJ1BpcGVUeXBlJy5gKTtyZXR1cm4gZX1jb25zdCBpbz17fTtmdW5jdGlvbiBhbyh0KXtyZXR1cm4gTm4oKCgpPT57Y29uc3QgZT17dHlwZTp0LnR5cGUsYm9vdHN0cmFwOnQuYm9vdHN0cmFwfHxXbixkZWNsYXJhdGlvbnM6dC5kZWNsYXJhdGlvbnN8fFduLGltcG9ydHM6dC5pbXBvcnRzfHxXbixleHBvcnRzOnQuZXhwb3J0c3x8V24sdHJhbnNpdGl2ZUNvbXBpbGVTY29wZXM6bnVsbCxzY2hlbWFzOnQuc2NoZW1hc3x8bnVsbCxpZDp0LmlkfHxudWxsfTtyZXR1cm4gbnVsbCE9dC5pZCYmKGlvW3QuaWRdPXQudHlwZSksZX0pKX1mdW5jdGlvbiBybyh0LGUpe3JldHVybiBObigoKCk9Pntjb25zdCBuPWZvKHQsITApO24uZGVjbGFyYXRpb25zPWUuZGVjbGFyYXRpb25zfHxXbixuLmltcG9ydHM9ZS5pbXBvcnRzfHxXbixuLmV4cG9ydHM9ZS5leHBvcnRzfHxXbn0pKX1mdW5jdGlvbiBzbyh0LGUpe2lmKG51bGw9PXQpcmV0dXJuIEduO2NvbnN0IG49e307Zm9yKGNvbnN0IG8gaW4gdClpZih0Lmhhc093blByb3BlcnR5KG8pKXtsZXQgaT10W29dLGE9aTtBcnJheS5pc0FycmF5KGkpJiYoYT1pWzFdLGk9aVswXSksbltpXT1vLGUmJihlW2ldPWEpfXJldHVybiBufWNvbnN0IGxvPXRvO2Z1bmN0aW9uIGNvKHQpe3JldHVybnt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSxmYWN0b3J5Om51bGwscHVyZTohMSE9PXQucHVyZSxvbkRlc3Ryb3k6dC50eXBlLnByb3RvdHlwZS5uZ09uRGVzdHJveXx8bnVsbH19ZnVuY3Rpb24gcG8odCl7cmV0dXJuIHRbWW5dfHxudWxsfWZ1bmN0aW9uIG1vKHQpe3JldHVybiB0W3FuXXx8bnVsbH1mdW5jdGlvbiB1byh0KXtyZXR1cm4gdFtabl18fG51bGx9ZnVuY3Rpb24gZm8odCxlKXtjb25zdCBuPXRbWG5dfHxudWxsO2lmKCFuJiYhMD09PWUpdGhyb3cgbmV3IEVycm9yKGBUeXBlICR7R2UodCl9IGRvZXMgbm90IGhhdmUgJ8m1bW9kJyBwcm9wZXJ0eS5gKTtyZXR1cm4gbn0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IGdvPTIwLGhvPVsiUm9vdCIsIkNvbXBvbmVudCIsIkVtYmVkZGVkIl0sYm89MTA7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiB5byh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmIm9iamVjdCI9PXR5cGVvZiB0WzFdfWZ1bmN0aW9uIF9vKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpJiYhMD09PXRbMV19ZnVuY3Rpb24gQ28odCl7cmV0dXJuIDAhPSg4JnQuZmxhZ3MpfWZ1bmN0aW9uIE1vKHQpe3JldHVybiAyPT0oMiZ0LmZsYWdzKX1mdW5jdGlvbiB2byh0KXtyZXR1cm4gMT09KDEmdC5mbGFncyl9ZnVuY3Rpb24geG8odCl7cmV0dXJuIG51bGwhPT10LnRlbXBsYXRlfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KZnVuY3Rpb24gT28odCxlKXtQbyh0LGVbMV0pfWZ1bmN0aW9uIFBvKHQsZSl7d28odCksdC5oYXNPd25Qcm9wZXJ0eSgidFZpZXdfIikmJmxuKHQudFZpZXdfLGUsIlRoaXMgVE5vZGUgZG9lcyBub3QgYmVsb25nIHRvIHRoaXMgVFZpZXcuIil9ZnVuY3Rpb24gd28odCl7aG4odCwiVE5vZGUgbXVzdCBiZSBkZWZpbmVkIiksdCYmIm9iamVjdCI9PXR5cGVvZiB0JiZ0Lmhhc093blByb3BlcnR5KCJkaXJlY3RpdmVTdHlsaW5nTGFzdCIpfHxibigiTm90IG9mIHR5cGUgVE5vZGUsIGdvdDogIit0KX1mdW5jdGlvbiBrbyh0KXtobih0LCJFeHBlY3RlZCBUSWN1IHRvIGJlIGRlZmluZWQiKSwibnVtYmVyIiE9dHlwZW9mIHQuY3VycmVudENhc2VMVmlld0luZGV4JiZibigiT2JqZWN0IGlzIG5vdCBvZiBUSWN1IHR5cGUuIil9ZnVuY3Rpb24gU28odCl7aG4odCwiY3VycmVudFROb2RlIHNob3VsZCBleGlzdCEiKSxobih0LnBhcmVudCwiY3VycmVudFROb2RlIHNob3VsZCBoYXZlIGEgcGFyZW50Iil9ZnVuY3Rpb24gRG8odCl7aG4odCwiTENvbnRhaW5lciBtdXN0IGJlIGRlZmluZWQiKSxsbihfbyh0KSwhMCwiRXhwZWN0aW5nIExDb250YWluZXIiKX1mdW5jdGlvbiBFbyh0KXt0JiZsbih5byh0KSwhMCwiRXhwZWN0aW5nIExWaWV3IG9yIHVuZGVmaW5lZCBvciBudWxsIil9ZnVuY3Rpb24gUm8odCl7aG4odCwiTFZpZXcgbXVzdCBiZSBkZWZpbmVkIiksbG4oeW8odCksITAsIkV4cGVjdGluZyBMVmlldyIpfWZ1bmN0aW9uIEFvKHQsZSl7bG4odC5maXJzdENyZWF0ZVBhc3MsITAsZXx8IlNob3VsZCBvbmx5IGJlIGNhbGxlZCBpbiBmaXJzdCBjcmVhdGUgcGFzcy4iKX1mdW5jdGlvbiBUbyh0LGUpe2xuKHQuZmlyc3RVcGRhdGVQYXNzLCEwLGV8fCJTaG91bGQgb25seSBiZSBjYWxsZWQgaW4gZmlyc3QgdXBkYXRlIHBhc3MuIil9ZnVuY3Rpb24gTm8odCxlKXt6byh0WzFdLmV4cGFuZG9TdGFydEluZGV4LHQubGVuZ3RoLGUpfWZ1bmN0aW9uIHpvKHQsZSxuKXt0PD1uJiZuPGV8fGJuKGBJbmRleCBvdXQgb2YgcmFuZ2UgKGV4cGVjdGluZyAke3R9IDw9ICR7bn0gPCAke2V9KWApfWZ1bmN0aW9uIElvKHQsZSl7aG4odCxlfHwiQ29tcG9uZW50IHZpZXdzIHNob3VsZCBhbHdheXMgaGF2ZSBhIHBhcmVudCB2aWV3IChjb21wb25lbnQncyBob3N0IHZpZXcpIil9ZnVuY3Rpb24gSG8odCxlKXtObyh0LGUpLE5vKHQsZSs4KSxhbih0W2UrMF0sImluamVjdG9ySW5kZXggc2hvdWxkIHBvaW50IHRvIGEgYmxvb20gZmlsdGVyIiksYW4odFtlKzFdLCJpbmplY3RvckluZGV4IHNob3VsZCBwb2ludCB0byBhIGJsb29tIGZpbHRlciIpLGFuKHRbZSsyXSwiaW5qZWN0b3JJbmRleCBzaG91bGQgcG9pbnQgdG8gYSBibG9vbSBmaWx0ZXIiKSxhbih0W2UrM10sImluamVjdG9ySW5kZXggc2hvdWxkIHBvaW50IHRvIGEgYmxvb20gZmlsdGVyIiksYW4odFtlKzRdLCJpbmplY3RvckluZGV4IHNob3VsZCBwb2ludCB0byBhIGJsb29tIGZpbHRlciIpLGFuKHRbZSs1XSwiaW5qZWN0b3JJbmRleCBzaG91bGQgcG9pbnQgdG8gYSBibG9vbSBmaWx0ZXIiKSxhbih0W2UrNl0sImluamVjdG9ySW5kZXggc2hvdWxkIHBvaW50IHRvIGEgYmxvb20gZmlsdGVyIiksYW4odFtlKzddLCJpbmplY3RvckluZGV4IHNob3VsZCBwb2ludCB0byBhIGJsb29tIGZpbHRlciIpLGFuKHRbZSs4XSwiaW5qZWN0b3JJbmRleCBzaG91bGQgcG9pbnQgdG8gcGFyZW50IGluamVjdG9yIil9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIEZvKHQsZSl7Y29uc3Qgbj10Lmhhc093blByb3BlcnR5KEpuKTtpZighbiYmITA9PT1lJiZuZ0Rldk1vZGUpdGhyb3cgbmV3IEVycm9yKGBUeXBlICR7R2UodCl9IGRvZXMgbm90IGhhdmUgJ8m1ZmFjJyBwcm9wZXJ0eS5gKTtyZXR1cm4gbj90W0puXTpudWxsfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBMb3tjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5wcmV2aW91c1ZhbHVlPXQsdGhpcy5jdXJyZW50VmFsdWU9ZSx0aGlzLmZpcnN0Q2hhbmdlPW59aXNGaXJzdENoYW5nZSgpe3JldHVybiB0aGlzLmZpcnN0Q2hhbmdlfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gQm8oKXtyZXR1cm4gVm99ZnVuY3Rpb24gVm8odCl7cmV0dXJuIHQudHlwZS5wcm90b3R5cGUubmdPbkNoYW5nZXMmJih0LnNldElucHV0PVVvKSxqb31mdW5jdGlvbiBqbygpe2NvbnN0IHQ9R28odGhpcyksZT1udWxsPT10P3ZvaWQgMDp0LmN1cnJlbnQ7aWYoZSl7Y29uc3Qgbj10LnByZXZpb3VzO2lmKG49PT1Hbil0LnByZXZpb3VzPWU7ZWxzZSBmb3IobGV0IHQgaW4gZSluW3RdPWVbdF07dC5jdXJyZW50PW51bGwsdGhpcy5uZ09uQ2hhbmdlcyhlKX19ZnVuY3Rpb24gVW8odCxlLG4sbyl7Y29uc3QgaT1Hbyh0KXx8KGZ1bmN0aW9uIGEodCxlKXtyZXR1cm4gdC5fX25nU2ltcGxlQ2hhbmdlc19fPWV9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLykodCx7cHJldmlvdXM6R24sY3VycmVudDpudWxsfSkscj1pLmN1cnJlbnR8fChpLmN1cnJlbnQ9e30pLHM9aS5wcmV2aW91cyxsPXRoaXMuZGVjbGFyZWRJbnB1dHNbbl0sYz1zW2xdO3JbbF09bmV3IExvKGMmJmMuY3VycmVudFZhbHVlLGUscz09PUduKSx0W29dPWV9ZnVuY3Rpb24gR28odCl7cmV0dXJuIHQuX19uZ1NpbXBsZUNoYW5nZXNfX3x8bnVsbH1Cby5uZ0luaGVyaXQ9ITA7bGV0IFdvPW51bGw7Y29uc3QgWW89dD0+e1dvPXR9LHFvPWZ1bmN0aW9uKHQsZSxuKXtudWxsIT1XbyYmV28odCxlLG4pfSxabz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLFhvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGhNTC8iOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KbGV0IEtvO2Z1bmN0aW9uIEpvKCl7cmV0dXJuIHZvaWQgMCE9PUtvP0tvOiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQ/ZG9jdW1lbnQ6dm9pZCAwfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi92YXIgUW87ZnVuY3Rpb24gJG8odCl7cmV0dXJuISF0Lmxpc3Rlbn0hKGZ1bmN0aW9uKHQpe3RbdC5JbXBvcnRhbnQ9MV09IkltcG9ydGFudCIsdFt0LkRhc2hDYXNlPTJdPSJEYXNoQ2FzZSJ9KShRb3x8KFFvPXt9KSk7Y29uc3QgdGk9e2NyZWF0ZVJlbmRlcmVyOih0LGUpPT5KbygpfTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmZ1bmN0aW9uIGVpKHQpe2Zvcig7QXJyYXkuaXNBcnJheSh0KTspdD10WzBdO3JldHVybiB0fWZ1bmN0aW9uIG5pKHQsZSl7cmV0dXJuIG5nRGV2TW9kZSYmX24oZSx0KSxuZ0Rldk1vZGUmJmduKHQsZ28sIkV4cGVjdGVkIHRvIGJlIHBhc3QgSEVBREVSX09GRlNFVCIpLGVpKGVbdF0pfWZ1bmN0aW9uIG9pKHQsZSl7bmdEZXZNb2RlJiZPbyh0LGUpLG5nRGV2TW9kZSYmX24oZSx0LmluZGV4KTtjb25zdCBuPWVpKGVbdC5pbmRleF0pO3JldHVybiBuZ0Rldk1vZGUmJiEkbyhlWzExXSkmJnluKG4pLG59ZnVuY3Rpb24gaWkodCxlKXtuZ0Rldk1vZGUmJmZuKGUsLTEsIndyb25nIGluZGV4IGZvciBUTm9kZSIpLG5nRGV2TW9kZSYmbW4oZSx0LmRhdGEubGVuZ3RoLCJ3cm9uZyBpbmRleCBmb3IgVE5vZGUiKTtjb25zdCBuPXQuZGF0YVtlXTtyZXR1cm4gbmdEZXZNb2RlJiZudWxsIT09biYmd28obiksbn1mdW5jdGlvbiBhaSh0LGUpe3JldHVybiBuZ0Rldk1vZGUmJl9uKHQsZSksdFtlXX1mdW5jdGlvbiByaSh0LGUpe25nRGV2TW9kZSYmX24oZSx0KTtjb25zdCBuPWVbdF07cmV0dXJuIHlvKG4pP246blswXX1mdW5jdGlvbiBzaSh0KXtyZXR1cm4gND09KDQmdFsyXSl9ZnVuY3Rpb24gbGkodCl7cmV0dXJuIDEyOD09KDEyOCZ0WzJdKX1mdW5jdGlvbiBjaSh0LGUpe3JldHVybiBudWxsPT1lP251bGw6KG5nRGV2TW9kZSYmX24odCxlKSx0W2VdKX1mdW5jdGlvbiBkaSh0KXt0WzE4XT0wfWZ1bmN0aW9uIHBpKHQsZSl7dFs1XSs9ZTtsZXQgbj10LG89dFszXTtmb3IoO251bGwhPT1vJiYoMT09PWUmJjE9PT1uWzVdfHwtMT09PWUmJjA9PT1uWzVdKTspb1s1XSs9ZSxuPW8sbz1vWzNdfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCBtaT17bEZyYW1lOkJpKG51bGwpLGJpbmRpbmdzRW5hYmxlZDohMCxpc0luQ2hlY2tOb0NoYW5nZXNNb2RlOiExfTtmdW5jdGlvbiB1aSgpe3JldHVybiBtaS5iaW5kaW5nc0VuYWJsZWR9ZnVuY3Rpb24gZmkoKXtyZXR1cm4gbWkubEZyYW1lLmxWaWV3fWZ1bmN0aW9uIGdpKCl7cmV0dXJuIG1pLmxGcmFtZS50Vmlld31mdW5jdGlvbiBoaSh0KXtyZXR1cm4gbWkubEZyYW1lLmNvbnRleHRMVmlldz10LHRbOF19ZnVuY3Rpb24gYmkoKXtsZXQgdD15aSgpO2Zvcig7bnVsbCE9PXQmJjY0PT09dC50eXBlOyl0PXQucGFyZW50O3JldHVybiB0fWZ1bmN0aW9uIHlpKCl7cmV0dXJuIG1pLmxGcmFtZS5jdXJyZW50VE5vZGV9ZnVuY3Rpb24gX2koKXtjb25zdCB0PW1pLmxGcmFtZSxlPXQuY3VycmVudFROb2RlO3JldHVybiB0LmlzUGFyZW50P2U6ZS5wYXJlbnR9ZnVuY3Rpb24gQ2kodCxlKXtuZ0Rldk1vZGUmJnQmJlBvKHQsbWkubEZyYW1lLnRWaWV3KTtjb25zdCBuPW1pLmxGcmFtZTtuLmN1cnJlbnRUTm9kZT10LG4uaXNQYXJlbnQ9ZX1mdW5jdGlvbiBNaSgpe3JldHVybiBtaS5sRnJhbWUuaXNQYXJlbnR9ZnVuY3Rpb24gdmkoKXttaS5sRnJhbWUuaXNQYXJlbnQ9ITF9ZnVuY3Rpb24geGkoKXtyZXR1cm4gbWkuaXNJbkNoZWNrTm9DaGFuZ2VzTW9kZX1mdW5jdGlvbiBPaSh0KXttaS5pc0luQ2hlY2tOb0NoYW5nZXNNb2RlPXR9ZnVuY3Rpb24gUGkoKXtjb25zdCB0PW1pLmxGcmFtZTtsZXQgZT10LmJpbmRpbmdSb290SW5kZXg7cmV0dXJuLTE9PT1lJiYoZT10LmJpbmRpbmdSb290SW5kZXg9dC50Vmlldy5iaW5kaW5nU3RhcnRJbmRleCksZX1mdW5jdGlvbiB3aSgpe3JldHVybiBtaS5sRnJhbWUuYmluZGluZ0luZGV4fWZ1bmN0aW9uIGtpKHQpe3JldHVybiBtaS5sRnJhbWUuYmluZGluZ0luZGV4PXR9ZnVuY3Rpb24gU2koKXtyZXR1cm4gbWkubEZyYW1lLmJpbmRpbmdJbmRleCsrfWZ1bmN0aW9uIERpKHQpe2NvbnN0IGU9bWkubEZyYW1lLG49ZS5iaW5kaW5nSW5kZXg7cmV0dXJuIGUuYmluZGluZ0luZGV4PWUuYmluZGluZ0luZGV4K3Qsbn1mdW5jdGlvbiBFaSh0KXttaS5sRnJhbWUuaW5JMThuPXR9ZnVuY3Rpb24gUmkodCxlKXtjb25zdCBuPW1pLmxGcmFtZTtuLmJpbmRpbmdJbmRleD1uLmJpbmRpbmdSb290SW5kZXg9dCxBaShlKX1mdW5jdGlvbiBBaSh0KXttaS5sRnJhbWUuY3VycmVudERpcmVjdGl2ZUluZGV4PXR9ZnVuY3Rpb24gVGkodCl7Y29uc3QgZT1taS5sRnJhbWUuY3VycmVudERpcmVjdGl2ZUluZGV4O3JldHVybi0xPT09ZT9udWxsOnRbZV19ZnVuY3Rpb24gTmkoKXtyZXR1cm4gbWkubEZyYW1lLmN1cnJlbnRRdWVyeUluZGV4fWZ1bmN0aW9uIHppKHQpe21pLmxGcmFtZS5jdXJyZW50UXVlcnlJbmRleD10fWZ1bmN0aW9uIElpKHQpe2NvbnN0IGU9dFsxXTtyZXR1cm4gMj09PWUudHlwZT8obmdEZXZNb2RlJiZobihlLmRlY2xUTm9kZSwiRW1iZWRkZWQgVE5vZGVzIHNob3VsZCBoYXZlIGRlY2xhcmF0aW9uIHBhcmVudHMuIiksZS5kZWNsVE5vZGUpOjE9PT1lLnR5cGU/dFs2XTpudWxsfWZ1bmN0aW9uIEhpKHQsZSxuKXtpZihuZ0Rldk1vZGUmJkVvKHQpLG4mRW4uU2tpcFNlbGYpe25nRGV2TW9kZSYmUG8oZSx0WzFdKTtsZXQgbz1lLGk9dDtmb3IoO25nRGV2TW9kZSYmaG4obywiUGFyZW50IFROb2RlIHNob3VsZCBiZSBkZWZpbmVkIiksbz1vLnBhcmVudCwhKG51bGwhPT1vfHxuJkVuLkhvc3R8fChvPUlpKGkpLG51bGw9PT1vKXx8KG5nRGV2TW9kZSYmaG4oaSwiUGFyZW50IExWaWV3IHNob3VsZCBiZSBkZWZpbmVkIiksaT1pWzE1XSwxMCZvLnR5cGUpKTspO2lmKG51bGw9PT1vKXJldHVybiExO2U9byx0PWl9bmdEZXZNb2RlJiZPbyhlLHQpO2NvbnN0IG89bWkubEZyYW1lPUxpKCk7cmV0dXJuIG8uY3VycmVudFROb2RlPWUsby5sVmlldz10LCEwfWZ1bmN0aW9uIEZpKHQpe25nRGV2TW9kZSYmY24odFswXSx0WzFdLCI/Pz8/IiksbmdEZXZNb2RlJiZFbyh0KTtjb25zdCBlPUxpKCk7bmdEZXZNb2RlJiYobG4oZS5pc1BhcmVudCwhMCwiRXhwZWN0ZWQgY2xlYW4gTEZyYW1lIiksbG4oZS5sVmlldyxudWxsLCJFeHBlY3RlZCBjbGVhbiBMRnJhbWUiKSxsbihlLnRWaWV3LG51bGwsIkV4cGVjdGVkIGNsZWFuIExGcmFtZSIpLGxuKGUuc2VsZWN0ZWRJbmRleCwtMSwiRXhwZWN0ZWQgY2xlYW4gTEZyYW1lIiksbG4oZS5lbGVtZW50RGVwdGhDb3VudCwwLCJFeHBlY3RlZCBjbGVhbiBMRnJhbWUiKSxsbihlLmN1cnJlbnREaXJlY3RpdmVJbmRleCwtMSwiRXhwZWN0ZWQgY2xlYW4gTEZyYW1lIiksbG4oZS5jdXJyZW50TmFtZXNwYWNlLG51bGwsIkV4cGVjdGVkIGNsZWFuIExGcmFtZSIpLGxuKGUuYmluZGluZ1Jvb3RJbmRleCwtMSwiRXhwZWN0ZWQgY2xlYW4gTEZyYW1lIiksbG4oZS5jdXJyZW50UXVlcnlJbmRleCwwLCJFeHBlY3RlZCBjbGVhbiBMRnJhbWUiKSk7Y29uc3Qgbj10WzFdO21pLmxGcmFtZT1lLG5nRGV2TW9kZSYmbi5maXJzdENoaWxkJiZQbyhuLmZpcnN0Q2hpbGQsbiksZS5jdXJyZW50VE5vZGU9bi5maXJzdENoaWxkLGUubFZpZXc9dCxlLnRWaWV3PW4sZS5jb250ZXh0TFZpZXc9dCxlLmJpbmRpbmdJbmRleD1uLmJpbmRpbmdTdGFydEluZGV4LGUuaW5JMThuPSExfWZ1bmN0aW9uIExpKCl7Y29uc3QgdD1taS5sRnJhbWUsZT1udWxsPT09dD9udWxsOnQuY2hpbGQ7cmV0dXJuIG51bGw9PT1lP0JpKHQpOmV9ZnVuY3Rpb24gQmkodCl7Y29uc3QgZT17Y3VycmVudFROb2RlOm51bGwsaXNQYXJlbnQ6ITAsbFZpZXc6bnVsbCx0VmlldzpudWxsLHNlbGVjdGVkSW5kZXg6LTEsY29udGV4dExWaWV3Om51bGwsZWxlbWVudERlcHRoQ291bnQ6MCxjdXJyZW50TmFtZXNwYWNlOm51bGwsY3VycmVudERpcmVjdGl2ZUluZGV4Oi0xLGJpbmRpbmdSb290SW5kZXg6LTEsYmluZGluZ0luZGV4Oi0xLGN1cnJlbnRRdWVyeUluZGV4OjAscGFyZW50OnQsY2hpbGQ6bnVsbCxpbkkxOG46ITF9O3JldHVybiBudWxsIT09dCYmKHQuY2hpbGQ9ZSksZX1mdW5jdGlvbiBWaSgpe2NvbnN0IHQ9bWkubEZyYW1lO3JldHVybiBtaS5sRnJhbWU9dC5wYXJlbnQsdC5jdXJyZW50VE5vZGU9bnVsbCx0LmxWaWV3PW51bGwsdH1jb25zdCBqaT1WaTtmdW5jdGlvbiBVaSgpe2NvbnN0IHQ9VmkoKTt0LmlzUGFyZW50PSEwLHQudFZpZXc9bnVsbCx0LnNlbGVjdGVkSW5kZXg9LTEsdC5jb250ZXh0TFZpZXc9bnVsbCx0LmVsZW1lbnREZXB0aENvdW50PTAsdC5jdXJyZW50RGlyZWN0aXZlSW5kZXg9LTEsdC5jdXJyZW50TmFtZXNwYWNlPW51bGwsdC5iaW5kaW5nUm9vdEluZGV4PS0xLHQuYmluZGluZ0luZGV4PS0xLHQuY3VycmVudFF1ZXJ5SW5kZXg9MH1mdW5jdGlvbiBHaSgpe3JldHVybiBtaS5sRnJhbWUuc2VsZWN0ZWRJbmRleH1mdW5jdGlvbiBXaSh0KXtuZ0Rldk1vZGUmJi0xIT09dCYmZ24odCxnbywiSW5kZXggbXVzdCBiZSBwYXN0IEhFQURFUl9PRkZTRVQgKG9yIC0xKS4iKSxuZ0Rldk1vZGUmJm1uKHQsbWkubEZyYW1lLmxWaWV3Lmxlbmd0aCwiQ2FuJ3Qgc2V0IGluZGV4IHBhc3NlZCBlbmQgb2YgTFZpZXciKSxtaS5sRnJhbWUuc2VsZWN0ZWRJbmRleD10fWZ1bmN0aW9uIFlpKCl7Y29uc3QgdD1taS5sRnJhbWU7cmV0dXJuIGlpKHQudFZpZXcsdC5zZWxlY3RlZEluZGV4KX1mdW5jdGlvbiBxaSgpe21pLmxGcmFtZS5jdXJyZW50TmFtZXNwYWNlPVpvfWZ1bmN0aW9uIFppKCl7IShmdW5jdGlvbiB0KCl7bWkubEZyYW1lLmN1cnJlbnROYW1lc3BhY2U9bnVsbH0pKCl9ZnVuY3Rpb24gWGkodCxlKXtuZ0Rldk1vZGUmJkFvKHQpO2ZvcihsZXQgbj1lLmRpcmVjdGl2ZVN0YXJ0LG89ZS5kaXJlY3RpdmVFbmQ7bjxvO24rKyl7Y29uc3QgZT10LmRhdGFbbl07bmdEZXZNb2RlJiZobihlLCJFeHBlY3RpbmcgRGlyZWN0aXZlRGVmIik7Y29uc3Qgbz1lLnR5cGUucHJvdG90eXBlLHtuZ0FmdGVyQ29udGVudEluaXQ6aSxuZ0FmdGVyQ29udGVudENoZWNrZWQ6YSxuZ0FmdGVyVmlld0luaXQ6cixuZ0FmdGVyVmlld0NoZWNrZWQ6cyxuZ09uRGVzdHJveTpsfT1vO2kmJih0LmNvbnRlbnRIb29rc3x8KHQuY29udGVudEhvb2tzPVtdKSkucHVzaCgtbixpKSxhJiYoKHQuY29udGVudEhvb2tzfHwodC5jb250ZW50SG9va3M9W10pKS5wdXNoKG4sYSksKHQuY29udGVudENoZWNrSG9va3N8fCh0LmNvbnRlbnRDaGVja0hvb2tzPVtdKSkucHVzaChuLGEpKSxyJiYodC52aWV3SG9va3N8fCh0LnZpZXdIb29rcz1bXSkpLnB1c2goLW4scikscyYmKCh0LnZpZXdIb29rc3x8KHQudmlld0hvb2tzPVtdKSkucHVzaChuLHMpLCh0LnZpZXdDaGVja0hvb2tzfHwodC52aWV3Q2hlY2tIb29rcz1bXSkpLnB1c2gobixzKSksbnVsbCE9bCYmKHQuZGVzdHJveUhvb2tzfHwodC5kZXN0cm95SG9va3M9W10pKS5wdXNoKG4sbCl9fWZ1bmN0aW9uIEtpKHQsZSxuKXskaSh0LGUsMyxuKX1mdW5jdGlvbiBKaSh0LGUsbixvKXtuZ0Rldk1vZGUmJmNuKG4sMywiSW5pdCBwcmUtb3JkZXIgaG9va3Mgc2hvdWxkIG5vdCBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UiKSwoMyZ0WzJdKT09PW4mJiRpKHQsZSxuLG8pfWZ1bmN0aW9uIFFpKHQsZSl7bmdEZXZNb2RlJiZjbihlLDMsIkluaXQgaG9va3MgcGhhc2Ugc2hvdWxkIG5vdCBiZSBpbmNyZW1lbnRlZCBhZnRlciBhbGwgaW5pdCBob29rcyBoYXZlIGJlZW4gcnVuLiIpO2xldCBuPXRbMl07KDMmbik9PT1lJiYobiY9MjA0NyxuKz0xLHRbMl09bil9ZnVuY3Rpb24gJGkodCxlLG4sbyl7bmdEZXZNb2RlJiZsbih4aSgpLCExLCJIb29rcyBzaG91bGQgbmV2ZXIgYmUgcnVuIHdoZW4gaW4gY2hlY2sgbm8gY2hhbmdlcyBtb2RlLiIpO2NvbnN0IGk9bnVsbCE9bz9vOi0xLGE9ZS5sZW5ndGgtMTtsZXQgcj0wO2ZvcihsZXQgcz12b2lkIDAhPT1vPzY1NTM1JnRbMThdOjA7czxhO3MrKylpZigibnVtYmVyIj09dHlwZW9mIGVbcysxXSl7aWYocj1lW3NdLG51bGwhPW8mJnI+PW8pYnJlYWt9ZWxzZSBlW3NdPDAmJih0WzE4XSs9NjU1MzYpLChyPGl8fC0xPT1pKSYmKHRhKHQsbixlLHMpLHRbMThdPSg0Mjk0OTAxNzYwJnRbMThdKStzKzIpLHMrK31mdW5jdGlvbiB0YSh0LGUsbixvKXtjb25zdCBpPW5bb108MCxhPW5bbysxXSxyPXRbaT8tbltvXTpuW29dXTtpZihpKXtpZih0WzJdPj4xMTx0WzE4XT4+MTYmJigzJnRbMl0pPT09ZSl7dFsyXSs9MjA0OCxxbyg0LHIsYSk7dHJ5e2EuY2FsbChyKX1maW5hbGx5e3FvKDUscixhKX19fWVsc2V7cW8oNCxyLGEpO3RyeXthLmNhbGwocil9ZmluYWxseXtxbyg1LHIsYSl9fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3QgZWE9LTE7Y2xhc3MgbmF7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuZmFjdG9yeT10LHRoaXMucmVzb2x2aW5nPSExLG5nRGV2TW9kZSYmaG4odCwiRmFjdG9yeSBub3Qgc3BlY2lmaWVkIiksbmdEZXZNb2RlJiZsbih0eXBlb2YgdCwiZnVuY3Rpb24iLCJFeHBlY3RlZCBmYWN0b3J5IGZ1bmN0aW9uLiIpLHRoaXMuY2FuU2VlVmlld1Byb3ZpZGVycz1lLHRoaXMuaW5qZWN0SW1wbD1ufX1mdW5jdGlvbiBvYSh0KXtsZXQgZT0iIjtyZXR1cm4gMSZ0JiYoZSs9InxUZXh0IiksMiZ0JiYoZSs9InxFbGVtZW50IiksNCZ0JiYoZSs9InxDb250YWluZXIiKSw4JnQmJihlKz0ifEVsZW1lbnRDb250YWluZXIiKSwxNiZ0JiYoZSs9InxQcm9qZWN0aW9uIiksMzImdCYmKGUrPSJ8SWN1Q29udGFpbmVyIiksNjQmdCYmKGUrPSJ8UGxhY2Vob2xkZXIiKSxlLmxlbmd0aD4wP2Uuc3Vic3RyaW5nKDEpOmV9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBpYSh0LGUsbil7aG4odCwic2hvdWxkIGJlIGNhbGxlZCB3aXRoIGEgVE5vZGUiKSwwPT0odC50eXBlJmUpJiZibihufHxgRXhwZWN0ZWQgWyR7b2EoZSl9XSBidXQgZ290ICR7b2EodC50eXBlKX0uYCl9ZnVuY3Rpb24gYWEodCxlLG4pe2NvbnN0IG89JG8odCk7bGV0IGk9MDtmb3IoO2k8bi5sZW5ndGg7KXtjb25zdCBhPW5baV07aWYoIm51bWJlciI9PXR5cGVvZiBhKXtpZigwIT09YSlicmVhaztpKys7Y29uc3Qgcj1uW2krK10scz1uW2krK10sbD1uW2krK107bmdEZXZNb2RlJiZuZ0Rldk1vZGUucmVuZGVyZXJTZXRBdHRyaWJ1dGUrKyxvP3Quc2V0QXR0cmlidXRlKGUscyxsLHIpOmUuc2V0QXR0cmlidXRlTlMocixzLGwpfWVsc2V7Y29uc3Qgcj1hLHM9blsrK2ldO25nRGV2TW9kZSYmbmdEZXZNb2RlLnJlbmRlcmVyU2V0QXR0cmlidXRlKyssc2Eocik/byYmdC5zZXRQcm9wZXJ0eShlLHIscyk6bz90LnNldEF0dHJpYnV0ZShlLHIscyk6ZS5zZXRBdHRyaWJ1dGUocixzKSxpKyt9fXJldHVybiBpfWZ1bmN0aW9uIHJhKHQpe3JldHVybiAzPT09dHx8ND09PXR8fDY9PT10fWZ1bmN0aW9uIHNhKHQpe3JldHVybiA2ND09PXQuY2hhckNvZGVBdCgwKX1mdW5jdGlvbiBsYSh0LGUpe2lmKG51bGw9PT1lfHwwPT09ZS5sZW5ndGgpO2Vsc2UgaWYobnVsbD09PXR8fDA9PT10Lmxlbmd0aCl0PWUuc2xpY2UoKTtlbHNle2xldCBuPS0xO2ZvcihsZXQgbz0wO288ZS5sZW5ndGg7bysrKXtjb25zdCBpPWVbb107Im51bWJlciI9PXR5cGVvZiBpP249aTowPT09bnx8Y2EodCxuLGksbnVsbCwtMT09PW58fDI9PT1uP2VbKytvXTpudWxsKX19cmV0dXJuIHR9ZnVuY3Rpb24gY2EodCxlLG4sbyxpKXtsZXQgYT0wLHI9dC5sZW5ndGg7aWYoLTE9PT1lKXI9LTE7ZWxzZSBmb3IoO2E8dC5sZW5ndGg7KXtjb25zdCBuPXRbYSsrXTtpZigibnVtYmVyIj09dHlwZW9mIG4pe2lmKG49PT1lKXtyPS0xO2JyZWFrfWlmKG4+ZSl7cj1hLTE7YnJlYWt9fX1mb3IoO2E8dC5sZW5ndGg7KXtjb25zdCBlPXRbYV07aWYoIm51bWJlciI9PXR5cGVvZiBlKWJyZWFrO2lmKGU9PT1uKXtpZihudWxsPT09bylyZXR1cm4gdm9pZChudWxsIT09aSYmKHRbYSsxXT1pKSk7aWYobz09PXRbYSsxXSlyZXR1cm4gdm9pZCh0W2ErMl09aSl9YSsrLG51bGwhPT1vJiZhKyssbnVsbCE9PWkmJmErK30tMSE9PXImJih0LnNwbGljZShyLDAsZSksYT1yKzEpLHQuc3BsaWNlKGErKywwLG4pLG51bGwhPT1vJiZ0LnNwbGljZShhKyssMCxvKSxudWxsIT09aSYmdC5zcGxpY2UoYSsrLDAsaSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIGRhKHQpe3JldHVybiB0IT09ZWF9ZnVuY3Rpb24gcGEodCl7cmV0dXJuIG5nRGV2TW9kZSYmYW4odCwiTnVtYmVyIGV4cGVjdGVkIiksbmdEZXZNb2RlJiZjbih0LC0xLCJOb3QgYSB2YWxpZCBzdGF0ZS4iKSxuZ0Rldk1vZGUmJmZuKDMyNzY3JnQsZ28sIlBhcmVudCBpbmplY3RvciBtdXN0IGJlIHBvaW50aW5nIHBhc3QgSEVBREVSX09GRlNFVC4iKSwzMjc2NyZ0fWZ1bmN0aW9uIG1hKHQsZSl7bGV0IG49KGZ1bmN0aW9uIG8odCl7cmV0dXJuIHQ+PjE2fSkodCksaT1lO2Zvcig7bj4wOylpPWlbMTVdLG4tLTtyZXR1cm4gaX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovbGV0IHVhPSEwO2Z1bmN0aW9uIGZhKHQpe2NvbnN0IGU9dWE7cmV0dXJuIHVhPXQsZX1sZXQgZ2E9MDtmdW5jdGlvbiBoYSh0LGUpe2NvbnN0IG49eWEodCxlKTtpZigtMSE9PW4pcmV0dXJuIG47Y29uc3Qgbz1lWzFdO28uZmlyc3RDcmVhdGVQYXNzJiYodC5pbmplY3RvckluZGV4PWUubGVuZ3RoLGJhKG8uZGF0YSx0KSxiYShlLG51bGwpLGJhKG8uYmx1ZXByaW50LG51bGwpKTtjb25zdCBpPV9hKHQsZSksYT10LmluamVjdG9ySW5kZXg7aWYoZGEoaSkpe2NvbnN0IHQ9cGEoaSksbj1tYShpLGUpLG89blsxXS5kYXRhO2ZvcihsZXQgaT0wO2k8ODtpKyspZVthK2ldPW5bdCtpXXxvW3QraV19cmV0dXJuIGVbYSs4XT1pLGF9ZnVuY3Rpb24gYmEodCxlKXt0LnB1c2goMCwwLDAsMCwwLDAsMCwwLGUpfWZ1bmN0aW9uIHlhKHQsZSl7cmV0dXJuLTE9PT10LmluamVjdG9ySW5kZXh8fHQucGFyZW50JiZ0LnBhcmVudC5pbmplY3RvckluZGV4PT09dC5pbmplY3RvckluZGV4fHxudWxsPT09ZVt0LmluamVjdG9ySW5kZXgrOF0/LTE6KG5nRGV2TW9kZSYmX24oZSx0LmluamVjdG9ySW5kZXgpLHQuaW5qZWN0b3JJbmRleCl9ZnVuY3Rpb24gX2EodCxlKXtpZih0LnBhcmVudCYmLTEhPT10LnBhcmVudC5pbmplY3RvckluZGV4KXJldHVybiB0LnBhcmVudC5pbmplY3RvckluZGV4O2xldCBuPTAsbz1udWxsLGk9ZTtmb3IoO251bGwhPT1pOyl7Y29uc3QgdD1pWzFdLGU9dC50eXBlO2lmKDI9PT1lPyhuZ0Rldk1vZGUmJmhuKHQuZGVjbFROb2RlLCJFbWJlZGRlZCBUTm9kZXMgc2hvdWxkIGhhdmUgZGVjbGFyYXRpb24gcGFyZW50cy4iKSxvPXQuZGVjbFROb2RlKToxPT09ZT9vPWlbNl06KG5nRGV2TW9kZSYmbG4odC50eXBlLDAsIlJvb3QgdHlwZSBleHBlY3RlZCIpLG89bnVsbCksbnVsbD09PW8pcmV0dXJuIGVhO2lmKG5nRGV2TW9kZSYmbyYmT28obyxpWzE1XSksbisrLGk9aVsxNV0sLTEhPT1vLmluamVjdG9ySW5kZXgpcmV0dXJuIG8uaW5qZWN0b3JJbmRleHxuPDwxNn1yZXR1cm4gZWF9ZnVuY3Rpb24gQ2EodCxlLG4peyEoZnVuY3Rpb24gbyh0LGUsbil7bGV0IG87bmdEZXZNb2RlJiZsbihlLmZpcnN0Q3JlYXRlUGFzcywhMCwiZXhwZWN0ZWQgZmlyc3RDcmVhdGVQYXNzIHRvIGJlIHRydWUiKSwic3RyaW5nIj09dHlwZW9mIG4/bz1uLmNoYXJDb2RlQXQoMCl8fDA6bi5oYXNPd25Qcm9wZXJ0eShRbikmJihvPW5bUW5dKSxudWxsPT1vJiYobz1uW1FuXT1nYSsrKTtjb25zdCBpPTI1NSZvO2UuZGF0YVt0KyhpPj41KV18PTE8PGl9KSh0LGUsbil9ZnVuY3Rpb24gTWEodCxlLG4pe2lmKG4mRW4uT3B0aW9uYWwpcmV0dXJuIHQ7b24oZSwiTm9kZUluamVjdG9yIil9ZnVuY3Rpb24gdmEodCxlLG4sbyl7aWYobiZFbi5PcHRpb25hbCYmdm9pZCAwPT09byYmKG89bnVsbCksMD09KG4mKEVuLlNlbGZ8RW4uSG9zdCkpKXtjb25zdCBpPXRbOV0sYT1Bbih2b2lkIDApO3RyeXtyZXR1cm4gaT9pLmdldChlLG8sbiZFbi5PcHRpb25hbCk6VG4oZSxvLG4mRW4uT3B0aW9uYWwpfWZpbmFsbHl7QW4oYSl9fXJldHVybiBNYShvLGUsbil9ZnVuY3Rpb24geGEodCxlLG4sbz1Fbi5EZWZhdWx0LGkpe2lmKG51bGwhPT10KXtjb25zdCBhPShmdW5jdGlvbiBhKHQpe2lmKG5nRGV2TW9kZSYmaG4odCwidG9rZW4gbXVzdCBiZSBkZWZpbmVkIiksInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiB0LmNoYXJDb2RlQXQoMCl8fDA7Y29uc3QgZT10Lmhhc093blByb3BlcnR5KFFuKT90W1FuXTp2b2lkIDA7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlP2U+PTA/MjU1JmU6KG5nRGV2TW9kZSYmbG4oZSwtMSwiRXhwZWN0aW5nIHRvIGdldCBTcGVjaWFsIEluamVjdG9yIElkIiksUGEpOmV9KShuKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl7aWYoIUhpKGUsdCxvKSlyZXR1cm4gbyZFbi5Ib3N0P01hKGksbixvKTp2YShlLG4sbyxpKTt0cnl7Y29uc3QgdD1hKG8pO2lmKG51bGwhPXR8fG8mRW4uT3B0aW9uYWwpcmV0dXJuIHQ7b24obil9ZmluYWxseXtqaSgpfX1lbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgYSl7bGV0IGk9bnVsbCxyPXlhKHQsZSkscz1lYSxsPW8mRW4uSG9zdD9lWzE2XVs2XTpudWxsO2ZvcigoLTE9PT1yfHxvJkVuLlNraXBTZWxmKSYmKHM9LTE9PT1yP19hKHQsZSk6ZVtyKzhdLHMhPT1lYSYmRWEobywhMSk/KGk9ZVsxXSxyPXBhKHMpLGU9bWEocyxlKSk6cj0tMSk7LTEhPT1yOyl7bmdEZXZNb2RlJiZIbyhlLHIpO2NvbnN0IHQ9ZVsxXTtpZihuZ0Rldk1vZGUmJk9vKHQuZGF0YVtyKzhdLGUpLERhKGEscix0LmRhdGEpKXtjb25zdCB0PXdhKHIsZSxuLGksbyxsKTtpZih0IT09T2EpcmV0dXJuIHR9cz1lW3IrOF0scyE9PWVhJiZFYShvLGVbMV0uZGF0YVtyKzhdPT09bCkmJkRhKGEscixlKT8oaT10LHI9cGEocyksZT1tYShzLGUpKTpyPS0xfX19cmV0dXJuIHZhKGUsbixvLGkpfWNvbnN0IE9hPXt9O2Z1bmN0aW9uIFBhKCl7cmV0dXJuIG5ldyBSYShiaSgpLGZpKCkpfWZ1bmN0aW9uIHdhKHQsZSxuLG8saSxhKXtjb25zdCByPWVbMV0scz1yLmRhdGFbdCs4XSxsPWthKHMscixuLG51bGw9PW8/TW8ocykmJnVhOm8hPXImJjAhPSgzJnMudHlwZSksaSZFbi5Ib3N0JiZhPT09cyk7cmV0dXJuIG51bGwhPT1sP1NhKGUscixsLHMpOk9hfWZ1bmN0aW9uIGthKHQsZSxuLG8saSl7Y29uc3QgYT10LnByb3ZpZGVySW5kZXhlcyxyPWUuZGF0YSxzPTEwNDg1NzUmYSxsPXQuZGlyZWN0aXZlU3RhcnQsYz1hPj4yMCxkPWk/cytjOnQuZGlyZWN0aXZlRW5kO2ZvcihsZXQgdD1vP3M6cytjO3Q8ZDt0Kyspe2NvbnN0IGU9clt0XTtpZih0PGwmJm49PT1lfHx0Pj1sJiZlLnR5cGU9PT1uKXJldHVybiB0fWlmKGkpe2NvbnN0IHQ9cltsXTtpZih0JiZ4byh0KSYmdC50eXBlPT09bilyZXR1cm4gbH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBTYSh0LGUsbixvKXtsZXQgaT10W25dO2NvbnN0IGE9ZS5kYXRhO2lmKChmdW5jdGlvbiByKHQpe3JldHVybiB0IGluc3RhbmNlb2YgbmF9KShpKSl7Y29uc3Qgcj1pO3IucmVzb2x2aW5nJiZlbih0bihhW25dKSk7Y29uc3Qgcz1mYShyLmNhblNlZVZpZXdQcm92aWRlcnMpO3IucmVzb2x2aW5nPSEwO2NvbnN0IGw9ci5pbmplY3RJbXBsP0FuKHIuaW5qZWN0SW1wbCk6bnVsbCxjPUhpKHQsbyxFbi5EZWZhdWx0KTtuZ0Rldk1vZGUmJmxuKGMsITAsIkJlY2F1c2UgZmxhZ3MgZG8gbm90IGNvbnRhaW4gYFNraXBTZWxmJyB3ZSBleHBlY3QgdGhpcyB0byBhbHdheXMgc3VjY2VlZC4iKTt0cnl7aT10W25dPXIuZmFjdG9yeSh2b2lkIDAsYSx0LG8pLGUuZmlyc3RDcmVhdGVQYXNzJiZuPj1vLmRpcmVjdGl2ZVN0YXJ0JiYobmdEZXZNb2RlJiYoZnVuY3Rpb24gcyh0KXt2b2lkIDAhPT10LnR5cGUmJm51bGwhPXQuc2VsZWN0b3JzJiZ2b2lkIDAhPT10LmlucHV0c3x8Ym4oIkV4cGVjdGVkIGEgRGlyZWN0aXZlRGVmL0NvbXBvbmVudERlZiBhbmQgdGhpcyBvYmplY3QgZG9lcyBub3Qgc2VlbSB0byBoYXZlIHRoZSBleHBlY3RlZCBzaGFwZS4iKX0pKGFbbl0pLCgKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmZ1bmN0aW9uIGwodCxlLG4pe25nRGV2TW9kZSYmQW8obik7Y29uc3R7bmdPbkNoYW5nZXM6byxuZ09uSW5pdDppLG5nRG9DaGVjazphfT1lLnR5cGUucHJvdG90eXBlO2lmKG8pe2NvbnN0IG89Vm8oZSk7KG4ucHJlT3JkZXJIb29rc3x8KG4ucHJlT3JkZXJIb29rcz1bXSkpLnB1c2godCxvKSwobi5wcmVPcmRlckNoZWNrSG9va3N8fChuLnByZU9yZGVyQ2hlY2tIb29rcz1bXSkpLnB1c2godCxvKX1pJiYobi5wcmVPcmRlckhvb2tzfHwobi5wcmVPcmRlckhvb2tzPVtdKSkucHVzaCgwLXQsaSksYSYmKChuLnByZU9yZGVySG9va3N8fChuLnByZU9yZGVySG9va3M9W10pKS5wdXNoKHQsYSksKG4ucHJlT3JkZXJDaGVja0hvb2tzfHwobi5wcmVPcmRlckNoZWNrSG9va3M9W10pKS5wdXNoKHQsYSkpfSkobixhW25dLGUpKX1maW5hbGx5e251bGwhPT1sJiZBbihsKSxmYShzKSxyLnJlc29sdmluZz0hMSxqaSgpfX1yZXR1cm4gaX1mdW5jdGlvbiBEYSh0LGUsbil7cmV0dXJuISEobltlKyh0Pj41KV0mMTw8dCl9ZnVuY3Rpb24gRWEodCxlKXtyZXR1cm4hKHQmRW4uU2VsZnx8dCZFbi5Ib3N0JiZlKX1jbGFzcyBSYXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX3ROb2RlPXQsdGhpcy5fbFZpZXc9ZX1nZXQodCxlKXtyZXR1cm4geGEodGhpcy5fdE5vZGUsdGhpcy5fbFZpZXcsdCx2b2lkIDAsZSl9fWZ1bmN0aW9uIEFhKHQpe3JldHVybiBObigoKCk9Pntjb25zdCBlPXQucHJvdG90eXBlLmNvbnN0cnVjdG9yLG49ZVtKbl18fFRhKGUpLG89T2JqZWN0LnByb3RvdHlwZTtsZXQgaT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodC5wcm90b3R5cGUpLmNvbnN0cnVjdG9yO2Zvcig7aSYmaSE9PW87KXtjb25zdCB0PWlbSm5dfHxUYShpKTtpZih0JiZ0IT09bilyZXR1cm4gdDtpPU9iamVjdC5nZXRQcm90b3R5cGVPZihpKX1yZXR1cm4gdD0+bmV3IHR9KSl9ZnVuY3Rpb24gVGEodCl7cmV0dXJuIFhlKHQpPygpPT57Y29uc3QgZT1UYShaZSh0KSk7cmV0dXJuIGUmJmUoKX06Rm8odCl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIE5hKHQpe3JldHVybihmdW5jdGlvbiBlKHQsbil7aWYobmdEZXZNb2RlJiZpYSh0LDE1KSxuZ0Rldk1vZGUmJmhuKHQsImV4cGVjdGluZyB0Tm9kZSIpLCJjbGFzcyI9PT1uKXJldHVybiB0LmNsYXNzZXM7aWYoInN0eWxlIj09PW4pcmV0dXJuIHQuc3R5bGVzO2NvbnN0IG89dC5hdHRycztpZihvKXtjb25zdCB0PW8ubGVuZ3RoO2xldCBlPTA7Zm9yKDtlPHQ7KXtjb25zdCBpPW9bZV07aWYocmEoaSkpYnJlYWs7aWYoMD09PWkpZSs9MjtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgaSlmb3IoZSsrO2U8dCYmInN0cmluZyI9PXR5cGVvZiBvW2VdOyllKys7ZWxzZXtpZihpPT09bilyZXR1cm4gb1tlKzFdO2UrPTJ9fX1yZXR1cm4gbnVsbH0pKGJpKCksdCl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NvbnN0IHphPSJfX2Fubm90YXRpb25zX18iLElhPSJfX3BhcmFtZXRlcnNfXyIsSGE9Il9fcHJvcF9fbWV0YWRhdGFfXyI7ZnVuY3Rpb24gRmEodCxlLG4sbyxpKXtyZXR1cm4gTm4oKCgpPT57Y29uc3QgYT1MYShlKTtmdW5jdGlvbiByKC4uLnQpe2lmKHRoaXMgaW5zdGFuY2VvZiByKXJldHVybiBhLmNhbGwodGhpcywuLi50KSx0aGlzO2NvbnN0IGU9bmV3IHIoLi4udCk7cmV0dXJuIGZ1bmN0aW9uIG4oYSl7cmV0dXJuIGkmJmkoYSwuLi50KSwoYS5oYXNPd25Qcm9wZXJ0eSh6YSk/YVt6YV06T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsemEse3ZhbHVlOltdfSlbemFdKS5wdXNoKGUpLG8mJm8oYSksYX19cmV0dXJuIG4mJihyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSksci5wcm90b3R5cGUubmdNZXRhZGF0YU5hbWU9dCxyLmFubm90YXRpb25DbHM9cixyfSkpfWZ1bmN0aW9uIExhKHQpe3JldHVybiBmdW5jdGlvbiBlKC4uLm4pe2lmKHQpe2NvbnN0IGU9dCguLi5uKTtmb3IoY29uc3QgdCBpbiBlKXRoaXNbdF09ZVt0XX19fWZ1bmN0aW9uIEJhKHQsZSxuKXtyZXR1cm4gTm4oKCgpPT57Y29uc3Qgbz1MYShlKTtmdW5jdGlvbiBpKC4uLnQpe2lmKHRoaXMgaW5zdGFuY2VvZiBpKXJldHVybiBvLmFwcGx5KHRoaXMsdCksdGhpcztjb25zdCBlPW5ldyBpKC4uLnQpO3JldHVybiBuLmFubm90YXRpb249ZSxuO2Z1bmN0aW9uIG4odCxuLG8pe2NvbnN0IGk9dC5oYXNPd25Qcm9wZXJ0eShJYSk/dFtJYV06T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsSWEse3ZhbHVlOltdfSlbSWFdO2Zvcig7aS5sZW5ndGg8PW87KWkucHVzaChudWxsKTtyZXR1cm4oaVtvXT1pW29dfHxbXSkucHVzaChlKSx0fX1yZXR1cm4gbiYmKGkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKSxpLnByb3RvdHlwZS5uZ01ldGFkYXRhTmFtZT10LGkuYW5ub3RhdGlvbkNscz1pLGl9KSl9ZnVuY3Rpb24gVmEodCxlLG4sbyl7cmV0dXJuIE5uKCgoKT0+e2NvbnN0IGk9TGEoZSk7ZnVuY3Rpb24gYSguLi50KXtpZih0aGlzIGluc3RhbmNlb2YgYSlyZXR1cm4gaS5hcHBseSh0aGlzLHQpLHRoaXM7Y29uc3QgZT1uZXcgYSguLi50KTtyZXR1cm4gZnVuY3Rpb24gbihpLGEpe2NvbnN0IHI9aS5jb25zdHJ1Y3RvcixzPXIuaGFzT3duUHJvcGVydHkoSGEpP3JbSGFdOk9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLEhhLHt2YWx1ZTp7fX0pW0hhXTtzW2FdPXMuaGFzT3duUHJvcGVydHkoYSkmJnNbYV18fFtdLHNbYV0udW5zaGlmdChlKSxvJiZvKGksYSwuLi50KX19cmV0dXJuIG4mJihhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSksYS5wcm90b3R5cGUubmdNZXRhZGF0YU5hbWU9dCxhLmFubm90YXRpb25DbHM9YSxhfSkpfWNvbnN0IGphPShmdW5jdGlvbiBVYSgpe3JldHVybiBCYSgiQXR0cmlidXRlIiwodD0+KHthdHRyaWJ1dGVOYW1lOnQsX19OR19FTEVNRU5UX0lEX186KCk9Pk5hKHQpfSkpKX0pKCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBHYXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX2Rlc2M9dCx0aGlzLm5nTWV0YWRhdGFOYW1lPSJJbmplY3Rpb25Ub2tlbiIsdGhpcy7JtXByb3Y9dm9pZCAwLCJudW1iZXIiPT10eXBlb2YgZT8oKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZtbihlLDAsIk9ubHkgbmVnYXRpdmUgbnVtYmVycyBhcmUgc3VwcG9ydGVkIGhlcmUiKSx0aGlzLl9fTkdfRUxFTUVOVF9JRF9fPWUpOnZvaWQgMCE9PWUmJih0aGlzLsm1cHJvdj1Nbih7dG9rZW46dGhpcyxwcm92aWRlZEluOmUucHJvdmlkZWRJbnx8InJvb3QiLGZhY3Rvcnk6ZS5mYWN0b3J5fSkpfXRvU3RyaW5nKCl7cmV0dXJuYEluamVjdGlvblRva2VuICR7dGhpcy5fZGVzY31gfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovbmV3IEdhKCJBbmFseXplRm9yRW50cnlDb21wb25lbnRzIik7Y2xhc3MgV2F7fWNvbnN0IFlhPVZhKCJDb250ZW50Q2hpbGRyZW4iLCgodCxlPXt9KT0+T2JqZWN0LmFzc2lnbih7c2VsZWN0b3I6dCxmaXJzdDohMSxpc1ZpZXdRdWVyeTohMSxkZXNjZW5kYW50czohMSxlbWl0RGlzdGluY3RDaGFuZ2VzT25seTohMH0sZSkpLFdhKSxxYT1WYSgiQ29udGVudENoaWxkIiwoKHQsZT17fSk9Pk9iamVjdC5hc3NpZ24oe3NlbGVjdG9yOnQsZmlyc3Q6ITAsaXNWaWV3UXVlcnk6ITEsZGVzY2VuZGFudHM6ITB9LGUpKSxXYSk7VmEoIlZpZXdDaGlsZHJlbiIsKCh0LGU9e30pPT5PYmplY3QuYXNzaWduKHtzZWxlY3Rvcjp0LGZpcnN0OiExLGlzVmlld1F1ZXJ5OiEwLGRlc2NlbmRhbnRzOiEwLGVtaXREaXN0aW5jdENoYW5nZXNPbmx5OiEwfSxlKSksV2EpO2NvbnN0IFphPVZhKCJWaWV3Q2hpbGQiLCgodCxlKT0+T2JqZWN0LmFzc2lnbih7c2VsZWN0b3I6dCxmaXJzdDohMCxpc1ZpZXdRdWVyeTohMCxkZXNjZW5kYW50czohMH0sZSkpLFdhKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCnZhciBYYSxLYTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmZ1bmN0aW9uIEphKHQpe2NvbnN0IGU9am4ubmc7aWYoZSYmZS7JtWNvbXBpbGVyRmFjYWRlKXJldHVybiBlLsm1Y29tcGlsZXJGYWNhZGU7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSl7Y29uc29sZS5lcnJvcihgSklUIGNvbXBpbGF0aW9uIGZhaWxlZCBmb3IgJHt0LmtpbmR9YCx0LnR5cGUpO2xldCBlPWBUaGUgJHt0LmtpbmR9ICcke3QudHlwZS5uYW1lfScgbmVlZHMgdG8gYmUgY29tcGlsZWQgdXNpbmcgdGhlIEpJVCBjb21waWxlciwgYnV0ICdAYW5ndWxhci9jb21waWxlcicgaXMgbm90IGF2YWlsYWJsZS5cblxuYDt0aHJvdyAxPT09dC51c2FnZT8oZSs9YFRoZSAke3Qua2luZH0gaXMgcGFydCBvZiBhIGxpYnJhcnkgdGhhdCBoYXMgYmVlbiBwYXJ0aWFsbHkgY29tcGlsZWQuXG5gLGUrPSJIb3dldmVyLCB0aGUgQW5ndWxhciBMaW5rZXIgaGFzIG5vdCBwcm9jZXNzZWQgdGhlIGxpYnJhcnkgc3VjaCB0aGF0IEpJVCBjb21waWxhdGlvbiBpcyB1c2VkIGFzIGZhbGxiYWNrLlxuIixlKz0iXG4iLGUrPSJJZGVhbGx5LCB0aGUgbGlicmFyeSBpcyBwcm9jZXNzZWQgdXNpbmcgdGhlIEFuZ3VsYXIgTGlua2VyIHRvIGJlY29tZSBmdWxseSBBT1QgY29tcGlsZWQuXG4iKTplKz0iSklUIGNvbXBpbGF0aW9uIGlzIGRpc2NvdXJhZ2VkIGZvciBwcm9kdWN0aW9uIHVzZS1jYXNlcyEgQ29uc2lkZXIgdXNpbmcgQU9UIG1vZGUgaW5zdGVhZC5cbiIsZSs9IkFsdGVybmF0aXZlbHksIHRoZSBKSVQgY29tcGlsZXIgc2hvdWxkIGJlIGxvYWRlZCBieSBib290c3RyYXBwaW5nIHVzaW5nICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyLWR5bmFtaWMnIG9yICdAYW5ndWxhci9wbGF0Zm9ybS1zZXJ2ZXInLFxuIixlKz0ib3IgbWFudWFsbHkgcHJvdmlkZSB0aGUgY29tcGlsZXIgd2l0aCAnaW1wb3J0IFwiQGFuZ3VsYXIvY29tcGlsZXJcIjsnIGJlZm9yZSBib290c3RyYXBwaW5nLiIsbmV3IEVycm9yKGUpfXRocm93IG5ldyBFcnJvcigiSklUIGNvbXBpbGVyIHVuYXZhaWxhYmxlIil9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLyEoZnVuY3Rpb24odCl7dFt0LkRpcmVjdGl2ZT0wXT0iRGlyZWN0aXZlIix0W3QuQ29tcG9uZW50PTFdPSJDb21wb25lbnQiLHRbdC5JbmplY3RhYmxlPTJdPSJJbmplY3RhYmxlIix0W3QuUGlwZT0zXT0iUGlwZSIsdFt0Lk5nTW9kdWxlPTRdPSJOZ01vZHVsZSJ9KShYYXx8KFhhPXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5FbXVsYXRlZD0wXT0iRW11bGF0ZWQiLHRbdC5Ob25lPTJdPSJOb25lIix0W3QuU2hhZG93RG9tPTNdPSJTaGFkb3dEb20ifSkoS2F8fChLYT17fSkpO2NvbnN0IFFhPUZ1bmN0aW9uO2Z1bmN0aW9uICRhKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIHRyKHQsZSl7dm9pZCAwPT09ZSYmKGU9dCk7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2xldCBvPXRbbl07QXJyYXkuaXNBcnJheShvKT8oZT09PXQmJihlPXQuc2xpY2UoMCxuKSksdHIobyxlKSk6ZSE9PXQmJmUucHVzaChvKX1yZXR1cm4gZX1mdW5jdGlvbiBlcih0LGUpe3QuZm9yRWFjaCgodD0+QXJyYXkuaXNBcnJheSh0KT9lcih0LGUpOmUodCkpKX1mdW5jdGlvbiBucih0LGUsbil7ZT49dC5sZW5ndGg/dC5wdXNoKG4pOnQuc3BsaWNlKGUsMCxuKX1mdW5jdGlvbiBvcih0LGUpe3JldHVybiBlPj10Lmxlbmd0aC0xP3QucG9wKCk6dC5zcGxpY2UoZSwxKVswXX1mdW5jdGlvbiBpcih0LGUpe2NvbnN0IG49W107Zm9yKGxldCBvPTA7bzx0O28rKyluLnB1c2goZSk7cmV0dXJuIG59ZnVuY3Rpb24gYXIodCxlLG4pe2xldCBvPXNyKHQsZSk7cmV0dXJuIG8+PTA/dFsxfG9dPW46KG89fm8sKGZ1bmN0aW9uIGkodCxlLG4sbyl7bmdEZXZNb2RlJiZ1bihlLHQubGVuZ3RoLCJDYW4ndCBpbnNlcnQgcGFzdCBhcnJheSBlbmQuIik7bGV0IGk9dC5sZW5ndGg7aWYoaT09ZSl0LnB1c2gobixvKTtlbHNlIGlmKDE9PT1pKXQucHVzaChvLHRbMF0pLHRbMF09bjtlbHNle2ZvcihpLS0sdC5wdXNoKHRbaS0xXSx0W2ldKTtpPmU7KXRbaV09dFtpLTJdLGktLTt0W2VdPW4sdFtlKzFdPW99fSkodCxvLGUsbikpLG99ZnVuY3Rpb24gcnIodCxlKXtjb25zdCBuPXNyKHQsZSk7aWYobj49MClyZXR1cm4gdFsxfG5dfWZ1bmN0aW9uIHNyKHQsZSl7cmV0dXJuKGZ1bmN0aW9uIG4odCxlLG8pe25nRGV2TW9kZSYmbG4oQXJyYXkuaXNBcnJheSh0KSwhMCwiRXhwZWN0aW5nIGFuIGFycmF5Iik7bGV0IGk9MCxhPXQubGVuZ3RoPj5vO2Zvcig7YSE9PWk7KXtjb25zdCBuPWkrKGEtaT4+MSkscj10W248PG9dO2lmKGU9PT1yKXJldHVybiBuPDxvO3I+ZT9hPW46aT1uKzF9cmV0dXJufihhPDxvKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKSh0LGUsMSl9Y29uc3QgbHI9L15mdW5jdGlvblxzK1xTK1woXClccyp7W1xzXFNdK1wuYXBwbHlcKHRoaXMsXHMqKGFyZ3VtZW50c3woPzpbXigpXStcKFxbXF0sKT9bXigpXStcKGFyZ3VtZW50c1wpKVwpLyxjcj0vXmNsYXNzXHMrW0EtWmEtelxkJF9dKlxzKmV4dGVuZHNccytbXntdK3svLGRyPS9eY2xhc3NccytbQS1aYS16XGQkX10qXHMqZXh0ZW5kc1xzK1tee10re1tcc1xTXSpjb25zdHJ1Y3RvclxzKlwoLyxwcj0vXmNsYXNzXHMrW0EtWmEtelxkJF9dKlxzKmV4dGVuZHNccytbXntdK3tbXHNcU10qY29uc3RydWN0b3JccypcKFwpXHMqe1xzKnN1cGVyXChcLlwuXC5hcmd1bWVudHNcKS87Y2xhc3MgbXJ7Y29uc3RydWN0b3IodCl7dGhpcy5fcmVmbGVjdD10fHxqbi5SZWZsZWN0fWlzUmVmbGVjdGlvbkVuYWJsZWQoKXtyZXR1cm4hMH1mYWN0b3J5KHQpe3JldHVybiguLi5lKT0+bmV3IHQoLi4uZSl9X3ppcFR5cGVzQW5kQW5ub3RhdGlvbnModCxlKXtsZXQgbjtuPWlyKHZvaWQgMD09PXQ/ZS5sZW5ndGg6dC5sZW5ndGgpO2ZvcihsZXQgbz0wO288bi5sZW5ndGg7bysrKW5bb109dm9pZCAwPT09dD9bXTp0W29dJiZ0W29dIT1PYmplY3Q/W3Rbb11dOltdLGUmJm51bGwhPWVbb10mJihuW29dPW5bb10uY29uY2F0KGVbb10pKTtyZXR1cm4gbn1fb3duUGFyYW1ldGVycyh0LGUpe2lmKChmdW5jdGlvbiBuKHQpe3JldHVybiBsci50ZXN0KHQpfHxwci50ZXN0KHQpfHxjci50ZXN0KHQpJiYhZHIudGVzdCh0KX0pKHQudG9TdHJpbmcoKSkpcmV0dXJuIG51bGw7aWYodC5wYXJhbWV0ZXJzJiZ0LnBhcmFtZXRlcnMhPT1lLnBhcmFtZXRlcnMpcmV0dXJuIHQucGFyYW1ldGVycztjb25zdCBvPXQuY3RvclBhcmFtZXRlcnM7aWYobyYmbyE9PWUuY3RvclBhcmFtZXRlcnMpe2NvbnN0IHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG8/bygpOm8sZT10Lm1hcCgodD0+dCYmdC50eXBlKSksbj10Lm1hcCgodD0+dCYmdXIodC5kZWNvcmF0b3JzKSkpO3JldHVybiB0aGlzLl96aXBUeXBlc0FuZEFubm90YXRpb25zKGUsbil9Y29uc3QgaT10Lmhhc093blByb3BlcnR5KElhKSYmdFtJYV0sYT10aGlzLl9yZWZsZWN0JiZ0aGlzLl9yZWZsZWN0LmdldE93bk1ldGFkYXRhJiZ0aGlzLl9yZWZsZWN0LmdldE93bk1ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsdCk7cmV0dXJuIGF8fGk/dGhpcy5femlwVHlwZXNBbmRBbm5vdGF0aW9ucyhhLGkpOmlyKHQubGVuZ3RoKX1wYXJhbWV0ZXJzKHQpe2lmKCEkYSh0KSlyZXR1cm5bXTtjb25zdCBlPWZyKHQpO2xldCBuPXRoaXMuX293blBhcmFtZXRlcnModCxlKTtyZXR1cm4gbnx8ZT09PU9iamVjdHx8KG49dGhpcy5wYXJhbWV0ZXJzKGUpKSxufHxbXX1fb3duQW5ub3RhdGlvbnModCxlKXtpZih0LmFubm90YXRpb25zJiZ0LmFubm90YXRpb25zIT09ZS5hbm5vdGF0aW9ucyl7bGV0IGU9dC5hbm5vdGF0aW9ucztyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmZS5hbm5vdGF0aW9ucyYmKGU9ZS5hbm5vdGF0aW9ucyksZX1yZXR1cm4gdC5kZWNvcmF0b3JzJiZ0LmRlY29yYXRvcnMhPT1lLmRlY29yYXRvcnM/dXIodC5kZWNvcmF0b3JzKTp0Lmhhc093blByb3BlcnR5KHphKT90W3phXTpudWxsfWFubm90YXRpb25zKHQpe2lmKCEkYSh0KSlyZXR1cm5bXTtjb25zdCBlPWZyKHQpLG49dGhpcy5fb3duQW5ub3RhdGlvbnModCxlKXx8W107cmV0dXJuKGUhPT1PYmplY3Q/dGhpcy5hbm5vdGF0aW9ucyhlKTpbXSkuY29uY2F0KG4pfV9vd25Qcm9wTWV0YWRhdGEodCxlKXtpZih0LnByb3BNZXRhZGF0YSYmdC5wcm9wTWV0YWRhdGEhPT1lLnByb3BNZXRhZGF0YSl7bGV0IGU9dC5wcm9wTWV0YWRhdGE7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUucHJvcE1ldGFkYXRhJiYoZT1lLnByb3BNZXRhZGF0YSksZX1pZih0LnByb3BEZWNvcmF0b3JzJiZ0LnByb3BEZWNvcmF0b3JzIT09ZS5wcm9wRGVjb3JhdG9ycyl7Y29uc3QgZT10LnByb3BEZWNvcmF0b3JzLG49e307cmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKHQ9PntuW3RdPXVyKGVbdF0pfSkpLG59cmV0dXJuIHQuaGFzT3duUHJvcGVydHkoSGEpP3RbSGFdOm51bGx9cHJvcE1ldGFkYXRhKHQpe2lmKCEkYSh0KSlyZXR1cm57fTtjb25zdCBlPWZyKHQpLG49e307aWYoZSE9PU9iamVjdCl7Y29uc3QgdD10aGlzLnByb3BNZXRhZGF0YShlKTtPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChlPT57bltlXT10W2VdfSkpfWNvbnN0IG89dGhpcy5fb3duUHJvcE1ldGFkYXRhKHQsZSk7cmV0dXJuIG8mJk9iamVjdC5rZXlzKG8pLmZvckVhY2goKHQ9Pntjb25zdCBlPVtdO24uaGFzT3duUHJvcGVydHkodCkmJmUucHVzaCguLi5uW3RdKSxlLnB1c2goLi4ub1t0XSksblt0XT1lfSkpLG59b3duUHJvcE1ldGFkYXRhKHQpe3JldHVybiAkYSh0KSYmdGhpcy5fb3duUHJvcE1ldGFkYXRhKHQsZnIodCkpfHx7fX1oYXNMaWZlY3ljbGVIb29rKHQsZSl7cmV0dXJuIHQgaW5zdGFuY2VvZiBRYSYmZSBpbiB0LnByb3RvdHlwZX1ndWFyZHModCl7cmV0dXJue319Z2V0dGVyKHQpe3JldHVybiBuZXcgRnVuY3Rpb24oIm8iLCJyZXR1cm4gby4iK3QrIjsiKX1zZXR0ZXIodCl7cmV0dXJuIG5ldyBGdW5jdGlvbigibyIsInYiLCJyZXR1cm4gby4iK3QrIiA9IHY7Iil9bWV0aG9kKHQpe3JldHVybiBuZXcgRnVuY3Rpb24oIm8iLCJhcmdzIixgaWYgKCFvLiR7dH0pIHRocm93IG5ldyBFcnJvcignIiR7dH0iIGlzIHVuZGVmaW5lZCcpO1xuICAgICAgICByZXR1cm4gby4ke3R9LmFwcGx5KG8sIGFyZ3MpO2ApfWltcG9ydFVyaSh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJnQuZmlsZVBhdGg/dC5maWxlUGF0aDpgLi8ke0dlKHQpfWB9cmVzb3VyY2VVcmkodCl7cmV0dXJuYC4vJHtHZSh0KX1gfXJlc29sdmVJZGVudGlmaWVyKHQsZSxuLG8pe3JldHVybiBvfXJlc29sdmVFbnVtKHQsZSl7cmV0dXJuIHRbZV19fWZ1bmN0aW9uIHVyKHQpe3JldHVybiB0P3QubWFwKCh0PT5uZXcoMCx0LnR5cGUuYW5ub3RhdGlvbkNscykoLi4udC5hcmdzP3QuYXJnczpbXSkpKTpbXX1mdW5jdGlvbiBmcih0KXtjb25zdCBlPXQucHJvdG90eXBlP09iamVjdC5nZXRQcm90b3R5cGVPZih0LnByb3RvdHlwZSk6bnVsbDtyZXR1cm4oZT9lLmNvbnN0cnVjdG9yOm51bGwpfHxPYmplY3R9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NvbnN0IGdyPXt9LGhyPS9cbi9nbSxicj0iX19zb3VyY2UiLHlyPWplKHtwcm92aWRlOlN0cmluZyx1c2VWYWx1ZTpqZX0pO2xldCBfcjtmdW5jdGlvbiBDcih0KXtjb25zdCBlPV9yO3JldHVybiBfcj10LGV9ZnVuY3Rpb24gTXIodCxlPUVuLkRlZmF1bHQpe2lmKHZvaWQgMD09PV9yKXRocm93IG5ldyBFcnJvcigiaW5qZWN0KCkgbXVzdCBiZSBjYWxsZWQgZnJvbSBhbiBpbmplY3Rpb24gY29udGV4dCIpO3JldHVybiBudWxsPT09X3I/VG4odCx2b2lkIDAsZSk6X3IuZ2V0KHQsZSZFbi5PcHRpb25hbD9udWxsOnZvaWQgMCxlKX1mdW5jdGlvbiB2cih0LGU9RW4uRGVmYXVsdCl7cmV0dXJuKChmdW5jdGlvbiBuKCl7cmV0dXJuIFJufSkoKXx8TXIpKFplKHQpLGUpfWZ1bmN0aW9uIHhyKHQpe2NvbnN0IGU9bmdEZXZNb2RlP2BUaGlzIGNvbnN0cnVjdG9yIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggQW5ndWxhciBEZXBlbmRlbmN5IEluamVjdGlvbiBiZWNhdXNlIGl0cyBkZXBlbmRlbmN5IGF0IGluZGV4ICR7dH0gb2YgdGhlIHBhcmFtZXRlciBsaXN0IGlzIGludmFsaWQuXG5UaGlzIGNhbiBoYXBwZW4gaWYgdGhlIGRlcGVuZGVuY3kgdHlwZSBpcyBhIHByaW1pdGl2ZSBsaWtlIGEgc3RyaW5nIG9yIGlmIGFuIGFuY2VzdG9yIG9mIHRoaXMgY2xhc3MgaXMgbWlzc2luZyBhbiBBbmd1bGFyIGRlY29yYXRvci5cblxuUGxlYXNlIGNoZWNrIHRoYXQgMSkgdGhlIHR5cGUgZm9yIHRoZSBwYXJhbWV0ZXIgYXQgaW5kZXggJHt0fSBpcyBjb3JyZWN0IGFuZCAyKSB0aGUgY29ycmVjdCBBbmd1bGFyIGRlY29yYXRvcnMgYXJlIGRlZmluZWQgZm9yIHRoaXMgY2xhc3MgYW5kIGl0cyBhbmNlc3RvcnMuYDoiaW52YWxpZCI7dGhyb3cgbmV3IEVycm9yKGUpfWNvbnN0IE9yPXZyO2Z1bmN0aW9uIFByKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IG89WmUodFtuXSk7aWYoQXJyYXkuaXNBcnJheShvKSl7aWYoMD09PW8ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQXJndW1lbnRzIGFycmF5IG11c3QgaGF2ZSBhcmd1bWVudHMuIik7bGV0IHQsbj1Fbi5EZWZhdWx0O2ZvcihsZXQgZT0wO2U8by5sZW5ndGg7ZSsrKXtjb25zdCBpPW9bZV0sYT1pLl9fTkdfRElfRkxBR19fOyJudW1iZXIiPT10eXBlb2YgYT8tMT09PWE/dD1pLnRva2VuOm58PWE6dD1pfWUucHVzaCh2cih0LG4pKX1lbHNlIGUucHVzaCh2cihvKSl9cmV0dXJuIGV9ZnVuY3Rpb24gd3IodCxlKXtyZXR1cm4gdC5fX05HX0RJX0ZMQUdfXz1lLHQucHJvdG90eXBlLl9fTkdfRElfRkxBR19fPWUsdH0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IGtyPXdyKEJhKCJJbmplY3QiLCh0PT4oe3Rva2VuOnR9KSkpLC0xKSxTcj13cihCYSgiT3B0aW9uYWwiKSw4KSxEcj13cihCYSgiU2VsZiIpLDIpLEVyPXdyKEJhKCJTa2lwU2VsZiIpLDQpLFJyPXdyKEJhKCJIb3N0IiksMSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpsZXQgQXI9bnVsbDtmdW5jdGlvbiBUcigpe3JldHVybiBBcj1Bcnx8bmV3IG1yfWZ1bmN0aW9uIE5yKHQpe3JldHVybiB6cihUcigpLnBhcmFtZXRlcnModCkpfWZ1bmN0aW9uIHpyKHQpe3JldHVybiB0Lm1hcCgodD0+KGZ1bmN0aW9uIGUodCl7Y29uc3QgZT17dG9rZW46bnVsbCxhdHRyaWJ1dGU6bnVsbCxob3N0OiExLG9wdGlvbmFsOiExLHNlbGY6ITEsc2tpcFNlbGY6ITF9O2lmKEFycmF5LmlzQXJyYXkodCkmJnQubGVuZ3RoPjApZm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IG89dFtuXTtpZih2b2lkIDA9PT1vKWNvbnRpbnVlO2NvbnN0IGk9T2JqZWN0LmdldFByb3RvdHlwZU9mKG8pO2lmKG8gaW5zdGFuY2VvZiBTcnx8Ik9wdGlvbmFsIj09PWkubmdNZXRhZGF0YU5hbWUpZS5vcHRpb25hbD0hMDtlbHNlIGlmKG8gaW5zdGFuY2VvZiBFcnx8IlNraXBTZWxmIj09PWkubmdNZXRhZGF0YU5hbWUpZS5za2lwU2VsZj0hMDtlbHNlIGlmKG8gaW5zdGFuY2VvZiBEcnx8IlNlbGYiPT09aS5uZ01ldGFkYXRhTmFtZSllLnNlbGY9ITA7ZWxzZSBpZihvIGluc3RhbmNlb2YgUnJ8fCJIb3N0Ij09PWkubmdNZXRhZGF0YU5hbWUpZS5ob3N0PSEwO2Vsc2UgaWYobyBpbnN0YW5jZW9mIGtyKWUudG9rZW49by50b2tlbjtlbHNlIGlmKG8gaW5zdGFuY2VvZiBqYSl7aWYodm9pZCAwPT09by5hdHRyaWJ1dGVOYW1lKXRocm93IG5ldyBFcnJvcigiQXR0cmlidXRlIG5hbWUgbXVzdCBiZSBkZWZpbmVkLiIpO2UuYXR0cmlidXRlPW8uYXR0cmlidXRlTmFtZX1lbHNlIGUudG9rZW49b31lbHNlIGUudG9rZW49dm9pZCAwPT09dHx8QXJyYXkuaXNBcnJheSh0KSYmMD09PXQubGVuZ3RoP251bGw6dDtyZXR1cm4gZX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKSh0KSkpfWxldCBJcj1uZXcgTWFwO2NvbnN0IEhyPW5ldyBTZXQ7ZnVuY3Rpb24gRnIodCl7cmV0dXJuISEodC50ZW1wbGF0ZVVybCYmIXQuaGFzT3duUHJvcGVydHkoInRlbXBsYXRlIil8fHQuc3R5bGVVcmxzJiZ0LnN0eWxlVXJscy5sZW5ndGgpfWZ1bmN0aW9uIExyKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90OnQudGV4dCgpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KbGV0IEJyLFZyO2Z1bmN0aW9uIGpyKCl7aWYodm9pZCAwPT09QnImJihCcj1udWxsLGpuLnRydXN0ZWRUeXBlcykpdHJ5e0JyPWpuLnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImFuZ3VsYXIiLHtjcmVhdGVIVE1MOnQ9PnQsY3JlYXRlU2NyaXB0OnQ9PnQsY3JlYXRlU2NyaXB0VVJMOnQ9PnR9KX1jYXRjaCh0KXt9cmV0dXJuIEJyfWZ1bmN0aW9uIFVyKHQpe3ZhciBlO3JldHVybihudWxsPT09KGU9anIoKSl8fHZvaWQgMD09PWU/dm9pZCAwOmUuY3JlYXRlSFRNTCh0KSl8fHR9ZnVuY3Rpb24gR3IoKXtpZih2b2lkIDA9PT1WciYmKFZyPW51bGwsam4udHJ1c3RlZFR5cGVzKSl0cnl7VnI9am4udHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeSgiYW5ndWxhciN1bnNhZmUtYnlwYXNzIix7Y3JlYXRlSFRNTDp0PT50LGNyZWF0ZVNjcmlwdDp0PT50LGNyZWF0ZVNjcmlwdFVSTDp0PT50fSl9Y2F0Y2godCl7fXJldHVybiBWcn1mdW5jdGlvbiBXcih0KXt2YXIgZTtyZXR1cm4obnVsbD09PShlPUdyKCkpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmNyZWF0ZUhUTUwodCkpfHx0fWZ1bmN0aW9uIFlyKHQpe3ZhciBlO3JldHVybihudWxsPT09KGU9R3IoKSl8fHZvaWQgMD09PWU/dm9pZCAwOmUuY3JlYXRlU2NyaXB0KHQpKXx8dH1mdW5jdGlvbiBxcih0KXt2YXIgZTtyZXR1cm4obnVsbD09PShlPUdyKCkpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmNyZWF0ZVNjcmlwdFVSTCh0KSl8fHR9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIFpye2NvbnN0cnVjdG9yKHQpe3RoaXMuY2hhbmdpbmdUaGlzQnJlYWtzQXBwbGljYXRpb25TZWN1cml0eT10fXRvU3RyaW5nKCl7cmV0dXJuYFNhZmVWYWx1ZSBtdXN0IHVzZSBbcHJvcGVydHldPWJpbmRpbmc6ICR7dGhpcy5jaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5fSAoc2VlIGh0dHBzOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpYH19Y2xhc3MgWHIgZXh0ZW5kcyBacntnZXRUeXBlTmFtZSgpe3JldHVybiJIVE1MIn19Y2xhc3MgS3IgZXh0ZW5kcyBacntnZXRUeXBlTmFtZSgpe3JldHVybiJTdHlsZSJ9fWNsYXNzIEpyIGV4dGVuZHMgWnJ7Z2V0VHlwZU5hbWUoKXtyZXR1cm4iU2NyaXB0In19Y2xhc3MgUXIgZXh0ZW5kcyBacntnZXRUeXBlTmFtZSgpe3JldHVybiJVUkwifX1jbGFzcyAkciBleHRlbmRzIFpye2dldFR5cGVOYW1lKCl7cmV0dXJuIlJlc291cmNlVVJMIn19ZnVuY3Rpb24gdHModCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBacj90LmNoYW5naW5nVGhpc0JyZWFrc0FwcGxpY2F0aW9uU2VjdXJpdHk6dH1mdW5jdGlvbiBlcyh0LGUpe2NvbnN0IG49bnModCk7aWYobnVsbCE9biYmbiE9PWUpe2lmKCJSZXNvdXJjZVVSTCI9PT1uJiYiVVJMIj09PWUpcmV0dXJuITA7dGhyb3cgbmV3IEVycm9yKGBSZXF1aXJlZCBhIHNhZmUgJHtlfSwgZ290IGEgJHtufSAoc2VlIGh0dHBzOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpYCl9cmV0dXJuIG49PT1lfWZ1bmN0aW9uIG5zKHQpe3JldHVybiB0IGluc3RhbmNlb2YgWnImJnQuZ2V0VHlwZU5hbWUoKXx8bnVsbH0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmZ1bmN0aW9uIG9zKHQpe2NvbnN0IGU9bmV3IGFzKHQpO3JldHVybihmdW5jdGlvbiBuKCl7dHJ5e3JldHVybiEhKG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoVXIoIiIpLCJ0ZXh0L2h0bWwiKX1jYXRjaCh0KXtyZXR1cm4hMX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLykoKT9uZXcgaXMoZSk6ZX1jbGFzcyBpc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmluZXJ0RG9jdW1lbnRIZWxwZXI9dH1nZXRJbmVydEJvZHlFbGVtZW50KHQpe3Q9Ijxib2R5PjxyZW1vdmU+PC9yZW1vdmU+Iit0O3RyeXtjb25zdCBlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKFVyKHQpLCJ0ZXh0L2h0bWwiKS5ib2R5O3JldHVybiBudWxsPT09ZT90aGlzLmluZXJ0RG9jdW1lbnRIZWxwZXIuZ2V0SW5lcnRCb2R5RWxlbWVudCh0KTooZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpLGUpfWNhdGNoKHQpe3JldHVybiBudWxsfX19Y2xhc3MgYXN7Y29uc3RydWN0b3IodCl7aWYodGhpcy5kZWZhdWx0RG9jPXQsdGhpcy5pbmVydERvY3VtZW50PXRoaXMuZGVmYXVsdERvYy5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoInNhbml0aXphdGlvbi1pbmVydCIpLG51bGw9PXRoaXMuaW5lcnREb2N1bWVudC5ib2R5KXtjb25zdCB0PXRoaXMuaW5lcnREb2N1bWVudC5jcmVhdGVFbGVtZW50KCJodG1sIik7dGhpcy5pbmVydERvY3VtZW50LmFwcGVuZENoaWxkKHQpO2NvbnN0IGU9dGhpcy5pbmVydERvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJvZHkiKTt0LmFwcGVuZENoaWxkKGUpfX1nZXRJbmVydEJvZHlFbGVtZW50KHQpe2NvbnN0IGU9dGhpcy5pbmVydERvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7aWYoImNvbnRlbnQiaW4gZSlyZXR1cm4gZS5pbm5lckhUTUw9VXIodCksZTtjb25zdCBuPXRoaXMuaW5lcnREb2N1bWVudC5jcmVhdGVFbGVtZW50KCJib2R5Iik7cmV0dXJuIG4uaW5uZXJIVE1MPVVyKHQpLHRoaXMuZGVmYXVsdERvYy5kb2N1bWVudE1vZGUmJnRoaXMuc3RyaXBDdXN0b21Oc0F0dHJzKG4pLG59c3RyaXBDdXN0b21Oc0F0dHJzKHQpe2NvbnN0IGU9dC5hdHRyaWJ1dGVzO2ZvcihsZXQgbj1lLmxlbmd0aC0xOzA8bjtuLS0pe2NvbnN0IG89ZS5pdGVtKG4pLm5hbWU7InhtbG5zOm5zMSIhPT1vJiYwIT09by5pbmRleE9mKCJuczE6Iil8fHQucmVtb3ZlQXR0cmlidXRlKG8pfWxldCBuPXQuZmlyc3RDaGlsZDtmb3IoO247KW4ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmdGhpcy5zdHJpcEN1c3RvbU5zQXR0cnMobiksbj1uLm5leHRTaWJsaW5nfX1jb25zdCBycz0vXig/Oig/Omh0dHBzP3xtYWlsdG98ZnRwfHRlbHxmaWxlfHNtcyk6fFteJjovPyNdKig/OlsvPyNdfCQpKS9naSxzcz0vXmRhdGE6KD86aW1hZ2VcLyg/OmJtcHxnaWZ8anBlZ3xqcGd8cG5nfHRpZmZ8d2VicCl8dmlkZW9cLyg/Om1wZWd8bXA0fG9nZ3x3ZWJtKXxhdWRpb1wvKD86bXAzfG9nYXxvZ2d8b3B1cykpO2Jhc2U2NCxbYS16MC05K1wvXSs9KiQvaTtmdW5jdGlvbiBscyh0KXtyZXR1cm4odD1TdHJpbmcodCkpLm1hdGNoKHJzKXx8dC5tYXRjaChzcyk/dDooKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZjb25zb2xlLndhcm4oYFdBUk5JTkc6IHNhbml0aXppbmcgdW5zYWZlIFVSTCB2YWx1ZSAke3R9IChzZWUgaHR0cHM6Ly9nLmNvL25nL3NlY3VyaXR5I3hzcylgKSwidW5zYWZlOiIrdCl9ZnVuY3Rpb24gY3ModCl7cmV0dXJuKHQ9U3RyaW5nKHQpKS5zcGxpdCgiLCIpLm1hcCgodD0+bHModC50cmltKCkpKSkuam9pbigiLCAiKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gZHModCl7Y29uc3QgZT17fTtmb3IoY29uc3QgbiBvZiB0LnNwbGl0KCIsIikpZVtuXT0hMDtyZXR1cm4gZX1mdW5jdGlvbiBwcyguLi50KXtjb25zdCBlPXt9O2Zvcihjb25zdCBuIG9mIHQpZm9yKGNvbnN0IHQgaW4gbiluLmhhc093blByb3BlcnR5KHQpJiYoZVt0XT0hMCk7cmV0dXJuIGV9Y29uc3QgbXM9ZHMoImFyZWEsYnIsY29sLGhyLGltZyx3YnIiKSx1cz1kcygiY29sZ3JvdXAsZGQsZHQsbGkscCx0Ym9keSx0ZCx0Zm9vdCx0aCx0aGVhZCx0ciIpLGZzPWRzKCJycCxydCIpLGdzPXBzKGZzLHVzKSxocz1wcyh1cyxkcygiYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGJsb2NrcXVvdGUsY2FwdGlvbixjZW50ZXIsZGVsLGRldGFpbHMsZGlhbG9nLGRpcixkaXYsZGwsZmlndXJlLGZpZ2NhcHRpb24sZm9vdGVyLGgxLGgyLGgzLGg0LGg1LGg2LGhlYWRlcixoZ3JvdXAsaHIsaW5zLG1haW4sbWFwLG1lbnUsbmF2LG9sLHByZSxzZWN0aW9uLHN1bW1hcnksdGFibGUsdWwiKSksYnM9cHMoZnMsZHMoImEsYWJicixhY3JvbnltLGF1ZGlvLGIsYmRpLGJkbyxiaWcsYnIsY2l0ZSxjb2RlLGRlbCxkZm4sZW0sZm9udCxpLGltZyxpbnMsa2JkLGxhYmVsLG1hcCxtYXJrLHBpY3R1cmUscSxydWJ5LHJwLHJ0LHMsc2FtcCxzbWFsbCxzb3VyY2Usc3BhbixzdHJpa2Usc3Ryb25nLHN1YixzdXAsdGltZSx0cmFjayx0dCx1LHZhcix2aWRlbyIpKSx5cz1wcyhtcyxocyxicyxncyksX3M9ZHMoImJhY2tncm91bmQsY2l0ZSxocmVmLGl0ZW10eXBlLGxvbmdkZXNjLHBvc3RlcixzcmMseGxpbms6aHJlZiIpLENzPWRzKCJzcmNzZXQiKSxNcz1kcygiYWJicixhY2Nlc3NrZXksYWxpZ24sYWx0LGF1dG9wbGF5LGF4aXMsYmdjb2xvcixib3JkZXIsY2VsbHBhZGRpbmcsY2VsbHNwYWNpbmcsY2xhc3MsY2xlYXIsY29sb3IsY29scyxjb2xzcGFuLGNvbXBhY3QsY29udHJvbHMsY29vcmRzLGRhdGV0aW1lLGRlZmF1bHQsZGlyLGRvd25sb2FkLGZhY2UsaGVhZGVycyxoZWlnaHQsaGlkZGVuLGhyZWZsYW5nLGhzcGFjZSxpc21hcCxpdGVtc2NvcGUsaXRlbXByb3Asa2luZCxsYWJlbCxsYW5nLGxhbmd1YWdlLGxvb3AsbWVkaWEsbXV0ZWQsbm9ocmVmLG5vd3JhcCxvcGVuLHByZWxvYWQscmVsLHJldixyb2xlLHJvd3Mscm93c3BhbixydWxlcyxzY29wZSxzY3JvbGxpbmcsc2hhcGUsc2l6ZSxzaXplcyxzcGFuLHNyY2xhbmcsc3RhcnQsc3VtbWFyeSx0YWJpbmRleCx0YXJnZXQsdGl0bGUsdHJhbnNsYXRlLHR5cGUsdXNlbWFwLHZhbGlnbix2YWx1ZSx2c3BhY2Usd2lkdGgiKSx2cz1kcygiYXJpYS1hY3RpdmVkZXNjZW5kYW50LGFyaWEtYXRvbWljLGFyaWEtYXV0b2NvbXBsZXRlLGFyaWEtYnVzeSxhcmlhLWNoZWNrZWQsYXJpYS1jb2xjb3VudCxhcmlhLWNvbGluZGV4LGFyaWEtY29sc3BhbixhcmlhLWNvbnRyb2xzLGFyaWEtY3VycmVudCxhcmlhLWRlc2NyaWJlZGJ5LGFyaWEtZGV0YWlscyxhcmlhLWRpc2FibGVkLGFyaWEtZHJvcGVmZmVjdCxhcmlhLWVycm9ybWVzc2FnZSxhcmlhLWV4cGFuZGVkLGFyaWEtZmxvd3RvLGFyaWEtZ3JhYmJlZCxhcmlhLWhhc3BvcHVwLGFyaWEtaGlkZGVuLGFyaWEtaW52YWxpZCxhcmlhLWtleXNob3J0Y3V0cyxhcmlhLWxhYmVsLGFyaWEtbGFiZWxsZWRieSxhcmlhLWxldmVsLGFyaWEtbGl2ZSxhcmlhLW1vZGFsLGFyaWEtbXVsdGlsaW5lLGFyaWEtbXVsdGlzZWxlY3RhYmxlLGFyaWEtb3JpZW50YXRpb24sYXJpYS1vd25zLGFyaWEtcGxhY2Vob2xkZXIsYXJpYS1wb3NpbnNldCxhcmlhLXByZXNzZWQsYXJpYS1yZWFkb25seSxhcmlhLXJlbGV2YW50LGFyaWEtcmVxdWlyZWQsYXJpYS1yb2xlZGVzY3JpcHRpb24sYXJpYS1yb3djb3VudCxhcmlhLXJvd2luZGV4LGFyaWEtcm93c3BhbixhcmlhLXNlbGVjdGVkLGFyaWEtc2V0c2l6ZSxhcmlhLXNvcnQsYXJpYS12YWx1ZW1heCxhcmlhLXZhbHVlbWluLGFyaWEtdmFsdWVub3csYXJpYS12YWx1ZXRleHQiKSx4cz1wcyhfcyxDcyxNcyx2cyksT3M9ZHMoInNjcmlwdCxzdHlsZSx0ZW1wbGF0ZSIpO2NsYXNzIFBze2NvbnN0cnVjdG9yKCl7dGhpcy5zYW5pdGl6ZWRTb21ldGhpbmc9ITEsdGhpcy5idWY9W119c2FuaXRpemVDaGlsZHJlbih0KXtsZXQgZT10LmZpcnN0Q2hpbGQsbj0hMDtmb3IoO2U7KWlmKGUubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERT9uPXRoaXMuc3RhcnRFbGVtZW50KGUpOmUubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERT90aGlzLmNoYXJzKGUubm9kZVZhbHVlKTp0aGlzLnNhbml0aXplZFNvbWV0aGluZz0hMCxuJiZlLmZpcnN0Q2hpbGQpZT1lLmZpcnN0Q2hpbGQ7ZWxzZSBmb3IoO2U7KXtlLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJnRoaXMuZW5kRWxlbWVudChlKTtsZXQgdD10aGlzLmNoZWNrQ2xvYmJlcmVkRWxlbWVudChlLGUubmV4dFNpYmxpbmcpO2lmKHQpe2U9dDticmVha31lPXRoaXMuY2hlY2tDbG9iYmVyZWRFbGVtZW50KGUsZS5wYXJlbnROb2RlKX1yZXR1cm4gdGhpcy5idWYuam9pbigiIil9c3RhcnRFbGVtZW50KHQpe2NvbnN0IGU9dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKCF5cy5oYXNPd25Qcm9wZXJ0eShlKSlyZXR1cm4gdGhpcy5zYW5pdGl6ZWRTb21ldGhpbmc9ITAsIU9zLmhhc093blByb3BlcnR5KGUpO3RoaXMuYnVmLnB1c2goIjwiKSx0aGlzLmJ1Zi5wdXNoKGUpO2NvbnN0IG49dC5hdHRyaWJ1dGVzO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKXtjb25zdCBlPW4uaXRlbSh0KSxvPWUubmFtZSxpPW8udG9Mb3dlckNhc2UoKTtpZigheHMuaGFzT3duUHJvcGVydHkoaSkpe3RoaXMuc2FuaXRpemVkU29tZXRoaW5nPSEwO2NvbnRpbnVlfWxldCBhPWUudmFsdWU7X3NbaV0mJihhPWxzKGEpKSxDc1tpXSYmKGE9Y3MoYSkpLHRoaXMuYnVmLnB1c2goIiAiLG8sJz0iJyxTcyhhKSwnIicpfXJldHVybiB0aGlzLmJ1Zi5wdXNoKCI+IiksITB9ZW5kRWxlbWVudCh0KXtjb25zdCBlPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTt5cy5oYXNPd25Qcm9wZXJ0eShlKSYmIW1zLmhhc093blByb3BlcnR5KGUpJiYodGhpcy5idWYucHVzaCgiPC8iKSx0aGlzLmJ1Zi5wdXNoKGUpLHRoaXMuYnVmLnB1c2goIj4iKSl9Y2hhcnModCl7dGhpcy5idWYucHVzaChTcyh0KSl9Y2hlY2tDbG9iYmVyZWRFbGVtZW50KHQsZSl7aWYoZSYmKHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZSkmTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkpPT09Tm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkpdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc2FuaXRpemUgaHRtbCBiZWNhdXNlIHRoZSBlbGVtZW50IGlzIGNsb2JiZXJlZDogJHt0Lm91dGVySFRNTH1gKTtyZXR1cm4gZX19Y29uc3Qgd3M9L1tcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXS9nLGtzPS8oW15cIy1+IHwhXSkvZztmdW5jdGlvbiBTcyh0KXtyZXR1cm4gdC5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSh3cywoZnVuY3Rpb24odCl7cmV0dXJuIiYjIisoMTAyNCoodC5jaGFyQ29kZUF0KDApLTU1Mjk2KSsodC5jaGFyQ29kZUF0KDEpLTU2MzIwKSs2NTUzNikrIjsifSkpLnJlcGxhY2Uoa3MsKGZ1bmN0aW9uKHQpe3JldHVybiImIyIrdC5jaGFyQ29kZUF0KDApKyI7In0pKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKX1sZXQgRHM7ZnVuY3Rpb24gRXModCxlKXtsZXQgbj1udWxsO3RyeXtEcz1Ec3x8b3ModCk7bGV0IG89ZT9TdHJpbmcoZSk6IiI7bj1Ecy5nZXRJbmVydEJvZHlFbGVtZW50KG8pO2xldCBpPTUsYT1vO2Rve2lmKDA9PT1pKXRocm93IG5ldyBFcnJvcigiRmFpbGVkIHRvIHNhbml0aXplIGh0bWwgYmVjYXVzZSB0aGUgaW5wdXQgaXMgdW5zdGFibGUiKTtpLS0sbz1hLGE9bi5pbm5lckhUTUwsbj1Ecy5nZXRJbmVydEJvZHlFbGVtZW50KG8pfXdoaWxlKG8hPT1hKTtjb25zdCByPW5ldyBQcyxzPXIuc2FuaXRpemVDaGlsZHJlbihScyhuKXx8bik7cmV0dXJuKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZyLnNhbml0aXplZFNvbWV0aGluZyYmY29uc29sZS53YXJuKCJXQVJOSU5HOiBzYW5pdGl6aW5nIEhUTUwgc3RyaXBwZWQgc29tZSBjb250ZW50LCBzZWUgaHR0cHM6Ly9nLmNvL25nL3NlY3VyaXR5I3hzcyIpLFVyKHMpfWZpbmFsbHl7aWYobil7Y29uc3QgdD1ScyhuKXx8bjtmb3IoO3QuZmlyc3RDaGlsZDspdC5yZW1vdmVDaGlsZCh0LmZpcnN0Q2hpbGQpfX19ZnVuY3Rpb24gUnModCl7cmV0dXJuImNvbnRlbnQiaW4gdCYmKGZ1bmN0aW9uIGUodCl7cmV0dXJuIHQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmIlRFTVBMQVRFIj09PXQubm9kZU5hbWV9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLykodCk/dC5jb250ZW50Om51bGx9dmFyIEFzO2Z1bmN0aW9uIFRzKHQpe2NvbnN0IGU9enMoKTtyZXR1cm4gZT9lLnNhbml0aXplKEFzLlVSTCx0KXx8IiI6ZXModCwiVVJMIik/dHModCk6bHMoJGUodCkpfWZ1bmN0aW9uIE5zKHQpe2NvbnN0IGU9enMoKTtpZihlKXJldHVybiBxcihlLnNhbml0aXplKEFzLlJFU09VUkNFX1VSTCx0KXx8IiIpO2lmKGVzKHQsIlJlc291cmNlVVJMIikpcmV0dXJuIHFyKHRzKHQpKTt0aHJvdyBuZXcgRXJyb3IoInVuc2FmZSB2YWx1ZSB1c2VkIGluIGEgcmVzb3VyY2UgVVJMIGNvbnRleHQgKHNlZSBodHRwczovL2cuY28vbmcvc2VjdXJpdHkjeHNzKSIpfWZ1bmN0aW9uIHpzKCl7Y29uc3QgdD1maSgpO3JldHVybiB0JiZ0WzEyXX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gSXModCl7bGV0IGU9QnModCk7aWYoZSl7aWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1lO2xldCBvLGksYTtpZigoZnVuY3Rpb24gbih0KXtyZXR1cm4gdCYmdC5jb25zdHJ1Y3RvciYmdC5jb25zdHJ1Y3Rvci7JtWNtcH0pKHQpKXtpZihvPUdzKG4sdCksLTE9PW8pdGhyb3cgbmV3IEVycm9yKCJUaGUgcHJvdmlkZWQgY29tcG9uZW50IHdhcyBub3QgZm91bmQgaW4gdGhlIGFwcGxpY2F0aW9uIik7aT10fWVsc2UgaWYoKGZ1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuY29uc3RydWN0b3ImJnQuY29uc3RydWN0b3IuybVkaXJ9KSh0KSl7aWYobz0oZnVuY3Rpb24gaSh0LGUpe2xldCBuPXRbMV0uZmlyc3RDaGlsZDtmb3IoO247KXtjb25zdCBvPW4uZGlyZWN0aXZlRW5kO2ZvcihsZXQgaT1uLmRpcmVjdGl2ZVN0YXJ0O2k8bztpKyspaWYodFtpXT09PWUpcmV0dXJuIG4uaW5kZXg7bj1VcyhuKX1yZXR1cm4tMX0pKG4sdCksLTE9PW8pdGhyb3cgbmV3IEVycm9yKCJUaGUgcHJvdmlkZWQgZGlyZWN0aXZlIHdhcyBub3QgZm91bmQgaW4gdGhlIGFwcGxpY2F0aW9uIik7YT1XcyhvLG4sITEpfWVsc2UgaWYobz1qcyhuLHQpLC0xPT1vKXJldHVybiBudWxsO2NvbnN0IHI9ZWkobltvXSkscz1CcyhyKSxsPXMmJiFBcnJheS5pc0FycmF5KHMpP3M6SHMobixvLHIpO2lmKGkmJnZvaWQgMD09PWwuY29tcG9uZW50JiYobC5jb21wb25lbnQ9aSxMcyhsLmNvbXBvbmVudCxsKSksYSYmdm9pZCAwPT09bC5kaXJlY3RpdmVzKXtsLmRpcmVjdGl2ZXM9YTtmb3IobGV0IHQ9MDt0PGEubGVuZ3RoO3QrKylMcyhhW3RdLGwpfUxzKGwubmF0aXZlLGwpLGU9bH19ZWxzZXtjb25zdCBuPXQ7bmdEZXZNb2RlJiZ5bihuKTtsZXQgbz1uO2Zvcig7bz1vLnBhcmVudE5vZGU7KXtjb25zdCB0PUJzKG8pO2lmKHQpe2xldCBvO2lmKG89QXJyYXkuaXNBcnJheSh0KT90OnQubFZpZXcsIW8pcmV0dXJuIG51bGw7Y29uc3QgaT1qcyhvLG4pO2lmKGk+PTApe2NvbnN0IHQ9ZWkob1tpXSksbj1IcyhvLGksdCk7THModCxuKSxlPW47YnJlYWt9fX19cmV0dXJuIGV8fG51bGx9ZnVuY3Rpb24gSHModCxlLG4pe3JldHVybntsVmlldzp0LG5vZGVJbmRleDplLG5hdGl2ZTpuLGNvbXBvbmVudDp2b2lkIDAsZGlyZWN0aXZlczp2b2lkIDAsbG9jYWxSZWZzOnZvaWQgMH19ZnVuY3Rpb24gRnModCl7bGV0IGUsbj1Ccyh0KTtpZihBcnJheS5pc0FycmF5KG4pKXtjb25zdCBvPUdzKG4sdCk7ZT1yaShvLG4pO2NvbnN0IGk9SHMobixvLGVbMF0pO2kuY29tcG9uZW50PXQsTHModCxpKSxMcyhpLm5hdGl2ZSxpKX1lbHNlIGU9cmkobi5ub2RlSW5kZXgsbi5sVmlldyk7cmV0dXJuIGV9ZnVuY3Rpb24gTHModCxlKXtuZ0Rldk1vZGUmJmhuKHQsIlRhcmdldCBleHBlY3RlZCIpLHQuX19uZ0NvbnRleHRfXz1lfWZ1bmN0aW9uIEJzKHQpe3JldHVybiBuZ0Rldk1vZGUmJmhuKHQsIlRhcmdldCBleHBlY3RlZCIpLHQuX19uZ0NvbnRleHRfX3x8bnVsbH1mdW5jdGlvbiBWcyh0KXtjb25zdCBlPUJzKHQpO3JldHVybiBlP0FycmF5LmlzQXJyYXkoZSk/ZTplLmxWaWV3Om51bGx9ZnVuY3Rpb24ganModCxlKXtjb25zdCBuPXRbMV07Zm9yKGxldCBvPWdvO288bi5iaW5kaW5nU3RhcnRJbmRleDtvKyspaWYoZWkodFtvXSk9PT1lKXJldHVybiBvO3JldHVybi0xfWZ1bmN0aW9uIFVzKHQpe2lmKHQuY2hpbGQpcmV0dXJuIHQuY2hpbGQ7aWYodC5uZXh0KXJldHVybiB0Lm5leHQ7Zm9yKDt0LnBhcmVudCYmIXQucGFyZW50Lm5leHQ7KXQ9dC5wYXJlbnQ7cmV0dXJuIHQucGFyZW50JiZ0LnBhcmVudC5uZXh0fWZ1bmN0aW9uIEdzKHQsZSl7Y29uc3Qgbj10WzFdLmNvbXBvbmVudHM7aWYobilmb3IobGV0IG89MDtvPG4ubGVuZ3RoO28rKyl7Y29uc3QgaT1uW29dO2lmKHJpKGksdClbOF09PT1lKXJldHVybiBpfWVsc2UgaWYocmkoZ28sdClbOF09PT1lKXJldHVybiBnbztyZXR1cm4tMX1mdW5jdGlvbiBXcyh0LGUsbil7Y29uc3Qgbz1lWzFdLmRhdGFbdF07bGV0IGk9by5kaXJlY3RpdmVTdGFydDtyZXR1cm4gMD09aT9XbjooIW4mJjImby5mbGFncyYmaSsrLGUuc2xpY2UoaSxvLmRpcmVjdGl2ZUVuZCkpfWZ1bmN0aW9uIFlzKHQpe3JldHVybiB0Lm5nT3JpZ2luYWxFcnJvcn1mdW5jdGlvbiBxcyh0LC4uLmUpe3QuZXJyb3IoLi4uZSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLyEoZnVuY3Rpb24odCl7dFt0Lk5PTkU9MF09Ik5PTkUiLHRbdC5IVE1MPTFdPSJIVE1MIix0W3QuU1RZTEU9Ml09IlNUWUxFIix0W3QuU0NSSVBUPTNdPSJTQ1JJUFQiLHRbdC5VUkw9NF09IlVSTCIsdFt0LlJFU09VUkNFX1VSTD01XT0iUkVTT1VSQ0VfVVJMIn0pKEFzfHwoQXM9e30pKTtjbGFzcyBac3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2NvbnNvbGU9Y29uc29sZX1oYW5kbGVFcnJvcih0KXtjb25zdCBlPXRoaXMuX2ZpbmRPcmlnaW5hbEVycm9yKHQpLG49dGhpcy5fZmluZENvbnRleHQodCksbz0oZnVuY3Rpb24gaSh0KXtyZXR1cm4gdCYmdC5uZ0Vycm9yTG9nZ2VyfHxxc30pKHQpO28odGhpcy5fY29uc29sZSwiRVJST1IiLHQpLGUmJm8odGhpcy5fY29uc29sZSwiT1JJR0lOQUwgRVJST1IiLGUpLG4mJm8odGhpcy5fY29uc29sZSwiRVJST1IgQ09OVEVYVCIsbil9X2ZpbmRDb250ZXh0KHQpe3JldHVybiB0PyhmdW5jdGlvbiBlKHQpe3JldHVybiB0Lm5nRGVidWdDb250ZXh0fSkodCl8fHRoaXMuX2ZpbmRDb250ZXh0KFlzKHQpKTpudWxsfV9maW5kT3JpZ2luYWxFcnJvcih0KXtsZXQgZT10JiZZcyh0KTtmb3IoO2UmJllzKGUpOyllPVlzKGUpO3JldHVybiBlfHxudWxsfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3QgWHM9e25hbWU6ImN1c3RvbS1lbGVtZW50cyJ9LEtzPXtuYW1lOiJuby1lcnJvcnMtc2NoZW1hIn0sSnM9L14+fF4tPnw8IS0tfC0tPnwtLSE+fDwhLSQvZyxRcz0vKDx8PikvO2Z1bmN0aW9uICRzKHQpe3JldHVybiB0LnJlcGxhY2UoSnMsKHQ9PnQucmVwbGFjZShRcywi4oCLJDHigIsiKSkpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiB0bCh0KXtpZighbmdEZXZNb2RlKXRocm93IG5ldyBFcnJvcigiTG9va3MgbGlrZSB3ZSBhcmUgaW4gJ3Byb2QgbW9kZScsIGJ1dCB3ZSBhcmUgY3JlYXRpbmcgYSBuYW1lZCBBcnJheSB0eXBlLCB3aGljaCBpcyB3cm9uZyEgQ2hlY2sgeW91ciBjb2RlIik7dHJ5e3JldHVybihmdW5jdGlvbiBlKC4uLnQpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlKXRocm93IG5ldyBFcnJvcigibmV3VHJ1c3RlZEZ1bmN0aW9uRm9yRGV2IHNob3VsZCBuZXZlciBiZSBjYWxsZWQgaW4gcHJvZHVjdGlvbiIpO2lmKCFqbi50cnVzdGVkVHlwZXMpcmV0dXJuIG5ldyBGdW5jdGlvbiguLi50KTtjb25zdCBlPWAoZnVuY3Rpb24gYW5vbnltb3VzKCR7dC5zbGljZSgwLC0xKS5qb2luKCIsIil9XG4pIHsgJHt0W3QubGVuZ3RoLTFdfVxufSlgLG49am4uZXZhbCgoZnVuY3Rpb24gbyh0KXt2YXIgZTtyZXR1cm4obnVsbD09PShlPWpyKCkpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmNyZWF0ZVNjcmlwdCh0KSl8fHR9KShlKSk7cmV0dXJuIHZvaWQgMD09PW4uYmluZD9uZXcgRnVuY3Rpb24oLi4udCk6KG4udG9TdHJpbmc9KCk9PmUsbi5iaW5kKGpuKSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLykoIkFycmF5IixgcmV0dXJuIGNsYXNzICR7dH0gZXh0ZW5kcyBBcnJheXt9YCkoQXJyYXkpfWNhdGNoKHQpe3JldHVybiBBcnJheX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NvbnN0IGVsPS8oW0EtWl0pL2csbmw9KCJ1bmRlZmluZWQiIT10eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lJiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHNldFRpbWVvdXQpLmJpbmQoam4pO2Z1bmN0aW9uIG9sKHQpe3JldHVybiB0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd9ZnVuY3Rpb24gaWwodCl7cmV0dXJuIHQub3duZXJEb2N1bWVudH1jb25zdCBhbD0i77+9IjtmdW5jdGlvbiBybCh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEZ1bmN0aW9uP3QoKTp0fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBzbCh0KXt0aHJvdyBuZXcgS2UoIjMwMCIsYE11bHRpcGxlIGNvbXBvbmVudHMgbWF0Y2ggbm9kZSB3aXRoIHRhZ25hbWUgJHt0LnZhbHVlfWApfWZ1bmN0aW9uIGxsKHQsZSxuLG8saSl7Y29uc3RbYSxyLC4uLnNdPW8uc3BsaXQoYWwpO2xldCBsPXIsYz1yO2ZvcihsZXQgbz0wO288cy5sZW5ndGg7bysrKXtjb25zdCBhPWUrbztsKz1gJHt0W2FdfSR7c1tvXX1gLGMrPWAke2E9PT1uP2k6dFthXX0ke3Nbb119YH1yZXR1cm57cHJvcE5hbWU6YSxvbGRWYWx1ZTpsLG5ld1ZhbHVlOmN9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KdmFyIGNsOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KbGV0IGRsO2Z1bmN0aW9uIHBsKHQsZSl7cmV0dXJuIGRsKHQsZSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBtbCh0KXtuZ0Rldk1vZGUmJlJvKHQpO2NvbnN0IGU9dFszXTtyZXR1cm4gX28oZSk/ZVszXTplfWZ1bmN0aW9uIHVsKHQpe2NvbnN0IGU9KGZ1bmN0aW9uIG4odCl7bmdEZXZNb2RlJiZobih0LCJjb21wb25lbnQiKTtsZXQgZT15byh0KT90OlZzKHQpO2Zvcig7ZSYmISg1MTImZVsyXSk7KWU9bWwoZSk7cmV0dXJuIG5nRGV2TW9kZSYmUm8oZSksZX0pKHQpO3JldHVybiBuZ0Rldk1vZGUmJmhuKGVbOF0sIlJvb3RWaWV3IGhhcyBubyBjb250ZXh0LiBQZXJoYXBzIGl0IGlzIGRpc2Nvbm5lY3RlZD8iKSxlWzhdfWZ1bmN0aW9uIGZsKHQpe3JldHVybiBobCh0WzEzXSl9ZnVuY3Rpb24gZ2wodCl7cmV0dXJuIGhsKHRbNF0pfWZ1bmN0aW9uIGhsKHQpe2Zvcig7bnVsbCE9PXQmJiFfbyh0KTspdD10WzRdO3JldHVybiB0fWZ1bmN0aW9uIGJsKHQsZSxuLG8saSl7aWYobnVsbCE9byl7bGV0IGEscj0hMTtfbyhvKT9hPW86eW8obykmJihyPSEwLG5nRGV2TW9kZSYmaG4ob1swXSwiSE9TVCBtdXN0IGJlIGRlZmluZWQgZm9yIGEgY29tcG9uZW50IExWaWV3Iiksbz1vWzBdKTtjb25zdCBzPWVpKG8pO25nRGV2TW9kZSYmISRvKGUpJiZ5bihzKSwwPT09dCYmbnVsbCE9PW4/bnVsbD09aT9EbChlLG4scyk6U2woZSxuLHMsaXx8bnVsbCwhMCk6MT09PXQmJm51bGwhPT1uP1NsKGUsbixzLGl8fG51bGwsITApOjI9PT10P1ZsKGUscyxyKTozPT09dCYmKG5nRGV2TW9kZSYmbmdEZXZNb2RlLnJlbmRlcmVyRGVzdHJveU5vZGUrKyxlLmRlc3Ryb3lOb2RlKHMpKSxudWxsIT1hJiYoZnVuY3Rpb24gYSh0LGUsbixvLGkpe25nRGV2TW9kZSYmRG8obik7Y29uc3QgYT1uWzddO2EhPT1laShuKSYmYmwoZSx0LG8sYSxpKTtmb3IobGV0IGk9Ym87aTxuLmxlbmd0aDtpKyspe2NvbnN0IHI9bltpXTtVbChyWzFdLHIsdCxlLG8sYSl9fSkoZSx0LGEsbixpKX19ZnVuY3Rpb24geWwodCxlKXtyZXR1cm4gbmdEZXZNb2RlJiZuZ0Rldk1vZGUucmVuZGVyZXJDcmVhdGVUZXh0Tm9kZSsrLG5nRGV2TW9kZSYmbmdEZXZNb2RlLnJlbmRlcmVyU2V0VGV4dCsrLCRvKHQpP3QuY3JlYXRlVGV4dChlKTp0LmNyZWF0ZVRleHROb2RlKGUpfWZ1bmN0aW9uIF9sKHQsZSxuKXtuZ0Rldk1vZGUmJm5nRGV2TW9kZS5yZW5kZXJlclNldFRleHQrKywkbyh0KT90LnNldFZhbHVlKGUsbik6ZS50ZXh0Q29udGVudD1ufWZ1bmN0aW9uIENsKHQsZSl7cmV0dXJuIG5nRGV2TW9kZSYmbmdEZXZNb2RlLnJlbmRlcmVyQ3JlYXRlQ29tbWVudCsrLHQuY3JlYXRlQ29tbWVudCgkcyhlKSl9ZnVuY3Rpb24gTWwodCxlLG4pe3JldHVybiBuZ0Rldk1vZGUmJm5nRGV2TW9kZS5yZW5kZXJlckNyZWF0ZUVsZW1lbnQrKywkbyh0KT90LmNyZWF0ZUVsZW1lbnQoZSxuKTpudWxsPT09bj90LmNyZWF0ZUVsZW1lbnQoZSk6dC5jcmVhdGVFbGVtZW50TlMobixlKX1mdW5jdGlvbiB2bCh0LGUpe25nRGV2TW9kZSYmRG8odCksbmdEZXZNb2RlJiZobih0WzldLCJBIHByb2plY3RlZCB2aWV3IHNob3VsZCBiZWxvbmcgdG8gYSBub24tZW1wdHkgcHJvamVjdGVkIHZpZXdzIGNvbGxlY3Rpb24iKTtjb25zdCBuPXRbOV0sbz1uLmluZGV4T2YoZSksaT1lWzNdO25nRGV2TW9kZSYmRG8oaSksMTAyNCZlWzJdJiYoZVsyXSY9LTEwMjUscGkoaSwtMSkpLG4uc3BsaWNlKG8sMSl9ZnVuY3Rpb24geGwodCxlKXtpZih0Lmxlbmd0aDw9Ym8pcmV0dXJuO2NvbnN0IG49Ym8rZSxvPXRbbl07aWYobyl7Y29uc3QgaT1vWzE3XTtudWxsIT09aSYmaSE9PXQmJnZsKGksbyksZT4wJiYodFtuLTFdWzRdPW9bNF0pO2NvbnN0IGE9b3IodCxibytlKTshKGZ1bmN0aW9uIGkodCxlKXtVbCh0LGUsZVsxMV0sMixudWxsLG51bGwpLGVbMF09bnVsbCxlWzZdPW51bGx9KShvWzFdLG8pO2NvbnN0IHI9YVsxOV07bnVsbCE9PXImJnIuZGV0YWNoVmlldyhhWzFdKSxvWzNdPW51bGwsb1s0XT1udWxsLG9bMl0mPS0xMjl9cmV0dXJuIG99ZnVuY3Rpb24gT2wodCxlKXtpZighKDI1NiZlWzJdKSl7Y29uc3Qgbj1lWzExXTskbyhuKSYmbi5kZXN0cm95Tm9kZSYmVWwodCxlLG4sMyxudWxsLG51bGwpLChmdW5jdGlvbiBuKHQpe2xldCBlPXRbMTNdO2lmKCFlKXJldHVybiBQbCh0WzFdLHQpO2Zvcig7ZTspe2xldCBuPW51bGw7aWYoeW8oZSkpbj1lWzEzXTtlbHNle25nRGV2TW9kZSYmRG8oZSk7Y29uc3QgdD1lWzEwXTt0JiYobj10KX1pZighbil7Zm9yKDtlJiYhZVs0XSYmZSE9PXQ7KXlvKGUpJiZQbChlWzFdLGUpLGU9ZVszXTtudWxsPT09ZSYmKGU9dCkseW8oZSkmJlBsKGVbMV0sZSksbj1lJiZlWzRdfWU9bn19KShlKX19ZnVuY3Rpb24gUGwodCxlKXtpZighKDI1NiZlWzJdKSl7ZVsyXSY9LTEyOSxlWzJdfD0yNTYsKGZ1bmN0aW9uIG4odCxlKXtsZXQgbjtpZihudWxsIT10JiZudWxsIT0obj10LmRlc3Ryb3lIb29rcykpZm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0Kz0yKXtjb25zdCBvPWVbblt0XV07aWYoIShvIGluc3RhbmNlb2YgbmEpKXtjb25zdCBlPW5bdCsxXTtpZihBcnJheS5pc0FycmF5KGUpKWZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCs9Mil7Y29uc3Qgbj1vW2VbdF1dLGk9ZVt0KzFdO3FvKDQsbixpKTt0cnl7aS5jYWxsKG4pfWZpbmFsbHl7cW8oNSxuLGkpfX1lbHNle3FvKDQsbyxlKTt0cnl7ZS5jYWxsKG8pfWZpbmFsbHl7cW8oNSxvLGUpfX19fX0pKHQsZSksKGZ1bmN0aW9uIG8odCxlKXtjb25zdCBuPXQuY2xlYW51cCxvPWVbN107bGV0IGk9LTE7aWYobnVsbCE9PW4pZm9yKGxldCB0PTA7dDxuLmxlbmd0aC0xO3QrPTIpaWYoInN0cmluZyI9PXR5cGVvZiBuW3RdKXtjb25zdCBhPW5bdCsxXSxyPSJmdW5jdGlvbiI9PXR5cGVvZiBhP2EoZSk6ZWkoZVthXSkscz1vW2k9blt0KzJdXSxsPW5bdCszXTsiYm9vbGVhbiI9PXR5cGVvZiBsP3IucmVtb3ZlRXZlbnRMaXN0ZW5lcihuW3RdLHMsbCk6bD49MD9vW2k9bF0oKTpvW2k9LWxdLnVuc3Vic2NyaWJlKCksdCs9Mn1lbHNle2NvbnN0IGU9b1tpPW5bdCsxXV07blt0XS5jYWxsKGUpfWlmKG51bGwhPT1vKXtmb3IobGV0IHQ9aSsxO3Q8by5sZW5ndGg7dCsrKXtjb25zdCBlPW9bdF07bmdEZXZNb2RlJiYoIkV4cGVjdGluZyBpbnN0YW5jZSBjbGVhbnVwIGZ1bmN0aW9uLiIsImZ1bmN0aW9uIiE9dHlwZW9mKGE9ZSkmJmJuKCJFeHBlY3RpbmcgaW5zdGFuY2UgY2xlYW51cCBmdW5jdGlvbi4iLG51bGw9PT1hPyJudWxsIjp0eXBlb2YgYSwiZnVuY3Rpb24iLCI9PT0iKSksZSgpfWVbN109bnVsbH12YXIgYX0pKHQsZSksMT09PWVbMV0udHlwZSYmJG8oZVsxMV0pJiYobmdEZXZNb2RlJiZuZ0Rldk1vZGUucmVuZGVyZXJEZXN0cm95KyssZVsxMV0uZGVzdHJveSgpKTtjb25zdCBuPWVbMTddO2lmKG51bGwhPT1uJiZfbyhlWzNdKSl7biE9PWVbM10mJnZsKG4sZSk7Y29uc3Qgbz1lWzE5XTtudWxsIT09byYmby5kZXRhY2hWaWV3KHQpfX19ZnVuY3Rpb24gd2wodCxlLG4pe3JldHVybiBrbCh0LGUucGFyZW50LG4pfWZ1bmN0aW9uIGtsKHQsZSxuKXtsZXQgbz1lO2Zvcig7bnVsbCE9PW8mJjQwJm8udHlwZTspbz0oZT1vKS5wYXJlbnQ7aWYobnVsbD09PW8pcmV0dXJuIG5bMF07aWYobmdEZXZNb2RlJiZpYShvLDcpLDImby5mbGFncyl7bmdEZXZNb2RlJiZPbyhvLG4pO2NvbnN0IGU9dC5kYXRhW28uZGlyZWN0aXZlU3RhcnRdLmVuY2Fwc3VsYXRpb247aWYoZT09PUhuLk5vbmV8fGU9PT1Ibi5FbXVsYXRlZClyZXR1cm4gbnVsbH1yZXR1cm4gb2kobyxuKX1mdW5jdGlvbiBTbCh0LGUsbixvLGkpe25nRGV2TW9kZSYmbmdEZXZNb2RlLnJlbmRlcmVySW5zZXJ0QmVmb3JlKyssJG8odCk/dC5pbnNlcnRCZWZvcmUoZSxuLG8saSk6ZS5pbnNlcnRCZWZvcmUobixvLGkpfWZ1bmN0aW9uIERsKHQsZSxuKXtuZ0Rldk1vZGUmJm5nRGV2TW9kZS5yZW5kZXJlckFwcGVuZENoaWxkKyssbmdEZXZNb2RlJiZobihlLCJwYXJlbnQgbm9kZSBtdXN0IGJlIGRlZmluZWQiKSwkbyh0KT90LmFwcGVuZENoaWxkKGUsbik6ZS5hcHBlbmRDaGlsZChuKX1mdW5jdGlvbiBFbCh0LGUsbixvLGkpe251bGwhPT1vP1NsKHQsZSxuLG8saSk6RGwodCxlLG4pfWZ1bmN0aW9uIFJsKHQsZSl7cmV0dXJuICRvKHQpP3QucGFyZW50Tm9kZShlKTplLnBhcmVudE5vZGV9ZnVuY3Rpb24gQWwodCxlLG4pe3JldHVybiB6bCh0LGUsbil9ZnVuY3Rpb24gVGwodCxlLG4pe3JldHVybiA0MCZ0LnR5cGU/b2kodCxuKTpudWxsfSEoZnVuY3Rpb24odCl7dFt0LkltcG9ydGFudD0xXT0iSW1wb3J0YW50Iix0W3QuRGFzaENhc2U9Ml09IkRhc2hDYXNlIn0pKGNsfHwoY2w9e30pKTtsZXQgTmwsemw9VGw7ZnVuY3Rpb24gSWwodCxlKXt6bD10LE5sPWV9ZnVuY3Rpb24gSGwodCxlLG4sbyl7Y29uc3QgaT13bCh0LG8sZSksYT1lWzExXSxyPUFsKG8ucGFyZW50fHxlWzZdLG8sZSk7aWYobnVsbCE9aSlpZihBcnJheS5pc0FycmF5KG4pKWZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKUVsKGEsaSxuW3RdLHIsITEpO2Vsc2UgRWwoYSxpLG4sciwhMSk7dm9pZCAwIT09TmwmJk5sKGEsbyxlLG4saSl9ZnVuY3Rpb24gRmwodCxlKXtpZihudWxsIT09ZSl7bmdEZXZNb2RlJiZpYShlLDYzKTtjb25zdCBuPWUudHlwZTtpZigzJm4pcmV0dXJuIG9pKGUsdCk7aWYoNCZuKXJldHVybiBCbCgtMSx0W2UuaW5kZXhdKTtpZig4Jm4pe2NvbnN0IG49ZS5jaGlsZDtpZihudWxsIT09bilyZXR1cm4gRmwodCxuKTt7Y29uc3Qgbj10W2UuaW5kZXhdO3JldHVybiBfbyhuKT9CbCgtMSxuKTplaShuKX19aWYoMzImbilyZXR1cm4gcGwoZSx0KSgpfHxlaSh0W2UuaW5kZXhdKTt7Y29uc3Qgbj1MbCh0LGUpO2lmKG51bGwhPT1uKXtpZihBcnJheS5pc0FycmF5KG4pKXJldHVybiBuWzBdO2NvbnN0IGU9bWwodFsxNl0pO3JldHVybiBuZ0Rldk1vZGUmJklvKGUpLEZsKGUsbil9cmV0dXJuIEZsKHQsZS5uZXh0KX19cmV0dXJuIG51bGx9ZnVuY3Rpb24gTGwodCxlKXtpZihudWxsIT09ZSl7Y29uc3Qgbj10WzE2XVs2XSxvPWUucHJvamVjdGlvbjtyZXR1cm4gbmdEZXZNb2RlJiYoZnVuY3Rpb24gbih0LGUpe2huKHRbMTZdLCJDb21wb25lbnQgdmlld3Mgc2hvdWxkIGV4aXN0LiIpLGhuKHRbMTZdWzZdLnByb2plY3Rpb24sZXx8IkNvbXBvbmVudHMgd2l0aCBwcm9qZWN0aW9uIG5vZGVzICg8bmctY29udGVudD4pIG11c3QgaGF2ZSBwcm9qZWN0aW9uIHNsb3RzIGRlZmluZWQuIil9KSh0KSxuLnByb2plY3Rpb25bb119cmV0dXJuIG51bGx9ZnVuY3Rpb24gQmwodCxlKXtjb25zdCBuPWJvK3QrMTtpZihuPGUubGVuZ3RoKXtjb25zdCB0PWVbbl0sbz10WzFdLmZpcnN0Q2hpbGQ7aWYobnVsbCE9PW8pcmV0dXJuIEZsKHQsbyl9cmV0dXJuIGVbN119ZnVuY3Rpb24gVmwodCxlLG4pe25nRGV2TW9kZSYmbmdEZXZNb2RlLnJlbmRlcmVyUmVtb3ZlTm9kZSsrO2NvbnN0IG89UmwodCxlKTtvJiYoZnVuY3Rpb24gaSh0LGUsbixvKXskbyh0KT90LnJlbW92ZUNoaWxkKGUsbixvKTplLnJlbW92ZUNoaWxkKG4pfSkodCxvLGUsbil9ZnVuY3Rpb24gamwodCxlLG4sbyxpLGEscil7Zm9yKDtudWxsIT1uOyl7bmdEZXZNb2RlJiZPbyhuLG8pLG5nRGV2TW9kZSYmaWEobiw2Myk7Y29uc3Qgcz1vW24uaW5kZXhdLGw9bi50eXBlO2lmKHImJjA9PT1lJiYocyYmTHMoZWkocyksbyksbi5mbGFnc3w9NCksNjQhPSg2NCZuLmZsYWdzKSlpZig4JmwpamwodCxlLG4uY2hpbGQsbyxpLGEsITEpLGJsKGUsdCxpLHMsYSk7ZWxzZSBpZigzMiZsKXtjb25zdCByPXBsKG4sbyk7bGV0IGw7Zm9yKDtsPXIoKTspYmwoZSx0LGksbCxhKTtibChlLHQsaSxzLGEpfWVsc2UgMTYmbD9HbCh0LGUsbyxuLGksYSk6KG5nRGV2TW9kZSYmaWEobiw3KSxibChlLHQsaSxzLGEpKTtuPXI/bi5wcm9qZWN0aW9uTmV4dDpuLm5leHR9fWZ1bmN0aW9uIFVsKHQsZSxuLG8saSxhKXtqbChuLG8sdC5maXJzdENoaWxkLGUsaSxhLCExKX1mdW5jdGlvbiBHbCh0LGUsbixvLGksYSl7Y29uc3Qgcj1uWzE2XSxzPXJbNl07bmdEZXZNb2RlJiZsbih0eXBlb2Ygby5wcm9qZWN0aW9uLCJudW1iZXIiLCJleHBlY3RpbmcgcHJvamVjdGlvbiBpbmRleCIpO2NvbnN0IGw9cy5wcm9qZWN0aW9uW28ucHJvamVjdGlvbl07aWYoQXJyYXkuaXNBcnJheShsKSlmb3IobGV0IG49MDtuPGwubGVuZ3RoO24rKylibChlLHQsaSxsW25dLGEpO2Vsc2UgamwodCxlLGwsclszXSxpLGEsITApfWZ1bmN0aW9uIFdsKHQsZSxuKXtuZ0Rldk1vZGUmJnNuKG4sIiduZXdWYWx1ZScgc2hvdWxkIGJlIGEgc3RyaW5nIiksJG8odCk/dC5zZXRBdHRyaWJ1dGUoZSwic3R5bGUiLG4pOmUuc3R5bGUuY3NzVGV4dD1uLG5nRGV2TW9kZSYmbmdEZXZNb2RlLnJlbmRlcmVyU2V0U3R5bGUrK31mdW5jdGlvbiBZbCh0LGUsbil7bmdEZXZNb2RlJiZzbihuLCInbmV3VmFsdWUnIHNob3VsZCBiZSBhIHN0cmluZyIpLCRvKHQpPyIiPT09bj90LnJlbW92ZUF0dHJpYnV0ZShlLCJjbGFzcyIpOnQuc2V0QXR0cmlidXRlKGUsImNsYXNzIixuKTplLmNsYXNzTmFtZT1uLG5nRGV2TW9kZSYmbmdEZXZNb2RlLnJlbmRlcmVyU2V0Q2xhc3NOYW1lKyt9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIHFsKHQsZSxuKXtuZ0Rldk1vZGUmJmNuKGUsIiIsJ2NhbiBub3QgbG9vayBmb3IgIiIgc3RyaW5nLicpO2xldCBvPXQubGVuZ3RoO2Zvcig7Oyl7Y29uc3QgaT10LmluZGV4T2YoZSxuKTtpZigtMT09PWkpcmV0dXJuIGk7aWYoMD09PWl8fHQuY2hhckNvZGVBdChpLTEpPD0zMil7Y29uc3Qgbj1lLmxlbmd0aDtpZihpK249PT1vfHx0LmNoYXJDb2RlQXQoaStuKTw9MzIpcmV0dXJuIGl9bj1pKzF9fWNvbnN0IFpsPSJuZy10ZW1wbGF0ZSI7ZnVuY3Rpb24gWGwodCxlLG4pe25nRGV2TW9kZSYmbG4oZSxlLnRvTG93ZXJDYXNlKCksIkNsYXNzIG5hbWUgZXhwZWN0ZWQgdG8gYmUgbG93ZXJjYXNlLiIpO2xldCBvPTA7Zm9yKDtvPHQubGVuZ3RoOyl7bGV0IGk9dFtvKytdO2lmKG4mJiJjbGFzcyI9PT1pKXtpZihpPXRbb10sLTEhPT1xbChpLnRvTG93ZXJDYXNlKCksZSwwKSlyZXR1cm4hMH1lbHNlIGlmKDE9PT1pKXtmb3IoO288dC5sZW5ndGgmJiJzdHJpbmciPT10eXBlb2YoaT10W28rK10pOylpZihpLnRvTG93ZXJDYXNlKCk9PT1lKXJldHVybiEwO3JldHVybiExfX1yZXR1cm4hMX1mdW5jdGlvbiBLbCh0KXtyZXR1cm4gND09PXQudHlwZSYmdC52YWx1ZSE9PVpsfWZ1bmN0aW9uIEpsKHQsZSxuKXtyZXR1cm4gZT09PSg0IT09dC50eXBlfHxuP3QudmFsdWU6WmwpfWZ1bmN0aW9uIFFsKHQsZSxuKXtuZ0Rldk1vZGUmJmhuKGVbMF0sIlNlbGVjdG9yIHNob3VsZCBoYXZlIGEgdGFnIG5hbWUiKTtsZXQgbz00O2NvbnN0IGk9dC5hdHRyc3x8W10sYT0oZnVuY3Rpb24gcih0KXtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKylpZihyYSh0W2VdKSlyZXR1cm4gZTtyZXR1cm4gdC5sZW5ndGh9KShpKTtsZXQgcz0hMTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKyl7Y29uc3QgbD1lW3JdO2lmKCJudW1iZXIiIT10eXBlb2YgbCl7aWYoIXMpaWYoNCZvKXtpZihvPTJ8MSZvLCIiIT09bCYmIUpsKHQsbCxuKXx8IiI9PT1sJiYxPT09ZS5sZW5ndGgpe2lmKCRsKG8pKXJldHVybiExO3M9ITB9fWVsc2V7Y29uc3QgYz04Jm8/bDplWysrcl07aWYoOCZvJiZudWxsIT09dC5hdHRycyl7aWYoIVhsKHQuYXR0cnMsYyxuKSl7aWYoJGwobykpcmV0dXJuITE7cz0hMH1jb250aW51ZX1jb25zdCBkPXRjKDgmbz8iY2xhc3MiOmwsaSxLbCh0KSxuKTtpZigtMT09PWQpe2lmKCRsKG8pKXJldHVybiExO3M9ITA7Y29udGludWV9aWYoIiIhPT1jKXtsZXQgdDtkPmE/dD0iIjoobmdEZXZNb2RlJiZjbihpW2RdLDAsIldlIGRvIG5vdCBtYXRjaCBkaXJlY3RpdmVzIG9uIG5hbWVzcGFjZWQgYXR0cmlidXRlcyIpLHQ9aVtkKzFdLnRvTG93ZXJDYXNlKCkpO2NvbnN0IGU9OCZvP3Q6bnVsbDtpZihlJiYtMSE9PXFsKGUsYywwKXx8MiZvJiZjIT09dCl7aWYoJGwobykpcmV0dXJuITE7cz0hMH19fX1lbHNle2lmKCFzJiYhJGwobykmJiEkbChsKSlyZXR1cm4hMTtpZihzJiYkbChsKSljb250aW51ZTtzPSExLG89bHwxJm99fXJldHVybiAkbChvKXx8c31mdW5jdGlvbiAkbCh0KXtyZXR1cm4gMD09KDEmdCl9ZnVuY3Rpb24gdGModCxlLG4sbyl7aWYobnVsbD09PWUpcmV0dXJuLTE7bGV0IGk9MDtpZihvfHwhbil7bGV0IG49ITE7Zm9yKDtpPGUubGVuZ3RoOyl7Y29uc3Qgbz1lW2ldO2lmKG89PT10KXJldHVybiBpO2lmKDM9PT1vfHw2PT09byluPSEwO2Vsc2V7aWYoMT09PW98fDI9PT1vKXtsZXQgdD1lWysraV07Zm9yKDsic3RyaW5nIj09dHlwZW9mIHQ7KXQ9ZVsrK2ldO2NvbnRpbnVlfWlmKDQ9PT1vKWJyZWFrO2lmKDA9PT1vKXtpKz00O2NvbnRpbnVlfX1pKz1uPzE6Mn1yZXR1cm4tMX1yZXR1cm4oZnVuY3Rpb24gYSh0LGUpe2xldCBuPXQuaW5kZXhPZig0KTtpZihuPi0xKWZvcihuKys7bjx0Lmxlbmd0aDspe2NvbnN0IG89dFtuXTtpZigibnVtYmVyIj09dHlwZW9mIG8pcmV0dXJuLTE7aWYobz09PWUpcmV0dXJuIG47bisrfXJldHVybi0xfSkoZSx0KX1mdW5jdGlvbiBlYyh0LGUsbj0hMSl7Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDtvKyspaWYoUWwodCxlW29dLG4pKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIG5jKHQsZSl7dDpmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7Y29uc3Qgbz1lW25dO2lmKHQubGVuZ3RoPT09by5sZW5ndGgpe2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKHRbZV0hPT1vW2VdKWNvbnRpbnVlIHQ7cmV0dXJuITB9fXJldHVybiExfWZ1bmN0aW9uIG9jKHQsZSl7cmV0dXJuIHQ/Ijpub3QoIitlLnRyaW0oKSsiKSI6ZX1mdW5jdGlvbiBpYyh0KXtsZXQgZT10WzBdLG49MSxvPTIsaT0iIixhPSExO2Zvcig7bjx0Lmxlbmd0aDspe2xldCByPXRbbl07aWYoInN0cmluZyI9PXR5cGVvZiByKWlmKDImbyl7Y29uc3QgZT10Wysrbl07aSs9IlsiK3IrKGUubGVuZ3RoPjA/Jz0iJytlKyciJzoiIikrIl0ifWVsc2UgOCZvP2krPSIuIityOjQmbyYmKGkrPSIgIityKTtlbHNlIiI9PT1pfHwkbChyKXx8KGUrPW9jKGEsaSksaT0iIiksbz1yLGE9YXx8ISRsKG8pO24rK31yZXR1cm4iIiE9PWkmJihlKz1vYyhhLGkpKSxlfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgYWM9InVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZT97X19icmFuZF9fOiJOT19DSEFOR0UifTp7fTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gcmModCl7bmdEZXZNb2RlJiZmbih0LDAsIkNhbiBvbmx5IGFkdmFuY2UgZm9yd2FyZCIpLHNjKGdpKCksZmkoKSxHaSgpK3QseGkoKSl9ZnVuY3Rpb24gc2ModCxlLG4sbyl7aWYobmdEZXZNb2RlJiYoZnVuY3Rpb24gaSh0LGUpe3pvKGdvLHRbMV0uYmluZGluZ1N0YXJ0SW5kZXgsZSl9KShlLG4pLCFvKWlmKDM9PSgzJmVbMl0pKXtjb25zdCBvPXQucHJlT3JkZXJDaGVja0hvb2tzO251bGwhPT1vJiZLaShlLG8sbil9ZWxzZXtjb25zdCBvPXQucHJlT3JkZXJIb29rcztudWxsIT09byYmSmkoZSxvLDAsbil9V2kobil9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIGxjKHQsZSl7cmV0dXJuIG5nRGV2TW9kZSYmcm4odCwwLDMyNzY3KSxuZ0Rldk1vZGUmJnJuKGUsMCwzMjc2NyksdDw8MTd8ZTw8Mn1mdW5jdGlvbiBjYyh0KXtyZXR1cm4gbmdEZXZNb2RlJiZhbih0LCJleHBlY3RlZCBudW1iZXIiKSx0Pj4xNyYzMjc2N31mdW5jdGlvbiBkYyh0KXtyZXR1cm4gbmdEZXZNb2RlJiZhbih0LCJleHBlY3RlZCBudW1iZXIiKSwyPT0oMiZ0KX1mdW5jdGlvbiBwYyh0KXtyZXR1cm4gbmdEZXZNb2RlJiZhbih0LCJleHBlY3RlZCBudW1iZXIiKSwyfHR9ZnVuY3Rpb24gbWModCl7cmV0dXJuIG5nRGV2TW9kZSYmYW4odCwiZXhwZWN0ZWQgbnVtYmVyIiksKDEzMTA2OCZ0KT4+Mn1mdW5jdGlvbiB1Yyh0LGUpe3JldHVybiBuZ0Rldk1vZGUmJmFuKHQsImV4cGVjdGVkIG51bWJlciIpLG5nRGV2TW9kZSYmcm4oZSwwLDMyNzY3KSwtMTMxMDY5JnR8ZTw8Mn1mdW5jdGlvbiBmYyh0KXtyZXR1cm4gbmdEZXZNb2RlJiZhbih0LCJleHBlY3RlZCBudW1iZXIiKSwxPT0oMSZ0KX1mdW5jdGlvbiBnYyh0KXtyZXR1cm4gbmdEZXZNb2RlJiZhbih0LCJleHBlY3RlZCBudW1iZXIiKSwxfHR9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIGhjKHQsZSl7aWYoIW5nRGV2TW9kZSl0aHJvdyBuZXcgRXJyb3IoIlRoaXMgbWV0aG9kIHNob3VsZCBiZSBndWFyZGVkIHdpdGggYG5nRGV2TW9kZWAgc28gdGhhdCBpdCBjYW4gYmUgdHJlZSBzaGFrZW4gaW4gcHJvZHVjdGlvbiEiKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiZGVidWciLHt2YWx1ZTplLGVudW1lcmFibGU6ITF9KX1mdW5jdGlvbiBiYyh0LGUpe2lmKCFuZ0Rldk1vZGUpdGhyb3cgbmV3IEVycm9yKCJUaGlzIG1ldGhvZCBzaG91bGQgYmUgZ3VhcmRlZCB3aXRoIGBuZ0Rldk1vZGVgIHNvIHRoYXQgaXQgY2FuIGJlIHRyZWUgc2hha2VuIGluIHByb2R1Y3Rpb24hIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImRlYnVnIix7Z2V0OmUsZW51bWVyYWJsZTohMX0pfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCB5Yz0oInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fCEhbmdEZXZNb2RlKSYmVW4oKTtsZXQgX2MsQ2MsTWM7ZnVuY3Rpb24gdmModCl7aWYobnVsbD09dClyZXR1cm4iIjtjb25zdCBlPXQubGFzdEluZGV4T2YoIl9UZW1wbGF0ZSIpO3JldHVybiJfIisoLTE9PT1lP3Q6dC5zdWJzdHIoMCxlKSl9ZnVuY3Rpb24geGModCxlKXtjb25zdCBuPXQudFZpZXdfLmRhdGEsbz1bXSxpPWU/dC5jbGFzc0JpbmRpbmdzOnQuc3R5bGVCaW5kaW5ncyxhPWNjKGkpLHI9bWMoaSk7bGV0IHM9MCE9PXIsbD1zP3I6YTtmb3IoOzAhPT1sOyl7Y29uc3QgdD1uW2wrMV07by51bnNoaWZ0KHtrZXk6bltsXSxpbmRleDpsLGlzVGVtcGxhdGU6cyxwcmV2RHVwbGljYXRlOmRjKHQpLG5leHREdXBsaWNhdGU6ZmModCksbmV4dEluZGV4Om1jKHQpLHByZXZJbmRleDpjYyh0KX0pLGw9PT1hJiYocz0hMSksbD1jYyh0KX1yZXR1cm4gby5wdXNoKChlP3QucmVzaWR1YWxDbGFzc2VzOnQucmVzaWR1YWxTdHlsZXMpfHxudWxsKSxvfWZ1bmN0aW9uIE9jKHQsZSl7Zm9yKDt0OyllLnB1c2godC50ZW1wbGF0ZV8pLHQ9dC5uZXh0fWNvbnN0IFBjPXljJiZ0bCgiVFZpZXdEYXRhIil8fG51bGw7bGV0IHdjO2NvbnN0IGtjPXljJiZ0bCgiTFZpZXdCbHVlcHJpbnQiKXx8bnVsbCxTYz15YyYmdGwoIk1hdGNoZXNBcnJheSIpfHxudWxsLERjPXljJiZ0bCgiVFZpZXdDb21wb25lbnRzIil8fG51bGwsRWM9eWMmJnRsKCJUTm9kZUxvY2FsTmFtZXMiKXx8bnVsbCxSYz15YyYmdGwoIlROb2RlSW5pdGlhbElucHV0cyIpfHxudWxsO3ljJiZ0bCgiVE5vZGVJbml0aWFsRGF0YSIpO2NvbnN0IEFjPXljJiZ0bCgiTENsZWFudXAiKXx8bnVsbCxUYz15YyYmdGwoIlRDbGVhbnVwIil8fG51bGw7ZnVuY3Rpb24gTmModCl7aWYodCl7Y29uc3QgZT10LmRlYnVnO3JldHVybiBobihlLCJPYmplY3QgZG9lcyBub3QgaGF2ZSBhIGRlYnVnIHJlcHJlc2VudGF0aW9uLiIpLGV9cmV0dXJuIHR9ZnVuY3Rpb24gemModCxlPSExKXtjb25zdCBuPWVpKHQpO2lmKG4pc3dpdGNoKG4ubm9kZVR5cGUpe2Nhc2UgTm9kZS5URVhUX05PREU6cmV0dXJuIG4udGV4dENvbnRlbnQ7Y2FzZSBOb2RlLkNPTU1FTlRfTk9ERTpyZXR1cm5gXHgzYyEtLSR7bi50ZXh0Q29udGVudH0tLVx4M2VgO2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Y29uc3QgdD1uLm91dGVySFRNTDtyZXR1cm4gZT90OnQuc3BsaXQoIj4iK24uaW5uZXJIVE1MKyI8IilbMF0rIj4ifXJldHVybiBudWxsfWNsYXNzIElje2NvbnN0cnVjdG9yKHQpe3RoaXMuX3Jhd19sVmlldz10fWdldCBmbGFncygpe2NvbnN0IHQ9dGhpcy5fcmF3X2xWaWV3WzJdO3JldHVybntfX3Jhd19fZmxhZ3NfXzp0LGluaXRQaGFzZVN0YXRlOjMmdCxjcmVhdGlvbk1vZGU6ISEoNCZ0KSxmaXJzdFZpZXdQYXNzOiEhKDgmdCksY2hlY2tBbHdheXM6ISEoMTYmdCksZGlydHk6ISEoNjQmdCksYXR0YWNoZWQ6ISEoMTI4JnQpLGRlc3Ryb3llZDohISgyNTYmdCksaXNSb290OiEhKDUxMiZ0KSxpbmRleFdpdGhpbkluaXRQaGFzZTp0Pj4xMX19Z2V0IHBhcmVudCgpe3JldHVybiBOYyh0aGlzLl9yYXdfbFZpZXdbM10pfWdldCBob3N0SFRNTCgpe3JldHVybiB6Yyh0aGlzLl9yYXdfbFZpZXdbMF0sITApfWdldCBodG1sKCl7cmV0dXJuKHRoaXMubm9kZXN8fFtdKS5tYXAoSGMpLmpvaW4oIiIpfWdldCBjb250ZXh0KCl7cmV0dXJuIHRoaXMuX3Jhd19sVmlld1s4XX1nZXQgbm9kZXMoKXtjb25zdCB0PXRoaXMuX3Jhd19sVmlldztyZXR1cm4gTGModFsxXS5maXJzdENoaWxkLHQpfWdldCB0ZW1wbGF0ZSgpe3JldHVybiB0aGlzLnRWaWV3LnRlbXBsYXRlX31nZXQgdFZpZXcoKXtyZXR1cm4gdGhpcy5fcmF3X2xWaWV3WzFdfWdldCBjbGVhbnVwKCl7cmV0dXJuIHRoaXMuX3Jhd19sVmlld1s3XX1nZXQgaW5qZWN0b3IoKXtyZXR1cm4gdGhpcy5fcmF3X2xWaWV3WzldfWdldCByZW5kZXJlckZhY3RvcnkoKXtyZXR1cm4gdGhpcy5fcmF3X2xWaWV3WzEwXX1nZXQgcmVuZGVyZXIoKXtyZXR1cm4gdGhpcy5fcmF3X2xWaWV3WzExXX1nZXQgc2FuaXRpemVyKCl7cmV0dXJuIHRoaXMuX3Jhd19sVmlld1sxMl19Z2V0IGNoaWxkSGVhZCgpe3JldHVybiBOYyh0aGlzLl9yYXdfbFZpZXdbMTNdKX1nZXQgbmV4dCgpe3JldHVybiBOYyh0aGlzLl9yYXdfbFZpZXdbNF0pfWdldCBjaGlsZFRhaWwoKXtyZXR1cm4gTmModGhpcy5fcmF3X2xWaWV3WzE0XSl9Z2V0IGRlY2xhcmF0aW9uVmlldygpe3JldHVybiBOYyh0aGlzLl9yYXdfbFZpZXdbMTVdKX1nZXQgcXVlcmllcygpe3JldHVybiB0aGlzLl9yYXdfbFZpZXdbMTldfWdldCB0SG9zdCgpe3JldHVybiB0aGlzLl9yYXdfbFZpZXdbNl19Z2V0IGRlY2xzKCl7cmV0dXJuIEZjKHRoaXMudFZpZXcsdGhpcy5fcmF3X2xWaWV3LGdvLHRoaXMudFZpZXcuYmluZGluZ1N0YXJ0SW5kZXgpfWdldCB2YXJzKCl7cmV0dXJuIEZjKHRoaXMudFZpZXcsdGhpcy5fcmF3X2xWaWV3LHRoaXMudFZpZXcuYmluZGluZ1N0YXJ0SW5kZXgsdGhpcy50Vmlldy5leHBhbmRvU3RhcnRJbmRleCl9Z2V0IGV4cGFuZG8oKXtyZXR1cm4gRmModGhpcy50Vmlldyx0aGlzLl9yYXdfbFZpZXcsdGhpcy50Vmlldy5leHBhbmRvU3RhcnRJbmRleCx0aGlzLl9yYXdfbFZpZXcubGVuZ3RoKX1nZXQgY2hpbGRWaWV3cygpe2NvbnN0IHQ9W107bGV0IGU9dGhpcy5jaGlsZEhlYWQ7Zm9yKDtlOyl0LnB1c2goZSksZT1lLm5leHQ7cmV0dXJuIHR9fWZ1bmN0aW9uIEhjKHQpe2lmKCJFbGVtZW50Q29udGFpbmVyIj09PXQudHlwZSlyZXR1cm4odC5jaGlsZHJlbnx8W10pLm1hcChIYykuam9pbigiIik7aWYoIkljdUNvbnRhaW5lciI9PT10LnR5cGUpdGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQiKTtyZXR1cm4gemModC5uYXRpdmUsITApfHwiIn1mdW5jdGlvbiBGYyh0LGUsbixvKXtsZXQgaT1bXTtmb3IobGV0IGE9bjthPG87YSsrKWkucHVzaCh7aW5kZXg6YSx0OnQuZGF0YVthXSxsOmVbYV19KTtyZXR1cm57c3RhcnQ6bixlbmQ6byxsZW5ndGg6by1uLGNvbnRlbnQ6aX19ZnVuY3Rpb24gTGModCxlKXtpZih0KXtjb25zdCBuPVtdO2xldCBvPXQ7Zm9yKDtvOyluLnB1c2goQmMobyxlKSksbz1vLm5leHQ7cmV0dXJuIG59cmV0dXJuW119ZnVuY3Rpb24gQmModCxlKXtjb25zdCBuPWVpKGVbdC5pbmRleF0pLG89W10saT1bXSxhPWVbMV07Zm9yKGxldCBuPXQuZGlyZWN0aXZlU3RhcnQ7bjx0LmRpcmVjdGl2ZUVuZDtuKyspby5wdXNoKGEuZGF0YVtuXS50eXBlKSxpLnB1c2goZVtuXSk7cmV0dXJue2h0bWw6emMobiksdHlwZTpvYSh0LnR5cGUpLHROb2RlOnQsbmF0aXZlOm4sY2hpbGRyZW46TGModC5jaGlsZCxlKSxmYWN0b3JpZXM6byxpbnN0YW5jZXM6aSxpbmplY3RvcjpWYyh0LGEsZSksZ2V0IGluamVjdG9yUmVzb2x1dGlvblBhdGgoKXtyZXR1cm4gdC5kZWJ1Z05vZGVJbmplY3RvclBhdGgoZSl9fX1mdW5jdGlvbiBWYyh0LGUsbil7Y29uc3Qgbz1bXTtmb3IobGV0IG49dC5wcm92aWRlckluZGV4U3RhcnRfO248dC5wcm92aWRlckluZGV4RW5kXztuKyspby5wdXNoKGUuZGF0YVtuXSk7Y29uc3QgaT1bXTtmb3IobGV0IG49dC5wcm92aWRlckluZGV4RW5kXztuPHQuZGlyZWN0aXZlRW5kO24rKylpLnB1c2goZS5kYXRhW25dKTtyZXR1cm57Ymxvb206VWMobix0LmluamVjdG9ySW5kZXgpLGN1bXVsYXRpdmVCbG9vbTpVYyhlLmRhdGEsdC5pbmplY3RvckluZGV4KSxwcm92aWRlcnM6aSx2aWV3UHJvdmlkZXJzOm8scGFyZW50SW5qZWN0b3JJbmRleDpuW3QucHJvdmlkZXJJbmRleFN0YXJ0Xy0xXX19ZnVuY3Rpb24gamModCxlKXtjb25zdCBuPXRbZV07aWYoIm51bWJlciIhPXR5cGVvZiBuKXJldHVybiI/Pz8/Pz8/PyI7Y29uc3Qgbz0iMDAwMDAwMDAiK24udG9TdHJpbmcoMik7cmV0dXJuIG8uc3Vic3RyaW5nKG8ubGVuZ3RoLTgpfWZ1bmN0aW9uIFVjKHQsZSl7cmV0dXJuIGU8MD8iTk9fTk9ERV9JTkpFQ1RPUiI6YCR7amModCxlKzcpfV8ke2pjKHQsZSs2KX1fJHtqYyh0LGUrNSl9XyR7amModCxlKzQpfV8ke2pjKHQsZSszKX1fJHtqYyh0LGUrMil9XyR7amModCxlKzEpfV8ke2pjKHQsZSswKX1gfWNsYXNzIEdje2NvbnN0cnVjdG9yKHQpe3RoaXMuX3Jhd19sQ29udGFpbmVyPXR9Z2V0IGhhc1RyYW5zcGxhbnRlZFZpZXdzKCl7cmV0dXJuIHRoaXMuX3Jhd19sQ29udGFpbmVyWzJdfWdldCB2aWV3cygpe3JldHVybiB0aGlzLl9yYXdfbENvbnRhaW5lci5zbGljZShibykubWFwKE5jKX1nZXQgcGFyZW50KCl7cmV0dXJuIE5jKHRoaXMuX3Jhd19sQ29udGFpbmVyWzNdKX1nZXQgbW92ZWRWaWV3cygpe3JldHVybiB0aGlzLl9yYXdfbENvbnRhaW5lcls5XX1nZXQgaG9zdCgpe3JldHVybiB0aGlzLl9yYXdfbENvbnRhaW5lclswXX1nZXQgbmF0aXZlKCl7cmV0dXJuIHRoaXMuX3Jhd19sQ29udGFpbmVyWzddfWdldCBuZXh0KCl7cmV0dXJuIE5jKHRoaXMuX3Jhd19sQ29udGFpbmVyWzRdKX19Y29uc3QgV2M9UHJvbWlzZS5yZXNvbHZlKG51bGwpO2Z1bmN0aW9uIFljKHQsZSl7Y29uc3Qgbj10LmNvbnRlbnRRdWVyaWVzO2lmKG51bGwhPT1uKWZvcihsZXQgbz0wO288bi5sZW5ndGg7bys9Mil7Y29uc3QgaT1uW29dLGE9bltvKzFdO2lmKC0xIT09YSl7Y29uc3Qgbj10LmRhdGFbYV07bmdEZXZNb2RlJiZobihuLCJEaXJlY3RpdmVEZWYgbm90IGZvdW5kLiIpLG5nRGV2TW9kZSYmaG4obi5jb250ZW50UXVlcmllcywiY29udGVudFF1ZXJpZXMgZnVuY3Rpb24gc2hvdWxkIGJlIGRlZmluZWQiKSx6aShpKSxuLmNvbnRlbnRRdWVyaWVzKDIsZVthXSxhKX19fWZ1bmN0aW9uIHFjKHQsZSxuLG8saSxhLHIscyxsLGMpe2NvbnN0IGQ9bmdEZXZNb2RlPyhmdW5jdGlvbiBwKHQpe3JldHVybihmdW5jdGlvbiBlKHQsbil7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdm9pZCAwPT09TWMmJihNYz1uZXcodGwoIkxSb290VmlldyIpKSksTWM7Y2FzZSAxOnZvaWQgMD09PV9jJiYoX2M9bmV3IE1hcCk7bGV0IHQ9X2MuZ2V0KG4pO3JldHVybiB2b2lkIDA9PT10JiYodD1uZXcodGwoIkxDb21wb25lbnRWaWV3Iit2YyhuKSkpLF9jLnNldChuLHQpKSx0O2Nhc2UgMjp2b2lkIDA9PT1DYyYmKENjPW5ldyBNYXApO2xldCBlPUNjLmdldChuKTtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9bmV3KHRsKCJMRW1iZWRkZWRWaWV3Iit2YyhuKSkpLENjLnNldChuLGUpKSxlfX0pKHQudHlwZSx0LnRlbXBsYXRlJiZ0LnRlbXBsYXRlLm5hbWUpLmNvbmNhdCh0LmJsdWVwcmludCl9KShlKTplLmJsdWVwcmludC5zbGljZSgpO3JldHVybiBkWzBdPWksZFsyXT0xNDB8byxkaShkKSxuZ0Rldk1vZGUmJmUuZGVjbFROb2RlJiZ0JiZPbyhlLmRlY2xUTm9kZSx0KSxkWzNdPWRbMTVdPXQsZFs4XT1uLGRbMTBdPXJ8fHQmJnRbMTBdLG5nRGV2TW9kZSYmaG4oZFsxMF0sIlJlbmRlcmVyRmFjdG9yeSBpcyByZXF1aXJlZCIpLGRbMTFdPXN8fHQmJnRbMTFdLG5nRGV2TW9kZSYmaG4oZFsxMV0sIlJlbmRlcmVyIGlzIHJlcXVpcmVkIiksZFsxMl09bHx8dCYmdFsxMl18fG51bGwsZFs5XT1jfHx0JiZ0WzldfHxudWxsLGRbNl09YSxuZ0Rldk1vZGUmJmxuKDIhPWUudHlwZXx8bnVsbCE9PXQsITAsIkVtYmVkZGVkIHZpZXdzIG11c3QgaGF2ZSBwYXJlbnRMVmlldyIpLGRbMTZdPTI9PWUudHlwZT90WzE2XTpkLG5nRGV2TW9kZSYmKGZ1bmN0aW9uIG0odCl7aGModCxuZXcgSWModCkpfSkoZCksZH1mdW5jdGlvbiBaYyh0LGUsbixvLGkpe25nRGV2TW9kZSYmMCE9PWUmJmduKGUsZ28sIlROb2RlcyBjYW4ndCBiZSBpbiB0aGUgTFZpZXcgaGVhZGVyLiIpLG5nRGV2TW9kZSYmKGZ1bmN0aW9uIGEodCl7MiE9PXQmJjEhPT10JiY0IT09dCYmOCE9PXQmJjMyIT09dCYmMTYhPT10JiY2NCE9PXQmJmJuKGBFeHBlY3RlZCBUTm9kZVR5cGUgdG8gaGF2ZSBvbmx5IGEgc2luZ2xlIHR5cGUgc2VsZWN0ZWQsIGJ1dCBnb3QgJHtvYSh0KX0uYCl9KShuKTtsZXQgcj10LmRhdGFbZV07aWYobnVsbD09PXIpcj1YYyh0LGUsbixvLGkpLChmdW5jdGlvbiBzKCl7cmV0dXJuIG1pLmxGcmFtZS5pbkkxOG59KSgpJiYoci5mbGFnc3w9NjQpO2Vsc2UgaWYoNjQmci50eXBlKXtyLnR5cGU9bixyLnZhbHVlPW8sci5hdHRycz1pO2NvbnN0IGE9X2koKTtyLmluamVjdG9ySW5kZXg9bnVsbD09PWE/LTE6YS5pbmplY3RvckluZGV4LG5nRGV2TW9kZSYmUG8ocix0KSxuZ0Rldk1vZGUmJmxuKGUsci5pbmRleCwiRXhwZWN0aW5nIHNhbWUgaW5kZXgiKX1yZXR1cm4gQ2kociwhMCkscn1mdW5jdGlvbiBYYyh0LGUsbixvLGkpe2NvbnN0IGE9eWkoKSxyPU1pKCkscz10LmRhdGFbZV09KGZ1bmN0aW9uIGwodCxlLG4sbyxpLGEpe25nRGV2TW9kZSYmMCE9PW8mJmduKG8sZ28sIlROb2RlcyBjYW4ndCBiZSBpbiB0aGUgTFZpZXcgaGVhZGVyLiIpLG5nRGV2TW9kZSYmcG4oYSx2b2lkIDAsIid1bmRlZmluZWQnIGlzIG5vdCB2YWxpZCB2YWx1ZSBmb3IgJ2F0dHJzJyIpLG5nRGV2TW9kZSYmbmdEZXZNb2RlLnROb2RlKyssbmdEZXZNb2RlJiZlJiZQbyhlLHQpO2xldCByPWU/ZS5pbmplY3RvckluZGV4Oi0xO2NvbnN0IHM9bmdEZXZNb2RlP25ldyBjbGFzc3tjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZixnLGgsYix5LF8sQyxNLHYseCxPLFAsdyxrLFMsRCxFLFIpe3RoaXMudFZpZXdfPXQsdGhpcy50eXBlPWUsdGhpcy5pbmRleD1uLHRoaXMuaW5zZXJ0QmVmb3JlSW5kZXg9byx0aGlzLmluamVjdG9ySW5kZXg9aSx0aGlzLmRpcmVjdGl2ZVN0YXJ0PWEsdGhpcy5kaXJlY3RpdmVFbmQ9cix0aGlzLmRpcmVjdGl2ZVN0eWxpbmdMYXN0PXMsdGhpcy5wcm9wZXJ0eUJpbmRpbmdzPWwsdGhpcy5mbGFncz1jLHRoaXMucHJvdmlkZXJJbmRleGVzPWQsdGhpcy52YWx1ZT1wLHRoaXMuYXR0cnM9bSx0aGlzLm1lcmdlZEF0dHJzPXUsdGhpcy5sb2NhbE5hbWVzPWYsdGhpcy5pbml0aWFsSW5wdXRzPWcsdGhpcy5pbnB1dHM9aCx0aGlzLm91dHB1dHM9Yix0aGlzLnRWaWV3cz15LHRoaXMubmV4dD1fLHRoaXMucHJvamVjdGlvbk5leHQ9Qyx0aGlzLmNoaWxkPU0sdGhpcy5wYXJlbnQ9dix0aGlzLnByb2plY3Rpb249eCx0aGlzLnN0eWxlcz1PLHRoaXMuc3R5bGVzV2l0aG91dEhvc3Q9UCx0aGlzLnJlc2lkdWFsU3R5bGVzPXcsdGhpcy5jbGFzc2VzPWssdGhpcy5jbGFzc2VzV2l0aG91dEhvc3Q9Uyx0aGlzLnJlc2lkdWFsQ2xhc3Nlcz1ELHRoaXMuY2xhc3NCaW5kaW5ncz1FLHRoaXMuc3R5bGVCaW5kaW5ncz1SfWRlYnVnTm9kZUluamVjdG9yUGF0aCh0KXtjb25zdCBlPVtdO2xldCBuPXlhKHRoaXMsdCk7aWYoLTE9PT1uKXtjb25zdCBlPV9hKHRoaXMsdCk7ZSE9PWVhJiYobj1wYShlKSx0PW1hKGUsdCkpfWZvcig7LTEhPT1uOyl7bmdEZXZNb2RlJiZIbyh0LG4pLGUucHVzaChCYyh0WzFdLmRhdGFbbis4XSx0KSk7Y29uc3Qgbz10W24rOF07bz09PWVhP249LTE6KG49cGEobyksdD1tYShvLHQpKX1yZXR1cm4gZX1nZXQgdHlwZV8oKXtyZXR1cm4gb2EodGhpcy50eXBlKXx8YFROb2RlVHlwZS4/JHt0aGlzLnR5cGV9P2B9Z2V0IGZsYWdzXygpe2NvbnN0IHQ9W107cmV0dXJuIDE2JnRoaXMuZmxhZ3MmJnQucHVzaCgiVE5vZGVGbGFncy5oYXNDbGFzc0lucHV0IiksOCZ0aGlzLmZsYWdzJiZ0LnB1c2goIlROb2RlRmxhZ3MuaGFzQ29udGVudFF1ZXJ5IiksMzImdGhpcy5mbGFncyYmdC5wdXNoKCJUTm9kZUZsYWdzLmhhc1N0eWxlSW5wdXQiKSwxMjgmdGhpcy5mbGFncyYmdC5wdXNoKCJUTm9kZUZsYWdzLmhhc0hvc3RCaW5kaW5ncyIpLDImdGhpcy5mbGFncyYmdC5wdXNoKCJUTm9kZUZsYWdzLmlzQ29tcG9uZW50SG9zdCIpLDEmdGhpcy5mbGFncyYmdC5wdXNoKCJUTm9kZUZsYWdzLmlzRGlyZWN0aXZlSG9zdCIpLDY0JnRoaXMuZmxhZ3MmJnQucHVzaCgiVE5vZGVGbGFncy5pc0RldGFjaGVkIiksNCZ0aGlzLmZsYWdzJiZ0LnB1c2goIlROb2RlRmxhZ3MuaXNQcm9qZWN0ZWQiKSx0LmpvaW4oInwiKX1nZXQgdGVtcGxhdGVfKCl7aWYoMSZ0aGlzLnR5cGUpcmV0dXJuIHRoaXMudmFsdWU7Y29uc3QgdD1bXSxlPSJzdHJpbmciPT10eXBlb2YgdGhpcy52YWx1ZSYmdGhpcy52YWx1ZXx8dGhpcy50eXBlXztpZih0LnB1c2goIjwiLGUpLHRoaXMuZmxhZ3MmJnQucHVzaCgiICIsdGhpcy5mbGFnc18pLHRoaXMuYXR0cnMpZm9yKGxldCBlPTA7ZTx0aGlzLmF0dHJzLmxlbmd0aDspe2NvbnN0IG49dGhpcy5hdHRyc1tlKytdO2lmKCJudW1iZXIiPT10eXBlb2YgbilicmVhaztjb25zdCBvPXRoaXMuYXR0cnNbZSsrXTt0LnB1c2goIiAiLG4sJz0iJyxvLCciJyl9cmV0dXJuIHQucHVzaCgiPiIpLE9jKHRoaXMuY2hpbGQsdCksdC5wdXNoKCI8LyIsZSwiPiIpLHQuam9pbigiIil9Z2V0IHN0eWxlQmluZGluZ3NfKCl7cmV0dXJuIHhjKHRoaXMsITEpfWdldCBjbGFzc0JpbmRpbmdzXygpe3JldHVybiB4Yyh0aGlzLCEwKX1nZXQgcHJvdmlkZXJJbmRleFN0YXJ0Xygpe3JldHVybiAxMDQ4NTc1JnRoaXMucHJvdmlkZXJJbmRleGVzfWdldCBwcm92aWRlckluZGV4RW5kXygpe3JldHVybiB0aGlzLnByb3ZpZGVySW5kZXhTdGFydF8rKHRoaXMucHJvdmlkZXJJbmRleGVzPj4+MjApfX0odCxuLG8sbnVsbCxyLC0xLC0xLC0xLG51bGwsMCwwLGksYSxudWxsLG51bGwsdm9pZCAwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLGUsbnVsbCxudWxsLG51bGwsdm9pZCAwLG51bGwsbnVsbCx2b2lkIDAsMCwwKTp7dHlwZTpuLGluZGV4Om8saW5zZXJ0QmVmb3JlSW5kZXg6bnVsbCxpbmplY3RvckluZGV4OnIsZGlyZWN0aXZlU3RhcnQ6LTEsZGlyZWN0aXZlRW5kOi0xLGRpcmVjdGl2ZVN0eWxpbmdMYXN0Oi0xLHByb3BlcnR5QmluZGluZ3M6bnVsbCxmbGFnczowLHByb3ZpZGVySW5kZXhlczowLHZhbHVlOmksYXR0cnM6YSxtZXJnZWRBdHRyczpudWxsLGxvY2FsTmFtZXM6bnVsbCxpbml0aWFsSW5wdXRzOnZvaWQgMCxpbnB1dHM6bnVsbCxvdXRwdXRzOm51bGwsdFZpZXdzOm51bGwsbmV4dDpudWxsLHByb2plY3Rpb25OZXh0Om51bGwsY2hpbGQ6bnVsbCxwYXJlbnQ6ZSxwcm9qZWN0aW9uOm51bGwsc3R5bGVzOm51bGwsc3R5bGVzV2l0aG91dEhvc3Q6bnVsbCxyZXNpZHVhbFN0eWxlczp2b2lkIDAsY2xhc3NlczpudWxsLGNsYXNzZXNXaXRob3V0SG9zdDpudWxsLHJlc2lkdWFsQ2xhc3Nlczp2b2lkIDAsY2xhc3NCaW5kaW5nczowLHN0eWxlQmluZGluZ3M6MH07cmV0dXJuIG5nRGV2TW9kZSYmT2JqZWN0LnNlYWwocyksc30pKHQscj9hOmEmJmEucGFyZW50LG4sZSxvLGkpO3JldHVybiBudWxsPT09dC5maXJzdENoaWxkJiYodC5maXJzdENoaWxkPXMpLG51bGwhPT1hJiYocj9udWxsPT1hLmNoaWxkJiZudWxsIT09cy5wYXJlbnQmJihhLmNoaWxkPXMpOm51bGw9PT1hLm5leHQmJihhLm5leHQ9cykpLHN9ZnVuY3Rpb24gS2ModCxlLG4sbyl7aWYoMD09PW4pcmV0dXJuLTE7bmdEZXZNb2RlJiYoQW8odCksZG4odCxlWzFdLCJgTFZpZXdgIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGBUVmlld2AhIiksbG4odC5kYXRhLmxlbmd0aCxlLmxlbmd0aCwiRXhwZWN0aW5nIExWaWV3IHRvIGJlIHNhbWUgc2l6ZSBhcyBUVmlldyIpLGxuKHQuZGF0YS5sZW5ndGgsdC5ibHVlcHJpbnQubGVuZ3RoLCJFeHBlY3RpbmcgQmx1ZXByaW50IHRvIGJlIHNhbWUgc2l6ZSBhcyBUVmlldyIpLFRvKHQpKTtjb25zdCBpPWUubGVuZ3RoO2ZvcihsZXQgaT0wO2k8bjtpKyspZS5wdXNoKG8pLHQuYmx1ZXByaW50LnB1c2gobyksdC5kYXRhLnB1c2gobnVsbCk7cmV0dXJuIGl9ZnVuY3Rpb24gSmModCxlLG4pe25nRGV2TW9kZSYmbG4oc2koZSksITAsIlNob3VsZCBiZSBydW4gaW4gY3JlYXRpb24gbW9kZSIpLEZpKGUpO3RyeXtjb25zdCBvPXQudmlld1F1ZXJ5O251bGwhPT1vJiZOZCgxLG8sbik7Y29uc3QgaT10LnRlbXBsYXRlO251bGwhPT1pJiZ0ZCh0LGUsaSwxLG4pLHQuZmlyc3RDcmVhdGVQYXNzJiYodC5maXJzdENyZWF0ZVBhc3M9ITEpLHQuc3RhdGljQ29udGVudFF1ZXJpZXMmJlljKHQsZSksdC5zdGF0aWNWaWV3UXVlcmllcyYmTmQoMix0LnZpZXdRdWVyeSxuKTtjb25zdCBhPXQuY29tcG9uZW50cztudWxsIT09YSYmKGZ1bmN0aW9uIG8odCxlKXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKylTZCh0LGVbbl0pfSkoZSxhKX1jYXRjaChlKXt0aHJvdyB0LmZpcnN0Q3JlYXRlUGFzcyYmKHQuaW5jb21wbGV0ZUZpcnN0UGFzcz0hMCx0LmZpcnN0Q3JlYXRlUGFzcz0hMSksZX1maW5hbGx5e2VbMl0mPS01LFVpKCl9fWZ1bmN0aW9uIFFjKHQsZSxuLG8pe25nRGV2TW9kZSYmbG4oc2koZSksITEsIlNob3VsZCBiZSBydW4gaW4gdXBkYXRlIG1vZGUiKTtjb25zdCBpPWVbMl07aWYoMjU2PT0oMjU2JmkpKXJldHVybjtGaShlKTtjb25zdCBhPXhpKCk7dHJ5e2RpKGUpLGtpKHQuYmluZGluZ1N0YXJ0SW5kZXgpLG51bGwhPT1uJiZ0ZCh0LGUsbiwyLG8pO2NvbnN0IHI9Mz09KDMmaSk7aWYoIWEpaWYocil7Y29uc3Qgbj10LnByZU9yZGVyQ2hlY2tIb29rcztudWxsIT09biYmS2koZSxuLG51bGwpfWVsc2V7Y29uc3Qgbj10LnByZU9yZGVySG9va3M7bnVsbCE9PW4mJkppKGUsbiwwLG51bGwpLFFpKGUsMCl9aWYoKGZ1bmN0aW9uIHIodCl7Zm9yKGxldCBlPWZsKHQpO251bGwhPT1lO2U9Z2woZSkpe2lmKCFlWzJdKWNvbnRpbnVlO2NvbnN0IHQ9ZVs5XTtuZ0Rldk1vZGUmJmhuKHQsIlRyYW5zcGxhbnRlZCBWaWV3IGZsYWdzIHNldCBidXQgbWlzc2luZyBNT1ZFRF9WSUVXUyIpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtjb25zdCBuPXRbZV0sbz1uWzNdO25nRGV2TW9kZSYmRG8obyksMD09KDEwMjQmblsyXSkmJnBpKG8sMSksblsyXXw9MTAyNH19fSkoZSksKGZ1bmN0aW9uIHModCl7Zm9yKGxldCBlPWZsKHQpO251bGwhPT1lO2U9Z2woZSkpZm9yKGxldCB0PWJvO3Q8ZS5sZW5ndGg7dCsrKXtjb25zdCBuPWVbdF0sbz1uWzFdO25nRGV2TW9kZSYmaG4obywiVFZpZXcgbXVzdCBiZSBhbGxvY2F0ZWQiKSxsaShuKSYmUWMobyxuLG8udGVtcGxhdGUsbls4XSl9fSkoZSksbnVsbCE9PXQuY29udGVudFF1ZXJpZXMmJlljKHQsZSksIWEpaWYocil7Y29uc3Qgbj10LmNvbnRlbnRDaGVja0hvb2tzO251bGwhPT1uJiZLaShlLG4pfWVsc2V7Y29uc3Qgbj10LmNvbnRlbnRIb29rcztudWxsIT09biYmSmkoZSxuLDEpLFFpKGUsMSl9IShmdW5jdGlvbiBsKHQsZSl7Y29uc3Qgbj10Lmhvc3RCaW5kaW5nT3BDb2RlcztpZihudWxsIT09bil0cnl7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0Kyspe2NvbnN0IG89blt0XTtpZihvPDApV2kofm8pO2Vsc2V7Y29uc3QgaT1vLGE9blsrK3RdLHI9blsrK3RdO1JpKGEsaSkscigyLGVbaV0pfX19ZmluYWxseXtXaSgtMSl9fSkodCxlKTtjb25zdCBzPXQuY29tcG9uZW50cztudWxsIT09cyYmKGZ1bmN0aW9uIGModCxlKXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl3ZCh0LGVbbl0pfSkoZSxzKTtjb25zdCBsPXQudmlld1F1ZXJ5O2lmKG51bGwhPT1sJiZOZCgyLGwsbyksIWEpaWYocil7Y29uc3Qgbj10LnZpZXdDaGVja0hvb2tzO251bGwhPT1uJiZLaShlLG4pfWVsc2V7Y29uc3Qgbj10LnZpZXdIb29rcztudWxsIT09biYmSmkoZSxuLDIpLFFpKGUsMil9ITA9PT10LmZpcnN0VXBkYXRlUGFzcyYmKHQuZmlyc3RVcGRhdGVQYXNzPSExKSxhfHwoZVsyXSY9LTczKSwxMDI0JmVbMl0mJihlWzJdJj0tMTAyNSxwaShlWzNdLC0xKSl9ZmluYWxseXtVaSgpfX1mdW5jdGlvbiAkYyh0LGUsbixvKXtjb25zdCBpPWVbMTBdLGE9IXhpKCkscj1zaShlKTt0cnl7YSYmIXImJmkuYmVnaW4mJmkuYmVnaW4oKSxyJiZKYyh0LGUsbyksUWModCxlLG4sbyl9ZmluYWxseXthJiYhciYmaS5lbmQmJmkuZW5kKCl9fWZ1bmN0aW9uIHRkKHQsZSxuLG8saSl7Y29uc3QgYT1HaSgpLHI9MiZvO3RyeXtXaSgtMSksciYmZS5sZW5ndGg+Z28mJnNjKHQsZSxnbyx4aSgpKSxxbyhyPzI6MCxpKSxuKG8saSl9ZmluYWxseXtXaShhKSxxbyhyPzM6MSxpKX19ZnVuY3Rpb24gZWQodCxlLG4pe2lmKENvKGUpKXtjb25zdCBvPWUuZGlyZWN0aXZlRW5kO2ZvcihsZXQgaT1lLmRpcmVjdGl2ZVN0YXJ0O2k8bztpKyspe2NvbnN0IGU9dC5kYXRhW2ldO2UuY29udGVudFF1ZXJpZXMmJmUuY29udGVudFF1ZXJpZXMoMSxuW2ldLGkpfX19ZnVuY3Rpb24gbmQodCxlLG4pe3VpKCkmJigoZnVuY3Rpb24gbyh0LGUsbixpKXtjb25zdCBhPW4uZGlyZWN0aXZlU3RhcnQscj1uLmRpcmVjdGl2ZUVuZDt0LmZpcnN0Q3JlYXRlUGFzc3x8aGEobixlKSxMcyhpLGUpO2NvbnN0IHM9bi5pbml0aWFsSW5wdXRzO2ZvcihsZXQgbz1hO288cjtvKyspe2NvbnN0IGk9dC5kYXRhW29dLHI9eG8oaSk7ciYmKG5nRGV2TW9kZSYmaWEobiwzKSxfZChlLG4saSkpO2NvbnN0IGw9U2EoZSx0LG8sbik7THMobCxlKSxudWxsIT09cyYmdmQoZSxvLWEsbCxpLG4scyksciYmKHJpKG4uaW5kZXgsZSlbOF09bCl9fSkodCxlLG4sb2kobixlKSksMTI4PT0oMTI4Jm4uZmxhZ3MpJiYoZnVuY3Rpb24gaSh0LGUsbil7Y29uc3Qgbz1uLmRpcmVjdGl2ZVN0YXJ0LGk9bi5kaXJlY3RpdmVFbmQsYT1uLmluZGV4LHI9KGZ1bmN0aW9uIHMoKXtyZXR1cm4gbWkubEZyYW1lLmN1cnJlbnREaXJlY3RpdmVJbmRleH0pKCk7dHJ5e1dpKGEpO2ZvcihsZXQgbj1vO248aTtuKyspe2NvbnN0IG89dC5kYXRhW25dLGk9ZVtuXTtBaShuKSxudWxsPT09by5ob3N0QmluZGluZ3MmJjA9PT1vLmhvc3RWYXJzJiZudWxsPT09by5ob3N0QXR0cnN8fGZkKG8saSl9fWZpbmFsbHl7V2koLTEpLEFpKHIpfX0pKHQsZSxuKSl9ZnVuY3Rpb24gb2QodCxlLG49b2kpe2NvbnN0IG89ZS5sb2NhbE5hbWVzO2lmKG51bGwhPT1vKXtsZXQgaT1lLmluZGV4KzE7Zm9yKGxldCBhPTA7YTxvLmxlbmd0aDthKz0yKXtjb25zdCByPW9bYSsxXSxzPS0xPT09cj9uKGUsdCk6dFtyXTt0W2krK109c319fWZ1bmN0aW9uIGlkKHQpe2NvbnN0IGU9dC50VmlldztyZXR1cm4gbnVsbD09PWV8fGUuaW5jb21wbGV0ZUZpcnN0UGFzcz90LnRWaWV3PWFkKDEsbnVsbCx0LnRlbXBsYXRlLHQuZGVjbHMsdC52YXJzLHQuZGlyZWN0aXZlRGVmcyx0LnBpcGVEZWZzLHQudmlld1F1ZXJ5LHQuc2NoZW1hcyx0LmNvbnN0cyk6ZX1mdW5jdGlvbiBhZCh0LGUsbixvLGksYSxyLHMsbCxjKXtuZ0Rldk1vZGUmJm5nRGV2TW9kZS50VmlldysrO2NvbnN0IGQ9Z28rbyxwPWQraSxtPShmdW5jdGlvbiB1KHQsZSl7Y29uc3Qgbj1uZ0Rldk1vZGU/bmV3IGtjOltdO2ZvcihsZXQgbz0wO288ZTtvKyspbi5wdXNoKG88dD9udWxsOmFjKTtyZXR1cm4gbn0pKGQscCksZj0iZnVuY3Rpb24iPT10eXBlb2YgYz9jKCk6YyxnPW1bMV09bmdEZXZNb2RlP25ldyBjbGFzc3tjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZixnLGgsYix5LF8sQyxNLHYseCxPLFAsdyxrLFMsRCxFLFIpe3RoaXMudHlwZT10LHRoaXMuYmx1ZXByaW50PWUsdGhpcy50ZW1wbGF0ZT1uLHRoaXMucXVlcmllcz1vLHRoaXMudmlld1F1ZXJ5PWksdGhpcy5kZWNsVE5vZGU9YSx0aGlzLmRhdGE9cix0aGlzLmJpbmRpbmdTdGFydEluZGV4PXMsdGhpcy5leHBhbmRvU3RhcnRJbmRleD1sLHRoaXMuaG9zdEJpbmRpbmdPcENvZGVzPWMsdGhpcy5maXJzdENyZWF0ZVBhc3M9ZCx0aGlzLmZpcnN0VXBkYXRlUGFzcz1wLHRoaXMuc3RhdGljVmlld1F1ZXJpZXM9bSx0aGlzLnN0YXRpY0NvbnRlbnRRdWVyaWVzPXUsdGhpcy5wcmVPcmRlckhvb2tzPWYsdGhpcy5wcmVPcmRlckNoZWNrSG9va3M9Zyx0aGlzLmNvbnRlbnRIb29rcz1oLHRoaXMuY29udGVudENoZWNrSG9va3M9Yix0aGlzLnZpZXdIb29rcz15LHRoaXMudmlld0NoZWNrSG9va3M9Xyx0aGlzLmRlc3Ryb3lIb29rcz1DLHRoaXMuY2xlYW51cD1NLHRoaXMuY29udGVudFF1ZXJpZXM9dix0aGlzLmNvbXBvbmVudHM9eCx0aGlzLmRpcmVjdGl2ZVJlZ2lzdHJ5PU8sdGhpcy5waXBlUmVnaXN0cnk9UCx0aGlzLmZpcnN0Q2hpbGQ9dyx0aGlzLnNjaGVtYXM9ayx0aGlzLmNvbnN0cz1TLHRoaXMuaW5jb21wbGV0ZUZpcnN0UGFzcz1ELHRoaXMuX2RlY2xzPUUsdGhpcy5fdmFycz1SfWdldCB0ZW1wbGF0ZV8oKXtjb25zdCB0PVtdO3JldHVybiBPYyh0aGlzLmZpcnN0Q2hpbGQsdCksdC5qb2luKCIiKX1nZXQgdHlwZV8oKXtyZXR1cm4gaG9bdGhpcy50eXBlXXx8YFRWaWV3VHlwZS4/JHt0aGlzLnR5cGV9P2B9fSh0LG0sbixudWxsLHMsZSwoZnVuY3Rpb24gaCh0KXtyZXR1cm4gdm9pZCAwPT09d2MmJih3Yz1uZXcgUGMpLHdjLmNvbmNhdCh0KX0pKG0pLmZpbGwobnVsbCxkKSxkLHAsbnVsbCwhMCwhMCwhMSwhMSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLCJmdW5jdGlvbiI9PXR5cGVvZiBhP2EoKTphLCJmdW5jdGlvbiI9PXR5cGVvZiByP3IoKTpyLG51bGwsbCxmLCExLG8saSk6e3R5cGU6dCxibHVlcHJpbnQ6bSx0ZW1wbGF0ZTpuLHF1ZXJpZXM6bnVsbCx2aWV3UXVlcnk6cyxkZWNsVE5vZGU6ZSxkYXRhOm0uc2xpY2UoKS5maWxsKG51bGwsZCksYmluZGluZ1N0YXJ0SW5kZXg6ZCxleHBhbmRvU3RhcnRJbmRleDpwLGhvc3RCaW5kaW5nT3BDb2RlczpudWxsLGZpcnN0Q3JlYXRlUGFzczohMCxmaXJzdFVwZGF0ZVBhc3M6ITAsc3RhdGljVmlld1F1ZXJpZXM6ITEsc3RhdGljQ29udGVudFF1ZXJpZXM6ITEscHJlT3JkZXJIb29rczpudWxsLHByZU9yZGVyQ2hlY2tIb29rczpudWxsLGNvbnRlbnRIb29rczpudWxsLGNvbnRlbnRDaGVja0hvb2tzOm51bGwsdmlld0hvb2tzOm51bGwsdmlld0NoZWNrSG9va3M6bnVsbCxkZXN0cm95SG9va3M6bnVsbCxjbGVhbnVwOm51bGwsY29udGVudFF1ZXJpZXM6bnVsbCxjb21wb25lbnRzOm51bGwsZGlyZWN0aXZlUmVnaXN0cnk6ImZ1bmN0aW9uIj09dHlwZW9mIGE/YSgpOmEscGlwZVJlZ2lzdHJ5OiJmdW5jdGlvbiI9PXR5cGVvZiByP3IoKTpyLGZpcnN0Q2hpbGQ6bnVsbCxzY2hlbWFzOmwsY29uc3RzOmYsaW5jb21wbGV0ZUZpcnN0UGFzczohMX07cmV0dXJuIG5nRGV2TW9kZSYmT2JqZWN0LnNlYWwoZyksZ31mdW5jdGlvbiByZCh0LGUsbixvKXtjb25zdCBpPUhkKGUpO251bGw9PT1uPyhuZ0Rldk1vZGUmJk9iamVjdC5mcmVlemUoRmQodCkpLGkucHVzaChvKSk6KGkucHVzaChuKSx0LmZpcnN0Q3JlYXRlUGFzcyYmRmQodCkucHVzaChvLGkubGVuZ3RoLTEpKX1mdW5jdGlvbiBzZCh0LGUsbil7Zm9yKGxldCBvIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShvKSl7Y29uc3QgaT10W29dOyhuPW51bGw9PT1uP3t9Om4pLmhhc093blByb3BlcnR5KG8pP25bb10ucHVzaChlLGkpOm5bb109W2UsaV19cmV0dXJuIG59ZnVuY3Rpb24gbGQodCxlLG4sbyxpLGEscixzKXtuZ0Rldk1vZGUmJnBuKGksYWMsIkluY29taW5nIHZhbHVlIHNob3VsZCBuZXZlciBiZSBOT19DSEFOR0UuIik7Y29uc3QgbD1vaShlLG4pO2xldCBjLGQ9ZS5pbnB1dHM7aWYoIXMmJm51bGwhPWQmJihjPWRbb10pKVZkKHQsbixjLG8saSksTW8oZSkmJihmdW5jdGlvbiBwKHQsZSl7bmdEZXZNb2RlJiZSbyh0KTtjb25zdCBuPXJpKGUsdCk7MTYmblsyXXx8KG5bMl18PTY0KX0pKG4sZS5pbmRleCksbmdEZXZNb2RlJiYoZnVuY3Rpb24gbSh0LGUsbixvLGkpe2lmKDcmbilmb3IobGV0IGE9MDthPG8ubGVuZ3RoO2ErPTIpY2QodCxlLG4sb1thKzFdLGkpfSkobixsLGUudHlwZSxjLGkpO2Vsc2UgaWYoMyZlLnR5cGUpe2lmKG89KGZ1bmN0aW9uIHUodCl7cmV0dXJuImNsYXNzIj09PXQ/ImNsYXNzTmFtZSI6ImZvciI9PT10PyJodG1sRm9yIjoiZm9ybWFjdGlvbiI9PT10PyJmb3JtQWN0aW9uIjoiaW5uZXJIdG1sIj09PXQ/ImlubmVySFRNTCI6InJlYWRvbmx5Ij09PXQ/InJlYWRPbmx5IjoidGFiaW5kZXgiPT09dD8idGFiSW5kZXgiOnR9KShvKSxuZ0Rldk1vZGUpe2lmKChmdW5jdGlvbiBmKHQpe2lmKHQudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJvbiIpKXtjb25zdCBlPWBCaW5kaW5nIHRvIGV2ZW50IHByb3BlcnR5ICcke3R9JyBpcyBkaXNhbGxvd2VkIGZvciBzZWN1cml0eSByZWFzb25zLCBwbGVhc2UgdXNlICgke3Quc2xpY2UoMil9KT0uLi5cbklmICcke3R9JyBpcyBhIGRpcmVjdGl2ZSBpbnB1dCwgbWFrZSBzdXJlIHRoZSBkaXJlY3RpdmUgaXMgaW1wb3J0ZWQgYnkgdGhlIGN1cnJlbnQgbW9kdWxlLmA7dGhyb3cgbmV3IEVycm9yKGUpfX0pKG8pLCEoZnVuY3Rpb24gZyh0LGUsbixvKXtyZXR1cm4hKG51bGwhPT10LnNjaGVtYXMmJiEoZGQodCxvLnZhbHVlKXx8biBpbiBlfHxzYShuKSkmJiJ1bmRlZmluZWQiIT10eXBlb2YgTm9kZSYmbnVsbCE9PU5vZGUmJmUgaW5zdGFuY2VvZiBOb2RlKX0pKHQsbCxvLGUpKXJldHVybiB2b2lkIHBkKG8sZSk7bmdEZXZNb2RlLnJlbmRlcmVyU2V0UHJvcGVydHkrK31pPW51bGwhPXI/cihpLGUudmFsdWV8fCIiLG8pOmksJG8oYSk/YS5zZXRQcm9wZXJ0eShsLG8saSk6c2Eobyl8fChsLnNldFByb3BlcnR5P2wuc2V0UHJvcGVydHkobyxpKTpsW29dPWkpfWVsc2UgMTImZS50eXBlJiZuZ0Rldk1vZGUmJiFkZCh0LGUudmFsdWUpJiZwZChvLGUpfWZ1bmN0aW9uIGNkKHQsZSxuLG8saSl7Y29uc3QgYT10WzExXTtvPShmdW5jdGlvbiByKHQpe3JldHVybmBuZy1yZWZsZWN0LSR7dD0oZnVuY3Rpb24gZSh0KXtyZXR1cm4gdC5yZXBsYWNlKGVsLCgoLi4udCk9PiItIit0WzFdLnRvTG93ZXJDYXNlKCkpKX0pKHQucmVwbGFjZSgvWyRAXS9nLCJfIikpfWB9KShvKTtjb25zdCBzPShmdW5jdGlvbiBsKHQpe3RyeXtyZXR1cm4gbnVsbCE9dD90LnRvU3RyaW5nKCkuc2xpY2UoMCwzMCk6dH1jYXRjaCh0KXtyZXR1cm4iW0VSUk9SXSBFeGNlcHRpb24gd2hpbGUgdHJ5aW5nIHRvIHNlcmlhbGl6ZSB0aGUgdmFsdWUifX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKShpKTtpZigzJm4pbnVsbD09aT8kbyhhKT9hLnJlbW92ZUF0dHJpYnV0ZShlLG8pOmUucmVtb3ZlQXR0cmlidXRlKG8pOiRvKGEpP2Euc2V0QXR0cmlidXRlKGUsbyxzKTplLnNldEF0dHJpYnV0ZShvLHMpO2Vsc2V7Y29uc3QgdD0kcyhgYmluZGluZ3M9JHtKU09OLnN0cmluZ2lmeSh7W29dOnN9LG51bGwsMil9YCk7JG8oYSk/YS5zZXRWYWx1ZShlLHQpOmUudGV4dENvbnRlbnQ9dH19ZnVuY3Rpb24gZGQodCxlKXtjb25zdCBuPXQuc2NoZW1hcztpZihudWxsIT09bilmb3IobGV0IHQ9MDt0PG4ubGVuZ3RoO3QrKyl7Y29uc3Qgbz1uW3RdO2lmKG89PT1Lc3x8bz09PVhzJiZlJiZlLmluZGV4T2YoIi0iKT4tMSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBwZCh0LGUpe2NvbnNvbGUuZXJyb3IoUWUoIjMwMyIsYENhbid0IGJpbmQgdG8gJyR7dH0nIHNpbmNlIGl0IGlzbid0IGEga25vd24gcHJvcGVydHkgb2YgJyR7ZS52YWx1ZX0nLmApKX1mdW5jdGlvbiBtZCh0LGUsbixvKXtuZ0Rldk1vZGUmJkFvKHQpO2xldCBpPSExO2lmKHVpKCkpe2NvbnN0IGE9KGZ1bmN0aW9uIGEodCxlLG4pe25nRGV2TW9kZSYmQW8odCksbmdEZXZNb2RlJiZpYShuLDE1KTtjb25zdCBvPXQuZGlyZWN0aXZlUmVnaXN0cnk7bGV0IGk9bnVsbDtpZihvKWZvcihsZXQgYT0wO2E8by5sZW5ndGg7YSsrKXtjb25zdCByPW9bYV07ZWMobixyLnNlbGVjdG9ycywhMSkmJihpfHwoaT1uZ0Rldk1vZGU/bmV3IFNjOltdKSxDYShoYShuLGUpLHQsci50eXBlKSx4byhyKT8obmdEZXZNb2RlJiYoaWEobiwyLGAiJHtuLnZhbHVlfSIgdGFncyBjYW5ub3QgYmUgdXNlZCBhcyBjb21wb25lbnQgaG9zdHMuIFBsZWFzZSB1c2UgYSBkaWZmZXJlbnQgdGFnIHRvIGFjdGl2YXRlIHRoZSAke0dlKHIudHlwZSl9IGNvbXBvbmVudC5gKSwyJm4uZmxhZ3MmJnNsKG4pKSxnZCh0LG4pLGkudW5zaGlmdChyKSk6aS5wdXNoKHIpKX1yZXR1cm4gaX0pKHQsZSxuKSxyPW51bGw9PT1vP251bGw6eyIiOi0xfTtpZihudWxsIT09YSl7aT0hMCxiZChuLHQuZGF0YS5sZW5ndGgsYS5sZW5ndGgpO2ZvcihsZXQgdD0wO3Q8YS5sZW5ndGg7dCsrKXtjb25zdCBlPWFbdF07ZS5wcm92aWRlcnNSZXNvbHZlciYmZS5wcm92aWRlcnNSZXNvbHZlcihlKX1sZXQgbz0hMSxzPSExLGw9S2ModCxlLGEubGVuZ3RoLG51bGwpO25nRGV2TW9kZSYmZG4obCxuLmRpcmVjdGl2ZVN0YXJ0LCJUTm9kZS5kaXJlY3RpdmVTdGFydCBzaG91bGQgcG9pbnQgdG8ganVzdCBhbGxvY2F0ZWQgc3BhY2UiKTtmb3IobGV0IGk9MDtpPGEubGVuZ3RoO2krKyl7Y29uc3QgYz1hW2ldO24ubWVyZ2VkQXR0cnM9bGEobi5tZXJnZWRBdHRycyxjLmhvc3RBdHRycykseWQodCxuLGUsbCxjKSxoZChsLGMsciksbnVsbCE9PWMuY29udGVudFF1ZXJpZXMmJihuLmZsYWdzfD04KSxudWxsPT09Yy5ob3N0QmluZGluZ3MmJm51bGw9PT1jLmhvc3RBdHRycyYmMD09PWMuaG9zdFZhcnN8fChuLmZsYWdzfD0xMjgpO2NvbnN0IGQ9Yy50eXBlLnByb3RvdHlwZTshbyYmKGQubmdPbkNoYW5nZXN8fGQubmdPbkluaXR8fGQubmdEb0NoZWNrKSYmKCh0LnByZU9yZGVySG9va3N8fCh0LnByZU9yZGVySG9va3M9W10pKS5wdXNoKG4uaW5kZXgpLG89ITApLHN8fCFkLm5nT25DaGFuZ2VzJiYhZC5uZ0RvQ2hlY2t8fCgodC5wcmVPcmRlckNoZWNrSG9va3N8fCh0LnByZU9yZGVyQ2hlY2tIb29rcz1bXSkpLnB1c2gobi5pbmRleCkscz0hMCksbCsrfSEoZnVuY3Rpb24gcih0LGUpe25nRGV2TW9kZSYmQW8odCk7Y29uc3Qgbj1lLmRpcmVjdGl2ZVN0YXJ0LG89ZS5kaXJlY3RpdmVFbmQsaT10LmRhdGEsYT1lLmF0dHJzLHI9bmdEZXZNb2RlP25ldyBSYzpbXTtsZXQgcz1udWxsLGw9bnVsbDtmb3IobGV0IHQ9bjt0PG87dCsrKXtjb25zdCBuPWlbdF0sbz1uLmlucHV0cyxjPW51bGw9PT1hfHxLbChlKT9udWxsOnhkKG8sYSk7ci5wdXNoKGMpLHM9c2Qobyx0LHMpLGw9c2Qobi5vdXRwdXRzLHQsbCl9bnVsbCE9PXMmJihzLmhhc093blByb3BlcnR5KCJjbGFzcyIpJiYoZS5mbGFnc3w9MTYpLHMuaGFzT3duUHJvcGVydHkoInN0eWxlIikmJihlLmZsYWdzfD0zMikpLGUuaW5pdGlhbElucHV0cz1yLGUuaW5wdXRzPXMsZS5vdXRwdXRzPWx9KSh0LG4pfXImJihmdW5jdGlvbiBzKHQsZSxuKXtpZihlKXtjb25zdCBvPXQubG9jYWxOYW1lcz1uZ0Rldk1vZGU/bmV3IEVjOltdO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCs9Mil7Y29uc3QgaT1uW2VbdCsxXV07aWYobnVsbD09aSl0aHJvdyBuZXcgS2UoIjMwMSIsYEV4cG9ydCBvZiBuYW1lICcke2VbdCsxXX0nIG5vdCBmb3VuZCFgKTtvLnB1c2goZVt0XSxpKX19fSkobixvLHIpfXJldHVybiBuLm1lcmdlZEF0dHJzPWxhKG4ubWVyZ2VkQXR0cnMsbi5hdHRycyksaX1mdW5jdGlvbiB1ZCh0LGUsbixvLGksYSl7bmdEZXZNb2RlJiZBbyh0KTtjb25zdCByPWEuaG9zdEJpbmRpbmdzO2lmKHIpe2xldCBuPXQuaG9zdEJpbmRpbmdPcENvZGVzO251bGw9PT1uJiYobj10Lmhvc3RCaW5kaW5nT3BDb2Rlcz1bXSk7Y29uc3QgYT1+ZS5pbmRleDsoZnVuY3Rpb24gcyh0KXtsZXQgZT10Lmxlbmd0aDtmb3IoO2U+MDspe2NvbnN0IG49dFstLWVdO2lmKCJudW1iZXIiPT10eXBlb2YgbiYmbjwwKXJldHVybiBufXJldHVybiAwfSkobikhPWEmJm4ucHVzaChhKSxuLnB1c2gobyxpLHIpfX1mdW5jdGlvbiBmZCh0LGUpe251bGwhPT10Lmhvc3RCaW5kaW5ncyYmdC5ob3N0QmluZGluZ3MoMSxlKX1mdW5jdGlvbiBnZCh0LGUpe25nRGV2TW9kZSYmQW8odCksZS5mbGFnc3w9MiwodC5jb21wb25lbnRzfHwodC5jb21wb25lbnRzPW5nRGV2TW9kZT9uZXcgRGM6W10pKS5wdXNoKGUuaW5kZXgpfWZ1bmN0aW9uIGhkKHQsZSxuKXtpZihuKXtpZihlLmV4cG9ydEFzKWZvcihsZXQgbz0wO288ZS5leHBvcnRBcy5sZW5ndGg7bysrKW5bZS5leHBvcnRBc1tvXV09dDt4byhlKSYmKG5bIiJdPXQpfX1mdW5jdGlvbiBiZCh0LGUsbil7bmdEZXZNb2RlJiZjbihuLHQuZGlyZWN0aXZlRW5kLXQuZGlyZWN0aXZlU3RhcnQsIlJlYWNoZWQgdGhlIG1heCBudW1iZXIgb2YgZGlyZWN0aXZlcyIpLHQuZmxhZ3N8PTEsdC5kaXJlY3RpdmVTdGFydD1lLHQuZGlyZWN0aXZlRW5kPWUrbix0LnByb3ZpZGVySW5kZXhlcz1lfWZ1bmN0aW9uIHlkKHQsZSxuLG8saSl7bmdEZXZNb2RlJiZnbihvLGdvLCJNdXN0IGJlIGluIEV4cGFuZG8gc2VjdGlvbiIpLHQuZGF0YVtvXT1pO2NvbnN0IGE9aS5mYWN0b3J5fHwoaS5mYWN0b3J5PUZvKGkudHlwZSwhMCkpLHI9bmV3IG5hKGEseG8oaSksbnVsbCk7dC5ibHVlcHJpbnRbb109cixuW29dPXIsdWQodCxlLDAsbyxLYyh0LG4saS5ob3N0VmFycyxhYyksaSl9ZnVuY3Rpb24gX2QodCxlLG4pe2NvbnN0IG89b2koZSx0KSxpPWlkKG4pLGE9dFsxMF0scj1EZCh0LHFjKHQsaSxudWxsLG4ub25QdXNoPzY0OjE2LG8sZSxhLGEuY3JlYXRlUmVuZGVyZXIobyxuKSxudWxsLG51bGwpKTt0W2UuaW5kZXhdPXJ9ZnVuY3Rpb24gQ2QodCxlLG4sbyxpLGEpe25nRGV2TW9kZSYmKHBuKG8sYWMsIkluY29taW5nIHZhbHVlIHNob3VsZCBuZXZlciBiZSBOT19DSEFOR0UuIiksKGZ1bmN0aW9uIHIodCl7aWYodC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoIm9uIikpe2NvbnN0IGU9YEJpbmRpbmcgdG8gZXZlbnQgYXR0cmlidXRlICcke3R9JyBpcyBkaXNhbGxvd2VkIGZvciBzZWN1cml0eSByZWFzb25zLCBwbGVhc2UgdXNlICgke3Quc2xpY2UoMil9KT0uLi5gO3Rocm93IG5ldyBFcnJvcihlKX19KShuKSxpYSh0LDIsYEF0dGVtcHRlZCB0byBzZXQgYXR0cmlidXRlIFxgJHtufVxgIG9uIGEgY29udGFpbmVyIG5vZGUuIEhvc3QgYmluZGluZ3MgYXJlIG5vdCB2YWxpZCBvbiBuZy1jb250YWluZXIgb3IgbmctdGVtcGxhdGUuYCkpO2NvbnN0IHM9b2kodCxlKTtNZChlWzExXSxzLGEsdC52YWx1ZSxuLG8saSl9ZnVuY3Rpb24gTWQodCxlLG4sbyxpLGEscil7aWYobnVsbD09YSluZ0Rldk1vZGUmJm5nRGV2TW9kZS5yZW5kZXJlclJlbW92ZUF0dHJpYnV0ZSsrLCRvKHQpP3QucmVtb3ZlQXR0cmlidXRlKGUsaSxuKTplLnJlbW92ZUF0dHJpYnV0ZShpKTtlbHNle25nRGV2TW9kZSYmbmdEZXZNb2RlLnJlbmRlcmVyU2V0QXR0cmlidXRlKys7Y29uc3Qgcz1udWxsPT1yPyRlKGEpOnIoYSxvfHwiIixpKTskbyh0KT90LnNldEF0dHJpYnV0ZShlLGkscyxuKTpuP2Uuc2V0QXR0cmlidXRlTlMobixpLHMpOmUuc2V0QXR0cmlidXRlKGkscyl9fWZ1bmN0aW9uIHZkKHQsZSxuLG8saSxhKXtjb25zdCByPWFbZV07aWYobnVsbCE9PXIpe2NvbnN0IGU9by5zZXRJbnB1dDtmb3IobGV0IGE9MDthPHIubGVuZ3RoOyl7Y29uc3Qgcz1yW2ErK10sbD1yW2ErK10sYz1yW2ErK107bnVsbCE9PWU/by5zZXRJbnB1dChuLGMscyxsKTpuW2xdPWMsbmdEZXZNb2RlJiZjZCh0LG9pKGksdCksaS50eXBlLGwsYyl9fX1mdW5jdGlvbiB4ZCh0LGUpe2xldCBuPW51bGwsbz0wO2Zvcig7bzxlLmxlbmd0aDspe2NvbnN0IGk9ZVtvXTtpZigwIT09aSlpZig1IT09aSl7aWYoIm51bWJlciI9PXR5cGVvZiBpKWJyZWFrO3QuaGFzT3duUHJvcGVydHkoaSkmJihudWxsPT09biYmKG49W10pLG4ucHVzaChpLHRbaV0sZVtvKzFdKSksbys9Mn1lbHNlIG8rPTI7ZWxzZSBvKz00fXJldHVybiBufWNvbnN0IE9kPSgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmVW4oKSYmdGwoIkxDb250YWluZXIiKTtmdW5jdGlvbiBQZCh0LGUsbixvKXtuZ0Rldk1vZGUmJlJvKGUpLG5nRGV2TW9kZSYmISRvKGVbMTFdKSYmeW4obik7Y29uc3QgaT1uZXcobmdEZXZNb2RlP09kOkFycmF5KSh0LCEwLCExLGUsbnVsbCwwLG8sbixudWxsLG51bGwpO3JldHVybiBuZ0Rldk1vZGUmJmxuKGkubGVuZ3RoLGJvLCJTaG91bGQgYWxsb2NhdGUgY29ycmVjdCBudW1iZXIgb2Ygc2xvdHMgZm9yIExDb250YWluZXIgaGVhZGVyLiIpLG5nRGV2TW9kZSYmKGZ1bmN0aW9uIGEodCl7aGModCxuZXcgR2ModCkpfSkoaSksaX1mdW5jdGlvbiB3ZCh0LGUpe25nRGV2TW9kZSYmbG4oc2kodCksITEsIlNob3VsZCBiZSBydW4gaW4gdXBkYXRlIG1vZGUiKTtjb25zdCBuPXJpKGUsdCk7aWYobGkobikpe2NvbnN0IHQ9blsxXTs4MCZuWzJdP1FjKHQsbix0LnRlbXBsYXRlLG5bOF0pOm5bNV0+MCYma2Qobil9fWZ1bmN0aW9uIGtkKHQpe2ZvcihsZXQgZT1mbCh0KTtudWxsIT09ZTtlPWdsKGUpKWZvcihsZXQgdD1ibzt0PGUubGVuZ3RoO3QrKyl7Y29uc3Qgbj1lW3RdO2lmKDEwMjQmblsyXSl7Y29uc3QgdD1uWzFdO25nRGV2TW9kZSYmaG4odCwiVFZpZXcgbXVzdCBiZSBhbGxvY2F0ZWQiKSxRYyh0LG4sdC50ZW1wbGF0ZSxuWzhdKX1lbHNlIG5bNV0+MCYma2Qobil9Y29uc3QgZT10WzFdLmNvbXBvbmVudHM7aWYobnVsbCE9PWUpZm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2NvbnN0IG89cmkoZVtuXSx0KTtsaShvKSYmb1s1XT4wJiZrZChvKX19ZnVuY3Rpb24gU2QodCxlKXtuZ0Rldk1vZGUmJmxuKHNpKHQpLCEwLCJTaG91bGQgYmUgcnVuIGluIGNyZWF0aW9uIG1vZGUiKTtjb25zdCBuPXJpKGUsdCksbz1uWzFdOyEoZnVuY3Rpb24gaSh0LGUpe2ZvcihsZXQgbj1lLmxlbmd0aDtuPHQuYmx1ZXByaW50Lmxlbmd0aDtuKyspZS5wdXNoKHQuYmx1ZXByaW50W25dKX0pKG8sbiksSmMobyxuLG5bOF0pfWZ1bmN0aW9uIERkKHQsZSl7cmV0dXJuIHRbMTNdP3RbMTRdWzRdPWU6dFsxM109ZSx0WzE0XT1lLGV9ZnVuY3Rpb24gRWQodCl7Zm9yKDt0Oyl7dFsyXXw9NjQ7Y29uc3QgZT1tbCh0KTtpZigwIT0oNTEyJnRbMl0pJiYhZSlyZXR1cm4gdDt0PWV9cmV0dXJuIG51bGx9ZnVuY3Rpb24gUmQodCl7Zm9yKGxldCBlPTA7ZTx0LmNvbXBvbmVudHMubGVuZ3RoO2UrKyl7Y29uc3Qgbj10LmNvbXBvbmVudHNbZV0sbz1WcyhuKSxpPW9bMV07JGMoaSxvLGkudGVtcGxhdGUsbil9fWZ1bmN0aW9uIEFkKHQsZSxuKXtjb25zdCBvPWVbMTBdO28uYmVnaW4mJm8uYmVnaW4oKTt0cnl7UWModCxlLHQudGVtcGxhdGUsbil9Y2F0Y2godCl7dGhyb3cgQmQoZSx0KSx0fWZpbmFsbHl7by5lbmQmJm8uZW5kKCl9fWZ1bmN0aW9uIFRkKHQpe1JkKHRbOF0pfWZ1bmN0aW9uIE5kKHQsZSxuKXtuZ0Rldk1vZGUmJmhuKGUsIlZpZXcgcXVlcmllcyBmdW5jdGlvbiB0byBleGVjdXRlIG11c3QgYmUgZGVmaW5lZC4iKSx6aSgwKSxlKHQsbil9ZnVuY3Rpb24gemQodCxlLG4sbywuLi5pKXtpZihudWxsPT09dFtvXSYmKG51bGw9PWUuaW5wdXRzfHwhZS5pbnB1dHNbbl0pKXsoZS5wcm9wZXJ0eUJpbmRpbmdzfHwoZS5wcm9wZXJ0eUJpbmRpbmdzPVtdKSkucHVzaChvKTtsZXQgYT1uO2kubGVuZ3RoPjAmJihhKz1hbCtpLmpvaW4oYWwpKSx0W29dPWF9fWNvbnN0IElkPVdjO2Z1bmN0aW9uIEhkKHQpe3JldHVybiB0WzddfHwodFs3XT1uZ0Rldk1vZGU/bmV3IEFjOltdKX1mdW5jdGlvbiBGZCh0KXtyZXR1cm4gdC5jbGVhbnVwfHwodC5jbGVhbnVwPW5nRGV2TW9kZT9uZXcgVGM6W10pfWZ1bmN0aW9uIExkKHQsZSxuKXtyZXR1cm4obnVsbD09PXR8fHhvKHQpKSYmKG49KGZ1bmN0aW9uIG8odCl7Zm9yKDtBcnJheS5pc0FycmF5KHQpOyl7aWYoIm9iamVjdCI9PXR5cGVvZiB0WzFdKXJldHVybiB0O3Q9dFswXX1yZXR1cm4gbnVsbH0pKG5bZS5pbmRleF0pKSxuWzExXX1mdW5jdGlvbiBCZCh0LGUpe2NvbnN0IG49dFs5XSxvPW4/bi5nZXQoWnMsbnVsbCk6bnVsbDtvJiZvLmhhbmRsZUVycm9yKGUpfWZ1bmN0aW9uIFZkKHQsZSxuLG8saSl7Zm9yKGxldCBhPTA7YTxuLmxlbmd0aDspe2NvbnN0IHI9blthKytdLHM9blthKytdLGw9ZVtyXTtuZ0Rldk1vZGUmJl9uKGUscik7Y29uc3QgYz10LmRhdGFbcl07bnVsbCE9PWMuc2V0SW5wdXQ/Yy5zZXRJbnB1dChsLGksbyxzKTpsW3NdPWl9fWZ1bmN0aW9uIGpkKHQsZSxuKXtuZ0Rldk1vZGUmJnNuKG4sIlZhbHVlIHNob3VsZCBiZSBhIHN0cmluZyIpLG5nRGV2TW9kZSYmcG4obixhYywidmFsdWUgc2hvdWxkIG5vdCBiZSBOT19DSEFOR0UiKSxuZ0Rldk1vZGUmJl9uKHQsZSk7Y29uc3Qgbz1uaShlLHQpO25nRGV2TW9kZSYmaG4obywibmF0aXZlIGVsZW1lbnQgc2hvdWxkIGV4aXN0IiksX2wodFsxMV0sbyxuKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gVWQodCxlLG4pe25nRGV2TW9kZSYmQW8oZ2koKSwiRXhwZWN0aW5nIHRvIGJlIGNhbGxlZCBpbiBmaXJzdCB0ZW1wbGF0ZSBwYXNzIG9ubHkiKTtsZXQgbz1uP3Quc3R5bGVzOm51bGwsaT1uP3QuY2xhc3NlczpudWxsLGE9MDtpZihudWxsIT09ZSlmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7Y29uc3Qgbj1lW3RdOyJudW1iZXIiPT10eXBlb2Ygbj9hPW46MT09YT9pPVdlKGksbik6Mj09YSYmKG89V2UobyxuKyI6ICIrZVsrK3RdKyI7IikpfW4/dC5zdHlsZXM9bzp0LnN0eWxlc1dpdGhvdXRIb3N0PW8sbj90LmNsYXNzZXM9aTp0LmNsYXNzZXNXaXRob3V0SG9zdD1pfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IEdkPW5ldyBHYSgiSU5KRUNUT1IiLC0xKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgV2R7Z2V0KHQsZT1ncil7aWYoZT09PWdyKXtjb25zdCBlPW5ldyBFcnJvcihgTnVsbEluamVjdG9yRXJyb3I6IE5vIHByb3ZpZGVyIGZvciAke0dlKHQpfSFgKTt0aHJvdyBlLm5hbWU9Ik51bGxJbmplY3RvckVycm9yIixlfXJldHVybiBlfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3QgWWQ9bmV3IEdhKCJTZXQgSW5qZWN0b3Igc2NvcGUuIikscWQ9e30sWmQ9e307Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2xldCBYZDtmdW5jdGlvbiBLZCgpe3JldHVybiB2b2lkIDA9PT1YZCYmKFhkPW5ldyBXZCksWGR9ZnVuY3Rpb24gSmQodCxlPW51bGwsbj1udWxsLG8pe3JldHVybiBuZXcgUWQodCxuLGV8fEtkKCksbyl9Y2xhc3MgUWR7Y29uc3RydWN0b3IodCxlLG4sbz1udWxsKXt0aGlzLnBhcmVudD1uLHRoaXMucmVjb3Jkcz1uZXcgTWFwLHRoaXMuaW5qZWN0b3JEZWZUeXBlcz1uZXcgU2V0LHRoaXMub25EZXN0cm95PW5ldyBTZXQsdGhpcy5fZGVzdHJveWVkPSExO2NvbnN0IGk9W107ZSYmZXIoZSwobj0+dGhpcy5wcm9jZXNzUHJvdmlkZXIobix0LGUpKSksZXIoW3RdLCh0PT50aGlzLnByb2Nlc3NJbmplY3RvclR5cGUodCxbXSxpKSkpLHRoaXMucmVjb3Jkcy5zZXQoR2QsZXAodm9pZCAwLHRoaXMpKTtjb25zdCBhPXRoaXMucmVjb3Jkcy5nZXQoWWQpO3RoaXMuc2NvcGU9bnVsbCE9YT9hLnZhbHVlOm51bGwsdGhpcy5zb3VyY2U9b3x8KCJvYmplY3QiPT10eXBlb2YgdD9udWxsOkdlKHQpKX1nZXQgZGVzdHJveWVkKCl7cmV0dXJuIHRoaXMuX2Rlc3Ryb3llZH1kZXN0cm95KCl7dGhpcy5hc3NlcnROb3REZXN0cm95ZWQoKSx0aGlzLl9kZXN0cm95ZWQ9ITA7dHJ5e3RoaXMub25EZXN0cm95LmZvckVhY2goKHQ9PnQubmdPbkRlc3Ryb3koKSkpfWZpbmFsbHl7dGhpcy5yZWNvcmRzLmNsZWFyKCksdGhpcy5vbkRlc3Ryb3kuY2xlYXIoKSx0aGlzLmluamVjdG9yRGVmVHlwZXMuY2xlYXIoKX19Z2V0KHQsZT1ncixuPUVuLkRlZmF1bHQpe3RoaXMuYXNzZXJ0Tm90RGVzdHJveWVkKCk7Y29uc3Qgbz1Dcih0aGlzKSxpPUFuKHZvaWQgMCk7dHJ5e2lmKCEobiZFbi5Ta2lwU2VsZikpe2xldCBlPXRoaXMucmVjb3Jkcy5nZXQodCk7aWYodm9pZCAwPT09ZSl7Y29uc3Qgbj0oZnVuY3Rpb24gbyh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdHx8Im9iamVjdCI9PXR5cGVvZiB0JiZ0IGluc3RhbmNlb2YgR2F9KSh0KSYmeG4odCk7ZT1uJiZ0aGlzLmluamVjdGFibGVEZWZJblNjb3BlKG4pP2VwKCRkKHQpLHFkKTpudWxsLHRoaXMucmVjb3Jkcy5zZXQodCxlKX1pZihudWxsIT1lKXJldHVybiB0aGlzLmh5ZHJhdGUodCxlKX1yZXR1cm4obiZFbi5TZWxmP0tkKCk6dGhpcy5wYXJlbnQpLmdldCh0LGU9biZFbi5PcHRpb25hbCYmZT09PWdyP251bGw6ZSl9Y2F0Y2goZSl7aWYoIk51bGxJbmplY3RvckVycm9yIj09PWUubmFtZSl7aWYoKGUubmdUZW1wVG9rZW5QYXRoPWUubmdUZW1wVG9rZW5QYXRofHxbXSkudW5zaGlmdChHZSh0KSksbyl0aHJvdyBlO3JldHVybihmdW5jdGlvbiBuKHQsZSxvLGkpe2NvbnN0IGE9dC5uZ1RlbXBUb2tlblBhdGg7dGhyb3cgZVticl0mJmEudW5zaGlmdChlW2JyXSksdC5tZXNzYWdlPShmdW5jdGlvbiByKHQsZSxuLG89bnVsbCl7dD10JiYiXG4iPT09dC5jaGFyQXQoMCkmJiLJtSI9PXQuY2hhckF0KDEpP3Quc3Vic3RyKDIpOnQ7bGV0IGk9R2UoZSk7aWYoQXJyYXkuaXNBcnJheShlKSlpPWUubWFwKEdlKS5qb2luKCIgLT4gIik7ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIGUpe2xldCB0PVtdO2ZvcihsZXQgbiBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkobikpe2xldCBvPWVbbl07dC5wdXNoKG4rIjoiKygic3RyaW5nIj09dHlwZW9mIG8/SlNPTi5zdHJpbmdpZnkobyk6R2UobykpKX1pPWB7JHt0LmpvaW4oIiwgIil9fWB9cmV0dXJuYCR7bn0ke28/IigiK28rIikiOiIifVske2l9XTogJHt0LnJlcGxhY2UoaHIsIlxuICAiKX1gfSkoIlxuIit0Lm1lc3NhZ2UsYSxvLGkpLHQubmdUb2tlblBhdGg9YSx0Lm5nVGVtcFRva2VuUGF0aD1udWxsLHR9KShlLHQsIlIzSW5qZWN0b3JFcnJvciIsdGhpcy5zb3VyY2UpfXRocm93IGV9ZmluYWxseXtBbihpKSxDcihvKX19X3Jlc29sdmVJbmplY3RvckRlZlR5cGVzKCl7dGhpcy5pbmplY3RvckRlZlR5cGVzLmZvckVhY2goKHQ9PnRoaXMuZ2V0KHQpKSl9dG9TdHJpbmcoKXtjb25zdCB0PVtdO3JldHVybiB0aGlzLnJlY29yZHMuZm9yRWFjaCgoKGUsbik9PnQucHVzaChHZShuKSkpKSxgUjNJbmplY3Rvclske3Quam9pbigiLCAiKX1dYH1hc3NlcnROb3REZXN0cm95ZWQoKXtpZih0aGlzLl9kZXN0cm95ZWQpdGhyb3cgbmV3IEVycm9yKCJJbmplY3RvciBoYXMgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZC4iKX1wcm9jZXNzSW5qZWN0b3JUeXBlKHQsZSxuKXtpZighKHQ9WmUodCkpKXJldHVybiExO2xldCBvPVBuKHQpO2NvbnN0IGk9bnVsbD09byYmdC5uZ01vZHVsZXx8dm9pZCAwLGE9dm9pZCAwPT09aT90Omk7bmdEZXZNb2RlJiYtMSE9PWUuaW5kZXhPZihhKSYmZW4oR2UoYSksZS5tYXAoR2UpKTtjb25zdCByPS0xIT09bi5pbmRleE9mKGEpO2lmKHZvaWQgMCE9PWkmJihvPVBuKGkpKSxudWxsPT1vKXJldHVybiExO2lmKG51bGwhPW8uaW1wb3J0cyYmIXIpe2xldCB0O25nRGV2TW9kZSYmZS5wdXNoKGEpLG4ucHVzaChhKTt0cnl7ZXIoby5pbXBvcnRzLChvPT57dGhpcy5wcm9jZXNzSW5qZWN0b3JUeXBlKG8sZSxuKSYmKHZvaWQgMD09PXQmJih0PVtdKSx0LnB1c2gobykpfSkpfWZpbmFsbHl7bmdEZXZNb2RlJiZlLnBvcCgpfWlmKHZvaWQgMCE9PXQpZm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2NvbnN0e25nTW9kdWxlOm4scHJvdmlkZXJzOm99PXRbZV07ZXIobywodD0+dGhpcy5wcm9jZXNzUHJvdmlkZXIodCxuLG98fFduKSkpfX10aGlzLmluamVjdG9yRGVmVHlwZXMuYWRkKGEpO2NvbnN0IHM9Rm8oYSl8fCgoKT0+bmV3IGEpO3RoaXMucmVjb3Jkcy5zZXQoYSxlcChzLHFkKSk7Y29uc3QgbD1vLnByb3ZpZGVycztpZihudWxsIT1sJiYhcil7Y29uc3QgZT10O2VyKGwsKHQ9PnRoaXMucHJvY2Vzc1Byb3ZpZGVyKHQsZSxsKSkpfXJldHVybiB2b2lkIDAhPT1pJiZ2b2lkIDAhPT10LnByb3ZpZGVyc31wcm9jZXNzUHJvdmlkZXIodCxlLG4pe2xldCBvPW9wKHQ9WmUodCkpP3Q6WmUodCYmdC5wcm92aWRlKTtjb25zdCBpPShmdW5jdGlvbiBhKHQsZSxuKXtyZXR1cm4gbnAodCk/ZXAodm9pZCAwLHQudXNlVmFsdWUpOmVwKHRwKHQsZSxuKSxxZCl9KSh0LGUsbik7aWYob3AodCl8fCEwIT09dC5tdWx0aSl7Y29uc3QgdD10aGlzLnJlY29yZHMuZ2V0KG8pO25nRGV2TW9kZSYmdCYmdm9pZCAwIT09dC5tdWx0aSYmbm4oKX1lbHNle2xldCBlPXRoaXMucmVjb3Jkcy5nZXQobyk7ZT9uZ0Rldk1vZGUmJnZvaWQgMD09PWUubXVsdGkmJm5uKCk6KGU9ZXAodm9pZCAwLHFkLCEwKSxlLmZhY3Rvcnk9KCk9PlByKGUubXVsdGkpLHRoaXMucmVjb3Jkcy5zZXQobyxlKSksbz10LGUubXVsdGkucHVzaCh0KX10aGlzLnJlY29yZHMuc2V0KG8saSl9aHlkcmF0ZSh0LGUpe3JldHVybiBuZ0Rldk1vZGUmJmUudmFsdWU9PT1aZD9lbihHZSh0KSk6ZS52YWx1ZT09PXFkJiYoZS52YWx1ZT1aZCxlLnZhbHVlPWUuZmFjdG9yeSgpKSwib2JqZWN0Ij09dHlwZW9mIGUudmFsdWUmJmUudmFsdWUmJihmdW5jdGlvbiBuKHQpe3JldHVybiBudWxsIT09dCYmIm9iamVjdCI9PXR5cGVvZiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5uZ09uRGVzdHJveX0pKGUudmFsdWUpJiZ0aGlzLm9uRGVzdHJveS5hZGQoZS52YWx1ZSksZS52YWx1ZX1pbmplY3RhYmxlRGVmSW5TY29wZSh0KXtpZighdC5wcm92aWRlZEluKXJldHVybiExO2NvbnN0IGU9WmUodC5wcm92aWRlZEluKTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/ImFueSI9PT1lfHxlPT09dGhpcy5zY29wZTp0aGlzLmluamVjdG9yRGVmVHlwZXMuaGFzKGUpfX1mdW5jdGlvbiAkZCh0KXtjb25zdCBlPXhuKHQpLG49bnVsbCE9PWU/ZS5mYWN0b3J5OkZvKHQpO2lmKG51bGwhPT1uKXJldHVybiBuO2lmKHQgaW5zdGFuY2VvZiBHYSl0aHJvdyBuZXcgRXJyb3IoYFRva2VuICR7R2UodCl9IGlzIG1pc3NpbmcgYSDJtXByb3YgZGVmaW5pdGlvbi5gKTtpZih0IGluc3RhbmNlb2YgRnVuY3Rpb24pcmV0dXJuKGZ1bmN0aW9uIG8odCl7Y29uc3QgZT10Lmxlbmd0aDtpZihlPjApe2NvbnN0IG49aXIoZSwiPyIpO3Rocm93IG5ldyBFcnJvcihgQ2FuJ3QgcmVzb2x2ZSBhbGwgcGFyYW1ldGVycyBmb3IgJHtHZSh0KX06ICgke24uam9pbigiLCAiKX0pLmApfWNvbnN0IG49KGZ1bmN0aW9uIG8odCl7Y29uc3QgZT10JiYodFt3bl18fHRbU25dKTtpZihlKXtjb25zdCBuPShmdW5jdGlvbiBuKHQpe2lmKHQuaGFzT3duUHJvcGVydHkoIm5hbWUiKSlyZXR1cm4gdC5uYW1lO2NvbnN0IGU9KCIiK3QpLm1hdGNoKC9eZnVuY3Rpb25ccyooW15ccyhdKykvKTtyZXR1cm4gbnVsbD09PWU/IiI6ZVsxXX0pKHQpO3JldHVybiBjb25zb2xlLndhcm4oYERFUFJFQ0FURUQ6IERJIGlzIGluc3RhbnRpYXRpbmcgYSB0b2tlbiAiJHtufSIgdGhhdCBpbmhlcml0cyBpdHMgQEluamVjdGFibGUgZGVjb3JhdG9yIGJ1dCBkb2VzIG5vdCBwcm92aWRlIG9uZSBpdHNlbGYuXG5UaGlzIHdpbGwgYmVjb21lIGFuIGVycm9yIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgQW5ndWxhci4gUGxlYXNlIGFkZCBASW5qZWN0YWJsZSgpIHRvIHRoZSAiJHtufSIgY2xhc3MuYCksZX1yZXR1cm4gbnVsbH0pKHQpO3JldHVybiBudWxsIT09bj8oKT0+bi5mYWN0b3J5KHQpOigpPT5uZXcgdH0pKHQpO3Rocm93IG5ldyBFcnJvcigidW5yZWFjaGFibGUiKX1mdW5jdGlvbiB0cCh0LGUsbil7bGV0IG87aWYob3AodCkpe2NvbnN0IGU9WmUodCk7cmV0dXJuIEZvKGUpfHwkZChlKX1pZihucCh0KSlvPSgpPT5aZSh0LnVzZVZhbHVlKTtlbHNlIGlmKChmdW5jdGlvbiBpKHQpe3JldHVybiEoIXR8fCF0LnVzZUZhY3RvcnkpfSkodCkpbz0oKT0+dC51c2VGYWN0b3J5KC4uLlByKHQuZGVwc3x8W10pKTtlbHNlIGlmKChmdW5jdGlvbiBhKHQpe3JldHVybiEoIXR8fCF0LnVzZUV4aXN0aW5nKX0pKHQpKW89KCk9PnZyKFplKHQudXNlRXhpc3RpbmcpKTtlbHNle2NvbnN0IGk9WmUodCYmKHQudXNlQ2xhc3N8fHQucHJvdmlkZSkpO2lmKG5nRGV2TW9kZSYmIWkmJihmdW5jdGlvbiByKHQsZSxuKXtsZXQgbz0iIjt0aHJvdyB0JiZlJiYobz1gIC0gb25seSBpbnN0YW5jZXMgb2YgUHJvdmlkZXIgYW5kIFR5cGUgYXJlIGFsbG93ZWQsIGdvdDogWyR7ZS5tYXAoKHQ9PnQ9PW4/Ij8iK24rIj8iOiIuLi4iKSkuam9pbigiLCAiKX1dYCksbmV3IEVycm9yKGBJbnZhbGlkIHByb3ZpZGVyIGZvciB0aGUgTmdNb2R1bGUgJyR7R2UodCl9J2Arbyl9KShlLG4sdCksIShmdW5jdGlvbiBzKHQpe3JldHVybiEhdC5kZXBzfSkodCkpcmV0dXJuIEZvKGkpfHwkZChpKTtvPSgpPT5uZXcgaSguLi5Qcih0LmRlcHMpKX1yZXR1cm4gb31mdW5jdGlvbiBlcCh0LGUsbj0hMSl7cmV0dXJue2ZhY3Rvcnk6dCx2YWx1ZTplLG11bHRpOm4/W106dm9pZCAwfX1mdW5jdGlvbiBucCh0KXtyZXR1cm4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdCYmeXIgaW4gdH1mdW5jdGlvbiBvcCh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH1jb25zdCBpcD1mdW5jdGlvbiBhcCh0LGUsbil7cmV0dXJuKGZ1bmN0aW9uIG8odCxlPW51bGwsbj1udWxsLGkpe2NvbnN0IGE9SmQodCxlLG4saSk7cmV0dXJuIGEuX3Jlc29sdmVJbmplY3RvckRlZlR5cGVzKCksYX0pKHtuYW1lOm59LGUsdCxuKX07Y2xhc3MgcnB7c3RhdGljIGNyZWF0ZSh0LGUpe3JldHVybiBBcnJheS5pc0FycmF5KHQpP2lwKHQsZSwiIik6aXAodC5wcm92aWRlcnMsdC5wYXJlbnQsdC5uYW1lfHwiIil9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KZnVuY3Rpb24gc3AodCl7YnAodCk7Y29uc3QgZT1Jcyh0KTtyZXR1cm4gbnVsbD09PWU/bnVsbDoodm9pZCAwPT09ZS5jb21wb25lbnQmJihlLmNvbXBvbmVudD0oZnVuY3Rpb24gbih0LGUpe2NvbnN0IG49ZVsxXS5kYXRhW3RdO3JldHVybiAyJm4uZmxhZ3M/ZVtuLmRpcmVjdGl2ZVN0YXJ0XTpudWxsfSkoZS5ub2RlSW5kZXgsZS5sVmlldykpLGUuY29tcG9uZW50KX1mdW5jdGlvbiBscCh0KXticCh0KTtjb25zdCBlPUlzKHQpO3JldHVybiBudWxsPT09ZT9udWxsOmUubFZpZXdbOF19ZnVuY3Rpb24gY3AodCl7Y29uc3QgZT1Jcyh0KTtpZihudWxsPT09ZSlyZXR1cm4gbnVsbDtsZXQgbixvPWUubFZpZXc7Zm9yKG5nRGV2TW9kZSYmUm8obyk7Mj09PW9bMV0udHlwZSYmKG49bWwobykpOylvPW47cmV0dXJuIDUxMiZvWzJdP251bGw6b1s4XX1mdW5jdGlvbiBkcCh0KXtyZXR1cm5bLi4udWwodCkuY29tcG9uZW50c119ZnVuY3Rpb24gcHAodCl7Y29uc3QgZT1Jcyh0KTtyZXR1cm4gbnVsbD09PWU/cnAuTlVMTDpuZXcgUmEoZS5sVmlld1sxXS5kYXRhW2Uubm9kZUluZGV4XSxlLmxWaWV3KX1mdW5jdGlvbiBtcCh0KXtpZih0IGluc3RhbmNlb2YgVGV4dClyZXR1cm5bXTtjb25zdCBlPUlzKHQpO2lmKG51bGw9PT1lKXJldHVybltdO2NvbnN0IG49ZS5sVmlldyxvPW5bMV0saT1lLm5vZGVJbmRleDtyZXR1cm4obnVsbD09bz92b2lkIDA6by5kYXRhW2ldKT8odm9pZCAwPT09ZS5kaXJlY3RpdmVzJiYoZS5kaXJlY3RpdmVzPVdzKGksbiwhMSkpLG51bGw9PT1lLmRpcmVjdGl2ZXM/W106Wy4uLmUuZGlyZWN0aXZlc10pOltdfWZ1bmN0aW9uIHVwKHQpe2NvbnN0e2NvbnN0cnVjdG9yOmV9PXQ7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gZmluZCB0aGUgaW5zdGFuY2UgY29uc3RydWN0b3IiKTtjb25zdCBuPXBvKGUpO2lmKG4pcmV0dXJue2lucHV0czpuLmlucHV0cyxvdXRwdXRzOm4ub3V0cHV0cyxlbmNhcHN1bGF0aW9uOm4uZW5jYXBzdWxhdGlvbixjaGFuZ2VEZXRlY3Rpb246bi5vblB1c2g/em4uT25QdXNoOnpuLkRlZmF1bHR9O2NvbnN0IG89bW8oZSk7cmV0dXJuIG8/e2lucHV0czpvLmlucHV0cyxvdXRwdXRzOm8ub3V0cHV0c306bnVsbH1mdW5jdGlvbiBmcCh0KXtyZXR1cm4gSXModCkubmF0aXZlfWZ1bmN0aW9uIGdwKHQpe2JwKHQpO2NvbnN0IGU9SXModCk7aWYobnVsbD09PWUpcmV0dXJuW107Y29uc3Qgbj1lLmxWaWV3LG89bls3XSxpPW5bMV0uY2xlYW51cCxhPVtdO2lmKGkmJm8pZm9yKGxldCBlPTA7ZTxpLmxlbmd0aDspe2NvbnN0IHI9aVtlKytdLHM9aVtlKytdO2lmKCJzdHJpbmciPT10eXBlb2Ygcil7Y29uc3QgbD1yLGM9ZWkobltzXSksZD1vW2lbZSsrXV0scD1pW2UrK10sbT0iYm9vbGVhbiI9PXR5cGVvZiBwfHxwPj0wPyJkb20iOiJvdXRwdXQiLHU9ImJvb2xlYW4iPT10eXBlb2YgcCYmcDt0PT1jJiZhLnB1c2goe2VsZW1lbnQ6dCxuYW1lOmwsY2FsbGJhY2s6ZCx1c2VDYXB0dXJlOnUsdHlwZTptfSl9fXJldHVybiBhLnNvcnQoaHApLGF9ZnVuY3Rpb24gaHAodCxlKXtyZXR1cm4gdC5uYW1lPT1lLm5hbWU/MDp0Lm5hbWU8ZS5uYW1lPy0xOjF9ZnVuY3Rpb24gYnAodCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBFbGVtZW50JiYhKHQgaW5zdGFuY2VvZiBFbGVtZW50KSl0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGluZyBpbnN0YW5jZSBvZiBET00gRWxlbWVudCIpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiB5cCh0KXsoZnVuY3Rpb24gZSh0KXtuZ0Rldk1vZGUmJmhuKHQsImNvbXBvbmVudCIpO2NvbnN0IGU9RWQoRnModCkpO25nRGV2TW9kZSYmaG4oZVs4XSwicm9vdENvbnRleHQgc2hvdWxkIGJlIGRlZmluZWQiKSwoZnVuY3Rpb24gbih0LGUpe2lmKDA9PT10LmZsYWdzJiZ0LmNsZWFuPT1XYyl7bGV0IG47dC5mbGFnc3w9ZSx0LmNsZWFuPW5ldyBQcm9taXNlKCh0PT5uPXQpKSx0LnNjaGVkdWxlcigoKCk9PntpZigxJnQuZmxhZ3MmJih0LmZsYWdzJj0tMixSZCh0KSksMiZ0LmZsYWdzKXt0LmZsYWdzJj0tMztjb25zdCBlPXQucGxheWVySGFuZGxlcjtlJiZlLmZsdXNoUGxheWVycygpfXQuY2xlYW49V2MsbihudWxsKX0pKX19KShlWzhdLDEpfSkodCksZHAodCkuZm9yRWFjaCgodD0+KGZ1bmN0aW9uIGUodCl7Y29uc3QgZT1Gcyh0KTtBZChlWzFdLGUsdCl9KSh0KSkpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9ycC5USFJPV19JRl9OT1RfRk9VTkQ9Z3IscnAuTlVMTD1uZXcgV2QscnAuybVwcm92PU1uKHt0b2tlbjpycCxwcm92aWRlZEluOiJhbnkiLGZhY3Rvcnk6KCk9PnZyKEdkKX0pLHJwLl9fTkdfRUxFTUVOVF9JRF9fPS0xO2xldCBfcD0hMTtmdW5jdGlvbiBDcCh0LGUpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgQ09NUElMRUR8fCFDT01QSUxFRCl7Y29uc3Qgbj1qbjtpZihuZ0Rldk1vZGUmJmhuKGUsImZ1bmN0aW9uIG5vdCBkZWZpbmVkIiksbil7bGV0IG89bi5uZztvfHwobz1uLm5nPXt9KSxvW3RdPWV9fX1mdW5jdGlvbiBNcCh0LGUpe2NvbnN0IG49VnModCk7bmdEZXZNb2RlJiZobihuLCJMVmlldyBpcyByZXF1aXJlZCIpO2NvbnN0IG89blsxXSxpPWJpKCk7bmdEZXZNb2RlJiZobihpLCJUTm9kZSBpcyByZXF1aXJlZCIpLFhpKG8saSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIHZwKHQpe3JldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodC5wcm90b3R5cGUpLmNvbnN0cnVjdG9yfWZ1bmN0aW9uIHhwKHQpe2xldCBlPXZwKHQudHlwZSksbj0hMDtjb25zdCBvPVt0XTtmb3IoO2U7KXtsZXQgaTtpZih4byh0KSlpPWUuybVjbXB8fGUuybVkaXI7ZWxzZXtpZihlLsm1Y21wKXRocm93IG5ldyBFcnJvcigiRGlyZWN0aXZlcyBjYW5ub3QgaW5oZXJpdCBDb21wb25lbnRzIik7aT1lLsm1ZGlyfWlmKGkpe2lmKG4pe28ucHVzaChpKTtjb25zdCBlPXQ7ZS5pbnB1dHM9T3AodC5pbnB1dHMpLGUuZGVjbGFyZWRJbnB1dHM9T3AodC5kZWNsYXJlZElucHV0cyksZS5vdXRwdXRzPU9wKHQub3V0cHV0cyk7Y29uc3Qgbj1pLmhvc3RCaW5kaW5ncztuJiZrcCh0LG4pO2NvbnN0IGE9aS52aWV3UXVlcnkscj1pLmNvbnRlbnRRdWVyaWVzO2lmKGEmJlBwKHQsYSksciYmd3AodCxyKSxVZSh0LmlucHV0cyxpLmlucHV0cyksVWUodC5kZWNsYXJlZElucHV0cyxpLmRlY2xhcmVkSW5wdXRzKSxVZSh0Lm91dHB1dHMsaS5vdXRwdXRzKSx4byhpKSYmaS5kYXRhLmFuaW1hdGlvbil7Y29uc3QgZT10LmRhdGE7ZS5hbmltYXRpb249KGUuYW5pbWF0aW9ufHxbXSkuY29uY2F0KGkuZGF0YS5hbmltYXRpb24pfX1jb25zdCBlPWkuZmVhdHVyZXM7aWYoZSlmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rKyl7Y29uc3QgaT1lW29dO2kmJmkubmdJbmhlcml0JiZpKHQpLGk9PT14cCYmKG49ITEpfX1lPU9iamVjdC5nZXRQcm90b3R5cGVPZihlKX0hKGZ1bmN0aW9uIGkodCl7bGV0IGU9MCxuPW51bGw7Zm9yKGxldCBvPXQubGVuZ3RoLTE7bz49MDtvLS0pe2NvbnN0IGk9dFtvXTtpLmhvc3RWYXJzPWUrPWkuaG9zdFZhcnMsaS5ob3N0QXR0cnM9bGEoaS5ob3N0QXR0cnMsbj1sYShuLGkuaG9zdEF0dHJzKSl9fSkobyl9ZnVuY3Rpb24gT3AodCl7cmV0dXJuIHQ9PT1Hbj97fTp0PT09V24/W106dH1mdW5jdGlvbiBQcCh0LGUpe2NvbnN0IG49dC52aWV3UXVlcnk7dC52aWV3UXVlcnk9bj8odCxvKT0+e2UodCxvKSxuKHQsbyl9OmV9ZnVuY3Rpb24gd3AodCxlKXtjb25zdCBuPXQuY29udGVudFF1ZXJpZXM7dC5jb250ZW50UXVlcmllcz1uPyh0LG8saSk9PntlKHQsbyxpKSxuKHQsbyxpKX06ZX1mdW5jdGlvbiBrcCh0LGUpe2NvbnN0IG49dC5ob3N0QmluZGluZ3M7dC5ob3N0QmluZGluZ3M9bj8odCxvKT0+e2UodCxvKSxuKHQsbyl9OmV9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NvbnN0IFNwPVsicHJvdmlkZXJzUmVzb2x2ZXIiXSxEcD1bInRlbXBsYXRlIiwiZGVjbHMiLCJjb25zdHMiLCJ2YXJzIiwib25QdXNoIiwibmdDb250ZW50U2VsZWN0b3JzIiwic3R5bGVzIiwiZW5jYXBzdWxhdGlvbiIsInNjaGVtYXMiXTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmxldCBFcD1udWxsO2Z1bmN0aW9uIFJwKCl7aWYoIUVwKXtjb25zdCB0PWpuLlN5bWJvbDtpZih0JiZ0Lml0ZXJhdG9yKUVwPXQuaXRlcmF0b3I7ZWxzZXtjb25zdCB0PU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE1hcC5wcm90b3R5cGUpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7KytlKXtjb25zdCBuPXRbZV07ImVudHJpZXMiIT09biYmInNpemUiIT09biYmTWFwLnByb3RvdHlwZVtuXT09PU1hcC5wcm90b3R5cGUuZW50cmllcyYmKEVwPW4pfX19cmV0dXJuIEVwfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBBcCh0LGUpe2NvbnN0IG49TnAodCksbz1OcChlKTtpZihuJiZvKXJldHVybihmdW5jdGlvbiBpKHQsZSxuKXtjb25zdCBvPXRbUnAoKV0oKSxpPWVbUnAoKV0oKTtmb3IoOzspe2NvbnN0IHQ9by5uZXh0KCksZT1pLm5leHQoKTtpZih0LmRvbmUmJmUuZG9uZSlyZXR1cm4hMDtpZih0LmRvbmV8fGUuZG9uZSlyZXR1cm4hMTtpZighbih0LnZhbHVlLGUudmFsdWUpKXJldHVybiExfX0pKHQsZSxBcCk7e2NvbnN0IGk9dCYmKCJvYmplY3QiPT10eXBlb2YgdHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQpLGE9ZSYmKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUpO3JldHVybiEobnx8IWl8fG98fCFhKXx8T2JqZWN0LmlzKHQsZSl9fWNsYXNzIFRwe2NvbnN0cnVjdG9yKHQpe3RoaXMud3JhcHBlZD10fXN0YXRpYyB3cmFwKHQpe3JldHVybiBuZXcgVHAodCl9c3RhdGljIHVud3JhcCh0KXtyZXR1cm4gVHAuaXNXcmFwcGVkKHQpP3Qud3JhcHBlZDp0fXN0YXRpYyBpc1dyYXBwZWQodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBUcH19ZnVuY3Rpb24gTnAodCl7cmV0dXJuISF6cCh0KSYmKEFycmF5LmlzQXJyYXkodCl8fCEodCBpbnN0YW5jZW9mIE1hcCkmJlJwKClpbiB0KX1mdW5jdGlvbiB6cCh0KXtyZXR1cm4gbnVsbCE9PXQmJigiZnVuY3Rpb24iPT10eXBlb2YgdHx8Im9iamVjdCI9PXR5cGVvZiB0KX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gSXAodCxlLG4pe3JldHVybiB0W2VdPW59ZnVuY3Rpb24gSHAodCxlKXtyZXR1cm4gbmdEZXZNb2RlJiZfbih0LGUpLG5nRGV2TW9kZSYmcG4odFtlXSxhYywiU3RvcmVkIHZhbHVlIHNob3VsZCBuZXZlciBiZSBOT19DSEFOR0UuIiksdFtlXX1mdW5jdGlvbiBGcCh0LGUsbil7bmdEZXZNb2RlJiZwbihuLGFjLCJJbmNvbWluZyB2YWx1ZSBzaG91bGQgbmV2ZXIgYmUgTk9fQ0hBTkdFLiIpLG5nRGV2TW9kZSYmbW4oZSx0Lmxlbmd0aCwiU2xvdCBzaG91bGQgaGF2ZSBiZWVuIGluaXRpYWxpemVkIHRvIE5PX0NIQU5HRSIpO2NvbnN0IG89dFtlXTtpZihPYmplY3QuaXMobyxuKSlyZXR1cm4hMTtpZihuZ0Rldk1vZGUmJnhpKCkpe2NvbnN0IGk9byE9PWFjP286dm9pZCAwO2lmKCFBcChpLG4pKXtjb25zdCBhPShmdW5jdGlvbiBpKHQsZSxuLG8pe2NvbnN0IGk9dFsxXS5kYXRhLGE9aVtlXTtpZigic3RyaW5nIj09dHlwZW9mIGEpcmV0dXJuIGEuaW5kZXhPZihhbCk+LTE/bGwodCxlLGUsYSxvKTp7cHJvcE5hbWU6YSxvbGRWYWx1ZTpuLG5ld1ZhbHVlOm99O2lmKG51bGw9PT1hKXtsZXQgbj1lLTE7Zm9yKDsic3RyaW5nIiE9dHlwZW9mIGlbbl0mJm51bGw9PT1pW24rMV07KW4tLTtjb25zdCBhPWlbbl07aWYoInN0cmluZyI9PXR5cGVvZiBhKXtjb25zdCBpPWEubWF0Y2gobmV3IFJlZ0V4cChhbCwiZyIpKTtpZihpJiZpLmxlbmd0aC0xPmUtbilyZXR1cm4gbGwodCxuLGUsYSxvKX19cmV0dXJue3Byb3BOYW1lOnZvaWQgMCxvbGRWYWx1ZTpuLG5ld1ZhbHVlOm99fSkodCxlLGksbik7IShmdW5jdGlvbiBhKHQsZSxuLG8pe2xldCBpPWBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yOiBFeHByZXNzaW9uIGhhcyBjaGFuZ2VkIGFmdGVyIGl0IHdhcyBjaGVja2VkLiBQcmV2aW91cyB2YWx1ZSR7bz9gIGZvciAnJHtvfSdgOiIifTogJyR7ZX0nLiBDdXJyZW50IHZhbHVlOiAnJHtufScuYDt0aHJvdyB0JiYoaSs9IiBJdCBzZWVtcyBsaWtlIHRoZSB2aWV3IGhhcyBiZWVuIGNyZWF0ZWQgYWZ0ZXIgaXRzIHBhcmVudCBhbmQgaXRzIGNoaWxkcmVuIGhhdmUgYmVlbiBkaXJ0eSBjaGVja2VkLiBIYXMgaXQgYmVlbiBjcmVhdGVkIGluIGEgY2hhbmdlIGRldGVjdGlvbiBob29rPyIpLG5ldyBLZSgiMTAwIixpKX0pKG89PT1hYyxhLm9sZFZhbHVlLGEubmV3VmFsdWUsYS5wcm9wTmFtZSl9cmV0dXJuITF9cmV0dXJuIHRbZV09biwhMH1mdW5jdGlvbiBMcCh0LGUsbixvKXtjb25zdCBpPUZwKHQsZSxuKTtyZXR1cm4gRnAodCxlKzEsbyl8fGl9ZnVuY3Rpb24gQnAodCxlLG4sbyxpKXtjb25zdCBhPUxwKHQsZSxuLG8pO3JldHVybiBGcCh0LGUrMixpKXx8YX1mdW5jdGlvbiBWcCh0LGUsbixvLGksYSl7Y29uc3Qgcj1McCh0LGUsbixvKTtyZXR1cm4gTHAodCxlKzIsaSxhKXx8cn0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24ganAodCxlLG4sbyl7Y29uc3QgaT1maSgpLGE9U2koKTtpZihGcChpLGEsZSkpe2NvbnN0IHI9Z2koKSxzPVlpKCk7Q2QocyxpLHQsZSxuLG8pLG5nRGV2TW9kZSYmemQoci5kYXRhLHMsImF0dHIuIit0LGEpfXJldHVybiBqcH0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gVXAodCxlKXtuZ0Rldk1vZGUmJm1uKDIsZS5sZW5ndGgsInNob3VsZCBoYXZlIGF0IGxlYXN0IDMgdmFsdWVzIiksbmdEZXZNb2RlJiZsbihlLmxlbmd0aCUyLDEsInNob3VsZCBoYXZlIGFuIG9kZCBudW1iZXIgb2YgdmFsdWVzIik7bGV0IG49ITEsbz13aSgpO2ZvcihsZXQgaT0xO2k8ZS5sZW5ndGg7aSs9MiluPUZwKHQsbysrLGVbaV0pfHxuO2lmKGtpKG8pLCFuKXJldHVybiBhYztsZXQgaT1lWzBdO2ZvcihsZXQgdD0xO3Q8ZS5sZW5ndGg7dCs9MilpKz0kZShlW3RdKStlW3QrMV07cmV0dXJuIGl9ZnVuY3Rpb24gR3AodCxlLG4sbyl7cmV0dXJuIEZwKHQsU2koKSxuKT9lKyRlKG4pK286YWN9ZnVuY3Rpb24gV3AodCxlLG4sbyxpLGEpe2NvbnN0IHI9THAodCx3aSgpLG4saSk7cmV0dXJuIERpKDIpLHI/ZSskZShuKStvKyRlKGkpK2E6YWN9ZnVuY3Rpb24gWXAodCxlLG4sbyxpLGEscixzKXtjb25zdCBsPUJwKHQsd2koKSxuLGkscik7cmV0dXJuIERpKDMpLGw/ZSskZShuKStvKyRlKGkpK2ErJGUocikrczphY31mdW5jdGlvbiBxcCh0LGUsbixvLGksYSxyLHMsbCxjKXtjb25zdCBkPVZwKHQsd2koKSxuLGkscixsKTtyZXR1cm4gRGkoNCksZD9lKyRlKG4pK28rJGUoaSkrYSskZShyKStzKyRlKGwpK2M6YWN9ZnVuY3Rpb24gWnAodCxlLG4sbyxpLGEscixzLGwsYyxkLHApe2NvbnN0IG09d2koKTtsZXQgdT1WcCh0LG0sbixpLHIsbCk7cmV0dXJuIHU9RnAodCxtKzQsZCl8fHUsRGkoNSksdT9lKyRlKG4pK28rJGUoaSkrYSskZShyKStzKyRlKGwpK2MrJGUoZCkrcDphY31mdW5jdGlvbiBYcCh0LGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUpe2NvbnN0IGY9d2koKTtsZXQgZz1WcCh0LGYsbixpLHIsbCk7cmV0dXJuIGc9THAodCxmKzQsZCxtKXx8ZyxEaSg2KSxnP2UrJGUobikrbyskZShpKSthKyRlKHIpK3MrJGUobCkrYyskZShkKStwKyRlKG0pK3U6YWN9ZnVuY3Rpb24gS3AodCxlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYsZyl7Y29uc3QgaD13aSgpO2xldCBiPVZwKHQsaCxuLGkscixsKTtyZXR1cm4gYj1CcCh0LGgrNCxkLG0sZil8fGIsRGkoNyksYj9lKyRlKG4pK28rJGUoaSkrYSskZShyKStzKyRlKGwpK2MrJGUoZCkrcCskZShtKSt1KyRlKGYpK2c6YWN9ZnVuY3Rpb24gSnAodCxlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYsZyxoLGIpe2NvbnN0IHk9d2koKTtsZXQgXz1WcCh0LHksbixpLHIsbCk7cmV0dXJuIF89VnAodCx5KzQsZCxtLGYsaCl8fF8sRGkoOCksXz9lKyRlKG4pK28rJGUoaSkrYSskZShyKStzKyRlKGwpK2MrJGUoZCkrcCskZShtKSt1KyRlKGYpK2crJGUoaCkrYjphY31mdW5jdGlvbiBRcCh0LGUsbixvLGksYSxyLHMpe2NvbnN0IGw9ZmkoKSxjPWdpKCksZD10K2dvLHA9Yy5maXJzdENyZWF0ZVBhc3M/KAovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KZnVuY3Rpb24gbSh0LGUsbixvLGksYSxyLHMsbCl7bmdEZXZNb2RlJiZBbyhlKSxuZ0Rldk1vZGUmJm5nRGV2TW9kZS5maXJzdENyZWF0ZVBhc3MrKztjb25zdCBjPWUuY29uc3RzLGQ9WmMoZSx0LDQscnx8bnVsbCxjaShjLHMpKTttZChlLG4sZCxjaShjLGwpKSxYaShlLGQpO2NvbnN0IHA9ZC50Vmlld3M9YWQoMixkLG8saSxhLGUuZGlyZWN0aXZlUmVnaXN0cnksZS5waXBlUmVnaXN0cnksbnVsbCxlLnNjaGVtYXMsYyk7cmV0dXJuIG51bGwhPT1lLnF1ZXJpZXMmJihlLnF1ZXJpZXMudGVtcGxhdGUoZSxkKSxwLnF1ZXJpZXM9ZS5xdWVyaWVzLmVtYmVkZGVkVFZpZXcoZCkpLGR9KShkLGMsbCxlLG4sbyxpLGEscik6Yy5kYXRhW2RdO0NpKHAsITEpO2NvbnN0IHU9bFsxMV0uY3JlYXRlQ29tbWVudChuZ0Rldk1vZGU/ImNvbnRhaW5lciI6IiIpO0hsKGMsbCx1LHApLExzKHUsbCksRGQobCxsW2RdPVBkKHUsbCx1LHApKSx2byhwKSYmbmQoYyxsLHApLG51bGwhPXImJm9kKGwscCxzKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gJHAodCl7cmV0dXJuIGFpKChmdW5jdGlvbiBlKCl7cmV0dXJuIG1pLmxGcmFtZS5jb250ZXh0TFZpZXd9KSgpLGdvK3QpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCB0bT17Ism1ybVkZWZpbmVJbmplY3RhYmxlIjpNbiwiybXJtWRlZmluZUluamVjdG9yIjp2biwiybXJtWluamVjdCI6dnIsIsm1ybVpbnZhbGlkRmFjdG9yeURlcCI6eHIscmVzb2x2ZUZvcndhcmRSZWY6WmV9LGVtPWplKHtwcm92aWRlOlN0cmluZyx1c2VWYWx1ZTpqZX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBubSh0KXtyZXR1cm4gdm9pZCAwIT09dC51c2VDbGFzc31mdW5jdGlvbiBvbSh0KXtyZXR1cm4gdm9pZCAwIT09dC51c2VGYWN0b3J5fWplKHtwcm92aWRlOlN0cmluZyx1c2VWYWx1ZTpqZX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgaW09RmEoIkluamVjdGFibGUiLHZvaWQgMCx2b2lkIDAsdm9pZCAwLCgodCxlKT0+YW0odCxlKSkpLGFtPWZ1bmN0aW9uIHJtKHQsZSl7bGV0IG49bnVsbCxvPW51bGw7dC5oYXNPd25Qcm9wZXJ0eSh3bil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHduLHtnZXQ6KCk9PntpZihudWxsPT09bil7Y29uc3Qgbz1KYSh7dXNhZ2U6MCxraW5kOiJpbmplY3RhYmxlIix0eXBlOnR9KTtuPW8uY29tcGlsZUluamVjdGFibGUodG0sYG5nOi8vLyR7dC5uYW1lfS/JtXByb3YuanNgLChmdW5jdGlvbiBvKHQsZSl7Y29uc3Qgbj1lfHx7cHJvdmlkZWRJbjpudWxsfSxvPXtuYW1lOnQubmFtZSx0eXBlOnQsdHlwZUFyZ3VtZW50Q291bnQ6MCxwcm92aWRlZEluOm4ucHJvdmlkZWRJbn07cmV0dXJuKG5tKG4pfHxvbShuKSkmJnZvaWQgMCE9PW4uZGVwcyYmKG8uZGVwcz16cihuLmRlcHMpKSxubShuKT9vLnVzZUNsYXNzPW4udXNlQ2xhc3M6KGZ1bmN0aW9uIGkodCl7cmV0dXJuIGVtIGluIHR9KShuKT9vLnVzZVZhbHVlPW4udXNlVmFsdWU6b20obik/by51c2VGYWN0b3J5PW4udXNlRmFjdG9yeTooZnVuY3Rpb24gYSh0KXtyZXR1cm4gdm9pZCAwIT09dC51c2VFeGlzdGluZ30pKG4pJiYoby51c2VFeGlzdGluZz1uLnVzZUV4aXN0aW5nKSxvfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8pKHQsZSkpfXJldHVybiBufX0pLHQuaGFzT3duUHJvcGVydHkoSm4pfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxKbix7Z2V0OigpPT57aWYobnVsbD09PW8pe2NvbnN0IGU9SmEoe3VzYWdlOjAsa2luZDoiaW5qZWN0YWJsZSIsdHlwZTp0fSk7bz1lLmNvbXBpbGVGYWN0b3J5KHRtLGBuZzovLy8ke3QubmFtZX0vybVmYWMuanNgLHtuYW1lOnQubmFtZSx0eXBlOnQsdHlwZUFyZ3VtZW50Q291bnQ6MCxkZXBzOk5yKHQpLHRhcmdldDplLkZhY3RvcnlUYXJnZXQuSW5qZWN0YWJsZX0pfXJldHVybiBvfSxjb25maWd1cmFibGU6ITB9KX07ZnVuY3Rpb24gc20odCl7cmV0dXJuIHQubGVuZ3RoPjE/IiAoIisoCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBlKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDsrK24pe2lmKGUuaW5kZXhPZih0W25dKT4tMSlyZXR1cm4gZS5wdXNoKHRbbl0pLGU7ZS5wdXNoKHRbbl0pfXJldHVybiBlfSkodC5zbGljZSgpLnJldmVyc2UoKSkubWFwKCh0PT5HZSh0LnRva2VuKSkpLmpvaW4oIiAtPiAiKSsiKSI6IiJ9ZnVuY3Rpb24gbG0odCxlLG4sbyl7Y29uc3QgaT1bZV0sYT1uKGkpLHI9bz8oZnVuY3Rpb24gcyh0LGUpe2NvbnN0IG49YCR7dH0gY2F1c2VkIGJ5OiAke2UgaW5zdGFuY2VvZiBFcnJvcj9lLm1lc3NhZ2U6ZX1gLG89RXJyb3Iobik7cmV0dXJuIG8ubmdPcmlnaW5hbEVycm9yPWUsb30pKGEsbyk6RXJyb3IoYSk7cmV0dXJuIHIuYWRkS2V5PWNtLHIua2V5cz1pLHIuaW5qZWN0b3JzPVt0XSxyLmNvbnN0cnVjdFJlc29sdmluZ01lc3NhZ2U9bixyLm5nT3JpZ2luYWxFcnJvcj1vLHJ9ZnVuY3Rpb24gY20odCxlKXt0aGlzLmluamVjdG9ycy5wdXNoKHQpLHRoaXMua2V5cy5wdXNoKGUpLHRoaXMubWVzc2FnZT10aGlzLmNvbnN0cnVjdFJlc29sdmluZ01lc3NhZ2UodGhpcy5rZXlzKX1mdW5jdGlvbiBkbSh0LGUpe2NvbnN0IG49W107Zm9yKGxldCB0PTAsbz1lLmxlbmd0aDt0PG87dCsrKXtjb25zdCBvPWVbdF07bi5wdXNoKG8mJjAhPW8ubGVuZ3RoP28ubWFwKEdlKS5qb2luKCIgIik6Ij8iKX1yZXR1cm4gRXJyb3IoIkNhbm5vdCByZXNvbHZlIGFsbCBwYXJhbWV0ZXJzIGZvciAnIitHZSh0KSsiJygiK24uam9pbigiLCAiKSsiKS4gTWFrZSBzdXJlIHRoYXQgYWxsIHRoZSBwYXJhbWV0ZXJzIGFyZSBkZWNvcmF0ZWQgd2l0aCBJbmplY3Qgb3IgaGF2ZSB2YWxpZCB0eXBlIGFubm90YXRpb25zIGFuZCB0aGF0ICciK0dlKHQpKyInIGlzIGRlY29yYXRlZCB3aXRoIEluamVjdGFibGUuIil9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBwbXtjb25zdHJ1Y3Rvcih0LGUpe2lmKHRoaXMudG9rZW49dCx0aGlzLmlkPWUsIXQpdGhyb3cgbmV3IEVycm9yKCJUb2tlbiBtdXN0IGJlIGRlZmluZWQhIik7dGhpcy5kaXNwbGF5TmFtZT1HZSh0aGlzLnRva2VuKX1zdGF0aWMgZ2V0KHQpe3JldHVybiBtbS5nZXQoWmUodCkpfXN0YXRpYyBnZXQgbnVtYmVyT2ZLZXlzKCl7cmV0dXJuIG1tLm51bWJlck9mS2V5c319Y29uc3QgbW09bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fYWxsS2V5cz1uZXcgTWFwfWdldCh0KXtpZih0IGluc3RhbmNlb2YgcG0pcmV0dXJuIHQ7aWYodGhpcy5fYWxsS2V5cy5oYXModCkpcmV0dXJuIHRoaXMuX2FsbEtleXMuZ2V0KHQpO2NvbnN0IGU9bmV3IHBtKHQscG0ubnVtYmVyT2ZLZXlzKTtyZXR1cm4gdGhpcy5fYWxsS2V5cy5zZXQodCxlKSxlfWdldCBudW1iZXJPZktleXMoKXtyZXR1cm4gdGhpcy5fYWxsS2V5cy5zaXplfX0sdW09bmV3Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXM9dH11cGRhdGVDYXBhYmlsaXRpZXModCl7dGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzPXR9ZmFjdG9yeSh0KXtyZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmZhY3RvcnkodCl9cGFyYW1ldGVycyh0KXtyZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnBhcmFtZXRlcnModCl9YW5ub3RhdGlvbnModCl7cmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5hbm5vdGF0aW9ucyh0KX1wcm9wTWV0YWRhdGEodCl7cmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5wcm9wTWV0YWRhdGEodCl9aGFzTGlmZWN5Y2xlSG9vayh0LGUpe3JldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMuaGFzTGlmZWN5Y2xlSG9vayh0LGUpfWdldHRlcih0KXtyZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmdldHRlcih0KX1zZXR0ZXIodCl7cmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5zZXR0ZXIodCl9bWV0aG9kKHQpe3JldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMubWV0aG9kKHQpfWltcG9ydFVyaSh0KXtyZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmltcG9ydFVyaSh0KX1yZXNvdXJjZVVyaSh0KXtyZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnJlc291cmNlVXJpKHQpfXJlc29sdmVJZGVudGlmaWVyKHQsZSxuLG8pe3JldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucmVzb2x2ZUlkZW50aWZpZXIodCxlLG4sbyl9cmVzb2x2ZUVudW0odCxlKXtyZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnJlc29sdmVFbnVtKHQsZSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8obmV3IG1yKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIGZte2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLmtleT10LHRoaXMub3B0aW9uYWw9ZSx0aGlzLnZpc2liaWxpdHk9bn1zdGF0aWMgZnJvbUtleSh0KXtyZXR1cm4gbmV3IGZtKHQsITEsbnVsbCl9fWNvbnN0IGdtPVtdO2NsYXNzIGhte2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLmtleT10LHRoaXMucmVzb2x2ZWRGYWN0b3JpZXM9ZSx0aGlzLm11bHRpUHJvdmlkZXI9bix0aGlzLnJlc29sdmVkRmFjdG9yeT10aGlzLnJlc29sdmVkRmFjdG9yaWVzWzBdfX1jbGFzcyBibXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuZmFjdG9yeT10LHRoaXMuZGVwZW5kZW5jaWVzPWV9fWZ1bmN0aW9uIHltKHQpe2xldCBlLG47aWYodC51c2VDbGFzcyl7Y29uc3Qgbz1aZSh0LnVzZUNsYXNzKTtlPXVtLmZhY3Rvcnkobyksbj12bShvKX1lbHNlIHQudXNlRXhpc3Rpbmc/KGU9dD0+dCxuPVtmbS5mcm9tS2V5KHBtLmdldCh0LnVzZUV4aXN0aW5nKSldKTp0LnVzZUZhY3Rvcnk/KGU9dC51c2VGYWN0b3J5LG49KGZ1bmN0aW9uIG8odCxlKXtpZihlKXtjb25zdCBuPWUubWFwKCh0PT5bdF0pKTtyZXR1cm4gZS5tYXAoKGU9PnhtKHQsZSxuKSkpfXJldHVybiB2bSh0KX0pKHQudXNlRmFjdG9yeSx0LmRlcHMpKTooZT0oKT0+dC51c2VWYWx1ZSxuPWdtKTtyZXR1cm4gbmV3IGJtKGUsbil9ZnVuY3Rpb24gX20odCl7cmV0dXJuIG5ldyBobShwbS5nZXQodC5wcm92aWRlKSxbeW0odCldLHQubXVsdGl8fCExKX1mdW5jdGlvbiBDbSh0KXtjb25zdCBlPShmdW5jdGlvbiBuKHQsZSl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IG89dFtuXSxpPWUuZ2V0KG8ua2V5LmlkKTtpZihpKXtpZihvLm11bHRpUHJvdmlkZXIhPT1pLm11bHRpUHJvdmlkZXIpdGhyb3cgRXJyb3IoYENhbm5vdCBtaXggbXVsdGkgcHJvdmlkZXJzIGFuZCByZWd1bGFyIHByb3ZpZGVycywgZ290OiAke2l9ICR7b31gKTtpZihvLm11bHRpUHJvdmlkZXIpZm9yKGxldCB0PTA7dDxvLnJlc29sdmVkRmFjdG9yaWVzLmxlbmd0aDt0KyspaS5yZXNvbHZlZEZhY3Rvcmllcy5wdXNoKG8ucmVzb2x2ZWRGYWN0b3JpZXNbdF0pO2Vsc2UgZS5zZXQoby5rZXkuaWQsbyl9ZWxzZXtsZXQgdDt0PW8ubXVsdGlQcm92aWRlcj9uZXcgaG0oby5rZXksby5yZXNvbHZlZEZhY3Rvcmllcy5zbGljZSgpLG8ubXVsdGlQcm92aWRlcik6byxlLnNldChvLmtleS5pZCx0KX19cmV0dXJuIGV9KShNbSh0LFtdKS5tYXAoX20pLG5ldyBNYXApO3JldHVybiBBcnJheS5mcm9tKGUudmFsdWVzKCkpfWZ1bmN0aW9uIE1tKHQsZSl7cmV0dXJuIHQuZm9yRWFjaCgodD0+e2lmKHQgaW5zdGFuY2VvZiBRYSllLnB1c2goe3Byb3ZpZGU6dCx1c2VDbGFzczp0fSk7ZWxzZSBpZih0JiYib2JqZWN0Ij09dHlwZW9mIHQmJnZvaWQgMCE9PXQucHJvdmlkZSllLnB1c2godCk7ZWxzZXtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyhmdW5jdGlvbiBuKHQpe3JldHVybiBFcnJvcihgSW52YWxpZCBwcm92aWRlciAtIG9ubHkgaW5zdGFuY2VzIG9mIFByb3ZpZGVyIGFuZCBUeXBlIGFyZSBhbGxvd2VkLCBnb3Q6ICR7dH1gKX0pKHQpO01tKHQsZSl9fSkpLGV9ZnVuY3Rpb24gdm0odCl7Y29uc3QgZT11bS5wYXJhbWV0ZXJzKHQpO2lmKCFlKXJldHVybltdO2lmKGUuc29tZSgodD0+bnVsbD09dCkpKXRocm93IGRtKHQsZSk7cmV0dXJuIGUubWFwKChuPT54bSh0LG4sZSkpKX1mdW5jdGlvbiB4bSh0LGUsbil7bGV0IG89bnVsbCxpPSExO2lmKCFBcnJheS5pc0FycmF5KGUpKXJldHVybiBPbShlIGluc3RhbmNlb2Yga3I/ZS50b2tlbjplLGksbnVsbCk7bGV0IGE9bnVsbDtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoOysrdCl7Y29uc3Qgbj1lW3RdO24gaW5zdGFuY2VvZiBRYT9vPW46biBpbnN0YW5jZW9mIGtyP289bi50b2tlbjpuIGluc3RhbmNlb2YgU3I/aT0hMDpuIGluc3RhbmNlb2YgRHJ8fG4gaW5zdGFuY2VvZiBFcj9hPW46biBpbnN0YW5jZW9mIEdhJiYobz1uKX1pZihvPVplKG8pLG51bGwhPW8pcmV0dXJuIE9tKG8saSxhKTt0aHJvdyBkbSh0LG4pfWZ1bmN0aW9uIE9tKHQsZSxuKXtyZXR1cm4gbmV3IGZtKHBtLmdldCh0KSxlLG4pfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCBQbT17fTtjbGFzcyB3bXtzdGF0aWMgcmVzb2x2ZSh0KXtyZXR1cm4gQ20odCl9c3RhdGljIHJlc29sdmVBbmRDcmVhdGUodCxlKXtjb25zdCBuPXdtLnJlc29sdmUodCk7cmV0dXJuIHdtLmZyb21SZXNvbHZlZFByb3ZpZGVycyhuLGUpfXN0YXRpYyBmcm9tUmVzb2x2ZWRQcm92aWRlcnModCxlKXtyZXR1cm4gbmV3IGttKHQsZSl9fWNsYXNzIGtte2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fY29uc3RydWN0aW9uQ291bnRlcj0wLHRoaXMuX3Byb3ZpZGVycz10LHRoaXMucGFyZW50PWV8fG51bGw7Y29uc3Qgbj10Lmxlbmd0aDt0aGlzLmtleUlkcz1bXSx0aGlzLm9ianM9W107Zm9yKGxldCBlPTA7ZTxuO2UrKyl0aGlzLmtleUlkc1tlXT10W2VdLmtleS5pZCx0aGlzLm9ianNbZV09UG19Z2V0KHQsZT1ncil7cmV0dXJuIHRoaXMuX2dldEJ5S2V5KHBtLmdldCh0KSxudWxsLGUpfXJlc29sdmVBbmRDcmVhdGVDaGlsZCh0KXtjb25zdCBlPXdtLnJlc29sdmUodCk7cmV0dXJuIHRoaXMuY3JlYXRlQ2hpbGRGcm9tUmVzb2x2ZWQoZSl9Y3JlYXRlQ2hpbGRGcm9tUmVzb2x2ZWQodCl7Y29uc3QgZT1uZXcga20odCk7cmV0dXJuIGUucGFyZW50PXRoaXMsZX1yZXNvbHZlQW5kSW5zdGFudGlhdGUodCl7cmV0dXJuIHRoaXMuaW5zdGFudGlhdGVSZXNvbHZlZCh3bS5yZXNvbHZlKFt0XSlbMF0pfWluc3RhbnRpYXRlUmVzb2x2ZWQodCl7cmV0dXJuIHRoaXMuX2luc3RhbnRpYXRlUHJvdmlkZXIodCl9Z2V0UHJvdmlkZXJBdEluZGV4KHQpe2lmKHQ8MHx8dD49dGhpcy5fcHJvdmlkZXJzLmxlbmd0aCl0aHJvdyhmdW5jdGlvbiBlKHQpe3JldHVybiBFcnJvcihgSW5kZXggJHt0fSBpcyBvdXQtb2YtYm91bmRzLmApfSkodCk7cmV0dXJuIHRoaXMuX3Byb3ZpZGVyc1t0XX1fbmV3KHQpe2lmKHRoaXMuX2NvbnN0cnVjdGlvbkNvdW50ZXIrKz50aGlzLl9nZXRNYXhOdW1iZXJPZk9iamVjdHMoKSl0aHJvdyhmdW5jdGlvbiBlKHQsbil7cmV0dXJuIGxtKHQsbiwoZnVuY3Rpb24odCl7cmV0dXJuYENhbm5vdCBpbnN0YW50aWF0ZSBjeWNsaWMgZGVwZW5kZW5jeSEke3NtKHQpfWB9KSl9KSh0aGlzLHQua2V5KTtyZXR1cm4gdGhpcy5faW5zdGFudGlhdGVQcm92aWRlcih0KX1fZ2V0TWF4TnVtYmVyT2ZPYmplY3RzKCl7cmV0dXJuIHRoaXMub2Jqcy5sZW5ndGh9X2luc3RhbnRpYXRlUHJvdmlkZXIodCl7aWYodC5tdWx0aVByb3ZpZGVyKXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248dC5yZXNvbHZlZEZhY3Rvcmllcy5sZW5ndGg7KytuKWVbbl09dGhpcy5faW5zdGFudGlhdGUodCx0LnJlc29sdmVkRmFjdG9yaWVzW25dKTtyZXR1cm4gZX1yZXR1cm4gdGhpcy5faW5zdGFudGlhdGUodCx0LnJlc29sdmVkRmFjdG9yaWVzWzBdKX1faW5zdGFudGlhdGUodCxlKXtjb25zdCBuPWUuZmFjdG9yeTtsZXQgbyxpO3RyeXtvPWUuZGVwZW5kZW5jaWVzLm1hcCgodD0+dGhpcy5fZ2V0QnlSZWZsZWN0aXZlRGVwZW5kZW5jeSh0KSkpfWNhdGNoKGUpe3Rocm93IGUuYWRkS2V5JiZlLmFkZEtleSh0aGlzLHQua2V5KSxlfXRyeXtpPW4oLi4ubyl9Y2F0Y2goZSl7dGhyb3coZnVuY3Rpb24gbih0LGUsbyxpKXtyZXR1cm4gbG0odCxpLChmdW5jdGlvbih0KXtjb25zdCBuPUdlKHRbMF0udG9rZW4pO3JldHVybmAke2UubWVzc2FnZX06IEVycm9yIGR1cmluZyBpbnN0YW50aWF0aW9uIG9mICR7bn0hJHtzbSh0KX0uYH0pLGUpfSkodGhpcyxlLDAsdC5rZXkpfXJldHVybiBpfV9nZXRCeVJlZmxlY3RpdmVEZXBlbmRlbmN5KHQpe3JldHVybiB0aGlzLl9nZXRCeUtleSh0LmtleSx0LnZpc2liaWxpdHksdC5vcHRpb25hbD9udWxsOmdyKX1fZ2V0QnlLZXkodCxlLG4pe3JldHVybiB0PT09a20uSU5KRUNUT1JfS0VZP3RoaXM6ZSBpbnN0YW5jZW9mIERyP3RoaXMuX2dldEJ5S2V5U2VsZih0LG4pOnRoaXMuX2dldEJ5S2V5RGVmYXVsdCh0LG4sZSl9X2dldE9iakJ5S2V5SWQodCl7Zm9yKGxldCBlPTA7ZTx0aGlzLmtleUlkcy5sZW5ndGg7ZSsrKWlmKHRoaXMua2V5SWRzW2VdPT09dClyZXR1cm4gdGhpcy5vYmpzW2VdPT09UG0mJih0aGlzLm9ianNbZV09dGhpcy5fbmV3KHRoaXMuX3Byb3ZpZGVyc1tlXSkpLHRoaXMub2Jqc1tlXTtyZXR1cm4gUG19X3Rocm93T3JOdWxsKHQsZSl7aWYoZSE9PWdyKXJldHVybiBlO3Rocm93KGZ1bmN0aW9uIG4odCxlKXtyZXR1cm4gbG0odCxlLChmdW5jdGlvbih0KXtyZXR1cm5gTm8gcHJvdmlkZXIgZm9yICR7R2UodFswXS50b2tlbil9ISR7c20odCl9YH0pKX0pKHRoaXMsdCl9X2dldEJ5S2V5U2VsZih0LGUpe2NvbnN0IG49dGhpcy5fZ2V0T2JqQnlLZXlJZCh0LmlkKTtyZXR1cm4gbiE9PVBtP246dGhpcy5fdGhyb3dPck51bGwodCxlKX1fZ2V0QnlLZXlEZWZhdWx0KHQsZSxuKXtsZXQgbztmb3Iobz1uIGluc3RhbmNlb2YgRXI/dGhpcy5wYXJlbnQ6dGhpcztvIGluc3RhbmNlb2Yga207KXtjb25zdCBlPW8sbj1lLl9nZXRPYmpCeUtleUlkKHQuaWQpO2lmKG4hPT1QbSlyZXR1cm4gbjtvPWUucGFyZW50fXJldHVybiBudWxsIT09bz9vLmdldCh0LnRva2VuLGUpOnRoaXMuX3Rocm93T3JOdWxsKHQsZSl9Z2V0IGRpc3BsYXlOYW1lKCl7cmV0dXJuYFJlZmxlY3RpdmVJbmplY3Rvcihwcm92aWRlcnM6IFskeyhmdW5jdGlvbiB0KGUsbil7Y29uc3Qgbz1bXTtmb3IobGV0IHQ9MDt0PGUuX3Byb3ZpZGVycy5sZW5ndGg7Kyt0KW9bdF09bihlLmdldFByb3ZpZGVyQXRJbmRleCh0KSk7cmV0dXJuIG99Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKSh0aGlzLCh0PT4nICInK3Qua2V5LmRpc3BsYXlOYW1lKyciICcpKS5qb2luKCIsICIpfV0pYH10b1N0cmluZygpe3JldHVybiB0aGlzLmRpc3BsYXlOYW1lfX1mdW5jdGlvbiBTbSh0LGU9RW4uRGVmYXVsdCl7Y29uc3Qgbj1maSgpO3JldHVybiBudWxsPT09bj8obmdEZXZNb2RlJiYoZnVuY3Rpb24gbyh0KXtuZ0Rldk1vZGUmJmNuKFJuLHQsIkNhbGxpbmcgybXJtWluamVjdCB3b3VsZCBjYXVzZSBpbmZpbml0ZSByZWN1cnNpb24iKX0pKFNtKSx2cih0LGUpKTp4YShiaSgpLG4sWmUodCksZSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBEbSh0LGUsbil7Y29uc3Qgbz1maSgpLGk9U2koKTtpZihGcChvLGksZSkpe2NvbnN0IGE9Z2koKSxyPVlpKCk7bGQoYSxyLG8sdCxlLG9bMTFdLG4sITEpLG5nRGV2TW9kZSYmemQoYS5kYXRhLHIsdCxpKX1yZXR1cm4gRG19ZnVuY3Rpb24gRW0odCxlLG4sbyxpKXtjb25zdCBhPWk/ImNsYXNzIjoic3R5bGUiO1ZkKHQsbixlLmlucHV0c1thXSxhLG8pfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBSbSh0LGUsbixvKXtjb25zdCBpPWZpKCksYT1naSgpLHI9Z28rdDtuZ0Rldk1vZGUmJmxuKHdpKCksYS5iaW5kaW5nU3RhcnRJbmRleCwiZWxlbWVudHMgc2hvdWxkIGJlIGNyZWF0ZWQgYmVmb3JlIGFueSBiaW5kaW5ncyIpLG5nRGV2TW9kZSYmX24oaSxyKTtjb25zdCBzPWlbMTFdLGw9aVtyXT1NbChzLGUsKGZ1bmN0aW9uIGMoKXtyZXR1cm4gbWkubEZyYW1lLmN1cnJlbnROYW1lc3BhY2V9KSgpKSxkPWEuZmlyc3RDcmVhdGVQYXNzPyhmdW5jdGlvbiBwKHQsZSxuLG8saSxhLHIpe25nRGV2TW9kZSYmQW8oZSksbmdEZXZNb2RlJiZuZ0Rldk1vZGUuZmlyc3RDcmVhdGVQYXNzKys7Y29uc3Qgcz1lLmNvbnN0cyxsPVpjKGUsdCwyLGksY2kocyxhKSksYz1tZChlLG4sbCxjaShzLHIpKTtyZXR1cm4gbmdEZXZNb2RlJiYoZnVuY3Rpb24gZCh0LGUsbixvKXtpZihudWxsPT09dC5zY2hlbWFzKXJldHVybjtjb25zdCBpPW4udmFsdWU7aWYoIW8mJm51bGwhPT1pJiYoInVuZGVmaW5lZCIhPXR5cGVvZiBIVE1MVW5rbm93bkVsZW1lbnQmJkhUTUxVbmtub3duRWxlbWVudCYmZSBpbnN0YW5jZW9mIEhUTUxVbmtub3duRWxlbWVudHx8InVuZGVmaW5lZCIhPXR5cGVvZiBjdXN0b21FbGVtZW50cyYmaS5pbmRleE9mKCItIik+LTEmJiFjdXN0b21FbGVtZW50cy5nZXQoaSkpJiYhZGQodCxpKSl7bGV0IHQ9YCcke2l9JyBpcyBub3QgYSBrbm93biBlbGVtZW50OlxuYDt0Kz1gMS4gSWYgJyR7aX0nIGlzIGFuIEFuZ3VsYXIgY29tcG9uZW50LCB0aGVuIHZlcmlmeSB0aGF0IGl0IGlzIHBhcnQgb2YgdGhpcyBtb2R1bGUuXG5gLGkmJmkuaW5kZXhPZigiLSIpPi0xP3QrPWAyLiBJZiAnJHtpfScgaXMgYSBXZWIgQ29tcG9uZW50IHRoZW4gYWRkICdDVVNUT01fRUxFTUVOVFNfU0NIRU1BJyB0byB0aGUgJ0BOZ01vZHVsZS5zY2hlbWFzJyBvZiB0aGlzIGNvbXBvbmVudCB0byBzdXBwcmVzcyB0aGlzIG1lc3NhZ2UuYDp0Kz0iMi4gVG8gYWxsb3cgYW55IGVsZW1lbnQgYWRkICdOT19FUlJPUlNfU0NIRU1BJyB0byB0aGUgJ0BOZ01vZHVsZS5zY2hlbWFzJyBvZiB0aGlzIGNvbXBvbmVudC4iLGNvbnNvbGUuZXJyb3IoUWUoIjMwNCIsdCkpfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKShlLG8sbCxjKSxudWxsIT09bC5hdHRycyYmVWQobCxsLmF0dHJzLCExKSxudWxsIT09bC5tZXJnZWRBdHRycyYmVWQobCxsLm1lcmdlZEF0dHJzLCEwKSxudWxsIT09ZS5xdWVyaWVzJiZlLnF1ZXJpZXMuZWxlbWVudFN0YXJ0KGUsbCksbH0pKHIsYSxpLGwsZSxuLG8pOmEuZGF0YVtyXTtDaShkLCEwKTtjb25zdCBtPWQubWVyZ2VkQXR0cnM7bnVsbCE9PW0mJmFhKHMsbCxtKTtjb25zdCB1PWQuY2xhc3NlcztudWxsIT09dSYmWWwocyxsLHUpO2NvbnN0IGY9ZC5zdHlsZXM7bnVsbCE9PWYmJldsKHMsbCxmKSw2NCE9KDY0JmQuZmxhZ3MpJiZIbChhLGksbCxkKSwwPT09KGZ1bmN0aW9uIGcoKXtyZXR1cm4gbWkubEZyYW1lLmVsZW1lbnREZXB0aENvdW50fSkoKSYmTHMobCxpKSwoZnVuY3Rpb24gaCgpe21pLmxGcmFtZS5lbGVtZW50RGVwdGhDb3VudCsrfSkoKSx2byhkKSYmKG5kKGEsaSxkKSxlZChhLGQsaSkpLG51bGwhPT1vJiZvZChpLGQpfWZ1bmN0aW9uIEFtKCl7bGV0IHQ9YmkoKTtuZ0Rldk1vZGUmJmhuKHQsIk5vIHBhcmVudCBub2RlIHRvIGNsb3NlLiIpLE1pKCk/dmkoKToobmdEZXZNb2RlJiZTbyhiaSgpKSx0PXQucGFyZW50LENpKHQsITEpKTtjb25zdCBlPXQ7bmdEZXZNb2RlJiZpYShlLDMpLChmdW5jdGlvbiBuKCl7bWkubEZyYW1lLmVsZW1lbnREZXB0aENvdW50LS19KSgpO2NvbnN0IG89Z2koKTtvLmZpcnN0Q3JlYXRlUGFzcyYmKFhpKG8sdCksQ28odCkmJm8ucXVlcmllcy5lbGVtZW50RW5kKHQpKSxudWxsIT1lLmNsYXNzZXNXaXRob3V0SG9zdCYmKGZ1bmN0aW9uIGkodCl7cmV0dXJuIDAhPSgxNiZ0LmZsYWdzKX0pKGUpJiZFbShvLGUsZmkoKSxlLmNsYXNzZXNXaXRob3V0SG9zdCwhMCksbnVsbCE9ZS5zdHlsZXNXaXRob3V0SG9zdCYmKGZ1bmN0aW9uIGEodCl7cmV0dXJuIDAhPSgzMiZ0LmZsYWdzKX0pKGUpJiZFbShvLGUsZmkoKSxlLnN0eWxlc1dpdGhvdXRIb3N0LCExKX1mdW5jdGlvbiBUbSh0LGUsbixvKXtSbSh0LGUsbixvKSxBbSgpfWZ1bmN0aW9uIE5tKHQsZSxuKXtjb25zdCBvPWZpKCksaT1naSgpLGE9dCtnbztuZ0Rldk1vZGUmJl9uKG8sYSksbmdEZXZNb2RlJiZsbih3aSgpLGkuYmluZGluZ1N0YXJ0SW5kZXgsImVsZW1lbnQgY29udGFpbmVycyBzaG91bGQgYmUgY3JlYXRlZCBiZWZvcmUgYW55IGJpbmRpbmdzIik7Y29uc3Qgcj1pLmZpcnN0Q3JlYXRlUGFzcz8oZnVuY3Rpb24gcyh0LGUsbixvLGkpe25nRGV2TW9kZSYmbmdEZXZNb2RlLmZpcnN0Q3JlYXRlUGFzcysrO2NvbnN0IGE9ZS5jb25zdHMscj1jaShhLG8pLHM9WmMoZSx0LDgsIm5nLWNvbnRhaW5lciIscik7cmV0dXJuIG51bGwhPT1yJiZVZChzLHIsITApLG1kKGUsbixzLGNpKGEsaSkpLG51bGwhPT1lLnF1ZXJpZXMmJmUucXVlcmllcy5lbGVtZW50U3RhcnQoZSxzKSxzfSkoYSxpLG8sZSxuKTppLmRhdGFbYV07Q2kociwhMCksbmdEZXZNb2RlJiZuZ0Rldk1vZGUucmVuZGVyZXJDcmVhdGVDb21tZW50Kys7Y29uc3QgbD1vW2FdPW9bMTFdLmNyZWF0ZUNvbW1lbnQobmdEZXZNb2RlPyJuZy1jb250YWluZXIiOiIiKTtIbChpLG8sbCxyKSxMcyhsLG8pLHZvKHIpJiYobmQoaSxvLHIpLGVkKGkscixvKSksbnVsbCE9biYmb2QobyxyKX1mdW5jdGlvbiB6bSgpe2xldCB0PWJpKCk7Y29uc3QgZT1naSgpO01pKCk/dmkoKToobmdEZXZNb2RlJiZTbyh0KSx0PXQucGFyZW50LENpKHQsITEpKSxuZ0Rldk1vZGUmJmlhKHQsOCksZS5maXJzdENyZWF0ZVBhc3MmJihYaShlLHQpLENvKHQpJiZlLnF1ZXJpZXMuZWxlbWVudEVuZCh0KSl9ZnVuY3Rpb24gSW0odCxlLG4pe05tKHQsZSxuKSx6bSgpfWZ1bmN0aW9uIEhtKCl7cmV0dXJuIGZpKCl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIEZtKHQpe3JldHVybiEhdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQudGhlbn1mdW5jdGlvbiBMbSh0KXtyZXR1cm4hIXQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnN1YnNjcmliZX1rbS5JTkpFQ1RPUl9LRVk9cG0uZ2V0KHJwKTtjb25zdCBCbT1MbTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gVm0odCxlLG4sbyl7Y29uc3QgaT1maSgpLGE9Z2koKSxyPWJpKCk7cmV0dXJuIFVtKGEsaSxpWzExXSxyLHQsZSwhIW4sbyksVm19ZnVuY3Rpb24gam0odCxlKXtjb25zdCBuPWJpKCksbz1maSgpLGk9Z2koKTtyZXR1cm4gVW0oaSxvLExkKFRpKGkuZGF0YSksbixvKSxuLHQsZSwhMSksam19ZnVuY3Rpb24gVW0odCxlLG4sbyxpLGEscixzKXtjb25zdCBsPXZvKG8pLGM9dC5maXJzdENyZWF0ZVBhc3MmJkZkKHQpLGQ9ZVs4XSxwPUhkKGUpO25nRGV2TW9kZSYmaWEobywxNSk7bGV0IG09ITA7aWYoMyZvLnR5cGV8fHMpe2NvbnN0IHU9b2kobyxlKSxmPXM/cyh1KTp1LGc9cC5sZW5ndGgsaD1zP3Q9PnMoZWkodFtvLmluZGV4XSkpOm8uaW5kZXg7aWYoJG8obikpe2xldCByPW51bGw7aWYoIXMmJmwmJihyPShmdW5jdGlvbiB1KHQsZSxuLG8pe2NvbnN0IGk9dC5jbGVhbnVwO2lmKG51bGwhPWkpZm9yKGxldCB0PTA7dDxpLmxlbmd0aC0xO3QrPTIpe2NvbnN0IGE9aVt0XTtpZihhPT09biYmaVt0KzFdPT09byl7Y29uc3Qgbj1lWzddLG89aVt0KzJdO3JldHVybiBuLmxlbmd0aD5vP25bb106bnVsbH0ic3RyaW5nIj09dHlwZW9mIGEmJih0Kz0yKX1yZXR1cm4gbnVsbH0pKHQsZSxpLG8uaW5kZXgpKSxudWxsIT09cikoci5fX25nTGFzdExpc3RlbmVyRm5fX3x8cikuX19uZ05leHRMaXN0ZW5lckZuX189YSxyLl9fbmdMYXN0TGlzdGVuZXJGbl9fPWEsbT0hMTtlbHNle2E9V20obyxlLGQsYSwhMSk7Y29uc3QgdD1uLmxpc3RlbihmLGksYSk7bmdEZXZNb2RlJiZuZ0Rldk1vZGUucmVuZGVyZXJBZGRFdmVudExpc3RlbmVyKysscC5wdXNoKGEsdCksYyYmYy5wdXNoKGksaCxnLGcrMSl9fWVsc2UgYT1XbShvLGUsZCxhLCEwKSxmLmFkZEV2ZW50TGlzdGVuZXIoaSxhLHIpLG5nRGV2TW9kZSYmbmdEZXZNb2RlLnJlbmRlcmVyQWRkRXZlbnRMaXN0ZW5lcisrLHAucHVzaChhKSxjJiZjLnB1c2goaSxoLGcscil9ZWxzZSBhPVdtKG8sZSxkLGEsITEpO2NvbnN0IGY9by5vdXRwdXRzO2xldCBnO2lmKG0mJm51bGwhPT1mJiYoZz1mW2ldKSl7Y29uc3QgdD1nLmxlbmd0aDtpZih0KWZvcihsZXQgbj0wO248dDtuKz0yKXtjb25zdCB0PWdbbl07bmdEZXZNb2RlJiZfbihlLHQpO2NvbnN0IHI9Z1tuKzFdLHM9ZVt0XSxsPXNbcl07aWYobmdEZXZNb2RlJiYhQm0obCkpdGhyb3cgbmV3IEVycm9yKGBAT3V0cHV0ICR7cn0gbm90IGluaXRpYWxpemVkIGluICcke3MuY29uc3RydWN0b3IubmFtZX0nLmApO2NvbnN0IGQ9bC5zdWJzY3JpYmUoYSksbT1wLmxlbmd0aDtwLnB1c2goYSxkKSxjJiZjLnB1c2goaSxvLmluZGV4LG0sLShtKzEpKX19fWZ1bmN0aW9uIEdtKHQsZSxuLG8pe3RyeXtyZXR1cm4gcW8oNixlLG4pLCExIT09bihvKX1jYXRjaChlKXtyZXR1cm4gQmQodCxlKSwhMX1maW5hbGx5e3FvKDcsZSxuKX19ZnVuY3Rpb24gV20odCxlLG4sbyxpKXtyZXR1cm4gZnVuY3Rpb24gYShyKXtpZihyPT09RnVuY3Rpb24pcmV0dXJuIG87Y29uc3Qgcz0yJnQuZmxhZ3M/cmkodC5pbmRleCxlKTplOzA9PSgzMiZlWzJdKSYmRWQocyk7bGV0IGw9R20oZSxuLG8sciksYz1hLl9fbmdOZXh0TGlzdGVuZXJGbl9fO2Zvcig7YzspbD1HbShlLG4sYyxyKSYmbCxjPWMuX19uZ05leHRMaXN0ZW5lckZuX187cmV0dXJuIGkmJiExPT09bCYmKHIucHJldmVudERlZmF1bHQoKSxyLnJldHVyblZhbHVlPSExKSxsfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIFltKHQ9MSl7cmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJuKG1pLmxGcmFtZS5jb250ZXh0TFZpZXc9KGZ1bmN0aW9uIGUodCxuKXtmb3IoO3Q+MDspbmdEZXZNb2RlJiZobihuWzE1XSwiRGVjbGFyYXRpb24gdmlldyBzaG91bGQgYmUgZGVmaW5lZCBpZiBuZXN0aW5nIGxldmVsIGlzIGdyZWF0ZXIgdGhhbiAwLiIpLG49blsxNV0sdC0tO3JldHVybiBufSkodCxtaS5sRnJhbWUuY29udGV4dExWaWV3KSlbOF19KSh0KX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gcW0odCxlKXtsZXQgbj1udWxsO2NvbnN0IG89KGZ1bmN0aW9uIGkodCl7Y29uc3QgZT10LmF0dHJzO2lmKG51bGwhPWUpe2NvbnN0IHQ9ZS5pbmRleE9mKDUpO2lmKDA9PSgxJnQpKXJldHVybiBlW3QrMV19cmV0dXJuIG51bGx9KSh0KTtmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKyl7Y29uc3QgYT1lW2ldO2lmKCIqIiE9PWEpe2lmKG51bGw9PT1vP2VjKHQsYSwhMCk6bmMobyxhKSlyZXR1cm4gaX1lbHNlIG49aX1yZXR1cm4gbn1mdW5jdGlvbiBabSh0KXtjb25zdCBlPWZpKClbMTZdWzZdO2lmKCFlLnByb2plY3Rpb24pe2NvbnN0IG49ZS5wcm9qZWN0aW9uPWlyKHQ/dC5sZW5ndGg6MSxudWxsKSxvPW4uc2xpY2UoKTtsZXQgaT1lLmNoaWxkO2Zvcig7bnVsbCE9PWk7KXtjb25zdCBlPXQ/cW0oaSx0KTowO251bGwhPT1lJiYob1tlXT9vW2VdLnByb2plY3Rpb25OZXh0PWk6bltlXT1pLG9bZV09aSksaT1pLm5leHR9fX1mdW5jdGlvbiBYbSh0LGU9MCxuKXtjb25zdCBvPWZpKCksaT1naSgpLGE9WmMoaSxnbyt0LDE2LG51bGwsbnx8bnVsbCk7bnVsbD09PWEucHJvamVjdGlvbiYmKGEucHJvamVjdGlvbj1lKSx2aSgpLDY0IT0oNjQmYS5mbGFncykmJihmdW5jdGlvbiByKHQsZSxuKXtHbChlWzExXSwwLGUsbix3bCh0LG4sZSksQWwobi5wYXJlbnR8fGVbNl0sbixlKSl9KShpLG8sYSl9ZnVuY3Rpb24gS20odCxlLG4pe3JldHVybiBKbSh0LCIiLGUsIiIsbiksS219ZnVuY3Rpb24gSm0odCxlLG4sbyxpKXtjb25zdCBhPWZpKCkscj1HcChhLGUsbixvKTtpZihyIT09YWMpe2NvbnN0IG49Z2koKSxzPVlpKCk7bGQobixzLGEsdCxyLGFbMTFdLGksITEpLG5nRGV2TW9kZSYmemQobi5kYXRhLHMsdCx3aSgpLTEsZSxvKX1yZXR1cm4gSm19ZnVuY3Rpb24gUW0odCxlLG4sbyxpKXtjb25zdCBhPXRbbisxXSxyPW51bGw9PT1lO2xldCBzPW8/Y2MoYSk6bWMoYSksbD0hMTtmb3IoOzAhPT1zJiYoITE9PT1sfHxyKTspe25nRGV2TW9kZSYmX24odCxzKTtjb25zdCBuPXRbcysxXTskbSh0W3NdLGUpJiYobD0hMCx0W3MrMV09bz9nYyhuKTpwYyhuKSkscz1vP2NjKG4pOm1jKG4pfWwmJih0W24rMV09bz9wYyhhKTpnYyhhKSl9ZnVuY3Rpb24gJG0odCxlKXtyZXR1cm4gbmdEZXZNb2RlJiZjbihBcnJheS5pc0FycmF5KGUpLCEwLCJFeHBlY3RlZCB0aGF0ICd0U3R5bGluZ0tleScgaGFzIGJlZW4gdW53cmFwcGVkIiksbnVsbD09PXR8fG51bGw9PWV8fChBcnJheS5pc0FycmF5KHQpP3RbMV06dCk9PT1lfHwhKCFBcnJheS5pc0FycmF5KHQpfHwic3RyaW5nIiE9dHlwZW9mIGUpJiZzcih0LGUpPj0wfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCB0dT17dGV4dEVuZDowLGtleTowLGtleUVuZDowLHZhbHVlOjAsdmFsdWVFbmQ6MH07ZnVuY3Rpb24gZXUodCl7cmV0dXJuIHQuc3Vic3RyaW5nKHR1LmtleSx0dS5rZXlFbmQpfWZ1bmN0aW9uIG51KHQpe3JldHVybiB0LnN1YnN0cmluZyh0dS52YWx1ZSx0dS52YWx1ZUVuZCl9ZnVuY3Rpb24gb3UodCxlKXtjb25zdCBuPXR1LnRleHRFbmQ7cmV0dXJuIG49PT1lPy0xOihlPXR1LmtleUVuZD0oZnVuY3Rpb24gbyh0LGUsbil7Zm9yKDtlPG4mJnQuY2hhckNvZGVBdChlKT4zMjspZSsrO3JldHVybiBlfSkodCx0dS5rZXk9ZSxuKSxydSh0LGUsbikpfWZ1bmN0aW9uIGl1KHQsZSl7Y29uc3Qgbj10dS50ZXh0RW5kO2xldCBvPXR1LmtleT1ydSh0LGUsbik7cmV0dXJuIG49PT1vPy0xOihvPXR1LmtleUVuZD0oZnVuY3Rpb24gaSh0LGUsbil7bGV0IG87Zm9yKDtlPG4mJig0NT09PShvPXQuY2hhckNvZGVBdChlKSl8fDk1PT09b3x8KC0zMyZvKT49NjUmJigtMzMmbyk8PTkwfHxvPj00OCYmbzw9NTcpOyllKys7cmV0dXJuIGV9KSh0LG8sbiksbz1zdSh0LG8sbiw1OCksbz10dS52YWx1ZT1ydSh0LG8sbiksbz10dS52YWx1ZUVuZD0oZnVuY3Rpb24gYSh0LGUsbil7bGV0IG89LTEsaT0tMSxhPS0xLHI9ZSxzPXI7Zm9yKDtyPG47KXtjb25zdCBsPXQuY2hhckNvZGVBdChyKyspO2lmKDU5PT09bClyZXR1cm4gczszND09PWx8fDM5PT09bD9zPXI9bHUodCxsLHIsbik6ZT09PXItNCYmODU9PT1hJiY4Mj09PWkmJjc2PT09byYmNDA9PT1sP3M9cj1sdSh0LDQxLHIsbik6bD4zMiYmKHM9ciksYT1pLGk9byxvPS0zMyZsfXJldHVybiBzfSkodCxvLG4pLHN1KHQsbyxuLDU5KSl9ZnVuY3Rpb24gYXUodCl7dHUua2V5PTAsdHUua2V5RW5kPTAsdHUudmFsdWU9MCx0dS52YWx1ZUVuZD0wLHR1LnRleHRFbmQ9dC5sZW5ndGh9ZnVuY3Rpb24gcnUodCxlLG4pe2Zvcig7ZTxuJiZ0LmNoYXJDb2RlQXQoZSk8PTMyOyllKys7cmV0dXJuIGV9ZnVuY3Rpb24gc3UodCxlLG4sbyl7cmV0dXJuKGU9cnUodCxlLG4pKTxuJiYobmdEZXZNb2RlJiZ0LmNoYXJDb2RlQXQoZSkhPT1vJiZjdSh0LFN0cmluZy5mcm9tQ2hhckNvZGUobyksZSksZSsrKSxlfWZ1bmN0aW9uIGx1KHQsZSxuLG8pe2xldCBpPS0xLGE9bjtmb3IoO2E8bzspe2NvbnN0IG49dC5jaGFyQ29kZUF0KGErKyk7aWYobj09ZSYmOTIhPT1pKXJldHVybiBhO2k9OTI9PW4mJjkyPT09aT8wOm59dGhyb3cgbmdEZXZNb2RlP2N1KHQsU3RyaW5nLmZyb21DaGFyQ29kZShlKSxvKTpuZXcgRXJyb3J9ZnVuY3Rpb24gY3UodCxlLG4pe3Rocm93IG5nRGV2TW9kZSYmbG4oInN0cmluZyI9PXR5cGVvZiB0LCEwLCJTdHJpbmcgZXhwZWN0ZWQgaGVyZSIpLGJuKGBNYWxmb3JtZWQgc3R5bGUgYXQgbG9jYXRpb24gJHtufSBpbiBzdHJpbmcgJ2ArdC5zdWJzdHJpbmcoMCxuKSsiWz4+Iit0LnN1YnN0cmluZyhuLG4rMSkrIjw8XSIrdC5zdWJzdHIobisxKStgJy4gRXhwZWN0aW5nICcke2V9Jy5gKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gZHUodCxlLG4pe3JldHVybiBodSh0LGUsbiwhMSksZHV9ZnVuY3Rpb24gcHUodCxlKXtyZXR1cm4gaHUodCxlLG51bGwsITApLHB1fWZ1bmN0aW9uIG11KHQpe2J1KHZ1LHV1LHQsITEpfWZ1bmN0aW9uIHV1KHQsZSl7Zm9yKGxldCBuPShmdW5jdGlvbiBuKHQpe3JldHVybiBhdSh0KSxpdSh0LHJ1KHQsMCx0dS50ZXh0RW5kKSl9KShlKTtuPj0wO249aXUoZSxuKSl2dSh0LGV1KGUpLG51KGUpKX1mdW5jdGlvbiBmdSh0KXtidShhcixndSx0LCEwKX1mdW5jdGlvbiBndSh0LGUpe2ZvcihsZXQgbj0oZnVuY3Rpb24gbih0KXtyZXR1cm4gYXUodCksb3UodCxydSh0LDAsdHUudGV4dEVuZCkpfSkoZSk7bj49MDtuPW91KGUsbikpYXIodCxldShlKSwhMCl9ZnVuY3Rpb24gaHUodCxlLG4sbyl7Y29uc3QgaT1maSgpLGE9Z2koKSxyPURpKDIpO2EuZmlyc3RVcGRhdGVQYXNzJiZfdShhLHQscixvKSxlIT09YWMmJkZwKGkscixlKSYmeHUoYSxhLmRhdGFbR2koKV0saSxpWzExXSx0LGlbcisxXT0oZnVuY3Rpb24gcyh0LGUpe3JldHVybiBudWxsPT10fHwoInN0cmluZyI9PXR5cGVvZiBlP3QrPWU6Im9iamVjdCI9PXR5cGVvZiB0JiYodD1HZSh0cyh0KSkpKSx0fSkoZSxuKSxvLHIpfWZ1bmN0aW9uIGJ1KHQsZSxuLG8pe2NvbnN0IGk9Z2koKSxhPURpKDIpO2kuZmlyc3RVcGRhdGVQYXNzJiZfdShpLG51bGwsYSxvKTtjb25zdCByPWZpKCk7aWYobiE9PWFjJiZGcChyLGEsbikpe2NvbnN0IHM9aS5kYXRhW0dpKCldO2lmKHd1KHMsbykmJiF5dShpLGEpKXtpZihuZ0Rldk1vZGUpe2NvbnN0IHQ9aS5kYXRhW2FdO2xuKEFycmF5LmlzQXJyYXkodCk/dFsxXTp0LCExLCJTdHlsaW5nIGxpbmtlZCBsaXN0IHNoYWRvdyBpbnB1dCBzaG91bGQgYmUgbWFya2VkIGFzICdmYWxzZSciKX1sZXQgdD1vP3MuY2xhc3Nlc1dpdGhvdXRIb3N0OnMuc3R5bGVzV2l0aG91dEhvc3Q7bmdEZXZNb2RlJiYhMT09PW8mJm51bGwhPT10JiZsbih0LmVuZHNXaXRoKCI7IiksITAsIkV4cGVjdGluZyBzdGF0aWMgcG9ydGlvbiB0byBlbmQgd2l0aCAnOyciKSxudWxsIT09dCYmKG49V2UodCxufHwiIikpLEVtKGkscyxyLG4sbyl9ZWxzZSEoZnVuY3Rpb24gbCh0LGUsbixvLGksYSxyLHMpe2k9PT1hYyYmKGk9V24pO2xldCBsPTAsYz0wLGQ9MDxpLmxlbmd0aD9pWzBdOm51bGwscD0wPGEubGVuZ3RoP2FbMF06bnVsbDtmb3IoO251bGwhPT1kfHxudWxsIT09cDspe25nRGV2TW9kZSYmbW4obCw5OTksIkFyZSB3ZSBzdHVjayBpbiBpbmZpbml0ZSBsb29wPyIpLG5nRGV2TW9kZSYmbW4oYyw5OTksIkFyZSB3ZSBzdHVjayBpbiBpbmZpbml0ZSBsb29wPyIpO2NvbnN0IG09bDxpLmxlbmd0aD9pW2wrMV06dm9pZCAwLHU9YzxhLmxlbmd0aD9hW2MrMV06dm9pZCAwO2xldCBmLGc9bnVsbDtkPT09cD8obCs9MixjKz0yLG0hPT11JiYoZz1wLGY9dSkpOm51bGw9PT1wfHxudWxsIT09ZCYmZDxwPyhsKz0yLGc9ZCk6KG5nRGV2TW9kZSYmaG4ocCwiRXhwZWN0aW5nIHRvIGhhdmUgYSB2YWxpZCBrZXkiKSxjKz0yLGc9cCxmPXUpLG51bGwhPT1nJiZ4dSh0LGUsbixvLGcsZixyLHMpLGQ9bDxpLmxlbmd0aD9pW2xdOm51bGwscD1jPGEubGVuZ3RoP2FbY106bnVsbH19KShpLHMscixyWzExXSxyW2ErMV0sclthKzFdPShmdW5jdGlvbiBzKHQsZSxuKXtpZihudWxsPT1ufHwiIj09PW4pcmV0dXJuIFduO2NvbnN0IG89W10saT10cyhuKTtpZihBcnJheS5pc0FycmF5KGkpKWZvcihsZXQgZT0wO2U8aS5sZW5ndGg7ZSsrKXQobyxpW2VdLCEwKTtlbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgaSlmb3IoY29uc3QgZSBpbiBpKWkuaGFzT3duUHJvcGVydHkoZSkmJnQobyxlLGlbZV0pO2Vsc2Uic3RyaW5nIj09dHlwZW9mIGk/ZShvLGkpOm5nRGV2TW9kZSYmYm4oIlVuc3VwcG9ydGVkIHN0eWxpbmcgdHlwZSAiK3R5cGVvZiBpKyI6ICIraSk7cmV0dXJuIG99KSh0LGUsbiksbyxhKX19ZnVuY3Rpb24geXUodCxlKXtyZXR1cm4gZT49dC5leHBhbmRvU3RhcnRJbmRleH1mdW5jdGlvbiBfdSh0LGUsbixvKXtuZ0Rldk1vZGUmJlRvKHQpO2NvbnN0IGk9dC5kYXRhO2lmKG51bGw9PT1pW24rMV0pe2NvbnN0IGE9aVtHaSgpXTtuZ0Rldk1vZGUmJmhuKGEsIlROb2RlIGV4cGVjdGVkIik7Y29uc3Qgcj15dSh0LG4pO3d1KGEsbykmJm51bGw9PT1lJiYhciYmKGU9ITEpLGU9KGZ1bmN0aW9uIGEodCxlLG4sbyl7Y29uc3QgaT1UaSh0KTtsZXQgYT1vP2UucmVzaWR1YWxDbGFzc2VzOmUucmVzaWR1YWxTdHlsZXM7aWYobnVsbD09PWkpMD09PShvP2UuY2xhc3NCaW5kaW5nczplLnN0eWxlQmluZGluZ3MpJiYobj1NdShuPUN1KG51bGwsdCxlLG4sbyksZS5hdHRycyxvKSxhPW51bGwpO2Vsc2V7Y29uc3Qgcj1lLmRpcmVjdGl2ZVN0eWxpbmdMYXN0O2lmKC0xPT09cnx8dFtyXSE9PWkpaWYobj1DdShpLHQsZSxuLG8pLG51bGw9PT1hKXtsZXQgbj0oZnVuY3Rpb24gcih0LGUsbil7Y29uc3Qgbz1uP2UuY2xhc3NCaW5kaW5nczplLnN0eWxlQmluZGluZ3M7aWYoMCE9PW1jKG8pKXJldHVybiB0W2NjKG8pXX0pKHQsZSxvKTt2b2lkIDAhPT1uJiZBcnJheS5pc0FycmF5KG4pJiYobj1DdShudWxsLHQsZSxuWzFdLG8pLG49TXUobixlLmF0dHJzLG8pLChmdW5jdGlvbiBzKHQsZSxuLG8pe2NvbnN0IGk9bj9lLmNsYXNzQmluZGluZ3M6ZS5zdHlsZUJpbmRpbmdzO25nRGV2TW9kZSYmY24obWMoaSksMCwiRXhwZWN0aW5nIHRvIGhhdmUgYXQgbGVhc3Qgb25lIHRlbXBsYXRlIHN0eWxpbmcgYmluZGluZy4iKSx0W2NjKGkpXT1vfSkodCxlLG8sbikpfWVsc2UgYT0oZnVuY3Rpb24gbCh0LGUsbil7bGV0IG87Y29uc3QgaT1lLmRpcmVjdGl2ZUVuZDtuZ0Rldk1vZGUmJmNuKGUuZGlyZWN0aXZlU3R5bGluZ0xhc3QsLTEsIkJ5IHRoZSB0aW1lIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgYXQgbGVhc3Qgb25lIGhvc3RCaW5kaW5ncy1ub2RlIHN0eWxpbmcgaW5zdHJ1Y3Rpb24gbXVzdCBoYXZlIGV4ZWN1dGVkLiIpO2ZvcihsZXQgYT0xK2UuZGlyZWN0aXZlU3R5bGluZ0xhc3Q7YTxpO2ErKylvPU11KG8sdFthXS5ob3N0QXR0cnMsbik7cmV0dXJuIE11KG8sZS5hdHRycyxuKX0pKHQsZSxvKX1yZXR1cm4gdm9pZCAwIT09YSYmKG8/ZS5yZXNpZHVhbENsYXNzZXM9YTplLnJlc2lkdWFsU3R5bGVzPWEpLG59KShpLGEsZSxvKSwoZnVuY3Rpb24gcih0LGUsbixvLGksYSl7bmdEZXZNb2RlJiZUbyhnaSgpKTtsZXQgcj1hP2UuY2xhc3NCaW5kaW5nczplLnN0eWxlQmluZGluZ3Mscz1jYyhyKSxsPW1jKHIpO3Rbb109bjtsZXQgYyxkPSExO2lmKEFycmF5LmlzQXJyYXkobikpe2NvbnN0IHQ9bjtjPXRbMV0sKG51bGw9PT1jfHxzcih0LGMpPjApJiYoZD0hMCl9ZWxzZSBjPW47aWYoaSlpZigwIT09bCl7Y29uc3QgZT1jYyh0W3MrMV0pO3RbbysxXT1sYyhlLHMpLDAhPT1lJiYodFtlKzFdPXVjKHRbZSsxXSxvKSksdFtzKzFdPShmdW5jdGlvbiBwKHQsZSl7cmV0dXJuIG5nRGV2TW9kZSYmYW4odCwiZXhwZWN0ZWQgbnVtYmVyIiksbmdEZXZNb2RlJiZybihlLDAsMzI3NjcpLDEzMTA3MSZ0fGU8PDE3fSkodFtzKzFdLG8pfWVsc2UgdFtvKzFdPWxjKHMsMCksMCE9PXMmJih0W3MrMV09dWModFtzKzFdLG8pKSxzPW87ZWxzZSB0W28rMV09bGMobCwwKSxuZ0Rldk1vZGUmJmxuKDAhPT1zJiYwPT09bCwhMSwiQWRkaW5nIHRlbXBsYXRlIGJpbmRpbmdzIGFmdGVyIGhvc3RCaW5kaW5ncyBpcyBub3QgYWxsb3dlZC4iKSwwPT09cz9zPW86dFtsKzFdPXVjKHRbbCsxXSxvKSxsPW87ZCYmKHRbbysxXT1wYyh0W28rMV0pKSxRbSh0LGMsbywhMCksUW0odCxjLG8sITEpLChmdW5jdGlvbiBtKHQsZSxuLG8saSl7Y29uc3QgYT1pP3QucmVzaWR1YWxDbGFzc2VzOnQucmVzaWR1YWxTdHlsZXM7bnVsbCE9YSYmInN0cmluZyI9PXR5cGVvZiBlJiZzcihhLGUpPj0wJiYobltvKzFdPWdjKG5bbysxXSkpfSkoZSxjLHQsbyxhKSxyPWxjKHMsbCksYT9lLmNsYXNzQmluZGluZ3M9cjplLnN0eWxlQmluZGluZ3M9cn0pKGksYSxlLG4scixvKX19ZnVuY3Rpb24gQ3UodCxlLG4sbyxpKXtsZXQgYT1udWxsO2NvbnN0IHI9bi5kaXJlY3RpdmVFbmQ7bGV0IHM9bi5kaXJlY3RpdmVTdHlsaW5nTGFzdDtmb3IoLTE9PT1zP3M9bi5kaXJlY3RpdmVTdGFydDpzKys7czxyJiYoYT1lW3NdLG5nRGV2TW9kZSYmaG4oYSwiZXhwZWN0ZWQgdG8gYmUgZGVmaW5lZCIpLG89TXUobyxhLmhvc3RBdHRycyxpKSxhIT09dCk7KXMrKztyZXR1cm4gbnVsbCE9PXQmJihuLmRpcmVjdGl2ZVN0eWxpbmdMYXN0PXMpLG99ZnVuY3Rpb24gTXUodCxlLG4pe2NvbnN0IG89bj8xOjI7bGV0IGk9LTE7aWYobnVsbCE9PWUpZm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKyspe2NvbnN0IHI9ZVthXTsibnVtYmVyIj09dHlwZW9mIHI/aT1yOmk9PT1vJiYoQXJyYXkuaXNBcnJheSh0KXx8KHQ9dm9pZCAwPT09dD9bXTpbIiIsdF0pLGFyKHQsciwhIW58fGVbKythXSkpfXJldHVybiB2b2lkIDA9PT10P251bGw6dH1mdW5jdGlvbiB2dSh0LGUsbil7YXIodCxlLHRzKG4pKX1mdW5jdGlvbiB4dSh0LGUsbixvLGksYSxyLHMpe2lmKCEoMyZlLnR5cGUpKXJldHVybjtjb25zdCBsPXQuZGF0YSxjPWxbcysxXTtQdShmYyhjKT9PdShsLGUsbixpLG1jKGMpLHIpOnZvaWQgMCl8fChQdShhKXx8ZGMoYykmJihhPU91KGwsbnVsbCxuLGkscyxyKSksKGZ1bmN0aW9uIGQodCxlLG4sbyxpKXtjb25zdCBhPSRvKHQpO2lmKGUpaT8obmdEZXZNb2RlJiZuZ0Rldk1vZGUucmVuZGVyZXJBZGRDbGFzcysrLGE/dC5hZGRDbGFzcyhuLG8pOihuZ0Rldk1vZGUmJmhuKG4uY2xhc3NMaXN0LCJIVE1MRWxlbWVudCBleHBlY3RlZCIpLG4uY2xhc3NMaXN0LmFkZChvKSkpOihuZ0Rldk1vZGUmJm5nRGV2TW9kZS5yZW5kZXJlclJlbW92ZUNsYXNzKyssYT90LnJlbW92ZUNsYXNzKG4sbyk6bi5jbGFzc0xpc3QucmVtb3ZlKG8pKTtlbHNle2xldCBlPS0xPT09by5pbmRleE9mKCItIik/dm9pZCAwOmNsLkRhc2hDYXNlO2lmKG51bGw9PWkpbmdEZXZNb2RlJiZuZ0Rldk1vZGUucmVuZGVyZXJSZW1vdmVTdHlsZSsrLGE/dC5yZW1vdmVTdHlsZShuLG8sZSk6bi5zdHlsZS5yZW1vdmVQcm9wZXJ0eShvKTtlbHNle2NvbnN0IHI9InN0cmluZyI9PXR5cGVvZiBpJiZpLmVuZHNXaXRoKCIhaW1wb3J0YW50Iik7ciYmKGk9aS5zbGljZSgwLC0xMCksZXw9Y2wuSW1wb3J0YW50KSxuZ0Rldk1vZGUmJm5nRGV2TW9kZS5yZW5kZXJlclNldFN0eWxlKyssYT90LnNldFN0eWxlKG4sbyxpLGUpOihuZ0Rldk1vZGUmJmhuKG4uc3R5bGUsIkhUTUxFbGVtZW50IGV4cGVjdGVkIiksbi5zdHlsZS5zZXRQcm9wZXJ0eShvLGkscj8iaW1wb3J0YW50IjoiIikpfX19KShvLHIsbmkoR2koKSxuKSxpLGEpKX1mdW5jdGlvbiBPdSh0LGUsbixvLGksYSl7Y29uc3Qgcj1udWxsPT09ZTtsZXQgcztmb3IoO2k+MDspe2NvbnN0IGU9dFtpXSxhPUFycmF5LmlzQXJyYXkoZSksbD1hP2VbMV06ZSxjPW51bGw9PT1sO2xldCBkPW5baSsxXTtkPT09YWMmJihkPWM/V246dm9pZCAwKTtsZXQgcD1jP3JyKGQsbyk6bD09PW8/ZDp2b2lkIDA7aWYoYSYmIVB1KHApJiYocD1ycihlLG8pKSxQdShwKSYmKHM9cCxyKSlyZXR1cm4gcztjb25zdCBtPXRbaSsxXTtpPXI/Y2MobSk6bWMobSl9aWYobnVsbCE9PWUpe2xldCB0PWE/ZS5yZXNpZHVhbENsYXNzZXM6ZS5yZXNpZHVhbFN0eWxlcztudWxsIT10JiYocz1ycih0LG8pKX1yZXR1cm4gc31mdW5jdGlvbiBQdSh0KXtyZXR1cm4gdm9pZCAwIT09dH1mdW5jdGlvbiB3dSh0LGUpe3JldHVybiAwIT0odC5mbGFncyYoZT8xNjozMikpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBrdSh0LGU9IiIpe2NvbnN0IG49ZmkoKSxvPWdpKCksaT10K2dvO25nRGV2TW9kZSYmbG4od2koKSxvLmJpbmRpbmdTdGFydEluZGV4LCJ0ZXh0IG5vZGVzIHNob3VsZCBiZSBjcmVhdGVkIGJlZm9yZSBhbnkgYmluZGluZ3MiKSxuZ0Rldk1vZGUmJl9uKG4saSk7Y29uc3QgYT1vLmZpcnN0Q3JlYXRlUGFzcz9aYyhvLGksMSxlLG51bGwpOm8uZGF0YVtpXSxyPW5baV09eWwoblsxMV0sZSk7SGwobyxuLHIsYSksQ2koYSwhMSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIFN1KHQpe3JldHVybiBEdSgiIix0LCIiKSxTdX1mdW5jdGlvbiBEdSh0LGUsbil7Y29uc3Qgbz1maSgpLGk9R3Aobyx0LGUsbik7cmV0dXJuIGkhPT1hYyYmamQobyxHaSgpLGkpLER1fWZ1bmN0aW9uIEV1KHQsZSxuLG8saSl7Y29uc3QgYT1maSgpLHI9V3AoYSx0LGUsbixvLGkpO3JldHVybiByIT09YWMmJmpkKGEsR2koKSxyKSxFdX1mdW5jdGlvbiBSdSh0LGUsbixvLGksYSxyKXtjb25zdCBzPWZpKCksbD1ZcChzLHQsZSxuLG8saSxhLHIpO3JldHVybiBsIT09YWMmJmpkKHMsR2koKSxsKSxSdX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmZ1bmN0aW9uIEF1KHQsZSxuKXtidShhcixndSxHcChmaSgpLHQsZSxuKSwhMCl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBUdSh0LGUsbil7Y29uc3Qgbz1maSgpLGk9U2koKTtpZihGcChvLGksZSkpe2NvbnN0IGE9Z2koKSxyPVlpKCk7bGQoYSxyLG8sdCxlLG9bMTFdLG4sITApLG5nRGV2TW9kZSYmemQoYS5kYXRhLHIsdCxpKX1yZXR1cm4gVHV9ZnVuY3Rpb24gTnUodCxlLG4pe2NvbnN0IG89ZmkoKSxpPVNpKCk7aWYoRnAobyxpLGUpKXtjb25zdCBhPWdpKCkscj1ZaSgpO2xkKGEscixvLHQsZSxMZChUaShhLmRhdGEpLHIsbyksbiwhMCksbmdEZXZNb2RlJiZ6ZChhLmRhdGEscix0LGkpfXJldHVybiBOdX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSYmKGpuLm5nSTE4bkNsb3N1cmVNb2RlPSJ1bmRlZmluZWQiIT10eXBlb2YgZ29vZyYmImZ1bmN0aW9uIj09dHlwZW9mIGdvb2cuZ2V0TXNnKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3QgenU9dm9pZCAwO3ZhciBJdT1bImVuIixbWyJhIiwicCJdLFsiQU0iLCJQTSJdLHp1XSxbWyJBTSIsIlBNIl0senUsenVdLFtbIlMiLCJNIiwiVCIsIlciLCJUIiwiRiIsIlMiXSxbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLFsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxbIlN1IiwiTW8iLCJUdSIsIldlIiwiVGgiLCJGciIsIlNhIl1dLHp1LFtbIkoiLCJGIiwiTSIsIkEiLCJNIiwiSiIsIkoiLCJBIiwiUyIsIk8iLCJOIiwiRCJdLFsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl0sWyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdXSx6dSxbWyJCIiwiQSJdLFsiQkMiLCJBRCJdLFsiQmVmb3JlIENocmlzdCIsIkFubm8gRG9taW5pIl1dLDAsWzYsMF0sWyJNL2QveXkiLCJNTU0gZCwgeSIsIk1NTU0gZCwgeSIsIkVFRUUsIE1NTU0gZCwgeSJdLFsiaDptbSBhIiwiaDptbTpzcyBhIiwiaDptbTpzcyBhIHoiLCJoOm1tOnNzIGEgenp6eiJdLFsiezF9LCB7MH0iLHp1LCJ7MX0gJ2F0JyB7MH0iLHp1XSxbIi4iLCIsIiwiOyIsIiUiLCIrIiwiLSIsIkUiLCLDlyIsIuKAsCIsIuKIniIsIk5hTiIsIjoiXSxbIiMsIyMwLiMjIyIsIiMsIyMwJSIsIsKkIywjIzAuMDAiLCIjRTAiXSwiVVNEIiwiJCIsIlVTIERvbGxhciIse30sImx0ciIsZnVuY3Rpb24gSHUodCl7Y29uc3QgZT1NYXRoLmZsb29yKE1hdGguYWJzKHQpKSxuPXQudG9TdHJpbmcoKS5yZXBsYWNlKC9eW14uXSpcLj8vLCIiKS5sZW5ndGg7cmV0dXJuIDE9PT1lJiYwPT09bj8xOjV9XTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovbGV0IEZ1PXt9O2Z1bmN0aW9uIEx1KHQpe2NvbnN0IGU9KGZ1bmN0aW9uIG4odCl7cmV0dXJuIHQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csIi0iKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKSh0KTtsZXQgbz1WdShlKTtpZihvKXJldHVybiBvO2NvbnN0IGk9ZS5zcGxpdCgiLSIpWzBdO2lmKG89VnUoaSksbylyZXR1cm4gbztpZigiZW4iPT09aSlyZXR1cm4gSXU7dGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGxvY2FsZSBkYXRhIGZvciB0aGUgbG9jYWxlICIke3R9Ii5gKX1mdW5jdGlvbiBCdSh0KXtyZXR1cm4gTHUodClbanUuUGx1cmFsQ2FzZV19ZnVuY3Rpb24gVnUodCl7cmV0dXJuIHQgaW4gRnV8fChGdVt0XT1qbi5uZyYmam4ubmcuY29tbW9uJiZqbi5uZy5jb21tb24ubG9jYWxlcyYmam4ubmcuY29tbW9uLmxvY2FsZXNbdF0pLEZ1W3RdfXZhciBqdTshKGZ1bmN0aW9uKHQpe3RbdC5Mb2NhbGVJZD0wXT0iTG9jYWxlSWQiLHRbdC5EYXlQZXJpb2RzRm9ybWF0PTFdPSJEYXlQZXJpb2RzRm9ybWF0Iix0W3QuRGF5UGVyaW9kc1N0YW5kYWxvbmU9Ml09IkRheVBlcmlvZHNTdGFuZGFsb25lIix0W3QuRGF5c0Zvcm1hdD0zXT0iRGF5c0Zvcm1hdCIsdFt0LkRheXNTdGFuZGFsb25lPTRdPSJEYXlzU3RhbmRhbG9uZSIsdFt0Lk1vbnRoc0Zvcm1hdD01XT0iTW9udGhzRm9ybWF0Iix0W3QuTW9udGhzU3RhbmRhbG9uZT02XT0iTW9udGhzU3RhbmRhbG9uZSIsdFt0LkVyYXM9N109IkVyYXMiLHRbdC5GaXJzdERheU9mV2Vlaz04XT0iRmlyc3REYXlPZldlZWsiLHRbdC5XZWVrZW5kUmFuZ2U9OV09IldlZWtlbmRSYW5nZSIsdFt0LkRhdGVGb3JtYXQ9MTBdPSJEYXRlRm9ybWF0Iix0W3QuVGltZUZvcm1hdD0xMV09IlRpbWVGb3JtYXQiLHRbdC5EYXRlVGltZUZvcm1hdD0xMl09IkRhdGVUaW1lRm9ybWF0Iix0W3QuTnVtYmVyU3ltYm9scz0xM109Ik51bWJlclN5bWJvbHMiLHRbdC5OdW1iZXJGb3JtYXRzPTE0XT0iTnVtYmVyRm9ybWF0cyIsdFt0LkN1cnJlbmN5Q29kZT0xNV09IkN1cnJlbmN5Q29kZSIsdFt0LkN1cnJlbmN5U3ltYm9sPTE2XT0iQ3VycmVuY3lTeW1ib2wiLHRbdC5DdXJyZW5jeU5hbWU9MTddPSJDdXJyZW5jeU5hbWUiLHRbdC5DdXJyZW5jaWVzPTE4XT0iQ3VycmVuY2llcyIsdFt0LkRpcmVjdGlvbmFsaXR5PTE5XT0iRGlyZWN0aW9uYWxpdHkiLHRbdC5QbHVyYWxDYXNlPTIwXT0iUGx1cmFsQ2FzZSIsdFt0LkV4dHJhRGF0YT0yMV09IkV4dHJhRGF0YSJ9KShqdXx8KGp1PXt9KSk7Y29uc3QgVXU9WyJ6ZXJvIiwib25lIiwidHdvIiwiZmV3IiwibWFueSJdLEd1PSJlbi1VUyIsV3U9e21hcmtlcjoiZWxlbWVudCJ9LFl1PXttYXJrZXI6IklDVSJ9O3ZhciBxdTshKGZ1bmN0aW9uKHQpe3RbdC5TSElGVD0yXT0iU0hJRlQiLHRbdC5BUFBFTkRfRUFHRVJMWT0xXT0iQVBQRU5EX0VBR0VSTFkiLHRbdC5DT01NRU5UPTJdPSJDT01NRU5UIn0pKHF1fHwocXU9e30pKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmxldCBadT1HdTtmdW5jdGlvbiBYdSh0KXtobih0LCJFeHBlY3RlZCBsb2NhbGVJZCB0byBiZSBkZWZpbmVkIiksInN0cmluZyI9PXR5cGVvZiB0JiYoWnU9dC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL18vZywiLSIpKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmZ1bmN0aW9uIEt1KHQsZSxuKXtjb25zdCBvPWUuaW5zZXJ0QmVmb3JlSW5kZXgsaT1BcnJheS5pc0FycmF5KG8pP29bMF06bztyZXR1cm4gbnVsbD09PWk/VGwodCwwLG4pOihuZ0Rldk1vZGUmJl9uKG4saSksZWkobltpXSkpfWZ1bmN0aW9uIEp1KHQsZSxuLG8saSl7Y29uc3QgYT1lLmluc2VydEJlZm9yZUluZGV4O2lmKEFycmF5LmlzQXJyYXkoYSkpe25nRGV2TW9kZSYmeW4obyk7bGV0IHI9byxzPW51bGw7aWYoMyZlLnR5cGV8fChzPXIscj1pKSxudWxsIT09ciYmMD09KDImZS5mbGFncykpZm9yKGxldCBlPTE7ZTxhLmxlbmd0aDtlKyspU2wodCxyLG5bYVtlXV0scywhMSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBRdSh0LGUpe2lmKG5nRGV2TW9kZSYmbG4oZS5pbnNlcnRCZWZvcmVJbmRleCxudWxsLCJXZSBleHBlY3QgdGhhdCBpbnNlcnRCZWZvcmVJbmRleCBpcyBub3Qgc2V0IiksdC5wdXNoKGUpLHQubGVuZ3RoPjEpZm9yKGxldCBuPXQubGVuZ3RoLTI7bj49MDtuLS0pe2NvbnN0IG89dFtuXTskdShvKXx8dGYobyxlKSYmbnVsbD09PWVmKG8pJiZuZihvLGUuaW5kZXgpfX1mdW5jdGlvbiAkdSh0KXtyZXR1cm4hKDY0JnQudHlwZSl9ZnVuY3Rpb24gdGYodCxlKXtyZXR1cm4gJHUoZSl8fHQuaW5kZXg+ZS5pbmRleH1mdW5jdGlvbiBlZih0KXtjb25zdCBlPXQuaW5zZXJ0QmVmb3JlSW5kZXg7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZVswXTplfWZ1bmN0aW9uIG5mKHQsZSl7Y29uc3Qgbj10Lmluc2VydEJlZm9yZUluZGV4O0FycmF5LmlzQXJyYXkobik/blswXT1lOihJbChLdSxKdSksdC5pbnNlcnRCZWZvcmVJbmRleD1lKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gb2YodCxlKXtjb25zdCBuPXQuZGF0YVtlXTtpZihudWxsPT09bnx8InN0cmluZyI9PXR5cGVvZiBuKXJldHVybiBudWxsOyFuZ0Rldk1vZGV8fG4uaGFzT3duUHJvcGVydHkoInRWaWV3cyIpfHxuLmhhc093blByb3BlcnR5KCJjdXJyZW50Q2FzZUxWaWV3SW5kZXgiKXx8Ym4oIldlIGV4cGVjdCB0byBnZXQgJ251bGwnfCdUSWN1J3wnVEljdUNvbnRhaW5lcicsIGJ1dCBnb3Q6ICIrbik7Y29uc3Qgbz1uLmhhc093blByb3BlcnR5KCJjdXJyZW50Q2FzZUxWaWV3SW5kZXgiKT9uOm4udmFsdWU7cmV0dXJuIG5nRGV2TW9kZSYma28obyksb31mdW5jdGlvbiBhZih0LGUsbil7Y29uc3Qgbz1YYyh0LG4sNjQsbnVsbCxudWxsKTtyZXR1cm4gUXUoZSxvKSxvfWZ1bmN0aW9uIHJmKHQsZSl7Y29uc3Qgbj1lW3QuY3VycmVudENhc2VMVmlld0luZGV4XTtyZXR1cm4gbnVsbD09PW4/bjpuPDA/fm46bn1mdW5jdGlvbiBzZih0KXtyZXR1cm4gdD4+PjE3fWZ1bmN0aW9uIGxmKHQpe3JldHVybigxMzEwNzAmdCk+Pj4xfWZ1bmN0aW9uIGNmKHQpe3JldHVybiAxJnR9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpsZXQgZGY9MCxwZj0wO2Z1bmN0aW9uIG1mKHQsZSxuLG8pe25nRGV2TW9kZSYmeW4obyk7Y29uc3QgaT1uWzExXTtsZXQgYSxyPW51bGw7Zm9yKGxldCBzPTA7czxlLmxlbmd0aDtzKyspe2NvbnN0IGw9ZVtzXTtpZigic3RyaW5nIj09dHlwZW9mIGwpe2NvbnN0IHQ9ZVsrK3NdO251bGw9PT1uW3RdJiYobmdEZXZNb2RlJiZuZ0Rldk1vZGUucmVuZGVyZXJDcmVhdGVUZXh0Tm9kZSsrLG5nRGV2TW9kZSYmX24obix0KSxuW3RdPXlsKGksbCkpfWVsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBsKXN3aXRjaCgxJmwpe2Nhc2UgMDpjb25zdCBjPXNmKGwpO2xldCBkLHA7aWYobnVsbD09PXImJihyPWMsYT1SbChpLG8pKSxjPT09cj8oZD1vLHA9YSk6KGQ9bnVsbCxwPWVpKG5bY10pKSxudWxsIT09cCl7bmdEZXZNb2RlJiZ5bihwKTtjb25zdCBlPWxmKGwpO25nRGV2TW9kZSYmZm4oZSxnbywiTWlzc2luZyByZWYiKTtjb25zdCBvPW5bZV07bmdEZXZNb2RlJiZ5bihvKSxTbChpLHAsbyxkLCExKTtjb25zdCBhPW9mKHQsZSk7aWYobnVsbCE9PWEmJiJvYmplY3QiPT10eXBlb2YgYSl7bmdEZXZNb2RlJiZrbyhhKTtjb25zdCBlPXJmKGEsbik7bnVsbCE9PWUmJm1mKHQsYS5jcmVhdGVbZV0sbixuW2EuYW5jaG9ySWR4XSl9fWJyZWFrO2Nhc2UgMTpjb25zdCBtPWVbKytzXSx1PWVbKytzXTtNZChpLG5pKGw+Pj4xLG4pLG51bGwsbnVsbCxtLHUsbnVsbCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgbXV0YXRlIG9wZXJhdGlvbiBmb3IgIiR7bH0iYCl9ZWxzZSBzd2l0Y2gobCl7Y2FzZSBZdTpjb25zdCB0PWVbKytzXSxvPWVbKytzXTtudWxsPT09bltvXSYmKG5nRGV2TW9kZSYmbG4odHlwZW9mIHQsInN0cmluZyIsYEV4cGVjdGVkICIke3R9IiB0byBiZSBhIGNvbW1lbnQgbm9kZSB2YWx1ZWApLG5nRGV2TW9kZSYmbmdEZXZNb2RlLnJlbmRlcmVyQ3JlYXRlQ29tbWVudCsrLG5nRGV2TW9kZSYmTm8obixvKSxMcyhuW29dPUNsKGksdCksbikpO2JyZWFrO2Nhc2UgV3U6Y29uc3QgYT1lWysrc10scj1lWysrc107bnVsbD09PW5bcl0mJihuZ0Rldk1vZGUmJmxuKHR5cGVvZiBhLCJzdHJpbmciLGBFeHBlY3RlZCAiJHthfSIgdG8gYmUgYW4gZWxlbWVudCBub2RlIHRhZyBuYW1lYCksbmdEZXZNb2RlJiZuZ0Rldk1vZGUucmVuZGVyZXJDcmVhdGVFbGVtZW50KyssbmdEZXZNb2RlJiZObyhuLHIpLExzKG5bcl09TWwoaSxhLG51bGwpLG4pKTticmVhaztkZWZhdWx0Om5nRGV2TW9kZSYmYm4oYFVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgbXV0YXRlIG9wZXJhdGlvbiBmb3IgIiR7bH0iYCl9fX1mdW5jdGlvbiB1Zih0LGUsbixvLGkpe2ZvcihsZXQgYT0wO2E8bi5sZW5ndGg7YSsrKXtjb25zdCByPW5bYV0scz1uWysrYV07aWYociZpKXtsZXQgaT0iIjtmb3IobGV0IHI9YSsxO3I8PWErcztyKyspe2NvbnN0IGE9bltyXTtpZigic3RyaW5nIj09dHlwZW9mIGEpaSs9YTtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgYSlpZihhPDApaSs9JGUoZVtvLWFdKTtlbHNle2NvbnN0IHM9YT4+PjI7c3dpdGNoKDMmYSl7Y2FzZSAxOmNvbnN0IGE9blsrK3JdLGw9blsrK3JdLGM9dC5kYXRhW3NdO25nRGV2TW9kZSYmaG4oYywiRXhwZXJ0aW5nIFROb2RlIG9yIHN0cmluZyIpLCJzdHJpbmciPT10eXBlb2YgYz9NZChlWzExXSxlW3NdLG51bGwsYyxhLGksbCk6bGQodCxjLGUsYSxpLGVbMTFdLGwsITEpO2JyZWFrO2Nhc2UgMDpjb25zdCBkPWVbc107bnVsbCE9PWQmJl9sKGVbMTFdLGQsaSk7YnJlYWs7Y2FzZSAyOmdmKHQsb2YodCxzKSxlLGkpO2JyZWFrO2Nhc2UgMzpmZih0LG9mKHQscyksbyxlKX19fX1lbHNle2NvbnN0IGk9blthKzFdO2lmKGk+MCYmMz09KDMmaSkpe2NvbnN0IG49b2YodCxpPj4+Mik7ZVtuLmN1cnJlbnRDYXNlTFZpZXdJbmRleF08MCYmZmYodCxuLG8sZSl9fWErPXN9fWZ1bmN0aW9uIGZmKHQsZSxuLG8pe25nRGV2TW9kZSYmX24obyxlLmN1cnJlbnRDYXNlTFZpZXdJbmRleCk7bGV0IGk9b1tlLmN1cnJlbnRDYXNlTFZpZXdJbmRleF07aWYobnVsbCE9PWkpe2xldCBhPWRmO2k8MCYmKGk9b1tlLmN1cnJlbnRDYXNlTFZpZXdJbmRleF09fmksYT0tMSksdWYodCxvLGUudXBkYXRlW2ldLG4sYSl9fWZ1bmN0aW9uIGdmKHQsZSxuLG8pe2NvbnN0IGk9KGZ1bmN0aW9uIGEodCxlKXtsZXQgbj10LmNhc2VzLmluZGV4T2YoZSk7aWYoLTE9PT1uKXN3aXRjaCh0LnR5cGUpe2Nhc2UgMTp7Y29uc3Qgbz0oZnVuY3Rpb24gaSh0LGUpe2NvbnN0IG49QnUoZSkocGFyc2VJbnQodCwxMCkpLG89VXVbbl07cmV0dXJuIHZvaWQgMCE9PW8/bzoib3RoZXIifSkoZSwoZnVuY3Rpb24gbygpe3JldHVybiBadX0pKCkpO249dC5jYXNlcy5pbmRleE9mKG8pLC0xPT09biYmIm90aGVyIiE9PW8mJihuPXQuY2FzZXMuaW5kZXhPZigib3RoZXIiKSk7YnJlYWt9Y2FzZSAwOm49dC5jYXNlcy5pbmRleE9mKCJvdGhlciIpfXJldHVybi0xPT09bj9udWxsOm59Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLykoZSxvKTtpZihyZihlLG4pIT09aSYmKGhmKHQsZSxuKSxuW2UuY3VycmVudENhc2VMVmlld0luZGV4XT1udWxsPT09aT9udWxsOn5pLG51bGwhPT1pKSl7Y29uc3Qgbz1uW2UuYW5jaG9ySWR4XTtvJiYobmdEZXZNb2RlJiZ5bihvKSxtZih0LGUuY3JlYXRlW2ldLG4sbykpfX1mdW5jdGlvbiBoZih0LGUsbil7bGV0IG89cmYoZSxuKTtpZihudWxsIT09byl7Y29uc3QgaT1lLnJlbW92ZVtvXTtmb3IobGV0IGU9MDtlPGkubGVuZ3RoO2UrKyl7Y29uc3Qgbz1pW2VdO2lmKG8+MCl7Y29uc3QgdD1uaShvLG4pO251bGwhPT10JiZWbChuWzExXSx0KX1lbHNlIGhmKHQsb2YodCx+byksbil9fX1mdW5jdGlvbiBiZigpe2NvbnN0IHQ9W107bGV0IGUsbixvPS0xO2Z1bmN0aW9uIGkodCxlKXtvPTA7Y29uc3QgaT1yZih0LGUpO251bGwhPT1pPyhuZ0Rldk1vZGUmJnJuKGksMCx0LmNhc2VzLmxlbmd0aC0xKSxuPXQucmVtb3ZlW2ldKTpuPVdufWZ1bmN0aW9uIGEoKXtpZihvPG4ubGVuZ3RoKXtjb25zdCByPW5bbysrXTtpZihuZ0Rldk1vZGUmJmFuKHIsIkV4cGVjdGluZyBPcENvZGUgbnVtYmVyIikscj4wKXtjb25zdCB0PWVbcl07cmV0dXJuIG5nRGV2TW9kZSYmeW4odCksdH17dC5wdXNoKG8sbik7Y29uc3Qgcz1lWzFdLmRhdGFbfnJdO3JldHVybiBuZ0Rldk1vZGUmJmtvKHMpLGkocyxlKSxhKCl9fXJldHVybiAwPT09dC5sZW5ndGg/bnVsbDoobj10LnBvcCgpLG89dC5wb3AoKSxhKCkpfXJldHVybiBmdW5jdGlvbiByKG4sbyl7Zm9yKGU9bzt0Lmxlbmd0aDspdC5wb3AoKTtyZXR1cm4gbmdEZXZNb2RlJiZPbyhuLG8pLGkobi52YWx1ZSxvKSxhfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24geWYodCl7Y29uc3QgZT10fHwoQXJyYXkuaXNBcnJheSh0aGlzKT90aGlzOltdKTtsZXQgbj1bXTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7Y29uc3Qgbz1lW3QrK10saT0obyZxdS5BUFBFTkRfRUFHRVJMWSk9PT1xdS5BUFBFTkRfRUFHRVJMWSxhPW8+Pj5xdS5TSElGVDtuLnB1c2goYGxWaWV3WyR7YX1dID0gZG9jdW1lbnQuJHsobyZxdS5DT01NRU5UKT09PXF1LkNPTU1FTlQ/ImNyZWF0ZUNvbW1lbnQiOiJjcmVhdGVUZXh0In0oJHtKU09OLnN0cmluZ2lmeShlW3RdKX0pO2ApLGkmJm4ucHVzaChgcGFyZW50LmFwcGVuZENoaWxkKGxWaWV3WyR7YX1dKTtgKX1yZXR1cm4gbn1mdW5jdGlvbiBfZih0KXtjb25zdCBlPW5ldyB2Zih0fHwoQXJyYXkuaXNBcnJheSh0aGlzKT90aGlzOltdKSk7bGV0IG49W107ZnVuY3Rpb24gbyh0KXtjb25zdCBuPXQ+Pj4yO3N3aXRjaCgzJnQpe2Nhc2UgMDpyZXR1cm5gKGxWaWV3WyR7bn1dIGFzIFRleHQpLnRleHRDb250ZW50ID0gJCQkYDtjYXNlIDE6Y29uc3QgdD1lLmNvbnN1bWVTdHJpbmcoKSxvPWUuY29uc3VtZUZ1bmN0aW9uKCk7cmV0dXJuYChsVmlld1ske259XSBhcyBFbGVtZW50KS5zZXRBdHRyaWJ1dGUoJyR7dH0nLCAke28/YCgke299KSgkJCQpYDoiJCQkIn0pYDtjYXNlIDI6cmV0dXJuYGljdVN3aXRjaENhc2UoJHtufSwgJCQkKWA7Y2FzZSAzOnJldHVybmBpY3VVcGRhdGVDYXNlKCR7bn0pYH10aHJvdyBuZXcgRXJyb3IoInVuZXhwZWN0ZWQgT3BDb2RlIil9Zm9yKDtlLmhhc01vcmUoKTspe2xldCB0PWUuY29uc3VtZU51bWJlcigpLGk9ZS5jb25zdW1lTnVtYmVyKCk7Y29uc3QgYT1lLmkraSxyPVtdO2xldCBzPSIiO2Zvcig7ZS5pPGE7KXtsZXQgdD1lLmNvbnN1bWVOdW1iZXJPclN0cmluZygpO2lmKCJzdHJpbmciPT10eXBlb2YgdClzKz10O2Vsc2UgaWYodDwwKXMrPSIke2xWaWV3W2kiK3QrIl19IjtlbHNle2NvbnN0IGU9byh0KTtyLnB1c2goZS5yZXBsYWNlKCIkJCQiLCJgIitzKyJgIikrIjsiKSxzPSIifX1uLnB1c2goYGlmIChtYXNrICYgMGIke3QudG9TdHJpbmcoMil9KSB7ICR7ci5qb2luKCIgIil9IH1gKX1yZXR1cm4gbn1mdW5jdGlvbiBDZih0KXtjb25zdCBlPW5ldyB2Zih0fHwoQXJyYXkuaXNBcnJheSh0aGlzKT90aGlzOltdKSk7bGV0IG49W107ZnVuY3Rpb24gbyh0KXtjb25zdCBuPXNmKHQpLG89bGYodCk7c3dpdGNoKGNmKHQpKXtjYXNlIDA6cmV0dXJuYChsVmlld1ske259XSBhcyBFbGVtZW50KS5hcHBlbmRDaGlsZChsVmlld1ske2l9XSlgO2Nhc2UgMTpyZXR1cm5gKGxWaWV3WyR7b31dIGFzIEVsZW1lbnQpLnNldEF0dHJpYnV0ZSgiJHtlLmNvbnN1bWVTdHJpbmcoKX0iLCAiJHtlLmNvbnN1bWVTdHJpbmcoKX0iKWB9dGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIE9wQ29kZTogIitjZih0KSl9bGV0IGk9LTE7Zm9yKDtlLmhhc01vcmUoKTspe2xldCB0PWUuY29uc3VtZU51bWJlclN0cmluZ09yTWFya2VyKCk7aWYodD09PVl1KXtjb25zdCB0PWUuY29uc3VtZVN0cmluZygpO2k9ZS5jb25zdW1lTnVtYmVyKCksbi5wdXNoKGBsVmlld1ske2l9XSA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoIiR7dH0iKWApfWVsc2UgaWYodD09PVd1KXtjb25zdCB0PWUuY29uc3VtZVN0cmluZygpO2k9ZS5jb25zdW1lTnVtYmVyKCksbi5wdXNoKGBsVmlld1ske2l9XSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIiR7dH0iKWApfWVsc2UgaWYoInN0cmluZyI9PXR5cGVvZiB0KWk9ZS5jb25zdW1lTnVtYmVyKCksbi5wdXNoKGBsVmlld1ske2l9XSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIke3R9IilgKTtlbHNle2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgdmFsdWUiKTt7Y29uc3QgZT1vKHQpO2UmJm4ucHVzaChlKX19fXJldHVybiBufWZ1bmN0aW9uIE1mKHQpe2NvbnN0IGU9dHx8KEFycmF5LmlzQXJyYXkodGhpcyk/dGhpczpbXSk7bGV0IG49W107Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2NvbnN0IG89ZVt0XTtuLnB1c2gobz4wP2ByZW1vdmUobFZpZXdbJHtvfV0pYDpgcmVtb3ZlTmVzdGVkSUNVKCR7fm99KWApfXJldHVybiBufWNsYXNzIHZme2NvbnN0cnVjdG9yKHQpe3RoaXMuaT0wLHRoaXMuY29kZXM9dH1oYXNNb3JlKCl7cmV0dXJuIHRoaXMuaTx0aGlzLmNvZGVzLmxlbmd0aH1jb25zdW1lTnVtYmVyKCl7bGV0IHQ9dGhpcy5jb2Rlc1t0aGlzLmkrK107cmV0dXJuIGFuKHQsImV4cGVjdGluZyBudW1iZXIgaW4gT3BDb2RlIiksdH1jb25zdW1lU3RyaW5nKCl7bGV0IHQ9dGhpcy5jb2Rlc1t0aGlzLmkrK107cmV0dXJuIHNuKHQsImV4cGVjdGluZyBzdHJpbmcgaW4gT3BDb2RlIiksdH1jb25zdW1lRnVuY3Rpb24oKXtsZXQgdD10aGlzLmNvZGVzW3RoaXMuaSsrXTtpZihudWxsPT09dHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQpcmV0dXJuIHQ7dGhyb3cgbmV3IEVycm9yKCJleHBlY3RpbmcgZnVuY3Rpb24gaW4gT3BDb2RlIil9Y29uc3VtZU51bWJlck9yU3RyaW5nKCl7bGV0IHQ9dGhpcy5jb2Rlc1t0aGlzLmkrK107cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHxhbih0LCJleHBlY3RpbmcgbnVtYmVyIG9yIHN0cmluZyBpbiBPcENvZGUiKSx0fWNvbnN1bWVOdW1iZXJTdHJpbmdPck1hcmtlcigpe2xldCB0PXRoaXMuY29kZXNbdGhpcy5pKytdO3JldHVybiJzdHJpbmciPT10eXBlb2YgdHx8Im51bWJlciI9PXR5cGVvZiB0fHx0PT1ZdXx8dD09V3V8fGFuKHQsImV4cGVjdGluZyBudW1iZXIsIHN0cmluZywgSUNVX01BUktFUiBvciBFTEVNRU5UX01BUktFUiBpbiBPcENvZGUiKSx0fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3QgeGY9L++/vShcZCspOj9cZCrvv70vZ2ksT2Y9Lyh7XHMq77+9XGQrOj9cZCrvv71ccyosXHMqXFN7Nn1ccyosW1xzXFNdKn0pL2dpLFBmPS/vv70oXGQrKe+/vS8sd2Y9L15ccyoo77+9XGQrOj9cZCrvv70pXHMqLFxzKihzZWxlY3R8cGx1cmFsKVxzKiwvLGtmPS/vv71cLz9cKihcZCs6XGQrKe+/vS9naSxTZj0v77+9KFwvP1sjKl1cZCspOj9cZCrvv70vZ2ksRGY9L1x1RTUwMC9nO2Z1bmN0aW9uIEVmKHQsZSxuLG8saSxhLHIpe2NvbnN0IHM9S2ModCxvLDEsbnVsbCk7bGV0IGw9czw8cXUuU0hJRlQsYz1faSgpO2U9PT1jJiYoYz1udWxsKSxudWxsPT09YyYmKGx8PXF1LkFQUEVORF9FQUdFUkxZKSxyJiYobHw9cXUuQ09NTUVOVCwoZnVuY3Rpb24gZCh0KXt2b2lkIDA9PT1kbCYmKGRsPXQoKSl9KShiZikpLGkucHVzaChsLG51bGw9PT1hPyIiOmEpO2NvbnN0IHA9WGModCxzLHI/MzI6MSxudWxsPT09YT9uZ0Rldk1vZGU/Int7P319IjoiIjphLG51bGwpO1F1KG4scCk7Y29uc3QgbT1wLmluZGV4O3JldHVybiBDaShwLCExKSxudWxsIT09YyYmZSE9PWMmJihmdW5jdGlvbiB1KHQsZSl7bmdEZXZNb2RlJiZ3byh0KTtsZXQgbj10Lmluc2VydEJlZm9yZUluZGV4O251bGw9PT1uPyhJbChLdSxKdSksbj10Lmluc2VydEJlZm9yZUluZGV4PVtudWxsLGVdKToobG4oQXJyYXkuaXNBcnJheShuKSwhMCwiRXhwZWN0aW5nIGFycmF5IGhlcmUiKSxuLnB1c2goZSkpfSkoYyxtKSxwfWZ1bmN0aW9uIFJmKHQsZSxuLG8saSxhLHIpe2NvbnN0IHM9ci5tYXRjaCh4ZiksbD1FZih0LGUsbixhLG8scz9udWxsOnIsITEpO3MmJkFmKGkscixsLmluZGV4LG51bGwsMCxudWxsKX1mdW5jdGlvbiBBZih0LGUsbixvLGksYSl7bmdEZXZNb2RlJiZnbihuLGdvLCJJbmRleCBtdXN0IGJlIGluIGFic29sdXRlIExWaWV3IG9mZnNldCIpO2NvbnN0IHI9dC5sZW5ndGgscz1yKzE7dC5wdXNoKG51bGwsbnVsbCk7Y29uc3QgbD1yKzI7bmdEZXZNb2RlJiZiYyh0LF9mKTtjb25zdCBjPWUuc3BsaXQoeGYpO2xldCBkPTA7Zm9yKGxldCBlPTA7ZTxjLmxlbmd0aDtlKyspe2NvbnN0IG49Y1tlXTtpZigxJmUpe2NvbnN0IGU9aStwYXJzZUludChuLDEwKTt0LnB1c2goLTEtZSksZHw9TmYoZSl9ZWxzZSIiIT09biYmdC5wdXNoKG4pfXJldHVybiB0LnB1c2gobjw8Mnwobz8xOjApKSxvJiZ0LnB1c2gobyxhKSx0W3JdPWQsdFtzXT10Lmxlbmd0aC1sLGR9ZnVuY3Rpb24gVGYodCl7bGV0IGU9MDtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3Qgbz10W25dOyJudW1iZXIiPT10eXBlb2YgbyYmbzwwJiZlKyt9cmV0dXJuIGV9ZnVuY3Rpb24gTmYodCl7cmV0dXJuIDE8PE1hdGgubWluKHQsMzEpfWZ1bmN0aW9uIHpmKHQpe2xldCBlLG4sbz0iIixpPTAsYT0hMTtmb3IoO251bGwhPT0oZT1rZi5leGVjKHQpKTspYT9lWzBdPT09YO+/vS8qJHtufe+/vWAmJihpPWUuaW5kZXgsYT0hMSk6KG8rPXQuc3Vic3RyaW5nKGksZS5pbmRleCtlWzBdLmxlbmd0aCksbj1lWzFdLGE9ITApO3JldHVybiBuZ0Rldk1vZGUmJmxuKGEsITEsYFRhZyBtaXNtYXRjaDogdW5hYmxlIHRvIGZpbmQgdGhlIGVuZCBvZiB0aGUgc3ViLXRlbXBsYXRlIGluIHRoZSB0cmFuc2xhdGlvbiAiJHt0fSJgKSxvKz10LnN1YnN0cihpKSxvfWZ1bmN0aW9uIElmKHQsZSxuLG8saSxhKXtuZ0Rldk1vZGUmJmhuKGksIklDVSBleHByZXNzaW9uIG11c3QgYmUgZGVmaW5lZCIpO2xldCByPTA7Y29uc3Qgcz17dHlwZTppLnR5cGUsY3VycmVudENhc2VMVmlld0luZGV4OktjKHQsZSwxLG51bGwpLGFuY2hvcklkeDphLGNhc2VzOltdLGNyZWF0ZTpbXSxyZW1vdmU6W10sdXBkYXRlOltdfTshKGZ1bmN0aW9uIGwodCxlLG4pe3QucHVzaChOZihlLm1haW5CaW5kaW5nKSwyLC0xLWUubWFpbkJpbmRpbmcsbjw8MnwyKX0pKG4saSxhKSwoZnVuY3Rpb24gYyh0LGUsbil7Y29uc3Qgbz10LmRhdGFbZV07bmdEZXZNb2RlJiZsbihudWxsPT09b3x8by5oYXNPd25Qcm9wZXJ0eSgidFZpZXdzIiksITAsIldlIGV4cGVjdCB0byBnZXQgJ251bGwnfCdUSWN1Q29udGFpbmVyJyIpLG51bGw9PT1vP3QuZGF0YVtlXT1uOihuZ0Rldk1vZGUmJmlhKG8sMzIpLG8udmFsdWU9bil9KSh0LGEscyk7Y29uc3QgZD1pLnZhbHVlcztmb3IobGV0IGE9MDthPGQubGVuZ3RoO2ErKyl7Y29uc3QgbD1kW2FdLGM9W107Zm9yKGxldCB0PTA7dDxsLmxlbmd0aDt0Kyspe2NvbnN0IGU9bFt0XTtpZigic3RyaW5nIiE9dHlwZW9mIGUpe2NvbnN0IG49Yy5wdXNoKGUpLTE7bFt0XT1gXHgzYyEtLe+/vSR7bn3vv70tLVx4M2VgfX1yPUxmKHQscyxlLG4sbyxpLmNhc2VzW2FdLGwuam9pbigiIiksYyl8cn1yJiYoZnVuY3Rpb24gcCh0LGUsbil7dC5wdXNoKGUsMSxuPDwyfDMpfSkobixyLGEpfWZ1bmN0aW9uIEhmKHQpe2NvbnN0IGU9W10sbj1bXTtsZXQgbz0xLGk9MDtjb25zdCBhPUZmKHQ9dC5yZXBsYWNlKHdmLChmdW5jdGlvbih0LGUsbil7cmV0dXJuIG89InNlbGVjdCI9PT1uPzA6MSxpPXBhcnNlSW50KGUuc3Vic3RyKDEpLDEwKSwiIn0pKSk7Zm9yKGxldCB0PTA7dDxhLmxlbmd0aDspe2xldCBpPWFbdCsrXS50cmltKCk7MT09PW8mJihpPWkucmVwbGFjZSgvXHMqKD86PSk/KFx3KylccyovLCIkMSIpKSxpLmxlbmd0aCYmZS5wdXNoKGkpO2NvbnN0IHI9RmYoYVt0KytdKTtlLmxlbmd0aD5uLmxlbmd0aCYmbi5wdXNoKHIpfXJldHVybnt0eXBlOm8sbWFpbkJpbmRpbmc6aSxjYXNlczplLHZhbHVlczpufX1mdW5jdGlvbiBGZih0KXtpZighdClyZXR1cm5bXTtsZXQgZT0wO2NvbnN0IG49W10sbz1bXSxpPS9be31dL2c7bGV0IGE7Zm9yKGkubGFzdEluZGV4PTA7YT1pLmV4ZWModCk7KXtjb25zdCBpPWEuaW5kZXg7aWYoIn0iPT1hWzBdKXtpZihuLnBvcCgpLDA9PW4ubGVuZ3RoKXtjb25zdCBuPXQuc3Vic3RyaW5nKGUsaSk7d2YudGVzdChuKT9vLnB1c2goSGYobikpOm8ucHVzaChuKSxlPWkrMX19ZWxzZXtpZigwPT1uLmxlbmd0aCl7Y29uc3Qgbj10LnN1YnN0cmluZyhlLGkpO28ucHVzaChuKSxlPWkrMX1uLnB1c2goInsiKX19Y29uc3Qgcj10LnN1YnN0cmluZyhlKTtyZXR1cm4gby5wdXNoKHIpLG99ZnVuY3Rpb24gTGYodCxlLG4sbyxpLGEscixzKXtjb25zdCBsPVtdLGM9W10sZD1bXTtuZ0Rldk1vZGUmJihiYyhsLENmKSxiYyhjLE1mKSxiYyhkLF9mKSksZS5jYXNlcy5wdXNoKGEpLGUuY3JlYXRlLnB1c2gobCksZS5yZW1vdmUucHVzaChjKSxlLnVwZGF0ZS5wdXNoKGQpO2NvbnN0IHA9b3MoSm8oKSkuZ2V0SW5lcnRCb2R5RWxlbWVudChyKTtuZ0Rldk1vZGUmJmhuKHAsIlVuYWJsZSB0byBnZW5lcmF0ZSBpbmVydCBib2R5IGVsZW1lbnQiKTtjb25zdCBtPVJzKHApfHxwO3JldHVybiBtP0JmKHQsZSxuLG8sbCxjLGQsbSxpLHMsMCk6MH1mdW5jdGlvbiBCZih0LGUsbixvLGksYSxyLHMsbCxjLGQpe2xldCBwPTAsbT1zLmZpcnN0Q2hpbGQ7Zm9yKDttOyl7Y29uc3Qgcz1LYyh0LG4sMSxudWxsKTtzd2l0Y2gobS5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpjb25zdCB1PW0sZj11LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtpZih5cy5oYXNPd25Qcm9wZXJ0eShmKSl7VWYoaSxXdSxmLGwscyksdC5kYXRhW3NdPWY7Y29uc3QgZz11LmF0dHJpYnV0ZXM7Zm9yKGxldCB0PTA7dDxnLmxlbmd0aDt0Kyspe2NvbnN0IGU9Zy5pdGVtKHQpLG49ZS5uYW1lLnRvTG93ZXJDYXNlKCk7ZS52YWx1ZS5tYXRjaCh4Zik/eHMuaGFzT3duUHJvcGVydHkobik/QWYocixlLnZhbHVlLHMsZS5uYW1lLDAsX3Nbbl0/bHM6Q3Nbbl0/Y3M6bnVsbCk6bmdEZXZNb2RlJiZjb25zb2xlLndhcm4oYFdBUk5JTkc6IGlnbm9yaW5nIHVuc2FmZSBhdHRyaWJ1dGUgdmFsdWUgJHtufSBvbiBlbGVtZW50ICR7Zn0gKHNlZSBodHRwczovL2cuY28vbmcvc2VjdXJpdHkjeHNzKWApOkdmKGkscyxlKX1wPUJmKHQsZSxuLG8saSxhLHIsbSxzLGMsZCsxKXxwLFZmKGEscyxkKX1icmVhaztjYXNlIE5vZGUuVEVYVF9OT0RFOmNvbnN0IGc9bS50ZXh0Q29udGVudHx8IiIsaD1nLm1hdGNoKHhmKTtVZihpLG51bGwsaD8iIjpnLGwscyksVmYoYSxzLGQpLGgmJihwPUFmKHIsZyxzLG51bGwsMCxudWxsKXxwKTticmVhaztjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOmNvbnN0IGI9UGYuZXhlYyhtLnRleHRDb250ZW50fHwiIik7aWYoYil7Y29uc3QgZT1wYXJzZUludChiWzFdLDEwKSxyPWNbZV07VWYoaSxZdSxuZ0Rldk1vZGU/YG5lc3RlZCBJQ1UgJHtlfWA6IiIsbCxzKSxJZih0LG4sbyxsLHIscyksamYoYSxzLGQpfX1tPW0ubmV4dFNpYmxpbmd9cmV0dXJuIHB9ZnVuY3Rpb24gVmYodCxlLG4pezA9PT1uJiZ0LnB1c2goZSl9ZnVuY3Rpb24gamYodCxlLG4pezA9PT1uJiYodC5wdXNoKH5lKSx0LnB1c2goZSkpfWZ1bmN0aW9uIFVmKHQsZSxuLG8saSl7bnVsbCE9PWUmJnQucHVzaChlKSx0LnB1c2gobixpLChmdW5jdGlvbiBhKHQsZSxuKXtyZXR1cm4gbmdEZXZNb2RlJiZnbihlLDAsIk1pc3NpbmcgcGFyZW50IGluZGV4IiksbmdEZXZNb2RlJiZmbihuLDAsIk1pc3NpbmcgcmVmIGluZGV4IiksdHxlPDwxN3xuPDwxfSkoMCxvLGkpKX1mdW5jdGlvbiBHZih0LGUsbil7dC5wdXNoKGU8PDF8MSxuLm5hbWUsbi52YWx1ZSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NvbnN0IFdmPS9cWyjvv70uKz/vv70/KVxdLyxZZj0vXFso77+9Lis/77+9PylcXXwo77+9XC8/XCpcZCs6XGQr77+9KS9nLHFmPS8oe1xzKikoVkFSXyhQTFVSQUx8U0VMRUNUKShfXGQrKT8pKFxzKiwpL2csWmY9L3soW0EtWjAtOV9dKyl9L2csWGY9L++/vUkxOE5fRVhQXyhJQ1UoX1xkKyk/Ke+/vS9nLEtmPS9cL1wqLyxKZj0vXGQrXDooXGQrKS87Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBRZih0LGUsbj0tMSl7Y29uc3Qgbz1naSgpLGk9ZmkoKSxhPWdvK3Q7bmdEZXZNb2RlJiZobihvLCJ0VmlldyBzaG91bGQgYmUgZGVmaW5lZCIpO2NvbnN0IHI9Y2koby5jb25zdHMsZSkscz1faSgpO28uZmlyc3RDcmVhdGVQYXNzJiYoZnVuY3Rpb24gbCh0LGUsbixvLGksYSl7Y29uc3Qgcj1faSgpLHM9W10sbD1bXSxjPVtbXV07bmdEZXZNb2RlJiYoYmMocyx5ZiksYmMobCxfZikpO2NvbnN0IGQ9KGZ1bmN0aW9uIG0odCl7cmV0dXJuIHQucmVwbGFjZShEZiwiICIpfSkoaT0oZnVuY3Rpb24gcCh0LGUpe2lmKChmdW5jdGlvbiBuKHQpe3JldHVybi0xPT09dH0pKGUpKXJldHVybiB6Zih0KTt7Y29uc3Qgbj10LmluZGV4T2YoYDoke2V977+9YCkrMitlLnRvU3RyaW5nKCkubGVuZ3RoLG89dC5zZWFyY2gobmV3IFJlZ0V4cChg77+9XFwvXFwqXFxkKzoke2V977+9YCkpO3JldHVybiB6Zih0LnN1YnN0cmluZyhuLG8pKX19KShpLGEpKS5zcGxpdChTZik7Zm9yKGxldCBhPTA7YTxkLmxlbmd0aDthKyspe2xldCBwPWRbYV07aWYoMD09KDEmYSkpe2NvbnN0IGE9RmYocCk7Zm9yKGxldCBkPTA7ZDxhLmxlbmd0aDtkKyspe2xldCBwPWFbZF07aWYoMD09KDEmZCkpe2NvbnN0IGU9cDtuZ0Rldk1vZGUmJnNuKGUsIlBhcnNlZCBJQ1UgcGFydCBzaG91bGQgYmUgc3RyaW5nIiksIiIhPT1lJiZSZih0LHIsY1swXSxzLGwsbixlKX1lbHNle2NvbnN0IGE9cDtpZigib2JqZWN0IiE9dHlwZW9mIGEpdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgSUNVIGV4cHJlc3Npb24gaW4gIiR7aX0iIG1lc3NhZ2UuYCk7Y29uc3QgZD1FZih0LHIsY1swXSxuLHMsbmdEZXZNb2RlP2BJQ1UgJHtvfToke2EubWFpbkJpbmRpbmd9YDoiIiwhMCkuaW5kZXg7bmdEZXZNb2RlJiZnbihkLGdvLCJJbmRleCBtdXN0IGJlIGluIGFic29sdXRlIExWaWV3IG9mZnNldCIpLElmKHQsbixsLGUsYSxkKX19fWVsc2V7Y29uc3QgZT00Nz09PXAuY2hhckNvZGVBdCgwKSxuPXAuY2hhckNvZGVBdChlPzE6MCk7bmdEZXZNb2RlJiZDbihuLDQyLDM1KTtjb25zdCBvPWdvK051bWJlci5wYXJzZUludChwLnN1YnN0cmluZyhlPzI6MSkpO2lmKGUpYy5zaGlmdCgpLENpKF9pKCksITEpO2Vsc2V7Y29uc3QgZT1hZih0LGNbMF0sbyk7Yy51bnNoaWZ0KFtdKSxDaShlLCEwKX19fXQuZGF0YVtvXT17Y3JlYXRlOnMsdXBkYXRlOmx9fSkobyxudWxsPT09cz8wOnMuaW5kZXgsaSxhLHIsbik7Y29uc3QgYz1vLmRhdGFbYV0sZD1rbChvLHM9PT1pWzZdP251bGw6cyxpKTshKGZ1bmN0aW9uIHAodCxlLG4sbyl7Y29uc3QgaT10WzExXTtmb3IobGV0IGE9MDthPGUubGVuZ3RoO2ErKyl7Y29uc3Qgcj1lW2ErK10scz1lW2FdLGw9KHImcXUuQ09NTUVOVCk9PT1xdS5DT01NRU5ULGM9KHImcXUuQVBQRU5EX0VBR0VSTFkpPT09cXUuQVBQRU5EX0VBR0VSTFksZD1yPj4+cXUuU0hJRlQ7bGV0IHA9dFtkXTtudWxsPT09cCYmKHA9dFtkXT1sP2kuY3JlYXRlQ29tbWVudChzKTp5bChpLHMpKSxjJiZudWxsIT09biYmU2woaSxuLHAsbywhMSl9fSkoaSxjLmNyZWF0ZSxkLHMmJjgmcy50eXBlP2lbcy5pbmRleF06bnVsbCksRWkoITApfWZ1bmN0aW9uICRmKCl7RWkoITEpfWZ1bmN0aW9uIHRnKHQsZSxuKXtRZih0LGUsbiksJGYoKX1mdW5jdGlvbiBlZyh0KXtyZXR1cm4oZnVuY3Rpb24gZSh0KXt0JiYoZGZ8PTE8PE1hdGgubWluKHBmLDMxKSkscGYrK30pKEZwKGZpKCksU2koKSx0KSksZWd9ZnVuY3Rpb24gbmcodCl7IShmdW5jdGlvbiBlKHQsbixvKXtpZihwZj4wKXtuZ0Rldk1vZGUmJmhuKHQsInRWaWV3IHNob3VsZCBiZSBkZWZpbmVkIik7Y29uc3QgZT10LmRhdGFbb107dWYodCxuLEFycmF5LmlzQXJyYXkoZSk/ZTplLnVwZGF0ZSx3aSgpLXBmLTEsZGYpfWRmPTAscGY9MH0pKGdpKCksZmkoKSx0K2dvKX1mdW5jdGlvbiBvZyh0LGU9e30pe3JldHVybihmdW5jdGlvbiBuKHQsZT17fSl7bGV0IG49dDtpZihXZi50ZXN0KHQpKXtjb25zdCB0PXt9LGU9WzBdO249bi5yZXBsYWNlKFlmLCgobixvLGkpPT57Y29uc3QgYT1vfHxpLHI9dFthXXx8W107aWYoci5sZW5ndGh8fChhLnNwbGl0KCJ8IikuZm9yRWFjaCgodD0+e2NvbnN0IGU9dC5tYXRjaChKZiksbj1lP3BhcnNlSW50KGVbMV0sMTApOjAsbz1LZi50ZXN0KHQpO3IucHVzaChbbixvLHRdKX0pKSx0W2FdPXIpLCFyLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYGkxOG4gcG9zdHByb2Nlc3M6IHVubWF0Y2hlZCBwbGFjZWhvbGRlciAtICR7YX1gKTtjb25zdCBzPWVbZS5sZW5ndGgtMV07bGV0IGw9MDtmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrKylpZihyW3RdWzBdPT09cyl7bD10O2JyZWFrfWNvbnN0W2MsZCxwXT1yW2xdO3JldHVybiBkP2UucG9wKCk6cyE9PWMmJmUucHVzaChjKSxyLnNwbGljZShsLDEpLHB9KSl9cmV0dXJuIE9iamVjdC5rZXlzKGUpLmxlbmd0aD8obj1uLnJlcGxhY2UocWYsKCh0LG4sbyxpLGEscik9PmUuaGFzT3duUHJvcGVydHkobyk/YCR7bn0ke2Vbb119JHtyfWA6dCkpLG49bi5yZXBsYWNlKFpmLCgodCxuKT0+ZS5oYXNPd25Qcm9wZXJ0eShuKT9lW25dOnQpKSxuPW4ucmVwbGFjZShYZiwoKHQsbik9PntpZihlLmhhc093blByb3BlcnR5KG4pKXtjb25zdCBvPWVbbl07aWYoIW8ubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgaTE4biBwb3N0cHJvY2VzczogdW5tYXRjaGVkIElDVSAtICR7dH0gd2l0aCBrZXk6ICR7bn1gKTtyZXR1cm4gby5zaGlmdCgpfXJldHVybiB0fSkpLG4pOm59KSh0LGUpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gaWcodCxlLG4sbyxpKXtpZih0PVplKHQpLEFycmF5LmlzQXJyYXkodCkpZm9yKGxldCBhPTA7YTx0Lmxlbmd0aDthKyspaWcodFthXSxlLG4sbyxpKTtlbHNle2NvbnN0IGE9Z2koKSxyPWZpKCk7bGV0IHM9b3AodCk/dDpaZSh0LnByb3ZpZGUpLGw9dHAodCk7Y29uc3QgYz1iaSgpLGQ9MTA0ODU3NSZjLnByb3ZpZGVySW5kZXhlcyxwPWMuZGlyZWN0aXZlU3RhcnQsbT1jLnByb3ZpZGVySW5kZXhlcz4+MjA7aWYob3AodCl8fCF0Lm11bHRpKXtjb25zdCBvPW5ldyBuYShsLGksU20pLHU9c2cocyxlLGk/ZDpkK20scCk7LTE9PT11PyhDYShoYShjLHIpLGEscyksYWcoYSx0LGUubGVuZ3RoKSxlLnB1c2gocyksYy5kaXJlY3RpdmVTdGFydCsrLGMuZGlyZWN0aXZlRW5kKyssaSYmKGMucHJvdmlkZXJJbmRleGVzKz0xMDQ4NTc2KSxuLnB1c2gobyksci5wdXNoKG8pKTooblt1XT1vLHJbdV09byl9ZWxzZXtjb25zdCB1PXNnKHMsZSxkK20scCksZj1zZyhzLGUsZCxkK20pLGc9dT49MCYmblt1XSxoPWY+PTAmJm5bZl07aWYoaSYmIWh8fCFpJiYhZyl7Q2EoaGEoYyxyKSxhLHMpO2NvbnN0IGQ9KGZ1bmN0aW9uIGEodCxlLG4sbyxpKXtjb25zdCBhPW5ldyBuYSh0LG4sU20pO3JldHVybiBhLm11bHRpPVtdLGEuaW5kZXg9ZSxhLmNvbXBvbmVudFByb3ZpZGVycz0wLHJnKGEsaSxvJiYhbiksYX0pKGk/Y2c6bGcsbi5sZW5ndGgsaSxvLGwpOyFpJiZoJiYobltmXS5wcm92aWRlckZhY3Rvcnk9ZCksYWcoYSx0LGUubGVuZ3RoLDApLGUucHVzaChzKSxjLmRpcmVjdGl2ZVN0YXJ0KyssYy5kaXJlY3RpdmVFbmQrKyxpJiYoYy5wcm92aWRlckluZGV4ZXMrPTEwNDg1NzYpLG4ucHVzaChkKSxyLnB1c2goZCl9ZWxzZSBhZyhhLHQsdT4tMT91OmYscmcobltpP2Y6dV0sbCwhaSYmbykpOyFpJiZvJiZoJiZuW2ZdLmNvbXBvbmVudFByb3ZpZGVycysrfX19ZnVuY3Rpb24gYWcodCxlLG4sbyl7Y29uc3QgaT1vcChlKTtpZihpfHwoZnVuY3Rpb24gYSh0KXtyZXR1cm4hIXQudXNlQ2xhc3N9KShlKSl7Y29uc3QgYT0oZS51c2VDbGFzc3x8ZSkucHJvdG90eXBlLm5nT25EZXN0cm95O2lmKGEpe2NvbnN0IHI9dC5kZXN0cm95SG9va3N8fCh0LmRlc3Ryb3lIb29rcz1bXSk7aWYoIWkmJmUubXVsdGkpe25nRGV2TW9kZSYmaG4obywiaW5kZXhJbkZhY3Rvcnkgd2hlbiByZWdpc3RlcmluZyBtdWx0aSBmYWN0b3J5IGRlc3Ryb3kgaG9vayIpO2NvbnN0IHQ9ci5pbmRleE9mKG4pOy0xPT09dD9yLnB1c2gobixbbyxhXSk6clt0KzFdLnB1c2gobyxhKX1lbHNlIHIucHVzaChuLGEpfX19ZnVuY3Rpb24gcmcodCxlLG4pe3JldHVybiBuJiZ0LmNvbXBvbmVudFByb3ZpZGVycysrLHQubXVsdGkucHVzaChlKS0xfWZ1bmN0aW9uIHNnKHQsZSxuLG8pe2ZvcihsZXQgaT1uO2k8bztpKyspaWYoZVtpXT09PXQpcmV0dXJuIGk7cmV0dXJuLTF9ZnVuY3Rpb24gbGcodCxlLG4sbyl7cmV0dXJuIGRnKHRoaXMubXVsdGksW10pfWZ1bmN0aW9uIGNnKHQsZSxuLG8pe2NvbnN0IGk9dGhpcy5tdWx0aTtsZXQgYTtpZih0aGlzLnByb3ZpZGVyRmFjdG9yeSl7Y29uc3QgdD10aGlzLnByb3ZpZGVyRmFjdG9yeS5jb21wb25lbnRQcm92aWRlcnMsZT1TYShuLG5bMV0sdGhpcy5wcm92aWRlckZhY3RvcnkuaW5kZXgsbyk7YT1lLnNsaWNlKDAsdCksZGcoaSxhKTtmb3IobGV0IG49dDtuPGUubGVuZ3RoO24rKylhLnB1c2goZVtuXSl9ZWxzZSBhPVtdLGRnKGksYSk7cmV0dXJuIGF9ZnVuY3Rpb24gZGcodCxlKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyllLnB1c2goKDAsdFtuXSkoKSk7cmV0dXJuIGV9ZnVuY3Rpb24gcGcodCxlPVtdKXtyZXR1cm4gbj0+e24ucHJvdmlkZXJzUmVzb2x2ZXI9KG4sbyk9PihmdW5jdGlvbiBpKHQsZSxuKXtjb25zdCBvPWdpKCk7aWYoby5maXJzdENyZWF0ZVBhc3Mpe2NvbnN0IGk9eG8odCk7aWcobixvLmRhdGEsby5ibHVlcHJpbnQsaSwhMCksaWcoZSxvLmRhdGEsby5ibHVlcHJpbnQsaSwhMSl9fSkobixvP28odCk6dCxlKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIG1ne30KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgdWd7fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KZnVuY3Rpb24gZmcoLi4udCl7fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBnZyh0LGUpe3JldHVybiBuZXcgaGcob2kodCxlKSl9dWcuTlVMTD1uZXcgY2xhc3N7cmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkodCl7dGhyb3coZnVuY3Rpb24gZSh0KXtjb25zdCBlPUVycm9yKGBObyBjb21wb25lbnQgZmFjdG9yeSBmb3VuZCBmb3IgJHtHZSh0KX0uIERpZCB5b3UgYWRkIGl0IHRvIEBOZ01vZHVsZS5lbnRyeUNvbXBvbmVudHM/YCk7cmV0dXJuIGUubmdDb21wb25lbnQ9dCxlfSkodCl9fTtjbGFzcyBoZ3tjb25zdHJ1Y3Rvcih0KXt0aGlzLm5hdGl2ZUVsZW1lbnQ9dH19ZnVuY3Rpb24gYmcodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBoZz90Lm5hdGl2ZUVsZW1lbnQ6dH0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovaGcuX19OR19FTEVNRU5UX0lEX189ZnVuY3Rpb24geWcoKXtyZXR1cm4gZ2coYmkoKSxmaSgpKX0sbmV3IEdhKCJSZW5kZXJlcjJJbnRlcmNlcHRvciIpO2NsYXNzIF9ne31jbGFzcyBDZ3t9Q2cuX19OR19FTEVNRU5UX0lEX189KCk9Pk1nKCk7Y29uc3QgTWc9ZnVuY3Rpb24gdmcoKXtjb25zdCB0PWZpKCksZT1yaShiaSgpLmluZGV4LHQpO3JldHVybihmdW5jdGlvbiBuKHQpe2NvbnN0IGU9dFsxMV07aWYobmdEZXZNb2RlJiYhJG8oZSkpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW5qZWN0IFJlbmRlcmVyMiB3aGVuIHRoZSBhcHBsaWNhdGlvbiB1c2VzIFJlbmRlcmVyMyEiKTtyZXR1cm4gZX0pKHlvKGUpP2U6dCl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLztjbGFzcyB4Z3t9eGcuybVwcm92PU1uKHt0b2tlbjp4Zyxwcm92aWRlZEluOiJyb290IixmYWN0b3J5OigpPT5udWxsfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBPZ3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmZ1bGw9dCx0aGlzLm1ham9yPXQuc3BsaXQoIi4iKVswXSx0aGlzLm1pbm9yPXQuc3BsaXQoIi4iKVsxXSx0aGlzLnBhdGNoPXQuc3BsaXQoIi4iKS5zbGljZSgyKS5qb2luKCIuIil9fWNvbnN0IFBnPW5ldyBPZygiMTIuMi4xIik7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIHdne2NvbnN0cnVjdG9yKCl7fXN1cHBvcnRzKHQpe3JldHVybiBOcCh0KX1jcmVhdGUodCl7cmV0dXJuIG5ldyBTZyh0KX19Y29uc3Qga2c9KHQsZSk9PmU7Y2xhc3MgU2d7Y29uc3RydWN0b3IodCl7dGhpcy5sZW5ndGg9MCx0aGlzLl9saW5rZWRSZWNvcmRzPW51bGwsdGhpcy5fdW5saW5rZWRSZWNvcmRzPW51bGwsdGhpcy5fcHJldmlvdXNJdEhlYWQ9bnVsbCx0aGlzLl9pdEhlYWQ9bnVsbCx0aGlzLl9pdFRhaWw9bnVsbCx0aGlzLl9hZGRpdGlvbnNIZWFkPW51bGwsdGhpcy5fYWRkaXRpb25zVGFpbD1udWxsLHRoaXMuX21vdmVzSGVhZD1udWxsLHRoaXMuX21vdmVzVGFpbD1udWxsLHRoaXMuX3JlbW92YWxzSGVhZD1udWxsLHRoaXMuX3JlbW92YWxzVGFpbD1udWxsLHRoaXMuX2lkZW50aXR5Q2hhbmdlc0hlYWQ9bnVsbCx0aGlzLl9pZGVudGl0eUNoYW5nZXNUYWlsPW51bGwsdGhpcy5fdHJhY2tCeUZuPXR8fGtnfWZvckVhY2hJdGVtKHQpe2xldCBlO2ZvcihlPXRoaXMuX2l0SGVhZDtudWxsIT09ZTtlPWUuX25leHQpdChlKX1mb3JFYWNoT3BlcmF0aW9uKHQpe2xldCBlPXRoaXMuX2l0SGVhZCxuPXRoaXMuX3JlbW92YWxzSGVhZCxvPTAsaT1udWxsO2Zvcig7ZXx8bjspe2NvbnN0IGE9IW58fGUmJmUuY3VycmVudEluZGV4PEFnKG4sbyxpKT9lOm4scj1BZyhhLG8saSkscz1hLmN1cnJlbnRJbmRleDtpZihhPT09bilvLS0sbj1uLl9uZXh0UmVtb3ZlZDtlbHNlIGlmKGU9ZS5fbmV4dCxudWxsPT1hLnByZXZpb3VzSW5kZXgpbysrO2Vsc2V7aXx8KGk9W10pO2NvbnN0IHQ9ci1vLGU9cy1vO2lmKHQhPWUpe2ZvcihsZXQgbj0wO248dDtuKyspe2NvbnN0IG89bjxpLmxlbmd0aD9pW25dOmlbbl09MCxhPW8rbjtlPD1hJiZhPHQmJihpW25dPW8rMSl9aVthLnByZXZpb3VzSW5kZXhdPWUtdH19ciE9PXMmJnQoYSxyLHMpfX1mb3JFYWNoUHJldmlvdXNJdGVtKHQpe2xldCBlO2ZvcihlPXRoaXMuX3ByZXZpb3VzSXRIZWFkO251bGwhPT1lO2U9ZS5fbmV4dFByZXZpb3VzKXQoZSl9Zm9yRWFjaEFkZGVkSXRlbSh0KXtsZXQgZTtmb3IoZT10aGlzLl9hZGRpdGlvbnNIZWFkO251bGwhPT1lO2U9ZS5fbmV4dEFkZGVkKXQoZSl9Zm9yRWFjaE1vdmVkSXRlbSh0KXtsZXQgZTtmb3IoZT10aGlzLl9tb3Zlc0hlYWQ7bnVsbCE9PWU7ZT1lLl9uZXh0TW92ZWQpdChlKX1mb3JFYWNoUmVtb3ZlZEl0ZW0odCl7bGV0IGU7Zm9yKGU9dGhpcy5fcmVtb3ZhbHNIZWFkO251bGwhPT1lO2U9ZS5fbmV4dFJlbW92ZWQpdChlKX1mb3JFYWNoSWRlbnRpdHlDaGFuZ2UodCl7bGV0IGU7Zm9yKGU9dGhpcy5faWRlbnRpdHlDaGFuZ2VzSGVhZDtudWxsIT09ZTtlPWUuX25leHRJZGVudGl0eUNoYW5nZSl0KGUpfWRpZmYodCl7aWYobnVsbD09dCYmKHQ9W10pLCFOcCh0KSl0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHRyeWluZyB0byBkaWZmICcke0dlKHQpfScuIE9ubHkgYXJyYXlzIGFuZCBpdGVyYWJsZXMgYXJlIGFsbG93ZWRgKTtyZXR1cm4gdGhpcy5jaGVjayh0KT90aGlzOm51bGx9b25EZXN0cm95KCl7fWNoZWNrKHQpe3RoaXMuX3Jlc2V0KCk7bGV0IGUsbixvLGk9dGhpcy5faXRIZWFkLGE9ITE7aWYoQXJyYXkuaXNBcnJheSh0KSl7dGhpcy5sZW5ndGg9dC5sZW5ndGg7Zm9yKGxldCBlPTA7ZTx0aGlzLmxlbmd0aDtlKyspbj10W2VdLG89dGhpcy5fdHJhY2tCeUZuKGUsbiksbnVsbCE9PWkmJk9iamVjdC5pcyhpLnRyYWNrQnlJZCxvKT8oYSYmKGk9dGhpcy5fdmVyaWZ5UmVpbnNlcnRpb24oaSxuLG8sZSkpLE9iamVjdC5pcyhpLml0ZW0sbil8fHRoaXMuX2FkZElkZW50aXR5Q2hhbmdlKGksbikpOihpPXRoaXMuX21pc21hdGNoKGksbixvLGUpLGE9ITApLGk9aS5fbmV4dH1lbHNlIGU9MCwoZnVuY3Rpb24gcih0LGUpe2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspZSh0W25dKTtlbHNle2NvbnN0IG49dFtScCgpXSgpO2xldCBvO2Zvcig7IShvPW4ubmV4dCgpKS5kb25lOyllKG8udmFsdWUpfX0pKHQsKHQ9PntvPXRoaXMuX3RyYWNrQnlGbihlLHQpLG51bGwhPT1pJiZPYmplY3QuaXMoaS50cmFja0J5SWQsbyk/KGEmJihpPXRoaXMuX3ZlcmlmeVJlaW5zZXJ0aW9uKGksdCxvLGUpKSxPYmplY3QuaXMoaS5pdGVtLHQpfHx0aGlzLl9hZGRJZGVudGl0eUNoYW5nZShpLHQpKTooaT10aGlzLl9taXNtYXRjaChpLHQsbyxlKSxhPSEwKSxpPWkuX25leHQsZSsrfSkpLHRoaXMubGVuZ3RoPWU7cmV0dXJuIHRoaXMuX3RydW5jYXRlKGkpLHRoaXMuY29sbGVjdGlvbj10LHRoaXMuaXNEaXJ0eX1nZXQgaXNEaXJ0eSgpe3JldHVybiBudWxsIT09dGhpcy5fYWRkaXRpb25zSGVhZHx8bnVsbCE9PXRoaXMuX21vdmVzSGVhZHx8bnVsbCE9PXRoaXMuX3JlbW92YWxzSGVhZHx8bnVsbCE9PXRoaXMuX2lkZW50aXR5Q2hhbmdlc0hlYWR9X3Jlc2V0KCl7aWYodGhpcy5pc0RpcnR5KXtsZXQgdDtmb3IodD10aGlzLl9wcmV2aW91c0l0SGVhZD10aGlzLl9pdEhlYWQ7bnVsbCE9PXQ7dD10Ll9uZXh0KXQuX25leHRQcmV2aW91cz10Ll9uZXh0O2Zvcih0PXRoaXMuX2FkZGl0aW9uc0hlYWQ7bnVsbCE9PXQ7dD10Ll9uZXh0QWRkZWQpdC5wcmV2aW91c0luZGV4PXQuY3VycmVudEluZGV4O2Zvcih0aGlzLl9hZGRpdGlvbnNIZWFkPXRoaXMuX2FkZGl0aW9uc1RhaWw9bnVsbCx0PXRoaXMuX21vdmVzSGVhZDtudWxsIT09dDt0PXQuX25leHRNb3ZlZCl0LnByZXZpb3VzSW5kZXg9dC5jdXJyZW50SW5kZXg7dGhpcy5fbW92ZXNIZWFkPXRoaXMuX21vdmVzVGFpbD1udWxsLHRoaXMuX3JlbW92YWxzSGVhZD10aGlzLl9yZW1vdmFsc1RhaWw9bnVsbCx0aGlzLl9pZGVudGl0eUNoYW5nZXNIZWFkPXRoaXMuX2lkZW50aXR5Q2hhbmdlc1RhaWw9bnVsbH19X21pc21hdGNoKHQsZSxuLG8pe2xldCBpO3JldHVybiBudWxsPT09dD9pPXRoaXMuX2l0VGFpbDooaT10Ll9wcmV2LHRoaXMuX3JlbW92ZSh0KSksbnVsbCE9PSh0PW51bGw9PT10aGlzLl91bmxpbmtlZFJlY29yZHM/bnVsbDp0aGlzLl91bmxpbmtlZFJlY29yZHMuZ2V0KG4sbnVsbCkpPyhPYmplY3QuaXModC5pdGVtLGUpfHx0aGlzLl9hZGRJZGVudGl0eUNoYW5nZSh0LGUpLHRoaXMuX3JlaW5zZXJ0QWZ0ZXIodCxpLG8pKTpudWxsIT09KHQ9bnVsbD09PXRoaXMuX2xpbmtlZFJlY29yZHM/bnVsbDp0aGlzLl9saW5rZWRSZWNvcmRzLmdldChuLG8pKT8oT2JqZWN0LmlzKHQuaXRlbSxlKXx8dGhpcy5fYWRkSWRlbnRpdHlDaGFuZ2UodCxlKSx0aGlzLl9tb3ZlQWZ0ZXIodCxpLG8pKTp0PXRoaXMuX2FkZEFmdGVyKG5ldyBEZyhlLG4pLGksbyksdH1fdmVyaWZ5UmVpbnNlcnRpb24odCxlLG4sbyl7bGV0IGk9bnVsbD09PXRoaXMuX3VubGlua2VkUmVjb3Jkcz9udWxsOnRoaXMuX3VubGlua2VkUmVjb3Jkcy5nZXQobixudWxsKTtyZXR1cm4gbnVsbCE9PWk/dD10aGlzLl9yZWluc2VydEFmdGVyKGksdC5fcHJldixvKTp0LmN1cnJlbnRJbmRleCE9byYmKHQuY3VycmVudEluZGV4PW8sdGhpcy5fYWRkVG9Nb3Zlcyh0LG8pKSx0fV90cnVuY2F0ZSh0KXtmb3IoO251bGwhPT10Oyl7Y29uc3QgZT10Ll9uZXh0O3RoaXMuX2FkZFRvUmVtb3ZhbHModGhpcy5fdW5saW5rKHQpKSx0PWV9bnVsbCE9PXRoaXMuX3VubGlua2VkUmVjb3JkcyYmdGhpcy5fdW5saW5rZWRSZWNvcmRzLmNsZWFyKCksbnVsbCE9PXRoaXMuX2FkZGl0aW9uc1RhaWwmJih0aGlzLl9hZGRpdGlvbnNUYWlsLl9uZXh0QWRkZWQ9bnVsbCksbnVsbCE9PXRoaXMuX21vdmVzVGFpbCYmKHRoaXMuX21vdmVzVGFpbC5fbmV4dE1vdmVkPW51bGwpLG51bGwhPT10aGlzLl9pdFRhaWwmJih0aGlzLl9pdFRhaWwuX25leHQ9bnVsbCksbnVsbCE9PXRoaXMuX3JlbW92YWxzVGFpbCYmKHRoaXMuX3JlbW92YWxzVGFpbC5fbmV4dFJlbW92ZWQ9bnVsbCksbnVsbCE9PXRoaXMuX2lkZW50aXR5Q2hhbmdlc1RhaWwmJih0aGlzLl9pZGVudGl0eUNoYW5nZXNUYWlsLl9uZXh0SWRlbnRpdHlDaGFuZ2U9bnVsbCl9X3JlaW5zZXJ0QWZ0ZXIodCxlLG4pe251bGwhPT10aGlzLl91bmxpbmtlZFJlY29yZHMmJnRoaXMuX3VubGlua2VkUmVjb3Jkcy5yZW1vdmUodCk7Y29uc3Qgbz10Ll9wcmV2UmVtb3ZlZCxpPXQuX25leHRSZW1vdmVkO3JldHVybiBudWxsPT09bz90aGlzLl9yZW1vdmFsc0hlYWQ9aTpvLl9uZXh0UmVtb3ZlZD1pLG51bGw9PT1pP3RoaXMuX3JlbW92YWxzVGFpbD1vOmkuX3ByZXZSZW1vdmVkPW8sdGhpcy5faW5zZXJ0QWZ0ZXIodCxlLG4pLHRoaXMuX2FkZFRvTW92ZXModCxuKSx0fV9tb3ZlQWZ0ZXIodCxlLG4pe3JldHVybiB0aGlzLl91bmxpbmsodCksdGhpcy5faW5zZXJ0QWZ0ZXIodCxlLG4pLHRoaXMuX2FkZFRvTW92ZXModCxuKSx0fV9hZGRBZnRlcih0LGUsbil7cmV0dXJuIHRoaXMuX2luc2VydEFmdGVyKHQsZSxuKSx0aGlzLl9hZGRpdGlvbnNUYWlsPW51bGw9PT10aGlzLl9hZGRpdGlvbnNUYWlsP3RoaXMuX2FkZGl0aW9uc0hlYWQ9dDp0aGlzLl9hZGRpdGlvbnNUYWlsLl9uZXh0QWRkZWQ9dCx0fV9pbnNlcnRBZnRlcih0LGUsbil7Y29uc3Qgbz1udWxsPT09ZT90aGlzLl9pdEhlYWQ6ZS5fbmV4dDtyZXR1cm4gdC5fbmV4dD1vLHQuX3ByZXY9ZSxudWxsPT09bz90aGlzLl9pdFRhaWw9dDpvLl9wcmV2PXQsbnVsbD09PWU/dGhpcy5faXRIZWFkPXQ6ZS5fbmV4dD10LG51bGw9PT10aGlzLl9saW5rZWRSZWNvcmRzJiYodGhpcy5fbGlua2VkUmVjb3Jkcz1uZXcgUmcpLHRoaXMuX2xpbmtlZFJlY29yZHMucHV0KHQpLHQuY3VycmVudEluZGV4PW4sdH1fcmVtb3ZlKHQpe3JldHVybiB0aGlzLl9hZGRUb1JlbW92YWxzKHRoaXMuX3VubGluayh0KSl9X3VubGluayh0KXtudWxsIT09dGhpcy5fbGlua2VkUmVjb3JkcyYmdGhpcy5fbGlua2VkUmVjb3Jkcy5yZW1vdmUodCk7Y29uc3QgZT10Ll9wcmV2LG49dC5fbmV4dDtyZXR1cm4gbnVsbD09PWU/dGhpcy5faXRIZWFkPW46ZS5fbmV4dD1uLG51bGw9PT1uP3RoaXMuX2l0VGFpbD1lOm4uX3ByZXY9ZSx0fV9hZGRUb01vdmVzKHQsZSl7cmV0dXJuIHQucHJldmlvdXNJbmRleD09PWV8fCh0aGlzLl9tb3Zlc1RhaWw9bnVsbD09PXRoaXMuX21vdmVzVGFpbD90aGlzLl9tb3Zlc0hlYWQ9dDp0aGlzLl9tb3Zlc1RhaWwuX25leHRNb3ZlZD10KSx0fV9hZGRUb1JlbW92YWxzKHQpe3JldHVybiBudWxsPT09dGhpcy5fdW5saW5rZWRSZWNvcmRzJiYodGhpcy5fdW5saW5rZWRSZWNvcmRzPW5ldyBSZyksdGhpcy5fdW5saW5rZWRSZWNvcmRzLnB1dCh0KSx0LmN1cnJlbnRJbmRleD1udWxsLHQuX25leHRSZW1vdmVkPW51bGwsbnVsbD09PXRoaXMuX3JlbW92YWxzVGFpbD8odGhpcy5fcmVtb3ZhbHNUYWlsPXRoaXMuX3JlbW92YWxzSGVhZD10LHQuX3ByZXZSZW1vdmVkPW51bGwpOih0Ll9wcmV2UmVtb3ZlZD10aGlzLl9yZW1vdmFsc1RhaWwsdGhpcy5fcmVtb3ZhbHNUYWlsPXRoaXMuX3JlbW92YWxzVGFpbC5fbmV4dFJlbW92ZWQ9dCksdH1fYWRkSWRlbnRpdHlDaGFuZ2UodCxlKXtyZXR1cm4gdC5pdGVtPWUsdGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbD1udWxsPT09dGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbD90aGlzLl9pZGVudGl0eUNoYW5nZXNIZWFkPXQ6dGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbC5fbmV4dElkZW50aXR5Q2hhbmdlPXQsdH19Y2xhc3MgRGd7Y29uc3RydWN0b3IodCxlKXt0aGlzLml0ZW09dCx0aGlzLnRyYWNrQnlJZD1lLHRoaXMuY3VycmVudEluZGV4PW51bGwsdGhpcy5wcmV2aW91c0luZGV4PW51bGwsdGhpcy5fbmV4dFByZXZpb3VzPW51bGwsdGhpcy5fcHJldj1udWxsLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wcmV2RHVwPW51bGwsdGhpcy5fbmV4dER1cD1udWxsLHRoaXMuX3ByZXZSZW1vdmVkPW51bGwsdGhpcy5fbmV4dFJlbW92ZWQ9bnVsbCx0aGlzLl9uZXh0QWRkZWQ9bnVsbCx0aGlzLl9uZXh0TW92ZWQ9bnVsbCx0aGlzLl9uZXh0SWRlbnRpdHlDaGFuZ2U9bnVsbH19Y2xhc3MgRWd7Y29uc3RydWN0b3IoKXt0aGlzLl9oZWFkPW51bGwsdGhpcy5fdGFpbD1udWxsfWFkZCh0KXtudWxsPT09dGhpcy5faGVhZD8odGhpcy5faGVhZD10aGlzLl90YWlsPXQsdC5fbmV4dER1cD1udWxsLHQuX3ByZXZEdXA9bnVsbCk6KHRoaXMuX3RhaWwuX25leHREdXA9dCx0Ll9wcmV2RHVwPXRoaXMuX3RhaWwsdC5fbmV4dER1cD1udWxsLHRoaXMuX3RhaWw9dCl9Z2V0KHQsZSl7bGV0IG47Zm9yKG49dGhpcy5faGVhZDtudWxsIT09bjtuPW4uX25leHREdXApaWYoKG51bGw9PT1lfHxlPD1uLmN1cnJlbnRJbmRleCkmJk9iamVjdC5pcyhuLnRyYWNrQnlJZCx0KSlyZXR1cm4gbjtyZXR1cm4gbnVsbH1yZW1vdmUodCl7Y29uc3QgZT10Ll9wcmV2RHVwLG49dC5fbmV4dER1cDtyZXR1cm4gbnVsbD09PWU/dGhpcy5faGVhZD1uOmUuX25leHREdXA9bixudWxsPT09bj90aGlzLl90YWlsPWU6bi5fcHJldkR1cD1lLG51bGw9PT10aGlzLl9oZWFkfX1jbGFzcyBSZ3tjb25zdHJ1Y3Rvcigpe3RoaXMubWFwPW5ldyBNYXB9cHV0KHQpe2NvbnN0IGU9dC50cmFja0J5SWQ7bGV0IG49dGhpcy5tYXAuZ2V0KGUpO258fChuPW5ldyBFZyx0aGlzLm1hcC5zZXQoZSxuKSksbi5hZGQodCl9Z2V0KHQsZSl7Y29uc3Qgbj10aGlzLm1hcC5nZXQodCk7cmV0dXJuIG4/bi5nZXQodCxlKTpudWxsfXJlbW92ZSh0KXtjb25zdCBlPXQudHJhY2tCeUlkO3JldHVybiB0aGlzLm1hcC5nZXQoZSkucmVtb3ZlKHQpJiZ0aGlzLm1hcC5kZWxldGUoZSksdH1nZXQgaXNFbXB0eSgpe3JldHVybiAwPT09dGhpcy5tYXAuc2l6ZX1jbGVhcigpe3RoaXMubWFwLmNsZWFyKCl9fWZ1bmN0aW9uIEFnKHQsZSxuKXtjb25zdCBvPXQucHJldmlvdXNJbmRleDtpZihudWxsPT09bylyZXR1cm4gbztsZXQgaT0wO3JldHVybiBuJiZvPG4ubGVuZ3RoJiYoaT1uW29dKSxvK2UraX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgVGd7Y29uc3RydWN0b3IoKXt9c3VwcG9ydHModCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBNYXB8fHpwKHQpfWNyZWF0ZSgpe3JldHVybiBuZXcgTmd9fWNsYXNzIE5ne2NvbnN0cnVjdG9yKCl7dGhpcy5fcmVjb3Jkcz1uZXcgTWFwLHRoaXMuX21hcEhlYWQ9bnVsbCx0aGlzLl9hcHBlbmRBZnRlcj1udWxsLHRoaXMuX3ByZXZpb3VzTWFwSGVhZD1udWxsLHRoaXMuX2NoYW5nZXNIZWFkPW51bGwsdGhpcy5fY2hhbmdlc1RhaWw9bnVsbCx0aGlzLl9hZGRpdGlvbnNIZWFkPW51bGwsdGhpcy5fYWRkaXRpb25zVGFpbD1udWxsLHRoaXMuX3JlbW92YWxzSGVhZD1udWxsLHRoaXMuX3JlbW92YWxzVGFpbD1udWxsfWdldCBpc0RpcnR5KCl7cmV0dXJuIG51bGwhPT10aGlzLl9hZGRpdGlvbnNIZWFkfHxudWxsIT09dGhpcy5fY2hhbmdlc0hlYWR8fG51bGwhPT10aGlzLl9yZW1vdmFsc0hlYWR9Zm9yRWFjaEl0ZW0odCl7bGV0IGU7Zm9yKGU9dGhpcy5fbWFwSGVhZDtudWxsIT09ZTtlPWUuX25leHQpdChlKX1mb3JFYWNoUHJldmlvdXNJdGVtKHQpe2xldCBlO2ZvcihlPXRoaXMuX3ByZXZpb3VzTWFwSGVhZDtudWxsIT09ZTtlPWUuX25leHRQcmV2aW91cyl0KGUpfWZvckVhY2hDaGFuZ2VkSXRlbSh0KXtsZXQgZTtmb3IoZT10aGlzLl9jaGFuZ2VzSGVhZDtudWxsIT09ZTtlPWUuX25leHRDaGFuZ2VkKXQoZSl9Zm9yRWFjaEFkZGVkSXRlbSh0KXtsZXQgZTtmb3IoZT10aGlzLl9hZGRpdGlvbnNIZWFkO251bGwhPT1lO2U9ZS5fbmV4dEFkZGVkKXQoZSl9Zm9yRWFjaFJlbW92ZWRJdGVtKHQpe2xldCBlO2ZvcihlPXRoaXMuX3JlbW92YWxzSGVhZDtudWxsIT09ZTtlPWUuX25leHRSZW1vdmVkKXQoZSl9ZGlmZih0KXtpZih0KXtpZighKHQgaW5zdGFuY2VvZiBNYXB8fHpwKHQpKSl0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHRyeWluZyB0byBkaWZmICcke0dlKHQpfScuIE9ubHkgbWFwcyBhbmQgb2JqZWN0cyBhcmUgYWxsb3dlZGApfWVsc2UgdD1uZXcgTWFwO3JldHVybiB0aGlzLmNoZWNrKHQpP3RoaXM6bnVsbH1vbkRlc3Ryb3koKXt9Y2hlY2sodCl7dGhpcy5fcmVzZXQoKTtsZXQgZT10aGlzLl9tYXBIZWFkO2lmKHRoaXMuX2FwcGVuZEFmdGVyPW51bGwsdGhpcy5fZm9yRWFjaCh0LCgodCxuKT0+e2lmKGUmJmUua2V5PT09bil0aGlzLl9tYXliZUFkZFRvQ2hhbmdlcyhlLHQpLHRoaXMuX2FwcGVuZEFmdGVyPWUsZT1lLl9uZXh0O2Vsc2V7Y29uc3Qgbz10aGlzLl9nZXRPckNyZWF0ZVJlY29yZEZvcktleShuLHQpO2U9dGhpcy5faW5zZXJ0QmVmb3JlT3JBcHBlbmQoZSxvKX19KSksZSl7ZS5fcHJldiYmKGUuX3ByZXYuX25leHQ9bnVsbCksdGhpcy5fcmVtb3ZhbHNIZWFkPWU7Zm9yKGxldCB0PWU7bnVsbCE9PXQ7dD10Ll9uZXh0UmVtb3ZlZCl0PT09dGhpcy5fbWFwSGVhZCYmKHRoaXMuX21hcEhlYWQ9bnVsbCksdGhpcy5fcmVjb3Jkcy5kZWxldGUodC5rZXkpLHQuX25leHRSZW1vdmVkPXQuX25leHQsdC5wcmV2aW91c1ZhbHVlPXQuY3VycmVudFZhbHVlLHQuY3VycmVudFZhbHVlPW51bGwsdC5fcHJldj1udWxsLHQuX25leHQ9bnVsbH1yZXR1cm4gdGhpcy5fY2hhbmdlc1RhaWwmJih0aGlzLl9jaGFuZ2VzVGFpbC5fbmV4dENoYW5nZWQ9bnVsbCksdGhpcy5fYWRkaXRpb25zVGFpbCYmKHRoaXMuX2FkZGl0aW9uc1RhaWwuX25leHRBZGRlZD1udWxsKSx0aGlzLmlzRGlydHl9X2luc2VydEJlZm9yZU9yQXBwZW5kKHQsZSl7aWYodCl7Y29uc3Qgbj10Ll9wcmV2O3JldHVybiBlLl9uZXh0PXQsZS5fcHJldj1uLHQuX3ByZXY9ZSxuJiYobi5fbmV4dD1lKSx0PT09dGhpcy5fbWFwSGVhZCYmKHRoaXMuX21hcEhlYWQ9ZSksdGhpcy5fYXBwZW5kQWZ0ZXI9dCx0fXJldHVybiB0aGlzLl9hcHBlbmRBZnRlcj8odGhpcy5fYXBwZW5kQWZ0ZXIuX25leHQ9ZSxlLl9wcmV2PXRoaXMuX2FwcGVuZEFmdGVyKTp0aGlzLl9tYXBIZWFkPWUsdGhpcy5fYXBwZW5kQWZ0ZXI9ZSxudWxsfV9nZXRPckNyZWF0ZVJlY29yZEZvcktleSh0LGUpe2lmKHRoaXMuX3JlY29yZHMuaGFzKHQpKXtjb25zdCBuPXRoaXMuX3JlY29yZHMuZ2V0KHQpO3RoaXMuX21heWJlQWRkVG9DaGFuZ2VzKG4sZSk7Y29uc3Qgbz1uLl9wcmV2LGk9bi5fbmV4dDtyZXR1cm4gbyYmKG8uX25leHQ9aSksaSYmKGkuX3ByZXY9byksbi5fbmV4dD1udWxsLG4uX3ByZXY9bnVsbCxufWNvbnN0IG49bmV3IHpnKHQpO3JldHVybiB0aGlzLl9yZWNvcmRzLnNldCh0LG4pLG4uY3VycmVudFZhbHVlPWUsdGhpcy5fYWRkVG9BZGRpdGlvbnMobiksbn1fcmVzZXQoKXtpZih0aGlzLmlzRGlydHkpe2xldCB0O2Zvcih0aGlzLl9wcmV2aW91c01hcEhlYWQ9dGhpcy5fbWFwSGVhZCx0PXRoaXMuX3ByZXZpb3VzTWFwSGVhZDtudWxsIT09dDt0PXQuX25leHQpdC5fbmV4dFByZXZpb3VzPXQuX25leHQ7Zm9yKHQ9dGhpcy5fY2hhbmdlc0hlYWQ7bnVsbCE9PXQ7dD10Ll9uZXh0Q2hhbmdlZCl0LnByZXZpb3VzVmFsdWU9dC5jdXJyZW50VmFsdWU7Zm9yKHQ9dGhpcy5fYWRkaXRpb25zSGVhZDtudWxsIT10O3Q9dC5fbmV4dEFkZGVkKXQucHJldmlvdXNWYWx1ZT10LmN1cnJlbnRWYWx1ZTt0aGlzLl9jaGFuZ2VzSGVhZD10aGlzLl9jaGFuZ2VzVGFpbD1udWxsLHRoaXMuX2FkZGl0aW9uc0hlYWQ9dGhpcy5fYWRkaXRpb25zVGFpbD1udWxsLHRoaXMuX3JlbW92YWxzSGVhZD1udWxsfX1fbWF5YmVBZGRUb0NoYW5nZXModCxlKXtPYmplY3QuaXMoZSx0LmN1cnJlbnRWYWx1ZSl8fCh0LnByZXZpb3VzVmFsdWU9dC5jdXJyZW50VmFsdWUsdC5jdXJyZW50VmFsdWU9ZSx0aGlzLl9hZGRUb0NoYW5nZXModCkpfV9hZGRUb0FkZGl0aW9ucyh0KXtudWxsPT09dGhpcy5fYWRkaXRpb25zSGVhZD90aGlzLl9hZGRpdGlvbnNIZWFkPXRoaXMuX2FkZGl0aW9uc1RhaWw9dDoodGhpcy5fYWRkaXRpb25zVGFpbC5fbmV4dEFkZGVkPXQsdGhpcy5fYWRkaXRpb25zVGFpbD10KX1fYWRkVG9DaGFuZ2VzKHQpe251bGw9PT10aGlzLl9jaGFuZ2VzSGVhZD90aGlzLl9jaGFuZ2VzSGVhZD10aGlzLl9jaGFuZ2VzVGFpbD10Oih0aGlzLl9jaGFuZ2VzVGFpbC5fbmV4dENoYW5nZWQ9dCx0aGlzLl9jaGFuZ2VzVGFpbD10KX1fZm9yRWFjaCh0LGUpe3QgaW5zdGFuY2VvZiBNYXA/dC5mb3JFYWNoKGUpOk9iamVjdC5rZXlzKHQpLmZvckVhY2goKG49PmUodFtuXSxuKSkpfX1jbGFzcyB6Z3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmtleT10LHRoaXMucHJldmlvdXNWYWx1ZT1udWxsLHRoaXMuY3VycmVudFZhbHVlPW51bGwsdGhpcy5fbmV4dFByZXZpb3VzPW51bGwsdGhpcy5fbmV4dD1udWxsLHRoaXMuX3ByZXY9bnVsbCx0aGlzLl9uZXh0QWRkZWQ9bnVsbCx0aGlzLl9uZXh0UmVtb3ZlZD1udWxsLHRoaXMuX25leHRDaGFuZ2VkPW51bGx9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBJZygpe3JldHVybiBuZXcgSGcoW25ldyB3Z10pfWNsYXNzIEhne2NvbnN0cnVjdG9yKHQpe3RoaXMuZmFjdG9yaWVzPXR9c3RhdGljIGNyZWF0ZSh0LGUpe2lmKG51bGwhPWUpe2NvbnN0IG49ZS5mYWN0b3JpZXMuc2xpY2UoKTt0PXQuY29uY2F0KG4pfXJldHVybiBuZXcgSGcodCl9c3RhdGljIGV4dGVuZCh0KXtyZXR1cm57cHJvdmlkZTpIZyx1c2VGYWN0b3J5OmU9PkhnLmNyZWF0ZSh0LGV8fElnKCkpLGRlcHM6W1tIZyxuZXcgRXIsbmV3IFNyXV19fWZpbmQodCl7Y29uc3QgZT10aGlzLmZhY3Rvcmllcy5maW5kKChlPT5lLnN1cHBvcnRzKHQpKSk7aWYobnVsbCE9ZSlyZXR1cm4gZTt0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIGEgZGlmZmVyIHN1cHBvcnRpbmcgb2JqZWN0ICcke3R9JyBvZiB0eXBlICckeyhmdW5jdGlvbiBuKHQpe3JldHVybiB0Lm5hbWV8fHR5cGVvZiB0fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8pKHQpfSdgKX19ZnVuY3Rpb24gRmcoKXtyZXR1cm4gbmV3IExnKFtuZXcgVGddKX1IZy7JtXByb3Y9TW4oe3Rva2VuOkhnLHByb3ZpZGVkSW46InJvb3QiLGZhY3Rvcnk6SWd9KTtjbGFzcyBMZ3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmZhY3Rvcmllcz10fXN0YXRpYyBjcmVhdGUodCxlKXtpZihlKXtjb25zdCBuPWUuZmFjdG9yaWVzLnNsaWNlKCk7dD10LmNvbmNhdChuKX1yZXR1cm4gbmV3IExnKHQpfXN0YXRpYyBleHRlbmQodCl7cmV0dXJue3Byb3ZpZGU6TGcsdXNlRmFjdG9yeTplPT5MZy5jcmVhdGUodCxlfHxGZygpKSxkZXBzOltbTGcsbmV3IEVyLG5ldyBTcl1dfX1maW5kKHQpe2NvbnN0IGU9dGhpcy5mYWN0b3JpZXMuZmluZCgoZT0+ZS5zdXBwb3J0cyh0KSkpO2lmKGUpcmV0dXJuIGU7dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBhIGRpZmZlciBzdXBwb3J0aW5nIG9iamVjdCAnJHt0fSdgKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBCZyh0LGUsbixvLGk9ITEpe2Zvcig7bnVsbCE9PW47KXtuZ0Rldk1vZGUmJmlhKG4sNjMpO2NvbnN0IGE9ZVtuLmluZGV4XTtpZihudWxsIT09YSYmby5wdXNoKGVpKGEpKSxfbyhhKSlmb3IobGV0IHQ9Ym87dDxhLmxlbmd0aDt0Kyspe2NvbnN0IGU9YVt0XSxuPWVbMV0uZmlyc3RDaGlsZDtudWxsIT09biYmQmcoZVsxXSxlLG4sbyl9Y29uc3Qgcj1uLnR5cGU7aWYoOCZyKUJnKHQsZSxuLmNoaWxkLG8pO2Vsc2UgaWYoMzImcil7Y29uc3QgdD1wbChuLGUpO2xldCBpO2Zvcig7aT10KCk7KW8ucHVzaChpKX1lbHNlIGlmKDE2JnIpe2NvbnN0IHQ9TGwoZSxuKTtpZihBcnJheS5pc0FycmF5KHQpKW8ucHVzaCguLi50KTtlbHNle2NvbnN0IG49bWwoZVsxNl0pO25nRGV2TW9kZSYmSW8obiksQmcoblsxXSxuLHQsbywhMCl9fW49aT9uLnByb2plY3Rpb25OZXh0Om4ubmV4dH1yZXR1cm4gb30KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovTGcuybVwcm92PU1uKHt0b2tlbjpMZyxwcm92aWRlZEluOiJyb290IixmYWN0b3J5OkZnfSk7Y2xhc3MgVmd7Y29uc3RydWN0b3IodCxlKXt0aGlzLl9sVmlldz10LHRoaXMuX2NkUmVmSW5qZWN0aW5nVmlldz1lLHRoaXMuX2FwcFJlZj1udWxsLHRoaXMuX2F0dGFjaGVkVG9WaWV3Q29udGFpbmVyPSExfWdldCByb290Tm9kZXMoKXtjb25zdCB0PXRoaXMuX2xWaWV3LGU9dFsxXTtyZXR1cm4gQmcoZSx0LGUuZmlyc3RDaGlsZCxbXSl9Z2V0IGNvbnRleHQoKXtyZXR1cm4gdGhpcy5fbFZpZXdbOF19c2V0IGNvbnRleHQodCl7dGhpcy5fbFZpZXdbOF09dH1nZXQgZGVzdHJveWVkKCl7cmV0dXJuIDI1Nj09KDI1NiZ0aGlzLl9sVmlld1syXSl9ZGVzdHJveSgpe2lmKHRoaXMuX2FwcFJlZil0aGlzLl9hcHBSZWYuZGV0YWNoVmlldyh0aGlzKTtlbHNlIGlmKHRoaXMuX2F0dGFjaGVkVG9WaWV3Q29udGFpbmVyKXtjb25zdCB0PXRoaXMuX2xWaWV3WzNdO2lmKF9vKHQpKXtjb25zdCBlPXRbOF0sbj1lP2UuaW5kZXhPZih0aGlzKTotMTtuPi0xJiYobmdEZXZNb2RlJiZsbihuLHQuaW5kZXhPZih0aGlzLl9sVmlldyktYm8sIkFuIGF0dGFjaGVkIHZpZXcgc2hvdWxkIGJlIGluIHRoZSBzYW1lIHBvc2l0aW9uIHdpdGhpbiBpdHMgY29udGFpbmVyIGFzIGl0cyBWaWV3UmVmIGluIHRoZSBWSUVXX1JFRlMgYXJyYXkuIikseGwodCxuKSxvcihlLG4pKX10aGlzLl9hdHRhY2hlZFRvVmlld0NvbnRhaW5lcj0hMX1PbCh0aGlzLl9sVmlld1sxXSx0aGlzLl9sVmlldyl9b25EZXN0cm95KHQpe3JkKHRoaXMuX2xWaWV3WzFdLHRoaXMuX2xWaWV3LG51bGwsdCl9bWFya0ZvckNoZWNrKCl7RWQodGhpcy5fY2RSZWZJbmplY3RpbmdWaWV3fHx0aGlzLl9sVmlldyl9ZGV0YWNoKCl7dGhpcy5fbFZpZXdbMl0mPS0xMjl9cmVhdHRhY2goKXt0aGlzLl9sVmlld1syXXw9MTI4fWRldGVjdENoYW5nZXMoKXtBZCh0aGlzLl9sVmlld1sxXSx0aGlzLl9sVmlldyx0aGlzLmNvbnRleHQpfWNoZWNrTm9DaGFuZ2VzKCl7IShmdW5jdGlvbiB0KGUsbixvKXtPaSghMCk7dHJ5e0FkKGUsbixvKX1maW5hbGx5e09pKCExKX19KSh0aGlzLl9sVmlld1sxXSx0aGlzLl9sVmlldyx0aGlzLmNvbnRleHQpfWF0dGFjaFRvVmlld0NvbnRhaW5lclJlZigpe2lmKHRoaXMuX2FwcFJlZil0aHJvdyBuZXcgRXJyb3IoIlRoaXMgdmlldyBpcyBhbHJlYWR5IGF0dGFjaGVkIGRpcmVjdGx5IHRvIHRoZSBBcHBsaWNhdGlvblJlZiEiKTt0aGlzLl9hdHRhY2hlZFRvVmlld0NvbnRhaW5lcj0hMH1kZXRhY2hGcm9tQXBwUmVmKCl7dGhpcy5fYXBwUmVmPW51bGwsKGZ1bmN0aW9uIHQoZSxuKXtVbChlLG4sblsxMV0sMixudWxsLG51bGwpfSkodGhpcy5fbFZpZXdbMV0sdGhpcy5fbFZpZXcpfWF0dGFjaFRvQXBwUmVmKHQpe2lmKHRoaXMuX2F0dGFjaGVkVG9WaWV3Q29udGFpbmVyKXRocm93IG5ldyBFcnJvcigiVGhpcyB2aWV3IGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gYSBWaWV3Q29udGFpbmVyISIpO3RoaXMuX2FwcFJlZj10fX1jbGFzcyBqZyBleHRlbmRzIFZne2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuX3ZpZXc9dH1kZXRlY3RDaGFuZ2VzKCl7VGQodGhpcy5fdmlldyl9Y2hlY2tOb0NoYW5nZXMoKXshKGZ1bmN0aW9uIHQoZSl7T2koITApO3RyeXtUZChlKX1maW5hbGx5e09pKCExKX19KSh0aGlzLl92aWV3KX1nZXQgY29udGV4dCgpe3JldHVybiBudWxsfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgVWd7fVVnLl9fTkdfRUxFTUVOVF9JRF9fPWZ1bmN0aW9uIEdnKHQpe3JldHVybihmdW5jdGlvbiBlKHQsbixvKXtpZihNbyh0KSYmIW8pe2NvbnN0IGU9cmkodC5pbmRleCxuKTtyZXR1cm4gbmV3IFZnKGUsZSl9cmV0dXJuIDQ3JnQudHlwZT9uZXcgVmcoblsxNl0sbik6bnVsbH0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKShiaSgpLGZpKCksMTY9PSgxNiZ0KSl9O2NvbnN0IFdnPVtuZXcgVGddLFlnPVtuZXcgd2ddLHFnPW5ldyBIZyhZZyksWmc9bmV3IExnKFdnKTtjbGFzcyBYZ3t9WGcuX19OR19FTEVNRU5UX0lEX189ZnVuY3Rpb24gS2coKXtyZXR1cm4gJGcoYmkoKSxmaSgpKX07Y29uc3QgSmc9WGcsUWc9Y2xhc3MgZXh0ZW5kcyBKZ3tjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIoKSx0aGlzLl9kZWNsYXJhdGlvbkxWaWV3PXQsdGhpcy5fZGVjbGFyYXRpb25UQ29udGFpbmVyPWUsdGhpcy5lbGVtZW50UmVmPW59Y3JlYXRlRW1iZWRkZWRWaWV3KHQpe2NvbnN0IGU9dGhpcy5fZGVjbGFyYXRpb25UQ29udGFpbmVyLnRWaWV3cyxuPXFjKHRoaXMuX2RlY2xhcmF0aW9uTFZpZXcsZSx0LDE2LG51bGwsZS5kZWNsVE5vZGUsbnVsbCxudWxsLG51bGwsbnVsbCksbz10aGlzLl9kZWNsYXJhdGlvbkxWaWV3W3RoaXMuX2RlY2xhcmF0aW9uVENvbnRhaW5lci5pbmRleF07bmdEZXZNb2RlJiZEbyhvKSxuWzE3XT1vO2NvbnN0IGk9dGhpcy5fZGVjbGFyYXRpb25MVmlld1sxOV07cmV0dXJuIG51bGwhPT1pJiYoblsxOV09aS5jcmVhdGVFbWJlZGRlZFZpZXcoZSkpLEpjKGUsbix0KSxuZXcgVmcobil9fTtmdW5jdGlvbiAkZyh0LGUpe3JldHVybiA0JnQudHlwZT8obmdEZXZNb2RlJiZobih0LnRWaWV3cywiVFZpZXcgbXVzdCBiZSBhbGxvY2F0ZWQiKSxuZXcgUWcoZSx0LGdnKHQsZSkpKTpudWxsfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyB0aHt9Y2xhc3MgZWh7fWVoLl9fTkdfRUxFTUVOVF9JRF9fPWZ1bmN0aW9uIG5oKCl7cmV0dXJuIHNoKGJpKCksZmkoKSl9O2NvbnN0IG9oPWVoLGloPWNsYXNzIGV4dGVuZHMgb2h7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKCksdGhpcy5fbENvbnRhaW5lcj10LHRoaXMuX2hvc3RUTm9kZT1lLHRoaXMuX2hvc3RMVmlldz1ufWdldCBlbGVtZW50KCl7cmV0dXJuIGdnKHRoaXMuX2hvc3RUTm9kZSx0aGlzLl9ob3N0TFZpZXcpfWdldCBpbmplY3Rvcigpe3JldHVybiBuZXcgUmEodGhpcy5faG9zdFROb2RlLHRoaXMuX2hvc3RMVmlldyl9Z2V0IHBhcmVudEluamVjdG9yKCl7Y29uc3QgdD1fYSh0aGlzLl9ob3N0VE5vZGUsdGhpcy5faG9zdExWaWV3KTtpZihkYSh0KSl7Y29uc3QgZT1tYSh0LHRoaXMuX2hvc3RMVmlldyksbj1wYSh0KTtyZXR1cm4gbmdEZXZNb2RlJiZIbyhlLG4pLG5ldyBSYShlWzFdLmRhdGFbbis4XSxlKX1yZXR1cm4gbmV3IFJhKG51bGwsdGhpcy5faG9zdExWaWV3KX1jbGVhcigpe2Zvcig7dGhpcy5sZW5ndGg+MDspdGhpcy5yZW1vdmUodGhpcy5sZW5ndGgtMSl9Z2V0KHQpe2NvbnN0IGU9YWgodGhpcy5fbENvbnRhaW5lcik7cmV0dXJuIG51bGwhPT1lJiZlW3RdfHxudWxsfWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5fbENvbnRhaW5lci5sZW5ndGgtYm99Y3JlYXRlRW1iZWRkZWRWaWV3KHQsZSxuKXtjb25zdCBvPXQuY3JlYXRlRW1iZWRkZWRWaWV3KGV8fHt9KTtyZXR1cm4gdGhpcy5pbnNlcnQobyxuKSxvfWNyZWF0ZUNvbXBvbmVudCh0LGUsbixvLGkpe2NvbnN0IGE9bnx8dGhpcy5wYXJlbnRJbmplY3RvcjtpZighaSYmbnVsbD09dC5uZ01vZHVsZSYmYSl7Y29uc3QgdD1hLmdldCh0aCxudWxsKTt0JiYoaT10KX1jb25zdCByPXQuY3JlYXRlKGEsbyx2b2lkIDAsaSk7cmV0dXJuIHRoaXMuaW5zZXJ0KHIuaG9zdFZpZXcsZSkscn1pbnNlcnQodCxlKXtjb25zdCBuPXQuX2xWaWV3LG89blsxXTtpZihuZ0Rldk1vZGUmJnQuZGVzdHJveWVkKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGluc2VydCBhIGRlc3Ryb3llZCBWaWV3IGluIGEgVmlld0NvbnRhaW5lciEiKTtpZigoZnVuY3Rpb24gaSh0KXtyZXR1cm4gX28odFszXSl9KShuKSl7Y29uc3QgZT10aGlzLmluZGV4T2YodCk7aWYoLTEhPT1lKXRoaXMuZGV0YWNoKGUpO2Vsc2V7Y29uc3QgZT1uWzNdO25nRGV2TW9kZSYmbG4oX28oZSksITAsIkFuIGF0dGFjaGVkIHZpZXcgc2hvdWxkIGhhdmUgaXRzIFBBUkVOVCBwb2ludCB0byBhIGNvbnRhaW5lci4iKTtjb25zdCBvPW5ldyBpaChlLGVbNl0sZVszXSk7by5kZXRhY2goby5pbmRleE9mKHQpKX19Y29uc3QgYT10aGlzLl9hZGp1c3RJbmRleChlKSxyPXRoaXMuX2xDb250YWluZXI7IShmdW5jdGlvbiBzKHQsZSxuLG8pe25nRGV2TW9kZSYmUm8oZSksbmdEZXZNb2RlJiZEbyhuKTtjb25zdCBpPWJvK28sYT1uLmxlbmd0aDtvPjAmJihuW2ktMV1bNF09ZSksbzxhLWJvPyhlWzRdPW5baV0sbnIobixibytvLGUpKToobi5wdXNoKGUpLGVbNF09bnVsbCksZVszXT1uO2NvbnN0IHI9ZVsxN107bnVsbCE9PXImJm4hPT1yJiYoZnVuY3Rpb24gcyh0LGUpe25nRGV2TW9kZSYmaG4oZSwiTFZpZXcgcmVxdWlyZWQiKSxuZ0Rldk1vZGUmJkRvKHQpO2NvbnN0IG49dFs5XSxvPWVbM107bmdEZXZNb2RlJiZEbyhvKTtjb25zdCBpPW9bM11bMTZdO25nRGV2TW9kZSYmaG4oaSwiTWlzc2luZyBpbnNlcnRlZENvbXBvbmVudExWaWV3Iik7Y29uc3QgYT1lWzE2XTtuZ0Rldk1vZGUmJmhuKGEsIk1pc3NpbmcgZGVjbGFyZWRDb21wb25lbnRMVmlldyIpLGEhPT1pJiYodFsyXT0hMCksbnVsbD09PW4/dFs5XT1bZV06bi5wdXNoKGUpfSkocixlKTtjb25zdCBsPWVbMTldO251bGwhPT1sJiZsLmluc2VydFZpZXcodCksZVsyXXw9MTI4fSkobyxuLHIsYSk7Y29uc3QgbD1CbChhLHIpLGM9blsxMV0sZD1SbChjLHJbN10pO3JldHVybiBudWxsIT09ZCYmKGZ1bmN0aW9uIHAodCxlLG4sbyxpLGEpe29bMF09aSxvWzZdPWUsVWwodCxvLG4sMSxpLGEpfSkobyxyWzZdLGMsbixkLGwpLHQuYXR0YWNoVG9WaWV3Q29udGFpbmVyUmVmKCksbnIocmgociksYSx0KSx0fW1vdmUodCxlKXtpZihuZ0Rldk1vZGUmJnQuZGVzdHJveWVkKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IG1vdmUgYSBkZXN0cm95ZWQgVmlldyBpbiBhIFZpZXdDb250YWluZXIhIik7cmV0dXJuIHRoaXMuaW5zZXJ0KHQsZSl9aW5kZXhPZih0KXtjb25zdCBlPWFoKHRoaXMuX2xDb250YWluZXIpO3JldHVybiBudWxsIT09ZT9lLmluZGV4T2YodCk6LTF9cmVtb3ZlKHQpe2NvbnN0IGU9dGhpcy5fYWRqdXN0SW5kZXgodCwtMSksbj14bCh0aGlzLl9sQ29udGFpbmVyLGUpO24mJihvcihyaCh0aGlzLl9sQ29udGFpbmVyKSxlKSxPbChuWzFdLG4pKX1kZXRhY2godCl7Y29uc3QgZT10aGlzLl9hZGp1c3RJbmRleCh0LC0xKSxuPXhsKHRoaXMuX2xDb250YWluZXIsZSk7cmV0dXJuIG4mJm51bGwhPW9yKHJoKHRoaXMuX2xDb250YWluZXIpLGUpP25ldyBWZyhuKTpudWxsfV9hZGp1c3RJbmRleCh0LGU9MCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5sZW5ndGgrZToobmdEZXZNb2RlJiYoZm4odCwtMSxgVmlld1JlZiBpbmRleCBtdXN0IGJlIHBvc2l0aXZlLCBnb3QgJHt0fWApLG1uKHQsdGhpcy5sZW5ndGgrMStlLCJpbmRleCIpKSx0KX19O2Z1bmN0aW9uIGFoKHQpe3JldHVybiB0WzhdfWZ1bmN0aW9uIHJoKHQpe3JldHVybiB0WzhdfHwodFs4XT1bXSl9ZnVuY3Rpb24gc2godCxlKXtsZXQgbjtuZ0Rldk1vZGUmJmlhKHQsMTUpO2NvbnN0IG89ZVt0LmluZGV4XTtpZihfbyhvKSluPW87ZWxzZXtsZXQgaTtpZig4JnQudHlwZSlpPWVpKG8pO2Vsc2V7Y29uc3Qgbj1lWzExXTtuZ0Rldk1vZGUmJm5nRGV2TW9kZS5yZW5kZXJlckNyZWF0ZUNvbW1lbnQrKyxpPW4uY3JlYXRlQ29tbWVudChuZ0Rldk1vZGU/ImNvbnRhaW5lciI6IiIpO2NvbnN0IG89b2kodCxlKTtTbChuLFJsKG4sbyksaSwoZnVuY3Rpb24gaSh0LGUpe3JldHVybiAkbyh0KT90Lm5leHRTaWJsaW5nKGUpOmUubmV4dFNpYmxpbmd9KShuLG8pLCExKX1lW3QuaW5kZXhdPW49UGQobyxlLGksdCksRGQoZSxuKX1yZXR1cm4gbmV3IGloKG4sdCxlKX1jb25zdCBsaD1uZXcgTWFwO2Z1bmN0aW9uIGNoKHQpe2xldCBlPWxoLmdldCh0KTtyZXR1cm4gZXx8KGU9R2UodCkrIl8iK2xoLnNpemUsbGguc2V0KHQsZSkpLGV9Y2gocnApLGNoKEdkKSxjaCh0aCksCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjaChDZyksY2goaGcpLGNoKGVoKSxjaChYZyksY2goVWcpLGNoKHJwKSxjaChHZCk7Y29uc3QgZGg9e307Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIHBoIGV4dGVuZHMgdWd7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLm5nTW9kdWxlPXR9cmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkodCl7bmdEZXZNb2RlJiYoZnVuY3Rpb24gZSh0LG49IlR5cGUgcGFzc2VkIGluIGlzIG5vdCBDb21wb25lbnRUeXBlLCBpdCBkb2VzIG5vdCBoYXZlICfJtWNtcCcgcHJvcGVydHkuIil7cG8odCl8fGJuKG4pfSkodCk7Y29uc3Qgbj1wbyh0KTtyZXR1cm4gbmV3IGZoKG4sdGhpcy5uZ01vZHVsZSl9fWZ1bmN0aW9uIG1oKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmZS5wdXNoKHtwcm9wTmFtZTp0W25dLHRlbXBsYXRlTmFtZTpufSk7cmV0dXJuIGV9Y29uc3QgdWg9bmV3IEdhKCJTQ0hFRFVMRVJfVE9LRU4iLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OigpPT5ubH0pO2NsYXNzIGZoIGV4dGVuZHMgbWd7Y29uc3RydWN0b3IodCxlKXtzdXBlcigpLHRoaXMuY29tcG9uZW50RGVmPXQsdGhpcy5uZ01vZHVsZT1lLHRoaXMuY29tcG9uZW50VHlwZT10LnR5cGUsdGhpcy5zZWxlY3Rvcj0oZnVuY3Rpb24gbih0KXtyZXR1cm4gdC5tYXAoaWMpLmpvaW4oIiwiKX0pKHQuc2VsZWN0b3JzKSx0aGlzLm5nQ29udGVudFNlbGVjdG9ycz10Lm5nQ29udGVudFNlbGVjdG9ycz90Lm5nQ29udGVudFNlbGVjdG9yczpbXSx0aGlzLmlzQm91bmRUb01vZHVsZT0hIWV9Z2V0IGlucHV0cygpe3JldHVybiBtaCh0aGlzLmNvbXBvbmVudERlZi5pbnB1dHMpfWdldCBvdXRwdXRzKCl7cmV0dXJuIG1oKHRoaXMuY29tcG9uZW50RGVmLm91dHB1dHMpfWNyZWF0ZSh0LGUsbixvKXtjb25zdCBpPShvPW98fHRoaXMubmdNb2R1bGUpPyhmdW5jdGlvbiBhKHQsZSl7cmV0dXJue2dldDoobixvLGkpPT57Y29uc3QgYT10LmdldChuLGRoLGkpO3JldHVybiBhIT09ZGh8fG89PT1kaD9hOmUuZ2V0KG4sbyxpKX19fSkodCxvLmluamVjdG9yKTp0LHI9aS5nZXQoX2csdGkpLHM9aS5nZXQoeGcsbnVsbCksbD1yLmNyZWF0ZVJlbmRlcmVyKG51bGwsdGhpcy5jb21wb25lbnREZWYpLGM9dGhpcy5jb21wb25lbnREZWYuc2VsZWN0b3JzWzBdWzBdfHwiZGl2IixkPW4/KGZ1bmN0aW9uIHAodCxlLG4pe2lmKCRvKHQpKXJldHVybiB0LnNlbGVjdFJvb3RFbGVtZW50KGUsbj09PUhuLlNoYWRvd0RvbSk7bGV0IG89InN0cmluZyI9PXR5cGVvZiBlP3QucXVlcnlTZWxlY3RvcihlKTplO3JldHVybiBuZ0Rldk1vZGUmJihmdW5jdGlvbiBpKHQsZSl7aWYoIXQpdGhyb3coZnVuY3Rpb24gbih0LGUpe3JldHVybiBuZXcgRXJyb3IoYFJlbmRlcmVyOiAke3R9IFske3RuKGUpfV1gKX0pKCJzdHJpbmciPT10eXBlb2YgZT8iSG9zdCBub2RlIHdpdGggc2VsZWN0b3Igbm90IGZvdW5kOiI6Ikhvc3Qgbm9kZSBpcyByZXF1aXJlZDoiLGUpfSkobyxlKSxvLnRleHRDb250ZW50PSIiLG99KShsLG4sdGhpcy5jb21wb25lbnREZWYuZW5jYXBzdWxhdGlvbik6TWwoci5jcmVhdGVSZW5kZXJlcihudWxsLHRoaXMuY29tcG9uZW50RGVmKSxjLChmdW5jdGlvbiBtKHQpe2NvbnN0IGU9dC50b0xvd2VyQ2FzZSgpO3JldHVybiJzdmciPT09ZT9abzoibWF0aCI9PT1lP1hvOm51bGx9KShjKSksdT10aGlzLmNvbXBvbmVudERlZi5vblB1c2g/NTc2OjUyOCxmPShmdW5jdGlvbiBnKHQsZSl7cmV0dXJue2NvbXBvbmVudHM6W10sc2NoZWR1bGVyOnR8fG5sLGNsZWFuOklkLHBsYXllckhhbmRsZXI6ZXx8bnVsbCxmbGFnczowfX0pKCksaD1hZCgwLG51bGwsbnVsbCwxLDAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSxiPXFjKG51bGwsaCxmLHUsbnVsbCxudWxsLHIsbCxzLGkpO2xldCB5LF87RmkoYik7dHJ5e2NvbnN0IHQ9KGZ1bmN0aW9uIG8odCxlLG4saSxhLHIpe2NvbnN0IHM9blsxXTtuZ0Rldk1vZGUmJl9uKG4sMjApLG5bMjBdPXQ7Y29uc3QgbD1aYyhzLDIwLDIsIiNob3N0IixudWxsKSxjPWwubWVyZ2VkQXR0cnM9ZS5ob3N0QXR0cnM7bnVsbCE9PWMmJihVZChsLGMsITApLG51bGwhPT10JiYoYWEoYSx0LGMpLG51bGwhPT1sLmNsYXNzZXMmJllsKGEsdCxsLmNsYXNzZXMpLG51bGwhPT1sLnN0eWxlcyYmV2woYSx0LGwuc3R5bGVzKSkpO2NvbnN0IGQ9aS5jcmVhdGVSZW5kZXJlcih0LGUpLHA9cWMobixpZChlKSxudWxsLGUub25QdXNoPzY0OjE2LG5bMjBdLGwsaSxkLHJ8fG51bGwsbnVsbCk7cmV0dXJuIHMuZmlyc3RDcmVhdGVQYXNzJiYoQ2EoaGEobCxuKSxzLGUudHlwZSksZ2QocyxsKSxiZChsLG4ubGVuZ3RoLDEpKSxEZChuLHApLG5bMjBdPXB9KShkLHRoaXMuY29tcG9uZW50RGVmLGIscixsKTtpZihkKWlmKG4pYWEobCxkLFsibmctdmVyc2lvbiIsUGcuZnVsbF0pO2Vsc2V7Y29uc3R7YXR0cnM6dCxjbGFzc2VzOmV9PShmdW5jdGlvbiBuKHQpe2NvbnN0IGU9W10sbj1bXTtsZXQgbz0xLGk9Mjtmb3IoO288dC5sZW5ndGg7KXtsZXQgYT10W29dO2lmKCJzdHJpbmciPT10eXBlb2YgYSkyPT09aT8iIiE9PWEmJmUucHVzaChhLHRbKytvXSk6OD09PWkmJm4ucHVzaChhKTtlbHNle2lmKCEkbChpKSlicmVhaztpPWF9bysrfXJldHVybnthdHRyczplLGNsYXNzZXM6bn19KSh0aGlzLmNvbXBvbmVudERlZi5zZWxlY3RvcnNbMF0pO3QmJmFhKGwsZCx0KSxlJiZlLmxlbmd0aD4wJiZZbChsLGQsZS5qb2luKCIgIikpfWlmKF89aWkoaCxnbyksdm9pZCAwIT09ZSl7Y29uc3QgdD1fLnByb2plY3Rpb249W107Zm9yKGxldCBuPTA7bjx0aGlzLm5nQ29udGVudFNlbGVjdG9ycy5sZW5ndGg7bisrKXtjb25zdCBvPWVbbl07dC5wdXNoKG51bGwhPW8/QXJyYXkuZnJvbShvKTpudWxsKX19eT0oZnVuY3Rpb24gaSh0LGUsbixvLGEpe2NvbnN0IHI9blsxXSxzPShmdW5jdGlvbiBsKHQsZSxuKXtjb25zdCBvPWJpKCk7aWYodC5maXJzdENyZWF0ZVBhc3Mpe24ucHJvdmlkZXJzUmVzb2x2ZXImJm4ucHJvdmlkZXJzUmVzb2x2ZXIobik7Y29uc3QgaT1LYyh0LGUsMSxudWxsKTtuZ0Rldk1vZGUmJmxuKGksby5kaXJlY3RpdmVTdGFydCwiQmVjYXVzZSB0aGlzIGlzIGEgcm9vdCBjb21wb25lbnQgdGhlIGFsbG9jYXRlZCBleHBhbmRvIHNob3VsZCBtYXRjaCB0aGUgVE5vZGUgY29tcG9uZW50LiIpLHlkKHQsbyxlLGksbil9Y29uc3QgaT1TYShlLHQsby5kaXJlY3RpdmVTdGFydCxvKTtMcyhpLGUpO2NvbnN0IGE9b2kobyxlKTtyZXR1cm4gYSYmTHMoYSxlKSxpfSkocixuLGUpO2lmKG8uY29tcG9uZW50cy5wdXNoKHMpLHRbOF09cyxhJiZhLmZvckVhY2goKHQ9PnQocyxlKSkpLGUuY29udGVudFF1ZXJpZXMpe2NvbnN0IHQ9YmkoKTtuZ0Rldk1vZGUmJmhuKHQsIlROb2RlIGV4cGVjdGVkIiksZS5jb250ZW50UXVlcmllcygxLHMsdC5kaXJlY3RpdmVTdGFydCl9Y29uc3QgYz1iaSgpO3JldHVybiBuZ0Rldk1vZGUmJmhuKGMsInROb2RlIHNob3VsZCBoYXZlIGJlZW4gYWxyZWFkeSBjcmVhdGVkIiksIXIuZmlyc3RDcmVhdGVQYXNzfHxudWxsPT09ZS5ob3N0QmluZGluZ3MmJm51bGw9PT1lLmhvc3RBdHRyc3x8KFdpKGMuaW5kZXgpLHVkKG5bMV0sYywwLGMuZGlyZWN0aXZlU3RhcnQsYy5kaXJlY3RpdmVFbmQsZSksZmQoZSxzKSksc30pKHQsdGhpcy5jb21wb25lbnREZWYsYixmLFtNcF0pLEpjKGgsYixudWxsKX1maW5hbGx5e1VpKCl9cmV0dXJuIG5ldyBnaCh0aGlzLmNvbXBvbmVudFR5cGUseSxnZyhfLGIpLGIsXyl9fW5ldyBwaDtjbGFzcyBnaCBleHRlbmRzIGNsYXNze317Y29uc3RydWN0b3IodCxlLG4sbyxpKXtzdXBlcigpLHRoaXMubG9jYXRpb249bix0aGlzLl9yb290TFZpZXc9byx0aGlzLl90Tm9kZT1pLHRoaXMuaW5zdGFuY2U9ZSx0aGlzLmhvc3RWaWV3PXRoaXMuY2hhbmdlRGV0ZWN0b3JSZWY9bmV3IGpnKG8pLHRoaXMuY29tcG9uZW50VHlwZT10fWdldCBpbmplY3Rvcigpe3JldHVybiBuZXcgUmEodGhpcy5fdE5vZGUsdGhpcy5fcm9vdExWaWV3KX1kZXN0cm95KCl7dGhpcy5ob3N0Vmlldy5kZXN0cm95KCl9b25EZXN0cm95KHQpe3RoaXMuaG9zdFZpZXcub25EZXN0cm95KHQpfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gaGgodCxlLG4sbyl7cmV0dXJuIE5uKCgoKT0+e2NvbnN0IGk9dDtudWxsIT09ZSYmKGkuaGFzT3duUHJvcGVydHkoImRlY29yYXRvcnMiKSYmdm9pZCAwIT09aS5kZWNvcmF0b3JzP2kuZGVjb3JhdG9ycy5wdXNoKC4uLmUpOmkuZGVjb3JhdG9ycz1lKSxudWxsIT09biYmKGkuY3RvclBhcmFtZXRlcnM9biksbnVsbCE9PW8mJihpLnByb3BEZWNvcmF0b3JzPWkuaGFzT3duUHJvcGVydHkoInByb3BEZWNvcmF0b3JzIikmJnZvaWQgMCE9PWkucHJvcERlY29yYXRvcnM/T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGkucHJvcERlY29yYXRvcnMpLG8pOm8pfSkpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCBiaD1uZXcgTWFwOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgeWggZXh0ZW5kcyB0aHtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5fcGFyZW50PWUsdGhpcy5fYm9vdHN0cmFwQ29tcG9uZW50cz1bXSx0aGlzLmluamVjdG9yPXRoaXMsdGhpcy5kZXN0cm95Q2JzPVtdLHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyPW5ldyBwaCh0aGlzKTtjb25zdCBuPWZvKHQpO25nRGV2TW9kZSYmaG4obixgTmdNb2R1bGUgJyR7R2UodCl9JyBpcyBub3QgYSBzdWJ0eXBlIG9mICdOZ01vZHVsZVR5cGUnLmApO2NvbnN0IG89KGZ1bmN0aW9uIGkodCl7cmV0dXJuIHRbS25dfHxudWxsfSkodCk7byYmWHUobyksdGhpcy5fYm9vdHN0cmFwQ29tcG9uZW50cz1ybChuLmJvb3RzdHJhcCksdGhpcy5fcjNJbmplY3Rvcj1KZCh0LGUsW3twcm92aWRlOnRoLHVzZVZhbHVlOnRoaXN9LHtwcm92aWRlOnVnLHVzZVZhbHVlOnRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyfV0sR2UodCkpLHRoaXMuX3IzSW5qZWN0b3IuX3Jlc29sdmVJbmplY3RvckRlZlR5cGVzKCksdGhpcy5pbnN0YW5jZT10aGlzLmdldCh0KX1nZXQodCxlPXJwLlRIUk9XX0lGX05PVF9GT1VORCxuPUVuLkRlZmF1bHQpe3JldHVybiB0PT09cnB8fHQ9PT10aHx8dD09PUdkP3RoaXM6dGhpcy5fcjNJbmplY3Rvci5nZXQodCxlLG4pfWRlc3Ryb3koKXtuZ0Rldk1vZGUmJmhuKHRoaXMuZGVzdHJveUNicywiTmdNb2R1bGUgYWxyZWFkeSBkZXN0cm95ZWQiKTtjb25zdCB0PXRoaXMuX3IzSW5qZWN0b3I7IXQuZGVzdHJveWVkJiZ0LmRlc3Ryb3koKSx0aGlzLmRlc3Ryb3lDYnMuZm9yRWFjaCgodD0+dCgpKSksdGhpcy5kZXN0cm95Q2JzPW51bGx9b25EZXN0cm95KHQpe25nRGV2TW9kZSYmaG4odGhpcy5kZXN0cm95Q2JzLCJOZ01vZHVsZSBhbHJlYWR5IGRlc3Ryb3llZCIpLHRoaXMuZGVzdHJveUNicy5wdXNoKHQpfX1jbGFzcyBfaCBleHRlbmRzIGNsYXNze30KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICove2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5tb2R1bGVUeXBlPXQsbnVsbCE9PWZvKHQpJiYoZnVuY3Rpb24gZSh0KXtjb25zdCBlPW5ldyBTZXQ7IShmdW5jdGlvbiB0KG4pe2NvbnN0IG89Zm8obiwhMCksaT1vLmlkO251bGwhPT1pJiYoKGZ1bmN0aW9uIGEodCxlLG4pe2lmKGUmJmUhPT1uKXRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIG1vZHVsZSByZWdpc3RlcmVkIGZvciAke3R9IC0gJHtHZShlKX0gdnMgJHtHZShlLm5hbWUpfWApfSkoaSxiaC5nZXQoaSksbiksYmguc2V0KGksbikpO2NvbnN0IHI9cmwoby5pbXBvcnRzKTtmb3IoY29uc3QgbiBvZiByKWUuaGFzKG4pfHwoZS5hZGQobiksdChuKSl9KSh0KX0pKHQpfWNyZWF0ZSh0KXtyZXR1cm4gbmV3IHloKHRoaXMubW9kdWxlVHlwZSx0KX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIENoKHQsZSxuKXtjb25zdCBvPVBpKCkrdCxpPWZpKCk7cmV0dXJuIGlbb109PT1hYz9JcChpLG8sbj9lLmNhbGwobik6ZSgpKTpIcChpLG8pfWZ1bmN0aW9uIE1oKHQsZSxuLG8pe3JldHVybiBraChmaSgpLFBpKCksdCxlLG4sbyl9ZnVuY3Rpb24gdmgodCxlLG4sbyxpKXtyZXR1cm4gU2goZmkoKSxQaSgpLHQsZSxuLG8saSl9ZnVuY3Rpb24geGgodCxlLG4sbyxpLGEpe3JldHVybiBEaChmaSgpLFBpKCksdCxlLG4sbyxpLGEpfWZ1bmN0aW9uIE9oKHQsZSxuLG8saSxhLHIpe3JldHVybiBFaChmaSgpLFBpKCksdCxlLG4sbyxpLGEscil9ZnVuY3Rpb24gUGgodCxlLG4sbyxpLGEscixzKXtjb25zdCBsPVBpKCkrdCxjPWZpKCksZD1WcChjLGwsbixvLGksYSk7cmV0dXJuIEZwKGMsbCs0LHIpfHxkP0lwKGMsbCs1LHM/ZS5jYWxsKHMsbixvLGksYSxyKTplKG4sbyxpLGEscikpOkhwKGMsbCs1KX1mdW5jdGlvbiB3aCh0LGUpe25nRGV2TW9kZSYmX24odCxlKTtjb25zdCBuPXRbZV07cmV0dXJuIG49PT1hYz92b2lkIDA6bn1mdW5jdGlvbiBraCh0LGUsbixvLGksYSl7Y29uc3Qgcj1lK247cmV0dXJuIEZwKHQscixpKT9JcCh0LHIrMSxhP28uY2FsbChhLGkpOm8oaSkpOndoKHQscisxKX1mdW5jdGlvbiBTaCh0LGUsbixvLGksYSxyKXtjb25zdCBzPWUrbjtyZXR1cm4gTHAodCxzLGksYSk/SXAodCxzKzIscj9vLmNhbGwocixpLGEpOm8oaSxhKSk6d2godCxzKzIpfWZ1bmN0aW9uIERoKHQsZSxuLG8saSxhLHIscyl7Y29uc3QgbD1lK247cmV0dXJuIEJwKHQsbCxpLGEscik/SXAodCxsKzMscz9vLmNhbGwocyxpLGEscik6byhpLGEscikpOndoKHQsbCszKX1mdW5jdGlvbiBFaCh0LGUsbixvLGksYSxyLHMsbCl7Y29uc3QgYz1lK247cmV0dXJuIFZwKHQsYyxpLGEscixzKT9JcCh0LGMrNCxsP28uY2FsbChsLGksYSxyLHMpOm8oaSxhLHIscykpOndoKHQsYys0KX1mdW5jdGlvbiBSaCh0LGUsbixvLGksYSl7bGV0IHI9ZStuLHM9ITE7Zm9yKGxldCBlPTA7ZTxpLmxlbmd0aDtlKyspRnAodCxyKyssaVtlXSkmJihzPSEwKTtyZXR1cm4gcz9JcCh0LHIsby5hcHBseShhLGkpKTp3aCh0LHIpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBBaCh0LGUpe2NvbnN0IG49Z2koKTtsZXQgbztjb25zdCBpPXQrZ287bi5maXJzdENyZWF0ZVBhc3M/KG89KGZ1bmN0aW9uIGEodCxlKXtpZihlKWZvcihsZXQgbj1lLmxlbmd0aC0xO24+PTA7bi0tKXtjb25zdCBvPWVbbl07aWYodD09PW8ubmFtZSlyZXR1cm4gb310aHJvdyBuZXcgS2UoIjMwMiIsYFRoZSBwaXBlICcke3R9JyBjb3VsZCBub3QgYmUgZm91bmQhYCl9KShlLG4ucGlwZVJlZ2lzdHJ5KSxuLmRhdGFbaV09byxvLm9uRGVzdHJveSYmKG4uZGVzdHJveUhvb2tzfHwobi5kZXN0cm95SG9va3M9W10pKS5wdXNoKGksby5vbkRlc3Ryb3kpKTpvPW4uZGF0YVtpXTtjb25zdCByPW8uZmFjdG9yeXx8KG8uZmFjdG9yeT1GbyhvLnR5cGUsITApKSxzPUFuKFNtKTt0cnl7Y29uc3QgdD1mYSghMSksZT1yKCk7cmV0dXJuIGZhKHQpLChmdW5jdGlvbiBsKHQsZSxuLG8pe24+PXQuZGF0YS5sZW5ndGgmJih0LmRhdGFbbl09bnVsbCx0LmJsdWVwcmludFtuXT1udWxsKSxlW25dPW99KShuLGZpKCksaSxlKSxlfWZpbmFsbHl7QW4ocyl9fWZ1bmN0aW9uIFRoKHQsZSxuKXtjb25zdCBvPXQrZ28saT1maSgpLGE9YWkoaSxvKTtyZXR1cm4gSGgoaSxJaChpLG8pP2toKGksUGkoKSxlLGEudHJhbnNmb3JtLG4sYSk6YS50cmFuc2Zvcm0obikpfWZ1bmN0aW9uIE5oKHQsZSxuLG8pe2NvbnN0IGk9dCtnbyxhPWZpKCkscj1haShhLGkpO3JldHVybiBIaChhLEloKGEsaSk/U2goYSxQaSgpLGUsci50cmFuc2Zvcm0sbixvLHIpOnIudHJhbnNmb3JtKG4sbykpfWZ1bmN0aW9uIHpoKHQsZSxuLG8saSl7Y29uc3QgYT10K2dvLHI9ZmkoKSxzPWFpKHIsYSk7cmV0dXJuIEhoKHIsSWgocixhKT9EaChyLFBpKCksZSxzLnRyYW5zZm9ybSxuLG8saSxzKTpzLnRyYW5zZm9ybShuLG8saSkpfWZ1bmN0aW9uIEloKHQsZSl7cmV0dXJuIHRbMV0uZGF0YVtlXS5wdXJlfWZ1bmN0aW9uIEhoKHQsZSl7cmV0dXJuIFRwLmlzV3JhcHBlZChlKSYmKGU9VHAudW53cmFwKGUpLHRbd2koKV09YWMpLGV9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIEZoKHQpe3JldHVybiBlPT57c2V0VGltZW91dCh0LHZvaWQgMCxlKX19Y29uc3QgTGg9Y2xhc3MgZXh0ZW5kcyBJe2NvbnN0cnVjdG9yKHQ9ITEpe3N1cGVyKCksdGhpcy5fX2lzQXN5bmM9dH1lbWl0KHQpe3N1cGVyLm5leHQodCl9c3Vic2NyaWJlKHQsZSxuKXt2YXIgbyxpLGE7bGV0IHI9dCxzPWV8fCgoKT0+bnVsbCksbD1uO2lmKHQmJiJvYmplY3QiPT10eXBlb2YgdCl7Y29uc3QgZT10O3I9bnVsbD09PShvPWUubmV4dCl8fHZvaWQgMD09PW8/dm9pZCAwOm8uYmluZChlKSxzPW51bGw9PT0oaT1lLmVycm9yKXx8dm9pZCAwPT09aT92b2lkIDA6aS5iaW5kKGUpLGw9bnVsbD09PShhPWUuY29tcGxldGUpfHx2b2lkIDA9PT1hP3ZvaWQgMDphLmJpbmQoZSl9dGhpcy5fX2lzQXN5bmMmJihzPUZoKHMpLHImJihyPUZoKHIpKSxsJiYobD1GaChsKSkpO2NvbnN0IGM9c3VwZXIuc3Vic2NyaWJlKHtuZXh0OnIsZXJyb3I6cyxjb21wbGV0ZTpsfSk7cmV0dXJuIHQgaW5zdGFuY2VvZiBtJiZ0LmFkZChjKSxjfX07Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIEJoKCl7cmV0dXJuIHRoaXMuX3Jlc3VsdHNbUnAoKV0oKX1jbGFzcyBWaHtjb25zdHJ1Y3Rvcih0PSExKXt0aGlzLl9lbWl0RGlzdGluY3RDaGFuZ2VzT25seT10LHRoaXMuZGlydHk9ITAsdGhpcy5fcmVzdWx0cz1bXSx0aGlzLl9jaGFuZ2VzRGV0ZWN0ZWQ9ITEsdGhpcy5fY2hhbmdlcz1udWxsLHRoaXMubGVuZ3RoPTAsdGhpcy5maXJzdD12b2lkIDAsdGhpcy5sYXN0PXZvaWQgMDtjb25zdCBlPVJwKCksbj1WaC5wcm90b3R5cGU7bltlXXx8KG5bZV09QmgpfWdldCBjaGFuZ2VzKCl7cmV0dXJuIHRoaXMuX2NoYW5nZXN8fCh0aGlzLl9jaGFuZ2VzPW5ldyBMaCl9Z2V0KHQpe3JldHVybiB0aGlzLl9yZXN1bHRzW3RdfW1hcCh0KXtyZXR1cm4gdGhpcy5fcmVzdWx0cy5tYXAodCl9ZmlsdGVyKHQpe3JldHVybiB0aGlzLl9yZXN1bHRzLmZpbHRlcih0KX1maW5kKHQpe3JldHVybiB0aGlzLl9yZXN1bHRzLmZpbmQodCl9cmVkdWNlKHQsZSl7cmV0dXJuIHRoaXMuX3Jlc3VsdHMucmVkdWNlKHQsZSl9Zm9yRWFjaCh0KXt0aGlzLl9yZXN1bHRzLmZvckVhY2godCl9c29tZSh0KXtyZXR1cm4gdGhpcy5fcmVzdWx0cy5zb21lKHQpfXRvQXJyYXkoKXtyZXR1cm4gdGhpcy5fcmVzdWx0cy5zbGljZSgpfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuX3Jlc3VsdHMudG9TdHJpbmcoKX1yZXNldCh0LGUpe2NvbnN0IG49dGhpcztuLmRpcnR5PSExO2NvbnN0IG89dHIodCk7KHRoaXMuX2NoYW5nZXNEZXRlY3RlZD0hKGZ1bmN0aW9uIGkodCxlLG4pe2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2xldCBpPXRbb10sYT1lW29dO2lmKG4mJihpPW4oaSksYT1uKGEpKSxhIT09aSlyZXR1cm4hMX1yZXR1cm4hMH0pKG4uX3Jlc3VsdHMsbyxlKSkmJihuLl9yZXN1bHRzPW8sbi5sZW5ndGg9by5sZW5ndGgsbi5sYXN0PW9bdGhpcy5sZW5ndGgtMV0sbi5maXJzdD1vWzBdKX1ub3RpZnlPbkNoYW5nZXMoKXshdGhpcy5fY2hhbmdlc3x8IXRoaXMuX2NoYW5nZXNEZXRlY3RlZCYmdGhpcy5fZW1pdERpc3RpbmN0Q2hhbmdlc09ubHl8fHRoaXMuX2NoYW5nZXMuZW1pdCh0aGlzKX1zZXREaXJ0eSgpe3RoaXMuZGlydHk9ITB9ZGVzdHJveSgpe3RoaXMuY2hhbmdlcy5jb21wbGV0ZSgpLHRoaXMuY2hhbmdlcy51bnN1YnNjcmliZSgpfX1jbGFzcyBqaHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnF1ZXJ5TGlzdD10LHRoaXMubWF0Y2hlcz1udWxsfWNsb25lKCl7cmV0dXJuIG5ldyBqaCh0aGlzLnF1ZXJ5TGlzdCl9c2V0RGlydHkoKXt0aGlzLnF1ZXJ5TGlzdC5zZXREaXJ0eSgpfX1jbGFzcyBVaHtjb25zdHJ1Y3Rvcih0PVtdKXt0aGlzLnF1ZXJpZXM9dH1jcmVhdGVFbWJlZGRlZFZpZXcodCl7Y29uc3QgZT10LnF1ZXJpZXM7aWYobnVsbCE9PWUpe2NvbnN0IG49bnVsbCE9PXQuY29udGVudFF1ZXJpZXM/dC5jb250ZW50UXVlcmllc1swXTplLmxlbmd0aCxvPVtdO2ZvcihsZXQgdD0wO3Q8bjt0Kyspe2NvbnN0IG49ZS5nZXRCeUluZGV4KHQpO28ucHVzaCh0aGlzLnF1ZXJpZXNbbi5pbmRleEluRGVjbGFyYXRpb25WaWV3XS5jbG9uZSgpKX1yZXR1cm4gbmV3IFVoKG8pfXJldHVybiBudWxsfWluc2VydFZpZXcodCl7dGhpcy5kaXJ0eVF1ZXJpZXNXaXRoTWF0Y2hlcyh0KX1kZXRhY2hWaWV3KHQpe3RoaXMuZGlydHlRdWVyaWVzV2l0aE1hdGNoZXModCl9ZGlydHlRdWVyaWVzV2l0aE1hdGNoZXModCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnF1ZXJpZXMubGVuZ3RoO2UrKyludWxsIT09b2IodCxlKS5tYXRjaGVzJiZ0aGlzLnF1ZXJpZXNbZV0uc2V0RGlydHkoKX19Y2xhc3MgR2h7Y29uc3RydWN0b3IodCxlLG49bnVsbCl7dGhpcy5wcmVkaWNhdGU9dCx0aGlzLmZsYWdzPWUsdGhpcy5yZWFkPW59fWNsYXNzIFdoe2NvbnN0cnVjdG9yKHQ9W10pe3RoaXMucXVlcmllcz10fWVsZW1lbnRTdGFydCh0LGUpe25nRGV2TW9kZSYmQW8odCwiUXVlcmllcyBzaG91bGQgY29sbGVjdCByZXN1bHRzIG9uIHRoZSBmaXJzdCB0ZW1wbGF0ZSBwYXNzIG9ubHkiKTtmb3IobGV0IG49MDtuPHRoaXMucXVlcmllcy5sZW5ndGg7bisrKXRoaXMucXVlcmllc1tuXS5lbGVtZW50U3RhcnQodCxlKX1lbGVtZW50RW5kKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5xdWVyaWVzLmxlbmd0aDtlKyspdGhpcy5xdWVyaWVzW2VdLmVsZW1lbnRFbmQodCl9ZW1iZWRkZWRUVmlldyh0KXtsZXQgZT1udWxsO2ZvcihsZXQgbj0wO248dGhpcy5sZW5ndGg7bisrKXtjb25zdCBvPW51bGwhPT1lP2UubGVuZ3RoOjAsaT10aGlzLmdldEJ5SW5kZXgobikuZW1iZWRkZWRUVmlldyh0LG8pO2kmJihpLmluZGV4SW5EZWNsYXJhdGlvblZpZXc9bixudWxsIT09ZT9lLnB1c2goaSk6ZT1baV0pfXJldHVybiBudWxsIT09ZT9uZXcgV2goZSk6bnVsbH10ZW1wbGF0ZSh0LGUpe25nRGV2TW9kZSYmQW8odCwiUXVlcmllcyBzaG91bGQgY29sbGVjdCByZXN1bHRzIG9uIHRoZSBmaXJzdCB0ZW1wbGF0ZSBwYXNzIG9ubHkiKTtmb3IobGV0IG49MDtuPHRoaXMucXVlcmllcy5sZW5ndGg7bisrKXRoaXMucXVlcmllc1tuXS50ZW1wbGF0ZSh0LGUpfWdldEJ5SW5kZXgodCl7cmV0dXJuIG5nRGV2TW9kZSYmX24odGhpcy5xdWVyaWVzLHQpLHRoaXMucXVlcmllc1t0XX1nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMucXVlcmllcy5sZW5ndGh9dHJhY2sodCl7dGhpcy5xdWVyaWVzLnB1c2godCl9fWNsYXNzIFloe2NvbnN0cnVjdG9yKHQsZT0tMSl7dGhpcy5tZXRhZGF0YT10LHRoaXMubWF0Y2hlcz1udWxsLHRoaXMuaW5kZXhJbkRlY2xhcmF0aW9uVmlldz0tMSx0aGlzLmNyb3NzZXNOZ1RlbXBsYXRlPSExLHRoaXMuX2FwcGxpZXNUb05leHROb2RlPSEwLHRoaXMuX2RlY2xhcmF0aW9uTm9kZUluZGV4PWV9ZWxlbWVudFN0YXJ0KHQsZSl7dGhpcy5pc0FwcGx5aW5nVG9Ob2RlKGUpJiZ0aGlzLm1hdGNoVE5vZGUodCxlKX1lbGVtZW50RW5kKHQpe3RoaXMuX2RlY2xhcmF0aW9uTm9kZUluZGV4PT09dC5pbmRleCYmKHRoaXMuX2FwcGxpZXNUb05leHROb2RlPSExKX10ZW1wbGF0ZSh0LGUpe3RoaXMuZWxlbWVudFN0YXJ0KHQsZSl9ZW1iZWRkZWRUVmlldyh0LGUpe3JldHVybiB0aGlzLmlzQXBwbHlpbmdUb05vZGUodCk/KHRoaXMuY3Jvc3Nlc05nVGVtcGxhdGU9ITAsdGhpcy5hZGRNYXRjaCgtdC5pbmRleCxlKSxuZXcgWWgodGhpcy5tZXRhZGF0YSkpOm51bGx9aXNBcHBseWluZ1RvTm9kZSh0KXtpZih0aGlzLl9hcHBsaWVzVG9OZXh0Tm9kZSYmMSE9KDEmdGhpcy5tZXRhZGF0YS5mbGFncykpe2NvbnN0IGU9dGhpcy5fZGVjbGFyYXRpb25Ob2RlSW5kZXg7bGV0IG49dC5wYXJlbnQ7Zm9yKDtudWxsIT09biYmOCZuLnR5cGUmJm4uaW5kZXghPT1lOyluPW4ucGFyZW50O3JldHVybiBlPT09KG51bGwhPT1uP24uaW5kZXg6LTEpfXJldHVybiB0aGlzLl9hcHBsaWVzVG9OZXh0Tm9kZX1tYXRjaFROb2RlKHQsZSl7Y29uc3Qgbj10aGlzLm1ldGFkYXRhLnByZWRpY2F0ZTtpZihBcnJheS5pc0FycmF5KG4pKWZvcihsZXQgbz0wO288bi5sZW5ndGg7bysrKXtjb25zdCBpPW5bb107dGhpcy5tYXRjaFROb2RlV2l0aFJlYWRPcHRpb24odCxlLHFoKGUsaSkpLHRoaXMubWF0Y2hUTm9kZVdpdGhSZWFkT3B0aW9uKHQsZSxrYShlLHQsaSwhMSwhMSkpfWVsc2Ugbj09PVhnPzQmZS50eXBlJiZ0aGlzLm1hdGNoVE5vZGVXaXRoUmVhZE9wdGlvbih0LGUsLTEpOnRoaXMubWF0Y2hUTm9kZVdpdGhSZWFkT3B0aW9uKHQsZSxrYShlLHQsbiwhMSwhMSkpfW1hdGNoVE5vZGVXaXRoUmVhZE9wdGlvbih0LGUsbil7aWYobnVsbCE9PW4pe2NvbnN0IG89dGhpcy5tZXRhZGF0YS5yZWFkO2lmKG51bGwhPT1vKWlmKG89PT1oZ3x8bz09PWVofHxvPT09WGcmJjQmZS50eXBlKXRoaXMuYWRkTWF0Y2goZS5pbmRleCwtMik7ZWxzZXtjb25zdCBuPWthKGUsdCxvLCExLCExKTtudWxsIT09biYmdGhpcy5hZGRNYXRjaChlLmluZGV4LG4pfWVsc2UgdGhpcy5hZGRNYXRjaChlLmluZGV4LG4pfX1hZGRNYXRjaCh0LGUpe251bGw9PT10aGlzLm1hdGNoZXM/dGhpcy5tYXRjaGVzPVt0LGVdOnRoaXMubWF0Y2hlcy5wdXNoKHQsZSl9fWZ1bmN0aW9uIHFoKHQsZSl7Y29uc3Qgbj10LmxvY2FsTmFtZXM7aWYobnVsbCE9PW4pZm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0Kz0yKWlmKG5bdF09PT1lKXJldHVybiBuW3QrMV07cmV0dXJuIG51bGx9ZnVuY3Rpb24gWmgodCxlLG4sbyl7cmV0dXJuLTE9PT1uPyhmdW5jdGlvbiBpKHQsZSl7cmV0dXJuIDExJnQudHlwZT9nZyh0LGUpOjQmdC50eXBlPyRnKHQsZSk6bnVsbH0pKGUsdCk6LTI9PT1uPyhmdW5jdGlvbiBhKHQsZSxuKXtyZXR1cm4gbj09PWhnP2dnKGUsdCk6bj09PVhnPyRnKGUsdCk6bj09PWVoPyhuZ0Rldk1vZGUmJmlhKGUsMTUpLHNoKGUsdCkpOnZvaWQobmdEZXZNb2RlJiZibihgU3BlY2lhbCB0b2tlbiB0byByZWFkIHNob3VsZCBiZSBvbmUgb2YgRWxlbWVudFJlZiwgVGVtcGxhdGVSZWYgb3IgVmlld0NvbnRhaW5lclJlZiBidXQgZ290ICR7R2Uobil9LmApKX0pKHQsZSxvKTpTYSh0LHRbMV0sbixlKX1mdW5jdGlvbiBYaCh0LGUsbixvKXtjb25zdCBpPWVbMTldLnF1ZXJpZXNbb107aWYobnVsbD09PWkubWF0Y2hlcyl7Y29uc3Qgbz10LmRhdGEsYT1uLm1hdGNoZXMscj1bXTtmb3IobGV0IHQ9MDt0PGEubGVuZ3RoO3QrPTIpe2NvbnN0IGk9YVt0XTtpPDA/ci5wdXNoKG51bGwpOihuZ0Rldk1vZGUmJl9uKG8saSksci5wdXNoKFpoKGUsb1tpXSxhW3QrMV0sbi5tZXRhZGF0YS5yZWFkKSkpfWkubWF0Y2hlcz1yfXJldHVybiBpLm1hdGNoZXN9ZnVuY3Rpb24gS2godCxlLG4sbyl7Y29uc3QgaT10LnF1ZXJpZXMuZ2V0QnlJbmRleChuKSxhPWkubWF0Y2hlcztpZihudWxsIT09YSl7Y29uc3Qgcj1YaCh0LGUsaSxuKTtmb3IobGV0IHQ9MDt0PGEubGVuZ3RoO3QrPTIpe2NvbnN0IG49YVt0XTtpZihuPjApby5wdXNoKHJbdC8yXSk7ZWxzZXtjb25zdCBpPWFbdCsxXSxyPWVbLW5dO25nRGV2TW9kZSYmRG8ocik7Zm9yKGxldCB0PWJvO3Q8ci5sZW5ndGg7dCsrKXtjb25zdCBlPXJbdF07ZVsxN109PT1lWzNdJiZLaChlWzFdLGUsaSxvKX1pZihudWxsIT09cls5XSl7Y29uc3QgdD1yWzldO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtjb25zdCBuPXRbZV07S2goblsxXSxuLGksbyl9fX19fXJldHVybiBvfWZ1bmN0aW9uIEpoKHQpe2NvbnN0IGU9ZmkoKSxuPWdpKCksbz1OaSgpO3ppKG8rMSk7Y29uc3QgaT1vYihuLG8pO2lmKHQuZGlydHkmJnNpKGUpPT09KDI9PSgyJmkubWV0YWRhdGEuZmxhZ3MpKSl7aWYobnVsbD09PWkubWF0Y2hlcyl0LnJlc2V0KFtdKTtlbHNle2NvbnN0IGE9aS5jcm9zc2VzTmdUZW1wbGF0ZT9LaChuLGUsbyxbXSk6WGgobixlLGksbyk7dC5yZXNldChhLGJnKSx0Lm5vdGlmeU9uQ2hhbmdlcygpfXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIFFoKHQsZSxuKXtuZ0Rldk1vZGUmJmFuKGUsIkV4cGVjdGluZyBmbGFncyIpO2NvbnN0IG89Z2koKTtvLmZpcnN0Q3JlYXRlUGFzcyYmKG5iKG8sbmV3IEdoKHQsZSxuKSwtMSksMj09KDImZSkmJihvLnN0YXRpY1ZpZXdRdWVyaWVzPSEwKSksZWIobyxmaSgpLGUpfWZ1bmN0aW9uICRoKHQsZSxuLG8pe25nRGV2TW9kZSYmYW4obiwiRXhwZWN0aW5nIGZsYWdzIik7Y29uc3QgaT1naSgpO2lmKGkuZmlyc3RDcmVhdGVQYXNzKXtjb25zdCBhPWJpKCk7bmIoaSxuZXcgR2goZSxuLG8pLGEuaW5kZXgpLChmdW5jdGlvbiBhKHQsZSl7Y29uc3Qgbj10LmNvbnRlbnRRdWVyaWVzfHwodC5jb250ZW50UXVlcmllcz1bXSk7ZSE9PShuLmxlbmd0aD9uW24ubGVuZ3RoLTFdOi0xKSYmbi5wdXNoKHQucXVlcmllcy5sZW5ndGgtMSxlKX0pKGksdCksMj09KDImbikmJihpLnN0YXRpY0NvbnRlbnRRdWVyaWVzPSEwKX1lYihpLGZpKCksbil9ZnVuY3Rpb24gdGIoKXtyZXR1cm4oZnVuY3Rpb24gdChlLG4pe3JldHVybiBuZ0Rldk1vZGUmJmhuKGVbMTldLCJMUXVlcmllcyBzaG91bGQgYmUgZGVmaW5lZCB3aGVuIHRyeWluZyB0byBsb2FkIGEgcXVlcnkiKSxuZ0Rldk1vZGUmJl9uKGVbMTldLnF1ZXJpZXMsbiksZVsxOV0ucXVlcmllc1tuXS5xdWVyeUxpc3R9KShmaSgpLE5pKCkpfWZ1bmN0aW9uIGViKHQsZSxuKXtjb25zdCBvPW5ldyBWaCg0PT0oNCZuKSk7cmQodCxlLG8sby5kZXN0cm95KSxudWxsPT09ZVsxOV0mJihlWzE5XT1uZXcgVWgpLGVbMTldLnF1ZXJpZXMucHVzaChuZXcgamgobykpfWZ1bmN0aW9uIG5iKHQsZSxuKXtudWxsPT09dC5xdWVyaWVzJiYodC5xdWVyaWVzPW5ldyBXaCksdC5xdWVyaWVzLnRyYWNrKG5ldyBZaChlLG4pKX1mdW5jdGlvbiBvYih0LGUpe3JldHVybiBuZ0Rldk1vZGUmJmhuKHQucXVlcmllcywiVFF1ZXJpZXMgbXVzdCBiZSBkZWZpbmVkIHRvIHJldHJpZXZlIGEgVFF1ZXJ5IiksdC5xdWVyaWVzLmdldEJ5SW5kZXgoZSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIGliKHQsZSl7cmV0dXJuICRnKHQsZSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCBhYj17Ism1ybVhdHRyaWJ1dGUiOmpwLCLJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGUxIjpmdW5jdGlvbiB0KGUsbixvLGksYSxyKXtjb25zdCBzPWZpKCksbD1HcChzLG4sbyxpKTtpZihsIT09YWMpe2NvbnN0IHQ9WWkoKTtDZCh0LHMsZSxsLGEsciksbmdEZXZNb2RlJiZ6ZChnaSgpLmRhdGEsdCwiYXR0ci4iK2Usd2koKS0xLG4saSl9cmV0dXJuIHR9LCLJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGUyIjpmdW5jdGlvbiB0KGUsbixvLGksYSxyLHMsbCl7Y29uc3QgYz1maSgpLGQ9V3AoYyxuLG8saSxhLHIpO2lmKGQhPT1hYyl7Y29uc3QgdD1ZaSgpO0NkKHQsYyxlLGQscyxsKSxuZ0Rldk1vZGUmJnpkKGdpKCkuZGF0YSx0LCJhdHRyLiIrZSx3aSgpLTIsbixpLHIpfXJldHVybiB0fSwiybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMyI6ZnVuY3Rpb24gdChlLG4sbyxpLGEscixzLGwsYyxkKXtjb25zdCBwPWZpKCksbT1ZcChwLG4sbyxpLGEscixzLGwpO2lmKG0hPT1hYyl7Y29uc3QgdD1ZaSgpO0NkKHQscCxlLG0sYyxkKSxuZ0Rldk1vZGUmJnpkKGdpKCkuZGF0YSx0LCJhdHRyLiIrZSx3aSgpLTMsbixpLHIsbCl9cmV0dXJuIHR9LCLJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU0IjpmdW5jdGlvbiB0KGUsbixvLGksYSxyLHMsbCxjLGQscCxtKXtjb25zdCB1PWZpKCksZj1xcCh1LG4sbyxpLGEscixzLGwsYyxkKTtpZihmIT09YWMpe2NvbnN0IHQ9WWkoKTtDZCh0LHUsZSxmLHAsbSksbmdEZXZNb2RlJiZ6ZChnaSgpLmRhdGEsdCwiYXR0ci4iK2Usd2koKS00LG4saSxyLGwsZCl9cmV0dXJuIHR9LCLJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU1IjpmdW5jdGlvbiB0KGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZil7Y29uc3QgZz1maSgpLGg9WnAoZyxuLG8saSxhLHIscyxsLGMsZCxwLG0pO2lmKGghPT1hYyl7Y29uc3QgdD1ZaSgpO0NkKHQsZyxlLGgsdSxmKSxuZ0Rldk1vZGUmJnpkKGdpKCkuZGF0YSx0LCJhdHRyLiIrZSx3aSgpLTUsbixpLHIsbCxkLG0pfXJldHVybiB0fSwiybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNiI6ZnVuY3Rpb24gdChlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYsZyxoKXtjb25zdCBiPWZpKCkseT1YcChiLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYpO2lmKHkhPT1hYyl7Y29uc3QgdD1ZaSgpO0NkKHQsYixlLHksZyxoKSxuZ0Rldk1vZGUmJnpkKGdpKCkuZGF0YSx0LCJhdHRyLiIrZSx3aSgpLTYsbixpLHIsbCxkLG0sZil9cmV0dXJuIHR9LCLJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU3IjpmdW5jdGlvbiB0KGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZixnLGgsYix5KXtjb25zdCBfPWZpKCksQz1LcChfLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYsZyxoKTtpZihDIT09YWMpe2NvbnN0IHQ9WWkoKTtDZCh0LF8sZSxDLGIseSksbmdEZXZNb2RlJiZ6ZChnaSgpLmRhdGEsdCwiYXR0ci4iK2Usd2koKS03LG4saSxyLGwsZCxtLGYsaCl9cmV0dXJuIHR9LCLJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU4IjpmdW5jdGlvbiB0KGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZixnLGgsYix5LF8sQyl7Y29uc3QgTT1maSgpLHY9SnAoTSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSxmLGcsaCxiLHkpO2lmKHYhPT1hYyl7Y29uc3QgdD1ZaSgpO0NkKHQsTSxlLHYsXyxDKSxuZ0Rldk1vZGUmJnpkKGdpKCkuZGF0YSx0LCJhdHRyLiIrZSx3aSgpLTgsbixpLHIsbCxkLG0sZixoLHkpfXJldHVybiB0fSwiybXJtWF0dHJpYnV0ZUludGVycG9sYXRlViI6ZnVuY3Rpb24gdChlLG4sbyxpKXtjb25zdCBhPWZpKCkscj1VcChhLG4pO2lmKHIhPT1hYyl7Y29uc3QgdD1ZaSgpO2lmKENkKHQsYSxlLHIsbyxpKSxuZ0Rldk1vZGUpe2NvbnN0IG89W25bMF1dO2ZvcihsZXQgdD0yO3Q8bi5sZW5ndGg7dCs9MilvLnB1c2goblt0XSk7emQoZ2koKS5kYXRhLHQsImF0dHIuIitlLHdpKCktby5sZW5ndGgrMSwuLi5vKX19cmV0dXJuIHR9LCLJtcm1ZGVmaW5lQ29tcG9uZW50Ijp0bywiybXJtWRlZmluZURpcmVjdGl2ZSI6bG8sIsm1ybVkZWZpbmVJbmplY3RhYmxlIjpNbiwiybXJtWRlZmluZUluamVjdG9yIjp2biwiybXJtWRlZmluZU5nTW9kdWxlIjphbywiybXJtWRlZmluZVBpcGUiOmNvLCLJtcm1ZGlyZWN0aXZlSW5qZWN0IjpTbSwiybXJtWdldEluaGVyaXRlZEZhY3RvcnkiOkFhLCLJtcm1aW5qZWN0Ijp2ciwiybXJtWluamVjdEF0dHJpYnV0ZSI6TmEsIsm1ybVpbnZhbGlkRmFjdG9yeSI6ZnVuY3Rpb24gcmIoKXtjb25zdCB0PW5nRGV2TW9kZT8iVGhpcyBjb25zdHJ1Y3RvciB3YXMgbm90IGNvbXBhdGlibGUgd2l0aCBEZXBlbmRlbmN5IEluamVjdGlvbi4iOiJpbnZhbGlkIjt0aHJvdyBuZXcgRXJyb3IodCl9LCLJtcm1aW52YWxpZEZhY3RvcnlEZXAiOnhyLCLJtcm1dGVtcGxhdGVSZWZFeHRyYWN0b3IiOmliLCLJtcm1TmdPbkNoYW5nZXNGZWF0dXJlIjpCbywiybXJtVByb3ZpZGVyc0ZlYXR1cmUiOnBnLCLJtcm1Q29weURlZmluaXRpb25GZWF0dXJlIjpmdW5jdGlvbiBzYih0KXtsZXQgZSxuPXZwKHQudHlwZSk7ZT14byh0KT9uLsm1Y21wOm4uybVkaXI7Y29uc3Qgbz10O2Zvcihjb25zdCB0IG9mIFNwKW9bdF09ZVt0XTtpZih4byhlKSlmb3IoY29uc3QgdCBvZiBEcClvW3RdPWVbdF19LCLJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlIjp4cCwiybXJtW5leHRDb250ZXh0IjpZbSwiybXJtW5hbWVzcGFjZUhUTUwiOlppLCLJtcm1bmFtZXNwYWNlTWF0aE1MIjpmdW5jdGlvbiBsYigpe21pLmxGcmFtZS5jdXJyZW50TmFtZXNwYWNlPVhvfSwiybXJtW5hbWVzcGFjZVNWRyI6cWksIsm1ybVlbmFibGVCaW5kaW5ncyI6ZnVuY3Rpb24gY2IoKXttaS5iaW5kaW5nc0VuYWJsZWQ9ITB9LCLJtcm1ZGlzYWJsZUJpbmRpbmdzIjpmdW5jdGlvbiBkYigpe21pLmJpbmRpbmdzRW5hYmxlZD0hMX0sIsm1ybVlbGVtZW50U3RhcnQiOlJtLCLJtcm1ZWxlbWVudEVuZCI6QW0sIsm1ybVlbGVtZW50IjpUbSwiybXJtWVsZW1lbnRDb250YWluZXJTdGFydCI6Tm0sIsm1ybVlbGVtZW50Q29udGFpbmVyRW5kIjp6bSwiybXJtWVsZW1lbnRDb250YWluZXIiOkltLCLJtcm1cHVyZUZ1bmN0aW9uMCI6Q2gsIsm1ybVwdXJlRnVuY3Rpb24xIjpNaCwiybXJtXB1cmVGdW5jdGlvbjIiOnZoLCLJtcm1cHVyZUZ1bmN0aW9uMyI6eGgsIsm1ybVwdXJlRnVuY3Rpb240IjpPaCwiybXJtXB1cmVGdW5jdGlvbjUiOlBoLCLJtcm1cHVyZUZ1bmN0aW9uNiI6ZnVuY3Rpb24gcGIodCxlLG4sbyxpLGEscixzLGwpe2NvbnN0IGM9UGkoKSt0LGQ9ZmkoKSxwPVZwKGQsYyxuLG8saSxhKTtyZXR1cm4gTHAoZCxjKzQscixzKXx8cD9JcChkLGMrNixsP2UuY2FsbChsLG4sbyxpLGEscixzKTplKG4sbyxpLGEscixzKSk6SHAoZCxjKzYpfSwiybXJtXB1cmVGdW5jdGlvbjciOmZ1bmN0aW9uIG1iKHQsZSxuLG8saSxhLHIscyxsLGMpe2NvbnN0IGQ9UGkoKSt0LHA9ZmkoKTtsZXQgbT1WcChwLGQsbixvLGksYSk7cmV0dXJuIEJwKHAsZCs0LHIscyxsKXx8bT9JcChwLGQrNyxjP2UuY2FsbChjLG4sbyxpLGEscixzLGwpOmUobixvLGksYSxyLHMsbCkpOkhwKHAsZCs3KX0sIsm1ybVwdXJlRnVuY3Rpb244IjpmdW5jdGlvbiB1Yih0LGUsbixvLGksYSxyLHMsbCxjLGQpe2NvbnN0IHA9UGkoKSt0LG09ZmkoKSx1PVZwKG0scCxuLG8saSxhKTtyZXR1cm4gVnAobSxwKzQscixzLGwsYyl8fHU/SXAobSxwKzgsZD9lLmNhbGwoZCxuLG8saSxhLHIscyxsLGMpOmUobixvLGksYSxyLHMsbCxjKSk6SHAobSxwKzgpfSwiybXJtXB1cmVGdW5jdGlvblYiOmZ1bmN0aW9uIGZiKHQsZSxuLG8pe3JldHVybiBSaChmaSgpLFBpKCksdCxlLG4sbyl9LCLJtcm1Z2V0Q3VycmVudFZpZXciOkhtLCLJtcm1cmVzdG9yZVZpZXciOmhpLCLJtcm1bGlzdGVuZXIiOlZtLCLJtcm1cHJvamVjdGlvbiI6WG0sIsm1ybVzeW50aGV0aWNIb3N0UHJvcGVydHkiOk51LCLJtcm1c3ludGhldGljSG9zdExpc3RlbmVyIjpqbSwiybXJtXBpcGVCaW5kMSI6VGgsIsm1ybVwaXBlQmluZDIiOk5oLCLJtcm1cGlwZUJpbmQzIjp6aCwiybXJtXBpcGVCaW5kNCI6ZnVuY3Rpb24gZ2IodCxlLG4sbyxpLGEpe2NvbnN0IHI9dCtnbyxzPWZpKCksbD1haShzLHIpO3JldHVybiBIaChzLEloKHMscik/RWgocyxQaSgpLGUsbC50cmFuc2Zvcm0sbixvLGksYSxsKTpsLnRyYW5zZm9ybShuLG8saSxhKSl9LCLJtcm1cGlwZUJpbmRWIjpmdW5jdGlvbiBoYih0LGUsbil7Y29uc3Qgbz10K2dvLGk9ZmkoKSxhPWFpKGksbyk7cmV0dXJuIEhoKGksSWgoaSxvKT9SaChpLFBpKCksZSxhLnRyYW5zZm9ybSxuLGEpOmEudHJhbnNmb3JtLmFwcGx5KGEsbikpfSwiybXJtXByb2plY3Rpb25EZWYiOlptLCLJtcm1aG9zdFByb3BlcnR5IjpUdSwiybXJtXByb3BlcnR5IjpEbSwiybXJtXByb3BlcnR5SW50ZXJwb2xhdGUiOkttLCLJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTEiOkptLCLJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTIiOmZ1bmN0aW9uIHQoZSxuLG8saSxhLHIscyl7Y29uc3QgbD1maSgpLGM9V3AobCxuLG8saSxhLHIpO2lmKGMhPT1hYyl7Y29uc3QgdD1naSgpLG89WWkoKTtsZCh0LG8sbCxlLGMsbFsxMV0scywhMSksbmdEZXZNb2RlJiZ6ZCh0LmRhdGEsbyxlLHdpKCktMixuLGkscil9cmV0dXJuIHR9LCLJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTMiOmZ1bmN0aW9uIHQoZSxuLG8saSxhLHIscyxsLGMpe2NvbnN0IGQ9ZmkoKSxwPVlwKGQsbixvLGksYSxyLHMsbCk7aWYocCE9PWFjKXtjb25zdCB0PWdpKCksbz1ZaSgpO2xkKHQsbyxkLGUscCxkWzExXSxjLCExKSxuZ0Rldk1vZGUmJnpkKHQuZGF0YSxvLGUsd2koKS0zLG4saSxyLGwpfXJldHVybiB0fSwiybXJtXByb3BlcnR5SW50ZXJwb2xhdGU0IjpmdW5jdGlvbiB0KGUsbixvLGksYSxyLHMsbCxjLGQscCl7Y29uc3QgbT1maSgpLHU9cXAobSxuLG8saSxhLHIscyxsLGMsZCk7aWYodSE9PWFjKXtjb25zdCB0PWdpKCksbz1ZaSgpO2xkKHQsbyxtLGUsdSxtWzExXSxwLCExKSxuZ0Rldk1vZGUmJnpkKHQuZGF0YSxvLGUsd2koKS00LG4saSxyLGwsZCl9cmV0dXJuIHR9LCLJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTUiOmZ1bmN0aW9uIHQoZSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSl7Y29uc3QgZj1maSgpLGc9WnAoZixuLG8saSxhLHIscyxsLGMsZCxwLG0pO2lmKGchPT1hYyl7Y29uc3QgdD1naSgpLG89WWkoKTtsZCh0LG8sZixlLGcsZlsxMV0sdSwhMSksbmdEZXZNb2RlJiZ6ZCh0LmRhdGEsbyxlLHdpKCktNSxuLGkscixsLGQsbSl9cmV0dXJuIHR9LCLJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTYiOmZ1bmN0aW9uIHQoZSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSxmLGcpe2NvbnN0IGg9ZmkoKSxiPVhwKGgsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZik7aWYoYiE9PWFjKXtjb25zdCB0PWdpKCksbz1ZaSgpO2xkKHQsbyxoLGUsYixoWzExXSxnLCExKSxuZ0Rldk1vZGUmJnpkKHQuZGF0YSxvLGUsd2koKS02LG4saSxyLGwsZCxtLGYpfXJldHVybiB0fSwiybXJtXByb3BlcnR5SW50ZXJwb2xhdGU3IjpmdW5jdGlvbiB0KGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZixnLGgsYil7Y29uc3QgeT1maSgpLF89S3AoeSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSxmLGcsaCk7aWYoXyE9PWFjKXtjb25zdCB0PWdpKCksbz1ZaSgpO2xkKHQsbyx5LGUsXyx5WzExXSxiLCExKSxuZ0Rldk1vZGUmJnpkKHQuZGF0YSxvLGUsd2koKS03LG4saSxyLGwsZCxtLGYsaCl9cmV0dXJuIHR9LCLJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTgiOmZ1bmN0aW9uIHQoZSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSxmLGcsaCxiLHksXyl7Y29uc3QgQz1maSgpLE09SnAoQyxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSxmLGcsaCxiLHkpO2lmKE0hPT1hYyl7Y29uc3QgdD1naSgpLG89WWkoKTtsZCh0LG8sQyxlLE0sQ1sxMV0sXywhMSksbmdEZXZNb2RlJiZ6ZCh0LmRhdGEsbyxlLHdpKCktOCxuLGkscixsLGQsbSxmLGgseSl9cmV0dXJuIHR9LCLJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZVYiOmZ1bmN0aW9uIHQoZSxuLG8pe2NvbnN0IGk9ZmkoKSxhPVVwKGksbik7aWYoYSE9PWFjKXtjb25zdCB0PWdpKCkscj1ZaSgpO2lmKGxkKHQscixpLGUsYSxpWzExXSxvLCExKSxuZ0Rldk1vZGUpe2NvbnN0IG89W25bMF1dO2ZvcihsZXQgdD0yO3Q8bi5sZW5ndGg7dCs9MilvLnB1c2goblt0XSk7emQodC5kYXRhLHIsZSx3aSgpLW8ubGVuZ3RoKzEsLi4ubyl9fXJldHVybiB0fSwiybXJtXBpcGUiOkFoLCLJtcm1cXVlcnlSZWZyZXNoIjpKaCwiybXJtXZpZXdRdWVyeSI6UWgsIsm1ybVsb2FkUXVlcnkiOnRiLCLJtcm1Y29udGVudFF1ZXJ5IjokaCwiybXJtXJlZmVyZW5jZSI6JHAsIsm1ybVjbGFzc01hcCI6ZnUsIsm1ybVjbGFzc01hcEludGVycG9sYXRlMSI6QXUsIsm1ybVjbGFzc01hcEludGVycG9sYXRlMiI6ZnVuY3Rpb24gYmIodCxlLG4sbyxpKXtidShhcixndSxXcChmaSgpLHQsZSxuLG8saSksITApfSwiybXJtWNsYXNzTWFwSW50ZXJwb2xhdGUzIjpmdW5jdGlvbiB5Yih0LGUsbixvLGksYSxyKXtidShhcixndSxZcChmaSgpLHQsZSxuLG8saSxhLHIpLCEwKX0sIsm1ybVjbGFzc01hcEludGVycG9sYXRlNCI6ZnVuY3Rpb24gX2IodCxlLG4sbyxpLGEscixzLGwpe2J1KGFyLGd1LHFwKGZpKCksdCxlLG4sbyxpLGEscixzLGwpLCEwKX0sIsm1ybVjbGFzc01hcEludGVycG9sYXRlNSI6ZnVuY3Rpb24gQ2IodCxlLG4sbyxpLGEscixzLGwsYyxkKXtidShhcixndSxacChmaSgpLHQsZSxuLG8saSxhLHIscyxsLGMsZCksITApfSwiybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU2IjpmdW5jdGlvbiBNYih0LGUsbixvLGksYSxyLHMsbCxjLGQscCxtKXtidShhcixndSxYcChmaSgpLHQsZSxuLG8saSxhLHIscyxsLGMsZCxwLG0pLCEwKX0sIsm1ybVjbGFzc01hcEludGVycG9sYXRlNyI6ZnVuY3Rpb24gdmIodCxlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYpe2J1KGFyLGd1LEtwKGZpKCksdCxlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYpLCEwKX0sIsm1ybVjbGFzc01hcEludGVycG9sYXRlOCI6ZnVuY3Rpb24geGIodCxlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYsZyxoKXtidShhcixndSxKcChmaSgpLHQsZSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSxmLGcsaCksITApfSwiybXJtWNsYXNzTWFwSW50ZXJwb2xhdGVWIjpmdW5jdGlvbiBPYih0KXtidShhcixndSxVcChmaSgpLHQpLCEwKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovLCLJtcm1c3R5bGVNYXAiOm11LCLJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTEiOmZ1bmN0aW9uIFBiKHQsZSxuKXttdShHcChmaSgpLHQsZSxuKSl9LCLJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTIiOmZ1bmN0aW9uIHdiKHQsZSxuLG8saSl7bXUoV3AoZmkoKSx0LGUsbixvLGkpKX0sIsm1ybVzdHlsZU1hcEludGVycG9sYXRlMyI6ZnVuY3Rpb24ga2IodCxlLG4sbyxpLGEscil7bXUoWXAoZmkoKSx0LGUsbixvLGksYSxyKSl9LCLJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTQiOmZ1bmN0aW9uIFNiKHQsZSxuLG8saSxhLHIscyxsKXttdShxcChmaSgpLHQsZSxuLG8saSxhLHIscyxsKSl9LCLJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTUiOmZ1bmN0aW9uIERiKHQsZSxuLG8saSxhLHIscyxsLGMsZCl7bXUoWnAoZmkoKSx0LGUsbixvLGksYSxyLHMsbCxjLGQpKX0sIsm1ybVzdHlsZU1hcEludGVycG9sYXRlNiI6ZnVuY3Rpb24gRWIodCxlLG4sbyxpLGEscixzLGwsYyxkLHAsbSl7bXUoWHAoZmkoKSx0LGUsbixvLGksYSxyLHMsbCxjLGQscCxtKSl9LCLJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTciOmZ1bmN0aW9uIFJiKHQsZSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSxmKXttdShLcChmaSgpLHQsZSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSxmKSl9LCLJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTgiOmZ1bmN0aW9uIEFiKHQsZSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSxmLGcsaCl7bXUoSnAoZmkoKSx0LGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZixnLGgpKX0sIsm1ybVzdHlsZU1hcEludGVycG9sYXRlViI6ZnVuY3Rpb24gVGIodCl7bXUoVXAoZmkoKSx0KSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLywiybXJtXN0eWxlUHJvcCI6ZHUsIsm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTEiOmZ1bmN0aW9uIHQoZSxuLG8saSxhKXtyZXR1cm4gaHUoZSxHcChmaSgpLG4sbyxpKSxhLCExKSx0fSwiybXJtXN0eWxlUHJvcEludGVycG9sYXRlMiI6ZnVuY3Rpb24gdChlLG4sbyxpLGEscixzKXtyZXR1cm4gaHUoZSxXcChmaSgpLG4sbyxpLGEscikscywhMSksdH0sIsm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTMiOmZ1bmN0aW9uIHQoZSxuLG8saSxhLHIscyxsLGMpe3JldHVybiBodShlLFlwKGZpKCksbixvLGksYSxyLHMsbCksYywhMSksdH0sIsm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTQiOmZ1bmN0aW9uIHQoZSxuLG8saSxhLHIscyxsLGMsZCxwKXtyZXR1cm4gaHUoZSxxcChmaSgpLG4sbyxpLGEscixzLGwsYyxkKSxwLCExKSx0fSwiybXJtXN0eWxlUHJvcEludGVycG9sYXRlNSI6ZnVuY3Rpb24gdChlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1KXtyZXR1cm4gaHUoZSxacChmaSgpLG4sbyxpLGEscixzLGwsYyxkLHAsbSksdSwhMSksdH0sIsm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTYiOmZ1bmN0aW9uIHQoZSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSxmLGcpe3JldHVybiBodShlLFhwKGZpKCksbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZiksZywhMSksdH0sIsm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTciOmZ1bmN0aW9uIHQoZSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSxmLGcsaCxiKXtyZXR1cm4gaHUoZSxLcChmaSgpLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYsZyxoKSxiLCExKSx0fSwiybXJtXN0eWxlUHJvcEludGVycG9sYXRlOCI6ZnVuY3Rpb24gdChlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYsZyxoLGIseSxfKXtyZXR1cm4gaHUoZSxKcChmaSgpLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYsZyxoLGIseSksXywhMSksdH0sIsm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZVYiOmZ1bmN0aW9uIHQoZSxuLG8pe3JldHVybiBodShlLFVwKGZpKCksbiksbywhMSksdH0sIsm1ybVjbGFzc1Byb3AiOnB1LCLJtcm1YWR2YW5jZSI6cmMsIsm1ybV0ZW1wbGF0ZSI6UXAsIsm1ybV0ZXh0IjprdSwiybXJtXRleHRJbnRlcnBvbGF0ZSI6U3UsIsm1ybV0ZXh0SW50ZXJwb2xhdGUxIjpEdSwiybXJtXRleHRJbnRlcnBvbGF0ZTIiOkV1LCLJtcm1dGV4dEludGVycG9sYXRlMyI6UnUsIsm1ybV0ZXh0SW50ZXJwb2xhdGU0IjpmdW5jdGlvbiB0KGUsbixvLGksYSxyLHMsbCxjKXtjb25zdCBkPWZpKCkscD1xcChkLGUsbixvLGksYSxyLHMsbCxjKTtyZXR1cm4gcCE9PWFjJiZqZChkLEdpKCkscCksdH0sIsm1ybV0ZXh0SW50ZXJwb2xhdGU1IjpmdW5jdGlvbiB0KGUsbixvLGksYSxyLHMsbCxjLGQscCl7Y29uc3QgbT1maSgpLHU9WnAobSxlLG4sbyxpLGEscixzLGwsYyxkLHApO3JldHVybiB1IT09YWMmJmpkKG0sR2koKSx1KSx0fSwiybXJtXRleHRJbnRlcnBvbGF0ZTYiOmZ1bmN0aW9uIHQoZSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSl7Y29uc3QgZj1maSgpLGc9WHAoZixlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1KTtyZXR1cm4gZyE9PWFjJiZqZChmLEdpKCksZyksdH0sIsm1ybV0ZXh0SW50ZXJwb2xhdGU3IjpmdW5jdGlvbiB0KGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZixnKXtjb25zdCBoPWZpKCksYj1LcChoLGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZixnKTtyZXR1cm4gYiE9PWFjJiZqZChoLEdpKCksYiksdH0sIsm1ybV0ZXh0SW50ZXJwb2xhdGU4IjpmdW5jdGlvbiB0KGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZixnLGgsYil7Y29uc3QgeT1maSgpLF89SnAoeSxlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYsZyxoLGIpO3JldHVybiBfIT09YWMmJmpkKHksR2koKSxfKSx0fSwiybXJtXRleHRJbnRlcnBvbGF0ZVYiOmZ1bmN0aW9uIHQoZSl7Y29uc3Qgbj1maSgpLG89VXAobixlKTtyZXR1cm4gbyE9PWFjJiZqZChuLEdpKCksbyksdH0sIsm1ybVpMThuIjp0ZywiybXJtWkxOG5BdHRyaWJ1dGVzIjpmdW5jdGlvbiBOYih0LGUpe2NvbnN0IG49Z2koKTtuZ0Rldk1vZGUmJmhuKG4sInRWaWV3IHNob3VsZCBiZSBkZWZpbmVkIik7Y29uc3Qgbz1jaShuLmNvbnN0cyxlKTshKGZ1bmN0aW9uIGkodCxlLG4pe2NvbnN0IG89YmkoKS5pbmRleCxpPVtdO2lmKG5nRGV2TW9kZSYmYmMoaSxfZiksdC5maXJzdENyZWF0ZVBhc3MmJm51bGw9PT10LmRhdGFbZV0pe2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCs9Mil7Y29uc3QgZT1uW3RdLGE9blt0KzFdO2lmKCIiIT09YSl7aWYoT2YudGVzdChhKSl0aHJvdyBuZXcgRXJyb3IoYElDVSBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZCBpbiBhdHRyaWJ1dGVzLiBNZXNzYWdlOiAiJHthfSIuYCk7QWYoaSxhLG8sZSxUZihpKSxudWxsKX19dC5kYXRhW2VdPWl9fSkobix0K2dvLG8pfSwiybXJtWkxOG5FeHAiOmVnLCLJtcm1aTE4blN0YXJ0IjpRZiwiybXJtWkxOG5FbmQiOiRmLCLJtcm1aTE4bkFwcGx5IjpuZywiybXJtWkxOG5Qb3N0cHJvY2VzcyI6b2csIsm1ybVyZXNvbHZlV2luZG93IjpvbCwiybXJtXJlc29sdmVEb2N1bWVudCI6aWwsIsm1ybVyZXNvbHZlQm9keSI6ZnVuY3Rpb24gemIodCl7cmV0dXJuIHQub3duZXJEb2N1bWVudC5ib2R5fSwiybXJtXNldENvbXBvbmVudFNjb3BlIjplbywiybXJtXNldE5nTW9kdWxlU2NvcGUiOnJvLCLJtcm1c2FuaXRpemVIdG1sIjoKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmZ1bmN0aW9uIEliKHQpe2NvbnN0IGU9enMoKTtyZXR1cm4gZT9XcihlLnNhbml0aXplKEFzLkhUTUwsdCl8fCIiKTplcyh0LCJIVE1MIik/V3IodHModCkpOkVzKEpvKCksJGUodCkpfSwiybXJtXNhbml0aXplU3R5bGUiOmZ1bmN0aW9uIEhiKHQpe2NvbnN0IGU9enMoKTtyZXR1cm4gZT9lLnNhbml0aXplKEFzLlNUWUxFLHQpfHwiIjplcyh0LCJTdHlsZSIpP3RzKHQpOiRlKHQpfSwiybXJtXNhbml0aXplUmVzb3VyY2VVcmwiOk5zLCLJtcm1c2FuaXRpemVTY3JpcHQiOmZ1bmN0aW9uIEZiKHQpe2NvbnN0IGU9enMoKTtpZihlKXJldHVybiBZcihlLnNhbml0aXplKEFzLlNDUklQVCx0KXx8IiIpO2lmKGVzKHQsIlNjcmlwdCIpKXJldHVybiBZcih0cyh0KSk7dGhyb3cgbmV3IEVycm9yKCJ1bnNhZmUgdmFsdWUgdXNlZCBpbiBhIHNjcmlwdCBjb250ZXh0Iil9LCLJtcm1c2FuaXRpemVVcmwiOlRzLCLJtcm1c2FuaXRpemVVcmxPclJlc291cmNlVXJsIjpmdW5jdGlvbiBMYih0LGUsbil7cmV0dXJuKGZ1bmN0aW9uIG8odCxlKXtyZXR1cm4ic3JjIj09PWUmJigiZW1iZWQiPT09dHx8ImZyYW1lIj09PXR8fCJpZnJhbWUiPT09dHx8Im1lZGlhIj09PXR8fCJzY3JpcHQiPT09dCl8fCJocmVmIj09PWUmJigiYmFzZSI9PT10fHwibGluayI9PT10KT9OczpUc30pKGUsbikodCl9LCLJtcm1dHJ1c3RDb25zdGFudEh0bWwiOmZ1bmN0aW9uIEJiKHQpe2lmKG5nRGV2TW9kZSYmKCFBcnJheS5pc0FycmF5KHQpfHwhQXJyYXkuaXNBcnJheSh0LnJhdyl8fDEhPT10Lmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGludGVycG9sYXRpb24gaW4gdHJ1c3RlZCBIVE1MIGNvbnN0YW50OiAke3Quam9pbigiPyIpfWApO3JldHVybiBVcih0WzBdKX0sIsm1ybV0cnVzdENvbnN0YW50UmVzb3VyY2VVcmwiOmZ1bmN0aW9uIFZiKHQpe2lmKG5nRGV2TW9kZSYmKCFBcnJheS5pc0FycmF5KHQpfHwhQXJyYXkuaXNBcnJheSh0LnJhdyl8fDEhPT10Lmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGludGVycG9sYXRpb24gaW4gdHJ1c3RlZCBVUkwgY29uc3RhbnQ6ICR7dC5qb2luKCI/Iil9YCk7cmV0dXJuKGZ1bmN0aW9uIGUodCl7dmFyIGU7cmV0dXJuKG51bGw9PT0oZT1qcigpKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5jcmVhdGVTY3JpcHRVUkwodCkpfHx0fSkodFswXSl9LGZvcndhcmRSZWY6cWUscmVzb2x2ZUZvcndhcmRSZWY6WmV9O2xldCBqYj1udWxsOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgVWI9W107bGV0IEdiPSExO2Z1bmN0aW9uIFdiKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpP3QuZXZlcnkoV2IpOiEhWmUodCl9ZnVuY3Rpb24gWWIodCxlLG4pe2lmKEtiLmdldCh0KSlyZXR1cm47bGV0IG87aWYoS2Iuc2V0KHQsITApLHQ9WmUodCksbil7aWYobz1mbyh0KSwhbyl0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgdmFsdWUgJyR7dC5uYW1lfScgaW1wb3J0ZWQgYnkgdGhlIG1vZHVsZSAnJHtuLm5hbWV9Jy4gUGxlYXNlIGFkZCBhbiBATmdNb2R1bGUgYW5ub3RhdGlvbi5gKX1lbHNlIG89Zm8odCwhMCk7Y29uc3QgaT1bXSxhPXJsKG8uZGVjbGFyYXRpb25zKSxyPXJsKG8uaW1wb3J0cyk7dHIocikubWFwKHFiKS5mb3JFYWNoKChlPT57aChlLHQpLFliKGUsITEsdCl9KSk7Y29uc3Qgcz1ybChvLmV4cG9ydHMpO2EuZm9yRWFjaCgoZnVuY3Rpb24gbChlKXtwbyhlPVplKGUpKXx8bW8oZSl8fHVvKGUpfHxpLnB1c2goYFVuZXhwZWN0ZWQgdmFsdWUgJyR7dG4oZSl9JyBkZWNsYXJlZCBieSB0aGUgbW9kdWxlICcke3RuKHQpfScuIFBsZWFzZSBhZGQgYSBAUGlwZS9ARGlyZWN0aXZlL0BDb21wb25lbnQgYW5ub3RhdGlvbi5gKX0pKSxhLmZvckVhY2goKGZ1bmN0aW9uIGModCl7Y29uc3QgZT1tbyh0PVplKHQpKTshcG8odCkmJmUmJjA9PWUuc2VsZWN0b3JzLmxlbmd0aCYmaS5wdXNoKGBEaXJlY3RpdmUgJHt0bih0KX0gaGFzIG5vIHNlbGVjdG9yLCBwbGVhc2UgYWRkIGl0IWApfSkpO2NvbnN0IGQ9Wy4uLmEubWFwKFplKSwuLi50cihyLm1hcChKYikpLm1hcChaZSldO3MuZm9yRWFjaCgoZnVuY3Rpb24gcChlKXtjb25zdCBuPShwbyhlPVplKGUpKT8iY29tcG9uZW50IjptbyhlKSYmImRpcmVjdGl2ZSIpfHx1byhlKSYmInBpcGUiO24mJi0xPT09ZC5sYXN0SW5kZXhPZihlKSYmaS5wdXNoKGBDYW4ndCBleHBvcnQgJHtufSAke3RuKGUpfSBmcm9tICR7dG4odCl9IGFzIGl0IHdhcyBuZWl0aGVyIGRlY2xhcmVkIG5vciBpbXBvcnRlZCFgKX0pKSxhLmZvckVhY2goKG49PihmdW5jdGlvbiBvKGUsbil7ZT1aZShlKTtjb25zdCBvPVhiLmdldChlKTtpZihvJiZvIT09dCl7aWYoIW4pe2NvbnN0IG49W28sdF0ubWFwKHRuKS5zb3J0KCk7aS5wdXNoKGBUeXBlICR7dG4oZSl9IGlzIHBhcnQgb2YgdGhlIGRlY2xhcmF0aW9ucyBvZiAyIG1vZHVsZXM6ICR7blswXX0gYW5kICR7blsxXX0hIFBsZWFzZSBjb25zaWRlciBtb3ZpbmcgJHt0bihlKX0gdG8gYSBoaWdoZXIgbW9kdWxlIHRoYXQgaW1wb3J0cyAke25bMF19IGFuZCAke25bMV19LiBZb3UgY2FuIGFsc28gY3JlYXRlIGEgbmV3IE5nTW9kdWxlIHRoYXQgZXhwb3J0cyBhbmQgaW5jbHVkZXMgJHt0bihlKX0gdGhlbiBpbXBvcnQgdGhhdCBOZ01vZHVsZSBpbiAke25bMF19IGFuZCAke25bMV19LmApfX1lbHNlIFhiLnNldChlLHQpfSkobixlKSkpLGEuZm9yRWFjaCgoZnVuY3Rpb24gbSh0KXtpZihwbyh0PVplKHQpKSl7Y29uc3QgZT1aYih0LCJDb21wb25lbnQiKTtlJiZlLmVudHJ5Q29tcG9uZW50cyYmZXIoZS5lbnRyeUNvbXBvbmVudHMsZyl9fSkpO2NvbnN0IHU9WmIodCwiTmdNb2R1bGUiKTtpZih1JiYodS5pbXBvcnRzJiZ0cih1LmltcG9ydHMpLm1hcChxYikuZm9yRWFjaCgoZT0+e2goZSx0KSxZYihlLCExLHQpfSkpLHUuYm9vdHN0cmFwJiZlcih1LmJvb3RzdHJhcCwoZnVuY3Rpb24gZih0KXtwbyh0PVplKHQpKXx8aS5wdXNoKGAke3RuKHQpfSBjYW5ub3QgYmUgdXNlZCBhcyBhbiBlbnRyeSBjb21wb25lbnQuYCl9KSksdS5ib290c3RyYXAmJmVyKHUuYm9vdHN0cmFwLGcpLHUuZW50cnlDb21wb25lbnRzJiZlcih1LmVudHJ5Q29tcG9uZW50cyxnKSksaS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGkuam9pbigiXG4iKSk7ZnVuY3Rpb24gZyh0KXt0PVplKHQpLFhiLmdldCh0KXx8aS5wdXNoKGBDb21wb25lbnQgJHt0bih0KX0gaXMgbm90IHBhcnQgb2YgYW55IE5nTW9kdWxlIG9yIHRoZSBtb2R1bGUgaGFzIG5vdCBiZWVuIGltcG9ydGVkIGludG8geW91ciBtb2R1bGUuYCl9ZnVuY3Rpb24gaCh0LGUpe2lmKHBvKHQ9WmUodCkpfHxtbyh0KSl0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZGlyZWN0aXZlICcke3QubmFtZX0nIGltcG9ydGVkIGJ5IHRoZSBtb2R1bGUgJyR7ZS5uYW1lfScuIFBsZWFzZSBhZGQgYW4gQE5nTW9kdWxlIGFubm90YXRpb24uYCk7aWYodW8odCkpdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHBpcGUgJyR7dC5uYW1lfScgaW1wb3J0ZWQgYnkgdGhlIG1vZHVsZSAnJHtlLm5hbWV9Jy4gUGxlYXNlIGFkZCBhbiBATmdNb2R1bGUgYW5ub3RhdGlvbi5gKX19ZnVuY3Rpb24gcWIodCl7cmV0dXJuKHQ9WmUodCkpLm5nTW9kdWxlfHx0fWZ1bmN0aW9uIFpiKHQsZSl7bGV0IG49bnVsbDtyZXR1cm4gbyh0Ll9fYW5ub3RhdGlvbnNfXyksbyh0LmRlY29yYXRvcnMpLG47ZnVuY3Rpb24gbyh0KXt0JiZ0LmZvckVhY2goaSl9ZnVuY3Rpb24gaSh0KXtufHwoT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpLm5nTWV0YWRhdGFOYW1lPT1lP249dDp0LnR5cGUmJk9iamVjdC5nZXRQcm90b3R5cGVPZih0LnR5cGUpLm5nTWV0YWRhdGFOYW1lPT1lJiYobj10LmFyZ3NbMF0pKX19bGV0IFhiPW5ldyBXZWFrTWFwLEtiPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIEpiKHQpe3JldHVyblsuLi50cihybChmbyh0PVplKHQpLCEwKS5leHBvcnRzKS5tYXAoKHQ9PmZvKHQpPyhZYih0LCExKSxKYih0KSk6dCkpKV19ZnVuY3Rpb24gUWIodCxlKXtjb25zdCBuPXRyKGUuZGVjbGFyYXRpb25zfHxXbiksbz10eSh0KTtuLmZvckVhY2goKGU9PntlLmhhc093blByb3BlcnR5KFluKT8kYihwbyhlKSxvKTplLmhhc093blByb3BlcnR5KHFuKXx8ZS5oYXNPd25Qcm9wZXJ0eShabil8fChlLm5nU2VsZWN0b3JTY29wZT10KX0pKX1mdW5jdGlvbiAkYih0LGUpe3QuZGlyZWN0aXZlRGVmcz0oKT0+QXJyYXkuZnJvbShlLmNvbXBpbGF0aW9uLmRpcmVjdGl2ZXMpLm1hcCgodD0+dC5oYXNPd25Qcm9wZXJ0eShZbik/cG8odCk6bW8odCkpKS5maWx0ZXIoKHQ9PiEhdCkpLHQucGlwZURlZnM9KCk9PkFycmF5LmZyb20oZS5jb21waWxhdGlvbi5waXBlcykubWFwKCh0PT51byh0KSkpLHQuc2NoZW1hcz1lLnNjaGVtYXMsdC50Vmlldz1udWxsfWZ1bmN0aW9uIHR5KHQpe2lmKCFueSh0KSl0aHJvdyBuZXcgRXJyb3IoYCR7dC5uYW1lfSBkb2VzIG5vdCBoYXZlIGEgbW9kdWxlIGRlZiAoybVtb2QgcHJvcGVydHkpYCk7Y29uc3QgZT1mbyh0KTtpZihudWxsIT09ZS50cmFuc2l0aXZlQ29tcGlsZVNjb3BlcylyZXR1cm4gZS50cmFuc2l0aXZlQ29tcGlsZVNjb3Blcztjb25zdCBuPXtzY2hlbWFzOmUuc2NoZW1hc3x8bnVsbCxjb21waWxhdGlvbjp7ZGlyZWN0aXZlczpuZXcgU2V0LHBpcGVzOm5ldyBTZXR9LGV4cG9ydGVkOntkaXJlY3RpdmVzOm5ldyBTZXQscGlwZXM6bmV3IFNldH19O3JldHVybiBybChlLmltcG9ydHMpLmZvckVhY2goKHQ9Pntjb25zdCBlPXQ7aWYoIW55KGUpKXRocm93IG5ldyBFcnJvcihgSW1wb3J0aW5nICR7ZS5uYW1lfSB3aGljaCBkb2VzIG5vdCBoYXZlIGEgybVtb2QgcHJvcGVydHlgKTtjb25zdCBvPXR5KGUpO28uZXhwb3J0ZWQuZGlyZWN0aXZlcy5mb3JFYWNoKCh0PT5uLmNvbXBpbGF0aW9uLmRpcmVjdGl2ZXMuYWRkKHQpKSksby5leHBvcnRlZC5waXBlcy5mb3JFYWNoKCh0PT5uLmNvbXBpbGF0aW9uLnBpcGVzLmFkZCh0KSkpfSkpLHJsKGUuZGVjbGFyYXRpb25zKS5mb3JFYWNoKCh0PT57dW8odCk/bi5jb21waWxhdGlvbi5waXBlcy5hZGQodCk6bi5jb21waWxhdGlvbi5kaXJlY3RpdmVzLmFkZCh0KX0pKSxybChlLmV4cG9ydHMpLmZvckVhY2goKHQ9Pntjb25zdCBlPXQ7aWYobnkoZSkpe2NvbnN0IHQ9dHkoZSk7dC5leHBvcnRlZC5kaXJlY3RpdmVzLmZvckVhY2goKHQ9PntuLmNvbXBpbGF0aW9uLmRpcmVjdGl2ZXMuYWRkKHQpLG4uZXhwb3J0ZWQuZGlyZWN0aXZlcy5hZGQodCl9KSksdC5leHBvcnRlZC5waXBlcy5mb3JFYWNoKCh0PT57bi5jb21waWxhdGlvbi5waXBlcy5hZGQodCksbi5leHBvcnRlZC5waXBlcy5hZGQodCl9KSl9ZWxzZSB1byhlKT9uLmV4cG9ydGVkLnBpcGVzLmFkZChlKTpuLmV4cG9ydGVkLmRpcmVjdGl2ZXMuYWRkKGUpfSkpLGUudHJhbnNpdGl2ZUNvbXBpbGVTY29wZXM9bixufWZ1bmN0aW9uIGV5KHQpe3JldHVybihmdW5jdGlvbiBlKHQpe3JldHVybiB2b2lkIDAhPT10Lm5nTW9kdWxlfSkodCk/dC5uZ01vZHVsZTp0fWZ1bmN0aW9uIG55KHQpe3JldHVybiEhZm8odCl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2xldCBveT0wO2Z1bmN0aW9uIGl5KHQsZSl7bGV0IG49bnVsbDtyeSh0LGV8fHt9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxxbix7Z2V0OigpPT57aWYobnVsbD09PW4pe2NvbnN0IG89YXkodCxlfHx7fSksaT1KYSh7dXNhZ2U6MCxraW5kOiJkaXJlY3RpdmUiLHR5cGU6dH0pO249aS5jb21waWxlRGlyZWN0aXZlKGFiLG8uc291cmNlTWFwVXJsLG8ubWV0YWRhdGEpfXJldHVybiBufSxjb25maWd1cmFibGU6ISFuZ0Rldk1vZGV9KX1mdW5jdGlvbiBheSh0LGUpe2NvbnN0IG49dCYmdC5uYW1lLG89YG5nOi8vLyR7bn0vybVkaXIuanNgLGk9SmEoe3VzYWdlOjAsa2luZDoiZGlyZWN0aXZlIix0eXBlOnR9KSxhPWx5KHQsZSk7cmV0dXJuIGEudHlwZVNvdXJjZVNwYW49aS5jcmVhdGVQYXJzZVNvdXJjZVNwYW4oIkRpcmVjdGl2ZSIsbixvKSxhLnVzZXNJbmhlcml0YW5jZSYmY3kodCkse21ldGFkYXRhOmEsc291cmNlTWFwVXJsOm99fWZ1bmN0aW9uIHJ5KHQsZSl7bGV0IG49bnVsbDtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxKbix7Z2V0OigpPT57aWYobnVsbD09PW4pe2NvbnN0IG89YXkodCxlKSxpPUphKHt1c2FnZTowLGtpbmQ6ImRpcmVjdGl2ZSIsdHlwZTp0fSk7bj1pLmNvbXBpbGVGYWN0b3J5KGFiLGBuZzovLy8ke3QubmFtZX0vybVmYWMuanNgLHtuYW1lOm8ubWV0YWRhdGEubmFtZSx0eXBlOm8ubWV0YWRhdGEudHlwZSx0eXBlQXJndW1lbnRDb3VudDowLGRlcHM6TnIodCksdGFyZ2V0OmkuRmFjdG9yeVRhcmdldC5EaXJlY3RpdmV9KX1yZXR1cm4gbn0sY29uZmlndXJhYmxlOiEhbmdEZXZNb2RlfSl9ZnVuY3Rpb24gc3kodCl7cmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZih0LnByb3RvdHlwZSk9PT1PYmplY3QucHJvdG90eXBlfWZ1bmN0aW9uIGx5KHQsZSl7Y29uc3Qgbj1UcigpLG89bi5vd25Qcm9wTWV0YWRhdGEodCk7cmV0dXJue25hbWU6dC5uYW1lLHR5cGU6dCxzZWxlY3Rvcjp2b2lkIDAhPT1lLnNlbGVjdG9yP2Uuc2VsZWN0b3I6bnVsbCxob3N0OmUuaG9zdHx8R24scHJvcE1ldGFkYXRhOm8saW5wdXRzOmUuaW5wdXRzfHxXbixvdXRwdXRzOmUub3V0cHV0c3x8V24scXVlcmllczpteSh0LG8sdXkpLGxpZmVjeWNsZTp7dXNlc09uQ2hhbmdlczpuLmhhc0xpZmVjeWNsZUhvb2sodCwibmdPbkNoYW5nZXMiKX0sdHlwZVNvdXJjZVNwYW46bnVsbCx1c2VzSW5oZXJpdGFuY2U6IXN5KHQpLGV4cG9ydEFzOihpPWUuZXhwb3J0QXMsdm9pZCAwPT09aT9udWxsOmh5KGkpKSxwcm92aWRlcnM6ZS5wcm92aWRlcnN8fG51bGwsdmlld1F1ZXJpZXM6bXkodCxvLGZ5KX07dmFyIGl9ZnVuY3Rpb24gY3kodCl7Y29uc3QgZT1PYmplY3QucHJvdG90eXBlO2xldCBuPU9iamVjdC5nZXRQcm90b3R5cGVPZih0LnByb3RvdHlwZSkuY29uc3RydWN0b3I7Zm9yKDtuJiZuIT09ZTspbW8obil8fHBvKG4pfHwheXkobil8fGl5KG4sbnVsbCksbj1PYmplY3QuZ2V0UHJvdG90eXBlT2Yobil9ZnVuY3Rpb24gZHkodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2h5KHQpOlplKHQpfWZ1bmN0aW9uIHB5KHQsZSl7cmV0dXJue3Byb3BlcnR5TmFtZTp0LHByZWRpY2F0ZTpkeShlLnNlbGVjdG9yKSxkZXNjZW5kYW50czplLmRlc2NlbmRhbnRzLGZpcnN0OmUuZmlyc3QscmVhZDplLnJlYWQ/ZS5yZWFkOm51bGwsc3RhdGljOiEhZS5zdGF0aWMsZW1pdERpc3RpbmN0Q2hhbmdlc09ubHk6ISFlLmVtaXREaXN0aW5jdENoYW5nZXNPbmx5fX1mdW5jdGlvbiBteSh0LGUsbil7Y29uc3Qgbz1bXTtmb3IoY29uc3QgaSBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkoaSkpe2NvbnN0IGE9ZVtpXTthLmZvckVhY2goKGU9PntpZihuKGUpKXtpZighZS5zZWxlY3Rvcil0aHJvdyBuZXcgRXJyb3IoYENhbid0IGNvbnN0cnVjdCBhIHF1ZXJ5IGZvciB0aGUgcHJvcGVydHkgIiR7aX0iIG9mICIke3RuKHQpfSIgc2luY2UgdGhlIHF1ZXJ5IHNlbGVjdG9yIHdhc24ndCBkZWZpbmVkLmApO2lmKGEuc29tZShneSkpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY29tYmluZSBASW5wdXQgZGVjb3JhdG9ycyB3aXRoIHF1ZXJ5IGRlY29yYXRvcnMiKTtvLnB1c2gocHkoaSxlKSl9fSkpfXJldHVybiBvfWZ1bmN0aW9uIHV5KHQpe2NvbnN0IGU9dC5uZ01ldGFkYXRhTmFtZTtyZXR1cm4iQ29udGVudENoaWxkIj09PWV8fCJDb250ZW50Q2hpbGRyZW4iPT09ZX1mdW5jdGlvbiBmeSh0KXtjb25zdCBlPXQubmdNZXRhZGF0YU5hbWU7cmV0dXJuIlZpZXdDaGlsZCI9PT1lfHwiVmlld0NoaWxkcmVuIj09PWV9ZnVuY3Rpb24gZ3kodCl7cmV0dXJuIklucHV0Ij09PXQubmdNZXRhZGF0YU5hbWV9ZnVuY3Rpb24gaHkodCl7cmV0dXJuIHQuc3BsaXQoIiwiKS5tYXAoKHQ9PnQudHJpbSgpKSl9Y29uc3QgYnk9WyJuZ09uQ2hhbmdlcyIsIm5nT25Jbml0IiwibmdPbkRlc3Ryb3kiLCJuZ0RvQ2hlY2siLCJuZ0FmdGVyVmlld0luaXQiLCJuZ0FmdGVyVmlld0NoZWNrZWQiLCJuZ0FmdGVyQ29udGVudEluaXQiLCJuZ0FmdGVyQ29udGVudENoZWNrZWQiXTtmdW5jdGlvbiB5eSh0KXtjb25zdCBlPVRyKCk7aWYoYnkuc29tZSgobj0+ZS5oYXNMaWZlY3ljbGVIb29rKHQsbikpKSlyZXR1cm4hMDtjb25zdCBuPWUucHJvcE1ldGFkYXRhKHQpO2Zvcihjb25zdCB0IGluIG4pe2NvbnN0IGU9blt0XTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7Y29uc3Qgbj1lW3RdLG89bi5uZ01ldGFkYXRhTmFtZTtpZihneShuKXx8dXkobil8fGZ5KG4pfHwiT3V0cHV0Ij09PW98fCJIb3N0QmluZGluZyI9PT1vfHwiSG9zdExpc3RlbmVyIj09PW8pcmV0dXJuITB9fXJldHVybiExfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBfeSh0LGUpe3JldHVybnt0eXBlOnQsbmFtZTp0Lm5hbWUscGlwZU5hbWU6ZS5uYW1lLHB1cmU6dm9pZCAwPT09ZS5wdXJlfHxlLnB1cmV9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCBDeT1GYSgiRGlyZWN0aXZlIiwoKHQ9e30pPT50KSx2b2lkIDAsdm9pZCAwLCgodCxlKT0+RHkodCxlKSkpLE15PUZhKCJDb21wb25lbnQiLCgodD17fSk9Pk9iamVjdC5hc3NpZ24oe2NoYW5nZURldGVjdGlvbjp6bi5EZWZhdWx0fSx0KSksQ3ksdm9pZCAwLCgodCxlKT0+a3kodCxlKSkpLHZ5PUZhKCJQaXBlIiwodD0+T2JqZWN0LmFzc2lnbih7cHVyZTohMH0sdCkpLHZvaWQgMCx2b2lkIDAsKCh0LGUpPT5FeSh0LGUpKSkseHk9VmEoIklucHV0IiwodD0+KHtiaW5kaW5nUHJvcGVydHlOYW1lOnR9KSkpLE95PVZhKCJPdXRwdXQiLCh0PT4oe2JpbmRpbmdQcm9wZXJ0eU5hbWU6dH0pKSksUHk9VmEoIkhvc3RCaW5kaW5nIiwodD0+KHtob3N0UHJvcGVydHlOYW1lOnR9KSkpLHd5PVZhKCJIb3N0TGlzdGVuZXIiLCgodCxlKT0+KHtldmVudE5hbWU6dCxhcmdzOmV9KSkpLGt5PWZ1bmN0aW9uIFN5KHQsZSl7KCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZVbigpO2xldCBuPW51bGw7IShmdW5jdGlvbiBvKHQsZSl7RnIoZSkmJihJci5zZXQodCxlKSxIci5hZGQodCkpfSkodCxlKSxyeSh0LGUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFluLHtnZXQ6KCk9PntpZihudWxsPT09bil7Y29uc3Qgbz1KYSh7dXNhZ2U6MCxraW5kOiJjb21wb25lbnQiLHR5cGU6dH0pO2lmKEZyKGUpKXtjb25zdCBuPVtgQ29tcG9uZW50ICcke3QubmFtZX0nIGlzIG5vdCByZXNvbHZlZDpgXTt0aHJvdyBlLnRlbXBsYXRlVXJsJiZuLnB1c2goYCAtIHRlbXBsYXRlVXJsOiAke2UudGVtcGxhdGVVcmx9YCksZS5zdHlsZVVybHMmJmUuc3R5bGVVcmxzLmxlbmd0aCYmbi5wdXNoKGAgLSBzdHlsZVVybHM6ICR7SlNPTi5zdHJpbmdpZnkoZS5zdHlsZVVybHMpfWApLG4ucHVzaCgiRGlkIHlvdSBydW4gYW5kIHdhaXQgZm9yICdyZXNvbHZlQ29tcG9uZW50UmVzb3VyY2VzKCknPyIpLG5ldyBFcnJvcihuLmpvaW4oIlxuIikpfWNvbnN0IGk9KGZ1bmN0aW9uIG8oKXtyZXR1cm4gamJ9KSgpO2xldCBhPWUucHJlc2VydmVXaGl0ZXNwYWNlczt2b2lkIDA9PT1hJiYoYT1udWxsIT09aSYmdm9pZCAwIT09aS5wcmVzZXJ2ZVdoaXRlc3BhY2VzJiZpLnByZXNlcnZlV2hpdGVzcGFjZXMpO2xldCByPWUuZW5jYXBzdWxhdGlvbjt2b2lkIDA9PT1yJiYocj1udWxsIT09aSYmdm9pZCAwIT09aS5kZWZhdWx0RW5jYXBzdWxhdGlvbj9pLmRlZmF1bHRFbmNhcHN1bGF0aW9uOkhuLkVtdWxhdGVkKTtjb25zdCBzPWUudGVtcGxhdGVVcmx8fGBuZzovLy8ke3QubmFtZX0vdGVtcGxhdGUuaHRtbGAsbD1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbHkodCxlKSkse3R5cGVTb3VyY2VTcGFuOm8uY3JlYXRlUGFyc2VTb3VyY2VTcGFuKCJDb21wb25lbnQiLHQubmFtZSxzKSx0ZW1wbGF0ZTplLnRlbXBsYXRlfHwiIixwcmVzZXJ2ZVdoaXRlc3BhY2VzOmEsc3R5bGVzOmUuc3R5bGVzfHxXbixhbmltYXRpb25zOmUuYW5pbWF0aW9ucyxkaXJlY3RpdmVzOltdLGNoYW5nZURldGVjdGlvbjplLmNoYW5nZURldGVjdGlvbixwaXBlczpuZXcgTWFwLGVuY2Fwc3VsYXRpb246cixpbnRlcnBvbGF0aW9uOmUuaW50ZXJwb2xhdGlvbix2aWV3UHJvdmlkZXJzOmUudmlld1Byb3ZpZGVyc3x8bnVsbH0pO295Kys7dHJ5e2wudXNlc0luaGVyaXRhbmNlJiZjeSh0KSxuPW8uY29tcGlsZUNvbXBvbmVudChhYixzLGwpfWZpbmFsbHl7b3ktLX1pZigwPT09b3kmJihmdW5jdGlvbiBpKCl7aWYoIUdiKXtHYj0hMDt0cnl7Zm9yKGxldCB0PVViLmxlbmd0aC0xO3Q+PTA7dC0tKXtjb25zdHttb2R1bGVUeXBlOmUsbmdNb2R1bGU6bn09VWJbdF07bi5kZWNsYXJhdGlvbnMmJm4uZGVjbGFyYXRpb25zLmV2ZXJ5KFdiKSYmKFViLnNwbGljZSh0LDEpLFFiKGUsbikpfX1maW5hbGx5e0diPSExfX19KSgpLChmdW5jdGlvbiBhKHQpe3JldHVybiB2b2lkIDAhPT10Lm5nU2VsZWN0b3JTY29wZX0pKHQpKXtjb25zdCBlPXR5KHQubmdTZWxlY3RvclNjb3BlKTskYihuLGUpfX1yZXR1cm4gbn0sY29uZmlndXJhYmxlOiEhbmdEZXZNb2RlfSl9LER5PWl5LEV5PWZ1bmN0aW9uIFJ5KHQsZSl7bGV0IG49bnVsbCxvPW51bGw7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsSm4se2dldDooKT0+e2lmKG51bGw9PT1vKXtjb25zdCBuPV95KHQsZSksaT1KYSh7dXNhZ2U6MCxraW5kOiJwaXBlIix0eXBlOm4udHlwZX0pO289aS5jb21waWxlRmFjdG9yeShhYixgbmc6Ly8vJHtuLm5hbWV9L8m1ZmFjLmpzYCx7bmFtZTpuLm5hbWUsdHlwZTpuLnR5cGUsdHlwZUFyZ3VtZW50Q291bnQ6MCxkZXBzOk5yKHQpLHRhcmdldDppLkZhY3RvcnlUYXJnZXQuUGlwZX0pfXJldHVybiBvfSxjb25maWd1cmFibGU6ISFuZ0Rldk1vZGV9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxabix7Z2V0OigpPT57aWYobnVsbD09PW4pe2NvbnN0IG89X3kodCxlKSxpPUphKHt1c2FnZTowLGtpbmQ6InBpcGUiLHR5cGU6by50eXBlfSk7bj1pLmNvbXBpbGVQaXBlKGFiLGBuZzovLy8ke28ubmFtZX0vybVwaXBlLmpzYCxvKX1yZXR1cm4gbn0sY29uZmlndXJhYmxlOiEhbmdEZXZNb2RlfSl9LEF5PUZhKCJOZ01vZHVsZSIsKHQ9PnQpLHZvaWQgMCx2b2lkIDAsKCh0LGUpPT5UeSh0LGUpKSksVHk9ZnVuY3Rpb24gTnkodCxlPXt9KXshKGZ1bmN0aW9uIG4odCxlLG89ITEpe25nRGV2TW9kZSYmaG4odCwiUmVxdWlyZWQgdmFsdWUgbW9kdWxlVHlwZSIpLG5nRGV2TW9kZSYmaG4oZSwiUmVxdWlyZWQgdmFsdWUgbmdNb2R1bGUiKTtjb25zdCBpPXRyKGUuZGVjbGFyYXRpb25zfHxXbik7bGV0IGE9bnVsbDtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxYbix7Y29uZmlndXJhYmxlOiEwLGdldDooKT0+e2lmKG51bGw9PT1hKXtpZihuZ0Rldk1vZGUmJmUuaW1wb3J0cyYmZS5pbXBvcnRzLmluZGV4T2YodCk+LTEpdGhyb3cgbmV3IEVycm9yKGAnJHt0bih0KX0nIG1vZHVsZSBjYW4ndCBpbXBvcnQgaXRzZWxmYCk7Y29uc3Qgbj1KYSh7dXNhZ2U6MCxraW5kOiJOZ01vZHVsZSIsdHlwZTp0fSk7YT1uLmNvbXBpbGVOZ01vZHVsZShhYixgbmc6Ly8vJHt0Lm5hbWV9L8m1bW9kLmpzYCx7dHlwZTp0LGJvb3RzdHJhcDp0cihlLmJvb3RzdHJhcHx8V24pLm1hcChaZSksZGVjbGFyYXRpb25zOmkubWFwKFplKSxpbXBvcnRzOnRyKGUuaW1wb3J0c3x8V24pLm1hcChaZSkubWFwKGV5KSxleHBvcnRzOnRyKGUuZXhwb3J0c3x8V24pLm1hcChaZSkubWFwKGV5KSxzY2hlbWFzOmUuc2NoZW1hcz90cihlLnNjaGVtYXMpOm51bGwsaWQ6ZS5pZHx8bnVsbH0pLGEuc2NoZW1hc3x8KGEuc2NoZW1hcz1bXSl9cmV0dXJuIGF9fSk7bGV0IHI9bnVsbDtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxKbix7Z2V0OigpPT57aWYobnVsbD09PXIpe2NvbnN0IGU9SmEoe3VzYWdlOjAsa2luZDoiTmdNb2R1bGUiLHR5cGU6dH0pO3I9ZS5jb21waWxlRmFjdG9yeShhYixgbmc6Ly8vJHt0Lm5hbWV9L8m1ZmFjLmpzYCx7bmFtZTp0Lm5hbWUsdHlwZTp0LGRlcHM6TnIodCksdGFyZ2V0OmUuRmFjdG9yeVRhcmdldC5OZ01vZHVsZSx0eXBlQXJndW1lbnRDb3VudDowfSl9cmV0dXJuIHJ9LGNvbmZpZ3VyYWJsZTohIW5nRGV2TW9kZX0pO2xldCBzPW51bGw7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsa24se2dldDooKT0+e2lmKG51bGw9PT1zKXtuZ0Rldk1vZGUmJlliKHQsbyk7Y29uc3Qgbj17bmFtZTp0Lm5hbWUsdHlwZTp0LHByb3ZpZGVyczplLnByb3ZpZGVyc3x8V24saW1wb3J0czpbKGUuaW1wb3J0c3x8V24pLm1hcChaZSksKGUuZXhwb3J0c3x8V24pLm1hcChaZSldfSxpPUphKHt1c2FnZTowLGtpbmQ6Ik5nTW9kdWxlIix0eXBlOnR9KTtzPWkuY29tcGlsZUluamVjdG9yKGFiLGBuZzovLy8ke3QubmFtZX0vybVpbmouanNgLG4pfXJldHVybiBzfSxjb25maWd1cmFibGU6ISFuZ0Rldk1vZGV9KX0pKHQsZSksKGZ1bmN0aW9uIG8odCxlKXtVYi5wdXNoKHttb2R1bGVUeXBlOnQsbmdNb2R1bGU6ZX0pfSkodCxlKX0senk9bmV3IEdhKCJBcHBsaWNhdGlvbiBJbml0aWFsaXplciIpO2NsYXNzIEl5e2NvbnN0cnVjdG9yKHQpe3RoaXMuYXBwSW5pdHM9dCx0aGlzLnJlc29sdmU9ZmcsdGhpcy5yZWplY3Q9ZmcsdGhpcy5pbml0aWFsaXplZD0hMSx0aGlzLmRvbmU9ITEsdGhpcy5kb25lUHJvbWlzZT1uZXcgUHJvbWlzZSgoKHQsZSk9Pnt0aGlzLnJlc29sdmU9dCx0aGlzLnJlamVjdD1lfSkpfXJ1bkluaXRpYWxpemVycygpe2lmKHRoaXMuaW5pdGlhbGl6ZWQpcmV0dXJuO2NvbnN0IHQ9W10sZT0oKT0+e3RoaXMuZG9uZT0hMCx0aGlzLnJlc29sdmUoKX07aWYodGhpcy5hcHBJbml0cylmb3IobGV0IGU9MDtlPHRoaXMuYXBwSW5pdHMubGVuZ3RoO2UrKyl7Y29uc3Qgbj10aGlzLmFwcEluaXRzW2VdKCk7aWYoRm0obikpdC5wdXNoKG4pO2Vsc2UgaWYoQm0obikpe2NvbnN0IGU9bmV3IFByb21pc2UoKCh0LGUpPT57bi5zdWJzY3JpYmUoe2NvbXBsZXRlOnQsZXJyb3I6ZX0pfSkpO3QucHVzaChlKX19UHJvbWlzZS5hbGwodCkudGhlbigoKCk9PntlKCl9KSkuY2F0Y2goKHQ9Pnt0aGlzLnJlamVjdCh0KX0pKSwwPT09dC5sZW5ndGgmJmUoKSx0aGlzLmluaXRpYWxpemVkPSEwfX1JeS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SXkpKHZyKHp5LDgpKX0sSXkuybVwcm92PU1uKHt0b2tlbjpJeSxmYWN0b3J5Okl5Lsm1ZmFjfSksSXkuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbenldfSx7dHlwZTpTcn1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChJeSxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3p5XX0se3R5cGU6U3J9XX1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBIeT1uZXcgR2EoIkFwcElkIiksRnk9e3Byb3ZpZGU6SHksdXNlRmFjdG9yeTpmdW5jdGlvbiBMeSgpe3JldHVybmAke0J5KCl9JHtCeSgpfSR7QnkoKX1gfSxkZXBzOltdfTtmdW5jdGlvbiBCeSgpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKDk3K01hdGguZmxvb3IoMjUqTWF0aC5yYW5kb20oKSkpfWNvbnN0IFZ5PW5ldyBHYSgiUGxhdGZvcm0gSW5pdGlhbGl6ZXIiKSxqeT1uZXcgR2EoIlBsYXRmb3JtIElEIiksVXk9bmV3IEdhKCJhcHBCb290c3RyYXBMaXN0ZW5lciIpO25ldyBHYSgiQXBwbGljYXRpb24gUGFja2FnZXMgUm9vdCBVUkwiKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIEd5e2xvZyh0KXtjb25zb2xlLmxvZyh0KX13YXJuKHQpe2NvbnNvbGUud2Fybih0KX19R3kuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEd5KX0sR3kuybVwcm92PU1uKHt0b2tlbjpHeSxmYWN0b3J5Okd5Lsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChHeSxbe3R5cGU6aW19XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgV3k9bmV3IEdhKCJMb2NhbGVJZCIpLFl5PW5ldyBHYSgiRGVmYXVsdEN1cnJlbmN5Q29kZSIpO3ZhciBxeTtuZXcgR2EoIlRyYW5zbGF0aW9ucyIpLG5ldyBHYSgiVHJhbnNsYXRpb25zRm9ybWF0IiksKGZ1bmN0aW9uKHQpe3RbdC5FcnJvcj0wXT0iRXJyb3IiLHRbdC5XYXJuaW5nPTFdPSJXYXJuaW5nIix0W3QuSWdub3JlPTJdPSJJZ25vcmUifSkocXl8fChxeT17fSkpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgWnl7Y29uc3RydWN0b3IodCxlKXt0aGlzLm5nTW9kdWxlRmFjdG9yeT10LHRoaXMuY29tcG9uZW50RmFjdG9yaWVzPWV9fWNvbnN0IFh5PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgX2godCl9LEt5PVh5LEp5PWZ1bmN0aW9uKHQpe3JldHVybiBQcm9taXNlLnJlc29sdmUoWHkodCkpfSxReT1mdW5jdGlvbih0KXtjb25zdCBlPVh5KHQpLG49cmwoZm8odCkuZGVjbGFyYXRpb25zKS5yZWR1Y2UoKCh0LGUpPT57Y29uc3Qgbj1wbyhlKTtyZXR1cm4gbiYmdC5wdXNoKG5ldyBmaChuKSksdH0pLFtdKTtyZXR1cm4gbmV3IFp5KGUsbil9LCR5PVF5LHRfPWZ1bmN0aW9uKHQpe3JldHVybiBQcm9taXNlLnJlc29sdmUoUXkodCkpfTtjbGFzcyBlX3tjb25zdHJ1Y3Rvcigpe3RoaXMuY29tcGlsZU1vZHVsZVN5bmM9S3ksdGhpcy5jb21waWxlTW9kdWxlQXN5bmM9SnksdGhpcy5jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c1N5bmM9JHksdGhpcy5jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c0FzeW5jPXRffWNsZWFyQ2FjaGUoKXt9Y2xlYXJDYWNoZUZvcih0KXt9Z2V0TW9kdWxlSWQodCl7fX1lXy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8ZV8pfSxlXy7JtXByb3Y9TW4oe3Rva2VuOmVfLGZhY3Rvcnk6ZV8uybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGVfLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVybltdfSksbnVsbCk7Y29uc3Qgbl89bmV3IEdhKCJjb21waWxlck9wdGlvbnMiKSxvXz1Qcm9taXNlLnJlc29sdmUoMCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIGlfKHQpeyJ1bmRlZmluZWQiPT10eXBlb2YgWm9uZT9vXy50aGVuKCgoKT0+e3QmJnQuYXBwbHkobnVsbCxudWxsKX0pKTpab25lLmN1cnJlbnQuc2NoZWR1bGVNaWNyb1Rhc2soInNjaGVkdWxlTWljcm90YXNrIix0KX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBhX3tjb25zdHJ1Y3Rvcih7ZW5hYmxlTG9uZ1N0YWNrVHJhY2U6dD0hMSxzaG91bGRDb2FsZXNjZUV2ZW50Q2hhbmdlRGV0ZWN0aW9uOmU9ITEsc2hvdWxkQ29hbGVzY2VSdW5DaGFuZ2VEZXRlY3Rpb246bj0hMX0pe2lmKHRoaXMuaGFzUGVuZGluZ01hY3JvdGFza3M9ITEsdGhpcy5oYXNQZW5kaW5nTWljcm90YXNrcz0hMSx0aGlzLmlzU3RhYmxlPSEwLHRoaXMub25VbnN0YWJsZT1uZXcgTGgoITEpLHRoaXMub25NaWNyb3Rhc2tFbXB0eT1uZXcgTGgoITEpLHRoaXMub25TdGFibGU9bmV3IExoKCExKSx0aGlzLm9uRXJyb3I9bmV3IExoKCExKSwidW5kZWZpbmVkIj09dHlwZW9mIFpvbmUpdGhyb3cgbmV3IEVycm9yKCJJbiB0aGlzIGNvbmZpZ3VyYXRpb24gQW5ndWxhciByZXF1aXJlcyBab25lLmpzIik7Wm9uZS5hc3NlcnRab25lUGF0Y2hlZCgpO2NvbnN0IG89dGhpcztvLl9uZXN0aW5nPTAsby5fb3V0ZXI9by5faW5uZXI9Wm9uZS5jdXJyZW50LFpvbmUuVGFza1RyYWNraW5nWm9uZVNwZWMmJihvLl9pbm5lcj1vLl9pbm5lci5mb3JrKG5ldyBab25lLlRhc2tUcmFja2luZ1pvbmVTcGVjKSksdCYmWm9uZS5sb25nU3RhY2tUcmFjZVpvbmVTcGVjJiYoby5faW5uZXI9by5faW5uZXIuZm9yayhab25lLmxvbmdTdGFja1RyYWNlWm9uZVNwZWMpKSxvLnNob3VsZENvYWxlc2NlRXZlbnRDaGFuZ2VEZXRlY3Rpb249IW4mJmUsby5zaG91bGRDb2FsZXNjZVJ1bkNoYW5nZURldGVjdGlvbj1uLG8ubGFzdFJlcXVlc3RBbmltYXRpb25GcmFtZUlkPS0xLG8ubmF0aXZlUmVxdWVzdEFuaW1hdGlvbkZyYW1lPShmdW5jdGlvbiBpKCl7bGV0IHQ9am4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lLGU9am4uY2FuY2VsQW5pbWF0aW9uRnJhbWU7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBab25lJiZ0JiZlKXtjb25zdCBuPXRbWm9uZS5fX3N5bWJvbF9fKCJPcmlnaW5hbERlbGVnYXRlIildO24mJih0PW4pO2NvbnN0IG89ZVtab25lLl9fc3ltYm9sX18oIk9yaWdpbmFsRGVsZWdhdGUiKV07byYmKGU9byl9cmV0dXJue25hdGl2ZVJlcXVlc3RBbmltYXRpb25GcmFtZTp0LG5hdGl2ZUNhbmNlbEFuaW1hdGlvbkZyYW1lOmV9fSkoKS5uYXRpdmVSZXF1ZXN0QW5pbWF0aW9uRnJhbWUsKGZ1bmN0aW9uIGEodCl7Y29uc3QgZT0oKT0+eyEoZnVuY3Rpb24gZSh0KXt0LmlzQ2hlY2tTdGFibGVSdW5uaW5nfHwtMSE9PXQubGFzdFJlcXVlc3RBbmltYXRpb25GcmFtZUlkfHwodC5sYXN0UmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQ9dC5uYXRpdmVSZXF1ZXN0QW5pbWF0aW9uRnJhbWUuY2FsbChqbiwoKCk9Pnt0LmZha2VUb3BFdmVudFRhc2t8fCh0LmZha2VUb3BFdmVudFRhc2s9Wm9uZS5yb290LnNjaGVkdWxlRXZlbnRUYXNrKCJmYWtlVG9wRXZlbnRUYXNrIiwoKCk9Pnt0Lmxhc3RSZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZD0tMSxsXyh0KSx0LmlzQ2hlY2tTdGFibGVSdW5uaW5nPSEwLHNfKHQpLHQuaXNDaGVja1N0YWJsZVJ1bm5pbmc9ITF9KSx2b2lkIDAsKCgpPT57fSksKCgpPT57fSkpKSx0LmZha2VUb3BFdmVudFRhc2suaW52b2tlKCl9KSksbF8odCkpfSkodCl9O3QuX2lubmVyPXQuX2lubmVyLmZvcmsoe25hbWU6ImFuZ3VsYXIiLHByb3BlcnRpZXM6e2lzQW5ndWxhclpvbmU6ITB9LG9uSW52b2tlVGFzazoobixvLGksYSxyLHMpPT57dHJ5e3JldHVybiBjXyh0KSxuLmludm9rZVRhc2soaSxhLHIscyl9ZmluYWxseXsodC5zaG91bGRDb2FsZXNjZUV2ZW50Q2hhbmdlRGV0ZWN0aW9uJiYiZXZlbnRUYXNrIj09PWEudHlwZXx8dC5zaG91bGRDb2FsZXNjZVJ1bkNoYW5nZURldGVjdGlvbikmJmUoKSxkXyh0KX19LG9uSW52b2tlOihuLG8saSxhLHIscyxsKT0+e3RyeXtyZXR1cm4gY18odCksbi5pbnZva2UoaSxhLHIscyxsKX1maW5hbGx5e3Quc2hvdWxkQ29hbGVzY2VSdW5DaGFuZ2VEZXRlY3Rpb24mJmUoKSxkXyh0KX19LG9uSGFzVGFzazooZSxuLG8saSk9PntlLmhhc1Rhc2sobyxpKSxuPT09byYmKCJtaWNyb1Rhc2siPT1pLmNoYW5nZT8odC5faGFzUGVuZGluZ01pY3JvdGFza3M9aS5taWNyb1Rhc2ssbF8odCksc18odCkpOiJtYWNyb1Rhc2siPT1pLmNoYW5nZSYmKHQuaGFzUGVuZGluZ01hY3JvdGFza3M9aS5tYWNyb1Rhc2spKX0sb25IYW5kbGVFcnJvcjooZSxuLG8saSk9PihlLmhhbmRsZUVycm9yKG8saSksdC5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PnQub25FcnJvci5lbWl0KGkpKSksITEpfSl9KShvKX1zdGF0aWMgaXNJbkFuZ3VsYXJab25lKCl7cmV0dXJuITA9PT1ab25lLmN1cnJlbnQuZ2V0KCJpc0FuZ3VsYXJab25lIil9c3RhdGljIGFzc2VydEluQW5ndWxhclpvbmUoKXtpZighYV8uaXNJbkFuZ3VsYXJab25lKCkpdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCB0byBiZSBpbiBBbmd1bGFyIFpvbmUsIGJ1dCBpdCBpcyBub3QhIil9c3RhdGljIGFzc2VydE5vdEluQW5ndWxhclpvbmUoKXtpZihhXy5pc0luQW5ndWxhclpvbmUoKSl0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIHRvIG5vdCBiZSBpbiBBbmd1bGFyIFpvbmUsIGJ1dCBpdCBpcyEiKX1ydW4odCxlLG4pe3JldHVybiB0aGlzLl9pbm5lci5ydW4odCxlLG4pfXJ1blRhc2sodCxlLG4sbyl7Y29uc3QgaT10aGlzLl9pbm5lcixhPWkuc2NoZWR1bGVFdmVudFRhc2soIk5nWm9uZUV2ZW50OiAiK28sdCxyXyxmZyxmZyk7dHJ5e3JldHVybiBpLnJ1blRhc2soYSxlLG4pfWZpbmFsbHl7aS5jYW5jZWxUYXNrKGEpfX1ydW5HdWFyZGVkKHQsZSxuKXtyZXR1cm4gdGhpcy5faW5uZXIucnVuR3VhcmRlZCh0LGUsbil9cnVuT3V0c2lkZUFuZ3VsYXIodCl7cmV0dXJuIHRoaXMuX291dGVyLnJ1bih0KX19Y29uc3Qgcl89e307ZnVuY3Rpb24gc18odCl7aWYoMD09dC5fbmVzdGluZyYmIXQuaGFzUGVuZGluZ01pY3JvdGFza3MmJiF0LmlzU3RhYmxlKXRyeXt0Ll9uZXN0aW5nKyssdC5vbk1pY3JvdGFza0VtcHR5LmVtaXQobnVsbCl9ZmluYWxseXtpZih0Ll9uZXN0aW5nLS0sIXQuaGFzUGVuZGluZ01pY3JvdGFza3MpdHJ5e3QucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT50Lm9uU3RhYmxlLmVtaXQobnVsbCkpKX1maW5hbGx5e3QuaXNTdGFibGU9ITB9fX1mdW5jdGlvbiBsXyh0KXt0Lmhhc1BlbmRpbmdNaWNyb3Rhc2tzPSEhKHQuX2hhc1BlbmRpbmdNaWNyb3Rhc2tzfHwodC5zaG91bGRDb2FsZXNjZUV2ZW50Q2hhbmdlRGV0ZWN0aW9ufHx0LnNob3VsZENvYWxlc2NlUnVuQ2hhbmdlRGV0ZWN0aW9uKSYmLTEhPT10Lmxhc3RSZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCl9ZnVuY3Rpb24gY18odCl7dC5fbmVzdGluZysrLHQuaXNTdGFibGUmJih0LmlzU3RhYmxlPSExLHQub25VbnN0YWJsZS5lbWl0KG51bGwpKX1mdW5jdGlvbiBkXyh0KXt0Ll9uZXN0aW5nLS0sc18odCl9Y2xhc3MgcF97Y29uc3RydWN0b3IoKXt0aGlzLmhhc1BlbmRpbmdNaWNyb3Rhc2tzPSExLHRoaXMuaGFzUGVuZGluZ01hY3JvdGFza3M9ITEsdGhpcy5pc1N0YWJsZT0hMCx0aGlzLm9uVW5zdGFibGU9bmV3IExoLHRoaXMub25NaWNyb3Rhc2tFbXB0eT1uZXcgTGgsdGhpcy5vblN0YWJsZT1uZXcgTGgsdGhpcy5vbkVycm9yPW5ldyBMaH1ydW4odCxlLG4pe3JldHVybiB0LmFwcGx5KGUsbil9cnVuR3VhcmRlZCh0LGUsbil7cmV0dXJuIHQuYXBwbHkoZSxuKX1ydW5PdXRzaWRlQW5ndWxhcih0KXtyZXR1cm4gdCgpfXJ1blRhc2sodCxlLG4sbyl7cmV0dXJuIHQuYXBwbHkoZSxuKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIG1fe2NvbnN0cnVjdG9yKHQpe3RoaXMuX25nWm9uZT10LHRoaXMuX3BlbmRpbmdDb3VudD0wLHRoaXMuX2lzWm9uZVN0YWJsZT0hMCx0aGlzLl9kaWRXb3JrPSExLHRoaXMuX2NhbGxiYWNrcz1bXSx0aGlzLnRhc2tUcmFja2luZ1pvbmU9bnVsbCx0aGlzLl93YXRjaEFuZ3VsYXJFdmVudHMoKSx0LnJ1bigoKCk9Pnt0aGlzLnRhc2tUcmFja2luZ1pvbmU9InVuZGVmaW5lZCI9PXR5cGVvZiBab25lP251bGw6Wm9uZS5jdXJyZW50LmdldCgiVGFza1RyYWNraW5nWm9uZSIpfSkpfV93YXRjaEFuZ3VsYXJFdmVudHMoKXt0aGlzLl9uZ1pvbmUub25VbnN0YWJsZS5zdWJzY3JpYmUoe25leHQ6KCk9Pnt0aGlzLl9kaWRXb3JrPSEwLHRoaXMuX2lzWm9uZVN0YWJsZT0hMX19KSx0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT57dGhpcy5fbmdab25lLm9uU3RhYmxlLnN1YnNjcmliZSh7bmV4dDooKT0+e2FfLmFzc2VydE5vdEluQW5ndWxhclpvbmUoKSxpXygoKCk9Pnt0aGlzLl9pc1pvbmVTdGFibGU9ITAsdGhpcy5fcnVuQ2FsbGJhY2tzSWZSZWFkeSgpfSkpfX0pfSkpfWluY3JlYXNlUGVuZGluZ1JlcXVlc3RDb3VudCgpe3JldHVybiB0aGlzLl9wZW5kaW5nQ291bnQrPTEsdGhpcy5fZGlkV29yaz0hMCx0aGlzLl9wZW5kaW5nQ291bnR9ZGVjcmVhc2VQZW5kaW5nUmVxdWVzdENvdW50KCl7aWYodGhpcy5fcGVuZGluZ0NvdW50LT0xLHRoaXMuX3BlbmRpbmdDb3VudDwwKXRocm93IG5ldyBFcnJvcigicGVuZGluZyBhc3luYyByZXF1ZXN0cyBiZWxvdyB6ZXJvIik7cmV0dXJuIHRoaXMuX3J1bkNhbGxiYWNrc0lmUmVhZHkoKSx0aGlzLl9wZW5kaW5nQ291bnR9aXNTdGFibGUoKXtyZXR1cm4gdGhpcy5faXNab25lU3RhYmxlJiYwPT09dGhpcy5fcGVuZGluZ0NvdW50JiYhdGhpcy5fbmdab25lLmhhc1BlbmRpbmdNYWNyb3Rhc2tzfV9ydW5DYWxsYmFja3NJZlJlYWR5KCl7aWYodGhpcy5pc1N0YWJsZSgpKWlfKCgoKT0+e2Zvcig7MCE9PXRoaXMuX2NhbGxiYWNrcy5sZW5ndGg7KXtsZXQgdD10aGlzLl9jYWxsYmFja3MucG9wKCk7Y2xlYXJUaW1lb3V0KHQudGltZW91dElkKSx0LmRvbmVDYih0aGlzLl9kaWRXb3JrKX10aGlzLl9kaWRXb3JrPSExfSkpO2Vsc2V7bGV0IHQ9dGhpcy5nZXRQZW5kaW5nVGFza3MoKTt0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzLmZpbHRlcigoZT0+IWUudXBkYXRlQ2J8fCFlLnVwZGF0ZUNiKHQpfHwoY2xlYXJUaW1lb3V0KGUudGltZW91dElkKSwhMSkpKSx0aGlzLl9kaWRXb3JrPSEwfX1nZXRQZW5kaW5nVGFza3MoKXtyZXR1cm4gdGhpcy50YXNrVHJhY2tpbmdab25lP3RoaXMudGFza1RyYWNraW5nWm9uZS5tYWNyb1Rhc2tzLm1hcCgodD0+KHtzb3VyY2U6dC5zb3VyY2UsY3JlYXRpb25Mb2NhdGlvbjp0LmNyZWF0aW9uTG9jYXRpb24sZGF0YTp0LmRhdGF9KSkpOltdfWFkZENhbGxiYWNrKHQsZSxuKXtsZXQgbz0tMTtlJiZlPjAmJihvPXNldFRpbWVvdXQoKCgpPT57dGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrcy5maWx0ZXIoKHQ9PnQudGltZW91dElkIT09bykpLHQodGhpcy5fZGlkV29yayx0aGlzLmdldFBlbmRpbmdUYXNrcygpKX0pLGUpKSx0aGlzLl9jYWxsYmFja3MucHVzaCh7ZG9uZUNiOnQsdGltZW91dElkOm8sdXBkYXRlQ2I6bn0pfXdoZW5TdGFibGUodCxlLG4pe2lmKG4mJiF0aGlzLnRhc2tUcmFja2luZ1pvbmUpdGhyb3cgbmV3IEVycm9yKCdUYXNrIHRyYWNraW5nIHpvbmUgaXMgcmVxdWlyZWQgd2hlbiBwYXNzaW5nIGFuIHVwZGF0ZSBjYWxsYmFjayB0byB3aGVuU3RhYmxlKCkuIElzICJ6b25lLmpzL3BsdWdpbnMvdGFzay10cmFja2luZyIgbG9hZGVkPycpO3RoaXMuYWRkQ2FsbGJhY2sodCxlLG4pLHRoaXMuX3J1bkNhbGxiYWNrc0lmUmVhZHkoKX1nZXRQZW5kaW5nUmVxdWVzdENvdW50KCl7cmV0dXJuIHRoaXMuX3BlbmRpbmdDb3VudH1maW5kUHJvdmlkZXJzKHQsZSxuKXtyZXR1cm5bXX19bV8uybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fG1fKSh2cihhXykpfSxtXy7JtXByb3Y9TW4oe3Rva2VuOm1fLGZhY3Rvcnk6bV8uybVmYWN9KSxtXy5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmFffV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChtXyxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6YV99XX0pLG51bGwpO2NsYXNzIHVfe2NvbnN0cnVjdG9yKCl7dGhpcy5fYXBwbGljYXRpb25zPW5ldyBNYXAsZ18uYWRkVG9XaW5kb3codGhpcyl9cmVnaXN0ZXJBcHBsaWNhdGlvbih0LGUpe3RoaXMuX2FwcGxpY2F0aW9ucy5zZXQodCxlKX11bnJlZ2lzdGVyQXBwbGljYXRpb24odCl7dGhpcy5fYXBwbGljYXRpb25zLmRlbGV0ZSh0KX11bnJlZ2lzdGVyQWxsQXBwbGljYXRpb25zKCl7dGhpcy5fYXBwbGljYXRpb25zLmNsZWFyKCl9Z2V0VGVzdGFiaWxpdHkodCl7cmV0dXJuIHRoaXMuX2FwcGxpY2F0aW9ucy5nZXQodCl8fG51bGx9Z2V0QWxsVGVzdGFiaWxpdGllcygpe3JldHVybiBBcnJheS5mcm9tKHRoaXMuX2FwcGxpY2F0aW9ucy52YWx1ZXMoKSl9Z2V0QWxsUm9vdEVsZW1lbnRzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5fYXBwbGljYXRpb25zLmtleXMoKSl9ZmluZFRlc3RhYmlsaXR5SW5UcmVlKHQsZT0hMCl7cmV0dXJuIGdfLmZpbmRUZXN0YWJpbGl0eUluVHJlZSh0aGlzLHQsZSl9fXVfLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx1Xyl9LHVfLsm1cHJvdj1Nbih7dG9rZW46dV8sZmFjdG9yeTp1Xy7JtWZhY30pLHVfLmN0b3JQYXJhbWV0ZXJzPSgpPT5bXSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHVfLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVybltdfSksbnVsbCk7bGV0IGZfLGdfPW5ldyBjbGFzc3thZGRUb1dpbmRvdyh0KXt9ZmluZFRlc3RhYmlsaXR5SW5UcmVlKHQsZSxuKXtyZXR1cm4gbnVsbH19LGhfPSEwLGJfPSExOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiB5Xygpe3JldHVybiBiXz0hMCxoX31jb25zdCBfXz1uZXcgR2EoIkFsbG93TXVsdGlwbGVUb2tlbiIpO2Z1bmN0aW9uIENfKHQsZSxuPVtdKXtjb25zdCBvPWBQbGF0Zm9ybTogJHtlfWAsaT1uZXcgR2Eobyk7cmV0dXJuKGU9W10pPT57bGV0IGE9TV8oKTtpZighYXx8YS5pbmplY3Rvci5nZXQoX18sITEpKWlmKHQpdChuLmNvbmNhdChlKS5jb25jYXQoe3Byb3ZpZGU6aSx1c2VWYWx1ZTohMH0pKTtlbHNle2NvbnN0IHQ9bi5jb25jYXQoZSkuY29uY2F0KHtwcm92aWRlOmksdXNlVmFsdWU6ITB9LHtwcm92aWRlOllkLHVzZVZhbHVlOiJwbGF0Zm9ybSJ9KTshKGZ1bmN0aW9uIHIodCl7aWYoZl8mJiFmXy5kZXN0cm95ZWQmJiFmXy5pbmplY3Rvci5nZXQoX18sITEpKXRocm93IG5ldyBFcnJvcigiVGhlcmUgY2FuIGJlIG9ubHkgb25lIHBsYXRmb3JtLiBEZXN0cm95IHRoZSBwcmV2aW91cyBvbmUgdG8gY3JlYXRlIGEgbmV3IG9uZS4iKTsoZnVuY3Rpb24gZSgpe25nRGV2TW9kZSYmKGZ1bmN0aW9uIHQoKXtfcHx8KF9wPSEwLENwKCLJtXNldFByb2ZpbGVyIixZbyksQ3AoImdldERpcmVjdGl2ZU1ldGFkYXRhIix1cCksQ3AoImdldENvbXBvbmVudCIsc3ApLENwKCJnZXRDb250ZXh0IixscCksQ3AoImdldExpc3RlbmVycyIsZ3ApLENwKCJnZXRPd25pbmdDb21wb25lbnQiLGNwKSxDcCgiZ2V0SG9zdEVsZW1lbnQiLGZwKSxDcCgiZ2V0SW5qZWN0b3IiLHBwKSxDcCgiZ2V0Um9vdENvbXBvbmVudHMiLGRwKSxDcCgiZ2V0RGlyZWN0aXZlcyIsbXApLENwKCJhcHBseUNoYW5nZXMiLHlwKSl9KSgpfSkoKSxmXz10LmdldCh2Xyk7Y29uc3Qgbj10LmdldChWeSxudWxsKTtuJiZuLmZvckVhY2goKHQ9PnQoKSkpfSkocnAuY3JlYXRlKHtwcm92aWRlcnM6dCxuYW1lOm99KSl9cmV0dXJuKGZ1bmN0aW9uIHModCl7Y29uc3QgZT1NXygpO2lmKCFlKXRocm93IG5ldyBFcnJvcigiTm8gcGxhdGZvcm0gZXhpc3RzISIpO2lmKCFlLmluamVjdG9yLmdldCh0LG51bGwpKXRocm93IG5ldyBFcnJvcigiQSBwbGF0Zm9ybSB3aXRoIGEgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gY3JlYXRlZC4gUGxlYXNlIGRlc3Ryb3kgaXQgZmlyc3QuIik7cmV0dXJuIGV9KShpKX19ZnVuY3Rpb24gTV8oKXtyZXR1cm4gZl8mJiFmXy5kZXN0cm95ZWQ/Zl86bnVsbH1jbGFzcyB2X3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl9pbmplY3Rvcj10LHRoaXMuX21vZHVsZXM9W10sdGhpcy5fZGVzdHJveUxpc3RlbmVycz1bXSx0aGlzLl9kZXN0cm95ZWQ9ITF9Ym9vdHN0cmFwTW9kdWxlRmFjdG9yeSh0LGUpe2NvbnN0IG49KGZ1bmN0aW9uIG8odCxlKXtsZXQgbjtyZXR1cm4gbj0ibm9vcCI9PT10P25ldyBwXzooInpvbmUuanMiPT09dD92b2lkIDA6dCl8fG5ldyBhXyh7ZW5hYmxlTG9uZ1N0YWNrVHJhY2U6eV8oKSxzaG91bGRDb2FsZXNjZUV2ZW50Q2hhbmdlRGV0ZWN0aW9uOiEhKG51bGw9PWU/dm9pZCAwOmUubmdab25lRXZlbnRDb2FsZXNjaW5nKSxzaG91bGRDb2FsZXNjZVJ1bkNoYW5nZURldGVjdGlvbjohIShudWxsPT1lP3ZvaWQgMDplLm5nWm9uZVJ1bkNvYWxlc2NpbmcpfSksbn0pKGU/ZS5uZ1pvbmU6dm9pZCAwLHtuZ1pvbmVFdmVudENvYWxlc2Npbmc6ZSYmZS5uZ1pvbmVFdmVudENvYWxlc2Npbmd8fCExLG5nWm9uZVJ1bkNvYWxlc2Npbmc6ZSYmZS5uZ1pvbmVSdW5Db2FsZXNjaW5nfHwhMX0pLGk9W3twcm92aWRlOmFfLHVzZVZhbHVlOm59XTtyZXR1cm4gbi5ydW4oKCgpPT57Y29uc3QgZT1ycC5jcmVhdGUoe3Byb3ZpZGVyczppLHBhcmVudDp0aGlzLmluamVjdG9yLG5hbWU6dC5tb2R1bGVUeXBlLm5hbWV9KSxvPXQuY3JlYXRlKGUpLGE9by5pbmplY3Rvci5nZXQoWnMsbnVsbCk7aWYoIWEpdGhyb3cgbmV3IEVycm9yKCJObyBFcnJvckhhbmRsZXIuIElzIHBsYXRmb3JtIG1vZHVsZSAoQnJvd3Nlck1vZHVsZSkgaW5jbHVkZWQ/Iik7cmV0dXJuIG4ucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT57Y29uc3QgdD1uLm9uRXJyb3Iuc3Vic2NyaWJlKHtuZXh0OnQ9PnthLmhhbmRsZUVycm9yKHQpfX0pO28ub25EZXN0cm95KCgoKT0+e1BfKHRoaXMuX21vZHVsZXMsbyksdC51bnN1YnNjcmliZSgpfSkpfSkpLChmdW5jdGlvbiByKHQsZSxuKXt0cnl7Y29uc3Qgbz1uKCk7cmV0dXJuIEZtKG8pP28uY2F0Y2goKG49Pnt0aHJvdyBlLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+dC5oYW5kbGVFcnJvcihuKSkpLG59KSk6b31jYXRjaChuKXt0aHJvdyBlLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+dC5oYW5kbGVFcnJvcihuKSkpLG59fSkoYSxuLCgoKT0+e2NvbnN0IHQ9by5pbmplY3Rvci5nZXQoSXkpO3JldHVybiB0LnJ1bkluaXRpYWxpemVycygpLHQuZG9uZVByb21pc2UudGhlbigoKCk9PihYdShvLmluamVjdG9yLmdldChXeSxHdSl8fEd1KSx0aGlzLl9tb2R1bGVEb0Jvb3RzdHJhcChvKSxvKSkpfSkpfSkpfWJvb3RzdHJhcE1vZHVsZSh0LGU9W10pe2NvbnN0IG49eF8oe30sZSk7cmV0dXJuKGZ1bmN0aW9uIG8odCxlLG4pe25nRGV2TW9kZSYmKGZ1bmN0aW9uIG8odCxlPSJUeXBlIHBhc3NlZCBpbiBpcyBub3QgTmdNb2R1bGVUeXBlLCBpdCBkb2VzIG5vdCBoYXZlICfJtW1vZCcgcHJvcGVydHkuIil7Zm8odCl8fGJuKGUpfSkobik7Y29uc3QgaT1uZXcgX2gobik7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBuZ0ppdE1vZGUmJiFuZ0ppdE1vZGUpcmV0dXJuIFByb21pc2UucmVzb2x2ZShpKTtjb25zdCBhPXQuZ2V0KG5fLFtdKS5jb25jYXQoZSk7aWYoKGZ1bmN0aW9uIHIodCl7aWYobnVsbCE9PWpiKXtpZih0LmRlZmF1bHRFbmNhcHN1bGF0aW9uIT09amIuZGVmYXVsdEVuY2Fwc3VsYXRpb24pcmV0dXJuIHZvaWQobmdEZXZNb2RlJiZjb25zb2xlLmVycm9yKCJQcm92aWRlZCB2YWx1ZSBmb3IgYGRlZmF1bHRFbmNhcHN1bGF0aW9uYCBjYW4gbm90IGJlIGNoYW5nZWQgb25jZSBpdCBoYXMgYmVlbiBzZXQuIikpO2lmKHQucHJlc2VydmVXaGl0ZXNwYWNlcyE9PWpiLnByZXNlcnZlV2hpdGVzcGFjZXMpcmV0dXJuIHZvaWQobmdEZXZNb2RlJiZjb25zb2xlLmVycm9yKCJQcm92aWRlZCB2YWx1ZSBmb3IgYHByZXNlcnZlV2hpdGVzcGFjZXNgIGNhbiBub3QgYmUgY2hhbmdlZCBvbmNlIGl0IGhhcyBiZWVuIHNldC4iKSl9amI9dH0pKHtkZWZhdWx0RW5jYXBzdWxhdGlvbjp3XyhhLm1hcCgodD0+dC5kZWZhdWx0RW5jYXBzdWxhdGlvbikpKSxwcmVzZXJ2ZVdoaXRlc3BhY2VzOndfKGEubWFwKCh0PT50LnByZXNlcnZlV2hpdGVzcGFjZXMpKSl9KSwoZnVuY3Rpb24gcygpe3JldHVybiAwPT09SXIuc2l6ZX0pKCkpcmV0dXJuIFByb21pc2UucmVzb2x2ZShpKTtjb25zdCBsPShmdW5jdGlvbiBjKHQpe2NvbnN0IGU9W107cmV0dXJuIHQuZm9yRWFjaCgodD0+dCYmZS5wdXNoKC4uLnQpKSksZX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKShhLm1hcCgodD0+dC5wcm92aWRlcnMpKSk7aWYoMD09PWwubGVuZ3RoKXJldHVybiBQcm9taXNlLnJlc29sdmUoaSk7Y29uc3QgZD1KYSh7dXNhZ2U6MCxraW5kOiJOZ01vZHVsZSIsdHlwZTpufSkscD1ycC5jcmVhdGUoe3Byb3ZpZGVyczpsfSkuZ2V0KGQuUmVzb3VyY2VMb2FkZXIpO3JldHVybihmdW5jdGlvbiBtKHQpe2NvbnN0IGU9W10sbj1uZXcgTWFwO2Z1bmN0aW9uIG8oZSl7bGV0IG89bi5nZXQoZSk7aWYoIW8pe2NvbnN0IGk9dChlKTtuLnNldChlLG89aS50aGVuKExyKSl9cmV0dXJuIG99cmV0dXJuIElyLmZvckVhY2goKCh0LG4pPT57Y29uc3QgaT1bXTt0LnRlbXBsYXRlVXJsJiZpLnB1c2gobyh0LnRlbXBsYXRlVXJsKS50aGVuKChlPT57dC50ZW1wbGF0ZT1lfSkpKTtjb25zdCBhPXQuc3R5bGVVcmxzLHI9dC5zdHlsZXN8fCh0LnN0eWxlcz1bXSkscz10LnN0eWxlcy5sZW5ndGg7YSYmYS5mb3JFYWNoKCgoZSxuKT0+e3IucHVzaCgiIiksaS5wdXNoKG8oZSkudGhlbigobz0+e3JbcytuXT1vLGEuc3BsaWNlKGEuaW5kZXhPZihlKSwxKSwwPT1hLmxlbmd0aCYmKHQuc3R5bGVVcmxzPXZvaWQgMCl9KSkpfSkpO2NvbnN0IGw9UHJvbWlzZS5hbGwoaSkudGhlbigoKCk9PihmdW5jdGlvbiB0KGUpe0hyLmRlbGV0ZShlKX0pKG4pKSk7ZS5wdXNoKGwpfSkpLChmdW5jdGlvbiBpKCl7SXI9bmV3IE1hcH0pKCksUHJvbWlzZS5hbGwoZSkudGhlbigoKCk9Pnt9KSl9KSgodD0+UHJvbWlzZS5yZXNvbHZlKHAuZ2V0KHQpKSkpLnRoZW4oKCgpPT5pKSl9KSh0aGlzLmluamVjdG9yLG4sdCkudGhlbigodD0+dGhpcy5ib290c3RyYXBNb2R1bGVGYWN0b3J5KHQsbikpKX1fbW9kdWxlRG9Cb290c3RyYXAodCl7Y29uc3QgZT10LmluamVjdG9yLmdldChPXyk7aWYodC5fYm9vdHN0cmFwQ29tcG9uZW50cy5sZW5ndGg+MCl0Ll9ib290c3RyYXBDb21wb25lbnRzLmZvckVhY2goKHQ9PmUuYm9vdHN0cmFwKHQpKSk7ZWxzZXtpZighdC5pbnN0YW5jZS5uZ0RvQm9vdHN0cmFwKXRocm93IG5ldyBFcnJvcihgVGhlIG1vZHVsZSAke0dlKHQuaW5zdGFuY2UuY29uc3RydWN0b3IpfSB3YXMgYm9vdHN0cmFwcGVkLCBidXQgaXQgZG9lcyBub3QgZGVjbGFyZSAiQE5nTW9kdWxlLmJvb3RzdHJhcCIgY29tcG9uZW50cyBub3IgYSAibmdEb0Jvb3RzdHJhcCIgbWV0aG9kLiBQbGVhc2UgZGVmaW5lIG9uZSBvZiB0aGVzZS5gKTt0Lmluc3RhbmNlLm5nRG9Cb290c3RyYXAoZSl9dGhpcy5fbW9kdWxlcy5wdXNoKHQpfW9uRGVzdHJveSh0KXt0aGlzLl9kZXN0cm95TGlzdGVuZXJzLnB1c2godCl9Z2V0IGluamVjdG9yKCl7cmV0dXJuIHRoaXMuX2luamVjdG9yfWRlc3Ryb3koKXtpZih0aGlzLl9kZXN0cm95ZWQpdGhyb3cgbmV3IEVycm9yKCJUaGUgcGxhdGZvcm0gaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQhIik7dGhpcy5fbW9kdWxlcy5zbGljZSgpLmZvckVhY2goKHQ9PnQuZGVzdHJveSgpKSksdGhpcy5fZGVzdHJveUxpc3RlbmVycy5mb3JFYWNoKCh0PT50KCkpKSx0aGlzLl9kZXN0cm95ZWQ9ITB9Z2V0IGRlc3Ryb3llZCgpe3JldHVybiB0aGlzLl9kZXN0cm95ZWR9fWZ1bmN0aW9uIHhfKHQsZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZS5yZWR1Y2UoeF8sdCk6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLGUpfXZfLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx2XykodnIocnApKX0sdl8uybVwcm92PU1uKHt0b2tlbjp2XyxmYWN0b3J5OnZfLsm1ZmFjfSksdl8uY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpycH1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodl8sW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnJwfV19KSxudWxsKTtjbGFzcyBPX3tjb25zdHJ1Y3Rvcih0LGUsbixvLGkpe3RoaXMuX3pvbmU9dCx0aGlzLl9pbmplY3Rvcj1lLHRoaXMuX2V4Y2VwdGlvbkhhbmRsZXI9bix0aGlzLl9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI9byx0aGlzLl9pbml0U3RhdHVzPWksdGhpcy5fYm9vdHN0cmFwTGlzdGVuZXJzPVtdLHRoaXMuX3ZpZXdzPVtdLHRoaXMuX3J1bm5pbmdUaWNrPSExLHRoaXMuX3N0YWJsZT0hMCx0aGlzLmNvbXBvbmVudFR5cGVzPVtdLHRoaXMuY29tcG9uZW50cz1bXSx0aGlzLl9vbk1pY3JvdGFza0VtcHR5U3Vic2NyaXB0aW9uPXRoaXMuX3pvbmUub25NaWNyb3Rhc2tFbXB0eS5zdWJzY3JpYmUoe25leHQ6KCk9Pnt0aGlzLl96b25lLnJ1bigoKCk9Pnt0aGlzLnRpY2soKX0pKX19KTtjb25zdCBhPW5ldyBEKCh0PT57dGhpcy5fc3RhYmxlPXRoaXMuX3pvbmUuaXNTdGFibGUmJiF0aGlzLl96b25lLmhhc1BlbmRpbmdNYWNyb3Rhc2tzJiYhdGhpcy5fem9uZS5oYXNQZW5kaW5nTWljcm90YXNrcyx0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e3QubmV4dCh0aGlzLl9zdGFibGUpLHQuY29tcGxldGUoKX0pKX0pKSxyPW5ldyBEKCh0PT57bGV0IGU7dGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PntlPXRoaXMuX3pvbmUub25TdGFibGUuc3Vic2NyaWJlKCgoKT0+e2FfLmFzc2VydE5vdEluQW5ndWxhclpvbmUoKSxpXygoKCk9Pnt0aGlzLl9zdGFibGV8fHRoaXMuX3pvbmUuaGFzUGVuZGluZ01hY3JvdGFza3N8fHRoaXMuX3pvbmUuaGFzUGVuZGluZ01pY3JvdGFza3N8fCh0aGlzLl9zdGFibGU9ITAsdC5uZXh0KCEwKSl9KSl9KSl9KSk7Y29uc3Qgbj10aGlzLl96b25lLm9uVW5zdGFibGUuc3Vic2NyaWJlKCgoKT0+e2FfLmFzc2VydEluQW5ndWxhclpvbmUoKSx0aGlzLl9zdGFibGUmJih0aGlzLl9zdGFibGU9ITEsdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9Pnt0Lm5leHQoITEpfSkpKX0pKTtyZXR1cm4oKT0+e2UudW5zdWJzY3JpYmUoKSxuLnVuc3Vic2NyaWJlKCl9fSkpO3RoaXMuaXNTdGFibGU9cmUoYSxyLnBpcGUoRWUoKSkpfWJvb3RzdHJhcCh0LGUpe2lmKCF0aGlzLl9pbml0U3RhdHVzLmRvbmUpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgYm9vdHN0cmFwIGFzIHRoZXJlIGFyZSBzdGlsbCBhc3luY2hyb25vdXMgaW5pdGlhbGl6ZXJzIHJ1bm5pbmcuIEJvb3RzdHJhcCBjb21wb25lbnRzIGluIHRoZSBgbmdEb0Jvb3RzdHJhcGAgbWV0aG9kIG9mIHRoZSByb290IG1vZHVsZS4iKTtsZXQgbjtuPXQgaW5zdGFuY2VvZiBtZz90OnRoaXMuX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeSh0KSx0aGlzLmNvbXBvbmVudFR5cGVzLnB1c2gobi5jb21wb25lbnRUeXBlKTtjb25zdCBvPShmdW5jdGlvbiBpKHQpe3JldHVybiB0LmlzQm91bmRUb01vZHVsZX0pKG4pP3ZvaWQgMDp0aGlzLl9pbmplY3Rvci5nZXQodGgpLGE9bi5jcmVhdGUocnAuTlVMTCxbXSxlfHxuLnNlbGVjdG9yLG8pLHI9YS5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LHM9YS5pbmplY3Rvci5nZXQobV8sbnVsbCksbD1zJiZhLmluamVjdG9yLmdldCh1Xyk7cmV0dXJuIHMmJmwmJmwucmVnaXN0ZXJBcHBsaWNhdGlvbihyLHMpLGEub25EZXN0cm95KCgoKT0+e3RoaXMuZGV0YWNoVmlldyhhLmhvc3RWaWV3KSxQXyh0aGlzLmNvbXBvbmVudHMsYSksbCYmbC51bnJlZ2lzdGVyQXBwbGljYXRpb24ocil9KSksdGhpcy5fbG9hZENvbXBvbmVudChhKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJnlfKCkmJnRoaXMuX2luamVjdG9yLmdldChHeSkubG9nKCJBbmd1bGFyIGlzIHJ1bm5pbmcgaW4gZGV2ZWxvcG1lbnQgbW9kZS4gQ2FsbCBlbmFibGVQcm9kTW9kZSgpIHRvIGVuYWJsZSBwcm9kdWN0aW9uIG1vZGUuIiksYX10aWNrKCl7aWYodGhpcy5fcnVubmluZ1RpY2spdGhyb3cgbmV3IEVycm9yKCJBcHBsaWNhdGlvblJlZi50aWNrIGlzIGNhbGxlZCByZWN1cnNpdmVseSIpO3RyeXt0aGlzLl9ydW5uaW5nVGljaz0hMDtmb3IobGV0IHQgb2YgdGhpcy5fdmlld3MpdC5kZXRlY3RDaGFuZ2VzKCk7aWYoKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZ5XygpKWZvcihsZXQgdCBvZiB0aGlzLl92aWV3cyl0LmNoZWNrTm9DaGFuZ2VzKCl9Y2F0Y2godCl7dGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PnRoaXMuX2V4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlRXJyb3IodCkpKX1maW5hbGx5e3RoaXMuX3J1bm5pbmdUaWNrPSExfX1hdHRhY2hWaWV3KHQpe2NvbnN0IGU9dDt0aGlzLl92aWV3cy5wdXNoKGUpLGUuYXR0YWNoVG9BcHBSZWYodGhpcyl9ZGV0YWNoVmlldyh0KXtjb25zdCBlPXQ7UF8odGhpcy5fdmlld3MsZSksZS5kZXRhY2hGcm9tQXBwUmVmKCl9X2xvYWRDb21wb25lbnQodCl7dGhpcy5hdHRhY2hWaWV3KHQuaG9zdFZpZXcpLHRoaXMudGljaygpLHRoaXMuY29tcG9uZW50cy5wdXNoKHQpLHRoaXMuX2luamVjdG9yLmdldChVeSxbXSkuY29uY2F0KHRoaXMuX2Jvb3RzdHJhcExpc3RlbmVycykuZm9yRWFjaCgoZT0+ZSh0KSkpfW5nT25EZXN0cm95KCl7dGhpcy5fdmlld3Muc2xpY2UoKS5mb3JFYWNoKCh0PT50LmRlc3Ryb3koKSkpLHRoaXMuX29uTWljcm90YXNrRW1wdHlTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKX1nZXQgdmlld0NvdW50KCl7cmV0dXJuIHRoaXMuX3ZpZXdzLmxlbmd0aH19ZnVuY3Rpb24gUF8odCxlKXtjb25zdCBuPXQuaW5kZXhPZihlKTtuPi0xJiZ0LnNwbGljZShuLDEpfWZ1bmN0aW9uIHdfKHQpe2ZvcihsZXQgZT10Lmxlbmd0aC0xO2U+PTA7ZS0tKWlmKHZvaWQgMCE9PXRbZV0pcmV0dXJuIHRbZV19T18uybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fE9fKSh2cihhXyksdnIocnApLHZyKFpzKSx2cih1ZyksdnIoSXkpKX0sT18uybVwcm92PU1uKHt0b2tlbjpPXyxmYWN0b3J5Ok9fLsm1ZmFjfSksT18uY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTphX30se3R5cGU6cnB9LHt0eXBlOlpzfSx7dHlwZTp1Z30se3R5cGU6SXl9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKE9fLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTphX30se3R5cGU6cnB9LHt0eXBlOlpzfSx7dHlwZTp1Z30se3R5cGU6SXl9XX0pLG51bGwpO2NsYXNzIGtfe31jb25zdCBTXz17ZmFjdG9yeVBhdGhQcmVmaXg6IiIsZmFjdG9yeVBhdGhTdWZmaXg6Ii5uZ2ZhY3RvcnkifTtjbGFzcyBEX3tjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX2NvbXBpbGVyPXQsdGhpcy5fY29uZmlnPWV8fFNffWxvYWQodCl7cmV0dXJuIHRoaXMubG9hZEFuZENvbXBpbGUodCl9bG9hZEFuZENvbXBpbGUodCl7bGV0W2Usbl09dC5zcGxpdCgiIyIpO3JldHVybiB2b2lkIDA9PT1uJiYobj0iZGVmYXVsdCIpLFN5c3RlbS5pbXBvcnQoZSkudGhlbigodD0+dFtuXSkpLnRoZW4oKHQ9PkVfKHQsZSxuKSkpLnRoZW4oKHQ9PnRoaXMuX2NvbXBpbGVyLmNvbXBpbGVNb2R1bGVBc3luYyh0KSkpfWxvYWRGYWN0b3J5KHQpe2xldFtlLG5dPXQuc3BsaXQoIiMiKSxvPSJOZ0ZhY3RvcnkiO3JldHVybiB2b2lkIDA9PT1uJiYobj0iZGVmYXVsdCIsbz0iIiksU3lzdGVtLmltcG9ydCh0aGlzLl9jb25maWcuZmFjdG9yeVBhdGhQcmVmaXgrZSt0aGlzLl9jb25maWcuZmFjdG9yeVBhdGhTdWZmaXgpLnRoZW4oKHQ9PnRbbitvXSkpLnRoZW4oKHQ9PkVfKHQsZSxuKSkpfX1mdW5jdGlvbiBFXyh0LGUsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCAnJHtufScgaW4gJyR7ZX0nYCk7cmV0dXJuIHR9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL0RfLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxEXykodnIoZV8pLHZyKGtfLDgpKX0sRF8uybVwcm92PU1uKHt0b2tlbjpEXyxmYWN0b3J5OkRfLsm1ZmFjfSksRF8uY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTplX30se3R5cGU6a18sZGVjb3JhdG9yczpbe3R5cGU6U3J9XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRF8sW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmVffSx7dHlwZTprXyxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfV19KSxudWxsKTtjb25zdCBSXz1DXyhudWxsLCJjb3JlIixbe3Byb3ZpZGU6anksdXNlVmFsdWU6InVua25vd24ifSx7cHJvdmlkZTp2XyxkZXBzOltycF19LHtwcm92aWRlOnVfLGRlcHM6W119LHtwcm92aWRlOkd5LGRlcHM6W119XSksQV89W3twcm92aWRlOk9fLHVzZUNsYXNzOk9fLGRlcHM6W2FfLHJwLFpzLHVnLEl5XX0se3Byb3ZpZGU6dWgsZGVwczpbYV9dLHVzZUZhY3Rvcnk6ZnVuY3Rpb24gVF8odCl7bGV0IGU9W107cmV0dXJuIHQub25TdGFibGUuc3Vic2NyaWJlKCgoKT0+e2Zvcig7ZS5sZW5ndGg7KWUucG9wKCkoKX0pKSxmdW5jdGlvbih0KXtlLnB1c2godCl9fX0se3Byb3ZpZGU6SXksdXNlQ2xhc3M6SXksZGVwczpbW25ldyBTcix6eV1dfSx7cHJvdmlkZTplXyx1c2VDbGFzczplXyxkZXBzOltdfSxGeSx7cHJvdmlkZTpIZyx1c2VGYWN0b3J5OgovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KZnVuY3Rpb24gTl8oKXtyZXR1cm4gcWd9LGRlcHM6W119LHtwcm92aWRlOkxnLHVzZUZhY3Rvcnk6ZnVuY3Rpb24gel8oKXtyZXR1cm4gWmd9LGRlcHM6W119LHtwcm92aWRlOld5LHVzZUZhY3Rvcnk6ZnVuY3Rpb24gSV8odCl7cmV0dXJuIFh1KHQ9dHx8KGZ1bmN0aW9uIGUoKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBnb29nJiYiZW4iIT09Z29vZy5nZXRMb2NhbGUoKT9nb29nLmdldExvY2FsZSgpOiJ1bmRlZmluZWQiIT10eXBlb2YgJGxvY2FsaXplJiYkbG9jYWxpemUubG9jYWxlfHxHdX0pKCkpLHR9LGRlcHM6W1tuZXcga3IoV3kpLG5ldyBTcixuZXcgRXJdXX0se3Byb3ZpZGU6WXksdXNlVmFsdWU6IlVTRCJ9XTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIEhfe2NvbnN0cnVjdG9yKHQpe319dmFyIEZfLExfO0hfLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxIXykodnIoT18pKX0sSF8uybVtb2Q9YW8oe3R5cGU6SF99KSxIXy7JtWluaj12bih7cHJvdmlkZXJzOkFffSksSF8uY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpPX31dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoSF8sW3t0eXBlOkF5LGFyZ3M6W3twcm92aWRlcnM6QV99XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpPX31dfSksbnVsbCksKGZ1bmN0aW9uKHQpe3RbdC5DcmVhdGVWaWV3Tm9kZXM9MF09IkNyZWF0ZVZpZXdOb2RlcyIsdFt0LkNoZWNrTm9DaGFuZ2VzPTFdPSJDaGVja05vQ2hhbmdlcyIsdFt0LkNoZWNrTm9DaGFuZ2VzUHJvamVjdGVkVmlld3M9Ml09IkNoZWNrTm9DaGFuZ2VzUHJvamVjdGVkVmlld3MiLHRbdC5DaGVja0FuZFVwZGF0ZT0zXT0iQ2hlY2tBbmRVcGRhdGUiLHRbdC5DaGVja0FuZFVwZGF0ZVByb2plY3RlZFZpZXdzPTRdPSJDaGVja0FuZFVwZGF0ZVByb2plY3RlZFZpZXdzIix0W3QuRGVzdHJveT01XT0iRGVzdHJveSJ9KShGX3x8KEZfPXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5jcmVhdGU9MF09ImNyZWF0ZSIsdFt0LmRldGVjdENoYW5nZXM9MV09ImRldGVjdENoYW5nZXMiLHRbdC5jaGVja05vQ2hhbmdlcz0yXT0iY2hlY2tOb0NoYW5nZXMiLHRbdC5kZXN0cm95PTNdPSJkZXN0cm95Iix0W3QuaGFuZGxlRXZlbnQ9NF09ImhhbmRsZUV2ZW50In0pKExffHwoTF89e30pKSwKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KInVuZGVmaW5lZCIhPXR5cGVvZiBuZ0Rldk1vZGUmJm5nRGV2TW9kZSYmKGpuLiRsb2NhbGl6ZT1qbi4kbG9jYWxpemV8fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJJdCBsb29rcyBsaWtlIHlvdXIgYXBwbGljYXRpb24gb3Igb25lIG9mIGl0cyBkZXBlbmRlbmNpZXMgaXMgdXNpbmcgaTE4bi5cbkFuZ3VsYXIgOSBpbnRyb2R1Y2VkIGEgZ2xvYmFsIGAkbG9jYWxpemUoKWAgZnVuY3Rpb24gdGhhdCBuZWVkcyB0byBiZSBsb2FkZWQuXG5QbGVhc2UgcnVuIGBuZyBhZGQgQGFuZ3VsYXIvbG9jYWxpemVgIGZyb20gdGhlIEFuZ3VsYXIgQ0xJLlxuKEZvciBub24tQ0xJIHByb2plY3RzLCBhZGQgYGltcG9ydCAnQGFuZ3VsYXIvbG9jYWxpemUvaW5pdCc7YCB0byB5b3VyIGBwb2x5ZmlsbHMudHNgIGZpbGUuXG5Gb3Igc2VydmVyLXNpZGUgcmVuZGVyaW5nIGFwcGxpY2F0aW9ucyBhZGQgdGhlIGltcG9ydCB0byB5b3VyIGBtYWluLnNlcnZlci50c2AgZmlsZS4pIil9KQovKioKICAgICAqIEBsaWNlbnNlIEFuZ3VsYXIgdjEyLjIuMQogICAgICogKGMpIDIwMTAtMjAyMSBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vCiAgICAgKiBMaWNlbnNlOiBNSVQKICAgICAqLwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi87Y29uc3QgQl89InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLFZfPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3csal89InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiYidW5kZWZpbmVkIiE9dHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlJiZzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUmJnNlbGYsVV89InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWwmJmdsb2JhbCxHXz1mdW5jdGlvbih0LC4uLmUpe2lmKEdfLnRyYW5zbGF0ZSl7Y29uc3Qgbj1HXy50cmFuc2xhdGUodCxlKTt0PW5bMF0sZT1uWzFdfWxldCBuPVdfKHRbMF0sdC5yYXdbMF0pO2ZvcihsZXQgbz0xO288dC5sZW5ndGg7bysrKW4rPWVbby0xXStXXyh0W29dLHQucmF3W29dKTtyZXR1cm4gbn07ZnVuY3Rpb24gV18odCxlKXtyZXR1cm4iOiI9PT1lLmNoYXJBdCgwKT90LnN1YnN0cmluZygoZnVuY3Rpb24gbih0LGUpe2ZvcihsZXQgbj0xLG89MTtuPHQubGVuZ3RoO24rKyxvKyspaWYoIlxcIj09PWVbb10pbysrO2Vsc2UgaWYoIjoiPT09dFtuXSlyZXR1cm4gbjt0aHJvdyBuZXcgRXJyb3IoYFVudGVybWluYXRlZCAkbG9jYWxpemUgbWV0YWRhdGEgYmxvY2sgaW4gIiR7ZX0iLmApfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKSh0LGUpKzEpOnR9KEJffHxVX3x8Vl98fGpfKS4kbG9jYWxpemU9R187Ci8qKgogICAgICogQGxpY2Vuc2UgQW5ndWxhciB2MTIuMi4xCiAgICAgKiAoYykgMjAxMC0yMDIxIEdvb2dsZSBMTEMuIGh0dHBzOi8vYW5ndWxhci5pby8KICAgICAqIExpY2Vuc2U6IE1JVAogICAgICovCmxldCBZXz1udWxsO2Z1bmN0aW9uIHFfKCl7cmV0dXJuIFlffQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgWl89bmV3IEdhKCJEb2N1bWVudFRva2VuIik7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIFhfe2hpc3RvcnlHbyh0KXt0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpfX1mdW5jdGlvbiBLXygpe3JldHVybiB2cihKXyl9WF8uybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFhfKX0sWF8uybVwcm92PU1uKHtmYWN0b3J5OktfLHRva2VuOlhfLHByb3ZpZGVkSW46InBsYXRmb3JtIn0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWF8sW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOiJwbGF0Zm9ybSIsdXNlRmFjdG9yeTpLX31dfV0sbnVsbCxudWxsKSxuZXcgR2EoIkxvY2F0aW9uIEluaXRpYWxpemVkIik7Y2xhc3MgSl8gZXh0ZW5kcyBYX3tjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuX2RvYz10LHRoaXMuX2luaXQoKX1faW5pdCgpe3RoaXMubG9jYXRpb249d2luZG93LmxvY2F0aW9uLHRoaXMuX2hpc3Rvcnk9d2luZG93Lmhpc3Rvcnl9Z2V0QmFzZUhyZWZGcm9tRE9NKCl7cmV0dXJuIHFfKCkuZ2V0QmFzZUhyZWYodGhpcy5fZG9jKX1vblBvcFN0YXRlKHQpe2NvbnN0IGU9cV8oKS5nZXRHbG9iYWxFdmVudFRhcmdldCh0aGlzLl9kb2MsIndpbmRvdyIpO3JldHVybiBlLmFkZEV2ZW50TGlzdGVuZXIoInBvcHN0YXRlIix0LCExKSwoKT0+ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJwb3BzdGF0ZSIsdCl9b25IYXNoQ2hhbmdlKHQpe2NvbnN0IGU9cV8oKS5nZXRHbG9iYWxFdmVudFRhcmdldCh0aGlzLl9kb2MsIndpbmRvdyIpO3JldHVybiBlLmFkZEV2ZW50TGlzdGVuZXIoImhhc2hjaGFuZ2UiLHQsITEpLCgpPT5lLnJlbW92ZUV2ZW50TGlzdGVuZXIoImhhc2hjaGFuZ2UiLHQpfWdldCBocmVmKCl7cmV0dXJuIHRoaXMubG9jYXRpb24uaHJlZn1nZXQgcHJvdG9jb2woKXtyZXR1cm4gdGhpcy5sb2NhdGlvbi5wcm90b2NvbH1nZXQgaG9zdG5hbWUoKXtyZXR1cm4gdGhpcy5sb2NhdGlvbi5ob3N0bmFtZX1nZXQgcG9ydCgpe3JldHVybiB0aGlzLmxvY2F0aW9uLnBvcnR9Z2V0IHBhdGhuYW1lKCl7cmV0dXJuIHRoaXMubG9jYXRpb24ucGF0aG5hbWV9Z2V0IHNlYXJjaCgpe3JldHVybiB0aGlzLmxvY2F0aW9uLnNlYXJjaH1nZXQgaGFzaCgpe3JldHVybiB0aGlzLmxvY2F0aW9uLmhhc2h9c2V0IHBhdGhuYW1lKHQpe3RoaXMubG9jYXRpb24ucGF0aG5hbWU9dH1wdXNoU3RhdGUodCxlLG4pe1FfKCk/dGhpcy5faGlzdG9yeS5wdXNoU3RhdGUodCxlLG4pOnRoaXMubG9jYXRpb24uaGFzaD1ufXJlcGxhY2VTdGF0ZSh0LGUsbil7UV8oKT90aGlzLl9oaXN0b3J5LnJlcGxhY2VTdGF0ZSh0LGUsbik6dGhpcy5sb2NhdGlvbi5oYXNoPW59Zm9yd2FyZCgpe3RoaXMuX2hpc3RvcnkuZm9yd2FyZCgpfWJhY2soKXt0aGlzLl9oaXN0b3J5LmJhY2soKX1oaXN0b3J5R28odD0wKXt0aGlzLl9oaXN0b3J5LmdvKHQpfWdldFN0YXRlKCl7cmV0dXJuIHRoaXMuX2hpc3Rvcnkuc3RhdGV9fWZ1bmN0aW9uIFFfKCl7cmV0dXJuISF3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGV9ZnVuY3Rpb24gJF8oKXtyZXR1cm4gbmV3IEpfKHZyKFpfKSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiB0Qyh0LGUpe2lmKDA9PXQubGVuZ3RoKXJldHVybiBlO2lmKDA9PWUubGVuZ3RoKXJldHVybiB0O2xldCBuPTA7cmV0dXJuIHQuZW5kc1dpdGgoIi8iKSYmbisrLGUuc3RhcnRzV2l0aCgiLyIpJiZuKyssMj09bj90K2Uuc3Vic3RyaW5nKDEpOjE9PW4/dCtlOnQrIi8iK2V9ZnVuY3Rpb24gZUModCl7Y29uc3QgZT10Lm1hdGNoKC8jfFw/fCQvKSxuPWUmJmUuaW5kZXh8fHQubGVuZ3RoO3JldHVybiB0LnNsaWNlKDAsbi0oIi8iPT09dFtuLTFdPzE6MCkpK3Quc2xpY2Uobil9ZnVuY3Rpb24gbkModCl7cmV0dXJuIHQmJiI/IiE9PXRbMF0/Ij8iK3Q6dH0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovSl8uybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEpfKSh2cihaXykpfSxKXy7JtXByb3Y9TW4oe2ZhY3Rvcnk6JF8sdG9rZW46Sl8scHJvdmlkZWRJbjoicGxhdGZvcm0ifSksSl8uY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEpfLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicGxhdGZvcm0iLHVzZUZhY3Rvcnk6JF99XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XX0pLG51bGwpO2NsYXNzIG9De2hpc3RvcnlHbyh0KXt0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpfX1mdW5jdGlvbiBpQyh0KXtjb25zdCBlPXZyKFpfKS5sb2NhdGlvbjtyZXR1cm4gbmV3IHJDKHZyKFhfKSxlJiZlLm9yaWdpbnx8IiIpfW9DLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxvQyl9LG9DLsm1cHJvdj1Nbih7ZmFjdG9yeTppQyx0b2tlbjpvQyxwcm92aWRlZEluOiJyb290In0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgob0MsW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOiJyb290Iix1c2VGYWN0b3J5OmlDfV19XSxudWxsLG51bGwpO2NvbnN0IGFDPW5ldyBHYSgiYXBwQmFzZUhyZWYiKTtjbGFzcyByQyBleHRlbmRzIG9De2NvbnN0cnVjdG9yKHQsZSl7aWYoc3VwZXIoKSx0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uPXQsdGhpcy5fcmVtb3ZlTGlzdGVuZXJGbnM9W10sbnVsbD09ZSYmKGU9dGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5nZXRCYXNlSHJlZkZyb21ET00oKSksbnVsbD09ZSl0aHJvdyBuZXcgRXJyb3IoIk5vIGJhc2UgaHJlZiBzZXQuIFBsZWFzZSBwcm92aWRlIGEgdmFsdWUgZm9yIHRoZSBBUFBfQkFTRV9IUkVGIHRva2VuIG9yIGFkZCBhIGJhc2UgZWxlbWVudCB0byB0aGUgZG9jdW1lbnQuIik7dGhpcy5fYmFzZUhyZWY9ZX1uZ09uRGVzdHJveSgpe2Zvcig7dGhpcy5fcmVtb3ZlTGlzdGVuZXJGbnMubGVuZ3RoOyl0aGlzLl9yZW1vdmVMaXN0ZW5lckZucy5wb3AoKSgpfW9uUG9wU3RhdGUodCl7dGhpcy5fcmVtb3ZlTGlzdGVuZXJGbnMucHVzaCh0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLm9uUG9wU3RhdGUodCksdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5vbkhhc2hDaGFuZ2UodCkpfWdldEJhc2VIcmVmKCl7cmV0dXJuIHRoaXMuX2Jhc2VIcmVmfXByZXBhcmVFeHRlcm5hbFVybCh0KXtyZXR1cm4gdEModGhpcy5fYmFzZUhyZWYsdCl9cGF0aCh0PSExKXtjb25zdCBlPXRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucGF0aG5hbWUrbkModGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5zZWFyY2gpLG49dGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5oYXNoO3JldHVybiBuJiZ0P2Ake2V9JHtufWA6ZX1wdXNoU3RhdGUodCxlLG4sbyl7Y29uc3QgaT10aGlzLnByZXBhcmVFeHRlcm5hbFVybChuK25DKG8pKTt0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnB1c2hTdGF0ZSh0LGUsaSl9cmVwbGFjZVN0YXRlKHQsZSxuLG8pe2NvbnN0IGk9dGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwobituQyhvKSk7dGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5yZXBsYWNlU3RhdGUodCxlLGkpfWZvcndhcmQoKXt0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmZvcndhcmQoKX1iYWNrKCl7dGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5iYWNrKCl9aGlzdG9yeUdvKHQ9MCl7dmFyIGUsbjtudWxsPT09KG49KGU9dGhpcy5fcGxhdGZvcm1Mb2NhdGlvbikuaGlzdG9yeUdvKXx8dm9pZCAwPT09bnx8bi5jYWxsKGUsdCl9fXJDLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxyQykodnIoWF8pLHZyKGFDLDgpKX0sckMuybVwcm92PU1uKHt0b2tlbjpyQyxmYWN0b3J5OnJDLsm1ZmFjfSksckMuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpYX30se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOlthQ119XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgockMsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlhffSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W2FDXX1dfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIHNDIGV4dGVuZHMgb0N7Y29uc3RydWN0b3IodCxlKXtzdXBlcigpLHRoaXMuX3BsYXRmb3JtTG9jYXRpb249dCx0aGlzLl9iYXNlSHJlZj0iIix0aGlzLl9yZW1vdmVMaXN0ZW5lckZucz1bXSxudWxsIT1lJiYodGhpcy5fYmFzZUhyZWY9ZSl9bmdPbkRlc3Ryb3koKXtmb3IoO3RoaXMuX3JlbW92ZUxpc3RlbmVyRm5zLmxlbmd0aDspdGhpcy5fcmVtb3ZlTGlzdGVuZXJGbnMucG9wKCkoKX1vblBvcFN0YXRlKHQpe3RoaXMuX3JlbW92ZUxpc3RlbmVyRm5zLnB1c2godGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5vblBvcFN0YXRlKHQpLHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ub25IYXNoQ2hhbmdlKHQpKX1nZXRCYXNlSHJlZigpe3JldHVybiB0aGlzLl9iYXNlSHJlZn1wYXRoKHQ9ITEpe2xldCBlPXRoaXMuX3BsYXRmb3JtTG9jYXRpb24uaGFzaDtyZXR1cm4gbnVsbD09ZSYmKGU9IiMiKSxlLmxlbmd0aD4wP2Uuc3Vic3RyaW5nKDEpOmV9cHJlcGFyZUV4dGVybmFsVXJsKHQpe2NvbnN0IGU9dEModGhpcy5fYmFzZUhyZWYsdCk7cmV0dXJuIGUubGVuZ3RoPjA/IiMiK2U6ZX1wdXNoU3RhdGUodCxlLG4sbyl7bGV0IGk9dGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwobituQyhvKSk7MD09aS5sZW5ndGgmJihpPXRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucGF0aG5hbWUpLHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucHVzaFN0YXRlKHQsZSxpKX1yZXBsYWNlU3RhdGUodCxlLG4sbyl7bGV0IGk9dGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwobituQyhvKSk7MD09aS5sZW5ndGgmJihpPXRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucGF0aG5hbWUpLHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucmVwbGFjZVN0YXRlKHQsZSxpKX1mb3J3YXJkKCl7dGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5mb3J3YXJkKCl9YmFjaygpe3RoaXMuX3BsYXRmb3JtTG9jYXRpb24uYmFjaygpfWhpc3RvcnlHbyh0PTApe3ZhciBlLG47bnVsbD09PShuPShlPXRoaXMuX3BsYXRmb3JtTG9jYXRpb24pLmhpc3RvcnlHbyl8fHZvaWQgMD09PW58fG4uY2FsbChlLHQpfX1zQy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8c0MpKHZyKFhfKSx2cihhQyw4KSl9LHNDLsm1cHJvdj1Nbih7dG9rZW46c0MsZmFjdG9yeTpzQy7JtWZhY30pLHNDLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6WF99LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbYUNdfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHNDLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpYX30se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOlthQ119XX1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBsQ3tjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX3N1YmplY3Q9bmV3IExoLHRoaXMuX3VybENoYW5nZUxpc3RlbmVycz1bXSx0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5PXQ7Y29uc3Qgbj10aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5LmdldEJhc2VIcmVmKCk7dGhpcy5fcGxhdGZvcm1Mb2NhdGlvbj1lLHRoaXMuX2Jhc2VIcmVmPWVDKGRDKG4pKSx0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5Lm9uUG9wU3RhdGUoKHQ9Pnt0aGlzLl9zdWJqZWN0LmVtaXQoe3VybDp0aGlzLnBhdGgoITApLHBvcDohMCxzdGF0ZTp0LnN0YXRlLHR5cGU6dC50eXBlfSl9KSl9cGF0aCh0PSExKXtyZXR1cm4gdGhpcy5ub3JtYWxpemUodGhpcy5fcGxhdGZvcm1TdHJhdGVneS5wYXRoKHQpKX1nZXRTdGF0ZSgpe3JldHVybiB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmdldFN0YXRlKCl9aXNDdXJyZW50UGF0aEVxdWFsVG8odCxlPSIiKXtyZXR1cm4gdGhpcy5wYXRoKCk9PXRoaXMubm9ybWFsaXplKHQrbkMoZSkpfW5vcm1hbGl6ZSh0KXtyZXR1cm4gbEMuc3RyaXBUcmFpbGluZ1NsYXNoKChmdW5jdGlvbiBlKHQsbil7cmV0dXJuIHQmJm4uc3RhcnRzV2l0aCh0KT9uLnN1YnN0cmluZyh0Lmxlbmd0aCk6bn0pKHRoaXMuX2Jhc2VIcmVmLGRDKHQpKSl9cHJlcGFyZUV4dGVybmFsVXJsKHQpe3JldHVybiB0JiYiLyIhPT10WzBdJiYodD0iLyIrdCksdGhpcy5fcGxhdGZvcm1TdHJhdGVneS5wcmVwYXJlRXh0ZXJuYWxVcmwodCl9Z28odCxlPSIiLG49bnVsbCl7dGhpcy5fcGxhdGZvcm1TdHJhdGVneS5wdXNoU3RhdGUobiwiIix0LGUpLHRoaXMuX25vdGlmeVVybENoYW5nZUxpc3RlbmVycyh0aGlzLnByZXBhcmVFeHRlcm5hbFVybCh0K25DKGUpKSxuKX1yZXBsYWNlU3RhdGUodCxlPSIiLG49bnVsbCl7dGhpcy5fcGxhdGZvcm1TdHJhdGVneS5yZXBsYWNlU3RhdGUobiwiIix0LGUpLHRoaXMuX25vdGlmeVVybENoYW5nZUxpc3RlbmVycyh0aGlzLnByZXBhcmVFeHRlcm5hbFVybCh0K25DKGUpKSxuKX1mb3J3YXJkKCl7dGhpcy5fcGxhdGZvcm1TdHJhdGVneS5mb3J3YXJkKCl9YmFjaygpe3RoaXMuX3BsYXRmb3JtU3RyYXRlZ3kuYmFjaygpfWhpc3RvcnlHbyh0PTApe3ZhciBlLG47bnVsbD09PShuPShlPXRoaXMuX3BsYXRmb3JtU3RyYXRlZ3kpLmhpc3RvcnlHbyl8fHZvaWQgMD09PW58fG4uY2FsbChlLHQpfW9uVXJsQ2hhbmdlKHQpe3RoaXMuX3VybENoYW5nZUxpc3RlbmVycy5wdXNoKHQpLHRoaXMuX3VybENoYW5nZVN1YnNjcmlwdGlvbnx8KHRoaXMuX3VybENoYW5nZVN1YnNjcmlwdGlvbj10aGlzLnN1YnNjcmliZSgodD0+e3RoaXMuX25vdGlmeVVybENoYW5nZUxpc3RlbmVycyh0LnVybCx0LnN0YXRlKX0pKSl9X25vdGlmeVVybENoYW5nZUxpc3RlbmVycyh0PSIiLGUpe3RoaXMuX3VybENoYW5nZUxpc3RlbmVycy5mb3JFYWNoKChuPT5uKHQsZSkpKX1zdWJzY3JpYmUodCxlLG4pe3JldHVybiB0aGlzLl9zdWJqZWN0LnN1YnNjcmliZSh7bmV4dDp0LGVycm9yOmUsY29tcGxldGU6bn0pfX1mdW5jdGlvbiBjQygpe3JldHVybiBuZXcgbEModnIob0MpLHZyKFhfKSl9ZnVuY3Rpb24gZEModCl7cmV0dXJuIHQucmVwbGFjZSgvXC9pbmRleC5odG1sJC8sIiIpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovbEMuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGxDKSh2cihvQyksdnIoWF8pKX0sbEMubm9ybWFsaXplUXVlcnlQYXJhbXM9bkMsbEMuam9pbldpdGhTbGFzaD10QyxsQy5zdHJpcFRyYWlsaW5nU2xhc2g9ZUMsbEMuybVwcm92PU1uKHtmYWN0b3J5OmNDLHRva2VuOmxDLHByb3ZpZGVkSW46InJvb3QifSksbEMuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpvQ30se3R5cGU6WF99XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGxDLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCIsdXNlRmFjdG9yeTpjQ31dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOm9DfSx7dHlwZTpYX31dfSksbnVsbCk7Y29uc3QgcEM9e0FEUDpbdm9pZCAwLHZvaWQgMCwwXSxBRk46W3ZvaWQgMCx2b2lkIDAsMF0sQUxMOlt2b2lkIDAsdm9pZCAwLDBdLEFNRDpbdm9pZCAwLHZvaWQgMCwyXSxBT0E6W3ZvaWQgMCwiS3oiXSxBUlM6W3ZvaWQgMCwiJCJdLEFVRDpbIkEkIiwiJCJdLEJBTTpbdm9pZCAwLCJLTSJdLEJCRDpbdm9pZCAwLCIkIl0sQkRUOlt2b2lkIDAsIuCnsyJdLEJIRDpbdm9pZCAwLHZvaWQgMCwzXSxCSUY6W3ZvaWQgMCx2b2lkIDAsMF0sQk1EOlt2b2lkIDAsIiQiXSxCTkQ6W3ZvaWQgMCwiJCJdLEJPQjpbdm9pZCAwLCJCcyJdLEJSTDpbIlIkIl0sQlNEOlt2b2lkIDAsIiQiXSxCV1A6W3ZvaWQgMCwiUCJdLEJZTjpbdm9pZCAwLCLRgC4iLDJdLEJZUjpbdm9pZCAwLHZvaWQgMCwwXSxCWkQ6W3ZvaWQgMCwiJCJdLENBRDpbIkNBJCIsIiQiLDJdLENIRjpbdm9pZCAwLHZvaWQgMCwyXSxDTEY6W3ZvaWQgMCx2b2lkIDAsNF0sQ0xQOlt2b2lkIDAsIiQiLDBdLENOWTpbIkNOwqUiLCLCpSJdLENPUDpbdm9pZCAwLCIkIiwyXSxDUkM6W3ZvaWQgMCwi4oKhIiwyXSxDVUM6W3ZvaWQgMCwiJCJdLENVUDpbdm9pZCAwLCIkIl0sQ1pLOlt2b2lkIDAsIkvEjSIsMl0sREpGOlt2b2lkIDAsdm9pZCAwLDBdLERLSzpbdm9pZCAwLCJrciIsMl0sRE9QOlt2b2lkIDAsIiQiXSxFR1A6W3ZvaWQgMCwiRcKjIl0sRVNQOlt2b2lkIDAsIuKCpyIsMF0sRVVSOlsi4oKsIl0sRkpEOlt2b2lkIDAsIiQiXSxGS1A6W3ZvaWQgMCwiwqMiXSxHQlA6WyLCoyJdLEdFTDpbdm9pZCAwLCLigr4iXSxHSVA6W3ZvaWQgMCwiwqMiXSxHTkY6W3ZvaWQgMCwiRkciLDBdLEdUUTpbdm9pZCAwLCJRIl0sR1lEOlt2b2lkIDAsIiQiLDJdLEhLRDpbIkhLJCIsIiQiXSxITkw6W3ZvaWQgMCwiTCJdLEhSSzpbdm9pZCAwLCJrbiJdLEhVRjpbdm9pZCAwLCJGdCIsMl0sSURSOlt2b2lkIDAsIlJwIiwyXSxJTFM6WyLigqoiXSxJTlI6WyLigrkiXSxJUUQ6W3ZvaWQgMCx2b2lkIDAsMF0sSVJSOlt2b2lkIDAsdm9pZCAwLDBdLElTSzpbdm9pZCAwLCJrciIsMF0sSVRMOlt2b2lkIDAsdm9pZCAwLDBdLEpNRDpbdm9pZCAwLCIkIl0sSk9EOlt2b2lkIDAsdm9pZCAwLDNdLEpQWTpbIsKlIix2b2lkIDAsMF0sS0hSOlt2b2lkIDAsIuGfmyJdLEtNRjpbdm9pZCAwLCJDRiIsMF0sS1BXOlt2b2lkIDAsIuKCqSIsMF0sS1JXOlsi4oKpIix2b2lkIDAsMF0sS1dEOlt2b2lkIDAsdm9pZCAwLDNdLEtZRDpbdm9pZCAwLCIkIl0sS1pUOlt2b2lkIDAsIuKCuCJdLExBSzpbdm9pZCAwLCLigq0iLDBdLExCUDpbdm9pZCAwLCJMwqMiLDBdLExLUjpbdm9pZCAwLCJScyJdLExSRDpbdm9pZCAwLCIkIl0sTFRMOlt2b2lkIDAsIkx0Il0sTFVGOlt2b2lkIDAsdm9pZCAwLDBdLExWTDpbdm9pZCAwLCJMcyJdLExZRDpbdm9pZCAwLHZvaWQgMCwzXSxNR0E6W3ZvaWQgMCwiQXIiLDBdLE1HRjpbdm9pZCAwLHZvaWQgMCwwXSxNTUs6W3ZvaWQgMCwiSyIsMF0sTU5UOlt2b2lkIDAsIuKCriIsMl0sTVJPOlt2b2lkIDAsdm9pZCAwLDBdLE1VUjpbdm9pZCAwLCJScyIsMl0sTVhOOlsiTVgkIiwiJCJdLE1ZUjpbdm9pZCAwLCJSTSJdLE5BRDpbdm9pZCAwLCIkIl0sTkdOOlt2b2lkIDAsIuKCpiJdLE5JTzpbdm9pZCAwLCJDJCJdLE5PSzpbdm9pZCAwLCJrciIsMl0sTlBSOlt2b2lkIDAsIlJzIl0sTlpEOlsiTlokIiwiJCJdLE9NUjpbdm9pZCAwLHZvaWQgMCwzXSxQSFA6W3ZvaWQgMCwi4oKxIl0sUEtSOlt2b2lkIDAsIlJzIiwyXSxQTE46W3ZvaWQgMCwiesWCIl0sUFlHOlt2b2lkIDAsIuKCsiIsMF0sUk9OOlt2b2lkIDAsImxlaSJdLFJTRDpbdm9pZCAwLHZvaWQgMCwwXSxSVUI6W3ZvaWQgMCwi4oK9Il0sUlVSOlt2b2lkIDAsItGALiJdLFJXRjpbdm9pZCAwLCJSRiIsMF0sU0JEOlt2b2lkIDAsIiQiXSxTRUs6W3ZvaWQgMCwia3IiLDJdLFNHRDpbdm9pZCAwLCIkIl0sU0hQOlt2b2lkIDAsIsKjIl0sU0xMOlt2b2lkIDAsdm9pZCAwLDBdLFNPUzpbdm9pZCAwLHZvaWQgMCwwXSxTUkQ6W3ZvaWQgMCwiJCJdLFNTUDpbdm9pZCAwLCLCoyJdLFNURDpbdm9pZCAwLHZvaWQgMCwwXSxTVE46W3ZvaWQgMCwiRGIiXSxTWVA6W3ZvaWQgMCwiwqMiLDBdLFRIQjpbdm9pZCAwLCLguL8iXSxUTU06W3ZvaWQgMCx2b2lkIDAsMF0sVE5EOlt2b2lkIDAsdm9pZCAwLDNdLFRPUDpbdm9pZCAwLCJUJCJdLFRSTDpbdm9pZCAwLHZvaWQgMCwwXSxUUlk6W3ZvaWQgMCwi4oK6Il0sVFREOlt2b2lkIDAsIiQiXSxUV0Q6WyJOVCQiLCIkIiwyXSxUWlM6W3ZvaWQgMCx2b2lkIDAsMl0sVUFIOlt2b2lkIDAsIuKCtCJdLFVHWDpbdm9pZCAwLHZvaWQgMCwwXSxVU0Q6WyIkIl0sVVlJOlt2b2lkIDAsdm9pZCAwLDBdLFVZVTpbdm9pZCAwLCIkIl0sVVlXOlt2b2lkIDAsdm9pZCAwLDRdLFVaUzpbdm9pZCAwLHZvaWQgMCwyXSxWRUY6W3ZvaWQgMCwiQnMiLDJdLFZORDpbIuKCqyIsdm9pZCAwLDBdLFZVVjpbdm9pZCAwLHZvaWQgMCwwXSxYQUY6WyJGQ0ZBIix2b2lkIDAsMF0sWENEOlsiRUMkIiwiJCJdLFhPRjpbIkNGQSIsdm9pZCAwLDBdLFhQRjpbIkNGUEYiLHZvaWQgMCwwXSxYWFg6WyLCpCJdLFlFUjpbdm9pZCAwLHZvaWQgMCwwXSxaQVI6W3ZvaWQgMCwiUiJdLFpNSzpbdm9pZCAwLHZvaWQgMCwwXSxaTVc6W3ZvaWQgMCwiWksiXSxaV0Q6W3ZvaWQgMCx2b2lkIDAsMF19OwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi92YXIgbUMsdUMsZkMsZ0MsaEMsYkMseUM7ZnVuY3Rpb24gX0ModCxlKXtyZXR1cm4gd0MoTHUodClbanUuRGF0ZUZvcm1hdF0sZSl9ZnVuY3Rpb24gQ0ModCxlKXtyZXR1cm4gd0MoTHUodClbanUuVGltZUZvcm1hdF0sZSl9ZnVuY3Rpb24gTUModCxlKXtyZXR1cm4gd0MoTHUodClbanUuRGF0ZVRpbWVGb3JtYXRdLGUpfWZ1bmN0aW9uIHZDKHQsZSl7Y29uc3Qgbj1MdSh0KSxvPW5banUuTnVtYmVyU3ltYm9sc11bZV07aWYodm9pZCAwPT09byl7aWYoZT09PWJDLkN1cnJlbmN5RGVjaW1hbClyZXR1cm4gbltqdS5OdW1iZXJTeW1ib2xzXVtiQy5EZWNpbWFsXTtpZihlPT09YkMuQ3VycmVuY3lHcm91cClyZXR1cm4gbltqdS5OdW1iZXJTeW1ib2xzXVtiQy5Hcm91cF19cmV0dXJuIG99ZnVuY3Rpb24geEModCxlKXtyZXR1cm4gTHUodClbanUuTnVtYmVyRm9ybWF0c11bZV19IShmdW5jdGlvbih0KXt0W3QuRGVjaW1hbD0wXT0iRGVjaW1hbCIsdFt0LlBlcmNlbnQ9MV09IlBlcmNlbnQiLHRbdC5DdXJyZW5jeT0yXT0iQ3VycmVuY3kiLHRbdC5TY2llbnRpZmljPTNdPSJTY2llbnRpZmljIn0pKG1DfHwobUM9e30pKSwoZnVuY3Rpb24odCl7dFt0Llplcm89MF09Ilplcm8iLHRbdC5PbmU9MV09Ik9uZSIsdFt0LlR3bz0yXT0iVHdvIix0W3QuRmV3PTNdPSJGZXciLHRbdC5NYW55PTRdPSJNYW55Iix0W3QuT3RoZXI9NV09Ik90aGVyIn0pKHVDfHwodUM9e30pKSwoZnVuY3Rpb24odCl7dFt0LkZvcm1hdD0wXT0iRm9ybWF0Iix0W3QuU3RhbmRhbG9uZT0xXT0iU3RhbmRhbG9uZSJ9KShmQ3x8KGZDPXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5OYXJyb3c9MF09Ik5hcnJvdyIsdFt0LkFiYnJldmlhdGVkPTFdPSJBYmJyZXZpYXRlZCIsdFt0LldpZGU9Ml09IldpZGUiLHRbdC5TaG9ydD0zXT0iU2hvcnQifSkoZ0N8fChnQz17fSkpLChmdW5jdGlvbih0KXt0W3QuU2hvcnQ9MF09IlNob3J0Iix0W3QuTWVkaXVtPTFdPSJNZWRpdW0iLHRbdC5Mb25nPTJdPSJMb25nIix0W3QuRnVsbD0zXT0iRnVsbCJ9KShoQ3x8KGhDPXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5EZWNpbWFsPTBdPSJEZWNpbWFsIix0W3QuR3JvdXA9MV09Ikdyb3VwIix0W3QuTGlzdD0yXT0iTGlzdCIsdFt0LlBlcmNlbnRTaWduPTNdPSJQZXJjZW50U2lnbiIsdFt0LlBsdXNTaWduPTRdPSJQbHVzU2lnbiIsdFt0Lk1pbnVzU2lnbj01XT0iTWludXNTaWduIix0W3QuRXhwb25lbnRpYWw9Nl09IkV4cG9uZW50aWFsIix0W3QuU3VwZXJzY3JpcHRpbmdFeHBvbmVudD03XT0iU3VwZXJzY3JpcHRpbmdFeHBvbmVudCIsdFt0LlBlck1pbGxlPThdPSJQZXJNaWxsZSIsdFt0WzEvMF09OV09IkluZmluaXR5Iix0W3QuTmFOPTEwXT0iTmFOIix0W3QuVGltZVNlcGFyYXRvcj0xMV09IlRpbWVTZXBhcmF0b3IiLHRbdC5DdXJyZW5jeURlY2ltYWw9MTJdPSJDdXJyZW5jeURlY2ltYWwiLHRbdC5DdXJyZW5jeUdyb3VwPTEzXT0iQ3VycmVuY3lHcm91cCJ9KShiQ3x8KGJDPXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5TdW5kYXk9MF09IlN1bmRheSIsdFt0Lk1vbmRheT0xXT0iTW9uZGF5Iix0W3QuVHVlc2RheT0yXT0iVHVlc2RheSIsdFt0LldlZG5lc2RheT0zXT0iV2VkbmVzZGF5Iix0W3QuVGh1cnNkYXk9NF09IlRodXJzZGF5Iix0W3QuRnJpZGF5PTVdPSJGcmlkYXkiLHRbdC5TYXR1cmRheT02XT0iU2F0dXJkYXkifSkoeUN8fCh5Qz17fSkpO2NvbnN0IE9DPUJ1O2Z1bmN0aW9uIFBDKHQpe2lmKCF0W2p1LkV4dHJhRGF0YV0pdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGV4dHJhIGxvY2FsZSBkYXRhIGZvciB0aGUgbG9jYWxlICIke3RbanUuTG9jYWxlSWRdfSIuIFVzZSAicmVnaXN0ZXJMb2NhbGVEYXRhIiB0byBsb2FkIG5ldyBkYXRhLiBTZWUgdGhlICJJMThuIGd1aWRlIiBvbiBhbmd1bGFyLmlvIHRvIGtub3cgbW9yZS5gKX1mdW5jdGlvbiB3Qyh0LGUpe2ZvcihsZXQgbj1lO24+LTE7bi0tKWlmKHZvaWQgMCE9PXRbbl0pcmV0dXJuIHRbbl07dGhyb3cgbmV3IEVycm9yKCJMb2NhbGUgZGF0YSBBUEk6IGxvY2FsZSBkYXRhIHVuZGVmaW5lZCIpfWZ1bmN0aW9uIGtDKHQpe2NvbnN0W2Usbl09dC5zcGxpdCgiOiIpO3JldHVybntob3VyczorZSxtaW51dGVzOitufX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IFNDPS9eKFxkezR9KS0/KFxkXGQpLT8oXGRcZCkoPzpUKFxkXGQpKD86Oj8oXGRcZCkoPzo6PyhcZFxkKSg/OlwuKFxkKykpPyk/KT8oWnwoWystXSkoXGRcZCk6PyhcZFxkKSk/KT8kLyxEQz17fSxFQz0vKCg/OlteQkVHSExNT1NXWVphYmNkaG1zd3l6J10rKXwoPzonKD86W14nXXwnJykqJyl8KD86R3sxLDV9fHl7MSw0fXxZezEsNH18TXsxLDV9fEx7MSw1fXx3ezEsMn18V3sxfXxkezEsMn18RXsxLDZ9fGN7MSw2fXxhezEsNX18YnsxLDV9fEJ7MSw1fXxoezEsMn18SHsxLDJ9fG17MSwyfXxzezEsMn18U3sxLDN9fHp7MSw0fXxaezEsNX18T3sxLDR9KSkoW1xzXFNdKikvO3ZhciBSQyxBQyxUQztmdW5jdGlvbiBOQyh0LGUsbixvKXtsZXQgaT0oZnVuY3Rpb24gYSh0KXtpZihxQyh0KSlyZXR1cm4gdDtpZigibnVtYmVyIj09dHlwZW9mIHQmJiFpc05hTih0KSlyZXR1cm4gbmV3IERhdGUodCk7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZih0PXQudHJpbSgpLC9eKFxkezR9KC1cZHsxLDJ9KC1cZHsxLDJ9KT8pPykkLy50ZXN0KHQpKXtjb25zdFtlLG49MSxvPTFdPXQuc3BsaXQoIi0iKS5tYXAoKHQ9Pit0KSk7cmV0dXJuIHpDKGUsbi0xLG8pfWNvbnN0IGU9cGFyc2VGbG9hdCh0KTtpZighaXNOYU4odC1lKSlyZXR1cm4gbmV3IERhdGUoZSk7bGV0IG47aWYobj10Lm1hdGNoKFNDKSlyZXR1cm4oZnVuY3Rpb24gZSh0KXtjb25zdCBlPW5ldyBEYXRlKDApO2xldCBuPTAsbz0wO2NvbnN0IGk9dFs4XT9lLnNldFVUQ0Z1bGxZZWFyOmUuc2V0RnVsbFllYXIsYT10WzhdP2Uuc2V0VVRDSG91cnM6ZS5zZXRIb3Vyczt0WzldJiYobj1OdW1iZXIodFs5XSt0WzEwXSksbz1OdW1iZXIodFs5XSt0WzExXSkpLGkuY2FsbChlLE51bWJlcih0WzFdKSxOdW1iZXIodFsyXSktMSxOdW1iZXIodFszXSkpO2NvbnN0IHI9TnVtYmVyKHRbNF18fDApLW4scz1OdW1iZXIodFs1XXx8MCktbyxsPU51bWJlcih0WzZdfHwwKSxjPU1hdGguZmxvb3IoMWUzKnBhcnNlRmxvYXQoIjAuIisodFs3XXx8MCkpKTtyZXR1cm4gYS5jYWxsKGUscixzLGwsYyksZX0pKG4pfWNvbnN0IG49bmV3IERhdGUodCk7aWYoIXFDKG4pKXRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGNvbnZlcnQgIiR7dH0iIGludG8gYSBkYXRlYCk7cmV0dXJuIG59KSh0KTtlPUlDKG4sZSl8fGU7bGV0IHIscz1bXTtmb3IoO2U7KXtpZihyPUVDLmV4ZWMoZSksIXIpe3MucHVzaChlKTticmVha317cz1zLmNvbmNhdChyLnNsaWNlKDEpKTtjb25zdCB0PXMucG9wKCk7aWYoIXQpYnJlYWs7ZT10fX1sZXQgbD1pLmdldFRpbWV6b25lT2Zmc2V0KCk7byYmKGw9WUMobyxsKSxpPShmdW5jdGlvbiBjKHQsZSxuKXtjb25zdCBvPW4/LTE6MSxpPXQuZ2V0VGltZXpvbmVPZmZzZXQoKTtyZXR1cm4oZnVuY3Rpb24gYSh0LGUpe3JldHVybih0PW5ldyBEYXRlKHQuZ2V0VGltZSgpKSkuc2V0TWludXRlcyh0LmdldE1pbnV0ZXMoKStlKSx0fSkodCxvKihZQyhlLGkpLWkpKX0pKGksbywhMCkpO2xldCBkPSIiO3JldHVybiBzLmZvckVhY2goKHQ9Pntjb25zdCBlPShmdW5jdGlvbiBvKHQpe2lmKFdDW3RdKXJldHVybiBXQ1t0XTtsZXQgZTtzd2l0Y2godCl7Y2FzZSJHIjpjYXNlIkdHIjpjYXNlIkdHRyI6ZT1CQyhUQy5FcmFzLGdDLkFiYnJldmlhdGVkKTticmVhaztjYXNlIkdHR0ciOmU9QkMoVEMuRXJhcyxnQy5XaWRlKTticmVhaztjYXNlIkdHR0dHIjplPUJDKFRDLkVyYXMsZ0MuTmFycm93KTticmVhaztjYXNlInkiOmU9TEMoQUMuRnVsbFllYXIsMSwwLCExLCEwKTticmVhaztjYXNlInl5IjplPUxDKEFDLkZ1bGxZZWFyLDIsMCwhMCwhMCk7YnJlYWs7Y2FzZSJ5eXkiOmU9TEMoQUMuRnVsbFllYXIsMywwLCExLCEwKTticmVhaztjYXNlInl5eXkiOmU9TEMoQUMuRnVsbFllYXIsNCwwLCExLCEwKTticmVhaztjYXNlIlkiOmU9R0MoMSk7YnJlYWs7Y2FzZSJZWSI6ZT1HQygyLCEwKTticmVhaztjYXNlIllZWSI6ZT1HQygzKTticmVhaztjYXNlIllZWVkiOmU9R0MoNCk7YnJlYWs7Y2FzZSJNIjpjYXNlIkwiOmU9TEMoQUMuTW9udGgsMSwxKTticmVhaztjYXNlIk1NIjpjYXNlIkxMIjplPUxDKEFDLk1vbnRoLDIsMSk7YnJlYWs7Y2FzZSJNTU0iOmU9QkMoVEMuTW9udGhzLGdDLkFiYnJldmlhdGVkKTticmVhaztjYXNlIk1NTU0iOmU9QkMoVEMuTW9udGhzLGdDLldpZGUpO2JyZWFrO2Nhc2UiTU1NTU0iOmU9QkMoVEMuTW9udGhzLGdDLk5hcnJvdyk7YnJlYWs7Y2FzZSJMTEwiOmU9QkMoVEMuTW9udGhzLGdDLkFiYnJldmlhdGVkLGZDLlN0YW5kYWxvbmUpO2JyZWFrO2Nhc2UiTExMTCI6ZT1CQyhUQy5Nb250aHMsZ0MuV2lkZSxmQy5TdGFuZGFsb25lKTticmVhaztjYXNlIkxMTExMIjplPUJDKFRDLk1vbnRocyxnQy5OYXJyb3csZkMuU3RhbmRhbG9uZSk7YnJlYWs7Y2FzZSJ3IjplPVVDKDEpO2JyZWFrO2Nhc2Uid3ciOmU9VUMoMik7YnJlYWs7Y2FzZSJXIjplPVVDKDEsITApO2JyZWFrO2Nhc2UiZCI6ZT1MQyhBQy5EYXRlLDEpO2JyZWFrO2Nhc2UiZGQiOmU9TEMoQUMuRGF0ZSwyKTticmVhaztjYXNlImMiOmNhc2UiY2MiOmU9TEMoQUMuRGF5LDEpO2JyZWFrO2Nhc2UiY2NjIjplPUJDKFRDLkRheXMsZ0MuQWJicmV2aWF0ZWQsZkMuU3RhbmRhbG9uZSk7YnJlYWs7Y2FzZSJjY2NjIjplPUJDKFRDLkRheXMsZ0MuV2lkZSxmQy5TdGFuZGFsb25lKTticmVhaztjYXNlImNjY2NjIjplPUJDKFRDLkRheXMsZ0MuTmFycm93LGZDLlN0YW5kYWxvbmUpO2JyZWFrO2Nhc2UiY2NjY2NjIjplPUJDKFRDLkRheXMsZ0MuU2hvcnQsZkMuU3RhbmRhbG9uZSk7YnJlYWs7Y2FzZSJFIjpjYXNlIkVFIjpjYXNlIkVFRSI6ZT1CQyhUQy5EYXlzLGdDLkFiYnJldmlhdGVkKTticmVhaztjYXNlIkVFRUUiOmU9QkMoVEMuRGF5cyxnQy5XaWRlKTticmVhaztjYXNlIkVFRUVFIjplPUJDKFRDLkRheXMsZ0MuTmFycm93KTticmVhaztjYXNlIkVFRUVFRSI6ZT1CQyhUQy5EYXlzLGdDLlNob3J0KTticmVhaztjYXNlImEiOmNhc2UiYWEiOmNhc2UiYWFhIjplPUJDKFRDLkRheVBlcmlvZHMsZ0MuQWJicmV2aWF0ZWQpO2JyZWFrO2Nhc2UiYWFhYSI6ZT1CQyhUQy5EYXlQZXJpb2RzLGdDLldpZGUpO2JyZWFrO2Nhc2UiYWFhYWEiOmU9QkMoVEMuRGF5UGVyaW9kcyxnQy5OYXJyb3cpO2JyZWFrO2Nhc2UiYiI6Y2FzZSJiYiI6Y2FzZSJiYmIiOmU9QkMoVEMuRGF5UGVyaW9kcyxnQy5BYmJyZXZpYXRlZCxmQy5TdGFuZGFsb25lLCEwKTticmVhaztjYXNlImJiYmIiOmU9QkMoVEMuRGF5UGVyaW9kcyxnQy5XaWRlLGZDLlN0YW5kYWxvbmUsITApO2JyZWFrO2Nhc2UiYmJiYmIiOmU9QkMoVEMuRGF5UGVyaW9kcyxnQy5OYXJyb3csZkMuU3RhbmRhbG9uZSwhMCk7YnJlYWs7Y2FzZSJCIjpjYXNlIkJCIjpjYXNlIkJCQiI6ZT1CQyhUQy5EYXlQZXJpb2RzLGdDLkFiYnJldmlhdGVkLGZDLkZvcm1hdCwhMCk7YnJlYWs7Y2FzZSJCQkJCIjplPUJDKFRDLkRheVBlcmlvZHMsZ0MuV2lkZSxmQy5Gb3JtYXQsITApO2JyZWFrO2Nhc2UiQkJCQkIiOmU9QkMoVEMuRGF5UGVyaW9kcyxnQy5OYXJyb3csZkMuRm9ybWF0LCEwKTticmVhaztjYXNlImgiOmU9TEMoQUMuSG91cnMsMSwtMTIpO2JyZWFrO2Nhc2UiaGgiOmU9TEMoQUMuSG91cnMsMiwtMTIpO2JyZWFrO2Nhc2UiSCI6ZT1MQyhBQy5Ib3VycywxKTticmVhaztjYXNlIkhIIjplPUxDKEFDLkhvdXJzLDIpO2JyZWFrO2Nhc2UibSI6ZT1MQyhBQy5NaW51dGVzLDEpO2JyZWFrO2Nhc2UibW0iOmU9TEMoQUMuTWludXRlcywyKTticmVhaztjYXNlInMiOmU9TEMoQUMuU2Vjb25kcywxKTticmVhaztjYXNlInNzIjplPUxDKEFDLlNlY29uZHMsMik7YnJlYWs7Y2FzZSJTIjplPUxDKEFDLkZyYWN0aW9uYWxTZWNvbmRzLDEpO2JyZWFrO2Nhc2UiU1MiOmU9TEMoQUMuRnJhY3Rpb25hbFNlY29uZHMsMik7YnJlYWs7Y2FzZSJTU1MiOmU9TEMoQUMuRnJhY3Rpb25hbFNlY29uZHMsMyk7YnJlYWs7Y2FzZSJaIjpjYXNlIlpaIjpjYXNlIlpaWiI6ZT1WQyhSQy5TaG9ydCk7YnJlYWs7Y2FzZSJaWlpaWiI6ZT1WQyhSQy5FeHRlbmRlZCk7YnJlYWs7Y2FzZSJPIjpjYXNlIk9PIjpjYXNlIk9PTyI6Y2FzZSJ6IjpjYXNlInp6IjpjYXNlInp6eiI6ZT1WQyhSQy5TaG9ydEdNVCk7YnJlYWs7Y2FzZSJPT09PIjpjYXNlIlpaWloiOmNhc2Uienp6eiI6ZT1WQyhSQy5Mb25nKTticmVhaztkZWZhdWx0OnJldHVybiBudWxsfXJldHVybiBXQ1t0XT1lLGV9KSh0KTtkKz1lP2UoaSxuLGwpOiInJyI9PT10PyInIjp0LnJlcGxhY2UoLyheJ3wnJCkvZywiIikucmVwbGFjZSgvJycvZywiJyIpfSkpLGR9ZnVuY3Rpb24gekModCxlLG4pe2NvbnN0IG89bmV3IERhdGUoMCk7cmV0dXJuIG8uc2V0RnVsbFllYXIodCxlLG4pLG8uc2V0SG91cnMoMCwwLDApLG99ZnVuY3Rpb24gSUModCxlKXtjb25zdCBuPShmdW5jdGlvbiBvKHQpe3JldHVybiBMdSh0KVtqdS5Mb2NhbGVJZF19KSh0KTtpZihEQ1tuXT1EQ1tuXXx8e30sRENbbl1bZV0pcmV0dXJuIERDW25dW2VdO2xldCBpPSIiO3N3aXRjaChlKXtjYXNlInNob3J0RGF0ZSI6aT1fQyh0LGhDLlNob3J0KTticmVhaztjYXNlIm1lZGl1bURhdGUiOmk9X0ModCxoQy5NZWRpdW0pO2JyZWFrO2Nhc2UibG9uZ0RhdGUiOmk9X0ModCxoQy5Mb25nKTticmVhaztjYXNlImZ1bGxEYXRlIjppPV9DKHQsaEMuRnVsbCk7YnJlYWs7Y2FzZSJzaG9ydFRpbWUiOmk9Q0ModCxoQy5TaG9ydCk7YnJlYWs7Y2FzZSJtZWRpdW1UaW1lIjppPUNDKHQsaEMuTWVkaXVtKTticmVhaztjYXNlImxvbmdUaW1lIjppPUNDKHQsaEMuTG9uZyk7YnJlYWs7Y2FzZSJmdWxsVGltZSI6aT1DQyh0LGhDLkZ1bGwpO2JyZWFrO2Nhc2Uic2hvcnQiOmNvbnN0IGU9SUModCwic2hvcnRUaW1lIiksbj1JQyh0LCJzaG9ydERhdGUiKTtpPUhDKE1DKHQsaEMuU2hvcnQpLFtlLG5dKTticmVhaztjYXNlIm1lZGl1bSI6Y29uc3Qgbz1JQyh0LCJtZWRpdW1UaW1lIiksYT1JQyh0LCJtZWRpdW1EYXRlIik7aT1IQyhNQyh0LGhDLk1lZGl1bSksW28sYV0pO2JyZWFrO2Nhc2UibG9uZyI6Y29uc3Qgcj1JQyh0LCJsb25nVGltZSIpLHM9SUModCwibG9uZ0RhdGUiKTtpPUhDKE1DKHQsaEMuTG9uZyksW3Isc10pO2JyZWFrO2Nhc2UiZnVsbCI6Y29uc3QgbD1JQyh0LCJmdWxsVGltZSIpLGM9SUModCwiZnVsbERhdGUiKTtpPUhDKE1DKHQsaEMuRnVsbCksW2wsY10pfXJldHVybiBpJiYoRENbbl1bZV09aSksaX1mdW5jdGlvbiBIQyh0LGUpe3JldHVybiBlJiYodD10LnJlcGxhY2UoL1x7KFtefV0rKX0vZywoZnVuY3Rpb24odCxuKXtyZXR1cm4gbnVsbCE9ZSYmbiBpbiBlP2Vbbl06dH0pKSksdH1mdW5jdGlvbiBGQyh0LGUsbj0iLSIsbyxpKXtsZXQgYT0iIjsodDwwfHxpJiZ0PD0wKSYmKGk/dD0xLXQ6KHQ9LXQsYT1uKSk7bGV0IHI9U3RyaW5nKHQpO2Zvcig7ci5sZW5ndGg8ZTspcj0iMCIrcjtyZXR1cm4gbyYmKHI9ci5zdWJzdHIoci5sZW5ndGgtZSkpLGErcn1mdW5jdGlvbiBMQyh0LGUsbj0wLG89ITEsaT0hMSl7cmV0dXJuIGZ1bmN0aW9uKGEscil7bGV0IHM9KGZ1bmN0aW9uIGwodCxlKXtzd2l0Y2godCl7Y2FzZSBBQy5GdWxsWWVhcjpyZXR1cm4gZS5nZXRGdWxsWWVhcigpO2Nhc2UgQUMuTW9udGg6cmV0dXJuIGUuZ2V0TW9udGgoKTtjYXNlIEFDLkRhdGU6cmV0dXJuIGUuZ2V0RGF0ZSgpO2Nhc2UgQUMuSG91cnM6cmV0dXJuIGUuZ2V0SG91cnMoKTtjYXNlIEFDLk1pbnV0ZXM6cmV0dXJuIGUuZ2V0TWludXRlcygpO2Nhc2UgQUMuU2Vjb25kczpyZXR1cm4gZS5nZXRTZWNvbmRzKCk7Y2FzZSBBQy5GcmFjdGlvbmFsU2Vjb25kczpyZXR1cm4gZS5nZXRNaWxsaXNlY29uZHMoKTtjYXNlIEFDLkRheTpyZXR1cm4gZS5nZXREYXkoKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5rbm93biBEYXRlVHlwZSB2YWx1ZSAiJHt0fSIuYCl9fSkodCxhKTtpZigobj4wfHxzPi1uKSYmKHMrPW4pLHQ9PT1BQy5Ib3VycykwPT09cyYmLTEyPT09biYmKHM9MTIpO2Vsc2UgaWYodD09PUFDLkZyYWN0aW9uYWxTZWNvbmRzKXJldHVybihmdW5jdGlvbiBjKHQsZSl7cmV0dXJuIEZDKHQsMykuc3Vic3RyKDAsZSl9KShzLGUpO2NvbnN0IGQ9dkMocixiQy5NaW51c1NpZ24pO3JldHVybiBGQyhzLGUsZCxvLGkpfX1mdW5jdGlvbiBCQyh0LGUsbj1mQy5Gb3JtYXQsbz0hMSl7cmV0dXJuIGZ1bmN0aW9uKGksYSl7cmV0dXJuKGZ1bmN0aW9uIHIodCxlLG4sbyxpLGEpe3N3aXRjaChuKXtjYXNlIFRDLk1vbnRoczpyZXR1cm4oZnVuY3Rpb24gcih0LGUsbil7Y29uc3Qgbz1MdSh0KSxpPXdDKFtvW2p1Lk1vbnRoc0Zvcm1hdF0sb1tqdS5Nb250aHNTdGFuZGFsb25lXV0sZSk7cmV0dXJuIHdDKGksbil9KShlLGksbylbdC5nZXRNb250aCgpXTtjYXNlIFRDLkRheXM6cmV0dXJuKGZ1bmN0aW9uIHModCxlLG4pe2NvbnN0IG89THUodCksaT13Qyhbb1tqdS5EYXlzRm9ybWF0XSxvW2p1LkRheXNTdGFuZGFsb25lXV0sZSk7cmV0dXJuIHdDKGksbil9KShlLGksbylbdC5nZXREYXkoKV07Y2FzZSBUQy5EYXlQZXJpb2RzOmNvbnN0IHI9dC5nZXRIb3VycygpLHM9dC5nZXRNaW51dGVzKCk7aWYoYSl7Y29uc3QgdD0oZnVuY3Rpb24gbCh0KXtjb25zdCBlPUx1KHQpO3JldHVybiBQQyhlKSwoZVtqdS5FeHRyYURhdGFdWzJdfHxbXSkubWFwKCh0PT4ic3RyaW5nIj09dHlwZW9mIHQ/a0ModCk6W2tDKHRbMF0pLGtDKHRbMV0pXSkpfSkoZSksbj0oZnVuY3Rpb24gYyh0LGUsbil7Y29uc3Qgbz1MdSh0KTtQQyhvKTtjb25zdCBpPXdDKFtvW2p1LkV4dHJhRGF0YV1bMF0sb1tqdS5FeHRyYURhdGFdWzFdXSxlKXx8W107cmV0dXJuIHdDKGksbil8fFtdfSkoZSxpLG8pLGE9dC5maW5kSW5kZXgoKHQ9PntpZihBcnJheS5pc0FycmF5KHQpKXtjb25zdFtlLG5dPXQsbz1yPj1lLmhvdXJzJiZzPj1lLm1pbnV0ZXMsaT1yPG4uaG91cnN8fHI9PT1uLmhvdXJzJiZzPG4ubWludXRlcztpZihlLmhvdXJzPG4uaG91cnMpe2lmKG8mJmkpcmV0dXJuITB9ZWxzZSBpZihvfHxpKXJldHVybiEwfWVsc2UgaWYodC5ob3Vycz09PXImJnQubWludXRlcz09PXMpcmV0dXJuITA7cmV0dXJuITF9KSk7aWYoLTEhPT1hKXJldHVybiBuW2FdfXJldHVybihmdW5jdGlvbiBkKHQsZSxuKXtjb25zdCBvPUx1KHQpLGk9d0MoW29banUuRGF5UGVyaW9kc0Zvcm1hdF0sb1tqdS5EYXlQZXJpb2RzU3RhbmRhbG9uZV1dLGUpO3JldHVybiB3QyhpLG4pfSkoZSxpLG8pW3I8MTI/MDoxXTtjYXNlIFRDLkVyYXM6cmV0dXJuKGZ1bmN0aW9uIHAodCxlKXtyZXR1cm4gd0MoTHUodClbanUuRXJhc10sZSl9KShlLG8pW3QuZ2V0RnVsbFllYXIoKTw9MD8wOjFdO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIHRyYW5zbGF0aW9uIHR5cGUgJHtufWApfX0pKGksYSx0LGUsbixvKX19ZnVuY3Rpb24gVkModCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixvKXtjb25zdCBpPS0xKm8sYT12QyhuLGJDLk1pbnVzU2lnbikscj1pPjA/TWF0aC5mbG9vcihpLzYwKTpNYXRoLmNlaWwoaS82MCk7c3dpdGNoKHQpe2Nhc2UgUkMuU2hvcnQ6cmV0dXJuKGk+PTA/IisiOiIiKStGQyhyLDIsYSkrRkMoTWF0aC5hYnMoaSU2MCksMixhKTtjYXNlIFJDLlNob3J0R01UOnJldHVybiJHTVQiKyhpPj0wPyIrIjoiIikrRkMociwxLGEpO2Nhc2UgUkMuTG9uZzpyZXR1cm4iR01UIisoaT49MD8iKyI6IiIpK0ZDKHIsMixhKSsiOiIrRkMoTWF0aC5hYnMoaSU2MCksMixhKTtjYXNlIFJDLkV4dGVuZGVkOnJldHVybiAwPT09bz8iWiI6KGk+PTA/IisiOiIiKStGQyhyLDIsYSkrIjoiK0ZDKE1hdGguYWJzKGklNjApLDIsYSk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gem9uZSB3aWR0aCAiJHt0fSJgKX19fWZ1bmN0aW9uIGpDKHQpe3JldHVybiB6Qyh0LmdldEZ1bGxZZWFyKCksdC5nZXRNb250aCgpLHQuZ2V0RGF0ZSgpKyg0LXQuZ2V0RGF5KCkpKX1mdW5jdGlvbiBVQyh0LGU9ITEpe3JldHVybiBmdW5jdGlvbihuLG8pe2xldCBpO2lmKGUpe2NvbnN0IHQ9bmV3IERhdGUobi5nZXRGdWxsWWVhcigpLG4uZ2V0TW9udGgoKSwxKS5nZXREYXkoKS0xLGU9bi5nZXREYXRlKCk7aT0xK01hdGguZmxvb3IoKGUrdCkvNyl9ZWxzZXtjb25zdCB0PWpDKG4pLGU9KGZ1bmN0aW9uIGEodCl7Y29uc3QgZT16Qyh0LDAsMSkuZ2V0RGF5KCk7cmV0dXJuIHpDKHQsMCwxKyhlPD00PzQ6MTEpLWUpfSkodC5nZXRGdWxsWWVhcigpKSxvPXQuZ2V0VGltZSgpLWUuZ2V0VGltZSgpO2k9MStNYXRoLnJvdW5kKG8vNjA0OGU1KX1yZXR1cm4gRkMoaSx0LHZDKG8sYkMuTWludXNTaWduKSl9fWZ1bmN0aW9uIEdDKHQsZT0hMSl7cmV0dXJuIGZ1bmN0aW9uKG4sbyl7cmV0dXJuIEZDKGpDKG4pLmdldEZ1bGxZZWFyKCksdCx2QyhvLGJDLk1pbnVzU2lnbiksZSl9fSEoZnVuY3Rpb24odCl7dFt0LlNob3J0PTBdPSJTaG9ydCIsdFt0LlNob3J0R01UPTFdPSJTaG9ydEdNVCIsdFt0Lkxvbmc9Ml09IkxvbmciLHRbdC5FeHRlbmRlZD0zXT0iRXh0ZW5kZWQifSkoUkN8fChSQz17fSkpLChmdW5jdGlvbih0KXt0W3QuRnVsbFllYXI9MF09IkZ1bGxZZWFyIix0W3QuTW9udGg9MV09Ik1vbnRoIix0W3QuRGF0ZT0yXT0iRGF0ZSIsdFt0LkhvdXJzPTNdPSJIb3VycyIsdFt0Lk1pbnV0ZXM9NF09Ik1pbnV0ZXMiLHRbdC5TZWNvbmRzPTVdPSJTZWNvbmRzIix0W3QuRnJhY3Rpb25hbFNlY29uZHM9Nl09IkZyYWN0aW9uYWxTZWNvbmRzIix0W3QuRGF5PTddPSJEYXkifSkoQUN8fChBQz17fSkpLChmdW5jdGlvbih0KXt0W3QuRGF5UGVyaW9kcz0wXT0iRGF5UGVyaW9kcyIsdFt0LkRheXM9MV09IkRheXMiLHRbdC5Nb250aHM9Ml09Ik1vbnRocyIsdFt0LkVyYXM9M109IkVyYXMifSkoVEN8fChUQz17fSkpO2NvbnN0IFdDPXt9O2Z1bmN0aW9uIFlDKHQsZSl7dD10LnJlcGxhY2UoLzovZywiIik7Y29uc3Qgbj1EYXRlLnBhcnNlKCJKYW4gMDEsIDE5NzAgMDA6MDA6MDAgIit0KS82ZTQ7cmV0dXJuIGlzTmFOKG4pP2U6bn1mdW5jdGlvbiBxQyh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIERhdGUmJiFpc05hTih0LnZhbHVlT2YoKSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NvbnN0IFpDPS9eKFxkKyk/XC4oKFxkKykoLShcZCspKT8pPyQvLFhDPSIuIixLQz0iMCI7ZnVuY3Rpb24gSkModCxlLG4sbyxpLGEscj0hMSl7bGV0IHM9IiIsbD0hMTtpZihpc0Zpbml0ZSh0KSl7bGV0IGM9KGZ1bmN0aW9uIGModCl7bGV0IGUsbixvLGksYSxyPU1hdGguYWJzKHQpKyIiLHM9MDtmb3IoKG49ci5pbmRleE9mKFhDKSk+LTEmJihyPXIucmVwbGFjZShYQywiIikpLChvPXIuc2VhcmNoKC9lL2kpKT4wPyhuPDAmJihuPW8pLG4rPStyLnNsaWNlKG8rMSkscj1yLnN1YnN0cmluZygwLG8pKTpuPDAmJihuPXIubGVuZ3RoKSxvPTA7ci5jaGFyQXQobyk9PT1LQztvKyspO2lmKG89PT0oYT1yLmxlbmd0aCkpZT1bMF0sbj0xO2Vsc2V7Zm9yKGEtLTtyLmNoYXJBdChhKT09PUtDOylhLS07Zm9yKG4tPW8sZT1bXSxpPTA7bzw9YTtvKyssaSsrKWVbaV09TnVtYmVyKHIuY2hhckF0KG8pKX1yZXR1cm4gbj4yMiYmKGU9ZS5zcGxpY2UoMCwyMSkscz1uLTEsbj0xKSx7ZGlnaXRzOmUsZXhwb25lbnQ6cyxpbnRlZ2VyTGVuOm59fSkodCk7ciYmKGM9KGZ1bmN0aW9uIGQodCl7aWYoMD09PXQuZGlnaXRzWzBdKXJldHVybiB0O2NvbnN0IGU9dC5kaWdpdHMubGVuZ3RoLXQuaW50ZWdlckxlbjtyZXR1cm4gdC5leHBvbmVudD90LmV4cG9uZW50Kz0yOigwPT09ZT90LmRpZ2l0cy5wdXNoKDAsMCk6MT09PWUmJnQuZGlnaXRzLnB1c2goMCksdC5pbnRlZ2VyTGVuKz0yKSx0fSkoYykpO2xldCBkPWUubWluSW50LHA9ZS5taW5GcmFjLG09ZS5tYXhGcmFjO2lmKGEpe2NvbnN0IHQ9YS5tYXRjaChaQyk7aWYobnVsbD09PXQpdGhyb3cgbmV3IEVycm9yKGAke2F9IGlzIG5vdCBhIHZhbGlkIGRpZ2l0IGluZm9gKTtjb25zdCBlPXRbMV0sbj10WzNdLG89dFs1XTtudWxsIT1lJiYoZD10TShlKSksbnVsbCE9biYmKHA9dE0obikpLG51bGwhPW8/bT10TShvKTpudWxsIT1uJiZwPm0mJihtPXApfSEoZnVuY3Rpb24gcCh0LGUsbil7aWYoZT5uKXRocm93IG5ldyBFcnJvcihgVGhlIG1pbmltdW0gbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciBmcmFjdGlvbiAoJHtlfSkgaXMgaGlnaGVyIHRoYW4gdGhlIG1heGltdW0gKCR7bn0pLmApO2xldCBvPXQuZGlnaXRzLGk9by5sZW5ndGgtdC5pbnRlZ2VyTGVuO2NvbnN0IGE9TWF0aC5taW4oTWF0aC5tYXgoZSxpKSxuKTtsZXQgcj1hK3QuaW50ZWdlckxlbixzPW9bcl07aWYocj4wKXtvLnNwbGljZShNYXRoLm1heCh0LmludGVnZXJMZW4scikpO2ZvcihsZXQgdD1yO3Q8by5sZW5ndGg7dCsrKW9bdF09MH1lbHNle2k9TWF0aC5tYXgoMCxpKSx0LmludGVnZXJMZW49MSxvLmxlbmd0aD1NYXRoLm1heCgxLHI9YSsxKSxvWzBdPTA7Zm9yKGxldCB0PTE7dDxyO3QrKylvW3RdPTB9aWYocz49NSlpZihyLTE8MCl7Zm9yKGxldCBlPTA7ZT5yO2UtLSlvLnVuc2hpZnQoMCksdC5pbnRlZ2VyTGVuKys7by51bnNoaWZ0KDEpLHQuaW50ZWdlckxlbisrfWVsc2Ugb1tyLTFdKys7Zm9yKDtpPE1hdGgubWF4KDAsYSk7aSsrKW8ucHVzaCgwKTtsZXQgbD0wIT09YTtjb25zdCBjPWUrdC5pbnRlZ2VyTGVuLGQ9by5yZWR1Y2VSaWdodCgoZnVuY3Rpb24odCxlLG4sbyl7cmV0dXJuIG9bbl09KGUrPXQpPDEwP2U6ZS0xMCxsJiYoMD09PW9bbl0mJm4+PWM/by5wb3AoKTpsPSExKSxlPj0xMD8xOjB9KSwwKTtkJiYoby51bnNoaWZ0KGQpLHQuaW50ZWdlckxlbisrKX0pKGMscCxtKTtsZXQgdT1jLmRpZ2l0cyxmPWMuaW50ZWdlckxlbjtjb25zdCBnPWMuZXhwb25lbnQ7bGV0IGg9W107Zm9yKGw9dS5ldmVyeSgodD0+IXQpKTtmPGQ7ZisrKXUudW5zaGlmdCgwKTtmb3IoO2Y8MDtmKyspdS51bnNoaWZ0KDApO2Y+MD9oPXUuc3BsaWNlKGYsdS5sZW5ndGgpOihoPXUsdT1bMF0pO2NvbnN0IGI9W107Zm9yKHUubGVuZ3RoPj1lLmxnU2l6ZSYmYi51bnNoaWZ0KHUuc3BsaWNlKC1lLmxnU2l6ZSx1Lmxlbmd0aCkuam9pbigiIikpO3UubGVuZ3RoPmUuZ1NpemU7KWIudW5zaGlmdCh1LnNwbGljZSgtZS5nU2l6ZSx1Lmxlbmd0aCkuam9pbigiIikpO3UubGVuZ3RoJiZiLnVuc2hpZnQodS5qb2luKCIiKSkscz1iLmpvaW4odkMobixvKSksaC5sZW5ndGgmJihzKz12QyhuLGkpK2guam9pbigiIikpLGcmJihzKz12QyhuLGJDLkV4cG9uZW50aWFsKSsiKyIrZyl9ZWxzZSBzPXZDKG4sYkMuSW5maW5pdHkpO3JldHVybiBzPXQ8MCYmIWw/ZS5uZWdQcmUrcytlLm5lZ1N1ZjplLnBvc1ByZStzK2UucG9zU3VmLHN9ZnVuY3Rpb24gUUModCxlLG4pe3JldHVybiBKQyh0LCRDKHhDKGUsbUMuRGVjaW1hbCksdkMoZSxiQy5NaW51c1NpZ24pKSxlLGJDLkdyb3VwLGJDLkRlY2ltYWwsbil9ZnVuY3Rpb24gJEModCxlPSItIil7Y29uc3Qgbj17bWluSW50OjEsbWluRnJhYzowLG1heEZyYWM6MCxwb3NQcmU6IiIscG9zU3VmOiIiLG5lZ1ByZToiIixuZWdTdWY6IiIsZ1NpemU6MCxsZ1NpemU6MH0sbz10LnNwbGl0KCI7IiksaT1vWzBdLGE9b1sxXSxyPS0xIT09aS5pbmRleE9mKFhDKT9pLnNwbGl0KFhDKTpbaS5zdWJzdHJpbmcoMCxpLmxhc3RJbmRleE9mKEtDKSsxKSxpLnN1YnN0cmluZyhpLmxhc3RJbmRleE9mKEtDKSsxKV0scz1yWzBdLGw9clsxXXx8IiI7bi5wb3NQcmU9cy5zdWJzdHIoMCxzLmluZGV4T2YoIiMiKSk7Zm9yKGxldCB0PTA7dDxsLmxlbmd0aDt0Kyspe2NvbnN0IGU9bC5jaGFyQXQodCk7ZT09PUtDP24ubWluRnJhYz1uLm1heEZyYWM9dCsxOiIjIj09PWU/bi5tYXhGcmFjPXQrMTpuLnBvc1N1Zis9ZX1jb25zdCBjPXMuc3BsaXQoIiwiKTtpZihuLmdTaXplPWNbMV0/Y1sxXS5sZW5ndGg6MCxuLmxnU2l6ZT1jWzJdfHxjWzFdPyhjWzJdfHxjWzFdKS5sZW5ndGg6MCxhKXtjb25zdCB0PWkubGVuZ3RoLW4ucG9zUHJlLmxlbmd0aC1uLnBvc1N1Zi5sZW5ndGgsZT1hLmluZGV4T2YoIiMiKTtuLm5lZ1ByZT1hLnN1YnN0cigwLGUpLnJlcGxhY2UoLycvZywiIiksbi5uZWdTdWY9YS5zdWJzdHIoZSt0KS5yZXBsYWNlKC8nL2csIiIpfWVsc2Ugbi5uZWdQcmU9ZStuLnBvc1ByZSxuLm5lZ1N1Zj1uLnBvc1N1ZjtyZXR1cm4gbn1mdW5jdGlvbiB0TSh0KXtjb25zdCBlPXBhcnNlSW50KHQpO2lmKGlzTmFOKGUpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnRlZ2VyIGxpdGVyYWwgd2hlbiBwYXJzaW5nICIrdCk7cmV0dXJuIGV9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIGVNe31mdW5jdGlvbiBuTSh0LGUsbixvKXtsZXQgaT1gPSR7dH1gO2lmKGUuaW5kZXhPZihpKT4tMSlyZXR1cm4gaTtpZihpPW4uZ2V0UGx1cmFsQ2F0ZWdvcnkodCxvKSxlLmluZGV4T2YoaSk+LTEpcmV0dXJuIGk7aWYoZS5pbmRleE9mKCJvdGhlciIpPi0xKXJldHVybiJvdGhlciI7dGhyb3cgbmV3IEVycm9yKGBObyBwbHVyYWwgbWVzc2FnZSBmb3VuZCBmb3IgdmFsdWUgIiR7dH0iYCl9Y2xhc3Mgb00gZXh0ZW5kcyBlTXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMubG9jYWxlPXR9Z2V0UGx1cmFsQ2F0ZWdvcnkodCxlKXtzd2l0Y2goT0MoZXx8dGhpcy5sb2NhbGUpKHQpKXtjYXNlIHVDLlplcm86cmV0dXJuInplcm8iO2Nhc2UgdUMuT25lOnJldHVybiJvbmUiO2Nhc2UgdUMuVHdvOnJldHVybiJ0d28iO2Nhc2UgdUMuRmV3OnJldHVybiJmZXciO2Nhc2UgdUMuTWFueTpyZXR1cm4ibWFueSI7ZGVmYXVsdDpyZXR1cm4ib3RoZXIifX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBpTSh0LGUpe2U9ZW5jb2RlVVJJQ29tcG9uZW50KGUpO2Zvcihjb25zdCBuIG9mIHQuc3BsaXQoIjsiKSl7Y29uc3QgdD1uLmluZGV4T2YoIj0iKSxbbyxpXT0tMT09dD9bbiwiIl06W24uc2xpY2UoMCx0KSxuLnNsaWNlKHQrMSldO2lmKG8udHJpbSgpPT09ZSlyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGkpfXJldHVybiBudWxsfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9vTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8b00pKHZyKFd5KSl9LG9NLsm1cHJvdj1Nbih7dG9rZW46b00sZmFjdG9yeTpvTS7JtWZhY30pLG9NLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1d5XX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChvTSxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1d5XX1dfV19KSxudWxsKTtjbGFzcyBhTXtjb25zdHJ1Y3Rvcih0LGUsbixvKXt0aGlzLl9pdGVyYWJsZURpZmZlcnM9dCx0aGlzLl9rZXlWYWx1ZURpZmZlcnM9ZSx0aGlzLl9uZ0VsPW4sdGhpcy5fcmVuZGVyZXI9byx0aGlzLl9pdGVyYWJsZURpZmZlcj1udWxsLHRoaXMuX2tleVZhbHVlRGlmZmVyPW51bGwsdGhpcy5faW5pdGlhbENsYXNzZXM9W10sdGhpcy5fcmF3Q2xhc3M9bnVsbH1zZXQga2xhc3ModCl7dGhpcy5fcmVtb3ZlQ2xhc3Nlcyh0aGlzLl9pbml0aWFsQ2xhc3NlcyksdGhpcy5faW5pdGlhbENsYXNzZXM9InN0cmluZyI9PXR5cGVvZiB0P3Quc3BsaXQoL1xzKy8pOltdLHRoaXMuX2FwcGx5Q2xhc3Nlcyh0aGlzLl9pbml0aWFsQ2xhc3NlcyksdGhpcy5fYXBwbHlDbGFzc2VzKHRoaXMuX3Jhd0NsYXNzKX1zZXQgbmdDbGFzcyh0KXt0aGlzLl9yZW1vdmVDbGFzc2VzKHRoaXMuX3Jhd0NsYXNzKSx0aGlzLl9hcHBseUNsYXNzZXModGhpcy5faW5pdGlhbENsYXNzZXMpLHRoaXMuX2l0ZXJhYmxlRGlmZmVyPW51bGwsdGhpcy5fa2V5VmFsdWVEaWZmZXI9bnVsbCx0aGlzLl9yYXdDbGFzcz0ic3RyaW5nIj09dHlwZW9mIHQ/dC5zcGxpdCgvXHMrLyk6dCx0aGlzLl9yYXdDbGFzcyYmKE5wKHRoaXMuX3Jhd0NsYXNzKT90aGlzLl9pdGVyYWJsZURpZmZlcj10aGlzLl9pdGVyYWJsZURpZmZlcnMuZmluZCh0aGlzLl9yYXdDbGFzcykuY3JlYXRlKCk6dGhpcy5fa2V5VmFsdWVEaWZmZXI9dGhpcy5fa2V5VmFsdWVEaWZmZXJzLmZpbmQodGhpcy5fcmF3Q2xhc3MpLmNyZWF0ZSgpKX1uZ0RvQ2hlY2soKXtpZih0aGlzLl9pdGVyYWJsZURpZmZlcil7Y29uc3QgdD10aGlzLl9pdGVyYWJsZURpZmZlci5kaWZmKHRoaXMuX3Jhd0NsYXNzKTt0JiZ0aGlzLl9hcHBseUl0ZXJhYmxlQ2hhbmdlcyh0KX1lbHNlIGlmKHRoaXMuX2tleVZhbHVlRGlmZmVyKXtjb25zdCB0PXRoaXMuX2tleVZhbHVlRGlmZmVyLmRpZmYodGhpcy5fcmF3Q2xhc3MpO3QmJnRoaXMuX2FwcGx5S2V5VmFsdWVDaGFuZ2VzKHQpfX1fYXBwbHlLZXlWYWx1ZUNoYW5nZXModCl7dC5mb3JFYWNoQWRkZWRJdGVtKCh0PT50aGlzLl90b2dnbGVDbGFzcyh0LmtleSx0LmN1cnJlbnRWYWx1ZSkpKSx0LmZvckVhY2hDaGFuZ2VkSXRlbSgodD0+dGhpcy5fdG9nZ2xlQ2xhc3ModC5rZXksdC5jdXJyZW50VmFsdWUpKSksdC5mb3JFYWNoUmVtb3ZlZEl0ZW0oKHQ9Pnt0LnByZXZpb3VzVmFsdWUmJnRoaXMuX3RvZ2dsZUNsYXNzKHQua2V5LCExKX0pKX1fYXBwbHlJdGVyYWJsZUNoYW5nZXModCl7dC5mb3JFYWNoQWRkZWRJdGVtKCh0PT57aWYoInN0cmluZyIhPXR5cGVvZiB0Lml0ZW0pdGhyb3cgbmV3IEVycm9yKGBOZ0NsYXNzIGNhbiBvbmx5IHRvZ2dsZSBDU1MgY2xhc3NlcyBleHByZXNzZWQgYXMgc3RyaW5ncywgZ290ICR7R2UodC5pdGVtKX1gKTt0aGlzLl90b2dnbGVDbGFzcyh0Lml0ZW0sITApfSkpLHQuZm9yRWFjaFJlbW92ZWRJdGVtKCh0PT50aGlzLl90b2dnbGVDbGFzcyh0Lml0ZW0sITEpKSl9X2FwcGx5Q2xhc3Nlcyh0KXt0JiYoQXJyYXkuaXNBcnJheSh0KXx8dCBpbnN0YW5jZW9mIFNldD90LmZvckVhY2goKHQ9PnRoaXMuX3RvZ2dsZUNsYXNzKHQsITApKSk6T2JqZWN0LmtleXModCkuZm9yRWFjaCgoZT0+dGhpcy5fdG9nZ2xlQ2xhc3MoZSwhIXRbZV0pKSkpfV9yZW1vdmVDbGFzc2VzKHQpe3QmJihBcnJheS5pc0FycmF5KHQpfHx0IGluc3RhbmNlb2YgU2V0P3QuZm9yRWFjaCgodD0+dGhpcy5fdG9nZ2xlQ2xhc3ModCwhMSkpKTpPYmplY3Qua2V5cyh0KS5mb3JFYWNoKCh0PT50aGlzLl90b2dnbGVDbGFzcyh0LCExKSkpKX1fdG9nZ2xlQ2xhc3ModCxlKXsodD10LnRyaW0oKSkmJnQuc3BsaXQoL1xzKy9nKS5mb3JFYWNoKCh0PT57ZT90aGlzLl9yZW5kZXJlci5hZGRDbGFzcyh0aGlzLl9uZ0VsLm5hdGl2ZUVsZW1lbnQsdCk6dGhpcy5fcmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5fbmdFbC5uYXRpdmVFbGVtZW50LHQpfSkpfX1hTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8YU0pKFNtKEhnKSxTbShMZyksU20oaGcpLFNtKENnKSl9LGFNLsm1ZGlyPWxvKHt0eXBlOmFNLHNlbGVjdG9yczpbWyIiLCJuZ0NsYXNzIiwiIl1dLGlucHV0czp7a2xhc3M6WyJjbGFzcyIsImtsYXNzIl0sbmdDbGFzczoibmdDbGFzcyJ9fSksYU0uY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpIZ30se3R5cGU6TGd9LHt0eXBlOmhnfSx7dHlwZTpDZ31dLGFNLnByb3BEZWNvcmF0b3JzPXtrbGFzczpbe3R5cGU6eHksYXJnczpbImNsYXNzIl19XSxuZ0NsYXNzOlt7dHlwZTp4eSxhcmdzOlsibmdDbGFzcyJdfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoYU0sW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW25nQ2xhc3NdIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkhnfSx7dHlwZTpMZ30se3R5cGU6aGd9LHt0eXBlOkNnfV19KSx7a2xhc3M6W3t0eXBlOnh5LGFyZ3M6WyJjbGFzcyJdfV0sbmdDbGFzczpbe3R5cGU6eHksYXJnczpbIm5nQ2xhc3MiXX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyByTXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl92aWV3Q29udGFpbmVyUmVmPXQsdGhpcy5fY29tcG9uZW50UmVmPW51bGwsdGhpcy5fbW9kdWxlUmVmPW51bGx9bmdPbkNoYW5nZXModCl7aWYodGhpcy5fdmlld0NvbnRhaW5lclJlZi5jbGVhcigpLHRoaXMuX2NvbXBvbmVudFJlZj1udWxsLHRoaXMubmdDb21wb25lbnRPdXRsZXQpe2NvbnN0IGU9dGhpcy5uZ0NvbXBvbmVudE91dGxldEluamVjdG9yfHx0aGlzLl92aWV3Q29udGFpbmVyUmVmLnBhcmVudEluamVjdG9yO2lmKHQubmdDb21wb25lbnRPdXRsZXROZ01vZHVsZUZhY3RvcnkpaWYodGhpcy5fbW9kdWxlUmVmJiZ0aGlzLl9tb2R1bGVSZWYuZGVzdHJveSgpLHRoaXMubmdDb21wb25lbnRPdXRsZXROZ01vZHVsZUZhY3Rvcnkpe2NvbnN0IHQ9ZS5nZXQodGgpO3RoaXMuX21vZHVsZVJlZj10aGlzLm5nQ29tcG9uZW50T3V0bGV0TmdNb2R1bGVGYWN0b3J5LmNyZWF0ZSh0LmluamVjdG9yKX1lbHNlIHRoaXMuX21vZHVsZVJlZj1udWxsO2NvbnN0IG49KHRoaXMuX21vZHVsZVJlZj90aGlzLl9tb2R1bGVSZWYuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOmUuZ2V0KHVnKSkucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkodGhpcy5uZ0NvbXBvbmVudE91dGxldCk7dGhpcy5fY29tcG9uZW50UmVmPXRoaXMuX3ZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KG4sdGhpcy5fdmlld0NvbnRhaW5lclJlZi5sZW5ndGgsZSx0aGlzLm5nQ29tcG9uZW50T3V0bGV0Q29udGVudCl9fW5nT25EZXN0cm95KCl7dGhpcy5fbW9kdWxlUmVmJiZ0aGlzLl9tb2R1bGVSZWYuZGVzdHJveSgpfX1yTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8ck0pKFNtKGVoKSl9LHJNLsm1ZGlyPWxvKHt0eXBlOnJNLHNlbGVjdG9yczpbWyIiLCJuZ0NvbXBvbmVudE91dGxldCIsIiJdXSxpbnB1dHM6e25nQ29tcG9uZW50T3V0bGV0OiJuZ0NvbXBvbmVudE91dGxldCIsbmdDb21wb25lbnRPdXRsZXRJbmplY3RvcjoibmdDb21wb25lbnRPdXRsZXRJbmplY3RvciIsbmdDb21wb25lbnRPdXRsZXRDb250ZW50OiJuZ0NvbXBvbmVudE91dGxldENvbnRlbnQiLG5nQ29tcG9uZW50T3V0bGV0TmdNb2R1bGVGYWN0b3J5OiJuZ0NvbXBvbmVudE91dGxldE5nTW9kdWxlRmFjdG9yeSJ9LGZlYXR1cmVzOltCb119KSxyTS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmVofV0sck0ucHJvcERlY29yYXRvcnM9e25nQ29tcG9uZW50T3V0bGV0Olt7dHlwZTp4eX1dLG5nQ29tcG9uZW50T3V0bGV0SW5qZWN0b3I6W3t0eXBlOnh5fV0sbmdDb21wb25lbnRPdXRsZXRDb250ZW50Olt7dHlwZTp4eX1dLG5nQ29tcG9uZW50T3V0bGV0TmdNb2R1bGVGYWN0b3J5Olt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHJNLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IltuZ0NvbXBvbmVudE91dGxldF0ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6ZWh9XX0pLHtuZ0NvbXBvbmVudE91dGxldDpbe3R5cGU6eHl9XSxuZ0NvbXBvbmVudE91dGxldEluamVjdG9yOlt7dHlwZTp4eX1dLG5nQ29tcG9uZW50T3V0bGV0Q29udGVudDpbe3R5cGU6eHl9XSxuZ0NvbXBvbmVudE91dGxldE5nTW9kdWxlRmFjdG9yeTpbe3R5cGU6eHl9XX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3Mgc017Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy4kaW1wbGljaXQ9dCx0aGlzLm5nRm9yT2Y9ZSx0aGlzLmluZGV4PW4sdGhpcy5jb3VudD1vfWdldCBmaXJzdCgpe3JldHVybiAwPT09dGhpcy5pbmRleH1nZXQgbGFzdCgpe3JldHVybiB0aGlzLmluZGV4PT09dGhpcy5jb3VudC0xfWdldCBldmVuKCl7cmV0dXJuIHRoaXMuaW5kZXglMj09MH1nZXQgb2RkKCl7cmV0dXJuIXRoaXMuZXZlbn19Y2xhc3MgbE17Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuX3ZpZXdDb250YWluZXI9dCx0aGlzLl90ZW1wbGF0ZT1lLHRoaXMuX2RpZmZlcnM9bix0aGlzLl9uZ0Zvck9mPW51bGwsdGhpcy5fbmdGb3JPZkRpcnR5PSEwLHRoaXMuX2RpZmZlcj1udWxsfXNldCBuZ0Zvck9mKHQpe3RoaXMuX25nRm9yT2Y9dCx0aGlzLl9uZ0Zvck9mRGlydHk9ITB9c2V0IG5nRm9yVHJhY2tCeSh0KXsidW5kZWZpbmVkIiE9dHlwZW9mIG5nRGV2TW9kZSYmIW5nRGV2TW9kZXx8bnVsbD09dHx8ImZ1bmN0aW9uIj09dHlwZW9mIHR8fGNvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKGB0cmFja0J5IG11c3QgYmUgYSBmdW5jdGlvbiwgYnV0IHJlY2VpdmVkICR7SlNPTi5zdHJpbmdpZnkodCl9LiBTZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9jb21tb24vTmdGb3JPZiNjaGFuZ2UtcHJvcGFnYXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uYCksdGhpcy5fdHJhY2tCeUZuPXR9Z2V0IG5nRm9yVHJhY2tCeSgpe3JldHVybiB0aGlzLl90cmFja0J5Rm59c2V0IG5nRm9yVGVtcGxhdGUodCl7dCYmKHRoaXMuX3RlbXBsYXRlPXQpfW5nRG9DaGVjaygpe2lmKHRoaXMuX25nRm9yT2ZEaXJ0eSl7dGhpcy5fbmdGb3JPZkRpcnR5PSExO2NvbnN0IHQ9dGhpcy5fbmdGb3JPZjtpZighdGhpcy5fZGlmZmVyJiZ0KXRyeXt0aGlzLl9kaWZmZXI9dGhpcy5fZGlmZmVycy5maW5kKHQpLmNyZWF0ZSh0aGlzLm5nRm9yVHJhY2tCeSl9Y2F0Y2goZSl7dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBhIGRpZmZlciBzdXBwb3J0aW5nIG9iamVjdCAnJHt0fScgb2YgdHlwZSAnJHsoZnVuY3Rpb24gbih0KXtyZXR1cm4gdC5uYW1lfHx0eXBlb2YgdH0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKSh0KX0nLiBOZ0ZvciBvbmx5IHN1cHBvcnRzIGJpbmRpbmcgdG8gSXRlcmFibGVzIHN1Y2ggYXMgQXJyYXlzLmApfX1pZih0aGlzLl9kaWZmZXIpe2NvbnN0IHQ9dGhpcy5fZGlmZmVyLmRpZmYodGhpcy5fbmdGb3JPZik7dCYmdGhpcy5fYXBwbHlDaGFuZ2VzKHQpfX1fYXBwbHlDaGFuZ2VzKHQpe2NvbnN0IGU9W107dC5mb3JFYWNoT3BlcmF0aW9uKCgodCxuLG8pPT57aWYobnVsbD09dC5wcmV2aW91c0luZGV4KXtjb25zdCBuPXRoaXMuX3ZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMuX3RlbXBsYXRlLG5ldyBzTShudWxsLHRoaXMuX25nRm9yT2YsLTEsLTEpLG51bGw9PT1vP3ZvaWQgMDpvKSxpPW5ldyBjTSh0LG4pO2UucHVzaChpKX1lbHNlIGlmKG51bGw9PW8pdGhpcy5fdmlld0NvbnRhaW5lci5yZW1vdmUobnVsbD09PW4/dm9pZCAwOm4pO2Vsc2UgaWYobnVsbCE9PW4pe2NvbnN0IGk9dGhpcy5fdmlld0NvbnRhaW5lci5nZXQobik7dGhpcy5fdmlld0NvbnRhaW5lci5tb3ZlKGksbyk7Y29uc3QgYT1uZXcgY00odCxpKTtlLnB1c2goYSl9fSkpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXRoaXMuX3BlclZpZXdDaGFuZ2UoZVt0XS52aWV3LGVbdF0ucmVjb3JkKTtmb3IobGV0IHQ9MCxlPXRoaXMuX3ZpZXdDb250YWluZXIubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IG49dGhpcy5fdmlld0NvbnRhaW5lci5nZXQodCk7bi5jb250ZXh0LmluZGV4PXQsbi5jb250ZXh0LmNvdW50PWUsbi5jb250ZXh0Lm5nRm9yT2Y9dGhpcy5fbmdGb3JPZn10LmZvckVhY2hJZGVudGl0eUNoYW5nZSgodD0+e3RoaXMuX3ZpZXdDb250YWluZXIuZ2V0KHQuY3VycmVudEluZGV4KS5jb250ZXh0LiRpbXBsaWNpdD10Lml0ZW19KSl9X3BlclZpZXdDaGFuZ2UodCxlKXt0LmNvbnRleHQuJGltcGxpY2l0PWUuaXRlbX1zdGF0aWMgbmdUZW1wbGF0ZUNvbnRleHRHdWFyZCh0LGUpe3JldHVybiEwfX1sTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bE0pKFNtKGVoKSxTbShYZyksU20oSGcpKX0sbE0uybVkaXI9bG8oe3R5cGU6bE0sc2VsZWN0b3JzOltbIiIsIm5nRm9yIiwiIiwibmdGb3JPZiIsIiJdXSxpbnB1dHM6e25nRm9yT2Y6Im5nRm9yT2YiLG5nRm9yVHJhY2tCeToibmdGb3JUcmFja0J5IixuZ0ZvclRlbXBsYXRlOiJuZ0ZvclRlbXBsYXRlIn19KSxsTS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmVofSx7dHlwZTpYZ30se3R5cGU6SGd9XSxsTS5wcm9wRGVjb3JhdG9ycz17bmdGb3JPZjpbe3R5cGU6eHl9XSxuZ0ZvclRyYWNrQnk6W3t0eXBlOnh5fV0sbmdGb3JUZW1wbGF0ZTpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChsTSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbmdGb3JdW25nRm9yT2ZdIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmVofSx7dHlwZTpYZ30se3R5cGU6SGd9XX0pLHtuZ0Zvck9mOlt7dHlwZTp4eX1dLG5nRm9yVHJhY2tCeTpbe3R5cGU6eHl9XSxuZ0ZvclRlbXBsYXRlOlt7dHlwZTp4eX1dfSk7Y2xhc3MgY017Y29uc3RydWN0b3IodCxlKXt0aGlzLnJlY29yZD10LHRoaXMudmlldz1lfX1jbGFzcyBkTXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX3ZpZXdDb250YWluZXI9dCx0aGlzLl9jb250ZXh0PW5ldyBwTSx0aGlzLl90aGVuVGVtcGxhdGVSZWY9bnVsbCx0aGlzLl9lbHNlVGVtcGxhdGVSZWY9bnVsbCx0aGlzLl90aGVuVmlld1JlZj1udWxsLHRoaXMuX2Vsc2VWaWV3UmVmPW51bGwsdGhpcy5fdGhlblRlbXBsYXRlUmVmPWV9c2V0IG5nSWYodCl7dGhpcy5fY29udGV4dC4kaW1wbGljaXQ9dGhpcy5fY29udGV4dC5uZ0lmPXQsdGhpcy5fdXBkYXRlVmlldygpfXNldCBuZ0lmVGhlbih0KXttTSgibmdJZlRoZW4iLHQpLHRoaXMuX3RoZW5UZW1wbGF0ZVJlZj10LHRoaXMuX3RoZW5WaWV3UmVmPW51bGwsdGhpcy5fdXBkYXRlVmlldygpfXNldCBuZ0lmRWxzZSh0KXttTSgibmdJZkVsc2UiLHQpLHRoaXMuX2Vsc2VUZW1wbGF0ZVJlZj10LHRoaXMuX2Vsc2VWaWV3UmVmPW51bGwsdGhpcy5fdXBkYXRlVmlldygpfV91cGRhdGVWaWV3KCl7dGhpcy5fY29udGV4dC4kaW1wbGljaXQ/dGhpcy5fdGhlblZpZXdSZWZ8fCh0aGlzLl92aWV3Q29udGFpbmVyLmNsZWFyKCksdGhpcy5fZWxzZVZpZXdSZWY9bnVsbCx0aGlzLl90aGVuVGVtcGxhdGVSZWYmJih0aGlzLl90aGVuVmlld1JlZj10aGlzLl92aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLl90aGVuVGVtcGxhdGVSZWYsdGhpcy5fY29udGV4dCkpKTp0aGlzLl9lbHNlVmlld1JlZnx8KHRoaXMuX3ZpZXdDb250YWluZXIuY2xlYXIoKSx0aGlzLl90aGVuVmlld1JlZj1udWxsLHRoaXMuX2Vsc2VUZW1wbGF0ZVJlZiYmKHRoaXMuX2Vsc2VWaWV3UmVmPXRoaXMuX3ZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMuX2Vsc2VUZW1wbGF0ZVJlZix0aGlzLl9jb250ZXh0KSkpfXN0YXRpYyBuZ1RlbXBsYXRlQ29udGV4dEd1YXJkKHQsZSl7cmV0dXJuITB9fWRNLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxkTSkoU20oZWgpLFNtKFhnKSl9LGRNLsm1ZGlyPWxvKHt0eXBlOmRNLHNlbGVjdG9yczpbWyIiLCJuZ0lmIiwiIl1dLGlucHV0czp7bmdJZjoibmdJZiIsbmdJZlRoZW46Im5nSWZUaGVuIixuZ0lmRWxzZToibmdJZkVsc2UifX0pLGRNLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6ZWh9LHt0eXBlOlhnfV0sZE0ucHJvcERlY29yYXRvcnM9e25nSWY6W3t0eXBlOnh5fV0sbmdJZlRoZW46W3t0eXBlOnh5fV0sbmdJZkVsc2U6W3t0eXBlOnh5fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZE0sW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW25nSWZdIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmVofSx7dHlwZTpYZ31dfSkse25nSWY6W3t0eXBlOnh5fV0sbmdJZlRoZW46W3t0eXBlOnh5fV0sbmdJZkVsc2U6W3t0eXBlOnh5fV19KTtjbGFzcyBwTXtjb25zdHJ1Y3Rvcigpe3RoaXMuJGltcGxpY2l0PW51bGwsdGhpcy5uZ0lmPW51bGx9fWZ1bmN0aW9uIG1NKHQsZSl7aWYoZSYmIWUuY3JlYXRlRW1iZWRkZWRWaWV3KXRocm93IG5ldyBFcnJvcihgJHt0fSBtdXN0IGJlIGEgVGVtcGxhdGVSZWYsIGJ1dCByZWNlaXZlZCAnJHtHZShlKX0nLmApfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyB1TXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX3ZpZXdDb250YWluZXJSZWY9dCx0aGlzLl90ZW1wbGF0ZVJlZj1lLHRoaXMuX2NyZWF0ZWQ9ITF9Y3JlYXRlKCl7dGhpcy5fY3JlYXRlZD0hMCx0aGlzLl92aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLl90ZW1wbGF0ZVJlZil9ZGVzdHJveSgpe3RoaXMuX2NyZWF0ZWQ9ITEsdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jbGVhcigpfWVuZm9yY2VTdGF0ZSh0KXt0JiYhdGhpcy5fY3JlYXRlZD90aGlzLmNyZWF0ZSgpOiF0JiZ0aGlzLl9jcmVhdGVkJiZ0aGlzLmRlc3Ryb3koKX19Y2xhc3MgZk17Y29uc3RydWN0b3IoKXt0aGlzLl9kZWZhdWx0VXNlZD0hMSx0aGlzLl9jYXNlQ291bnQ9MCx0aGlzLl9sYXN0Q2FzZUNoZWNrSW5kZXg9MCx0aGlzLl9sYXN0Q2FzZXNNYXRjaGVkPSExfXNldCBuZ1N3aXRjaCh0KXt0aGlzLl9uZ1N3aXRjaD10LDA9PT10aGlzLl9jYXNlQ291bnQmJnRoaXMuX3VwZGF0ZURlZmF1bHRDYXNlcyghMCl9X2FkZENhc2UoKXtyZXR1cm4gdGhpcy5fY2FzZUNvdW50Kyt9X2FkZERlZmF1bHQodCl7dGhpcy5fZGVmYXVsdFZpZXdzfHwodGhpcy5fZGVmYXVsdFZpZXdzPVtdKSx0aGlzLl9kZWZhdWx0Vmlld3MucHVzaCh0KX1fbWF0Y2hDYXNlKHQpe2NvbnN0IGU9dD09dGhpcy5fbmdTd2l0Y2g7cmV0dXJuIHRoaXMuX2xhc3RDYXNlc01hdGNoZWQ9dGhpcy5fbGFzdENhc2VzTWF0Y2hlZHx8ZSx0aGlzLl9sYXN0Q2FzZUNoZWNrSW5kZXgrKyx0aGlzLl9sYXN0Q2FzZUNoZWNrSW5kZXg9PT10aGlzLl9jYXNlQ291bnQmJih0aGlzLl91cGRhdGVEZWZhdWx0Q2FzZXMoIXRoaXMuX2xhc3RDYXNlc01hdGNoZWQpLHRoaXMuX2xhc3RDYXNlQ2hlY2tJbmRleD0wLHRoaXMuX2xhc3RDYXNlc01hdGNoZWQ9ITEpLGV9X3VwZGF0ZURlZmF1bHRDYXNlcyh0KXtpZih0aGlzLl9kZWZhdWx0Vmlld3MmJnQhPT10aGlzLl9kZWZhdWx0VXNlZCl7dGhpcy5fZGVmYXVsdFVzZWQ9dDtmb3IobGV0IGU9MDtlPHRoaXMuX2RlZmF1bHRWaWV3cy5sZW5ndGg7ZSsrKXRoaXMuX2RlZmF1bHRWaWV3c1tlXS5lbmZvcmNlU3RhdGUodCl9fX1mTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8Zk0pfSxmTS7JtWRpcj1sbyh7dHlwZTpmTSxzZWxlY3RvcnM6W1siIiwibmdTd2l0Y2giLCIiXV0saW5wdXRzOntuZ1N3aXRjaDoibmdTd2l0Y2gifX0pLGZNLnByb3BEZWNvcmF0b3JzPXtuZ1N3aXRjaDpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChmTSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbmdTd2l0Y2hdIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW119KSx7bmdTd2l0Y2g6W3t0eXBlOnh5fV19KTtjbGFzcyBnTXtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5uZ1N3aXRjaD1uLCJ1bmRlZmluZWQiIT10eXBlb2YgbmdEZXZNb2RlJiYhbmdEZXZNb2RlfHxufHxiTSgibmdTd2l0Y2hDYXNlIiwiTmdTd2l0Y2hDYXNlIiksbi5fYWRkQ2FzZSgpLHRoaXMuX3ZpZXc9bmV3IHVNKHQsZSl9bmdEb0NoZWNrKCl7dGhpcy5fdmlldy5lbmZvcmNlU3RhdGUodGhpcy5uZ1N3aXRjaC5fbWF0Y2hDYXNlKHRoaXMubmdTd2l0Y2hDYXNlKSl9fWdNLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxnTSkoU20oZWgpLFNtKFhnKSxTbShmTSw5KSl9LGdNLsm1ZGlyPWxvKHt0eXBlOmdNLHNlbGVjdG9yczpbWyIiLCJuZ1N3aXRjaENhc2UiLCIiXV0saW5wdXRzOntuZ1N3aXRjaENhc2U6Im5nU3dpdGNoQ2FzZSJ9fSksZ00uY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTplaH0se3R5cGU6WGd9LHt0eXBlOmZNLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpScn1dfV0sZ00ucHJvcERlY29yYXRvcnM9e25nU3dpdGNoQ2FzZTpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChnTSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbmdTd2l0Y2hDYXNlXSJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTplaH0se3R5cGU6WGd9LHt0eXBlOmZNLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpScn1dfV19KSx7bmdTd2l0Y2hDYXNlOlt7dHlwZTp4eX1dfSk7Y2xhc3MgaE17Y29uc3RydWN0b3IodCxlLG4peyJ1bmRlZmluZWQiIT10eXBlb2YgbmdEZXZNb2RlJiYhbmdEZXZNb2RlfHxufHxiTSgibmdTd2l0Y2hEZWZhdWx0IiwiTmdTd2l0Y2hEZWZhdWx0Iiksbi5fYWRkRGVmYXVsdChuZXcgdU0odCxlKSl9fWZ1bmN0aW9uIGJNKHQsZSl7dGhyb3cgbmV3IEtlKCIzMDUiLGBBbiBlbGVtZW50IHdpdGggdGhlICIke3R9IiBhdHRyaWJ1dGUgKG1hdGNoaW5nIHRoZSAiJHtlfSIgZGlyZWN0aXZlKSBtdXN0IGJlIGxvY2F0ZWQgaW5zaWRlIGFuIGVsZW1lbnQgd2l0aCB0aGUgIm5nU3dpdGNoIiBhdHRyaWJ1dGUgKG1hdGNoaW5nICJOZ1N3aXRjaCIgZGlyZWN0aXZlKWApfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9oTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8aE0pKFNtKGVoKSxTbShYZyksU20oZk0sOSkpfSxoTS7JtWRpcj1sbyh7dHlwZTpoTSxzZWxlY3RvcnM6W1siIiwibmdTd2l0Y2hEZWZhdWx0IiwiIl1dfSksaE0uY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTplaH0se3R5cGU6WGd9LHt0eXBlOmZNLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpScn1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChoTSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbmdTd2l0Y2hEZWZhdWx0XSJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTplaH0se3R5cGU6WGd9LHt0eXBlOmZNLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpScn1dfV19KSxudWxsKTtjbGFzcyB5TXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9sb2NhbGl6YXRpb249dCx0aGlzLl9jYXNlVmlld3M9e319c2V0IG5nUGx1cmFsKHQpe3RoaXMuX3N3aXRjaFZhbHVlPXQsdGhpcy5fdXBkYXRlVmlldygpfWFkZENhc2UodCxlKXt0aGlzLl9jYXNlVmlld3NbdF09ZX1fdXBkYXRlVmlldygpe3RoaXMuX2NsZWFyVmlld3MoKTtjb25zdCB0PU9iamVjdC5rZXlzKHRoaXMuX2Nhc2VWaWV3cyksZT1uTSh0aGlzLl9zd2l0Y2hWYWx1ZSx0LHRoaXMuX2xvY2FsaXphdGlvbik7dGhpcy5fYWN0aXZhdGVWaWV3KHRoaXMuX2Nhc2VWaWV3c1tlXSl9X2NsZWFyVmlld3MoKXt0aGlzLl9hY3RpdmVWaWV3JiZ0aGlzLl9hY3RpdmVWaWV3LmRlc3Ryb3koKX1fYWN0aXZhdGVWaWV3KHQpe3QmJih0aGlzLl9hY3RpdmVWaWV3PXQsdGhpcy5fYWN0aXZlVmlldy5jcmVhdGUoKSl9fXlNLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx5TSkoU20oZU0pKX0seU0uybVkaXI9bG8oe3R5cGU6eU0sc2VsZWN0b3JzOltbIiIsIm5nUGx1cmFsIiwiIl1dLGlucHV0czp7bmdQbHVyYWw6Im5nUGx1cmFsIn19KSx5TS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmVNfV0seU0ucHJvcERlY29yYXRvcnM9e25nUGx1cmFsOlt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHlNLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IltuZ1BsdXJhbF0ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6ZU19XX0pLHtuZ1BsdXJhbDpbe3R5cGU6eHl9XX0pO2NsYXNzIF9Ne2NvbnN0cnVjdG9yKHQsZSxuLG8pe3RoaXMudmFsdWU9dDtjb25zdCBpPSFpc05hTihOdW1iZXIodCkpO28uYWRkQ2FzZShpP2A9JHt0fWA6dCxuZXcgdU0obixlKSl9fV9NLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxfTSkoTmEoIm5nUGx1cmFsQ2FzZSIpLFNtKFhnKSxTbShlaCksU20oeU0sMSkpfSxfTS7JtWRpcj1sbyh7dHlwZTpfTSxzZWxlY3RvcnM6W1siIiwibmdQbHVyYWxDYXNlIiwiIl1dfSksX00uY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6amEsYXJnczpbIm5nUGx1cmFsQ2FzZSJdfV19LHt0eXBlOlhnfSx7dHlwZTplaH0se3R5cGU6eU0sZGVjb3JhdG9yczpbe3R5cGU6UnJ9XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoX00sW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW25nUGx1cmFsQ2FzZV0ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmphLGFyZ3M6WyJuZ1BsdXJhbENhc2UiXX1dfSx7dHlwZTpYZ30se3R5cGU6ZWh9LHt0eXBlOnlNLGRlY29yYXRvcnM6W3t0eXBlOlJyfV19XX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgQ017Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuX25nRWw9dCx0aGlzLl9kaWZmZXJzPWUsdGhpcy5fcmVuZGVyZXI9bix0aGlzLl9uZ1N0eWxlPW51bGwsdGhpcy5fZGlmZmVyPW51bGx9c2V0IG5nU3R5bGUodCl7dGhpcy5fbmdTdHlsZT10LCF0aGlzLl9kaWZmZXImJnQmJih0aGlzLl9kaWZmZXI9dGhpcy5fZGlmZmVycy5maW5kKHQpLmNyZWF0ZSgpKX1uZ0RvQ2hlY2soKXtpZih0aGlzLl9kaWZmZXIpe2NvbnN0IHQ9dGhpcy5fZGlmZmVyLmRpZmYodGhpcy5fbmdTdHlsZSk7dCYmdGhpcy5fYXBwbHlDaGFuZ2VzKHQpfX1fc2V0U3R5bGUodCxlKXtjb25zdFtuLG9dPXQuc3BsaXQoIi4iKTtudWxsIT0oZT1udWxsIT1lJiZvP2Ake2V9JHtvfWA6ZSk/dGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUodGhpcy5fbmdFbC5uYXRpdmVFbGVtZW50LG4sZSk6dGhpcy5fcmVuZGVyZXIucmVtb3ZlU3R5bGUodGhpcy5fbmdFbC5uYXRpdmVFbGVtZW50LG4pfV9hcHBseUNoYW5nZXModCl7dC5mb3JFYWNoUmVtb3ZlZEl0ZW0oKHQ9PnRoaXMuX3NldFN0eWxlKHQua2V5LG51bGwpKSksdC5mb3JFYWNoQWRkZWRJdGVtKCh0PT50aGlzLl9zZXRTdHlsZSh0LmtleSx0LmN1cnJlbnRWYWx1ZSkpKSx0LmZvckVhY2hDaGFuZ2VkSXRlbSgodD0+dGhpcy5fc2V0U3R5bGUodC5rZXksdC5jdXJyZW50VmFsdWUpKSl9fUNNLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxDTSkoU20oaGcpLFNtKExnKSxTbShDZykpfSxDTS7JtWRpcj1sbyh7dHlwZTpDTSxzZWxlY3RvcnM6W1siIiwibmdTdHlsZSIsIiJdXSxpbnB1dHM6e25nU3R5bGU6Im5nU3R5bGUifX0pLENNLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOkxnfSx7dHlwZTpDZ31dLENNLnByb3BEZWNvcmF0b3JzPXtuZ1N0eWxlOlt7dHlwZTp4eSxhcmdzOlsibmdTdHlsZSJdfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQ00sW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW25nU3R5bGVdIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTpMZ30se3R5cGU6Q2d9XX0pLHtuZ1N0eWxlOlt7dHlwZTp4eSxhcmdzOlsibmdTdHlsZSJdfV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIE1Ne2NvbnN0cnVjdG9yKHQpe3RoaXMuX3ZpZXdDb250YWluZXJSZWY9dCx0aGlzLl92aWV3UmVmPW51bGwsdGhpcy5uZ1RlbXBsYXRlT3V0bGV0Q29udGV4dD1udWxsLHRoaXMubmdUZW1wbGF0ZU91dGxldD1udWxsfW5nT25DaGFuZ2VzKHQpe2lmKHQubmdUZW1wbGF0ZU91dGxldCl7Y29uc3QgdD10aGlzLl92aWV3Q29udGFpbmVyUmVmO3RoaXMuX3ZpZXdSZWYmJnQucmVtb3ZlKHQuaW5kZXhPZih0aGlzLl92aWV3UmVmKSksdGhpcy5fdmlld1JlZj10aGlzLm5nVGVtcGxhdGVPdXRsZXQ/dC5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5uZ1RlbXBsYXRlT3V0bGV0LHRoaXMubmdUZW1wbGF0ZU91dGxldENvbnRleHQpOm51bGx9ZWxzZSB0aGlzLl92aWV3UmVmJiZ0Lm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0JiZ0aGlzLm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0JiYodGhpcy5fdmlld1JlZi5jb250ZXh0PXRoaXMubmdUZW1wbGF0ZU91dGxldENvbnRleHQpfX1NTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8TU0pKFNtKGVoKSl9LE1NLsm1ZGlyPWxvKHt0eXBlOk1NLHNlbGVjdG9yczpbWyIiLCJuZ1RlbXBsYXRlT3V0bGV0IiwiIl1dLGlucHV0czp7bmdUZW1wbGF0ZU91dGxldENvbnRleHQ6Im5nVGVtcGxhdGVPdXRsZXRDb250ZXh0IixuZ1RlbXBsYXRlT3V0bGV0OiJuZ1RlbXBsYXRlT3V0bGV0In0sZmVhdHVyZXM6W0JvXX0pLE1NLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6ZWh9XSxNTS5wcm9wRGVjb3JhdG9ycz17bmdUZW1wbGF0ZU91dGxldENvbnRleHQ6W3t0eXBlOnh5fV0sbmdUZW1wbGF0ZU91dGxldDpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChNTSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbmdUZW1wbGF0ZU91dGxldF0ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6ZWh9XX0pLHtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dDpbe3R5cGU6eHl9XSxuZ1RlbXBsYXRlT3V0bGV0Olt7dHlwZTp4eX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCB2TT1bYU0sck0sbE0sZE0sTU0sQ00sZk0sZ00saE0seU0sX01dOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiB4TSh0LGUpe3JldHVybiBFcnJvcihgSW52YWxpZFBpcGVBcmd1bWVudDogJyR7ZX0nIGZvciBwaXBlICcke0dlKHQpfSdgKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3QgT009bmV3IGNsYXNze2NyZWF0ZVN1YnNjcmlwdGlvbih0LGUpe3JldHVybiB0LnRoZW4oZSwodD0+e3Rocm93IHR9KSl9ZGlzcG9zZSh0KXt9b25EZXN0cm95KHQpe319LFBNPW5ldyBjbGFzc3tjcmVhdGVTdWJzY3JpcHRpb24odCxlKXtyZXR1cm4gdC5zdWJzY3JpYmUoe25leHQ6ZSxlcnJvcjp0PT57dGhyb3cgdH19KX1kaXNwb3NlKHQpe3QudW5zdWJzY3JpYmUoKX1vbkRlc3Ryb3kodCl7dC51bnN1YnNjcmliZSgpfX07Y2xhc3Mgd017Y29uc3RydWN0b3IodCl7dGhpcy5fcmVmPXQsdGhpcy5fbGF0ZXN0VmFsdWU9bnVsbCx0aGlzLl9zdWJzY3JpcHRpb249bnVsbCx0aGlzLl9vYmo9bnVsbCx0aGlzLl9zdHJhdGVneT1udWxsfW5nT25EZXN0cm95KCl7dGhpcy5fc3Vic2NyaXB0aW9uJiZ0aGlzLl9kaXNwb3NlKCl9dHJhbnNmb3JtKHQpe3JldHVybiB0aGlzLl9vYmo/dCE9PXRoaXMuX29iaj8odGhpcy5fZGlzcG9zZSgpLHRoaXMudHJhbnNmb3JtKHQpKTp0aGlzLl9sYXRlc3RWYWx1ZToodCYmdGhpcy5fc3Vic2NyaWJlKHQpLHRoaXMuX2xhdGVzdFZhbHVlKX1fc3Vic2NyaWJlKHQpe3RoaXMuX29iaj10LHRoaXMuX3N0cmF0ZWd5PXRoaXMuX3NlbGVjdFN0cmF0ZWd5KHQpLHRoaXMuX3N1YnNjcmlwdGlvbj10aGlzLl9zdHJhdGVneS5jcmVhdGVTdWJzY3JpcHRpb24odCwoZT0+dGhpcy5fdXBkYXRlTGF0ZXN0VmFsdWUodCxlKSkpfV9zZWxlY3RTdHJhdGVneSh0KXtpZihGbSh0KSlyZXR1cm4gT007aWYoTG0odCkpcmV0dXJuIFBNO3Rocm93IHhNKHdNLHQpfV9kaXNwb3NlKCl7dGhpcy5fc3RyYXRlZ3kuZGlzcG9zZSh0aGlzLl9zdWJzY3JpcHRpb24pLHRoaXMuX2xhdGVzdFZhbHVlPW51bGwsdGhpcy5fc3Vic2NyaXB0aW9uPW51bGwsdGhpcy5fb2JqPW51bGx9X3VwZGF0ZUxhdGVzdFZhbHVlKHQsZSl7dD09PXRoaXMuX29iaiYmKHRoaXMuX2xhdGVzdFZhbHVlPWUsdGhpcy5fcmVmLm1hcmtGb3JDaGVjaygpKX19d00uybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHdNKShTbShVZywxNikpfSx3TS7JtXBpcGU9Y28oe25hbWU6ImFzeW5jIix0eXBlOndNLHB1cmU6ITF9KSx3TS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlVnfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh3TSxbe3R5cGU6dnksYXJnczpbe25hbWU6ImFzeW5jIixwdXJlOiExfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6VWd9XX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3Mga017dHJhbnNmb3JtKHQpe2lmKG51bGw9PXQpcmV0dXJuIG51bGw7aWYoInN0cmluZyIhPXR5cGVvZiB0KXRocm93IHhNKGtNLHQpO3JldHVybiB0LnRvTG93ZXJDYXNlKCl9fWtNLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxrTSl9LGtNLsm1cGlwZT1jbyh7bmFtZToibG93ZXJjYXNlIix0eXBlOmtNLHB1cmU6ITB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGtNLFt7dHlwZTp2eSxhcmdzOlt7bmFtZToibG93ZXJjYXNlIn1dfV0sbnVsbCxudWxsKTtjb25zdCBTTT0vKD86W0EtWmEtelx4QUFceEI1XHhCQVx4QzAtXHhENlx4RDgtXHhGNlx4RjgtXHUwMkMxXHUwMkM2LVx1MDJEMVx1MDJFMC1cdTAyRTRcdTAyRUNcdTAyRUVcdTAzNzAtXHUwMzc0XHUwMzc2XHUwMzc3XHUwMzdBLVx1MDM3RFx1MDM3Rlx1MDM4Nlx1MDM4OC1cdTAzOEFcdTAzOENcdTAzOEUtXHUwM0ExXHUwM0EzLVx1MDNGNVx1MDNGNy1cdTA0ODFcdTA0OEEtXHUwNTJGXHUwNTMxLVx1MDU1Nlx1MDU1OVx1MDU2MS1cdTA1ODdcdTA1RDAtXHUwNUVBXHUwNUYwLVx1MDVGMlx1MDYyMC1cdTA2NEFcdTA2NkVcdTA2NkZcdTA2NzEtXHUwNkQzXHUwNkQ1XHUwNkU1XHUwNkU2XHUwNkVFXHUwNkVGXHUwNkZBLVx1MDZGQ1x1MDZGRlx1MDcxMFx1MDcxMi1cdTA3MkZcdTA3NEQtXHUwN0E1XHUwN0IxXHUwN0NBLVx1MDdFQVx1MDdGNFx1MDdGNVx1MDdGQVx1MDgwMC1cdTA4MTVcdTA4MUFcdTA4MjRcdTA4MjhcdTA4NDAtXHUwODU4XHUwODYwLVx1MDg2QVx1MDhBMC1cdTA4QjRcdTA4QjYtXHUwOEJEXHUwOTA0LVx1MDkzOVx1MDkzRFx1MDk1MFx1MDk1OC1cdTA5NjFcdTA5NzEtXHUwOTgwXHUwOTg1LVx1MDk4Q1x1MDk4Rlx1MDk5MFx1MDk5My1cdTA5QThcdTA5QUEtXHUwOUIwXHUwOUIyXHUwOUI2LVx1MDlCOVx1MDlCRFx1MDlDRVx1MDlEQ1x1MDlERFx1MDlERi1cdTA5RTFcdTA5RjBcdTA5RjFcdTA5RkNcdTBBMDUtXHUwQTBBXHUwQTBGXHUwQTEwXHUwQTEzLVx1MEEyOFx1MEEyQS1cdTBBMzBcdTBBMzJcdTBBMzNcdTBBMzVcdTBBMzZcdTBBMzhcdTBBMzlcdTBBNTktXHUwQTVDXHUwQTVFXHUwQTcyLVx1MEE3NFx1MEE4NS1cdTBBOERcdTBBOEYtXHUwQTkxXHUwQTkzLVx1MEFBOFx1MEFBQS1cdTBBQjBcdTBBQjJcdTBBQjNcdTBBQjUtXHUwQUI5XHUwQUJEXHUwQUQwXHUwQUUwXHUwQUUxXHUwQUY5XHUwQjA1LVx1MEIwQ1x1MEIwRlx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyXHUwQjMzXHUwQjM1LVx1MEIzOVx1MEIzRFx1MEI1Q1x1MEI1RFx1MEI1Ri1cdTBCNjFcdTBCNzFcdTBCODNcdTBCODUtXHUwQjhBXHUwQjhFLVx1MEI5MFx1MEI5Mi1cdTBCOTVcdTBCOTlcdTBCOUFcdTBCOUNcdTBCOUVcdTBCOUZcdTBCQTNcdTBCQTRcdTBCQTgtXHUwQkFBXHUwQkFFLVx1MEJCOVx1MEJEMFx1MEMwNS1cdTBDMENcdTBDMEUtXHUwQzEwXHUwQzEyLVx1MEMyOFx1MEMyQS1cdTBDMzlcdTBDM0RcdTBDNTgtXHUwQzVBXHUwQzYwXHUwQzYxXHUwQzgwXHUwQzg1LVx1MEM4Q1x1MEM4RS1cdTBDOTBcdTBDOTItXHUwQ0E4XHUwQ0FBLVx1MENCM1x1MENCNS1cdTBDQjlcdTBDQkRcdTBDREVcdTBDRTBcdTBDRTFcdTBDRjFcdTBDRjJcdTBEMDUtXHUwRDBDXHUwRDBFLVx1MEQxMFx1MEQxMi1cdTBEM0FcdTBEM0RcdTBENEVcdTBENTQtXHUwRDU2XHUwRDVGLVx1MEQ2MVx1MEQ3QS1cdTBEN0ZcdTBEODUtXHUwRDk2XHUwRDlBLVx1MERCMVx1MERCMy1cdTBEQkJcdTBEQkRcdTBEQzAtXHUwREM2XHUwRTAxLVx1MEUzMFx1MEUzMlx1MEUzM1x1MEU0MC1cdTBFNDZcdTBFODFcdTBFODJcdTBFODRcdTBFODdcdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUFcdTBFQUJcdTBFQUQtXHUwRUIwXHUwRUIyXHUwRUIzXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEVDNlx1MEVEQy1cdTBFREZcdTBGMDBcdTBGNDAtXHUwRjQ3XHUwRjQ5LVx1MEY2Q1x1MEY4OC1cdTBGOENcdTEwMDAtXHUxMDJBXHUxMDNGXHUxMDUwLVx1MTA1NVx1MTA1QS1cdTEwNURcdTEwNjFcdTEwNjVcdTEwNjZcdTEwNkUtXHUxMDcwXHUxMDc1LVx1MTA4MVx1MTA4RVx1MTBBMC1cdTEwQzVcdTEwQzdcdTEwQ0RcdTEwRDAtXHUxMEZBXHUxMEZDLVx1MTI0OFx1MTI0QS1cdTEyNERcdTEyNTAtXHUxMjU2XHUxMjU4XHUxMjVBLVx1MTI1RFx1MTI2MC1cdTEyODhcdTEyOEEtXHUxMjhEXHUxMjkwLVx1MTJCMFx1MTJCMi1cdTEyQjVcdTEyQjgtXHUxMkJFXHUxMkMwXHUxMkMyLVx1MTJDNVx1MTJDOC1cdTEyRDZcdTEyRDgtXHUxMzEwXHUxMzEyLVx1MTMxNVx1MTMxOC1cdTEzNUFcdTEzODAtXHUxMzhGXHUxM0EwLVx1MTNGNVx1MTNGOC1cdTEzRkRcdTE0MDEtXHUxNjZDXHUxNjZGLVx1MTY3Rlx1MTY4MS1cdTE2OUFcdTE2QTAtXHUxNkVBXHUxNkYxLVx1MTZGOFx1MTcwMC1cdTE3MENcdTE3MEUtXHUxNzExXHUxNzIwLVx1MTczMVx1MTc0MC1cdTE3NTFcdTE3NjAtXHUxNzZDXHUxNzZFLVx1MTc3MFx1MTc4MC1cdTE3QjNcdTE3RDdcdTE3RENcdTE4MjAtXHUxODc3XHUxODgwLVx1MTg4NFx1MTg4Ny1cdTE4QThcdTE4QUFcdTE4QjAtXHUxOEY1XHUxOTAwLVx1MTkxRVx1MTk1MC1cdTE5NkRcdTE5NzAtXHUxOTc0XHUxOTgwLVx1MTlBQlx1MTlCMC1cdTE5QzlcdTFBMDAtXHUxQTE2XHUxQTIwLVx1MUE1NFx1MUFBN1x1MUIwNS1cdTFCMzNcdTFCNDUtXHUxQjRCXHUxQjgzLVx1MUJBMFx1MUJBRVx1MUJBRlx1MUJCQS1cdTFCRTVcdTFDMDAtXHUxQzIzXHUxQzRELVx1MUM0Rlx1MUM1QS1cdTFDN0RcdTFDODAtXHUxQzg4XHUxQ0U5LVx1MUNFQ1x1MUNFRS1cdTFDRjFcdTFDRjVcdTFDRjZcdTFEMDAtXHUxREJGXHUxRTAwLVx1MUYxNVx1MUYxOC1cdTFGMURcdTFGMjAtXHUxRjQ1XHUxRjQ4LVx1MUY0RFx1MUY1MC1cdTFGNTdcdTFGNTlcdTFGNUJcdTFGNURcdTFGNUYtXHUxRjdEXHUxRjgwLVx1MUZCNFx1MUZCNi1cdTFGQkNcdTFGQkVcdTFGQzItXHUxRkM0XHUxRkM2LVx1MUZDQ1x1MUZEMC1cdTFGRDNcdTFGRDYtXHUxRkRCXHUxRkUwLVx1MUZFQ1x1MUZGMi1cdTFGRjRcdTFGRjYtXHUxRkZDXHUyMDcxXHUyMDdGXHUyMDkwLVx1MjA5Q1x1MjEwMlx1MjEwN1x1MjEwQS1cdTIxMTNcdTIxMTVcdTIxMTktXHUyMTFEXHUyMTI0XHUyMTI2XHUyMTI4XHUyMTJBLVx1MjEyRFx1MjEyRi1cdTIxMzlcdTIxM0MtXHUyMTNGXHUyMTQ1LVx1MjE0OVx1MjE0RVx1MjE4M1x1MjE4NFx1MkMwMC1cdTJDMkVcdTJDMzAtXHUyQzVFXHUyQzYwLVx1MkNFNFx1MkNFQi1cdTJDRUVcdTJDRjJcdTJDRjNcdTJEMDAtXHUyRDI1XHUyRDI3XHUyRDJEXHUyRDMwLVx1MkQ2N1x1MkQ2Rlx1MkQ4MC1cdTJEOTZcdTJEQTAtXHUyREE2XHUyREE4LVx1MkRBRVx1MkRCMC1cdTJEQjZcdTJEQjgtXHUyREJFXHUyREMwLVx1MkRDNlx1MkRDOC1cdTJEQ0VcdTJERDAtXHUyREQ2XHUyREQ4LVx1MkRERVx1MkUyRlx1MzAwNVx1MzAwNlx1MzAzMS1cdTMwMzVcdTMwM0JcdTMwM0NcdTMwNDEtXHUzMDk2XHUzMDlELVx1MzA5Rlx1MzBBMS1cdTMwRkFcdTMwRkMtXHUzMEZGXHUzMTA1LVx1MzEyRVx1MzEzMS1cdTMxOEVcdTMxQTAtXHUzMUJBXHUzMUYwLVx1MzFGRlx1MzQwMC1cdTREQjVcdTRFMDAtXHU5RkVBXHVBMDAwLVx1QTQ4Q1x1QTREMC1cdUE0RkRcdUE1MDAtXHVBNjBDXHVBNjEwLVx1QTYxRlx1QTYyQVx1QTYyQlx1QTY0MC1cdUE2NkVcdUE2N0YtXHVBNjlEXHVBNkEwLVx1QTZFNVx1QTcxNy1cdUE3MUZcdUE3MjItXHVBNzg4XHVBNzhCLVx1QTdBRVx1QTdCMC1cdUE3QjdcdUE3RjctXHVBODAxXHVBODAzLVx1QTgwNVx1QTgwNy1cdUE4MEFcdUE4MEMtXHVBODIyXHVBODQwLVx1QTg3M1x1QTg4Mi1cdUE4QjNcdUE4RjItXHVBOEY3XHVBOEZCXHVBOEZEXHVBOTBBLVx1QTkyNVx1QTkzMC1cdUE5NDZcdUE5NjAtXHVBOTdDXHVBOTg0LVx1QTlCMlx1QTlDRlx1QTlFMC1cdUE5RTRcdUE5RTYtXHVBOUVGXHVBOUZBLVx1QTlGRVx1QUEwMC1cdUFBMjhcdUFBNDAtXHVBQTQyXHVBQTQ0LVx1QUE0Qlx1QUE2MC1cdUFBNzZcdUFBN0FcdUFBN0UtXHVBQUFGXHVBQUIxXHVBQUI1XHVBQUI2XHVBQUI5LVx1QUFCRFx1QUFDMFx1QUFDMlx1QUFEQi1cdUFBRERcdUFBRTAtXHVBQUVBXHVBQUYyLVx1QUFGNFx1QUIwMS1cdUFCMDZcdUFCMDktXHVBQjBFXHVBQjExLVx1QUIxNlx1QUIyMC1cdUFCMjZcdUFCMjgtXHVBQjJFXHVBQjMwLVx1QUI1QVx1QUI1Qy1cdUFCNjVcdUFCNzAtXHVBQkUyXHVBQzAwLVx1RDdBM1x1RDdCMC1cdUQ3QzZcdUQ3Q0ItXHVEN0ZCXHVGOTAwLVx1RkE2RFx1RkE3MC1cdUZBRDlcdUZCMDAtXHVGQjA2XHVGQjEzLVx1RkIxN1x1RkIxRFx1RkIxRi1cdUZCMjhcdUZCMkEtXHVGQjM2XHVGQjM4LVx1RkIzQ1x1RkIzRVx1RkI0MFx1RkI0MVx1RkI0M1x1RkI0NFx1RkI0Ni1cdUZCQjFcdUZCRDMtXHVGRDNEXHVGRDUwLVx1RkQ4Rlx1RkQ5Mi1cdUZEQzdcdUZERjAtXHVGREZCXHVGRTcwLVx1RkU3NFx1RkU3Ni1cdUZFRkNcdUZGMjEtXHVGRjNBXHVGRjQxLVx1RkY1QVx1RkY2Ni1cdUZGQkVcdUZGQzItXHVGRkM3XHVGRkNBLVx1RkZDRlx1RkZEMi1cdUZGRDdcdUZGREEtXHVGRkRDXXxcdUQ4MDBbXHVEQzAwLVx1REMwQlx1REMwRC1cdURDMjZcdURDMjgtXHVEQzNBXHVEQzNDXHVEQzNEXHVEQzNGLVx1REM0RFx1REM1MC1cdURDNURcdURDODAtXHVEQ0ZBXHVERTgwLVx1REU5Q1x1REVBMC1cdURFRDBcdURGMDAtXHVERjFGXHVERjJELVx1REY0MFx1REY0Mi1cdURGNDlcdURGNTAtXHVERjc1XHVERjgwLVx1REY5RFx1REZBMC1cdURGQzNcdURGQzgtXHVERkNGXXxcdUQ4MDFbXHVEQzAwLVx1REM5RFx1RENCMC1cdURDRDNcdURDRDgtXHVEQ0ZCXHVERDAwLVx1REQyN1x1REQzMC1cdURENjNcdURFMDAtXHVERjM2XHVERjQwLVx1REY1NVx1REY2MC1cdURGNjddfFx1RDgwMltcdURDMDAtXHVEQzA1XHVEQzA4XHVEQzBBLVx1REMzNVx1REMzN1x1REMzOFx1REMzQ1x1REMzRi1cdURDNTVcdURDNjAtXHVEQzc2XHVEQzgwLVx1REM5RVx1RENFMC1cdURDRjJcdURDRjRcdURDRjVcdUREMDAtXHVERDE1XHVERDIwLVx1REQzOVx1REQ4MC1cdUREQjdcdUREQkVcdUREQkZcdURFMDBcdURFMTAtXHVERTEzXHVERTE1LVx1REUxN1x1REUxOS1cdURFMzNcdURFNjAtXHVERTdDXHVERTgwLVx1REU5Q1x1REVDMC1cdURFQzdcdURFQzktXHVERUU0XHVERjAwLVx1REYzNVx1REY0MC1cdURGNTVcdURGNjAtXHVERjcyXHVERjgwLVx1REY5MV18XHVEODAzW1x1REMwMC1cdURDNDhcdURDODAtXHVEQ0IyXHVEQ0MwLVx1RENGMl18XHVEODA0W1x1REMwMy1cdURDMzdcdURDODMtXHVEQ0FGXHVEQ0QwLVx1RENFOFx1REQwMy1cdUREMjZcdURENTAtXHVERDcyXHVERDc2XHVERDgzLVx1RERCMlx1RERDMS1cdUREQzRcdUREREFcdURERENcdURFMDAtXHVERTExXHVERTEzLVx1REUyQlx1REU4MC1cdURFODZcdURFODhcdURFOEEtXHVERThEXHVERThGLVx1REU5RFx1REU5Ri1cdURFQThcdURFQjAtXHVERURFXHVERjA1LVx1REYwQ1x1REYwRlx1REYxMFx1REYxMy1cdURGMjhcdURGMkEtXHVERjMwXHVERjMyXHVERjMzXHVERjM1LVx1REYzOVx1REYzRFx1REY1MFx1REY1RC1cdURGNjFdfFx1RDgwNVtcdURDMDAtXHVEQzM0XHVEQzQ3LVx1REM0QVx1REM4MC1cdURDQUZcdURDQzRcdURDQzVcdURDQzdcdUREODAtXHVEREFFXHVEREQ4LVx1REREQlx1REUwMC1cdURFMkZcdURFNDRcdURFODAtXHVERUFBXHVERjAwLVx1REYxOV18XHVEODA2W1x1RENBMC1cdURDREZcdURDRkZcdURFMDBcdURFMEItXHVERTMyXHVERTNBXHVERTUwXHVERTVDLVx1REU4M1x1REU4Ni1cdURFODlcdURFQzAtXHVERUY4XXxcdUQ4MDdbXHVEQzAwLVx1REMwOFx1REMwQS1cdURDMkVcdURDNDBcdURDNzItXHVEQzhGXHVERDAwLVx1REQwNlx1REQwOFx1REQwOVx1REQwQi1cdUREMzBcdURENDZdfFx1RDgwOFtcdURDMDAtXHVERjk5XXxcdUQ4MDlbXHVEQzgwLVx1REQ0M118W1x1RDgwQ1x1RDgxQy1cdUQ4MjBcdUQ4NDAtXHVEODY4XHVEODZBLVx1RDg2Q1x1RDg2Ri1cdUQ4NzJcdUQ4NzQtXHVEODc5XVtcdURDMDAtXHVERkZGXXxcdUQ4MERbXHVEQzAwLVx1REMyRV18XHVEODExW1x1REMwMC1cdURFNDZdfFx1RDgxQVtcdURDMDAtXHVERTM4XHVERTQwLVx1REU1RVx1REVEMC1cdURFRURcdURGMDAtXHVERjJGXHVERjQwLVx1REY0M1x1REY2My1cdURGNzdcdURGN0QtXHVERjhGXXxcdUQ4MUJbXHVERjAwLVx1REY0NFx1REY1MFx1REY5My1cdURGOUZcdURGRTBcdURGRTFdfFx1RDgyMVtcdURDMDAtXHVERkVDXXxcdUQ4MjJbXHVEQzAwLVx1REVGMl18XHVEODJDW1x1REMwMC1cdUREMUVcdURENzAtXHVERUZCXXxcdUQ4MkZbXHVEQzAwLVx1REM2QVx1REM3MC1cdURDN0NcdURDODAtXHVEQzg4XHVEQzkwLVx1REM5OV18XHVEODM1W1x1REMwMC1cdURDNTRcdURDNTYtXHVEQzlDXHVEQzlFXHVEQzlGXHVEQ0EyXHVEQ0E1XHVEQ0E2XHVEQ0E5LVx1RENBQ1x1RENBRS1cdURDQjlcdURDQkJcdURDQkQtXHVEQ0MzXHVEQ0M1LVx1REQwNVx1REQwNy1cdUREMEFcdUREMEQtXHVERDE0XHVERDE2LVx1REQxQ1x1REQxRS1cdUREMzlcdUREM0ItXHVERDNFXHVERDQwLVx1REQ0NFx1REQ0Nlx1REQ0QS1cdURENTBcdURENTItXHVERUE1XHVERUE4LVx1REVDMFx1REVDMi1cdURFREFcdURFREMtXHVERUZBXHVERUZDLVx1REYxNFx1REYxNi1cdURGMzRcdURGMzYtXHVERjRFXHVERjUwLVx1REY2RVx1REY3MC1cdURGODhcdURGOEEtXHVERkE4XHVERkFBLVx1REZDMlx1REZDNC1cdURGQ0JdfFx1RDgzQVtcdURDMDAtXHVEQ0M0XHVERDAwLVx1REQ0M118XHVEODNCW1x1REUwMC1cdURFMDNcdURFMDUtXHVERTFGXHVERTIxXHVERTIyXHVERTI0XHVERTI3XHVERTI5LVx1REUzMlx1REUzNC1cdURFMzdcdURFMzlcdURFM0JcdURFNDJcdURFNDdcdURFNDlcdURFNEJcdURFNEQtXHVERTRGXHVERTUxXHVERTUyXHVERTU0XHVERTU3XHVERTU5XHVERTVCXHVERTVEXHVERTVGXHVERTYxXHVERTYyXHVERTY0XHVERTY3LVx1REU2QVx1REU2Qy1cdURFNzJcdURFNzQtXHVERTc3XHVERTc5LVx1REU3Q1x1REU3RVx1REU4MC1cdURFODlcdURFOEItXHVERTlCXHVERUExLVx1REVBM1x1REVBNS1cdURFQTlcdURFQUItXHVERUJCXXxcdUQ4NjlbXHVEQzAwLVx1REVENlx1REYwMC1cdURGRkZdfFx1RDg2RFtcdURDMDAtXHVERjM0XHVERjQwLVx1REZGRl18XHVEODZFW1x1REMwMC1cdURDMURcdURDMjAtXHVERkZGXXxcdUQ4NzNbXHVEQzAwLVx1REVBMVx1REVCMC1cdURGRkZdfFx1RDg3QVtcdURDMDAtXHVERkUwXXxcdUQ4N0VbXHVEQzAwLVx1REUxRF0pXFMqL2c7Y2xhc3MgRE17dHJhbnNmb3JtKHQpe2lmKG51bGw9PXQpcmV0dXJuIG51bGw7aWYoInN0cmluZyIhPXR5cGVvZiB0KXRocm93IHhNKERNLHQpO3JldHVybiB0LnJlcGxhY2UoU00sKHQ9PnRbMF0udG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKS50b0xvd2VyQ2FzZSgpKSl9fURNLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxETSl9LERNLsm1cGlwZT1jbyh7bmFtZToidGl0bGVjYXNlIix0eXBlOkRNLHB1cmU6ITB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKERNLFt7dHlwZTp2eSxhcmdzOlt7bmFtZToidGl0bGVjYXNlIn1dfV0sbnVsbCxudWxsKTtjbGFzcyBFTXt0cmFuc2Zvcm0odCl7aWYobnVsbD09dClyZXR1cm4gbnVsbDtpZigic3RyaW5nIiE9dHlwZW9mIHQpdGhyb3cgeE0oRU0sdCk7cmV0dXJuIHQudG9VcHBlckNhc2UoKX19RU0uybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEVNKX0sRU0uybVwaXBlPWNvKHtuYW1lOiJ1cHBlcmNhc2UiLHR5cGU6RU0scHVyZTohMH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRU0sW3t0eXBlOnZ5LGFyZ3M6W3tuYW1lOiJ1cHBlcmNhc2UifV19XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgUk17Y29uc3RydWN0b3IodCl7dGhpcy5sb2NhbGU9dH10cmFuc2Zvcm0odCxlPSJtZWRpdW1EYXRlIixuLG8pe2lmKG51bGw9PXR8fCIiPT09dHx8dCE9dClyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIE5DKHQsZSxvfHx0aGlzLmxvY2FsZSxuKX1jYXRjaCh0KXt0aHJvdyB4TShSTSx0Lm1lc3NhZ2UpfX19Uk0uybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFJNKShTbShXeSwxNikpfSxSTS7JtXBpcGU9Y28oe25hbWU6ImRhdGUiLHR5cGU6Uk0scHVyZTohMH0pLFJNLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1d5XX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChSTSxbe3R5cGU6dnksYXJnczpbe25hbWU6ImRhdGUiLHB1cmU6ITB9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbV3ldfV19XX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgQU09LyMvZztjbGFzcyBUTXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9sb2NhbGl6YXRpb249dH10cmFuc2Zvcm0odCxlLG4pe2lmKG51bGw9PXQpcmV0dXJuIiI7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSl0aHJvdyB4TShUTSxlKTtyZXR1cm4gZVtuTSh0LE9iamVjdC5rZXlzKGUpLHRoaXMuX2xvY2FsaXphdGlvbixuKV0ucmVwbGFjZShBTSx0LnRvU3RyaW5nKCkpfX1UTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VE0pKFNtKGVNLDE2KSl9LFRNLsm1cGlwZT1jbyh7bmFtZToiaTE4blBsdXJhbCIsdHlwZTpUTSxwdXJlOiEwfSksVE0uY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTplTX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoVE0sW3t0eXBlOnZ5LGFyZ3M6W3tuYW1lOiJpMThuUGx1cmFsIixwdXJlOiEwfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6ZU19XX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgTk17dHJhbnNmb3JtKHQsZSl7aWYobnVsbD09dClyZXR1cm4iIjtpZigib2JqZWN0IiE9dHlwZW9mIGV8fCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyB4TShOTSxlKTtyZXR1cm4gZS5oYXNPd25Qcm9wZXJ0eSh0KT9lW3RdOmUuaGFzT3duUHJvcGVydHkoIm90aGVyIik/ZS5vdGhlcjoiIn19Tk0uybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fE5NKX0sTk0uybVwaXBlPWNvKHtuYW1lOiJpMThuU2VsZWN0Iix0eXBlOk5NLHB1cmU6ITB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKE5NLFt7dHlwZTp2eSxhcmdzOlt7bmFtZToiaTE4blNlbGVjdCIscHVyZTohMH1dfV0sbnVsbCxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIHpNe3RyYW5zZm9ybSh0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodCxudWxsLDIpfX16TS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8ek0pfSx6TS7JtXBpcGU9Y28oe25hbWU6Impzb24iLHR5cGU6ek0scHVyZTohMX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoek0sW3t0eXBlOnZ5LGFyZ3M6W3tuYW1lOiJqc29uIixwdXJlOiExfV19XSxudWxsLG51bGwpO2NsYXNzIElNe2NvbnN0cnVjdG9yKHQpe3RoaXMuZGlmZmVycz10LHRoaXMua2V5VmFsdWVzPVtdLHRoaXMuY29tcGFyZUZuPUhNfXRyYW5zZm9ybSh0LGU9SE0pe2lmKCF0fHwhKHQgaW5zdGFuY2VvZiBNYXApJiYib2JqZWN0IiE9dHlwZW9mIHQpcmV0dXJuIG51bGw7dGhpcy5kaWZmZXJ8fCh0aGlzLmRpZmZlcj10aGlzLmRpZmZlcnMuZmluZCh0KS5jcmVhdGUoKSk7Y29uc3Qgbj10aGlzLmRpZmZlci5kaWZmKHQpLG89ZSE9PXRoaXMuY29tcGFyZUZuO3JldHVybiBuJiYodGhpcy5rZXlWYWx1ZXM9W10sbi5mb3JFYWNoSXRlbSgodD0+e3RoaXMua2V5VmFsdWVzLnB1c2goKAovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KZnVuY3Rpb24gZSh0LG4pe3JldHVybntrZXk6dCx2YWx1ZTpufX0pKHQua2V5LHQuY3VycmVudFZhbHVlKSl9KSkpLChufHxvKSYmKHRoaXMua2V5VmFsdWVzLnNvcnQoZSksdGhpcy5jb21wYXJlRm49ZSksdGhpcy5rZXlWYWx1ZXN9fWZ1bmN0aW9uIEhNKHQsZSl7Y29uc3Qgbj10LmtleSxvPWUua2V5O2lmKG49PT1vKXJldHVybiAwO2lmKHZvaWQgMD09PW4pcmV0dXJuIDE7aWYodm9pZCAwPT09bylyZXR1cm4tMTtpZihudWxsPT09bilyZXR1cm4gMTtpZihudWxsPT09bylyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIG4mJiJzdHJpbmciPT10eXBlb2YgbylyZXR1cm4gbjxvPy0xOjE7aWYoIm51bWJlciI9PXR5cGVvZiBuJiYibnVtYmVyIj09dHlwZW9mIG8pcmV0dXJuIG4tbztpZigiYm9vbGVhbiI9PXR5cGVvZiBuJiYiYm9vbGVhbiI9PXR5cGVvZiBvKXJldHVybiBuPG8/LTE6MTtjb25zdCBpPVN0cmluZyhuKSxhPVN0cmluZyhvKTtyZXR1cm4gaT09YT8wOmk8YT8tMToxfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9JTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SU0pKFNtKExnLDE2KSl9LElNLsm1cGlwZT1jbyh7bmFtZToia2V5dmFsdWUiLHR5cGU6SU0scHVyZTohMX0pLElNLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6TGd9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKElNLFt7dHlwZTp2eSxhcmdzOlt7bmFtZToia2V5dmFsdWUiLHB1cmU6ITF9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpMZ31dfSksbnVsbCk7Y2xhc3MgRk17Y29uc3RydWN0b3IodCl7dGhpcy5fbG9jYWxlPXR9dHJhbnNmb3JtKHQsZSxuKXtpZighVk0odCkpcmV0dXJuIG51bGw7bj1ufHx0aGlzLl9sb2NhbGU7dHJ5e3JldHVybiBRQyhqTSh0KSxuLGUpfWNhdGNoKHQpe3Rocm93IHhNKEZNLHQubWVzc2FnZSl9fX1GTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8Rk0pKFNtKFd5LDE2KSl9LEZNLsm1cGlwZT1jbyh7bmFtZToibnVtYmVyIix0eXBlOkZNLHB1cmU6ITB9KSxGTS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltXeV19XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRk0sW3t0eXBlOnZ5LGFyZ3M6W3tuYW1lOiJudW1iZXIifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1d5XX1dfV19KSxudWxsKTtjbGFzcyBMTXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9sb2NhbGU9dH10cmFuc2Zvcm0odCxlLG4pe2lmKCFWTSh0KSlyZXR1cm4gbnVsbDtuPW58fHRoaXMuX2xvY2FsZTt0cnl7cmV0dXJuKGZ1bmN0aW9uIG8odCxlLG4pe3JldHVybiBKQyh0LCRDKHhDKGUsbUMuUGVyY2VudCksdkMoZSxiQy5NaW51c1NpZ24pKSxlLGJDLkdyb3VwLGJDLkRlY2ltYWwsbiwhMCkucmVwbGFjZShuZXcgUmVnRXhwKCIlIiwiZyIpLHZDKGUsYkMuUGVyY2VudFNpZ24pKX0pKGpNKHQpLG4sZSl9Y2F0Y2godCl7dGhyb3cgeE0oTE0sdC5tZXNzYWdlKX19fUxNLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxMTSkoU20oV3ksMTYpKX0sTE0uybVwaXBlPWNvKHtuYW1lOiJwZXJjZW50Iix0eXBlOkxNLHB1cmU6ITB9KSxMTS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltXeV19XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoTE0sW3t0eXBlOnZ5LGFyZ3M6W3tuYW1lOiJwZXJjZW50In1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltXeV19XX1dfSksbnVsbCk7Y2xhc3MgQk17Y29uc3RydWN0b3IodCxlPSJVU0QiKXt0aGlzLl9sb2NhbGU9dCx0aGlzLl9kZWZhdWx0Q3VycmVuY3lDb2RlPWV9dHJhbnNmb3JtKHQsZT10aGlzLl9kZWZhdWx0Q3VycmVuY3lDb2RlLG49InN5bWJvbCIsbyxpKXtpZighVk0odCkpcmV0dXJuIG51bGw7aT1pfHx0aGlzLl9sb2NhbGUsImJvb2xlYW4iPT10eXBlb2YgbiYmKCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmY29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4oJ1dhcm5pbmc6IHRoZSBjdXJyZW5jeSBwaXBlIGhhcyBiZWVuIGNoYW5nZWQgaW4gQW5ndWxhciB2NS4gVGhlIHN5bWJvbERpc3BsYXkgb3B0aW9uICh0aGlyZCBwYXJhbWV0ZXIpIGlzIG5vdyBhIHN0cmluZyBpbnN0ZWFkIG9mIGEgYm9vbGVhbi4gVGhlIGFjY2VwdGVkIHZhbHVlcyBhcmUgImNvZGUiLCAic3ltYm9sIiBvciAic3ltYm9sLW5hcnJvdyIuJyksbj1uPyJzeW1ib2wiOiJjb2RlIik7bGV0IGE9ZXx8dGhpcy5fZGVmYXVsdEN1cnJlbmN5Q29kZTsiY29kZSIhPT1uJiYoYT0ic3ltYm9sIj09PW58fCJzeW1ib2wtbmFycm93Ij09PW4/KGZ1bmN0aW9uIHIodCxlLG49ImVuIil7Y29uc3Qgbz0oZnVuY3Rpb24gaSh0KXtyZXR1cm4gTHUodClbanUuQ3VycmVuY2llc119KShuKVt0XXx8cENbdF18fFtdLGE9b1sxXTtyZXR1cm4ibmFycm93Ij09PWUmJiJzdHJpbmciPT10eXBlb2YgYT9hOm9bMF18fHR9KShhLCJzeW1ib2wiPT09bj8id2lkZSI6Im5hcnJvdyIsaSk6bik7dHJ5e3JldHVybihmdW5jdGlvbiBuKHQsZSxvLGksYSl7Y29uc3Qgcj0kQyh4QyhlLG1DLkN1cnJlbmN5KSx2QyhlLGJDLk1pbnVzU2lnbikpO3JldHVybiByLm1pbkZyYWM9KGZ1bmN0aW9uIHModCl7bGV0IGU7Y29uc3Qgbj1wQ1t0XTtyZXR1cm4gbiYmKGU9blsyXSksIm51bWJlciI9PXR5cGVvZiBlP2U6Mn0pKGkpLHIubWF4RnJhYz1yLm1pbkZyYWMsSkModCxyLGUsYkMuQ3VycmVuY3lHcm91cCxiQy5DdXJyZW5jeURlY2ltYWwsYSkucmVwbGFjZSgiwqQiLG8pLnJlcGxhY2UoIsKkIiwiIikudHJpbSgpfSkoak0odCksaSxhLGUsbyl9Y2F0Y2godCl7dGhyb3cgeE0oQk0sdC5tZXNzYWdlKX19fWZ1bmN0aW9uIFZNKHQpe3JldHVybiEobnVsbD09dHx8IiI9PT10fHx0IT10KX1mdW5jdGlvbiBqTSh0KXtpZigic3RyaW5nIj09dHlwZW9mIHQmJiFpc05hTihOdW1iZXIodCktcGFyc2VGbG9hdCh0KSkpcmV0dXJuIE51bWJlcih0KTtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKGAke3R9IGlzIG5vdCBhIG51bWJlcmApO3JldHVybiB0fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9CTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8Qk0pKFNtKFd5LDE2KSxTbShZeSwxNikpfSxCTS7JtXBpcGU9Y28oe25hbWU6ImN1cnJlbmN5Iix0eXBlOkJNLHB1cmU6ITB9KSxCTS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltXeV19XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1l5XX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChCTSxbe3R5cGU6dnksYXJnczpbe25hbWU6ImN1cnJlbmN5In1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltXeV19XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1l5XX1dfV19KSxudWxsKTtjbGFzcyBVTXt0cmFuc2Zvcm0odCxlLG4pe2lmKG51bGw9PXQpcmV0dXJuIG51bGw7aWYoIXRoaXMuc3VwcG9ydHModCkpdGhyb3cgeE0oVU0sdCk7cmV0dXJuIHQuc2xpY2UoZSxuKX1zdXBwb3J0cyh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR8fEFycmF5LmlzQXJyYXkodCl9fVVNLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxVTSl9LFVNLsm1cGlwZT1jbyh7bmFtZToic2xpY2UiLHR5cGU6VU0scHVyZTohMX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoVU0sW3t0eXBlOnZ5LGFyZ3M6W3tuYW1lOiJzbGljZSIscHVyZTohMX1dfV0sbnVsbCxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IEdNPVt3TSxFTSxrTSx6TSxVTSxGTSxMTSxETSxCTSxSTSxUTSxOTSxJTV07Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIFdNe31XTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8V00pfSxXTS7JtW1vZD1hbyh7dHlwZTpXTX0pLFdNLsm1aW5qPXZuKHtwcm92aWRlcnM6W3twcm92aWRlOmVNLHVzZUNsYXNzOm9NfV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFdNLFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOlt2TSxHTV0sZXhwb3J0czpbdk0sR01dLHByb3ZpZGVyczpbe3Byb3ZpZGU6ZU0sdXNlQ2xhc3M6b019XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFdNLHtkZWNsYXJhdGlvbnM6W2FNLHJNLGxNLGRNLE1NLENNLGZNLGdNLGhNLHlNLF9NLHdNLEVNLGtNLHpNLFVNLEZNLExNLERNLEJNLFJNLFRNLE5NLElNXSxleHBvcnRzOlthTSxyTSxsTSxkTSxNTSxDTSxmTSxnTSxoTSx5TSxfTSx3TSxFTSxrTSx6TSxVTSxGTSxMTSxETSxCTSxSTSxUTSxOTSxJTV19KSwKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCm5ldyBPZygiMTIuMi4xIik7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBZTXt9WU0uybVwcm92PU1uKHt0b2tlbjpZTSxwcm92aWRlZEluOiJyb290IixmYWN0b3J5OigpPT5uZXcgcU0odnIoWl8pLHdpbmRvdyl9KTtjbGFzcyBxTXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuZG9jdW1lbnQ9dCx0aGlzLndpbmRvdz1lLHRoaXMub2Zmc2V0PSgpPT5bMCwwXX1zZXRPZmZzZXQodCl7dGhpcy5vZmZzZXQ9QXJyYXkuaXNBcnJheSh0KT8oKT0+dDp0fWdldFNjcm9sbFBvc2l0aW9uKCl7cmV0dXJuIHRoaXMuc3VwcG9ydHNTY3JvbGxpbmcoKT9bdGhpcy53aW5kb3cucGFnZVhPZmZzZXQsdGhpcy53aW5kb3cucGFnZVlPZmZzZXRdOlswLDBdfXNjcm9sbFRvUG9zaXRpb24odCl7dGhpcy5zdXBwb3J0c1Njcm9sbGluZygpJiZ0aGlzLndpbmRvdy5zY3JvbGxUbyh0WzBdLHRbMV0pfXNjcm9sbFRvQW5jaG9yKHQpe2lmKCF0aGlzLnN1cHBvcnRzU2Nyb2xsaW5nKCkpcmV0dXJuO2NvbnN0IGU9KGZ1bmN0aW9uIG4odCxlKXtjb25zdCBuPXQuZ2V0RWxlbWVudEJ5SWQoZSl8fHQuZ2V0RWxlbWVudHNCeU5hbWUoZSlbMF07aWYobilyZXR1cm4gbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgdC5jcmVhdGVUcmVlV2Fsa2VyJiZ0LmJvZHkmJih0LmJvZHkuY3JlYXRlU2hhZG93Um9vdHx8dC5ib2R5LmF0dGFjaFNoYWRvdykpe2NvbnN0IG49dC5jcmVhdGVUcmVlV2Fsa2VyKHQuYm9keSxOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCk7bGV0IG89bi5jdXJyZW50Tm9kZTtmb3IoO287KXtjb25zdCB0PW8uc2hhZG93Um9vdDtpZih0KXtjb25zdCBuPXQuZ2V0RWxlbWVudEJ5SWQoZSl8fHQucXVlcnlTZWxlY3RvcihgW25hbWU9IiR7ZX0iXWApO2lmKG4pcmV0dXJuIG59bz1uLm5leHROb2RlKCl9fXJldHVybiBudWxsfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8pKHRoaXMuZG9jdW1lbnQsdCk7ZSYmKHRoaXMuc2Nyb2xsVG9FbGVtZW50KGUpLHRoaXMuYXR0ZW1wdEZvY3VzKGUpKX1zZXRIaXN0b3J5U2Nyb2xsUmVzdG9yYXRpb24odCl7aWYodGhpcy5zdXBwb3J0U2Nyb2xsUmVzdG9yYXRpb24oKSl7Y29uc3QgZT10aGlzLndpbmRvdy5oaXN0b3J5O2UmJmUuc2Nyb2xsUmVzdG9yYXRpb24mJihlLnNjcm9sbFJlc3RvcmF0aW9uPXQpfX1zY3JvbGxUb0VsZW1lbnQodCl7Y29uc3QgZT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49ZS5sZWZ0K3RoaXMud2luZG93LnBhZ2VYT2Zmc2V0LG89ZS50b3ArdGhpcy53aW5kb3cucGFnZVlPZmZzZXQsaT10aGlzLm9mZnNldCgpO3RoaXMud2luZG93LnNjcm9sbFRvKG4taVswXSxvLWlbMV0pfWF0dGVtcHRGb2N1cyh0KXtyZXR1cm4gdC5mb2N1cygpLHRoaXMuZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PXR9c3VwcG9ydFNjcm9sbFJlc3RvcmF0aW9uKCl7dHJ5e2lmKCF0aGlzLnN1cHBvcnRzU2Nyb2xsaW5nKCkpcmV0dXJuITE7Y29uc3QgdD1aTSh0aGlzLndpbmRvdy5oaXN0b3J5KXx8Wk0oT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMud2luZG93Lmhpc3RvcnkpKTtyZXR1cm4hKCF0fHwhdC53cml0YWJsZSYmIXQuc2V0KX1jYXRjaCh0KXtyZXR1cm4hMX19c3VwcG9ydHNTY3JvbGxpbmcoKXt0cnl7cmV0dXJuISF0aGlzLndpbmRvdyYmISF0aGlzLndpbmRvdy5zY3JvbGxUbyYmInBhZ2VYT2Zmc2V0ImluIHRoaXMud2luZG93fWNhdGNoKHQpe3JldHVybiExfX19ZnVuY3Rpb24gWk0odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwic2Nyb2xsUmVzdG9yYXRpb24iKX1jbGFzcyBYTXt9Ci8qKgogICAgICogQGxpY2Vuc2UgQW5ndWxhciB2MTIuMi4xCiAgICAgKiAoYykgMjAxMC0yMDIxIEdvb2dsZSBMTEMuIGh0dHBzOi8vYW5ndWxhci5pby8KICAgICAqIExpY2Vuc2U6IE1JVAogICAgICovCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgS00gZXh0ZW5kcyBjbGFzcyBleHRlbmRzIGNsYXNze317Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuc3VwcG9ydHNET01FdmVudHM9ITB9fXtzdGF0aWMgbWFrZUN1cnJlbnQoKXshKGZ1bmN0aW9uIHQoZSl7WV98fChZXz1lKX0pKG5ldyBLTSl9b25BbmRDYW5jZWwodCxlLG4pe3JldHVybiB0LmFkZEV2ZW50TGlzdGVuZXIoZSxuLCExKSwoKT0+e3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLG4sITEpfX1kaXNwYXRjaEV2ZW50KHQsZSl7dC5kaXNwYXRjaEV2ZW50KGUpfXJlbW92ZSh0KXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KX1jcmVhdGVFbGVtZW50KHQsZSl7cmV0dXJuKGU9ZXx8dGhpcy5nZXREZWZhdWx0RG9jdW1lbnQoKSkuY3JlYXRlRWxlbWVudCh0KX1jcmVhdGVIdG1sRG9jdW1lbnQoKXtyZXR1cm4gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCJmYWtlVGl0bGUiKX1nZXREZWZhdWx0RG9jdW1lbnQoKXtyZXR1cm4gZG9jdW1lbnR9aXNFbGVtZW50Tm9kZSh0KXtyZXR1cm4gdC5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFfWlzU2hhZG93Um9vdCh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnR9Z2V0R2xvYmFsRXZlbnRUYXJnZXQodCxlKXtyZXR1cm4id2luZG93Ij09PWU/d2luZG93OiJkb2N1bWVudCI9PT1lP3Q6ImJvZHkiPT09ZT90LmJvZHk6bnVsbH1nZXRCYXNlSHJlZih0KXtjb25zdCBlPShmdW5jdGlvbiBuKCl7cmV0dXJuIFFNPVFNfHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJiYXNlIiksUU0/UU0uZ2V0QXR0cmlidXRlKCJocmVmIik6bnVsbH0pKCk7cmV0dXJuIG51bGw9PWU/bnVsbDooZnVuY3Rpb24gbyh0KXtKTT1KTXx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpLEpNLnNldEF0dHJpYnV0ZSgiaHJlZiIsdCk7Y29uc3QgZT1KTS5wYXRobmFtZTtyZXR1cm4iLyI9PT1lLmNoYXJBdCgwKT9lOmAvJHtlfWB9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLykoZSl9cmVzZXRCYXNlRWxlbWVudCgpe1FNPW51bGx9Z2V0VXNlckFnZW50KCl7cmV0dXJuIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50fWdldENvb2tpZSh0KXtyZXR1cm4gaU0oZG9jdW1lbnQuY29va2llLHQpfX1sZXQgSk0sUU09bnVsbDtjb25zdCAkTT1uZXcgR2EoIlRSQU5TSVRJT05fSUQiKSx0dj1be3Byb3ZpZGU6enksdXNlRmFjdG9yeTpmdW5jdGlvbiBldih0LGUsbil7cmV0dXJuKCk9PntuLmdldChJeSkuZG9uZVByb21pc2UudGhlbigoKCk9Pntjb25zdCBuPXFfKCk7QXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGUucXVlcnlTZWxlY3RvckFsbCgic3R5bGVbbmctdHJhbnNpdGlvbl0iKSkuZmlsdGVyKChlPT5lLmdldEF0dHJpYnV0ZSgibmctdHJhbnNpdGlvbiIpPT09dCkpLmZvckVhY2goKHQ9Pm4ucmVtb3ZlKHQpKSl9KSl9fSxkZXBzOlskTSxaXyxycF0sbXVsdGk6ITB9XTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIG52e3N0YXRpYyBpbml0KCl7IShmdW5jdGlvbiB0KGUpe2dfPWV9KShuZXcgbnYpfWFkZFRvV2luZG93KHQpe2puLmdldEFuZ3VsYXJUZXN0YWJpbGl0eT0oZSxuPSEwKT0+e2NvbnN0IG89dC5maW5kVGVzdGFiaWxpdHlJblRyZWUoZSxuKTtpZihudWxsPT1vKXRocm93IG5ldyBFcnJvcigiQ291bGQgbm90IGZpbmQgdGVzdGFiaWxpdHkgZm9yIGVsZW1lbnQuIik7cmV0dXJuIG99LGpuLmdldEFsbEFuZ3VsYXJUZXN0YWJpbGl0aWVzPSgpPT50LmdldEFsbFRlc3RhYmlsaXRpZXMoKSxqbi5nZXRBbGxBbmd1bGFyUm9vdEVsZW1lbnRzPSgpPT50LmdldEFsbFJvb3RFbGVtZW50cygpLGpuLmZyYW1ld29ya1N0YWJpbGl6ZXJzfHwoam4uZnJhbWV3b3JrU3RhYmlsaXplcnM9W10pLGpuLmZyYW1ld29ya1N0YWJpbGl6ZXJzLnB1c2goKHQ9Pntjb25zdCBlPWpuLmdldEFsbEFuZ3VsYXJUZXN0YWJpbGl0aWVzKCk7bGV0IG49ZS5sZW5ndGgsbz0hMTtjb25zdCBpPWZ1bmN0aW9uKGUpe289b3x8ZSxuLS0sMD09biYmdChvKX07ZS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LndoZW5TdGFibGUoaSl9KSl9KSl9ZmluZFRlc3RhYmlsaXR5SW5UcmVlKHQsZSxuKXtpZihudWxsPT1lKXJldHVybiBudWxsO2NvbnN0IG89dC5nZXRUZXN0YWJpbGl0eShlKTtyZXR1cm4gbnVsbCE9bz9vOm4/cV8oKS5pc1NoYWRvd1Jvb3QoZSk/dGhpcy5maW5kVGVzdGFiaWxpdHlJblRyZWUodCxlLmhvc3QsITApOnRoaXMuZmluZFRlc3RhYmlsaXR5SW5UcmVlKHQsZS5wYXJlbnRFbGVtZW50LCEwKTpudWxsfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3Mgb3Z7YnVpbGQoKXtyZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0fX1vdi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8b3YpfSxvdi7JtXByb3Y9TW4oe3Rva2VuOm92LGZhY3Rvcnk6b3YuybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKG92LFt7dHlwZTppbX1dLG51bGwsbnVsbCksbmV3IFNyO2NvbnN0IGl2PW5ldyBHYSgiRXZlbnRNYW5hZ2VyUGx1Z2lucyIpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBhdntjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX3pvbmU9ZSx0aGlzLl9ldmVudE5hbWVUb1BsdWdpbj1uZXcgTWFwLHQuZm9yRWFjaCgodD0+dC5tYW5hZ2VyPXRoaXMpKSx0aGlzLl9wbHVnaW5zPXQuc2xpY2UoKS5yZXZlcnNlKCl9YWRkRXZlbnRMaXN0ZW5lcih0LGUsbil7cmV0dXJuIHRoaXMuX2ZpbmRQbHVnaW5Gb3IoZSkuYWRkRXZlbnRMaXN0ZW5lcih0LGUsbil9YWRkR2xvYmFsRXZlbnRMaXN0ZW5lcih0LGUsbil7cmV0dXJuIHRoaXMuX2ZpbmRQbHVnaW5Gb3IoZSkuYWRkR2xvYmFsRXZlbnRMaXN0ZW5lcih0LGUsbil9Z2V0Wm9uZSgpe3JldHVybiB0aGlzLl96b25lfV9maW5kUGx1Z2luRm9yKHQpe2NvbnN0IGU9dGhpcy5fZXZlbnROYW1lVG9QbHVnaW4uZ2V0KHQpO2lmKGUpcmV0dXJuIGU7Y29uc3Qgbj10aGlzLl9wbHVnaW5zO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSsrKXtjb25zdCBvPW5bZV07aWYoby5zdXBwb3J0cyh0KSlyZXR1cm4gdGhpcy5fZXZlbnROYW1lVG9QbHVnaW4uc2V0KHQsbyksb310aHJvdyBuZXcgRXJyb3IoYE5vIGV2ZW50IG1hbmFnZXIgcGx1Z2luIGZvdW5kIGZvciBldmVudCAke3R9YCl9fWF2Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxhdikodnIoaXYpLHZyKGFfKSl9LGF2Lsm1cHJvdj1Nbih7dG9rZW46YXYsZmFjdG9yeTphdi7JtWZhY30pLGF2LmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbaXZdfV19LHt0eXBlOmFffV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChhdixbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbaXZdfV19LHt0eXBlOmFffV19KSxudWxsKTtjbGFzcyBydntjb25zdHJ1Y3Rvcih0KXt0aGlzLl9kb2M9dH1hZGRHbG9iYWxFdmVudExpc3RlbmVyKHQsZSxuKXtjb25zdCBvPXFfKCkuZ2V0R2xvYmFsRXZlbnRUYXJnZXQodGhpcy5fZG9jLHQpO2lmKCFvKXRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZXZlbnQgdGFyZ2V0ICR7b30gZm9yIGV2ZW50ICR7ZX1gKTtyZXR1cm4gdGhpcy5hZGRFdmVudExpc3RlbmVyKG8sZSxuKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIHN2e2NvbnN0cnVjdG9yKCl7dGhpcy5fc3R5bGVzU2V0PW5ldyBTZXR9YWRkU3R5bGVzKHQpe2NvbnN0IGU9bmV3IFNldDt0LmZvckVhY2goKHQ9Pnt0aGlzLl9zdHlsZXNTZXQuaGFzKHQpfHwodGhpcy5fc3R5bGVzU2V0LmFkZCh0KSxlLmFkZCh0KSl9KSksdGhpcy5vblN0eWxlc0FkZGVkKGUpfW9uU3R5bGVzQWRkZWQodCl7fWdldEFsbFN0eWxlcygpe3JldHVybiBBcnJheS5mcm9tKHRoaXMuX3N0eWxlc1NldCl9fXN2Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxzdil9LHN2Lsm1cHJvdj1Nbih7dG9rZW46c3YsZmFjdG9yeTpzdi7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoc3YsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW119KSxudWxsKTtjbGFzcyBsdiBleHRlbmRzIHN2e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5fZG9jPXQsdGhpcy5faG9zdE5vZGVzPW5ldyBNYXAsdGhpcy5faG9zdE5vZGVzLnNldCh0LmhlYWQsW10pfV9hZGRTdHlsZXNUb0hvc3QodCxlLG4pe3QuZm9yRWFjaCgodD0+e2NvbnN0IG89dGhpcy5fZG9jLmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7by50ZXh0Q29udGVudD10LG4ucHVzaChlLmFwcGVuZENoaWxkKG8pKX0pKX1hZGRIb3N0KHQpe2NvbnN0IGU9W107dGhpcy5fYWRkU3R5bGVzVG9Ib3N0KHRoaXMuX3N0eWxlc1NldCx0LGUpLHRoaXMuX2hvc3ROb2Rlcy5zZXQodCxlKX1yZW1vdmVIb3N0KHQpe2NvbnN0IGU9dGhpcy5faG9zdE5vZGVzLmdldCh0KTtlJiZlLmZvckVhY2goY3YpLHRoaXMuX2hvc3ROb2Rlcy5kZWxldGUodCl9b25TdHlsZXNBZGRlZCh0KXt0aGlzLl9ob3N0Tm9kZXMuZm9yRWFjaCgoKGUsbik9Pnt0aGlzLl9hZGRTdHlsZXNUb0hvc3QodCxuLGUpfSkpfW5nT25EZXN0cm95KCl7dGhpcy5faG9zdE5vZGVzLmZvckVhY2goKHQ9PnQuZm9yRWFjaChjdikpKX19ZnVuY3Rpb24gY3YodCl7cV8oKS5yZW1vdmUodCl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2x2Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxsdikodnIoWl8pKX0sbHYuybVwcm92PU1uKHt0b2tlbjpsdixmYWN0b3J5Omx2Lsm1ZmFjfSksbHYuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGx2LFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XX0pLG51bGwpO2NvbnN0IGR2PXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifSxwdj0vJUNPTVAlL2csbXY9InVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fCEhbmdEZXZNb2RlO2Z1bmN0aW9uIHV2KHQsZSxuKXtmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rKyl7bGV0IGk9ZVtvXTtBcnJheS5pc0FycmF5KGkpP3V2KHQsaSxuKTooaT1pLnJlcGxhY2UocHYsdCksbi5wdXNoKGkpKX1yZXR1cm4gbn1mdW5jdGlvbiBmdih0KXtyZXR1cm4gZT0+e2lmKCJfX25nVW53cmFwX18iPT09ZSlyZXR1cm4gdDshMT09PXQoZSkmJihlLnByZXZlbnREZWZhdWx0KCksZS5yZXR1cm5WYWx1ZT0hMSl9fWxldCBndj0hMTtjbGFzcyBodntjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5ldmVudE1hbmFnZXI9dCx0aGlzLnNoYXJlZFN0eWxlc0hvc3Q9ZSx0aGlzLmFwcElkPW4sdGhpcy5yZW5kZXJlckJ5Q29tcElkPW5ldyBNYXAsdGhpcy5kZWZhdWx0UmVuZGVyZXI9bmV3IGJ2KHQpfWNyZWF0ZVJlbmRlcmVyKHQsZSl7aWYoIXR8fCFlKXJldHVybiB0aGlzLmRlZmF1bHRSZW5kZXJlcjtzd2l0Y2goZS5lbmNhcHN1bGF0aW9uKXtjYXNlIEhuLkVtdWxhdGVkOntsZXQgbj10aGlzLnJlbmRlcmVyQnlDb21wSWQuZ2V0KGUuaWQpO3JldHVybiBufHwobj1uZXcgQ3YodGhpcy5ldmVudE1hbmFnZXIsdGhpcy5zaGFyZWRTdHlsZXNIb3N0LGUsdGhpcy5hcHBJZCksdGhpcy5yZW5kZXJlckJ5Q29tcElkLnNldChlLmlkLG4pKSxuLmFwcGx5VG9Ib3N0KHQpLG59Y2FzZSAxOmNhc2UgSG4uU2hhZG93RG9tOnJldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgbmdEZXZNb2RlJiYhbmdEZXZNb2RlfHxndnx8MSE9PWUuZW5jYXBzdWxhdGlvbnx8KGd2PSEwLGNvbnNvbGUud2FybigiVmlld0VuY2Fwc3VsYXRpb24uTmF0aXZlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIEZhbGxpbmcgYmFjayB0byBWaWV3RW5jYXBzdWxhdGlvbi5TaGFkb3dEb20uIFRoZSBmYWxsYmFjayB3aWxsIGJlIHJlbW92ZWQgaW4gdjEyLiIpKSxuZXcgTXYodGhpcy5ldmVudE1hbmFnZXIsdGhpcy5zaGFyZWRTdHlsZXNIb3N0LHQsZSk7ZGVmYXVsdDppZighdGhpcy5yZW5kZXJlckJ5Q29tcElkLmhhcyhlLmlkKSl7Y29uc3QgdD11dihlLmlkLGUuc3R5bGVzLFtdKTt0aGlzLnNoYXJlZFN0eWxlc0hvc3QuYWRkU3R5bGVzKHQpLHRoaXMucmVuZGVyZXJCeUNvbXBJZC5zZXQoZS5pZCx0aGlzLmRlZmF1bHRSZW5kZXJlcil9cmV0dXJuIHRoaXMuZGVmYXVsdFJlbmRlcmVyfX1iZWdpbigpe31lbmQoKXt9fWh2Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxodikodnIoYXYpLHZyKGx2KSx2cihIeSkpfSxodi7JtXByb3Y9TW4oe3Rva2VuOmh2LGZhY3Rvcnk6aHYuybVmYWN9KSxodi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmF2fSx7dHlwZTpsdn0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W0h5XX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChodixbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6YXZ9LHt0eXBlOmx2fSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbSHldfV19XX0pLG51bGwpO2NsYXNzIGJ2e2NvbnN0cnVjdG9yKHQpe3RoaXMuZXZlbnRNYW5hZ2VyPXQsdGhpcy5kYXRhPU9iamVjdC5jcmVhdGUobnVsbCl9ZGVzdHJveSgpe31jcmVhdGVFbGVtZW50KHQsZSl7cmV0dXJuIGU/ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGR2W2VdfHxlLHQpOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodCl9Y3JlYXRlQ29tbWVudCh0KXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCh0KX1jcmVhdGVUZXh0KHQpe3JldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0KX1hcHBlbmRDaGlsZCh0LGUpe3QuYXBwZW5kQ2hpbGQoZSl9aW5zZXJ0QmVmb3JlKHQsZSxuKXt0JiZ0Lmluc2VydEJlZm9yZShlLG4pfXJlbW92ZUNoaWxkKHQsZSl7dCYmdC5yZW1vdmVDaGlsZChlKX1zZWxlY3RSb290RWxlbWVudCh0LGUpe2xldCBuPSJzdHJpbmciPT10eXBlb2YgdD9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQpOnQ7aWYoIW4pdGhyb3cgbmV3IEVycm9yKGBUaGUgc2VsZWN0b3IgIiR7dH0iIGRpZCBub3QgbWF0Y2ggYW55IGVsZW1lbnRzYCk7cmV0dXJuIGV8fChuLnRleHRDb250ZW50PSIiKSxufXBhcmVudE5vZGUodCl7cmV0dXJuIHQucGFyZW50Tm9kZX1uZXh0U2libGluZyh0KXtyZXR1cm4gdC5uZXh0U2libGluZ31zZXRBdHRyaWJ1dGUodCxlLG4sbyl7aWYobyl7ZT1vKyI6IitlO2NvbnN0IGk9ZHZbb107aT90LnNldEF0dHJpYnV0ZU5TKGksZSxuKTp0LnNldEF0dHJpYnV0ZShlLG4pfWVsc2UgdC5zZXRBdHRyaWJ1dGUoZSxuKX1yZW1vdmVBdHRyaWJ1dGUodCxlLG4pe2lmKG4pe2NvbnN0IG89ZHZbbl07bz90LnJlbW92ZUF0dHJpYnV0ZU5TKG8sZSk6dC5yZW1vdmVBdHRyaWJ1dGUoYCR7bn06JHtlfWApfWVsc2UgdC5yZW1vdmVBdHRyaWJ1dGUoZSl9YWRkQ2xhc3ModCxlKXt0LmNsYXNzTGlzdC5hZGQoZSl9cmVtb3ZlQ2xhc3ModCxlKXt0LmNsYXNzTGlzdC5yZW1vdmUoZSl9c2V0U3R5bGUodCxlLG4sbyl7byYoY2wuRGFzaENhc2V8Y2wuSW1wb3J0YW50KT90LnN0eWxlLnNldFByb3BlcnR5KGUsbixvJmNsLkltcG9ydGFudD8iaW1wb3J0YW50IjoiIik6dC5zdHlsZVtlXT1ufXJlbW92ZVN0eWxlKHQsZSxuKXtuJmNsLkRhc2hDYXNlP3Quc3R5bGUucmVtb3ZlUHJvcGVydHkoZSk6dC5zdHlsZVtlXT0iIn1zZXRQcm9wZXJ0eSh0LGUsbil7bXYmJl92KGUsInByb3BlcnR5IiksdFtlXT1ufXNldFZhbHVlKHQsZSl7dC5ub2RlVmFsdWU9ZX1saXN0ZW4odCxlLG4pe3JldHVybiBtdiYmX3YoZSwibGlzdGVuZXIiKSwic3RyaW5nIj09dHlwZW9mIHQ/dGhpcy5ldmVudE1hbmFnZXIuYWRkR2xvYmFsRXZlbnRMaXN0ZW5lcih0LGUsZnYobikpOnRoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIodCxlLGZ2KG4pKX19Y29uc3QgeXY9IkAiLmNoYXJDb2RlQXQoMCk7ZnVuY3Rpb24gX3YodCxlKXtpZih0LmNoYXJDb2RlQXQoMCk9PT15dil0aHJvdyBuZXcgRXJyb3IoYEZvdW5kIHRoZSBzeW50aGV0aWMgJHtlfSAke3R9LiBQbGVhc2UgaW5jbHVkZSBlaXRoZXIgIkJyb3dzZXJBbmltYXRpb25zTW9kdWxlIiBvciAiTm9vcEFuaW1hdGlvbnNNb2R1bGUiIGluIHlvdXIgYXBwbGljYXRpb24uYCl9Y2xhc3MgQ3YgZXh0ZW5kcyBidntjb25zdHJ1Y3Rvcih0LGUsbixvKXtzdXBlcih0KSx0aGlzLmNvbXBvbmVudD1uO2NvbnN0IGk9dXYobysiLSIrbi5pZCxuLnN0eWxlcyxbXSk7ZS5hZGRTdHlsZXMoaSksdGhpcy5jb250ZW50QXR0cj0oZnVuY3Rpb24gYSh0KXtyZXR1cm4iX25nY29udGVudC0lQ09NUCUiLnJlcGxhY2UocHYsdCl9KShvKyItIituLmlkKSx0aGlzLmhvc3RBdHRyPShmdW5jdGlvbiByKHQpe3JldHVybiJfbmdob3N0LSVDT01QJSIucmVwbGFjZShwdix0KX0pKG8rIi0iK24uaWQpfWFwcGx5VG9Ib3N0KHQpe3N1cGVyLnNldEF0dHJpYnV0ZSh0LHRoaXMuaG9zdEF0dHIsIiIpfWNyZWF0ZUVsZW1lbnQodCxlKXtjb25zdCBuPXN1cGVyLmNyZWF0ZUVsZW1lbnQodCxlKTtyZXR1cm4gc3VwZXIuc2V0QXR0cmlidXRlKG4sdGhpcy5jb250ZW50QXR0ciwiIiksbn19Y2xhc3MgTXYgZXh0ZW5kcyBidntjb25zdHJ1Y3Rvcih0LGUsbixvKXtzdXBlcih0KSx0aGlzLnNoYXJlZFN0eWxlc0hvc3Q9ZSx0aGlzLmhvc3RFbD1uLHRoaXMuc2hhZG93Um9vdD1uLmF0dGFjaFNoYWRvdyh7bW9kZToib3BlbiJ9KSx0aGlzLnNoYXJlZFN0eWxlc0hvc3QuYWRkSG9zdCh0aGlzLnNoYWRvd1Jvb3QpO2NvbnN0IGk9dXYoby5pZCxvLnN0eWxlcyxbXSk7Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0Kyspe2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtlLnRleHRDb250ZW50PWlbdF0sdGhpcy5zaGFkb3dSb290LmFwcGVuZENoaWxkKGUpfX1ub2RlT3JTaGFkb3dSb290KHQpe3JldHVybiB0PT09dGhpcy5ob3N0RWw/dGhpcy5zaGFkb3dSb290OnR9ZGVzdHJveSgpe3RoaXMuc2hhcmVkU3R5bGVzSG9zdC5yZW1vdmVIb3N0KHRoaXMuc2hhZG93Um9vdCl9YXBwZW5kQ2hpbGQodCxlKXtyZXR1cm4gc3VwZXIuYXBwZW5kQ2hpbGQodGhpcy5ub2RlT3JTaGFkb3dSb290KHQpLGUpfWluc2VydEJlZm9yZSh0LGUsbil7cmV0dXJuIHN1cGVyLmluc2VydEJlZm9yZSh0aGlzLm5vZGVPclNoYWRvd1Jvb3QodCksZSxuKX1yZW1vdmVDaGlsZCh0LGUpe3JldHVybiBzdXBlci5yZW1vdmVDaGlsZCh0aGlzLm5vZGVPclNoYWRvd1Jvb3QodCksZSl9cGFyZW50Tm9kZSh0KXtyZXR1cm4gdGhpcy5ub2RlT3JTaGFkb3dSb290KHN1cGVyLnBhcmVudE5vZGUodGhpcy5ub2RlT3JTaGFkb3dSb290KHQpKSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyB2diBleHRlbmRzIHJ2e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfXN1cHBvcnRzKHQpe3JldHVybiEwfWFkZEV2ZW50TGlzdGVuZXIodCxlLG4pe3JldHVybiB0LmFkZEV2ZW50TGlzdGVuZXIoZSxuLCExKSwoKT0+dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHQsZSxuKX1yZW1vdmVFdmVudExpc3RlbmVyKHQsZSxuKXtyZXR1cm4gdC5yZW1vdmVFdmVudExpc3RlbmVyKGUsbil9fXZ2Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx2dikodnIoWl8pKX0sdnYuybVwcm92PU1uKHt0b2tlbjp2dixmYWN0b3J5OnZ2Lsm1ZmFjfSksdnYuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHZ2LFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgeHY9e3BhbjohMCxwYW5zdGFydDohMCxwYW5tb3ZlOiEwLHBhbmVuZDohMCxwYW5jYW5jZWw6ITAscGFubGVmdDohMCxwYW5yaWdodDohMCxwYW51cDohMCxwYW5kb3duOiEwLHBpbmNoOiEwLHBpbmNoc3RhcnQ6ITAscGluY2htb3ZlOiEwLHBpbmNoZW5kOiEwLHBpbmNoY2FuY2VsOiEwLHBpbmNoaW46ITAscGluY2hvdXQ6ITAscHJlc3M6ITAscHJlc3N1cDohMCxyb3RhdGU6ITAscm90YXRlc3RhcnQ6ITAscm90YXRlbW92ZTohMCxyb3RhdGVlbmQ6ITAscm90YXRlY2FuY2VsOiEwLHN3aXBlOiEwLHN3aXBlbGVmdDohMCxzd2lwZXJpZ2h0OiEwLHN3aXBldXA6ITAsc3dpcGVkb3duOiEwLHRhcDohMCxkb3VibGV0YXA6ITB9LE92PW5ldyBHYSgiSGFtbWVyR2VzdHVyZUNvbmZpZyIpLFB2PW5ldyBHYSgiSGFtbWVyTG9hZGVyIik7Y2xhc3Mgd3Z7Y29uc3RydWN0b3IoKXt0aGlzLmV2ZW50cz1bXSx0aGlzLm92ZXJyaWRlcz17fX1idWlsZEhhbW1lcih0KXtjb25zdCBlPW5ldyBIYW1tZXIodCx0aGlzLm9wdGlvbnMpO2UuZ2V0KCJwaW5jaCIpLnNldCh7ZW5hYmxlOiEwfSksZS5nZXQoInJvdGF0ZSIpLnNldCh7ZW5hYmxlOiEwfSk7Zm9yKGNvbnN0IHQgaW4gdGhpcy5vdmVycmlkZXMpZS5nZXQodCkuc2V0KHRoaXMub3ZlcnJpZGVzW3RdKTtyZXR1cm4gZX19d3YuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHd2KX0sd3YuybVwcm92PU1uKHt0b2tlbjp3dixmYWN0b3J5Ond2Lsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh3dixbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5bXX0pLG51bGwpO2NsYXNzIGt2IGV4dGVuZHMgcnZ7Y29uc3RydWN0b3IodCxlLG4sbyl7c3VwZXIodCksdGhpcy5fY29uZmlnPWUsdGhpcy5jb25zb2xlPW4sdGhpcy5sb2FkZXI9byx0aGlzLl9sb2FkZXJQcm9taXNlPW51bGx9c3VwcG9ydHModCl7cmV0dXJuISgheHYuaGFzT3duUHJvcGVydHkodC50b0xvd2VyQ2FzZSgpKSYmIXRoaXMuaXNDdXN0b21FdmVudCh0KXx8IXdpbmRvdy5IYW1tZXImJiF0aGlzLmxvYWRlciYmKCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmdGhpcy5jb25zb2xlLndhcm4oYFRoZSAiJHt0fSIgZXZlbnQgY2Fubm90IGJlIGJvdW5kIGJlY2F1c2UgSGFtbWVyLkpTIGlzIG5vdCBsb2FkZWQgYW5kIG5vIGN1c3RvbSBsb2FkZXIgaGFzIGJlZW4gc3BlY2lmaWVkLmApLDEpKX1hZGRFdmVudExpc3RlbmVyKHQsZSxuKXtjb25zdCBvPXRoaXMubWFuYWdlci5nZXRab25lKCk7aWYoZT1lLnRvTG93ZXJDYXNlKCksIXdpbmRvdy5IYW1tZXImJnRoaXMubG9hZGVyKXt0aGlzLl9sb2FkZXJQcm9taXNlPXRoaXMuX2xvYWRlclByb21pc2V8fHRoaXMubG9hZGVyKCk7bGV0IG89ITEsaT0oKT0+e289ITB9O3JldHVybiB0aGlzLl9sb2FkZXJQcm9taXNlLnRoZW4oKCgpPT57aWYoIXdpbmRvdy5IYW1tZXIpcmV0dXJuKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZ0aGlzLmNvbnNvbGUud2FybigiVGhlIGN1c3RvbSBIQU1NRVJfTE9BREVSIGNvbXBsZXRlZCwgYnV0IEhhbW1lci5KUyBpcyBub3QgcHJlc2VudC4iKSx2b2lkKGk9KCk9Pnt9KTtvfHwoaT10aGlzLmFkZEV2ZW50TGlzdGVuZXIodCxlLG4pKX0pKS5jYXRjaCgoKCk9PnsoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJnRoaXMuY29uc29sZS53YXJuKGBUaGUgIiR7ZX0iIGV2ZW50IGNhbm5vdCBiZSBib3VuZCBiZWNhdXNlIHRoZSBjdXN0b20gSGFtbWVyLkpTIGxvYWRlciBmYWlsZWQuYCksaT0oKT0+e319KSksKCk9PntpKCl9fXJldHVybiBvLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e2NvbnN0IGk9dGhpcy5fY29uZmlnLmJ1aWxkSGFtbWVyKHQpLGE9ZnVuY3Rpb24odCl7by5ydW5HdWFyZGVkKChmdW5jdGlvbigpe24odCl9KSl9O3JldHVybiBpLm9uKGUsYSksKCk9PntpLm9mZihlLGEpLCJmdW5jdGlvbiI9PXR5cGVvZiBpLmRlc3Ryb3kmJmkuZGVzdHJveSgpfX0pKX1pc0N1c3RvbUV2ZW50KHQpe3JldHVybiB0aGlzLl9jb25maWcuZXZlbnRzLmluZGV4T2YodCk+LTF9fWt2Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxrdikodnIoWl8pLHZyKE92KSx2cihHeSksdnIoUHYsOCkpfSxrdi7JtXByb3Y9TW4oe3Rva2VuOmt2LGZhY3Rvcnk6a3YuybVmYWN9KSxrdi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6d3YsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbT3ZdfV19LHt0eXBlOkd5fSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1B2XX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChrdixbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTp3dixkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltPdl19XX0se3R5cGU6R3l9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbUHZdfV19XX0pLG51bGwpO2NvbnN0IFN2PVt7cHJvdmlkZTppdix1c2VDbGFzczprdixtdWx0aTohMCxkZXBzOltaXyxPdixHeSxbbmV3IFNyLFB2XV19LHtwcm92aWRlOk92LHVzZUNsYXNzOnd2LGRlcHM6W119XTtjbGFzcyBEdnt9RHYuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fER2KX0sRHYuybVtb2Q9YW8oe3R5cGU6RHZ9KSxEdi7JtWluaj12bih7cHJvdmlkZXJzOlN2fSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChEdixbe3R5cGU6QXksYXJnczpbe3Byb3ZpZGVyczpTdn1dfV0sbnVsbCxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IEV2PVsiYWx0IiwiY29udHJvbCIsIm1ldGEiLCJzaGlmdCJdLFJ2PXsiXGIiOiJCYWNrc3BhY2UiLCJcdCI6IlRhYiIsIn8iOiJEZWxldGUiLCIbIjoiRXNjYXBlIixEZWw6IkRlbGV0ZSIsRXNjOiJFc2NhcGUiLExlZnQ6IkFycm93TGVmdCIsUmlnaHQ6IkFycm93UmlnaHQiLFVwOiJBcnJvd1VwIixEb3duOiJBcnJvd0Rvd24iLE1lbnU6IkNvbnRleHRNZW51IixTY3JvbGw6IlNjcm9sbExvY2siLFdpbjoiT1MifSxBdj17QToiMSIsQjoiMiIsQzoiMyIsRDoiNCIsRToiNSIsRjoiNiIsRzoiNyIsSDoiOCIsSToiOSIsSjoiKiIsSzoiKyIsTToiLSIsTjoiLiIsTzoiLyIsImAiOiIwIiwiwpAiOiJOdW1Mb2NrIn0sVHY9e2FsdDp0PT50LmFsdEtleSxjb250cm9sOnQ9PnQuY3RybEtleSxtZXRhOnQ9PnQubWV0YUtleSxzaGlmdDp0PT50LnNoaWZ0S2V5fTtjbGFzcyBOdiBleHRlbmRzIHJ2e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfXN1cHBvcnRzKHQpe3JldHVybiBudWxsIT1Odi5wYXJzZUV2ZW50TmFtZSh0KX1hZGRFdmVudExpc3RlbmVyKHQsZSxuKXtjb25zdCBvPU52LnBhcnNlRXZlbnROYW1lKGUpLGk9TnYuZXZlbnRDYWxsYmFjayhvLmZ1bGxLZXksbix0aGlzLm1hbmFnZXIuZ2V0Wm9uZSgpKTtyZXR1cm4gdGhpcy5tYW5hZ2VyLmdldFpvbmUoKS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PnFfKCkub25BbmRDYW5jZWwodCxvLmRvbUV2ZW50TmFtZSxpKSkpfXN0YXRpYyBwYXJzZUV2ZW50TmFtZSh0KXtjb25zdCBlPXQudG9Mb3dlckNhc2UoKS5zcGxpdCgiLiIpLG49ZS5zaGlmdCgpO2lmKDA9PT1lLmxlbmd0aHx8ImtleWRvd24iIT09biYmImtleXVwIiE9PW4pcmV0dXJuIG51bGw7Y29uc3Qgbz1Odi5fbm9ybWFsaXplS2V5KGUucG9wKCkpO2xldCBpPSIiO2lmKEV2LmZvckVhY2goKHQ9Pntjb25zdCBuPWUuaW5kZXhPZih0KTtuPi0xJiYoZS5zcGxpY2UobiwxKSxpKz10KyIuIil9KSksaSs9bywwIT1lLmxlbmd0aHx8MD09PW8ubGVuZ3RoKXJldHVybiBudWxsO2NvbnN0IGE9e307cmV0dXJuIGEuZG9tRXZlbnROYW1lPW4sYS5mdWxsS2V5PWksYX1zdGF0aWMgZ2V0RXZlbnRGdWxsS2V5KHQpe2xldCBlPSIiLG49KGZ1bmN0aW9uIG8odCl7bGV0IGU9dC5rZXk7aWYobnVsbD09ZSl7aWYoZT10LmtleUlkZW50aWZpZXIsbnVsbD09ZSlyZXR1cm4iVW5pZGVudGlmaWVkIjtlLnN0YXJ0c1dpdGgoIlUrIikmJihlPVN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoZS5zdWJzdHJpbmcoMiksMTYpKSwzPT09dC5sb2NhdGlvbiYmQXYuaGFzT3duUHJvcGVydHkoZSkmJihlPUF2W2VdKSl9cmV0dXJuIFJ2W2VdfHxlfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8pKHQpO3JldHVybiBuPW4udG9Mb3dlckNhc2UoKSwiICI9PT1uP249InNwYWNlIjoiLiI9PT1uJiYobj0iZG90IiksRXYuZm9yRWFjaCgobz0+e28hPW4mJigwLFR2W29dKSh0KSYmKGUrPW8rIi4iKX0pKSxlKz1uLGV9c3RhdGljIGV2ZW50Q2FsbGJhY2sodCxlLG4pe3JldHVybiBvPT57TnYuZ2V0RXZlbnRGdWxsS2V5KG8pPT09dCYmbi5ydW5HdWFyZGVkKCgoKT0+ZShvKSkpfX1zdGF0aWMgX25vcm1hbGl6ZUtleSh0KXtzd2l0Y2godCl7Y2FzZSJlc2MiOnJldHVybiJlc2NhcGUiO2RlZmF1bHQ6cmV0dXJuIHR9fX1Odi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8TnYpKHZyKFpfKSl9LE52Lsm1cHJvdj1Nbih7dG9rZW46TnYsZmFjdG9yeTpOdi7JtWZhY30pLE52LmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChOdixbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV19KSxudWxsKTtjbGFzcyB6dnt9ZnVuY3Rpb24gSXYodCl7cmV0dXJuIG5ldyBIdih0LmdldChaXykpfXp2Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx6dil9LHp2Lsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIHZyKEh2KX0sdG9rZW46enYscHJvdmlkZWRJbjoicm9vdCJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHp2LFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCIsdXNlRXhpc3Rpbmc6cWUoKCgpPT5IdikpfV19XSxudWxsLG51bGwpO2NsYXNzIEh2IGV4dGVuZHMgenZ7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLl9kb2M9dH1zYW5pdGl6ZSh0LGUpe2lmKG51bGw9PWUpcmV0dXJuIG51bGw7c3dpdGNoKHQpe2Nhc2UgQXMuTk9ORTpyZXR1cm4gZTtjYXNlIEFzLkhUTUw6cmV0dXJuIGVzKGUsIkhUTUwiKT90cyhlKTpFcyh0aGlzLl9kb2MsU3RyaW5nKGUpKS50b1N0cmluZygpO2Nhc2UgQXMuU1RZTEU6cmV0dXJuIGVzKGUsIlN0eWxlIik/dHMoZSk6ZTtjYXNlIEFzLlNDUklQVDppZihlcyhlLCJTY3JpcHQiKSlyZXR1cm4gdHMoZSk7dGhyb3cgbmV3IEVycm9yKCJ1bnNhZmUgdmFsdWUgdXNlZCBpbiBhIHNjcmlwdCBjb250ZXh0Iik7Y2FzZSBBcy5VUkw6cmV0dXJuIG5zKGUpLGVzKGUsIlVSTCIpP3RzKGUpOmxzKFN0cmluZyhlKSk7Y2FzZSBBcy5SRVNPVVJDRV9VUkw6aWYoZXMoZSwiUmVzb3VyY2VVUkwiKSlyZXR1cm4gdHMoZSk7dGhyb3cgbmV3IEVycm9yKCJ1bnNhZmUgdmFsdWUgdXNlZCBpbiBhIHJlc291cmNlIFVSTCBjb250ZXh0IChzZWUgaHR0cHM6Ly9nLmNvL25nL3NlY3VyaXR5I3hzcykiKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBTZWN1cml0eUNvbnRleHQgJHt0fSAoc2VlIGh0dHBzOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpYCl9fWJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKHQpe3JldHVybihmdW5jdGlvbiBlKHQpe3JldHVybiBuZXcgWHIodCl9KSh0KX1ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUodCl7cmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyBLcih0KX0pKHQpfWJ5cGFzc1NlY3VyaXR5VHJ1c3RTY3JpcHQodCl7cmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyBKcih0KX0pKHQpfWJ5cGFzc1NlY3VyaXR5VHJ1c3RVcmwodCl7cmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyBRcih0KX0pKHQpfWJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCh0KXtyZXR1cm4oZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3ICRyKHQpfSkodCl9fUh2Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxIdikodnIoWl8pKX0sSHYuybVwcm92PU1uKHtmYWN0b3J5OmZ1bmN0aW9uIHQoKXtyZXR1cm4gSXYodnIoR2QpKX0sdG9rZW46SHYscHJvdmlkZWRJbjoicm9vdCJ9KSxIdi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoSHYsW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOiJyb290Iix1c2VGYWN0b3J5Okl2LGRlcHM6W3JwXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSksbnVsbCk7Y29uc3QgRnY9Q18oUl8sImJyb3dzZXIiLFt7cHJvdmlkZTpqeSx1c2VWYWx1ZToiYnJvd3NlciJ9LHtwcm92aWRlOlZ5LHVzZVZhbHVlOgovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KZnVuY3Rpb24gTHYoKXtLTS5tYWtlQ3VycmVudCgpLG52LmluaXQoKX0sbXVsdGk6ITB9LHtwcm92aWRlOlpfLHVzZUZhY3Rvcnk6ZnVuY3Rpb24gQnYoKXtyZXR1cm4oZnVuY3Rpb24gdChlKXtLbz1lfSkoZG9jdW1lbnQpLGRvY3VtZW50fSxkZXBzOltdfV0pLFZ2PVtbXSx7cHJvdmlkZTpZZCx1c2VWYWx1ZToicm9vdCJ9LHtwcm92aWRlOlpzLHVzZUZhY3Rvcnk6ZnVuY3Rpb24ganYoKXtyZXR1cm4gbmV3IFpzfSxkZXBzOltdfSx7cHJvdmlkZTppdix1c2VDbGFzczp2dixtdWx0aTohMCxkZXBzOltaXyxhXyxqeV19LHtwcm92aWRlOml2LHVzZUNsYXNzOk52LG11bHRpOiEwLGRlcHM6W1pfXX0sW10se3Byb3ZpZGU6aHYsdXNlQ2xhc3M6aHYsZGVwczpbYXYsbHYsSHldfSx7cHJvdmlkZTpfZyx1c2VFeGlzdGluZzpodn0se3Byb3ZpZGU6c3YsdXNlRXhpc3Rpbmc6bHZ9LHtwcm92aWRlOmx2LHVzZUNsYXNzOmx2LGRlcHM6W1pfXX0se3Byb3ZpZGU6bV8sdXNlQ2xhc3M6bV8sZGVwczpbYV9dfSx7cHJvdmlkZTphdix1c2VDbGFzczphdixkZXBzOltpdixhX119LHtwcm92aWRlOlhNLHVzZUNsYXNzOm92LGRlcHM6W119LFtdXTtjbGFzcyBVdntjb25zdHJ1Y3Rvcih0KXtpZih0KXRocm93IG5ldyBFcnJvcigiQnJvd3Nlck1vZHVsZSBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZC4gSWYgeW91IG5lZWQgYWNjZXNzIHRvIGNvbW1vbiBkaXJlY3RpdmVzIHN1Y2ggYXMgTmdJZiBhbmQgTmdGb3IgZnJvbSBhIGxhenkgbG9hZGVkIG1vZHVsZSwgaW1wb3J0IENvbW1vbk1vZHVsZSBpbnN0ZWFkLiIpfXN0YXRpYyB3aXRoU2VydmVyVHJhbnNpdGlvbih0KXtyZXR1cm57bmdNb2R1bGU6VXYscHJvdmlkZXJzOlt7cHJvdmlkZTpIeSx1c2VWYWx1ZTp0LmFwcElkfSx7cHJvdmlkZTokTSx1c2VFeGlzdGluZzpIeX0sdHZdfX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBHdigpe3JldHVybiBuZXcgV3YodnIoWl8pKX1Vdi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VXYpKHZyKFV2LDEyKSl9LFV2Lsm1bW9kPWFvKHt0eXBlOlV2fSksVXYuybVpbmo9dm4oe3Byb3ZpZGVyczpWdixpbXBvcnRzOltXTSxIX119KSxVdi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlV2LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpFcn0se3R5cGU6a3IsYXJnczpbVXZdfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFV2LFt7dHlwZTpBeSxhcmdzOlt7cHJvdmlkZXJzOlZ2LGV4cG9ydHM6W1dNLEhfXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlV2LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpFcn0se3R5cGU6a3IsYXJnczpbVXZdfV19XX0pLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oVXYse2V4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bV00sSF9dfX0pO2NsYXNzIFd2e2NvbnN0cnVjdG9yKHQpe3RoaXMuX2RvYz10LHRoaXMuX2RvbT1xXygpfWFkZFRhZyh0LGU9ITEpe3JldHVybiB0P3RoaXMuX2dldE9yQ3JlYXRlRWxlbWVudCh0LGUpOm51bGx9YWRkVGFncyh0LGU9ITEpe3JldHVybiB0P3QucmVkdWNlKCgodCxuKT0+KG4mJnQucHVzaCh0aGlzLl9nZXRPckNyZWF0ZUVsZW1lbnQobixlKSksdCkpLFtdKTpbXX1nZXRUYWcodCl7cmV0dXJuIHQmJnRoaXMuX2RvYy5xdWVyeVNlbGVjdG9yKGBtZXRhWyR7dH1dYCl8fG51bGx9Z2V0VGFncyh0KXtpZighdClyZXR1cm5bXTtjb25zdCBlPXRoaXMuX2RvYy5xdWVyeVNlbGVjdG9yQWxsKGBtZXRhWyR7dH1dYCk7cmV0dXJuIGU/W10uc2xpY2UuY2FsbChlKTpbXX11cGRhdGVUYWcodCxlKXtpZighdClyZXR1cm4gbnVsbDtlPWV8fHRoaXMuX3BhcnNlU2VsZWN0b3IodCk7Y29uc3Qgbj10aGlzLmdldFRhZyhlKTtyZXR1cm4gbj90aGlzLl9zZXRNZXRhRWxlbWVudEF0dHJpYnV0ZXModCxuKTp0aGlzLl9nZXRPckNyZWF0ZUVsZW1lbnQodCwhMCl9cmVtb3ZlVGFnKHQpe3RoaXMucmVtb3ZlVGFnRWxlbWVudCh0aGlzLmdldFRhZyh0KSl9cmVtb3ZlVGFnRWxlbWVudCh0KXt0JiZ0aGlzLl9kb20ucmVtb3ZlKHQpfV9nZXRPckNyZWF0ZUVsZW1lbnQodCxlPSExKXtpZighZSl7Y29uc3QgZT10aGlzLl9wYXJzZVNlbGVjdG9yKHQpLG49dGhpcy5nZXRUYWdzKGUpLmZpbHRlcigoZT0+dGhpcy5fY29udGFpbnNBdHRyaWJ1dGVzKHQsZSkpKVswXTtpZih2b2lkIDAhPT1uKXJldHVybiBufWNvbnN0IG49dGhpcy5fZG9tLmNyZWF0ZUVsZW1lbnQoIm1ldGEiKTtyZXR1cm4gdGhpcy5fc2V0TWV0YUVsZW1lbnRBdHRyaWJ1dGVzKHQsbiksdGhpcy5fZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQobiksbn1fc2V0TWV0YUVsZW1lbnRBdHRyaWJ1dGVzKHQsZSl7cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKG49PmUuc2V0QXR0cmlidXRlKHRoaXMuX2dldE1ldGFLZXlNYXAobiksdFtuXSkpKSxlfV9wYXJzZVNlbGVjdG9yKHQpe2NvbnN0IGU9dC5uYW1lPyJuYW1lIjoicHJvcGVydHkiO3JldHVybmAke2V9PSIke3RbZV19ImB9X2NvbnRhaW5zQXR0cmlidXRlcyh0LGUpe3JldHVybiBPYmplY3Qua2V5cyh0KS5ldmVyeSgobj0+ZS5nZXRBdHRyaWJ1dGUodGhpcy5fZ2V0TWV0YUtleU1hcChuKSk9PT10W25dKSl9X2dldE1ldGFLZXlNYXAodCl7cmV0dXJuIFl2W3RdfHx0fX1Xdi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8V3YpKHZyKFpfKSl9LFd2Lsm1cHJvdj1Nbih7ZmFjdG9yeTpHdix0b2tlbjpXdixwcm92aWRlZEluOiJyb290In0pLFd2LmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChXdixbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QiLHVzZUZhY3Rvcnk6R3YsZGVwczpbXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSksbnVsbCk7Y29uc3QgWXY9e2h0dHBFcXVpdjoiaHR0cC1lcXVpdiJ9OwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBxdigpe3JldHVybiBuZXcgWnYodnIoWl8pKX1jbGFzcyBadntjb25zdHJ1Y3Rvcih0KXt0aGlzLl9kb2M9dH1nZXRUaXRsZSgpe3JldHVybiB0aGlzLl9kb2MudGl0bGV9c2V0VGl0bGUodCl7dGhpcy5fZG9jLnRpdGxlPXR8fCIifX1adi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WnYpKHZyKFpfKSl9LFp2Lsm1cHJvdj1Nbih7ZmFjdG9yeTpxdix0b2tlbjpadixwcm92aWRlZEluOiJyb290In0pLFp2LmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChadixbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QiLHVzZUZhY3Rvcnk6cXYsZGVwczpbXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSksbnVsbCk7Y2xhc3MgWHZ7Y29uc3RydWN0b3IoKXt0aGlzLnN0b3JlPXt9LHRoaXMub25TZXJpYWxpemVDYWxsYmFja3M9e319c3RhdGljIGluaXQodCl7Y29uc3QgZT1uZXcgWHY7cmV0dXJuIGUuc3RvcmU9dCxlfWdldCh0LGUpe3JldHVybiB2b2lkIDAhPT10aGlzLnN0b3JlW3RdP3RoaXMuc3RvcmVbdF06ZX1zZXQodCxlKXt0aGlzLnN0b3JlW3RdPWV9cmVtb3ZlKHQpe2RlbGV0ZSB0aGlzLnN0b3JlW3RdfWhhc0tleSh0KXtyZXR1cm4gdGhpcy5zdG9yZS5oYXNPd25Qcm9wZXJ0eSh0KX1vblNlcmlhbGl6ZSh0LGUpe3RoaXMub25TZXJpYWxpemVDYWxsYmFja3NbdF09ZX10b0pzb24oKXtmb3IoY29uc3QgdCBpbiB0aGlzLm9uU2VyaWFsaXplQ2FsbGJhY2tzKWlmKHRoaXMub25TZXJpYWxpemVDYWxsYmFja3MuaGFzT3duUHJvcGVydHkodCkpdHJ5e3RoaXMuc3RvcmVbdF09dGhpcy5vblNlcmlhbGl6ZUNhbGxiYWNrc1t0XSgpfWNhdGNoKHQpe2NvbnNvbGUud2FybigiRXhjZXB0aW9uIGluIG9uU2VyaWFsaXplIGNhbGxiYWNrOiAiLHQpfXJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlKX19ZnVuY3Rpb24gS3YodCxlKXtjb25zdCBuPXQuZ2V0RWxlbWVudEJ5SWQoZSsiLXN0YXRlIik7bGV0IG89e307aWYobiYmbi50ZXh0Q29udGVudCl0cnl7bz1KU09OLnBhcnNlKChmdW5jdGlvbiBpKHQpe2NvbnN0IGU9eyImYTsiOiImIiwiJnE7IjonIicsIiZzOyI6IiciLCImbDsiOiI8IiwiJmc7IjoiPiJ9O3JldHVybiB0LnJlcGxhY2UoLyZbXjtdKzsvZywodD0+ZVt0XSkpfSkobi50ZXh0Q29udGVudCkpfWNhdGNoKHQpe2NvbnNvbGUud2FybigiRXhjZXB0aW9uIHdoaWxlIHJlc3RvcmluZyBUcmFuc2ZlclN0YXRlIGZvciBhcHAgIitlLHQpfXJldHVybiBYdi5pbml0KG8pfVh2Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxYdil9LFh2Lsm1cHJvdj1Nbih7dG9rZW46WHYsZmFjdG9yeTpYdi7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWHYsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW119KSxudWxsKTtjbGFzcyBKdnt9SnYuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEp2KX0sSnYuybVtb2Q9YW8oe3R5cGU6SnZ9KSxKdi7JtWluaj12bih7cHJvdmlkZXJzOlt7cHJvdmlkZTpYdix1c2VGYWN0b3J5Okt2LGRlcHM6W1pfLEh5XX1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChKdixbe3R5cGU6QXksYXJnczpbe3Byb3ZpZGVyczpbe3Byb3ZpZGU6WHYsdXNlRmFjdG9yeTpLdixkZXBzOltaXyxIeV19XX1dfV0sbnVsbCxudWxsKSwKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpuZXcgT2coIjEyLjIuMSIpO3ZhciBRdj0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O2Z1bmN0aW9uICR2KHQpe2lmKHQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgZT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChmdW5jdGlvbihuKXt2YXIgbz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbik7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbixvLmdldD9vOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0W25dfX0pfSkpLGV9Ci8qKgogICAgICogQGxpY2Vuc2UgQW5ndWxhciB2MTIuMC4wLW5leHQuMAogICAgICogKGMpIDIwMTAtMjAyMCBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vCiAgICAgKiBMaWNlbnNlOiBNSVQKICAgICAqLyEoZnVuY3Rpb24oKXsKLyoqCiAgICAgICAgICogQGxpY2Vuc2UKICAgICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICAgICAqCiAgICAgICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgICAgICovCiEoZnVuY3Rpb24odCl7dmFyIGU9dC5wZXJmb3JtYW5jZTtmdW5jdGlvbiBuKHQpe2UmJmUubWFyayYmZS5tYXJrKHQpfWZ1bmN0aW9uIG8odCxuKXtlJiZlLm1lYXN1cmUmJmUubWVhc3VyZSh0LG4pfW4oIlpvbmUiKTt2YXIgaT10Ll9fWm9uZV9zeW1ib2xfcHJlZml4fHwiX196b25lX3N5bWJvbF9fIjtmdW5jdGlvbiBhKHQpe3JldHVybiBpK3R9dmFyIHI9ITA9PT10W2EoImZvcmNlRHVwbGljYXRlWm9uZUNoZWNrIildO2lmKHQuWm9uZSl7aWYocnx8ImZ1bmN0aW9uIiE9dHlwZW9mIHQuWm9uZS5fX3N5bWJvbF9fKXRocm93IG5ldyBFcnJvcigiWm9uZSBhbHJlYWR5IGxvYWRlZC4iKTtyZXR1cm4gdC5ab25lfXZhciBzPShmdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxlKXt0aGlzLl9wYXJlbnQ9dCx0aGlzLl9uYW1lPWU/ZS5uYW1lfHwidW5uYW1lZCI6Ijxyb290PiIsdGhpcy5fcHJvcGVydGllcz1lJiZlLnByb3BlcnRpZXN8fHt9LHRoaXMuX3pvbmVEZWxlZ2F0ZT1uZXcgZCh0aGlzLHRoaXMuX3BhcmVudCYmdGhpcy5fcGFyZW50Ll96b25lRGVsZWdhdGUsZSl9cmV0dXJuIGUuYXNzZXJ0Wm9uZVBhdGNoZWQ9ZnVuY3Rpb24oKXtpZih0LlByb21pc2UhPT1ELlpvbmVBd2FyZVByb21pc2UpdGhyb3cgbmV3IEVycm9yKCJab25lLmpzIGhhcyBkZXRlY3RlZCB0aGF0IFpvbmVBd2FyZVByb21pc2UgYCh3aW5kb3d8Z2xvYmFsKS5Qcm9taXNlYCBoYXMgYmVlbiBvdmVyd3JpdHRlbi5cbk1vc3QgbGlrZWx5IGNhdXNlIGlzIHRoYXQgYSBQcm9taXNlIHBvbHlmaWxsIGhhcyBiZWVuIGxvYWRlZCBhZnRlciBab25lLmpzIChQb2x5ZmlsbGluZyBQcm9taXNlIGFwaSBpcyBub3QgbmVjZXNzYXJ5IHdoZW4gem9uZS5qcyBpcyBsb2FkZWQuIElmIHlvdSBtdXN0IGxvYWQgb25lLCBkbyBzbyBiZWZvcmUgbG9hZGluZyB6b25lLmpzLikiKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInJvb3QiLHtnZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9ZS5jdXJyZW50O3QucGFyZW50Oyl0PXQucGFyZW50O3JldHVybiB0fSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJjdXJyZW50Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFIuem9uZX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiY3VycmVudFRhc2siLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxlLl9fbG9hZF9wYXRjaD1mdW5jdGlvbihpLGEscyl7aWYodm9pZCAwPT09cyYmKHM9ITEpLEQuaGFzT3duUHJvcGVydHkoaSkpe2lmKCFzJiZyKXRocm93IEVycm9yKCJBbHJlYWR5IGxvYWRlZCBwYXRjaDogIitpKX1lbHNlIGlmKCF0WyJfX1pvbmVfZGlzYWJsZV8iK2ldKXt2YXIgbD0iWm9uZToiK2k7bihsKSxEW2ldPWEodCxlLEUpLG8obCxsKX19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwicGFyZW50Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhcmVudH0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsIm5hbWUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbmFtZX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRab25lV2l0aCh0KTtpZihlKXJldHVybiBlLl9wcm9wZXJ0aWVzW3RdfSxlLnByb3RvdHlwZS5nZXRab25lV2l0aD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcztlOyl7aWYoZS5fcHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSh0KSlyZXR1cm4gZTtlPWUuX3BhcmVudH1yZXR1cm4gbnVsbH0sZS5wcm90b3R5cGUuZm9yaz1mdW5jdGlvbih0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIlpvbmVTcGVjIHJlcXVpcmVkISIpO3JldHVybiB0aGlzLl96b25lRGVsZWdhdGUuZm9yayh0aGlzLHQpfSxlLnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RpbmcgZnVuY3Rpb24gZ290OiAiK3QpO3ZhciBuPXRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnRlcmNlcHQodGhpcyx0LGUpLG89dGhpcztyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gby5ydW5HdWFyZGVkKG4sdGhpcyxhcmd1bWVudHMsZSl9fSxlLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24odCxlLG4sbyl7Uj17cGFyZW50OlIsem9uZTp0aGlzfTt0cnl7cmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnZva2UodGhpcyx0LGUsbixvKX1maW5hbGx5e1I9Ui5wYXJlbnR9fSxlLnByb3RvdHlwZS5ydW5HdWFyZGVkPWZ1bmN0aW9uKHQsZSxuLG8pe3ZvaWQgMD09PWUmJihlPW51bGwpLFI9e3BhcmVudDpSLHpvbmU6dGhpc307dHJ5e3RyeXtyZXR1cm4gdGhpcy5fem9uZURlbGVnYXRlLmludm9rZSh0aGlzLHQsZSxuLG8pfWNhdGNoKHQpe2lmKHRoaXMuX3pvbmVEZWxlZ2F0ZS5oYW5kbGVFcnJvcih0aGlzLHQpKXRocm93IHR9fWZpbmFsbHl7Uj1SLnBhcmVudH19LGUucHJvdG90eXBlLnJ1blRhc2s9ZnVuY3Rpb24odCxlLG4pe2lmKHQuem9uZSE9dGhpcyl0aHJvdyBuZXcgRXJyb3IoIkEgdGFzayBjYW4gb25seSBiZSBydW4gaW4gdGhlIHpvbmUgb2YgY3JlYXRpb24hIChDcmVhdGlvbjogIisodC56b25lfHxfKS5uYW1lKyI7IEV4ZWN1dGlvbjogIit0aGlzLm5hbWUrIikiKTtpZih0LnN0YXRlIT09Q3x8dC50eXBlIT09UyYmdC50eXBlIT09ayl7dmFyIG89dC5zdGF0ZSE9eDtvJiZ0Ll90cmFuc2l0aW9uVG8oeCx2KSx0LnJ1bkNvdW50Kys7dmFyIGk9QTtBPXQsUj17cGFyZW50OlIsem9uZTp0aGlzfTt0cnl7dC50eXBlPT1rJiZ0LmRhdGEmJiF0LmRhdGEuaXNQZXJpb2RpYyYmKHQuY2FuY2VsRm49dm9pZCAwKTt0cnl7cmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnZva2VUYXNrKHRoaXMsdCxlLG4pfWNhdGNoKHQpe2lmKHRoaXMuX3pvbmVEZWxlZ2F0ZS5oYW5kbGVFcnJvcih0aGlzLHQpKXRocm93IHR9fWZpbmFsbHl7dC5zdGF0ZSE9PUMmJnQuc3RhdGUhPT1QJiYodC50eXBlPT1TfHx0LmRhdGEmJnQuZGF0YS5pc1BlcmlvZGljP28mJnQuX3RyYW5zaXRpb25Ubyh2LHgpOih0LnJ1bkNvdW50PTAsdGhpcy5fdXBkYXRlVGFza0NvdW50KHQsLTEpLG8mJnQuX3RyYW5zaXRpb25UbyhDLHgsQykpKSxSPVIucGFyZW50LEE9aX19fSxlLnByb3RvdHlwZS5zY2hlZHVsZVRhc2s9ZnVuY3Rpb24odCl7aWYodC56b25lJiZ0LnpvbmUhPT10aGlzKWZvcih2YXIgZT10aGlzO2U7KXtpZihlPT09dC56b25lKXRocm93IEVycm9yKCJjYW4gbm90IHJlc2NoZWR1bGUgdGFzayB0byAiK3RoaXMubmFtZSsiIHdoaWNoIGlzIGRlc2NlbmRhbnRzIG9mIHRoZSBvcmlnaW5hbCB6b25lICIrdC56b25lLm5hbWUpO2U9ZS5wYXJlbnR9dC5fdHJhbnNpdGlvblRvKE0sQyk7dmFyIG49W107dC5fem9uZURlbGVnYXRlcz1uLHQuX3pvbmU9dGhpczt0cnl7dD10aGlzLl96b25lRGVsZWdhdGUuc2NoZWR1bGVUYXNrKHRoaXMsdCl9Y2F0Y2goZSl7dGhyb3cgdC5fdHJhbnNpdGlvblRvKFAsTSxDKSx0aGlzLl96b25lRGVsZWdhdGUuaGFuZGxlRXJyb3IodGhpcyxlKSxlfXJldHVybiB0Ll96b25lRGVsZWdhdGVzPT09biYmdGhpcy5fdXBkYXRlVGFza0NvdW50KHQsMSksdC5zdGF0ZT09TSYmdC5fdHJhbnNpdGlvblRvKHYsTSksdH0sZS5wcm90b3R5cGUuc2NoZWR1bGVNaWNyb1Rhc2s9ZnVuY3Rpb24odCxlLG4sbyl7cmV0dXJuIHRoaXMuc2NoZWR1bGVUYXNrKG5ldyBwKHcsdCxlLG4sbyx2b2lkIDApKX0sZS5wcm90b3R5cGUuc2NoZWR1bGVNYWNyb1Rhc2s9ZnVuY3Rpb24odCxlLG4sbyxpKXtyZXR1cm4gdGhpcy5zY2hlZHVsZVRhc2sobmV3IHAoayx0LGUsbixvLGkpKX0sZS5wcm90b3R5cGUuc2NoZWR1bGVFdmVudFRhc2s9ZnVuY3Rpb24odCxlLG4sbyxpKXtyZXR1cm4gdGhpcy5zY2hlZHVsZVRhc2sobmV3IHAoUyx0LGUsbixvLGkpKX0sZS5wcm90b3R5cGUuY2FuY2VsVGFzaz1mdW5jdGlvbih0KXtpZih0LnpvbmUhPXRoaXMpdGhyb3cgbmV3IEVycm9yKCJBIHRhc2sgY2FuIG9ubHkgYmUgY2FuY2VsbGVkIGluIHRoZSB6b25lIG9mIGNyZWF0aW9uISAoQ3JlYXRpb246ICIrKHQuem9uZXx8XykubmFtZSsiOyBFeGVjdXRpb246ICIrdGhpcy5uYW1lKyIpIik7dC5fdHJhbnNpdGlvblRvKE8sdix4KTt0cnl7dGhpcy5fem9uZURlbGVnYXRlLmNhbmNlbFRhc2sodGhpcyx0KX1jYXRjaChlKXt0aHJvdyB0Ll90cmFuc2l0aW9uVG8oUCxPKSx0aGlzLl96b25lRGVsZWdhdGUuaGFuZGxlRXJyb3IodGhpcyxlKSxlfXJldHVybiB0aGlzLl91cGRhdGVUYXNrQ291bnQodCwtMSksdC5fdHJhbnNpdGlvblRvKEMsTyksdC5ydW5Db3VudD0wLHR9LGUucHJvdG90eXBlLl91cGRhdGVUYXNrQ291bnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10Ll96b25lRGVsZWdhdGVzOy0xPT1lJiYodC5fem9uZURlbGVnYXRlcz1udWxsKTtmb3IodmFyIG89MDtvPG4ubGVuZ3RoO28rKyluW29dLl91cGRhdGVUYXNrQ291bnQodC50eXBlLGUpfSxlfSkoKTtzLl9fc3ltYm9sX189YTt2YXIgbCxjPXtuYW1lOiIiLG9uSGFzVGFzazpmdW5jdGlvbih0LGUsbixvKXtyZXR1cm4gdC5oYXNUYXNrKG4sbyl9LG9uU2NoZWR1bGVUYXNrOmZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiB0LnNjaGVkdWxlVGFzayhuLG8pfSxvbkludm9rZVRhc2s6ZnVuY3Rpb24odCxlLG4sbyxpLGEpe3JldHVybiB0Lmludm9rZVRhc2sobixvLGksYSl9LG9uQ2FuY2VsVGFzazpmdW5jdGlvbih0LGUsbixvKXtyZXR1cm4gdC5jYW5jZWxUYXNrKG4sbyl9fSxkPShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4pe3RoaXMuX3Rhc2tDb3VudHM9e21pY3JvVGFzazowLG1hY3JvVGFzazowLGV2ZW50VGFzazowfSx0aGlzLnpvbmU9dCx0aGlzLl9wYXJlbnREZWxlZ2F0ZT1lLHRoaXMuX2ZvcmtaUz1uJiYobiYmbi5vbkZvcms/bjplLl9mb3JrWlMpLHRoaXMuX2ZvcmtEbGd0PW4mJihuLm9uRm9yaz9lOmUuX2ZvcmtEbGd0KSx0aGlzLl9mb3JrQ3VyclpvbmU9biYmKG4ub25Gb3JrP3RoaXMuem9uZTplLl9mb3JrQ3VyclpvbmUpLHRoaXMuX2ludGVyY2VwdFpTPW4mJihuLm9uSW50ZXJjZXB0P246ZS5faW50ZXJjZXB0WlMpLHRoaXMuX2ludGVyY2VwdERsZ3Q9biYmKG4ub25JbnRlcmNlcHQ/ZTplLl9pbnRlcmNlcHREbGd0KSx0aGlzLl9pbnRlcmNlcHRDdXJyWm9uZT1uJiYobi5vbkludGVyY2VwdD90aGlzLnpvbmU6ZS5faW50ZXJjZXB0Q3VyclpvbmUpLHRoaXMuX2ludm9rZVpTPW4mJihuLm9uSW52b2tlP246ZS5faW52b2tlWlMpLHRoaXMuX2ludm9rZURsZ3Q9biYmKG4ub25JbnZva2U/ZTplLl9pbnZva2VEbGd0KSx0aGlzLl9pbnZva2VDdXJyWm9uZT1uJiYobi5vbkludm9rZT90aGlzLnpvbmU6ZS5faW52b2tlQ3VyclpvbmUpLHRoaXMuX2hhbmRsZUVycm9yWlM9biYmKG4ub25IYW5kbGVFcnJvcj9uOmUuX2hhbmRsZUVycm9yWlMpLHRoaXMuX2hhbmRsZUVycm9yRGxndD1uJiYobi5vbkhhbmRsZUVycm9yP2U6ZS5faGFuZGxlRXJyb3JEbGd0KSx0aGlzLl9oYW5kbGVFcnJvckN1cnJab25lPW4mJihuLm9uSGFuZGxlRXJyb3I/dGhpcy56b25lOmUuX2hhbmRsZUVycm9yQ3VyclpvbmUpLHRoaXMuX3NjaGVkdWxlVGFza1pTPW4mJihuLm9uU2NoZWR1bGVUYXNrP246ZS5fc2NoZWR1bGVUYXNrWlMpLHRoaXMuX3NjaGVkdWxlVGFza0RsZ3Q9biYmKG4ub25TY2hlZHVsZVRhc2s/ZTplLl9zY2hlZHVsZVRhc2tEbGd0KSx0aGlzLl9zY2hlZHVsZVRhc2tDdXJyWm9uZT1uJiYobi5vblNjaGVkdWxlVGFzaz90aGlzLnpvbmU6ZS5fc2NoZWR1bGVUYXNrQ3VyclpvbmUpLHRoaXMuX2ludm9rZVRhc2taUz1uJiYobi5vbkludm9rZVRhc2s/bjplLl9pbnZva2VUYXNrWlMpLHRoaXMuX2ludm9rZVRhc2tEbGd0PW4mJihuLm9uSW52b2tlVGFzaz9lOmUuX2ludm9rZVRhc2tEbGd0KSx0aGlzLl9pbnZva2VUYXNrQ3VyclpvbmU9biYmKG4ub25JbnZva2VUYXNrP3RoaXMuem9uZTplLl9pbnZva2VUYXNrQ3VyclpvbmUpLHRoaXMuX2NhbmNlbFRhc2taUz1uJiYobi5vbkNhbmNlbFRhc2s/bjplLl9jYW5jZWxUYXNrWlMpLHRoaXMuX2NhbmNlbFRhc2tEbGd0PW4mJihuLm9uQ2FuY2VsVGFzaz9lOmUuX2NhbmNlbFRhc2tEbGd0KSx0aGlzLl9jYW5jZWxUYXNrQ3VyclpvbmU9biYmKG4ub25DYW5jZWxUYXNrP3RoaXMuem9uZTplLl9jYW5jZWxUYXNrQ3VyclpvbmUpLHRoaXMuX2hhc1Rhc2taUz1udWxsLHRoaXMuX2hhc1Rhc2tEbGd0PW51bGwsdGhpcy5faGFzVGFza0RsZ3RPd25lcj1udWxsLHRoaXMuX2hhc1Rhc2tDdXJyWm9uZT1udWxsO3ZhciBvPW4mJm4ub25IYXNUYXNrOyhvfHxlJiZlLl9oYXNUYXNrWlMpJiYodGhpcy5faGFzVGFza1pTPW8/bjpjLHRoaXMuX2hhc1Rhc2tEbGd0PWUsdGhpcy5faGFzVGFza0RsZ3RPd25lcj10aGlzLHRoaXMuX2hhc1Rhc2tDdXJyWm9uZT10LG4ub25TY2hlZHVsZVRhc2t8fCh0aGlzLl9zY2hlZHVsZVRhc2taUz1jLHRoaXMuX3NjaGVkdWxlVGFza0RsZ3Q9ZSx0aGlzLl9zY2hlZHVsZVRhc2tDdXJyWm9uZT10aGlzLnpvbmUpLG4ub25JbnZva2VUYXNrfHwodGhpcy5faW52b2tlVGFza1pTPWMsdGhpcy5faW52b2tlVGFza0RsZ3Q9ZSx0aGlzLl9pbnZva2VUYXNrQ3VyclpvbmU9dGhpcy56b25lKSxuLm9uQ2FuY2VsVGFza3x8KHRoaXMuX2NhbmNlbFRhc2taUz1jLHRoaXMuX2NhbmNlbFRhc2tEbGd0PWUsdGhpcy5fY2FuY2VsVGFza0N1cnJab25lPXRoaXMuem9uZSkpfXJldHVybiB0LnByb3RvdHlwZS5mb3JrPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2ZvcmtaUz90aGlzLl9mb3JrWlMub25Gb3JrKHRoaXMuX2ZvcmtEbGd0LHRoaXMuem9uZSx0LGUpOm5ldyBzKHQsZSl9LHQucHJvdG90eXBlLmludGVyY2VwdD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuX2ludGVyY2VwdFpTP3RoaXMuX2ludGVyY2VwdFpTLm9uSW50ZXJjZXB0KHRoaXMuX2ludGVyY2VwdERsZ3QsdGhpcy5faW50ZXJjZXB0Q3VyclpvbmUsdCxlLG4pOmV9LHQucHJvdG90eXBlLmludm9rZT1mdW5jdGlvbih0LGUsbixvLGkpe3JldHVybiB0aGlzLl9pbnZva2VaUz90aGlzLl9pbnZva2VaUy5vbkludm9rZSh0aGlzLl9pbnZva2VEbGd0LHRoaXMuX2ludm9rZUN1cnJab25lLHQsZSxuLG8saSk6ZS5hcHBseShuLG8pfSx0LnByb3RvdHlwZS5oYW5kbGVFcnJvcj1mdW5jdGlvbih0LGUpe3JldHVybiF0aGlzLl9oYW5kbGVFcnJvclpTfHx0aGlzLl9oYW5kbGVFcnJvclpTLm9uSGFuZGxlRXJyb3IodGhpcy5faGFuZGxlRXJyb3JEbGd0LHRoaXMuX2hhbmRsZUVycm9yQ3VyclpvbmUsdCxlKX0sdC5wcm90b3R5cGUuc2NoZWR1bGVUYXNrPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZTtpZih0aGlzLl9zY2hlZHVsZVRhc2taUyl0aGlzLl9oYXNUYXNrWlMmJm4uX3pvbmVEZWxlZ2F0ZXMucHVzaCh0aGlzLl9oYXNUYXNrRGxndE93bmVyKSwobj10aGlzLl9zY2hlZHVsZVRhc2taUy5vblNjaGVkdWxlVGFzayh0aGlzLl9zY2hlZHVsZVRhc2tEbGd0LHRoaXMuX3NjaGVkdWxlVGFza0N1cnJab25lLHQsZSkpfHwobj1lKTtlbHNlIGlmKGUuc2NoZWR1bGVGbillLnNjaGVkdWxlRm4oZSk7ZWxzZXtpZihlLnR5cGUhPXcpdGhyb3cgbmV3IEVycm9yKCJUYXNrIGlzIG1pc3Npbmcgc2NoZWR1bGVGbi4iKTtiKGUpfXJldHVybiBufSx0LnByb3RvdHlwZS5pbnZva2VUYXNrPWZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiB0aGlzLl9pbnZva2VUYXNrWlM/dGhpcy5faW52b2tlVGFza1pTLm9uSW52b2tlVGFzayh0aGlzLl9pbnZva2VUYXNrRGxndCx0aGlzLl9pbnZva2VUYXNrQ3VyclpvbmUsdCxlLG4sbyk6ZS5jYWxsYmFjay5hcHBseShuLG8pfSx0LnByb3RvdHlwZS5jYW5jZWxUYXNrPWZ1bmN0aW9uKHQsZSl7dmFyIG47aWYodGhpcy5fY2FuY2VsVGFza1pTKW49dGhpcy5fY2FuY2VsVGFza1pTLm9uQ2FuY2VsVGFzayh0aGlzLl9jYW5jZWxUYXNrRGxndCx0aGlzLl9jYW5jZWxUYXNrQ3VyclpvbmUsdCxlKTtlbHNle2lmKCFlLmNhbmNlbEZuKXRocm93IEVycm9yKCJUYXNrIGlzIG5vdCBjYW5jZWxhYmxlIik7bj1lLmNhbmNlbEZuKGUpfXJldHVybiBufSx0LnByb3RvdHlwZS5oYXNUYXNrPWZ1bmN0aW9uKHQsZSl7dHJ5e3RoaXMuX2hhc1Rhc2taUyYmdGhpcy5faGFzVGFza1pTLm9uSGFzVGFzayh0aGlzLl9oYXNUYXNrRGxndCx0aGlzLl9oYXNUYXNrQ3VyclpvbmUsdCxlKX1jYXRjaChlKXt0aGlzLmhhbmRsZUVycm9yKHQsZSl9fSx0LnByb3RvdHlwZS5fdXBkYXRlVGFza0NvdW50PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fdGFza0NvdW50cyxvPW5bdF0saT1uW3RdPW8rZTtpZihpPDApdGhyb3cgbmV3IEVycm9yKCJNb3JlIHRhc2tzIGV4ZWN1dGVkIHRoZW4gd2VyZSBzY2hlZHVsZWQuIik7MCE9byYmMCE9aXx8dGhpcy5oYXNUYXNrKHRoaXMuem9uZSx7bWljcm9UYXNrOm4ubWljcm9UYXNrPjAsbWFjcm9UYXNrOm4ubWFjcm9UYXNrPjAsZXZlbnRUYXNrOm4uZXZlbnRUYXNrPjAsY2hhbmdlOnR9KX0sdH0pKCkscD0oZnVuY3Rpb24oKXtmdW5jdGlvbiBlKG4sbyxpLGEscixzKXtpZih0aGlzLl96b25lPW51bGwsdGhpcy5ydW5Db3VudD0wLHRoaXMuX3pvbmVEZWxlZ2F0ZXM9bnVsbCx0aGlzLl9zdGF0ZT0ibm90U2NoZWR1bGVkIix0aGlzLnR5cGU9bix0aGlzLnNvdXJjZT1vLHRoaXMuZGF0YT1hLHRoaXMuc2NoZWR1bGVGbj1yLHRoaXMuY2FuY2VsRm49cywhaSl0aHJvdyBuZXcgRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBkZWZpbmVkIik7dGhpcy5jYWxsYmFjaz1pO3ZhciBsPXRoaXM7dGhpcy5pbnZva2U9bj09PVMmJmEmJmEudXNlRz9lLmludm9rZVRhc2s6ZnVuY3Rpb24oKXtyZXR1cm4gZS5pbnZva2VUYXNrLmNhbGwodCxsLHRoaXMsYXJndW1lbnRzKX19cmV0dXJuIGUuaW52b2tlVGFzaz1mdW5jdGlvbih0LGUsbil7dHx8KHQ9dGhpcyksVCsrO3RyeXtyZXR1cm4gdC5ydW5Db3VudCsrLHQuem9uZS5ydW5UYXNrKHQsZSxuKX1maW5hbGx5ezE9PVQmJnkoKSxULS19fSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInpvbmUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fem9uZX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInN0YXRlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N0YXRlfSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmNhbmNlbFNjaGVkdWxlUmVxdWVzdD1mdW5jdGlvbigpe3RoaXMuX3RyYW5zaXRpb25UbyhDLE0pfSxlLnByb3RvdHlwZS5fdHJhbnNpdGlvblRvPWZ1bmN0aW9uKHQsZSxuKXtpZih0aGlzLl9zdGF0ZSE9PWUmJnRoaXMuX3N0YXRlIT09bil0aHJvdyBuZXcgRXJyb3IodGhpcy50eXBlKyIgJyIrdGhpcy5zb3VyY2UrIic6IGNhbiBub3QgdHJhbnNpdGlvbiB0byAnIit0KyInLCBleHBlY3Rpbmcgc3RhdGUgJyIrZSsiJyIrKG4/IiBvciAnIituKyInIjoiIikrIiwgd2FzICciK3RoaXMuX3N0YXRlKyInLiIpO3RoaXMuX3N0YXRlPXQsdD09QyYmKHRoaXMuX3pvbmVEZWxlZ2F0ZXM9bnVsbCl9LGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YSYmdm9pZCAwIT09dGhpcy5kYXRhLmhhbmRsZUlkP3RoaXMuZGF0YS5oYW5kbGVJZC50b1N0cmluZygpOk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6dGhpcy50eXBlLHN0YXRlOnRoaXMuc3RhdGUsc291cmNlOnRoaXMuc291cmNlLHpvbmU6dGhpcy56b25lLm5hbWUscnVuQ291bnQ6dGhpcy5ydW5Db3VudH19LGV9KSgpLG09YSgic2V0VGltZW91dCIpLHU9YSgiUHJvbWlzZSIpLGY9YSgidGhlbiIpLGc9W10saD0hMTtmdW5jdGlvbiBiKGUpe2lmKDA9PT1UJiYwPT09Zy5sZW5ndGgpaWYobHx8dFt1XSYmKGw9dFt1XS5yZXNvbHZlKDApKSxsKXt2YXIgbj1sW2ZdO258fChuPWwudGhlbiksbi5jYWxsKGwseSl9ZWxzZSB0W21dKHksMCk7ZSYmZy5wdXNoKGUpfWZ1bmN0aW9uIHkoKXtpZighaCl7Zm9yKGg9ITA7Zy5sZW5ndGg7KXt2YXIgdD1nO2c9W107Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspe3ZhciBuPXRbZV07dHJ5e24uem9uZS5ydW5UYXNrKG4sbnVsbCxudWxsKX1jYXRjaCh0KXtFLm9uVW5oYW5kbGVkRXJyb3IodCl9fX1FLm1pY3JvdGFza0RyYWluRG9uZSgpLGg9ITF9fXZhciBfPXtuYW1lOiJOTyBaT05FIn0sQz0ibm90U2NoZWR1bGVkIixNPSJzY2hlZHVsaW5nIix2PSJzY2hlZHVsZWQiLHg9InJ1bm5pbmciLE89ImNhbmNlbGluZyIsUD0idW5rbm93biIsdz0ibWljcm9UYXNrIixrPSJtYWNyb1Rhc2siLFM9ImV2ZW50VGFzayIsRD17fSxFPXtzeW1ib2w6YSxjdXJyZW50Wm9uZUZyYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIFJ9LG9uVW5oYW5kbGVkRXJyb3I6TixtaWNyb3Rhc2tEcmFpbkRvbmU6TixzY2hlZHVsZU1pY3JvVGFzazpiLHNob3dVbmNhdWdodEVycm9yOmZ1bmN0aW9uKCl7cmV0dXJuIXNbYSgiaWdub3JlQ29uc29sZUVycm9yVW5jYXVnaHRFcnJvciIpXX0scGF0Y2hFdmVudFRhcmdldDpmdW5jdGlvbigpe3JldHVybltdfSxwYXRjaE9uUHJvcGVydGllczpOLHBhdGNoTWV0aG9kOmZ1bmN0aW9uKCl7cmV0dXJuIE59LGJpbmRBcmd1bWVudHM6ZnVuY3Rpb24oKXtyZXR1cm5bXX0scGF0Y2hUaGVuOmZ1bmN0aW9uKCl7cmV0dXJuIE59LHBhdGNoTWFjcm9UYXNrOmZ1bmN0aW9uKCl7cmV0dXJuIE59LHBhdGNoRXZlbnRQcm90b3R5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gTn0saXNJRU9yRWRnZTpmdW5jdGlvbigpe3JldHVybiExfSxnZXRHbG9iYWxPYmplY3RzOmZ1bmN0aW9uKCl7fSxPYmplY3REZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbigpe3JldHVybiBOfSxPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ZnVuY3Rpb24oKXt9LE9iamVjdENyZWF0ZTpmdW5jdGlvbigpe30sQXJyYXlTbGljZTpmdW5jdGlvbigpe3JldHVybltdfSxwYXRjaENsYXNzOmZ1bmN0aW9uKCl7cmV0dXJuIE59LHdyYXBXaXRoQ3VycmVudFpvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gTn0sZmlsdGVyUHJvcGVydGllczpmdW5jdGlvbigpe3JldHVybltdfSxhdHRhY2hPcmlnaW5Ub1BhdGNoZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gTn0sX3JlZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oKXtyZXR1cm4gTn0scGF0Y2hDYWxsYmFja3M6ZnVuY3Rpb24oKXtyZXR1cm4gTn19LFI9e3BhcmVudDpudWxsLHpvbmU6bmV3IHMobnVsbCxudWxsKX0sQT1udWxsLFQ9MDtmdW5jdGlvbiBOKCl7fW8oIlpvbmUiLCJab25lIiksdC5ab25lPXN9KSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93fHwidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYmJnNlbGZ8fFF2KTsKLyoqCiAgICAgICAgICogQGxpY2Vuc2UKICAgICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICAgICAqCiAgICAgICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgICAgICovCnZhciB0PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsZT1PYmplY3QuZGVmaW5lUHJvcGVydHksbj1PYmplY3QuZ2V0UHJvdG90eXBlT2Ysbz1PYmplY3QuY3JlYXRlLGk9QXJyYXkucHJvdG90eXBlLnNsaWNlLGE9ImFkZEV2ZW50TGlzdGVuZXIiLHI9InJlbW92ZUV2ZW50TGlzdGVuZXIiLHM9Wm9uZS5fX3N5bWJvbF9fKGEpLGw9Wm9uZS5fX3N5bWJvbF9fKHIpLGM9InRydWUiLGQ9ImZhbHNlIixwPVpvbmUuX19zeW1ib2xfXygiIik7ZnVuY3Rpb24gbSh0LGUpe3JldHVybiBab25lLmN1cnJlbnQud3JhcCh0LGUpfWZ1bmN0aW9uIHUodCxlLG4sbyxpKXtyZXR1cm4gWm9uZS5jdXJyZW50LnNjaGVkdWxlTWFjcm9UYXNrKHQsZSxuLG8saSl9dmFyIGY9Wm9uZS5fX3N5bWJvbF9fLGc9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3csaD1nP3dpbmRvdzp2b2lkIDAsYj1nJiZofHwib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGZ8fFF2LHk9W251bGxdO2Z1bmN0aW9uIF8odCxlKXtmb3IodmFyIG49dC5sZW5ndGgtMTtuPj0wO24tLSkiZnVuY3Rpb24iPT10eXBlb2YgdFtuXSYmKHRbbl09bSh0W25dLGUrIl8iK24pKTtyZXR1cm4gdH1mdW5jdGlvbiBDKHQpe3JldHVybiF0fHwhMSE9PXQud3JpdGFibGUmJiEoImZ1bmN0aW9uIj09dHlwZW9mIHQuZ2V0JiZ2b2lkIDA9PT10LnNldCl9dmFyIE09InVuZGVmaW5lZCIhPXR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlLHY9ISgibnciaW4gYikmJnZvaWQgMCE9PWIucHJvY2VzcyYmIltvYmplY3QgcHJvY2Vzc10iPT09e30udG9TdHJpbmcuY2FsbChiLnByb2Nlc3MpLHg9IXYmJiFNJiYhKCFnfHwhaC5IVE1MRWxlbWVudCksTz12b2lkIDAhPT1iLnByb2Nlc3MmJiJbb2JqZWN0IHByb2Nlc3NdIj09PXt9LnRvU3RyaW5nLmNhbGwoYi5wcm9jZXNzKSYmIU0mJiEoIWd8fCFoLkhUTUxFbGVtZW50KSxQPXt9LHc9ZnVuY3Rpb24odCl7aWYodD10fHxiLmV2ZW50KXt2YXIgZT1QW3QudHlwZV07ZXx8KGU9UFt0LnR5cGVdPWYoIk9OX1BST1BFUlRZIit0LnR5cGUpKTt2YXIgbixvPXRoaXN8fHQudGFyZ2V0fHxiLGk9b1tlXTtyZXR1cm4geCYmbz09PWgmJiJlcnJvciI9PT10LnR5cGU/ITA9PT0obj1pJiZpLmNhbGwodGhpcyx0Lm1lc3NhZ2UsdC5maWxlbmFtZSx0LmxpbmVubyx0LmNvbG5vLHQuZXJyb3IpKSYmdC5wcmV2ZW50RGVmYXVsdCgpOm51bGw9PShuPWkmJmkuYXBwbHkodGhpcyxhcmd1bWVudHMpKXx8bnx8dC5wcmV2ZW50RGVmYXVsdCgpLG59fTtmdW5jdGlvbiBrKG4sbyxpKXt2YXIgYT10KG4sbyk7aWYoIWEmJmkmJnQoaSxvKSYmKGE9e2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksYSYmYS5jb25maWd1cmFibGUpe3ZhciByPWYoIm9uIitvKyJwYXRjaGVkIik7aWYoIW4uaGFzT3duUHJvcGVydHkocil8fCFuW3JdKXtkZWxldGUgYS53cml0YWJsZSxkZWxldGUgYS52YWx1ZTt2YXIgcz1hLmdldCxsPWEuc2V0LGM9by5zdWJzdHIoMiksZD1QW2NdO2R8fChkPVBbY109ZigiT05fUFJPUEVSVFkiK2MpKSxhLnNldD1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2V8fG4hPT1ifHwoZT1iKSxlJiYoZVtkXSYmZS5yZW1vdmVFdmVudExpc3RlbmVyKGMsdyksbCYmbC5hcHBseShlLHkpLCJmdW5jdGlvbiI9PXR5cGVvZiB0PyhlW2RdPXQsZS5hZGRFdmVudExpc3RlbmVyKGMsdywhMSkpOmVbZF09bnVsbCl9LGEuZ2V0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZih0fHxuIT09Ynx8KHQ9YiksIXQpcmV0dXJuIG51bGw7dmFyIGU9dFtkXTtpZihlKXJldHVybiBlO2lmKHMpe3ZhciBpPXMmJnMuY2FsbCh0aGlzKTtpZihpKXJldHVybiBhLnNldC5jYWxsKHRoaXMsaSksImZ1bmN0aW9uIj09dHlwZW9mIHQucmVtb3ZlQXR0cmlidXRlJiZ0LnJlbW92ZUF0dHJpYnV0ZShvKSxpfXJldHVybiBudWxsfSxlKG4sbyxhKSxuW3JdPSEwfX19ZnVuY3Rpb24gUyh0LGUsbil7aWYoZSlmb3IodmFyIG89MDtvPGUubGVuZ3RoO28rKylrKHQsIm9uIitlW29dLG4pO2Vsc2V7dmFyIGk9W107Zm9yKHZhciBhIGluIHQpIm9uIj09YS5zdWJzdHIoMCwyKSYmaS5wdXNoKGEpO2Zvcih2YXIgcj0wO3I8aS5sZW5ndGg7cisrKWsodCxpW3JdLG4pfX12YXIgRD1mKCJvcmlnaW5hbEluc3RhbmNlIik7ZnVuY3Rpb24gRSh0KXt2YXIgbj1iW3RdO2lmKG4pe2JbZih0KV09bixiW3RdPWZ1bmN0aW9uKCl7dmFyIGU9Xyhhcmd1bWVudHMsdCk7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDA6dGhpc1tEXT1uZXcgbjticmVhaztjYXNlIDE6dGhpc1tEXT1uZXcgbihlWzBdKTticmVhaztjYXNlIDI6dGhpc1tEXT1uZXcgbihlWzBdLGVbMV0pO2JyZWFrO2Nhc2UgMzp0aGlzW0RdPW5ldyBuKGVbMF0sZVsxXSxlWzJdKTticmVhaztjYXNlIDQ6dGhpc1tEXT1uZXcgbihlWzBdLGVbMV0sZVsyXSxlWzNdKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiQXJnIGxpc3QgdG9vIGxvbmcuIil9fSxUKGJbdF0sbik7dmFyIG8saT1uZXcgbigoZnVuY3Rpb24oKXt9KSk7Zm9yKG8gaW4gaSkiWE1MSHR0cFJlcXVlc3QiPT09dCYmInJlc3BvbnNlQmxvYiI9PT1vfHwoZnVuY3Rpb24obil7ImZ1bmN0aW9uIj09dHlwZW9mIGlbbl0/Ylt0XS5wcm90b3R5cGVbbl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tEXVtuXS5hcHBseSh0aGlzW0RdLGFyZ3VtZW50cyl9OmUoYlt0XS5wcm90b3R5cGUsbix7c2V0OmZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlPyh0aGlzW0RdW25dPW0oZSx0KyIuIituKSxUKHRoaXNbRF1bbl0sZSkpOnRoaXNbRF1bbl09ZX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbRF1bbl19fSl9KShvKTtmb3IobyBpbiBuKSJwcm90b3R5cGUiIT09byYmbi5oYXNPd25Qcm9wZXJ0eShvKSYmKGJbdF1bb109bltvXSl9fWZ1bmN0aW9uIFIoZSxvLGkpe2Zvcih2YXIgYT1lO2EmJiFhLmhhc093blByb3BlcnR5KG8pOylhPW4oYSk7IWEmJmVbb10mJihhPWUpO3ZhciByPWYobykscz1udWxsO2lmKGEmJighKHM9YVtyXSl8fCFhLmhhc093blByb3BlcnR5KHIpKSYmKHM9YVtyXT1hW29dLEMoYSYmdChhLG8pKSkpe3ZhciBsPWkocyxyLG8pO2Fbb109ZnVuY3Rpb24oKXtyZXR1cm4gbCh0aGlzLGFyZ3VtZW50cyl9LFQoYVtvXSxzKX1yZXR1cm4gc31mdW5jdGlvbiBBKHQsZSxuKXt2YXIgbz1udWxsO2Z1bmN0aW9uIGkodCl7dmFyIGU9dC5kYXRhO3JldHVybiBlLmFyZ3NbZS5jYklkeF09ZnVuY3Rpb24oKXt0Lmludm9rZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG8uYXBwbHkoZS50YXJnZXQsZS5hcmdzKSx0fW89Uih0LGUsKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG8pe3ZhciBhPW4oZSxvKTtyZXR1cm4gYS5jYklkeD49MCYmImZ1bmN0aW9uIj09dHlwZW9mIG9bYS5jYklkeF0/dShhLm5hbWUsb1thLmNiSWR4XSxhLGkpOnQuYXBwbHkoZSxvKX19KSl9ZnVuY3Rpb24gVCh0LGUpe3RbZigiT3JpZ2luYWxEZWxlZ2F0ZSIpXT1lfXZhciBOPSExLHo9ITE7ZnVuY3Rpb24gSSgpe2lmKE4pcmV0dXJuIHo7Tj0hMDt0cnl7dmFyIHQ9aC5uYXZpZ2F0b3IudXNlckFnZW50Oy0xPT09dC5pbmRleE9mKCJNU0lFICIpJiYtMT09PXQuaW5kZXhPZigiVHJpZGVudC8iKSYmLTE9PT10LmluZGV4T2YoIkVkZ2UvIil8fCh6PSEwKX1jYXRjaCh0KXt9cmV0dXJuIHp9Ci8qKgogICAgICAgICAqIEBsaWNlbnNlCiAgICAgICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAgICAgKgogICAgICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICAgICAqL1pvbmUuX19sb2FkX3BhdGNoKCJab25lQXdhcmVQcm9taXNlIiwoZnVuY3Rpb24odCxlLG4pe3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsaT1PYmplY3QuZGVmaW5lUHJvcGVydHksYT1uLnN5bWJvbCxyPVtdLHM9ITA9PT10W2EoIkRJU0FCTEVfV1JBUFBJTkdfVU5DQVVHSFRfUFJPTUlTRV9SRUpFQ1RJT04iKV0sbD1hKCJQcm9taXNlIiksYz1hKCJ0aGVuIik7bi5vblVuaGFuZGxlZEVycm9yPWZ1bmN0aW9uKHQpe2lmKG4uc2hvd1VuY2F1Z2h0RXJyb3IoKSl7dmFyIGU9dCYmdC5yZWplY3Rpb247ZT9jb25zb2xlLmVycm9yKCJVbmhhbmRsZWQgUHJvbWlzZSByZWplY3Rpb246IixlIGluc3RhbmNlb2YgRXJyb3I/ZS5tZXNzYWdlOmUsIjsgWm9uZToiLHQuem9uZS5uYW1lLCI7IFRhc2s6Iix0LnRhc2smJnQudGFzay5zb3VyY2UsIjsgVmFsdWU6IixlLGUgaW5zdGFuY2VvZiBFcnJvcj9lLnN0YWNrOnZvaWQgMCk6Y29uc29sZS5lcnJvcih0KX19LG4ubWljcm90YXNrRHJhaW5Eb25lPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PWZ1bmN0aW9uKCl7dmFyIHQ9ci5zaGlmdCgpO3RyeXt0LnpvbmUucnVuR3VhcmRlZCgoZnVuY3Rpb24oKXtpZih0LnRocm93T3JpZ2luYWwpdGhyb3cgdC5yZWplY3Rpb247dGhyb3cgdH0pKX1jYXRjaCh0KXshKGZ1bmN0aW9uIG8odCl7bi5vblVuaGFuZGxlZEVycm9yKHQpO3RyeXt2YXIgbz1lW2RdOyJmdW5jdGlvbiI9PXR5cGVvZiBvJiZvLmNhbGwodGhpcyx0KX1jYXRjaCh0KXt9fSkodCl9fTtyLmxlbmd0aDspdCgpfTt2YXIgZD1hKCJ1bmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uSGFuZGxlciIpO2Z1bmN0aW9uIHAodCl7cmV0dXJuIHQmJnQudGhlbn1mdW5jdGlvbiBtKHQpe3JldHVybiB0fWZ1bmN0aW9uIHUodCl7cmV0dXJuIEQucmVqZWN0KHQpfXZhciBmPWEoInN0YXRlIiksZz1hKCJ2YWx1ZSIpLGg9YSgiZmluYWxseSIpLGI9YSgicGFyZW50UHJvbWlzZVZhbHVlIikseT1hKCJwYXJlbnRQcm9taXNlU3RhdGUiKSxfPW51bGwsQz0hMCxNPSExO2Z1bmN0aW9uIHYodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dHJ5e08odCxlLG4pfWNhdGNoKGUpe08odCwhMSxlKX19fXZhciB4PWEoImN1cnJlbnRUYXNrVHJhY2UiKTtmdW5jdGlvbiBPKHQsbyxhKXt2YXIgbCxjPShsPSExLGZ1bmN0aW9uIHQoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7bHx8KGw9ITAsZS5hcHBseShudWxsLGFyZ3VtZW50cykpfX0pO2lmKHQ9PT1hKXRocm93IG5ldyBUeXBlRXJyb3IoIlByb21pc2UgcmVzb2x2ZWQgd2l0aCBpdHNlbGYiKTtpZih0W2ZdPT09Xyl7dmFyIGQ9bnVsbDt0cnl7Im9iamVjdCIhPXR5cGVvZiBhJiYiZnVuY3Rpb24iIT10eXBlb2YgYXx8KGQ9YSYmYS50aGVuKX1jYXRjaChlKXtyZXR1cm4gYygoZnVuY3Rpb24oKXtPKHQsITEsZSl9KSkoKSx0fWlmKG8hPT1NJiZhIGluc3RhbmNlb2YgRCYmYS5oYXNPd25Qcm9wZXJ0eShmKSYmYS5oYXNPd25Qcm9wZXJ0eShnKSYmYVtmXSE9PV8pdyhhKSxPKHQsYVtmXSxhW2ddKTtlbHNlIGlmKG8hPT1NJiYiZnVuY3Rpb24iPT10eXBlb2YgZCl0cnl7ZC5jYWxsKGEsYyh2KHQsbykpLGModih0LCExKSkpfWNhdGNoKGUpe2MoKGZ1bmN0aW9uKCl7Tyh0LCExLGUpfSkpKCl9ZWxzZXt0W2ZdPW87dmFyIHA9dFtnXTtpZih0W2ddPWEsdFtoXT09PWgmJm89PT1DJiYodFtmXT10W3ldLHRbZ109dFtiXSksbz09PU0mJmEgaW5zdGFuY2VvZiBFcnJvcil7dmFyIG09ZS5jdXJyZW50VGFzayYmZS5jdXJyZW50VGFzay5kYXRhJiZlLmN1cnJlbnRUYXNrLmRhdGEuX19jcmVhdGlvblRyYWNlX187bSYmaShhLHgse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLHZhbHVlOm19KX1mb3IodmFyIHU9MDt1PHAubGVuZ3RoOylrKHQscFt1KytdLHBbdSsrXSxwW3UrK10scFt1KytdKTtpZigwPT1wLmxlbmd0aCYmbz09TSl7dFtmXT0wO3ZhciBQPWE7dHJ5e3Rocm93IG5ldyBFcnJvcigiVW5jYXVnaHQgKGluIHByb21pc2UpOiAiKyhmdW5jdGlvbiBTKHQpe3JldHVybiB0JiZ0LnRvU3RyaW5nPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZz8odC5jb25zdHJ1Y3RvciYmdC5jb25zdHJ1Y3Rvci5uYW1lfHwiIikrIjogIitKU09OLnN0cmluZ2lmeSh0KTp0P3QudG9TdHJpbmcoKTpPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KShhKSsoYSYmYS5zdGFjaz8iXG4iK2Euc3RhY2s6IiIpKX1jYXRjaCh0KXtQPXR9cyYmKFAudGhyb3dPcmlnaW5hbD0hMCksUC5yZWplY3Rpb249YSxQLnByb21pc2U9dCxQLnpvbmU9ZS5jdXJyZW50LFAudGFzaz1lLmN1cnJlbnRUYXNrLHIucHVzaChQKSxuLnNjaGVkdWxlTWljcm9UYXNrKCl9fX1yZXR1cm4gdH12YXIgUD1hKCJyZWplY3Rpb25IYW5kbGVkSGFuZGxlciIpO2Z1bmN0aW9uIHcodCl7aWYoMD09PXRbZl0pe3RyeXt2YXIgbj1lW1BdO24mJiJmdW5jdGlvbiI9PXR5cGVvZiBuJiZuLmNhbGwodGhpcyx7cmVqZWN0aW9uOnRbZ10scHJvbWlzZTp0fSl9Y2F0Y2godCl7fXRbZl09TTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKyl0PT09cltvXS5wcm9taXNlJiZyLnNwbGljZShvLDEpfX1mdW5jdGlvbiBrKHQsZSxuLG8saSl7dyh0KTt2YXIgYT10W2ZdLHI9YT8iZnVuY3Rpb24iPT10eXBlb2Ygbz9vOm06ImZ1bmN0aW9uIj09dHlwZW9mIGk/aTp1O2Uuc2NoZWR1bGVNaWNyb1Rhc2soIlByb21pc2UudGhlbiIsKGZ1bmN0aW9uKCl7dHJ5e3ZhciBvPXRbZ10saT0hIW4mJmg9PT1uW2hdO2kmJihuW2JdPW8sblt5XT1hKTt2YXIgcz1lLnJ1bihyLHZvaWQgMCxpJiZyIT09dSYmciE9PW0/W106W29dKTtPKG4sITAscyl9Y2F0Y2godCl7TyhuLCExLHQpfX0pLG4pfXZhciBTPWZ1bmN0aW9uKCl7fSxEPShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dmFyIG49dGhpcztpZighKG4gaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgRXJyb3IoIk11c3QgYmUgYW4gaW5zdGFuY2VvZiBQcm9taXNlLiIpO25bZl09XyxuW2ddPVtdO3RyeXtlJiZlKHYobixDKSx2KG4sTSkpfWNhdGNoKHQpe08obiwhMSx0KX19cmV0dXJuIHQudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24gWm9uZUF3YXJlUHJvbWlzZSgpIHsgW25hdGl2ZSBjb2RlXSB9In0sdC5yZXNvbHZlPWZ1bmN0aW9uKHQpe3JldHVybiBPKG5ldyB0aGlzKG51bGwpLEMsdCl9LHQucmVqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBPKG5ldyB0aGlzKG51bGwpLE0sdCl9LHQucmFjZT1mdW5jdGlvbih0KXt2YXIgZSxuLG89bmV3IHRoaXMoKGZ1bmN0aW9uKHQsbyl7ZT10LG49b30pKTtmdW5jdGlvbiBpKHQpe2UodCl9ZnVuY3Rpb24gYSh0KXtuKHQpfWZvcih2YXIgcj0wLHM9dDtyPHMubGVuZ3RoO3IrKyl7dmFyIGw9c1tyXTtwKGwpfHwobD10aGlzLnJlc29sdmUobCkpLGwudGhlbihpLGEpfXJldHVybiBvfSx0LmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gdC5hbGxXaXRoQ2FsbGJhY2soZSl9LHQuYWxsU2V0dGxlZD1mdW5jdGlvbihlKXtyZXR1cm4odGhpcyYmdGhpcy5wcm90b3R5cGUgaW5zdGFuY2VvZiB0P3RoaXM6dCkuYWxsV2l0aENhbGxiYWNrKGUse3RoZW5DYWxsYmFjazpmdW5jdGlvbih0KXtyZXR1cm57c3RhdHVzOiJmdWxmaWxsZWQiLHZhbHVlOnR9fSxlcnJvckNhbGxiYWNrOmZ1bmN0aW9uKHQpe3JldHVybntzdGF0dXM6InJlamVjdGVkIixyZWFzb246dH19fSl9LHQuYWxsV2l0aENhbGxiYWNrPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLG8saT1uZXcgdGhpcygoZnVuY3Rpb24odCxlKXtuPXQsbz1lfSkpLGE9MixyPTAscz1bXSxsPWZ1bmN0aW9uKHQpe3AodCl8fCh0PWMucmVzb2x2ZSh0KSk7dmFyIGk9cjt0cnl7dC50aGVuKChmdW5jdGlvbih0KXtzW2ldPWU/ZS50aGVuQ2FsbGJhY2sodCk6dCwwPT0tLWEmJm4ocyl9KSwoZnVuY3Rpb24odCl7ZT8oc1tpXT1lLmVycm9yQ2FsbGJhY2sodCksMD09LS1hJiZuKHMpKTpvKHQpfSkpfWNhdGNoKHQpe28odCl9YSsrLHIrK30sYz10aGlzLGQ9MCxtPXQ7ZDxtLmxlbmd0aDtkKyspbChtW2RdKTtyZXR1cm4gMD09KGEtPTIpJiZuKHMpLGl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxTeW1ib2wudG9TdHJpbmdUYWcse2dldDpmdW5jdGlvbigpe3JldHVybiJQcm9taXNlIn0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsU3ltYm9sLnNwZWNpZXMse2dldDpmdW5jdGlvbigpe3JldHVybiB0fSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24obixvKXt2YXIgaT10aGlzLmNvbnN0cnVjdG9yW1N5bWJvbC5zcGVjaWVzXTtpJiYiZnVuY3Rpb24iPT10eXBlb2YgaXx8KGk9dGhpcy5jb25zdHJ1Y3Rvcnx8dCk7dmFyIGE9bmV3IGkoUykscj1lLmN1cnJlbnQ7cmV0dXJuIHRoaXNbZl09PV8/dGhpc1tnXS5wdXNoKHIsYSxuLG8pOmsodGhpcyxyLGEsbixvKSxhfSx0LnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aGVuKG51bGwsdCl9LHQucHJvdG90eXBlLmZpbmFsbHk9ZnVuY3Rpb24obil7dmFyIG89dGhpcy5jb25zdHJ1Y3RvcltTeW1ib2wuc3BlY2llc107byYmImZ1bmN0aW9uIj09dHlwZW9mIG98fChvPXQpO3ZhciBpPW5ldyBvKFMpO2lbaF09aDt2YXIgYT1lLmN1cnJlbnQ7cmV0dXJuIHRoaXNbZl09PV8/dGhpc1tnXS5wdXNoKGEsaSxuLG4pOmsodGhpcyxhLGksbixuKSxpfSx0fSkoKTtELnJlc29sdmU9RC5yZXNvbHZlLEQucmVqZWN0PUQucmVqZWN0LEQucmFjZT1ELnJhY2UsRC5hbGw9RC5hbGw7dmFyIEU9dFtsXT10LlByb21pc2U7dC5Qcm9taXNlPUQ7dmFyIEE9YSgidGhlblBhdGNoZWQiKTtmdW5jdGlvbiBUKHQpe3ZhciBlPXQucHJvdG90eXBlLG49byhlLCJ0aGVuIik7aWYoIW58fCExIT09bi53cml0YWJsZSYmbi5jb25maWd1cmFibGUpe3ZhciBpPWUudGhlbjtlW2NdPWksdC5wcm90b3R5cGUudGhlbj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7cmV0dXJuIG5ldyBEKChmdW5jdGlvbih0LGUpe2kuY2FsbChuLHQsZSl9KSkudGhlbih0LGUpfSx0W0FdPSEwfX1yZXR1cm4gbi5wYXRjaFRoZW49VCxFJiYoVChFKSxSKHQsImZldGNoIiwoZnVuY3Rpb24odCl7cmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIG89dC5hcHBseShlLG4pO2lmKG8gaW5zdGFuY2VvZiBEKXJldHVybiBvO3ZhciBpPW8uY29uc3RydWN0b3I7cmV0dXJuIGlbQV18fFQoaSksb319KSh0KX0pKSksUHJvbWlzZVtlLl9fc3ltYm9sX18oInVuY2F1Z2h0UHJvbWlzZUVycm9ycyIpXT1yLER9KSksCi8qKgogICAgICAgICAqIEBsaWNlbnNlCiAgICAgICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAgICAgKgogICAgICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICAgICAqLwpab25lLl9fbG9hZF9wYXRjaCgidG9TdHJpbmciLChmdW5jdGlvbih0KXt2YXIgZT1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcsbj1mKCJPcmlnaW5hbERlbGVnYXRlIiksbz1mKCJQcm9taXNlIiksaT1mKCJFcnJvciIpLGE9ZnVuY3Rpb24gYSgpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzKXt2YXIgcj10aGlzW25dO2lmKHIpcmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHI/ZS5jYWxsKHIpOk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyKTtpZih0aGlzPT09UHJvbWlzZSl7dmFyIHM9dFtvXTtpZihzKXJldHVybiBlLmNhbGwocyl9aWYodGhpcz09PUVycm9yKXt2YXIgbD10W2ldO2lmKGwpcmV0dXJuIGUuY2FsbChsKX19cmV0dXJuIGUuY2FsbCh0aGlzKX07YVtuXT1lLEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZz1hO3ZhciByPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBQcm9taXNlJiZ0aGlzIGluc3RhbmNlb2YgUHJvbWlzZT8iW29iamVjdCBQcm9taXNlXSI6ci5jYWxsKHRoaXMpfX0pKTsKLyoqCiAgICAgICAgICogQGxpY2Vuc2UKICAgICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICAgICAqCiAgICAgICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgICAgICovCnZhciBIPSExO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93KXRyeXt2YXIgRj1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sInBhc3NpdmUiLHtnZXQ6ZnVuY3Rpb24oKXtIPSEwfX0pO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0IixGLEYpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixGLEYpfWNhdGNoKHQpe0g9ITF9dmFyIEw9e3VzZUc6ITB9LEI9e30sVj17fSxqPW5ldyBSZWdFeHAoIl4iK3ArIihcXHcrKSh0cnVlfGZhbHNlKSQiKSxVPWYoInByb3BhZ2F0aW9uU3RvcHBlZCIpO2Z1bmN0aW9uIEcodCxlKXt2YXIgbj0oZT9lKHQpOnQpK2Qsbz0oZT9lKHQpOnQpK2MsaT1wK24sYT1wK287Qlt0XT17fSxCW3RdLmZhbHNlPWksQlt0XS50cnVlPWF9ZnVuY3Rpb24gVyh0LGUsbyl7dmFyIGk9byYmby5hZGR8fGEscz1vJiZvLnJtfHxyLGw9byYmby5saXN0ZW5lcnN8fCJldmVudExpc3RlbmVycyIsbT1vJiZvLnJtQWxsfHwicmVtb3ZlQWxsTGlzdGVuZXJzIix1PWYoaSksZz0iLiIraSsiOiIsaD1mdW5jdGlvbih0LGUsbil7aWYoIXQuaXNSZW1vdmVkKXt2YXIgbz10LmNhbGxiYWNrOyJvYmplY3QiPT10eXBlb2YgbyYmby5oYW5kbGVFdmVudCYmKHQuY2FsbGJhY2s9ZnVuY3Rpb24odCl7cmV0dXJuIG8uaGFuZGxlRXZlbnQodCl9LHQub3JpZ2luYWxEZWxlZ2F0ZT1vKSx0Lmludm9rZSh0LGUsW25dKTt2YXIgaT10Lm9wdGlvbnM7aSYmIm9iamVjdCI9PXR5cGVvZiBpJiZpLm9uY2UmJmVbc10uY2FsbChlLG4udHlwZSx0Lm9yaWdpbmFsRGVsZWdhdGU/dC5vcmlnaW5hbERlbGVnYXRlOnQuY2FsbGJhY2ssaSl9fSxiPWZ1bmN0aW9uKGUpe2lmKGU9ZXx8dC5ldmVudCl7dmFyIG49dGhpc3x8ZS50YXJnZXR8fHQsbz1uW0JbZS50eXBlXS5mYWxzZV07aWYobylpZigxPT09by5sZW5ndGgpaChvWzBdLG4sZSk7ZWxzZSBmb3IodmFyIGk9by5zbGljZSgpLGE9MDthPGkubGVuZ3RoJiYoIWV8fCEwIT09ZVtVXSk7YSsrKWgoaVthXSxuLGUpfX0seT1mdW5jdGlvbihlKXtpZihlPWV8fHQuZXZlbnQpe3ZhciBuPXRoaXN8fGUudGFyZ2V0fHx0LG89bltCW2UudHlwZV0udHJ1ZV07aWYobylpZigxPT09by5sZW5ndGgpaChvWzBdLG4sZSk7ZWxzZSBmb3IodmFyIGk9by5zbGljZSgpLGE9MDthPGkubGVuZ3RoJiYoIWV8fCEwIT09ZVtVXSk7YSsrKWgoaVthXSxuLGUpfX07ZnVuY3Rpb24gXyhlLG8pe2lmKCFlKXJldHVybiExO3ZhciBhPSEwO28mJnZvaWQgMCE9PW8udXNlRyYmKGE9by51c2VHKTt2YXIgcj1vJiZvLnZoLGg9ITA7byYmdm9pZCAwIT09by5jaGtEdXAmJihoPW8uY2hrRHVwKTt2YXIgXz0hMTtvJiZ2b2lkIDAhPT1vLnJ0JiYoXz1vLnJ0KTtmb3IodmFyIEM9ZTtDJiYhQy5oYXNPd25Qcm9wZXJ0eShpKTspQz1uKEMpO2lmKCFDJiZlW2ldJiYoQz1lKSwhQylyZXR1cm4hMTtpZihDW3VdKXJldHVybiExO3ZhciBNLHg9byYmby5ldmVudE5hbWVUb1N0cmluZyxPPXt9LFA9Q1t1XT1DW2ldLHc9Q1tmKHMpXT1DW3NdLGs9Q1tmKGwpXT1DW2xdLFM9Q1tmKG0pXT1DW21dO2Z1bmN0aW9uIEQodCxlKXtyZXR1cm4hSCYmIm9iamVjdCI9PXR5cGVvZiB0JiZ0PyEhdC5jYXB0dXJlOkgmJmU/ImJvb2xlYW4iPT10eXBlb2YgdD97Y2FwdHVyZTp0LHBhc3NpdmU6ITB9OnQ/Im9iamVjdCI9PXR5cGVvZiB0JiYhMSE9PXQucGFzc2l2ZT9PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3Bhc3NpdmU6ITB9KTp0OntwYXNzaXZlOiEwfTp0fW8mJm8ucHJlcGVuZCYmKE09Q1tmKG8ucHJlcGVuZCldPUNbby5wcmVwZW5kXSk7dmFyIEU9YT9mdW5jdGlvbih0KXtpZighTy5pc0V4aXN0aW5nKXJldHVybiBQLmNhbGwoTy50YXJnZXQsTy5ldmVudE5hbWUsTy5jYXB0dXJlP3k6YixPLm9wdGlvbnMpfTpmdW5jdGlvbih0KXtyZXR1cm4gUC5jYWxsKE8udGFyZ2V0LE8uZXZlbnROYW1lLHQuaW52b2tlLE8ub3B0aW9ucyl9LFI9YT9mdW5jdGlvbih0KXtpZighdC5pc1JlbW92ZWQpe3ZhciBlPUJbdC5ldmVudE5hbWVdLG49dm9pZCAwO2UmJihuPWVbdC5jYXB0dXJlP2M6ZF0pO3ZhciBvPW4mJnQudGFyZ2V0W25dO2lmKG8pZm9yKHZhciBpPTA7aTxvLmxlbmd0aDtpKyspaWYob1tpXT09PXQpe28uc3BsaWNlKGksMSksdC5pc1JlbW92ZWQ9ITAsMD09PW8ubGVuZ3RoJiYodC5hbGxSZW1vdmVkPSEwLHQudGFyZ2V0W25dPW51bGwpO2JyZWFrfX1pZih0LmFsbFJlbW92ZWQpcmV0dXJuIHcuY2FsbCh0LnRhcmdldCx0LmV2ZW50TmFtZSx0LmNhcHR1cmU/eTpiLHQub3B0aW9ucyl9OmZ1bmN0aW9uKHQpe3JldHVybiB3LmNhbGwodC50YXJnZXQsdC5ldmVudE5hbWUsdC5pbnZva2UsdC5vcHRpb25zKX0sQT1vJiZvLmRpZmY/by5kaWZmOmZ1bmN0aW9uKHQsZSl7dmFyIG49dHlwZW9mIGU7cmV0dXJuImZ1bmN0aW9uIj09PW4mJnQuY2FsbGJhY2s9PT1lfHwib2JqZWN0Ij09PW4mJnQub3JpZ2luYWxEZWxlZ2F0ZT09PWV9LE49Wm9uZVtmKCJVTlBBVENIRURfRVZFTlRTIildLHo9dFtmKCJQQVNTSVZFX0VWRU5UUyIpXSxJPWZ1bmN0aW9uKGUsbixpLHMsbCxwKXtyZXR1cm4gdm9pZCAwPT09bCYmKGw9ITEpLHZvaWQgMD09PXAmJihwPSExKSxmdW5jdGlvbigpe3ZhciBtPXRoaXN8fHQsdT1hcmd1bWVudHNbMF07byYmby50cmFuc2ZlckV2ZW50TmFtZSYmKHU9by50cmFuc2ZlckV2ZW50TmFtZSh1KSk7dmFyIGY9YXJndW1lbnRzWzFdO2lmKCFmKXJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZih2JiYidW5jYXVnaHRFeGNlcHRpb24iPT09dSlyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGc9ITE7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGYpe2lmKCFmLmhhbmRsZUV2ZW50KXJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtnPSEwfWlmKCFyfHxyKGUsZixtLGFyZ3VtZW50cykpe3ZhciBiPUgmJiEheiYmLTEhPT16LmluZGV4T2YodSkseT1EKGFyZ3VtZW50c1syXSxiKTtpZihOKWZvcih2YXIgXz0wO188Ti5sZW5ndGg7XysrKWlmKHU9PT1OW19dKXJldHVybiBiP2UuY2FsbChtLHUsZix5KTplLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgQz0hIXkmJigiYm9vbGVhbiI9PXR5cGVvZiB5fHx5LmNhcHR1cmUpLE09ISgheXx8Im9iamVjdCIhPXR5cGVvZiB5KSYmeS5vbmNlLFA9Wm9uZS5jdXJyZW50LHc9Qlt1XTt3fHwoRyh1LHgpLHc9Qlt1XSk7dmFyIGssUz13W0M/YzpkXSxFPW1bU10sUj0hMTtpZihFKXtpZihSPSEwLGgpZm9yKF89MDtfPEUubGVuZ3RoO18rKylpZihBKEVbX10sZikpcmV0dXJufWVsc2UgRT1tW1NdPVtdO3ZhciBUPW0uY29uc3RydWN0b3IubmFtZSxJPVZbVF07SSYmKGs9SVt1XSksa3x8KGs9VCtuKyh4P3godSk6dSkpLE8ub3B0aW9ucz15LE0mJihPLm9wdGlvbnMub25jZT0hMSksTy50YXJnZXQ9bSxPLmNhcHR1cmU9QyxPLmV2ZW50TmFtZT11LE8uaXNFeGlzdGluZz1SO3ZhciBGPWE/TDp2b2lkIDA7RiYmKEYudGFza0RhdGE9Tyk7dmFyIGo9UC5zY2hlZHVsZUV2ZW50VGFzayhrLGYsRixpLHMpO3JldHVybiBPLnRhcmdldD1udWxsLEYmJihGLnRhc2tEYXRhPW51bGwpLE0mJih5Lm9uY2U9ITApLChIfHwiYm9vbGVhbiIhPXR5cGVvZiBqLm9wdGlvbnMpJiYoai5vcHRpb25zPXkpLGoudGFyZ2V0PW0sai5jYXB0dXJlPUMsai5ldmVudE5hbWU9dSxnJiYoai5vcmlnaW5hbERlbGVnYXRlPWYpLHA/RS51bnNoaWZ0KGopOkUucHVzaChqKSxsP206dm9pZCAwfX19O3JldHVybiBDW2ldPUkoUCxnLEUsUixfKSxNJiYoQy5wcmVwZW5kTGlzdGVuZXI9SShNLCIucHJlcGVuZExpc3RlbmVyOiIsKGZ1bmN0aW9uKHQpe3JldHVybiBNLmNhbGwoTy50YXJnZXQsTy5ldmVudE5hbWUsdC5pbnZva2UsTy5vcHRpb25zKX0pLFIsXywhMCkpLENbc109ZnVuY3Rpb24oKXt2YXIgZT10aGlzfHx0LG49YXJndW1lbnRzWzBdO28mJm8udHJhbnNmZXJFdmVudE5hbWUmJihuPW8udHJhbnNmZXJFdmVudE5hbWUobikpO3ZhciBpPWFyZ3VtZW50c1syXSxhPSEhaSYmKCJib29sZWFuIj09dHlwZW9mIGl8fGkuY2FwdHVyZSkscz1hcmd1bWVudHNbMV07aWYoIXMpcmV0dXJuIHcuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCFyfHxyKHcscyxlLGFyZ3VtZW50cykpe3ZhciBsLG09QltuXTttJiYobD1tW2E/YzpkXSk7dmFyIHU9bCYmZVtsXTtpZih1KWZvcih2YXIgZj0wO2Y8dS5sZW5ndGg7ZisrKXt2YXIgZz11W2ZdO2lmKEEoZyxzKSlyZXR1cm4gdS5zcGxpY2UoZiwxKSxnLmlzUmVtb3ZlZD0hMCwwPT09dS5sZW5ndGgmJihnLmFsbFJlbW92ZWQ9ITAsZVtsXT1udWxsLCJzdHJpbmciPT10eXBlb2YgbiYmKGVbcCsiT05fUFJPUEVSVFkiK25dPW51bGwpKSxnLnpvbmUuY2FuY2VsVGFzayhnKSxfP2U6dm9pZCAwfXJldHVybiB3LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19LENbbF09ZnVuY3Rpb24oKXt2YXIgZT10aGlzfHx0LG49YXJndW1lbnRzWzBdO28mJm8udHJhbnNmZXJFdmVudE5hbWUmJihuPW8udHJhbnNmZXJFdmVudE5hbWUobikpO2Zvcih2YXIgaT1bXSxhPVkoZSx4P3gobik6bikscj0wO3I8YS5sZW5ndGg7cisrKXt2YXIgcz1hW3JdO2kucHVzaChzLm9yaWdpbmFsRGVsZWdhdGU/cy5vcmlnaW5hbERlbGVnYXRlOnMuY2FsbGJhY2spfXJldHVybiBpfSxDW21dPWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8dCxuPWFyZ3VtZW50c1swXTtpZihuKXtvJiZvLnRyYW5zZmVyRXZlbnROYW1lJiYobj1vLnRyYW5zZmVyRXZlbnROYW1lKG4pKTt2YXIgaT1CW25dO2lmKGkpe3ZhciBhPWVbaS5mYWxzZV0scj1lW2kudHJ1ZV07aWYoYSl7dmFyIGw9YS5zbGljZSgpO2ZvcihwPTA7cDxsLmxlbmd0aDtwKyspdGhpc1tzXS5jYWxsKHRoaXMsbiwoYz1sW3BdKS5vcmlnaW5hbERlbGVnYXRlP2Mub3JpZ2luYWxEZWxlZ2F0ZTpjLmNhbGxiYWNrLGMub3B0aW9ucyl9aWYocilmb3IobD1yLnNsaWNlKCkscD0wO3A8bC5sZW5ndGg7cCsrKXt2YXIgYzt0aGlzW3NdLmNhbGwodGhpcyxuLChjPWxbcF0pLm9yaWdpbmFsRGVsZWdhdGU/Yy5vcmlnaW5hbERlbGVnYXRlOmMuY2FsbGJhY2ssYy5vcHRpb25zKX19fWVsc2V7Zm9yKHZhciBkPU9iamVjdC5rZXlzKGUpLHA9MDtwPGQubGVuZ3RoO3ArKyl7dmFyIHU9ai5leGVjKGRbcF0pLGY9dSYmdVsxXTtmJiYicmVtb3ZlTGlzdGVuZXIiIT09ZiYmdGhpc1ttXS5jYWxsKHRoaXMsZil9dGhpc1ttXS5jYWxsKHRoaXMsInJlbW92ZUxpc3RlbmVyIil9aWYoXylyZXR1cm4gdGhpc30sVChDW2ldLFApLFQoQ1tzXSx3KSxTJiZUKENbbV0sUyksayYmVChDW2xdLGspLCEwfWZvcih2YXIgQz1bXSxNPTA7TTxlLmxlbmd0aDtNKyspQ1tNXT1fKGVbTV0sbyk7cmV0dXJuIEN9ZnVuY3Rpb24gWSh0LGUpe2lmKCFlKXt2YXIgbj1bXTtmb3IodmFyIG8gaW4gdCl7dmFyIGk9ai5leGVjKG8pLGE9aSYmaVsxXTtpZihhJiYoIWV8fGE9PT1lKSl7dmFyIHI9dFtvXTtpZihyKWZvcih2YXIgcz0wO3M8ci5sZW5ndGg7cysrKW4ucHVzaChyW3NdKX19cmV0dXJuIG59dmFyIGw9QltlXTtsfHwoRyhlKSxsPUJbZV0pO3ZhciBjPXRbbC5mYWxzZV0sZD10W2wudHJ1ZV07cmV0dXJuIGM/ZD9jLmNvbmNhdChkKTpjLnNsaWNlKCk6ZD9kLnNsaWNlKCk6W119ZnVuY3Rpb24gcSh0LGUpe3ZhciBuPXQuRXZlbnQ7biYmbi5wcm90b3R5cGUmJmUucGF0Y2hNZXRob2Qobi5wcm90b3R5cGUsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe2VbVV09ITAsdCYmdC5hcHBseShlLG4pfX0pKX0KLyoqCiAgICAgICAgICogQGxpY2Vuc2UKICAgICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICAgICAqCiAgICAgICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgICAgICovZnVuY3Rpb24gWih0LGUsbixvLGkpe3ZhciBhPVpvbmUuX19zeW1ib2xfXyhvKTtpZighZVthXSl7dmFyIHI9ZVthXT1lW29dO2Vbb109ZnVuY3Rpb24oYSxzLGwpe3JldHVybiBzJiZzLnByb3RvdHlwZSYmaS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgaT1uKyIuIitvKyI6OiIrZSxhPXMucHJvdG90eXBlO2lmKGEuaGFzT3duUHJvcGVydHkoZSkpe3ZhciByPXQuT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEsZSk7ciYmci52YWx1ZT8oci52YWx1ZT10LndyYXBXaXRoQ3VycmVudFpvbmUoci52YWx1ZSxpKSx0Ll9yZWRlZmluZVByb3BlcnR5KHMucHJvdG90eXBlLGUscikpOmFbZV0mJihhW2VdPXQud3JhcFdpdGhDdXJyZW50Wm9uZShhW2VdLGkpKX1lbHNlIGFbZV0mJihhW2VdPXQud3JhcFdpdGhDdXJyZW50Wm9uZShhW2VdLGkpKX0pKSxyLmNhbGwoZSxhLHMsbCl9LHQuYXR0YWNoT3JpZ2luVG9QYXRjaGVkKGVbb10scil9fQovKioKICAgICAgICAgKiBAbGljZW5zZQogICAgICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgICAgICoKICAgICAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAgICAgKi92YXIgWCxLLEosUSwkLHR0PVsiYWJzb2x1dGVkZXZpY2VvcmllbnRhdGlvbiIsImFmdGVyaW5wdXQiLCJhZnRlcnByaW50IiwiYXBwaW5zdGFsbGVkIiwiYmVmb3JlaW5zdGFsbHByb21wdCIsImJlZm9yZXByaW50IiwiYmVmb3JldW5sb2FkIiwiZGV2aWNlbGlnaHQiLCJkZXZpY2Vtb3Rpb24iLCJkZXZpY2VvcmllbnRhdGlvbiIsImRldmljZW9yaWVudGF0aW9uYWJzb2x1dGUiLCJkZXZpY2Vwcm94aW1pdHkiLCJoYXNoY2hhbmdlIiwibGFuZ3VhZ2VjaGFuZ2UiLCJtZXNzYWdlIiwibW96YmVmb3JlcGFpbnQiLCJvZmZsaW5lIiwib25saW5lIiwicGFpbnQiLCJwYWdlc2hvdyIsInBhZ2VoaWRlIiwicG9wc3RhdGUiLCJyZWplY3Rpb25oYW5kbGVkIiwic3RvcmFnZSIsInVuaGFuZGxlZHJlamVjdGlvbiIsInVubG9hZCIsInVzZXJwcm94aW1pdHkiLCJ2cmRpc3BsYXljb25uZWN0ZWQiLCJ2cmRpc3BsYXlkaXNjb25uZWN0ZWQiLCJ2cmRpc3BsYXlwcmVzZW50Y2hhbmdlIl0sZXQ9WyJlbmNyeXB0ZWQiLCJ3YWl0aW5nZm9ya2V5IiwibXNuZWVka2V5IiwibW96aW50ZXJydXB0YmVnaW4iLCJtb3ppbnRlcnJ1cHRlbmQiXSxudD1bImxvYWQiXSxvdD1bImJsdXIiLCJlcnJvciIsImZvY3VzIiwibG9hZCIsInJlc2l6ZSIsInNjcm9sbCIsIm1lc3NhZ2VlcnJvciJdLGl0PVsiYm91bmNlIiwiZmluaXNoIiwic3RhcnQiXSxhdD1bImxvYWRzdGFydCIsInByb2dyZXNzIiwiYWJvcnQiLCJlcnJvciIsImxvYWQiLCJwcm9ncmVzcyIsInRpbWVvdXQiLCJsb2FkZW5kIiwicmVhZHlzdGF0ZWNoYW5nZSJdLHJ0PVsidXBncmFkZW5lZWRlZCIsImNvbXBsZXRlIiwiYWJvcnQiLCJzdWNjZXNzIiwiZXJyb3IiLCJibG9ja2VkIiwidmVyc2lvbmNoYW5nZSIsImNsb3NlIl0sc3Q9WyJjbG9zZSIsImVycm9yIiwib3BlbiIsIm1lc3NhZ2UiXSxsdD1bImVycm9yIiwibWVzc2FnZSJdLGN0PVsiYWJvcnQiLCJhbmltYXRpb25jYW5jZWwiLCJhbmltYXRpb25lbmQiLCJhbmltYXRpb25pdGVyYXRpb24iLCJhdXhjbGljayIsImJlZm9yZWlucHV0IiwiYmx1ciIsImNhbmNlbCIsImNhbnBsYXkiLCJjYW5wbGF5dGhyb3VnaCIsImNoYW5nZSIsImNvbXBvc2l0aW9uc3RhcnQiLCJjb21wb3NpdGlvbnVwZGF0ZSIsImNvbXBvc2l0aW9uZW5kIiwiY3VlY2hhbmdlIiwiY2xpY2siLCJjbG9zZSIsImNvbnRleHRtZW51IiwiY3VyZWNoYW5nZSIsImRibGNsaWNrIiwiZHJhZyIsImRyYWdlbmQiLCJkcmFnZW50ZXIiLCJkcmFnZXhpdCIsImRyYWdsZWF2ZSIsImRyYWdvdmVyIiwiZHJvcCIsImR1cmF0aW9uY2hhbmdlIiwiZW1wdGllZCIsImVuZGVkIiwiZXJyb3IiLCJmb2N1cyIsImZvY3VzaW4iLCJmb2N1c291dCIsImdvdHBvaW50ZXJjYXB0dXJlIiwiaW5wdXQiLCJpbnZhbGlkIiwia2V5ZG93biIsImtleXByZXNzIiwia2V5dXAiLCJsb2FkIiwibG9hZHN0YXJ0IiwibG9hZGVkZGF0YSIsImxvYWRlZG1ldGFkYXRhIiwibG9zdHBvaW50ZXJjYXB0dXJlIiwibW91c2Vkb3duIiwibW91c2VlbnRlciIsIm1vdXNlbGVhdmUiLCJtb3VzZW1vdmUiLCJtb3VzZW91dCIsIm1vdXNlb3ZlciIsIm1vdXNldXAiLCJtb3VzZXdoZWVsIiwib3JpZW50YXRpb25jaGFuZ2UiLCJwYXVzZSIsInBsYXkiLCJwbGF5aW5nIiwicG9pbnRlcmNhbmNlbCIsInBvaW50ZXJkb3duIiwicG9pbnRlcmVudGVyIiwicG9pbnRlcmxlYXZlIiwicG9pbnRlcmxvY2tjaGFuZ2UiLCJtb3pwb2ludGVybG9ja2NoYW5nZSIsIndlYmtpdHBvaW50ZXJsb2NrZXJjaGFuZ2UiLCJwb2ludGVybG9ja2Vycm9yIiwibW96cG9pbnRlcmxvY2tlcnJvciIsIndlYmtpdHBvaW50ZXJsb2NrZXJyb3IiLCJwb2ludGVybW92ZSIsInBvaW50b3V0IiwicG9pbnRlcm92ZXIiLCJwb2ludGVydXAiLCJwcm9ncmVzcyIsInJhdGVjaGFuZ2UiLCJyZXNldCIsInJlc2l6ZSIsInNjcm9sbCIsInNlZWtlZCIsInNlZWtpbmciLCJzZWxlY3QiLCJzZWxlY3Rpb25jaGFuZ2UiLCJzZWxlY3RzdGFydCIsInNob3ciLCJzb3J0Iiwic3RhbGxlZCIsInN1Ym1pdCIsInN1c3BlbmQiLCJ0aW1ldXBkYXRlIiwidm9sdW1lY2hhbmdlIiwidG91Y2hjYW5jZWwiLCJ0b3VjaG1vdmUiLCJ0b3VjaHN0YXJ0IiwidG91Y2hlbmQiLCJ0cmFuc2l0aW9uY2FuY2VsIiwidHJhbnNpdGlvbmVuZCIsIndhaXRpbmciLCJ3aGVlbCJdLmNvbmNhdChbIndlYmdsY29udGV4dHJlc3RvcmVkIiwid2ViZ2xjb250ZXh0bG9zdCIsIndlYmdsY29udGV4dGNyZWF0aW9uZXJyb3IiXSxbImF1dG9jb21wbGV0ZSIsImF1dG9jb21wbGV0ZWVycm9yIl0sWyJ0b2dnbGUiXSxbImFmdGVyc2NyaXB0ZXhlY3V0ZSIsImJlZm9yZXNjcmlwdGV4ZWN1dGUiLCJET01Db250ZW50TG9hZGVkIiwiZnJlZXplIiwiZnVsbHNjcmVlbmNoYW5nZSIsIm1vemZ1bGxzY3JlZW5jaGFuZ2UiLCJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlIiwibXNmdWxsc2NyZWVuY2hhbmdlIiwiZnVsbHNjcmVlbmVycm9yIiwibW96ZnVsbHNjcmVlbmVycm9yIiwid2Via2l0ZnVsbHNjcmVlbmVycm9yIiwibXNmdWxsc2NyZWVuZXJyb3IiLCJyZWFkeXN0YXRlY2hhbmdlIiwidmlzaWJpbGl0eWNoYW5nZSIsInJlc3VtZSJdLHR0LFsiYmVmb3JlY29weSIsImJlZm9yZWN1dCIsImJlZm9yZXBhc3RlIiwiY29weSIsImN1dCIsInBhc3RlIiwiZHJhZ3N0YXJ0IiwibG9hZGVuZCIsImFuaW1hdGlvbnN0YXJ0Iiwic2VhcmNoIiwidHJhbnNpdGlvbnJ1biIsInRyYW5zaXRpb25zdGFydCIsIndlYmtpdGFuaW1hdGlvbmVuZCIsIndlYmtpdGFuaW1hdGlvbml0ZXJhdGlvbiIsIndlYmtpdGFuaW1hdGlvbnN0YXJ0Iiwid2Via2l0dHJhbnNpdGlvbmVuZCJdLFsiYWN0aXZhdGUiLCJhZnRlcnVwZGF0ZSIsImFyaWFyZXF1ZXN0IiwiYmVmb3JlYWN0aXZhdGUiLCJiZWZvcmVkZWFjdGl2YXRlIiwiYmVmb3JlZWRpdGZvY3VzIiwiYmVmb3JldXBkYXRlIiwiY2VsbGNoYW5nZSIsImNvbnRyb2xzZWxlY3QiLCJkYXRhYXZhaWxhYmxlIiwiZGF0YXNldGNoYW5nZWQiLCJkYXRhc2V0Y29tcGxldGUiLCJlcnJvcnVwZGF0ZSIsImZpbHRlcmNoYW5nZSIsImxheW91dGNvbXBsZXRlIiwibG9zZWNhcHR1cmUiLCJtb3ZlIiwibW92ZWVuZCIsIm1vdmVzdGFydCIsInByb3BlcnR5Y2hhbmdlIiwicmVzaXplZW5kIiwicmVzaXplc3RhcnQiLCJyb3dlbnRlciIsInJvd2V4aXQiLCJyb3dzZGVsZXRlIiwicm93c2luc2VydGVkIiwiY29tbWFuZCIsImNvbXBhc3NuZWVkc2NhbGlicmF0aW9uIiwiZGVhY3RpdmF0ZSIsImhlbHAiLCJtc2NvbnRlbnR6b29tIiwibXNtYW5pcHVsYXRpb25zdGF0ZWNoYW5nZWQiLCJtc2dlc3R1cmVjaGFuZ2UiLCJtc2dlc3R1cmVkb3VibGV0YXAiLCJtc2dlc3R1cmVlbmQiLCJtc2dlc3R1cmVob2xkIiwibXNnZXN0dXJlc3RhcnQiLCJtc2dlc3R1cmV0YXAiLCJtc2dvdHBvaW50ZXJjYXB0dXJlIiwibXNpbmVydGlhc3RhcnQiLCJtc2xvc3Rwb2ludGVyY2FwdHVyZSIsIm1zcG9pbnRlcmNhbmNlbCIsIm1zcG9pbnRlcmRvd24iLCJtc3BvaW50ZXJlbnRlciIsIm1zcG9pbnRlcmhvdmVyIiwibXNwb2ludGVybGVhdmUiLCJtc3BvaW50ZXJtb3ZlIiwibXNwb2ludGVyb3V0IiwibXNwb2ludGVyb3ZlciIsIm1zcG9pbnRlcnVwIiwicG9pbnRlcm91dCIsIm1zc2l0ZW1vZGVqdW1wbGlzdGl0ZW1yZW1vdmVkIiwibXN0aHVtYm5haWxjbGljayIsInN0b3AiLCJzdG9yYWdlY29tbWl0Il0pO2Z1bmN0aW9uIGR0KHQsZSxuKXtpZighbnx8MD09PW4ubGVuZ3RoKXJldHVybiBlO3ZhciBvPW4uZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZS50YXJnZXQ9PT10fSkpO2lmKCFvfHwwPT09by5sZW5ndGgpcmV0dXJuIGU7dmFyIGk9b1swXS5pZ25vcmVQcm9wZXJ0aWVzO3JldHVybiBlLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuLTE9PT1pLmluZGV4T2YodCl9KSl9ZnVuY3Rpb24gcHQodCxlLG4sbyl7dCYmUyh0LGR0KHQsZSxuKSxvKX1mdW5jdGlvbiBtdCh0LGUpe2lmKCghdnx8TykmJiFab25lW3Quc3ltYm9sKCJwYXRjaEV2ZW50cyIpXSl7dmFyIG89InVuZGVmaW5lZCIhPXR5cGVvZiBXZWJTb2NrZXQsaT1lLl9fWm9uZV9pZ25vcmVfb25fcHJvcGVydGllcztpZih4KXt2YXIgYT13aW5kb3cscj0oZnVuY3Rpb24gcygpe3RyeXt2YXIgdD1oLm5hdmlnYXRvci51c2VyQWdlbnQ7aWYoLTEhPT10LmluZGV4T2YoIk1TSUUgIil8fC0xIT09dC5pbmRleE9mKCJUcmlkZW50LyIpKXJldHVybiEwfWNhdGNoKHQpe31yZXR1cm4hMX0pKCk/W3t0YXJnZXQ6YSxpZ25vcmVQcm9wZXJ0aWVzOlsiZXJyb3IiXX1dOltdO3B0KGEsY3QuY29uY2F0KFsibWVzc2FnZWVycm9yIl0pLGk/aS5jb25jYXQocik6aSxuKGEpKSxwdChEb2N1bWVudC5wcm90b3R5cGUsY3QsaSksdm9pZCAwIT09YS5TVkdFbGVtZW50JiZwdChhLlNWR0VsZW1lbnQucHJvdG90eXBlLGN0LGkpLHB0KEVsZW1lbnQucHJvdG90eXBlLGN0LGkpLHB0KEhUTUxFbGVtZW50LnByb3RvdHlwZSxjdCxpKSxwdChIVE1MTWVkaWFFbGVtZW50LnByb3RvdHlwZSxldCxpKSxwdChIVE1MRnJhbWVTZXRFbGVtZW50LnByb3RvdHlwZSx0dC5jb25jYXQob3QpLGkpLHB0KEhUTUxCb2R5RWxlbWVudC5wcm90b3R5cGUsdHQuY29uY2F0KG90KSxpKSxwdChIVE1MRnJhbWVFbGVtZW50LnByb3RvdHlwZSxudCxpKSxwdChIVE1MSUZyYW1lRWxlbWVudC5wcm90b3R5cGUsbnQsaSk7dmFyIGw9YS5IVE1MTWFycXVlZUVsZW1lbnQ7bCYmcHQobC5wcm90b3R5cGUsaXQsaSk7dmFyIGM9YS5Xb3JrZXI7YyYmcHQoYy5wcm90b3R5cGUsbHQsaSl9dmFyIGQ9ZS5YTUxIdHRwUmVxdWVzdDtkJiZwdChkLnByb3RvdHlwZSxhdCxpKTt2YXIgcD1lLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ7cCYmcHQocCYmcC5wcm90b3R5cGUsYXQsaSksInVuZGVmaW5lZCIhPXR5cGVvZiBJREJJbmRleCYmKHB0KElEQkluZGV4LnByb3RvdHlwZSxydCxpKSxwdChJREJSZXF1ZXN0LnByb3RvdHlwZSxydCxpKSxwdChJREJPcGVuREJSZXF1ZXN0LnByb3RvdHlwZSxydCxpKSxwdChJREJEYXRhYmFzZS5wcm90b3R5cGUscnQsaSkscHQoSURCVHJhbnNhY3Rpb24ucHJvdG90eXBlLHJ0LGkpLHB0KElEQkN1cnNvci5wcm90b3R5cGUscnQsaSkpLG8mJnB0KFdlYlNvY2tldC5wcm90b3R5cGUsc3QsaSl9fQovKioKICAgICAgICAgKiBAbGljZW5zZQogICAgICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgICAgICoKICAgICAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAgICAgKi9mdW5jdGlvbiB1dCgpe1g9Wm9uZS5fX3N5bWJvbF9fLEs9T2JqZWN0W1goImRlZmluZVByb3BlcnR5IildPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxKPU9iamVjdFtYKCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiKV09T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixRPU9iamVjdC5jcmVhdGUsJD1YKCJ1bmNvbmZpZ3VyYWJsZXMiKSxPYmplY3QuZGVmaW5lUHJvcGVydHk9ZnVuY3Rpb24odCxlLG4pe2lmKGd0KHQsZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFzc2lnbiB0byByZWFkIG9ubHkgcHJvcGVydHkgJyIrZSsiJyBvZiAiK3QpO3ZhciBvPW4uY29uZmlndXJhYmxlO3JldHVybiJwcm90b3R5cGUiIT09ZSYmKG49aHQodCxlLG4pKSxidCh0LGUsbixvKX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24obil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbixlW25dKX0pKSx0fSxPYmplY3QuY3JlYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIm9iamVjdCIhPXR5cGVvZiBlfHxPYmplY3QuaXNGcm96ZW4oZSl8fE9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKG4pe2Vbbl09aHQodCxuLGVbbl0pfSkpLFEodCxlKX0sT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcj1mdW5jdGlvbih0LGUpe3ZhciBuPUoodCxlKTtyZXR1cm4gbiYmZ3QodCxlKSYmKG4uY29uZmlndXJhYmxlPSExKSxufX1mdW5jdGlvbiBmdCh0LGUsbil7dmFyIG89bi5jb25maWd1cmFibGU7cmV0dXJuIGJ0KHQsZSxuPWh0KHQsZSxuKSxvKX1mdW5jdGlvbiBndCh0LGUpe3JldHVybiB0JiZ0WyRdJiZ0WyRdW2VdfWZ1bmN0aW9uIGh0KHQsZSxuKXtyZXR1cm4gT2JqZWN0LmlzRnJvemVuKG4pfHwobi5jb25maWd1cmFibGU9ITApLG4uY29uZmlndXJhYmxlfHwodFskXXx8T2JqZWN0LmlzRnJvemVuKHQpfHxLKHQsJCx7d3JpdGFibGU6ITAsdmFsdWU6e319KSx0WyRdJiYodFskXVtlXT0hMCkpLG59ZnVuY3Rpb24gYnQodCxlLG4sbyl7dHJ5e3JldHVybiBLKHQsZSxuKX1jYXRjaChyKXtpZighbi5jb25maWd1cmFibGUpdGhyb3cgcjt2b2lkIDA9PT1vP2RlbGV0ZSBuLmNvbmZpZ3VyYWJsZTpuLmNvbmZpZ3VyYWJsZT1vO3RyeXtyZXR1cm4gSyh0LGUsbil9Y2F0Y2gobyl7dmFyIGk9ITE7aWYoImNyZWF0ZWRDYWxsYmFjayIhPT1lJiYiYXR0YWNoZWRDYWxsYmFjayIhPT1lJiYiZGV0YWNoZWRDYWxsYmFjayIhPT1lJiYiYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrIiE9PWV8fChpPSEwKSwhaSl0aHJvdyBvO3ZhciBhPW51bGw7dHJ5e2E9SlNPTi5zdHJpbmdpZnkobil9Y2F0Y2godCl7YT1uLnRvU3RyaW5nKCl9Y29uc29sZS5sb2coIkF0dGVtcHRpbmcgdG8gY29uZmlndXJlICciK2UrIicgd2l0aCBkZXNjcmlwdG9yICciK2ErIicgb24gb2JqZWN0ICciK3QrIicgYW5kIGdvdCBlcnJvciwgZ2l2aW5nIHVwOiAiK28pfX19Ci8qKgogICAgICAgICAqIEBsaWNlbnNlCiAgICAgICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAgICAgKgogICAgICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICAgICAqL2Z1bmN0aW9uIHl0KHQsZSl7dmFyIG49ZS5nZXRHbG9iYWxPYmplY3RzKCksbz1uLmV2ZW50TmFtZXMsaT1uLmdsb2JhbFNvdXJjZXMsYT1uLnpvbmVTeW1ib2xFdmVudE5hbWVzLHI9bi5UUlVFX1NUUixzPW4uRkFMU0VfU1RSLGw9bi5aT05FX1NZTUJPTF9QUkVGSVgsYz0iQXBwbGljYXRpb25DYWNoZSxFdmVudFNvdXJjZSxGaWxlUmVhZGVyLElucHV0TWV0aG9kQ29udGV4dCxNZWRpYUNvbnRyb2xsZXIsTWVzc2FnZVBvcnQsTm9kZSxQZXJmb3JtYW5jZSxTVkdFbGVtZW50SW5zdGFuY2UsU2hhcmVkV29ya2VyLFRleHRUcmFjayxUZXh0VHJhY2tDdWUsVGV4dFRyYWNrTGlzdCxXZWJLaXROYW1lZEZsb3csV2luZG93LFdvcmtlcixXb3JrZXJHbG9iYWxTY29wZSxYTUxIdHRwUmVxdWVzdCxYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0LFhNTEh0dHBSZXF1ZXN0VXBsb2FkLElEQlJlcXVlc3QsSURCT3BlbkRCUmVxdWVzdCxJREJEYXRhYmFzZSxJREJUcmFuc2FjdGlvbixJREJDdXJzb3IsREJJbmRleCxXZWJTb2NrZXQiLnNwbGl0KCIsIiksZD1bXSxwPXQud3RmLG09IkFuY2hvcixBcmVhLEF1ZGlvLEJSLEJhc2UsQmFzZUZvbnQsQm9keSxCdXR0b24sQ2FudmFzLENvbnRlbnQsRExpc3QsRGlyZWN0b3J5LERpdixFbWJlZCxGaWVsZFNldCxGb250LEZvcm0sRnJhbWUsRnJhbWVTZXQsSFIsSGVhZCxIZWFkaW5nLEh0bWwsSUZyYW1lLEltYWdlLElucHV0LEtleWdlbixMSSxMYWJlbCxMZWdlbmQsTGluayxNYXAsTWFycXVlZSxNZWRpYSxNZW51LE1ldGEsTWV0ZXIsTW9kLE9MaXN0LE9iamVjdCxPcHRHcm91cCxPcHRpb24sT3V0cHV0LFBhcmFncmFwaCxQcmUsUHJvZ3Jlc3MsUXVvdGUsU2NyaXB0LFNlbGVjdCxTb3VyY2UsU3BhbixTdHlsZSxUYWJsZUNhcHRpb24sVGFibGVDZWxsLFRhYmxlQ29sLFRhYmxlLFRhYmxlUm93LFRhYmxlU2VjdGlvbixUZXh0QXJlYSxUaXRsZSxUcmFjayxVTGlzdCxVbmtub3duLFZpZGVvIi5zcGxpdCgiLCIpO3A/ZD1tLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIkhUTUwiK3QrIkVsZW1lbnQifSkpLmNvbmNhdChjKTp0LkV2ZW50VGFyZ2V0P2QucHVzaCgiRXZlbnRUYXJnZXQiKTpkPWM7Zm9yKHZhciB1PXQuX19ab25lX2Rpc2FibGVfSUVfY2hlY2t8fCExLGY9dC5fX1pvbmVfZW5hYmxlX2Nyb3NzX2NvbnRleHRfY2hlY2t8fCExLGc9ZS5pc0lFT3JFZGdlKCksaD0iW29iamVjdCBGdW5jdGlvbldyYXBwZXJdIixiPSJmdW5jdGlvbiBfX0JST1dTRVJUT09MU19DT05TT0xFX1NBRkVGVU5DKCkgeyBbbmF0aXZlIGNvZGVdIH0iLHk9e01TUG9pbnRlckNhbmNlbDoicG9pbnRlcmNhbmNlbCIsTVNQb2ludGVyRG93bjoicG9pbnRlcmRvd24iLE1TUG9pbnRlckVudGVyOiJwb2ludGVyZW50ZXIiLE1TUG9pbnRlckhvdmVyOiJwb2ludGVyaG92ZXIiLE1TUG9pbnRlckxlYXZlOiJwb2ludGVybGVhdmUiLE1TUG9pbnRlck1vdmU6InBvaW50ZXJtb3ZlIixNU1BvaW50ZXJPdXQ6InBvaW50ZXJvdXQiLE1TUG9pbnRlck92ZXI6InBvaW50ZXJvdmVyIixNU1BvaW50ZXJVcDoicG9pbnRlcnVwIn0sXz0wO188by5sZW5ndGg7XysrKXt2YXIgQz1sKygoUD1vW19dKStzKSxNPWwrKFArcik7YVtQXT17fSxhW1BdW3NdPUMsYVtQXVtyXT1NfWZvcihfPTA7XzxtLmxlbmd0aDtfKyspZm9yKHZhciB2PW1bX10seD1pW3ZdPXt9LE89MDtPPG8ubGVuZ3RoO08rKyl7dmFyIFA7eFtQPW9bT11dPXYrIi5hZGRFdmVudExpc3RlbmVyOiIrUH12YXIgdz1bXTtmb3IoXz0wO188ZC5sZW5ndGg7XysrKXt2YXIgaz10W2RbX11dO3cucHVzaChrJiZrLnByb3RvdHlwZSl9cmV0dXJuIGUucGF0Y2hFdmVudFRhcmdldCh0LHcse3ZoOmZ1bmN0aW9uKHQsZSxuLG8pe2lmKCF1JiZnKXtpZihmKXRyeXt2YXIgaTtpZigoaT1lLnRvU3RyaW5nKCkpPT09aHx8aT09YilyZXR1cm4gdC5hcHBseShuLG8pLCExfWNhdGNoKGUpe3JldHVybiB0LmFwcGx5KG4sbyksITF9ZWxzZSBpZigoaT1lLnRvU3RyaW5nKCkpPT09aHx8aT09YilyZXR1cm4gdC5hcHBseShuLG8pLCExfWVsc2UgaWYoZil0cnl7ZS50b1N0cmluZygpfWNhdGNoKGUpe3JldHVybiB0LmFwcGx5KG4sbyksITF9cmV0dXJuITB9LHRyYW5zZmVyRXZlbnROYW1lOmZ1bmN0aW9uKHQpe3JldHVybiB5W3RdfHx0fX0pLFpvbmVbZS5zeW1ib2woInBhdGNoRXZlbnRUYXJnZXQiKV09ISF0LkV2ZW50VGFyZ2V0LCEwfQovKioKICAgICAgICAgKiBAbGljZW5zZQogICAgICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgICAgICoKICAgICAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAgICAgKi8KLyoqCiAgICAgICAgICogQGxpY2Vuc2UKICAgICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICAgICAqCiAgICAgICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgICAgICovCmZ1bmN0aW9uIF90KHQsZSl7dmFyIG49dC5nZXRHbG9iYWxPYmplY3RzKCk7aWYoKCFuLmlzTm9kZXx8bi5pc01peCkmJiEoZnVuY3Rpb24gbyh0LGUpe3ZhciBuPXQuZ2V0R2xvYmFsT2JqZWN0cygpO2lmKChuLmlzQnJvd3Nlcnx8bi5pc01peCkmJiF0Lk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsIm9uY2xpY2siKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBFbGVtZW50KXt2YXIgbz10Lk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihFbGVtZW50LnByb3RvdHlwZSwib25jbGljayIpO2lmKG8mJiFvLmNvbmZpZ3VyYWJsZSlyZXR1cm4hMTtpZihvKXt0Lk9iamVjdERlZmluZVByb3BlcnR5KEVsZW1lbnQucHJvdG90eXBlLCJvbmNsaWNrIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuITB9fSk7dmFyIGk9ISFkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5vbmNsaWNrO3JldHVybiB0Lk9iamVjdERlZmluZVByb3BlcnR5KEVsZW1lbnQucHJvdG90eXBlLCJvbmNsaWNrIixvKSxpfX12YXIgYT1lLlhNTEh0dHBSZXF1ZXN0O2lmKCFhKXJldHVybiExO3ZhciByPSJvbnJlYWR5c3RhdGVjaGFuZ2UiLHM9YS5wcm90b3R5cGUsbD10Lk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihzLHIpO2lmKGwpcmV0dXJuIHQuT2JqZWN0RGVmaW5lUHJvcGVydHkocyxyLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KSxpPSEhKGQ9bmV3IGEpLm9ucmVhZHlzdGF0ZWNoYW5nZSx0Lk9iamVjdERlZmluZVByb3BlcnR5KHMscixsfHx7fSksaTt2YXIgYz10LnN5bWJvbCgiZmFrZSIpO3QuT2JqZWN0RGVmaW5lUHJvcGVydHkocyxyLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tjXX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXNbY109dH19KTt2YXIgZCxwPWZ1bmN0aW9uKCl7fTtyZXR1cm4oZD1uZXcgYSkub25yZWFkeXN0YXRlY2hhbmdlPXAsaT1kW2NdPT09cCxkLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGl9KSh0LGUpKXt2YXIgaT0idW5kZWZpbmVkIiE9dHlwZW9mIFdlYlNvY2tldDsoZnVuY3Rpb24gYSh0KXtmb3IodmFyIGU9dC5nZXRHbG9iYWxPYmplY3RzKCkuZXZlbnROYW1lcyxuPXQuc3ltYm9sKCJ1bmJvdW5kIiksbz1mdW5jdGlvbihvKXt2YXIgaT1lW29dLGE9Im9uIitpO3NlbGYuYWRkRXZlbnRMaXN0ZW5lcihpLChmdW5jdGlvbihlKXt2YXIgbyxpLHI9ZS50YXJnZXQ7Zm9yKGk9cj9yLmNvbnN0cnVjdG9yLm5hbWUrIi4iK2E6InVua25vd24uIithO3I7KXJbYV0mJiFyW2FdW25dJiYoKG89dC53cmFwV2l0aEN1cnJlbnRab25lKHJbYV0saSkpW25dPXJbYV0sclthXT1vKSxyPXIucGFyZW50RWxlbWVudH0pLCEwKX0saT0wO2k8ZS5sZW5ndGg7aSsrKW8oaSl9Ci8qKgogICAgICAgICAqIEBsaWNlbnNlCiAgICAgICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAgICAgKgogICAgICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICAgICAqLykodCksdC5wYXRjaENsYXNzKCJYTUxIdHRwUmVxdWVzdCIpLGkmJihmdW5jdGlvbiByKHQsZSl7dmFyIG49dC5nZXRHbG9iYWxPYmplY3RzKCksbz1uLkFERF9FVkVOVF9MSVNURU5FUl9TVFIsaT1uLlJFTU9WRV9FVkVOVF9MSVNURU5FUl9TVFIsYT1lLldlYlNvY2tldDtlLkV2ZW50VGFyZ2V0fHx0LnBhdGNoRXZlbnRUYXJnZXQoZSxbYS5wcm90b3R5cGVdKSxlLldlYlNvY2tldD1mdW5jdGlvbihlLG4pe3ZhciByLHMsbD1hcmd1bWVudHMubGVuZ3RoPjE/bmV3IGEoZSxuKTpuZXcgYShlKSxjPXQuT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGwsIm9ubWVzc2FnZSIpO3JldHVybiBjJiYhMT09PWMuY29uZmlndXJhYmxlPyhyPXQuT2JqZWN0Q3JlYXRlKGwpLHM9bCxbbyxpLCJzZW5kIiwiY2xvc2UiXS5mb3JFYWNoKChmdW5jdGlvbihlKXtyW2VdPWZ1bmN0aW9uKCl7dmFyIG49dC5BcnJheVNsaWNlLmNhbGwoYXJndW1lbnRzKTtpZihlPT09b3x8ZT09PWkpe3ZhciBhPW4ubGVuZ3RoPjA/blswXTp2b2lkIDA7aWYoYSl7dmFyIHM9Wm9uZS5fX3N5bWJvbF9fKCJPTl9QUk9QRVJUWSIrYSk7bFtzXT1yW3NdfX1yZXR1cm4gbFtlXS5hcHBseShsLG4pfX0pKSk6cj1sLHQucGF0Y2hPblByb3BlcnRpZXMocixbImNsb3NlIiwiZXJyb3IiLCJtZXNzYWdlIiwib3BlbiJdLHMpLHJ9O3ZhciByPWUuV2ViU29ja2V0O2Zvcih2YXIgcyBpbiBhKXJbc109YVtzXX0pKHQsZSksWm9uZVt0LnN5bWJvbCgicGF0Y2hFdmVudHMiKV09ITB9fVpvbmUuX19sb2FkX3BhdGNoKCJ1dGlsIiwoZnVuY3Rpb24obixzLGwpe2wucGF0Y2hPblByb3BlcnRpZXM9UyxsLnBhdGNoTWV0aG9kPVIsbC5iaW5kQXJndW1lbnRzPV8sbC5wYXRjaE1hY3JvVGFzaz1BO3ZhciB1PXMuX19zeW1ib2xfXygiQkxBQ0tfTElTVEVEX0VWRU5UUyIpLGY9cy5fX3N5bWJvbF9fKCJVTlBBVENIRURfRVZFTlRTIik7bltmXSYmKG5bdV09bltmXSksblt1XSYmKHNbdV09c1tmXT1uW3VdKSxsLnBhdGNoRXZlbnRQcm90b3R5cGU9cSxsLnBhdGNoRXZlbnRUYXJnZXQ9VyxsLmlzSUVPckVkZ2U9SSxsLk9iamVjdERlZmluZVByb3BlcnR5PWUsbC5PYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I9dCxsLk9iamVjdENyZWF0ZT1vLGwuQXJyYXlTbGljZT1pLGwucGF0Y2hDbGFzcz1FLGwud3JhcFdpdGhDdXJyZW50Wm9uZT1tLGwuZmlsdGVyUHJvcGVydGllcz1kdCxsLmF0dGFjaE9yaWdpblRvUGF0Y2hlZD1ULGwuX3JlZGVmaW5lUHJvcGVydHk9T2JqZWN0LmRlZmluZVByb3BlcnR5LGwucGF0Y2hDYWxsYmFja3M9WixsLmdldEdsb2JhbE9iamVjdHM9ZnVuY3Rpb24oKXtyZXR1cm57Z2xvYmFsU291cmNlczpWLHpvbmVTeW1ib2xFdmVudE5hbWVzOkIsZXZlbnROYW1lczpjdCxpc0Jyb3dzZXI6eCxpc01peDpPLGlzTm9kZTp2LFRSVUVfU1RSOmMsRkFMU0VfU1RSOmQsWk9ORV9TWU1CT0xfUFJFRklYOnAsQUREX0VWRU5UX0xJU1RFTkVSX1NUUjphLFJFTU9WRV9FVkVOVF9MSVNURU5FUl9TVFI6cn19fSkpLAovKioKICAgICAgICAgKiBAbGljZW5zZQogICAgICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgICAgICoKICAgICAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAgICAgKi8KKGZ1bmN0aW9uKHQpe3ZhciBlPXQuX19ab25lX3N5bWJvbF9wcmVmaXh8fCJfX3pvbmVfc3ltYm9sX18iO3RbKGZ1bmN0aW9uIG4odCl7cmV0dXJuIGUrdH0pKCJsZWdhY3lQYXRjaCIpXT1mdW5jdGlvbigpe3ZhciBlPXQuWm9uZTtlLl9fbG9hZF9wYXRjaCgiZGVmaW5lUHJvcGVydHkiLChmdW5jdGlvbih0LGUsbil7bi5fcmVkZWZpbmVQcm9wZXJ0eT1mdCx1dCgpfSkpLGUuX19sb2FkX3BhdGNoKCJyZWdpc3RlckVsZW1lbnQiLChmdW5jdGlvbih0LGUsbil7IShmdW5jdGlvbiBvKHQsZSl7dmFyIG49ZS5nZXRHbG9iYWxPYmplY3RzKCk7KG4uaXNCcm93c2VyfHxuLmlzTWl4KSYmInJlZ2lzdGVyRWxlbWVudCJpbiB0LmRvY3VtZW50JiZlLnBhdGNoQ2FsbGJhY2tzKGUsZG9jdW1lbnQsIkRvY3VtZW50IiwicmVnaXN0ZXJFbGVtZW50IixbImNyZWF0ZWRDYWxsYmFjayIsImF0dGFjaGVkQ2FsbGJhY2siLCJkZXRhY2hlZENhbGxiYWNrIiwiYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrIl0pfSkodCxuKX0pKSxlLl9fbG9hZF9wYXRjaCgiRXZlbnRUYXJnZXRMZWdhY3kiLChmdW5jdGlvbih0LGUsbil7eXQodCxuKSxfdChuLHQpfSkpfX0pKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp2b2lkIDAhPT1Rdj9RdjoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fSk7Ci8qKgogICAgICAgICAqIEBsaWNlbnNlCiAgICAgICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAgICAgKgogICAgICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICAgICAqLwp2YXIgQ3Q9Zigiem9uZVRhc2siKTtmdW5jdGlvbiBNdCh0LGUsbixvKXt2YXIgaT1udWxsLGE9bnVsbDtuKz1vO3ZhciByPXt9O2Z1bmN0aW9uIHMoZSl7dmFyIG49ZS5kYXRhO3JldHVybiBuLmFyZ3NbMF09ZnVuY3Rpb24oKXtyZXR1cm4gZS5pbnZva2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxuLmhhbmRsZUlkPWkuYXBwbHkodCxuLmFyZ3MpLGV9ZnVuY3Rpb24gbChlKXtyZXR1cm4gYS5jYWxsKHQsZS5kYXRhLmhhbmRsZUlkKX1pPVIodCxlKz1vLChmdW5jdGlvbihuKXtyZXR1cm4gZnVuY3Rpb24oaSxhKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYVswXSl7dmFyIGM9e2lzUGVyaW9kaWM6IkludGVydmFsIj09PW8sZGVsYXk6IlRpbWVvdXQiPT09b3x8IkludGVydmFsIj09PW8/YVsxXXx8MDp2b2lkIDAsYXJnczphfSxkPWFbMF07YVswXT1mdW5jdGlvbiB0KCl7dHJ5e3JldHVybiBkLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1maW5hbGx5e2MuaXNQZXJpb2RpY3x8KCJudW1iZXIiPT10eXBlb2YgYy5oYW5kbGVJZD9kZWxldGUgcltjLmhhbmRsZUlkXTpjLmhhbmRsZUlkJiYoYy5oYW5kbGVJZFtDdF09bnVsbCkpfX07dmFyIHA9dShlLGFbMF0sYyxzLGwpO2lmKCFwKXJldHVybiBwO3ZhciBtPXAuZGF0YS5oYW5kbGVJZDtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIG0/clttXT1wOm0mJihtW0N0XT1wKSxtJiZtLnJlZiYmbS51bnJlZiYmImZ1bmN0aW9uIj09dHlwZW9mIG0ucmVmJiYiZnVuY3Rpb24iPT10eXBlb2YgbS51bnJlZiYmKHAucmVmPW0ucmVmLmJpbmQobSkscC51bnJlZj1tLnVucmVmLmJpbmQobSkpLCJudW1iZXIiPT10eXBlb2YgbXx8bT9tOnB9cmV0dXJuIG4uYXBwbHkodCxhKX19KSksYT1SKHQsbiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKG4sbyl7dmFyIGksYT1vWzBdOyJudW1iZXIiPT10eXBlb2YgYT9pPXJbYV06KGk9YSYmYVtDdF0pfHwoaT1hKSxpJiYic3RyaW5nIj09dHlwZW9mIGkudHlwZT8ibm90U2NoZWR1bGVkIiE9PWkuc3RhdGUmJihpLmNhbmNlbEZuJiZpLmRhdGEuaXNQZXJpb2RpY3x8MD09PWkucnVuQ291bnQpJiYoIm51bWJlciI9PXR5cGVvZiBhP2RlbGV0ZSByW2FdOmEmJihhW0N0XT1udWxsKSxpLnpvbmUuY2FuY2VsVGFzayhpKSk6ZS5hcHBseSh0LG8pfX0pKX0KLyoqCiAgICAgICAgICogQGxpY2Vuc2UKICAgICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICAgICAqCiAgICAgICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgICAgICovCi8qKgogICAgICAgICAqIEBsaWNlbnNlCiAgICAgICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAgICAgKgogICAgICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICAgICAqLwpmdW5jdGlvbiB2dCh0LGUpe2lmKCFab25lW2Uuc3ltYm9sKCJwYXRjaEV2ZW50VGFyZ2V0IildKXtmb3IodmFyIG49ZS5nZXRHbG9iYWxPYmplY3RzKCksbz1uLmV2ZW50TmFtZXMsaT1uLnpvbmVTeW1ib2xFdmVudE5hbWVzLGE9bi5UUlVFX1NUUixyPW4uRkFMU0VfU1RSLHM9bi5aT05FX1NZTUJPTF9QUkVGSVgsbD0wO2w8by5sZW5ndGg7bCsrKXt2YXIgYz1vW2xdLGQ9cysoYytyKSxwPXMrKGMrYSk7aVtjXT17fSxpW2NdW3JdPWQsaVtjXVthXT1wfXZhciBtPXQuRXZlbnRUYXJnZXQ7aWYobSYmbS5wcm90b3R5cGUpcmV0dXJuIGUucGF0Y2hFdmVudFRhcmdldCh0LFttJiZtLnByb3RvdHlwZV0pLCEwfX0KLyoqCiAgICAgICAgICogQGxpY2Vuc2UKICAgICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICAgICAqCiAgICAgICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgICAgICovClpvbmUuX19sb2FkX3BhdGNoKCJsZWdhY3kiLChmdW5jdGlvbih0KXt2YXIgZT10W1pvbmUuX19zeW1ib2xfXygibGVnYWN5UGF0Y2giKV07ZSYmZSgpfSkpLFpvbmUuX19sb2FkX3BhdGNoKCJxdWV1ZU1pY3JvdGFzayIsKGZ1bmN0aW9uKHQsZSxuKXtuLnBhdGNoTWV0aG9kKHQsInF1ZXVlTWljcm90YXNrIiwoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7ZS5jdXJyZW50LnNjaGVkdWxlTWljcm9UYXNrKCJxdWV1ZU1pY3JvdGFzayIsblswXSl9fSkpfSkpLFpvbmUuX19sb2FkX3BhdGNoKCJ0aW1lcnMiLChmdW5jdGlvbih0KXt2YXIgZT0ic2V0IixuPSJjbGVhciI7TXQodCxlLG4sIlRpbWVvdXQiKSxNdCh0LGUsbiwiSW50ZXJ2YWwiKSxNdCh0LGUsbiwiSW1tZWRpYXRlIil9KSksWm9uZS5fX2xvYWRfcGF0Y2goInJlcXVlc3RBbmltYXRpb25GcmFtZSIsKGZ1bmN0aW9uKHQpe010KHQsInJlcXVlc3QiLCJjYW5jZWwiLCJBbmltYXRpb25GcmFtZSIpLE10KHQsIm1velJlcXVlc3QiLCJtb3pDYW5jZWwiLCJBbmltYXRpb25GcmFtZSIpLE10KHQsIndlYmtpdFJlcXVlc3QiLCJ3ZWJraXRDYW5jZWwiLCJBbmltYXRpb25GcmFtZSIpfSkpLFpvbmUuX19sb2FkX3BhdGNoKCJibG9ja2luZyIsKGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVsiYWxlcnQiLCJwcm9tcHQiLCJjb25maXJtIl0sbz0wO288bi5sZW5ndGg7bysrKVIodCxuW29dLChmdW5jdGlvbihuLG8saSl7cmV0dXJuIGZ1bmN0aW9uKG8sYSl7cmV0dXJuIGUuY3VycmVudC5ydW4obix0LGEsaSl9fSkpfSkpLFpvbmUuX19sb2FkX3BhdGNoKCJFdmVudFRhcmdldCIsKGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24gbyh0LGUpe2UucGF0Y2hFdmVudFByb3RvdHlwZSh0LGUpfSkodCxuKSx2dCh0LG4pO3ZhciBpPXQuWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDtpJiZpLnByb3RvdHlwZSYmbi5wYXRjaEV2ZW50VGFyZ2V0KHQsW2kucHJvdG90eXBlXSl9KSksWm9uZS5fX2xvYWRfcGF0Y2goIk11dGF0aW9uT2JzZXJ2ZXIiLChmdW5jdGlvbih0LGUsbil7RSgiTXV0YXRpb25PYnNlcnZlciIpLEUoIldlYktpdE11dGF0aW9uT2JzZXJ2ZXIiKX0pKSxab25lLl9fbG9hZF9wYXRjaCgiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLChmdW5jdGlvbih0LGUsbil7RSgiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiKX0pKSxab25lLl9fbG9hZF9wYXRjaCgiRmlsZVJlYWRlciIsKGZ1bmN0aW9uKHQsZSxuKXtFKCJGaWxlUmVhZGVyIil9KSksWm9uZS5fX2xvYWRfcGF0Y2goIm9uX3Byb3BlcnR5IiwoZnVuY3Rpb24odCxlLG4pe210KG4sdCl9KSksWm9uZS5fX2xvYWRfcGF0Y2goImN1c3RvbUVsZW1lbnRzIiwoZnVuY3Rpb24odCxlLG4peyEoZnVuY3Rpb24gbyh0LGUpe3ZhciBuPWUuZ2V0R2xvYmFsT2JqZWN0cygpOyhuLmlzQnJvd3Nlcnx8bi5pc01peCkmJnQuY3VzdG9tRWxlbWVudHMmJiJjdXN0b21FbGVtZW50cyJpbiB0JiZlLnBhdGNoQ2FsbGJhY2tzKGUsdC5jdXN0b21FbGVtZW50cywiY3VzdG9tRWxlbWVudHMiLCJkZWZpbmUiLFsiY29ubmVjdGVkQ2FsbGJhY2siLCJkaXNjb25uZWN0ZWRDYWxsYmFjayIsImFkb3B0ZWRDYWxsYmFjayIsImF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayJdKX0pKHQsbil9KSksWm9uZS5fX2xvYWRfcGF0Y2goIlhIUiIsKGZ1bmN0aW9uKHQsZSl7IShmdW5jdGlvbiBuKHQpe3ZhciBuPXQuWE1MSHR0cFJlcXVlc3Q7aWYobil7dmFyIHA9bi5wcm90b3R5cGUsbT1wW3NdLGc9cFtsXTtpZighbSl7dmFyIGg9dC5YTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0O2lmKGgpe3ZhciBiPWgucHJvdG90eXBlO209YltzXSxnPWJbbF19fXZhciB5PSJyZWFkeXN0YXRlY2hhbmdlIixfPSJzY2hlZHVsZWQiLEM9UihwLCJvcGVuIiwoZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdFtpXT0wPT1lWzJdLHRbY109ZVsxXSxDLmFwcGx5KHQsZSl9fSkpLE09ZigiZmV0Y2hUYXNrQWJvcnRpbmciKSx2PWYoImZldGNoVGFza1NjaGVkdWxpbmciKSx4PVIocCwic2VuZCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7aWYoITA9PT1lLmN1cnJlbnRbdl0pcmV0dXJuIHguYXBwbHkodCxuKTtpZih0W2ldKXJldHVybiB4LmFwcGx5KHQsbik7dmFyIG89e3RhcmdldDp0LHVybDp0W2NdLGlzUGVyaW9kaWM6ITEsYXJnczpuLGFib3J0ZWQ6ITF9LGE9dSgiWE1MSHR0cFJlcXVlc3Quc2VuZCIsdyxvLFAsayk7dCYmITA9PT10W2RdJiYhby5hYm9ydGVkJiZhLnN0YXRlPT09XyYmYS5pbnZva2UoKX19KSksTz1SKHAsImFib3J0IiwoZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCxuKXt2YXIgaT0oZnVuY3Rpb24gYSh0KXtyZXR1cm4gdFtvXX0pKHQpO2lmKGkmJiJzdHJpbmciPT10eXBlb2YgaS50eXBlKXtpZihudWxsPT1pLmNhbmNlbEZufHxpLmRhdGEmJmkuZGF0YS5hYm9ydGVkKXJldHVybjtpLnpvbmUuY2FuY2VsVGFzayhpKX1lbHNlIGlmKCEwPT09ZS5jdXJyZW50W01dKXJldHVybiBPLmFwcGx5KHQsbil9fSkpfWZ1bmN0aW9uIFAodCl7dmFyIG49dC5kYXRhLGk9bi50YXJnZXQ7aVtyXT0hMSxpW2RdPSExO3ZhciBjPWlbYV07bXx8KG09aVtzXSxnPWlbbF0pLGMmJmcuY2FsbChpLHksYyk7dmFyIHA9aVthXT1mdW5jdGlvbigpe2lmKGkucmVhZHlTdGF0ZT09PWkuRE9ORSlpZighbi5hYm9ydGVkJiZpW3JdJiZ0LnN0YXRlPT09Xyl7dmFyIG89aVtlLl9fc3ltYm9sX18oImxvYWRmYWxzZSIpXTtpZigwIT09aS5zdGF0dXMmJm8mJm8ubGVuZ3RoPjApe3ZhciBhPXQuaW52b2tlO3QuaW52b2tlPWZ1bmN0aW9uKCl7Zm9yKHZhciBvPWlbZS5fX3N5bWJvbF9fKCJsb2FkZmFsc2UiKV0scj0wO3I8by5sZW5ndGg7cisrKW9bcl09PT10JiZvLnNwbGljZShyLDEpO24uYWJvcnRlZHx8dC5zdGF0ZSE9PV98fGEuY2FsbCh0KX0sby5wdXNoKHQpfWVsc2UgdC5pbnZva2UoKX1lbHNlIG4uYWJvcnRlZHx8ITEhPT1pW3JdfHwoaVtkXT0hMCl9O3JldHVybiBtLmNhbGwoaSx5LHApLGlbb118fChpW29dPXQpLHguYXBwbHkoaSxuLmFyZ3MpLGlbcl09ITAsdH1mdW5jdGlvbiB3KCl7fWZ1bmN0aW9uIGsodCl7dmFyIGU9dC5kYXRhO3JldHVybiBlLmFib3J0ZWQ9ITAsTy5hcHBseShlLnRhcmdldCxlLmFyZ3MpfX0pKHQpO3ZhciBvPWYoInhoclRhc2siKSxpPWYoInhoclN5bmMiKSxhPWYoInhockxpc3RlbmVyIikscj1mKCJ4aHJTY2hlZHVsZWQiKSxjPWYoInhoclVSTCIpLGQ9ZigieGhyRXJyb3JCZWZvcmVTY2hlZHVsZWQiKX0pKSxab25lLl9fbG9hZF9wYXRjaCgiZ2VvbG9jYXRpb24iLChmdW5jdGlvbihlKXtlLm5hdmlnYXRvciYmZS5uYXZpZ2F0b3IuZ2VvbG9jYXRpb24mJihmdW5jdGlvbiBuKGUsbyl7Zm9yKHZhciBpPWUuY29uc3RydWN0b3IubmFtZSxhPWZ1bmN0aW9uKG4pe3ZhciBhPW9bbl0scj1lW2FdO2lmKHIpe2lmKCFDKHQoZSxhKSkpcmV0dXJuImNvbnRpbnVlIjtlW2FdPShmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KHRoaXMsXyhhcmd1bWVudHMsaSsiLiIrYSkpfTtyZXR1cm4gVChlLHQpLGV9KShyKX19LHI9MDtyPG8ubGVuZ3RoO3IrKylhKHIpfSkoZS5uYXZpZ2F0b3IuZ2VvbG9jYXRpb24sWyJnZXRDdXJyZW50UG9zaXRpb24iLCJ3YXRjaFBvc2l0aW9uIl0pfSkpLFpvbmUuX19sb2FkX3BhdGNoKCJQcm9taXNlUmVqZWN0aW9uRXZlbnQiLChmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe1kodCxlKS5mb3JFYWNoKChmdW5jdGlvbihvKXt2YXIgaT10LlByb21pc2VSZWplY3Rpb25FdmVudDtpZihpKXt2YXIgYT1uZXcgaShlLHtwcm9taXNlOm4ucHJvbWlzZSxyZWFzb246bi5yZWplY3Rpb259KTtvLmludm9rZShhKX19KSl9fXQuUHJvbWlzZVJlamVjdGlvbkV2ZW50JiYoZVtmKCJ1bmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uSGFuZGxlciIpXT1uKCJ1bmhhbmRsZWRyZWplY3Rpb24iKSxlW2YoInJlamVjdGlvbkhhbmRsZWRIYW5kbGVyIildPW4oInJlamVjdGlvbmhhbmRsZWQiKSl9KSl9KSgpOwovKioKICAgICAqIEBsaWNlbnNlIEFuZ3VsYXIgdjEyLjIuMQogICAgICogKGMpIDIwMTAtMjAyMSBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vCiAgICAgKiBMaWNlbnNlOiBNSVQKICAgICAqLwpjbGFzcyB0eHt9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBleD0iKiI7ZnVuY3Rpb24gbngodCxlKXtyZXR1cm57dHlwZTo3LG5hbWU6dCxkZWZpbml0aW9uczplLG9wdGlvbnM6e319fWZ1bmN0aW9uIG94KHQsZT1udWxsKXtyZXR1cm57dHlwZTo0LHN0eWxlczplLHRpbWluZ3M6dH19ZnVuY3Rpb24gaXgodCxlPW51bGwpe3JldHVybnt0eXBlOjIsc3RlcHM6dCxvcHRpb25zOmV9fWZ1bmN0aW9uIGF4KHQpe3JldHVybnt0eXBlOjYsc3R5bGVzOnQsb2Zmc2V0Om51bGx9fWZ1bmN0aW9uIHJ4KHQsZSxuKXtyZXR1cm57dHlwZTowLG5hbWU6dCxzdHlsZXM6ZSxvcHRpb25zOm59fWZ1bmN0aW9uIHN4KHQpe3JldHVybnt0eXBlOjUsc3RlcHM6dH19ZnVuY3Rpb24gbHgodCxlLG49bnVsbCl7cmV0dXJue3R5cGU6MSxleHByOnQsYW5pbWF0aW9uOmUsb3B0aW9uczpufX1mdW5jdGlvbiBjeCh0PW51bGwpe3JldHVybnt0eXBlOjksb3B0aW9uczp0fX1mdW5jdGlvbiBkeCh0LGUsbj1udWxsKXtyZXR1cm57dHlwZToxMSxzZWxlY3Rvcjp0LGFuaW1hdGlvbjplLG9wdGlvbnM6bn19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIHB4KHQpe1Byb21pc2UucmVzb2x2ZShudWxsKS50aGVuKHQpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBteHtjb25zdHJ1Y3Rvcih0PTAsZT0wKXt0aGlzLl9vbkRvbmVGbnM9W10sdGhpcy5fb25TdGFydEZucz1bXSx0aGlzLl9vbkRlc3Ryb3lGbnM9W10sdGhpcy5fc3RhcnRlZD0hMSx0aGlzLl9kZXN0cm95ZWQ9ITEsdGhpcy5fZmluaXNoZWQ9ITEsdGhpcy5fcG9zaXRpb249MCx0aGlzLnBhcmVudFBsYXllcj1udWxsLHRoaXMudG90YWxUaW1lPXQrZX1fb25GaW5pc2goKXt0aGlzLl9maW5pc2hlZHx8KHRoaXMuX2ZpbmlzaGVkPSEwLHRoaXMuX29uRG9uZUZucy5mb3JFYWNoKCh0PT50KCkpKSx0aGlzLl9vbkRvbmVGbnM9W10pfW9uU3RhcnQodCl7dGhpcy5fb25TdGFydEZucy5wdXNoKHQpfW9uRG9uZSh0KXt0aGlzLl9vbkRvbmVGbnMucHVzaCh0KX1vbkRlc3Ryb3kodCl7dGhpcy5fb25EZXN0cm95Rm5zLnB1c2godCl9aGFzU3RhcnRlZCgpe3JldHVybiB0aGlzLl9zdGFydGVkfWluaXQoKXt9cGxheSgpe3RoaXMuaGFzU3RhcnRlZCgpfHwodGhpcy5fb25TdGFydCgpLHRoaXMudHJpZ2dlck1pY3JvdGFzaygpKSx0aGlzLl9zdGFydGVkPSEwfXRyaWdnZXJNaWNyb3Rhc2soKXtweCgoKCk9PnRoaXMuX29uRmluaXNoKCkpKX1fb25TdGFydCgpe3RoaXMuX29uU3RhcnRGbnMuZm9yRWFjaCgodD0+dCgpKSksdGhpcy5fb25TdGFydEZucz1bXX1wYXVzZSgpe31yZXN0YXJ0KCl7fWZpbmlzaCgpe3RoaXMuX29uRmluaXNoKCl9ZGVzdHJveSgpe3RoaXMuX2Rlc3Ryb3llZHx8KHRoaXMuX2Rlc3Ryb3llZD0hMCx0aGlzLmhhc1N0YXJ0ZWQoKXx8dGhpcy5fb25TdGFydCgpLHRoaXMuZmluaXNoKCksdGhpcy5fb25EZXN0cm95Rm5zLmZvckVhY2goKHQ9PnQoKSkpLHRoaXMuX29uRGVzdHJveUZucz1bXSl9cmVzZXQoKXt0aGlzLl9zdGFydGVkPSExfXNldFBvc2l0aW9uKHQpe3RoaXMuX3Bvc2l0aW9uPXRoaXMudG90YWxUaW1lP3QqdGhpcy50b3RhbFRpbWU6MX1nZXRQb3NpdGlvbigpe3JldHVybiB0aGlzLnRvdGFsVGltZT90aGlzLl9wb3NpdGlvbi90aGlzLnRvdGFsVGltZToxfXRyaWdnZXJDYWxsYmFjayh0KXtjb25zdCBlPSJzdGFydCI9PXQ/dGhpcy5fb25TdGFydEZuczp0aGlzLl9vbkRvbmVGbnM7ZS5mb3JFYWNoKCh0PT50KCkpKSxlLmxlbmd0aD0wfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgdXh7Y29uc3RydWN0b3IodCl7dGhpcy5fb25Eb25lRm5zPVtdLHRoaXMuX29uU3RhcnRGbnM9W10sdGhpcy5fZmluaXNoZWQ9ITEsdGhpcy5fc3RhcnRlZD0hMSx0aGlzLl9kZXN0cm95ZWQ9ITEsdGhpcy5fb25EZXN0cm95Rm5zPVtdLHRoaXMucGFyZW50UGxheWVyPW51bGwsdGhpcy50b3RhbFRpbWU9MCx0aGlzLnBsYXllcnM9dDtsZXQgZT0wLG49MCxvPTA7Y29uc3QgaT10aGlzLnBsYXllcnMubGVuZ3RoOzA9PWk/cHgoKCgpPT50aGlzLl9vbkZpbmlzaCgpKSk6dGhpcy5wbGF5ZXJzLmZvckVhY2goKHQ9Pnt0Lm9uRG9uZSgoKCk9PnsrK2U9PWkmJnRoaXMuX29uRmluaXNoKCl9KSksdC5vbkRlc3Ryb3koKCgpPT57KytuPT1pJiZ0aGlzLl9vbkRlc3Ryb3koKX0pKSx0Lm9uU3RhcnQoKCgpPT57KytvPT1pJiZ0aGlzLl9vblN0YXJ0KCl9KSl9KSksdGhpcy50b3RhbFRpbWU9dGhpcy5wbGF5ZXJzLnJlZHVjZSgoKHQsZSk9Pk1hdGgubWF4KHQsZS50b3RhbFRpbWUpKSwwKX1fb25GaW5pc2goKXt0aGlzLl9maW5pc2hlZHx8KHRoaXMuX2ZpbmlzaGVkPSEwLHRoaXMuX29uRG9uZUZucy5mb3JFYWNoKCh0PT50KCkpKSx0aGlzLl9vbkRvbmVGbnM9W10pfWluaXQoKXt0aGlzLnBsYXllcnMuZm9yRWFjaCgodD0+dC5pbml0KCkpKX1vblN0YXJ0KHQpe3RoaXMuX29uU3RhcnRGbnMucHVzaCh0KX1fb25TdGFydCgpe3RoaXMuaGFzU3RhcnRlZCgpfHwodGhpcy5fc3RhcnRlZD0hMCx0aGlzLl9vblN0YXJ0Rm5zLmZvckVhY2goKHQ9PnQoKSkpLHRoaXMuX29uU3RhcnRGbnM9W10pfW9uRG9uZSh0KXt0aGlzLl9vbkRvbmVGbnMucHVzaCh0KX1vbkRlc3Ryb3kodCl7dGhpcy5fb25EZXN0cm95Rm5zLnB1c2godCl9aGFzU3RhcnRlZCgpe3JldHVybiB0aGlzLl9zdGFydGVkfXBsYXkoKXt0aGlzLnBhcmVudFBsYXllcnx8dGhpcy5pbml0KCksdGhpcy5fb25TdGFydCgpLHRoaXMucGxheWVycy5mb3JFYWNoKCh0PT50LnBsYXkoKSkpfXBhdXNlKCl7dGhpcy5wbGF5ZXJzLmZvckVhY2goKHQ9PnQucGF1c2UoKSkpfXJlc3RhcnQoKXt0aGlzLnBsYXllcnMuZm9yRWFjaCgodD0+dC5yZXN0YXJ0KCkpKX1maW5pc2goKXt0aGlzLl9vbkZpbmlzaCgpLHRoaXMucGxheWVycy5mb3JFYWNoKCh0PT50LmZpbmlzaCgpKSl9ZGVzdHJveSgpe3RoaXMuX29uRGVzdHJveSgpfV9vbkRlc3Ryb3koKXt0aGlzLl9kZXN0cm95ZWR8fCh0aGlzLl9kZXN0cm95ZWQ9ITAsdGhpcy5fb25GaW5pc2goKSx0aGlzLnBsYXllcnMuZm9yRWFjaCgodD0+dC5kZXN0cm95KCkpKSx0aGlzLl9vbkRlc3Ryb3lGbnMuZm9yRWFjaCgodD0+dCgpKSksdGhpcy5fb25EZXN0cm95Rm5zPVtdKX1yZXNldCgpe3RoaXMucGxheWVycy5mb3JFYWNoKCh0PT50LnJlc2V0KCkpKSx0aGlzLl9kZXN0cm95ZWQ9ITEsdGhpcy5fZmluaXNoZWQ9ITEsdGhpcy5fc3RhcnRlZD0hMX1zZXRQb3NpdGlvbih0KXtjb25zdCBlPXQqdGhpcy50b3RhbFRpbWU7dGhpcy5wbGF5ZXJzLmZvckVhY2goKHQ9Pntjb25zdCBuPXQudG90YWxUaW1lP01hdGgubWluKDEsZS90LnRvdGFsVGltZSk6MTt0LnNldFBvc2l0aW9uKG4pfSkpfWdldFBvc2l0aW9uKCl7Y29uc3QgdD10aGlzLnBsYXllcnMucmVkdWNlKCgodCxlKT0+bnVsbD09PXR8fGUudG90YWxUaW1lPnQudG90YWxUaW1lP2U6dCksbnVsbCk7cmV0dXJuIG51bGwhPXQ/dC5nZXRQb3NpdGlvbigpOjB9YmVmb3JlRGVzdHJveSgpe3RoaXMucGxheWVycy5mb3JFYWNoKCh0PT57dC5iZWZvcmVEZXN0cm95JiZ0LmJlZm9yZURlc3Ryb3koKX0pKX10cmlnZ2VyQ2FsbGJhY2sodCl7Y29uc3QgZT0ic3RhcnQiPT10P3RoaXMuX29uU3RhcnRGbnM6dGhpcy5fb25Eb25lRm5zO2UuZm9yRWFjaCgodD0+dCgpKSksZS5sZW5ndGg9MH19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwovKioKICAgICAqIEBsaWNlbnNlIEFuZ3VsYXIgdjEyLjIuMQogICAgICogKGMpIDIwMTAtMjAyMSBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vCiAgICAgKiBMaWNlbnNlOiBNSVQKICAgICAqLwpmdW5jdGlvbiBmeCgpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ2b2lkIDAhPT13aW5kb3cuZG9jdW1lbnR9ZnVuY3Rpb24gZ3goKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHByb2Nlc3MmJiJbb2JqZWN0IHByb2Nlc3NdIj09PXt9LnRvU3RyaW5nLmNhbGwocHJvY2Vzcyl9ZnVuY3Rpb24gaHgodCl7c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyBteDtjYXNlIDE6cmV0dXJuIHRbMF07ZGVmYXVsdDpyZXR1cm4gbmV3IHV4KHQpfX1mdW5jdGlvbiBieCh0LGUsbixvLGk9e30sYT17fSl7Y29uc3Qgcj1bXSxzPVtdO2xldCBsPS0xLGM9bnVsbDtpZihvLmZvckVhY2goKHQ9Pntjb25zdCBuPXQub2Zmc2V0LG89bj09bCxkPW8mJmN8fHt9O09iamVjdC5rZXlzKHQpLmZvckVhY2goKG49PntsZXQgbz1uLHM9dFtuXTtpZigib2Zmc2V0IiE9PW4pc3dpdGNoKG89ZS5ub3JtYWxpemVQcm9wZXJ0eU5hbWUobyxyKSxzKXtjYXNlIiEiOnM9aVtuXTticmVhaztjYXNlIGV4OnM9YVtuXTticmVhaztkZWZhdWx0OnM9ZS5ub3JtYWxpemVTdHlsZVZhbHVlKG4sbyxzLHIpfWRbb109c30pKSxvfHxzLnB1c2goZCksYz1kLGw9bn0pKSxyLmxlbmd0aCl7Y29uc3QgdD0iXG4gLSAiO3Rocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGFuaW1hdGUgZHVlIHRvIHRoZSBmb2xsb3dpbmcgZXJyb3JzOiR7dH0ke3Iuam9pbih0KX1gKX1yZXR1cm4gc31mdW5jdGlvbiB5eCh0LGUsbixvKXtzd2l0Y2goZSl7Y2FzZSJzdGFydCI6dC5vblN0YXJ0KCgoKT0+byhuJiZfeChuLCJzdGFydCIsdCkpKSk7YnJlYWs7Y2FzZSJkb25lIjp0Lm9uRG9uZSgoKCk9Pm8obiYmX3gobiwiZG9uZSIsdCkpKSk7YnJlYWs7Y2FzZSJkZXN0cm95Ijp0Lm9uRGVzdHJveSgoKCk9Pm8obiYmX3gobiwiZGVzdHJveSIsdCkpKSl9fWZ1bmN0aW9uIF94KHQsZSxuKXtjb25zdCBvPW4udG90YWxUaW1lLGk9Q3godC5lbGVtZW50LHQudHJpZ2dlck5hbWUsdC5mcm9tU3RhdGUsdC50b1N0YXRlLGV8fHQucGhhc2VOYW1lLG51bGw9PW8/dC50b3RhbFRpbWU6bywhIW4uZGlzYWJsZWQpLGE9dC5fZGF0YTtyZXR1cm4gbnVsbCE9YSYmKGkuX2RhdGE9YSksaX1mdW5jdGlvbiBDeCh0LGUsbixvLGk9IiIsYT0wLHIpe3JldHVybntlbGVtZW50OnQsdHJpZ2dlck5hbWU6ZSxmcm9tU3RhdGU6bix0b1N0YXRlOm8scGhhc2VOYW1lOmksdG90YWxUaW1lOmEsZGlzYWJsZWQ6ISFyfX1mdW5jdGlvbiBNeCh0LGUsbil7bGV0IG87cmV0dXJuIHQgaW5zdGFuY2VvZiBNYXA/KG89dC5nZXQoZSksb3x8dC5zZXQoZSxvPW4pKToobz10W2VdLG98fChvPXRbZV09bikpLG99ZnVuY3Rpb24gdngodCl7Y29uc3QgZT10LmluZGV4T2YoIjoiKTtyZXR1cm5bdC5zdWJzdHJpbmcoMSxlKSx0LnN1YnN0cihlKzEpXX1sZXQgeHg9KHQsZSk9PiExLE94PSh0LGUpPT4hMSxQeD0odCxlLG4pPT5bXTtjb25zdCB3eD1neCgpOyh3eHx8InVuZGVmaW5lZCIhPXR5cGVvZiBFbGVtZW50KSYmKHh4PWZ4KCk/KHQsZSk9Pntmb3IoO2UmJmUhPT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7KXtpZihlPT09dClyZXR1cm4hMDtlPWUucGFyZW50Tm9kZXx8ZS5ob3N0fXJldHVybiExfToodCxlKT0+dC5jb250YWlucyhlKSxPeD0oKCk9PntpZih3eHx8RWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcylyZXR1cm4odCxlKT0+dC5tYXRjaGVzKGUpO3tjb25zdCB0PUVsZW1lbnQucHJvdG90eXBlLGU9dC5tYXRjaGVzU2VsZWN0b3J8fHQubW96TWF0Y2hlc1NlbGVjdG9yfHx0Lm1zTWF0Y2hlc1NlbGVjdG9yfHx0Lm9NYXRjaGVzU2VsZWN0b3J8fHQud2Via2l0TWF0Y2hlc1NlbGVjdG9yO3JldHVybiBlPyh0LG4pPT5lLmFwcGx5KHQsW25dKTpPeH19KSgpLFB4PSh0LGUsbik9PntsZXQgbz1bXTtpZihuKXtjb25zdCBuPXQucXVlcnlTZWxlY3RvckFsbChlKTtmb3IobGV0IHQ9MDt0PG4ubGVuZ3RoO3QrKylvLnB1c2goblt0XSl9ZWxzZXtjb25zdCBuPXQucXVlcnlTZWxlY3RvcihlKTtuJiZvLnB1c2gobil9cmV0dXJuIG99KTtsZXQga3g9bnVsbCxTeD0hMTtmdW5jdGlvbiBEeCh0KXtreHx8KGt4PShmdW5jdGlvbiBlKCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudD9kb2N1bWVudC5ib2R5Om51bGx9KSgpfHx7fSxTeD0hIWt4LnN0eWxlJiYiV2Via2l0QXBwZWFyYW5jZSJpbiBreC5zdHlsZSk7bGV0IG49ITA7cmV0dXJuIGt4LnN0eWxlJiYhKGZ1bmN0aW9uIG8odCl7cmV0dXJuImVia2l0Ij09dC5zdWJzdHJpbmcoMSw2KX0pKHQpJiYobj10IGluIGt4LnN0eWxlLCFuJiZTeCkmJihuPSJXZWJraXQiK3QuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHIoMSlpbiBreC5zdHlsZSksbn1jb25zdCBFeD1PeCxSeD14eCxBeD1QeDtmdW5jdGlvbiBUeCh0KXtjb25zdCBlPXt9O3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChuPT57Y29uc3Qgbz1uLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csIiQxLSQyIik7ZVtvXT10W25dfSkpLGV9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIE54e3ZhbGlkYXRlU3R5bGVQcm9wZXJ0eSh0KXtyZXR1cm4gRHgodCl9bWF0Y2hlc0VsZW1lbnQodCxlKXtyZXR1cm4gRXgodCxlKX1jb250YWluc0VsZW1lbnQodCxlKXtyZXR1cm4gUngodCxlKX1xdWVyeSh0LGUsbil7cmV0dXJuIEF4KHQsZSxuKX1jb21wdXRlU3R5bGUodCxlLG4pe3JldHVybiBufHwiIn1hbmltYXRlKHQsZSxuLG8saSxhPVtdLHIpe3JldHVybiBuZXcgbXgobixvKX19TnguybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fE54KX0sTnguybVwcm92PU1uKHt0b2tlbjpOeCxmYWN0b3J5Ok54Lsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChOeCxbe3R5cGU6aW19XSxudWxsLG51bGwpO2NsYXNzIHp4e316eC5OT09QPW5ldyBOeDsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IEl4PSJuZy1lbnRlciIsSHg9Im5nLWxlYXZlIixGeD0ibmctdHJpZ2dlciIsTHg9Ii5uZy10cmlnZ2VyIixCeD0ibmctYW5pbWF0aW5nIixWeD0iLm5nLWFuaW1hdGluZyI7ZnVuY3Rpb24gangodCl7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiB0O2NvbnN0IGU9dC5tYXRjaCgvXigtP1tcLlxkXSspKG0/cykvKTtyZXR1cm4hZXx8ZS5sZW5ndGg8Mj8wOlV4KHBhcnNlRmxvYXQoZVsxXSksZVsyXSl9ZnVuY3Rpb24gVXgodCxlKXtzd2l0Y2goZSl7Y2FzZSJzIjpyZXR1cm4gMWUzKnQ7ZGVmYXVsdDpyZXR1cm4gdH19ZnVuY3Rpb24gR3godCxlLG4pe3JldHVybiB0Lmhhc093blByb3BlcnR5KCJkdXJhdGlvbiIpP3Q6KGZ1bmN0aW9uIG8odCxlLG4pe2xldCBvLGk9MCxhPSIiO2lmKCJzdHJpbmciPT10eXBlb2YgdCl7Y29uc3Qgbj10Lm1hdGNoKC9eKC0/W1wuXGRdKykobT9zKSg/OlxzKygtP1tcLlxkXSspKG0/cykpPyg/OlxzKyhbLWEtel0rKD86XCguKz9cKSk/KSk/JC9pKTtpZihudWxsPT09bilyZXR1cm4gZS5wdXNoKGBUaGUgcHJvdmlkZWQgdGltaW5nIHZhbHVlICIke3R9IiBpcyBpbnZhbGlkLmApLHtkdXJhdGlvbjowLGRlbGF5OjAsZWFzaW5nOiIifTtvPVV4KHBhcnNlRmxvYXQoblsxXSksblsyXSk7Y29uc3Qgcj1uWzNdO251bGwhPXImJihpPVV4KHBhcnNlRmxvYXQociksbls0XSkpO2NvbnN0IHM9bls1XTtzJiYoYT1zKX1lbHNlIG89dDtpZighbil7bGV0IG49ITEsYT1lLmxlbmd0aDtvPDAmJihlLnB1c2goIkR1cmF0aW9uIHZhbHVlcyBiZWxvdyAwIGFyZSBub3QgYWxsb3dlZCBmb3IgdGhpcyBhbmltYXRpb24gc3RlcC4iKSxuPSEwKSxpPDAmJihlLnB1c2goIkRlbGF5IHZhbHVlcyBiZWxvdyAwIGFyZSBub3QgYWxsb3dlZCBmb3IgdGhpcyBhbmltYXRpb24gc3RlcC4iKSxuPSEwKSxuJiZlLnNwbGljZShhLDAsYFRoZSBwcm92aWRlZCB0aW1pbmcgdmFsdWUgIiR7dH0iIGlzIGludmFsaWQuYCl9cmV0dXJue2R1cmF0aW9uOm8sZGVsYXk6aSxlYXNpbmc6YX19KSh0LGUsbil9ZnVuY3Rpb24gV3godCxlPXt9KXtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaCgobj0+e2Vbbl09dFtuXX0pKSxlfWZ1bmN0aW9uIFl4KHQsZSxuPXt9KXtpZihlKWZvcihsZXQgZSBpbiB0KW5bZV09dFtlXTtlbHNlIFd4KHQsbik7cmV0dXJuIG59ZnVuY3Rpb24gcXgodCxlLG4pe3JldHVybiBuP2UrIjoiK24rIjsiOiIifWZ1bmN0aW9uIFp4KHQpe2xldCBlPSIiO2ZvcihsZXQgbj0wO248dC5zdHlsZS5sZW5ndGg7bisrKXtjb25zdCBvPXQuc3R5bGUuaXRlbShuKTtlKz1xeCgwLG8sdC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG8pKX1mb3IoY29uc3QgbiBpbiB0LnN0eWxlKXQuc3R5bGUuaGFzT3duUHJvcGVydHkobikmJiFuLnN0YXJ0c1dpdGgoIl8iKSYmKGUrPXF4KDAsbi5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCIkMS0kMiIpLnRvTG93ZXJDYXNlKCksdC5zdHlsZVtuXSkpO3Quc2V0QXR0cmlidXRlKCJzdHlsZSIsZSl9ZnVuY3Rpb24gWHgodCxlLG4pe3Quc3R5bGUmJihPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChvPT57Y29uc3QgaT1vTyhvKTtuJiYhbi5oYXNPd25Qcm9wZXJ0eShvKSYmKG5bb109dC5zdHlsZVtpXSksdC5zdHlsZVtpXT1lW29dfSkpLGd4KCkmJlp4KHQpKX1mdW5jdGlvbiBLeCh0LGUpe3Quc3R5bGUmJihPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChlPT57Y29uc3Qgbj1vTyhlKTt0LnN0eWxlW25dPSIifSkpLGd4KCkmJlp4KHQpKX1mdW5jdGlvbiBKeCh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT8xPT10Lmxlbmd0aD90WzBdOml4KHQpOnR9Y29uc3QgUXg9bmV3IFJlZ0V4cCgie3tcXHMqKC4rPylcXHMqfX0iLCJnIik7ZnVuY3Rpb24gJHgodCl7bGV0IGU9W107aWYoInN0cmluZyI9PXR5cGVvZiB0KXtsZXQgbjtmb3IoO249UXguZXhlYyh0KTspZS5wdXNoKG5bMV0pO1F4Lmxhc3RJbmRleD0wfXJldHVybiBlfWZ1bmN0aW9uIHRPKHQsZSxuKXtjb25zdCBvPXQudG9TdHJpbmcoKSxpPW8ucmVwbGFjZShReCwoKHQsbyk9PntsZXQgaT1lW29dO3JldHVybiBlLmhhc093blByb3BlcnR5KG8pfHwobi5wdXNoKGBQbGVhc2UgcHJvdmlkZSBhIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uIHBhcmFtICR7b31gKSxpPSIiKSxpLnRvU3RyaW5nKCl9KSk7cmV0dXJuIGk9PW8/dDppfWZ1bmN0aW9uIGVPKHQpe2NvbnN0IGU9W107bGV0IG49dC5uZXh0KCk7Zm9yKDshbi5kb25lOyllLnB1c2gobi52YWx1ZSksbj10Lm5leHQoKTtyZXR1cm4gZX1jb25zdCBuTz0vLSsoW2EtejAtOV0pL2c7ZnVuY3Rpb24gb08odCl7cmV0dXJuIHQucmVwbGFjZShuTywoKC4uLnQpPT50WzFdLnRvVXBwZXJDYXNlKCkpKX1mdW5jdGlvbiBpTyh0LGUpe3JldHVybiAwPT09dHx8MD09PWV9ZnVuY3Rpb24gYU8odCxlLG4pe2NvbnN0IG89T2JqZWN0LmtleXMobik7aWYoby5sZW5ndGgmJmUubGVuZ3RoKXtsZXQgYT1lWzBdLHI9W107aWYoby5mb3JFYWNoKCh0PT57YS5oYXNPd25Qcm9wZXJ0eSh0KXx8ci5wdXNoKHQpLGFbdF09blt0XX0pKSxyLmxlbmd0aClmb3IodmFyIGk9MTtpPGUubGVuZ3RoO2krKyl7bGV0IG49ZVtpXTtyLmZvckVhY2goKGZ1bmN0aW9uKGUpe25bZV09c08odCxlKX0pKX19cmV0dXJuIGV9ZnVuY3Rpb24gck8odCxlLG4pe3N3aXRjaChlLnR5cGUpe2Nhc2UgNzpyZXR1cm4gdC52aXNpdFRyaWdnZXIoZSxuKTtjYXNlIDA6cmV0dXJuIHQudmlzaXRTdGF0ZShlLG4pO2Nhc2UgMTpyZXR1cm4gdC52aXNpdFRyYW5zaXRpb24oZSxuKTtjYXNlIDI6cmV0dXJuIHQudmlzaXRTZXF1ZW5jZShlLG4pO2Nhc2UgMzpyZXR1cm4gdC52aXNpdEdyb3VwKGUsbik7Y2FzZSA0OnJldHVybiB0LnZpc2l0QW5pbWF0ZShlLG4pO2Nhc2UgNTpyZXR1cm4gdC52aXNpdEtleWZyYW1lcyhlLG4pO2Nhc2UgNjpyZXR1cm4gdC52aXNpdFN0eWxlKGUsbik7Y2FzZSA4OnJldHVybiB0LnZpc2l0UmVmZXJlbmNlKGUsbik7Y2FzZSA5OnJldHVybiB0LnZpc2l0QW5pbWF0ZUNoaWxkKGUsbik7Y2FzZSAxMDpyZXR1cm4gdC52aXNpdEFuaW1hdGVSZWYoZSxuKTtjYXNlIDExOnJldHVybiB0LnZpc2l0UXVlcnkoZSxuKTtjYXNlIDEyOnJldHVybiB0LnZpc2l0U3RhZ2dlcihlLG4pO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcmVzb2x2ZSBhbmltYXRpb24gbWV0YWRhdGEgbm9kZSAjJHtlLnR5cGV9YCl9fWZ1bmN0aW9uIHNPKHQsZSl7cmV0dXJuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpW2VdfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCBsTz0iKiI7ZnVuY3Rpb24gY08odCxlKXtjb25zdCBuPVtdO3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90LnNwbGl0KC9ccyosXHMqLykuZm9yRWFjaCgodD0+KGZ1bmN0aW9uIG8odCxlLG4pe2lmKCI6Ij09dFswXSl7Y29uc3Qgbz0oZnVuY3Rpb24gbyh0LGUpe3N3aXRjaCh0KXtjYXNlIjplbnRlciI6cmV0dXJuInZvaWQgPT4gKiI7Y2FzZSI6bGVhdmUiOnJldHVybiIqID0+IHZvaWQiO2Nhc2UiOmluY3JlbWVudCI6cmV0dXJuKHQsZSk9PnBhcnNlRmxvYXQoZSk+cGFyc2VGbG9hdCh0KTtjYXNlIjpkZWNyZW1lbnQiOnJldHVybih0LGUpPT5wYXJzZUZsb2F0KGUpPHBhcnNlRmxvYXQodCk7ZGVmYXVsdDpyZXR1cm4gZS5wdXNoKGBUaGUgdHJhbnNpdGlvbiBhbGlhcyB2YWx1ZSAiJHt0fSIgaXMgbm90IHN1cHBvcnRlZGApLCIqID0+ICoifX0pKHQsbik7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG8pcmV0dXJuIHZvaWQgZS5wdXNoKG8pO3Q9b31jb25zdCBpPXQubWF0Y2goL14oXCp8Wy1cd10rKVxzKig8P1s9LV0+KVxzKihcKnxbLVx3XSspJC8pO2lmKG51bGw9PWl8fGkubGVuZ3RoPDQpcmV0dXJuIG4ucHVzaChgVGhlIHByb3ZpZGVkIHRyYW5zaXRpb24gZXhwcmVzc2lvbiAiJHt0fSIgaXMgbm90IHN1cHBvcnRlZGApLGU7Y29uc3QgYT1pWzFdLHI9aVsyXSxzPWlbM107ZS5wdXNoKG1PKGEscykpLCI8IiE9clswXXx8YT09bE8mJnM9PWxPfHxlLnB1c2gobU8ocyxhKSl9KSh0LG4sZSkpKTpuLnB1c2godCksbn1jb25zdCBkTz1uZXcgU2V0KFsidHJ1ZSIsIjEiXSkscE89bmV3IFNldChbImZhbHNlIiwiMCJdKTtmdW5jdGlvbiBtTyh0LGUpe2NvbnN0IG49ZE8uaGFzKHQpfHxwTy5oYXModCksbz1kTy5oYXMoZSl8fHBPLmhhcyhlKTtyZXR1cm4oaSxhKT0+e2xldCByPXQ9PWxPfHx0PT1pLHM9ZT09bE98fGU9PWE7cmV0dXJuIXImJm4mJiJib29sZWFuIj09dHlwZW9mIGkmJihyPWk/ZE8uaGFzKHQpOnBPLmhhcyh0KSksIXMmJm8mJiJib29sZWFuIj09dHlwZW9mIGEmJihzPWE/ZE8uaGFzKGUpOnBPLmhhcyhlKSksciYmc319Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NvbnN0IHVPPW5ldyBSZWdFeHAoInMqOnNlbGZzKiw/IiwiZyIpO2Z1bmN0aW9uIGZPKHQsZSxuKXtyZXR1cm4gbmV3IGdPKHQpLmJ1aWxkKGUsbil9Y2xhc3MgZ097Y29uc3RydWN0b3IodCl7dGhpcy5fZHJpdmVyPXR9YnVpbGQodCxlKXtjb25zdCBuPW5ldyBoTyhlKTtyZXR1cm4gdGhpcy5fcmVzZXRDb250ZXh0U3R5bGVUaW1pbmdTdGF0ZShuKSxyTyh0aGlzLEp4KHQpLG4pfV9yZXNldENvbnRleHRTdHlsZVRpbWluZ1N0YXRlKHQpe3QuY3VycmVudFF1ZXJ5U2VsZWN0b3I9IiIsdC5jb2xsZWN0ZWRTdHlsZXM9e30sdC5jb2xsZWN0ZWRTdHlsZXNbIiJdPXt9LHQuY3VycmVudFRpbWU9MH12aXNpdFRyaWdnZXIodCxlKXtsZXQgbj1lLnF1ZXJ5Q291bnQ9MCxvPWUuZGVwQ291bnQ9MDtjb25zdCBpPVtdLGE9W107cmV0dXJuIkAiPT10Lm5hbWUuY2hhckF0KDApJiZlLmVycm9ycy5wdXNoKCJhbmltYXRpb24gdHJpZ2dlcnMgY2Fubm90IGJlIHByZWZpeGVkIHdpdGggYW4gYEBgIHNpZ24gKGUuZy4gdHJpZ2dlcignQGZvbycsIFsuLi5dKSkiKSx0LmRlZmluaXRpb25zLmZvckVhY2goKHQ9PntpZih0aGlzLl9yZXNldENvbnRleHRTdHlsZVRpbWluZ1N0YXRlKGUpLDA9PXQudHlwZSl7Y29uc3Qgbj10LG89bi5uYW1lO28udG9TdHJpbmcoKS5zcGxpdCgvXHMqLFxzKi8pLmZvckVhY2goKHQ9PntuLm5hbWU9dCxpLnB1c2godGhpcy52aXNpdFN0YXRlKG4sZSkpfSkpLG4ubmFtZT1vfWVsc2UgaWYoMT09dC50eXBlKXtjb25zdCBpPXRoaXMudmlzaXRUcmFuc2l0aW9uKHQsZSk7bis9aS5xdWVyeUNvdW50LG8rPWkuZGVwQ291bnQsYS5wdXNoKGkpfWVsc2UgZS5lcnJvcnMucHVzaCgib25seSBzdGF0ZSgpIGFuZCB0cmFuc2l0aW9uKCkgZGVmaW5pdGlvbnMgY2FuIHNpdCBpbnNpZGUgb2YgYSB0cmlnZ2VyKCkiKX0pKSx7dHlwZTo3LG5hbWU6dC5uYW1lLHN0YXRlczppLHRyYW5zaXRpb25zOmEscXVlcnlDb3VudDpuLGRlcENvdW50Om8sb3B0aW9uczpudWxsfX12aXNpdFN0YXRlKHQsZSl7Y29uc3Qgbj10aGlzLnZpc2l0U3R5bGUodC5zdHlsZXMsZSksbz10Lm9wdGlvbnMmJnQub3B0aW9ucy5wYXJhbXN8fG51bGw7aWYobi5jb250YWluc0R5bmFtaWNTdHlsZXMpe2NvbnN0IGk9bmV3IFNldCxhPW98fHt9O2lmKG4uc3R5bGVzLmZvckVhY2goKHQ9PntpZihiTyh0KSl7Y29uc3QgZT10O09iamVjdC5rZXlzKGUpLmZvckVhY2goKHQ9PnskeChlW3RdKS5mb3JFYWNoKCh0PT57YS5oYXNPd25Qcm9wZXJ0eSh0KXx8aS5hZGQodCl9KSl9KSl9fSkpLGkuc2l6ZSl7Y29uc3Qgbj1lTyhpLnZhbHVlcygpKTtlLmVycm9ycy5wdXNoKGBzdGF0ZSgiJHt0Lm5hbWV9IiwgLi4uKSBtdXN0IGRlZmluZSBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIHRoZSBmb2xsb3dpbmcgc3R5bGUgc3Vic3RpdHV0aW9uczogJHtuLmpvaW4oIiwgIil9YCl9fXJldHVybnt0eXBlOjAsbmFtZTp0Lm5hbWUsc3R5bGU6bixvcHRpb25zOm8/e3BhcmFtczpvfTpudWxsfX12aXNpdFRyYW5zaXRpb24odCxlKXtlLnF1ZXJ5Q291bnQ9MCxlLmRlcENvdW50PTA7Y29uc3Qgbj1yTyh0aGlzLEp4KHQuYW5pbWF0aW9uKSxlKTtyZXR1cm57dHlwZToxLG1hdGNoZXJzOmNPKHQuZXhwcixlLmVycm9ycyksYW5pbWF0aW9uOm4scXVlcnlDb3VudDplLnF1ZXJ5Q291bnQsZGVwQ291bnQ6ZS5kZXBDb3VudCxvcHRpb25zOnlPKHQub3B0aW9ucyl9fXZpc2l0U2VxdWVuY2UodCxlKXtyZXR1cm57dHlwZToyLHN0ZXBzOnQuc3RlcHMubWFwKCh0PT5yTyh0aGlzLHQsZSkpKSxvcHRpb25zOnlPKHQub3B0aW9ucyl9fXZpc2l0R3JvdXAodCxlKXtjb25zdCBuPWUuY3VycmVudFRpbWU7bGV0IG89MDtjb25zdCBpPXQuc3RlcHMubWFwKCh0PT57ZS5jdXJyZW50VGltZT1uO2NvbnN0IGk9ck8odGhpcyx0LGUpO3JldHVybiBvPU1hdGgubWF4KG8sZS5jdXJyZW50VGltZSksaX0pKTtyZXR1cm4gZS5jdXJyZW50VGltZT1vLHt0eXBlOjMsc3RlcHM6aSxvcHRpb25zOnlPKHQub3B0aW9ucyl9fXZpc2l0QW5pbWF0ZSh0LGUpe2NvbnN0IG49KGZ1bmN0aW9uIG8odCxlKXtsZXQgbj1udWxsO2lmKHQuaGFzT3duUHJvcGVydHkoImR1cmF0aW9uIikpbj10O2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiBfTyhHeCh0LGUpLmR1cmF0aW9uLDAsIiIpO2NvbnN0IG89dDtpZihvLnNwbGl0KC9ccysvKS5zb21lKCh0PT4ieyI9PXQuY2hhckF0KDApJiYieyI9PXQuY2hhckF0KDEpKSkpe2NvbnN0IHQ9X08oMCwwLCIiKTtyZXR1cm4gdC5keW5hbWljPSEwLHQuc3RyVmFsdWU9byx0fXJldHVybiBuPW58fEd4KG8sZSksX08obi5kdXJhdGlvbixuLmRlbGF5LG4uZWFzaW5nKX0pKHQudGltaW5ncyxlLmVycm9ycyk7bGV0IGk7ZS5jdXJyZW50QW5pbWF0ZVRpbWluZ3M9bjtsZXQgYT10LnN0eWxlcz90LnN0eWxlczpheCh7fSk7aWYoNT09YS50eXBlKWk9dGhpcy52aXNpdEtleWZyYW1lcyhhLGUpO2Vsc2V7bGV0IG89dC5zdHlsZXMsYT0hMTtpZighbyl7YT0hMDtjb25zdCB0PXt9O24uZWFzaW5nJiYodC5lYXNpbmc9bi5lYXNpbmcpLG89YXgodCl9ZS5jdXJyZW50VGltZSs9bi5kdXJhdGlvbituLmRlbGF5O2NvbnN0IHI9dGhpcy52aXNpdFN0eWxlKG8sZSk7ci5pc0VtcHR5U3RlcD1hLGk9cn1yZXR1cm4gZS5jdXJyZW50QW5pbWF0ZVRpbWluZ3M9bnVsbCx7dHlwZTo0LHRpbWluZ3M6bixzdHlsZTppLG9wdGlvbnM6bnVsbH19dmlzaXRTdHlsZSh0LGUpe2NvbnN0IG49dGhpcy5fbWFrZVN0eWxlQXN0KHQsZSk7cmV0dXJuIHRoaXMuX3ZhbGlkYXRlU3R5bGVBc3QobixlKSxufV9tYWtlU3R5bGVBc3QodCxlKXtjb25zdCBuPVtdO0FycmF5LmlzQXJyYXkodC5zdHlsZXMpP3Quc3R5bGVzLmZvckVhY2goKHQ9Pnsic3RyaW5nIj09dHlwZW9mIHQ/dD09ZXg/bi5wdXNoKHQpOmUuZXJyb3JzLnB1c2goYFRoZSBwcm92aWRlZCBzdHlsZSBzdHJpbmcgdmFsdWUgJHt0fSBpcyBub3QgYWxsb3dlZC5gKTpuLnB1c2godCl9KSk6bi5wdXNoKHQuc3R5bGVzKTtsZXQgbz0hMSxpPW51bGw7cmV0dXJuIG4uZm9yRWFjaCgodD0+e2lmKGJPKHQpKXtjb25zdCBlPXQsbj1lLmVhc2luZztpZihuJiYoaT1uLGRlbGV0ZSBlLmVhc2luZyksIW8pZm9yKGxldCB0IGluIGUpaWYoZVt0XS50b1N0cmluZygpLmluZGV4T2YoInt7Iik+PTApe289ITA7YnJlYWt9fX0pKSx7dHlwZTo2LHN0eWxlczpuLGVhc2luZzppLG9mZnNldDp0Lm9mZnNldCxjb250YWluc0R5bmFtaWNTdHlsZXM6byxvcHRpb25zOm51bGx9fV92YWxpZGF0ZVN0eWxlQXN0KHQsZSl7Y29uc3Qgbj1lLmN1cnJlbnRBbmltYXRlVGltaW5ncztsZXQgbz1lLmN1cnJlbnRUaW1lLGk9ZS5jdXJyZW50VGltZTtuJiZpPjAmJihpLT1uLmR1cmF0aW9uK24uZGVsYXkpLHQuc3R5bGVzLmZvckVhY2goKHQ9Pnsic3RyaW5nIiE9dHlwZW9mIHQmJk9iamVjdC5rZXlzKHQpLmZvckVhY2goKG49PntpZighdGhpcy5fZHJpdmVyLnZhbGlkYXRlU3R5bGVQcm9wZXJ0eShuKSlyZXR1cm4gdm9pZCBlLmVycm9ycy5wdXNoKGBUaGUgcHJvdmlkZWQgYW5pbWF0aW9uIHByb3BlcnR5ICIke259IiBpcyBub3QgYSBzdXBwb3J0ZWQgQ1NTIHByb3BlcnR5IGZvciBhbmltYXRpb25zYCk7Y29uc3QgYT1lLmNvbGxlY3RlZFN0eWxlc1tlLmN1cnJlbnRRdWVyeVNlbGVjdG9yXSxyPWFbbl07bGV0IHM9ITA7ciYmKGkhPW8mJmk+PXIuc3RhcnRUaW1lJiZvPD1yLmVuZFRpbWUmJihlLmVycm9ycy5wdXNoKGBUaGUgQ1NTIHByb3BlcnR5ICIke259IiB0aGF0IGV4aXN0cyBiZXR3ZWVuIHRoZSB0aW1lcyBvZiAiJHtyLnN0YXJ0VGltZX1tcyIgYW5kICIke3IuZW5kVGltZX1tcyIgaXMgYWxzbyBiZWluZyBhbmltYXRlZCBpbiBhIHBhcmFsbGVsIGFuaW1hdGlvbiBiZXR3ZWVuIHRoZSB0aW1lcyBvZiAiJHtpfW1zIiBhbmQgIiR7b31tcyJgKSxzPSExKSxpPXIuc3RhcnRUaW1lKSxzJiYoYVtuXT17c3RhcnRUaW1lOmksZW5kVGltZTpvfSksZS5vcHRpb25zJiYoZnVuY3Rpb24gbCh0LGUsbil7Y29uc3Qgbz1lLnBhcmFtc3x8e30saT0keCh0KTtpLmxlbmd0aCYmaS5mb3JFYWNoKCh0PT57by5oYXNPd25Qcm9wZXJ0eSh0KXx8bi5wdXNoKGBVbmFibGUgdG8gcmVzb2x2ZSB0aGUgbG9jYWwgYW5pbWF0aW9uIHBhcmFtICR7dH0gaW4gdGhlIGdpdmVuIGxpc3Qgb2YgdmFsdWVzYCl9KSl9KSh0W25dLGUub3B0aW9ucyxlLmVycm9ycyl9KSl9KSl9dmlzaXRLZXlmcmFtZXModCxlKXtjb25zdCBuPXt0eXBlOjUsc3R5bGVzOltdLG9wdGlvbnM6bnVsbH07aWYoIWUuY3VycmVudEFuaW1hdGVUaW1pbmdzKXJldHVybiBlLmVycm9ycy5wdXNoKCJrZXlmcmFtZXMoKSBtdXN0IGJlIHBsYWNlZCBpbnNpZGUgb2YgYSBjYWxsIHRvIGFuaW1hdGUoKSIpLG47bGV0IG89MDtjb25zdCBpPVtdO2xldCBhPSExLHI9ITEscz0wO2NvbnN0IGw9dC5zdGVwcy5tYXAoKHQ9Pntjb25zdCBuPXRoaXMuX21ha2VTdHlsZUFzdCh0LGUpO2xldCBsPW51bGwhPW4ub2Zmc2V0P24ub2Zmc2V0OihmdW5jdGlvbiBjKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gbnVsbDtsZXQgZT1udWxsO2lmKEFycmF5LmlzQXJyYXkodCkpdC5mb3JFYWNoKCh0PT57aWYoYk8odCkmJnQuaGFzT3duUHJvcGVydHkoIm9mZnNldCIpKXtjb25zdCBuPXQ7ZT1wYXJzZUZsb2F0KG4ub2Zmc2V0KSxkZWxldGUgbi5vZmZzZXR9fSkpO2Vsc2UgaWYoYk8odCkmJnQuaGFzT3duUHJvcGVydHkoIm9mZnNldCIpKXtjb25zdCBuPXQ7ZT1wYXJzZUZsb2F0KG4ub2Zmc2V0KSxkZWxldGUgbi5vZmZzZXR9cmV0dXJuIGV9KShuLnN0eWxlcyksZD0wO3JldHVybiBudWxsIT1sJiYobysrLGQ9bi5vZmZzZXQ9bCkscj1yfHxkPDB8fGQ+MSxhPWF8fGQ8cyxzPWQsaS5wdXNoKGQpLG59KSk7ciYmZS5lcnJvcnMucHVzaCgiUGxlYXNlIGVuc3VyZSB0aGF0IGFsbCBrZXlmcmFtZSBvZmZzZXRzIGFyZSBiZXR3ZWVuIDAgYW5kIDEiKSxhJiZlLmVycm9ycy5wdXNoKCJQbGVhc2UgZW5zdXJlIHRoYXQgYWxsIGtleWZyYW1lIG9mZnNldHMgYXJlIGluIG9yZGVyIik7Y29uc3QgYz10LnN0ZXBzLmxlbmd0aDtsZXQgZD0wO28+MCYmbzxjP2UuZXJyb3JzLnB1c2goIk5vdCBhbGwgc3R5bGUoKSBzdGVwcyB3aXRoaW4gdGhlIGRlY2xhcmVkIGtleWZyYW1lcygpIGNvbnRhaW4gb2Zmc2V0cyIpOjA9PW8mJihkPTEvKGMtMSkpO2NvbnN0IHA9Yy0xLG09ZS5jdXJyZW50VGltZSx1PWUuY3VycmVudEFuaW1hdGVUaW1pbmdzLGY9dS5kdXJhdGlvbjtyZXR1cm4gbC5mb3JFYWNoKCgodCxvKT0+e2NvbnN0IGE9ZD4wP289PXA/MTpkKm86aVtvXSxyPWEqZjtlLmN1cnJlbnRUaW1lPW0rdS5kZWxheStyLHUuZHVyYXRpb249cix0aGlzLl92YWxpZGF0ZVN0eWxlQXN0KHQsZSksdC5vZmZzZXQ9YSxuLnN0eWxlcy5wdXNoKHQpfSkpLG59dmlzaXRSZWZlcmVuY2UodCxlKXtyZXR1cm57dHlwZTo4LGFuaW1hdGlvbjpyTyh0aGlzLEp4KHQuYW5pbWF0aW9uKSxlKSxvcHRpb25zOnlPKHQub3B0aW9ucyl9fXZpc2l0QW5pbWF0ZUNoaWxkKHQsZSl7cmV0dXJuIGUuZGVwQ291bnQrKyx7dHlwZTo5LG9wdGlvbnM6eU8odC5vcHRpb25zKX19dmlzaXRBbmltYXRlUmVmKHQsZSl7cmV0dXJue3R5cGU6MTAsYW5pbWF0aW9uOnRoaXMudmlzaXRSZWZlcmVuY2UodC5hbmltYXRpb24sZSksb3B0aW9uczp5Tyh0Lm9wdGlvbnMpfX12aXNpdFF1ZXJ5KHQsZSl7Y29uc3Qgbj1lLmN1cnJlbnRRdWVyeVNlbGVjdG9yLG89dC5vcHRpb25zfHx7fTtlLnF1ZXJ5Q291bnQrKyxlLmN1cnJlbnRRdWVyeT10O2NvbnN0W2ksYV09KGZ1bmN0aW9uIHIodCl7Y29uc3QgZT0hIXQuc3BsaXQoL1xzKixccyovKS5maW5kKCh0PT4iOnNlbGYiPT10KSk7cmV0dXJuIGUmJih0PXQucmVwbGFjZSh1TywiIikpLFt0PXQucmVwbGFjZSgvQFwqL2csTHgpLnJlcGxhY2UoL0BcdysvZywodD0+Ii5uZy10cmlnZ2VyLSIrdC5zdWJzdHIoMSkpKS5yZXBsYWNlKC86YW5pbWF0aW5nL2csVngpLGVdfSkodC5zZWxlY3Rvcik7ZS5jdXJyZW50UXVlcnlTZWxlY3Rvcj1uLmxlbmd0aD9uKyIgIitpOmksTXgoZS5jb2xsZWN0ZWRTdHlsZXMsZS5jdXJyZW50UXVlcnlTZWxlY3Rvcix7fSk7Y29uc3Qgcz1yTyh0aGlzLEp4KHQuYW5pbWF0aW9uKSxlKTtyZXR1cm4gZS5jdXJyZW50UXVlcnk9bnVsbCxlLmN1cnJlbnRRdWVyeVNlbGVjdG9yPW4se3R5cGU6MTEsc2VsZWN0b3I6aSxsaW1pdDpvLmxpbWl0fHwwLG9wdGlvbmFsOiEhby5vcHRpb25hbCxpbmNsdWRlU2VsZjphLGFuaW1hdGlvbjpzLG9yaWdpbmFsU2VsZWN0b3I6dC5zZWxlY3RvcixvcHRpb25zOnlPKHQub3B0aW9ucyl9fXZpc2l0U3RhZ2dlcih0LGUpe2UuY3VycmVudFF1ZXJ5fHxlLmVycm9ycy5wdXNoKCJzdGFnZ2VyKCkgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgb2YgcXVlcnkoKSIpO2NvbnN0IG49ImZ1bGwiPT09dC50aW1pbmdzP3tkdXJhdGlvbjowLGRlbGF5OjAsZWFzaW5nOiJmdWxsIn06R3godC50aW1pbmdzLGUuZXJyb3JzLCEwKTtyZXR1cm57dHlwZToxMixhbmltYXRpb246ck8odGhpcyxKeCh0LmFuaW1hdGlvbiksZSksdGltaW5nczpuLG9wdGlvbnM6bnVsbH19fWNsYXNzIGhPe2NvbnN0cnVjdG9yKHQpe3RoaXMuZXJyb3JzPXQsdGhpcy5xdWVyeUNvdW50PTAsdGhpcy5kZXBDb3VudD0wLHRoaXMuY3VycmVudFRyYW5zaXRpb249bnVsbCx0aGlzLmN1cnJlbnRRdWVyeT1udWxsLHRoaXMuY3VycmVudFF1ZXJ5U2VsZWN0b3I9bnVsbCx0aGlzLmN1cnJlbnRBbmltYXRlVGltaW5ncz1udWxsLHRoaXMuY3VycmVudFRpbWU9MCx0aGlzLmNvbGxlY3RlZFN0eWxlcz17fSx0aGlzLm9wdGlvbnM9bnVsbH19ZnVuY3Rpb24gYk8odCl7cmV0dXJuIUFycmF5LmlzQXJyYXkodCkmJiJvYmplY3QiPT10eXBlb2YgdH1mdW5jdGlvbiB5Tyh0KXtyZXR1cm4gdD8odD1XeCh0KSkucGFyYW1zJiYodC5wYXJhbXM9KGZ1bmN0aW9uIGUodCl7cmV0dXJuIHQ/V3godCk6bnVsbH0pKHQucGFyYW1zKSk6dD17fSx0fWZ1bmN0aW9uIF9PKHQsZSxuKXtyZXR1cm57ZHVyYXRpb246dCxkZWxheTplLGVhc2luZzpufX1mdW5jdGlvbiBDTyh0LGUsbixvLGksYSxyPW51bGwscz0hMSl7cmV0dXJue3R5cGU6MSxlbGVtZW50OnQsa2V5ZnJhbWVzOmUscHJlU3R5bGVQcm9wczpuLHBvc3RTdHlsZVByb3BzOm8sZHVyYXRpb246aSxkZWxheTphLHRvdGFsVGltZTppK2EsZWFzaW5nOnIsc3ViVGltZWxpbmU6c319Y2xhc3MgTU97Y29uc3RydWN0b3IoKXt0aGlzLl9tYXA9bmV3IE1hcH1jb25zdW1lKHQpe2xldCBlPXRoaXMuX21hcC5nZXQodCk7cmV0dXJuIGU/dGhpcy5fbWFwLmRlbGV0ZSh0KTplPVtdLGV9YXBwZW5kKHQsZSl7bGV0IG49dGhpcy5fbWFwLmdldCh0KTtufHx0aGlzLl9tYXAuc2V0KHQsbj1bXSksbi5wdXNoKC4uLmUpfWhhcyh0KXtyZXR1cm4gdGhpcy5fbWFwLmhhcyh0KX1jbGVhcigpe3RoaXMuX21hcC5jbGVhcigpfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3Qgdk89bmV3IFJlZ0V4cCgiOmVudGVyIiwiZyIpLHhPPW5ldyBSZWdFeHAoIjpsZWF2ZSIsImciKTtmdW5jdGlvbiBPTyh0LGUsbixvLGksYT17fSxyPXt9LHMsbCxjPVtdKXtyZXR1cm4obmV3IFBPKS5idWlsZEtleWZyYW1lcyh0LGUsbixvLGksYSxyLHMsbCxjKX1jbGFzcyBQT3tidWlsZEtleWZyYW1lcyh0LGUsbixvLGksYSxyLHMsbCxjPVtdKXtsPWx8fG5ldyBNTztjb25zdCBkPW5ldyBrTyh0LGUsbCxvLGksYyxbXSk7ZC5vcHRpb25zPXMsZC5jdXJyZW50VGltZWxpbmUuc2V0U3R5bGVzKFthXSxudWxsLGQuZXJyb3JzLHMpLHJPKHRoaXMsbixkKTtjb25zdCBwPWQudGltZWxpbmVzLmZpbHRlcigodD0+dC5jb250YWluc0FuaW1hdGlvbigpKSk7aWYocC5sZW5ndGgmJk9iamVjdC5rZXlzKHIpLmxlbmd0aCl7Y29uc3QgdD1wW3AubGVuZ3RoLTFdO3QuYWxsb3dPbmx5VGltZWxpbmVTdHlsZXMoKXx8dC5zZXRTdHlsZXMoW3JdLG51bGwsZC5lcnJvcnMscyl9cmV0dXJuIHAubGVuZ3RoP3AubWFwKCh0PT50LmJ1aWxkS2V5ZnJhbWVzKCkpKTpbQ08oZSxbXSxbXSxbXSwwLDAsIiIsITEpXX12aXNpdFRyaWdnZXIodCxlKXt9dmlzaXRTdGF0ZSh0LGUpe312aXNpdFRyYW5zaXRpb24odCxlKXt9dmlzaXRBbmltYXRlQ2hpbGQodCxlKXtjb25zdCBuPWUuc3ViSW5zdHJ1Y3Rpb25zLmNvbnN1bWUoZS5lbGVtZW50KTtpZihuKXtjb25zdCBvPWUuY3JlYXRlU3ViQ29udGV4dCh0Lm9wdGlvbnMpLGk9ZS5jdXJyZW50VGltZWxpbmUuY3VycmVudFRpbWUsYT10aGlzLl92aXNpdFN1Ykluc3RydWN0aW9ucyhuLG8sby5vcHRpb25zKTtpIT1hJiZlLnRyYW5zZm9ybUludG9OZXdUaW1lbGluZShhKX1lLnByZXZpb3VzTm9kZT10fXZpc2l0QW5pbWF0ZVJlZih0LGUpe2NvbnN0IG49ZS5jcmVhdGVTdWJDb250ZXh0KHQub3B0aW9ucyk7bi50cmFuc2Zvcm1JbnRvTmV3VGltZWxpbmUoKSx0aGlzLnZpc2l0UmVmZXJlbmNlKHQuYW5pbWF0aW9uLG4pLGUudHJhbnNmb3JtSW50b05ld1RpbWVsaW5lKG4uY3VycmVudFRpbWVsaW5lLmN1cnJlbnRUaW1lKSxlLnByZXZpb3VzTm9kZT10fV92aXNpdFN1Ykluc3RydWN0aW9ucyh0LGUsbil7bGV0IG89ZS5jdXJyZW50VGltZWxpbmUuY3VycmVudFRpbWU7Y29uc3QgaT1udWxsIT1uLmR1cmF0aW9uP2p4KG4uZHVyYXRpb24pOm51bGwsYT1udWxsIT1uLmRlbGF5P2p4KG4uZGVsYXkpOm51bGw7cmV0dXJuIDAhPT1pJiZ0LmZvckVhY2goKHQ9Pntjb25zdCBuPWUuYXBwZW5kSW5zdHJ1Y3Rpb25Ub1RpbWVsaW5lKHQsaSxhKTtvPU1hdGgubWF4KG8sbi5kdXJhdGlvbituLmRlbGF5KX0pKSxvfXZpc2l0UmVmZXJlbmNlKHQsZSl7ZS51cGRhdGVPcHRpb25zKHQub3B0aW9ucywhMCksck8odGhpcyx0LmFuaW1hdGlvbixlKSxlLnByZXZpb3VzTm9kZT10fXZpc2l0U2VxdWVuY2UodCxlKXtjb25zdCBuPWUuc3ViQ29udGV4dENvdW50O2xldCBvPWU7Y29uc3QgaT10Lm9wdGlvbnM7aWYoaSYmKGkucGFyYW1zfHxpLmRlbGF5KSYmKG89ZS5jcmVhdGVTdWJDb250ZXh0KGkpLG8udHJhbnNmb3JtSW50b05ld1RpbWVsaW5lKCksbnVsbCE9aS5kZWxheSkpezY9PW8ucHJldmlvdXNOb2RlLnR5cGUmJihvLmN1cnJlbnRUaW1lbGluZS5zbmFwc2hvdEN1cnJlbnRTdHlsZXMoKSxvLnByZXZpb3VzTm9kZT13Tyk7Y29uc3QgdD1qeChpLmRlbGF5KTtvLmRlbGF5TmV4dFN0ZXAodCl9dC5zdGVwcy5sZW5ndGgmJih0LnN0ZXBzLmZvckVhY2goKHQ9PnJPKHRoaXMsdCxvKSkpLG8uY3VycmVudFRpbWVsaW5lLmFwcGx5U3R5bGVzVG9LZXlmcmFtZSgpLG8uc3ViQ29udGV4dENvdW50Pm4mJm8udHJhbnNmb3JtSW50b05ld1RpbWVsaW5lKCkpLGUucHJldmlvdXNOb2RlPXR9dmlzaXRHcm91cCh0LGUpe2NvbnN0IG49W107bGV0IG89ZS5jdXJyZW50VGltZWxpbmUuY3VycmVudFRpbWU7Y29uc3QgaT10Lm9wdGlvbnMmJnQub3B0aW9ucy5kZWxheT9qeCh0Lm9wdGlvbnMuZGVsYXkpOjA7dC5zdGVwcy5mb3JFYWNoKChhPT57Y29uc3Qgcj1lLmNyZWF0ZVN1YkNvbnRleHQodC5vcHRpb25zKTtpJiZyLmRlbGF5TmV4dFN0ZXAoaSksck8odGhpcyxhLHIpLG89TWF0aC5tYXgobyxyLmN1cnJlbnRUaW1lbGluZS5jdXJyZW50VGltZSksbi5wdXNoKHIuY3VycmVudFRpbWVsaW5lKX0pKSxuLmZvckVhY2goKHQ9PmUuY3VycmVudFRpbWVsaW5lLm1lcmdlVGltZWxpbmVDb2xsZWN0ZWRTdHlsZXModCkpKSxlLnRyYW5zZm9ybUludG9OZXdUaW1lbGluZShvKSxlLnByZXZpb3VzTm9kZT10fV92aXNpdFRpbWluZyh0LGUpe2lmKHQuZHluYW1pYyl7Y29uc3Qgbj10LnN0clZhbHVlO3JldHVybiBHeChlLnBhcmFtcz90TyhuLGUucGFyYW1zLGUuZXJyb3JzKTpuLGUuZXJyb3JzKX1yZXR1cm57ZHVyYXRpb246dC5kdXJhdGlvbixkZWxheTp0LmRlbGF5LGVhc2luZzp0LmVhc2luZ319dmlzaXRBbmltYXRlKHQsZSl7Y29uc3Qgbj1lLmN1cnJlbnRBbmltYXRlVGltaW5ncz10aGlzLl92aXNpdFRpbWluZyh0LnRpbWluZ3MsZSksbz1lLmN1cnJlbnRUaW1lbGluZTtuLmRlbGF5JiYoZS5pbmNyZW1lbnRUaW1lKG4uZGVsYXkpLG8uc25hcHNob3RDdXJyZW50U3R5bGVzKCkpO2NvbnN0IGk9dC5zdHlsZTs1PT1pLnR5cGU/dGhpcy52aXNpdEtleWZyYW1lcyhpLGUpOihlLmluY3JlbWVudFRpbWUobi5kdXJhdGlvbiksdGhpcy52aXNpdFN0eWxlKGksZSksby5hcHBseVN0eWxlc1RvS2V5ZnJhbWUoKSksZS5jdXJyZW50QW5pbWF0ZVRpbWluZ3M9bnVsbCxlLnByZXZpb3VzTm9kZT10fXZpc2l0U3R5bGUodCxlKXtjb25zdCBuPWUuY3VycmVudFRpbWVsaW5lLG89ZS5jdXJyZW50QW5pbWF0ZVRpbWluZ3M7IW8mJm4uZ2V0Q3VycmVudFN0eWxlUHJvcGVydGllcygpLmxlbmd0aCYmbi5mb3J3YXJkRnJhbWUoKTtjb25zdCBpPW8mJm8uZWFzaW5nfHx0LmVhc2luZzt0LmlzRW1wdHlTdGVwP24uYXBwbHlFbXB0eVN0ZXAoaSk6bi5zZXRTdHlsZXModC5zdHlsZXMsaSxlLmVycm9ycyxlLm9wdGlvbnMpLGUucHJldmlvdXNOb2RlPXR9dmlzaXRLZXlmcmFtZXModCxlKXtjb25zdCBuPWUuY3VycmVudEFuaW1hdGVUaW1pbmdzLG89ZS5jdXJyZW50VGltZWxpbmUuZHVyYXRpb24saT1uLmR1cmF0aW9uLGE9ZS5jcmVhdGVTdWJDb250ZXh0KCkuY3VycmVudFRpbWVsaW5lO2EuZWFzaW5nPW4uZWFzaW5nLHQuc3R5bGVzLmZvckVhY2goKHQ9PnthLmZvcndhcmRUaW1lKCh0Lm9mZnNldHx8MCkqaSksYS5zZXRTdHlsZXModC5zdHlsZXMsdC5lYXNpbmcsZS5lcnJvcnMsZS5vcHRpb25zKSxhLmFwcGx5U3R5bGVzVG9LZXlmcmFtZSgpfSkpLGUuY3VycmVudFRpbWVsaW5lLm1lcmdlVGltZWxpbmVDb2xsZWN0ZWRTdHlsZXMoYSksZS50cmFuc2Zvcm1JbnRvTmV3VGltZWxpbmUobytpKSxlLnByZXZpb3VzTm9kZT10fXZpc2l0UXVlcnkodCxlKXtjb25zdCBuPWUuY3VycmVudFRpbWVsaW5lLmN1cnJlbnRUaW1lLG89dC5vcHRpb25zfHx7fSxpPW8uZGVsYXk/angoby5kZWxheSk6MDtpJiYoNj09PWUucHJldmlvdXNOb2RlLnR5cGV8fDA9PW4mJmUuY3VycmVudFRpbWVsaW5lLmdldEN1cnJlbnRTdHlsZVByb3BlcnRpZXMoKS5sZW5ndGgpJiYoZS5jdXJyZW50VGltZWxpbmUuc25hcHNob3RDdXJyZW50U3R5bGVzKCksZS5wcmV2aW91c05vZGU9d08pO2xldCBhPW47Y29uc3Qgcj1lLmludm9rZVF1ZXJ5KHQuc2VsZWN0b3IsdC5vcmlnaW5hbFNlbGVjdG9yLHQubGltaXQsdC5pbmNsdWRlU2VsZiwhIW8ub3B0aW9uYWwsZS5lcnJvcnMpO2UuY3VycmVudFF1ZXJ5VG90YWw9ci5sZW5ndGg7bGV0IHM9bnVsbDtyLmZvckVhY2goKChuLG8pPT57ZS5jdXJyZW50UXVlcnlJbmRleD1vO2NvbnN0IHI9ZS5jcmVhdGVTdWJDb250ZXh0KHQub3B0aW9ucyxuKTtpJiZyLmRlbGF5TmV4dFN0ZXAoaSksbj09PWUuZWxlbWVudCYmKHM9ci5jdXJyZW50VGltZWxpbmUpLHJPKHRoaXMsdC5hbmltYXRpb24sciksci5jdXJyZW50VGltZWxpbmUuYXBwbHlTdHlsZXNUb0tleWZyYW1lKCksYT1NYXRoLm1heChhLHIuY3VycmVudFRpbWVsaW5lLmN1cnJlbnRUaW1lKX0pKSxlLmN1cnJlbnRRdWVyeUluZGV4PTAsZS5jdXJyZW50UXVlcnlUb3RhbD0wLGUudHJhbnNmb3JtSW50b05ld1RpbWVsaW5lKGEpLHMmJihlLmN1cnJlbnRUaW1lbGluZS5tZXJnZVRpbWVsaW5lQ29sbGVjdGVkU3R5bGVzKHMpLGUuY3VycmVudFRpbWVsaW5lLnNuYXBzaG90Q3VycmVudFN0eWxlcygpKSxlLnByZXZpb3VzTm9kZT10fXZpc2l0U3RhZ2dlcih0LGUpe2NvbnN0IG49ZS5wYXJlbnRDb250ZXh0LG89ZS5jdXJyZW50VGltZWxpbmUsaT10LnRpbWluZ3MsYT1NYXRoLmFicyhpLmR1cmF0aW9uKSxyPWEqKGUuY3VycmVudFF1ZXJ5VG90YWwtMSk7bGV0IHM9YSplLmN1cnJlbnRRdWVyeUluZGV4O3N3aXRjaChpLmR1cmF0aW9uPDA/InJldmVyc2UiOmkuZWFzaW5nKXtjYXNlInJldmVyc2UiOnM9ci1zO2JyZWFrO2Nhc2UiZnVsbCI6cz1uLmN1cnJlbnRTdGFnZ2VyVGltZX1jb25zdCBsPWUuY3VycmVudFRpbWVsaW5lO3MmJmwuZGVsYXlOZXh0U3RlcChzKTtjb25zdCBjPWwuY3VycmVudFRpbWU7ck8odGhpcyx0LmFuaW1hdGlvbixlKSxlLnByZXZpb3VzTm9kZT10LG4uY3VycmVudFN0YWdnZXJUaW1lPW8uY3VycmVudFRpbWUtYysoby5zdGFydFRpbWUtbi5jdXJyZW50VGltZWxpbmUuc3RhcnRUaW1lKX19Y29uc3Qgd089e307Y2xhc3Mga097Y29uc3RydWN0b3IodCxlLG4sbyxpLGEscixzKXt0aGlzLl9kcml2ZXI9dCx0aGlzLmVsZW1lbnQ9ZSx0aGlzLnN1Ykluc3RydWN0aW9ucz1uLHRoaXMuX2VudGVyQ2xhc3NOYW1lPW8sdGhpcy5fbGVhdmVDbGFzc05hbWU9aSx0aGlzLmVycm9ycz1hLHRoaXMudGltZWxpbmVzPXIsdGhpcy5wYXJlbnRDb250ZXh0PW51bGwsdGhpcy5jdXJyZW50QW5pbWF0ZVRpbWluZ3M9bnVsbCx0aGlzLnByZXZpb3VzTm9kZT13Tyx0aGlzLnN1YkNvbnRleHRDb3VudD0wLHRoaXMub3B0aW9ucz17fSx0aGlzLmN1cnJlbnRRdWVyeUluZGV4PTAsdGhpcy5jdXJyZW50UXVlcnlUb3RhbD0wLHRoaXMuY3VycmVudFN0YWdnZXJUaW1lPTAsdGhpcy5jdXJyZW50VGltZWxpbmU9c3x8bmV3IFNPKHRoaXMuX2RyaXZlcixlLDApLHIucHVzaCh0aGlzLmN1cnJlbnRUaW1lbGluZSl9Z2V0IHBhcmFtcygpe3JldHVybiB0aGlzLm9wdGlvbnMucGFyYW1zfXVwZGF0ZU9wdGlvbnModCxlKXtpZighdClyZXR1cm47Y29uc3Qgbj10O2xldCBvPXRoaXMub3B0aW9ucztudWxsIT1uLmR1cmF0aW9uJiYoby5kdXJhdGlvbj1qeChuLmR1cmF0aW9uKSksbnVsbCE9bi5kZWxheSYmKG8uZGVsYXk9angobi5kZWxheSkpO2NvbnN0IGk9bi5wYXJhbXM7aWYoaSl7bGV0IHQ9by5wYXJhbXM7dHx8KHQ9dGhpcy5vcHRpb25zLnBhcmFtcz17fSksT2JqZWN0LmtleXMoaSkuZm9yRWFjaCgobj0+e2UmJnQuaGFzT3duUHJvcGVydHkobil8fCh0W25dPXRPKGlbbl0sdCx0aGlzLmVycm9ycykpfSkpfX1fY29weU9wdGlvbnMoKXtjb25zdCB0PXt9O2lmKHRoaXMub3B0aW9ucyl7Y29uc3QgZT10aGlzLm9wdGlvbnMucGFyYW1zO2lmKGUpe2NvbnN0IG49dC5wYXJhbXM9e307T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgodD0+e25bdF09ZVt0XX0pKX19cmV0dXJuIHR9Y3JlYXRlU3ViQ29udGV4dCh0PW51bGwsZSxuKXtjb25zdCBvPWV8fHRoaXMuZWxlbWVudCxpPW5ldyBrTyh0aGlzLl9kcml2ZXIsbyx0aGlzLnN1Ykluc3RydWN0aW9ucyx0aGlzLl9lbnRlckNsYXNzTmFtZSx0aGlzLl9sZWF2ZUNsYXNzTmFtZSx0aGlzLmVycm9ycyx0aGlzLnRpbWVsaW5lcyx0aGlzLmN1cnJlbnRUaW1lbGluZS5mb3JrKG8sbnx8MCkpO3JldHVybiBpLnByZXZpb3VzTm9kZT10aGlzLnByZXZpb3VzTm9kZSxpLmN1cnJlbnRBbmltYXRlVGltaW5ncz10aGlzLmN1cnJlbnRBbmltYXRlVGltaW5ncyxpLm9wdGlvbnM9dGhpcy5fY29weU9wdGlvbnMoKSxpLnVwZGF0ZU9wdGlvbnModCksaS5jdXJyZW50UXVlcnlJbmRleD10aGlzLmN1cnJlbnRRdWVyeUluZGV4LGkuY3VycmVudFF1ZXJ5VG90YWw9dGhpcy5jdXJyZW50UXVlcnlUb3RhbCxpLnBhcmVudENvbnRleHQ9dGhpcyx0aGlzLnN1YkNvbnRleHRDb3VudCsrLGl9dHJhbnNmb3JtSW50b05ld1RpbWVsaW5lKHQpe3JldHVybiB0aGlzLnByZXZpb3VzTm9kZT13Tyx0aGlzLmN1cnJlbnRUaW1lbGluZT10aGlzLmN1cnJlbnRUaW1lbGluZS5mb3JrKHRoaXMuZWxlbWVudCx0KSx0aGlzLnRpbWVsaW5lcy5wdXNoKHRoaXMuY3VycmVudFRpbWVsaW5lKSx0aGlzLmN1cnJlbnRUaW1lbGluZX1hcHBlbmRJbnN0cnVjdGlvblRvVGltZWxpbmUodCxlLG4pe2NvbnN0IG89e2R1cmF0aW9uOm51bGwhPWU/ZTp0LmR1cmF0aW9uLGRlbGF5OnRoaXMuY3VycmVudFRpbWVsaW5lLmN1cnJlbnRUaW1lKyhudWxsIT1uP246MCkrdC5kZWxheSxlYXNpbmc6IiJ9LGk9bmV3IERPKHRoaXMuX2RyaXZlcix0LmVsZW1lbnQsdC5rZXlmcmFtZXMsdC5wcmVTdHlsZVByb3BzLHQucG9zdFN0eWxlUHJvcHMsbyx0LnN0cmV0Y2hTdGFydGluZ0tleWZyYW1lKTtyZXR1cm4gdGhpcy50aW1lbGluZXMucHVzaChpKSxvfWluY3JlbWVudFRpbWUodCl7dGhpcy5jdXJyZW50VGltZWxpbmUuZm9yd2FyZFRpbWUodGhpcy5jdXJyZW50VGltZWxpbmUuZHVyYXRpb24rdCl9ZGVsYXlOZXh0U3RlcCh0KXt0PjAmJnRoaXMuY3VycmVudFRpbWVsaW5lLmRlbGF5TmV4dFN0ZXAodCl9aW52b2tlUXVlcnkodCxlLG4sbyxpLGEpe2xldCByPVtdO2lmKG8mJnIucHVzaCh0aGlzLmVsZW1lbnQpLHQubGVuZ3RoPjApe3Q9KHQ9dC5yZXBsYWNlKHZPLCIuIit0aGlzLl9lbnRlckNsYXNzTmFtZSkpLnJlcGxhY2UoeE8sIi4iK3RoaXMuX2xlYXZlQ2xhc3NOYW1lKTtsZXQgZT10aGlzLl9kcml2ZXIucXVlcnkodGhpcy5lbGVtZW50LHQsMSE9bik7MCE9PW4mJihlPW48MD9lLnNsaWNlKGUubGVuZ3RoK24sZS5sZW5ndGgpOmUuc2xpY2UoMCxuKSksci5wdXNoKC4uLmUpfXJldHVybiBpfHwwIT1yLmxlbmd0aHx8YS5wdXNoKGBcYHF1ZXJ5KCIke2V9IilcYCByZXR1cm5lZCB6ZXJvIGVsZW1lbnRzLiAoVXNlIFxgcXVlcnkoIiR7ZX0iLCB7IG9wdGlvbmFsOiB0cnVlIH0pXGAgaWYgeW91IHdpc2ggdG8gYWxsb3cgdGhpcy4pYCkscn19Y2xhc3MgU097Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy5fZHJpdmVyPXQsdGhpcy5lbGVtZW50PWUsdGhpcy5zdGFydFRpbWU9bix0aGlzLl9lbGVtZW50VGltZWxpbmVTdHlsZXNMb29rdXA9byx0aGlzLmR1cmF0aW9uPTAsdGhpcy5fcHJldmlvdXNLZXlmcmFtZT17fSx0aGlzLl9jdXJyZW50S2V5ZnJhbWU9e30sdGhpcy5fa2V5ZnJhbWVzPW5ldyBNYXAsdGhpcy5fc3R5bGVTdW1tYXJ5PXt9LHRoaXMuX3BlbmRpbmdTdHlsZXM9e30sdGhpcy5fYmFja0ZpbGw9e30sdGhpcy5fY3VycmVudEVtcHR5U3RlcEtleWZyYW1lPW51bGwsdGhpcy5fZWxlbWVudFRpbWVsaW5lU3R5bGVzTG9va3VwfHwodGhpcy5fZWxlbWVudFRpbWVsaW5lU3R5bGVzTG9va3VwPW5ldyBNYXApLHRoaXMuX2xvY2FsVGltZWxpbmVTdHlsZXM9T2JqZWN0LmNyZWF0ZSh0aGlzLl9iYWNrRmlsbCx7fSksdGhpcy5fZ2xvYmFsVGltZWxpbmVTdHlsZXM9dGhpcy5fZWxlbWVudFRpbWVsaW5lU3R5bGVzTG9va3VwLmdldChlKSx0aGlzLl9nbG9iYWxUaW1lbGluZVN0eWxlc3x8KHRoaXMuX2dsb2JhbFRpbWVsaW5lU3R5bGVzPXRoaXMuX2xvY2FsVGltZWxpbmVTdHlsZXMsdGhpcy5fZWxlbWVudFRpbWVsaW5lU3R5bGVzTG9va3VwLnNldChlLHRoaXMuX2xvY2FsVGltZWxpbmVTdHlsZXMpKSx0aGlzLl9sb2FkS2V5ZnJhbWUoKX1jb250YWluc0FuaW1hdGlvbigpe3N3aXRjaCh0aGlzLl9rZXlmcmFtZXMuc2l6ZSl7Y2FzZSAwOnJldHVybiExO2Nhc2UgMTpyZXR1cm4gdGhpcy5nZXRDdXJyZW50U3R5bGVQcm9wZXJ0aWVzKCkubGVuZ3RoPjA7ZGVmYXVsdDpyZXR1cm4hMH19Z2V0Q3VycmVudFN0eWxlUHJvcGVydGllcygpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9jdXJyZW50S2V5ZnJhbWUpfWdldCBjdXJyZW50VGltZSgpe3JldHVybiB0aGlzLnN0YXJ0VGltZSt0aGlzLmR1cmF0aW9ufWRlbGF5TmV4dFN0ZXAodCl7Y29uc3QgZT0xPT10aGlzLl9rZXlmcmFtZXMuc2l6ZSYmT2JqZWN0LmtleXModGhpcy5fcGVuZGluZ1N0eWxlcykubGVuZ3RoO3RoaXMuZHVyYXRpb258fGU/KHRoaXMuZm9yd2FyZFRpbWUodGhpcy5jdXJyZW50VGltZSt0KSxlJiZ0aGlzLnNuYXBzaG90Q3VycmVudFN0eWxlcygpKTp0aGlzLnN0YXJ0VGltZSs9dH1mb3JrKHQsZSl7cmV0dXJuIHRoaXMuYXBwbHlTdHlsZXNUb0tleWZyYW1lKCksbmV3IFNPKHRoaXMuX2RyaXZlcix0LGV8fHRoaXMuY3VycmVudFRpbWUsdGhpcy5fZWxlbWVudFRpbWVsaW5lU3R5bGVzTG9va3VwKX1fbG9hZEtleWZyYW1lKCl7dGhpcy5fY3VycmVudEtleWZyYW1lJiYodGhpcy5fcHJldmlvdXNLZXlmcmFtZT10aGlzLl9jdXJyZW50S2V5ZnJhbWUpLHRoaXMuX2N1cnJlbnRLZXlmcmFtZT10aGlzLl9rZXlmcmFtZXMuZ2V0KHRoaXMuZHVyYXRpb24pLHRoaXMuX2N1cnJlbnRLZXlmcmFtZXx8KHRoaXMuX2N1cnJlbnRLZXlmcmFtZT1PYmplY3QuY3JlYXRlKHRoaXMuX2JhY2tGaWxsLHt9KSx0aGlzLl9rZXlmcmFtZXMuc2V0KHRoaXMuZHVyYXRpb24sdGhpcy5fY3VycmVudEtleWZyYW1lKSl9Zm9yd2FyZEZyYW1lKCl7dGhpcy5kdXJhdGlvbis9MSx0aGlzLl9sb2FkS2V5ZnJhbWUoKX1mb3J3YXJkVGltZSh0KXt0aGlzLmFwcGx5U3R5bGVzVG9LZXlmcmFtZSgpLHRoaXMuZHVyYXRpb249dCx0aGlzLl9sb2FkS2V5ZnJhbWUoKX1fdXBkYXRlU3R5bGUodCxlKXt0aGlzLl9sb2NhbFRpbWVsaW5lU3R5bGVzW3RdPWUsdGhpcy5fZ2xvYmFsVGltZWxpbmVTdHlsZXNbdF09ZSx0aGlzLl9zdHlsZVN1bW1hcnlbdF09e3RpbWU6dGhpcy5jdXJyZW50VGltZSx2YWx1ZTplfX1hbGxvd09ubHlUaW1lbGluZVN0eWxlcygpe3JldHVybiB0aGlzLl9jdXJyZW50RW1wdHlTdGVwS2V5ZnJhbWUhPT10aGlzLl9jdXJyZW50S2V5ZnJhbWV9YXBwbHlFbXB0eVN0ZXAodCl7dCYmKHRoaXMuX3ByZXZpb3VzS2V5ZnJhbWUuZWFzaW5nPXQpLE9iamVjdC5rZXlzKHRoaXMuX2dsb2JhbFRpbWVsaW5lU3R5bGVzKS5mb3JFYWNoKCh0PT57dGhpcy5fYmFja0ZpbGxbdF09dGhpcy5fZ2xvYmFsVGltZWxpbmVTdHlsZXNbdF18fGV4LHRoaXMuX2N1cnJlbnRLZXlmcmFtZVt0XT1leH0pKSx0aGlzLl9jdXJyZW50RW1wdHlTdGVwS2V5ZnJhbWU9dGhpcy5fY3VycmVudEtleWZyYW1lfXNldFN0eWxlcyh0LGUsbixvKXtlJiYodGhpcy5fcHJldmlvdXNLZXlmcmFtZS5lYXNpbmc9ZSk7Y29uc3QgaT1vJiZvLnBhcmFtc3x8e30sYT0oZnVuY3Rpb24gcih0LGUpe2NvbnN0IG49e307bGV0IG87cmV0dXJuIHQuZm9yRWFjaCgodD0+eyIqIj09PXQ/KG89b3x8T2JqZWN0LmtleXMoZSksby5mb3JFYWNoKCh0PT57blt0XT1leH0pKSk6WXgodCwhMSxuKX0pKSxufQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8pKHQsdGhpcy5fZ2xvYmFsVGltZWxpbmVTdHlsZXMpO09iamVjdC5rZXlzKGEpLmZvckVhY2goKHQ9Pntjb25zdCBlPXRPKGFbdF0saSxuKTt0aGlzLl9wZW5kaW5nU3R5bGVzW3RdPWUsdGhpcy5fbG9jYWxUaW1lbGluZVN0eWxlcy5oYXNPd25Qcm9wZXJ0eSh0KXx8KHRoaXMuX2JhY2tGaWxsW3RdPXRoaXMuX2dsb2JhbFRpbWVsaW5lU3R5bGVzLmhhc093blByb3BlcnR5KHQpP3RoaXMuX2dsb2JhbFRpbWVsaW5lU3R5bGVzW3RdOmV4KSx0aGlzLl91cGRhdGVTdHlsZSh0LGUpfSkpfWFwcGx5U3R5bGVzVG9LZXlmcmFtZSgpe2NvbnN0IHQ9dGhpcy5fcGVuZGluZ1N0eWxlcyxlPU9iamVjdC5rZXlzKHQpOzAhPWUubGVuZ3RoJiYodGhpcy5fcGVuZGluZ1N0eWxlcz17fSxlLmZvckVhY2goKGU9Pnt0aGlzLl9jdXJyZW50S2V5ZnJhbWVbZV09dFtlXX0pKSxPYmplY3Qua2V5cyh0aGlzLl9sb2NhbFRpbWVsaW5lU3R5bGVzKS5mb3JFYWNoKCh0PT57dGhpcy5fY3VycmVudEtleWZyYW1lLmhhc093blByb3BlcnR5KHQpfHwodGhpcy5fY3VycmVudEtleWZyYW1lW3RdPXRoaXMuX2xvY2FsVGltZWxpbmVTdHlsZXNbdF0pfSkpKX1zbmFwc2hvdEN1cnJlbnRTdHlsZXMoKXtPYmplY3Qua2V5cyh0aGlzLl9sb2NhbFRpbWVsaW5lU3R5bGVzKS5mb3JFYWNoKCh0PT57Y29uc3QgZT10aGlzLl9sb2NhbFRpbWVsaW5lU3R5bGVzW3RdO3RoaXMuX3BlbmRpbmdTdHlsZXNbdF09ZSx0aGlzLl91cGRhdGVTdHlsZSh0LGUpfSkpfWdldEZpbmFsS2V5ZnJhbWUoKXtyZXR1cm4gdGhpcy5fa2V5ZnJhbWVzLmdldCh0aGlzLmR1cmF0aW9uKX1nZXQgcHJvcGVydGllcygpe2NvbnN0IHQ9W107Zm9yKGxldCBlIGluIHRoaXMuX2N1cnJlbnRLZXlmcmFtZSl0LnB1c2goZSk7cmV0dXJuIHR9bWVyZ2VUaW1lbGluZUNvbGxlY3RlZFN0eWxlcyh0KXtPYmplY3Qua2V5cyh0Ll9zdHlsZVN1bW1hcnkpLmZvckVhY2goKGU9Pntjb25zdCBuPXRoaXMuX3N0eWxlU3VtbWFyeVtlXSxvPXQuX3N0eWxlU3VtbWFyeVtlXTsoIW58fG8udGltZT5uLnRpbWUpJiZ0aGlzLl91cGRhdGVTdHlsZShlLG8udmFsdWUpfSkpfWJ1aWxkS2V5ZnJhbWVzKCl7dGhpcy5hcHBseVN0eWxlc1RvS2V5ZnJhbWUoKTtjb25zdCB0PW5ldyBTZXQsZT1uZXcgU2V0LG49MT09PXRoaXMuX2tleWZyYW1lcy5zaXplJiYwPT09dGhpcy5kdXJhdGlvbjtsZXQgbz1bXTt0aGlzLl9rZXlmcmFtZXMuZm9yRWFjaCgoKGksYSk9Pntjb25zdCByPVl4KGksITApO09iamVjdC5rZXlzKHIpLmZvckVhY2goKG49Pntjb25zdCBvPXJbbl07IiEiPT1vP3QuYWRkKG4pOm89PWV4JiZlLmFkZChuKX0pKSxufHwoci5vZmZzZXQ9YS90aGlzLmR1cmF0aW9uKSxvLnB1c2gocil9KSk7Y29uc3QgaT10LnNpemU/ZU8odC52YWx1ZXMoKSk6W10sYT1lLnNpemU/ZU8oZS52YWx1ZXMoKSk6W107aWYobil7Y29uc3QgdD1vWzBdLGU9V3godCk7dC5vZmZzZXQ9MCxlLm9mZnNldD0xLG89W3QsZV19cmV0dXJuIENPKHRoaXMuZWxlbWVudCxvLGksYSx0aGlzLmR1cmF0aW9uLHRoaXMuc3RhcnRUaW1lLHRoaXMuZWFzaW5nLCExKX19Y2xhc3MgRE8gZXh0ZW5kcyBTT3tjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyPSExKXtzdXBlcih0LGUsYS5kZWxheSksdGhpcy5rZXlmcmFtZXM9bix0aGlzLnByZVN0eWxlUHJvcHM9byx0aGlzLnBvc3RTdHlsZVByb3BzPWksdGhpcy5fc3RyZXRjaFN0YXJ0aW5nS2V5ZnJhbWU9cix0aGlzLnRpbWluZ3M9e2R1cmF0aW9uOmEuZHVyYXRpb24sZGVsYXk6YS5kZWxheSxlYXNpbmc6YS5lYXNpbmd9fWNvbnRhaW5zQW5pbWF0aW9uKCl7cmV0dXJuIHRoaXMua2V5ZnJhbWVzLmxlbmd0aD4xfWJ1aWxkS2V5ZnJhbWVzKCl7bGV0IHQ9dGhpcy5rZXlmcmFtZXMse2RlbGF5OmUsZHVyYXRpb246bixlYXNpbmc6b309dGhpcy50aW1pbmdzO2lmKHRoaXMuX3N0cmV0Y2hTdGFydGluZ0tleWZyYW1lJiZlKXtjb25zdCBpPVtdLGE9bitlLHI9ZS9hLHM9WXgodFswXSwhMSk7cy5vZmZzZXQ9MCxpLnB1c2gocyk7Y29uc3QgbD1ZeCh0WzBdLCExKTtsLm9mZnNldD1FTyhyKSxpLnB1c2gobCk7Y29uc3QgYz10Lmxlbmd0aC0xO2ZvcihsZXQgbz0xO288PWM7bysrKXtsZXQgcj1ZeCh0W29dLCExKTtyLm9mZnNldD1FTygoZStyLm9mZnNldCpuKS9hKSxpLnB1c2gocil9bj1hLGU9MCxvPSIiLHQ9aX1yZXR1cm4gQ08odGhpcy5lbGVtZW50LHQsdGhpcy5wcmVTdHlsZVByb3BzLHRoaXMucG9zdFN0eWxlUHJvcHMsbixlLG8sITApfX1mdW5jdGlvbiBFTyh0LGU9Myl7Y29uc3Qgbj1NYXRoLnBvdygxMCxlLTEpO3JldHVybiBNYXRoLnJvdW5kKHQqbikvbn1jbGFzcyBST3t9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIEFPIGV4dGVuZHMgUk97bm9ybWFsaXplUHJvcGVydHlOYW1lKHQsZSl7cmV0dXJuIG9PKHQpfW5vcm1hbGl6ZVN0eWxlVmFsdWUodCxlLG4sbyl7bGV0IGk9IiI7Y29uc3QgYT1uLnRvU3RyaW5nKCkudHJpbSgpO2lmKFRPW2VdJiYwIT09biYmIjAiIT09bilpZigibnVtYmVyIj09dHlwZW9mIG4paT0icHgiO2Vsc2V7Y29uc3QgZT1uLm1hdGNoKC9eWystXT9bXGRcLl0rKFthLXpdKikkLyk7ZSYmMD09ZVsxXS5sZW5ndGgmJm8ucHVzaChgUGxlYXNlIHByb3ZpZGUgYSBDU1MgdW5pdCB2YWx1ZSBmb3IgJHt0fToke259YCl9cmV0dXJuIGEraX19Y29uc3QgVE89KGZ1bmN0aW9uIE5PKHQpe2NvbnN0IGU9e307cmV0dXJuIHQuZm9yRWFjaCgodD0+ZVt0XT0hMCkpLGV9KSgid2lkdGgsaGVpZ2h0LG1pbldpZHRoLG1pbkhlaWdodCxtYXhXaWR0aCxtYXhIZWlnaHQsbGVmdCx0b3AsYm90dG9tLHJpZ2h0LGZvbnRTaXplLG91dGxpbmVXaWR0aCxvdXRsaW5lT2Zmc2V0LHBhZGRpbmdUb3AscGFkZGluZ0xlZnQscGFkZGluZ0JvdHRvbSxwYWRkaW5nUmlnaHQsbWFyZ2luVG9wLG1hcmdpbkxlZnQsbWFyZ2luQm90dG9tLG1hcmdpblJpZ2h0LGJvcmRlclJhZGl1cyxib3JkZXJXaWR0aCxib3JkZXJUb3BXaWR0aCxib3JkZXJMZWZ0V2lkdGgsYm9yZGVyUmlnaHRXaWR0aCxib3JkZXJCb3R0b21XaWR0aCx0ZXh0SW5kZW50LHBlcnNwZWN0aXZlIi5zcGxpdCgiLCIpKTtmdW5jdGlvbiB6Tyh0LGUsbixvLGksYSxyLHMsbCxjLGQscCxtKXtyZXR1cm57dHlwZTowLGVsZW1lbnQ6dCx0cmlnZ2VyTmFtZTplLGlzUmVtb3ZhbFRyYW5zaXRpb246aSxmcm9tU3RhdGU6bixmcm9tU3R5bGVzOmEsdG9TdGF0ZTpvLHRvU3R5bGVzOnIsdGltZWxpbmVzOnMscXVlcmllZEVsZW1lbnRzOmwscHJlU3R5bGVQcm9wczpjLHBvc3RTdHlsZVByb3BzOmQsdG90YWxUaW1lOnAsZXJyb3JzOm19fWNvbnN0IElPPXt9O2NsYXNzIEhPe2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLl90cmlnZ2VyTmFtZT10LHRoaXMuYXN0PWUsdGhpcy5fc3RhdGVTdHlsZXM9bn1tYXRjaCh0LGUsbixvKXtyZXR1cm4oZnVuY3Rpb24gaSh0LGUsbixvLGEpe3JldHVybiB0LnNvbWUoKHQ9PnQoZSxuLG8sYSkpKX0pKHRoaXMuYXN0Lm1hdGNoZXJzLHQsZSxuLG8pfWJ1aWxkU3R5bGVzKHQsZSxuKXtjb25zdCBvPXRoaXMuX3N0YXRlU3R5bGVzWyIqIl0saT10aGlzLl9zdGF0ZVN0eWxlc1t0XSxhPW8/by5idWlsZFN0eWxlcyhlLG4pOnt9O3JldHVybiBpP2kuYnVpbGRTdHlsZXMoZSxuKTphfWJ1aWxkKHQsZSxuLG8saSxhLHIscyxsLGMpe2NvbnN0IGQ9W10scD10aGlzLmFzdC5vcHRpb25zJiZ0aGlzLmFzdC5vcHRpb25zLnBhcmFtc3x8SU8sbT10aGlzLmJ1aWxkU3R5bGVzKG4sciYmci5wYXJhbXN8fElPLGQpLHU9cyYmcy5wYXJhbXN8fElPLGY9dGhpcy5idWlsZFN0eWxlcyhvLHUsZCksZz1uZXcgU2V0LGg9bmV3IE1hcCxiPW5ldyBNYXAseT0idm9pZCI9PT1vLF89e3BhcmFtczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scCksdSl9LEM9Yz9bXTpPTyh0LGUsdGhpcy5hc3QuYW5pbWF0aW9uLGksYSxtLGYsXyxsLGQpO2xldCBNPTA7aWYoQy5mb3JFYWNoKCh0PT57TT1NYXRoLm1heCh0LmR1cmF0aW9uK3QuZGVsYXksTSl9KSksZC5sZW5ndGgpcmV0dXJuIHpPKGUsdGhpcy5fdHJpZ2dlck5hbWUsbixvLHksbSxmLFtdLFtdLGgsYixNLGQpO0MuZm9yRWFjaCgodD0+e2NvbnN0IG49dC5lbGVtZW50LG89TXgoaCxuLHt9KTt0LnByZVN0eWxlUHJvcHMuZm9yRWFjaCgodD0+b1t0XT0hMCkpO2NvbnN0IGk9TXgoYixuLHt9KTt0LnBvc3RTdHlsZVByb3BzLmZvckVhY2goKHQ9PmlbdF09ITApKSxuIT09ZSYmZy5hZGQobil9KSk7Y29uc3Qgdj1lTyhnLnZhbHVlcygpKTtyZXR1cm4gek8oZSx0aGlzLl90cmlnZ2VyTmFtZSxuLG8seSxtLGYsQyx2LGgsYixNKX19Y2xhc3MgRk97Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuc3R5bGVzPXQsdGhpcy5kZWZhdWx0UGFyYW1zPWUsdGhpcy5ub3JtYWxpemVyPW59YnVpbGRTdHlsZXModCxlKXtjb25zdCBuPXt9LG89V3godGhpcy5kZWZhdWx0UGFyYW1zKTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaCgoZT0+e2NvbnN0IG49dFtlXTtudWxsIT1uJiYob1tlXT1uKX0pKSx0aGlzLnN0eWxlcy5zdHlsZXMuZm9yRWFjaCgodD0+e2lmKCJzdHJpbmciIT10eXBlb2YgdCl7Y29uc3QgaT10O09iamVjdC5rZXlzKGkpLmZvckVhY2goKHQ9PntsZXQgYT1pW3RdO2EubGVuZ3RoPjEmJihhPXRPKGEsbyxlKSk7Y29uc3Qgcj10aGlzLm5vcm1hbGl6ZXIubm9ybWFsaXplUHJvcGVydHlOYW1lKHQsZSk7YT10aGlzLm5vcm1hbGl6ZXIubm9ybWFsaXplU3R5bGVWYWx1ZSh0LHIsYSxlKSxuW3JdPWF9KSl9fSkpLG59fWNsYXNzIExPe2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLm5hbWU9dCx0aGlzLmFzdD1lLHRoaXMuX25vcm1hbGl6ZXI9bix0aGlzLnRyYW5zaXRpb25GYWN0b3JpZXM9W10sdGhpcy5zdGF0ZXM9e30sZS5zdGF0ZXMuZm9yRWFjaCgodD0+e3RoaXMuc3RhdGVzW3QubmFtZV09bmV3IEZPKHQuc3R5bGUsdC5vcHRpb25zJiZ0Lm9wdGlvbnMucGFyYW1zfHx7fSxuKX0pKSxCTyh0aGlzLnN0YXRlcywidHJ1ZSIsIjEiKSxCTyh0aGlzLnN0YXRlcywiZmFsc2UiLCIwIiksZS50cmFuc2l0aW9ucy5mb3JFYWNoKChlPT57dGhpcy50cmFuc2l0aW9uRmFjdG9yaWVzLnB1c2gobmV3IEhPKHQsZSx0aGlzLnN0YXRlcykpfSkpLHRoaXMuZmFsbGJhY2tUcmFuc2l0aW9uPShmdW5jdGlvbiBvKHQsZSxuKXtyZXR1cm4gbmV3IEhPKHQse3R5cGU6MSxhbmltYXRpb246e3R5cGU6MixzdGVwczpbXSxvcHRpb25zOm51bGx9LG1hdGNoZXJzOlsodCxlKT0+ITBdLG9wdGlvbnM6bnVsbCxxdWVyeUNvdW50OjAsZGVwQ291bnQ6MH0sZSl9KSh0LHRoaXMuc3RhdGVzKX1nZXQgY29udGFpbnNRdWVyaWVzKCl7cmV0dXJuIHRoaXMuYXN0LnF1ZXJ5Q291bnQ+MH1tYXRjaFRyYW5zaXRpb24odCxlLG4sbyl7cmV0dXJuIHRoaXMudHJhbnNpdGlvbkZhY3Rvcmllcy5maW5kKChpPT5pLm1hdGNoKHQsZSxuLG8pKSl8fG51bGx9bWF0Y2hTdHlsZXModCxlLG4pe3JldHVybiB0aGlzLmZhbGxiYWNrVHJhbnNpdGlvbi5idWlsZFN0eWxlcyh0LGUsbil9fWZ1bmN0aW9uIEJPKHQsZSxuKXt0Lmhhc093blByb3BlcnR5KGUpP3QuaGFzT3duUHJvcGVydHkobil8fCh0W25dPXRbZV0pOnQuaGFzT3duUHJvcGVydHkobikmJih0W2VdPXRbbl0pfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCBWTz1uZXcgTU87Y2xhc3Mgak97Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuYm9keU5vZGU9dCx0aGlzLl9kcml2ZXI9ZSx0aGlzLl9ub3JtYWxpemVyPW4sdGhpcy5fYW5pbWF0aW9ucz17fSx0aGlzLl9wbGF5ZXJzQnlJZD17fSx0aGlzLnBsYXllcnM9W119cmVnaXN0ZXIodCxlKXtjb25zdCBuPVtdLG89Zk8odGhpcy5fZHJpdmVyLGUsbik7aWYobi5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gYnVpbGQgdGhlIGFuaW1hdGlvbiBkdWUgdG8gdGhlIGZvbGxvd2luZyBlcnJvcnM6ICR7bi5qb2luKCJcbiIpfWApO3RoaXMuX2FuaW1hdGlvbnNbdF09b31fYnVpbGRQbGF5ZXIodCxlLG4pe2NvbnN0IG89dC5lbGVtZW50LGk9YngoMCx0aGlzLl9ub3JtYWxpemVyLDAsdC5rZXlmcmFtZXMsZSxuKTtyZXR1cm4gdGhpcy5fZHJpdmVyLmFuaW1hdGUobyxpLHQuZHVyYXRpb24sdC5kZWxheSx0LmVhc2luZyxbXSwhMCl9Y3JlYXRlKHQsZSxuPXt9KXtjb25zdCBvPVtdLGk9dGhpcy5fYW5pbWF0aW9uc1t0XTtsZXQgYTtjb25zdCByPW5ldyBNYXA7aWYoaT8oYT1PTyh0aGlzLl9kcml2ZXIsZSxpLEl4LEh4LHt9LHt9LG4sVk8sbyksYS5mb3JFYWNoKCh0PT57Y29uc3QgZT1NeChyLHQuZWxlbWVudCx7fSk7dC5wb3N0U3R5bGVQcm9wcy5mb3JFYWNoKCh0PT5lW3RdPW51bGwpKX0pKSk6KG8ucHVzaCgiVGhlIHJlcXVlc3RlZCBhbmltYXRpb24gZG9lc24ndCBleGlzdCBvciBoYXMgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZCIpLGE9W10pLG8ubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGNyZWF0ZSB0aGUgYW5pbWF0aW9uIGR1ZSB0byB0aGUgZm9sbG93aW5nIGVycm9yczogJHtvLmpvaW4oIlxuIil9YCk7ci5mb3JFYWNoKCgodCxlKT0+e09iamVjdC5rZXlzKHQpLmZvckVhY2goKG49Pnt0W25dPXRoaXMuX2RyaXZlci5jb21wdXRlU3R5bGUoZSxuLGV4KX0pKX0pKTtjb25zdCBzPWh4KGEubWFwKCh0PT57Y29uc3QgZT1yLmdldCh0LmVsZW1lbnQpO3JldHVybiB0aGlzLl9idWlsZFBsYXllcih0LHt9LGUpfSkpKTtyZXR1cm4gdGhpcy5fcGxheWVyc0J5SWRbdF09cyxzLm9uRGVzdHJveSgoKCk9PnRoaXMuZGVzdHJveSh0KSkpLHRoaXMucGxheWVycy5wdXNoKHMpLHN9ZGVzdHJveSh0KXtjb25zdCBlPXRoaXMuX2dldFBsYXllcih0KTtlLmRlc3Ryb3koKSxkZWxldGUgdGhpcy5fcGxheWVyc0J5SWRbdF07Y29uc3Qgbj10aGlzLnBsYXllcnMuaW5kZXhPZihlKTtuPj0wJiZ0aGlzLnBsYXllcnMuc3BsaWNlKG4sMSl9X2dldFBsYXllcih0KXtjb25zdCBlPXRoaXMuX3BsYXllcnNCeUlkW3RdO2lmKCFlKXRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGZpbmQgdGhlIHRpbWVsaW5lIHBsYXllciByZWZlcmVuY2VkIGJ5ICR7dH1gKTtyZXR1cm4gZX1saXN0ZW4odCxlLG4sbyl7Y29uc3QgaT1DeChlLCIiLCIiLCIiKTtyZXR1cm4geXgodGhpcy5fZ2V0UGxheWVyKHQpLG4saSxvKSwoKT0+e319Y29tbWFuZCh0LGUsbixvKXtpZigicmVnaXN0ZXIiPT1uKXJldHVybiB2b2lkIHRoaXMucmVnaXN0ZXIodCxvWzBdKTtpZigiY3JlYXRlIj09bilyZXR1cm4gdm9pZCB0aGlzLmNyZWF0ZSh0LGUsb1swXXx8e30pO2NvbnN0IGk9dGhpcy5fZ2V0UGxheWVyKHQpO3N3aXRjaChuKXtjYXNlInBsYXkiOmkucGxheSgpO2JyZWFrO2Nhc2UicGF1c2UiOmkucGF1c2UoKTticmVhaztjYXNlInJlc2V0IjppLnJlc2V0KCk7YnJlYWs7Y2FzZSJyZXN0YXJ0IjppLnJlc3RhcnQoKTticmVhaztjYXNlImZpbmlzaCI6aS5maW5pc2goKTticmVhaztjYXNlImluaXQiOmkuaW5pdCgpO2JyZWFrO2Nhc2Uic2V0UG9zaXRpb24iOmkuc2V0UG9zaXRpb24ocGFyc2VGbG9hdChvWzBdKSk7YnJlYWs7Y2FzZSJkZXN0cm95Ijp0aGlzLmRlc3Ryb3kodCl9fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3QgVU89Im5nLWFuaW1hdGUtcXVldWVkIixHTz0ibmctYW5pbWF0ZS1kaXNhYmxlZCIsV089Ii5uZy1hbmltYXRlLWRpc2FibGVkIixZTz1bXSxxTz17bmFtZXNwYWNlSWQ6IiIsc2V0Rm9yUmVtb3ZhbDohMSxzZXRGb3JNb3ZlOiExLGhhc0FuaW1hdGlvbjohMSxyZW1vdmVkQmVmb3JlUXVlcmllZDohMX0sWk89e25hbWVzcGFjZUlkOiIiLHNldEZvck1vdmU6ITEsc2V0Rm9yUmVtb3ZhbDohMSxoYXNBbmltYXRpb246ITEscmVtb3ZlZEJlZm9yZVF1ZXJpZWQ6ITB9O2NsYXNzIFhPe2NvbnN0cnVjdG9yKHQsZT0iIil7dGhpcy5uYW1lc3BhY2VJZD1lO2NvbnN0IG49dCYmdC5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKTtpZih0aGlzLnZhbHVlPShmdW5jdGlvbiBvKHQpe3JldHVybiBudWxsIT10P3Q6bnVsbH0pKG4/dC52YWx1ZTp0KSxuKXtjb25zdCBlPVd4KHQpO2RlbGV0ZSBlLnZhbHVlLHRoaXMub3B0aW9ucz1lfWVsc2UgdGhpcy5vcHRpb25zPXt9O3RoaXMub3B0aW9ucy5wYXJhbXN8fCh0aGlzLm9wdGlvbnMucGFyYW1zPXt9KX1nZXQgcGFyYW1zKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5wYXJhbXN9YWJzb3JiT3B0aW9ucyh0KXtjb25zdCBlPXQucGFyYW1zO2lmKGUpe2NvbnN0IHQ9dGhpcy5vcHRpb25zLnBhcmFtcztPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChuPT57bnVsbD09dFtuXSYmKHRbbl09ZVtuXSl9KSl9fX1jb25zdCBLTz0idm9pZCIsSk89bmV3IFhPKEtPKTtjbGFzcyBRT3tjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5pZD10LHRoaXMuaG9zdEVsZW1lbnQ9ZSx0aGlzLl9lbmdpbmU9bix0aGlzLnBsYXllcnM9W10sdGhpcy5fdHJpZ2dlcnM9e30sdGhpcy5fcXVldWU9W10sdGhpcy5fZWxlbWVudExpc3RlbmVycz1uZXcgTWFwLHRoaXMuX2hvc3RDbGFzc05hbWU9Im5nLXRucy0iK3QsYVAoZSx0aGlzLl9ob3N0Q2xhc3NOYW1lKX1saXN0ZW4odCxlLG4sbyl7aWYoIXRoaXMuX3RyaWdnZXJzLmhhc093blByb3BlcnR5KGUpKXRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxpc3RlbiBvbiB0aGUgYW5pbWF0aW9uIHRyaWdnZXIgZXZlbnQgIiR7bn0iIGJlY2F1c2UgdGhlIGFuaW1hdGlvbiB0cmlnZ2VyICIke2V9IiBkb2Vzbid0IGV4aXN0IWApO2lmKG51bGw9PW58fDA9PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxpc3RlbiBvbiB0aGUgYW5pbWF0aW9uIHRyaWdnZXIgIiR7ZX0iIGJlY2F1c2UgdGhlIHByb3ZpZGVkIGV2ZW50IGlzIHVuZGVmaW5lZCFgKTtpZighKGZ1bmN0aW9uIGkodCl7cmV0dXJuInN0YXJ0Ij09dHx8ImRvbmUiPT10fSkobikpdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvdmlkZWQgYW5pbWF0aW9uIHRyaWdnZXIgZXZlbnQgIiR7bn0iIGZvciB0aGUgYW5pbWF0aW9uIHRyaWdnZXIgIiR7ZX0iIGlzIG5vdCBzdXBwb3J0ZWQhYCk7Y29uc3QgYT1NeCh0aGlzLl9lbGVtZW50TGlzdGVuZXJzLHQsW10pLHI9e25hbWU6ZSxwaGFzZTpuLGNhbGxiYWNrOm99O2EucHVzaChyKTtjb25zdCBzPU14KHRoaXMuX2VuZ2luZS5zdGF0ZXNCeUVsZW1lbnQsdCx7fSk7cmV0dXJuIHMuaGFzT3duUHJvcGVydHkoZSl8fChhUCh0LEZ4KSxhUCh0LCJuZy10cmlnZ2VyLSIrZSksc1tlXT1KTyksKCk9Pnt0aGlzLl9lbmdpbmUuYWZ0ZXJGbHVzaCgoKCk9Pntjb25zdCB0PWEuaW5kZXhPZihyKTt0Pj0wJiZhLnNwbGljZSh0LDEpLHRoaXMuX3RyaWdnZXJzW2VdfHxkZWxldGUgc1tlXX0pKX19cmVnaXN0ZXIodCxlKXtyZXR1cm4hdGhpcy5fdHJpZ2dlcnNbdF0mJih0aGlzLl90cmlnZ2Vyc1t0XT1lLCEwKX1fZ2V0VHJpZ2dlcih0KXtjb25zdCBlPXRoaXMuX3RyaWdnZXJzW3RdO2lmKCFlKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3ZpZGVkIGFuaW1hdGlvbiB0cmlnZ2VyICIke3R9IiBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZCFgKTtyZXR1cm4gZX10cmlnZ2VyKHQsZSxuLG89ITApe2NvbnN0IGk9dGhpcy5fZ2V0VHJpZ2dlcihlKSxhPW5ldyB0UCh0aGlzLmlkLGUsdCk7bGV0IHI9dGhpcy5fZW5naW5lLnN0YXRlc0J5RWxlbWVudC5nZXQodCk7cnx8KGFQKHQsRngpLGFQKHQsIm5nLXRyaWdnZXItIitlKSx0aGlzLl9lbmdpbmUuc3RhdGVzQnlFbGVtZW50LnNldCh0LHI9e30pKTtsZXQgcz1yW2VdO2NvbnN0IGw9bmV3IFhPKG4sdGhpcy5pZCk7aWYoIShuJiZuLmhhc093blByb3BlcnR5KCJ2YWx1ZSIpKSYmcyYmbC5hYnNvcmJPcHRpb25zKHMub3B0aW9ucykscltlXT1sLHN8fChzPUpPKSxsLnZhbHVlIT09S08mJnMudmFsdWU9PT1sLnZhbHVlKXtpZighKGZ1bmN0aW9uIGUodCxuKXtjb25zdCBvPU9iamVjdC5rZXlzKHQpLGk9T2JqZWN0LmtleXMobik7aWYoby5sZW5ndGghPWkubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgZT0wO2U8by5sZW5ndGg7ZSsrKXtjb25zdCBpPW9bZV07aWYoIW4uaGFzT3duUHJvcGVydHkoaSl8fHRbaV0hPT1uW2ldKXJldHVybiExfXJldHVybiEwfSkocy5wYXJhbXMsbC5wYXJhbXMpKXtjb25zdCBlPVtdLG49aS5tYXRjaFN0eWxlcyhzLnZhbHVlLHMucGFyYW1zLGUpLG89aS5tYXRjaFN0eWxlcyhsLnZhbHVlLGwucGFyYW1zLGUpO2UubGVuZ3RoP3RoaXMuX2VuZ2luZS5yZXBvcnRFcnJvcihlKTp0aGlzLl9lbmdpbmUuYWZ0ZXJGbHVzaCgoKCk9PntLeCh0LG4pLFh4KHQsbyl9KSl9cmV0dXJufWNvbnN0IGM9TXgodGhpcy5fZW5naW5lLnBsYXllcnNCeUVsZW1lbnQsdCxbXSk7Yy5mb3JFYWNoKCh0PT57dC5uYW1lc3BhY2VJZD09dGhpcy5pZCYmdC50cmlnZ2VyTmFtZT09ZSYmdC5xdWV1ZWQmJnQuZGVzdHJveSgpfSkpO2xldCBkPWkubWF0Y2hUcmFuc2l0aW9uKHMudmFsdWUsbC52YWx1ZSx0LGwucGFyYW1zKSxwPSExO2lmKCFkKXtpZighbylyZXR1cm47ZD1pLmZhbGxiYWNrVHJhbnNpdGlvbixwPSEwfXJldHVybiB0aGlzLl9lbmdpbmUudG90YWxRdWV1ZWRQbGF5ZXJzKyssdGhpcy5fcXVldWUucHVzaCh7ZWxlbWVudDp0LHRyaWdnZXJOYW1lOmUsdHJhbnNpdGlvbjpkLGZyb21TdGF0ZTpzLHRvU3RhdGU6bCxwbGF5ZXI6YSxpc0ZhbGxiYWNrVHJhbnNpdGlvbjpwfSkscHx8KGFQKHQsVU8pLGEub25TdGFydCgoKCk9PntyUCh0LFVPKX0pKSksYS5vbkRvbmUoKCgpPT57bGV0IGU9dGhpcy5wbGF5ZXJzLmluZGV4T2YoYSk7ZT49MCYmdGhpcy5wbGF5ZXJzLnNwbGljZShlLDEpO2NvbnN0IG49dGhpcy5fZW5naW5lLnBsYXllcnNCeUVsZW1lbnQuZ2V0KHQpO2lmKG4pe2xldCB0PW4uaW5kZXhPZihhKTt0Pj0wJiZuLnNwbGljZSh0LDEpfX0pKSx0aGlzLnBsYXllcnMucHVzaChhKSxjLnB1c2goYSksYX1kZXJlZ2lzdGVyKHQpe2RlbGV0ZSB0aGlzLl90cmlnZ2Vyc1t0XSx0aGlzLl9lbmdpbmUuc3RhdGVzQnlFbGVtZW50LmZvckVhY2goKChlLG4pPT57ZGVsZXRlIGVbdF19KSksdGhpcy5fZWxlbWVudExpc3RlbmVycy5mb3JFYWNoKCgoZSxuKT0+e3RoaXMuX2VsZW1lbnRMaXN0ZW5lcnMuc2V0KG4sZS5maWx0ZXIoKGU9PmUubmFtZSE9dCkpKX0pKX1jbGVhckVsZW1lbnRDYWNoZSh0KXt0aGlzLl9lbmdpbmUuc3RhdGVzQnlFbGVtZW50LmRlbGV0ZSh0KSx0aGlzLl9lbGVtZW50TGlzdGVuZXJzLmRlbGV0ZSh0KTtjb25zdCBlPXRoaXMuX2VuZ2luZS5wbGF5ZXJzQnlFbGVtZW50LmdldCh0KTtlJiYoZS5mb3JFYWNoKCh0PT50LmRlc3Ryb3koKSkpLHRoaXMuX2VuZ2luZS5wbGF5ZXJzQnlFbGVtZW50LmRlbGV0ZSh0KSl9X3NpZ25hbFJlbW92YWxGb3JJbm5lclRyaWdnZXJzKHQsZSl7Y29uc3Qgbj10aGlzLl9lbmdpbmUuZHJpdmVyLnF1ZXJ5KHQsTHgsITApO24uZm9yRWFjaCgodD0+e2lmKHQuX19uZ19yZW1vdmVkKXJldHVybjtjb25zdCBuPXRoaXMuX2VuZ2luZS5mZXRjaE5hbWVzcGFjZXNCeUVsZW1lbnQodCk7bi5zaXplP24uZm9yRWFjaCgobj0+bi50cmlnZ2VyTGVhdmVBbmltYXRpb24odCxlLCExLCEwKSkpOnRoaXMuY2xlYXJFbGVtZW50Q2FjaGUodCl9KSksdGhpcy5fZW5naW5lLmFmdGVyRmx1c2hBbmltYXRpb25zRG9uZSgoKCk9Pm4uZm9yRWFjaCgodD0+dGhpcy5jbGVhckVsZW1lbnRDYWNoZSh0KSkpKSl9dHJpZ2dlckxlYXZlQW5pbWF0aW9uKHQsZSxuLG8pe2NvbnN0IGk9dGhpcy5fZW5naW5lLnN0YXRlc0J5RWxlbWVudC5nZXQodCk7aWYoaSl7Y29uc3QgYT1bXTtpZihPYmplY3Qua2V5cyhpKS5mb3JFYWNoKChlPT57aWYodGhpcy5fdHJpZ2dlcnNbZV0pe2NvbnN0IG49dGhpcy50cmlnZ2VyKHQsZSxLTyxvKTtuJiZhLnB1c2gobil9fSkpLGEubGVuZ3RoKXJldHVybiB0aGlzLl9lbmdpbmUubWFya0VsZW1lbnRBc1JlbW92ZWQodGhpcy5pZCx0LCEwLGUpLG4mJmh4KGEpLm9uRG9uZSgoKCk9PnRoaXMuX2VuZ2luZS5wcm9jZXNzTGVhdmVOb2RlKHQpKSksITB9cmV0dXJuITF9cHJlcGFyZUxlYXZlQW5pbWF0aW9uTGlzdGVuZXJzKHQpe2NvbnN0IGU9dGhpcy5fZWxlbWVudExpc3RlbmVycy5nZXQodCksbj10aGlzLl9lbmdpbmUuc3RhdGVzQnlFbGVtZW50LmdldCh0KTtpZihlJiZuKXtjb25zdCBvPW5ldyBTZXQ7ZS5mb3JFYWNoKChlPT57Y29uc3QgaT1lLm5hbWU7aWYoby5oYXMoaSkpcmV0dXJuO28uYWRkKGkpO2NvbnN0IGE9dGhpcy5fdHJpZ2dlcnNbaV0uZmFsbGJhY2tUcmFuc2l0aW9uLHI9bltpXXx8Sk8scz1uZXcgWE8oS08pLGw9bmV3IHRQKHRoaXMuaWQsaSx0KTt0aGlzLl9lbmdpbmUudG90YWxRdWV1ZWRQbGF5ZXJzKyssdGhpcy5fcXVldWUucHVzaCh7ZWxlbWVudDp0LHRyaWdnZXJOYW1lOmksdHJhbnNpdGlvbjphLGZyb21TdGF0ZTpyLHRvU3RhdGU6cyxwbGF5ZXI6bCxpc0ZhbGxiYWNrVHJhbnNpdGlvbjohMH0pfSkpfX1yZW1vdmVOb2RlKHQsZSl7Y29uc3Qgbj10aGlzLl9lbmdpbmU7aWYodC5jaGlsZEVsZW1lbnRDb3VudCYmdGhpcy5fc2lnbmFsUmVtb3ZhbEZvcklubmVyVHJpZ2dlcnModCxlKSx0aGlzLnRyaWdnZXJMZWF2ZUFuaW1hdGlvbih0LGUsITApKXJldHVybjtsZXQgbz0hMTtpZihuLnRvdGFsQW5pbWF0aW9ucyl7Y29uc3QgZT1uLnBsYXllcnMubGVuZ3RoP24ucGxheWVyc0J5UXVlcmllZEVsZW1lbnQuZ2V0KHQpOltdO2lmKGUmJmUubGVuZ3RoKW89ITA7ZWxzZXtsZXQgZT10O2Zvcig7ZT1lLnBhcmVudE5vZGU7KWlmKG4uc3RhdGVzQnlFbGVtZW50LmdldChlKSl7bz0hMDticmVha319fWlmKHRoaXMucHJlcGFyZUxlYXZlQW5pbWF0aW9uTGlzdGVuZXJzKHQpLG8pbi5tYXJrRWxlbWVudEFzUmVtb3ZlZCh0aGlzLmlkLHQsITEsZSk7ZWxzZXtjb25zdCBvPXQuX19uZ19yZW1vdmVkO28mJm8hPT1xT3x8KG4uYWZ0ZXJGbHVzaCgoKCk9PnRoaXMuY2xlYXJFbGVtZW50Q2FjaGUodCkpKSxuLmRlc3Ryb3lJbm5lckFuaW1hdGlvbnModCksbi5fb25SZW1vdmFsQ29tcGxldGUodCxlKSl9fWluc2VydE5vZGUodCxlKXthUCh0LHRoaXMuX2hvc3RDbGFzc05hbWUpfWRyYWluUXVldWVkVHJhbnNpdGlvbnModCl7Y29uc3QgZT1bXTtyZXR1cm4gdGhpcy5fcXVldWUuZm9yRWFjaCgobj0+e2NvbnN0IG89bi5wbGF5ZXI7aWYoby5kZXN0cm95ZWQpcmV0dXJuO2NvbnN0IGk9bi5lbGVtZW50LGE9dGhpcy5fZWxlbWVudExpc3RlbmVycy5nZXQoaSk7YSYmYS5mb3JFYWNoKChlPT57aWYoZS5uYW1lPT1uLnRyaWdnZXJOYW1lKXtjb25zdCBvPUN4KGksbi50cmlnZ2VyTmFtZSxuLmZyb21TdGF0ZS52YWx1ZSxuLnRvU3RhdGUudmFsdWUpO28uX2RhdGE9dCx5eChuLnBsYXllcixlLnBoYXNlLG8sZS5jYWxsYmFjayl9fSkpLG8ubWFya2VkRm9yRGVzdHJveT90aGlzLl9lbmdpbmUuYWZ0ZXJGbHVzaCgoKCk9PntvLmRlc3Ryb3koKX0pKTplLnB1c2gobil9KSksdGhpcy5fcXVldWU9W10sZS5zb3J0KCgodCxlKT0+e2NvbnN0IG49dC50cmFuc2l0aW9uLmFzdC5kZXBDb3VudCxvPWUudHJhbnNpdGlvbi5hc3QuZGVwQ291bnQ7cmV0dXJuIDA9PW58fDA9PW8/bi1vOnRoaXMuX2VuZ2luZS5kcml2ZXIuY29udGFpbnNFbGVtZW50KHQuZWxlbWVudCxlLmVsZW1lbnQpPzE6LTF9KSl9ZGVzdHJveSh0KXt0aGlzLnBsYXllcnMuZm9yRWFjaCgodD0+dC5kZXN0cm95KCkpKSx0aGlzLl9zaWduYWxSZW1vdmFsRm9ySW5uZXJUcmlnZ2Vycyh0aGlzLmhvc3RFbGVtZW50LHQpfWVsZW1lbnRDb250YWluc0RhdGEodCl7bGV0IGU9ITE7cmV0dXJuIHRoaXMuX2VsZW1lbnRMaXN0ZW5lcnMuaGFzKHQpJiYoZT0hMCksZT0hIXRoaXMuX3F1ZXVlLmZpbmQoKGU9PmUuZWxlbWVudD09PXQpKXx8ZSxlfX1jbGFzcyAkT3tjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5ib2R5Tm9kZT10LHRoaXMuZHJpdmVyPWUsdGhpcy5fbm9ybWFsaXplcj1uLHRoaXMucGxheWVycz1bXSx0aGlzLm5ld0hvc3RFbGVtZW50cz1uZXcgTWFwLHRoaXMucGxheWVyc0J5RWxlbWVudD1uZXcgTWFwLHRoaXMucGxheWVyc0J5UXVlcmllZEVsZW1lbnQ9bmV3IE1hcCx0aGlzLnN0YXRlc0J5RWxlbWVudD1uZXcgTWFwLHRoaXMuZGlzYWJsZWROb2Rlcz1uZXcgU2V0LHRoaXMudG90YWxBbmltYXRpb25zPTAsdGhpcy50b3RhbFF1ZXVlZFBsYXllcnM9MCx0aGlzLl9uYW1lc3BhY2VMb29rdXA9e30sdGhpcy5fbmFtZXNwYWNlTGlzdD1bXSx0aGlzLl9mbHVzaEZucz1bXSx0aGlzLl93aGVuUXVpZXRGbnM9W10sdGhpcy5uYW1lc3BhY2VzQnlIb3N0RWxlbWVudD1uZXcgTWFwLHRoaXMuY29sbGVjdGVkRW50ZXJFbGVtZW50cz1bXSx0aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHM9W10sdGhpcy5vblJlbW92YWxDb21wbGV0ZT0odCxlKT0+e319X29uUmVtb3ZhbENvbXBsZXRlKHQsZSl7dGhpcy5vblJlbW92YWxDb21wbGV0ZSh0LGUpfWdldCBxdWV1ZWRQbGF5ZXJzKCl7Y29uc3QgdD1bXTtyZXR1cm4gdGhpcy5fbmFtZXNwYWNlTGlzdC5mb3JFYWNoKChlPT57ZS5wbGF5ZXJzLmZvckVhY2goKGU9PntlLnF1ZXVlZCYmdC5wdXNoKGUpfSkpfSkpLHR9Y3JlYXRlTmFtZXNwYWNlKHQsZSl7Y29uc3Qgbj1uZXcgUU8odCxlLHRoaXMpO3JldHVybiB0aGlzLmJvZHlOb2RlJiZ0aGlzLmRyaXZlci5jb250YWluc0VsZW1lbnQodGhpcy5ib2R5Tm9kZSxlKT90aGlzLl9iYWxhbmNlTmFtZXNwYWNlTGlzdChuLGUpOih0aGlzLm5ld0hvc3RFbGVtZW50cy5zZXQoZSxuKSx0aGlzLmNvbGxlY3RFbnRlckVsZW1lbnQoZSkpLHRoaXMuX25hbWVzcGFjZUxvb2t1cFt0XT1ufV9iYWxhbmNlTmFtZXNwYWNlTGlzdCh0LGUpe2NvbnN0IG49dGhpcy5fbmFtZXNwYWNlTGlzdC5sZW5ndGgtMTtpZihuPj0wKXtsZXQgbz0hMTtmb3IobGV0IGk9bjtpPj0wO2ktLSlpZih0aGlzLmRyaXZlci5jb250YWluc0VsZW1lbnQodGhpcy5fbmFtZXNwYWNlTGlzdFtpXS5ob3N0RWxlbWVudCxlKSl7dGhpcy5fbmFtZXNwYWNlTGlzdC5zcGxpY2UoaSsxLDAsdCksbz0hMDticmVha31vfHx0aGlzLl9uYW1lc3BhY2VMaXN0LnNwbGljZSgwLDAsdCl9ZWxzZSB0aGlzLl9uYW1lc3BhY2VMaXN0LnB1c2godCk7cmV0dXJuIHRoaXMubmFtZXNwYWNlc0J5SG9zdEVsZW1lbnQuc2V0KGUsdCksdH1yZWdpc3Rlcih0LGUpe2xldCBuPXRoaXMuX25hbWVzcGFjZUxvb2t1cFt0XTtyZXR1cm4gbnx8KG49dGhpcy5jcmVhdGVOYW1lc3BhY2UodCxlKSksbn1yZWdpc3RlclRyaWdnZXIodCxlLG4pe2xldCBvPXRoaXMuX25hbWVzcGFjZUxvb2t1cFt0XTtvJiZvLnJlZ2lzdGVyKGUsbikmJnRoaXMudG90YWxBbmltYXRpb25zKyt9ZGVzdHJveSh0LGUpe2lmKCF0KXJldHVybjtjb25zdCBuPXRoaXMuX2ZldGNoTmFtZXNwYWNlKHQpO3RoaXMuYWZ0ZXJGbHVzaCgoKCk9Pnt0aGlzLm5hbWVzcGFjZXNCeUhvc3RFbGVtZW50LmRlbGV0ZShuLmhvc3RFbGVtZW50KSxkZWxldGUgdGhpcy5fbmFtZXNwYWNlTG9va3VwW3RdO2NvbnN0IGU9dGhpcy5fbmFtZXNwYWNlTGlzdC5pbmRleE9mKG4pO2U+PTAmJnRoaXMuX25hbWVzcGFjZUxpc3Quc3BsaWNlKGUsMSl9KSksdGhpcy5hZnRlckZsdXNoQW5pbWF0aW9uc0RvbmUoKCgpPT5uLmRlc3Ryb3koZSkpKX1fZmV0Y2hOYW1lc3BhY2UodCl7cmV0dXJuIHRoaXMuX25hbWVzcGFjZUxvb2t1cFt0XX1mZXRjaE5hbWVzcGFjZXNCeUVsZW1lbnQodCl7Y29uc3QgZT1uZXcgU2V0LG49dGhpcy5zdGF0ZXNCeUVsZW1lbnQuZ2V0KHQpO2lmKG4pe2NvbnN0IHQ9T2JqZWN0LmtleXMobik7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGk9blt0W29dXS5uYW1lc3BhY2VJZDtpZihpKXtjb25zdCB0PXRoaXMuX2ZldGNoTmFtZXNwYWNlKGkpO3QmJmUuYWRkKHQpfX19cmV0dXJuIGV9dHJpZ2dlcih0LGUsbixvKXtpZihlUChlKSl7Y29uc3QgaT10aGlzLl9mZXRjaE5hbWVzcGFjZSh0KTtpZihpKXJldHVybiBpLnRyaWdnZXIoZSxuLG8pLCEwfXJldHVybiExfWluc2VydE5vZGUodCxlLG4sbyl7aWYoIWVQKGUpKXJldHVybjtjb25zdCBpPWUuX19uZ19yZW1vdmVkO2lmKGkmJmkuc2V0Rm9yUmVtb3ZhbCl7aS5zZXRGb3JSZW1vdmFsPSExLGkuc2V0Rm9yTW92ZT0hMDtjb25zdCB0PXRoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50cy5pbmRleE9mKGUpO3Q+PTAmJnRoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50cy5zcGxpY2UodCwxKX1pZih0KXtjb25zdCBvPXRoaXMuX2ZldGNoTmFtZXNwYWNlKHQpO28mJm8uaW5zZXJ0Tm9kZShlLG4pfW8mJnRoaXMuY29sbGVjdEVudGVyRWxlbWVudChlKX1jb2xsZWN0RW50ZXJFbGVtZW50KHQpe3RoaXMuY29sbGVjdGVkRW50ZXJFbGVtZW50cy5wdXNoKHQpfW1hcmtFbGVtZW50QXNEaXNhYmxlZCh0LGUpe2U/dGhpcy5kaXNhYmxlZE5vZGVzLmhhcyh0KXx8KHRoaXMuZGlzYWJsZWROb2Rlcy5hZGQodCksYVAodCxHTykpOnRoaXMuZGlzYWJsZWROb2Rlcy5oYXModCkmJih0aGlzLmRpc2FibGVkTm9kZXMuZGVsZXRlKHQpLHJQKHQsR08pKX1yZW1vdmVOb2RlKHQsZSxuLG8pe2lmKGVQKGUpKXtjb25zdCBpPXQ/dGhpcy5fZmV0Y2hOYW1lc3BhY2UodCk6bnVsbDtpZihpP2kucmVtb3ZlTm9kZShlLG8pOnRoaXMubWFya0VsZW1lbnRBc1JlbW92ZWQodCxlLCExLG8pLG4pe2NvbnN0IG49dGhpcy5uYW1lc3BhY2VzQnlIb3N0RWxlbWVudC5nZXQoZSk7biYmbi5pZCE9PXQmJm4ucmVtb3ZlTm9kZShlLG8pfX1lbHNlIHRoaXMuX29uUmVtb3ZhbENvbXBsZXRlKGUsbyl9bWFya0VsZW1lbnRBc1JlbW92ZWQodCxlLG4sbyl7dGhpcy5jb2xsZWN0ZWRMZWF2ZUVsZW1lbnRzLnB1c2goZSksZS5fX25nX3JlbW92ZWQ9e25hbWVzcGFjZUlkOnQsc2V0Rm9yUmVtb3ZhbDpvLGhhc0FuaW1hdGlvbjpuLHJlbW92ZWRCZWZvcmVRdWVyaWVkOiExfX1saXN0ZW4odCxlLG4sbyxpKXtyZXR1cm4gZVAoZSk/dGhpcy5fZmV0Y2hOYW1lc3BhY2UodCkubGlzdGVuKGUsbixvLGkpOigpPT57fX1fYnVpbGRJbnN0cnVjdGlvbih0LGUsbixvLGkpe3JldHVybiB0LnRyYW5zaXRpb24uYnVpbGQodGhpcy5kcml2ZXIsdC5lbGVtZW50LHQuZnJvbVN0YXRlLnZhbHVlLHQudG9TdGF0ZS52YWx1ZSxuLG8sdC5mcm9tU3RhdGUub3B0aW9ucyx0LnRvU3RhdGUub3B0aW9ucyxlLGkpfWRlc3Ryb3lJbm5lckFuaW1hdGlvbnModCl7bGV0IGU9dGhpcy5kcml2ZXIucXVlcnkodCxMeCwhMCk7ZS5mb3JFYWNoKCh0PT50aGlzLmRlc3Ryb3lBY3RpdmVBbmltYXRpb25zRm9yRWxlbWVudCh0KSkpLDAhPXRoaXMucGxheWVyc0J5UXVlcmllZEVsZW1lbnQuc2l6ZSYmKGU9dGhpcy5kcml2ZXIucXVlcnkodCxWeCwhMCksZS5mb3JFYWNoKCh0PT50aGlzLmZpbmlzaEFjdGl2ZVF1ZXJpZWRBbmltYXRpb25PbkVsZW1lbnQodCkpKSl9ZGVzdHJveUFjdGl2ZUFuaW1hdGlvbnNGb3JFbGVtZW50KHQpe2NvbnN0IGU9dGhpcy5wbGF5ZXJzQnlFbGVtZW50LmdldCh0KTtlJiZlLmZvckVhY2goKHQ9Pnt0LnF1ZXVlZD90Lm1hcmtlZEZvckRlc3Ryb3k9ITA6dC5kZXN0cm95KCl9KSl9ZmluaXNoQWN0aXZlUXVlcmllZEFuaW1hdGlvbk9uRWxlbWVudCh0KXtjb25zdCBlPXRoaXMucGxheWVyc0J5UXVlcmllZEVsZW1lbnQuZ2V0KHQpO2UmJmUuZm9yRWFjaCgodD0+dC5maW5pc2goKSkpfXdoZW5SZW5kZXJpbmdEb25lKCl7cmV0dXJuIG5ldyBQcm9taXNlKCh0PT57aWYodGhpcy5wbGF5ZXJzLmxlbmd0aClyZXR1cm4gaHgodGhpcy5wbGF5ZXJzKS5vbkRvbmUoKCgpPT50KCkpKTt0KCl9KSl9cHJvY2Vzc0xlYXZlTm9kZSh0KXtjb25zdCBlPXQuX19uZ19yZW1vdmVkO2lmKGUmJmUuc2V0Rm9yUmVtb3ZhbCl7aWYodC5fX25nX3JlbW92ZWQ9cU8sZS5uYW1lc3BhY2VJZCl7dGhpcy5kZXN0cm95SW5uZXJBbmltYXRpb25zKHQpO2NvbnN0IG49dGhpcy5fZmV0Y2hOYW1lc3BhY2UoZS5uYW1lc3BhY2VJZCk7biYmbi5jbGVhckVsZW1lbnRDYWNoZSh0KX10aGlzLl9vblJlbW92YWxDb21wbGV0ZSh0LGUuc2V0Rm9yUmVtb3ZhbCl9dGhpcy5kcml2ZXIubWF0Y2hlc0VsZW1lbnQodCxXTykmJnRoaXMubWFya0VsZW1lbnRBc0Rpc2FibGVkKHQsITEpLHRoaXMuZHJpdmVyLnF1ZXJ5KHQsV08sITApLmZvckVhY2goKHQ9Pnt0aGlzLm1hcmtFbGVtZW50QXNEaXNhYmxlZCh0LCExKX0pKX1mbHVzaCh0PS0xKXtsZXQgZT1bXTtpZih0aGlzLm5ld0hvc3RFbGVtZW50cy5zaXplJiYodGhpcy5uZXdIb3N0RWxlbWVudHMuZm9yRWFjaCgoKHQsZSk9PnRoaXMuX2JhbGFuY2VOYW1lc3BhY2VMaXN0KHQsZSkpKSx0aGlzLm5ld0hvc3RFbGVtZW50cy5jbGVhcigpKSx0aGlzLnRvdGFsQW5pbWF0aW9ucyYmdGhpcy5jb2xsZWN0ZWRFbnRlckVsZW1lbnRzLmxlbmd0aClmb3IobGV0IHQ9MDt0PHRoaXMuY29sbGVjdGVkRW50ZXJFbGVtZW50cy5sZW5ndGg7dCsrKWFQKHRoaXMuY29sbGVjdGVkRW50ZXJFbGVtZW50c1t0XSwibmctc3Rhci1pbnNlcnRlZCIpO2lmKHRoaXMuX25hbWVzcGFjZUxpc3QubGVuZ3RoJiYodGhpcy50b3RhbFF1ZXVlZFBsYXllcnN8fHRoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50cy5sZW5ndGgpKXtjb25zdCBuPVtdO3RyeXtlPXRoaXMuX2ZsdXNoQW5pbWF0aW9ucyhuLHQpfWZpbmFsbHl7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0Kyspblt0XSgpfX1lbHNlIGZvcihsZXQgdD0wO3Q8dGhpcy5jb2xsZWN0ZWRMZWF2ZUVsZW1lbnRzLmxlbmd0aDt0KyspdGhpcy5wcm9jZXNzTGVhdmVOb2RlKHRoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50c1t0XSk7aWYodGhpcy50b3RhbFF1ZXVlZFBsYXllcnM9MCx0aGlzLmNvbGxlY3RlZEVudGVyRWxlbWVudHMubGVuZ3RoPTAsdGhpcy5jb2xsZWN0ZWRMZWF2ZUVsZW1lbnRzLmxlbmd0aD0wLHRoaXMuX2ZsdXNoRm5zLmZvckVhY2goKHQ9PnQoKSkpLHRoaXMuX2ZsdXNoRm5zPVtdLHRoaXMuX3doZW5RdWlldEZucy5sZW5ndGgpe2NvbnN0IHQ9dGhpcy5fd2hlblF1aWV0Rm5zO3RoaXMuX3doZW5RdWlldEZucz1bXSxlLmxlbmd0aD9oeChlKS5vbkRvbmUoKCgpPT57dC5mb3JFYWNoKCh0PT50KCkpKX0pKTp0LmZvckVhY2goKHQ9PnQoKSkpfX1yZXBvcnRFcnJvcih0KXt0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBwcm9jZXNzIGFuaW1hdGlvbnMgZHVlIHRvIHRoZSBmb2xsb3dpbmcgZmFpbGVkIHRyaWdnZXIgdHJhbnNpdGlvbnNcbiAke3Quam9pbigiXG4iKX1gKX1fZmx1c2hBbmltYXRpb25zKHQsZSl7Y29uc3Qgbj1uZXcgTU8sbz1bXSxpPW5ldyBNYXAsYT1bXSxyPW5ldyBNYXAscz1uZXcgTWFwLGw9bmV3IE1hcCxjPW5ldyBTZXQ7dGhpcy5kaXNhYmxlZE5vZGVzLmZvckVhY2goKHQ9PntjLmFkZCh0KTtjb25zdCBlPXRoaXMuZHJpdmVyLnF1ZXJ5KHQsIi5uZy1hbmltYXRlLXF1ZXVlZCIsITApO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWMuYWRkKGVbdF0pfSkpO2NvbnN0IGQ9dGhpcy5ib2R5Tm9kZSxwPUFycmF5LmZyb20odGhpcy5zdGF0ZXNCeUVsZW1lbnQua2V5cygpKSxtPWlQKHAsdGhpcy5jb2xsZWN0ZWRFbnRlckVsZW1lbnRzKSx1PW5ldyBNYXA7bGV0IGY9MDttLmZvckVhY2goKCh0LGUpPT57Y29uc3Qgbj1JeCtmKys7dS5zZXQoZSxuKSx0LmZvckVhY2goKHQ9PmFQKHQsbikpKX0pKTtjb25zdCBnPVtdLGg9bmV3IFNldCxiPW5ldyBTZXQ7Zm9yKGxldCB0PTA7dDx0aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHMubGVuZ3RoO3QrKyl7Y29uc3QgZT10aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHNbdF0sbj1lLl9fbmdfcmVtb3ZlZDtuJiZuLnNldEZvclJlbW92YWwmJihnLnB1c2goZSksaC5hZGQoZSksbi5oYXNBbmltYXRpb24/dGhpcy5kcml2ZXIucXVlcnkoZSwiLm5nLXN0YXItaW5zZXJ0ZWQiLCEwKS5mb3JFYWNoKCh0PT5oLmFkZCh0KSkpOmIuYWRkKGUpKX1jb25zdCB5PW5ldyBNYXAsXz1pUChwLEFycmF5LmZyb20oaCkpO18uZm9yRWFjaCgoKHQsZSk9Pntjb25zdCBuPUh4K2YrKzt5LnNldChlLG4pLHQuZm9yRWFjaCgodD0+YVAodCxuKSkpfSkpLHQucHVzaCgoKCk9PnttLmZvckVhY2goKCh0LGUpPT57Y29uc3Qgbj11LmdldChlKTt0LmZvckVhY2goKHQ9PnJQKHQsbikpKX0pKSxfLmZvckVhY2goKCh0LGUpPT57Y29uc3Qgbj15LmdldChlKTt0LmZvckVhY2goKHQ9PnJQKHQsbikpKX0pKSxnLmZvckVhY2goKHQ9Pnt0aGlzLnByb2Nlc3NMZWF2ZU5vZGUodCl9KSl9KSk7Y29uc3QgQz1bXSxNPVtdO2ZvcihsZXQgdD10aGlzLl9uYW1lc3BhY2VMaXN0Lmxlbmd0aC0xO3Q+PTA7dC0tKXRoaXMuX25hbWVzcGFjZUxpc3RbdF0uZHJhaW5RdWV1ZWRUcmFuc2l0aW9ucyhlKS5mb3JFYWNoKCh0PT57Y29uc3QgZT10LnBsYXllcixpPXQuZWxlbWVudDtpZihDLnB1c2goZSksdGhpcy5jb2xsZWN0ZWRFbnRlckVsZW1lbnRzLmxlbmd0aCl7Y29uc3QgdD1pLl9fbmdfcmVtb3ZlZDtpZih0JiZ0LnNldEZvck1vdmUpcmV0dXJuIHZvaWQgZS5kZXN0cm95KCl9Y29uc3QgYz0hZHx8IXRoaXMuZHJpdmVyLmNvbnRhaW5zRWxlbWVudChkLGkpLHA9eS5nZXQoaSksbT11LmdldChpKSxmPXRoaXMuX2J1aWxkSW5zdHJ1Y3Rpb24odCxuLG0scCxjKTtpZihmLmVycm9ycyYmZi5lcnJvcnMubGVuZ3RoKU0ucHVzaChmKTtlbHNle2lmKGMpcmV0dXJuIGUub25TdGFydCgoKCk9Pkt4KGksZi5mcm9tU3R5bGVzKSkpLGUub25EZXN0cm95KCgoKT0+WHgoaSxmLnRvU3R5bGVzKSkpLHZvaWQgby5wdXNoKGUpO2lmKHQuaXNGYWxsYmFja1RyYW5zaXRpb24pcmV0dXJuIGUub25TdGFydCgoKCk9Pkt4KGksZi5mcm9tU3R5bGVzKSkpLGUub25EZXN0cm95KCgoKT0+WHgoaSxmLnRvU3R5bGVzKSkpLHZvaWQgby5wdXNoKGUpO2YudGltZWxpbmVzLmZvckVhY2goKHQ9PnQuc3RyZXRjaFN0YXJ0aW5nS2V5ZnJhbWU9ITApKSxuLmFwcGVuZChpLGYudGltZWxpbmVzKSxhLnB1c2goe2luc3RydWN0aW9uOmYscGxheWVyOmUsZWxlbWVudDppfSksZi5xdWVyaWVkRWxlbWVudHMuZm9yRWFjaCgodD0+TXgocix0LFtdKS5wdXNoKGUpKSksZi5wcmVTdHlsZVByb3BzLmZvckVhY2goKCh0LGUpPT57Y29uc3Qgbj1PYmplY3Qua2V5cyh0KTtpZihuLmxlbmd0aCl7bGV0IHQ9cy5nZXQoZSk7dHx8cy5zZXQoZSx0PW5ldyBTZXQpLG4uZm9yRWFjaCgoZT0+dC5hZGQoZSkpKX19KSksZi5wb3N0U3R5bGVQcm9wcy5mb3JFYWNoKCgodCxlKT0+e2NvbnN0IG49T2JqZWN0LmtleXModCk7bGV0IG89bC5nZXQoZSk7b3x8bC5zZXQoZSxvPW5ldyBTZXQpLG4uZm9yRWFjaCgodD0+by5hZGQodCkpKX0pKX19KSk7aWYoTS5sZW5ndGgpe2NvbnN0IHQ9W107TS5mb3JFYWNoKChlPT57dC5wdXNoKGBAJHtlLnRyaWdnZXJOYW1lfSBoYXMgZmFpbGVkIGR1ZSB0bzpcbmApLGUuZXJyb3JzLmZvckVhY2goKGU9PnQucHVzaChgLSAke2V9XG5gKSkpfSkpLEMuZm9yRWFjaCgodD0+dC5kZXN0cm95KCkpKSx0aGlzLnJlcG9ydEVycm9yKHQpfWNvbnN0IHY9bmV3IE1hcCx4PW5ldyBNYXA7YS5mb3JFYWNoKCh0PT57Y29uc3QgZT10LmVsZW1lbnQ7bi5oYXMoZSkmJih4LnNldChlLGUpLHRoaXMuX2JlZm9yZUFuaW1hdGlvbkJ1aWxkKHQucGxheWVyLm5hbWVzcGFjZUlkLHQuaW5zdHJ1Y3Rpb24sdikpfSkpLG8uZm9yRWFjaCgodD0+e2NvbnN0IGU9dC5lbGVtZW50O3RoaXMuX2dldFByZXZpb3VzUGxheWVycyhlLCExLHQubmFtZXNwYWNlSWQsdC50cmlnZ2VyTmFtZSxudWxsKS5mb3JFYWNoKCh0PT57TXgodixlLFtdKS5wdXNoKHQpLHQuZGVzdHJveSgpfSkpfSkpO2NvbnN0IE89Zy5maWx0ZXIoKHQ9PmNQKHQscyxsKSkpLFA9bmV3IE1hcDtvUChQLHRoaXMuZHJpdmVyLGIsbCxleCkuZm9yRWFjaCgodD0+e2NQKHQscyxsKSYmTy5wdXNoKHQpfSkpO2NvbnN0IHc9bmV3IE1hcDttLmZvckVhY2goKCh0LGUpPT57b1Aodyx0aGlzLmRyaXZlcixuZXcgU2V0KHQpLHMsIiEiKX0pKSxPLmZvckVhY2goKHQ9Pntjb25zdCBlPVAuZ2V0KHQpLG49dy5nZXQodCk7UC5zZXQodCxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSksbikpfSkpO2NvbnN0IGs9W10sUz1bXSxEPXt9O2EuZm9yRWFjaCgodD0+e2NvbnN0e2VsZW1lbnQ6ZSxwbGF5ZXI6YSxpbnN0cnVjdGlvbjpyfT10O2lmKG4uaGFzKGUpKXtpZihjLmhhcyhlKSlyZXR1cm4gYS5vbkRlc3Ryb3koKCgpPT5YeChlLHIudG9TdHlsZXMpKSksYS5kaXNhYmxlZD0hMCxhLm92ZXJyaWRlVG90YWxUaW1lKHIudG90YWxUaW1lKSx2b2lkIG8ucHVzaChhKTtsZXQgdD1EO2lmKHguc2l6ZT4xKXtsZXQgbj1lO2NvbnN0IG89W107Zm9yKDtuPW4ucGFyZW50Tm9kZTspe2NvbnN0IGU9eC5nZXQobik7aWYoZSl7dD1lO2JyZWFrfW8ucHVzaChuKX1vLmZvckVhY2goKGU9Pnguc2V0KGUsdCkpKX1jb25zdCBuPXRoaXMuX2J1aWxkQW5pbWF0aW9uKGEubmFtZXNwYWNlSWQscix2LGksdyxQKTtpZihhLnNldFJlYWxQbGF5ZXIobiksdD09PUQpay5wdXNoKGEpO2Vsc2V7Y29uc3QgZT10aGlzLnBsYXllcnNCeUVsZW1lbnQuZ2V0KHQpO2UmJmUubGVuZ3RoJiYoYS5wYXJlbnRQbGF5ZXI9aHgoZSkpLG8ucHVzaChhKX19ZWxzZSBLeChlLHIuZnJvbVN0eWxlcyksYS5vbkRlc3Ryb3koKCgpPT5YeChlLHIudG9TdHlsZXMpKSksUy5wdXNoKGEpLGMuaGFzKGUpJiZvLnB1c2goYSl9KSksUy5mb3JFYWNoKCh0PT57Y29uc3QgZT1pLmdldCh0LmVsZW1lbnQpO2lmKGUmJmUubGVuZ3RoKXtjb25zdCBuPWh4KGUpO3Quc2V0UmVhbFBsYXllcihuKX19KSksby5mb3JFYWNoKCh0PT57dC5wYXJlbnRQbGF5ZXI/dC5zeW5jUGxheWVyRXZlbnRzKHQucGFyZW50UGxheWVyKTp0LmRlc3Ryb3koKX0pKTtmb3IobGV0IHQ9MDt0PGcubGVuZ3RoO3QrKyl7Y29uc3QgZT1nW3RdLG49ZS5fX25nX3JlbW92ZWQ7aWYoclAoZSxIeCksbiYmbi5oYXNBbmltYXRpb24pY29udGludWU7bGV0IG89W107aWYoci5zaXplKXtsZXQgdD1yLmdldChlKTt0JiZ0Lmxlbmd0aCYmby5wdXNoKC4uLnQpO2xldCBuPXRoaXMuZHJpdmVyLnF1ZXJ5KGUsVngsITApO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKXtsZXQgZT1yLmdldChuW3RdKTtlJiZlLmxlbmd0aCYmby5wdXNoKC4uLmUpfX1jb25zdCBpPW8uZmlsdGVyKCh0PT4hdC5kZXN0cm95ZWQpKTtpLmxlbmd0aD9zUCh0aGlzLGUsaSk6dGhpcy5wcm9jZXNzTGVhdmVOb2RlKGUpfXJldHVybiBnLmxlbmd0aD0wLGsuZm9yRWFjaCgodD0+e3RoaXMucGxheWVycy5wdXNoKHQpLHQub25Eb25lKCgoKT0+e3QuZGVzdHJveSgpO2NvbnN0IGU9dGhpcy5wbGF5ZXJzLmluZGV4T2YodCk7dGhpcy5wbGF5ZXJzLnNwbGljZShlLDEpfSkpLHQucGxheSgpfSkpLGt9ZWxlbWVudENvbnRhaW5zRGF0YSh0LGUpe2xldCBuPSExO2NvbnN0IG89ZS5fX25nX3JlbW92ZWQ7cmV0dXJuIG8mJm8uc2V0Rm9yUmVtb3ZhbCYmKG49ITApLHRoaXMucGxheWVyc0J5RWxlbWVudC5oYXMoZSkmJihuPSEwKSx0aGlzLnBsYXllcnNCeVF1ZXJpZWRFbGVtZW50LmhhcyhlKSYmKG49ITApLHRoaXMuc3RhdGVzQnlFbGVtZW50LmhhcyhlKSYmKG49ITApLHRoaXMuX2ZldGNoTmFtZXNwYWNlKHQpLmVsZW1lbnRDb250YWluc0RhdGEoZSl8fG59YWZ0ZXJGbHVzaCh0KXt0aGlzLl9mbHVzaEZucy5wdXNoKHQpfWFmdGVyRmx1c2hBbmltYXRpb25zRG9uZSh0KXt0aGlzLl93aGVuUXVpZXRGbnMucHVzaCh0KX1fZ2V0UHJldmlvdXNQbGF5ZXJzKHQsZSxuLG8saSl7bGV0IGE9W107aWYoZSl7Y29uc3QgZT10aGlzLnBsYXllcnNCeVF1ZXJpZWRFbGVtZW50LmdldCh0KTtlJiYoYT1lKX1lbHNle2NvbnN0IGU9dGhpcy5wbGF5ZXJzQnlFbGVtZW50LmdldCh0KTtpZihlKXtjb25zdCB0PSFpfHxpPT1LTztlLmZvckVhY2goKGU9PntlLnF1ZXVlZHx8KHR8fGUudHJpZ2dlck5hbWU9PW8pJiZhLnB1c2goZSl9KSl9fXJldHVybihufHxvKSYmKGE9YS5maWx0ZXIoKHQ9PiEobiYmbiE9dC5uYW1lc3BhY2VJZHx8byYmbyE9dC50cmlnZ2VyTmFtZSkpKSksYX1fYmVmb3JlQW5pbWF0aW9uQnVpbGQodCxlLG4pe2NvbnN0IG89ZS5lbGVtZW50LGk9ZS5pc1JlbW92YWxUcmFuc2l0aW9uP3ZvaWQgMDp0LGE9ZS5pc1JlbW92YWxUcmFuc2l0aW9uP3ZvaWQgMDplLnRyaWdnZXJOYW1lO2Zvcihjb25zdCB0IG9mIGUudGltZWxpbmVzKXtjb25zdCByPXQuZWxlbWVudCxzPXIhPT1vLGw9TXgobixyLFtdKTt0aGlzLl9nZXRQcmV2aW91c1BsYXllcnMocixzLGksYSxlLnRvU3RhdGUpLmZvckVhY2goKHQ9Pntjb25zdCBlPXQuZ2V0UmVhbFBsYXllcigpO2UuYmVmb3JlRGVzdHJveSYmZS5iZWZvcmVEZXN0cm95KCksdC5kZXN0cm95KCksbC5wdXNoKHQpfSkpfUt4KG8sZS5mcm9tU3R5bGVzKX1fYnVpbGRBbmltYXRpb24odCxlLG4sbyxpLGEpe2NvbnN0IHI9ZS50cmlnZ2VyTmFtZSxzPWUuZWxlbWVudCxsPVtdLGM9bmV3IFNldCxkPW5ldyBTZXQscD1lLnRpbWVsaW5lcy5tYXAoKGU9Pntjb25zdCBwPWUuZWxlbWVudDtjLmFkZChwKTtjb25zdCBtPXAuX19uZ19yZW1vdmVkO2lmKG0mJm0ucmVtb3ZlZEJlZm9yZVF1ZXJpZWQpcmV0dXJuIG5ldyBteChlLmR1cmF0aW9uLGUuZGVsYXkpO2NvbnN0IHU9cCE9PXMsZj0oZnVuY3Rpb24gZyh0KXtjb25zdCBlPVtdO3JldHVybiBsUCh0LGUpLGV9KSgobi5nZXQocCl8fFlPKS5tYXAoKHQ9PnQuZ2V0UmVhbFBsYXllcigpKSkpLmZpbHRlcigodD0+ISF0LmVsZW1lbnQmJnQuZWxlbWVudD09PXApKSxoPWkuZ2V0KHApLGI9YS5nZXQocCkseT1ieCgwLHRoaXMuX25vcm1hbGl6ZXIsMCxlLmtleWZyYW1lcyxoLGIpLF89dGhpcy5fYnVpbGRQbGF5ZXIoZSx5LGYpO2lmKGUuc3ViVGltZWxpbmUmJm8mJmQuYWRkKHApLHUpe2NvbnN0IGU9bmV3IHRQKHQscixwKTtlLnNldFJlYWxQbGF5ZXIoXyksbC5wdXNoKGUpfXJldHVybiBffSkpO2wuZm9yRWFjaCgodD0+e014KHRoaXMucGxheWVyc0J5UXVlcmllZEVsZW1lbnQsdC5lbGVtZW50LFtdKS5wdXNoKHQpLHQub25Eb25lKCgoKT0+KGZ1bmN0aW9uIGUodCxuLG8pe2xldCBpO2lmKHQgaW5zdGFuY2VvZiBNYXApe2lmKGk9dC5nZXQobiksaSl7aWYoaS5sZW5ndGgpe2NvbnN0IHQ9aS5pbmRleE9mKG8pO2kuc3BsaWNlKHQsMSl9MD09aS5sZW5ndGgmJnQuZGVsZXRlKG4pfX1lbHNlIGlmKGk9dFtuXSxpKXtpZihpLmxlbmd0aCl7Y29uc3QgdD1pLmluZGV4T2Yobyk7aS5zcGxpY2UodCwxKX0wPT1pLmxlbmd0aCYmZGVsZXRlIHRbbl19cmV0dXJuIGl9KSh0aGlzLnBsYXllcnNCeVF1ZXJpZWRFbGVtZW50LHQuZWxlbWVudCx0KSkpfSkpLGMuZm9yRWFjaCgodD0+YVAodCxCeCkpKTtjb25zdCBtPWh4KHApO3JldHVybiBtLm9uRGVzdHJveSgoKCk9PntjLmZvckVhY2goKHQ9PnJQKHQsQngpKSksWHgocyxlLnRvU3R5bGVzKX0pKSxkLmZvckVhY2goKHQ9PntNeChvLHQsW10pLnB1c2gobSl9KSksbX1fYnVpbGRQbGF5ZXIodCxlLG4pe3JldHVybiBlLmxlbmd0aD4wP3RoaXMuZHJpdmVyLmFuaW1hdGUodC5lbGVtZW50LGUsdC5kdXJhdGlvbix0LmRlbGF5LHQuZWFzaW5nLG4pOm5ldyBteCh0LmR1cmF0aW9uLHQuZGVsYXkpfX1jbGFzcyB0UHtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5uYW1lc3BhY2VJZD10LHRoaXMudHJpZ2dlck5hbWU9ZSx0aGlzLmVsZW1lbnQ9bix0aGlzLl9wbGF5ZXI9bmV3IG14LHRoaXMuX2NvbnRhaW5zUmVhbFBsYXllcj0hMSx0aGlzLl9xdWV1ZWRDYWxsYmFja3M9e30sdGhpcy5kZXN0cm95ZWQ9ITEsdGhpcy5tYXJrZWRGb3JEZXN0cm95PSExLHRoaXMuZGlzYWJsZWQ9ITEsdGhpcy5xdWV1ZWQ9ITAsdGhpcy50b3RhbFRpbWU9MH1zZXRSZWFsUGxheWVyKHQpe3RoaXMuX2NvbnRhaW5zUmVhbFBsYXllcnx8KHRoaXMuX3BsYXllcj10LE9iamVjdC5rZXlzKHRoaXMuX3F1ZXVlZENhbGxiYWNrcykuZm9yRWFjaCgoZT0+e3RoaXMuX3F1ZXVlZENhbGxiYWNrc1tlXS5mb3JFYWNoKChuPT55eCh0LGUsdm9pZCAwLG4pKSl9KSksdGhpcy5fcXVldWVkQ2FsbGJhY2tzPXt9LHRoaXMuX2NvbnRhaW5zUmVhbFBsYXllcj0hMCx0aGlzLm92ZXJyaWRlVG90YWxUaW1lKHQudG90YWxUaW1lKSx0aGlzLnF1ZXVlZD0hMSl9Z2V0UmVhbFBsYXllcigpe3JldHVybiB0aGlzLl9wbGF5ZXJ9b3ZlcnJpZGVUb3RhbFRpbWUodCl7dGhpcy50b3RhbFRpbWU9dH1zeW5jUGxheWVyRXZlbnRzKHQpe2NvbnN0IGU9dGhpcy5fcGxheWVyO2UudHJpZ2dlckNhbGxiYWNrJiZ0Lm9uU3RhcnQoKCgpPT5lLnRyaWdnZXJDYWxsYmFjaygic3RhcnQiKSkpLHQub25Eb25lKCgoKT0+dGhpcy5maW5pc2goKSkpLHQub25EZXN0cm95KCgoKT0+dGhpcy5kZXN0cm95KCkpKX1fcXVldWVFdmVudCh0LGUpe014KHRoaXMuX3F1ZXVlZENhbGxiYWNrcyx0LFtdKS5wdXNoKGUpfW9uRG9uZSh0KXt0aGlzLnF1ZXVlZCYmdGhpcy5fcXVldWVFdmVudCgiZG9uZSIsdCksdGhpcy5fcGxheWVyLm9uRG9uZSh0KX1vblN0YXJ0KHQpe3RoaXMucXVldWVkJiZ0aGlzLl9xdWV1ZUV2ZW50KCJzdGFydCIsdCksdGhpcy5fcGxheWVyLm9uU3RhcnQodCl9b25EZXN0cm95KHQpe3RoaXMucXVldWVkJiZ0aGlzLl9xdWV1ZUV2ZW50KCJkZXN0cm95Iix0KSx0aGlzLl9wbGF5ZXIub25EZXN0cm95KHQpfWluaXQoKXt0aGlzLl9wbGF5ZXIuaW5pdCgpfWhhc1N0YXJ0ZWQoKXtyZXR1cm4hdGhpcy5xdWV1ZWQmJnRoaXMuX3BsYXllci5oYXNTdGFydGVkKCl9cGxheSgpeyF0aGlzLnF1ZXVlZCYmdGhpcy5fcGxheWVyLnBsYXkoKX1wYXVzZSgpeyF0aGlzLnF1ZXVlZCYmdGhpcy5fcGxheWVyLnBhdXNlKCl9cmVzdGFydCgpeyF0aGlzLnF1ZXVlZCYmdGhpcy5fcGxheWVyLnJlc3RhcnQoKX1maW5pc2goKXt0aGlzLl9wbGF5ZXIuZmluaXNoKCl9ZGVzdHJveSgpe3RoaXMuZGVzdHJveWVkPSEwLHRoaXMuX3BsYXllci5kZXN0cm95KCl9cmVzZXQoKXshdGhpcy5xdWV1ZWQmJnRoaXMuX3BsYXllci5yZXNldCgpfXNldFBvc2l0aW9uKHQpe3RoaXMucXVldWVkfHx0aGlzLl9wbGF5ZXIuc2V0UG9zaXRpb24odCl9Z2V0UG9zaXRpb24oKXtyZXR1cm4gdGhpcy5xdWV1ZWQ/MDp0aGlzLl9wbGF5ZXIuZ2V0UG9zaXRpb24oKX10cmlnZ2VyQ2FsbGJhY2sodCl7Y29uc3QgZT10aGlzLl9wbGF5ZXI7ZS50cmlnZ2VyQ2FsbGJhY2smJmUudHJpZ2dlckNhbGxiYWNrKHQpfX1mdW5jdGlvbiBlUCh0KXtyZXR1cm4gdCYmMT09PXQubm9kZVR5cGV9ZnVuY3Rpb24gblAodCxlKXtjb25zdCBuPXQuc3R5bGUuZGlzcGxheTtyZXR1cm4gdC5zdHlsZS5kaXNwbGF5PW51bGwhPWU/ZToibm9uZSIsbn1mdW5jdGlvbiBvUCh0LGUsbixvLGkpe2NvbnN0IGE9W107bi5mb3JFYWNoKCh0PT5hLnB1c2goblAodCkpKSk7Y29uc3Qgcj1bXTtvLmZvckVhY2goKChuLG8pPT57Y29uc3QgYT17fTtuLmZvckVhY2goKHQ9Pntjb25zdCBuPWFbdF09ZS5jb21wdXRlU3R5bGUobyx0LGkpO24mJjAhPW4ubGVuZ3RofHwoby5fX25nX3JlbW92ZWQ9Wk8sci5wdXNoKG8pKX0pKSx0LnNldChvLGEpfSkpO2xldCBzPTA7cmV0dXJuIG4uZm9yRWFjaCgodD0+blAodCxhW3MrK10pKSkscn1mdW5jdGlvbiBpUCh0LGUpe2NvbnN0IG49bmV3IE1hcDtpZih0LmZvckVhY2goKHQ9Pm4uc2V0KHQsW10pKSksMD09ZS5sZW5ndGgpcmV0dXJuIG47Y29uc3Qgbz1uZXcgU2V0KGUpLGk9bmV3IE1hcDtmdW5jdGlvbiBhKHQpe2lmKCF0KXJldHVybiAxO2xldCBlPWkuZ2V0KHQpO2lmKGUpcmV0dXJuIGU7Y29uc3Qgcj10LnBhcmVudE5vZGU7cmV0dXJuIGU9bi5oYXMocik/cjpvLmhhcyhyKT8xOmEociksaS5zZXQodCxlKSxlfXJldHVybiBlLmZvckVhY2goKHQ9Pntjb25zdCBlPWEodCk7MSE9PWUmJm4uZ2V0KGUpLnB1c2godCl9KSksbn1mdW5jdGlvbiBhUCh0LGUpe2lmKHQuY2xhc3NMaXN0KXQuY2xhc3NMaXN0LmFkZChlKTtlbHNle2xldCBuPXQuJCRjbGFzc2VzO258fChuPXQuJCRjbGFzc2VzPXt9KSxuW2VdPSEwfX1mdW5jdGlvbiByUCh0LGUpe2lmKHQuY2xhc3NMaXN0KXQuY2xhc3NMaXN0LnJlbW92ZShlKTtlbHNle2xldCBuPXQuJCRjbGFzc2VzO24mJmRlbGV0ZSBuW2VdfX1mdW5jdGlvbiBzUCh0LGUsbil7aHgobikub25Eb25lKCgoKT0+dC5wcm9jZXNzTGVhdmVOb2RlKGUpKSl9ZnVuY3Rpb24gbFAodCxlKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3Qgbz10W25dO28gaW5zdGFuY2VvZiB1eD9sUChvLnBsYXllcnMsZSk6ZS5wdXNoKG8pfX1mdW5jdGlvbiBjUCh0LGUsbil7Y29uc3Qgbz1uLmdldCh0KTtpZighbylyZXR1cm4hMTtsZXQgaT1lLmdldCh0KTtyZXR1cm4gaT9vLmZvckVhY2goKHQ9PmkuYWRkKHQpKSk6ZS5zZXQodCxvKSxuLmRlbGV0ZSh0KSwhMH1jbGFzcyBkUHtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5ib2R5Tm9kZT10LHRoaXMuX2RyaXZlcj1lLHRoaXMuX25vcm1hbGl6ZXI9bix0aGlzLl90cmlnZ2VyQ2FjaGU9e30sdGhpcy5vblJlbW92YWxDb21wbGV0ZT0odCxlKT0+e30sdGhpcy5fdHJhbnNpdGlvbkVuZ2luZT1uZXcgJE8odCxlLG4pLHRoaXMuX3RpbWVsaW5lRW5naW5lPW5ldyBqTyh0LGUsbiksdGhpcy5fdHJhbnNpdGlvbkVuZ2luZS5vblJlbW92YWxDb21wbGV0ZT0odCxlKT0+dGhpcy5vblJlbW92YWxDb21wbGV0ZSh0LGUpfXJlZ2lzdGVyVHJpZ2dlcih0LGUsbixvLGkpe2NvbnN0IGE9dCsiLSIrbztsZXQgcj10aGlzLl90cmlnZ2VyQ2FjaGVbYV07aWYoIXIpe2NvbnN0IHQ9W10sZT1mTyh0aGlzLl9kcml2ZXIsaSx0KTtpZih0Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYFRoZSBhbmltYXRpb24gdHJpZ2dlciAiJHtvfSIgaGFzIGZhaWxlZCB0byBidWlsZCBkdWUgdG8gdGhlIGZvbGxvd2luZyBlcnJvcnM6XG4gLSAke3Quam9pbigiXG4gLSAiKX1gKTtyPShmdW5jdGlvbiBuKHQsZSxvKXtyZXR1cm4gbmV3IExPKHQsZSxvKX0pKG8sZSx0aGlzLl9ub3JtYWxpemVyKSx0aGlzLl90cmlnZ2VyQ2FjaGVbYV09cn10aGlzLl90cmFuc2l0aW9uRW5naW5lLnJlZ2lzdGVyVHJpZ2dlcihlLG8scil9cmVnaXN0ZXIodCxlKXt0aGlzLl90cmFuc2l0aW9uRW5naW5lLnJlZ2lzdGVyKHQsZSl9ZGVzdHJveSh0LGUpe3RoaXMuX3RyYW5zaXRpb25FbmdpbmUuZGVzdHJveSh0LGUpfW9uSW5zZXJ0KHQsZSxuLG8pe3RoaXMuX3RyYW5zaXRpb25FbmdpbmUuaW5zZXJ0Tm9kZSh0LGUsbixvKX1vblJlbW92ZSh0LGUsbixvKXt0aGlzLl90cmFuc2l0aW9uRW5naW5lLnJlbW92ZU5vZGUodCxlLG98fCExLG4pfWRpc2FibGVBbmltYXRpb25zKHQsZSl7dGhpcy5fdHJhbnNpdGlvbkVuZ2luZS5tYXJrRWxlbWVudEFzRGlzYWJsZWQodCxlKX1wcm9jZXNzKHQsZSxuLG8pe2lmKCJAIj09bi5jaGFyQXQoMCkpe2NvbnN0W3QsaV09dngobik7dGhpcy5fdGltZWxpbmVFbmdpbmUuY29tbWFuZCh0LGUsaSxvKX1lbHNlIHRoaXMuX3RyYW5zaXRpb25FbmdpbmUudHJpZ2dlcih0LGUsbixvKX1saXN0ZW4odCxlLG4sbyxpKXtpZigiQCI9PW4uY2hhckF0KDApKXtjb25zdFt0LG9dPXZ4KG4pO3JldHVybiB0aGlzLl90aW1lbGluZUVuZ2luZS5saXN0ZW4odCxlLG8saSl9cmV0dXJuIHRoaXMuX3RyYW5zaXRpb25FbmdpbmUubGlzdGVuKHQsZSxuLG8saSl9Zmx1c2godD0tMSl7dGhpcy5fdHJhbnNpdGlvbkVuZ2luZS5mbHVzaCh0KX1nZXQgcGxheWVycygpe3JldHVybiB0aGlzLl90cmFuc2l0aW9uRW5naW5lLnBsYXllcnMuY29uY2F0KHRoaXMuX3RpbWVsaW5lRW5naW5lLnBsYXllcnMpfXdoZW5SZW5kZXJpbmdEb25lKCl7cmV0dXJuIHRoaXMuX3RyYW5zaXRpb25FbmdpbmUud2hlblJlbmRlcmluZ0RvbmUoKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIHBQKHQsZSl7bGV0IG49bnVsbCxvPW51bGw7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPyhuPXVQKGVbMF0pLGUubGVuZ3RoPjEmJihvPXVQKGVbZS5sZW5ndGgtMV0pKSk6ZSYmKG49dVAoZSkpLG58fG8/bmV3IG1QKHQsbixvKTpudWxsfWNsYXNzIG1Qe2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLl9lbGVtZW50PXQsdGhpcy5fc3RhcnRTdHlsZXM9ZSx0aGlzLl9lbmRTdHlsZXM9bix0aGlzLl9zdGF0ZT0wO2xldCBvPW1QLmluaXRpYWxTdHlsZXNCeUVsZW1lbnQuZ2V0KHQpO298fG1QLmluaXRpYWxTdHlsZXNCeUVsZW1lbnQuc2V0KHQsbz17fSksdGhpcy5faW5pdGlhbFN0eWxlcz1vfXN0YXJ0KCl7dGhpcy5fc3RhdGU8MSYmKHRoaXMuX3N0YXJ0U3R5bGVzJiZYeCh0aGlzLl9lbGVtZW50LHRoaXMuX3N0YXJ0U3R5bGVzLHRoaXMuX2luaXRpYWxTdHlsZXMpLHRoaXMuX3N0YXRlPTEpfWZpbmlzaCgpe3RoaXMuc3RhcnQoKSx0aGlzLl9zdGF0ZTwyJiYoWHgodGhpcy5fZWxlbWVudCx0aGlzLl9pbml0aWFsU3R5bGVzKSx0aGlzLl9lbmRTdHlsZXMmJihYeCh0aGlzLl9lbGVtZW50LHRoaXMuX2VuZFN0eWxlcyksdGhpcy5fZW5kU3R5bGVzPW51bGwpLHRoaXMuX3N0YXRlPTEpfWRlc3Ryb3koKXt0aGlzLmZpbmlzaCgpLHRoaXMuX3N0YXRlPDMmJihtUC5pbml0aWFsU3R5bGVzQnlFbGVtZW50LmRlbGV0ZSh0aGlzLl9lbGVtZW50KSx0aGlzLl9zdGFydFN0eWxlcyYmKEt4KHRoaXMuX2VsZW1lbnQsdGhpcy5fc3RhcnRTdHlsZXMpLHRoaXMuX2VuZFN0eWxlcz1udWxsKSx0aGlzLl9lbmRTdHlsZXMmJihLeCh0aGlzLl9lbGVtZW50LHRoaXMuX2VuZFN0eWxlcyksdGhpcy5fZW5kU3R5bGVzPW51bGwpLFh4KHRoaXMuX2VsZW1lbnQsdGhpcy5faW5pdGlhbFN0eWxlcyksdGhpcy5fc3RhdGU9Myl9fWZ1bmN0aW9uIHVQKHQpe2xldCBlPW51bGw7Y29uc3Qgbj1PYmplY3Qua2V5cyh0KTtmb3IobGV0IG89MDtvPG4ubGVuZ3RoO28rKyl7Y29uc3QgaT1uW29dO2ZQKGkpJiYoZT1lfHx7fSxlW2ldPXRbaV0pfXJldHVybiBlfWZ1bmN0aW9uIGZQKHQpe3JldHVybiJkaXNwbGF5Ij09PXR8fCJwb3NpdGlvbiI9PT10fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9tUC5pbml0aWFsU3R5bGVzQnlFbGVtZW50PW5ldyBXZWFrTWFwO2NvbnN0IGdQPSJhbmltYXRpb24iLGhQPSJhbmltYXRpb25lbmQiO2NsYXNzIGJQe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIpe3RoaXMuX2VsZW1lbnQ9dCx0aGlzLl9uYW1lPWUsdGhpcy5fZHVyYXRpb249bix0aGlzLl9kZWxheT1vLHRoaXMuX2Vhc2luZz1pLHRoaXMuX2ZpbGxNb2RlPWEsdGhpcy5fb25Eb25lRm49cix0aGlzLl9maW5pc2hlZD0hMSx0aGlzLl9kZXN0cm95ZWQ9ITEsdGhpcy5fc3RhcnRUaW1lPTAsdGhpcy5fcG9zaXRpb249MCx0aGlzLl9ldmVudEZuPXQ9PnRoaXMuX2hhbmRsZUNhbGxiYWNrKHQpfWFwcGx5KCl7IShmdW5jdGlvbiB0KGUsbil7Y29uc3Qgbz14UChlLCIiKS50cmltKCk7bGV0IGk9MDtvLmxlbmd0aCYmKChmdW5jdGlvbiBhKHQsZSl7bGV0IG49MDtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl0LmNoYXJBdChvKT09PWUmJm4rKztyZXR1cm4gbn0pKG8sIiwiKSsxLG49YCR7b30sICR7bn1gKSx2UChlLCIiLG4pfSkodGhpcy5fZWxlbWVudCxgJHt0aGlzLl9kdXJhdGlvbn1tcyAke3RoaXMuX2Vhc2luZ30gJHt0aGlzLl9kZWxheX1tcyAxIG5vcm1hbCAke3RoaXMuX2ZpbGxNb2RlfSAke3RoaXMuX25hbWV9YCksTVAodGhpcy5fZWxlbWVudCx0aGlzLl9ldmVudEZuLCExKSx0aGlzLl9zdGFydFRpbWU9RGF0ZS5ub3coKX1wYXVzZSgpe3lQKHRoaXMuX2VsZW1lbnQsdGhpcy5fbmFtZSwicGF1c2VkIil9cmVzdW1lKCl7eVAodGhpcy5fZWxlbWVudCx0aGlzLl9uYW1lLCJydW5uaW5nIil9c2V0UG9zaXRpb24odCl7Y29uc3QgZT1fUCh0aGlzLl9lbGVtZW50LHRoaXMuX25hbWUpO3RoaXMuX3Bvc2l0aW9uPXQqdGhpcy5fZHVyYXRpb24sdlAodGhpcy5fZWxlbWVudCwiRGVsYXkiLGAtJHt0aGlzLl9wb3NpdGlvbn1tc2AsZSl9Z2V0UG9zaXRpb24oKXtyZXR1cm4gdGhpcy5fcG9zaXRpb259X2hhbmRsZUNhbGxiYWNrKHQpe2NvbnN0IGU9dC5fbmdUZXN0TWFudWFsVGltZXN0YW1wfHxEYXRlLm5vdygpLG49MWUzKnBhcnNlRmxvYXQodC5lbGFwc2VkVGltZS50b0ZpeGVkKDMpKTt0LmFuaW1hdGlvbk5hbWU9PXRoaXMuX25hbWUmJk1hdGgubWF4KGUtdGhpcy5fc3RhcnRUaW1lLDApPj10aGlzLl9kZWxheSYmbj49dGhpcy5fZHVyYXRpb24mJnRoaXMuZmluaXNoKCl9ZmluaXNoKCl7dGhpcy5fZmluaXNoZWR8fCh0aGlzLl9maW5pc2hlZD0hMCx0aGlzLl9vbkRvbmVGbigpLE1QKHRoaXMuX2VsZW1lbnQsdGhpcy5fZXZlbnRGbiwhMCkpfWRlc3Ryb3koKXt0aGlzLl9kZXN0cm95ZWR8fCh0aGlzLl9kZXN0cm95ZWQ9ITAsdGhpcy5maW5pc2goKSwoZnVuY3Rpb24gdChlLG4pe2NvbnN0IG89eFAoZSwiIikuc3BsaXQoIiwiKSxpPUNQKG8sbik7aT49MCYmKG8uc3BsaWNlKGksMSksdlAoZSwiIixvLmpvaW4oIiwiKSkpfSkodGhpcy5fZWxlbWVudCx0aGlzLl9uYW1lKSl9fWZ1bmN0aW9uIHlQKHQsZSxuKXt2UCh0LCJQbGF5U3RhdGUiLG4sX1AodCxlKSl9ZnVuY3Rpb24gX1AodCxlKXtjb25zdCBuPXhQKHQsIiIpO3JldHVybiBuLmluZGV4T2YoIiwiKT4wP0NQKG4uc3BsaXQoIiwiKSxlKTpDUChbbl0sZSl9ZnVuY3Rpb24gQ1AodCxlKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylpZih0W25dLmluZGV4T2YoZSk+PTApcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gTVAodCxlLG4pe24/dC5yZW1vdmVFdmVudExpc3RlbmVyKGhQLGUpOnQuYWRkRXZlbnRMaXN0ZW5lcihoUCxlKX1mdW5jdGlvbiB2UCh0LGUsbixvKXtjb25zdCBpPWdQK2U7aWYobnVsbCE9byl7Y29uc3QgZT10LnN0eWxlW2ldO2lmKGUubGVuZ3RoKXtjb25zdCB0PWUuc3BsaXQoIiwiKTt0W29dPW4sbj10LmpvaW4oIiwiKX19dC5zdHlsZVtpXT1ufWZ1bmN0aW9uIHhQKHQsZSl7cmV0dXJuIHQuc3R5bGVbZ1ArZV18fCIifWNsYXNzIE9Qe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIscyl7dGhpcy5lbGVtZW50PXQsdGhpcy5rZXlmcmFtZXM9ZSx0aGlzLmFuaW1hdGlvbk5hbWU9bix0aGlzLl9kdXJhdGlvbj1vLHRoaXMuX2RlbGF5PWksdGhpcy5fZmluYWxTdHlsZXM9cix0aGlzLl9zcGVjaWFsU3R5bGVzPXMsdGhpcy5fb25Eb25lRm5zPVtdLHRoaXMuX29uU3RhcnRGbnM9W10sdGhpcy5fb25EZXN0cm95Rm5zPVtdLHRoaXMuY3VycmVudFNuYXBzaG90PXt9LHRoaXMuX3N0YXRlPTAsdGhpcy5lYXNpbmc9YXx8ImxpbmVhciIsdGhpcy50b3RhbFRpbWU9bytpLHRoaXMuX2J1aWxkU3R5bGVyKCl9b25TdGFydCh0KXt0aGlzLl9vblN0YXJ0Rm5zLnB1c2godCl9b25Eb25lKHQpe3RoaXMuX29uRG9uZUZucy5wdXNoKHQpfW9uRGVzdHJveSh0KXt0aGlzLl9vbkRlc3Ryb3lGbnMucHVzaCh0KX1kZXN0cm95KCl7dGhpcy5pbml0KCksdGhpcy5fc3RhdGU+PTR8fCh0aGlzLl9zdGF0ZT00LHRoaXMuX3N0eWxlci5kZXN0cm95KCksdGhpcy5fZmx1c2hTdGFydEZucygpLHRoaXMuX2ZsdXNoRG9uZUZucygpLHRoaXMuX3NwZWNpYWxTdHlsZXMmJnRoaXMuX3NwZWNpYWxTdHlsZXMuZGVzdHJveSgpLHRoaXMuX29uRGVzdHJveUZucy5mb3JFYWNoKCh0PT50KCkpKSx0aGlzLl9vbkRlc3Ryb3lGbnM9W10pfV9mbHVzaERvbmVGbnMoKXt0aGlzLl9vbkRvbmVGbnMuZm9yRWFjaCgodD0+dCgpKSksdGhpcy5fb25Eb25lRm5zPVtdfV9mbHVzaFN0YXJ0Rm5zKCl7dGhpcy5fb25TdGFydEZucy5mb3JFYWNoKCh0PT50KCkpKSx0aGlzLl9vblN0YXJ0Rm5zPVtdfWZpbmlzaCgpe3RoaXMuaW5pdCgpLHRoaXMuX3N0YXRlPj0zfHwodGhpcy5fc3RhdGU9Myx0aGlzLl9zdHlsZXIuZmluaXNoKCksdGhpcy5fZmx1c2hTdGFydEZucygpLHRoaXMuX3NwZWNpYWxTdHlsZXMmJnRoaXMuX3NwZWNpYWxTdHlsZXMuZmluaXNoKCksdGhpcy5fZmx1c2hEb25lRm5zKCkpfXNldFBvc2l0aW9uKHQpe3RoaXMuX3N0eWxlci5zZXRQb3NpdGlvbih0KX1nZXRQb3NpdGlvbigpe3JldHVybiB0aGlzLl9zdHlsZXIuZ2V0UG9zaXRpb24oKX1oYXNTdGFydGVkKCl7cmV0dXJuIHRoaXMuX3N0YXRlPj0yfWluaXQoKXt0aGlzLl9zdGF0ZT49MXx8KHRoaXMuX3N0YXRlPTEsdGhpcy5fc3R5bGVyLmFwcGx5KCksdGhpcy5fZGVsYXkmJnRoaXMuX3N0eWxlci5wYXVzZSgpKX1wbGF5KCl7dGhpcy5pbml0KCksdGhpcy5oYXNTdGFydGVkKCl8fCh0aGlzLl9mbHVzaFN0YXJ0Rm5zKCksdGhpcy5fc3RhdGU9Mix0aGlzLl9zcGVjaWFsU3R5bGVzJiZ0aGlzLl9zcGVjaWFsU3R5bGVzLnN0YXJ0KCkpLHRoaXMuX3N0eWxlci5yZXN1bWUoKX1wYXVzZSgpe3RoaXMuaW5pdCgpLHRoaXMuX3N0eWxlci5wYXVzZSgpfXJlc3RhcnQoKXt0aGlzLnJlc2V0KCksdGhpcy5wbGF5KCl9cmVzZXQoKXt0aGlzLl9zdGF0ZT0wLHRoaXMuX3N0eWxlci5kZXN0cm95KCksdGhpcy5fYnVpbGRTdHlsZXIoKSx0aGlzLl9zdHlsZXIuYXBwbHkoKX1fYnVpbGRTdHlsZXIoKXt0aGlzLl9zdHlsZXI9bmV3IGJQKHRoaXMuZWxlbWVudCx0aGlzLmFuaW1hdGlvbk5hbWUsdGhpcy5fZHVyYXRpb24sdGhpcy5fZGVsYXksdGhpcy5lYXNpbmcsImZvcndhcmRzIiwoKCk9PnRoaXMuZmluaXNoKCkpKX10cmlnZ2VyQ2FsbGJhY2sodCl7Y29uc3QgZT0ic3RhcnQiPT10P3RoaXMuX29uU3RhcnRGbnM6dGhpcy5fb25Eb25lRm5zO2UuZm9yRWFjaCgodD0+dCgpKSksZS5sZW5ndGg9MH1iZWZvcmVEZXN0cm95KCl7dGhpcy5pbml0KCk7Y29uc3QgdD17fTtpZih0aGlzLmhhc1N0YXJ0ZWQoKSl7Y29uc3QgZT10aGlzLl9zdGF0ZT49MztPYmplY3Qua2V5cyh0aGlzLl9maW5hbFN0eWxlcykuZm9yRWFjaCgobj0+eyJvZmZzZXQiIT1uJiYodFtuXT1lP3RoaXMuX2ZpbmFsU3R5bGVzW25dOnNPKHRoaXMuZWxlbWVudCxuKSl9KSl9dGhpcy5jdXJyZW50U25hcHNob3Q9dH19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIFBQIGV4dGVuZHMgbXh7Y29uc3RydWN0b3IodCxlKXtzdXBlcigpLHRoaXMuZWxlbWVudD10LHRoaXMuX3N0YXJ0aW5nU3R5bGVzPXt9LHRoaXMuX19pbml0aWFsaXplZD0hMSx0aGlzLl9zdHlsZXM9VHgoZSl9aW5pdCgpeyF0aGlzLl9faW5pdGlhbGl6ZWQmJnRoaXMuX3N0YXJ0aW5nU3R5bGVzJiYodGhpcy5fX2luaXRpYWxpemVkPSEwLE9iamVjdC5rZXlzKHRoaXMuX3N0eWxlcykuZm9yRWFjaCgodD0+e3RoaXMuX3N0YXJ0aW5nU3R5bGVzW3RdPXRoaXMuZWxlbWVudC5zdHlsZVt0XX0pKSxzdXBlci5pbml0KCkpfXBsYXkoKXt0aGlzLl9zdGFydGluZ1N0eWxlcyYmKHRoaXMuaW5pdCgpLE9iamVjdC5rZXlzKHRoaXMuX3N0eWxlcykuZm9yRWFjaCgodD0+dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KHQsdGhpcy5fc3R5bGVzW3RdKSkpLHN1cGVyLnBsYXkoKSl9ZGVzdHJveSgpe3RoaXMuX3N0YXJ0aW5nU3R5bGVzJiYoT2JqZWN0LmtleXModGhpcy5fc3RhcnRpbmdTdHlsZXMpLmZvckVhY2goKHQ9Pntjb25zdCBlPXRoaXMuX3N0YXJ0aW5nU3R5bGVzW3RdO2U/dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KHQsZSk6dGhpcy5lbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfSkpLHRoaXMuX3N0YXJ0aW5nU3R5bGVzPW51bGwsc3VwZXIuZGVzdHJveSgpKX19Y2xhc3Mgd1B7Y29uc3RydWN0b3IoKXt0aGlzLl9jb3VudD0wfXZhbGlkYXRlU3R5bGVQcm9wZXJ0eSh0KXtyZXR1cm4gRHgodCl9bWF0Y2hlc0VsZW1lbnQodCxlKXtyZXR1cm4gRXgodCxlKX1jb250YWluc0VsZW1lbnQodCxlKXtyZXR1cm4gUngodCxlKX1xdWVyeSh0LGUsbil7cmV0dXJuIEF4KHQsZSxuKX1jb21wdXRlU3R5bGUodCxlLG4pe3JldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KVtlXX1idWlsZEtleWZyYW1lRWxlbWVudCh0LGUsbil7bj1uLm1hcCgodD0+VHgodCkpKTtsZXQgbz1gQGtleWZyYW1lcyAke2V9IHtcbmAsaT0iIjtuLmZvckVhY2goKHQ9PntpPSIgIjtjb25zdCBlPXBhcnNlRmxvYXQodC5vZmZzZXQpO28rPWAke2l9JHsxMDAqZX0lIHtcbmAsaSs9IiAiLE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGU9Pntjb25zdCBuPXRbZV07c3dpdGNoKGUpe2Nhc2Uib2Zmc2V0IjpyZXR1cm47Y2FzZSJlYXNpbmciOnJldHVybiB2b2lkKG4mJihvKz1gJHtpfWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ICR7bn07XG5gKSk7ZGVmYXVsdDpyZXR1cm4gdm9pZChvKz1gJHtpfSR7ZX06ICR7bn07XG5gKX19KSksbys9YCR7aX19XG5gfSkpLG8rPSJ9XG4iO2NvbnN0IGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtyZXR1cm4gYS50ZXh0Q29udGVudD1vLGF9YW5pbWF0ZSh0LGUsbixvLGksYT1bXSxyKXsoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJnImJihmdW5jdGlvbiBzKCl7a1B8fChjb25zb2xlLndhcm4oIkBhbmd1bGFyL2FuaW1hdGlvbnM6IHBsZWFzZSBsb2FkIHRoZSB3ZWItYW5pbWF0aW9ucy5qcyBwb2x5ZmlsbCB0byBhbGxvdyBwcm9ncmFtbWF0aWMgYWNjZXNzLi4uXG4iLCIgIHZpc2l0IGh0dHBzOi8vYml0Lmx5L0lXdWthbSB0byBsZWFybiBtb3JlIGFib3V0IHVzaW5nIHRoZSB3ZWItYW5pbWF0aW9uLWpzIHBvbHlmaWxsLiIpLGtQPSEwKX0pKCk7Y29uc3QgbD1hLmZpbHRlcigodD0+dCBpbnN0YW5jZW9mIE9QKSksYz17fTtpTyhuLG8pJiZsLmZvckVhY2goKHQ9PntsZXQgZT10LmN1cnJlbnRTbmFwc2hvdDtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKCh0PT5jW3RdPWVbdF0pKX0pKTtjb25zdCBkPShmdW5jdGlvbiBwKHQpe2xldCBlPXt9O3JldHVybiB0JiYoQXJyYXkuaXNBcnJheSh0KT90Olt0XSkuZm9yRWFjaCgodD0+e09iamVjdC5rZXlzKHQpLmZvckVhY2goKG49Pnsib2Zmc2V0IiE9biYmImVhc2luZyIhPW4mJihlW25dPXRbbl0pfSkpfSkpLGV9KShlPWFPKHQsZSxjKSk7aWYoMD09bilyZXR1cm4gbmV3IFBQKHQsZCk7Y29uc3QgbT0iZ2VuX2Nzc19rZl8iK3RoaXMuX2NvdW50KyssdT10aGlzLmJ1aWxkS2V5ZnJhbWVFbGVtZW50KHQsbSxlKTsoZnVuY3Rpb24gZih0KXt2YXIgZTtjb25zdCBuPW51bGw9PT0oZT10LmdldFJvb3ROb2RlKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5jYWxsKHQpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgU2hhZG93Um9vdCYmbiBpbnN0YW5jZW9mIFNoYWRvd1Jvb3Q/bjpkb2N1bWVudC5oZWFkfSkodCkuYXBwZW5kQ2hpbGQodSk7Y29uc3QgZz1wUCh0LGUpLGg9bmV3IE9QKHQsZSxtLG4sbyxpLGQsZyk7cmV0dXJuIGgub25EZXN0cm95KCgoKT0+KGZ1bmN0aW9uIHQoZSl7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpfSkodSkpKSxofX1sZXQga1A9ITE7Y2xhc3MgU1B7Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy5lbGVtZW50PXQsdGhpcy5rZXlmcmFtZXM9ZSx0aGlzLm9wdGlvbnM9bix0aGlzLl9zcGVjaWFsU3R5bGVzPW8sdGhpcy5fb25Eb25lRm5zPVtdLHRoaXMuX29uU3RhcnRGbnM9W10sdGhpcy5fb25EZXN0cm95Rm5zPVtdLHRoaXMuX2luaXRpYWxpemVkPSExLHRoaXMuX2ZpbmlzaGVkPSExLHRoaXMuX3N0YXJ0ZWQ9ITEsdGhpcy5fZGVzdHJveWVkPSExLHRoaXMudGltZT0wLHRoaXMucGFyZW50UGxheWVyPW51bGwsdGhpcy5jdXJyZW50U25hcHNob3Q9e30sdGhpcy5fZHVyYXRpb249bi5kdXJhdGlvbix0aGlzLl9kZWxheT1uLmRlbGF5fHwwLHRoaXMudGltZT10aGlzLl9kdXJhdGlvbit0aGlzLl9kZWxheX1fb25GaW5pc2goKXt0aGlzLl9maW5pc2hlZHx8KHRoaXMuX2ZpbmlzaGVkPSEwLHRoaXMuX29uRG9uZUZucy5mb3JFYWNoKCh0PT50KCkpKSx0aGlzLl9vbkRvbmVGbnM9W10pfWluaXQoKXt0aGlzLl9idWlsZFBsYXllcigpLHRoaXMuX3ByZXBhcmVQbGF5ZXJCZWZvcmVTdGFydCgpfV9idWlsZFBsYXllcigpe2lmKHRoaXMuX2luaXRpYWxpemVkKXJldHVybjt0aGlzLl9pbml0aWFsaXplZD0hMDtjb25zdCB0PXRoaXMua2V5ZnJhbWVzO3RoaXMuZG9tUGxheWVyPXRoaXMuX3RyaWdnZXJXZWJBbmltYXRpb24odGhpcy5lbGVtZW50LHQsdGhpcy5vcHRpb25zKSx0aGlzLl9maW5hbEtleWZyYW1lPXQubGVuZ3RoP3RbdC5sZW5ndGgtMV06e30sdGhpcy5kb21QbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcigiZmluaXNoIiwoKCk9PnRoaXMuX29uRmluaXNoKCkpKX1fcHJlcGFyZVBsYXllckJlZm9yZVN0YXJ0KCl7dGhpcy5fZGVsYXk/dGhpcy5fcmVzZXREb21QbGF5ZXJTdGF0ZSgpOnRoaXMuZG9tUGxheWVyLnBhdXNlKCl9X3RyaWdnZXJXZWJBbmltYXRpb24odCxlLG4pe3JldHVybiB0LmFuaW1hdGUoZSxuKX1vblN0YXJ0KHQpe3RoaXMuX29uU3RhcnRGbnMucHVzaCh0KX1vbkRvbmUodCl7dGhpcy5fb25Eb25lRm5zLnB1c2godCl9b25EZXN0cm95KHQpe3RoaXMuX29uRGVzdHJveUZucy5wdXNoKHQpfXBsYXkoKXt0aGlzLl9idWlsZFBsYXllcigpLHRoaXMuaGFzU3RhcnRlZCgpfHwodGhpcy5fb25TdGFydEZucy5mb3JFYWNoKCh0PT50KCkpKSx0aGlzLl9vblN0YXJ0Rm5zPVtdLHRoaXMuX3N0YXJ0ZWQ9ITAsdGhpcy5fc3BlY2lhbFN0eWxlcyYmdGhpcy5fc3BlY2lhbFN0eWxlcy5zdGFydCgpKSx0aGlzLmRvbVBsYXllci5wbGF5KCl9cGF1c2UoKXt0aGlzLmluaXQoKSx0aGlzLmRvbVBsYXllci5wYXVzZSgpfWZpbmlzaCgpe3RoaXMuaW5pdCgpLHRoaXMuX3NwZWNpYWxTdHlsZXMmJnRoaXMuX3NwZWNpYWxTdHlsZXMuZmluaXNoKCksdGhpcy5fb25GaW5pc2goKSx0aGlzLmRvbVBsYXllci5maW5pc2goKX1yZXNldCgpe3RoaXMuX3Jlc2V0RG9tUGxheWVyU3RhdGUoKSx0aGlzLl9kZXN0cm95ZWQ9ITEsdGhpcy5fZmluaXNoZWQ9ITEsdGhpcy5fc3RhcnRlZD0hMX1fcmVzZXREb21QbGF5ZXJTdGF0ZSgpe3RoaXMuZG9tUGxheWVyJiZ0aGlzLmRvbVBsYXllci5jYW5jZWwoKX1yZXN0YXJ0KCl7dGhpcy5yZXNldCgpLHRoaXMucGxheSgpfWhhc1N0YXJ0ZWQoKXtyZXR1cm4gdGhpcy5fc3RhcnRlZH1kZXN0cm95KCl7dGhpcy5fZGVzdHJveWVkfHwodGhpcy5fZGVzdHJveWVkPSEwLHRoaXMuX3Jlc2V0RG9tUGxheWVyU3RhdGUoKSx0aGlzLl9vbkZpbmlzaCgpLHRoaXMuX3NwZWNpYWxTdHlsZXMmJnRoaXMuX3NwZWNpYWxTdHlsZXMuZGVzdHJveSgpLHRoaXMuX29uRGVzdHJveUZucy5mb3JFYWNoKCh0PT50KCkpKSx0aGlzLl9vbkRlc3Ryb3lGbnM9W10pfXNldFBvc2l0aW9uKHQpe3ZvaWQgMD09PXRoaXMuZG9tUGxheWVyJiZ0aGlzLmluaXQoKSx0aGlzLmRvbVBsYXllci5jdXJyZW50VGltZT10KnRoaXMudGltZX1nZXRQb3NpdGlvbigpe3JldHVybiB0aGlzLmRvbVBsYXllci5jdXJyZW50VGltZS90aGlzLnRpbWV9Z2V0IHRvdGFsVGltZSgpe3JldHVybiB0aGlzLl9kZWxheSt0aGlzLl9kdXJhdGlvbn1iZWZvcmVEZXN0cm95KCl7Y29uc3QgdD17fTt0aGlzLmhhc1N0YXJ0ZWQoKSYmT2JqZWN0LmtleXModGhpcy5fZmluYWxLZXlmcmFtZSkuZm9yRWFjaCgoZT0+eyJvZmZzZXQiIT1lJiYodFtlXT10aGlzLl9maW5pc2hlZD90aGlzLl9maW5hbEtleWZyYW1lW2VdOnNPKHRoaXMuZWxlbWVudCxlKSl9KSksdGhpcy5jdXJyZW50U25hcHNob3Q9dH10cmlnZ2VyQ2FsbGJhY2sodCl7Y29uc3QgZT0ic3RhcnQiPT10P3RoaXMuX29uU3RhcnRGbnM6dGhpcy5fb25Eb25lRm5zO2UuZm9yRWFjaCgodD0+dCgpKSksZS5sZW5ndGg9MH19Y2xhc3MgRFB7Y29uc3RydWN0b3IoKXt0aGlzLl9pc05hdGl2ZUltcGw9L1x7XHMqXFtuYXRpdmVccytjb2RlXF1ccypcfS8udGVzdChFUCgpLnRvU3RyaW5nKCkpLHRoaXMuX2Nzc0tleWZyYW1lc0RyaXZlcj1uZXcgd1B9dmFsaWRhdGVTdHlsZVByb3BlcnR5KHQpe3JldHVybiBEeCh0KX1tYXRjaGVzRWxlbWVudCh0LGUpe3JldHVybiBFeCh0LGUpfWNvbnRhaW5zRWxlbWVudCh0LGUpe3JldHVybiBSeCh0LGUpfXF1ZXJ5KHQsZSxuKXtyZXR1cm4gQXgodCxlLG4pfWNvbXB1dGVTdHlsZSh0LGUsbil7cmV0dXJuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpW2VdfW92ZXJyaWRlV2ViQW5pbWF0aW9uc1N1cHBvcnQodCl7dGhpcy5faXNOYXRpdmVJbXBsPXR9YW5pbWF0ZSh0LGUsbixvLGksYT1bXSxyKXtpZighciYmIXRoaXMuX2lzTmF0aXZlSW1wbClyZXR1cm4gdGhpcy5fY3NzS2V5ZnJhbWVzRHJpdmVyLmFuaW1hdGUodCxlLG4sbyxpLGEpO2NvbnN0IHM9e2R1cmF0aW9uOm4sZGVsYXk6byxmaWxsOjA9PW8/ImJvdGgiOiJmb3J3YXJkcyJ9O2kmJihzLmVhc2luZz1pKTtjb25zdCBsPXt9LGM9YS5maWx0ZXIoKHQ9PnQgaW5zdGFuY2VvZiBTUCkpO2lPKG4sbykmJmMuZm9yRWFjaCgodD0+e2xldCBlPXQuY3VycmVudFNuYXBzaG90O09iamVjdC5rZXlzKGUpLmZvckVhY2goKHQ9PmxbdF09ZVt0XSkpfSkpO2NvbnN0IGQ9cFAodCxlPWFPKHQsZT1lLm1hcCgodD0+WXgodCwhMSkpKSxsKSk7cmV0dXJuIG5ldyBTUCh0LGUscyxkKX19ZnVuY3Rpb24gRVAoKXtyZXR1cm4gZngoKSYmRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZXx8e319Ci8qKgogICAgICogQGxpY2Vuc2UgQW5ndWxhciB2MTIuMi4xCiAgICAgKiAoYykgMjAxMC0yMDIxIEdvb2dsZSBMTEMuIGh0dHBzOi8vYW5ndWxhci5pby8KICAgICAqIExpY2Vuc2U6IE1JVAogICAgICovY2xhc3MgUlAgZXh0ZW5kcyB0eHtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5fbmV4dEFuaW1hdGlvbklkPTAsdGhpcy5fcmVuZGVyZXI9dC5jcmVhdGVSZW5kZXJlcihlLmJvZHkse2lkOiIwIixlbmNhcHN1bGF0aW9uOkhuLk5vbmUsc3R5bGVzOltdLGRhdGE6e2FuaW1hdGlvbjpbXX19KX1idWlsZCh0KXtjb25zdCBlPXRoaXMuX25leHRBbmltYXRpb25JZC50b1N0cmluZygpO3RoaXMuX25leHRBbmltYXRpb25JZCsrO2NvbnN0IG49QXJyYXkuaXNBcnJheSh0KT9peCh0KTp0O3JldHVybiBOUCh0aGlzLl9yZW5kZXJlcixudWxsLGUsInJlZ2lzdGVyIixbbl0pLG5ldyBBUChlLHRoaXMuX3JlbmRlcmVyKX19UlAuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFJQKSh2cihfZyksdnIoWl8pKX0sUlAuybVwcm92PU1uKHt0b2tlbjpSUCxmYWN0b3J5OlJQLsm1ZmFjfSksUlAuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpfZ30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChSUCxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6X2d9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSksbnVsbCk7Y2xhc3MgQVAgZXh0ZW5kcyBjbGFzc3t9e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoKSx0aGlzLl9pZD10LHRoaXMuX3JlbmRlcmVyPWV9Y3JlYXRlKHQsZSl7cmV0dXJuIG5ldyBUUCh0aGlzLl9pZCx0LGV8fHt9LHRoaXMuX3JlbmRlcmVyKX19Y2xhc3MgVFB7Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy5pZD10LHRoaXMuZWxlbWVudD1lLHRoaXMuX3JlbmRlcmVyPW8sdGhpcy5wYXJlbnRQbGF5ZXI9bnVsbCx0aGlzLl9zdGFydGVkPSExLHRoaXMudG90YWxUaW1lPTAsdGhpcy5fY29tbWFuZCgiY3JlYXRlIixuKX1fbGlzdGVuKHQsZSl7cmV0dXJuIHRoaXMuX3JlbmRlcmVyLmxpc3Rlbih0aGlzLmVsZW1lbnQsYEBAJHt0aGlzLmlkfToke3R9YCxlKX1fY29tbWFuZCh0LC4uLmUpe3JldHVybiBOUCh0aGlzLl9yZW5kZXJlcix0aGlzLmVsZW1lbnQsdGhpcy5pZCx0LGUpfW9uRG9uZSh0KXt0aGlzLl9saXN0ZW4oImRvbmUiLHQpfW9uU3RhcnQodCl7dGhpcy5fbGlzdGVuKCJzdGFydCIsdCl9b25EZXN0cm95KHQpe3RoaXMuX2xpc3RlbigiZGVzdHJveSIsdCl9aW5pdCgpe3RoaXMuX2NvbW1hbmQoImluaXQiKX1oYXNTdGFydGVkKCl7cmV0dXJuIHRoaXMuX3N0YXJ0ZWR9cGxheSgpe3RoaXMuX2NvbW1hbmQoInBsYXkiKSx0aGlzLl9zdGFydGVkPSEwfXBhdXNlKCl7dGhpcy5fY29tbWFuZCgicGF1c2UiKX1yZXN0YXJ0KCl7dGhpcy5fY29tbWFuZCgicmVzdGFydCIpfWZpbmlzaCgpe3RoaXMuX2NvbW1hbmQoImZpbmlzaCIpfWRlc3Ryb3koKXt0aGlzLl9jb21tYW5kKCJkZXN0cm95Iil9cmVzZXQoKXt0aGlzLl9jb21tYW5kKCJyZXNldCIpLHRoaXMuX3N0YXJ0ZWQ9ITF9c2V0UG9zaXRpb24odCl7dGhpcy5fY29tbWFuZCgic2V0UG9zaXRpb24iLHQpfWdldFBvc2l0aW9uKCl7dmFyIHQsZTtyZXR1cm4gbnVsbCE9PShlPW51bGw9PT0odD10aGlzLl9yZW5kZXJlci5lbmdpbmUucGxheWVyc1srdGhpcy5pZF0pfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmdldFBvc2l0aW9uKCkpJiZ2b2lkIDAhPT1lP2U6MH19ZnVuY3Rpb24gTlAodCxlLG4sbyxpKXtyZXR1cm4gdC5zZXRQcm9wZXJ0eShlLGBAQCR7bn06JHtvfWAsaSl9Y29uc3QgelA9IkAiLElQPSJALmRpc2FibGVkIjtjbGFzcyBIUHtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5kZWxlZ2F0ZT10LHRoaXMuZW5naW5lPWUsdGhpcy5fem9uZT1uLHRoaXMuX2N1cnJlbnRJZD0wLHRoaXMuX21pY3JvdGFza0lkPTEsdGhpcy5fYW5pbWF0aW9uQ2FsbGJhY2tzQnVmZmVyPVtdLHRoaXMuX3JlbmRlcmVyQ2FjaGU9bmV3IE1hcCx0aGlzLl9jZFJlY3VyRGVwdGg9MCx0aGlzLnByb21pc2U9UHJvbWlzZS5yZXNvbHZlKDApLGUub25SZW1vdmFsQ29tcGxldGU9KHQsZSk9PntlJiZlLnBhcmVudE5vZGUodCkmJmUucmVtb3ZlQ2hpbGQodC5wYXJlbnROb2RlLHQpfX1jcmVhdGVSZW5kZXJlcih0LGUpe2NvbnN0IG49dGhpcy5kZWxlZ2F0ZS5jcmVhdGVSZW5kZXJlcih0LGUpO2lmKCEodCYmZSYmZS5kYXRhJiZlLmRhdGEuYW5pbWF0aW9uKSl7bGV0IHQ9dGhpcy5fcmVuZGVyZXJDYWNoZS5nZXQobik7cmV0dXJuIHR8fCh0PW5ldyBGUCgiIixuLHRoaXMuZW5naW5lKSx0aGlzLl9yZW5kZXJlckNhY2hlLnNldChuLHQpKSx0fWNvbnN0IG89ZS5pZCxpPWUuaWQrIi0iK3RoaXMuX2N1cnJlbnRJZDt0aGlzLl9jdXJyZW50SWQrKyx0aGlzLmVuZ2luZS5yZWdpc3RlcihpLHQpO2NvbnN0IGE9ZT0+e0FycmF5LmlzQXJyYXkoZSk/ZS5mb3JFYWNoKGEpOnRoaXMuZW5naW5lLnJlZ2lzdGVyVHJpZ2dlcihvLGksdCxlLm5hbWUsZSl9O3JldHVybiBlLmRhdGEuYW5pbWF0aW9uLmZvckVhY2goYSksbmV3IExQKHRoaXMsaSxuLHRoaXMuZW5naW5lKX1iZWdpbigpe3RoaXMuX2NkUmVjdXJEZXB0aCsrLHRoaXMuZGVsZWdhdGUuYmVnaW4mJnRoaXMuZGVsZWdhdGUuYmVnaW4oKX1fc2NoZWR1bGVDb3VudFRhc2soKXt0aGlzLnByb21pc2UudGhlbigoKCk9Pnt0aGlzLl9taWNyb3Rhc2tJZCsrfSkpfXNjaGVkdWxlTGlzdGVuZXJDYWxsYmFjayh0LGUsbil7dD49MCYmdDx0aGlzLl9taWNyb3Rhc2tJZD90aGlzLl96b25lLnJ1bigoKCk9PmUobikpKTooMD09dGhpcy5fYW5pbWF0aW9uQ2FsbGJhY2tzQnVmZmVyLmxlbmd0aCYmUHJvbWlzZS5yZXNvbHZlKG51bGwpLnRoZW4oKCgpPT57dGhpcy5fem9uZS5ydW4oKCgpPT57dGhpcy5fYW5pbWF0aW9uQ2FsbGJhY2tzQnVmZmVyLmZvckVhY2goKHQ9Pntjb25zdFtlLG5dPXQ7ZShuKX0pKSx0aGlzLl9hbmltYXRpb25DYWxsYmFja3NCdWZmZXI9W119KSl9KSksdGhpcy5fYW5pbWF0aW9uQ2FsbGJhY2tzQnVmZmVyLnB1c2goW2Usbl0pKX1lbmQoKXt0aGlzLl9jZFJlY3VyRGVwdGgtLSwwPT10aGlzLl9jZFJlY3VyRGVwdGgmJnRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT57dGhpcy5fc2NoZWR1bGVDb3VudFRhc2soKSx0aGlzLmVuZ2luZS5mbHVzaCh0aGlzLl9taWNyb3Rhc2tJZCl9KSksdGhpcy5kZWxlZ2F0ZS5lbmQmJnRoaXMuZGVsZWdhdGUuZW5kKCl9d2hlblJlbmRlcmluZ0RvbmUoKXtyZXR1cm4gdGhpcy5lbmdpbmUud2hlblJlbmRlcmluZ0RvbmUoKX19SFAuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEhQKSh2cihfZyksdnIoZFApLHZyKGFfKSl9LEhQLsm1cHJvdj1Nbih7dG9rZW46SFAsZmFjdG9yeTpIUC7JtWZhY30pLEhQLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6X2d9LHt0eXBlOmRQfSx7dHlwZTphX31dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoSFAsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOl9nfSx7dHlwZTpkUH0se3R5cGU6YV99XX0pLG51bGwpO2NsYXNzIEZQe2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLm5hbWVzcGFjZUlkPXQsdGhpcy5kZWxlZ2F0ZT1lLHRoaXMuZW5naW5lPW4sdGhpcy5kZXN0cm95Tm9kZT10aGlzLmRlbGVnYXRlLmRlc3Ryb3lOb2RlP3Q9PmUuZGVzdHJveU5vZGUodCk6bnVsbH1nZXQgZGF0YSgpe3JldHVybiB0aGlzLmRlbGVnYXRlLmRhdGF9ZGVzdHJveSgpe3RoaXMuZW5naW5lLmRlc3Ryb3kodGhpcy5uYW1lc3BhY2VJZCx0aGlzLmRlbGVnYXRlKSx0aGlzLmRlbGVnYXRlLmRlc3Ryb3koKX1jcmVhdGVFbGVtZW50KHQsZSl7cmV0dXJuIHRoaXMuZGVsZWdhdGUuY3JlYXRlRWxlbWVudCh0LGUpfWNyZWF0ZUNvbW1lbnQodCl7cmV0dXJuIHRoaXMuZGVsZWdhdGUuY3JlYXRlQ29tbWVudCh0KX1jcmVhdGVUZXh0KHQpe3JldHVybiB0aGlzLmRlbGVnYXRlLmNyZWF0ZVRleHQodCl9YXBwZW5kQ2hpbGQodCxlKXt0aGlzLmRlbGVnYXRlLmFwcGVuZENoaWxkKHQsZSksdGhpcy5lbmdpbmUub25JbnNlcnQodGhpcy5uYW1lc3BhY2VJZCxlLHQsITEpfWluc2VydEJlZm9yZSh0LGUsbixvPSEwKXt0aGlzLmRlbGVnYXRlLmluc2VydEJlZm9yZSh0LGUsbiksdGhpcy5lbmdpbmUub25JbnNlcnQodGhpcy5uYW1lc3BhY2VJZCxlLHQsbyl9cmVtb3ZlQ2hpbGQodCxlLG4pe3RoaXMuZW5naW5lLm9uUmVtb3ZlKHRoaXMubmFtZXNwYWNlSWQsZSx0aGlzLmRlbGVnYXRlLG4pfXNlbGVjdFJvb3RFbGVtZW50KHQsZSl7cmV0dXJuIHRoaXMuZGVsZWdhdGUuc2VsZWN0Um9vdEVsZW1lbnQodCxlKX1wYXJlbnROb2RlKHQpe3JldHVybiB0aGlzLmRlbGVnYXRlLnBhcmVudE5vZGUodCl9bmV4dFNpYmxpbmcodCl7cmV0dXJuIHRoaXMuZGVsZWdhdGUubmV4dFNpYmxpbmcodCl9c2V0QXR0cmlidXRlKHQsZSxuLG8pe3RoaXMuZGVsZWdhdGUuc2V0QXR0cmlidXRlKHQsZSxuLG8pfXJlbW92ZUF0dHJpYnV0ZSh0LGUsbil7dGhpcy5kZWxlZ2F0ZS5yZW1vdmVBdHRyaWJ1dGUodCxlLG4pfWFkZENsYXNzKHQsZSl7dGhpcy5kZWxlZ2F0ZS5hZGRDbGFzcyh0LGUpfXJlbW92ZUNsYXNzKHQsZSl7dGhpcy5kZWxlZ2F0ZS5yZW1vdmVDbGFzcyh0LGUpfXNldFN0eWxlKHQsZSxuLG8pe3RoaXMuZGVsZWdhdGUuc2V0U3R5bGUodCxlLG4sbyl9cmVtb3ZlU3R5bGUodCxlLG4pe3RoaXMuZGVsZWdhdGUucmVtb3ZlU3R5bGUodCxlLG4pfXNldFByb3BlcnR5KHQsZSxuKXtlLmNoYXJBdCgwKT09elAmJmU9PUlQP3RoaXMuZGlzYWJsZUFuaW1hdGlvbnModCwhIW4pOnRoaXMuZGVsZWdhdGUuc2V0UHJvcGVydHkodCxlLG4pfXNldFZhbHVlKHQsZSl7dGhpcy5kZWxlZ2F0ZS5zZXRWYWx1ZSh0LGUpfWxpc3Rlbih0LGUsbil7cmV0dXJuIHRoaXMuZGVsZWdhdGUubGlzdGVuKHQsZSxuKX1kaXNhYmxlQW5pbWF0aW9ucyh0LGUpe3RoaXMuZW5naW5lLmRpc2FibGVBbmltYXRpb25zKHQsZSl9fWNsYXNzIExQIGV4dGVuZHMgRlB7Y29uc3RydWN0b3IodCxlLG4sbyl7c3VwZXIoZSxuLG8pLHRoaXMuZmFjdG9yeT10LHRoaXMubmFtZXNwYWNlSWQ9ZX1zZXRQcm9wZXJ0eSh0LGUsbil7ZS5jaGFyQXQoMCk9PXpQPyIuIj09ZS5jaGFyQXQoMSkmJmU9PUlQP3RoaXMuZGlzYWJsZUFuaW1hdGlvbnModCxuPXZvaWQgMD09PW58fCEhbik6dGhpcy5lbmdpbmUucHJvY2Vzcyh0aGlzLm5hbWVzcGFjZUlkLHQsZS5zdWJzdHIoMSksbik6dGhpcy5kZWxlZ2F0ZS5zZXRQcm9wZXJ0eSh0LGUsbil9bGlzdGVuKHQsZSxuKXtpZihlLmNoYXJBdCgwKT09elApe2NvbnN0IG89KGZ1bmN0aW9uIGkodCl7c3dpdGNoKHQpe2Nhc2UiYm9keSI6cmV0dXJuIGRvY3VtZW50LmJvZHk7Y2FzZSJkb2N1bWVudCI6cmV0dXJuIGRvY3VtZW50O2Nhc2Uid2luZG93IjpyZXR1cm4gd2luZG93O2RlZmF1bHQ6cmV0dXJuIHR9fSkodCk7bGV0IGE9ZS5zdWJzdHIoMSkscj0iIjtyZXR1cm4gYS5jaGFyQXQoMCkhPXpQJiYoW2Escl09KGZ1bmN0aW9uIHModCl7Y29uc3QgZT10LmluZGV4T2YoIi4iKTtyZXR1cm5bdC5zdWJzdHJpbmcoMCxlKSx0LnN1YnN0cihlKzEpXX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKShhKSksdGhpcy5lbmdpbmUubGlzdGVuKHRoaXMubmFtZXNwYWNlSWQsbyxhLHIsKHQ9Pnt0aGlzLmZhY3Rvcnkuc2NoZWR1bGVMaXN0ZW5lckNhbGxiYWNrKHQuX2RhdGF8fC0xLG4sdCl9KSl9cmV0dXJuIHRoaXMuZGVsZWdhdGUubGlzdGVuKHQsZSxuKX19Y2xhc3MgQlAgZXh0ZW5kcyBkUHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodC5ib2R5LGUsbil9bmdPbkRlc3Ryb3koKXt0aGlzLmZsdXNoKCl9fUJQLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxCUCkodnIoWl8pLHZyKHp4KSx2cihSTykpfSxCUC7JtXByb3Y9TW4oe3Rva2VuOkJQLGZhY3Rvcnk6QlAuybVmYWN9KSxCUC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6enh9LHt0eXBlOlJPfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChCUCxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTp6eH0se3R5cGU6Uk99XX0pLG51bGwpO2NvbnN0IFZQPW5ldyBHYSgiQW5pbWF0aW9uTW9kdWxlVHlwZSIpLGpQPVt7cHJvdmlkZTp0eCx1c2VDbGFzczpSUH0se3Byb3ZpZGU6Uk8sdXNlRmFjdG9yeTpmdW5jdGlvbiBVUCgpe3JldHVybiBuZXcgQU99fSx7cHJvdmlkZTpkUCx1c2VDbGFzczpCUH0se3Byb3ZpZGU6X2csdXNlRmFjdG9yeTpmdW5jdGlvbiBHUCh0LGUsbil7cmV0dXJuIG5ldyBIUCh0LGUsbil9LGRlcHM6W2h2LGRQLGFfXX1dLFdQPVt7cHJvdmlkZTp6eCx1c2VGYWN0b3J5OmZ1bmN0aW9uIFlQKCl7cmV0dXJuKGZ1bmN0aW9uIHQoKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgRVAoKX0pKCk/bmV3IERQOm5ldyB3UH19LHtwcm92aWRlOlZQLHVzZVZhbHVlOiJCcm93c2VyQW5pbWF0aW9ucyJ9LC4uLmpQXSxxUD1be3Byb3ZpZGU6engsdXNlQ2xhc3M6Tnh9LHtwcm92aWRlOlZQLHVzZVZhbHVlOiJOb29wQW5pbWF0aW9ucyJ9LC4uLmpQXTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIFpQe3N0YXRpYyB3aXRoQ29uZmlnKHQpe3JldHVybntuZ01vZHVsZTpaUCxwcm92aWRlcnM6dC5kaXNhYmxlQW5pbWF0aW9ucz9xUDpXUH19fVpQLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxaUCl9LFpQLsm1bW9kPWFvKHt0eXBlOlpQfSksWlAuybVpbmo9dm4oe3Byb3ZpZGVyczpXUCxpbXBvcnRzOltVdl19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFpQLFt7dHlwZTpBeSxhcmdzOlt7ZXhwb3J0czpbVXZdLHByb3ZpZGVyczpXUH1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFpQLHtleHBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1V2XX19KTtjbGFzcyBYUHt9WFAuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFhQKX0sWFAuybVtb2Q9YW8oe3R5cGU6WFB9KSxYUC7JtWluaj12bih7cHJvdmlkZXJzOnFQLGltcG9ydHM6W1V2XX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWFAsW3t0eXBlOkF5LGFyZ3M6W3tleHBvcnRzOltVdl0scHJvdmlkZXJzOnFQfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oWFAse2V4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bVXZdfX0pO2NvbnN0IEtQPXt9O2Z1bmN0aW9uIEpQKHQsZSl7aWYoS1BbdF09KEtQW3RdfHwwKSsxLCJmdW5jdGlvbiI9PXR5cGVvZiBlKXJldHVybiBRUCh0LCgoLi4ubik9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKC4uLm4pKSx7dHlwZTp0fSkpKTtzd2l0Y2goZT9lLl9hczoiZW1wdHkiKXtjYXNlImVtcHR5IjpyZXR1cm4gUVAodCwoKCk9Pih7dHlwZTp0fSkpKTtjYXNlInByb3BzIjpyZXR1cm4gUVAodCwoZT0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHt0eXBlOnR9KSkpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGNvbmZpZy4iKX19ZnVuY3Rpb24gUVAodCxlKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInR5cGUiLHt2YWx1ZTp0LHdyaXRhYmxlOiExfSl9Y29uc3QgJFA9IkBuZ3J4L3N0b3JlL2luaXQiO2NsYXNzIHR3IGV4dGVuZHMgRntjb25zdHJ1Y3Rvcigpe3N1cGVyKHt0eXBlOiRQfSl9bmV4dCh0KXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJcbiAgICAgICAgRGlzcGF0Y2ggZXhwZWN0ZWQgYW4gb2JqZWN0LCBpbnN0ZWFkIGl0IHJlY2VpdmVkIGEgZnVuY3Rpb24uXG4gICAgICAgIElmIHlvdSdyZSB1c2luZyB0aGUgY3JlYXRlQWN0aW9uIGZ1bmN0aW9uLCBtYWtlIHN1cmUgdG8gaW52b2tlIHRoZSBmdW5jdGlvblxuICAgICAgICBiZWZvcmUgZGlzcGF0Y2hpbmcgdGhlIGFjdGlvbi4gRm9yIGV4YW1wbGUsIHNvbWVBY3Rpb24gc2hvdWxkIGJlIHNvbWVBY3Rpb24oKS4iKTtpZih2b2lkIDA9PT10KXRocm93IG5ldyBUeXBlRXJyb3IoIkFjdGlvbnMgbXVzdCBiZSBvYmplY3RzIik7aWYodm9pZCAwPT09dC50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkFjdGlvbnMgbXVzdCBoYXZlIGEgdHlwZSBwcm9wZXJ0eSIpO3N1cGVyLm5leHQodCl9Y29tcGxldGUoKXt9bmdPbkRlc3Ryb3koKXtzdXBlci5jb21wbGV0ZSgpfX10dy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8dHcpfSx0dy7JtXByb3Y9TW4oe3Rva2VuOnR3LGZhY3Rvcnk6dHcuybVmYWN9KSx0dy5jdG9yUGFyYW1ldGVycz0oKT0+W10sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh0dyxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5bXX0pLG51bGwpO2NvbnN0IGV3PVt0d10sbnc9bmV3IEdhKCJAbmdyeC9zdG9yZSBJbnRlcm5hbCBSb290IEd1YXJkIiksb3c9bmV3IEdhKCJAbmdyeC9zdG9yZSBJbnRlcm5hbCBJbml0aWFsIFN0YXRlIiksaXc9bmV3IEdhKCJAbmdyeC9zdG9yZSBJbml0aWFsIFN0YXRlIiksYXc9bmV3IEdhKCJAbmdyeC9zdG9yZSBSZWR1Y2VyIEZhY3RvcnkiKSxydz1uZXcgR2EoIkBuZ3J4L3N0b3JlIEludGVybmFsIFJlZHVjZXIgRmFjdG9yeSBQcm92aWRlciIpLHN3PW5ldyBHYSgiQG5ncngvc3RvcmUgSW5pdGlhbCBSZWR1Y2VycyIpLGx3PW5ldyBHYSgiQG5ncngvc3RvcmUgSW50ZXJuYWwgSW5pdGlhbCBSZWR1Y2VycyIpLGN3PW5ldyBHYSgiQG5ncngvc3RvcmUgU3RvcmUgRmVhdHVyZXMiKSxkdz1uZXcgR2EoIkBuZ3J4L3N0b3JlIEludGVybmFsIFN0b3JlIFJlZHVjZXJzIikscHc9bmV3IEdhKCJAbmdyeC9zdG9yZSBJbnRlcm5hbCBGZWF0dXJlIFJlZHVjZXJzIiksbXc9bmV3IEdhKCJAbmdyeC9zdG9yZSBJbnRlcm5hbCBGZWF0dXJlIENvbmZpZ3MiKSx1dz1uZXcgR2EoIkBuZ3J4L3N0b3JlIEludGVybmFsIFN0b3JlIEZlYXR1cmVzIiksZnc9bmV3IEdhKCJAbmdyeC9zdG9yZSBJbnRlcm5hbCBGZWF0dXJlIFJlZHVjZXJzIFRva2VuIiksZ3c9bmV3IEdhKCJAbmdyeC9zdG9yZSBGZWF0dXJlIFJlZHVjZXJzIiksaHc9bmV3IEdhKCJAbmdyeC9zdG9yZSBVc2VyIFByb3ZpZGVkIE1ldGEgUmVkdWNlcnMiKSxidz1uZXcgR2EoIkBuZ3J4L3N0b3JlIE1ldGEgUmVkdWNlcnMiKSx5dz1uZXcgR2EoIkBuZ3J4L3N0b3JlIEludGVybmFsIFJlc29sdmVkIE1ldGEgUmVkdWNlcnMiKSxfdz1uZXcgR2EoIkBuZ3J4L3N0b3JlIFVzZXIgUnVudGltZSBDaGVja3MgQ29uZmlnIiksQ3c9bmV3IEdhKCJAbmdyeC9zdG9yZSBJbnRlcm5hbCBVc2VyIFJ1bnRpbWUgQ2hlY2tzIENvbmZpZyIpLE13PW5ldyBHYSgiQG5ncngvc3RvcmUgSW50ZXJuYWwgUnVudGltZSBDaGVja3MiKSx2dz1uZXcgR2EoIkBuZ3J4L3N0b3JlIENoZWNrIGlmIEFjdGlvbiB0eXBlcyBhcmUgdW5pcXVlIik7ZnVuY3Rpb24geHcodCxlPXt9KXtjb25zdCBuPU9iamVjdC5rZXlzKHQpLG89e307Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspe2NvbnN0IGk9bltlXTsiZnVuY3Rpb24iPT10eXBlb2YgdFtpXSYmKG9baV09dFtpXSl9Y29uc3QgaT1PYmplY3Qua2V5cyhvKTtyZXR1cm4gZnVuY3Rpb24gdChuLGEpe249dm9pZCAwPT09bj9lOm47bGV0IHI9ITE7Y29uc3Qgcz17fTtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrKyl7Y29uc3QgZT1pW3RdLGw9bltlXSxjPSgwLG9bZV0pKGwsYSk7c1tlXT1jLHI9cnx8YyE9PWx9cmV0dXJuIHI/czpufX1mdW5jdGlvbiBPdyguLi50KXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYoMD09PXQubGVuZ3RoKXJldHVybiBlO2NvbnN0IG49dFt0Lmxlbmd0aC0xXTtyZXR1cm4gdC5zbGljZSgwLC0xKS5yZWR1Y2VSaWdodCgoKHQsZSk9PmUodCkpLG4oZSkpfX1mdW5jdGlvbiBQdyh0LGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aD4wJiYodD1Pdy5hcHBseShudWxsLFsuLi5lLHRdKSksKGUsbik9Pntjb25zdCBvPXQoZSk7cmV0dXJuKHQsZSk9Pm8odD12b2lkIDA9PT10P246dCxlKX19Y2xhc3Mgd3cgZXh0ZW5kcyBEe31jbGFzcyBrdyBleHRlbmRzIHR3e31jbGFzcyBTdyBleHRlbmRzIEZ7Y29uc3RydWN0b3IodCxlLG4sbyl7c3VwZXIobyhuLGUpKSx0aGlzLmRpc3BhdGNoZXI9dCx0aGlzLmluaXRpYWxTdGF0ZT1lLHRoaXMucmVkdWNlcnM9bix0aGlzLnJlZHVjZXJGYWN0b3J5PW99Z2V0IGN1cnJlbnRSZWR1Y2Vycygpe3JldHVybiB0aGlzLnJlZHVjZXJzfWFkZEZlYXR1cmUodCl7dGhpcy5hZGRGZWF0dXJlcyhbdF0pfWFkZEZlYXR1cmVzKHQpe2NvbnN0IGU9dC5yZWR1Y2UoKCh0LHtyZWR1Y2VyczplLHJlZHVjZXJGYWN0b3J5Om4sbWV0YVJlZHVjZXJzOm8saW5pdGlhbFN0YXRlOmksa2V5OmF9KT0+e2NvbnN0IHI9ImZ1bmN0aW9uIj09dHlwZW9mIGU/KGZ1bmN0aW9uIHModCl7Y29uc3QgZT1BcnJheS5pc0FycmF5KHQpJiZ0Lmxlbmd0aD4wP093KC4uLnQpOnQ9PnQ7cmV0dXJuKHQsbik9Pih0PWUodCksKGUsbyk9PnQoZT12b2lkIDA9PT1lP246ZSxvKSl9KShvKShlLGkpOlB3KG4sbykoZSxpKTtyZXR1cm4gdFthXT1yLHR9KSx7fSk7dGhpcy5hZGRSZWR1Y2VycyhlKX1yZW1vdmVGZWF0dXJlKHQpe3RoaXMucmVtb3ZlRmVhdHVyZXMoW3RdKX1yZW1vdmVGZWF0dXJlcyh0KXt0aGlzLnJlbW92ZVJlZHVjZXJzKHQubWFwKCh0PT50LmtleSkpKX1hZGRSZWR1Y2VyKHQsZSl7dGhpcy5hZGRSZWR1Y2Vycyh7W3RdOmV9KX1hZGRSZWR1Y2Vycyh0KXt0aGlzLnJlZHVjZXJzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0aGlzLnJlZHVjZXJzKSx0KSx0aGlzLnVwZGF0ZVJlZHVjZXJzKE9iamVjdC5rZXlzKHQpKX1yZW1vdmVSZWR1Y2VyKHQpe3RoaXMucmVtb3ZlUmVkdWNlcnMoW3RdKX1yZW1vdmVSZWR1Y2Vycyh0KXt0LmZvckVhY2goKHQ9Pnt0aGlzLnJlZHVjZXJzPShmdW5jdGlvbiBlKHQsbil7cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZpbHRlcigodD0+dCE9PW4pKS5yZWR1Y2UoKChlLG4pPT5PYmplY3QuYXNzaWduKGUse1tuXTp0W25dfSkpLHt9KX0pKHRoaXMucmVkdWNlcnMsdCl9KSksdGhpcy51cGRhdGVSZWR1Y2Vycyh0KX11cGRhdGVSZWR1Y2Vycyh0KXt0aGlzLm5leHQodGhpcy5yZWR1Y2VyRmFjdG9yeSh0aGlzLnJlZHVjZXJzLHRoaXMuaW5pdGlhbFN0YXRlKSksdGhpcy5kaXNwYXRjaGVyLm5leHQoe3R5cGU6IkBuZ3J4L3N0b3JlL3VwZGF0ZS1yZWR1Y2VycyIsZmVhdHVyZXM6dH0pfW5nT25EZXN0cm95KCl7dGhpcy5jb21wbGV0ZSgpfX1Tdy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8U3cpKHZyKGt3KSx2cihpdyksdnIoc3cpLHZyKGF3KSl9LFN3Lsm1cHJvdj1Nbih7dG9rZW46U3csZmFjdG9yeTpTdy7JtWZhY30pLFN3LmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6a3d9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltpd119XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3N3XX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbYXddfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFN3LFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTprd30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W2l3XX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbc3ddfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOlthd119XX1dfSksbnVsbCk7Y29uc3QgRHc9W1N3LHtwcm92aWRlOnd3LHVzZUV4aXN0aW5nOlN3fSx7cHJvdmlkZTprdyx1c2VFeGlzdGluZzp0d31dO2NsYXNzIEV3IGV4dGVuZHMgSXtuZ09uRGVzdHJveSgpe3RoaXMuY29tcGxldGUoKX19RXcuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKEV3KSkpKG58fEV3KX19KSgpLEV3Lsm1cHJvdj1Nbih7dG9rZW46RXcsZmFjdG9yeTpFdy7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRXcsW3t0eXBlOmltfV0sbnVsbCxudWxsKTtjb25zdCBSdz1bRXddO2NsYXNzIEF3IGV4dGVuZHMgRHt9Y2xhc3MgVHcgZXh0ZW5kcyBGe2NvbnN0cnVjdG9yKHQsZSxuLG8pe3N1cGVyKG8pO2NvbnN0IGk9dC5waXBlKChmdW5jdGlvbiByKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPTApLFIoKGZ1bmN0aW9uKG4sbyl7bi5zdWJzY3JpYmUobmV3IFQobywoZnVuY3Rpb24obil7cmV0dXJuIG8uYWRkKHQuc2NoZWR1bGUoKGZ1bmN0aW9uKCl7cmV0dXJuIG8ubmV4dChuKX0pLGUpKX0pLChmdW5jdGlvbigpe3JldHVybiBvLmFkZCh0LnNjaGVkdWxlKChmdW5jdGlvbigpe3JldHVybiBvLmNvbXBsZXRlKCl9KSxlKSl9KSwoZnVuY3Rpb24obil7cmV0dXJuIG8uYWRkKHQuc2NoZWR1bGUoKGZ1bmN0aW9uKCl7cmV0dXJuIG8uZXJyb3Iobil9KSxlKSl9KSkpfSkpfSkob3QpKS5waXBlKFZlKGUpKS5waXBlKChmdW5jdGlvbiBhKHQsZSl7cmV0dXJuIFIobWUodCxlLGFyZ3VtZW50cy5sZW5ndGg+PTIsITApKX0pKE53LHtzdGF0ZTpvfSkpO3RoaXMuc3RhdGVTdWJzY3JpcHRpb249aS5zdWJzY3JpYmUoKCh7c3RhdGU6dCxhY3Rpb246ZX0pPT57dGhpcy5uZXh0KHQpLG4ubmV4dChlKX0pKX1uZ09uRGVzdHJveSgpe3RoaXMuc3RhdGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLmNvbXBsZXRlKCl9fWZ1bmN0aW9uIE53KHQ9e3N0YXRlOnZvaWQgMH0sW2Usbl0pe2NvbnN0e3N0YXRlOm99PXQ7cmV0dXJue3N0YXRlOm4obyxlKSxhY3Rpb246ZX19VHcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFR3KSh2cih0dyksdnIod3cpLHZyKEV3KSx2cihpdykpfSxUdy7JtXByb3Y9TW4oe3Rva2VuOlR3LGZhY3Rvcnk6VHcuybVmYWN9KSxUdy5JTklUPSRQLFR3LmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6dHd9LHt0eXBlOnd3fSx7dHlwZTpFd30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W2l3XX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChUdyxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dHd9LHt0eXBlOnd3fSx7dHlwZTpFd30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W2l3XX1dfV19KSxudWxsKTtjb25zdCB6dz1bVHcse3Byb3ZpZGU6QXcsdXNlRXhpc3Rpbmc6VHd9XTtjbGFzcyBJdyBleHRlbmRzIER7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKCksdGhpcy5hY3Rpb25zT2JzZXJ2ZXI9ZSx0aGlzLnJlZHVjZXJNYW5hZ2VyPW4sdGhpcy5zb3VyY2U9dH1zZWxlY3QodCwuLi5lKXtyZXR1cm4gRncuY2FsbChudWxsLHQsLi4uZSkodGhpcyl9bGlmdCh0KXtjb25zdCBlPW5ldyBJdyh0aGlzLHRoaXMuYWN0aW9uc09ic2VydmVyLHRoaXMucmVkdWNlck1hbmFnZXIpO3JldHVybiBlLm9wZXJhdG9yPXQsZX1kaXNwYXRjaCh0KXt0aGlzLmFjdGlvbnNPYnNlcnZlci5uZXh0KHQpfW5leHQodCl7dGhpcy5hY3Rpb25zT2JzZXJ2ZXIubmV4dCh0KX1lcnJvcih0KXt0aGlzLmFjdGlvbnNPYnNlcnZlci5lcnJvcih0KX1jb21wbGV0ZSgpe3RoaXMuYWN0aW9uc09ic2VydmVyLmNvbXBsZXRlKCl9YWRkUmVkdWNlcih0LGUpe3RoaXMucmVkdWNlck1hbmFnZXIuYWRkUmVkdWNlcih0LGUpfXJlbW92ZVJlZHVjZXIodCl7dGhpcy5yZWR1Y2VyTWFuYWdlci5yZW1vdmVSZWR1Y2VyKHQpfX1Jdy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SXcpKHZyKEF3KSx2cih0dyksdnIoU3cpKX0sSXcuybVwcm92PU1uKHt0b2tlbjpJdyxmYWN0b3J5Okl3Lsm1ZmFjfSksSXcuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpBd30se3R5cGU6dHd9LHt0eXBlOlN3fV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChJdyxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6QXd9LHt0eXBlOnR3fSx7dHlwZTpTd31dfSksbnVsbCk7Y29uc3QgSHc9W0l3XTtmdW5jdGlvbiBGdyh0LGUsLi4ubil7cmV0dXJuIGZ1bmN0aW9uIG8oaSl7bGV0IGE7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtjb25zdCBvPVtlLC4uLm5dLmZpbHRlcihCb29sZWFuKTthPWkucGlwZSgoZnVuY3Rpb24gcigpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTt2YXIgbj10Lmxlbmd0aDtpZigwPT09bil0aHJvdyBuZXcgRXJyb3IoImxpc3Qgb2YgcHJvcGVydGllcyBjYW5ub3QgYmUgZW1wdHkuIik7cmV0dXJuIEl0KChmdW5jdGlvbihlKXtmb3IodmFyIG89ZSxpPTA7aTxuO2krKyl7dmFyIGE9bnVsbD09bz92b2lkIDA6b1t0W2ldXTtpZih2b2lkIDA9PT1hKXJldHVybjtvPWF9cmV0dXJuIG99KSl9KSh0LC4uLm8pKX1lbHNle2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoYFVuZXhwZWN0ZWQgdHlwZSAnJHt0eXBlb2YgdH0nIGluIHNlbGVjdCBvcGVyYXRvciwgZXhwZWN0ZWQgJ3N0cmluZycgb3IgJ2Z1bmN0aW9uJ2ApO2E9aS5waXBlKEl0KChuPT50KG4sZSkpKSl9cmV0dXJuIGEucGlwZShNZSgpKX19Y29uc3QgTHc9Imh0dHBzOi8vbmdyeC5pby9ndWlkZS9zdG9yZS9jb25maWd1cmF0aW9uL3J1bnRpbWUtY2hlY2tzIjtmdW5jdGlvbiBCdyh0KXtyZXR1cm4gdm9pZCAwPT09dH1mdW5jdGlvbiBWdyh0KXtyZXR1cm4gbnVsbD09PXR9ZnVuY3Rpb24gancodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gVXcodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dH1mdW5jdGlvbiBHdyh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH1mdW5jdGlvbiBXdyh0LGUpe3JldHVybiB0PT09ZX1mdW5jdGlvbiBZdyh0LGUsbil7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspaWYoIW4odFtvXSxlW29dKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBxdyh0LGU9V3csbj1Xdyl7bGV0IG8saT1udWxsLGE9bnVsbDtyZXR1cm57bWVtb2l6ZWQ6ZnVuY3Rpb24gcigpe2lmKHZvaWQgMCE9PW8pcmV0dXJuIG8ucmVzdWx0O2lmKCFpKXJldHVybiBhPXQuYXBwbHkobnVsbCxhcmd1bWVudHMpLGk9YXJndW1lbnRzLGE7aWYoIVl3KGFyZ3VtZW50cyxpLGUpKXJldHVybiBhO2NvbnN0IHI9dC5hcHBseShudWxsLGFyZ3VtZW50cyk7cmV0dXJuIGk9YXJndW1lbnRzLG4oYSxyKT9hOihhPXIscil9LHJlc2V0OmZ1bmN0aW9uIHMoKXtpPW51bGwsYT1udWxsfSxzZXRSZXN1bHQ6ZnVuY3Rpb24gbCh0KXtvPXtyZXN1bHQ6dH19LGNsZWFyUmVzdWx0OmZ1bmN0aW9uIGMoKXtvPXZvaWQgMH19fWZ1bmN0aW9uIFp3KC4uLnQpe3JldHVybihmdW5jdGlvbiBlKHQsbj17c3RhdGVGbjpYd30pe3JldHVybiBmdW5jdGlvbiguLi5lKXtsZXQgbz1lO2lmKEFycmF5LmlzQXJyYXkob1swXSkpe2NvbnN0W3QsLi4uZV09bztvPVsuLi50LC4uLmVdfWNvbnN0IGk9by5zbGljZSgwLG8ubGVuZ3RoLTEpLGE9b1tvLmxlbmd0aC0xXSxyPWkuZmlsdGVyKCh0PT50LnJlbGVhc2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlbGVhc2UpKSxzPXQoKGZ1bmN0aW9uKC4uLnQpe3JldHVybiBhLmFwcGx5KG51bGwsdCl9KSksbD1xdygoZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5zdGF0ZUZuLmFwcGx5KG51bGwsW3QsaSxlLHNdKX0pKTtyZXR1cm4gT2JqZWN0LmFzc2lnbihsLm1lbW9pemVkLHtyZWxlYXNlOmZ1bmN0aW9uIGMoKXtsLnJlc2V0KCkscy5yZXNldCgpLHIuZm9yRWFjaCgodD0+dC5yZWxlYXNlKCkpKX0scHJvamVjdG9yOnMubWVtb2l6ZWQsc2V0UmVzdWx0Omwuc2V0UmVzdWx0LGNsZWFyUmVzdWx0OmwuY2xlYXJSZXN1bHR9KX19KShxdykoLi4udCl9ZnVuY3Rpb24gWHcodCxlLG4sbyl7aWYodm9pZCAwPT09bil7Y29uc3Qgbj1lLm1hcCgoZT0+ZSh0KSkpO3JldHVybiBvLm1lbW9pemVkLmFwcGx5KG51bGwsbil9Y29uc3QgaT1lLm1hcCgoZT0+ZSh0LG4pKSk7cmV0dXJuIG8ubWVtb2l6ZWQuYXBwbHkobnVsbCxbLi4uaSxuXSl9ZnVuY3Rpb24gS3codCl7cmV0dXJuIFp3KChlPT57Y29uc3Qgbj1lW3RdO3JldHVybiB5XygpJiYhKHQgaW4gZSkmJmNvbnNvbGUud2FybihgQG5ncngvc3RvcmU6IFRoZSBmZWF0dXJlIG5hbWUgIiR7dH0iIGRvZXMgbm90IGV4aXN0IGluIHRoZSBzdGF0ZSwgdGhlcmVmb3JlIGNyZWF0ZUZlYXR1cmVTZWxlY3RvciBjYW5ub3QgYWNjZXNzIGl0LiAgQmUgc3VyZSBpdCBpcyBpbXBvcnRlZCBpbiBhIGxvYWRlZCBtb2R1bGUgdXNpbmcgU3RvcmVNb2R1bGUuZm9yUm9vdCgnJHt0fScsIC4uLikgb3IgU3RvcmVNb2R1bGUuZm9yRmVhdHVyZSgnJHt0fScsIC4uLikuICBJZiB0aGUgZGVmYXVsdCBzdGF0ZSBpcyBpbnRlbmRlZCB0byBiZSB1bmRlZmluZWQsIGFzIGlzIHRoZSBjYXNlIHdpdGggcm91dGVyIHN0YXRlLCB0aGlzIGRldmVsb3BtZW50LW9ubHkgd2FybmluZyBtZXNzYWdlIGNhbiBiZSBpZ25vcmVkLmApLG59KSwodD0+dCkpfWZ1bmN0aW9uIEp3KHQpe09iamVjdC5mcmVlemUodCk7Y29uc3QgZT1Hdyh0KTtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkuZm9yRWFjaCgobj0+e2lmKCFuLnN0YXJ0c1dpdGgoIsm1IikmJihmdW5jdGlvbiBvKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfSkodCxuKSYmKCFlfHwiY2FsbGVyIiE9PW4mJiJjYWxsZWUiIT09biYmImFyZ3VtZW50cyIhPT1uKSl7Y29uc3QgZT10W25dOyFVdyhlKSYmIUd3KGUpfHxPYmplY3QuaXNGcm96ZW4oZSl8fEp3KGUpfX0pKSx0fWZ1bmN0aW9uIFF3KHQsZT1bXSl7cmV0dXJuKEJ3KHQpfHxWdyh0KSkmJjA9PT1lLmxlbmd0aD97cGF0aDpbInJvb3QiXSx2YWx1ZTp0fTpPYmplY3Qua2V5cyh0KS5yZWR1Y2UoKChuLG8pPT57aWYobilyZXR1cm4gbjtjb25zdCBpPXRbb107cmV0dXJuKGZ1bmN0aW9uIGEodCl7cmV0dXJuIEd3KHQpJiZ0Lmhhc093blByb3BlcnR5KCLJtWNtcCIpfSkoaSk/bjohKEJ3KGkpfHxWdyhpKXx8KGZ1bmN0aW9uIHIodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0fSkoaSl8fChmdW5jdGlvbiBzKHQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHR9KShpKXx8KGZ1bmN0aW9uIGwodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fSkoaSl8fGp3KGkpKSYmKChmdW5jdGlvbiBjKHQpe2lmKCEoZnVuY3Rpb24gZSh0KXtyZXR1cm4gVXcodCkmJiFqdyh0KX0pKHQpKXJldHVybiExO2NvbnN0IG49T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpO3JldHVybiBuPT09T2JqZWN0LnByb3RvdHlwZXx8bnVsbD09PW59KShpKT9RdyhpLFsuLi5lLG9dKTp7cGF0aDpbLi4uZSxvXSx2YWx1ZTppfSl9KSwhMSl9ZnVuY3Rpb24gJHcodCxlKXtpZighMT09PXQpcmV0dXJuO2NvbnN0IG49dC5wYXRoLmpvaW4oIi4iKSxvPW5ldyBFcnJvcihgRGV0ZWN0ZWQgdW5zZXJpYWxpemFibGUgJHtlfSBhdCAiJHtufSIuICR7THd9I3N0cmljdCR7ZX1zZXJpYWxpemFiaWxpdHlgKTt0aHJvdyBvLnZhbHVlPXQudmFsdWUsby51bnNlcmlhbGl6YWJsZVBhdGg9bixvfWZ1bmN0aW9uIHRrKHQpe3JldHVybiB5XygpP09iamVjdC5hc3NpZ24oe3N0cmljdFN0YXRlU2VyaWFsaXphYmlsaXR5OiExLHN0cmljdEFjdGlvblNlcmlhbGl6YWJpbGl0eTohMSxzdHJpY3RTdGF0ZUltbXV0YWJpbGl0eTohMCxzdHJpY3RBY3Rpb25JbW11dGFiaWxpdHk6ITAsc3RyaWN0QWN0aW9uV2l0aGluTmdab25lOiExLHN0cmljdEFjdGlvblR5cGVVbmlxdWVuZXNzOiExfSx0KTp7c3RyaWN0U3RhdGVTZXJpYWxpemFiaWxpdHk6ITEsc3RyaWN0QWN0aW9uU2VyaWFsaXphYmlsaXR5OiExLHN0cmljdFN0YXRlSW1tdXRhYmlsaXR5OiExLHN0cmljdEFjdGlvbkltbXV0YWJpbGl0eTohMSxzdHJpY3RBY3Rpb25XaXRoaW5OZ1pvbmU6ITEsc3RyaWN0QWN0aW9uVHlwZVVuaXF1ZW5lc3M6ITF9fWZ1bmN0aW9uIGVrKHtzdHJpY3RBY3Rpb25TZXJpYWxpemFiaWxpdHk6dCxzdHJpY3RTdGF0ZVNlcmlhbGl6YWJpbGl0eTplfSl7cmV0dXJuIG49PnR8fGU/KGZ1bmN0aW9uIG8odCxlKXtyZXR1cm4gZnVuY3Rpb24obixvKXtlLmFjdGlvbihvKSYmJHcoUXcobyksImFjdGlvbiIpO2NvbnN0IGk9dChuLG8pO3JldHVybiBlLnN0YXRlKCkmJiR3KFF3KGkpLCJzdGF0ZSIpLGl9fSkobix7YWN0aW9uOmU9PnQmJiFvayhlKSxzdGF0ZTooKT0+ZX0pOm59ZnVuY3Rpb24gbmsoe3N0cmljdEFjdGlvbkltbXV0YWJpbGl0eTp0LHN0cmljdFN0YXRlSW1tdXRhYmlsaXR5OmV9KXtyZXR1cm4gbj0+dHx8ZT8oZnVuY3Rpb24gbyh0LGUpe3JldHVybiBmdW5jdGlvbihuLG8pe2NvbnN0IGk9ZS5hY3Rpb24obyk/Sncobyk6byxhPXQobixpKTtyZXR1cm4gZS5zdGF0ZSgpP0p3KGEpOmF9fSkobix7YWN0aW9uOmU9PnQmJiFvayhlKSxzdGF0ZTooKT0+ZX0pOm59ZnVuY3Rpb24gb2sodCl7cmV0dXJuIHQudHlwZS5zdGFydHNXaXRoKCJAbmdyeCIpfWZ1bmN0aW9uIGlrKHtzdHJpY3RBY3Rpb25XaXRoaW5OZ1pvbmU6dH0pe3JldHVybiBlPT50PyhmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4sbyl7aWYoZS5hY3Rpb24obykmJiFhXy5pc0luQW5ndWxhclpvbmUoKSl0aHJvdyBuZXcgRXJyb3IoYEFjdGlvbiAnJHtvLnR5cGV9JyBydW5uaW5nIG91dHNpZGUgTmdab25lLiAke0x3fSNzdHJpY3RhY3Rpb253aXRoaW5uZ3pvbmVgKTtyZXR1cm4gdChuLG8pfX0pKGUse2FjdGlvbjplPT50JiYhb2soZSl9KTplfWZ1bmN0aW9uIGFrKCl7cmV0dXJuW3twcm92aWRlOnZ3LG11bHRpOiEwLGRlcHM6W013XSx1c2VGYWN0b3J5OnNrfV19ZnVuY3Rpb24gcmsodCl7cmV0dXJuIHR9ZnVuY3Rpb24gc2sodCl7aWYoIXQuc3RyaWN0QWN0aW9uVHlwZVVuaXF1ZW5lc3MpcmV0dXJuO2NvbnN0IGU9T2JqZWN0LmVudHJpZXMoS1ApLmZpbHRlcigoKFssdF0pPT50PjEpKS5tYXAoKChbdF0pPT50KSk7aWYoZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBBY3Rpb24gdHlwZXMgYXJlIHJlZ2lzdGVyZWQgbW9yZSB0aGFuIG9uY2UsICR7ZS5tYXAoKHQ9PmAiJHt0fSJgKSkuam9pbigiLCAiKX0uICR7THd9I3N0cmljdGFjdGlvbnR5cGV1bmlxdWVuZXNzYCl9Y2xhc3MgbGt7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEpe319bGsuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGxrKSh2cih0dyksdnIod3cpLHZyKEV3KSx2cihJdyksdnIobncsOCksdnIodncsOCkpfSxsay7JtW1vZD1hbyh7dHlwZTpsa30pLGxrLsm1aW5qPXZuKHt9KSxsay5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnR3fSx7dHlwZTp3d30se3R5cGU6RXd9LHt0eXBlOkl3fSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W253XX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3Z3XX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChsayxbe3R5cGU6QXksYXJnczpbe31dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnR3fSx7dHlwZTp3d30se3R5cGU6RXd9LHt0eXBlOkl3fSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W253XX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3Z3XX1dfV19KSxudWxsKTtjbGFzcyBja3tjb25zdHJ1Y3Rvcih0LGUsbixvLGkpe3RoaXMuZmVhdHVyZXM9dCx0aGlzLmZlYXR1cmVSZWR1Y2Vycz1lLHRoaXMucmVkdWNlck1hbmFnZXI9bjtjb25zdCBhPXQubWFwKCgodCxuKT0+e2NvbnN0IG89ZS5zaGlmdCgpW25dO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3JlZHVjZXJzOm8saW5pdGlhbFN0YXRlOmZrKHQuaW5pdGlhbFN0YXRlKX0pfSkpO24uYWRkRmVhdHVyZXMoYSl9bmdPbkRlc3Ryb3koKXt0aGlzLnJlZHVjZXJNYW5hZ2VyLnJlbW92ZUZlYXR1cmVzKHRoaXMuZmVhdHVyZXMpfX1jay7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8Y2spKHZyKHV3KSx2cihndyksdnIoU3cpLHZyKGxrKSx2cih2dyw4KSl9LGNrLsm1bW9kPWFvKHt0eXBlOmNrfSksY2suybVpbmo9dm4oe30pLGNrLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbdXddfV19LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W2d3XX1dfSx7dHlwZTpTd30se3R5cGU6bGt9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbdnddfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGNrLFt7dHlwZTpBeSxhcmdzOlt7fV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbdXddfV19LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W2d3XX1dfSx7dHlwZTpTd30se3R5cGU6bGt9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbdnddfV19XX0pLG51bGwpO2NsYXNzIGRre3N0YXRpYyBmb3JSb290KHQsZT17fSl7cmV0dXJue25nTW9kdWxlOmxrLHByb3ZpZGVyczpbe3Byb3ZpZGU6bncsdXNlRmFjdG9yeTpoayxkZXBzOltbSXcsbmV3IFNyLG5ldyBFcl1dfSx7cHJvdmlkZTpvdyx1c2VWYWx1ZTplLmluaXRpYWxTdGF0ZX0se3Byb3ZpZGU6aXcsdXNlRmFjdG9yeTpmayxkZXBzOltvd119LHtwcm92aWRlOmx3LHVzZVZhbHVlOnR9LHtwcm92aWRlOmR3LHVzZUV4aXN0aW5nOnQgaW5zdGFuY2VvZiBHYT90Omx3fSx7cHJvdmlkZTpzdyxkZXBzOltycCxsdyxbbmV3IGtyKGR3KV1dLHVzZUZhY3Rvcnk6cGt9LHtwcm92aWRlOmh3LHVzZVZhbHVlOmUubWV0YVJlZHVjZXJzP2UubWV0YVJlZHVjZXJzOltdfSx7cHJvdmlkZTp5dyxkZXBzOltidyxod10sdXNlRmFjdG9yeTpna30se3Byb3ZpZGU6cncsdXNlVmFsdWU6ZS5yZWR1Y2VyRmFjdG9yeT9lLnJlZHVjZXJGYWN0b3J5Onh3fSx7cHJvdmlkZTphdyxkZXBzOltydyx5d10sdXNlRmFjdG9yeTpQd30sZXcsRHcsUncsencsSHcsKG49ZS5ydW50aW1lQ2hlY2tzLFt7cHJvdmlkZTpDdyx1c2VWYWx1ZTpufSx7cHJvdmlkZTpfdyx1c2VGYWN0b3J5OnJrLGRlcHM6W0N3XX0se3Byb3ZpZGU6TXcsZGVwczpbX3ddLHVzZUZhY3Rvcnk6dGt9LHtwcm92aWRlOmJ3LG11bHRpOiEwLGRlcHM6W013XSx1c2VGYWN0b3J5Om5rfSx7cHJvdmlkZTpidyxtdWx0aTohMCxkZXBzOltNd10sdXNlRmFjdG9yeTpla30se3Byb3ZpZGU6YncsbXVsdGk6ITAsZGVwczpbTXddLHVzZUZhY3Rvcnk6aWt9XSksYWsoKV19O3ZhciBufXN0YXRpYyBmb3JGZWF0dXJlKHQsZSxuPXt9KXtyZXR1cm57bmdNb2R1bGU6Y2sscHJvdmlkZXJzOlt7cHJvdmlkZTptdyxtdWx0aTohMCx1c2VWYWx1ZTp0IGluc3RhbmNlb2YgT2JqZWN0P3t9Om59LHtwcm92aWRlOmN3LG11bHRpOiEwLHVzZVZhbHVlOntrZXk6dCBpbnN0YW5jZW9mIE9iamVjdD90Lm5hbWU6dCxyZWR1Y2VyRmFjdG9yeTpuIGluc3RhbmNlb2YgR2F8fCFuLnJlZHVjZXJGYWN0b3J5P3h3Om4ucmVkdWNlckZhY3RvcnksbWV0YVJlZHVjZXJzOm4gaW5zdGFuY2VvZiBHYXx8IW4ubWV0YVJlZHVjZXJzP1tdOm4ubWV0YVJlZHVjZXJzLGluaXRpYWxTdGF0ZTpuIGluc3RhbmNlb2YgR2F8fCFuLmluaXRpYWxTdGF0ZT92b2lkIDA6bi5pbml0aWFsU3RhdGV9fSx7cHJvdmlkZTp1dyxkZXBzOltycCxtdyxjd10sdXNlRmFjdG9yeTpta30se3Byb3ZpZGU6cHcsbXVsdGk6ITAsdXNlVmFsdWU6dCBpbnN0YW5jZW9mIE9iamVjdD90LnJlZHVjZXI6ZX0se3Byb3ZpZGU6ZncsbXVsdGk6ITAsdXNlRXhpc3Rpbmc6ZSBpbnN0YW5jZW9mIEdhP2U6cHd9LHtwcm92aWRlOmd3LG11bHRpOiEwLGRlcHM6W3JwLHB3LFtuZXcga3IoZncpXV0sdXNlRmFjdG9yeTp1a30sYWsoKV19fX1mdW5jdGlvbiBwayh0LGUpe3JldHVybiBlIGluc3RhbmNlb2YgR2E/dC5nZXQoZSk6ZX1mdW5jdGlvbiBtayh0LGUsbil7cmV0dXJuIG4ubWFwKCgobixvKT0+e2lmKGVbb11pbnN0YW5jZW9mIEdhKXtjb25zdCBpPXQuZ2V0KGVbb10pO3JldHVybntrZXk6bi5rZXkscmVkdWNlckZhY3Rvcnk6aS5yZWR1Y2VyRmFjdG9yeT9pLnJlZHVjZXJGYWN0b3J5Onh3LG1ldGFSZWR1Y2VyczppLm1ldGFSZWR1Y2Vycz9pLm1ldGFSZWR1Y2VyczpbXSxpbml0aWFsU3RhdGU6aS5pbml0aWFsU3RhdGV9fXJldHVybiBufSkpfWZ1bmN0aW9uIHVrKHQsZSl7cmV0dXJuIGUubWFwKChlPT5lIGluc3RhbmNlb2YgR2E/dC5nZXQoZSk6ZSkpfWZ1bmN0aW9uIGZrKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3QoKTp0fWZ1bmN0aW9uIGdrKHQsZSl7cmV0dXJuIHQuY29uY2F0KGUpfWZ1bmN0aW9uIGhrKHQpe2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3RvcmVNb2R1bGUuZm9yUm9vdCgpIGNhbGxlZCB0d2ljZS4gRmVhdHVyZSBtb2R1bGVzIHNob3VsZCB1c2UgU3RvcmVNb2R1bGUuZm9yRmVhdHVyZSgpIGluc3RlYWQuIik7cmV0dXJuImd1YXJkZWQifWZ1bmN0aW9uIGJrKC4uLnQpe3JldHVybntyZWR1Y2VyOnQucG9wKCksdHlwZXM6dC5tYXAoKHQ9PnQudHlwZSkpfX1mdW5jdGlvbiB5ayh0LC4uLmUpe2NvbnN0IG49bmV3IE1hcDtmb3IoY29uc3QgdCBvZiBlKWZvcihjb25zdCBlIG9mIHQudHlwZXMpe2NvbnN0IG89bi5nZXQoZSk7bi5zZXQoZSxvPyhlLG4pPT50LnJlZHVjZXIobyhlLG4pLG4pOnQucmVkdWNlcil9cmV0dXJuIGZ1bmN0aW9uKGU9dCxvKXtjb25zdCBpPW4uZ2V0KG8udHlwZSk7cmV0dXJuIGk/aShlLG8pOmV9fWRrLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxkayl9LGRrLsm1bW9kPWFvKHt0eXBlOmRrfSksZGsuybVpbmo9dm4oe30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZGssW3t0eXBlOkF5LGFyZ3M6W3t9XX1dLG51bGwsbnVsbCk7Y29uc3QgX2s9e2Rpc3BhdGNoOiEwLHVzZUVmZmVjdHNFcnJvckhhbmRsZXI6ITB9LENrPSJfX0BuZ3J4L2VmZmVjdHNfY3JlYXRlX18iO2Z1bmN0aW9uIE1rKHQsZSl7Y29uc3Qgbj10KCksbz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sX2spLGUpO3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkobixDayx7dmFsdWU6b30pLG59ZnVuY3Rpb24gdmsodCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpLmZpbHRlcigoZT0+ISghdFtlXXx8IXRbZV0uaGFzT3duUHJvcGVydHkoQ2spKSYmdFtlXVtDa10uaGFzT3duUHJvcGVydHkoImRpc3BhdGNoIikpKS5tYXAoKGU9Pk9iamVjdC5hc3NpZ24oe3Byb3BlcnR5TmFtZTplfSx0W2VdW0NrXSkpKX1mdW5jdGlvbiB4ayh0KXtyZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfWNvbnN0IE9rPSJfX0BuZ3J4L2VmZmVjdHNfXyI7ZnVuY3Rpb24gUGsodCl7cmV0dXJuIE93KHdrLHhrKSh0KX1mdW5jdGlvbiB3ayh0KXtyZXR1cm4oZnVuY3Rpb24gZSh0KXtyZXR1cm4gdC5jb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShPayl9KSh0KT90LmNvbnN0cnVjdG9yW09rXTpbXX1mdW5jdGlvbiBrayh0LGUsbj0xMCl7cmV0dXJuIHQucGlwZShwZSgobz0+KGUmJmUuaGFuZGxlRXJyb3Iobyksbjw9MT90OmtrKHQsZSxuLTEpKSkpKX1jbGFzcyBTayBleHRlbmRzIER7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0JiYodGhpcy5zb3VyY2U9dCl9bGlmdCh0KXtjb25zdCBlPW5ldyBTaztyZXR1cm4gZS5zb3VyY2U9dGhpcyxlLm9wZXJhdG9yPXQsZX19ZnVuY3Rpb24gRGsoLi4udCl7cmV0dXJuIGNlKChlPT50LnNvbWUoKHQ9PiJzdHJpbmciPT10eXBlb2YgdD90PT09ZS50eXBlOnQudHlwZT09PWUudHlwZSkpKSl9ZnVuY3Rpb24gRWsodCl7cmV0dXJuIFJrKHQsIm5ncnhPbkluaXRFZmZlY3RzIil9ZnVuY3Rpb24gUmsodCxlKXtyZXR1cm4gdCYmZSBpbiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdFtlXX1Tay7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8U2spKHZyKEV3KSl9LFNrLsm1cHJvdj1Nbih7dG9rZW46U2ssZmFjdG9yeTpTay7JtWZhY30pLFNrLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6RCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltFd119XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoU2ssW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkQsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbRXddfV19XX0pLG51bGwpO2NvbnN0IEFrPW5ldyBHYSgiQG5ncngvZWZmZWN0cyBJbnRlcm5hbCBSb290IEd1YXJkIiksVGs9bmV3IEdhKCJAbmdyeC9lZmZlY3RzIFVzZXIgUHJvdmlkZWQgRWZmZWN0cyIpLE5rPW5ldyBHYSgiQG5ncngvZWZmZWN0cyBJbnRlcm5hbCBSb290IEVmZmVjdHMiKSx6az1uZXcgR2EoIkBuZ3J4L2VmZmVjdHMgUm9vdCBFZmZlY3RzIiksSWs9bmV3IEdhKCJAbmdyeC9lZmZlY3RzIEludGVybmFsIEZlYXR1cmUgRWZmZWN0cyIpLEhrPW5ldyBHYSgiQG5ncngvZWZmZWN0cyBGZWF0dXJlIEVmZmVjdHMiKSxGaz1uZXcgR2EoIkBuZ3J4L2VmZmVjdHMgRWZmZWN0cyBFcnJvciBIYW5kbGVyIik7Y2xhc3MgTGsgZXh0ZW5kcyBJe2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoKSx0aGlzLmVycm9ySGFuZGxlcj10LHRoaXMuZWZmZWN0c0Vycm9ySGFuZGxlcj1lfWFkZEVmZmVjdHModCl7dGhpcy5uZXh0KHQpfXRvQWN0aW9ucygpe3JldHVybiB0aGlzLnBpcGUod2UoeGspLFp0KCh0PT50LnBpcGUod2UoQmspKSkpLFp0KCh0PT5yZSh0LnBpcGUoUGUoKHQ9PihmdW5jdGlvbiBlKHQsbil7cmV0dXJuIGU9Pntjb25zdCBvPShmdW5jdGlvbiBpKHQsZSxuKXtjb25zdCBvPXhrKHQpLmNvbnN0cnVjdG9yLm5hbWU7cmV0dXJuIHJlKC4uLihmdW5jdGlvbiBpKHQpe3JldHVybltQayx2a10ucmVkdWNlKCgoZSxuKT0+ZS5jb25jYXQobih0KSkpLFtdKX0pKHQpLm1hcCgoKHtwcm9wZXJ0eU5hbWU6aSxkaXNwYXRjaDphLHVzZUVmZmVjdHNFcnJvckhhbmRsZXI6cn0pPT57Y29uc3Qgcz0iZnVuY3Rpb24iPT10eXBlb2YgdFtpXT90W2ldKCk6dFtpXSxsPXI/bihzLGUpOnM7cmV0dXJuITE9PT1hP2wucGlwZSh5ZSgpKTpsLnBpcGUoKGZ1bmN0aW9uIGMoKXtyZXR1cm4gUigoZnVuY3Rpb24odCxlKXt0LnN1YnNjcmliZShuZXcgVChlLChmdW5jdGlvbih0KXtlLm5leHQoQXQuY3JlYXRlTmV4dCh0KSl9KSwoZnVuY3Rpb24oKXtlLm5leHQoQXQuY3JlYXRlQ29tcGxldGUoKSksZS5jb21wbGV0ZSgpfSksKGZ1bmN0aW9uKHQpe2UubmV4dChBdC5jcmVhdGVFcnJvcih0KSksZS5jb21wbGV0ZSgpfSkpKX0pKX0pKCkpLnBpcGUoSXQoKGU9Pih7ZWZmZWN0OnRbaV0sbm90aWZpY2F0aW9uOmUscHJvcGVydHlOYW1lOmksc291cmNlTmFtZTpvLHNvdXJjZUluc3RhbmNlOnR9KSkpKX0pKSl9KShlLHQsbik7cmV0dXJuKGZ1bmN0aW9uIGEodCl7cmV0dXJuIFJrKHQsIm5ncnhPblJ1bkVmZmVjdHMiKX0pKGUpP2UubmdyeE9uUnVuRWZmZWN0cyhvKTpvfX0pKHRoaXMuZXJyb3JIYW5kbGVyLHRoaXMuZWZmZWN0c0Vycm9ySGFuZGxlcikodCkpKSxJdCgodD0+KChmdW5jdGlvbiBlKHQsbil7aWYoIk4iPT09dC5ub3RpZmljYXRpb24ua2luZCl7Y29uc3QgZT10Lm5vdGlmaWNhdGlvbi52YWx1ZTshKGZ1bmN0aW9uIG8odCl7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJnQmJnQudHlwZSYmInN0cmluZyI9PXR5cGVvZiB0LnR5cGV9KShlKSYmbi5oYW5kbGVFcnJvcihuZXcgRXJyb3IoYEVmZmVjdCAkeyhmdW5jdGlvbiBpKHtwcm9wZXJ0eU5hbWU6dCxzb3VyY2VJbnN0YW5jZTplLHNvdXJjZU5hbWU6bn0pe2NvbnN0IG89ImZ1bmN0aW9uIj09dHlwZW9mIGVbdF07cmV0dXJuYCIke259LiR7U3RyaW5nKHQpfSR7bz8iKCkiOiIifSJgfSkodCl9IGRpc3BhdGNoZWQgYW4gaW52YWxpZCBhY3Rpb246ICR7KGZ1bmN0aW9uIGEodCl7dHJ5e3JldHVybiBKU09OLnN0cmluZ2lmeSh0KX1jYXRjaChlKXtyZXR1cm4gdH19KShlKX1gKSl9fSkodCx0aGlzLmVycm9ySGFuZGxlciksdC5ub3RpZmljYXRpb24pKSksY2UoKHQ9PiJOIj09PXQua2luZCYmbnVsbCE9dC52YWx1ZSkpLChmdW5jdGlvbiBlKCl7cmV0dXJuIFIoKGZ1bmN0aW9uKHQsZSl7dC5zdWJzY3JpYmUobmV3IFQoZSwoZnVuY3Rpb24odCl7cmV0dXJuIFR0KHQsZSl9KSkpfSkpfSkoKSksdC5waXBlKGJlKDEpLGNlKEVrKSxJdCgodD0+dC5uZ3J4T25Jbml0RWZmZWN0cygpKSkpKSkpKX19ZnVuY3Rpb24gQmsodCl7cmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJuIFJrKHQsIm5ncnhPbklkZW50aWZ5RWZmZWN0cyIpfSkodCk/dC5uZ3J4T25JZGVudGlmeUVmZmVjdHMoKToiIn1May7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8TGspKHZyKFpzKSx2cihGaykpfSxMay7JtXByb3Y9TW4oe3Rva2VuOkxrLGZhY3Rvcnk6TGsuybVmYWN9KSxMay5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlpzfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbRmtdfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKExrLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpac30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W0ZrXX1dfV19KSxudWxsKTtjbGFzcyBWa3tjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuZWZmZWN0U291cmNlcz10LHRoaXMuc3RvcmU9ZSx0aGlzLmVmZmVjdHNTdWJzY3JpcHRpb249bnVsbH1zdGFydCgpe3RoaXMuZWZmZWN0c1N1YnNjcmlwdGlvbnx8KHRoaXMuZWZmZWN0c1N1YnNjcmlwdGlvbj10aGlzLmVmZmVjdFNvdXJjZXMudG9BY3Rpb25zKCkuc3Vic2NyaWJlKHRoaXMuc3RvcmUpKX1uZ09uRGVzdHJveSgpe3RoaXMuZWZmZWN0c1N1YnNjcmlwdGlvbiYmKHRoaXMuZWZmZWN0c1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuZWZmZWN0c1N1YnNjcmlwdGlvbj1udWxsKX19VmsuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFZrKSh2cihMayksdnIoSXcpKX0sVmsuybVwcm92PU1uKHt0b2tlbjpWayxmYWN0b3J5OlZrLsm1ZmFjfSksVmsuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpMa30se3R5cGU6SXd9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFZrLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpMa30se3R5cGU6SXd9XX0pLG51bGwpO2NvbnN0IGprPSJAbmdyeC9lZmZlY3RzL2luaXQiO0pQKGprKTtjbGFzcyBVa3tjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyKXt0aGlzLnNvdXJjZXM9dCxlLnN0YXJ0KCksby5mb3JFYWNoKChlPT50LmFkZEVmZmVjdHMoZSkpKSxuLmRpc3BhdGNoKHt0eXBlOmprfSl9YWRkRWZmZWN0cyh0KXt0aGlzLnNvdXJjZXMuYWRkRWZmZWN0cyh0KX19VWsuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFVrKSh2cihMayksdnIoVmspLHZyKEl3KSx2cih6ayksdnIobGssOCksdnIoY2ssOCksdnIoQWssOCkpfSxVay7JtW1vZD1hbyh7dHlwZTpVa30pLFVrLsm1aW5qPXZuKHt9KSxVay5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOkxrfSx7dHlwZTpWa30se3R5cGU6SXd9LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3prXX1dfSx7dHlwZTpsayxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpjayxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W0FrXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChVayxbe3R5cGU6QXksYXJnczpbe31dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkxrfSx7dHlwZTpWa30se3R5cGU6SXd9LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3prXX1dfSx7dHlwZTpsayxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpjayxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W0FrXX1dfV19KSxudWxsKTtjbGFzcyBHa3tjb25zdHJ1Y3Rvcih0LGUsbixvKXtlLmZvckVhY2goKGU9PmUuZm9yRWFjaCgoZT0+dC5hZGRFZmZlY3RzKGUpKSkpKX19R2suybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEdrKSh2cihVayksdnIoSGspLHZyKGxrLDgpLHZyKGNrLDgpKX0sR2suybVtb2Q9YW8oe3R5cGU6R2t9KSxHay7JtWluaj12bih7fSksR2suY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpVa30se3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbSGtdfV19LHt0eXBlOmxrLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOmNrLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEdrLFt7dHlwZTpBeSxhcmdzOlt7fV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6VWt9LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W0hrXX1dfSx7dHlwZTpsayxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpjayxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfV19KSxudWxsKTtjbGFzcyBXa3tzdGF0aWMgZm9yRmVhdHVyZSh0PVtdKXtyZXR1cm57bmdNb2R1bGU6R2sscHJvdmlkZXJzOlt0LHtwcm92aWRlOklrLG11bHRpOiEwLHVzZVZhbHVlOnR9LHtwcm92aWRlOlRrLG11bHRpOiEwLHVzZVZhbHVlOltdfSx7cHJvdmlkZTpIayxtdWx0aTohMCx1c2VGYWN0b3J5OllrLGRlcHM6W3JwLElrLFRrXX1dfX1zdGF0aWMgZm9yUm9vdCh0PVtdKXtyZXR1cm57bmdNb2R1bGU6VWsscHJvdmlkZXJzOlt7cHJvdmlkZTpGayx1c2VWYWx1ZTpra30sVmssTGssU2ssdCx7cHJvdmlkZTpOayx1c2VWYWx1ZTpbdF19LHtwcm92aWRlOkFrLHVzZUZhY3Rvcnk6cWssZGVwczpbW1ZrLG5ldyBTcixuZXcgRXJdLFtOayxuZXcgRHJdXX0se3Byb3ZpZGU6VGssbXVsdGk6ITAsdXNlVmFsdWU6W119LHtwcm92aWRlOnprLHVzZUZhY3Rvcnk6WWssZGVwczpbcnAsTmssVGtdfV19fX1mdW5jdGlvbiBZayh0LGUsbil7Y29uc3Qgbz1bXTtmb3IoY29uc3QgdCBvZiBlKW8ucHVzaCguLi50KTtmb3IoY29uc3QgdCBvZiBuKW8ucHVzaCguLi50KTtyZXR1cm4oZnVuY3Rpb24gaSh0LGUpe3JldHVybiBlLm1hcCgoZT0+dC5nZXQoZSkpKX0pKHQsbyl9ZnVuY3Rpb24gcWsodCxlKXtpZigoMSE9PWUubGVuZ3RofHwwIT09ZVswXS5sZW5ndGgpJiZ0KXRocm93IG5ldyBUeXBlRXJyb3IoIkVmZmVjdHNNb2R1bGUuZm9yUm9vdCgpIGNhbGxlZCB0d2ljZS4gRmVhdHVyZSBtb2R1bGVzIHNob3VsZCB1c2UgRWZmZWN0c01vZHVsZS5mb3JGZWF0dXJlKCkgaW5zdGVhZC4iKTtyZXR1cm4iZ3VhcmRlZCJ9dmFyIFprO1drLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxXayl9LFdrLsm1bW9kPWFvKHt0eXBlOldrfSksV2suybVpbmo9dm4oe30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoV2ssW3t0eXBlOkF5LGFyZ3M6W3t9XX1dLG51bGwsbnVsbCksKGZ1bmN0aW9uKHQpe3RbdC5VTktOT1dOPTBdPSJVTktOT1dOIix0W3QuRVhQRVJJTUVOVFM9MV09IkVYUEVSSU1FTlRTIix0W3QuRVhQRVJJTUVOVD0yXT0iRVhQRVJJTUVOVCIsdFt0LkNPTVBBUkVfRVhQRVJJTUVOVD0zXT0iQ09NUEFSRV9FWFBFUklNRU5UIix0W3QuTk9UX1NFVD00XT0iTk9UX1NFVCJ9KShaa3x8KFprPXt9KSk7Y29uc3QgWGs9ImRlZmF1bHRFeHBlcmltZW50SWQiO2Z1bmN0aW9uIEtrKHQpe3JldHVybiB0LnNwbGl0KCIsIikubWFwKCh0PT57Y29uc3QgZT10LmluZGV4T2YoIjoiKTtpZihlPDApdGhyb3cgbmV3IEVycm9yKGBFeHBlY3QgY29sb24gZGVsaW1pdGluZyBuYW1lIGFuZCBJRDogJHt0fWApO2NvbnN0IG49dC5zbGljZSgwLGUpLG89dC5zbGljZShlKzEpO2lmKCFvKXRocm93IG5ldyBFcnJvcihgRXhwZWN0IGlkIHRvIGJlIG5vbi1mYWxzeTogJHt0fWApO3JldHVybntuYW1lOm4saWQ6b319KSl9ZnVuY3Rpb24gSmsodCxlKXtzd2l0Y2godCl7Y2FzZSBaay5FWFBFUklNRU5UOnJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwiZXhwZXJpbWVudElkIik/W2UuZXhwZXJpbWVudElkXTpbWGtdO2Nhc2UgWmsuQ09NUEFSRV9FWFBFUklNRU5UOnJldHVybiBLayhlLmV4cGVyaW1lbnRJZHMpLm1hcCgoKHtpZDp0fSk9PnQpKTtjYXNlIFprLkVYUEVSSU1FTlRTOmRlZmF1bHQ6cmV0dXJuIG51bGx9fWZ1bmN0aW9uIFFrKHQsZSl7dmFyIG47c3dpdGNoKHQpe2Nhc2UgWmsuQ09NUEFSRV9FWFBFUklNRU5UOmNhc2UgWmsuRVhQRVJJTUVOVDp7Y29uc3Qgbz1udWxsIT09KG49SmsodCxlKSkmJnZvaWQgMCE9PW4/bjpbXTtyZXR1cm4gby5zb3J0KCksYCR7dH0vJHtvLmpvaW4oIiwiKX1gfWNhc2UgWmsuRVhQRVJJTUVOVFM6cmV0dXJuIFN0cmluZyh0KTtjYXNlIFprLk5PVF9TRVQ6cmV0dXJuIl9fbm90X3NldCI7ZGVmYXVsdDpyZXR1cm4iIn19Y29uc3QgJGs9KCk9PndpbmRvdy5sb2NhdGlvbi5ocmVmO2NsYXNzIHRTe2dldEhyZWYoKXtyZXR1cm4gJGsoKX1nZXRTZWFyY2goKXtjb25zdCB0PW5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCksZT1bXTtyZXR1cm4gdC5mb3JFYWNoKCgodCxuKT0+e2UucHVzaCh7a2V5Om4sdmFsdWU6dH0pfSkpLGV9Z2V0SGFzaCgpe3JldHVybiB3aW5kb3cubG9jYXRpb24uaGFzaH1nZXRQYXRoKCl7cmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZX1yZXBsYWNlU3RhdGUodCl7d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIiIsdCl9cHVzaFN0YXRlKHQpe3dpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShudWxsLCIiLHQpfW9uUG9wU3RhdGUoKXtyZXR1cm4gb2Uod2luZG93LCJwb3BzdGF0ZSIpLnBpcGUoSXQoKCgpPT4oe3BhdGhuYW1lOnRoaXMuZ2V0UGF0aCgpLHF1ZXJ5UGFyYW1zOnRoaXMuZ2V0U2VhcmNoKCl9KSkpKX1nZXRSZXNvbHZlZFBhdGgodCl7cmV0dXJuIG5ldyBVUkwodCwkaygpKS5wYXRobmFtZX1nZXRGdWxsUGF0aEZyb21Sb3V0ZU9yTmF2KHQsZSl7Y29uc3Qgbj10aGlzLmdldFJlc29sdmVkUGF0aCh0LnBhdGhuYW1lKTtsZXQgbz0iIjtyZXR1cm4hKGZ1bmN0aW9uIGkodCl7cmV0dXJuIHQuaGFzT3duUHJvcGVydHkoInBhdGhuYW1lIikmJiF0Lmhhc093blByb3BlcnR5KCJxdWVyeVBhcmFtcyIpfSkodCkmJnQucXVlcnlQYXJhbXMubGVuZ3RoJiYobz0iPyIrKGZ1bmN0aW9uIGEodCl7Y29uc3QgZT1uZXcgVVJMU2VhcmNoUGFyYW1zO2Zvcihjb25zdHtrZXk6bix2YWx1ZTpvfW9mIHQpZS5hcHBlbmQobixvKTtyZXR1cm4gZX0pKHQucXVlcnlQYXJhbXMpLnRvU3RyaW5nKCkpLGAke259JHtvfSR7ZT90aGlzLmdldEhhc2goKToiIn1gfX10Uy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8dFMpfSx0Uy7JtXByb3Y9TW4oe3Rva2VuOnRTLGZhY3Rvcnk6dFMuybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHRTLFt7dHlwZTppbX1dLG51bGwsbnVsbCk7Y2xhc3MgZVN7Y29uc3RydWN0b3IodCl7dGhpcy5hcHBSb290PXRoaXMuZ2V0QXBwUm9vdEZyb21NZXRhRWxlbWVudCh0KX1nZXRBcHBSb290RnJvbU1ldGFFbGVtZW50KHQpe2NvbnN0IGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZCBtZXRhW25hbWU9InRiLXJlbGF0aXZlLXJvb3QiXScpO2lmKCFlKXJldHVybiIvIjtjb25zdHtwYXRobmFtZTpufT1uZXcgVVJMKGUuY29udGVudCx0LmdldEhyZWYoKSk7cmV0dXJuIG4ucmVwbGFjZSgvXC8qJC8sIi8iKX1nZXRBYnNQYXRobmFtZVdpdGhBcHBSb290KHQpe3JldHVybiB0aGlzLmFwcFJvb3Quc2xpY2UoMCwtMSkrdH1nZXRBcHBSb290bGVzc1BhdGhuYW1lKHQpe3JldHVybiB0LnN0YXJ0c1dpdGgodGhpcy5hcHBSb290KT8iLyIrdC5zbGljZSh0aGlzLmFwcFJvb3QubGVuZ3RoKTp0fX1lUy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8ZVMpKHZyKHRTKSl9LGVTLsm1cHJvdj1Nbih7dG9rZW46ZVMsZmFjdG9yeTplUy7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZVMsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnRTfV19KSxudWxsKTtjbGFzcyBuUyBleHRlbmRzIGVTe2dldEFwcFJvb3QoKXtyZXR1cm4gdGhpcy5hcHBSb290fXNldEFwcFJvb3QodCl7dGhpcy5hcHBSb290PXR9fW5TLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYShuUykpKShufHxuUyl9fSkoKSxuUy7JtXByb3Y9TW4oe3Rva2VuOm5TLGZhY3Rvcnk6blMuybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKG5TLFt7dHlwZTppbX1dLG51bGwsbnVsbCk7Y2xhc3Mgb1N7fW9TLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxvUyl9LG9TLsm1bW9kPWFvKHt0eXBlOm9TfSksb1MuybVpbmo9dm4oe3Byb3ZpZGVyczpbdFNdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChvUyxbe3R5cGU6QXksYXJnczpbe3Byb3ZpZGVyczpbdFNdfV19XSxudWxsLG51bGwpO2NsYXNzIGlTe31pUy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8aVMpfSxpUy7JtW1vZD1hbyh7dHlwZTppU30pLGlTLsm1aW5qPXZuKHtwcm92aWRlcnM6W2VTXSxpbXBvcnRzOltbb1NdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoaVMsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltvU10scHJvdmlkZXJzOltlU119XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhpUyx7aW1wb3J0czpbb1NdfSk7Y29uc3QgYVM9SlAoIltBcHAgUm91dGluZ10gRGlzY2FyZGluZyBVbnNhdmVkIFVwZGF0ZXMiKSxyUz1KUCgiW0FwcCBSb3V0aW5nXSBTdGF0ZSBSZWh5ZHJhdGVkIEZyb20gVXJsIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksc1M9SlAoIltBcHAgUm91dGluZ10gUm91dGUgQ29uZmlnIExvYWRlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLGxTPUpQKCJbQXBwIFJvdXRpbmddIEluIEFwcCBOYXZpZ2F0aW9uIFJlcXVlc3RlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLGNTPUpQKCJbQXBwIFJvdXRpbmddIEluIEFwcCBOYXZpZ2F0aW5nIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksZFM9SlAoIltBcHAgUm91dGluZ10gSW4gQXBwIE5hdmlnYXRlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLHBTPW5ldyBHYSgiW0FwcCBSb3V0aW5nXSBEaXJ0eSBVcGRhdGVzIik7Y2xhc3MgbVN7Y29uc3RydWN0b3IodCl7dGhpcy5kaXJ0eVVwZGF0ZXNTZWxlY3RvckZhY3Rvcmllcz10fWdldERpcnR5VXBkYXRlc1NlbGVjdG9ycygpe3ZhciB0O3JldHVybiBudWxsIT09KHQ9dGhpcy5kaXJ0eVVwZGF0ZXNTZWxlY3RvckZhY3RvcmllcykmJnZvaWQgMCE9PXQ/dDpbXX1zdGF0aWMgcmVnaXN0ZXJEaXJ0eVVwZGF0ZXModCl7cmV0dXJue25nTW9kdWxlOm1TLHByb3ZpZGVyczpbe3Byb3ZpZGU6cFMsbXVsdGk6ITAsdXNlRmFjdG9yeTp0fV19fX1tUy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bVMpKHZyKHBTLDgpKX0sbVMuybVtb2Q9YW8oe3R5cGU6bVN9KSxtUy7JtWluaj12bih7fSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChtUyxbe3R5cGU6QXl9XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3BTXX1dfV19KSxudWxsKTtjb25zdCB1Uz1uZXcgR2EoIltBcHAgUm91dGluZ10gUHJvZ3JhbW1hdGljYWwgTmF2aWdhdGlvbiBQcm92aWRlciIpO2NsYXNzIGZTe2NvbnN0cnVjdG9yKHQpe3RoaXMucHJvdmlkZXJzPW5ldyBNYXA7Zm9yKGNvbnN0IGUgb2YgdHx8W10pe2lmKHRoaXMucHJvdmlkZXJzLmhhcyhlLmFjdGlvbkNyZWF0b3IudHlwZSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYCIke2UuYWN0aW9uQ3JlYXRvci50eXBlfSIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciBuYXYuIE11bHRpcGxlIG5hdmlnYXRpb25zIG9uIHNhbWUga2ljayBpcyBub3QgYWxsb3dlZC5gKTt0aGlzLnByb3ZpZGVycy5zZXQoZS5hY3Rpb25DcmVhdG9yLnR5cGUsZS5sYW1iZGEpfX1nZXROYXZpZ2F0aW9uKHQpe2NvbnN0IGU9dGhpcy5wcm92aWRlcnMuZ2V0KHQudHlwZSk7cmV0dXJuIGU/ZSh0KTpudWxsfXN0YXRpYyByZWdpc3RlclByb2dyYW1tYXRpY2FsTmF2aWdhdGlvbih0KXtyZXR1cm57bmdNb2R1bGU6ZlMscHJvdmlkZXJzOlt7cHJvdmlkZTp1UyxtdWx0aTohMCx1c2VGYWN0b3J5OnR9XX19fWZ1bmN0aW9uIGdTKHQpe3JldHVybiBudWxsIT10LnJvdXRlS2luZH1mdW5jdGlvbiBoUyh0KXtyZXR1cm4gdlModCkubWFwKCh0PT57Y29uc3QgZT10LnN0YXJ0c1dpdGgoIjoiKTtyZXR1cm4gZT97cGF0aFBhcnQ6dCxpc1BhcmFtOiEwLHBhcmFtTmFtZTp0LnNsaWNlKDEpfTp7cGF0aFBhcnQ6dCxpc1BhcmFtOmV9fSkpfWZTLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxmUykodnIodVMsOCkpfSxmUy7JtW1vZD1hbyh7dHlwZTpmU30pLGZTLsm1aW5qPXZuKHt9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGZTLFt7dHlwZTpBeSxhcmdzOlt7fV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOlt1U119XX1dfSksbnVsbCk7Y2xhc3MgYlN7Y29uc3RydWN0b3IodCl7dGhpcy52YWxpZGF0ZUNvbmZpZyh0KSx0aGlzLnBhdGhGcmFnbWVudHM9aFModC5wYXRoKSx0aGlzLnBhdGhNYXRjaGVycz10aGlzLmdldFBhdGhNYXRjaGVycyh0aGlzLnBhdGhGcmFnbWVudHMpfXN0YXRpYyBnZXRNYXRjaGVyKHQpe3JldHVybiBnUyh0KT9uZXcgeVModCk6KGZ1bmN0aW9uIGUodCl7cmV0dXJuIHZvaWQgMCE9PXQucmVkaXJlY3Rpb25QYXRofSkodCk/bmV3IF9TKHQpOm5ldyBDUyh0KX12YWxpZGF0ZUNvbmZpZyh7cGF0aDp0fSl7aWYoIXQuc3RhcnRzV2l0aCgiLyIpKXRocm93IG5ldyBSYW5nZUVycm9yKGBjb25maWcucGF0aCBzaG91bGQgc3RhcnQgd2l0aCAnLycuICR7dH1gKTtsZXQgZT0wO2Zvcig7KGU9dC5pbmRleE9mKCI6IixlKzEpKT49MDspe2lmKCIvIiE9PXRbZS0xXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgY29uZmlnLnBhdGggcGFyYW1ldGVyIHNob3VsZCBjb21lIGFmdGVyICcvJy4gJHt0fWApO2lmKHZvaWQgMD09PXRbZSsxXXx8Ii8iPT09dFtlKzFdKXRocm93IG5ldyBSYW5nZUVycm9yKGBjb25maWcucGF0aCBwYXJhbWV0ZXIgc2hvdWxkIGhhdmUgbm9uLWVtcHR5IG5hbWUuICR7dH1gKX19Z2V0UGF0aE1hdGNoZXJzKHQpe3JldHVybiB0Lm1hcCgodD0+e2NvbnN0e3BhdGhQYXJ0OmV9PXQ7cmV0dXJuIHQuaXNQYXJhbT9lPT4oe2lzUGFyYW1QYXRoUGFydDohMCxwYXJ0TWF0Y2hlZDohMCxwYXJhbU5hbWU6dC5wYXJhbU5hbWUscGFyYW1WYWx1ZTplfSk6dD0+KHtpc1BhcmFtUGF0aFBhcnQ6ITEscGFydE1hdGNoZWQ6dD09PWV9KX0pKX1tYXRjaCh0KXtsZXQgZT17fTtpZih0aGlzLnBhdGhNYXRjaGVycy5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm57cmVzdWx0OiExfTtsZXQgbj0wO2Zvcihjb25zdCBvIG9mIHRoaXMucGF0aE1hdGNoZXJzKXtjb25zdCBpPW8odFtuKytdKTtpZighaS5wYXJ0TWF0Y2hlZClyZXR1cm57cmVzdWx0OiExfTtpLmlzUGFyYW1QYXRoUGFydCYmKGU9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHtbaS5wYXJhbU5hbWVdOmkucGFyYW1WYWx1ZX0pKX1yZXR1cm57cmVzdWx0OiEwLHBhcmFtczplLHBhdGhQYXJ0czp0LGlzUmVkaXJlY3Rpb246ITF9fW1hdGNoQnlQYXJhbXModCl7cmV0dXJue3Jlc3VsdDohMCxwYXJhbXM6dCxwYXRoUGFydHM6dGhpcy5yZXByb2plY3RQYXRoQnlQYXJhbXModGhpcy5wYXRoRnJhZ21lbnRzLHQpLGlzUmVkaXJlY3Rpb246ITF9fXJlcHJvamVjdFBhdGhCeVBhcmFtcyh0LGUpe2NvbnN0IG49W107Zm9yKGNvbnN0IG8gb2YgdClpZihvLmlzUGFyYW0pe2NvbnN0e3BhcmFtTmFtZTp0fT1vO2lmKCFlLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBSYW5nZUVycm9yKGBGYWlsZWQgdG8gcmVwcm9qZWN0IHBhcmFtZXRlci4gIiR7dH0iIHBhcmFtZXRlciBzaG91bGQgYmUgcHJlc2VudC5gKTtuLnB1c2goZVt0XSl9ZWxzZSBuLnB1c2goby5wYXRoUGFydCk7cmV0dXJuIG59fWNsYXNzIHlTIGV4dGVuZHMgYlN7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5kZWZpbml0aW9uPXR9fWNsYXNzIF9TIGV4dGVuZHMgYlN7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5kZWZpbml0aW9uPXQsdGhpcy5yZWRpcmVjdGlvbkZyYWdtZW50cz1oUyh0LnJlZGlyZWN0aW9uUGF0aCl9bWF0Y2godCl7Y29uc3QgZT1zdXBlci5tYXRjaCh0KTtpZighZS5yZXN1bHQpcmV0dXJuIGU7Y29uc3Qgbj10aGlzLnJlcHJvamVjdFBhdGhCeVBhcmFtcyh0aGlzLnJlZGlyZWN0aW9uRnJhZ21lbnRzLGUucGFyYW1zKTtyZXR1cm57cmVzdWx0OiEwLHBhcmFtczplLnBhcmFtcyxwYXRoUGFydHM6bixpc1JlZGlyZWN0aW9uOiEwfX19Y2xhc3MgQ1MgZXh0ZW5kcyBiU3tjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLmRlZmluaXRpb249dH1tYXRjaCh0KXtjb25zdCBlPXN1cGVyLm1hdGNoKHQpO2lmKCFlLnJlc3VsdClyZXR1cm4gZTtjb25zdHtwYXRoUGFydHM6bixxdWVyeVBhcmFtczpvfT10aGlzLmRlZmluaXRpb24ucmVkaXJlY3Rvcih0KTtyZXR1cm57cmVzdWx0OiEwLHBhcmFtczplLnBhcmFtcyxwYXRoUGFydHM6bixpc1JlZGlyZWN0aW9uOiEwLHJlZGlyZWN0aW9uUXVlcnlQYXJhbXM6b319fWNsYXNzIE1Te2NvbnN0cnVjdG9yKHQsZT0zKXtpZih0aGlzLm1heFJlZGlyZWN0aW9uPWUsZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJtYXhSZWRpcmVjdGlvbiBoYXMgdG8gYmUgbm9uLW5lZ2F0aXZlIG51bWJlciIpO3RoaXMudmFsaWRhdGVSb3V0ZUNvbmZpZ3ModCksdGhpcy5kZWZhdWx0Um91dGVDb25maWc9bnVsbCx0aGlzLnJvdXRlS2luZFRvQ29uY3JldGVDb25maWdNYXRjaGVycz1uZXcgTWFwLHRoaXMuY29uZmlnTWF0Y2hlcnM9W107Zm9yKGNvbnN0IGUgb2YgdCl7Y29uc3QgdD1iUy5nZXRNYXRjaGVyKGUpO3RoaXMuY29uZmlnTWF0Y2hlcnMucHVzaCh0KSx0IGluc3RhbmNlb2YgeVMmJih0aGlzLnJvdXRlS2luZFRvQ29uY3JldGVDb25maWdNYXRjaGVycy5zZXQodC5kZWZpbml0aW9uLnJvdXRlS2luZCx0KSx0LmRlZmluaXRpb24uZGVmYXVsdFJvdXRlJiYodGhpcy5kZWZhdWx0Um91dGVDb25maWc9dCkpfX12YWxpZGF0ZVJvdXRlQ29uZmlncyh0KXtjb25zdCBlPXQuZmlsdGVyKGdTKSxuPWUuZmlsdGVyKCh0PT50LmRlZmF1bHRSb3V0ZSkpO2lmKG4ubGVuZ3RoPjEpe2NvbnN0IHQ9bi5tYXAoKCh7cGF0aDp0fSk9PnQpKS5qb2luKCIsICIpO3Rocm93IG5ldyBSYW5nZUVycm9yKGBUaGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBkZWZhdWx0Um91dGVzLiAke3R9YCl9aWYoMT09PW4ubGVuZ3RoKXtjb25zdHtwYXRoOnR9PW5bMF07aWYoQm9vbGVhbihoUyh0KS5maW5kKCgoe2lzUGFyYW06dH0pPT50KSkpKXRocm93IG5ldyBSYW5nZUVycm9yKGBBIGRlZmF1bHRSb3V0ZSBjYW5ub3QgaGF2ZSBhbnkgcGFyYW1zLiAke3R9YCl9Y29uc3Qgbz1uZXcgU2V0O2Zvcihjb25zdHtyb3V0ZUtpbmQ6dH1vZiBlKXtpZihvLmhhcyh0KSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgTXVsdGlwbGUgcm91dGUgY29uZmlndXJhdGlvbiBmb3Iga2luZDogJHt0fS4gQ29uZmlndXJhdGlvbnMgc2hvdWxkIGhhdmUgdW5pcXVlIHJvdXRlS2luZHNgKTtvLmFkZCh0KX19bWF0Y2godCl7dmFyIGU7aWYoIXQucGF0aG5hbWUuc3RhcnRzV2l0aCgiLyIpKXRocm93IG5ldyBSYW5nZUVycm9yKCdOYXZpZ2F0aW9uIGhhcyB0byBtYWRlIHdpdGggcGF0aG5hbWUgdGhhdCBzdGFydHMgd2l0aCAiLyInKTtsZXQgbixvPXZTKHQucGF0aG5hbWUpLGk9MCxhPSExO2Zvcig7Oyl7bGV0IHQ9ITE7Zm9yKGNvbnN0IGUgb2YgdGhpcy5jb25maWdNYXRjaGVycyl7Y29uc3QgaT1lLm1hdGNoKG8pO2lmKGkucmVzdWx0KXt0PSEwO2NvbnN0e3BhcmFtczpyLHBhdGhQYXJ0czpzLGlzUmVkaXJlY3Rpb246bH09aTtpZihsKXtvPXMsYT0hMCxuPWkucmVkaXJlY3Rpb25RdWVyeVBhcmFtczticmVha31pZighKGUgaW5zdGFuY2VvZiB5UykpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk5vIGNvbmNyZXRlIHJvdXRlIGRlZmluaXRpb24gYG1hdGNoYCByZXR1cm4gcmVkaXJlY3Rpb24iKTtjb25zdHtkZWZpbml0aW9uOmN9PWUsZD17cm91dGVLaW5kOmMucm91dGVLaW5kLHBhcmFtczpyLHBhdGhuYW1lOnhTKHMpLGRlZXBMaW5rUHJvdmlkZXI6Yy5kZWVwTGlua1Byb3ZpZGVyfHxudWxsfTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGQpLGE/e29yaWdpbmF0ZUZyb21SZWRpcmVjdGlvbjohMCxyZWRpcmVjdGlvbk9ubHlRdWVyeVBhcmFtczpufTp7b3JpZ2luYXRlRnJvbVJlZGlyZWN0aW9uOiExfSl9fWlmKGEmJmkrKywhdHx8aT50aGlzLm1heFJlZGlyZWN0aW9uKWJyZWFrfWlmKGk+dGhpcy5tYXhSZWRpcmVjdGlvbil0aHJvdyBuZXcgRXJyb3IoYFBvdGVudGlhbCByZWRpcmVjdGlvbiBsb29wIChyZWRpcmVjdGluZyBtb3JlIHRoYW4gJHt0aGlzLm1heFJlZGlyZWN0aW9ufSB0aW1lcy4gUGxlYXNlIGRvIG5vdCBoYXZlIGN5Y2xlcyBpbiB0aGUgcm91dGVzLmApO2lmKHRoaXMuZGVmYXVsdFJvdXRlQ29uZmlnKXtjb25zdHtkZWZpbml0aW9uOnR9PXRoaXMuZGVmYXVsdFJvdXRlQ29uZmlnO3JldHVybntyb3V0ZUtpbmQ6dC5yb3V0ZUtpbmQsZGVlcExpbmtQcm92aWRlcjpudWxsIT09KGU9dC5kZWVwTGlua1Byb3ZpZGVyKSYmdm9pZCAwIT09ZT9lOm51bGwscGF0aG5hbWU6dC5wYXRoLHBhcmFtczp7fSxvcmlnaW5hdGVGcm9tUmVkaXJlY3Rpb246YX19cmV0dXJuIG51bGx9bWF0Y2hCeVJvdXRlS2luZCh0LGUpe2NvbnN0IG49dGhpcy5yb3V0ZUtpbmRUb0NvbmNyZXRlQ29uZmlnTWF0Y2hlcnMuZ2V0KHQpO2lmKCFuKXRocm93IG5ldyBSYW5nZUVycm9yKGBSZXF1aXJlcyBjb25maWd1cmF0aW9uIGZvciByb3V0ZUtpbmQ6ICR7dH1gKTtyZXR1cm57cm91dGVLaW5kOnQscGFyYW1zOmUscGF0aG5hbWU6eFMobi5tYXRjaEJ5UGFyYW1zKGUpLnBhdGhQYXJ0cyksZGVlcExpbmtQcm92aWRlcjpuLmRlZmluaXRpb24uZGVlcExpbmtQcm92aWRlcnx8bnVsbCxvcmlnaW5hdGVGcm9tUmVkaXJlY3Rpb246ITF9fX1mdW5jdGlvbiB2Uyh0KXtyZXR1cm4gdC5zcGxpdCgiLyIpLnNsaWNlKDEpfWZ1bmN0aW9uIHhTKHQpe3JldHVybiIvIit0LmpvaW4oIi8iKX1jb25zdCBPUz1uZXcgR2EoIltBcHAgUm91dGluZ10gUm91dGUgQ29uZmlnIik7Y2xhc3MgUFN7Y29uc3RydWN0b3IodCl7aWYodGhpcy5yb3V0ZUNvbmZpZ3M9bnVsbCx0aGlzLnJvdXRlS2luZFRvTmdDb21wb25lbnQ9bmV3IE1hcCwhdClyZXR1cm47Y29uc3QgZT1bXTtmb3IoY29uc3QgbiBvZiB0KWZvcihjb25zdCB0IG9mIG4pZS5wdXNoKHQpO3RoaXMucm91dGVDb25maWdzPW5ldyBNUyhlKSxlLmZvckVhY2goKHQ9PntnUyh0KSYmdGhpcy5yb3V0ZUtpbmRUb05nQ29tcG9uZW50LnNldCh0LnJvdXRlS2luZCx0Lm5nQ29tcG9uZW50KX0pKX1nZXRSZWdpc3RlcmVkUm91dGVLaW5kcygpe3JldHVybiB0aGlzLnJvdXRlS2luZFRvTmdDb21wb25lbnQua2V5cygpfWdldFJvdXRlQ29uZmlncygpe3JldHVybiB0aGlzLnJvdXRlQ29uZmlnc31nZXROZ0NvbXBvbmVudEJ5Um91dGVLaW5kKHQpe3JldHVybiB0aGlzLnJvdXRlS2luZFRvTmdDb21wb25lbnQuZ2V0KHQpfHxudWxsfXN0YXRpYyByZWdpc3RlclJvdXRlcyh0KXtyZXR1cm57bmdNb2R1bGU6UFMscHJvdmlkZXJzOlt7cHJvdmlkZTpPUyxtdWx0aTohMCx1c2VGYWN0b3J5OnR9XX19fVBTLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxQUykodnIoT1MsOCkpfSxQUy7JtW1vZD1hbyh7dHlwZTpQU30pLFBTLsm1aW5qPXZuKHt9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFBTLFt7dHlwZTpBeSxhcmdzOlt7fV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltPU119XX1dfSksbnVsbCk7Y29uc3Qgd1M9ImFwcF9yb3V0aW5nIixrUz1Ldyh3UyksU1M9Wncoa1MsKHQ9PnQuYWN0aXZlUm91dGUpKSxEUz1adyhrUywodD0+dC5uZXh0Um91dGUpKSxFUz1adyhrUywodD0+dC5yZWdpc3RlcmVkUm91dGVLZXlzKSksUlM9WncoU1MsKHQ9PnQ/dC5yb3V0ZUtpbmQ6WmsuTk9UX1NFVCkpLEFTPVp3KFNTLCh0PT50P3QucGFyYW1zOnt9KSksVFM9WncoUlMsQVMsKCh0LGUpPT5Kayh0LGUpKSksTlM9WncoUlMsQVMsKCh0LGUpPT5Rayh0LGUpKSkselM9WncoUlMsQVMsKCh0LGUpPT57aWYodCE9PVprLkNPTVBBUkVfRVhQRVJJTUVOVClyZXR1cm57fTtjb25zdCBuPShmdW5jdGlvbiBvKHQpe2NvbnN0IGU9bmV3IE1hcCxuPUtrKHQuZXhwZXJpbWVudElkcyk7Zm9yKGNvbnN0e2lkOnQsbmFtZTpvfW9mIG4pbyYmZS5zZXQodCxvKTtyZXR1cm4gZX0pKGUpO3JldHVybiBPYmplY3QuZnJvbUVudHJpZXMobi5lbnRyaWVzKCkpfSkpLElTPUpQKCJbQXBwIFJvdXRpbmddIEVmZmVjdHMgSW5pdCIpO2NsYXNzIEhTe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIpe3RoaXMuYWN0aW9ucyQ9dCx0aGlzLnN0b3JlPWUsdGhpcy5sb2NhdGlvbj1uLHRoaXMuZGlydHlVcGRhdGVzUmVnaXN0cnk9byx0aGlzLnJlZ2lzdHJ5PWksdGhpcy5wcm9ncmFtbWF0aWNhbE5hdk1vZHVsZT1hLHRoaXMuYXBwUm9vdFByb3ZpZGVyPXIsdGhpcy5vbk5hdmlnYXRpb25SZXF1ZXN0ZWQkPXRoaXMuYWN0aW9ucyQucGlwZShEayhsUyksSXQoKHQ9Pntjb25zdCBlPXQucGF0aG5hbWUuc3RhcnRzV2l0aCgiLyIpP3RoaXMuYXBwUm9vdFByb3ZpZGVyLmdldEFic1BhdGhuYW1lV2l0aEFwcFJvb3QodC5wYXRobmFtZSk6dGhpcy5sb2NhdGlvbi5nZXRSZXNvbHZlZFBhdGgodC5wYXRobmFtZSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7cGF0aG5hbWU6ZX0pfSkpKSx0aGlzLmJvb3RzdHJhcFJlZHVjZXJzJD1NaygoKCk9PnRoaXMuYWN0aW9ucyQucGlwZShEayhJUyksSXQoKCgpPT5zUyh7cm91dGVLaW5kczpuZXcgU2V0KHRoaXMucmVnaXN0cnkuZ2V0UmVnaXN0ZXJlZFJvdXRlS2luZHMoKSl9KSkpKSkpLHRoaXMub25Jbml0JD10aGlzLmFjdGlvbnMkLnBpcGUoRGsoSVMpKS5waXBlKENlKDApLEl0KCgoKT0+KHtwYXRobmFtZTp0aGlzLmxvY2F0aW9uLmdldFBhdGgoKSxxdWVyeVBhcmFtczp0aGlzLmxvY2F0aW9uLmdldFNlYXJjaCgpLHJlcGxhY2VTdGF0ZTohMCxicm93c2VySW5pdGlhdGVkOiEwfSkpKSksdGhpcy51c2VySW5pdE5hdlJvdXRlJD1yZSh0aGlzLm9uTmF2aWdhdGlvblJlcXVlc3RlZCQsdGhpcy5vbkluaXQkLHRoaXMubG9jYXRpb24ub25Qb3BTdGF0ZSgpLnBpcGUoSXQoKHQ9Pih7cGF0aG5hbWU6dC5wYXRobmFtZSxyZXBsYWNlU3RhdGU6dC5yZXBsYWNlU3RhdGUsYnJvd3NlckluaXRpYXRlZDohMH0pKSkpKS5waXBlKEl0KCh0PT57aWYoIXQucGF0aG5hbWUuc3RhcnRzV2l0aCgiLyIpKXRocm93IG5ldyBFcnJvcihgW0FwcCByb3V0aW5nXSBwYXRobmFtZSBtdXN0IHN0YXJ0IHdpdGggJy8nLiBHb3Q6ICR7dC5wYXRobmFtZX1gKTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtwYXRobmFtZTp0aGlzLmFwcFJvb3RQcm92aWRlci5nZXRBcHBSb290bGVzc1BhdGhuYW1lKHQucGF0aG5hbWUpfSl9KSksSXQoKHQ9Pih7cm91dGVNYXRjaDp0aGlzLnJvdXRlQ29uZmlncz90aGlzLnJvdXRlQ29uZmlncy5tYXRjaCh0KTpudWxsLG9wdGlvbnM6e3JlcGxhY2VTdGF0ZTp0LnJlcGxhY2VTdGF0ZSxicm93c2VySW5pdGlhdGVkOnQuYnJvd3NlckluaXRpYXRlZH19KSkpKSx0aGlzLnByb2dyYW1tdGljYWxOYXZSb3V0ZSQ9dGhpcy5hY3Rpb25zJC5waXBlKEl0KCh0PT50aGlzLnByb2dyYW1tYXRpY2FsTmF2TW9kdWxlLmdldE5hdmlnYXRpb24odCkpKSxjZSgodD0+bnVsbCE9PXQpKSxJdCgodD0+e2NvbnN0IGU9dCxuPWUucm91dGVLaW5kO2xldCBvO3N3aXRjaChlLnJvdXRlS2luZCl7Y2FzZSBaay5DT01QQVJFX0VYUEVSSU1FTlQ6bz17ZXhwZXJpbWVudElkczooaT1lLnJvdXRlUGFyYW1zLmFsaWFzQW5kRXhwZXJpbWVudElkcyxpLm1hcCgoKHthbGlhczp0LGlkOmV9KT0+YCR7dH06JHtlfWApKS5qb2luKCIsIikpfTticmVhaztkZWZhdWx0Om89ZS5yb3V0ZVBhcmFtc312YXIgaTtyZXR1cm57cm91dGVLaW5kOm4scm91dGVQYXJhbXM6b319KSksSXQoKCh7cm91dGVLaW5kOnQscm91dGVQYXJhbXM6ZX0pPT4oe3JvdXRlTWF0Y2g6dGhpcy5yb3V0ZUNvbmZpZ3M/dGhpcy5yb3V0ZUNvbmZpZ3MubWF0Y2hCeVJvdXRlS2luZCh0LGUpOm51bGwsb3B0aW9uczp7cmVwbGFjZVN0YXRlOiExLGJyb3dzZXJJbml0aWF0ZWQ6ITF9fSkpKSksdGhpcy52YWxpZGF0ZWRSb3V0ZSQ9cmUodGhpcy51c2VySW5pdE5hdlJvdXRlJCx0aGlzLnByb2dyYW1tdGljYWxOYXZSb3V0ZSQpLnBpcGUoY2UoKCh7cm91dGVNYXRjaDp0fSk9PkJvb2xlYW4odCkpKSxJdCgodD0+KHtyb3V0ZU1hdGNoOnQucm91dGVNYXRjaCxvcHRpb25zOnQub3B0aW9uc30pKSkpLHRoaXMubmF2aWdhdGUkPU1rKCgoKT0+dGhpcy52YWxpZGF0ZWRSb3V0ZSQucGlwZShWZSh0aGlzLnN0b3JlLnNlbGVjdChTUykpLFp0KCgoW3QsZV0pPT57Y29uc3Qgbj1udWxsIT09ZSYmUWsodC5yb3V0ZU1hdGNoLnJvdXRlS2luZCx0LnJvdXRlTWF0Y2gucGFyYW1zKT09PVFrKGUucm91dGVLaW5kLGUucGFyYW1zKSxvPXRoaXMuZGlydHlVcGRhdGVzUmVnaXN0cnkuZ2V0RGlydHlVcGRhdGVzU2VsZWN0b3JzKCk7cmV0dXJuIG58fCFvLmxlbmd0aD9FdCh0KTokdCh0aGlzLmRpcnR5VXBkYXRlc1JlZ2lzdHJ5LmdldERpcnR5VXBkYXRlc1NlbGVjdG9ycygpLm1hcCgodD0+dGhpcy5zdG9yZS5zZWxlY3QodCkucGlwZShiZSgxKSkpKSkucGlwZShJdCgodD0+dm9pZCAwIT09dFswXS5leHBlcmltZW50SWRzJiZ0WzBdLmV4cGVyaW1lbnRJZHMubGVuZ3RoPjApKSxjZSgodD0+e2lmKHQpe2NvbnN0IHQ9d2luZG93LmNvbmZpcm0oIllvdSBoYXZlIHVuc2F2ZWQgZWRpdHMsIGFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkaXNjYXJkIHRoZW0/Iik7cmV0dXJuIHQmJnRoaXMuc3RvcmUuZGlzcGF0Y2goYVMoKSksdH1yZXR1cm4hMH0pKSxJdCgoKCk9PnQpKSl9KSksRmUoKCh7cm91dGVNYXRjaDp0LG9wdGlvbnM6ZX0pPT57aWYoZS5icm93c2VySW5pdGlhdGVkJiZ0LmRlZXBMaW5rUHJvdmlkZXIpe2NvbnN0IGU9dC5vcmlnaW5hdGVGcm9tUmVkaXJlY3Rpb24mJnQucmVkaXJlY3Rpb25Pbmx5UXVlcnlQYXJhbXM/dC5yZWRpcmVjdGlvbk9ubHlRdWVyeVBhcmFtczp0aGlzLmxvY2F0aW9uLmdldFNlYXJjaCgpLG49dC5kZWVwTGlua1Byb3ZpZGVyLmRlc2VyaWFsaXplUXVlcnlQYXJhbXMoZSk7dGhpcy5zdG9yZS5kaXNwYXRjaChyUyh7cm91dGVLaW5kOnQucm91dGVLaW5kLHBhcnRpYWxTdGF0ZTpufSkpfX0pKSx6ZSgoKHtyb3V0ZU1hdGNoOnQsb3B0aW9uczplfSk9Pnt2YXIgbjtjb25zdCBvPXtyZXBsYWNlU3RhdGU6bnVsbCE9PShuPWUucmVwbGFjZVN0YXRlKSYmdm9pZCAwIT09biYmbn0saT1FdCh7cm91dGVLaW5kOnQucm91dGVLaW5kLHBhcmFtczp0LnBhcmFtcyxwYXRobmFtZTp0LnBhdGhuYW1lLHF1ZXJ5UGFyYW1zOltdLG5hdmlnYXRpb25PcHRpb25zOm99KTtyZXR1cm4gbnVsbD09PXQuZGVlcExpbmtQcm92aWRlcj9pOnQuZGVlcExpbmtQcm92aWRlci5zZXJpYWxpemVTdGF0ZVRvUXVlcnlQYXJhbXModGhpcy5zdG9yZSkucGlwZShJdCgoKGUsbik9Pih7cm91dGVLaW5kOnQucm91dGVLaW5kLHBhcmFtczp0LnBhcmFtcyxwYXRobmFtZTp0LnBhdGhuYW1lLHF1ZXJ5UGFyYW1zOmUsbmF2aWdhdGlvbk9wdGlvbnM6MD09PW4/bzpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbykse3JlcGxhY2VTdGF0ZTohMH0pfSkpKSl9KSksRmUoKHQ9Pnt0aGlzLnN0b3JlLmRpc3BhdGNoKGNTKHthZnRlcjp0fSkpfSkpLGdlKDApKS5waXBlKFZlKHRoaXMuc3RvcmUuc2VsZWN0KFNTKSksSXQoKChbdCxlXSk9Pih7cHJlc2VydmVIYXNoOm51bGw9PT1lfHxudWxsPT09dHx8UWsoZS5yb3V0ZUtpbmQsZS5wYXJhbXMpPT09UWsodC5yb3V0ZUtpbmQsdC5wYXJhbXMpLHJvdXRlOnR9KSkpLEZlKCgoe3ByZXNlcnZlSGFzaDp0LHJvdXRlOmV9KT0+eyEoZnVuY3Rpb24gbih0LGUpe3JldHVybiB0LnBhdGhuYW1lPT09ZS5wYXRobmFtZSYmdC5xdWVyeVBhcmFtcy5sZW5ndGg9PT1lLnF1ZXJ5UGFyYW1zLmxlbmd0aCYmdC5xdWVyeVBhcmFtcy5ldmVyeSgoKHQsbik9Pntjb25zdCBvPWUucXVlcnlQYXJhbXNbbl07cmV0dXJuIHQua2V5PT09by5rZXkmJnQudmFsdWU9PT1vLnZhbHVlfSkpfSkoZSx7cGF0aG5hbWU6dGhpcy5hcHBSb290UHJvdmlkZXIuZ2V0QXBwUm9vdGxlc3NQYXRobmFtZSh0aGlzLmxvY2F0aW9uLmdldFBhdGgoKSkscXVlcnlQYXJhbXM6dGhpcy5sb2NhdGlvbi5nZXRTZWFyY2goKX0pJiYoZS5uYXZpZ2F0aW9uT3B0aW9ucy5yZXBsYWNlU3RhdGU/dGhpcy5sb2NhdGlvbi5yZXBsYWNlU3RhdGUodGhpcy5hcHBSb290UHJvdmlkZXIuZ2V0QWJzUGF0aG5hbWVXaXRoQXBwUm9vdCh0aGlzLmxvY2F0aW9uLmdldEZ1bGxQYXRoRnJvbVJvdXRlT3JOYXYoZSx0KSkpOnRoaXMubG9jYXRpb24ucHVzaFN0YXRlKHRoaXMuYXBwUm9vdFByb3ZpZGVyLmdldEFic1BhdGhuYW1lV2l0aEFwcFJvb3QodGhpcy5sb2NhdGlvbi5nZXRGdWxsUGF0aEZyb21Sb3V0ZU9yTmF2KGUsdCkpKSl9KSkpLnBpcGUoVmUodGhpcy5zdG9yZS5zZWxlY3QoU1MpKSxJdCgoKFt7cm91dGU6dH0sZV0pPT5kUyh7YmVmb3JlOmUsYWZ0ZXI6dH0pKSkpKSksdGhpcy5yb3V0ZUNvbmZpZ3M9aS5nZXRSb3V0ZUNvbmZpZ3MoKX1uZ3J4T25Jbml0RWZmZWN0cygpe3JldHVybiBJUygpfX1IUy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SFMpKHZyKFNrKSx2cihJdyksdnIodFMpLHZyKG1TKSx2cihQUyksdnIoZlMpLHZyKGVTKSl9LEhTLsm1cHJvdj1Nbih7dG9rZW46SFMsZmFjdG9yeTpIUy7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoSFMsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlNrfSx7dHlwZTpJd30se3R5cGU6dFN9LHt0eXBlOm1TfSx7dHlwZTpQU30se3R5cGU6ZlN9LHt0eXBlOmVTfV19KSxudWxsKTtjb25zdCBGUz15ayh7YWN0aXZlUm91dGU6bnVsbCxuZXh0Um91dGU6bnVsbCxyZWdpc3RlcmVkUm91dGVLZXlzOm5ldyBTZXR9LGJrKGNTLCgodCx7YWZ0ZXI6ZX0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse25leHRSb3V0ZTplfSkpKSxiayhkUywoKHQse2FmdGVyOmV9KT0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHthY3RpdmVSb3V0ZTplLG5leHRSb3V0ZTpudWxsfSkpKSxiayhzUywoKHQse3JvdXRlS2luZHM6ZX0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3JlZ2lzdGVyZWRSb3V0ZUtleXM6ZX0pKSkpO2Z1bmN0aW9uIExTKHQsZSl7cmV0dXJuIEZTKHQsZSl9Y2xhc3MgQlN7fUJTLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxCUyl9LEJTLsm1bW9kPWFvKHt0eXBlOkJTfSksQlMuybVpbmo9dm4oe3Byb3ZpZGVyczpbbVMsZlNdLGltcG9ydHM6W1tQUyxkay5mb3JGZWF0dXJlKHdTLExTKSxXay5mb3JGZWF0dXJlKFtIU10pLGlTLG9TXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEJTLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbUFMsZGsuZm9yRmVhdHVyZSh3UyxMUyksV2suZm9yRmVhdHVyZShbSFNdKSxpUyxvU10scHJvdmlkZXJzOlttUyxmU119XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhCUyx7aW1wb3J0czpbUFMsY2ssR2ssaVMsb1NdfSk7Y2xhc3MgVlN7fWNvbnN0IGpTPSJfX3RhYl9fIjtjbGFzcyBVU3tjb25zdHJ1Y3Rvcigpe3RoaXMudGZTdG9yYWdlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRmLXN0b3JhZ2UiKSxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Zi1nbG9iYWxzIikudGZfZ2xvYmFscy5zZXRVc2VIYXNoKCEwKSx0aGlzLnRmU3RvcmFnZS50Zl9zdG9yYWdlLm1pZ3JhdGVMZWdhY3lVUkxTY2hlbWUoKX1nZXRTdHJpbmcodCl7cmV0dXJuIHRoaXMudGZTdG9yYWdlLnRmX3N0b3JhZ2UuZ2V0U3RyaW5nKHQpfXNldFN0cmluZyh0LGUsbil7dGhpcy50ZlN0b3JhZ2UudGZfc3RvcmFnZS5zZXRTdHJpbmcodCxlLG4pfWdldFBsdWdpbklkKCl7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKGpTKX1zZXRQbHVnaW5JZCh0LGUpe3RoaXMuc2V0U3RyaW5nKGpTLHQsZSl9fXZhciBHUztVUy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VVMpfSxVUy7JtXByb3Y9TW4oe3Rva2VuOlVTLGZhY3Rvcnk6VVMuybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFVTLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVybltdfSksbnVsbCksKGZ1bmN0aW9uKHQpe3QuQlJPV1NFUl9ERUZBVUxUPSJicm93c2VyX2RlZmF1bHQiLHQuTElHSFQ9ImxpZ2h0Iix0LkRBUks9ImRhcmsifSkoR1N8fChHUz17fSkpO2NvbnN0IFdTPUpQKCJbUGVyc2lzdGVudCBTZXR0aW5nc10gR2xvYmFsIFNldHRpbmdzIExvYWRlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLFlTPW5ldyBHYSgiW1BlcnNpc3RlbnQgU2V0dGluZ3NdIEdsb2JhbCBTZXR0aW5ncyIpO2NsYXNzIHFTe2NvbnN0cnVjdG9yKHQpe3RoaXMuZ2xvYmFsU2V0dGluZ1NlbGVjdG9ycz1bXSx0JiYodGhpcy5nbG9iYWxTZXR0aW5nU2VsZWN0b3JzPXQubWFwKCh0PT50KCkpKSl9Z2V0R2xvYmFsU2V0dGluZ1NlbGVjdG9ycygpe3ZhciB0O3JldHVybiBudWxsIT09KHQ9dGhpcy5nbG9iYWxTZXR0aW5nU2VsZWN0b3JzKSYmdm9pZCAwIT09dD90OltdfXN0YXRpYyBkZWZpbmVHbG9iYWxTZXR0aW5nKHQpe3JldHVybntuZ01vZHVsZTpxUyxwcm92aWRlcnM6W3twcm92aWRlOllTLG11bHRpOiEwLHVzZVZhbHVlOnR9XX19fXFTLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxxUykodnIoWVMsOCkpfSxxUy7JtW1vZD1hbyh7dHlwZTpxU30pLHFTLsm1aW5qPXZuKHt9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHFTLFt7dHlwZTpBeX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbWVNdfV19XX0pLG51bGwpO2NsYXNzIFpTe3NldEl0ZW0odCxlKXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0LGUpfWdldEl0ZW0odCl7cmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHQpfXJlbW92ZUl0ZW0odCl7bG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odCl9fVpTLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxaUyl9LFpTLsm1cHJvdj1Nbih7dG9rZW46WlMsZmFjdG9yeTpaUy7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWlMsW3t0eXBlOmltfV0sbnVsbCxudWxsKTtjbGFzcyBYU3t9WFMuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFhTKX0sWFMuybVtb2Q9YW8oe3R5cGU6WFN9KSxYUy7JtWluaj12bih7cHJvdmlkZXJzOltaU119KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFhTLFt7dHlwZTpBeSxhcmdzOlt7cHJvdmlkZXJzOltaU119XX1dLG51bGwsbnVsbCk7Y29uc3QgS1M9Il90Yl9nbG9iYWxfc2V0dGluZ3MudGltZXNlcmllcyIsSlM9Il90Yl9nbG9iYWxfc2V0dGluZ3MiLFFTPSJub3RpZmljYXRpb25MYXN0UmVhZFRpbWVzdGFtcCI7Y2xhc3MgJFN7fSRTLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHwkUyl9LCRTLsm1cHJvdj1Nbih7dG9rZW46JFMsZmFjdG9yeTokUy7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoJFMsW3t0eXBlOmltfV0sbnVsbCxudWxsKTtjbGFzcyB0RHt9dEQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHREKX0sdEQuybVwcm92PU1uKHt0b2tlbjp0RCxmYWN0b3J5OnRELsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh0RCxbe3R5cGU6aW19XSxudWxsLG51bGwpO2NsYXNzIGVEIGV4dGVuZHMgdER7dWlUb0JhY2tlbmQodCl7cmV0dXJue2lnbm9yZU91dGxpZXJzOnQuaWdub3JlT3V0bGllcnMsc2NhbGFyU21vb3RoaW5nOnQuc2NhbGFyU21vb3RoaW5nLHRvb2x0aXBTb3J0OnQudG9vbHRpcFNvcnRTdHJpbmcsYXV0b1JlbG9hZDp0LmF1dG9SZWxvYWQsYXV0b1JlbG9hZFBlcmlvZEluTXM6dC5hdXRvUmVsb2FkUGVyaW9kSW5NcyxwYWdpbmF0aW9uU2l6ZTp0LnBhZ2VTaXplLHRoZW1lOnQudGhlbWVPdmVycmlkZSxub3RpZmljYXRpb25MYXN0UmVhZFRpbWVJbk1zOnQubm90aWZpY2F0aW9uTGFzdFJlYWRUaW1lSW5NcyxzaWRlQmFyV2lkdGhJblBlcmNlbnQ6dC5zaWRlQmFyV2lkdGhJblBlcmNlbnQsdGltZVNlcmllc1Byb21vdGlvbkRpc21pc3NlZDp0LnRpbWVTZXJpZXNQcm9tb3Rpb25EaXNtaXNzZWQsdGltZVNlcmllc1NldHRpbmdzUGFuZU9wZW5lZDp0LnRpbWVTZXJpZXNTZXR0aW5nc1BhbmVPcGVuZWR9fWJhY2tlbmRUb1VpKHQpe2NvbnN0IGU9e307cmV0dXJuIHQuaGFzT3duUHJvcGVydHkoInNjYWxhclNtb290aGluZyIpJiYibnVtYmVyIj09dHlwZW9mIHQuc2NhbGFyU21vb3RoaW5nJiYoZS5zY2FsYXJTbW9vdGhpbmc9dC5zY2FsYXJTbW9vdGhpbmcpLHQuaGFzT3duUHJvcGVydHkoImlnbm9yZU91dGxpZXJzIikmJiJib29sZWFuIj09dHlwZW9mIHQuaWdub3JlT3V0bGllcnMmJihlLmlnbm9yZU91dGxpZXJzPXQuaWdub3JlT3V0bGllcnMpLHQuaGFzT3duUHJvcGVydHkoInRvb2x0aXBTb3J0IikmJiJzdHJpbmciPT10eXBlb2YgdC50b29sdGlwU29ydCYmKGUudG9vbHRpcFNvcnRTdHJpbmc9dC50b29sdGlwU29ydCksdC5oYXNPd25Qcm9wZXJ0eSgiYXV0b1JlbG9hZCIpJiYiYm9vbGVhbiI9PXR5cGVvZiB0LmF1dG9SZWxvYWQmJihlLmF1dG9SZWxvYWQ9dC5hdXRvUmVsb2FkKSx0Lmhhc093blByb3BlcnR5KCJhdXRvUmVsb2FkUGVyaW9kSW5NcyIpJiYibnVtYmVyIj09dHlwZW9mIHQuYXV0b1JlbG9hZFBlcmlvZEluTXMmJihlLmF1dG9SZWxvYWRQZXJpb2RJbk1zPXQuYXV0b1JlbG9hZFBlcmlvZEluTXMpLHQuaGFzT3duUHJvcGVydHkoInBhZ2luYXRpb25TaXplIikmJiJudW1iZXIiPT10eXBlb2YgdC5wYWdpbmF0aW9uU2l6ZSYmKGUucGFnZVNpemU9dC5wYWdpbmF0aW9uU2l6ZSksdC5oYXNPd25Qcm9wZXJ0eSgidGhlbWUiKSYmInN0cmluZyI9PXR5cGVvZiB0LnRoZW1lJiZuZXcgU2V0KE9iamVjdC52YWx1ZXMoR1MpKS5oYXModC50aGVtZSkmJihlLnRoZW1lT3ZlcnJpZGU9dC50aGVtZSksdC5oYXNPd25Qcm9wZXJ0eSgibm90aWZpY2F0aW9uTGFzdFJlYWRUaW1lSW5NcyIpJiYibnVtYmVyIj09dHlwZW9mIHQubm90aWZpY2F0aW9uTGFzdFJlYWRUaW1lSW5NcyYmKGUubm90aWZpY2F0aW9uTGFzdFJlYWRUaW1lSW5Ncz10Lm5vdGlmaWNhdGlvbkxhc3RSZWFkVGltZUluTXMpLHQuaGFzT3duUHJvcGVydHkoInNpZGVCYXJXaWR0aEluUGVyY2VudCIpJiYibnVtYmVyIj09dHlwZW9mIHQuc2lkZUJhcldpZHRoSW5QZXJjZW50JiYoZS5zaWRlQmFyV2lkdGhJblBlcmNlbnQ9dC5zaWRlQmFyV2lkdGhJblBlcmNlbnQpLHQuaGFzT3duUHJvcGVydHkoInRpbWVTZXJpZXNQcm9tb3Rpb25EaXNtaXNzZWQiKSYmImJvb2xlYW4iPT10eXBlb2YgdC50aW1lU2VyaWVzUHJvbW90aW9uRGlzbWlzc2VkJiYoZS50aW1lU2VyaWVzUHJvbW90aW9uRGlzbWlzc2VkPXQudGltZVNlcmllc1Byb21vdGlvbkRpc21pc3NlZCksdC5oYXNPd25Qcm9wZXJ0eSgidGltZVNlcmllc1NldHRpbmdzUGFuZU9wZW5lZCIpJiYiYm9vbGVhbiI9PXR5cGVvZiB0LnRpbWVTZXJpZXNTZXR0aW5nc1BhbmVPcGVuZWQmJihlLnRpbWVTZXJpZXNTZXR0aW5nc1BhbmVPcGVuZWQ9dC50aW1lU2VyaWVzU2V0dGluZ3NQYW5lT3BlbmVkKSxlfX1lRC7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoZUQpKSkobnx8ZUQpfX0pKCksZUQuybVwcm92PU1uKHt0b2tlbjplRCxmYWN0b3J5OmVELsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChlRCxbe3R5cGU6aW19XSxudWxsLG51bGwpO2NsYXNzIG5Ee2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5sb2NhbFN0b3JhZ2U9dCx0aGlzLmNvbnZlcnRlcj1lfXNldFNldHRpbmdzKHQpe3JldHVybiBPYmplY3Qua2V5cyh0KT90aGlzLmdldFNldHRpbmdzKCkucGlwZShGZSgoZT0+e3RoaXMubG9jYWxTdG9yYWdlLnNldEl0ZW0oSlMsSlNPTi5zdHJpbmdpZnkodGhpcy5jb252ZXJ0ZXIudWlUb0JhY2tlbmQoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHQpKSkpLHRoaXMubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oS1MpLHRoaXMubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oUVMpfSkpLEl0KCgoKT0+e30pKSk6cnR9ZGVzZXJpYWxpemUodCl7dHJ5e3JldHVybiBKU09OLnBhcnNlKHQpfWNhdGNoKHQpe3JldHVybnt9fX1nZXRTZXR0aW5ncygpe3ZhciB0LGU7Y29uc3Qgbj10aGlzLmxvY2FsU3RvcmFnZS5nZXRJdGVtKFFTKSxvPXRoaXMuY29udmVydGVyLmJhY2tlbmRUb1VpKHRoaXMuZGVzZXJpYWxpemUobj9KU09OLnN0cmluZ2lmeSh7bm90aWZpY2F0aW9uTGFzdFJlYWRUaW1lSW5NczpOdW1iZXIobil9KToie30iKSksaT10aGlzLmNvbnZlcnRlci5iYWNrZW5kVG9VaSh0aGlzLmRlc2VyaWFsaXplKG51bGwhPT0odD10aGlzLmxvY2FsU3RvcmFnZS5nZXRJdGVtKEtTKSkmJnZvaWQgMCE9PXQ/dDoie30iKSksYT10aGlzLmNvbnZlcnRlci5iYWNrZW5kVG9VaSh0aGlzLmRlc2VyaWFsaXplKG51bGwhPT0oZT10aGlzLmxvY2FsU3RvcmFnZS5nZXRJdGVtKEpTKSkmJnZvaWQgMCE9PWU/ZToie30iKSk7cmV0dXJuIEV0KE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG8pLGkpLGEpKX19bkQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fG5EKSh2cihaUyksdnIodEQpKX0sbkQuybVwcm92PU1uKHt0b2tlbjpuRCxmYWN0b3J5Om5ELsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChuRCxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6WlN9LHt0eXBlOnREfV19KSxudWxsKTtjbGFzcyBvRHt9b0QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fG9EKX0sb0QuybVtb2Q9YW8oe3R5cGU6b0R9KSxvRC7JtWluaj12bih7cHJvdmlkZXJzOlt7cHJvdmlkZTokUyx1c2VDbGFzczpuRH0se3Byb3ZpZGU6dEQsdXNlQ2xhc3M6ZUR9XSxpbXBvcnRzOltbWFNdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgob0QsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltYU10scHJvdmlkZXJzOlt7cHJvdmlkZTokUyx1c2VDbGFzczpuRH0se3Byb3ZpZGU6dEQsdXNlQ2xhc3M6ZUR9XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKG9ELHtpbXBvcnRzOltYU119KTtjb25zdCBpRD1KUCgiW1BlcnNpc3RlbnQgU2V0dGluZ3NdIEVmZmVjdHMgSW5pdCIpO2NsYXNzIGFEe2NvbnN0cnVjdG9yKHQsZSxuLG8pe3RoaXMuYWN0aW9ucyQ9dCx0aGlzLnN0b3JlPWUsdGhpcy5jb25maWdNb2R1bGU9bix0aGlzLmRhdGFTb3VyY2U9byx0aGlzLmluaXRpYWxpemVBbmRVcGRhdGVTZXR0aW5ncyQ9TWsoKCgpPT57Y29uc3QgdD10aGlzLmFjdGlvbnMkLnBpcGUoRGsoaUQpLFp0KCgoKT0+dGhpcy5kYXRhU291cmNlLmdldFNldHRpbmdzKCkpKSxGZSgodD0+e3RoaXMuc3RvcmUuZGlzcGF0Y2goV1Moe3BhcnRpYWxTZXR0aW5nczp0fSkpfSkpLENlKDApLFp0KCgoKT0+cmUoLi4udGhpcy5jb25maWdNb2R1bGUuZ2V0R2xvYmFsU2V0dGluZ1NlbGVjdG9ycygpLm1hcCgodD0+dGhpcy5zdG9yZS5zZWxlY3QodCkucGlwZShNZSgoKHQsZSk9Pntjb25zdCBuPU9iamVjdC52YWx1ZXModCksbz1PYmplY3QudmFsdWVzKGUpO3JldHVybiBuLmxlbmd0aD09PW8ubGVuZ3RoJiZuLmV2ZXJ5KCgodCxlKT0+dD09PW9bZV0pKX0pKSxUZSgxKSkpKSkpKSxFZSgpKTtyZXR1cm4gdC5waXBlKChmdW5jdGlvbiBlKHQpe3JldHVybiBSKChmdW5jdGlvbihlLG4pe3ZhciBvPVtdO3JldHVybiBlLnN1YnNjcmliZShuZXcgVChuLChmdW5jdGlvbih0KXtyZXR1cm4gby5wdXNoKHQpfSksKGZ1bmN0aW9uKCl7bi5uZXh0KG8pLG4uY29tcGxldGUoKX0pKSksdC5zdWJzY3JpYmUobmV3IFQobiwoZnVuY3Rpb24oKXt2YXIgdD1vO289W10sbi5uZXh0KHQpfSkseSkpLGZ1bmN0aW9uKCl7bz1udWxsfX0pKX0pKHQucGlwZShnZSg1MDApKSksWnQoKHQ9Pntjb25zdCBlPXt9O2Zvcihjb25zdCBuIG9mIHQpT2JqZWN0LmFzc2lnbihlLG4pO3JldHVybiB0aGlzLmRhdGFTb3VyY2Uuc2V0U2V0dGluZ3MoZSl9KSkpfSkse2Rpc3BhdGNoOiExfSl9bmdyeE9uSW5pdEVmZmVjdHMoKXtyZXR1cm4gaUQoKX19YUQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGFEKSh2cihTayksdnIoSXcpLHZyKHFTKSx2cigkUykpfSxhRC7JtXByb3Y9TW4oe3Rva2VuOmFELGZhY3Rvcnk6YUQuybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGFELFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpTa30se3R5cGU6SXd9LHt0eXBlOnFTfSx7dHlwZTokU31dfSksbnVsbCk7Y2xhc3MgckR7fXJELsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxyRCl9LHJELsm1bW9kPWFvKHt0eXBlOnJEfSksckQuybVpbmo9dm4oe3Byb3ZpZGVyczpbcVNdLGltcG9ydHM6W1tXay5mb3JGZWF0dXJlKFthRF0pLG9EXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHJELFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbV2suZm9yRmVhdHVyZShbYURdKSxvRF0scHJvdmlkZXJzOltxU119XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhyRCx7aW1wb3J0czpbR2ssb0RdfSk7Ci8qKgogICAgICogQGxpY2Vuc2UgQW5ndWxhciB2MTIuMi4xCiAgICAgKiAoYykgMjAxMC0yMDIxIEdvb2dsZSBMTEMuIGh0dHBzOi8vYW5ndWxhci5pby8KICAgICAqIExpY2Vuc2U6IE1JVAogICAgICovCmNsYXNzIHNEe31jbGFzcyBsRHt9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIGNEe2NvbnN0cnVjdG9yKHQpe3RoaXMubm9ybWFsaXplZE5hbWVzPW5ldyBNYXAsdGhpcy5sYXp5VXBkYXRlPW51bGwsdD90aGlzLmxhenlJbml0PSJzdHJpbmciPT10eXBlb2YgdD8oKT0+e3RoaXMuaGVhZGVycz1uZXcgTWFwLHQuc3BsaXQoIlxuIikuZm9yRWFjaCgodD0+e2NvbnN0IGU9dC5pbmRleE9mKCI6Iik7aWYoZT4wKXtjb25zdCBuPXQuc2xpY2UoMCxlKSxvPW4udG9Mb3dlckNhc2UoKSxpPXQuc2xpY2UoZSsxKS50cmltKCk7dGhpcy5tYXliZVNldE5vcm1hbGl6ZWROYW1lKG4sbyksdGhpcy5oZWFkZXJzLmhhcyhvKT90aGlzLmhlYWRlcnMuZ2V0KG8pLnB1c2goaSk6dGhpcy5oZWFkZXJzLnNldChvLFtpXSl9fSkpfTooKT0+e3RoaXMuaGVhZGVycz1uZXcgTWFwLE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGU9PntsZXQgbj10W2VdO2NvbnN0IG89ZS50b0xvd2VyQ2FzZSgpOyJzdHJpbmciPT10eXBlb2YgbiYmKG49W25dKSxuLmxlbmd0aD4wJiYodGhpcy5oZWFkZXJzLnNldChvLG4pLHRoaXMubWF5YmVTZXROb3JtYWxpemVkTmFtZShlLG8pKX0pKX06dGhpcy5oZWFkZXJzPW5ldyBNYXB9aGFzKHQpe3JldHVybiB0aGlzLmluaXQoKSx0aGlzLmhlYWRlcnMuaGFzKHQudG9Mb3dlckNhc2UoKSl9Z2V0KHQpe3RoaXMuaW5pdCgpO2NvbnN0IGU9dGhpcy5oZWFkZXJzLmdldCh0LnRvTG93ZXJDYXNlKCkpO3JldHVybiBlJiZlLmxlbmd0aD4wP2VbMF06bnVsbH1rZXlzKCl7cmV0dXJuIHRoaXMuaW5pdCgpLEFycmF5LmZyb20odGhpcy5ub3JtYWxpemVkTmFtZXMudmFsdWVzKCkpfWdldEFsbCh0KXtyZXR1cm4gdGhpcy5pbml0KCksdGhpcy5oZWFkZXJzLmdldCh0LnRvTG93ZXJDYXNlKCkpfHxudWxsfWFwcGVuZCh0LGUpe3JldHVybiB0aGlzLmNsb25lKHtuYW1lOnQsdmFsdWU6ZSxvcDoiYSJ9KX1zZXQodCxlKXtyZXR1cm4gdGhpcy5jbG9uZSh7bmFtZTp0LHZhbHVlOmUsb3A6InMifSl9ZGVsZXRlKHQsZSl7cmV0dXJuIHRoaXMuY2xvbmUoe25hbWU6dCx2YWx1ZTplLG9wOiJkIn0pfW1heWJlU2V0Tm9ybWFsaXplZE5hbWUodCxlKXt0aGlzLm5vcm1hbGl6ZWROYW1lcy5oYXMoZSl8fHRoaXMubm9ybWFsaXplZE5hbWVzLnNldChlLHQpfWluaXQoKXt0aGlzLmxhenlJbml0JiYodGhpcy5sYXp5SW5pdCBpbnN0YW5jZW9mIGNEP3RoaXMuY29weUZyb20odGhpcy5sYXp5SW5pdCk6dGhpcy5sYXp5SW5pdCgpLHRoaXMubGF6eUluaXQ9bnVsbCx0aGlzLmxhenlVcGRhdGUmJih0aGlzLmxhenlVcGRhdGUuZm9yRWFjaCgodD0+dGhpcy5hcHBseVVwZGF0ZSh0KSkpLHRoaXMubGF6eVVwZGF0ZT1udWxsKSl9Y29weUZyb20odCl7dC5pbml0KCksQXJyYXkuZnJvbSh0LmhlYWRlcnMua2V5cygpKS5mb3JFYWNoKChlPT57dGhpcy5oZWFkZXJzLnNldChlLHQuaGVhZGVycy5nZXQoZSkpLHRoaXMubm9ybWFsaXplZE5hbWVzLnNldChlLHQubm9ybWFsaXplZE5hbWVzLmdldChlKSl9KSl9Y2xvbmUodCl7Y29uc3QgZT1uZXcgY0Q7cmV0dXJuIGUubGF6eUluaXQ9dGhpcy5sYXp5SW5pdCYmdGhpcy5sYXp5SW5pdCBpbnN0YW5jZW9mIGNEP3RoaXMubGF6eUluaXQ6dGhpcyxlLmxhenlVcGRhdGU9KHRoaXMubGF6eVVwZGF0ZXx8W10pLmNvbmNhdChbdF0pLGV9YXBwbHlVcGRhdGUodCl7Y29uc3QgZT10Lm5hbWUudG9Mb3dlckNhc2UoKTtzd2l0Y2godC5vcCl7Y2FzZSJhIjpjYXNlInMiOmxldCBuPXQudmFsdWU7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYobj1bbl0pLDA9PT1uLmxlbmd0aClyZXR1cm47dGhpcy5tYXliZVNldE5vcm1hbGl6ZWROYW1lKHQubmFtZSxlKTtjb25zdCBvPSgiYSI9PT10Lm9wP3RoaXMuaGVhZGVycy5nZXQoZSk6dm9pZCAwKXx8W107by5wdXNoKC4uLm4pLHRoaXMuaGVhZGVycy5zZXQoZSxvKTticmVhaztjYXNlImQiOmNvbnN0IGk9dC52YWx1ZTtpZihpKXtsZXQgdD10aGlzLmhlYWRlcnMuZ2V0KGUpO2lmKCF0KXJldHVybjt0PXQuZmlsdGVyKCh0PT4tMT09PWkuaW5kZXhPZih0KSkpLDA9PT10Lmxlbmd0aD8odGhpcy5oZWFkZXJzLmRlbGV0ZShlKSx0aGlzLm5vcm1hbGl6ZWROYW1lcy5kZWxldGUoZSkpOnRoaXMuaGVhZGVycy5zZXQoZSx0KX1lbHNlIHRoaXMuaGVhZGVycy5kZWxldGUoZSksdGhpcy5ub3JtYWxpemVkTmFtZXMuZGVsZXRlKGUpfX1mb3JFYWNoKHQpe3RoaXMuaW5pdCgpLEFycmF5LmZyb20odGhpcy5ub3JtYWxpemVkTmFtZXMua2V5cygpKS5mb3JFYWNoKChlPT50KHRoaXMubm9ybWFsaXplZE5hbWVzLmdldChlKSx0aGlzLmhlYWRlcnMuZ2V0KGUpKSkpfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgZER7ZW5jb2RlS2V5KHQpe3JldHVybiBwRCh0KX1lbmNvZGVWYWx1ZSh0KXtyZXR1cm4gcEQodCl9ZGVjb2RlS2V5KHQpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQodCl9ZGVjb2RlVmFsdWUodCl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0KX19ZnVuY3Rpb24gcEQodCl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh0KS5yZXBsYWNlKC8lNDAvZ2ksIkAiKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZ2ksIiQiKS5yZXBsYWNlKC8lMkMvZ2ksIiwiKS5yZXBsYWNlKC8lM0IvZ2ksIjsiKS5yZXBsYWNlKC8lMkIvZ2ksIisiKS5yZXBsYWNlKC8lM0QvZ2ksIj0iKS5yZXBsYWNlKC8lM0YvZ2ksIj8iKS5yZXBsYWNlKC8lMkYvZ2ksIi8iKX1mdW5jdGlvbiBtRCh0KXtyZXR1cm5gJHt0fWB9Y2xhc3MgdUR7Y29uc3RydWN0b3IodD17fSl7aWYodGhpcy51cGRhdGVzPW51bGwsdGhpcy5jbG9uZUZyb209bnVsbCx0aGlzLmVuY29kZXI9dC5lbmNvZGVyfHxuZXcgZEQsdC5mcm9tU3RyaW5nKXtpZih0LmZyb21PYmplY3QpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qgc3BlY2lmeSBib3RoIGZyb21TdHJpbmcgYW5kIGZyb21PYmplY3QuIik7dGhpcy5tYXA9KGZ1bmN0aW9uIGUodCxuKXtjb25zdCBvPW5ldyBNYXA7cmV0dXJuIHQubGVuZ3RoPjAmJnQucmVwbGFjZSgvXlw/LywiIikuc3BsaXQoIiYiKS5mb3JFYWNoKCh0PT57Y29uc3QgZT10LmluZGV4T2YoIj0iKSxbaSxhXT0tMT09ZT9bbi5kZWNvZGVLZXkodCksIiJdOltuLmRlY29kZUtleSh0LnNsaWNlKDAsZSkpLG4uZGVjb2RlVmFsdWUodC5zbGljZShlKzEpKV0scj1vLmdldChpKXx8W107ci5wdXNoKGEpLG8uc2V0KGkscil9KSksb30pKHQuZnJvbVN0cmluZyx0aGlzLmVuY29kZXIpfWVsc2UgdC5mcm9tT2JqZWN0Pyh0aGlzLm1hcD1uZXcgTWFwLE9iamVjdC5rZXlzKHQuZnJvbU9iamVjdCkuZm9yRWFjaCgoZT0+e2NvbnN0IG49dC5mcm9tT2JqZWN0W2VdO3RoaXMubWFwLnNldChlLEFycmF5LmlzQXJyYXkobik/bjpbbl0pfSkpKTp0aGlzLm1hcD1udWxsfWhhcyh0KXtyZXR1cm4gdGhpcy5pbml0KCksdGhpcy5tYXAuaGFzKHQpfWdldCh0KXt0aGlzLmluaXQoKTtjb25zdCBlPXRoaXMubWFwLmdldCh0KTtyZXR1cm4gZT9lWzBdOm51bGx9Z2V0QWxsKHQpe3JldHVybiB0aGlzLmluaXQoKSx0aGlzLm1hcC5nZXQodCl8fG51bGx9a2V5cygpe3JldHVybiB0aGlzLmluaXQoKSxBcnJheS5mcm9tKHRoaXMubWFwLmtleXMoKSl9YXBwZW5kKHQsZSl7cmV0dXJuIHRoaXMuY2xvbmUoe3BhcmFtOnQsdmFsdWU6ZSxvcDoiYSJ9KX1hcHBlbmRBbGwodCl7Y29uc3QgZT1bXTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaCgobj0+e2NvbnN0IG89dFtuXTtBcnJheS5pc0FycmF5KG8pP28uZm9yRWFjaCgodD0+e2UucHVzaCh7cGFyYW06bix2YWx1ZTp0LG9wOiJhIn0pfSkpOmUucHVzaCh7cGFyYW06bix2YWx1ZTpvLG9wOiJhIn0pfSkpLHRoaXMuY2xvbmUoZSl9c2V0KHQsZSl7cmV0dXJuIHRoaXMuY2xvbmUoe3BhcmFtOnQsdmFsdWU6ZSxvcDoicyJ9KX1kZWxldGUodCxlKXtyZXR1cm4gdGhpcy5jbG9uZSh7cGFyYW06dCx2YWx1ZTplLG9wOiJkIn0pfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuaW5pdCgpLHRoaXMua2V5cygpLm1hcCgodD0+e2NvbnN0IGU9dGhpcy5lbmNvZGVyLmVuY29kZUtleSh0KTtyZXR1cm4gdGhpcy5tYXAuZ2V0KHQpLm1hcCgodD0+ZSsiPSIrdGhpcy5lbmNvZGVyLmVuY29kZVZhbHVlKHQpKSkuam9pbigiJiIpfSkpLmZpbHRlcigodD0+IiIhPT10KSkuam9pbigiJiIpfWNsb25lKHQpe2NvbnN0IGU9bmV3IHVEKHtlbmNvZGVyOnRoaXMuZW5jb2Rlcn0pO3JldHVybiBlLmNsb25lRnJvbT10aGlzLmNsb25lRnJvbXx8dGhpcyxlLnVwZGF0ZXM9KHRoaXMudXBkYXRlc3x8W10pLmNvbmNhdCh0KSxlfWluaXQoKXtudWxsPT09dGhpcy5tYXAmJih0aGlzLm1hcD1uZXcgTWFwKSxudWxsIT09dGhpcy5jbG9uZUZyb20mJih0aGlzLmNsb25lRnJvbS5pbml0KCksdGhpcy5jbG9uZUZyb20ua2V5cygpLmZvckVhY2goKHQ9PnRoaXMubWFwLnNldCh0LHRoaXMuY2xvbmVGcm9tLm1hcC5nZXQodCkpKSksdGhpcy51cGRhdGVzLmZvckVhY2goKHQ9Pntzd2l0Y2godC5vcCl7Y2FzZSJhIjpjYXNlInMiOmNvbnN0IGU9KCJhIj09PXQub3A/dGhpcy5tYXAuZ2V0KHQucGFyYW0pOnZvaWQgMCl8fFtdO2UucHVzaChtRCh0LnZhbHVlKSksdGhpcy5tYXAuc2V0KHQucGFyYW0sZSk7YnJlYWs7Y2FzZSJkIjppZih2b2lkIDA9PT10LnZhbHVlKXt0aGlzLm1hcC5kZWxldGUodC5wYXJhbSk7YnJlYWt9e2xldCBlPXRoaXMubWFwLmdldCh0LnBhcmFtKXx8W107Y29uc3Qgbj1lLmluZGV4T2YobUQodC52YWx1ZSkpOy0xIT09biYmZS5zcGxpY2UobiwxKSxlLmxlbmd0aD4wP3RoaXMubWFwLnNldCh0LnBhcmFtLGUpOnRoaXMubWFwLmRlbGV0ZSh0LnBhcmFtKX19fSkpLHRoaXMuY2xvbmVGcm9tPXRoaXMudXBkYXRlcz1udWxsKX19Y2xhc3MgZkR7Y29uc3RydWN0b3IoKXt0aGlzLm1hcD1uZXcgTWFwfXNldCh0LGUpe3JldHVybiB0aGlzLm1hcC5zZXQodCxlKSx0aGlzfWdldCh0KXtyZXR1cm4gdGhpcy5tYXAuaGFzKHQpfHx0aGlzLm1hcC5zZXQodCx0LmRlZmF1bHRWYWx1ZSgpKSx0aGlzLm1hcC5nZXQodCl9ZGVsZXRlKHQpe3JldHVybiB0aGlzLm1hcC5kZWxldGUodCksdGhpc31rZXlzKCl7cmV0dXJuIHRoaXMubWFwLmtleXMoKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIGdEKHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcn1mdW5jdGlvbiBoRCh0KXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEJsb2ImJnQgaW5zdGFuY2VvZiBCbG9ifWZ1bmN0aW9uIGJEKHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgRm9ybURhdGEmJnQgaW5zdGFuY2VvZiBGb3JtRGF0YX1jbGFzcyB5RHtjb25zdHJ1Y3Rvcih0LGUsbixvKXtsZXQgaTtpZih0aGlzLnVybD1lLHRoaXMuYm9keT1udWxsLHRoaXMucmVwb3J0UHJvZ3Jlc3M9ITEsdGhpcy53aXRoQ3JlZGVudGlhbHM9ITEsdGhpcy5yZXNwb25zZVR5cGU9Impzb24iLHRoaXMubWV0aG9kPXQudG9VcHBlckNhc2UoKSwoZnVuY3Rpb24gYSh0KXtzd2l0Y2godCl7Y2FzZSJERUxFVEUiOmNhc2UiR0VUIjpjYXNlIkhFQUQiOmNhc2UiT1BUSU9OUyI6Y2FzZSJKU09OUCI6cmV0dXJuITE7ZGVmYXVsdDpyZXR1cm4hMH19KSh0aGlzLm1ldGhvZCl8fG8/KHRoaXMuYm9keT12b2lkIDAhPT1uP246bnVsbCxpPW8pOmk9bixpJiYodGhpcy5yZXBvcnRQcm9ncmVzcz0hIWkucmVwb3J0UHJvZ3Jlc3MsdGhpcy53aXRoQ3JlZGVudGlhbHM9ISFpLndpdGhDcmVkZW50aWFscyxpLnJlc3BvbnNlVHlwZSYmKHRoaXMucmVzcG9uc2VUeXBlPWkucmVzcG9uc2VUeXBlKSxpLmhlYWRlcnMmJih0aGlzLmhlYWRlcnM9aS5oZWFkZXJzKSxpLmNvbnRleHQmJih0aGlzLmNvbnRleHQ9aS5jb250ZXh0KSxpLnBhcmFtcyYmKHRoaXMucGFyYW1zPWkucGFyYW1zKSksdGhpcy5oZWFkZXJzfHwodGhpcy5oZWFkZXJzPW5ldyBjRCksdGhpcy5jb250ZXh0fHwodGhpcy5jb250ZXh0PW5ldyBmRCksdGhpcy5wYXJhbXMpe2NvbnN0IHQ9dGhpcy5wYXJhbXMudG9TdHJpbmcoKTtpZigwPT09dC5sZW5ndGgpdGhpcy51cmxXaXRoUGFyYW1zPWU7ZWxzZXtjb25zdCBuPWUuaW5kZXhPZigiPyIpO3RoaXMudXJsV2l0aFBhcmFtcz1lKygtMT09PW4/Ij8iOm48ZS5sZW5ndGgtMT8iJiI6IiIpK3R9fWVsc2UgdGhpcy5wYXJhbXM9bmV3IHVELHRoaXMudXJsV2l0aFBhcmFtcz1lfXNlcmlhbGl6ZUJvZHkoKXtyZXR1cm4gbnVsbD09PXRoaXMuYm9keT9udWxsOmdEKHRoaXMuYm9keSl8fGhEKHRoaXMuYm9keSl8fGJEKHRoaXMuYm9keSl8fChmdW5jdGlvbiB0KGUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgVVJMU2VhcmNoUGFyYW1zJiZlIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zfSkodGhpcy5ib2R5KXx8InN0cmluZyI9PXR5cGVvZiB0aGlzLmJvZHk/dGhpcy5ib2R5OnRoaXMuYm9keSBpbnN0YW5jZW9mIHVEP3RoaXMuYm9keS50b1N0cmluZygpOiJvYmplY3QiPT10eXBlb2YgdGhpcy5ib2R5fHwiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmJvZHl8fEFycmF5LmlzQXJyYXkodGhpcy5ib2R5KT9KU09OLnN0cmluZ2lmeSh0aGlzLmJvZHkpOnRoaXMuYm9keS50b1N0cmluZygpfWRldGVjdENvbnRlbnRUeXBlSGVhZGVyKCl7cmV0dXJuIG51bGw9PT10aGlzLmJvZHl8fGJEKHRoaXMuYm9keSk/bnVsbDpoRCh0aGlzLmJvZHkpP3RoaXMuYm9keS50eXBlfHxudWxsOmdEKHRoaXMuYm9keSk/bnVsbDoic3RyaW5nIj09dHlwZW9mIHRoaXMuYm9keT8idGV4dC9wbGFpbiI6dGhpcy5ib2R5IGluc3RhbmNlb2YgdUQ/ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04Ijoib2JqZWN0Ij09dHlwZW9mIHRoaXMuYm9keXx8Im51bWJlciI9PXR5cGVvZiB0aGlzLmJvZHl8fCJib29sZWFuIj09dHlwZW9mIHRoaXMuYm9keT8iYXBwbGljYXRpb24vanNvbiI6bnVsbH1jbG9uZSh0PXt9KXt2YXIgZTtjb25zdCBuPXQubWV0aG9kfHx0aGlzLm1ldGhvZCxvPXQudXJsfHx0aGlzLnVybCxpPXQucmVzcG9uc2VUeXBlfHx0aGlzLnJlc3BvbnNlVHlwZSxhPXZvaWQgMCE9PXQuYm9keT90LmJvZHk6dGhpcy5ib2R5LHI9dm9pZCAwIT09dC53aXRoQ3JlZGVudGlhbHM/dC53aXRoQ3JlZGVudGlhbHM6dGhpcy53aXRoQ3JlZGVudGlhbHMscz12b2lkIDAhPT10LnJlcG9ydFByb2dyZXNzP3QucmVwb3J0UHJvZ3Jlc3M6dGhpcy5yZXBvcnRQcm9ncmVzcztsZXQgbD10LmhlYWRlcnN8fHRoaXMuaGVhZGVycyxjPXQucGFyYW1zfHx0aGlzLnBhcmFtcztjb25zdCBkPW51bGwhPT0oZT10LmNvbnRleHQpJiZ2b2lkIDAhPT1lP2U6dGhpcy5jb250ZXh0O3JldHVybiB2b2lkIDAhPT10LnNldEhlYWRlcnMmJihsPU9iamVjdC5rZXlzKHQuc2V0SGVhZGVycykucmVkdWNlKCgoZSxuKT0+ZS5zZXQobix0LnNldEhlYWRlcnNbbl0pKSxsKSksdC5zZXRQYXJhbXMmJihjPU9iamVjdC5rZXlzKHQuc2V0UGFyYW1zKS5yZWR1Y2UoKChlLG4pPT5lLnNldChuLHQuc2V0UGFyYW1zW25dKSksYykpLG5ldyB5RChuLG8sYSx7cGFyYW1zOmMsaGVhZGVyczpsLGNvbnRleHQ6ZCxyZXBvcnRQcm9ncmVzczpzLHJlc3BvbnNlVHlwZTppLHdpdGhDcmVkZW50aWFsczpyfSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi92YXIgX0Q7IShmdW5jdGlvbih0KXt0W3QuU2VudD0wXT0iU2VudCIsdFt0LlVwbG9hZFByb2dyZXNzPTFdPSJVcGxvYWRQcm9ncmVzcyIsdFt0LlJlc3BvbnNlSGVhZGVyPTJdPSJSZXNwb25zZUhlYWRlciIsdFt0LkRvd25sb2FkUHJvZ3Jlc3M9M109IkRvd25sb2FkUHJvZ3Jlc3MiLHRbdC5SZXNwb25zZT00XT0iUmVzcG9uc2UiLHRbdC5Vc2VyPTVdPSJVc2VyIn0pKF9EfHwoX0Q9e30pKTtjbGFzcyBDRHtjb25zdHJ1Y3Rvcih0LGU9MjAwLG49Ik9LIil7dGhpcy5oZWFkZXJzPXQuaGVhZGVyc3x8bmV3IGNELHRoaXMuc3RhdHVzPXZvaWQgMCE9PXQuc3RhdHVzP3Quc3RhdHVzOmUsdGhpcy5zdGF0dXNUZXh0PXQuc3RhdHVzVGV4dHx8bix0aGlzLnVybD10LnVybHx8bnVsbCx0aGlzLm9rPXRoaXMuc3RhdHVzPj0yMDAmJnRoaXMuc3RhdHVzPDMwMH19Y2xhc3MgTUQgZXh0ZW5kcyBDRHtjb25zdHJ1Y3Rvcih0PXt9KXtzdXBlcih0KSx0aGlzLnR5cGU9X0QuUmVzcG9uc2VIZWFkZXJ9Y2xvbmUodD17fSl7cmV0dXJuIG5ldyBNRCh7aGVhZGVyczp0LmhlYWRlcnN8fHRoaXMuaGVhZGVycyxzdGF0dXM6dm9pZCAwIT09dC5zdGF0dXM/dC5zdGF0dXM6dGhpcy5zdGF0dXMsc3RhdHVzVGV4dDp0LnN0YXR1c1RleHR8fHRoaXMuc3RhdHVzVGV4dCx1cmw6dC51cmx8fHRoaXMudXJsfHx2b2lkIDB9KX19Y2xhc3MgdkQgZXh0ZW5kcyBDRHtjb25zdHJ1Y3Rvcih0PXt9KXtzdXBlcih0KSx0aGlzLnR5cGU9X0QuUmVzcG9uc2UsdGhpcy5ib2R5PXZvaWQgMCE9PXQuYm9keT90LmJvZHk6bnVsbH1jbG9uZSh0PXt9KXtyZXR1cm4gbmV3IHZEKHtib2R5OnZvaWQgMCE9PXQuYm9keT90LmJvZHk6dGhpcy5ib2R5LGhlYWRlcnM6dC5oZWFkZXJzfHx0aGlzLmhlYWRlcnMsc3RhdHVzOnZvaWQgMCE9PXQuc3RhdHVzP3Quc3RhdHVzOnRoaXMuc3RhdHVzLHN0YXR1c1RleHQ6dC5zdGF0dXNUZXh0fHx0aGlzLnN0YXR1c1RleHQsdXJsOnQudXJsfHx0aGlzLnVybHx8dm9pZCAwfSl9fWNsYXNzIHhEIGV4dGVuZHMgQ0R7Y29uc3RydWN0b3IodCl7c3VwZXIodCwwLCJVbmtub3duIEVycm9yIiksdGhpcy5uYW1lPSJIdHRwRXJyb3JSZXNwb25zZSIsdGhpcy5vaz0hMSx0aGlzLm1lc3NhZ2U9dGhpcy5zdGF0dXM+PTIwMCYmdGhpcy5zdGF0dXM8MzAwP2BIdHRwIGZhaWx1cmUgZHVyaW5nIHBhcnNpbmcgZm9yICR7dC51cmx8fCIodW5rbm93biB1cmwpIn1gOmBIdHRwIGZhaWx1cmUgcmVzcG9uc2UgZm9yICR7dC51cmx8fCIodW5rbm93biB1cmwpIn06ICR7dC5zdGF0dXN9ICR7dC5zdGF0dXNUZXh0fWAsdGhpcy5lcnJvcj10LmVycm9yfHxudWxsfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gT0QodCxlKXtyZXR1cm57Ym9keTplLGhlYWRlcnM6dC5oZWFkZXJzLGNvbnRleHQ6dC5jb250ZXh0LG9ic2VydmU6dC5vYnNlcnZlLHBhcmFtczp0LnBhcmFtcyxyZXBvcnRQcm9ncmVzczp0LnJlcG9ydFByb2dyZXNzLHJlc3BvbnNlVHlwZTp0LnJlc3BvbnNlVHlwZSx3aXRoQ3JlZGVudGlhbHM6dC53aXRoQ3JlZGVudGlhbHN9fWNsYXNzIFBEe2NvbnN0cnVjdG9yKHQpe3RoaXMuaGFuZGxlcj10fXJlcXVlc3QodCxlLG49e30pe2xldCBvO2lmKHQgaW5zdGFuY2VvZiB5RClvPXQ7ZWxzZXtsZXQgaSxhO2k9bi5oZWFkZXJzIGluc3RhbmNlb2YgY0Q/bi5oZWFkZXJzOm5ldyBjRChuLmhlYWRlcnMpLG4ucGFyYW1zJiYoYT1uLnBhcmFtcyBpbnN0YW5jZW9mIHVEP24ucGFyYW1zOm5ldyB1RCh7ZnJvbU9iamVjdDpuLnBhcmFtc30pKSxvPW5ldyB5RCh0LGUsdm9pZCAwIT09bi5ib2R5P24uYm9keTpudWxsLHtoZWFkZXJzOmksY29udGV4dDpuLmNvbnRleHQscGFyYW1zOmEscmVwb3J0UHJvZ3Jlc3M6bi5yZXBvcnRQcm9ncmVzcyxyZXNwb25zZVR5cGU6bi5yZXNwb25zZVR5cGV8fCJqc29uIix3aXRoQ3JlZGVudGlhbHM6bi53aXRoQ3JlZGVudGlhbHN9KX1jb25zdCBpPUV0KG8pLnBpcGUoKGZ1bmN0aW9uIGEodCxlKXtyZXR1cm4gbChlKT9adCh0LGUsMSk6WnQodCwxKX0pKCh0PT50aGlzLmhhbmRsZXIuaGFuZGxlKHQpKSkpO2lmKHQgaW5zdGFuY2VvZiB5RHx8ImV2ZW50cyI9PT1uLm9ic2VydmUpcmV0dXJuIGk7Y29uc3Qgcj1pLnBpcGUoY2UoKHQ9PnQgaW5zdGFuY2VvZiB2RCkpKTtzd2l0Y2gobi5vYnNlcnZlfHwiYm9keSIpe2Nhc2UiYm9keSI6c3dpdGNoKG8ucmVzcG9uc2VUeXBlKXtjYXNlImFycmF5YnVmZmVyIjpyZXR1cm4gci5waXBlKEl0KCh0PT57aWYobnVsbCE9PXQuYm9keSYmISh0LmJvZHkgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpdGhyb3cgbmV3IEVycm9yKCJSZXNwb25zZSBpcyBub3QgYW4gQXJyYXlCdWZmZXIuIik7cmV0dXJuIHQuYm9keX0pKSk7Y2FzZSJibG9iIjpyZXR1cm4gci5waXBlKEl0KCh0PT57aWYobnVsbCE9PXQuYm9keSYmISh0LmJvZHkgaW5zdGFuY2VvZiBCbG9iKSl0aHJvdyBuZXcgRXJyb3IoIlJlc3BvbnNlIGlzIG5vdCBhIEJsb2IuIik7cmV0dXJuIHQuYm9keX0pKSk7Y2FzZSJ0ZXh0IjpyZXR1cm4gci5waXBlKEl0KCh0PT57aWYobnVsbCE9PXQuYm9keSYmInN0cmluZyIhPXR5cGVvZiB0LmJvZHkpdGhyb3cgbmV3IEVycm9yKCJSZXNwb25zZSBpcyBub3QgYSBzdHJpbmcuIik7cmV0dXJuIHQuYm9keX0pKSk7Y2FzZSJqc29uIjpkZWZhdWx0OnJldHVybiByLnBpcGUoSXQoKHQ9PnQuYm9keSkpKX1jYXNlInJlc3BvbnNlIjpyZXR1cm4gcjtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5yZWFjaGFibGU6IHVuaGFuZGxlZCBvYnNlcnZlIHR5cGUgJHtuLm9ic2VydmV9fWApfX1kZWxldGUodCxlPXt9KXtyZXR1cm4gdGhpcy5yZXF1ZXN0KCJERUxFVEUiLHQsZSl9Z2V0KHQsZT17fSl7cmV0dXJuIHRoaXMucmVxdWVzdCgiR0VUIix0LGUpfWhlYWQodCxlPXt9KXtyZXR1cm4gdGhpcy5yZXF1ZXN0KCJIRUFEIix0LGUpfWpzb25wKHQsZSl7cmV0dXJuIHRoaXMucmVxdWVzdCgiSlNPTlAiLHQse3BhcmFtczoobmV3IHVEKS5hcHBlbmQoZSwiSlNPTlBfQ0FMTEJBQ0siKSxvYnNlcnZlOiJib2R5IixyZXNwb25zZVR5cGU6Impzb24ifSl9b3B0aW9ucyh0LGU9e30pe3JldHVybiB0aGlzLnJlcXVlc3QoIk9QVElPTlMiLHQsZSl9cGF0Y2godCxlLG49e30pe3JldHVybiB0aGlzLnJlcXVlc3QoIlBBVENIIix0LE9EKG4sZSkpfXBvc3QodCxlLG49e30pe3JldHVybiB0aGlzLnJlcXVlc3QoIlBPU1QiLHQsT0QobixlKSl9cHV0KHQsZSxuPXt9KXtyZXR1cm4gdGhpcy5yZXF1ZXN0KCJQVVQiLHQsT0QobixlKSl9fVBELsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxQRCkodnIoc0QpKX0sUEQuybVwcm92PU1uKHt0b2tlbjpQRCxmYWN0b3J5OlBELsm1ZmFjfSksUEQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpzRH1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUEQsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnNEfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIHdEe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5uZXh0PXQsdGhpcy5pbnRlcmNlcHRvcj1lfWhhbmRsZSh0KXtyZXR1cm4gdGhpcy5pbnRlcmNlcHRvci5pbnRlcmNlcHQodCx0aGlzLm5leHQpfX1jb25zdCBrRD1uZXcgR2EoIkhUVFBfSU5URVJDRVBUT1JTIik7Y2xhc3MgU0R7aW50ZXJjZXB0KHQsZSl7cmV0dXJuIGUuaGFuZGxlKHQpfX1TRC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8U0QpfSxTRC7JtXByb3Y9TW4oe3Rva2VuOlNELGZhY3Rvcnk6U0QuybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFNELFt7dHlwZTppbX1dLG51bGwsbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpsZXQgREQ9MDtjbGFzcyBFRHt9Y2xhc3MgUkR7Y29uc3RydWN0b3IodCxlKXt0aGlzLmNhbGxiYWNrTWFwPXQsdGhpcy5kb2N1bWVudD1lLHRoaXMucmVzb2x2ZWRQcm9taXNlPVByb21pc2UucmVzb2x2ZSgpfW5leHRDYWxsYmFjaygpe3JldHVybiJuZ19qc29ucF9jYWxsYmFja18iK0REKyt9aGFuZGxlKHQpe2lmKCJKU09OUCIhPT10Lm1ldGhvZCl0aHJvdyBuZXcgRXJyb3IoIkpTT05QIHJlcXVlc3RzIG11c3QgdXNlIEpTT05QIHJlcXVlc3QgbWV0aG9kLiIpO2lmKCJqc29uIiE9PXQucmVzcG9uc2VUeXBlKXRocm93IG5ldyBFcnJvcigiSlNPTlAgcmVxdWVzdHMgbXVzdCB1c2UgSnNvbiByZXNwb25zZSB0eXBlLiIpO3JldHVybiBuZXcgRCgoZT0+e2NvbnN0IG49dGhpcy5uZXh0Q2FsbGJhY2soKSxvPXQudXJsV2l0aFBhcmFtcy5yZXBsYWNlKC89SlNPTlBfQ0FMTEJBQ0soJnwkKS8sYD0ke259JDFgKSxpPXRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aS5zcmM9bztsZXQgYT1udWxsLHI9ITEscz0hMTt0aGlzLmNhbGxiYWNrTWFwW25dPXQ9PntkZWxldGUgdGhpcy5jYWxsYmFja01hcFtuXSxzfHwoYT10LHI9ITApfTtjb25zdCBsPSgpPT57aS5wYXJlbnROb2RlJiZpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaSksZGVsZXRlIHRoaXMuY2FsbGJhY2tNYXBbbl19LGM9dD0+e3N8fHRoaXMucmVzb2x2ZWRQcm9taXNlLnRoZW4oKCgpPT57bCgpLHI/KGUubmV4dChuZXcgdkQoe2JvZHk6YSxzdGF0dXM6MjAwLHN0YXR1c1RleHQ6Ik9LIix1cmw6b30pKSxlLmNvbXBsZXRlKCkpOmUuZXJyb3IobmV3IHhEKHt1cmw6byxzdGF0dXM6MCxzdGF0dXNUZXh0OiJKU09OUCBFcnJvciIsZXJyb3I6bmV3IEVycm9yKCJKU09OUCBpbmplY3RlZCBzY3JpcHQgZGlkIG5vdCBpbnZva2UgY2FsbGJhY2suIil9KSl9KSl9LGQ9dD0+e3N8fChsKCksZS5lcnJvcihuZXcgeEQoe2Vycm9yOnQsc3RhdHVzOjAsc3RhdHVzVGV4dDoiSlNPTlAgRXJyb3IiLHVybDpvfSkpKX07cmV0dXJuIGkuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsYyksaS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZCksdGhpcy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGkpLGUubmV4dCh7dHlwZTpfRC5TZW50fSksKCk9PntzPSEwLGkucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsYyksaS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsZCksbCgpfX0pKX19UkQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFJEKSh2cihFRCksdnIoWl8pKX0sUkQuybVwcm92PU1uKHt0b2tlbjpSRCxmYWN0b3J5OlJELsm1ZmFjfSksUkQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpFRH0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChSRCxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6RUR9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSksbnVsbCk7Y2xhc3MgQUR7Y29uc3RydWN0b3IodCl7dGhpcy5qc29ucD10fWludGVyY2VwdCh0LGUpe3JldHVybiJKU09OUCI9PT10Lm1ldGhvZD90aGlzLmpzb25wLmhhbmRsZSh0KTplLmhhbmRsZSh0KX19QUQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEFEKSh2cihSRCkpfSxBRC7JtXByb3Y9TW4oe3Rva2VuOkFELGZhY3Rvcnk6QUQuybVmYWN9KSxBRC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlJEfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChBRCxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6UkR9XX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgVEQ9L15cKVxdXH0nLD9cbi87Y2xhc3MgTkR7Y29uc3RydWN0b3IodCl7dGhpcy54aHJGYWN0b3J5PXR9aGFuZGxlKHQpe2lmKCJKU09OUCI9PT10Lm1ldGhvZCl0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHRlZCB0byBjb25zdHJ1Y3QgSnNvbnAgcmVxdWVzdCB3aXRob3V0IEh0dHBDbGllbnRKc29ucE1vZHVsZSBpbnN0YWxsZWQuIik7cmV0dXJuIG5ldyBEKChlPT57Y29uc3Qgbj10aGlzLnhockZhY3RvcnkuYnVpbGQoKTtpZihuLm9wZW4odC5tZXRob2QsdC51cmxXaXRoUGFyYW1zKSx0LndpdGhDcmVkZW50aWFscyYmKG4ud2l0aENyZWRlbnRpYWxzPSEwKSx0LmhlYWRlcnMuZm9yRWFjaCgoKHQsZSk9Pm4uc2V0UmVxdWVzdEhlYWRlcih0LGUuam9pbigiLCIpKSkpLHQuaGVhZGVycy5oYXMoIkFjY2VwdCIpfHxuLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsImFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKiIpLCF0LmhlYWRlcnMuaGFzKCJDb250ZW50LVR5cGUiKSl7Y29uc3QgZT10LmRldGVjdENvbnRlbnRUeXBlSGVhZGVyKCk7bnVsbCE9PWUmJm4uc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixlKX1pZih0LnJlc3BvbnNlVHlwZSl7Y29uc3QgZT10LnJlc3BvbnNlVHlwZS50b0xvd2VyQ2FzZSgpO24ucmVzcG9uc2VUeXBlPSJqc29uIiE9PWU/ZToidGV4dCJ9Y29uc3Qgbz10LnNlcmlhbGl6ZUJvZHkoKTtsZXQgaT1udWxsO2NvbnN0IGE9KCk9PntpZihudWxsIT09aSlyZXR1cm4gaTtjb25zdCBlPTEyMjM9PT1uLnN0YXR1cz8yMDQ6bi5zdGF0dXMsbz1uLnN0YXR1c1RleHR8fCJPSyIsYT1uZXcgY0Qobi5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkscj0oZnVuY3Rpb24gcyh0KXtyZXR1cm4icmVzcG9uc2VVUkwiaW4gdCYmdC5yZXNwb25zZVVSTD90LnJlc3BvbnNlVVJMOi9eWC1SZXF1ZXN0LVVSTDovbS50ZXN0KHQuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpP3QuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtUmVxdWVzdC1VUkwiKTpudWxsfSkobil8fHQudXJsO3JldHVybiBpPW5ldyBNRCh7aGVhZGVyczphLHN0YXR1czplLHN0YXR1c1RleHQ6byx1cmw6cn0pLGl9LHI9KCk9PntsZXR7aGVhZGVyczpvLHN0YXR1czppLHN0YXR1c1RleHQ6cix1cmw6c309YSgpLGw9bnVsbDsyMDQhPT1pJiYobD12b2lkIDA9PT1uLnJlc3BvbnNlP24ucmVzcG9uc2VUZXh0Om4ucmVzcG9uc2UpLDA9PT1pJiYoaT1sPzIwMDowKTtsZXQgYz1pPj0yMDAmJmk8MzAwO2lmKCJqc29uIj09PXQucmVzcG9uc2VUeXBlJiYic3RyaW5nIj09dHlwZW9mIGwpe2NvbnN0IHQ9bDtsPWwucmVwbGFjZShURCwiIik7dHJ5e2w9IiIhPT1sP0pTT04ucGFyc2UobCk6bnVsbH1jYXRjaChlKXtsPXQsYyYmKGM9ITEsbD17ZXJyb3I6ZSx0ZXh0Omx9KX19Yz8oZS5uZXh0KG5ldyB2RCh7Ym9keTpsLGhlYWRlcnM6byxzdGF0dXM6aSxzdGF0dXNUZXh0OnIsdXJsOnN8fHZvaWQgMH0pKSxlLmNvbXBsZXRlKCkpOmUuZXJyb3IobmV3IHhEKHtlcnJvcjpsLGhlYWRlcnM6byxzdGF0dXM6aSxzdGF0dXNUZXh0OnIsdXJsOnN8fHZvaWQgMH0pKX0scz10PT57Y29uc3R7dXJsOm99PWEoKSxpPW5ldyB4RCh7ZXJyb3I6dCxzdGF0dXM6bi5zdGF0dXN8fDAsc3RhdHVzVGV4dDpuLnN0YXR1c1RleHR8fCJVbmtub3duIEVycm9yIix1cmw6b3x8dm9pZCAwfSk7ZS5lcnJvcihpKX07bGV0IGw9ITE7Y29uc3QgYz1vPT57bHx8KGUubmV4dChhKCkpLGw9ITApO2xldCBpPXt0eXBlOl9ELkRvd25sb2FkUHJvZ3Jlc3MsbG9hZGVkOm8ubG9hZGVkfTtvLmxlbmd0aENvbXB1dGFibGUmJihpLnRvdGFsPW8udG90YWwpLCJ0ZXh0Ij09PXQucmVzcG9uc2VUeXBlJiZuLnJlc3BvbnNlVGV4dCYmKGkucGFydGlhbFRleHQ9bi5yZXNwb25zZVRleHQpLGUubmV4dChpKX0sZD10PT57bGV0IG49e3R5cGU6X0QuVXBsb2FkUHJvZ3Jlc3MsbG9hZGVkOnQubG9hZGVkfTt0Lmxlbmd0aENvbXB1dGFibGUmJihuLnRvdGFsPXQudG90YWwpLGUubmV4dChuKX07cmV0dXJuIG4uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsciksbi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIscyksbi5hZGRFdmVudExpc3RlbmVyKCJ0aW1lb3V0IixzKSxuLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixzKSx0LnJlcG9ydFByb2dyZXNzJiYobi5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsYyksbnVsbCE9PW8mJm4udXBsb2FkJiZuLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZCkpLG4uc2VuZChvKSxlLm5leHQoe3R5cGU6X0QuU2VudH0pLCgpPT57bi5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIscyksbi5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIscyksbi5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixyKSxuLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWVvdXQiLHMpLHQucmVwb3J0UHJvZ3Jlc3MmJihuLnJlbW92ZUV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixjKSxudWxsIT09byYmbi51cGxvYWQmJm4udXBsb2FkLnJlbW92ZUV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixkKSksbi5yZWFkeVN0YXRlIT09bi5ET05FJiZuLmFib3J0KCl9fSkpfX1ORC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8TkQpKHZyKFhNKSl9LE5ELsm1cHJvdj1Nbih7dG9rZW46TkQsZmFjdG9yeTpORC7JtWZhY30pLE5ELmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6WE19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKE5ELFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpYTX1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCB6RD1uZXcgR2EoIlhTUkZfQ09PS0lFX05BTUUiKSxJRD1uZXcgR2EoIlhTUkZfSEVBREVSX05BTUUiKTtjbGFzcyBIRHt9Y2xhc3MgRkR7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuZG9jPXQsdGhpcy5wbGF0Zm9ybT1lLHRoaXMuY29va2llTmFtZT1uLHRoaXMubGFzdENvb2tpZVN0cmluZz0iIix0aGlzLmxhc3RUb2tlbj1udWxsLHRoaXMucGFyc2VDb3VudD0wfWdldFRva2VuKCl7aWYoInNlcnZlciI9PT10aGlzLnBsYXRmb3JtKXJldHVybiBudWxsO2NvbnN0IHQ9dGhpcy5kb2MuY29va2llfHwiIjtyZXR1cm4gdCE9PXRoaXMubGFzdENvb2tpZVN0cmluZyYmKHRoaXMucGFyc2VDb3VudCsrLHRoaXMubGFzdFRva2VuPWlNKHQsdGhpcy5jb29raWVOYW1lKSx0aGlzLmxhc3RDb29raWVTdHJpbmc9dCksdGhpcy5sYXN0VG9rZW59fUZELsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxGRCkodnIoWl8pLHZyKGp5KSx2cih6RCkpfSxGRC7JtXByb3Y9TW4oe3Rva2VuOkZELGZhY3Rvcnk6RkQuybVmYWN9KSxGRC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W2p5XX1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbekRdfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEZELFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltqeV19XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3pEXX1dfV19KSxudWxsKTtjbGFzcyBMRHtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMudG9rZW5TZXJ2aWNlPXQsdGhpcy5oZWFkZXJOYW1lPWV9aW50ZXJjZXB0KHQsZSl7Y29uc3Qgbj10LnVybC50b0xvd2VyQ2FzZSgpO2lmKCJHRVQiPT09dC5tZXRob2R8fCJIRUFEIj09PXQubWV0aG9kfHxuLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKXx8bi5zdGFydHNXaXRoKCJodHRwczovLyIpKXJldHVybiBlLmhhbmRsZSh0KTtjb25zdCBvPXRoaXMudG9rZW5TZXJ2aWNlLmdldFRva2VuKCk7cmV0dXJuIG51bGw9PT1vfHx0LmhlYWRlcnMuaGFzKHRoaXMuaGVhZGVyTmFtZSl8fCh0PXQuY2xvbmUoe2hlYWRlcnM6dC5oZWFkZXJzLnNldCh0aGlzLmhlYWRlck5hbWUsbyl9KSksZS5oYW5kbGUodCl9fUxELsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxMRCkodnIoSEQpLHZyKElEKSl9LExELsm1cHJvdj1Nbih7dG9rZW46TEQsZmFjdG9yeTpMRC7JtWZhY30pLExELmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6SER9LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltJRF19XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoTEQsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkhEfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbSURdfV19XX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgQkR7Y29uc3RydWN0b3IodCxlKXt0aGlzLmJhY2tlbmQ9dCx0aGlzLmluamVjdG9yPWUsdGhpcy5jaGFpbj1udWxsfWhhbmRsZSh0KXtpZihudWxsPT09dGhpcy5jaGFpbil7Y29uc3QgdD10aGlzLmluamVjdG9yLmdldChrRCxbXSk7dGhpcy5jaGFpbj10LnJlZHVjZVJpZ2h0KCgodCxlKT0+bmV3IHdEKHQsZSkpLHRoaXMuYmFja2VuZCl9cmV0dXJuIHRoaXMuY2hhaW4uaGFuZGxlKHQpfX1mdW5jdGlvbiBWRCgpe3JldHVybiJvYmplY3QiPT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fX1CRC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8QkQpKHZyKGxEKSx2cihycCkpfSxCRC7JtXByb3Y9TW4oe3Rva2VuOkJELGZhY3Rvcnk6QkQuybVmYWN9KSxCRC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmxEfSx7dHlwZTpycH1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQkQsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmxEfSx7dHlwZTpycH1dfSksbnVsbCk7Y2xhc3MgakR7c3RhdGljIGRpc2FibGUoKXtyZXR1cm57bmdNb2R1bGU6akQscHJvdmlkZXJzOlt7cHJvdmlkZTpMRCx1c2VDbGFzczpTRH1dfX1zdGF0aWMgd2l0aE9wdGlvbnModD17fSl7cmV0dXJue25nTW9kdWxlOmpELHByb3ZpZGVyczpbdC5jb29raWVOYW1lP3twcm92aWRlOnpELHVzZVZhbHVlOnQuY29va2llTmFtZX06W10sdC5oZWFkZXJOYW1lP3twcm92aWRlOklELHVzZVZhbHVlOnQuaGVhZGVyTmFtZX06W11dfX19akQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGpEKX0sakQuybVtb2Q9YW8oe3R5cGU6akR9KSxqRC7JtWluaj12bih7cHJvdmlkZXJzOltMRCx7cHJvdmlkZTprRCx1c2VFeGlzdGluZzpMRCxtdWx0aTohMH0se3Byb3ZpZGU6SEQsdXNlQ2xhc3M6RkR9LHtwcm92aWRlOnpELHVzZVZhbHVlOiJYU1JGLVRPS0VOIn0se3Byb3ZpZGU6SUQsdXNlVmFsdWU6IlgtWFNSRi1UT0tFTiJ9XX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoakQsW3t0eXBlOkF5LGFyZ3M6W3twcm92aWRlcnM6W0xELHtwcm92aWRlOmtELHVzZUV4aXN0aW5nOkxELG11bHRpOiEwfSx7cHJvdmlkZTpIRCx1c2VDbGFzczpGRH0se3Byb3ZpZGU6ekQsdXNlVmFsdWU6IlhTUkYtVE9LRU4ifSx7cHJvdmlkZTpJRCx1c2VWYWx1ZToiWC1YU1JGLVRPS0VOIn1dfV19XSxudWxsLG51bGwpO2NsYXNzIFVEe31VRC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VUQpfSxVRC7JtW1vZD1hbyh7dHlwZTpVRH0pLFVELsm1aW5qPXZuKHtwcm92aWRlcnM6W1BELHtwcm92aWRlOnNELHVzZUNsYXNzOkJEfSxORCx7cHJvdmlkZTpsRCx1c2VFeGlzdGluZzpORH1dLGltcG9ydHM6W1tqRC53aXRoT3B0aW9ucyh7Y29va2llTmFtZToiWFNSRi1UT0tFTiIsaGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIn0pXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFVELFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbakQud2l0aE9wdGlvbnMoe2Nvb2tpZU5hbWU6IlhTUkYtVE9LRU4iLGhlYWRlck5hbWU6IlgtWFNSRi1UT0tFTiJ9KV0scHJvdmlkZXJzOltQRCx7cHJvdmlkZTpzRCx1c2VDbGFzczpCRH0sTkQse3Byb3ZpZGU6bEQsdXNlRXhpc3Rpbmc6TkR9XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFVELHtpbXBvcnRzOltqRF19KTtjbGFzcyBHRHt9R0QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEdEKX0sR0QuybVtb2Q9YW8oe3R5cGU6R0R9KSxHRC7JtWluaj12bih7cHJvdmlkZXJzOltSRCx7cHJvdmlkZTpFRCx1c2VGYWN0b3J5OlZEfSx7cHJvdmlkZTprRCx1c2VDbGFzczpBRCxtdWx0aTohMH1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChHRCxbe3R5cGU6QXksYXJnczpbe3Byb3ZpZGVyczpbUkQse3Byb3ZpZGU6RUQsdXNlRmFjdG9yeTpWRH0se3Byb3ZpZGU6a0QsdXNlQ2xhc3M6QUQsbXVsdGk6ITB9XX1dfV0sbnVsbCxudWxsKTtjb25zdCBXRD0iZmVhdHVyZSIsWUQ9S3coV0QpLHFEPVp3KFlELCh0PT50LmlzRmVhdHVyZUZsYWdzTG9hZGVkKSksWkQ9WncoWUQsKHQ9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmRlZmF1bHRGbGFncyksdC5mbGFnT3ZlcnJpZGVzKSkpLFhEPVp3KFlELCh0PT50LmZsYWdPdmVycmlkZXN8fHt9KSksS0Q9WncoWkQsKHQ9PnQuaXNBdXRvRGFya01vZGVBbGxvd2VkKSksSkQ9WncoWkQsKHQ9Pm51bGwhPT10LmVuYWJsZURhcmtNb2RlT3ZlcnJpZGU/dC5lbmFibGVEYXJrTW9kZU92ZXJyaWRlOnQuZGVmYXVsdEVuYWJsZURhcmtNb2RlKSksUUQ9WncoWkQsKHQ9PnQuZW5hYmxlRGFya01vZGVPdmVycmlkZSkpLCREPVp3KFpELCh0PT50LmVuYWJsZWRFeHBlcmltZW50YWxQbHVnaW5zKSksdEU9WncoWkQsKHQ9PnQuaW5Db2xhYikpLGVFPVp3KFpELCh0PT50LmVuYWJsZWRDb2xvckdyb3VwKSksbkU9WncoWkQsKHQ9PnQuZW5hYmxlZENvbG9yR3JvdXBCeVJlZ2V4KSksb0U9WncoWkQsKHQ9PnQubWV0cmljc0ltYWdlU3VwcG9ydEVuYWJsZWQpKSxpRT1adyhaRCwodD0+dC5lbmFibGVkTGlua2VkVGltZSkpLGFFPVp3KFpELCh0PT50LmVuYWJsZVRpbWVTZXJpZXNQcm9tb3Rpb24pKTtmdW5jdGlvbiByRSh0KXtjb25zdCBlPXt9O2Zvcihjb25zdFtuLG9db2YgdC5lbnRyaWVzKCkpZVtuXT1vO3JldHVybiBlfWZ1bmN0aW9uIHNFKHQpe2xldCBlPXQuaGVhZGVyc3x8bmV3IGNEO3JldHVybiBlPWUuYXBwZW5kKCJYLVhTUkYtUHJvdGVjdGVkIiwiMSIpLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7aGVhZGVyczplfSl9Y2xhc3MgbEV7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuYXBwUm9vdFByb3ZpZGVyPXQsdGhpcy5odHRwPWUsdGhpcy5zdG9yZT1ufXJlc29sdmVBcHBSb290KHQpe3JldHVybiB0LnN0YXJ0c1dpdGgoIi8iKT90aGlzLmFwcFJvb3RQcm92aWRlci5nZXRBYnNQYXRobmFtZVdpdGhBcHBSb290KHQpOnR9Z2V0KHQsZT17fSl7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5yZXNvbHZlQXBwUm9vdCh0KSxlKX1wb3N0KHQsZSxuPXt9KXtyZXR1cm4gbj1zRShuKSx0aGlzLnN0b3JlLnNlbGVjdChxRCkucGlwZShjZSgodD0+Qm9vbGVhbih0KSkpLGJlKDEpLFZlKHRoaXMuc3RvcmUuc2VsZWN0KHRFKSksWnQoKChbLG9dKT0+e2NvbnN0IGk9dGhpcy5yZXNvbHZlQXBwUm9vdCh0KTtyZXR1cm4gbz90aGlzLmh0dHAuZ2V0KGkse2hlYWRlcnM6bi5oZWFkZXJzLHBhcmFtczpyRShlKX0pOnRoaXMuaHR0cC5wb3N0KGksZSxuKX0pKSl9cHV0KHQsZSxuPXt9KXtyZXR1cm4gdGhpcy5odHRwLnB1dCh0aGlzLnJlc29sdmVBcHBSb290KHQpLGUsc0UobikpfWRlbGV0ZSh0LGU9e30pe3JldHVybiB0aGlzLmh0dHAuZGVsZXRlKHRoaXMucmVzb2x2ZUFwcFJvb3QodCksc0UoZSkpfX1sRS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bEUpKHZyKGVTKSx2cihQRCksdnIoSXcpKX0sbEUuybVwcm92PU1uKHt0b2tlbjpsRSxmYWN0b3J5OmxFLsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChsRSxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6ZVN9LHt0eXBlOlBEfSx7dHlwZTpJd31dfSksbnVsbCk7Y2xhc3MgY0V7fXZhciBkRSxwRSxtRTtjRS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8Y0UpfSxjRS7JtW1vZD1hbyh7dHlwZTpjRX0pLGNFLsm1aW5qPXZuKHtwcm92aWRlcnM6W2xFXSxpbXBvcnRzOltbVUQsaVNdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoY0UsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltVRCxpU10scHJvdmlkZXJzOltsRV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhjRSx7aW1wb3J0czpbVUQsaVNdfSksKGZ1bmN0aW9uKHQpe3QuU1RFUD0ic3RlcCIsdC5XQUxMX1RJTUU9IndhbGxfdGltZSIsdC5SRUxBVElWRT0icmVsYXRpdmUifSkoZEV8fChkRT17fSkpLChmdW5jdGlvbih0KXt0Lk9GRlNFVD0ib2Zmc2V0Iix0Lk9WRVJMQVk9Im92ZXJsYXkifSkocEV8fChwRT17fSkpLChmdW5jdGlvbih0KXt0LlVOS05PV049IlVOS05PV04iLHQuTk9UX0ZPVU5EPSJOT1RfRk9VTkQifSkobUV8fChtRT17fSkpO2NvbnN0IHVFPW5ldyBHYSgiVGVuc29yQm9hcmQgYnJhbmQgbmFtZSIpO2Z1bmN0aW9uIGZFKHQpe2xldCBlPW1FLlVOS05PV047cmV0dXJuIHQgaW5zdGFuY2VvZiB4RCYmNDA0PT09dC5zdGF0dXMmJihlPW1FLk5PVF9GT1VORCksUnQobmV3IGdFKGUpKX1jbGFzcyBnRXtjb25zdHJ1Y3Rvcih0KXt0aGlzLmZhaWx1cmVDb2RlPXR9fWNsYXNzIGhFe2NvbnN0cnVjdG9yKHQpe3RoaXMuaHR0cD10LHRoaXMudGZCYWNrZW5kPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRmLWJhY2tlbmQiKS50Zl9iYWNrZW5kfWZldGNoUGx1Z2luc0xpc3RpbmcodCl7Y29uc3QgZT0oZnVuY3Rpb24gbih0KXtpZighdC5sZW5ndGgpcmV0dXJuIG51bGw7Y29uc3QgZT1uZXcgVVJMU2VhcmNoUGFyYW1zO2Zvcihjb25zdCBuIG9mIHQpZS5hcHBlbmQoImV4cGVyaW1lbnRhbFBsdWdpbiIsbik7cmV0dXJuIGV9KSh0KSxvPWU/YGRhdGEvcGx1Z2luc19saXN0aW5nPyR7ZS50b1N0cmluZygpfWA6ImRhdGEvcGx1Z2luc19saXN0aW5nIjtyZXR1cm4gdGhpcy5odHRwLmdldChvKS5waXBlKHBlKGZFKSl9ZmV0Y2hFbnZpcm9ubWVudCgpe3JldHVybiAkdChbdGhpcy5odHRwLmdldCgiZGF0YS9lbnZpcm9ubWVudCIpLEN0KHRoaXMudGZCYWNrZW5kLmVudmlyb25tZW50U3RvcmUucmVmcmVzaCgpKV0pLnBpcGUoSXQoKChbdF0pPT50KSkscGUoZkUpKX19aEUuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGhFKSh2cihsRSkpfSxoRS7JtXByb3Y9TW4oe3Rva2VuOmhFLGZhY3Rvcnk6aEUuybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGhFLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpsRX1dfSksbnVsbCk7Y2xhc3MgYkV7fXZhciB5RTtiRS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8YkUpfSxiRS7JtW1vZD1hbyh7dHlwZTpiRX0pLGJFLsm1aW5qPXZuKHtwcm92aWRlcnM6W2hFXSxpbXBvcnRzOltbY0VdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoYkUsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltjRV0scHJvdmlkZXJzOltoRV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhiRSx7aW1wb3J0czpbY0VdfSksKGZ1bmN0aW9uKHQpe3RbdC5OT1RfTE9BREVEPTBdPSJOT1RfTE9BREVEIix0W3QuTE9BREVEPTFdPSJMT0FERUQiLHRbdC5MT0FESU5HPTJdPSJMT0FESU5HIix0W3QuRkFJTEVEPTNdPSJGQUlMRUQifSkoeUV8fCh5RT17fSkpO2NvbnN0IF9FPUpQKCJbQ29yZV0gUGx1Z2luIENoYW5nZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxDRT1KUCgiW0NvcmVdIFBsdWdpbiBVcmwgSGFzaCBDaGFuZ2VkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksTUU9SlAoIltDb3JlXSBMb2FkZWQiKSx2RT1KUCgiW0NvcmVdIFVzZXIgVHJpZ2dlcmVkIFJlbG9hZCIpLHhFPUpQKCJbQ29yZV0gQXV0byBSZWxvYWQiKSxPRT1KUCgiW0NvcmVdIFBsdWdpbkxpc3RpbmcgRmV0Y2ggUmVxdWVzdGVkIiksUEU9SlAoIltDb3JlXSBQbHVnaW5MaXN0aW5nIEZldGNoIFN1Y2Nlc3NmdWwiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSx3RT1KUCgiW0NvcmVdIFBsdWdpbkxpc3RpbmcgRmV0Y2ggRmFpbGVkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksa0U9SlAoIltDb3JlXSBQb2x5bWVyIENvbXBvbmVudCBSdW5zIEZldGNoIFJlcXVlc3RlZCIpLFNFPUpQKCJbQ29yZV0gUG9seW1lciBDb21wb25lbnQgUnVucyBGZXRjaCBTdWNjZXNzZnVsIiksREU9SlAoIltDb3JlXSBQb2x5bWVyIENvbXBvbmVudCBSdW5zIEZldGNoIEZhaWxlZCIpLEVFPUpQKCJbQ29yZV0gRW52aXJvbm1lbnQgRmV0Y2ggU3VjY2Vzc2Z1bCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLFJFPUpQKCJbQ29yZV0gUnVuIFNlbGVjdGlvbiBDaGFuZ2VkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksQUU9SlAoIltDb3JlXSBSdW4gRmV0Y2ggU3VjY2Vzc2Z1bCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLFRFPUpQKCJbQ29yZV0gU2lkZSBCYXIgV2lkdGggQ2hhbmdlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLE5FPUpQKCJbTWV0cmljc10gTWV0cmljcyBTZXR0aW5ncyBQYW5lIENsb3NlZCIpLHpFPUpQKCJbTWV0cmljc10gTWV0cmljcyBTZXR0aW5ncyBQYW5lIFRvZ2dsZWQiKSxJRT1KUCgiW01ldHJpY3NdIE1ldHJpY3MgVGFnIE1ldGFkYXRhIFJlcXVlc3RlZCIpLEhFPUpQKCJbTWV0cmljc10gTWV0cmljcyBUYWcgTWV0YWRhdGEgTG9hZGVkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksRkU9SlAoIltNZXRyaWNzXSBNZXRyaWNzIFRhZyBNZXRhZGF0YSBGYWlsZWQiKSxMRT1KUCgiW01ldHJpY3NdIE1ldHJpY3MgU2V0dGluZ3MgQ2hhbmdlIFRvb2x0aXAiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KTtKUCgiW01ldHJpY3NdIE1ldHJpY3MgU2V0dGluZ3MgVG9nZ2xlIFNob3cgRGF0YSBEb3dubG9hZCIpO2NvbnN0IEJFPUpQKCJbTWV0cmljc10gTWV0cmljcyBTZXR0aW5nIFRvZ2dsZSBJZ25vcmUgT3V0bGllciIpLFZFPUpQKCJbTWV0cmljc10gTWV0cmljcyBTZXR0aW5nIENoYW5nZSBYIEF4aXMgVHlwZSIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLGpFPUpQKCJbTWV0cmljc10gTWV0cmljcyBTZXR0aW5nIENoYW5nZSBTY2FsYXIgU21vb3RoaW5nIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksVUU9SlAoIltNZXRyaWNzXSBNZXRyaWNzIFNldHRpbmcgUGFydGl0aW9uIE5vbiBNb25vdG9uaWMgWCBUb2dnbGVkIiksR0U9SlAoIltNZXRyaWNzXSBNZXRyaWNzIFNldHRpbmcgQ2hhbmdlIEltYWdlIEJyaWdodG5lc3MiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxXRT1KUCgiW01ldHJpY3NdIE1ldHJpY3MgU2V0dGluZyBDaGFuZ2UgSW1hZ2UgQ29udHJhc3QiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxZRT1KUCgiW01ldHJpY3NdIEltYWdlIEJyaWdodG5lc3MgU2V0dGluZyBSZXNldCIpLHFFPUpQKCJbTWV0cmljc10gSW1hZ2UgQ29udHJhc3QgU2V0dGluZyBSZXNldCIpLFpFPUpQKCJbTWV0cmljc10gTWV0cmljcyBTZXR0aW5nIFRvZ2dsZSBJbWFnZSBTaG93IEFjdHVhbCBTaXplIiksWEU9SlAoIltNZXRyaWNzXSBNZXRyaWNzIFNldHRpbmcgQ2hhbmdlIEhpc3RvZ3JhbSBNb2RlIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksS0U9SlAoIltNZXRyaWNzXSBNdWx0aXBsZSBUaW1lIFNlcmllcyBSZXF1ZXN0ZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxKRT1KUCgiW01ldHJpY3NdIEZldGNoIFRpbWUgU2VyaWVzIFJlcXVlc3QgRmFpbGVkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksUUU9SlAoIltNZXRyaWNzXSBGZXRjaCBUaW1lIFNlcmllcyBSZXNwb25zZSBMb2FkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSwkRT1KUCgiW01ldHJpY3NdIENhcmQgVmlzaWJpbGl0eSBDaGFuZ2VkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksdFI9SlAoIltNZXRyaWNzXSBDYXJkIFN0ZXAgU2xpZGVyIENoYW5nZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxlUj1KUCgiW01ldHJpY3NdIFRhZyBGaWx0ZXIgQ2hhbmdlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLG5SPUpQKCJbTWV0cmljc10gTWV0cmljcyBUYWcgR3JvdXAgRXhwYW5zaW9uIENoYW5nZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxvUj1KUCgiW01ldHJpY3NdIENhcmQgUGluIFN0YXRlIFRvZ2dsZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxpUj1KUCgiW01ldHJpY3NdIFRvZ2dsZSBWaXNpYmxlIFBsdWdpbiIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLGFSPUpQKCJbTWV0cmljc10gVG9nZ2xlIFNob3cgQWxsIFBsdWdpbnMiKSxyUj1KUCgiW01ldHJpY3NdIExpbmtlZCBUaW1lIFNlbGVjdGlvbiBDaGFuZ2VkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksc1I9SlAoIltNZXRyaWNzXSBMaW5rZWQgVGltZSBTZWxlY3Rpb24gQ2xlYXJlZCIpLGxSPUpQKCJbTWV0cmljc10gU2VsZWN0IFRpbWUgRW5hYmxlIFRvZ2dsZSIpLGNSPUpQKCJbTWV0cmljc10gVXNlIFJhbmdlIFNlbGVjdCBUaW1lIFRvZ2dsZSIpLGRSPUpQKCJbTWV0cmljc10gTWV0cmljcyBQcm9tbyBEaXNtaXNzZWQiKSxwUj1KUCgiW01ldHJpY3NdIE1ldHJpY3MgUHJvbW8gR28gVG8gU2NhbGFycyIpLG1SPSJjb3JlIix1Uj17YWN0aXZlUGx1Z2luOm51bGwscGx1Z2luczp7fSxjb3JlRGF0YUxvYWRTdGF0ZTp7c3RhdGU6eUUuTk9UX0xPQURFRCxsYXN0TG9hZGVkVGltZUluTXM6bnVsbH0scGx1Z2luc0xpc3RMb2FkZWQ6e3N0YXRlOnlFLk5PVF9MT0FERUQsbGFzdExvYWRlZFRpbWVJbk1zOm51bGwsZmFpbHVyZUNvZGU6bnVsbH0sZW52aXJvbm1lbnQ6e2RhdGFfbG9jYXRpb246IiIsd2luZG93X3RpdGxlOiIifSxwb2x5bWVyUnVuc0xvYWRTdGF0ZTp7c3RhdGU6eUUuTk9UX0xPQURFRCxsYXN0TG9hZGVkVGltZUluTXM6bnVsbH0scG9seW1lckludGVyb3BSdW5zOltdLHBvbHltZXJJbnRlcm9wUnVuU2VsZWN0aW9uOm5ldyBTZXQsc2lkZUJhcldpZHRoSW5QZXJjZW50OjIwfSxmUj15ayh1UixiayhfRSxDRSwoKHQse3BsdWdpbjplfSk9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7YWN0aXZlUGx1Z2luOmV9KSkpLGJrKE9FLCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2NvcmVEYXRhTG9hZFN0YXRlOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmNvcmVEYXRhTG9hZFN0YXRlKSx7c3RhdGU6eUUuTE9BRElOR30pLHBsdWdpbnNMaXN0TG9hZGVkOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnBsdWdpbnNMaXN0TG9hZGVkKSx7c3RhdGU6eUUuTE9BRElOR30pfSkpKSxiayh3RSwoKHQse2ZhaWx1cmVDb2RlOmV9KT0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtjb3JlRGF0YUxvYWRTdGF0ZTpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5jb3JlRGF0YUxvYWRTdGF0ZSkse3N0YXRlOnlFLkZBSUxFRH0pLHBsdWdpbnNMaXN0TG9hZGVkOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnBsdWdpbnNMaXN0TG9hZGVkKSx7c3RhdGU6eUUuRkFJTEVELGZhaWx1cmVDb2RlOmV9KX0pKSksYmsoUEUsKCh0LHtwbHVnaW5zOmV9KT0+e2NvbnN0IG49T2JqZWN0LmtleXMoZSkuZmluZCgodD0+ZVt0XS5lbmFibGVkKSl8fG51bGwsbz10LmFjdGl2ZVBsdWdpbnx8bixpPURhdGUubm93KCk7bGV0IGE9dC5jb3JlRGF0YUxvYWRTdGF0ZTtyZXR1cm4gdC5wb2x5bWVyUnVuc0xvYWRTdGF0ZS5zdGF0ZT09PXlFLkxPQURFRCYmKGE9e3N0YXRlOnlFLkxPQURFRCxsYXN0TG9hZGVkVGltZUluTXM6aX0pLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7YWN0aXZlUGx1Z2luOm8sY29yZURhdGFMb2FkU3RhdGU6YSxwbHVnaW5zOmUscGx1Z2luc0xpc3RMb2FkZWQ6e3N0YXRlOnlFLkxPQURFRCxsYXN0TG9hZGVkVGltZUluTXM6aSxmYWlsdXJlQ29kZTpudWxsfX0pfSkpLGJrKGtFLCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2NvcmVEYXRhTG9hZFN0YXRlOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmNvcmVEYXRhTG9hZFN0YXRlKSx7c3RhdGU6eUUuTE9BRElOR30pLHBvbHltZXJSdW5zTG9hZFN0YXRlOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnBvbHltZXJSdW5zTG9hZFN0YXRlKSx7c3RhdGU6eUUuTE9BRElOR30pfSkpKSxiayhTRSwodD0+e2NvbnN0IGU9RGF0ZS5ub3coKTtsZXQgbj10LmNvcmVEYXRhTG9hZFN0YXRlO3JldHVybiB0LnBsdWdpbnNMaXN0TG9hZGVkLnN0YXRlPT09eUUuTE9BREVEJiYobj17c3RhdGU6eUUuTE9BREVELGxhc3RMb2FkZWRUaW1lSW5NczplfSksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtjb3JlRGF0YUxvYWRTdGF0ZTpuLHBvbHltZXJSdW5zTG9hZFN0YXRlOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnBvbHltZXJSdW5zTG9hZFN0YXRlKSx7c3RhdGU6eUUuTE9BREVELGxhc3RMb2FkZWRUaW1lSW5NczplfSl9KX0pKSxiayhERSwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtjb3JlRGF0YUxvYWRTdGF0ZTpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5jb3JlRGF0YUxvYWRTdGF0ZSkse3N0YXRlOnlFLkZBSUxFRH0pLHBvbHltZXJSdW5zTG9hZFN0YXRlOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnBvbHltZXJSdW5zTG9hZFN0YXRlKSx7c3RhdGU6eUUuRkFJTEVEfSl9KSkpLGJrKEVFLCgodCx7ZW52aXJvbm1lbnQ6ZX0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2Vudmlyb25tZW50OmV9KSkpLGJrKEFFLCgodCx7cnVuczplfSk9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7cG9seW1lckludGVyb3BSdW5zOmV9KSkpLGJrKFJFLCgodCx7bmV4dFNlbGVjdGlvbjplfSk9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7cG9seW1lckludGVyb3BSdW5TZWxlY3Rpb246bmV3IFNldChlKX0pKSksYmsoVEUsKCh0LHt3aWR0aEluUGVyY2VudDplfSk9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7c2lkZUJhcldpZHRoSW5QZXJjZW50Ok1hdGgubWluKE1hdGgubWF4KDAsZSksMTAwKX0pKSksYmsoV1MsKCh0LHtwYXJ0aWFsU2V0dGluZ3M6ZX0pPT57Y29uc3Qgbj1PYmplY3QuYXNzaWduKHt9LHQpLG89ZS5zaWRlQmFyV2lkdGhJblBlcmNlbnQ7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBvJiZvPj0wJiZvPD0xMDAmJihuLnNpZGVCYXJXaWR0aEluUGVyY2VudD1vKSxufSkpLGJrKHBSLCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2FjdGl2ZVBsdWdpbjoic2NhbGFycyJ9KSkpKTtmdW5jdGlvbiBnUih0LGUpe3JldHVybiBmUih0LGUpfWNvbnN0IGhSPUt3KG1SKSxiUj1adyhoUiwodD0+dC5wbHVnaW5zTGlzdExvYWRlZCkpLHlSPVp3KGhSLCh0PT50LnBvbHltZXJSdW5zTG9hZFN0YXRlKSksX1I9WncoaFIsKHQ9PnQuY29yZURhdGFMb2FkU3RhdGUuc3RhdGUpKSxDUj1adyhoUiwodD0+dC5jb3JlRGF0YUxvYWRTdGF0ZS5sYXN0TG9hZGVkVGltZUluTXMpKSxNUj1adyhoUiwodD0+dC5hY3RpdmVQbHVnaW4pKSx2Uj1adyhoUiwodD0+dC5wbHVnaW5zKSkseFI9WncoaFIsKHQ9PnQuZW52aXJvbm1lbnQpKSxPUj1adyhoUiwodD0+dC5zaWRlQmFyV2lkdGhJblBlcmNlbnQpKSxQUj1uZXcgU2V0KFtaay5DT01QQVJFX0VYUEVSSU1FTlQsWmsuRVhQRVJJTUVOVCxaay5OT1RfU0VUXSk7Y2xhc3Mgd1J7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuYWN0aW9ucyQ9dCx0aGlzLnN0b3JlPWUsdGhpcy53ZWJhcHBEYXRhU291cmNlPW4sdGhpcy50ZkJhY2tlbmQ9e3JlZjpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Zi1iYWNrZW5kIikudGZfYmFja2VuZH0sdGhpcy5vbkRhc2hib2FyZExvYWQkPXJlKHRoaXMuYWN0aW9ucyQucGlwZShEayhNRSxkUyksVmUodGhpcy5zdG9yZS5zZWxlY3QoTlMpKSxNZSgoKFssdF0sWyxlXSk9PnQ9PT1lKSkpLHRoaXMuYWN0aW9ucyQucGlwZShEayh4RSx2RSkpKS5waXBlKFZlKHRoaXMuc3RvcmUuc2VsZWN0KFJTKSksY2UoKChbLHRdKT0+UFIuaGFzKHQpKSksQmUoMSx2b2lkIDAse2xlYWRpbmc6ITB9KSksdGhpcy5mZXRjaFdlYkFwcERhdGEkPU1rKCgoKT0+cmUodGhpcy5vbkRhc2hib2FyZExvYWQkLnBpcGUoVmUodGhpcy5zdG9yZS5zZWxlY3QoYlIpLHRoaXMuc3RvcmUuc2VsZWN0KCREKSksY2UoKChbLHtzdGF0ZTp0fV0pPT50IT09eUUuTE9BRElORykpLEZlKCgoKT0+dGhpcy5zdG9yZS5kaXNwYXRjaChPRSgpKSkpLFp0KCgoWywsdF0pPT4oZnVuY3Rpb24gZSgpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTt2YXIgbj1rdCh0KSxvPWxlKHQpO3JldHVybiBvLmxlbmd0aD9uZXcgRCgoZnVuY3Rpb24odCl7dmFyIGU9by5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuW119KSkscj1vLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm4hMX0pKTt0LmFkZCgoZnVuY3Rpb24oKXtlPXI9bnVsbH0pKTtmb3IodmFyIHM9ZnVuY3Rpb24ocyl7TXQob1tzXSkuc3Vic2NyaWJlKG5ldyBUKHQsKGZ1bmN0aW9uKG8pe2lmKGVbc10ucHVzaChvKSxlLmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gdC5sZW5ndGh9KSkpe3ZhciBsPWUubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5zaGlmdCgpfSkpO3QubmV4dChuP24uYXBwbHkodm9pZCAwLGEoW10saShsKSkpOmwpLGUuc29tZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4hdC5sZW5ndGgmJnJbZV19KSkmJnQuY29tcGxldGUoKX19KSwoZnVuY3Rpb24oKXtyW3NdPSEwLCFlW3NdLmxlbmd0aCYmdC5jb21wbGV0ZSgpfSkpKX0sbD0wOyF0LmNsb3NlZCYmbDxvLmxlbmd0aDtsKyspcyhsKTtyZXR1cm4gZnVuY3Rpb24oKXtlPXI9bnVsbH19KSk6cnR9KSh0aGlzLndlYmFwcERhdGFTb3VyY2UuZmV0Y2hQbHVnaW5zTGlzdGluZyh0KSx0aGlzLmZldGNoRW52aXJvbm1lbnQoKSkucGlwZShJdCgoKFt0XSk9Pnt0aGlzLnN0b3JlLmRpc3BhdGNoKFBFKHtwbHVnaW5zOnR9KSl9KSkscGUoKHQ9Pih0aGlzLnN0b3JlLmRpc3BhdGNoKHdFKHQgaW5zdGFuY2VvZiBnRT97ZmFpbHVyZUNvZGU6dC5mYWlsdXJlQ29kZX06e2ZhaWx1cmVDb2RlOm1FLlVOS05PV059KSkscnQpKSkpKSkpLHRoaXMub25EYXNoYm9hcmRMb2FkJC5waXBlKEl0KCgoWyx0XSk9PnQpKSx6ZSgodD0+dCE9PVprLkNPTVBBUkVfRVhQRVJJTUVOVD9FdChbXSk6dGhpcy5zdG9yZS5zZWxlY3QoelMpLnBpcGUoTWUoKCh0LGUpPT57Y29uc3Qgbj1PYmplY3QuZW50cmllcyh0KSxvPW5ldyBNYXAoT2JqZWN0LmVudHJpZXMoZSkpO2lmKG4ubGVuZ3RoIT09by5zaXplKXJldHVybiExO2Zvcihjb25zdFt0LGVdb2YgbilpZihvLmdldCh0KSE9PWUpcmV0dXJuITE7cmV0dXJuITB9KSksQ2UoMCksQmUoNTAwLHZvaWQgMCx7bGVhZGluZzohMCx0cmFpbGluZzohMH0pKSkpLFZlKHRoaXMuc3RvcmUuc2VsZWN0KFJTKSx0aGlzLnN0b3JlLnNlbGVjdCh5UikpLGNlKCgoWyx0LGVdKT0+UFIuaGFzKHQpJiZlLnN0YXRlIT09eUUuTE9BRElORykpLEZlKCgoKT0+e3RoaXMuc3RvcmUuZGlzcGF0Y2goa0UoKSl9KSksemUoKCgpPT50aGlzLnJlZnJlc2hQb2x5bWVyUnVucygpKSksRmUoKCgpPT57dGhpcy5zdG9yZS5kaXNwYXRjaChTRSgpKX0pKSxwZSgoKCk9Pih0aGlzLnN0b3JlLmRpc3BhdGNoKERFKCkpLHJ0KSkpKSkpLHtkaXNwYXRjaDohMX0pLHRoaXMuZGlzcGF0Y2hDaGFuZ2VQbHVnaW4kPU1rKCgoKT0+cmUodGhpcy5vbkRhc2hib2FyZExvYWQkLHRoaXMuYWN0aW9ucyQucGlwZShEayhQRSkpKS5waXBlKFZlKHRoaXMuc3RvcmUuc2VsZWN0KE1SKSksSXQoKChbLHRdKT0+dCkpLE1lKCksY2UoKHQ9Pm51bGwhPT10KSksYmUoMSksRmUoKHQ9Pnt0aGlzLnN0b3JlLmRpc3BhdGNoKF9FKHtwbHVnaW46dH0pKX0pKSkpLHtkaXNwYXRjaDohMX0pfXJlZnJlc2hQb2x5bWVyUnVucygpe3JldHVybiBDdCh0aGlzLnRmQmFja2VuZC5yZWYucnVuc1N0b3JlLnJlZnJlc2goKSl9ZmV0Y2hFbnZpcm9ubWVudCgpe3JldHVybiB0aGlzLndlYmFwcERhdGFTb3VyY2UuZmV0Y2hFbnZpcm9ubWVudCgpLnBpcGUoRmUoKHQ9Pnt0aGlzLnN0b3JlLmRpc3BhdGNoKEVFKHtlbnZpcm9ubWVudDp0fSkpfSkpKX19d1IuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHdSKSh2cihTayksdnIoSXcpLHZyKGhFKSl9LHdSLsm1cHJvdj1Nbih7dG9rZW46d1IsZmFjdG9yeTp3Ui7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgod1IsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlNrfSx7dHlwZTpJd30se3R5cGU6aEV9XX0pLG51bGwpO2NvbnN0IGtSPW5ldyBHYSgiQ29yZSBGZWF0dXJlIENvbmZpZyIpO2Z1bmN0aW9uIFNSKHQpe3JldHVybntpbml0aWFsU3RhdGU6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHVSKSx7YWN0aXZlUGx1Z2luOnQuZ2V0UGx1Z2luSWQoKXx8bnVsbH0pfX1mdW5jdGlvbiBEUigpe3JldHVybiBadyhPUiwodD0+KHtzaWRlQmFyV2lkdGhJblBlcmNlbnQ6dH0pKSl9Y2xhc3MgRVJ7fUVSLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxFUil9LEVSLsm1bW9kPWFvKHt0eXBlOkVSfSksRVIuybVpbmo9dm4oe3Byb3ZpZGVyczpbe3Byb3ZpZGU6a1IsZGVwczpbVlNdLHVzZUZhY3Rvcnk6U1J9XSxpbXBvcnRzOltbV2suZm9yRmVhdHVyZShbd1JdKSxkay5mb3JGZWF0dXJlKG1SLGdSLGtSKSxiRSxxUy5kZWZpbmVHbG9iYWxTZXR0aW5nKERSKV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChFUixbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W1drLmZvckZlYXR1cmUoW3dSXSksZGsuZm9yRmVhdHVyZShtUixnUixrUiksYkUscVMuZGVmaW5lR2xvYmFsU2V0dGluZyhEUildLHByb3ZpZGVyczpbe3Byb3ZpZGU6a1IsZGVwczpbVlNdLHVzZUZhY3Rvcnk6U1J9XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKEVSLHtpbXBvcnRzOltHayxjayxiRSxxU119KTtjb25zdCBSUj1uZXcgR2EoIltBbGVydF0gQWN0aW9uLVRvLUFsZXJ0IFByb3ZpZGVyIik7Y2xhc3MgQVJ7Y29uc3RydWN0b3IodCl7dGhpcy5wcm92aWRlcnM9bmV3IE1hcDtmb3IoY29uc3QgZSBvZiB0fHxbXSlmb3IoY29uc3QgdCBvZiBlKXtpZih0aGlzLnByb3ZpZGVycy5oYXModC5hY3Rpb25DcmVhdG9yLnR5cGUpKXRocm93IG5ldyBSYW5nZUVycm9yKGAiJHt0LmFjdGlvbkNyZWF0b3IudHlwZX0iIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgYWxlcnRzLiBNdWx0aXBsZSBhbGVydHMgZm9yIHRoZSBzYW1lIGFjdGlvbiBpcyBub3QgYWxsb3dlZC5gKTt0aGlzLnByb3ZpZGVycy5zZXQodC5hY3Rpb25DcmVhdG9yLnR5cGUsdC5hbGVydEZyb21BY3Rpb24pfX1nZXRBbGVydEZyb21BY3Rpb24odCl7Y29uc3QgZT10aGlzLnByb3ZpZGVycy5nZXQodC50eXBlKTtyZXR1cm4gZT9lKHQpOm51bGx9c3RhdGljIHJlZ2lzdGVyQWxlcnRBY3Rpb25zKHQpe3JldHVybntuZ01vZHVsZTpBUixwcm92aWRlcnM6W3twcm92aWRlOlJSLG11bHRpOiEwLHVzZUZhY3Rvcnk6dH1dfX19QVIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEFSKSh2cihSUiw4KSl9LEFSLsm1bW9kPWFvKHt0eXBlOkFSfSksQVIuybVpbmo9dm4oe30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQVIsW3t0eXBlOkF5LGFyZ3M6W3t9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1JSXX1dfV19KSxudWxsKTtjb25zdCBUUj0iaHBhcmFtcyIsTlI9SlAoIltSdW5zXSBGZXRjaCBSdW5zIFJlcXVlc3RlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLHpSPUpQKCJbUnVuc10gRmV0Y2ggUnVucyBTdWNjZWVkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxJUj1KUCgiW1J1bnNdIEZldGNoIFJ1bnMgRmFpbGVkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksSFI9SlAoIltSdW5zXSBSdW4gU2VsZWN0aW9uIFRvZ2dsZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxGUj1KUCgiW1J1bnNdIFJ1biBQYWdlIFNlbGVjdGlvbiBUb2dnbGVkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksTFI9SlAoIltSdW5zXSBSdW4gU2VsZWN0b3IgUGFnaW5hdGlvbiBPcHRpb24gQ2hhbmdlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLEJSPUpQKCJbUnVuc10gUnVuIFNlbGVjdG9yIFNvcnQgQ2hhbmdlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLFZSPUpQKCJbUnVuc10gUnVuIFNlbGVjdG9yIFJlZ2V4IEZpbHRlciBDaGFuZ2VkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksalI9SlAoIltSdW5zXSBSdW4gQ29sb3IgQ2hhbmdlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLFVSPUpQKCJbUnVuc10gUnVuIFRhYmxlIFNob3duIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksR1I9SlAoIltSdW5zXSBSdW4gR3JvdXAgQnkgQ2hhbmdlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pO3ZhciBXUixZUixxUixaUjshKGZ1bmN0aW9uKHQpe3QuREFUQVNFVF9VTktOT1dOPSJEQVRBU0VUX1VOS05PV04iLHQuREFUQVNFVF9UUkFJTklORz0iREFUQVNFVF9UUkFJTklORyIsdC5EQVRBU0VUX1ZBTElEQVRJT049IkRBVEFTRVRfVkFMSURBVElPTiJ9KShXUnx8KFdSPXt9KSksKGZ1bmN0aW9uKHQpe3QuU1RBVFVTX1VOS05PV049IlNUQVRVU19VTktOT1dOIix0LlNUQVRVU19TVUNDRVNTPSJTVEFUVVNfU1VDQ0VTUyIsdC5TVEFUVVNfRkFJTFVSRT0iU1RBVFVTX0ZBSUxVUkUiLHQuU1RBVFVTX1JVTk5JTkc9IlNUQVRVU19SVU5OSU5HIn0pKFlSfHwoWVI9e30pKSwoZnVuY3Rpb24odCl7dC5EQVRBX1RZUEVfVU5TRVQ9IkRBVEFfVFlQRV9VTlNFVCIsdC5EQVRBX1RZUEVfU1RSSU5HPSJEQVRBX1RZUEVfU1RSSU5HIix0LkRBVEFfVFlQRV9CT09MPSJEQVRBX1RZUEVfQk9PTCIsdC5EQVRBX1RZUEVfRkxPQVQ2ND0iREFUQV9UWVBFX0ZMT0FUNjQifSkocVJ8fChxUj17fSkpLChmdW5jdGlvbih0KXt0W3QuRElTQ1JFVEU9MF09IkRJU0NSRVRFIix0W3QuSU5URVJWQUw9MV09IklOVEVSVkFMIn0pKFpSfHwoWlI9e30pKTtjbGFzcyBYUnt9WFIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFhSKX0sWFIuybVwcm92PU1uKHt0b2tlbjpYUixmYWN0b3J5OlhSLsm1ZmFjLHByb3ZpZGVkSW46InJvb3QifSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChYUixbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSxudWxsLG51bGwpO2NvbnN0IEtSPUpQKCJbSHBhcmFtc10gSHBhcmFtcyBEaXNjcmV0ZSBIcGFyYW0gRmlsdGVyIENoYW5nZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxKUj1KUCgiW0hwYXJhbXNdIEhwYXJhbXMgSW50ZXJ2YWwgSHBhcmFtIEZpbHRlciBDaGFuZ2VkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksUVI9SlAoIltIcGFyYW1zXSBIcGFyYW1zIE1ldHJpYyBGaWx0ZXIgQ2hhbmdlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pO2Z1bmN0aW9uICRSKHQpe3JldHVybiBKU09OLnN0cmluZ2lmeShbLi4udF0uc29ydCgpKX1mdW5jdGlvbiB0QSh0KXt2YXIgZSxuLG8saTtjb25zdCBhPW5ldyBNYXAscj1uZXcgTWFwLHM9bmV3IE1hcDtmb3IoY29uc3QgYSBvZiB0KWZvcihjb25zdFt0LGxdb2YgYSlpZihsLnR5cGU9PT1aUi5ESVNDUkVURSl7Y29uc3R7cG9zc2libGVWYWx1ZXM6ZSx2YWx1ZXM6bn09ci5nZXQodCl8fHtwb3NzaWJsZVZhbHVlczpuZXcgU2V0LHZhbHVlczpuZXcgU2V0fTtmb3IoY29uc3QgdCBvZiBsLmZpbHRlclZhbHVlcyluLmFkZCh0KTtmb3IoY29uc3QgdCBvZiBsLnBvc3NpYmxlVmFsdWVzKWUuYWRkKHQpO3Iuc2V0KHQse3Bvc3NpYmxlVmFsdWVzOmUsdmFsdWVzOm59KX1lbHNle2NvbnN0IGE9cy5nZXQodCk7cy5zZXQodCx7ZmlsdGVyTG93ZXJWYWx1ZTpNYXRoLm1pbihsLmZpbHRlckxvd2VyVmFsdWUsbnVsbCE9PShlPW51bGw9PWE/dm9pZCAwOmEuZmlsdGVyTG93ZXJWYWx1ZSkmJnZvaWQgMCE9PWU/ZToxLzApLGZpbHRlclVwcGVyVmFsdWU6TWF0aC5tYXgobC5maWx0ZXJVcHBlclZhbHVlLG51bGwhPT0obj1udWxsPT1hP3ZvaWQgMDphLmZpbHRlclVwcGVyVmFsdWUpJiZ2b2lkIDAhPT1uP246LTEvMCksbWluVmFsdWU6TWF0aC5taW4obC5taW5WYWx1ZSxudWxsIT09KG89bnVsbD09YT92b2lkIDA6YS5taW5WYWx1ZSkmJnZvaWQgMCE9PW8/bzoxLzApLG1heFZhbHVlOk1hdGgubWF4KGwubWF4VmFsdWUsbnVsbCE9PShpPW51bGw9PWE/dm9pZCAwOmEubWF4VmFsdWUpJiZ2b2lkIDAhPT1pP2k6LTEvMCl9KX1mb3IoY29uc3RbdCx7dmFsdWVzOmUscG9zc2libGVWYWx1ZXM6bn1db2YgcilhLnNldCh0LHt0eXBlOlpSLkRJU0NSRVRFLGluY2x1ZGVVbmRlZmluZWQ6ITAscG9zc2libGVWYWx1ZXM6Wy4uLm5dLGZpbHRlclZhbHVlczpbLi4uZV19KTtmb3IoY29uc3RbdCx7bWluVmFsdWU6ZSxtYXhWYWx1ZTpuLGZpbHRlckxvd2VyVmFsdWU6byxmaWx0ZXJVcHBlclZhbHVlOml9XW9mIHMpe2lmKGEuaGFzKHQpKXtjb25zdCBlPWEuZ2V0KHQpO2lmKGUudHlwZT09PVpSLkRJU0NSRVRFJiZlLnBvc3NpYmxlVmFsdWVzLnNvbWUoKHQ9PnQpKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQ2Fubm90IGNvbWJpbmUgaHBhcmFtLCAke3R9LCBhcyBpdCBpcyBvZiBtaXhlZCB0eXBlcy5gKX1hLnNldCh0LHt0eXBlOlpSLklOVEVSVkFMLGluY2x1ZGVVbmRlZmluZWQ6ITAsbWluVmFsdWU6ZSxtYXhWYWx1ZTpuLGZpbHRlckxvd2VyVmFsdWU6byxmaWx0ZXJVcHBlclZhbHVlOml9KX1yZXR1cm4gYX1mdW5jdGlvbiBlQSh0KXt2YXIgZSxuLG8saTtjb25zdCBhPW5ldyBNYXA7Zm9yKGNvbnN0IHIgb2YgdClmb3IoY29uc3RbdCxzXW9mIHIpe2NvbnN0IHI9YS5nZXQodCk7YS5zZXQodCxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe3R5cGU6WlIuSU5URVJWQUwsaW5jbHVkZVVuZGVmaW5lZDohMH0scikse21pblZhbHVlOk1hdGgubWluKHMubWluVmFsdWUsbnVsbCE9PShlPW51bGw9PXI/dm9pZCAwOnIubWluVmFsdWUpJiZ2b2lkIDAhPT1lP2U6MS8wKSxtYXhWYWx1ZTpNYXRoLm1heChzLm1heFZhbHVlLG51bGwhPT0obj1udWxsPT1yP3ZvaWQgMDpyLm1heFZhbHVlKSYmdm9pZCAwIT09bj9uOi0xLzApLGZpbHRlckxvd2VyVmFsdWU6TWF0aC5taW4ocy5maWx0ZXJMb3dlclZhbHVlLG51bGwhPT0obz1udWxsPT1yP3ZvaWQgMDpyLmZpbHRlckxvd2VyVmFsdWUpJiZ2b2lkIDAhPT1vP286MS8wKSxmaWx0ZXJVcHBlclZhbHVlOk1hdGgubWF4KHMuZmlsdGVyVXBwZXJWYWx1ZSxudWxsIT09KGk9bnVsbD09cj92b2lkIDA6ci5maWx0ZXJVcHBlclZhbHVlKSYmdm9pZCAwIT09aT9pOi0xLzApfSkpfXJldHVybiBhfWNvbnN0IG5BPXlrKHtzcGVjczp7fSxmaWx0ZXJzOnt9fSxiayhLUiwoKHQsZSk9Pnt2YXIgbjtjb25zdHtleHBlcmltZW50SWRzOm8saHBhcmFtTmFtZTppLGZpbHRlclZhbHVlczphLGluY2x1ZGVVbmRlZmluZWQ6cn09ZSxzPSRSKG8pLGw9bnVsbCE9PShuPXQuZmlsdGVyc1tzXSkmJnZvaWQgMCE9PW4/bjp7aHBhcmFtczpuZXcgTWFwfSxjPWwuaHBhcmFtcy5nZXQoaSk7aWYoYyYmYy50eXBlIT09WlIuRElTQ1JFVEUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYE5ldyBkaXNjcmV0ZSBmaWx0ZXIgb2YgJHtpfSBjb25mbGljdHMgZXhpc3RpbmcgZmlsdGVyIG9mIGArWlJbYy50eXBlXSk7Y29uc3QgZD10QShvLmZpbHRlcigoZT0+Qm9vbGVhbih0LnNwZWNzW2VdKSkpLm1hcCgoZT0+dC5zcGVjc1tlXS5ocGFyYW0uZGVmYXVsdEZpbHRlcnMpKSkuZ2V0KGkpO2lmKCFkKXRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNldCBocGFyYW0sICR7aX0sIHdoZW4gaXQgaXMgbm90IGtub3duIGZvciBleHBlcmltZW50SWRzOiAke28uam9pbigiLCAiKX1gKTtpZihkLnR5cGUhPT1aUi5ESVNDUkVURSl0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzZXQgJHtpfSB3aGVuIGRlZmF1bHQgZmlsdGVyIGlzIG5vdCBvZiBkaXNjcmV0ZSB0eXBlLmApO2NvbnN0IHA9bmV3IFNldChkLnBvc3NpYmxlVmFsdWVzKSxtPVsuLi5hXS5maWx0ZXIoKHQ9PiFwLmhhcyh0KSkpO2lmKG0ubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgTmV3IGZpbHRlciBmb3IgJHtpfSBoYXMgbW9yZSB0aGFuIG9uZSB2YWx1ZSB0aGF0IGlzIG5vdCBwcmVzZW50IGluIHRoZSBzcGVjLiBCYWQgdmFsdWVzOiAke20uam9pbigiLCAiKX1gKTtjb25zdCB1PW5ldyBNYXAobC5ocGFyYW1zKTtyZXR1cm4gdS5zZXQoaSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYykse3R5cGU6WlIuRElTQ1JFVEUsaW5jbHVkZVVuZGVmaW5lZDpyLHBvc3NpYmxlVmFsdWVzOlsuLi5wXSxmaWx0ZXJWYWx1ZXM6YX0pKSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2ZpbHRlcnM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuZmlsdGVycykse1tzXTpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbCkse2hwYXJhbXM6dX0pfSl9KX0pKSxiayhKUiwoKHQsZSk9Pnt2YXIgbjtjb25zdHtleHBlcmltZW50SWRzOm8saHBhcmFtTmFtZTppLGZpbHRlckxvd2VyVmFsdWU6YSxmaWx0ZXJVcHBlclZhbHVlOnIsaW5jbHVkZVVuZGVmaW5lZDpzfT1lLGw9JFIobyksYz1udWxsIT09KG49dC5maWx0ZXJzW2xdKSYmdm9pZCAwIT09bj9uOnttZXRyaWNzOm5ldyBNYXAsaHBhcmFtczpuZXcgTWFwfSxkPWMuaHBhcmFtcy5nZXQoaSk7aWYoZCYmZC50eXBlIT09WlIuSU5URVJWQUwpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYE5ldyBpbnRlcnZhbCBmaWx0ZXIgb2YgJHtpfSBjb25mbGljdHMgZXhpc3RpbmcgZmlsdGVyIG9mIGArWlJbZC50eXBlXSk7Y29uc3QgcD10QShvLmZpbHRlcigoZT0+Qm9vbGVhbih0LnNwZWNzW2VdKSkpLm1hcCgoZT0+dC5zcGVjc1tlXS5ocGFyYW0uZGVmYXVsdEZpbHRlcnMpKSkuZ2V0KGkpO2lmKCFwKXRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNldCBocGFyYSwgJHtpfSwgd2hlbiBpdCBpcyBub3Qga25vd24gZm9yIGV4cGVyaW1lbnRJZHM6ICR7by5qb2luKCIsICIpfWApO2lmKHAudHlwZSE9PVpSLklOVEVSVkFMKXRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNldCAke2l9IHdoZW4gZGVmYXVsdCBmaWx0ZXIgaXMgbm90IG9mIGludGVydmFsIHR5cGUuYCk7Y29uc3QgbT1uZXcgTWFwKGMuaHBhcmFtcyk7cmV0dXJuIG0uc2V0KGksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGQpLHt0eXBlOlpSLklOVEVSVkFMLGluY2x1ZGVVbmRlZmluZWQ6cyxtaW5WYWx1ZTpwLm1pblZhbHVlLG1heFZhbHVlOnAubWF4VmFsdWUsZmlsdGVyTG93ZXJWYWx1ZTphLGZpbHRlclVwcGVyVmFsdWU6cn0pKSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2ZpbHRlcnM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuZmlsdGVycykse1tsXTpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYykse2hwYXJhbXM6bX0pfSl9KX0pKSxiayhRUiwoKHQsZSk9Pnt2YXIgbjtjb25zdHtleHBlcmltZW50SWRzOm8sbWV0cmljVGFnOmksZmlsdGVyTG93ZXJWYWx1ZTphLGZpbHRlclVwcGVyVmFsdWU6cixpbmNsdWRlVW5kZWZpbmVkOnN9PWUsbD0kUihvKSxjPW51bGwhPT0obj10LmZpbHRlcnNbbF0pJiZ2b2lkIDAhPT1uP246e21ldHJpY3M6bmV3IE1hcCxocGFyYW1zOm5ldyBNYXB9LGQ9ZUEoby5maWx0ZXIoKGU9PkJvb2xlYW4odC5zcGVjc1tlXSkpKS5tYXAoKGU9PnQuc3BlY3NbZV0ubWV0cmljLmRlZmF1bHRGaWx0ZXJzKSkpLmdldChpKTtpZighZCl0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzZXQgbWV0cmljLCAke2l9LCB3aGVuIGl0IGlzIG5vdCBrbm93biBmb3IgZXhwZXJpbWVudElkczogJHtvLmpvaW4oIiwgIil9YCk7Y29uc3QgcD1jLm1ldHJpY3MuZ2V0KGkpLG09bmV3IE1hcChjLm1ldHJpY3MpO3JldHVybiBtLnNldChpLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxwKSx7dHlwZTpaUi5JTlRFUlZBTCxpbmNsdWRlVW5kZWZpbmVkOnMsbWluVmFsdWU6ZC5taW5WYWx1ZSxtYXhWYWx1ZTpkLm1heFZhbHVlLGZpbHRlckxvd2VyVmFsdWU6YSxmaWx0ZXJVcHBlclZhbHVlOnJ9KSksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtmaWx0ZXJzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmZpbHRlcnMpLHtbbF06T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGMpLHttZXRyaWNzOm19KX0pfSl9KSksYmsoelIsKCh0LGUpPT57dmFyIG4sbyxpLGE7aWYoMD09PU9iamVjdC5rZXlzKGUubmV3UnVuc0FuZE1ldGFkYXRhKS5sZW5ndGgpcmV0dXJuIHQ7Y29uc3Qgcj1PYmplY3QuYXNzaWduKHt9LHQuc3BlY3MpLHM9bmV3IE1hcCxsPW5ldyBTZXQ7Zm9yKGNvbnN0IHQgb2YgT2JqZWN0LmtleXMoZS5uZXdSdW5zQW5kTWV0YWRhdGEpKXtjb25zdCBjPW5ldyBNYXAsZD1uZXcgTWFwLHA9bmV3IE1hcCxtPW5ldyBNYXAse3J1bnM6dSxtZXRhZGF0YTpmfT1lLm5ld1J1bnNBbmRNZXRhZGF0YVt0XTtmb3IoY29uc3QgdCBvZiB1KXtjb25zdCBlPWYucnVuVG9IcGFyYW1zQW5kTWV0cmljc1t0LmlkXTtpZihlKWZvcihjb25zdCB0IG9mIGUubWV0cmljcyl7Y29uc3QgZT1zLmdldCh0LnRhZyk7cy5zZXQodC50YWcse21pbjplP01hdGgubWluKGUubWluLHQudmFsdWUpOnQudmFsdWUsbWF4OmU/TWF0aC5tYXgoZS5tYXgsdC52YWx1ZSk6dC52YWx1ZX0pfX1mb3IoY29uc3R7bmFtZTp0LGRvbWFpbjplfW9mIGYuaHBhcmFtU3BlY3MpaWYoZS50eXBlPT09WlIuRElTQ1JFVEUpe2NvbnN0IG49cC5nZXQodCl8fG5ldyBTZXQ7Zm9yKGNvbnN0IHQgb2YgZS52YWx1ZXMpbi5hZGQodCk7cC5zZXQodCxuKX1lbHNle2NvbnN0IG49bS5nZXQodCk7bS5zZXQodCx7bWluVmFsdWU6bj9NYXRoLm1pbihlLm1pblZhbHVlLG4ubWluVmFsdWUpOmUubWluVmFsdWUsbWF4VmFsdWU6bj9NYXRoLm1heChlLm1heFZhbHVlLG4ubWF4VmFsdWUpOmUubWF4VmFsdWV9KX1mb3IoY29uc3QgdCBvZiBmLm1ldHJpY1NwZWNzKWwuYWRkKHQudGFnKTtmb3IoY29uc3RbdCxlXW9mIHApYy5zZXQodCx7dHlwZTpaUi5ESVNDUkVURSxpbmNsdWRlVW5kZWZpbmVkOiEwLHBvc3NpYmxlVmFsdWVzOlsuLi5lXSxmaWx0ZXJWYWx1ZXM6Wy4uLmVdfSk7Zm9yKGNvbnN0W3Qse21pblZhbHVlOmUsbWF4VmFsdWU6bn1db2YgbSljLnNldCh0LHt0eXBlOlpSLklOVEVSVkFMLGluY2x1ZGVVbmRlZmluZWQ6ITAsbWluVmFsdWU6ZSxtYXhWYWx1ZTpuLGZpbHRlckxvd2VyVmFsdWU6ZSxmaWx0ZXJVcHBlclZhbHVlOm59KTtmb3IoY29uc3QgdCBvZiBsKXtjb25zdCBlPXMuZ2V0KHQpLGk9bnVsbCE9PShuPW51bGw9PWU/dm9pZCAwOmUubWluKSYmdm9pZCAwIT09bj9uOjAsYT1udWxsIT09KG89bnVsbD09ZT92b2lkIDA6ZS5tYXgpJiZ2b2lkIDAhPT1vP286MDtkLnNldCh0LHt0eXBlOlpSLklOVEVSVkFMLGluY2x1ZGVVbmRlZmluZWQ6ITAsbWluVmFsdWU6aSxtYXhWYWx1ZTphLGZpbHRlckxvd2VyVmFsdWU6aSxmaWx0ZXJVcHBlclZhbHVlOmF9KX1yW3RdPXtocGFyYW06T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG51bGw9PT0oaT1yW3RdKXx8dm9pZCAwPT09aT92b2lkIDA6aS5ocGFyYW0pLHtzcGVjczpmLmhwYXJhbVNwZWNzLGRlZmF1bHRGaWx0ZXJzOmN9KSxtZXRyaWM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG51bGw9PT0oYT1yW3RdKXx8dm9pZCAwPT09YT92b2lkIDA6YS5tZXRyaWMpLHtzcGVjczpmLm1ldHJpY1NwZWNzLGRlZmF1bHRGaWx0ZXJzOmR9KX19cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7c3BlY3M6cn0pfSkpKTtmdW5jdGlvbiBvQSh0LGUpe3JldHVybiBuQSh0LGUpfWNsYXNzIGlBe31pQS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8aUEpfSxpQS7JtW1vZD1hbyh7dHlwZTppQX0pLGlBLsm1aW5qPXZuKHtpbXBvcnRzOltbZGsuZm9yRmVhdHVyZShUUixvQSldXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoaUEsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltkay5mb3JGZWF0dXJlKFRSLG9BKV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhpQSx7aW1wb3J0czpbY2tdfSk7Y2xhc3MgYUF7fWZ1bmN0aW9uIHJBKHQsZSl7cmV0dXJuYCR7ZX0vJHt0fWB9YUEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGFBKX0sYUEuybVtb2Q9YW8oe3R5cGU6YUF9KSxhQS7JtWluaj12bih7aW1wb3J0czpbW2lBXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGFBLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbaUFdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oYUEse2ltcG9ydHM6W2lBXX0pO2NsYXNzIHNBe2NvbnN0cnVjdG9yKHQpe3RoaXMuaHR0cD10fWZldGNoUnVucyh0KXtyZXR1cm4gdGhpcy5odHRwLmdldCgiZGF0YS9ydW5zIikucGlwZShJdCgoZT0+ZS5tYXAoKGU9Pih7aWQ6ckEoZSx0KSxuYW1lOmUsc3RhcnRUaW1lOjB9KSkpKSkpfWZldGNoSHBhcmFtc01ldGFkYXRhKHQpe3JldHVybiBFdCh7aHBhcmFtU3BlY3M6W10sbWV0cmljU3BlY3M6W10scnVuVG9IcGFyYW1zQW5kTWV0cmljczp7fX0pfX1zQS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8c0EpKHZyKGxFKSl9LHNBLsm1cHJvdj1Nbih7dG9rZW46c0EsZmFjdG9yeTpzQS7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoc0EsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmxFfV19KSxudWxsKTtjbGFzcyBsQXt9bEEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGxBKX0sbEEuybVtb2Q9YW8oe3R5cGU6bEF9KSxsQS7JtWluaj12bih7cHJvdmlkZXJzOlt7cHJvdmlkZTpYUix1c2VDbGFzczpzQX1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChsQSxbe3R5cGU6QXksYXJnczpbe3Byb3ZpZGVyczpbe3Byb3ZpZGU6WFIsdXNlQ2xhc3M6c0F9XX1dfV0sbnVsbCxudWxsKTtjb25zdCBjQT0iYWxlcnRzIixkQT1adyhLdyhjQSksKHQ9PnQubGF0ZXN0QWxlcnQpKSxwQT0iZXhwZXJpbWVudHMiLG1BPVp3KEt3KHBBKSwodD0+dC5kYXRhKSksdUE9WncobUEsKCh0LGUpPT57Y29uc3R7ZXhwZXJpbWVudElkOm59PWU7cmV0dXJuIHQuZXhwZXJpbWVudE1hcFtuXXx8bnVsbH0pKTsKLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4KCiAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKICAgIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC4KCiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSAogICAgUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCiAgICBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsCiAgICBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00KICAgIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCiAgICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAgICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KZnVuY3Rpb24gZkEodCxlKXt2YXIgbj17fTtmb3IodmFyIG8gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxvKSYmZS5pbmRleE9mKG8pPDAmJihuW29dPXRbb10pO2lmKG51bGwhPXQmJiJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgaT0wO2ZvcihvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7aTxvLmxlbmd0aDtpKyspZS5pbmRleE9mKG9baV0pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LG9baV0pJiYobltvW2ldXT10W29baV1dKX1yZXR1cm4gbn1mdW5jdGlvbiBnQSh0LGUsbixvKXtyZXR1cm4gbmV3KG58fChuPVByb21pc2UpKSgoZnVuY3Rpb24oaSxhKXtmdW5jdGlvbiByKHQpe3RyeXtsKG8ubmV4dCh0KSl9Y2F0Y2godCl7YSh0KX19ZnVuY3Rpb24gcyh0KXt0cnl7bChvLnRocm93KHQpKX1jYXRjaCh0KXthKHQpfX1mdW5jdGlvbiBsKHQpe3QuZG9uZT9pKHQudmFsdWUpOihmdW5jdGlvbiBlKHQpe3JldHVybiB0IGluc3RhbmNlb2Ygbj90Om5ldyBuKChmdW5jdGlvbihlKXtlKHQpfSkpfSkodC52YWx1ZSkudGhlbihyLHMpfWwoKG89by5hcHBseSh0LGV8fFtdKSkubmV4dCgpKX0pKX12YXIgaEEsYkEseUE7IShmdW5jdGlvbih0KXt0LlNDQUxBUlM9InNjYWxhcnMiLHQuSElTVE9HUkFNUz0iaGlzdG9ncmFtcyIsdC5JTUFHRVM9ImltYWdlcyJ9KShoQXx8KGhBPXt9KSksKGZ1bmN0aW9uKHQpe3QuREVGQVVMVD0iZGVmYXVsdCIsdC5BU0NFTkRJTkc9ImFzY2VuZGluZyIsdC5ERVNDRU5ESU5HPSJkZXNjZW5kaW5nIix0Lk5FQVJFU1Q9Im5lYXJlc3QifSkoYkF8fChiQT17fSkpLChmdW5jdGlvbih0KXt0W3QuU1RFUD0wXT0iU1RFUCIsdFt0LlJFTEFUSVZFPTFdPSJSRUxBVElWRSIsdFt0LldBTExfVElNRT0yXT0iV0FMTF9USU1FIn0pKHlBfHwoeUE9e30pKTtjb25zdCBfQT0idGltZXNlcmllcyIsQ0E9W2hBLklNQUdFU107ZnVuY3Rpb24gTUEodCl7cmV0dXJuIENBLmluY2x1ZGVzKHQpfWNvbnN0IHZBPVtoQS5ISVNUT0dSQU1TLGhBLklNQUdFU107ZnVuY3Rpb24geEEodCl7cmV0dXJuIHZBLmluY2x1ZGVzKHQpfWZ1bmN0aW9uIE9BKHQpe3JldHVybiB4QSh0LnBsdWdpbil9Y2xhc3MgUEF7fWZ1bmN0aW9uIHdBKHQpe3JldHVybiB0Lmhhc093blByb3BlcnR5KCJlcnJvciIpfWNvbnN0IGtBPSJkYXRhL3BsdWdpbi90aW1lc2VyaWVzIjtmdW5jdGlvbiBTQSh0KXtjb25zdCBlPXQuaW5kZXhPZigiLyIpO3JldHVybntydW46dC5zdWJzdHJpbmcoZSsxKSxleHBlcmltZW50SWQ6dC5zdWJzdHJpbmcoMCxlKX19ZnVuY3Rpb24gREEodCxlKXtyZXR1cm5gJHtlfS8ke3R9YH1mdW5jdGlvbiBFQSh0LGUpe2NvbnN0e3J1blRvU2VyaWVzOm4scnVuOm99PXQsaT1mQSh0LFsicnVuVG9TZXJpZXMiLCJydW4iXSksYT1PYmplY3QuYXNzaWduKHt9LGkpO3JldHVybiBuJiYoYS5ydW5Ub1Nlcmllcz1SQShuLGUpKSxvJiYoYS5ydW5JZD1EQShvLGUpKSxhfWZ1bmN0aW9uIFJBKHQsZSl7Y29uc3Qgbj17fTtmb3IoY29uc3QgbyBpbiB0KXQuaGFzT3duUHJvcGVydHkobykmJihuW0RBKG8sZSldPXRbb10pO3JldHVybiBufWNsYXNzIEFBe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5odHRwPXQsdGhpcy5zdG9yZT1lfWZldGNoVGFnTWV0YWRhdGEodCl7Y29uc3QgZT10Lm1hcCgodD0+dGhpcy5odHRwLmdldChgL2V4cGVyaW1lbnQvJHt0fS8ke2tBfS90YWdzYCkucGlwZShJdCgoZT0+KGZ1bmN0aW9uIG4odCxlKXtjb25zdCBuPXt9O2Zvcihjb25zdCBvIG9mIE9iamVjdC5rZXlzKHQpKXtjb25zdCBpPW87aWYoTUEoaSkpe2NvbnN0IG89dFtpXSx7dGFnUnVuU2FtcGxlZEluZm86YX09byxyPWZBKG8sWyJ0YWdSdW5TYW1wbGVkSW5mbyJdKSxzPXt9O2Zvcihjb25zdCB0IGluIGEpYS5oYXNPd25Qcm9wZXJ0eSh0KSYmKHNbdF09UkEoYVt0XSxlKSk7bltpXT1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scikse3RhZ1J1blNhbXBsZWRJbmZvOnN9KX1lbHNle2NvbnN0IG89dFtpXSx7cnVuVGFnSW5mbzphfT1vLHI9ZkEobyxbInJ1blRhZ0luZm8iXSk7bltpXT1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scikse3J1blRhZ0luZm86UkEoYSxlKX0pfX1yZXR1cm4gbn0pKGUsdCkpKSkpKSxuPXRoaXMuc3RvcmUuc2VsZWN0KHFEKS5waXBlKGNlKEJvb2xlYW4pLGJlKDEpLFZlKHRoaXMuc3RvcmUuc2VsZWN0KG9FKSksSXQoKChbLHRdKT0+dCkpKTtyZXR1cm4gJHQoZSkucGlwZShWZShuKSxJdCgoKFt0LGVdKT0+e2NvbnN0IG49KGZ1bmN0aW9uIG8odCl7Y29uc3QgZT17fTtmb3IoY29uc3QgbiBvZiB0KWZvcihjb25zdCB0IG9mIE9iamVjdC52YWx1ZXMoaEEpKWlmKE1BKHQpKXtlW3RdPWVbdF18fHt0YWdEZXNjcmlwdGlvbnM6e30sdGFnUnVuU2FtcGxlZEluZm86e319O2NvbnN0e3RhZ0Rlc2NyaXB0aW9uczpvLHRhZ1J1blNhbXBsZWRJbmZvOml9PW5bdF07ZVt0XS50YWdEZXNjcmlwdGlvbnM9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGVbdF0udGFnRGVzY3JpcHRpb25zKSxvKTtjb25zdCBhPWVbdF0udGFnUnVuU2FtcGxlZEluZm87Zm9yKGNvbnN0IHQgb2YgT2JqZWN0LmtleXMoaSkpe2FbdF09YVt0XXx8e307Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXMoaVt0XSkpYVt0XVtlXT1pW3RdW2VdfX1lbHNle2VbdF09ZVt0XXx8e3RhZ0Rlc2NyaXB0aW9uczp7fSxydW5UYWdJbmZvOnt9fTtjb25zdHt0YWdEZXNjcmlwdGlvbnM6byxydW5UYWdJbmZvOml9PW5bdF07ZVt0XS50YWdEZXNjcmlwdGlvbnM9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGVbdF0udGFnRGVzY3JpcHRpb25zKSxvKSxlW3RdLnJ1blRhZ0luZm89T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGVbdF0ucnVuVGFnSW5mbyksaSl9cmV0dXJuIGV9KSh0KTtyZXR1cm4gZXx8KG5baEEuSU1BR0VTXT17dGFnRGVzY3JpcHRpb25zOnt9LHRhZ1J1blNhbXBsZWRJbmZvOnt9fSksbn0pKSl9ZmV0Y2hUaW1lU2VyaWVzKHQpe2NvbnN0IGU9dC5tYXAoKHQ9PntpZih4QSh0LnBsdWdpbikpe2NvbnN0IGU9dCx7cnVuSWQ6bn09ZSxvPWZBKGUsWyJydW5JZCJdKSx7cnVuOmksZXhwZXJpbWVudElkOmF9PVNBKG4pLHI9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG8pLHtydW46aX0pO3JldHVybiB0aGlzLmZldGNoVGltZVNlcmllc0JhY2tlbmRSZXF1ZXN0KHIsYSkucGlwZShJdCgoKHtyZXNwb25zZTp0LGV4cGVyaW1lbnRJZDplfSk9PkVBKHQsZSkpKSl9Y29uc3QgZT10LHtleHBlcmltZW50SWRzOm59PWUsbz1mQShlLFsiZXhwZXJpbWVudElkcyJdKTtyZXR1cm4gJHQobi5tYXAoKHQ9PnRoaXMuZmV0Y2hUaW1lU2VyaWVzQmFja2VuZFJlcXVlc3Qobyx0KSkpKS5waXBlKEl0KCh0PT57Y29uc3QgZT1mQSh0WzBdLnJlc3BvbnNlLFsicnVuVG9TZXJpZXMiLCJlcnJvciJdKTtmb3IoY29uc3R7cmVzcG9uc2U6bixleHBlcmltZW50SWQ6b31vZiB0KXtjb25zdCB0PUVBKG4sbyk7aWYoZS5lcnJvciljb250aW51ZTtjb25zdHtydW5Ub1NlcmllczppLGVycm9yOmF9PXQ7aWYoYSllLmVycm9yPWEsZS5ydW5Ub1Nlcmllcz12b2lkIDA7ZWxzZXtlLnJ1blRvU2VyaWVzPWUucnVuVG9TZXJpZXN8fHt9O2Zvcihjb25zdCB0IG9mIE9iamVjdC5rZXlzKGkpKWUucnVuVG9TZXJpZXNbdF09aVt0XX19cmV0dXJuIGV9KSkpfSkpO3JldHVybiAkdChlKX1mZXRjaFRpbWVTZXJpZXNCYWNrZW5kUmVxdWVzdCh0LGUpe2NvbnN0IG49bmV3IEZvcm1EYXRhO3JldHVybiBuLmFwcGVuZCgicmVxdWVzdHMiLEpTT04uc3RyaW5naWZ5KFt0XSkpLHRoaXMuaHR0cC5wb3N0KGAvZXhwZXJpbWVudC8ke2V9LyR7a0F9L3RpbWVTZXJpZXNgLG4pLnBpcGUoSXQoKHQ9Pih7cmVzcG9uc2U6dFswXSxleHBlcmltZW50SWQ6ZX0pKSkpfWltYWdlVXJsKHQpe3JldHVybmAke2tBfS9pbWFnZURhdGE/aW1hZ2VJZD0ke3R9YH1kb3dubG9hZFVybCh0LGUsbixvKXtjb25zdHtydW46aSxleHBlcmltZW50SWQ6YX09U0Eobik7bGV0IHI7c3dpdGNoKHQpe2Nhc2UgaEEuU0NBTEFSUzpyPSJzY2FsYXJzL3NjYWxhcnMiO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBOb3QgaW1wbGVtZW50ZWQ6IGRvd25sb2FkVXJsIGZvciAke3R9IGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXRgKX1pZighYSl0aHJvdyBuZXcgRXJyb3IoImV4cGVyaW1lbnRJZCBpcyBlbXB0eTsgaXQgaXMgcmVxdWlyZWQgdG8gZm9ybSBkb3dubG9hZFVybC4iKTtyZXR1cm5gL2V4cGVyaW1lbnQvJHthfS9kYXRhL3BsdWdpbi8ke3J9PyR7bmV3IFVSTFNlYXJjaFBhcmFtcyh7dGFnOmUscnVuOmksZm9ybWF0Om99KX1gfX1BQS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8QUEpKHZyKGxFKSx2cihJdykpfSxBQS7JtXByb3Y9TW4oe3Rva2VuOkFBLGZhY3Rvcnk6QUEuybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEFBLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpsRX0se3R5cGU6SXd9XX0pLG51bGwpO2NsYXNzIFRBe31UQS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VEEpfSxUQS7JtXByb3Y9TW4oe3Rva2VuOlRBLGZhY3Rvcnk6VEEuybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFRBLFt7dHlwZTppbX1dLG51bGwsbnVsbCk7Y29uc3QgTkE9ImV4cGVyaW1lbnRhbFBsdWdpbiIsekE9InNjYWxhcnNCYXRjaFNpemUiLElBPSJlbmFibGVDb2xvckdyb3VwIixIQT0iZW5hYmxlQ29sb3JHcm91cEJ5UmVnZXgiLEZBPSJkYXJrTW9kZSIsTEE9ImVuYWJsZUxpbmtUaW1lIixCQT1uZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO2NsYXNzIFZBe2dldFBhcmFtcygpe3JldHVybiBCQX19VkEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFZBKX0sVkEuybVwcm92PU1uKHt0b2tlbjpWQSxmYWN0b3J5OlZBLsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChWQSxbe3R5cGU6aW19XSxudWxsLG51bGwpO2NsYXNzIGpBe2NvbnN0cnVjdG9yKHQpe3RoaXMucXVlcnlQYXJhbXM9dH1nZXRGZWF0dXJlcyh0PSExKXtjb25zdCBlPXRoaXMucXVlcnlQYXJhbXMuZ2V0UGFyYW1zKCksbj10P3RoaXMuZ2V0UGFydGlhbEZlYXR1cmVzRnJvbU1lZGlhUXVlcnkoKTp7fTtyZXR1cm4gZS5oYXMoTkEpJiYobi5lbmFibGVkRXhwZXJpbWVudGFsUGx1Z2lucz1lLmdldEFsbChOQSkpLGUuaGFzKCJ0ZW5zb3Jib2FyZENvbGFiIikmJihuLmluQ29sYWI9InRydWUiPT09ZS5nZXQoInRlbnNvcmJvYXJkQ29sYWIiKSksZS5oYXMoekEpJiYobi5zY2FsYXJzQmF0Y2hTaXplPU51bWJlcihlLmdldCh6QSkpKSxlLmhhcyhJQSkmJihuLmVuYWJsZWRDb2xvckdyb3VwPSJmYWxzZSIhPT1lLmdldChJQSkpLGUuaGFzKEhBKSYmKG4uZW5hYmxlZENvbG9yR3JvdXBCeVJlZ2V4PSJmYWxzZSIhPT1lLmdldChIQSkpLGUuaGFzKEZBKSYmKG4uZGVmYXVsdEVuYWJsZURhcmtNb2RlPSJmYWxzZSIhPT1lLmdldChGQSkpLGUuaGFzKExBKSYmKG4uZW5hYmxlZExpbmtlZFRpbWU9ImZhbHNlIiE9PWUuZ2V0KExBKSksbn1nZXRQYXJ0aWFsRmVhdHVyZXNGcm9tTWVkaWFRdWVyeSgpe2NvbnN0IHQ9e307cmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIikubWF0Y2hlcyYmKHQuZGVmYXVsdEVuYWJsZURhcmtNb2RlPSEwKSx0fX1qQS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8akEpKHZyKFZBKSl9LGpBLsm1cHJvdj1Nbih7dG9rZW46akEsZmFjdG9yeTpqQS7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoakEsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlZBfV19KSxudWxsKTtjbGFzcyBVQXt9VUEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFVBKX0sVUEuybVtb2Q9YW8oe3R5cGU6VUF9KSxVQS7JtWluaj12bih7cHJvdmlkZXJzOltqQSxWQSx7cHJvdmlkZTpUQSx1c2VDbGFzczpqQX1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChVQSxbe3R5cGU6QXksYXJnczpbe3Byb3ZpZGVyczpbakEsVkEse3Byb3ZpZGU6VEEsdXNlQ2xhc3M6akF9XX1dfV0sbnVsbCxudWxsKTtjb25zdCBHQT1KUCgiW0ZFQVRVUkUgRkxBR10gUGFydGlhbCBGZWF0dXJlIEZsYWdzIExvYWRlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLFdBPUpQKCJbRkVBVFVSRSBGTEFHXSBFbmFibGUgRGFyayBNb2RlIE92ZXJyaWRlIENoYW5nZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxZQT1KUCgiW0ZFQVRVUkUgRkxBR10gRWZmZWN0cyBJbml0Iik7Y2xhc3MgcUF7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuYWN0aW9ucyQ9dCx0aGlzLnN0b3JlPWUsdGhpcy5kYXRhU291cmNlPW4sdGhpcy5nZXRGZWF0dXJlRmxhZ3MkPU1rKCgoKT0+dGhpcy5hY3Rpb25zJC5waXBlKERrKFlBKSxmZSh0aGlzLnN0b3JlLnNlbGVjdChLRCkpLEl0KCgoWyx0XSk9Pntjb25zdCBlPXRoaXMuZGF0YVNvdXJjZS5nZXRGZWF0dXJlcyh0KTtyZXR1cm4gR0Eoe2ZlYXR1cmVzOmV9KX0pKSkpKX1uZ3J4T25Jbml0RWZmZWN0cygpe3JldHVybiBZQSgpfX1xQS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8cUEpKHZyKFNrKSx2cihJdyksdnIoVEEpKX0scUEuybVwcm92PU1uKHt0b2tlbjpxQSxmYWN0b3J5OnFBLsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChxQSxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6U2t9LHt0eXBlOkl3fSx7dHlwZTpUQX1dfSksbnVsbCk7Y29uc3QgWkE9e2lzRmVhdHVyZUZsYWdzTG9hZGVkOiExLGRlZmF1bHRGbGFnczp7aXNBdXRvRGFya01vZGVBbGxvd2VkOiEwLGRlZmF1bHRFbmFibGVEYXJrTW9kZTohMSxlbmFibGVEYXJrTW9kZU92ZXJyaWRlOm51bGwsZW5hYmxlZENvbG9yR3JvdXA6ITAsZW5hYmxlZENvbG9yR3JvdXBCeVJlZ2V4OiEwLGVuYWJsZWRFeHBlcmltZW50YWxQbHVnaW5zOltdLGluQ29sYWI6ITEsc2NhbGFyc0JhdGNoU2l6ZTp2b2lkIDAsbWV0cmljc0ltYWdlU3VwcG9ydEVuYWJsZWQ6ITAsZW5hYmxlZExpbmtlZFRpbWU6ITEsZW5hYmxlVGltZVNlcmllc1Byb21vdGlvbjohMX0sZmxhZ092ZXJyaWRlczp7fX0sWEE9bmV3IEdhKCJbRmVhdHVyZSBGbGFnXSBTdG9yZSBDb25maWciKTtmdW5jdGlvbiBLQSgpe3JldHVybntpbml0aWFsU3RhdGU6WkF9fWNvbnN0IEpBPXlrKFpBLGJrKEdBLCgodCx7ZmVhdHVyZXM6ZX0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2lzRmVhdHVyZUZsYWdzTG9hZGVkOiEwLGZsYWdPdmVycmlkZXM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuZmxhZ092ZXJyaWRlcyksZSl9KSkpLGJrKFdBLCgodCx7ZW5hYmxlRGFya01vZGU6ZX0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2ZsYWdPdmVycmlkZXM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuZmxhZ092ZXJyaWRlcykse2VuYWJsZURhcmtNb2RlT3ZlcnJpZGU6ZX0pfSkpKSxiayhXUywoKHQse3BhcnRpYWxTZXR0aW5nczplfSk9PntpZighZS50aGVtZU92ZXJyaWRlKXJldHVybiB0O2xldCBuO3N3aXRjaChlLnRoZW1lT3ZlcnJpZGUpe2Nhc2UgR1MuQlJPV1NFUl9ERUZBVUxUOm49bnVsbDticmVhaztjYXNlIEdTLkRBUks6bj0hMDticmVhaztjYXNlIEdTLkxJR0hUOm49ITF9cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7ZmxhZ092ZXJyaWRlczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5mbGFnT3ZlcnJpZGVzKSx7ZW5hYmxlRGFya01vZGVPdmVycmlkZTpufSl9KX0pKSk7ZnVuY3Rpb24gUUEodCxlKXtyZXR1cm4gSkEodCxlKX1mdW5jdGlvbiAkQSgpe3JldHVybiBadyhRRCwodD0+bnVsbD09PXQ/e3RoZW1lT3ZlcnJpZGU6R1MuQlJPV1NFUl9ERUZBVUxUfTp7dGhlbWVPdmVycmlkZTp0P0dTLkRBUks6R1MuTElHSFR9KSl9Y2xhc3MgdFR7fXRULsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx0VCl9LHRULsm1bW9kPWFvKHt0eXBlOnRUfSksdFQuybVpbmo9dm4oe3Byb3ZpZGVyczpbe3Byb3ZpZGU6WEEsdXNlRmFjdG9yeTpLQX1dLGltcG9ydHM6W1tVQSxkay5mb3JGZWF0dXJlKFdELFFBLFhBKSxXay5mb3JGZWF0dXJlKFtxQV0pLHFTLmRlZmluZUdsb2JhbFNldHRpbmcoJEEpXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHRULFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbVUEsZGsuZm9yRmVhdHVyZShXRCxRQSxYQSksV2suZm9yRmVhdHVyZShbcUFdKSxxUy5kZWZpbmVHbG9iYWxTZXR0aW5nKCRBKV0scHJvdmlkZXJzOlt7cHJvdmlkZTpYQSx1c2VGYWN0b3J5OktBfV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyh0VCx7aW1wb3J0czpbVUEsY2ssR2sscVNdfSk7Y2xhc3MgZVR7fWZ1bmN0aW9uIG5UKHQsZSxuLG8pe3JldHVybiB0W2VdLmhhc093blByb3BlcnR5KG4pP01BKGUpP3RbZV1bbl0uaGFzT3duUHJvcGVydHkobyk/dFtlXVtuXVtvXTpudWxsOnRbZV1bbl06bnVsbH1mdW5jdGlvbiBvVCh0LGUsbixvKXtpZihNQShlKSl7Y29uc3QgaT1PYmplY3QuYXNzaWduKHt9LHRbZV0pLGE9KGZ1bmN0aW9uIGkodCxlLG4pe2NvbnN0IG89dC5oYXNPd25Qcm9wZXJ0eShlKT9PYmplY3QuYXNzaWduKHt9LHRbZV0pOnt9LGk9by5oYXNPd25Qcm9wZXJ0eShuKTtyZXR1cm4gb1tuXT1pP09iamVjdC5hc3NpZ24oe30sb1tuXSk6e3J1blRvU2VyaWVzOnt9LHJ1blRvTG9hZFN0YXRlOnt9fSxvfSkoaSxuLG8pO3JldHVybiBpW25dPWEsaX1jb25zdCBhPU9iamVjdC5hc3NpZ24oe30sdFtlXSkscj1hLmhhc093blByb3BlcnR5KG4pO3JldHVybiBhW25dPXI/T2JqZWN0LmFzc2lnbih7fSxhW25dKTp7cnVuVG9TZXJpZXM6e30scnVuVG9Mb2FkU3RhdGU6e319LGF9ZnVuY3Rpb24gaVQodCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHQpfWZ1bmN0aW9uIGFUKHQsZSxuKXtjb25zdCBvPU9iamVjdC5hc3NpZ24oe30sbik7Zm9yKGNvbnN0IG4gb2YgZSlvW25dPXQ7cmV0dXJuIG99ZnVuY3Rpb24gclQodCxlLG4sbyl7aWYoTUEoZSkpe2NvbnN0IGk9dFtlXS50YWdSdW5TYW1wbGVkSW5mbztyZXR1cm4gaS5oYXNPd25Qcm9wZXJ0eShuKT9PYmplY3Qua2V5cyhpW25dKS5maWx0ZXIoKHQ9Pm88aVtuXVt0XS5tYXhTYW1wbGVzUGVyU3RlcCkpOltdfWNvbnN0IGk9dFtlXS50YWdUb1J1bnM7cmV0dXJuIGkuaGFzT3duUHJvcGVydHkobik/aVtuXTpbXX1mdW5jdGlvbiBzVCh0LGUsbixvLGksYSl7Y29uc3Qgcj1uZXcgU2V0KHQpLHM9W107Zm9yKGNvbnN0IG8gb2YgdClmb3IoY29uc3QgdCBvZiBlKWlmKChsPW5bdF0pLnBsdWdpbj09PShjPW8pLnBsdWdpbiYmbC50YWc9PT1jLnRhZyYmbC5zYW1wbGU9PT1jLnNhbXBsZSYmKGwucnVuSWQ9PT1jLnJ1bklkfHwhbC5ydW5JZCYmIWMucnVuSWQpKXtzLnB1c2godCksci5kZWxldGUobyk7YnJlYWt9dmFyIGwsYztpZighcy5sZW5ndGgpcmV0dXJue3VucmVzb2x2ZWRJbXBvcnRlZFBpbm5lZENhcmRzOnQsY2FyZE1ldGFkYXRhTWFwOm4sY2FyZFRvUGlubmVkQ29weTpvLHBpbm5lZENhcmRUb09yaWdpbmFsOmksY2FyZFN0ZXBJbmRleDphfTtsZXQgZD17Y2FyZFRvUGlubmVkQ29weTpvLHBpbm5lZENhcmRUb09yaWdpbmFsOmksY2FyZFN0ZXBJbmRleDphLGNhcmRNZXRhZGF0YU1hcDpufTtmb3IoY29uc3QgdCBvZiBzKWQ9bFQodCxkLmNhcmRUb1Bpbm5lZENvcHksZC5waW5uZWRDYXJkVG9PcmlnaW5hbCxkLmNhcmRTdGVwSW5kZXgsZC5jYXJkTWV0YWRhdGFNYXApO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZCkse3VucmVzb2x2ZWRJbXBvcnRlZFBpbm5lZENhcmRzOlsuLi5yXX0pfWZ1bmN0aW9uIGxUKHQsZSxuLG8saSl7aWYoZS5oYXModCkpcmV0dXJue2NhcmRUb1Bpbm5lZENvcHk6ZSxwaW5uZWRDYXJkVG9PcmlnaW5hbDpuLGNhcmRTdGVwSW5kZXg6byxjYXJkTWV0YWRhdGFNYXA6aX07Y29uc3QgYT1uZXcgTWFwKGUpLHI9bmV3IE1hcChuKSxzPU9iamVjdC5hc3NpZ24oe30sbyksbD1PYmplY3QuYXNzaWduKHt9LGkpLGM9KGZ1bmN0aW9uIGQodCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHtiYXNlQ2FyZElkOnR9KX0pKHQpO2Euc2V0KHQsYyksci5zZXQoYyx0KSxvLmhhc093blByb3BlcnR5KHQpJiYoc1tjXT1vW3RdKTtjb25zdCBwPWlbdF07aWYoIXApdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcGluIGEgY2FyZCB3aXRob3V0IG1ldGFkYXRhIik7cmV0dXJuIGxbY109cCx7Y2FyZFRvUGlubmVkQ29weTphLHBpbm5lZENhcmRUb09yaWdpbmFsOnIsY2FyZFN0ZXBJbmRleDpzLGNhcmRNZXRhZGF0YU1hcDpsfX1mdW5jdGlvbiBjVCh0KXtyZXR1cm4gdC5waW5uZWRDYXJkVG9PcmlnaW5hbC5zaXplK3QudW5yZXNvbHZlZEltcG9ydGVkUGlubmVkQ2FyZHMubGVuZ3RoPDEwfWVULsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxlVCl9LGVULsm1bW9kPWFvKHt0eXBlOmVUfSksZVQuybVpbmo9dm4oe3Byb3ZpZGVyczpbe3Byb3ZpZGU6UEEsdXNlQ2xhc3M6QUF9XSxpbXBvcnRzOltbdFQsY0VdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZVQsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOlt0VCxjRV0scHJvdmlkZXJzOlt7cHJvdmlkZTpQQSx1c2VDbGFzczpBQX1dfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oZVQse2ltcG9ydHM6W3RULGNFXX0pO2NvbnN0IGRUPSJtZXRyaWNzIixwVD17dG9vbHRpcFNvcnQ6YkEuREVGQVVMVCxpZ25vcmVPdXRsaWVyczohMCx4QXhpc1R5cGU6eUEuU1RFUCxzY2FsYXJTbW9vdGhpbmc6LjYsc2NhbGFyUGFydGl0aW9uTm9uTW9ub3RvbmljWDohMSxpbWFnZUJyaWdodG5lc3NJbk1pbGxpOjFlMyxpbWFnZUNvbnRyYXN0SW5NaWxsaToxZTMsaW1hZ2VTaG93QWN0dWFsU2l6ZTohMSxoaXN0b2dyYW1Nb2RlOnBFLk9GRlNFVH0sbVQ9S3coZFQpLHVUPVp3KG1ULCh0PT50LnRhZ01ldGFkYXRhTG9hZFN0YXRlKSk7WncobVQsKHQ9PnQudGFnTWV0YWRhdGEpKTtjb25zdCBmVD1adyhtVCwodD0+dC5jYXJkTGlzdCkpLGdUPVp3KG1ULCgodCxlKT0+e2lmKCF0LmNhcmRNZXRhZGF0YU1hcC5oYXNPd25Qcm9wZXJ0eShlKSlyZXR1cm4geUUuTk9UX0xPQURFRDtjb25zdHtwbHVnaW46bix0YWc6byxydW5JZDppLHNhbXBsZTphfT10LmNhcmRNZXRhZGF0YU1hcFtlXSxyPW5UKHQudGltZVNlcmllc0RhdGEsbixvLGEpO2lmKCFyKXJldHVybiB5RS5OT1RfTE9BREVEO2NvbnN0IHM9ci5ydW5Ub0xvYWRTdGF0ZTtpZihpKXJldHVybiBzLmhhc093blByb3BlcnR5KGkpP3NbaV06eUUuTk9UX0xPQURFRDtjb25zdCBsPXJUKHQudGFnTWV0YWRhdGEsbixvLGEpO2lmKCFsLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBsb2FkIGEgY2FyZCB3aG9zZSB0YWcgaGFzIG5vIHJ1bnMiKTtyZXR1cm4gbC5ldmVyeSgodD0+c1t0XT09PXlFLkxPQURFRCkpP3lFLkxPQURFRDpsLnNvbWUoKHQ9PnNbdF09PT15RS5MT0FESU5HKSk/eUUuTE9BRElORzp5RS5OT1RfTE9BREVEfSkpLGhUPVp3KG1ULCgodCxlKT0+e2lmKCF0LmNhcmRNZXRhZGF0YU1hcC5oYXNPd25Qcm9wZXJ0eShlKSlyZXR1cm4gbnVsbDtjb25zdHtwbHVnaW46bix0YWc6byxzYW1wbGU6aX09dC5jYXJkTWV0YWRhdGFNYXBbZV0sYT1uVCh0LnRpbWVTZXJpZXNEYXRhLG4sbyxpKTtyZXR1cm4gYT9hLnJ1blRvU2VyaWVzOm51bGx9KSksYlQ9WncobVQsKHQ9PnQuY2FyZE1ldGFkYXRhTWFwKSkseVQ9WncoYlQsKCh0LGUpPT50Lmhhc093blByb3BlcnR5KGUpP3RbZV06bnVsbCkpLF9UPVp3KG1ULCh0PT50LnZpc2libGVDYXJkTWFwKSksQ1Q9WncoX1QsKHQ9Pm5ldyBTZXQodC52YWx1ZXMoKSkpKSxNVD1adyhmVCxiVCwoKHQsZSk9PnQuZmlsdGVyKCh0PT5lLmhhc093blByb3BlcnR5KHQpKSkubWFwKCh0PT5PYmplY3QuYXNzaWduKHtjYXJkSWQ6dH0sZVt0XSkpKSkpLHZUPVp3KG1ULCgodCxlKT0+dC5jYXJkU3RlcEluZGV4Lmhhc093blByb3BlcnR5KGUpP3QuY2FyZFN0ZXBJbmRleFtlXTpudWxsKSkseFQ9WncobVQsKHQ9PnQuY2FyZFRvUGlubmVkQ29weSkpLE9UPVp3KG1ULCh0PT50LnBpbm5lZENhcmRUb09yaWdpbmFsKSksUFQ9WncoeFQsYlQsKCh0LGUpPT5bLi4udC52YWx1ZXMoKV0uZmlsdGVyKCh0PT5lLmhhc093blByb3BlcnR5KHQpKSkubWFwKCh0PT5PYmplY3QuYXNzaWduKHtjYXJkSWQ6dH0sZVt0XSkpKSkpLHdUPVp3KHhULE9ULCgodCxlLG4pPT50LmhhcyhuKXx8ZS5oYXMobikpKSxrVD1adyhtVCwodD0+dC51bnJlc29sdmVkSW1wb3J0ZWRQaW5uZWRDYXJkcykpLFNUPVp3KG1ULCh0PT5jVCh0KSkpLERUPVp3KG1ULCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5zZXR0aW5ncyksdC5zZXR0aW5nT3ZlcnJpZGVzKSkpLEVUPVp3KG1ULCh0PT50LnNldHRpbmdPdmVycmlkZXMpKSxSVD1adyhEVCwodD0+dC50b29sdGlwU29ydCkpLEFUPVp3KERULCh0PT50Lmlnbm9yZU91dGxpZXJzKSksVFQ9WncoRFQsKHQ9PnQueEF4aXNUeXBlKSksTlQ9WncoRFQsKHQ9PnQuaGlzdG9ncmFtTW9kZSkpLHpUPVp3KERULCh0PT50LnNjYWxhclNtb290aGluZykpLElUPVp3KERULCh0PT50LnNjYWxhclBhcnRpdGlvbk5vbk1vbm90b25pY1gpKSxIVD1adyhEVCwodD0+dC5pbWFnZUJyaWdodG5lc3NJbk1pbGxpKSksRlQ9WncoRFQsKHQ9PnQuaW1hZ2VDb250cmFzdEluTWlsbGkpKSxMVD1adyhEVCwodD0+dC5pbWFnZVNob3dBY3R1YWxTaXplKSksQlQ9WncobVQsKHQ9PnQudGFnRmlsdGVyKSksVlQ9WncobVQsKCh0LGUpPT5Cb29sZWFuKHQudGFnR3JvdXBFeHBhbmRlZC5nZXQoZSkpKSksalQ9WncobVQsKHQ9PnQuc2VsZWN0VGltZUVuYWJsZWQpKSxVVD1adyhtVCwodD0+dC51c2VSYW5nZVNlbGVjdFRpbWUpKSxHVD1adyhtVCwodD0+e2NvbnN0e21pbjplLG1heDpufT10LnN0ZXBNaW5NYXg7cmV0dXJue21pbjplPT09MS8wPzA6ZSxtYXg6bj09PS0xLzA/MWUzOm59fSkpLFdUPVp3KG1ULEdULCgodCxlKT0+e3ZhciBuO3JldHVybiB0LnNlbGVjdGVkVGltZT9PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5zZWxlY3RlZFRpbWUpLHtlbmQ6bnVsbCE9PShuPXQuc2VsZWN0ZWRUaW1lLmVuZCkmJnZvaWQgMCE9PW4/bjp7c3RlcDplLm1heH19KTp7c3RhcnQ6e3N0ZXA6ZS5taW59LGVuZDp7c3RlcDplLm1heH19fSkpLFlUPVp3KG1ULFdULCgodCxlKT0+dC5zZWxlY3RUaW1lRW5hYmxlZD90LnVzZVJhbmdlU2VsZWN0VGltZT9lOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7ZW5kOm51bGx9KTpudWxsKSkscVQ9WncobVQsKHQ9PnQuZmlsdGVyZWRQbHVnaW5UeXBlcykpLFpUPVp3KG1ULCh0PT50LnByb21vdGVUaW1lU2VyaWVzKSksWFQ9WncobVQsKHQ9PnQuaXNTZXR0aW5nc1BhbmVPcGVuKSk7dmFyIEtUOyEoZnVuY3Rpb24odCl7dFt0Lk5PTkU9MF09Ik5PTkUiLHRbdC5XSEFUU19ORVc9MV09IldIQVRTX05FVyJ9KShLVHx8KEtUPXt9KSk7Y29uc3QgSlQ9S3coIm5vdGlmaWNhdGlvbiIpO1p3KEpULCh0PT50Lm5vdGlmaWNhdGlvbnMpKSxadyhKVCwodD0+e3ZhciBlO3JldHVybiBudWxsIT09KGU9dC5sYXN0UmVhZFRpbWVzdGFtcEluTXMpJiZ2b2lkIDAhPT1lP2U6LTF9KSk7Y29uc3QgUVQ9InJ1bnMiO3ZhciAkVCx0TjtmdW5jdGlvbiBlTih0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodC5zbGljZSgpLnNvcnQoKSl9ZnVuY3Rpb24gbk4odCxlLG4pe2NvbnN0IG89e30saT1bXSxhPXttYXRjaGVzOm8sbm9uTWF0Y2hlczppfTtzd2l0Y2godC5rZXkpe2Nhc2UgdE4uUlVOOmZvcihjb25zdCB0IG9mIGUpb1t0LmlkXT1bdF07YnJlYWs7Y2FzZSB0Ti5FWFBFUklNRU5UOmZvcihjb25zdCB0IG9mIGUpe2NvbnN0IGU9blt0LmlkXSxpPW9bZV18fFtdO2kucHVzaCh0KSxvW2VdPWl9YnJlYWs7Y2FzZSB0Ti5SRUdFWDppZighdC5yZWdleFN0cmluZylicmVhaztsZXQgYTt0cnl7YT1uZXcgUmVnRXhwKHQucmVnZXhTdHJpbmcpfWNhdGNoKHQpe2JyZWFrfWZvcihjb25zdCB0IG9mIGUpe2NvbnN0IGU9dC5uYW1lLm1hdGNoKGEpO2lmKGUpe2NvbnN0IG49ZS5sZW5ndGg+MT9KU09OLnN0cmluZ2lmeShlLnNsaWNlKDEpKToicHNldWRvX2dyb3VwIixpPW9bbl18fFtdO2kucHVzaCh0KSxvW25dPWl9ZWxzZSBpLnB1c2godCl9fXJldHVybiBhfWZ1bmN0aW9uIG9OKHQsZSl7c3dpdGNoKHQpe2Nhc2UgdE4uUkVHRVg6cmV0dXJue2tleTp0LHJlZ2V4U3RyaW5nOm51bGwhPWU/ZToiIn07Y2FzZSB0Ti5SVU46Y2FzZSB0Ti5FWFBFUklNRU5UOmRlZmF1bHQ6cmV0dXJue2tleTp0fX19IShmdW5jdGlvbih0KXt0W3QuRVhQRVJJTUVOVF9OQU1FPTBdPSJFWFBFUklNRU5UX05BTUUiLHRbdC5IUEFSQU09MV09IkhQQVJBTSIsdFt0Lk1FVFJJQz0yXT0iTUVUUklDIix0W3QuUlVOX05BTUU9M109IlJVTl9OQU1FIn0pKCRUfHwoJFQ9e30pKSwoZnVuY3Rpb24odCl7dFt0LlJVTj0wXT0iUlVOIix0W3QuRVhQRVJJTUVOVD0xXT0iRVhQRVJJTUVOVCIsdFt0LlJFR0VYPTJdPSJSRUdFWCJ9KSh0Tnx8KHROPXt9KSk7Y29uc3QgaU49S3coUVQpLGFOPVp3KGlOLCh0PT50LmRhdGEpKSxyTj1adyhhTiwoKHQsZSk9Pnt2YXIgbjtyZXR1cm4gbnVsbCE9PShuPXQucnVuSWRUb0V4cElkW2UucnVuSWRdKSYmdm9pZCAwIT09bj9uOm51bGx9KSksc049WncoYU4sKCh0LGUpPT57dmFyIG47cmV0dXJuIG51bGwhPT0obj10LnJ1bk1ldGFkYXRhW2UucnVuSWRdKSYmdm9pZCAwIT09bj9uOm51bGx9KSksbE49WncoYU4sKCh0LGUpPT4odC5ydW5JZHNbZS5leHBlcmltZW50SWRdfHxbXSkuZmlsdGVyKChlPT5Cb29sZWFuKHQucnVuTWV0YWRhdGFbZV0pKSkubWFwKChlPT50LnJ1bk1ldGFkYXRhW2VdKSkpKSxjTj1adyhhTiwoKHQsZSk9Pnt2YXIgbjtyZXR1cm4gbnVsbCE9PShuPXQucnVuSWRzW2UuZXhwZXJpbWVudElkXSkmJnZvaWQgMCE9PW4/bjpbXX0pKSxkTj1adyhhTiwodD0+bmV3IE1hcChPYmplY3QuZW50cmllcyh0LnJ1bk1ldGFkYXRhKSkpKSxwTj1adyhhTiwoKHQsZSk9PnQucnVuc0xvYWRTdGF0ZVtlLmV4cGVyaW1lbnRJZF18fHtsYXN0TG9hZGVkVGltZUluTXM6bnVsbCxzdGF0ZTp5RS5OT1RfTE9BREVEfSkpLG1OPVp3KGFOLCgodCxlKT0+e2NvbnN0IG49ZU4oZS5leHBlcmltZW50SWRzKTtyZXR1cm4gdC5zZWxlY3Rpb25TdGF0ZS5nZXQobil8fG5ldyBNYXB9KSksdU49WncoYU4sKHQ9Pm51bGwhPT10LnVzZXJTZXRHcm91cEJ5S2V5P29OKHQudXNlclNldEdyb3VwQnlLZXksdC5jb2xvckdyb3VwUmVnZXhTdHJpbmcpOm51bGwpKSxmTj1adyh1TixhTiwoKHQsZSk9Pm51bGwhPXQ/dDplLmluaXRpYWxHcm91cEJ5KSksZ049WncoYU4sKHQ9PnQucmVnZXhGaWx0ZXIpKSxoTj1adyhpTiwodD0+dC51aSkpLGJOPVp3KGhOLCh0PT50LnBhZ2luYXRpb25PcHRpb24pKSx5Tj1adyhoTiwodD0+dC5zb3J0KSksX049WncoYU4sKHQ9PnQucnVuQ29sb3JPdmVycmlkZUZvckdyb3VwQnkpKSxDTj1adyhhTiwodD0+dC5kZWZhdWx0UnVuQ29sb3JJZEZvckdyb3VwQnkpKSxNTj1adyhhTiwodD0+dC5jb2xvckdyb3VwUmVnZXhTdHJpbmcpKSx2Tj1KUCgiW1NldHRpbmdzXSBSZWxvYWQgRW5hYmxlIFRvZ2dsZWQiKSx4Tj1KUCgiW1NldHRpbmdzXSBSZWxvYWQgUGVyaW9kIENoYW5nZSIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLE9OPUpQKCJbU2V0dGluZ3NdIFBhZ2UgU2l6ZSBDaGFuZ2UiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxQTj0ic2V0dGluZ3MiLHdOPXtzdGF0ZTp5RS5MT0FERUQsbGFzdExvYWRlZFRpbWVJbk1zOkRhdGUubm93KCksc2V0dGluZ3M6e3JlbG9hZFBlcmlvZEluTXM6M2U0LHJlbG9hZEVuYWJsZWQ6ITEscGFnZVNpemU6MTIsY29sb3JQYWxldHRlOntpZDoiZGVmYXVsdCIsbmFtZToiRGVmYWx0Iixjb2xvcnM6W3tuYW1lOiJTbGF0ZSIsbGlnaHRIZXg6IiM0MjUwNjYiLGRhcmtIZXg6IiM4ZTk4YTMifSx7bmFtZToiQ3lhbiIsbGlnaHRIZXg6IiMxMmI1Y2IiLGRhcmtIZXg6IiMxMmI1Y2IifSx7bmFtZToiUGluayIsbGlnaHRIZXg6IiNlNTI1OTIiLGRhcmtIZXg6IiNlNTI1OTIifSx7bmFtZToiWWVsbG93IixsaWdodEhleDoiI2Y5YWIwMCIsZGFya0hleDoiI2Y5YWIwMCJ9LHtuYW1lOiJQdXJwbGUiLGxpZ2h0SGV4OiIjOTMzNGU2IixkYXJrSGV4OiIjOTMzNGU2In0se25hbWU6IkxpZ2h0IEdyZWVuIixsaWdodEhleDoiIzdjYjM0MiIsZGFya0hleDoiIzdjYjM0MiJ9LHtuYW1lOiJPcmFuZ2UiLGxpZ2h0SGV4OiIjZTg3MTBhIixkYXJrSGV4OiIjZTg3MTBhIn1dLGluYWN0aXZlOntuYW1lOiJHcmF5IixsaWdodEhleDoiI2UwZTBlMCIsZGFya0hleDoiIzNiM2IzYiJ9fX19LGtOPUt3KFBOKSxTTj1adyhrTiwodD0+dC5zdGF0ZSkpLEROPVp3KGtOLCh0PT50LnNldHRpbmdzLnJlbG9hZEVuYWJsZWQpKSxFTj1adyhrTiwodD0+dC5zZXR0aW5ncy5yZWxvYWRQZXJpb2RJbk1zKSksUk49Wncoa04sKHQ9PnQuc2V0dGluZ3MucGFnZVNpemUpKSxBTj1adyhrTiwodD0+dC5zZXR0aW5ncy5jb2xvclBhbGV0dGUpKTtmdW5jdGlvbiBUTih0LGUsbil7aWYoIWUpcmV0dXJuITA7bGV0IG87dHJ5e289bmV3IFJlZ0V4cChlLCJpIil9Y2F0Y2godCl7cmV0dXJuITF9Y29uc3QgaT1bdC5ydW5OYW1lXTtyZXR1cm4gbiYmaS5wdXNoKHQuZXhwZXJpbWVudEFsaWFzLGAke3QuZXhwZXJpbWVudEFsaWFzfS8ke3QucnVuTmFtZX1gKSxpLnNvbWUoKHQ9Pm8udGVzdCh0KSkpfWNvbnN0IE5OPVp3KCh0PT57Y29uc3QgZT1UUyh0KTtyZXR1cm4gZT9tTih0LHtleHBlcmltZW50SWRzOmV9KTpudWxsfSksZ04sKHQ9Pnt2YXIgZTtjb25zdCBuPW51bGwhPT0oZT1UUyh0KSkmJnZvaWQgMCE9PWU/ZTpbXSxvPXpTKHQpLGk9bmV3IE1hcDtmb3IoY29uc3QgZSBvZiBuKXtjb25zdCBuPXVBKHQse2V4cGVyaW1lbnRJZDplfSk7aWYoIW4pY29udGludWU7Y29uc3QgYT1sTih0LHtleHBlcmltZW50SWQ6ZX0pO2Zvcihjb25zdCB0IG9mIGEpaS5zZXQodC5pZCx7cnVuTmFtZTp0Lm5hbWUsZXhwZXJpbWVudE5hbWU6bi5uYW1lLGV4cGVyaW1lbnRBbGlhczpvW2VdfSl9cmV0dXJuIGl9KSxSUywoKHQsZSxuLG8pPT57aWYoIXQpcmV0dXJuIG51bGw7Y29uc3QgaT1vPT09WmsuQ09NUEFSRV9FWFBFUklNRU5ULGE9bmV3IE1hcDtmb3IoY29uc3RbbyxyXW9mIHQuZW50cmllcygpKXtjb25zdCB0PW4uZ2V0KG8pO2Euc2V0KG8sVE4odCxlLGkpJiZyKX1yZXR1cm4gYX0pKSx6Tj1adyhBTixDTixfTixKRCwoKHQsZSxuLG8pPT57Y29uc3QgaT17fTtyZXR1cm4gZS5mb3JFYWNoKCgoZSxhKT0+e2xldCByPW8/dC5pbmFjdGl2ZS5kYXJrSGV4OnQuaW5hY3RpdmUubGlnaHRIZXg7aWYobi5oYXMoYSkpcj1uLmdldChhKTtlbHNlIGlmKGU+PTApe2NvbnN0IG49dC5jb2xvcnNbZSV0LmNvbG9ycy5sZW5ndGhdO3I9bz9uLmRhcmtIZXg6bi5saWdodEhleH1pW2FdPXJ9KSksaX0pKTtjbGFzcyBJTntjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5hY3Rpb25zJD10LHRoaXMuc3RvcmU9ZSx0aGlzLnJ1bnNEYXRhU291cmNlPW4sdGhpcy5sb2FkUnVuc09uUnVuVGFibGVTaG93biQ9TWsoKCgpPT50aGlzLmFjdGlvbnMkLnBpcGUoRGsoVVIpLFp0KCgoe2V4cGVyaW1lbnRJZHM6dH0pPT50aGlzLmdldEV4cGVyaW1lbnRzV2l0aExvYWRTdGF0ZSh0LCh0PT50PT09eUUuRkFJTEVEfHx0PT09eUUuTk9UX0xPQURFRCkpLnBpcGUoY2UoKHQ9PiEhdC5sZW5ndGgpKSxadCgoZT0+dGhpcy5mZXRjaEFsbFJ1bnNMaXN0KHQsZSkpKSkpKSkpLHtkaXNwYXRjaDohMX0pLHRoaXMuZXhwZXJpbWVudHNXaXRoU3RhbGVSdW5zT25Sb3V0ZUNoYW5nZSQ9dGhpcy5hY3Rpb25zJC5waXBlKERrKGRTKSxWZSh0aGlzLnN0b3JlLnNlbGVjdChOUykpLE1lKCgoWyx0XSxbLGVdKT0+dD09PWUpKSxWZSh0aGlzLnN0b3JlLnNlbGVjdChUUykpLGNlKCgoWyx0XSk9PiEhdCkpLEl0KCgoWyx0XSk9PnQpKSxadCgodD0+dGhpcy5nZXRFeHBlcmltZW50c1dpdGhMb2FkU3RhdGUodCwodD0+dD09PXlFLkZBSUxFRHx8dD09PXlFLk5PVF9MT0FERUQpKS5waXBlKEl0KChlPT4oe2V4cGVyaW1lbnRJZHM6dCxleHBlcmltZW50SWRzVG9CZUZldGNoZWQ6ZX0pKSkpKSkpLHRoaXMuZXhwZXJpbWVudHNXaXRoU3RhbGVSdW5zT25SZWxvYWQkPXRoaXMuYWN0aW9ucyQucGlwZShEayh4RSx2RSksVmUodGhpcy5zdG9yZS5zZWxlY3QoVFMpKSxjZSgoKFssdF0pPT4hIXQpKSxJdCgoKFssdF0pPT50KSksWnQoKHQ9PnRoaXMuZ2V0RXhwZXJpbWVudHNXaXRoTG9hZFN0YXRlKHQsKHQ9PnQhPT15RS5MT0FESU5HKSkucGlwZShJdCgoZT0+KHtleHBlcmltZW50SWRzOnQsZXhwZXJpbWVudElkc1RvQmVGZXRjaGVkOmV9KSkpKSkpKSx0aGlzLmxvYWRSdW5zT25OYXZpZ2F0aW9uT3JSZWxvYWQkPU1rKCgoKT0+cmUodGhpcy5leHBlcmltZW50c1dpdGhTdGFsZVJ1bnNPblJvdXRlQ2hhbmdlJCx0aGlzLmV4cGVyaW1lbnRzV2l0aFN0YWxlUnVuc09uUmVsb2FkJCkucGlwZShadCgoKHtleHBlcmltZW50SWRzOnQsZXhwZXJpbWVudElkc1RvQmVGZXRjaGVkOmV9KT0+dGhpcy5mZXRjaEFsbFJ1bnNMaXN0KHQsZSkpKSkpLHtkaXNwYXRjaDohMX0pfWdldFJ1bnNMaXN0TG9hZFN0YXRlKHQpe3JldHVybiB0aGlzLnN0b3JlLnNlbGVjdChwTix7ZXhwZXJpbWVudElkOnR9KS5waXBlKGJlKDEpKX1nZXRFeHBlcmltZW50c1dpdGhMb2FkU3RhdGUodCxlKXtyZXR1cm4gJHQodC5tYXAoKHQ9PnRoaXMuZ2V0UnVuc0xpc3RMb2FkU3RhdGUodCkpKSkucGlwZShJdCgobj0+dC5maWx0ZXIoKCh0LG8pPT5lKG5bb10uc3RhdGUpKSkpKSl9ZmV0Y2hBbGxSdW5zTGlzdCh0LGUpe3JldHVybiBFdCh7ZXhwZXJpbWVudElkczp0LGV4cGVyaW1lbnRJZHNUb0JlRmV0Y2hlZDplfSkucGlwZShGZSgoKCk9Pnt0aGlzLnN0b3JlLmRpc3BhdGNoKE5SKHtleHBlcmltZW50SWRzOnQscmVxdWVzdGVkRXhwZXJpbWVudElkczplfSkpfSkpLFp0KCgoKT0+e2NvbnN0IG49bmV3IFNldChlKTtyZXR1cm4gJHQodC5tYXAoKHQ9Pm4uaGFzKHQpP3RoaXMuZmV0Y2hSdW5zRm9yRXhwZXJpbWVudCh0KTp0aGlzLm1heWJlV2FpdEZvclJ1bnNBbmRHZXRSdW5zKHQpKSkpfSkpLEl0KCh0PT57Y29uc3QgZT17fSxuPVtdO2Zvcihjb25zdCBvIG9mIHQpbi5wdXNoKC4uLm8ucnVucyksby5mcm9tUmVtb3RlJiYoZVtvLmV4cGVyaW1lbnRJZF09e3J1bnM6by5ydW5zLG1ldGFkYXRhOm8ubWV0YWRhdGF9KTtyZXR1cm57bmV3UnVuc0FuZE1ldGFkYXRhOmUscnVuc0ZvckFsbEV4cGVyaW1lbnRzOm59fSkpLEZlKCgoe25ld1J1bnNBbmRNZXRhZGF0YTplLHJ1bnNGb3JBbGxFeHBlcmltZW50czpufSk9Pnt0aGlzLnN0b3JlLmRpc3BhdGNoKHpSKHtleHBlcmltZW50SWRzOnQsbmV3UnVuc0FuZE1ldGFkYXRhOmUscnVuc0ZvckFsbEV4cGVyaW1lbnRzOm59KSl9KSkscGUoKG49Pih0aGlzLnN0b3JlLmRpc3BhdGNoKElSKHtleHBlcmltZW50SWRzOnQscmVxdWVzdGVkRXhwZXJpbWVudElkczplfSkpLEV0KG51bGwpKSkpLEl0KCgoKT0+bnVsbCkpKX1tYXliZVdhaXRGb3JSdW5zQW5kR2V0UnVucyh0KXtyZXR1cm4gdGhpcy5zdG9yZS5zZWxlY3QocE4se2V4cGVyaW1lbnRJZDp0fSkucGlwZShjZSgodD0+dC5zdGF0ZSE9PXlFLkxPQURJTkcpKSxiZSgxKSxadCgodD0+dC5zdGF0ZT09PXlFLkZBSUxFRD9SdChuZXcgRXJyb3IoIlBlbmRpbmcgcmVxdWVzdCBmYWlsZWQiKSk6RXQodCkpKSxWZSh0aGlzLnN0b3JlLnNlbGVjdChsTix7ZXhwZXJpbWVudElkOnR9KSksSXQoKChbLGVdKT0+KHtmcm9tUmVtb3RlOiExLGV4cGVyaW1lbnRJZDp0LHJ1bnM6ZX0pKSkpfWZldGNoUnVuc0ZvckV4cGVyaW1lbnQodCl7cmV0dXJuICR0KFt0aGlzLnJ1bnNEYXRhU291cmNlLmZldGNoUnVucyh0KSx0aGlzLnJ1bnNEYXRhU291cmNlLmZldGNoSHBhcmFtc01ldGFkYXRhKHQpXSkucGlwZShJdCgoKFtlLG5dKT0+KHtmcm9tUmVtb3RlOiEwLGV4cGVyaW1lbnRJZDp0LHJ1bnM6ZSxtZXRhZGF0YTpufSkpKSl9fWZ1bmN0aW9uIEhOKHQsZSxuKXtjb25zdCBvPU9iamVjdC5rZXlzKHQpLGk9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCksZSkse3ByaXZhdGVSb3V0ZUNvbnRleHRlZFN0YXRlOnt9fSk7cmV0dXJue2luaXRpYWxTdGF0ZTppLHJlZHVjZXJzOnlrKGksYmsoZFMsKChlLHtiZWZvcmU6aSxhZnRlcjphfSk9Pntjb25zdCByPVFrKGEucm91dGVLaW5kLGEucGFyYW1zKSxzPWk/UWsoaS5yb3V0ZUtpbmQsaS5wYXJhbXMpOm51bGw7aWYocz09PXIpcmV0dXJuIGU7bGV0IGw9T2JqZWN0LmFzc2lnbih7fSxlLnByaXZhdGVSb3V0ZUNvbnRleHRlZFN0YXRlKTtpZihzKXtjb25zdCB0PXt9O2Zvcihjb25zdCBuIG9mIG8pdFtuXT1lW25dO2w9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGwpLHtbc106dH0pfWxldCBjPWUucHJpdmF0ZVJvdXRlQ29udGV4dGVkU3RhdGUmJmUucHJpdmF0ZVJvdXRlQ29udGV4dGVkU3RhdGVbcl0/ZS5wcml2YXRlUm91dGVDb250ZXh0ZWRTdGF0ZVtyXTpudWxsO3MmJm51bGw9PT1jJiYoYz10KTtjb25zdCBkPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLGMpLHtwcml2YXRlUm91dGVDb250ZXh0ZWRTdGF0ZTpsfSk7cmV0dXJuIG4/bihkLGEpOmR9KSkpfX12YXIgRk4sTE47ZnVuY3Rpb24gQk4oLi4udCl7cmV0dXJuKGUsbik9PntsZXQgbz1lO2Zvcihjb25zdCBlIG9mIHQpbz1lKG8sbik7cmV0dXJuIG99fUlOLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxJTikodnIoU2spLHZyKEl3KSx2cihYUikpfSxJTi7JtXByb3Y9TW4oe3Rva2VuOklOLGZhY3Rvcnk6SU4uybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKElOLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpTa30se3R5cGU6SXd9LHt0eXBlOlhSfV19KSxudWxsKSwoZnVuY3Rpb24odCl7dC5BU0M9ImFzYyIsdC5ERVNDPSJkZXNjIix0LlVOU0VUPSIifSkoRk58fChGTj17fSkpLChmdW5jdGlvbih0KXt0LkVYUEVSSU1FTlRfSUQ9ImlkIix0LlVTRVI9InVzZXIiLHQuQkVGT1JFPSJiZWZvcmUiLHQuQUZURVI9ImFmdGVyIix0LlJFR0VYPSJyZWdleCJ9KShMTnx8KExOPXt9KSk7Y29uc3R7aW5pdGlhbFN0YXRlOlZOLHJlZHVjZXJzOmpOfT1ITih7cnVuQ29sb3JPdmVycmlkZUZvckdyb3VwQnk6bmV3IE1hcCxkZWZhdWx0UnVuQ29sb3JJZEZvckdyb3VwQnk6bmV3IE1hcCxncm91cEtleVRvQ29sb3JJZDpuZXcgTWFwLGluaXRpYWxHcm91cEJ5OntrZXk6dE4uUlVOfSx1c2VyU2V0R3JvdXBCeUtleTpudWxsLGNvbG9yR3JvdXBSZWdleFN0cmluZzoiIixyZWdleEZpbHRlcjoiIn0se3J1bklkczp7fSxydW5JZFRvRXhwSWQ6e30scnVuTWV0YWRhdGE6e30scnVuc0xvYWRTdGF0ZTp7fSxzZWxlY3Rpb25TdGF0ZTpuZXcgTWFwfSwoKHQsZSk9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7aW5pdGlhbEdyb3VwQnk6e2tleTplLnJvdXRlS2luZD09PVprLkNPTVBBUkVfRVhQRVJJTUVOVD90Ti5FWFBFUklNRU5UOnROLlJVTn19KSkpLFVOPUJOKHlrKFZOLGJrKHJTLCgodCx7cm91dGVLaW5kOmUscGFydGlhbFN0YXRlOm59KT0+e3ZhciBvO2lmKGUhPT1aay5DT01QQVJFX0VYUEVSSU1FTlQmJmUhPT1aay5FWFBFUklNRU5UKXJldHVybiB0O2NvbnN0IGk9bi5ydW5zLmdyb3VwQnk7aWYoIWkpcmV0dXJuIHQ7Y29uc3QgYT1pLmtleT09PXROLlJFR0VYP2kucmVnZXhTdHJpbmc6dC5jb2xvckdyb3VwUmVnZXhTdHJpbmc7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7Y29sb3JHcm91cFJlZ2V4U3RyaW5nOmEsdXNlclNldEdyb3VwQnlLZXk6bnVsbCE9PShvPWkua2V5KSYmdm9pZCAwIT09bz9vOm51bGx9KX0pKSxiayhOUiwoKHQsZSk9Pntjb25zdCBuPU9iamVjdC5hc3NpZ24oe30sdC5ydW5zTG9hZFN0YXRlKTtmb3IoY29uc3QgdCBvZiBlLnJlcXVlc3RlZEV4cGVyaW1lbnRJZHMpblt0XT1uW3RdP09iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuW3RdKSx7c3RhdGU6eUUuTE9BRElOR30pOntsYXN0TG9hZGVkVGltZUluTXM6bnVsbCxzdGF0ZTp5RS5MT0FESU5HfTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtydW5zTG9hZFN0YXRlOm59KX0pKSxiayh6UiwoKHQsZSk9Pnt2YXIgbjtjb25zdCBvPU9iamVjdC5hc3NpZ24oe30sdC5ydW5JZHMpLGk9T2JqZWN0LmFzc2lnbih7fSx0LnJ1bk1ldGFkYXRhKSxhPU9iamVjdC5hc3NpZ24oe30sdC5ydW5JZFRvRXhwSWQpLHI9T2JqZWN0LmFzc2lnbih7fSx0LnJ1bnNMb2FkU3RhdGUpLHM9bmV3IE1hcCh0LnNlbGVjdGlvblN0YXRlKTtmb3IoY29uc3QgdCBvZiBPYmplY3Qua2V5cyhlLm5ld1J1bnNBbmRNZXRhZGF0YSkpe2NvbnN0e3J1bnM6bixtZXRhZGF0YTpzfT1lLm5ld1J1bnNBbmRNZXRhZGF0YVt0XTtvW3RdPW4ubWFwKCgoe2lkOnR9KT0+dCkpLHJbdF09T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHJbdF0pLHtsYXN0TG9hZGVkVGltZUluTXM6RGF0ZS5ub3coKSxzdGF0ZTp5RS5MT0FERUR9KTtmb3IoY29uc3QgZSBvZiBuKXtjb25zdCBuPXMucnVuVG9IcGFyYW1zQW5kTWV0cmljc1tlLmlkXTtpW2UuaWRdPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7aHBhcmFtczpuP24uaHBhcmFtczpudWxsLG1ldHJpY3M6bj9uLm1ldHJpY3M6bnVsbH0pLGFbZS5pZF09dH19Y29uc3QgbD1lTihlLmV4cGVyaW1lbnRJZHMpLGM9bmV3IE1hcChudWxsIT09KG49cy5nZXQobCkpJiZ2b2lkIDAhPT1uP246W10pLGQ9ZS5ydW5zRm9yQWxsRXhwZXJpbWVudHMubGVuZ3RoPD01MDA7Zm9yKGNvbnN0IHQgb2YgZS5ydW5zRm9yQWxsRXhwZXJpbWVudHMpYy5oYXModC5pZCl8fGMuc2V0KHQuaWQsZCk7cmV0dXJuIHMuc2V0KGwsYyksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtydW5JZHM6byxydW5JZFRvRXhwSWQ6YSxydW5NZXRhZGF0YTppLHJ1bnNMb2FkU3RhdGU6cixzZWxlY3Rpb25TdGF0ZTpzfSl9KSksYmsoSVIsKCh0LGUpPT57Y29uc3Qgbj1PYmplY3QuYXNzaWduKHt9LHQucnVuc0xvYWRTdGF0ZSk7Zm9yKGNvbnN0IHQgb2YgZS5yZXF1ZXN0ZWRFeHBlcmltZW50SWRzKW5bdF09blt0XT9PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sblt0XSkse3N0YXRlOnlFLkZBSUxFRH0pOntsYXN0TG9hZGVkVGltZUluTXM6bnVsbCxzdGF0ZTp5RS5GQUlMRUR9O3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3J1bnNMb2FkU3RhdGU6bn0pfSkpLGJrKEhSLCgodCx7ZXhwZXJpbWVudElkczplLHJ1bklkOm59KT0+e3ZhciBvO2NvbnN0IGk9ZU4oZSksYT1uZXcgTWFwKHQuc2VsZWN0aW9uU3RhdGUpLHI9bmV3IE1hcChudWxsIT09KG89YS5nZXQoaSkpJiZ2b2lkIDAhPT1vP286W10pO3JldHVybiByLnNldChuLCFCb29sZWFuKHIuZ2V0KG4pKSksYS5zZXQoaSxyKSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NlbGVjdGlvblN0YXRlOmF9KX0pKSxiayhGUiwoKHQse2V4cGVyaW1lbnRJZHM6ZSxydW5JZHM6bn0pPT57dmFyIG87Y29uc3QgaT1lTihlKSxhPW5ldyBNYXAodC5zZWxlY3Rpb25TdGF0ZSkscj1uZXcgTWFwKG51bGwhPT0obz1hLmdldChpKSkmJnZvaWQgMCE9PW8/bzpbXSkscz0hbi5ldmVyeSgodD0+Qm9vbGVhbihyLmdldCh0KSkpKTtmb3IoY29uc3QgdCBvZiBuKXIuc2V0KHQscyk7cmV0dXJuIGEuc2V0KGksciksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzZWxlY3Rpb25TdGF0ZTphfSl9KSksYmsoelIsKCh0LHtydW5zRm9yQWxsRXhwZXJpbWVudHM6ZX0pPT57Y29uc3Qgbj1uZXcgTWFwKHQuZ3JvdXBLZXlUb0NvbG9ySWQpLG89bmV3IE1hcCh0LmRlZmF1bHRSdW5Db2xvcklkRm9yR3JvdXBCeSk7bGV0IGk9dC5pbml0aWFsR3JvdXBCeTtudWxsIT09dC51c2VyU2V0R3JvdXBCeUtleSYmKGk9b04odC51c2VyU2V0R3JvdXBCeUtleSx0LmNvbG9yR3JvdXBSZWdleFN0cmluZykpO2NvbnN0IGE9bk4oaSxlLHQucnVuSWRUb0V4cElkKTtPYmplY3QuZW50cmllcyhhLm1hdGNoZXMpLmZvckVhY2goKChbdCxlXSk9Pnt2YXIgaTtjb25zdCBhPW51bGwhPT0oaT1uLmdldCh0KSkmJnZvaWQgMCE9PWk/aTpuLnNpemU7bi5zZXQodCxhKTtmb3IoY29uc3QgdCBvZiBlKW8uc2V0KHQuaWQsYSl9KSk7Zm9yKGNvbnN0IHQgb2YgYS5ub25NYXRjaGVzKW8uc2V0KHQuaWQsLTEpO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2RlZmF1bHRSdW5Db2xvcklkRm9yR3JvdXBCeTpvLGdyb3VwS2V5VG9Db2xvcklkOm59KX0pKSxiayhHUiwoKHQse2V4cGVyaW1lbnRJZHM6ZSxncm91cEJ5Om59KT0+e2NvbnN0IG89bmV3IE1hcCxpPW5ldyBNYXAodC5kZWZhdWx0UnVuQ29sb3JJZEZvckdyb3VwQnkpLGE9bk4obixlLmZsYXRNYXAoKGU9PnQucnVuSWRzW2VdKSkubWFwKChlPT50LnJ1bk1ldGFkYXRhW2VdKSksdC5ydW5JZFRvRXhwSWQpO09iamVjdC5lbnRyaWVzKGEubWF0Y2hlcykuZm9yRWFjaCgoKFt0LGVdKT0+e3ZhciBuO2NvbnN0IGE9bnVsbCE9PShuPW8uZ2V0KHQpKSYmdm9pZCAwIT09bj9uOm8uc2l6ZTtvLnNldCh0LGEpO2Zvcihjb25zdCB0IG9mIGUpaS5zZXQodC5pZCxhKX0pKTtmb3IoY29uc3QgdCBvZiBhLm5vbk1hdGNoZXMpaS5zZXQodC5pZCwtMSk7Y29uc3Qgcj1uLmtleT09PXROLlJFR0VYP24ucmVnZXhTdHJpbmc6dC5jb2xvckdyb3VwUmVnZXhTdHJpbmc7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7Y29sb3JHcm91cFJlZ2V4U3RyaW5nOnIsdXNlclNldEdyb3VwQnlLZXk6bi5rZXksZGVmYXVsdFJ1bkNvbG9ySWRGb3JHcm91cEJ5OmksZ3JvdXBLZXlUb0NvbG9ySWQ6byxydW5Db2xvck92ZXJyaWRlRm9yR3JvdXBCeTpuZXcgTWFwfSl9KSksYmsoalIsKCh0LHtydW5JZDplLG5ld0NvbG9yOm59KT0+e2NvbnN0IG89bmV3IE1hcCh0LnJ1bkNvbG9yT3ZlcnJpZGVGb3JHcm91cEJ5KTtyZXR1cm4gby5zZXQoZSxuKSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3J1bkNvbG9yT3ZlcnJpZGVGb3JHcm91cEJ5Om99KX0pKSxiayhWUiwoKHQsZSk9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7cmVnZXhGaWx0ZXI6ZS5yZWdleFN0cmluZ30pKSkpLGpOKSxHTj17a2V5Om51bGwsZGlyZWN0aW9uOkZOLlVOU0VUfSx7aW5pdGlhbFN0YXRlOldOLHJlZHVjZXJzOllOfT1ITih7cGFnaW5hdGlvbk9wdGlvbjp7cGFnZUluZGV4OjAscGFnZVNpemU6MTB9LHNvcnQ6R059LHt9KSxxTj1CTih5ayhXTixiayhMUiwoKHQse3BhZ2VTaXplOmUscGFnZUluZGV4Om59KT0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtwYWdpbmF0aW9uT3B0aW9uOntwYWdlU2l6ZTplLHBhZ2VJbmRleDpufX0pKSksYmsoVlIsKCh0LGUpPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3BhZ2luYXRpb25PcHRpb246T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQucGFnaW5hdGlvbk9wdGlvbikse3BhZ2VJbmRleDowfSl9KSkpLGJrKEJSLCgodCxlKT0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzb3J0OntrZXk6ZS5rZXksZGlyZWN0aW9uOmUuZGlyZWN0aW9ufX0pKSkpLFlOKTtmdW5jdGlvbiBaTih0LGUpe3JldHVybiB4dyh7ZGF0YTpVTix1aTpxTn0pKHQsZSl9ZnVuY3Rpb24gWE4oKXtyZXR1cm5be2FjdGlvbkNyZWF0b3I6SVIsYWxlcnRGcm9tQWN0aW9uOigpPT4oe2xvY2FsaXplZE1lc3NhZ2U6IkZhaWxlZCB0byBmZXRjaCBydW5zIn0pfV19Y2xhc3MgS057fXZhciBKTjtLTi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8S04pfSxLTi7JtW1vZD1hbyh7dHlwZTpLTn0pLEtOLsm1aW5qPXZuKHtpbXBvcnRzOltbZGsuZm9yRmVhdHVyZShRVCxaTiksV2suZm9yRmVhdHVyZShbSU5dKSxsQSxBUi5yZWdpc3RlckFsZXJ0QWN0aW9ucyhYTiksYUFdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoS04sW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltkay5mb3JGZWF0dXJlKFFULFpOKSxXay5mb3JGZWF0dXJlKFtJTl0pLGxBLEFSLnJlZ2lzdGVyQWxlcnRBY3Rpb25zKFhOKSxhQV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhLTix7aW1wb3J0czpbY2ssR2ssbEEsQVIsYUFdfSksKGZ1bmN0aW9uKHQpe3QuUlVOU19DSEFOR0VEPSJleHBlcmltZW50YWwuUnVuc0NoYW5nZWQiLHQuR0VUX1JVTlM9ImV4cGVyaW1lbnRhbC5HZXRSdW5zIix0LkdFVF9VUkxfREFUQT0iZXhwZXJpbWVudGFsLkdldFVSTFBsdWdpbkRhdGEiLHQuREFUQV9SRUxPQURFRD0iZXhwZXJpbWVudGFsLkRhdGFSZWxvYWRlZCJ9KShKTnx8KEpOPXt9KSk7Y2xhc3MgUU57Y29uc3RydWN0b3IodCl7dGhpcy5wb3J0PXQsdGhpcy5pZD0wLHRoaXMucmVzcG9uc2VXYWl0cz1uZXcgTWFwLHRoaXMubGlzdGVuZXJzPW5ldyBNYXAsdGhpcy5wb3J0LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCh0PT50aGlzLm9uTWVzc2FnZSh0KSkpfWxpc3Rlbih0LGUpe3RoaXMubGlzdGVuZXJzLnNldCh0LGUpfXVubGlzdGVuKHQpe3RoaXMubGlzdGVuZXJzLmRlbGV0ZSh0KX1vbk1lc3NhZ2UodCl7cmV0dXJuIGdBKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT1KU09OLnBhcnNlKHQuZGF0YSksbj1lLnR5cGUsbz1lLmlkLGk9ZS5wYXlsb2FkLGE9ZS5lcnJvcjtpZihlLmlzUmVwbHkpe2lmKCF0aGlzLnJlc3BvbnNlV2FpdHMuaGFzKG8pKXJldHVybjtjb25zdHtyZXNvbHZlOnQscmVqZWN0OmV9PXRoaXMucmVzcG9uc2VXYWl0cy5nZXQobyk7cmV0dXJuIHRoaXMucmVzcG9uc2VXYWl0cy5kZWxldGUobyksdm9pZChhP2UobmV3IEVycm9yKGEpKTp0KGkpKX1sZXQgcj1udWxsLHM9bnVsbDtpZih0aGlzLmxpc3RlbmVycy5oYXMobikpe2NvbnN0IHQ9dGhpcy5saXN0ZW5lcnMuZ2V0KG4pO3RyeXtyPXlpZWxkIHQoaSl9Y2F0Y2godCl7cz10fX10aGlzLnBvc3RNZXNzYWdlKHt0eXBlOm4saWQ6byxwYXlsb2FkOnIsZXJyb3I6cyxpc1JlcGx5OiEwfSl9KSl9cG9zdE1lc3NhZ2UodCl7dGhpcy5wb3J0LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KHQpKX1zZW5kTWVzc2FnZSh0LGUpe2NvbnN0IG49dGhpcy5pZCsrO3JldHVybiB0aGlzLnBvc3RNZXNzYWdlKHt0eXBlOnQsaWQ6bixwYXlsb2FkOmUsZXJyb3I6bnVsbCxpc1JlcGx5OiExfSksbmV3IFByb21pc2UoKCh0LGUpPT57dGhpcy5yZXNwb25zZVdhaXRzLnNldChuLHtyZXNvbHZlOnQscmVqZWN0OmV9KX0pKX19Y29uc3QgJE49bmV3IFdlYWtNYXAsdHo9bmV3IFNldCxlej1uZXcgTWFwLG56PW5ldyBNYXA7ZnVuY3Rpb24gb3oodCxlKXtyZXR1cm4gbj0+e2NvbnN0IG89bnouZ2V0KGUpLGk9JE4uZ2V0KG8pfHxudWxsO3JldHVybiB0KGksbil9fXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwodD0+e2lmKCJleHBlcmltZW50YWwuYm9vdHN0cmFwIiE9PXQuZGF0YSlyZXR1cm47Y29uc3QgZT10LnBvcnRzWzBdO2lmKCFlKXJldHVybjtjb25zdCBuPXQuc291cmNlP3Quc291cmNlLmZyYW1lRWxlbWVudDpudWxsO24mJihmdW5jdGlvbiBvKHQsZSl7Y29uc3Qgbj1uZXcgUU4odCk7dHouYWRkKG4pLG56LnNldChuLGUpLHQuc3RhcnQoKTtmb3IoY29uc3RbdCxlXW9mIGV6KXtjb25zdCBvPW96KGUsbik7bi5saXN0ZW4odCxvKX19KShlLG4pfSkpO2NsYXNzIGl6e2Jyb2FkY2FzdCh0LGUpe3JldHVybihmdW5jdGlvbiBuKHQsZSl7Zm9yKGNvbnN0IHQgb2YgdHopbnouZ2V0KHQpLmlzQ29ubmVjdGVkfHwodHouZGVsZXRlKHQpLG56LmRlbGV0ZSh0KSk7Y29uc3Qgbj1bLi4udHpdLm1hcCgobj0+bi5zZW5kTWVzc2FnZSh0LGUpKSk7cmV0dXJuIFByb21pc2UuYWxsKG4pfSkodCxlKX1saXN0ZW4odCxlKXshKGZ1bmN0aW9uIG4odCxlKXtlei5zZXQodCxlKTtmb3IoY29uc3QgbiBvZiB0eil7Y29uc3Qgbz1veihlLG4pO24ubGlzdGVuKHQsbyl9fSkodCxlKX11bmxpc3Rlbih0KXshKGZ1bmN0aW9uIGUodCl7ZXouZGVsZXRlKHQpO2Zvcihjb25zdCBlIG9mIHR6KWUudW5saXN0ZW4odCl9KSh0KX19aXouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGl6KX0saXouybVwcm92PU1uKHt0b2tlbjppeixmYWN0b3J5Oml6Lsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChpeixbe3R5cGU6aW19XSxudWxsLG51bGwpO2NsYXNzIGF6e2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5pcGM9dCx0aGlzLnN0b3JlPWV9aW5pdCgpe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGYtc3RvcmFnZSIpO3RoaXMuaXBjLmxpc3RlbihKTi5HRVRfVVJMX0RBVEEsKGU9PntpZighZSlyZXR1cm47Y29uc3Qgbj1gcC4ke2UucGx1Z2luTmFtZX0uYCxvPXt9LGk9dC50Zl9zdG9yYWdlLmdldFVybEhhc2hEaWN0KCk7Zm9yKGxldCB0IGluIGkpdC5zdGFydHNXaXRoKG4pJiYob1t0LnN1YnN0cmluZyhuLmxlbmd0aCldPWlbdF0pO3JldHVybiBvfSkpLHRoaXMuc3RvcmUuc2VsZWN0KENSKS5waXBlKGNlKCh0PT5udWxsIT09dCkpLE1lKCkpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLmlwYy5icm9hZGNhc3QoSk4uREFUQV9SRUxPQURFRCx2b2lkIDApfSkpfX1hei7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8YXopKHZyKGl6KSx2cihJdykpfSxhei7JtXByb3Y9TW4oe3Rva2VuOmF6LGZhY3Rvcnk6YXouybVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGF6LFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTppen0se3R5cGU6SXd9XX0pLG51bGwpO2NsYXNzIHJ6e2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5pcGM9dCx0aGlzLnN0b3JlPWV9aW5pdCgpe2NvbnN0IHQ9dGhpcy5zdG9yZS5zZWxlY3QoVFMpLnBpcGUoWnQoKHQ9PnQ/V3QodC5tYXAoKHQ9PnRoaXMuc3RvcmUuc2VsZWN0KGxOLHtleHBlcmltZW50SWQ6dH0pKSkpLnBpcGUoSXQoKHQ9PnQuZmxhdCgpKSksTWUoKCh0LGUpPT50Lmxlbmd0aD09PWUubGVuZ3RoJiZ0LmV2ZXJ5KCgodCxuKT0+ZVtuXS5pZD09PXQuaWQpKSkpLEl0KCh0PT50Lm1hcCgoKHtuYW1lOnR9KT0+dCkpKSkpOkV0KFtdKSkpKTt0LnN1YnNjcmliZSgodD0+e3RoaXMuaXBjLmJyb2FkY2FzdChKTi5SVU5TX0NIQU5HRUQsdCl9KSksdGhpcy5pcGMubGlzdGVuKEpOLkdFVF9SVU5TLCgoKT0+dC5waXBlKGJlKDEpKS50b1Byb21pc2UoKSkpfX1yei7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8cnopKHZyKGl6KSx2cihJdykpfSxyei7JtXByb3Y9TW4oe3Rva2VuOnJ6LGZhY3Rvcnk6cnouybVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHJ6LFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTppen0se3R5cGU6SXd9XX0pLG51bGwpO2NsYXNzIHN6e2NvbnN0cnVjdG9yKHQsZSl7ZS5pbml0KCksdC5pbml0KCl9cmVnaXN0ZXJQbHVnaW5JZnJhbWUodCxlKXshKGZ1bmN0aW9uIG4odCxlKXskTi5zZXQodCx7cGx1Z2luTmFtZTplfSl9KSh0LGUpfX1zei7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8c3opKHZyKHJ6KSx2cihheikpfSxzei7JtW1vZD1hbyh7dHlwZTpzen0pLHN6Lsm1aW5qPXZuKHtwcm92aWRlcnM6W2l6LGF6LHJ6XSxpbXBvcnRzOltbQlMsRVIsS05dXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoc3osW3t0eXBlOkF5LGFyZ3M6W3twcm92aWRlcnM6W2l6LGF6LHJ6XSxpbXBvcnRzOltCUyxFUixLTl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpyen0se3R5cGU6YXp9XX0pLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oc3ose2ltcG9ydHM6W0JTLEVSLEtOXX0pO2NvbnN0IGx6PUpQKCJbQWxlcnRdIEFsZXJ0IFJlcG9ydGVkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSk7Y2xhc3MgY3p7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuYWN0aW9ucyQ9dCx0aGlzLnN0b3JlPWUsdGhpcy5hbGVydEFjdGlvbk1vZHVsZT1uLHRoaXMucmVwb3J0UmVnaXN0ZXJlZEFjdGlvbkFsZXJ0cyQ9TWsoKCgpPT50aGlzLmFjdGlvbnMkLnBpcGUoRmUoKHQ9Pntjb25zdCBlPXRoaXMuYWxlcnRBY3Rpb25Nb2R1bGUuZ2V0QWxlcnRGcm9tQWN0aW9uKHQpO2UmJnRoaXMuc3RvcmUuZGlzcGF0Y2gobHooZSkpfSkpKSkse2Rpc3BhdGNoOiExfSl9fWN6Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxjeikodnIoU2spLHZyKEl3KSx2cihBUikpfSxjei7JtXByb3Y9TW4oe3Rva2VuOmN6LGZhY3Rvcnk6Y3ouybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGN6LFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpTa30se3R5cGU6SXd9LHt0eXBlOkFSfV19KSxudWxsKTtjb25zdCBkej15ayh7bGF0ZXN0QWxlcnQ6bnVsbH0sYmsobHosKCh0LHtsb2NhbGl6ZWRNZXNzYWdlOmUsZm9sbG93dXBBY3Rpb246bn0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2xhdGVzdEFsZXJ0Ontsb2NhbGl6ZWRNZXNzYWdlOmUsZm9sbG93dXBBY3Rpb246bixjcmVhdGVkOkRhdGUubm93KCl9fSkpKSk7ZnVuY3Rpb24gcHoodCxlKXtyZXR1cm4gZHoodCxlKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3QgbXo9MTMsdXo9MjcsZno9MzIsZ3o9MzgsaHo9NDA7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBieih0LC4uLmUpe3JldHVybiBlLmxlbmd0aD9lLnNvbWUoKGU9PnRbZV0pKTp0LmFsdEtleXx8dC5zaGlmdEtleXx8dC5jdHJsS2V5fHx0Lm1ldGFLZXl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIHl6KHQpe3JldHVybiBudWxsIT10JiYiZmFsc2UiIT1gJHt0fWB9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIF96KHQsZT0wKXtyZXR1cm4gQ3oodCk/TnVtYmVyKHQpOmV9ZnVuY3Rpb24gQ3oodCl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQodCkpJiYhaXNOYU4oTnVtYmVyKHQpKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gTXoodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dDpbdF19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIHZ6KHQpe3JldHVybiBudWxsPT10PyIiOiJzdHJpbmciPT10eXBlb2YgdD90OmAke3R9cHhgfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiB4eih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGhnP3QubmF0aXZlRWxlbWVudDp0fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9sZXQgT3osUHo7dHJ5e096PSJ1bmRlZmluZWQiIT10eXBlb2YgSW50bCYmSW50bC52OEJyZWFrSXRlcmF0b3J9Y2F0Y2goakN0KXtPej0hMX1jbGFzcyB3entjb25zdHJ1Y3Rvcih0KXt0aGlzLl9wbGF0Zm9ybUlkPXQsdGhpcy5pc0Jyb3dzZXI9dGhpcy5fcGxhdGZvcm1JZD8oZnVuY3Rpb24gZSh0KXtyZXR1cm4iYnJvd3NlciI9PT10fSkodGhpcy5fcGxhdGZvcm1JZCk6Im9iamVjdCI9PXR5cGVvZiBkb2N1bWVudCYmISFkb2N1bWVudCx0aGlzLkVER0U9dGhpcy5pc0Jyb3dzZXImJi8oZWRnZSkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHRoaXMuVFJJREVOVD10aGlzLmlzQnJvd3NlciYmLyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx0aGlzLkJMSU5LPXRoaXMuaXNCcm93c2VyJiYhKCF3aW5kb3cuY2hyb21lJiYhT3opJiYidW5kZWZpbmVkIiE9dHlwZW9mIENTUyYmIXRoaXMuRURHRSYmIXRoaXMuVFJJREVOVCx0aGlzLldFQktJVD10aGlzLmlzQnJvd3NlciYmL0FwcGxlV2ViS2l0L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmIXRoaXMuQkxJTksmJiF0aGlzLkVER0UmJiF0aGlzLlRSSURFTlQsdGhpcy5JT1M9dGhpcy5pc0Jyb3dzZXImJi9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhKCJNU1N0cmVhbSJpbiB3aW5kb3cpLHRoaXMuRklSRUZPWD10aGlzLmlzQnJvd3NlciYmLyhmaXJlZm94fG1pbmVmaWVsZCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHRoaXMuQU5EUk9JRD10aGlzLmlzQnJvd3NlciYmL2FuZHJvaWQvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhdGhpcy5UUklERU5ULHRoaXMuU0FGQVJJPXRoaXMuaXNCcm93c2VyJiYvc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmdGhpcy5XRUJLSVR9fXd6Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx3eikodnIoankpKX0sd3ouybVwcm92PU1uKHtmYWN0b3J5OmZ1bmN0aW9uIHQoKXtyZXR1cm4gbmV3IHd6KHZyKGp5KSl9LHRva2VuOnd6LHByb3ZpZGVkSW46InJvb3QifSksd3ouY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpPYmplY3QsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbanldfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHd6LFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpPYmplY3QsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbanldfV19XX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3Mga3p7fWt6Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxreil9LGt6Lsm1bW9kPWFvKHt0eXBlOmt6fSksa3ouybVpbmo9dm4oe30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoa3osW3t0eXBlOkF5LGFyZ3M6W3t9XX1dLG51bGwsbnVsbCk7Y29uc3QgU3o9WyJjb2xvciIsImJ1dHRvbiIsImNoZWNrYm94IiwiZGF0ZSIsImRhdGV0aW1lLWxvY2FsIiwiZW1haWwiLCJmaWxlIiwiaGlkZGVuIiwiaW1hZ2UiLCJtb250aCIsIm51bWJlciIsInBhc3N3b3JkIiwicmFkaW8iLCJyYW5nZSIsInJlc2V0Iiwic2VhcmNoIiwic3VibWl0IiwidGVsIiwidGV4dCIsInRpbWUiLCJ1cmwiLCJ3ZWVrIl07ZnVuY3Rpb24gRHooKXtpZihQeilyZXR1cm4gUHo7aWYoIm9iamVjdCIhPXR5cGVvZiBkb2N1bWVudHx8IWRvY3VtZW50KXJldHVybiBQej1uZXcgU2V0KFN6KSxQejtsZXQgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO3JldHVybiBQej1uZXcgU2V0KFN6LmZpbHRlcigoZT0+KHQuc2V0QXR0cmlidXRlKCJ0eXBlIixlKSx0LnR5cGU9PT1lKSkpKSxQen0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovbGV0IEV6LFJ6LEF6LFR6O2Z1bmN0aW9uIE56KHQpe3JldHVybihmdW5jdGlvbiBlKCl7aWYobnVsbD09RXomJiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93KXRyeXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsbnVsbCxPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sInBhc3NpdmUiLHtnZXQ6KCk9PkV6PSEwfSkpfWZpbmFsbHl7RXo9RXp8fCExfXJldHVybiBFen0pKCk/dDohIXQuY2FwdHVyZX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24genooKXtpZihudWxsPT1Beil7aWYoIm9iamVjdCIhPXR5cGVvZiBkb2N1bWVudHx8IWRvY3VtZW50fHwiZnVuY3Rpb24iIT10eXBlb2YgRWxlbWVudHx8IUVsZW1lbnQpcmV0dXJuIEF6PSExLEF6O2lmKCJzY3JvbGxCZWhhdmlvciJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUpQXo9ITA7ZWxzZXtjb25zdCB0PUVsZW1lbnQucHJvdG90eXBlLnNjcm9sbFRvO0F6PSEhdCYmIS9ce1xzKlxbbmF0aXZlIGNvZGVcXVxzKlx9Ly50ZXN0KHQudG9TdHJpbmcoKSl9fXJldHVybiBBen1mdW5jdGlvbiBJeigpe2lmKCJvYmplY3QiIT10eXBlb2YgZG9jdW1lbnR8fCFkb2N1bWVudClyZXR1cm4gMDtpZihudWxsPT1Seil7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPXQuc3R5bGU7dC5kaXI9InJ0bCIsZS53aWR0aD0iMXB4IixlLm92ZXJmbG93PSJhdXRvIixlLnZpc2liaWxpdHk9ImhpZGRlbiIsZS5wb2ludGVyRXZlbnRzPSJub25lIixlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Y29uc3Qgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxvPW4uc3R5bGU7by53aWR0aD0iMnB4IixvLmhlaWdodD0iMXB4Iix0LmFwcGVuZENoaWxkKG4pLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodCksUno9MCwwPT09dC5zY3JvbGxMZWZ0JiYodC5zY3JvbGxMZWZ0PTEsUno9MD09PXQuc2Nyb2xsTGVmdD8xOjIpLHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KX1yZXR1cm4gUnp9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIEh6KHQpe2lmKChmdW5jdGlvbiBlKCl7aWYobnVsbD09VHope2NvbnN0IHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudD9kb2N1bWVudC5oZWFkOm51bGw7VHo9ISghdHx8IXQuY3JlYXRlU2hhZG93Um9vdCYmIXQuYXR0YWNoU2hhZG93KX1yZXR1cm4gVHp9KSgpKXtjb25zdCBlPXQuZ2V0Um9vdE5vZGU/dC5nZXRSb290Tm9kZSgpOm51bGw7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBTaGFkb3dSb290JiZTaGFkb3dSb290JiZlIGluc3RhbmNlb2YgU2hhZG93Um9vdClyZXR1cm4gZX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBGeigpe2xldCB0PSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJmRvY3VtZW50P2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQ6bnVsbDtmb3IoO3QmJnQuc2hhZG93Um9vdDspe2NvbnN0IGU9dC5zaGFkb3dSb290LmFjdGl2ZUVsZW1lbnQ7aWYoZT09PXQpYnJlYWs7dD1lfXJldHVybiB0fWZ1bmN0aW9uIEx6KHQpe3JldHVybiB0LmNvbXBvc2VkUGF0aD90LmNvbXBvc2VkUGF0aCgpWzBdOnQudGFyZ2V0fWNsYXNzIEJ6e2NyZWF0ZSh0KXtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXI/bnVsbDpuZXcgTXV0YXRpb25PYnNlcnZlcih0KX19QnouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEJ6KX0sQnouybVwcm92PU1uKHtmYWN0b3J5OmZ1bmN0aW9uIHQoKXtyZXR1cm4gbmV3IEJ6fSx0b2tlbjpCeixwcm92aWRlZEluOiJyb290In0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQnosW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOiJyb290In1dfV0sbnVsbCxudWxsKTtjbGFzcyBWentjb25zdHJ1Y3Rvcih0KXt0aGlzLl9tdXRhdGlvbk9ic2VydmVyRmFjdG9yeT10LHRoaXMuX29ic2VydmVkRWxlbWVudHM9bmV3IE1hcH1uZ09uRGVzdHJveSgpe3RoaXMuX29ic2VydmVkRWxlbWVudHMuZm9yRWFjaCgoKHQsZSk9PnRoaXMuX2NsZWFudXBPYnNlcnZlcihlKSkpfW9ic2VydmUodCl7Y29uc3QgZT14eih0KTtyZXR1cm4gbmV3IEQoKHQ9Pntjb25zdCBuPXRoaXMuX29ic2VydmVFbGVtZW50KGUpLnN1YnNjcmliZSh0KTtyZXR1cm4oKT0+e24udW5zdWJzY3JpYmUoKSx0aGlzLl91bm9ic2VydmVFbGVtZW50KGUpfX0pKX1fb2JzZXJ2ZUVsZW1lbnQodCl7aWYodGhpcy5fb2JzZXJ2ZWRFbGVtZW50cy5oYXModCkpdGhpcy5fb2JzZXJ2ZWRFbGVtZW50cy5nZXQodCkuY291bnQrKztlbHNle2NvbnN0IGU9bmV3IEksbj10aGlzLl9tdXRhdGlvbk9ic2VydmVyRmFjdG9yeS5jcmVhdGUoKHQ9PmUubmV4dCh0KSkpO24mJm4ub2JzZXJ2ZSh0LHtjaGFyYWN0ZXJEYXRhOiEwLGNoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSksdGhpcy5fb2JzZXJ2ZWRFbGVtZW50cy5zZXQodCx7b2JzZXJ2ZXI6bixzdHJlYW06ZSxjb3VudDoxfSl9cmV0dXJuIHRoaXMuX29ic2VydmVkRWxlbWVudHMuZ2V0KHQpLnN0cmVhbX1fdW5vYnNlcnZlRWxlbWVudCh0KXt0aGlzLl9vYnNlcnZlZEVsZW1lbnRzLmhhcyh0KSYmKHRoaXMuX29ic2VydmVkRWxlbWVudHMuZ2V0KHQpLmNvdW50LS0sdGhpcy5fb2JzZXJ2ZWRFbGVtZW50cy5nZXQodCkuY291bnR8fHRoaXMuX2NsZWFudXBPYnNlcnZlcih0KSl9X2NsZWFudXBPYnNlcnZlcih0KXtpZih0aGlzLl9vYnNlcnZlZEVsZW1lbnRzLmhhcyh0KSl7Y29uc3R7b2JzZXJ2ZXI6ZSxzdHJlYW06bn09dGhpcy5fb2JzZXJ2ZWRFbGVtZW50cy5nZXQodCk7ZSYmZS5kaXNjb25uZWN0KCksbi5jb21wbGV0ZSgpLHRoaXMuX29ic2VydmVkRWxlbWVudHMuZGVsZXRlKHQpfX19VnouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFZ6KSh2cihCeikpfSxWei7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgVnoodnIoQnopKX0sdG9rZW46VnoscHJvdmlkZWRJbjoicm9vdCJ9KSxWei5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOkJ6fV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChWeixbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6Qnp9XX0pLG51bGwpO2NsYXNzIGp6e2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLl9jb250ZW50T2JzZXJ2ZXI9dCx0aGlzLl9lbGVtZW50UmVmPWUsdGhpcy5fbmdab25lPW4sdGhpcy5ldmVudD1uZXcgTGgsdGhpcy5fZGlzYWJsZWQ9ITEsdGhpcy5fY3VycmVudFN1YnNjcmlwdGlvbj1udWxsfWdldCBkaXNhYmxlZCgpe3JldHVybiB0aGlzLl9kaXNhYmxlZH1zZXQgZGlzYWJsZWQodCl7dGhpcy5fZGlzYWJsZWQ9eXoodCksdGhpcy5fZGlzYWJsZWQ/dGhpcy5fdW5zdWJzY3JpYmUoKTp0aGlzLl9zdWJzY3JpYmUoKX1nZXQgZGVib3VuY2UoKXtyZXR1cm4gdGhpcy5fZGVib3VuY2V9c2V0IGRlYm91bmNlKHQpe3RoaXMuX2RlYm91bmNlPV96KHQpLHRoaXMuX3N1YnNjcmliZSgpfW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX2N1cnJlbnRTdWJzY3JpcHRpb258fHRoaXMuZGlzYWJsZWR8fHRoaXMuX3N1YnNjcmliZSgpfW5nT25EZXN0cm95KCl7dGhpcy5fdW5zdWJzY3JpYmUoKX1fc3Vic2NyaWJlKCl7dGhpcy5fdW5zdWJzY3JpYmUoKTtjb25zdCB0PXRoaXMuX2NvbnRlbnRPYnNlcnZlci5vYnNlcnZlKHRoaXMuX2VsZW1lbnRSZWYpO3RoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9Pnt0aGlzLl9jdXJyZW50U3Vic2NyaXB0aW9uPSh0aGlzLmRlYm91bmNlP3QucGlwZShnZSh0aGlzLmRlYm91bmNlKSk6dCkuc3Vic2NyaWJlKHRoaXMuZXZlbnQpfSkpfV91bnN1YnNjcmliZSgpe3ZhciB0O251bGw9PT0odD10aGlzLl9jdXJyZW50U3Vic2NyaXB0aW9uKXx8dm9pZCAwPT09dHx8dC51bnN1YnNjcmliZSgpfX1qei7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8anopKFNtKFZ6KSxTbShoZyksU20oYV8pKX0sanouybVkaXI9bG8oe3R5cGU6anosc2VsZWN0b3JzOltbIiIsImNka09ic2VydmVDb250ZW50IiwiIl1dLGlucHV0czp7ZGlzYWJsZWQ6WyJjZGtPYnNlcnZlQ29udGVudERpc2FibGVkIiwiZGlzYWJsZWQiXSxkZWJvdW5jZToiZGVib3VuY2UifSxvdXRwdXRzOntldmVudDoiY2RrT2JzZXJ2ZUNvbnRlbnQifSxleHBvcnRBczpbImNka09ic2VydmVDb250ZW50Il19KSxqei5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlZ6fSx7dHlwZTpoZ30se3R5cGU6YV99XSxqei5wcm9wRGVjb3JhdG9ycz17ZXZlbnQ6W3t0eXBlOk95LGFyZ3M6WyJjZGtPYnNlcnZlQ29udGVudCJdfV0sZGlzYWJsZWQ6W3t0eXBlOnh5LGFyZ3M6WyJjZGtPYnNlcnZlQ29udGVudERpc2FibGVkIl19XSxkZWJvdW5jZTpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChqeixbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbY2RrT2JzZXJ2ZUNvbnRlbnRdIixleHBvcnRBczoiY2RrT2JzZXJ2ZUNvbnRlbnQifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6Vnp9LHt0eXBlOmhnfSx7dHlwZTphX31dfSkse2V2ZW50Olt7dHlwZTpPeSxhcmdzOlsiY2RrT2JzZXJ2ZUNvbnRlbnQiXX1dLGRpc2FibGVkOlt7dHlwZTp4eSxhcmdzOlsiY2RrT2JzZXJ2ZUNvbnRlbnREaXNhYmxlZCJdfV0sZGVib3VuY2U6W3t0eXBlOnh5fV19KTtjbGFzcyBVent9ZnVuY3Rpb24gR3oodCxlKXtyZXR1cm4odC5nZXRBdHRyaWJ1dGUoZSl8fCIiKS5tYXRjaCgvXFMrL2cpfHxbXX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovVXouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFV6KX0sVXouybVtb2Q9YW8oe3R5cGU6VXp9KSxVei7JtWluaj12bih7cHJvdmlkZXJzOltCel19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFV6LFt7dHlwZTpBeSxhcmdzOlt7ZXhwb3J0czpbanpdLGRlY2xhcmF0aW9uczpbanpdLHByb3ZpZGVyczpbQnpdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oVXose2RlY2xhcmF0aW9uczpbanpdLGV4cG9ydHM6W2p6XX0pO2NvbnN0IFd6PSJjZGstZGVzY3JpYmVkYnktbWVzc2FnZS1jb250YWluZXIiLFl6PSJjZGstZGVzY3JpYmVkYnktaG9zdCI7bGV0IHF6PTA7Y29uc3QgWno9bmV3IE1hcDtsZXQgWHo9bnVsbDtjbGFzcyBLentjb25zdHJ1Y3Rvcih0KXt0aGlzLl9kb2N1bWVudD10fWRlc2NyaWJlKHQsZSxuKXtpZighdGhpcy5fY2FuQmVEZXNjcmliZWQodCxlKSlyZXR1cm47Y29uc3Qgbz1KeihlLG4pOyJzdHJpbmciIT10eXBlb2YgZT8oUXooZSksWnouc2V0KG8se21lc3NhZ2VFbGVtZW50OmUscmVmZXJlbmNlQ291bnQ6MH0pKTpaei5oYXMobyl8fHRoaXMuX2NyZWF0ZU1lc3NhZ2VFbGVtZW50KGUsbiksdGhpcy5faXNFbGVtZW50RGVzY3JpYmVkQnlNZXNzYWdlKHQsbyl8fHRoaXMuX2FkZE1lc3NhZ2VSZWZlcmVuY2UodCxvKX1yZW1vdmVEZXNjcmlwdGlvbih0LGUsbil7aWYoIWV8fCF0aGlzLl9pc0VsZW1lbnROb2RlKHQpKXJldHVybjtjb25zdCBvPUp6KGUsbik7aWYodGhpcy5faXNFbGVtZW50RGVzY3JpYmVkQnlNZXNzYWdlKHQsbykmJnRoaXMuX3JlbW92ZU1lc3NhZ2VSZWZlcmVuY2UodCxvKSwic3RyaW5nIj09dHlwZW9mIGUpe2NvbnN0IHQ9WnouZ2V0KG8pO3QmJjA9PT10LnJlZmVyZW5jZUNvdW50JiZ0aGlzLl9kZWxldGVNZXNzYWdlRWxlbWVudChvKX1YeiYmMD09PVh6LmNoaWxkTm9kZXMubGVuZ3RoJiZ0aGlzLl9kZWxldGVNZXNzYWdlc0NvbnRhaW5lcigpfW5nT25EZXN0cm95KCl7Y29uc3QgdD10aGlzLl9kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbY2RrLWRlc2NyaWJlZGJ5LWhvc3RdIik7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspdGhpcy5fcmVtb3ZlQ2RrRGVzY3JpYmVkQnlSZWZlcmVuY2VJZHModFtlXSksdFtlXS5yZW1vdmVBdHRyaWJ1dGUoWXopO1h6JiZ0aGlzLl9kZWxldGVNZXNzYWdlc0NvbnRhaW5lcigpLFp6LmNsZWFyKCl9X2NyZWF0ZU1lc3NhZ2VFbGVtZW50KHQsZSl7Y29uc3Qgbj10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtReihuKSxuLnRleHRDb250ZW50PXQsZSYmbi5zZXRBdHRyaWJ1dGUoInJvbGUiLGUpLHRoaXMuX2NyZWF0ZU1lc3NhZ2VzQ29udGFpbmVyKCksWHouYXBwZW5kQ2hpbGQobiksWnouc2V0KEp6KHQsZSkse21lc3NhZ2VFbGVtZW50Om4scmVmZXJlbmNlQ291bnQ6MH0pfV9kZWxldGVNZXNzYWdlRWxlbWVudCh0KXtjb25zdCBlPVp6LmdldCh0KSxuPWUmJmUubWVzc2FnZUVsZW1lbnQ7WHomJm4mJlh6LnJlbW92ZUNoaWxkKG4pLFp6LmRlbGV0ZSh0KX1fY3JlYXRlTWVzc2FnZXNDb250YWluZXIoKXtpZighWHope2NvbnN0IHQ9dGhpcy5fZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoV3opO3QmJnQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLFh6PXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLFh6LmlkPVd6LFh6LnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIsWHouY2xhc3NMaXN0LmFkZCgiY2RrLXZpc3VhbGx5LWhpZGRlbiIpLHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoWHopfX1fZGVsZXRlTWVzc2FnZXNDb250YWluZXIoKXtYeiYmWHoucGFyZW50Tm9kZSYmKFh6LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoWHopLFh6PW51bGwpfV9yZW1vdmVDZGtEZXNjcmliZWRCeVJlZmVyZW5jZUlkcyh0KXtjb25zdCBlPUd6KHQsImFyaWEtZGVzY3JpYmVkYnkiKS5maWx0ZXIoKHQ9PjAhPXQuaW5kZXhPZigiY2RrLWRlc2NyaWJlZGJ5LW1lc3NhZ2UiKSkpO3Quc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5IixlLmpvaW4oIiAiKSl9X2FkZE1lc3NhZ2VSZWZlcmVuY2UodCxlKXtjb25zdCBuPVp6LmdldChlKTshKGZ1bmN0aW9uIG8odCxlLG4pe2NvbnN0IG89R3oodCxlKTtvLnNvbWUoKHQ9PnQudHJpbSgpPT1uLnRyaW0oKSkpfHwoby5wdXNoKG4udHJpbSgpKSx0LnNldEF0dHJpYnV0ZShlLG8uam9pbigiICIpKSl9KSh0LCJhcmlhLWRlc2NyaWJlZGJ5IixuLm1lc3NhZ2VFbGVtZW50LmlkKSx0LnNldEF0dHJpYnV0ZShZeiwiIiksbi5yZWZlcmVuY2VDb3VudCsrfV9yZW1vdmVNZXNzYWdlUmVmZXJlbmNlKHQsZSl7Y29uc3Qgbj1aei5nZXQoZSk7bi5yZWZlcmVuY2VDb3VudC0tLChmdW5jdGlvbiBvKHQsZSxuKXtjb25zdCBvPUd6KHQsZSkuZmlsdGVyKCh0PT50IT1uLnRyaW0oKSkpO28ubGVuZ3RoP3Quc2V0QXR0cmlidXRlKGUsby5qb2luKCIgIikpOnQucmVtb3ZlQXR0cmlidXRlKGUpfSkodCwiYXJpYS1kZXNjcmliZWRieSIsbi5tZXNzYWdlRWxlbWVudC5pZCksdC5yZW1vdmVBdHRyaWJ1dGUoWXopfV9pc0VsZW1lbnREZXNjcmliZWRCeU1lc3NhZ2UodCxlKXtjb25zdCBuPUd6KHQsImFyaWEtZGVzY3JpYmVkYnkiKSxvPVp6LmdldChlKSxpPW8mJm8ubWVzc2FnZUVsZW1lbnQuaWQ7cmV0dXJuISFpJiYtMSE9bi5pbmRleE9mKGkpfV9jYW5CZURlc2NyaWJlZCh0LGUpe2lmKCF0aGlzLl9pc0VsZW1lbnROb2RlKHQpKXJldHVybiExO2lmKGUmJiJvYmplY3QiPT10eXBlb2YgZSlyZXR1cm4hMDtjb25zdCBuPW51bGw9PWU/IiI6YCR7ZX1gLnRyaW0oKSxvPXQuZ2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIik7cmV0dXJuISghbnx8byYmby50cmltKCk9PT1uKX1faXNFbGVtZW50Tm9kZSh0KXtyZXR1cm4gdC5ub2RlVHlwZT09PXRoaXMuX2RvY3VtZW50LkVMRU1FTlRfTk9ERX19ZnVuY3Rpb24gSnoodCxlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/YCR7ZXx8IiJ9LyR7dH1gOnR9ZnVuY3Rpb24gUXoodCl7dC5pZHx8KHQuaWQ9ImNkay1kZXNjcmliZWRieS1tZXNzYWdlLSIrcXorKyl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL0t6Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxLeikodnIoWl8pKX0sS3ouybVwcm92PU1uKHtmYWN0b3J5OmZ1bmN0aW9uIHQoKXtyZXR1cm4gbmV3IEt6KHZyKFpfKSl9LHRva2VuOkt6LHByb3ZpZGVkSW46InJvb3QifSksS3ouY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEt6LFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XX0pLG51bGwpO2NsYXNzICR6e2NvbnN0cnVjdG9yKHQpe3RoaXMuX2l0ZW1zPXQsdGhpcy5fYWN0aXZlSXRlbUluZGV4PS0xLHRoaXMuX2FjdGl2ZUl0ZW09bnVsbCx0aGlzLl93cmFwPSExLHRoaXMuX2xldHRlcktleVN0cmVhbT1uZXcgSSx0aGlzLl90eXBlYWhlYWRTdWJzY3JpcHRpb249bS5FTVBUWSx0aGlzLl92ZXJ0aWNhbD0hMCx0aGlzLl9hbGxvd2VkTW9kaWZpZXJLZXlzPVtdLHRoaXMuX2hvbWVBbmRFbmQ9ITEsdGhpcy5fc2tpcFByZWRpY2F0ZUZuPXQ9PnQuZGlzYWJsZWQsdGhpcy5fcHJlc3NlZExldHRlcnM9W10sdGhpcy50YWJPdXQ9bmV3IEksdGhpcy5jaGFuZ2U9bmV3IEksdCBpbnN0YW5jZW9mIFZoJiZ0LmNoYW5nZXMuc3Vic2NyaWJlKCh0PT57aWYodGhpcy5fYWN0aXZlSXRlbSl7Y29uc3QgZT10LnRvQXJyYXkoKS5pbmRleE9mKHRoaXMuX2FjdGl2ZUl0ZW0pO2U+LTEmJmUhPT10aGlzLl9hY3RpdmVJdGVtSW5kZXgmJih0aGlzLl9hY3RpdmVJdGVtSW5kZXg9ZSl9fSkpfXNraXBQcmVkaWNhdGUodCl7cmV0dXJuIHRoaXMuX3NraXBQcmVkaWNhdGVGbj10LHRoaXN9d2l0aFdyYXAodD0hMCl7cmV0dXJuIHRoaXMuX3dyYXA9dCx0aGlzfXdpdGhWZXJ0aWNhbE9yaWVudGF0aW9uKHQ9ITApe3JldHVybiB0aGlzLl92ZXJ0aWNhbD10LHRoaXN9d2l0aEhvcml6b250YWxPcmllbnRhdGlvbih0KXtyZXR1cm4gdGhpcy5faG9yaXpvbnRhbD10LHRoaXN9d2l0aEFsbG93ZWRNb2RpZmllcktleXModCl7cmV0dXJuIHRoaXMuX2FsbG93ZWRNb2RpZmllcktleXM9dCx0aGlzfXdpdGhUeXBlQWhlYWQodD0yMDApe2lmKCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmdGhpcy5faXRlbXMubGVuZ3RoJiZ0aGlzLl9pdGVtcy5zb21lKCh0PT4iZnVuY3Rpb24iIT10eXBlb2YgdC5nZXRMYWJlbCkpKXRocm93IEVycm9yKCJMaXN0S2V5TWFuYWdlciBpdGVtcyBpbiB0eXBlYWhlYWQgbW9kZSBtdXN0IGltcGxlbWVudCB0aGUgYGdldExhYmVsYCBtZXRob2QuIik7cmV0dXJuIHRoaXMuX3R5cGVhaGVhZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX3R5cGVhaGVhZFN1YnNjcmlwdGlvbj10aGlzLl9sZXR0ZXJLZXlTdHJlYW0ucGlwZShGZSgodD0+dGhpcy5fcHJlc3NlZExldHRlcnMucHVzaCh0KSkpLGdlKHQpLGNlKCgoKT0+dGhpcy5fcHJlc3NlZExldHRlcnMubGVuZ3RoPjApKSxJdCgoKCk9PnRoaXMuX3ByZXNzZWRMZXR0ZXJzLmpvaW4oIiIpKSkpLnN1YnNjcmliZSgodD0+e2NvbnN0IGU9dGhpcy5fZ2V0SXRlbXNBcnJheSgpO2ZvcihsZXQgbj0xO248ZS5sZW5ndGgrMTtuKyspe2NvbnN0IG89KHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCtuKSVlLmxlbmd0aCxpPWVbb107aWYoIXRoaXMuX3NraXBQcmVkaWNhdGVGbihpKSYmMD09PWkuZ2V0TGFiZWwoKS50b1VwcGVyQ2FzZSgpLnRyaW0oKS5pbmRleE9mKHQpKXt0aGlzLnNldEFjdGl2ZUl0ZW0obyk7YnJlYWt9fXRoaXMuX3ByZXNzZWRMZXR0ZXJzPVtdfSkpLHRoaXN9d2l0aEhvbWVBbmRFbmQodD0hMCl7cmV0dXJuIHRoaXMuX2hvbWVBbmRFbmQ9dCx0aGlzfXNldEFjdGl2ZUl0ZW0odCl7Y29uc3QgZT10aGlzLl9hY3RpdmVJdGVtO3RoaXMudXBkYXRlQWN0aXZlSXRlbSh0KSx0aGlzLl9hY3RpdmVJdGVtIT09ZSYmdGhpcy5jaGFuZ2UubmV4dCh0aGlzLl9hY3RpdmVJdGVtSW5kZXgpfW9uS2V5ZG93bih0KXtjb25zdCBlPXQua2V5Q29kZSxuPVsiYWx0S2V5IiwiY3RybEtleSIsIm1ldGFLZXkiLCJzaGlmdEtleSJdLmV2ZXJ5KChlPT4hdFtlXXx8dGhpcy5fYWxsb3dlZE1vZGlmaWVyS2V5cy5pbmRleE9mKGUpPi0xKSk7c3dpdGNoKGUpe2Nhc2UgOTpyZXR1cm4gdm9pZCB0aGlzLnRhYk91dC5uZXh0KCk7Y2FzZSBoejppZih0aGlzLl92ZXJ0aWNhbCYmbil7dGhpcy5zZXROZXh0SXRlbUFjdGl2ZSgpO2JyZWFrfXJldHVybjtjYXNlIGd6OmlmKHRoaXMuX3ZlcnRpY2FsJiZuKXt0aGlzLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpO2JyZWFrfXJldHVybjtjYXNlIDM5OmlmKHRoaXMuX2hvcml6b250YWwmJm4peyJydGwiPT09dGhpcy5faG9yaXpvbnRhbD90aGlzLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpOnRoaXMuc2V0TmV4dEl0ZW1BY3RpdmUoKTticmVha31yZXR1cm47Y2FzZSAzNzppZih0aGlzLl9ob3Jpem9udGFsJiZuKXsicnRsIj09PXRoaXMuX2hvcml6b250YWw/dGhpcy5zZXROZXh0SXRlbUFjdGl2ZSgpOnRoaXMuc2V0UHJldmlvdXNJdGVtQWN0aXZlKCk7YnJlYWt9cmV0dXJuO2Nhc2UgMzY6aWYodGhpcy5faG9tZUFuZEVuZCYmbil7dGhpcy5zZXRGaXJzdEl0ZW1BY3RpdmUoKTticmVha31yZXR1cm47Y2FzZSAzNTppZih0aGlzLl9ob21lQW5kRW5kJiZuKXt0aGlzLnNldExhc3RJdGVtQWN0aXZlKCk7YnJlYWt9cmV0dXJuO2RlZmF1bHQ6cmV0dXJuIHZvaWQoKG58fGJ6KHQsInNoaWZ0S2V5IikpJiYodC5rZXkmJjE9PT10LmtleS5sZW5ndGg/dGhpcy5fbGV0dGVyS2V5U3RyZWFtLm5leHQodC5rZXkudG9Mb2NhbGVVcHBlckNhc2UoKSk6KGU+PTY1JiZlPD05MHx8ZT49NDgmJmU8PTU3KSYmdGhpcy5fbGV0dGVyS2V5U3RyZWFtLm5leHQoU3RyaW5nLmZyb21DaGFyQ29kZShlKSkpKX10aGlzLl9wcmVzc2VkTGV0dGVycz1bXSx0LnByZXZlbnREZWZhdWx0KCl9Z2V0IGFjdGl2ZUl0ZW1JbmRleCgpe3JldHVybiB0aGlzLl9hY3RpdmVJdGVtSW5kZXh9Z2V0IGFjdGl2ZUl0ZW0oKXtyZXR1cm4gdGhpcy5fYWN0aXZlSXRlbX1pc1R5cGluZygpe3JldHVybiB0aGlzLl9wcmVzc2VkTGV0dGVycy5sZW5ndGg+MH1zZXRGaXJzdEl0ZW1BY3RpdmUoKXt0aGlzLl9zZXRBY3RpdmVJdGVtQnlJbmRleCgwLDEpfXNldExhc3RJdGVtQWN0aXZlKCl7dGhpcy5fc2V0QWN0aXZlSXRlbUJ5SW5kZXgodGhpcy5faXRlbXMubGVuZ3RoLTEsLTEpfXNldE5leHRJdGVtQWN0aXZlKCl7dGhpcy5fYWN0aXZlSXRlbUluZGV4PDA/dGhpcy5zZXRGaXJzdEl0ZW1BY3RpdmUoKTp0aGlzLl9zZXRBY3RpdmVJdGVtQnlEZWx0YSgxKX1zZXRQcmV2aW91c0l0ZW1BY3RpdmUoKXt0aGlzLl9hY3RpdmVJdGVtSW5kZXg8MCYmdGhpcy5fd3JhcD90aGlzLnNldExhc3RJdGVtQWN0aXZlKCk6dGhpcy5fc2V0QWN0aXZlSXRlbUJ5RGVsdGEoLTEpfXVwZGF0ZUFjdGl2ZUl0ZW0odCl7Y29uc3QgZT10aGlzLl9nZXRJdGVtc0FycmF5KCksbj0ibnVtYmVyIj09dHlwZW9mIHQ/dDplLmluZGV4T2YodCksbz1lW25dO3RoaXMuX2FjdGl2ZUl0ZW09bnVsbD09bz9udWxsOm8sdGhpcy5fYWN0aXZlSXRlbUluZGV4PW59X3NldEFjdGl2ZUl0ZW1CeURlbHRhKHQpe3RoaXMuX3dyYXA/dGhpcy5fc2V0QWN0aXZlSW5XcmFwTW9kZSh0KTp0aGlzLl9zZXRBY3RpdmVJbkRlZmF1bHRNb2RlKHQpfV9zZXRBY3RpdmVJbldyYXBNb2RlKHQpe2NvbnN0IGU9dGhpcy5fZ2V0SXRlbXNBcnJheSgpO2ZvcihsZXQgbj0xO248PWUubGVuZ3RoO24rKyl7Y29uc3Qgbz0odGhpcy5fYWN0aXZlSXRlbUluZGV4K3QqbitlLmxlbmd0aCklZS5sZW5ndGg7aWYoIXRoaXMuX3NraXBQcmVkaWNhdGVGbihlW29dKSlyZXR1cm4gdm9pZCB0aGlzLnNldEFjdGl2ZUl0ZW0obyl9fV9zZXRBY3RpdmVJbkRlZmF1bHRNb2RlKHQpe3RoaXMuX3NldEFjdGl2ZUl0ZW1CeUluZGV4KHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCt0LHQpfV9zZXRBY3RpdmVJdGVtQnlJbmRleCh0LGUpe2NvbnN0IG49dGhpcy5fZ2V0SXRlbXNBcnJheSgpO2lmKG5bdF0pe2Zvcig7dGhpcy5fc2tpcFByZWRpY2F0ZUZuKG5bdF0pOylpZighblt0Kz1lXSlyZXR1cm47dGhpcy5zZXRBY3RpdmVJdGVtKHQpfX1fZ2V0SXRlbXNBcnJheSgpe3JldHVybiB0aGlzLl9pdGVtcyBpbnN0YW5jZW9mIFZoP3RoaXMuX2l0ZW1zLnRvQXJyYXkoKTp0aGlzLl9pdGVtc319Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIHRJIGV4dGVuZHMgJHp7c2V0QWN0aXZlSXRlbSh0KXt0aGlzLmFjdGl2ZUl0ZW0mJnRoaXMuYWN0aXZlSXRlbS5zZXRJbmFjdGl2ZVN0eWxlcygpLHN1cGVyLnNldEFjdGl2ZUl0ZW0odCksdGhpcy5hY3RpdmVJdGVtJiZ0aGlzLmFjdGl2ZUl0ZW0uc2V0QWN0aXZlU3R5bGVzKCl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBlSSBleHRlbmRzICR6e2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9vcmlnaW49InByb2dyYW0ifXNldEZvY3VzT3JpZ2luKHQpe3JldHVybiB0aGlzLl9vcmlnaW49dCx0aGlzfXNldEFjdGl2ZUl0ZW0odCl7c3VwZXIuc2V0QWN0aXZlSXRlbSh0KSx0aGlzLmFjdGl2ZUl0ZW0mJnRoaXMuYWN0aXZlSXRlbS5mb2N1cyh0aGlzLl9vcmlnaW4pfX1jbGFzcyBuSXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9wbGF0Zm9ybT10fWlzRGlzYWJsZWQodCl7cmV0dXJuIHQuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpfWlzVmlzaWJsZSh0KXtyZXR1cm4oZnVuY3Rpb24gZSh0KXtyZXR1cm4hISh0Lm9mZnNldFdpZHRofHx0Lm9mZnNldEhlaWdodHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQuZ2V0Q2xpZW50UmVjdHMmJnQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSkodCkmJiJ2aXNpYmxlIj09PWdldENvbXB1dGVkU3R5bGUodCkudmlzaWJpbGl0eX1pc1RhYmJhYmxlKHQpe2lmKCF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpcmV0dXJuITE7Y29uc3QgZT0oZnVuY3Rpb24gbyh0KXt0cnl7cmV0dXJuIHQuZnJhbWVFbGVtZW50fWNhdGNoKHQpe3JldHVybiBudWxsfX0pKChmdW5jdGlvbiBuKHQpe3JldHVybiB0Lm93bmVyRG9jdW1lbnQmJnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8d2luZG93fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8pKHQpKTtpZihlKXtpZigtMT09PWlJKGUpKXJldHVybiExO2lmKCF0aGlzLmlzVmlzaWJsZShlKSlyZXR1cm4hMX1sZXQgaT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksYT1pSSh0KTtyZXR1cm4gdC5oYXNBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIpPy0xIT09YToiaWZyYW1lIiE9PWkmJiJvYmplY3QiIT09aSYmISh0aGlzLl9wbGF0Zm9ybS5XRUJLSVQmJnRoaXMuX3BsYXRmb3JtLklPUyYmIShmdW5jdGlvbiByKHQpe2xldCBlPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxuPSJpbnB1dCI9PT1lJiZ0LnR5cGU7cmV0dXJuInRleHQiPT09bnx8InBhc3N3b3JkIj09PW58fCJzZWxlY3QiPT09ZXx8InRleHRhcmVhIj09PWV9KSh0KSkmJigiYXVkaW8iPT09aT8hIXQuaGFzQXR0cmlidXRlKCJjb250cm9scyIpJiYtMSE9PWE6InZpZGVvIj09PWk/LTEhPT1hJiYobnVsbCE9PWF8fHRoaXMuX3BsYXRmb3JtLkZJUkVGT1h8fHQuaGFzQXR0cmlidXRlKCJjb250cm9scyIpKTp0LnRhYkluZGV4Pj0wKX1pc0ZvY3VzYWJsZSh0LGUpe3JldHVybihmdW5jdGlvbiBuKHQpe3JldHVybiEoZnVuY3Rpb24gZSh0KXtyZXR1cm4oZnVuY3Rpb24gZSh0KXtyZXR1cm4iaW5wdXQiPT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCl9KSh0KSYmImhpZGRlbiI9PXQudHlwZX0pKHQpJiYoKGZ1bmN0aW9uIG4odCl7bGV0IGU9dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1lfHwic2VsZWN0Ij09PWV8fCJidXR0b24iPT09ZXx8InRleHRhcmVhIj09PWV9KSh0KXx8KGZ1bmN0aW9uIG8odCl7cmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJuImEiPT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCl9KSh0KSYmdC5oYXNBdHRyaWJ1dGUoImhyZWYiKX0pKHQpfHx0Lmhhc0F0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIil8fG9JKHQpKX0pKHQpJiYhdGhpcy5pc0Rpc2FibGVkKHQpJiYoKG51bGw9PWU/dm9pZCAwOmUuaWdub3JlVmlzaWJpbGl0eSl8fHRoaXMuaXNWaXNpYmxlKHQpKX19ZnVuY3Rpb24gb0kodCl7aWYoIXQuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfHx2b2lkIDA9PT10LnRhYkluZGV4KXJldHVybiExO2xldCBlPXQuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpO3JldHVybiItMzI3NjgiIT1lJiYhKCFlfHxpc05hTihwYXJzZUludChlLDEwKSkpfWZ1bmN0aW9uIGlJKHQpe2lmKCFvSSh0KSlyZXR1cm4gbnVsbDtjb25zdCBlPXBhcnNlSW50KHQuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpfHwiIiwxMCk7cmV0dXJuIGlzTmFOKGUpPy0xOmV9bkkuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fG5JKSh2cih3eikpfSxuSS7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgbkkodnIod3opKX0sdG9rZW46bkkscHJvdmlkZWRJbjoicm9vdCJ9KSxuSS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnd6fV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChuSSxbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6d3p9XX0pLG51bGwpO2NsYXNzIGFJe2NvbnN0cnVjdG9yKHQsZSxuLG8saT0hMSl7dGhpcy5fZWxlbWVudD10LHRoaXMuX2NoZWNrZXI9ZSx0aGlzLl9uZ1pvbmU9bix0aGlzLl9kb2N1bWVudD1vLHRoaXMuX2hhc0F0dGFjaGVkPSExLHRoaXMuc3RhcnRBbmNob3JMaXN0ZW5lcj0oKT0+dGhpcy5mb2N1c0xhc3RUYWJiYWJsZUVsZW1lbnQoKSx0aGlzLmVuZEFuY2hvckxpc3RlbmVyPSgpPT50aGlzLmZvY3VzRmlyc3RUYWJiYWJsZUVsZW1lbnQoKSx0aGlzLl9lbmFibGVkPSEwLGl8fHRoaXMuYXR0YWNoQW5jaG9ycygpfWdldCBlbmFibGVkKCl7cmV0dXJuIHRoaXMuX2VuYWJsZWR9c2V0IGVuYWJsZWQodCl7dGhpcy5fZW5hYmxlZD10LHRoaXMuX3N0YXJ0QW5jaG9yJiZ0aGlzLl9lbmRBbmNob3ImJih0aGlzLl90b2dnbGVBbmNob3JUYWJJbmRleCh0LHRoaXMuX3N0YXJ0QW5jaG9yKSx0aGlzLl90b2dnbGVBbmNob3JUYWJJbmRleCh0LHRoaXMuX2VuZEFuY2hvcikpfWRlc3Ryb3koKXtjb25zdCB0PXRoaXMuX3N0YXJ0QW5jaG9yLGU9dGhpcy5fZW5kQW5jaG9yO3QmJih0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLnN0YXJ0QW5jaG9yTGlzdGVuZXIpLHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpKSxlJiYoZS5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5lbmRBbmNob3JMaXN0ZW5lciksZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSkpLHRoaXMuX3N0YXJ0QW5jaG9yPXRoaXMuX2VuZEFuY2hvcj1udWxsLHRoaXMuX2hhc0F0dGFjaGVkPSExfWF0dGFjaEFuY2hvcnMoKXtyZXR1cm4hIXRoaXMuX2hhc0F0dGFjaGVkfHwodGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e3RoaXMuX3N0YXJ0QW5jaG9yfHwodGhpcy5fc3RhcnRBbmNob3I9dGhpcy5fY3JlYXRlQW5jaG9yKCksdGhpcy5fc3RhcnRBbmNob3IuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuc3RhcnRBbmNob3JMaXN0ZW5lcikpLHRoaXMuX2VuZEFuY2hvcnx8KHRoaXMuX2VuZEFuY2hvcj10aGlzLl9jcmVhdGVBbmNob3IoKSx0aGlzLl9lbmRBbmNob3IuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuZW5kQW5jaG9yTGlzdGVuZXIpKX0pKSx0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUmJih0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuX3N0YXJ0QW5jaG9yLHRoaXMuX2VsZW1lbnQpLHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5fZW5kQW5jaG9yLHRoaXMuX2VsZW1lbnQubmV4dFNpYmxpbmcpLHRoaXMuX2hhc0F0dGFjaGVkPSEwKSx0aGlzLl9oYXNBdHRhY2hlZCl9Zm9jdXNJbml0aWFsRWxlbWVudFdoZW5SZWFkeSh0KXtyZXR1cm4gbmV3IFByb21pc2UoKGU9Pnt0aGlzLl9leGVjdXRlT25TdGFibGUoKCgpPT5lKHRoaXMuZm9jdXNJbml0aWFsRWxlbWVudCh0KSkpKX0pKX1mb2N1c0ZpcnN0VGFiYmFibGVFbGVtZW50V2hlblJlYWR5KHQpe3JldHVybiBuZXcgUHJvbWlzZSgoZT0+e3RoaXMuX2V4ZWN1dGVPblN0YWJsZSgoKCk9PmUodGhpcy5mb2N1c0ZpcnN0VGFiYmFibGVFbGVtZW50KHQpKSkpfSkpfWZvY3VzTGFzdFRhYmJhYmxlRWxlbWVudFdoZW5SZWFkeSh0KXtyZXR1cm4gbmV3IFByb21pc2UoKGU9Pnt0aGlzLl9leGVjdXRlT25TdGFibGUoKCgpPT5lKHRoaXMuZm9jdXNMYXN0VGFiYmFibGVFbGVtZW50KHQpKSkpfSkpfV9nZXRSZWdpb25Cb3VuZGFyeSh0KXtsZXQgZT10aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFtjZGstZm9jdXMtcmVnaW9uLSR7dH1dLCBbY2RrRm9jdXNSZWdpb24ke3R9XSwgW2Nkay1mb2N1cy0ke3R9XWApO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWVbbl0uaGFzQXR0cmlidXRlKGBjZGstZm9jdXMtJHt0fWApP2NvbnNvbGUud2FybihgRm91bmQgdXNlIG9mIGRlcHJlY2F0ZWQgYXR0cmlidXRlICdjZGstZm9jdXMtJHt0fScsIHVzZSAnY2RrRm9jdXNSZWdpb24ke3R9JyBpbnN0ZWFkLiBUaGUgZGVwcmVjYXRlZCBhdHRyaWJ1dGUgd2lsbCBiZSByZW1vdmVkIGluIDguMC4wLmAsZVtuXSk6ZVtuXS5oYXNBdHRyaWJ1dGUoYGNkay1mb2N1cy1yZWdpb24tJHt0fWApJiZjb25zb2xlLndhcm4oYEZvdW5kIHVzZSBvZiBkZXByZWNhdGVkIGF0dHJpYnV0ZSAnY2RrLWZvY3VzLXJlZ2lvbi0ke3R9JywgdXNlICdjZGtGb2N1c1JlZ2lvbiR7dH0nIGluc3RlYWQuIFRoZSBkZXByZWNhdGVkIGF0dHJpYnV0ZSB3aWxsIGJlIHJlbW92ZWQgaW4gOC4wLjAuYCxlW25dKTtyZXR1cm4ic3RhcnQiPT10P2UubGVuZ3RoP2VbMF06dGhpcy5fZ2V0Rmlyc3RUYWJiYWJsZUVsZW1lbnQodGhpcy5fZWxlbWVudCk6ZS5sZW5ndGg/ZVtlLmxlbmd0aC0xXTp0aGlzLl9nZXRMYXN0VGFiYmFibGVFbGVtZW50KHRoaXMuX2VsZW1lbnQpfWZvY3VzSW5pdGlhbEVsZW1lbnQodCl7Y29uc3QgZT10aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIltjZGstZm9jdXMtaW5pdGlhbF0sIFtjZGtGb2N1c0luaXRpYWxdIik7aWYoZSl7aWYoZS5oYXNBdHRyaWJ1dGUoImNkay1mb2N1cy1pbml0aWFsIikmJmNvbnNvbGUud2FybigiRm91bmQgdXNlIG9mIGRlcHJlY2F0ZWQgYXR0cmlidXRlICdjZGstZm9jdXMtaW5pdGlhbCcsIHVzZSAnY2RrRm9jdXNJbml0aWFsJyBpbnN0ZWFkLiBUaGUgZGVwcmVjYXRlZCBhdHRyaWJ1dGUgd2lsbCBiZSByZW1vdmVkIGluIDguMC4wIixlKSwidW5kZWZpbmVkIiE9dHlwZW9mIG5nRGV2TW9kZSYmIW5nRGV2TW9kZXx8dGhpcy5fY2hlY2tlci5pc0ZvY3VzYWJsZShlKXx8Y29uc29sZS53YXJuKCJFbGVtZW50IG1hdGNoaW5nICdbY2RrRm9jdXNJbml0aWFsXScgaXMgbm90IGZvY3VzYWJsZS4iLGUpLCF0aGlzLl9jaGVja2VyLmlzRm9jdXNhYmxlKGUpKXtjb25zdCBuPXRoaXMuX2dldEZpcnN0VGFiYmFibGVFbGVtZW50KGUpO3JldHVybiBudWxsPT1ufHxuLmZvY3VzKHQpLCEhbn1yZXR1cm4gZS5mb2N1cyh0KSwhMH1yZXR1cm4gdGhpcy5mb2N1c0ZpcnN0VGFiYmFibGVFbGVtZW50KHQpfWZvY3VzRmlyc3RUYWJiYWJsZUVsZW1lbnQodCl7Y29uc3QgZT10aGlzLl9nZXRSZWdpb25Cb3VuZGFyeSgic3RhcnQiKTtyZXR1cm4gZSYmZS5mb2N1cyh0KSwhIWV9Zm9jdXNMYXN0VGFiYmFibGVFbGVtZW50KHQpe2NvbnN0IGU9dGhpcy5fZ2V0UmVnaW9uQm91bmRhcnkoImVuZCIpO3JldHVybiBlJiZlLmZvY3VzKHQpLCEhZX1oYXNBdHRhY2hlZCgpe3JldHVybiB0aGlzLl9oYXNBdHRhY2hlZH1fZ2V0Rmlyc3RUYWJiYWJsZUVsZW1lbnQodCl7aWYodGhpcy5fY2hlY2tlci5pc0ZvY3VzYWJsZSh0KSYmdGhpcy5fY2hlY2tlci5pc1RhYmJhYmxlKHQpKXJldHVybiB0O2xldCBlPXQuY2hpbGRyZW58fHQuY2hpbGROb2Rlcztmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7bGV0IG49ZVt0XS5ub2RlVHlwZT09PXRoaXMuX2RvY3VtZW50LkVMRU1FTlRfTk9ERT90aGlzLl9nZXRGaXJzdFRhYmJhYmxlRWxlbWVudChlW3RdKTpudWxsO2lmKG4pcmV0dXJuIG59cmV0dXJuIG51bGx9X2dldExhc3RUYWJiYWJsZUVsZW1lbnQodCl7aWYodGhpcy5fY2hlY2tlci5pc0ZvY3VzYWJsZSh0KSYmdGhpcy5fY2hlY2tlci5pc1RhYmJhYmxlKHQpKXJldHVybiB0O2xldCBlPXQuY2hpbGRyZW58fHQuY2hpbGROb2Rlcztmb3IobGV0IHQ9ZS5sZW5ndGgtMTt0Pj0wO3QtLSl7bGV0IG49ZVt0XS5ub2RlVHlwZT09PXRoaXMuX2RvY3VtZW50LkVMRU1FTlRfTk9ERT90aGlzLl9nZXRMYXN0VGFiYmFibGVFbGVtZW50KGVbdF0pOm51bGw7aWYobilyZXR1cm4gbn1yZXR1cm4gbnVsbH1fY3JlYXRlQW5jaG9yKCl7Y29uc3QgdD10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gdGhpcy5fdG9nZ2xlQW5jaG9yVGFiSW5kZXgodGhpcy5fZW5hYmxlZCx0KSx0LmNsYXNzTGlzdC5hZGQoImNkay12aXN1YWxseS1oaWRkZW4iKSx0LmNsYXNzTGlzdC5hZGQoImNkay1mb2N1cy10cmFwLWFuY2hvciIpLHQuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsInRydWUiKSx0fV90b2dnbGVBbmNob3JUYWJJbmRleCh0LGUpe3Q/ZS5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiMCIpOmUucmVtb3ZlQXR0cmlidXRlKCJ0YWJpbmRleCIpfXRvZ2dsZUFuY2hvcnModCl7dGhpcy5fc3RhcnRBbmNob3ImJnRoaXMuX2VuZEFuY2hvciYmKHRoaXMuX3RvZ2dsZUFuY2hvclRhYkluZGV4KHQsdGhpcy5fc3RhcnRBbmNob3IpLHRoaXMuX3RvZ2dsZUFuY2hvclRhYkluZGV4KHQsdGhpcy5fZW5kQW5jaG9yKSl9X2V4ZWN1dGVPblN0YWJsZSh0KXt0aGlzLl9uZ1pvbmUuaXNTdGFibGU/dCgpOnRoaXMuX25nWm9uZS5vblN0YWJsZS5waXBlKGJlKDEpKS5zdWJzY3JpYmUodCl9fWNsYXNzIHJJe2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLl9jaGVja2VyPXQsdGhpcy5fbmdab25lPWUsdGhpcy5fZG9jdW1lbnQ9bn1jcmVhdGUodCxlPSExKXtyZXR1cm4gbmV3IGFJKHQsdGhpcy5fY2hlY2tlcix0aGlzLl9uZ1pvbmUsdGhpcy5fZG9jdW1lbnQsZSl9fXJJLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxySSkodnIobkkpLHZyKGFfKSx2cihaXykpfSxySS7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgckkodnIobkkpLHZyKGFfKSx2cihaXykpfSx0b2tlbjpySSxwcm92aWRlZEluOiJyb290In0pLHJJLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6bkl9LHt0eXBlOmFffSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHJJLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpuSX0se3R5cGU6YV99LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSksbnVsbCk7Y2xhc3Mgc0l7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuX2VsZW1lbnRSZWY9dCx0aGlzLl9mb2N1c1RyYXBGYWN0b3J5PWUsdGhpcy5fcHJldmlvdXNseUZvY3VzZWRFbGVtZW50PW51bGwsdGhpcy5mb2N1c1RyYXA9dGhpcy5fZm9jdXNUcmFwRmFjdG9yeS5jcmVhdGUodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCEwKX1nZXQgZW5hYmxlZCgpe3JldHVybiB0aGlzLmZvY3VzVHJhcC5lbmFibGVkfXNldCBlbmFibGVkKHQpe3RoaXMuZm9jdXNUcmFwLmVuYWJsZWQ9eXoodCl9Z2V0IGF1dG9DYXB0dXJlKCl7cmV0dXJuIHRoaXMuX2F1dG9DYXB0dXJlfXNldCBhdXRvQ2FwdHVyZSh0KXt0aGlzLl9hdXRvQ2FwdHVyZT15eih0KX1uZ09uRGVzdHJveSgpe3RoaXMuZm9jdXNUcmFwLmRlc3Ryb3koKSx0aGlzLl9wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQmJih0aGlzLl9wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQuZm9jdXMoKSx0aGlzLl9wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQ9bnVsbCl9bmdBZnRlckNvbnRlbnRJbml0KCl7dGhpcy5mb2N1c1RyYXAuYXR0YWNoQW5jaG9ycygpLHRoaXMuYXV0b0NhcHR1cmUmJnRoaXMuX2NhcHR1cmVGb2N1cygpfW5nRG9DaGVjaygpe3RoaXMuZm9jdXNUcmFwLmhhc0F0dGFjaGVkKCl8fHRoaXMuZm9jdXNUcmFwLmF0dGFjaEFuY2hvcnMoKX1uZ09uQ2hhbmdlcyh0KXtjb25zdCBlPXQuYXV0b0NhcHR1cmU7ZSYmIWUuZmlyc3RDaGFuZ2UmJnRoaXMuYXV0b0NhcHR1cmUmJnRoaXMuZm9jdXNUcmFwLmhhc0F0dGFjaGVkKCkmJnRoaXMuX2NhcHR1cmVGb2N1cygpfV9jYXB0dXJlRm9jdXMoKXt0aGlzLl9wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQ9RnooKSx0aGlzLmZvY3VzVHJhcC5mb2N1c0luaXRpYWxFbGVtZW50V2hlblJlYWR5KCl9fXNJLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxzSSkoU20oaGcpLFNtKHJJKSxTbShaXykpfSxzSS7JtWRpcj1sbyh7dHlwZTpzSSxzZWxlY3RvcnM6W1siIiwiY2RrVHJhcEZvY3VzIiwiIl1dLGlucHV0czp7ZW5hYmxlZDpbImNka1RyYXBGb2N1cyIsImVuYWJsZWQiXSxhdXRvQ2FwdHVyZTpbImNka1RyYXBGb2N1c0F1dG9DYXB0dXJlIiwiYXV0b0NhcHR1cmUiXX0sZXhwb3J0QXM6WyJjZGtUcmFwRm9jdXMiXSxmZWF0dXJlczpbQm9dfSksc0kuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ30se3R5cGU6ckl9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dLHNJLnByb3BEZWNvcmF0b3JzPXtlbmFibGVkOlt7dHlwZTp4eSxhcmdzOlsiY2RrVHJhcEZvY3VzIl19XSxhdXRvQ2FwdHVyZTpbe3R5cGU6eHksYXJnczpbImNka1RyYXBGb2N1c0F1dG9DYXB0dXJlIl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChzSSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbY2RrVHJhcEZvY3VzXSIsZXhwb3J0QXM6ImNka1RyYXBGb2N1cyJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6ckl9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSkse2VuYWJsZWQ6W3t0eXBlOnh5LGFyZ3M6WyJjZGtUcmFwRm9jdXMiXX1dLGF1dG9DYXB0dXJlOlt7dHlwZTp4eSxhcmdzOlsiY2RrVHJhcEZvY3VzQXV0b0NhcHR1cmUiXX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBsSSBleHRlbmRzIGFJe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIpe3N1cGVyKHQsZSxuLG8sci5kZWZlciksdGhpcy5fZm9jdXNUcmFwTWFuYWdlcj1pLHRoaXMuX2luZXJ0U3RyYXRlZ3k9YSx0aGlzLl9mb2N1c1RyYXBNYW5hZ2VyLnJlZ2lzdGVyKHRoaXMpfWdldCBlbmFibGVkKCl7cmV0dXJuIHRoaXMuX2VuYWJsZWR9c2V0IGVuYWJsZWQodCl7dGhpcy5fZW5hYmxlZD10LHRoaXMuX2VuYWJsZWQ/dGhpcy5fZm9jdXNUcmFwTWFuYWdlci5yZWdpc3Rlcih0aGlzKTp0aGlzLl9mb2N1c1RyYXBNYW5hZ2VyLmRlcmVnaXN0ZXIodGhpcyl9ZGVzdHJveSgpe3RoaXMuX2ZvY3VzVHJhcE1hbmFnZXIuZGVyZWdpc3Rlcih0aGlzKSxzdXBlci5kZXN0cm95KCl9X2VuYWJsZSgpe3RoaXMuX2luZXJ0U3RyYXRlZ3kucHJldmVudEZvY3VzKHRoaXMpLHRoaXMudG9nZ2xlQW5jaG9ycyghMCl9X2Rpc2FibGUoKXt0aGlzLl9pbmVydFN0cmF0ZWd5LmFsbG93Rm9jdXModGhpcyksdGhpcy50b2dnbGVBbmNob3JzKCExKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCBjST1uZXcgR2EoIkZPQ1VTX1RSQVBfSU5FUlRfU1RSQVRFR1kiKSxkST0idW5kZWZpbmVkIiE9dHlwZW9mIEVsZW1lbnQmJiEhRWxlbWVudC5wcm90b3R5cGUuY2xvc2VzdDsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gcEkodCxlKXtyZXR1cm4gdC5tYXRjaGVzP3QubWF0Y2hlcyhlKTp0Lm1zTWF0Y2hlc1NlbGVjdG9yKGUpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBtSXtjb25zdHJ1Y3Rvcigpe3RoaXMuX2xpc3RlbmVyPW51bGx9cHJldmVudEZvY3VzKHQpe3RoaXMuX2xpc3RlbmVyJiZ0Ll9kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fbGlzdGVuZXIsITApLHRoaXMuX2xpc3RlbmVyPWU9PnRoaXMuX3RyYXBGb2N1cyh0LGUpLHQuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9Pnt0Ll9kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fbGlzdGVuZXIsITApfSkpfWFsbG93Rm9jdXModCl7dGhpcy5fbGlzdGVuZXImJih0Ll9kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fbGlzdGVuZXIsITApLHRoaXMuX2xpc3RlbmVyPW51bGwpfV90cmFwRm9jdXModCxlKXtjb25zdCBuPWUudGFyZ2V0LG89dC5fZWxlbWVudDtvLmNvbnRhaW5zKG4pfHxudWxsIT09KGZ1bmN0aW9uIGkodCxlKXtpZighKHQgaW5zdGFuY2VvZiBOb2RlKSlyZXR1cm4gbnVsbDtsZXQgbj10O2Zvcig7bnVsbCE9biYmIShuIGluc3RhbmNlb2YgRWxlbWVudCk7KW49bi5wYXJlbnROb2RlO3JldHVybiBuJiYoZEk/bi5jbG9zZXN0KGUpOihmdW5jdGlvbiBvKHQsZSl7bGV0IG49dDtmb3IoO251bGwhPW4mJiEobiBpbnN0YW5jZW9mIEVsZW1lbnQmJnBJKG4sZSkpOyluPW4ucGFyZW50Tm9kZTtyZXR1cm4gbnx8bnVsbH0pKG4sZSkpfSkobiwiZGl2LmNkay1vdmVybGF5LXBhbmUiKXx8c2V0VGltZW91dCgoKCk9Pnt0LmVuYWJsZWQmJiFvLmNvbnRhaW5zKHQuX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQpJiZ0LmZvY3VzRmlyc3RUYWJiYWJsZUVsZW1lbnQoKX0pKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIHVJe2NvbnN0cnVjdG9yKCl7dGhpcy5fZm9jdXNUcmFwU3RhY2s9W119cmVnaXN0ZXIodCl7dGhpcy5fZm9jdXNUcmFwU3RhY2s9dGhpcy5fZm9jdXNUcmFwU3RhY2suZmlsdGVyKChlPT5lIT09dCkpO2xldCBlPXRoaXMuX2ZvY3VzVHJhcFN0YWNrO2UubGVuZ3RoJiZlW2UubGVuZ3RoLTFdLl9kaXNhYmxlKCksZS5wdXNoKHQpLHQuX2VuYWJsZSgpfWRlcmVnaXN0ZXIodCl7dC5fZGlzYWJsZSgpO2NvbnN0IGU9dGhpcy5fZm9jdXNUcmFwU3RhY2ssbj1lLmluZGV4T2YodCk7LTEhPT1uJiYoZS5zcGxpY2UobiwxKSxlLmxlbmd0aCYmZVtlLmxlbmd0aC0xXS5fZW5hYmxlKCkpfX11SS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8dUkpfSx1SS7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgdUl9LHRva2VuOnVJLHByb3ZpZGVkSW46InJvb3QifSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh1SSxbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5bXX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgZkl7Y29uc3RydWN0b3IodCxlLG4sbyxpKXt0aGlzLl9jaGVja2VyPXQsdGhpcy5fbmdab25lPWUsdGhpcy5fZm9jdXNUcmFwTWFuYWdlcj1uLHRoaXMuX2RvY3VtZW50PW8sdGhpcy5faW5lcnRTdHJhdGVneT1pfHxuZXcgbUl9Y3JlYXRlKHQsZT17ZGVmZXI6ITF9KXtsZXQgbjtyZXR1cm4gbj0iYm9vbGVhbiI9PXR5cGVvZiBlP3tkZWZlcjplfTplLG5ldyBsSSh0LHRoaXMuX2NoZWNrZXIsdGhpcy5fbmdab25lLHRoaXMuX2RvY3VtZW50LHRoaXMuX2ZvY3VzVHJhcE1hbmFnZXIsdGhpcy5faW5lcnRTdHJhdGVneSxuKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBnSSh0KXtyZXR1cm4gMD09PXQub2Zmc2V0WCYmMD09PXQub2Zmc2V0WX1mdW5jdGlvbiBoSSh0KXtjb25zdCBlPXQudG91Y2hlcyYmdC50b3VjaGVzWzBdfHx0LmNoYW5nZWRUb3VjaGVzJiZ0LmNoYW5nZWRUb3VjaGVzWzBdO3JldHVybiEoIWV8fC0xIT09ZS5pZGVudGlmaWVyfHxudWxsIT1lLnJhZGl1c1gmJjEhPT1lLnJhZGl1c1h8fG51bGwhPWUucmFkaXVzWSYmMSE9PWUucmFkaXVzWSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2ZJLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxmSSkodnIobkkpLHZyKGFfKSx2cih1SSksdnIoWl8pLHZyKGNJLDgpKX0sZkkuybVwcm92PU1uKHtmYWN0b3J5OmZ1bmN0aW9uIHQoKXtyZXR1cm4gbmV3IGZJKHZyKG5JKSx2cihhXyksdnIodUkpLHZyKFpfKSx2cihjSSw4KSl9LHRva2VuOmZJLHByb3ZpZGVkSW46InJvb3QifSksZkkuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpuSX0se3R5cGU6YV99LHt0eXBlOnVJfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbY0ldfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGZJLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpuSX0se3R5cGU6YV99LHt0eXBlOnVJfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbY0ldfV19XX0pLG51bGwpO2NvbnN0IGJJPW5ldyBHYSgiY2RrLWlucHV0LW1vZGFsaXR5LWRldGVjdG9yLW9wdGlvbnMiKSx5ST17aWdub3JlS2V5czpbMTgsMTcsMjI0LDkxLDE2XX0sX0k9Tnooe3Bhc3NpdmU6ITAsY2FwdHVyZTohMH0pO2NsYXNzIENJe2NvbnN0cnVjdG9yKHQsZSxuLG8pe3RoaXMuX3BsYXRmb3JtPXQsdGhpcy5fbW9zdFJlY2VudFRhcmdldD1udWxsLHRoaXMuX21vZGFsaXR5PW5ldyBGKG51bGwpLHRoaXMuX2xhc3RUb3VjaE1zPTAsdGhpcy5fb25LZXlkb3duPXQ9Pnt2YXIgZSxuOyhudWxsPT09KG49bnVsbD09PShlPXRoaXMuX29wdGlvbnMpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmlnbm9yZUtleXMpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLnNvbWUoKGU9PmU9PT10LmtleUNvZGUpKSl8fCh0aGlzLl9tb2RhbGl0eS5uZXh0KCJrZXlib2FyZCIpLHRoaXMuX21vc3RSZWNlbnRUYXJnZXQ9THoodCkpfSx0aGlzLl9vbk1vdXNlZG93bj10PT57RGF0ZS5ub3coKS10aGlzLl9sYXN0VG91Y2hNczw2NTB8fCh0aGlzLl9tb2RhbGl0eS5uZXh0KGdJKHQpPyJrZXlib2FyZCI6Im1vdXNlIiksdGhpcy5fbW9zdFJlY2VudFRhcmdldD1Meih0KSl9LHRoaXMuX29uVG91Y2hzdGFydD10PT57aEkodCk/dGhpcy5fbW9kYWxpdHkubmV4dCgia2V5Ym9hcmQiKToodGhpcy5fbGFzdFRvdWNoTXM9RGF0ZS5ub3coKSx0aGlzLl9tb2RhbGl0eS5uZXh0KCJ0b3VjaCIpLHRoaXMuX21vc3RSZWNlbnRUYXJnZXQ9THoodCkpfSx0aGlzLl9vcHRpb25zPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx5SSksbyksdGhpcy5tb2RhbGl0eURldGVjdGVkPXRoaXMuX21vZGFsaXR5LnBpcGUoVGUoMSkpLHRoaXMubW9kYWxpdHlDaGFuZ2VkPXRoaXMubW9kYWxpdHlEZXRlY3RlZC5waXBlKE1lKCkpLHQuaXNCcm93c2VyJiZlLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e24uYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5fb25LZXlkb3duLF9JKSxuLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5fb25Nb3VzZWRvd24sX0kpLG4uYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5fb25Ub3VjaHN0YXJ0LF9JKX0pKX1nZXQgbW9zdFJlY2VudE1vZGFsaXR5KCl7cmV0dXJuIHRoaXMuX21vZGFsaXR5LnZhbHVlfW5nT25EZXN0cm95KCl7dGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyJiYoZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5fb25LZXlkb3duLF9JKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuX29uTW91c2Vkb3duLF9JKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLl9vblRvdWNoc3RhcnQsX0kpKX19Q0kuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fENJKSh2cih3eiksdnIoYV8pLHZyKFpfKSx2cihiSSw4KSl9LENJLsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIG5ldyBDSSh2cih3eiksdnIoYV8pLHZyKFpfKSx2cihiSSw4KSl9LHRva2VuOkNJLHByb3ZpZGVkSW46InJvb3QifSksQ0kuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp3en0se3R5cGU6YV99LHt0eXBlOkRvY3VtZW50LGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W2JJXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChDSSxbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6d3p9LHt0eXBlOmFffSx7dHlwZTpEb2N1bWVudCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltiSV19XX1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBNST1uZXcgR2EoImxpdmVBbm5vdW5jZXJFbGVtZW50Iix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbiB2SSgpe3JldHVybiBudWxsfX0pLHhJPW5ldyBHYSgiTElWRV9BTk5PVU5DRVJfREVGQVVMVF9PUFRJT05TIik7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBPSXtjb25zdHJ1Y3Rvcih0LGUsbixvKXt0aGlzLl9uZ1pvbmU9ZSx0aGlzLl9kZWZhdWx0T3B0aW9ucz1vLHRoaXMuX2RvY3VtZW50PW4sdGhpcy5fbGl2ZUVsZW1lbnQ9dHx8dGhpcy5fY3JlYXRlTGl2ZUVsZW1lbnQoKX1hbm5vdW5jZSh0LC4uLmUpe2NvbnN0IG49dGhpcy5fZGVmYXVsdE9wdGlvbnM7bGV0IG8saTtyZXR1cm4gMT09PWUubGVuZ3RoJiYibnVtYmVyIj09dHlwZW9mIGVbMF0/aT1lWzBdOltvLGldPWUsdGhpcy5jbGVhcigpLGNsZWFyVGltZW91dCh0aGlzLl9wcmV2aW91c1RpbWVvdXQpLG98fChvPW4mJm4ucG9saXRlbmVzcz9uLnBvbGl0ZW5lc3M6InBvbGl0ZSIpLG51bGw9PWkmJm4mJihpPW4uZHVyYXRpb24pLHRoaXMuX2xpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1saXZlIixvKSx0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT5uZXcgUHJvbWlzZSgoZT0+e2NsZWFyVGltZW91dCh0aGlzLl9wcmV2aW91c1RpbWVvdXQpLHRoaXMuX3ByZXZpb3VzVGltZW91dD1zZXRUaW1lb3V0KCgoKT0+e3RoaXMuX2xpdmVFbGVtZW50LnRleHRDb250ZW50PXQsZSgpLCJudW1iZXIiPT10eXBlb2YgaSYmKHRoaXMuX3ByZXZpb3VzVGltZW91dD1zZXRUaW1lb3V0KCgoKT0+dGhpcy5jbGVhcigpKSxpKSl9KSwxMDApfSkpKSl9Y2xlYXIoKXt0aGlzLl9saXZlRWxlbWVudCYmKHRoaXMuX2xpdmVFbGVtZW50LnRleHRDb250ZW50PSIiKX1uZ09uRGVzdHJveSgpe2NsZWFyVGltZW91dCh0aGlzLl9wcmV2aW91c1RpbWVvdXQpLHRoaXMuX2xpdmVFbGVtZW50JiZ0aGlzLl9saXZlRWxlbWVudC5wYXJlbnROb2RlJiYodGhpcy5fbGl2ZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9saXZlRWxlbWVudCksdGhpcy5fbGl2ZUVsZW1lbnQ9bnVsbCl9X2NyZWF0ZUxpdmVFbGVtZW50KCl7Y29uc3QgdD0iY2RrLWxpdmUtYW5ub3VuY2VyLWVsZW1lbnQiLGU9dGhpcy5fZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh0KSxuPXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlW3RdKTtyZXR1cm4gbi5jbGFzc0xpc3QuYWRkKHQpLG4uY2xhc3NMaXN0LmFkZCgiY2RrLXZpc3VhbGx5LWhpZGRlbiIpLG4uc2V0QXR0cmlidXRlKCJhcmlhLWF0b21pYyIsInRydWUiKSxuLnNldEF0dHJpYnV0ZSgiYXJpYS1saXZlIiwicG9saXRlIiksdGhpcy5fZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChuKSxufX1PSS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8T0kpKHZyKE1JLDgpLHZyKGFfKSx2cihaXyksdnIoeEksOCkpfSxPSS7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgT0kodnIoTUksOCksdnIoYV8pLHZyKFpfKSx2cih4SSw4KSl9LHRva2VuOk9JLHByb3ZpZGVkSW46InJvb3QifSksT0kuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W01JXX1dfSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3hJXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChPSSxbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltNSV19XX0se3R5cGU6YV99LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOlt4SV19XX1dfSksbnVsbCk7Y2xhc3MgUEl7Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy5fZWxlbWVudFJlZj10LHRoaXMuX2xpdmVBbm5vdW5jZXI9ZSx0aGlzLl9jb250ZW50T2JzZXJ2ZXI9bix0aGlzLl9uZ1pvbmU9byx0aGlzLl9wb2xpdGVuZXNzPSJwb2xpdGUifWdldCBwb2xpdGVuZXNzKCl7cmV0dXJuIHRoaXMuX3BvbGl0ZW5lc3N9c2V0IHBvbGl0ZW5lc3ModCl7dGhpcy5fcG9saXRlbmVzcz0ib2ZmIj09PXR8fCJhc3NlcnRpdmUiPT09dD90OiJwb2xpdGUiLCJvZmYiPT09dGhpcy5fcG9saXRlbmVzcz90aGlzLl9zdWJzY3JpcHRpb24mJih0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl9zdWJzY3JpcHRpb249bnVsbCk6dGhpcy5fc3Vic2NyaXB0aW9ufHwodGhpcy5fc3Vic2NyaXB0aW9uPXRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PnRoaXMuX2NvbnRlbnRPYnNlcnZlci5vYnNlcnZlKHRoaXMuX2VsZW1lbnRSZWYpLnN1YnNjcmliZSgoKCk9Pntjb25zdCB0PXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC50ZXh0Q29udGVudDt0IT09dGhpcy5fcHJldmlvdXNBbm5vdW5jZWRUZXh0JiYodGhpcy5fbGl2ZUFubm91bmNlci5hbm5vdW5jZSh0LHRoaXMuX3BvbGl0ZW5lc3MpLHRoaXMuX3ByZXZpb3VzQW5ub3VuY2VkVGV4dD10KX0pKSkpKX1uZ09uRGVzdHJveSgpe3RoaXMuX3N1YnNjcmlwdGlvbiYmdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCl9fVBJLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxQSSkoU20oaGcpLFNtKE9JKSxTbShWeiksU20oYV8pKX0sUEkuybVkaXI9bG8oe3R5cGU6UEksc2VsZWN0b3JzOltbIiIsImNka0FyaWFMaXZlIiwiIl1dLGlucHV0czp7cG9saXRlbmVzczpbImNka0FyaWFMaXZlIiwicG9saXRlbmVzcyJdfSxleHBvcnRBczpbImNka0FyaWFMaXZlIl19KSxQSS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpPSX0se3R5cGU6Vnp9LHt0eXBlOmFffV0sUEkucHJvcERlY29yYXRvcnM9e3BvbGl0ZW5lc3M6W3t0eXBlOnh5LGFyZ3M6WyJjZGtBcmlhTGl2ZSJdfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUEksW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Nka0FyaWFMaXZlXSIsZXhwb3J0QXM6ImNka0FyaWFMaXZlIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTpPSX0se3R5cGU6Vnp9LHt0eXBlOmFffV19KSx7cG9saXRlbmVzczpbe3R5cGU6eHksYXJnczpbImNka0FyaWFMaXZlIl19XX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3Qgd0k9bmV3IEdhKCJjZGstZm9jdXMtbW9uaXRvci1kZWZhdWx0LW9wdGlvbnMiKSxrST1Oeih7cGFzc2l2ZTohMCxjYXB0dXJlOiEwfSk7Y2xhc3MgU0l7Y29uc3RydWN0b3IodCxlLG4sbyxpKXt0aGlzLl9uZ1pvbmU9dCx0aGlzLl9wbGF0Zm9ybT1lLHRoaXMuX2lucHV0TW9kYWxpdHlEZXRlY3Rvcj1uLHRoaXMuX29yaWdpbj1udWxsLHRoaXMuX3dpbmRvd0ZvY3VzZWQ9ITEsdGhpcy5fb3JpZ2luRnJvbVRvdWNoSW50ZXJhY3Rpb249ITEsdGhpcy5fZWxlbWVudEluZm89bmV3IE1hcCx0aGlzLl9tb25pdG9yZWRFbGVtZW50Q291bnQ9MCx0aGlzLl9yb290Tm9kZUZvY3VzTGlzdGVuZXJDb3VudD1uZXcgTWFwLHRoaXMuX3dpbmRvd0ZvY3VzTGlzdGVuZXI9KCk9Pnt0aGlzLl93aW5kb3dGb2N1c2VkPSEwLHRoaXMuX3dpbmRvd0ZvY3VzVGltZW91dElkPXNldFRpbWVvdXQoKCgpPT50aGlzLl93aW5kb3dGb2N1c2VkPSExKSl9LHRoaXMuX3N0b3BJbnB1dE1vZGFsaXR5RGV0ZWN0b3I9bmV3IEksdGhpcy5fcm9vdE5vZGVGb2N1c0FuZEJsdXJMaXN0ZW5lcj10PT57Y29uc3QgZT1Meih0KSxuPSJmb2N1cyI9PT10LnR5cGU/dGhpcy5fb25Gb2N1czp0aGlzLl9vbkJsdXI7Zm9yKGxldCBvPWU7bztvPW8ucGFyZW50RWxlbWVudCluLmNhbGwodGhpcyx0LG8pfSx0aGlzLl9kb2N1bWVudD1vLHRoaXMuX2RldGVjdGlvbk1vZGU9KG51bGw9PWk/dm9pZCAwOmkuZGV0ZWN0aW9uTW9kZSl8fDB9bW9uaXRvcih0LGU9ITEpe2NvbnN0IG49eHoodCk7aWYoIXRoaXMuX3BsYXRmb3JtLmlzQnJvd3Nlcnx8MSE9PW4ubm9kZVR5cGUpcmV0dXJuIEV0KG51bGwpO2NvbnN0IG89SHoobil8fHRoaXMuX2dldERvY3VtZW50KCksaT10aGlzLl9lbGVtZW50SW5mby5nZXQobik7aWYoaSlyZXR1cm4gZSYmKGkuY2hlY2tDaGlsZHJlbj0hMCksaS5zdWJqZWN0O2NvbnN0IGE9e2NoZWNrQ2hpbGRyZW46ZSxzdWJqZWN0Om5ldyBJLHJvb3ROb2RlOm99O3JldHVybiB0aGlzLl9lbGVtZW50SW5mby5zZXQobixhKSx0aGlzLl9yZWdpc3Rlckdsb2JhbExpc3RlbmVycyhhKSxhLnN1YmplY3R9c3RvcE1vbml0b3JpbmcodCl7Y29uc3QgZT14eih0KSxuPXRoaXMuX2VsZW1lbnRJbmZvLmdldChlKTtuJiYobi5zdWJqZWN0LmNvbXBsZXRlKCksdGhpcy5fc2V0Q2xhc3NlcyhlKSx0aGlzLl9lbGVtZW50SW5mby5kZWxldGUoZSksdGhpcy5fcmVtb3ZlR2xvYmFsTGlzdGVuZXJzKG4pKX1mb2N1c1ZpYSh0LGUsbil7Y29uc3Qgbz14eih0KTtvPT09dGhpcy5fZ2V0RG9jdW1lbnQoKS5hY3RpdmVFbGVtZW50P3RoaXMuX2dldENsb3Nlc3RFbGVtZW50c0luZm8obykuZm9yRWFjaCgoKFt0LG5dKT0+dGhpcy5fb3JpZ2luQ2hhbmdlZCh0LGUsbikpKToodGhpcy5fc2V0T3JpZ2luKGUpLCJmdW5jdGlvbiI9PXR5cGVvZiBvLmZvY3VzJiZvLmZvY3VzKG4pKX1uZ09uRGVzdHJveSgpe3RoaXMuX2VsZW1lbnRJbmZvLmZvckVhY2goKCh0LGUpPT50aGlzLnN0b3BNb25pdG9yaW5nKGUpKSl9X2dldERvY3VtZW50KCl7cmV0dXJuIHRoaXMuX2RvY3VtZW50fHxkb2N1bWVudH1fZ2V0V2luZG93KCl7cmV0dXJuIHRoaXMuX2dldERvY3VtZW50KCkuZGVmYXVsdFZpZXd8fHdpbmRvd31fdG9nZ2xlQ2xhc3ModCxlLG4pe24/dC5jbGFzc0xpc3QuYWRkKGUpOnQuY2xhc3NMaXN0LnJlbW92ZShlKX1fZ2V0Rm9jdXNPcmlnaW4odCl7cmV0dXJuIHRoaXMuX29yaWdpbj90aGlzLl9vcmlnaW5Gcm9tVG91Y2hJbnRlcmFjdGlvbj90aGlzLl9zaG91bGRCZUF0dHJpYnV0ZWRUb1RvdWNoKHQpPyJ0b3VjaCI6InByb2dyYW0iOnRoaXMuX29yaWdpbjp0aGlzLl93aW5kb3dGb2N1c2VkJiZ0aGlzLl9sYXN0Rm9jdXNPcmlnaW4/dGhpcy5fbGFzdEZvY3VzT3JpZ2luOiJwcm9ncmFtIn1fc2hvdWxkQmVBdHRyaWJ1dGVkVG9Ub3VjaCh0KXtyZXR1cm4gMT09PXRoaXMuX2RldGVjdGlvbk1vZGV8fCEhKG51bGw9PXQ/dm9pZCAwOnQuY29udGFpbnModGhpcy5faW5wdXRNb2RhbGl0eURldGVjdG9yLl9tb3N0UmVjZW50VGFyZ2V0KSl9X3NldENsYXNzZXModCxlKXt0aGlzLl90b2dnbGVDbGFzcyh0LCJjZGstZm9jdXNlZCIsISFlKSx0aGlzLl90b2dnbGVDbGFzcyh0LCJjZGstdG91Y2gtZm9jdXNlZCIsInRvdWNoIj09PWUpLHRoaXMuX3RvZ2dsZUNsYXNzKHQsImNkay1rZXlib2FyZC1mb2N1c2VkIiwia2V5Ym9hcmQiPT09ZSksdGhpcy5fdG9nZ2xlQ2xhc3ModCwiY2RrLW1vdXNlLWZvY3VzZWQiLCJtb3VzZSI9PT1lKSx0aGlzLl90b2dnbGVDbGFzcyh0LCJjZGstcHJvZ3JhbS1mb2N1c2VkIiwicHJvZ3JhbSI9PT1lKX1fc2V0T3JpZ2luKHQsZT0hMSl7dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e3RoaXMuX29yaWdpbj10LHRoaXMuX29yaWdpbkZyb21Ub3VjaEludGVyYWN0aW9uPSJ0b3VjaCI9PT10JiZlLDA9PT10aGlzLl9kZXRlY3Rpb25Nb2RlJiYoY2xlYXJUaW1lb3V0KHRoaXMuX29yaWdpblRpbWVvdXRJZCksdGhpcy5fb3JpZ2luVGltZW91dElkPXNldFRpbWVvdXQoKCgpPT50aGlzLl9vcmlnaW49bnVsbCksdGhpcy5fb3JpZ2luRnJvbVRvdWNoSW50ZXJhY3Rpb24/NjUwOjEpKX0pKX1fb25Gb2N1cyh0LGUpe2NvbnN0IG49dGhpcy5fZWxlbWVudEluZm8uZ2V0KGUpLG89THoodCk7biYmKG4uY2hlY2tDaGlsZHJlbnx8ZT09PW8pJiZ0aGlzLl9vcmlnaW5DaGFuZ2VkKGUsdGhpcy5fZ2V0Rm9jdXNPcmlnaW4obyksbil9X29uQmx1cih0LGUpe2NvbnN0IG49dGhpcy5fZWxlbWVudEluZm8uZ2V0KGUpOyFufHxuLmNoZWNrQ2hpbGRyZW4mJnQucmVsYXRlZFRhcmdldCBpbnN0YW5jZW9mIE5vZGUmJmUuY29udGFpbnModC5yZWxhdGVkVGFyZ2V0KXx8KHRoaXMuX3NldENsYXNzZXMoZSksdGhpcy5fZW1pdE9yaWdpbihuLnN1YmplY3QsbnVsbCkpfV9lbWl0T3JpZ2luKHQsZSl7dGhpcy5fbmdab25lLnJ1bigoKCk9PnQubmV4dChlKSkpfV9yZWdpc3Rlckdsb2JhbExpc3RlbmVycyh0KXtpZighdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKXJldHVybjtjb25zdCBlPXQucm9vdE5vZGUsbj10aGlzLl9yb290Tm9kZUZvY3VzTGlzdGVuZXJDb3VudC5nZXQoZSl8fDA7bnx8dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e2UuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX3Jvb3ROb2RlRm9jdXNBbmRCbHVyTGlzdGVuZXIsa0kpLGUuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsdGhpcy5fcm9vdE5vZGVGb2N1c0FuZEJsdXJMaXN0ZW5lcixrSSl9KSksdGhpcy5fcm9vdE5vZGVGb2N1c0xpc3RlbmVyQ291bnQuc2V0KGUsbisxKSwxPT0rK3RoaXMuX21vbml0b3JlZEVsZW1lbnRDb3VudCYmKHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9Pnt0aGlzLl9nZXRXaW5kb3coKS5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fd2luZG93Rm9jdXNMaXN0ZW5lcil9KSksdGhpcy5faW5wdXRNb2RhbGl0eURldGVjdG9yLm1vZGFsaXR5RGV0ZWN0ZWQucGlwZShJZSh0aGlzLl9zdG9wSW5wdXRNb2RhbGl0eURldGVjdG9yKSkuc3Vic2NyaWJlKCh0PT57dGhpcy5fc2V0T3JpZ2luKHQsITApfSkpKX1fcmVtb3ZlR2xvYmFsTGlzdGVuZXJzKHQpe2NvbnN0IGU9dC5yb290Tm9kZTtpZih0aGlzLl9yb290Tm9kZUZvY3VzTGlzdGVuZXJDb3VudC5oYXMoZSkpe2NvbnN0IHQ9dGhpcy5fcm9vdE5vZGVGb2N1c0xpc3RlbmVyQ291bnQuZ2V0KGUpO3Q+MT90aGlzLl9yb290Tm9kZUZvY3VzTGlzdGVuZXJDb3VudC5zZXQoZSx0LTEpOihlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9yb290Tm9kZUZvY3VzQW5kQmx1ckxpc3RlbmVyLGtJKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImJsdXIiLHRoaXMuX3Jvb3ROb2RlRm9jdXNBbmRCbHVyTGlzdGVuZXIsa0kpLHRoaXMuX3Jvb3ROb2RlRm9jdXNMaXN0ZW5lckNvdW50LmRlbGV0ZShlKSl9LS10aGlzLl9tb25pdG9yZWRFbGVtZW50Q291bnR8fCh0aGlzLl9nZXRXaW5kb3coKS5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fd2luZG93Rm9jdXNMaXN0ZW5lciksdGhpcy5fc3RvcElucHV0TW9kYWxpdHlEZXRlY3Rvci5uZXh0KCksY2xlYXJUaW1lb3V0KHRoaXMuX3dpbmRvd0ZvY3VzVGltZW91dElkKSxjbGVhclRpbWVvdXQodGhpcy5fb3JpZ2luVGltZW91dElkKSl9X29yaWdpbkNoYW5nZWQodCxlLG4pe3RoaXMuX3NldENsYXNzZXModCxlKSx0aGlzLl9lbWl0T3JpZ2luKG4uc3ViamVjdCxlKSx0aGlzLl9sYXN0Rm9jdXNPcmlnaW49ZX1fZ2V0Q2xvc2VzdEVsZW1lbnRzSW5mbyh0KXtjb25zdCBlPVtdO3JldHVybiB0aGlzLl9lbGVtZW50SW5mby5mb3JFYWNoKCgobixvKT0+eyhvPT09dHx8bi5jaGVja0NoaWxkcmVuJiZvLmNvbnRhaW5zKHQpKSYmZS5wdXNoKFtvLG5dKX0pKSxlfX1TSS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8U0kpKHZyKGFfKSx2cih3eiksdnIoQ0kpLHZyKFpfLDgpLHZyKHdJLDgpKX0sU0kuybVwcm92PU1uKHtmYWN0b3J5OmZ1bmN0aW9uIHQoKXtyZXR1cm4gbmV3IFNJKHZyKGFfKSx2cih3eiksdnIoQ0kpLHZyKFpfLDgpLHZyKHdJLDgpKX0sdG9rZW46U0kscHJvdmlkZWRJbjoicm9vdCJ9KSxTSS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmFffSx7dHlwZTp3en0se3R5cGU6Q0l9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbd0ldfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFNJLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTphX30se3R5cGU6d3p9LHt0eXBlOkNJfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3dJXX1dfV19KSxudWxsKTtjbGFzcyBESXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX2VsZW1lbnRSZWY9dCx0aGlzLl9mb2N1c01vbml0b3I9ZSx0aGlzLmNka0ZvY3VzQ2hhbmdlPW5ldyBMaH1uZ0FmdGVyVmlld0luaXQoKXtjb25zdCB0PXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDt0aGlzLl9tb25pdG9yU3Vic2NyaXB0aW9uPXRoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHQsMT09PXQubm9kZVR5cGUmJnQuaGFzQXR0cmlidXRlKCJjZGtNb25pdG9yU3VidHJlZUZvY3VzIikpLnN1YnNjcmliZSgodD0+dGhpcy5jZGtGb2N1c0NoYW5nZS5lbWl0KHQpKSl9bmdPbkRlc3Ryb3koKXt0aGlzLl9mb2N1c01vbml0b3Iuc3RvcE1vbml0b3JpbmcodGhpcy5fZWxlbWVudFJlZiksdGhpcy5fbW9uaXRvclN1YnNjcmlwdGlvbiYmdGhpcy5fbW9uaXRvclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpfX1ESS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8REkpKFNtKGhnKSxTbShTSSkpfSxESS7JtWRpcj1sbyh7dHlwZTpESSxzZWxlY3RvcnM6W1siIiwiY2RrTW9uaXRvckVsZW1lbnRGb2N1cyIsIiJdLFsiIiwiY2RrTW9uaXRvclN1YnRyZWVGb2N1cyIsIiJdXSxvdXRwdXRzOntjZGtGb2N1c0NoYW5nZToiY2RrRm9jdXNDaGFuZ2UifX0pLERJLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOlNJfV0sREkucHJvcERlY29yYXRvcnM9e2Nka0ZvY3VzQ2hhbmdlOlt7dHlwZTpPeX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKERJLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IltjZGtNb25pdG9yRWxlbWVudEZvY3VzXSwgW2Nka01vbml0b3JTdWJ0cmVlRm9jdXNdIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTpTSX1dfSkse2Nka0ZvY3VzQ2hhbmdlOlt7dHlwZTpPeX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBFST0iY2RrLWhpZ2gtY29udHJhc3QtYmxhY2stb24td2hpdGUiLFJJPSJjZGstaGlnaC1jb250cmFzdC13aGl0ZS1vbi1ibGFjayIsQUk9ImNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSI7Y2xhc3MgVEl7Y29uc3RydWN0b3IodCxlKXt0aGlzLl9wbGF0Zm9ybT10LHRoaXMuX2RvY3VtZW50PWV9Z2V0SGlnaENvbnRyYXN0TW9kZSgpe2lmKCF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpcmV0dXJuIDA7Y29uc3QgdD10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LnN0eWxlLmJhY2tncm91bmRDb2xvcj0icmdiKDEsMiwzKSIsdC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodCk7Y29uc3QgZT10aGlzLl9kb2N1bWVudC5kZWZhdWx0Vmlld3x8d2luZG93LG49ZSYmZS5nZXRDb21wdXRlZFN0eWxlP2UuZ2V0Q29tcHV0ZWRTdHlsZSh0KTpudWxsLG89KG4mJm4uYmFja2dyb3VuZENvbG9yfHwiIikucmVwbGFjZSgvIC9nLCIiKTtzd2l0Y2godGhpcy5fZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0KSxvKXtjYXNlInJnYigwLDAsMCkiOnJldHVybiAyO2Nhc2UicmdiKDI1NSwyNTUsMjU1KSI6cmV0dXJuIDF9cmV0dXJuIDB9X2FwcGx5Qm9keUhpZ2hDb250cmFzdE1vZGVDc3NDbGFzc2VzKCl7aWYoIXRoaXMuX2hhc0NoZWNrZWRIaWdoQ29udHJhc3RNb2RlJiZ0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXImJnRoaXMuX2RvY3VtZW50LmJvZHkpe2NvbnN0IHQ9dGhpcy5fZG9jdW1lbnQuYm9keS5jbGFzc0xpc3Q7dC5yZW1vdmUoQUkpLHQucmVtb3ZlKEVJKSx0LnJlbW92ZShSSSksdGhpcy5faGFzQ2hlY2tlZEhpZ2hDb250cmFzdE1vZGU9ITA7Y29uc3QgZT10aGlzLmdldEhpZ2hDb250cmFzdE1vZGUoKTsxPT09ZT8odC5hZGQoQUkpLHQuYWRkKEVJKSk6Mj09PWUmJih0LmFkZChBSSksdC5hZGQoUkkpKX19fVRJLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxUSSkodnIod3opLHZyKFpfKSl9LFRJLsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIG5ldyBUSSh2cih3eiksdnIoWl8pKX0sdG9rZW46VEkscHJvdmlkZWRJbjoicm9vdCJ9KSxUSS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnd6fSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFRJLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp3en0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIE5Je2NvbnN0cnVjdG9yKHQpe3QuX2FwcGx5Qm9keUhpZ2hDb250cmFzdE1vZGVDc3NDbGFzc2VzKCl9fU5JLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxOSSkodnIoVEkpKX0sTkkuybVtb2Q9YW8oe3R5cGU6Tkl9KSxOSS7JtWluaj12bih7aW1wb3J0czpbW2t6LFV6XV19KSxOSS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlRJfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChOSSxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W2t6LFV6XSxkZWNsYXJhdGlvbnM6W1BJLHNJLERJXSxleHBvcnRzOltQSSxzSSxESV19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpUSX1dfSksbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhOSSx7ZGVjbGFyYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuW1BJLHNJLERJXX0saW1wb3J0czpmdW5jdGlvbigpe3JldHVybltreixVel19LGV4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bUEksc0ksREldfX0pO2NvbnN0IHpJPW5ldyBHYSgiY2RrLWRpci1kb2MiLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OmZ1bmN0aW9uIElJKCl7cmV0dXJuIE9yKFpfKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovfSk7Y2xhc3MgSEl7Y29uc3RydWN0b3IodCl7aWYodGhpcy52YWx1ZT0ibHRyIix0aGlzLmNoYW5nZT1uZXcgTGgsdCl7Y29uc3QgZT10LmRvY3VtZW50RWxlbWVudD90LmRvY3VtZW50RWxlbWVudC5kaXI6bnVsbCxuPSh0LmJvZHk/dC5ib2R5LmRpcjpudWxsKXx8ZTt0aGlzLnZhbHVlPSJsdHIiPT09bnx8InJ0bCI9PT1uP246Imx0ciJ9fW5nT25EZXN0cm95KCl7dGhpcy5jaGFuZ2UuY29tcGxldGUoKX19SEkuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEhJKSh2cih6SSw4KSl9LEhJLsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIG5ldyBISSh2cih6SSw4KSl9LHRva2VuOkhJLHByb3ZpZGVkSW46InJvb3QifSksSEkuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3pJXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChISSxbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOlt6SV19XX1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBGSXtjb25zdHJ1Y3Rvcigpe3RoaXMuX2Rpcj0ibHRyIix0aGlzLl9pc0luaXRpYWxpemVkPSExLHRoaXMuY2hhbmdlPW5ldyBMaH1nZXQgZGlyKCl7cmV0dXJuIHRoaXMuX2Rpcn1zZXQgZGlyKHQpe2NvbnN0IGU9dGhpcy5fZGlyLG49dD90LnRvTG93ZXJDYXNlKCk6dDt0aGlzLl9yYXdEaXI9dCx0aGlzLl9kaXI9Imx0ciI9PT1ufHwicnRsIj09PW4/bjoibHRyIixlIT09dGhpcy5fZGlyJiZ0aGlzLl9pc0luaXRpYWxpemVkJiZ0aGlzLmNoYW5nZS5lbWl0KHRoaXMuX2Rpcil9Z2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMuZGlyfW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX2lzSW5pdGlhbGl6ZWQ9ITB9bmdPbkRlc3Ryb3koKXt0aGlzLmNoYW5nZS5jb21wbGV0ZSgpfX1GSS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8RkkpfSxGSS7JtWRpcj1sbyh7dHlwZTpGSSxzZWxlY3RvcnM6W1siIiwiZGlyIiwiIl1dLGhvc3RWYXJzOjEsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJmpwKCJkaXIiLG4uX3Jhd0Rpcil9LGlucHV0czp7ZGlyOiJkaXIifSxvdXRwdXRzOntjaGFuZ2U6ImRpckNoYW5nZSJ9LGV4cG9ydEFzOlsiZGlyIl0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTpISSx1c2VFeGlzdGluZzpGSX1dKV19KSxGSS5wcm9wRGVjb3JhdG9ycz17Y2hhbmdlOlt7dHlwZTpPeSxhcmdzOlsiZGlyQ2hhbmdlIl19XSxkaXI6W3t0eXBlOnh5fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRkksW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Rpcl0iLHByb3ZpZGVyczpbe3Byb3ZpZGU6SEksdXNlRXhpc3Rpbmc6Rkl9XSxob3N0OnsiW2F0dHIuZGlyXSI6Il9yYXdEaXIifSxleHBvcnRBczoiZGlyIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW119KSx7Y2hhbmdlOlt7dHlwZTpPeSxhcmdzOlsiZGlyQ2hhbmdlIl19XSxkaXI6W3t0eXBlOnh5fV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIExJe31MSS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8TEkpfSxMSS7JtW1vZD1hbyh7dHlwZTpMSX0pLExJLsm1aW5qPXZuKHt9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKExJLFt7dHlwZTpBeSxhcmdzOlt7ZXhwb3J0czpbRkldLGRlY2xhcmF0aW9uczpbRkldfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oTEkse2RlY2xhcmF0aW9uczpbRkldLGV4cG9ydHM6W0ZJXX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgQkk9bmV3IE9nKCIxMi4yLjEiKSxWST1bIioiLFtbIm1hdC1vcHRpb24iXSxbIm5nLWNvbnRhaW5lciJdXV07ZnVuY3Rpb24gakkodCxlKXtpZigxJnQmJlRtKDAsIm1hdC1wc2V1ZG8tY2hlY2tib3giLDQpLDImdCl7Y29uc3QgdD1ZbSgpO0RtKCJzdGF0ZSIsdC5zZWxlY3RlZD8iY2hlY2tlZCI6InVuY2hlY2tlZCIpKCJkaXNhYmxlZCIsdC5kaXNhYmxlZCl9fWZ1bmN0aW9uIFVJKHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIsNSksa3UoMSksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoMSksRHUoIigiLHQuZ3JvdXAubGFiZWwsIikiKX19bmV3IE9nKCIxMi4yLjMiKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIEdJe31HSS5TVEFOREFSRF9DVVJWRT0iY3ViaWMtYmV6aWVyKDAuNCwwLjAsMC4yLDEpIixHSS5ERUNFTEVSQVRJT05fQ1VSVkU9ImN1YmljLWJlemllcigwLjAsMC4wLDAuMiwxKSIsR0kuQUNDRUxFUkFUSU9OX0NVUlZFPSJjdWJpYy1iZXppZXIoMC40LDAuMCwxLDEpIixHSS5TSEFSUF9DVVJWRT0iY3ViaWMtYmV6aWVyKDAuNCwwLjAsMC42LDEpIjtjbGFzcyBXSXt9V0kuQ09NUExFWD0iMzc1bXMiLFdJLkVOVEVSSU5HPSIyMjVtcyIsV0kuRVhJVElORz0iMTk1bXMiOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgWUk9bmV3IE9nKCIxMi4yLjMiKSxxST1uZXcgR2EoIm1hdC1zYW5pdHktY2hlY2tzIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbiBaSSgpe3JldHVybiEwfX0pO2NsYXNzIFhJe2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLl9oYXNEb25lR2xvYmFsQ2hlY2tzPSExLHRoaXMuX2RvY3VtZW50PW4sdC5fYXBwbHlCb2R5SGlnaENvbnRyYXN0TW9kZUNzc0NsYXNzZXMoKSx0aGlzLl9zYW5pdHlDaGVja3M9ZSx0aGlzLl9oYXNEb25lR2xvYmFsQ2hlY2tzfHwodGhpcy5fY2hlY2tEb2N0eXBlSXNEZWZpbmVkKCksdGhpcy5fY2hlY2tUaGVtZUlzUHJlc2VudCgpLHRoaXMuX2NoZWNrQ2RrVmVyc2lvbk1hdGNoKCksdGhpcy5faGFzRG9uZUdsb2JhbENoZWNrcz0hMCl9X2dldFdpbmRvdygpe2NvbnN0IHQ9dGhpcy5fZG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdztyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJnQ/dDpudWxsfV9jaGVja0lzRW5hYmxlZCh0KXtyZXR1cm4hKCF5XygpfHx0aGlzLl9pc1Rlc3RFbnYoKSkmJigiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLl9zYW5pdHlDaGVja3M/dGhpcy5fc2FuaXR5Q2hlY2tzOiEhdGhpcy5fc2FuaXR5Q2hlY2tzW3RdKX1faXNUZXN0RW52KCl7Y29uc3QgdD10aGlzLl9nZXRXaW5kb3coKTtyZXR1cm4gdCYmKHQuX19rYXJtYV9ffHx0Lmphc21pbmUpfV9jaGVja0RvY3R5cGVJc0RlZmluZWQoKXt0aGlzLl9jaGVja0lzRW5hYmxlZCgiZG9jdHlwZSIpJiYhdGhpcy5fZG9jdW1lbnQuZG9jdHlwZSYmY29uc29sZS53YXJuKCJDdXJyZW50IGRvY3VtZW50IGRvZXMgbm90IGhhdmUgYSBkb2N0eXBlLiBUaGlzIG1heSBjYXVzZSBzb21lIEFuZ3VsYXIgTWF0ZXJpYWwgY29tcG9uZW50cyBub3QgdG8gYmVoYXZlIGFzIGV4cGVjdGVkLiIpfV9jaGVja1RoZW1lSXNQcmVzZW50KCl7aWYoIXRoaXMuX2NoZWNrSXNFbmFibGVkKCJ0aGVtZSIpfHwhdGhpcy5fZG9jdW1lbnQuYm9keXx8ImZ1bmN0aW9uIiE9dHlwZW9mIGdldENvbXB1dGVkU3R5bGUpcmV0dXJuO2NvbnN0IHQ9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5jbGFzc0xpc3QuYWRkKCJtYXQtdGhlbWUtbG9hZGVkLW1hcmtlciIpLHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodCk7Y29uc3QgZT1nZXRDb21wdXRlZFN0eWxlKHQpO2UmJiJub25lIiE9PWUuZGlzcGxheSYmY29uc29sZS53YXJuKCJDb3VsZCBub3QgZmluZCBBbmd1bGFyIE1hdGVyaWFsIGNvcmUgdGhlbWUuIE1vc3QgTWF0ZXJpYWwgY29tcG9uZW50cyBtYXkgbm90IHdvcmsgYXMgZXhwZWN0ZWQuIEZvciBtb3JlIGluZm8gcmVmZXIgdG8gdGhlIHRoZW1pbmcgZ3VpZGU6IGh0dHBzOi8vbWF0ZXJpYWwuYW5ndWxhci5pby9ndWlkZS90aGVtaW5nIiksdGhpcy5fZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0KX1fY2hlY2tDZGtWZXJzaW9uTWF0Y2goKXt0aGlzLl9jaGVja0lzRW5hYmxlZCgidmVyc2lvbiIpJiZZSS5mdWxsIT09QkkuZnVsbCYmY29uc29sZS53YXJuKCJUaGUgQW5ndWxhciBNYXRlcmlhbCB2ZXJzaW9uICgiK1lJLmZ1bGwrIikgZG9lcyBub3QgbWF0Y2ggdGhlIEFuZ3VsYXIgQ0RLIHZlcnNpb24gKCIrQkkuZnVsbCsiKS5cblBsZWFzZSBlbnN1cmUgdGhlIHZlcnNpb25zIG9mIHRoZXNlIHR3byBwYWNrYWdlcyBleGFjdGx5IG1hdGNoLiIpfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmZ1bmN0aW9uIEtJKHQpe3JldHVybiBjbGFzcyBleHRlbmRzIHR7Y29uc3RydWN0b3IoLi4udCl7c3VwZXIoLi4udCksdGhpcy5fZGlzYWJsZWQ9ITF9Z2V0IGRpc2FibGVkKCl7cmV0dXJuIHRoaXMuX2Rpc2FibGVkfXNldCBkaXNhYmxlZCh0KXt0aGlzLl9kaXNhYmxlZD15eih0KX19fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBKSSh0LGUpe3JldHVybiBjbGFzcyBleHRlbmRzIHR7Y29uc3RydWN0b3IoLi4udCl7c3VwZXIoLi4udCksdGhpcy5kZWZhdWx0Q29sb3I9ZSx0aGlzLmNvbG9yPWV9Z2V0IGNvbG9yKCl7cmV0dXJuIHRoaXMuX2NvbG9yfXNldCBjb2xvcih0KXtjb25zdCBlPXR8fHRoaXMuZGVmYXVsdENvbG9yO2UhPT10aGlzLl9jb2xvciYmKHRoaXMuX2NvbG9yJiZ0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShgbWF0LSR7dGhpcy5fY29sb3J9YCksZSYmdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoYG1hdC0ke2V9YCksdGhpcy5fY29sb3I9ZSl9fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gUUkodCl7cmV0dXJuIGNsYXNzIGV4dGVuZHMgdHtjb25zdHJ1Y3RvciguLi50KXtzdXBlciguLi50KSx0aGlzLl9kaXNhYmxlUmlwcGxlPSExfWdldCBkaXNhYmxlUmlwcGxlKCl7cmV0dXJuIHRoaXMuX2Rpc2FibGVSaXBwbGV9c2V0IGRpc2FibGVSaXBwbGUodCl7dGhpcy5fZGlzYWJsZVJpcHBsZT15eih0KX19fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiAkSSh0LGU9MCl7cmV0dXJuIGNsYXNzIGV4dGVuZHMgdHtjb25zdHJ1Y3RvciguLi50KXtzdXBlciguLi50KSx0aGlzLl90YWJJbmRleD1lLHRoaXMuZGVmYXVsdFRhYkluZGV4PWV9Z2V0IHRhYkluZGV4KCl7cmV0dXJuIHRoaXMuZGlzYWJsZWQ/LTE6dGhpcy5fdGFiSW5kZXh9c2V0IHRhYkluZGV4KHQpe3RoaXMuX3RhYkluZGV4PW51bGwhPXQ/X3oodCk6dGhpcy5kZWZhdWx0VGFiSW5kZXh9fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gdEgodCl7cmV0dXJuIGNsYXNzIGV4dGVuZHMgdHtjb25zdHJ1Y3RvciguLi50KXtzdXBlciguLi50KSx0aGlzLnN0YXRlQ2hhbmdlcz1uZXcgSSx0aGlzLmVycm9yU3RhdGU9ITF9dXBkYXRlRXJyb3JTdGF0ZSgpe2NvbnN0IHQ9dGhpcy5lcnJvclN0YXRlLGU9KHRoaXMuZXJyb3JTdGF0ZU1hdGNoZXJ8fHRoaXMuX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlcikuaXNFcnJvclN0YXRlKHRoaXMubmdDb250cm9sP3RoaXMubmdDb250cm9sLmNvbnRyb2w6bnVsbCx0aGlzLl9wYXJlbnRGb3JtR3JvdXB8fHRoaXMuX3BhcmVudEZvcm0pO2UhPT10JiYodGhpcy5lcnJvclN0YXRlPWUsdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpKX19fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBlSCh0KXtyZXR1cm4gY2xhc3MgZXh0ZW5kcyB0e2NvbnN0cnVjdG9yKC4uLnQpe3N1cGVyKC4uLnQpLHRoaXMuX2lzSW5pdGlhbGl6ZWQ9ITEsdGhpcy5fcGVuZGluZ1N1YnNjcmliZXJzPVtdLHRoaXMuaW5pdGlhbGl6ZWQ9bmV3IEQoKHQ9Pnt0aGlzLl9pc0luaXRpYWxpemVkP3RoaXMuX25vdGlmeVN1YnNjcmliZXIodCk6dGhpcy5fcGVuZGluZ1N1YnNjcmliZXJzLnB1c2godCl9KSl9X21hcmtJbml0aWFsaXplZCgpe2lmKHRoaXMuX2lzSW5pdGlhbGl6ZWQmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSl0aHJvdyBFcnJvcigiVGhpcyBkaXJlY3RpdmUgaGFzIGFscmVhZHkgYmVlbiBtYXJrZWQgYXMgaW5pdGlhbGl6ZWQgYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIHR3aWNlLiIpO3RoaXMuX2lzSW5pdGlhbGl6ZWQ9ITAsdGhpcy5fcGVuZGluZ1N1YnNjcmliZXJzLmZvckVhY2godGhpcy5fbm90aWZ5U3Vic2NyaWJlciksdGhpcy5fcGVuZGluZ1N1YnNjcmliZXJzPW51bGx9X25vdGlmeVN1YnNjcmliZXIodCl7dC5uZXh0KCksdC5jb21wbGV0ZSgpfX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9YSS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WEkpKHZyKFRJKSx2cihxSSw4KSx2cihaXykpfSxYSS7JtW1vZD1hbyh7dHlwZTpYSX0pLFhJLsm1aW5qPXZuKHtpbXBvcnRzOltbTEldLExJXX0pLFhJLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6VEl9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbcUldfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWEksW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltMSV0sZXhwb3J0czpbTEldfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6VEl9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbcUldfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSksbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhYSSx7aW1wb3J0czpmdW5jdGlvbigpe3JldHVybltMSV19LGV4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bTEldfX0pO2NvbnN0IG5IPW5ldyBHYSgiTUFUX0RBVEVfTE9DQUxFIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbiBvSCgpe3JldHVybiBPcihXeSl9fSk7Y2xhc3MgaUh7Y29uc3RydWN0b3IoKXt0aGlzLl9sb2NhbGVDaGFuZ2VzPW5ldyBJLHRoaXMubG9jYWxlQ2hhbmdlcz10aGlzLl9sb2NhbGVDaGFuZ2VzfWdldFZhbGlkRGF0ZU9yTnVsbCh0KXtyZXR1cm4gdGhpcy5pc0RhdGVJbnN0YW5jZSh0KSYmdGhpcy5pc1ZhbGlkKHQpP3Q6bnVsbH1kZXNlcmlhbGl6ZSh0KXtyZXR1cm4gbnVsbD09dHx8dGhpcy5pc0RhdGVJbnN0YW5jZSh0KSYmdGhpcy5pc1ZhbGlkKHQpP3Q6dGhpcy5pbnZhbGlkKCl9c2V0TG9jYWxlKHQpe3RoaXMubG9jYWxlPXQsdGhpcy5fbG9jYWxlQ2hhbmdlcy5uZXh0KCl9Y29tcGFyZURhdGUodCxlKXtyZXR1cm4gdGhpcy5nZXRZZWFyKHQpLXRoaXMuZ2V0WWVhcihlKXx8dGhpcy5nZXRNb250aCh0KS10aGlzLmdldE1vbnRoKGUpfHx0aGlzLmdldERhdGUodCktdGhpcy5nZXREYXRlKGUpfXNhbWVEYXRlKHQsZSl7aWYodCYmZSl7bGV0IG49dGhpcy5pc1ZhbGlkKHQpLG89dGhpcy5pc1ZhbGlkKGUpO3JldHVybiBuJiZvPyF0aGlzLmNvbXBhcmVEYXRlKHQsZSk6bj09b31yZXR1cm4gdD09ZX1jbGFtcERhdGUodCxlLG4pe3JldHVybiBlJiZ0aGlzLmNvbXBhcmVEYXRlKHQsZSk8MD9lOm4mJnRoaXMuY29tcGFyZURhdGUodCxuKT4wP246dH19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NvbnN0IGFIPW5ldyBHYSgibWF0LWRhdGUtZm9ybWF0cyIpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9sZXQgckg7dHJ5e3JIPSJ1bmRlZmluZWQiIT10eXBlb2YgSW50bH1jYXRjaChqQ3Qpe3JIPSExfWNvbnN0IHNIPXtsb25nOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxzaG9ydDpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdLG5hcnJvdzpbIkoiLCJGIiwiTSIsIkEiLCJNIiwiSiIsIkoiLCJBIiwiUyIsIk8iLCJOIiwiRCJdfSxsSD1wSCgzMSwodD0+U3RyaW5nKHQrMSkpKSxjSD17bG9uZzpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sc2hvcnQ6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxuYXJyb3c6WyJTIiwiTSIsIlQiLCJXIiwiVCIsIkYiLCJTIl19LGRIPS9eXGR7NH0tXGR7Mn0tXGR7Mn0oPzpUXGR7Mn06XGR7Mn06XGR7Mn0oPzpcLlxkKyk/KD86WnwoPzooPzpcK3wtKVxkezJ9OlxkezJ9KSk/KT8kLztmdW5jdGlvbiBwSCh0LGUpe2NvbnN0IG49QXJyYXkodCk7Zm9yKGxldCBvPTA7bzx0O28rKyluW29dPWUobyk7cmV0dXJuIG59Y2xhc3MgbUggZXh0ZW5kcyBpSHtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy51c2VVdGNGb3JEaXNwbGF5PSEwLHN1cGVyLnNldExvY2FsZSh0KSx0aGlzLnVzZVV0Y0ZvckRpc3BsYXk9IWUuVFJJREVOVCx0aGlzLl9jbGFtcERhdGU9ZS5UUklERU5UfHxlLkVER0V9Z2V0WWVhcih0KXtyZXR1cm4gdC5nZXRGdWxsWWVhcigpfWdldE1vbnRoKHQpe3JldHVybiB0LmdldE1vbnRoKCl9Z2V0RGF0ZSh0KXtyZXR1cm4gdC5nZXREYXRlKCl9Z2V0RGF5T2ZXZWVrKHQpe3JldHVybiB0LmdldERheSgpfWdldE1vbnRoTmFtZXModCl7aWYockgpe2NvbnN0IGU9bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5sb2NhbGUse21vbnRoOnQsdGltZVpvbmU6InV0YyJ9KTtyZXR1cm4gcEgoMTIsKHQ9PnRoaXMuX3N0cmlwRGlyZWN0aW9uYWxpdHlDaGFyYWN0ZXJzKHRoaXMuX2Zvcm1hdChlLG5ldyBEYXRlKDIwMTcsdCwxKSkpKSl9cmV0dXJuIHNIW3RdfWdldERhdGVOYW1lcygpe2lmKHJIKXtjb25zdCB0PW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMubG9jYWxlLHtkYXk6Im51bWVyaWMiLHRpbWVab25lOiJ1dGMifSk7cmV0dXJuIHBIKDMxLChlPT50aGlzLl9zdHJpcERpcmVjdGlvbmFsaXR5Q2hhcmFjdGVycyh0aGlzLl9mb3JtYXQodCxuZXcgRGF0ZSgyMDE3LDAsZSsxKSkpKSl9cmV0dXJuIGxIfWdldERheU9mV2Vla05hbWVzKHQpe2lmKHJIKXtjb25zdCBlPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMubG9jYWxlLHt3ZWVrZGF5OnQsdGltZVpvbmU6InV0YyJ9KTtyZXR1cm4gcEgoNywodD0+dGhpcy5fc3RyaXBEaXJlY3Rpb25hbGl0eUNoYXJhY3RlcnModGhpcy5fZm9ybWF0KGUsbmV3IERhdGUoMjAxNywwLHQrMSkpKSkpfXJldHVybiBjSFt0XX1nZXRZZWFyTmFtZSh0KXtpZihySCl7Y29uc3QgZT1uZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0aGlzLmxvY2FsZSx7eWVhcjoibnVtZXJpYyIsdGltZVpvbmU6InV0YyJ9KTtyZXR1cm4gdGhpcy5fc3RyaXBEaXJlY3Rpb25hbGl0eUNoYXJhY3RlcnModGhpcy5fZm9ybWF0KGUsdCkpfXJldHVybiBTdHJpbmcodGhpcy5nZXRZZWFyKHQpKX1nZXRGaXJzdERheU9mV2Vlaygpe3JldHVybiAwfWdldE51bURheXNJbk1vbnRoKHQpe3JldHVybiB0aGlzLmdldERhdGUodGhpcy5fY3JlYXRlRGF0ZVdpdGhPdmVyZmxvdyh0aGlzLmdldFllYXIodCksdGhpcy5nZXRNb250aCh0KSsxLDApKX1jbG9uZSh0KXtyZXR1cm4gbmV3IERhdGUodC5nZXRUaW1lKCkpfWNyZWF0ZURhdGUodCxlLG4pe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpe2lmKGU8MHx8ZT4xMSl0aHJvdyBFcnJvcihgSW52YWxpZCBtb250aCBpbmRleCAiJHtlfSIuIE1vbnRoIGluZGV4IGhhcyB0byBiZSBiZXR3ZWVuIDAgYW5kIDExLmApO2lmKG48MSl0aHJvdyBFcnJvcihgSW52YWxpZCBkYXRlICIke259Ii4gRGF0ZSBoYXMgdG8gYmUgZ3JlYXRlciB0aGFuIDAuYCl9bGV0IG89dGhpcy5fY3JlYXRlRGF0ZVdpdGhPdmVyZmxvdyh0LGUsbik7aWYoby5nZXRNb250aCgpIT1lJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkpdGhyb3cgRXJyb3IoYEludmFsaWQgZGF0ZSAiJHtufSIgZm9yIG1vbnRoIHdpdGggaW5kZXggIiR7ZX0iLmApO3JldHVybiBvfXRvZGF5KCl7cmV0dXJuIG5ldyBEYXRlfXBhcnNlKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD9uZXcgRGF0ZSh0KTp0P25ldyBEYXRlKERhdGUucGFyc2UodCkpOm51bGx9Zm9ybWF0KHQsZSl7aWYoIXRoaXMuaXNWYWxpZCh0KSl0aHJvdyBFcnJvcigiTmF0aXZlRGF0ZUFkYXB0ZXI6IENhbm5vdCBmb3JtYXQgaW52YWxpZCBkYXRlLiIpO2lmKHJIKXt0aGlzLl9jbGFtcERhdGUmJih0LmdldEZ1bGxZZWFyKCk8MXx8dC5nZXRGdWxsWWVhcigpPjk5OTkpJiYodD10aGlzLmNsb25lKHQpKS5zZXRGdWxsWWVhcihNYXRoLm1heCgxLE1hdGgubWluKDk5OTksdC5nZXRGdWxsWWVhcigpKSkpLGU9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHt0aW1lWm9uZToidXRjIn0pO2NvbnN0IG49bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5sb2NhbGUsZSk7cmV0dXJuIHRoaXMuX3N0cmlwRGlyZWN0aW9uYWxpdHlDaGFyYWN0ZXJzKHRoaXMuX2Zvcm1hdChuLHQpKX1yZXR1cm4gdGhpcy5fc3RyaXBEaXJlY3Rpb25hbGl0eUNoYXJhY3RlcnModC50b0RhdGVTdHJpbmcoKSl9YWRkQ2FsZW5kYXJZZWFycyh0LGUpe3JldHVybiB0aGlzLmFkZENhbGVuZGFyTW9udGhzKHQsMTIqZSl9YWRkQ2FsZW5kYXJNb250aHModCxlKXtsZXQgbj10aGlzLl9jcmVhdGVEYXRlV2l0aE92ZXJmbG93KHRoaXMuZ2V0WWVhcih0KSx0aGlzLmdldE1vbnRoKHQpK2UsdGhpcy5nZXREYXRlKHQpKTtyZXR1cm4gdGhpcy5nZXRNb250aChuKSE9KCh0aGlzLmdldE1vbnRoKHQpK2UpJTEyKzEyKSUxMiYmKG49dGhpcy5fY3JlYXRlRGF0ZVdpdGhPdmVyZmxvdyh0aGlzLmdldFllYXIobiksdGhpcy5nZXRNb250aChuKSwwKSksbn1hZGRDYWxlbmRhckRheXModCxlKXtyZXR1cm4gdGhpcy5fY3JlYXRlRGF0ZVdpdGhPdmVyZmxvdyh0aGlzLmdldFllYXIodCksdGhpcy5nZXRNb250aCh0KSx0aGlzLmdldERhdGUodCkrZSl9dG9Jc284NjAxKHQpe3JldHVyblt0LmdldFVUQ0Z1bGxZZWFyKCksdGhpcy5fMmRpZ2l0KHQuZ2V0VVRDTW9udGgoKSsxKSx0aGlzLl8yZGlnaXQodC5nZXRVVENEYXRlKCkpXS5qb2luKCItIil9ZGVzZXJpYWxpemUodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZighdClyZXR1cm4gbnVsbDtpZihkSC50ZXN0KHQpKXtsZXQgZT1uZXcgRGF0ZSh0KTtpZih0aGlzLmlzVmFsaWQoZSkpcmV0dXJuIGV9fXJldHVybiBzdXBlci5kZXNlcmlhbGl6ZSh0KX1pc0RhdGVJbnN0YW5jZSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIERhdGV9aXNWYWxpZCh0KXtyZXR1cm4haXNOYU4odC5nZXRUaW1lKCkpfWludmFsaWQoKXtyZXR1cm4gbmV3IERhdGUoTmFOKX1fY3JlYXRlRGF0ZVdpdGhPdmVyZmxvdyh0LGUsbil7Y29uc3Qgbz1uZXcgRGF0ZTtyZXR1cm4gby5zZXRGdWxsWWVhcih0LGUsbiksby5zZXRIb3VycygwLDAsMCwwKSxvfV8yZGlnaXQodCl7cmV0dXJuKCIwMCIrdCkuc2xpY2UoLTIpfV9zdHJpcERpcmVjdGlvbmFsaXR5Q2hhcmFjdGVycyh0KXtyZXR1cm4gdC5yZXBsYWNlKC9bXHUyMDBlXHUyMDBmXS9nLCIiKX1fZm9ybWF0KHQsZSl7Y29uc3Qgbj1uZXcgRGF0ZTtyZXR1cm4gbi5zZXRVVENGdWxsWWVhcihlLmdldEZ1bGxZZWFyKCksZS5nZXRNb250aCgpLGUuZ2V0RGF0ZSgpKSxuLnNldFVUQ0hvdXJzKGUuZ2V0SG91cnMoKSxlLmdldE1pbnV0ZXMoKSxlLmdldFNlY29uZHMoKSxlLmdldE1pbGxpc2Vjb25kcygpKSx0LmZvcm1hdChuKX19bUguybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fG1IKSh2cihuSCw4KSx2cih3eikpfSxtSC7JtXByb3Y9TW4oe3Rva2VuOm1ILGZhY3Rvcnk6bUguybVmYWN9KSxtSC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbbkhdfV19LHt0eXBlOnd6fV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChtSCxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltuSF19XX0se3R5cGU6d3p9XX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgdUh7fXVILsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx1SCl9LHVILsm1bW9kPWFvKHt0eXBlOnVIfSksdUguybVpbmo9dm4oe3Byb3ZpZGVyczpbe3Byb3ZpZGU6aUgsdXNlQ2xhc3M6bUh9XSxpbXBvcnRzOltba3pdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodUgsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltrel0scHJvdmlkZXJzOlt7cHJvdmlkZTppSCx1c2VDbGFzczptSH1dfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8odUgse2ltcG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5ba3pdfX0pO2NvbnN0IGZIPXtwYXJzZTp7ZGF0ZUlucHV0Om51bGx9LGRpc3BsYXk6e2RhdGVJbnB1dDp7eWVhcjoibnVtZXJpYyIsbW9udGg6Im51bWVyaWMiLGRheToibnVtZXJpYyJ9LG1vbnRoWWVhckxhYmVsOnt5ZWFyOiJudW1lcmljIixtb250aDoic2hvcnQifSxkYXRlQTExeUxhYmVsOnt5ZWFyOiJudW1lcmljIixtb250aDoibG9uZyIsZGF5OiJudW1lcmljIn0sbW9udGhZZWFyQTExeUxhYmVsOnt5ZWFyOiJudW1lcmljIixtb250aDoibG9uZyJ9fX07Y2xhc3MgZ0h7fWdILsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxnSCl9LGdILsm1bW9kPWFvKHt0eXBlOmdIfSksZ0guybVpbmo9dm4oe3Byb3ZpZGVyczpbe3Byb3ZpZGU6YUgsdXNlVmFsdWU6Zkh9XSxpbXBvcnRzOltbdUhdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZ0gsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOlt1SF0scHJvdmlkZXJzOlt7cHJvdmlkZTphSCx1c2VWYWx1ZTpmSH1dfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oZ0gse2ltcG9ydHM6W3VIXX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgaEh7aXNFcnJvclN0YXRlKHQsZSl7cmV0dXJuISEodCYmdC5pbnZhbGlkJiYodC5kaXJ0eXx8ZSYmZS5zdWJtaXR0ZWQpKX19aEguybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGhIKX0saEguybVwcm92PU1uKHt0b2tlbjpoSCxmYWN0b3J5OmhILsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChoSCxbe3R5cGU6aW19XSxudWxsLG51bGwpO2NsYXNzIGJIe2lzRXJyb3JTdGF0ZSh0LGUpe3JldHVybiEhKHQmJnQuaW52YWxpZCYmKHQudG91Y2hlZHx8ZSYmZS5zdWJtaXR0ZWQpKX19YkguybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGJIKX0sYkguybVwcm92PU1uKHtmYWN0b3J5OmZ1bmN0aW9uIHQoKXtyZXR1cm4gbmV3IGJIfSx0b2tlbjpiSCxwcm92aWRlZEluOiJyb290In0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoYkgsW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOiJyb290In1dfV0sbnVsbCxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIHlIe315SC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8eUgpfSx5SC7JtWRpcj1sbyh7dHlwZTp5SCxzZWxlY3RvcnM6W1siIiwibWF0LWxpbmUiLCIiXSxbIiIsIm1hdExpbmUiLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtbGluZSJdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh5SCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbWF0LWxpbmVdLCBbbWF0TGluZV0iLGhvc3Q6e2NsYXNzOiJtYXQtbGluZSJ9fV19XSxudWxsLG51bGwpO2NsYXNzIF9Ie31fSC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8X0gpfSxfSC7JtW1vZD1hbyh7dHlwZTpfSH0pLF9ILsm1aW5qPXZuKHtpbXBvcnRzOltbWEldLFhJXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoX0gsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltYSV0sZXhwb3J0czpbeUgsWEldLGRlY2xhcmF0aW9uczpbeUhdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oX0gse2RlY2xhcmF0aW9uczpbeUhdLGltcG9ydHM6W1hJXSxleHBvcnRzOlt5SCxYSV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIENIe2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLl9yZW5kZXJlcj10LHRoaXMuZWxlbWVudD1lLHRoaXMuY29uZmlnPW4sdGhpcy5zdGF0ZT0zfWZhZGVPdXQoKXt0aGlzLl9yZW5kZXJlci5mYWRlT3V0UmlwcGxlKHRoaXMpfX1jb25zdCBNSD17ZW50ZXJEdXJhdGlvbjoyMjUsZXhpdER1cmF0aW9uOjE1MH0sdkg9Tnooe3Bhc3NpdmU6ITB9KSx4SD1bIm1vdXNlZG93biIsInRvdWNoc3RhcnQiXSxPSD1bIm1vdXNldXAiLCJtb3VzZWxlYXZlIiwidG91Y2hlbmQiLCJ0b3VjaGNhbmNlbCJdO2NsYXNzIFBIe2NvbnN0cnVjdG9yKHQsZSxuLG8pe3RoaXMuX3RhcmdldD10LHRoaXMuX25nWm9uZT1lLHRoaXMuX2lzUG9pbnRlckRvd249ITEsdGhpcy5fYWN0aXZlUmlwcGxlcz1uZXcgU2V0LHRoaXMuX3BvaW50ZXJVcEV2ZW50c1JlZ2lzdGVyZWQ9ITEsby5pc0Jyb3dzZXImJih0aGlzLl9jb250YWluZXJFbGVtZW50PXh6KG4pKX1mYWRlSW5SaXBwbGUodCxlLG49e30pe2NvbnN0IG89dGhpcy5fY29udGFpbmVyUmVjdD10aGlzLl9jb250YWluZXJSZWN0fHx0aGlzLl9jb250YWluZXJFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGk9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LE1IKSxuLmFuaW1hdGlvbik7bi5jZW50ZXJlZCYmKHQ9by5sZWZ0K28ud2lkdGgvMixlPW8udG9wK28uaGVpZ2h0LzIpO2NvbnN0IGE9bi5yYWRpdXN8fChmdW5jdGlvbiByKHQsZSxuKXtjb25zdCBvPU1hdGgubWF4KE1hdGguYWJzKHQtbi5sZWZ0KSxNYXRoLmFicyh0LW4ucmlnaHQpKSxpPU1hdGgubWF4KE1hdGguYWJzKGUtbi50b3ApLE1hdGguYWJzKGUtbi5ib3R0b20pKTtyZXR1cm4gTWF0aC5zcXJ0KG8qbytpKmkpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8pKHQsZSxvKSxzPXQtby5sZWZ0LGw9ZS1vLnRvcCxjPWkuZW50ZXJEdXJhdGlvbixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuY2xhc3NMaXN0LmFkZCgibWF0LXJpcHBsZS1lbGVtZW50IiksZC5zdHlsZS5sZWZ0PXMtYSsicHgiLGQuc3R5bGUudG9wPWwtYSsicHgiLGQuc3R5bGUuaGVpZ2h0PTIqYSsicHgiLGQuc3R5bGUud2lkdGg9MiphKyJweCIsbnVsbCE9bi5jb2xvciYmKGQuc3R5bGUuYmFja2dyb3VuZENvbG9yPW4uY29sb3IpLGQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPWAke2N9bXNgLHRoaXMuX2NvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQoZCksKGZ1bmN0aW9uIHAodCl7d2luZG93LmdldENvbXB1dGVkU3R5bGUodCkuZ2V0UHJvcGVydHlWYWx1ZSgib3BhY2l0eSIpfSkoZCksZC5zdHlsZS50cmFuc2Zvcm09InNjYWxlKDEpIjtjb25zdCBtPW5ldyBDSCh0aGlzLGQsbik7cmV0dXJuIG0uc3RhdGU9MCx0aGlzLl9hY3RpdmVSaXBwbGVzLmFkZChtKSxuLnBlcnNpc3RlbnR8fCh0aGlzLl9tb3N0UmVjZW50VHJhbnNpZW50UmlwcGxlPW0pLHRoaXMuX3J1blRpbWVvdXRPdXRzaWRlWm9uZSgoKCk9Pntjb25zdCB0PW09PT10aGlzLl9tb3N0UmVjZW50VHJhbnNpZW50UmlwcGxlO20uc3RhdGU9MSxuLnBlcnNpc3RlbnR8fHQmJnRoaXMuX2lzUG9pbnRlckRvd258fG0uZmFkZU91dCgpfSksYyksbX1mYWRlT3V0UmlwcGxlKHQpe2NvbnN0IGU9dGhpcy5fYWN0aXZlUmlwcGxlcy5kZWxldGUodCk7aWYodD09PXRoaXMuX21vc3RSZWNlbnRUcmFuc2llbnRSaXBwbGUmJih0aGlzLl9tb3N0UmVjZW50VHJhbnNpZW50UmlwcGxlPW51bGwpLHRoaXMuX2FjdGl2ZVJpcHBsZXMuc2l6ZXx8KHRoaXMuX2NvbnRhaW5lclJlY3Q9bnVsbCksIWUpcmV0dXJuO2NvbnN0IG49dC5lbGVtZW50LG89T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LE1IKSx0LmNvbmZpZy5hbmltYXRpb24pO24uc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPWAke28uZXhpdER1cmF0aW9ufW1zYCxuLnN0eWxlLm9wYWNpdHk9IjAiLHQuc3RhdGU9Mix0aGlzLl9ydW5UaW1lb3V0T3V0c2lkZVpvbmUoKCgpPT57dC5zdGF0ZT0zLG4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKX0pLG8uZXhpdER1cmF0aW9uKX1mYWRlT3V0QWxsKCl7dGhpcy5fYWN0aXZlUmlwcGxlcy5mb3JFYWNoKCh0PT50LmZhZGVPdXQoKSkpfWZhZGVPdXRBbGxOb25QZXJzaXN0ZW50KCl7dGhpcy5fYWN0aXZlUmlwcGxlcy5mb3JFYWNoKCh0PT57dC5jb25maWcucGVyc2lzdGVudHx8dC5mYWRlT3V0KCl9KSl9c2V0dXBUcmlnZ2VyRXZlbnRzKHQpe2NvbnN0IGU9eHoodCk7ZSYmZSE9PXRoaXMuX3RyaWdnZXJFbGVtZW50JiYodGhpcy5fcmVtb3ZlVHJpZ2dlckV2ZW50cygpLHRoaXMuX3RyaWdnZXJFbGVtZW50PWUsdGhpcy5fcmVnaXN0ZXJFdmVudHMoeEgpKX1oYW5kbGVFdmVudCh0KXsibW91c2Vkb3duIj09PXQudHlwZT90aGlzLl9vbk1vdXNlZG93bih0KToidG91Y2hzdGFydCI9PT10LnR5cGU/dGhpcy5fb25Ub3VjaFN0YXJ0KHQpOnRoaXMuX29uUG9pbnRlclVwKCksdGhpcy5fcG9pbnRlclVwRXZlbnRzUmVnaXN0ZXJlZHx8KHRoaXMuX3JlZ2lzdGVyRXZlbnRzKE9IKSx0aGlzLl9wb2ludGVyVXBFdmVudHNSZWdpc3RlcmVkPSEwKX1fb25Nb3VzZWRvd24odCl7Y29uc3QgZT1nSSh0KSxuPXRoaXMuX2xhc3RUb3VjaFN0YXJ0RXZlbnQmJkRhdGUubm93KCk8dGhpcy5fbGFzdFRvdWNoU3RhcnRFdmVudCs4MDA7dGhpcy5fdGFyZ2V0LnJpcHBsZURpc2FibGVkfHxlfHxufHwodGhpcy5faXNQb2ludGVyRG93bj0hMCx0aGlzLmZhZGVJblJpcHBsZSh0LmNsaWVudFgsdC5jbGllbnRZLHRoaXMuX3RhcmdldC5yaXBwbGVDb25maWcpKX1fb25Ub3VjaFN0YXJ0KHQpe2lmKCF0aGlzLl90YXJnZXQucmlwcGxlRGlzYWJsZWQmJiFoSSh0KSl7dGhpcy5fbGFzdFRvdWNoU3RhcnRFdmVudD1EYXRlLm5vdygpLHRoaXMuX2lzUG9pbnRlckRvd249ITA7Y29uc3QgZT10LmNoYW5nZWRUb3VjaGVzO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXRoaXMuZmFkZUluUmlwcGxlKGVbdF0uY2xpZW50WCxlW3RdLmNsaWVudFksdGhpcy5fdGFyZ2V0LnJpcHBsZUNvbmZpZyl9fV9vblBvaW50ZXJVcCgpe3RoaXMuX2lzUG9pbnRlckRvd24mJih0aGlzLl9pc1BvaW50ZXJEb3duPSExLHRoaXMuX2FjdGl2ZVJpcHBsZXMuZm9yRWFjaCgodD0+eyF0LmNvbmZpZy5wZXJzaXN0ZW50JiYoMT09PXQuc3RhdGV8fHQuY29uZmlnLnRlcm1pbmF0ZU9uUG9pbnRlclVwJiYwPT09dC5zdGF0ZSkmJnQuZmFkZU91dCgpfSkpKX1fcnVuVGltZW91dE91dHNpZGVab25lKHQsZT0wKXt0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT5zZXRUaW1lb3V0KHQsZSkpKX1fcmVnaXN0ZXJFdmVudHModCl7dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e3QuZm9yRWFjaCgodD0+e3RoaXMuX3RyaWdnZXJFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodCx0aGlzLHZIKX0pKX0pKX1fcmVtb3ZlVHJpZ2dlckV2ZW50cygpe3RoaXMuX3RyaWdnZXJFbGVtZW50JiYoeEguZm9yRWFjaCgodD0+e3RoaXMuX3RyaWdnZXJFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodCx0aGlzLHZIKX0pKSx0aGlzLl9wb2ludGVyVXBFdmVudHNSZWdpc3RlcmVkJiZPSC5mb3JFYWNoKCh0PT57dGhpcy5fdHJpZ2dlckVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LHRoaXMsdkgpfSkpKX19Y29uc3Qgd0g9bmV3IEdhKCJtYXQtcmlwcGxlLWdsb2JhbC1vcHRpb25zIik7Y2xhc3Mga0h7Y29uc3RydWN0b3IodCxlLG4sbyxpKXt0aGlzLl9lbGVtZW50UmVmPXQsdGhpcy5fYW5pbWF0aW9uTW9kZT1pLHRoaXMucmFkaXVzPTAsdGhpcy5fZGlzYWJsZWQ9ITEsdGhpcy5faXNJbml0aWFsaXplZD0hMSx0aGlzLl9nbG9iYWxPcHRpb25zPW98fHt9LHRoaXMuX3JpcHBsZVJlbmRlcmVyPW5ldyBQSCh0aGlzLGUsdCxuKX1nZXQgZGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5fZGlzYWJsZWR9c2V0IGRpc2FibGVkKHQpe3QmJnRoaXMuZmFkZU91dEFsbE5vblBlcnNpc3RlbnQoKSx0aGlzLl9kaXNhYmxlZD10LHRoaXMuX3NldHVwVHJpZ2dlckV2ZW50c0lmRW5hYmxlZCgpfWdldCB0cmlnZ2VyKCl7cmV0dXJuIHRoaXMuX3RyaWdnZXJ8fHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudH1zZXQgdHJpZ2dlcih0KXt0aGlzLl90cmlnZ2VyPXQsdGhpcy5fc2V0dXBUcmlnZ2VyRXZlbnRzSWZFbmFibGVkKCl9bmdPbkluaXQoKXt0aGlzLl9pc0luaXRpYWxpemVkPSEwLHRoaXMuX3NldHVwVHJpZ2dlckV2ZW50c0lmRW5hYmxlZCgpfW5nT25EZXN0cm95KCl7dGhpcy5fcmlwcGxlUmVuZGVyZXIuX3JlbW92ZVRyaWdnZXJFdmVudHMoKX1mYWRlT3V0QWxsKCl7dGhpcy5fcmlwcGxlUmVuZGVyZXIuZmFkZU91dEFsbCgpfWZhZGVPdXRBbGxOb25QZXJzaXN0ZW50KCl7dGhpcy5fcmlwcGxlUmVuZGVyZXIuZmFkZU91dEFsbE5vblBlcnNpc3RlbnQoKX1nZXQgcmlwcGxlQ29uZmlnKCl7cmV0dXJue2NlbnRlcmVkOnRoaXMuY2VudGVyZWQscmFkaXVzOnRoaXMucmFkaXVzLGNvbG9yOnRoaXMuY29sb3IsYW5pbWF0aW9uOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHRoaXMuX2dsb2JhbE9wdGlvbnMuYW5pbWF0aW9uKSwiTm9vcEFuaW1hdGlvbnMiPT09dGhpcy5fYW5pbWF0aW9uTW9kZT97ZW50ZXJEdXJhdGlvbjowLGV4aXREdXJhdGlvbjowfTp7fSksdGhpcy5hbmltYXRpb24pLHRlcm1pbmF0ZU9uUG9pbnRlclVwOnRoaXMuX2dsb2JhbE9wdGlvbnMudGVybWluYXRlT25Qb2ludGVyVXB9fWdldCByaXBwbGVEaXNhYmxlZCgpe3JldHVybiB0aGlzLmRpc2FibGVkfHwhIXRoaXMuX2dsb2JhbE9wdGlvbnMuZGlzYWJsZWR9X3NldHVwVHJpZ2dlckV2ZW50c0lmRW5hYmxlZCgpeyF0aGlzLmRpc2FibGVkJiZ0aGlzLl9pc0luaXRpYWxpemVkJiZ0aGlzLl9yaXBwbGVSZW5kZXJlci5zZXR1cFRyaWdnZXJFdmVudHModGhpcy50cmlnZ2VyKX1sYXVuY2godCxlPTAsbil7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuX3JpcHBsZVJlbmRlcmVyLmZhZGVJblJpcHBsZSh0LGUsT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHRoaXMucmlwcGxlQ29uZmlnKSxuKSk6dGhpcy5fcmlwcGxlUmVuZGVyZXIuZmFkZUluUmlwcGxlKDAsMCxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5yaXBwbGVDb25maWcpLHQpKX19a0guybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGtIKShTbShoZyksU20oYV8pLFNtKHd6KSxTbSh3SCw4KSxTbShWUCw4KSl9LGtILsm1ZGlyPWxvKHt0eXBlOmtILHNlbGVjdG9yczpbWyIiLCJtYXQtcmlwcGxlIiwiIl0sWyIiLCJtYXRSaXBwbGUiLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtcmlwcGxlIl0saG9zdFZhcnM6Mixob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmcHUoIm1hdC1yaXBwbGUtdW5ib3VuZGVkIixuLnVuYm91bmRlZCl9LGlucHV0czp7cmFkaXVzOlsibWF0UmlwcGxlUmFkaXVzIiwicmFkaXVzIl0sZGlzYWJsZWQ6WyJtYXRSaXBwbGVEaXNhYmxlZCIsImRpc2FibGVkIl0sdHJpZ2dlcjpbIm1hdFJpcHBsZVRyaWdnZXIiLCJ0cmlnZ2VyIl0sY29sb3I6WyJtYXRSaXBwbGVDb2xvciIsImNvbG9yIl0sdW5ib3VuZGVkOlsibWF0UmlwcGxlVW5ib3VuZGVkIiwidW5ib3VuZGVkIl0sY2VudGVyZWQ6WyJtYXRSaXBwbGVDZW50ZXJlZCIsImNlbnRlcmVkIl0sYW5pbWF0aW9uOlsibWF0UmlwcGxlQW5pbWF0aW9uIiwiYW5pbWF0aW9uIl19LGV4cG9ydEFzOlsibWF0UmlwcGxlIl19KSxrSC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTphX30se3R5cGU6d3p9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbd0hdfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19XSxrSC5wcm9wRGVjb3JhdG9ycz17Y29sb3I6W3t0eXBlOnh5LGFyZ3M6WyJtYXRSaXBwbGVDb2xvciJdfV0sdW5ib3VuZGVkOlt7dHlwZTp4eSxhcmdzOlsibWF0UmlwcGxlVW5ib3VuZGVkIl19XSxjZW50ZXJlZDpbe3R5cGU6eHksYXJnczpbIm1hdFJpcHBsZUNlbnRlcmVkIl19XSxyYWRpdXM6W3t0eXBlOnh5LGFyZ3M6WyJtYXRSaXBwbGVSYWRpdXMiXX1dLGFuaW1hdGlvbjpbe3R5cGU6eHksYXJnczpbIm1hdFJpcHBsZUFuaW1hdGlvbiJdfV0sZGlzYWJsZWQ6W3t0eXBlOnh5LGFyZ3M6WyJtYXRSaXBwbGVEaXNhYmxlZCJdfV0sdHJpZ2dlcjpbe3R5cGU6eHksYXJnczpbIm1hdFJpcHBsZVRyaWdnZXIiXX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGtILFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IlttYXQtcmlwcGxlXSwgW21hdFJpcHBsZV0iLGV4cG9ydEFzOiJtYXRSaXBwbGUiLGhvc3Q6e2NsYXNzOiJtYXQtcmlwcGxlIiwiW2NsYXNzLm1hdC1yaXBwbGUtdW5ib3VuZGVkXSI6InVuYm91bmRlZCJ9fV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOmFffSx7dHlwZTp3en0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOlt3SF19XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dfSkse3JhZGl1czpbe3R5cGU6eHksYXJnczpbIm1hdFJpcHBsZVJhZGl1cyJdfV0sZGlzYWJsZWQ6W3t0eXBlOnh5LGFyZ3M6WyJtYXRSaXBwbGVEaXNhYmxlZCJdfV0sdHJpZ2dlcjpbe3R5cGU6eHksYXJnczpbIm1hdFJpcHBsZVRyaWdnZXIiXX1dLGNvbG9yOlt7dHlwZTp4eSxhcmdzOlsibWF0UmlwcGxlQ29sb3IiXX1dLHVuYm91bmRlZDpbe3R5cGU6eHksYXJnczpbIm1hdFJpcHBsZVVuYm91bmRlZCJdfV0sY2VudGVyZWQ6W3t0eXBlOnh5LGFyZ3M6WyJtYXRSaXBwbGVDZW50ZXJlZCJdfV0sYW5pbWF0aW9uOlt7dHlwZTp4eSxhcmdzOlsibWF0UmlwcGxlQW5pbWF0aW9uIl19XX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgU0h7fVNILsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxTSCl9LFNILsm1bW9kPWFvKHt0eXBlOlNIfSksU0guybVpbmo9dm4oe2ltcG9ydHM6W1tYSSxrel0sWEldfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChTSCxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W1hJLGt6XSxleHBvcnRzOltrSCxYSV0sZGVjbGFyYXRpb25zOltrSF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhTSCx7ZGVjbGFyYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuW2tIXX0saW1wb3J0czpmdW5jdGlvbigpe3JldHVybltYSSxrel19LGV4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5ba0gsWEldfX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgREh7Y29uc3RydWN0b3IodCl7dGhpcy5fYW5pbWF0aW9uTW9kZT10LHRoaXMuc3RhdGU9InVuY2hlY2tlZCIsdGhpcy5kaXNhYmxlZD0hMX19REguybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fERIKShTbShWUCw4KSl9LERILsm1Y21wPXRvKHt0eXBlOkRILHNlbGVjdG9yczpbWyJtYXQtcHNldWRvLWNoZWNrYm94Il1dLGhvc3RBdHRyczpbMSwibWF0LXBzZXVkby1jaGVja2JveCJdLGhvc3RWYXJzOjgsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJnB1KCJtYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUiLCJpbmRldGVybWluYXRlIj09PW4uc3RhdGUpKCJtYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQiLCJjaGVja2VkIj09PW4uc3RhdGUpKCJtYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkIixuLmRpc2FibGVkKSgiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLCJOb29wQW5pbWF0aW9ucyI9PT1uLl9hbmltYXRpb25Nb2RlKX0saW5wdXRzOntzdGF0ZToic3RhdGUiLGRpc2FibGVkOiJkaXNhYmxlZCJ9LGRlY2xzOjAsdmFyczowLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXt9LHN0eWxlczpbJy5tYXQtcHNldWRvLWNoZWNrYm94e3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7Ym9yZGVyOjJweCBzb2xpZDtib3JkZXItcmFkaXVzOjJweDtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXgtc2hyaW5rOjA7dHJhbnNpdGlvbjpib3JkZXItY29sb3IgOTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAwLjEpLGJhY2tncm91bmQtY29sb3IgOTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAwLjEpfS5tYXQtcHNldWRvLWNoZWNrYm94OjphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTtvcGFjaXR5OjA7Y29udGVudDoiIjtib3JkZXItYm90dG9tOjJweCBzb2xpZCBjdXJyZW50Q29sb3I7dHJhbnNpdGlvbjpvcGFjaXR5IDkwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKX0ubWF0LXBzZXVkby1jaGVja2JveC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsLm1hdC1wc2V1ZG8tY2hlY2tib3gubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRle2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXBzZXVkby1jaGVja2JveHt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wc2V1ZG8tY2hlY2tib3g6OmFmdGVye3RyYW5zaXRpb246bm9uZX0ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdH0ubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlOjphZnRlcnt0b3A6NXB4O2xlZnQ6MXB4O3dpZHRoOjEwcHg7b3BhY2l0eToxO2JvcmRlci1yYWRpdXM6MnB4fS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQ6OmFmdGVye3RvcDoyLjRweDtsZWZ0OjFweDt3aWR0aDo4cHg7aGVpZ2h0OjNweDtib3JkZXItbGVmdDoycHggc29saWQgY3VycmVudENvbG9yO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTtvcGFjaXR5OjE7Ym94LXNpemluZzpjb250ZW50LWJveH1cbiddLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLERILmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dLERILnByb3BEZWNvcmF0b3JzPXtzdGF0ZTpbe3R5cGU6eHl9XSxkaXNhYmxlZDpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChESCxbe3R5cGU6TXksYXJnczpbe2VuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLHNlbGVjdG9yOiJtYXQtcHNldWRvLWNoZWNrYm94Iix0ZW1wbGF0ZToiIixob3N0OntjbGFzczoibWF0LXBzZXVkby1jaGVja2JveCIsIltjbGFzcy5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVdIjonc3RhdGUgPT09ICJpbmRldGVybWluYXRlIicsIltjbGFzcy5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRdIjonc3RhdGUgPT09ICJjaGVja2VkIicsIltjbGFzcy5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkXSI6ImRpc2FibGVkIiwiW2NsYXNzLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlXSI6J19hbmltYXRpb25Nb2RlID09PSAiTm9vcEFuaW1hdGlvbnMiJ30sc3R5bGVzOlsnLm1hdC1wc2V1ZG8tY2hlY2tib3h7d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtib3JkZXI6MnB4IHNvbGlkO2JvcmRlci1yYWRpdXM6MnB4O2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7ZmxleC1zaHJpbms6MDt0cmFuc2l0aW9uOmJvcmRlci1jb2xvciA5MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDAuMSksYmFja2dyb3VuZC1jb2xvciA5MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDAuMSl9Lm1hdC1wc2V1ZG8tY2hlY2tib3g6OmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO29wYWNpdHk6MDtjb250ZW50OiIiO2JvcmRlci1ib3R0b206MnB4IHNvbGlkIGN1cnJlbnRDb2xvcjt0cmFuc2l0aW9uOm9wYWNpdHkgOTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAwLjEpfS5tYXQtcHNldWRvLWNoZWNrYm94Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCwubWF0LXBzZXVkby1jaGVja2JveC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGV7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtcHNldWRvLWNoZWNrYm94e3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXBzZXVkby1jaGVja2JveDo6YWZ0ZXJ7dHJhbnNpdGlvbjpub25lfS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGU6OmFmdGVye3RvcDo1cHg7bGVmdDoxcHg7d2lkdGg6MTBweDtvcGFjaXR5OjE7Ym9yZGVyLXJhZGl1czoycHh9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZDo6YWZ0ZXJ7dG9wOjIuNHB4O2xlZnQ6MXB4O3dpZHRoOjhweDtoZWlnaHQ6M3B4O2JvcmRlci1sZWZ0OjJweCBzb2xpZCBjdXJyZW50Q29sb3I7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO29wYWNpdHk6MTtib3gtc2l6aW5nOmNvbnRlbnQtYm94fVxuJ119XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV19KSx7c3RhdGU6W3t0eXBlOnh5fV0sZGlzYWJsZWQ6W3t0eXBlOnh5fV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIEVIe31FSC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8RUgpfSxFSC7JtW1vZD1hbyh7dHlwZTpFSH0pLEVILsm1aW5qPXZuKHtpbXBvcnRzOltbWEldXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRUgsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltYSV0sZXhwb3J0czpbREhdLGRlY2xhcmF0aW9uczpbREhdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oRUgse2RlY2xhcmF0aW9uczpbREhdLGltcG9ydHM6W1hJXSxleHBvcnRzOltESF19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IFJIPW5ldyBHYSgiTUFUX09QVElPTl9QQVJFTlRfQ09NUE9ORU5UIiksQUg9S0koY2xhc3N7fSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2xldCBUSD0wO2NsYXNzIE5IIGV4dGVuZHMgQUh7Y29uc3RydWN0b3IodCl7dmFyIGU7c3VwZXIoKSx0aGlzLl9sYWJlbElkPSJtYXQtb3B0Z3JvdXAtbGFiZWwtIitUSCsrLHRoaXMuX2luZXJ0PW51bGwhPT0oZT1udWxsPT10P3ZvaWQgMDp0LmluZXJ0R3JvdXBzKSYmdm9pZCAwIT09ZSYmZX19TkguybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fE5IKShTbShSSCw4KSl9LE5ILsm1ZGlyPWxvKHt0eXBlOk5ILGlucHV0czp7bGFiZWw6ImxhYmVsIn0sZmVhdHVyZXM6W3hwXX0pLE5ILmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1JIXX0se3R5cGU6U3J9XX1dLE5ILnByb3BEZWNvcmF0b3JzPXtsYWJlbDpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChOSCxbe3R5cGU6Q3l9XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1JIXX0se3R5cGU6U3J9XX1dfSkse2xhYmVsOlt7dHlwZTp4eX1dfSk7Y29uc3Qgekg9bmV3IEdhKCJNYXRPcHRncm91cCIpO2NsYXNzIElIIGV4dGVuZHMgTkh7fUlILsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYShJSCkpKShufHxJSCl9fSkoKSxJSC7JtWNtcD10byh7dHlwZTpJSCxzZWxlY3RvcnM6W1sibWF0LW9wdGdyb3VwIl1dLGhvc3RBdHRyczpbMSwibWF0LW9wdGdyb3VwIl0saG9zdFZhcnM6NSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmKGpwKCJyb2xlIixuLl9pbmVydD9udWxsOiJncm91cCIpKCJhcmlhLWRpc2FibGVkIixuLl9pbmVydD9udWxsOm4uZGlzYWJsZWQudG9TdHJpbmcoKSkoImFyaWEtbGFiZWxsZWRieSIsbi5faW5lcnQ/bnVsbDpuLl9sYWJlbElkKSxwdSgibWF0LW9wdGdyb3VwLWRpc2FibGVkIixuLmRpc2FibGVkKSl9LGlucHV0czp7ZGlzYWJsZWQ6ImRpc2FibGVkIn0sZXhwb3J0QXM6WyJtYXRPcHRncm91cCJdLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6ekgsdXNlRXhpc3Rpbmc6SUh9XSkseHBdLG5nQ29udGVudFNlbGVjdG9yczpbIioiLCJtYXQtb3B0aW9uLCBuZy1jb250YWluZXIiXSxkZWNsczo0LHZhcnM6Mixjb25zdHM6W1siYXJpYS1oaWRkZW4iLCJ0cnVlIiwxLCJtYXQtb3B0Z3JvdXAtbGFiZWwiLDMsImlkIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabShWSSksUm0oMCwic3BhbiIsMCksa3UoMSksWG0oMiksQW0oKSxYbSgzLDEpKSwyJmUmJihEbSgiaWQiLG4uX2xhYmVsSWQpLHJjKDEpLER1KCIiLG4ubGFiZWwsIiAiKSl9LHN0eWxlczpbIi5tYXQtb3B0Z3JvdXAtbGFiZWx7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7bGluZS1oZWlnaHQ6NDhweDtoZWlnaHQ6NDhweDtwYWRkaW5nOjAgMTZweDt0ZXh0LWFsaWduOmxlZnQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7bWF4LXdpZHRoOjEwMCU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpkZWZhdWx0fS5tYXQtb3B0Z3JvdXAtbGFiZWxbZGlzYWJsZWRde2N1cnNvcjpkZWZhdWx0fVtkaXI9cnRsXSAubWF0LW9wdGdyb3VwLWxhYmVse3RleHQtYWxpZ246cmlnaHR9Lm1hdC1vcHRncm91cC1sYWJlbCAubWF0LWljb257bWFyZ2luLXJpZ2h0OjE2cHg7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtb3B0Z3JvdXAtbGFiZWwgLm1hdC1pY29uIHN2Z3t2ZXJ0aWNhbC1hbGlnbjp0b3B9W2Rpcj1ydGxdIC5tYXQtb3B0Z3JvdXAtbGFiZWwgLm1hdC1pY29ue21hcmdpbi1sZWZ0OjE2cHg7bWFyZ2luLXJpZ2h0OjB9XG4iXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKElILFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC1vcHRncm91cCIsZXhwb3J0QXM6Im1hdE9wdGdyb3VwIix0ZW1wbGF0ZTonPHNwYW4gY2xhc3M9Im1hdC1vcHRncm91cC1sYWJlbCIgYXJpYS1oaWRkZW49InRydWUiIFtpZF09Il9sYWJlbElkIj57eyBsYWJlbCB9fSA8bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9zcGFuPlxuPG5nLWNvbnRlbnQgc2VsZWN0PSJtYXQtb3B0aW9uLCBuZy1jb250YWluZXIiPjwvbmctY29udGVudD5cbicsZW5jYXBzdWxhdGlvbjpIbi5Ob25lLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2gsaW5wdXRzOlsiZGlzYWJsZWQiXSxob3N0OntjbGFzczoibWF0LW9wdGdyb3VwIiwiW2F0dHIucm9sZV0iOidfaW5lcnQgPyBudWxsIDogImdyb3VwIicsIlthdHRyLmFyaWEtZGlzYWJsZWRdIjoiX2luZXJ0ID8gbnVsbCA6IGRpc2FibGVkLnRvU3RyaW5nKCkiLCJbYXR0ci5hcmlhLWxhYmVsbGVkYnldIjoiX2luZXJ0ID8gbnVsbCA6IF9sYWJlbElkIiwiW2NsYXNzLm1hdC1vcHRncm91cC1kaXNhYmxlZF0iOiJkaXNhYmxlZCJ9LHByb3ZpZGVyczpbe3Byb3ZpZGU6ekgsdXNlRXhpc3Rpbmc6SUh9XSxzdHlsZXM6WyIubWF0LW9wdGdyb3VwLWxhYmVse3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2xpbmUtaGVpZ2h0OjQ4cHg7aGVpZ2h0OjQ4cHg7cGFkZGluZzowIDE2cHg7dGV4dC1hbGlnbjpsZWZ0O3RleHQtZGVjb3JhdGlvbjpub25lO21heC13aWR0aDoxMDAlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6ZGVmYXVsdH0ubWF0LW9wdGdyb3VwLWxhYmVsW2Rpc2FibGVkXXtjdXJzb3I6ZGVmYXVsdH1bZGlyPXJ0bF0gLm1hdC1vcHRncm91cC1sYWJlbHt0ZXh0LWFsaWduOnJpZ2h0fS5tYXQtb3B0Z3JvdXAtbGFiZWwgLm1hdC1pY29ue21hcmdpbi1yaWdodDoxNnB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0ubWF0LW9wdGdyb3VwLWxhYmVsIC5tYXQtaWNvbiBzdmd7dmVydGljYWwtYWxpZ246dG9wfVtkaXI9cnRsXSAubWF0LW9wdGdyb3VwLWxhYmVsIC5tYXQtaWNvbnttYXJnaW4tbGVmdDoxNnB4O21hcmdpbi1yaWdodDowfVxuIl19XX1dLG51bGwsbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpsZXQgSEg9MDtjbGFzcyBGSHtjb25zdHJ1Y3Rvcih0LGU9ITEpe3RoaXMuc291cmNlPXQsdGhpcy5pc1VzZXJJbnB1dD1lfX1jbGFzcyBMSHtjb25zdHJ1Y3Rvcih0LGUsbixvKXt0aGlzLl9lbGVtZW50PXQsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWY9ZSx0aGlzLl9wYXJlbnQ9bix0aGlzLmdyb3VwPW8sdGhpcy5fc2VsZWN0ZWQ9ITEsdGhpcy5fYWN0aXZlPSExLHRoaXMuX2Rpc2FibGVkPSExLHRoaXMuX21vc3RSZWNlbnRWaWV3VmFsdWU9IiIsdGhpcy5pZD0ibWF0LW9wdGlvbi0iK0hIKyssdGhpcy5vblNlbGVjdGlvbkNoYW5nZT1uZXcgTGgsdGhpcy5fc3RhdGVDaGFuZ2VzPW5ldyBJfWdldCBtdWx0aXBsZSgpe3JldHVybiB0aGlzLl9wYXJlbnQmJnRoaXMuX3BhcmVudC5tdWx0aXBsZX1nZXQgc2VsZWN0ZWQoKXtyZXR1cm4gdGhpcy5fc2VsZWN0ZWR9Z2V0IGRpc2FibGVkKCl7cmV0dXJuIHRoaXMuZ3JvdXAmJnRoaXMuZ3JvdXAuZGlzYWJsZWR8fHRoaXMuX2Rpc2FibGVkfXNldCBkaXNhYmxlZCh0KXt0aGlzLl9kaXNhYmxlZD15eih0KX1nZXQgZGlzYWJsZVJpcHBsZSgpe3JldHVybiB0aGlzLl9wYXJlbnQmJnRoaXMuX3BhcmVudC5kaXNhYmxlUmlwcGxlfWdldCBhY3RpdmUoKXtyZXR1cm4gdGhpcy5fYWN0aXZlfWdldCB2aWV3VmFsdWUoKXtyZXR1cm4odGhpcy5fZ2V0SG9zdEVsZW1lbnQoKS50ZXh0Q29udGVudHx8IiIpLnRyaW0oKX1zZWxlY3QoKXt0aGlzLl9zZWxlY3RlZHx8KHRoaXMuX3NlbGVjdGVkPSEwLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpLHRoaXMuX2VtaXRTZWxlY3Rpb25DaGFuZ2VFdmVudCgpKX1kZXNlbGVjdCgpe3RoaXMuX3NlbGVjdGVkJiYodGhpcy5fc2VsZWN0ZWQ9ITEsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCksdGhpcy5fZW1pdFNlbGVjdGlvbkNoYW5nZUV2ZW50KCkpfWZvY3VzKHQsZSl7Y29uc3Qgbj10aGlzLl9nZXRIb3N0RWxlbWVudCgpOyJmdW5jdGlvbiI9PXR5cGVvZiBuLmZvY3VzJiZuLmZvY3VzKGUpfXNldEFjdGl2ZVN0eWxlcygpe3RoaXMuX2FjdGl2ZXx8KHRoaXMuX2FjdGl2ZT0hMCx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSl9c2V0SW5hY3RpdmVTdHlsZXMoKXt0aGlzLl9hY3RpdmUmJih0aGlzLl9hY3RpdmU9ITEsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpfWdldExhYmVsKCl7cmV0dXJuIHRoaXMudmlld1ZhbHVlfV9oYW5kbGVLZXlkb3duKHQpe3Qua2V5Q29kZSE9PW16JiZ0LmtleUNvZGUhPT1menx8YnoodCl8fCh0aGlzLl9zZWxlY3RWaWFJbnRlcmFjdGlvbigpLHQucHJldmVudERlZmF1bHQoKSl9X3NlbGVjdFZpYUludGVyYWN0aW9uKCl7dGhpcy5kaXNhYmxlZHx8KHRoaXMuX3NlbGVjdGVkPSF0aGlzLm11bHRpcGxlfHwhdGhpcy5fc2VsZWN0ZWQsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCksdGhpcy5fZW1pdFNlbGVjdGlvbkNoYW5nZUV2ZW50KCEwKSl9X2dldEFyaWFTZWxlY3RlZCgpe3JldHVybiB0aGlzLnNlbGVjdGVkfHwhdGhpcy5tdWx0aXBsZSYmbnVsbH1fZ2V0VGFiSW5kZXgoKXtyZXR1cm4gdGhpcy5kaXNhYmxlZD8iLTEiOiIwIn1fZ2V0SG9zdEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50fW5nQWZ0ZXJWaWV3Q2hlY2tlZCgpe2lmKHRoaXMuX3NlbGVjdGVkKXtjb25zdCB0PXRoaXMudmlld1ZhbHVlO3QhPT10aGlzLl9tb3N0UmVjZW50Vmlld1ZhbHVlJiYodGhpcy5fbW9zdFJlY2VudFZpZXdWYWx1ZT10LHRoaXMuX3N0YXRlQ2hhbmdlcy5uZXh0KCkpfX1uZ09uRGVzdHJveSgpe3RoaXMuX3N0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpfV9lbWl0U2VsZWN0aW9uQ2hhbmdlRXZlbnQodD0hMSl7dGhpcy5vblNlbGVjdGlvbkNoYW5nZS5lbWl0KG5ldyBGSCh0aGlzLHQpKX19TEguybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fExIKShTbShoZyksU20oVWcpLFNtKHZvaWQgMCksU20oTkgpKX0sTEguybVkaXI9bG8oe3R5cGU6TEgsaW5wdXRzOntpZDoiaWQiLGRpc2FibGVkOiJkaXNhYmxlZCIsdmFsdWU6InZhbHVlIn0sb3V0cHV0czp7b25TZWxlY3Rpb25DaGFuZ2U6Im9uU2VsZWN0aW9uQ2hhbmdlIn19KSxMSC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpVZ30se3R5cGU6dm9pZCAwfSx7dHlwZTpOSH1dLExILnByb3BEZWNvcmF0b3JzPXt2YWx1ZTpbe3R5cGU6eHl9XSxpZDpbe3R5cGU6eHl9XSxkaXNhYmxlZDpbe3R5cGU6eHl9XSxvblNlbGVjdGlvbkNoYW5nZTpbe3R5cGU6T3l9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChMSCxbe3R5cGU6Q3l9XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOlVnfSx7dHlwZTp2b2lkIDB9LHt0eXBlOk5IfV19KSx7aWQ6W3t0eXBlOnh5fV0sb25TZWxlY3Rpb25DaGFuZ2U6W3t0eXBlOk95fV0sZGlzYWJsZWQ6W3t0eXBlOnh5fV0sdmFsdWU6W3t0eXBlOnh5fV19KTtjbGFzcyBCSCBleHRlbmRzIExIe2NvbnN0cnVjdG9yKHQsZSxuLG8pe3N1cGVyKHQsZSxuLG8pfX1mdW5jdGlvbiBWSCh0LGUsbil7aWYobi5sZW5ndGgpe2xldCBvPWUudG9BcnJheSgpLGk9bi50b0FycmF5KCksYT0wO2ZvcihsZXQgZT0wO2U8dCsxO2UrKylvW2VdLmdyb3VwJiZvW2VdLmdyb3VwPT09aVthXSYmYSsrO3JldHVybiBhfXJldHVybiAwfWZ1bmN0aW9uIGpIKHQsZSxuLG8pe3JldHVybiB0PG4/dDp0K2U+bitvP01hdGgubWF4KDAsdC1vK2UpOm59Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL0JILsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxCSCkoU20oaGcpLFNtKFVnKSxTbShSSCw4KSxTbSh6SCw4KSl9LEJILsm1Y21wPXRvKHt0eXBlOkJILHNlbGVjdG9yczpbWyJtYXQtb3B0aW9uIl1dLGhvc3RBdHRyczpbInJvbGUiLCJvcHRpb24iLDEsIm1hdC1vcHRpb24iLCJtYXQtZm9jdXMtaW5kaWNhdG9yIl0saG9zdFZhcnM6MTIsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJlZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5fc2VsZWN0VmlhSW50ZXJhY3Rpb24oKX0pKSgia2V5ZG93biIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX2hhbmRsZUtleWRvd24oZSl9KSksMiZlJiYoVHUoImlkIixuLmlkKSxqcCgidGFiaW5kZXgiLG4uX2dldFRhYkluZGV4KCkpKCJhcmlhLXNlbGVjdGVkIixuLl9nZXRBcmlhU2VsZWN0ZWQoKSkoImFyaWEtZGlzYWJsZWQiLG4uZGlzYWJsZWQudG9TdHJpbmcoKSkscHUoIm1hdC1zZWxlY3RlZCIsbi5zZWxlY3RlZCkoIm1hdC1vcHRpb24tbXVsdGlwbGUiLG4ubXVsdGlwbGUpKCJtYXQtYWN0aXZlIixuLmFjdGl2ZSkoIm1hdC1vcHRpb24tZGlzYWJsZWQiLG4uZGlzYWJsZWQpKX0sZXhwb3J0QXM6WyJtYXRPcHRpb24iXSxmZWF0dXJlczpbeHBdLG5nQ29udGVudFNlbGVjdG9yczpbIioiXSxkZWNsczo1LHZhcnM6NCxjb25zdHM6W1siY2xhc3MiLCJtYXQtb3B0aW9uLXBzZXVkby1jaGVja2JveCIsMywic3RhdGUiLCJkaXNhYmxlZCIsNCwibmdJZiJdLFsxLCJtYXQtb3B0aW9uLXRleHQiXSxbImNsYXNzIiwiY2RrLXZpc3VhbGx5LWhpZGRlbiIsNCwibmdJZiJdLFsibWF0LXJpcHBsZSIsIiIsMSwibWF0LW9wdGlvbi1yaXBwbGUiLDMsIm1hdFJpcHBsZVRyaWdnZXIiLCJtYXRSaXBwbGVEaXNhYmxlZCJdLFsxLCJtYXQtb3B0aW9uLXBzZXVkby1jaGVja2JveCIsMywic3RhdGUiLCJkaXNhYmxlZCJdLFsxLCJjZGstdmlzdWFsbHktaGlkZGVuIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabSgpLFFwKDAsakksMSwyLCJtYXQtcHNldWRvLWNoZWNrYm94IiwwKSxSbSgxLCJzcGFuIiwxKSxYbSgyKSxBbSgpLFFwKDMsVUksMiwxLCJzcGFuIiwyKSxUbSg0LCJkaXYiLDMpKSwyJmUmJihEbSgibmdJZiIsbi5tdWx0aXBsZSkscmMoMyksRG0oIm5nSWYiLG4uZ3JvdXAmJm4uZ3JvdXAuX2luZXJ0KSxyYygxKSxEbSgibWF0UmlwcGxlVHJpZ2dlciIsbi5fZ2V0SG9zdEVsZW1lbnQoKSkoIm1hdFJpcHBsZURpc2FibGVkIixuLmRpc2FibGVkfHxuLmRpc2FibGVSaXBwbGUpKX0sZGlyZWN0aXZlczpbZE0sa0gsREhdLHN0eWxlczpbIi5tYXQtb3B0aW9ue3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2xpbmUtaGVpZ2h0OjQ4cHg7aGVpZ2h0OjQ4cHg7cGFkZGluZzowIDE2cHg7dGV4dC1hbGlnbjpsZWZ0O3RleHQtZGVjb3JhdGlvbjpub25lO21heC13aWR0aDoxMDAlO3Bvc2l0aW9uOnJlbGF0aXZlO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O21heC13aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDthbGlnbi1pdGVtczpjZW50ZXI7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtb3B0aW9uW2Rpc2FibGVkXXtjdXJzb3I6ZGVmYXVsdH1bZGlyPXJ0bF0gLm1hdC1vcHRpb257dGV4dC1hbGlnbjpyaWdodH0ubWF0LW9wdGlvbiAubWF0LWljb257bWFyZ2luLXJpZ2h0OjE2cHg7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtb3B0aW9uIC5tYXQtaWNvbiBzdmd7dmVydGljYWwtYWxpZ246dG9wfVtkaXI9cnRsXSAubWF0LW9wdGlvbiAubWF0LWljb257bWFyZ2luLWxlZnQ6MTZweDttYXJnaW4tcmlnaHQ6MH0ubWF0LW9wdGlvblthcmlhLWRpc2FibGVkPXRydWVdey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6ZGVmYXVsdH0ubWF0LW9wdGdyb3VwIC5tYXQtb3B0aW9uOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7cGFkZGluZy1sZWZ0OjMycHh9W2Rpcj1ydGxdIC5tYXQtb3B0Z3JvdXAgLm1hdC1vcHRpb246bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKXtwYWRkaW5nLWxlZnQ6MTZweDtwYWRkaW5nLXJpZ2h0OjMycHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW9wdGlvbnttYXJnaW46MCAxcHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW9wdGlvbi5tYXQtYWN0aXZle2JvcmRlcjpzb2xpZCAxcHggY3VycmVudENvbG9yO21hcmdpbjowfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1vcHRpb25bYXJpYS1kaXNhYmxlZD10cnVlXXtvcGFjaXR5Oi41fS5tYXQtb3B0aW9uLXRleHR7ZGlzcGxheTppbmxpbmUtYmxvY2s7ZmxleC1ncm93OjE7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9Lm1hdC1vcHRpb24gLm1hdC1vcHRpb24tcmlwcGxle3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1hdC1vcHRpb24tcHNldWRvLWNoZWNrYm94e21hcmdpbi1yaWdodDo4cHh9W2Rpcj1ydGxdIC5tYXQtb3B0aW9uLXBzZXVkby1jaGVja2JveHttYXJnaW4tbGVmdDo4cHg7bWFyZ2luLXJpZ2h0OjB9XG4iXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSxCSC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpVZ30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltSSF19XX0se3R5cGU6SUgsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3pIXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChCSCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtYXQtb3B0aW9uIixleHBvcnRBczoibWF0T3B0aW9uIixob3N0Ontyb2xlOiJvcHRpb24iLCJbYXR0ci50YWJpbmRleF0iOiJfZ2V0VGFiSW5kZXgoKSIsIltjbGFzcy5tYXQtc2VsZWN0ZWRdIjoic2VsZWN0ZWQiLCJbY2xhc3MubWF0LW9wdGlvbi1tdWx0aXBsZV0iOiJtdWx0aXBsZSIsIltjbGFzcy5tYXQtYWN0aXZlXSI6ImFjdGl2ZSIsIltpZF0iOiJpZCIsIlthdHRyLmFyaWEtc2VsZWN0ZWRdIjoiX2dldEFyaWFTZWxlY3RlZCgpIiwiW2F0dHIuYXJpYS1kaXNhYmxlZF0iOiJkaXNhYmxlZC50b1N0cmluZygpIiwiW2NsYXNzLm1hdC1vcHRpb24tZGlzYWJsZWRdIjoiZGlzYWJsZWQiLCIoY2xpY2spIjoiX3NlbGVjdFZpYUludGVyYWN0aW9uKCkiLCIoa2V5ZG93bikiOiJfaGFuZGxlS2V5ZG93bigkZXZlbnQpIixjbGFzczoibWF0LW9wdGlvbiBtYXQtZm9jdXMtaW5kaWNhdG9yIn0sdGVtcGxhdGU6JzxtYXQtcHNldWRvLWNoZWNrYm94ICpuZ0lmPSJtdWx0aXBsZSIgY2xhc3M9Im1hdC1vcHRpb24tcHNldWRvLWNoZWNrYm94IlxuICAgIFtzdGF0ZV09InNlbGVjdGVkID8gXCdjaGVja2VkXCcgOiBcJ3VuY2hlY2tlZFwnIiBbZGlzYWJsZWRdPSJkaXNhYmxlZCI+PC9tYXQtcHNldWRvLWNoZWNrYm94PlxuXG48c3BhbiBjbGFzcz0ibWF0LW9wdGlvbi10ZXh0Ij48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9zcGFuPlxuXG5ceDNjIS0tIFNlZSBhMTF5IG5vdGVzIGluc2lkZSBvcHRncm91cC50cyBmb3IgY29udGV4dCBiZWhpbmQgdGhpcyBlbGVtZW50LiAtLVx4M2VcbjxzcGFuIGNsYXNzPSJjZGstdmlzdWFsbHktaGlkZGVuIiAqbmdJZj0iZ3JvdXAgJiYgZ3JvdXAuX2luZXJ0Ij4oe3sgZ3JvdXAubGFiZWwgfX0pPC9zcGFuPlxuXG48ZGl2IGNsYXNzPSJtYXQtb3B0aW9uLXJpcHBsZSIgbWF0LXJpcHBsZVxuICAgICBbbWF0UmlwcGxlVHJpZ2dlcl09Il9nZXRIb3N0RWxlbWVudCgpIlxuICAgICBbbWF0UmlwcGxlRGlzYWJsZWRdPSJkaXNhYmxlZCB8fCBkaXNhYmxlUmlwcGxlIj5cbjwvZGl2PlxuJyxlbmNhcHN1bGF0aW9uOkhuLk5vbmUsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaCxzdHlsZXM6WyIubWF0LW9wdGlvbnt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztsaW5lLWhlaWdodDo0OHB4O2hlaWdodDo0OHB4O3BhZGRpbmc6MCAxNnB4O3RleHQtYWxpZ246bGVmdDt0ZXh0LWRlY29yYXRpb246bm9uZTttYXgtd2lkdGg6MTAwJTtwb3NpdGlvbjpyZWxhdGl2ZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdzttYXgtd2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7YWxpZ24taXRlbXM6Y2VudGVyOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LW9wdGlvbltkaXNhYmxlZF17Y3Vyc29yOmRlZmF1bHR9W2Rpcj1ydGxdIC5tYXQtb3B0aW9ue3RleHQtYWxpZ246cmlnaHR9Lm1hdC1vcHRpb24gLm1hdC1pY29ue21hcmdpbi1yaWdodDoxNnB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0ubWF0LW9wdGlvbiAubWF0LWljb24gc3Zne3ZlcnRpY2FsLWFsaWduOnRvcH1bZGlyPXJ0bF0gLm1hdC1vcHRpb24gLm1hdC1pY29ue21hcmdpbi1sZWZ0OjE2cHg7bWFyZ2luLXJpZ2h0OjB9Lm1hdC1vcHRpb25bYXJpYS1kaXNhYmxlZD10cnVlXXstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7Y3Vyc29yOmRlZmF1bHR9Lm1hdC1vcHRncm91cCAubWF0LW9wdGlvbjpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpe3BhZGRpbmctbGVmdDozMnB4fVtkaXI9cnRsXSAubWF0LW9wdGdyb3VwIC5tYXQtb3B0aW9uOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7cGFkZGluZy1sZWZ0OjE2cHg7cGFkZGluZy1yaWdodDozMnB4fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1vcHRpb257bWFyZ2luOjAgMXB4fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1vcHRpb24ubWF0LWFjdGl2ZXtib3JkZXI6c29saWQgMXB4IGN1cnJlbnRDb2xvcjttYXJnaW46MH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtb3B0aW9uW2FyaWEtZGlzYWJsZWQ9dHJ1ZV17b3BhY2l0eTouNX0ubWF0LW9wdGlvbi10ZXh0e2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZsZXgtZ3JvdzoxO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzfS5tYXQtb3B0aW9uIC5tYXQtb3B0aW9uLXJpcHBsZXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lfS5tYXQtb3B0aW9uLXBzZXVkby1jaGVja2JveHttYXJnaW4tcmlnaHQ6OHB4fVtkaXI9cnRsXSAubWF0LW9wdGlvbi1wc2V1ZG8tY2hlY2tib3h7bWFyZ2luLWxlZnQ6OHB4O21hcmdpbi1yaWdodDowfVxuIl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6VWd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbUkhdfV19LHt0eXBlOklILGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOlt6SF19XX1dfSksbnVsbCk7Y2xhc3MgVUh7fVVILsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxVSCl9LFVILsm1bW9kPWFvKHt0eXBlOlVIfSksVUguybVpbmo9dm4oe2ltcG9ydHM6W1tTSCxXTSxYSSxFSF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChVSCxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W1NILFdNLFhJLEVIXSxleHBvcnRzOltCSCxJSF0sZGVjbGFyYXRpb25zOltCSCxJSF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhVSCx7ZGVjbGFyYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuW0JILElIXX0saW1wb3J0czpmdW5jdGlvbigpe3JldHVybltTSCxXTSxYSSxFSF19LGV4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bQkgsSUhdfX0pO2NvbnN0IEdIPVsibWF0LWJ1dHRvbiIsIiJdLFdIPVsiKiJdLFlIPSIubWF0LWJ1dHRvbiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5OjB9Lm1hdC1idXR0b246aG92ZXI6bm90KC5tYXQtYnV0dG9uLWRpc2FibGVkKSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b246aG92ZXI6bm90KC5tYXQtYnV0dG9uLWRpc2FibGVkKSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjA0fUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1idXR0b246aG92ZXI6bm90KC5tYXQtYnV0dG9uLWRpc2FibGVkKSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b246aG92ZXI6bm90KC5tYXQtYnV0dG9uLWRpc2FibGVkKSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6MH19Lm1hdC1idXR0b24sLm1hdC1pY29uLWJ1dHRvbiwubWF0LXN0cm9rZWQtYnV0dG9uLC5tYXQtZmxhdC1idXR0b257Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MDttaW4td2lkdGg6NjRweDtsaW5lLWhlaWdodDozNnB4O3BhZGRpbmc6MCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O292ZXJmbG93OnZpc2libGV9Lm1hdC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1pY29uLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LXN0cm9rZWQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtZmxhdC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWljb24tYnV0dG9uLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtZmxhdC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdH0ubWF0LWJ1dHRvbi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b24uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtZmxhdC1idXR0b24uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWZsYXQtYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4xMn0ubWF0LWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LWljb24tYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtc3Ryb2tlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1mbGF0LWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LXJhaXNlZC1idXR0b257Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MDttaW4td2lkdGg6NjRweDtsaW5lLWhlaWdodDozNnB4O3BhZGRpbmc6MCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O292ZXJmbG93OnZpc2libGU7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApO3RyYW5zaXRpb246YmFja2dyb3VuZCA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxib3gtc2hhZG93IDI4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSl9Lm1hdC1yYWlzZWQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5tYXQtcmFpc2VkLWJ1dHRvbi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtcmFpc2VkLWJ1dHRvbi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTouMTJ9Lm1hdC1yYWlzZWQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtcmFpc2VkLWJ1dHRvbnt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC1zdHJva2VkLWJ1dHRvbntib3JkZXI6MXB4IHNvbGlkIGN1cnJlbnRDb2xvcjtwYWRkaW5nOjAgMTVweDtsaW5lLWhlaWdodDozNHB4fS5tYXQtc3Ryb2tlZC1idXR0b24gLm1hdC1idXR0b24tcmlwcGxlLm1hdC1yaXBwbGUsLm1hdC1zdHJva2VkLWJ1dHRvbiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e3RvcDotMXB4O2xlZnQ6LTFweDtyaWdodDotMXB4O2JvdHRvbTotMXB4fS5tYXQtZmFie2JveC1zaXppbmc6Ym9yZGVyLWJveDtwb3NpdGlvbjpyZWxhdGl2ZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7Y3Vyc29yOnBvaW50ZXI7b3V0bGluZTpub25lO2JvcmRlcjpub25lOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDtkaXNwbGF5OmlubGluZS1ibG9jazt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7dGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luOjA7bWluLXdpZHRoOjY0cHg7bGluZS1oZWlnaHQ6MzZweDtwYWRkaW5nOjAgMTZweDtib3JkZXItcmFkaXVzOjRweDtvdmVyZmxvdzp2aXNpYmxlO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLCAwLCAwKTt0cmFuc2l0aW9uOmJhY2tncm91bmQgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYm94LXNoYWRvdyAyODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO21pbi13aWR0aDowO2JvcmRlci1yYWRpdXM6NTAlO3dpZHRoOjU2cHg7aGVpZ2h0OjU2cHg7cGFkZGluZzowO2ZsZXgtc2hyaW5rOjB9Lm1hdC1mYWI6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1mYWIubWF0LWJ1dHRvbi1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdH0ubWF0LWZhYi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtZmFiLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4xMn0ubWF0LWZhYjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LWZhYnt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC1mYWIgLm1hdC1idXR0b24td3JhcHBlcntwYWRkaW5nOjE2cHggMDtkaXNwbGF5OmlubGluZS1ibG9jaztsaW5lLWhlaWdodDoyNHB4fS5tYXQtbWluaS1mYWJ7Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MDttaW4td2lkdGg6NjRweDtsaW5lLWhlaWdodDozNnB4O3BhZGRpbmc6MCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O292ZXJmbG93OnZpc2libGU7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApO3RyYW5zaXRpb246YmFja2dyb3VuZCA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxib3gtc2hhZG93IDI4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7bWluLXdpZHRoOjA7Ym9yZGVyLXJhZGl1czo1MCU7d2lkdGg6NDBweDtoZWlnaHQ6NDBweDtwYWRkaW5nOjA7ZmxleC1zaHJpbms6MH0ubWF0LW1pbmktZmFiOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtbWluaS1mYWIubWF0LWJ1dHRvbi1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdH0ubWF0LW1pbmktZmFiLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1taW5pLWZhYi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTouMTJ9Lm1hdC1taW5pLWZhYjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LW1pbmktZmFie3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LW1pbmktZmFiIC5tYXQtYnV0dG9uLXdyYXBwZXJ7cGFkZGluZzo4cHggMDtkaXNwbGF5OmlubGluZS1ibG9jaztsaW5lLWhlaWdodDoyNHB4fS5tYXQtaWNvbi1idXR0b257cGFkZGluZzowO21pbi13aWR0aDowO3dpZHRoOjQwcHg7aGVpZ2h0OjQwcHg7ZmxleC1zaHJpbms6MDtsaW5lLWhlaWdodDo0MHB4O2JvcmRlci1yYWRpdXM6NTAlfS5tYXQtaWNvbi1idXR0b24gaSwubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbntsaW5lLWhlaWdodDoyNHB4fS5tYXQtYnV0dG9uLXJpcHBsZS5tYXQtcmlwcGxlLC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6bm9uZTtib3JkZXItcmFkaXVzOmluaGVyaXR9Lm1hdC1idXR0b24tcmlwcGxlLm1hdC1yaXBwbGU6bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5OjA7dHJhbnNpdGlvbjpvcGFjaXR5IDIwMG1zIGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKSxiYWNrZ3JvdW5kLWNvbG9yIDIwMG1zIGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1idXR0b24tcmlwcGxlLXJvdW5ke2JvcmRlci1yYWRpdXM6NTAlO3otaW5kZXg6MX0ubWF0LWJ1dHRvbiAubWF0LWJ1dHRvbi13cmFwcGVyPiosLm1hdC1mbGF0LWJ1dHRvbiAubWF0LWJ1dHRvbi13cmFwcGVyPiosLm1hdC1zdHJva2VkLWJ1dHRvbiAubWF0LWJ1dHRvbi13cmFwcGVyPiosLm1hdC1yYWlzZWQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LWljb24tYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LWZhYiAubWF0LWJ1dHRvbi13cmFwcGVyPiosLm1hdC1taW5pLWZhYiAubWF0LWJ1dHRvbi13cmFwcGVyPip7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtZm9ybS1maWVsZDpub3QoLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5KSAubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbi1idXR0b24sLm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbntkaXNwbGF5OmlubGluZS1mbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO2ZvbnQtc2l6ZTppbmhlcml0O3dpZHRoOjIuNWVtO2hlaWdodDoyLjVlbX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mbGF0LWJ1dHRvbiwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtcmFpc2VkLWJ1dHRvbiwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtaWNvbi1idXR0b24sLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZhYiwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtbWluaS1mYWJ7b3V0bGluZTpzb2xpZCAxcHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJ1dHRvbi1iYXNlLmNkay1rZXlib2FyZC1mb2N1c2VkLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24tYmFzZS5jZGstcHJvZ3JhbS1mb2N1c2Vke291dGxpbmU6c29saWQgM3B4fVxuIixxSD1bIm1hdC1idXR0b24iLCJtYXQtZmxhdC1idXR0b24iLCJtYXQtaWNvbi1idXR0b24iLCJtYXQtcmFpc2VkLWJ1dHRvbiIsIm1hdC1zdHJva2VkLWJ1dHRvbiIsIm1hdC1taW5pLWZhYiIsIm1hdC1mYWIiXSxaSD1KSShLSShRSShjbGFzc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl9lbGVtZW50UmVmPXR9fSkpKTtjbGFzcyBYSCBleHRlbmRzIFpIe2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcih0KSx0aGlzLl9mb2N1c01vbml0b3I9ZSx0aGlzLl9hbmltYXRpb25Nb2RlPW4sdGhpcy5pc1JvdW5kQnV0dG9uPXRoaXMuX2hhc0hvc3RBdHRyaWJ1dGVzKCJtYXQtZmFiIiwibWF0LW1pbmktZmFiIiksdGhpcy5pc0ljb25CdXR0b249dGhpcy5faGFzSG9zdEF0dHJpYnV0ZXMoIm1hdC1pY29uLWJ1dHRvbiIpO2Zvcihjb25zdCB0IG9mIHFIKXRoaXMuX2hhc0hvc3RBdHRyaWJ1dGVzKHQpJiZ0aGlzLl9nZXRIb3N0RWxlbWVudCgpLmNsYXNzTGlzdC5hZGQodCk7dC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoIm1hdC1idXR0b24tYmFzZSIpLHRoaXMuaXNSb3VuZEJ1dHRvbiYmKHRoaXMuY29sb3I9ImFjY2VudCIpfW5nQWZ0ZXJWaWV3SW5pdCgpe3RoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHRoaXMuX2VsZW1lbnRSZWYsITApfW5nT25EZXN0cm95KCl7dGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKHRoaXMuX2VsZW1lbnRSZWYpfWZvY3VzKHQsZSl7dD90aGlzLl9mb2N1c01vbml0b3IuZm9jdXNWaWEodGhpcy5fZ2V0SG9zdEVsZW1lbnQoKSx0LGUpOnRoaXMuX2dldEhvc3RFbGVtZW50KCkuZm9jdXMoZSl9X2dldEhvc3RFbGVtZW50KCl7cmV0dXJuIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudH1faXNSaXBwbGVEaXNhYmxlZCgpe3JldHVybiB0aGlzLmRpc2FibGVSaXBwbGV8fHRoaXMuZGlzYWJsZWR9X2hhc0hvc3RBdHRyaWJ1dGVzKC4uLnQpe3JldHVybiB0LnNvbWUoKHQ9PnRoaXMuX2dldEhvc3RFbGVtZW50KCkuaGFzQXR0cmlidXRlKHQpKSl9fVhILsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxYSCkoU20oaGcpLFNtKFNJKSxTbShWUCw4KSl9LFhILsm1Y21wPXRvKHt0eXBlOlhILHNlbGVjdG9yczpbWyJidXR0b24iLCJtYXQtYnV0dG9uIiwiIl0sWyJidXR0b24iLCJtYXQtcmFpc2VkLWJ1dHRvbiIsIiJdLFsiYnV0dG9uIiwibWF0LWljb24tYnV0dG9uIiwiIl0sWyJidXR0b24iLCJtYXQtZmFiIiwiIl0sWyJidXR0b24iLCJtYXQtbWluaS1mYWIiLCIiXSxbImJ1dHRvbiIsIm1hdC1zdHJva2VkLWJ1dHRvbiIsIiJdLFsiYnV0dG9uIiwibWF0LWZsYXQtYnV0dG9uIiwiIl1dLHZpZXdRdWVyeTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiZRaChrSCw1KSwyJmUpe2xldCB0O0poKHQ9dGIoKSkmJihuLnJpcHBsZT10LmZpcnN0KX19LGhvc3RBdHRyczpbMSwibWF0LWZvY3VzLWluZGljYXRvciJdLGhvc3RWYXJzOjUsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJihqcCgiZGlzYWJsZWQiLG4uZGlzYWJsZWR8fG51bGwpLHB1KCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsIk5vb3BBbmltYXRpb25zIj09PW4uX2FuaW1hdGlvbk1vZGUpKCJtYXQtYnV0dG9uLWRpc2FibGVkIixuLmRpc2FibGVkKSl9LGlucHV0czp7ZGlzYWJsZWQ6ImRpc2FibGVkIixkaXNhYmxlUmlwcGxlOiJkaXNhYmxlUmlwcGxlIixjb2xvcjoiY29sb3IifSxleHBvcnRBczpbIm1hdEJ1dHRvbiJdLGZlYXR1cmVzOlt4cF0sYXR0cnM6R0gsbmdDb250ZW50U2VsZWN0b3JzOldILGRlY2xzOjQsdmFyczo1LGNvbnN0czpbWzEsIm1hdC1idXR0b24td3JhcHBlciJdLFsibWF0UmlwcGxlIiwiIiwxLCJtYXQtYnV0dG9uLXJpcHBsZSIsMywibWF0UmlwcGxlRGlzYWJsZWQiLCJtYXRSaXBwbGVDZW50ZXJlZCIsIm1hdFJpcHBsZVRyaWdnZXIiXSxbMSwibWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5Il1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabSgpLFJtKDAsInNwYW4iLDApLFhtKDEpLEFtKCksVG0oMiwic3BhbiIsMSksVG0oMywic3BhbiIsMikpLDImZSYmKHJjKDIpLHB1KCJtYXQtYnV0dG9uLXJpcHBsZS1yb3VuZCIsbi5pc1JvdW5kQnV0dG9ufHxuLmlzSWNvbkJ1dHRvbiksRG0oIm1hdFJpcHBsZURpc2FibGVkIixuLl9pc1JpcHBsZURpc2FibGVkKCkpKCJtYXRSaXBwbGVDZW50ZXJlZCIsbi5pc0ljb25CdXR0b24pKCJtYXRSaXBwbGVUcmlnZ2VyIixuLl9nZXRIb3N0RWxlbWVudCgpKSl9LGRpcmVjdGl2ZXM6W2tIXSxzdHlsZXM6W1lIXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSxYSC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpTSX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dLFhILnByb3BEZWNvcmF0b3JzPXtyaXBwbGU6W3t0eXBlOlphLGFyZ3M6W2tIXX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFhILFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImJ1dHRvblttYXQtYnV0dG9uXSwgYnV0dG9uW21hdC1yYWlzZWQtYnV0dG9uXSwgYnV0dG9uW21hdC1pY29uLWJ1dHRvbl0sXG4gICAgICAgICAgICAgYnV0dG9uW21hdC1mYWJdLCBidXR0b25bbWF0LW1pbmktZmFiXSwgYnV0dG9uW21hdC1zdHJva2VkLWJ1dHRvbl0sXG4gICAgICAgICAgICAgYnV0dG9uW21hdC1mbGF0LWJ1dHRvbl0iLGV4cG9ydEFzOiJtYXRCdXR0b24iLGhvc3Q6eyJbYXR0ci5kaXNhYmxlZF0iOiJkaXNhYmxlZCB8fCBudWxsIiwiW2NsYXNzLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlXSI6J19hbmltYXRpb25Nb2RlID09PSAiTm9vcEFuaW1hdGlvbnMiJywiW2NsYXNzLm1hdC1idXR0b24tZGlzYWJsZWRdIjoiZGlzYWJsZWQiLGNsYXNzOiJtYXQtZm9jdXMtaW5kaWNhdG9yIn0sdGVtcGxhdGU6JzxzcGFuIGNsYXNzPSJtYXQtYnV0dG9uLXdyYXBwZXIiPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L3NwYW4+XG48c3BhbiBtYXRSaXBwbGUgY2xhc3M9Im1hdC1idXR0b24tcmlwcGxlIlxuICAgICAgW2NsYXNzLm1hdC1idXR0b24tcmlwcGxlLXJvdW5kXT0iaXNSb3VuZEJ1dHRvbiB8fCBpc0ljb25CdXR0b24iXG4gICAgICBbbWF0UmlwcGxlRGlzYWJsZWRdPSJfaXNSaXBwbGVEaXNhYmxlZCgpIlxuICAgICAgW21hdFJpcHBsZUNlbnRlcmVkXT0iaXNJY29uQnV0dG9uIlxuICAgICAgW21hdFJpcHBsZVRyaWdnZXJdPSJfZ2V0SG9zdEVsZW1lbnQoKSI+PC9zcGFuPlxuPHNwYW4gY2xhc3M9Im1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSI+PC9zcGFuPlxuJyxpbnB1dHM6WyJkaXNhYmxlZCIsImRpc2FibGVSaXBwbGUiLCJjb2xvciJdLGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLHN0eWxlczpbIi5tYXQtYnV0dG9uIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6MH0ubWF0LWJ1dHRvbjpob3Zlcjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbjpob3Zlcjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTouMDR9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWJ1dHRvbjpob3Zlcjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbjpob3Zlcjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTowfX0ubWF0LWJ1dHRvbiwubWF0LWljb24tYnV0dG9uLC5tYXQtc3Ryb2tlZC1idXR0b24sLm1hdC1mbGF0LWJ1dHRvbntib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtib3JkZXI6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjowO21pbi13aWR0aDo2NHB4O2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LWljb24tYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtc3Ryb2tlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1mbGF0LWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtaWNvbi1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5tYXQtYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1idXR0b24uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1mbGF0LWJ1dHRvbi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtZmxhdC1idXR0b24uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjEyfS5tYXQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtaWNvbi1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1zdHJva2VkLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LWZsYXQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtcmFpc2VkLWJ1dHRvbntib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtib3JkZXI6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjowO21pbi13aWR0aDo2NHB4O2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7b3ZlcmZsb3c6dmlzaWJsZTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKX0ubWF0LXJhaXNlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1idXR0b24tZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHR9Lm1hdC1yYWlzZWQtYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1yYWlzZWQtYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4xMn0ubWF0LXJhaXNlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1yYWlzZWQtYnV0dG9ue3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXN0cm9rZWQtYnV0dG9ue2JvcmRlcjoxcHggc29saWQgY3VycmVudENvbG9yO3BhZGRpbmc6MCAxNXB4O2xpbmUtaGVpZ2h0OjM0cHh9Lm1hdC1zdHJva2VkLWJ1dHRvbiAubWF0LWJ1dHRvbi1yaXBwbGUubWF0LXJpcHBsZSwubWF0LXN0cm9rZWQtYnV0dG9uIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7dG9wOi0xcHg7bGVmdDotMXB4O3JpZ2h0Oi0xcHg7Ym90dG9tOi0xcHh9Lm1hdC1mYWJ7Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MDttaW4td2lkdGg6NjRweDtsaW5lLWhlaWdodDozNnB4O3BhZGRpbmc6MCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O292ZXJmbG93OnZpc2libGU7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApO3RyYW5zaXRpb246YmFja2dyb3VuZCA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxib3gtc2hhZG93IDI4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7bWluLXdpZHRoOjA7Ym9yZGVyLXJhZGl1czo1MCU7d2lkdGg6NTZweDtoZWlnaHQ6NTZweDtwYWRkaW5nOjA7ZmxleC1zaHJpbms6MH0ubWF0LWZhYjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LWZhYi5tYXQtYnV0dG9uLWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5tYXQtZmFiLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1mYWIuY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjEyfS5tYXQtZmFiOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtZmFie3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LWZhYiAubWF0LWJ1dHRvbi13cmFwcGVye3BhZGRpbmc6MTZweCAwO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1taW5pLWZhYntib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtib3JkZXI6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjowO21pbi13aWR0aDo2NHB4O2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7b3ZlcmZsb3c6dmlzaWJsZTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTttaW4td2lkdGg6MDtib3JkZXItcmFkaXVzOjUwJTt3aWR0aDo0MHB4O2hlaWdodDo0MHB4O3BhZGRpbmc6MDtmbGV4LXNocmluazowfS5tYXQtbWluaS1mYWI6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1taW5pLWZhYi5tYXQtYnV0dG9uLWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5tYXQtbWluaS1mYWIuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LW1pbmktZmFiLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4xMn0ubWF0LW1pbmktZmFiOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtbWluaS1mYWJ7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtbWluaS1mYWIgLm1hdC1idXR0b24td3JhcHBlcntwYWRkaW5nOjhweCAwO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1pY29uLWJ1dHRvbntwYWRkaW5nOjA7bWluLXdpZHRoOjA7d2lkdGg6NDBweDtoZWlnaHQ6NDBweDtmbGV4LXNocmluazowO2xpbmUtaGVpZ2h0OjQwcHg7Ym9yZGVyLXJhZGl1czo1MCV9Lm1hdC1pY29uLWJ1dHRvbiBpLC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29ue2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1idXR0b24tcmlwcGxlLm1hdC1yaXBwbGUsLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlci1yYWRpdXM6aW5oZXJpdH0ubWF0LWJ1dHRvbi1yaXBwbGUubWF0LXJpcHBsZTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgMjAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpLGJhY2tncm91bmQtY29sb3IgMjAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e3RyYW5zaXRpb246bm9uZX0ubWF0LWJ1dHRvbi1yaXBwbGUtcm91bmR7Ym9yZGVyLXJhZGl1czo1MCU7ei1pbmRleDoxfS5tYXQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LWZsYXQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LXN0cm9rZWQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LXJhaXNlZC1idXR0b24gLm1hdC1idXR0b24td3JhcHBlcj4qLC5tYXQtaWNvbi1idXR0b24gLm1hdC1idXR0b24td3JhcHBlcj4qLC5tYXQtZmFiIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LW1pbmktZmFiIC5tYXQtYnV0dG9uLXdyYXBwZXI+Knt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Lm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiwubWF0LWZvcm0tZmllbGQ6bm90KC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSkgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb24tYnV0dG9ue2Rpc3BsYXk6aW5saW5lLWZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7Zm9udC1zaXplOmluaGVyaXQ7d2lkdGg6Mi41ZW07aGVpZ2h0OjIuNWVtfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24sLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZsYXQtYnV0dG9uLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1yYWlzZWQtYnV0dG9uLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1pY29uLWJ1dHRvbiwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZmFiLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1taW5pLWZhYntvdXRsaW5lOnNvbGlkIDFweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLWJhc2UuY2RrLWtleWJvYXJkLWZvY3VzZWQsLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJ1dHRvbi1iYXNlLmNkay1wcm9ncmFtLWZvY3VzZWR7b3V0bGluZTpzb2xpZCAzcHh9XG4iXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTpTSX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dfSkse3JpcHBsZTpbe3R5cGU6WmEsYXJnczpba0hdfV19KTtjbGFzcyBLSCBleHRlbmRzIFhIe2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihlLHQsbil9X2hhbHREaXNhYmxlZEV2ZW50cyh0KXt0aGlzLmRpc2FibGVkJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkpfX1LSC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8S0gpKFNtKFNJKSxTbShoZyksU20oVlAsOCkpfSxLSC7JtWNtcD10byh7dHlwZTpLSCxzZWxlY3RvcnM6W1siYSIsIm1hdC1idXR0b24iLCIiXSxbImEiLCJtYXQtcmFpc2VkLWJ1dHRvbiIsIiJdLFsiYSIsIm1hdC1pY29uLWJ1dHRvbiIsIiJdLFsiYSIsIm1hdC1mYWIiLCIiXSxbImEiLCJtYXQtbWluaS1mYWIiLCIiXSxbImEiLCJtYXQtc3Ryb2tlZC1idXR0b24iLCIiXSxbImEiLCJtYXQtZmxhdC1idXR0b24iLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtZm9jdXMtaW5kaWNhdG9yIl0saG9zdFZhcnM6Nyxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezEmZSYmVm0oImNsaWNrIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5faGFsdERpc2FibGVkRXZlbnRzKGUpfSkpLDImZSYmKGpwKCJ0YWJpbmRleCIsbi5kaXNhYmxlZD8tMTpuLnRhYkluZGV4fHwwKSgiZGlzYWJsZWQiLG4uZGlzYWJsZWR8fG51bGwpKCJhcmlhLWRpc2FibGVkIixuLmRpc2FibGVkLnRvU3RyaW5nKCkpLHB1KCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsIk5vb3BBbmltYXRpb25zIj09PW4uX2FuaW1hdGlvbk1vZGUpKCJtYXQtYnV0dG9uLWRpc2FibGVkIixuLmRpc2FibGVkKSl9LGlucHV0czp7ZGlzYWJsZWQ6ImRpc2FibGVkIixkaXNhYmxlUmlwcGxlOiJkaXNhYmxlUmlwcGxlIixjb2xvcjoiY29sb3IiLHRhYkluZGV4OiJ0YWJJbmRleCJ9LGV4cG9ydEFzOlsibWF0QnV0dG9uIiwibWF0QW5jaG9yIl0sZmVhdHVyZXM6W3hwXSxhdHRyczpHSCxuZ0NvbnRlbnRTZWxlY3RvcnM6V0gsZGVjbHM6NCx2YXJzOjUsY29uc3RzOltbMSwibWF0LWJ1dHRvbi13cmFwcGVyIl0sWyJtYXRSaXBwbGUiLCIiLDEsIm1hdC1idXR0b24tcmlwcGxlIiwzLCJtYXRSaXBwbGVEaXNhYmxlZCIsIm1hdFJpcHBsZUNlbnRlcmVkIiwibWF0UmlwcGxlVHJpZ2dlciJdLFsxLCJtYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXkiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFptKCksUm0oMCwic3BhbiIsMCksWG0oMSksQW0oKSxUbSgyLCJzcGFuIiwxKSxUbSgzLCJzcGFuIiwyKSksMiZlJiYocmMoMikscHUoIm1hdC1idXR0b24tcmlwcGxlLXJvdW5kIixuLmlzUm91bmRCdXR0b258fG4uaXNJY29uQnV0dG9uKSxEbSgibWF0UmlwcGxlRGlzYWJsZWQiLG4uX2lzUmlwcGxlRGlzYWJsZWQoKSkoIm1hdFJpcHBsZUNlbnRlcmVkIixuLmlzSWNvbkJ1dHRvbikoIm1hdFJpcHBsZVRyaWdnZXIiLG4uX2dldEhvc3RFbGVtZW50KCkpKX0sZGlyZWN0aXZlczpba0hdLHN0eWxlczpbWUhdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLEtILmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6U0l9LHt0eXBlOmhnfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV0sS0gucHJvcERlY29yYXRvcnM9e3RhYkluZGV4Olt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEtILFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImFbbWF0LWJ1dHRvbl0sIGFbbWF0LXJhaXNlZC1idXR0b25dLCBhW21hdC1pY29uLWJ1dHRvbl0sIGFbbWF0LWZhYl0sXG4gICAgICAgICAgICAgYVttYXQtbWluaS1mYWJdLCBhW21hdC1zdHJva2VkLWJ1dHRvbl0sIGFbbWF0LWZsYXQtYnV0dG9uXSIsZXhwb3J0QXM6Im1hdEJ1dHRvbiwgbWF0QW5jaG9yIixob3N0OnsiW2F0dHIudGFiaW5kZXhdIjoiZGlzYWJsZWQgPyAtMSA6ICh0YWJJbmRleCB8fCAwKSIsIlthdHRyLmRpc2FibGVkXSI6ImRpc2FibGVkIHx8IG51bGwiLCJbYXR0ci5hcmlhLWRpc2FibGVkXSI6ImRpc2FibGVkLnRvU3RyaW5nKCkiLCIoY2xpY2spIjoiX2hhbHREaXNhYmxlZEV2ZW50cygkZXZlbnQpIiwiW2NsYXNzLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlXSI6J19hbmltYXRpb25Nb2RlID09PSAiTm9vcEFuaW1hdGlvbnMiJywiW2NsYXNzLm1hdC1idXR0b24tZGlzYWJsZWRdIjoiZGlzYWJsZWQiLGNsYXNzOiJtYXQtZm9jdXMtaW5kaWNhdG9yIn0saW5wdXRzOlsiZGlzYWJsZWQiLCJkaXNhYmxlUmlwcGxlIiwiY29sb3IiXSx0ZW1wbGF0ZTonPHNwYW4gY2xhc3M9Im1hdC1idXR0b24td3JhcHBlciI+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50Pjwvc3Bhbj5cbjxzcGFuIG1hdFJpcHBsZSBjbGFzcz0ibWF0LWJ1dHRvbi1yaXBwbGUiXG4gICAgICBbY2xhc3MubWF0LWJ1dHRvbi1yaXBwbGUtcm91bmRdPSJpc1JvdW5kQnV0dG9uIHx8IGlzSWNvbkJ1dHRvbiJcbiAgICAgIFttYXRSaXBwbGVEaXNhYmxlZF09Il9pc1JpcHBsZURpc2FibGVkKCkiXG4gICAgICBbbWF0UmlwcGxlQ2VudGVyZWRdPSJpc0ljb25CdXR0b24iXG4gICAgICBbbWF0UmlwcGxlVHJpZ2dlcl09Il9nZXRIb3N0RWxlbWVudCgpIj48L3NwYW4+XG48c3BhbiBjbGFzcz0ibWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5Ij48L3NwYW4+XG4nLGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLHN0eWxlczpbIi5tYXQtYnV0dG9uIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6MH0ubWF0LWJ1dHRvbjpob3Zlcjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbjpob3Zlcjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTouMDR9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWJ1dHRvbjpob3Zlcjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbjpob3Zlcjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTowfX0ubWF0LWJ1dHRvbiwubWF0LWljb24tYnV0dG9uLC5tYXQtc3Ryb2tlZC1idXR0b24sLm1hdC1mbGF0LWJ1dHRvbntib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtib3JkZXI6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjowO21pbi13aWR0aDo2NHB4O2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LWljb24tYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtc3Ryb2tlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1mbGF0LWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtaWNvbi1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5tYXQtYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1idXR0b24uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1mbGF0LWJ1dHRvbi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtZmxhdC1idXR0b24uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjEyfS5tYXQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtaWNvbi1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1zdHJva2VkLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LWZsYXQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtcmFpc2VkLWJ1dHRvbntib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtib3JkZXI6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjowO21pbi13aWR0aDo2NHB4O2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7b3ZlcmZsb3c6dmlzaWJsZTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKX0ubWF0LXJhaXNlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1idXR0b24tZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHR9Lm1hdC1yYWlzZWQtYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1yYWlzZWQtYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4xMn0ubWF0LXJhaXNlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1yYWlzZWQtYnV0dG9ue3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXN0cm9rZWQtYnV0dG9ue2JvcmRlcjoxcHggc29saWQgY3VycmVudENvbG9yO3BhZGRpbmc6MCAxNXB4O2xpbmUtaGVpZ2h0OjM0cHh9Lm1hdC1zdHJva2VkLWJ1dHRvbiAubWF0LWJ1dHRvbi1yaXBwbGUubWF0LXJpcHBsZSwubWF0LXN0cm9rZWQtYnV0dG9uIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7dG9wOi0xcHg7bGVmdDotMXB4O3JpZ2h0Oi0xcHg7Ym90dG9tOi0xcHh9Lm1hdC1mYWJ7Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MDttaW4td2lkdGg6NjRweDtsaW5lLWhlaWdodDozNnB4O3BhZGRpbmc6MCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O292ZXJmbG93OnZpc2libGU7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApO3RyYW5zaXRpb246YmFja2dyb3VuZCA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxib3gtc2hhZG93IDI4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7bWluLXdpZHRoOjA7Ym9yZGVyLXJhZGl1czo1MCU7d2lkdGg6NTZweDtoZWlnaHQ6NTZweDtwYWRkaW5nOjA7ZmxleC1zaHJpbms6MH0ubWF0LWZhYjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LWZhYi5tYXQtYnV0dG9uLWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5tYXQtZmFiLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1mYWIuY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjEyfS5tYXQtZmFiOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtZmFie3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LWZhYiAubWF0LWJ1dHRvbi13cmFwcGVye3BhZGRpbmc6MTZweCAwO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1taW5pLWZhYntib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtib3JkZXI6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjowO21pbi13aWR0aDo2NHB4O2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7b3ZlcmZsb3c6dmlzaWJsZTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTttaW4td2lkdGg6MDtib3JkZXItcmFkaXVzOjUwJTt3aWR0aDo0MHB4O2hlaWdodDo0MHB4O3BhZGRpbmc6MDtmbGV4LXNocmluazowfS5tYXQtbWluaS1mYWI6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1taW5pLWZhYi5tYXQtYnV0dG9uLWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5tYXQtbWluaS1mYWIuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LW1pbmktZmFiLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4xMn0ubWF0LW1pbmktZmFiOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtbWluaS1mYWJ7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtbWluaS1mYWIgLm1hdC1idXR0b24td3JhcHBlcntwYWRkaW5nOjhweCAwO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1pY29uLWJ1dHRvbntwYWRkaW5nOjA7bWluLXdpZHRoOjA7d2lkdGg6NDBweDtoZWlnaHQ6NDBweDtmbGV4LXNocmluazowO2xpbmUtaGVpZ2h0OjQwcHg7Ym9yZGVyLXJhZGl1czo1MCV9Lm1hdC1pY29uLWJ1dHRvbiBpLC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29ue2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1idXR0b24tcmlwcGxlLm1hdC1yaXBwbGUsLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlci1yYWRpdXM6aW5oZXJpdH0ubWF0LWJ1dHRvbi1yaXBwbGUubWF0LXJpcHBsZTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgMjAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpLGJhY2tncm91bmQtY29sb3IgMjAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e3RyYW5zaXRpb246bm9uZX0ubWF0LWJ1dHRvbi1yaXBwbGUtcm91bmR7Ym9yZGVyLXJhZGl1czo1MCU7ei1pbmRleDoxfS5tYXQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LWZsYXQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LXN0cm9rZWQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LXJhaXNlZC1idXR0b24gLm1hdC1idXR0b24td3JhcHBlcj4qLC5tYXQtaWNvbi1idXR0b24gLm1hdC1idXR0b24td3JhcHBlcj4qLC5tYXQtZmFiIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LW1pbmktZmFiIC5tYXQtYnV0dG9uLXdyYXBwZXI+Knt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Lm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiwubWF0LWZvcm0tZmllbGQ6bm90KC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSkgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb24tYnV0dG9ue2Rpc3BsYXk6aW5saW5lLWZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7Zm9udC1zaXplOmluaGVyaXQ7d2lkdGg6Mi41ZW07aGVpZ2h0OjIuNWVtfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24sLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZsYXQtYnV0dG9uLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1yYWlzZWQtYnV0dG9uLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1pY29uLWJ1dHRvbiwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZmFiLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1taW5pLWZhYntvdXRsaW5lOnNvbGlkIDFweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLWJhc2UuY2RrLWtleWJvYXJkLWZvY3VzZWQsLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJ1dHRvbi1iYXNlLmNkay1wcm9ncmFtLWZvY3VzZWR7b3V0bGluZTpzb2xpZCAzcHh9XG4iXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlNJfSx7dHlwZTpoZ30se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dfSkse3RhYkluZGV4Olt7dHlwZTp4eX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBKSHt9SkguybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEpIKX0sSkguybVtb2Q9YW8oe3R5cGU6Skh9KSxKSC7JtWluaj12bih7aW1wb3J0czpbW1NILFhJXSxYSV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEpILFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbU0gsWEldLGV4cG9ydHM6W1hILEtILFhJXSxkZWNsYXJhdGlvbnM6W1hILEtIXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKEpILHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bWEgsS0hdfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1NILFhJXX0sZXhwb3J0czpmdW5jdGlvbigpe3JldHVybltYSCxLSCxYSV19fSk7Y2xhc3MgUUh7fWZ1bmN0aW9uICRIKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5jb25uZWN0fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyB0RiBleHRlbmRzIFFIe2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5fZGF0YT10fWNvbm5lY3QoKXtyZXR1cm4gTnQodGhpcy5fZGF0YSk/dGhpcy5fZGF0YTpFdCh0aGlzLl9kYXRhKX1kaXNjb25uZWN0KCl7fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIGVGe2FwcGx5Q2hhbmdlcyh0LGUsbixvLGkpe3QuZm9yRWFjaE9wZXJhdGlvbigoKHQsbyxhKT0+e2xldCByLHM7aWYobnVsbD09dC5wcmV2aW91c0luZGV4KXtjb25zdCBpPW4odCxvLGEpO3I9ZS5jcmVhdGVFbWJlZGRlZFZpZXcoaS50ZW1wbGF0ZVJlZixpLmNvbnRleHQsaS5pbmRleCkscz0xfWVsc2UgbnVsbD09YT8oZS5yZW1vdmUobykscz0zKToocj1lLmdldChvKSxlLm1vdmUocixhKSxzPTIpO2kmJmkoe2NvbnRleHQ6bnVsbD09cj92b2lkIDA6ci5jb250ZXh0LG9wZXJhdGlvbjpzLHJlY29yZDp0fSl9KSl9ZGV0YWNoKCl7fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgbkZ7Y29uc3RydWN0b3IoKXt0aGlzLnZpZXdDYWNoZVNpemU9MjAsdGhpcy5fdmlld0NhY2hlPVtdfWFwcGx5Q2hhbmdlcyh0LGUsbixvLGkpe3QuZm9yRWFjaE9wZXJhdGlvbigoKHQsYSxyKT0+e2xldCBzLGw7bnVsbD09dC5wcmV2aW91c0luZGV4PyhzPXRoaXMuX2luc2VydFZpZXcoKCgpPT5uKHQsYSxyKSkscixlLG8odCkpLGw9cz8xOjApOm51bGw9PXI/KHRoaXMuX2RldGFjaEFuZENhY2hlVmlldyhhLGUpLGw9Myk6KHM9dGhpcy5fbW92ZVZpZXcoYSxyLGUsbyh0KSksbD0yKSxpJiZpKHtjb250ZXh0Om51bGw9PXM/dm9pZCAwOnMuY29udGV4dCxvcGVyYXRpb246bCxyZWNvcmQ6dH0pfSkpfWRldGFjaCgpe2Zvcihjb25zdCB0IG9mIHRoaXMuX3ZpZXdDYWNoZSl0LmRlc3Ryb3koKTt0aGlzLl92aWV3Q2FjaGU9W119X2luc2VydFZpZXcodCxlLG4sbyl7Y29uc3QgaT10aGlzLl9pbnNlcnRWaWV3RnJvbUNhY2hlKGUsbik7aWYoaSlyZXR1cm4gdm9pZChpLmNvbnRleHQuJGltcGxpY2l0PW8pO2NvbnN0IGE9dCgpO3JldHVybiBuLmNyZWF0ZUVtYmVkZGVkVmlldyhhLnRlbXBsYXRlUmVmLGEuY29udGV4dCxhLmluZGV4KX1fZGV0YWNoQW5kQ2FjaGVWaWV3KHQsZSl7Y29uc3Qgbj1lLmRldGFjaCh0KTt0aGlzLl9tYXliZUNhY2hlVmlldyhuLGUpfV9tb3ZlVmlldyh0LGUsbixvKXtjb25zdCBpPW4uZ2V0KHQpO3JldHVybiBuLm1vdmUoaSxlKSxpLmNvbnRleHQuJGltcGxpY2l0PW8saX1fbWF5YmVDYWNoZVZpZXcodCxlKXtpZih0aGlzLl92aWV3Q2FjaGUubGVuZ3RoPHRoaXMudmlld0NhY2hlU2l6ZSl0aGlzLl92aWV3Q2FjaGUucHVzaCh0KTtlbHNle2NvbnN0IG49ZS5pbmRleE9mKHQpOy0xPT09bj90LmRlc3Ryb3koKTplLnJlbW92ZShuKX19X2luc2VydFZpZXdGcm9tQ2FjaGUodCxlKXtjb25zdCBuPXRoaXMuX3ZpZXdDYWNoZS5wb3AoKTtyZXR1cm4gbiYmZS5pbnNlcnQobix0KSxufHxudWxsfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3Mgb0Z7Y29uc3RydWN0b3IodD0hMSxlLG49ITApe3RoaXMuX211bHRpcGxlPXQsdGhpcy5fZW1pdENoYW5nZXM9bix0aGlzLl9zZWxlY3Rpb249bmV3IFNldCx0aGlzLl9kZXNlbGVjdGVkVG9FbWl0PVtdLHRoaXMuX3NlbGVjdGVkVG9FbWl0PVtdLHRoaXMuY2hhbmdlZD1uZXcgSSxlJiZlLmxlbmd0aCYmKHQ/ZS5mb3JFYWNoKCh0PT50aGlzLl9tYXJrU2VsZWN0ZWQodCkpKTp0aGlzLl9tYXJrU2VsZWN0ZWQoZVswXSksdGhpcy5fc2VsZWN0ZWRUb0VtaXQubGVuZ3RoPTApfWdldCBzZWxlY3RlZCgpe3JldHVybiB0aGlzLl9zZWxlY3RlZHx8KHRoaXMuX3NlbGVjdGVkPUFycmF5LmZyb20odGhpcy5fc2VsZWN0aW9uLnZhbHVlcygpKSksdGhpcy5fc2VsZWN0ZWR9c2VsZWN0KC4uLnQpe3RoaXMuX3ZlcmlmeVZhbHVlQXNzaWdubWVudCh0KSx0LmZvckVhY2goKHQ9PnRoaXMuX21hcmtTZWxlY3RlZCh0KSkpLHRoaXMuX2VtaXRDaGFuZ2VFdmVudCgpfWRlc2VsZWN0KC4uLnQpe3RoaXMuX3ZlcmlmeVZhbHVlQXNzaWdubWVudCh0KSx0LmZvckVhY2goKHQ9PnRoaXMuX3VubWFya1NlbGVjdGVkKHQpKSksdGhpcy5fZW1pdENoYW5nZUV2ZW50KCl9dG9nZ2xlKHQpe3RoaXMuaXNTZWxlY3RlZCh0KT90aGlzLmRlc2VsZWN0KHQpOnRoaXMuc2VsZWN0KHQpfWNsZWFyKCl7dGhpcy5fdW5tYXJrQWxsKCksdGhpcy5fZW1pdENoYW5nZUV2ZW50KCl9aXNTZWxlY3RlZCh0KXtyZXR1cm4gdGhpcy5fc2VsZWN0aW9uLmhhcyh0KX1pc0VtcHR5KCl7cmV0dXJuIDA9PT10aGlzLl9zZWxlY3Rpb24uc2l6ZX1oYXNWYWx1ZSgpe3JldHVybiF0aGlzLmlzRW1wdHkoKX1zb3J0KHQpe3RoaXMuX211bHRpcGxlJiZ0aGlzLnNlbGVjdGVkJiZ0aGlzLl9zZWxlY3RlZC5zb3J0KHQpfWlzTXVsdGlwbGVTZWxlY3Rpb24oKXtyZXR1cm4gdGhpcy5fbXVsdGlwbGV9X2VtaXRDaGFuZ2VFdmVudCgpe3RoaXMuX3NlbGVjdGVkPW51bGwsKHRoaXMuX3NlbGVjdGVkVG9FbWl0Lmxlbmd0aHx8dGhpcy5fZGVzZWxlY3RlZFRvRW1pdC5sZW5ndGgpJiYodGhpcy5jaGFuZ2VkLm5leHQoe3NvdXJjZTp0aGlzLGFkZGVkOnRoaXMuX3NlbGVjdGVkVG9FbWl0LHJlbW92ZWQ6dGhpcy5fZGVzZWxlY3RlZFRvRW1pdH0pLHRoaXMuX2Rlc2VsZWN0ZWRUb0VtaXQ9W10sdGhpcy5fc2VsZWN0ZWRUb0VtaXQ9W10pfV9tYXJrU2VsZWN0ZWQodCl7dGhpcy5pc1NlbGVjdGVkKHQpfHwodGhpcy5fbXVsdGlwbGV8fHRoaXMuX3VubWFya0FsbCgpLHRoaXMuX3NlbGVjdGlvbi5hZGQodCksdGhpcy5fZW1pdENoYW5nZXMmJnRoaXMuX3NlbGVjdGVkVG9FbWl0LnB1c2godCkpfV91bm1hcmtTZWxlY3RlZCh0KXt0aGlzLmlzU2VsZWN0ZWQodCkmJih0aGlzLl9zZWxlY3Rpb24uZGVsZXRlKHQpLHRoaXMuX2VtaXRDaGFuZ2VzJiZ0aGlzLl9kZXNlbGVjdGVkVG9FbWl0LnB1c2godCkpfV91bm1hcmtBbGwoKXt0aGlzLmlzRW1wdHkoKXx8dGhpcy5fc2VsZWN0aW9uLmZvckVhY2goKHQ9PnRoaXMuX3VubWFya1NlbGVjdGVkKHQpKSl9X3ZlcmlmeVZhbHVlQXNzaWdubWVudCh0KXtpZih0Lmxlbmd0aD4xJiYhdGhpcy5fbXVsdGlwbGUmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSl0aHJvdyhmdW5jdGlvbiBlKCl7cmV0dXJuIEVycm9yKCJDYW5ub3QgcGFzcyBtdWx0aXBsZSB2YWx1ZXMgaW50byBTZWxlY3Rpb25Nb2RlbCB3aXRoIHNpbmdsZS12YWx1ZSBtb2RlLiIpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8pKCl9fWNsYXNzIGlGe2NvbnN0cnVjdG9yKCl7dGhpcy5fbGlzdGVuZXJzPVtdfW5vdGlmeSh0LGUpe2ZvcihsZXQgbiBvZiB0aGlzLl9saXN0ZW5lcnMpbih0LGUpfWxpc3Rlbih0KXtyZXR1cm4gdGhpcy5fbGlzdGVuZXJzLnB1c2godCksKCk9Pnt0aGlzLl9saXN0ZW5lcnM9dGhpcy5fbGlzdGVuZXJzLmZpbHRlcigoZT0+dCE9PWUpKX19bmdPbkRlc3Ryb3koKXt0aGlzLl9saXN0ZW5lcnM9W119fWlGLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxpRil9LGlGLsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIG5ldyBpRn0sdG9rZW46aUYscHJvdmlkZWRJbjoicm9vdCJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGlGLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVybltdfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgYUY9bmV3IEdhKCJfVmlld1JlcGVhdGVyIiksckY9WyJjb250ZW50V3JhcHBlciJdLHNGPW5ldyBHYSgiVklSVFVBTF9TQ1JPTExfU1RSQVRFR1kiKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIGxGe2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLl9zY3JvbGxlZEluZGV4Q2hhbmdlPW5ldyBJLHRoaXMuc2Nyb2xsZWRJbmRleENoYW5nZT10aGlzLl9zY3JvbGxlZEluZGV4Q2hhbmdlLnBpcGUoTWUoKSksdGhpcy5fdmlld3BvcnQ9bnVsbCx0aGlzLl9pdGVtU2l6ZT10LHRoaXMuX21pbkJ1ZmZlclB4PWUsdGhpcy5fbWF4QnVmZmVyUHg9bn1hdHRhY2godCl7dGhpcy5fdmlld3BvcnQ9dCx0aGlzLl91cGRhdGVUb3RhbENvbnRlbnRTaXplKCksdGhpcy5fdXBkYXRlUmVuZGVyZWRSYW5nZSgpfWRldGFjaCgpe3RoaXMuX3Njcm9sbGVkSW5kZXhDaGFuZ2UuY29tcGxldGUoKSx0aGlzLl92aWV3cG9ydD1udWxsfXVwZGF0ZUl0ZW1BbmRCdWZmZXJTaXplKHQsZSxuKXtpZihuPGUmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSl0aHJvdyBFcnJvcigiQ0RLIHZpcnR1YWwgc2Nyb2xsOiBtYXhCdWZmZXJQeCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBtaW5CdWZmZXJQeCIpO3RoaXMuX2l0ZW1TaXplPXQsdGhpcy5fbWluQnVmZmVyUHg9ZSx0aGlzLl9tYXhCdWZmZXJQeD1uLHRoaXMuX3VwZGF0ZVRvdGFsQ29udGVudFNpemUoKSx0aGlzLl91cGRhdGVSZW5kZXJlZFJhbmdlKCl9b25Db250ZW50U2Nyb2xsZWQoKXt0aGlzLl91cGRhdGVSZW5kZXJlZFJhbmdlKCl9b25EYXRhTGVuZ3RoQ2hhbmdlZCgpe3RoaXMuX3VwZGF0ZVRvdGFsQ29udGVudFNpemUoKSx0aGlzLl91cGRhdGVSZW5kZXJlZFJhbmdlKCl9b25Db250ZW50UmVuZGVyZWQoKXt9b25SZW5kZXJlZE9mZnNldENoYW5nZWQoKXt9c2Nyb2xsVG9JbmRleCh0LGUpe3RoaXMuX3ZpZXdwb3J0JiZ0aGlzLl92aWV3cG9ydC5zY3JvbGxUb09mZnNldCh0KnRoaXMuX2l0ZW1TaXplLGUpfV91cGRhdGVUb3RhbENvbnRlbnRTaXplKCl7dGhpcy5fdmlld3BvcnQmJnRoaXMuX3ZpZXdwb3J0LnNldFRvdGFsQ29udGVudFNpemUodGhpcy5fdmlld3BvcnQuZ2V0RGF0YUxlbmd0aCgpKnRoaXMuX2l0ZW1TaXplKX1fdXBkYXRlUmVuZGVyZWRSYW5nZSgpe2lmKCF0aGlzLl92aWV3cG9ydClyZXR1cm47Y29uc3QgdD10aGlzLl92aWV3cG9ydC5nZXRSZW5kZXJlZFJhbmdlKCksZT17c3RhcnQ6dC5zdGFydCxlbmQ6dC5lbmR9LG49dGhpcy5fdmlld3BvcnQuZ2V0Vmlld3BvcnRTaXplKCksbz10aGlzLl92aWV3cG9ydC5nZXREYXRhTGVuZ3RoKCk7bGV0IGk9dGhpcy5fdmlld3BvcnQubWVhc3VyZVNjcm9sbE9mZnNldCgpLGE9dGhpcy5faXRlbVNpemU+MD9pL3RoaXMuX2l0ZW1TaXplOjA7aWYoZS5lbmQ+byl7Y29uc3QgdD1NYXRoLmNlaWwobi90aGlzLl9pdGVtU2l6ZSkscj1NYXRoLm1heCgwLE1hdGgubWluKGEsby10KSk7YSE9ciYmKGE9cixpPXIqdGhpcy5faXRlbVNpemUsZS5zdGFydD1NYXRoLmZsb29yKGEpKSxlLmVuZD1NYXRoLm1heCgwLE1hdGgubWluKG8sZS5zdGFydCt0KSl9Y29uc3Qgcj1pLWUuc3RhcnQqdGhpcy5faXRlbVNpemU7aWYocjx0aGlzLl9taW5CdWZmZXJQeCYmMCE9ZS5zdGFydCl7Y29uc3QgdD1NYXRoLmNlaWwoKHRoaXMuX21heEJ1ZmZlclB4LXIpL3RoaXMuX2l0ZW1TaXplKTtlLnN0YXJ0PU1hdGgubWF4KDAsZS5zdGFydC10KSxlLmVuZD1NYXRoLm1pbihvLE1hdGguY2VpbChhKyhuK3RoaXMuX21pbkJ1ZmZlclB4KS90aGlzLl9pdGVtU2l6ZSkpfWVsc2V7Y29uc3QgdD1lLmVuZCp0aGlzLl9pdGVtU2l6ZS0oaStuKTtpZih0PHRoaXMuX21pbkJ1ZmZlclB4JiZlLmVuZCE9byl7Y29uc3Qgbj1NYXRoLmNlaWwoKHRoaXMuX21heEJ1ZmZlclB4LXQpL3RoaXMuX2l0ZW1TaXplKTtuPjAmJihlLmVuZD1NYXRoLm1pbihvLGUuZW5kK24pLGUuc3RhcnQ9TWF0aC5tYXgoMCxNYXRoLmZsb29yKGEtdGhpcy5fbWluQnVmZmVyUHgvdGhpcy5faXRlbVNpemUpKSl9fXRoaXMuX3ZpZXdwb3J0LnNldFJlbmRlcmVkUmFuZ2UoZSksdGhpcy5fdmlld3BvcnQuc2V0UmVuZGVyZWRDb250ZW50T2Zmc2V0KHRoaXMuX2l0ZW1TaXplKmUuc3RhcnQpLHRoaXMuX3Njcm9sbGVkSW5kZXhDaGFuZ2UubmV4dChNYXRoLmZsb29yKGEpKX19ZnVuY3Rpb24gY0YodCl7cmV0dXJuIHQuX3Njcm9sbFN0cmF0ZWd5fWNsYXNzIGRGe2NvbnN0cnVjdG9yKCl7dGhpcy5faXRlbVNpemU9MjAsdGhpcy5fbWluQnVmZmVyUHg9MTAwLHRoaXMuX21heEJ1ZmZlclB4PTIwMCx0aGlzLl9zY3JvbGxTdHJhdGVneT1uZXcgbEYodGhpcy5pdGVtU2l6ZSx0aGlzLm1pbkJ1ZmZlclB4LHRoaXMubWF4QnVmZmVyUHgpfWdldCBpdGVtU2l6ZSgpe3JldHVybiB0aGlzLl9pdGVtU2l6ZX1zZXQgaXRlbVNpemUodCl7dGhpcy5faXRlbVNpemU9X3oodCl9Z2V0IG1pbkJ1ZmZlclB4KCl7cmV0dXJuIHRoaXMuX21pbkJ1ZmZlclB4fXNldCBtaW5CdWZmZXJQeCh0KXt0aGlzLl9taW5CdWZmZXJQeD1feih0KX1nZXQgbWF4QnVmZmVyUHgoKXtyZXR1cm4gdGhpcy5fbWF4QnVmZmVyUHh9c2V0IG1heEJ1ZmZlclB4KHQpe3RoaXMuX21heEJ1ZmZlclB4PV96KHQpfW5nT25DaGFuZ2VzKCl7dGhpcy5fc2Nyb2xsU3RyYXRlZ3kudXBkYXRlSXRlbUFuZEJ1ZmZlclNpemUodGhpcy5pdGVtU2l6ZSx0aGlzLm1pbkJ1ZmZlclB4LHRoaXMubWF4QnVmZmVyUHgpfX1kRi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8ZEYpfSxkRi7JtWRpcj1sbyh7dHlwZTpkRixzZWxlY3RvcnM6W1siY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0IiwiaXRlbVNpemUiLCIiXV0saW5wdXRzOntpdGVtU2l6ZToiaXRlbVNpemUiLG1pbkJ1ZmZlclB4OiJtaW5CdWZmZXJQeCIsbWF4QnVmZmVyUHg6Im1heEJ1ZmZlclB4In0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTpzRix1c2VGYWN0b3J5OmNGLGRlcHM6W3FlKCgoKT0+ZEYpKV19XSksQm9dfSksZEYucHJvcERlY29yYXRvcnM9e2l0ZW1TaXplOlt7dHlwZTp4eX1dLG1pbkJ1ZmZlclB4Olt7dHlwZTp4eX1dLG1heEJ1ZmZlclB4Olt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGRGLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6ImNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFtpdGVtU2l6ZV0iLHByb3ZpZGVyczpbe3Byb3ZpZGU6c0YsdXNlRmFjdG9yeTpjRixkZXBzOltxZSgoKCk9PmRGKSldfV19XX1dLChmdW5jdGlvbigpe3JldHVybltdfSkse2l0ZW1TaXplOlt7dHlwZTp4eX1dLG1pbkJ1ZmZlclB4Olt7dHlwZTp4eX1dLG1heEJ1ZmZlclB4Olt7dHlwZTp4eX1dfSk7Y2xhc3MgcEZ7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuX25nWm9uZT10LHRoaXMuX3BsYXRmb3JtPWUsdGhpcy5fc2Nyb2xsZWQ9bmV3IEksdGhpcy5fZ2xvYmFsU3Vic2NyaXB0aW9uPW51bGwsdGhpcy5fc2Nyb2xsZWRDb3VudD0wLHRoaXMuc2Nyb2xsQ29udGFpbmVycz1uZXcgTWFwLHRoaXMuX2RvY3VtZW50PW59cmVnaXN0ZXIodCl7dGhpcy5zY3JvbGxDb250YWluZXJzLmhhcyh0KXx8dGhpcy5zY3JvbGxDb250YWluZXJzLnNldCh0LHQuZWxlbWVudFNjcm9sbGVkKCkuc3Vic2NyaWJlKCgoKT0+dGhpcy5fc2Nyb2xsZWQubmV4dCh0KSkpKX1kZXJlZ2lzdGVyKHQpe2NvbnN0IGU9dGhpcy5zY3JvbGxDb250YWluZXJzLmdldCh0KTtlJiYoZS51bnN1YnNjcmliZSgpLHRoaXMuc2Nyb2xsQ29udGFpbmVycy5kZWxldGUodCkpfXNjcm9sbGVkKHQ9MjApe3JldHVybiB0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXI/bmV3IEQoKGU9Pnt0aGlzLl9nbG9iYWxTdWJzY3JpcHRpb258fHRoaXMuX2FkZEdsb2JhbExpc3RlbmVyKCk7Y29uc3Qgbj10PjA/dGhpcy5fc2Nyb2xsZWQucGlwZShkZSh0KSkuc3Vic2NyaWJlKGUpOnRoaXMuX3Njcm9sbGVkLnN1YnNjcmliZShlKTtyZXR1cm4gdGhpcy5fc2Nyb2xsZWRDb3VudCsrLCgpPT57bi51bnN1YnNjcmliZSgpLHRoaXMuX3Njcm9sbGVkQ291bnQtLSx0aGlzLl9zY3JvbGxlZENvdW50fHx0aGlzLl9yZW1vdmVHbG9iYWxMaXN0ZW5lcigpfX0pKTpFdCgpfW5nT25EZXN0cm95KCl7dGhpcy5fcmVtb3ZlR2xvYmFsTGlzdGVuZXIoKSx0aGlzLnNjcm9sbENvbnRhaW5lcnMuZm9yRWFjaCgoKHQsZSk9PnRoaXMuZGVyZWdpc3RlcihlKSkpLHRoaXMuX3Njcm9sbGVkLmNvbXBsZXRlKCl9YW5jZXN0b3JTY3JvbGxlZCh0LGUpe2NvbnN0IG49dGhpcy5nZXRBbmNlc3RvclNjcm9sbENvbnRhaW5lcnModCk7cmV0dXJuIHRoaXMuc2Nyb2xsZWQoZSkucGlwZShjZSgodD0+IXR8fG4uaW5kZXhPZih0KT4tMSkpKX1nZXRBbmNlc3RvclNjcm9sbENvbnRhaW5lcnModCl7Y29uc3QgZT1bXTtyZXR1cm4gdGhpcy5zY3JvbGxDb250YWluZXJzLmZvckVhY2goKChuLG8pPT57dGhpcy5fc2Nyb2xsYWJsZUNvbnRhaW5zRWxlbWVudChvLHQpJiZlLnB1c2gobyl9KSksZX1fZ2V0V2luZG93KCl7cmV0dXJuIHRoaXMuX2RvY3VtZW50LmRlZmF1bHRWaWV3fHx3aW5kb3d9X3Njcm9sbGFibGVDb250YWluc0VsZW1lbnQodCxlKXtsZXQgbj14eihlKSxvPXQuZ2V0RWxlbWVudFJlZigpLm5hdGl2ZUVsZW1lbnQ7ZG97aWYobj09bylyZXR1cm4hMH13aGlsZShuPW4ucGFyZW50RWxlbWVudCk7cmV0dXJuITF9X2FkZEdsb2JhbExpc3RlbmVyKCl7dGhpcy5fZ2xvYmFsU3Vic2NyaXB0aW9uPXRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9Pm9lKHRoaXMuX2dldFdpbmRvdygpLmRvY3VtZW50LCJzY3JvbGwiKS5zdWJzY3JpYmUoKCgpPT50aGlzLl9zY3JvbGxlZC5uZXh0KCkpKSkpfV9yZW1vdmVHbG9iYWxMaXN0ZW5lcigpe3RoaXMuX2dsb2JhbFN1YnNjcmlwdGlvbiYmKHRoaXMuX2dsb2JhbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX2dsb2JhbFN1YnNjcmlwdGlvbj1udWxsKX19cEYuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHBGKSh2cihhXyksdnIod3opLHZyKFpfLDgpKX0scEYuybVwcm92PU1uKHtmYWN0b3J5OmZ1bmN0aW9uIHQoKXtyZXR1cm4gbmV3IHBGKHZyKGFfKSx2cih3eiksdnIoWl8sOCkpfSx0b2tlbjpwRixwcm92aWRlZEluOiJyb290In0pLHBGLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6YV99LHt0eXBlOnd6fSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1pfXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChwRixbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6YV99LHt0eXBlOnd6fSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1pfXX1dfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIG1Ge2NvbnN0cnVjdG9yKHQsZSxuLG8pe3RoaXMuZWxlbWVudFJlZj10LHRoaXMuc2Nyb2xsRGlzcGF0Y2hlcj1lLHRoaXMubmdab25lPW4sdGhpcy5kaXI9byx0aGlzLl9kZXN0cm95ZWQ9bmV3IEksdGhpcy5fZWxlbWVudFNjcm9sbGVkPW5ldyBEKCh0PT50aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9Pm9lKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCJzY3JvbGwiKS5waXBlKEllKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSh0KSkpKSl9bmdPbkluaXQoKXt0aGlzLnNjcm9sbERpc3BhdGNoZXIucmVnaXN0ZXIodGhpcyl9bmdPbkRlc3Ryb3koKXt0aGlzLnNjcm9sbERpc3BhdGNoZXIuZGVyZWdpc3Rlcih0aGlzKSx0aGlzLl9kZXN0cm95ZWQubmV4dCgpLHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpfWVsZW1lbnRTY3JvbGxlZCgpe3JldHVybiB0aGlzLl9lbGVtZW50U2Nyb2xsZWR9Z2V0RWxlbWVudFJlZigpe3JldHVybiB0aGlzLmVsZW1lbnRSZWZ9c2Nyb2xsVG8odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxuPXRoaXMuZGlyJiYicnRsIj09dGhpcy5kaXIudmFsdWU7bnVsbD09dC5sZWZ0JiYodC5sZWZ0PW4/dC5lbmQ6dC5zdGFydCksbnVsbD09dC5yaWdodCYmKHQucmlnaHQ9bj90LnN0YXJ0OnQuZW5kKSxudWxsIT10LmJvdHRvbSYmKHQudG9wPWUuc2Nyb2xsSGVpZ2h0LWUuY2xpZW50SGVpZ2h0LXQuYm90dG9tKSxuJiYwIT1JeigpPyhudWxsIT10LmxlZnQmJih0LnJpZ2h0PWUuc2Nyb2xsV2lkdGgtZS5jbGllbnRXaWR0aC10LmxlZnQpLDI9PUl6KCk/dC5sZWZ0PXQucmlnaHQ6MT09SXooKSYmKHQubGVmdD10LnJpZ2h0Py10LnJpZ2h0OnQucmlnaHQpKTpudWxsIT10LnJpZ2h0JiYodC5sZWZ0PWUuc2Nyb2xsV2lkdGgtZS5jbGllbnRXaWR0aC10LnJpZ2h0KSx0aGlzLl9hcHBseVNjcm9sbFRvT3B0aW9ucyh0KX1fYXBwbHlTY3JvbGxUb09wdGlvbnModCl7Y29uc3QgZT10aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDt6eigpP2Uuc2Nyb2xsVG8odCk6KG51bGwhPXQudG9wJiYoZS5zY3JvbGxUb3A9dC50b3ApLG51bGwhPXQubGVmdCYmKGUuc2Nyb2xsTGVmdD10LmxlZnQpKX1tZWFzdXJlU2Nyb2xsT2Zmc2V0KHQpe2NvbnN0IGU9ImxlZnQiLG49InJpZ2h0IixvPXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O2lmKCJ0b3AiPT10KXJldHVybiBvLnNjcm9sbFRvcDtpZigiYm90dG9tIj09dClyZXR1cm4gby5zY3JvbGxIZWlnaHQtby5jbGllbnRIZWlnaHQtby5zY3JvbGxUb3A7Y29uc3QgaT10aGlzLmRpciYmInJ0bCI9PXRoaXMuZGlyLnZhbHVlO3JldHVybiJzdGFydCI9PXQ/dD1pP246ZToiZW5kIj09dCYmKHQ9aT9lOm4pLGkmJjI9PUl6KCk/dD09ZT9vLnNjcm9sbFdpZHRoLW8uY2xpZW50V2lkdGgtby5zY3JvbGxMZWZ0Om8uc2Nyb2xsTGVmdDppJiYxPT1JeigpP3Q9PWU/by5zY3JvbGxMZWZ0K28uc2Nyb2xsV2lkdGgtby5jbGllbnRXaWR0aDotby5zY3JvbGxMZWZ0OnQ9PWU/by5zY3JvbGxMZWZ0Om8uc2Nyb2xsV2lkdGgtby5jbGllbnRXaWR0aC1vLnNjcm9sbExlZnR9fW1GLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxtRikoU20oaGcpLFNtKHBGKSxTbShhXyksU20oSEksOCkpfSxtRi7JtWRpcj1sbyh7dHlwZTptRixzZWxlY3RvcnM6W1siIiwiY2RrLXNjcm9sbGFibGUiLCIiXSxbIiIsImNka1Njcm9sbGFibGUiLCIiXV19KSxtRi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpwRn0se3R5cGU6YV99LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKG1GLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IltjZGstc2Nyb2xsYWJsZV0sIFtjZGtTY3JvbGxhYmxlXSJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6cEZ9LHt0eXBlOmFffSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfV19KSxudWxsKTtjbGFzcyB1Rntjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5fcGxhdGZvcm09dCx0aGlzLl9jaGFuZ2U9bmV3IEksdGhpcy5fY2hhbmdlTGlzdGVuZXI9dD0+e3RoaXMuX2NoYW5nZS5uZXh0KHQpfSx0aGlzLl9kb2N1bWVudD1uLGUucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT57aWYodC5pc0Jyb3dzZXIpe2NvbnN0IHQ9dGhpcy5fZ2V0V2luZG93KCk7dC5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRoaXMuX2NoYW5nZUxpc3RlbmVyKSx0LmFkZEV2ZW50TGlzdGVuZXIoIm9yaWVudGF0aW9uY2hhbmdlIix0aGlzLl9jaGFuZ2VMaXN0ZW5lcil9dGhpcy5jaGFuZ2UoKS5zdWJzY3JpYmUoKCgpPT50aGlzLl92aWV3cG9ydFNpemU9bnVsbCkpfSkpfW5nT25EZXN0cm95KCl7aWYodGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKXtjb25zdCB0PXRoaXMuX2dldFdpbmRvdygpO3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIix0aGlzLl9jaGFuZ2VMaXN0ZW5lciksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJvcmllbnRhdGlvbmNoYW5nZSIsdGhpcy5fY2hhbmdlTGlzdGVuZXIpfXRoaXMuX2NoYW5nZS5jb21wbGV0ZSgpfWdldFZpZXdwb3J0U2l6ZSgpe3RoaXMuX3ZpZXdwb3J0U2l6ZXx8dGhpcy5fdXBkYXRlVmlld3BvcnRTaXplKCk7Y29uc3QgdD17d2lkdGg6dGhpcy5fdmlld3BvcnRTaXplLndpZHRoLGhlaWdodDp0aGlzLl92aWV3cG9ydFNpemUuaGVpZ2h0fTtyZXR1cm4gdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyfHwodGhpcy5fdmlld3BvcnRTaXplPW51bGwpLHR9Z2V0Vmlld3BvcnRSZWN0KCl7Y29uc3QgdD10aGlzLmdldFZpZXdwb3J0U2Nyb2xsUG9zaXRpb24oKSx7d2lkdGg6ZSxoZWlnaHQ6bn09dGhpcy5nZXRWaWV3cG9ydFNpemUoKTtyZXR1cm57dG9wOnQudG9wLGxlZnQ6dC5sZWZ0LGJvdHRvbTp0LnRvcCtuLHJpZ2h0OnQubGVmdCtlLGhlaWdodDpuLHdpZHRoOmV9fWdldFZpZXdwb3J0U2Nyb2xsUG9zaXRpb24oKXtpZighdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKXJldHVybnt0b3A6MCxsZWZ0OjB9O2NvbnN0IHQ9dGhpcy5fZG9jdW1lbnQsZT10aGlzLl9nZXRXaW5kb3coKSxuPXQuZG9jdW1lbnRFbGVtZW50LG89bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57dG9wOi1vLnRvcHx8dC5ib2R5LnNjcm9sbFRvcHx8ZS5zY3JvbGxZfHxuLnNjcm9sbFRvcHx8MCxsZWZ0Oi1vLmxlZnR8fHQuYm9keS5zY3JvbGxMZWZ0fHxlLnNjcm9sbFh8fG4uc2Nyb2xsTGVmdHx8MH19Y2hhbmdlKHQ9MjApe3JldHVybiB0PjA/dGhpcy5fY2hhbmdlLnBpcGUoZGUodCkpOnRoaXMuX2NoYW5nZX1fZ2V0V2luZG93KCl7cmV0dXJuIHRoaXMuX2RvY3VtZW50LmRlZmF1bHRWaWV3fHx3aW5kb3d9X3VwZGF0ZVZpZXdwb3J0U2l6ZSgpe2NvbnN0IHQ9dGhpcy5fZ2V0V2luZG93KCk7dGhpcy5fdmlld3BvcnRTaXplPXRoaXMuX3BsYXRmb3JtLmlzQnJvd3Nlcj97d2lkdGg6dC5pbm5lcldpZHRoLGhlaWdodDp0LmlubmVySGVpZ2h0fTp7d2lkdGg6MCxoZWlnaHQ6MH19fXVGLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx1RikodnIod3opLHZyKGFfKSx2cihaXyw4KSl9LHVGLsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIG5ldyB1Rih2cih3eiksdnIoYV8pLHZyKFpfLDgpKX0sdG9rZW46dUYscHJvdmlkZWRJbjoicm9vdCJ9KSx1Ri5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnd6fSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltaX119XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodUYsW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOiJyb290In1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnd6fSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltaX119XX1dfSksbnVsbCk7Y29uc3QgZkY9InVuZGVmaW5lZCIhPXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU/YXQ6JDtjbGFzcyBnRiBleHRlbmRzIG1Ge2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIpe2lmKHN1cGVyKHQsYSxuLGkpLHRoaXMuZWxlbWVudFJlZj10LHRoaXMuX2NoYW5nZURldGVjdG9yUmVmPWUsdGhpcy5fc2Nyb2xsU3RyYXRlZ3k9byx0aGlzLl9kZXRhY2hlZFN1YmplY3Q9bmV3IEksdGhpcy5fcmVuZGVyZWRSYW5nZVN1YmplY3Q9bmV3IEksdGhpcy5fb3JpZW50YXRpb249InZlcnRpY2FsIix0aGlzLl9hcHBlbmRPbmx5PSExLHRoaXMuc2Nyb2xsZWRJbmRleENoYW5nZT1uZXcgRCgodD0+dGhpcy5fc2Nyb2xsU3RyYXRlZ3kuc2Nyb2xsZWRJbmRleENoYW5nZS5zdWJzY3JpYmUoKGU9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCgpPT50aGlzLm5nWm9uZS5ydW4oKCgpPT50Lm5leHQoZSkpKSkpKSkpKSx0aGlzLnJlbmRlcmVkUmFuZ2VTdHJlYW09dGhpcy5fcmVuZGVyZWRSYW5nZVN1YmplY3QsdGhpcy5fdG90YWxDb250ZW50U2l6ZT0wLHRoaXMuX3RvdGFsQ29udGVudFdpZHRoPSIiLHRoaXMuX3RvdGFsQ29udGVudEhlaWdodD0iIix0aGlzLl9yZW5kZXJlZFJhbmdlPXtzdGFydDowLGVuZDowfSx0aGlzLl9kYXRhTGVuZ3RoPTAsdGhpcy5fdmlld3BvcnRTaXplPTAsdGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0PTAsdGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0TmVlZHNSZXdyaXRlPSExLHRoaXMuX2lzQ2hhbmdlRGV0ZWN0aW9uUGVuZGluZz0hMSx0aGlzLl9ydW5BZnRlckNoYW5nZURldGVjdGlvbj1bXSx0aGlzLl92aWV3cG9ydENoYW5nZXM9bS5FTVBUWSwhbyYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93IEVycm9yKCdFcnJvcjogY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0IHJlcXVpcmVzIHRoZSAiaXRlbVNpemUiIHByb3BlcnR5IHRvIGJlIHNldC4nKTt0aGlzLl92aWV3cG9ydENoYW5nZXM9ci5jaGFuZ2UoKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5jaGVja1ZpZXdwb3J0U2l6ZSgpfSkpfWdldCBvcmllbnRhdGlvbigpe3JldHVybiB0aGlzLl9vcmllbnRhdGlvbn1zZXQgb3JpZW50YXRpb24odCl7dGhpcy5fb3JpZW50YXRpb24hPT10JiYodGhpcy5fb3JpZW50YXRpb249dCx0aGlzLl9jYWxjdWxhdGVTcGFjZXJTaXplKCkpfWdldCBhcHBlbmRPbmx5KCl7cmV0dXJuIHRoaXMuX2FwcGVuZE9ubHl9c2V0IGFwcGVuZE9ubHkodCl7dGhpcy5fYXBwZW5kT25seT15eih0KX1uZ09uSW5pdCgpe3N1cGVyLm5nT25Jbml0KCksdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+e3RoaXMuX21lYXN1cmVWaWV3cG9ydFNpemUoKSx0aGlzLl9zY3JvbGxTdHJhdGVneS5hdHRhY2godGhpcyksdGhpcy5lbGVtZW50U2Nyb2xsZWQoKS5waXBlKE5lKG51bGwpLGRlKDAsZkYpKS5zdWJzY3JpYmUoKCgpPT50aGlzLl9zY3JvbGxTdHJhdGVneS5vbkNvbnRlbnRTY3JvbGxlZCgpKSksdGhpcy5fbWFya0NoYW5nZURldGVjdGlvbk5lZWRlZCgpfSkpKSl9bmdPbkRlc3Ryb3koKXt0aGlzLmRldGFjaCgpLHRoaXMuX3Njcm9sbFN0cmF0ZWd5LmRldGFjaCgpLHRoaXMuX3JlbmRlcmVkUmFuZ2VTdWJqZWN0LmNvbXBsZXRlKCksdGhpcy5fZGV0YWNoZWRTdWJqZWN0LmNvbXBsZXRlKCksdGhpcy5fdmlld3BvcnRDaGFuZ2VzLnVuc3Vic2NyaWJlKCksc3VwZXIubmdPbkRlc3Ryb3koKX1hdHRhY2godCl7aWYodGhpcy5fZm9yT2YmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSl0aHJvdyBFcnJvcigiQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0IGlzIGFscmVhZHkgYXR0YWNoZWQuIik7dGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT57dGhpcy5fZm9yT2Y9dCx0aGlzLl9mb3JPZi5kYXRhU3RyZWFtLnBpcGUoSWUodGhpcy5fZGV0YWNoZWRTdWJqZWN0KSkuc3Vic2NyaWJlKCh0PT57Y29uc3QgZT10Lmxlbmd0aDtlIT09dGhpcy5fZGF0YUxlbmd0aCYmKHRoaXMuX2RhdGFMZW5ndGg9ZSx0aGlzLl9zY3JvbGxTdHJhdGVneS5vbkRhdGFMZW5ndGhDaGFuZ2VkKCkpLHRoaXMuX2RvQ2hhbmdlRGV0ZWN0aW9uKCl9KSl9KSl9ZGV0YWNoKCl7dGhpcy5fZm9yT2Y9bnVsbCx0aGlzLl9kZXRhY2hlZFN1YmplY3QubmV4dCgpfWdldERhdGFMZW5ndGgoKXtyZXR1cm4gdGhpcy5fZGF0YUxlbmd0aH1nZXRWaWV3cG9ydFNpemUoKXtyZXR1cm4gdGhpcy5fdmlld3BvcnRTaXplfWdldFJlbmRlcmVkUmFuZ2UoKXtyZXR1cm4gdGhpcy5fcmVuZGVyZWRSYW5nZX1zZXRUb3RhbENvbnRlbnRTaXplKHQpe3RoaXMuX3RvdGFsQ29udGVudFNpemUhPT10JiYodGhpcy5fdG90YWxDb250ZW50U2l6ZT10LHRoaXMuX2NhbGN1bGF0ZVNwYWNlclNpemUoKSx0aGlzLl9tYXJrQ2hhbmdlRGV0ZWN0aW9uTmVlZGVkKCkpfXNldFJlbmRlcmVkUmFuZ2UodCl7KAovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KZnVuY3Rpb24gZSh0LG4pe3JldHVybiB0LnN0YXJ0PT1uLnN0YXJ0JiZ0LmVuZD09bi5lbmR9KSh0aGlzLl9yZW5kZXJlZFJhbmdlLHQpfHwodGhpcy5hcHBlbmRPbmx5JiYodD17c3RhcnQ6MCxlbmQ6TWF0aC5tYXgodGhpcy5fcmVuZGVyZWRSYW5nZS5lbmQsdC5lbmQpfSksdGhpcy5fcmVuZGVyZWRSYW5nZVN1YmplY3QubmV4dCh0aGlzLl9yZW5kZXJlZFJhbmdlPXQpLHRoaXMuX21hcmtDaGFuZ2VEZXRlY3Rpb25OZWVkZWQoKCgpPT50aGlzLl9zY3JvbGxTdHJhdGVneS5vbkNvbnRlbnRSZW5kZXJlZCgpKSkpfWdldE9mZnNldFRvUmVuZGVyZWRDb250ZW50U3RhcnQoKXtyZXR1cm4gdGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0TmVlZHNSZXdyaXRlP251bGw6dGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0fXNldFJlbmRlcmVkQ29udGVudE9mZnNldCh0LGU9InRvLXN0YXJ0Iil7Y29uc3Qgbj0iaG9yaXpvbnRhbCI9PXRoaXMub3JpZW50YXRpb24sbz1uPyJYIjoiWSI7bGV0IGk9YHRyYW5zbGF0ZSR7b30oJHtOdW1iZXIoKG4mJnRoaXMuZGlyJiYicnRsIj09dGhpcy5kaXIudmFsdWU/LTE6MSkqdCl9cHgpYDt0aGlzLl9yZW5kZXJlZENvbnRlbnRPZmZzZXQ9dCwidG8tZW5kIj09PWUmJihpKz1gIHRyYW5zbGF0ZSR7b30oLTEwMCUpYCx0aGlzLl9yZW5kZXJlZENvbnRlbnRPZmZzZXROZWVkc1Jld3JpdGU9ITApLHRoaXMuX3JlbmRlcmVkQ29udGVudFRyYW5zZm9ybSE9aSYmKHRoaXMuX3JlbmRlcmVkQ29udGVudFRyYW5zZm9ybT1pLHRoaXMuX21hcmtDaGFuZ2VEZXRlY3Rpb25OZWVkZWQoKCgpPT57dGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0TmVlZHNSZXdyaXRlPyh0aGlzLl9yZW5kZXJlZENvbnRlbnRPZmZzZXQtPXRoaXMubWVhc3VyZVJlbmRlcmVkQ29udGVudFNpemUoKSx0aGlzLl9yZW5kZXJlZENvbnRlbnRPZmZzZXROZWVkc1Jld3JpdGU9ITEsdGhpcy5zZXRSZW5kZXJlZENvbnRlbnRPZmZzZXQodGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0KSk6dGhpcy5fc2Nyb2xsU3RyYXRlZ3kub25SZW5kZXJlZE9mZnNldENoYW5nZWQoKX0pKSl9c2Nyb2xsVG9PZmZzZXQodCxlPSJhdXRvIil7Y29uc3Qgbj17YmVoYXZpb3I6ZX07Imhvcml6b250YWwiPT09dGhpcy5vcmllbnRhdGlvbj9uLnN0YXJ0PXQ6bi50b3A9dCx0aGlzLnNjcm9sbFRvKG4pfXNjcm9sbFRvSW5kZXgodCxlPSJhdXRvIil7dGhpcy5fc2Nyb2xsU3RyYXRlZ3kuc2Nyb2xsVG9JbmRleCh0LGUpfW1lYXN1cmVTY3JvbGxPZmZzZXQodCl7cmV0dXJuIHN1cGVyLm1lYXN1cmVTY3JvbGxPZmZzZXQodHx8KCJob3Jpem9udGFsIj09PXRoaXMub3JpZW50YXRpb24/InN0YXJ0IjoidG9wIikpfW1lYXN1cmVSZW5kZXJlZENvbnRlbnRTaXplKCl7Y29uc3QgdD10aGlzLl9jb250ZW50V3JhcHBlci5uYXRpdmVFbGVtZW50O3JldHVybiJob3Jpem9udGFsIj09PXRoaXMub3JpZW50YXRpb24/dC5vZmZzZXRXaWR0aDp0Lm9mZnNldEhlaWdodH1tZWFzdXJlUmFuZ2VTaXplKHQpe3JldHVybiB0aGlzLl9mb3JPZj90aGlzLl9mb3JPZi5tZWFzdXJlUmFuZ2VTaXplKHQsdGhpcy5vcmllbnRhdGlvbik6MH1jaGVja1ZpZXdwb3J0U2l6ZSgpe3RoaXMuX21lYXN1cmVWaWV3cG9ydFNpemUoKSx0aGlzLl9zY3JvbGxTdHJhdGVneS5vbkRhdGFMZW5ndGhDaGFuZ2VkKCl9X21lYXN1cmVWaWV3cG9ydFNpemUoKXtjb25zdCB0PXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O3RoaXMuX3ZpZXdwb3J0U2l6ZT0iaG9yaXpvbnRhbCI9PT10aGlzLm9yaWVudGF0aW9uP3QuY2xpZW50V2lkdGg6dC5jbGllbnRIZWlnaHR9X21hcmtDaGFuZ2VEZXRlY3Rpb25OZWVkZWQodCl7dCYmdGhpcy5fcnVuQWZ0ZXJDaGFuZ2VEZXRlY3Rpb24ucHVzaCh0KSx0aGlzLl9pc0NoYW5nZURldGVjdGlvblBlbmRpbmd8fCh0aGlzLl9pc0NoYW5nZURldGVjdGlvblBlbmRpbmc9ITAsdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+e3RoaXMuX2RvQ2hhbmdlRGV0ZWN0aW9uKCl9KSkpKSl9X2RvQ2hhbmdlRGV0ZWN0aW9uKCl7dGhpcy5faXNDaGFuZ2VEZXRlY3Rpb25QZW5kaW5nPSExLHRoaXMuX2NvbnRlbnRXcmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtPXRoaXMuX3JlbmRlcmVkQ29udGVudFRyYW5zZm9ybSx0aGlzLm5nWm9uZS5ydW4oKCgpPT50aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSkpO2NvbnN0IHQ9dGhpcy5fcnVuQWZ0ZXJDaGFuZ2VEZXRlY3Rpb247dGhpcy5fcnVuQWZ0ZXJDaGFuZ2VEZXRlY3Rpb249W107Zm9yKGNvbnN0IGUgb2YgdCllKCl9X2NhbGN1bGF0ZVNwYWNlclNpemUoKXt0aGlzLl90b3RhbENvbnRlbnRIZWlnaHQ9Imhvcml6b250YWwiPT09dGhpcy5vcmllbnRhdGlvbj8iIjpgJHt0aGlzLl90b3RhbENvbnRlbnRTaXplfXB4YCx0aGlzLl90b3RhbENvbnRlbnRXaWR0aD0iaG9yaXpvbnRhbCI9PT10aGlzLm9yaWVudGF0aW9uP2Ake3RoaXMuX3RvdGFsQ29udGVudFNpemV9cHhgOiIifX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmZ1bmN0aW9uIGhGKHQsZSxuKXtpZighbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIDA7Y29uc3Qgbz1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybiJob3Jpem9udGFsIj09PXQ/InN0YXJ0Ij09PWU/by5sZWZ0Om8ucmlnaHQ6InN0YXJ0Ij09PWU/by50b3A6by5ib3R0b219Z0YuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGdGKShTbShoZyksU20oVWcpLFNtKGFfKSxTbShzRiw4KSxTbShISSw4KSxTbShwRiksU20odUYpKX0sZ0YuybVjbXA9dG8oe3R5cGU6Z0Ysc2VsZWN0b3JzOltbImNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmUWgockYsNyksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5fY29udGVudFdyYXBwZXI9dC5maXJzdCl9fSxob3N0QXR0cnM6WzEsImNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCJdLGhvc3RWYXJzOjQsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJnB1KCJjZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24taG9yaXpvbnRhbCIsImhvcml6b250YWwiPT09bi5vcmllbnRhdGlvbikoImNkay12aXJ0dWFsLXNjcm9sbC1vcmllbnRhdGlvbi12ZXJ0aWNhbCIsImhvcml6b250YWwiIT09bi5vcmllbnRhdGlvbil9LGlucHV0czp7b3JpZW50YXRpb246Im9yaWVudGF0aW9uIixhcHBlbmRPbmx5OiJhcHBlbmRPbmx5In0sb3V0cHV0czp7c2Nyb2xsZWRJbmRleENoYW5nZToic2Nyb2xsZWRJbmRleENoYW5nZSJ9LGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6bUYsdXNlRXhpc3Rpbmc6Z0Z9XSkseHBdLG5nQ29udGVudFNlbGVjdG9yczpbIioiXSxkZWNsczo0LHZhcnM6NCxjb25zdHM6W1sxLCJjZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVyIl0sWyJjb250ZW50V3JhcHBlciIsIiJdLFsxLCJjZGstdmlydHVhbC1zY3JvbGwtc3BhY2VyIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabSgpLFJtKDAsImRpdiIsMCwxKSxYbSgyKSxBbSgpLFRtKDMsImRpdiIsMikpLDImZSYmKHJjKDMpLGR1KCJ3aWR0aCIsbi5fdG90YWxDb250ZW50V2lkdGgpKCJoZWlnaHQiLG4uX3RvdGFsQ29udGVudEhlaWdodCkpfSxzdHlsZXM6WyJjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnR7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzphdXRvO2NvbnRhaW46c3RyaWN0O3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3dpbGwtY2hhbmdlOnNjcm9sbC1wb3NpdGlvbjstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaH0uY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7Y29udGFpbjpjb250ZW50fVtkaXI9cnRsXSAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcntyaWdodDowO2xlZnQ6YXV0b30uY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLWhvcml6b250YWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXJ7bWluLWhlaWdodDoxMDAlfS5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24taG9yaXpvbnRhbCAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcj5kbDpub3QoW2Nka1ZpcnR1YWxGb3JdKSwuY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLWhvcml6b250YWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXI+b2w6bm90KFtjZGtWaXJ0dWFsRm9yXSksLmNkay12aXJ0dWFsLXNjcm9sbC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIC5jZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVyPnRhYmxlOm5vdChbY2RrVmlydHVhbEZvcl0pLC5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24taG9yaXpvbnRhbCAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcj51bDpub3QoW2Nka1ZpcnR1YWxGb3JdKXtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDtib3JkZXItbGVmdC13aWR0aDowO2JvcmRlci1yaWdodC13aWR0aDowO291dGxpbmU6bm9uZX0uY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLXZlcnRpY2FsIC5jZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVye21pbi13aWR0aDoxMDAlfS5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24tdmVydGljYWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXI+ZGw6bm90KFtjZGtWaXJ0dWFsRm9yXSksLmNkay12aXJ0dWFsLXNjcm9sbC1vcmllbnRhdGlvbi12ZXJ0aWNhbCAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcj5vbDpub3QoW2Nka1ZpcnR1YWxGb3JdKSwuY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLXZlcnRpY2FsIC5jZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVyPnRhYmxlOm5vdChbY2RrVmlydHVhbEZvcl0pLC5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24tdmVydGljYWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXI+dWw6bm90KFtjZGtWaXJ0dWFsRm9yXSl7cGFkZGluZy10b3A6MDtwYWRkaW5nLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7Ym9yZGVyLXRvcC13aWR0aDowO2JvcmRlci1ib3R0b20td2lkdGg6MDtvdXRsaW5lOm5vbmV9LmNkay12aXJ0dWFsLXNjcm9sbC1zcGFjZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO2hlaWdodDoxcHg7d2lkdGg6MXB4O3RyYW5zZm9ybS1vcmlnaW46MCAwfVtkaXI9cnRsXSAuY2RrLXZpcnR1YWwtc2Nyb2xsLXNwYWNlcntyaWdodDowO2xlZnQ6YXV0bzt0cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMH1cbiJdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLGdGLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOlVnfSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltzRl19XX0se3R5cGU6SEksZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6cEZ9LHt0eXBlOnVGfV0sZ0YucHJvcERlY29yYXRvcnM9e29yaWVudGF0aW9uOlt7dHlwZTp4eX1dLGFwcGVuZE9ubHk6W3t0eXBlOnh5fV0sc2Nyb2xsZWRJbmRleENoYW5nZTpbe3R5cGU6T3l9XSxfY29udGVudFdyYXBwZXI6W3t0eXBlOlphLGFyZ3M6WyJjb250ZW50V3JhcHBlciIse3N0YXRpYzohMH1dfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZ0YsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0Iix0ZW1wbGF0ZTonXHgzYyEtLVxuICBXcmFwIHRoZSByZW5kZXJlZCBjb250ZW50IGluIGFuIGVsZW1lbnQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gb2Zmc2V0IGl0IGJhc2VkIG9uIHRoZSBzY3JvbGxcbiAgcG9zaXRpb24uXG4tLVx4M2VcbjxkaXYgI2NvbnRlbnRXcmFwcGVyIGNsYXNzPSJjZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVyIj5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9kaXY+XG5ceDNjIS0tXG4gIFNwYWNlciB1c2VkIHRvIGZvcmNlIHRoZSBzY3JvbGxpbmcgY29udGFpbmVyIHRvIHRoZSBjb3JyZWN0IHNpemUgZm9yIHRoZSAqdG90YWwqIG51bWJlciBvZiBpdGVtc1xuICBzbyB0aGF0IHRoZSBzY3JvbGxiYXIgY2FwdHVyZXMgdGhlIHNpemUgb2YgdGhlIGVudGlyZSBkYXRhIHNldC5cbi0tXHgzZVxuPGRpdiBjbGFzcz0iY2RrLXZpcnR1YWwtc2Nyb2xsLXNwYWNlciJcbiAgICAgW3N0eWxlLndpZHRoXT0iX3RvdGFsQ29udGVudFdpZHRoIiBbc3R5bGUuaGVpZ2h0XT0iX3RvdGFsQ29udGVudEhlaWdodCI+PC9kaXY+XG4nLGhvc3Q6e2NsYXNzOiJjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQiLCJbY2xhc3MuY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLWhvcml6b250YWxdIjonb3JpZW50YXRpb24gPT09ICJob3Jpem9udGFsIicsIltjbGFzcy5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24tdmVydGljYWxdIjonb3JpZW50YXRpb24gIT09ICJob3Jpem9udGFsIid9LGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLHByb3ZpZGVyczpbe3Byb3ZpZGU6bUYsdXNlRXhpc3Rpbmc6Z0Z9XSxzdHlsZXM6WyJjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnR7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzphdXRvO2NvbnRhaW46c3RyaWN0O3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3dpbGwtY2hhbmdlOnNjcm9sbC1wb3NpdGlvbjstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaH0uY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7Y29udGFpbjpjb250ZW50fVtkaXI9cnRsXSAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcntyaWdodDowO2xlZnQ6YXV0b30uY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLWhvcml6b250YWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXJ7bWluLWhlaWdodDoxMDAlfS5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24taG9yaXpvbnRhbCAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcj5kbDpub3QoW2Nka1ZpcnR1YWxGb3JdKSwuY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLWhvcml6b250YWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXI+b2w6bm90KFtjZGtWaXJ0dWFsRm9yXSksLmNkay12aXJ0dWFsLXNjcm9sbC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIC5jZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVyPnRhYmxlOm5vdChbY2RrVmlydHVhbEZvcl0pLC5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24taG9yaXpvbnRhbCAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcj51bDpub3QoW2Nka1ZpcnR1YWxGb3JdKXtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDtib3JkZXItbGVmdC13aWR0aDowO2JvcmRlci1yaWdodC13aWR0aDowO291dGxpbmU6bm9uZX0uY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLXZlcnRpY2FsIC5jZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVye21pbi13aWR0aDoxMDAlfS5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24tdmVydGljYWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXI+ZGw6bm90KFtjZGtWaXJ0dWFsRm9yXSksLmNkay12aXJ0dWFsLXNjcm9sbC1vcmllbnRhdGlvbi12ZXJ0aWNhbCAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcj5vbDpub3QoW2Nka1ZpcnR1YWxGb3JdKSwuY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLXZlcnRpY2FsIC5jZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVyPnRhYmxlOm5vdChbY2RrVmlydHVhbEZvcl0pLC5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24tdmVydGljYWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXI+dWw6bm90KFtjZGtWaXJ0dWFsRm9yXSl7cGFkZGluZy10b3A6MDtwYWRkaW5nLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7Ym9yZGVyLXRvcC13aWR0aDowO2JvcmRlci1ib3R0b20td2lkdGg6MDtvdXRsaW5lOm5vbmV9LmNkay12aXJ0dWFsLXNjcm9sbC1zcGFjZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO2hlaWdodDoxcHg7d2lkdGg6MXB4O3RyYW5zZm9ybS1vcmlnaW46MCAwfVtkaXI9cnRsXSAuY2RrLXZpcnR1YWwtc2Nyb2xsLXNwYWNlcntyaWdodDowO2xlZnQ6YXV0bzt0cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMH1cbiJdfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOlVnfSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltzRl19XX0se3R5cGU6SEksZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6cEZ9LHt0eXBlOnVGfV19KSx7c2Nyb2xsZWRJbmRleENoYW5nZTpbe3R5cGU6T3l9XSxvcmllbnRhdGlvbjpbe3R5cGU6eHl9XSxhcHBlbmRPbmx5Olt7dHlwZTp4eX1dLF9jb250ZW50V3JhcHBlcjpbe3R5cGU6WmEsYXJnczpbImNvbnRlbnRXcmFwcGVyIix7c3RhdGljOiEwfV19XX0pO2NsYXNzIGJGe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhKXt0aGlzLl92aWV3Q29udGFpbmVyUmVmPXQsdGhpcy5fdGVtcGxhdGU9ZSx0aGlzLl9kaWZmZXJzPW4sdGhpcy5fdmlld1JlcGVhdGVyPW8sdGhpcy5fdmlld3BvcnQ9aSx0aGlzLnZpZXdDaGFuZ2U9bmV3IEksdGhpcy5fZGF0YVNvdXJjZUNoYW5nZXM9bmV3IEksdGhpcy5kYXRhU3RyZWFtPXRoaXMuX2RhdGFTb3VyY2VDaGFuZ2VzLnBpcGUoTmUobnVsbCksRGUoKSx6ZSgoKFt0LGVdKT0+dGhpcy5fY2hhbmdlRGF0YVNvdXJjZSh0LGUpKSksQWUoMSkpLHRoaXMuX2RpZmZlcj1udWxsLHRoaXMuX25lZWRzVXBkYXRlPSExLHRoaXMuX2Rlc3Ryb3llZD1uZXcgSSx0aGlzLmRhdGFTdHJlYW0uc3Vic2NyaWJlKCh0PT57dGhpcy5fZGF0YT10LHRoaXMuX29uUmVuZGVyZWREYXRhQ2hhbmdlKCl9KSksdGhpcy5fdmlld3BvcnQucmVuZGVyZWRSYW5nZVN0cmVhbS5waXBlKEllKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgodD0+e3RoaXMuX3JlbmRlcmVkUmFuZ2U9dCxhLnJ1bigoKCk9PnRoaXMudmlld0NoYW5nZS5uZXh0KHRoaXMuX3JlbmRlcmVkUmFuZ2UpKSksdGhpcy5fb25SZW5kZXJlZERhdGFDaGFuZ2UoKX0pKSx0aGlzLl92aWV3cG9ydC5hdHRhY2godGhpcyl9Z2V0IGNka1ZpcnR1YWxGb3JPZigpe3JldHVybiB0aGlzLl9jZGtWaXJ0dWFsRm9yT2Z9c2V0IGNka1ZpcnR1YWxGb3JPZih0KXt0aGlzLl9jZGtWaXJ0dWFsRm9yT2Y9dCwkSCh0KT90aGlzLl9kYXRhU291cmNlQ2hhbmdlcy5uZXh0KHQpOnRoaXMuX2RhdGFTb3VyY2VDaGFuZ2VzLm5leHQobmV3IHRGKE50KHQpP3Q6QXJyYXkuZnJvbSh0fHxbXSkpKX1nZXQgY2RrVmlydHVhbEZvclRyYWNrQnkoKXtyZXR1cm4gdGhpcy5fY2RrVmlydHVhbEZvclRyYWNrQnl9c2V0IGNka1ZpcnR1YWxGb3JUcmFja0J5KHQpe3RoaXMuX25lZWRzVXBkYXRlPSEwLHRoaXMuX2Nka1ZpcnR1YWxGb3JUcmFja0J5PXQ/KGUsbik9PnQoZSsodGhpcy5fcmVuZGVyZWRSYW5nZT90aGlzLl9yZW5kZXJlZFJhbmdlLnN0YXJ0OjApLG4pOnZvaWQgMH1zZXQgY2RrVmlydHVhbEZvclRlbXBsYXRlKHQpe3QmJih0aGlzLl9uZWVkc1VwZGF0ZT0hMCx0aGlzLl90ZW1wbGF0ZT10KX1nZXQgY2RrVmlydHVhbEZvclRlbXBsYXRlQ2FjaGVTaXplKCl7cmV0dXJuIHRoaXMuX3ZpZXdSZXBlYXRlci52aWV3Q2FjaGVTaXplfXNldCBjZGtWaXJ0dWFsRm9yVGVtcGxhdGVDYWNoZVNpemUodCl7dGhpcy5fdmlld1JlcGVhdGVyLnZpZXdDYWNoZVNpemU9X3oodCl9bWVhc3VyZVJhbmdlU2l6ZSh0LGUpe2lmKHQuc3RhcnQ+PXQuZW5kKXJldHVybiAwO2lmKCh0LnN0YXJ0PHRoaXMuX3JlbmRlcmVkUmFuZ2Uuc3RhcnR8fHQuZW5kPnRoaXMuX3JlbmRlcmVkUmFuZ2UuZW5kKSYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93IEVycm9yKCJFcnJvcjogYXR0ZW1wdGVkIHRvIG1lYXN1cmUgYW4gaXRlbSB0aGF0IGlzbid0IHJlbmRlcmVkLiIpO2NvbnN0IG49dC5zdGFydC10aGlzLl9yZW5kZXJlZFJhbmdlLnN0YXJ0LG89dC5lbmQtdC5zdGFydDtsZXQgaSxhO2ZvcihsZXQgdD0wO3Q8bzt0Kyspe2NvbnN0IGU9dGhpcy5fdmlld0NvbnRhaW5lclJlZi5nZXQodCtuKTtpZihlJiZlLnJvb3ROb2Rlcy5sZW5ndGgpe2k9YT1lLnJvb3ROb2Rlc1swXTticmVha319Zm9yKGxldCB0PW8tMTt0Pi0xO3QtLSl7Y29uc3QgZT10aGlzLl92aWV3Q29udGFpbmVyUmVmLmdldCh0K24pO2lmKGUmJmUucm9vdE5vZGVzLmxlbmd0aCl7YT1lLnJvb3ROb2Rlc1tlLnJvb3ROb2Rlcy5sZW5ndGgtMV07YnJlYWt9fXJldHVybiBpJiZhP2hGKGUsImVuZCIsYSktaEYoZSwic3RhcnQiLGkpOjB9bmdEb0NoZWNrKCl7aWYodGhpcy5fZGlmZmVyJiZ0aGlzLl9uZWVkc1VwZGF0ZSl7Y29uc3QgdD10aGlzLl9kaWZmZXIuZGlmZih0aGlzLl9yZW5kZXJlZEl0ZW1zKTt0P3RoaXMuX2FwcGx5Q2hhbmdlcyh0KTp0aGlzLl91cGRhdGVDb250ZXh0KCksdGhpcy5fbmVlZHNVcGRhdGU9ITF9fW5nT25EZXN0cm95KCl7dGhpcy5fdmlld3BvcnQuZGV0YWNoKCksdGhpcy5fZGF0YVNvdXJjZUNoYW5nZXMubmV4dCh2b2lkIDApLHRoaXMuX2RhdGFTb3VyY2VDaGFuZ2VzLmNvbXBsZXRlKCksdGhpcy52aWV3Q2hhbmdlLmNvbXBsZXRlKCksdGhpcy5fZGVzdHJveWVkLm5leHQoKSx0aGlzLl9kZXN0cm95ZWQuY29tcGxldGUoKSx0aGlzLl92aWV3UmVwZWF0ZXIuZGV0YWNoKCl9X29uUmVuZGVyZWREYXRhQ2hhbmdlKCl7dGhpcy5fcmVuZGVyZWRSYW5nZSYmKHRoaXMuX3JlbmRlcmVkSXRlbXM9dGhpcy5fZGF0YS5zbGljZSh0aGlzLl9yZW5kZXJlZFJhbmdlLnN0YXJ0LHRoaXMuX3JlbmRlcmVkUmFuZ2UuZW5kKSx0aGlzLl9kaWZmZXJ8fCh0aGlzLl9kaWZmZXI9dGhpcy5fZGlmZmVycy5maW5kKHRoaXMuX3JlbmRlcmVkSXRlbXMpLmNyZWF0ZSgoKHQsZSk9PnRoaXMuY2RrVmlydHVhbEZvclRyYWNrQnk/dGhpcy5jZGtWaXJ0dWFsRm9yVHJhY2tCeSh0LGUpOmUpKSksdGhpcy5fbmVlZHNVcGRhdGU9ITApfV9jaGFuZ2VEYXRhU291cmNlKHQsZSl7cmV0dXJuIHQmJnQuZGlzY29ubmVjdCh0aGlzKSx0aGlzLl9uZWVkc1VwZGF0ZT0hMCxlP2UuY29ubmVjdCh0aGlzKTpFdCgpfV91cGRhdGVDb250ZXh0KCl7Y29uc3QgdD10aGlzLl9kYXRhLmxlbmd0aDtsZXQgZT10aGlzLl92aWV3Q29udGFpbmVyUmVmLmxlbmd0aDtmb3IoO2UtLTspe2NvbnN0IG49dGhpcy5fdmlld0NvbnRhaW5lclJlZi5nZXQoZSk7bi5jb250ZXh0LmluZGV4PXRoaXMuX3JlbmRlcmVkUmFuZ2Uuc3RhcnQrZSxuLmNvbnRleHQuY291bnQ9dCx0aGlzLl91cGRhdGVDb21wdXRlZENvbnRleHRQcm9wZXJ0aWVzKG4uY29udGV4dCksbi5kZXRlY3RDaGFuZ2VzKCl9fV9hcHBseUNoYW5nZXModCl7dGhpcy5fdmlld1JlcGVhdGVyLmFwcGx5Q2hhbmdlcyh0LHRoaXMuX3ZpZXdDb250YWluZXJSZWYsKCh0LGUsbik9PnRoaXMuX2dldEVtYmVkZGVkVmlld0FyZ3ModCxuKSksKHQ9PnQuaXRlbSkpLHQuZm9yRWFjaElkZW50aXR5Q2hhbmdlKCh0PT57dGhpcy5fdmlld0NvbnRhaW5lclJlZi5nZXQodC5jdXJyZW50SW5kZXgpLmNvbnRleHQuJGltcGxpY2l0PXQuaXRlbX0pKTtjb25zdCBlPXRoaXMuX2RhdGEubGVuZ3RoO2xldCBuPXRoaXMuX3ZpZXdDb250YWluZXJSZWYubGVuZ3RoO2Zvcig7bi0tOyl7Y29uc3QgdD10aGlzLl92aWV3Q29udGFpbmVyUmVmLmdldChuKTt0LmNvbnRleHQuaW5kZXg9dGhpcy5fcmVuZGVyZWRSYW5nZS5zdGFydCtuLHQuY29udGV4dC5jb3VudD1lLHRoaXMuX3VwZGF0ZUNvbXB1dGVkQ29udGV4dFByb3BlcnRpZXModC5jb250ZXh0KX19X3VwZGF0ZUNvbXB1dGVkQ29udGV4dFByb3BlcnRpZXModCl7dC5maXJzdD0wPT09dC5pbmRleCx0Lmxhc3Q9dC5pbmRleD09PXQuY291bnQtMSx0LmV2ZW49dC5pbmRleCUyPT0wLHQub2RkPSF0LmV2ZW59X2dldEVtYmVkZGVkVmlld0FyZ3ModCxlKXtyZXR1cm57dGVtcGxhdGVSZWY6dGhpcy5fdGVtcGxhdGUsY29udGV4dDp7JGltcGxpY2l0OnQuaXRlbSxjZGtWaXJ0dWFsRm9yT2Y6dGhpcy5fY2RrVmlydHVhbEZvck9mLGluZGV4Oi0xLGNvdW50Oi0xLGZpcnN0OiExLGxhc3Q6ITEsb2RkOiExLGV2ZW46ITF9LGluZGV4OmV9fX1iRi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8YkYpKFNtKGVoKSxTbShYZyksU20oSGcpLFNtKGFGKSxTbShnRiw0KSxTbShhXykpfSxiRi7JtWRpcj1sbyh7dHlwZTpiRixzZWxlY3RvcnM6W1siIiwiY2RrVmlydHVhbEZvciIsIiIsImNka1ZpcnR1YWxGb3JPZiIsIiJdXSxpbnB1dHM6e2Nka1ZpcnR1YWxGb3JPZjoiY2RrVmlydHVhbEZvck9mIixjZGtWaXJ0dWFsRm9yVHJhY2tCeToiY2RrVmlydHVhbEZvclRyYWNrQnkiLGNka1ZpcnR1YWxGb3JUZW1wbGF0ZToiY2RrVmlydHVhbEZvclRlbXBsYXRlIixjZGtWaXJ0dWFsRm9yVGVtcGxhdGVDYWNoZVNpemU6ImNka1ZpcnR1YWxGb3JUZW1wbGF0ZUNhY2hlU2l6ZSJ9LGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6YUYsdXNlQ2xhc3M6bkZ9XSldfSksYkYuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTplaH0se3R5cGU6WGd9LHt0eXBlOkhnfSx7dHlwZTpuRixkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOlthRl19XX0se3R5cGU6Z0YsZGVjb3JhdG9yczpbe3R5cGU6RXJ9XX0se3R5cGU6YV99XSxiRi5wcm9wRGVjb3JhdG9ycz17Y2RrVmlydHVhbEZvck9mOlt7dHlwZTp4eX1dLGNka1ZpcnR1YWxGb3JUcmFja0J5Olt7dHlwZTp4eX1dLGNka1ZpcnR1YWxGb3JUZW1wbGF0ZTpbe3R5cGU6eHl9XSxjZGtWaXJ0dWFsRm9yVGVtcGxhdGVDYWNoZVNpemU6W3t0eXBlOnh5fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoYkYsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Nka1ZpcnR1YWxGb3JdW2Nka1ZpcnR1YWxGb3JPZl0iLHByb3ZpZGVyczpbe3Byb3ZpZGU6YUYsdXNlQ2xhc3M6bkZ9XX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmVofSx7dHlwZTpYZ30se3R5cGU6SGd9LHt0eXBlOm5GLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W2FGXX1dfSx7dHlwZTpnRixkZWNvcmF0b3JzOlt7dHlwZTpFcn1dfSx7dHlwZTphX31dfSkse2Nka1ZpcnR1YWxGb3JPZjpbe3R5cGU6eHl9XSxjZGtWaXJ0dWFsRm9yVHJhY2tCeTpbe3R5cGU6eHl9XSxjZGtWaXJ0dWFsRm9yVGVtcGxhdGU6W3t0eXBlOnh5fV0sY2RrVmlydHVhbEZvclRlbXBsYXRlQ2FjaGVTaXplOlt7dHlwZTp4eX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyB5Rnt9eUYuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHlGKX0seUYuybVtb2Q9YW8oe3R5cGU6eUZ9KSx5Ri7JtWluaj12bih7fSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh5Rixbe3R5cGU6QXksYXJnczpbe2V4cG9ydHM6W21GXSxkZWNsYXJhdGlvbnM6W21GXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKHlGLHtkZWNsYXJhdGlvbnM6W21GXSxleHBvcnRzOlttRl19KTtjbGFzcyBfRnt9ZnVuY3Rpb24gQ0YoKXt0aHJvdyBFcnJvcigiSG9zdCBhbHJlYWR5IGhhcyBhIHBvcnRhbCBhdHRhY2hlZCIpfV9GLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxfRil9LF9GLsm1bW9kPWFvKHt0eXBlOl9GfSksX0YuybVpbmo9dm4oe2ltcG9ydHM6W1tMSSxreix5Rl0sTEkseUZdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChfRixbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W0xJLGt6LHlGXSxleHBvcnRzOltMSSx5RixkRixiRixnRl0sZGVjbGFyYXRpb25zOltkRixiRixnRl19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhfRix7ZGVjbGFyYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuW2RGLGJGLGdGXX0saW1wb3J0czpmdW5jdGlvbigpe3JldHVybltMSSxreix5Rl19LGV4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bTEkseUYsZEYsYkYsZ0ZdfX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgTUZ7YXR0YWNoKHQpe3JldHVybigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmKG51bGw9PXQmJihmdW5jdGlvbiBlKCl7dGhyb3cgRXJyb3IoIkF0dGVtcHRpbmcgdG8gYXR0YWNoIGEgcG9ydGFsIHRvIGEgbnVsbCBQb3J0YWxPdXRsZXQiKX0pKCksdC5oYXNBdHRhY2hlZCgpJiZDRigpKSx0aGlzLl9hdHRhY2hlZEhvc3Q9dCx0LmF0dGFjaCh0aGlzKX1kZXRhY2goKXtsZXQgdD10aGlzLl9hdHRhY2hlZEhvc3Q7bnVsbCE9dD8odGhpcy5fYXR0YWNoZWRIb3N0PW51bGwsdC5kZXRhY2goKSk6KCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiYoZnVuY3Rpb24gZSgpe3Rocm93IEVycm9yKCJBdHRlbXB0aW5nIHRvIGRldGFjaCBhIHBvcnRhbCB0aGF0IGlzIG5vdCBhdHRhY2hlZCB0byBhIGhvc3QiKX0pKCl9Z2V0IGlzQXR0YWNoZWQoKXtyZXR1cm4gbnVsbCE9dGhpcy5fYXR0YWNoZWRIb3N0fXNldEF0dGFjaGVkSG9zdCh0KXt0aGlzLl9hdHRhY2hlZEhvc3Q9dH19Y2xhc3MgdkYgZXh0ZW5kcyBNRntjb25zdHJ1Y3Rvcih0LGUsbixvKXtzdXBlcigpLHRoaXMuY29tcG9uZW50PXQsdGhpcy52aWV3Q29udGFpbmVyUmVmPWUsdGhpcy5pbmplY3Rvcj1uLHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyPW99fWNsYXNzIHhGIGV4dGVuZHMgTUZ7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKCksdGhpcy50ZW1wbGF0ZVJlZj10LHRoaXMudmlld0NvbnRhaW5lclJlZj1lLHRoaXMuY29udGV4dD1ufWdldCBvcmlnaW4oKXtyZXR1cm4gdGhpcy50ZW1wbGF0ZVJlZi5lbGVtZW50UmVmfWF0dGFjaCh0LGU9dGhpcy5jb250ZXh0KXtyZXR1cm4gdGhpcy5jb250ZXh0PWUsc3VwZXIuYXR0YWNoKHQpfWRldGFjaCgpe3JldHVybiB0aGlzLmNvbnRleHQ9dm9pZCAwLHN1cGVyLmRldGFjaCgpfX1jbGFzcyBPRiBleHRlbmRzIE1Ge2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5lbGVtZW50PXQgaW5zdGFuY2VvZiBoZz90Lm5hdGl2ZUVsZW1lbnQ6dH19Y2xhc3MgUEZ7Y29uc3RydWN0b3IoKXt0aGlzLl9pc0Rpc3Bvc2VkPSExLHRoaXMuYXR0YWNoRG9tUG9ydGFsPW51bGx9aGFzQXR0YWNoZWQoKXtyZXR1cm4hIXRoaXMuX2F0dGFjaGVkUG9ydGFsfWF0dGFjaCh0KXtyZXR1cm4oInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJih0fHwoZnVuY3Rpb24gZSgpe3Rocm93IEVycm9yKCJNdXN0IHByb3ZpZGUgYSBwb3J0YWwgdG8gYXR0YWNoIil9KSgpLHRoaXMuaGFzQXR0YWNoZWQoKSYmQ0YoKSx0aGlzLl9pc0Rpc3Bvc2VkJiYoZnVuY3Rpb24gbigpe3Rocm93IEVycm9yKCJUaGlzIFBvcnRhbE91dGxldCBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkIil9KSgpKSx0IGluc3RhbmNlb2YgdkY/KHRoaXMuX2F0dGFjaGVkUG9ydGFsPXQsdGhpcy5hdHRhY2hDb21wb25lbnRQb3J0YWwodCkpOnQgaW5zdGFuY2VvZiB4Rj8odGhpcy5fYXR0YWNoZWRQb3J0YWw9dCx0aGlzLmF0dGFjaFRlbXBsYXRlUG9ydGFsKHQpKTp0aGlzLmF0dGFjaERvbVBvcnRhbCYmdCBpbnN0YW5jZW9mIE9GPyh0aGlzLl9hdHRhY2hlZFBvcnRhbD10LHRoaXMuYXR0YWNoRG9tUG9ydGFsKHQpKTp2b2lkKCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmKGZ1bmN0aW9uIG8oKXt0aHJvdyBFcnJvcigiQXR0ZW1wdGluZyB0byBhdHRhY2ggYW4gdW5rbm93biBQb3J0YWwgdHlwZS4gQmFzZVBvcnRhbE91dGxldCBhY2NlcHRzIGVpdGhlciBhIENvbXBvbmVudFBvcnRhbCBvciBhIFRlbXBsYXRlUG9ydGFsLiIpfSkoKSl9ZGV0YWNoKCl7dGhpcy5fYXR0YWNoZWRQb3J0YWwmJih0aGlzLl9hdHRhY2hlZFBvcnRhbC5zZXRBdHRhY2hlZEhvc3QobnVsbCksdGhpcy5fYXR0YWNoZWRQb3J0YWw9bnVsbCksdGhpcy5faW52b2tlRGlzcG9zZUZuKCl9ZGlzcG9zZSgpe3RoaXMuaGFzQXR0YWNoZWQoKSYmdGhpcy5kZXRhY2goKSx0aGlzLl9pbnZva2VEaXNwb3NlRm4oKSx0aGlzLl9pc0Rpc3Bvc2VkPSEwfXNldERpc3Bvc2VGbih0KXt0aGlzLl9kaXNwb3NlRm49dH1faW52b2tlRGlzcG9zZUZuKCl7dGhpcy5fZGlzcG9zZUZuJiYodGhpcy5fZGlzcG9zZUZuKCksdGhpcy5fZGlzcG9zZUZuPW51bGwpfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3Mgd0YgZXh0ZW5kcyBQRntjb25zdHJ1Y3Rvcih0LGUsbixvLGkpe3N1cGVyKCksdGhpcy5vdXRsZXRFbGVtZW50PXQsdGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyPWUsdGhpcy5fYXBwUmVmPW4sdGhpcy5fZGVmYXVsdEluamVjdG9yPW8sdGhpcy5hdHRhY2hEb21Qb3J0YWw9dD0+e2lmKCF0aGlzLl9kb2N1bWVudCYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93IEVycm9yKCJDYW5ub3QgYXR0YWNoIERPTSBwb3J0YWwgd2l0aG91dCBfZG9jdW1lbnQgY29uc3RydWN0b3IgcGFyYW1ldGVyIik7Y29uc3QgZT10LmVsZW1lbnQ7aWYoIWUucGFyZW50Tm9kZSYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93IEVycm9yKCJET00gcG9ydGFsIGNvbnRlbnQgbXVzdCBiZSBhdHRhY2hlZCB0byBhIHBhcmVudCBub2RlLiIpO2NvbnN0IG49dGhpcy5fZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgiZG9tLXBvcnRhbCIpO2UucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobixlKSx0aGlzLm91dGxldEVsZW1lbnQuYXBwZW5kQ2hpbGQoZSksdGhpcy5fYXR0YWNoZWRQb3J0YWw9dCxzdXBlci5zZXREaXNwb3NlRm4oKCgpPT57bi5wYXJlbnROb2RlJiZuLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsbil9KSl9LHRoaXMuX2RvY3VtZW50PWl9YXR0YWNoQ29tcG9uZW50UG9ydGFsKHQpe2NvbnN0IGU9KHQuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyfHx0aGlzLl9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KHQuY29tcG9uZW50KTtsZXQgbjtyZXR1cm4gdC52aWV3Q29udGFpbmVyUmVmPyhuPXQudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoZSx0LnZpZXdDb250YWluZXJSZWYubGVuZ3RoLHQuaW5qZWN0b3J8fHQudmlld0NvbnRhaW5lclJlZi5pbmplY3RvciksdGhpcy5zZXREaXNwb3NlRm4oKCgpPT5uLmRlc3Ryb3koKSkpKToobj1lLmNyZWF0ZSh0LmluamVjdG9yfHx0aGlzLl9kZWZhdWx0SW5qZWN0b3IpLHRoaXMuX2FwcFJlZi5hdHRhY2hWaWV3KG4uaG9zdFZpZXcpLHRoaXMuc2V0RGlzcG9zZUZuKCgoKT0+e3RoaXMuX2FwcFJlZi5kZXRhY2hWaWV3KG4uaG9zdFZpZXcpLG4uZGVzdHJveSgpfSkpKSx0aGlzLm91dGxldEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fZ2V0Q29tcG9uZW50Um9vdE5vZGUobikpLHRoaXMuX2F0dGFjaGVkUG9ydGFsPXQsbn1hdHRhY2hUZW1wbGF0ZVBvcnRhbCh0KXtsZXQgZT10LnZpZXdDb250YWluZXJSZWYsbj1lLmNyZWF0ZUVtYmVkZGVkVmlldyh0LnRlbXBsYXRlUmVmLHQuY29udGV4dCk7cmV0dXJuIG4ucm9vdE5vZGVzLmZvckVhY2goKHQ9PnRoaXMub3V0bGV0RWxlbWVudC5hcHBlbmRDaGlsZCh0KSkpLG4uZGV0ZWN0Q2hhbmdlcygpLHRoaXMuc2V0RGlzcG9zZUZuKCgoKT0+e2xldCB0PWUuaW5kZXhPZihuKTstMSE9PXQmJmUucmVtb3ZlKHQpfSkpLHRoaXMuX2F0dGFjaGVkUG9ydGFsPXQsbn1kaXNwb3NlKCl7c3VwZXIuZGlzcG9zZSgpLG51bGwhPXRoaXMub3V0bGV0RWxlbWVudC5wYXJlbnROb2RlJiZ0aGlzLm91dGxldEVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm91dGxldEVsZW1lbnQpfV9nZXRDb21wb25lbnRSb290Tm9kZSh0KXtyZXR1cm4gdC5ob3N0Vmlldy5yb290Tm9kZXNbMF19fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBrRiBleHRlbmRzIHhGe2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKX19a0YuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGtGKShTbShYZyksU20oZWgpKX0sa0YuybVkaXI9bG8oe3R5cGU6a0Ysc2VsZWN0b3JzOltbIiIsImNka1BvcnRhbCIsIiJdXSxleHBvcnRBczpbImNka1BvcnRhbCJdLGZlYXR1cmVzOlt4cF19KSxrRi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlhnfSx7dHlwZTplaH1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoa0YsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Nka1BvcnRhbF0iLGV4cG9ydEFzOiJjZGtQb3J0YWwifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6WGd9LHt0eXBlOmVofV19KSxudWxsKTtjbGFzcyBTRiBleHRlbmRzIGtGe31TRi7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoU0YpKSkobnx8U0YpfX0pKCksU0YuybVkaXI9bG8oe3R5cGU6U0Ysc2VsZWN0b3JzOltbIiIsImNkay1wb3J0YWwiLCIiXSxbIiIsInBvcnRhbCIsIiJdXSxleHBvcnRBczpbImNka1BvcnRhbCJdLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6a0YsdXNlRXhpc3Rpbmc6U0Z9XSkseHBdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChTRixbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbY2RrLXBvcnRhbF0sIFtwb3J0YWxdIixleHBvcnRBczoiY2RrUG9ydGFsIixwcm92aWRlcnM6W3twcm92aWRlOmtGLHVzZUV4aXN0aW5nOlNGfV19XX1dLG51bGwsbnVsbCk7Y2xhc3MgREYgZXh0ZW5kcyBQRntjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIoKSx0aGlzLl9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI9dCx0aGlzLl92aWV3Q29udGFpbmVyUmVmPWUsdGhpcy5faXNJbml0aWFsaXplZD0hMSx0aGlzLmF0dGFjaGVkPW5ldyBMaCx0aGlzLmF0dGFjaERvbVBvcnRhbD10PT57aWYoIXRoaXMuX2RvY3VtZW50JiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkpdGhyb3cgRXJyb3IoIkNhbm5vdCBhdHRhY2ggRE9NIHBvcnRhbCB3aXRob3V0IF9kb2N1bWVudCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIiKTtjb25zdCBlPXQuZWxlbWVudDtpZighZS5wYXJlbnROb2RlJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkpdGhyb3cgRXJyb3IoIkRPTSBwb3J0YWwgY29udGVudCBtdXN0IGJlIGF0dGFjaGVkIHRvIGEgcGFyZW50IG5vZGUuIik7Y29uc3Qgbj10aGlzLl9kb2N1bWVudC5jcmVhdGVDb21tZW50KCJkb20tcG9ydGFsIik7dC5zZXRBdHRhY2hlZEhvc3QodGhpcyksZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuLGUpLHRoaXMuX2dldFJvb3ROb2RlKCkuYXBwZW5kQ2hpbGQoZSksdGhpcy5fYXR0YWNoZWRQb3J0YWw9dCxzdXBlci5zZXREaXNwb3NlRm4oKCgpPT57bi5wYXJlbnROb2RlJiZuLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsbil9KSl9LHRoaXMuX2RvY3VtZW50PW59Z2V0IHBvcnRhbCgpe3JldHVybiB0aGlzLl9hdHRhY2hlZFBvcnRhbH1zZXQgcG9ydGFsKHQpeyghdGhpcy5oYXNBdHRhY2hlZCgpfHx0fHx0aGlzLl9pc0luaXRpYWxpemVkKSYmKHRoaXMuaGFzQXR0YWNoZWQoKSYmc3VwZXIuZGV0YWNoKCksdCYmc3VwZXIuYXR0YWNoKHQpLHRoaXMuX2F0dGFjaGVkUG9ydGFsPXQpfWdldCBhdHRhY2hlZFJlZigpe3JldHVybiB0aGlzLl9hdHRhY2hlZFJlZn1uZ09uSW5pdCgpe3RoaXMuX2lzSW5pdGlhbGl6ZWQ9ITB9bmdPbkRlc3Ryb3koKXtzdXBlci5kaXNwb3NlKCksdGhpcy5fYXR0YWNoZWRQb3J0YWw9bnVsbCx0aGlzLl9hdHRhY2hlZFJlZj1udWxsfWF0dGFjaENvbXBvbmVudFBvcnRhbCh0KXt0LnNldEF0dGFjaGVkSG9zdCh0aGlzKTtjb25zdCBlPW51bGwhPXQudmlld0NvbnRhaW5lclJlZj90LnZpZXdDb250YWluZXJSZWY6dGhpcy5fdmlld0NvbnRhaW5lclJlZixuPSh0LmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcnx8dGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyKS5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeSh0LmNvbXBvbmVudCksbz1lLmNyZWF0ZUNvbXBvbmVudChuLGUubGVuZ3RoLHQuaW5qZWN0b3J8fGUuaW5qZWN0b3IpO3JldHVybiBlIT09dGhpcy5fdmlld0NvbnRhaW5lclJlZiYmdGhpcy5fZ2V0Um9vdE5vZGUoKS5hcHBlbmRDaGlsZChvLmhvc3RWaWV3LnJvb3ROb2Rlc1swXSksc3VwZXIuc2V0RGlzcG9zZUZuKCgoKT0+by5kZXN0cm95KCkpKSx0aGlzLl9hdHRhY2hlZFBvcnRhbD10LHRoaXMuX2F0dGFjaGVkUmVmPW8sdGhpcy5hdHRhY2hlZC5lbWl0KG8pLG99YXR0YWNoVGVtcGxhdGVQb3J0YWwodCl7dC5zZXRBdHRhY2hlZEhvc3QodGhpcyk7Y29uc3QgZT10aGlzLl92aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0LnRlbXBsYXRlUmVmLHQuY29udGV4dCk7cmV0dXJuIHN1cGVyLnNldERpc3Bvc2VGbigoKCk9PnRoaXMuX3ZpZXdDb250YWluZXJSZWYuY2xlYXIoKSkpLHRoaXMuX2F0dGFjaGVkUG9ydGFsPXQsdGhpcy5fYXR0YWNoZWRSZWY9ZSx0aGlzLmF0dGFjaGVkLmVtaXQoZSksZX1fZ2V0Um9vdE5vZGUoKXtjb25zdCB0PXRoaXMuX3ZpZXdDb250YWluZXJSZWYuZWxlbWVudC5uYXRpdmVFbGVtZW50O3JldHVybiB0Lm5vZGVUeXBlPT09dC5FTEVNRU5UX05PREU/dDp0LnBhcmVudE5vZGV9fURGLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxERikoU20odWcpLFNtKGVoKSxTbShaXykpfSxERi7JtWRpcj1sbyh7dHlwZTpERixzZWxlY3RvcnM6W1siIiwiY2RrUG9ydGFsT3V0bGV0IiwiIl1dLGlucHV0czp7cG9ydGFsOlsiY2RrUG9ydGFsT3V0bGV0IiwicG9ydGFsIl19LG91dHB1dHM6e2F0dGFjaGVkOiJhdHRhY2hlZCJ9LGV4cG9ydEFzOlsiY2RrUG9ydGFsT3V0bGV0Il0sZmVhdHVyZXM6W3hwXX0pLERGLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6dWd9LHt0eXBlOmVofSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XSxERi5wcm9wRGVjb3JhdG9ycz17YXR0YWNoZWQ6W3t0eXBlOk95fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoREYsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Nka1BvcnRhbE91dGxldF0iLGV4cG9ydEFzOiJjZGtQb3J0YWxPdXRsZXQiLGlucHV0czpbInBvcnRhbDogY2RrUG9ydGFsT3V0bGV0Il19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp1Z30se3R5cGU6ZWh9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSkse2F0dGFjaGVkOlt7dHlwZTpPeX1dfSk7Y2xhc3MgRUYgZXh0ZW5kcyBERnt9RUYuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKEVGKSkpKG58fEVGKX19KSgpLEVGLsm1ZGlyPWxvKHt0eXBlOkVGLHNlbGVjdG9yczpbWyIiLCJjZGtQb3J0YWxIb3N0IiwiIl0sWyIiLCJwb3J0YWxIb3N0IiwiIl1dLGlucHV0czp7cG9ydGFsOlsiY2RrUG9ydGFsSG9zdCIsInBvcnRhbCJdfSxleHBvcnRBczpbImNka1BvcnRhbEhvc3QiXSxmZWF0dXJlczpbcGcoW3twcm92aWRlOkRGLHVzZUV4aXN0aW5nOkVGfV0pLHhwXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRUYsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Nka1BvcnRhbEhvc3RdLCBbcG9ydGFsSG9zdF0iLGV4cG9ydEFzOiJjZGtQb3J0YWxIb3N0IixpbnB1dHM6WyJwb3J0YWw6IGNka1BvcnRhbEhvc3QiXSxwcm92aWRlcnM6W3twcm92aWRlOkRGLHVzZUV4aXN0aW5nOkVGfV19XX1dLG51bGwsbnVsbCk7Y2xhc3MgUkZ7fVJGLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxSRil9LFJGLsm1bW9kPWFvKHt0eXBlOlJGfSksUkYuybVpbmo9dm4oe30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUkYsW3t0eXBlOkF5LGFyZ3M6W3tleHBvcnRzOltrRixERixTRixFRl0sZGVjbGFyYXRpb25zOltrRixERixTRixFRl19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhSRix7ZGVjbGFyYXRpb25zOltrRixERixTRixFRl0sZXhwb3J0czpba0YsREYsU0YsRUZdfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBBRj16eigpO2NsYXNzIFRGe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fdmlld3BvcnRSdWxlcj10LHRoaXMuX3ByZXZpb3VzSFRNTFN0eWxlcz17dG9wOiIiLGxlZnQ6IiJ9LHRoaXMuX2lzRW5hYmxlZD0hMSx0aGlzLl9kb2N1bWVudD1lfWF0dGFjaCgpe31lbmFibGUoKXtpZih0aGlzLl9jYW5CZUVuYWJsZWQoKSl7Y29uc3QgdD10aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7dGhpcy5fcHJldmlvdXNTY3JvbGxQb3NpdGlvbj10aGlzLl92aWV3cG9ydFJ1bGVyLmdldFZpZXdwb3J0U2Nyb2xsUG9zaXRpb24oKSx0aGlzLl9wcmV2aW91c0hUTUxTdHlsZXMubGVmdD10LnN0eWxlLmxlZnR8fCIiLHRoaXMuX3ByZXZpb3VzSFRNTFN0eWxlcy50b3A9dC5zdHlsZS50b3B8fCIiLHQuc3R5bGUubGVmdD12eigtdGhpcy5fcHJldmlvdXNTY3JvbGxQb3NpdGlvbi5sZWZ0KSx0LnN0eWxlLnRvcD12eigtdGhpcy5fcHJldmlvdXNTY3JvbGxQb3NpdGlvbi50b3ApLHQuY2xhc3NMaXN0LmFkZCgiY2RrLWdsb2JhbC1zY3JvbGxibG9jayIpLHRoaXMuX2lzRW5hYmxlZD0hMH19ZGlzYWJsZSgpe2lmKHRoaXMuX2lzRW5hYmxlZCl7Y29uc3QgdD10aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZT10LnN0eWxlLG49dGhpcy5fZG9jdW1lbnQuYm9keS5zdHlsZSxvPWUuc2Nyb2xsQmVoYXZpb3J8fCIiLGk9bi5zY3JvbGxCZWhhdmlvcnx8IiI7dGhpcy5faXNFbmFibGVkPSExLGUubGVmdD10aGlzLl9wcmV2aW91c0hUTUxTdHlsZXMubGVmdCxlLnRvcD10aGlzLl9wcmV2aW91c0hUTUxTdHlsZXMudG9wLHQuY2xhc3NMaXN0LnJlbW92ZSgiY2RrLWdsb2JhbC1zY3JvbGxibG9jayIpLEFGJiYoZS5zY3JvbGxCZWhhdmlvcj1uLnNjcm9sbEJlaGF2aW9yPSJhdXRvIiksd2luZG93LnNjcm9sbCh0aGlzLl9wcmV2aW91c1Njcm9sbFBvc2l0aW9uLmxlZnQsdGhpcy5fcHJldmlvdXNTY3JvbGxQb3NpdGlvbi50b3ApLEFGJiYoZS5zY3JvbGxCZWhhdmlvcj1vLG4uc2Nyb2xsQmVoYXZpb3I9aSl9fV9jYW5CZUVuYWJsZWQoKXtpZih0aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJjZGstZ2xvYmFsLXNjcm9sbGJsb2NrIil8fHRoaXMuX2lzRW5hYmxlZClyZXR1cm4hMTtjb25zdCB0PXRoaXMuX2RvY3VtZW50LmJvZHksZT10aGlzLl92aWV3cG9ydFJ1bGVyLmdldFZpZXdwb3J0U2l6ZSgpO3JldHVybiB0LnNjcm9sbEhlaWdodD5lLmhlaWdodHx8dC5zY3JvbGxXaWR0aD5lLndpZHRofX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gTkYoKXtyZXR1cm4gRXJyb3IoIlNjcm9sbCBzdHJhdGVneSBoYXMgYWxyZWFkeSBiZWVuIGF0dGFjaGVkLiIpfWNsYXNzIHpGe2NvbnN0cnVjdG9yKHQsZSxuLG8pe3RoaXMuX3Njcm9sbERpc3BhdGNoZXI9dCx0aGlzLl9uZ1pvbmU9ZSx0aGlzLl92aWV3cG9ydFJ1bGVyPW4sdGhpcy5fY29uZmlnPW8sdGhpcy5fc2Nyb2xsU3Vic2NyaXB0aW9uPW51bGwsdGhpcy5fZGV0YWNoPSgpPT57dGhpcy5kaXNhYmxlKCksdGhpcy5fb3ZlcmxheVJlZi5oYXNBdHRhY2hlZCgpJiZ0aGlzLl9uZ1pvbmUucnVuKCgoKT0+dGhpcy5fb3ZlcmxheVJlZi5kZXRhY2goKSkpfX1hdHRhY2godCl7aWYodGhpcy5fb3ZlcmxheVJlZiYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93IE5GKCk7dGhpcy5fb3ZlcmxheVJlZj10fWVuYWJsZSgpe2lmKHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbilyZXR1cm47Y29uc3QgdD10aGlzLl9zY3JvbGxEaXNwYXRjaGVyLnNjcm9sbGVkKDApO3RoaXMuX2NvbmZpZyYmdGhpcy5fY29uZmlnLnRocmVzaG9sZCYmdGhpcy5fY29uZmlnLnRocmVzaG9sZD4xPyh0aGlzLl9pbml0aWFsU2Nyb2xsUG9zaXRpb249dGhpcy5fdmlld3BvcnRSdWxlci5nZXRWaWV3cG9ydFNjcm9sbFBvc2l0aW9uKCkudG9wLHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbj10LnN1YnNjcmliZSgoKCk9Pntjb25zdCB0PXRoaXMuX3ZpZXdwb3J0UnVsZXIuZ2V0Vmlld3BvcnRTY3JvbGxQb3NpdGlvbigpLnRvcDtNYXRoLmFicyh0LXRoaXMuX2luaXRpYWxTY3JvbGxQb3NpdGlvbik+dGhpcy5fY29uZmlnLnRocmVzaG9sZD90aGlzLl9kZXRhY2goKTp0aGlzLl9vdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCl9KSkpOnRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbj10LnN1YnNjcmliZSh0aGlzLl9kZXRhY2gpfWRpc2FibGUoKXt0aGlzLl9zY3JvbGxTdWJzY3JpcHRpb24mJih0aGlzLl9zY3JvbGxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl9zY3JvbGxTdWJzY3JpcHRpb249bnVsbCl9ZGV0YWNoKCl7dGhpcy5kaXNhYmxlKCksdGhpcy5fb3ZlcmxheVJlZj1udWxsfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgSUZ7ZW5hYmxlKCl7fWRpc2FibGUoKXt9YXR0YWNoKCl7fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gSEYodCxlKXtyZXR1cm4gZS5zb21lKChlPT50LmJvdHRvbTxlLnRvcHx8dC50b3A+ZS5ib3R0b218fHQucmlnaHQ8ZS5sZWZ0fHx0LmxlZnQ+ZS5yaWdodCkpfWZ1bmN0aW9uIEZGKHQsZSl7cmV0dXJuIGUuc29tZSgoZT0+dC50b3A8ZS50b3B8fHQuYm90dG9tPmUuYm90dG9tfHx0LmxlZnQ8ZS5sZWZ0fHx0LnJpZ2h0PmUucmlnaHQpKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgTEZ7Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy5fc2Nyb2xsRGlzcGF0Y2hlcj10LHRoaXMuX3ZpZXdwb3J0UnVsZXI9ZSx0aGlzLl9uZ1pvbmU9bix0aGlzLl9jb25maWc9byx0aGlzLl9zY3JvbGxTdWJzY3JpcHRpb249bnVsbH1hdHRhY2godCl7aWYodGhpcy5fb3ZlcmxheVJlZiYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93IE5GKCk7dGhpcy5fb3ZlcmxheVJlZj10fWVuYWJsZSgpe3RoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbnx8KHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbj10aGlzLl9zY3JvbGxEaXNwYXRjaGVyLnNjcm9sbGVkKHRoaXMuX2NvbmZpZz90aGlzLl9jb25maWcuc2Nyb2xsVGhyb3R0bGU6MCkuc3Vic2NyaWJlKCgoKT0+e2lmKHRoaXMuX292ZXJsYXlSZWYudXBkYXRlUG9zaXRpb24oKSx0aGlzLl9jb25maWcmJnRoaXMuX2NvbmZpZy5hdXRvQ2xvc2Upe2NvbnN0IHQ9dGhpcy5fb3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx7d2lkdGg6ZSxoZWlnaHQ6bn09dGhpcy5fdmlld3BvcnRSdWxlci5nZXRWaWV3cG9ydFNpemUoKTtIRih0LFt7d2lkdGg6ZSxoZWlnaHQ6bixib3R0b206bixyaWdodDplLHRvcDowLGxlZnQ6MH1dKSYmKHRoaXMuZGlzYWJsZSgpLHRoaXMuX25nWm9uZS5ydW4oKCgpPT50aGlzLl9vdmVybGF5UmVmLmRldGFjaCgpKSkpfX0pKSl9ZGlzYWJsZSgpe3RoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbiYmKHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbj1udWxsKX1kZXRhY2goKXt0aGlzLmRpc2FibGUoKSx0aGlzLl9vdmVybGF5UmVmPW51bGx9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBCRntjb25zdHJ1Y3Rvcih0LGUsbixvKXt0aGlzLl9zY3JvbGxEaXNwYXRjaGVyPXQsdGhpcy5fdmlld3BvcnRSdWxlcj1lLHRoaXMuX25nWm9uZT1uLHRoaXMubm9vcD0oKT0+bmV3IElGLHRoaXMuY2xvc2U9dD0+bmV3IHpGKHRoaXMuX3Njcm9sbERpc3BhdGNoZXIsdGhpcy5fbmdab25lLHRoaXMuX3ZpZXdwb3J0UnVsZXIsdCksdGhpcy5ibG9jaz0oKT0+bmV3IFRGKHRoaXMuX3ZpZXdwb3J0UnVsZXIsdGhpcy5fZG9jdW1lbnQpLHRoaXMucmVwb3NpdGlvbj10PT5uZXcgTEYodGhpcy5fc2Nyb2xsRGlzcGF0Y2hlcix0aGlzLl92aWV3cG9ydFJ1bGVyLHRoaXMuX25nWm9uZSx0KSx0aGlzLl9kb2N1bWVudD1vfX1CRi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8QkYpKHZyKHBGKSx2cih1RiksdnIoYV8pLHZyKFpfKSl9LEJGLsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIG5ldyBCRih2cihwRiksdnIodUYpLHZyKGFfKSx2cihaXykpfSx0b2tlbjpCRixwcm92aWRlZEluOiJyb290In0pLEJGLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6cEZ9LHt0eXBlOnVGfSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChCRixbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6cEZ9LHt0eXBlOnVGfSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBWRntjb25zdHJ1Y3Rvcih0KXtpZih0aGlzLnNjcm9sbFN0cmF0ZWd5PW5ldyBJRix0aGlzLnBhbmVsQ2xhc3M9IiIsdGhpcy5oYXNCYWNrZHJvcD0hMSx0aGlzLmJhY2tkcm9wQ2xhc3M9ImNkay1vdmVybGF5LWRhcmstYmFja2Ryb3AiLHRoaXMuZGlzcG9zZU9uTmF2aWdhdGlvbj0hMSx0KXtjb25zdCBlPU9iamVjdC5rZXlzKHQpO2Zvcihjb25zdCBuIG9mIGUpdm9pZCAwIT09dFtuXSYmKHRoaXNbbl09dFtuXSl9fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgakZ7Y29uc3RydWN0b3IodCxlLG4sbyxpKXt0aGlzLm9mZnNldFg9bix0aGlzLm9mZnNldFk9byx0aGlzLnBhbmVsQ2xhc3M9aSx0aGlzLm9yaWdpblg9dC5vcmlnaW5YLHRoaXMub3JpZ2luWT10Lm9yaWdpblksdGhpcy5vdmVybGF5WD1lLm92ZXJsYXlYLHRoaXMub3ZlcmxheVk9ZS5vdmVybGF5WX19Y2xhc3MgVUZ7fWNsYXNzIEdGe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5jb25uZWN0aW9uUGFpcj10LHRoaXMuc2Nyb2xsYWJsZVZpZXdQcm9wZXJ0aWVzPWV9fWZ1bmN0aW9uIFdGKHQsZSl7aWYoInRvcCIhPT1lJiYiYm90dG9tIiE9PWUmJiJjZW50ZXIiIT09ZSl0aHJvdyBFcnJvcihgQ29ubmVjdGVkUG9zaXRpb246IEludmFsaWQgJHt0fSAiJHtlfSIuIEV4cGVjdGVkICJ0b3AiLCAiYm90dG9tIiBvciAiY2VudGVyIi5gKX1mdW5jdGlvbiBZRih0LGUpe2lmKCJzdGFydCIhPT1lJiYiZW5kIiE9PWUmJiJjZW50ZXIiIT09ZSl0aHJvdyBFcnJvcihgQ29ubmVjdGVkUG9zaXRpb246IEludmFsaWQgJHt0fSAiJHtlfSIuIEV4cGVjdGVkICJzdGFydCIsICJlbmQiIG9yICJjZW50ZXIiLmApfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9HRi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmpGfSx7dHlwZTpVRixkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfV07Y2xhc3MgcUZ7Y29uc3RydWN0b3IodCl7dGhpcy5fYXR0YWNoZWRPdmVybGF5cz1bXSx0aGlzLl9kb2N1bWVudD10fW5nT25EZXN0cm95KCl7dGhpcy5kZXRhY2goKX1hZGQodCl7dGhpcy5yZW1vdmUodCksdGhpcy5fYXR0YWNoZWRPdmVybGF5cy5wdXNoKHQpfXJlbW92ZSh0KXtjb25zdCBlPXRoaXMuX2F0dGFjaGVkT3ZlcmxheXMuaW5kZXhPZih0KTtlPi0xJiZ0aGlzLl9hdHRhY2hlZE92ZXJsYXlzLnNwbGljZShlLDEpLDA9PT10aGlzLl9hdHRhY2hlZE92ZXJsYXlzLmxlbmd0aCYmdGhpcy5kZXRhY2goKX19cUYuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHFGKSh2cihaXykpfSxxRi7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgcUYodnIoWl8pKX0sdG9rZW46cUYscHJvdmlkZWRJbjoicm9vdCJ9KSxxRi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgocUYsW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOiJyb290In1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBaRiBleHRlbmRzIHFGe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuX2tleWRvd25MaXN0ZW5lcj10PT57Y29uc3QgZT10aGlzLl9hdHRhY2hlZE92ZXJsYXlzO2ZvcihsZXQgbj1lLmxlbmd0aC0xO24+LTE7bi0tKWlmKGVbbl0uX2tleWRvd25FdmVudHMub2JzZXJ2ZXJzLmxlbmd0aD4wKXtlW25dLl9rZXlkb3duRXZlbnRzLm5leHQodCk7YnJlYWt9fX1hZGQodCl7c3VwZXIuYWRkKHQpLHRoaXMuX2lzQXR0YWNoZWR8fCh0aGlzLl9kb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuX2tleWRvd25MaXN0ZW5lciksdGhpcy5faXNBdHRhY2hlZD0hMCl9ZGV0YWNoKCl7dGhpcy5faXNBdHRhY2hlZCYmKHRoaXMuX2RvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5fa2V5ZG93bkxpc3RlbmVyKSx0aGlzLl9pc0F0dGFjaGVkPSExKX19WkYuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFpGKSh2cihaXykpfSxaRi7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgWkYodnIoWl8pKX0sdG9rZW46WkYscHJvdmlkZWRJbjoicm9vdCJ9KSxaRi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWkYsW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOiJyb290In1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBYRiBleHRlbmRzIHFGe2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCksdGhpcy5fcGxhdGZvcm09ZSx0aGlzLl9jdXJzb3JTdHlsZUlzU2V0PSExLHRoaXMuX2NsaWNrTGlzdGVuZXI9dD0+e2NvbnN0IGU9THoodCksbj10aGlzLl9hdHRhY2hlZE92ZXJsYXlzLnNsaWNlKCk7Zm9yKGxldCBvPW4ubGVuZ3RoLTE7bz4tMTtvLS0pe2NvbnN0IGk9bltvXTtpZighKGkuX291dHNpZGVQb2ludGVyRXZlbnRzLm9ic2VydmVycy5sZW5ndGg8MSkmJmkuaGFzQXR0YWNoZWQoKSl7aWYoaS5vdmVybGF5RWxlbWVudC5jb250YWlucyhlKSlicmVhaztpLl9vdXRzaWRlUG9pbnRlckV2ZW50cy5uZXh0KHQpfX19fWFkZCh0KXtpZihzdXBlci5hZGQodCksIXRoaXMuX2lzQXR0YWNoZWQpe2NvbnN0IHQ9dGhpcy5fZG9jdW1lbnQuYm9keTt0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLl9jbGlja0xpc3RlbmVyLCEwKSx0LmFkZEV2ZW50TGlzdGVuZXIoImF1eGNsaWNrIix0aGlzLl9jbGlja0xpc3RlbmVyLCEwKSx0LmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51Iix0aGlzLl9jbGlja0xpc3RlbmVyLCEwKSx0aGlzLl9wbGF0Zm9ybS5JT1MmJiF0aGlzLl9jdXJzb3JTdHlsZUlzU2V0JiYodGhpcy5fY3Vyc29yT3JpZ2luYWxWYWx1ZT10LnN0eWxlLmN1cnNvcix0LnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy5fY3Vyc29yU3R5bGVJc1NldD0hMCksdGhpcy5faXNBdHRhY2hlZD0hMH19ZGV0YWNoKCl7aWYodGhpcy5faXNBdHRhY2hlZCl7Y29uc3QgdD10aGlzLl9kb2N1bWVudC5ib2R5O3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuX2NsaWNrTGlzdGVuZXIsITApLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYXV4Y2xpY2siLHRoaXMuX2NsaWNrTGlzdGVuZXIsITApLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLHRoaXMuX2NsaWNrTGlzdGVuZXIsITApLHRoaXMuX3BsYXRmb3JtLklPUyYmdGhpcy5fY3Vyc29yU3R5bGVJc1NldCYmKHQuc3R5bGUuY3Vyc29yPXRoaXMuX2N1cnNvck9yaWdpbmFsVmFsdWUsdGhpcy5fY3Vyc29yU3R5bGVJc1NldD0hMSksdGhpcy5faXNBdHRhY2hlZD0hMX19fVhGLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxYRikodnIoWl8pLHZyKHd6KSl9LFhGLsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIG5ldyBYRih2cihaXyksdnIod3opKX0sdG9rZW46WEYscHJvdmlkZWRJbjoicm9vdCJ9KSxYRi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6d3p9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFhGLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOnd6fV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IEtGPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSxKRj12b2lkIDAhPT1LRi5fX2thcm1hX18mJiEhS0YuX19rYXJtYV9ffHx2b2lkIDAhPT1LRi5qYXNtaW5lJiYhIUtGLmphc21pbmV8fHZvaWQgMCE9PUtGLmplc3QmJiEhS0YuamVzdHx8dm9pZCAwIT09S0YuTW9jaGEmJiEhS0YuTW9jaGE7Y2xhc3MgUUZ7Y29uc3RydWN0b3IodCxlKXt0aGlzLl9wbGF0Zm9ybT1lLHRoaXMuX2RvY3VtZW50PXR9bmdPbkRlc3Ryb3koKXtjb25zdCB0PXRoaXMuX2NvbnRhaW5lckVsZW1lbnQ7dCYmdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCl9Z2V0Q29udGFpbmVyRWxlbWVudCgpe3JldHVybiB0aGlzLl9jb250YWluZXJFbGVtZW50fHx0aGlzLl9jcmVhdGVDb250YWluZXIoKSx0aGlzLl9jb250YWluZXJFbGVtZW50fV9jcmVhdGVDb250YWluZXIoKXtjb25zdCB0PSJjZGstb3ZlcmxheS1jb250YWluZXIiO2lmKHRoaXMuX3BsYXRmb3JtLmlzQnJvd3Nlcnx8SkYpe2NvbnN0IGU9dGhpcy5fZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgLiR7dH1bcGxhdGZvcm09InNlcnZlciJdLCAuJHt0fVtwbGF0Zm9ybT0idGVzdCJdYCk7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVbdF0pfWNvbnN0IGU9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5jbGFzc0xpc3QuYWRkKHQpLEpGP2Uuc2V0QXR0cmlidXRlKCJwbGF0Zm9ybSIsInRlc3QiKTp0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXJ8fGUuc2V0QXR0cmlidXRlKCJwbGF0Zm9ybSIsInNlcnZlciIpLHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSksdGhpcy5fY29udGFpbmVyRWxlbWVudD1lfX1RRi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8UUYpKHZyKFpfKSx2cih3eikpfSxRRi7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgUUYodnIoWl8pLHZyKHd6KSl9LHRva2VuOlFGLHByb3ZpZGVkSW46InJvb3QifSksUUYuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOnd6fV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChRRixbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTp3en1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyAkRntjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyLHMsbCl7dGhpcy5fcG9ydGFsT3V0bGV0PXQsdGhpcy5faG9zdD1lLHRoaXMuX3BhbmU9bix0aGlzLl9jb25maWc9byx0aGlzLl9uZ1pvbmU9aSx0aGlzLl9rZXlib2FyZERpc3BhdGNoZXI9YSx0aGlzLl9kb2N1bWVudD1yLHRoaXMuX2xvY2F0aW9uPXMsdGhpcy5fb3V0c2lkZUNsaWNrRGlzcGF0Y2hlcj1sLHRoaXMuX2JhY2tkcm9wRWxlbWVudD1udWxsLHRoaXMuX2JhY2tkcm9wQ2xpY2s9bmV3IEksdGhpcy5fYXR0YWNobWVudHM9bmV3IEksdGhpcy5fZGV0YWNobWVudHM9bmV3IEksdGhpcy5fbG9jYXRpb25DaGFuZ2VzPW0uRU1QVFksdGhpcy5fYmFja2Ryb3BDbGlja0hhbmRsZXI9dD0+dGhpcy5fYmFja2Ryb3BDbGljay5uZXh0KHQpLHRoaXMuX2tleWRvd25FdmVudHM9bmV3IEksdGhpcy5fb3V0c2lkZVBvaW50ZXJFdmVudHM9bmV3IEksby5zY3JvbGxTdHJhdGVneSYmKHRoaXMuX3Njcm9sbFN0cmF0ZWd5PW8uc2Nyb2xsU3RyYXRlZ3ksdGhpcy5fc2Nyb2xsU3RyYXRlZ3kuYXR0YWNoKHRoaXMpKSx0aGlzLl9wb3NpdGlvblN0cmF0ZWd5PW8ucG9zaXRpb25TdHJhdGVneX1nZXQgb3ZlcmxheUVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fcGFuZX1nZXQgYmFja2Ryb3BFbGVtZW50KCl7cmV0dXJuIHRoaXMuX2JhY2tkcm9wRWxlbWVudH1nZXQgaG9zdEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5faG9zdH1hdHRhY2godCl7bGV0IGU9dGhpcy5fcG9ydGFsT3V0bGV0LmF0dGFjaCh0KTtyZXR1cm4hdGhpcy5faG9zdC5wYXJlbnRFbGVtZW50JiZ0aGlzLl9wcmV2aW91c0hvc3RQYXJlbnQmJnRoaXMuX3ByZXZpb3VzSG9zdFBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLl9ob3N0KSx0aGlzLl9wb3NpdGlvblN0cmF0ZWd5JiZ0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LmF0dGFjaCh0aGlzKSx0aGlzLl91cGRhdGVTdGFja2luZ09yZGVyKCksdGhpcy5fdXBkYXRlRWxlbWVudFNpemUoKSx0aGlzLl91cGRhdGVFbGVtZW50RGlyZWN0aW9uKCksdGhpcy5fc2Nyb2xsU3RyYXRlZ3kmJnRoaXMuX3Njcm9sbFN0cmF0ZWd5LmVuYWJsZSgpLHRoaXMuX25nWm9uZS5vblN0YWJsZS5waXBlKGJlKDEpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5oYXNBdHRhY2hlZCgpJiZ0aGlzLnVwZGF0ZVBvc2l0aW9uKCl9KSksdGhpcy5fdG9nZ2xlUG9pbnRlckV2ZW50cyghMCksdGhpcy5fY29uZmlnLmhhc0JhY2tkcm9wJiZ0aGlzLl9hdHRhY2hCYWNrZHJvcCgpLHRoaXMuX2NvbmZpZy5wYW5lbENsYXNzJiZ0aGlzLl90b2dnbGVDbGFzc2VzKHRoaXMuX3BhbmUsdGhpcy5fY29uZmlnLnBhbmVsQ2xhc3MsITApLHRoaXMuX2F0dGFjaG1lbnRzLm5leHQoKSx0aGlzLl9rZXlib2FyZERpc3BhdGNoZXIuYWRkKHRoaXMpLHRoaXMuX2NvbmZpZy5kaXNwb3NlT25OYXZpZ2F0aW9uJiYodGhpcy5fbG9jYXRpb25DaGFuZ2VzPXRoaXMuX2xvY2F0aW9uLnN1YnNjcmliZSgoKCk9PnRoaXMuZGlzcG9zZSgpKSkpLHRoaXMuX291dHNpZGVDbGlja0Rpc3BhdGNoZXIuYWRkKHRoaXMpLGV9ZGV0YWNoKCl7aWYoIXRoaXMuaGFzQXR0YWNoZWQoKSlyZXR1cm47dGhpcy5kZXRhY2hCYWNrZHJvcCgpLHRoaXMuX3RvZ2dsZVBvaW50ZXJFdmVudHMoITEpLHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kmJnRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kuZGV0YWNoJiZ0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LmRldGFjaCgpLHRoaXMuX3Njcm9sbFN0cmF0ZWd5JiZ0aGlzLl9zY3JvbGxTdHJhdGVneS5kaXNhYmxlKCk7Y29uc3QgdD10aGlzLl9wb3J0YWxPdXRsZXQuZGV0YWNoKCk7cmV0dXJuIHRoaXMuX2RldGFjaG1lbnRzLm5leHQoKSx0aGlzLl9rZXlib2FyZERpc3BhdGNoZXIucmVtb3ZlKHRoaXMpLHRoaXMuX2RldGFjaENvbnRlbnRXaGVuU3RhYmxlKCksdGhpcy5fbG9jYXRpb25DaGFuZ2VzLnVuc3Vic2NyaWJlKCksdGhpcy5fb3V0c2lkZUNsaWNrRGlzcGF0Y2hlci5yZW1vdmUodGhpcyksdH1kaXNwb3NlKCl7Y29uc3QgdD10aGlzLmhhc0F0dGFjaGVkKCk7dGhpcy5fcG9zaXRpb25TdHJhdGVneSYmdGhpcy5fcG9zaXRpb25TdHJhdGVneS5kaXNwb3NlKCksdGhpcy5fZGlzcG9zZVNjcm9sbFN0cmF0ZWd5KCksdGhpcy5kZXRhY2hCYWNrZHJvcCgpLHRoaXMuX2xvY2F0aW9uQ2hhbmdlcy51bnN1YnNjcmliZSgpLHRoaXMuX2tleWJvYXJkRGlzcGF0Y2hlci5yZW1vdmUodGhpcyksdGhpcy5fcG9ydGFsT3V0bGV0LmRpc3Bvc2UoKSx0aGlzLl9hdHRhY2htZW50cy5jb21wbGV0ZSgpLHRoaXMuX2JhY2tkcm9wQ2xpY2suY29tcGxldGUoKSx0aGlzLl9rZXlkb3duRXZlbnRzLmNvbXBsZXRlKCksdGhpcy5fb3V0c2lkZVBvaW50ZXJFdmVudHMuY29tcGxldGUoKSx0aGlzLl9vdXRzaWRlQ2xpY2tEaXNwYXRjaGVyLnJlbW92ZSh0aGlzKSx0aGlzLl9ob3N0JiZ0aGlzLl9ob3N0LnBhcmVudE5vZGUmJih0aGlzLl9ob3N0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5faG9zdCksdGhpcy5faG9zdD1udWxsKSx0aGlzLl9wcmV2aW91c0hvc3RQYXJlbnQ9dGhpcy5fcGFuZT1udWxsLHQmJnRoaXMuX2RldGFjaG1lbnRzLm5leHQoKSx0aGlzLl9kZXRhY2htZW50cy5jb21wbGV0ZSgpfWhhc0F0dGFjaGVkKCl7cmV0dXJuIHRoaXMuX3BvcnRhbE91dGxldC5oYXNBdHRhY2hlZCgpfWJhY2tkcm9wQ2xpY2soKXtyZXR1cm4gdGhpcy5fYmFja2Ryb3BDbGlja31hdHRhY2htZW50cygpe3JldHVybiB0aGlzLl9hdHRhY2htZW50c31kZXRhY2htZW50cygpe3JldHVybiB0aGlzLl9kZXRhY2htZW50c31rZXlkb3duRXZlbnRzKCl7cmV0dXJuIHRoaXMuX2tleWRvd25FdmVudHN9b3V0c2lkZVBvaW50ZXJFdmVudHMoKXtyZXR1cm4gdGhpcy5fb3V0c2lkZVBvaW50ZXJFdmVudHN9Z2V0Q29uZmlnKCl7cmV0dXJuIHRoaXMuX2NvbmZpZ311cGRhdGVQb3NpdGlvbigpe3RoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kmJnRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kuYXBwbHkoKX11cGRhdGVQb3NpdGlvblN0cmF0ZWd5KHQpe3QhPT10aGlzLl9wb3NpdGlvblN0cmF0ZWd5JiYodGhpcy5fcG9zaXRpb25TdHJhdGVneSYmdGhpcy5fcG9zaXRpb25TdHJhdGVneS5kaXNwb3NlKCksdGhpcy5fcG9zaXRpb25TdHJhdGVneT10LHRoaXMuaGFzQXR0YWNoZWQoKSYmKHQuYXR0YWNoKHRoaXMpLHRoaXMudXBkYXRlUG9zaXRpb24oKSkpfXVwZGF0ZVNpemUodCl7dGhpcy5fY29uZmlnPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0aGlzLl9jb25maWcpLHQpLHRoaXMuX3VwZGF0ZUVsZW1lbnRTaXplKCl9c2V0RGlyZWN0aW9uKHQpe3RoaXMuX2NvbmZpZz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5fY29uZmlnKSx7ZGlyZWN0aW9uOnR9KSx0aGlzLl91cGRhdGVFbGVtZW50RGlyZWN0aW9uKCl9YWRkUGFuZWxDbGFzcyh0KXt0aGlzLl9wYW5lJiZ0aGlzLl90b2dnbGVDbGFzc2VzKHRoaXMuX3BhbmUsdCwhMCl9cmVtb3ZlUGFuZWxDbGFzcyh0KXt0aGlzLl9wYW5lJiZ0aGlzLl90b2dnbGVDbGFzc2VzKHRoaXMuX3BhbmUsdCwhMSl9Z2V0RGlyZWN0aW9uKCl7Y29uc3QgdD10aGlzLl9jb25maWcuZGlyZWN0aW9uO3JldHVybiB0PyJzdHJpbmciPT10eXBlb2YgdD90OnQudmFsdWU6Imx0ciJ9dXBkYXRlU2Nyb2xsU3RyYXRlZ3kodCl7dCE9PXRoaXMuX3Njcm9sbFN0cmF0ZWd5JiYodGhpcy5fZGlzcG9zZVNjcm9sbFN0cmF0ZWd5KCksdGhpcy5fc2Nyb2xsU3RyYXRlZ3k9dCx0aGlzLmhhc0F0dGFjaGVkKCkmJih0LmF0dGFjaCh0aGlzKSx0LmVuYWJsZSgpKSl9X3VwZGF0ZUVsZW1lbnREaXJlY3Rpb24oKXt0aGlzLl9ob3N0LnNldEF0dHJpYnV0ZSgiZGlyIix0aGlzLmdldERpcmVjdGlvbigpKX1fdXBkYXRlRWxlbWVudFNpemUoKXtpZighdGhpcy5fcGFuZSlyZXR1cm47Y29uc3QgdD10aGlzLl9wYW5lLnN0eWxlO3Qud2lkdGg9dnoodGhpcy5fY29uZmlnLndpZHRoKSx0LmhlaWdodD12eih0aGlzLl9jb25maWcuaGVpZ2h0KSx0Lm1pbldpZHRoPXZ6KHRoaXMuX2NvbmZpZy5taW5XaWR0aCksdC5taW5IZWlnaHQ9dnoodGhpcy5fY29uZmlnLm1pbkhlaWdodCksdC5tYXhXaWR0aD12eih0aGlzLl9jb25maWcubWF4V2lkdGgpLHQubWF4SGVpZ2h0PXZ6KHRoaXMuX2NvbmZpZy5tYXhIZWlnaHQpfV90b2dnbGVQb2ludGVyRXZlbnRzKHQpe3RoaXMuX3BhbmUuc3R5bGUucG9pbnRlckV2ZW50cz10PyIiOiJub25lIn1fYXR0YWNoQmFja2Ryb3AoKXtjb25zdCB0PSJjZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nIjt0aGlzLl9iYWNrZHJvcEVsZW1lbnQ9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5fYmFja2Ryb3BFbGVtZW50LmNsYXNzTGlzdC5hZGQoImNkay1vdmVybGF5LWJhY2tkcm9wIiksdGhpcy5fY29uZmlnLmJhY2tkcm9wQ2xhc3MmJnRoaXMuX3RvZ2dsZUNsYXNzZXModGhpcy5fYmFja2Ryb3BFbGVtZW50LHRoaXMuX2NvbmZpZy5iYWNrZHJvcENsYXNzLCEwKSx0aGlzLl9ob3N0LnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMuX2JhY2tkcm9wRWxlbWVudCx0aGlzLl9ob3N0KSx0aGlzLl9iYWNrZHJvcEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuX2JhY2tkcm9wQ2xpY2tIYW5kbGVyKSwidW5kZWZpbmVkIiE9dHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZT90aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT57cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+e3RoaXMuX2JhY2tkcm9wRWxlbWVudCYmdGhpcy5fYmFja2Ryb3BFbGVtZW50LmNsYXNzTGlzdC5hZGQodCl9KSl9KSk6dGhpcy5fYmFja2Ryb3BFbGVtZW50LmNsYXNzTGlzdC5hZGQodCl9X3VwZGF0ZVN0YWNraW5nT3JkZXIoKXt0aGlzLl9ob3N0Lm5leHRTaWJsaW5nJiZ0aGlzLl9ob3N0LnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcy5faG9zdCl9ZGV0YWNoQmFja2Ryb3AoKXtsZXQgdCxlPXRoaXMuX2JhY2tkcm9wRWxlbWVudDtpZighZSlyZXR1cm47bGV0IG49KCk9PntlJiYoZS5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5fYmFja2Ryb3BDbGlja0hhbmRsZXIpLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmVuZCIsbiksZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSkpLHRoaXMuX2JhY2tkcm9wRWxlbWVudD09ZSYmKHRoaXMuX2JhY2tkcm9wRWxlbWVudD1udWxsKSx0aGlzLl9jb25maWcuYmFja2Ryb3BDbGFzcyYmdGhpcy5fdG9nZ2xlQ2xhc3NlcyhlLHRoaXMuX2NvbmZpZy5iYWNrZHJvcENsYXNzLCExKSxjbGVhclRpbWVvdXQodCl9O2UuY2xhc3NMaXN0LnJlbW92ZSgiY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZyIpLHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PntlLmFkZEV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25lbmQiLG4pfSkpLGUuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIsdD10aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT5zZXRUaW1lb3V0KG4sNTAwKSkpfV90b2dnbGVDbGFzc2VzKHQsZSxuKXtjb25zdCBvPXQuY2xhc3NMaXN0O016KGUpLmZvckVhY2goKHQ9Pnt0JiYobj9vLmFkZCh0KTpvLnJlbW92ZSh0KSl9KSl9X2RldGFjaENvbnRlbnRXaGVuU3RhYmxlKCl7dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e2NvbnN0IHQ9dGhpcy5fbmdab25lLm9uU3RhYmxlLnBpcGUoSWUocmUodGhpcy5fYXR0YWNobWVudHMsdGhpcy5fZGV0YWNobWVudHMpKSkuc3Vic2NyaWJlKCgoKT0+e3RoaXMuX3BhbmUmJnRoaXMuX2hvc3QmJjAhPT10aGlzLl9wYW5lLmNoaWxkcmVuLmxlbmd0aHx8KHRoaXMuX3BhbmUmJnRoaXMuX2NvbmZpZy5wYW5lbENsYXNzJiZ0aGlzLl90b2dnbGVDbGFzc2VzKHRoaXMuX3BhbmUsdGhpcy5fY29uZmlnLnBhbmVsQ2xhc3MsITEpLHRoaXMuX2hvc3QmJnRoaXMuX2hvc3QucGFyZW50RWxlbWVudCYmKHRoaXMuX3ByZXZpb3VzSG9zdFBhcmVudD10aGlzLl9ob3N0LnBhcmVudEVsZW1lbnQsdGhpcy5fcHJldmlvdXNIb3N0UGFyZW50LnJlbW92ZUNoaWxkKHRoaXMuX2hvc3QpKSx0LnVuc3Vic2NyaWJlKCkpfSkpfSkpfV9kaXNwb3NlU2Nyb2xsU3RyYXRlZ3koKXtjb25zdCB0PXRoaXMuX3Njcm9sbFN0cmF0ZWd5O3QmJih0LmRpc2FibGUoKSx0LmRldGFjaCYmdC5kZXRhY2goKSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCB0TD0iY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveCIsZUw9LyhbQS1aYS16JV0rKSQvO2NsYXNzIG5Me2NvbnN0cnVjdG9yKHQsZSxuLG8saSl7dGhpcy5fdmlld3BvcnRSdWxlcj1lLHRoaXMuX2RvY3VtZW50PW4sdGhpcy5fcGxhdGZvcm09byx0aGlzLl9vdmVybGF5Q29udGFpbmVyPWksdGhpcy5fbGFzdEJvdW5kaW5nQm94U2l6ZT17d2lkdGg6MCxoZWlnaHQ6MH0sdGhpcy5faXNQdXNoZWQ9ITEsdGhpcy5fY2FuUHVzaD0hMCx0aGlzLl9ncm93QWZ0ZXJPcGVuPSExLHRoaXMuX2hhc0ZsZXhpYmxlRGltZW5zaW9ucz0hMCx0aGlzLl9wb3NpdGlvbkxvY2tlZD0hMSx0aGlzLl92aWV3cG9ydE1hcmdpbj0wLHRoaXMuX3Njcm9sbGFibGVzPVtdLHRoaXMuX3ByZWZlcnJlZFBvc2l0aW9ucz1bXSx0aGlzLl9wb3NpdGlvbkNoYW5nZXM9bmV3IEksdGhpcy5fcmVzaXplU3Vic2NyaXB0aW9uPW0uRU1QVFksdGhpcy5fb2Zmc2V0WD0wLHRoaXMuX29mZnNldFk9MCx0aGlzLl9hcHBsaWVkUGFuZWxDbGFzc2VzPVtdLHRoaXMucG9zaXRpb25DaGFuZ2VzPXRoaXMuX3Bvc2l0aW9uQ2hhbmdlcyx0aGlzLnNldE9yaWdpbih0KX1nZXQgcG9zaXRpb25zKCl7cmV0dXJuIHRoaXMuX3ByZWZlcnJlZFBvc2l0aW9uc31hdHRhY2godCl7aWYodGhpcy5fb3ZlcmxheVJlZiYmdCE9PXRoaXMuX292ZXJsYXlSZWYmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSl0aHJvdyBFcnJvcigiVGhpcyBwb3NpdGlvbiBzdHJhdGVneSBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIGFuIG92ZXJsYXkiKTt0aGlzLl92YWxpZGF0ZVBvc2l0aW9ucygpLHQuaG9zdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0TCksdGhpcy5fb3ZlcmxheVJlZj10LHRoaXMuX2JvdW5kaW5nQm94PXQuaG9zdEVsZW1lbnQsdGhpcy5fcGFuZT10Lm92ZXJsYXlFbGVtZW50LHRoaXMuX2lzRGlzcG9zZWQ9ITEsdGhpcy5faXNJbml0aWFsUmVuZGVyPSEwLHRoaXMuX2xhc3RQb3NpdGlvbj1udWxsLHRoaXMuX3Jlc2l6ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX3Jlc2l6ZVN1YnNjcmlwdGlvbj10aGlzLl92aWV3cG9ydFJ1bGVyLmNoYW5nZSgpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLl9pc0luaXRpYWxSZW5kZXI9ITAsdGhpcy5hcHBseSgpfSkpfWFwcGx5KCl7aWYodGhpcy5faXNEaXNwb3NlZHx8IXRoaXMuX3BsYXRmb3JtLmlzQnJvd3NlcilyZXR1cm47aWYoIXRoaXMuX2lzSW5pdGlhbFJlbmRlciYmdGhpcy5fcG9zaXRpb25Mb2NrZWQmJnRoaXMuX2xhc3RQb3NpdGlvbilyZXR1cm4gdm9pZCB0aGlzLnJlYXBwbHlMYXN0UG9zaXRpb24oKTt0aGlzLl9jbGVhclBhbmVsQ2xhc3NlcygpLHRoaXMuX3Jlc2V0T3ZlcmxheUVsZW1lbnRTdHlsZXMoKSx0aGlzLl9yZXNldEJvdW5kaW5nQm94U3R5bGVzKCksdGhpcy5fdmlld3BvcnRSZWN0PXRoaXMuX2dldE5hcnJvd2VkVmlld3BvcnRSZWN0KCksdGhpcy5fb3JpZ2luUmVjdD10aGlzLl9nZXRPcmlnaW5SZWN0KCksdGhpcy5fb3ZlcmxheVJlY3Q9dGhpcy5fcGFuZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCB0PXRoaXMuX29yaWdpblJlY3QsZT10aGlzLl9vdmVybGF5UmVjdCxuPXRoaXMuX3ZpZXdwb3J0UmVjdCxvPVtdO2xldCBpO2ZvcihsZXQgYSBvZiB0aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnMpe2xldCByPXRoaXMuX2dldE9yaWdpblBvaW50KHQsYSkscz10aGlzLl9nZXRPdmVybGF5UG9pbnQocixlLGEpLGw9dGhpcy5fZ2V0T3ZlcmxheUZpdChzLGUsbixhKTtpZihsLmlzQ29tcGxldGVseVdpdGhpblZpZXdwb3J0KXJldHVybiB0aGlzLl9pc1B1c2hlZD0hMSx2b2lkIHRoaXMuX2FwcGx5UG9zaXRpb24oYSxyKTt0aGlzLl9jYW5GaXRXaXRoRmxleGlibGVEaW1lbnNpb25zKGwscyxuKT9vLnB1c2goe3Bvc2l0aW9uOmEsb3JpZ2luOnIsb3ZlcmxheVJlY3Q6ZSxib3VuZGluZ0JveFJlY3Q6dGhpcy5fY2FsY3VsYXRlQm91bmRpbmdCb3hSZWN0KHIsYSl9KTooIWl8fGkub3ZlcmxheUZpdC52aXNpYmxlQXJlYTxsLnZpc2libGVBcmVhKSYmKGk9e292ZXJsYXlGaXQ6bCxvdmVybGF5UG9pbnQ6cyxvcmlnaW5Qb2ludDpyLHBvc2l0aW9uOmEsb3ZlcmxheVJlY3Q6ZX0pfWlmKG8ubGVuZ3RoKXtsZXQgdD1udWxsLGU9LTE7Zm9yKGNvbnN0IG4gb2Ygbyl7Y29uc3Qgbz1uLmJvdW5kaW5nQm94UmVjdC53aWR0aCpuLmJvdW5kaW5nQm94UmVjdC5oZWlnaHQqKG4ucG9zaXRpb24ud2VpZ2h0fHwxKTtvPmUmJihlPW8sdD1uKX1yZXR1cm4gdGhpcy5faXNQdXNoZWQ9ITEsdm9pZCB0aGlzLl9hcHBseVBvc2l0aW9uKHQucG9zaXRpb24sdC5vcmlnaW4pfWlmKHRoaXMuX2NhblB1c2gpcmV0dXJuIHRoaXMuX2lzUHVzaGVkPSEwLHZvaWQgdGhpcy5fYXBwbHlQb3NpdGlvbihpLnBvc2l0aW9uLGkub3JpZ2luUG9pbnQpO3RoaXMuX2FwcGx5UG9zaXRpb24oaS5wb3NpdGlvbixpLm9yaWdpblBvaW50KX1kZXRhY2goKXt0aGlzLl9jbGVhclBhbmVsQ2xhc3NlcygpLHRoaXMuX2xhc3RQb3NpdGlvbj1udWxsLHRoaXMuX3ByZXZpb3VzUHVzaEFtb3VudD1udWxsLHRoaXMuX3Jlc2l6ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpfWRpc3Bvc2UoKXt0aGlzLl9pc0Rpc3Bvc2VkfHwodGhpcy5fYm91bmRpbmdCb3gmJm9MKHRoaXMuX2JvdW5kaW5nQm94LnN0eWxlLHt0b3A6IiIsbGVmdDoiIixyaWdodDoiIixib3R0b206IiIsaGVpZ2h0OiIiLHdpZHRoOiIiLGFsaWduSXRlbXM6IiIsanVzdGlmeUNvbnRlbnQ6IiJ9KSx0aGlzLl9wYW5lJiZ0aGlzLl9yZXNldE92ZXJsYXlFbGVtZW50U3R5bGVzKCksdGhpcy5fb3ZlcmxheVJlZiYmdGhpcy5fb3ZlcmxheVJlZi5ob3N0RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHRMKSx0aGlzLmRldGFjaCgpLHRoaXMuX3Bvc2l0aW9uQ2hhbmdlcy5jb21wbGV0ZSgpLHRoaXMuX292ZXJsYXlSZWY9dGhpcy5fYm91bmRpbmdCb3g9bnVsbCx0aGlzLl9pc0Rpc3Bvc2VkPSEwKX1yZWFwcGx5TGFzdFBvc2l0aW9uKCl7aWYoIXRoaXMuX2lzRGlzcG9zZWQmJighdGhpcy5fcGxhdGZvcm18fHRoaXMuX3BsYXRmb3JtLmlzQnJvd3Nlcikpe3RoaXMuX29yaWdpblJlY3Q9dGhpcy5fZ2V0T3JpZ2luUmVjdCgpLHRoaXMuX292ZXJsYXlSZWN0PXRoaXMuX3BhbmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdGhpcy5fdmlld3BvcnRSZWN0PXRoaXMuX2dldE5hcnJvd2VkVmlld3BvcnRSZWN0KCk7Y29uc3QgdD10aGlzLl9sYXN0UG9zaXRpb258fHRoaXMuX3ByZWZlcnJlZFBvc2l0aW9uc1swXSxlPXRoaXMuX2dldE9yaWdpblBvaW50KHRoaXMuX29yaWdpblJlY3QsdCk7dGhpcy5fYXBwbHlQb3NpdGlvbih0LGUpfX13aXRoU2Nyb2xsYWJsZUNvbnRhaW5lcnModCl7cmV0dXJuIHRoaXMuX3Njcm9sbGFibGVzPXQsdGhpc313aXRoUG9zaXRpb25zKHQpe3JldHVybiB0aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnM9dCwtMT09PXQuaW5kZXhPZih0aGlzLl9sYXN0UG9zaXRpb24pJiYodGhpcy5fbGFzdFBvc2l0aW9uPW51bGwpLHRoaXMuX3ZhbGlkYXRlUG9zaXRpb25zKCksdGhpc313aXRoVmlld3BvcnRNYXJnaW4odCl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0TWFyZ2luPXQsdGhpc313aXRoRmxleGlibGVEaW1lbnNpb25zKHQ9ITApe3JldHVybiB0aGlzLl9oYXNGbGV4aWJsZURpbWVuc2lvbnM9dCx0aGlzfXdpdGhHcm93QWZ0ZXJPcGVuKHQ9ITApe3JldHVybiB0aGlzLl9ncm93QWZ0ZXJPcGVuPXQsdGhpc313aXRoUHVzaCh0PSEwKXtyZXR1cm4gdGhpcy5fY2FuUHVzaD10LHRoaXN9d2l0aExvY2tlZFBvc2l0aW9uKHQ9ITApe3JldHVybiB0aGlzLl9wb3NpdGlvbkxvY2tlZD10LHRoaXN9c2V0T3JpZ2luKHQpe3JldHVybiB0aGlzLl9vcmlnaW49dCx0aGlzfXdpdGhEZWZhdWx0T2Zmc2V0WCh0KXtyZXR1cm4gdGhpcy5fb2Zmc2V0WD10LHRoaXN9d2l0aERlZmF1bHRPZmZzZXRZKHQpe3JldHVybiB0aGlzLl9vZmZzZXRZPXQsdGhpc313aXRoVHJhbnNmb3JtT3JpZ2luT24odCl7cmV0dXJuIHRoaXMuX3RyYW5zZm9ybU9yaWdpblNlbGVjdG9yPXQsdGhpc31fZ2V0T3JpZ2luUG9pbnQodCxlKXtsZXQgbixvO2lmKCJjZW50ZXIiPT1lLm9yaWdpblgpbj10LmxlZnQrdC53aWR0aC8yO2Vsc2V7Y29uc3Qgbz10aGlzLl9pc1J0bCgpP3QucmlnaHQ6dC5sZWZ0LGk9dGhpcy5faXNSdGwoKT90LmxlZnQ6dC5yaWdodDtuPSJzdGFydCI9PWUub3JpZ2luWD9vOml9cmV0dXJuIG89ImNlbnRlciI9PWUub3JpZ2luWT90LnRvcCt0LmhlaWdodC8yOiJ0b3AiPT1lLm9yaWdpblk/dC50b3A6dC5ib3R0b20se3g6bix5Om99fV9nZXRPdmVybGF5UG9pbnQodCxlLG4pe2xldCBvLGk7cmV0dXJuIG89ImNlbnRlciI9PW4ub3ZlcmxheVg/LWUud2lkdGgvMjoic3RhcnQiPT09bi5vdmVybGF5WD90aGlzLl9pc1J0bCgpPy1lLndpZHRoOjA6dGhpcy5faXNSdGwoKT8wOi1lLndpZHRoLGk9ImNlbnRlciI9PW4ub3ZlcmxheVk/LWUuaGVpZ2h0LzI6InRvcCI9PW4ub3ZlcmxheVk/MDotZS5oZWlnaHQse3g6dC54K28seTp0LnkraX19X2dldE92ZXJsYXlGaXQodCxlLG4sbyl7Y29uc3QgaT1hTChlKTtsZXR7eDphLHk6cn09dCxzPXRoaXMuX2dldE9mZnNldChvLCJ4IiksbD10aGlzLl9nZXRPZmZzZXQobywieSIpO3MmJihhKz1zKSxsJiYocis9bCk7bGV0IGM9MC1yLGQ9citpLmhlaWdodC1uLmhlaWdodCxwPXRoaXMuX3N1YnRyYWN0T3ZlcmZsb3dzKGkud2lkdGgsMC1hLGEraS53aWR0aC1uLndpZHRoKSxtPXRoaXMuX3N1YnRyYWN0T3ZlcmZsb3dzKGkuaGVpZ2h0LGMsZCksdT1wKm07cmV0dXJue3Zpc2libGVBcmVhOnUsaXNDb21wbGV0ZWx5V2l0aGluVmlld3BvcnQ6aS53aWR0aCppLmhlaWdodD09PXUsZml0c0luVmlld3BvcnRWZXJ0aWNhbGx5Om09PT1pLmhlaWdodCxmaXRzSW5WaWV3cG9ydEhvcml6b250YWxseTpwPT1pLndpZHRofX1fY2FuRml0V2l0aEZsZXhpYmxlRGltZW5zaW9ucyh0LGUsbil7aWYodGhpcy5faGFzRmxleGlibGVEaW1lbnNpb25zKXtjb25zdCBvPW4uYm90dG9tLWUueSxpPW4ucmlnaHQtZS54LGE9aUwodGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKS5taW5IZWlnaHQpLHI9aUwodGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKS5taW5XaWR0aCkscz10LmZpdHNJblZpZXdwb3J0SG9yaXpvbnRhbGx5fHxudWxsIT1yJiZyPD1pO3JldHVybih0LmZpdHNJblZpZXdwb3J0VmVydGljYWxseXx8bnVsbCE9YSYmYTw9bykmJnN9cmV0dXJuITF9X3B1c2hPdmVybGF5T25TY3JlZW4odCxlLG4pe2lmKHRoaXMuX3ByZXZpb3VzUHVzaEFtb3VudCYmdGhpcy5fcG9zaXRpb25Mb2NrZWQpcmV0dXJue3g6dC54K3RoaXMuX3ByZXZpb3VzUHVzaEFtb3VudC54LHk6dC55K3RoaXMuX3ByZXZpb3VzUHVzaEFtb3VudC55fTtjb25zdCBvPWFMKGUpLGk9dGhpcy5fdmlld3BvcnRSZWN0LGE9TWF0aC5tYXgodC54K28ud2lkdGgtaS53aWR0aCwwKSxyPU1hdGgubWF4KHQueStvLmhlaWdodC1pLmhlaWdodCwwKSxzPU1hdGgubWF4KGkudG9wLW4udG9wLXQueSwwKSxsPU1hdGgubWF4KGkubGVmdC1uLmxlZnQtdC54LDApO2xldCBjPTAsZD0wO3JldHVybiBjPW8ud2lkdGg8PWkud2lkdGg/bHx8LWE6dC54PHRoaXMuX3ZpZXdwb3J0TWFyZ2luP2kubGVmdC1uLmxlZnQtdC54OjAsZD1vLmhlaWdodDw9aS5oZWlnaHQ/c3x8LXI6dC55PHRoaXMuX3ZpZXdwb3J0TWFyZ2luP2kudG9wLW4udG9wLXQueTowLHRoaXMuX3ByZXZpb3VzUHVzaEFtb3VudD17eDpjLHk6ZH0se3g6dC54K2MseTp0LnkrZH19X2FwcGx5UG9zaXRpb24odCxlKXtpZih0aGlzLl9zZXRUcmFuc2Zvcm1PcmlnaW4odCksdGhpcy5fc2V0T3ZlcmxheUVsZW1lbnRTdHlsZXMoZSx0KSx0aGlzLl9zZXRCb3VuZGluZ0JveFN0eWxlcyhlLHQpLHQucGFuZWxDbGFzcyYmdGhpcy5fYWRkUGFuZWxDbGFzc2VzKHQucGFuZWxDbGFzcyksdGhpcy5fbGFzdFBvc2l0aW9uPXQsdGhpcy5fcG9zaXRpb25DaGFuZ2VzLm9ic2VydmVycy5sZW5ndGgpe2NvbnN0IGU9dGhpcy5fZ2V0U2Nyb2xsVmlzaWJpbGl0eSgpLG49bmV3IEdGKHQsZSk7dGhpcy5fcG9zaXRpb25DaGFuZ2VzLm5leHQobil9dGhpcy5faXNJbml0aWFsUmVuZGVyPSExfV9zZXRUcmFuc2Zvcm1PcmlnaW4odCl7aWYoIXRoaXMuX3RyYW5zZm9ybU9yaWdpblNlbGVjdG9yKXJldHVybjtjb25zdCBlPXRoaXMuX2JvdW5kaW5nQm94LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5fdHJhbnNmb3JtT3JpZ2luU2VsZWN0b3IpO2xldCBuLG89dC5vdmVybGF5WTtuPSJjZW50ZXIiPT09dC5vdmVybGF5WD8iY2VudGVyIjp0aGlzLl9pc1J0bCgpPyJzdGFydCI9PT10Lm92ZXJsYXlYPyJyaWdodCI6ImxlZnQiOiJzdGFydCI9PT10Lm92ZXJsYXlYPyJsZWZ0IjoicmlnaHQiO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0uc3R5bGUudHJhbnNmb3JtT3JpZ2luPWAke259ICR7b31gfV9jYWxjdWxhdGVCb3VuZGluZ0JveFJlY3QodCxlKXtjb25zdCBuPXRoaXMuX3ZpZXdwb3J0UmVjdCxvPXRoaXMuX2lzUnRsKCk7bGV0IGksYSxyLHMsbCxjO2lmKCJ0b3AiPT09ZS5vdmVybGF5WSlhPXQueSxpPW4uaGVpZ2h0LWErdGhpcy5fdmlld3BvcnRNYXJnaW47ZWxzZSBpZigiYm90dG9tIj09PWUub3ZlcmxheVkpcj1uLmhlaWdodC10LnkrMip0aGlzLl92aWV3cG9ydE1hcmdpbixpPW4uaGVpZ2h0LXIrdGhpcy5fdmlld3BvcnRNYXJnaW47ZWxzZXtjb25zdCBlPU1hdGgubWluKG4uYm90dG9tLXQueStuLnRvcCx0LnkpLG89dGhpcy5fbGFzdEJvdW5kaW5nQm94U2l6ZS5oZWlnaHQ7aT0yKmUsYT10LnktZSxpPm8mJiF0aGlzLl9pc0luaXRpYWxSZW5kZXImJiF0aGlzLl9ncm93QWZ0ZXJPcGVuJiYoYT10Lnktby8yKX1pZigiZW5kIj09PWUub3ZlcmxheVgmJiFvfHwic3RhcnQiPT09ZS5vdmVybGF5WCYmbyljPW4ud2lkdGgtdC54K3RoaXMuX3ZpZXdwb3J0TWFyZ2luLHM9dC54LXRoaXMuX3ZpZXdwb3J0TWFyZ2luO2Vsc2UgaWYoInN0YXJ0Ij09PWUub3ZlcmxheVgmJiFvfHwiZW5kIj09PWUub3ZlcmxheVgmJm8pbD10Lngscz1uLnJpZ2h0LXQueDtlbHNle2NvbnN0IGU9TWF0aC5taW4obi5yaWdodC10Lngrbi5sZWZ0LHQueCksbz10aGlzLl9sYXN0Qm91bmRpbmdCb3hTaXplLndpZHRoO3M9MiplLGw9dC54LWUscz5vJiYhdGhpcy5faXNJbml0aWFsUmVuZGVyJiYhdGhpcy5fZ3Jvd0FmdGVyT3BlbiYmKGw9dC54LW8vMil9cmV0dXJue3RvcDphLGxlZnQ6bCxib3R0b206cixyaWdodDpjLHdpZHRoOnMsaGVpZ2h0Oml9fV9zZXRCb3VuZGluZ0JveFN0eWxlcyh0LGUpe2NvbnN0IG49dGhpcy5fY2FsY3VsYXRlQm91bmRpbmdCb3hSZWN0KHQsZSk7dGhpcy5faXNJbml0aWFsUmVuZGVyfHx0aGlzLl9ncm93QWZ0ZXJPcGVufHwobi5oZWlnaHQ9TWF0aC5taW4obi5oZWlnaHQsdGhpcy5fbGFzdEJvdW5kaW5nQm94U2l6ZS5oZWlnaHQpLG4ud2lkdGg9TWF0aC5taW4obi53aWR0aCx0aGlzLl9sYXN0Qm91bmRpbmdCb3hTaXplLndpZHRoKSk7Y29uc3Qgbz17fTtpZih0aGlzLl9oYXNFeGFjdFBvc2l0aW9uKCkpby50b3A9by5sZWZ0PSIwIixvLmJvdHRvbT1vLnJpZ2h0PW8ubWF4SGVpZ2h0PW8ubWF4V2lkdGg9IiIsby53aWR0aD1vLmhlaWdodD0iMTAwJSI7ZWxzZXtjb25zdCB0PXRoaXMuX292ZXJsYXlSZWYuZ2V0Q29uZmlnKCkubWF4SGVpZ2h0LGk9dGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKS5tYXhXaWR0aDtvLmhlaWdodD12eihuLmhlaWdodCksby50b3A9dnoobi50b3ApLG8uYm90dG9tPXZ6KG4uYm90dG9tKSxvLndpZHRoPXZ6KG4ud2lkdGgpLG8ubGVmdD12eihuLmxlZnQpLG8ucmlnaHQ9dnoobi5yaWdodCksby5hbGlnbkl0ZW1zPSJjZW50ZXIiPT09ZS5vdmVybGF5WD8iY2VudGVyIjoiZW5kIj09PWUub3ZlcmxheVg/ImZsZXgtZW5kIjoiZmxleC1zdGFydCIsby5qdXN0aWZ5Q29udGVudD0iY2VudGVyIj09PWUub3ZlcmxheVk/ImNlbnRlciI6ImJvdHRvbSI9PT1lLm92ZXJsYXlZPyJmbGV4LWVuZCI6ImZsZXgtc3RhcnQiLHQmJihvLm1heEhlaWdodD12eih0KSksaSYmKG8ubWF4V2lkdGg9dnooaSkpfXRoaXMuX2xhc3RCb3VuZGluZ0JveFNpemU9bixvTCh0aGlzLl9ib3VuZGluZ0JveC5zdHlsZSxvKX1fcmVzZXRCb3VuZGluZ0JveFN0eWxlcygpe29MKHRoaXMuX2JvdW5kaW5nQm94LnN0eWxlLHt0b3A6IjAiLGxlZnQ6IjAiLHJpZ2h0OiIwIixib3R0b206IjAiLGhlaWdodDoiIix3aWR0aDoiIixhbGlnbkl0ZW1zOiIiLGp1c3RpZnlDb250ZW50OiIifSl9X3Jlc2V0T3ZlcmxheUVsZW1lbnRTdHlsZXMoKXtvTCh0aGlzLl9wYW5lLnN0eWxlLHt0b3A6IiIsbGVmdDoiIixib3R0b206IiIscmlnaHQ6IiIscG9zaXRpb246IiIsdHJhbnNmb3JtOiIifSl9X3NldE92ZXJsYXlFbGVtZW50U3R5bGVzKHQsZSl7Y29uc3Qgbj17fSxvPXRoaXMuX2hhc0V4YWN0UG9zaXRpb24oKSxpPXRoaXMuX2hhc0ZsZXhpYmxlRGltZW5zaW9ucyxhPXRoaXMuX292ZXJsYXlSZWYuZ2V0Q29uZmlnKCk7aWYobyl7Y29uc3Qgbz10aGlzLl92aWV3cG9ydFJ1bGVyLmdldFZpZXdwb3J0U2Nyb2xsUG9zaXRpb24oKTtvTChuLHRoaXMuX2dldEV4YWN0T3ZlcmxheVkoZSx0LG8pKSxvTChuLHRoaXMuX2dldEV4YWN0T3ZlcmxheVgoZSx0LG8pKX1lbHNlIG4ucG9zaXRpb249InN0YXRpYyI7bGV0IHI9IiIscz10aGlzLl9nZXRPZmZzZXQoZSwieCIpLGw9dGhpcy5fZ2V0T2Zmc2V0KGUsInkiKTtzJiYocis9YHRyYW5zbGF0ZVgoJHtzfXB4KSBgKSxsJiYocis9YHRyYW5zbGF0ZVkoJHtsfXB4KWApLG4udHJhbnNmb3JtPXIudHJpbSgpLGEubWF4SGVpZ2h0JiYobz9uLm1heEhlaWdodD12eihhLm1heEhlaWdodCk6aSYmKG4ubWF4SGVpZ2h0PSIiKSksYS5tYXhXaWR0aCYmKG8/bi5tYXhXaWR0aD12eihhLm1heFdpZHRoKTppJiYobi5tYXhXaWR0aD0iIikpLG9MKHRoaXMuX3BhbmUuc3R5bGUsbil9X2dldEV4YWN0T3ZlcmxheVkodCxlLG4pe2xldCBvPXt0b3A6IiIsYm90dG9tOiIifSxpPXRoaXMuX2dldE92ZXJsYXlQb2ludChlLHRoaXMuX292ZXJsYXlSZWN0LHQpO3RoaXMuX2lzUHVzaGVkJiYoaT10aGlzLl9wdXNoT3ZlcmxheU9uU2NyZWVuKGksdGhpcy5fb3ZlcmxheVJlY3QsbikpO2xldCBhPXRoaXMuX292ZXJsYXlDb250YWluZXIuZ2V0Q29udGFpbmVyRWxlbWVudCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtyZXR1cm4gaS55LT1hLCJib3R0b20iPT09dC5vdmVybGF5WT9vLmJvdHRvbT10aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LShpLnkrdGhpcy5fb3ZlcmxheVJlY3QuaGVpZ2h0KSsicHgiOm8udG9wPXZ6KGkueSksb31fZ2V0RXhhY3RPdmVybGF5WCh0LGUsbil7bGV0IG8saT17bGVmdDoiIixyaWdodDoiIn0sYT10aGlzLl9nZXRPdmVybGF5UG9pbnQoZSx0aGlzLl9vdmVybGF5UmVjdCx0KTtyZXR1cm4gdGhpcy5faXNQdXNoZWQmJihhPXRoaXMuX3B1c2hPdmVybGF5T25TY3JlZW4oYSx0aGlzLl9vdmVybGF5UmVjdCxuKSksbz10aGlzLl9pc1J0bCgpPyJlbmQiPT09dC5vdmVybGF5WD8ibGVmdCI6InJpZ2h0IjoiZW5kIj09PXQub3ZlcmxheVg/InJpZ2h0IjoibGVmdCIsInJpZ2h0Ij09PW8/aS5yaWdodD10aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgtKGEueCt0aGlzLl9vdmVybGF5UmVjdC53aWR0aCkrInB4IjppLmxlZnQ9dnooYS54KSxpfV9nZXRTY3JvbGxWaXNpYmlsaXR5KCl7Y29uc3QgdD10aGlzLl9nZXRPcmlnaW5SZWN0KCksZT10aGlzLl9wYW5lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49dGhpcy5fc2Nyb2xsYWJsZXMubWFwKCh0PT50LmdldEVsZW1lbnRSZWYoKS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSk7cmV0dXJue2lzT3JpZ2luQ2xpcHBlZDpGRih0LG4pLGlzT3JpZ2luT3V0c2lkZVZpZXc6SEYodCxuKSxpc092ZXJsYXlDbGlwcGVkOkZGKGUsbiksaXNPdmVybGF5T3V0c2lkZVZpZXc6SEYoZSxuKX19X3N1YnRyYWN0T3ZlcmZsb3dzKHQsLi4uZSl7cmV0dXJuIGUucmVkdWNlKCgodCxlKT0+dC1NYXRoLm1heChlLDApKSx0KX1fZ2V0TmFycm93ZWRWaWV3cG9ydFJlY3QoKXtjb25zdCB0PXRoaXMuX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCxlPXRoaXMuX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsbj10aGlzLl92aWV3cG9ydFJ1bGVyLmdldFZpZXdwb3J0U2Nyb2xsUG9zaXRpb24oKTtyZXR1cm57dG9wOm4udG9wK3RoaXMuX3ZpZXdwb3J0TWFyZ2luLGxlZnQ6bi5sZWZ0K3RoaXMuX3ZpZXdwb3J0TWFyZ2luLHJpZ2h0Om4ubGVmdCt0LXRoaXMuX3ZpZXdwb3J0TWFyZ2luLGJvdHRvbTpuLnRvcCtlLXRoaXMuX3ZpZXdwb3J0TWFyZ2luLHdpZHRoOnQtMip0aGlzLl92aWV3cG9ydE1hcmdpbixoZWlnaHQ6ZS0yKnRoaXMuX3ZpZXdwb3J0TWFyZ2lufX1faXNSdGwoKXtyZXR1cm4icnRsIj09PXRoaXMuX292ZXJsYXlSZWYuZ2V0RGlyZWN0aW9uKCl9X2hhc0V4YWN0UG9zaXRpb24oKXtyZXR1cm4hdGhpcy5faGFzRmxleGlibGVEaW1lbnNpb25zfHx0aGlzLl9pc1B1c2hlZH1fZ2V0T2Zmc2V0KHQsZSl7cmV0dXJuIngiPT09ZT9udWxsPT10Lm9mZnNldFg/dGhpcy5fb2Zmc2V0WDp0Lm9mZnNldFg6bnVsbD09dC5vZmZzZXRZP3RoaXMuX29mZnNldFk6dC5vZmZzZXRZfV92YWxpZGF0ZVBvc2l0aW9ucygpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpe2lmKCF0aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnMubGVuZ3RoKXRocm93IEVycm9yKCJGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3k6IEF0IGxlYXN0IG9uZSBwb3NpdGlvbiBpcyByZXF1aXJlZC4iKTt0aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnMuZm9yRWFjaCgodD0+e1lGKCJvcmlnaW5YIix0Lm9yaWdpblgpLFdGKCJvcmlnaW5ZIix0Lm9yaWdpblkpLFlGKCJvdmVybGF5WCIsdC5vdmVybGF5WCksV0YoIm92ZXJsYXlZIix0Lm92ZXJsYXlZKX0pKX19X2FkZFBhbmVsQ2xhc3Nlcyh0KXt0aGlzLl9wYW5lJiZNeih0KS5mb3JFYWNoKCh0PT57IiIhPT10JiYtMT09PXRoaXMuX2FwcGxpZWRQYW5lbENsYXNzZXMuaW5kZXhPZih0KSYmKHRoaXMuX2FwcGxpZWRQYW5lbENsYXNzZXMucHVzaCh0KSx0aGlzLl9wYW5lLmNsYXNzTGlzdC5hZGQodCkpfSkpfV9jbGVhclBhbmVsQ2xhc3Nlcygpe3RoaXMuX3BhbmUmJih0aGlzLl9hcHBsaWVkUGFuZWxDbGFzc2VzLmZvckVhY2goKHQ9Pnt0aGlzLl9wYW5lLmNsYXNzTGlzdC5yZW1vdmUodCl9KSksdGhpcy5fYXBwbGllZFBhbmVsQ2xhc3Nlcz1bXSl9X2dldE9yaWdpblJlY3QoKXtjb25zdCB0PXRoaXMuX29yaWdpbjtpZih0IGluc3RhbmNlb2YgaGcpcmV0dXJuIHQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZih0IGluc3RhbmNlb2YgRWxlbWVudClyZXR1cm4gdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCBlPXQud2lkdGh8fDAsbj10LmhlaWdodHx8MDtyZXR1cm57dG9wOnQueSxib3R0b206dC55K24sbGVmdDp0LngscmlnaHQ6dC54K2UsaGVpZ2h0Om4sd2lkdGg6ZX19fWZ1bmN0aW9uIG9MKHQsZSl7Zm9yKGxldCBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSk7cmV0dXJuIHR9ZnVuY3Rpb24gaUwodCl7aWYoIm51bWJlciIhPXR5cGVvZiB0JiZudWxsIT10KXtjb25zdFtlLG5dPXQuc3BsaXQoZUwpO3JldHVybiBuJiYicHgiIT09bj9udWxsOnBhcnNlRmxvYXQoZSl9cmV0dXJuIHR8fG51bGx9ZnVuY3Rpb24gYUwodCl7cmV0dXJue3RvcDpNYXRoLmZsb29yKHQudG9wKSxyaWdodDpNYXRoLmZsb29yKHQucmlnaHQpLGJvdHRvbTpNYXRoLmZsb29yKHQuYm90dG9tKSxsZWZ0Ok1hdGguZmxvb3IodC5sZWZ0KSx3aWR0aDpNYXRoLmZsb29yKHQud2lkdGgpLGhlaWdodDpNYXRoLmZsb29yKHQuaGVpZ2h0KX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIHJMe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIpe3RoaXMuX3ByZWZlcnJlZFBvc2l0aW9ucz1bXSx0aGlzLl9wb3NpdGlvblN0cmF0ZWd5PW5ldyBuTChuLG8saSxhLHIpLndpdGhGbGV4aWJsZURpbWVuc2lvbnMoITEpLndpdGhQdXNoKCExKS53aXRoVmlld3BvcnRNYXJnaW4oMCksdGhpcy53aXRoRmFsbGJhY2tQb3NpdGlvbih0LGUpLHRoaXMub25Qb3NpdGlvbkNoYW5nZT10aGlzLl9wb3NpdGlvblN0cmF0ZWd5LnBvc2l0aW9uQ2hhbmdlc31nZXQgcG9zaXRpb25zKCl7cmV0dXJuIHRoaXMuX3ByZWZlcnJlZFBvc2l0aW9uc31hdHRhY2godCl7dGhpcy5fb3ZlcmxheVJlZj10LHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kuYXR0YWNoKHQpLHRoaXMuX2RpcmVjdGlvbiYmKHQuc2V0RGlyZWN0aW9uKHRoaXMuX2RpcmVjdGlvbiksdGhpcy5fZGlyZWN0aW9uPW51bGwpfWRpc3Bvc2UoKXt0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LmRpc3Bvc2UoKX1kZXRhY2goKXt0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LmRldGFjaCgpfWFwcGx5KCl7dGhpcy5fcG9zaXRpb25TdHJhdGVneS5hcHBseSgpfXJlY2FsY3VsYXRlTGFzdFBvc2l0aW9uKCl7dGhpcy5fcG9zaXRpb25TdHJhdGVneS5yZWFwcGx5TGFzdFBvc2l0aW9uKCl9d2l0aFNjcm9sbGFibGVDb250YWluZXJzKHQpe3RoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kud2l0aFNjcm9sbGFibGVDb250YWluZXJzKHQpfXdpdGhGYWxsYmFja1Bvc2l0aW9uKHQsZSxuLG8pe2NvbnN0IGk9bmV3IGpGKHQsZSxuLG8pO3JldHVybiB0aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnMucHVzaChpKSx0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LndpdGhQb3NpdGlvbnModGhpcy5fcHJlZmVycmVkUG9zaXRpb25zKSx0aGlzfXdpdGhEaXJlY3Rpb24odCl7cmV0dXJuIHRoaXMuX292ZXJsYXlSZWY/dGhpcy5fb3ZlcmxheVJlZi5zZXREaXJlY3Rpb24odCk6dGhpcy5fZGlyZWN0aW9uPXQsdGhpc313aXRoT2Zmc2V0WCh0KXtyZXR1cm4gdGhpcy5fcG9zaXRpb25TdHJhdGVneS53aXRoRGVmYXVsdE9mZnNldFgodCksdGhpc313aXRoT2Zmc2V0WSh0KXtyZXR1cm4gdGhpcy5fcG9zaXRpb25TdHJhdGVneS53aXRoRGVmYXVsdE9mZnNldFkodCksdGhpc313aXRoTG9ja2VkUG9zaXRpb24odCl7cmV0dXJuIHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kud2l0aExvY2tlZFBvc2l0aW9uKHQpLHRoaXN9d2l0aFBvc2l0aW9ucyh0KXtyZXR1cm4gdGhpcy5fcHJlZmVycmVkUG9zaXRpb25zPXQuc2xpY2UoKSx0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LndpdGhQb3NpdGlvbnModGhpcy5fcHJlZmVycmVkUG9zaXRpb25zKSx0aGlzfXNldE9yaWdpbih0KXtyZXR1cm4gdGhpcy5fcG9zaXRpb25TdHJhdGVneS5zZXRPcmlnaW4odCksdGhpc319Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NvbnN0IHNMPSJjZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlciI7Y2xhc3MgbEx7Y29uc3RydWN0b3IoKXt0aGlzLl9jc3NQb3NpdGlvbj0ic3RhdGljIix0aGlzLl90b3BPZmZzZXQ9IiIsdGhpcy5fYm90dG9tT2Zmc2V0PSIiLHRoaXMuX2xlZnRPZmZzZXQ9IiIsdGhpcy5fcmlnaHRPZmZzZXQ9IiIsdGhpcy5fYWxpZ25JdGVtcz0iIix0aGlzLl9qdXN0aWZ5Q29udGVudD0iIix0aGlzLl93aWR0aD0iIix0aGlzLl9oZWlnaHQ9IiJ9YXR0YWNoKHQpe2NvbnN0IGU9dC5nZXRDb25maWcoKTt0aGlzLl9vdmVybGF5UmVmPXQsdGhpcy5fd2lkdGgmJiFlLndpZHRoJiZ0LnVwZGF0ZVNpemUoe3dpZHRoOnRoaXMuX3dpZHRofSksdGhpcy5faGVpZ2h0JiYhZS5oZWlnaHQmJnQudXBkYXRlU2l6ZSh7aGVpZ2h0OnRoaXMuX2hlaWdodH0pLHQuaG9zdEVsZW1lbnQuY2xhc3NMaXN0LmFkZChzTCksdGhpcy5faXNEaXNwb3NlZD0hMX10b3AodD0iIil7cmV0dXJuIHRoaXMuX2JvdHRvbU9mZnNldD0iIix0aGlzLl90b3BPZmZzZXQ9dCx0aGlzLl9hbGlnbkl0ZW1zPSJmbGV4LXN0YXJ0Iix0aGlzfWxlZnQodD0iIil7cmV0dXJuIHRoaXMuX3JpZ2h0T2Zmc2V0PSIiLHRoaXMuX2xlZnRPZmZzZXQ9dCx0aGlzLl9qdXN0aWZ5Q29udGVudD0iZmxleC1zdGFydCIsdGhpc31ib3R0b20odD0iIil7cmV0dXJuIHRoaXMuX3RvcE9mZnNldD0iIix0aGlzLl9ib3R0b21PZmZzZXQ9dCx0aGlzLl9hbGlnbkl0ZW1zPSJmbGV4LWVuZCIsdGhpc31yaWdodCh0PSIiKXtyZXR1cm4gdGhpcy5fbGVmdE9mZnNldD0iIix0aGlzLl9yaWdodE9mZnNldD10LHRoaXMuX2p1c3RpZnlDb250ZW50PSJmbGV4LWVuZCIsdGhpc313aWR0aCh0PSIiKXtyZXR1cm4gdGhpcy5fb3ZlcmxheVJlZj90aGlzLl9vdmVybGF5UmVmLnVwZGF0ZVNpemUoe3dpZHRoOnR9KTp0aGlzLl93aWR0aD10LHRoaXN9aGVpZ2h0KHQ9IiIpe3JldHVybiB0aGlzLl9vdmVybGF5UmVmP3RoaXMuX292ZXJsYXlSZWYudXBkYXRlU2l6ZSh7aGVpZ2h0OnR9KTp0aGlzLl9oZWlnaHQ9dCx0aGlzfWNlbnRlckhvcml6b250YWxseSh0PSIiKXtyZXR1cm4gdGhpcy5sZWZ0KHQpLHRoaXMuX2p1c3RpZnlDb250ZW50PSJjZW50ZXIiLHRoaXN9Y2VudGVyVmVydGljYWxseSh0PSIiKXtyZXR1cm4gdGhpcy50b3AodCksdGhpcy5fYWxpZ25JdGVtcz0iY2VudGVyIix0aGlzfWFwcGx5KCl7aWYoIXRoaXMuX292ZXJsYXlSZWZ8fCF0aGlzLl9vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkpcmV0dXJuO2NvbnN0IHQ9dGhpcy5fb3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5zdHlsZSxlPXRoaXMuX292ZXJsYXlSZWYuaG9zdEVsZW1lbnQuc3R5bGUsbj10aGlzLl9vdmVybGF5UmVmLmdldENvbmZpZygpLHt3aWR0aDpvLGhlaWdodDppLG1heFdpZHRoOmEsbWF4SGVpZ2h0OnJ9PW4scz0hKCIxMDAlIiE9PW8mJiIxMDB2dyIhPT1vfHxhJiYiMTAwJSIhPT1hJiYiMTAwdnciIT09YSksbD0hKCIxMDAlIiE9PWkmJiIxMDB2aCIhPT1pfHxyJiYiMTAwJSIhPT1yJiYiMTAwdmgiIT09cik7dC5wb3NpdGlvbj10aGlzLl9jc3NQb3NpdGlvbix0Lm1hcmdpbkxlZnQ9cz8iMCI6dGhpcy5fbGVmdE9mZnNldCx0Lm1hcmdpblRvcD1sPyIwIjp0aGlzLl90b3BPZmZzZXQsdC5tYXJnaW5Cb3R0b209dGhpcy5fYm90dG9tT2Zmc2V0LHQubWFyZ2luUmlnaHQ9dGhpcy5fcmlnaHRPZmZzZXQscz9lLmp1c3RpZnlDb250ZW50PSJmbGV4LXN0YXJ0IjoiY2VudGVyIj09PXRoaXMuX2p1c3RpZnlDb250ZW50P2UuanVzdGlmeUNvbnRlbnQ9ImNlbnRlciI6InJ0bCI9PT10aGlzLl9vdmVybGF5UmVmLmdldENvbmZpZygpLmRpcmVjdGlvbj8iZmxleC1zdGFydCI9PT10aGlzLl9qdXN0aWZ5Q29udGVudD9lLmp1c3RpZnlDb250ZW50PSJmbGV4LWVuZCI6ImZsZXgtZW5kIj09PXRoaXMuX2p1c3RpZnlDb250ZW50JiYoZS5qdXN0aWZ5Q29udGVudD0iZmxleC1zdGFydCIpOmUuanVzdGlmeUNvbnRlbnQ9dGhpcy5fanVzdGlmeUNvbnRlbnQsZS5hbGlnbkl0ZW1zPWw/ImZsZXgtc3RhcnQiOnRoaXMuX2FsaWduSXRlbXN9ZGlzcG9zZSgpe2lmKHRoaXMuX2lzRGlzcG9zZWR8fCF0aGlzLl9vdmVybGF5UmVmKXJldHVybjtjb25zdCB0PXRoaXMuX292ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuc3R5bGUsZT10aGlzLl9vdmVybGF5UmVmLmhvc3RFbGVtZW50LG49ZS5zdHlsZTtlLmNsYXNzTGlzdC5yZW1vdmUoc0wpLG4uanVzdGlmeUNvbnRlbnQ9bi5hbGlnbkl0ZW1zPXQubWFyZ2luVG9wPXQubWFyZ2luQm90dG9tPXQubWFyZ2luTGVmdD10Lm1hcmdpblJpZ2h0PXQucG9zaXRpb249IiIsdGhpcy5fb3ZlcmxheVJlZj1udWxsLHRoaXMuX2lzRGlzcG9zZWQ9ITB9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBjTHtjb25zdHJ1Y3Rvcih0LGUsbixvKXt0aGlzLl92aWV3cG9ydFJ1bGVyPXQsdGhpcy5fZG9jdW1lbnQ9ZSx0aGlzLl9wbGF0Zm9ybT1uLHRoaXMuX292ZXJsYXlDb250YWluZXI9b31nbG9iYWwoKXtyZXR1cm4gbmV3IGxMfWNvbm5lY3RlZFRvKHQsZSxuKXtyZXR1cm4gbmV3IHJMKGUsbix0LHRoaXMuX3ZpZXdwb3J0UnVsZXIsdGhpcy5fZG9jdW1lbnQsdGhpcy5fcGxhdGZvcm0sdGhpcy5fb3ZlcmxheUNvbnRhaW5lcil9ZmxleGlibGVDb25uZWN0ZWRUbyh0KXtyZXR1cm4gbmV3IG5MKHQsdGhpcy5fdmlld3BvcnRSdWxlcix0aGlzLl9kb2N1bWVudCx0aGlzLl9wbGF0Zm9ybSx0aGlzLl9vdmVybGF5Q29udGFpbmVyKX19Y0wuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGNMKSh2cih1RiksdnIoWl8pLHZyKHd6KSx2cihRRikpfSxjTC7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgY0wodnIodUYpLHZyKFpfKSx2cih3eiksdnIoUUYpKX0sdG9rZW46Y0wscHJvdmlkZWRJbjoicm9vdCJ9KSxjTC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnVGfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOnd6fSx7dHlwZTpRRn1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoY0wsW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOiJyb290In1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnVGfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOnd6fSx7dHlwZTpRRn1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpsZXQgZEw9MDtjbGFzcyBwTHtjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyLHMsbCxjLGQpe3RoaXMuc2Nyb2xsU3RyYXRlZ2llcz10LHRoaXMuX292ZXJsYXlDb250YWluZXI9ZSx0aGlzLl9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI9bix0aGlzLl9wb3NpdGlvbkJ1aWxkZXI9byx0aGlzLl9rZXlib2FyZERpc3BhdGNoZXI9aSx0aGlzLl9pbmplY3Rvcj1hLHRoaXMuX25nWm9uZT1yLHRoaXMuX2RvY3VtZW50PXMsdGhpcy5fZGlyZWN0aW9uYWxpdHk9bCx0aGlzLl9sb2NhdGlvbj1jLHRoaXMuX291dHNpZGVDbGlja0Rpc3BhdGNoZXI9ZH1jcmVhdGUodCl7Y29uc3QgZT10aGlzLl9jcmVhdGVIb3N0RWxlbWVudCgpLG49dGhpcy5fY3JlYXRlUGFuZUVsZW1lbnQoZSksbz10aGlzLl9jcmVhdGVQb3J0YWxPdXRsZXQobiksaT1uZXcgVkYodCk7cmV0dXJuIGkuZGlyZWN0aW9uPWkuZGlyZWN0aW9ufHx0aGlzLl9kaXJlY3Rpb25hbGl0eS52YWx1ZSxuZXcgJEYobyxlLG4saSx0aGlzLl9uZ1pvbmUsdGhpcy5fa2V5Ym9hcmREaXNwYXRjaGVyLHRoaXMuX2RvY3VtZW50LHRoaXMuX2xvY2F0aW9uLHRoaXMuX291dHNpZGVDbGlja0Rpc3BhdGNoZXIpfXBvc2l0aW9uKCl7cmV0dXJuIHRoaXMuX3Bvc2l0aW9uQnVpbGRlcn1fY3JlYXRlUGFuZUVsZW1lbnQodCl7Y29uc3QgZT10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gZS5pZD0iY2RrLW92ZXJsYXktIitkTCsrLGUuY2xhc3NMaXN0LmFkZCgiY2RrLW92ZXJsYXktcGFuZSIpLHQuYXBwZW5kQ2hpbGQoZSksZX1fY3JlYXRlSG9zdEVsZW1lbnQoKXtjb25zdCB0PXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiB0aGlzLl9vdmVybGF5Q29udGFpbmVyLmdldENvbnRhaW5lckVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0KSx0fV9jcmVhdGVQb3J0YWxPdXRsZXQodCl7cmV0dXJuIHRoaXMuX2FwcFJlZnx8KHRoaXMuX2FwcFJlZj10aGlzLl9pbmplY3Rvci5nZXQoT18pKSxuZXcgd0YodCx0aGlzLl9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsdGhpcy5fYXBwUmVmLHRoaXMuX2luamVjdG9yLHRoaXMuX2RvY3VtZW50KX19cEwuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHBMKSh2cihCRiksdnIoUUYpLHZyKHVnKSx2cihjTCksdnIoWkYpLHZyKHJwKSx2cihhXyksdnIoWl8pLHZyKEhJKSx2cihsQyksdnIoWEYpKX0scEwuybVwcm92PU1uKHt0b2tlbjpwTCxmYWN0b3J5OnBMLsm1ZmFjfSkscEwuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpCRn0se3R5cGU6UUZ9LHt0eXBlOnVnfSx7dHlwZTpjTH0se3R5cGU6WkZ9LHt0eXBlOnJwfSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTpISX0se3R5cGU6bEN9LHt0eXBlOlhGfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChwTCxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6QkZ9LHt0eXBlOlFGfSx7dHlwZTp1Z30se3R5cGU6Y0x9LHt0eXBlOlpGfSx7dHlwZTpycH0se3R5cGU6YV99LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6SEl9LHt0eXBlOmxDfSx7dHlwZTpYRn1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBtTD1be29yaWdpblg6InN0YXJ0IixvcmlnaW5ZOiJib3R0b20iLG92ZXJsYXlYOiJzdGFydCIsb3ZlcmxheVk6InRvcCJ9LHtvcmlnaW5YOiJzdGFydCIsb3JpZ2luWToidG9wIixvdmVybGF5WDoic3RhcnQiLG92ZXJsYXlZOiJib3R0b20ifSx7b3JpZ2luWDoiZW5kIixvcmlnaW5ZOiJ0b3AiLG92ZXJsYXlYOiJlbmQiLG92ZXJsYXlZOiJib3R0b20ifSx7b3JpZ2luWDoiZW5kIixvcmlnaW5ZOiJib3R0b20iLG92ZXJsYXlYOiJlbmQiLG92ZXJsYXlZOiJ0b3AifV0sdUw9bmV3IEdhKCJjZGstY29ubmVjdGVkLW92ZXJsYXktc2Nyb2xsLXN0cmF0ZWd5Iik7Y2xhc3MgZkx7Y29uc3RydWN0b3IodCl7dGhpcy5lbGVtZW50UmVmPXR9fWZMLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxmTCkoU20oaGcpKX0sZkwuybVkaXI9bG8oe3R5cGU6Zkwsc2VsZWN0b3JzOltbIiIsImNkay1vdmVybGF5LW9yaWdpbiIsIiJdLFsiIiwib3ZlcmxheS1vcmlnaW4iLCIiXSxbIiIsImNka092ZXJsYXlPcmlnaW4iLCIiXV0sZXhwb3J0QXM6WyJjZGtPdmVybGF5T3JpZ2luIl19KSxmTC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChmTCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbY2RrLW92ZXJsYXktb3JpZ2luXSwgW292ZXJsYXktb3JpZ2luXSwgW2Nka092ZXJsYXlPcmlnaW5dIixleHBvcnRBczoiY2RrT3ZlcmxheU9yaWdpbiJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ31dfSksbnVsbCk7Y2xhc3MgZ0x7Y29uc3RydWN0b3IodCxlLG4sbyxpKXt0aGlzLl9vdmVybGF5PXQsdGhpcy5fZGlyPWksdGhpcy5faGFzQmFja2Ryb3A9ITEsdGhpcy5fbG9ja1Bvc2l0aW9uPSExLHRoaXMuX2dyb3dBZnRlck9wZW49ITEsdGhpcy5fZmxleGlibGVEaW1lbnNpb25zPSExLHRoaXMuX3B1c2g9ITEsdGhpcy5fYmFja2Ryb3BTdWJzY3JpcHRpb249bS5FTVBUWSx0aGlzLl9hdHRhY2hTdWJzY3JpcHRpb249bS5FTVBUWSx0aGlzLl9kZXRhY2hTdWJzY3JpcHRpb249bS5FTVBUWSx0aGlzLl9wb3NpdGlvblN1YnNjcmlwdGlvbj1tLkVNUFRZLHRoaXMudmlld3BvcnRNYXJnaW49MCx0aGlzLm9wZW49ITEsdGhpcy5kaXNhYmxlQ2xvc2U9ITEsdGhpcy5iYWNrZHJvcENsaWNrPW5ldyBMaCx0aGlzLnBvc2l0aW9uQ2hhbmdlPW5ldyBMaCx0aGlzLmF0dGFjaD1uZXcgTGgsdGhpcy5kZXRhY2g9bmV3IExoLHRoaXMub3ZlcmxheUtleWRvd249bmV3IExoLHRoaXMub3ZlcmxheU91dHNpZGVDbGljaz1uZXcgTGgsdGhpcy5fdGVtcGxhdGVQb3J0YWw9bmV3IHhGKGUsbiksdGhpcy5fc2Nyb2xsU3RyYXRlZ3lGYWN0b3J5PW8sdGhpcy5zY3JvbGxTdHJhdGVneT10aGlzLl9zY3JvbGxTdHJhdGVneUZhY3RvcnkoKX1nZXQgb2Zmc2V0WCgpe3JldHVybiB0aGlzLl9vZmZzZXRYfXNldCBvZmZzZXRYKHQpe3RoaXMuX29mZnNldFg9dCx0aGlzLl9wb3NpdGlvbiYmdGhpcy5fdXBkYXRlUG9zaXRpb25TdHJhdGVneSh0aGlzLl9wb3NpdGlvbil9Z2V0IG9mZnNldFkoKXtyZXR1cm4gdGhpcy5fb2Zmc2V0WX1zZXQgb2Zmc2V0WSh0KXt0aGlzLl9vZmZzZXRZPXQsdGhpcy5fcG9zaXRpb24mJnRoaXMuX3VwZGF0ZVBvc2l0aW9uU3RyYXRlZ3kodGhpcy5fcG9zaXRpb24pfWdldCBoYXNCYWNrZHJvcCgpe3JldHVybiB0aGlzLl9oYXNCYWNrZHJvcH1zZXQgaGFzQmFja2Ryb3AodCl7dGhpcy5faGFzQmFja2Ryb3A9eXoodCl9Z2V0IGxvY2tQb3NpdGlvbigpe3JldHVybiB0aGlzLl9sb2NrUG9zaXRpb259c2V0IGxvY2tQb3NpdGlvbih0KXt0aGlzLl9sb2NrUG9zaXRpb249eXoodCl9Z2V0IGZsZXhpYmxlRGltZW5zaW9ucygpe3JldHVybiB0aGlzLl9mbGV4aWJsZURpbWVuc2lvbnN9c2V0IGZsZXhpYmxlRGltZW5zaW9ucyh0KXt0aGlzLl9mbGV4aWJsZURpbWVuc2lvbnM9eXoodCl9Z2V0IGdyb3dBZnRlck9wZW4oKXtyZXR1cm4gdGhpcy5fZ3Jvd0FmdGVyT3Blbn1zZXQgZ3Jvd0FmdGVyT3Blbih0KXt0aGlzLl9ncm93QWZ0ZXJPcGVuPXl6KHQpfWdldCBwdXNoKCl7cmV0dXJuIHRoaXMuX3B1c2h9c2V0IHB1c2godCl7dGhpcy5fcHVzaD15eih0KX1nZXQgb3ZlcmxheVJlZigpe3JldHVybiB0aGlzLl9vdmVybGF5UmVmfWdldCBkaXIoKXtyZXR1cm4gdGhpcy5fZGlyP3RoaXMuX2Rpci52YWx1ZToibHRyIn1uZ09uRGVzdHJveSgpe3RoaXMuX2F0dGFjaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX2RldGFjaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX2JhY2tkcm9wU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5fcG9zaXRpb25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl9vdmVybGF5UmVmJiZ0aGlzLl9vdmVybGF5UmVmLmRpc3Bvc2UoKX1uZ09uQ2hhbmdlcyh0KXt0aGlzLl9wb3NpdGlvbiYmKHRoaXMuX3VwZGF0ZVBvc2l0aW9uU3RyYXRlZ3kodGhpcy5fcG9zaXRpb24pLHRoaXMuX292ZXJsYXlSZWYudXBkYXRlU2l6ZSh7d2lkdGg6dGhpcy53aWR0aCxtaW5XaWR0aDp0aGlzLm1pbldpZHRoLGhlaWdodDp0aGlzLmhlaWdodCxtaW5IZWlnaHQ6dGhpcy5taW5IZWlnaHR9KSx0Lm9yaWdpbiYmdGhpcy5vcGVuJiZ0aGlzLl9wb3NpdGlvbi5hcHBseSgpKSx0Lm9wZW4mJih0aGlzLm9wZW4/dGhpcy5fYXR0YWNoT3ZlcmxheSgpOnRoaXMuX2RldGFjaE92ZXJsYXkoKSl9X2NyZWF0ZU92ZXJsYXkoKXt0aGlzLnBvc2l0aW9ucyYmdGhpcy5wb3NpdGlvbnMubGVuZ3RofHwodGhpcy5wb3NpdGlvbnM9bUwpO2NvbnN0IHQ9dGhpcy5fb3ZlcmxheVJlZj10aGlzLl9vdmVybGF5LmNyZWF0ZSh0aGlzLl9idWlsZENvbmZpZygpKTt0aGlzLl9hdHRhY2hTdWJzY3JpcHRpb249dC5hdHRhY2htZW50cygpLnN1YnNjcmliZSgoKCk9PnRoaXMuYXR0YWNoLmVtaXQoKSkpLHRoaXMuX2RldGFjaFN1YnNjcmlwdGlvbj10LmRldGFjaG1lbnRzKCkuc3Vic2NyaWJlKCgoKT0+dGhpcy5kZXRhY2guZW1pdCgpKSksdC5rZXlkb3duRXZlbnRzKCkuc3Vic2NyaWJlKCh0PT57dGhpcy5vdmVybGF5S2V5ZG93bi5uZXh0KHQpLHQua2V5Q29kZSE9PXV6fHx0aGlzLmRpc2FibGVDbG9zZXx8YnoodCl8fCh0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fZGV0YWNoT3ZlcmxheSgpKX0pKSx0aGlzLl9vdmVybGF5UmVmLm91dHNpZGVQb2ludGVyRXZlbnRzKCkuc3Vic2NyaWJlKCh0PT57dGhpcy5vdmVybGF5T3V0c2lkZUNsaWNrLm5leHQodCl9KSl9X2J1aWxkQ29uZmlnKCl7Y29uc3QgdD10aGlzLl9wb3NpdGlvbj10aGlzLnBvc2l0aW9uU3RyYXRlZ3l8fHRoaXMuX2NyZWF0ZVBvc2l0aW9uU3RyYXRlZ3koKSxlPW5ldyBWRih7ZGlyZWN0aW9uOnRoaXMuX2Rpcixwb3NpdGlvblN0cmF0ZWd5OnQsc2Nyb2xsU3RyYXRlZ3k6dGhpcy5zY3JvbGxTdHJhdGVneSxoYXNCYWNrZHJvcDp0aGlzLmhhc0JhY2tkcm9wfSk7cmV0dXJuKHRoaXMud2lkdGh8fDA9PT10aGlzLndpZHRoKSYmKGUud2lkdGg9dGhpcy53aWR0aCksKHRoaXMuaGVpZ2h0fHwwPT09dGhpcy5oZWlnaHQpJiYoZS5oZWlnaHQ9dGhpcy5oZWlnaHQpLCh0aGlzLm1pbldpZHRofHwwPT09dGhpcy5taW5XaWR0aCkmJihlLm1pbldpZHRoPXRoaXMubWluV2lkdGgpLCh0aGlzLm1pbkhlaWdodHx8MD09PXRoaXMubWluSGVpZ2h0KSYmKGUubWluSGVpZ2h0PXRoaXMubWluSGVpZ2h0KSx0aGlzLmJhY2tkcm9wQ2xhc3MmJihlLmJhY2tkcm9wQ2xhc3M9dGhpcy5iYWNrZHJvcENsYXNzKSx0aGlzLnBhbmVsQ2xhc3MmJihlLnBhbmVsQ2xhc3M9dGhpcy5wYW5lbENsYXNzKSxlfV91cGRhdGVQb3NpdGlvblN0cmF0ZWd5KHQpe2NvbnN0IGU9dGhpcy5wb3NpdGlvbnMubWFwKCh0PT4oe29yaWdpblg6dC5vcmlnaW5YLG9yaWdpblk6dC5vcmlnaW5ZLG92ZXJsYXlYOnQub3ZlcmxheVgsb3ZlcmxheVk6dC5vdmVybGF5WSxvZmZzZXRYOnQub2Zmc2V0WHx8dGhpcy5vZmZzZXRYLG9mZnNldFk6dC5vZmZzZXRZfHx0aGlzLm9mZnNldFkscGFuZWxDbGFzczp0LnBhbmVsQ2xhc3N8fHZvaWQgMH0pKSk7cmV0dXJuIHQuc2V0T3JpZ2luKHRoaXMub3JpZ2luLmVsZW1lbnRSZWYpLndpdGhQb3NpdGlvbnMoZSkud2l0aEZsZXhpYmxlRGltZW5zaW9ucyh0aGlzLmZsZXhpYmxlRGltZW5zaW9ucykud2l0aFB1c2godGhpcy5wdXNoKS53aXRoR3Jvd0FmdGVyT3Blbih0aGlzLmdyb3dBZnRlck9wZW4pLndpdGhWaWV3cG9ydE1hcmdpbih0aGlzLnZpZXdwb3J0TWFyZ2luKS53aXRoTG9ja2VkUG9zaXRpb24odGhpcy5sb2NrUG9zaXRpb24pLndpdGhUcmFuc2Zvcm1PcmlnaW5Pbih0aGlzLnRyYW5zZm9ybU9yaWdpblNlbGVjdG9yKX1fY3JlYXRlUG9zaXRpb25TdHJhdGVneSgpe2NvbnN0IHQ9dGhpcy5fb3ZlcmxheS5wb3NpdGlvbigpLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy5vcmlnaW4uZWxlbWVudFJlZik7cmV0dXJuIHRoaXMuX3VwZGF0ZVBvc2l0aW9uU3RyYXRlZ3kodCksdH1fYXR0YWNoT3ZlcmxheSgpe3RoaXMuX292ZXJsYXlSZWY/dGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKS5oYXNCYWNrZHJvcD10aGlzLmhhc0JhY2tkcm9wOnRoaXMuX2NyZWF0ZU92ZXJsYXkoKSx0aGlzLl9vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCl8fHRoaXMuX292ZXJsYXlSZWYuYXR0YWNoKHRoaXMuX3RlbXBsYXRlUG9ydGFsKSx0aGlzLmhhc0JhY2tkcm9wP3RoaXMuX2JhY2tkcm9wU3Vic2NyaXB0aW9uPXRoaXMuX292ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgodD0+e3RoaXMuYmFja2Ryb3BDbGljay5lbWl0KHQpfSkpOnRoaXMuX2JhY2tkcm9wU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5fcG9zaXRpb25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLnBvc2l0aW9uQ2hhbmdlLm9ic2VydmVycy5sZW5ndGg+MCYmKHRoaXMuX3Bvc2l0aW9uU3Vic2NyaXB0aW9uPXRoaXMuX3Bvc2l0aW9uLnBvc2l0aW9uQ2hhbmdlcy5waXBlKEhlKCgoKT0+dGhpcy5wb3NpdGlvbkNoYW5nZS5vYnNlcnZlcnMubGVuZ3RoPjApKSkuc3Vic2NyaWJlKCh0PT57dGhpcy5wb3NpdGlvbkNoYW5nZS5lbWl0KHQpLDA9PT10aGlzLnBvc2l0aW9uQ2hhbmdlLm9ic2VydmVycy5sZW5ndGgmJnRoaXMuX3Bvc2l0aW9uU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCl9KSkpfV9kZXRhY2hPdmVybGF5KCl7dGhpcy5fb3ZlcmxheVJlZiYmdGhpcy5fb3ZlcmxheVJlZi5kZXRhY2goKSx0aGlzLl9iYWNrZHJvcFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX3Bvc2l0aW9uU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCl9fWdMLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxnTCkoU20ocEwpLFNtKFhnKSxTbShlaCksU20odUwpLFNtKEhJLDgpKX0sZ0wuybVkaXI9bG8oe3R5cGU6Z0wsc2VsZWN0b3JzOltbIiIsImNkay1jb25uZWN0ZWQtb3ZlcmxheSIsIiJdLFsiIiwiY29ubmVjdGVkLW92ZXJsYXkiLCIiXSxbIiIsImNka0Nvbm5lY3RlZE92ZXJsYXkiLCIiXV0saW5wdXRzOnt2aWV3cG9ydE1hcmdpbjpbImNka0Nvbm5lY3RlZE92ZXJsYXlWaWV3cG9ydE1hcmdpbiIsInZpZXdwb3J0TWFyZ2luIl0sb3BlbjpbImNka0Nvbm5lY3RlZE92ZXJsYXlPcGVuIiwib3BlbiJdLGRpc2FibGVDbG9zZTpbImNka0Nvbm5lY3RlZE92ZXJsYXlEaXNhYmxlQ2xvc2UiLCJkaXNhYmxlQ2xvc2UiXSxzY3JvbGxTdHJhdGVneTpbImNka0Nvbm5lY3RlZE92ZXJsYXlTY3JvbGxTdHJhdGVneSIsInNjcm9sbFN0cmF0ZWd5Il0sb2Zmc2V0WDpbImNka0Nvbm5lY3RlZE92ZXJsYXlPZmZzZXRYIiwib2Zmc2V0WCJdLG9mZnNldFk6WyJjZGtDb25uZWN0ZWRPdmVybGF5T2Zmc2V0WSIsIm9mZnNldFkiXSxoYXNCYWNrZHJvcDpbImNka0Nvbm5lY3RlZE92ZXJsYXlIYXNCYWNrZHJvcCIsImhhc0JhY2tkcm9wIl0sbG9ja1Bvc2l0aW9uOlsiY2RrQ29ubmVjdGVkT3ZlcmxheUxvY2tQb3NpdGlvbiIsImxvY2tQb3NpdGlvbiJdLGZsZXhpYmxlRGltZW5zaW9uczpbImNka0Nvbm5lY3RlZE92ZXJsYXlGbGV4aWJsZURpbWVuc2lvbnMiLCJmbGV4aWJsZURpbWVuc2lvbnMiXSxncm93QWZ0ZXJPcGVuOlsiY2RrQ29ubmVjdGVkT3ZlcmxheUdyb3dBZnRlck9wZW4iLCJncm93QWZ0ZXJPcGVuIl0scHVzaDpbImNka0Nvbm5lY3RlZE92ZXJsYXlQdXNoIiwicHVzaCJdLHBvc2l0aW9uczpbImNka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnMiLCJwb3NpdGlvbnMiXSxvcmlnaW46WyJjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luIiwib3JpZ2luIl0scG9zaXRpb25TdHJhdGVneTpbImNka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvblN0cmF0ZWd5IiwicG9zaXRpb25TdHJhdGVneSJdLHdpZHRoOlsiY2RrQ29ubmVjdGVkT3ZlcmxheVdpZHRoIiwid2lkdGgiXSxoZWlnaHQ6WyJjZGtDb25uZWN0ZWRPdmVybGF5SGVpZ2h0IiwiaGVpZ2h0Il0sbWluV2lkdGg6WyJjZGtDb25uZWN0ZWRPdmVybGF5TWluV2lkdGgiLCJtaW5XaWR0aCJdLG1pbkhlaWdodDpbImNka0Nvbm5lY3RlZE92ZXJsYXlNaW5IZWlnaHQiLCJtaW5IZWlnaHQiXSxiYWNrZHJvcENsYXNzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheUJhY2tkcm9wQ2xhc3MiLCJiYWNrZHJvcENsYXNzIl0scGFuZWxDbGFzczpbImNka0Nvbm5lY3RlZE92ZXJsYXlQYW5lbENsYXNzIiwicGFuZWxDbGFzcyJdLHRyYW5zZm9ybU9yaWdpblNlbGVjdG9yOlsiY2RrQ29ubmVjdGVkT3ZlcmxheVRyYW5zZm9ybU9yaWdpbk9uIiwidHJhbnNmb3JtT3JpZ2luU2VsZWN0b3IiXX0sb3V0cHV0czp7YmFja2Ryb3BDbGljazoiYmFja2Ryb3BDbGljayIscG9zaXRpb25DaGFuZ2U6InBvc2l0aW9uQ2hhbmdlIixhdHRhY2g6ImF0dGFjaCIsZGV0YWNoOiJkZXRhY2giLG92ZXJsYXlLZXlkb3duOiJvdmVybGF5S2V5ZG93biIsb3ZlcmxheU91dHNpZGVDbGljazoib3ZlcmxheU91dHNpZGVDbGljayJ9LGV4cG9ydEFzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheSJdLGZlYXR1cmVzOltCb119KSxnTC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnBMfSx7dHlwZTpYZ30se3R5cGU6ZWh9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOlt1TF19XX0se3R5cGU6SEksZGVjb3JhdG9yczpbe3R5cGU6U3J9XX1dLGdMLnByb3BEZWNvcmF0b3JzPXtvcmlnaW46W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luIl19XSxwb3NpdGlvbnM6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25zIl19XSxwb3NpdGlvblN0cmF0ZWd5Olt7dHlwZTp4eSxhcmdzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uU3RyYXRlZ3kiXX1dLG9mZnNldFg6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5T2Zmc2V0WCJdfV0sb2Zmc2V0WTpbe3R5cGU6eHksYXJnczpbImNka0Nvbm5lY3RlZE92ZXJsYXlPZmZzZXRZIl19XSx3aWR0aDpbe3R5cGU6eHksYXJnczpbImNka0Nvbm5lY3RlZE92ZXJsYXlXaWR0aCJdfV0saGVpZ2h0Olt7dHlwZTp4eSxhcmdzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheUhlaWdodCJdfV0sbWluV2lkdGg6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5TWluV2lkdGgiXX1dLG1pbkhlaWdodDpbe3R5cGU6eHksYXJnczpbImNka0Nvbm5lY3RlZE92ZXJsYXlNaW5IZWlnaHQiXX1dLGJhY2tkcm9wQ2xhc3M6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcyJdfV0scGFuZWxDbGFzczpbe3R5cGU6eHksYXJnczpbImNka0Nvbm5lY3RlZE92ZXJsYXlQYW5lbENsYXNzIl19XSx2aWV3cG9ydE1hcmdpbjpbe3R5cGU6eHksYXJnczpbImNka0Nvbm5lY3RlZE92ZXJsYXlWaWV3cG9ydE1hcmdpbiJdfV0sc2Nyb2xsU3RyYXRlZ3k6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5U2Nyb2xsU3RyYXRlZ3kiXX1dLG9wZW46W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5T3BlbiJdfV0sZGlzYWJsZUNsb3NlOlt7dHlwZTp4eSxhcmdzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheURpc2FibGVDbG9zZSJdfV0sdHJhbnNmb3JtT3JpZ2luU2VsZWN0b3I6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5VHJhbnNmb3JtT3JpZ2luT24iXX1dLGhhc0JhY2tkcm9wOlt7dHlwZTp4eSxhcmdzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wIl19XSxsb2NrUG9zaXRpb246W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5TG9ja1Bvc2l0aW9uIl19XSxmbGV4aWJsZURpbWVuc2lvbnM6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5RmxleGlibGVEaW1lbnNpb25zIl19XSxncm93QWZ0ZXJPcGVuOlt7dHlwZTp4eSxhcmdzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheUdyb3dBZnRlck9wZW4iXX1dLHB1c2g6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5UHVzaCJdfV0sYmFja2Ryb3BDbGljazpbe3R5cGU6T3l9XSxwb3NpdGlvbkNoYW5nZTpbe3R5cGU6T3l9XSxhdHRhY2g6W3t0eXBlOk95fV0sZGV0YWNoOlt7dHlwZTpPeX1dLG92ZXJsYXlLZXlkb3duOlt7dHlwZTpPeX1dLG92ZXJsYXlPdXRzaWRlQ2xpY2s6W3t0eXBlOk95fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZ0wsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Nkay1jb25uZWN0ZWQtb3ZlcmxheV0sIFtjb25uZWN0ZWQtb3ZlcmxheV0sIFtjZGtDb25uZWN0ZWRPdmVybGF5XSIsZXhwb3J0QXM6ImNka0Nvbm5lY3RlZE92ZXJsYXkifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6cEx9LHt0eXBlOlhnfSx7dHlwZTplaH0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3VMXX1dfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfV19KSx7dmlld3BvcnRNYXJnaW46W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5Vmlld3BvcnRNYXJnaW4iXX1dLG9wZW46W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5T3BlbiJdfV0sZGlzYWJsZUNsb3NlOlt7dHlwZTp4eSxhcmdzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheURpc2FibGVDbG9zZSJdfV0sYmFja2Ryb3BDbGljazpbe3R5cGU6T3l9XSxwb3NpdGlvbkNoYW5nZTpbe3R5cGU6T3l9XSxhdHRhY2g6W3t0eXBlOk95fV0sZGV0YWNoOlt7dHlwZTpPeX1dLG92ZXJsYXlLZXlkb3duOlt7dHlwZTpPeX1dLG92ZXJsYXlPdXRzaWRlQ2xpY2s6W3t0eXBlOk95fV0sc2Nyb2xsU3RyYXRlZ3k6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5U2Nyb2xsU3RyYXRlZ3kiXX1dLG9mZnNldFg6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5T2Zmc2V0WCJdfV0sb2Zmc2V0WTpbe3R5cGU6eHksYXJnczpbImNka0Nvbm5lY3RlZE92ZXJsYXlPZmZzZXRZIl19XSxoYXNCYWNrZHJvcDpbe3R5cGU6eHksYXJnczpbImNka0Nvbm5lY3RlZE92ZXJsYXlIYXNCYWNrZHJvcCJdfV0sbG9ja1Bvc2l0aW9uOlt7dHlwZTp4eSxhcmdzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheUxvY2tQb3NpdGlvbiJdfV0sZmxleGlibGVEaW1lbnNpb25zOlt7dHlwZTp4eSxhcmdzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheUZsZXhpYmxlRGltZW5zaW9ucyJdfV0sZ3Jvd0FmdGVyT3Blbjpbe3R5cGU6eHksYXJnczpbImNka0Nvbm5lY3RlZE92ZXJsYXlHcm93QWZ0ZXJPcGVuIl19XSxwdXNoOlt7dHlwZTp4eSxhcmdzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheVB1c2giXX1dLHBvc2l0aW9uczpbe3R5cGU6eHksYXJnczpbImNka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnMiXX1dLG9yaWdpbjpbe3R5cGU6eHksYXJnczpbImNka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW4iXX1dLHBvc2l0aW9uU3RyYXRlZ3k6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25TdHJhdGVneSJdfV0sd2lkdGg6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5V2lkdGgiXX1dLGhlaWdodDpbe3R5cGU6eHksYXJnczpbImNka0Nvbm5lY3RlZE92ZXJsYXlIZWlnaHQiXX1dLG1pbldpZHRoOlt7dHlwZTp4eSxhcmdzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheU1pbldpZHRoIl19XSxtaW5IZWlnaHQ6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5TWluSGVpZ2h0Il19XSxiYWNrZHJvcENsYXNzOlt7dHlwZTp4eSxhcmdzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheUJhY2tkcm9wQ2xhc3MiXX1dLHBhbmVsQ2xhc3M6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5UGFuZWxDbGFzcyJdfV0sdHJhbnNmb3JtT3JpZ2luU2VsZWN0b3I6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5VHJhbnNmb3JtT3JpZ2luT24iXX1dfSk7Y29uc3QgaEw9e3Byb3ZpZGU6dUwsZGVwczpbcExdLHVzZUZhY3Rvcnk6ZnVuY3Rpb24gYkwodCl7cmV0dXJuKCk9PnQuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKCl9fTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgeUx7fXlMLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx5TCl9LHlMLsm1bW9kPWFvKHt0eXBlOnlMfSkseUwuybVpbmo9dm4oe3Byb3ZpZGVyczpbcEwsaExdLGltcG9ydHM6W1tMSSxSRixfRl0sX0ZdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh5TCxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W0xJLFJGLF9GXSxleHBvcnRzOltnTCxmTCxfRl0sZGVjbGFyYXRpb25zOltnTCxmTF0scHJvdmlkZXJzOltwTCxoTF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyh5TCx7ZGVjbGFyYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuW2dMLGZMXX0saW1wb3J0czpmdW5jdGlvbigpe3JldHVybltMSSxSRixfRl19LGV4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bZ0wsZkwsX0ZdfX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIF9MIGV4dGVuZHMgUUZ7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpfW5nT25EZXN0cm95KCl7c3VwZXIubmdPbkRlc3Ryb3koKSx0aGlzLl9mdWxsU2NyZWVuRXZlbnROYW1lJiZ0aGlzLl9mdWxsU2NyZWVuTGlzdGVuZXImJnRoaXMuX2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5fZnVsbFNjcmVlbkV2ZW50TmFtZSx0aGlzLl9mdWxsU2NyZWVuTGlzdGVuZXIpfV9jcmVhdGVDb250YWluZXIoKXtzdXBlci5fY3JlYXRlQ29udGFpbmVyKCksdGhpcy5fYWRqdXN0UGFyZW50Rm9yRnVsbHNjcmVlbkNoYW5nZSgpLHRoaXMuX2FkZEZ1bGxzY3JlZW5DaGFuZ2VMaXN0ZW5lcigoKCk9PnRoaXMuX2FkanVzdFBhcmVudEZvckZ1bGxzY3JlZW5DaGFuZ2UoKSkpfV9hZGp1c3RQYXJlbnRGb3JGdWxsc2NyZWVuQ2hhbmdlKCl7dGhpcy5fY29udGFpbmVyRWxlbWVudCYmKHRoaXMuZ2V0RnVsbHNjcmVlbkVsZW1lbnQoKXx8dGhpcy5fZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQodGhpcy5fY29udGFpbmVyRWxlbWVudCl9X2FkZEZ1bGxzY3JlZW5DaGFuZ2VMaXN0ZW5lcih0KXtjb25zdCBlPXRoaXMuX2dldEV2ZW50TmFtZSgpO2UmJih0aGlzLl9mdWxsU2NyZWVuTGlzdGVuZXImJnRoaXMuX2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0aGlzLl9mdWxsU2NyZWVuTGlzdGVuZXIpLHRoaXMuX2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZSx0KSx0aGlzLl9mdWxsU2NyZWVuTGlzdGVuZXI9dCl9X2dldEV2ZW50TmFtZSgpe2lmKCF0aGlzLl9mdWxsU2NyZWVuRXZlbnROYW1lKXtjb25zdCB0PXRoaXMuX2RvY3VtZW50O3QuZnVsbHNjcmVlbkVuYWJsZWQ/dGhpcy5fZnVsbFNjcmVlbkV2ZW50TmFtZT0iZnVsbHNjcmVlbmNoYW5nZSI6dC53ZWJraXRGdWxsc2NyZWVuRW5hYmxlZD90aGlzLl9mdWxsU2NyZWVuRXZlbnROYW1lPSJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlIjp0Lm1vekZ1bGxTY3JlZW5FbmFibGVkP3RoaXMuX2Z1bGxTY3JlZW5FdmVudE5hbWU9Im1vemZ1bGxzY3JlZW5jaGFuZ2UiOnQubXNGdWxsc2NyZWVuRW5hYmxlZCYmKHRoaXMuX2Z1bGxTY3JlZW5FdmVudE5hbWU9Ik1TRnVsbHNjcmVlbkNoYW5nZSIpfXJldHVybiB0aGlzLl9mdWxsU2NyZWVuRXZlbnROYW1lfWdldEZ1bGxzY3JlZW5FbGVtZW50KCl7Y29uc3QgdD10aGlzLl9kb2N1bWVudDtyZXR1cm4gdC5mdWxsc2NyZWVuRWxlbWVudHx8dC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudHx8dC5tb3pGdWxsU2NyZWVuRWxlbWVudHx8dC5tc0Z1bGxzY3JlZW5FbGVtZW50fHxudWxsfX1fTC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8X0wpKHZyKFpfKSx2cih3eikpfSxfTC7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgX0wodnIoWl8pLHZyKHd6KSl9LHRva2VuOl9MLHByb3ZpZGVkSW46InJvb3QifSksX0wuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOnd6fV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChfTCxbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTp3en1dfSksbnVsbCk7Y2xhc3MgQ0x7fUNMLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxDTCl9LENMLsm1bW9kPWFvKHt0eXBlOkNMfSksQ0wuybVpbmo9dm4oe30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQ0wsW3t0eXBlOkF5LGFyZ3M6W3t9XX1dLG51bGwsbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBNTD1uZXcgU2V0O2xldCB2TDtjbGFzcyB4THtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9wbGF0Zm9ybT10LHRoaXMuX21hdGNoTWVkaWE9dGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyJiZ3aW5kb3cubWF0Y2hNZWRpYT93aW5kb3cubWF0Y2hNZWRpYS5iaW5kKHdpbmRvdyk6T0x9bWF0Y2hNZWRpYSh0KXtyZXR1cm4gdGhpcy5fcGxhdGZvcm0uV0VCS0lUJiYoZnVuY3Rpb24gZSh0KXtpZighTUwuaGFzKHQpKXRyeXt2THx8KHZMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIiksdkwuc2V0QXR0cmlidXRlKCJ0eXBlIiwidGV4dC9jc3MiKSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHZMKSksdkwuc2hlZXQmJih2TC5zaGVldC5pbnNlcnRSdWxlKGBAbWVkaWEgJHt0fSB7LmZ4LXF1ZXJ5LXRlc3R7IH19YCwwKSxNTC5hZGQodCkpfWNhdGNoKHQpe2NvbnNvbGUuZXJyb3IodCl9fSkodCksdGhpcy5fbWF0Y2hNZWRpYSh0KX19ZnVuY3Rpb24gT0wodCl7cmV0dXJue21hdGNoZXM6ImFsbCI9PT10fHwiIj09PXQsbWVkaWE6dCxhZGRMaXN0ZW5lcjooKT0+e30scmVtb3ZlTGlzdGVuZXI6KCk9Pnt9fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICoveEwuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHhMKSh2cih3eikpfSx4TC7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgeEwodnIod3opKX0sdG9rZW46eEwscHJvdmlkZWRJbjoicm9vdCJ9KSx4TC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnd6fV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh4TCxbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6d3p9XX0pLG51bGwpO2NsYXNzIFBMe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fbWVkaWFNYXRjaGVyPXQsdGhpcy5fem9uZT1lLHRoaXMuX3F1ZXJpZXM9bmV3IE1hcCx0aGlzLl9kZXN0cm95U3ViamVjdD1uZXcgSX1uZ09uRGVzdHJveSgpe3RoaXMuX2Rlc3Ryb3lTdWJqZWN0Lm5leHQoKSx0aGlzLl9kZXN0cm95U3ViamVjdC5jb21wbGV0ZSgpfWlzTWF0Y2hlZCh0KXtyZXR1cm4gd0woTXoodCkpLnNvbWUoKHQ9PnRoaXMuX3JlZ2lzdGVyUXVlcnkodCkubXFsLm1hdGNoZXMpKX1vYnNlcnZlKHQpe2xldCBlPVd0KHdMKE16KHQpKS5tYXAoKHQ9PnRoaXMuX3JlZ2lzdGVyUXVlcnkodCkub2JzZXJ2YWJsZSkpKTtyZXR1cm4gZT1KdChlLnBpcGUoYmUoMSkpLGUucGlwZShUZSgxKSxnZSgwKSkpLGUucGlwZShJdCgodD0+e2NvbnN0IGU9e21hdGNoZXM6ITEsYnJlYWtwb2ludHM6e319O3JldHVybiB0LmZvckVhY2goKCh7bWF0Y2hlczp0LHF1ZXJ5Om59KT0+e2UubWF0Y2hlcz1lLm1hdGNoZXN8fHQsZS5icmVha3BvaW50c1tuXT10fSkpLGV9KSkpfV9yZWdpc3RlclF1ZXJ5KHQpe2lmKHRoaXMuX3F1ZXJpZXMuaGFzKHQpKXJldHVybiB0aGlzLl9xdWVyaWVzLmdldCh0KTtjb25zdCBlPXRoaXMuX21lZGlhTWF0Y2hlci5tYXRjaE1lZGlhKHQpLG49e29ic2VydmFibGU6bmV3IEQoKHQ9Pntjb25zdCBuPWU9PnRoaXMuX3pvbmUucnVuKCgoKT0+dC5uZXh0KGUpKSk7cmV0dXJuIGUuYWRkTGlzdGVuZXIobiksKCk9PntlLnJlbW92ZUxpc3RlbmVyKG4pfX0pKS5waXBlKE5lKGUpLEl0KCgoe21hdGNoZXM6ZX0pPT4oe3F1ZXJ5OnQsbWF0Y2hlczplfSkpKSxJZSh0aGlzLl9kZXN0cm95U3ViamVjdCkpLG1xbDplfTtyZXR1cm4gdGhpcy5fcXVlcmllcy5zZXQodCxuKSxufX1mdW5jdGlvbiB3TCh0KXtyZXR1cm4gdC5tYXAoKHQ9PnQuc3BsaXQoIiwiKSkpLnJlZHVjZSgoKHQsZSk9PnQuY29uY2F0KGUpKSkubWFwKCh0PT50LnRyaW0oKSkpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBrTCh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsImRpdiIsMSksUm0oMSwiYnV0dG9uIiwyKSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLFltKCkuYWN0aW9uKCl9KSksa3UoMiksQW0oKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgpO3JjKDIpLFN1KHQuZGF0YS5hY3Rpb24pfX1mdW5jdGlvbiBTTCh0LGUpe31QTC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8UEwpKHZyKHhMKSx2cihhXykpfSxQTC7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgUEwodnIoeEwpLHZyKGFfKSl9LHRva2VuOlBMLHByb3ZpZGVkSW46InJvb3QifSksUEwuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp4TH0se3R5cGU6YV99XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFBMLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp4TH0se3R5cGU6YV99XX0pLG51bGwpO2NvbnN0IERMPW5ldyBHYSgiTWF0U25hY2tCYXJEYXRhIik7Y2xhc3MgRUx7Y29uc3RydWN0b3IoKXt0aGlzLnBvbGl0ZW5lc3M9ImFzc2VydGl2ZSIsdGhpcy5hbm5vdW5jZW1lbnRNZXNzYWdlPSIiLHRoaXMuZHVyYXRpb249MCx0aGlzLmRhdGE9bnVsbCx0aGlzLmhvcml6b250YWxQb3NpdGlvbj0iY2VudGVyIix0aGlzLnZlcnRpY2FsUG9zaXRpb249ImJvdHRvbSJ9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCBSTD1NYXRoLnBvdygyLDMxKS0xO2NsYXNzIEFMe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fb3ZlcmxheVJlZj1lLHRoaXMuX2FmdGVyRGlzbWlzc2VkPW5ldyBJLHRoaXMuX2FmdGVyT3BlbmVkPW5ldyBJLHRoaXMuX29uQWN0aW9uPW5ldyBJLHRoaXMuX2Rpc21pc3NlZEJ5QWN0aW9uPSExLHRoaXMuY29udGFpbmVySW5zdGFuY2U9dCx0aGlzLm9uQWN0aW9uKCkuc3Vic2NyaWJlKCgoKT0+dGhpcy5kaXNtaXNzKCkpKSx0Ll9vbkV4aXQuc3Vic2NyaWJlKCgoKT0+dGhpcy5fZmluaXNoRGlzbWlzcygpKSl9ZGlzbWlzcygpe3RoaXMuX2FmdGVyRGlzbWlzc2VkLmNsb3NlZHx8dGhpcy5jb250YWluZXJJbnN0YW5jZS5leGl0KCksY2xlYXJUaW1lb3V0KHRoaXMuX2R1cmF0aW9uVGltZW91dElkKX1kaXNtaXNzV2l0aEFjdGlvbigpe3RoaXMuX29uQWN0aW9uLmNsb3NlZHx8KHRoaXMuX2Rpc21pc3NlZEJ5QWN0aW9uPSEwLHRoaXMuX29uQWN0aW9uLm5leHQoKSx0aGlzLl9vbkFjdGlvbi5jb21wbGV0ZSgpKSxjbGVhclRpbWVvdXQodGhpcy5fZHVyYXRpb25UaW1lb3V0SWQpfWNsb3NlV2l0aEFjdGlvbigpe3RoaXMuZGlzbWlzc1dpdGhBY3Rpb24oKX1fZGlzbWlzc0FmdGVyKHQpe3RoaXMuX2R1cmF0aW9uVGltZW91dElkPXNldFRpbWVvdXQoKCgpPT50aGlzLmRpc21pc3MoKSksTWF0aC5taW4odCxSTCkpfV9vcGVuKCl7dGhpcy5fYWZ0ZXJPcGVuZWQuY2xvc2VkfHwodGhpcy5fYWZ0ZXJPcGVuZWQubmV4dCgpLHRoaXMuX2FmdGVyT3BlbmVkLmNvbXBsZXRlKCkpfV9maW5pc2hEaXNtaXNzKCl7dGhpcy5fb3ZlcmxheVJlZi5kaXNwb3NlKCksdGhpcy5fb25BY3Rpb24uY2xvc2VkfHx0aGlzLl9vbkFjdGlvbi5jb21wbGV0ZSgpLHRoaXMuX2FmdGVyRGlzbWlzc2VkLm5leHQoe2Rpc21pc3NlZEJ5QWN0aW9uOnRoaXMuX2Rpc21pc3NlZEJ5QWN0aW9ufSksdGhpcy5fYWZ0ZXJEaXNtaXNzZWQuY29tcGxldGUoKSx0aGlzLl9kaXNtaXNzZWRCeUFjdGlvbj0hMX1hZnRlckRpc21pc3NlZCgpe3JldHVybiB0aGlzLl9hZnRlckRpc21pc3NlZH1hZnRlck9wZW5lZCgpe3JldHVybiB0aGlzLmNvbnRhaW5lckluc3RhbmNlLl9vbkVudGVyfW9uQWN0aW9uKCl7cmV0dXJuIHRoaXMuX29uQWN0aW9ufX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgVEx7Y29uc3RydWN0b3IodCxlKXt0aGlzLnNuYWNrQmFyUmVmPXQsdGhpcy5kYXRhPWV9YWN0aW9uKCl7dGhpcy5zbmFja0JhclJlZi5kaXNtaXNzV2l0aEFjdGlvbigpfWdldCBoYXNBY3Rpb24oKXtyZXR1cm4hIXRoaXMuZGF0YS5hY3Rpb259fVRMLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxUTCkoU20oQUwpLFNtKERMKSl9LFRMLsm1Y21wPXRvKHt0eXBlOlRMLHNlbGVjdG9yczpbWyJzaW1wbGUtc25hY2stYmFyIl1dLGhvc3RBdHRyczpbMSwibWF0LXNpbXBsZS1zbmFja2JhciJdLGRlY2xzOjMsdmFyczoyLGNvbnN0czpbWyJjbGFzcyIsIm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uIiw0LCJuZ0lmIl0sWzEsIm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uIl0sWyJtYXQtYnV0dG9uIiwiIiwzLCJjbGljayJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwic3BhbiIpLGt1KDEpLEFtKCksUXAoMixrTCwzLDEsImRpdiIsMCkpLDImZSYmKHJjKDEpLFN1KG4uZGF0YS5tZXNzYWdlKSxyYygxKSxEbSgibmdJZiIsbi5oYXNBY3Rpb24pKX0sZGlyZWN0aXZlczpbZE0sWEhdLHN0eWxlczpbIi5tYXQtc2ltcGxlLXNuYWNrYmFye2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpjZW50ZXI7bGluZS1oZWlnaHQ6MjBweDtvcGFjaXR5OjF9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9ue2ZsZXgtc2hyaW5rOjA7bWFyZ2luOi04cHggLThweCAtOHB4IDhweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb24gYnV0dG9ue21heC1oZWlnaHQ6MzZweDttaW4td2lkdGg6MH1bZGlyPXJ0bF0gLm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9ue21hcmdpbi1sZWZ0Oi04cHg7bWFyZ2luLXJpZ2h0OjhweH1cbiJdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLFRMLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6QUx9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltETF19XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoVEwsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3Rvcjoic2ltcGxlLXNuYWNrLWJhciIsdGVtcGxhdGU6JzxzcGFuPnt7ZGF0YS5tZXNzYWdlfX08L3NwYW4+XG48ZGl2IGNsYXNzPSJtYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbiIgICpuZ0lmPSJoYXNBY3Rpb24iPlxuICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT0iYWN0aW9uKCkiPnt7ZGF0YS5hY3Rpb259fTwvYnV0dG9uPlxuPC9kaXY+XG4nLGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLGhvc3Q6e2NsYXNzOiJtYXQtc2ltcGxlLXNuYWNrYmFyIn0sc3R5bGVzOlsiLm1hdC1zaW1wbGUtc25hY2tiYXJ7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjtsaW5lLWhlaWdodDoyMHB4O29wYWNpdHk6MX0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb257ZmxleC1zaHJpbms6MDttYXJnaW46LThweCAtOHB4IC04cHggOHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbiBidXR0b257bWF4LWhlaWdodDozNnB4O21pbi13aWR0aDowfVtkaXI9cnRsXSAubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb257bWFyZ2luLWxlZnQ6LThweDttYXJnaW4tcmlnaHQ6OHB4fVxuIl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpBTH0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W0RMXX1dfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IE5MPXtzbmFja0JhclN0YXRlOm54KCJzdGF0ZSIsW3J4KCJ2b2lkLCBoaWRkZW4iLGF4KHt0cmFuc2Zvcm06InNjYWxlKDAuOCkiLG9wYWNpdHk6MH0pKSxyeCgidmlzaWJsZSIsYXgoe3RyYW5zZm9ybToic2NhbGUoMSkiLG9wYWNpdHk6MX0pKSxseCgiKiA9PiB2aXNpYmxlIixveCgiMTUwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSkiKSksbHgoIiogPT4gdm9pZCwgKiA9PiBoaWRkZW4iLG94KCI3NW1zIGN1YmljLWJlemllcigwLjQsIDAuMCwgMSwgMSkiLGF4KHtvcGFjaXR5OjB9KSkpXSl9OwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyB6TCBleHRlbmRzIFBGe2NvbnN0cnVjdG9yKHQsZSxuLG8saSl7c3VwZXIoKSx0aGlzLl9uZ1pvbmU9dCx0aGlzLl9lbGVtZW50UmVmPWUsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWY9bix0aGlzLl9wbGF0Zm9ybT1vLHRoaXMuc25hY2tCYXJDb25maWc9aSx0aGlzLl9hbm5vdW5jZURlbGF5PTE1MCx0aGlzLl9kZXN0cm95ZWQ9ITEsdGhpcy5fb25Bbm5vdW5jZT1uZXcgSSx0aGlzLl9vbkV4aXQ9bmV3IEksdGhpcy5fb25FbnRlcj1uZXcgSSx0aGlzLl9hbmltYXRpb25TdGF0ZT0idm9pZCIsdGhpcy5hdHRhY2hEb21Qb3J0YWw9dD0+KHRoaXMuX2Fzc2VydE5vdEF0dGFjaGVkKCksdGhpcy5fYXBwbHlTbmFja0JhckNsYXNzZXMoKSx0aGlzLl9wb3J0YWxPdXRsZXQuYXR0YWNoRG9tUG9ydGFsKHQpKSx0aGlzLl9saXZlPSJhc3NlcnRpdmUiIT09aS5wb2xpdGVuZXNzfHxpLmFubm91bmNlbWVudE1lc3NhZ2U/Im9mZiI9PT1pLnBvbGl0ZW5lc3M/Im9mZiI6InBvbGl0ZSI6ImFzc2VydGl2ZSIsdGhpcy5fcGxhdGZvcm0uRklSRUZPWCYmKCJwb2xpdGUiPT09dGhpcy5fbGl2ZSYmKHRoaXMuX3JvbGU9InN0YXR1cyIpLCJhc3NlcnRpdmUiPT09dGhpcy5fbGl2ZSYmKHRoaXMuX3JvbGU9ImFsZXJ0IikpfWF0dGFjaENvbXBvbmVudFBvcnRhbCh0KXtyZXR1cm4gdGhpcy5fYXNzZXJ0Tm90QXR0YWNoZWQoKSx0aGlzLl9hcHBseVNuYWNrQmFyQ2xhc3NlcygpLHRoaXMuX3BvcnRhbE91dGxldC5hdHRhY2hDb21wb25lbnRQb3J0YWwodCl9YXR0YWNoVGVtcGxhdGVQb3J0YWwodCl7cmV0dXJuIHRoaXMuX2Fzc2VydE5vdEF0dGFjaGVkKCksdGhpcy5fYXBwbHlTbmFja0JhckNsYXNzZXMoKSx0aGlzLl9wb3J0YWxPdXRsZXQuYXR0YWNoVGVtcGxhdGVQb3J0YWwodCl9b25BbmltYXRpb25FbmQodCl7Y29uc3R7ZnJvbVN0YXRlOmUsdG9TdGF0ZTpufT10O2lmKCgidm9pZCI9PT1uJiYidm9pZCIhPT1lfHwiaGlkZGVuIj09PW4pJiZ0aGlzLl9jb21wbGV0ZUV4aXQoKSwidmlzaWJsZSI9PT1uKXtjb25zdCB0PXRoaXMuX29uRW50ZXI7dGhpcy5fbmdab25lLnJ1bigoKCk9Pnt0Lm5leHQoKSx0LmNvbXBsZXRlKCl9KSl9fWVudGVyKCl7dGhpcy5fZGVzdHJveWVkfHwodGhpcy5fYW5pbWF0aW9uU3RhdGU9InZpc2libGUiLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKSx0aGlzLl9zY3JlZW5SZWFkZXJBbm5vdW5jZSgpKX1leGl0KCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvblN0YXRlPSJoaWRkZW4iLHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoIm1hdC1leGl0IiwiIiksY2xlYXJUaW1lb3V0KHRoaXMuX2Fubm91bmNlVGltZW91dElkKSx0aGlzLl9vbkV4aXR9bmdPbkRlc3Ryb3koKXt0aGlzLl9kZXN0cm95ZWQ9ITAsdGhpcy5fY29tcGxldGVFeGl0KCl9X2NvbXBsZXRlRXhpdCgpe3RoaXMuX25nWm9uZS5vbk1pY3JvdGFza0VtcHR5LnBpcGUoYmUoMSkpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLl9vbkV4aXQubmV4dCgpLHRoaXMuX29uRXhpdC5jb21wbGV0ZSgpfSkpfV9hcHBseVNuYWNrQmFyQ2xhc3Nlcygpe2NvbnN0IHQ9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LGU9dGhpcy5zbmFja0JhckNvbmZpZy5wYW5lbENsYXNzO2UmJihBcnJheS5pc0FycmF5KGUpP2UuZm9yRWFjaCgoZT0+dC5jbGFzc0xpc3QuYWRkKGUpKSk6dC5jbGFzc0xpc3QuYWRkKGUpKSwiY2VudGVyIj09PXRoaXMuc25hY2tCYXJDb25maWcuaG9yaXpvbnRhbFBvc2l0aW9uJiZ0LmNsYXNzTGlzdC5hZGQoIm1hdC1zbmFjay1iYXItY2VudGVyIiksInRvcCI9PT10aGlzLnNuYWNrQmFyQ29uZmlnLnZlcnRpY2FsUG9zaXRpb24mJnQuY2xhc3NMaXN0LmFkZCgibWF0LXNuYWNrLWJhci10b3AiKX1fYXNzZXJ0Tm90QXR0YWNoZWQoKXtpZih0aGlzLl9wb3J0YWxPdXRsZXQuaGFzQXR0YWNoZWQoKSYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93IEVycm9yKCJBdHRlbXB0aW5nIHRvIGF0dGFjaCBzbmFjayBiYXIgY29udGVudCBhZnRlciBjb250ZW50IGlzIGFscmVhZHkgYXR0YWNoZWQiKX1fc2NyZWVuUmVhZGVyQW5ub3VuY2UoKXt0aGlzLl9hbm5vdW5jZVRpbWVvdXRJZHx8dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e3RoaXMuX2Fubm91bmNlVGltZW91dElkPXNldFRpbWVvdXQoKCgpPT57Y29uc3QgdD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigiW2FyaWEtaGlkZGVuXSIpLGU9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIlthcmlhLWxpdmVdIik7aWYodCYmZSl7bGV0IG49bnVsbDt0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXImJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmdC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSYmKG49ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCksdC5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiksZS5hcHBlbmRDaGlsZCh0KSxudWxsPT1ufHxuLmZvY3VzKCksdGhpcy5fb25Bbm5vdW5jZS5uZXh0KCksdGhpcy5fb25Bbm5vdW5jZS5jb21wbGV0ZSgpfX0pLHRoaXMuX2Fubm91bmNlRGVsYXkpfSkpfX16TC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8ekwpKFNtKGFfKSxTbShoZyksU20oVWcpLFNtKHd6KSxTbShFTCkpfSx6TC7JtWNtcD10byh7dHlwZTp6TCxzZWxlY3RvcnM6W1sic25hY2stYmFyLWNvbnRhaW5lciJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmUWgoREYsNyksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5fcG9ydGFsT3V0bGV0PXQuZmlyc3QpfX0saG9zdEF0dHJzOlsxLCJtYXQtc25hY2stYmFyLWNvbnRhaW5lciJdLGhvc3RWYXJzOjEsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJmptKCJAc3RhdGUuZG9uZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25BbmltYXRpb25FbmQoZSl9KSksMiZlJiZOdSgiQHN0YXRlIixuLl9hbmltYXRpb25TdGF0ZSl9LGZlYXR1cmVzOlt4cF0sZGVjbHM6Myx2YXJzOjIsY29uc3RzOltbImFyaWEtaGlkZGVuIiwidHJ1ZSJdLFsiY2RrUG9ydGFsT3V0bGV0IiwiIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJkaXYiLDApLFFwKDEsU0wsMCwwLCJuZy10ZW1wbGF0ZSIsMSksQW0oKSxUbSgyLCJkaXYiKSksMiZlJiYocmMoMiksanAoImFyaWEtbGl2ZSIsbi5fbGl2ZSkoInJvbGUiLG4uX3JvbGUpKX0sZGlyZWN0aXZlczpbREZdLHN0eWxlczpbIi5tYXQtc25hY2stYmFyLWNvbnRhaW5lcntib3JkZXItcmFkaXVzOjRweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTpibG9jazttYXJnaW46MjRweDttYXgtd2lkdGg6MzN2dzttaW4td2lkdGg6MzQ0cHg7cGFkZGluZzoxNHB4IDE2cHg7bWluLWhlaWdodDo0OHB4O3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zbmFjay1iYXItY29udGFpbmVye2JvcmRlcjpzb2xpZCAxcHh9Lm1hdC1zbmFjay1iYXItaGFuZHNldHt3aWR0aDoxMDAlfS5tYXQtc25hY2stYmFyLWhhbmRzZXQgLm1hdC1zbmFjay1iYXItY29udGFpbmVye21hcmdpbjo4cHg7bWF4LXdpZHRoOjEwMCU7bWluLXdpZHRoOjA7d2lkdGg6MTAwJX1cbiJdLGVuY2Fwc3VsYXRpb246MixkYXRhOnthbmltYXRpb246W05MLnNuYWNrQmFyU3RhdGVdfX0pLHpMLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6YV99LHt0eXBlOmhnfSx7dHlwZTpVZ30se3R5cGU6d3p9LHt0eXBlOkVMfV0sekwucHJvcERlY29yYXRvcnM9e19wb3J0YWxPdXRsZXQ6W3t0eXBlOlphLGFyZ3M6W0RGLHtzdGF0aWM6ITB9XX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHpMLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InNuYWNrLWJhci1jb250YWluZXIiLHRlbXBsYXRlOidceDNjIS0tIEluaXRpYWxseSBob2xkcyB0aGUgc25hY2sgYmFyIGNvbnRlbnQsIHdpbGwgYmUgZW1wdHkgYWZ0ZXIgYW5ub3VuY2luZyB0byBzY3JlZW4gcmVhZGVycy4gLS1ceDNlXG48ZGl2IGFyaWEtaGlkZGVuPSJ0cnVlIj5cbiAgPG5nLXRlbXBsYXRlIGNka1BvcnRhbE91dGxldD48L25nLXRlbXBsYXRlPlxuPC9kaXY+XG5cblx4M2MhLS0gV2lsbCByZWNlaXZlIHRoZSBzbmFjayBiYXIgY29udGVudCBmcm9tIHRoZSBub24tbGl2ZSBkaXYsIG1vdmUgd2lsbCBoYXBwZW4gYSBzaG9ydCBkZWxheSBhZnRlciBvcGVuaW5nIC0tXHgzZVxuPGRpdiBbYXR0ci5hcmlhLWxpdmVdPSJfbGl2ZSIgW2F0dHIucm9sZV09Il9yb2xlIj48L2Rpdj5cbicsY2hhbmdlRGV0ZWN0aW9uOnpuLkRlZmF1bHQsZW5jYXBzdWxhdGlvbjpIbi5Ob25lLGFuaW1hdGlvbnM6W05MLnNuYWNrQmFyU3RhdGVdLGhvc3Q6e2NsYXNzOiJtYXQtc25hY2stYmFyLWNvbnRhaW5lciIsIltAc3RhdGVdIjoiX2FuaW1hdGlvblN0YXRlIiwiKEBzdGF0ZS5kb25lKSI6Im9uQW5pbWF0aW9uRW5kKCRldmVudCkifSxzdHlsZXM6WyIubWF0LXNuYWNrLWJhci1jb250YWluZXJ7Ym9yZGVyLXJhZGl1czo0cHg7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjI0cHg7bWF4LXdpZHRoOjMzdnc7bWluLXdpZHRoOjM0NHB4O3BhZGRpbmc6MTRweCAxNnB4O21pbi1oZWlnaHQ6NDhweDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcn0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc25hY2stYmFyLWNvbnRhaW5lcntib3JkZXI6c29saWQgMXB4fS5tYXQtc25hY2stYmFyLWhhbmRzZXR7d2lkdGg6MTAwJX0ubWF0LXNuYWNrLWJhci1oYW5kc2V0IC5tYXQtc25hY2stYmFyLWNvbnRhaW5lcnttYXJnaW46OHB4O21heC13aWR0aDoxMDAlO21pbi13aWR0aDowO3dpZHRoOjEwMCV9XG4iXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmFffSx7dHlwZTpoZ30se3R5cGU6VWd9LHt0eXBlOnd6fSx7dHlwZTpFTH1dfSkse19wb3J0YWxPdXRsZXQ6W3t0eXBlOlphLGFyZ3M6W0RGLHtzdGF0aWM6ITB9XX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBJTHt9SUwuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fElMKX0sSUwuybVtb2Q9YW8oe3R5cGU6SUx9KSxJTC7JtWluaj12bih7aW1wb3J0czpbW3lMLFJGLFdNLEpILFhJXSxYSV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKElMLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbeUwsUkYsV00sSkgsWEldLGV4cG9ydHM6W3pMLFhJXSxkZWNsYXJhdGlvbnM6W3pMLFRMXSxlbnRyeUNvbXBvbmVudHM6W3pMLFRMXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKElMLHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bekwsVExdfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW3lMLFJGLFdNLEpILFhJXX0sZXhwb3J0czpmdW5jdGlvbigpe3JldHVyblt6TCxYSV19fSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBITD1uZXcgR2EoIm1hdC1zbmFjay1iYXItZGVmYXVsdC1vcHRpb25zIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbiBGTCgpe3JldHVybiBuZXcgRUx9fSk7Y2xhc3MgTEx7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEpe3RoaXMuX292ZXJsYXk9dCx0aGlzLl9saXZlPWUsdGhpcy5faW5qZWN0b3I9bix0aGlzLl9icmVha3BvaW50T2JzZXJ2ZXI9byx0aGlzLl9wYXJlbnRTbmFja0Jhcj1pLHRoaXMuX2RlZmF1bHRDb25maWc9YSx0aGlzLl9zbmFja0JhclJlZkF0VGhpc0xldmVsPW51bGwsdGhpcy5zaW1wbGVTbmFja0JhckNvbXBvbmVudD1UTCx0aGlzLnNuYWNrQmFyQ29udGFpbmVyQ29tcG9uZW50PXpMLHRoaXMuaGFuZHNldENzc0NsYXNzPSJtYXQtc25hY2stYmFyLWhhbmRzZXQifWdldCBfb3BlbmVkU25hY2tCYXJSZWYoKXtjb25zdCB0PXRoaXMuX3BhcmVudFNuYWNrQmFyO3JldHVybiB0P3QuX29wZW5lZFNuYWNrQmFyUmVmOnRoaXMuX3NuYWNrQmFyUmVmQXRUaGlzTGV2ZWx9c2V0IF9vcGVuZWRTbmFja0JhclJlZih0KXt0aGlzLl9wYXJlbnRTbmFja0Jhcj90aGlzLl9wYXJlbnRTbmFja0Jhci5fb3BlbmVkU25hY2tCYXJSZWY9dDp0aGlzLl9zbmFja0JhclJlZkF0VGhpc0xldmVsPXR9b3BlbkZyb21Db21wb25lbnQodCxlKXtyZXR1cm4gdGhpcy5fYXR0YWNoKHQsZSl9b3BlbkZyb21UZW1wbGF0ZSh0LGUpe3JldHVybiB0aGlzLl9hdHRhY2godCxlKX1vcGVuKHQsZT0iIixuKXtjb25zdCBvPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0aGlzLl9kZWZhdWx0Q29uZmlnKSxuKTtyZXR1cm4gby5kYXRhPXttZXNzYWdlOnQsYWN0aW9uOmV9LG8uYW5ub3VuY2VtZW50TWVzc2FnZT09PXQmJihvLmFubm91bmNlbWVudE1lc3NhZ2U9dm9pZCAwKSx0aGlzLm9wZW5Gcm9tQ29tcG9uZW50KHRoaXMuc2ltcGxlU25hY2tCYXJDb21wb25lbnQsbyl9ZGlzbWlzcygpe3RoaXMuX29wZW5lZFNuYWNrQmFyUmVmJiZ0aGlzLl9vcGVuZWRTbmFja0JhclJlZi5kaXNtaXNzKCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9zbmFja0JhclJlZkF0VGhpc0xldmVsJiZ0aGlzLl9zbmFja0JhclJlZkF0VGhpc0xldmVsLmRpc21pc3MoKX1fYXR0YWNoU25hY2tCYXJDb250YWluZXIodCxlKXtjb25zdCBuPXJwLmNyZWF0ZSh7cGFyZW50OmUmJmUudmlld0NvbnRhaW5lclJlZiYmZS52aWV3Q29udGFpbmVyUmVmLmluamVjdG9yfHx0aGlzLl9pbmplY3Rvcixwcm92aWRlcnM6W3twcm92aWRlOkVMLHVzZVZhbHVlOmV9XX0pLG89bmV3IHZGKHRoaXMuc25hY2tCYXJDb250YWluZXJDb21wb25lbnQsZS52aWV3Q29udGFpbmVyUmVmLG4pLGk9dC5hdHRhY2gobyk7cmV0dXJuIGkuaW5zdGFuY2Uuc25hY2tCYXJDb25maWc9ZSxpLmluc3RhbmNlfV9hdHRhY2godCxlKXtjb25zdCBuPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG5ldyBFTCksdGhpcy5fZGVmYXVsdENvbmZpZyksZSksbz10aGlzLl9jcmVhdGVPdmVybGF5KG4pLGk9dGhpcy5fYXR0YWNoU25hY2tCYXJDb250YWluZXIobyxuKSxhPW5ldyBBTChpLG8pO2lmKHQgaW5zdGFuY2VvZiBYZyl7Y29uc3QgZT1uZXcgeEYodCxudWxsLHskaW1wbGljaXQ6bi5kYXRhLHNuYWNrQmFyUmVmOmF9KTthLmluc3RhbmNlPWkuYXR0YWNoVGVtcGxhdGVQb3J0YWwoZSl9ZWxzZXtjb25zdCBlPXRoaXMuX2NyZWF0ZUluamVjdG9yKG4sYSksbz1uZXcgdkYodCx2b2lkIDAsZSkscj1pLmF0dGFjaENvbXBvbmVudFBvcnRhbChvKTthLmluc3RhbmNlPXIuaW5zdGFuY2V9cmV0dXJuIHRoaXMuX2JyZWFrcG9pbnRPYnNlcnZlci5vYnNlcnZlKCIobWF4LXdpZHRoOiA1OTkuOThweCkgYW5kIChvcmllbnRhdGlvbjogcG9ydHJhaXQpIikucGlwZShJZShvLmRldGFjaG1lbnRzKCkpKS5zdWJzY3JpYmUoKHQ9Pntjb25zdCBlPW8ub3ZlcmxheUVsZW1lbnQuY2xhc3NMaXN0O3QubWF0Y2hlcz9lLmFkZCh0aGlzLmhhbmRzZXRDc3NDbGFzcyk6ZS5yZW1vdmUodGhpcy5oYW5kc2V0Q3NzQ2xhc3MpfSkpLG4uYW5ub3VuY2VtZW50TWVzc2FnZSYmaS5fb25Bbm5vdW5jZS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fbGl2ZS5hbm5vdW5jZShuLmFubm91bmNlbWVudE1lc3NhZ2Usbi5wb2xpdGVuZXNzKX0pKSx0aGlzLl9hbmltYXRlU25hY2tCYXIoYSxuKSx0aGlzLl9vcGVuZWRTbmFja0JhclJlZj1hLHRoaXMuX29wZW5lZFNuYWNrQmFyUmVmfV9hbmltYXRlU25hY2tCYXIodCxlKXt0LmFmdGVyRGlzbWlzc2VkKCkuc3Vic2NyaWJlKCgoKT0+e3RoaXMuX29wZW5lZFNuYWNrQmFyUmVmPT10JiYodGhpcy5fb3BlbmVkU25hY2tCYXJSZWY9bnVsbCksZS5hbm5vdW5jZW1lbnRNZXNzYWdlJiZ0aGlzLl9saXZlLmNsZWFyKCl9KSksdGhpcy5fb3BlbmVkU25hY2tCYXJSZWY/KHRoaXMuX29wZW5lZFNuYWNrQmFyUmVmLmFmdGVyRGlzbWlzc2VkKCkuc3Vic2NyaWJlKCgoKT0+e3QuY29udGFpbmVySW5zdGFuY2UuZW50ZXIoKX0pKSx0aGlzLl9vcGVuZWRTbmFja0JhclJlZi5kaXNtaXNzKCkpOnQuY29udGFpbmVySW5zdGFuY2UuZW50ZXIoKSxlLmR1cmF0aW9uJiZlLmR1cmF0aW9uPjAmJnQuYWZ0ZXJPcGVuZWQoKS5zdWJzY3JpYmUoKCgpPT50Ll9kaXNtaXNzQWZ0ZXIoZS5kdXJhdGlvbikpKX1fY3JlYXRlT3ZlcmxheSh0KXtjb25zdCBlPW5ldyBWRjtlLmRpcmVjdGlvbj10LmRpcmVjdGlvbjtsZXQgbj10aGlzLl9vdmVybGF5LnBvc2l0aW9uKCkuZ2xvYmFsKCk7Y29uc3Qgbz0icnRsIj09PXQuZGlyZWN0aW9uLGk9ImxlZnQiPT09dC5ob3Jpem9udGFsUG9zaXRpb258fCJzdGFydCI9PT10Lmhvcml6b250YWxQb3NpdGlvbiYmIW98fCJlbmQiPT09dC5ob3Jpem9udGFsUG9zaXRpb24mJm8sYT0haSYmImNlbnRlciIhPT10Lmhvcml6b250YWxQb3NpdGlvbjtyZXR1cm4gaT9uLmxlZnQoIjAiKTphP24ucmlnaHQoIjAiKTpuLmNlbnRlckhvcml6b250YWxseSgpLCJ0b3AiPT09dC52ZXJ0aWNhbFBvc2l0aW9uP24udG9wKCIwIik6bi5ib3R0b20oIjAiKSxlLnBvc2l0aW9uU3RyYXRlZ3k9bix0aGlzLl9vdmVybGF5LmNyZWF0ZShlKX1fY3JlYXRlSW5qZWN0b3IodCxlKXtyZXR1cm4gcnAuY3JlYXRlKHtwYXJlbnQ6dCYmdC52aWV3Q29udGFpbmVyUmVmJiZ0LnZpZXdDb250YWluZXJSZWYuaW5qZWN0b3J8fHRoaXMuX2luamVjdG9yLHByb3ZpZGVyczpbe3Byb3ZpZGU6QUwsdXNlVmFsdWU6ZX0se3Byb3ZpZGU6REwsdXNlVmFsdWU6dC5kYXRhfV19KX19TEwuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fExMKSh2cihwTCksdnIoT0kpLHZyKHJwKSx2cihQTCksdnIoTEwsMTIpLHZyKEhMKSl9LExMLsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIG5ldyBMTCh2cihwTCksdnIoT0kpLHZyKEdkKSx2cihQTCksdnIoTEwsMTIpLHZyKEhMKSl9LHRva2VuOkxMLHByb3ZpZGVkSW46SUx9KSxMTC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnBMfSx7dHlwZTpPSX0se3R5cGU6cnB9LHt0eXBlOlBMfSx7dHlwZTpMTCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RXJ9XX0se3R5cGU6RUwsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbSExdfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKExMLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjpJTH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnBMfSx7dHlwZTpPSX0se3R5cGU6cnB9LHt0eXBlOlBMfSx7dHlwZTpMTCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RXJ9XX0se3R5cGU6RUwsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbSExdfV19XX0pLG51bGwpO2NvbnN0IEJMPS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxWTD0iXFx1MDAwMC1cXHUwMDIwXFx1MDA3Zi1cXHUwMDlmIixqTD1uZXcgUmVnRXhwKCIoPzpbYS16QS1aXVthLXpBLVowLTkrLi1dezIsfTpcXC9cXC98ZGF0YTp8d3d3XFwuKVteXFxzIitWTCsnIl17Mix9W15cXHMnK1ZMKyJcIicpfVxcXSw6Oy4hP10iLCJndSIpO2Z1bmN0aW9uIFVMKHQpe3JldHVybihmdW5jdGlvbiBlKHQsbil7bi5mbGFncy5pbmNsdWRlcygiZyIpfHwobj1uZXcgUmVnRXhwKG4sbi5mbGFncysiZyIpKTtjb25zdCBvPVtdO2xldCBpPTA7Zm9yKGNvbnN0IGUgb2YgdC5tYXRjaEFsbChuKSl7Y29uc3Qgbj1lLmluZGV4LGE9ZVswXTtuPmkmJm8ucHVzaCh7aW5kZXg6aSx0ZXh0OnQuc3Vic3RyaW5nKGksbiksbWF0Y2hlc1JlZ2V4OiExfSksby5wdXNoKHtpbmRleDpuLHRleHQ6YSxtYXRjaGVzUmVnZXg6ITB9KSxpPW4rYS5sZW5ndGh9cmV0dXJuIHQubGVuZ3RoPmkmJm8ucHVzaCh7aW5kZXg6aSx0ZXh0OnQuc3Vic3RyaW5nKGksdC5sZW5ndGgpLG1hdGNoZXNSZWdleDohMX0pLG99KSh0LGpMKS5tYXAoKCh7bWF0Y2hlc1JlZ2V4OnQsdGV4dDplfSk9Pih7aXNVUkw6dCx0ZXh0OmV9KSkpfWZ1bmN0aW9uIEdMKHQsZSl7aWYoMSZ0JiYoTm0oMCksa3UoMSksem0oKSksMiZ0KXtjb25zdCB0PVltKCkuJGltcGxpY2l0O3JjKDEpLER1KCIgIix0LnRleHQsIiAiKX19ZnVuY3Rpb24gV0wodCxlKXtpZigxJnQmJihSbSgwLCJhIiw3KSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKS4kaW1wbGljaXQ7S20oImhyZWYiLHQudGV4dCxUcykscmMoMSksU3UodC50ZXh0KX19ZnVuY3Rpb24gWUwodCxlKXtpZigxJnQmJihObSgwKSxRcCgxLEdMLDIsMSwibmctY29udGFpbmVyIiw1KSxRcCgyLFdMLDIsMiwibmctdGVtcGxhdGUiLG51bGwsNixpYiksem0oKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49JHAoMyk7cmMoMSksRG0oIm5nSWYiLCF0LmlzVVJMKSgibmdJZkVsc2UiLG4pfX1mdW5jdGlvbiBxTCh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsImJ1dHRvbiIsOCksVm0oImNsaWNrIiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgpLm9uQWN0aW9uQnV0dG9uQ2xpY2tlZCgpfSkpLGt1KDEpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKCk7cmMoMSksRHUoIiAiLHQuYWxlcnQuZm9sbG93dXBBY3Rpb24ubG9jYWxpemVkTGFiZWwsIiAiKX19Y2xhc3MgWkx7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuc25hY2tCYXJSZWY9dCx0aGlzLnVua25vd25EYXRhPWUsdGhpcy5zdG9yZT1uLHRoaXMuc3BsaXRCeVVSTD1VTCx0aGlzLmFsZXJ0PWV9b25BY3Rpb25CdXR0b25DbGlja2VkKCl7cmV0dXJuIGdBKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dGhpcy5zbmFja0JhclJlZi5kaXNtaXNzKCk7Y29uc3QgdD15aWVsZCB0aGlzLmFsZXJ0LmZvbGxvd3VwQWN0aW9uLmdldEZvbGxvd3VwQWN0aW9uKHRoaXMuc3RvcmUpO3RoaXMuc3RvcmUuZGlzcGF0Y2godCl9KSl9b25DbG9zZUJ1dHRvbkNsaWNrZWQoKXt0aGlzLnNuYWNrQmFyUmVmLmRpc21pc3MoKX19WkwuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFpMKShTbShBTCksU20oREwpLFNtKEl3KSl9LFpMLsm1Y21wPXRvKHt0eXBlOlpMLHNlbGVjdG9yczpbWyJhbGVydC1kaXNwbGF5LXNuYWNrYmFyIl1dLGRlY2xzOjYsdmFyczoyLGNvbnN0czpmdW5jdGlvbigpe2xldCB0O3JldHVybiB0PSJ1bmRlZmluZWQiIT10eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUmJm5nSTE4bkNsb3N1cmVNb2RlP2dvb2cuZ2V0TXNnKCJEaXNtaXNzIik6JGxvY2FsaXplYDpBIGJ1dHRvbiB0byBjbG9zZSB0aGUgc25hY2tiYXIgbWVzc2FnZeKQn2VhNGQ5ZmU2MTQyMGEzZmNlODFjZjU0YzRjNjE1ZTNjMTljNjQ2YTbikJ8xNTM2MDg3NTE5NzQzNzA3MzYyOkRpc21pc3NgLFtbMSwibWVzc2FnZSJdLFs0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbMSwiY29udHJvbHMiXSxbIm1hdC1idXR0b24iLCIiLCJjbGFzcyIsImZvbGxvd3VwLWJ1dHRvbiIsMywiY2xpY2siLDQsIm5nSWYiXSxbIm1hdC1idXR0b24iLCIiLCJhcmlhLWxhYmVsIix0LDEsImRpc21pc3MtYnV0dG9uIiwzLCJjbGljayJdLFs0LCJuZ0lmIiwibmdJZkVsc2UiXSxbImxpbmtQaWVjZSIsIiJdLFsicmVsIiwibm9yZWZlcnJlciBub29wZW5lciIsInRhcmdldCIsIl9ibGFuayIsMywiaHJlZiJdLFsibWF0LWJ1dHRvbiIsIiIsMSwiZm9sbG93dXAtYnV0dG9uIiwzLCJjbGljayJdXX0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImRpdiIsMCksUXAoMSxZTCw0LDIsIm5nLWNvbnRhaW5lciIsMSksQW0oKSxSbSgyLCJkaXYiLDIpLFFwKDMscUwsMiwxLCJidXR0b24iLDMpLFJtKDQsImJ1dHRvbiIsNCksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uQ2xvc2VCdXR0b25DbGlja2VkKCl9KSksa3UoNSwiIERpc21pc3MgIiksQW0oKSxBbSgpKSwyJmUmJihyYygxKSxEbSgibmdGb3JPZiIsbi5zcGxpdEJ5VVJMKG4uYWxlcnQubG9jYWxpemVkTWVzc2FnZSkpLHJjKDIpLERtKCJuZ0lmIixuLmFsZXJ0LmZvbGxvd3VwQWN0aW9uKSl9LGRpcmVjdGl2ZXM6W2xNLGRNLFhIXSxzdHlsZXM6WyJbX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcH0ubWVzc2FnZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7YWxpZ24tc2VsZjpjZW50ZXI7bWFyZ2luOjVweCAwO3dvcmQtYnJlYWs6YnJlYWstd29yZH0ubWVzc2FnZVtfbmdjb250ZW50LSVDT01QJV0gICBhW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5jb250cm9sc1tfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO21hcmdpbi1sZWZ0OmF1dG99YnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9Il0sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFpMLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImFsZXJ0LWRpc3BsYXktc25hY2tiYXIiLHRlbXBsYXRlVXJsOiIuL2FsZXJ0X2Rpc3BsYXlfc25hY2tiYXJfY29udGFpbmVyLm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vYWxlcnRfZGlzcGxheV9zbmFja2Jhcl9jb250YWluZXIuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkFMfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbRExdfV19LHt0eXBlOkl3fV19KSxudWxsKTtjbGFzcyBYTHtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuc3RvcmU9dCx0aGlzLnNuYWNrQmFyPWUsdGhpcy5uZ1Vuc3Vic2NyaWJlPW5ldyBJfW5nT25Jbml0KCl7dGhpcy5zdG9yZS5zZWxlY3QoZEEpLnBpcGUoSWUodGhpcy5uZ1Vuc3Vic2NyaWJlKSxjZSgodD0+Qm9vbGVhbih0KSkpKS5zdWJzY3JpYmUoKHQ9Pnt0aGlzLnNob3dBbGVydCh0KX0pKX1uZ09uRGVzdHJveSgpe3RoaXMubmdVbnN1YnNjcmliZS5uZXh0KCksdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCl9c2hvd0FsZXJ0KHQpe3RoaXMuc25hY2tCYXIub3BlbkZyb21Db21wb25lbnQoWkwse2R1cmF0aW9uOjVlMyxob3Jpem9udGFsUG9zaXRpb246InN0YXJ0Iix2ZXJ0aWNhbFBvc2l0aW9uOiJib3R0b20iLGRhdGE6dH0pfX1YTC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WEwpKFNtKEl3KSxTbShMTCkpfSxYTC7JtWNtcD10byh7dHlwZTpYTCxzZWxlY3RvcnM6W1siYWxlcnQtc25hY2tiYXIiXV0sZGVjbHM6MCx2YXJzOjAsdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pe30sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChYTCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJhbGVydC1zbmFja2JhciIsdGVtcGxhdGU6IiIsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fSx7dHlwZTpMTH1dfSksbnVsbCk7Y2xhc3MgS0x7fUtMLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxLTCl9LEtMLsm1bW9kPWFvKHt0eXBlOktMfSksS0wuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxKSCxJTF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChLTCxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbWEwsWkxdLGV4cG9ydHM6W1hMXSxpbXBvcnRzOltXTSxKSCxJTF0sZW50cnlDb21wb25lbnRzOltaTF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhLTCx7ZGVjbGFyYXRpb25zOltYTCxaTF0saW1wb3J0czpbV00sSkgsSUxdLGV4cG9ydHM6W1hMXX0pO2NsYXNzIEpMe31KTC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SkwpfSxKTC7JtW1vZD1hbyh7dHlwZTpKTH0pLEpMLsm1aW5qPXZuKHtpbXBvcnRzOltbQVIsS0wsZGsuZm9yRmVhdHVyZShjQSxweiksV2suZm9yRmVhdHVyZShbY3pdKV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChKTCxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W0FSLEtMLGRrLmZvckZlYXR1cmUoY0EscHopLFdrLmZvckZlYXR1cmUoW2N6XSldfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oSkwse2ltcG9ydHM6W0FSLEtMLGNrLEdrXX0pO2NvbnN0IFFMPVsiKiIsW1sibWF0LXRvb2xiYXItcm93Il1dXSwkTD1KSShjbGFzc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl9lbGVtZW50UmVmPXR9fSk7Y2xhc3MgdEJ7fXRCLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx0Qil9LHRCLsm1ZGlyPWxvKHt0eXBlOnRCLHNlbGVjdG9yczpbWyJtYXQtdG9vbGJhci1yb3ciXV0saG9zdEF0dHJzOlsxLCJtYXQtdG9vbGJhci1yb3ciXSxleHBvcnRBczpbIm1hdFRvb2xiYXJSb3ciXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodEIsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoibWF0LXRvb2xiYXItcm93IixleHBvcnRBczoibWF0VG9vbGJhclJvdyIsaG9zdDp7Y2xhc3M6Im1hdC10b29sYmFyLXJvdyJ9fV19XSxudWxsLG51bGwpO2NsYXNzIGVCIGV4dGVuZHMgJEx7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHQpLHRoaXMuX3BsYXRmb3JtPWUsdGhpcy5fZG9jdW1lbnQ9bn1uZ0FmdGVyVmlld0luaXQoKXt0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXImJih0aGlzLl9jaGVja1Rvb2xiYXJNaXhlZE1vZGVzKCksdGhpcy5fdG9vbGJhclJvd3MuY2hhbmdlcy5zdWJzY3JpYmUoKCgpPT50aGlzLl9jaGVja1Rvb2xiYXJNaXhlZE1vZGVzKCkpKSl9X2NoZWNrVG9vbGJhck1peGVkTW9kZXMoKXt0aGlzLl90b29sYmFyUm93cy5sZW5ndGgmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmQXJyYXkuZnJvbSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2hpbGROb2RlcykuZmlsdGVyKCh0PT4hKHQuY2xhc3NMaXN0JiZ0LmNsYXNzTGlzdC5jb250YWlucygibWF0LXRvb2xiYXItcm93IikpKSkuZmlsdGVyKCh0PT50Lm5vZGVUeXBlIT09KHRoaXMuX2RvY3VtZW50P3RoaXMuX2RvY3VtZW50LkNPTU1FTlRfTk9ERTo4KSkpLnNvbWUoKHQ9PiEoIXQudGV4dENvbnRlbnR8fCF0LnRleHRDb250ZW50LnRyaW0oKSkpKSYmKGZ1bmN0aW9uIHQoKXt0aHJvdyBFcnJvcigiTWF0VG9vbGJhcjogQXR0ZW1wdGluZyB0byBjb21iaW5lIGRpZmZlcmVudCB0b29sYmFyIG1vZGVzLiBFaXRoZXIgc3BlY2lmeSBtdWx0aXBsZSBgPG1hdC10b29sYmFyLXJvdz5gIGVsZW1lbnRzIGV4cGxpY2l0bHkgb3IganVzdCBwbGFjZSBjb250ZW50IGluc2lkZSBvZiBhIGA8bWF0LXRvb2xiYXI+YCBmb3IgYSBzaW5nbGUgcm93LiIpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8pKCl9fWVCLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxlQikoU20oaGcpLFNtKHd6KSxTbShaXykpfSxlQi7JtWNtcD10byh7dHlwZTplQixzZWxlY3RvcnM6W1sibWF0LXRvb2xiYXIiXV0sY29udGVudFF1ZXJpZXM6ZnVuY3Rpb24gdChlLG4sbyl7aWYoMSZlJiYkaChvLHRCLDUpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uX3Rvb2xiYXJSb3dzPXQpfX0saG9zdEF0dHJzOlsxLCJtYXQtdG9vbGJhciJdLGhvc3RWYXJzOjQsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJnB1KCJtYXQtdG9vbGJhci1tdWx0aXBsZS1yb3dzIixuLl90b29sYmFyUm93cy5sZW5ndGg+MCkoIm1hdC10b29sYmFyLXNpbmdsZS1yb3ciLDA9PT1uLl90b29sYmFyUm93cy5sZW5ndGgpfSxpbnB1dHM6e2NvbG9yOiJjb2xvciJ9LGV4cG9ydEFzOlsibWF0VG9vbGJhciJdLGZlYXR1cmVzOlt4cF0sbmdDb250ZW50U2VsZWN0b3JzOlsiKiIsIm1hdC10b29sYmFyLXJvdyJdLGRlY2xzOjIsdmFyczowLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabShRTCksWG0oMCksWG0oMSwxKSl9LHN0eWxlczpbIi5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10b29sYmFye291dGxpbmU6c29saWQgMXB4fS5tYXQtdG9vbGJhci1yb3csLm1hdC10b29sYmFyLXNpbmdsZS1yb3d7ZGlzcGxheTpmbGV4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjAgMTZweDt3aWR0aDoxMDAlO2ZsZXgtZGlyZWN0aW9uOnJvdzthbGlnbi1pdGVtczpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwfS5tYXQtdG9vbGJhci1tdWx0aXBsZS1yb3dze2Rpc3BsYXk6ZmxleDtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3dpZHRoOjEwMCV9XG4iXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSxlQi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTp3en0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV0sZUIucHJvcERlY29yYXRvcnM9e190b29sYmFyUm93czpbe3R5cGU6WWEsYXJnczpbdEIse2Rlc2NlbmRhbnRzOiEwfV19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChlQixbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtYXQtdG9vbGJhciIsZXhwb3J0QXM6Im1hdFRvb2xiYXIiLHRlbXBsYXRlOic8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48bmctY29udGVudCBzZWxlY3Q9Im1hdC10b29sYmFyLXJvdyI+PC9uZy1jb250ZW50PlxuJyxpbnB1dHM6WyJjb2xvciJdLGhvc3Q6e2NsYXNzOiJtYXQtdG9vbGJhciIsIltjbGFzcy5tYXQtdG9vbGJhci1tdWx0aXBsZS1yb3dzXSI6Il90b29sYmFyUm93cy5sZW5ndGggPiAwIiwiW2NsYXNzLm1hdC10b29sYmFyLXNpbmdsZS1yb3ddIjoiX3Rvb2xiYXJSb3dzLmxlbmd0aCA9PT0gMCJ9LGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2gsZW5jYXBzdWxhdGlvbjpIbi5Ob25lLHN0eWxlczpbIi5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10b29sYmFye291dGxpbmU6c29saWQgMXB4fS5tYXQtdG9vbGJhci1yb3csLm1hdC10b29sYmFyLXNpbmdsZS1yb3d7ZGlzcGxheTpmbGV4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjAgMTZweDt3aWR0aDoxMDAlO2ZsZXgtZGlyZWN0aW9uOnJvdzthbGlnbi1pdGVtczpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwfS5tYXQtdG9vbGJhci1tdWx0aXBsZS1yb3dze2Rpc3BsYXk6ZmxleDtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3dpZHRoOjEwMCV9XG4iXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTp3en0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV19KSx7X3Rvb2xiYXJSb3dzOlt7dHlwZTpZYSxhcmdzOlt0Qix7ZGVzY2VuZGFudHM6ITB9XX1dfSk7Y2xhc3MgbkJ7fWZ1bmN0aW9uIG9CKHQsZSl7MSZ0JiZYbSgwKX1uQi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bkIpfSxuQi7JtW1vZD1hbyh7dHlwZTpuQn0pLG5CLsm1aW5qPXZuKHtpbXBvcnRzOltbWEldLFhJXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobkIsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltYSV0sZXhwb3J0czpbZUIsdEIsWEldLGRlY2xhcmF0aW9uczpbZUIsdEJdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8obkIse2RlY2xhcmF0aW9uczpmdW5jdGlvbigpe3JldHVybltlQix0Ql19LGltcG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bWEldfSxleHBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW2VCLHRCLFhJXX19KTtjb25zdCBpQj1bIioiXTtmdW5jdGlvbiBhQih0LGUpe31jb25zdCByQj1mdW5jdGlvbih0KXtyZXR1cm57YW5pbWF0aW9uRHVyYXRpb246dH19LHNCPWZ1bmN0aW9uKHQsZSl7cmV0dXJue3ZhbHVlOnQscGFyYW1zOmV9fSxsQj1bInRhYkJvZHlXcmFwcGVyIl0sY0I9WyJ0YWJIZWFkZXIiXTtmdW5jdGlvbiBkQih0LGUpe31mdW5jdGlvbiBwQih0LGUpezEmdCYmUXAoMCxkQiwwLDAsIm5nLXRlbXBsYXRlIiw5KSwyJnQmJkRtKCJjZGtQb3J0YWxPdXRsZXQiLFltKCkuJGltcGxpY2l0LnRlbXBsYXRlTGFiZWwpfWZ1bmN0aW9uIG1CKHQsZSl7MSZ0JiZrdSgwKSwyJnQmJlN1KFltKCkuJGltcGxpY2l0LnRleHRMYWJlbCl9ZnVuY3Rpb24gdUIodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDYpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUoKXtjb25zdCBuPWhpKHQpLG89bi4kaW1wbGljaXQsaT1uLmluZGV4LGE9WW0oKSxyPSRwKDEpO3JldHVybiBhLl9oYW5kbGVDbGljayhvLHIsaSl9KSkoImNka0ZvY3VzQ2hhbmdlIiwoZnVuY3Rpb24gZShuKXtjb25zdCBvPWhpKHQpLmluZGV4O3JldHVybiBZbSgpLl90YWJGb2N1c0NoYW5nZWQobixvKX0pKSxSbSgxLCJkaXYiLDcpLFFwKDIscEIsMSwxLCJuZy10ZW1wbGF0ZSIsOCksUXAoMyxtQiwxLDEsIm5nLXRlbXBsYXRlIiw4KSxBbSgpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49ZS5pbmRleCxvPVltKCk7cHUoIm1hdC10YWItbGFiZWwtYWN0aXZlIixvLnNlbGVjdGVkSW5kZXg9PW4pLERtKCJpZCIsby5fZ2V0VGFiTGFiZWxJZChuKSkoImRpc2FibGVkIix0LmRpc2FibGVkKSgibWF0UmlwcGxlRGlzYWJsZWQiLHQuZGlzYWJsZWR8fG8uZGlzYWJsZVJpcHBsZSksanAoInRhYkluZGV4IixvLl9nZXRUYWJJbmRleCh0LG4pKSgiYXJpYS1wb3NpbnNldCIsbisxKSgiYXJpYS1zZXRzaXplIixvLl90YWJzLmxlbmd0aCkoImFyaWEtY29udHJvbHMiLG8uX2dldFRhYkNvbnRlbnRJZChuKSkoImFyaWEtc2VsZWN0ZWQiLG8uc2VsZWN0ZWRJbmRleD09bikoImFyaWEtbGFiZWwiLHQuYXJpYUxhYmVsfHxudWxsKSgiYXJpYS1sYWJlbGxlZGJ5IiwhdC5hcmlhTGFiZWwmJnQuYXJpYUxhYmVsbGVkYnk/dC5hcmlhTGFiZWxsZWRieTpudWxsKSxyYygyKSxEbSgibmdJZiIsdC50ZW1wbGF0ZUxhYmVsKSxyYygxKSxEbSgibmdJZiIsIXQudGVtcGxhdGVMYWJlbCl9fWZ1bmN0aW9uIGZCKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwibWF0LXRhYi1ib2R5IiwxMCksVm0oIl9vbkNlbnRlcmVkIiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgpLl9yZW1vdmVUYWJCb2R5V3JhcHBlckhlaWdodCgpfSkpKCJfb25DZW50ZXJpbmciLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLl9zZXRUYWJCb2R5V3JhcHBlckhlaWdodChuKX0pKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdCxuPWUuaW5kZXgsbz1ZbSgpO3B1KCJtYXQtdGFiLWJvZHktYWN0aXZlIixvLnNlbGVjdGVkSW5kZXg9PT1uKSxEbSgiaWQiLG8uX2dldFRhYkNvbnRlbnRJZChuKSkoImNvbnRlbnQiLHQuY29udGVudCkoInBvc2l0aW9uIix0LnBvc2l0aW9uKSgib3JpZ2luIix0Lm9yaWdpbikoImFuaW1hdGlvbkR1cmF0aW9uIixvLmFuaW1hdGlvbkR1cmF0aW9uKSxqcCgidGFiaW5kZXgiLG51bGwhPW8uY29udGVudFRhYkluZGV4JiZvLnNlbGVjdGVkSW5kZXg9PT1uP28uY29udGVudFRhYkluZGV4Om51bGwpKCJhcmlhLWxhYmVsbGVkYnkiLG8uX2dldFRhYkxhYmVsSWQobikpfX1jb25zdCBnQj1bInRhYkxpc3RDb250YWluZXIiXSxoQj1bInRhYkxpc3QiXSxiQj1bIm5leHRQYWdpbmF0b3IiXSx5Qj1bInByZXZpb3VzUGFnaW5hdG9yIl0sX0I9bmV3IEdhKCJNYXRJbmtCYXJQb3NpdGlvbmVyIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbiBDQigpe3JldHVybiB0PT4oe2xlZnQ6dD8odC5vZmZzZXRMZWZ0fHwwKSsicHgiOiIwIix3aWR0aDp0Pyh0Lm9mZnNldFdpZHRofHwwKSsicHgiOiIwIn0pfX0pO2NsYXNzIE1Ce2NvbnN0cnVjdG9yKHQsZSxuLG8pe3RoaXMuX2VsZW1lbnRSZWY9dCx0aGlzLl9uZ1pvbmU9ZSx0aGlzLl9pbmtCYXJQb3NpdGlvbmVyPW4sdGhpcy5fYW5pbWF0aW9uTW9kZT1vfWFsaWduVG9FbGVtZW50KHQpe3RoaXMuc2hvdygpLCJ1bmRlZmluZWQiIT10eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lP3RoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PntyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT50aGlzLl9zZXRTdHlsZXModCkpKX0pKTp0aGlzLl9zZXRTdHlsZXModCl9c2hvdygpe3RoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIn1oaWRlKCl7dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9X3NldFN0eWxlcyh0KXtjb25zdCBlPXRoaXMuX2lua0JhclBvc2l0aW9uZXIodCksbj10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7bi5zdHlsZS5sZWZ0PWUubGVmdCxuLnN0eWxlLndpZHRoPWUud2lkdGh9fU1CLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxNQikoU20oaGcpLFNtKGFfKSxTbShfQiksU20oVlAsOCkpfSxNQi7JtWRpcj1sbyh7dHlwZTpNQixzZWxlY3RvcnM6W1sibWF0LWluay1iYXIiXV0saG9zdEF0dHJzOlsxLCJtYXQtaW5rLWJhciJdLGhvc3RWYXJzOjIsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJnB1KCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsIk5vb3BBbmltYXRpb25zIj09PW4uX2FuaW1hdGlvbk1vZGUpfX0pLE1CLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOmFffSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbX0JdfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKE1CLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC1pbmstYmFyIixob3N0OntjbGFzczoibWF0LWluay1iYXIiLCJbY2xhc3MuX21hdC1hbmltYXRpb24tbm9vcGFibGVdIjoiX2FuaW1hdGlvbk1vZGUgPT09ICdOb29wQW5pbWF0aW9ucycifX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W19CXX1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IHZCPW5ldyBHYSgiTWF0VGFiQ29udGVudCIpO2NsYXNzIHhCe2NvbnN0cnVjdG9yKHQpe3RoaXMudGVtcGxhdGU9dH19eEIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHhCKShTbShYZykpfSx4Qi7JtWRpcj1sbyh7dHlwZTp4QixzZWxlY3RvcnM6W1siIiwibWF0VGFiQ29udGVudCIsIiJdXSxmZWF0dXJlczpbcGcoW3twcm92aWRlOnZCLHVzZUV4aXN0aW5nOnhCfV0pXX0pLHhCLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6WGd9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHhCLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IlttYXRUYWJDb250ZW50XSIscHJvdmlkZXJzOlt7cHJvdmlkZTp2Qix1c2VFeGlzdGluZzp4Qn1dfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6WGd9XX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgT0I9bmV3IEdhKCJNYXRUYWJMYWJlbCIpO2NsYXNzIFBCIGV4dGVuZHMga0Z7fVBCLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYShQQikpKShufHxQQil9fSkoKSxQQi7JtWRpcj1sbyh7dHlwZTpQQixzZWxlY3RvcnM6W1siIiwibWF0LXRhYi1sYWJlbCIsIiJdLFsiIiwibWF0VGFiTGFiZWwiLCIiXV0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTpPQix1c2VFeGlzdGluZzpQQn1dKSx4cF19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFBCLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IlttYXQtdGFiLWxhYmVsXSwgW21hdFRhYkxhYmVsXSIscHJvdmlkZXJzOlt7cHJvdmlkZTpPQix1c2VFeGlzdGluZzpQQn1dfV19XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3Qgd0I9S0koY2xhc3N7fSksa0I9bmV3IEdhKCJNQVRfVEFCX0dST1VQIik7Y2xhc3MgU0IgZXh0ZW5kcyB3Qntjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5fdmlld0NvbnRhaW5lclJlZj10LHRoaXMuX2Nsb3Nlc3RUYWJHcm91cD1lLHRoaXMudGV4dExhYmVsPSIiLHRoaXMuX2NvbnRlbnRQb3J0YWw9bnVsbCx0aGlzLl9zdGF0ZUNoYW5nZXM9bmV3IEksdGhpcy5wb3NpdGlvbj1udWxsLHRoaXMub3JpZ2luPW51bGwsdGhpcy5pc0FjdGl2ZT0hMX1nZXQgdGVtcGxhdGVMYWJlbCgpe3JldHVybiB0aGlzLl90ZW1wbGF0ZUxhYmVsfXNldCB0ZW1wbGF0ZUxhYmVsKHQpe3RoaXMuX3NldFRlbXBsYXRlTGFiZWxJbnB1dCh0KX1nZXQgY29udGVudCgpe3JldHVybiB0aGlzLl9jb250ZW50UG9ydGFsfW5nT25DaGFuZ2VzKHQpeyh0Lmhhc093blByb3BlcnR5KCJ0ZXh0TGFiZWwiKXx8dC5oYXNPd25Qcm9wZXJ0eSgiZGlzYWJsZWQiKSkmJnRoaXMuX3N0YXRlQ2hhbmdlcy5uZXh0KCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9zdGF0ZUNoYW5nZXMuY29tcGxldGUoKX1uZ09uSW5pdCgpe3RoaXMuX2NvbnRlbnRQb3J0YWw9bmV3IHhGKHRoaXMuX2V4cGxpY2l0Q29udGVudHx8dGhpcy5faW1wbGljaXRDb250ZW50LHRoaXMuX3ZpZXdDb250YWluZXJSZWYpfV9zZXRUZW1wbGF0ZUxhYmVsSW5wdXQodCl7dCYmKHRoaXMuX3RlbXBsYXRlTGFiZWw9dCl9fVNCLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxTQikoU20oZWgpLFNtKGtCLDgpKX0sU0IuybVjbXA9dG8oe3R5cGU6U0Isc2VsZWN0b3JzOltbIm1hdC10YWIiXV0sY29udGVudFF1ZXJpZXM6ZnVuY3Rpb24gdChlLG4sbyl7aWYoMSZlJiYoJGgobyxPQiw1KSwkaChvLHZCLDcsWGcpKSwyJmUpe2xldCB0O0poKHQ9dGIoKSkmJihuLnRlbXBsYXRlTGFiZWw9dC5maXJzdCksSmgodD10YigpKSYmKG4uX2V4cGxpY2l0Q29udGVudD10LmZpcnN0KX19LHZpZXdRdWVyeTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiZRaChYZyw3KSwyJmUpe2xldCB0O0poKHQ9dGIoKSkmJihuLl9pbXBsaWNpdENvbnRlbnQ9dC5maXJzdCl9fSxpbnB1dHM6e2Rpc2FibGVkOiJkaXNhYmxlZCIsdGV4dExhYmVsOlsibGFiZWwiLCJ0ZXh0TGFiZWwiXSxhcmlhTGFiZWw6WyJhcmlhLWxhYmVsIiwiYXJpYUxhYmVsIl0sYXJpYUxhYmVsbGVkYnk6WyJhcmlhLWxhYmVsbGVkYnkiLCJhcmlhTGFiZWxsZWRieSJdfSxleHBvcnRBczpbIm1hdFRhYiJdLGZlYXR1cmVzOlt4cCxCb10sbmdDb250ZW50U2VsZWN0b3JzOmlCLGRlY2xzOjEsdmFyczowLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabSgpLFFwKDAsb0IsMSwwLCJuZy10ZW1wbGF0ZSIpKX0sZW5jYXBzdWxhdGlvbjoyfSksU0IuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTplaH0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W2tCXX0se3R5cGU6U3J9XX1dLFNCLnByb3BEZWNvcmF0b3JzPXt0ZW1wbGF0ZUxhYmVsOlt7dHlwZTpxYSxhcmdzOltPQl19XSxfZXhwbGljaXRDb250ZW50Olt7dHlwZTpxYSxhcmdzOlt2Qix7cmVhZDpYZyxzdGF0aWM6ITB9XX1dLF9pbXBsaWNpdENvbnRlbnQ6W3t0eXBlOlphLGFyZ3M6W1hnLHtzdGF0aWM6ITB9XX1dLHRleHRMYWJlbDpbe3R5cGU6eHksYXJnczpbImxhYmVsIl19XSxhcmlhTGFiZWw6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsIl19XSxhcmlhTGFiZWxsZWRieTpbe3R5cGU6eHksYXJnczpbImFyaWEtbGFiZWxsZWRieSJdfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoU0IsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWF0LXRhYiIsdGVtcGxhdGU6Ilx4M2MhLS0gQ3JlYXRlIGEgdGVtcGxhdGUgZm9yIHRoZSBjb250ZW50IG9mIHRoZSA8bWF0LXRhYj4gc28gdGhhdCB3ZSBjYW4gZ3JhYiBhIHJlZmVyZW5jZSB0byB0aGlzXG4gICAgVGVtcGxhdGVSZWYgYW5kIHVzZSBpdCBpbiBhIFBvcnRhbCB0byByZW5kZXIgdGhlIHRhYiBjb250ZW50IGluIHRoZSBhcHByb3ByaWF0ZSBwbGFjZSBpbiB0aGVcbiAgICB0YWItZ3JvdXAuIC0tXHgzZVxuPG5nLXRlbXBsYXRlPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L25nLXRlbXBsYXRlPlxuIixpbnB1dHM6WyJkaXNhYmxlZCJdLGNoYW5nZURldGVjdGlvbjp6bi5EZWZhdWx0LGVuY2Fwc3VsYXRpb246SG4uTm9uZSxleHBvcnRBczoibWF0VGFiIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmVofSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpba0JdfSx7dHlwZTpTcn1dfV19KSx7dGV4dExhYmVsOlt7dHlwZTp4eSxhcmdzOlsibGFiZWwiXX1dLHRlbXBsYXRlTGFiZWw6W3t0eXBlOnFhLGFyZ3M6W09CXX1dLF9leHBsaWNpdENvbnRlbnQ6W3t0eXBlOnFhLGFyZ3M6W3ZCLHtyZWFkOlhnLHN0YXRpYzohMH1dfV0sX2ltcGxpY2l0Q29udGVudDpbe3R5cGU6WmEsYXJnczpbWGcse3N0YXRpYzohMH1dfV0sYXJpYUxhYmVsOlt7dHlwZTp4eSxhcmdzOlsiYXJpYS1sYWJlbCJdfV0sYXJpYUxhYmVsbGVkYnk6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsbGVkYnkiXX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBEQj17dHJhbnNsYXRlVGFiOm54KCJ0cmFuc2xhdGVUYWIiLFtyeCgiY2VudGVyLCB2b2lkLCBsZWZ0LW9yaWdpbi1jZW50ZXIsIHJpZ2h0LW9yaWdpbi1jZW50ZXIiLGF4KHt0cmFuc2Zvcm06Im5vbmUifSkpLHJ4KCJsZWZ0IixheCh7dHJhbnNmb3JtOiJ0cmFuc2xhdGUzZCgtMTAwJSwgMCwgMCkiLG1pbkhlaWdodDoiMXB4In0pKSxyeCgicmlnaHQiLGF4KHt0cmFuc2Zvcm06InRyYW5zbGF0ZTNkKDEwMCUsIDAsIDApIixtaW5IZWlnaHQ6IjFweCJ9KSksbHgoIiogPT4gbGVmdCwgKiA9PiByaWdodCwgbGVmdCA9PiBjZW50ZXIsIHJpZ2h0ID0+IGNlbnRlciIsb3goInt7YW5pbWF0aW9uRHVyYXRpb259fSBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSkiKSksbHgoInZvaWQgPT4gbGVmdC1vcmlnaW4tY2VudGVyIixbYXgoe3RyYW5zZm9ybToidHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApIn0pLG94KCJ7e2FuaW1hdGlvbkR1cmF0aW9ufX0gY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpIildKSxseCgidm9pZCA9PiByaWdodC1vcmlnaW4tY2VudGVyIixbYXgoe3RyYW5zZm9ybToidHJhbnNsYXRlM2QoMTAwJSwgMCwgMCkifSksb3goInt7YW5pbWF0aW9uRHVyYXRpb259fSBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSkiKV0pXSl9OwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBFQiBleHRlbmRzIERGe2NvbnN0cnVjdG9yKHQsZSxuLG8pe3N1cGVyKHQsZSxvKSx0aGlzLl9ob3N0PW4sdGhpcy5fY2VudGVyaW5nU3ViPW0uRU1QVFksdGhpcy5fbGVhdmluZ1N1Yj1tLkVNUFRZfW5nT25Jbml0KCl7c3VwZXIubmdPbkluaXQoKSx0aGlzLl9jZW50ZXJpbmdTdWI9dGhpcy5faG9zdC5fYmVmb3JlQ2VudGVyaW5nLnBpcGUoTmUodGhpcy5faG9zdC5faXNDZW50ZXJQb3NpdGlvbih0aGlzLl9ob3N0Ll9wb3NpdGlvbikpKS5zdWJzY3JpYmUoKHQ9Pnt0JiYhdGhpcy5oYXNBdHRhY2hlZCgpJiZ0aGlzLmF0dGFjaCh0aGlzLl9ob3N0Ll9jb250ZW50KX0pKSx0aGlzLl9sZWF2aW5nU3ViPXRoaXMuX2hvc3QuX2FmdGVyTGVhdmluZ0NlbnRlci5zdWJzY3JpYmUoKCgpPT57dGhpcy5kZXRhY2goKX0pKX1uZ09uRGVzdHJveSgpe3N1cGVyLm5nT25EZXN0cm95KCksdGhpcy5fY2VudGVyaW5nU3ViLnVuc3Vic2NyaWJlKCksdGhpcy5fbGVhdmluZ1N1Yi51bnN1YnNjcmliZSgpfX1FQi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8RUIpKFNtKHVnKSxTbShlaCksU20ocWUoKCgpPT5BQikpKSxTbShaXykpfSxFQi7JtWRpcj1sbyh7dHlwZTpFQixzZWxlY3RvcnM6W1siIiwibWF0VGFiQm9keUhvc3QiLCIiXV0sZmVhdHVyZXM6W3hwXX0pLEVCLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6dWd9LHt0eXBlOmVofSx7dHlwZTpBQixkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltxZSgoKCk9PkFCKSldfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRUIsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW21hdFRhYkJvZHlIb3N0XSJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp1Z30se3R5cGU6ZWh9LHt0eXBlOkFCLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3FlKCgoKT0+QUIpKV19XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV19KSxudWxsKTtjbGFzcyBSQntjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5fZWxlbWVudFJlZj10LHRoaXMuX2Rpcj1lLHRoaXMuX2RpckNoYW5nZVN1YnNjcmlwdGlvbj1tLkVNUFRZLHRoaXMuX3RyYW5zbGF0ZVRhYkNvbXBsZXRlPW5ldyBJLHRoaXMuX29uQ2VudGVyaW5nPW5ldyBMaCx0aGlzLl9iZWZvcmVDZW50ZXJpbmc9bmV3IExoLHRoaXMuX2FmdGVyTGVhdmluZ0NlbnRlcj1uZXcgTGgsdGhpcy5fb25DZW50ZXJlZD1uZXcgTGgoITApLHRoaXMuYW5pbWF0aW9uRHVyYXRpb249IjUwMG1zIixlJiYodGhpcy5fZGlyQ2hhbmdlU3Vic2NyaXB0aW9uPWUuY2hhbmdlLnN1YnNjcmliZSgodD0+e3RoaXMuX2NvbXB1dGVQb3NpdGlvbkFuaW1hdGlvblN0YXRlKHQpLG4ubWFya0ZvckNoZWNrKCl9KSkpLHRoaXMuX3RyYW5zbGF0ZVRhYkNvbXBsZXRlLnBpcGUoTWUoKCh0LGUpPT50LmZyb21TdGF0ZT09PWUuZnJvbVN0YXRlJiZ0LnRvU3RhdGU9PT1lLnRvU3RhdGUpKSkuc3Vic2NyaWJlKCh0PT57dGhpcy5faXNDZW50ZXJQb3NpdGlvbih0LnRvU3RhdGUpJiZ0aGlzLl9pc0NlbnRlclBvc2l0aW9uKHRoaXMuX3Bvc2l0aW9uKSYmdGhpcy5fb25DZW50ZXJlZC5lbWl0KCksdGhpcy5faXNDZW50ZXJQb3NpdGlvbih0LmZyb21TdGF0ZSkmJiF0aGlzLl9pc0NlbnRlclBvc2l0aW9uKHRoaXMuX3Bvc2l0aW9uKSYmdGhpcy5fYWZ0ZXJMZWF2aW5nQ2VudGVyLmVtaXQoKX0pKX1zZXQgcG9zaXRpb24odCl7dGhpcy5fcG9zaXRpb25JbmRleD10LHRoaXMuX2NvbXB1dGVQb3NpdGlvbkFuaW1hdGlvblN0YXRlKCl9bmdPbkluaXQoKXsiY2VudGVyIj09dGhpcy5fcG9zaXRpb24mJm51bGwhPXRoaXMub3JpZ2luJiYodGhpcy5fcG9zaXRpb249dGhpcy5fY29tcHV0ZVBvc2l0aW9uRnJvbU9yaWdpbih0aGlzLm9yaWdpbikpfW5nT25EZXN0cm95KCl7dGhpcy5fZGlyQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5fdHJhbnNsYXRlVGFiQ29tcGxldGUuY29tcGxldGUoKX1fb25UcmFuc2xhdGVUYWJTdGFydGVkKHQpe2NvbnN0IGU9dGhpcy5faXNDZW50ZXJQb3NpdGlvbih0LnRvU3RhdGUpO3RoaXMuX2JlZm9yZUNlbnRlcmluZy5lbWl0KGUpLGUmJnRoaXMuX29uQ2VudGVyaW5nLmVtaXQodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCl9X2dldExheW91dERpcmVjdGlvbigpe3JldHVybiB0aGlzLl9kaXImJiJydGwiPT09dGhpcy5fZGlyLnZhbHVlPyJydGwiOiJsdHIifV9pc0NlbnRlclBvc2l0aW9uKHQpe3JldHVybiJjZW50ZXIiPT10fHwibGVmdC1vcmlnaW4tY2VudGVyIj09dHx8InJpZ2h0LW9yaWdpbi1jZW50ZXIiPT10fV9jb21wdXRlUG9zaXRpb25BbmltYXRpb25TdGF0ZSh0PXRoaXMuX2dldExheW91dERpcmVjdGlvbigpKXt0aGlzLl9wb3NpdGlvbj10aGlzLl9wb3NpdGlvbkluZGV4PDA/Imx0ciI9PXQ/ImxlZnQiOiJyaWdodCI6dGhpcy5fcG9zaXRpb25JbmRleD4wPyJsdHIiPT10PyJyaWdodCI6ImxlZnQiOiJjZW50ZXIifV9jb21wdXRlUG9zaXRpb25Gcm9tT3JpZ2luKHQpe2NvbnN0IGU9dGhpcy5fZ2V0TGF5b3V0RGlyZWN0aW9uKCk7cmV0dXJuImx0ciI9PWUmJnQ8PTB8fCJydGwiPT1lJiZ0PjA/ImxlZnQtb3JpZ2luLWNlbnRlciI6InJpZ2h0LW9yaWdpbi1jZW50ZXIifX1SQi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8UkIpKFNtKGhnKSxTbShISSw4KSxTbShVZykpfSxSQi7JtWRpcj1sbyh7dHlwZTpSQixpbnB1dHM6e2FuaW1hdGlvbkR1cmF0aW9uOiJhbmltYXRpb25EdXJhdGlvbiIscG9zaXRpb246InBvc2l0aW9uIixfY29udGVudDpbImNvbnRlbnQiLCJfY29udGVudCJdLG9yaWdpbjoib3JpZ2luIn0sb3V0cHV0czp7X29uQ2VudGVyaW5nOiJfb25DZW50ZXJpbmciLF9iZWZvcmVDZW50ZXJpbmc6Il9iZWZvcmVDZW50ZXJpbmciLF9hZnRlckxlYXZpbmdDZW50ZXI6Il9hZnRlckxlYXZpbmdDZW50ZXIiLF9vbkNlbnRlcmVkOiJfb25DZW50ZXJlZCJ9fSksUkIuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ30se3R5cGU6SEksZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6VWd9XSxSQi5wcm9wRGVjb3JhdG9ycz17X29uQ2VudGVyaW5nOlt7dHlwZTpPeX1dLF9iZWZvcmVDZW50ZXJpbmc6W3t0eXBlOk95fV0sX2FmdGVyTGVhdmluZ0NlbnRlcjpbe3R5cGU6T3l9XSxfb25DZW50ZXJlZDpbe3R5cGU6T3l9XSxfY29udGVudDpbe3R5cGU6eHksYXJnczpbImNvbnRlbnQiXX1dLG9yaWdpbjpbe3R5cGU6eHl9XSxhbmltYXRpb25EdXJhdGlvbjpbe3R5cGU6eHl9XSxwb3NpdGlvbjpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChSQixbe3R5cGU6Q3l9XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOlVnfV19KSx7X29uQ2VudGVyaW5nOlt7dHlwZTpPeX1dLF9iZWZvcmVDZW50ZXJpbmc6W3t0eXBlOk95fV0sX2FmdGVyTGVhdmluZ0NlbnRlcjpbe3R5cGU6T3l9XSxfb25DZW50ZXJlZDpbe3R5cGU6T3l9XSxhbmltYXRpb25EdXJhdGlvbjpbe3R5cGU6eHl9XSxwb3NpdGlvbjpbe3R5cGU6eHl9XSxfY29udGVudDpbe3R5cGU6eHksYXJnczpbImNvbnRlbnQiXX1dLG9yaWdpbjpbe3R5cGU6eHl9XX0pO2NsYXNzIEFCIGV4dGVuZHMgUkJ7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHQsZSxuKX19QUIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEFCKShTbShoZyksU20oSEksOCksU20oVWcpKX0sQUIuybVjbXA9dG8oe3R5cGU6QUIsc2VsZWN0b3JzOltbIm1hdC10YWItYm9keSJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmUWgoREYsNSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5fcG9ydGFsSG9zdD10LmZpcnN0KX19LGhvc3RBdHRyczpbMSwibWF0LXRhYi1ib2R5Il0sZmVhdHVyZXM6W3hwXSxkZWNsczozLHZhcnM6Nixjb25zdHM6W1siY2RrU2Nyb2xsYWJsZSIsIiIsMSwibWF0LXRhYi1ib2R5LWNvbnRlbnQiXSxbImNvbnRlbnQiLCIiXSxbIm1hdFRhYkJvZHlIb3N0IiwiIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJkaXYiLDAsMSksVm0oIkB0cmFuc2xhdGVUYWIuc3RhcnQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9vblRyYW5zbGF0ZVRhYlN0YXJ0ZWQoZSl9KSkoIkB0cmFuc2xhdGVUYWIuZG9uZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX3RyYW5zbGF0ZVRhYkNvbXBsZXRlLm5leHQoZSl9KSksUXAoMixhQiwwLDAsIm5nLXRlbXBsYXRlIiwyKSxBbSgpKSwyJmUmJkRtKCJAdHJhbnNsYXRlVGFiIix2aCgzLHNCLG4uX3Bvc2l0aW9uLE1oKDEsckIsbi5hbmltYXRpb25EdXJhdGlvbikpKX0sZGlyZWN0aXZlczpbRUJdLHN0eWxlczpbIi5tYXQtdGFiLWJvZHktY29udGVudHtoZWlnaHQ6MTAwJTtvdmVyZmxvdzphdXRvfS5tYXQtdGFiLWdyb3VwLWR5bmFtaWMtaGVpZ2h0IC5tYXQtdGFiLWJvZHktY29udGVudHtvdmVyZmxvdzpoaWRkZW59XG4iXSxlbmNhcHN1bGF0aW9uOjIsZGF0YTp7YW5pbWF0aW9uOltEQi50cmFuc2xhdGVUYWJdfX0pLEFCLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOlVnfV0sQUIucHJvcERlY29yYXRvcnM9e19wb3J0YWxIb3N0Olt7dHlwZTpaYSxhcmdzOltERl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChBQixbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtYXQtdGFiLWJvZHkiLHRlbXBsYXRlOic8ZGl2IGNsYXNzPSJtYXQtdGFiLWJvZHktY29udGVudCIgI2NvbnRlbnRcbiAgICAgW0B0cmFuc2xhdGVUYWJdPSJ7XG4gICAgICAgIHZhbHVlOiBfcG9zaXRpb24sXG4gICAgICAgIHBhcmFtczoge2FuaW1hdGlvbkR1cmF0aW9uOiBhbmltYXRpb25EdXJhdGlvbn1cbiAgICAgfSJcbiAgICAgKEB0cmFuc2xhdGVUYWIuc3RhcnQpPSJfb25UcmFuc2xhdGVUYWJTdGFydGVkKCRldmVudCkiXG4gICAgIChAdHJhbnNsYXRlVGFiLmRvbmUpPSJfdHJhbnNsYXRlVGFiQ29tcGxldGUubmV4dCgkZXZlbnQpIlxuICAgICBjZGtTY3JvbGxhYmxlPlxuICA8bmctdGVtcGxhdGUgbWF0VGFiQm9keUhvc3Q+PC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuJyxlbmNhcHN1bGF0aW9uOkhuLk5vbmUsY2hhbmdlRGV0ZWN0aW9uOnpuLkRlZmF1bHQsYW5pbWF0aW9uczpbREIudHJhbnNsYXRlVGFiXSxob3N0OntjbGFzczoibWF0LXRhYi1ib2R5In0sc3R5bGVzOlsiLm1hdC10YWItYm9keS1jb250ZW50e2hlaWdodDoxMDAlO292ZXJmbG93OmF1dG99Lm1hdC10YWItZ3JvdXAtZHluYW1pYy1oZWlnaHQgLm1hdC10YWItYm9keS1jb250ZW50e292ZXJmbG93OmhpZGRlbn1cbiJdfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOlVnfV19KSx7X3BvcnRhbEhvc3Q6W3t0eXBlOlphLGFyZ3M6W0RGXX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBUQj1uZXcgR2EoIk1BVF9UQUJTX0NPTkZJRyIpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9sZXQgTkI9MDtjbGFzcyB6Qnt9Y29uc3QgSUI9SkkoUUkoY2xhc3N7Y29uc3RydWN0b3IodCl7dGhpcy5fZWxlbWVudFJlZj10fX0pLCJwcmltYXJ5Iik7Y2xhc3MgSEIgZXh0ZW5kcyBJQntjb25zdHJ1Y3Rvcih0LGUsbixvKXt2YXIgaTtzdXBlcih0KSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZj1lLHRoaXMuX2FuaW1hdGlvbk1vZGU9byx0aGlzLl90YWJzPW5ldyBWaCx0aGlzLl9pbmRleFRvU2VsZWN0PTAsdGhpcy5fdGFiQm9keVdyYXBwZXJIZWlnaHQ9MCx0aGlzLl90YWJzU3Vic2NyaXB0aW9uPW0uRU1QVFksdGhpcy5fdGFiTGFiZWxTdWJzY3JpcHRpb249bS5FTVBUWSx0aGlzLl9zZWxlY3RlZEluZGV4PW51bGwsdGhpcy5oZWFkZXJQb3NpdGlvbj0iYWJvdmUiLHRoaXMuc2VsZWN0ZWRJbmRleENoYW5nZT1uZXcgTGgsdGhpcy5mb2N1c0NoYW5nZT1uZXcgTGgsdGhpcy5hbmltYXRpb25Eb25lPW5ldyBMaCx0aGlzLnNlbGVjdGVkVGFiQ2hhbmdlPW5ldyBMaCghMCksdGhpcy5fZ3JvdXBJZD1OQisrLHRoaXMuYW5pbWF0aW9uRHVyYXRpb249biYmbi5hbmltYXRpb25EdXJhdGlvbj9uLmFuaW1hdGlvbkR1cmF0aW9uOiI1MDBtcyIsdGhpcy5kaXNhYmxlUGFnaW5hdGlvbj0hKCFufHxudWxsPT1uLmRpc2FibGVQYWdpbmF0aW9uKSYmbi5kaXNhYmxlUGFnaW5hdGlvbix0aGlzLmR5bmFtaWNIZWlnaHQ9ISghbnx8bnVsbD09bi5keW5hbWljSGVpZ2h0KSYmbi5keW5hbWljSGVpZ2h0LHRoaXMuY29udGVudFRhYkluZGV4PW51bGwhPT0oaT1udWxsPT1uP3ZvaWQgMDpuLmNvbnRlbnRUYWJJbmRleCkmJnZvaWQgMCE9PWk/aTpudWxsfWdldCBkeW5hbWljSGVpZ2h0KCl7cmV0dXJuIHRoaXMuX2R5bmFtaWNIZWlnaHR9c2V0IGR5bmFtaWNIZWlnaHQodCl7dGhpcy5fZHluYW1pY0hlaWdodD15eih0KX1nZXQgc2VsZWN0ZWRJbmRleCgpe3JldHVybiB0aGlzLl9zZWxlY3RlZEluZGV4fXNldCBzZWxlY3RlZEluZGV4KHQpe3RoaXMuX2luZGV4VG9TZWxlY3Q9X3oodCxudWxsKX1nZXQgYW5pbWF0aW9uRHVyYXRpb24oKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uRHVyYXRpb259c2V0IGFuaW1hdGlvbkR1cmF0aW9uKHQpe3RoaXMuX2FuaW1hdGlvbkR1cmF0aW9uPS9eXGQrJC8udGVzdCh0KT90KyJtcyI6dH1nZXQgY29udGVudFRhYkluZGV4KCl7cmV0dXJuIHRoaXMuX2NvbnRlbnRUYWJJbmRleH1zZXQgY29udGVudFRhYkluZGV4KHQpe3RoaXMuX2NvbnRlbnRUYWJJbmRleD1feih0LG51bGwpfWdldCBiYWNrZ3JvdW5kQ29sb3IoKXtyZXR1cm4gdGhpcy5fYmFja2dyb3VuZENvbG9yfXNldCBiYWNrZ3JvdW5kQ29sb3IodCl7Y29uc3QgZT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7ZS5jbGFzc0xpc3QucmVtb3ZlKGBtYXQtYmFja2dyb3VuZC0ke3RoaXMuYmFja2dyb3VuZENvbG9yfWApLHQmJmUuY2xhc3NMaXN0LmFkZChgbWF0LWJhY2tncm91bmQtJHt0fWApLHRoaXMuX2JhY2tncm91bmRDb2xvcj10fW5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpe2NvbnN0IHQ9dGhpcy5faW5kZXhUb1NlbGVjdD10aGlzLl9jbGFtcFRhYkluZGV4KHRoaXMuX2luZGV4VG9TZWxlY3QpO2lmKHRoaXMuX3NlbGVjdGVkSW5kZXghPXQpe2NvbnN0IGU9bnVsbD09dGhpcy5fc2VsZWN0ZWRJbmRleDtpZighZSl7dGhpcy5zZWxlY3RlZFRhYkNoYW5nZS5lbWl0KHRoaXMuX2NyZWF0ZUNoYW5nZUV2ZW50KHQpKTtjb25zdCBlPXRoaXMuX3RhYkJvZHlXcmFwcGVyLm5hdGl2ZUVsZW1lbnQ7ZS5zdHlsZS5taW5IZWlnaHQ9ZS5jbGllbnRIZWlnaHQrInB4In1Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+e3RoaXMuX3RhYnMuZm9yRWFjaCgoKGUsbik9PmUuaXNBY3RpdmU9bj09PXQpKSxlfHwodGhpcy5zZWxlY3RlZEluZGV4Q2hhbmdlLmVtaXQodCksdGhpcy5fdGFiQm9keVdyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS5taW5IZWlnaHQ9IiIpfSkpfXRoaXMuX3RhYnMuZm9yRWFjaCgoKGUsbik9PntlLnBvc2l0aW9uPW4tdCxudWxsPT10aGlzLl9zZWxlY3RlZEluZGV4fHwwIT1lLnBvc2l0aW9ufHxlLm9yaWdpbnx8KGUub3JpZ2luPXQtdGhpcy5fc2VsZWN0ZWRJbmRleCl9KSksdGhpcy5fc2VsZWN0ZWRJbmRleCE9PXQmJih0aGlzLl9zZWxlY3RlZEluZGV4PXQsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpfW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX3N1YnNjcmliZVRvQWxsVGFiQ2hhbmdlcygpLHRoaXMuX3N1YnNjcmliZVRvVGFiTGFiZWxzKCksdGhpcy5fdGFic1N1YnNjcmlwdGlvbj10aGlzLl90YWJzLmNoYW5nZXMuc3Vic2NyaWJlKCgoKT0+e2lmKHRoaXMuX2NsYW1wVGFiSW5kZXgodGhpcy5faW5kZXhUb1NlbGVjdCk9PT10aGlzLl9zZWxlY3RlZEluZGV4KXtjb25zdCB0PXRoaXMuX3RhYnMudG9BcnJheSgpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKHRbZV0uaXNBY3RpdmUpe3RoaXMuX2luZGV4VG9TZWxlY3Q9dGhpcy5fc2VsZWN0ZWRJbmRleD1lO2JyZWFrfX10aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX0pKX1fc3Vic2NyaWJlVG9BbGxUYWJDaGFuZ2VzKCl7dGhpcy5fYWxsVGFicy5jaGFuZ2VzLnBpcGUoTmUodGhpcy5fYWxsVGFicykpLnN1YnNjcmliZSgodD0+e3RoaXMuX3RhYnMucmVzZXQodC5maWx0ZXIoKHQ9PnQuX2Nsb3Nlc3RUYWJHcm91cD09PXRoaXN8fCF0Ll9jbG9zZXN0VGFiR3JvdXApKSksdGhpcy5fdGFicy5ub3RpZnlPbkNoYW5nZXMoKX0pKX1uZ09uRGVzdHJveSgpe3RoaXMuX3RhYnMuZGVzdHJveSgpLHRoaXMuX3RhYnNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl90YWJMYWJlbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpfXJlYWxpZ25JbmtCYXIoKXt0aGlzLl90YWJIZWFkZXImJnRoaXMuX3RhYkhlYWRlci5fYWxpZ25JbmtCYXJUb1NlbGVjdGVkVGFiKCl9Zm9jdXNUYWIodCl7Y29uc3QgZT10aGlzLl90YWJIZWFkZXI7ZSYmKGUuZm9jdXNJbmRleD10KX1fZm9jdXNDaGFuZ2VkKHQpe3RoaXMuZm9jdXNDaGFuZ2UuZW1pdCh0aGlzLl9jcmVhdGVDaGFuZ2VFdmVudCh0KSl9X2NyZWF0ZUNoYW5nZUV2ZW50KHQpe2NvbnN0IGU9bmV3IHpCO3JldHVybiBlLmluZGV4PXQsdGhpcy5fdGFicyYmdGhpcy5fdGFicy5sZW5ndGgmJihlLnRhYj10aGlzLl90YWJzLnRvQXJyYXkoKVt0XSksZX1fc3Vic2NyaWJlVG9UYWJMYWJlbHMoKXt0aGlzLl90YWJMYWJlbFN1YnNjcmlwdGlvbiYmdGhpcy5fdGFiTGFiZWxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl90YWJMYWJlbFN1YnNjcmlwdGlvbj1yZSguLi50aGlzLl90YWJzLm1hcCgodD0+dC5fc3RhdGVDaGFuZ2VzKSkpLnN1YnNjcmliZSgoKCk9PnRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKSl9X2NsYW1wVGFiSW5kZXgodCl7cmV0dXJuIE1hdGgubWluKHRoaXMuX3RhYnMubGVuZ3RoLTEsTWF0aC5tYXgodHx8MCwwKSl9X2dldFRhYkxhYmVsSWQodCl7cmV0dXJuYG1hdC10YWItbGFiZWwtJHt0aGlzLl9ncm91cElkfS0ke3R9YH1fZ2V0VGFiQ29udGVudElkKHQpe3JldHVybmBtYXQtdGFiLWNvbnRlbnQtJHt0aGlzLl9ncm91cElkfS0ke3R9YH1fc2V0VGFiQm9keVdyYXBwZXJIZWlnaHQodCl7aWYoIXRoaXMuX2R5bmFtaWNIZWlnaHR8fCF0aGlzLl90YWJCb2R5V3JhcHBlckhlaWdodClyZXR1cm47Y29uc3QgZT10aGlzLl90YWJCb2R5V3JhcHBlci5uYXRpdmVFbGVtZW50O2Uuc3R5bGUuaGVpZ2h0PXRoaXMuX3RhYkJvZHlXcmFwcGVySGVpZ2h0KyJweCIsdGhpcy5fdGFiQm9keVdyYXBwZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQmJihlLnN0eWxlLmhlaWdodD10KyJweCIpfV9yZW1vdmVUYWJCb2R5V3JhcHBlckhlaWdodCgpe2NvbnN0IHQ9dGhpcy5fdGFiQm9keVdyYXBwZXIubmF0aXZlRWxlbWVudDt0aGlzLl90YWJCb2R5V3JhcHBlckhlaWdodD10LmNsaWVudEhlaWdodCx0LnN0eWxlLmhlaWdodD0iIix0aGlzLmFuaW1hdGlvbkRvbmUuZW1pdCgpfV9oYW5kbGVDbGljayh0LGUsbil7dC5kaXNhYmxlZHx8KHRoaXMuc2VsZWN0ZWRJbmRleD1lLmZvY3VzSW5kZXg9bil9X2dldFRhYkluZGV4KHQsZSl7cmV0dXJuIHQuZGlzYWJsZWQ/bnVsbDp0aGlzLnNlbGVjdGVkSW5kZXg9PT1lPzA6LTF9X3RhYkZvY3VzQ2hhbmdlZCh0LGUpe3QmJiJtb3VzZSIhPT10JiYidG91Y2giIT09dCYmKHRoaXMuX3RhYkhlYWRlci5mb2N1c0luZGV4PWUpfX1IQi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SEIpKFNtKGhnKSxTbShVZyksU20oVEIsOCksU20oVlAsOCkpfSxIQi7JtWRpcj1sbyh7dHlwZTpIQixpbnB1dHM6e2hlYWRlclBvc2l0aW9uOiJoZWFkZXJQb3NpdGlvbiIsYW5pbWF0aW9uRHVyYXRpb246ImFuaW1hdGlvbkR1cmF0aW9uIixkaXNhYmxlUGFnaW5hdGlvbjoiZGlzYWJsZVBhZ2luYXRpb24iLGR5bmFtaWNIZWlnaHQ6ImR5bmFtaWNIZWlnaHQiLGNvbnRlbnRUYWJJbmRleDoiY29udGVudFRhYkluZGV4IixzZWxlY3RlZEluZGV4OiJzZWxlY3RlZEluZGV4IixiYWNrZ3JvdW5kQ29sb3I6ImJhY2tncm91bmRDb2xvciJ9LG91dHB1dHM6e3NlbGVjdGVkSW5kZXhDaGFuZ2U6InNlbGVjdGVkSW5kZXhDaGFuZ2UiLGZvY3VzQ2hhbmdlOiJmb2N1c0NoYW5nZSIsYW5pbWF0aW9uRG9uZToiYW5pbWF0aW9uRG9uZSIsc2VsZWN0ZWRUYWJDaGFuZ2U6InNlbGVjdGVkVGFiQ2hhbmdlIn0sZmVhdHVyZXM6W3hwXX0pLEhCLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOlVnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbVEJdfSx7dHlwZTpTcn1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV0sSEIucHJvcERlY29yYXRvcnM9e2R5bmFtaWNIZWlnaHQ6W3t0eXBlOnh5fV0sc2VsZWN0ZWRJbmRleDpbe3R5cGU6eHl9XSxoZWFkZXJQb3NpdGlvbjpbe3R5cGU6eHl9XSxhbmltYXRpb25EdXJhdGlvbjpbe3R5cGU6eHl9XSxjb250ZW50VGFiSW5kZXg6W3t0eXBlOnh5fV0sZGlzYWJsZVBhZ2luYXRpb246W3t0eXBlOnh5fV0sYmFja2dyb3VuZENvbG9yOlt7dHlwZTp4eX1dLHNlbGVjdGVkSW5kZXhDaGFuZ2U6W3t0eXBlOk95fV0sZm9jdXNDaGFuZ2U6W3t0eXBlOk95fV0sYW5pbWF0aW9uRG9uZTpbe3R5cGU6T3l9XSxzZWxlY3RlZFRhYkNoYW5nZTpbe3R5cGU6T3l9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChIQixbe3R5cGU6Q3l9XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOlVnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbVEJdfSx7dHlwZTpTcn1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV19KSx7aGVhZGVyUG9zaXRpb246W3t0eXBlOnh5fV0sc2VsZWN0ZWRJbmRleENoYW5nZTpbe3R5cGU6T3l9XSxmb2N1c0NoYW5nZTpbe3R5cGU6T3l9XSxhbmltYXRpb25Eb25lOlt7dHlwZTpPeX1dLHNlbGVjdGVkVGFiQ2hhbmdlOlt7dHlwZTpPeX1dLGFuaW1hdGlvbkR1cmF0aW9uOlt7dHlwZTp4eX1dLGRpc2FibGVQYWdpbmF0aW9uOlt7dHlwZTp4eX1dLGR5bmFtaWNIZWlnaHQ6W3t0eXBlOnh5fV0sY29udGVudFRhYkluZGV4Olt7dHlwZTp4eX1dLHNlbGVjdGVkSW5kZXg6W3t0eXBlOnh5fV0sYmFja2dyb3VuZENvbG9yOlt7dHlwZTp4eX1dfSk7Y2xhc3MgRkIgZXh0ZW5kcyBIQntjb25zdHJ1Y3Rvcih0LGUsbixvKXtzdXBlcih0LGUsbixvKX19RkIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEZCKShTbShoZyksU20oVWcpLFNtKFRCLDgpLFNtKFZQLDgpKX0sRkIuybVjbXA9dG8oe3R5cGU6RkIsc2VsZWN0b3JzOltbIm1hdC10YWItZ3JvdXAiXV0sY29udGVudFF1ZXJpZXM6ZnVuY3Rpb24gdChlLG4sbyl7aWYoMSZlJiYkaChvLFNCLDUpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uX2FsbFRhYnM9dCl9fSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmKFFoKGxCLDUpLFFoKGNCLDUpKSwyJmUpe2xldCB0O0poKHQ9dGIoKSkmJihuLl90YWJCb2R5V3JhcHBlcj10LmZpcnN0KSxKaCh0PXRiKCkpJiYobi5fdGFiSGVhZGVyPXQuZmlyc3QpfX0saG9zdEF0dHJzOlsxLCJtYXQtdGFiLWdyb3VwIl0saG9zdFZhcnM6NCxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmcHUoIm1hdC10YWItZ3JvdXAtZHluYW1pYy1oZWlnaHQiLG4uZHluYW1pY0hlaWdodCkoIm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIiwiYmVsb3ciPT09bi5oZWFkZXJQb3NpdGlvbil9LGlucHV0czp7Y29sb3I6ImNvbG9yIixkaXNhYmxlUmlwcGxlOiJkaXNhYmxlUmlwcGxlIn0sZXhwb3J0QXM6WyJtYXRUYWJHcm91cCJdLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6a0IsdXNlRXhpc3Rpbmc6RkJ9XSkseHBdLGRlY2xzOjYsdmFyczo3LGNvbnN0czpbWzMsInNlbGVjdGVkSW5kZXgiLCJkaXNhYmxlUmlwcGxlIiwiZGlzYWJsZVBhZ2luYXRpb24iLCJpbmRleEZvY3VzZWQiLCJzZWxlY3RGb2N1c2VkSW5kZXgiXSxbInRhYkhlYWRlciIsIiJdLFsiY2xhc3MiLCJtYXQtdGFiLWxhYmVsIG1hdC1mb2N1cy1pbmRpY2F0b3IiLCJyb2xlIiwidGFiIiwibWF0VGFiTGFiZWxXcmFwcGVyIiwiIiwibWF0LXJpcHBsZSIsIiIsImNka01vbml0b3JFbGVtZW50Rm9jdXMiLCIiLDMsImlkIiwibWF0LXRhYi1sYWJlbC1hY3RpdmUiLCJkaXNhYmxlZCIsIm1hdFJpcHBsZURpc2FibGVkIiwiY2xpY2siLCJjZGtGb2N1c0NoYW5nZSIsNCwibmdGb3IiLCJuZ0Zvck9mIl0sWzEsIm1hdC10YWItYm9keS13cmFwcGVyIl0sWyJ0YWJCb2R5V3JhcHBlciIsIiJdLFsicm9sZSIsInRhYnBhbmVsIiwzLCJpZCIsIm1hdC10YWItYm9keS1hY3RpdmUiLCJjb250ZW50IiwicG9zaXRpb24iLCJvcmlnaW4iLCJhbmltYXRpb25EdXJhdGlvbiIsIl9vbkNlbnRlcmVkIiwiX29uQ2VudGVyaW5nIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbInJvbGUiLCJ0YWIiLCJtYXRUYWJMYWJlbFdyYXBwZXIiLCIiLCJtYXQtcmlwcGxlIiwiIiwiY2RrTW9uaXRvckVsZW1lbnRGb2N1cyIsIiIsMSwibWF0LXRhYi1sYWJlbCIsIm1hdC1mb2N1cy1pbmRpY2F0b3IiLDMsImlkIiwiZGlzYWJsZWQiLCJtYXRSaXBwbGVEaXNhYmxlZCIsImNsaWNrIiwiY2RrRm9jdXNDaGFuZ2UiXSxbMSwibWF0LXRhYi1sYWJlbC1jb250ZW50Il0sWzMsIm5nSWYiXSxbMywiY2RrUG9ydGFsT3V0bGV0Il0sWyJyb2xlIiwidGFicGFuZWwiLDMsImlkIiwiY29udGVudCIsInBvc2l0aW9uIiwib3JpZ2luIiwiYW5pbWF0aW9uRHVyYXRpb24iLCJfb25DZW50ZXJlZCIsIl9vbkNlbnRlcmluZyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwibWF0LXRhYi1oZWFkZXIiLDAsMSksVm0oImluZGV4Rm9jdXNlZCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX2ZvY3VzQ2hhbmdlZChlKX0pKSgic2VsZWN0Rm9jdXNlZEluZGV4IiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5zZWxlY3RlZEluZGV4PWV9KSksUXAoMix1Qiw0LDE0LCJkaXYiLDIpLEFtKCksUm0oMywiZGl2IiwzLDQpLFFwKDUsZkIsMSw5LCJtYXQtdGFiLWJvZHkiLDUpLEFtKCkpLDImZSYmKERtKCJzZWxlY3RlZEluZGV4IixuLnNlbGVjdGVkSW5kZXh8fDApKCJkaXNhYmxlUmlwcGxlIixuLmRpc2FibGVSaXBwbGUpKCJkaXNhYmxlUGFnaW5hdGlvbiIsbi5kaXNhYmxlUGFnaW5hdGlvbikscmMoMiksRG0oIm5nRm9yT2YiLG4uX3RhYnMpLHJjKDEpLHB1KCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsIk5vb3BBbmltYXRpb25zIj09PW4uX2FuaW1hdGlvbk1vZGUpLHJjKDIpLERtKCJuZ0Zvck9mIixuLl90YWJzKSl9LGRpcmVjdGl2ZXM6ZnVuY3Rpb24oKXtyZXR1cm5bR0IsbE0sQkIsa0gsREksZE0sREYsQUJdfSxzdHlsZXM6WyIubWF0LXRhYi1ncm91cHtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21heC13aWR0aDoxMDAlfS5tYXQtdGFiLWdyb3VwLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVye2ZsZXgtZGlyZWN0aW9uOmNvbHVtbi1yZXZlcnNlfS5tYXQtdGFiLWxhYmVse2hlaWdodDo0OHB4O3BhZGRpbmc6MCAyNHB4O2N1cnNvcjpwb2ludGVyO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvcGFjaXR5Oi42O21pbi13aWR0aDoxNjBweDt0ZXh0LWFsaWduOmNlbnRlcjtkaXNwbGF5OmlubGluZS1mbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcDtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXRhYi1sYWJlbDpmb2N1c3tvdXRsaW5lOm5vbmV9Lm1hdC10YWItbGFiZWw6Zm9jdXM6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXRhYi1sYWJlbDpmb2N1c3tvdXRsaW5lOmRvdHRlZCAycHg7b3V0bGluZS1vZmZzZXQ6LTJweH0ubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZHtvcGFjaXR5Oi41fS5tYXQtdGFiLWxhYmVsIC5tYXQtdGFiLWxhYmVsLWNvbnRlbnR7ZGlzcGxheTppbmxpbmUtZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXB9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXRhYi1sYWJlbHtvcGFjaXR5OjF9QG1lZGlhKG1heC13aWR0aDogNTk5cHgpey5tYXQtdGFiLWxhYmVse3BhZGRpbmc6MCAxMnB4fX1AbWVkaWEobWF4LXdpZHRoOiA5NTlweCl7Lm1hdC10YWItbGFiZWx7cGFkZGluZzowIDEycHh9fS5tYXQtdGFiLWdyb3VwW21hdC1zdHJldGNoLXRhYnNdPi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbHtmbGV4LWJhc2lzOjA7ZmxleC1ncm93OjF9Lm1hdC10YWItYm9keS13cmFwcGVye3Bvc2l0aW9uOnJlbGF0aXZlO292ZXJmbG93OmhpZGRlbjtkaXNwbGF5OmZsZXg7dHJhbnNpdGlvbjpoZWlnaHQgNTAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtdGFiLWJvZHktd3JhcHBlcnt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC10YWItYm9keXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmJsb2NrO292ZXJmbG93OmhpZGRlbjtvdXRsaW5lOjA7ZmxleC1iYXNpczoxMDAlfS5tYXQtdGFiLWJvZHkubWF0LXRhYi1ib2R5LWFjdGl2ZXtwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87ei1pbmRleDoxO2ZsZXgtZ3JvdzoxfS5tYXQtdGFiLWdyb3VwLm1hdC10YWItZ3JvdXAtZHluYW1pYy1oZWlnaHQgLm1hdC10YWItYm9keS5tYXQtdGFiLWJvZHktYWN0aXZle292ZXJmbG93LXk6aGlkZGVufVxuIl0sZW5jYXBzdWxhdGlvbjoyfSksRkIuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ30se3R5cGU6VWd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltUQl19LHt0eXBlOlNyfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19XSxGQi5wcm9wRGVjb3JhdG9ycz17X2FsbFRhYnM6W3t0eXBlOllhLGFyZ3M6W1NCLHtkZXNjZW5kYW50czohMH1dfV0sX3RhYkJvZHlXcmFwcGVyOlt7dHlwZTpaYSxhcmdzOlsidGFiQm9keVdyYXBwZXIiXX1dLF90YWJIZWFkZXI6W3t0eXBlOlphLGFyZ3M6WyJ0YWJIZWFkZXIiXX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEZCLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC10YWItZ3JvdXAiLGV4cG9ydEFzOiJtYXRUYWJHcm91cCIsdGVtcGxhdGU6JzxtYXQtdGFiLWhlYWRlciAjdGFiSGVhZGVyXG4gICAgICAgICAgICAgICBbc2VsZWN0ZWRJbmRleF09InNlbGVjdGVkSW5kZXggfHwgMCJcbiAgICAgICAgICAgICAgIFtkaXNhYmxlUmlwcGxlXT0iZGlzYWJsZVJpcHBsZSJcbiAgICAgICAgICAgICAgIFtkaXNhYmxlUGFnaW5hdGlvbl09ImRpc2FibGVQYWdpbmF0aW9uIlxuICAgICAgICAgICAgICAgKGluZGV4Rm9jdXNlZCk9Il9mb2N1c0NoYW5nZWQoJGV2ZW50KSJcbiAgICAgICAgICAgICAgIChzZWxlY3RGb2N1c2VkSW5kZXgpPSJzZWxlY3RlZEluZGV4ID0gJGV2ZW50Ij5cbiAgPGRpdiBjbGFzcz0ibWF0LXRhYi1sYWJlbCBtYXQtZm9jdXMtaW5kaWNhdG9yIiByb2xlPSJ0YWIiIG1hdFRhYkxhYmVsV3JhcHBlciBtYXQtcmlwcGxlIGNka01vbml0b3JFbGVtZW50Rm9jdXNcbiAgICAgICAqbmdGb3I9ImxldCB0YWIgb2YgX3RhYnM7IGxldCBpID0gaW5kZXgiXG4gICAgICAgW2lkXT0iX2dldFRhYkxhYmVsSWQoaSkiXG4gICAgICAgW2F0dHIudGFiSW5kZXhdPSJfZ2V0VGFiSW5kZXgodGFiLCBpKSJcbiAgICAgICBbYXR0ci5hcmlhLXBvc2luc2V0XT0iaSArIDEiXG4gICAgICAgW2F0dHIuYXJpYS1zZXRzaXplXT0iX3RhYnMubGVuZ3RoIlxuICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPSJfZ2V0VGFiQ29udGVudElkKGkpIlxuICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPSJzZWxlY3RlZEluZGV4ID09IGkiXG4gICAgICAgW2F0dHIuYXJpYS1sYWJlbF09InRhYi5hcmlhTGFiZWwgfHwgbnVsbCJcbiAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPSIoIXRhYi5hcmlhTGFiZWwgJiYgdGFiLmFyaWFMYWJlbGxlZGJ5KSA/IHRhYi5hcmlhTGFiZWxsZWRieSA6IG51bGwiXG4gICAgICAgW2NsYXNzLm1hdC10YWItbGFiZWwtYWN0aXZlXT0ic2VsZWN0ZWRJbmRleCA9PSBpIlxuICAgICAgIFtkaXNhYmxlZF09InRhYi5kaXNhYmxlZCJcbiAgICAgICBbbWF0UmlwcGxlRGlzYWJsZWRdPSJ0YWIuZGlzYWJsZWQgfHwgZGlzYWJsZVJpcHBsZSJcbiAgICAgICAoY2xpY2spPSJfaGFuZGxlQ2xpY2sodGFiLCB0YWJIZWFkZXIsIGkpIlxuICAgICAgIChjZGtGb2N1c0NoYW5nZSk9Il90YWJGb2N1c0NoYW5nZWQoJGV2ZW50LCBpKSI+XG5cblxuICAgIDxkaXYgY2xhc3M9Im1hdC10YWItbGFiZWwtY29udGVudCI+XG4gICAgICBceDNjIS0tIElmIHRoZXJlIGlzIGEgbGFiZWwgdGVtcGxhdGUsIHVzZSBpdC4gLS1ceDNlXG4gICAgICA8bmctdGVtcGxhdGUgW25nSWZdPSJ0YWIudGVtcGxhdGVMYWJlbCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbY2RrUG9ydGFsT3V0bGV0XT0idGFiLnRlbXBsYXRlTGFiZWwiPjwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICBceDNjIS0tIElmIHRoZXJlIGlzIG5vdCBhIGxhYmVsIHRlbXBsYXRlLCBmYWxsIGJhY2sgdG8gdGhlIHRleHQgbGFiZWwuIC0tXHgzZVxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT0iIXRhYi50ZW1wbGF0ZUxhYmVsIj57e3RhYi50ZXh0TGFiZWx9fTwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9tYXQtdGFiLWhlYWRlcj5cblxuPGRpdlxuICBjbGFzcz0ibWF0LXRhYi1ib2R5LXdyYXBwZXIiXG4gIFtjbGFzcy5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZV09Il9hbmltYXRpb25Nb2RlID09PSBcJ05vb3BBbmltYXRpb25zXCciXG4gICN0YWJCb2R5V3JhcHBlcj5cbiAgPG1hdC10YWItYm9keSByb2xlPSJ0YWJwYW5lbCJcbiAgICAgICAgICAgICAgICpuZ0Zvcj0ibGV0IHRhYiBvZiBfdGFiczsgbGV0IGkgPSBpbmRleCJcbiAgICAgICAgICAgICAgIFtpZF09Il9nZXRUYWJDb250ZW50SWQoaSkiXG4gICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09Iihjb250ZW50VGFiSW5kZXggIT0gbnVsbCAmJiBzZWxlY3RlZEluZGV4ID09PSBpKSA/IGNvbnRlbnRUYWJJbmRleCA6IG51bGwiXG4gICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPSJfZ2V0VGFiTGFiZWxJZChpKSJcbiAgICAgICAgICAgICAgIFtjbGFzcy5tYXQtdGFiLWJvZHktYWN0aXZlXT0ic2VsZWN0ZWRJbmRleCA9PT0gaSJcbiAgICAgICAgICAgICAgIFtjb250ZW50XT0idGFiLmNvbnRlbnQhIlxuICAgICAgICAgICAgICAgW3Bvc2l0aW9uXT0idGFiLnBvc2l0aW9uISJcbiAgICAgICAgICAgICAgIFtvcmlnaW5dPSJ0YWIub3JpZ2luIlxuICAgICAgICAgICAgICAgW2FuaW1hdGlvbkR1cmF0aW9uXT0iYW5pbWF0aW9uRHVyYXRpb24iXG4gICAgICAgICAgICAgICAoX29uQ2VudGVyZWQpPSJfcmVtb3ZlVGFiQm9keVdyYXBwZXJIZWlnaHQoKSJcbiAgICAgICAgICAgICAgIChfb25DZW50ZXJpbmcpPSJfc2V0VGFiQm9keVdyYXBwZXJIZWlnaHQoJGV2ZW50KSI+XG4gIDwvbWF0LXRhYi1ib2R5PlxuPC9kaXY+XG4nLGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uRGVmYXVsdCxpbnB1dHM6WyJjb2xvciIsImRpc2FibGVSaXBwbGUiXSxwcm92aWRlcnM6W3twcm92aWRlOmtCLHVzZUV4aXN0aW5nOkZCfV0saG9zdDp7Y2xhc3M6Im1hdC10YWItZ3JvdXAiLCJbY2xhc3MubWF0LXRhYi1ncm91cC1keW5hbWljLWhlaWdodF0iOiJkeW5hbWljSGVpZ2h0IiwiW2NsYXNzLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyXSI6J2hlYWRlclBvc2l0aW9uID09PSAiYmVsb3ciJ30sc3R5bGVzOlsiLm1hdC10YWItZ3JvdXB7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttYXgtd2lkdGg6MTAwJX0ubWF0LXRhYi1ncm91cC5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcntmbGV4LWRpcmVjdGlvbjpjb2x1bW4tcmV2ZXJzZX0ubWF0LXRhYi1sYWJlbHtoZWlnaHQ6NDhweDtwYWRkaW5nOjAgMjRweDtjdXJzb3I6cG9pbnRlcjtib3gtc2l6aW5nOmJvcmRlci1ib3g7b3BhY2l0eTouNjttaW4td2lkdGg6MTYwcHg7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXA7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC10YWItbGFiZWw6Zm9jdXN7b3V0bGluZTpub25lfS5tYXQtdGFiLWxhYmVsOmZvY3VzOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10YWItbGFiZWw6Zm9jdXN7b3V0bGluZTpkb3R0ZWQgMnB4O291dGxpbmUtb2Zmc2V0Oi0ycHh9Lm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWR7b3BhY2l0eTouNX0ubWF0LXRhYi1sYWJlbCAubWF0LXRhYi1sYWJlbC1jb250ZW50e2Rpc3BsYXk6aW5saW5lLWZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10YWItbGFiZWx7b3BhY2l0eToxfUBtZWRpYShtYXgtd2lkdGg6IDU5OXB4KXsubWF0LXRhYi1sYWJlbHtwYWRkaW5nOjAgMTJweH19QG1lZGlhKG1heC13aWR0aDogOTU5cHgpey5tYXQtdGFiLWxhYmVse3BhZGRpbmc6MCAxMnB4fX0ubWF0LXRhYi1ncm91cFttYXQtc3RyZXRjaC10YWJzXT4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWx7ZmxleC1iYXNpczowO2ZsZXgtZ3JvdzoxfS5tYXQtdGFiLWJvZHktd3JhcHBlcntwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzpoaWRkZW47ZGlzcGxheTpmbGV4O3RyYW5zaXRpb246aGVpZ2h0IDUwMG1zIGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXRhYi1ib2R5LXdyYXBwZXJ7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtdGFiLWJvZHl7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpibG9jaztvdmVyZmxvdzpoaWRkZW47b3V0bGluZTowO2ZsZXgtYmFzaXM6MTAwJX0ubWF0LXRhYi1ib2R5Lm1hdC10YWItYm9keS1hY3RpdmV7cG9zaXRpb246cmVsYXRpdmU7b3ZlcmZsb3cteDpoaWRkZW47b3ZlcmZsb3cteTphdXRvO3otaW5kZXg6MTtmbGV4LWdyb3c6MX0ubWF0LXRhYi1ncm91cC5tYXQtdGFiLWdyb3VwLWR5bmFtaWMtaGVpZ2h0IC5tYXQtdGFiLWJvZHkubWF0LXRhYi1ib2R5LWFjdGl2ZXtvdmVyZmxvdy15OmhpZGRlbn1cbiJdfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOlVnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbVEJdfSx7dHlwZTpTcn1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV19KSx7X2FsbFRhYnM6W3t0eXBlOllhLGFyZ3M6W1NCLHtkZXNjZW5kYW50czohMH1dfV0sX3RhYkJvZHlXcmFwcGVyOlt7dHlwZTpaYSxhcmdzOlsidGFiQm9keVdyYXBwZXIiXX1dLF90YWJIZWFkZXI6W3t0eXBlOlphLGFyZ3M6WyJ0YWJIZWFkZXIiXX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBMQj1LSShjbGFzc3t9KTtjbGFzcyBCQiBleHRlbmRzIExCe2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5lbGVtZW50UmVmPXR9Zm9jdXMoKXt0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpfWdldE9mZnNldExlZnQoKXtyZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdH1nZXRPZmZzZXRXaWR0aCgpe3JldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aH19QkIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEJCKShTbShoZykpfSxCQi7JtWRpcj1sbyh7dHlwZTpCQixzZWxlY3RvcnM6W1siIiwibWF0VGFiTGFiZWxXcmFwcGVyIiwiIl1dLGhvc3RWYXJzOjMsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJihqcCgiYXJpYS1kaXNhYmxlZCIsISFuLmRpc2FibGVkKSxwdSgibWF0LXRhYi1kaXNhYmxlZCIsbi5kaXNhYmxlZCkpfSxpbnB1dHM6e2Rpc2FibGVkOiJkaXNhYmxlZCJ9LGZlYXR1cmVzOlt4cF19KSxCQi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChCQixbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbWF0VGFiTGFiZWxXcmFwcGVyXSIsaW5wdXRzOlsiZGlzYWJsZWQiXSxob3N0OnsiW2NsYXNzLm1hdC10YWItZGlzYWJsZWRdIjoiZGlzYWJsZWQiLCJbYXR0ci5hcmlhLWRpc2FibGVkXSI6IiEhZGlzYWJsZWQifX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IFZCPU56KHtwYXNzaXZlOiEwfSk7Y2xhc3MgakJ7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEscil7dGhpcy5fZWxlbWVudFJlZj10LHRoaXMuX2NoYW5nZURldGVjdG9yUmVmPWUsdGhpcy5fdmlld3BvcnRSdWxlcj1uLHRoaXMuX2Rpcj1vLHRoaXMuX25nWm9uZT1pLHRoaXMuX3BsYXRmb3JtPWEsdGhpcy5fYW5pbWF0aW9uTW9kZT1yLHRoaXMuX3Njcm9sbERpc3RhbmNlPTAsdGhpcy5fc2VsZWN0ZWRJbmRleENoYW5nZWQ9ITEsdGhpcy5fZGVzdHJveWVkPW5ldyBJLHRoaXMuX3Nob3dQYWdpbmF0aW9uQ29udHJvbHM9ITEsdGhpcy5fZGlzYWJsZVNjcm9sbEFmdGVyPSEwLHRoaXMuX2Rpc2FibGVTY3JvbGxCZWZvcmU9ITAsdGhpcy5fc3RvcFNjcm9sbGluZz1uZXcgSSx0aGlzLmRpc2FibGVQYWdpbmF0aW9uPSExLHRoaXMuX3NlbGVjdGVkSW5kZXg9MCx0aGlzLnNlbGVjdEZvY3VzZWRJbmRleD1uZXcgTGgsdGhpcy5pbmRleEZvY3VzZWQ9bmV3IExoLGkucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT57b2UodC5uYXRpdmVFbGVtZW50LCJtb3VzZWxlYXZlIikucGlwZShJZSh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fc3RvcEludGVydmFsKCl9KSl9KSl9Z2V0IHNlbGVjdGVkSW5kZXgoKXtyZXR1cm4gdGhpcy5fc2VsZWN0ZWRJbmRleH1zZXQgc2VsZWN0ZWRJbmRleCh0KXt0PV96KHQpLHRoaXMuX3NlbGVjdGVkSW5kZXghPXQmJih0aGlzLl9zZWxlY3RlZEluZGV4Q2hhbmdlZD0hMCx0aGlzLl9zZWxlY3RlZEluZGV4PXQsdGhpcy5fa2V5TWFuYWdlciYmdGhpcy5fa2V5TWFuYWdlci51cGRhdGVBY3RpdmVJdGVtKHQpKX1uZ0FmdGVyVmlld0luaXQoKXtvZSh0aGlzLl9wcmV2aW91c1BhZ2luYXRvci5uYXRpdmVFbGVtZW50LCJ0b3VjaHN0YXJ0IixWQikucGlwZShJZSh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5faGFuZGxlUGFnaW5hdG9yUHJlc3MoImJlZm9yZSIpfSkpLG9lKHRoaXMuX25leHRQYWdpbmF0b3IubmF0aXZlRWxlbWVudCwidG91Y2hzdGFydCIsVkIpLnBpcGUoSWUodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgoKT0+e3RoaXMuX2hhbmRsZVBhZ2luYXRvclByZXNzKCJhZnRlciIpfSkpfW5nQWZ0ZXJDb250ZW50SW5pdCgpe2NvbnN0IHQ9dGhpcy5fZGlyP3RoaXMuX2Rpci5jaGFuZ2U6RXQoImx0ciIpLGU9dGhpcy5fdmlld3BvcnRSdWxlci5jaGFuZ2UoMTUwKSxuPSgpPT57dGhpcy51cGRhdGVQYWdpbmF0aW9uKCksdGhpcy5fYWxpZ25JbmtCYXJUb1NlbGVjdGVkVGFiKCl9O3RoaXMuX2tleU1hbmFnZXI9bmV3IGVJKHRoaXMuX2l0ZW1zKS53aXRoSG9yaXpvbnRhbE9yaWVudGF0aW9uKHRoaXMuX2dldExheW91dERpcmVjdGlvbigpKS53aXRoSG9tZUFuZEVuZCgpLndpdGhXcmFwKCksdGhpcy5fa2V5TWFuYWdlci51cGRhdGVBY3RpdmVJdGVtKHRoaXMuX3NlbGVjdGVkSW5kZXgpLCJ1bmRlZmluZWQiIT10eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lP3JlcXVlc3RBbmltYXRpb25GcmFtZShuKTpuKCkscmUodCxlLHRoaXMuX2l0ZW1zLmNoYW5nZXMpLnBpcGUoSWUodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgoKT0+e3RoaXMuX25nWm9uZS5ydW4oKCgpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKG4pKSksdGhpcy5fa2V5TWFuYWdlci53aXRoSG9yaXpvbnRhbE9yaWVudGF0aW9uKHRoaXMuX2dldExheW91dERpcmVjdGlvbigpKX0pKSx0aGlzLl9rZXlNYW5hZ2VyLmNoYW5nZS5waXBlKEllKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgodD0+e3RoaXMuaW5kZXhGb2N1c2VkLmVtaXQodCksdGhpcy5fc2V0VGFiRm9jdXModCl9KSl9bmdBZnRlckNvbnRlbnRDaGVja2VkKCl7dGhpcy5fdGFiTGFiZWxDb3VudCE9dGhpcy5faXRlbXMubGVuZ3RoJiYodGhpcy51cGRhdGVQYWdpbmF0aW9uKCksdGhpcy5fdGFiTGFiZWxDb3VudD10aGlzLl9pdGVtcy5sZW5ndGgsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpLHRoaXMuX3NlbGVjdGVkSW5kZXhDaGFuZ2VkJiYodGhpcy5fc2Nyb2xsVG9MYWJlbCh0aGlzLl9zZWxlY3RlZEluZGV4KSx0aGlzLl9jaGVja1Njcm9sbGluZ0NvbnRyb2xzKCksdGhpcy5fYWxpZ25JbmtCYXJUb1NlbGVjdGVkVGFiKCksdGhpcy5fc2VsZWN0ZWRJbmRleENoYW5nZWQ9ITEsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpLHRoaXMuX3Njcm9sbERpc3RhbmNlQ2hhbmdlZCYmKHRoaXMuX3VwZGF0ZVRhYlNjcm9sbFBvc2l0aW9uKCksdGhpcy5fc2Nyb2xsRGlzdGFuY2VDaGFuZ2VkPSExLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKX1uZ09uRGVzdHJveSgpe3RoaXMuX2Rlc3Ryb3llZC5uZXh0KCksdGhpcy5fZGVzdHJveWVkLmNvbXBsZXRlKCksdGhpcy5fc3RvcFNjcm9sbGluZy5jb21wbGV0ZSgpfV9oYW5kbGVLZXlkb3duKHQpe2lmKCFieih0KSlzd2l0Y2godC5rZXlDb2RlKXtjYXNlIG16OmNhc2UgZno6dGhpcy5mb2N1c0luZGV4IT09dGhpcy5zZWxlY3RlZEluZGV4JiYodGhpcy5zZWxlY3RGb2N1c2VkSW5kZXguZW1pdCh0aGlzLmZvY3VzSW5kZXgpLHRoaXMuX2l0ZW1TZWxlY3RlZCh0KSk7YnJlYWs7ZGVmYXVsdDp0aGlzLl9rZXlNYW5hZ2VyLm9uS2V5ZG93bih0KX19X29uQ29udGVudENoYW5nZXMoKXtjb25zdCB0PXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC50ZXh0Q29udGVudDt0IT09dGhpcy5fY3VycmVudFRleHRDb250ZW50JiYodGhpcy5fY3VycmVudFRleHRDb250ZW50PXR8fCIiLHRoaXMuX25nWm9uZS5ydW4oKCgpPT57dGhpcy51cGRhdGVQYWdpbmF0aW9uKCksdGhpcy5fYWxpZ25JbmtCYXJUb1NlbGVjdGVkVGFiKCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9KSkpfXVwZGF0ZVBhZ2luYXRpb24oKXt0aGlzLl9jaGVja1BhZ2luYXRpb25FbmFibGVkKCksdGhpcy5fY2hlY2tTY3JvbGxpbmdDb250cm9scygpLHRoaXMuX3VwZGF0ZVRhYlNjcm9sbFBvc2l0aW9uKCl9Z2V0IGZvY3VzSW5kZXgoKXtyZXR1cm4gdGhpcy5fa2V5TWFuYWdlcj90aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW1JbmRleDowfXNldCBmb2N1c0luZGV4KHQpe3RoaXMuX2lzVmFsaWRJbmRleCh0KSYmdGhpcy5mb2N1c0luZGV4IT09dCYmdGhpcy5fa2V5TWFuYWdlciYmdGhpcy5fa2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKHQpfV9pc1ZhbGlkSW5kZXgodCl7aWYoIXRoaXMuX2l0ZW1zKXJldHVybiEwO2NvbnN0IGU9dGhpcy5faXRlbXM/dGhpcy5faXRlbXMudG9BcnJheSgpW3RdOm51bGw7cmV0dXJuISFlJiYhZS5kaXNhYmxlZH1fc2V0VGFiRm9jdXModCl7aWYodGhpcy5fc2hvd1BhZ2luYXRpb25Db250cm9scyYmdGhpcy5fc2Nyb2xsVG9MYWJlbCh0KSx0aGlzLl9pdGVtcyYmdGhpcy5faXRlbXMubGVuZ3RoKXt0aGlzLl9pdGVtcy50b0FycmF5KClbdF0uZm9jdXMoKTtjb25zdCBlPXRoaXMuX3RhYkxpc3RDb250YWluZXIubmF0aXZlRWxlbWVudCxuPXRoaXMuX2dldExheW91dERpcmVjdGlvbigpO2Uuc2Nyb2xsTGVmdD0ibHRyIj09bj8wOmUuc2Nyb2xsV2lkdGgtZS5vZmZzZXRXaWR0aH19X2dldExheW91dERpcmVjdGlvbigpe3JldHVybiB0aGlzLl9kaXImJiJydGwiPT09dGhpcy5fZGlyLnZhbHVlPyJydGwiOiJsdHIifV91cGRhdGVUYWJTY3JvbGxQb3NpdGlvbigpe2lmKHRoaXMuZGlzYWJsZVBhZ2luYXRpb24pcmV0dXJuO2NvbnN0IHQ9dGhpcy5zY3JvbGxEaXN0YW5jZSxlPSJsdHIiPT09dGhpcy5fZ2V0TGF5b3V0RGlyZWN0aW9uKCk/LXQ6dDt0aGlzLl90YWJMaXN0Lm5hdGl2ZUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtPWB0cmFuc2xhdGVYKCR7TWF0aC5yb3VuZChlKX1weClgLCh0aGlzLl9wbGF0Zm9ybS5UUklERU5UfHx0aGlzLl9wbGF0Zm9ybS5FREdFKSYmKHRoaXMuX3RhYkxpc3RDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0PTApfWdldCBzY3JvbGxEaXN0YW5jZSgpe3JldHVybiB0aGlzLl9zY3JvbGxEaXN0YW5jZX1zZXQgc2Nyb2xsRGlzdGFuY2UodCl7dGhpcy5fc2Nyb2xsVG8odCl9X3Njcm9sbEhlYWRlcih0KXtyZXR1cm4gdGhpcy5fc2Nyb2xsVG8odGhpcy5fc2Nyb2xsRGlzdGFuY2UrKCJiZWZvcmUiPT10Py0xOjEpKnRoaXMuX3RhYkxpc3RDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aC8zKX1faGFuZGxlUGFnaW5hdG9yQ2xpY2sodCl7dGhpcy5fc3RvcEludGVydmFsKCksdGhpcy5fc2Nyb2xsSGVhZGVyKHQpfV9zY3JvbGxUb0xhYmVsKHQpe2lmKHRoaXMuZGlzYWJsZVBhZ2luYXRpb24pcmV0dXJuO2NvbnN0IGU9dGhpcy5faXRlbXM/dGhpcy5faXRlbXMudG9BcnJheSgpW3RdOm51bGw7aWYoIWUpcmV0dXJuO2NvbnN0IG49dGhpcy5fdGFiTGlzdENvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoLHtvZmZzZXRMZWZ0Om8sb2Zmc2V0V2lkdGg6aX09ZS5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7bGV0IGEscjsibHRyIj09dGhpcy5fZ2V0TGF5b3V0RGlyZWN0aW9uKCk/KGE9byxyPWEraSk6KHI9dGhpcy5fdGFiTGlzdC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoLW8sYT1yLWkpO2NvbnN0IHM9dGhpcy5zY3JvbGxEaXN0YW5jZSxsPXRoaXMuc2Nyb2xsRGlzdGFuY2UrbjthPHM/dGhpcy5zY3JvbGxEaXN0YW5jZS09cy1hKzYwOnI+bCYmKHRoaXMuc2Nyb2xsRGlzdGFuY2UrPXItbCs2MCl9X2NoZWNrUGFnaW5hdGlvbkVuYWJsZWQoKXtpZih0aGlzLmRpc2FibGVQYWdpbmF0aW9uKXRoaXMuX3Nob3dQYWdpbmF0aW9uQ29udHJvbHM9ITE7ZWxzZXtjb25zdCB0PXRoaXMuX3RhYkxpc3QubmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aD50aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7dHx8KHRoaXMuc2Nyb2xsRGlzdGFuY2U9MCksdCE9PXRoaXMuX3Nob3dQYWdpbmF0aW9uQ29udHJvbHMmJnRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpLHRoaXMuX3Nob3dQYWdpbmF0aW9uQ29udHJvbHM9dH19X2NoZWNrU2Nyb2xsaW5nQ29udHJvbHMoKXt0aGlzLmRpc2FibGVQYWdpbmF0aW9uP3RoaXMuX2Rpc2FibGVTY3JvbGxBZnRlcj10aGlzLl9kaXNhYmxlU2Nyb2xsQmVmb3JlPSEwOih0aGlzLl9kaXNhYmxlU2Nyb2xsQmVmb3JlPTA9PXRoaXMuc2Nyb2xsRGlzdGFuY2UsdGhpcy5fZGlzYWJsZVNjcm9sbEFmdGVyPXRoaXMuc2Nyb2xsRGlzdGFuY2U9PXRoaXMuX2dldE1heFNjcm9sbERpc3RhbmNlKCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpfV9nZXRNYXhTY3JvbGxEaXN0YW5jZSgpe3JldHVybiB0aGlzLl90YWJMaXN0Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGgtdGhpcy5fdGFiTGlzdENvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRofHwwfV9hbGlnbklua0JhclRvU2VsZWN0ZWRUYWIoKXtjb25zdCB0PXRoaXMuX2l0ZW1zJiZ0aGlzLl9pdGVtcy5sZW5ndGg/dGhpcy5faXRlbXMudG9BcnJheSgpW3RoaXMuc2VsZWN0ZWRJbmRleF06bnVsbCxlPXQ/dC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ6bnVsbDtlP3RoaXMuX2lua0Jhci5hbGlnblRvRWxlbWVudChlKTp0aGlzLl9pbmtCYXIuaGlkZSgpfV9zdG9wSW50ZXJ2YWwoKXt0aGlzLl9zdG9wU2Nyb2xsaW5nLm5leHQoKX1faGFuZGxlUGFnaW5hdG9yUHJlc3ModCxlKXtlJiZudWxsIT1lLmJ1dHRvbiYmMCE9PWUuYnV0dG9ufHwodGhpcy5fc3RvcEludGVydmFsKCksYWUoNjUwLDEwMCkucGlwZShJZShyZSh0aGlzLl9zdG9wU2Nyb2xsaW5nLHRoaXMuX2Rlc3Ryb3llZCkpKS5zdWJzY3JpYmUoKCgpPT57Y29uc3R7bWF4U2Nyb2xsRGlzdGFuY2U6ZSxkaXN0YW5jZTpufT10aGlzLl9zY3JvbGxIZWFkZXIodCk7KDA9PT1ufHxuPj1lKSYmdGhpcy5fc3RvcEludGVydmFsKCl9KSkpfV9zY3JvbGxUbyh0KXtpZih0aGlzLmRpc2FibGVQYWdpbmF0aW9uKXJldHVybnttYXhTY3JvbGxEaXN0YW5jZTowLGRpc3RhbmNlOjB9O2NvbnN0IGU9dGhpcy5fZ2V0TWF4U2Nyb2xsRGlzdGFuY2UoKTtyZXR1cm4gdGhpcy5fc2Nyb2xsRGlzdGFuY2U9TWF0aC5tYXgoMCxNYXRoLm1pbihlLHQpKSx0aGlzLl9zY3JvbGxEaXN0YW5jZUNoYW5nZWQ9ITAsdGhpcy5fY2hlY2tTY3JvbGxpbmdDb250cm9scygpLHttYXhTY3JvbGxEaXN0YW5jZTplLGRpc3RhbmNlOnRoaXMuX3Njcm9sbERpc3RhbmNlfX19akIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGpCKShTbShoZyksU20oVWcpLFNtKHVGKSxTbShISSw4KSxTbShhXyksU20od3opLFNtKFZQLDgpKX0sakIuybVkaXI9bG8oe3R5cGU6akIsaW5wdXRzOntkaXNhYmxlUGFnaW5hdGlvbjoiZGlzYWJsZVBhZ2luYXRpb24ifX0pLGpCLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOlVnfSx7dHlwZTp1Rn0se3R5cGU6SEksZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6YV99LHt0eXBlOnd6fSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV0sakIucHJvcERlY29yYXRvcnM9e2Rpc2FibGVQYWdpbmF0aW9uOlt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGpCLFt7dHlwZTpDeX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6VWd9LHt0eXBlOnVGfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTphX30se3R5cGU6d3p9LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19XX0pLHtkaXNhYmxlUGFnaW5hdGlvbjpbe3R5cGU6eHl9XX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgVUIgZXh0ZW5kcyBqQntjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyKXtzdXBlcih0LGUsbixvLGksYSxyKSx0aGlzLl9kaXNhYmxlUmlwcGxlPSExfWdldCBkaXNhYmxlUmlwcGxlKCl7cmV0dXJuIHRoaXMuX2Rpc2FibGVSaXBwbGV9c2V0IGRpc2FibGVSaXBwbGUodCl7dGhpcy5fZGlzYWJsZVJpcHBsZT15eih0KX1faXRlbVNlbGVjdGVkKHQpe3QucHJldmVudERlZmF1bHQoKX19VUIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFVCKShTbShoZyksU20oVWcpLFNtKHVGKSxTbShISSw4KSxTbShhXyksU20od3opLFNtKFZQLDgpKX0sVUIuybVkaXI9bG8oe3R5cGU6VUIsaW5wdXRzOntkaXNhYmxlUmlwcGxlOiJkaXNhYmxlUmlwcGxlIn0sZmVhdHVyZXM6W3hwXX0pLFVCLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOlVnfSx7dHlwZTp1Rn0se3R5cGU6SEksZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6YV99LHt0eXBlOnd6fSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV0sVUIucHJvcERlY29yYXRvcnM9e2Rpc2FibGVSaXBwbGU6W3t0eXBlOnh5fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoVUIsW3t0eXBlOkN5fV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTpVZ30se3R5cGU6dUZ9LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOmFffSx7dHlwZTp3en0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dfSkse2Rpc2FibGVSaXBwbGU6W3t0eXBlOnh5fV19KTtjbGFzcyBHQiBleHRlbmRzIFVCe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIpe3N1cGVyKHQsZSxuLG8saSxhLHIpfX1HQi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8R0IpKFNtKGhnKSxTbShVZyksU20odUYpLFNtKEhJLDgpLFNtKGFfKSxTbSh3eiksU20oVlAsOCkpfSxHQi7JtWNtcD10byh7dHlwZTpHQixzZWxlY3RvcnM6W1sibWF0LXRhYi1oZWFkZXIiXV0sY29udGVudFF1ZXJpZXM6ZnVuY3Rpb24gdChlLG4sbyl7aWYoMSZlJiYkaChvLEJCLDQpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uX2l0ZW1zPXQpfX0sdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihRaChNQiw3KSxRaChnQiw3KSxRaChoQiw3KSxRaChiQiw1KSxRaCh5Qiw1KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5faW5rQmFyPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLl90YWJMaXN0Q29udGFpbmVyPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLl90YWJMaXN0PXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLl9uZXh0UGFnaW5hdG9yPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLl9wcmV2aW91c1BhZ2luYXRvcj10LmZpcnN0KX19LGhvc3RBdHRyczpbMSwibWF0LXRhYi1oZWFkZXIiXSxob3N0VmFyczo0LGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZwdSgibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jb250cm9scy1lbmFibGVkIixuLl9zaG93UGFnaW5hdGlvbkNvbnRyb2xzKSgibWF0LXRhYi1oZWFkZXItcnRsIiwicnRsIj09bi5fZ2V0TGF5b3V0RGlyZWN0aW9uKCkpfSxpbnB1dHM6e3NlbGVjdGVkSW5kZXg6InNlbGVjdGVkSW5kZXgifSxvdXRwdXRzOntzZWxlY3RGb2N1c2VkSW5kZXg6InNlbGVjdEZvY3VzZWRJbmRleCIsaW5kZXhGb2N1c2VkOiJpbmRleEZvY3VzZWQifSxmZWF0dXJlczpbeHBdLG5nQ29udGVudFNlbGVjdG9yczppQixkZWNsczoxMyx2YXJzOjgsY29uc3RzOltbImFyaWEtaGlkZGVuIiwidHJ1ZSIsIm1hdC1yaXBwbGUiLCIiLDEsIm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24iLCJtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSIsIm1hdC1lbGV2YXRpb24tejQiLDMsIm1hdFJpcHBsZURpc2FibGVkIiwiY2xpY2siLCJtb3VzZWRvd24iLCJ0b3VjaGVuZCJdLFsicHJldmlvdXNQYWdpbmF0b3IiLCIiXSxbMSwibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIl0sWzEsIm1hdC10YWItbGFiZWwtY29udGFpbmVyIiwzLCJrZXlkb3duIl0sWyJ0YWJMaXN0Q29udGFpbmVyIiwiIl0sWyJyb2xlIiwidGFibGlzdCIsMSwibWF0LXRhYi1saXN0IiwzLCJjZGtPYnNlcnZlQ29udGVudCJdLFsidGFiTGlzdCIsIiJdLFsxLCJtYXQtdGFiLWxhYmVscyJdLFsiYXJpYS1oaWRkZW4iLCJ0cnVlIiwibWF0LXJpcHBsZSIsIiIsMSwibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiIsIm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYWZ0ZXIiLCJtYXQtZWxldmF0aW9uLXo0IiwzLCJtYXRSaXBwbGVEaXNhYmxlZCIsIm1vdXNlZG93biIsImNsaWNrIiwidG91Y2hlbmQiXSxbIm5leHRQYWdpbmF0b3IiLCIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFptKCksUm0oMCwiZGl2IiwwLDEpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5faGFuZGxlUGFnaW5hdG9yQ2xpY2soImJlZm9yZSIpfSkpKCJtb3VzZWRvd24iLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9oYW5kbGVQYWdpbmF0b3JQcmVzcygiYmVmb3JlIixlKX0pKSgidG91Y2hlbmQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX3N0b3BJbnRlcnZhbCgpfSkpLFRtKDIsImRpdiIsMiksQW0oKSxSbSgzLCJkaXYiLDMsNCksVm0oImtleWRvd24iLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9oYW5kbGVLZXlkb3duKGUpfSkpLFJtKDUsImRpdiIsNSw2KSxWbSgiY2RrT2JzZXJ2ZUNvbnRlbnQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX29uQ29udGVudENoYW5nZXMoKX0pKSxSbSg3LCJkaXYiLDcpLFhtKDgpLEFtKCksVG0oOSwibWF0LWluay1iYXIiKSxBbSgpLEFtKCksUm0oMTAsImRpdiIsOCw5KSxWbSgibW91c2Vkb3duIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5faGFuZGxlUGFnaW5hdG9yUHJlc3MoImFmdGVyIixlKX0pKSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX2hhbmRsZVBhZ2luYXRvckNsaWNrKCJhZnRlciIpfSkpKCJ0b3VjaGVuZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5fc3RvcEludGVydmFsKCl9KSksVG0oMTIsImRpdiIsMiksQW0oKSksMiZlJiYocHUoIm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQiLG4uX2Rpc2FibGVTY3JvbGxCZWZvcmUpLERtKCJtYXRSaXBwbGVEaXNhYmxlZCIsbi5fZGlzYWJsZVNjcm9sbEJlZm9yZXx8bi5kaXNhYmxlUmlwcGxlKSxyYyg1KSxwdSgiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLCJOb29wQW5pbWF0aW9ucyI9PT1uLl9hbmltYXRpb25Nb2RlKSxyYyg1KSxwdSgibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCIsbi5fZGlzYWJsZVNjcm9sbEFmdGVyKSxEbSgibWF0UmlwcGxlRGlzYWJsZWQiLG4uX2Rpc2FibGVTY3JvbGxBZnRlcnx8bi5kaXNhYmxlUmlwcGxlKSl9LGRpcmVjdGl2ZXM6W2tILGp6LE1CXSxzdHlsZXM6WycubWF0LXRhYi1oZWFkZXJ7ZGlzcGxheTpmbGV4O292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZTtmbGV4LXNocmluazowfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5Om5vbmU7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7bWluLXdpZHRoOjMycHg7Y3Vyc29yOnBvaW50ZXI7ei1pbmRleDoyOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0b3VjaC1hY3Rpb246bm9uZX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jb250cm9scy1lbmFibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9ue2Rpc3BsYXk6ZmxleH0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1iZWZvcmUsLm1hdC10YWItaGVhZGVyLXJ0bCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1hZnRlcntwYWRkaW5nLWxlZnQ6NHB4fS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWhlYWRlci1ydGwgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYWZ0ZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbnt0cmFuc2Zvcm06cm90YXRlKC0xMzVkZWcpfS5tYXQtdGFiLWhlYWRlci1ydGwgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYmVmb3JlLC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWFmdGVye3BhZGRpbmctcmlnaHQ6NHB4fS5tYXQtdGFiLWhlYWRlci1ydGwgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYmVmb3JlIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYWZ0ZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbnt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6MnB4IDJweCAwIDA7Y29udGVudDoiIjtoZWlnaHQ6OHB4O3dpZHRoOjhweH0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZHtib3gtc2hhZG93Om5vbmU7Y3Vyc29yOmRlZmF1bHR9Lm1hdC10YWItbGlzdHtmbGV4LWdyb3c6MTtwb3NpdGlvbjpyZWxhdGl2ZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSA1MDBtcyBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSl9Lm1hdC1pbmstYmFye3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTowO2hlaWdodDoycHg7dHJhbnNpdGlvbjo1MDBtcyBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSl9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1pbmstYmFye3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXIgLm1hdC1pbmstYmFye2JvdHRvbTphdXRvO3RvcDowfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1pbmstYmFye291dGxpbmU6c29saWQgMnB4O2hlaWdodDowfS5tYXQtdGFiLWxhYmVsc3tkaXNwbGF5OmZsZXh9W21hdC1hbGlnbi10YWJzPWNlbnRlcl0+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsc3tqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfVttYXQtYWxpZ24tdGFicz1lbmRdPi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbHN7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5tYXQtdGFiLWxhYmVsLWNvbnRhaW5lcntkaXNwbGF5OmZsZXg7ZmxleC1ncm93OjE7b3ZlcmZsb3c6aGlkZGVuO3otaW5kZXg6MX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXRhYi1saXN0e3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXRhYi1sYWJlbHtoZWlnaHQ6NDhweDtwYWRkaW5nOjAgMjRweDtjdXJzb3I6cG9pbnRlcjtib3gtc2l6aW5nOmJvcmRlci1ib3g7b3BhY2l0eTouNjttaW4td2lkdGg6MTYwcHg7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXA7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC10YWItbGFiZWw6Zm9jdXN7b3V0bGluZTpub25lfS5tYXQtdGFiLWxhYmVsOmZvY3VzOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10YWItbGFiZWw6Zm9jdXN7b3V0bGluZTpkb3R0ZWQgMnB4O291dGxpbmUtb2Zmc2V0Oi0ycHh9Lm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWR7b3BhY2l0eTouNX0ubWF0LXRhYi1sYWJlbCAubWF0LXRhYi1sYWJlbC1jb250ZW50e2Rpc3BsYXk6aW5saW5lLWZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10YWItbGFiZWx7b3BhY2l0eToxfUBtZWRpYShtYXgtd2lkdGg6IDU5OXB4KXsubWF0LXRhYi1sYWJlbHttaW4td2lkdGg6NzJweH19XG4nXSxlbmNhcHN1bGF0aW9uOjJ9KSxHQi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpVZ30se3R5cGU6dUZ9LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOmFffSx7dHlwZTp3en0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dLEdCLnByb3BEZWNvcmF0b3JzPXtfaXRlbXM6W3t0eXBlOllhLGFyZ3M6W0JCLHtkZXNjZW5kYW50czohMX1dfV0sX2lua0Jhcjpbe3R5cGU6WmEsYXJnczpbTUIse3N0YXRpYzohMH1dfV0sX3RhYkxpc3RDb250YWluZXI6W3t0eXBlOlphLGFyZ3M6WyJ0YWJMaXN0Q29udGFpbmVyIix7c3RhdGljOiEwfV19XSxfdGFiTGlzdDpbe3R5cGU6WmEsYXJnczpbInRhYkxpc3QiLHtzdGF0aWM6ITB9XX1dLF9uZXh0UGFnaW5hdG9yOlt7dHlwZTpaYSxhcmdzOlsibmV4dFBhZ2luYXRvciJdfV0sX3ByZXZpb3VzUGFnaW5hdG9yOlt7dHlwZTpaYSxhcmdzOlsicHJldmlvdXNQYWdpbmF0b3IiXX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEdCLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC10YWItaGVhZGVyIix0ZW1wbGF0ZTonPGRpdiBjbGFzcz0ibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiBtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSBtYXQtZWxldmF0aW9uLXo0IlxuICAgICAjcHJldmlvdXNQYWdpbmF0b3JcbiAgICAgYXJpYS1oaWRkZW49InRydWUiXG4gICAgIG1hdC1yaXBwbGUgW21hdFJpcHBsZURpc2FibGVkXT0iX2Rpc2FibGVTY3JvbGxCZWZvcmUgfHwgZGlzYWJsZVJpcHBsZSJcbiAgICAgW2NsYXNzLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRdPSJfZGlzYWJsZVNjcm9sbEJlZm9yZSJcbiAgICAgKGNsaWNrKT0iX2hhbmRsZVBhZ2luYXRvckNsaWNrKFwnYmVmb3JlXCcpIlxuICAgICAobW91c2Vkb3duKT0iX2hhbmRsZVBhZ2luYXRvclByZXNzKFwnYmVmb3JlXCcsICRldmVudCkiXG4gICAgICh0b3VjaGVuZCk9Il9zdG9wSW50ZXJ2YWwoKSI+XG4gIDxkaXYgY2xhc3M9Im1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiI+PC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz0ibWF0LXRhYi1sYWJlbC1jb250YWluZXIiICN0YWJMaXN0Q29udGFpbmVyIChrZXlkb3duKT0iX2hhbmRsZUtleWRvd24oJGV2ZW50KSI+XG4gIDxkaXZcbiAgICAjdGFiTGlzdFxuICAgIGNsYXNzPSJtYXQtdGFiLWxpc3QiXG4gICAgW2NsYXNzLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlXT0iX2FuaW1hdGlvbk1vZGUgPT09IFwnTm9vcEFuaW1hdGlvbnNcJyJcbiAgICByb2xlPSJ0YWJsaXN0IlxuICAgIChjZGtPYnNlcnZlQ29udGVudCk9Il9vbkNvbnRlbnRDaGFuZ2VzKCkiPlxuICAgIDxkaXYgY2xhc3M9Im1hdC10YWItbGFiZWxzIj5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgICA8bWF0LWluay1iYXI+PC9tYXQtaW5rLWJhcj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz0ibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiBtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWFmdGVyIG1hdC1lbGV2YXRpb24tejQiXG4gICAgICNuZXh0UGFnaW5hdG9yXG4gICAgIGFyaWEtaGlkZGVuPSJ0cnVlIlxuICAgICBtYXQtcmlwcGxlIFttYXRSaXBwbGVEaXNhYmxlZF09Il9kaXNhYmxlU2Nyb2xsQWZ0ZXIgfHwgZGlzYWJsZVJpcHBsZSJcbiAgICAgW2NsYXNzLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRdPSJfZGlzYWJsZVNjcm9sbEFmdGVyIlxuICAgICAobW91c2Vkb3duKT0iX2hhbmRsZVBhZ2luYXRvclByZXNzKFwnYWZ0ZXJcJywgJGV2ZW50KSJcbiAgICAgKGNsaWNrKT0iX2hhbmRsZVBhZ2luYXRvckNsaWNrKFwnYWZ0ZXJcJykiXG4gICAgICh0b3VjaGVuZCk9Il9zdG9wSW50ZXJ2YWwoKSI+XG4gIDxkaXYgY2xhc3M9Im1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiI+PC9kaXY+XG48L2Rpdj5cbicsaW5wdXRzOlsic2VsZWN0ZWRJbmRleCJdLG91dHB1dHM6WyJzZWxlY3RGb2N1c2VkSW5kZXgiLCJpbmRleEZvY3VzZWQiXSxlbmNhcHN1bGF0aW9uOkhuLk5vbmUsY2hhbmdlRGV0ZWN0aW9uOnpuLkRlZmF1bHQsaG9zdDp7Y2xhc3M6Im1hdC10YWItaGVhZGVyIiwiW2NsYXNzLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY29udHJvbHMtZW5hYmxlZF0iOiJfc2hvd1BhZ2luYXRpb25Db250cm9scyIsIltjbGFzcy5tYXQtdGFiLWhlYWRlci1ydGxdIjoiX2dldExheW91dERpcmVjdGlvbigpID09ICdydGwnIn0sc3R5bGVzOlsnLm1hdC10YWItaGVhZGVye2Rpc3BsYXk6ZmxleDtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmU7ZmxleC1zaHJpbms6MH0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbnstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpub25lO2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO21pbi13aWR0aDozMnB4O2N1cnNvcjpwb2ludGVyO3otaW5kZXg6Mjstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dG91Y2gtYWN0aW9uOm5vbmV9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY29udHJvbHMtZW5hYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbntkaXNwbGF5OmZsZXh9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYmVmb3JlLC5tYXQtdGFiLWhlYWRlci1ydGwgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYWZ0ZXJ7cGFkZGluZy1sZWZ0OjRweH0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1iZWZvcmUgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1oZWFkZXItcnRsIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWFmdGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257dHJhbnNmb3JtOnJvdGF0ZSgtMTM1ZGVnKX0ubWF0LXRhYi1oZWFkZXItcnRsIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSwubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1hZnRlcntwYWRkaW5nLXJpZ2h0OjRweH0ubWF0LXRhYi1oZWFkZXItcnRsIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWFmdGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjJweCAycHggMCAwO2NvbnRlbnQ6IiI7aGVpZ2h0OjhweDt3aWR0aDo4cHh9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWR7Ym94LXNoYWRvdzpub25lO2N1cnNvcjpkZWZhdWx0fS5tYXQtdGFiLWxpc3R7ZmxleC1ncm93OjE7cG9zaXRpb246cmVsYXRpdmU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gNTAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpfS5tYXQtaW5rLWJhcntwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MDtoZWlnaHQ6MnB4O3RyYW5zaXRpb246NTAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtaW5rLWJhcnt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tYXQtaW5rLWJhcntib3R0b206YXV0bzt0b3A6MH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtaW5rLWJhcntvdXRsaW5lOnNvbGlkIDJweDtoZWlnaHQ6MH0ubWF0LXRhYi1sYWJlbHN7ZGlzcGxheTpmbGV4fVttYXQtYWxpZ24tdGFicz1jZW50ZXJdPi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbHN7anVzdGlmeS1jb250ZW50OmNlbnRlcn1bbWF0LWFsaWduLXRhYnM9ZW5kXT4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWxze2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0ubWF0LXRhYi1sYWJlbC1jb250YWluZXJ7ZGlzcGxheTpmbGV4O2ZsZXgtZ3JvdzoxO292ZXJmbG93OmhpZGRlbjt6LWluZGV4OjF9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC10YWItbGlzdHt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC10YWItbGFiZWx7aGVpZ2h0OjQ4cHg7cGFkZGluZzowIDI0cHg7Y3Vyc29yOnBvaW50ZXI7Ym94LXNpemluZzpib3JkZXItYm94O29wYWNpdHk6LjY7bWluLXdpZHRoOjE2MHB4O3RleHQtYWxpZ246Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtdGFiLWxhYmVsOmZvY3Vze291dGxpbmU6bm9uZX0ubWF0LXRhYi1sYWJlbDpmb2N1czpub3QoLm1hdC10YWItZGlzYWJsZWQpe29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdGFiLWxhYmVsOmZvY3Vze291dGxpbmU6ZG90dGVkIDJweDtvdXRsaW5lLW9mZnNldDotMnB4fS5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHR9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVke29wYWNpdHk6LjV9Lm1hdC10YWItbGFiZWwgLm1hdC10YWItbGFiZWwtY29udGVudHtkaXNwbGF5OmlubGluZS1mbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdGFiLWxhYmVse29wYWNpdHk6MX1AbWVkaWEobWF4LXdpZHRoOiA1OTlweCl7Lm1hdC10YWItbGFiZWx7bWluLXdpZHRoOjcycHh9fVxuJ119XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6VWd9LHt0eXBlOnVGfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTphX30se3R5cGU6d3p9LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19XX0pLHtfaXRlbXM6W3t0eXBlOllhLGFyZ3M6W0JCLHtkZXNjZW5kYW50czohMX1dfV0sX2lua0Jhcjpbe3R5cGU6WmEsYXJnczpbTUIse3N0YXRpYzohMH1dfV0sX3RhYkxpc3RDb250YWluZXI6W3t0eXBlOlphLGFyZ3M6WyJ0YWJMaXN0Q29udGFpbmVyIix7c3RhdGljOiEwfV19XSxfdGFiTGlzdDpbe3R5cGU6WmEsYXJnczpbInRhYkxpc3QiLHtzdGF0aWM6ITB9XX1dLF9uZXh0UGFnaW5hdG9yOlt7dHlwZTpaYSxhcmdzOlsibmV4dFBhZ2luYXRvciJdfV0sX3ByZXZpb3VzUGFnaW5hdG9yOlt7dHlwZTpaYSxhcmdzOlsicHJldmlvdXNQYWdpbmF0b3IiXX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBXQiBleHRlbmRzIGpCe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIpe3N1cGVyKHQsbyxpLGUsbixhLHIpLHRoaXMuX2Rpc2FibGVSaXBwbGU9ITEsdGhpcy5jb2xvcj0icHJpbWFyeSJ9Z2V0IGJhY2tncm91bmRDb2xvcigpe3JldHVybiB0aGlzLl9iYWNrZ3JvdW5kQ29sb3J9c2V0IGJhY2tncm91bmRDb2xvcih0KXtjb25zdCBlPXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3Q7ZS5yZW1vdmUoYG1hdC1iYWNrZ3JvdW5kLSR7dGhpcy5iYWNrZ3JvdW5kQ29sb3J9YCksdCYmZS5hZGQoYG1hdC1iYWNrZ3JvdW5kLSR7dH1gKSx0aGlzLl9iYWNrZ3JvdW5kQ29sb3I9dH1nZXQgZGlzYWJsZVJpcHBsZSgpe3JldHVybiB0aGlzLl9kaXNhYmxlUmlwcGxlfXNldCBkaXNhYmxlUmlwcGxlKHQpe3RoaXMuX2Rpc2FibGVSaXBwbGU9eXoodCl9X2l0ZW1TZWxlY3RlZCgpe31uZ0FmdGVyQ29udGVudEluaXQoKXt0aGlzLl9pdGVtcy5jaGFuZ2VzLnBpcGUoTmUobnVsbCksSWUodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgoKT0+e3RoaXMudXBkYXRlQWN0aXZlTGluaygpfSkpLHN1cGVyLm5nQWZ0ZXJDb250ZW50SW5pdCgpfXVwZGF0ZUFjdGl2ZUxpbmsoKXtpZighdGhpcy5faXRlbXMpcmV0dXJuO2NvbnN0IHQ9dGhpcy5faXRlbXMudG9BcnJheSgpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKHRbZV0uYWN0aXZlKXJldHVybiB0aGlzLnNlbGVjdGVkSW5kZXg9ZSx2b2lkIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO3RoaXMuc2VsZWN0ZWRJbmRleD0tMSx0aGlzLl9pbmtCYXIuaGlkZSgpfX1XQi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8V0IpKFNtKGhnKSxTbShISSw4KSxTbShhXyksU20oVWcpLFNtKHVGKSxTbSh3eiksU20oVlAsOCkpfSxXQi7JtWRpcj1sbyh7dHlwZTpXQixpbnB1dHM6e2NvbG9yOiJjb2xvciIsYmFja2dyb3VuZENvbG9yOiJiYWNrZ3JvdW5kQ29sb3IiLGRpc2FibGVSaXBwbGU6ImRpc2FibGVSaXBwbGUifSxmZWF0dXJlczpbeHBdfSksV0IuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ30se3R5cGU6SEksZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6YV99LHt0eXBlOlVnfSx7dHlwZTp1Rn0se3R5cGU6d3p9LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19XSxXQi5wcm9wRGVjb3JhdG9ycz17YmFja2dyb3VuZENvbG9yOlt7dHlwZTp4eX1dLGRpc2FibGVSaXBwbGU6W3t0eXBlOnh5fV0sY29sb3I6W3t0eXBlOnh5fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoV0IsW3t0eXBlOkN5fV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTphX30se3R5cGU6VWd9LHt0eXBlOnVGfSx7dHlwZTp3en0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dfSkse2NvbG9yOlt7dHlwZTp4eX1dLGJhY2tncm91bmRDb2xvcjpbe3R5cGU6eHl9XSxkaXNhYmxlUmlwcGxlOlt7dHlwZTp4eX1dfSk7Y2xhc3MgWUIgZXh0ZW5kcyBXQntjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyKXtzdXBlcih0LGUsbixvLGksYSxyKX19WUIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFlCKShTbShoZyksU20oSEksOCksU20oYV8pLFNtKFVnKSxTbSh1RiksU20od3opLFNtKFZQLDgpKX0sWUIuybVjbXA9dG8oe3R5cGU6WUIsc2VsZWN0b3JzOltbIiIsIm1hdC10YWItbmF2LWJhciIsIiJdXSxjb250ZW50UXVlcmllczpmdW5jdGlvbiB0KGUsbixvKXtpZigxJmUmJiRoKG8sWEIsNSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5faXRlbXM9dCl9fSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmKFFoKE1CLDcpLFFoKGdCLDcpLFFoKGhCLDcpLFFoKGJCLDUpLFFoKHlCLDUpKSwyJmUpe2xldCB0O0poKHQ9dGIoKSkmJihuLl9pbmtCYXI9dC5maXJzdCksSmgodD10YigpKSYmKG4uX3RhYkxpc3RDb250YWluZXI9dC5maXJzdCksSmgodD10YigpKSYmKG4uX3RhYkxpc3Q9dC5maXJzdCksSmgodD10YigpKSYmKG4uX25leHRQYWdpbmF0b3I9dC5maXJzdCksSmgodD10YigpKSYmKG4uX3ByZXZpb3VzUGFnaW5hdG9yPXQuZmlyc3QpfX0saG9zdEF0dHJzOlsxLCJtYXQtdGFiLW5hdi1iYXIiLCJtYXQtdGFiLWhlYWRlciJdLGhvc3RWYXJzOjEwLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZwdSgibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jb250cm9scy1lbmFibGVkIixuLl9zaG93UGFnaW5hdGlvbkNvbnRyb2xzKSgibWF0LXRhYi1oZWFkZXItcnRsIiwicnRsIj09bi5fZ2V0TGF5b3V0RGlyZWN0aW9uKCkpKCJtYXQtcHJpbWFyeSIsIndhcm4iIT09bi5jb2xvciYmImFjY2VudCIhPT1uLmNvbG9yKSgibWF0LWFjY2VudCIsImFjY2VudCI9PT1uLmNvbG9yKSgibWF0LXdhcm4iLCJ3YXJuIj09PW4uY29sb3IpfSxpbnB1dHM6e2NvbG9yOiJjb2xvciJ9LGV4cG9ydEFzOlsibWF0VGFiTmF2QmFyIiwibWF0VGFiTmF2Il0sZmVhdHVyZXM6W3hwXSxhdHRyczpbIm1hdC10YWItbmF2LWJhciIsIiJdLG5nQ29udGVudFNlbGVjdG9yczppQixkZWNsczoxMyx2YXJzOjgsY29uc3RzOltbImFyaWEtaGlkZGVuIiwidHJ1ZSIsIm1hdC1yaXBwbGUiLCIiLDEsIm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24iLCJtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSIsIm1hdC1lbGV2YXRpb24tejQiLDMsIm1hdFJpcHBsZURpc2FibGVkIiwiY2xpY2siLCJtb3VzZWRvd24iLCJ0b3VjaGVuZCJdLFsicHJldmlvdXNQYWdpbmF0b3IiLCIiXSxbMSwibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIl0sWzEsIm1hdC10YWItbGluay1jb250YWluZXIiLDMsImtleWRvd24iXSxbInRhYkxpc3RDb250YWluZXIiLCIiXSxbMSwibWF0LXRhYi1saXN0IiwzLCJjZGtPYnNlcnZlQ29udGVudCJdLFsidGFiTGlzdCIsIiJdLFsxLCJtYXQtdGFiLWxpbmtzIl0sWyJhcmlhLWhpZGRlbiIsInRydWUiLCJtYXQtcmlwcGxlIiwiIiwxLCJtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIiwibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1hZnRlciIsIm1hdC1lbGV2YXRpb24tejQiLDMsIm1hdFJpcHBsZURpc2FibGVkIiwibW91c2Vkb3duIiwiY2xpY2siLCJ0b3VjaGVuZCJdLFsibmV4dFBhZ2luYXRvciIsIiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoWm0oKSxSbSgwLCJkaXYiLDAsMSksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9oYW5kbGVQYWdpbmF0b3JDbGljaygiYmVmb3JlIil9KSkoIm1vdXNlZG93biIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX2hhbmRsZVBhZ2luYXRvclByZXNzKCJiZWZvcmUiLGUpfSkpKCJ0b3VjaGVuZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5fc3RvcEludGVydmFsKCl9KSksVG0oMiwiZGl2IiwyKSxBbSgpLFJtKDMsImRpdiIsMyw0KSxWbSgia2V5ZG93biIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX2hhbmRsZUtleWRvd24oZSl9KSksUm0oNSwiZGl2Iiw1LDYpLFZtKCJjZGtPYnNlcnZlQ29udGVudCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5fb25Db250ZW50Q2hhbmdlcygpfSkpLFJtKDcsImRpdiIsNyksWG0oOCksQW0oKSxUbSg5LCJtYXQtaW5rLWJhciIpLEFtKCksQW0oKSxSbSgxMCwiZGl2Iiw4LDkpLFZtKCJtb3VzZWRvd24iLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9oYW5kbGVQYWdpbmF0b3JQcmVzcygiYWZ0ZXIiLGUpfSkpKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5faGFuZGxlUGFnaW5hdG9yQ2xpY2soImFmdGVyIil9KSkoInRvdWNoZW5kIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9zdG9wSW50ZXJ2YWwoKX0pKSxUbSgxMiwiZGl2IiwyKSxBbSgpKSwyJmUmJihwdSgibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCIsbi5fZGlzYWJsZVNjcm9sbEJlZm9yZSksRG0oIm1hdFJpcHBsZURpc2FibGVkIixuLl9kaXNhYmxlU2Nyb2xsQmVmb3JlfHxuLmRpc2FibGVSaXBwbGUpLHJjKDUpLHB1KCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsIk5vb3BBbmltYXRpb25zIj09PW4uX2FuaW1hdGlvbk1vZGUpLHJjKDUpLHB1KCJtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIixuLl9kaXNhYmxlU2Nyb2xsQWZ0ZXIpLERtKCJtYXRSaXBwbGVEaXNhYmxlZCIsbi5fZGlzYWJsZVNjcm9sbEFmdGVyfHxuLmRpc2FibGVSaXBwbGUpKX0sZGlyZWN0aXZlczpba0gsanosTUJdLHN0eWxlczpbJy5tYXQtdGFiLWhlYWRlcntkaXNwbGF5OmZsZXg7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXgtc2hyaW5rOjB9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6bm9uZTtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjttaW4td2lkdGg6MzJweDtjdXJzb3I6cG9pbnRlcjt6LWluZGV4OjI7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RvdWNoLWFjdGlvbjpub25lfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNvbnRyb2xzLWVuYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257ZGlzcGxheTpmbGV4fS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSwubWF0LXRhYi1oZWFkZXItcnRsIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWFmdGVye3BhZGRpbmctbGVmdDo0cHh9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYmVmb3JlIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItaGVhZGVyLXJ0bCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1hZnRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue3RyYW5zZm9ybTpyb3RhdGUoLTEzNWRlZyl9Lm1hdC10YWItaGVhZGVyLXJ0bCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1iZWZvcmUsLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYWZ0ZXJ7cGFkZGluZy1yaWdodDo0cHh9Lm1hdC10YWItaGVhZGVyLXJ0bCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1iZWZvcmUgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1hZnRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDoycHggMnB4IDAgMDtjb250ZW50OiIiO2hlaWdodDo4cHg7d2lkdGg6OHB4fS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVke2JveC1zaGFkb3c6bm9uZTtjdXJzb3I6ZGVmYXVsdH0ubWF0LXRhYi1saXN0e2ZsZXgtZ3JvdzoxO3Bvc2l0aW9uOnJlbGF0aXZlO3RyYW5zaXRpb246dHJhbnNmb3JtIDUwMG1zIGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKX0ubWF0LXRhYi1saW5rc3tkaXNwbGF5OmZsZXh9W21hdC1hbGlnbi10YWJzPWNlbnRlcl0+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGlua3N7anVzdGlmeS1jb250ZW50OmNlbnRlcn1bbWF0LWFsaWduLXRhYnM9ZW5kXT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXRhYi1saW5rc3tqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9Lm1hdC1pbmstYmFye3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTowO2hlaWdodDoycHg7dHJhbnNpdGlvbjo1MDBtcyBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSl9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1pbmstYmFye3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXIgLm1hdC1pbmstYmFye2JvdHRvbTphdXRvO3RvcDowfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1pbmstYmFye291dGxpbmU6c29saWQgMnB4O2hlaWdodDowfS5tYXQtdGFiLWxpbmstY29udGFpbmVye2Rpc3BsYXk6ZmxleDtmbGV4LWdyb3c6MTtvdmVyZmxvdzpoaWRkZW47ei1pbmRleDoxfS5tYXQtdGFiLWxpbmt7aGVpZ2h0OjQ4cHg7cGFkZGluZzowIDI0cHg7Y3Vyc29yOnBvaW50ZXI7Ym94LXNpemluZzpib3JkZXItYm94O29wYWNpdHk6LjY7bWluLXdpZHRoOjE2MHB4O3RleHQtYWxpZ246Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwO3ZlcnRpY2FsLWFsaWduOnRvcDt0ZXh0LWRlY29yYXRpb246bm9uZTtwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzpoaWRkZW47LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtdGFiLWxpbms6Zm9jdXN7b3V0bGluZTpub25lfS5tYXQtdGFiLWxpbms6Zm9jdXM6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXRhYi1saW5rOmZvY3Vze291dGxpbmU6ZG90dGVkIDJweDtvdXRsaW5lLW9mZnNldDotMnB4fS5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtvcGFjaXR5Oi41fS5tYXQtdGFiLWxpbmsgLm1hdC10YWItbGFiZWwtY29udGVudHtkaXNwbGF5OmlubGluZS1mbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdGFiLWxpbmt7b3BhY2l0eToxfVttYXQtc3RyZXRjaC10YWJzXSAubWF0LXRhYi1saW5re2ZsZXgtYmFzaXM6MDtmbGV4LWdyb3c6MX0ubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7cG9pbnRlci1ldmVudHM6bm9uZX1AbWVkaWEobWF4LXdpZHRoOiA1OTlweCl7Lm1hdC10YWItbGlua3ttaW4td2lkdGg6NzJweH19XG4nXSxlbmNhcHN1bGF0aW9uOjJ9KSxZQi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTphX30se3R5cGU6VWd9LHt0eXBlOnVGfSx7dHlwZTp3en0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dLFlCLnByb3BEZWNvcmF0b3JzPXtfaXRlbXM6W3t0eXBlOllhLGFyZ3M6W3FlKCgoKT0+WEIpKSx7ZGVzY2VuZGFudHM6ITB9XX1dLF9pbmtCYXI6W3t0eXBlOlphLGFyZ3M6W01CLHtzdGF0aWM6ITB9XX1dLF90YWJMaXN0Q29udGFpbmVyOlt7dHlwZTpaYSxhcmdzOlsidGFiTGlzdENvbnRhaW5lciIse3N0YXRpYzohMH1dfV0sX3RhYkxpc3Q6W3t0eXBlOlphLGFyZ3M6WyJ0YWJMaXN0Iix7c3RhdGljOiEwfV19XSxfbmV4dFBhZ2luYXRvcjpbe3R5cGU6WmEsYXJnczpbIm5leHRQYWdpbmF0b3IiXX1dLF9wcmV2aW91c1BhZ2luYXRvcjpbe3R5cGU6WmEsYXJnczpbInByZXZpb3VzUGFnaW5hdG9yIl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChZQixbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJbbWF0LXRhYi1uYXYtYmFyXSIsZXhwb3J0QXM6Im1hdFRhYk5hdkJhciwgbWF0VGFiTmF2IixpbnB1dHM6WyJjb2xvciJdLHRlbXBsYXRlOic8ZGl2IGNsYXNzPSJtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIG1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYmVmb3JlIG1hdC1lbGV2YXRpb24tejQiXG4gICAgICNwcmV2aW91c1BhZ2luYXRvclxuICAgICBhcmlhLWhpZGRlbj0idHJ1ZSJcbiAgICAgbWF0LXJpcHBsZSBbbWF0UmlwcGxlRGlzYWJsZWRdPSJfZGlzYWJsZVNjcm9sbEJlZm9yZSB8fCBkaXNhYmxlUmlwcGxlIlxuICAgICBbY2xhc3MubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZF09Il9kaXNhYmxlU2Nyb2xsQmVmb3JlIlxuICAgICAoY2xpY2spPSJfaGFuZGxlUGFnaW5hdG9yQ2xpY2soXCdiZWZvcmVcJykiXG4gICAgIChtb3VzZWRvd24pPSJfaGFuZGxlUGFnaW5hdG9yUHJlc3MoXCdiZWZvcmVcJywgJGV2ZW50KSJcbiAgICAgKHRvdWNoZW5kKT0iX3N0b3BJbnRlcnZhbCgpIj5cbiAgPGRpdiBjbGFzcz0ibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIj48L2Rpdj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPSJtYXQtdGFiLWxpbmstY29udGFpbmVyIiAjdGFiTGlzdENvbnRhaW5lciAoa2V5ZG93bik9Il9oYW5kbGVLZXlkb3duKCRldmVudCkiPlxuICA8ZGl2XG4gICAgY2xhc3M9Im1hdC10YWItbGlzdCJcbiAgICBbY2xhc3MuX21hdC1hbmltYXRpb24tbm9vcGFibGVdPSJfYW5pbWF0aW9uTW9kZSA9PT0gXCdOb29wQW5pbWF0aW9uc1wnIlxuICAgICN0YWJMaXN0XG4gICAgKGNka09ic2VydmVDb250ZW50KT0iX29uQ29udGVudENoYW5nZXMoKSI+XG4gICAgPGRpdiBjbGFzcz0ibWF0LXRhYi1saW5rcyI+XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gICAgPG1hdC1pbmstYmFyPjwvbWF0LWluay1iYXI+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9Im1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gbWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1hZnRlciBtYXQtZWxldmF0aW9uLXo0IlxuICAgICAjbmV4dFBhZ2luYXRvclxuICAgICBhcmlhLWhpZGRlbj0idHJ1ZSJcbiAgICAgbWF0LXJpcHBsZSBbbWF0UmlwcGxlRGlzYWJsZWRdPSJfZGlzYWJsZVNjcm9sbEFmdGVyIHx8IGRpc2FibGVSaXBwbGUiXG4gICAgIFtjbGFzcy5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkXT0iX2Rpc2FibGVTY3JvbGxBZnRlciJcbiAgICAgKG1vdXNlZG93bik9Il9oYW5kbGVQYWdpbmF0b3JQcmVzcyhcJ2FmdGVyXCcsICRldmVudCkiXG4gICAgIChjbGljayk9Il9oYW5kbGVQYWdpbmF0b3JDbGljayhcJ2FmdGVyXCcpIlxuICAgICAodG91Y2hlbmQpPSJfc3RvcEludGVydmFsKCkiPlxuICA8ZGl2IGNsYXNzPSJtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24iPjwvZGl2PlxuPC9kaXY+XG4nLGhvc3Q6e2NsYXNzOiJtYXQtdGFiLW5hdi1iYXIgbWF0LXRhYi1oZWFkZXIiLCJbY2xhc3MubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jb250cm9scy1lbmFibGVkXSI6Il9zaG93UGFnaW5hdGlvbkNvbnRyb2xzIiwiW2NsYXNzLm1hdC10YWItaGVhZGVyLXJ0bF0iOiJfZ2V0TGF5b3V0RGlyZWN0aW9uKCkgPT0gJ3J0bCciLCJbY2xhc3MubWF0LXByaW1hcnldIjonY29sb3IgIT09ICJ3YXJuIiAmJiBjb2xvciAhPT0gImFjY2VudCInLCJbY2xhc3MubWF0LWFjY2VudF0iOidjb2xvciA9PT0gImFjY2VudCInLCJbY2xhc3MubWF0LXdhcm5dIjonY29sb3IgPT09ICJ3YXJuIid9LGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uRGVmYXVsdCxzdHlsZXM6WycubWF0LXRhYi1oZWFkZXJ7ZGlzcGxheTpmbGV4O292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZTtmbGV4LXNocmluazowfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5Om5vbmU7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7bWluLXdpZHRoOjMycHg7Y3Vyc29yOnBvaW50ZXI7ei1pbmRleDoyOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0b3VjaC1hY3Rpb246bm9uZX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jb250cm9scy1lbmFibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9ue2Rpc3BsYXk6ZmxleH0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1iZWZvcmUsLm1hdC10YWItaGVhZGVyLXJ0bCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1hZnRlcntwYWRkaW5nLWxlZnQ6NHB4fS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWhlYWRlci1ydGwgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYWZ0ZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbnt0cmFuc2Zvcm06cm90YXRlKC0xMzVkZWcpfS5tYXQtdGFiLWhlYWRlci1ydGwgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYmVmb3JlLC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWFmdGVye3BhZGRpbmctcmlnaHQ6NHB4fS5tYXQtdGFiLWhlYWRlci1ydGwgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYmVmb3JlIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYWZ0ZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbnt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6MnB4IDJweCAwIDA7Y29udGVudDoiIjtoZWlnaHQ6OHB4O3dpZHRoOjhweH0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZHtib3gtc2hhZG93Om5vbmU7Y3Vyc29yOmRlZmF1bHR9Lm1hdC10YWItbGlzdHtmbGV4LWdyb3c6MTtwb3NpdGlvbjpyZWxhdGl2ZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSA1MDBtcyBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSl9Lm1hdC10YWItbGlua3N7ZGlzcGxheTpmbGV4fVttYXQtYWxpZ24tdGFicz1jZW50ZXJdPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmtze2p1c3RpZnktY29udGVudDpjZW50ZXJ9W21hdC1hbGlnbi10YWJzPWVuZF0+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGlua3N7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5tYXQtaW5rLWJhcntwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MDtoZWlnaHQ6MnB4O3RyYW5zaXRpb246NTAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtaW5rLWJhcnt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tYXQtaW5rLWJhcntib3R0b206YXV0bzt0b3A6MH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtaW5rLWJhcntvdXRsaW5lOnNvbGlkIDJweDtoZWlnaHQ6MH0ubWF0LXRhYi1saW5rLWNvbnRhaW5lcntkaXNwbGF5OmZsZXg7ZmxleC1ncm93OjE7b3ZlcmZsb3c6aGlkZGVuO3otaW5kZXg6MX0ubWF0LXRhYi1saW5re2hlaWdodDo0OHB4O3BhZGRpbmc6MCAyNHB4O2N1cnNvcjpwb2ludGVyO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvcGFjaXR5Oi42O21pbi13aWR0aDoxNjBweDt0ZXh0LWFsaWduOmNlbnRlcjtkaXNwbGF5OmlubGluZS1mbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcDt2ZXJ0aWNhbC1hbGlnbjp0b3A7dGV4dC1kZWNvcmF0aW9uOm5vbmU7cG9zaXRpb246cmVsYXRpdmU7b3ZlcmZsb3c6aGlkZGVuOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LXRhYi1saW5rOmZvY3Vze291dGxpbmU6bm9uZX0ubWF0LXRhYi1saW5rOmZvY3VzOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10YWItbGluazpmb2N1c3tvdXRsaW5lOmRvdHRlZCAycHg7b3V0bGluZS1vZmZzZXQ6LTJweH0ubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHR9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7b3BhY2l0eTouNX0ubWF0LXRhYi1saW5rIC5tYXQtdGFiLWxhYmVsLWNvbnRlbnR7ZGlzcGxheTppbmxpbmUtZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXB9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXRhYi1saW5re29wYWNpdHk6MX1bbWF0LXN0cmV0Y2gtdGFic10gLm1hdC10YWItbGlua3tmbGV4LWJhc2lzOjA7ZmxleC1ncm93OjF9Lm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVke3BvaW50ZXItZXZlbnRzOm5vbmV9QG1lZGlhKG1heC13aWR0aDogNTk5cHgpey5tYXQtdGFiLWxpbmt7bWluLXdpZHRoOjcycHh9fVxuJ119XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6SEksZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6YV99LHt0eXBlOlVnfSx7dHlwZTp1Rn0se3R5cGU6d3p9LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19XX0pLHtfaXRlbXM6W3t0eXBlOllhLGFyZ3M6W3FlKCgoKT0+WEIpKSx7ZGVzY2VuZGFudHM6ITB9XX1dLF9pbmtCYXI6W3t0eXBlOlphLGFyZ3M6W01CLHtzdGF0aWM6ITB9XX1dLF90YWJMaXN0Q29udGFpbmVyOlt7dHlwZTpaYSxhcmdzOlsidGFiTGlzdENvbnRhaW5lciIse3N0YXRpYzohMH1dfV0sX3RhYkxpc3Q6W3t0eXBlOlphLGFyZ3M6WyJ0YWJMaXN0Iix7c3RhdGljOiEwfV19XSxfbmV4dFBhZ2luYXRvcjpbe3R5cGU6WmEsYXJnczpbIm5leHRQYWdpbmF0b3IiXX1dLF9wcmV2aW91c1BhZ2luYXRvcjpbe3R5cGU6WmEsYXJnczpbInByZXZpb3VzUGFnaW5hdG9yIl19XX0pO2NvbnN0IHFCPSRJKFFJKEtJKGNsYXNze30pKSk7Y2xhc3MgWkIgZXh0ZW5kcyBxQntjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSl7c3VwZXIoKSx0aGlzLl90YWJOYXZCYXI9dCx0aGlzLmVsZW1lbnRSZWY9ZSx0aGlzLl9mb2N1c01vbml0b3I9aSx0aGlzLl9pc0FjdGl2ZT0hMSx0aGlzLnJpcHBsZUNvbmZpZz1ufHx7fSx0aGlzLnRhYkluZGV4PXBhcnNlSW50KG8pfHwwLCJOb29wQW5pbWF0aW9ucyI9PT1hJiYodGhpcy5yaXBwbGVDb25maWcuYW5pbWF0aW9uPXtlbnRlckR1cmF0aW9uOjAsZXhpdER1cmF0aW9uOjB9KX1nZXQgYWN0aXZlKCl7cmV0dXJuIHRoaXMuX2lzQWN0aXZlfXNldCBhY3RpdmUodCl7eXoodCkhPT10aGlzLl9pc0FjdGl2ZSYmKHRoaXMuX2lzQWN0aXZlPXQsdGhpcy5fdGFiTmF2QmFyLnVwZGF0ZUFjdGl2ZUxpbmsoKSl9Z2V0IHJpcHBsZURpc2FibGVkKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWR8fHRoaXMuZGlzYWJsZVJpcHBsZXx8dGhpcy5fdGFiTmF2QmFyLmRpc2FibGVSaXBwbGV8fCEhdGhpcy5yaXBwbGVDb25maWcuZGlzYWJsZWR9Zm9jdXMoKXt0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpfW5nQWZ0ZXJWaWV3SW5pdCgpe3RoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHRoaXMuZWxlbWVudFJlZil9bmdPbkRlc3Ryb3koKXt0aGlzLl9mb2N1c01vbml0b3Iuc3RvcE1vbml0b3JpbmcodGhpcy5lbGVtZW50UmVmKX1faGFuZGxlRm9jdXMoKXt0aGlzLl90YWJOYXZCYXIuZm9jdXNJbmRleD10aGlzLl90YWJOYXZCYXIuX2l0ZW1zLnRvQXJyYXkoKS5pbmRleE9mKHRoaXMpfX1aQi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WkIpKFNtKFdCKSxTbShoZyksU20od0gsOCksTmEoInRhYmluZGV4IiksU20oU0kpLFNtKFZQLDgpKX0sWkIuybVkaXI9bG8oe3R5cGU6WkIsaW5wdXRzOnthY3RpdmU6ImFjdGl2ZSJ9LGZlYXR1cmVzOlt4cF19KSxaQi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOldCfSx7dHlwZTpoZ30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOlt3SF19XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmphLGFyZ3M6WyJ0YWJpbmRleCJdfV19LHt0eXBlOlNJfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV0sWkIucHJvcERlY29yYXRvcnM9e2FjdGl2ZTpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChaQixbe3R5cGU6Q3l9XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6V0J9LHt0eXBlOmhnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3dIXX1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6amEsYXJnczpbInRhYmluZGV4Il19XX0se3R5cGU6U0l9LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19XX0pLHthY3RpdmU6W3t0eXBlOnh5fV19KTtjbGFzcyBYQiBleHRlbmRzIFpCe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIscyl7c3VwZXIodCxlLGksYSxyLHMpLHRoaXMuX3RhYkxpbmtSaXBwbGU9bmV3IFBIKHRoaXMsbixlLG8pLHRoaXMuX3RhYkxpbmtSaXBwbGUuc2V0dXBUcmlnZ2VyRXZlbnRzKGUubmF0aXZlRWxlbWVudCl9bmdPbkRlc3Ryb3koKXtzdXBlci5uZ09uRGVzdHJveSgpLHRoaXMuX3RhYkxpbmtSaXBwbGUuX3JlbW92ZVRyaWdnZXJFdmVudHMoKX19WEIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFhCKShTbShZQiksU20oaGcpLFNtKGFfKSxTbSh3eiksU20od0gsOCksTmEoInRhYmluZGV4IiksU20oU0kpLFNtKFZQLDgpKX0sWEIuybVkaXI9bG8oe3R5cGU6WEIsc2VsZWN0b3JzOltbIiIsIm1hdC10YWItbGluayIsIiJdLFsiIiwibWF0VGFiTGluayIsIiJdXSxob3N0QXR0cnM6WzEsIm1hdC10YWItbGluayIsIm1hdC1mb2N1cy1pbmRpY2F0b3IiXSxob3N0VmFyczo3LGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgiZm9jdXMiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX2hhbmRsZUZvY3VzKCl9KSksMiZlJiYoanAoImFyaWEtY3VycmVudCIsbi5hY3RpdmU/InBhZ2UiOm51bGwpKCJhcmlhLWRpc2FibGVkIixuLmRpc2FibGVkKSgidGFiSW5kZXgiLG4udGFiSW5kZXgpLHB1KCJtYXQtdGFiLWRpc2FibGVkIixuLmRpc2FibGVkKSgibWF0LXRhYi1sYWJlbC1hY3RpdmUiLG4uYWN0aXZlKSl9LGlucHV0czp7ZGlzYWJsZWQ6ImRpc2FibGVkIixkaXNhYmxlUmlwcGxlOiJkaXNhYmxlUmlwcGxlIix0YWJJbmRleDoidGFiSW5kZXgifSxleHBvcnRBczpbIm1hdFRhYkxpbmsiXSxmZWF0dXJlczpbeHBdfSksWEIuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpZQn0se3R5cGU6aGd9LHt0eXBlOmFffSx7dHlwZTp3en0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOlt3SF19XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmphLGFyZ3M6WyJ0YWJpbmRleCJdfV19LHt0eXBlOlNJfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChYQixbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbWF0LXRhYi1saW5rXSwgW21hdFRhYkxpbmtdIixleHBvcnRBczoibWF0VGFiTGluayIsaW5wdXRzOlsiZGlzYWJsZWQiLCJkaXNhYmxlUmlwcGxlIiwidGFiSW5kZXgiXSxob3N0OntjbGFzczoibWF0LXRhYi1saW5rIG1hdC1mb2N1cy1pbmRpY2F0b3IiLCJbYXR0ci5hcmlhLWN1cnJlbnRdIjonYWN0aXZlID8gInBhZ2UiIDogbnVsbCcsIlthdHRyLmFyaWEtZGlzYWJsZWRdIjoiZGlzYWJsZWQiLCJbYXR0ci50YWJJbmRleF0iOiJ0YWJJbmRleCIsIltjbGFzcy5tYXQtdGFiLWRpc2FibGVkXSI6ImRpc2FibGVkIiwiW2NsYXNzLm1hdC10YWItbGFiZWwtYWN0aXZlXSI6ImFjdGl2ZSIsIihmb2N1cykiOiJfaGFuZGxlRm9jdXMoKSJ9fV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6WUJ9LHt0eXBlOmhnfSx7dHlwZTphX30se3R5cGU6d3p9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbd0hdfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpqYSxhcmdzOlsidGFiaW5kZXgiXX1dfSx7dHlwZTpTSX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBLQnt9S0IuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEtCKX0sS0IuybVtb2Q9YW8oe3R5cGU6S0J9KSxLQi7JtWluaj12bih7aW1wb3J0czpbW1dNLFhJLFJGLFNILFV6LE5JXSxYSV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEtCLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbV00sWEksUkYsU0gsVXosTkldLGV4cG9ydHM6W1hJLEZCLFBCLFNCLFlCLFhCLHhCXSxkZWNsYXJhdGlvbnM6W0ZCLFBCLFNCLE1CLEJCLFlCLFhCLEFCLEVCLEdCLHhCXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKEtCLHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bRkIsUEIsU0IsTUIsQkIsWUIsWEIsQUIsRUIsR0IseEJdfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1dNLFhJLFJGLFNILFV6LE5JXX0sZXhwb3J0czpmdW5jdGlvbigpe3JldHVybltYSSxGQixQQixTQixZQixYQix4Ql19fSk7Y29uc3QgSkI9WyJ1bmRlcmxpbmUiXSxRQj1bImNvbm5lY3Rpb25Db250YWluZXIiXSwkQj1bImlucHV0Q29udGFpbmVyIl0sdFY9WyJsYWJlbCJdO2Z1bmN0aW9uIGVWKHQsZSl7MSZ0JiYoTm0oMCksUm0oMSwiZGl2IiwxNCksVG0oMiwiZGl2IiwxNSksVG0oMywiZGl2IiwxNiksVG0oNCwiZGl2IiwxNyksQW0oKSxSbSg1LCJkaXYiLDE4KSxUbSg2LCJkaXYiLDE1KSxUbSg3LCJkaXYiLDE2KSxUbSg4LCJkaXYiLDE3KSxBbSgpLHptKCkpfWZ1bmN0aW9uIG5WKHQsZSl7MSZ0JiYoUm0oMCwiZGl2IiwxOSksWG0oMSwxKSxBbSgpKX1mdW5jdGlvbiBvVih0LGUpe2lmKDEmdCYmKE5tKDApLFhtKDEsMiksUm0oMiwic3BhbiIpLGt1KDMpLEFtKCksem0oKSksMiZ0KXtjb25zdCB0PVltKDIpO3JjKDMpLFN1KHQuX2NvbnRyb2wucGxhY2Vob2xkZXIpfX1mdW5jdGlvbiBpVih0LGUpezEmdCYmWG0oMCwzLFsiKm5nU3dpdGNoQ2FzZSIsInRydWUiXSl9ZnVuY3Rpb24gYVYodCxlKXsxJnQmJihSbSgwLCJzcGFuIiwyMyksa3UoMSwiICoiKSxBbSgpKX1mdW5jdGlvbiByVih0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsImxhYmVsIiwyMCwyMSksVm0oImNka09ic2VydmVDb250ZW50IiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgpLnVwZGF0ZU91dGxpbmVHYXAoKX0pKSxRcCgyLG9WLDQsMSwibmctY29udGFpbmVyIiwxMiksUXAoMyxpViwxLDAsIm5nLWNvbnRlbnQiLDEyKSxRcCg0LGFWLDIsMCwic3BhbiIsMjIpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKCk7cHUoIm1hdC1lbXB0eSIsdC5fY29udHJvbC5lbXB0eSYmIXQuX3Nob3VsZEFsd2F5c0Zsb2F0KCkpKCJtYXQtZm9ybS1maWVsZC1lbXB0eSIsdC5fY29udHJvbC5lbXB0eSYmIXQuX3Nob3VsZEFsd2F5c0Zsb2F0KCkpKCJtYXQtYWNjZW50IiwiYWNjZW50Ij09dC5jb2xvcikoIm1hdC13YXJuIiwid2FybiI9PXQuY29sb3IpLERtKCJjZGtPYnNlcnZlQ29udGVudERpc2FibGVkIiwib3V0bGluZSIhPXQuYXBwZWFyYW5jZSkoImlkIix0Ll9sYWJlbElkKSgibmdTd2l0Y2giLHQuX2hhc0xhYmVsKCkpLGpwKCJmb3IiLHQuX2NvbnRyb2wuaWQpKCJhcmlhLW93bnMiLHQuX2NvbnRyb2wuaWQpLHJjKDIpLERtKCJuZ1N3aXRjaENhc2UiLCExKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIiwhMCkscmMoMSksRG0oIm5nSWYiLCF0LmhpZGVSZXF1aXJlZE1hcmtlciYmdC5fY29udHJvbC5yZXF1aXJlZCYmIXQuX2NvbnRyb2wuZGlzYWJsZWQpfX1mdW5jdGlvbiBzVih0LGUpezEmdCYmKFJtKDAsImRpdiIsMjQpLFhtKDEsNCksQW0oKSl9ZnVuY3Rpb24gbFYodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDI1LDI2KSxUbSgyLCJzcGFuIiwyNyksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoMikscHUoIm1hdC1hY2NlbnQiLCJhY2NlbnQiPT10LmNvbG9yKSgibWF0LXdhcm4iLCJ3YXJuIj09dC5jb2xvcil9fWZ1bmN0aW9uIGNWKHQsZSl7MSZ0JiYoUm0oMCwiZGl2IiksWG0oMSw1KSxBbSgpKSwyJnQmJkRtKCJAdHJhbnNpdGlvbk1lc3NhZ2VzIixZbSgpLl9zdWJzY3JpcHRBbmltYXRpb25TdGF0ZSl9ZnVuY3Rpb24gZFYodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDMxKSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMik7RG0oImlkIix0Ll9oaW50TGFiZWxJZCkscmMoMSksU3UodC5oaW50TGFiZWwpfX1mdW5jdGlvbiBwVih0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsMjgpLFFwKDEsZFYsMiwyLCJkaXYiLDI5KSxYbSgyLDYpLFRtKDMsImRpdiIsMzApLFhtKDQsNyksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7RG0oIkB0cmFuc2l0aW9uTWVzc2FnZXMiLHQuX3N1YnNjcmlwdEFuaW1hdGlvblN0YXRlKSxyYygxKSxEbSgibmdJZiIsdC5oaW50TGFiZWwpfX1jb25zdCBtVj1bIioiLFtbIiIsIm1hdFByZWZpeCIsIiJdXSxbWyJtYXQtcGxhY2Vob2xkZXIiXV0sW1sibWF0LWxhYmVsIl1dLFtbIiIsIm1hdFN1ZmZpeCIsIiJdXSxbWyJtYXQtZXJyb3IiXV0sW1sibWF0LWhpbnQiLDMsImFsaWduIiwiZW5kIl1dLFtbIm1hdC1oaW50IiwiYWxpZ24iLCJlbmQiXV1dO2xldCB1Vj0wO2NvbnN0IGZWPW5ldyBHYSgiTWF0RXJyb3IiKTtjbGFzcyBnVntjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuaWQ9Im1hdC1lcnJvci0iK3VWKyssdHx8ZS5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1saXZlIiwicG9saXRlIil9fWdWLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxnVikoTmEoImFyaWEtbGl2ZSIpLFNtKGhnKSl9LGdWLsm1ZGlyPWxvKHt0eXBlOmdWLHNlbGVjdG9yczpbWyJtYXQtZXJyb3IiXV0saG9zdEF0dHJzOlsiYXJpYS1hdG9taWMiLCJ0cnVlIiwxLCJtYXQtZXJyb3IiXSxob3N0VmFyczoxLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZqcCgiaWQiLG4uaWQpfSxpbnB1dHM6e2lkOiJpZCJ9LGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6ZlYsdXNlRXhpc3Rpbmc6Z1Z9XSldfSksZ1YuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6amEsYXJnczpbImFyaWEtbGl2ZSJdfV19LHt0eXBlOmhnfV0sZ1YucHJvcERlY29yYXRvcnM9e2lkOlt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGdWLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC1lcnJvciIsaG9zdDp7Y2xhc3M6Im1hdC1lcnJvciIsIlthdHRyLmlkXSI6ImlkIiwiYXJpYS1hdG9taWMiOiJ0cnVlIn0scHJvdmlkZXJzOlt7cHJvdmlkZTpmVix1c2VFeGlzdGluZzpnVn1dfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmphLGFyZ3M6WyJhcmlhLWxpdmUiXX1dfSx7dHlwZTpoZ31dfSkse2lkOlt7dHlwZTp4eX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBoVj17dHJhbnNpdGlvbk1lc3NhZ2VzOm54KCJ0cmFuc2l0aW9uTWVzc2FnZXMiLFtyeCgiZW50ZXIiLGF4KHtvcGFjaXR5OjEsdHJhbnNmb3JtOiJ0cmFuc2xhdGVZKDAlKSJ9KSksbHgoInZvaWQgPT4gZW50ZXIiLFtheCh7b3BhY2l0eTowLHRyYW5zZm9ybToidHJhbnNsYXRlWSgtNXB4KSJ9KSxveCgiMzAwbXMgY3ViaWMtYmV6aWVyKDAuNTUsIDAsIDAuNTUsIDAuMikiKV0pXSl9OwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBiVnt9ZnVuY3Rpb24geVYodCl7cmV0dXJuIEVycm9yKGBBIGhpbnQgd2FzIGFscmVhZHkgZGVjbGFyZWQgZm9yICdhbGlnbj0iJHt0fSInLmApfWJWLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxiVil9LGJWLsm1ZGlyPWxvKHt0eXBlOmJWfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChiVixbe3R5cGU6Q3l9XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KbGV0IF9WPTA7Y29uc3QgQ1Y9bmV3IEdhKCJNYXRIaW50Iik7Y2xhc3MgTVZ7Y29uc3RydWN0b3IoKXt0aGlzLmFsaWduPSJzdGFydCIsdGhpcy5pZD0ibWF0LWhpbnQtIitfVisrfX1NVi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8TVYpfSxNVi7JtWRpcj1sbyh7dHlwZTpNVixzZWxlY3RvcnM6W1sibWF0LWhpbnQiXV0saG9zdEF0dHJzOlsxLCJtYXQtaGludCJdLGhvc3RWYXJzOjQsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJihqcCgiaWQiLG4uaWQpKCJhbGlnbiIsbnVsbCkscHUoIm1hdC1mb3JtLWZpZWxkLWhpbnQtZW5kIiwiZW5kIj09PW4uYWxpZ24pKX0saW5wdXRzOnthbGlnbjoiYWxpZ24iLGlkOiJpZCJ9LGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6Q1YsdXNlRXhpc3Rpbmc6TVZ9XSldfSksTVYucHJvcERlY29yYXRvcnM9e2FsaWduOlt7dHlwZTp4eX1dLGlkOlt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKE1WLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC1oaW50Iixob3N0OntjbGFzczoibWF0LWhpbnQiLCJbY2xhc3MubWF0LWZvcm0tZmllbGQtaGludC1lbmRdIjonYWxpZ24gPT09ICJlbmQiJywiW2F0dHIuaWRdIjoiaWQiLCJbYXR0ci5hbGlnbl0iOiJudWxsIn0scHJvdmlkZXJzOlt7cHJvdmlkZTpDVix1c2VFeGlzdGluZzpNVn1dfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5bXX0pLHthbGlnbjpbe3R5cGU6eHl9XSxpZDpbe3R5cGU6eHl9XX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgdlZ7fXZWLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx2Vil9LHZWLsm1ZGlyPWxvKHt0eXBlOnZWLHNlbGVjdG9yczpbWyJtYXQtbGFiZWwiXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHZWLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC1sYWJlbCJ9XX1dLG51bGwsbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyB4Vnt9eFYuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHhWKX0seFYuybVkaXI9bG8oe3R5cGU6eFYsc2VsZWN0b3JzOltbIm1hdC1wbGFjZWhvbGRlciJdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoeFYsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoibWF0LXBsYWNlaG9sZGVyIn1dfV0sbnVsbCxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IE9WPW5ldyBHYSgiTWF0UHJlZml4Iik7Y2xhc3MgUFZ7fVBWLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxQVil9LFBWLsm1ZGlyPWxvKHt0eXBlOlBWLHNlbGVjdG9yczpbWyIiLCJtYXRQcmVmaXgiLCIiXV0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTpPVix1c2VFeGlzdGluZzpQVn1dKV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFBWLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IlttYXRQcmVmaXhdIixwcm92aWRlcnM6W3twcm92aWRlOk9WLHVzZUV4aXN0aW5nOlBWfV19XX1dLG51bGwsbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCB3Vj1uZXcgR2EoIk1hdFN1ZmZpeCIpO2NsYXNzIGtWe31rVi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8a1YpfSxrVi7JtWRpcj1sbyh7dHlwZTprVixzZWxlY3RvcnM6W1siIiwibWF0U3VmZml4IiwiIl1dLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6d1YsdXNlRXhpc3Rpbmc6a1Z9XSldfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChrVixbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbWF0U3VmZml4XSIscHJvdmlkZXJzOlt7cHJvdmlkZTp3Vix1c2VFeGlzdGluZzprVn1dfV19XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KbGV0IFNWPTA7Y29uc3QgRFY9SkkoY2xhc3N7Y29uc3RydWN0b3IodCl7dGhpcy5fZWxlbWVudFJlZj10fX0sInByaW1hcnkiKSxFVj1uZXcgR2EoIk1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfT1BUSU9OUyIpLFJWPW5ldyBHYSgiTWF0Rm9ybUZpZWxkIik7Y2xhc3MgQVYgZXh0ZW5kcyBEVntjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyLHMpe3N1cGVyKHQpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmPWUsdGhpcy5fZGlyPW8sdGhpcy5fZGVmYXVsdHM9aSx0aGlzLl9wbGF0Zm9ybT1hLHRoaXMuX25nWm9uZT1yLHRoaXMuX291dGxpbmVHYXBDYWxjdWxhdGlvbk5lZWRlZEltbWVkaWF0ZWx5PSExLHRoaXMuX291dGxpbmVHYXBDYWxjdWxhdGlvbk5lZWRlZE9uU3RhYmxlPSExLHRoaXMuX2Rlc3Ryb3llZD1uZXcgSSx0aGlzLl9zaG93QWx3YXlzQW5pbWF0ZT0hMSx0aGlzLl9zdWJzY3JpcHRBbmltYXRpb25TdGF0ZT0iIix0aGlzLl9oaW50TGFiZWw9IiIsdGhpcy5faGludExhYmVsSWQ9Im1hdC1oaW50LSIrU1YrKyx0aGlzLl9sYWJlbElkPSJtYXQtZm9ybS1maWVsZC1sYWJlbC0iK1NWKyssdGhpcy5mbG9hdExhYmVsPXRoaXMuX2dldERlZmF1bHRGbG9hdExhYmVsU3RhdGUoKSx0aGlzLl9hbmltYXRpb25zRW5hYmxlZD0iTm9vcEFuaW1hdGlvbnMiIT09cyx0aGlzLmFwcGVhcmFuY2U9aSYmaS5hcHBlYXJhbmNlP2kuYXBwZWFyYW5jZToibGVnYWN5Iix0aGlzLl9oaWRlUmVxdWlyZWRNYXJrZXI9ISghaXx8bnVsbD09aS5oaWRlUmVxdWlyZWRNYXJrZXIpJiZpLmhpZGVSZXF1aXJlZE1hcmtlcn1nZXQgYXBwZWFyYW5jZSgpe3JldHVybiB0aGlzLl9hcHBlYXJhbmNlfXNldCBhcHBlYXJhbmNlKHQpe2NvbnN0IGU9dGhpcy5fYXBwZWFyYW5jZTt0aGlzLl9hcHBlYXJhbmNlPXR8fHRoaXMuX2RlZmF1bHRzJiZ0aGlzLl9kZWZhdWx0cy5hcHBlYXJhbmNlfHwibGVnYWN5Iiwib3V0bGluZSI9PT10aGlzLl9hcHBlYXJhbmNlJiZlIT09dCYmKHRoaXMuX291dGxpbmVHYXBDYWxjdWxhdGlvbk5lZWRlZE9uU3RhYmxlPSEwKX1nZXQgaGlkZVJlcXVpcmVkTWFya2VyKCl7cmV0dXJuIHRoaXMuX2hpZGVSZXF1aXJlZE1hcmtlcn1zZXQgaGlkZVJlcXVpcmVkTWFya2VyKHQpe3RoaXMuX2hpZGVSZXF1aXJlZE1hcmtlcj15eih0KX1fc2hvdWxkQWx3YXlzRmxvYXQoKXtyZXR1cm4iYWx3YXlzIj09PXRoaXMuZmxvYXRMYWJlbCYmIXRoaXMuX3Nob3dBbHdheXNBbmltYXRlfV9jYW5MYWJlbEZsb2F0KCl7cmV0dXJuIm5ldmVyIiE9PXRoaXMuZmxvYXRMYWJlbH1nZXQgaGludExhYmVsKCl7cmV0dXJuIHRoaXMuX2hpbnRMYWJlbH1zZXQgaGludExhYmVsKHQpe3RoaXMuX2hpbnRMYWJlbD10LHRoaXMuX3Byb2Nlc3NIaW50cygpfWdldCBmbG9hdExhYmVsKCl7cmV0dXJuImxlZ2FjeSIhPT10aGlzLmFwcGVhcmFuY2UmJiJuZXZlciI9PT10aGlzLl9mbG9hdExhYmVsPyJhdXRvIjp0aGlzLl9mbG9hdExhYmVsfXNldCBmbG9hdExhYmVsKHQpe3QhPT10aGlzLl9mbG9hdExhYmVsJiYodGhpcy5fZmxvYXRMYWJlbD10fHx0aGlzLl9nZXREZWZhdWx0RmxvYXRMYWJlbFN0YXRlKCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpfWdldCBfY29udHJvbCgpe3JldHVybiB0aGlzLl9leHBsaWNpdEZvcm1GaWVsZENvbnRyb2x8fHRoaXMuX2NvbnRyb2xOb25TdGF0aWN8fHRoaXMuX2NvbnRyb2xTdGF0aWN9c2V0IF9jb250cm9sKHQpe3RoaXMuX2V4cGxpY2l0Rm9ybUZpZWxkQ29udHJvbD10fWdldExhYmVsSWQoKXtyZXR1cm4gdGhpcy5faGFzRmxvYXRpbmdMYWJlbCgpP3RoaXMuX2xhYmVsSWQ6bnVsbH1nZXRDb25uZWN0ZWRPdmVybGF5T3JpZ2luKCl7cmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25Db250YWluZXJSZWZ8fHRoaXMuX2VsZW1lbnRSZWZ9bmdBZnRlckNvbnRlbnRJbml0KCl7dGhpcy5fdmFsaWRhdGVDb250cm9sQ2hpbGQoKTtjb25zdCB0PXRoaXMuX2NvbnRyb2w7dC5jb250cm9sVHlwZSYmdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoYG1hdC1mb3JtLWZpZWxkLXR5cGUtJHt0LmNvbnRyb2xUeXBlfWApLHQuc3RhdGVDaGFuZ2VzLnBpcGUoTmUobnVsbCkpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLl92YWxpZGF0ZVBsYWNlaG9sZGVycygpLHRoaXMuX3N5bmNEZXNjcmliZWRCeUlkcygpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfSkpLHQubmdDb250cm9sJiZ0Lm5nQ29udHJvbC52YWx1ZUNoYW5nZXMmJnQubmdDb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKEllKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoKCk9PnRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKSksdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e3RoaXMuX25nWm9uZS5vblN0YWJsZS5waXBlKEllKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLl9vdXRsaW5lR2FwQ2FsY3VsYXRpb25OZWVkZWRPblN0YWJsZSYmdGhpcy51cGRhdGVPdXRsaW5lR2FwKCl9KSl9KSkscmUodGhpcy5fcHJlZml4Q2hpbGRyZW4uY2hhbmdlcyx0aGlzLl9zdWZmaXhDaGlsZHJlbi5jaGFuZ2VzKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fb3V0bGluZUdhcENhbGN1bGF0aW9uTmVlZGVkT25TdGFibGU9ITAsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9KSksdGhpcy5faGludENoaWxkcmVuLmNoYW5nZXMucGlwZShOZShudWxsKSkuc3Vic2NyaWJlKCgoKT0+e3RoaXMuX3Byb2Nlc3NIaW50cygpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfSkpLHRoaXMuX2Vycm9yQ2hpbGRyZW4uY2hhbmdlcy5waXBlKE5lKG51bGwpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fc3luY0Rlc2NyaWJlZEJ5SWRzKCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9KSksdGhpcy5fZGlyJiZ0aGlzLl9kaXIuY2hhbmdlLnBpcGUoSWUodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgoKT0+eyJmdW5jdGlvbiI9PXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU/dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKCk9PnRoaXMudXBkYXRlT3V0bGluZUdhcCgpKSl9KSk6dGhpcy51cGRhdGVPdXRsaW5lR2FwKCl9KSl9bmdBZnRlckNvbnRlbnRDaGVja2VkKCl7dGhpcy5fdmFsaWRhdGVDb250cm9sQ2hpbGQoKSx0aGlzLl9vdXRsaW5lR2FwQ2FsY3VsYXRpb25OZWVkZWRJbW1lZGlhdGVseSYmdGhpcy51cGRhdGVPdXRsaW5lR2FwKCl9bmdBZnRlclZpZXdJbml0KCl7dGhpcy5fc3Vic2NyaXB0QW5pbWF0aW9uU3RhdGU9ImVudGVyIix0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9kZXN0cm95ZWQubmV4dCgpLHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpfV9zaG91bGRGb3J3YXJkKHQpe2NvbnN0IGU9dGhpcy5fY29udHJvbD90aGlzLl9jb250cm9sLm5nQ29udHJvbDpudWxsO3JldHVybiBlJiZlW3RdfV9oYXNQbGFjZWhvbGRlcigpe3JldHVybiEhKHRoaXMuX2NvbnRyb2wmJnRoaXMuX2NvbnRyb2wucGxhY2Vob2xkZXJ8fHRoaXMuX3BsYWNlaG9sZGVyQ2hpbGQpfV9oYXNMYWJlbCgpe3JldHVybiEoIXRoaXMuX2xhYmVsQ2hpbGROb25TdGF0aWMmJiF0aGlzLl9sYWJlbENoaWxkU3RhdGljKX1fc2hvdWxkTGFiZWxGbG9hdCgpe3JldHVybiB0aGlzLl9jYW5MYWJlbEZsb2F0KCkmJih0aGlzLl9jb250cm9sJiZ0aGlzLl9jb250cm9sLnNob3VsZExhYmVsRmxvYXR8fHRoaXMuX3Nob3VsZEFsd2F5c0Zsb2F0KCkpfV9oaWRlQ29udHJvbFBsYWNlaG9sZGVyKCl7cmV0dXJuImxlZ2FjeSI9PT10aGlzLmFwcGVhcmFuY2UmJiF0aGlzLl9oYXNMYWJlbCgpfHx0aGlzLl9oYXNMYWJlbCgpJiYhdGhpcy5fc2hvdWxkTGFiZWxGbG9hdCgpfV9oYXNGbG9hdGluZ0xhYmVsKCl7cmV0dXJuIHRoaXMuX2hhc0xhYmVsKCl8fCJsZWdhY3kiPT09dGhpcy5hcHBlYXJhbmNlJiZ0aGlzLl9oYXNQbGFjZWhvbGRlcigpfV9nZXREaXNwbGF5ZWRNZXNzYWdlcygpe3JldHVybiB0aGlzLl9lcnJvckNoaWxkcmVuJiZ0aGlzLl9lcnJvckNoaWxkcmVuLmxlbmd0aD4wJiZ0aGlzLl9jb250cm9sLmVycm9yU3RhdGU/ImVycm9yIjoiaGludCJ9X2FuaW1hdGVBbmRMb2NrTGFiZWwoKXt0aGlzLl9oYXNGbG9hdGluZ0xhYmVsKCkmJnRoaXMuX2NhbkxhYmVsRmxvYXQoKSYmKHRoaXMuX2FuaW1hdGlvbnNFbmFibGVkJiZ0aGlzLl9sYWJlbCYmKHRoaXMuX3Nob3dBbHdheXNBbmltYXRlPSEwLG9lKHRoaXMuX2xhYmVsLm5hdGl2ZUVsZW1lbnQsInRyYW5zaXRpb25lbmQiKS5waXBlKGJlKDEpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fc2hvd0Fsd2F5c0FuaW1hdGU9ITF9KSkpLHRoaXMuZmxvYXRMYWJlbD0iYWx3YXlzIix0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSl9X3ZhbGlkYXRlUGxhY2Vob2xkZXJzKCl7aWYodGhpcy5fY29udHJvbC5wbGFjZWhvbGRlciYmdGhpcy5fcGxhY2Vob2xkZXJDaGlsZCYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KdGhyb3coZnVuY3Rpb24gdCgpe3JldHVybiBFcnJvcigiUGxhY2Vob2xkZXIgYXR0cmlidXRlIGFuZCBjaGlsZCBlbGVtZW50IHdlcmUgYm90aCBzcGVjaWZpZWQuIil9KSgpfV9wcm9jZXNzSGludHMoKXt0aGlzLl92YWxpZGF0ZUhpbnRzKCksdGhpcy5fc3luY0Rlc2NyaWJlZEJ5SWRzKCl9X3ZhbGlkYXRlSGludHMoKXtpZih0aGlzLl9oaW50Q2hpbGRyZW4mJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSl7bGV0IHQsZTt0aGlzLl9oaW50Q2hpbGRyZW4uZm9yRWFjaCgobj0+e2lmKCJzdGFydCI9PT1uLmFsaWduKXtpZih0fHx0aGlzLmhpbnRMYWJlbCl0aHJvdyB5Vigic3RhcnQiKTt0PW59ZWxzZSBpZigiZW5kIj09PW4uYWxpZ24pe2lmKGUpdGhyb3cgeVYoImVuZCIpO2U9bn19KSl9fV9nZXREZWZhdWx0RmxvYXRMYWJlbFN0YXRlKCl7cmV0dXJuIHRoaXMuX2RlZmF1bHRzJiZ0aGlzLl9kZWZhdWx0cy5mbG9hdExhYmVsfHwiYXV0byJ9X3N5bmNEZXNjcmliZWRCeUlkcygpe2lmKHRoaXMuX2NvbnRyb2wpe2xldCB0PVtdO2lmKHRoaXMuX2NvbnRyb2wudXNlckFyaWFEZXNjcmliZWRCeSYmInN0cmluZyI9PXR5cGVvZiB0aGlzLl9jb250cm9sLnVzZXJBcmlhRGVzY3JpYmVkQnkmJnQucHVzaCguLi50aGlzLl9jb250cm9sLnVzZXJBcmlhRGVzY3JpYmVkQnkuc3BsaXQoIiAiKSksImhpbnQiPT09dGhpcy5fZ2V0RGlzcGxheWVkTWVzc2FnZXMoKSl7Y29uc3QgZT10aGlzLl9oaW50Q2hpbGRyZW4/dGhpcy5faGludENoaWxkcmVuLmZpbmQoKHQ9PiJzdGFydCI9PT10LmFsaWduKSk6bnVsbCxuPXRoaXMuX2hpbnRDaGlsZHJlbj90aGlzLl9oaW50Q2hpbGRyZW4uZmluZCgodD0+ImVuZCI9PT10LmFsaWduKSk6bnVsbDtlP3QucHVzaChlLmlkKTp0aGlzLl9oaW50TGFiZWwmJnQucHVzaCh0aGlzLl9oaW50TGFiZWxJZCksbiYmdC5wdXNoKG4uaWQpfWVsc2UgdGhpcy5fZXJyb3JDaGlsZHJlbiYmdC5wdXNoKC4uLnRoaXMuX2Vycm9yQ2hpbGRyZW4ubWFwKCh0PT50LmlkKSkpO3RoaXMuX2NvbnRyb2wuc2V0RGVzY3JpYmVkQnlJZHModCl9fV92YWxpZGF0ZUNvbnRyb2xDaGlsZCgpe2lmKCF0aGlzLl9jb250cm9sJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkpdGhyb3coZnVuY3Rpb24gdCgpe3JldHVybiBFcnJvcigibWF0LWZvcm0tZmllbGQgbXVzdCBjb250YWluIGEgTWF0Rm9ybUZpZWxkQ29udHJvbC4iKX0pKCl9dXBkYXRlT3V0bGluZUdhcCgpe2NvbnN0IHQ9dGhpcy5fbGFiZWw/dGhpcy5fbGFiZWwubmF0aXZlRWxlbWVudDpudWxsO2lmKCJvdXRsaW5lIiE9PXRoaXMuYXBwZWFyYW5jZXx8IXR8fCF0LmNoaWxkcmVuLmxlbmd0aHx8IXQudGV4dENvbnRlbnQudHJpbSgpKXJldHVybjtpZighdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKXJldHVybjtpZighdGhpcy5faXNBdHRhY2hlZFRvRE9NKCkpcmV0dXJuIHZvaWQodGhpcy5fb3V0bGluZUdhcENhbGN1bGF0aW9uTmVlZGVkSW1tZWRpYXRlbHk9ITApO2xldCBlPTAsbj0wO2NvbnN0IG89dGhpcy5fY29ubmVjdGlvbkNvbnRhaW5lclJlZi5uYXRpdmVFbGVtZW50LGk9by5xdWVyeVNlbGVjdG9yQWxsKCIubWF0LWZvcm0tZmllbGQtb3V0bGluZS1zdGFydCIpLGE9by5xdWVyeVNlbGVjdG9yQWxsKCIubWF0LWZvcm0tZmllbGQtb3V0bGluZS1nYXAiKTtpZih0aGlzLl9sYWJlbCYmdGhpcy5fbGFiZWwubmF0aXZlRWxlbWVudC5jaGlsZHJlbi5sZW5ndGgpe2NvbnN0IGk9by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZigwPT09aS53aWR0aCYmMD09PWkuaGVpZ2h0KXJldHVybiB0aGlzLl9vdXRsaW5lR2FwQ2FsY3VsYXRpb25OZWVkZWRPblN0YWJsZT0hMCx2b2lkKHRoaXMuX291dGxpbmVHYXBDYWxjdWxhdGlvbk5lZWRlZEltbWVkaWF0ZWx5PSExKTtjb25zdCBhPXRoaXMuX2dldFN0YXJ0RW5kKGkpLHI9dC5jaGlsZHJlbixzPXRoaXMuX2dldFN0YXJ0RW5kKHJbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO2xldCBsPTA7Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0KyspbCs9clt0XS5vZmZzZXRXaWR0aDtlPU1hdGguYWJzKHMtYSktNSxuPWw+MD8uNzUqbCsxMDowfWZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7dCsrKWlbdF0uc3R5bGUud2lkdGg9YCR7ZX1weGA7Zm9yKGxldCB0PTA7dDxhLmxlbmd0aDt0KyspYVt0XS5zdHlsZS53aWR0aD1gJHtufXB4YDt0aGlzLl9vdXRsaW5lR2FwQ2FsY3VsYXRpb25OZWVkZWRPblN0YWJsZT10aGlzLl9vdXRsaW5lR2FwQ2FsY3VsYXRpb25OZWVkZWRJbW1lZGlhdGVseT0hMX1fZ2V0U3RhcnRFbmQodCl7cmV0dXJuIHRoaXMuX2RpciYmInJ0bCI9PT10aGlzLl9kaXIudmFsdWU/dC5yaWdodDp0LmxlZnR9X2lzQXR0YWNoZWRUb0RPTSgpe2NvbnN0IHQ9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O2lmKHQuZ2V0Um9vdE5vZGUpe2NvbnN0IGU9dC5nZXRSb290Tm9kZSgpO3JldHVybiBlJiZlIT09dH1yZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zKHQpfX1BVi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8QVYpKFNtKGhnKSxTbShVZyksU20oaGcpLFNtKEhJLDgpLFNtKEVWLDgpLFNtKHd6KSxTbShhXyksU20oVlAsOCkpfSxBVi7JtWNtcD10byh7dHlwZTpBVixzZWxlY3RvcnM6W1sibWF0LWZvcm0tZmllbGQiXV0sY29udGVudFF1ZXJpZXM6ZnVuY3Rpb24gdChlLG4sbyl7aWYoMSZlJiYoJGgobyxiViw1KSwkaChvLGJWLDcpLCRoKG8sdlYsNSksJGgobyx2Viw3KSwkaChvLHhWLDUpLCRoKG8sZlYsNSksJGgobyxDViw1KSwkaChvLE9WLDUpLCRoKG8sd1YsNSkpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uX2NvbnRyb2xOb25TdGF0aWM9dC5maXJzdCksSmgodD10YigpKSYmKG4uX2NvbnRyb2xTdGF0aWM9dC5maXJzdCksSmgodD10YigpKSYmKG4uX2xhYmVsQ2hpbGROb25TdGF0aWM9dC5maXJzdCksSmgodD10YigpKSYmKG4uX2xhYmVsQ2hpbGRTdGF0aWM9dC5maXJzdCksSmgodD10YigpKSYmKG4uX3BsYWNlaG9sZGVyQ2hpbGQ9dC5maXJzdCksSmgodD10YigpKSYmKG4uX2Vycm9yQ2hpbGRyZW49dCksSmgodD10YigpKSYmKG4uX2hpbnRDaGlsZHJlbj10KSxKaCh0PXRiKCkpJiYobi5fcHJlZml4Q2hpbGRyZW49dCksSmgodD10YigpKSYmKG4uX3N1ZmZpeENoaWxkcmVuPXQpfX0sdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihRaChKQiw1KSxRaChRQiw3KSxRaCgkQiw1KSxRaCh0Viw1KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi51bmRlcmxpbmVSZWY9dC5maXJzdCksSmgodD10YigpKSYmKG4uX2Nvbm5lY3Rpb25Db250YWluZXJSZWY9dC5maXJzdCksSmgodD10YigpKSYmKG4uX2lucHV0Q29udGFpbmVyUmVmPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLl9sYWJlbD10LmZpcnN0KX19LGhvc3RBdHRyczpbMSwibWF0LWZvcm0tZmllbGQiXSxob3N0VmFyczo0MCxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmcHUoIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQiLCJzdGFuZGFyZCI9PW4uYXBwZWFyYW5jZSkoIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCIsImZpbGwiPT1uLmFwcGVhcmFuY2UpKCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUiLCJvdXRsaW5lIj09bi5hcHBlYXJhbmNlKSgibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kiLCJsZWdhY3kiPT1uLmFwcGVhcmFuY2UpKCJtYXQtZm9ybS1maWVsZC1pbnZhbGlkIixuLl9jb250cm9sLmVycm9yU3RhdGUpKCJtYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQiLG4uX2NhbkxhYmVsRmxvYXQoKSkoIm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCIsbi5fc2hvdWxkTGFiZWxGbG9hdCgpKSgibWF0LWZvcm0tZmllbGQtaGFzLWxhYmVsIixuLl9oYXNGbG9hdGluZ0xhYmVsKCkpKCJtYXQtZm9ybS1maWVsZC1oaWRlLXBsYWNlaG9sZGVyIixuLl9oaWRlQ29udHJvbFBsYWNlaG9sZGVyKCkpKCJtYXQtZm9ybS1maWVsZC1kaXNhYmxlZCIsbi5fY29udHJvbC5kaXNhYmxlZCkoIm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsZWQiLG4uX2NvbnRyb2wuYXV0b2ZpbGxlZCkoIm1hdC1mb2N1c2VkIixuLl9jb250cm9sLmZvY3VzZWQpKCJuZy11bnRvdWNoZWQiLG4uX3Nob3VsZEZvcndhcmQoInVudG91Y2hlZCIpKSgibmctdG91Y2hlZCIsbi5fc2hvdWxkRm9yd2FyZCgidG91Y2hlZCIpKSgibmctcHJpc3RpbmUiLG4uX3Nob3VsZEZvcndhcmQoInByaXN0aW5lIikpKCJuZy1kaXJ0eSIsbi5fc2hvdWxkRm9yd2FyZCgiZGlydHkiKSkoIm5nLXZhbGlkIixuLl9zaG91bGRGb3J3YXJkKCJ2YWxpZCIpKSgibmctaW52YWxpZCIsbi5fc2hvdWxkRm9yd2FyZCgiaW52YWxpZCIpKSgibmctcGVuZGluZyIsbi5fc2hvdWxkRm9yd2FyZCgicGVuZGluZyIpKSgiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLCFuLl9hbmltYXRpb25zRW5hYmxlZCl9LGlucHV0czp7Y29sb3I6ImNvbG9yIixmbG9hdExhYmVsOiJmbG9hdExhYmVsIixhcHBlYXJhbmNlOiJhcHBlYXJhbmNlIixoaWRlUmVxdWlyZWRNYXJrZXI6ImhpZGVSZXF1aXJlZE1hcmtlciIsaGludExhYmVsOiJoaW50TGFiZWwifSxleHBvcnRBczpbIm1hdEZvcm1GaWVsZCJdLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6UlYsdXNlRXhpc3Rpbmc6QVZ9XSkseHBdLG5nQ29udGVudFNlbGVjdG9yczpbIioiLCJbbWF0UHJlZml4XSIsIm1hdC1wbGFjZWhvbGRlciIsIm1hdC1sYWJlbCIsIlttYXRTdWZmaXhdIiwibWF0LWVycm9yIiwibWF0LWhpbnQ6bm90KFthbGlnbj0nZW5kJ10pIiwibWF0LWhpbnRbYWxpZ249J2VuZCddIl0sZGVjbHM6MTUsdmFyczo4LGNvbnN0czpbWzEsIm1hdC1mb3JtLWZpZWxkLXdyYXBwZXIiXSxbMSwibWF0LWZvcm0tZmllbGQtZmxleCIsMywiY2xpY2siXSxbImNvbm5lY3Rpb25Db250YWluZXIiLCIiXSxbNCwibmdJZiJdLFsiY2xhc3MiLCJtYXQtZm9ybS1maWVsZC1wcmVmaXgiLDQsIm5nSWYiXSxbMSwibWF0LWZvcm0tZmllbGQtaW5maXgiXSxbImlucHV0Q29udGFpbmVyIiwiIl0sWzEsIm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIiXSxbImNsYXNzIiwibWF0LWZvcm0tZmllbGQtbGFiZWwiLDMsImNka09ic2VydmVDb250ZW50RGlzYWJsZWQiLCJpZCIsIm1hdC1lbXB0eSIsIm1hdC1mb3JtLWZpZWxkLWVtcHR5IiwibWF0LWFjY2VudCIsIm1hdC13YXJuIiwibmdTd2l0Y2giLCJjZGtPYnNlcnZlQ29udGVudCIsNCwibmdJZiJdLFsiY2xhc3MiLCJtYXQtZm9ybS1maWVsZC1zdWZmaXgiLDQsIm5nSWYiXSxbImNsYXNzIiwibWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIiw0LCJuZ0lmIl0sWzEsIm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyIiwzLCJuZ1N3aXRjaCJdLFs0LCJuZ1N3aXRjaENhc2UiXSxbImNsYXNzIiwibWF0LWZvcm0tZmllbGQtaGludC13cmFwcGVyIiw0LCJuZ1N3aXRjaENhc2UiXSxbMSwibWF0LWZvcm0tZmllbGQtb3V0bGluZSJdLFsxLCJtYXQtZm9ybS1maWVsZC1vdXRsaW5lLXN0YXJ0Il0sWzEsIm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZ2FwIl0sWzEsIm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZW5kIl0sWzEsIm1hdC1mb3JtLWZpZWxkLW91dGxpbmUiLCJtYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrIl0sWzEsIm1hdC1mb3JtLWZpZWxkLXByZWZpeCJdLFsxLCJtYXQtZm9ybS1maWVsZC1sYWJlbCIsMywiY2RrT2JzZXJ2ZUNvbnRlbnREaXNhYmxlZCIsImlkIiwibmdTd2l0Y2giLCJjZGtPYnNlcnZlQ29udGVudCJdLFsibGFiZWwiLCIiXSxbImNsYXNzIiwibWF0LXBsYWNlaG9sZGVyLXJlcXVpcmVkIG1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlciIsImFyaWEtaGlkZGVuIiwidHJ1ZSIsNCwibmdJZiJdLFsiYXJpYS1oaWRkZW4iLCJ0cnVlIiwxLCJtYXQtcGxhY2Vob2xkZXItcmVxdWlyZWQiLCJtYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXIiXSxbMSwibWF0LWZvcm0tZmllbGQtc3VmZml4Il0sWzEsIm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSJdLFsidW5kZXJsaW5lIiwiIl0sWzEsIm1hdC1mb3JtLWZpZWxkLXJpcHBsZSJdLFsxLCJtYXQtZm9ybS1maWVsZC1oaW50LXdyYXBwZXIiXSxbImNsYXNzIiwibWF0LWhpbnQiLDMsImlkIiw0LCJuZ0lmIl0sWzEsIm1hdC1mb3JtLWZpZWxkLWhpbnQtc3BhY2VyIl0sWzEsIm1hdC1oaW50IiwzLCJpZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoWm0obVYpLFJtKDAsImRpdiIsMCksUm0oMSwiZGl2IiwxLDIpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX2NvbnRyb2wub25Db250YWluZXJDbGljayYmbi5fY29udHJvbC5vbkNvbnRhaW5lckNsaWNrKGUpfSkpLFFwKDMsZVYsOSwwLCJuZy1jb250YWluZXIiLDMpLFFwKDQsblYsMiwwLCJkaXYiLDQpLFJtKDUsImRpdiIsNSw2KSxYbSg3KSxSbSg4LCJzcGFuIiw3KSxRcCg5LHJWLDUsMTYsImxhYmVsIiw4KSxBbSgpLEFtKCksUXAoMTAsc1YsMiwwLCJkaXYiLDkpLEFtKCksUXAoMTEsbFYsMyw0LCJkaXYiLDEwKSxSbSgxMiwiZGl2IiwxMSksUXAoMTMsY1YsMiwxLCJkaXYiLDEyKSxRcCgxNCxwViw1LDIsImRpdiIsMTMpLEFtKCksQW0oKSksMiZlJiYocmMoMyksRG0oIm5nSWYiLCJvdXRsaW5lIj09bi5hcHBlYXJhbmNlKSxyYygxKSxEbSgibmdJZiIsbi5fcHJlZml4Q2hpbGRyZW4ubGVuZ3RoKSxyYyg1KSxEbSgibmdJZiIsbi5faGFzRmxvYXRpbmdMYWJlbCgpKSxyYygxKSxEbSgibmdJZiIsbi5fc3VmZml4Q2hpbGRyZW4ubGVuZ3RoKSxyYygxKSxEbSgibmdJZiIsIm91dGxpbmUiIT1uLmFwcGVhcmFuY2UpLHJjKDEpLERtKCJuZ1N3aXRjaCIsbi5fZ2V0RGlzcGxheWVkTWVzc2FnZXMoKSkscmMoMSksRG0oIm5nU3dpdGNoQ2FzZSIsImVycm9yIikscmMoMSksRG0oIm5nU3dpdGNoQ2FzZSIsImhpbnQiKSl9LGRpcmVjdGl2ZXM6W2RNLGZNLGdNLGp6XSxzdHlsZXM6WyIubWF0LWZvcm0tZmllbGR7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246cmVsYXRpdmU7dGV4dC1hbGlnbjpsZWZ0fVtkaXI9cnRsXSAubWF0LWZvcm0tZmllbGR7dGV4dC1hbGlnbjpyaWdodH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcntwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWZvcm0tZmllbGQtZmxleHtkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmJhc2VsaW5lO2JveC1zaXppbmc6Ym9yZGVyLWJveDt3aWR0aDoxMDAlfS5tYXQtZm9ybS1maWVsZC1wcmVmaXgsLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeHt3aGl0ZS1zcGFjZTpub3dyYXA7ZmxleDpub25lO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtZm9ybS1maWVsZC1pbmZpeHtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXg6YXV0bzttaW4td2lkdGg6MDt3aWR0aDoxODBweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1pbmZpeHtib3JkZXItaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRyYW5zcGFyZW50LCB0cmFuc3BhcmVudCl9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJ7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO2JveC1zaXppbmc6Y29udGVudC1ib3g7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvdmVyZmxvdzpoaWRkZW47cG9pbnRlci1ldmVudHM6bm9uZX1bZGlyPXJ0bF0gLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJ7bGVmdDphdXRvO3JpZ2h0OjB9Lm1hdC1mb3JtLWZpZWxkLWxhYmVse3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDtmb250OmluaGVyaXQ7cG9pbnRlci1ldmVudHM6bm9uZTt3aWR0aDoxMDAlO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO292ZXJmbG93OmhpZGRlbjt0cmFuc2Zvcm0tb3JpZ2luOjAgMDt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxjb2xvciA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSx3aWR0aCA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtkaXNwbGF5Om5vbmV9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMDtsZWZ0OmF1dG87cmlnaHQ6MH0ubWF0LWZvcm0tZmllbGQtZW1wdHkubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2Rpc3BsYXk6YmxvY2t9Lm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbCsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7ZGlzcGxheTpub25lfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbCsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7ZGlzcGxheTpibG9jazt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtaW5wdXQtc2VydmVyW3BsYWNlaG9sZGVyXTpub3QoOnBsYWNlaG9sZGVyLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7ZGlzcGxheTpub25lfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbcGxhY2Vob2xkZXJdOm5vdCg6cGxhY2Vob2xkZXItc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHtkaXNwbGF5OmJsb2NrfS5tYXQtZm9ybS1maWVsZC1sYWJlbDpub3QoLm1hdC1mb3JtLWZpZWxkLWVtcHR5KXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNmb3JtOnNjYWxlM2QoMSwgMS4wMDAxLCAxKX0ubWF0LWZvcm0tZmllbGQtcmlwcGxle3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt3aWR0aDoxMDAlO3RyYW5zZm9ybS1vcmlnaW46NTAlO3RyYW5zZm9ybTpzY2FsZVgoMC41KTtvcGFjaXR5OjA7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDMwMG1zIGN1YmljLWJlemllcigwLjU1LCAwLCAwLjU1LCAwLjIpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7b3BhY2l0eToxO3RyYW5zZm9ybTpub25lO3RyYW5zaXRpb246dHJhbnNmb3JtIDMwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLG9wYWNpdHkgMTAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYmFja2dyb3VuZC1jb2xvciAzMDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7cG9zaXRpb246YWJzb2x1dGU7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjEwMCU7b3ZlcmZsb3c6aGlkZGVufS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlciAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1pY29ue3dpZHRoOjFlbTtoZWlnaHQ6MWVtO2ZvbnQtc2l6ZTppbmhlcml0O3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfS5tYXQtZm9ybS1maWVsZC1oaW50LXdyYXBwZXJ7ZGlzcGxheTpmbGV4fS5tYXQtZm9ybS1maWVsZC1oaW50LXNwYWNlcntmbGV4OjEgMCAxZW19Lm1hdC1lcnJvcntkaXNwbGF5OmJsb2NrfS5tYXQtZm9ybS1maWVsZC1jb250cm9sLXdyYXBwZXJ7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1mb3JtLWZpZWxkLWhpbnQtZW5ke29yZGVyOjF9Lm1hdC1mb3JtLWZpZWxkLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXt0cmFuc2l0aW9uOm5vbmV9XG4iLCcubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1mbGV4e2JvcmRlci1yYWRpdXM6NHB4IDRweCAwIDA7cGFkZGluZzouNzVlbSAuNzVlbSAwIC43NWVtfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtZmxleHtvdXRsaW5lOnNvbGlkIDFweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWZsZXh7b3V0bGluZTpkYXNoZWQgM3B4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZTo6YmVmb3Jle2NvbnRlbnQ6IiI7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MDtoZWlnaHQ6MXB4O3dpZHRoOjEwMCV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtcmlwcGxle2JvdHRvbTowO2hlaWdodDoycHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7aGVpZ2h0OjB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbDpub3QoLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkKSAubWF0LWZvcm0tZmllbGQtZmxleDpob3Zlcn4ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7b3BhY2l0eToxO3RyYW5zZm9ybTpub25lO3RyYW5zaXRpb246b3BhY2l0eSA2MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlOm5vdCgubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQpIC5tYXQtZm9ybS1maWVsZC1mbGV4OmhvdmVyfi5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7cGFkZGluZzowIDFlbX1cbicsJy5tYXQtaW5wdXQtZWxlbWVudHtmb250OmluaGVyaXQ7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjpjdXJyZW50Q29sb3I7Ym9yZGVyOm5vbmU7b3V0bGluZTpub25lO3BhZGRpbmc6MDttYXJnaW46MDt3aWR0aDoxMDAlO21heC13aWR0aDoxMDAlO3ZlcnRpY2FsLWFsaWduOmJvdHRvbTt0ZXh0LWFsaWduOmluaGVyaXQ7Ym94LXNpemluZzpjb250ZW50LWJveH0ubWF0LWlucHV0LWVsZW1lbnQ6LW1vei11aS1pbnZhbGlke2JveC1zaGFkb3c6bm9uZX0ubWF0LWlucHV0LWVsZW1lbnQ6Oi1tcy1jbGVhciwubWF0LWlucHV0LWVsZW1lbnQ6Oi1tcy1yZXZlYWx7ZGlzcGxheTpub25lfS5tYXQtaW5wdXQtZWxlbWVudCwubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtc2VhcmNoLWNhbmNlbC1idXR0b24sLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uLC5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1zZWFyY2gtcmVzdWx0cy1idXR0b24sLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LXNlYXJjaC1yZXN1bHRzLWRlY29yYXRpb257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmV9Lm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWNvbnRhY3RzLWF1dG8tZmlsbC1idXR0b24sLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWNhcHMtbG9jay1pbmRpY2F0b3IsLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWNyZWRlbnRpYWxzLWF1dG8tZmlsbC1idXR0b257dmlzaWJpbGl0eTpoaWRkZW59Lm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9ZGF0ZV0sLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9ZGF0ZXRpbWVdLC5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPWRhdGV0aW1lLWxvY2FsXSwubWF0LWlucHV0LWVsZW1lbnRbdHlwZT1tb250aF0sLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9d2Vla10sLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9dGltZV17bGluZS1oZWlnaHQ6MX0ubWF0LWlucHV0LWVsZW1lbnRbdHlwZT1kYXRlXTo6YWZ0ZXIsLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9ZGF0ZXRpbWVdOjphZnRlciwubWF0LWlucHV0LWVsZW1lbnRbdHlwZT1kYXRldGltZS1sb2NhbF06OmFmdGVyLC5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPW1vbnRoXTo6YWZ0ZXIsLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9d2Vla106OmFmdGVyLC5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPXRpbWVdOjphZnRlcntjb250ZW50OiIgIjt3aGl0ZS1zcGFjZTpwcmU7d2lkdGg6MXB4fS5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiwubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvciwubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtY2xlYXItYnV0dG9ue2ZvbnQtc2l6ZTouNzVlbX0ubWF0LWlucHV0LWVsZW1lbnQ6OnBsYWNlaG9sZGVyey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt0cmFuc2l0aW9uOmNvbG9yIDQwMG1zIDEzMy4zMzMzMzMzMzMzbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1pbnB1dC1lbGVtZW50OjpwbGFjZWhvbGRlcjotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7LW1zLXVzZXItc2VsZWN0OnRleHR9Lm1hdC1pbnB1dC1lbGVtZW50OjotbW96LXBsYWNlaG9sZGVyey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt0cmFuc2l0aW9uOmNvbG9yIDQwMG1zIDEzMy4zMzMzMzMzMzMzbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1pbnB1dC1lbGVtZW50OjotbW96LXBsYWNlaG9sZGVyOi1tcy1pbnB1dC1wbGFjZWhvbGRlcnstbXMtdXNlci1zZWxlY3Q6dGV4dH0ubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3RyYW5zaXRpb246Y29sb3IgNDAwbXMgMTMzLjMzMzMzMzMzMzNtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXI6LW1zLWlucHV0LXBsYWNlaG9sZGVyey1tcy11c2VyLXNlbGVjdDp0ZXh0fS5tYXQtaW5wdXQtZWxlbWVudDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3RyYW5zaXRpb246Y29sb3IgNDAwbXMgMTMzLjMzMzMzMzMzMzNtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWlucHV0LWVsZW1lbnQ6LW1zLWlucHV0LXBsYWNlaG9sZGVyOi1tcy1pbnB1dC1wbGFjZWhvbGRlcnstbXMtdXNlci1zZWxlY3Q6dGV4dH0ubWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciAubWF0LWlucHV0LWVsZW1lbnQ6OnBsYWNlaG9sZGVye2NvbG9yOnRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7LXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpub25lfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIgLm1hdC1pbnB1dC1lbGVtZW50OjpwbGFjZWhvbGRlcntvcGFjaXR5OjB9Lm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIgLm1hdC1pbnB1dC1lbGVtZW50OjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7LXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpub25lfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIgLm1hdC1pbnB1dC1lbGVtZW50OjotbW96LXBsYWNlaG9sZGVye29wYWNpdHk6MH0ubWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciAubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudDstd2Via2l0LXRleHQtZmlsbC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciAubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7b3BhY2l0eTowfS5tYXQtZm9ybS1maWVsZC1oaWRlLXBsYWNlaG9sZGVyIC5tYXQtaW5wdXQtZWxlbWVudDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudDstd2Via2l0LXRleHQtZmlsbC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciAubWF0LWlucHV0LWVsZW1lbnQ6LW1zLWlucHV0LXBsYWNlaG9sZGVye29wYWNpdHk6MH10ZXh0YXJlYS5tYXQtaW5wdXQtZWxlbWVudHtyZXNpemU6dmVydGljYWw7b3ZlcmZsb3c6YXV0b310ZXh0YXJlYS5tYXQtaW5wdXQtZWxlbWVudC5jZGstdGV4dGFyZWEtYXV0b3NpemV7cmVzaXplOm5vbmV9dGV4dGFyZWEubWF0LWlucHV0LWVsZW1lbnR7cGFkZGluZzoycHggMDttYXJnaW46LTJweCAwfXNlbGVjdC5tYXQtaW5wdXQtZWxlbWVudHstbW96LWFwcGVhcmFuY2U6bm9uZTstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTtwb3NpdGlvbjpyZWxhdGl2ZTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWZsZXg7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmctdG9wOjFlbTt0b3A6LTFlbTttYXJnaW4tYm90dG9tOi0xZW19c2VsZWN0Lm1hdC1pbnB1dC1lbGVtZW50OjotbXMtZXhwYW5ke2Rpc3BsYXk6bm9uZX1zZWxlY3QubWF0LWlucHV0LWVsZW1lbnQ6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9c2VsZWN0Lm1hdC1pbnB1dC1lbGVtZW50Om5vdCg6ZGlzYWJsZWQpe2N1cnNvcjpwb2ludGVyfXNlbGVjdC5tYXQtaW5wdXQtZWxlbWVudDo6LW1zLXZhbHVle2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDpub25lfS5tYXQtZm9jdXNlZCAuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIHNlbGVjdC5tYXQtaW5wdXQtZWxlbWVudDo6LW1zLXZhbHVle2NvbG9yOmluaGVyaXR9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb250ZW50OiIiO3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyLWxlZnQ6NXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yaWdodDo1cHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXRvcDo1cHggc29saWQ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtyaWdodDowO21hcmdpbi10b3A6LTIuNXB4O3BvaW50ZXItZXZlbnRzOm5vbmV9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0IC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7cmlnaHQ6YXV0bztsZWZ0OjB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1pbnB1dC1lbGVtZW50e3BhZGRpbmctcmlnaHQ6MTVweH1bZGlyPXJ0bF0gLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1pbnB1dC1lbGVtZW50e3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MTVweH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdCAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcnttYXgtd2lkdGg6Y2FsYygxMDAlIC0gMTBweCl9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7bWFyZ2luLXRvcDotNXB4fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye21hcmdpbi10b3A6LTEwcHh9XG4nLCIubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDBweCk7LW1zLXRyYW5zZm9ybTpub25lfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbiwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb257d2lkdGg6MWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbi1idXR0b24sLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbntmb250OmluaGVyaXQ7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb257Zm9udC1zaXplOmluaGVyaXR9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7aGVpZ2h0OjFweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2hlaWdodDowO2JvcmRlci10b3A6c29saWQgMXB4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtcmlwcGxle3RvcDowO2hlaWdodDoycHg7b3ZlcmZsb3c6aGlkZGVufS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7aGVpZ2h0OjA7Ym9yZGVyLXRvcDpzb2xpZCAycHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1wb3NpdGlvbjowO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3JkZXItdG9wLXN0eWxlOmRvdHRlZDtib3JkZXItdG9wLXdpZHRoOjJweH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtaW52YWxpZDpub3QoLm1hdC1mb2N1c2VkKSAubWF0LWZvcm0tZmllbGQtcmlwcGxle2hlaWdodDoxcHh9XG4iLCIubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC13cmFwcGVye21hcmdpbjouMjVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLWZsZXh7cGFkZGluZzowIC43NWVtIDAgLjc1ZW07bWFyZ2luLXRvcDotMC4yNWVtO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLXByZWZpeCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1zdWZmaXh7dG9wOi4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmV7ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDouMjVlbTtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb2ludGVyLWV2ZW50czpub25lfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtc3RhcnQsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1lbmR7Ym9yZGVyOjFweCBzb2xpZCBjdXJyZW50Q29sb3I7bWluLXdpZHRoOjVweH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXN0YXJ0e2JvcmRlci1yYWRpdXM6NXB4IDAgMCA1cHg7Ym9yZGVyLXJpZ2h0LXN0eWxlOm5vbmV9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtc3RhcnR7Ym9yZGVyLXJpZ2h0LXN0eWxlOnNvbGlkO2JvcmRlci1sZWZ0LXN0eWxlOm5vbmU7Ym9yZGVyLXJhZGl1czowIDVweCA1cHggMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWVuZHtib3JkZXItcmFkaXVzOjAgNXB4IDVweCAwO2JvcmRlci1sZWZ0LXN0eWxlOm5vbmU7ZmxleC1ncm93OjF9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZW5ke2JvcmRlci1sZWZ0LXN0eWxlOnNvbGlkO2JvcmRlci1yaWdodC1zdHlsZTpub25lO2JvcmRlci1yYWRpdXM6NXB4IDAgMCA1cHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1nYXB7Ym9yZGVyLXJhZGl1czouMDAwMDAxcHg7Ym9yZGVyOjFweCBzb2xpZCBjdXJyZW50Q29sb3I7Ym9yZGVyLWxlZnQtc3R5bGU6bm9uZTtib3JkZXItcmlnaHQtc3R5bGU6bm9uZX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZ2Fwe2JvcmRlci10b3AtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tvcGFjaXR5OjB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1zdGFydCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWVuZCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWdhcHtib3JkZXItd2lkdGg6MnB4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5le29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgMTAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljaywubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tib3JkZXI6M3B4IGRhc2hlZH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lOm5vdCgubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQpIC5tYXQtZm9ybS1maWVsZC1mbGV4OmhvdmVyIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5le29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgNjAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZTpub3QoLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkKSAubWF0LWZvcm0tZmllbGQtZmxleDpob3ZlciAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tvcGFjaXR5OjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7cGFkZGluZzowIDFlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlOm5vdCgubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQpIC5tYXQtZm9ybS1maWVsZC1mbGV4OmhvdmVyfi5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1zdGFydCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWVuZCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWdhcHt0cmFuc2l0aW9uOm5vbmV9XG4iLCIubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWZvcm0tZmllbGQtZmxleHtwYWRkaW5nLXRvcDouNzVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2hlaWdodDoxcHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2hlaWdodDowO2JvcmRlci10b3A6c29saWQgMXB4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7Ym90dG9tOjA7aGVpZ2h0OjJweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7aGVpZ2h0OjA7Ym9yZGVyLXRvcDpzb2xpZCAycHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7Ym9yZGVyLXRvcC1zdHlsZTpkb3R0ZWQ7Ym9yZGVyLXRvcC13aWR0aDoycHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQ6bm90KC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCkgLm1hdC1mb3JtLWZpZWxkLWZsZXg6aG92ZXJ+Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSAubWF0LWZvcm0tZmllbGQtcmlwcGxle29wYWNpdHk6MTt0cmFuc2Zvcm06bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgNjAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQuX21hdC1hbmltYXRpb24tbm9vcGFibGU6bm90KC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCkgLm1hdC1mb3JtLWZpZWxkLWZsZXg6aG92ZXJ+Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSAubWF0LWZvcm0tZmllbGQtcmlwcGxle3RyYW5zaXRpb246bm9uZX1cbiJdLGVuY2Fwc3VsYXRpb246MixkYXRhOnthbmltYXRpb246W2hWLnRyYW5zaXRpb25NZXNzYWdlc119LGNoYW5nZURldGVjdGlvbjowfSksQVYuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ30se3R5cGU6VWd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltoZ119XX0se3R5cGU6SEksZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltFVl19XX0se3R5cGU6d3p9LHt0eXBlOmFffSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV0sQVYucHJvcERlY29yYXRvcnM9e2FwcGVhcmFuY2U6W3t0eXBlOnh5fV0saGlkZVJlcXVpcmVkTWFya2VyOlt7dHlwZTp4eX1dLGhpbnRMYWJlbDpbe3R5cGU6eHl9XSxmbG9hdExhYmVsOlt7dHlwZTp4eX1dLHVuZGVybGluZVJlZjpbe3R5cGU6WmEsYXJnczpbInVuZGVybGluZSJdfV0sX2Nvbm5lY3Rpb25Db250YWluZXJSZWY6W3t0eXBlOlphLGFyZ3M6WyJjb25uZWN0aW9uQ29udGFpbmVyIix7c3RhdGljOiEwfV19XSxfaW5wdXRDb250YWluZXJSZWY6W3t0eXBlOlphLGFyZ3M6WyJpbnB1dENvbnRhaW5lciJdfV0sX2xhYmVsOlt7dHlwZTpaYSxhcmdzOlsibGFiZWwiXX1dLF9jb250cm9sTm9uU3RhdGljOlt7dHlwZTpxYSxhcmdzOltiVl19XSxfY29udHJvbFN0YXRpYzpbe3R5cGU6cWEsYXJnczpbYlYse3N0YXRpYzohMH1dfV0sX2xhYmVsQ2hpbGROb25TdGF0aWM6W3t0eXBlOnFhLGFyZ3M6W3ZWXX1dLF9sYWJlbENoaWxkU3RhdGljOlt7dHlwZTpxYSxhcmdzOlt2Vix7c3RhdGljOiEwfV19XSxfcGxhY2Vob2xkZXJDaGlsZDpbe3R5cGU6cWEsYXJnczpbeFZdfV0sX2Vycm9yQ2hpbGRyZW46W3t0eXBlOllhLGFyZ3M6W2ZWLHtkZXNjZW5kYW50czohMH1dfV0sX2hpbnRDaGlsZHJlbjpbe3R5cGU6WWEsYXJnczpbQ1Yse2Rlc2NlbmRhbnRzOiEwfV19XSxfcHJlZml4Q2hpbGRyZW46W3t0eXBlOllhLGFyZ3M6W09WLHtkZXNjZW5kYW50czohMH1dfV0sX3N1ZmZpeENoaWxkcmVuOlt7dHlwZTpZYSxhcmdzOlt3Vix7ZGVzY2VuZGFudHM6ITB9XX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEFWLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC1mb3JtLWZpZWxkIixleHBvcnRBczoibWF0Rm9ybUZpZWxkIix0ZW1wbGF0ZTonPGRpdiBjbGFzcz0ibWF0LWZvcm0tZmllbGQtd3JhcHBlciI+XG4gIDxkaXYgY2xhc3M9Im1hdC1mb3JtLWZpZWxkLWZsZXgiICNjb25uZWN0aW9uQ29udGFpbmVyXG4gICAgICAgKGNsaWNrKT0iX2NvbnRyb2wub25Db250YWluZXJDbGljayAmJiBfY29udHJvbC5vbkNvbnRhaW5lckNsaWNrKCRldmVudCkiPlxuXG4gICAgXHgzYyEtLSBPdXRsaW5lIHVzZWQgZm9yIG91dGxpbmUgYXBwZWFyYW5jZS4gLS1ceDNlXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj0iYXBwZWFyYW5jZSA9PSBcJ291dGxpbmVcJyI+XG4gICAgICA8ZGl2IGNsYXNzPSJtYXQtZm9ybS1maWVsZC1vdXRsaW5lIj5cbiAgICAgICAgPGRpdiBjbGFzcz0ibWF0LWZvcm0tZmllbGQtb3V0bGluZS1zdGFydCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9Im1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZ2FwIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz0ibWF0LWZvcm0tZmllbGQtb3V0bGluZS1lbmQiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPSJtYXQtZm9ybS1maWVsZC1vdXRsaW5lIG1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2siPlxuICAgICAgICA8ZGl2IGNsYXNzPSJtYXQtZm9ybS1maWVsZC1vdXRsaW5lLXN0YXJ0Ij48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz0ibWF0LWZvcm0tZmllbGQtb3V0bGluZS1nYXAiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPSJtYXQtZm9ybS1maWVsZC1vdXRsaW5lLWVuZCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxkaXYgY2xhc3M9Im1hdC1mb3JtLWZpZWxkLXByZWZpeCIgKm5nSWY9Il9wcmVmaXhDaGlsZHJlbi5sZW5ndGgiPlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PSJbbWF0UHJlZml4XSI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz0ibWF0LWZvcm0tZmllbGQtaW5maXgiICNpbnB1dENvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cblxuICAgICAgPHNwYW4gY2xhc3M9Im1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIiPlxuICAgICAgICBceDNjIS0tIFdlIGFkZCBhcmlhLW93bnMgYXMgYSB3b3JrYXJvdW5kIGZvciBhbiBpc3N1ZSBpbiBKQVdTICYgTlZEQSB3aGVyZSB0aGUgbGFiZWwgaXNuXCd0XG4gICAgICAgICAgICAgcmVhZCBpZiBpdCBjb21lcyBiZWZvcmUgdGhlIGNvbnRyb2wgaW4gdGhlIERPTS4gLS1ceDNlXG4gICAgICAgIDxsYWJlbCBjbGFzcz0ibWF0LWZvcm0tZmllbGQtbGFiZWwiXG4gICAgICAgICAgICAgICAoY2RrT2JzZXJ2ZUNvbnRlbnQpPSJ1cGRhdGVPdXRsaW5lR2FwKCkiXG4gICAgICAgICAgICAgICBbY2RrT2JzZXJ2ZUNvbnRlbnREaXNhYmxlZF09ImFwcGVhcmFuY2UgIT0gXCdvdXRsaW5lXCciXG4gICAgICAgICAgICAgICBbaWRdPSJfbGFiZWxJZCJcbiAgICAgICAgICAgICAgIFthdHRyLmZvcl09Il9jb250cm9sLmlkIlxuICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1vd25zXT0iX2NvbnRyb2wuaWQiXG4gICAgICAgICAgICAgICBbY2xhc3MubWF0LWVtcHR5XT0iX2NvbnRyb2wuZW1wdHkgJiYgIV9zaG91bGRBbHdheXNGbG9hdCgpIlxuICAgICAgICAgICAgICAgW2NsYXNzLm1hdC1mb3JtLWZpZWxkLWVtcHR5XT0iX2NvbnRyb2wuZW1wdHkgJiYgIV9zaG91bGRBbHdheXNGbG9hdCgpIlxuICAgICAgICAgICAgICAgW2NsYXNzLm1hdC1hY2NlbnRdPSJjb2xvciA9PSBcJ2FjY2VudFwnIlxuICAgICAgICAgICAgICAgW2NsYXNzLm1hdC13YXJuXT0iY29sb3IgPT0gXCd3YXJuXCciXG4gICAgICAgICAgICAgICAjbGFiZWxcbiAgICAgICAgICAgICAgICpuZ0lmPSJfaGFzRmxvYXRpbmdMYWJlbCgpIlxuICAgICAgICAgICAgICAgW25nU3dpdGNoXT0iX2hhc0xhYmVsKCkiPlxuXG4gICAgICAgICAgXHgzYyEtLSBAYnJlYWtpbmctY2hhbmdlIDguMC4wIHJlbW92ZSBpbiBmYXZvciBvZiBtYXQtbGFiZWwgZWxlbWVudCBhbiBwbGFjZWhvbGRlciBhdHRyLiAtLVx4M2VcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9ImZhbHNlIj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD0ibWF0LXBsYWNlaG9sZGVyIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8c3Bhbj57e19jb250cm9sLnBsYWNlaG9sZGVyfX08L3NwYW4+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9Im1hdC1sYWJlbCIgKm5nU3dpdGNoQ2FzZT0idHJ1ZSI+PC9uZy1jb250ZW50PlxuXG4gICAgICAgICAgXHgzYyEtLSBAYnJlYWtpbmctY2hhbmdlIDguMC4wIHJlbW92ZSBgbWF0LXBsYWNlaG9sZGVyLXJlcXVpcmVkYCBjbGFzcyAtLVx4M2VcbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9Im1hdC1wbGFjZWhvbGRlci1yZXF1aXJlZCBtYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXIiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj0idHJ1ZSJcbiAgICAgICAgICAgICpuZ0lmPSIhaGlkZVJlcXVpcmVkTWFya2VyICYmIF9jb250cm9sLnJlcXVpcmVkICYmICFfY29udHJvbC5kaXNhYmxlZCI+JiMzMjsqPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz0ibWF0LWZvcm0tZmllbGQtc3VmZml4IiAqbmdJZj0iX3N1ZmZpeENoaWxkcmVuLmxlbmd0aCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9IlttYXRTdWZmaXhdIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIFx4M2MhLS0gVW5kZXJsaW5lIHVzZWQgZm9yIGxlZ2FjeSwgc3RhbmRhcmQsIGFuZCBib3ggYXBwZWFyYW5jZXMuIC0tXHgzZVxuICA8ZGl2IGNsYXNzPSJtYXQtZm9ybS1maWVsZC11bmRlcmxpbmUiICN1bmRlcmxpbmVcbiAgICAgICAqbmdJZj0iYXBwZWFyYW5jZSAhPSBcJ291dGxpbmVcJyI+XG4gICAgPHNwYW4gY2xhc3M9Im1hdC1mb3JtLWZpZWxkLXJpcHBsZSJcbiAgICAgICAgICBbY2xhc3MubWF0LWFjY2VudF09ImNvbG9yID09IFwnYWNjZW50XCciXG4gICAgICAgICAgW2NsYXNzLm1hdC13YXJuXT0iY29sb3IgPT0gXCd3YXJuXCciPjwvc3Bhbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz0ibWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXIiXG4gICAgICAgW25nU3dpdGNoXT0iX2dldERpc3BsYXllZE1lc3NhZ2VzKCkiPlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT0iXCdlcnJvclwnIiBbQHRyYW5zaXRpb25NZXNzYWdlc109Il9zdWJzY3JpcHRBbmltYXRpb25TdGF0ZSI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9Im1hdC1lcnJvciI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz0ibWF0LWZvcm0tZmllbGQtaGludC13cmFwcGVyIiAqbmdTd2l0Y2hDYXNlPSJcJ2hpbnRcJyJcbiAgICAgIFtAdHJhbnNpdGlvbk1lc3NhZ2VzXT0iX3N1YnNjcmlwdEFuaW1hdGlvblN0YXRlIj5cbiAgICAgIFx4M2MhLS0gVE9ETyhtbWFsZXJiYSk6IHVzZSBhbiBhY3R1YWwgPG1hdC1oaW50PiBvbmNlIGFsbCBzZWxlY3RvcnMgYXJlIHN3aXRjaGVkIHRvIG1hdC0qIC0tXHgzZVxuICAgICAgPGRpdiAqbmdJZj0iaGludExhYmVsIiBbaWRdPSJfaGludExhYmVsSWQiIGNsYXNzPSJtYXQtaGludCI+e3toaW50TGFiZWx9fTwvZGl2PlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PSJtYXQtaGludDpub3QoW2FsaWduPVwnZW5kXCddKSI+PC9uZy1jb250ZW50PlxuICAgICAgPGRpdiBjbGFzcz0ibWF0LWZvcm0tZmllbGQtaGludC1zcGFjZXIiPjwvZGl2PlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PSJtYXQtaGludFthbGlnbj1cJ2VuZFwnXSI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuJyxhbmltYXRpb25zOltoVi50cmFuc2l0aW9uTWVzc2FnZXNdLGhvc3Q6e2NsYXNzOiJtYXQtZm9ybS1maWVsZCIsIltjbGFzcy5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkXSI6J2FwcGVhcmFuY2UgPT0gInN0YW5kYXJkIicsIltjbGFzcy5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxdIjonYXBwZWFyYW5jZSA9PSAiZmlsbCInLCJbY2xhc3MubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lXSI6J2FwcGVhcmFuY2UgPT0gIm91dGxpbmUiJywiW2NsYXNzLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5XSI6J2FwcGVhcmFuY2UgPT0gImxlZ2FjeSInLCJbY2xhc3MubWF0LWZvcm0tZmllbGQtaW52YWxpZF0iOiJfY29udHJvbC5lcnJvclN0YXRlIiwiW2NsYXNzLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdF0iOiJfY2FuTGFiZWxGbG9hdCgpIiwiW2NsYXNzLm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdF0iOiJfc2hvdWxkTGFiZWxGbG9hdCgpIiwiW2NsYXNzLm1hdC1mb3JtLWZpZWxkLWhhcy1sYWJlbF0iOiJfaGFzRmxvYXRpbmdMYWJlbCgpIiwiW2NsYXNzLm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXJdIjoiX2hpZGVDb250cm9sUGxhY2Vob2xkZXIoKSIsIltjbGFzcy5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZF0iOiJfY29udHJvbC5kaXNhYmxlZCIsIltjbGFzcy5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbGVkXSI6Il9jb250cm9sLmF1dG9maWxsZWQiLCJbY2xhc3MubWF0LWZvY3VzZWRdIjoiX2NvbnRyb2wuZm9jdXNlZCIsIltjbGFzcy5uZy11bnRvdWNoZWRdIjonX3Nob3VsZEZvcndhcmQoInVudG91Y2hlZCIpJywiW2NsYXNzLm5nLXRvdWNoZWRdIjonX3Nob3VsZEZvcndhcmQoInRvdWNoZWQiKScsIltjbGFzcy5uZy1wcmlzdGluZV0iOidfc2hvdWxkRm9yd2FyZCgicHJpc3RpbmUiKScsIltjbGFzcy5uZy1kaXJ0eV0iOidfc2hvdWxkRm9yd2FyZCgiZGlydHkiKScsIltjbGFzcy5uZy12YWxpZF0iOidfc2hvdWxkRm9yd2FyZCgidmFsaWQiKScsIltjbGFzcy5uZy1pbnZhbGlkXSI6J19zaG91bGRGb3J3YXJkKCJpbnZhbGlkIiknLCJbY2xhc3MubmctcGVuZGluZ10iOidfc2hvdWxkRm9yd2FyZCgicGVuZGluZyIpJywiW2NsYXNzLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlXSI6IiFfYW5pbWF0aW9uc0VuYWJsZWQifSxpbnB1dHM6WyJjb2xvciJdLGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLHByb3ZpZGVyczpbe3Byb3ZpZGU6UlYsdXNlRXhpc3Rpbmc6QVZ9XSxzdHlsZXM6WyIubWF0LWZvcm0tZmllbGR7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246cmVsYXRpdmU7dGV4dC1hbGlnbjpsZWZ0fVtkaXI9cnRsXSAubWF0LWZvcm0tZmllbGR7dGV4dC1hbGlnbjpyaWdodH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcntwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWZvcm0tZmllbGQtZmxleHtkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmJhc2VsaW5lO2JveC1zaXppbmc6Ym9yZGVyLWJveDt3aWR0aDoxMDAlfS5tYXQtZm9ybS1maWVsZC1wcmVmaXgsLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeHt3aGl0ZS1zcGFjZTpub3dyYXA7ZmxleDpub25lO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtZm9ybS1maWVsZC1pbmZpeHtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXg6YXV0bzttaW4td2lkdGg6MDt3aWR0aDoxODBweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1pbmZpeHtib3JkZXItaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRyYW5zcGFyZW50LCB0cmFuc3BhcmVudCl9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJ7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO2JveC1zaXppbmc6Y29udGVudC1ib3g7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvdmVyZmxvdzpoaWRkZW47cG9pbnRlci1ldmVudHM6bm9uZX1bZGlyPXJ0bF0gLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJ7bGVmdDphdXRvO3JpZ2h0OjB9Lm1hdC1mb3JtLWZpZWxkLWxhYmVse3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDtmb250OmluaGVyaXQ7cG9pbnRlci1ldmVudHM6bm9uZTt3aWR0aDoxMDAlO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO292ZXJmbG93OmhpZGRlbjt0cmFuc2Zvcm0tb3JpZ2luOjAgMDt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxjb2xvciA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSx3aWR0aCA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtkaXNwbGF5Om5vbmV9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMDtsZWZ0OmF1dG87cmlnaHQ6MH0ubWF0LWZvcm0tZmllbGQtZW1wdHkubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2Rpc3BsYXk6YmxvY2t9Lm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbCsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7ZGlzcGxheTpub25lfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbCsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7ZGlzcGxheTpibG9jazt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtaW5wdXQtc2VydmVyW3BsYWNlaG9sZGVyXTpub3QoOnBsYWNlaG9sZGVyLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7ZGlzcGxheTpub25lfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbcGxhY2Vob2xkZXJdOm5vdCg6cGxhY2Vob2xkZXItc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHtkaXNwbGF5OmJsb2NrfS5tYXQtZm9ybS1maWVsZC1sYWJlbDpub3QoLm1hdC1mb3JtLWZpZWxkLWVtcHR5KXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNmb3JtOnNjYWxlM2QoMSwgMS4wMDAxLCAxKX0ubWF0LWZvcm0tZmllbGQtcmlwcGxle3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt3aWR0aDoxMDAlO3RyYW5zZm9ybS1vcmlnaW46NTAlO3RyYW5zZm9ybTpzY2FsZVgoMC41KTtvcGFjaXR5OjA7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDMwMG1zIGN1YmljLWJlemllcigwLjU1LCAwLCAwLjU1LCAwLjIpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7b3BhY2l0eToxO3RyYW5zZm9ybTpub25lO3RyYW5zaXRpb246dHJhbnNmb3JtIDMwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLG9wYWNpdHkgMTAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYmFja2dyb3VuZC1jb2xvciAzMDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7cG9zaXRpb246YWJzb2x1dGU7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjEwMCU7b3ZlcmZsb3c6aGlkZGVufS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlciAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1pY29ue3dpZHRoOjFlbTtoZWlnaHQ6MWVtO2ZvbnQtc2l6ZTppbmhlcml0O3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfS5tYXQtZm9ybS1maWVsZC1oaW50LXdyYXBwZXJ7ZGlzcGxheTpmbGV4fS5tYXQtZm9ybS1maWVsZC1oaW50LXNwYWNlcntmbGV4OjEgMCAxZW19Lm1hdC1lcnJvcntkaXNwbGF5OmJsb2NrfS5tYXQtZm9ybS1maWVsZC1jb250cm9sLXdyYXBwZXJ7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1mb3JtLWZpZWxkLWhpbnQtZW5ke29yZGVyOjF9Lm1hdC1mb3JtLWZpZWxkLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXt0cmFuc2l0aW9uOm5vbmV9XG4iLCcubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1mbGV4e2JvcmRlci1yYWRpdXM6NHB4IDRweCAwIDA7cGFkZGluZzouNzVlbSAuNzVlbSAwIC43NWVtfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtZmxleHtvdXRsaW5lOnNvbGlkIDFweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWZsZXh7b3V0bGluZTpkYXNoZWQgM3B4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZTo6YmVmb3Jle2NvbnRlbnQ6IiI7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MDtoZWlnaHQ6MXB4O3dpZHRoOjEwMCV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtcmlwcGxle2JvdHRvbTowO2hlaWdodDoycHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7aGVpZ2h0OjB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbDpub3QoLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkKSAubWF0LWZvcm0tZmllbGQtZmxleDpob3Zlcn4ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7b3BhY2l0eToxO3RyYW5zZm9ybTpub25lO3RyYW5zaXRpb246b3BhY2l0eSA2MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlOm5vdCgubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQpIC5tYXQtZm9ybS1maWVsZC1mbGV4OmhvdmVyfi5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7cGFkZGluZzowIDFlbX1cbicsJy5tYXQtaW5wdXQtZWxlbWVudHtmb250OmluaGVyaXQ7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjpjdXJyZW50Q29sb3I7Ym9yZGVyOm5vbmU7b3V0bGluZTpub25lO3BhZGRpbmc6MDttYXJnaW46MDt3aWR0aDoxMDAlO21heC13aWR0aDoxMDAlO3ZlcnRpY2FsLWFsaWduOmJvdHRvbTt0ZXh0LWFsaWduOmluaGVyaXQ7Ym94LXNpemluZzpjb250ZW50LWJveH0ubWF0LWlucHV0LWVsZW1lbnQ6LW1vei11aS1pbnZhbGlke2JveC1zaGFkb3c6bm9uZX0ubWF0LWlucHV0LWVsZW1lbnQ6Oi1tcy1jbGVhciwubWF0LWlucHV0LWVsZW1lbnQ6Oi1tcy1yZXZlYWx7ZGlzcGxheTpub25lfS5tYXQtaW5wdXQtZWxlbWVudCwubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtc2VhcmNoLWNhbmNlbC1idXR0b24sLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uLC5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1zZWFyY2gtcmVzdWx0cy1idXR0b24sLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LXNlYXJjaC1yZXN1bHRzLWRlY29yYXRpb257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmV9Lm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWNvbnRhY3RzLWF1dG8tZmlsbC1idXR0b24sLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWNhcHMtbG9jay1pbmRpY2F0b3IsLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWNyZWRlbnRpYWxzLWF1dG8tZmlsbC1idXR0b257dmlzaWJpbGl0eTpoaWRkZW59Lm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9ZGF0ZV0sLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9ZGF0ZXRpbWVdLC5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPWRhdGV0aW1lLWxvY2FsXSwubWF0LWlucHV0LWVsZW1lbnRbdHlwZT1tb250aF0sLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9d2Vla10sLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9dGltZV17bGluZS1oZWlnaHQ6MX0ubWF0LWlucHV0LWVsZW1lbnRbdHlwZT1kYXRlXTo6YWZ0ZXIsLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9ZGF0ZXRpbWVdOjphZnRlciwubWF0LWlucHV0LWVsZW1lbnRbdHlwZT1kYXRldGltZS1sb2NhbF06OmFmdGVyLC5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPW1vbnRoXTo6YWZ0ZXIsLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9d2Vla106OmFmdGVyLC5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPXRpbWVdOjphZnRlcntjb250ZW50OiIgIjt3aGl0ZS1zcGFjZTpwcmU7d2lkdGg6MXB4fS5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiwubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvciwubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtY2xlYXItYnV0dG9ue2ZvbnQtc2l6ZTouNzVlbX0ubWF0LWlucHV0LWVsZW1lbnQ6OnBsYWNlaG9sZGVyey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt0cmFuc2l0aW9uOmNvbG9yIDQwMG1zIDEzMy4zMzMzMzMzMzMzbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1pbnB1dC1lbGVtZW50OjpwbGFjZWhvbGRlcjotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7LW1zLXVzZXItc2VsZWN0OnRleHR9Lm1hdC1pbnB1dC1lbGVtZW50OjotbW96LXBsYWNlaG9sZGVyey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt0cmFuc2l0aW9uOmNvbG9yIDQwMG1zIDEzMy4zMzMzMzMzMzMzbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1pbnB1dC1lbGVtZW50OjotbW96LXBsYWNlaG9sZGVyOi1tcy1pbnB1dC1wbGFjZWhvbGRlcnstbXMtdXNlci1zZWxlY3Q6dGV4dH0ubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3RyYW5zaXRpb246Y29sb3IgNDAwbXMgMTMzLjMzMzMzMzMzMzNtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXI6LW1zLWlucHV0LXBsYWNlaG9sZGVyey1tcy11c2VyLXNlbGVjdDp0ZXh0fS5tYXQtaW5wdXQtZWxlbWVudDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3RyYW5zaXRpb246Y29sb3IgNDAwbXMgMTMzLjMzMzMzMzMzMzNtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWlucHV0LWVsZW1lbnQ6LW1zLWlucHV0LXBsYWNlaG9sZGVyOi1tcy1pbnB1dC1wbGFjZWhvbGRlcnstbXMtdXNlci1zZWxlY3Q6dGV4dH0ubWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciAubWF0LWlucHV0LWVsZW1lbnQ6OnBsYWNlaG9sZGVye2NvbG9yOnRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7LXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpub25lfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIgLm1hdC1pbnB1dC1lbGVtZW50OjpwbGFjZWhvbGRlcntvcGFjaXR5OjB9Lm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIgLm1hdC1pbnB1dC1lbGVtZW50OjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7LXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpub25lfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIgLm1hdC1pbnB1dC1lbGVtZW50OjotbW96LXBsYWNlaG9sZGVye29wYWNpdHk6MH0ubWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciAubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudDstd2Via2l0LXRleHQtZmlsbC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciAubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7b3BhY2l0eTowfS5tYXQtZm9ybS1maWVsZC1oaWRlLXBsYWNlaG9sZGVyIC5tYXQtaW5wdXQtZWxlbWVudDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudDstd2Via2l0LXRleHQtZmlsbC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciAubWF0LWlucHV0LWVsZW1lbnQ6LW1zLWlucHV0LXBsYWNlaG9sZGVye29wYWNpdHk6MH10ZXh0YXJlYS5tYXQtaW5wdXQtZWxlbWVudHtyZXNpemU6dmVydGljYWw7b3ZlcmZsb3c6YXV0b310ZXh0YXJlYS5tYXQtaW5wdXQtZWxlbWVudC5jZGstdGV4dGFyZWEtYXV0b3NpemV7cmVzaXplOm5vbmV9dGV4dGFyZWEubWF0LWlucHV0LWVsZW1lbnR7cGFkZGluZzoycHggMDttYXJnaW46LTJweCAwfXNlbGVjdC5tYXQtaW5wdXQtZWxlbWVudHstbW96LWFwcGVhcmFuY2U6bm9uZTstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTtwb3NpdGlvbjpyZWxhdGl2ZTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWZsZXg7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmctdG9wOjFlbTt0b3A6LTFlbTttYXJnaW4tYm90dG9tOi0xZW19c2VsZWN0Lm1hdC1pbnB1dC1lbGVtZW50OjotbXMtZXhwYW5ke2Rpc3BsYXk6bm9uZX1zZWxlY3QubWF0LWlucHV0LWVsZW1lbnQ6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9c2VsZWN0Lm1hdC1pbnB1dC1lbGVtZW50Om5vdCg6ZGlzYWJsZWQpe2N1cnNvcjpwb2ludGVyfXNlbGVjdC5tYXQtaW5wdXQtZWxlbWVudDo6LW1zLXZhbHVle2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDpub25lfS5tYXQtZm9jdXNlZCAuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIHNlbGVjdC5tYXQtaW5wdXQtZWxlbWVudDo6LW1zLXZhbHVle2NvbG9yOmluaGVyaXR9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb250ZW50OiIiO3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyLWxlZnQ6NXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yaWdodDo1cHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXRvcDo1cHggc29saWQ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtyaWdodDowO21hcmdpbi10b3A6LTIuNXB4O3BvaW50ZXItZXZlbnRzOm5vbmV9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0IC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7cmlnaHQ6YXV0bztsZWZ0OjB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1pbnB1dC1lbGVtZW50e3BhZGRpbmctcmlnaHQ6MTVweH1bZGlyPXJ0bF0gLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1pbnB1dC1lbGVtZW50e3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MTVweH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdCAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcnttYXgtd2lkdGg6Y2FsYygxMDAlIC0gMTBweCl9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7bWFyZ2luLXRvcDotNXB4fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye21hcmdpbi10b3A6LTEwcHh9XG4nLCIubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDBweCk7LW1zLXRyYW5zZm9ybTpub25lfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbiwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb257d2lkdGg6MWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbi1idXR0b24sLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbntmb250OmluaGVyaXQ7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb257Zm9udC1zaXplOmluaGVyaXR9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7aGVpZ2h0OjFweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2hlaWdodDowO2JvcmRlci10b3A6c29saWQgMXB4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtcmlwcGxle3RvcDowO2hlaWdodDoycHg7b3ZlcmZsb3c6aGlkZGVufS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7aGVpZ2h0OjA7Ym9yZGVyLXRvcDpzb2xpZCAycHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1wb3NpdGlvbjowO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3JkZXItdG9wLXN0eWxlOmRvdHRlZDtib3JkZXItdG9wLXdpZHRoOjJweH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtaW52YWxpZDpub3QoLm1hdC1mb2N1c2VkKSAubWF0LWZvcm0tZmllbGQtcmlwcGxle2hlaWdodDoxcHh9XG4iLCIubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC13cmFwcGVye21hcmdpbjouMjVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLWZsZXh7cGFkZGluZzowIC43NWVtIDAgLjc1ZW07bWFyZ2luLXRvcDotMC4yNWVtO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLXByZWZpeCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1zdWZmaXh7dG9wOi4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmV7ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDouMjVlbTtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb2ludGVyLWV2ZW50czpub25lfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtc3RhcnQsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1lbmR7Ym9yZGVyOjFweCBzb2xpZCBjdXJyZW50Q29sb3I7bWluLXdpZHRoOjVweH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXN0YXJ0e2JvcmRlci1yYWRpdXM6NXB4IDAgMCA1cHg7Ym9yZGVyLXJpZ2h0LXN0eWxlOm5vbmV9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtc3RhcnR7Ym9yZGVyLXJpZ2h0LXN0eWxlOnNvbGlkO2JvcmRlci1sZWZ0LXN0eWxlOm5vbmU7Ym9yZGVyLXJhZGl1czowIDVweCA1cHggMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWVuZHtib3JkZXItcmFkaXVzOjAgNXB4IDVweCAwO2JvcmRlci1sZWZ0LXN0eWxlOm5vbmU7ZmxleC1ncm93OjF9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZW5ke2JvcmRlci1sZWZ0LXN0eWxlOnNvbGlkO2JvcmRlci1yaWdodC1zdHlsZTpub25lO2JvcmRlci1yYWRpdXM6NXB4IDAgMCA1cHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1nYXB7Ym9yZGVyLXJhZGl1czouMDAwMDAxcHg7Ym9yZGVyOjFweCBzb2xpZCBjdXJyZW50Q29sb3I7Ym9yZGVyLWxlZnQtc3R5bGU6bm9uZTtib3JkZXItcmlnaHQtc3R5bGU6bm9uZX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZ2Fwe2JvcmRlci10b3AtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tvcGFjaXR5OjB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1zdGFydCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWVuZCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWdhcHtib3JkZXItd2lkdGg6MnB4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5le29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgMTAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljaywubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tib3JkZXI6M3B4IGRhc2hlZH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lOm5vdCgubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQpIC5tYXQtZm9ybS1maWVsZC1mbGV4OmhvdmVyIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5le29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgNjAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZTpub3QoLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkKSAubWF0LWZvcm0tZmllbGQtZmxleDpob3ZlciAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tvcGFjaXR5OjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7cGFkZGluZzowIDFlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlOm5vdCgubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQpIC5tYXQtZm9ybS1maWVsZC1mbGV4OmhvdmVyfi5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1zdGFydCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWVuZCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWdhcHt0cmFuc2l0aW9uOm5vbmV9XG4iLCIubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWZvcm0tZmllbGQtZmxleHtwYWRkaW5nLXRvcDouNzVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2hlaWdodDoxcHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2hlaWdodDowO2JvcmRlci10b3A6c29saWQgMXB4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7Ym90dG9tOjA7aGVpZ2h0OjJweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7aGVpZ2h0OjA7Ym9yZGVyLXRvcDpzb2xpZCAycHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7Ym9yZGVyLXRvcC1zdHlsZTpkb3R0ZWQ7Ym9yZGVyLXRvcC13aWR0aDoycHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQ6bm90KC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCkgLm1hdC1mb3JtLWZpZWxkLWZsZXg6aG92ZXJ+Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSAubWF0LWZvcm0tZmllbGQtcmlwcGxle29wYWNpdHk6MTt0cmFuc2Zvcm06bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgNjAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQuX21hdC1hbmltYXRpb24tbm9vcGFibGU6bm90KC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCkgLm1hdC1mb3JtLWZpZWxkLWZsZXg6aG92ZXJ+Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSAubWF0LWZvcm0tZmllbGQtcmlwcGxle3RyYW5zaXRpb246bm9uZX1cbiJdfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOlVnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbaGddfV19LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbRVZdfV19LHt0eXBlOnd6fSx7dHlwZTphX30se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dfSkse2Zsb2F0TGFiZWw6W3t0eXBlOnh5fV0sYXBwZWFyYW5jZTpbe3R5cGU6eHl9XSxoaWRlUmVxdWlyZWRNYXJrZXI6W3t0eXBlOnh5fV0saGludExhYmVsOlt7dHlwZTp4eX1dLHVuZGVybGluZVJlZjpbe3R5cGU6WmEsYXJnczpbInVuZGVybGluZSJdfV0sX2Nvbm5lY3Rpb25Db250YWluZXJSZWY6W3t0eXBlOlphLGFyZ3M6WyJjb25uZWN0aW9uQ29udGFpbmVyIix7c3RhdGljOiEwfV19XSxfaW5wdXRDb250YWluZXJSZWY6W3t0eXBlOlphLGFyZ3M6WyJpbnB1dENvbnRhaW5lciJdfV0sX2xhYmVsOlt7dHlwZTpaYSxhcmdzOlsibGFiZWwiXX1dLF9jb250cm9sTm9uU3RhdGljOlt7dHlwZTpxYSxhcmdzOltiVl19XSxfY29udHJvbFN0YXRpYzpbe3R5cGU6cWEsYXJnczpbYlYse3N0YXRpYzohMH1dfV0sX2xhYmVsQ2hpbGROb25TdGF0aWM6W3t0eXBlOnFhLGFyZ3M6W3ZWXX1dLF9sYWJlbENoaWxkU3RhdGljOlt7dHlwZTpxYSxhcmdzOlt2Vix7c3RhdGljOiEwfV19XSxfcGxhY2Vob2xkZXJDaGlsZDpbe3R5cGU6cWEsYXJnczpbeFZdfV0sX2Vycm9yQ2hpbGRyZW46W3t0eXBlOllhLGFyZ3M6W2ZWLHtkZXNjZW5kYW50czohMH1dfV0sX2hpbnRDaGlsZHJlbjpbe3R5cGU6WWEsYXJnczpbQ1Yse2Rlc2NlbmRhbnRzOiEwfV19XSxfcHJlZml4Q2hpbGRyZW46W3t0eXBlOllhLGFyZ3M6W09WLHtkZXNjZW5kYW50czohMH1dfV0sX3N1ZmZpeENoaWxkcmVuOlt7dHlwZTpZYSxhcmdzOlt3Vix7ZGVzY2VuZGFudHM6ITB9XX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBUVnt9VFYuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFRWKX0sVFYuybVtb2Q9YW8oe3R5cGU6VFZ9KSxUVi7JtWluaj12bih7aW1wb3J0czpbW1dNLFhJLFV6XSxYSV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFRWLFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltnVixBVixNVix2Vix4VixQVixrVl0saW1wb3J0czpbV00sWEksVXpdLGV4cG9ydHM6W1hJLGdWLEFWLE1WLHZWLHhWLFBWLGtWXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFRWLHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bZ1YsQVYsTVYsdlYseFYsUFYsa1ZdfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1dNLFhJLFV6XX0sZXhwb3J0czpmdW5jdGlvbigpe3JldHVybltYSSxnVixBVixNVix2Vix4VixQVixrVl19fSk7Ci8qKgogICAgICogQGxpY2Vuc2UgQW5ndWxhciB2MTIuMi4xCiAgICAgKiAoYykgMjAxMC0yMDIxIEdvb2dsZSBMTEMuIGh0dHBzOi8vYW5ndWxhci5pby8KICAgICAqIExpY2Vuc2U6IE1JVAogICAgICovCmNsYXNzIE5We2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fcmVuZGVyZXI9dCx0aGlzLl9lbGVtZW50UmVmPWUsdGhpcy5vbkNoYW5nZT10PT57fSx0aGlzLm9uVG91Y2hlZD0oKT0+e319c2V0UHJvcGVydHkodCxlKXt0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsdCxlKX1yZWdpc3Rlck9uVG91Y2hlZCh0KXt0aGlzLm9uVG91Y2hlZD10fXJlZ2lzdGVyT25DaGFuZ2UodCl7dGhpcy5vbkNoYW5nZT10fXNldERpc2FibGVkU3RhdGUodCl7dGhpcy5zZXRQcm9wZXJ0eSgiZGlzYWJsZWQiLHQpfX1OVi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8TlYpKFNtKENnKSxTbShoZykpfSxOVi7JtWRpcj1sbyh7dHlwZTpOVn0pLE5WLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6Q2d9LHt0eXBlOmhnfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChOVixbe3R5cGU6Q3l9XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6Q2d9LHt0eXBlOmhnfV19KSxudWxsKTtjbGFzcyB6ViBleHRlbmRzIE5We316Vi7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoelYpKSkobnx8elYpfX0pKCkselYuybVkaXI9bG8oe3R5cGU6elYsZmVhdHVyZXM6W3hwXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoelYsW3t0eXBlOkN5fV0sbnVsbCxudWxsKTtjb25zdCBJVj1uZXcgR2EoIk5nVmFsdWVBY2Nlc3NvciIpLEhWPXtwcm92aWRlOklWLHVzZUV4aXN0aW5nOnFlKCgoKT0+RlYpKSxtdWx0aTohMH07Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIEZWIGV4dGVuZHMgelZ7d3JpdGVWYWx1ZSh0KXt0aGlzLnNldFByb3BlcnR5KCJjaGVja2VkIix0KX19RlYuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKEZWKSkpKG58fEZWKX19KSgpLEZWLsm1ZGlyPWxvKHt0eXBlOkZWLHNlbGVjdG9yczpbWyJpbnB1dCIsInR5cGUiLCJjaGVja2JveCIsImZvcm1Db250cm9sTmFtZSIsIiJdLFsiaW5wdXQiLCJ0eXBlIiwiY2hlY2tib3giLCJmb3JtQ29udHJvbCIsIiJdLFsiaW5wdXQiLCJ0eXBlIiwiY2hlY2tib3giLCJuZ01vZGVsIiwiIl1dLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgiY2hhbmdlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vbkNoYW5nZShlLnRhcmdldC5jaGVja2VkKX0pKSgiYmx1ciIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblRvdWNoZWQoKX0pKX0sZmVhdHVyZXM6W3BnKFtIVl0pLHhwXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRlYsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiaW5wdXRbdHlwZT1jaGVja2JveF1bZm9ybUNvbnRyb2xOYW1lXSxpbnB1dFt0eXBlPWNoZWNrYm94XVtmb3JtQ29udHJvbF0saW5wdXRbdHlwZT1jaGVja2JveF1bbmdNb2RlbF0iLGhvc3Q6eyIoY2hhbmdlKSI6Im9uQ2hhbmdlKCRldmVudC50YXJnZXQuY2hlY2tlZCkiLCIoYmx1cikiOiJvblRvdWNoZWQoKSJ9LHByb3ZpZGVyczpbSFZdfV19XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgTFY9e3Byb3ZpZGU6SVYsdXNlRXhpc3Rpbmc6cWUoKCgpPT5WVikpLG11bHRpOiEwfSxCVj1uZXcgR2EoIkNvbXBvc2l0aW9uRXZlbnRNb2RlIik7Y2xhc3MgVlYgZXh0ZW5kcyBOVntjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodCxlKSx0aGlzLl9jb21wb3NpdGlvbk1vZGU9bix0aGlzLl9jb21wb3Npbmc9ITEsbnVsbD09dGhpcy5fY29tcG9zaXRpb25Nb2RlJiYodGhpcy5fY29tcG9zaXRpb25Nb2RlPSEoZnVuY3Rpb24gbygpe2NvbnN0IHQ9cV8oKT9xXygpLmdldFVzZXJBZ2VudCgpOiIiO3JldHVybi9hbmRyb2lkIChcZCspLy50ZXN0KHQudG9Mb3dlckNhc2UoKSl9KSgpKX13cml0ZVZhbHVlKHQpe3RoaXMuc2V0UHJvcGVydHkoInZhbHVlIixudWxsPT10PyIiOnQpfV9oYW5kbGVJbnB1dCh0KXsoIXRoaXMuX2NvbXBvc2l0aW9uTW9kZXx8dGhpcy5fY29tcG9zaXRpb25Nb2RlJiYhdGhpcy5fY29tcG9zaW5nKSYmdGhpcy5vbkNoYW5nZSh0KX1fY29tcG9zaXRpb25TdGFydCgpe3RoaXMuX2NvbXBvc2luZz0hMH1fY29tcG9zaXRpb25FbmQodCl7dGhpcy5fY29tcG9zaW5nPSExLHRoaXMuX2NvbXBvc2l0aW9uTW9kZSYmdGhpcy5vbkNoYW5nZSh0KX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBqVih0KXtyZXR1cm4gbnVsbD09dHx8MD09PXQubGVuZ3RofWZ1bmN0aW9uIFVWKHQpe3JldHVybiBudWxsIT10JiYibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RofVZWLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxWVikoU20oQ2cpLFNtKGhnKSxTbShCViw4KSl9LFZWLsm1ZGlyPWxvKHt0eXBlOlZWLHNlbGVjdG9yczpbWyJpbnB1dCIsImZvcm1Db250cm9sTmFtZSIsIiIsMywidHlwZSIsImNoZWNrYm94Il0sWyJ0ZXh0YXJlYSIsImZvcm1Db250cm9sTmFtZSIsIiJdLFsiaW5wdXQiLCJmb3JtQ29udHJvbCIsIiIsMywidHlwZSIsImNoZWNrYm94Il0sWyJ0ZXh0YXJlYSIsImZvcm1Db250cm9sIiwiIl0sWyJpbnB1dCIsIm5nTW9kZWwiLCIiLDMsInR5cGUiLCJjaGVja2JveCJdLFsidGV4dGFyZWEiLCJuZ01vZGVsIiwiIl0sWyIiLCJuZ0RlZmF1bHRDb250cm9sIiwiIl1dLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgiaW5wdXQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9oYW5kbGVJbnB1dChlLnRhcmdldC52YWx1ZSl9KSkoImJsdXIiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25Ub3VjaGVkKCl9KSkoImNvbXBvc2l0aW9uc3RhcnQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX2NvbXBvc2l0aW9uU3RhcnQoKX0pKSgiY29tcG9zaXRpb25lbmQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9jb21wb3NpdGlvbkVuZChlLnRhcmdldC52YWx1ZSl9KSl9LGZlYXR1cmVzOltwZyhbTFZdKSx4cF19KSxWVi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOkNnfSx7dHlwZTpoZ30se3R5cGU6Qm9vbGVhbixkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbQlZdfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFZWLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6ImlucHV0Om5vdChbdHlwZT1jaGVja2JveF0pW2Zvcm1Db250cm9sTmFtZV0sdGV4dGFyZWFbZm9ybUNvbnRyb2xOYW1lXSxpbnB1dDpub3QoW3R5cGU9Y2hlY2tib3hdKVtmb3JtQ29udHJvbF0sdGV4dGFyZWFbZm9ybUNvbnRyb2xdLGlucHV0Om5vdChbdHlwZT1jaGVja2JveF0pW25nTW9kZWxdLHRleHRhcmVhW25nTW9kZWxdLFtuZ0RlZmF1bHRDb250cm9sXSIsaG9zdDp7IihpbnB1dCkiOiIkYW55KHRoaXMpLl9oYW5kbGVJbnB1dCgkZXZlbnQudGFyZ2V0LnZhbHVlKSIsIihibHVyKSI6Im9uVG91Y2hlZCgpIiwiKGNvbXBvc2l0aW9uc3RhcnQpIjoiJGFueSh0aGlzKS5fY29tcG9zaXRpb25TdGFydCgpIiwiKGNvbXBvc2l0aW9uZW5kKSI6IiRhbnkodGhpcykuX2NvbXBvc2l0aW9uRW5kKCRldmVudC50YXJnZXQudmFsdWUpIn0scHJvdmlkZXJzOltMVl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpDZ30se3R5cGU6aGd9LHt0eXBlOkJvb2xlYW4sZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W0JWXX1dfV19KSxudWxsKTtjb25zdCBHVj1uZXcgR2EoIk5nVmFsaWRhdG9ycyIpLFdWPW5ldyBHYSgiTmdBc3luY1ZhbGlkYXRvcnMiKSxZVj0vXig/PS57MSwyNTR9JCkoPz0uezEsNjR9QClbYS16QS1aMC05ISMkJSYnKisvPT9eX2B7fH1+LV0rKD86XC5bYS16QS1aMC05ISMkJSYnKisvPT9eX2B7fH1+LV0rKSpAW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKiQvO2NsYXNzIHFWe3N0YXRpYyBtaW4odCl7cmV0dXJuIFpWKHQpfXN0YXRpYyBtYXgodCl7cmV0dXJuIFhWKHQpfXN0YXRpYyByZXF1aXJlZCh0KXtyZXR1cm4gS1YodCl9c3RhdGljIHJlcXVpcmVkVHJ1ZSh0KXtyZXR1cm4gSlYodCl9c3RhdGljIGVtYWlsKHQpe3JldHVybiBRVih0KX1zdGF0aWMgbWluTGVuZ3RoKHQpe3JldHVybiAkVih0KX1zdGF0aWMgbWF4TGVuZ3RoKHQpe3JldHVybiB0aih0KX1zdGF0aWMgcGF0dGVybih0KXtyZXR1cm4gZWoodCl9c3RhdGljIG51bGxWYWxpZGF0b3IodCl7cmV0dXJuIG51bGx9c3RhdGljIGNvbXBvc2UodCl7cmV0dXJuIGxqKHQpfXN0YXRpYyBjb21wb3NlQXN5bmModCl7cmV0dXJuIGRqKHQpfX1mdW5jdGlvbiBaVih0KXtyZXR1cm4gZT0+e2lmKGpWKGUudmFsdWUpfHxqVih0KSlyZXR1cm4gbnVsbDtjb25zdCBuPXBhcnNlRmxvYXQoZS52YWx1ZSk7cmV0dXJuIWlzTmFOKG4pJiZuPHQ/e21pbjp7bWluOnQsYWN0dWFsOmUudmFsdWV9fTpudWxsfX1mdW5jdGlvbiBYVih0KXtyZXR1cm4gZT0+e2lmKGpWKGUudmFsdWUpfHxqVih0KSlyZXR1cm4gbnVsbDtjb25zdCBuPXBhcnNlRmxvYXQoZS52YWx1ZSk7cmV0dXJuIWlzTmFOKG4pJiZuPnQ/e21heDp7bWF4OnQsYWN0dWFsOmUudmFsdWV9fTpudWxsfX1mdW5jdGlvbiBLVih0KXtyZXR1cm4galYodC52YWx1ZSk/e3JlcXVpcmVkOiEwfTpudWxsfWZ1bmN0aW9uIEpWKHQpe3JldHVybiEwPT09dC52YWx1ZT9udWxsOntyZXF1aXJlZDohMH19ZnVuY3Rpb24gUVYodCl7cmV0dXJuIGpWKHQudmFsdWUpfHxZVi50ZXN0KHQudmFsdWUpP251bGw6e2VtYWlsOiEwfX1mdW5jdGlvbiAkVih0KXtyZXR1cm4gZT0+alYoZS52YWx1ZSl8fCFVVihlLnZhbHVlKT9udWxsOmUudmFsdWUubGVuZ3RoPHQ/e21pbmxlbmd0aDp7cmVxdWlyZWRMZW5ndGg6dCxhY3R1YWxMZW5ndGg6ZS52YWx1ZS5sZW5ndGh9fTpudWxsfWZ1bmN0aW9uIHRqKHQpe3JldHVybiBlPT5VVihlLnZhbHVlKSYmZS52YWx1ZS5sZW5ndGg+dD97bWF4bGVuZ3RoOntyZXF1aXJlZExlbmd0aDp0LGFjdHVhbExlbmd0aDplLnZhbHVlLmxlbmd0aH19Om51bGx9ZnVuY3Rpb24gZWoodCl7aWYoIXQpcmV0dXJuIG5qO2xldCBlLG47cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0PyhuPSIiLCJeIiE9PXQuY2hhckF0KDApJiYobis9Il4iKSxuKz10LCIkIiE9PXQuY2hhckF0KHQubGVuZ3RoLTEpJiYobis9IiQiKSxlPW5ldyBSZWdFeHAobikpOihuPXQudG9TdHJpbmcoKSxlPXQpLHQ9PntpZihqVih0LnZhbHVlKSlyZXR1cm4gbnVsbDtjb25zdCBvPXQudmFsdWU7cmV0dXJuIGUudGVzdChvKT9udWxsOntwYXR0ZXJuOntyZXF1aXJlZFBhdHRlcm46bixhY3R1YWxWYWx1ZTpvfX19fWZ1bmN0aW9uIG5qKHQpe3JldHVybiBudWxsfWZ1bmN0aW9uIG9qKHQpe3JldHVybiBudWxsIT10fWZ1bmN0aW9uIGlqKHQpe2NvbnN0IGU9Rm0odCk/Q3QodCk6dDtpZighQm0oZSkmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSl0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIHZhbGlkYXRvciB0byByZXR1cm4gUHJvbWlzZSBvciBPYnNlcnZhYmxlLiIpO3JldHVybiBlfWZ1bmN0aW9uIGFqKHQpe2xldCBlPXt9O3JldHVybiB0LmZvckVhY2goKHQ9PntlPW51bGwhPXQ/T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHQpOmV9KSksMD09PU9iamVjdC5rZXlzKGUpLmxlbmd0aD9udWxsOmV9ZnVuY3Rpb24gcmoodCxlKXtyZXR1cm4gZS5tYXAoKGU9PmUodCkpKX1mdW5jdGlvbiBzaih0KXtyZXR1cm4gdC5tYXAoKHQ9PihmdW5jdGlvbiBlKHQpe3JldHVybiF0LnZhbGlkYXRlfSkodCk/dDplPT50LnZhbGlkYXRlKGUpKSl9ZnVuY3Rpb24gbGoodCl7aWYoIXQpcmV0dXJuIG51bGw7Y29uc3QgZT10LmZpbHRlcihvaik7cmV0dXJuIDA9PWUubGVuZ3RoP251bGw6ZnVuY3Rpb24odCl7cmV0dXJuIGFqKHJqKHQsZSkpfX1mdW5jdGlvbiBjaih0KXtyZXR1cm4gbnVsbCE9dD9saihzaih0KSk6bnVsbH1mdW5jdGlvbiBkaih0KXtpZighdClyZXR1cm4gbnVsbDtjb25zdCBlPXQuZmlsdGVyKG9qKTtyZXR1cm4gMD09ZS5sZW5ndGg/bnVsbDpmdW5jdGlvbih0KXtyZXR1cm4gJHQocmoodCxlKS5tYXAoaWopKS5waXBlKEl0KGFqKSl9fWZ1bmN0aW9uIHBqKHQpe3JldHVybiBudWxsIT10P2RqKHNqKHQpKTpudWxsfWZ1bmN0aW9uIG1qKHQsZSl7cmV0dXJuIG51bGw9PT10P1tlXTpBcnJheS5pc0FycmF5KHQpP1suLi50LGVdOlt0LGVdfWZ1bmN0aW9uIHVqKHQpe3JldHVybiB0Ll9yYXdWYWxpZGF0b3JzfWZ1bmN0aW9uIGZqKHQpe3JldHVybiB0Ll9yYXdBc3luY1ZhbGlkYXRvcnN9ZnVuY3Rpb24gZ2oodCl7cmV0dXJuIHQ/QXJyYXkuaXNBcnJheSh0KT90Olt0XTpbXX1mdW5jdGlvbiBoaih0LGUpe3JldHVybiBBcnJheS5pc0FycmF5KHQpP3QuaW5jbHVkZXMoZSk6dD09PWV9ZnVuY3Rpb24gYmoodCxlKXtjb25zdCBuPWdqKGUpO3JldHVybiBnaih0KS5mb3JFYWNoKCh0PT57aGoobix0KXx8bi5wdXNoKHQpfSkpLG59ZnVuY3Rpb24geWoodCxlKXtyZXR1cm4gZ2ooZSkuZmlsdGVyKChlPT4haGoodCxlKSkpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBfantjb25zdHJ1Y3Rvcigpe3RoaXMuX3Jhd1ZhbGlkYXRvcnM9W10sdGhpcy5fcmF3QXN5bmNWYWxpZGF0b3JzPVtdLHRoaXMuX29uRGVzdHJveUNhbGxiYWNrcz1bXX1nZXQgdmFsdWUoKXtyZXR1cm4gdGhpcy5jb250cm9sP3RoaXMuY29udHJvbC52YWx1ZTpudWxsfWdldCB2YWxpZCgpe3JldHVybiB0aGlzLmNvbnRyb2w/dGhpcy5jb250cm9sLnZhbGlkOm51bGx9Z2V0IGludmFsaWQoKXtyZXR1cm4gdGhpcy5jb250cm9sP3RoaXMuY29udHJvbC5pbnZhbGlkOm51bGx9Z2V0IHBlbmRpbmcoKXtyZXR1cm4gdGhpcy5jb250cm9sP3RoaXMuY29udHJvbC5wZW5kaW5nOm51bGx9Z2V0IGRpc2FibGVkKCl7cmV0dXJuIHRoaXMuY29udHJvbD90aGlzLmNvbnRyb2wuZGlzYWJsZWQ6bnVsbH1nZXQgZW5hYmxlZCgpe3JldHVybiB0aGlzLmNvbnRyb2w/dGhpcy5jb250cm9sLmVuYWJsZWQ6bnVsbH1nZXQgZXJyb3JzKCl7cmV0dXJuIHRoaXMuY29udHJvbD90aGlzLmNvbnRyb2wuZXJyb3JzOm51bGx9Z2V0IHByaXN0aW5lKCl7cmV0dXJuIHRoaXMuY29udHJvbD90aGlzLmNvbnRyb2wucHJpc3RpbmU6bnVsbH1nZXQgZGlydHkoKXtyZXR1cm4gdGhpcy5jb250cm9sP3RoaXMuY29udHJvbC5kaXJ0eTpudWxsfWdldCB0b3VjaGVkKCl7cmV0dXJuIHRoaXMuY29udHJvbD90aGlzLmNvbnRyb2wudG91Y2hlZDpudWxsfWdldCBzdGF0dXMoKXtyZXR1cm4gdGhpcy5jb250cm9sP3RoaXMuY29udHJvbC5zdGF0dXM6bnVsbH1nZXQgdW50b3VjaGVkKCl7cmV0dXJuIHRoaXMuY29udHJvbD90aGlzLmNvbnRyb2wudW50b3VjaGVkOm51bGx9Z2V0IHN0YXR1c0NoYW5nZXMoKXtyZXR1cm4gdGhpcy5jb250cm9sP3RoaXMuY29udHJvbC5zdGF0dXNDaGFuZ2VzOm51bGx9Z2V0IHZhbHVlQ2hhbmdlcygpe3JldHVybiB0aGlzLmNvbnRyb2w/dGhpcy5jb250cm9sLnZhbHVlQ2hhbmdlczpudWxsfWdldCBwYXRoKCl7cmV0dXJuIG51bGx9X3NldFZhbGlkYXRvcnModCl7dGhpcy5fcmF3VmFsaWRhdG9ycz10fHxbXSx0aGlzLl9jb21wb3NlZFZhbGlkYXRvckZuPWNqKHRoaXMuX3Jhd1ZhbGlkYXRvcnMpfV9zZXRBc3luY1ZhbGlkYXRvcnModCl7dGhpcy5fcmF3QXN5bmNWYWxpZGF0b3JzPXR8fFtdLHRoaXMuX2NvbXBvc2VkQXN5bmNWYWxpZGF0b3JGbj1waih0aGlzLl9yYXdBc3luY1ZhbGlkYXRvcnMpfWdldCB2YWxpZGF0b3IoKXtyZXR1cm4gdGhpcy5fY29tcG9zZWRWYWxpZGF0b3JGbnx8bnVsbH1nZXQgYXN5bmNWYWxpZGF0b3IoKXtyZXR1cm4gdGhpcy5fY29tcG9zZWRBc3luY1ZhbGlkYXRvckZufHxudWxsfV9yZWdpc3Rlck9uRGVzdHJveSh0KXt0aGlzLl9vbkRlc3Ryb3lDYWxsYmFja3MucHVzaCh0KX1faW52b2tlT25EZXN0cm95Q2FsbGJhY2tzKCl7dGhpcy5fb25EZXN0cm95Q2FsbGJhY2tzLmZvckVhY2goKHQ9PnQoKSkpLHRoaXMuX29uRGVzdHJveUNhbGxiYWNrcz1bXX1yZXNldCh0KXt0aGlzLmNvbnRyb2wmJnRoaXMuY29udHJvbC5yZXNldCh0KX1oYXNFcnJvcih0LGUpe3JldHVybiEhdGhpcy5jb250cm9sJiZ0aGlzLmNvbnRyb2wuaGFzRXJyb3IodCxlKX1nZXRFcnJvcih0LGUpe3JldHVybiB0aGlzLmNvbnRyb2w/dGhpcy5jb250cm9sLmdldEVycm9yKHQsZSk6bnVsbH19X2ouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fF9qKX0sX2ouybVkaXI9bG8oe3R5cGU6X2p9KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIENqIGV4dGVuZHMgX2p7Z2V0IGZvcm1EaXJlY3RpdmUoKXtyZXR1cm4gbnVsbH1nZXQgcGF0aCgpe3JldHVybiBudWxsfX1Dai7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoQ2opKSkobnx8Q2opfX0pKCksQ2ouybVkaXI9bG8oe3R5cGU6Q2osZmVhdHVyZXM6W3hwXX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgTWogZXh0ZW5kcyBfantjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fcGFyZW50PW51bGwsdGhpcy5uYW1lPW51bGwsdGhpcy52YWx1ZUFjY2Vzc29yPW51bGx9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyB2antjb25zdHJ1Y3Rvcih0KXt0aGlzLl9jZD10fWlzKHQpe3ZhciBlLG4sbztyZXR1cm4ic3VibWl0dGVkIj09PXQ/ISEobnVsbD09PShlPXRoaXMuX2NkKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5zdWJtaXR0ZWQpOiEhKG51bGw9PT0obz1udWxsPT09KG49dGhpcy5fY2QpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmNvbnRyb2wpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvW3RdKX19Y2xhc3MgeGogZXh0ZW5kcyB2antjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX19eGouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHhqKShTbShNaiwyKSl9LHhqLsm1ZGlyPWxvKHt0eXBlOnhqLHNlbGVjdG9yczpbWyIiLCJmb3JtQ29udHJvbE5hbWUiLCIiXSxbIiIsIm5nTW9kZWwiLCIiXSxbIiIsImZvcm1Db250cm9sIiwiIl1dLGhvc3RWYXJzOjE0LGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZwdSgibmctdW50b3VjaGVkIixuLmlzKCJ1bnRvdWNoZWQiKSkoIm5nLXRvdWNoZWQiLG4uaXMoInRvdWNoZWQiKSkoIm5nLXByaXN0aW5lIixuLmlzKCJwcmlzdGluZSIpKSgibmctZGlydHkiLG4uaXMoImRpcnR5IikpKCJuZy12YWxpZCIsbi5pcygidmFsaWQiKSkoIm5nLWludmFsaWQiLG4uaXMoImludmFsaWQiKSkoIm5nLXBlbmRpbmciLG4uaXMoInBlbmRpbmciKSl9LGZlYXR1cmVzOlt4cF19KSx4ai5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOk1qLGRlY29yYXRvcnM6W3t0eXBlOkRyfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHhqLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6Iltmb3JtQ29udHJvbE5hbWVdLFtuZ01vZGVsXSxbZm9ybUNvbnRyb2xdIixob3N0OnsiW2NsYXNzLm5nLXVudG91Y2hlZF0iOidpcygidW50b3VjaGVkIiknLCJbY2xhc3MubmctdG91Y2hlZF0iOidpcygidG91Y2hlZCIpJywiW2NsYXNzLm5nLXByaXN0aW5lXSI6J2lzKCJwcmlzdGluZSIpJywiW2NsYXNzLm5nLWRpcnR5XSI6J2lzKCJkaXJ0eSIpJywiW2NsYXNzLm5nLXZhbGlkXSI6J2lzKCJ2YWxpZCIpJywiW2NsYXNzLm5nLWludmFsaWRdIjonaXMoImludmFsaWQiKScsIltjbGFzcy5uZy1wZW5kaW5nXSI6J2lzKCJwZW5kaW5nIiknfX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOk1qLGRlY29yYXRvcnM6W3t0eXBlOkRyfV19XX0pLG51bGwpO2NsYXNzIE9qIGV4dGVuZHMgdmp7Y29uc3RydWN0b3IodCl7c3VwZXIodCl9fU9qLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxPaikoU20oQ2osMTApKX0sT2ouybVkaXI9bG8oe3R5cGU6T2osc2VsZWN0b3JzOltbIiIsImZvcm1Hcm91cE5hbWUiLCIiXSxbIiIsImZvcm1BcnJheU5hbWUiLCIiXSxbIiIsIm5nTW9kZWxHcm91cCIsIiJdLFsiIiwiZm9ybUdyb3VwIiwiIl0sWyJmb3JtIiwzLCJuZ05vRm9ybSIsIiJdLFsiIiwibmdGb3JtIiwiIl1dLGhvc3RWYXJzOjE2LGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZwdSgibmctdW50b3VjaGVkIixuLmlzKCJ1bnRvdWNoZWQiKSkoIm5nLXRvdWNoZWQiLG4uaXMoInRvdWNoZWQiKSkoIm5nLXByaXN0aW5lIixuLmlzKCJwcmlzdGluZSIpKSgibmctZGlydHkiLG4uaXMoImRpcnR5IikpKCJuZy12YWxpZCIsbi5pcygidmFsaWQiKSkoIm5nLWludmFsaWQiLG4uaXMoImludmFsaWQiKSkoIm5nLXBlbmRpbmciLG4uaXMoInBlbmRpbmciKSkoIm5nLXN1Ym1pdHRlZCIsbi5pcygic3VibWl0dGVkIikpfSxmZWF0dXJlczpbeHBdfSksT2ouY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpDaixkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoT2osW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Zvcm1Hcm91cE5hbWVdLFtmb3JtQXJyYXlOYW1lXSxbbmdNb2RlbEdyb3VwXSxbZm9ybUdyb3VwXSxmb3JtOm5vdChbbmdOb0Zvcm1dKSxbbmdGb3JtXSIsaG9zdDp7IltjbGFzcy5uZy11bnRvdWNoZWRdIjonaXMoInVudG91Y2hlZCIpJywiW2NsYXNzLm5nLXRvdWNoZWRdIjonaXMoInRvdWNoZWQiKScsIltjbGFzcy5uZy1wcmlzdGluZV0iOidpcygicHJpc3RpbmUiKScsIltjbGFzcy5uZy1kaXJ0eV0iOidpcygiZGlydHkiKScsIltjbGFzcy5uZy12YWxpZF0iOidpcygidmFsaWQiKScsIltjbGFzcy5uZy1pbnZhbGlkXSI6J2lzKCJpbnZhbGlkIiknLCJbY2xhc3MubmctcGVuZGluZ10iOidpcygicGVuZGluZyIpJywiW2NsYXNzLm5nLXN1Ym1pdHRlZF0iOidpcygic3VibWl0dGVkIiknfX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkNqLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn1dfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IFBqPSdcbiAgICA8ZGl2IFtmb3JtR3JvdXBdPSJteUdyb3VwIj5cbiAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9ImZpcnN0TmFtZSI+XG4gICAgPC9kaXY+XG5cbiAgICBJbiB5b3VyIGNsYXNzOlxuXG4gICAgdGhpcy5teUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgZmlyc3ROYW1lOiBuZXcgRm9ybUNvbnRyb2woKVxuICAgIH0pOycsd2o9J1xuICAgIDxkaXYgW2Zvcm1Hcm91cF09Im15R3JvdXAiPlxuICAgICAgIDxkaXYgZm9ybUdyb3VwTmFtZT0icGVyc29uIj5cbiAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPSJmaXJzdE5hbWUiPlxuICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgSW4geW91ciBjbGFzczpcblxuICAgIHRoaXMubXlHcm91cCA9IG5ldyBGb3JtR3JvdXAoe1xuICAgICAgIHBlcnNvbjogbmV3IEZvcm1Hcm91cCh7IGZpcnN0TmFtZTogbmV3IEZvcm1Db250cm9sKCkgfSlcbiAgICB9KTsnLGtqPSdcbiAgICA8Zm9ybT5cbiAgICAgICA8ZGl2IG5nTW9kZWxHcm91cD0icGVyc29uIj5cbiAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09InBlcnNvbi5uYW1lIiBuYW1lPSJmaXJzdE5hbWUiPlxuICAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT4nOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBTantzdGF0aWMgY29udHJvbFBhcmVudEV4Y2VwdGlvbigpe3Rocm93IG5ldyBFcnJvcihgZm9ybUNvbnRyb2xOYW1lIG11c3QgYmUgdXNlZCB3aXRoIGEgcGFyZW50IGZvcm1Hcm91cCBkaXJlY3RpdmUuICBZb3UnbGwgd2FudCB0byBhZGQgYSBmb3JtR3JvdXBcbiAgICAgICBkaXJlY3RpdmUgYW5kIHBhc3MgaXQgYW4gZXhpc3RpbmcgRm9ybUdyb3VwIGluc3RhbmNlICh5b3UgY2FuIGNyZWF0ZSBvbmUgaW4geW91ciBjbGFzcykuXG5cbiAgICAgIEV4YW1wbGU6XG5cbiAgICAgICR7UGp9YCl9c3RhdGljIG5nTW9kZWxHcm91cEV4Y2VwdGlvbigpe3Rocm93IG5ldyBFcnJvcihgZm9ybUNvbnRyb2xOYW1lIGNhbm5vdCBiZSB1c2VkIHdpdGggYW4gbmdNb2RlbEdyb3VwIHBhcmVudC4gSXQgaXMgb25seSBjb21wYXRpYmxlIHdpdGggcGFyZW50c1xuICAgICAgIHRoYXQgYWxzbyBoYXZlIGEgImZvcm0iIHByZWZpeDogZm9ybUdyb3VwTmFtZSwgZm9ybUFycmF5TmFtZSwgb3IgZm9ybUdyb3VwLlxuXG4gICAgICAgT3B0aW9uIDE6ICBVcGRhdGUgdGhlIHBhcmVudCB0byBiZSBmb3JtR3JvdXBOYW1lIChyZWFjdGl2ZSBmb3JtIHN0cmF0ZWd5KVxuXG4gICAgICAgICR7d2p9XG5cbiAgICAgICAgT3B0aW9uIDI6IFVzZSBuZ01vZGVsIGluc3RlYWQgb2YgZm9ybUNvbnRyb2xOYW1lICh0ZW1wbGF0ZS1kcml2ZW4gc3RyYXRlZ3kpXG5cbiAgICAgICAgJHtran1gKX1zdGF0aWMgbWlzc2luZ0Zvcm1FeGNlcHRpb24oKXt0aHJvdyBuZXcgRXJyb3IoYGZvcm1Hcm91cCBleHBlY3RzIGEgRm9ybUdyb3VwIGluc3RhbmNlLiBQbGVhc2UgcGFzcyBvbmUgaW4uXG5cbiAgICAgICBFeGFtcGxlOlxuXG4gICAgICAgJHtQan1gKX1zdGF0aWMgZ3JvdXBQYXJlbnRFeGNlcHRpb24oKXt0aHJvdyBuZXcgRXJyb3IoYGZvcm1Hcm91cE5hbWUgbXVzdCBiZSB1c2VkIHdpdGggYSBwYXJlbnQgZm9ybUdyb3VwIGRpcmVjdGl2ZS4gIFlvdSdsbCB3YW50IHRvIGFkZCBhIGZvcm1Hcm91cFxuICAgICAgZGlyZWN0aXZlIGFuZCBwYXNzIGl0IGFuIGV4aXN0aW5nIEZvcm1Hcm91cCBpbnN0YW5jZSAoeW91IGNhbiBjcmVhdGUgb25lIGluIHlvdXIgY2xhc3MpLlxuXG4gICAgICBFeGFtcGxlOlxuXG4gICAgICAke3dqfWApfXN0YXRpYyBhcnJheVBhcmVudEV4Y2VwdGlvbigpe3Rocm93IG5ldyBFcnJvcignZm9ybUFycmF5TmFtZSBtdXN0IGJlIHVzZWQgd2l0aCBhIHBhcmVudCBmb3JtR3JvdXAgZGlyZWN0aXZlLiAgWW91XCdsbCB3YW50IHRvIGFkZCBhIGZvcm1Hcm91cFxuICAgICAgIGRpcmVjdGl2ZSBhbmQgcGFzcyBpdCBhbiBleGlzdGluZyBGb3JtR3JvdXAgaW5zdGFuY2UgKHlvdSBjYW4gY3JlYXRlIG9uZSBpbiB5b3VyIGNsYXNzKS5cblxuICAgICAgICBFeGFtcGxlOlxuXG4gICAgICAgIFxuICAgIDxkaXYgW2Zvcm1Hcm91cF09Im15R3JvdXAiPlxuICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPSJjaXRpZXMiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj0ibGV0IGNpdHkgb2YgY2l0eUFycmF5LmNvbnRyb2xzOyBpbmRleCBhcyBpIj5cbiAgICAgICAgICA8aW5wdXQgW2Zvcm1Db250cm9sTmFtZV09ImkiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgSW4geW91ciBjbGFzczpcblxuICAgIHRoaXMuY2l0eUFycmF5ID0gbmV3IEZvcm1BcnJheShbbmV3IEZvcm1Db250cm9sKFwnU0ZcJyldKTtcbiAgICB0aGlzLm15R3JvdXAgPSBuZXcgRm9ybUdyb3VwKHtcbiAgICAgIGNpdGllczogdGhpcy5jaXR5QXJyYXlcbiAgICB9KTsnKX1zdGF0aWMgZGlzYWJsZWRBdHRyV2FybmluZygpe2NvbnNvbGUud2FybigiXG4gICAgICBJdCBsb29rcyBsaWtlIHlvdSdyZSB1c2luZyB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIHdpdGggYSByZWFjdGl2ZSBmb3JtIGRpcmVjdGl2ZS4gSWYgeW91IHNldCBkaXNhYmxlZCB0byB0cnVlXG4gICAgICB3aGVuIHlvdSBzZXQgdXAgdGhpcyBjb250cm9sIGluIHlvdXIgY29tcG9uZW50IGNsYXNzLCB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIHdpbGwgYWN0dWFsbHkgYmUgc2V0IGluIHRoZSBET00gZm9yXG4gICAgICB5b3UuIFdlIHJlY29tbWVuZCB1c2luZyB0aGlzIGFwcHJvYWNoIHRvIGF2b2lkICdjaGFuZ2VkIGFmdGVyIGNoZWNrZWQnIGVycm9ycy5cblxuICAgICAgRXhhbXBsZTpcbiAgICAgIGZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICAgICAgZmlyc3Q6IG5ldyBGb3JtQ29udHJvbCh7dmFsdWU6ICdOYW5jeScsIGRpc2FibGVkOiB0cnVlfSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICAgIGxhc3Q6IG5ldyBGb3JtQ29udHJvbCgnRHJldycsIFZhbGlkYXRvcnMucmVxdWlyZWQpXG4gICAgICB9KTtcbiAgICAiKX1zdGF0aWMgbmdNb2RlbFdhcm5pbmcodCl7Y29uc29sZS53YXJuKGBcbiAgICBJdCBsb29rcyBsaWtlIHlvdSdyZSB1c2luZyBuZ01vZGVsIG9uIHRoZSBzYW1lIGZvcm0gZmllbGQgYXMgJHt0fS5cbiAgICBTdXBwb3J0IGZvciB1c2luZyB0aGUgbmdNb2RlbCBpbnB1dCBwcm9wZXJ0eSBhbmQgbmdNb2RlbENoYW5nZSBldmVudCB3aXRoXG4gICAgcmVhY3RpdmUgZm9ybSBkaXJlY3RpdmVzIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gQW5ndWxhciB2NiBhbmQgd2lsbCBiZSByZW1vdmVkXG4gICAgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBBbmd1bGFyLlxuXG4gICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcywgc2VlIG91ciBBUEkgZG9jcyBoZXJlOlxuICAgIGh0dHBzOi8vYW5ndWxhci5pby9hcGkvZm9ybXMvJHsiZm9ybUNvbnRyb2wiPT09dD8iRm9ybUNvbnRyb2xEaXJlY3RpdmUiOiJGb3JtQ29udHJvbE5hbWUifSN1c2Utd2l0aC1uZ21vZGVsXG4gICAgYCl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBEaih0LGUpe3JldHVyblsuLi5lLnBhdGgsdF19ZnVuY3Rpb24gRWoodCxlKXsoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJih0fHxIaihlLCJDYW5ub3QgZmluZCBjb250cm9sIHdpdGgiKSxlLnZhbHVlQWNjZXNzb3J8fEhqKGUsIk5vIHZhbHVlIGFjY2Vzc29yIGZvciBmb3JtIGNvbnRyb2wgd2l0aCIpKSxUaih0LGUpLGUudmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlKHQudmFsdWUpLChmdW5jdGlvbiBuKHQsZSl7ZS52YWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25DaGFuZ2UoKG49Pnt0Ll9wZW5kaW5nVmFsdWU9bix0Ll9wZW5kaW5nQ2hhbmdlPSEwLHQuX3BlbmRpbmdEaXJ0eT0hMCwiY2hhbmdlIj09PXQudXBkYXRlT24mJnpqKHQsZSl9KSl9KSh0LGUpLChmdW5jdGlvbiBvKHQsZSl7Y29uc3Qgbj0odCxuKT0+e2UudmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlKHQpLG4mJmUudmlld1RvTW9kZWxVcGRhdGUodCl9O3QucmVnaXN0ZXJPbkNoYW5nZShuKSxlLl9yZWdpc3Rlck9uRGVzdHJveSgoKCk9Pnt0Ll91bnJlZ2lzdGVyT25DaGFuZ2Uobil9KSl9KSh0LGUpLChmdW5jdGlvbiBpKHQsZSl7ZS52YWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25Ub3VjaGVkKCgoKT0+e3QuX3BlbmRpbmdUb3VjaGVkPSEwLCJibHVyIj09PXQudXBkYXRlT24mJnQuX3BlbmRpbmdDaGFuZ2UmJnpqKHQsZSksInN1Ym1pdCIhPT10LnVwZGF0ZU9uJiZ0Lm1hcmtBc1RvdWNoZWQoKX0pKX0pKHQsZSksKGZ1bmN0aW9uIGEodCxlKXtpZihlLnZhbHVlQWNjZXNzb3Iuc2V0RGlzYWJsZWRTdGF0ZSl7Y29uc3Qgbj10PT57ZS52YWx1ZUFjY2Vzc29yLnNldERpc2FibGVkU3RhdGUodCl9O3QucmVnaXN0ZXJPbkRpc2FibGVkQ2hhbmdlKG4pLGUuX3JlZ2lzdGVyT25EZXN0cm95KCgoKT0+e3QuX3VucmVnaXN0ZXJPbkRpc2FibGVkQ2hhbmdlKG4pfSkpfX0pKHQsZSl9ZnVuY3Rpb24gUmoodCxlLG49ITApe2NvbnN0IG89KCk9PntuJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJihmdW5jdGlvbiB0KGUpe0hqKGUsIlRoZXJlIGlzIG5vIEZvcm1Db250cm9sIGluc3RhbmNlIGF0dGFjaGVkIHRvIGZvcm0gY29udHJvbCBlbGVtZW50IHdpdGgiKX0pKGUpfTtlLnZhbHVlQWNjZXNzb3ImJihlLnZhbHVlQWNjZXNzb3IucmVnaXN0ZXJPbkNoYW5nZShvKSxlLnZhbHVlQWNjZXNzb3IucmVnaXN0ZXJPblRvdWNoZWQobykpLE5qKHQsZSksdCYmKGUuX2ludm9rZU9uRGVzdHJveUNhbGxiYWNrcygpLHQuX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKCgoKT0+e30pKSl9ZnVuY3Rpb24gQWoodCxlKXt0LmZvckVhY2goKHQ9Pnt0LnJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UmJnQucmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShlKX0pKX1mdW5jdGlvbiBUaih0LGUpe2NvbnN0IG49dWoodCk7bnVsbCE9PWUudmFsaWRhdG9yP3Quc2V0VmFsaWRhdG9ycyhtaihuLGUudmFsaWRhdG9yKSk6ImZ1bmN0aW9uIj09dHlwZW9mIG4mJnQuc2V0VmFsaWRhdG9ycyhbbl0pO2NvbnN0IG89ZmoodCk7bnVsbCE9PWUuYXN5bmNWYWxpZGF0b3I/dC5zZXRBc3luY1ZhbGlkYXRvcnMobWoobyxlLmFzeW5jVmFsaWRhdG9yKSk6ImZ1bmN0aW9uIj09dHlwZW9mIG8mJnQuc2V0QXN5bmNWYWxpZGF0b3JzKFtvXSk7Y29uc3QgaT0oKT0+dC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7QWooZS5fcmF3VmFsaWRhdG9ycyxpKSxBaihlLl9yYXdBc3luY1ZhbGlkYXRvcnMsaSl9ZnVuY3Rpb24gTmoodCxlKXtsZXQgbj0hMTtpZihudWxsIT09dCl7aWYobnVsbCE9PWUudmFsaWRhdG9yKXtjb25zdCBvPXVqKHQpO2lmKEFycmF5LmlzQXJyYXkobykmJm8ubGVuZ3RoPjApe2NvbnN0IGk9by5maWx0ZXIoKHQ9PnQhPT1lLnZhbGlkYXRvcikpO2kubGVuZ3RoIT09by5sZW5ndGgmJihuPSEwLHQuc2V0VmFsaWRhdG9ycyhpKSl9fWlmKG51bGwhPT1lLmFzeW5jVmFsaWRhdG9yKXtjb25zdCBvPWZqKHQpO2lmKEFycmF5LmlzQXJyYXkobykmJm8ubGVuZ3RoPjApe2NvbnN0IGk9by5maWx0ZXIoKHQ9PnQhPT1lLmFzeW5jVmFsaWRhdG9yKSk7aS5sZW5ndGghPT1vLmxlbmd0aCYmKG49ITAsdC5zZXRBc3luY1ZhbGlkYXRvcnMoaSkpfX19Y29uc3Qgbz0oKT0+e307cmV0dXJuIEFqKGUuX3Jhd1ZhbGlkYXRvcnMsbyksQWooZS5fcmF3QXN5bmNWYWxpZGF0b3JzLG8pLG59ZnVuY3Rpb24gemoodCxlKXt0Ll9wZW5kaW5nRGlydHkmJnQubWFya0FzRGlydHkoKSx0LnNldFZhbHVlKHQuX3BlbmRpbmdWYWx1ZSx7ZW1pdE1vZGVsVG9WaWV3Q2hhbmdlOiExfSksZS52aWV3VG9Nb2RlbFVwZGF0ZSh0Ll9wZW5kaW5nVmFsdWUpLHQuX3BlbmRpbmdDaGFuZ2U9ITF9ZnVuY3Rpb24gSWoodCxlKXtudWxsIT10fHwidW5kZWZpbmVkIiE9dHlwZW9mIG5nRGV2TW9kZSYmIW5nRGV2TW9kZXx8SGooZSwiQ2Fubm90IGZpbmQgY29udHJvbCB3aXRoIiksVGoodCxlKX1mdW5jdGlvbiBIaih0LGUpe2xldCBuO3Rocm93IG49dC5wYXRoLmxlbmd0aD4xP2BwYXRoOiAnJHt0LnBhdGguam9pbigiIC0+ICIpfSdgOnQucGF0aFswXT9gbmFtZTogJyR7dC5wYXRofSdgOiJ1bnNwZWNpZmllZCBuYW1lIGF0dHJpYnV0ZSIsbmV3IEVycm9yKGAke2V9ICR7bn1gKX1mdW5jdGlvbiBGaih0LGUpe2lmKCF0Lmhhc093blByb3BlcnR5KCJtb2RlbCIpKXJldHVybiExO2NvbnN0IG49dC5tb2RlbDtyZXR1cm4hIW4uaXNGaXJzdENoYW5nZSgpfHwhT2JqZWN0LmlzKGUsbi5jdXJyZW50VmFsdWUpfWZ1bmN0aW9uIExqKHQsZSl7dC5fc3luY1BlbmRpbmdDb250cm9scygpLGUuZm9yRWFjaCgodD0+e2NvbnN0IGU9dC5jb250cm9sOyJzdWJtaXQiPT09ZS51cGRhdGVPbiYmZS5fcGVuZGluZ0NoYW5nZSYmKHQudmlld1RvTW9kZWxVcGRhdGUoZS5fcGVuZGluZ1ZhbHVlKSxlLl9wZW5kaW5nQ2hhbmdlPSExKX0pKX1mdW5jdGlvbiBCaih0LGUpe2lmKCFlKXJldHVybiBudWxsO2xldCBuLG8saTtyZXR1cm4gQXJyYXkuaXNBcnJheShlKXx8InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0Rldk1vZGUmJiFuZ0Rldk1vZGV8fEhqKHQsIlZhbHVlIGFjY2Vzc29yIHdhcyBub3QgcHJvdmlkZWQgYXMgYW4gYXJyYXkgZm9yIGZvcm0gY29udHJvbCB3aXRoIiksZS5mb3JFYWNoKChlPT57ZS5jb25zdHJ1Y3Rvcj09PVZWP249ZTooZnVuY3Rpb24gYSh0KXtyZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKHQuY29uc3RydWN0b3IpPT09elZ9KShlKT8obyYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZIaih0LCJNb3JlIHRoYW4gb25lIGJ1aWx0LWluIHZhbHVlIGFjY2Vzc29yIG1hdGNoZXMgZm9ybSBjb250cm9sIHdpdGgiKSxvPWUpOihpJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJkhqKHQsIk1vcmUgdGhhbiBvbmUgY3VzdG9tIHZhbHVlIGFjY2Vzc29yIG1hdGNoZXMgZm9ybSBjb250cm9sIHdpdGgiKSxpPWUpfSkpLGl8fG98fG58fCgoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJkhqKHQsIk5vIHZhbGlkIHZhbHVlIGFjY2Vzc29yIGZvciBmb3JtIGNvbnRyb2wgd2l0aCIpLG51bGwpfWZ1bmN0aW9uIFZqKHQsZSl7Y29uc3Qgbj10LmluZGV4T2YoZSk7bj4tMSYmdC5zcGxpY2UobiwxKX1mdW5jdGlvbiBqaih0LGUsbixvKXsibmV2ZXIiIT09byYmKChudWxsIT09byYmIm9uY2UiIT09b3x8ZS5fbmdNb2RlbFdhcm5pbmdTZW50T25jZSkmJigiYWx3YXlzIiE9PW98fG4uX25nTW9kZWxXYXJuaW5nU2VudCl8fChTai5uZ01vZGVsV2FybmluZyh0KSxlLl9uZ01vZGVsV2FybmluZ1NlbnRPbmNlPSEwLG4uX25nTW9kZWxXYXJuaW5nU2VudD0hMCkpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCBVaj0iVkFMSUQiLEdqPSJJTlZBTElEIixXaj0iUEVORElORyIsWWo9IkRJU0FCTEVEIjtmdW5jdGlvbiBxaih0KXtyZXR1cm4oSmoodCk/dC52YWxpZGF0b3JzOnQpfHxudWxsfWZ1bmN0aW9uIFpqKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpP2NqKHQpOnR8fG51bGx9ZnVuY3Rpb24gWGoodCxlKXtyZXR1cm4oSmooZSk/ZS5hc3luY1ZhbGlkYXRvcnM6dCl8fG51bGx9ZnVuY3Rpb24gS2oodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/cGoodCk6dHx8bnVsbH1mdW5jdGlvbiBKaih0KXtyZXR1cm4gbnVsbCE9dCYmIUFycmF5LmlzQXJyYXkodCkmJiJvYmplY3QiPT10eXBlb2YgdH1jbGFzcyBRantjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX2hhc093blBlbmRpbmdBc3luY1ZhbGlkYXRvcj0hMSx0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2U9KCk9Pnt9LHRoaXMuX3BhcmVudD1udWxsLHRoaXMucHJpc3RpbmU9ITAsdGhpcy50b3VjaGVkPSExLHRoaXMuX29uRGlzYWJsZWRDaGFuZ2U9W10sdGhpcy5fcmF3VmFsaWRhdG9ycz10LHRoaXMuX3Jhd0FzeW5jVmFsaWRhdG9ycz1lLHRoaXMuX2NvbXBvc2VkVmFsaWRhdG9yRm49WmoodGhpcy5fcmF3VmFsaWRhdG9ycyksdGhpcy5fY29tcG9zZWRBc3luY1ZhbGlkYXRvckZuPUtqKHRoaXMuX3Jhd0FzeW5jVmFsaWRhdG9ycyl9Z2V0IHZhbGlkYXRvcigpe3JldHVybiB0aGlzLl9jb21wb3NlZFZhbGlkYXRvckZufXNldCB2YWxpZGF0b3IodCl7dGhpcy5fcmF3VmFsaWRhdG9ycz10aGlzLl9jb21wb3NlZFZhbGlkYXRvckZuPXR9Z2V0IGFzeW5jVmFsaWRhdG9yKCl7cmV0dXJuIHRoaXMuX2NvbXBvc2VkQXN5bmNWYWxpZGF0b3JGbn1zZXQgYXN5bmNWYWxpZGF0b3IodCl7dGhpcy5fcmF3QXN5bmNWYWxpZGF0b3JzPXRoaXMuX2NvbXBvc2VkQXN5bmNWYWxpZGF0b3JGbj10fWdldCBwYXJlbnQoKXtyZXR1cm4gdGhpcy5fcGFyZW50fWdldCB2YWxpZCgpe3JldHVybiB0aGlzLnN0YXR1cz09PVVqfWdldCBpbnZhbGlkKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT09R2p9Z2V0IHBlbmRpbmcoKXtyZXR1cm4gdGhpcy5zdGF0dXM9PVdqfWdldCBkaXNhYmxlZCgpe3JldHVybiB0aGlzLnN0YXR1cz09PVlqfWdldCBlbmFibGVkKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT09WWp9Z2V0IGRpcnR5KCl7cmV0dXJuIXRoaXMucHJpc3RpbmV9Z2V0IHVudG91Y2hlZCgpe3JldHVybiF0aGlzLnRvdWNoZWR9Z2V0IHVwZGF0ZU9uKCl7cmV0dXJuIHRoaXMuX3VwZGF0ZU9uP3RoaXMuX3VwZGF0ZU9uOnRoaXMucGFyZW50P3RoaXMucGFyZW50LnVwZGF0ZU9uOiJjaGFuZ2UifXNldFZhbGlkYXRvcnModCl7dGhpcy5fcmF3VmFsaWRhdG9ycz10LHRoaXMuX2NvbXBvc2VkVmFsaWRhdG9yRm49WmoodCl9c2V0QXN5bmNWYWxpZGF0b3JzKHQpe3RoaXMuX3Jhd0FzeW5jVmFsaWRhdG9ycz10LHRoaXMuX2NvbXBvc2VkQXN5bmNWYWxpZGF0b3JGbj1Laih0KX1hZGRWYWxpZGF0b3JzKHQpe3RoaXMuc2V0VmFsaWRhdG9ycyhiaih0LHRoaXMuX3Jhd1ZhbGlkYXRvcnMpKX1hZGRBc3luY1ZhbGlkYXRvcnModCl7dGhpcy5zZXRBc3luY1ZhbGlkYXRvcnMoYmoodCx0aGlzLl9yYXdBc3luY1ZhbGlkYXRvcnMpKX1yZW1vdmVWYWxpZGF0b3JzKHQpe3RoaXMuc2V0VmFsaWRhdG9ycyh5aih0LHRoaXMuX3Jhd1ZhbGlkYXRvcnMpKX1yZW1vdmVBc3luY1ZhbGlkYXRvcnModCl7dGhpcy5zZXRBc3luY1ZhbGlkYXRvcnMoeWoodCx0aGlzLl9yYXdBc3luY1ZhbGlkYXRvcnMpKX1oYXNWYWxpZGF0b3IodCl7cmV0dXJuIGhqKHRoaXMuX3Jhd1ZhbGlkYXRvcnMsdCl9aGFzQXN5bmNWYWxpZGF0b3IodCl7cmV0dXJuIGhqKHRoaXMuX3Jhd0FzeW5jVmFsaWRhdG9ycyx0KX1jbGVhclZhbGlkYXRvcnMoKXt0aGlzLnZhbGlkYXRvcj1udWxsfWNsZWFyQXN5bmNWYWxpZGF0b3JzKCl7dGhpcy5hc3luY1ZhbGlkYXRvcj1udWxsfW1hcmtBc1RvdWNoZWQodD17fSl7dGhpcy50b3VjaGVkPSEwLHRoaXMuX3BhcmVudCYmIXQub25seVNlbGYmJnRoaXMuX3BhcmVudC5tYXJrQXNUb3VjaGVkKHQpfW1hcmtBbGxBc1RvdWNoZWQoKXt0aGlzLm1hcmtBc1RvdWNoZWQoe29ubHlTZWxmOiEwfSksdGhpcy5fZm9yRWFjaENoaWxkKCh0PT50Lm1hcmtBbGxBc1RvdWNoZWQoKSkpfW1hcmtBc1VudG91Y2hlZCh0PXt9KXt0aGlzLnRvdWNoZWQ9ITEsdGhpcy5fcGVuZGluZ1RvdWNoZWQ9ITEsdGhpcy5fZm9yRWFjaENoaWxkKCh0PT57dC5tYXJrQXNVbnRvdWNoZWQoe29ubHlTZWxmOiEwfSl9KSksdGhpcy5fcGFyZW50JiYhdC5vbmx5U2VsZiYmdGhpcy5fcGFyZW50Ll91cGRhdGVUb3VjaGVkKHQpfW1hcmtBc0RpcnR5KHQ9e30pe3RoaXMucHJpc3RpbmU9ITEsdGhpcy5fcGFyZW50JiYhdC5vbmx5U2VsZiYmdGhpcy5fcGFyZW50Lm1hcmtBc0RpcnR5KHQpfW1hcmtBc1ByaXN0aW5lKHQ9e30pe3RoaXMucHJpc3RpbmU9ITAsdGhpcy5fcGVuZGluZ0RpcnR5PSExLHRoaXMuX2ZvckVhY2hDaGlsZCgodD0+e3QubWFya0FzUHJpc3RpbmUoe29ubHlTZWxmOiEwfSl9KSksdGhpcy5fcGFyZW50JiYhdC5vbmx5U2VsZiYmdGhpcy5fcGFyZW50Ll91cGRhdGVQcmlzdGluZSh0KX1tYXJrQXNQZW5kaW5nKHQ9e30pe3RoaXMuc3RhdHVzPVdqLCExIT09dC5lbWl0RXZlbnQmJnRoaXMuc3RhdHVzQ2hhbmdlcy5lbWl0KHRoaXMuc3RhdHVzKSx0aGlzLl9wYXJlbnQmJiF0Lm9ubHlTZWxmJiZ0aGlzLl9wYXJlbnQubWFya0FzUGVuZGluZyh0KX1kaXNhYmxlKHQ9e30pe2NvbnN0IGU9dGhpcy5fcGFyZW50TWFya2VkRGlydHkodC5vbmx5U2VsZik7dGhpcy5zdGF0dXM9WWosdGhpcy5lcnJvcnM9bnVsbCx0aGlzLl9mb3JFYWNoQ2hpbGQoKGU9PntlLmRpc2FibGUoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtvbmx5U2VsZjohMH0pKX0pKSx0aGlzLl91cGRhdGVWYWx1ZSgpLCExIT09dC5lbWl0RXZlbnQmJih0aGlzLnZhbHVlQ2hhbmdlcy5lbWl0KHRoaXMudmFsdWUpLHRoaXMuc3RhdHVzQ2hhbmdlcy5lbWl0KHRoaXMuc3RhdHVzKSksdGhpcy5fdXBkYXRlQW5jZXN0b3JzKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7c2tpcFByaXN0aW5lQ2hlY2s6ZX0pKSx0aGlzLl9vbkRpc2FibGVkQ2hhbmdlLmZvckVhY2goKHQ9PnQoITApKSl9ZW5hYmxlKHQ9e30pe2NvbnN0IGU9dGhpcy5fcGFyZW50TWFya2VkRGlydHkodC5vbmx5U2VsZik7dGhpcy5zdGF0dXM9VWosdGhpcy5fZm9yRWFjaENoaWxkKChlPT57ZS5lbmFibGUoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtvbmx5U2VsZjohMH0pKX0pKSx0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe29ubHlTZWxmOiEwLGVtaXRFdmVudDp0LmVtaXRFdmVudH0pLHRoaXMuX3VwZGF0ZUFuY2VzdG9ycyhPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NraXBQcmlzdGluZUNoZWNrOmV9KSksdGhpcy5fb25EaXNhYmxlZENoYW5nZS5mb3JFYWNoKCh0PT50KCExKSkpfV91cGRhdGVBbmNlc3RvcnModCl7dGhpcy5fcGFyZW50JiYhdC5vbmx5U2VsZiYmKHRoaXMuX3BhcmVudC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHQpLHQuc2tpcFByaXN0aW5lQ2hlY2t8fHRoaXMuX3BhcmVudC5fdXBkYXRlUHJpc3RpbmUoKSx0aGlzLl9wYXJlbnQuX3VwZGF0ZVRvdWNoZWQoKSl9c2V0UGFyZW50KHQpe3RoaXMuX3BhcmVudD10fXVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkodD17fSl7dGhpcy5fc2V0SW5pdGlhbFN0YXR1cygpLHRoaXMuX3VwZGF0ZVZhbHVlKCksdGhpcy5lbmFibGVkJiYodGhpcy5fY2FuY2VsRXhpc3RpbmdTdWJzY3JpcHRpb24oKSx0aGlzLmVycm9ycz10aGlzLl9ydW5WYWxpZGF0b3IoKSx0aGlzLnN0YXR1cz10aGlzLl9jYWxjdWxhdGVTdGF0dXMoKSx0aGlzLnN0YXR1cyE9PVVqJiZ0aGlzLnN0YXR1cyE9PVdqfHx0aGlzLl9ydW5Bc3luY1ZhbGlkYXRvcih0LmVtaXRFdmVudCkpLCExIT09dC5lbWl0RXZlbnQmJih0aGlzLnZhbHVlQ2hhbmdlcy5lbWl0KHRoaXMudmFsdWUpLHRoaXMuc3RhdHVzQ2hhbmdlcy5lbWl0KHRoaXMuc3RhdHVzKSksdGhpcy5fcGFyZW50JiYhdC5vbmx5U2VsZiYmdGhpcy5fcGFyZW50LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkodCl9X3VwZGF0ZVRyZWVWYWxpZGl0eSh0PXtlbWl0RXZlbnQ6ITB9KXt0aGlzLl9mb3JFYWNoQ2hpbGQoKGU9PmUuX3VwZGF0ZVRyZWVWYWxpZGl0eSh0KSkpLHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7b25seVNlbGY6ITAsZW1pdEV2ZW50OnQuZW1pdEV2ZW50fSl9X3NldEluaXRpYWxTdGF0dXMoKXt0aGlzLnN0YXR1cz10aGlzLl9hbGxDb250cm9sc0Rpc2FibGVkKCk/WWo6VWp9X3J1blZhbGlkYXRvcigpe3JldHVybiB0aGlzLnZhbGlkYXRvcj90aGlzLnZhbGlkYXRvcih0aGlzKTpudWxsfV9ydW5Bc3luY1ZhbGlkYXRvcih0KXtpZih0aGlzLmFzeW5jVmFsaWRhdG9yKXt0aGlzLnN0YXR1cz1Xaix0aGlzLl9oYXNPd25QZW5kaW5nQXN5bmNWYWxpZGF0b3I9ITA7Y29uc3QgZT1paih0aGlzLmFzeW5jVmFsaWRhdG9yKHRoaXMpKTt0aGlzLl9hc3luY1ZhbGlkYXRpb25TdWJzY3JpcHRpb249ZS5zdWJzY3JpYmUoKGU9Pnt0aGlzLl9oYXNPd25QZW5kaW5nQXN5bmNWYWxpZGF0b3I9ITEsdGhpcy5zZXRFcnJvcnMoZSx7ZW1pdEV2ZW50OnR9KX0pKX19X2NhbmNlbEV4aXN0aW5nU3Vic2NyaXB0aW9uKCl7dGhpcy5fYXN5bmNWYWxpZGF0aW9uU3Vic2NyaXB0aW9uJiYodGhpcy5fYXN5bmNWYWxpZGF0aW9uU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5faGFzT3duUGVuZGluZ0FzeW5jVmFsaWRhdG9yPSExKX1zZXRFcnJvcnModCxlPXt9KXt0aGlzLmVycm9ycz10LHRoaXMuX3VwZGF0ZUNvbnRyb2xzRXJyb3JzKCExIT09ZS5lbWl0RXZlbnQpfWdldCh0KXtyZXR1cm4oZnVuY3Rpb24gZSh0LG4sbyl7aWYobnVsbD09bilyZXR1cm4gbnVsbDtpZihBcnJheS5pc0FycmF5KG4pfHwobj1uLnNwbGl0KG8pKSxBcnJheS5pc0FycmF5KG4pJiYwPT09bi5sZW5ndGgpcmV0dXJuIG51bGw7bGV0IGk9dDtyZXR1cm4gbi5mb3JFYWNoKCh0PT57aT1pIGluc3RhbmNlb2YgdFU/aS5jb250cm9scy5oYXNPd25Qcm9wZXJ0eSh0KT9pLmNvbnRyb2xzW3RdOm51bGw6aSBpbnN0YW5jZW9mIGVVJiZpLmF0KHQpfHxudWxsfSkpLGl9KSh0aGlzLHQsIi4iKX1nZXRFcnJvcih0LGUpe2NvbnN0IG49ZT90aGlzLmdldChlKTp0aGlzO3JldHVybiBuJiZuLmVycm9ycz9uLmVycm9yc1t0XTpudWxsfWhhc0Vycm9yKHQsZSl7cmV0dXJuISF0aGlzLmdldEVycm9yKHQsZSl9Z2V0IHJvb3QoKXtsZXQgdD10aGlzO2Zvcig7dC5fcGFyZW50Oyl0PXQuX3BhcmVudDtyZXR1cm4gdH1fdXBkYXRlQ29udHJvbHNFcnJvcnModCl7dGhpcy5zdGF0dXM9dGhpcy5fY2FsY3VsYXRlU3RhdHVzKCksdCYmdGhpcy5zdGF0dXNDaGFuZ2VzLmVtaXQodGhpcy5zdGF0dXMpLHRoaXMuX3BhcmVudCYmdGhpcy5fcGFyZW50Ll91cGRhdGVDb250cm9sc0Vycm9ycyh0KX1faW5pdE9ic2VydmFibGVzKCl7dGhpcy52YWx1ZUNoYW5nZXM9bmV3IExoLHRoaXMuc3RhdHVzQ2hhbmdlcz1uZXcgTGh9X2NhbGN1bGF0ZVN0YXR1cygpe3JldHVybiB0aGlzLl9hbGxDb250cm9sc0Rpc2FibGVkKCk/WWo6dGhpcy5lcnJvcnM/R2o6dGhpcy5faGFzT3duUGVuZGluZ0FzeW5jVmFsaWRhdG9yfHx0aGlzLl9hbnlDb250cm9sc0hhdmVTdGF0dXMoV2opP1dqOnRoaXMuX2FueUNvbnRyb2xzSGF2ZVN0YXR1cyhHaik/R2o6VWp9X2FueUNvbnRyb2xzSGF2ZVN0YXR1cyh0KXtyZXR1cm4gdGhpcy5fYW55Q29udHJvbHMoKGU9PmUuc3RhdHVzPT09dCkpfV9hbnlDb250cm9sc0RpcnR5KCl7cmV0dXJuIHRoaXMuX2FueUNvbnRyb2xzKCh0PT50LmRpcnR5KSl9X2FueUNvbnRyb2xzVG91Y2hlZCgpe3JldHVybiB0aGlzLl9hbnlDb250cm9scygodD0+dC50b3VjaGVkKSl9X3VwZGF0ZVByaXN0aW5lKHQ9e30pe3RoaXMucHJpc3RpbmU9IXRoaXMuX2FueUNvbnRyb2xzRGlydHkoKSx0aGlzLl9wYXJlbnQmJiF0Lm9ubHlTZWxmJiZ0aGlzLl9wYXJlbnQuX3VwZGF0ZVByaXN0aW5lKHQpfV91cGRhdGVUb3VjaGVkKHQ9e30pe3RoaXMudG91Y2hlZD10aGlzLl9hbnlDb250cm9sc1RvdWNoZWQoKSx0aGlzLl9wYXJlbnQmJiF0Lm9ubHlTZWxmJiZ0aGlzLl9wYXJlbnQuX3VwZGF0ZVRvdWNoZWQodCl9X2lzQm94ZWRWYWx1ZSh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10JiYyPT09T2JqZWN0LmtleXModCkubGVuZ3RoJiYidmFsdWUiaW4gdCYmImRpc2FibGVkImluIHR9X3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKHQpe3RoaXMuX29uQ29sbGVjdGlvbkNoYW5nZT10fV9zZXRVcGRhdGVTdHJhdGVneSh0KXtKaih0KSYmbnVsbCE9dC51cGRhdGVPbiYmKHRoaXMuX3VwZGF0ZU9uPXQudXBkYXRlT24pfV9wYXJlbnRNYXJrZWREaXJ0eSh0KXtyZXR1cm4hdCYmISghdGhpcy5fcGFyZW50fHwhdGhpcy5fcGFyZW50LmRpcnR5KSYmIXRoaXMuX3BhcmVudC5fYW55Q29udHJvbHNEaXJ0eSgpfX1jbGFzcyAkaiBleHRlbmRzIFFqe2NvbnN0cnVjdG9yKHQ9bnVsbCxlLG4pe3N1cGVyKHFqKGUpLFhqKG4sZSkpLHRoaXMuX29uQ2hhbmdlPVtdLHRoaXMuX2FwcGx5Rm9ybVN0YXRlKHQpLHRoaXMuX3NldFVwZGF0ZVN0cmF0ZWd5KGUpLHRoaXMuX2luaXRPYnNlcnZhYmxlcygpLHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7b25seVNlbGY6ITAsZW1pdEV2ZW50OiEhdGhpcy5hc3luY1ZhbGlkYXRvcn0pfXNldFZhbHVlKHQsZT17fSl7dGhpcy52YWx1ZT10aGlzLl9wZW5kaW5nVmFsdWU9dCx0aGlzLl9vbkNoYW5nZS5sZW5ndGgmJiExIT09ZS5lbWl0TW9kZWxUb1ZpZXdDaGFuZ2UmJnRoaXMuX29uQ2hhbmdlLmZvckVhY2goKHQ9PnQodGhpcy52YWx1ZSwhMSE9PWUuZW1pdFZpZXdUb01vZGVsQ2hhbmdlKSkpLHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eShlKX1wYXRjaFZhbHVlKHQsZT17fSl7dGhpcy5zZXRWYWx1ZSh0LGUpfXJlc2V0KHQ9bnVsbCxlPXt9KXt0aGlzLl9hcHBseUZvcm1TdGF0ZSh0KSx0aGlzLm1hcmtBc1ByaXN0aW5lKGUpLHRoaXMubWFya0FzVW50b3VjaGVkKGUpLHRoaXMuc2V0VmFsdWUodGhpcy52YWx1ZSxlKSx0aGlzLl9wZW5kaW5nQ2hhbmdlPSExfV91cGRhdGVWYWx1ZSgpe31fYW55Q29udHJvbHModCl7cmV0dXJuITF9X2FsbENvbnRyb2xzRGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5kaXNhYmxlZH1yZWdpc3Rlck9uQ2hhbmdlKHQpe3RoaXMuX29uQ2hhbmdlLnB1c2godCl9X3VucmVnaXN0ZXJPbkNoYW5nZSh0KXtWaih0aGlzLl9vbkNoYW5nZSx0KX1yZWdpc3Rlck9uRGlzYWJsZWRDaGFuZ2UodCl7dGhpcy5fb25EaXNhYmxlZENoYW5nZS5wdXNoKHQpfV91bnJlZ2lzdGVyT25EaXNhYmxlZENoYW5nZSh0KXtWaih0aGlzLl9vbkRpc2FibGVkQ2hhbmdlLHQpfV9mb3JFYWNoQ2hpbGQodCl7fV9zeW5jUGVuZGluZ0NvbnRyb2xzKCl7cmV0dXJuISgic3VibWl0IiE9PXRoaXMudXBkYXRlT258fCh0aGlzLl9wZW5kaW5nRGlydHkmJnRoaXMubWFya0FzRGlydHkoKSx0aGlzLl9wZW5kaW5nVG91Y2hlZCYmdGhpcy5tYXJrQXNUb3VjaGVkKCksIXRoaXMuX3BlbmRpbmdDaGFuZ2UpfHwodGhpcy5zZXRWYWx1ZSh0aGlzLl9wZW5kaW5nVmFsdWUse29ubHlTZWxmOiEwLGVtaXRNb2RlbFRvVmlld0NoYW5nZTohMX0pLDApKX1fYXBwbHlGb3JtU3RhdGUodCl7dGhpcy5faXNCb3hlZFZhbHVlKHQpPyh0aGlzLnZhbHVlPXRoaXMuX3BlbmRpbmdWYWx1ZT10LnZhbHVlLHQuZGlzYWJsZWQ/dGhpcy5kaXNhYmxlKHtvbmx5U2VsZjohMCxlbWl0RXZlbnQ6ITF9KTp0aGlzLmVuYWJsZSh7b25seVNlbGY6ITAsZW1pdEV2ZW50OiExfSkpOnRoaXMudmFsdWU9dGhpcy5fcGVuZGluZ1ZhbHVlPXR9fWNsYXNzIHRVIGV4dGVuZHMgUWp7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHFqKGUpLFhqKG4sZSkpLHRoaXMuY29udHJvbHM9dCx0aGlzLl9pbml0T2JzZXJ2YWJsZXMoKSx0aGlzLl9zZXRVcGRhdGVTdHJhdGVneShlKSx0aGlzLl9zZXRVcENvbnRyb2xzKCksdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtvbmx5U2VsZjohMCxlbWl0RXZlbnQ6ISF0aGlzLmFzeW5jVmFsaWRhdG9yfSl9cmVnaXN0ZXJDb250cm9sKHQsZSl7cmV0dXJuIHRoaXMuY29udHJvbHNbdF0/dGhpcy5jb250cm9sc1t0XToodGhpcy5jb250cm9sc1t0XT1lLGUuc2V0UGFyZW50KHRoaXMpLGUuX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKHRoaXMuX29uQ29sbGVjdGlvbkNoYW5nZSksZSl9YWRkQ29udHJvbCh0LGUsbj17fSl7dGhpcy5yZWdpc3RlckNvbnRyb2wodCxlKSx0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe2VtaXRFdmVudDpuLmVtaXRFdmVudH0pLHRoaXMuX29uQ29sbGVjdGlvbkNoYW5nZSgpfXJlbW92ZUNvbnRyb2wodCxlPXt9KXt0aGlzLmNvbnRyb2xzW3RdJiZ0aGlzLmNvbnRyb2xzW3RdLl9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZSgoKCk9Pnt9KSksZGVsZXRlIHRoaXMuY29udHJvbHNbdF0sdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6ZS5lbWl0RXZlbnR9KSx0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UoKX1zZXRDb250cm9sKHQsZSxuPXt9KXt0aGlzLmNvbnRyb2xzW3RdJiZ0aGlzLmNvbnRyb2xzW3RdLl9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZSgoKCk9Pnt9KSksZGVsZXRlIHRoaXMuY29udHJvbHNbdF0sZSYmdGhpcy5yZWdpc3RlckNvbnRyb2wodCxlKSx0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe2VtaXRFdmVudDpuLmVtaXRFdmVudH0pLHRoaXMuX29uQ29sbGVjdGlvbkNoYW5nZSgpfWNvbnRhaW5zKHQpe3JldHVybiB0aGlzLmNvbnRyb2xzLmhhc093blByb3BlcnR5KHQpJiZ0aGlzLmNvbnRyb2xzW3RdLmVuYWJsZWR9c2V0VmFsdWUodCxlPXt9KXt0aGlzLl9jaGVja0FsbFZhbHVlc1ByZXNlbnQodCksT2JqZWN0LmtleXModCkuZm9yRWFjaCgobj0+e3RoaXMuX3Rocm93SWZDb250cm9sTWlzc2luZyhuKSx0aGlzLmNvbnRyb2xzW25dLnNldFZhbHVlKHRbbl0se29ubHlTZWxmOiEwLGVtaXRFdmVudDplLmVtaXRFdmVudH0pfSkpLHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eShlKX1wYXRjaFZhbHVlKHQsZT17fSl7bnVsbCE9dCYmKE9iamVjdC5rZXlzKHQpLmZvckVhY2goKG49Pnt0aGlzLmNvbnRyb2xzW25dJiZ0aGlzLmNvbnRyb2xzW25dLnBhdGNoVmFsdWUodFtuXSx7b25seVNlbGY6ITAsZW1pdEV2ZW50OmUuZW1pdEV2ZW50fSl9KSksdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KGUpKX1yZXNldCh0PXt9LGU9e30pe3RoaXMuX2ZvckVhY2hDaGlsZCgoKG4sbyk9PntuLnJlc2V0KHRbb10se29ubHlTZWxmOiEwLGVtaXRFdmVudDplLmVtaXRFdmVudH0pfSkpLHRoaXMuX3VwZGF0ZVByaXN0aW5lKGUpLHRoaXMuX3VwZGF0ZVRvdWNoZWQoZSksdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KGUpfWdldFJhd1ZhbHVlKCl7cmV0dXJuIHRoaXMuX3JlZHVjZUNoaWxkcmVuKHt9LCgodCxlLG4pPT4odFtuXT1lIGluc3RhbmNlb2YgJGo/ZS52YWx1ZTplLmdldFJhd1ZhbHVlKCksdCkpKX1fc3luY1BlbmRpbmdDb250cm9scygpe2xldCB0PXRoaXMuX3JlZHVjZUNoaWxkcmVuKCExLCgodCxlKT0+ISFlLl9zeW5jUGVuZGluZ0NvbnRyb2xzKCl8fHQpKTtyZXR1cm4gdCYmdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtvbmx5U2VsZjohMH0pLHR9X3Rocm93SWZDb250cm9sTWlzc2luZyh0KXtpZighT2JqZWN0LmtleXModGhpcy5jb250cm9scykubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiXG4gICAgICAgIFRoZXJlIGFyZSBubyBmb3JtIGNvbnRyb2xzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGdyb3VwIHlldC4gSWYgeW91J3JlIHVzaW5nIG5nTW9kZWwsXG4gICAgICAgIHlvdSBtYXkgd2FudCB0byBjaGVjayBuZXh0IHRpY2sgKGUuZy4gdXNlIHNldFRpbWVvdXQpLlxuICAgICAgIik7aWYoIXRoaXMuY29udHJvbHNbdF0pdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBmb3JtIGNvbnRyb2wgd2l0aCBuYW1lOiAke3R9LmApfV9mb3JFYWNoQ2hpbGQodCl7T2JqZWN0LmtleXModGhpcy5jb250cm9scykuZm9yRWFjaCgoZT0+e2NvbnN0IG49dGhpcy5jb250cm9sc1tlXTtuJiZ0KG4sZSl9KSl9X3NldFVwQ29udHJvbHMoKXt0aGlzLl9mb3JFYWNoQ2hpbGQoKHQ9Pnt0LnNldFBhcmVudCh0aGlzKSx0Ll9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZSh0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UpfSkpfV91cGRhdGVWYWx1ZSgpe3RoaXMudmFsdWU9dGhpcy5fcmVkdWNlVmFsdWUoKX1fYW55Q29udHJvbHModCl7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXModGhpcy5jb250cm9scykpe2NvbnN0IG49dGhpcy5jb250cm9sc1tlXTtpZih0aGlzLmNvbnRhaW5zKGUpJiZ0KG4pKXJldHVybiEwfXJldHVybiExfV9yZWR1Y2VWYWx1ZSgpe3JldHVybiB0aGlzLl9yZWR1Y2VDaGlsZHJlbih7fSwoKHQsZSxuKT0+KChlLmVuYWJsZWR8fHRoaXMuZGlzYWJsZWQpJiYodFtuXT1lLnZhbHVlKSx0KSkpfV9yZWR1Y2VDaGlsZHJlbih0LGUpe2xldCBuPXQ7cmV0dXJuIHRoaXMuX2ZvckVhY2hDaGlsZCgoKHQsbyk9PntuPWUobix0LG8pfSkpLG59X2FsbENvbnRyb2xzRGlzYWJsZWQoKXtmb3IoY29uc3QgdCBvZiBPYmplY3Qua2V5cyh0aGlzLmNvbnRyb2xzKSlpZih0aGlzLmNvbnRyb2xzW3RdLmVuYWJsZWQpcmV0dXJuITE7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuY29udHJvbHMpLmxlbmd0aD4wfHx0aGlzLmRpc2FibGVkfV9jaGVja0FsbFZhbHVlc1ByZXNlbnQodCl7dGhpcy5fZm9yRWFjaENoaWxkKCgoZSxuKT0+e2lmKHZvaWQgMD09PXRbbl0pdGhyb3cgbmV3IEVycm9yKGBNdXN0IHN1cHBseSBhIHZhbHVlIGZvciBmb3JtIGNvbnRyb2wgd2l0aCBuYW1lOiAnJHtufScuYCl9KSl9fWNsYXNzIGVVIGV4dGVuZHMgUWp7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHFqKGUpLFhqKG4sZSkpLHRoaXMuY29udHJvbHM9dCx0aGlzLl9pbml0T2JzZXJ2YWJsZXMoKSx0aGlzLl9zZXRVcGRhdGVTdHJhdGVneShlKSx0aGlzLl9zZXRVcENvbnRyb2xzKCksdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtvbmx5U2VsZjohMCxlbWl0RXZlbnQ6ISF0aGlzLmFzeW5jVmFsaWRhdG9yfSl9YXQodCl7cmV0dXJuIHRoaXMuY29udHJvbHNbdF19cHVzaCh0LGU9e30pe3RoaXMuY29udHJvbHMucHVzaCh0KSx0aGlzLl9yZWdpc3RlckNvbnRyb2wodCksdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6ZS5lbWl0RXZlbnR9KSx0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UoKX1pbnNlcnQodCxlLG49e30pe3RoaXMuY29udHJvbHMuc3BsaWNlKHQsMCxlKSx0aGlzLl9yZWdpc3RlckNvbnRyb2woZSksdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6bi5lbWl0RXZlbnR9KX1yZW1vdmVBdCh0LGU9e30pe3RoaXMuY29udHJvbHNbdF0mJnRoaXMuY29udHJvbHNbdF0uX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKCgoKT0+e30pKSx0aGlzLmNvbnRyb2xzLnNwbGljZSh0LDEpLHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OmUuZW1pdEV2ZW50fSl9c2V0Q29udHJvbCh0LGUsbj17fSl7dGhpcy5jb250cm9sc1t0XSYmdGhpcy5jb250cm9sc1t0XS5fcmVnaXN0ZXJPbkNvbGxlY3Rpb25DaGFuZ2UoKCgpPT57fSkpLHRoaXMuY29udHJvbHMuc3BsaWNlKHQsMSksZSYmKHRoaXMuY29udHJvbHMuc3BsaWNlKHQsMCxlKSx0aGlzLl9yZWdpc3RlckNvbnRyb2woZSkpLHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50Om4uZW1pdEV2ZW50fSksdGhpcy5fb25Db2xsZWN0aW9uQ2hhbmdlKCl9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmNvbnRyb2xzLmxlbmd0aH1zZXRWYWx1ZSh0LGU9e30pe3RoaXMuX2NoZWNrQWxsVmFsdWVzUHJlc2VudCh0KSx0LmZvckVhY2goKCh0LG4pPT57dGhpcy5fdGhyb3dJZkNvbnRyb2xNaXNzaW5nKG4pLHRoaXMuYXQobikuc2V0VmFsdWUodCx7b25seVNlbGY6ITAsZW1pdEV2ZW50OmUuZW1pdEV2ZW50fSl9KSksdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KGUpfXBhdGNoVmFsdWUodCxlPXt9KXtudWxsIT10JiYodC5mb3JFYWNoKCgodCxuKT0+e3RoaXMuYXQobikmJnRoaXMuYXQobikucGF0Y2hWYWx1ZSh0LHtvbmx5U2VsZjohMCxlbWl0RXZlbnQ6ZS5lbWl0RXZlbnR9KX0pKSx0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoZSkpfXJlc2V0KHQ9W10sZT17fSl7dGhpcy5fZm9yRWFjaENoaWxkKCgobixvKT0+e24ucmVzZXQodFtvXSx7b25seVNlbGY6ITAsZW1pdEV2ZW50OmUuZW1pdEV2ZW50fSl9KSksdGhpcy5fdXBkYXRlUHJpc3RpbmUoZSksdGhpcy5fdXBkYXRlVG91Y2hlZChlKSx0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoZSl9Z2V0UmF3VmFsdWUoKXtyZXR1cm4gdGhpcy5jb250cm9scy5tYXAoKHQ9PnQgaW5zdGFuY2VvZiAkaj90LnZhbHVlOnQuZ2V0UmF3VmFsdWUoKSkpfWNsZWFyKHQ9e30pe3RoaXMuY29udHJvbHMubGVuZ3RoPDF8fCh0aGlzLl9mb3JFYWNoQ2hpbGQoKHQ9PnQuX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKCgoKT0+e30pKSkpLHRoaXMuY29udHJvbHMuc3BsaWNlKDApLHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OnQuZW1pdEV2ZW50fSkpfV9zeW5jUGVuZGluZ0NvbnRyb2xzKCl7bGV0IHQ9dGhpcy5jb250cm9scy5yZWR1Y2UoKCh0LGUpPT4hIWUuX3N5bmNQZW5kaW5nQ29udHJvbHMoKXx8dCksITEpO3JldHVybiB0JiZ0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe29ubHlTZWxmOiEwfSksdH1fdGhyb3dJZkNvbnRyb2xNaXNzaW5nKHQpe2lmKCF0aGlzLmNvbnRyb2xzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlxuICAgICAgICBUaGVyZSBhcmUgbm8gZm9ybSBjb250cm9scyByZWdpc3RlcmVkIHdpdGggdGhpcyBhcnJheSB5ZXQuIElmIHlvdSdyZSB1c2luZyBuZ01vZGVsLFxuICAgICAgICB5b3UgbWF5IHdhbnQgdG8gY2hlY2sgbmV4dCB0aWNrIChlLmcuIHVzZSBzZXRUaW1lb3V0KS5cbiAgICAgICIpO2lmKCF0aGlzLmF0KHQpKXRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgZm9ybSBjb250cm9sIGF0IGluZGV4ICR7dH1gKX1fZm9yRWFjaENoaWxkKHQpe3RoaXMuY29udHJvbHMuZm9yRWFjaCgoKGUsbik9Pnt0KGUsbil9KSl9X3VwZGF0ZVZhbHVlKCl7dGhpcy52YWx1ZT10aGlzLmNvbnRyb2xzLmZpbHRlcigodD0+dC5lbmFibGVkfHx0aGlzLmRpc2FibGVkKSkubWFwKCh0PT50LnZhbHVlKSl9X2FueUNvbnRyb2xzKHQpe3JldHVybiB0aGlzLmNvbnRyb2xzLnNvbWUoKGU9PmUuZW5hYmxlZCYmdChlKSkpfV9zZXRVcENvbnRyb2xzKCl7dGhpcy5fZm9yRWFjaENoaWxkKCh0PT50aGlzLl9yZWdpc3RlckNvbnRyb2wodCkpKX1fY2hlY2tBbGxWYWx1ZXNQcmVzZW50KHQpe3RoaXMuX2ZvckVhY2hDaGlsZCgoKGUsbik9PntpZih2b2lkIDA9PT10W25dKXRocm93IG5ldyBFcnJvcihgTXVzdCBzdXBwbHkgYSB2YWx1ZSBmb3IgZm9ybSBjb250cm9sIGF0IGluZGV4OiAke259LmApfSkpfV9hbGxDb250cm9sc0Rpc2FibGVkKCl7Zm9yKGNvbnN0IHQgb2YgdGhpcy5jb250cm9scylpZih0LmVuYWJsZWQpcmV0dXJuITE7cmV0dXJuIHRoaXMuY29udHJvbHMubGVuZ3RoPjB8fHRoaXMuZGlzYWJsZWR9X3JlZ2lzdGVyQ29udHJvbCh0KXt0LnNldFBhcmVudCh0aGlzKSx0Ll9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZSh0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UpfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3QgblU9e3Byb3ZpZGU6Q2osdXNlRXhpc3Rpbmc6cWUoKCgpPT5pVSkpfSxvVT1Qcm9taXNlLnJlc29sdmUobnVsbCk7Y2xhc3MgaVUgZXh0ZW5kcyBDantjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5zdWJtaXR0ZWQ9ITEsdGhpcy5fZGlyZWN0aXZlcz1bXSx0aGlzLm5nU3VibWl0PW5ldyBMaCx0aGlzLmZvcm09bmV3IHRVKHt9LGNqKHQpLHBqKGUpKX1uZ0FmdGVyVmlld0luaXQoKXt0aGlzLl9zZXRVcGRhdGVTdHJhdGVneSgpfWdldCBmb3JtRGlyZWN0aXZlKCl7cmV0dXJuIHRoaXN9Z2V0IGNvbnRyb2woKXtyZXR1cm4gdGhpcy5mb3JtfWdldCBwYXRoKCl7cmV0dXJuW119Z2V0IGNvbnRyb2xzKCl7cmV0dXJuIHRoaXMuZm9ybS5jb250cm9sc31hZGRDb250cm9sKHQpe29VLnRoZW4oKCgpPT57Y29uc3QgZT10aGlzLl9maW5kQ29udGFpbmVyKHQucGF0aCk7dC5jb250cm9sPWUucmVnaXN0ZXJDb250cm9sKHQubmFtZSx0LmNvbnRyb2wpLEVqKHQuY29udHJvbCx0KSx0LmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiExfSksdGhpcy5fZGlyZWN0aXZlcy5wdXNoKHQpfSkpfWdldENvbnRyb2wodCl7cmV0dXJuIHRoaXMuZm9ybS5nZXQodC5wYXRoKX1yZW1vdmVDb250cm9sKHQpe29VLnRoZW4oKCgpPT57Y29uc3QgZT10aGlzLl9maW5kQ29udGFpbmVyKHQucGF0aCk7ZSYmZS5yZW1vdmVDb250cm9sKHQubmFtZSksVmoodGhpcy5fZGlyZWN0aXZlcyx0KX0pKX1hZGRGb3JtR3JvdXAodCl7b1UudGhlbigoKCk9Pntjb25zdCBlPXRoaXMuX2ZpbmRDb250YWluZXIodC5wYXRoKSxuPW5ldyB0VSh7fSk7SWoobix0KSxlLnJlZ2lzdGVyQ29udHJvbCh0Lm5hbWUsbiksbi51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6ITF9KX0pKX1yZW1vdmVGb3JtR3JvdXAodCl7b1UudGhlbigoKCk9Pntjb25zdCBlPXRoaXMuX2ZpbmRDb250YWluZXIodC5wYXRoKTtlJiZlLnJlbW92ZUNvbnRyb2wodC5uYW1lKX0pKX1nZXRGb3JtR3JvdXAodCl7cmV0dXJuIHRoaXMuZm9ybS5nZXQodC5wYXRoKX11cGRhdGVNb2RlbCh0LGUpe29VLnRoZW4oKCgpPT57dGhpcy5mb3JtLmdldCh0LnBhdGgpLnNldFZhbHVlKGUpfSkpfXNldFZhbHVlKHQpe3RoaXMuY29udHJvbC5zZXRWYWx1ZSh0KX1vblN1Ym1pdCh0KXtyZXR1cm4gdGhpcy5zdWJtaXR0ZWQ9ITAsTGoodGhpcy5mb3JtLHRoaXMuX2RpcmVjdGl2ZXMpLHRoaXMubmdTdWJtaXQuZW1pdCh0KSwhMX1vblJlc2V0KCl7dGhpcy5yZXNldEZvcm0oKX1yZXNldEZvcm0odCl7dGhpcy5mb3JtLnJlc2V0KHQpLHRoaXMuc3VibWl0dGVkPSExfV9zZXRVcGRhdGVTdHJhdGVneSgpe3RoaXMub3B0aW9ucyYmbnVsbCE9dGhpcy5vcHRpb25zLnVwZGF0ZU9uJiYodGhpcy5mb3JtLl91cGRhdGVPbj10aGlzLm9wdGlvbnMudXBkYXRlT24pfV9maW5kQ29udGFpbmVyKHQpe3JldHVybiB0LnBvcCgpLHQubGVuZ3RoP3RoaXMuZm9ybS5nZXQodCk6dGhpcy5mb3JtfX1pVS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8aVUpKFNtKEdWLDEwKSxTbShXViwxMCkpfSxpVS7JtWRpcj1sbyh7dHlwZTppVSxzZWxlY3RvcnM6W1siZm9ybSIsMywibmdOb0Zvcm0iLCIiLDMsImZvcm1Hcm91cCIsIiJdLFsibmctZm9ybSJdLFsiIiwibmdGb3JtIiwiIl1dLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgic3VibWl0IiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblN1Ym1pdChlKX0pKSgicmVzZXQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25SZXNldCgpfSkpfSxpbnB1dHM6e29wdGlvbnM6WyJuZ0Zvcm1PcHRpb25zIiwib3B0aW9ucyJdfSxvdXRwdXRzOntuZ1N1Ym1pdDoibmdTdWJtaXQifSxleHBvcnRBczpbIm5nRm9ybSJdLGZlYXR1cmVzOltwZyhbblVdKSx4cF19KSxpVS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbR1ZdfV19LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbV1ZdfV19XSxpVS5wcm9wRGVjb3JhdG9ycz17b3B0aW9uczpbe3R5cGU6eHksYXJnczpbIm5nRm9ybU9wdGlvbnMiXX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGlVLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6ImZvcm06bm90KFtuZ05vRm9ybV0pOm5vdChbZm9ybUdyb3VwXSksbmctZm9ybSxbbmdGb3JtXSIscHJvdmlkZXJzOltuVV0saG9zdDp7IihzdWJtaXQpIjoib25TdWJtaXQoJGV2ZW50KSIsIihyZXNldCkiOiJvblJlc2V0KCkifSxvdXRwdXRzOlsibmdTdWJtaXQiXSxleHBvcnRBczoibmdGb3JtIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbR1ZdfV19LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbV1ZdfV19XX0pLHtvcHRpb25zOlt7dHlwZTp4eSxhcmdzOlsibmdGb3JtT3B0aW9ucyJdfV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIGFVIGV4dGVuZHMgQ2p7bmdPbkluaXQoKXt0aGlzLl9jaGVja1BhcmVudFR5cGUoKSx0aGlzLmZvcm1EaXJlY3RpdmUuYWRkRm9ybUdyb3VwKHRoaXMpfW5nT25EZXN0cm95KCl7dGhpcy5mb3JtRGlyZWN0aXZlJiZ0aGlzLmZvcm1EaXJlY3RpdmUucmVtb3ZlRm9ybUdyb3VwKHRoaXMpfWdldCBjb250cm9sKCl7cmV0dXJuIHRoaXMuZm9ybURpcmVjdGl2ZS5nZXRGb3JtR3JvdXAodGhpcyl9Z2V0IHBhdGgoKXtyZXR1cm4gRGoobnVsbD09dGhpcy5uYW1lP3RoaXMubmFtZTp0aGlzLm5hbWUudG9TdHJpbmcoKSx0aGlzLl9wYXJlbnQpfWdldCBmb3JtRGlyZWN0aXZlKCl7cmV0dXJuIHRoaXMuX3BhcmVudD90aGlzLl9wYXJlbnQuZm9ybURpcmVjdGl2ZTpudWxsfV9jaGVja1BhcmVudFR5cGUoKXt9fWFVLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYShhVSkpKShufHxhVSl9fSkoKSxhVS7JtWRpcj1sbyh7dHlwZTphVSxmZWF0dXJlczpbeHBdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChhVSxbe3R5cGU6Q3l9XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgclV7c3RhdGljIG1vZGVsUGFyZW50RXhjZXB0aW9uKCl7dGhyb3cgbmV3IEVycm9yKGBcbiAgICAgIG5nTW9kZWwgY2Fubm90IGJlIHVzZWQgdG8gcmVnaXN0ZXIgZm9ybSBjb250cm9scyB3aXRoIGEgcGFyZW50IGZvcm1Hcm91cCBkaXJlY3RpdmUuICBUcnkgdXNpbmdcbiAgICAgIGZvcm1Hcm91cCdzIHBhcnRuZXIgZGlyZWN0aXZlICJmb3JtQ29udHJvbE5hbWUiIGluc3RlYWQuICBFeGFtcGxlOlxuXG4gICAgICAke1BqfVxuXG4gICAgICBPciwgaWYgeW91J2QgbGlrZSB0byBhdm9pZCByZWdpc3RlcmluZyB0aGlzIGZvcm0gY29udHJvbCwgaW5kaWNhdGUgdGhhdCBpdCdzIHN0YW5kYWxvbmUgaW4gbmdNb2RlbE9wdGlvbnM6XG5cbiAgICAgIEV4YW1wbGU6XG5cbiAgICAgIFxuICAgIDxkaXYgW2Zvcm1Hcm91cF09Im15R3JvdXAiPlxuICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9ImZpcnN0TmFtZSI+XG4gICAgICAgPGlucHV0IFsobmdNb2RlbCldPSJzaG93TW9yZUNvbnRyb2xzIiBbbmdNb2RlbE9wdGlvbnNdPSJ7c3RhbmRhbG9uZTogdHJ1ZX0iPlxuICAgIDwvZGl2PlxuICBgKX1zdGF0aWMgZm9ybUdyb3VwTmFtZUV4Y2VwdGlvbigpe3Rocm93IG5ldyBFcnJvcihgXG4gICAgICBuZ01vZGVsIGNhbm5vdCBiZSB1c2VkIHRvIHJlZ2lzdGVyIGZvcm0gY29udHJvbHMgd2l0aCBhIHBhcmVudCBmb3JtR3JvdXBOYW1lIG9yIGZvcm1BcnJheU5hbWUgZGlyZWN0aXZlLlxuXG4gICAgICBPcHRpb24gMTogVXNlIGZvcm1Db250cm9sTmFtZSBpbnN0ZWFkIG9mIG5nTW9kZWwgKHJlYWN0aXZlIHN0cmF0ZWd5KTpcblxuICAgICAgJHt3an1cblxuICAgICAgT3B0aW9uIDI6ICBVcGRhdGUgbmdNb2RlbCdzIHBhcmVudCBiZSBuZ01vZGVsR3JvdXAgKHRlbXBsYXRlLWRyaXZlbiBzdHJhdGVneSk6XG5cbiAgICAgICR7a2p9YCl9c3RhdGljIG1pc3NpbmdOYW1lRXhjZXB0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCdJZiBuZ01vZGVsIGlzIHVzZWQgd2l0aGluIGEgZm9ybSB0YWcsIGVpdGhlciB0aGUgbmFtZSBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgb3IgdGhlIGZvcm1cbiAgICAgIGNvbnRyb2wgbXVzdCBiZSBkZWZpbmVkIGFzIFwnc3RhbmRhbG9uZVwnIGluIG5nTW9kZWxPcHRpb25zLlxuXG4gICAgICBFeGFtcGxlIDE6IDxpbnB1dCBbKG5nTW9kZWwpXT0icGVyc29uLmZpcnN0TmFtZSIgbmFtZT0iZmlyc3QiPlxuICAgICAgRXhhbXBsZSAyOiA8aW5wdXQgWyhuZ01vZGVsKV09InBlcnNvbi5maXJzdE5hbWUiIFtuZ01vZGVsT3B0aW9uc109IntzdGFuZGFsb25lOiB0cnVlfSI+Jyl9c3RhdGljIG1vZGVsR3JvdXBQYXJlbnRFeGNlcHRpb24oKXt0aHJvdyBuZXcgRXJyb3IoYFxuICAgICAgbmdNb2RlbEdyb3VwIGNhbm5vdCBiZSB1c2VkIHdpdGggYSBwYXJlbnQgZm9ybUdyb3VwIGRpcmVjdGl2ZS5cblxuICAgICAgT3B0aW9uIDE6IFVzZSBmb3JtR3JvdXBOYW1lIGluc3RlYWQgb2YgbmdNb2RlbEdyb3VwIChyZWFjdGl2ZSBzdHJhdGVneSk6XG5cbiAgICAgICR7d2p9XG5cbiAgICAgIE9wdGlvbiAyOiAgVXNlIGEgcmVndWxhciBmb3JtIHRhZyBpbnN0ZWFkIG9mIHRoZSBmb3JtR3JvdXAgZGlyZWN0aXZlICh0ZW1wbGF0ZS1kcml2ZW4gc3RyYXRlZ3kpOlxuXG4gICAgICAke2tqfWApfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3Qgc1U9e3Byb3ZpZGU6Q2osdXNlRXhpc3Rpbmc6cWUoKCgpPT5sVSkpfTtjbGFzcyBsVSBleHRlbmRzIGFVe2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcigpLHRoaXMuX3BhcmVudD10LHRoaXMuX3NldFZhbGlkYXRvcnMoZSksdGhpcy5fc2V0QXN5bmNWYWxpZGF0b3JzKG4pfV9jaGVja1BhcmVudFR5cGUoKXt0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBsVXx8dGhpcy5fcGFyZW50IGluc3RhbmNlb2YgaVV8fCJ1bmRlZmluZWQiIT10eXBlb2YgbmdEZXZNb2RlJiYhbmdEZXZNb2RlfHxyVS5tb2RlbEdyb3VwUGFyZW50RXhjZXB0aW9uKCl9fWxVLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxsVSkoU20oQ2osNSksU20oR1YsMTApLFNtKFdWLDEwKSl9LGxVLsm1ZGlyPWxvKHt0eXBlOmxVLHNlbGVjdG9yczpbWyIiLCJuZ01vZGVsR3JvdXAiLCIiXV0saW5wdXRzOntuYW1lOlsibmdNb2RlbEdyb3VwIiwibmFtZSJdfSxleHBvcnRBczpbIm5nTW9kZWxHcm91cCJdLGZlYXR1cmVzOltwZyhbc1VdKSx4cF19KSxsVS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOkNqLGRlY29yYXRvcnM6W3t0eXBlOlJyfSx7dHlwZTpFcn1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W0dWXX1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W1dWXX1dfV0sbFUucHJvcERlY29yYXRvcnM9e25hbWU6W3t0eXBlOnh5LGFyZ3M6WyJuZ01vZGVsR3JvdXAiXX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGxVLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IltuZ01vZGVsR3JvdXBdIixwcm92aWRlcnM6W3NVXSxleHBvcnRBczoibmdNb2RlbEdyb3VwIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkNqLGRlY29yYXRvcnM6W3t0eXBlOlJyfSx7dHlwZTpFcn1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W0dWXX1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W1dWXX1dfV19KSx7bmFtZTpbe3R5cGU6eHksYXJnczpbIm5nTW9kZWxHcm91cCJdfV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IGNVPXtwcm92aWRlOk1qLHVzZUV4aXN0aW5nOnFlKCgoKT0+cFUpKX0sZFU9UHJvbWlzZS5yZXNvbHZlKG51bGwpO2NsYXNzIHBVIGV4dGVuZHMgTWp7Y29uc3RydWN0b3IodCxlLG4sbyl7c3VwZXIoKSx0aGlzLmNvbnRyb2w9bmV3ICRqLHRoaXMuX3JlZ2lzdGVyZWQ9ITEsdGhpcy51cGRhdGU9bmV3IExoLHRoaXMuX3BhcmVudD10LHRoaXMuX3NldFZhbGlkYXRvcnMoZSksdGhpcy5fc2V0QXN5bmNWYWxpZGF0b3JzKG4pLHRoaXMudmFsdWVBY2Nlc3Nvcj1Caih0aGlzLG8pfW5nT25DaGFuZ2VzKHQpe3RoaXMuX2NoZWNrRm9yRXJyb3JzKCksdGhpcy5fcmVnaXN0ZXJlZHx8dGhpcy5fc2V0VXBDb250cm9sKCksImlzRGlzYWJsZWQiaW4gdCYmdGhpcy5fdXBkYXRlRGlzYWJsZWQodCksRmoodCx0aGlzLnZpZXdNb2RlbCkmJih0aGlzLl91cGRhdGVWYWx1ZSh0aGlzLm1vZGVsKSx0aGlzLnZpZXdNb2RlbD10aGlzLm1vZGVsKX1uZ09uRGVzdHJveSgpe3RoaXMuZm9ybURpcmVjdGl2ZSYmdGhpcy5mb3JtRGlyZWN0aXZlLnJlbW92ZUNvbnRyb2wodGhpcyl9Z2V0IHBhdGgoKXtyZXR1cm4gdGhpcy5fcGFyZW50P0RqKHRoaXMubmFtZSx0aGlzLl9wYXJlbnQpOlt0aGlzLm5hbWVdfWdldCBmb3JtRGlyZWN0aXZlKCl7cmV0dXJuIHRoaXMuX3BhcmVudD90aGlzLl9wYXJlbnQuZm9ybURpcmVjdGl2ZTpudWxsfXZpZXdUb01vZGVsVXBkYXRlKHQpe3RoaXMudmlld01vZGVsPXQsdGhpcy51cGRhdGUuZW1pdCh0KX1fc2V0VXBDb250cm9sKCl7dGhpcy5fc2V0VXBkYXRlU3RyYXRlZ3koKSx0aGlzLl9pc1N0YW5kYWxvbmUoKT90aGlzLl9zZXRVcFN0YW5kYWxvbmUoKTp0aGlzLmZvcm1EaXJlY3RpdmUuYWRkQ29udHJvbCh0aGlzKSx0aGlzLl9yZWdpc3RlcmVkPSEwfV9zZXRVcGRhdGVTdHJhdGVneSgpe3RoaXMub3B0aW9ucyYmbnVsbCE9dGhpcy5vcHRpb25zLnVwZGF0ZU9uJiYodGhpcy5jb250cm9sLl91cGRhdGVPbj10aGlzLm9wdGlvbnMudXBkYXRlT24pfV9pc1N0YW5kYWxvbmUoKXtyZXR1cm4hdGhpcy5fcGFyZW50fHwhKCF0aGlzLm9wdGlvbnN8fCF0aGlzLm9wdGlvbnMuc3RhbmRhbG9uZSl9X3NldFVwU3RhbmRhbG9uZSgpe0VqKHRoaXMuY29udHJvbCx0aGlzKSx0aGlzLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiExfSl9X2NoZWNrRm9yRXJyb3JzKCl7dGhpcy5faXNTdGFuZGFsb25lKCl8fHRoaXMuX2NoZWNrUGFyZW50VHlwZSgpLHRoaXMuX2NoZWNrTmFtZSgpfV9jaGVja1BhcmVudFR5cGUoKXsoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJighKHRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIGxVKSYmdGhpcy5fcGFyZW50IGluc3RhbmNlb2YgYVU/clUuZm9ybUdyb3VwTmFtZUV4Y2VwdGlvbigpOnRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIGxVfHx0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBpVXx8clUubW9kZWxQYXJlbnRFeGNlcHRpb24oKSl9X2NoZWNrTmFtZSgpe3RoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLm5hbWUmJih0aGlzLm5hbWU9dGhpcy5vcHRpb25zLm5hbWUpLHRoaXMuX2lzU3RhbmRhbG9uZSgpfHx0aGlzLm5hbWV8fCJ1bmRlZmluZWQiIT10eXBlb2YgbmdEZXZNb2RlJiYhbmdEZXZNb2RlfHxyVS5taXNzaW5nTmFtZUV4Y2VwdGlvbigpfV91cGRhdGVWYWx1ZSh0KXtkVS50aGVuKCgoKT0+e3RoaXMuY29udHJvbC5zZXRWYWx1ZSh0LHtlbWl0Vmlld1RvTW9kZWxDaGFuZ2U6ITF9KX0pKX1fdXBkYXRlRGlzYWJsZWQodCl7Y29uc3QgZT10LmlzRGlzYWJsZWQuY3VycmVudFZhbHVlLG49IiI9PT1lfHxlJiYiZmFsc2UiIT09ZTtkVS50aGVuKCgoKT0+e24mJiF0aGlzLmNvbnRyb2wuZGlzYWJsZWQ/dGhpcy5jb250cm9sLmRpc2FibGUoKTohbiYmdGhpcy5jb250cm9sLmRpc2FibGVkJiZ0aGlzLmNvbnRyb2wuZW5hYmxlKCl9KSl9fXBVLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxwVSkoU20oQ2osOSksU20oR1YsMTApLFNtKFdWLDEwKSxTbShJViwxMCkpfSxwVS7JtWRpcj1sbyh7dHlwZTpwVSxzZWxlY3RvcnM6W1siIiwibmdNb2RlbCIsIiIsMywiZm9ybUNvbnRyb2xOYW1lIiwiIiwzLCJmb3JtQ29udHJvbCIsIiJdXSxpbnB1dHM6e25hbWU6Im5hbWUiLGlzRGlzYWJsZWQ6WyJkaXNhYmxlZCIsImlzRGlzYWJsZWQiXSxtb2RlbDpbIm5nTW9kZWwiLCJtb2RlbCJdLG9wdGlvbnM6WyJuZ01vZGVsT3B0aW9ucyIsIm9wdGlvbnMiXX0sb3V0cHV0czp7dXBkYXRlOiJuZ01vZGVsQ2hhbmdlIn0sZXhwb3J0QXM6WyJuZ01vZGVsIl0sZmVhdHVyZXM6W3BnKFtjVV0pLHhwLEJvXX0pLHBVLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6Q2osZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOlJyfV19LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbR1ZdfV19LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbV1ZdfV19LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbSVZdfV19XSxwVS5wcm9wRGVjb3JhdG9ycz17bmFtZTpbe3R5cGU6eHl9XSxpc0Rpc2FibGVkOlt7dHlwZTp4eSxhcmdzOlsiZGlzYWJsZWQiXX1dLG1vZGVsOlt7dHlwZTp4eSxhcmdzOlsibmdNb2RlbCJdfV0sb3B0aW9uczpbe3R5cGU6eHksYXJnczpbIm5nTW9kZWxPcHRpb25zIl19XSx1cGRhdGU6W3t0eXBlOk95LGFyZ3M6WyJuZ01vZGVsQ2hhbmdlIl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChwVSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbmdNb2RlbF06bm90KFtmb3JtQ29udHJvbE5hbWVdKTpub3QoW2Zvcm1Db250cm9sXSkiLHByb3ZpZGVyczpbY1VdLGV4cG9ydEFzOiJuZ01vZGVsIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkNqLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpScn1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W0dWXX1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W1dWXX1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W0lWXX1dfV19KSx7dXBkYXRlOlt7dHlwZTpPeSxhcmdzOlsibmdNb2RlbENoYW5nZSJdfV0sbmFtZTpbe3R5cGU6eHl9XSxpc0Rpc2FibGVkOlt7dHlwZTp4eSxhcmdzOlsiZGlzYWJsZWQiXX1dLG1vZGVsOlt7dHlwZTp4eSxhcmdzOlsibmdNb2RlbCJdfV0sb3B0aW9uczpbe3R5cGU6eHksYXJnczpbIm5nTW9kZWxPcHRpb25zIl19XX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgbVV7fW1VLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxtVSl9LG1VLsm1ZGlyPWxvKHt0eXBlOm1VLHNlbGVjdG9yczpbWyJmb3JtIiwzLCJuZ05vRm9ybSIsIiIsMywibmdOYXRpdmVWYWxpZGF0ZSIsIiJdXSxob3N0QXR0cnM6WyJub3ZhbGlkYXRlIiwiIl19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKG1VLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6ImZvcm06bm90KFtuZ05vRm9ybV0pOm5vdChbbmdOYXRpdmVWYWxpZGF0ZV0pIixob3N0Ontub3ZhbGlkYXRlOiIifX1dfV0sbnVsbCxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IHVVPXtwcm92aWRlOklWLHVzZUV4aXN0aW5nOnFlKCgoKT0+ZlUpKSxtdWx0aTohMH07Y2xhc3MgZlUgZXh0ZW5kcyB6Vnt3cml0ZVZhbHVlKHQpe3RoaXMuc2V0UHJvcGVydHkoInZhbHVlIixudWxsPT10PyIiOnQpfXJlZ2lzdGVyT25DaGFuZ2UodCl7dGhpcy5vbkNoYW5nZT1lPT57dCgiIj09ZT9udWxsOnBhcnNlRmxvYXQoZSkpfX19ZlUuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKGZVKSkpKG58fGZVKX19KSgpLGZVLsm1ZGlyPWxvKHt0eXBlOmZVLHNlbGVjdG9yczpbWyJpbnB1dCIsInR5cGUiLCJudW1iZXIiLCJmb3JtQ29udHJvbE5hbWUiLCIiXSxbImlucHV0IiwidHlwZSIsIm51bWJlciIsImZvcm1Db250cm9sIiwiIl0sWyJpbnB1dCIsInR5cGUiLCJudW1iZXIiLCJuZ01vZGVsIiwiIl1dLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgiaW5wdXQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uQ2hhbmdlKGUudGFyZ2V0LnZhbHVlKX0pKSgiYmx1ciIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblRvdWNoZWQoKX0pKX0sZmVhdHVyZXM6W3BnKFt1VV0pLHhwXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZlUsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiaW5wdXRbdHlwZT1udW1iZXJdW2Zvcm1Db250cm9sTmFtZV0saW5wdXRbdHlwZT1udW1iZXJdW2Zvcm1Db250cm9sXSxpbnB1dFt0eXBlPW51bWJlcl1bbmdNb2RlbF0iLGhvc3Q6eyIoaW5wdXQpIjoib25DaGFuZ2UoJGV2ZW50LnRhcmdldC52YWx1ZSkiLCIoYmx1cikiOiJvblRvdWNoZWQoKSJ9LHByb3ZpZGVyczpbdVVdfV19XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgZ1U9e3Byb3ZpZGU6SVYsdXNlRXhpc3Rpbmc6cWUoKCgpPT55VSkpLG11bHRpOiEwfTtjbGFzcyBoVXt9aFUuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGhVKX0saFUuybVtb2Q9YW8oe3R5cGU6aFV9KSxoVS7JtWluaj12bih7fSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChoVSxbe3R5cGU6QXl9XSxudWxsLG51bGwpO2NsYXNzIGJVe2NvbnN0cnVjdG9yKCl7dGhpcy5fYWNjZXNzb3JzPVtdfWFkZCh0LGUpe3RoaXMuX2FjY2Vzc29ycy5wdXNoKFt0LGVdKX1yZW1vdmUodCl7Zm9yKGxldCBlPXRoaXMuX2FjY2Vzc29ycy5sZW5ndGgtMTtlPj0wOy0tZSlpZih0aGlzLl9hY2Nlc3NvcnNbZV1bMV09PT10KXJldHVybiB2b2lkIHRoaXMuX2FjY2Vzc29ycy5zcGxpY2UoZSwxKX1zZWxlY3QodCl7dGhpcy5fYWNjZXNzb3JzLmZvckVhY2goKGU9Pnt0aGlzLl9pc1NhbWVHcm91cChlLHQpJiZlWzFdIT09dCYmZVsxXS5maXJlVW5jaGVjayh0LnZhbHVlKX0pKX1faXNTYW1lR3JvdXAodCxlKXtyZXR1cm4hIXRbMF0uY29udHJvbCYmdFswXS5fcGFyZW50PT09ZS5fY29udHJvbC5fcGFyZW50JiZ0WzFdLm5hbWU9PT1lLm5hbWV9fWJVLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxiVSl9LGJVLsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIG5ldyBiVX0sdG9rZW46YlUscHJvdmlkZWRJbjpoVX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoYlUsW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOmhVfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5bXX0pLG51bGwpO2NsYXNzIHlVIGV4dGVuZHMgelZ7Y29uc3RydWN0b3IodCxlLG4sbyl7c3VwZXIodCxlKSx0aGlzLl9yZWdpc3RyeT1uLHRoaXMuX2luamVjdG9yPW8sdGhpcy5vbkNoYW5nZT0oKT0+e319bmdPbkluaXQoKXt0aGlzLl9jb250cm9sPXRoaXMuX2luamVjdG9yLmdldChNaiksdGhpcy5fY2hlY2tOYW1lKCksdGhpcy5fcmVnaXN0cnkuYWRkKHRoaXMuX2NvbnRyb2wsdGhpcyl9bmdPbkRlc3Ryb3koKXt0aGlzLl9yZWdpc3RyeS5yZW1vdmUodGhpcyl9d3JpdGVWYWx1ZSh0KXt0aGlzLl9zdGF0ZT10PT09dGhpcy52YWx1ZSx0aGlzLnNldFByb3BlcnR5KCJjaGVja2VkIix0aGlzLl9zdGF0ZSl9cmVnaXN0ZXJPbkNoYW5nZSh0KXt0aGlzLl9mbj10LHRoaXMub25DaGFuZ2U9KCk9Pnt0KHRoaXMudmFsdWUpLHRoaXMuX3JlZ2lzdHJ5LnNlbGVjdCh0aGlzKX19ZmlyZVVuY2hlY2sodCl7dGhpcy53cml0ZVZhbHVlKHQpfV9jaGVja05hbWUoKXt0aGlzLm5hbWUmJnRoaXMuZm9ybUNvbnRyb2xOYW1lJiZ0aGlzLm5hbWUhPT10aGlzLmZvcm1Db250cm9sTmFtZSYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiYoZnVuY3Rpb24gdCgpe3Rocm93IG5ldyBFcnJvcignXG4gICAgICBJZiB5b3UgZGVmaW5lIGJvdGggYSBuYW1lIGFuZCBhIGZvcm1Db250cm9sTmFtZSBhdHRyaWJ1dGUgb24geW91ciByYWRpbyBidXR0b24sIHRoZWlyIHZhbHVlc1xuICAgICAgbXVzdCBtYXRjaC4gRXg6IDxpbnB1dCB0eXBlPSJyYWRpbyIgZm9ybUNvbnRyb2xOYW1lPSJmb29kIiBuYW1lPSJmb29kIj5cbiAgICAnKX0pKCksIXRoaXMubmFtZSYmdGhpcy5mb3JtQ29udHJvbE5hbWUmJih0aGlzLm5hbWU9dGhpcy5mb3JtQ29udHJvbE5hbWUpfX15VS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8eVUpKFNtKENnKSxTbShoZyksU20oYlUpLFNtKHJwKSl9LHlVLsm1ZGlyPWxvKHt0eXBlOnlVLHNlbGVjdG9yczpbWyJpbnB1dCIsInR5cGUiLCJyYWRpbyIsImZvcm1Db250cm9sTmFtZSIsIiJdLFsiaW5wdXQiLCJ0eXBlIiwicmFkaW8iLCJmb3JtQ29udHJvbCIsIiJdLFsiaW5wdXQiLCJ0eXBlIiwicmFkaW8iLCJuZ01vZGVsIiwiIl1dLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgiY2hhbmdlIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uQ2hhbmdlKCl9KSkoImJsdXIiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25Ub3VjaGVkKCl9KSl9LGlucHV0czp7bmFtZToibmFtZSIsZm9ybUNvbnRyb2xOYW1lOiJmb3JtQ29udHJvbE5hbWUiLHZhbHVlOiJ2YWx1ZSJ9LGZlYXR1cmVzOltwZyhbZ1VdKSx4cF19KSx5VS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOkNnfSx7dHlwZTpoZ30se3R5cGU6YlV9LHt0eXBlOnJwfV0seVUucHJvcERlY29yYXRvcnM9e25hbWU6W3t0eXBlOnh5fV0sZm9ybUNvbnRyb2xOYW1lOlt7dHlwZTp4eX1dLHZhbHVlOlt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHlVLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6ImlucHV0W3R5cGU9cmFkaW9dW2Zvcm1Db250cm9sTmFtZV0saW5wdXRbdHlwZT1yYWRpb11bZm9ybUNvbnRyb2xdLGlucHV0W3R5cGU9cmFkaW9dW25nTW9kZWxdIixob3N0OnsiKGNoYW5nZSkiOiJvbkNoYW5nZSgpIiwiKGJsdXIpIjoib25Ub3VjaGVkKCkifSxwcm92aWRlcnM6W2dVXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkNnfSx7dHlwZTpoZ30se3R5cGU6YlV9LHt0eXBlOnJwfV19KSx7bmFtZTpbe3R5cGU6eHl9XSxmb3JtQ29udHJvbE5hbWU6W3t0eXBlOnh5fV0sdmFsdWU6W3t0eXBlOnh5fV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IF9VPXtwcm92aWRlOklWLHVzZUV4aXN0aW5nOnFlKCgoKT0+Q1UpKSxtdWx0aTohMH07Y2xhc3MgQ1UgZXh0ZW5kcyB6Vnt3cml0ZVZhbHVlKHQpe3RoaXMuc2V0UHJvcGVydHkoInZhbHVlIixwYXJzZUZsb2F0KHQpKX1yZWdpc3Rlck9uQ2hhbmdlKHQpe3RoaXMub25DaGFuZ2U9ZT0+e3QoIiI9PWU/bnVsbDpwYXJzZUZsb2F0KGUpKX19fUNVLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYShDVSkpKShufHxDVSl9fSkoKSxDVS7JtWRpcj1sbyh7dHlwZTpDVSxzZWxlY3RvcnM6W1siaW5wdXQiLCJ0eXBlIiwicmFuZ2UiLCJmb3JtQ29udHJvbE5hbWUiLCIiXSxbImlucHV0IiwidHlwZSIsInJhbmdlIiwiZm9ybUNvbnRyb2wiLCIiXSxbImlucHV0IiwidHlwZSIsInJhbmdlIiwibmdNb2RlbCIsIiJdXSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezEmZSYmVm0oImNoYW5nZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25DaGFuZ2UoZS50YXJnZXQudmFsdWUpfSkpKCJpbnB1dCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25DaGFuZ2UoZS50YXJnZXQudmFsdWUpfSkpKCJibHVyIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uVG91Y2hlZCgpfSkpfSxmZWF0dXJlczpbcGcoW19VXSkseHBdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChDVSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJpbnB1dFt0eXBlPXJhbmdlXVtmb3JtQ29udHJvbE5hbWVdLGlucHV0W3R5cGU9cmFuZ2VdW2Zvcm1Db250cm9sXSxpbnB1dFt0eXBlPXJhbmdlXVtuZ01vZGVsXSIsaG9zdDp7IihjaGFuZ2UpIjoib25DaGFuZ2UoJGV2ZW50LnRhcmdldC52YWx1ZSkiLCIoaW5wdXQpIjoib25DaGFuZ2UoJGV2ZW50LnRhcmdldC52YWx1ZSkiLCIoYmx1cikiOiJvblRvdWNoZWQoKSJ9LHByb3ZpZGVyczpbX1VdfV19XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgTVU9bmV3IEdhKCJOZ01vZGVsV2l0aEZvcm1Db250cm9sV2FybmluZyIpLHZVPXtwcm92aWRlOk1qLHVzZUV4aXN0aW5nOnFlKCgoKT0+eFUpKX07Y2xhc3MgeFUgZXh0ZW5kcyBNantjb25zdHJ1Y3Rvcih0LGUsbixvKXtzdXBlcigpLHRoaXMuX25nTW9kZWxXYXJuaW5nQ29uZmlnPW8sdGhpcy51cGRhdGU9bmV3IExoLHRoaXMuX25nTW9kZWxXYXJuaW5nU2VudD0hMSx0aGlzLl9zZXRWYWxpZGF0b3JzKHQpLHRoaXMuX3NldEFzeW5jVmFsaWRhdG9ycyhlKSx0aGlzLnZhbHVlQWNjZXNzb3I9QmoodGhpcyxuKX1zZXQgaXNEaXNhYmxlZCh0KXsoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJlNqLmRpc2FibGVkQXR0cldhcm5pbmcoKX1uZ09uQ2hhbmdlcyh0KXtpZih0aGlzLl9pc0NvbnRyb2xDaGFuZ2VkKHQpKXtjb25zdCBlPXQuZm9ybS5wcmV2aW91c1ZhbHVlO2UmJlJqKGUsdGhpcywhMSksRWoodGhpcy5mb3JtLHRoaXMpLHRoaXMuY29udHJvbC5kaXNhYmxlZCYmdGhpcy52YWx1ZUFjY2Vzc29yLnNldERpc2FibGVkU3RhdGUmJnRoaXMudmFsdWVBY2Nlc3Nvci5zZXREaXNhYmxlZFN0YXRlKCEwKSx0aGlzLmZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiExfSl9RmoodCx0aGlzLnZpZXdNb2RlbCkmJigoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmpqKCJmb3JtQ29udHJvbCIseFUsdGhpcyx0aGlzLl9uZ01vZGVsV2FybmluZ0NvbmZpZyksdGhpcy5mb3JtLnNldFZhbHVlKHRoaXMubW9kZWwpLHRoaXMudmlld01vZGVsPXRoaXMubW9kZWwpfW5nT25EZXN0cm95KCl7dGhpcy5mb3JtJiZSaih0aGlzLmZvcm0sdGhpcywhMSl9Z2V0IHBhdGgoKXtyZXR1cm5bXX1nZXQgY29udHJvbCgpe3JldHVybiB0aGlzLmZvcm19dmlld1RvTW9kZWxVcGRhdGUodCl7dGhpcy52aWV3TW9kZWw9dCx0aGlzLnVwZGF0ZS5lbWl0KHQpfV9pc0NvbnRyb2xDaGFuZ2VkKHQpe3JldHVybiB0Lmhhc093blByb3BlcnR5KCJmb3JtIil9fXhVLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx4VSkoU20oR1YsMTApLFNtKFdWLDEwKSxTbShJViwxMCksU20oTVUsOCkpfSx4VS7JtWRpcj1sbyh7dHlwZTp4VSxzZWxlY3RvcnM6W1siIiwiZm9ybUNvbnRyb2wiLCIiXV0saW5wdXRzOntpc0Rpc2FibGVkOlsiZGlzYWJsZWQiLCJpc0Rpc2FibGVkIl0sZm9ybTpbImZvcm1Db250cm9sIiwiZm9ybSJdLG1vZGVsOlsibmdNb2RlbCIsIm1vZGVsIl19LG91dHB1dHM6e3VwZGF0ZToibmdNb2RlbENoYW5nZSJ9LGV4cG9ydEFzOlsibmdGb3JtIl0sZmVhdHVyZXM6W3BnKFt2VV0pLHhwLEJvXX0pLHhVLl9uZ01vZGVsV2FybmluZ1NlbnRPbmNlPSExLHhVLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOkRyfSx7dHlwZTprcixhcmdzOltHVl19XX0se3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOkRyfSx7dHlwZTprcixhcmdzOltXVl19XX0se3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOkRyfSx7dHlwZTprcixhcmdzOltJVl19XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltNVV19XX1dLHhVLnByb3BEZWNvcmF0b3JzPXtmb3JtOlt7dHlwZTp4eSxhcmdzOlsiZm9ybUNvbnRyb2wiXX1dLGlzRGlzYWJsZWQ6W3t0eXBlOnh5LGFyZ3M6WyJkaXNhYmxlZCJdfV0sbW9kZWw6W3t0eXBlOnh5LGFyZ3M6WyJuZ01vZGVsIl19XSx1cGRhdGU6W3t0eXBlOk95LGFyZ3M6WyJuZ01vZGVsQ2hhbmdlIl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh4VSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbZm9ybUNvbnRyb2xdIixwcm92aWRlcnM6W3ZVXSxleHBvcnRBczoibmdGb3JtIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbR1ZdfV19LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbV1ZdfV19LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbSVZdfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbTVVdfV19XX0pLHt1cGRhdGU6W3t0eXBlOk95LGFyZ3M6WyJuZ01vZGVsQ2hhbmdlIl19XSxpc0Rpc2FibGVkOlt7dHlwZTp4eSxhcmdzOlsiZGlzYWJsZWQiXX1dLGZvcm06W3t0eXBlOnh5LGFyZ3M6WyJmb3JtQ29udHJvbCJdfV0sbW9kZWw6W3t0eXBlOnh5LGFyZ3M6WyJuZ01vZGVsIl19XX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgT1U9e3Byb3ZpZGU6Q2osdXNlRXhpc3Rpbmc6cWUoKCgpPT5QVSkpfTtjbGFzcyBQVSBleHRlbmRzIENqe2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoKSx0aGlzLnZhbGlkYXRvcnM9dCx0aGlzLmFzeW5jVmFsaWRhdG9ycz1lLHRoaXMuc3VibWl0dGVkPSExLHRoaXMuX29uQ29sbGVjdGlvbkNoYW5nZT0oKT0+dGhpcy5fdXBkYXRlRG9tVmFsdWUoKSx0aGlzLmRpcmVjdGl2ZXM9W10sdGhpcy5mb3JtPW51bGwsdGhpcy5uZ1N1Ym1pdD1uZXcgTGgsdGhpcy5fc2V0VmFsaWRhdG9ycyh0KSx0aGlzLl9zZXRBc3luY1ZhbGlkYXRvcnMoZSl9bmdPbkNoYW5nZXModCl7dGhpcy5fY2hlY2tGb3JtUHJlc2VudCgpLHQuaGFzT3duUHJvcGVydHkoImZvcm0iKSYmKHRoaXMuX3VwZGF0ZVZhbGlkYXRvcnMoKSx0aGlzLl91cGRhdGVEb21WYWx1ZSgpLHRoaXMuX3VwZGF0ZVJlZ2lzdHJhdGlvbnMoKSx0aGlzLl9vbGRGb3JtPXRoaXMuZm9ybSl9bmdPbkRlc3Ryb3koKXt0aGlzLmZvcm0mJihOaih0aGlzLmZvcm0sdGhpcyksdGhpcy5mb3JtLl9vbkNvbGxlY3Rpb25DaGFuZ2U9PT10aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UmJnRoaXMuZm9ybS5fcmVnaXN0ZXJPbkNvbGxlY3Rpb25DaGFuZ2UoKCgpPT57fSkpKX1nZXQgZm9ybURpcmVjdGl2ZSgpe3JldHVybiB0aGlzfWdldCBjb250cm9sKCl7cmV0dXJuIHRoaXMuZm9ybX1nZXQgcGF0aCgpe3JldHVybltdfWFkZENvbnRyb2wodCl7Y29uc3QgZT10aGlzLmZvcm0uZ2V0KHQucGF0aCk7cmV0dXJuIEVqKGUsdCksZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6ITF9KSx0aGlzLmRpcmVjdGl2ZXMucHVzaCh0KSxlfWdldENvbnRyb2wodCl7cmV0dXJuIHRoaXMuZm9ybS5nZXQodC5wYXRoKX1yZW1vdmVDb250cm9sKHQpe1JqKHQuY29udHJvbHx8bnVsbCx0LCExKSxWaih0aGlzLmRpcmVjdGl2ZXMsdCl9YWRkRm9ybUdyb3VwKHQpe3RoaXMuX3NldFVwRm9ybUNvbnRhaW5lcih0KX1yZW1vdmVGb3JtR3JvdXAodCl7dGhpcy5fY2xlYW5VcEZvcm1Db250YWluZXIodCl9Z2V0Rm9ybUdyb3VwKHQpe3JldHVybiB0aGlzLmZvcm0uZ2V0KHQucGF0aCl9YWRkRm9ybUFycmF5KHQpe3RoaXMuX3NldFVwRm9ybUNvbnRhaW5lcih0KX1yZW1vdmVGb3JtQXJyYXkodCl7dGhpcy5fY2xlYW5VcEZvcm1Db250YWluZXIodCl9Z2V0Rm9ybUFycmF5KHQpe3JldHVybiB0aGlzLmZvcm0uZ2V0KHQucGF0aCl9dXBkYXRlTW9kZWwodCxlKXt0aGlzLmZvcm0uZ2V0KHQucGF0aCkuc2V0VmFsdWUoZSl9b25TdWJtaXQodCl7cmV0dXJuIHRoaXMuc3VibWl0dGVkPSEwLExqKHRoaXMuZm9ybSx0aGlzLmRpcmVjdGl2ZXMpLHRoaXMubmdTdWJtaXQuZW1pdCh0KSwhMX1vblJlc2V0KCl7dGhpcy5yZXNldEZvcm0oKX1yZXNldEZvcm0odCl7dGhpcy5mb3JtLnJlc2V0KHQpLHRoaXMuc3VibWl0dGVkPSExfV91cGRhdGVEb21WYWx1ZSgpe3RoaXMuZGlyZWN0aXZlcy5mb3JFYWNoKCh0PT57Y29uc3QgZT10LmNvbnRyb2wsbj10aGlzLmZvcm0uZ2V0KHQucGF0aCk7ZSE9PW4mJihSaihlfHxudWxsLHQpLG4gaW5zdGFuY2VvZiAkaiYmKEVqKG4sdCksdC5jb250cm9sPW4pKX0pKSx0aGlzLmZvcm0uX3VwZGF0ZVRyZWVWYWxpZGl0eSh7ZW1pdEV2ZW50OiExfSl9X3NldFVwRm9ybUNvbnRhaW5lcih0KXtjb25zdCBlPXRoaXMuZm9ybS5nZXQodC5wYXRoKTtJaihlLHQpLGUudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiExfSl9X2NsZWFuVXBGb3JtQ29udGFpbmVyKHQpe2lmKHRoaXMuZm9ybSl7Y29uc3QgZT10aGlzLmZvcm0uZ2V0KHQucGF0aCk7ZSYmKGZ1bmN0aW9uIG4odCxlKXtyZXR1cm4gTmoodCxlKX0pKGUsdCkmJmUudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiExfSl9fV91cGRhdGVSZWdpc3RyYXRpb25zKCl7dGhpcy5mb3JtLl9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZSh0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UpLHRoaXMuX29sZEZvcm0mJnRoaXMuX29sZEZvcm0uX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKCgoKT0+e30pKX1fdXBkYXRlVmFsaWRhdG9ycygpe1RqKHRoaXMuZm9ybSx0aGlzKSx0aGlzLl9vbGRGb3JtJiZOaih0aGlzLl9vbGRGb3JtLHRoaXMpfV9jaGVja0Zvcm1QcmVzZW50KCl7dGhpcy5mb3JtfHwidW5kZWZpbmVkIiE9dHlwZW9mIG5nRGV2TW9kZSYmIW5nRGV2TW9kZXx8U2oubWlzc2luZ0Zvcm1FeGNlcHRpb24oKX19UFUuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFBVKShTbShHViwxMCksU20oV1YsMTApKX0sUFUuybVkaXI9bG8oe3R5cGU6UFUsc2VsZWN0b3JzOltbIiIsImZvcm1Hcm91cCIsIiJdXSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezEmZSYmVm0oInN1Ym1pdCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25TdWJtaXQoZSl9KSkoInJlc2V0IiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uUmVzZXQoKX0pKX0saW5wdXRzOntmb3JtOlsiZm9ybUdyb3VwIiwiZm9ybSJdfSxvdXRwdXRzOntuZ1N1Ym1pdDoibmdTdWJtaXQifSxleHBvcnRBczpbIm5nRm9ybSJdLGZlYXR1cmVzOltwZyhbT1VdKSx4cCxCb119KSxQVS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbR1ZdfV19LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbV1ZdfV19XSxQVS5wcm9wRGVjb3JhdG9ycz17Zm9ybTpbe3R5cGU6eHksYXJnczpbImZvcm1Hcm91cCJdfV0sbmdTdWJtaXQ6W3t0eXBlOk95fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUFUsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Zvcm1Hcm91cF0iLHByb3ZpZGVyczpbT1VdLGhvc3Q6eyIoc3VibWl0KSI6Im9uU3VibWl0KCRldmVudCkiLCIocmVzZXQpIjoib25SZXNldCgpIn0sZXhwb3J0QXM6Im5nRm9ybSJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W0dWXX1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W1dWXX1dfV19KSx7Zm9ybTpbe3R5cGU6eHksYXJnczpbImZvcm1Hcm91cCJdfV0sbmdTdWJtaXQ6W3t0eXBlOk95fV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IHdVPXtwcm92aWRlOkNqLHVzZUV4aXN0aW5nOnFlKCgoKT0+a1UpKX07Y2xhc3Mga1UgZXh0ZW5kcyBhVXtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIoKSx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9zZXRWYWxpZGF0b3JzKGUpLHRoaXMuX3NldEFzeW5jVmFsaWRhdG9ycyhuKX1fY2hlY2tQYXJlbnRUeXBlKCl7RVUodGhpcy5fcGFyZW50KSYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZTai5ncm91cFBhcmVudEV4Y2VwdGlvbigpfX1rVS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8a1UpKFNtKENqLDEzKSxTbShHViwxMCksU20oV1YsMTApKX0sa1UuybVkaXI9bG8oe3R5cGU6a1Usc2VsZWN0b3JzOltbIiIsImZvcm1Hcm91cE5hbWUiLCIiXV0saW5wdXRzOntuYW1lOlsiZm9ybUdyb3VwTmFtZSIsIm5hbWUiXX0sZmVhdHVyZXM6W3BnKFt3VV0pLHhwXX0pLGtVLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6Q2osZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOlJyfSx7dHlwZTpFcn1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W0dWXX1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W1dWXX1dfV0sa1UucHJvcERlY29yYXRvcnM9e25hbWU6W3t0eXBlOnh5LGFyZ3M6WyJmb3JtR3JvdXBOYW1lIl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChrVSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbZm9ybUdyb3VwTmFtZV0iLHByb3ZpZGVyczpbd1VdfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6Q2osZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOlJyfSx7dHlwZTpFcn1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W0dWXX1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W1dWXX1dfV19KSx7bmFtZTpbe3R5cGU6eHksYXJnczpbImZvcm1Hcm91cE5hbWUiXX1dfSk7Y29uc3QgU1U9e3Byb3ZpZGU6Q2osdXNlRXhpc3Rpbmc6cWUoKCgpPT5EVSkpfTtjbGFzcyBEVSBleHRlbmRzIENqe2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcigpLHRoaXMuX3BhcmVudD10LHRoaXMuX3NldFZhbGlkYXRvcnMoZSksdGhpcy5fc2V0QXN5bmNWYWxpZGF0b3JzKG4pfW5nT25Jbml0KCl7dGhpcy5fY2hlY2tQYXJlbnRUeXBlKCksdGhpcy5mb3JtRGlyZWN0aXZlLmFkZEZvcm1BcnJheSh0aGlzKX1uZ09uRGVzdHJveSgpe3RoaXMuZm9ybURpcmVjdGl2ZSYmdGhpcy5mb3JtRGlyZWN0aXZlLnJlbW92ZUZvcm1BcnJheSh0aGlzKX1nZXQgY29udHJvbCgpe3JldHVybiB0aGlzLmZvcm1EaXJlY3RpdmUuZ2V0Rm9ybUFycmF5KHRoaXMpfWdldCBmb3JtRGlyZWN0aXZlKCl7cmV0dXJuIHRoaXMuX3BhcmVudD90aGlzLl9wYXJlbnQuZm9ybURpcmVjdGl2ZTpudWxsfWdldCBwYXRoKCl7cmV0dXJuIERqKG51bGw9PXRoaXMubmFtZT90aGlzLm5hbWU6dGhpcy5uYW1lLnRvU3RyaW5nKCksdGhpcy5fcGFyZW50KX1fY2hlY2tQYXJlbnRUeXBlKCl7RVUodGhpcy5fcGFyZW50KSYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZTai5hcnJheVBhcmVudEV4Y2VwdGlvbigpfX1mdW5jdGlvbiBFVSh0KXtyZXR1cm4hKHQgaW5zdGFuY2VvZiBrVXx8dCBpbnN0YW5jZW9mIFBVfHx0IGluc3RhbmNlb2YgRFUpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9EVS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8RFUpKFNtKENqLDEzKSxTbShHViwxMCksU20oV1YsMTApKX0sRFUuybVkaXI9bG8oe3R5cGU6RFUsc2VsZWN0b3JzOltbIiIsImZvcm1BcnJheU5hbWUiLCIiXV0saW5wdXRzOntuYW1lOlsiZm9ybUFycmF5TmFtZSIsIm5hbWUiXX0sZmVhdHVyZXM6W3BnKFtTVV0pLHhwXX0pLERVLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6Q2osZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOlJyfSx7dHlwZTpFcn1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W0dWXX1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W1dWXX1dfV0sRFUucHJvcERlY29yYXRvcnM9e25hbWU6W3t0eXBlOnh5LGFyZ3M6WyJmb3JtQXJyYXlOYW1lIl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChEVSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbZm9ybUFycmF5TmFtZV0iLHByb3ZpZGVyczpbU1VdfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6Q2osZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOlJyfSx7dHlwZTpFcn1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W0dWXX1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W1dWXX1dfV19KSx7bmFtZTpbe3R5cGU6eHksYXJnczpbImZvcm1BcnJheU5hbWUiXX1dfSk7Y29uc3QgUlU9e3Byb3ZpZGU6TWosdXNlRXhpc3Rpbmc6cWUoKCgpPT5BVSkpfTtjbGFzcyBBVSBleHRlbmRzIE1qe2NvbnN0cnVjdG9yKHQsZSxuLG8saSl7c3VwZXIoKSx0aGlzLl9uZ01vZGVsV2FybmluZ0NvbmZpZz1pLHRoaXMuX2FkZGVkPSExLHRoaXMudXBkYXRlPW5ldyBMaCx0aGlzLl9uZ01vZGVsV2FybmluZ1NlbnQ9ITEsdGhpcy5fcGFyZW50PXQsdGhpcy5fc2V0VmFsaWRhdG9ycyhlKSx0aGlzLl9zZXRBc3luY1ZhbGlkYXRvcnMobiksdGhpcy52YWx1ZUFjY2Vzc29yPUJqKHRoaXMsbyl9c2V0IGlzRGlzYWJsZWQodCl7KCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZTai5kaXNhYmxlZEF0dHJXYXJuaW5nKCl9bmdPbkNoYW5nZXModCl7dGhpcy5fYWRkZWR8fHRoaXMuX3NldFVwQ29udHJvbCgpLEZqKHQsdGhpcy52aWV3TW9kZWwpJiYoKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZqaigiZm9ybUNvbnRyb2xOYW1lIixBVSx0aGlzLHRoaXMuX25nTW9kZWxXYXJuaW5nQ29uZmlnKSx0aGlzLnZpZXdNb2RlbD10aGlzLm1vZGVsLHRoaXMuZm9ybURpcmVjdGl2ZS51cGRhdGVNb2RlbCh0aGlzLHRoaXMubW9kZWwpKX1uZ09uRGVzdHJveSgpe3RoaXMuZm9ybURpcmVjdGl2ZSYmdGhpcy5mb3JtRGlyZWN0aXZlLnJlbW92ZUNvbnRyb2wodGhpcyl9dmlld1RvTW9kZWxVcGRhdGUodCl7dGhpcy52aWV3TW9kZWw9dCx0aGlzLnVwZGF0ZS5lbWl0KHQpfWdldCBwYXRoKCl7cmV0dXJuIERqKG51bGw9PXRoaXMubmFtZT90aGlzLm5hbWU6dGhpcy5uYW1lLnRvU3RyaW5nKCksdGhpcy5fcGFyZW50KX1nZXQgZm9ybURpcmVjdGl2ZSgpe3JldHVybiB0aGlzLl9wYXJlbnQ/dGhpcy5fcGFyZW50LmZvcm1EaXJlY3RpdmU6bnVsbH1fY2hlY2tQYXJlbnRUeXBlKCl7KCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiYoISh0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBrVSkmJnRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIGFVP1NqLm5nTW9kZWxHcm91cEV4Y2VwdGlvbigpOnRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIGtVfHx0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBQVXx8dGhpcy5fcGFyZW50IGluc3RhbmNlb2YgRFV8fFNqLmNvbnRyb2xQYXJlbnRFeGNlcHRpb24oKSl9X3NldFVwQ29udHJvbCgpe3RoaXMuX2NoZWNrUGFyZW50VHlwZSgpLHRoaXMuY29udHJvbD10aGlzLmZvcm1EaXJlY3RpdmUuYWRkQ29udHJvbCh0aGlzKSx0aGlzLmNvbnRyb2wuZGlzYWJsZWQmJnRoaXMudmFsdWVBY2Nlc3Nvci5zZXREaXNhYmxlZFN0YXRlJiZ0aGlzLnZhbHVlQWNjZXNzb3Iuc2V0RGlzYWJsZWRTdGF0ZSghMCksdGhpcy5fYWRkZWQ9ITB9fUFVLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxBVSkoU20oQ2osMTMpLFNtKEdWLDEwKSxTbShXViwxMCksU20oSVYsMTApLFNtKE1VLDgpKX0sQVUuybVkaXI9bG8oe3R5cGU6QVUsc2VsZWN0b3JzOltbIiIsImZvcm1Db250cm9sTmFtZSIsIiJdXSxpbnB1dHM6e2lzRGlzYWJsZWQ6WyJkaXNhYmxlZCIsImlzRGlzYWJsZWQiXSxuYW1lOlsiZm9ybUNvbnRyb2xOYW1lIiwibmFtZSJdLG1vZGVsOlsibmdNb2RlbCIsIm1vZGVsIl19LG91dHB1dHM6e3VwZGF0ZToibmdNb2RlbENoYW5nZSJ9LGZlYXR1cmVzOltwZyhbUlVdKSx4cCxCb119KSxBVS5fbmdNb2RlbFdhcm5pbmdTZW50T25jZT0hMSxBVS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOkNqLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpScn0se3R5cGU6RXJ9XX0se3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOkRyfSx7dHlwZTprcixhcmdzOltHVl19XX0se3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOkRyfSx7dHlwZTprcixhcmdzOltXVl19XX0se3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOkRyfSx7dHlwZTprcixhcmdzOltJVl19XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltNVV19XX1dLEFVLnByb3BEZWNvcmF0b3JzPXtuYW1lOlt7dHlwZTp4eSxhcmdzOlsiZm9ybUNvbnRyb2xOYW1lIl19XSxpc0Rpc2FibGVkOlt7dHlwZTp4eSxhcmdzOlsiZGlzYWJsZWQiXX1dLG1vZGVsOlt7dHlwZTp4eSxhcmdzOlsibmdNb2RlbCJdfV0sdXBkYXRlOlt7dHlwZTpPeSxhcmdzOlsibmdNb2RlbENoYW5nZSJdfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQVUsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Zvcm1Db250cm9sTmFtZV0iLHByb3ZpZGVyczpbUlVdfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6Q2osZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOlJyfSx7dHlwZTpFcn1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W0dWXX1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W1dWXX1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W0lWXX1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W01VXX1dfV19KSx7dXBkYXRlOlt7dHlwZTpPeSxhcmdzOlsibmdNb2RlbENoYW5nZSJdfV0saXNEaXNhYmxlZDpbe3R5cGU6eHksYXJnczpbImRpc2FibGVkIl19XSxuYW1lOlt7dHlwZTp4eSxhcmdzOlsiZm9ybUNvbnRyb2xOYW1lIl19XSxtb2RlbDpbe3R5cGU6eHksYXJnczpbIm5nTW9kZWwiXX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBUVT17cHJvdmlkZTpJVix1c2VFeGlzdGluZzpxZSgoKCk9PnpVKSksbXVsdGk6ITB9O2Z1bmN0aW9uIE5VKHQsZSl7cmV0dXJuIG51bGw9PXQ/YCR7ZX1gOihlJiYib2JqZWN0Ij09dHlwZW9mIGUmJihlPSJPYmplY3QiKSxgJHt0fTogJHtlfWAuc2xpY2UoMCw1MCkpfWNsYXNzIHpVIGV4dGVuZHMgelZ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX29wdGlvbk1hcD1uZXcgTWFwLHRoaXMuX2lkQ291bnRlcj0wLHRoaXMuX2NvbXBhcmVXaXRoPU9iamVjdC5pc31zZXQgY29tcGFyZVdpdGgodCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSl0aHJvdyBuZXcgRXJyb3IoYGNvbXBhcmVXaXRoIG11c3QgYmUgYSBmdW5jdGlvbiwgYnV0IHJlY2VpdmVkICR7SlNPTi5zdHJpbmdpZnkodCl9YCk7dGhpcy5fY29tcGFyZVdpdGg9dH13cml0ZVZhbHVlKHQpe3RoaXMudmFsdWU9dDtjb25zdCBlPXRoaXMuX2dldE9wdGlvbklkKHQpO251bGw9PWUmJnRoaXMuc2V0UHJvcGVydHkoInNlbGVjdGVkSW5kZXgiLC0xKTtjb25zdCBuPU5VKGUsdCk7dGhpcy5zZXRQcm9wZXJ0eSgidmFsdWUiLG4pfXJlZ2lzdGVyT25DaGFuZ2UodCl7dGhpcy5vbkNoYW5nZT1lPT57dGhpcy52YWx1ZT10aGlzLl9nZXRPcHRpb25WYWx1ZShlKSx0KHRoaXMudmFsdWUpfX1fcmVnaXN0ZXJPcHRpb24oKXtyZXR1cm4odGhpcy5faWRDb3VudGVyKyspLnRvU3RyaW5nKCl9X2dldE9wdGlvbklkKHQpe2Zvcihjb25zdCBlIG9mIEFycmF5LmZyb20odGhpcy5fb3B0aW9uTWFwLmtleXMoKSkpaWYodGhpcy5fY29tcGFyZVdpdGgodGhpcy5fb3B0aW9uTWFwLmdldChlKSx0KSlyZXR1cm4gZTtyZXR1cm4gbnVsbH1fZ2V0T3B0aW9uVmFsdWUodCl7Y29uc3QgZT0oZnVuY3Rpb24gbih0KXtyZXR1cm4gdC5zcGxpdCgiOiIpWzBdfSkodCk7cmV0dXJuIHRoaXMuX29wdGlvbk1hcC5oYXMoZSk/dGhpcy5fb3B0aW9uTWFwLmdldChlKTp0fX16VS7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoelUpKSkobnx8elUpfX0pKCkselUuybVkaXI9bG8oe3R5cGU6elUsc2VsZWN0b3JzOltbInNlbGVjdCIsImZvcm1Db250cm9sTmFtZSIsIiIsMywibXVsdGlwbGUiLCIiXSxbInNlbGVjdCIsImZvcm1Db250cm9sIiwiIiwzLCJtdWx0aXBsZSIsIiJdLFsic2VsZWN0IiwibmdNb2RlbCIsIiIsMywibXVsdGlwbGUiLCIiXV0saG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJlZtKCJjaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uQ2hhbmdlKGUudGFyZ2V0LnZhbHVlKX0pKSgiYmx1ciIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblRvdWNoZWQoKX0pKX0saW5wdXRzOntjb21wYXJlV2l0aDoiY29tcGFyZVdpdGgifSxmZWF0dXJlczpbcGcoW1RVXSkseHBdfSkselUucHJvcERlY29yYXRvcnM9e2NvbXBhcmVXaXRoOlt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHpVLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6InNlbGVjdDpub3QoW211bHRpcGxlXSlbZm9ybUNvbnRyb2xOYW1lXSxzZWxlY3Q6bm90KFttdWx0aXBsZV0pW2Zvcm1Db250cm9sXSxzZWxlY3Q6bm90KFttdWx0aXBsZV0pW25nTW9kZWxdIixob3N0OnsiKGNoYW5nZSkiOiJvbkNoYW5nZSgkZXZlbnQudGFyZ2V0LnZhbHVlKSIsIihibHVyKSI6Im9uVG91Y2hlZCgpIn0scHJvdmlkZXJzOltUVV19XX1dLG51bGwse2NvbXBhcmVXaXRoOlt7dHlwZTp4eX1dfSk7Y2xhc3MgSVV7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuX2VsZW1lbnQ9dCx0aGlzLl9yZW5kZXJlcj1lLHRoaXMuX3NlbGVjdD1uLHRoaXMuX3NlbGVjdCYmKHRoaXMuaWQ9dGhpcy5fc2VsZWN0Ll9yZWdpc3Rlck9wdGlvbigpKX1zZXQgbmdWYWx1ZSh0KXtudWxsIT10aGlzLl9zZWxlY3QmJih0aGlzLl9zZWxlY3QuX29wdGlvbk1hcC5zZXQodGhpcy5pZCx0KSx0aGlzLl9zZXRFbGVtZW50VmFsdWUoTlUodGhpcy5pZCx0KSksdGhpcy5fc2VsZWN0LndyaXRlVmFsdWUodGhpcy5fc2VsZWN0LnZhbHVlKSl9c2V0IHZhbHVlKHQpe3RoaXMuX3NldEVsZW1lbnRWYWx1ZSh0KSx0aGlzLl9zZWxlY3QmJnRoaXMuX3NlbGVjdC53cml0ZVZhbHVlKHRoaXMuX3NlbGVjdC52YWx1ZSl9X3NldEVsZW1lbnRWYWx1ZSh0KXt0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsInZhbHVlIix0KX1uZ09uRGVzdHJveSgpe3RoaXMuX3NlbGVjdCYmKHRoaXMuX3NlbGVjdC5fb3B0aW9uTWFwLmRlbGV0ZSh0aGlzLmlkKSx0aGlzLl9zZWxlY3Qud3JpdGVWYWx1ZSh0aGlzLl9zZWxlY3QudmFsdWUpKX19SVUuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fElVKShTbShoZyksU20oQ2cpLFNtKHpVLDkpKX0sSVUuybVkaXI9bG8oe3R5cGU6SVUsc2VsZWN0b3JzOltbIm9wdGlvbiJdXSxpbnB1dHM6e25nVmFsdWU6Im5nVmFsdWUiLHZhbHVlOiJ2YWx1ZSJ9fSksSVUuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ30se3R5cGU6Q2d9LHt0eXBlOnpVLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpScn1dfV0sSVUucHJvcERlY29yYXRvcnM9e25nVmFsdWU6W3t0eXBlOnh5LGFyZ3M6WyJuZ1ZhbHVlIl19XSx2YWx1ZTpbe3R5cGU6eHksYXJnczpbInZhbHVlIl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChJVSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJvcHRpb24ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOkNnfSx7dHlwZTp6VSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6UnJ9XX1dfSkse25nVmFsdWU6W3t0eXBlOnh5LGFyZ3M6WyJuZ1ZhbHVlIl19XSx2YWx1ZTpbe3R5cGU6eHksYXJnczpbInZhbHVlIl19XX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgSFU9e3Byb3ZpZGU6SVYsdXNlRXhpc3Rpbmc6cWUoKCgpPT5MVSkpLG11bHRpOiEwfTtmdW5jdGlvbiBGVSh0LGUpe3JldHVybiBudWxsPT10P2Ake2V9YDooInN0cmluZyI9PXR5cGVvZiBlJiYoZT1gJyR7ZX0nYCksZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYoZT0iT2JqZWN0IiksYCR7dH06ICR7ZX1gLnNsaWNlKDAsNTApKX1jbGFzcyBMVSBleHRlbmRzIHpWe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9vcHRpb25NYXA9bmV3IE1hcCx0aGlzLl9pZENvdW50ZXI9MCx0aGlzLl9jb21wYXJlV2l0aD1PYmplY3QuaXN9c2V0IGNvbXBhcmVXaXRoKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkpdGhyb3cgbmV3IEVycm9yKGBjb21wYXJlV2l0aCBtdXN0IGJlIGEgZnVuY3Rpb24sIGJ1dCByZWNlaXZlZCAke0pTT04uc3RyaW5naWZ5KHQpfWApO3RoaXMuX2NvbXBhcmVXaXRoPXR9d3JpdGVWYWx1ZSh0KXtsZXQgZTtpZih0aGlzLnZhbHVlPXQsQXJyYXkuaXNBcnJheSh0KSl7Y29uc3Qgbj10Lm1hcCgodD0+dGhpcy5fZ2V0T3B0aW9uSWQodCkpKTtlPSh0LGUpPT57dC5fc2V0U2VsZWN0ZWQobi5pbmRleE9mKGUudG9TdHJpbmcoKSk+LTEpfX1lbHNlIGU9KHQsZSk9Pnt0Ll9zZXRTZWxlY3RlZCghMSl9O3RoaXMuX29wdGlvbk1hcC5mb3JFYWNoKGUpfXJlZ2lzdGVyT25DaGFuZ2UodCl7dGhpcy5vbkNoYW5nZT1lPT57Y29uc3Qgbj1bXTtpZih2b2lkIDAhPT1lLnNlbGVjdGVkT3B0aW9ucyl7Y29uc3QgdD1lLnNlbGVjdGVkT3B0aW9ucztmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl7Y29uc3Qgbz10Lml0ZW0oZSksaT10aGlzLl9nZXRPcHRpb25WYWx1ZShvLnZhbHVlKTtuLnB1c2goaSl9fWVsc2V7Y29uc3QgdD1lLm9wdGlvbnM7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2NvbnN0IG89dC5pdGVtKGUpO2lmKG8uc2VsZWN0ZWQpe2NvbnN0IHQ9dGhpcy5fZ2V0T3B0aW9uVmFsdWUoby52YWx1ZSk7bi5wdXNoKHQpfX19dGhpcy52YWx1ZT1uLHQobil9fV9yZWdpc3Rlck9wdGlvbih0KXtjb25zdCBlPSh0aGlzLl9pZENvdW50ZXIrKykudG9TdHJpbmcoKTtyZXR1cm4gdGhpcy5fb3B0aW9uTWFwLnNldChlLHQpLGV9X2dldE9wdGlvbklkKHQpe2Zvcihjb25zdCBlIG9mIEFycmF5LmZyb20odGhpcy5fb3B0aW9uTWFwLmtleXMoKSkpaWYodGhpcy5fY29tcGFyZVdpdGgodGhpcy5fb3B0aW9uTWFwLmdldChlKS5fdmFsdWUsdCkpcmV0dXJuIGU7cmV0dXJuIG51bGx9X2dldE9wdGlvblZhbHVlKHQpe2NvbnN0IGU9KGZ1bmN0aW9uIG4odCl7cmV0dXJuIHQuc3BsaXQoIjoiKVswXX0pKHQpO3JldHVybiB0aGlzLl9vcHRpb25NYXAuaGFzKGUpP3RoaXMuX29wdGlvbk1hcC5nZXQoZSkuX3ZhbHVlOnR9fUxVLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYShMVSkpKShufHxMVSl9fSkoKSxMVS7JtWRpcj1sbyh7dHlwZTpMVSxzZWxlY3RvcnM6W1sic2VsZWN0IiwibXVsdGlwbGUiLCIiLCJmb3JtQ29udHJvbE5hbWUiLCIiXSxbInNlbGVjdCIsIm11bHRpcGxlIiwiIiwiZm9ybUNvbnRyb2wiLCIiXSxbInNlbGVjdCIsIm11bHRpcGxlIiwiIiwibmdNb2RlbCIsIiJdXSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezEmZSYmVm0oImNoYW5nZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25DaGFuZ2UoZS50YXJnZXQpfSkpKCJibHVyIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uVG91Y2hlZCgpfSkpfSxpbnB1dHM6e2NvbXBhcmVXaXRoOiJjb21wYXJlV2l0aCJ9LGZlYXR1cmVzOltwZyhbSFVdKSx4cF19KSxMVS5wcm9wRGVjb3JhdG9ycz17Y29tcGFyZVdpdGg6W3t0eXBlOnh5fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoTFUsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3Rvcjoic2VsZWN0W211bHRpcGxlXVtmb3JtQ29udHJvbE5hbWVdLHNlbGVjdFttdWx0aXBsZV1bZm9ybUNvbnRyb2xdLHNlbGVjdFttdWx0aXBsZV1bbmdNb2RlbF0iLGhvc3Q6eyIoY2hhbmdlKSI6Im9uQ2hhbmdlKCRldmVudC50YXJnZXQpIiwiKGJsdXIpIjoib25Ub3VjaGVkKCkifSxwcm92aWRlcnM6W0hVXX1dfV0sbnVsbCx7Y29tcGFyZVdpdGg6W3t0eXBlOnh5fV19KTtjbGFzcyBCVXtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5fZWxlbWVudD10LHRoaXMuX3JlbmRlcmVyPWUsdGhpcy5fc2VsZWN0PW4sdGhpcy5fc2VsZWN0JiYodGhpcy5pZD10aGlzLl9zZWxlY3QuX3JlZ2lzdGVyT3B0aW9uKHRoaXMpKX1zZXQgbmdWYWx1ZSh0KXtudWxsIT10aGlzLl9zZWxlY3QmJih0aGlzLl92YWx1ZT10LHRoaXMuX3NldEVsZW1lbnRWYWx1ZShGVSh0aGlzLmlkLHQpKSx0aGlzLl9zZWxlY3Qud3JpdGVWYWx1ZSh0aGlzLl9zZWxlY3QudmFsdWUpKX1zZXQgdmFsdWUodCl7dGhpcy5fc2VsZWN0Pyh0aGlzLl92YWx1ZT10LHRoaXMuX3NldEVsZW1lbnRWYWx1ZShGVSh0aGlzLmlkLHQpKSx0aGlzLl9zZWxlY3Qud3JpdGVWYWx1ZSh0aGlzLl9zZWxlY3QudmFsdWUpKTp0aGlzLl9zZXRFbGVtZW50VmFsdWUodCl9X3NldEVsZW1lbnRWYWx1ZSh0KXt0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsInZhbHVlIix0KX1fc2V0U2VsZWN0ZWQodCl7dGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LCJzZWxlY3RlZCIsdCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9zZWxlY3QmJih0aGlzLl9zZWxlY3QuX29wdGlvbk1hcC5kZWxldGUodGhpcy5pZCksdGhpcy5fc2VsZWN0LndyaXRlVmFsdWUodGhpcy5fc2VsZWN0LnZhbHVlKSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KZnVuY3Rpb24gVlUodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3Q6cGFyc2VJbnQodCwxMCl9QlUuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEJVKShTbShoZyksU20oQ2cpLFNtKExVLDkpKX0sQlUuybVkaXI9bG8oe3R5cGU6QlUsc2VsZWN0b3JzOltbIm9wdGlvbiJdXSxpbnB1dHM6e25nVmFsdWU6Im5nVmFsdWUiLHZhbHVlOiJ2YWx1ZSJ9fSksQlUuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ30se3R5cGU6Q2d9LHt0eXBlOkxVLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpScn1dfV0sQlUucHJvcERlY29yYXRvcnM9e25nVmFsdWU6W3t0eXBlOnh5LGFyZ3M6WyJuZ1ZhbHVlIl19XSx2YWx1ZTpbe3R5cGU6eHksYXJnczpbInZhbHVlIl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChCVSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJvcHRpb24ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOkNnfSx7dHlwZTpMVSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6UnJ9XX1dfSkse25nVmFsdWU6W3t0eXBlOnh5LGFyZ3M6WyJuZ1ZhbHVlIl19XSx2YWx1ZTpbe3R5cGU6eHksYXJnczpbInZhbHVlIl19XX0pO2NsYXNzIGpVe2NvbnN0cnVjdG9yKCl7dGhpcy5fdmFsaWRhdG9yPW5qfWhhbmRsZUNoYW5nZXModCl7aWYodGhpcy5pbnB1dE5hbWUgaW4gdCl7Y29uc3QgZT10aGlzLm5vcm1hbGl6ZUlucHV0KHRbdGhpcy5pbnB1dE5hbWVdLmN1cnJlbnRWYWx1ZSk7dGhpcy5fdmFsaWRhdG9yPXRoaXMuY3JlYXRlVmFsaWRhdG9yKGUpLHRoaXMuX29uQ2hhbmdlJiZ0aGlzLl9vbkNoYW5nZSgpfX12YWxpZGF0ZSh0KXtyZXR1cm4gdGhpcy5fdmFsaWRhdG9yKHQpfXJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UodCl7dGhpcy5fb25DaGFuZ2U9dH19alUuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGpVKX0salUuybVkaXI9bG8oe3R5cGU6alV9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGpVLFt7dHlwZTpDeX1dLChmdW5jdGlvbigpe3JldHVybltdfSksbnVsbCk7Y29uc3QgVVU9e3Byb3ZpZGU6R1YsdXNlRXhpc3Rpbmc6cWUoKCgpPT5HVSkpLG11bHRpOiEwfTtjbGFzcyBHVSBleHRlbmRzIGpVe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmlucHV0TmFtZT0ibWF4Iix0aGlzLm5vcm1hbGl6ZUlucHV0PXQ9PnBhcnNlRmxvYXQodCksdGhpcy5jcmVhdGVWYWxpZGF0b3I9dD0+WFYodCl9bmdPbkNoYW5nZXModCl7dGhpcy5oYW5kbGVDaGFuZ2VzKHQpfX1HVS7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoR1UpKSkobnx8R1UpfX0pKCksR1UuybVkaXI9bG8oe3R5cGU6R1Usc2VsZWN0b3JzOltbImlucHV0IiwidHlwZSIsIm51bWJlciIsIm1heCIsIiIsImZvcm1Db250cm9sTmFtZSIsIiJdLFsiaW5wdXQiLCJ0eXBlIiwibnVtYmVyIiwibWF4IiwiIiwiZm9ybUNvbnRyb2wiLCIiXSxbImlucHV0IiwidHlwZSIsIm51bWJlciIsIm1heCIsIiIsIm5nTW9kZWwiLCIiXV0saG9zdFZhcnM6MSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pe2lmKDImZSl7bGV0IHQ7anAoIm1heCIsbnVsbCE9PSh0PW4ubWF4KSYmdm9pZCAwIT09dD90Om51bGwpfX0saW5wdXRzOnttYXg6Im1heCJ9LGZlYXR1cmVzOltwZyhbVVVdKSx4cCxCb119KSxHVS5wcm9wRGVjb3JhdG9ycz17bWF4Olt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEdVLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6ImlucHV0W3R5cGU9bnVtYmVyXVttYXhdW2Zvcm1Db250cm9sTmFtZV0saW5wdXRbdHlwZT1udW1iZXJdW21heF1bZm9ybUNvbnRyb2xdLGlucHV0W3R5cGU9bnVtYmVyXVttYXhdW25nTW9kZWxdIixwcm92aWRlcnM6W1VVXSxob3N0OnsiW2F0dHIubWF4XSI6Im1heCA/PyBudWxsIn19XX1dLG51bGwse21heDpbe3R5cGU6eHl9XX0pO2NvbnN0IFdVPXtwcm92aWRlOkdWLHVzZUV4aXN0aW5nOnFlKCgoKT0+WVUpKSxtdWx0aTohMH07Y2xhc3MgWVUgZXh0ZW5kcyBqVXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5pbnB1dE5hbWU9Im1pbiIsdGhpcy5ub3JtYWxpemVJbnB1dD10PT5wYXJzZUZsb2F0KHQpLHRoaXMuY3JlYXRlVmFsaWRhdG9yPXQ9PlpWKHQpfW5nT25DaGFuZ2VzKHQpe3RoaXMuaGFuZGxlQ2hhbmdlcyh0KX19WVUuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKFlVKSkpKG58fFlVKX19KSgpLFlVLsm1ZGlyPWxvKHt0eXBlOllVLHNlbGVjdG9yczpbWyJpbnB1dCIsInR5cGUiLCJudW1iZXIiLCJtaW4iLCIiLCJmb3JtQ29udHJvbE5hbWUiLCIiXSxbImlucHV0IiwidHlwZSIsIm51bWJlciIsIm1pbiIsIiIsImZvcm1Db250cm9sIiwiIl0sWyJpbnB1dCIsInR5cGUiLCJudW1iZXIiLCJtaW4iLCIiLCJuZ01vZGVsIiwiIl1dLGhvc3RWYXJzOjEsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXtpZigyJmUpe2xldCB0O2pwKCJtaW4iLG51bGwhPT0odD1uLm1pbikmJnZvaWQgMCE9PXQ/dDpudWxsKX19LGlucHV0czp7bWluOiJtaW4ifSxmZWF0dXJlczpbcGcoW1dVXSkseHAsQm9dfSksWVUucHJvcERlY29yYXRvcnM9e21pbjpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChZVSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJpbnB1dFt0eXBlPW51bWJlcl1bbWluXVtmb3JtQ29udHJvbE5hbWVdLGlucHV0W3R5cGU9bnVtYmVyXVttaW5dW2Zvcm1Db250cm9sXSxpbnB1dFt0eXBlPW51bWJlcl1bbWluXVtuZ01vZGVsXSIscHJvdmlkZXJzOltXVV0saG9zdDp7IlthdHRyLm1pbl0iOiJtaW4gPz8gbnVsbCJ9fV19XSxudWxsLHttaW46W3t0eXBlOnh5fV19KTtjb25zdCBxVT17cHJvdmlkZTpHVix1c2VFeGlzdGluZzpxZSgoKCk9PlhVKSksbXVsdGk6ITB9LFpVPXtwcm92aWRlOkdWLHVzZUV4aXN0aW5nOnFlKCgoKT0+S1UpKSxtdWx0aTohMH07Y2xhc3MgWFV7Y29uc3RydWN0b3IoKXt0aGlzLl9yZXF1aXJlZD0hMX1nZXQgcmVxdWlyZWQoKXtyZXR1cm4gdGhpcy5fcmVxdWlyZWR9c2V0IHJlcXVpcmVkKHQpe3RoaXMuX3JlcXVpcmVkPW51bGwhPXQmJiExIT09dCYmImZhbHNlIiE9YCR7dH1gLHRoaXMuX29uQ2hhbmdlJiZ0aGlzLl9vbkNoYW5nZSgpfXZhbGlkYXRlKHQpe3JldHVybiB0aGlzLnJlcXVpcmVkP0tWKHQpOm51bGx9cmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZSh0KXt0aGlzLl9vbkNoYW5nZT10fX1YVS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WFUpfSxYVS7JtWRpcj1sbyh7dHlwZTpYVSxzZWxlY3RvcnM6W1siIiwicmVxdWlyZWQiLCIiLCJmb3JtQ29udHJvbE5hbWUiLCIiLDMsInR5cGUiLCJjaGVja2JveCJdLFsiIiwicmVxdWlyZWQiLCIiLCJmb3JtQ29udHJvbCIsIiIsMywidHlwZSIsImNoZWNrYm94Il0sWyIiLCJyZXF1aXJlZCIsIiIsIm5nTW9kZWwiLCIiLDMsInR5cGUiLCJjaGVja2JveCJdXSxob3N0VmFyczoxLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZqcCgicmVxdWlyZWQiLG4ucmVxdWlyZWQ/IiI6bnVsbCl9LGlucHV0czp7cmVxdWlyZWQ6InJlcXVpcmVkIn0sZmVhdHVyZXM6W3BnKFtxVV0pXX0pLFhVLnByb3BEZWNvcmF0b3JzPXtyZXF1aXJlZDpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChYVSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiI6bm90KFt0eXBlPWNoZWNrYm94XSlbcmVxdWlyZWRdW2Zvcm1Db250cm9sTmFtZV0sOm5vdChbdHlwZT1jaGVja2JveF0pW3JlcXVpcmVkXVtmb3JtQ29udHJvbF0sOm5vdChbdHlwZT1jaGVja2JveF0pW3JlcXVpcmVkXVtuZ01vZGVsXSIscHJvdmlkZXJzOltxVV0saG9zdDp7IlthdHRyLnJlcXVpcmVkXSI6J3JlcXVpcmVkID8gIiIgOiBudWxsJ319XX1dLChmdW5jdGlvbigpe3JldHVybltdfSkse3JlcXVpcmVkOlt7dHlwZTp4eX1dfSk7Y2xhc3MgS1UgZXh0ZW5kcyBYVXt2YWxpZGF0ZSh0KXtyZXR1cm4gdGhpcy5yZXF1aXJlZD9KVih0KTpudWxsfX1LVS7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoS1UpKSkobnx8S1UpfX0pKCksS1UuybVkaXI9bG8oe3R5cGU6S1Usc2VsZWN0b3JzOltbImlucHV0IiwidHlwZSIsImNoZWNrYm94IiwicmVxdWlyZWQiLCIiLCJmb3JtQ29udHJvbE5hbWUiLCIiXSxbImlucHV0IiwidHlwZSIsImNoZWNrYm94IiwicmVxdWlyZWQiLCIiLCJmb3JtQ29udHJvbCIsIiJdLFsiaW5wdXQiLCJ0eXBlIiwiY2hlY2tib3giLCJyZXF1aXJlZCIsIiIsIm5nTW9kZWwiLCIiXV0saG9zdFZhcnM6MSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmanAoInJlcXVpcmVkIixuLnJlcXVpcmVkPyIiOm51bGwpfSxmZWF0dXJlczpbcGcoW1pVXSkseHBdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChLVSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJpbnB1dFt0eXBlPWNoZWNrYm94XVtyZXF1aXJlZF1bZm9ybUNvbnRyb2xOYW1lXSxpbnB1dFt0eXBlPWNoZWNrYm94XVtyZXF1aXJlZF1bZm9ybUNvbnRyb2xdLGlucHV0W3R5cGU9Y2hlY2tib3hdW3JlcXVpcmVkXVtuZ01vZGVsXSIscHJvdmlkZXJzOltaVV0saG9zdDp7IlthdHRyLnJlcXVpcmVkXSI6J3JlcXVpcmVkID8gIiIgOiBudWxsJ319XX1dLG51bGwsbnVsbCk7Y29uc3QgSlU9e3Byb3ZpZGU6R1YsdXNlRXhpc3Rpbmc6cWUoKCgpPT5RVSkpLG11bHRpOiEwfTtjbGFzcyBRVXtjb25zdHJ1Y3Rvcigpe3RoaXMuX2VuYWJsZWQ9ITF9c2V0IGVtYWlsKHQpe3RoaXMuX2VuYWJsZWQ9IiI9PT10fHwhMD09PXR8fCJ0cnVlIj09PXQsdGhpcy5fb25DaGFuZ2UmJnRoaXMuX29uQ2hhbmdlKCl9dmFsaWRhdGUodCl7cmV0dXJuIHRoaXMuX2VuYWJsZWQ/UVYodCk6bnVsbH1yZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKHQpe3RoaXMuX29uQ2hhbmdlPXR9fVFVLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxRVSl9LFFVLsm1ZGlyPWxvKHt0eXBlOlFVLHNlbGVjdG9yczpbWyIiLCJlbWFpbCIsIiIsImZvcm1Db250cm9sTmFtZSIsIiJdLFsiIiwiZW1haWwiLCIiLCJmb3JtQ29udHJvbCIsIiJdLFsiIiwiZW1haWwiLCIiLCJuZ01vZGVsIiwiIl1dLGlucHV0czp7ZW1haWw6ImVtYWlsIn0sZmVhdHVyZXM6W3BnKFtKVV0pXX0pLFFVLnByb3BEZWNvcmF0b3JzPXtlbWFpbDpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChRVSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbZW1haWxdW2Zvcm1Db250cm9sTmFtZV0sW2VtYWlsXVtmb3JtQ29udHJvbF0sW2VtYWlsXVtuZ01vZGVsXSIscHJvdmlkZXJzOltKVV19XX1dLChmdW5jdGlvbigpe3JldHVybltdfSkse2VtYWlsOlt7dHlwZTp4eX1dfSk7Y29uc3QgJFU9e3Byb3ZpZGU6R1YsdXNlRXhpc3Rpbmc6cWUoKCgpPT50RykpLG11bHRpOiEwfTtjbGFzcyB0R3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3ZhbGlkYXRvcj1uan1uZ09uQ2hhbmdlcyh0KXsibWlubGVuZ3RoImluIHQmJih0aGlzLl9jcmVhdGVWYWxpZGF0b3IoKSx0aGlzLl9vbkNoYW5nZSYmdGhpcy5fb25DaGFuZ2UoKSl9dmFsaWRhdGUodCl7cmV0dXJuIHRoaXMuZW5hYmxlZCgpP3RoaXMuX3ZhbGlkYXRvcih0KTpudWxsfXJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UodCl7dGhpcy5fb25DaGFuZ2U9dH1fY3JlYXRlVmFsaWRhdG9yKCl7dGhpcy5fdmFsaWRhdG9yPXRoaXMuZW5hYmxlZCgpPyRWKFZVKHRoaXMubWlubGVuZ3RoKSk6bmp9ZW5hYmxlZCgpe3JldHVybiBudWxsIT10aGlzLm1pbmxlbmd0aH19dEcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHRHKX0sdEcuybVkaXI9bG8oe3R5cGU6dEcsc2VsZWN0b3JzOltbIiIsIm1pbmxlbmd0aCIsIiIsImZvcm1Db250cm9sTmFtZSIsIiJdLFsiIiwibWlubGVuZ3RoIiwiIiwiZm9ybUNvbnRyb2wiLCIiXSxbIiIsIm1pbmxlbmd0aCIsIiIsIm5nTW9kZWwiLCIiXV0saG9zdFZhcnM6MSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmanAoIm1pbmxlbmd0aCIsbi5lbmFibGVkKCk/bi5taW5sZW5ndGg6bnVsbCl9LGlucHV0czp7bWlubGVuZ3RoOiJtaW5sZW5ndGgifSxmZWF0dXJlczpbcGcoWyRVXSksQm9dfSksdEcucHJvcERlY29yYXRvcnM9e21pbmxlbmd0aDpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh0Ryxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbWlubGVuZ3RoXVtmb3JtQ29udHJvbE5hbWVdLFttaW5sZW5ndGhdW2Zvcm1Db250cm9sXSxbbWlubGVuZ3RoXVtuZ01vZGVsXSIscHJvdmlkZXJzOlskVV0saG9zdDp7IlthdHRyLm1pbmxlbmd0aF0iOiJlbmFibGVkKCkgPyBtaW5sZW5ndGggOiBudWxsIn19XX1dLChmdW5jdGlvbigpe3JldHVybltdfSkse21pbmxlbmd0aDpbe3R5cGU6eHl9XX0pO2NvbnN0IGVHPXtwcm92aWRlOkdWLHVzZUV4aXN0aW5nOnFlKCgoKT0+bkcpKSxtdWx0aTohMH07Y2xhc3Mgbkd7Y29uc3RydWN0b3IoKXt0aGlzLl92YWxpZGF0b3I9bmp9bmdPbkNoYW5nZXModCl7Im1heGxlbmd0aCJpbiB0JiYodGhpcy5fY3JlYXRlVmFsaWRhdG9yKCksdGhpcy5fb25DaGFuZ2UmJnRoaXMuX29uQ2hhbmdlKCkpfXZhbGlkYXRlKHQpe3JldHVybiB0aGlzLmVuYWJsZWQoKT90aGlzLl92YWxpZGF0b3IodCk6bnVsbH1yZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKHQpe3RoaXMuX29uQ2hhbmdlPXR9X2NyZWF0ZVZhbGlkYXRvcigpe3RoaXMuX3ZhbGlkYXRvcj10aGlzLmVuYWJsZWQoKT90aihWVSh0aGlzLm1heGxlbmd0aCkpOm5qfWVuYWJsZWQoKXtyZXR1cm4gbnVsbCE9dGhpcy5tYXhsZW5ndGh9fW5HLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxuRyl9LG5HLsm1ZGlyPWxvKHt0eXBlOm5HLHNlbGVjdG9yczpbWyIiLCJtYXhsZW5ndGgiLCIiLCJmb3JtQ29udHJvbE5hbWUiLCIiXSxbIiIsIm1heGxlbmd0aCIsIiIsImZvcm1Db250cm9sIiwiIl0sWyIiLCJtYXhsZW5ndGgiLCIiLCJuZ01vZGVsIiwiIl1dLGhvc3RWYXJzOjEsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJmpwKCJtYXhsZW5ndGgiLG4uZW5hYmxlZCgpP24ubWF4bGVuZ3RoOm51bGwpfSxpbnB1dHM6e21heGxlbmd0aDoibWF4bGVuZ3RoIn0sZmVhdHVyZXM6W3BnKFtlR10pLEJvXX0pLG5HLnByb3BEZWNvcmF0b3JzPXttYXhsZW5ndGg6W3t0eXBlOnh5fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobkcsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW21heGxlbmd0aF1bZm9ybUNvbnRyb2xOYW1lXSxbbWF4bGVuZ3RoXVtmb3JtQ29udHJvbF0sW21heGxlbmd0aF1bbmdNb2RlbF0iLHByb3ZpZGVyczpbZUddLGhvc3Q6eyJbYXR0ci5tYXhsZW5ndGhdIjoiZW5hYmxlZCgpID8gbWF4bGVuZ3RoIDogbnVsbCJ9fV19XSwoZnVuY3Rpb24oKXtyZXR1cm5bXX0pLHttYXhsZW5ndGg6W3t0eXBlOnh5fV19KTtjb25zdCBvRz17cHJvdmlkZTpHVix1c2VFeGlzdGluZzpxZSgoKCk9PmlHKSksbXVsdGk6ITB9O2NsYXNzIGlHe2NvbnN0cnVjdG9yKCl7dGhpcy5fdmFsaWRhdG9yPW5qfW5nT25DaGFuZ2VzKHQpeyJwYXR0ZXJuImluIHQmJih0aGlzLl9jcmVhdGVWYWxpZGF0b3IoKSx0aGlzLl9vbkNoYW5nZSYmdGhpcy5fb25DaGFuZ2UoKSl9dmFsaWRhdGUodCl7cmV0dXJuIHRoaXMuX3ZhbGlkYXRvcih0KX1yZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKHQpe3RoaXMuX29uQ2hhbmdlPXR9X2NyZWF0ZVZhbGlkYXRvcigpe3RoaXMuX3ZhbGlkYXRvcj1laih0aGlzLnBhdHRlcm4pfX1pRy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8aUcpfSxpRy7JtWRpcj1sbyh7dHlwZTppRyxzZWxlY3RvcnM6W1siIiwicGF0dGVybiIsIiIsImZvcm1Db250cm9sTmFtZSIsIiJdLFsiIiwicGF0dGVybiIsIiIsImZvcm1Db250cm9sIiwiIl0sWyIiLCJwYXR0ZXJuIiwiIiwibmdNb2RlbCIsIiJdXSxob3N0VmFyczoxLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZqcCgicGF0dGVybiIsbi5wYXR0ZXJuP24ucGF0dGVybjpudWxsKX0saW5wdXRzOntwYXR0ZXJuOiJwYXR0ZXJuIn0sZmVhdHVyZXM6W3BnKFtvR10pLEJvXX0pLGlHLnByb3BEZWNvcmF0b3JzPXtwYXR0ZXJuOlt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGlHLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IltwYXR0ZXJuXVtmb3JtQ29udHJvbE5hbWVdLFtwYXR0ZXJuXVtmb3JtQ29udHJvbF0sW3BhdHRlcm5dW25nTW9kZWxdIixwcm92aWRlcnM6W29HXSxob3N0OnsiW2F0dHIucGF0dGVybl0iOiJwYXR0ZXJuID8gcGF0dGVybiA6IG51bGwifX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW119KSx7cGF0dGVybjpbe3R5cGU6eHl9XX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgYUc9W21VLElVLEJVLFZWLGZVLENVLEZWLHpVLExVLHlVLHhqLE9qLFhVLHRHLG5HLGlHLEtVLFFVLFlVLEdVXSxyRz1bcFUsbFUsaVVdLHNHPVt4VSxQVSxBVSxrVSxEVV07Y2xhc3MgbEd7fWxHLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxsRyl9LGxHLsm1bW9kPWFvKHt0eXBlOmxHfSksbEcuybVpbmo9dm4oe2ltcG9ydHM6W1toVV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChsRyxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczphRyxpbXBvcnRzOltoVV0sZXhwb3J0czphR31dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKGxHLHtkZWNsYXJhdGlvbnM6W21VLElVLEJVLFZWLGZVLENVLEZWLHpVLExVLHlVLHhqLE9qLFhVLHRHLG5HLGlHLEtVLFFVLFlVLEdVXSxpbXBvcnRzOltoVV0sZXhwb3J0czpbbVUsSVUsQlUsVlYsZlUsQ1UsRlYselUsTFUseVUseGosT2osWFUsdEcsbkcsaUcsS1UsUVUsWVUsR1VdfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBjR3t9Y0cuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGNHKX0sY0cuybVtb2Q9YW8oe3R5cGU6Y0d9KSxjRy7JtWluaj12bih7aW1wb3J0czpbbEddfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChjRyxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpyRyxleHBvcnRzOltsRyxyR119XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhjRyx7ZGVjbGFyYXRpb25zOltwVSxsVSxpVV0sZXhwb3J0czpbbEcscFUsbFUsaVVdfSk7Y2xhc3MgZEd7c3RhdGljIHdpdGhDb25maWcodCl7cmV0dXJue25nTW9kdWxlOmRHLHByb3ZpZGVyczpbe3Byb3ZpZGU6TVUsdXNlVmFsdWU6dC53YXJuT25OZ01vZGVsV2l0aEZvcm1Db250cm9sfV19fX1kRy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8ZEcpfSxkRy7JtW1vZD1hbyh7dHlwZTpkR30pLGRHLsm1aW5qPXZuKHtpbXBvcnRzOltsR119KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGRHLFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltzR10sZXhwb3J0czpbbEcsc0ddfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oZEcse2RlY2xhcmF0aW9uczpbeFUsUFUsQVUsa1UsRFVdLGV4cG9ydHM6W2xHLHhVLFBVLEFVLGtVLERVXX0pO2NsYXNzIHBHe2dyb3VwKHQsZT1udWxsKXtjb25zdCBuPXRoaXMuX3JlZHVjZUNvbnRyb2xzKHQpO2xldCBvLGk9bnVsbCxhPW51bGw7cmV0dXJuIG51bGwhPWUmJigoCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiByKHQpe3JldHVybiB2b2lkIDAhPT10LmFzeW5jVmFsaWRhdG9yc3x8dm9pZCAwIT09dC52YWxpZGF0b3JzfHx2b2lkIDAhPT10LnVwZGF0ZU9ufSkoZSk/KGk9bnVsbCE9ZS52YWxpZGF0b3JzP2UudmFsaWRhdG9yczpudWxsLGE9bnVsbCE9ZS5hc3luY1ZhbGlkYXRvcnM/ZS5hc3luY1ZhbGlkYXRvcnM6bnVsbCxvPW51bGwhPWUudXBkYXRlT24/ZS51cGRhdGVPbjp2b2lkIDApOihpPW51bGwhPWUudmFsaWRhdG9yP2UudmFsaWRhdG9yOm51bGwsYT1udWxsIT1lLmFzeW5jVmFsaWRhdG9yP2UuYXN5bmNWYWxpZGF0b3I6bnVsbCkpLG5ldyB0VShuLHthc3luY1ZhbGlkYXRvcnM6YSx1cGRhdGVPbjpvLHZhbGlkYXRvcnM6aX0pfWNvbnRyb2wodCxlLG4pe3JldHVybiBuZXcgJGoodCxlLG4pfWFycmF5KHQsZSxuKXtjb25zdCBvPXQubWFwKCh0PT50aGlzLl9jcmVhdGVDb250cm9sKHQpKSk7cmV0dXJuIG5ldyBlVShvLGUsbil9X3JlZHVjZUNvbnRyb2xzKHQpe2NvbnN0IGU9e307cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKG49PntlW25dPXRoaXMuX2NyZWF0ZUNvbnRyb2wodFtuXSl9KSksZX1fY3JlYXRlQ29udHJvbCh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mICRqfHx0IGluc3RhbmNlb2YgdFV8fHQgaW5zdGFuY2VvZiBlVT90OkFycmF5LmlzQXJyYXkodCk/dGhpcy5jb250cm9sKHRbMF0sdC5sZW5ndGg+MT90WzFdOm51bGwsdC5sZW5ndGg+Mj90WzJdOm51bGwpOnRoaXMuY29udHJvbCh0KX19cEcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHBHKX0scEcuybVwcm92PU1uKHtmYWN0b3J5OmZ1bmN0aW9uIHQoKXtyZXR1cm4gbmV3IHBHfSx0b2tlbjpwRyxwcm92aWRlZEluOmRHfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChwRyxbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46ZEd9XX1dLG51bGwsbnVsbCksCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpuZXcgT2coIjEyLjIuMSIpO2NvbnN0IG1HPVsidHJpZ2dlciJdLHVHPVsicGFuZWwiXTtmdW5jdGlvbiBmRyh0LGUpe2lmKDEmdCYmKFJtKDAsInNwYW4iLDgpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpO3JjKDEpLFN1KHQucGxhY2Vob2xkZXIpfX1mdW5jdGlvbiBnRyh0LGUpe2lmKDEmdCYmKFJtKDAsInNwYW4iLDEyKSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMik7cmMoMSksU3UodC50cmlnZ2VyVmFsdWUpfX1mdW5jdGlvbiBoRyh0LGUpezEmdCYmWG0oMCwwLFsiKm5nU3dpdGNoQ2FzZSIsInRydWUiXSl9ZnVuY3Rpb24gYkcodCxlKXsxJnQmJihSbSgwLCJzcGFuIiw5KSxRcCgxLGdHLDIsMSwic3BhbiIsMTApLFFwKDIsaEcsMSwwLCJuZy1jb250ZW50IiwxMSksQW0oKSksMiZ0JiYoRG0oIm5nU3dpdGNoIiwhIVltKCkuY3VzdG9tVHJpZ2dlcikscmMoMiksRG0oIm5nU3dpdGNoQ2FzZSIsITApKX1mdW5jdGlvbiB5Ryh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsImRpdiIsMTMpLFJtKDEsImRpdiIsMTQsMTUpLFZtKCJAdHJhbnNmb3JtUGFuZWwuZG9uZSIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkuX3BhbmVsRG9uZUFuaW1hdGluZ1N0cmVhbS5uZXh0KG4udG9TdGF0ZSl9KSkoImtleWRvd24iLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLl9oYW5kbGVLZXlkb3duKG4pfSkpLFhtKDMsMSksQW0oKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgpO0RtKCJAdHJhbnNmb3JtUGFuZWxXcmFwIix2b2lkIDApLHJjKDEpLEF1KCJtYXQtc2VsZWN0LXBhbmVsICIsdC5fZ2V0UGFuZWxUaGVtZSgpLCIiKSxkdSgidHJhbnNmb3JtLW9yaWdpbiIsdC5fdHJhbnNmb3JtT3JpZ2luKSgiZm9udC1zaXplIix0Ll90cmlnZ2VyRm9udFNpemUsInB4IiksRG0oIm5nQ2xhc3MiLHQucGFuZWxDbGFzcykoIkB0cmFuc2Zvcm1QYW5lbCIsdC5tdWx0aXBsZT8ic2hvd2luZy1tdWx0aXBsZSI6InNob3dpbmciKSxqcCgiaWQiLHQuaWQrIi1wYW5lbCIpKCJhcmlhLW11bHRpc2VsZWN0YWJsZSIsdC5tdWx0aXBsZSkoImFyaWEtbGFiZWwiLHQuYXJpYUxhYmVsfHxudWxsKSgiYXJpYS1sYWJlbGxlZGJ5Iix0Ll9nZXRQYW5lbEFyaWFMYWJlbGxlZGJ5KCkpfX1jb25zdCBfRz1bW1sibWF0LXNlbGVjdC10cmlnZ2VyIl1dLCIqIl0sQ0c9e3RyYW5zZm9ybVBhbmVsV3JhcDpueCgidHJhbnNmb3JtUGFuZWxXcmFwIixbbHgoIiogPT4gdm9pZCIsZHgoIkB0cmFuc2Zvcm1QYW5lbCIsW2N4KCldLHtvcHRpb25hbDohMH0pKV0pLHRyYW5zZm9ybVBhbmVsOm54KCJ0cmFuc2Zvcm1QYW5lbCIsW3J4KCJ2b2lkIixheCh7dHJhbnNmb3JtOiJzY2FsZVkoMC44KSIsbWluV2lkdGg6IjEwMCUiLG9wYWNpdHk6MH0pKSxyeCgic2hvd2luZyIsYXgoe29wYWNpdHk6MSxtaW5XaWR0aDoiY2FsYygxMDAlICsgMzJweCkiLHRyYW5zZm9ybToic2NhbGVZKDEpIn0pKSxyeCgic2hvd2luZy1tdWx0aXBsZSIsYXgoe29wYWNpdHk6MSxtaW5XaWR0aDoiY2FsYygxMDAlICsgNjRweCkiLHRyYW5zZm9ybToic2NhbGVZKDEpIn0pKSxseCgidm9pZCA9PiAqIixveCgiMTIwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSkiKSksbHgoIiogPT4gdm9pZCIsb3goIjEwMG1zIDI1bXMgbGluZWFyIixheCh7b3BhY2l0eTowfSkpKV0pfTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmxldCBNRz0wO2NvbnN0IHZHPTI1Nix4Rz1uZXcgR2EoIm1hdC1zZWxlY3Qtc2Nyb2xsLXN0cmF0ZWd5IiksT0c9bmV3IEdhKCJNQVRfU0VMRUNUX0NPTkZJRyIpLFBHPXtwcm92aWRlOnhHLGRlcHM6W3BMXSx1c2VGYWN0b3J5OmZ1bmN0aW9uIHdHKHQpe3JldHVybigpPT50LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpfX07Y2xhc3Mga0d7Y29uc3RydWN0b3IodCxlKXt0aGlzLnNvdXJjZT10LHRoaXMudmFsdWU9ZX19Y29uc3QgU0c9UUkoJEkoS0kodEgoY2xhc3N7Y29uc3RydWN0b3IodCxlLG4sbyxpKXt0aGlzLl9lbGVtZW50UmVmPXQsdGhpcy5fZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyPWUsdGhpcy5fcGFyZW50Rm9ybT1uLHRoaXMuX3BhcmVudEZvcm1Hcm91cD1vLHRoaXMubmdDb250cm9sPWl9fSkpKSksREc9bmV3IEdhKCJNYXRTZWxlY3RUcmlnZ2VyIik7Y2xhc3MgRUd7fUVHLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxFRyl9LEVHLsm1ZGlyPWxvKHt0eXBlOkVHLHNlbGVjdG9yczpbWyJtYXQtc2VsZWN0LXRyaWdnZXIiXV0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTpERyx1c2VFeGlzdGluZzpFR31dKV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEVHLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC1zZWxlY3QtdHJpZ2dlciIscHJvdmlkZXJzOlt7cHJvdmlkZTpERyx1c2VFeGlzdGluZzpFR31dfV19XSxudWxsLG51bGwpO2NsYXNzIFJHIGV4dGVuZHMgU0d7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1KXt2YXIgZixnLGg7c3VwZXIoaSxvLHIscyxjKSx0aGlzLl92aWV3cG9ydFJ1bGVyPXQsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWY9ZSx0aGlzLl9uZ1pvbmU9bix0aGlzLl9kaXI9YSx0aGlzLl9wYXJlbnRGb3JtRmllbGQ9bCx0aGlzLl9saXZlQW5ub3VuY2VyPW0sdGhpcy5fZGVmYXVsdE9wdGlvbnM9dSx0aGlzLl9wYW5lbE9wZW49ITEsdGhpcy5fY29tcGFyZVdpdGg9KHQsZSk9PnQ9PT1lLHRoaXMuX3VpZD0ibWF0LXNlbGVjdC0iK01HKyssdGhpcy5fdHJpZ2dlckFyaWFMYWJlbGxlZEJ5PW51bGwsdGhpcy5fZGVzdHJveT1uZXcgSSx0aGlzLl9vbkNoYW5nZT0oKT0+e30sdGhpcy5fb25Ub3VjaGVkPSgpPT57fSx0aGlzLl92YWx1ZUlkPSJtYXQtc2VsZWN0LXZhbHVlLSIrTUcrKyx0aGlzLl9wYW5lbERvbmVBbmltYXRpbmdTdHJlYW09bmV3IEksdGhpcy5fb3ZlcmxheVBhbmVsQ2xhc3M9KG51bGw9PT0oZj10aGlzLl9kZWZhdWx0T3B0aW9ucyl8fHZvaWQgMD09PWY/dm9pZCAwOmYub3ZlcmxheVBhbmVsQ2xhc3MpfHwiIix0aGlzLl9mb2N1c2VkPSExLHRoaXMuY29udHJvbFR5cGU9Im1hdC1zZWxlY3QiLHRoaXMuX3JlcXVpcmVkPSExLHRoaXMuX211bHRpcGxlPSExLHRoaXMuX2Rpc2FibGVPcHRpb25DZW50ZXJpbmc9bnVsbCE9PShoPW51bGw9PT0oZz10aGlzLl9kZWZhdWx0T3B0aW9ucyl8fHZvaWQgMD09PWc/dm9pZCAwOmcuZGlzYWJsZU9wdGlvbkNlbnRlcmluZykmJnZvaWQgMCE9PWgmJmgsdGhpcy5hcmlhTGFiZWw9IiIsdGhpcy5vcHRpb25TZWxlY3Rpb25DaGFuZ2VzPVF0KCgoKT0+e2NvbnN0IHQ9dGhpcy5vcHRpb25zO3JldHVybiB0P3QuY2hhbmdlcy5waXBlKE5lKHQpLHplKCgoKT0+cmUoLi4udC5tYXAoKHQ9PnQub25TZWxlY3Rpb25DaGFuZ2UpKSkpKSk6dGhpcy5fbmdab25lLm9uU3RhYmxlLnBpcGUoYmUoMSksemUoKCgpPT50aGlzLm9wdGlvblNlbGVjdGlvbkNoYW5nZXMpKSl9KSksdGhpcy5vcGVuZWRDaGFuZ2U9bmV3IExoLHRoaXMuX29wZW5lZFN0cmVhbT10aGlzLm9wZW5lZENoYW5nZS5waXBlKGNlKCh0PT50KSksSXQoKCgpPT57fSkpKSx0aGlzLl9jbG9zZWRTdHJlYW09dGhpcy5vcGVuZWRDaGFuZ2UucGlwZShjZSgodD0+IXQpKSxJdCgoKCk9Pnt9KSkpLHRoaXMuc2VsZWN0aW9uQ2hhbmdlPW5ldyBMaCx0aGlzLnZhbHVlQ2hhbmdlPW5ldyBMaCx0aGlzLm5nQ29udHJvbCYmKHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3I9dGhpcyksbnVsbCE9KG51bGw9PXU/dm9pZCAwOnUudHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbCkmJih0aGlzLl90eXBlYWhlYWREZWJvdW5jZUludGVydmFsPXUudHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbCksdGhpcy5fc2Nyb2xsU3RyYXRlZ3lGYWN0b3J5PXAsdGhpcy5fc2Nyb2xsU3RyYXRlZ3k9dGhpcy5fc2Nyb2xsU3RyYXRlZ3lGYWN0b3J5KCksdGhpcy50YWJJbmRleD1wYXJzZUludChkKXx8MCx0aGlzLmlkPXRoaXMuaWR9Z2V0IGZvY3VzZWQoKXtyZXR1cm4gdGhpcy5fZm9jdXNlZHx8dGhpcy5fcGFuZWxPcGVufWdldCBwbGFjZWhvbGRlcigpe3JldHVybiB0aGlzLl9wbGFjZWhvbGRlcn1zZXQgcGxhY2Vob2xkZXIodCl7dGhpcy5fcGxhY2Vob2xkZXI9dCx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCl9Z2V0IHJlcXVpcmVkKCl7cmV0dXJuIHRoaXMuX3JlcXVpcmVkfXNldCByZXF1aXJlZCh0KXt0aGlzLl9yZXF1aXJlZD15eih0KSx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCl9Z2V0IG11bHRpcGxlKCl7cmV0dXJuIHRoaXMuX211bHRpcGxlfXNldCBtdWx0aXBsZSh0KXtpZih0aGlzLl9zZWxlY3Rpb25Nb2RlbCYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KdGhyb3coZnVuY3Rpb24gZSgpe3JldHVybiBFcnJvcigiQ2Fubm90IGNoYW5nZSBgbXVsdGlwbGVgIG1vZGUgb2Ygc2VsZWN0IGFmdGVyIGluaXRpYWxpemF0aW9uLiIpfSkoKTt0aGlzLl9tdWx0aXBsZT15eih0KX1nZXQgZGlzYWJsZU9wdGlvbkNlbnRlcmluZygpe3JldHVybiB0aGlzLl9kaXNhYmxlT3B0aW9uQ2VudGVyaW5nfXNldCBkaXNhYmxlT3B0aW9uQ2VudGVyaW5nKHQpe3RoaXMuX2Rpc2FibGVPcHRpb25DZW50ZXJpbmc9eXoodCl9Z2V0IGNvbXBhcmVXaXRoKCl7cmV0dXJuIHRoaXMuX2NvbXBhcmVXaXRofXNldCBjb21wYXJlV2l0aCh0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93KGZ1bmN0aW9uIGUoKXtyZXR1cm4gRXJyb3IoImBjb21wYXJlV2l0aGAgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpfSkoKTt0aGlzLl9jb21wYXJlV2l0aD10LHRoaXMuX3NlbGVjdGlvbk1vZGVsJiZ0aGlzLl9pbml0aWFsaXplU2VsZWN0aW9uKCl9Z2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMuX3ZhbHVlfXNldCB2YWx1ZSh0KXsodCE9PXRoaXMuX3ZhbHVlfHx0aGlzLl9tdWx0aXBsZSYmQXJyYXkuaXNBcnJheSh0KSkmJih0aGlzLm9wdGlvbnMmJnRoaXMuX3NldFNlbGVjdGlvbkJ5VmFsdWUodCksdGhpcy5fdmFsdWU9dCl9Z2V0IHR5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWwoKXtyZXR1cm4gdGhpcy5fdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbH1zZXQgdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbCh0KXt0aGlzLl90eXBlYWhlYWREZWJvdW5jZUludGVydmFsPV96KHQpfWdldCBpZCgpe3JldHVybiB0aGlzLl9pZH1zZXQgaWQodCl7dGhpcy5faWQ9dHx8dGhpcy5fdWlkLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKX1uZ09uSW5pdCgpe3RoaXMuX3NlbGVjdGlvbk1vZGVsPW5ldyBvRih0aGlzLm11bHRpcGxlKSx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCksdGhpcy5fcGFuZWxEb25lQW5pbWF0aW5nU3RyZWFtLnBpcGUoTWUoKSxJZSh0aGlzLl9kZXN0cm95KSkuc3Vic2NyaWJlKCgoKT0+dGhpcy5fcGFuZWxEb25lQW5pbWF0aW5nKHRoaXMucGFuZWxPcGVuKSkpfW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX2luaXRLZXlNYW5hZ2VyKCksdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2hhbmdlZC5waXBlKEllKHRoaXMuX2Rlc3Ryb3kpKS5zdWJzY3JpYmUoKHQ9Pnt0LmFkZGVkLmZvckVhY2goKHQ9PnQuc2VsZWN0KCkpKSx0LnJlbW92ZWQuZm9yRWFjaCgodD0+dC5kZXNlbGVjdCgpKSl9KSksdGhpcy5vcHRpb25zLmNoYW5nZXMucGlwZShOZShudWxsKSxJZSh0aGlzLl9kZXN0cm95KSkuc3Vic2NyaWJlKCgoKT0+e3RoaXMuX3Jlc2V0T3B0aW9ucygpLHRoaXMuX2luaXRpYWxpemVTZWxlY3Rpb24oKX0pKX1uZ0RvQ2hlY2soKXtjb25zdCB0PXRoaXMuX2dldFRyaWdnZXJBcmlhTGFiZWxsZWRieSgpO2lmKHQhPT10aGlzLl90cmlnZ2VyQXJpYUxhYmVsbGVkQnkpe2NvbnN0IGU9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O3RoaXMuX3RyaWdnZXJBcmlhTGFiZWxsZWRCeT10LHQ/ZS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsdCk6ZS5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIpfXRoaXMubmdDb250cm9sJiZ0aGlzLnVwZGF0ZUVycm9yU3RhdGUoKX1uZ09uQ2hhbmdlcyh0KXt0LmRpc2FibGVkJiZ0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCksdC50eXBlYWhlYWREZWJvdW5jZUludGVydmFsJiZ0aGlzLl9rZXlNYW5hZ2VyJiZ0aGlzLl9rZXlNYW5hZ2VyLndpdGhUeXBlQWhlYWQodGhpcy5fdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9kZXN0cm95Lm5leHQoKSx0aGlzLl9kZXN0cm95LmNvbXBsZXRlKCksdGhpcy5zdGF0ZUNoYW5nZXMuY29tcGxldGUoKX10b2dnbGUoKXt0aGlzLnBhbmVsT3Blbj90aGlzLmNsb3NlKCk6dGhpcy5vcGVuKCl9b3Blbigpe3RoaXMuX2Nhbk9wZW4oKSYmKHRoaXMuX3BhbmVsT3Blbj0hMCx0aGlzLl9rZXlNYW5hZ2VyLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24obnVsbCksdGhpcy5faGlnaGxpZ2h0Q29ycmVjdE9wdGlvbigpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKX1jbG9zZSgpe3RoaXMuX3BhbmVsT3BlbiYmKHRoaXMuX3BhbmVsT3Blbj0hMSx0aGlzLl9rZXlNYW5hZ2VyLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24odGhpcy5faXNSdGwoKT8icnRsIjoibHRyIiksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCksdGhpcy5fb25Ub3VjaGVkKCkpfXdyaXRlVmFsdWUodCl7dGhpcy52YWx1ZT10fXJlZ2lzdGVyT25DaGFuZ2UodCl7dGhpcy5fb25DaGFuZ2U9dH1yZWdpc3Rlck9uVG91Y2hlZCh0KXt0aGlzLl9vblRvdWNoZWQ9dH1zZXREaXNhYmxlZFN0YXRlKHQpe3RoaXMuZGlzYWJsZWQ9dCx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCl9Z2V0IHBhbmVsT3Blbigpe3JldHVybiB0aGlzLl9wYW5lbE9wZW59Z2V0IHNlbGVjdGVkKCl7cmV0dXJuIHRoaXMubXVsdGlwbGU/dGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQ6dGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRbMF19Z2V0IHRyaWdnZXJWYWx1ZSgpe2lmKHRoaXMuZW1wdHkpcmV0dXJuIiI7aWYodGhpcy5fbXVsdGlwbGUpe2NvbnN0IHQ9dGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQubWFwKCh0PT50LnZpZXdWYWx1ZSkpO3JldHVybiB0aGlzLl9pc1J0bCgpJiZ0LnJldmVyc2UoKSx0LmpvaW4oIiwgIil9cmV0dXJuIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkWzBdLnZpZXdWYWx1ZX1faXNSdGwoKXtyZXR1cm4hIXRoaXMuX2RpciYmInJ0bCI9PT10aGlzLl9kaXIudmFsdWV9X2hhbmRsZUtleWRvd24odCl7dGhpcy5kaXNhYmxlZHx8KHRoaXMucGFuZWxPcGVuP3RoaXMuX2hhbmRsZU9wZW5LZXlkb3duKHQpOnRoaXMuX2hhbmRsZUNsb3NlZEtleWRvd24odCkpfV9oYW5kbGVDbG9zZWRLZXlkb3duKHQpe2NvbnN0IGU9dC5rZXlDb2RlLG49ZT09PWh6fHxlPT09Z3p8fDM3PT09ZXx8Mzk9PT1lLG89ZT09PW16fHxlPT09ZnosaT10aGlzLl9rZXlNYW5hZ2VyO2lmKCFpLmlzVHlwaW5nKCkmJm8mJiFieih0KXx8KHRoaXMubXVsdGlwbGV8fHQuYWx0S2V5KSYmbil0LnByZXZlbnREZWZhdWx0KCksdGhpcy5vcGVuKCk7ZWxzZSBpZighdGhpcy5tdWx0aXBsZSl7Y29uc3QgZT10aGlzLnNlbGVjdGVkO2kub25LZXlkb3duKHQpO2NvbnN0IG49dGhpcy5zZWxlY3RlZDtuJiZlIT09biYmdGhpcy5fbGl2ZUFubm91bmNlci5hbm5vdW5jZShuLnZpZXdWYWx1ZSwxZTQpfX1faGFuZGxlT3BlbktleWRvd24odCl7Y29uc3QgZT10aGlzLl9rZXlNYW5hZ2VyLG49dC5rZXlDb2RlLG89bj09PWh6fHxuPT09Z3osaT1lLmlzVHlwaW5nKCk7aWYobyYmdC5hbHRLZXkpdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuY2xvc2UoKTtlbHNlIGlmKGl8fG4hPT1teiYmbiE9PWZ6fHwhZS5hY3RpdmVJdGVtfHxieih0KSlpZighaSYmdGhpcy5fbXVsdGlwbGUmJjY1PT09biYmdC5jdHJsS2V5KXt0LnByZXZlbnREZWZhdWx0KCk7Y29uc3QgZT10aGlzLm9wdGlvbnMuc29tZSgodD0+IXQuZGlzYWJsZWQmJiF0LnNlbGVjdGVkKSk7dGhpcy5vcHRpb25zLmZvckVhY2goKHQ9Pnt0LmRpc2FibGVkfHwoZT90LnNlbGVjdCgpOnQuZGVzZWxlY3QoKSl9KSl9ZWxzZXtjb25zdCBuPWUuYWN0aXZlSXRlbUluZGV4O2Uub25LZXlkb3duKHQpLHRoaXMuX211bHRpcGxlJiZvJiZ0LnNoaWZ0S2V5JiZlLmFjdGl2ZUl0ZW0mJmUuYWN0aXZlSXRlbUluZGV4IT09biYmZS5hY3RpdmVJdGVtLl9zZWxlY3RWaWFJbnRlcmFjdGlvbigpfWVsc2UgdC5wcmV2ZW50RGVmYXVsdCgpLGUuYWN0aXZlSXRlbS5fc2VsZWN0VmlhSW50ZXJhY3Rpb24oKX1fb25Gb2N1cygpe3RoaXMuZGlzYWJsZWR8fCh0aGlzLl9mb2N1c2VkPSEwLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKSl9X29uQmx1cigpe3RoaXMuX2ZvY3VzZWQ9ITEsdGhpcy5kaXNhYmxlZHx8dGhpcy5wYW5lbE9wZW58fCh0aGlzLl9vblRvdWNoZWQoKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCkpfV9vbkF0dGFjaGVkKCl7dGhpcy5fb3ZlcmxheURpci5wb3NpdGlvbkNoYW5nZS5waXBlKGJlKDEpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpLHRoaXMuX3Bvc2l0aW9uaW5nU2V0dGxlZCgpfSkpfV9nZXRQYW5lbFRoZW1lKCl7cmV0dXJuIHRoaXMuX3BhcmVudEZvcm1GaWVsZD9gbWF0LSR7dGhpcy5fcGFyZW50Rm9ybUZpZWxkLmNvbG9yfWA6IiJ9Z2V0IGVtcHR5KCl7cmV0dXJuIXRoaXMuX3NlbGVjdGlvbk1vZGVsfHx0aGlzLl9zZWxlY3Rpb25Nb2RlbC5pc0VtcHR5KCl9X2luaXRpYWxpemVTZWxlY3Rpb24oKXtQcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+e3RoaXMuX3NldFNlbGVjdGlvbkJ5VmFsdWUodGhpcy5uZ0NvbnRyb2w/dGhpcy5uZ0NvbnRyb2wudmFsdWU6dGhpcy5fdmFsdWUpLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKX0pKX1fc2V0U2VsZWN0aW9uQnlWYWx1ZSh0KXtpZih0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZC5mb3JFYWNoKCh0PT50LnNldEluYWN0aXZlU3R5bGVzKCkpKSx0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhcigpLHRoaXMubXVsdGlwbGUmJnQpe2lmKCFBcnJheS5pc0FycmF5KHQpJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkpdGhyb3coZnVuY3Rpb24gZSgpe3JldHVybiBFcnJvcigiVmFsdWUgbXVzdCBiZSBhbiBhcnJheSBpbiBtdWx0aXBsZS1zZWxlY3Rpb24gbW9kZS4iKX0pKCk7dC5mb3JFYWNoKCh0PT50aGlzLl9zZWxlY3RWYWx1ZSh0KSkpLHRoaXMuX3NvcnRWYWx1ZXMoKX1lbHNle2NvbnN0IGU9dGhpcy5fc2VsZWN0VmFsdWUodCk7ZT90aGlzLl9rZXlNYW5hZ2VyLnVwZGF0ZUFjdGl2ZUl0ZW0oZSk6dGhpcy5wYW5lbE9wZW58fHRoaXMuX2tleU1hbmFnZXIudXBkYXRlQWN0aXZlSXRlbSgtMSl9dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9X3NlbGVjdFZhbHVlKHQpe2NvbnN0IGU9dGhpcy5vcHRpb25zLmZpbmQoKGU9PntpZih0aGlzLl9zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKGUpKXJldHVybiExO3RyeXtyZXR1cm4gbnVsbCE9ZS52YWx1ZSYmdGhpcy5fY29tcGFyZVdpdGgoZS52YWx1ZSx0KX1jYXRjaCh0KXtyZXR1cm4oInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmNvbnNvbGUud2Fybih0KSwhMX19KSk7cmV0dXJuIGUmJnRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdChlKSxlfV9pbml0S2V5TWFuYWdlcigpe3RoaXMuX2tleU1hbmFnZXI9bmV3IHRJKHRoaXMub3B0aW9ucykud2l0aFR5cGVBaGVhZCh0aGlzLl90eXBlYWhlYWREZWJvdW5jZUludGVydmFsKS53aXRoVmVydGljYWxPcmllbnRhdGlvbigpLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24odGhpcy5faXNSdGwoKT8icnRsIjoibHRyIikud2l0aEhvbWVBbmRFbmQoKS53aXRoQWxsb3dlZE1vZGlmaWVyS2V5cyhbInNoaWZ0S2V5Il0pLHRoaXMuX2tleU1hbmFnZXIudGFiT3V0LnBpcGUoSWUodGhpcy5fZGVzdHJveSkpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLnBhbmVsT3BlbiYmKCF0aGlzLm11bHRpcGxlJiZ0aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0mJnRoaXMuX2tleU1hbmFnZXIuYWN0aXZlSXRlbS5fc2VsZWN0VmlhSW50ZXJhY3Rpb24oKSx0aGlzLmZvY3VzKCksdGhpcy5jbG9zZSgpKX0pKSx0aGlzLl9rZXlNYW5hZ2VyLmNoYW5nZS5waXBlKEllKHRoaXMuX2Rlc3Ryb3kpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fcGFuZWxPcGVuJiZ0aGlzLnBhbmVsP3RoaXMuX3Njcm9sbE9wdGlvbkludG9WaWV3KHRoaXMuX2tleU1hbmFnZXIuYWN0aXZlSXRlbUluZGV4fHwwKTp0aGlzLl9wYW5lbE9wZW58fHRoaXMubXVsdGlwbGV8fCF0aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW18fHRoaXMuX2tleU1hbmFnZXIuYWN0aXZlSXRlbS5fc2VsZWN0VmlhSW50ZXJhY3Rpb24oKX0pKX1fcmVzZXRPcHRpb25zKCl7Y29uc3QgdD1yZSh0aGlzLm9wdGlvbnMuY2hhbmdlcyx0aGlzLl9kZXN0cm95KTt0aGlzLm9wdGlvblNlbGVjdGlvbkNoYW5nZXMucGlwZShJZSh0KSkuc3Vic2NyaWJlKCh0PT57dGhpcy5fb25TZWxlY3QodC5zb3VyY2UsdC5pc1VzZXJJbnB1dCksdC5pc1VzZXJJbnB1dCYmIXRoaXMubXVsdGlwbGUmJnRoaXMuX3BhbmVsT3BlbiYmKHRoaXMuY2xvc2UoKSx0aGlzLmZvY3VzKCkpfSkpLHJlKC4uLnRoaXMub3B0aW9ucy5tYXAoKHQ9PnQuX3N0YXRlQ2hhbmdlcykpKS5waXBlKEllKHQpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCksdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpfSkpfV9vblNlbGVjdCh0LGUpe2NvbnN0IG49dGhpcy5fc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZCh0KTtudWxsIT10LnZhbHVlfHx0aGlzLl9tdWx0aXBsZT8obiE9PXQuc2VsZWN0ZWQmJih0LnNlbGVjdGVkP3RoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdCh0KTp0aGlzLl9zZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdCh0KSksZSYmdGhpcy5fa2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKHQpLHRoaXMubXVsdGlwbGUmJih0aGlzLl9zb3J0VmFsdWVzKCksZSYmdGhpcy5mb2N1cygpKSk6KHQuZGVzZWxlY3QoKSx0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhcigpLG51bGwhPXRoaXMudmFsdWUmJnRoaXMuX3Byb3BhZ2F0ZUNoYW5nZXModC52YWx1ZSkpLG4hPT10aGlzLl9zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKHQpJiZ0aGlzLl9wcm9wYWdhdGVDaGFuZ2VzKCksdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpfV9zb3J0VmFsdWVzKCl7aWYodGhpcy5tdWx0aXBsZSl7Y29uc3QgdD10aGlzLm9wdGlvbnMudG9BcnJheSgpO3RoaXMuX3NlbGVjdGlvbk1vZGVsLnNvcnQoKChlLG4pPT50aGlzLnNvcnRDb21wYXJhdG9yP3RoaXMuc29ydENvbXBhcmF0b3IoZSxuLHQpOnQuaW5kZXhPZihlKS10LmluZGV4T2YobikpKSx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCl9fV9wcm9wYWdhdGVDaGFuZ2VzKHQpe2xldCBlPW51bGw7ZT10aGlzLm11bHRpcGxlP3RoaXMuc2VsZWN0ZWQubWFwKCh0PT50LnZhbHVlKSk6dGhpcy5zZWxlY3RlZD90aGlzLnNlbGVjdGVkLnZhbHVlOnQsdGhpcy5fdmFsdWU9ZSx0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoZSksdGhpcy5fb25DaGFuZ2UoZSksdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLl9nZXRDaGFuZ2VFdmVudChlKSksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9X2hpZ2hsaWdodENvcnJlY3RPcHRpb24oKXt0aGlzLl9rZXlNYW5hZ2VyJiYodGhpcy5lbXB0eT90aGlzLl9rZXlNYW5hZ2VyLnNldEZpcnN0SXRlbUFjdGl2ZSgpOnRoaXMuX2tleU1hbmFnZXIuc2V0QWN0aXZlSXRlbSh0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFswXSkpfV9jYW5PcGVuKCl7dmFyIHQ7cmV0dXJuIXRoaXMuX3BhbmVsT3BlbiYmIXRoaXMuZGlzYWJsZWQmJihudWxsPT09KHQ9dGhpcy5vcHRpb25zKXx8dm9pZCAwPT09dD92b2lkIDA6dC5sZW5ndGgpPjB9Zm9jdXModCl7dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKHQpfV9nZXRQYW5lbEFyaWFMYWJlbGxlZGJ5KCl7dmFyIHQ7aWYodGhpcy5hcmlhTGFiZWwpcmV0dXJuIG51bGw7Y29uc3QgZT1udWxsPT09KHQ9dGhpcy5fcGFyZW50Rm9ybUZpZWxkKXx8dm9pZCAwPT09dD92b2lkIDA6dC5nZXRMYWJlbElkKCk7cmV0dXJuIHRoaXMuYXJpYUxhYmVsbGVkYnk/KGU/ZSsiICI6IiIpK3RoaXMuYXJpYUxhYmVsbGVkYnk6ZX1fZ2V0QXJpYUFjdGl2ZURlc2NlbmRhbnQoKXtyZXR1cm4gdGhpcy5wYW5lbE9wZW4mJnRoaXMuX2tleU1hbmFnZXImJnRoaXMuX2tleU1hbmFnZXIuYWN0aXZlSXRlbT90aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0uaWQ6bnVsbH1fZ2V0VHJpZ2dlckFyaWFMYWJlbGxlZGJ5KCl7dmFyIHQ7aWYodGhpcy5hcmlhTGFiZWwpcmV0dXJuIG51bGw7Y29uc3QgZT1udWxsPT09KHQ9dGhpcy5fcGFyZW50Rm9ybUZpZWxkKXx8dm9pZCAwPT09dD92b2lkIDA6dC5nZXRMYWJlbElkKCk7bGV0IG49KGU/ZSsiICI6IiIpK3RoaXMuX3ZhbHVlSWQ7cmV0dXJuIHRoaXMuYXJpYUxhYmVsbGVkYnkmJihuKz0iICIrdGhpcy5hcmlhTGFiZWxsZWRieSksbn1fcGFuZWxEb25lQW5pbWF0aW5nKHQpe3RoaXMub3BlbmVkQ2hhbmdlLmVtaXQodCl9c2V0RGVzY3JpYmVkQnlJZHModCl7dGhpcy5fYXJpYURlc2NyaWJlZGJ5PXQuam9pbigiICIpfW9uQ29udGFpbmVyQ2xpY2soKXt0aGlzLmZvY3VzKCksdGhpcy5vcGVuKCl9Z2V0IHNob3VsZExhYmVsRmxvYXQoKXtyZXR1cm4gdGhpcy5fcGFuZWxPcGVufHwhdGhpcy5lbXB0eXx8dGhpcy5fZm9jdXNlZCYmISF0aGlzLl9wbGFjZWhvbGRlcn19UkcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFJHKShTbSh1RiksU20oVWcpLFNtKGFfKSxTbShiSCksU20oaGcpLFNtKEhJLDgpLFNtKGlVLDgpLFNtKFBVLDgpLFNtKFJWLDgpLFNtKE1qLDEwKSxOYSgidGFiaW5kZXgiKSxTbSh4RyksU20oT0kpLFNtKE9HLDgpKX0sUkcuybVkaXI9bG8oe3R5cGU6Ukcsdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihRaChtRyw1KSxRaCh1Ryw1KSxRaChnTCw1KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi50cmlnZ2VyPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLnBhbmVsPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLl9vdmVybGF5RGlyPXQuZmlyc3QpfX0saW5wdXRzOnthcmlhTGFiZWw6WyJhcmlhLWxhYmVsIiwiYXJpYUxhYmVsIl0saWQ6ImlkIixwbGFjZWhvbGRlcjoicGxhY2Vob2xkZXIiLHJlcXVpcmVkOiJyZXF1aXJlZCIsbXVsdGlwbGU6Im11bHRpcGxlIixkaXNhYmxlT3B0aW9uQ2VudGVyaW5nOiJkaXNhYmxlT3B0aW9uQ2VudGVyaW5nIixjb21wYXJlV2l0aDoiY29tcGFyZVdpdGgiLHZhbHVlOiJ2YWx1ZSIsdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbDoidHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbCIscGFuZWxDbGFzczoicGFuZWxDbGFzcyIsYXJpYUxhYmVsbGVkYnk6WyJhcmlhLWxhYmVsbGVkYnkiLCJhcmlhTGFiZWxsZWRieSJdLGVycm9yU3RhdGVNYXRjaGVyOiJlcnJvclN0YXRlTWF0Y2hlciIsc29ydENvbXBhcmF0b3I6InNvcnRDb21wYXJhdG9yIn0sb3V0cHV0czp7b3BlbmVkQ2hhbmdlOiJvcGVuZWRDaGFuZ2UiLF9vcGVuZWRTdHJlYW06Im9wZW5lZCIsX2Nsb3NlZFN0cmVhbToiY2xvc2VkIixzZWxlY3Rpb25DaGFuZ2U6InNlbGVjdGlvbkNoYW5nZSIsdmFsdWVDaGFuZ2U6InZhbHVlQ2hhbmdlIn0sZmVhdHVyZXM6W3hwLEJvXX0pLFJHLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6dUZ9LHt0eXBlOlVnfSx7dHlwZTphX30se3R5cGU6Ykh9LHt0eXBlOmhnfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTppVSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpQVSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpBVixkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbUlZdfV19LHt0eXBlOk1qLGRlY29yYXRvcnM6W3t0eXBlOkRyfSx7dHlwZTpTcn1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6amEsYXJnczpbInRhYmluZGV4Il19XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3hHXX1dfSx7dHlwZTpPSX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltPR119XX1dLFJHLnByb3BEZWNvcmF0b3JzPXt0cmlnZ2VyOlt7dHlwZTpaYSxhcmdzOlsidHJpZ2dlciJdfV0scGFuZWw6W3t0eXBlOlphLGFyZ3M6WyJwYW5lbCJdfV0sX292ZXJsYXlEaXI6W3t0eXBlOlphLGFyZ3M6W2dMXX1dLHBhbmVsQ2xhc3M6W3t0eXBlOnh5fV0scGxhY2Vob2xkZXI6W3t0eXBlOnh5fV0scmVxdWlyZWQ6W3t0eXBlOnh5fV0sbXVsdGlwbGU6W3t0eXBlOnh5fV0sZGlzYWJsZU9wdGlvbkNlbnRlcmluZzpbe3R5cGU6eHl9XSxjb21wYXJlV2l0aDpbe3R5cGU6eHl9XSx2YWx1ZTpbe3R5cGU6eHl9XSxhcmlhTGFiZWw6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsIl19XSxhcmlhTGFiZWxsZWRieTpbe3R5cGU6eHksYXJnczpbImFyaWEtbGFiZWxsZWRieSJdfV0sZXJyb3JTdGF0ZU1hdGNoZXI6W3t0eXBlOnh5fV0sdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbDpbe3R5cGU6eHl9XSxzb3J0Q29tcGFyYXRvcjpbe3R5cGU6eHl9XSxpZDpbe3R5cGU6eHl9XSxvcGVuZWRDaGFuZ2U6W3t0eXBlOk95fV0sX29wZW5lZFN0cmVhbTpbe3R5cGU6T3ksYXJnczpbIm9wZW5lZCJdfV0sX2Nsb3NlZFN0cmVhbTpbe3R5cGU6T3ksYXJnczpbImNsb3NlZCJdfV0sc2VsZWN0aW9uQ2hhbmdlOlt7dHlwZTpPeX1dLHZhbHVlQ2hhbmdlOlt7dHlwZTpPeX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFJHLFt7dHlwZTpDeX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp1Rn0se3R5cGU6VWd9LHt0eXBlOmFffSx7dHlwZTpiSH0se3R5cGU6aGd9LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOmlVLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOlBVLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOkFWLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltSVl19XX0se3R5cGU6TWosZGVjb3JhdG9yczpbe3R5cGU6RHJ9LHt0eXBlOlNyfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpqYSxhcmdzOlsidGFiaW5kZXgiXX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbeEddfV19LHt0eXBlOk9JfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W09HXX1dfV19KSx7YXJpYUxhYmVsOlt7dHlwZTp4eSxhcmdzOlsiYXJpYS1sYWJlbCJdfV0sb3BlbmVkQ2hhbmdlOlt7dHlwZTpPeX1dLF9vcGVuZWRTdHJlYW06W3t0eXBlOk95LGFyZ3M6WyJvcGVuZWQiXX1dLF9jbG9zZWRTdHJlYW06W3t0eXBlOk95LGFyZ3M6WyJjbG9zZWQiXX1dLHNlbGVjdGlvbkNoYW5nZTpbe3R5cGU6T3l9XSx2YWx1ZUNoYW5nZTpbe3R5cGU6T3l9XSxpZDpbe3R5cGU6eHl9XSxwbGFjZWhvbGRlcjpbe3R5cGU6eHl9XSxyZXF1aXJlZDpbe3R5cGU6eHl9XSxtdWx0aXBsZTpbe3R5cGU6eHl9XSxkaXNhYmxlT3B0aW9uQ2VudGVyaW5nOlt7dHlwZTp4eX1dLGNvbXBhcmVXaXRoOlt7dHlwZTp4eX1dLHZhbHVlOlt7dHlwZTp4eX1dLHR5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWw6W3t0eXBlOnh5fV0sdHJpZ2dlcjpbe3R5cGU6WmEsYXJnczpbInRyaWdnZXIiXX1dLHBhbmVsOlt7dHlwZTpaYSxhcmdzOlsicGFuZWwiXX1dLF9vdmVybGF5RGlyOlt7dHlwZTpaYSxhcmdzOltnTF19XSxwYW5lbENsYXNzOlt7dHlwZTp4eX1dLGFyaWFMYWJlbGxlZGJ5Olt7dHlwZTp4eSxhcmdzOlsiYXJpYS1sYWJlbGxlZGJ5Il19XSxlcnJvclN0YXRlTWF0Y2hlcjpbe3R5cGU6eHl9XSxzb3J0Q29tcGFyYXRvcjpbe3R5cGU6eHl9XX0pO2NsYXNzIEFHIGV4dGVuZHMgUkd7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX3Njcm9sbFRvcD0wLHRoaXMuX3RyaWdnZXJGb250U2l6ZT0wLHRoaXMuX3RyYW5zZm9ybU9yaWdpbj0idG9wIix0aGlzLl9vZmZzZXRZPTAsdGhpcy5fcG9zaXRpb25zPVt7b3JpZ2luWDoic3RhcnQiLG9yaWdpblk6InRvcCIsb3ZlcmxheVg6InN0YXJ0IixvdmVybGF5WToidG9wIn0se29yaWdpblg6InN0YXJ0IixvcmlnaW5ZOiJib3R0b20iLG92ZXJsYXlYOiJzdGFydCIsb3ZlcmxheVk6ImJvdHRvbSJ9XX1fY2FsY3VsYXRlT3ZlcmxheVNjcm9sbCh0LGUsbil7Y29uc3Qgbz10aGlzLl9nZXRJdGVtSGVpZ2h0KCk7cmV0dXJuIE1hdGgubWluKE1hdGgubWF4KDAsbyp0LWUrby8yKSxuKX1uZ09uSW5pdCgpe3N1cGVyLm5nT25Jbml0KCksdGhpcy5fdmlld3BvcnRSdWxlci5jaGFuZ2UoKS5waXBlKEllKHRoaXMuX2Rlc3Ryb3kpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5wYW5lbE9wZW4mJih0aGlzLl90cmlnZ2VyUmVjdD10aGlzLnRyaWdnZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSl9KSl9b3Blbigpe3N1cGVyLl9jYW5PcGVuKCkmJihzdXBlci5vcGVuKCksdGhpcy5fdHJpZ2dlclJlY3Q9dGhpcy50cmlnZ2VyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdGhpcy5fdHJpZ2dlckZvbnRTaXplPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUodGhpcy50cmlnZ2VyLm5hdGl2ZUVsZW1lbnQpLmZvbnRTaXplfHwiMCIpLHRoaXMuX2NhbGN1bGF0ZU92ZXJsYXlQb3NpdGlvbigpLHRoaXMuX25nWm9uZS5vblN0YWJsZS5waXBlKGJlKDEpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fdHJpZ2dlckZvbnRTaXplJiZ0aGlzLl9vdmVybGF5RGlyLm92ZXJsYXlSZWYmJnRoaXMuX292ZXJsYXlEaXIub3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudCYmKHRoaXMuX292ZXJsYXlEaXIub3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5zdHlsZS5mb250U2l6ZT1gJHt0aGlzLl90cmlnZ2VyRm9udFNpemV9cHhgKX0pKSl9X3Njcm9sbE9wdGlvbkludG9WaWV3KHQpe2NvbnN0IGU9VkgodCx0aGlzLm9wdGlvbnMsdGhpcy5vcHRpb25Hcm91cHMpLG49dGhpcy5fZ2V0SXRlbUhlaWdodCgpO3RoaXMucGFuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A9MD09PXQmJjE9PT1lPzA6akgoKHQrZSkqbixuLHRoaXMucGFuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AsdkcpfV9wb3NpdGlvbmluZ1NldHRsZWQoKXt0aGlzLl9jYWxjdWxhdGVPdmVybGF5T2Zmc2V0WCgpLHRoaXMucGFuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A9dGhpcy5fc2Nyb2xsVG9wfV9wYW5lbERvbmVBbmltYXRpbmcodCl7dGhpcy5wYW5lbE9wZW4/dGhpcy5fc2Nyb2xsVG9wPTA6KHRoaXMuX292ZXJsYXlEaXIub2Zmc2V0WD0wLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKSxzdXBlci5fcGFuZWxEb25lQW5pbWF0aW5nKHQpfV9nZXRDaGFuZ2VFdmVudCh0KXtyZXR1cm4gbmV3IGtHKHRoaXMsdCl9X2NhbGN1bGF0ZU92ZXJsYXlPZmZzZXRYKCl7Y29uc3QgdD10aGlzLl9vdmVybGF5RGlyLm92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZT10aGlzLl92aWV3cG9ydFJ1bGVyLmdldFZpZXdwb3J0U2l6ZSgpLG49dGhpcy5faXNSdGwoKSxvPXRoaXMubXVsdGlwbGU/NTY6MzI7bGV0IGk7aWYodGhpcy5tdWx0aXBsZSlpPTQwO2Vsc2UgaWYodGhpcy5kaXNhYmxlT3B0aW9uQ2VudGVyaW5nKWk9MTY7ZWxzZXtsZXQgdD10aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFswXXx8dGhpcy5vcHRpb25zLmZpcnN0O2k9dCYmdC5ncm91cD8zMjoxNn1ufHwoaSo9LTEpO2NvbnN0IGE9MC0odC5sZWZ0K2ktKG4/bzowKSkscj10LnJpZ2h0K2ktZS53aWR0aCsobj8wOm8pO2E+MD9pKz1hKzg6cj4wJiYoaS09cis4KSx0aGlzLl9vdmVybGF5RGlyLm9mZnNldFg9TWF0aC5yb3VuZChpKSx0aGlzLl9vdmVybGF5RGlyLm92ZXJsYXlSZWYudXBkYXRlUG9zaXRpb24oKX1fY2FsY3VsYXRlT3ZlcmxheU9mZnNldFkodCxlLG4pe2NvbnN0IG89dGhpcy5fZ2V0SXRlbUhlaWdodCgpLGk9KG8tdGhpcy5fdHJpZ2dlclJlY3QuaGVpZ2h0KS8yLGE9TWF0aC5mbG9vcih2Ry9vKTtsZXQgcjtyZXR1cm4gdGhpcy5kaXNhYmxlT3B0aW9uQ2VudGVyaW5nPzA6KHI9MD09PXRoaXMuX3Njcm9sbFRvcD90Km86dGhpcy5fc2Nyb2xsVG9wPT09bj8odC0odGhpcy5fZ2V0SXRlbUNvdW50KCktYSkpKm8rKG8tKHRoaXMuX2dldEl0ZW1Db3VudCgpKm8tdkcpJW8pOmUtby8yLE1hdGgucm91bmQoLTEqci1pKSl9X2NoZWNrT3ZlcmxheVdpdGhpblZpZXdwb3J0KHQpe2NvbnN0IGU9dGhpcy5fZ2V0SXRlbUhlaWdodCgpLG49dGhpcy5fdmlld3BvcnRSdWxlci5nZXRWaWV3cG9ydFNpemUoKSxvPXRoaXMuX3RyaWdnZXJSZWN0LnRvcC04LGk9bi5oZWlnaHQtdGhpcy5fdHJpZ2dlclJlY3QuYm90dG9tLTgsYT1NYXRoLmFicyh0aGlzLl9vZmZzZXRZKSxyPU1hdGgubWluKHRoaXMuX2dldEl0ZW1Db3VudCgpKmUsdkcpLWEtdGhpcy5fdHJpZ2dlclJlY3QuaGVpZ2h0O3I+aT90aGlzLl9hZGp1c3RQYW5lbFVwKHIsaSk6YT5vP3RoaXMuX2FkanVzdFBhbmVsRG93bihhLG8sdCk6dGhpcy5fdHJhbnNmb3JtT3JpZ2luPXRoaXMuX2dldE9yaWdpbkJhc2VkT25PcHRpb24oKX1fYWRqdXN0UGFuZWxVcCh0LGUpe2NvbnN0IG49TWF0aC5yb3VuZCh0LWUpO3RoaXMuX3Njcm9sbFRvcC09bix0aGlzLl9vZmZzZXRZLT1uLHRoaXMuX3RyYW5zZm9ybU9yaWdpbj10aGlzLl9nZXRPcmlnaW5CYXNlZE9uT3B0aW9uKCksdGhpcy5fc2Nyb2xsVG9wPD0wJiYodGhpcy5fc2Nyb2xsVG9wPTAsdGhpcy5fb2Zmc2V0WT0wLHRoaXMuX3RyYW5zZm9ybU9yaWdpbj0iNTAlIGJvdHRvbSAwcHgiKX1fYWRqdXN0UGFuZWxEb3duKHQsZSxuKXtjb25zdCBvPU1hdGgucm91bmQodC1lKTtpZih0aGlzLl9zY3JvbGxUb3ArPW8sdGhpcy5fb2Zmc2V0WSs9byx0aGlzLl90cmFuc2Zvcm1PcmlnaW49dGhpcy5fZ2V0T3JpZ2luQmFzZWRPbk9wdGlvbigpLHRoaXMuX3Njcm9sbFRvcD49bilyZXR1cm4gdGhpcy5fc2Nyb2xsVG9wPW4sdGhpcy5fb2Zmc2V0WT0wLHZvaWQodGhpcy5fdHJhbnNmb3JtT3JpZ2luPSI1MCUgdG9wIDBweCIpfV9jYWxjdWxhdGVPdmVybGF5UG9zaXRpb24oKXtjb25zdCB0PXRoaXMuX2dldEl0ZW1IZWlnaHQoKSxlPXRoaXMuX2dldEl0ZW1Db3VudCgpLG49TWF0aC5taW4oZSp0LHZHKSxvPWUqdC1uO2xldCBpO2k9dGhpcy5lbXB0eT8wOk1hdGgubWF4KHRoaXMub3B0aW9ucy50b0FycmF5KCkuaW5kZXhPZih0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFswXSksMCksaSs9VkgoaSx0aGlzLm9wdGlvbnMsdGhpcy5vcHRpb25Hcm91cHMpO2NvbnN0IGE9bi8yO3RoaXMuX3Njcm9sbFRvcD10aGlzLl9jYWxjdWxhdGVPdmVybGF5U2Nyb2xsKGksYSxvKSx0aGlzLl9vZmZzZXRZPXRoaXMuX2NhbGN1bGF0ZU92ZXJsYXlPZmZzZXRZKGksYSxvKSx0aGlzLl9jaGVja092ZXJsYXlXaXRoaW5WaWV3cG9ydChvKX1fZ2V0T3JpZ2luQmFzZWRPbk9wdGlvbigpe2NvbnN0IHQ9dGhpcy5fZ2V0SXRlbUhlaWdodCgpLGU9KHQtdGhpcy5fdHJpZ2dlclJlY3QuaGVpZ2h0KS8yO3JldHVybmA1MCUgJHtNYXRoLmFicyh0aGlzLl9vZmZzZXRZKS1lK3QvMn1weCAwcHhgfV9nZXRJdGVtSGVpZ2h0KCl7cmV0dXJuIDMqdGhpcy5fdHJpZ2dlckZvbnRTaXplfV9nZXRJdGVtQ291bnQoKXtyZXR1cm4gdGhpcy5vcHRpb25zLmxlbmd0aCt0aGlzLm9wdGlvbkdyb3Vwcy5sZW5ndGh9fUFHLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYShBRykpKShufHxBRyl9fSkoKSxBRy7JtWNtcD10byh7dHlwZTpBRyxzZWxlY3RvcnM6W1sibWF0LXNlbGVjdCJdXSxjb250ZW50UXVlcmllczpmdW5jdGlvbiB0KGUsbixvKXtpZigxJmUmJigkaChvLERHLDUpLCRoKG8sQkgsNSksJGgobyx6SCw1KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5jdXN0b21UcmlnZ2VyPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLm9wdGlvbnM9dCksSmgodD10YigpKSYmKG4ub3B0aW9uR3JvdXBzPXQpfX0saG9zdEF0dHJzOlsicm9sZSIsImNvbWJvYm94IiwiYXJpYS1hdXRvY29tcGxldGUiLCJub25lIiwiYXJpYS1oYXNwb3B1cCIsInRydWUiLDEsIm1hdC1zZWxlY3QiXSxob3N0VmFyczoyMCxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezEmZSYmVm0oImtleWRvd24iLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9oYW5kbGVLZXlkb3duKGUpfSkpKCJmb2N1cyIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5fb25Gb2N1cygpfSkpKCJibHVyIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9vbkJsdXIoKX0pKSwyJmUmJihqcCgiaWQiLG4uaWQpKCJ0YWJpbmRleCIsbi50YWJJbmRleCkoImFyaWEtY29udHJvbHMiLG4ucGFuZWxPcGVuP24uaWQrIi1wYW5lbCI6bnVsbCkoImFyaWEtZXhwYW5kZWQiLG4ucGFuZWxPcGVuKSgiYXJpYS1sYWJlbCIsbi5hcmlhTGFiZWx8fG51bGwpKCJhcmlhLXJlcXVpcmVkIixuLnJlcXVpcmVkLnRvU3RyaW5nKCkpKCJhcmlhLWRpc2FibGVkIixuLmRpc2FibGVkLnRvU3RyaW5nKCkpKCJhcmlhLWludmFsaWQiLG4uZXJyb3JTdGF0ZSkoImFyaWEtZGVzY3JpYmVkYnkiLG4uX2FyaWFEZXNjcmliZWRieXx8bnVsbCkoImFyaWEtYWN0aXZlZGVzY2VuZGFudCIsbi5fZ2V0QXJpYUFjdGl2ZURlc2NlbmRhbnQoKSkscHUoIm1hdC1zZWxlY3QtZGlzYWJsZWQiLG4uZGlzYWJsZWQpKCJtYXQtc2VsZWN0LWludmFsaWQiLG4uZXJyb3JTdGF0ZSkoIm1hdC1zZWxlY3QtcmVxdWlyZWQiLG4ucmVxdWlyZWQpKCJtYXQtc2VsZWN0LWVtcHR5IixuLmVtcHR5KSgibWF0LXNlbGVjdC1tdWx0aXBsZSIsbi5tdWx0aXBsZSkpfSxpbnB1dHM6e2Rpc2FibGVkOiJkaXNhYmxlZCIsZGlzYWJsZVJpcHBsZToiZGlzYWJsZVJpcHBsZSIsdGFiSW5kZXg6InRhYkluZGV4In0sZXhwb3J0QXM6WyJtYXRTZWxlY3QiXSxmZWF0dXJlczpbcGcoW3twcm92aWRlOmJWLHVzZUV4aXN0aW5nOkFHfSx7cHJvdmlkZTpSSCx1c2VFeGlzdGluZzpBR31dKSx4cF0sbmdDb250ZW50U2VsZWN0b3JzOlsibWF0LXNlbGVjdC10cmlnZ2VyIiwiKiJdLGRlY2xzOjksdmFyczoxMixjb25zdHM6W1siY2RrLW92ZXJsYXktb3JpZ2luIiwiIiwxLCJtYXQtc2VsZWN0LXRyaWdnZXIiLDMsImNsaWNrIl0sWyJvcmlnaW4iLCJjZGtPdmVybGF5T3JpZ2luIiwidHJpZ2dlciIsIiJdLFsxLCJtYXQtc2VsZWN0LXZhbHVlIiwzLCJuZ1N3aXRjaCJdLFsiY2xhc3MiLCJtYXQtc2VsZWN0LXBsYWNlaG9sZGVyIG1hdC1zZWxlY3QtbWluLWxpbmUiLDQsIm5nU3dpdGNoQ2FzZSJdLFsiY2xhc3MiLCJtYXQtc2VsZWN0LXZhbHVlLXRleHQiLDMsIm5nU3dpdGNoIiw0LCJuZ1N3aXRjaENhc2UiXSxbMSwibWF0LXNlbGVjdC1hcnJvdy13cmFwcGVyIl0sWzEsIm1hdC1zZWxlY3QtYXJyb3ciXSxbImNkay1jb25uZWN0ZWQtb3ZlcmxheSIsIiIsImNka0Nvbm5lY3RlZE92ZXJsYXlMb2NrUG9zaXRpb24iLCIiLCJjZGtDb25uZWN0ZWRPdmVybGF5SGFzQmFja2Ryb3AiLCIiLCJjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcyIsImNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wIiwzLCJjZGtDb25uZWN0ZWRPdmVybGF5UGFuZWxDbGFzcyIsImNka0Nvbm5lY3RlZE92ZXJsYXlTY3JvbGxTdHJhdGVneSIsImNka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW4iLCJjZGtDb25uZWN0ZWRPdmVybGF5T3BlbiIsImNka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnMiLCJjZGtDb25uZWN0ZWRPdmVybGF5TWluV2lkdGgiLCJjZGtDb25uZWN0ZWRPdmVybGF5T2Zmc2V0WSIsImJhY2tkcm9wQ2xpY2siLCJhdHRhY2giLCJkZXRhY2giXSxbMSwibWF0LXNlbGVjdC1wbGFjZWhvbGRlciIsIm1hdC1zZWxlY3QtbWluLWxpbmUiXSxbMSwibWF0LXNlbGVjdC12YWx1ZS10ZXh0IiwzLCJuZ1N3aXRjaCJdLFsiY2xhc3MiLCJtYXQtc2VsZWN0LW1pbi1saW5lIiw0LCJuZ1N3aXRjaERlZmF1bHQiXSxbNCwibmdTd2l0Y2hDYXNlIl0sWzEsIm1hdC1zZWxlY3QtbWluLWxpbmUiXSxbMSwibWF0LXNlbGVjdC1wYW5lbC13cmFwIl0sWyJyb2xlIiwibGlzdGJveCIsInRhYmluZGV4IiwiLTEiLDMsIm5nQ2xhc3MiLCJrZXlkb3duIl0sWyJwYW5lbCIsIiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoWm0oX0cpLFJtKDAsImRpdiIsMCwxKSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4udG9nZ2xlKCl9KSksUm0oMywiZGl2IiwyKSxRcCg0LGZHLDIsMSwic3BhbiIsMyksUXAoNSxiRywzLDIsInNwYW4iLDQpLEFtKCksUm0oNiwiZGl2Iiw1KSxUbSg3LCJkaXYiLDYpLEFtKCksQW0oKSxRcCg4LHlHLDQsMTQsIm5nLXRlbXBsYXRlIiw3KSxWbSgiYmFja2Ryb3BDbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5jbG9zZSgpfSkpKCJhdHRhY2giLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX29uQXR0YWNoZWQoKX0pKSgiZGV0YWNoIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLmNsb3NlKCl9KSkpLDImZSl7Y29uc3QgdD0kcCgxKTtqcCgiYXJpYS1vd25zIixuLnBhbmVsT3Blbj9uLmlkKyItcGFuZWwiOm51bGwpLHJjKDMpLERtKCJuZ1N3aXRjaCIsbi5lbXB0eSksanAoImlkIixuLl92YWx1ZUlkKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIiwhMCkscmMoMSksRG0oIm5nU3dpdGNoQ2FzZSIsITEpLHJjKDMpLERtKCJjZGtDb25uZWN0ZWRPdmVybGF5UGFuZWxDbGFzcyIsbi5fb3ZlcmxheVBhbmVsQ2xhc3MpKCJjZGtDb25uZWN0ZWRPdmVybGF5U2Nyb2xsU3RyYXRlZ3kiLG4uX3Njcm9sbFN0cmF0ZWd5KSgiY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbiIsdCkoImNka0Nvbm5lY3RlZE92ZXJsYXlPcGVuIixuLnBhbmVsT3BlbikoImNka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnMiLG4uX3Bvc2l0aW9ucykoImNka0Nvbm5lY3RlZE92ZXJsYXlNaW5XaWR0aCIsbnVsbD09bi5fdHJpZ2dlclJlY3Q/bnVsbDpuLl90cmlnZ2VyUmVjdC53aWR0aCkoImNka0Nvbm5lY3RlZE92ZXJsYXlPZmZzZXRZIixuLl9vZmZzZXRZKX19LGRpcmVjdGl2ZXM6W2ZMLGZNLGdNLGdMLGhNLGFNXSxzdHlsZXM6WycubWF0LXNlbGVjdHtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxMDAlO291dGxpbmU6bm9uZX0ubWF0LXNlbGVjdC10cmlnZ2Vye2Rpc3BsYXk6aW5saW5lLXRhYmxlO2N1cnNvcjpwb2ludGVyO3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LXNlbGVjdC1kaXNhYmxlZCAubWF0LXNlbGVjdC10cmlnZ2Vyey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6ZGVmYXVsdH0ubWF0LXNlbGVjdC12YWx1ZXtkaXNwbGF5OnRhYmxlLWNlbGw7bWF4LXdpZHRoOjA7d2lkdGg6MTAwJTtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9Lm1hdC1zZWxlY3QtdmFsdWUtdGV4dHt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9Lm1hdC1zZWxlY3QtYXJyb3ctd3JhcHBlcntkaXNwbGF5OnRhYmxlLWNlbGw7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1zZWxlY3QtYXJyb3ctd3JhcHBlcnt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtc2VsZWN0LWFycm93LXdyYXBwZXJ7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTI1JSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtaGFzLWxhYmVsIC5tYXQtc2VsZWN0Om5vdCgubWF0LXNlbGVjdC1lbXB0eSkgLm1hdC1zZWxlY3QtYXJyb3ctd3JhcHBlcnt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWVtcHR5IC5tYXQtc2VsZWN0LWFycm93LXdyYXBwZXJ7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1lbXB0eSAubWF0LXNlbGVjdC1hcnJvdy13cmFwcGVye3RyYW5zaXRpb246bm9uZX0ubWF0LXNlbGVjdC1hcnJvd3t3aWR0aDowO2hlaWdodDowO2JvcmRlci1sZWZ0OjVweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmlnaHQ6NXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci10b3A6NXB4IHNvbGlkO21hcmdpbjowIDRweH0ubWF0LXNlbGVjdC1wYW5lbC13cmFwe2ZsZXgtYmFzaXM6MTAwJX0ubWF0LXNlbGVjdC1wYW5lbHttaW4td2lkdGg6MTEycHg7bWF4LXdpZHRoOjI4MHB4O292ZXJmbG93OmF1dG87LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7cGFkZGluZy10b3A6MDtwYWRkaW5nLWJvdHRvbTowO21heC1oZWlnaHQ6MjU2cHg7bWluLXdpZHRoOjEwMCU7Ym9yZGVyLXJhZGl1czo0cHg7b3V0bGluZTowfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zZWxlY3QtcGFuZWx7b3V0bGluZTpzb2xpZCAxcHh9Lm1hdC1zZWxlY3QtcGFuZWwgLm1hdC1vcHRncm91cC1sYWJlbCwubWF0LXNlbGVjdC1wYW5lbCAubWF0LW9wdGlvbntmb250LXNpemU6aW5oZXJpdDtsaW5lLWhlaWdodDozZW07aGVpZ2h0OjNlbX0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtc2VsZWN0Om5vdCgubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQpIC5tYXQtZm9ybS1maWVsZC1mbGV4e2N1cnNvcjpwb2ludGVyfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1zZWxlY3QgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3dpZHRoOmNhbGMoMTAwJSAtIDE4cHgpfS5tYXQtc2VsZWN0LXBsYWNlaG9sZGVye3RyYW5zaXRpb246Y29sb3IgNDAwbXMgMTMzLjMzMzMzMzMzMzNtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJ7dHJhbnNpdGlvbjpub25lfS5tYXQtZm9ybS1maWVsZC1oaWRlLXBsYWNlaG9sZGVyIC5tYXQtc2VsZWN0LXBsYWNlaG9sZGVye2NvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtdGV4dC1maWxsLWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246bm9uZTtkaXNwbGF5OmJsb2NrfS5tYXQtc2VsZWN0LW1pbi1saW5lOmVtcHR5OjpiZWZvcmV7Y29udGVudDoiICI7d2hpdGUtc3BhY2U6cHJlO3dpZHRoOjFweDtkaXNwbGF5OmlubGluZS1ibG9jaztvcGFjaXR5OjB9XG4nXSxlbmNhcHN1bGF0aW9uOjIsZGF0YTp7YW5pbWF0aW9uOltDRy50cmFuc2Zvcm1QYW5lbFdyYXAsQ0cudHJhbnNmb3JtUGFuZWxdfSxjaGFuZ2VEZXRlY3Rpb246MH0pLEFHLnByb3BEZWNvcmF0b3JzPXtvcHRpb25zOlt7dHlwZTpZYSxhcmdzOltCSCx7ZGVzY2VuZGFudHM6ITB9XX1dLG9wdGlvbkdyb3Vwczpbe3R5cGU6WWEsYXJnczpbekgse2Rlc2NlbmRhbnRzOiEwfV19XSxjdXN0b21UcmlnZ2VyOlt7dHlwZTpxYSxhcmdzOltER119XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChBRyxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtYXQtc2VsZWN0IixleHBvcnRBczoibWF0U2VsZWN0Iix0ZW1wbGF0ZTonXHgzYyEtLVxuIE5vdGUgdGhhdCB0aGUgc2VsZWN0IHRyaWdnZXIgZWxlbWVudCBzcGVjaWZpZXMgYGFyaWEtb3duc2AgcG9pbnRpbmcgdG8gdGhlIGxpc3Rib3ggb3ZlcmxheS5cbiBXaGlsZSBhcmlhLW93bnMgaXMgbm90IHJlcXVpcmVkIGZvciB0aGUgQVJJQSAxLjIgYHJvbGU9ImNvbWJvYm94ImAgaW50ZXJhY3Rpb24gcGF0dGVybixcbiBpdCBmaXhlcyBhbiBpc3N1ZSB3aXRoIFZvaWNlT3ZlciB3aGVuIHRoZSBzZWxlY3QgYXBwZWFycyBpbnNpZGUgb2YgYW4gYGFyaWEtbW9kZWw9InRydWUiYFxuIGVsZW1lbnQgKGUuZy4gYSBkaWFsb2cpLiBXaXRob3V0IHRoaXMgYGFyaWEtb3duc2AsIHRoZSBgYXJpYS1tb2RhbGAgb24gYSBkaWFsb2cgcHJldmVudHNcbiBWb2ljZU92ZXIgZnJvbSAic2VlaW5nIiB0aGUgc2VsZWN0XCdzIGxpc3Rib3ggb3ZlcmxheSBmb3IgYXJpYS1hY3RpdmVkZXNjZW5kYW50LlxuIFVzaW5nIGBhcmlhLW93bnNgIHJlLXBhcmVudHMgdGhlIHNlbGVjdCBvdmVybGF5IHNvIHRoYXQgaXQgd29ya3MgYWdhaW4uXG4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvaXNzdWVzLzIwNjk0XG4tLVx4M2VcbjxkaXYgY2RrLW92ZXJsYXktb3JpZ2luXG4gICAgIFthdHRyLmFyaWEtb3duc109InBhbmVsT3BlbiA/IGlkICsgXCctcGFuZWxcJyA6IG51bGwiXG4gICAgIGNsYXNzPSJtYXQtc2VsZWN0LXRyaWdnZXIiXG4gICAgIChjbGljayk9InRvZ2dsZSgpIlxuICAgICAjb3JpZ2luPSJjZGtPdmVybGF5T3JpZ2luIlxuICAgICAjdHJpZ2dlcj5cbiAgPGRpdiBjbGFzcz0ibWF0LXNlbGVjdC12YWx1ZSIgW25nU3dpdGNoXT0iZW1wdHkiIFthdHRyLmlkXT0iX3ZhbHVlSWQiPlxuICAgIDxzcGFuIGNsYXNzPSJtYXQtc2VsZWN0LXBsYWNlaG9sZGVyIG1hdC1zZWxlY3QtbWluLWxpbmUiICpuZ1N3aXRjaENhc2U9InRydWUiPnt7cGxhY2Vob2xkZXJ9fTwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz0ibWF0LXNlbGVjdC12YWx1ZS10ZXh0IiAqbmdTd2l0Y2hDYXNlPSJmYWxzZSIgW25nU3dpdGNoXT0iISFjdXN0b21UcmlnZ2VyIj5cbiAgICAgIDxzcGFuIGNsYXNzPSJtYXQtc2VsZWN0LW1pbi1saW5lIiAqbmdTd2l0Y2hEZWZhdWx0Pnt7dHJpZ2dlclZhbHVlfX08L3NwYW4+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9Im1hdC1zZWxlY3QtdHJpZ2dlciIgKm5nU3dpdGNoQ2FzZT0idHJ1ZSI+PC9uZy1jb250ZW50PlxuICAgIDwvc3Bhbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz0ibWF0LXNlbGVjdC1hcnJvdy13cmFwcGVyIj48ZGl2IGNsYXNzPSJtYXQtc2VsZWN0LWFycm93Ij48L2Rpdj48L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGVcbiAgY2RrLWNvbm5lY3RlZC1vdmVybGF5XG4gIGNka0Nvbm5lY3RlZE92ZXJsYXlMb2NrUG9zaXRpb25cbiAgY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wXG4gIGNka0Nvbm5lY3RlZE92ZXJsYXlCYWNrZHJvcENsYXNzPSJjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCJcbiAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlQYW5lbENsYXNzXT0iX292ZXJsYXlQYW5lbENsYXNzIlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheVNjcm9sbFN0cmF0ZWd5XT0iX3Njcm9sbFN0cmF0ZWd5IlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbl09Im9yaWdpbiJcbiAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT0icGFuZWxPcGVuIlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uc109Il9wb3NpdGlvbnMiXG4gIFtjZGtDb25uZWN0ZWRPdmVybGF5TWluV2lkdGhdPSJfdHJpZ2dlclJlY3Q/LndpZHRoISJcbiAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPZmZzZXRZXT0iX29mZnNldFkiXG4gIChiYWNrZHJvcENsaWNrKT0iY2xvc2UoKSJcbiAgKGF0dGFjaCk9Il9vbkF0dGFjaGVkKCkiXG4gIChkZXRhY2gpPSJjbG9zZSgpIj5cbiAgPGRpdiBjbGFzcz0ibWF0LXNlbGVjdC1wYW5lbC13cmFwIiBbQHRyYW5zZm9ybVBhbmVsV3JhcF0+XG4gICAgPGRpdlxuICAgICAgI3BhbmVsXG4gICAgICByb2xlPSJsaXN0Ym94IlxuICAgICAgdGFiaW5kZXg9Ii0xIlxuICAgICAgY2xhc3M9Im1hdC1zZWxlY3QtcGFuZWwge3sgX2dldFBhbmVsVGhlbWUoKSB9fSJcbiAgICAgIFthdHRyLmlkXT0iaWQgKyBcJy1wYW5lbFwnIlxuICAgICAgW2F0dHIuYXJpYS1tdWx0aXNlbGVjdGFibGVdPSJtdWx0aXBsZSJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPSJhcmlhTGFiZWwgfHwgbnVsbCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09Il9nZXRQYW5lbEFyaWFMYWJlbGxlZGJ5KCkiXG4gICAgICBbbmdDbGFzc109InBhbmVsQ2xhc3MiXG4gICAgICBbQHRyYW5zZm9ybVBhbmVsXT0ibXVsdGlwbGUgPyBcJ3Nob3dpbmctbXVsdGlwbGVcJyA6IFwnc2hvd2luZ1wnIlxuICAgICAgKEB0cmFuc2Zvcm1QYW5lbC5kb25lKT0iX3BhbmVsRG9uZUFuaW1hdGluZ1N0cmVhbS5uZXh0KCRldmVudC50b1N0YXRlKSJcbiAgICAgIFtzdHlsZS50cmFuc2Zvcm1PcmlnaW5dPSJfdHJhbnNmb3JtT3JpZ2luIlxuICAgICAgW3N0eWxlLmZvbnQtc2l6ZS5weF09Il90cmlnZ2VyRm9udFNpemUiXG4gICAgICAoa2V5ZG93bik9Il9oYW5kbGVLZXlkb3duKCRldmVudCkiPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4nLGlucHV0czpbImRpc2FibGVkIiwiZGlzYWJsZVJpcHBsZSIsInRhYkluZGV4Il0sZW5jYXBzdWxhdGlvbjpIbi5Ob25lLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2gsaG9zdDp7cm9sZToiY29tYm9ib3giLCJhcmlhLWF1dG9jb21wbGV0ZSI6Im5vbmUiLCJhcmlhLWhhc3BvcHVwIjoidHJ1ZSIsY2xhc3M6Im1hdC1zZWxlY3QiLCJbYXR0ci5pZF0iOiJpZCIsIlthdHRyLnRhYmluZGV4XSI6InRhYkluZGV4IiwiW2F0dHIuYXJpYS1jb250cm9sc10iOidwYW5lbE9wZW4gPyBpZCArICItcGFuZWwiIDogbnVsbCcsIlthdHRyLmFyaWEtZXhwYW5kZWRdIjoicGFuZWxPcGVuIiwiW2F0dHIuYXJpYS1sYWJlbF0iOiJhcmlhTGFiZWwgfHwgbnVsbCIsIlthdHRyLmFyaWEtcmVxdWlyZWRdIjoicmVxdWlyZWQudG9TdHJpbmcoKSIsIlthdHRyLmFyaWEtZGlzYWJsZWRdIjoiZGlzYWJsZWQudG9TdHJpbmcoKSIsIlthdHRyLmFyaWEtaW52YWxpZF0iOiJlcnJvclN0YXRlIiwiW2F0dHIuYXJpYS1kZXNjcmliZWRieV0iOiJfYXJpYURlc2NyaWJlZGJ5IHx8IG51bGwiLCJbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdIjoiX2dldEFyaWFBY3RpdmVEZXNjZW5kYW50KCkiLCJbY2xhc3MubWF0LXNlbGVjdC1kaXNhYmxlZF0iOiJkaXNhYmxlZCIsIltjbGFzcy5tYXQtc2VsZWN0LWludmFsaWRdIjoiZXJyb3JTdGF0ZSIsIltjbGFzcy5tYXQtc2VsZWN0LXJlcXVpcmVkXSI6InJlcXVpcmVkIiwiW2NsYXNzLm1hdC1zZWxlY3QtZW1wdHldIjoiZW1wdHkiLCJbY2xhc3MubWF0LXNlbGVjdC1tdWx0aXBsZV0iOiJtdWx0aXBsZSIsIihrZXlkb3duKSI6Il9oYW5kbGVLZXlkb3duKCRldmVudCkiLCIoZm9jdXMpIjoiX29uRm9jdXMoKSIsIihibHVyKSI6Il9vbkJsdXIoKSJ9LGFuaW1hdGlvbnM6W0NHLnRyYW5zZm9ybVBhbmVsV3JhcCxDRy50cmFuc2Zvcm1QYW5lbF0scHJvdmlkZXJzOlt7cHJvdmlkZTpiVix1c2VFeGlzdGluZzpBR30se3Byb3ZpZGU6UkgsdXNlRXhpc3Rpbmc6QUd9XSxzdHlsZXM6WycubWF0LXNlbGVjdHtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxMDAlO291dGxpbmU6bm9uZX0ubWF0LXNlbGVjdC10cmlnZ2Vye2Rpc3BsYXk6aW5saW5lLXRhYmxlO2N1cnNvcjpwb2ludGVyO3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LXNlbGVjdC1kaXNhYmxlZCAubWF0LXNlbGVjdC10cmlnZ2Vyey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6ZGVmYXVsdH0ubWF0LXNlbGVjdC12YWx1ZXtkaXNwbGF5OnRhYmxlLWNlbGw7bWF4LXdpZHRoOjA7d2lkdGg6MTAwJTtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9Lm1hdC1zZWxlY3QtdmFsdWUtdGV4dHt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9Lm1hdC1zZWxlY3QtYXJyb3ctd3JhcHBlcntkaXNwbGF5OnRhYmxlLWNlbGw7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1zZWxlY3QtYXJyb3ctd3JhcHBlcnt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtc2VsZWN0LWFycm93LXdyYXBwZXJ7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTI1JSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtaGFzLWxhYmVsIC5tYXQtc2VsZWN0Om5vdCgubWF0LXNlbGVjdC1lbXB0eSkgLm1hdC1zZWxlY3QtYXJyb3ctd3JhcHBlcnt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWVtcHR5IC5tYXQtc2VsZWN0LWFycm93LXdyYXBwZXJ7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1lbXB0eSAubWF0LXNlbGVjdC1hcnJvdy13cmFwcGVye3RyYW5zaXRpb246bm9uZX0ubWF0LXNlbGVjdC1hcnJvd3t3aWR0aDowO2hlaWdodDowO2JvcmRlci1sZWZ0OjVweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmlnaHQ6NXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci10b3A6NXB4IHNvbGlkO21hcmdpbjowIDRweH0ubWF0LXNlbGVjdC1wYW5lbC13cmFwe2ZsZXgtYmFzaXM6MTAwJX0ubWF0LXNlbGVjdC1wYW5lbHttaW4td2lkdGg6MTEycHg7bWF4LXdpZHRoOjI4MHB4O292ZXJmbG93OmF1dG87LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7cGFkZGluZy10b3A6MDtwYWRkaW5nLWJvdHRvbTowO21heC1oZWlnaHQ6MjU2cHg7bWluLXdpZHRoOjEwMCU7Ym9yZGVyLXJhZGl1czo0cHg7b3V0bGluZTowfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zZWxlY3QtcGFuZWx7b3V0bGluZTpzb2xpZCAxcHh9Lm1hdC1zZWxlY3QtcGFuZWwgLm1hdC1vcHRncm91cC1sYWJlbCwubWF0LXNlbGVjdC1wYW5lbCAubWF0LW9wdGlvbntmb250LXNpemU6aW5oZXJpdDtsaW5lLWhlaWdodDozZW07aGVpZ2h0OjNlbX0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtc2VsZWN0Om5vdCgubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQpIC5tYXQtZm9ybS1maWVsZC1mbGV4e2N1cnNvcjpwb2ludGVyfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1zZWxlY3QgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3dpZHRoOmNhbGMoMTAwJSAtIDE4cHgpfS5tYXQtc2VsZWN0LXBsYWNlaG9sZGVye3RyYW5zaXRpb246Y29sb3IgNDAwbXMgMTMzLjMzMzMzMzMzMzNtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJ7dHJhbnNpdGlvbjpub25lfS5tYXQtZm9ybS1maWVsZC1oaWRlLXBsYWNlaG9sZGVyIC5tYXQtc2VsZWN0LXBsYWNlaG9sZGVye2NvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtdGV4dC1maWxsLWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246bm9uZTtkaXNwbGF5OmJsb2NrfS5tYXQtc2VsZWN0LW1pbi1saW5lOmVtcHR5OjpiZWZvcmV7Y29udGVudDoiICI7d2hpdGUtc3BhY2U6cHJlO3dpZHRoOjFweDtkaXNwbGF5OmlubGluZS1ibG9jaztvcGFjaXR5OjB9XG4nXX1dfV0sbnVsbCx7b3B0aW9uczpbe3R5cGU6WWEsYXJnczpbQkgse2Rlc2NlbmRhbnRzOiEwfV19XSxvcHRpb25Hcm91cHM6W3t0eXBlOllhLGFyZ3M6W3pILHtkZXNjZW5kYW50czohMH1dfV0sY3VzdG9tVHJpZ2dlcjpbe3R5cGU6cWEsYXJnczpbREddfV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIFRHe31mdW5jdGlvbiBORyh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsInNwYW4iLDUpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUobil7aGkodCk7Y29uc3Qgbz1ZbSgpLiRpbXBsaWNpdDtyZXR1cm4gWW0oKS5vbkFjdGl2ZVBsdWdpblNlbGVjdGlvbihuLG8uaWQpfSkpLGt1KDEpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKCkuJGltcGxpY2l0O2pwKCJkYXRhLXBsdWdpbi1pZCIsdC5pZCkscmMoMSksRHUoIiAiLHQudGFiX25hbWUsIiAiKX19ZnVuY3Rpb24gekcodCxlKXsxJnQmJihSbSgwLCJtYXQtdGFiIiwzKSxRcCgxLE5HLDIsMiwibmctdGVtcGxhdGUiLDQpLEFtKCkpLDImdCYmRG0oImRpc2FibGVkIiwhZS4kaW1wbGljaXQuZW5hYmxlZCl9ZnVuY3Rpb24gSUcodCxlKXtpZigxJnQmJihSbSgwLCJtYXQtb3B0aW9uIiw5KSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQ7RG0oInZhbHVlIix0LmlkKSxqcCgiZGF0YS1wbHVnaW4taWQiLHQuaWQpLHJjKDEpLER1KCIgIix0LnRhYl9uYW1lLCIgIil9fWZ1bmN0aW9uIEhHKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwibWF0LWZvcm0tZmllbGQiLDYpLFJtKDEsIm1hdC1sYWJlbCIpLGt1KDIsIkluYWN0aXZlIiksQW0oKSxSbSgzLCJtYXQtc2VsZWN0Iiw3KSxWbSgic2VsZWN0aW9uQ2hhbmdlIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oKS5vbkRpc2FibGVkUGx1Z2luU2VsZWN0aW9uQ2hhbmdlZChuKX0pKSxRcCg0LElHLDIsMywibWF0LW9wdGlvbiIsOCksQW0oKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgpO3JjKDMpLERtKCJ2YWx1ZSIsdC5zZWxlY3RlZFBsdWdpbikscmMoMSksRG0oIm5nRm9yT2YiLHQuZGlzYWJsZWRQbHVnaW5zKX19VEcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFRHKX0sVEcuybVtb2Q9YW8oe3R5cGU6VEd9KSxURy7JtWluaj12bih7cHJvdmlkZXJzOltQR10saW1wb3J0czpbW1dNLHlMLFVILFhJXSx5RixUVixVSCxYSV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFRHLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbV00seUwsVUgsWEldLGV4cG9ydHM6W3lGLFRWLEFHLEVHLFVILFhJXSxkZWNsYXJhdGlvbnM6W0FHLEVHXSxwcm92aWRlcnM6W1BHXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFRHLHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bQUcsRUddfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1dNLHlMLFVILFhJXX0sZXhwb3J0czpmdW5jdGlvbigpe3JldHVyblt5RixUVixBRyxFRyxVSCxYSV19fSk7Y2xhc3MgRkd7Y29uc3RydWN0b3IoKXt0aGlzLm9uUGx1Z2luU2VsZWN0aW9uQ2hhbmdlZD1uZXcgTGh9Z2V0QWN0aXZlUGx1Z2luSW5kZXgoKXtyZXR1cm4gdGhpcy5hY3RpdmVQbHVnaW5zLmZpbmRJbmRleCgoKHtpZDp0fSk9PnQ9PT10aGlzLnNlbGVjdGVkUGx1Z2luKSl9b25BY3RpdmVQbHVnaW5TZWxlY3Rpb24odCxlKXt0LnN0b3BQcm9wYWdhdGlvbigpLHRoaXMub25QbHVnaW5TZWxlY3Rpb25DaGFuZ2VkLmVtaXQoZSl9b25EaXNhYmxlZFBsdWdpblNlbGVjdGlvbkNoYW5nZWQodCl7dGhpcy5vblBsdWdpblNlbGVjdGlvbkNoYW5nZWQuZW1pdCh0LnZhbHVlKX19RkcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEZHKX0sRkcuybVjbXA9dG8oe3R5cGU6Rkcsc2VsZWN0b3JzOltbInBsdWdpbi1zZWxlY3Rvci1jb21wb25lbnQiXV0saW5wdXRzOnthY3RpdmVQbHVnaW5zOiJhY3RpdmVQbHVnaW5zIixkaXNhYmxlZFBsdWdpbnM6ImRpc2FibGVkUGx1Z2lucyIsc2VsZWN0ZWRQbHVnaW46InNlbGVjdGVkUGx1Z2luIn0sb3V0cHV0czp7b25QbHVnaW5TZWxlY3Rpb25DaGFuZ2VkOiJvblBsdWdpblNlbGVjdGlvbkNoYW5nZWQifSxkZWNsczozLHZhcnM6Myxjb25zdHM6W1siYW5pbWF0aW9uRHVyYXRpb24iLCIxMDBtcyIsMSwiYWN0aXZlLXBsdWdpbi1saXN0IiwzLCJzZWxlY3RlZEluZGV4Il0sWzMsImRpc2FibGVkIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbImZsb2F0TGFiZWwiLCJuZXZlciIsNCwibmdJZiJdLFszLCJkaXNhYmxlZCJdLFsibWF0LXRhYi1sYWJlbCIsIiJdLFsxLCJwbHVnaW4tbmFtZSIsMywiY2xpY2siXSxbImZsb2F0TGFiZWwiLCJuZXZlciJdLFszLCJ2YWx1ZSIsInNlbGVjdGlvbkNoYW5nZSJdLFszLCJ2YWx1ZSIsNCwibmdGb3IiLCJuZ0Zvck9mIl0sWzMsInZhbHVlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJtYXQtdGFiLWdyb3VwIiwwKSxRcCgxLHpHLDIsMSwibWF0LXRhYiIsMSksQW0oKSxRcCgyLEhHLDUsMiwibWF0LWZvcm0tZmllbGQiLDIpKSwyJmUmJihEbSgic2VsZWN0ZWRJbmRleCIsbi5nZXRBY3RpdmVQbHVnaW5JbmRleCgpKSxyYygxKSxEbSgibmdGb3JPZiIsbi5hY3RpdmVQbHVnaW5zKSxyYygxKSxEbSgibmdJZiIsbi5kaXNhYmxlZFBsdWdpbnMubGVuZ3RoPjApKX0sZGlyZWN0aXZlczpbRkIsbE0sZE0sU0IsUEIsQVYsdlYsQUcsQkhdLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtmbGV4OjEgMSBhdXRvO2ZvbnQtc2l6ZToxNHB4O2hlaWdodDoxMDAlO292ZXJmbG93OmhpZGRlbn1tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17ZmxleDowIDA7bWFyZ2luLXRvcDo1cHg7d2lkdGg6MTMwcHh9bWF0LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV0sIG1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjUwMDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9LmFjdGl2ZS1wbHVnaW4tbGlzdFtfbmdjb250ZW50LSVDT01QJV17YWxpZ24tc2VsZjpzdHJldGNoO2ZsZXg6MSAxIGF1dG87b3ZlcmZsb3c6aGlkZGVufS5wbHVnaW4tbmFtZVtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWZsZXg7aGVpZ2h0OjEwMCU7anVzdGlmeS1jb250ZW50OmNlbnRlcjtwYWRkaW5nOjAgMTJweDt3aWR0aDoxMDAlfVtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QubWF0LXByaW1hcnkgLm1hdC10YWItbGlzdCAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9W19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCAubWF0LXRhYi1sYWJlbCwgW19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCAubWF0LXRhYi1saW5re2NvbG9yOmluaGVyaXQ7b3BhY2l0eTouN31bX25naG9zdC0lQ09NUCVdICAgICAuYWN0aXZlLXBsdWdpbi1saXN0IC5tYXQtdGFiLWxhYmVsLm1hdC10YWItbGFiZWwtYWN0aXZlLCBbX25naG9zdC0lQ09NUCVdICAgICAuYWN0aXZlLXBsdWdpbi1saXN0IC5tYXQtdGFiLWxpbmsubWF0LXRhYi1sYWJlbC1hY3RpdmV7b3BhY2l0eToxfVtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6Y3VycmVudENvbG9yfVtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWR7dmlzaWJpbGl0eTpoaWRkZW59W19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCAubWF0LXRhYi1kaXNhYmxlZHtkaXNwbGF5Om5vbmV9W19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCBtYXQtdGFiLWxpc3QsIFtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgLm1hdC10YWItaGVhZGVyLCBbX25naG9zdC0lQ09NUCVdICAgICAuYWN0aXZlLXBsdWdpbi1saXN0IC5tYXQtdGFiLWxhYmVscywgW19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCAubWF0LXRhYi1sYWJlbHtoZWlnaHQ6MTAwJX1bX25naG9zdC0lQ09NUCVdICAgICAuYWN0aXZlLXBsdWdpbi1saXN0IC5tYXQtdGFiLWxhYmVse21pbi13aWR0aDo0OHB4O3BhZGRpbmc6MDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9W19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCAubWF0LXRhYi1sYWJlbC1jb250ZW50e2hlaWdodDoxMDAlfVtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgbWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGlzdHtwYWRkaW5nOjAgMzZweH1bX25naG9zdC0lQ09NUCVdICAgICAuYWN0aXZlLXBsdWdpbi1saXN0IG1hdC10YWItaGVhZGVyPjpmaXJzdC1jaGlsZCwgW19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCBtYXQtdGFiLWhlYWRlcj4ubWF0LXRhYi1sYWJlbC1jb250YWluZXIsIFtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgbWF0LXRhYi1oZWFkZXI+Omxhc3QtY2hpbGR7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjB9W19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCBtYXQtdGFiLWhlYWRlcj46Zmlyc3QtY2hpbGQsIFtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgbWF0LXRhYi1oZWFkZXI+Lm1hdC10YWItbGFiZWwtY29udGFpbmVye2xlZnQ6MH1bX25naG9zdC0lQ09NUCVdICAgICAuYWN0aXZlLXBsdWdpbi1saXN0IG1hdC10YWItaGVhZGVyPjpsYXN0LWNoaWxkLCBbX25naG9zdC0lQ09NUCVdICAgICAuYWN0aXZlLXBsdWdpbi1saXN0IG1hdC10YWItaGVhZGVyPi5tYXQtdGFiLWxhYmVsLWNvbnRhaW5lcntyaWdodDowfVtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgbWF0LXRhYi1oZWFkZXI+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfWJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCBtYXQtdGFiLWhlYWRlcj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbntiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9J119KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEZHLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InBsdWdpbi1zZWxlY3Rvci1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiIuL3BsdWdpbl9zZWxlY3Rvcl9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9wbHVnaW5fc2VsZWN0b3JfY29tcG9uZW50LmNzcyJdfV19XSxudWxsLHthY3RpdmVQbHVnaW5zOlt7dHlwZTp4eX1dLGRpc2FibGVkUGx1Z2luczpbe3R5cGU6eHl9XSxzZWxlY3RlZFBsdWdpbjpbe3R5cGU6eHl9XSxvblBsdWdpblNlbGVjdGlvbkNoYW5nZWQ6W3t0eXBlOk95fV19KTtjb25zdCBMRz1adyh2UiwodD0+T2JqZWN0LmtleXModCkubWFwKChlPT5PYmplY3QuYXNzaWduKHt9LHtpZDplfSx0W2VdKSkpKSksQkc9WncoTEcsKHQ9PnQuZmlsdGVyKCh0PT4hdC5lbmFibGVkKSkpKTtjbGFzcyBWR3tjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5hY3RpdmVQbHVnaW4kPXRoaXMuc3RvcmUucGlwZShGdyhNUikpLHRoaXMucGx1Z2lucyQ9dGhpcy5zdG9yZS5waXBlKEZ3KExHKSksdGhpcy5kaXNhYmxlZFBsdWdpbnMkPXRoaXMuc3RvcmUucGlwZShGdyhCRykpfW9uUGx1Z2luU2VsZWN0aW9uQ2hhbmdlKHQpe3RoaXMuc3RvcmUuZGlzcGF0Y2goX0Uoe3BsdWdpbjp0fSkpfX1mdW5jdGlvbiBqRyh0LGUpe31WRy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VkcpKFNtKEl3KSl9LFZHLsm1Y21wPXRvKHt0eXBlOlZHLHNlbGVjdG9yczpbWyJwbHVnaW4tc2VsZWN0b3IiXV0sZGVjbHM6NCx2YXJzOjksY29uc3RzOltbMywiYWN0aXZlUGx1Z2lucyIsImRpc2FibGVkUGx1Z2lucyIsInNlbGVjdGVkUGx1Z2luIiwib25QbHVnaW5TZWxlY3Rpb25DaGFuZ2VkIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJwbHVnaW4tc2VsZWN0b3ItY29tcG9uZW50IiwwKSxWbSgib25QbHVnaW5TZWxlY3Rpb25DaGFuZ2VkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblBsdWdpblNlbGVjdGlvbkNoYW5nZShlKX0pKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQWgoMywiYXN5bmMiKSxBbSgpKSwyJmUmJkRtKCJhY3RpdmVQbHVnaW5zIixUaCgxLDMsbi5wbHVnaW5zJCkpKCJkaXNhYmxlZFBsdWdpbnMiLFRoKDIsNSxuLmRpc2FibGVkUGx1Z2lucyQpKSgic2VsZWN0ZWRQbHVnaW4iLFRoKDMsNyxuLmFjdGl2ZVBsdWdpbiQpKX0sZGlyZWN0aXZlczpbRkddLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChWRyxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJwbHVnaW4tc2VsZWN0b3IiLHRlbXBsYXRlOidcbiAgICA8cGx1Z2luLXNlbGVjdG9yLWNvbXBvbmVudFxuICAgICAgW2FjdGl2ZVBsdWdpbnNdPSJwbHVnaW5zJCB8IGFzeW5jIlxuICAgICAgW2Rpc2FibGVkUGx1Z2luc109ImRpc2FibGVkUGx1Z2lucyQgfCBhc3luYyJcbiAgICAgIFtzZWxlY3RlZFBsdWdpbl09ImFjdGl2ZVBsdWdpbiQgfCBhc3luYyJcbiAgICAgIChvblBsdWdpblNlbGVjdGlvbkNoYW5nZWQpPSJvblBsdWdpblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpIlxuICAgID48L3BsdWdpbi1zZWxlY3Rvci1jb21wb25lbnQ+XG4gICd9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y2xhc3MgVUd7Y29uc3RydWN0b3IoKXt0aGlzLnJvbGU9ImRpYWxvZyIsdGhpcy5wYW5lbENsYXNzPSIiLHRoaXMuaGFzQmFja2Ryb3A9ITAsdGhpcy5iYWNrZHJvcENsYXNzPSIiLHRoaXMuZGlzYWJsZUNsb3NlPSExLHRoaXMud2lkdGg9IiIsdGhpcy5oZWlnaHQ9IiIsdGhpcy5tYXhXaWR0aD0iODB2dyIsdGhpcy5kYXRhPW51bGwsdGhpcy5hcmlhRGVzY3JpYmVkQnk9bnVsbCx0aGlzLmFyaWFMYWJlbGxlZEJ5PW51bGwsdGhpcy5hcmlhTGFiZWw9bnVsbCx0aGlzLmF1dG9Gb2N1cz0hMCx0aGlzLnJlc3RvcmVGb2N1cz0hMCx0aGlzLmNsb3NlT25OYXZpZ2F0aW9uPSEwfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3QgR0c9e2RpYWxvZ0NvbnRhaW5lcjpueCgiZGlhbG9nQ29udGFpbmVyIixbcngoInZvaWQsIGV4aXQiLGF4KHtvcGFjaXR5OjAsdHJhbnNmb3JtOiJzY2FsZSgwLjcpIn0pKSxyeCgiZW50ZXIiLGF4KHt0cmFuc2Zvcm06Im5vbmUifSkpLGx4KCIqID0+IGVudGVyIixveCgiMTUwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSkiLGF4KHt0cmFuc2Zvcm06Im5vbmUiLG9wYWNpdHk6MX0pKSksbHgoIiogPT4gdm9pZCwgKiA9PiBleGl0IixveCgiNzVtcyBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSkiLGF4KHtvcGFjaXR5OjB9KSkpXSl9OwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBXRygpe3Rocm93IEVycm9yKCJBdHRlbXB0aW5nIHRvIGF0dGFjaCBkaWFsb2cgY29udGVudCBhZnRlciBjb250ZW50IGlzIGFscmVhZHkgYXR0YWNoZWQiKX1jbGFzcyBZRyBleHRlbmRzIFBGe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhKXtzdXBlcigpLHRoaXMuX2VsZW1lbnRSZWY9dCx0aGlzLl9mb2N1c1RyYXBGYWN0b3J5PWUsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWY9bix0aGlzLl9jb25maWc9aSx0aGlzLl9mb2N1c01vbml0b3I9YSx0aGlzLl9hbmltYXRpb25TdGF0ZUNoYW5nZWQ9bmV3IExoLHRoaXMuX2VsZW1lbnRGb2N1c2VkQmVmb3JlRGlhbG9nV2FzT3BlbmVkPW51bGwsdGhpcy5fY2xvc2VJbnRlcmFjdGlvblR5cGU9bnVsbCx0aGlzLmF0dGFjaERvbVBvcnRhbD10PT4odGhpcy5fcG9ydGFsT3V0bGV0Lmhhc0F0dGFjaGVkKCkmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmV0coKSx0aGlzLl9wb3J0YWxPdXRsZXQuYXR0YWNoRG9tUG9ydGFsKHQpKSx0aGlzLl9hcmlhTGFiZWxsZWRCeT1pLmFyaWFMYWJlbGxlZEJ5fHxudWxsLHRoaXMuX2RvY3VtZW50PW99X2luaXRpYWxpemVXaXRoQXR0YWNoZWRDb250ZW50KCl7dGhpcy5fc2V0dXBGb2N1c1RyYXAoKSx0aGlzLl9jYXB0dXJlUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KCksdGhpcy5fZm9jdXNEaWFsb2dDb250YWluZXIoKX1hdHRhY2hDb21wb25lbnRQb3J0YWwodCl7cmV0dXJuIHRoaXMuX3BvcnRhbE91dGxldC5oYXNBdHRhY2hlZCgpJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJldHKCksdGhpcy5fcG9ydGFsT3V0bGV0LmF0dGFjaENvbXBvbmVudFBvcnRhbCh0KX1hdHRhY2hUZW1wbGF0ZVBvcnRhbCh0KXtyZXR1cm4gdGhpcy5fcG9ydGFsT3V0bGV0Lmhhc0F0dGFjaGVkKCkmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmV0coKSx0aGlzLl9wb3J0YWxPdXRsZXQuYXR0YWNoVGVtcGxhdGVQb3J0YWwodCl9X3JlY2FwdHVyZUZvY3VzKCl7dGhpcy5fY29udGFpbnNGb2N1cygpfHwoIXRoaXMuX2NvbmZpZy5hdXRvRm9jdXN8fCF0aGlzLl9mb2N1c1RyYXAuZm9jdXNJbml0aWFsRWxlbWVudCgpKSYmdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCl9X3RyYXBGb2N1cygpe3RoaXMuX2NvbmZpZy5hdXRvRm9jdXM/dGhpcy5fZm9jdXNUcmFwLmZvY3VzSW5pdGlhbEVsZW1lbnRXaGVuUmVhZHkoKTp0aGlzLl9jb250YWluc0ZvY3VzKCl8fHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpfV9yZXN0b3JlRm9jdXMoKXtjb25zdCB0PXRoaXMuX2VsZW1lbnRGb2N1c2VkQmVmb3JlRGlhbG9nV2FzT3BlbmVkO2lmKHRoaXMuX2NvbmZpZy5yZXN0b3JlRm9jdXMmJnQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmZvY3VzKXtjb25zdCBlPUZ6KCksbj10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7ZSYmZSE9PXRoaXMuX2RvY3VtZW50LmJvZHkmJmUhPT1uJiYhbi5jb250YWlucyhlKXx8KHRoaXMuX2ZvY3VzTW9uaXRvcj8odGhpcy5fZm9jdXNNb25pdG9yLmZvY3VzVmlhKHQsdGhpcy5fY2xvc2VJbnRlcmFjdGlvblR5cGUpLHRoaXMuX2Nsb3NlSW50ZXJhY3Rpb25UeXBlPW51bGwpOnQuZm9jdXMoKSl9dGhpcy5fZm9jdXNUcmFwJiZ0aGlzLl9mb2N1c1RyYXAuZGVzdHJveSgpfV9zZXR1cEZvY3VzVHJhcCgpe3RoaXMuX2ZvY3VzVHJhcD10aGlzLl9mb2N1c1RyYXBGYWN0b3J5LmNyZWF0ZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpfV9jYXB0dXJlUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KCl7dGhpcy5fZG9jdW1lbnQmJih0aGlzLl9lbGVtZW50Rm9jdXNlZEJlZm9yZURpYWxvZ1dhc09wZW5lZD1GeigpKX1fZm9jdXNEaWFsb2dDb250YWluZXIoKXt0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMmJnRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpfV9jb250YWluc0ZvY3VzKCl7Y29uc3QgdD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsZT1GeigpO3JldHVybiB0PT09ZXx8dC5jb250YWlucyhlKX19WUcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFlHKShTbShoZyksU20ockkpLFNtKFVnKSxTbShaXyw4KSxTbShVRyksU20oU0kpKX0sWUcuybVkaXI9bG8oe3R5cGU6WUcsdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJlFoKERGLDcpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uX3BvcnRhbE91dGxldD10LmZpcnN0KX19LGZlYXR1cmVzOlt4cF19KSxZRy5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpySX0se3R5cGU6VWd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOlVHfSx7dHlwZTpTSX1dLFlHLnByb3BEZWNvcmF0b3JzPXtfcG9ydGFsT3V0bGV0Olt7dHlwZTpaYSxhcmdzOltERix7c3RhdGljOiEwfV19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChZRyxbe3R5cGU6Q3l9XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOnJJfSx7dHlwZTpVZ30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6VUd9LHt0eXBlOlNJfV19KSx7X3BvcnRhbE91dGxldDpbe3R5cGU6WmEsYXJnczpbREYse3N0YXRpYzohMH1dfV19KTtjbGFzcyBxRyBleHRlbmRzIFlHe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9zdGF0ZT0iZW50ZXIifV9vbkFuaW1hdGlvbkRvbmUoe3RvU3RhdGU6dCx0b3RhbFRpbWU6ZX0peyJlbnRlciI9PT10Pyh0aGlzLl90cmFwRm9jdXMoKSx0aGlzLl9hbmltYXRpb25TdGF0ZUNoYW5nZWQubmV4dCh7c3RhdGU6Im9wZW5lZCIsdG90YWxUaW1lOmV9KSk6ImV4aXQiPT09dCYmKHRoaXMuX3Jlc3RvcmVGb2N1cygpLHRoaXMuX2FuaW1hdGlvblN0YXRlQ2hhbmdlZC5uZXh0KHtzdGF0ZToiY2xvc2VkIix0b3RhbFRpbWU6ZX0pKX1fb25BbmltYXRpb25TdGFydCh7dG9TdGF0ZTp0LHRvdGFsVGltZTplfSl7ImVudGVyIj09PXQ/dGhpcy5fYW5pbWF0aW9uU3RhdGVDaGFuZ2VkLm5leHQoe3N0YXRlOiJvcGVuaW5nIix0b3RhbFRpbWU6ZX0pOiJleGl0IiE9PXQmJiJ2b2lkIiE9PXR8fHRoaXMuX2FuaW1hdGlvblN0YXRlQ2hhbmdlZC5uZXh0KHtzdGF0ZToiY2xvc2luZyIsdG90YWxUaW1lOmV9KX1fc3RhcnRFeGl0QW5pbWF0aW9uKCl7dGhpcy5fc3RhdGU9ImV4aXQiLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfX1xRy7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEocUcpKSkobnx8cUcpfX0pKCkscUcuybVjbXA9dG8oe3R5cGU6cUcsc2VsZWN0b3JzOltbIm1hdC1kaWFsb2ctY29udGFpbmVyIl1dLGhvc3RBdHRyczpbInRhYmluZGV4IiwiLTEiLCJhcmlhLW1vZGFsIiwidHJ1ZSIsMSwibWF0LWRpYWxvZy1jb250YWluZXIiXSxob3N0VmFyczo2LGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZqbSgiQGRpYWxvZ0NvbnRhaW5lci5zdGFydCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX29uQW5pbWF0aW9uU3RhcnQoZSl9KSkoIkBkaWFsb2dDb250YWluZXIuZG9uZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX29uQW5pbWF0aW9uRG9uZShlKX0pKSwyJmUmJihUdSgiaWQiLG4uX2lkKSxqcCgicm9sZSIsbi5fY29uZmlnLnJvbGUpKCJhcmlhLWxhYmVsbGVkYnkiLG4uX2NvbmZpZy5hcmlhTGFiZWw/bnVsbDpuLl9hcmlhTGFiZWxsZWRCeSkoImFyaWEtbGFiZWwiLG4uX2NvbmZpZy5hcmlhTGFiZWwpKCJhcmlhLWRlc2NyaWJlZGJ5IixuLl9jb25maWcuYXJpYURlc2NyaWJlZEJ5fHxudWxsKSxOdSgiQGRpYWxvZ0NvbnRhaW5lciIsbi5fc3RhdGUpKX0sZmVhdHVyZXM6W3hwXSxkZWNsczoxLHZhcnM6MCxjb25zdHM6W1siY2RrUG9ydGFsT3V0bGV0IiwiIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJlFwKDAsakcsMCwwLCJuZy10ZW1wbGF0ZSIsMCl9LGRpcmVjdGl2ZXM6W0RGXSxzdHlsZXM6WyIubWF0LWRpYWxvZy1jb250YWluZXJ7ZGlzcGxheTpibG9jaztwYWRkaW5nOjI0cHg7Ym9yZGVyLXJhZGl1czo0cHg7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OmF1dG87b3V0bGluZTowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7bWluLWhlaWdodDppbmhlcml0O21heC1oZWlnaHQ6aW5oZXJpdH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZGlhbG9nLWNvbnRhaW5lcntvdXRsaW5lOnNvbGlkIDFweH0ubWF0LWRpYWxvZy1jb250ZW50e2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjAgLTI0cHg7cGFkZGluZzowIDI0cHg7bWF4LWhlaWdodDo2NXZoO292ZXJmbG93OmF1dG87LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2h9Lm1hdC1kaWFsb2ctdGl0bGV7bWFyZ2luOjAgMCAyMHB4O2Rpc3BsYXk6YmxvY2t9Lm1hdC1kaWFsb2ctYWN0aW9uc3twYWRkaW5nOjhweCAwO2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDttaW4taGVpZ2h0OjUycHg7YWxpZ24taXRlbXM6Y2VudGVyO2JveC1zaXppbmc6Y29udGVudC1ib3g7bWFyZ2luLWJvdHRvbTotMjRweH0ubWF0LWRpYWxvZy1hY3Rpb25zW2FsaWduPWVuZF17anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5tYXQtZGlhbG9nLWFjdGlvbnNbYWxpZ249Y2VudGVyXXtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5tYXQtZGlhbG9nLWFjdGlvbnMgLm1hdC1idXR0b24tYmFzZSsubWF0LWJ1dHRvbi1iYXNlLC5tYXQtZGlhbG9nLWFjdGlvbnMgLm1hdC1tZGMtYnV0dG9uLWJhc2UrLm1hdC1tZGMtYnV0dG9uLWJhc2V7bWFyZ2luLWxlZnQ6OHB4fVtkaXI9cnRsXSAubWF0LWRpYWxvZy1hY3Rpb25zIC5tYXQtYnV0dG9uLWJhc2UrLm1hdC1idXR0b24tYmFzZSxbZGlyPXJ0bF0gLm1hdC1kaWFsb2ctYWN0aW9ucyAubWF0LW1kYy1idXR0b24tYmFzZSsubWF0LW1kYy1idXR0b24tYmFzZXttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDo4cHh9XG4iXSxlbmNhcHN1bGF0aW9uOjIsZGF0YTp7YW5pbWF0aW9uOltHRy5kaWFsb2dDb250YWluZXJdfX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgocUcsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWF0LWRpYWxvZy1jb250YWluZXIiLHRlbXBsYXRlOiI8bmctdGVtcGxhdGUgY2RrUG9ydGFsT3V0bGV0PjwvbmctdGVtcGxhdGU+XG4iLGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uRGVmYXVsdCxhbmltYXRpb25zOltHRy5kaWFsb2dDb250YWluZXJdLGhvc3Q6e2NsYXNzOiJtYXQtZGlhbG9nLWNvbnRhaW5lciIsdGFiaW5kZXg6Ii0xIiwiYXJpYS1tb2RhbCI6InRydWUiLCJbaWRdIjoiX2lkIiwiW2F0dHIucm9sZV0iOiJfY29uZmlnLnJvbGUiLCJbYXR0ci5hcmlhLWxhYmVsbGVkYnldIjoiX2NvbmZpZy5hcmlhTGFiZWwgPyBudWxsIDogX2FyaWFMYWJlbGxlZEJ5IiwiW2F0dHIuYXJpYS1sYWJlbF0iOiJfY29uZmlnLmFyaWFMYWJlbCIsIlthdHRyLmFyaWEtZGVzY3JpYmVkYnldIjoiX2NvbmZpZy5hcmlhRGVzY3JpYmVkQnkgfHwgbnVsbCIsIltAZGlhbG9nQ29udGFpbmVyXSI6Il9zdGF0ZSIsIihAZGlhbG9nQ29udGFpbmVyLnN0YXJ0KSI6Il9vbkFuaW1hdGlvblN0YXJ0KCRldmVudCkiLCIoQGRpYWxvZ0NvbnRhaW5lci5kb25lKSI6Il9vbkFuaW1hdGlvbkRvbmUoJGV2ZW50KSJ9LHN0eWxlczpbIi5tYXQtZGlhbG9nLWNvbnRhaW5lcntkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MjRweDtib3JkZXItcmFkaXVzOjRweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6YXV0bztvdXRsaW5lOjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTttaW4taGVpZ2h0OmluaGVyaXQ7bWF4LWhlaWdodDppbmhlcml0fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1kaWFsb2ctY29udGFpbmVye291dGxpbmU6c29saWQgMXB4fS5tYXQtZGlhbG9nLWNvbnRlbnR7ZGlzcGxheTpibG9jazttYXJnaW46MCAtMjRweDtwYWRkaW5nOjAgMjRweDttYXgtaGVpZ2h0OjY1dmg7b3ZlcmZsb3c6YXV0bzstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaH0ubWF0LWRpYWxvZy10aXRsZXttYXJnaW46MCAwIDIwcHg7ZGlzcGxheTpibG9ja30ubWF0LWRpYWxvZy1hY3Rpb25ze3BhZGRpbmc6OHB4IDA7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO21pbi1oZWlnaHQ6NTJweDthbGlnbi1pdGVtczpjZW50ZXI7Ym94LXNpemluZzpjb250ZW50LWJveDttYXJnaW4tYm90dG9tOi0yNHB4fS5tYXQtZGlhbG9nLWFjdGlvbnNbYWxpZ249ZW5kXXtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9Lm1hdC1kaWFsb2ctYWN0aW9uc1thbGlnbj1jZW50ZXJde2p1c3RpZnktY29udGVudDpjZW50ZXJ9Lm1hdC1kaWFsb2ctYWN0aW9ucyAubWF0LWJ1dHRvbi1iYXNlKy5tYXQtYnV0dG9uLWJhc2UsLm1hdC1kaWFsb2ctYWN0aW9ucyAubWF0LW1kYy1idXR0b24tYmFzZSsubWF0LW1kYy1idXR0b24tYmFzZXttYXJnaW4tbGVmdDo4cHh9W2Rpcj1ydGxdIC5tYXQtZGlhbG9nLWFjdGlvbnMgLm1hdC1idXR0b24tYmFzZSsubWF0LWJ1dHRvbi1iYXNlLFtkaXI9cnRsXSAubWF0LWRpYWxvZy1hY3Rpb25zIC5tYXQtbWRjLWJ1dHRvbi1iYXNlKy5tYXQtbWRjLWJ1dHRvbi1iYXNle21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjhweH1cbiJdfV19XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KbGV0IFpHPTA7Y2xhc3MgWEd7Y29uc3RydWN0b3IodCxlLG49Im1hdC1kaWFsb2ctIitaRysrKXt0aGlzLl9vdmVybGF5UmVmPXQsdGhpcy5fY29udGFpbmVySW5zdGFuY2U9ZSx0aGlzLmlkPW4sdGhpcy5kaXNhYmxlQ2xvc2U9dGhpcy5fY29udGFpbmVySW5zdGFuY2UuX2NvbmZpZy5kaXNhYmxlQ2xvc2UsdGhpcy5fYWZ0ZXJPcGVuZWQ9bmV3IEksdGhpcy5fYWZ0ZXJDbG9zZWQ9bmV3IEksdGhpcy5fYmVmb3JlQ2xvc2VkPW5ldyBJLHRoaXMuX3N0YXRlPTAsZS5faWQ9bixlLl9hbmltYXRpb25TdGF0ZUNoYW5nZWQucGlwZShjZSgodD0+Im9wZW5lZCI9PT10LnN0YXRlKSksYmUoMSkpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLl9hZnRlck9wZW5lZC5uZXh0KCksdGhpcy5fYWZ0ZXJPcGVuZWQuY29tcGxldGUoKX0pKSxlLl9hbmltYXRpb25TdGF0ZUNoYW5nZWQucGlwZShjZSgodD0+ImNsb3NlZCI9PT10LnN0YXRlKSksYmUoMSkpLnN1YnNjcmliZSgoKCk9PntjbGVhclRpbWVvdXQodGhpcy5fY2xvc2VGYWxsYmFja1RpbWVvdXQpLHRoaXMuX2ZpbmlzaERpYWxvZ0Nsb3NlKCl9KSksdC5kZXRhY2htZW50cygpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLl9iZWZvcmVDbG9zZWQubmV4dCh0aGlzLl9yZXN1bHQpLHRoaXMuX2JlZm9yZUNsb3NlZC5jb21wbGV0ZSgpLHRoaXMuX2FmdGVyQ2xvc2VkLm5leHQodGhpcy5fcmVzdWx0KSx0aGlzLl9hZnRlckNsb3NlZC5jb21wbGV0ZSgpLHRoaXMuY29tcG9uZW50SW5zdGFuY2U9bnVsbCx0aGlzLl9vdmVybGF5UmVmLmRpc3Bvc2UoKX0pKSx0LmtleWRvd25FdmVudHMoKS5waXBlKGNlKCh0PT50LmtleUNvZGU9PT11eiYmIXRoaXMuZGlzYWJsZUNsb3NlJiYhYnoodCkpKSkuc3Vic2NyaWJlKCh0PT57dC5wcmV2ZW50RGVmYXVsdCgpLEtHKHRoaXMsImtleWJvYXJkIil9KSksdC5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKCgoKT0+e3RoaXMuZGlzYWJsZUNsb3NlP3RoaXMuX2NvbnRhaW5lckluc3RhbmNlLl9yZWNhcHR1cmVGb2N1cygpOktHKHRoaXMsIm1vdXNlIil9KSl9Y2xvc2UodCl7dGhpcy5fcmVzdWx0PXQsdGhpcy5fY29udGFpbmVySW5zdGFuY2UuX2FuaW1hdGlvblN0YXRlQ2hhbmdlZC5waXBlKGNlKCh0PT4iY2xvc2luZyI9PT10LnN0YXRlKSksYmUoMSkpLnN1YnNjcmliZSgoZT0+e3RoaXMuX2JlZm9yZUNsb3NlZC5uZXh0KHQpLHRoaXMuX2JlZm9yZUNsb3NlZC5jb21wbGV0ZSgpLHRoaXMuX292ZXJsYXlSZWYuZGV0YWNoQmFja2Ryb3AoKSx0aGlzLl9jbG9zZUZhbGxiYWNrVGltZW91dD1zZXRUaW1lb3V0KCgoKT0+dGhpcy5fZmluaXNoRGlhbG9nQ2xvc2UoKSksZS50b3RhbFRpbWUrMTAwKX0pKSx0aGlzLl9zdGF0ZT0xLHRoaXMuX2NvbnRhaW5lckluc3RhbmNlLl9zdGFydEV4aXRBbmltYXRpb24oKX1hZnRlck9wZW5lZCgpe3JldHVybiB0aGlzLl9hZnRlck9wZW5lZH1hZnRlckNsb3NlZCgpe3JldHVybiB0aGlzLl9hZnRlckNsb3NlZH1iZWZvcmVDbG9zZWQoKXtyZXR1cm4gdGhpcy5fYmVmb3JlQ2xvc2VkfWJhY2tkcm9wQ2xpY2soKXtyZXR1cm4gdGhpcy5fb3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCl9a2V5ZG93bkV2ZW50cygpe3JldHVybiB0aGlzLl9vdmVybGF5UmVmLmtleWRvd25FdmVudHMoKX11cGRhdGVQb3NpdGlvbih0KXtsZXQgZT10aGlzLl9nZXRQb3NpdGlvblN0cmF0ZWd5KCk7cmV0dXJuIHQmJih0LmxlZnR8fHQucmlnaHQpP3QubGVmdD9lLmxlZnQodC5sZWZ0KTplLnJpZ2h0KHQucmlnaHQpOmUuY2VudGVySG9yaXpvbnRhbGx5KCksdCYmKHQudG9wfHx0LmJvdHRvbSk/dC50b3A/ZS50b3AodC50b3ApOmUuYm90dG9tKHQuYm90dG9tKTplLmNlbnRlclZlcnRpY2FsbHkoKSx0aGlzLl9vdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCksdGhpc311cGRhdGVTaXplKHQ9IiIsZT0iIil7cmV0dXJuIHRoaXMuX292ZXJsYXlSZWYudXBkYXRlU2l6ZSh7d2lkdGg6dCxoZWlnaHQ6ZX0pLHRoaXMuX292ZXJsYXlSZWYudXBkYXRlUG9zaXRpb24oKSx0aGlzfWFkZFBhbmVsQ2xhc3ModCl7cmV0dXJuIHRoaXMuX292ZXJsYXlSZWYuYWRkUGFuZWxDbGFzcyh0KSx0aGlzfXJlbW92ZVBhbmVsQ2xhc3ModCl7cmV0dXJuIHRoaXMuX292ZXJsYXlSZWYucmVtb3ZlUGFuZWxDbGFzcyh0KSx0aGlzfWdldFN0YXRlKCl7cmV0dXJuIHRoaXMuX3N0YXRlfV9maW5pc2hEaWFsb2dDbG9zZSgpe3RoaXMuX3N0YXRlPTIsdGhpcy5fb3ZlcmxheVJlZi5kaXNwb3NlKCl9X2dldFBvc2l0aW9uU3RyYXRlZ3koKXtyZXR1cm4gdGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKS5wb3NpdGlvblN0cmF0ZWd5fX1mdW5jdGlvbiBLRyh0LGUsbil7cmV0dXJuIHZvaWQgMCE9PXQuX2NvbnRhaW5lckluc3RhbmNlJiYodC5fY29udGFpbmVySW5zdGFuY2UuX2Nsb3NlSW50ZXJhY3Rpb25UeXBlPWUpLHQuY2xvc2Uobil9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NvbnN0IEpHPW5ldyBHYSgiTWF0RGlhbG9nRGF0YSIpLFFHPW5ldyBHYSgibWF0LWRpYWxvZy1kZWZhdWx0LW9wdGlvbnMiKSwkRz1uZXcgR2EoIm1hdC1kaWFsb2ctc2Nyb2xsLXN0cmF0ZWd5IiksdFc9e3Byb3ZpZGU6JEcsZGVwczpbcExdLHVzZUZhY3Rvcnk6ZnVuY3Rpb24gZVcodCl7cmV0dXJuKCk9PnQuc2Nyb2xsU3RyYXRlZ2llcy5ibG9jaygpfX07Y2xhc3Mgbld7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEscixzLGwpe3RoaXMuX292ZXJsYXk9dCx0aGlzLl9pbmplY3Rvcj1lLHRoaXMuX2RlZmF1bHRPcHRpb25zPW4sdGhpcy5fcGFyZW50RGlhbG9nPW8sdGhpcy5fb3ZlcmxheUNvbnRhaW5lcj1pLHRoaXMuX2RpYWxvZ1JlZkNvbnN0cnVjdG9yPXIsdGhpcy5fZGlhbG9nQ29udGFpbmVyVHlwZT1zLHRoaXMuX2RpYWxvZ0RhdGFUb2tlbj1sLHRoaXMuX29wZW5EaWFsb2dzQXRUaGlzTGV2ZWw9W10sdGhpcy5fYWZ0ZXJBbGxDbG9zZWRBdFRoaXNMZXZlbD1uZXcgSSx0aGlzLl9hZnRlck9wZW5lZEF0VGhpc0xldmVsPW5ldyBJLHRoaXMuX2FyaWFIaWRkZW5FbGVtZW50cz1uZXcgTWFwLHRoaXMuYWZ0ZXJBbGxDbG9zZWQ9UXQoKCgpPT50aGlzLm9wZW5EaWFsb2dzLmxlbmd0aD90aGlzLl9nZXRBZnRlckFsbENsb3NlZCgpOnRoaXMuX2dldEFmdGVyQWxsQ2xvc2VkKCkucGlwZShOZSh2b2lkIDApKSkpLHRoaXMuX3Njcm9sbFN0cmF0ZWd5PWF9Z2V0IG9wZW5EaWFsb2dzKCl7cmV0dXJuIHRoaXMuX3BhcmVudERpYWxvZz90aGlzLl9wYXJlbnREaWFsb2cub3BlbkRpYWxvZ3M6dGhpcy5fb3BlbkRpYWxvZ3NBdFRoaXNMZXZlbH1nZXQgYWZ0ZXJPcGVuZWQoKXtyZXR1cm4gdGhpcy5fcGFyZW50RGlhbG9nP3RoaXMuX3BhcmVudERpYWxvZy5hZnRlck9wZW5lZDp0aGlzLl9hZnRlck9wZW5lZEF0VGhpc0xldmVsfV9nZXRBZnRlckFsbENsb3NlZCgpe2NvbnN0IHQ9dGhpcy5fcGFyZW50RGlhbG9nO3JldHVybiB0P3QuX2dldEFmdGVyQWxsQ2xvc2VkKCk6dGhpcy5fYWZ0ZXJBbGxDbG9zZWRBdFRoaXNMZXZlbH1vcGVuKHQsZSl7aWYoKGU9KGZ1bmN0aW9uIG4odCxlKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHQpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8pKGUsdGhpcy5fZGVmYXVsdE9wdGlvbnN8fG5ldyBVRykpLmlkJiZ0aGlzLmdldERpYWxvZ0J5SWQoZS5pZCkmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSl0aHJvdyBFcnJvcihgRGlhbG9nIHdpdGggaWQgIiR7ZS5pZH0iIGV4aXN0cyBhbHJlYWR5LiBUaGUgZGlhbG9nIGlkIG11c3QgYmUgdW5pcXVlLmApO2NvbnN0IG89dGhpcy5fY3JlYXRlT3ZlcmxheShlKSxpPXRoaXMuX2F0dGFjaERpYWxvZ0NvbnRhaW5lcihvLGUpLGE9dGhpcy5fYXR0YWNoRGlhbG9nQ29udGVudCh0LGksbyxlKTtyZXR1cm4gdGhpcy5vcGVuRGlhbG9ncy5sZW5ndGh8fHRoaXMuX2hpZGVOb25EaWFsb2dDb250ZW50RnJvbUFzc2lzdGl2ZVRlY2hub2xvZ3koKSx0aGlzLm9wZW5EaWFsb2dzLnB1c2goYSksYS5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoKCk9PnRoaXMuX3JlbW92ZU9wZW5EaWFsb2coYSkpKSx0aGlzLmFmdGVyT3BlbmVkLm5leHQoYSksaS5faW5pdGlhbGl6ZVdpdGhBdHRhY2hlZENvbnRlbnQoKSxhfWNsb3NlQWxsKCl7dGhpcy5fY2xvc2VEaWFsb2dzKHRoaXMub3BlbkRpYWxvZ3MpfWdldERpYWxvZ0J5SWQodCl7cmV0dXJuIHRoaXMub3BlbkRpYWxvZ3MuZmluZCgoZT0+ZS5pZD09PXQpKX1uZ09uRGVzdHJveSgpe3RoaXMuX2Nsb3NlRGlhbG9ncyh0aGlzLl9vcGVuRGlhbG9nc0F0VGhpc0xldmVsKSx0aGlzLl9hZnRlckFsbENsb3NlZEF0VGhpc0xldmVsLmNvbXBsZXRlKCksdGhpcy5fYWZ0ZXJPcGVuZWRBdFRoaXNMZXZlbC5jb21wbGV0ZSgpfV9jcmVhdGVPdmVybGF5KHQpe2NvbnN0IGU9dGhpcy5fZ2V0T3ZlcmxheUNvbmZpZyh0KTtyZXR1cm4gdGhpcy5fb3ZlcmxheS5jcmVhdGUoZSl9X2dldE92ZXJsYXlDb25maWcodCl7Y29uc3QgZT1uZXcgVkYoe3Bvc2l0aW9uU3RyYXRlZ3k6dGhpcy5fb3ZlcmxheS5wb3NpdGlvbigpLmdsb2JhbCgpLHNjcm9sbFN0cmF0ZWd5OnQuc2Nyb2xsU3RyYXRlZ3l8fHRoaXMuX3Njcm9sbFN0cmF0ZWd5KCkscGFuZWxDbGFzczp0LnBhbmVsQ2xhc3MsaGFzQmFja2Ryb3A6dC5oYXNCYWNrZHJvcCxkaXJlY3Rpb246dC5kaXJlY3Rpb24sbWluV2lkdGg6dC5taW5XaWR0aCxtaW5IZWlnaHQ6dC5taW5IZWlnaHQsbWF4V2lkdGg6dC5tYXhXaWR0aCxtYXhIZWlnaHQ6dC5tYXhIZWlnaHQsZGlzcG9zZU9uTmF2aWdhdGlvbjp0LmNsb3NlT25OYXZpZ2F0aW9ufSk7cmV0dXJuIHQuYmFja2Ryb3BDbGFzcyYmKGUuYmFja2Ryb3BDbGFzcz10LmJhY2tkcm9wQ2xhc3MpLGV9X2F0dGFjaERpYWxvZ0NvbnRhaW5lcih0LGUpe2NvbnN0IG49cnAuY3JlYXRlKHtwYXJlbnQ6ZSYmZS52aWV3Q29udGFpbmVyUmVmJiZlLnZpZXdDb250YWluZXJSZWYuaW5qZWN0b3J8fHRoaXMuX2luamVjdG9yLHByb3ZpZGVyczpbe3Byb3ZpZGU6VUcsdXNlVmFsdWU6ZX1dfSksbz1uZXcgdkYodGhpcy5fZGlhbG9nQ29udGFpbmVyVHlwZSxlLnZpZXdDb250YWluZXJSZWYsbixlLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcik7cmV0dXJuIHQuYXR0YWNoKG8pLmluc3RhbmNlfV9hdHRhY2hEaWFsb2dDb250ZW50KHQsZSxuLG8pe2NvbnN0IGk9bmV3IHRoaXMuX2RpYWxvZ1JlZkNvbnN0cnVjdG9yKG4sZSxvLmlkKTtpZih0IGluc3RhbmNlb2YgWGcpZS5hdHRhY2hUZW1wbGF0ZVBvcnRhbChuZXcgeEYodCxudWxsLHskaW1wbGljaXQ6by5kYXRhLGRpYWxvZ1JlZjppfSkpO2Vsc2V7Y29uc3Qgbj10aGlzLl9jcmVhdGVJbmplY3RvcihvLGksZSksYT1lLmF0dGFjaENvbXBvbmVudFBvcnRhbChuZXcgdkYodCxvLnZpZXdDb250YWluZXJSZWYsbikpO2kuY29tcG9uZW50SW5zdGFuY2U9YS5pbnN0YW5jZX1yZXR1cm4gaS51cGRhdGVTaXplKG8ud2lkdGgsby5oZWlnaHQpLnVwZGF0ZVBvc2l0aW9uKG8ucG9zaXRpb24pLGl9X2NyZWF0ZUluamVjdG9yKHQsZSxuKXtjb25zdCBvPXQmJnQudmlld0NvbnRhaW5lclJlZiYmdC52aWV3Q29udGFpbmVyUmVmLmluamVjdG9yLGk9W3twcm92aWRlOnRoaXMuX2RpYWxvZ0NvbnRhaW5lclR5cGUsdXNlVmFsdWU6bn0se3Byb3ZpZGU6dGhpcy5fZGlhbG9nRGF0YVRva2VuLHVzZVZhbHVlOnQuZGF0YX0se3Byb3ZpZGU6dGhpcy5fZGlhbG9nUmVmQ29uc3RydWN0b3IsdXNlVmFsdWU6ZX1dO3JldHVybiF0LmRpcmVjdGlvbnx8byYmby5nZXQoSEksbnVsbCxFbi5PcHRpb25hbCl8fGkucHVzaCh7cHJvdmlkZTpISSx1c2VWYWx1ZTp7dmFsdWU6dC5kaXJlY3Rpb24sY2hhbmdlOkV0KCl9fSkscnAuY3JlYXRlKHtwYXJlbnQ6b3x8dGhpcy5faW5qZWN0b3IscHJvdmlkZXJzOml9KX1fcmVtb3ZlT3BlbkRpYWxvZyh0KXtjb25zdCBlPXRoaXMub3BlbkRpYWxvZ3MuaW5kZXhPZih0KTtlPi0xJiYodGhpcy5vcGVuRGlhbG9ncy5zcGxpY2UoZSwxKSx0aGlzLm9wZW5EaWFsb2dzLmxlbmd0aHx8KHRoaXMuX2FyaWFIaWRkZW5FbGVtZW50cy5mb3JFYWNoKCgodCxlKT0+e3Q/ZS5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIix0KTplLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iKX0pKSx0aGlzLl9hcmlhSGlkZGVuRWxlbWVudHMuY2xlYXIoKSx0aGlzLl9nZXRBZnRlckFsbENsb3NlZCgpLm5leHQoKSkpfV9oaWRlTm9uRGlhbG9nQ29udGVudEZyb21Bc3Npc3RpdmVUZWNobm9sb2d5KCl7Y29uc3QgdD10aGlzLl9vdmVybGF5Q29udGFpbmVyLmdldENvbnRhaW5lckVsZW1lbnQoKTtpZih0LnBhcmVudEVsZW1lbnQpe2NvbnN0IGU9dC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuO2ZvcihsZXQgbj1lLmxlbmd0aC0xO24+LTE7bi0tKXtsZXQgbz1lW25dO289PT10fHwiU0NSSVBUIj09PW8ubm9kZU5hbWV8fCJTVFlMRSI9PT1vLm5vZGVOYW1lfHxvLmhhc0F0dHJpYnV0ZSgiYXJpYS1saXZlIil8fCh0aGlzLl9hcmlhSGlkZGVuRWxlbWVudHMuc2V0KG8sby5nZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIikpLG8uc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsInRydWUiKSl9fX1fY2xvc2VEaWFsb2dzKHQpe2xldCBlPXQubGVuZ3RoO2Zvcig7ZS0tOyl0W2VdLmNsb3NlKCl9fW5XLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxuVykoU20ocEwpLFNtKHJwKSxTbSh2b2lkIDApLFNtKHZvaWQgMCksU20oUUYpLFNtKHZvaWQgMCksU20oUWEpLFNtKFFhKSxTbShHYSkpfSxuVy7JtWRpcj1sbyh7dHlwZTpuV30pLG5XLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6cEx9LHt0eXBlOnJwfSx7dHlwZTp2b2lkIDB9LHt0eXBlOnZvaWQgMH0se3R5cGU6UUZ9LHt0eXBlOnZvaWQgMH0se3R5cGU6UWF9LHt0eXBlOlFhfSx7dHlwZTpHYX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoblcsW3t0eXBlOkN5fV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnBMfSx7dHlwZTpycH0se3R5cGU6dm9pZCAwfSx7dHlwZTp2b2lkIDB9LHt0eXBlOlFGfSx7dHlwZTp2b2lkIDB9LHt0eXBlOlFhfSx7dHlwZTpRYX0se3R5cGU6R2F9XX0pLG51bGwpO2NsYXNzIG9XIGV4dGVuZHMgbld7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEscil7c3VwZXIodCxlLG8sYSxyLGksWEcscUcsSkcpfX1vVy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8b1cpKHZyKHBMKSx2cihycCksdnIobEMsOCksdnIoUUcsOCksdnIoJEcpLHZyKG9XLDEyKSx2cihRRikpfSxvVy7JtXByb3Y9TW4oe3Rva2VuOm9XLGZhY3Rvcnk6b1cuybVmYWN9KSxvVy5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnBMfSx7dHlwZTpycH0se3R5cGU6bEMsZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6VUcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1FHXX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbJEddfV19LHt0eXBlOm9XLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpFcn1dfSx7dHlwZTpRRn1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgob1csW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnBMfSx7dHlwZTpycH0se3R5cGU6bEMsZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6VUcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1FHXX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbJEddfV19LHt0eXBlOm9XLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpFcn1dfSx7dHlwZTpRRn1dfSksbnVsbCk7bGV0IGlXPTA7Y2xhc3MgYVd7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuZGlhbG9nUmVmPXQsdGhpcy5fZWxlbWVudFJlZj1lLHRoaXMuX2RpYWxvZz1uLHRoaXMudHlwZT0iYnV0dG9uIn1uZ09uSW5pdCgpe3RoaXMuZGlhbG9nUmVmfHwodGhpcy5kaWFsb2dSZWY9Y1codGhpcy5fZWxlbWVudFJlZix0aGlzLl9kaWFsb2cub3BlbkRpYWxvZ3MpKX1uZ09uQ2hhbmdlcyh0KXtjb25zdCBlPXQuX21hdERpYWxvZ0Nsb3NlfHx0Ll9tYXREaWFsb2dDbG9zZVJlc3VsdDtlJiYodGhpcy5kaWFsb2dSZXN1bHQ9ZS5jdXJyZW50VmFsdWUpfV9vbkJ1dHRvbkNsaWNrKHQpe0tHKHRoaXMuZGlhbG9nUmVmLDA9PT10LnNjcmVlblgmJjA9PT10LnNjcmVlblk/ImtleWJvYXJkIjoibW91c2UiLHRoaXMuZGlhbG9nUmVzdWx0KX19YVcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGFXKShTbShYRyw4KSxTbShoZyksU20ob1cpKX0sYVcuybVkaXI9bG8oe3R5cGU6YVcsc2VsZWN0b3JzOltbIiIsIm1hdC1kaWFsb2ctY2xvc2UiLCIiXSxbIiIsIm1hdERpYWxvZ0Nsb3NlIiwiIl1dLGhvc3RWYXJzOjIsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJlZtKCJjbGljayIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX29uQnV0dG9uQ2xpY2soZSl9KSksMiZlJiZqcCgiYXJpYS1sYWJlbCIsbi5hcmlhTGFiZWx8fG51bGwpKCJ0eXBlIixuLnR5cGUpfSxpbnB1dHM6e3R5cGU6InR5cGUiLGRpYWxvZ1Jlc3VsdDpbIm1hdC1kaWFsb2ctY2xvc2UiLCJkaWFsb2dSZXN1bHQiXSxhcmlhTGFiZWw6WyJhcmlhLWxhYmVsIiwiYXJpYUxhYmVsIl0sX21hdERpYWxvZ0Nsb3NlOlsibWF0RGlhbG9nQ2xvc2UiLCJfbWF0RGlhbG9nQ2xvc2UiXX0sZXhwb3J0QXM6WyJtYXREaWFsb2dDbG9zZSJdLGZlYXR1cmVzOltCb119KSxhVy5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlhHLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOmhnfSx7dHlwZTpvV31dLGFXLnByb3BEZWNvcmF0b3JzPXthcmlhTGFiZWw6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsIl19XSx0eXBlOlt7dHlwZTp4eX1dLGRpYWxvZ1Jlc3VsdDpbe3R5cGU6eHksYXJnczpbIm1hdC1kaWFsb2ctY2xvc2UiXX1dLF9tYXREaWFsb2dDbG9zZTpbe3R5cGU6eHksYXJnczpbIm1hdERpYWxvZ0Nsb3NlIl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChhVyxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbWF0LWRpYWxvZy1jbG9zZV0sIFttYXREaWFsb2dDbG9zZV0iLGV4cG9ydEFzOiJtYXREaWFsb2dDbG9zZSIsaG9zdDp7IihjbGljaykiOiJfb25CdXR0b25DbGljaygkZXZlbnQpIiwiW2F0dHIuYXJpYS1sYWJlbF0iOiJhcmlhTGFiZWwgfHwgbnVsbCIsIlthdHRyLnR5cGVdIjoidHlwZSJ9fV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6WEcsZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6aGd9LHt0eXBlOm9XfV19KSx7dHlwZTpbe3R5cGU6eHl9XSxkaWFsb2dSZXN1bHQ6W3t0eXBlOnh5LGFyZ3M6WyJtYXQtZGlhbG9nLWNsb3NlIl19XSxhcmlhTGFiZWw6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsIl19XSxfbWF0RGlhbG9nQ2xvc2U6W3t0eXBlOnh5LGFyZ3M6WyJtYXREaWFsb2dDbG9zZSJdfV19KTtjbGFzcyByV3tjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5fZGlhbG9nUmVmPXQsdGhpcy5fZWxlbWVudFJlZj1lLHRoaXMuX2RpYWxvZz1uLHRoaXMuaWQ9Im1hdC1kaWFsb2ctdGl0bGUtIitpVysrfW5nT25Jbml0KCl7dGhpcy5fZGlhbG9nUmVmfHwodGhpcy5fZGlhbG9nUmVmPWNXKHRoaXMuX2VsZW1lbnRSZWYsdGhpcy5fZGlhbG9nLm9wZW5EaWFsb2dzKSksdGhpcy5fZGlhbG9nUmVmJiZQcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+e2NvbnN0IHQ9dGhpcy5fZGlhbG9nUmVmLl9jb250YWluZXJJbnN0YW5jZTt0JiYhdC5fYXJpYUxhYmVsbGVkQnkmJih0Ll9hcmlhTGFiZWxsZWRCeT10aGlzLmlkKX0pKX19clcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHJXKShTbShYRyw4KSxTbShoZyksU20ob1cpKX0sclcuybVkaXI9bG8oe3R5cGU6clcsc2VsZWN0b3JzOltbIiIsIm1hdC1kaWFsb2ctdGl0bGUiLCIiXSxbIiIsIm1hdERpYWxvZ1RpdGxlIiwiIl1dLGhvc3RBdHRyczpbMSwibWF0LWRpYWxvZy10aXRsZSJdLGhvc3RWYXJzOjEsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJlR1KCJpZCIsbi5pZCl9LGlucHV0czp7aWQ6ImlkIn0sZXhwb3J0QXM6WyJtYXREaWFsb2dUaXRsZSJdfSksclcuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpYRyxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpoZ30se3R5cGU6b1d9XSxyVy5wcm9wRGVjb3JhdG9ycz17aWQ6W3t0eXBlOnh5fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoclcsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW21hdC1kaWFsb2ctdGl0bGVdLCBbbWF0RGlhbG9nVGl0bGVdIixleHBvcnRBczoibWF0RGlhbG9nVGl0bGUiLGhvc3Q6e2NsYXNzOiJtYXQtZGlhbG9nLXRpdGxlIiwiW2lkXSI6ImlkIn19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpYRyxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpoZ30se3R5cGU6b1d9XX0pLHtpZDpbe3R5cGU6eHl9XX0pO2NsYXNzIHNXe31zVy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8c1cpfSxzVy7JtWRpcj1sbyh7dHlwZTpzVyxzZWxlY3RvcnM6W1siIiwibWF0LWRpYWxvZy1jb250ZW50IiwiIl0sWyJtYXQtZGlhbG9nLWNvbnRlbnQiXSxbIiIsIm1hdERpYWxvZ0NvbnRlbnQiLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtZGlhbG9nLWNvbnRlbnQiXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoc1csW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW21hdC1kaWFsb2ctY29udGVudF0sIG1hdC1kaWFsb2ctY29udGVudCwgW21hdERpYWxvZ0NvbnRlbnRdIixob3N0OntjbGFzczoibWF0LWRpYWxvZy1jb250ZW50In19XX1dLG51bGwsbnVsbCk7Y2xhc3MgbFd7fWZ1bmN0aW9uIGNXKHQsZSl7bGV0IG49dC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQ7Zm9yKDtuJiYhbi5jbGFzc0xpc3QuY29udGFpbnMoIm1hdC1kaWFsb2ctY29udGFpbmVyIik7KW49bi5wYXJlbnRFbGVtZW50O3JldHVybiBuP2UuZmluZCgodD0+dC5pZD09PW4uaWQpKTpudWxsfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9sVy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bFcpfSxsVy7JtWRpcj1sbyh7dHlwZTpsVyxzZWxlY3RvcnM6W1siIiwibWF0LWRpYWxvZy1hY3Rpb25zIiwiIl0sWyJtYXQtZGlhbG9nLWFjdGlvbnMiXSxbIiIsIm1hdERpYWxvZ0FjdGlvbnMiLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtZGlhbG9nLWFjdGlvbnMiXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobFcsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW21hdC1kaWFsb2ctYWN0aW9uc10sIG1hdC1kaWFsb2ctYWN0aW9ucywgW21hdERpYWxvZ0FjdGlvbnNdIixob3N0OntjbGFzczoibWF0LWRpYWxvZy1hY3Rpb25zIn19XX1dLG51bGwsbnVsbCk7Y2xhc3MgZFd7fWRXLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxkVyl9LGRXLsm1bW9kPWFvKHt0eXBlOmRXfSksZFcuybVpbmo9dm4oe3Byb3ZpZGVyczpbb1csdFddLGltcG9ydHM6W1t5TCxSRixYSV0sWEldfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChkVyxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W3lMLFJGLFhJXSxleHBvcnRzOltxRyxhVyxyVyxzVyxsVyxYSV0sZGVjbGFyYXRpb25zOltxRyxhVyxyVyxsVyxzV10scHJvdmlkZXJzOltvVyx0V10sZW50cnlDb21wb25lbnRzOltxR119XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhkVyx7ZGVjbGFyYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuW3FHLGFXLHJXLGxXLHNXXX0saW1wb3J0czpmdW5jdGlvbigpe3JldHVyblt5TCxSRixYSV19LGV4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bcUcsYVcsclcsc1csbFcsWEldfX0pO2NsYXNzIHBXe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fZG9jdW1lbnQ9ZTtjb25zdCBuPXRoaXMuX3RleHRhcmVhPXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIiksbz1uLnN0eWxlO28ucG9zaXRpb249ImZpeGVkIixvLnRvcD1vLm9wYWNpdHk9IjAiLG8ubGVmdD0iLTk5OWVtIixuLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIiksbi52YWx1ZT10LHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobil9Y29weSgpe2NvbnN0IHQ9dGhpcy5fdGV4dGFyZWE7bGV0IGU9ITE7dHJ5e2lmKHQpe2NvbnN0IG49dGhpcy5fZG9jdW1lbnQuYWN0aXZlRWxlbWVudDt0LnNlbGVjdCgpLHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCx0LnZhbHVlLmxlbmd0aCksZT10aGlzLl9kb2N1bWVudC5leGVjQ29tbWFuZCgiY29weSIpLG4mJm4uZm9jdXMoKX19Y2F0Y2godCl7fXJldHVybiBlfWRlc3Ryb3koKXtjb25zdCB0PXRoaXMuX3RleHRhcmVhO3QmJih0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0aGlzLl90ZXh0YXJlYT12b2lkIDApfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgbVd7Y29uc3RydWN0b3IodCl7dGhpcy5fZG9jdW1lbnQ9dH1jb3B5KHQpe2NvbnN0IGU9dGhpcy5iZWdpbkNvcHkodCksbj1lLmNvcHkoKTtyZXR1cm4gZS5kZXN0cm95KCksbn1iZWdpbkNvcHkodCl7cmV0dXJuIG5ldyBwVyh0LHRoaXMuX2RvY3VtZW50KX19bVcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fG1XKSh2cihaXykpfSxtVy7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgbVcodnIoWl8pKX0sdG9rZW46bVcscHJvdmlkZWRJbjoicm9vdCJ9KSxtVy5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobVcsW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOiJyb290In1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCB1Vz1uZXcgR2EoIkNES19DT1BZX1RPX0NMSVBCT0FSRF9DT05GSUciKTtjbGFzcyBmV3tjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5fY2xpcGJvYXJkPXQsdGhpcy5fbmdab25lPWUsdGhpcy50ZXh0PSIiLHRoaXMuYXR0ZW1wdHM9MSx0aGlzLmNvcGllZD1uZXcgTGgsdGhpcy5fcGVuZGluZz1uZXcgU2V0LG4mJm51bGwhPW4uYXR0ZW1wdHMmJih0aGlzLmF0dGVtcHRzPW4uYXR0ZW1wdHMpfWNvcHkodD10aGlzLmF0dGVtcHRzKXtpZih0PjEpe2xldCBlPXQ7Y29uc3Qgbj10aGlzLl9jbGlwYm9hcmQuYmVnaW5Db3B5KHRoaXMudGV4dCk7dGhpcy5fcGVuZGluZy5hZGQobik7Y29uc3Qgbz0oKT0+e2NvbnN0IHQ9bi5jb3B5KCk7dHx8IS0tZXx8dGhpcy5fZGVzdHJveWVkPyh0aGlzLl9jdXJyZW50VGltZW91dD1udWxsLHRoaXMuX3BlbmRpbmcuZGVsZXRlKG4pLG4uZGVzdHJveSgpLHRoaXMuY29waWVkLmVtaXQodCkpOnRoaXMuX2N1cnJlbnRUaW1lb3V0PXRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PnNldFRpbWVvdXQobywxKSkpfTtvKCl9ZWxzZSB0aGlzLmNvcGllZC5lbWl0KHRoaXMuX2NsaXBib2FyZC5jb3B5KHRoaXMudGV4dCkpfW5nT25EZXN0cm95KCl7dGhpcy5fY3VycmVudFRpbWVvdXQmJmNsZWFyVGltZW91dCh0aGlzLl9jdXJyZW50VGltZW91dCksdGhpcy5fcGVuZGluZy5mb3JFYWNoKCh0PT50LmRlc3Ryb3koKSkpLHRoaXMuX3BlbmRpbmcuY2xlYXIoKSx0aGlzLl9kZXN0cm95ZWQ9ITB9fWZXLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxmVykoU20obVcpLFNtKGFfKSxTbSh1Vyw4KSl9LGZXLsm1ZGlyPWxvKHt0eXBlOmZXLHNlbGVjdG9yczpbWyIiLCJjZGtDb3B5VG9DbGlwYm9hcmQiLCIiXV0saG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJlZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5jb3B5KCl9KSl9LGlucHV0czp7dGV4dDpbImNka0NvcHlUb0NsaXBib2FyZCIsInRleHQiXSxhdHRlbXB0czpbImNka0NvcHlUb0NsaXBib2FyZEF0dGVtcHRzIiwiYXR0ZW1wdHMiXX0sb3V0cHV0czp7Y29waWVkOiJjZGtDb3B5VG9DbGlwYm9hcmRDb3BpZWQifX0pLGZXLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6bVd9LHt0eXBlOmFffSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3VXXX1dfV0sZlcucHJvcERlY29yYXRvcnM9e3RleHQ6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb3B5VG9DbGlwYm9hcmQiXX1dLGF0dGVtcHRzOlt7dHlwZTp4eSxhcmdzOlsiY2RrQ29weVRvQ2xpcGJvYXJkQXR0ZW1wdHMiXX1dLGNvcGllZDpbe3R5cGU6T3ksYXJnczpbImNka0NvcHlUb0NsaXBib2FyZENvcGllZCJdfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZlcsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Nka0NvcHlUb0NsaXBib2FyZF0iLGhvc3Q6eyIoY2xpY2spIjoiY29weSgpIn19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTptV30se3R5cGU6YV99LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbdVddfV19XX0pLHt0ZXh0Olt7dHlwZTp4eSxhcmdzOlsiY2RrQ29weVRvQ2xpcGJvYXJkIl19XSxhdHRlbXB0czpbe3R5cGU6eHksYXJnczpbImNka0NvcHlUb0NsaXBib2FyZEF0dGVtcHRzIl19XSxjb3BpZWQ6W3t0eXBlOk95LGFyZ3M6WyJjZGtDb3B5VG9DbGlwYm9hcmRDb3BpZWQiXX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBnV3t9ZnVuY3Rpb24gaFcodCl7cmV0dXJuIEVycm9yKGBVbmFibGUgdG8gZmluZCBpY29uIHdpdGggdGhlIG5hbWUgIiR7dH0iYCl9ZnVuY3Rpb24gYlcodCl7cmV0dXJuIEVycm9yKGBUaGUgVVJMIHByb3ZpZGVkIHRvIE1hdEljb25SZWdpc3RyeSB3YXMgbm90IHRydXN0ZWQgYXMgYSByZXNvdXJjZSBVUkwgdmlhIEFuZ3VsYXIncyBEb21TYW5pdGl6ZXIuIEF0dGVtcHRlZCBVUkwgd2FzICIke3R9Ii5gKX1mdW5jdGlvbiB5Vyh0KXtyZXR1cm4gRXJyb3IoYFRoZSBsaXRlcmFsIHByb3ZpZGVkIHRvIE1hdEljb25SZWdpc3RyeSB3YXMgbm90IHRydXN0ZWQgYXMgc2FmZSBIVE1MIGJ5IEFuZ3VsYXIncyBEb21TYW5pdGl6ZXIuIEF0dGVtcHRlZCBsaXRlcmFsIHdhcyAiJHt0fSIuYCl9Z1cuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGdXKX0sZ1cuybVtb2Q9YW8oe3R5cGU6Z1d9KSxnVy7JtWluaj12bih7fSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChnVyxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbZlddLGV4cG9ydHM6W2ZXXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKGdXLHtkZWNsYXJhdGlvbnM6W2ZXXSxleHBvcnRzOltmV119KTtjbGFzcyBfV3tjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy51cmw9dCx0aGlzLnN2Z1RleHQ9ZSx0aGlzLm9wdGlvbnM9bn19Y2xhc3MgQ1d7Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy5faHR0cENsaWVudD10LHRoaXMuX3Nhbml0aXplcj1lLHRoaXMuX2Vycm9ySGFuZGxlcj1vLHRoaXMuX3N2Z0ljb25Db25maWdzPW5ldyBNYXAsdGhpcy5faWNvblNldENvbmZpZ3M9bmV3IE1hcCx0aGlzLl9jYWNoZWRJY29uc0J5VXJsPW5ldyBNYXAsdGhpcy5faW5Qcm9ncmVzc1VybEZldGNoZXM9bmV3IE1hcCx0aGlzLl9mb250Q3NzQ2xhc3Nlc0J5QWxpYXM9bmV3IE1hcCx0aGlzLl9yZXNvbHZlcnM9W10sdGhpcy5fZGVmYXVsdEZvbnRTZXRDbGFzcz0ibWF0ZXJpYWwtaWNvbnMiLHRoaXMuX2RvY3VtZW50PW59YWRkU3ZnSWNvbih0LGUsbil7cmV0dXJuIHRoaXMuYWRkU3ZnSWNvbkluTmFtZXNwYWNlKCIiLHQsZSxuKX1hZGRTdmdJY29uTGl0ZXJhbCh0LGUsbil7cmV0dXJuIHRoaXMuYWRkU3ZnSWNvbkxpdGVyYWxJbk5hbWVzcGFjZSgiIix0LGUsbil9YWRkU3ZnSWNvbkluTmFtZXNwYWNlKHQsZSxuLG8pe3JldHVybiB0aGlzLl9hZGRTdmdJY29uQ29uZmlnKHQsZSxuZXcgX1cobixudWxsLG8pKX1hZGRTdmdJY29uUmVzb2x2ZXIodCl7cmV0dXJuIHRoaXMuX3Jlc29sdmVycy5wdXNoKHQpLHRoaXN9YWRkU3ZnSWNvbkxpdGVyYWxJbk5hbWVzcGFjZSh0LGUsbixvKXtjb25zdCBpPXRoaXMuX3Nhbml0aXplci5zYW5pdGl6ZShBcy5IVE1MLG4pO2lmKCFpKXRocm93IHlXKG4pO3JldHVybiB0aGlzLl9hZGRTdmdJY29uQ29uZmlnKHQsZSxuZXcgX1coIiIsaSxvKSl9YWRkU3ZnSWNvblNldCh0LGUpe3JldHVybiB0aGlzLmFkZFN2Z0ljb25TZXRJbk5hbWVzcGFjZSgiIix0LGUpfWFkZFN2Z0ljb25TZXRMaXRlcmFsKHQsZSl7cmV0dXJuIHRoaXMuYWRkU3ZnSWNvblNldExpdGVyYWxJbk5hbWVzcGFjZSgiIix0LGUpfWFkZFN2Z0ljb25TZXRJbk5hbWVzcGFjZSh0LGUsbil7cmV0dXJuIHRoaXMuX2FkZFN2Z0ljb25TZXRDb25maWcodCxuZXcgX1coZSxudWxsLG4pKX1hZGRTdmdJY29uU2V0TGl0ZXJhbEluTmFtZXNwYWNlKHQsZSxuKXtjb25zdCBvPXRoaXMuX3Nhbml0aXplci5zYW5pdGl6ZShBcy5IVE1MLGUpO2lmKCFvKXRocm93IHlXKGUpO3JldHVybiB0aGlzLl9hZGRTdmdJY29uU2V0Q29uZmlnKHQsbmV3IF9XKCIiLG8sbikpfXJlZ2lzdGVyRm9udENsYXNzQWxpYXModCxlPXQpe3JldHVybiB0aGlzLl9mb250Q3NzQ2xhc3Nlc0J5QWxpYXMuc2V0KHQsZSksdGhpc31jbGFzc05hbWVGb3JGb250QWxpYXModCl7cmV0dXJuIHRoaXMuX2ZvbnRDc3NDbGFzc2VzQnlBbGlhcy5nZXQodCl8fHR9c2V0RGVmYXVsdEZvbnRTZXRDbGFzcyh0KXtyZXR1cm4gdGhpcy5fZGVmYXVsdEZvbnRTZXRDbGFzcz10LHRoaXN9Z2V0RGVmYXVsdEZvbnRTZXRDbGFzcygpe3JldHVybiB0aGlzLl9kZWZhdWx0Rm9udFNldENsYXNzfWdldFN2Z0ljb25Gcm9tVXJsKHQpe2NvbnN0IGU9dGhpcy5fc2FuaXRpemVyLnNhbml0aXplKEFzLlJFU09VUkNFX1VSTCx0KTtpZighZSl0aHJvdyBiVyh0KTtjb25zdCBuPXRoaXMuX2NhY2hlZEljb25zQnlVcmwuZ2V0KGUpO3JldHVybiBuP0V0KE1XKG4pKTp0aGlzLl9sb2FkU3ZnSWNvbkZyb21Db25maWcobmV3IF9XKHQsbnVsbCkpLnBpcGUoRmUoKHQ9PnRoaXMuX2NhY2hlZEljb25zQnlVcmwuc2V0KGUsdCkpKSxJdCgodD0+TVcodCkpKSl9Z2V0TmFtZWRTdmdJY29uKHQsZT0iIil7Y29uc3Qgbj12VyhlLHQpO2xldCBvPXRoaXMuX3N2Z0ljb25Db25maWdzLmdldChuKTtpZihvKXJldHVybiB0aGlzLl9nZXRTdmdGcm9tQ29uZmlnKG8pO2lmKG89dGhpcy5fZ2V0SWNvbkNvbmZpZ0Zyb21SZXNvbHZlcnMoZSx0KSxvKXJldHVybiB0aGlzLl9zdmdJY29uQ29uZmlncy5zZXQobixvKSx0aGlzLl9nZXRTdmdGcm9tQ29uZmlnKG8pO2NvbnN0IGk9dGhpcy5faWNvblNldENvbmZpZ3MuZ2V0KGUpO3JldHVybiBpP3RoaXMuX2dldFN2Z0Zyb21JY29uU2V0Q29uZmlncyh0LGkpOlJ0KGhXKG4pKX1uZ09uRGVzdHJveSgpe3RoaXMuX3Jlc29sdmVycz1bXSx0aGlzLl9zdmdJY29uQ29uZmlncy5jbGVhcigpLHRoaXMuX2ljb25TZXRDb25maWdzLmNsZWFyKCksdGhpcy5fY2FjaGVkSWNvbnNCeVVybC5jbGVhcigpfV9nZXRTdmdGcm9tQ29uZmlnKHQpe3JldHVybiB0LnN2Z1RleHQ/RXQoTVcodGhpcy5fc3ZnRWxlbWVudEZyb21Db25maWcodCkpKTp0aGlzLl9sb2FkU3ZnSWNvbkZyb21Db25maWcodCkucGlwZShJdCgodD0+TVcodCkpKSl9X2dldFN2Z0Zyb21JY29uU2V0Q29uZmlncyh0LGUpe2NvbnN0IG49dGhpcy5fZXh0cmFjdEljb25XaXRoTmFtZUZyb21BbnlTZXQodCxlKTtyZXR1cm4gbj9FdChuKTokdChlLmZpbHRlcigodD0+IXQuc3ZnVGV4dCkpLm1hcCgodD0+dGhpcy5fbG9hZFN2Z0ljb25TZXRGcm9tQ29uZmlnKHQpLnBpcGUocGUoKGU9Pntjb25zdCBuPXRoaXMuX3Nhbml0aXplci5zYW5pdGl6ZShBcy5SRVNPVVJDRV9VUkwsdC51cmwpO3JldHVybiB0aGlzLl9lcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IobmV3IEVycm9yKGBMb2FkaW5nIGljb24gc2V0IFVSTDogJHtufSBmYWlsZWQ6ICR7ZS5tZXNzYWdlfWApKSxFdChudWxsKX0pKSkpKSkucGlwZShJdCgoKCk9Pntjb25zdCBuPXRoaXMuX2V4dHJhY3RJY29uV2l0aE5hbWVGcm9tQW55U2V0KHQsZSk7aWYoIW4pdGhyb3cgaFcodCk7cmV0dXJuIG59KSkpfV9leHRyYWN0SWNvbldpdGhOYW1lRnJvbUFueVNldCh0LGUpe2ZvcihsZXQgbj1lLmxlbmd0aC0xO24+PTA7bi0tKXtjb25zdCBvPWVbbl07aWYoby5zdmdUZXh0JiZvLnN2Z1RleHQuaW5kZXhPZih0KT4tMSl7Y29uc3QgZT10aGlzLl9zdmdFbGVtZW50RnJvbUNvbmZpZyhvKSxuPXRoaXMuX2V4dHJhY3RTdmdJY29uRnJvbVNldChlLHQsby5vcHRpb25zKTtpZihuKXJldHVybiBufX1yZXR1cm4gbnVsbH1fbG9hZFN2Z0ljb25Gcm9tQ29uZmlnKHQpe3JldHVybiB0aGlzLl9mZXRjaEljb24odCkucGlwZShGZSgoZT0+dC5zdmdUZXh0PWUpKSxJdCgoKCk9PnRoaXMuX3N2Z0VsZW1lbnRGcm9tQ29uZmlnKHQpKSkpfV9sb2FkU3ZnSWNvblNldEZyb21Db25maWcodCl7cmV0dXJuIHQuc3ZnVGV4dD9FdChudWxsKTp0aGlzLl9mZXRjaEljb24odCkucGlwZShGZSgoZT0+dC5zdmdUZXh0PWUpKSl9X2V4dHJhY3RTdmdJY29uRnJvbVNldCh0LGUsbil7Y29uc3Qgbz10LnF1ZXJ5U2VsZWN0b3IoYFtpZD0iJHtlfSJdYCk7aWYoIW8pcmV0dXJuIG51bGw7Y29uc3QgaT1vLmNsb25lTm9kZSghMCk7aWYoaS5yZW1vdmVBdHRyaWJ1dGUoImlkIiksInN2ZyI9PT1pLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHRoaXMuX3NldFN2Z0F0dHJpYnV0ZXMoaSxuKTtpZigic3ltYm9sIj09PWkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSlyZXR1cm4gdGhpcy5fc2V0U3ZnQXR0cmlidXRlcyh0aGlzLl90b1N2Z0VsZW1lbnQoaSksbik7Y29uc3QgYT10aGlzLl9zdmdFbGVtZW50RnJvbVN0cmluZygiPHN2Zz48L3N2Zz4iKTtyZXR1cm4gYS5hcHBlbmRDaGlsZChpKSx0aGlzLl9zZXRTdmdBdHRyaWJ1dGVzKGEsbil9X3N2Z0VsZW1lbnRGcm9tU3RyaW5nKHQpe2NvbnN0IGU9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIik7ZS5pbm5lckhUTUw9dDtjb25zdCBuPWUucXVlcnlTZWxlY3Rvcigic3ZnIik7aWYoIW4pdGhyb3cgRXJyb3IoIjxzdmc+IHRhZyBub3QgZm91bmQiKTtyZXR1cm4gbn1fdG9TdmdFbGVtZW50KHQpe2NvbnN0IGU9dGhpcy5fc3ZnRWxlbWVudEZyb21TdHJpbmcoIjxzdmc+PC9zdmc+Iiksbj10LmF0dHJpYnV0ZXM7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0Kyspe2NvbnN0e25hbWU6byx2YWx1ZTppfT1uW3RdOyJpZCIhPT1vJiZlLnNldEF0dHJpYnV0ZShvLGkpfWZvcihsZXQgbj0wO248dC5jaGlsZE5vZGVzLmxlbmd0aDtuKyspdC5jaGlsZE5vZGVzW25dLm5vZGVUeXBlPT09dGhpcy5fZG9jdW1lbnQuRUxFTUVOVF9OT0RFJiZlLmFwcGVuZENoaWxkKHQuY2hpbGROb2Rlc1tuXS5jbG9uZU5vZGUoITApKTtyZXR1cm4gZX1fc2V0U3ZnQXR0cmlidXRlcyh0LGUpe3JldHVybiB0LnNldEF0dHJpYnV0ZSgiZml0IiwiIiksdC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKSx0LnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIiksdC5zZXRBdHRyaWJ1dGUoInByZXNlcnZlQXNwZWN0UmF0aW8iLCJ4TWlkWU1pZCBtZWV0IiksdC5zZXRBdHRyaWJ1dGUoImZvY3VzYWJsZSIsImZhbHNlIiksZSYmZS52aWV3Qm94JiZ0LnNldEF0dHJpYnV0ZSgidmlld0JveCIsZS52aWV3Qm94KSx0fV9mZXRjaEljb24odCl7dmFyIGU7Y29uc3R7dXJsOm4sb3B0aW9uczpvfT10LGk9bnVsbCE9PShlPW51bGw9PW8/dm9pZCAwOm8ud2l0aENyZWRlbnRpYWxzKSYmdm9pZCAwIT09ZSYmZTtpZighdGhpcy5faHR0cENsaWVudCl0aHJvdyhmdW5jdGlvbiBhKCl7cmV0dXJuIEVycm9yKCJDb3VsZCBub3QgZmluZCBIdHRwQ2xpZW50IHByb3ZpZGVyIGZvciB1c2Ugd2l0aCBBbmd1bGFyIE1hdGVyaWFsIGljb25zLiBQbGVhc2UgaW5jbHVkZSB0aGUgSHR0cENsaWVudE1vZHVsZSBmcm9tIEBhbmd1bGFyL2NvbW1vbi9odHRwIGluIHlvdXIgYXBwIGltcG9ydHMuIil9KSgpO2lmKG51bGw9PW4pdGhyb3cgRXJyb3IoYENhbm5vdCBmZXRjaCBpY29uIGZyb20gVVJMICIke259Ii5gKTtjb25zdCByPXRoaXMuX3Nhbml0aXplci5zYW5pdGl6ZShBcy5SRVNPVVJDRV9VUkwsbik7aWYoIXIpdGhyb3cgYlcobik7Y29uc3Qgcz10aGlzLl9pblByb2dyZXNzVXJsRmV0Y2hlcy5nZXQocik7aWYocylyZXR1cm4gcztjb25zdCBsPXRoaXMuX2h0dHBDbGllbnQuZ2V0KHIse3Jlc3BvbnNlVHlwZToidGV4dCIsd2l0aENyZWRlbnRpYWxzOml9KS5waXBlKChmdW5jdGlvbiBjKHQpe3JldHVybiBSKChmdW5jdGlvbihlLG4pe3RyeXtlLnN1YnNjcmliZShuKX1maW5hbGx5e24uYWRkKHQpfX0pKX0pKCgoKT0+dGhpcy5faW5Qcm9ncmVzc1VybEZldGNoZXMuZGVsZXRlKHIpKSksRWUoKSk7cmV0dXJuIHRoaXMuX2luUHJvZ3Jlc3NVcmxGZXRjaGVzLnNldChyLGwpLGx9X2FkZFN2Z0ljb25Db25maWcodCxlLG4pe3JldHVybiB0aGlzLl9zdmdJY29uQ29uZmlncy5zZXQodlcodCxlKSxuKSx0aGlzfV9hZGRTdmdJY29uU2V0Q29uZmlnKHQsZSl7Y29uc3Qgbj10aGlzLl9pY29uU2V0Q29uZmlncy5nZXQodCk7cmV0dXJuIG4/bi5wdXNoKGUpOnRoaXMuX2ljb25TZXRDb25maWdzLnNldCh0LFtlXSksdGhpc31fc3ZnRWxlbWVudEZyb21Db25maWcodCl7aWYoIXQuc3ZnRWxlbWVudCl7Y29uc3QgZT10aGlzLl9zdmdFbGVtZW50RnJvbVN0cmluZyh0LnN2Z1RleHQpO3RoaXMuX3NldFN2Z0F0dHJpYnV0ZXMoZSx0Lm9wdGlvbnMpLHQuc3ZnRWxlbWVudD1lfXJldHVybiB0LnN2Z0VsZW1lbnR9X2dldEljb25Db25maWdGcm9tUmVzb2x2ZXJzKHQsZSl7Zm9yKGxldCBvPTA7bzx0aGlzLl9yZXNvbHZlcnMubGVuZ3RoO28rKyl7Y29uc3QgaT10aGlzLl9yZXNvbHZlcnNbb10oZSx0KTtpZihpKXJldHVybihuPWkpLnVybCYmbi5vcHRpb25zP25ldyBfVyhpLnVybCxudWxsLGkub3B0aW9ucyk6bmV3IF9XKGksbnVsbCl9dmFyIG47Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL319ZnVuY3Rpb24gTVcodCl7cmV0dXJuIHQuY2xvbmVOb2RlKCEwKX1mdW5jdGlvbiB2Vyh0LGUpe3JldHVybiB0KyI6IitlfUNXLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxDVykodnIoUEQsOCksdnIoenYpLHZyKFpfLDgpLHZyKFpzKSl9LENXLsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIG5ldyBDVyh2cihQRCw4KSx2cih6diksdnIoWl8sOCksdnIoWnMpKX0sdG9rZW46Q1cscHJvdmlkZWRJbjoicm9vdCJ9KSxDVy5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlBELGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOnp2fSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTpac31dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQ1csW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOiJyb290In1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlBELGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOnp2fSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTpac31dfSksbnVsbCksbmV3IFNyLG5ldyBFcixuZXcgU3IsbmV3IFNyO2NvbnN0IHhXPUpJKGNsYXNze2NvbnN0cnVjdG9yKHQpe3RoaXMuX2VsZW1lbnRSZWY9dH19KSxPVz1uZXcgR2EoIm1hdC1pY29uLWxvY2F0aW9uIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbiBQVygpe2NvbnN0IHQ9T3IoWl8pLGU9dD90LmxvY2F0aW9uOm51bGw7cmV0dXJue2dldFBhdGhuYW1lOigpPT5lP2UucGF0aG5hbWUrZS5zZWFyY2g6IiJ9fX0pLHdXPVsiY2xpcC1wYXRoIiwiY29sb3ItcHJvZmlsZSIsInNyYyIsImN1cnNvciIsImZpbGwiLCJmaWx0ZXIiLCJtYXJrZXIiLCJtYXJrZXItc3RhcnQiLCJtYXJrZXItbWlkIiwibWFya2VyLWVuZCIsIm1hc2siLCJzdHJva2UiXSxrVz13Vy5tYXAoKHQ9PmBbJHt0fV1gKSkuam9pbigiLCAiKSxTVz0vXnVybFwoWyciXT8jKC4qPylbJyJdP1wpJC87Y2xhc3MgRFcgZXh0ZW5kcyB4V3tjb25zdHJ1Y3Rvcih0LGUsbixvLGkpe3N1cGVyKHQpLHRoaXMuX2ljb25SZWdpc3RyeT1lLHRoaXMuX2xvY2F0aW9uPW8sdGhpcy5fZXJyb3JIYW5kbGVyPWksdGhpcy5faW5saW5lPSExLHRoaXMuX2N1cnJlbnRJY29uRmV0Y2g9bS5FTVBUWSxufHx0Lm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsInRydWUiKX1nZXQgaW5saW5lKCl7cmV0dXJuIHRoaXMuX2lubGluZX1zZXQgaW5saW5lKHQpe3RoaXMuX2lubGluZT15eih0KX1nZXQgc3ZnSWNvbigpe3JldHVybiB0aGlzLl9zdmdJY29ufXNldCBzdmdJY29uKHQpe3QhPT10aGlzLl9zdmdJY29uJiYodD90aGlzLl91cGRhdGVTdmdJY29uKHQpOnRoaXMuX3N2Z0ljb24mJnRoaXMuX2NsZWFyU3ZnRWxlbWVudCgpLHRoaXMuX3N2Z0ljb249dCl9Z2V0IGZvbnRTZXQoKXtyZXR1cm4gdGhpcy5fZm9udFNldH1zZXQgZm9udFNldCh0KXtjb25zdCBlPXRoaXMuX2NsZWFudXBGb250VmFsdWUodCk7ZSE9PXRoaXMuX2ZvbnRTZXQmJih0aGlzLl9mb250U2V0PWUsdGhpcy5fdXBkYXRlRm9udEljb25DbGFzc2VzKCkpfWdldCBmb250SWNvbigpe3JldHVybiB0aGlzLl9mb250SWNvbn1zZXQgZm9udEljb24odCl7Y29uc3QgZT10aGlzLl9jbGVhbnVwRm9udFZhbHVlKHQpO2UhPT10aGlzLl9mb250SWNvbiYmKHRoaXMuX2ZvbnRJY29uPWUsdGhpcy5fdXBkYXRlRm9udEljb25DbGFzc2VzKCkpfV9zcGxpdEljb25OYW1lKHQpe2lmKCF0KXJldHVyblsiIiwiIl07Y29uc3QgZT10LnNwbGl0KCI6Iik7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDE6cmV0dXJuWyIiLGVbMF1dO2Nhc2UgMjpyZXR1cm4gZTtkZWZhdWx0OnRocm93IEVycm9yKGBJbnZhbGlkIGljb24gbmFtZTogIiR7dH0iYCl9fW5nT25Jbml0KCl7dGhpcy5fdXBkYXRlRm9udEljb25DbGFzc2VzKCl9bmdBZnRlclZpZXdDaGVja2VkKCl7Y29uc3QgdD10aGlzLl9lbGVtZW50c1dpdGhFeHRlcm5hbFJlZmVyZW5jZXM7aWYodCYmdC5zaXplKXtjb25zdCB0PXRoaXMuX2xvY2F0aW9uLmdldFBhdGhuYW1lKCk7dCE9PXRoaXMuX3ByZXZpb3VzUGF0aCYmKHRoaXMuX3ByZXZpb3VzUGF0aD10LHRoaXMuX3ByZXBlbmRQYXRoVG9SZWZlcmVuY2VzKHQpKX19bmdPbkRlc3Ryb3koKXt0aGlzLl9jdXJyZW50SWNvbkZldGNoLnVuc3Vic2NyaWJlKCksdGhpcy5fZWxlbWVudHNXaXRoRXh0ZXJuYWxSZWZlcmVuY2VzJiZ0aGlzLl9lbGVtZW50c1dpdGhFeHRlcm5hbFJlZmVyZW5jZXMuY2xlYXIoKX1fdXNpbmdGb250SWNvbigpe3JldHVybiF0aGlzLnN2Z0ljb259X3NldFN2Z0VsZW1lbnQodCl7dGhpcy5fY2xlYXJTdmdFbGVtZW50KCk7Y29uc3QgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlIik7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XS50ZXh0Q29udGVudCs9IiAiO2NvbnN0IG49dGhpcy5fbG9jYXRpb24uZ2V0UGF0aG5hbWUoKTt0aGlzLl9wcmV2aW91c1BhdGg9bix0aGlzLl9jYWNoZUNoaWxkcmVuV2l0aEV4dGVybmFsUmVmZXJlbmNlcyh0KSx0aGlzLl9wcmVwZW5kUGF0aFRvUmVmZXJlbmNlcyhuKSx0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQodCl9X2NsZWFyU3ZnRWxlbWVudCgpe2NvbnN0IHQ9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O2xldCBlPXQuY2hpbGROb2Rlcy5sZW5ndGg7Zm9yKHRoaXMuX2VsZW1lbnRzV2l0aEV4dGVybmFsUmVmZXJlbmNlcyYmdGhpcy5fZWxlbWVudHNXaXRoRXh0ZXJuYWxSZWZlcmVuY2VzLmNsZWFyKCk7ZS0tOyl7Y29uc3Qgbj10LmNoaWxkTm9kZXNbZV07MT09PW4ubm9kZVR5cGUmJiJzdmciIT09bi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpfHx0LnJlbW92ZUNoaWxkKG4pfX1fdXBkYXRlRm9udEljb25DbGFzc2VzKCl7aWYoIXRoaXMuX3VzaW5nRm9udEljb24oKSlyZXR1cm47Y29uc3QgdD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsZT10aGlzLmZvbnRTZXQ/dGhpcy5faWNvblJlZ2lzdHJ5LmNsYXNzTmFtZUZvckZvbnRBbGlhcyh0aGlzLmZvbnRTZXQpOnRoaXMuX2ljb25SZWdpc3RyeS5nZXREZWZhdWx0Rm9udFNldENsYXNzKCk7ZSE9dGhpcy5fcHJldmlvdXNGb250U2V0Q2xhc3MmJih0aGlzLl9wcmV2aW91c0ZvbnRTZXRDbGFzcyYmdC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX3ByZXZpb3VzRm9udFNldENsYXNzKSxlJiZ0LmNsYXNzTGlzdC5hZGQoZSksdGhpcy5fcHJldmlvdXNGb250U2V0Q2xhc3M9ZSksdGhpcy5mb250SWNvbiE9dGhpcy5fcHJldmlvdXNGb250SWNvbkNsYXNzJiYodGhpcy5fcHJldmlvdXNGb250SWNvbkNsYXNzJiZ0LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fcHJldmlvdXNGb250SWNvbkNsYXNzKSx0aGlzLmZvbnRJY29uJiZ0LmNsYXNzTGlzdC5hZGQodGhpcy5mb250SWNvbiksdGhpcy5fcHJldmlvdXNGb250SWNvbkNsYXNzPXRoaXMuZm9udEljb24pfV9jbGVhbnVwRm9udFZhbHVlKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90LnRyaW0oKS5zcGxpdCgiICIpWzBdOnR9X3ByZXBlbmRQYXRoVG9SZWZlcmVuY2VzKHQpe2NvbnN0IGU9dGhpcy5fZWxlbWVudHNXaXRoRXh0ZXJuYWxSZWZlcmVuY2VzO2UmJmUuZm9yRWFjaCgoKGUsbik9PntlLmZvckVhY2goKGU9PntuLnNldEF0dHJpYnV0ZShlLm5hbWUsYHVybCgnJHt0fSMke2UudmFsdWV9JylgKX0pKX0pKX1fY2FjaGVDaGlsZHJlbldpdGhFeHRlcm5hbFJlZmVyZW5jZXModCl7Y29uc3QgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoa1cpLG49dGhpcy5fZWxlbWVudHNXaXRoRXh0ZXJuYWxSZWZlcmVuY2VzPXRoaXMuX2VsZW1lbnRzV2l0aEV4dGVybmFsUmVmZXJlbmNlc3x8bmV3IE1hcDtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl3Vy5mb3JFYWNoKChvPT57Y29uc3QgaT1lW3RdLGE9aS5nZXRBdHRyaWJ1dGUobykscj1hP2EubWF0Y2goU1cpOm51bGw7aWYocil7bGV0IHQ9bi5nZXQoaSk7dHx8KHQ9W10sbi5zZXQoaSx0KSksdC5wdXNoKHtuYW1lOm8sdmFsdWU6clsxXX0pfX0pKX1fdXBkYXRlU3ZnSWNvbih0KXtpZih0aGlzLl9zdmdOYW1lc3BhY2U9bnVsbCx0aGlzLl9zdmdOYW1lPW51bGwsdGhpcy5fY3VycmVudEljb25GZXRjaC51bnN1YnNjcmliZSgpLHQpe2NvbnN0W2Usbl09dGhpcy5fc3BsaXRJY29uTmFtZSh0KTtlJiYodGhpcy5fc3ZnTmFtZXNwYWNlPWUpLG4mJih0aGlzLl9zdmdOYW1lPW4pLHRoaXMuX2N1cnJlbnRJY29uRmV0Y2g9dGhpcy5faWNvblJlZ2lzdHJ5LmdldE5hbWVkU3ZnSWNvbihuLGUpLnBpcGUoYmUoMSkpLnN1YnNjcmliZSgodD0+dGhpcy5fc2V0U3ZnRWxlbWVudCh0KSksKHQ9Pnt0aGlzLl9lcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IobmV3IEVycm9yKGBFcnJvciByZXRyaWV2aW5nIGljb24gJHtlfToke259ISAke3QubWVzc2FnZX1gKSl9KSl9fX1EVy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8RFcpKFNtKGhnKSxTbShDVyksTmEoImFyaWEtaGlkZGVuIiksU20oT1cpLFNtKFpzKSl9LERXLsm1Y21wPXRvKHt0eXBlOkRXLHNlbGVjdG9yczpbWyJtYXQtaWNvbiJdXSxob3N0QXR0cnM6WyJyb2xlIiwiaW1nIiwxLCJtYXQtaWNvbiIsIm5vdHJhbnNsYXRlIl0saG9zdFZhcnM6Nyxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmKGpwKCJkYXRhLW1hdC1pY29uLXR5cGUiLG4uX3VzaW5nRm9udEljb24oKT8iZm9udCI6InN2ZyIpKCJkYXRhLW1hdC1pY29uLW5hbWUiLG4uX3N2Z05hbWV8fG4uZm9udEljb24pKCJkYXRhLW1hdC1pY29uLW5hbWVzcGFjZSIsbi5fc3ZnTmFtZXNwYWNlfHxuLmZvbnRTZXQpLHB1KCJtYXQtaWNvbi1pbmxpbmUiLG4uaW5saW5lKSgibWF0LWljb24tbm8tY29sb3IiLCJwcmltYXJ5IiE9PW4uY29sb3ImJiJhY2NlbnQiIT09bi5jb2xvciYmIndhcm4iIT09bi5jb2xvcikpfSxpbnB1dHM6e2NvbG9yOiJjb2xvciIsaW5saW5lOiJpbmxpbmUiLHN2Z0ljb246InN2Z0ljb24iLGZvbnRTZXQ6ImZvbnRTZXQiLGZvbnRJY29uOiJmb250SWNvbiJ9LGV4cG9ydEFzOlsibWF0SWNvbiJdLGZlYXR1cmVzOlt4cF0sbmdDb250ZW50U2VsZWN0b3JzOlsiKiJdLGRlY2xzOjEsdmFyczowLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabSgpLFhtKDApKX0sc3R5bGVzOlsiLm1hdC1pY29ue2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtkaXNwbGF5OmlubGluZS1ibG9jaztmaWxsOmN1cnJlbnRDb2xvcjtoZWlnaHQ6MjRweDt3aWR0aDoyNHB4fS5tYXQtaWNvbi5tYXQtaWNvbi1pbmxpbmV7Zm9udC1zaXplOmluaGVyaXQ7aGVpZ2h0OmluaGVyaXQ7bGluZS1oZWlnaHQ6aW5oZXJpdDt3aWR0aDppbmhlcml0fVtkaXI9cnRsXSAubWF0LWljb24tcnRsLW1pcnJvcnt0cmFuc2Zvcm06c2NhbGUoLTEsIDEpfS5tYXQtZm9ybS1maWVsZDpub3QoLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5KSAubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbiwubWF0LWZvcm0tZmllbGQ6bm90KC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSkgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb257ZGlzcGxheTpibG9ja30ubWF0LWZvcm0tZmllbGQ6bm90KC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSkgLm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbiwubWF0LWZvcm0tZmllbGQ6bm90KC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSkgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbnttYXJnaW46YXV0b31cbiJdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLERXLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOkNXfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6amEsYXJnczpbImFyaWEtaGlkZGVuIl19XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W09XXX1dfSx7dHlwZTpac31dLERXLnByb3BEZWNvcmF0b3JzPXtpbmxpbmU6W3t0eXBlOnh5fV0sc3ZnSWNvbjpbe3R5cGU6eHl9XSxmb250U2V0Olt7dHlwZTp4eX1dLGZvbnRJY29uOlt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKERXLFt7dHlwZTpNeSxhcmdzOlt7dGVtcGxhdGU6IjxuZy1jb250ZW50PjwvbmctY29udGVudD4iLHNlbGVjdG9yOiJtYXQtaWNvbiIsZXhwb3J0QXM6Im1hdEljb24iLGlucHV0czpbImNvbG9yIl0saG9zdDp7cm9sZToiaW1nIixjbGFzczoibWF0LWljb24gbm90cmFuc2xhdGUiLCJbYXR0ci5kYXRhLW1hdC1pY29uLXR5cGVdIjonX3VzaW5nRm9udEljb24oKSA/ICJmb250IiA6ICJzdmciJywiW2F0dHIuZGF0YS1tYXQtaWNvbi1uYW1lXSI6Il9zdmdOYW1lIHx8IGZvbnRJY29uIiwiW2F0dHIuZGF0YS1tYXQtaWNvbi1uYW1lc3BhY2VdIjoiX3N2Z05hbWVzcGFjZSB8fCBmb250U2V0IiwiW2NsYXNzLm1hdC1pY29uLWlubGluZV0iOiJpbmxpbmUiLCJbY2xhc3MubWF0LWljb24tbm8tY29sb3JdIjonY29sb3IgIT09ICJwcmltYXJ5IiAmJiBjb2xvciAhPT0gImFjY2VudCIgJiYgY29sb3IgIT09ICJ3YXJuIid9LGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLHN0eWxlczpbIi5tYXQtaWNvbntiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7ZmlsbDpjdXJyZW50Q29sb3I7aGVpZ2h0OjI0cHg7d2lkdGg6MjRweH0ubWF0LWljb24ubWF0LWljb24taW5saW5le2ZvbnQtc2l6ZTppbmhlcml0O2hlaWdodDppbmhlcml0O2xpbmUtaGVpZ2h0OmluaGVyaXQ7d2lkdGg6aW5oZXJpdH1bZGlyPXJ0bF0gLm1hdC1pY29uLXJ0bC1taXJyb3J7dHJhbnNmb3JtOnNjYWxlKC0xLCAxKX0ubWF0LWZvcm0tZmllbGQ6bm90KC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSkgLm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29ue2Rpc3BsYXk6YmxvY2t9Lm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb257bWFyZ2luOmF1dG99XG4iXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTpDV30se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmphLGFyZ3M6WyJhcmlhLWhpZGRlbiJdfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltPV119XX0se3R5cGU6WnN9XX0pLHtpbmxpbmU6W3t0eXBlOnh5fV0sc3ZnSWNvbjpbe3R5cGU6eHl9XSxmb250U2V0Olt7dHlwZTp4eX1dLGZvbnRJY29uOlt7dHlwZTp4eX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBFV3t9RVcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEVXKX0sRVcuybVtb2Q9YW8oe3R5cGU6RVd9KSxFVy7JtWluaj12bih7aW1wb3J0czpbW1hJXSxYSV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEVXLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbWEldLGV4cG9ydHM6W0RXLFhJXSxkZWNsYXJhdGlvbnM6W0RXXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKEVXLHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bRFddfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1hJXX0sZXhwb3J0czpmdW5jdGlvbigpe3JldHVybltEVyxYSV19fSk7Y2xhc3MgUld7Y29uc3RydWN0b3IodCl7dGhpcy5kaWFsb2dSZWY9dCx0aGlzLnRlbnNvcmJvYXJkRG90RGV2VXJsPSJodHRwczovL3RlbnNvcmJvYXJkLmRldi8/dXRtX3NvdXJjZT10ZW5zb3Jib2FyZCJ9b25DbG9zZSgpe3RoaXMuZGlhbG9nUmVmLmNsb3NlKCl9Z2V0Q29tbWFuZFRleHQoKXtyZXR1cm4gdGhpcy5sb2dkaXI/InRlbnNvcmJvYXJkIGRldiB1cGxvYWQgLS1sb2dkaXIgXFxcbiAgICAnIit0aGlzLmxvZ2Rpci5yZXBsYWNlKC8nL2csIidcXCcnIikrIiciOiJ0ZW5zb3Jib2FyZCBkZXYgdXBsb2FkIC0tbG9nZGlyIHtsb2dkaXJ9In19UlcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFJXKShTbShYRykpfSxSVy7JtWNtcD10byh7dHlwZTpSVyxzZWxlY3RvcnM6W1sidGJkZXYtdXBsb2FkLWRpYWxvZy1jb21wb25lbnQiXV0saW5wdXRzOntsb2dkaXI6ImxvZ2RpciJ9LGRlY2xzOjIxLHZhcnM6NCxjb25zdHM6W1sidGFyZ2V0IiwiX2JsYW5rIiwicmVsIiwibm9yZWZlcnJlciBub29wZW5lciIsMSwiYW5jaG9yLXRleHQiLDMsImhyZWYiXSxbMSwiY29tbWFuZCJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwidGl0bGUiLCJDbGljayB0byBjb3B5IHRoZSBjb21tYW5kIiwxLCJjb21tYW5kLWNvcHkiLDMsImNka0NvcHlUb0NsaXBib2FyZCJdLFsic3ZnSWNvbiIsImNvbnRlbnRfY29weV8yNHB4Il0sWzEsImJvdHRvbS1idXR0b25zIl0sWyJtYXQtZmxhdC1idXR0b24iLCIiLDEsImNsb3NlLWJ1dHRvbiIsMywiY2xpY2siXSxbIm1hdC1mbGF0LWJ1dHRvbiIsIiIsInRhcmdldCIsIl9ibGFuayIsInJlbCIsIm5vcmVmZXJyZXIgbm9vcGVuZXIiLDEsImxlYXJuLW1vcmUtYnV0dG9uIiwzLCJocmVmIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJoMyIpLGt1KDEsIlVwbG9hZCB0byBUZW5zb3JCb2FyZC5kZXYiKSxBbSgpLFJtKDIsInAiKSxSbSgzLCJhIiwwKSxrdSg0LCIgVGVuc29yQm9hcmQuZGV2IiksQW0oKSxrdSg1LCIgZW5hYmxlcyB5b3UgdG8gZWFzaWx5IGhvc3QsIHRyYWNrLCBhbmQgc2hhcmUgeW91ciBNTCBleHBlcmltZW50cyB3aXRoIGV2ZXJ5b25lLiBZb3UgY2FuIHNoYXJlIGEgbGluayB0byB0aGUgdXBsb2FkZWQgVGVuc29yQm9hcmQgaW4gcGFwZXJzLCBibG9nIHBvc3RzLCBhbmQgc29jaWFsIG1lZGlhLiBUaGlzIGNhbiBzaG93Y2FzZSB0aGUgcmVzdWx0cyBtb3JlIGVmZmVjdGl2ZWx5IGFuZCBoZWxwcyByZXByb2R1Y2liaWxpdHkuXG4iKSxBbSgpLFJtKDYsInAiKSxrdSg3LCJUbyB1cGxvYWQgYSBsb2dkaXIgdG8gVGVuc29yQm9hcmQuZGV2LCBydW4gdGhlIGNvbW1hbmQ6IiksQW0oKSxSbSg4LCJkaXYiLDEpLFJtKDksInByZSIpLFJtKDEwLCJjb2RlIiksa3UoMTEpLEFtKCksQW0oKSxSbSgxMiwiYnV0dG9uIiwyKSxUbSgxMywibWF0LWljb24iLDMpLEFtKCksQW0oKSxSbSgxNCwicCIpLGt1KDE1LCIgT25seSBjZXJ0YWluIHBsdWdpbnMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuIFVwbG9hZGVkIFRlbnNvckJvYXJkcyBhcmUgcHVibGljIGFuZCB2aXNpYmxlIHRvIGV2ZXJ5b25lOyBkbyBub3QgdXBsb2FkIHNlbnNpdGl2ZSBkYXRhLlxuIiksQW0oKSxSbSgxNiwiZGl2Iiw0KSxSbSgxNywiYnV0dG9uIiw1KSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25DbG9zZSgpfSkpLGt1KDE4LCIgQ2xvc2UgIiksQW0oKSxSbSgxOSwiYSIsNiksa3UoMjAsIiBMZWFybiBtb3JlICIpLEFtKCksQW0oKSksMiZlJiYocmMoMyksS20oImhyZWYiLG4udGVuc29yYm9hcmREb3REZXZVcmwsVHMpLHJjKDgpLFN1KG4uZ2V0Q29tbWFuZFRleHQoKSkscmMoMSksRG0oImNka0NvcHlUb0NsaXBib2FyZCIsbi5nZXRDb21tYW5kVGV4dCgpKSxyYyg3KSxLbSgiaHJlZiIsbi50ZW5zb3Jib2FyZERvdERldlVybCxUcykpfSxkaXJlY3RpdmVzOltYSCxmVyxEVyxLSF0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9ZGl2W19uZ2NvbnRlbnQtJUNPTVAlXSwgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjE2cHggMH1bX25naG9zdC0lQ09NUCVdID4gW19uZ2NvbnRlbnQtJUNPTVAlXTpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9W19uZ2hvc3QtJUNPTVAlXSA+IFtfbmdjb250ZW50LSVDT01QJV06bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9aDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMDtsaW5lLWhlaWdodDoxLjV9cFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoxLjV9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9LmFuY2hvci10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXt0ZXh0LWRlY29yYXRpb246bm9uZX0uY29tbWFuZFtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2JhY2tncm91bmQ6I2Y1ZjZmNztib3JkZXItcmFkaXVzOjRweDtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47cGFkZGluZzoycHggMTJweH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuY29tbWFuZFtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5jb21tYW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiM2MTYxNjF9cHJlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdy14OmF1dG99Y29kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS41fS5ib3R0b20tYnV0dG9uc1tfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9LmNsb3NlLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bWFyZ2luLXJpZ2h0OjhweH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuY2xvc2UtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmNsb3NlLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9W19uZ2hvc3QtJUNPTVAlXSAgIC5sZWFybi1tb3JlLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzE5NzZkMjt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9Ym9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmxlYXJuLW1vcmUtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNDJhNWY1fSddfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChSVyxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJ0YmRldi11cGxvYWQtZGlhbG9nLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vdGJkZXZfdXBsb2FkX2RpYWxvZ19jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi90YmRldl91cGxvYWRfZGlhbG9nX2NvbXBvbmVudC5jc3MiXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlhHfV19KSx7bG9nZGlyOlt7dHlwZTp4eX1dfSk7Y29uc3QgQVc9WncoeFIsKHQ9PnQuZGF0YV9sb2NhdGlvbikpO2NsYXNzIFRXe2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLmxvZ2RpciQ9dGhpcy5zdG9yZS5waXBlKEZ3KEFXKSl9fWZ1bmN0aW9uIE5XKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiYnV0dG9uIiwxKSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLFltKCkub3BlbkRpYWxvZygpfSkpLFJtKDEsInNwYW4iLDIpLFRtKDIsIm1hdC1pY29uIiwzKSxrdSgzLCIgVXBsb2FkICIpLEFtKCksQW0oKX19VFcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFRXKShTbShJdykpfSxUVy7JtWNtcD10byh7dHlwZTpUVyxzZWxlY3RvcnM6W1sidGJkZXYtdXBsb2FkLWRpYWxvZyJdXSxkZWNsczoyLHZhcnM6Myxjb25zdHM6W1szLCJsb2dkaXIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFRtKDAsInRiZGV2LXVwbG9hZC1kaWFsb2ctY29tcG9uZW50IiwwKSxBaCgxLCJhc3luYyIpKSwyJmUmJkRtKCJsb2dkaXIiLFRoKDEsMSxuLmxvZ2RpciQpKX0sZGlyZWN0aXZlczpbUlddLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChUVyxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJ0YmRldi11cGxvYWQtZGlhbG9nIix0ZW1wbGF0ZTonXG4gICAgPHRiZGV2LXVwbG9hZC1kaWFsb2ctY29tcG9uZW50XG4gICAgICBbbG9nZGlyXT0ibG9nZGlyJCB8IGFzeW5jIlxuICAgID48L3RiZGV2LXVwbG9hZC1kaWFsb2ctY29tcG9uZW50PlxuICAnfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NvbnN0IHpXPVsibG9jYWxob3N0IiwiMTI3LjAuMC4xIl07Y2xhc3MgSVd7Y29uc3RydWN0b3IodCxlKXt0aGlzLndpbmRvdz10LHRoaXMuZGlhbG9nPWUsdGhpcy5zaG93bj16Vy5pbmNsdWRlcyh0LmxvY2F0aW9uLmhvc3RuYW1lKX1vcGVuRGlhbG9nKCl7dGhpcy5kaWFsb2cub3BlbihUVyx7d2lkdGg6IjU2MHB4In0pfX1mdW5jdGlvbiBIVyh0LGUpezEmdCYmKHFpKCksUm0oMCwic3ZnIiwyKSxUbSgxLCJwb2x5Z29uIiwzKSxBbSgpKX1JVy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SVcpKFNtKCJ3aW5kb3ciKSxTbShvVykpfSxJVy7JtWNtcD10byh7dHlwZTpJVyxzZWxlY3RvcnM6W1sidGJkZXYtdXBsb2FkLWJ1dHRvbiJdXSxob3N0VmFyczoyLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZwdSgic2hvd24iLG4uc2hvd24pfSxkZWNsczoxLHZhcnM6MSxjb25zdHM6W1sibWF0LXN0cm9rZWQtYnV0dG9uIiwiIiwzLCJjbGljayIsNCwibmdJZiJdLFsibWF0LXN0cm9rZWQtYnV0dG9uIiwiIiwzLCJjbGljayJdLFsxLCJidXR0b24tY29udGVudHMiXSxbInN2Z0ljb24iLCJpbmZvX291dGxpbmVfMjRweCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiZRcCgwLE5XLDQsMCwiYnV0dG9uIiwwKSwyJmUmJkRtKCJuZ0lmIixuLnNob3duKX0sZGlyZWN0aXZlczpbZE0sWEgsRFddLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV0gICBidXR0b24ubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Ym9yZGVyOjFweCBzb2xpZCAjZWJlYmVifWJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIGJ1dHRvbi5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2VmNmMwMH0uYnV0dG9uLWNvbnRlbnRzW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX1tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXJpZ2h0OjZweH0nXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoSVcsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoidGJkZXYtdXBsb2FkLWJ1dHRvbiIsdGVtcGxhdGVVcmw6Ii4vdGJkZXZfdXBsb2FkX2J1dHRvbl9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi90YmRldl91cGxvYWRfYnV0dG9uX2NvbXBvbmVudC5jc3MiXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOldpbmRvdyxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOlsid2luZG93Il19XX0se3R5cGU6b1d9XX0pLHtzaG93bjpbe3R5cGU6UHksYXJnczpbImNsYXNzLnNob3duIl19XX0pO2NvbnN0IEZXPVsiKiJdO2Z1bmN0aW9uIExXKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2IiwwKSxWbSgia2V5ZG93biIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkuX2hhbmRsZUtleWRvd24obil9KSkoImNsaWNrIiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgpLmNsb3NlZC5lbWl0KCJjbGljayIpfSkpKCJAdHJhbnNmb3JtTWVudS5zdGFydCIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkuX29uQW5pbWF0aW9uU3RhcnQobil9KSkoIkB0cmFuc2Zvcm1NZW51LmRvbmUiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLl9vbkFuaW1hdGlvbkRvbmUobil9KSksUm0oMSwiZGl2IiwxKSxYbSgyKSxBbSgpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKCk7RG0oImlkIix0LnBhbmVsSWQpKCJuZ0NsYXNzIix0Ll9jbGFzc0xpc3QpKCJAdHJhbnNmb3JtTWVudSIsdC5fcGFuZWxBbmltYXRpb25TdGF0ZSksanAoImFyaWEtbGFiZWwiLHQuYXJpYUxhYmVsfHxudWxsKSgiYXJpYS1sYWJlbGxlZGJ5Iix0LmFyaWFMYWJlbGxlZGJ5fHxudWxsKSgiYXJpYS1kZXNjcmliZWRieSIsdC5hcmlhRGVzY3JpYmVkYnl8fG51bGwpfX1jb25zdCBCVz17dHJhbnNmb3JtTWVudTpueCgidHJhbnNmb3JtTWVudSIsW3J4KCJ2b2lkIixheCh7b3BhY2l0eTowLHRyYW5zZm9ybToic2NhbGUoMC44KSJ9KSksbHgoInZvaWQgPT4gZW50ZXIiLG94KCIxMjBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKSIsYXgoe29wYWNpdHk6MSx0cmFuc2Zvcm06InNjYWxlKDEpIn0pKSksbHgoIiogPT4gdm9pZCIsb3goIjEwMG1zIDI1bXMgbGluZWFyIixheCh7b3BhY2l0eTowfSkpKV0pLGZhZGVJbkl0ZW1zOm54KCJmYWRlSW5JdGVtcyIsW3J4KCJzaG93aW5nIixheCh7b3BhY2l0eToxfSkpLGx4KCJ2b2lkID0+ICoiLFtheCh7b3BhY2l0eTowfSksb3goIjQwMG1zIDEwMG1zIGN1YmljLWJlemllcigwLjU1LCAwLCAwLjU1LCAwLjIpIildKV0pfSxWVz1uZXcgR2EoIk1hdE1lbnVDb250ZW50Iik7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIGpXe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIpe3RoaXMuX3RlbXBsYXRlPXQsdGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyPWUsdGhpcy5fYXBwUmVmPW4sdGhpcy5faW5qZWN0b3I9byx0aGlzLl92aWV3Q29udGFpbmVyUmVmPWksdGhpcy5fZG9jdW1lbnQ9YSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZj1yLHRoaXMuX2F0dGFjaGVkPW5ldyBJfWF0dGFjaCh0PXt9KXt0aGlzLl9wb3J0YWx8fCh0aGlzLl9wb3J0YWw9bmV3IHhGKHRoaXMuX3RlbXBsYXRlLHRoaXMuX3ZpZXdDb250YWluZXJSZWYpKSx0aGlzLmRldGFjaCgpLHRoaXMuX291dGxldHx8KHRoaXMuX291dGxldD1uZXcgd0YodGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLHRoaXMuX2FwcFJlZix0aGlzLl9pbmplY3RvcikpO2NvbnN0IGU9dGhpcy5fdGVtcGxhdGUuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O2UucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5fb3V0bGV0Lm91dGxldEVsZW1lbnQsZSksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYmJnRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpLHRoaXMuX3BvcnRhbC5hdHRhY2godGhpcy5fb3V0bGV0LHQpLHRoaXMuX2F0dGFjaGVkLm5leHQoKX1kZXRhY2goKXt0aGlzLl9wb3J0YWwuaXNBdHRhY2hlZCYmdGhpcy5fcG9ydGFsLmRldGFjaCgpfW5nT25EZXN0cm95KCl7dGhpcy5fb3V0bGV0JiZ0aGlzLl9vdXRsZXQuZGlzcG9zZSgpfX1qVy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8alcpKFNtKFhnKSxTbSh1ZyksU20oT18pLFNtKHJwKSxTbShlaCksU20oWl8pLFNtKFVnKSl9LGpXLsm1ZGlyPWxvKHt0eXBlOmpXLHNlbGVjdG9yczpbWyJuZy10ZW1wbGF0ZSIsIm1hdE1lbnVDb250ZW50IiwiIl1dLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6VlcsdXNlRXhpc3Rpbmc6ald9XSldfSksalcuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpYZ30se3R5cGU6dWd9LHt0eXBlOk9ffSx7dHlwZTpycH0se3R5cGU6ZWh9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6VWd9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGpXLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6Im5nLXRlbXBsYXRlW21hdE1lbnVDb250ZW50XSIscHJvdmlkZXJzOlt7cHJvdmlkZTpWVyx1c2VFeGlzdGluZzpqV31dfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6WGd9LHt0eXBlOnVnfSx7dHlwZTpPX30se3R5cGU6cnB9LHt0eXBlOmVofSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOlVnfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IFVXPW5ldyBHYSgiTUFUX01FTlVfUEFORUwiKSxHVz1RSShLSShjbGFzc3t9KSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIFdXIGV4dGVuZHMgR1d7Y29uc3RydWN0b3IodCxlLG4sbyxpKXtzdXBlcigpLHRoaXMuX2VsZW1lbnRSZWY9dCx0aGlzLl9mb2N1c01vbml0b3I9bix0aGlzLl9wYXJlbnRNZW51PW8sdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWY9aSx0aGlzLnJvbGU9Im1lbnVpdGVtIix0aGlzLl9ob3ZlcmVkPW5ldyBJLHRoaXMuX2ZvY3VzZWQ9bmV3IEksdGhpcy5faGlnaGxpZ2h0ZWQ9ITEsdGhpcy5fdHJpZ2dlcnNTdWJtZW51PSExLG8mJm8uYWRkSXRlbSYmby5hZGRJdGVtKHRoaXMpfWZvY3VzKHQsZSl7dGhpcy5fZm9jdXNNb25pdG9yJiZ0P3RoaXMuX2ZvY3VzTW9uaXRvci5mb2N1c1ZpYSh0aGlzLl9nZXRIb3N0RWxlbWVudCgpLHQsZSk6dGhpcy5fZ2V0SG9zdEVsZW1lbnQoKS5mb2N1cyhlKSx0aGlzLl9mb2N1c2VkLm5leHQodGhpcyl9bmdBZnRlclZpZXdJbml0KCl7dGhpcy5fZm9jdXNNb25pdG9yJiZ0aGlzLl9mb2N1c01vbml0b3IubW9uaXRvcih0aGlzLl9lbGVtZW50UmVmLCExKX1uZ09uRGVzdHJveSgpe3RoaXMuX2ZvY3VzTW9uaXRvciYmdGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKHRoaXMuX2VsZW1lbnRSZWYpLHRoaXMuX3BhcmVudE1lbnUmJnRoaXMuX3BhcmVudE1lbnUucmVtb3ZlSXRlbSYmdGhpcy5fcGFyZW50TWVudS5yZW1vdmVJdGVtKHRoaXMpLHRoaXMuX2hvdmVyZWQuY29tcGxldGUoKSx0aGlzLl9mb2N1c2VkLmNvbXBsZXRlKCl9X2dldFRhYkluZGV4KCl7cmV0dXJuIHRoaXMuZGlzYWJsZWQ/Ii0xIjoiMCJ9X2dldEhvc3RFbGVtZW50KCl7cmV0dXJuIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudH1fY2hlY2tEaXNhYmxlZCh0KXt0aGlzLmRpc2FibGVkJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCkpfV9oYW5kbGVNb3VzZUVudGVyKCl7dGhpcy5faG92ZXJlZC5uZXh0KHRoaXMpfWdldExhYmVsKCl7dmFyIHQsZTtjb25zdCBuPXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbG9uZU5vZGUoITApLG89bi5xdWVyeVNlbGVjdG9yQWxsKCJtYXQtaWNvbiwgLm1hdGVyaWFsLWljb25zIik7Zm9yKGxldCBlPTA7ZTxvLmxlbmd0aDtlKyspe2NvbnN0IG49b1tlXTtudWxsPT09KHQ9bi5wYXJlbnROb2RlKXx8dm9pZCAwPT09dHx8dC5yZW1vdmVDaGlsZChuKX1yZXR1cm4obnVsbD09PShlPW4udGV4dENvbnRlbnQpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnRyaW0oKSl8fCIifV9zZXRIaWdobGlnaHRlZCh0KXt2YXIgZTt0aGlzLl9oaWdobGlnaHRlZD10LG51bGw9PT0oZT10aGlzLl9jaGFuZ2VEZXRlY3RvclJlZil8fHZvaWQgMD09PWV8fGUubWFya0ZvckNoZWNrKCl9fVdXLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxXVykoU20oaGcpLFNtKFpfKSxTbShTSSksU20oVVcsOCksU20oVWcpKX0sV1cuybVjbXA9dG8oe3R5cGU6V1csc2VsZWN0b3JzOltbIiIsIm1hdC1tZW51LWl0ZW0iLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtZm9jdXMtaW5kaWNhdG9yIl0saG9zdFZhcnM6MTAsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJlZtKCJjbGljayIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX2NoZWNrRGlzYWJsZWQoZSl9KSkoIm1vdXNlZW50ZXIiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX2hhbmRsZU1vdXNlRW50ZXIoKX0pKSwyJmUmJihqcCgicm9sZSIsbi5yb2xlKSgidGFiaW5kZXgiLG4uX2dldFRhYkluZGV4KCkpKCJhcmlhLWRpc2FibGVkIixuLmRpc2FibGVkLnRvU3RyaW5nKCkpKCJkaXNhYmxlZCIsbi5kaXNhYmxlZHx8bnVsbCkscHUoIm1hdC1tZW51LWl0ZW0iLCEwKSgibWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZCIsbi5faGlnaGxpZ2h0ZWQpKCJtYXQtbWVudS1pdGVtLXN1Ym1lbnUtdHJpZ2dlciIsbi5fdHJpZ2dlcnNTdWJtZW51KSl9LGlucHV0czp7ZGlzYWJsZWQ6ImRpc2FibGVkIixkaXNhYmxlUmlwcGxlOiJkaXNhYmxlUmlwcGxlIixyb2xlOiJyb2xlIn0sZXhwb3J0QXM6WyJtYXRNZW51SXRlbSJdLGZlYXR1cmVzOlt4cF0sYXR0cnM6WyJtYXQtbWVudS1pdGVtIiwiIl0sbmdDb250ZW50U2VsZWN0b3JzOkZXLGRlY2xzOjMsdmFyczozLGNvbnN0czpbWyJtYXRSaXBwbGUiLCIiLDEsIm1hdC1tZW51LXJpcHBsZSIsMywibWF0UmlwcGxlRGlzYWJsZWQiLCJtYXRSaXBwbGVUcmlnZ2VyIl0sWyJjbGFzcyIsIm1hdC1tZW51LXN1Ym1lbnUtaWNvbiIsInZpZXdCb3giLCIwIDAgNSAxMCIsImZvY3VzYWJsZSIsImZhbHNlIiw0LCJuZ0lmIl0sWyJ2aWV3Qm94IiwiMCAwIDUgMTAiLCJmb2N1c2FibGUiLCJmYWxzZSIsMSwibWF0LW1lbnUtc3VibWVudS1pY29uIl0sWyJwb2ludHMiLCIwLDAgNSw1IDAsMTAiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFptKCksWG0oMCksVG0oMSwiZGl2IiwwKSxRcCgyLEhXLDIsMCwic3ZnIiwxKSksMiZlJiYocmMoMSksRG0oIm1hdFJpcHBsZURpc2FibGVkIixuLmRpc2FibGVSaXBwbGV8fG4uZGlzYWJsZWQpKCJtYXRSaXBwbGVUcmlnZ2VyIixuLl9nZXRIb3N0RWxlbWVudCgpKSxyYygxKSxEbSgibmdJZiIsbi5fdHJpZ2dlcnNTdWJtZW51KSl9LGRpcmVjdGl2ZXM6W2tILGRNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSxXVy5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOlNJfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbVVddfSx7dHlwZTpTcn1dfSx7dHlwZTpVZ31dLFdXLnByb3BEZWNvcmF0b3JzPXtyb2xlOlt7dHlwZTp4eX1dLF9jaGVja0Rpc2FibGVkOlt7dHlwZTp3eSxhcmdzOlsiY2xpY2siLFsiJGV2ZW50Il1dfV0sX2hhbmRsZU1vdXNlRW50ZXI6W3t0eXBlOnd5LGFyZ3M6WyJtb3VzZWVudGVyIl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChXVyxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJbbWF0LW1lbnUtaXRlbV0iLGV4cG9ydEFzOiJtYXRNZW51SXRlbSIsaW5wdXRzOlsiZGlzYWJsZWQiLCJkaXNhYmxlUmlwcGxlIl0saG9zdDp7IlthdHRyLnJvbGVdIjoicm9sZSIsIltjbGFzcy5tYXQtbWVudS1pdGVtXSI6InRydWUiLCJbY2xhc3MubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZF0iOiJfaGlnaGxpZ2h0ZWQiLCJbY2xhc3MubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXJdIjoiX3RyaWdnZXJzU3VibWVudSIsIlthdHRyLnRhYmluZGV4XSI6Il9nZXRUYWJJbmRleCgpIiwiW2F0dHIuYXJpYS1kaXNhYmxlZF0iOiJkaXNhYmxlZC50b1N0cmluZygpIiwiW2F0dHIuZGlzYWJsZWRdIjoiZGlzYWJsZWQgfHwgbnVsbCIsY2xhc3M6Im1hdC1mb2N1cy1pbmRpY2F0b3IifSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLGVuY2Fwc3VsYXRpb246SG4uTm9uZSx0ZW1wbGF0ZTonPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPGRpdiBjbGFzcz0ibWF0LW1lbnUtcmlwcGxlIiBtYXRSaXBwbGVcbiAgICAgW21hdFJpcHBsZURpc2FibGVkXT0iZGlzYWJsZVJpcHBsZSB8fCBkaXNhYmxlZCJcbiAgICAgW21hdFJpcHBsZVRyaWdnZXJdPSJfZ2V0SG9zdEVsZW1lbnQoKSI+XG48L2Rpdj5cblxuPHN2Z1xuICAqbmdJZj0iX3RyaWdnZXJzU3VibWVudSJcbiAgY2xhc3M9Im1hdC1tZW51LXN1Ym1lbnUtaWNvbiJcbiAgdmlld0JveD0iMCAwIDUgMTAiXG4gIGZvY3VzYWJsZT0iZmFsc2UiPjxwb2x5Z29uIHBvaW50cz0iMCwwIDUsNSAwLDEwIi8+PC9zdmc+XG4nfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6U0l9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltVV119LHt0eXBlOlNyfV19LHt0eXBlOlVnfV19KSx7cm9sZTpbe3R5cGU6eHl9XSxfY2hlY2tEaXNhYmxlZDpbe3R5cGU6d3ksYXJnczpbImNsaWNrIixbIiRldmVudCJdXX1dLF9oYW5kbGVNb3VzZUVudGVyOlt7dHlwZTp3eSxhcmdzOlsibW91c2VlbnRlciJdfV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IFlXPW5ldyBHYSgibWF0LW1lbnUtZGVmYXVsdC1vcHRpb25zIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbiBxVygpe3JldHVybntvdmVybGFwVHJpZ2dlcjohMSx4UG9zaXRpb246ImFmdGVyIix5UG9zaXRpb246ImJlbG93IixiYWNrZHJvcENsYXNzOiJjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCJ9fX0pO2xldCBaVz0wO2NsYXNzIFhXe2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLl9lbGVtZW50UmVmPXQsdGhpcy5fbmdab25lPWUsdGhpcy5fZGVmYXVsdE9wdGlvbnM9bix0aGlzLl94UG9zaXRpb249dGhpcy5fZGVmYXVsdE9wdGlvbnMueFBvc2l0aW9uLHRoaXMuX3lQb3NpdGlvbj10aGlzLl9kZWZhdWx0T3B0aW9ucy55UG9zaXRpb24sdGhpcy5fZGlyZWN0RGVzY2VuZGFudEl0ZW1zPW5ldyBWaCx0aGlzLl90YWJTdWJzY3JpcHRpb249bS5FTVBUWSx0aGlzLl9jbGFzc0xpc3Q9e30sdGhpcy5fcGFuZWxBbmltYXRpb25TdGF0ZT0idm9pZCIsdGhpcy5fYW5pbWF0aW9uRG9uZT1uZXcgSSx0aGlzLm92ZXJsYXlQYW5lbENsYXNzPXRoaXMuX2RlZmF1bHRPcHRpb25zLm92ZXJsYXlQYW5lbENsYXNzfHwiIix0aGlzLmJhY2tkcm9wQ2xhc3M9dGhpcy5fZGVmYXVsdE9wdGlvbnMuYmFja2Ryb3BDbGFzcyx0aGlzLl9vdmVybGFwVHJpZ2dlcj10aGlzLl9kZWZhdWx0T3B0aW9ucy5vdmVybGFwVHJpZ2dlcix0aGlzLl9oYXNCYWNrZHJvcD10aGlzLl9kZWZhdWx0T3B0aW9ucy5oYXNCYWNrZHJvcCx0aGlzLmNsb3NlZD1uZXcgTGgsdGhpcy5jbG9zZT10aGlzLmNsb3NlZCx0aGlzLnBhbmVsSWQ9Im1hdC1tZW51LXBhbmVsLSIrWlcrK31nZXQgeFBvc2l0aW9uKCl7cmV0dXJuIHRoaXMuX3hQb3NpdGlvbn1zZXQgeFBvc2l0aW9uKHQpeyJiZWZvcmUiPT09dHx8ImFmdGVyIj09PXR8fCJ1bmRlZmluZWQiIT10eXBlb2YgbmdEZXZNb2RlJiYhbmdEZXZNb2RlfHwoZnVuY3Rpb24gZSgpe3Rocm93IEVycm9yKCd4UG9zaXRpb24gdmFsdWUgbXVzdCBiZSBlaXRoZXIgXCdiZWZvcmVcJyBvciBhZnRlclwnLlxuICAgICAgRXhhbXBsZTogPG1hdC1tZW51IHhQb3NpdGlvbj0iYmVmb3JlIiAjbWVudT0ibWF0TWVudSI+PC9tYXQtbWVudT4nKX0pKCksdGhpcy5feFBvc2l0aW9uPXQsdGhpcy5zZXRQb3NpdGlvbkNsYXNzZXMoKX1nZXQgeVBvc2l0aW9uKCl7cmV0dXJuIHRoaXMuX3lQb3NpdGlvbn1zZXQgeVBvc2l0aW9uKHQpeyJhYm92ZSI9PT10fHwiYmVsb3ciPT09dHx8InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0Rldk1vZGUmJiFuZ0Rldk1vZGV8fChmdW5jdGlvbiBlKCl7dGhyb3cgRXJyb3IoJ3lQb3NpdGlvbiB2YWx1ZSBtdXN0IGJlIGVpdGhlciBcJ2Fib3ZlXCcgb3IgYmVsb3dcJy5cbiAgICAgIEV4YW1wbGU6IDxtYXQtbWVudSB5UG9zaXRpb249ImFib3ZlIiAjbWVudT0ibWF0TWVudSI+PC9tYXQtbWVudT4nKX0pKCksdGhpcy5feVBvc2l0aW9uPXQsdGhpcy5zZXRQb3NpdGlvbkNsYXNzZXMoKX1nZXQgb3ZlcmxhcFRyaWdnZXIoKXtyZXR1cm4gdGhpcy5fb3ZlcmxhcFRyaWdnZXJ9c2V0IG92ZXJsYXBUcmlnZ2VyKHQpe3RoaXMuX292ZXJsYXBUcmlnZ2VyPXl6KHQpfWdldCBoYXNCYWNrZHJvcCgpe3JldHVybiB0aGlzLl9oYXNCYWNrZHJvcH1zZXQgaGFzQmFja2Ryb3AodCl7dGhpcy5faGFzQmFja2Ryb3A9eXoodCl9c2V0IHBhbmVsQ2xhc3ModCl7Y29uc3QgZT10aGlzLl9wcmV2aW91c1BhbmVsQ2xhc3M7ZSYmZS5sZW5ndGgmJmUuc3BsaXQoIiAiKS5mb3JFYWNoKCh0PT57dGhpcy5fY2xhc3NMaXN0W3RdPSExfSkpLHRoaXMuX3ByZXZpb3VzUGFuZWxDbGFzcz10LHQmJnQubGVuZ3RoJiYodC5zcGxpdCgiICIpLmZvckVhY2goKHQ9Pnt0aGlzLl9jbGFzc0xpc3RbdF09ITB9KSksdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTmFtZT0iIil9Z2V0IGNsYXNzTGlzdCgpe3JldHVybiB0aGlzLnBhbmVsQ2xhc3N9c2V0IGNsYXNzTGlzdCh0KXt0aGlzLnBhbmVsQ2xhc3M9dH1uZ09uSW5pdCgpe3RoaXMuc2V0UG9zaXRpb25DbGFzc2VzKCl9bmdBZnRlckNvbnRlbnRJbml0KCl7dGhpcy5fdXBkYXRlRGlyZWN0RGVzY2VuZGFudHMoKSx0aGlzLl9rZXlNYW5hZ2VyPW5ldyBlSSh0aGlzLl9kaXJlY3REZXNjZW5kYW50SXRlbXMpLndpdGhXcmFwKCkud2l0aFR5cGVBaGVhZCgpLndpdGhIb21lQW5kRW5kKCksdGhpcy5fdGFiU3Vic2NyaXB0aW9uPXRoaXMuX2tleU1hbmFnZXIudGFiT3V0LnN1YnNjcmliZSgoKCk9PnRoaXMuY2xvc2VkLmVtaXQoInRhYiIpKSksdGhpcy5fZGlyZWN0RGVzY2VuZGFudEl0ZW1zLmNoYW5nZXMucGlwZShOZSh0aGlzLl9kaXJlY3REZXNjZW5kYW50SXRlbXMpLHplKCh0PT5yZSguLi50Lm1hcCgodD0+dC5fZm9jdXNlZCkpKSkpKS5zdWJzY3JpYmUoKHQ9PnRoaXMuX2tleU1hbmFnZXIudXBkYXRlQWN0aXZlSXRlbSh0KSkpfW5nT25EZXN0cm95KCl7dGhpcy5fZGlyZWN0RGVzY2VuZGFudEl0ZW1zLmRlc3Ryb3koKSx0aGlzLl90YWJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLmNsb3NlZC5jb21wbGV0ZSgpfV9ob3ZlcmVkKCl7cmV0dXJuIHRoaXMuX2RpcmVjdERlc2NlbmRhbnRJdGVtcy5jaGFuZ2VzLnBpcGUoTmUodGhpcy5fZGlyZWN0RGVzY2VuZGFudEl0ZW1zKSx6ZSgodD0+cmUoLi4udC5tYXAoKHQ9PnQuX2hvdmVyZWQpKSkpKSl9YWRkSXRlbSh0KXt9cmVtb3ZlSXRlbSh0KXt9X2hhbmRsZUtleWRvd24odCl7Y29uc3QgZT10LmtleUNvZGUsbj10aGlzLl9rZXlNYW5hZ2VyO3N3aXRjaChlKXtjYXNlIHV6OmJ6KHQpfHwodC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuY2xvc2VkLmVtaXQoImtleWRvd24iKSk7YnJlYWs7Y2FzZSAzNzp0aGlzLnBhcmVudE1lbnUmJiJsdHIiPT09dGhpcy5kaXJlY3Rpb24mJnRoaXMuY2xvc2VkLmVtaXQoImtleWRvd24iKTticmVhaztjYXNlIDM5OnRoaXMucGFyZW50TWVudSYmInJ0bCI9PT10aGlzLmRpcmVjdGlvbiYmdGhpcy5jbG9zZWQuZW1pdCgia2V5ZG93biIpO2JyZWFrO2RlZmF1bHQ6ZSE9PWd6JiZlIT09aHp8fG4uc2V0Rm9jdXNPcmlnaW4oImtleWJvYXJkIiksbi5vbktleWRvd24odCl9fWZvY3VzRmlyc3RJdGVtKHQ9InByb2dyYW0iKXt0aGlzLmxhenlDb250ZW50P3RoaXMuX25nWm9uZS5vblN0YWJsZS5waXBlKGJlKDEpKS5zdWJzY3JpYmUoKCgpPT50aGlzLl9mb2N1c0ZpcnN0SXRlbSh0KSkpOnRoaXMuX2ZvY3VzRmlyc3RJdGVtKHQpfV9mb2N1c0ZpcnN0SXRlbSh0KXtjb25zdCBlPXRoaXMuX2tleU1hbmFnZXI7aWYoZS5zZXRGb2N1c09yaWdpbih0KS5zZXRGaXJzdEl0ZW1BY3RpdmUoKSwhZS5hY3RpdmVJdGVtJiZ0aGlzLl9kaXJlY3REZXNjZW5kYW50SXRlbXMubGVuZ3RoKXtsZXQgdD10aGlzLl9kaXJlY3REZXNjZW5kYW50SXRlbXMuZmlyc3QuX2dldEhvc3RFbGVtZW50KCkucGFyZW50RWxlbWVudDtmb3IoO3Q7KXtpZigibWVudSI9PT10LmdldEF0dHJpYnV0ZSgicm9sZSIpKXt0LmZvY3VzKCk7YnJlYWt9dD10LnBhcmVudEVsZW1lbnR9fX1yZXNldEFjdGl2ZUl0ZW0oKXt0aGlzLl9rZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0oLTEpfXNldEVsZXZhdGlvbih0KXtjb25zdCBlPU1hdGgubWluKHRoaXMuX2Jhc2VFbGV2YXRpb24rdCwyNCksbj1gJHt0aGlzLl9lbGV2YXRpb25QcmVmaXh9JHtlfWAsbz1PYmplY3Qua2V5cyh0aGlzLl9jbGFzc0xpc3QpLmZpbmQoKHQ9PnQuc3RhcnRzV2l0aCh0aGlzLl9lbGV2YXRpb25QcmVmaXgpKSk7byYmbyE9PXRoaXMuX3ByZXZpb3VzRWxldmF0aW9ufHwodGhpcy5fcHJldmlvdXNFbGV2YXRpb24mJih0aGlzLl9jbGFzc0xpc3RbdGhpcy5fcHJldmlvdXNFbGV2YXRpb25dPSExKSx0aGlzLl9jbGFzc0xpc3Rbbl09ITAsdGhpcy5fcHJldmlvdXNFbGV2YXRpb249bil9c2V0UG9zaXRpb25DbGFzc2VzKHQ9dGhpcy54UG9zaXRpb24sZT10aGlzLnlQb3NpdGlvbil7Y29uc3Qgbj10aGlzLl9jbGFzc0xpc3Q7blsibWF0LW1lbnUtYmVmb3JlIl09ImJlZm9yZSI9PT10LG5bIm1hdC1tZW51LWFmdGVyIl09ImFmdGVyIj09PXQsblsibWF0LW1lbnUtYWJvdmUiXT0iYWJvdmUiPT09ZSxuWyJtYXQtbWVudS1iZWxvdyJdPSJiZWxvdyI9PT1lfV9zdGFydEFuaW1hdGlvbigpe3RoaXMuX3BhbmVsQW5pbWF0aW9uU3RhdGU9ImVudGVyIn1fcmVzZXRBbmltYXRpb24oKXt0aGlzLl9wYW5lbEFuaW1hdGlvblN0YXRlPSJ2b2lkIn1fb25BbmltYXRpb25Eb25lKHQpe3RoaXMuX2FuaW1hdGlvbkRvbmUubmV4dCh0KSx0aGlzLl9pc0FuaW1hdGluZz0hMX1fb25BbmltYXRpb25TdGFydCh0KXt0aGlzLl9pc0FuaW1hdGluZz0hMCwiZW50ZXIiPT09dC50b1N0YXRlJiYwPT09dGhpcy5fa2V5TWFuYWdlci5hY3RpdmVJdGVtSW5kZXgmJih0LmVsZW1lbnQuc2Nyb2xsVG9wPTApfV91cGRhdGVEaXJlY3REZXNjZW5kYW50cygpe3RoaXMuX2FsbEl0ZW1zLmNoYW5nZXMucGlwZShOZSh0aGlzLl9hbGxJdGVtcykpLnN1YnNjcmliZSgodD0+e3RoaXMuX2RpcmVjdERlc2NlbmRhbnRJdGVtcy5yZXNldCh0LmZpbHRlcigodD0+dC5fcGFyZW50TWVudT09PXRoaXMpKSksdGhpcy5fZGlyZWN0RGVzY2VuZGFudEl0ZW1zLm5vdGlmeU9uQ2hhbmdlcygpfSkpfX1YVy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WFcpKFNtKGhnKSxTbShhXyksU20oWVcpKX0sWFcuybVkaXI9bG8oe3R5cGU6WFcsY29udGVudFF1ZXJpZXM6ZnVuY3Rpb24gdChlLG4sbyl7aWYoMSZlJiYoJGgobyxWVyw1KSwkaChvLFdXLDUpLCRoKG8sV1csNCkpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4ubGF6eUNvbnRlbnQ9dC5maXJzdCksSmgodD10YigpKSYmKG4uX2FsbEl0ZW1zPXQpLEpoKHQ9dGIoKSkmJihuLml0ZW1zPXQpfX0sdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJlFoKFhnLDUpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4udGVtcGxhdGVSZWY9dC5maXJzdCl9fSxpbnB1dHM6e2JhY2tkcm9wQ2xhc3M6ImJhY2tkcm9wQ2xhc3MiLHhQb3NpdGlvbjoieFBvc2l0aW9uIix5UG9zaXRpb246InlQb3NpdGlvbiIsb3ZlcmxhcFRyaWdnZXI6Im92ZXJsYXBUcmlnZ2VyIixoYXNCYWNrZHJvcDoiaGFzQmFja2Ryb3AiLHBhbmVsQ2xhc3M6WyJjbGFzcyIsInBhbmVsQ2xhc3MiXSxjbGFzc0xpc3Q6ImNsYXNzTGlzdCIsYXJpYUxhYmVsOlsiYXJpYS1sYWJlbCIsImFyaWFMYWJlbCJdLGFyaWFMYWJlbGxlZGJ5OlsiYXJpYS1sYWJlbGxlZGJ5IiwiYXJpYUxhYmVsbGVkYnkiXSxhcmlhRGVzY3JpYmVkYnk6WyJhcmlhLWRlc2NyaWJlZGJ5IiwiYXJpYURlc2NyaWJlZGJ5Il19LG91dHB1dHM6e2Nsb3NlZDoiY2xvc2VkIixjbG9zZToiY2xvc2UifX0pLFhXLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOmFffSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWVddfV19XSxYVy5wcm9wRGVjb3JhdG9ycz17X2FsbEl0ZW1zOlt7dHlwZTpZYSxhcmdzOltXVyx7ZGVzY2VuZGFudHM6ITB9XX1dLGJhY2tkcm9wQ2xhc3M6W3t0eXBlOnh5fV0sYXJpYUxhYmVsOlt7dHlwZTp4eSxhcmdzOlsiYXJpYS1sYWJlbCJdfV0sYXJpYUxhYmVsbGVkYnk6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsbGVkYnkiXX1dLGFyaWFEZXNjcmliZWRieTpbe3R5cGU6eHksYXJnczpbImFyaWEtZGVzY3JpYmVkYnkiXX1dLHhQb3NpdGlvbjpbe3R5cGU6eHl9XSx5UG9zaXRpb246W3t0eXBlOnh5fV0sdGVtcGxhdGVSZWY6W3t0eXBlOlphLGFyZ3M6W1hnXX1dLGl0ZW1zOlt7dHlwZTpZYSxhcmdzOltXVyx7ZGVzY2VuZGFudHM6ITF9XX1dLGxhenlDb250ZW50Olt7dHlwZTpxYSxhcmdzOltWV119XSxvdmVybGFwVHJpZ2dlcjpbe3R5cGU6eHl9XSxoYXNCYWNrZHJvcDpbe3R5cGU6eHl9XSxwYW5lbENsYXNzOlt7dHlwZTp4eSxhcmdzOlsiY2xhc3MiXX1dLGNsYXNzTGlzdDpbe3R5cGU6eHl9XSxjbG9zZWQ6W3t0eXBlOk95fV0sY2xvc2U6W3t0eXBlOk95fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWFcsW3t0eXBlOkN5fV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1lXXX1dfV19KSx7YmFja2Ryb3BDbGFzczpbe3R5cGU6eHl9XSxjbG9zZWQ6W3t0eXBlOk95fV0sY2xvc2U6W3t0eXBlOk95fV0seFBvc2l0aW9uOlt7dHlwZTp4eX1dLHlQb3NpdGlvbjpbe3R5cGU6eHl9XSxvdmVybGFwVHJpZ2dlcjpbe3R5cGU6eHl9XSxoYXNCYWNrZHJvcDpbe3R5cGU6eHl9XSxwYW5lbENsYXNzOlt7dHlwZTp4eSxhcmdzOlsiY2xhc3MiXX1dLGNsYXNzTGlzdDpbe3R5cGU6eHl9XSxfYWxsSXRlbXM6W3t0eXBlOllhLGFyZ3M6W1dXLHtkZXNjZW5kYW50czohMH1dfV0sYXJpYUxhYmVsOlt7dHlwZTp4eSxhcmdzOlsiYXJpYS1sYWJlbCJdfV0sYXJpYUxhYmVsbGVkYnk6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsbGVkYnkiXX1dLGFyaWFEZXNjcmliZWRieTpbe3R5cGU6eHksYXJnczpbImFyaWEtZGVzY3JpYmVkYnkiXX1dLHRlbXBsYXRlUmVmOlt7dHlwZTpaYSxhcmdzOltYZ119XSxpdGVtczpbe3R5cGU6WWEsYXJnczpbV1cse2Rlc2NlbmRhbnRzOiExfV19XSxsYXp5Q29udGVudDpbe3R5cGU6cWEsYXJnczpbVlddfV19KTtjbGFzcyBLVyBleHRlbmRzIFhXe2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcih0LGUsbiksdGhpcy5fZWxldmF0aW9uUHJlZml4PSJtYXQtZWxldmF0aW9uLXoiLHRoaXMuX2Jhc2VFbGV2YXRpb249NH19S1cuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEtXKShTbShoZyksU20oYV8pLFNtKFlXKSl9LEtXLsm1Y21wPXRvKHt0eXBlOktXLHNlbGVjdG9yczpbWyJtYXQtbWVudSJdXSxob3N0VmFyczozLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZqcCgiYXJpYS1sYWJlbCIsbnVsbCkoImFyaWEtbGFiZWxsZWRieSIsbnVsbCkoImFyaWEtZGVzY3JpYmVkYnkiLG51bGwpfSxleHBvcnRBczpbIm1hdE1lbnUiXSxmZWF0dXJlczpbcGcoW3twcm92aWRlOlVXLHVzZUV4aXN0aW5nOktXfV0pLHhwXSxuZ0NvbnRlbnRTZWxlY3RvcnM6RlcsZGVjbHM6MSx2YXJzOjAsY29uc3RzOltbInRhYmluZGV4IiwiLTEiLCJyb2xlIiwibWVudSIsMSwibWF0LW1lbnUtcGFuZWwiLDMsImlkIiwibmdDbGFzcyIsImtleWRvd24iLCJjbGljayJdLFsxLCJtYXQtbWVudS1jb250ZW50Il1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabSgpLFFwKDAsTFcsMyw2LCJuZy10ZW1wbGF0ZSIpKX0sZGlyZWN0aXZlczpbYU1dLHN0eWxlczpbIm1hdC1tZW51e2Rpc3BsYXk6bm9uZX0ubWF0LW1lbnUtcGFuZWx7bWluLXdpZHRoOjExMnB4O21heC13aWR0aDoyODBweDtvdmVyZmxvdzphdXRvOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNoO21heC1oZWlnaHQ6Y2FsYygxMDB2aCAtIDQ4cHgpO2JvcmRlci1yYWRpdXM6NHB4O291dGxpbmU6MDttaW4taGVpZ2h0OjY0cHh9Lm1hdC1tZW51LXBhbmVsLm5nLWFuaW1hdGluZ3twb2ludGVyLWV2ZW50czpub25lfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1tZW51LXBhbmVse291dGxpbmU6c29saWQgMXB4fS5tYXQtbWVudS1jb250ZW50Om5vdCg6ZW1wdHkpe3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1tZW51LWl0ZW17LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtib3JkZXI6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7bGluZS1oZWlnaHQ6NDhweDtoZWlnaHQ6NDhweDtwYWRkaW5nOjAgMTZweDt0ZXh0LWFsaWduOmxlZnQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7bWF4LXdpZHRoOjEwMCU7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZW51LWl0ZW06Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRde2N1cnNvcjpkZWZhdWx0fVtkaXI9cnRsXSAubWF0LW1lbnUtaXRlbXt0ZXh0LWFsaWduOnJpZ2h0fS5tYXQtbWVudS1pdGVtIC5tYXQtaWNvbnttYXJnaW4tcmlnaHQ6MTZweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Lm1hdC1tZW51LWl0ZW0gLm1hdC1pY29uIHN2Z3t2ZXJ0aWNhbC1hbGlnbjp0b3B9W2Rpcj1ydGxdIC5tYXQtbWVudS1pdGVtIC5tYXQtaWNvbnttYXJnaW4tbGVmdDoxNnB4O21hcmdpbi1yaWdodDowfS5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXXtwb2ludGVyLWV2ZW50czpub25lfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1tZW51LWl0ZW17bWFyZ2luLXRvcDoxcHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW1lbnUtaXRlbS5jZGstcHJvZ3JhbS1mb2N1c2VkLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1tZW51LWl0ZW0uY2RrLWtleWJvYXJkLWZvY3VzZWQsLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZHtvdXRsaW5lOmRvdHRlZCAxcHh9Lm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2Vye3BhZGRpbmctcmlnaHQ6MzJweH1bZGlyPXJ0bF0gLm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2Vye3BhZGRpbmctcmlnaHQ6MTZweDtwYWRkaW5nLWxlZnQ6MzJweH0ubWF0LW1lbnUtc3VibWVudS1pY29ue3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7cmlnaHQ6MTZweDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKTt3aWR0aDo1cHg7aGVpZ2h0OjEwcHg7ZmlsbDpjdXJyZW50Q29sb3J9W2Rpcj1ydGxdIC5tYXQtbWVudS1zdWJtZW51LWljb257cmlnaHQ6YXV0bztsZWZ0OjE2cHg7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSkgc2NhbGVYKC0xKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtbWVudS1zdWJtZW51LWljb257ZmlsbDpDYW52YXNUZXh0fWJ1dHRvbi5tYXQtbWVudS1pdGVte3dpZHRoOjEwMCV9Lm1hdC1tZW51LWl0ZW0gLm1hdC1tZW51LXJpcHBsZXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lfVxuIl0sZW5jYXBzdWxhdGlvbjoyLGRhdGE6e2FuaW1hdGlvbjpbQlcudHJhbnNmb3JtTWVudSxCVy5mYWRlSW5JdGVtc119LGNoYW5nZURldGVjdGlvbjowfSksS1cuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ30se3R5cGU6YV99LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltZV119XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoS1csW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWF0LW1lbnUiLHRlbXBsYXRlOic8bmctdGVtcGxhdGU+XG4gIDxkaXZcbiAgICBjbGFzcz0ibWF0LW1lbnUtcGFuZWwiXG4gICAgW2lkXT0icGFuZWxJZCJcbiAgICBbbmdDbGFzc109Il9jbGFzc0xpc3QiXG4gICAgKGtleWRvd24pPSJfaGFuZGxlS2V5ZG93bigkZXZlbnQpIlxuICAgIChjbGljayk9ImNsb3NlZC5lbWl0KFwnY2xpY2tcJykiXG4gICAgW0B0cmFuc2Zvcm1NZW51XT0iX3BhbmVsQW5pbWF0aW9uU3RhdGUiXG4gICAgKEB0cmFuc2Zvcm1NZW51LnN0YXJ0KT0iX29uQW5pbWF0aW9uU3RhcnQoJGV2ZW50KSJcbiAgICAoQHRyYW5zZm9ybU1lbnUuZG9uZSk9Il9vbkFuaW1hdGlvbkRvbmUoJGV2ZW50KSJcbiAgICB0YWJpbmRleD0iLTEiXG4gICAgcm9sZT0ibWVudSJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT0iYXJpYUxhYmVsIHx8IG51bGwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT0iYXJpYUxhYmVsbGVkYnkgfHwgbnVsbCJcbiAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT0iYXJpYURlc2NyaWJlZGJ5IHx8IG51bGwiPlxuICAgIDxkaXYgY2xhc3M9Im1hdC1tZW51LWNvbnRlbnQiPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4nLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2gsZW5jYXBzdWxhdGlvbjpIbi5Ob25lLGV4cG9ydEFzOiJtYXRNZW51Iixob3N0OnsiW2F0dHIuYXJpYS1sYWJlbF0iOiJudWxsIiwiW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XSI6Im51bGwiLCJbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XSI6Im51bGwifSxhbmltYXRpb25zOltCVy50cmFuc2Zvcm1NZW51LEJXLmZhZGVJbkl0ZW1zXSxwcm92aWRlcnM6W3twcm92aWRlOlVXLHVzZUV4aXN0aW5nOktXfV0sc3R5bGVzOlsibWF0LW1lbnV7ZGlzcGxheTpub25lfS5tYXQtbWVudS1wYW5lbHttaW4td2lkdGg6MTEycHg7bWF4LXdpZHRoOjI4MHB4O292ZXJmbG93OmF1dG87LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gNDhweCk7Ym9yZGVyLXJhZGl1czo0cHg7b3V0bGluZTowO21pbi1oZWlnaHQ6NjRweH0ubWF0LW1lbnUtcGFuZWwubmctYW5pbWF0aW5ne3BvaW50ZXItZXZlbnRzOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW1lbnUtcGFuZWx7b3V0bGluZTpzb2xpZCAxcHh9Lm1hdC1tZW51LWNvbnRlbnQ6bm90KDplbXB0eSl7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LW1lbnUtaXRlbXstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7Y3Vyc29yOnBvaW50ZXI7b3V0bGluZTpub25lO2JvcmRlcjpub25lOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztsaW5lLWhlaWdodDo0OHB4O2hlaWdodDo0OHB4O3BhZGRpbmc6MCAxNnB4O3RleHQtYWxpZ246bGVmdDt0ZXh0LWRlY29yYXRpb246bm9uZTttYXgtd2lkdGg6MTAwJTtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1lbnUtaXRlbTo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF17Y3Vyc29yOmRlZmF1bHR9W2Rpcj1ydGxdIC5tYXQtbWVudS1pdGVte3RleHQtYWxpZ246cmlnaHR9Lm1hdC1tZW51LWl0ZW0gLm1hdC1pY29ue21hcmdpbi1yaWdodDoxNnB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0ubWF0LW1lbnUtaXRlbSAubWF0LWljb24gc3Zne3ZlcnRpY2FsLWFsaWduOnRvcH1bZGlyPXJ0bF0gLm1hdC1tZW51LWl0ZW0gLm1hdC1pY29ue21hcmdpbi1sZWZ0OjE2cHg7bWFyZ2luLXJpZ2h0OjB9Lm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRde3BvaW50ZXItZXZlbnRzOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW1lbnUtaXRlbXttYXJnaW4tdG9wOjFweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtbWVudS1pdGVtLmNkay1wcm9ncmFtLWZvY3VzZWQsLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZCwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtbWVudS1pdGVtLWhpZ2hsaWdodGVke291dGxpbmU6ZG90dGVkIDFweH0ubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXJ7cGFkZGluZy1yaWdodDozMnB4fVtkaXI9cnRsXSAubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXJ7cGFkZGluZy1yaWdodDoxNnB4O3BhZGRpbmctbGVmdDozMnB4fS5tYXQtbWVudS1zdWJtZW51LWljb257cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtyaWdodDoxNnB4O3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpO3dpZHRoOjVweDtoZWlnaHQ6MTBweDtmaWxsOmN1cnJlbnRDb2xvcn1bZGlyPXJ0bF0gLm1hdC1tZW51LXN1Ym1lbnUtaWNvbntyaWdodDphdXRvO2xlZnQ6MTZweDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKSBzY2FsZVgoLTEpfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1tZW51LXN1Ym1lbnUtaWNvbntmaWxsOkNhbnZhc1RleHR9YnV0dG9uLm1hdC1tZW51LWl0ZW17d2lkdGg6MTAwJX0ubWF0LW1lbnUtaXRlbSAubWF0LW1lbnUtcmlwcGxle3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOm5vbmV9XG4iXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1lXXX1dfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IEpXPW5ldyBHYSgibWF0LW1lbnUtc2Nyb2xsLXN0cmF0ZWd5IiksUVc9e3Byb3ZpZGU6SlcsZGVwczpbcExdLHVzZUZhY3Rvcnk6ZnVuY3Rpb24gJFcodCl7cmV0dXJuKCk9PnQuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKCl9fSx0WT1Oeih7cGFzc2l2ZTohMH0pO2NsYXNzIGVZe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIscyl7dGhpcy5fb3ZlcmxheT10LHRoaXMuX2VsZW1lbnQ9ZSx0aGlzLl92aWV3Q29udGFpbmVyUmVmPW4sdGhpcy5fbWVudUl0ZW1JbnN0YW5jZT1hLHRoaXMuX2Rpcj1yLHRoaXMuX2ZvY3VzTW9uaXRvcj1zLHRoaXMuX292ZXJsYXlSZWY9bnVsbCx0aGlzLl9tZW51T3Blbj0hMSx0aGlzLl9jbG9zaW5nQWN0aW9uc1N1YnNjcmlwdGlvbj1tLkVNUFRZLHRoaXMuX2hvdmVyU3Vic2NyaXB0aW9uPW0uRU1QVFksdGhpcy5fbWVudUNsb3NlU3Vic2NyaXB0aW9uPW0uRU1QVFksdGhpcy5faGFuZGxlVG91Y2hTdGFydD10PT57aEkodCl8fCh0aGlzLl9vcGVuZWRCeT0idG91Y2giKX0sdGhpcy5fb3BlbmVkQnk9dm9pZCAwLHRoaXMucmVzdG9yZUZvY3VzPSEwLHRoaXMubWVudU9wZW5lZD1uZXcgTGgsdGhpcy5vbk1lbnVPcGVuPXRoaXMubWVudU9wZW5lZCx0aGlzLm1lbnVDbG9zZWQ9bmV3IExoLHRoaXMub25NZW51Q2xvc2U9dGhpcy5tZW51Q2xvc2VkLHRoaXMuX3Njcm9sbFN0cmF0ZWd5PW8sdGhpcy5fcGFyZW50TWF0ZXJpYWxNZW51PWkgaW5zdGFuY2VvZiBYVz9pOnZvaWQgMCxlLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5faGFuZGxlVG91Y2hTdGFydCx0WSksYSYmKGEuX3RyaWdnZXJzU3VibWVudT10aGlzLnRyaWdnZXJzU3VibWVudSgpKX1nZXQgX2RlcHJlY2F0ZWRNYXRNZW51VHJpZ2dlckZvcigpe3JldHVybiB0aGlzLm1lbnV9c2V0IF9kZXByZWNhdGVkTWF0TWVudVRyaWdnZXJGb3IodCl7dGhpcy5tZW51PXR9Z2V0IG1lbnUoKXtyZXR1cm4gdGhpcy5fbWVudX1zZXQgbWVudSh0KXt0IT09dGhpcy5fbWVudSYmKHRoaXMuX21lbnU9dCx0aGlzLl9tZW51Q2xvc2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0JiYodCE9PXRoaXMuX3BhcmVudE1hdGVyaWFsTWVudXx8InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0Rldk1vZGUmJiFuZ0Rldk1vZGV8fChmdW5jdGlvbiBlKCl7dGhyb3cgRXJyb3IoIm1hdE1lbnVUcmlnZ2VyRm9yOiBtZW51IGNhbm5vdCBjb250YWluIGl0cyBvd24gdHJpZ2dlci4gQXNzaWduIGEgbWVudSB0aGF0IGlzIG5vdCBhIHBhcmVudCBvZiB0aGUgdHJpZ2dlciBvciBtb3ZlIHRoZSB0cmlnZ2VyIG91dHNpZGUgb2YgdGhlIG1lbnUuIil9KSgpLHRoaXMuX21lbnVDbG9zZVN1YnNjcmlwdGlvbj10LmNsb3NlLnN1YnNjcmliZSgodD0+e3RoaXMuX2Rlc3Ryb3lNZW51KHQpLCJjbGljayIhPT10JiYidGFiIiE9PXR8fCF0aGlzLl9wYXJlbnRNYXRlcmlhbE1lbnV8fHRoaXMuX3BhcmVudE1hdGVyaWFsTWVudS5jbG9zZWQuZW1pdCh0KX0pKSkpfW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX2NoZWNrTWVudSgpLHRoaXMuX2hhbmRsZUhvdmVyKCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9vdmVybGF5UmVmJiYodGhpcy5fb3ZlcmxheVJlZi5kaXNwb3NlKCksdGhpcy5fb3ZlcmxheVJlZj1udWxsKSx0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5faGFuZGxlVG91Y2hTdGFydCx0WSksdGhpcy5fbWVudUNsb3NlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5fY2xvc2luZ0FjdGlvbnNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl9ob3ZlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpfWdldCBtZW51T3Blbigpe3JldHVybiB0aGlzLl9tZW51T3Blbn1nZXQgZGlyKCl7cmV0dXJuIHRoaXMuX2RpciYmInJ0bCI9PT10aGlzLl9kaXIudmFsdWU/InJ0bCI6Imx0ciJ9dHJpZ2dlcnNTdWJtZW51KCl7cmV0dXJuISghdGhpcy5fbWVudUl0ZW1JbnN0YW5jZXx8IXRoaXMuX3BhcmVudE1hdGVyaWFsTWVudSl9dG9nZ2xlTWVudSgpe3JldHVybiB0aGlzLl9tZW51T3Blbj90aGlzLmNsb3NlTWVudSgpOnRoaXMub3Blbk1lbnUoKX1vcGVuTWVudSgpe2lmKHRoaXMuX21lbnVPcGVuKXJldHVybjt0aGlzLl9jaGVja01lbnUoKTtjb25zdCB0PXRoaXMuX2NyZWF0ZU92ZXJsYXkoKSxlPXQuZ2V0Q29uZmlnKCk7dGhpcy5fc2V0UG9zaXRpb24oZS5wb3NpdGlvblN0cmF0ZWd5KSxlLmhhc0JhY2tkcm9wPW51bGw9PXRoaXMubWVudS5oYXNCYWNrZHJvcD8hdGhpcy50cmlnZ2Vyc1N1Ym1lbnUoKTp0aGlzLm1lbnUuaGFzQmFja2Ryb3AsdC5hdHRhY2godGhpcy5fZ2V0UG9ydGFsKCkpLHRoaXMubWVudS5sYXp5Q29udGVudCYmdGhpcy5tZW51LmxhenlDb250ZW50LmF0dGFjaCh0aGlzLm1lbnVEYXRhKSx0aGlzLl9jbG9zaW5nQWN0aW9uc1N1YnNjcmlwdGlvbj10aGlzLl9tZW51Q2xvc2luZ0FjdGlvbnMoKS5zdWJzY3JpYmUoKCgpPT50aGlzLmNsb3NlTWVudSgpKSksdGhpcy5faW5pdE1lbnUoKSx0aGlzLm1lbnUgaW5zdGFuY2VvZiBYVyYmdGhpcy5tZW51Ll9zdGFydEFuaW1hdGlvbigpfWNsb3NlTWVudSgpe3RoaXMubWVudS5jbG9zZS5lbWl0KCl9Zm9jdXModCxlKXt0aGlzLl9mb2N1c01vbml0b3ImJnQ/dGhpcy5fZm9jdXNNb25pdG9yLmZvY3VzVmlhKHRoaXMuX2VsZW1lbnQsdCxlKTp0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoZSl9dXBkYXRlUG9zaXRpb24oKXt2YXIgdDtudWxsPT09KHQ9dGhpcy5fb3ZlcmxheVJlZil8fHZvaWQgMD09PXR8fHQudXBkYXRlUG9zaXRpb24oKX1fZGVzdHJveU1lbnUodCl7aWYoIXRoaXMuX292ZXJsYXlSZWZ8fCF0aGlzLm1lbnVPcGVuKXJldHVybjtjb25zdCBlPXRoaXMubWVudTt0aGlzLl9jbG9zaW5nQWN0aW9uc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX292ZXJsYXlSZWYuZGV0YWNoKCksIXRoaXMucmVzdG9yZUZvY3VzfHwia2V5ZG93biIhPT10JiZ0aGlzLl9vcGVuZWRCeSYmdGhpcy50cmlnZ2Vyc1N1Ym1lbnUoKXx8dGhpcy5mb2N1cyh0aGlzLl9vcGVuZWRCeSksdGhpcy5fb3BlbmVkQnk9dm9pZCAwLGUgaW5zdGFuY2VvZiBYVz8oZS5fcmVzZXRBbmltYXRpb24oKSxlLmxhenlDb250ZW50P2UuX2FuaW1hdGlvbkRvbmUucGlwZShjZSgodD0+InZvaWQiPT09dC50b1N0YXRlKSksYmUoMSksSWUoZS5sYXp5Q29udGVudC5fYXR0YWNoZWQpKS5zdWJzY3JpYmUoe25leHQ6KCk9PmUubGF6eUNvbnRlbnQuZGV0YWNoKCksY29tcGxldGU6KCk9PnRoaXMuX3NldElzTWVudU9wZW4oITEpfSk6dGhpcy5fc2V0SXNNZW51T3BlbighMSkpOih0aGlzLl9zZXRJc01lbnVPcGVuKCExKSxlLmxhenlDb250ZW50JiZlLmxhenlDb250ZW50LmRldGFjaCgpKX1faW5pdE1lbnUoKXt0aGlzLm1lbnUucGFyZW50TWVudT10aGlzLnRyaWdnZXJzU3VibWVudSgpP3RoaXMuX3BhcmVudE1hdGVyaWFsTWVudTp2b2lkIDAsdGhpcy5tZW51LmRpcmVjdGlvbj10aGlzLmRpcix0aGlzLl9zZXRNZW51RWxldmF0aW9uKCksdGhpcy5tZW51LmZvY3VzRmlyc3RJdGVtKHRoaXMuX29wZW5lZEJ5fHwicHJvZ3JhbSIpLHRoaXMuX3NldElzTWVudU9wZW4oITApfV9zZXRNZW51RWxldmF0aW9uKCl7aWYodGhpcy5tZW51LnNldEVsZXZhdGlvbil7bGV0IHQ9MCxlPXRoaXMubWVudS5wYXJlbnRNZW51O2Zvcig7ZTspdCsrLGU9ZS5wYXJlbnRNZW51O3RoaXMubWVudS5zZXRFbGV2YXRpb24odCl9fV9zZXRJc01lbnVPcGVuKHQpe3RoaXMuX21lbnVPcGVuPXQsdGhpcy5fbWVudU9wZW4/dGhpcy5tZW51T3BlbmVkLmVtaXQoKTp0aGlzLm1lbnVDbG9zZWQuZW1pdCgpLHRoaXMudHJpZ2dlcnNTdWJtZW51KCkmJnRoaXMuX21lbnVJdGVtSW5zdGFuY2UuX3NldEhpZ2hsaWdodGVkKHQpfV9jaGVja01lbnUoKXt0aGlzLm1lbnV8fCJ1bmRlZmluZWQiIT10eXBlb2YgbmdEZXZNb2RlJiYhbmdEZXZNb2RlfHwoCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiB0KCl7dGhyb3cgRXJyb3IoJ21hdE1lbnVUcmlnZ2VyRm9yOiBtdXN0IHBhc3MgaW4gYW4gbWF0LW1lbnUgaW5zdGFuY2UuXG5cbiAgICBFeGFtcGxlOlxuICAgICAgPG1hdC1tZW51ICNtZW51PSJtYXRNZW51Ij48L21hdC1tZW51PlxuICAgICAgPGJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPSJtZW51Ij48L2J1dHRvbj4nKX0pKCl9X2NyZWF0ZU92ZXJsYXkoKXtpZighdGhpcy5fb3ZlcmxheVJlZil7Y29uc3QgdD10aGlzLl9nZXRPdmVybGF5Q29uZmlnKCk7dGhpcy5fc3Vic2NyaWJlVG9Qb3NpdGlvbnModC5wb3NpdGlvblN0cmF0ZWd5KSx0aGlzLl9vdmVybGF5UmVmPXRoaXMuX292ZXJsYXkuY3JlYXRlKHQpLHRoaXMuX292ZXJsYXlSZWYua2V5ZG93bkV2ZW50cygpLnN1YnNjcmliZSgpfXJldHVybiB0aGlzLl9vdmVybGF5UmVmfV9nZXRPdmVybGF5Q29uZmlnKCl7cmV0dXJuIG5ldyBWRih7cG9zaXRpb25TdHJhdGVneTp0aGlzLl9vdmVybGF5LnBvc2l0aW9uKCkuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLl9lbGVtZW50KS53aXRoTG9ja2VkUG9zaXRpb24oKS53aXRoR3Jvd0FmdGVyT3BlbigpLndpdGhUcmFuc2Zvcm1PcmlnaW5PbigiLm1hdC1tZW51LXBhbmVsLCAubWF0LW1kYy1tZW51LXBhbmVsIiksYmFja2Ryb3BDbGFzczp0aGlzLm1lbnUuYmFja2Ryb3BDbGFzc3x8ImNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wIixwYW5lbENsYXNzOnRoaXMubWVudS5vdmVybGF5UGFuZWxDbGFzcyxzY3JvbGxTdHJhdGVneTp0aGlzLl9zY3JvbGxTdHJhdGVneSgpLGRpcmVjdGlvbjp0aGlzLl9kaXJ9KX1fc3Vic2NyaWJlVG9Qb3NpdGlvbnModCl7dGhpcy5tZW51LnNldFBvc2l0aW9uQ2xhc3NlcyYmdC5wb3NpdGlvbkNoYW5nZXMuc3Vic2NyaWJlKCh0PT57dGhpcy5tZW51LnNldFBvc2l0aW9uQ2xhc3Nlcygic3RhcnQiPT09dC5jb25uZWN0aW9uUGFpci5vdmVybGF5WD8iYWZ0ZXIiOiJiZWZvcmUiLCJ0b3AiPT09dC5jb25uZWN0aW9uUGFpci5vdmVybGF5WT8iYmVsb3ciOiJhYm92ZSIpfSkpfV9zZXRQb3NpdGlvbih0KXtsZXRbZSxuXT0iYmVmb3JlIj09PXRoaXMubWVudS54UG9zaXRpb24/WyJlbmQiLCJzdGFydCJdOlsic3RhcnQiLCJlbmQiXSxbbyxpXT0iYWJvdmUiPT09dGhpcy5tZW51LnlQb3NpdGlvbj9bImJvdHRvbSIsInRvcCJdOlsidG9wIiwiYm90dG9tIl0sW2Escl09W28saV0sW3MsbF09W2Usbl0sYz0wO3RoaXMudHJpZ2dlcnNTdWJtZW51KCk/KGw9ZT0iYmVmb3JlIj09PXRoaXMubWVudS54UG9zaXRpb24/InN0YXJ0IjoiZW5kIixuPXM9ImVuZCI9PT1lPyJzdGFydCI6ImVuZCIsYz0iYm90dG9tIj09PW8/ODotOCk6dGhpcy5tZW51Lm92ZXJsYXBUcmlnZ2VyfHwoYT0idG9wIj09PW8/ImJvdHRvbSI6InRvcCIscj0idG9wIj09PWk/ImJvdHRvbSI6InRvcCIpLHQud2l0aFBvc2l0aW9ucyhbe29yaWdpblg6ZSxvcmlnaW5ZOmEsb3ZlcmxheVg6cyxvdmVybGF5WTpvLG9mZnNldFk6Y30se29yaWdpblg6bixvcmlnaW5ZOmEsb3ZlcmxheVg6bCxvdmVybGF5WTpvLG9mZnNldFk6Y30se29yaWdpblg6ZSxvcmlnaW5ZOnIsb3ZlcmxheVg6cyxvdmVybGF5WTppLG9mZnNldFk6LWN9LHtvcmlnaW5YOm4sb3JpZ2luWTpyLG92ZXJsYXlYOmwsb3ZlcmxheVk6aSxvZmZzZXRZOi1jfV0pfV9tZW51Q2xvc2luZ0FjdGlvbnMoKXtjb25zdCB0PXRoaXMuX292ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLGU9dGhpcy5fb3ZlcmxheVJlZi5kZXRhY2htZW50cygpO3JldHVybiByZSh0LHRoaXMuX3BhcmVudE1hdGVyaWFsTWVudT90aGlzLl9wYXJlbnRNYXRlcmlhbE1lbnUuY2xvc2VkOkV0KCksdGhpcy5fcGFyZW50TWF0ZXJpYWxNZW51P3RoaXMuX3BhcmVudE1hdGVyaWFsTWVudS5faG92ZXJlZCgpLnBpcGUoY2UoKHQ9PnQhPT10aGlzLl9tZW51SXRlbUluc3RhbmNlKSksY2UoKCgpPT50aGlzLl9tZW51T3BlbikpKTpFdCgpLGUpfV9oYW5kbGVNb3VzZWRvd24odCl7Z0kodCl8fCh0aGlzLl9vcGVuZWRCeT0wPT09dC5idXR0b24/Im1vdXNlIjp2b2lkIDAsdGhpcy50cmlnZ2Vyc1N1Ym1lbnUoKSYmdC5wcmV2ZW50RGVmYXVsdCgpKX1faGFuZGxlS2V5ZG93bih0KXtjb25zdCBlPXQua2V5Q29kZTtlIT09bXomJmUhPT1menx8KHRoaXMuX29wZW5lZEJ5PSJrZXlib2FyZCIpLHRoaXMudHJpZ2dlcnNTdWJtZW51KCkmJigzOT09PWUmJiJsdHIiPT09dGhpcy5kaXJ8fDM3PT09ZSYmInJ0bCI9PT10aGlzLmRpcikmJih0aGlzLl9vcGVuZWRCeT0ia2V5Ym9hcmQiLHRoaXMub3Blbk1lbnUoKSl9X2hhbmRsZUNsaWNrKHQpe3RoaXMudHJpZ2dlcnNTdWJtZW51KCk/KHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5vcGVuTWVudSgpKTp0aGlzLnRvZ2dsZU1lbnUoKX1faGFuZGxlSG92ZXIoKXt0aGlzLnRyaWdnZXJzU3VibWVudSgpJiZ0aGlzLl9wYXJlbnRNYXRlcmlhbE1lbnUmJih0aGlzLl9ob3ZlclN1YnNjcmlwdGlvbj10aGlzLl9wYXJlbnRNYXRlcmlhbE1lbnUuX2hvdmVyZWQoKS5waXBlKGNlKCh0PT50PT09dGhpcy5fbWVudUl0ZW1JbnN0YW5jZSYmIXQuZGlzYWJsZWQpKSxDZSgwLCQpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fb3BlbmVkQnk9Im1vdXNlIix0aGlzLm1lbnUgaW5zdGFuY2VvZiBYVyYmdGhpcy5tZW51Ll9pc0FuaW1hdGluZz90aGlzLm1lbnUuX2FuaW1hdGlvbkRvbmUucGlwZShiZSgxKSxDZSgwLCQpLEllKHRoaXMuX3BhcmVudE1hdGVyaWFsTWVudS5faG92ZXJlZCgpKSkuc3Vic2NyaWJlKCgoKT0+dGhpcy5vcGVuTWVudSgpKSk6dGhpcy5vcGVuTWVudSgpfSkpKX1fZ2V0UG9ydGFsKCl7cmV0dXJuIHRoaXMuX3BvcnRhbCYmdGhpcy5fcG9ydGFsLnRlbXBsYXRlUmVmPT09dGhpcy5tZW51LnRlbXBsYXRlUmVmfHwodGhpcy5fcG9ydGFsPW5ldyB4Rih0aGlzLm1lbnUudGVtcGxhdGVSZWYsdGhpcy5fdmlld0NvbnRhaW5lclJlZikpLHRoaXMuX3BvcnRhbH19ZVkuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGVZKShTbShwTCksU20oaGcpLFNtKGVoKSxTbShKVyksU20oVVcsOCksU20oV1csMTApLFNtKEhJLDgpLFNtKFNJKSl9LGVZLsm1ZGlyPWxvKHt0eXBlOmVZLHNlbGVjdG9yczpbWyIiLCJtYXQtbWVudS10cmlnZ2VyLWZvciIsIiJdLFsiIiwibWF0TWVudVRyaWdnZXJGb3IiLCIiXV0saG9zdEF0dHJzOlsiYXJpYS1oYXNwb3B1cCIsInRydWUiLDEsIm1hdC1tZW51LXRyaWdnZXIiXSxob3N0VmFyczoyLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgibW91c2Vkb3duIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5faGFuZGxlTW91c2Vkb3duKGUpfSkpKCJrZXlkb3duIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5faGFuZGxlS2V5ZG93bihlKX0pKSgiY2xpY2siLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9oYW5kbGVDbGljayhlKX0pKSwyJmUmJmpwKCJhcmlhLWV4cGFuZGVkIixuLm1lbnVPcGVufHxudWxsKSgiYXJpYS1jb250cm9scyIsbi5tZW51T3Blbj9uLm1lbnUucGFuZWxJZDpudWxsKX0saW5wdXRzOntyZXN0b3JlRm9jdXM6WyJtYXRNZW51VHJpZ2dlclJlc3RvcmVGb2N1cyIsInJlc3RvcmVGb2N1cyJdLF9kZXByZWNhdGVkTWF0TWVudVRyaWdnZXJGb3I6WyJtYXQtbWVudS10cmlnZ2VyLWZvciIsIl9kZXByZWNhdGVkTWF0TWVudVRyaWdnZXJGb3IiXSxtZW51OlsibWF0TWVudVRyaWdnZXJGb3IiLCJtZW51Il0sbWVudURhdGE6WyJtYXRNZW51VHJpZ2dlckRhdGEiLCJtZW51RGF0YSJdfSxvdXRwdXRzOnttZW51T3BlbmVkOiJtZW51T3BlbmVkIixvbk1lbnVPcGVuOiJvbk1lbnVPcGVuIixtZW51Q2xvc2VkOiJtZW51Q2xvc2VkIixvbk1lbnVDbG9zZToib25NZW51Q2xvc2UifSxleHBvcnRBczpbIm1hdE1lbnVUcmlnZ2VyIl19KSxlWS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnBMfSx7dHlwZTpoZ30se3R5cGU6ZWh9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltKV119XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1VXXX0se3R5cGU6U3J9XX0se3R5cGU6V1csZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOkRyfV19LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOlNJfV0sZVkucHJvcERlY29yYXRvcnM9e19kZXByZWNhdGVkTWF0TWVudVRyaWdnZXJGb3I6W3t0eXBlOnh5LGFyZ3M6WyJtYXQtbWVudS10cmlnZ2VyLWZvciJdfV0sbWVudTpbe3R5cGU6eHksYXJnczpbIm1hdE1lbnVUcmlnZ2VyRm9yIl19XSxtZW51RGF0YTpbe3R5cGU6eHksYXJnczpbIm1hdE1lbnVUcmlnZ2VyRGF0YSJdfV0scmVzdG9yZUZvY3VzOlt7dHlwZTp4eSxhcmdzOlsibWF0TWVudVRyaWdnZXJSZXN0b3JlRm9jdXMiXX1dLG1lbnVPcGVuZWQ6W3t0eXBlOk95fV0sb25NZW51T3Blbjpbe3R5cGU6T3l9XSxtZW51Q2xvc2VkOlt7dHlwZTpPeX1dLG9uTWVudUNsb3NlOlt7dHlwZTpPeX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGVZLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IlttYXQtbWVudS10cmlnZ2VyLWZvcl0sIFttYXRNZW51VHJpZ2dlckZvcl0iLGhvc3Q6e2NsYXNzOiJtYXQtbWVudS10cmlnZ2VyIiwiYXJpYS1oYXNwb3B1cCI6InRydWUiLCJbYXR0ci5hcmlhLWV4cGFuZGVkXSI6Im1lbnVPcGVuIHx8IG51bGwiLCJbYXR0ci5hcmlhLWNvbnRyb2xzXSI6Im1lbnVPcGVuID8gbWVudS5wYW5lbElkIDogbnVsbCIsIihtb3VzZWRvd24pIjoiX2hhbmRsZU1vdXNlZG93bigkZXZlbnQpIiwiKGtleWRvd24pIjoiX2hhbmRsZUtleWRvd24oJGV2ZW50KSIsIihjbGljaykiOiJfaGFuZGxlQ2xpY2soJGV2ZW50KSJ9LGV4cG9ydEFzOiJtYXRNZW51VHJpZ2dlciJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpwTH0se3R5cGU6aGd9LHt0eXBlOmVofSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbSlddfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltVV119LHt0eXBlOlNyfV19LHt0eXBlOldXLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn1dfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpTSX1dfSkse3Jlc3RvcmVGb2N1czpbe3R5cGU6eHksYXJnczpbIm1hdE1lbnVUcmlnZ2VyUmVzdG9yZUZvY3VzIl19XSxtZW51T3BlbmVkOlt7dHlwZTpPeX1dLG9uTWVudU9wZW46W3t0eXBlOk95fV0sbWVudUNsb3NlZDpbe3R5cGU6T3l9XSxvbk1lbnVDbG9zZTpbe3R5cGU6T3l9XSxfZGVwcmVjYXRlZE1hdE1lbnVUcmlnZ2VyRm9yOlt7dHlwZTp4eSxhcmdzOlsibWF0LW1lbnUtdHJpZ2dlci1mb3IiXX1dLG1lbnU6W3t0eXBlOnh5LGFyZ3M6WyJtYXRNZW51VHJpZ2dlckZvciJdfV0sbWVudURhdGE6W3t0eXBlOnh5LGFyZ3M6WyJtYXRNZW51VHJpZ2dlckRhdGEiXX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBuWXt9blkuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fG5ZKX0sblkuybVtb2Q9YW8oe3R5cGU6bll9KSxuWS7JtWluaj12bih7cHJvdmlkZXJzOltRV10saW1wb3J0czpbWEldfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChuWSxbe3R5cGU6QXksYXJnczpbe2V4cG9ydHM6W2VZLGpXLFhJXSxkZWNsYXJhdGlvbnM6W2VZLGpXXSxwcm92aWRlcnM6W1FXXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKG5ZLHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bZVksalddfSxleHBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW2VZLGpXLFhJXX19KTtjbGFzcyBvWXt9ZnVuY3Rpb24gaVkodCxlKXsxJnQmJlRtKDAsIm1hdC1pY29uIiw4KX1mdW5jdGlvbiBhWSh0LGUpezEmdCYmVG0oMCwibWF0LWljb24iLDkpfWZ1bmN0aW9uIHJZKHQsZSl7MSZ0JiZUbSgwLCJtYXQtaWNvbiIsMTApfXZhciBzWTtvWS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8b1kpfSxvWS7JtW1vZD1hbyh7dHlwZTpvWX0pLG9ZLsm1aW5qPXZuKHtwcm92aWRlcnM6W1FXXSxpbXBvcnRzOltbV00sWEksU0gseUwsblldLHlGLFhJLG5ZXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgob1ksW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltXTSxYSSxTSCx5TCxuWV0sZXhwb3J0czpbeUYsWEksS1csV1csblldLGRlY2xhcmF0aW9uczpbS1csV1ddLHByb3ZpZGVyczpbUVddfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8ob1kse2RlY2xhcmF0aW9uczpmdW5jdGlvbigpe3JldHVybltLVyxXV119LGltcG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bV00sWEksU0gseUwsblldfSxleHBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW3lGLFhJLEtXLFdXLG5ZXX19KSwoZnVuY3Rpb24odCl7dFt0LkRFRkFVTFQ9MF09IkRFRkFVTFQiLHRbdC5EQVJLX01PREVfT049MV09IkRBUktfTU9ERV9PTiIsdFt0LkRBUktfTU9ERV9PRkY9Ml09IkRBUktfTU9ERV9PRkYifSkoc1l8fChzWT17fSkpO2NsYXNzIGxZe2NvbnN0cnVjdG9yKCl7dGhpcy5EYXJrTW9kZU92ZXJyaWRlPXNZLHRoaXMub25PdmVycmlkZUNoYW5nZWQ9bmV3IExofWdldEJ1dHRvblRpdGxlKCl7bGV0IHQ7c3dpdGNoKHRoaXMuZGFya01vZGVPdmVycmlkZSl7Y2FzZSBzWS5ERUZBVUxUOnQ9IkJyb3dzZXIgZGVmYXVsdCI7YnJlYWs7Y2FzZSBzWS5EQVJLX01PREVfT046dD0iRGFyayBtb2RlIjticmVhaztjYXNlIHNZLkRBUktfTU9ERV9PRkY6dD0iTGlnaHQgbW9kZSJ9cmV0dXJuYEN1cnJlbnQgbW9kZTogWyR7dH1dLiBTd2l0Y2ggYmV0d2VlbiBicm93c2VyIGRlZmF1bHQsIGxpZ2h0LCBvciBkYXJrIHRoZW1lLmB9fWxZLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxsWSl9LGxZLsm1Y21wPXRvKHt0eXBlOmxZLHNlbGVjdG9yczpbWyJhcHAtaGVhZGVyLWRhcmstbW9kZS10b2dnbGUtY29tcG9uZW50Il1dLGlucHV0czp7ZGFya01vZGVPdmVycmlkZToiZGFya01vZGVPdmVycmlkZSJ9LG91dHB1dHM6e29uT3ZlcnJpZGVDaGFuZ2VkOiJvbk92ZXJyaWRlQ2hhbmdlZCJ9LGRlY2xzOjE1LHZhcnM6Nixjb25zdHM6W1sibWF0LWljb24tYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsIk1lbnUgZm9yIGNoYW5naW5nIGxpZ2h0IG9yIGRhcmsgdGhlbWUiLDMsIm1hdE1lbnVUcmlnZ2VyRm9yIiwibmdTd2l0Y2giLCJ0aXRsZSJdLFsic3ZnSWNvbiIsImJyaWdodG5lc3NfNl8yNHB4Iiw0LCJuZ1N3aXRjaENhc2UiXSxbInN2Z0ljb24iLCJsaWdodF9tb2RlXzI0cHgiLDQsIm5nU3dpdGNoQ2FzZSJdLFsic3ZnSWNvbiIsImRhcmtfbW9kZV8yNHB4Iiw0LCJuZ1N3aXRjaENhc2UiXSxbIm1lbnUiLCJtYXRNZW51Il0sWyJtYXQtbWVudS1pdGVtIiwiIiwidGl0bGUiLCJTZXQgdGhlIHRoZW1lIHRvIG1hdGNoIHRoZSBkZWZhdWx0IG1vZGUgaW4gdGhlIGJyb3dzZXIuIiwzLCJjbGljayJdLFsibWF0LW1lbnUtaXRlbSIsIiIsInRpdGxlIiwiRm9yY2UgbGlnaHQgVGVuc29yQm9hcmQgdGhlbWUuIiwzLCJjbGljayJdLFsibWF0LW1lbnUtaXRlbSIsIiIsInRpdGxlIiwiRm9yY2UgZGFyayBUZW5zb3JCb2FyZCB0aGVtZS4iLDMsImNsaWNrIl0sWyJzdmdJY29uIiwiYnJpZ2h0bmVzc182XzI0cHgiXSxbInN2Z0ljb24iLCJsaWdodF9tb2RlXzI0cHgiXSxbInN2Z0ljb24iLCJkYXJrX21vZGVfMjRweCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiYnV0dG9uIiwwKSxRcCgxLGlZLDEsMCwibWF0LWljb24iLDEpLFFwKDIsYVksMSwwLCJtYXQtaWNvbiIsMiksUXAoMyxyWSwxLDAsIm1hdC1pY29uIiwzKSxBbSgpLFJtKDQsIm1hdC1tZW51IixudWxsLDQpLFJtKDYsImJ1dHRvbiIsNSksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uT3ZlcnJpZGVDaGFuZ2VkLmVtaXQobi5EYXJrTW9kZU92ZXJyaWRlLkRFRkFVTFQpfSkpLFJtKDcsImxhYmVsIiksa3UoOCwiQnJvd3NlciBkZWZhdWx0IiksQW0oKSxBbSgpLFJtKDksImJ1dHRvbiIsNiksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uT3ZlcnJpZGVDaGFuZ2VkLmVtaXQobi5EYXJrTW9kZU92ZXJyaWRlLkRBUktfTU9ERV9PRkYpfSkpLFJtKDEwLCJsYWJlbCIpLGt1KDExLCJMaWdodCIpLEFtKCksQW0oKSxSbSgxMiwiYnV0dG9uIiw3KSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25PdmVycmlkZUNoYW5nZWQuZW1pdChuLkRhcmtNb2RlT3ZlcnJpZGUuREFSS19NT0RFX09OKX0pKSxSbSgxMywibGFiZWwiKSxrdSgxNCwiRGFyayIpLEFtKCksQW0oKSxBbSgpKSwyJmUmJihEbSgibWF0TWVudVRyaWdnZXJGb3IiLCRwKDUpKSgibmdTd2l0Y2giLG4uZGFya01vZGVPdmVycmlkZSkoInRpdGxlIixuLmdldEJ1dHRvblRpdGxlKCkpLHJjKDEpLERtKCJuZ1N3aXRjaENhc2UiLG4uRGFya01vZGVPdmVycmlkZS5ERUZBVUxUKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIixuLkRhcmtNb2RlT3ZlcnJpZGUuREFSS19NT0RFX09GRikscmMoMSksRG0oIm5nU3dpdGNoQ2FzZSIsbi5EYXJrTW9kZU92ZXJyaWRlLkRBUktfTU9ERV9PTikpfSxkaXJlY3RpdmVzOltYSCxlWSxmTSxnTSxLVyxXVyxEV10sZW5jYXBzdWxhdGlvbjoyfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChsWSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJhcHAtaGVhZGVyLWRhcmstbW9kZS10b2dnbGUtY29tcG9uZW50Iix0ZW1wbGF0ZTonXG4gICAgPGJ1dHRvblxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPSJtZW51IlxuICAgICAgYXJpYS1sYWJlbD0iTWVudSBmb3IgY2hhbmdpbmcgbGlnaHQgb3IgZGFyayB0aGVtZSJcbiAgICAgIFtuZ1N3aXRjaF09ImRhcmtNb2RlT3ZlcnJpZGUiXG4gICAgICBbdGl0bGVdPSJnZXRCdXR0b25UaXRsZSgpIlxuICAgID5cbiAgICAgIDxtYXQtaWNvblxuICAgICAgICAqbmdTd2l0Y2hDYXNlPSJEYXJrTW9kZU92ZXJyaWRlLkRFRkFVTFQiXG4gICAgICAgIHN2Z0ljb249ImJyaWdodG5lc3NfNl8yNHB4IlxuICAgICAgPjwvbWF0LWljb24+XG4gICAgICA8bWF0LWljb25cbiAgICAgICAgKm5nU3dpdGNoQ2FzZT0iRGFya01vZGVPdmVycmlkZS5EQVJLX01PREVfT0ZGIlxuICAgICAgICBzdmdJY29uPSJsaWdodF9tb2RlXzI0cHgiXG4gICAgICA+PC9tYXQtaWNvbj5cbiAgICAgIDxtYXQtaWNvblxuICAgICAgICAqbmdTd2l0Y2hDYXNlPSJEYXJrTW9kZU92ZXJyaWRlLkRBUktfTU9ERV9PTiJcbiAgICAgICAgc3ZnSWNvbj0iZGFya19tb2RlXzI0cHgiXG4gICAgICA+PC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8bWF0LW1lbnUgI21lbnU9Im1hdE1lbnUiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgIHRpdGxlPSJTZXQgdGhlIHRoZW1lIHRvIG1hdGNoIHRoZSBkZWZhdWx0IG1vZGUgaW4gdGhlIGJyb3dzZXIuIlxuICAgICAgICAoY2xpY2spPSJvbk92ZXJyaWRlQ2hhbmdlZC5lbWl0KERhcmtNb2RlT3ZlcnJpZGUuREVGQVVMVCkiXG4gICAgICA+XG4gICAgICAgIDxsYWJlbD5Ccm93c2VyIGRlZmF1bHQ8L2xhYmVsPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgdGl0bGU9IkZvcmNlIGxpZ2h0IFRlbnNvckJvYXJkIHRoZW1lLiJcbiAgICAgICAgKGNsaWNrKT0ib25PdmVycmlkZUNoYW5nZWQuZW1pdChEYXJrTW9kZU92ZXJyaWRlLkRBUktfTU9ERV9PRkYpIlxuICAgICAgPlxuICAgICAgICA8bGFiZWw+TGlnaHQ8L2xhYmVsPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgdGl0bGU9IkZvcmNlIGRhcmsgVGVuc29yQm9hcmQgdGhlbWUuIlxuICAgICAgICAoY2xpY2spPSJvbk92ZXJyaWRlQ2hhbmdlZC5lbWl0KERhcmtNb2RlT3ZlcnJpZGUuREFSS19NT0RFX09OKSJcbiAgICAgID5cbiAgICAgICAgPGxhYmVsPkRhcms8L2xhYmVsPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9tYXQtbWVudT5cbiAgJ31dfV0sbnVsbCx7ZGFya01vZGVPdmVycmlkZTpbe3R5cGU6eHl9XSxvbk92ZXJyaWRlQ2hhbmdlZDpbe3R5cGU6T3l9XX0pO2NsYXNzIGNZe2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLmRhcmtNb2RlT3ZlcnJpZGUkPXRoaXMuc3RvcmUuc2VsZWN0KFFEKS5waXBlKEl0KCh0PT5udWxsPT09dD9zWS5ERUZBVUxUOnQ/c1kuREFSS19NT0RFX09OOnNZLkRBUktfTU9ERV9PRkYpKSl9Y2hhbmdlRGFya01vZGUodCl7bGV0IGU9bnVsbDtzd2l0Y2godCl7Y2FzZSBzWS5ERUZBVUxUOmU9bnVsbDticmVhaztjYXNlIHNZLkRBUktfTU9ERV9PRkY6ZT0hMTticmVhaztjYXNlIHNZLkRBUktfTU9ERV9PTjplPSEwfXRoaXMuc3RvcmUuZGlzcGF0Y2goV0Eoe2VuYWJsZURhcmtNb2RlOmV9KSl9fWNZLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxjWSkoU20oSXcpKX0sY1kuybVjbXA9dG8oe3R5cGU6Y1ksc2VsZWN0b3JzOltbImFwcC1oZWFkZXItZGFyay1tb2RlLXRvZ2dsZSJdXSxkZWNsczoyLHZhcnM6Myxjb25zdHM6W1szLCJkYXJrTW9kZU92ZXJyaWRlIiwib25PdmVycmlkZUNoYW5nZWQiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImFwcC1oZWFkZXItZGFyay1tb2RlLXRvZ2dsZS1jb21wb25lbnQiLDApLFZtKCJvbk92ZXJyaWRlQ2hhbmdlZCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uY2hhbmdlRGFya01vZGUoZSl9KSksQWgoMSwiYXN5bmMiKSxBbSgpKSwyJmUmJkRtKCJkYXJrTW9kZU92ZXJyaWRlIixUaCgxLDEsbi5kYXJrTW9kZU92ZXJyaWRlJCkpfSxkaXJlY3RpdmVzOltsWV0scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGNZLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImFwcC1oZWFkZXItZGFyay1tb2RlLXRvZ2dsZSIsdGVtcGxhdGU6J1xuICAgIDxhcHAtaGVhZGVyLWRhcmstbW9kZS10b2dnbGUtY29tcG9uZW50XG4gICAgICBbZGFya01vZGVPdmVycmlkZV09ImRhcmtNb2RlT3ZlcnJpZGUkIHwgYXN5bmMiXG4gICAgICAob25PdmVycmlkZUNoYW5nZWQpPSJjaGFuZ2VEYXJrTW9kZSgkZXZlbnQpIlxuICAgID5cbiAgICA8L2FwcC1oZWFkZXItZGFyay1tb2RlLXRvZ2dsZS1jb21wb25lbnQ+XG4gICd9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y29uc3QgZFk9WncodlIsTVIsKCh0LGUpPT4hKCFlfHwhdFtlXSkmJnRbZV0uZGlzYWJsZV9yZWxvYWQpKTtjbGFzcyBwWXtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5yZWxvYWREaXNhYmxlZCQ9dGhpcy5zdG9yZS5zZWxlY3QoZFkpLHRoaXMuaXNSZWxvYWRpbmckPXRoaXMuc3RvcmUuc2VsZWN0KF9SKS5waXBlKGZlKHRoaXMucmVsb2FkRGlzYWJsZWQkKSxJdCgoKFt0LGVdKT0+IWUmJnQ9PT15RS5MT0FESU5HKSkpLHRoaXMubGFzdExvYWRlZFRpbWVJbk1zJD10aGlzLnN0b3JlLnNlbGVjdChDUil9dHJpZ2dlclJlbG9hZCgpe3RoaXMuc3RvcmUuZGlzcGF0Y2godkUoKSl9Z2V0UmVsb2FkVGl0bGUodCl7cmV0dXJuIHQ/YExhc3QgVXBkYXRlZDogJHt0fWA6IkxvYWRpbmcuLi4ifX1mdW5jdGlvbiBtWSh0KXtyZXR1cm4gdC5zdGF0ZSE9PXlFLk5PVF9MT0FERUQmJnQuc3RhdGUhPT15RS5MT0FESU5HfXBZLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxwWSkoU20oSXcpKX0scFkuybVjbXA9dG8oe3R5cGU6cFksc2VsZWN0b3JzOltbImFwcC1oZWFkZXItcmVsb2FkIl1dLGRlY2xzOjYsdmFyczoxMyxjb25zdHM6W1sibWF0LWljb24tYnV0dG9uIiwiIiwxLCJyZWxvYWQtYnV0dG9uIiwzLCJ0aXRsZSIsImRpc2FibGVkIiwiY2xpY2siXSxbInN2Z0ljb24iLCJyZWZyZXNoXzI0cHgiLDEsInJlZnJlc2gtaWNvbiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiYnV0dG9uIiwwKSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4udHJpZ2dlclJlbG9hZCgpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiZGF0ZSIpLEFoKDMsImFzeW5jIiksQWgoNCwiYXN5bmMiKSxUbSg1LCJtYXQtaWNvbiIsMSksQW0oKSksMiZlJiYocHUoImxvYWRpbmciLFRoKDEsNCxuLmlzUmVsb2FkaW5nJCkpLERtKCJ0aXRsZSIsbi5nZXRSZWxvYWRUaXRsZShOaCgyLDYsVGgoMyw5LG4ubGFzdExvYWRlZFRpbWVJbk1zJCksIm1lZGl1bSIpKSkoImRpc2FibGVkIixUaCg0LDExLG4ucmVsb2FkRGlzYWJsZWQkKSkpfSxkaXJlY3RpdmVzOltYSCxEV10scGlwZXM6W3dNLFJNXSxzdHlsZXM6WyIucmVsb2FkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5yZWZyZXNoLWljb25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgIC5yZWxvYWQtYnV0dG9uLmxvYWRpbmdbX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgYW5pbWF0aW9uOiByb3RhdGUgMnMgbGluZWFyIGluZmluaXRlO1xuICAgICAgfVxuXG4gICAgICBAa2V5ZnJhbWVzIHJvdGF0ZSB7XG4gICAgICAgIDAlIHtcbiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcbiAgICAgICAgfVxuICAgICAgICA1MCUge1xuICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XG4gICAgICAgIH1cbiAgICAgICAgMTAwJSB7XG4gICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgICAgICAgfVxuICAgICAgfSJdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChwWSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJhcHAtaGVhZGVyLXJlbG9hZCIsdGVtcGxhdGU6J1xuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPSJyZWxvYWQtYnV0dG9uIlxuICAgICAgW2NsYXNzLmxvYWRpbmddPSJpc1JlbG9hZGluZyQgfCBhc3luYyJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgKGNsaWNrKT0idHJpZ2dlclJlbG9hZCgpIlxuICAgICAgW3RpdGxlXT0iZ2V0UmVsb2FkVGl0bGUobGFzdExvYWRlZFRpbWVJbk1zJCB8IGFzeW5jIHwgZGF0ZTogXCdtZWRpdW1cJykiXG4gICAgICBbZGlzYWJsZWRdPSJyZWxvYWREaXNhYmxlZCQgfCBhc3luYyJcbiAgICA+XG4gICAgICA8bWF0LWljb24gY2xhc3M9InJlZnJlc2gtaWNvbiIgc3ZnSWNvbj0icmVmcmVzaF8yNHB4Ij48L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAnLHN0eWxlczpbIlxuICAgICAgLnJlbG9hZC1idXR0b24sXG4gICAgICAucmVmcmVzaC1pY29uIHtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgIC5yZWxvYWQtYnV0dG9uLmxvYWRpbmcge1xuICAgICAgICBhbmltYXRpb246IHJvdGF0ZSAycyBsaW5lYXIgaW5maW5pdGU7XG4gICAgICB9XG5cbiAgICAgIEBrZXlmcmFtZXMgcm90YXRlIHtcbiAgICAgICAgMCUge1xuICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICAgICAgICB9XG4gICAgICAgIDUwJSB7XG4gICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbiAgICAgICAgfVxuICAgICAgICAxMDAlIHtcbiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgIl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y29uc3QgdVk9eWsod04sYmsodk4sKHQ9Pm1ZKHQpP09iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7c2V0dGluZ3M6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuc2V0dGluZ3MpLHtyZWxvYWRFbmFibGVkOiF0LnNldHRpbmdzLnJlbG9hZEVuYWJsZWR9KX0pOnQpKSxiayh4TiwoKHQse3BlcmlvZEluTXM6ZX0pPT57aWYoIW1ZKHQpKXJldHVybiB0O2NvbnN0IG49ZT49M2U0P2U6dC5zZXR0aW5ncy5yZWxvYWRQZXJpb2RJbk1zO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NldHRpbmdzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnNldHRpbmdzKSx7cmVsb2FkUGVyaW9kSW5NczpufSl9KX0pKSxiayhPTiwoKHQse3NpemU6ZX0pPT57aWYoIW1ZKHQpKXJldHVybiB0O2NvbnN0IG49ZT4wP2U6dC5zZXR0aW5ncy5wYWdlU2l6ZTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzZXR0aW5nczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5zZXR0aW5ncykse3BhZ2VTaXplOm59KX0pfSkpLGJrKFdTLCgodCx7cGFydGlhbFNldHRpbmdzOmV9KT0+e2NvbnN0IG49e307cmV0dXJuIE51bWJlci5pc0Zpbml0ZShlLnBhZ2VTaXplKSYmZS5wYWdlU2l6ZT4wJiYobi5wYWdlU2l6ZT1lLnBhZ2VTaXplKSwiYm9vbGVhbiI9PXR5cGVvZiBlLmF1dG9SZWxvYWQmJihuLnJlbG9hZEVuYWJsZWQ9ZS5hdXRvUmVsb2FkKSxOdW1iZXIuaXNGaW5pdGUoZS5hdXRvUmVsb2FkUGVyaW9kSW5NcykmJmUuYXV0b1JlbG9hZFBlcmlvZEluTXM+M2U0JiYobi5yZWxvYWRQZXJpb2RJbk1zPWUuYXV0b1JlbG9hZFBlcmlvZEluTXMpLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7c2V0dGluZ3M6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuc2V0dGluZ3MpLG4pfSl9KSkpO2Z1bmN0aW9uIGZZKHQsZSl7cmV0dXJuIHVZKHQsZSl9Y29uc3QgZ1k9WyJpbnB1dCJdLGhZPWZ1bmN0aW9uKHQpe3JldHVybntlbnRlckR1cmF0aW9uOnR9fSxiWT1uZXcgR2EoIm1hdC1jaGVja2JveC1kZWZhdWx0LW9wdGlvbnMiLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OmZ1bmN0aW9uIHlZKCl7cmV0dXJue2NvbG9yOiJhY2NlbnQiLGNsaWNrQWN0aW9uOiJjaGVjay1pbmRldGVybWluYXRlIn19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL30pO2xldCBfWT0wO2NvbnN0IENZPXtjb2xvcjoiYWNjZW50IixjbGlja0FjdGlvbjoiY2hlY2staW5kZXRlcm1pbmF0ZSJ9LE1ZPXtwcm92aWRlOklWLHVzZUV4aXN0aW5nOnFlKCgoKT0+T1kpKSxtdWx0aTohMH07Y2xhc3Mgdll7fWNvbnN0IHhZPSRJKEpJKFFJKEtJKGNsYXNze2NvbnN0cnVjdG9yKHQpe3RoaXMuX2VsZW1lbnRSZWY9dH19KSkpKTtjbGFzcyBPWSBleHRlbmRzIHhZe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIpe3N1cGVyKHQpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmPWUsdGhpcy5fZm9jdXNNb25pdG9yPW4sdGhpcy5fbmdab25lPW8sdGhpcy5fYW5pbWF0aW9uTW9kZT1hLHRoaXMuX29wdGlvbnM9cix0aGlzLmFyaWFMYWJlbD0iIix0aGlzLmFyaWFMYWJlbGxlZGJ5PW51bGwsdGhpcy5fdW5pcXVlSWQ9Im1hdC1jaGVja2JveC0iKyArK19ZLHRoaXMuaWQ9dGhpcy5fdW5pcXVlSWQsdGhpcy5sYWJlbFBvc2l0aW9uPSJhZnRlciIsdGhpcy5uYW1lPW51bGwsdGhpcy5jaGFuZ2U9bmV3IExoLHRoaXMuaW5kZXRlcm1pbmF0ZUNoYW5nZT1uZXcgTGgsdGhpcy5fb25Ub3VjaGVkPSgpPT57fSx0aGlzLl9jdXJyZW50QW5pbWF0aW9uQ2xhc3M9IiIsdGhpcy5fY3VycmVudENoZWNrU3RhdGU9MCx0aGlzLl9jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuPSgpPT57fSx0aGlzLl9jaGVja2VkPSExLHRoaXMuX2Rpc2FibGVkPSExLHRoaXMuX2luZGV0ZXJtaW5hdGU9ITEsdGhpcy5fb3B0aW9ucz10aGlzLl9vcHRpb25zfHxDWSx0aGlzLmNvbG9yPXRoaXMuZGVmYXVsdENvbG9yPXRoaXMuX29wdGlvbnMuY29sb3J8fENZLmNvbG9yLHRoaXMudGFiSW5kZXg9cGFyc2VJbnQoaSl8fDB9Z2V0IGlucHV0SWQoKXtyZXR1cm5gJHt0aGlzLmlkfHx0aGlzLl91bmlxdWVJZH0taW5wdXRgfWdldCByZXF1aXJlZCgpe3JldHVybiB0aGlzLl9yZXF1aXJlZH1zZXQgcmVxdWlyZWQodCl7dGhpcy5fcmVxdWlyZWQ9eXoodCl9bmdBZnRlclZpZXdJbml0KCl7dGhpcy5fZm9jdXNNb25pdG9yLm1vbml0b3IodGhpcy5fZWxlbWVudFJlZiwhMCkuc3Vic2NyaWJlKCh0PT57dHx8UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKCk9Pnt0aGlzLl9vblRvdWNoZWQoKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX0pKX0pKSx0aGlzLl9zeW5jSW5kZXRlcm1pbmF0ZSh0aGlzLl9pbmRldGVybWluYXRlKX1uZ0FmdGVyVmlld0NoZWNrZWQoKXt9bmdPbkRlc3Ryb3koKXt0aGlzLl9mb2N1c01vbml0b3Iuc3RvcE1vbml0b3JpbmcodGhpcy5fZWxlbWVudFJlZil9Z2V0IGNoZWNrZWQoKXtyZXR1cm4gdGhpcy5fY2hlY2tlZH1zZXQgY2hlY2tlZCh0KXt0IT10aGlzLmNoZWNrZWQmJih0aGlzLl9jaGVja2VkPXQsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpfWdldCBkaXNhYmxlZCgpe3JldHVybiB0aGlzLl9kaXNhYmxlZH1zZXQgZGlzYWJsZWQodCl7Y29uc3QgZT15eih0KTtlIT09dGhpcy5kaXNhYmxlZCYmKHRoaXMuX2Rpc2FibGVkPWUsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpfWdldCBpbmRldGVybWluYXRlKCl7cmV0dXJuIHRoaXMuX2luZGV0ZXJtaW5hdGV9c2V0IGluZGV0ZXJtaW5hdGUodCl7Y29uc3QgZT10IT10aGlzLl9pbmRldGVybWluYXRlO3RoaXMuX2luZGV0ZXJtaW5hdGU9eXoodCksZSYmKHRoaXMuX3RyYW5zaXRpb25DaGVja1N0YXRlKHRoaXMuX2luZGV0ZXJtaW5hdGU/Mzp0aGlzLmNoZWNrZWQ/MToyKSx0aGlzLmluZGV0ZXJtaW5hdGVDaGFuZ2UuZW1pdCh0aGlzLl9pbmRldGVybWluYXRlKSksdGhpcy5fc3luY0luZGV0ZXJtaW5hdGUodGhpcy5faW5kZXRlcm1pbmF0ZSl9X2lzUmlwcGxlRGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5kaXNhYmxlUmlwcGxlfHx0aGlzLmRpc2FibGVkfV9vbkxhYmVsVGV4dENoYW5nZSgpe3RoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKX13cml0ZVZhbHVlKHQpe3RoaXMuY2hlY2tlZD0hIXR9cmVnaXN0ZXJPbkNoYW5nZSh0KXt0aGlzLl9jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuPXR9cmVnaXN0ZXJPblRvdWNoZWQodCl7dGhpcy5fb25Ub3VjaGVkPXR9c2V0RGlzYWJsZWRTdGF0ZSh0KXt0aGlzLmRpc2FibGVkPXR9X2dldEFyaWFDaGVja2VkKCl7cmV0dXJuIHRoaXMuY2hlY2tlZD8idHJ1ZSI6dGhpcy5pbmRldGVybWluYXRlPyJtaXhlZCI6ImZhbHNlIn1fdHJhbnNpdGlvbkNoZWNrU3RhdGUodCl7bGV0IGU9dGhpcy5fY3VycmVudENoZWNrU3RhdGUsbj10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7aWYoZSE9PXQmJih0aGlzLl9jdXJyZW50QW5pbWF0aW9uQ2xhc3MubGVuZ3RoPjAmJm4uY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9jdXJyZW50QW5pbWF0aW9uQ2xhc3MpLHRoaXMuX2N1cnJlbnRBbmltYXRpb25DbGFzcz10aGlzLl9nZXRBbmltYXRpb25DbGFzc0ZvckNoZWNrU3RhdGVUcmFuc2l0aW9uKGUsdCksdGhpcy5fY3VycmVudENoZWNrU3RhdGU9dCx0aGlzLl9jdXJyZW50QW5pbWF0aW9uQ2xhc3MubGVuZ3RoPjApKXtuLmNsYXNzTGlzdC5hZGQodGhpcy5fY3VycmVudEFuaW1hdGlvbkNsYXNzKTtjb25zdCB0PXRoaXMuX2N1cnJlbnRBbmltYXRpb25DbGFzczt0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT57c2V0VGltZW91dCgoKCk9PntuLmNsYXNzTGlzdC5yZW1vdmUodCl9KSwxZTMpfSkpfX1fZW1pdENoYW5nZUV2ZW50KCl7Y29uc3QgdD1uZXcgdlk7dC5zb3VyY2U9dGhpcyx0LmNoZWNrZWQ9dGhpcy5jaGVja2VkLHRoaXMuX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm4odGhpcy5jaGVja2VkKSx0aGlzLmNoYW5nZS5lbWl0KHQpLHRoaXMuX2lucHV0RWxlbWVudCYmKHRoaXMuX2lucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmNoZWNrZWQ9dGhpcy5jaGVja2VkKX10b2dnbGUoKXt0aGlzLmNoZWNrZWQ9IXRoaXMuY2hlY2tlZH1fb25JbnB1dENsaWNrKHQpe3ZhciBlO2NvbnN0IG49bnVsbD09PShlPXRoaXMuX29wdGlvbnMpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmNsaWNrQWN0aW9uO3Quc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5kaXNhYmxlZHx8Im5vb3AiPT09bj90aGlzLmRpc2FibGVkfHwibm9vcCIhPT1ufHwodGhpcy5faW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2hlY2tlZD10aGlzLmNoZWNrZWQsdGhpcy5faW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuaW5kZXRlcm1pbmF0ZT10aGlzLmluZGV0ZXJtaW5hdGUpOih0aGlzLmluZGV0ZXJtaW5hdGUmJiJjaGVjayIhPT1uJiZQcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+e3RoaXMuX2luZGV0ZXJtaW5hdGU9ITEsdGhpcy5pbmRldGVybWluYXRlQ2hhbmdlLmVtaXQodGhpcy5faW5kZXRlcm1pbmF0ZSl9KSksdGhpcy50b2dnbGUoKSx0aGlzLl90cmFuc2l0aW9uQ2hlY2tTdGF0ZSh0aGlzLl9jaGVja2VkPzE6MiksdGhpcy5fZW1pdENoYW5nZUV2ZW50KCkpfWZvY3VzKHQsZSl7dD90aGlzLl9mb2N1c01vbml0b3IuZm9jdXNWaWEodGhpcy5faW5wdXRFbGVtZW50LHQsZSk6dGhpcy5faW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoZSl9X29uSW50ZXJhY3Rpb25FdmVudCh0KXt0LnN0b3BQcm9wYWdhdGlvbigpfV9nZXRBbmltYXRpb25DbGFzc0ZvckNoZWNrU3RhdGVUcmFuc2l0aW9uKHQsZSl7aWYoIk5vb3BBbmltYXRpb25zIj09PXRoaXMuX2FuaW1hdGlvbk1vZGUpcmV0dXJuIiI7bGV0IG49IiI7c3dpdGNoKHQpe2Nhc2UgMDppZigxPT09ZSluPSJ1bmNoZWNrZWQtY2hlY2tlZCI7ZWxzZXtpZigzIT1lKXJldHVybiIiO249InVuY2hlY2tlZC1pbmRldGVybWluYXRlIn1icmVhaztjYXNlIDI6bj0xPT09ZT8idW5jaGVja2VkLWNoZWNrZWQiOiJ1bmNoZWNrZWQtaW5kZXRlcm1pbmF0ZSI7YnJlYWs7Y2FzZSAxOm49Mj09PWU/ImNoZWNrZWQtdW5jaGVja2VkIjoiY2hlY2tlZC1pbmRldGVybWluYXRlIjticmVhaztjYXNlIDM6bj0xPT09ZT8iaW5kZXRlcm1pbmF0ZS1jaGVja2VkIjoiaW5kZXRlcm1pbmF0ZS11bmNoZWNrZWQifXJldHVybmBtYXQtY2hlY2tib3gtYW5pbS0ke259YH1fc3luY0luZGV0ZXJtaW5hdGUodCl7Y29uc3QgZT10aGlzLl9pbnB1dEVsZW1lbnQ7ZSYmKGUubmF0aXZlRWxlbWVudC5pbmRldGVybWluYXRlPXQpfX1PWS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8T1kpKFNtKGhnKSxTbShVZyksU20oU0kpLFNtKGFfKSxOYSgidGFiaW5kZXgiKSxTbShWUCw4KSxTbShiWSw4KSl9LE9ZLsm1Y21wPXRvKHt0eXBlOk9ZLHNlbGVjdG9yczpbWyJtYXQtY2hlY2tib3giXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihRaChnWSw1KSxRaChrSCw1KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5faW5wdXRFbGVtZW50PXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLnJpcHBsZT10LmZpcnN0KX19LGhvc3RBdHRyczpbMSwibWF0LWNoZWNrYm94Il0saG9zdFZhcnM6MTIsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJihUdSgiaWQiLG4uaWQpLGpwKCJ0YWJpbmRleCIsbnVsbCkscHUoIm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlIixuLmluZGV0ZXJtaW5hdGUpKCJtYXQtY2hlY2tib3gtY2hlY2tlZCIsbi5jaGVja2VkKSgibWF0LWNoZWNrYm94LWRpc2FibGVkIixuLmRpc2FibGVkKSgibWF0LWNoZWNrYm94LWxhYmVsLWJlZm9yZSIsImJlZm9yZSI9PW4ubGFiZWxQb3NpdGlvbikoIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIiwiTm9vcEFuaW1hdGlvbnMiPT09bi5fYW5pbWF0aW9uTW9kZSkpfSxpbnB1dHM6e2Rpc2FibGVSaXBwbGU6ImRpc2FibGVSaXBwbGUiLGNvbG9yOiJjb2xvciIsdGFiSW5kZXg6InRhYkluZGV4IixhcmlhTGFiZWw6WyJhcmlhLWxhYmVsIiwiYXJpYUxhYmVsIl0sYXJpYUxhYmVsbGVkYnk6WyJhcmlhLWxhYmVsbGVkYnkiLCJhcmlhTGFiZWxsZWRieSJdLGlkOiJpZCIsbGFiZWxQb3NpdGlvbjoibGFiZWxQb3NpdGlvbiIsbmFtZToibmFtZSIscmVxdWlyZWQ6InJlcXVpcmVkIixjaGVja2VkOiJjaGVja2VkIixkaXNhYmxlZDoiZGlzYWJsZWQiLGluZGV0ZXJtaW5hdGU6ImluZGV0ZXJtaW5hdGUiLGFyaWFEZXNjcmliZWRieTpbImFyaWEtZGVzY3JpYmVkYnkiLCJhcmlhRGVzY3JpYmVkYnkiXSx2YWx1ZToidmFsdWUifSxvdXRwdXRzOntjaGFuZ2U6ImNoYW5nZSIsaW5kZXRlcm1pbmF0ZUNoYW5nZToiaW5kZXRlcm1pbmF0ZUNoYW5nZSJ9LGV4cG9ydEFzOlsibWF0Q2hlY2tib3giXSxmZWF0dXJlczpbcGcoW01ZXSkseHBdLG5nQ29udGVudFNlbGVjdG9yczpbIioiXSxkZWNsczoxNyx2YXJzOjIxLGNvbnN0czpbWzEsIm1hdC1jaGVja2JveC1sYXlvdXQiXSxbImxhYmVsIiwiIl0sWzEsIm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXIiXSxbInR5cGUiLCJjaGVja2JveCIsMSwibWF0LWNoZWNrYm94LWlucHV0IiwiY2RrLXZpc3VhbGx5LWhpZGRlbiIsMywiaWQiLCJyZXF1aXJlZCIsImNoZWNrZWQiLCJkaXNhYmxlZCIsInRhYkluZGV4IiwiY2hhbmdlIiwiY2xpY2siXSxbImlucHV0IiwiIl0sWyJtYXRSaXBwbGUiLCIiLDEsIm1hdC1jaGVja2JveC1yaXBwbGUiLCJtYXQtZm9jdXMtaW5kaWNhdG9yIiwzLCJtYXRSaXBwbGVUcmlnZ2VyIiwibWF0UmlwcGxlRGlzYWJsZWQiLCJtYXRSaXBwbGVSYWRpdXMiLCJtYXRSaXBwbGVDZW50ZXJlZCIsIm1hdFJpcHBsZUFuaW1hdGlvbiJdLFsxLCJtYXQtcmlwcGxlLWVsZW1lbnQiLCJtYXQtY2hlY2tib3gtcGVyc2lzdGVudC1yaXBwbGUiXSxbMSwibWF0LWNoZWNrYm94LWZyYW1lIl0sWzEsIm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kIl0sWyJ2ZXJzaW9uIiwiMS4xIiwiZm9jdXNhYmxlIiwiZmFsc2UiLCJ2aWV3Qm94IiwiMCAwIDI0IDI0IiwwLCJ4bWwiLCJzcGFjZSIsInByZXNlcnZlIiwiYXJpYS1oaWRkZW4iLCJ0cnVlIiwxLCJtYXQtY2hlY2tib3gtY2hlY2ttYXJrIl0sWyJmaWxsIiwibm9uZSIsInN0cm9rZSIsIndoaXRlIiwiZCIsIk00LjEsMTIuNyA5LDE3LjYgMjAuMyw2LjMiLDEsIm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aCJdLFsxLCJtYXQtY2hlY2tib3gtbWl4ZWRtYXJrIl0sWzEsIm1hdC1jaGVja2JveC1sYWJlbCIsMywiY2RrT2JzZXJ2ZUNvbnRlbnQiXSxbImNoZWNrYm94TGFiZWwiLCIiXSxbMiwiZGlzcGxheSIsIm5vbmUiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmKFptKCksUm0oMCwibGFiZWwiLDAsMSksUm0oMiwic3BhbiIsMiksUm0oMywiaW5wdXQiLDMsNCksVm0oImNoYW5nZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX29uSW50ZXJhY3Rpb25FdmVudChlKX0pKSgiY2xpY2siLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9vbklucHV0Q2xpY2soZSl9KSksQW0oKSxSbSg1LCJzcGFuIiw1KSxUbSg2LCJzcGFuIiw2KSxBbSgpLFRtKDcsInNwYW4iLDcpLFJtKDgsInNwYW4iLDgpLHFpKCksUm0oOSwic3ZnIiw5KSxUbSgxMCwicGF0aCIsMTApLEFtKCksWmkoKSxUbSgxMSwic3BhbiIsMTEpLEFtKCksQW0oKSxSbSgxMiwic3BhbiIsMTIsMTMpLFZtKCJjZGtPYnNlcnZlQ29udGVudCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5fb25MYWJlbFRleHRDaGFuZ2UoKX0pKSxSbSgxNCwic3BhbiIsMTQpLGt1KDE1LCLCoCIpLEFtKCksWG0oMTYpLEFtKCksQW0oKSksMiZlKXtjb25zdCB0PSRwKDEpLGU9JHAoMTMpO2pwKCJmb3IiLG4uaW5wdXRJZCkscmMoMikscHUoIm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXItbm8tc2lkZS1tYXJnaW4iLCFlLnRleHRDb250ZW50fHwhZS50ZXh0Q29udGVudC50cmltKCkpLHJjKDEpLERtKCJpZCIsbi5pbnB1dElkKSgicmVxdWlyZWQiLG4ucmVxdWlyZWQpKCJjaGVja2VkIixuLmNoZWNrZWQpKCJkaXNhYmxlZCIsbi5kaXNhYmxlZCkoInRhYkluZGV4IixuLnRhYkluZGV4KSxqcCgidmFsdWUiLG4udmFsdWUpKCJuYW1lIixuLm5hbWUpKCJhcmlhLWxhYmVsIixuLmFyaWFMYWJlbHx8bnVsbCkoImFyaWEtbGFiZWxsZWRieSIsbi5hcmlhTGFiZWxsZWRieSkoImFyaWEtY2hlY2tlZCIsbi5fZ2V0QXJpYUNoZWNrZWQoKSkoImFyaWEtZGVzY3JpYmVkYnkiLG4uYXJpYURlc2NyaWJlZGJ5KSxyYygyKSxEbSgibWF0UmlwcGxlVHJpZ2dlciIsdCkoIm1hdFJpcHBsZURpc2FibGVkIixuLl9pc1JpcHBsZURpc2FibGVkKCkpKCJtYXRSaXBwbGVSYWRpdXMiLDIwKSgibWF0UmlwcGxlQ2VudGVyZWQiLCEwKSgibWF0UmlwcGxlQW5pbWF0aW9uIixNaCgxOSxoWSwiTm9vcEFuaW1hdGlvbnMiPT09bi5fYW5pbWF0aW9uTW9kZT8wOjE1MCkpfX0sZGlyZWN0aXZlczpba0gsanpdLHN0eWxlczpbIkBrZXlmcmFtZXMgbWF0LWNoZWNrYm94LWZhZGUtaW4tYmFja2dyb3VuZHswJXtvcGFjaXR5OjB9NTAle29wYWNpdHk6MX19QGtleWZyYW1lcyBtYXQtY2hlY2tib3gtZmFkZS1vdXQtYmFja2dyb3VuZHswJSw1MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIG1hdC1jaGVja2JveC11bmNoZWNrZWQtY2hlY2tlZC1jaGVja21hcmstcGF0aHswJSw1MCV7c3Ryb2tlLWRhc2hvZmZzZXQ6MjIuOTEwMjU5fTUwJXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLCAwLCAwLjIsIDAuMSl9MTAwJXtzdHJva2UtZGFzaG9mZnNldDowfX1Aa2V5ZnJhbWVzIG1hdC1jaGVja2JveC11bmNoZWNrZWQtaW5kZXRlcm1pbmF0ZS1taXhlZG1hcmt7MCUsNjguMiV7dHJhbnNmb3JtOnNjYWxlWCgwKX02OC4yJXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLCAwLCAwLCAxKX0xMDAle3RyYW5zZm9ybTpzY2FsZVgoMSl9fUBrZXlmcmFtZXMgbWF0LWNoZWNrYm94LWNoZWNrZWQtdW5jaGVja2VkLWNoZWNrbWFyay1wYXRoe2Zyb217YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC40LCAwLCAxLCAxKTtzdHJva2UtZGFzaG9mZnNldDowfXRve3N0cm9rZS1kYXNob2Zmc2V0Oi0yMi45MTAyNTl9fUBrZXlmcmFtZXMgbWF0LWNoZWNrYm94LWNoZWNrZWQtaW5kZXRlcm1pbmF0ZS1jaGVja21hcmt7ZnJvbXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLCAwLCAwLjIsIDAuMSk7b3BhY2l0eToxO3RyYW5zZm9ybTpyb3RhdGUoMGRlZyl9dG97b3BhY2l0eTowO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfX1Aa2V5ZnJhbWVzIG1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLWNoZWNrZWQtY2hlY2ttYXJre2Zyb217YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4xNCwgMCwgMCwgMSk7b3BhY2l0eTowO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfXRve29wYWNpdHk6MTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fUBrZXlmcmFtZXMgbWF0LWNoZWNrYm94LWNoZWNrZWQtaW5kZXRlcm1pbmF0ZS1taXhlZG1hcmt7ZnJvbXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLCAwLCAwLjIsIDAuMSk7b3BhY2l0eTowO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX10b3tvcGFjaXR5OjE7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX19QGtleWZyYW1lcyBtYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS1jaGVja2VkLW1peGVkbWFya3tmcm9te2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTQsIDAsIDAsIDEpO29wYWNpdHk6MTt0cmFuc2Zvcm06cm90YXRlKDBkZWcpfXRve29wYWNpdHk6MDt0cmFuc2Zvcm06cm90YXRlKDMxNWRlZyl9fUBrZXlmcmFtZXMgbWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUtdW5jaGVja2VkLW1peGVkbWFya3swJXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmxpbmVhcjtvcGFjaXR5OjE7dHJhbnNmb3JtOnNjYWxlWCgxKX0zMi44JSwxMDAle29wYWNpdHk6MDt0cmFuc2Zvcm06c2NhbGVYKDApfX0ubWF0LWNoZWNrYm94LWJhY2tncm91bmQsLm1hdC1jaGVja2JveC1mcmFtZXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjJweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9pbnRlci1ldmVudHM6bm9uZX0ubWF0LWNoZWNrYm94e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3RyYW5zaXRpb246YmFja2dyb3VuZCA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxib3gtc2hhZG93IDI4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7Y3Vyc29yOnBvaW50ZXI7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50fS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtY2hlY2tib3h7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtY2hlY2tib3ggLm1hdC1yaXBwbGUtZWxlbWVudDpub3QoLm1hdC1jaGVja2JveC1wZXJzaXN0ZW50LXJpcHBsZSl7b3BhY2l0eTouMTZ9Lm1hdC1jaGVja2JveCAubWF0LWNoZWNrYm94LXJpcHBsZXtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OmNhbGMoNTAlIC0gMjBweCk7dG9wOmNhbGMoNTAlIC0gMjBweCk7aGVpZ2h0OjQwcHg7d2lkdGg6NDBweDt6LWluZGV4OjE7cG9pbnRlci1ldmVudHM6bm9uZX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtY2hlY2tib3guY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1jaGVja2JveC1yaXBwbGV7b3V0bGluZTpzb2xpZCAzcHh9Lm1hdC1jaGVja2JveC1sYXlvdXR7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjppbmhlcml0O2FsaWduLWl0ZW1zOmJhc2VsaW5lO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtkaXNwbGF5OmlubGluZS1mbGV4O3doaXRlLXNwYWNlOm5vd3JhcH0ubWF0LWNoZWNrYm94LWxhYmVsey13ZWJraXQtdXNlci1zZWxlY3Q6YXV0bzstbW96LXVzZXItc2VsZWN0OmF1dG87LW1zLXVzZXItc2VsZWN0OmF1dG87dXNlci1zZWxlY3Q6YXV0b30ubWF0LWNoZWNrYm94LWlubmVyLWNvbnRhaW5lcntkaXNwbGF5OmlubGluZS1ibG9jaztoZWlnaHQ6MTZweDtsaW5lLWhlaWdodDowO21hcmdpbjphdXRvO21hcmdpbi1yaWdodDo4cHg7b3JkZXI6MDtwb3NpdGlvbjpyZWxhdGl2ZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7d2hpdGUtc3BhY2U6bm93cmFwO3dpZHRoOjE2cHg7ZmxleC1zaHJpbms6MH1bZGlyPXJ0bF0gLm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXJ7bWFyZ2luLWxlZnQ6OHB4O21hcmdpbi1yaWdodDphdXRvfS5tYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVyLW5vLXNpZGUtbWFyZ2lue21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjB9Lm1hdC1jaGVja2JveC1mcmFtZXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246Ym9yZGVyLWNvbG9yIDkwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKTtib3JkZXItd2lkdGg6MnB4O2JvcmRlci1zdHlsZTpzb2xpZH0uX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1jaGVja2JveC1mcmFtZXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1jaGVja2JveC1iYWNrZ3JvdW5ke2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmlubGluZS1mbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDkwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKSxvcGFjaXR5IDkwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKTstd2Via2l0LXByaW50LWNvbG9yLWFkanVzdDpleGFjdDtjb2xvci1hZGp1c3Q6ZXhhY3R9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHt0cmFuc2l0aW9uOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWNoZWNrYm94IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kOm5vbmV9Lm1hdC1jaGVja2JveC1wZXJzaXN0ZW50LXJpcHBsZXtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7dHJhbnNmb3JtOm5vbmV9Lm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXI6aG92ZXIgLm1hdC1jaGVja2JveC1wZXJzaXN0ZW50LXJpcHBsZXtvcGFjaXR5Oi4wNH0ubWF0LWNoZWNrYm94LmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtY2hlY2tib3gtcGVyc2lzdGVudC1yaXBwbGV7b3BhY2l0eTouMTJ9Lm1hdC1jaGVja2JveC1wZXJzaXN0ZW50LXJpcHBsZSwubWF0LWNoZWNrYm94Lm1hdC1jaGVja2JveC1kaXNhYmxlZCAubWF0LWNoZWNrYm94LWlubmVyLWNvbnRhaW5lcjpob3ZlciAubWF0LWNoZWNrYm94LXBlcnNpc3RlbnQtcmlwcGxle29wYWNpdHk6MH1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVyOmhvdmVyIC5tYXQtY2hlY2tib3gtcGVyc2lzdGVudC1yaXBwbGV7ZGlzcGxheTpub25lfX0ubWF0LWNoZWNrYm94LWNoZWNrbWFya3t0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGh7c3Ryb2tlLWRhc2hvZmZzZXQ6MjIuOTEwMjU5O3N0cm9rZS1kYXNoYXJyYXk6MjIuOTEwMjU5O3N0cm9rZS13aWR0aDoyLjEzMzMzMzMzMzNweH0uY2RrLWhpZ2gtY29udHJhc3QtYmxhY2stb24td2hpdGUgLm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHtzdHJva2U6IzAwMCAhaW1wb3J0YW50fS5tYXQtY2hlY2tib3gtbWl4ZWRtYXJre3dpZHRoOmNhbGMoMTAwJSAtIDZweCk7aGVpZ2h0OjJweDtvcGFjaXR5OjA7dHJhbnNmb3JtOnNjYWxlWCgwKSByb3RhdGUoMGRlZyk7Ym9yZGVyLXJhZGl1czoycHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWNoZWNrYm94LW1peGVkbWFya3toZWlnaHQ6MDtib3JkZXItdG9wOnNvbGlkIDJweDttYXJnaW4tdG9wOjJweH0ubWF0LWNoZWNrYm94LWxhYmVsLWJlZm9yZSAubWF0LWNoZWNrYm94LWlubmVyLWNvbnRhaW5lcntvcmRlcjoxO21hcmdpbi1sZWZ0OjhweDttYXJnaW4tcmlnaHQ6YXV0b31bZGlyPXJ0bF0gLm1hdC1jaGVja2JveC1sYWJlbC1iZWZvcmUgLm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXJ7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6OHB4fS5tYXQtY2hlY2tib3gtY2hlY2tlZCAubWF0LWNoZWNrYm94LWNoZWNrbWFya3tvcGFjaXR5OjF9Lm1hdC1jaGVja2JveC1jaGVja2VkIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGh7c3Ryb2tlLWRhc2hvZmZzZXQ6MH0ubWF0LWNoZWNrYm94LWNoZWNrZWQgLm1hdC1jaGVja2JveC1taXhlZG1hcmt7dHJhbnNmb3JtOnNjYWxlWCgxKSByb3RhdGUoLTQ1ZGVnKX0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUgLm1hdC1jaGVja2JveC1jaGVja21hcmt7b3BhY2l0eTowO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoe3N0cm9rZS1kYXNob2Zmc2V0OjB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlIC5tYXQtY2hlY2tib3gtbWl4ZWRtYXJre29wYWNpdHk6MTt0cmFuc2Zvcm06c2NhbGVYKDEpIHJvdGF0ZSgwZGVnKX0ubWF0LWNoZWNrYm94LXVuY2hlY2tlZCAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWNoZWNrYm94LWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1jaGVja2JveC1kaXNhYmxlZHtvcGFjaXR5Oi41fS5tYXQtY2hlY2tib3gtYW5pbS11bmNoZWNrZWQtY2hlY2tlZCAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YW5pbWF0aW9uOjE4MG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LWZhZGUtaW4tYmFja2dyb3VuZH0ubWF0LWNoZWNrYm94LWFuaW0tdW5jaGVja2VkLWNoZWNrZWQgLm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHthbmltYXRpb246MTgwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtdW5jaGVja2VkLWNoZWNrZWQtY2hlY2ttYXJrLXBhdGh9Lm1hdC1jaGVja2JveC1hbmltLXVuY2hlY2tlZC1pbmRldGVybWluYXRlIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHthbmltYXRpb246MTgwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtZmFkZS1pbi1iYWNrZ3JvdW5kfS5tYXQtY2hlY2tib3gtYW5pbS11bmNoZWNrZWQtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LW1peGVkbWFya3thbmltYXRpb246OTBtcyBsaW5lYXIgMG1zIG1hdC1jaGVja2JveC11bmNoZWNrZWQtaW5kZXRlcm1pbmF0ZS1taXhlZG1hcmt9Lm1hdC1jaGVja2JveC1hbmltLWNoZWNrZWQtdW5jaGVja2VkIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHthbmltYXRpb246MTgwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtZmFkZS1vdXQtYmFja2dyb3VuZH0ubWF0LWNoZWNrYm94LWFuaW0tY2hlY2tlZC11bmNoZWNrZWQgLm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHthbmltYXRpb246OTBtcyBsaW5lYXIgMG1zIG1hdC1jaGVja2JveC1jaGVja2VkLXVuY2hlY2tlZC1jaGVja21hcmstcGF0aH0ubWF0LWNoZWNrYm94LWFuaW0tY2hlY2tlZC1pbmRldGVybWluYXRlIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJre2FuaW1hdGlvbjo5MG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LWNoZWNrZWQtaW5kZXRlcm1pbmF0ZS1jaGVja21hcmt9Lm1hdC1jaGVja2JveC1hbmltLWNoZWNrZWQtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LW1peGVkbWFya3thbmltYXRpb246OTBtcyBsaW5lYXIgMG1zIG1hdC1jaGVja2JveC1jaGVja2VkLWluZGV0ZXJtaW5hdGUtbWl4ZWRtYXJrfS5tYXQtY2hlY2tib3gtYW5pbS1pbmRldGVybWluYXRlLWNoZWNrZWQgLm1hdC1jaGVja2JveC1jaGVja21hcmt7YW5pbWF0aW9uOjUwMG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUtY2hlY2tlZC1jaGVja21hcmt9Lm1hdC1jaGVja2JveC1hbmltLWluZGV0ZXJtaW5hdGUtY2hlY2tlZCAubWF0LWNoZWNrYm94LW1peGVkbWFya3thbmltYXRpb246NTAwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS1jaGVja2VkLW1peGVkbWFya30ubWF0LWNoZWNrYm94LWFuaW0taW5kZXRlcm1pbmF0ZS11bmNoZWNrZWQgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5ke2FuaW1hdGlvbjoxODBtcyBsaW5lYXIgMG1zIG1hdC1jaGVja2JveC1mYWRlLW91dC1iYWNrZ3JvdW5kfS5tYXQtY2hlY2tib3gtYW5pbS1pbmRldGVybWluYXRlLXVuY2hlY2tlZCAubWF0LWNoZWNrYm94LW1peGVkbWFya3thbmltYXRpb246MzAwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS11bmNoZWNrZWQtbWl4ZWRtYXJrfS5tYXQtY2hlY2tib3gtaW5wdXR7Ym90dG9tOjA7bGVmdDo1MCV9XG4iXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSxPWS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpVZ30se3R5cGU6U0l9LHt0eXBlOmFffSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6amEsYXJnczpbInRhYmluZGV4Il19XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltiWV19XX1dLE9ZLnByb3BEZWNvcmF0b3JzPXthcmlhTGFiZWw6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsIl19XSxhcmlhTGFiZWxsZWRieTpbe3R5cGU6eHksYXJnczpbImFyaWEtbGFiZWxsZWRieSJdfV0sYXJpYURlc2NyaWJlZGJ5Olt7dHlwZTp4eSxhcmdzOlsiYXJpYS1kZXNjcmliZWRieSJdfV0saWQ6W3t0eXBlOnh5fV0scmVxdWlyZWQ6W3t0eXBlOnh5fV0sbGFiZWxQb3NpdGlvbjpbe3R5cGU6eHl9XSxuYW1lOlt7dHlwZTp4eX1dLGNoYW5nZTpbe3R5cGU6T3l9XSxpbmRldGVybWluYXRlQ2hhbmdlOlt7dHlwZTpPeX1dLHZhbHVlOlt7dHlwZTp4eX1dLF9pbnB1dEVsZW1lbnQ6W3t0eXBlOlphLGFyZ3M6WyJpbnB1dCJdfV0scmlwcGxlOlt7dHlwZTpaYSxhcmdzOltrSF19XSxjaGVja2VkOlt7dHlwZTp4eX1dLGRpc2FibGVkOlt7dHlwZTp4eX1dLGluZGV0ZXJtaW5hdGU6W3t0eXBlOnh5fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoT1ksW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWF0LWNoZWNrYm94Iix0ZW1wbGF0ZTonPGxhYmVsIFthdHRyLmZvcl09ImlucHV0SWQiIGNsYXNzPSJtYXQtY2hlY2tib3gtbGF5b3V0IiAjbGFiZWw+XG4gIDxzcGFuIGNsYXNzPSJtYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVyIlxuICAgICAgIFtjbGFzcy5tYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVyLW5vLXNpZGUtbWFyZ2luXT0iIWNoZWNrYm94TGFiZWwudGV4dENvbnRlbnQgfHwgIWNoZWNrYm94TGFiZWwudGV4dENvbnRlbnQudHJpbSgpIj5cbiAgICA8aW5wdXQgI2lucHV0XG4gICAgICAgICAgIGNsYXNzPSJtYXQtY2hlY2tib3gtaW5wdXQgY2RrLXZpc3VhbGx5LWhpZGRlbiIgdHlwZT0iY2hlY2tib3giXG4gICAgICAgICAgIFtpZF09ImlucHV0SWQiXG4gICAgICAgICAgIFtyZXF1aXJlZF09InJlcXVpcmVkIlxuICAgICAgICAgICBbY2hlY2tlZF09ImNoZWNrZWQiXG4gICAgICAgICAgIFthdHRyLnZhbHVlXT0idmFsdWUiXG4gICAgICAgICAgIFtkaXNhYmxlZF09ImRpc2FibGVkIlxuICAgICAgICAgICBbYXR0ci5uYW1lXT0ibmFtZSJcbiAgICAgICAgICAgW3RhYkluZGV4XT0idGFiSW5kZXgiXG4gICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPSJhcmlhTGFiZWwgfHwgbnVsbCJcbiAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT0iYXJpYUxhYmVsbGVkYnkiXG4gICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09Il9nZXRBcmlhQ2hlY2tlZCgpIlxuICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT0iYXJpYURlc2NyaWJlZGJ5IlxuICAgICAgICAgICAoY2hhbmdlKT0iX29uSW50ZXJhY3Rpb25FdmVudCgkZXZlbnQpIlxuICAgICAgICAgICAoY2xpY2spPSJfb25JbnB1dENsaWNrKCRldmVudCkiPlxuICAgIDxzcGFuIG1hdFJpcHBsZSBjbGFzcz0ibWF0LWNoZWNrYm94LXJpcHBsZSBtYXQtZm9jdXMtaW5kaWNhdG9yIlxuICAgICAgICAgW21hdFJpcHBsZVRyaWdnZXJdPSJsYWJlbCJcbiAgICAgICAgIFttYXRSaXBwbGVEaXNhYmxlZF09Il9pc1JpcHBsZURpc2FibGVkKCkiXG4gICAgICAgICBbbWF0UmlwcGxlUmFkaXVzXT0iMjAiXG4gICAgICAgICBbbWF0UmlwcGxlQ2VudGVyZWRdPSJ0cnVlIlxuICAgICAgICAgW21hdFJpcHBsZUFuaW1hdGlvbl09IntlbnRlckR1cmF0aW9uOiBfYW5pbWF0aW9uTW9kZSA9PT0gXCdOb29wQW5pbWF0aW9uc1wnID8gMCA6IDE1MH0iPlxuICAgICAgPHNwYW4gY2xhc3M9Im1hdC1yaXBwbGUtZWxlbWVudCBtYXQtY2hlY2tib3gtcGVyc2lzdGVudC1yaXBwbGUiPjwvc3Bhbj5cbiAgICA8L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9Im1hdC1jaGVja2JveC1mcmFtZSI+PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPSJtYXQtY2hlY2tib3gtYmFja2dyb3VuZCI+XG4gICAgICA8c3ZnIHZlcnNpb249IjEuMSJcbiAgICAgICAgICAgZm9jdXNhYmxlPSJmYWxzZSJcbiAgICAgICAgICAgY2xhc3M9Im1hdC1jaGVja2JveC1jaGVja21hcmsiXG4gICAgICAgICAgIHZpZXdCb3g9IjAgMCAyNCAyNCJcbiAgICAgICAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSJcbiAgICAgICAgICAgYXJpYS1oaWRkZW49InRydWUiPlxuICAgICAgICA8cGF0aCBjbGFzcz0ibWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoIlxuICAgICAgICAgICAgICBmaWxsPSJub25lIlxuICAgICAgICAgICAgICBzdHJva2U9IndoaXRlIlxuICAgICAgICAgICAgICBkPSJNNC4xLDEyLjcgOSwxNy42IDIwLjMsNi4zIi8+XG4gICAgICA8L3N2Zz5cbiAgICAgIFx4M2MhLS0gRWxlbWVudCBmb3IgcmVuZGVyaW5nIHRoZSBpbmRldGVybWluYXRlIHN0YXRlIGNoZWNrYm94LiAtLVx4M2VcbiAgICAgIDxzcGFuIGNsYXNzPSJtYXQtY2hlY2tib3gtbWl4ZWRtYXJrIj48L3NwYW4+XG4gICAgPC9zcGFuPlxuICA8L3NwYW4+XG4gIDxzcGFuIGNsYXNzPSJtYXQtY2hlY2tib3gtbGFiZWwiICNjaGVja2JveExhYmVsIChjZGtPYnNlcnZlQ29udGVudCk9Il9vbkxhYmVsVGV4dENoYW5nZSgpIj5cbiAgICBceDNjIS0tIEFkZCBhbiBpbnZpc2libGUgc3BhbiBzbyBKQVdTIGNhbiByZWFkIHRoZSBsYWJlbCAtLVx4M2VcbiAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lIj4mbmJzcDs8L3NwYW4+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L3NwYW4+XG48L2xhYmVsPlxuJyxleHBvcnRBczoibWF0Q2hlY2tib3giLGhvc3Q6e2NsYXNzOiJtYXQtY2hlY2tib3giLCJbaWRdIjoiaWQiLCJbYXR0ci50YWJpbmRleF0iOiJudWxsIiwiW2NsYXNzLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlXSI6ImluZGV0ZXJtaW5hdGUiLCJbY2xhc3MubWF0LWNoZWNrYm94LWNoZWNrZWRdIjoiY2hlY2tlZCIsIltjbGFzcy5tYXQtY2hlY2tib3gtZGlzYWJsZWRdIjoiZGlzYWJsZWQiLCJbY2xhc3MubWF0LWNoZWNrYm94LWxhYmVsLWJlZm9yZV0iOidsYWJlbFBvc2l0aW9uID09ICJiZWZvcmUiJywiW2NsYXNzLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlXSI6Il9hbmltYXRpb25Nb2RlID09PSAnTm9vcEFuaW1hdGlvbnMnIn0scHJvdmlkZXJzOltNWV0saW5wdXRzOlsiZGlzYWJsZVJpcHBsZSIsImNvbG9yIiwidGFiSW5kZXgiXSxlbmNhcHN1bGF0aW9uOkhuLk5vbmUsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaCxzdHlsZXM6WyJAa2V5ZnJhbWVzIG1hdC1jaGVja2JveC1mYWRlLWluLWJhY2tncm91bmR7MCV7b3BhY2l0eTowfTUwJXtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgbWF0LWNoZWNrYm94LWZhZGUtb3V0LWJhY2tncm91bmR7MCUsNTAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MH19QGtleWZyYW1lcyBtYXQtY2hlY2tib3gtdW5jaGVja2VkLWNoZWNrZWQtY2hlY2ttYXJrLXBhdGh7MCUsNTAle3N0cm9rZS1kYXNob2Zmc2V0OjIyLjkxMDI1OX01MCV7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAwLjEpfTEwMCV7c3Ryb2tlLWRhc2hvZmZzZXQ6MH19QGtleWZyYW1lcyBtYXQtY2hlY2tib3gtdW5jaGVja2VkLWluZGV0ZXJtaW5hdGUtbWl4ZWRtYXJrezAlLDY4LjIle3RyYW5zZm9ybTpzY2FsZVgoMCl9NjguMiV7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMCwgMCwgMCwgMSl9MTAwJXt0cmFuc2Zvcm06c2NhbGVYKDEpfX1Aa2V5ZnJhbWVzIG1hdC1jaGVja2JveC1jaGVja2VkLXVuY2hlY2tlZC1jaGVja21hcmstcGF0aHtmcm9te2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNCwgMCwgMSwgMSk7c3Ryb2tlLWRhc2hvZmZzZXQ6MH10b3tzdHJva2UtZGFzaG9mZnNldDotMjIuOTEwMjU5fX1Aa2V5ZnJhbWVzIG1hdC1jaGVja2JveC1jaGVja2VkLWluZGV0ZXJtaW5hdGUtY2hlY2ttYXJre2Zyb217YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAwLjEpO29wYWNpdHk6MTt0cmFuc2Zvcm06cm90YXRlKDBkZWcpfXRve29wYWNpdHk6MDt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX19QGtleWZyYW1lcyBtYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS1jaGVja2VkLWNoZWNrbWFya3tmcm9te2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTQsIDAsIDAsIDEpO29wYWNpdHk6MDt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX10b3tvcGFjaXR5OjE7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1Aa2V5ZnJhbWVzIG1hdC1jaGVja2JveC1jaGVja2VkLWluZGV0ZXJtaW5hdGUtbWl4ZWRtYXJre2Zyb217YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAwLjEpO29wYWNpdHk6MDt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9dG97b3BhY2l0eToxO3RyYW5zZm9ybTpyb3RhdGUoMGRlZyl9fUBrZXlmcmFtZXMgbWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUtY2hlY2tlZC1taXhlZG1hcmt7ZnJvbXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjE0LCAwLCAwLCAxKTtvcGFjaXR5OjE7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX10b3tvcGFjaXR5OjA7dHJhbnNmb3JtOnJvdGF0ZSgzMTVkZWcpfX1Aa2V5ZnJhbWVzIG1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLXVuY2hlY2tlZC1taXhlZG1hcmt7MCV7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpsaW5lYXI7b3BhY2l0eToxO3RyYW5zZm9ybTpzY2FsZVgoMSl9MzIuOCUsMTAwJXtvcGFjaXR5OjA7dHJhbnNmb3JtOnNjYWxlWCgwKX19Lm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLC5tYXQtY2hlY2tib3gtZnJhbWV7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czoycHg7Ym94LXNpemluZzpib3JkZXItYm94O3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1hdC1jaGVja2JveHtkaXNwbGF5OmlubGluZS1ibG9jazt0cmFuc2l0aW9uOmJhY2tncm91bmQgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYm94LXNoYWRvdyAyODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO2N1cnNvcjpwb2ludGVyOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudH0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LWNoZWNrYm94e3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LWNoZWNrYm94IC5tYXQtcmlwcGxlLWVsZW1lbnQ6bm90KC5tYXQtY2hlY2tib3gtcGVyc2lzdGVudC1yaXBwbGUpe29wYWNpdHk6LjE2fS5tYXQtY2hlY2tib3ggLm1hdC1jaGVja2JveC1yaXBwbGV7cG9zaXRpb246YWJzb2x1dGU7bGVmdDpjYWxjKDUwJSAtIDIwcHgpO3RvcDpjYWxjKDUwJSAtIDIwcHgpO2hlaWdodDo0MHB4O3dpZHRoOjQwcHg7ei1pbmRleDoxO3BvaW50ZXItZXZlbnRzOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWNoZWNrYm94LmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtY2hlY2tib3gtcmlwcGxle291dGxpbmU6c29saWQgM3B4fS5tYXQtY2hlY2tib3gtbGF5b3V0ey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6aW5oZXJpdDthbGlnbi1pdGVtczpiYXNlbGluZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7ZGlzcGxheTppbmxpbmUtZmxleDt3aGl0ZS1zcGFjZTpub3dyYXB9Lm1hdC1jaGVja2JveC1sYWJlbHstd2Via2l0LXVzZXItc2VsZWN0OmF1dG87LW1vei11c2VyLXNlbGVjdDphdXRvOy1tcy11c2VyLXNlbGVjdDphdXRvO3VzZXItc2VsZWN0OmF1dG99Lm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7aGVpZ2h0OjE2cHg7bGluZS1oZWlnaHQ6MDttYXJnaW46YXV0bzttYXJnaW4tcmlnaHQ6OHB4O29yZGVyOjA7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246bWlkZGxlO3doaXRlLXNwYWNlOm5vd3JhcDt3aWR0aDoxNnB4O2ZsZXgtc2hyaW5rOjB9W2Rpcj1ydGxdIC5tYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVye21hcmdpbi1sZWZ0OjhweDttYXJnaW4tcmlnaHQ6YXV0b30ubWF0LWNoZWNrYm94LWlubmVyLWNvbnRhaW5lci1uby1zaWRlLW1hcmdpbnttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowfS5tYXQtY2hlY2tib3gtZnJhbWV7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOmJvcmRlci1jb2xvciA5MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDAuMSk7Ym9yZGVyLXdpZHRoOjJweDtib3JkZXItc3R5bGU6c29saWR9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtY2hlY2tib3gtZnJhbWV7dHJhbnNpdGlvbjpub25lfS5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTppbmxpbmUtZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA5MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDAuMSksb3BhY2l0eSA5MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDAuMSk7LXdlYmtpdC1wcmludC1jb2xvci1hZGp1c3Q6ZXhhY3Q7Y29sb3ItYWRqdXN0OmV4YWN0fS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7dHJhbnNpdGlvbjpub25lfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1jaGVja2JveCAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZDpub25lfS5tYXQtY2hlY2tib3gtcGVyc2lzdGVudC1yaXBwbGV7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3RyYW5zZm9ybTpub25lfS5tYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVyOmhvdmVyIC5tYXQtY2hlY2tib3gtcGVyc2lzdGVudC1yaXBwbGV7b3BhY2l0eTouMDR9Lm1hdC1jaGVja2JveC5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWNoZWNrYm94LXBlcnNpc3RlbnQtcmlwcGxle29wYWNpdHk6LjEyfS5tYXQtY2hlY2tib3gtcGVyc2lzdGVudC1yaXBwbGUsLm1hdC1jaGVja2JveC5tYXQtY2hlY2tib3gtZGlzYWJsZWQgLm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXI6aG92ZXIgLm1hdC1jaGVja2JveC1wZXJzaXN0ZW50LXJpcHBsZXtvcGFjaXR5OjB9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWNoZWNrYm94LWlubmVyLWNvbnRhaW5lcjpob3ZlciAubWF0LWNoZWNrYm94LXBlcnNpc3RlbnQtcmlwcGxle2Rpc3BsYXk6bm9uZX19Lm1hdC1jaGVja2JveC1jaGVja21hcmt7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJX0ubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoe3N0cm9rZS1kYXNob2Zmc2V0OjIyLjkxMDI1OTtzdHJva2UtZGFzaGFycmF5OjIyLjkxMDI1OTtzdHJva2Utd2lkdGg6Mi4xMzMzMzMzMzMzcHh9LmNkay1oaWdoLWNvbnRyYXN0LWJsYWNrLW9uLXdoaXRlIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGh7c3Ryb2tlOiMwMDAgIWltcG9ydGFudH0ubWF0LWNoZWNrYm94LW1peGVkbWFya3t3aWR0aDpjYWxjKDEwMCUgLSA2cHgpO2hlaWdodDoycHg7b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZVgoMCkgcm90YXRlKDBkZWcpO2JvcmRlci1yYWRpdXM6MnB4fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1jaGVja2JveC1taXhlZG1hcmt7aGVpZ2h0OjA7Ym9yZGVyLXRvcDpzb2xpZCAycHg7bWFyZ2luLXRvcDoycHh9Lm1hdC1jaGVja2JveC1sYWJlbC1iZWZvcmUgLm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXJ7b3JkZXI6MTttYXJnaW4tbGVmdDo4cHg7bWFyZ2luLXJpZ2h0OmF1dG99W2Rpcj1ydGxdIC5tYXQtY2hlY2tib3gtbGFiZWwtYmVmb3JlIC5tYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVye21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OjhweH0ubWF0LWNoZWNrYm94LWNoZWNrZWQgLm1hdC1jaGVja2JveC1jaGVja21hcmt7b3BhY2l0eToxfS5tYXQtY2hlY2tib3gtY2hlY2tlZCAubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoe3N0cm9rZS1kYXNob2Zmc2V0OjB9Lm1hdC1jaGVja2JveC1jaGVja2VkIC5tYXQtY2hlY2tib3gtbWl4ZWRtYXJre3RyYW5zZm9ybTpzY2FsZVgoMSkgcm90YXRlKC00NWRlZyl9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJre29wYWNpdHk6MDt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUgLm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHtzdHJva2UtZGFzaG9mZnNldDowfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LW1peGVkbWFya3tvcGFjaXR5OjE7dHJhbnNmb3JtOnNjYWxlWCgxKSByb3RhdGUoMGRlZyl9Lm1hdC1jaGVja2JveC11bmNoZWNrZWQgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1jaGVja2JveC1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtY2hlY2tib3gtZGlzYWJsZWR7b3BhY2l0eTouNX0ubWF0LWNoZWNrYm94LWFuaW0tdW5jaGVja2VkLWNoZWNrZWQgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5ke2FuaW1hdGlvbjoxODBtcyBsaW5lYXIgMG1zIG1hdC1jaGVja2JveC1mYWRlLWluLWJhY2tncm91bmR9Lm1hdC1jaGVja2JveC1hbmltLXVuY2hlY2tlZC1jaGVja2VkIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGh7YW5pbWF0aW9uOjE4MG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LXVuY2hlY2tlZC1jaGVja2VkLWNoZWNrbWFyay1wYXRofS5tYXQtY2hlY2tib3gtYW5pbS11bmNoZWNrZWQtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YW5pbWF0aW9uOjE4MG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LWZhZGUtaW4tYmFja2dyb3VuZH0ubWF0LWNoZWNrYm94LWFuaW0tdW5jaGVja2VkLWluZGV0ZXJtaW5hdGUgLm1hdC1jaGVja2JveC1taXhlZG1hcmt7YW5pbWF0aW9uOjkwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtdW5jaGVja2VkLWluZGV0ZXJtaW5hdGUtbWl4ZWRtYXJrfS5tYXQtY2hlY2tib3gtYW5pbS1jaGVja2VkLXVuY2hlY2tlZCAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YW5pbWF0aW9uOjE4MG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LWZhZGUtb3V0LWJhY2tncm91bmR9Lm1hdC1jaGVja2JveC1hbmltLWNoZWNrZWQtdW5jaGVja2VkIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGh7YW5pbWF0aW9uOjkwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtY2hlY2tlZC11bmNoZWNrZWQtY2hlY2ttYXJrLXBhdGh9Lm1hdC1jaGVja2JveC1hbmltLWNoZWNrZWQtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LWNoZWNrbWFya3thbmltYXRpb246OTBtcyBsaW5lYXIgMG1zIG1hdC1jaGVja2JveC1jaGVja2VkLWluZGV0ZXJtaW5hdGUtY2hlY2ttYXJrfS5tYXQtY2hlY2tib3gtYW5pbS1jaGVja2VkLWluZGV0ZXJtaW5hdGUgLm1hdC1jaGVja2JveC1taXhlZG1hcmt7YW5pbWF0aW9uOjkwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtY2hlY2tlZC1pbmRldGVybWluYXRlLW1peGVkbWFya30ubWF0LWNoZWNrYm94LWFuaW0taW5kZXRlcm1pbmF0ZS1jaGVja2VkIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJre2FuaW1hdGlvbjo1MDBtcyBsaW5lYXIgMG1zIG1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLWNoZWNrZWQtY2hlY2ttYXJrfS5tYXQtY2hlY2tib3gtYW5pbS1pbmRldGVybWluYXRlLWNoZWNrZWQgLm1hdC1jaGVja2JveC1taXhlZG1hcmt7YW5pbWF0aW9uOjUwMG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUtY2hlY2tlZC1taXhlZG1hcmt9Lm1hdC1jaGVja2JveC1hbmltLWluZGV0ZXJtaW5hdGUtdW5jaGVja2VkIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHthbmltYXRpb246MTgwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtZmFkZS1vdXQtYmFja2dyb3VuZH0ubWF0LWNoZWNrYm94LWFuaW0taW5kZXRlcm1pbmF0ZS11bmNoZWNrZWQgLm1hdC1jaGVja2JveC1taXhlZG1hcmt7YW5pbWF0aW9uOjMwMG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUtdW5jaGVja2VkLW1peGVkbWFya30ubWF0LWNoZWNrYm94LWlucHV0e2JvdHRvbTowO2xlZnQ6NTAlfVxuIl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6VWd9LHt0eXBlOlNJfSx7dHlwZTphX30se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmphLGFyZ3M6WyJ0YWJpbmRleCJdfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbYlldfV19XX0pLHthcmlhTGFiZWw6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsIl19XSxhcmlhTGFiZWxsZWRieTpbe3R5cGU6eHksYXJnczpbImFyaWEtbGFiZWxsZWRieSJdfV0saWQ6W3t0eXBlOnh5fV0sbGFiZWxQb3NpdGlvbjpbe3R5cGU6eHl9XSxuYW1lOlt7dHlwZTp4eX1dLGNoYW5nZTpbe3R5cGU6T3l9XSxpbmRldGVybWluYXRlQ2hhbmdlOlt7dHlwZTpPeX1dLHJlcXVpcmVkOlt7dHlwZTp4eX1dLGNoZWNrZWQ6W3t0eXBlOnh5fV0sZGlzYWJsZWQ6W3t0eXBlOnh5fV0saW5kZXRlcm1pbmF0ZTpbe3R5cGU6eHl9XSxhcmlhRGVzY3JpYmVkYnk6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWRlc2NyaWJlZGJ5Il19XSx2YWx1ZTpbe3R5cGU6eHl9XSxfaW5wdXRFbGVtZW50Olt7dHlwZTpaYSxhcmdzOlsiaW5wdXQiXX1dLHJpcHBsZTpbe3R5cGU6WmEsYXJnczpba0hdfV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IFBZPXtwcm92aWRlOkdWLHVzZUV4aXN0aW5nOnFlKCgoKT0+d1kpKSxtdWx0aTohMH07Y2xhc3Mgd1kgZXh0ZW5kcyBLVXt9d1kuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKHdZKSkpKG58fHdZKX19KSgpLHdZLsm1ZGlyPWxvKHt0eXBlOndZLHNlbGVjdG9yczpbWyJtYXQtY2hlY2tib3giLCJyZXF1aXJlZCIsIiIsImZvcm1Db250cm9sTmFtZSIsIiJdLFsibWF0LWNoZWNrYm94IiwicmVxdWlyZWQiLCIiLCJmb3JtQ29udHJvbCIsIiJdLFsibWF0LWNoZWNrYm94IiwicmVxdWlyZWQiLCIiLCJuZ01vZGVsIiwiIl1dLGZlYXR1cmVzOltwZyhbUFldKSx4cF19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHdZLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC1jaGVja2JveFtyZXF1aXJlZF1bZm9ybUNvbnRyb2xOYW1lXSxcbiAgICAgICAgICAgICBtYXQtY2hlY2tib3hbcmVxdWlyZWRdW2Zvcm1Db250cm9sXSwgbWF0LWNoZWNrYm94W3JlcXVpcmVkXVtuZ01vZGVsXSIscHJvdmlkZXJzOltQWV19XX1dLG51bGwsbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBrWXt9a1kuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGtZKX0sa1kuybVtb2Q9YW8oe3R5cGU6a1l9KSxrWS7JtWluaj12bih7fSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChrWSxbe3R5cGU6QXksYXJnczpbe2V4cG9ydHM6W3dZXSxkZWNsYXJhdGlvbnM6W3dZXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKGtZLHtkZWNsYXJhdGlvbnM6W3dZXSxleHBvcnRzOlt3WV19KTtjbGFzcyBTWXt9U1kuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFNZKX0sU1kuybVtb2Q9YW8oe3R5cGU6U1l9KSxTWS7JtWluaj12bih7aW1wb3J0czpbW1NILFhJLFV6LGtZXSxYSSxrWV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFNZLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbU0gsWEksVXosa1ldLGV4cG9ydHM6W09ZLFhJLGtZXSxkZWNsYXJhdGlvbnM6W09ZXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFNZLHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bT1ldfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1NILFhJLFV6LGtZXX0sZXhwb3J0czpmdW5jdGlvbigpe3JldHVybltPWSxYSSxrWV19fSk7Y29uc3QgRFk9Tnooe3Bhc3NpdmU6ITB9KTtjbGFzcyBFWXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX3BsYXRmb3JtPXQsdGhpcy5fbmdab25lPWUsdGhpcy5fbW9uaXRvcmVkRWxlbWVudHM9bmV3IE1hcH1tb25pdG9yKHQpe2lmKCF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpcmV0dXJuIHJ0O2NvbnN0IGU9eHoodCksbj10aGlzLl9tb25pdG9yZWRFbGVtZW50cy5nZXQoZSk7aWYobilyZXR1cm4gbi5zdWJqZWN0O2NvbnN0IG89bmV3IEksaT0iY2RrLXRleHQtZmllbGQtYXV0b2ZpbGxlZCIsYT10PT57ImNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IiE9PXQuYW5pbWF0aW9uTmFtZXx8ZS5jbGFzc0xpc3QuY29udGFpbnMoaSk/ImNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCI9PT10LmFuaW1hdGlvbk5hbWUmJmUuY2xhc3NMaXN0LmNvbnRhaW5zKGkpJiYoZS5jbGFzc0xpc3QucmVtb3ZlKGkpLHRoaXMuX25nWm9uZS5ydW4oKCgpPT5vLm5leHQoe3RhcmdldDp0LnRhcmdldCxpc0F1dG9maWxsZWQ6ITF9KSkpKTooZS5jbGFzc0xpc3QuYWRkKGkpLHRoaXMuX25nWm9uZS5ydW4oKCgpPT5vLm5leHQoe3RhcmdldDp0LnRhcmdldCxpc0F1dG9maWxsZWQ6ITB9KSkpKX07cmV0dXJuIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PntlLmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbnN0YXJ0IixhLERZKSxlLmNsYXNzTGlzdC5hZGQoImNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZCIpfSkpLHRoaXMuX21vbml0b3JlZEVsZW1lbnRzLnNldChlLHtzdWJqZWN0Om8sdW5saXN0ZW46KCk9PntlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbnN0YXJ0IixhLERZKX19KSxvfXN0b3BNb25pdG9yaW5nKHQpe2NvbnN0IGU9eHoodCksbj10aGlzLl9tb25pdG9yZWRFbGVtZW50cy5nZXQoZSk7biYmKG4udW5saXN0ZW4oKSxuLnN1YmplY3QuY29tcGxldGUoKSxlLmNsYXNzTGlzdC5yZW1vdmUoImNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZCIpLGUuY2xhc3NMaXN0LnJlbW92ZSgiY2RrLXRleHQtZmllbGQtYXV0b2ZpbGxlZCIpLHRoaXMuX21vbml0b3JlZEVsZW1lbnRzLmRlbGV0ZShlKSl9bmdPbkRlc3Ryb3koKXt0aGlzLl9tb25pdG9yZWRFbGVtZW50cy5mb3JFYWNoKCgodCxlKT0+dGhpcy5zdG9wTW9uaXRvcmluZyhlKSkpfX1FWS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8RVkpKHZyKHd6KSx2cihhXykpfSxFWS7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgRVkodnIod3opLHZyKGFfKSl9LHRva2VuOkVZLHByb3ZpZGVkSW46InJvb3QifSksRVkuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp3en0se3R5cGU6YV99XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEVZLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp3en0se3R5cGU6YV99XX0pLG51bGwpO2NsYXNzIFJZe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fZWxlbWVudFJlZj10LHRoaXMuX2F1dG9maWxsTW9uaXRvcj1lLHRoaXMuY2RrQXV0b2ZpbGw9bmV3IExofW5nT25Jbml0KCl7dGhpcy5fYXV0b2ZpbGxNb25pdG9yLm1vbml0b3IodGhpcy5fZWxlbWVudFJlZikuc3Vic2NyaWJlKCh0PT50aGlzLmNka0F1dG9maWxsLmVtaXQodCkpKX1uZ09uRGVzdHJveSgpe3RoaXMuX2F1dG9maWxsTW9uaXRvci5zdG9wTW9uaXRvcmluZyh0aGlzLl9lbGVtZW50UmVmKX19UlkuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFJZKShTbShoZyksU20oRVkpKX0sUlkuybVkaXI9bG8oe3R5cGU6Ulksc2VsZWN0b3JzOltbIiIsImNka0F1dG9maWxsIiwiIl1dLG91dHB1dHM6e2Nka0F1dG9maWxsOiJjZGtBdXRvZmlsbCJ9fSksUlkuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ30se3R5cGU6RVl9XSxSWS5wcm9wRGVjb3JhdG9ycz17Y2RrQXV0b2ZpbGw6W3t0eXBlOk95fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUlksW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Nka0F1dG9maWxsXSJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6RVl9XX0pLHtjZGtBdXRvZmlsbDpbe3R5cGU6T3l9XX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgQVl7Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy5fZWxlbWVudFJlZj10LHRoaXMuX3BsYXRmb3JtPWUsdGhpcy5fbmdab25lPW4sdGhpcy5fZGVzdHJveWVkPW5ldyBJLHRoaXMuX2VuYWJsZWQ9ITAsdGhpcy5fcHJldmlvdXNNaW5Sb3dzPS0xLHRoaXMuX2lzVmlld0luaXRlZD0hMSx0aGlzLl9oYW5kbGVGb2N1c0V2ZW50PXQ9Pnt0aGlzLl9oYXNGb2N1cz0iZm9jdXMiPT09dC50eXBlfSx0aGlzLl9kb2N1bWVudD1vLHRoaXMuX3RleHRhcmVhRWxlbWVudD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnR9Z2V0IG1pblJvd3MoKXtyZXR1cm4gdGhpcy5fbWluUm93c31zZXQgbWluUm93cyh0KXt0aGlzLl9taW5Sb3dzPV96KHQpLHRoaXMuX3NldE1pbkhlaWdodCgpfWdldCBtYXhSb3dzKCl7cmV0dXJuIHRoaXMuX21heFJvd3N9c2V0IG1heFJvd3ModCl7dGhpcy5fbWF4Um93cz1feih0KSx0aGlzLl9zZXRNYXhIZWlnaHQoKX1nZXQgZW5hYmxlZCgpe3JldHVybiB0aGlzLl9lbmFibGVkfXNldCBlbmFibGVkKHQpe3Q9eXoodCksdGhpcy5fZW5hYmxlZCE9PXQmJigodGhpcy5fZW5hYmxlZD10KT90aGlzLnJlc2l6ZVRvRml0Q29udGVudCghMCk6dGhpcy5yZXNldCgpKX1nZXQgcGxhY2Vob2xkZXIoKXtyZXR1cm4gdGhpcy5fdGV4dGFyZWFFbGVtZW50LnBsYWNlaG9sZGVyfXNldCBwbGFjZWhvbGRlcih0KXt0aGlzLl9jYWNoZWRQbGFjZWhvbGRlckhlaWdodD12b2lkIDAsdGhpcy5fdGV4dGFyZWFFbGVtZW50LnBsYWNlaG9sZGVyPXQsdGhpcy5fY2FjaGVUZXh0YXJlYVBsYWNlaG9sZGVySGVpZ2h0KCl9X3NldE1pbkhlaWdodCgpe2NvbnN0IHQ9dGhpcy5taW5Sb3dzJiZ0aGlzLl9jYWNoZWRMaW5lSGVpZ2h0P3RoaXMubWluUm93cyp0aGlzLl9jYWNoZWRMaW5lSGVpZ2h0KyJweCI6bnVsbDt0JiYodGhpcy5fdGV4dGFyZWFFbGVtZW50LnN0eWxlLm1pbkhlaWdodD10KX1fc2V0TWF4SGVpZ2h0KCl7Y29uc3QgdD10aGlzLm1heFJvd3MmJnRoaXMuX2NhY2hlZExpbmVIZWlnaHQ/dGhpcy5tYXhSb3dzKnRoaXMuX2NhY2hlZExpbmVIZWlnaHQrInB4IjpudWxsO3QmJih0aGlzLl90ZXh0YXJlYUVsZW1lbnQuc3R5bGUubWF4SGVpZ2h0PXQpfW5nQWZ0ZXJWaWV3SW5pdCgpe3RoaXMuX3BsYXRmb3JtLmlzQnJvd3NlciYmKHRoaXMuX2luaXRpYWxIZWlnaHQ9dGhpcy5fdGV4dGFyZWFFbGVtZW50LnN0eWxlLmhlaWdodCx0aGlzLnJlc2l6ZVRvRml0Q29udGVudCgpLHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PntvZSh0aGlzLl9nZXRXaW5kb3coKSwicmVzaXplIikucGlwZShkZSgxNiksSWUodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgoKT0+dGhpcy5yZXNpemVUb0ZpdENvbnRlbnQoITApKSksdGhpcy5fdGV4dGFyZWFFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9oYW5kbGVGb2N1c0V2ZW50KSx0aGlzLl90ZXh0YXJlYUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsdGhpcy5faGFuZGxlRm9jdXNFdmVudCl9KSksdGhpcy5faXNWaWV3SW5pdGVkPSEwLHRoaXMucmVzaXplVG9GaXRDb250ZW50KCEwKSl9bmdPbkRlc3Ryb3koKXt0aGlzLl90ZXh0YXJlYUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2hhbmRsZUZvY3VzRXZlbnQpLHRoaXMuX3RleHRhcmVhRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9oYW5kbGVGb2N1c0V2ZW50KSx0aGlzLl9kZXN0cm95ZWQubmV4dCgpLHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpfV9jYWNoZVRleHRhcmVhTGluZUhlaWdodCgpe2lmKHRoaXMuX2NhY2hlZExpbmVIZWlnaHQpcmV0dXJuO2xldCB0PXRoaXMuX3RleHRhcmVhRWxlbWVudC5jbG9uZU5vZGUoITEpO3Qucm93cz0xLHQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0LnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIsdC5zdHlsZS5ib3JkZXI9Im5vbmUiLHQuc3R5bGUucGFkZGluZz0iMCIsdC5zdHlsZS5oZWlnaHQ9IiIsdC5zdHlsZS5taW5IZWlnaHQ9IiIsdC5zdHlsZS5tYXhIZWlnaHQ9IiIsdC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIix0aGlzLl90ZXh0YXJlYUVsZW1lbnQucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0KSx0aGlzLl9jYWNoZWRMaW5lSGVpZ2h0PXQuY2xpZW50SGVpZ2h0LHRoaXMuX3RleHRhcmVhRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLHRoaXMuX3NldE1pbkhlaWdodCgpLHRoaXMuX3NldE1heEhlaWdodCgpfV9tZWFzdXJlU2Nyb2xsSGVpZ2h0KCl7Y29uc3QgdD10aGlzLl90ZXh0YXJlYUVsZW1lbnQsZT10LnN0eWxlLm1hcmdpbkJvdHRvbXx8IiIsbj10aGlzLl9wbGF0Zm9ybS5GSVJFRk9YLG89biYmdGhpcy5faGFzRm9jdXMsaT1uPyJjZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3giOiJjZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nIjtvJiYodC5zdHlsZS5tYXJnaW5Cb3R0b209YCR7dC5jbGllbnRIZWlnaHR9cHhgKSx0LmNsYXNzTGlzdC5hZGQoaSk7Y29uc3QgYT10LnNjcm9sbEhlaWdodC00O3JldHVybiB0LmNsYXNzTGlzdC5yZW1vdmUoaSksbyYmKHQuc3R5bGUubWFyZ2luQm90dG9tPWUpLGF9X2NhY2hlVGV4dGFyZWFQbGFjZWhvbGRlckhlaWdodCgpe2lmKCF0aGlzLl9pc1ZpZXdJbml0ZWR8fG51bGwhPXRoaXMuX2NhY2hlZFBsYWNlaG9sZGVySGVpZ2h0KXJldHVybjtpZighdGhpcy5wbGFjZWhvbGRlcilyZXR1cm4gdm9pZCh0aGlzLl9jYWNoZWRQbGFjZWhvbGRlckhlaWdodD0wKTtjb25zdCB0PXRoaXMuX3RleHRhcmVhRWxlbWVudC52YWx1ZTt0aGlzLl90ZXh0YXJlYUVsZW1lbnQudmFsdWU9dGhpcy5fdGV4dGFyZWFFbGVtZW50LnBsYWNlaG9sZGVyLHRoaXMuX2NhY2hlZFBsYWNlaG9sZGVySGVpZ2h0PXRoaXMuX21lYXN1cmVTY3JvbGxIZWlnaHQoKSx0aGlzLl90ZXh0YXJlYUVsZW1lbnQudmFsdWU9dH1uZ0RvQ2hlY2soKXt0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXImJnRoaXMucmVzaXplVG9GaXRDb250ZW50KCl9cmVzaXplVG9GaXRDb250ZW50KHQ9ITEpe2lmKCF0aGlzLl9lbmFibGVkKXJldHVybjtpZih0aGlzLl9jYWNoZVRleHRhcmVhTGluZUhlaWdodCgpLHRoaXMuX2NhY2hlVGV4dGFyZWFQbGFjZWhvbGRlckhlaWdodCgpLCF0aGlzLl9jYWNoZWRMaW5lSGVpZ2h0KXJldHVybjtjb25zdCBlPXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxuPWUudmFsdWU7aWYoIXQmJnRoaXMuX21pblJvd3M9PT10aGlzLl9wcmV2aW91c01pblJvd3MmJm49PT10aGlzLl9wcmV2aW91c1ZhbHVlKXJldHVybjtjb25zdCBvPXRoaXMuX21lYXN1cmVTY3JvbGxIZWlnaHQoKSxpPU1hdGgubWF4KG8sdGhpcy5fY2FjaGVkUGxhY2Vob2xkZXJIZWlnaHR8fDApO2Uuc3R5bGUuaGVpZ2h0PWAke2l9cHhgLHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PnsidW5kZWZpbmVkIiE9dHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZT9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT50aGlzLl9zY3JvbGxUb0NhcmV0UG9zaXRpb24oZSkpKTpzZXRUaW1lb3V0KCgoKT0+dGhpcy5fc2Nyb2xsVG9DYXJldFBvc2l0aW9uKGUpKSl9KSksdGhpcy5fcHJldmlvdXNWYWx1ZT1uLHRoaXMuX3ByZXZpb3VzTWluUm93cz10aGlzLl9taW5Sb3dzfXJlc2V0KCl7dm9pZCAwIT09dGhpcy5faW5pdGlhbEhlaWdodCYmKHRoaXMuX3RleHRhcmVhRWxlbWVudC5zdHlsZS5oZWlnaHQ9dGhpcy5faW5pdGlhbEhlaWdodCl9X25vb3BJbnB1dEhhbmRsZXIoKXt9X2dldERvY3VtZW50KCl7cmV0dXJuIHRoaXMuX2RvY3VtZW50fHxkb2N1bWVudH1fZ2V0V2luZG93KCl7cmV0dXJuIHRoaXMuX2dldERvY3VtZW50KCkuZGVmYXVsdFZpZXd8fHdpbmRvd31fc2Nyb2xsVG9DYXJldFBvc2l0aW9uKHQpe2NvbnN0e3NlbGVjdGlvblN0YXJ0OmUsc2VsZWN0aW9uRW5kOm59PXQ7IXRoaXMuX2Rlc3Ryb3llZC5pc1N0b3BwZWQmJnRoaXMuX2hhc0ZvY3VzJiZ0LnNldFNlbGVjdGlvblJhbmdlKGUsbil9fUFZLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxBWSkoU20oaGcpLFNtKHd6KSxTbShhXyksU20oWl8sOCkpfSxBWS7JtWRpcj1sbyh7dHlwZTpBWSxzZWxlY3RvcnM6W1sidGV4dGFyZWEiLCJjZGtUZXh0YXJlYUF1dG9zaXplIiwiIl1dLGhvc3RBdHRyczpbInJvd3MiLCIxIiwxLCJjZGstdGV4dGFyZWEtYXV0b3NpemUiXSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezEmZSYmVm0oImlucHV0IiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9ub29wSW5wdXRIYW5kbGVyKCl9KSl9LGlucHV0czp7bWluUm93czpbImNka0F1dG9zaXplTWluUm93cyIsIm1pblJvd3MiXSxtYXhSb3dzOlsiY2RrQXV0b3NpemVNYXhSb3dzIiwibWF4Um93cyJdLGVuYWJsZWQ6WyJjZGtUZXh0YXJlYUF1dG9zaXplIiwiZW5hYmxlZCJdLHBsYWNlaG9sZGVyOiJwbGFjZWhvbGRlciJ9LGV4cG9ydEFzOlsiY2RrVGV4dGFyZWFBdXRvc2l6ZSJdfSksQVkuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ30se3R5cGU6d3p9LHt0eXBlOmFffSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1pfXX1dfV0sQVkucHJvcERlY29yYXRvcnM9e21pblJvd3M6W3t0eXBlOnh5LGFyZ3M6WyJjZGtBdXRvc2l6ZU1pblJvd3MiXX1dLG1heFJvd3M6W3t0eXBlOnh5LGFyZ3M6WyJjZGtBdXRvc2l6ZU1heFJvd3MiXX1dLGVuYWJsZWQ6W3t0eXBlOnh5LGFyZ3M6WyJjZGtUZXh0YXJlYUF1dG9zaXplIl19XSxwbGFjZWhvbGRlcjpbe3R5cGU6eHl9XSxfbm9vcElucHV0SGFuZGxlcjpbe3R5cGU6d3ksYXJnczpbImlucHV0Il19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChBWSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJ0ZXh0YXJlYVtjZGtUZXh0YXJlYUF1dG9zaXplXSIsZXhwb3J0QXM6ImNka1RleHRhcmVhQXV0b3NpemUiLGhvc3Q6e2NsYXNzOiJjZGstdGV4dGFyZWEtYXV0b3NpemUiLHJvd3M6IjEifX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTp3en0se3R5cGU6YV99LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbWl9dfV19XX0pLHttaW5Sb3dzOlt7dHlwZTp4eSxhcmdzOlsiY2RrQXV0b3NpemVNaW5Sb3dzIl19XSxtYXhSb3dzOlt7dHlwZTp4eSxhcmdzOlsiY2RrQXV0b3NpemVNYXhSb3dzIl19XSxlbmFibGVkOlt7dHlwZTp4eSxhcmdzOlsiY2RrVGV4dGFyZWFBdXRvc2l6ZSJdfV0scGxhY2Vob2xkZXI6W3t0eXBlOnh5fV0sX25vb3BJbnB1dEhhbmRsZXI6W3t0eXBlOnd5LGFyZ3M6WyJpbnB1dCJdfV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIFRZe31UWS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VFkpfSxUWS7JtW1vZD1hbyh7dHlwZTpUWX0pLFRZLsm1aW5qPXZuKHtpbXBvcnRzOltba3pdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoVFksW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W1JZLEFZXSxpbXBvcnRzOltrel0sZXhwb3J0czpbUlksQVldfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oVFkse2RlY2xhcmF0aW9uczpmdW5jdGlvbigpe3JldHVybltSWSxBWV19LGltcG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5ba3pdfSxleHBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1JZLEFZXX19KTtjbGFzcyBOWSBleHRlbmRzIEFZe2dldCBtYXRBdXRvc2l6ZU1pblJvd3MoKXtyZXR1cm4gdGhpcy5taW5Sb3dzfXNldCBtYXRBdXRvc2l6ZU1pblJvd3ModCl7dGhpcy5taW5Sb3dzPXR9Z2V0IG1hdEF1dG9zaXplTWF4Um93cygpe3JldHVybiB0aGlzLm1heFJvd3N9c2V0IG1hdEF1dG9zaXplTWF4Um93cyh0KXt0aGlzLm1heFJvd3M9dH1nZXQgbWF0QXV0b3NpemUoKXtyZXR1cm4gdGhpcy5lbmFibGVkfXNldCBtYXRBdXRvc2l6ZSh0KXt0aGlzLmVuYWJsZWQ9dH1nZXQgbWF0VGV4dGFyZWFBdXRvc2l6ZSgpe3JldHVybiB0aGlzLmVuYWJsZWR9c2V0IG1hdFRleHRhcmVhQXV0b3NpemUodCl7dGhpcy5lbmFibGVkPXR9fU5ZLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYShOWSkpKShufHxOWSl9fSkoKSxOWS7JtWRpcj1sbyh7dHlwZTpOWSxzZWxlY3RvcnM6W1sidGV4dGFyZWEiLCJtYXQtYXV0b3NpemUiLCIiXSxbInRleHRhcmVhIiwibWF0VGV4dGFyZWFBdXRvc2l6ZSIsIiJdXSxob3N0QXR0cnM6WyJyb3dzIiwiMSIsMSwiY2RrLXRleHRhcmVhLWF1dG9zaXplIiwibWF0LWF1dG9zaXplIl0saW5wdXRzOntjZGtBdXRvc2l6ZU1pblJvd3M6ImNka0F1dG9zaXplTWluUm93cyIsY2RrQXV0b3NpemVNYXhSb3dzOiJjZGtBdXRvc2l6ZU1heFJvd3MiLG1hdEF1dG9zaXplTWluUm93czoibWF0QXV0b3NpemVNaW5Sb3dzIixtYXRBdXRvc2l6ZU1heFJvd3M6Im1hdEF1dG9zaXplTWF4Um93cyIsbWF0QXV0b3NpemU6WyJtYXQtYXV0b3NpemUiLCJtYXRBdXRvc2l6ZSJdLG1hdFRleHRhcmVhQXV0b3NpemU6Im1hdFRleHRhcmVhQXV0b3NpemUifSxleHBvcnRBczpbIm1hdFRleHRhcmVhQXV0b3NpemUiXSxmZWF0dXJlczpbeHBdfSksTlkucHJvcERlY29yYXRvcnM9e21hdEF1dG9zaXplTWluUm93czpbe3R5cGU6eHl9XSxtYXRBdXRvc2l6ZU1heFJvd3M6W3t0eXBlOnh5fV0sbWF0QXV0b3NpemU6W3t0eXBlOnh5LGFyZ3M6WyJtYXQtYXV0b3NpemUiXX1dLG1hdFRleHRhcmVhQXV0b3NpemU6W3t0eXBlOnh5fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoTlksW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoidGV4dGFyZWFbbWF0LWF1dG9zaXplXSwgdGV4dGFyZWFbbWF0VGV4dGFyZWFBdXRvc2l6ZV0iLGV4cG9ydEFzOiJtYXRUZXh0YXJlYUF1dG9zaXplIixpbnB1dHM6WyJjZGtBdXRvc2l6ZU1pblJvd3MiLCJjZGtBdXRvc2l6ZU1heFJvd3MiXSxob3N0OntjbGFzczoiY2RrLXRleHRhcmVhLWF1dG9zaXplIG1hdC1hdXRvc2l6ZSIscm93czoiMSJ9fV19XSxudWxsLHttYXRBdXRvc2l6ZU1pblJvd3M6W3t0eXBlOnh5fV0sbWF0QXV0b3NpemVNYXhSb3dzOlt7dHlwZTp4eX1dLG1hdEF1dG9zaXplOlt7dHlwZTp4eSxhcmdzOlsibWF0LWF1dG9zaXplIl19XSxtYXRUZXh0YXJlYUF1dG9zaXplOlt7dHlwZTp4eX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCB6WT1uZXcgR2EoIk1BVF9JTlBVVF9WQUxVRV9BQ0NFU1NPUiIpLElZPVsiYnV0dG9uIiwiY2hlY2tib3giLCJmaWxlIiwiaGlkZGVuIiwiaW1hZ2UiLCJyYWRpbyIsInJhbmdlIiwicmVzZXQiLCJzdWJtaXQiXTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovbGV0IEhZPTA7Y29uc3QgRlk9dEgoY2xhc3N7Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy5fZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyPXQsdGhpcy5fcGFyZW50Rm9ybT1lLHRoaXMuX3BhcmVudEZvcm1Hcm91cD1uLHRoaXMubmdDb250cm9sPW99fSk7Y2xhc3MgTFkgZXh0ZW5kcyBGWXtjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyLHMsbCxjKXtzdXBlcihhLG8saSxuKSx0aGlzLl9lbGVtZW50UmVmPXQsdGhpcy5fcGxhdGZvcm09ZSx0aGlzLl9hdXRvZmlsbE1vbml0b3I9cyx0aGlzLl9mb3JtRmllbGQ9Yyx0aGlzLl91aWQ9Im1hdC1pbnB1dC0iK0hZKyssdGhpcy5mb2N1c2VkPSExLHRoaXMuc3RhdGVDaGFuZ2VzPW5ldyBJLHRoaXMuY29udHJvbFR5cGU9Im1hdC1pbnB1dCIsdGhpcy5hdXRvZmlsbGVkPSExLHRoaXMuX2Rpc2FibGVkPSExLHRoaXMuX3JlcXVpcmVkPSExLHRoaXMuX3R5cGU9InRleHQiLHRoaXMuX3JlYWRvbmx5PSExLHRoaXMuX25ldmVyRW1wdHlJbnB1dFR5cGVzPVsiZGF0ZSIsImRhdGV0aW1lIiwiZGF0ZXRpbWUtbG9jYWwiLCJtb250aCIsInRpbWUiLCJ3ZWVrIl0uZmlsdGVyKCh0PT5EeigpLmhhcyh0KSkpO2NvbnN0IGQ9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LHA9ZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3RoaXMuX2lucHV0VmFsdWVBY2Nlc3Nvcj1yfHxkLHRoaXMuX3ByZXZpb3VzTmF0aXZlVmFsdWU9dGhpcy52YWx1ZSx0aGlzLmlkPXRoaXMuaWQsZS5JT1MmJmwucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT57dC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIiwodD0+e2NvbnN0IGU9dC50YXJnZXQ7ZS52YWx1ZXx8MCE9PWUuc2VsZWN0aW9uU3RhcnR8fDAhPT1lLnNlbGVjdGlvbkVuZHx8KGUuc2V0U2VsZWN0aW9uUmFuZ2UoMSwxKSxlLnNldFNlbGVjdGlvblJhbmdlKDAsMCkpfSkpfSkpLHRoaXMuX2lzU2VydmVyPSF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIsdGhpcy5faXNOYXRpdmVTZWxlY3Q9InNlbGVjdCI9PT1wLHRoaXMuX2lzVGV4dGFyZWE9InRleHRhcmVhIj09PXAsdGhpcy5faXNJbkZvcm1GaWVsZD0hIWMsdGhpcy5faXNOYXRpdmVTZWxlY3QmJih0aGlzLmNvbnRyb2xUeXBlPWQubXVsdGlwbGU/Im1hdC1uYXRpdmUtc2VsZWN0LW11bHRpcGxlIjoibWF0LW5hdGl2ZS1zZWxlY3QiKX1nZXQgZGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5uZ0NvbnRyb2wmJm51bGwhPT10aGlzLm5nQ29udHJvbC5kaXNhYmxlZD90aGlzLm5nQ29udHJvbC5kaXNhYmxlZDp0aGlzLl9kaXNhYmxlZH1zZXQgZGlzYWJsZWQodCl7dGhpcy5fZGlzYWJsZWQ9eXoodCksdGhpcy5mb2N1c2VkJiYodGhpcy5mb2N1c2VkPSExLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKSl9Z2V0IGlkKCl7cmV0dXJuIHRoaXMuX2lkfXNldCBpZCh0KXt0aGlzLl9pZD10fHx0aGlzLl91aWR9Z2V0IHJlcXVpcmVkKCl7cmV0dXJuIHRoaXMuX3JlcXVpcmVkfXNldCByZXF1aXJlZCh0KXt0aGlzLl9yZXF1aXJlZD15eih0KX1nZXQgdHlwZSgpe3JldHVybiB0aGlzLl90eXBlfXNldCB0eXBlKHQpe3RoaXMuX3R5cGU9dHx8InRleHQiLHRoaXMuX3ZhbGlkYXRlVHlwZSgpLCF0aGlzLl9pc1RleHRhcmVhJiZEeigpLmhhcyh0aGlzLl90eXBlKSYmKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC50eXBlPXRoaXMuX3R5cGUpfWdldCB2YWx1ZSgpe3JldHVybiB0aGlzLl9pbnB1dFZhbHVlQWNjZXNzb3IudmFsdWV9c2V0IHZhbHVlKHQpe3QhPT10aGlzLnZhbHVlJiYodGhpcy5faW5wdXRWYWx1ZUFjY2Vzc29yLnZhbHVlPXQsdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpKX1nZXQgcmVhZG9ubHkoKXtyZXR1cm4gdGhpcy5fcmVhZG9ubHl9c2V0IHJlYWRvbmx5KHQpe3RoaXMuX3JlYWRvbmx5PXl6KHQpfW5nQWZ0ZXJWaWV3SW5pdCgpe3RoaXMuX3BsYXRmb3JtLmlzQnJvd3NlciYmdGhpcy5fYXV0b2ZpbGxNb25pdG9yLm1vbml0b3IodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5zdWJzY3JpYmUoKHQ9Pnt0aGlzLmF1dG9maWxsZWQ9dC5pc0F1dG9maWxsZWQsdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpfSkpfW5nT25DaGFuZ2VzKCl7dGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpfW5nT25EZXN0cm95KCl7dGhpcy5zdGF0ZUNoYW5nZXMuY29tcGxldGUoKSx0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXImJnRoaXMuX2F1dG9maWxsTW9uaXRvci5zdG9wTW9uaXRvcmluZyh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpfW5nRG9DaGVjaygpe3RoaXMubmdDb250cm9sJiZ0aGlzLnVwZGF0ZUVycm9yU3RhdGUoKSx0aGlzLl9kaXJ0eUNoZWNrTmF0aXZlVmFsdWUoKSx0aGlzLl9kaXJ0eUNoZWNrUGxhY2Vob2xkZXIoKX1mb2N1cyh0KXt0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXModCl9X2ZvY3VzQ2hhbmdlZCh0KXt0IT09dGhpcy5mb2N1c2VkJiYodGhpcy5mb2N1c2VkPXQsdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpKX1fb25JbnB1dCgpe31fZGlydHlDaGVja1BsYWNlaG9sZGVyKCl7dmFyIHQsZTtjb25zdCBuPShudWxsPT09KGU9bnVsbD09PSh0PXRoaXMuX2Zvcm1GaWVsZCl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuX2hpZGVDb250cm9sUGxhY2Vob2xkZXIpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmNhbGwodCkpP251bGw6dGhpcy5wbGFjZWhvbGRlcjtpZihuIT09dGhpcy5fcHJldmlvdXNQbGFjZWhvbGRlcil7Y29uc3QgdD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7dGhpcy5fcHJldmlvdXNQbGFjZWhvbGRlcj1uLG4/dC5zZXRBdHRyaWJ1dGUoInBsYWNlaG9sZGVyIixuKTp0LnJlbW92ZUF0dHJpYnV0ZSgicGxhY2Vob2xkZXIiKX19X2RpcnR5Q2hlY2tOYXRpdmVWYWx1ZSgpe2NvbnN0IHQ9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlO3RoaXMuX3ByZXZpb3VzTmF0aXZlVmFsdWUhPT10JiYodGhpcy5fcHJldmlvdXNOYXRpdmVWYWx1ZT10LHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKSl9X3ZhbGlkYXRlVHlwZSgpe2lmKElZLmluZGV4T2YodGhpcy5fdHlwZSk+LTEmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSkKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCnRocm93KGZ1bmN0aW9uIHQoZSl7cmV0dXJuIEVycm9yKGBJbnB1dCB0eXBlICIke2V9IiBpc24ndCBzdXBwb3J0ZWQgYnkgbWF0SW5wdXQuYCl9KSh0aGlzLl90eXBlKX1faXNOZXZlckVtcHR5KCl7cmV0dXJuIHRoaXMuX25ldmVyRW1wdHlJbnB1dFR5cGVzLmluZGV4T2YodGhpcy5fdHlwZSk+LTF9X2lzQmFkSW5wdXQoKXtsZXQgdD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudmFsaWRpdHk7cmV0dXJuIHQmJnQuYmFkSW5wdXR9Z2V0IGVtcHR5KCl7cmV0dXJuISh0aGlzLl9pc05ldmVyRW1wdHkoKXx8dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlfHx0aGlzLl9pc0JhZElucHV0KCl8fHRoaXMuYXV0b2ZpbGxlZCl9Z2V0IHNob3VsZExhYmVsRmxvYXQoKXtpZih0aGlzLl9pc05hdGl2ZVNlbGVjdCl7Y29uc3QgdD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsZT10Lm9wdGlvbnNbMF07cmV0dXJuIHRoaXMuZm9jdXNlZHx8dC5tdWx0aXBsZXx8IXRoaXMuZW1wdHl8fCEhKHQuc2VsZWN0ZWRJbmRleD4tMSYmZSYmZS5sYWJlbCl9cmV0dXJuIHRoaXMuZm9jdXNlZHx8IXRoaXMuZW1wdHl9c2V0RGVzY3JpYmVkQnlJZHModCl7dC5sZW5ndGg/dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1kZXNjcmliZWRieSIsdC5qb2luKCIgIikpOnRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtZGVzY3JpYmVkYnkiKX1vbkNvbnRhaW5lckNsaWNrKCl7dGhpcy5mb2N1c2VkfHx0aGlzLmZvY3VzKCl9fUxZLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxMWSkoU20oaGcpLFNtKHd6KSxTbShNaiwxMCksU20oaVUsOCksU20oUFUsOCksU20oYkgpLFNtKHpZLDEwKSxTbShFWSksU20oYV8pLFNtKFJWLDgpKX0sTFkuybVkaXI9bG8oe3R5cGU6TFksc2VsZWN0b3JzOltbImlucHV0IiwibWF0SW5wdXQiLCIiXSxbInRleHRhcmVhIiwibWF0SW5wdXQiLCIiXSxbInNlbGVjdCIsIm1hdE5hdGl2ZUNvbnRyb2wiLCIiXSxbImlucHV0IiwibWF0TmF0aXZlQ29udHJvbCIsIiJdLFsidGV4dGFyZWEiLCJtYXROYXRpdmVDb250cm9sIiwiIl1dLGhvc3RBdHRyczpbMSwibWF0LWlucHV0LWVsZW1lbnQiLCJtYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sIl0saG9zdFZhcnM6OSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezEmZSYmVm0oImZvY3VzIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9mb2N1c0NoYW5nZWQoITApfSkpKCJibHVyIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9mb2N1c0NoYW5nZWQoITEpfSkpKCJpbnB1dCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5fb25JbnB1dCgpfSkpLDImZSYmKFR1KCJkaXNhYmxlZCIsbi5kaXNhYmxlZCkoInJlcXVpcmVkIixuLnJlcXVpcmVkKSxqcCgiaWQiLG4uaWQpKCJkYXRhLXBsYWNlaG9sZGVyIixuLnBsYWNlaG9sZGVyKSgicmVhZG9ubHkiLG4ucmVhZG9ubHkmJiFuLl9pc05hdGl2ZVNlbGVjdHx8bnVsbCkoImFyaWEtaW52YWxpZCIsbi5lbXB0eSYmbi5yZXF1aXJlZD9udWxsOm4uZXJyb3JTdGF0ZSkoImFyaWEtcmVxdWlyZWQiLG4ucmVxdWlyZWQpLHB1KCJtYXQtaW5wdXQtc2VydmVyIixuLl9pc1NlcnZlcikpfSxpbnB1dHM6e2lkOiJpZCIsZGlzYWJsZWQ6ImRpc2FibGVkIixyZXF1aXJlZDoicmVxdWlyZWQiLHR5cGU6InR5cGUiLHZhbHVlOiJ2YWx1ZSIscmVhZG9ubHk6InJlYWRvbmx5IixwbGFjZWhvbGRlcjoicGxhY2Vob2xkZXIiLGVycm9yU3RhdGVNYXRjaGVyOiJlcnJvclN0YXRlTWF0Y2hlciIsdXNlckFyaWFEZXNjcmliZWRCeTpbImFyaWEtZGVzY3JpYmVkYnkiLCJ1c2VyQXJpYURlc2NyaWJlZEJ5Il19LGV4cG9ydEFzOlsibWF0SW5wdXQiXSxmZWF0dXJlczpbcGcoW3twcm92aWRlOmJWLHVzZUV4aXN0aW5nOkxZfV0pLHhwLEJvXX0pLExZLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOnd6fSx7dHlwZTpNaixkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9XX0se3R5cGU6aVUsZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6UFUsZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6Ykh9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W3pZXX1dfSx7dHlwZTpFWX0se3R5cGU6YV99LHt0eXBlOkFWLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltSVl19XX1dLExZLnByb3BEZWNvcmF0b3JzPXtkaXNhYmxlZDpbe3R5cGU6eHl9XSxpZDpbe3R5cGU6eHl9XSxwbGFjZWhvbGRlcjpbe3R5cGU6eHl9XSxyZXF1aXJlZDpbe3R5cGU6eHl9XSx0eXBlOlt7dHlwZTp4eX1dLGVycm9yU3RhdGVNYXRjaGVyOlt7dHlwZTp4eX1dLHVzZXJBcmlhRGVzY3JpYmVkQnk6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWRlc2NyaWJlZGJ5Il19XSx2YWx1ZTpbe3R5cGU6eHl9XSxyZWFkb25seTpbe3R5cGU6eHl9XSxfZm9jdXNDaGFuZ2VkOlt7dHlwZTp3eSxhcmdzOlsiZm9jdXMiLFsidHJ1ZSJdXX0se3R5cGU6d3ksYXJnczpbImJsdXIiLFsiZmFsc2UiXV19XSxfb25JbnB1dDpbe3R5cGU6d3ksYXJnczpbImlucHV0Il19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChMWSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJpbnB1dFttYXRJbnB1dF0sIHRleHRhcmVhW21hdElucHV0XSwgc2VsZWN0W21hdE5hdGl2ZUNvbnRyb2xdLFxuICAgICAgaW5wdXRbbWF0TmF0aXZlQ29udHJvbF0sIHRleHRhcmVhW21hdE5hdGl2ZUNvbnRyb2xdIixleHBvcnRBczoibWF0SW5wdXQiLGhvc3Q6e2NsYXNzOiJtYXQtaW5wdXQtZWxlbWVudCBtYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sIiwiW2NsYXNzLm1hdC1pbnB1dC1zZXJ2ZXJdIjoiX2lzU2VydmVyIiwiW2F0dHIuaWRdIjoiaWQiLCJbYXR0ci5kYXRhLXBsYWNlaG9sZGVyXSI6InBsYWNlaG9sZGVyIiwiW2Rpc2FibGVkXSI6ImRpc2FibGVkIiwiW3JlcXVpcmVkXSI6InJlcXVpcmVkIiwiW2F0dHIucmVhZG9ubHldIjoicmVhZG9ubHkgJiYgIV9pc05hdGl2ZVNlbGVjdCB8fCBudWxsIiwiW2F0dHIuYXJpYS1pbnZhbGlkXSI6IihlbXB0eSAmJiByZXF1aXJlZCkgPyBudWxsIDogZXJyb3JTdGF0ZSIsIlthdHRyLmFyaWEtcmVxdWlyZWRdIjoicmVxdWlyZWQifSxwcm92aWRlcnM6W3twcm92aWRlOmJWLHVzZUV4aXN0aW5nOkxZfV19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6d3p9LHt0eXBlOk1qLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn1dfSx7dHlwZTppVSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpQVSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpiSH0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbelldfV19LHt0eXBlOkVZfSx7dHlwZTphX30se3R5cGU6QVYsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1JWXX1dfV19KSx7aWQ6W3t0eXBlOnh5fV0sZGlzYWJsZWQ6W3t0eXBlOnh5fV0scmVxdWlyZWQ6W3t0eXBlOnh5fV0sdHlwZTpbe3R5cGU6eHl9XSx2YWx1ZTpbe3R5cGU6eHl9XSxyZWFkb25seTpbe3R5cGU6eHl9XSxfZm9jdXNDaGFuZ2VkOlt7dHlwZTp3eSxhcmdzOlsiZm9jdXMiLFsidHJ1ZSJdXX0se3R5cGU6d3ksYXJnczpbImJsdXIiLFsiZmFsc2UiXV19XSxfb25JbnB1dDpbe3R5cGU6d3ksYXJnczpbImlucHV0Il19XSxwbGFjZWhvbGRlcjpbe3R5cGU6eHl9XSxlcnJvclN0YXRlTWF0Y2hlcjpbe3R5cGU6eHl9XSx1c2VyQXJpYURlc2NyaWJlZEJ5Olt7dHlwZTp4eSxhcmdzOlsiYXJpYS1kZXNjcmliZWRieSJdfV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIEJZe31mdW5jdGlvbiBWWSh0LGUpe2lmKDEmdCYmKFJtKDAsIm1hdC1lcnJvciIpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpO3JjKDEpLER1KCIgUmVsb2FkIHBlcmlvZCBoYXMgdG8gYmUgbWluaW11bSBvZiAiLHQuTUlOX1JFTE9BRF9QRVJJT0RfSU5fUywiIHNlY29uZHMuICIpfX1mdW5jdGlvbiBqWSh0LGUpezEmdCYmKFJtKDAsIm1hdC1lcnJvciIpLGt1KDEsIiBQYWdlIHNpemUgaGFzIHRvIGJlIGEgcG9zaXRpdmUgaW50ZWdlci4gIiksQW0oKSl9QlkuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEJZKX0sQlkuybVtb2Q9YW8oe3R5cGU6Qll9KSxCWS7JtWluaj12bih7cHJvdmlkZXJzOltiSF0saW1wb3J0czpbW1RZLFRWLFhJXSxUWSxUVl19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEJZLFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltMWSxOWV0saW1wb3J0czpbVFksVFYsWEldLGV4cG9ydHM6W1RZLFRWLExZLE5ZXSxwcm92aWRlcnM6W2JIXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKEJZLHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bTFksTlldfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1RZLFRWLFhJXX0sZXhwb3J0czpmdW5jdGlvbigpe3JldHVybltUWSxUVixMWSxOWV19fSk7Y2xhc3MgVVl7Y29uc3RydWN0b3IoKXt0aGlzLnJlbG9hZFRvZ2dsZWQ9bmV3IExoLHRoaXMucmVsb2FkUGVyaW9kSW5Nc0NoYW5nZWQ9bmV3IExoLHRoaXMucGFnZVNpemVDaGFuZ2VkPW5ldyBMaCx0aGlzLk1JTl9SRUxPQURfUEVSSU9EX0lOX1M9MzAsdGhpcy5yZWxvYWRQZXJpb2RDb250cm9sPW5ldyAkaih0aGlzLk1JTl9SRUxPQURfUEVSSU9EX0lOX1MsW3FWLnJlcXVpcmVkLHFWLm1pbih0aGlzLk1JTl9SRUxPQURfUEVSSU9EX0lOX1MpXSksdGhpcy5wYWdpbmF0aW9uQ29udHJvbD1uZXcgJGooMSxbcVYucmVxdWlyZWQscVYubWluKDEpLHQ9Pntjb25zdCBlPU51bWJlcih0LnZhbHVlKTtyZXR1cm4gTWF0aC5yb3VuZChlKT09PXQudmFsdWU/bnVsbDp7aW50ZWdlcjp7dmFsdWU6dC52YWx1ZX19fV0pLHRoaXMubmdVbnN1YnNjcmliZT1uZXcgSX1uZ09uSW5pdCgpe3RoaXMucmVsb2FkUGVyaW9kQ29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpLGdlKDUwMCksY2UoKCgpPT50aGlzLnJlbG9hZFBlcmlvZENvbnRyb2wudmFsaWQpKSkuc3Vic2NyaWJlKCgoKT0+e3RoaXMucmVsb2FkUGVyaW9kQ29udHJvbC52YWxpZCYmdGhpcy5yZWxvYWRQZXJpb2RJbk1zQ2hhbmdlZC5lbWl0KDFlMyp0aGlzLnJlbG9hZFBlcmlvZENvbnRyb2wudmFsdWUpfSkpLHRoaXMucGFnaW5hdGlvbkNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoSWUodGhpcy5uZ1Vuc3Vic2NyaWJlKSxnZSg1MDApLGNlKCgoKT0+dGhpcy5wYWdpbmF0aW9uQ29udHJvbC52YWxpZCkpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5wYWdlU2l6ZUNoYW5nZWQuZW1pdCh0aGlzLnBhZ2luYXRpb25Db250cm9sLnZhbHVlKX0pKX1uZ09uRGVzdHJveSgpe3RoaXMubmdVbnN1YnNjcmliZS5uZXh0KCksdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCl9bmdPbkNoYW5nZXModCl7aWYodC5yZWxvYWRQZXJpb2RJbk1zKXtjb25zdCBlPXQucmVsb2FkUGVyaW9kSW5NcztlLnByZXZpb3VzVmFsdWUhPT1lLmN1cnJlbnRWYWx1ZSYmdGhpcy5yZWxvYWRQZXJpb2RDb250cm9sLnNldFZhbHVlKGUuY3VycmVudFZhbHVlLzFlMyl9aWYodC5yZWxvYWRFbmFibGVkJiYodC5yZWxvYWRFbmFibGVkLmN1cnJlbnRWYWx1ZT90aGlzLnJlbG9hZFBlcmlvZENvbnRyb2wuZW5hYmxlKCk6dGhpcy5yZWxvYWRQZXJpb2RDb250cm9sLmRpc2FibGUoKSksdC5wYWdlU2l6ZSl7Y29uc3QgZT10LnBhZ2VTaXplO2UucHJldmlvdXNWYWx1ZSE9PWUuY3VycmVudFZhbHVlJiZ0aGlzLnBhZ2luYXRpb25Db250cm9sLnNldFZhbHVlKGUuY3VycmVudFZhbHVlKX19b25SZWxvYWRUb2dnbGUoKXt0aGlzLnJlbG9hZFRvZ2dsZWQuZW1pdCgpfX1VWS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VVkpfSxVWS7JtWNtcD10byh7dHlwZTpVWSxzZWxlY3RvcnM6W1sic2V0dGluZ3MtZGlhbG9nLWNvbXBvbmVudCJdXSxpbnB1dHM6e3JlbG9hZEVuYWJsZWQ6InJlbG9hZEVuYWJsZWQiLHJlbG9hZFBlcmlvZEluTXM6InJlbG9hZFBlcmlvZEluTXMiLHBhZ2VTaXplOiJwYWdlU2l6ZSJ9LG91dHB1dHM6e3JlbG9hZFRvZ2dsZWQ6InJlbG9hZFRvZ2dsZWQiLHJlbG9hZFBlcmlvZEluTXNDaGFuZ2VkOiJyZWxvYWRQZXJpb2RJbk1zQ2hhbmdlZCIscGFnZVNpemVDaGFuZ2VkOiJwYWdlU2l6ZUNoYW5nZWQifSxmZWF0dXJlczpbQm9dLGRlY2xzOjE0LHZhcnM6NSxjb25zdHM6W1sxLCJyZWxvYWQtdG9nZ2xlIl0sWzMsImNoZWNrZWQiLCJjaGFuZ2UiXSxbIm1hdElucHV0IiwiIiwidHlwZSIsIm51bWJlciIsInBsYWNlaG9sZGVyIiwiUmVsb2FkIFBlcmlvZCIsMSwicmVsb2FkLXBlcmlvZCIsMywiZm9ybUNvbnRyb2wiXSxbNCwibmdJZiJdLFsibWF0SW5wdXQiLCIiLCJ0eXBlIiwibnVtYmVyIiwicGxhY2Vob2xkZXIiLCJQYWdpbmF0aW9uIExpbWl0IiwxLCJwYWdlLXNpemUiLDMsImZvcm1Db250cm9sIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJoMyIpLGt1KDEsIlNldHRpbmdzIiksQW0oKSxSbSgyLCJkaXYiKSxSbSgzLCJkaXYiLDApLFJtKDQsIm1hdC1jaGVja2JveCIsMSksVm0oImNoYW5nZSIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblJlbG9hZFRvZ2dsZSgpfSkpLGt1KDUsIlJlbG9hZCBkYXRhIiksQW0oKSxBbSgpLFJtKDYsImRpdiIpLFJtKDcsIm1hdC1mb3JtLWZpZWxkIiksVG0oOCwiaW5wdXQiLDIpLEFtKCksUXAoOSxWWSwyLDEsIm1hdC1lcnJvciIsMyksQW0oKSxBbSgpLFJtKDEwLCJkaXYiKSxSbSgxMSwibWF0LWZvcm0tZmllbGQiKSxUbSgxMiwiaW5wdXQiLDQpLEFtKCksUXAoMTMsalksMiwwLCJtYXQtZXJyb3IiLDMpLEFtKCkpLDImZSYmKHJjKDQpLERtKCJjaGVja2VkIixuLnJlbG9hZEVuYWJsZWQpLHJjKDQpLERtKCJmb3JtQ29udHJvbCIsbi5yZWxvYWRQZXJpb2RDb250cm9sKSxyYygxKSxEbSgibmdJZiIsbi5yZWxvYWRQZXJpb2RDb250cm9sLmhhc0Vycm9yKCJtaW4iKXx8bi5yZWxvYWRQZXJpb2RDb250cm9sLmhhc0Vycm9yKCJyZXF1aXJlZCIpKSxyYygzKSxEbSgiZm9ybUNvbnRyb2wiLG4ucGFnaW5hdGlvbkNvbnRyb2wpLHJjKDEpLERtKCJuZ0lmIixuLnBhZ2luYXRpb25Db250cm9sLmludmFsaWQpKX0sZGlyZWN0aXZlczpbT1ksQVYsTFksZlUsVlYseGoseFUsZE0sZ1ZdLHN0eWxlczpbIltfbmdob3N0LSVDT01QJV0ge1xuICBmb250LXNpemU6IDE1cHg7XG59XG5cbltfbmdob3N0LSVDT01QJV0gICAgPiBkaXZbX25nY29udGVudC0lQ09NUCVdIHtcbiAgbWFyZ2luOiAxMHB4IDA7XG59XG5cbltfbmdob3N0LSVDT01QJV0gICAgPiBbX25nY29udGVudC0lQ09NUCVdOmZpcnN0LWNoaWxkIHtcbiAgbWFyZ2luLXRvcDogMDtcbn1cblxuW19uZ2hvc3QtJUNPTVAlXSAgICA+IFtfbmdjb250ZW50LSVDT01QJV06bGFzdC1jaGlsZCB7XG4gIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbmgzW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGZvbnQtc2l6ZTogMjBweDtcbn1cblxuLnJlbG9hZC10b2dnbGVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcbn0iXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoVVksW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3Rvcjoic2V0dGluZ3MtZGlhbG9nLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6InNldHRpbmdzX2RpYWxvZ19jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9zZXR0aW5nc19kaWFsb2dfY29tcG9uZW50LmNzcyJdfV19XSxudWxsLHtyZWxvYWRFbmFibGVkOlt7dHlwZTp4eX1dLHJlbG9hZFBlcmlvZEluTXM6W3t0eXBlOnh5fV0scGFnZVNpemU6W3t0eXBlOnh5fV0scmVsb2FkVG9nZ2xlZDpbe3R5cGU6T3l9XSxyZWxvYWRQZXJpb2RJbk1zQ2hhbmdlZDpbe3R5cGU6T3l9XSxwYWdlU2l6ZUNoYW5nZWQ6W3t0eXBlOk95fV19KTtjbGFzcyBHWXtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5yZWxvYWRFbmFibGVkJD10aGlzLnN0b3JlLnNlbGVjdChETiksdGhpcy5yZWxvYWRQZXJpb2RJbk1zJD10aGlzLnN0b3JlLnNlbGVjdChFTiksdGhpcy5wYWdlU2l6ZSQ9dGhpcy5zdG9yZS5zZWxlY3QoUk4pfW9uUmVsb2FkVG9nZ2xlZCgpe3RoaXMuc3RvcmUuZGlzcGF0Y2godk4oKSl9b25SZWxvYWRQZXJpb2RJbk1zQ2hhbmdlZCh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKHhOKHtwZXJpb2RJbk1zOnR9KSl9b25QYWdlU2l6ZUNoYW5nZWQodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChPTih7c2l6ZTp0fSkpfX1HWS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8R1kpKFNtKEl3KSl9LEdZLsm1Y21wPXRvKHt0eXBlOkdZLHNlbGVjdG9yczpbWyJzZXR0aW5ncy1kaWFsb2ciXV0sZGVjbHM6NCx2YXJzOjksY29uc3RzOltbMywicmVsb2FkRW5hYmxlZCIsInJlbG9hZFBlcmlvZEluTXMiLCJwYWdlU2l6ZSIsInJlbG9hZFRvZ2dsZWQiLCJyZWxvYWRQZXJpb2RJbk1zQ2hhbmdlZCIsInBhZ2VTaXplQ2hhbmdlZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwic2V0dGluZ3MtZGlhbG9nLWNvbXBvbmVudCIsMCksVm0oInJlbG9hZFRvZ2dsZWQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25SZWxvYWRUb2dnbGVkKCl9KSkoInJlbG9hZFBlcmlvZEluTXNDaGFuZ2VkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblJlbG9hZFBlcmlvZEluTXNDaGFuZ2VkKGUpfSkpKCJwYWdlU2l6ZUNoYW5nZWQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uUGFnZVNpemVDaGFuZ2VkKGUpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBaCgzLCJhc3luYyIpLEFtKCkpLDImZSYmRG0oInJlbG9hZEVuYWJsZWQiLFRoKDEsMyxuLnJlbG9hZEVuYWJsZWQkKSkoInJlbG9hZFBlcmlvZEluTXMiLFRoKDIsNSxuLnJlbG9hZFBlcmlvZEluTXMkKSkoInBhZ2VTaXplIixUaCgzLDcsbi5wYWdlU2l6ZSQpKX0sZGlyZWN0aXZlczpbVVldLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChHWSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJzZXR0aW5ncy1kaWFsb2ciLHRlbXBsYXRlOidcbiAgICA8c2V0dGluZ3MtZGlhbG9nLWNvbXBvbmVudFxuICAgICAgW3JlbG9hZEVuYWJsZWRdPSJyZWxvYWRFbmFibGVkJCB8IGFzeW5jIlxuICAgICAgW3JlbG9hZFBlcmlvZEluTXNdPSJyZWxvYWRQZXJpb2RJbk1zJCB8IGFzeW5jIlxuICAgICAgW3BhZ2VTaXplXT0icGFnZVNpemUkIHwgYXN5bmMiXG4gICAgICAocmVsb2FkVG9nZ2xlZCk9Im9uUmVsb2FkVG9nZ2xlZCgpIlxuICAgICAgKHJlbG9hZFBlcmlvZEluTXNDaGFuZ2VkKT0ib25SZWxvYWRQZXJpb2RJbk1zQ2hhbmdlZCgkZXZlbnQpIlxuICAgICAgKHBhZ2VTaXplQ2hhbmdlZCk9Im9uUGFnZVNpemVDaGFuZ2VkKCRldmVudCkiXG4gICAgPjwvc2V0dGluZ3MtZGlhbG9nLWNvbXBvbmVudD5cbiAgJ31dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSxudWxsKTtjbGFzcyBXWXtjb25zdHJ1Y3Rvcih0KXt0aGlzLmRpYWxvZz10fWlzQnV0dG9uRGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5zZXR0aW5nc0xvYWRTdGF0ZT09PXlFLk5PVF9MT0FERUR8fHRoaXMuc2V0dGluZ3NMb2FkU3RhdGU9PT15RS5MT0FESU5HfW9wZW5EaWFsb2coKXt0aGlzLmRpYWxvZy5vcGVuKEdZLHt3aWR0aDoiNDAwcHgifSl9fVdZLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxXWSkoU20ob1cpKX0sV1kuybVjbXA9dG8oe3R5cGU6V1ksc2VsZWN0b3JzOltbInNldHRpbmdzLWJ1dHRvbi1jb21wb25lbnQiXV0saW5wdXRzOntzZXR0aW5nc0xvYWRTdGF0ZToic2V0dGluZ3NMb2FkU3RhdGUifSxkZWNsczoyLHZhcnM6MSxjb25zdHM6W1sibWF0LWljb24tYnV0dG9uIiwiIiwzLCJkaXNhYmxlZCIsImNsaWNrIl0sWyJzdmdJY29uIiwic2V0dGluZ3NfMjRweCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiYnV0dG9uIiwwKSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub3BlbkRpYWxvZygpfSkpLFRtKDEsIm1hdC1pY29uIiwxKSxBbSgpKSwyJmUmJkRtKCJkaXNhYmxlZCIsbi5pc0J1dHRvbkRpc2FibGVkKCkpfSxkaXJlY3RpdmVzOltYSCxEV10sZW5jYXBzdWxhdGlvbjoyfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChXWSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJzZXR0aW5ncy1idXR0b24tY29tcG9uZW50Iix0ZW1wbGF0ZTonXG4gICAgPGJ1dHRvblxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBbZGlzYWJsZWRdPSJpc0J1dHRvbkRpc2FibGVkKCkiXG4gICAgICAoY2xpY2spPSJvcGVuRGlhbG9nKCkiXG4gICAgPlxuICAgICAgPG1hdC1pY29uIHN2Z0ljb249InNldHRpbmdzXzI0cHgiPjwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gICd9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpvV31dfSkse3NldHRpbmdzTG9hZFN0YXRlOlt7dHlwZTp4eX1dfSk7Y2xhc3MgWVl7Y29uc3RydWN0b3IodCl7dGhpcy5zdG9yZT10LHRoaXMuc2V0dGluZ3NMb2FkU3RhdGUkPXRoaXMuc3RvcmUuc2VsZWN0KFNOKX19WVkuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFlZKShTbShJdykpfSxZWS7JtWNtcD10byh7dHlwZTpZWSxzZWxlY3RvcnM6W1sic2V0dGluZ3MtYnV0dG9uIl1dLGRlY2xzOjIsdmFyczozLGNvbnN0czpbWzMsInNldHRpbmdzTG9hZFN0YXRlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihUbSgwLCJzZXR0aW5ncy1idXR0b24tY29tcG9uZW50IiwwKSxBaCgxLCJhc3luYyIpKSwyJmUmJkRtKCJzZXR0aW5nc0xvYWRTdGF0ZSIsVGgoMSwxLG4uc2V0dGluZ3NMb2FkU3RhdGUkKSl9LGRpcmVjdGl2ZXM6W1dZXSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246Mn0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWVksW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3Rvcjoic2V0dGluZ3MtYnV0dG9uIix0ZW1wbGF0ZTonXG4gICAgPHNldHRpbmdzLWJ1dHRvbi1jb21wb25lbnRcbiAgICAgIFtzZXR0aW5nc0xvYWRTdGF0ZV09InNldHRpbmdzTG9hZFN0YXRlJCB8IGFzeW5jIlxuICAgID48L3NldHRpbmdzLWJ1dHRvbi1jb21wb25lbnQ+XG4gICd9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y2xhc3MgcVl7fXFZLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxxWSl9LHFZLsm1Y21wPXRvKHt0eXBlOnFZLHNlbGVjdG9yczpbWyJhcHAtaGVhZGVyIl1dLGRlY2xzOjEwLHZhcnM6MCxjb25zdHM6W1sxLCJicmFuZCJdLFsxLCJwbHVnaW5zIl0sWyJtYXQtaWNvbi1idXR0b24iLCIiLCJocmVmIiwiaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIiwicmVsIiwibm9vcGVuZXIgbm9yZWZlcnJlciIsInRhcmdldCIsIl9ibGFuayIsImFyaWEtbGFiZWwiLCJIZWxwIiwxLCJyZWFkbWUiXSxbInN2Z0ljb24iLCJoZWxwX291dGxpbmVfMjRweCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwibWF0LXRvb2xiYXIiKSxSbSgxLCJzcGFuIiwwKSxrdSgyLCJUZW5zb3JCb2FyZCIpLEFtKCksVG0oMywicGx1Z2luLXNlbGVjdG9yIiwxKSxUbSg0LCJ0YmRldi11cGxvYWQtYnV0dG9uIiksVG0oNSwiYXBwLWhlYWRlci1kYXJrLW1vZGUtdG9nZ2xlIiksVG0oNiwiYXBwLWhlYWRlci1yZWxvYWQiKSxUbSg3LCJzZXR0aW5ncy1idXR0b24iKSxSbSg4LCJhIiwyKSxUbSg5LCJtYXQtaWNvbiIsMyksQW0oKSxBbSgpKX0sZGlyZWN0aXZlczpbZUIsVkcsSVcsY1kscFksWVksS0gsRFddLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfW1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7Y29sb3I6I2ZmZjtkaXNwbGF5OmZsZXg7aGVpZ2h0OjY0cHg7b3ZlcmZsb3c6aGlkZGVuO3dpZHRoOjEwMCV9dGJkZXYtdXBsb2FkLWJ1dHRvbi5zaG93bltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgOHB4IDAgMTZweH0uYnJhbmRbX25nY29udGVudC0lQ09NUCVdLCAucmVhZG1lW19uZ2NvbnRlbnQtJUNPTVAlXSwgYXBwLWhlYWRlci1yZWxvYWRbX25nY29udGVudC0lQ09NUCVdLCBzZXR0aW5ncy1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZsZXg6MCAwIGF1dG99LmJyYW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtsZXR0ZXItc3BhY2luZzotMC4wMjVlbTttYXJnaW4tbGVmdDoxMHB4O3RleHQtcmVuZGVyaW5nOm9wdGltaXplTGVnaWJpbGl0eX0ucGx1Z2luc1tfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtmbGV4OjEgMSBhdXRvO2ZvbnQtc2l6ZToxNHB4O2hlaWdodDoxMDAlO292ZXJmbG93OmhpZGRlbn0nXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgocVksW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiYXBwLWhlYWRlciIsdGVtcGxhdGU6J1xuICAgIDxtYXQtdG9vbGJhcj5cbiAgICAgIDxzcGFuIGNsYXNzPSJicmFuZCI+VGVuc29yQm9hcmQ8L3NwYW4+XG4gICAgICA8cGx1Z2luLXNlbGVjdG9yIGNsYXNzPSJwbHVnaW5zIj48L3BsdWdpbi1zZWxlY3Rvcj5cbiAgICAgIDx0YmRldi11cGxvYWQtYnV0dG9uPjwvdGJkZXYtdXBsb2FkLWJ1dHRvbj5cbiAgICAgIDxhcHAtaGVhZGVyLWRhcmstbW9kZS10b2dnbGU+PC9hcHAtaGVhZGVyLWRhcmstbW9kZS10b2dnbGU+XG4gICAgICA8YXBwLWhlYWRlci1yZWxvYWQ+PC9hcHAtaGVhZGVyLXJlbG9hZD5cbiAgICAgIDxzZXR0aW5ncy1idXR0b24+PC9zZXR0aW5ncy1idXR0b24+XG4gICAgICA8YVxuICAgICAgICBjbGFzcz0icmVhZG1lIlxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIlxuICAgICAgICByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiXG4gICAgICAgIHRhcmdldD0iX2JsYW5rIlxuICAgICAgICBhcmlhLWxhYmVsPSJIZWxwIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj0iaGVscF9vdXRsaW5lXzI0cHgiPjwvbWF0LWljb24+XG4gICAgICA8L2E+XG4gICAgPC9tYXQtdG9vbGJhcj5cbiAgJyxzdHlsZVVybHM6WyJoZWFkZXJfY29tcG9uZW50LmNzcyJdfV19XSxudWxsLG51bGwpO2NvbnN0IFpZPVsicm91dGVDb250YWluZXIiXTtjbGFzcyBYWXtjb25zdHJ1Y3Rvcih0KXt0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcj10fW5nT25DaGFuZ2VzKHQpe2NvbnN0IGU9dC5hY3RpdmVOZ0NvbXBvbmVudDtpZihlJiYodGhpcy5yb3V0ZUNvbnRhaW5lci5jbGVhcigpLGUuY3VycmVudFZhbHVlKSl7Y29uc3QgdD10aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShlLmN1cnJlbnRWYWx1ZSk7dGhpcy5yb3V0ZUNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQodCl9fX1YWS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WFkpKFNtKHVnKSl9LFhZLsm1Y21wPXRvKHt0eXBlOlhZLHNlbGVjdG9yczpbWyJyb3V0ZXItb3V0bGV0LWNvbXBvbmVudCJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmUWgoWlksNyxlaCksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5yb3V0ZUNvbnRhaW5lcj10LmZpcnN0KX19LGlucHV0czp7YWN0aXZlTmdDb21wb25lbnQ6ImFjdGl2ZU5nQ29tcG9uZW50In0sZmVhdHVyZXM6W0JvXSxkZWNsczoyLHZhcnM6MCxjb25zdHM6W1sicm91dGVDb250YWluZXIiLCIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmSW0oMCxudWxsLDApfSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFhZLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InJvdXRlci1vdXRsZXQtY29tcG9uZW50Iix0ZW1wbGF0ZToiIDxuZy1jb250YWluZXIgI3JvdXRlQ29udGFpbmVyPjwvbmctY29udGFpbmVyPiAiLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp1Z31dfSkse3JvdXRlQ29udGFpbmVyOlt7dHlwZTpaYSxhcmdzOlsicm91dGVDb250YWluZXIiLHtzdGF0aWM6ITAscmVhZDplaH1dfV0sYWN0aXZlTmdDb21wb25lbnQ6W3t0eXBlOnh5fV19KTtjbGFzcyBLWXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuc3RvcmU9dCx0aGlzLnJlZ2lzdHJ5PWUsdGhpcy5hY3RpdmVOZ0NvbXBvbmVudCQ9V3QoW3RoaXMuc3RvcmUuc2VsZWN0KFNTKSx0aGlzLnN0b3JlLnNlbGVjdChEUyldKS5waXBlKEl0KCgoW3QsZV0pPT50P251bGwhPT1lJiZRayhlLnJvdXRlS2luZCxlLnBhcmFtcykhPT1Rayh0LnJvdXRlS2luZCx0LnBhcmFtcyk/bnVsbDp0aGlzLnJlZ2lzdHJ5LmdldE5nQ29tcG9uZW50QnlSb3V0ZUtpbmQodC5yb3V0ZUtpbmQpOm51bGwpKSl9fXZhciBKWTtLWS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8S1kpKFNtKEl3KSxTbShQUykpfSxLWS7JtWNtcD10byh7dHlwZTpLWSxzZWxlY3RvcnM6W1sicm91dGVyLW91dGxldCJdXSxkZWNsczoyLHZhcnM6Myxjb25zdHM6W1szLCJhY3RpdmVOZ0NvbXBvbmVudCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwicm91dGVyLW91dGxldC1jb21wb25lbnQiLDApLEFoKDEsImFzeW5jIikpLDImZSYmRG0oImFjdGl2ZU5nQ29tcG9uZW50IixUaCgxLDEsbi5hY3RpdmVOZ0NvbXBvbmVudCQpKX0sZGlyZWN0aXZlczpbWFldLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChLWSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJyb3V0ZXItb3V0bGV0Iix0ZW1wbGF0ZTonXG4gICAgPHJvdXRlci1vdXRsZXQtY29tcG9uZW50XG4gICAgICBbYWN0aXZlTmdDb21wb25lbnRdPSJhY3RpdmVOZ0NvbXBvbmVudCQgfCBhc3luYyJcbiAgICA+PC9yb3V0ZXItb3V0bGV0LWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9LHt0eXBlOlBTfV19KSxudWxsKSwoZnVuY3Rpb24odCl7dFt0LkFDVElWRV9QTFVHSU49MF09IkFDVElWRV9QTFVHSU4ifSkoSll8fChKWT17fSkpO2NsYXNzIFFZe2NvbnN0cnVjdG9yKHQpe3RoaXMuZGVlcExpbmtlcj10LHRoaXMub25WYWx1ZUNoYW5nZT1uZXcgTGgsdGhpcy5uZ1Vuc3Vic2NyaWJlPW5ldyBJLHRoaXMub25IYXNoQ2hhbmdlPW9lKHdpbmRvdywicG9wc3RhdGUiLHtwYXNzaXZlOiEwfSkucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpKX1uZ09uSW5pdCgpe3RoaXMub25IYXNoQ2hhbmdlLnN1YnNjcmliZSgoKCk9Pntjb25zdCB0PXRoaXMuZGVlcExpbmtlci5nZXRQbHVnaW5JZCgpO3QhPT10aGlzLmFjdGl2ZVBsdWdpbklkJiZ0aGlzLm9uVmFsdWVDaGFuZ2UuZW1pdCh7cHJvcDpKWS5BQ1RJVkVfUExVR0lOLHZhbHVlOnR9KX0pKX1uZ09uRGVzdHJveSgpe3RoaXMubmdVbnN1YnNjcmliZS5uZXh0KCksdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCl9bmdPbkNoYW5nZXModCl7aWYodC5hY3RpdmVQbHVnaW5JZCl7Y29uc3QgZT10LmFjdGl2ZVBsdWdpbklkO3RoaXMuZGVlcExpbmtlci5zZXRQbHVnaW5JZChudWxsPT09ZS5jdXJyZW50VmFsdWU/IiI6ZS5jdXJyZW50VmFsdWUse2RlZmF1bHRWYWx1ZToiIix1c2VMb2NhdGlvblJlcGxhY2U6bnVsbD09PWUucHJldmlvdXNWYWx1ZXx8ZS5maXJzdENoYW5nZX0pfX19UVkuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFFZKShTbShWUykpfSxRWS7JtWNtcD10byh7dHlwZTpRWSxzZWxlY3RvcnM6W1siaGFzaC1zdG9yYWdlLWNvbXBvbmVudCJdXSxpbnB1dHM6e2FjdGl2ZVBsdWdpbklkOiJhY3RpdmVQbHVnaW5JZCJ9LG91dHB1dHM6e29uVmFsdWVDaGFuZ2U6Im9uVmFsdWVDaGFuZ2UifSxmZWF0dXJlczpbQm9dLGRlY2xzOjAsdmFyczowLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXt9LGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUVksW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiaGFzaC1zdG9yYWdlLWNvbXBvbmVudCIsdGVtcGxhdGU6IiIsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlZTfV19KSx7YWN0aXZlUGx1Z2luSWQ6W3t0eXBlOnh5fV0sb25WYWx1ZUNoYW5nZTpbe3R5cGU6T3l9XX0pO2NsYXNzICRZe2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLmFjdGl2ZVBsdWdpbklkJD10aGlzLnN0b3JlLnBpcGUoRncoTVIpKX1vblZhbHVlQ2hhbmdlZCh0KXtzd2l0Y2godC5wcm9wKXtjYXNlIEpZLkFDVElWRV9QTFVHSU46dGhpcy5zdG9yZS5kaXNwYXRjaChDRSh7cGx1Z2luOnQudmFsdWV9KSl9fX0kWS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8JFkpKFNtKEl3KSl9LCRZLsm1Y21wPXRvKHt0eXBlOiRZLHNlbGVjdG9yczpbWyJoYXNoLXN0b3JhZ2UiXV0sZGVjbHM6Mix2YXJzOjMsY29uc3RzOltbMywiYWN0aXZlUGx1Z2luSWQiLCJvblZhbHVlQ2hhbmdlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJoYXNoLXN0b3JhZ2UtY29tcG9uZW50IiwwKSxWbSgib25WYWx1ZUNoYW5nZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25WYWx1ZUNoYW5nZWQoZSl9KSksQWgoMSwiYXN5bmMiKSxBbSgpKSwyJmUmJkRtKCJhY3RpdmVQbHVnaW5JZCIsVGgoMSwxLG4uYWN0aXZlUGx1Z2luSWQkKSl9LGRpcmVjdGl2ZXM6W1FZXSxwaXBlczpbd01dLHN0eWxlczpbIltfbmdob3N0LSVDT01QJV0ge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfSJdLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCgkWSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJoYXNoLXN0b3JhZ2UiLHRlbXBsYXRlOidcbiAgICA8aGFzaC1zdG9yYWdlLWNvbXBvbmVudFxuICAgICAgW2FjdGl2ZVBsdWdpbklkXT0iYWN0aXZlUGx1Z2luSWQkIHwgYXN5bmMiXG4gICAgICAob25WYWx1ZUNoYW5nZSk9Im9uVmFsdWVDaGFuZ2VkKCRldmVudCkiXG4gICAgPlxuICAgIDwvaGFzaC1zdG9yYWdlLWNvbXBvbmVudD5cbiAgJyxzdHlsZXM6WyJcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICAiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NsYXNzIHRxe25nT25DaGFuZ2VzKHQpe3QudGl0bGUmJihmdW5jdGlvbiBlKHQpe2RvY3VtZW50LnRpdGxlPXR9KSh0LnRpdGxlLmN1cnJlbnRWYWx1ZSl9fXRxLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx0cSl9LHRxLsm1Y21wPXRvKHt0eXBlOnRxLHNlbGVjdG9yczpbWyJwYWdlLXRpdGxlLWNvbXBvbmVudCJdXSxpbnB1dHM6e3RpdGxlOiJ0aXRsZSJ9LGZlYXR1cmVzOltCb10sZGVjbHM6MCx2YXJzOjAsdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pe30sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh0cSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJwYWdlLXRpdGxlLWNvbXBvbmVudCIsdGVtcGxhdGU6IiIsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7dGl0bGU6W3t0eXBlOnh5fV19KTtjb25zdCBlcT0iVGVuc29yQm9hcmQiO2NsYXNzIG5xe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5zdG9yZT10LHRoaXMuY3VzdG9tQnJhbmROYW1lPWUsdGhpcy5nZXRFeHBlcmltZW50SWQkPXRoaXMuc3RvcmUuc2VsZWN0KFRTKS5waXBlKEl0KCh0PT5udWxsPT10P3ZvaWQgMDp0WzBdKSkpLHRoaXMuZXhwZXJpbWVudE5hbWUkPXRoaXMuZ2V0RXhwZXJpbWVudElkJC5waXBlKGNlKEJvb2xlYW4pLFp0KCh0PT50aGlzLnN0b3JlLnNlbGVjdCh1QSx7ZXhwZXJpbWVudElkOnR9KSkpLEl0KCh0PT50P3QubmFtZTpudWxsKSkpLHRoaXMudGl0bGUkPXRoaXMuc3RvcmUuc2VsZWN0KHhSKS5waXBlKGZlKHRoaXMuc3RvcmUuc2VsZWN0KFJTKSx0aGlzLmV4cGVyaW1lbnROYW1lJCksSXQoKChbdCxlLG5dKT0+e2NvbnN0IG89dGhpcy5jdXN0b21CcmFuZE5hbWV8fGVxO3JldHVybiB0LndpbmRvd190aXRsZT90LndpbmRvd190aXRsZTplPT09WmsuRVhQRVJJTUVOVCYmbj9gJHtufSAtICR7b31gOm99KSksTmUodGhpcy5jdXN0b21CcmFuZE5hbWV8fGVxKSxNZSgpKX19bnEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fG5xKShTbShJdyksU20odUUsOCkpfSxucS7JtWNtcD10byh7dHlwZTpucSxzZWxlY3RvcnM6W1sicGFnZS10aXRsZSJdXSxkZWNsczoyLHZhcnM6Myxjb25zdHM6W1szLCJ0aXRsZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwicGFnZS10aXRsZS1jb21wb25lbnQiLDApLEFoKDEsImFzeW5jIikpLDImZSYmRG0oInRpdGxlIixUaCgxLDEsbi50aXRsZSQpKX0sZGlyZWN0aXZlczpbdHFdLHBpcGVzOlt3TV0sc3R5bGVzOlsiW19uZ2hvc3QtJUNPTVAlXSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9Il0sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKG5xLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InBhZ2UtdGl0bGUiLHRlbXBsYXRlOidcbiAgICA8cGFnZS10aXRsZS1jb21wb25lbnQgW3RpdGxlXT0idGl0bGUkIHwgYXN5bmMiPjwvcGFnZS10aXRsZS1jb21wb25lbnQ+XG4gICcsc3R5bGVzOlsiXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3VFXX1dfV19KSxudWxsKTtjbGFzcyBvcXtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5uZ1Vuc3Vic2NyaWJlPW5ldyBJLHRoaXMuZ2V0UGFnZVNpemUkPXRoaXMuc3RvcmUucGlwZShGdyhSTikpLHRoaXMucGFnaW5hdGVkVmlld1N0b3JlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRmLXBhZ2luYXRlZC12aWV3LXN0b3JlIikudGZfcGFnaW5hdGVkX3ZpZXd9bmdPbkluaXQoKXt0aGlzLmdldFBhZ2VTaXplJC5waXBlKEllKHRoaXMubmdVbnN1YnNjcmliZSksTWUoKSkuc3Vic2NyaWJlKCh0PT57dGhpcy5wYWdpbmF0ZWRWaWV3U3RvcmUuc2V0TGltaXQodCl9KSl9bmdPbkRlc3Ryb3koKXt0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpLHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpfX1vcS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8b3EpKFNtKEl3KSl9LG9xLsm1Y21wPXRvKHt0eXBlOm9xLHNlbGVjdG9yczpbWyJzZXR0aW5ncy1wb2x5bWVyLWludGVyb3AiXV0sZGVjbHM6MCx2YXJzOjAsdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pe30sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChvcSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJzZXR0aW5ncy1wb2x5bWVyLWludGVyb3AiLHRlbXBsYXRlOiIiLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y2xhc3MgaXF7Y29uc3RydWN0b3IodCl7dC5zZWxlY3QoSkQpLnN1YnNjcmliZSgodD0+e2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiZGFyay1tb2RlIix0KX0pKX19aXEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGlxKShTbShJdykpfSxpcS7JtWNtcD10byh7dHlwZTppcSxzZWxlY3RvcnM6W1siZGFyay1tb2RlLXN1cHBvcnRlciJdXSxkZWNsczowLHZhcnM6MCx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7fSxzdHlsZXM6WyJbX25naG9zdC0lQ09NUCVdIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH0iXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoaXEsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiZGFyay1tb2RlLXN1cHBvcnRlciIsdGVtcGxhdGU6IiIsc3R5bGVzOlsiXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSxudWxsKTtjbGFzcyBhcXtjb25zdHJ1Y3Rvcih0KXt0aGlzLnZjUmVmPXR9fWFxLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxhcSkoU20oZWgpKX0sYXEuybVjbXA9dG8oe3R5cGU6YXEsc2VsZWN0b3JzOltbInRiLXdlYmFwcCJdXSxkZWNsczo4LHZhcnM6MCx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwiYXBwLWhlYWRlciIpLFJtKDEsIm1haW4iKSxUbSgyLCJyb3V0ZXItb3V0bGV0IiksQW0oKSxUbSgzLCJhbGVydC1zbmFja2JhciIpLFRtKDQsImhhc2gtc3RvcmFnZSIpLFRtKDUsInBhZ2UtdGl0bGUiKSxUbSg2LCJzZXR0aW5ncy1wb2x5bWVyLWludGVyb3AiKSxUbSg3LCJkYXJrLW1vZGUtc3VwcG9ydGVyIikpfSxkaXJlY3RpdmVzOltxWSxLWSxYTCwkWSxucSxvcSxpcV0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9aHRtbFtfbmdjb250ZW50LSVDT01QJV0sIGJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90byxzYW5zLXNlcmlmO2hlaWdodDoxMDAlO21hcmdpbjowO3BhZGRpbmc6MH1bX25naG9zdC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1ZjVmNTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2hlaWdodDoxMDAlfWFwcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MCAxcHggM3B4IDNweCByZ2JhKDAsMCwwLC4yNSk7ZmxleDowIDA7ei1pbmRleDoxfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIGFwcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICBhcHAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjAgMXB4IDNweCAzcHggcmdiYSgyNTUsMjU1LDI1NSwuMSl9bWFpbltfbmdjb250ZW50LSVDT01QJV17ZmxleC1ncm93OjE7b3ZlcmZsb3c6YXV0b30nXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoYXEsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoidGItd2ViYXBwIix0ZW1wbGF0ZVVybDoiLi9hcHBfY29udGFpbmVyLm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vYXBwX2NvbnRhaW5lci5jc3MiXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmVofV19KSxudWxsKTtjbGFzcyBycXtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5zdG9yZT10LHRoaXMubG9jYXRpb249ZSx0aGlzLmFwcFJvb3RQcm92aWRlcj1uLHRoaXMucGF0aG5hbWU9bnVsbH1oYW5kbGVDbGljayh0KXshdGhpcy5wYXRobmFtZXx8dC5jdHJsS2V5fHx0Lm1ldGFLZXl8fCh0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLnN0b3JlLmRpc3BhdGNoKGxTKHtwYXRobmFtZTp0aGlzLnBhdGhuYW1lfSkpKX1nZXQgaHJlZigpe3JldHVybiB0aGlzLnBhdGhuYW1lP3RoaXMuYXBwUm9vdFByb3ZpZGVyLmdldEFic1BhdGhuYW1lV2l0aEFwcFJvb3QodGhpcy5sb2NhdGlvbi5nZXRGdWxsUGF0aEZyb21Sb3V0ZU9yTmF2KHtwYXRobmFtZTp0aGlzLnBhdGhuYW1lfSkpOm51bGx9c2V0IHJvdXRlckxpbmsodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLDA9PT10Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigicm91dGVMaW5rIHNob3VsZCBoYXZlIHByb3BlciBwYXRoLiBHb3Qgbm90aGluZy4iKTtjb25zdCBlPVsuLi50XS5qb2luKCIvIik7dGhpcy5wYXRobmFtZT1lLmVuZHNXaXRoKCIvIik/ZTplKyIvIn19cnEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHJxKShTbShJdyksU20odFMpLFNtKGVTKSl9LHJxLsm1ZGlyPWxvKHt0eXBlOnJxLHNlbGVjdG9yczpbWyJhIiwicm91dGVyTGluayIsIiJdXSxob3N0VmFyczoxLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgiY2xpY2siLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLmhhbmRsZUNsaWNrKGUpfSkpLDImZSYmanAoImhyZWYiLG4uaHJlZixUcyl9LGlucHV0czp7cm91dGVyTGluazoicm91dGVyTGluayJ9fSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChycSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJhW3JvdXRlckxpbmtdIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fSx7dHlwZTp0U30se3R5cGU6ZVN9XX0pLHtoYW5kbGVDbGljazpbe3R5cGU6d3ksYXJnczpbImNsaWNrIixbIiRldmVudCJdXX1dLGhyZWY6W3t0eXBlOlB5LGFyZ3M6WyJhdHRyLmhyZWYiXX1dLHJvdXRlckxpbms6W3t0eXBlOnh5fV19KTtjbGFzcyBzcXt9c3EuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHNxKX0sc3EuybVtb2Q9YW8oe3R5cGU6c3F9KSxzcS7JtWluaj12bih7aW1wb3J0czpbW1dNLGlTLG9TLFBTXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHNxLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbV00saVMsb1MsUFNdLGV4cG9ydHM6W0tZLHJxXSxkZWNsYXJhdGlvbnM6W0tZLFhZLHJxXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKHNxLHtkZWNsYXJhdGlvbnM6W0tZLFhZLHJxXSxpbXBvcnRzOltXTSxpUyxvUyxQU10sZXhwb3J0czpbS1kscnFdfSk7Y2xhc3MgbHF7fWxxLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxscSl9LGxxLsm1bW9kPWFvKHt0eXBlOmxxfSksbHEuybVpbmo9dm4oe30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobHEsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W2lxXSxleHBvcnRzOltpcV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhscSx7ZGVjbGFyYXRpb25zOltpcV0sZXhwb3J0czpbaXFdfSk7Y2xhc3MgY3F7fWNxLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxjcSl9LGNxLsm1bW9kPWFvKHt0eXBlOmNxfSksY3EuybVpbmo9dm4oe3Byb3ZpZGVyczpbe3Byb3ZpZGU6VlMsdXNlQ2xhc3M6VVN9XX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoY3EsW3t0eXBlOkF5LGFyZ3M6W3twcm92aWRlcnM6W3twcm92aWRlOlZTLHVzZUNsYXNzOlVTfV19XX1dLG51bGwsbnVsbCk7Y2xhc3MgZHF7fWRxLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxkcSl9LGRxLsm1bW9kPWFvKHt0eXBlOmRxfSksZHEuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxjcV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChkcSxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbJFksUVldLGV4cG9ydHM6WyRZXSxpbXBvcnRzOltXTSxjcV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhkcSx7ZGVjbGFyYXRpb25zOlskWSxRWV0saW1wb3J0czpbV00sY3FdLGV4cG9ydHM6WyRZXX0pO2NsYXNzIHBxe31wcS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8cHEpfSxwcS7JtW1vZD1hbyh7dHlwZTpwcX0pLHBxLsm1aW5qPXZuKHtpbXBvcnRzOltbV01dXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgocHEsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W25xLHRxXSxleHBvcnRzOltucV0saW1wb3J0czpbV01dfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8ocHEse2RlY2xhcmF0aW9uczpbbnEsdHFdLGltcG9ydHM6W1dNXSxleHBvcnRzOltucV19KTtjb25zdCBtcT17aWQ6WGssbmFtZToiIixzdGFydF90aW1lOjB9LHVxPXlrKHtleHBlcmltZW50TWFwOntbbXEuaWRdOm1xfX0pO2Z1bmN0aW9uIGZxKHQsZSl7cmV0dXJuIHh3KHtkYXRhOnVxfSkodCxlKX1jbGFzcyBncXt9Z3EuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGdxKX0sZ3EuybVtb2Q9YW8oe3R5cGU6Z3F9KSxncS7JtWluaj12bih7aW1wb3J0czpbW2RrLmZvckZlYXR1cmUocEEsZnEpXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGdxLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbZGsuZm9yRmVhdHVyZShwQSxmcSldfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oZ3Ese2ltcG9ydHM6W2NrXX0pO2NsYXNzIGhxe31mdW5jdGlvbiBicSgpe3JldHVybiBadyhETiwodD0+KHthdXRvUmVsb2FkOnR9KSkpfWZ1bmN0aW9uIHlxKCl7cmV0dXJuIFp3KEVOLCh0PT4oe2F1dG9SZWxvYWRQZXJpb2RJbk1zOnR9KSkpfWZ1bmN0aW9uIF9xKCl7cmV0dXJuIFp3KFJOLCh0PT4oe3BhZ2VTaXplOnR9KSkpfWhxLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxocSl9LGhxLsm1bW9kPWFvKHt0eXBlOmhxfSksaHEuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxjRyxkRyxKSCxTWSxkVyxFVyxCWV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChocSxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbV1ksWVksVVksR1ksb3FdLGV4cG9ydHM6W1dZLFlZLEdZLG9xXSxlbnRyeUNvbXBvbmVudHM6W0dZXSxpbXBvcnRzOltXTSxjRyxkRyxKSCxTWSxkVyxFVyxCWV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhocSx7ZGVjbGFyYXRpb25zOltXWSxZWSxVWSxHWSxvcV0saW1wb3J0czpbV00sY0csZEcsSkgsU1ksZFcsRVcsQlldLGV4cG9ydHM6W1dZLFlZLEdZLG9xXX0pO2NsYXNzIENxe31DcS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8Q3EpfSxDcS7JtW1vZD1hbyh7dHlwZTpDcX0pLENxLsm1aW5qPXZuKHtpbXBvcnRzOltbZGsuZm9yRmVhdHVyZShQTixmWSkscVMuZGVmaW5lR2xvYmFsU2V0dGluZyhicSkscVMuZGVmaW5lR2xvYmFsU2V0dGluZyh5cSkscVMuZGVmaW5lR2xvYmFsU2V0dGluZyhfcSldLGhxXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQ3EsW3t0eXBlOkF5LGFyZ3M6W3tleHBvcnRzOltocV0saW1wb3J0czpbZGsuZm9yRmVhdHVyZShQTixmWSkscVMuZGVmaW5lR2xvYmFsU2V0dGluZyhicSkscVMuZGVmaW5lR2xvYmFsU2V0dGluZyh5cSkscVMuZGVmaW5lR2xvYmFsU2V0dGluZyhfcSldfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oQ3Ese2ltcG9ydHM6W2NrLHFTLHFTLHFTXSxleHBvcnRzOltocV19KTtjbGFzcyBNcXt9TXEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fE1xKX0sTXEuybVtb2Q9YW8oe3R5cGU6TXF9KSxNcS7JtWluaj12bih7cHJvdmlkZXJzOlt7cHJvdmlkZToid2luZG93Iix1c2VWYWx1ZTp3aW5kb3d9XSxpbXBvcnRzOltbZ1csV00sSkgsZFcsRVddXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoTXEsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W0lXLFJXLFRXXSxleHBvcnRzOltJV10sZW50cnlDb21wb25lbnRzOltUV10saW1wb3J0czpbZ1csV00sSkgsZFcsRVddLHByb3ZpZGVyczpbe3Byb3ZpZGU6IndpbmRvdyIsdXNlVmFsdWU6d2luZG93fV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhNcSx7ZGVjbGFyYXRpb25zOltJVyxSVyxUV10saW1wb3J0czpbZ1csV00sSkgsZFcsRVddLGV4cG9ydHM6W0lXXX0pO2NsYXNzIHZxe312cS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8dnEpfSx2cS7JtW1vZD1hbyh7dHlwZTp2cX0pLHZxLsm1aW5qPXZuKHtwcm92aWRlcnM6W10saW1wb3J0czpbW0pILEVXLEtCLG5CLFRHLG9ZLFdNLEVSLENxLE1xXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHZxLFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltsWSxjWSxxWSxGRyxWRyxwWV0sZXhwb3J0czpbY1kscVksVkcscFldLHByb3ZpZGVyczpbXSxpbXBvcnRzOltKSCxFVyxLQixuQixURyxvWSxXTSxFUixDcSxNcV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyh2cSx7ZGVjbGFyYXRpb25zOltsWSxjWSxxWSxGRyxWRyxwWV0saW1wb3J0czpbSkgsRVcsS0IsbkIsVEcsb1ksV00sRVIsQ3EsTXFdLGV4cG9ydHM6W2NZLHFZLFZHLHBZXX0pO2NsYXNzIHhxe2NvbnN0cnVjdG9yKHQsZSl7Y29uc3Qgbj10LmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCgiLi9pY29uX2J1bmRsZS5zdmciKTtlLmFkZFN2Z0ljb25TZXQobil9fXhxLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx4cSkodnIoenYpLHZyKENXKSl9LHhxLsm1bW9kPWFvKHt0eXBlOnhxfSkseHEuybVpbmo9dm4oe2ltcG9ydHM6W1tFV11dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh4cSxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W0VXXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnp2fSx7dHlwZTpDV31dfSksbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyh4cSx7aW1wb3J0czpbRVddfSk7Y29uc3QgT3E9bmV3IEdhKCJbcGx1Z2luc10gUGx1Z2luIHJlZ2lzdHJ5IGNvbmZpZyIpLFBxPW5ldyBNYXA7Y2xhc3Mgd3F7Y29uc3RydWN0b3IodCl7aWYoIXQpcmV0dXJuO2NvbnN0IGU9bmV3IFNldCh0Lm1hcCgodD0+dC5wbHVnaW5OYW1lKSkpO2NvbnNvbGUuYXNzZXJ0KGUuc2l6ZT09PXQubGVuZ3RoLCJDYW5ub3QgcmVnaXN0ZXIgdGhlIHNhbWUgcGx1Z2luIG11bHRpcGxlIHRpbWVzLiIpO2Zvcihjb25zdCBlIG9mIHQpe2NvbnN0e3BsdWdpbk5hbWU6dCxjb21wb25lbnRDbGFzczpufT1lO1BxLnNldCh0LG4pfX1zdGF0aWMgZm9yUGx1Z2luKHQsZSl7cmV0dXJue25nTW9kdWxlOndxLHByb3ZpZGVyczpbe3Byb3ZpZGU6T3EsbXVsdGk6ITAsdXNlVmFsdWU6e3BsdWdpbk5hbWU6dCxjb21wb25lbnRDbGFzczplfX1dfX1nZXRDb21wb25lbnQodCl7cmV0dXJuIFBxLmdldCh0KXx8bnVsbH19d3EuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHdxKSh2cihPcSw4KSl9LHdxLsm1bW9kPWFvKHt0eXBlOndxfSksd3EuybVpbmo9dm4oe30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgod3EsW3t0eXBlOkF5LGFyZ3M6W3t9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W09xXX1dfV19KSxudWxsKTtjbGFzcyBrcXtjb25zdHJ1Y3Rvcih0KXt0aGlzLmh0dHA9dCx0aGlzLmh0dHBQYXRoUHJlZml4PSJkYXRhL3BsdWdpbi9kZWJ1Z2dlci12MiJ9ZmV0Y2hSdW5zKCl7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5odHRwUGF0aFByZWZpeCsiL3J1bnMiKX1mZXRjaEV4ZWN1dGlvbkRpZ2VzdHModCxlLG4pe3JldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaHR0cFBhdGhQcmVmaXgrIi9leGVjdXRpb24vZGlnZXN0cyIse3BhcmFtczp7cnVuOnQsYmVnaW46U3RyaW5nKGUpLGVuZDpTdHJpbmcobil9fSl9ZmV0Y2hFeGVjdXRpb25EYXRhKHQsZSxuKXtyZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmh0dHBQYXRoUHJlZml4KyIvZXhlY3V0aW9uL2RhdGEiLHtwYXJhbXM6e3J1bjp0LGJlZ2luOlN0cmluZyhlKSxlbmQ6U3RyaW5nKG4pfX0pfWZldGNoR3JhcGhFeGVjdXRpb25EaWdlc3RzKHQsZSxuLG8pe2lmKHZvaWQgMCE9PW8pdGhyb3cgbmV3IEVycm9yKCJ0cmFjZV9pZCBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIGZldGNoR3JhcGhFeGVjdXRpb25EaWdlc3RzKCkgeWV0Iik7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5odHRwUGF0aFByZWZpeCsiL2dyYXBoX2V4ZWN1dGlvbi9kaWdlc3RzIix7cGFyYW1zOntydW46dCxiZWdpbjpTdHJpbmcoZSksZW5kOlN0cmluZyhuKX19KX1mZXRjaEdyYXBoRXhlY3V0aW9uRGF0YSh0LGUsbixvKXtpZih2b2lkIDAhPT1vKXRocm93IG5ldyBFcnJvcigidHJhY2VfaWQgaXMgbm90IGltcGxlbWVudGVkIGZvciBmZXRjaEdyYXBoRXhlY3V0aW9uRGF0YSgpIHlldCIpO3JldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaHR0cFBhdGhQcmVmaXgrIi9ncmFwaF9leGVjdXRpb24vZGF0YSIse3BhcmFtczp7cnVuOnQsYmVnaW46U3RyaW5nKGUpLGVuZDpTdHJpbmcobil9fSl9ZmV0Y2hHcmFwaE9wSW5mbyh0LGUsbil7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5odHRwUGF0aFByZWZpeCsiL2dyYXBocy9vcF9pbmZvIix7cGFyYW1zOntydW46dCxncmFwaF9pZDplLG9wX25hbWU6bn19KX1mZXRjaFNvdXJjZUZpbGVMaXN0KHQpe3JldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaHR0cFBhdGhQcmVmaXgrIi9zb3VyY2VfZmlsZXMvbGlzdCIse3BhcmFtczp7cnVuOnR9fSl9ZmV0Y2hTb3VyY2VGaWxlKHQsZSl7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5odHRwUGF0aFByZWZpeCsiL3NvdXJjZV9maWxlcy9maWxlIix7cGFyYW1zOntydW46dCxpbmRleDpTdHJpbmcoZSl9fSl9ZmV0Y2hTdGFja0ZyYW1lcyh0LGUpe3JldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaHR0cFBhdGhQcmVmaXgrIi9zdGFja19mcmFtZXMvc3RhY2tfZnJhbWVzIix7cGFyYW1zOntydW46dCxzdGFja19mcmFtZV9pZHM6ZS5qb2luKCIsIil9fSkucGlwZShJdCgodD0+KHtzdGFja19mcmFtZXM6dC5zdGFja19mcmFtZXMubWFwKCh0PT4oZnVuY3Rpb24gZSh0KXtyZXR1cm57aG9zdF9uYW1lOnRbMF0sZmlsZV9wYXRoOnRbMV0sbGluZW5vOnRbMl0sZnVuY3Rpb25fbmFtZTp0WzNdfX0pKHQpKSl9KSkpKX1mZXRjaEFsZXJ0cyh0LGUsbixvKXtjb25zdCBpPXtydW46dCxiZWdpbjpTdHJpbmcoZSksZW5kOlN0cmluZyhuKX07cmV0dXJuIHZvaWQgMCE9PW8mJihpLmFsZXJ0X3R5cGU9byksdGhpcy5odHRwLmdldCh0aGlzLmh0dHBQYXRoUHJlZml4KyIvYWxlcnRzIix7cGFyYW1zOml9KX19a3EuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGtxKSh2cihsRSkpfSxrcS7JtXByb3Y9TW4oe3Rva2VuOmtxLGZhY3Rvcnk6a3EuybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGtxLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpsRX1dfSksbnVsbCk7Y2xhc3MgU3F7fVNxLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxTcSl9LFNxLsm1bW9kPWFvKHt0eXBlOlNxfSksU3EuybVpbmo9dm4oe3Byb3ZpZGVyczpba3FdLGltcG9ydHM6W1tjRV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChTcSxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W2NFXSxwcm92aWRlcnM6W2txXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFNxLHtpbXBvcnRzOltjRV19KTtjbGFzcyBEcXt9RHEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fERxKX0sRHEuybVjbXA9dG8oe3R5cGU6RHEsc2VsZWN0b3JzOltbImluYWN0aXZlLWNvbXBvbmVudCJdXSxkZWNsczo1NCx2YXJzOjAsY29uc3RzOltbMSwiY29udGFpbmVyIl0sWzEsInRpdGxlIl0sWzEsImNvZGUiXSxbMSwiYXJnIl0sWzEsImV4aGliaXRzLWNvbnRhaW5lciJdLFsxLCJleGhpYml0Il0sWzEsInNjcmVlbnNob3QiXSxbInNyYyIsImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBVFlBQUFFMkNBWUFBQURydkw2cEFBQW95SHBVV0hSU1lYY2djSEp2Wm1sc1pTQjBlWEJsSUdWNGFXWUFBSGphclp4cGRoeTVjb1gvWXhWZUF1WmhPUmdDNTNnSFhyNi9pMkpyZW1xcm4rMVdpNlNLeFV3a0VIR0hRSURPL3VzL3Ivc1AvaHV0WlpkTDYzWFU2dmt2anp6aTVJdnVQLytOOXpINC9ENisvMUw5K2lyOC9Mcjc5bzNJNTZSM2ZyN1I1dWR6bUx4ZXZ2L0FYL2NJNitmWFhmLzZUdXhmRi9yNkJoZitqRUIzMXRmbngwSHlldnk4SHZMWGhZWjl2cWlqdHgrSHVyNHV0TC9lK0lieTlUZC9HOWJuay83dGZucWhNVXVuY0tNVW82V1EvUHVZUHlOSW43K1R2KzE5akx3djhOcE1LUVgzK2ZSMU1TYmtwOGY3NjdQM1AwN1FUNVA4MTFmdTE5bi85dFV2a3gvbjErdnBsN21zWDNQazYrKy9FY292cjZkdnQ0ay9oY08zRWNXZnYzRjd6UC95T0Y5Lzd6MzlYdnM4M2N5VkdhMWZFZlVtKzY4WjBoc1hVNTdlajFYK05QNFd2bTd2eitCUDk5TnZsdno0N1JkL2RoZ2hzaXJYaFJ4T21PRUdlNTkzMkF3eFI0dU56ekh1bU41clBiVTQ0azVhcDZ3LzRjYVdSanFwczI0N21tUE5jb3JmeGhMZWZjZTczdzZkTzUvQVcyUGdZbHJxdi8zai9xZHYvanQvM0wxYlV4UjgvelpYakNzcXJobUdWazRmZVJkTEVPN1h1cFUzd1gvOStWcCsvMFA4RUtxc1lIblQzSG5BNmRmbkVxdUU3N0dWM2pvbjNsZjQvRm5qNE5yNXVnQlR4TDBMZ3dtSkZmQTFwQkpxOEMzR0ZnTHoyRm1neWNoanluR3hBcUdVZUJoa3pDblY2RnJzVWZmbVoxcDQ3NDBsMXFpWHdTWVdvcVJLYm5WV2FMSllPUmZpcCtWT0RNMlNTaTZsMU5KS2QyV1VXVlBOdGRSYVd4WEl6WlphYnFYVjFscHZvODJlZXU2bDE5NTY3NlBQRVVjQ0E4dW9vNDAreHBnenVzbU5KdGVhdkgveXlvb3JyYnpLcXF1dHZzYWFtL0RaZVpkZGQ5dDlqejFQUE9rQUU2ZWVkdm9aWjFwd0JsSll0bUxWbW5VYk5pK3hkdFBOdDl4NjIrMTMzUGx0MWI1VzlWLysvQnVyRnI1V0xiNlYwdnZhdDFYalZkZmFYNWNJZ3BPaU5XUEZZZzZzZU5NS0VOQlJhK1o3eURscTViUm1ma1NTb2tRR1diUTI3Z1N0R0V1WUxjUnl3N2UxKzc1eS8yamRYT24vYU4zaW4xYk9hZW4rUDFiT3NYVC91bTYvV2JVam50dHZ4VDVacURuMWlleTdaWnk0M0k1eDFUTG50SmxhUzJYdUZYTUxhWmVRV3oyMXJucUJrOXZQTHQzSHhyZTZaNVlQbk1Na0hMOXlQYUhvUXIybWZPUHhFM2hmcGQwMTAyRnBrNTZ5TTQ2OVRyNjUzMVVZTFpjRy84NDhPN1JqM0xTc3VGZFk1dG8wbml1bGZYbmtsdkkrbnFRc0J3QmRmVzhtZGQ4V29tK3NaT285NTU3KzRvWWtLTDlsbmpaakp5RDVPSFZ6bTZXdVdjNWNaWmVUSnludnpmTzQyWWM2Um84UnJTR1NQbmxNUzIzbmNRbTFmSS9DeGFVZVRpM3dkZHNnd3RwMzdicHV5TVhhWWJKcnYxWUE3dVhUYWNiVDVkRGEzS3pEQ20weWY1VXhNMzNiNVFrOWhGMW40YVozU1JTRXMyOGZ6V0k2Vm1lSXlXeHM0MXErcmg3V09DMGFWekRpdUsvR1BCRVF3U21KQ09uK3hFUmFZOTdNMEViYnZoeml0bmF5b0xHRVBNSnN1MXBpa1FmZ05jdGw2WHNJMXRmTmxoMXozRzhvZHBLRndjTWh1eTZQNGxFVFFPSHVNNDJ5N0I3TlNDSU9UN3A5WHlZL0hPWDJRaUsxZlJaejFIWUVPWGlZZmtyTithUmx1L2hWZlIrUm1HUnR5VEk3blptb2ljZzcvdVp5RDhHOUR6azZFb05vc2FHUGFneDVaUktOY1laOFd6bjdpQXZQOWJQWktHWWtKdmNOUE5EMW5ZYytQQ1J3UFkxUXlIRHRhdFhjNnJYQ3hKZEpiWk9STWhlVmRMQithMHVSbXhJUmhjbGsyT2UwYm9jdzdpeUVKK1p6Vk1EeWdmK2R4TjJZZXNycnIvWFR5Tmk5V3BuNTlNMDAzV09OQlNZVkV2ZFY2QmF1SFBaS0RETldHeFZZS2JlNFdFY1NjR3crRTZFa3hzbkowQk05dEJLWXQ2QWJWejFPR2d1Z0lmZnZIRVQ2SkZvTDR3UWN6bUN5Szh6V1NLTWFod2ZIeUdHR2txWUdFTllCVG5PRGpNdGNaeEZZMmJZVmNBT1FJMklodDd1TnBTUkY5a1JDZENZWVBPVHJHeUEvVnJjdVltSGNYYStGblJseU9Zblp0VkRTM2p3T29kcHRTZkFrd1U4eU55NloxWGpBS2FCWXVaK3doYlVrRkFoYUEvUkpGdm8rUVFWYkF6Q3ViU2NGb3lka0pwTi9iaUhtSElIT3R3dWh0bmRPZTBtRXdRZkxHOGhSMHdnbEt4UkoyMkp4RTFDRGZONFRlcmRid0VER3lQVldkRHN0QUdPMkM4TGI2Qy9tUmdQTG1KaDRnS3JXenlTbWdmNEZGbGZ3ajVjSlVGRGtLa3dPa1hQbmNZMVpKZ0tQRVZhZ0c2blFvSlNJZGtzeGQ4VlFPMW15K1M0a21TMkZ4QllFVk5ZdWx5UWtZNUZRL2lFTWI2Y1FqdU9za3hKaWxGZ0RNb3p3OEtZQkdWRTZSaGl4MWhJOXQyOWtYeWRLWWp5ekxsWWhJMnVZeXBHQ2dlTTFBWGZlR3lBMDg5T2txSnRNZW1mMGkxd0hNRjYrZjI0a0pNaEZoRVhRaWpnQ0hiRU81QnY4dUMvNUltSWxCZ09NQ21vQ2cyUDdUYWlCM0FFQUJWdFJtSk1GSmlTenFHSEFLYTd1QVVPUEJwcDBCbVNRNGdVTklSTmZZUDFGVk56Yy9ENEFkMEdlb28wclV1MENZUkFCVHlxV3UyazRVQlR0dFhoV0l3Uk5yQXN4RGpKM3JkMVg3Y0lLaFd1VEtTQVNlU0JtSDBpWXl0V05zQWFoaHJtamxTV1ZXQ0x6MnpKRU9zWTlGUTZyd3ZiZWJWOGlrRXVrc2xseUxOQ05zemFBNktZSjN5MkxBY3kydVJnMHlaaFdtdWlVeGhVRUFMVlpJbFFQY01UVkd6UlBzdkxvbXhDY0Z4QWFyV1JDd3RhMUNFbTZUUGdRdXhpL2phNnYrQUFlR3NRaXF3MThJdHBZUjBKZU9Dd1dBVWxMWXVyMktzTUkwbzRuSU5YTjVUU1kraHhaOVhQNUZwZGNDbGVnc0VQSFlHSmg0VWoyVWxZZy9OcmxHbk1zSm1NalZMaFpZRVhUbG1JREZWbVd4SlNqb3pBT3hCY3EyWVBsVVU0M041SFUvWWFGdi8vczlFVUd0a3NtYXJvQWRPOExCWkVFWnlJbGRrSlE5VEJyUlI4Y1VyYklYb01QTWszTVNnT3pab0ZGN0JJWEZ6RllHcU5ackJ4NnlMTmVnRXNpbi9xR3VJS3VqaHpQSFRteVJIQ0VCcmxtRWpSOGU5VGxrT2RubGF0WlBhdW53d2ZqbmR3OEkxb1dkQWI3b3lNazQ5QmVxWEhQR01sbEVtT1VSc0FNTkV3MzVxaEFud0J5T2NnOGtET1RtMnY0WXdVaGdLSElCS1VGcENEUEMvcXh0UDU2VUdSc1lMOEZDUThnTFRtSW5wOHhLWkF1ZE1DSThzT1hmQU9vQUxrOERnK1Z6amFXcDBwSG5BZVI2Q2xtNWFUWmk1WFRGOW0vejE3RUoxbU1jb2w1QXgxTUplQU93Y3E5NEIyUlBRZ0pRaGpVSHVnVnBCeU1kQVc0QUdXVU9IUHRqZ0k4Ly9LeVhtM0tBd3h3MlFOUVFocVFOOEZTWC9ub0ViR1c1V0E5MGE3TXJYY0xXMlZvU2lJeUNla3ZySCtUeEtvRXpnMWkxMFpXMkRwRzhnellkM2Q0STI4bWdYVWhjcVJkajBOaWlYZVFCbVErUzVvQnExU1FDUFBGdk1JRXpHNUZvclNSK0loRzVCd2lPeXRtRTdDQXJKODdPVGlJTllSbHhLOXozNW1ZOTdvV0lnZm9aa2FnTVM3TTRJQUpjQzRkbnBtQmNvdUw2WWRIdHRla3VDQnNxdWVBSk9RMnF5bnhESHNzekFEWVRIREJCd2huSHBVdkNJY05tUFlKODJFSWdoSXpTTnd2aDYyL3FGc3doYWVUa0NJMFlDeFNIV3lYK3I5RFRtS0JUajBiOEVBNHMrNHNDeCtoYzUrUmFYdkRJb2hoWTdxMTVIeGo0SnBLWVdhR3lVRVV5RHFzUmt4MTY1M0Z1TUlXeFhWRnpFR1pDSTJUSlhoZFFoekFXNENwdUFIeVpSUm9OQVlML1JnUDI1RVJnWGtvOEdmZWltK1VRMGZBTGNLU2pPQ0JRYkx0OW43Z2F2Q1RzZkRjbmpTMTlBWlZpSG5NRm9NZjh4UkJHcWc1R0JEZmcrbDZ3MDFKd203MHUxdGdXRldnWENSekp2MlJOUTJHSjlZbmlMbXc1MFJySmtpTXlRVnAwb0pLa1RRcXNzMG5Kb1ltM0JVRi9FQzk2TVlFU1VORzgwenh6UkRBakd0b09MdXFkVitFMkVsZDZvSDVLS3JUbGZEMTJZVmZYdmoxTTg4Qmtac25DbGp5eG1JeVVGSzN5dG9OTFE4cXNVK0Uxc0I0SUZnMnVoOCtSQkloRDhrZVJEaHZ3UzB1RkFUMlUrYXBpcThObzFnRFZnWHJwZVVETTJGSWMwQ2V4OUMwcCtQQkw2SVJUYTRNK2Qyckt5ZEV5bnhnalIwQ2JrRWFNQWRWeXd1SnJMeGRzNDdzeFh6aVVnbG1GbjRsd0JrN0FkSGphSnNQYlMydXdHQU54b0JlMGFHUUY3QkdISGtVb2ljeFR3ZlJWRUVCQUlvaXY0cEZpZkR0S3c0bjRTMEdFOXdKZFZnUmJEdG5zOEI0aWFUS1FITVhKWUlXNnZJc1RLN2hpdURDblFGSkpneTloN2NHUzBHNXhGdkp2cWFFaDNJbVNiZEltYXFVYU0xeDM0cmNRUGZpSTlDSHZVYUZqdzNtc2hLQWd4aEg1c0hPQURrMEVGUEFxUjVWaGRmWDB2SnhaZ2VNRWk2YnFTTWZFUzlkdzdFYjVDTWxSN2tkN0RQSVY3SUJHN3RFQ1pmd0dnMEZIQWNUZmdqQTdiQSt0NkpNSTR4dGsrbkVUbHkvSUkyRGwwMVpNcjBVNG5VRG5TajlQVUg5S2prUDlWd0VKaTVoZ0crT3Q2QVlLdmlCYkNETU10UW1kc3prdXlvdGQrRXZzWDVRTUltUDZpWDRXWktPOVFlbE8yQVo4VHU1T0d3NVVBeWgrUVpSamd1WGJpQk5kRWwrR3c2S0M0MUVrbTlpT1pBODFhOVIwWnk0TGloQWhXMVdGb0lrc1J2RSt5aTF3Vmt6TjJSakJ0K3d0Z1NTS2d1NkczR3lBZU83aENsSFZvaGJvWWFpYkpCTlJ3QTI1bzdjUmxlU3UxYzJoY1ZsWmdGZzFwMHhtT1Myblp3TmFnR0lXQlhRRWlXRlk2N2dzRExaVFRDOE5WVkJ5SDl1TFdGM3lId01mVlJkMTBmSWxEQkRCYWFTNWxCUS9lN216alEyd0xaQzE3OFoyei8rcnZzZnZvM2dIWmkzeWRSVUtMczJTUkNNak9GRXZDcER5TWs0VHdEemVuVG80SHQ1dEJWNU51Z2FUTjk4WjRtMjhZZnBDV0pzZjg4a2ZTakk2Z1QrSWtUQ1NJQXl1cmJzQnRnNWVETmwvR1Z0d1dxMURaVjFnZytkamhDend6eXBOb04wUWI1K2dMWFV2dlFWMmdYMlJWa3RlVXlFVnBtcVFudkJKOCtHaWNkKzRUd2J1blFUMndENUJXdHlSQThOVkJ2UFF5RGpJOUFhcjhhQVJXQXNqdHh2Q0VWNEVHL2pzUkZIUWtRQ0UrZWgwVi9CS2tsRFhCWFFNT0ZYVVZwZ0ZtU25Za1p2cW03OGJrU0FkRVNuSTZUSnhiaE5QbkxqcGcyc0JKY2JNbWc5TTA5aU56eTI3Y0JGSFhaVThnUjl4M1NyYXNFaUJsYnd4U1g0SlcwWGtDbmtlSW1JeGJMRkgrVEU1Q21aS1dWRkdzY2pqM0V1NEFnRElZTFIyQ1VPcEEvS0RLMkxZdVk5ZXlxdXF5MzQ0RjVMQjhPbFM3eVBjV0xJN2kxRWRnRzFmbFZyT0ttR2pPOHBRV212Mm5pSU54Z3g0N1RRUXd2elhQd3dINkpRaW9zNDNCKzQrRDdnQlBCSTZYTlJyb0NJR2ZLb3FSSWNoRWc0aVFCaC9ZSmxuUFRLRUJsU0NIWURLaHhra29UR2ozaE93V3lSU3dnejNtODVTQmtmQ0ZBZWhWczJwb21YcWt6OVFFQTErQUlLQmZ6TlhjZ2NqVGtoTXE4S0NuNGtraGhBUnBYckRQQzh5Qnk4eEFGTVpCYk9aSmNxZjRkd3c1aWhDdEVoSkMzeENRWlBSb3ZiNTJhQU92Zm43ZkJLMFZjQmpWRndQSjJuSXc1c1Y3UVhERUpBRUVFb3ZnaHk0bW1OTWJKUzRhcllTcnFxL25zbVM0WDVneDhMZW42QUg3dE1CV2Jnc2ZkVzlSUGtoc2tOa0x3NVl0Y0JKY3kyYXF3TlQwR3VIZFlEcFRWeG1zd2ZBRlFCK29reElRTHc0N1YyOEpNMXhER2VjRkYzR2VyT3ljV0FCT011aUdnRUVLcHF5Sm1RYXdOSzZVT0tHbUlqRXJhUGVFOUd2YmhDWFRsM01wSjFOSW5maW9oQTJ5MWtQSzRSK1lJTTQ1MVFUdVhmQ0hPVkVaSmtQSlBVV2RJTE1HUkJySHlyN0FWNkhVNjRyVHBaS213dlZITVNiSGV4ZWd1Ym5VT3ZTT25FeHpFUVl5dDY4WkxIQ1NBTGlXK0NCQVZNanNZWm5zNldqYnZJQVVNV2NHTXlxd2tIa1FnZUVpcXF2ZkNvd1BpUmVjSlRkZVViZ2dMaU9vUUl5UzNUVkYzUXM3QWl2ak9mczkvU29tMjRDMHNhSVllTG9tem5WVUhIRURrejVxeDYrZXg1QXhlcVEvaFpnWkZ3dE5raCtjZzZUR050VFNWZjhOeS9FaDJvZytoRFBiK3FKdlluUU12R2NyRUVRN1Y0THllOXRodTRicHhEd0EyZ1ZWQkJYcFZuTXYvakoxWHJCODJEWnlGSVhpL0JlQkx1QlRXSFlxL0llaVFVb3dMOHhkam5xSnlBZEF0RitRRlFza1pqU0NWRHJVaTNoSEt6RElGZ3NqekNvOHJ3a3ozanF0VEh1RjNEaVdPRThheFlIdXlvU0lKVVZIWDU3clZBUTYzOVVCMXNUT3ZvU0RqR0JrNys2NHZOdFU4MGdJMkhHdWhBeE5yVlpzRUowbVBNSUJHS0NHeHlwZmRnTFM3UHRVT2RxZ2hweDhaam9WUjNOMlRocks1Q1krT0JDTG8xdnkvMVJTRXlEY2tXK0RmakIrOUlqZmpBbFM5QnVsNEVuYnhpNVNHWVF4ZUc5N1crcUN5Vzl2YUVrcis5K0U4Ly9lMUhCYnZ1NjZkYlRLbytCRlJ4cmR0dlpCQjhwdklNTVlrNlJHYUdxKzJkRmpzcVRvVm5ySStzWFJmVjE0aUZHQkZ6cXQwZTZkTktsdGpXcm9CQzhFck5HUUJ6dURzMGIzRDAxZzVFT3BYcHFxck40TFFyVjNmaUNvS2lvM3VnUmtnVTBUb0FjOUlyUkJGWnNpelBnek1XOHhUVktyQTJrSTU4SHNhNkU1a1dyMHNKc0FocnFCb0N2MGtoSkhTV2FvbS9HMWw0U3ZQb1ZjVUpXWHVGSmdFWUdmQlV4TVpma2grZm04WXowb2g0TEFoY29rSkpQV21URVBDejEyNnFhbzNaZ3lhRVFCeXd6Q0lFbmZhMnQwcFI4QXlhUEwzU2tYUXljcnFYbXlLWWx5T3d3cGZvWTc1R09hSkFtREVZdmdGZEx5U3V3OTVGV0VGVnRneUt4YXpCTFBUOGxtYkU2U0hyUzBoZVZYU2dIWW1lc1FZcklhako1dkZZVnNiTC9ZNkVZWnA0eHVhS2VSRW1hQ1pCbnlsODhHYWtZekR1Yzg2SThQQ0FYQkdWYm5obUtpZzlxeHl6bkJtQVBCSGpxRmtUbXNCNVZzaUoxeVF5WmNaaE9TZ1RFSUFXeUhRVmZ4b3d3a3dEV0VBMHN1NG13SVhVVEhQQ21vQ3RxclJra3JnS0xESTVHV0FUeHN0UGhxT1hWWkJDN1Rpc1FZQitONmtFWlJ0TEtoUkVScU8vRm9NbGdRRThucFh3dy9zeE5pZ1E5cTRxeXV3bG1FWW1abm1SSHNsOU1rZENTK1VWeEwzMkV1NitNQ0wzYkNRSElRajFRYVg0aEE1dXBKTHhVRUhpRjRhdXpLMDI2Z3hGempLRGc3V2NqRE1uNDdSWmh0c2srdkYzQ1AyTDVnQ3A0WjJsblFrMEhpRmZNVERjcTRvcVhjWjBxdXdudlFJOVZOZ1hsa2xoeTZGY1pET0crdzZicHlEL3NMcEhtdy9ZeUNDcjI3WTIrSFpQK3lMWUkwTUh1Q2RpaEF0Z0V3blpDVjVXeEFoQktLT1hDcEZhWW9GaVgzS1FpdVEvT1lLZVpRV1FQT3BBV054ODVZdmIzdW81V05JVGcwRjZtWkl3aXFvMWhRZ0pTeG1OdDBKV0Z0RXZjaFRXa3JQeWkxd0QxSGU4ZW1ORVJuVnQyMTdwcTRrTVpoNFlFcm9maEJ5bDk2WktWZGNtTWhJSTVRMHFJNXo4d1dBNGVWNjBDN09aNE1vcnpVVEt6anVKeTUyYXNPWUU3UndpUnJURkZBTEVLSmxlVlV5T2pjV2ZSQ1pNU3c2U01RUGdERis3Y21IUFgzY2MvdnpaL2MwM1htSFNFNXcvU04ydmN1VXZyNnBIakNkeXFreWtsTENXYzJ6c1hjS0dJN25nUXBBRGEzRWFHTnFUZ2xKSUFwL0FzUU5OVW1QVHRyK3hGancrOHZnUUZSMVFnTkd5N0dZQ1FsUmd5MHdTcnArOGdlSUlERHlzb1RwMjJFOGNXMGZqc2M0TkVHNTRmVGZsV3JWbkpqZFZ0RHRkRDdKTEdhaUV2ZDZ5akpzQjdKaWhzSGJ2R2RPaktobWtzeUNUS05VK0hIU3Y0bVF3d0dtK1RYK3l0V0VqTmhtSm9vRngxZ3MxZkZHVDd1SG5rTmZKdzNLZElHVmNtRDB1aE1iY0lpaE1pQm5XYThtS1NxV055dU9CbVZmS0hCMkROc1pUdHpXSWtSclgxUDRLdUt4U0xmZU9yazN5R1dtTzMxUHhrZmpSTmh6RDV6NEJMd3BtSXp1MVZjZlBBSDJxRFFOSFFObFJ1d3hRYzNLSkhxZ0ZjZUdscXQyVTNobHdXREZCZkhoRzFJZ0s5eVNqdE93YkFnbU9oMk0yVUxza0xGUUppRi9GT2JsMm1WVFVJWXpieHVFeVRMTlhwcVBGVkpBUFN1NVc0T0JscXBLUkZkclNhZHBKQ1VjNGdpaTczU25BTU1DR3hzR081MUs4NGFvWEQ4Zno1M2FzN1BISVNGeFlWRkJTRldoRm5odEd4WkJtTWdXOGQraUpnVTBHQjRIYXVyRmZBQVBNcG5JZlFzMlBpWHNhVUFiVXJGS0FxY2hVYnhsM2VoVTNWQXcxZExzakVNdFpTRVVpSitNU3h6YjhPalBVQ0lQSmRHT3d5cCtLbFh4MmYzckQrNXpiVTBFL0VWejgrVlgzZVRtckN3RTFMTXdIU0dTM2VWazg4c2M4NC9NYkVkcjBkTDVvaWVBZWlKbmJTWnBUbVNCQWlIeXBRL1VtVm8ybGVjME9zb21nY3VTeFFTNGl2aWdVSFNxL0JrL1VSdUlaQThDaXdRR21iWkVJaFZvNW9seXV0MGxzRUJCWFNKVFd5VzBydDhRY1RmU3piYWZTMWxGVHlXaVZjRlJSQ1c3V1B1a2NRbEdZa3JRUDVFd0k2UGtCQUlqMTRHbUdoanhBU0VPdUN6RUt3ajVmalFyS2hRa2k2azBiaFR3L2RBNnBRSnZFZzk1VENUNlVOTStMV1VyeUhLai9oaFFuVFJ6QWpPSkNaR1FZYTZtS2ZER0pBQk42Zld0UEVmTzhrdTJDTGtFOU1PY2dRNUJwU1ZQa1dERUxyWTZ0elFPeTVMeVo1NUg5djQvV244L3UvNHJXbitqUWhWNkFJTjVlaUJEN3Y0bW1EZmVlRWJCdjJCWSthL0RhR3BvenY2NGVkSzUzMGhqd040WW1MTWdXYVlwcmtPL3J1SlZVK3V6cFpLK2V5Ym04ZHVteTloQ0taRG82bmlraDVUcjZ3cW5KRE5nWnVCVDFUWGpWN0dBWGRXQVl3dnVvMVlEQUF5bjR1WWxuRGIxTDNsUVZZVkdDL2FJYk54WUMyTFBYK1lBeFJLUGFSZTBsaExsS3Y5TURSaDZVMkVXOVVvQUF4dXlxazJHczBodTJaOVpTRnBOUjBVY3NPSk1Xc1dUQXdsak1RRk43QlJKK3FXbWt5NldpQWZqT1BnVDR4QVZtK0JvSXhvYmg0OUNUQ1B2dXdCY0dweDNxSExzdUxxL1oxUWdKbXRYTmNzRmFEWHZLYW5BWFZSWFUwem0xU2RCVTVzWFRJMG1Td3pLamgwL3RYYjA2blZERXR2TG9VTVpSRlloSHIxZWx2ZkRLNHZCdlVMK05qT3dabDhsRUE2cEx4bUhJNzl1MmV3VngrYkpqcjNxdkhXdkVJYWxMOGlCOUcxQnZ0Y2JwVlFkZm9BSitBZnI3Q2tEM3Z3N2xueU5ZWXZRM0lmeEx4ZTJIRVA0UjRJZ1RNTEloWG10UmkxNk8rR1A4ZUN5TDljWktWNVF2RDQ5VnE3YXJIRGlDMEJQQlhxVWNuRUJDQTdJQTBGbU1XQWh0bDNPaHMydGxQVnZIZktwWEVnRWF1am9zSnJvWTB1RTJQVmVWWm1CTkVBakVTMHVYWkFXWENoc3A1UnJVTXR6eDlBb2RtQ2hPUk9ZR2FJOHdWOXhWUUdCK0pEZXAvSml2akZocVRNQ0RmUnpIM1JJV016MkNIS2dZVFFXOGhUaE9GUVcwc0dUb0R6K3h5bDBOZmFCY1VrK2IvaTRRRG43VVprZGhOUkhTWXpnVkdEZnordmJhMFVmaFU2WEVEQmIrNzlwemozSFhyZFJWcVZjRGtMU2U0aDZpR3JFd3dJREFaTVBQVUhwN1pTcDhSWWpTWGdKbDhsTjdudHlsbzVIMHM0Qzh1cW53ZkpnV0ZhdHRxUDJOVkdwZ2RuNmRZdkF5d2tyOWt0cTNTeUpuaUFPUm9KMkRBOTFqUWZFVEpLUnlRclk5WTcxNFhsRDRZcDNkWkxWbXVuNnBsUTJsc3hUejFZTUc2clVpc0M3U1hwMTd2cXV2aTFFQWFVbm1VQW9HeGM2VHMvTFplUXpLM2xQY2J6cTNFQ2ZtRk8vZUZrL3pRd3I4S2NMZFAwMkJQMldBKzY2NUp6RkFrQmIxZEJncUdYYUN0dmREOUxZd0hOQWlHTWVIb3ViVlg2RGQvUXUyQTNTWVpnVDB4dWdGbWUwQTZrMFlMMnJuSGlTREg4cFNHR3NuL1ZXZG1XV25NaWdzZ0RndlNkMkNXNW9XVFF4b0V2cEZFQmRHWk9INTMyUUVNb0RmVkhvbEpxd2tOVlduMVlkRHprRXBFdi8xcXB6ZUVZSmphZGRoRXBuVnQ2Rk95MnEzUklYY0FSbW45bzZJMnlFc1o5eXY1OGdWYlEva0dsbHBobll6U1pLbHU1Y2hHZ3IzSzRYbkFSejVCbUc2TXRrMmNOWXdpWFpReUFpOE9DRGd1QXBFUHRST2NORE9mVExSUk9CYytMcklEWGlDSkgwYWRITGd6akNaYXJDL2c4cjFYQmdzWmd4alBtNW45ZmlOT3pMZUQ4SERpNjlmUzVWRXlHRTh6NHAxcVFuQjM5WHdlUlBMSVFIUDhoWGIwSjE2TlJ3alYvRnRta3BwaUgxU0tsMzFjUUh2eHljbXpBaDRGV2JnNG55bnlnN0UrVkJoYkRRUHdpK0diOEFJcGtmb3JqSUQ2UTFXb2F5RERoUGNYdFJBaHNJMjZXdnRwNWRaQTA0VkZjZWpxWDlwa0NwcTA1N05aZGJ1OWxmeHZyM0pES3NYaUp3cGFnR00yaVZJMmtKSzVvV1FoNGYwOEE1b0JhV3BDV1BDNkFDbnF3aFRWby9waG1NQndTVWRwZE0xVVR2Y1hmWDZCb1l2aENTZUFvU2VjM3oyM0h0Vm5YUjF0Q3ByNG5EMG1EVWNFRWE3NHRYQjFqVDd0NDM0Zi96Wi9jMDMvbkVIUVBjUlZSRVdUS3VlOENITGtyU0IxWkJCVmFVaWdLMEFLT1I0K29XaGdEcmQ4TEZKN0V4ZnFBTlpvMi9xY0FuQ3lxdWlGcjJha2hIS1JITHlhaWxSNDJwR2plRmFNSGRvS0J3ZFlsNGRIT0ZEN1RndEorOWNCK0hpdFZtTzk4UjJ0L3FxVk1nUE5Xek85Yng4WGdnUndjTHhPRGJBQ3A5L2tDQTRjaUk1NGlDemYvNFllSnJxQXQ3STRsN1UxeFl5RDZ2K1gzZ0xndEttcVRRTGtTbzJKWkVKOFM2Nnprd1o1bGlubjFqOHJrTTROWWxRaDdZbFZpbmkrNXEzNnAyS2Z2U2FRZmJocUtyWXlKNWR5MmNYSWRma3VFbUJVUHZDZU12S1hXM1lzQkxZZnVZOUlIYU9PdXlnQWpYTFFabHhuMC9IRjNDR2NpZC84VHpadTJ6dzVGb3lKK3JnWGMxNFoxUTV3UjZwNkZqS1ZJc2hkcDgxU0RMQ1pLR0Z2WGJ6UXkxeitFdWZuSHlrUi9oOStyOVJXbG1OOGlnT2kxUFpScVozYmF0VUJjNGVMS2k2TDBFMWtrQWRPOUFaQ0J1M2s5S056V3Q3cTZrM2w4eGdtdFdsSGRRdWh1TzRBV1M4SW1Jc2pxbStEa0hrckZ1Z1RCZWEwemVienZmWExYSzBjdW9OcS85V1luei83UDV2aWZFOUw5eTN4QWo0Uk9RL0RpbURtQWlURVY0RElsNjN2K1JJbURINVpkT1JNZVNacm5lZTE5TS9uSURBTnI0RGFRTDlxMXVNREF0TDRxbCtkaGplUDhSckJuSTJYQ0N6MWlRTHB0cE1rQ0RFZm5OZUxlc0l5c0p0Tzl4MmNZeFJPOUhNY28zcXRjY3E0MzRhY1lQZ1ltSURaQlFHTE1GZFdTaHR2K0NFQVRaN0hlbllHcEJkNTE5QWFSUjhLd2pEWVF1RkFmYm1nbEdHNzVPMHEwNDhxTzl5cVhZR0d1c3d5WFJYeDBSSXU2QkdXZmpiQXFGOGNNUVdrQVRxNDlldWRvWkJzVFBjUGh2dU5KUFVHVis3dFdIcHB6YitIZTdFOTVuZ09TUURvMndyOTc1MEtJWG9RZGRsRlVSaWJ3ZmszV0JwcXFxV29Va3dNQk5ZelVHbGlOSWN6d0JyQU11Z016bE50QUxTNnBEMUt1WWExTkpLVUhKNWJOWk40RDVLTnV5dFhzUWJNcE9nMHgrWW1taWVhYjd2dUNUMnBUSXo0R01KbUczRTR0WDJQTXQ1WHU4ekNTaU5oc3IwT2dUME5udkZFVWdBNXNoVXBCM3Ewb3dhNTZ2aXF2VmxGNTNDUEZzTlNpVE0rbkRIVUNFclZKUm5Kd3F6Q3VyKzFWMmNIZXRvZy8xNkNab2ttdHFyMGl6L3FJenovYlA3VFgzbmQ5V2RIMTk3cFIzTUpkYXU3cFhSYVlBSnk3K0JYaWtWTW1mc2pBaTFRZndVc21ab245bE9RSEdvS0ZpMHAzTFFZSFY0U2UzUzFCYXJuWGZzdEF2cXdrZi9xbHFwWGkva0lkWmF4dVlNc1NiWEJ4NW0wZUdLaVVBQ0pra1VRRnoxUTNCT0xaT3EvamdTcFduL0hOcVdKQXZpQUxSVWxaa1lhbVFGL2RXb1JGamhQR1RSMUxhaFJsa05IVFdGWmpqekhBY1RsWTVHclZqcFJwQ0NtK1I0bTdlOTB3N1ZKeHpHOTlFa1pROXNGWS9DcE5TbVBXbFpCTGRoa0tyeG9QMzk4QWRpcW5vV0s3eVpZUEhhbndzSlZPSEhkQmYxSXZZZ1p3dW5RYTJEL0sxSFVKdlUyNXZHYXlsL2JieERYYmg3YVljUXlGaVlrS0YyT2dGV3JYSmpUQ05jcTYzUnF0YW5UdlFXWnd3OG9xRG02K0RSOWdTdTRTSjhIbVRob2RZTlFXWW9QZGpHQ1pZTENJSkFvYWt5VFNaS20zcW5iVTBVZG1aQTZ0QU42ajVnK1JFUUdSTkhITVUrSUNwbVQ3M3RpR3F6dHFPMk45b3BVWEtQVUlhZWRYNHRxV1c5ZFo5ZjR4M3FLZXJmQ1p5UTcwRmdDQzNSbUZ4Q3g0VlcvNXlwMWxGd1NVaHNJL2JXU1NZam50WHBpK3lkYitXbTltNlV6RldWVlJ3TE1oblFqeGsvZ0hKWEd5eXBPdS9DSEVKSWt1L2RhWThMVFlHczFvYks3QzNxekp0d2oxemd2ZTBsSzU0bmdRVTZtWWNXNnRsWG5Td2RQSWZPa0xGc0h1NC9Gek9vR3JKT3dPbUlVMUVMNjZoSzQ2UGpCZHRRUUhVUDFNM1N4dUxybitTQm5vRUlrbFRBaXNzcUhrMDFQWU1XMHVPTUNRT3BwblVnbm9qQllDTm1vVDNlcGZYc0M3QmNHNVZtekI3NENBQ0dGcHdLcGR5Zmh3cmEybEhKQzhHRTZsVmp2NDVZUnBEMW5SbHAwa293M0lycVFkd3FNUFNrWXpYdm9JNUxCRHJXZzJBR2pEVFFGZFdzaVl3anUzbHN4V3NpS0ZGK2hiUWhqeit0bkJlVjNsRVEyN1RwaFJWZHFhdEJ3VlRvZ2oySzlpQjErby9rMDZteXJoYWNQeHc2ZUovZHJ5L005THVkMi9FM3I3T2VxSnVHbDNPZWh3R3NWSVpZdGhJY3FiTmhwWXlrVXdGRVhLNXFHQXlxZE1FM3BpTmpxRkI3dS9OcU1EYlpCdnhhOE5ORDE3dkwvY2s2TWpqMU9FaUJialZvUytzT25ZOVVwSVdHNkQxRmlLQitWQWxFd3BwL2RLZDhKV1lqL09FSkxrbFRuZW5EMGxpb1IzWkp2VzFCRnErVC93RktVNnBsakJqeUJCdEU3c3Z2dWxXSWEvUnBtOEFOWVVGV3ZnWGRFcGtaOEVDOElna200cFVNVzhHdnJqT01ZYXNyQ0FEUTBTQUFEMzJFYmh6S3BsNVFRS0FuajAwRUdHTXg5VnV5Nk9yMXdIbGxIV3U5d042Vkt1OWxJS1hxYStVTndKUmpQZFNUcno2bnJhMFMxVUVLUU9WNVo1L29SQkRRZ3A3Z3lOb2lPV1dscG9TMnBXaGJKWXNPUWp1OGJxaGRsbk9oWDh0V1I3anN2Rnc3czZ6ejZJUzJDRncxQWVndnFXYVRYNmRSd0JLaTBPZnJpWWhadmZsSmhqQXh2MXEyT3NMTVY4M21yOU9DcEFRbWN0b2RKVVRlYlIxbkpLbTZqblF3ejZCV3l1YlVkcmluQXFkbWdIcngrSk1sQlpzZ1YvV0E0THEzZlB4bEZDU2Nlb0o3ZjNRRVovS2Rxak9YSXpwQ1U2azZuZ3ByYWpTS2tuMldkZm9MMnBpdnNxNU5nMlpiQWd6M1BKcGtxK3FGRWFRbDZkVVBTVTR2OVVsai9PUFY0UXhGL2xUZm9qYjgwSHVHeG9NVFpvU3BKMitwWUhsOGpXRkxUV2JjOGJVRU9mSmJKMTZBRVNPSmwxcEljQVozRTBYYTF6cWZRajVDT3dlVUtnWXBNOWNYczR4ZXJWRERWZUVlZ25MSTZsZHEwakdmNUYrUE9nQ0t3UENBVFh6dDE4aEtLT2tkU24wSFVPTWVDUmZlV05Ld0paRkx4ZmZQdEhHSVVlNzBDME9ISGdLRnJPT0hPb1h4cmltMkFMTlJPR3IzVVJkTWZtMzdPZ0JVTTRiUGZXN1pzRHM2akR0MUlyUEtQbzFJTW5ENXc0cnNxZTBySXAyNWI2bzJ2T08vK00ycmZqRUdpdlNBKzYrT2hiR3NDeXR3R2ZSZ0RVR0pGZ09HTFJsOEFIZXkzTWp0dzgrbEYxczZqd2xwNDRhSWFsWFEzSzA2SnNQVWtpSjg1SnVIUkFPUGp4Nm9pek1CSHlHMk9vUzlQQXlXc0d2VnA4NG5JYWdRTmI0NmozTWsrSEJyeUUxQ2ZhcHd5OUJFdDR4WVBRVjRrSUpPUHlwUUZCMFAxVzdUaHZrQlpsUjhFbGNXTG9SOWtsYkRxZjBCbG45Q1kzN2lnN3RDWGJDWXlKYXRWbGxoRTZGQko0ZVpFeDN6RzJBR3l6KzBWMkllb0YwQmtVMHVCektBbjJMd09wYW1rM2g0U3ZEbzZLd25ZWTJoVklPS2dFMEt0S21BWFZ0VzZUY0RzV1NjamtzT25ocEpvVUtqam9TK3ZnZlVTSEpFQWg1Nlh2Vm5EMEMzNlZpZ05JeUtGc0Fxcm5vZG5SYnM2dFhJMWxxR0owYVh6SHRPU3NlWFJ5bHV2aE1ES2VvYWdWVTY3OGpNdWtYblVMWVJFc2dpdUpqNXlmbWRrOUZPVEkwNHlxc3lzN3F4dFJQc0pKU2hBclZTVjBtRmhlUFdyNjI1NnQ3UHFobnZaRStiQS93MXFidEtuU2lpSnBBY3lPa2dJdUh0VkRjSlJ5YzVNc0dUbVlaeUZFOXhERFd1RVFvb3RLUTZkYml2WmZNcGJWVEc4VHJZcitvMWRKeW1XK0NsS3ZQQUhnWTBKamtxNExFdWRVMlRyb3I1T0tzaVZoeUtlckRQZm5aV1I0eUJST0tDdDhIUzFGUSs5UXNJTWhuOGRqOVZxaVBSWjFDSHRhb1hxQVVKVDlQdnFDRFJnSE5XaTRUU3IySkk2cUVFYWhrZFdWUlAyYS95QSs5Y0RXUU83ZkhMdnBPNEJFL1NNYnNkbWVXVnRCc2NNSlVIWWEwVEkvNkMyVk9IWC9Ec3dPVzRiNGNCTzRvOE5rblFxOU5HTnBOYTNsL2ZLTm1nTTJNQTF3RjhWVkt4TEFSdEZhYkZlQ1BCQ2srUEwwbUszdTVmK1g2dDE0TkNXSHkwQjZScXFQcnhkVjkxM00ybnhuWHZ0OEh5NiszVjRNWUFqclF5bksvRGpKTHdFUnRRNitmNHE5cml3TkpmeTRkcFpLVVpNWVgxdFQ3R1VjeThaVldoYTBvSkJwQWtMY0dpdWc2NURHOEkrdDBOREV2S2YrbjNWRFMxMzZvU0VnUk5iWVhQK1Q0Y0hjZ1QxZEdpWHNKUWxCZkkzWGNtMGRUT05QeCtIY1U2VG4zZWhvcllweDZOaVNUZjJ1a0RNSnZPVm1vZlVJQ3ZYN1lCWlZicFZjRU9VZTYxSjQ0Q3VNeXhtMTd0T1BoczlCYjZCQXA4OUlPS2FXckMwV1pQbDNnRjE4QTRSTmRhOEJLbzYwZFBIUytONkFFbHN0TzJWd096V2FEWHVRdHZYMi9JMFVTR0tOUGlpam9CSDFHRW9LRWVHUThFOFJIeGFxV2FSQmpMa1Z3UlBML3FCYTVOT3h3NGYvMCtEWlYyZWxFbEFSYUVFb1BNVTlwUGhPRmR1Vi9mWDdVQTJUMEJXM2o5SmloU0xFMUNGOXV1T3ErbDN4UVE5QnQrNXRhdnBqQVUzMmc2RTN1Zkw3MEhVYmtNUzBWMHhLNytvL2RUcjU2b0k5ZjhHeFJsVGhFK1RTNVNwZThoUVlwcTRPblJ2VjNTUUQwL3JFWlFYd3h4YWc3dW5Jb1FKQ3BmcUtYNjg3c2ZqbjZ6Q1c5YThBc29kWmR5R3JRaDlYRWRXK2NLY2xUYnNrNEdBYTZPV2ZTTVl1aFg2YWh6WDRwMWZCMGdJTWFBQ0l1U25UbXJaQnJIZk16NzJWZmxXZFJ2dEl3bmRYM2ppZkRxYW1OcUtNQUlUT3R3SWlLVm1OK1cvWTZDZkdndmFnOTZwUFNNNEg2U0Z5eUR3TlUwNS9DQ0FkRFdXWkNzTGR3dWNhSGZ6aFdDVHFxb2s2UWhNVmo4aGJoQytwYWpYeUtoQmhCMVdPZ2IyTGdWbkZ3cTRrNlRxczR0cG5hdFhaWitwWWM2NS9WZHNhNU9DNkpsbU9oY2xVZ3JhYWNDa0dvK2VUMmpBeEszMnM5WDBMbU5kRmpOZ1JObnBwcnlROGR3MVN5Y1ZDTXNQREpKa0xYRnFaTnhPakx6MTYvTWNnaUU5ZmVWSVJ3ajV0VDlOOUN1dGhqZzZ0MTRBQUFCZzJsRFExQkpRME1nY0hKdlptbHNaUUFBZUp4OWtUMUl3MEFjeFY5VHBhSVZCVHVJT0dTb1RoWkVSUnkxQ2tXb0VHcUZWaDFNTHYyQ0pnMUppb3VqNEZwdzhHT3g2dURpckt1RHF5QUlmb0E0T1RvcHVraUovMHNLTFdJOE9PN0h1M3VQdTNlQVVDOHp6ZW9ZQnpUZE5sT0p1SmpKcm9xaFY0UWdvQjg5Q01qTU11WWtLUW5mOFhXUEFGL3ZZanpMLzl5Zm8xZk5XUXdJaU1TenpEQnQ0ZzNpNlUzYjRMeFBIR0ZGV1NVK0p4NHo2WUxFajF4WFBIN2pYSEJaNEprUk01MmFKNDRRaTRVMlZ0cVlGVTJOZUlvNHFtbzY1UXNaajFYT1c1eTFjcFUxNzhsZkdNN3BLOHRjcHptTUJCYXhCQWtpRkZSUlFoazJZclRxcEZoSTBYN2N4ei9rK2lWeUtlUXFnWkZqQVJWb2tGMC8rQi84N3RiS1QwNTRTZUU0MFBuaU9COGpRR2dYYU5RYzUvdlljUm9uUVBBWnVOSmIva29kbVBra3ZkYlNva2RBM3pad2NkM1NsRDNnY2djWWZESmtVM2FsSUUwaG53ZmV6K2lic3NEQUxkQzk1dlhXM01mcEE1Q21ycEkzd01FaE1GcWc3SFdmZDNlMTkvYnZtV1ovUDhhN2NtTHcwWHh2QUFBQUJtSkxSMFFBL3dEL0FQK2d2YWVUQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUFCM1JKVFVVSDVBY0NFQjhmQlZ4SHRBQUFJQUJKUkVGVWVOcnNuWGw4Vk9XOS85L1BtUzA3a0lXd2hNVUVBUkVFcEFXMEltb1JwWXExaUZXdy9rVEZ1clNpWGNDNjBOcUNYYkQxdXR3cVdtcXhyZEQySXJkWHNiVEk5WXBMQ3lpaVV0a0RFUklnZXpLVFdjK2M4L3orbUhNbUo1TUppeUlrOEx4ZnIvTUtaQ1l6a3pOblB2bnVYL0g5cjEzQW1xMVZSSDE5R1RieFp1WmQrQUczejF0RjBSMnJXRHR2R0ZETGlobmptTGRoSElzK1dNNzBQS0Q4R2E2NDlGSEtMMTNNOW1jbjA0cWZGYlBHTXUvTjBTellzSndiaXV6dlJ5bGZzWUNIRnIvQzVqMEJmSVZuTWY3bWU3aW1iZ0YzL0M3S3pHVWJXVGllTGtrNEhPYkFnUVBVMU5SUVYxZEhZMk1qVFUxTkJBSUJXbHBhQ0FhRGhNTmh3dUV3MFdpVWFEUktMQllqRm91aDZ6cTZyaE9QeDVPSFlSakpyNFpoWUpxbTg5L0NORTJjaDVUUy9pcWtsTmdISUZLL0FrZ3BoZlhTazE5VHZpZDI3ZHBWWEZCUTBOdm44eFc3WEs1aVRkT0tORTByRUVMa0F6MkFQQ0ZFSHBBTlpBR1pnTmM2WElCbVBaNEpHRURNT3NKQUNBaEtLZjJBWDByWkpLVnNrRkxXRzRaUnArdDZkU1FTcVRsNDhPREJrU05IMWxpUEl4MUh1LzhMSVZKdnM3OEhJSVVRN2I0NkRxbHBHa0lJTkUxTFBhVEw1Y0xsY3FGcEd2YS8zVzUzOHF0OWVEd2UzRzQzaG1IUXZYdDNmRDRmUHArUHpNeE1Nak16eWM3T0ppY25oOXpjWExwMzcwNlBIajBvTEN5a1o4K2U5T25UaDh6TXpHTzQ2dnlzbXp1Sm16ZFBaZFhhK1F4RGtZcDkwYmVlc2hXekdEdnZUVVl2Mk1EeVZtWDZISWl5YnM1WWJsNVZ4QjJyMWpLdmk3MDdzVmlNQXdjT2NPalFJZXJxNm1ob2FLQ3BxUW0vMzU4VXRGQW9SQ1FTSVJLSkhGSFFuR0xtUEV6VEZMYkFwWWhaR3lHenhja3BVcW1DNWZ4L1RVM040SnljbkVGdXQ3dE0wN1JTSWNSQUljUUFZQUNRMFVsT2N3VFlKNlg4eERUTkNzTXc5c1ppc1QyTmpZM2xBd1lNMkowaWNQSXdndGRPQUczaEUwSzBFVHBOMDJTcXlGbkNsaFE1NStFVU41ZkxoV0VZNU9YbDRmVjY4WHE5K0h3K01qSXl5TWpJSUNzckt5bHdlWGw1ZE8vZW5mejhmQW9MQytuVnF4ZDkrdlRCNi9VZVZ0QzJybmlSbDk1Y3hZcFZsUXhiOENyTGJ5aFJLcFlHZHkzUWFsaHRaZkh2MWhQakxDNGNYM1RjQkd6ck0zTlpWaktQK1ZOTDhObmZMVi9CNG5VQjZEdVZTN3VZcU8zZnY1OURodzVSVzF0TGZYMDlqWTJOK1AxK0FvRkFVdERDNGZCaEJVM1g5YVIxbGlwcTZjVE10c3BzWWJQL0tLVVJzamIvMzdWclY4OCtmZnFNOEhnOEkxd3UxOWxDaUxPQnN5RDVWblJtTW9EQlFvakJ0cEI0dlY1eWNuSXdUVE1LYkROTmMyczhIdDhhRG9jLzNybHo1OGZqeG8ycnN5eEZLUk1uU3RyL2Q0cWNsRklLSWV6N0pBWE9NSXlrOVdaYmM5WWhPaEk1cDdDWnBvbW1hWGc4SGp3ZUQxNnZsM0E0ak0vbkl4UUtFUXdHYVdscElSQUk0UGY3YVdwcW9yR3hrWWFHQm1wcmErblZxeGY5K3ZYcitMTzA2Z2wrdDc2SWNUYy95Wk5LMURxMjJJWmNjRDJUSnc2amlGbzJyMXZEQjFWUWV2TlNWczRmVDk1eGVZcEtWc3lheHJ3My9mUWROWkdKbzB2QXY1WDFyMnhnVDZ3dlZ5NWV5Wk9UaTdyRXlhcXVybTduZGpZM055ZmRUcWVnUlNLUmRvSjJCQ3ROMkc1bmlxQ0pEcXl5ZGhiWnRkZGU2MXF5Wk1rWE16SXl2dUJ5dWNZSUljNEZCcDltMS9RdTB6VGYxM1Y5czkvdmYvL3JYLy82Kyt2V3JUTWQ0cFlVT1NHRW1jNmlTMmZOYVpvbTAxaHh1Rnl1TmlJbnBTUXJLeXZwbmpvRnp1djFKcTIzek14TXNyS3lrdTVwdDI3ZDJybW54Y1hGU3FFK3JiQjkvNmF2c0c3OU51cklwYkJzTkZOdm5zYzkwNGNkSjFHenFXWDlpMCt3ZU5rNk5wZFhFYUNRMHZHVHVmbWVlN2hoZE9jWHRlYm1acXFxcXBKV1dqcTNNMTBjVGRkMVlyRlkwa0pMRTBjVHpqaGFHc3RNcEltWDJWYVorTjczdnVkNitPR0hML0Q1Zk9kcG1uYStFT0k4SUVkZDFtMW9rVkt1ajhmajZ3T0J3TWE3N3Jwci9WLys4cGQ0R3FFem5hNnJRK1NjY1RtWmFzbWx4TitrbEpLTWpJeDJzVGV2MTVzVXVJN2liMDczdEtpb2lGNjlldEczYjErNmRldW0zc1hQR21OVHRLTHJPdnYzNzI5anBUVTFOU1d0dEtPSm82VkxEdGlDbG1LZEpkMU1oMFdHVThpa2xGcERROE93bkp5Y2kxd3UxNFZDaUltQXV1cVA4ZStVYVpwdjZicitkblYxOWRzREJ3N2Nib2xiTzZ2T2FkSFoxcHZ6MzNhQ3dTbHlVa3A4UHA5TWwxeEl0ZDdTeGQ5czY2MTc5KzV0ckxkKy9mcmg4WGpVdTZlRTdiTng2TkFoS2lzcjJ5VUhuRzZuTFdxMmxXWmJhRWNyYUlaaEpOMU0welE3RkxOUUtIU3gxK3VkcEduYUpHQ0VlbmVPSy8rT3grT3YrLzMrTndvTEM5OG1rY1UxVThXdUk1R3prdzIydXdyZzlYcVRGbHhIQW1kYmNMYjFab3ViMHoxTlRTNlVsSlRRcTFjdjlZNHBZVHQyZ3NFZysvYnQ0OENCQTFSWFY2ZE5EaHlwZkNQRjdSUXBpUUduZFNaU0xMU2ttSVhENFNsZXIzZUtFR0lLMEZlOU15ZUVLc013L2hFSUJOYm01K2V2cGJWY0phM0lPV055dHFzSzRIYTdwYk04eEJhNUkxbHZxZTVwYm00dWVYbDU5T2pSZzRLQ0FvcUxpK25UcHcvOSsvY25PenRidlZ0SzJJNk8vZnYzSjYwMFp5d3RYWElnTlphV3hrbzdrcUNKMUpoWk1CaTh4T2Z6WFNXRXVGS0pXYWNRdWRWTlRVMnJpNHFLYkV1dWpjaWxXbkgydngzdWFUdUJjN3ZkSFFxYzAzcExUUzZreHQ1S1Nrb09rejFWS0dFREFvRUFuM3p5Q1ZWVlZXMnN0T2JtNWpZMWFVZFpaQ3RzMTlOMk53OWpuV21OalkzRGMzSnl2cVpwMnRXZ2FpMDdLZHRpc2RnckJ3NGMrRnRwYWVsV2g4QVpEcEZ6eHViYVdIRjI5dFFXT1V2WVpEcjNOTlY2YzlhKzJabFQyM3JyMjdjdkF3WU1JRGMzVjcxRFN0amFXMmwyZ2lCZHhyT2pFZzViMU5JSm1yTkx3Q2xvdHBpdFdyVXFZOUtrU2RlNjNlN3BRb2pMMUdYWWRUQk5jMDBvRkhyNXFhZWVldVhCQng4TUEvR09SQzZkd0RscjROSUpuQzF1SFpXR3BHWk83Y1NDc3Q2VXNBRVFDb1hZdTNkdnV3U0JiYVcxdExRa1kybEg2Qnc0bktBSnA5dloxTlEwSWpzNyt6cE4wNjREMUpYWXhmOG02cnIrMHY3OSsvODZhTkNnYlE1WDFVaDFWUjBDSjQ4a2NCMWxUdTNZVzA1T1R0SjZTMDBzbkhIR0dXUmxaYWwzNW5RVnRvTUhEeVpkejVxYW1qWUpnaVBWcFRsRUxhMmdXUVcxYmR6TlVDZzB4ZXYxemhCQ1hLc3V1VlBTaWx2WjFOVDBVbUZoNGV0U3lyZ1F3aWx3aHRPQ3M0WE9HWWRMRmJpT1ltL3A2dDVzMTdSbno1NUoxN1IzNzk2bi9YdmlQcDErV2NNd0tDOHZaOSsrZlJ3OGVERFpFdFhjM0l6Zjd5Y1lEQ1pGTFJxTnB1MGVzQVhORVVkTEsyZzMzbmlqYThtU0pUZTYzZTRiZ1F2VXgvL1VSZE8wYWZuNStkTmlzZGc3TzNmdS9QTXR0OXp5MHNhTkcrT1dtMnBJS2R0bFZnM0RrS1pwU2szVDdGaXNkSllFeGVOeDZTd1hzajBFWnlqRS9xTnIveEVPaFVMSmRxMnlzakpjTHBjU3RsT2RwcVltOXV6WjB5YnI2V3lKT2xLeGJScTNVemk2QkpLQ3RtblRwdHdSSTBiTWNybGNONkZxems0djkwZUlMMlZuWjMvcFgvLzYxemNqa2NqeVpjdVcvZVcyMjI3elc5WmJ2Q09CazFKS1I2RzJVK0JrYWd1ZXM5ZjRTQUpYV2xwSzkrN2RsU3Q2cWxKWldVbEZSUVdWbFpWcGE5UFNGZHNleGtwTEcwUGJ0bTFiajdLeXNsdGNMdGN0d0NEMU1ULzlNQXlEeXNwS0Jnd1lZSCtyUEJLSi9PR1ZWMTc1ODNYWFhkZG9XM0QyWWNYZ3pIUXhPR2ZkbTlNOVRTMExzWXQ2MDlXOGxaU1VNSERnUUVwS1NwU3duVXBJS2RtNWN5ZWZmUEpKc3VEMmNGblAxQTZDRHR4T084dXBTU25GaHg5K21IZldXV2ZOZHJsY3M0RXk5ZkZXd3VZUU5wczk0WEQ0OTMvNjA1K1czM3JycmMxSEVEalQwWFNmMnJrZzAzVXNkSlExdFF0NkJ3d1l3T0RCZzdHNkpaU3dkV1VDZ1FDN2QrOU94dE5xYW1xU1dVOW53VzBIcnFkSWJZVktzZEswK2ZQbnUrYlBuLzlObDh2MVRWVDkyUWw4WXc5QjlRNW9xSUJ3VStJQXlPeWVPUElIUXZFUXlPM1ZtWVROL2tPN0xSUUt2ZkQxcjM5OTJlclZxMk9Xd05raVp6b0V6a3kxM3B3QzUvRjRaRWY5cHM1cElmbjUrZlRzMlpQZXZYdlR2MzkvQmcwYWROclV2SjJTd2xaZFhVMTVlVG43OSsvbjRNR0Q3VW81VXVOcHpvQnNPcmZUVGd6WVdjNUlKSEs5eCtPNUV4aW5sT1lFMFZBQnU5Y2x2aDROK1FOaDBNVEUxMDRpYkE2QjIrajMrNWQyNzk3OUZTR0VuaUp3N1Z4VVJ3ZURUTFhlVW12ZVVndDY3WktRM3IxNzA2OWZQOHJLeWs2TGNVaW5YUEtnb3FLaVRaTEFucHZXVVR6TmFhWFpnVm1uMitsSURHaWhVT2dTcjlkN2w5WHlwRGhSYlBrclZIMTQ3RUs0c1FMNmpvSVJYKzFjMW9RUVk3dDE2emJXTUl3cmEycHFsdmJ1M2Z1ZlRvRkxUVExZQ1FacldJSk1tZDluLy8rb2tneVJTSVJ3T016QWdRT1ZzSFdWZU5xT0hUdllzMmRQc2pYS0hqUFVVVHl0QTllem5kdlowTkF3T0M4djcxdENpRHVVeXB4QTRoSFk4RUxDL2Z5MFZIMlFjRmZQdlE3Y0daM3ExOU0wN1N1OWV2WDZTaXdXVy9MeHh4Ly9mdlRvMGVVT2diUExSQXpBTkUzVHRQZGIyTmxUdTJYUEtXNnBJbWNud0ZMRkxSS0pNR1RJa0ZNMjduWktDRnM0SEdiSGpoMVVWRlMwNmZlMDY5TTZpcWVsV21tV3FDWGR6bG16WnJtZWUrNjV1MTB1MXh4QXpXRSswV3hZQ29IcTQrUEd2djluR0h0VHAvdzFQUjdQN0ZHalJrMEpCb1BQVHBndzRmZWJOMitPQWJwbHZXbTJpeXFsTk8xeDVsWUNTenFISzZRS1hMcFNFV2ZZeFJhM1kxc2tvNFR0aE5EWTJNak9uVHVwcUtoSURvUjBUdVZJVjU5bS9SVnppcHJUU3RPa2xDSVVDazMyK1h6M0FsOVdDbk9TM00vaklXcE9jZHZ5UDUzT0xYWFFOeXNyNnlmdnZ2dnV4VFUxTlV0NjkrNzlsaEFpNW5CUEJhMDlxVExGZ25NS25FeTNGQ2lkZTJwWEFRd2VQSmdlUFhxY1lzTG1YOEdNVWZQWWtIc052L3Z3VVNaMm9SZGZYVjNkcHB6RGJtSlBWM1RyS09VUXRubWV4a3JUS2lzcmV4VVhGOStyYWRwM2xMcWNKQm9xamoybWRyUnVhZCtSSnpTaDhDbmMwNHQ3OWVwMWNUUWEvZlhycjcvK3V5bFRwaHl5M0ZQTktYQ0pYVFRDN01oNmM3aXFISTJiT25qdzRGTXFxZEJsTGJiOSsvZXphOWN1UHZua2syUTVoN09USUYyU0lOVktNd3pEYWFWcGtVaGt1c2ZqK1E0d1JxbkxTV1RYRzYzLzFnL3gwSS8vd2JJR0dEZmo2eXlma0FrWVZINjRpWWRlM2N2NnlnaGtaak42NUFqbVRSL0NhS3NIUExwL053dFdiT0dWdlg0Q1pGQTZ1RDkzVEIvTDlOM3JZT3pBVG44S3ZGN3Z0eTY3N0xMejYrdnJueTBvS0ZndGhIQlo3cW51aUwwSlovd3RqY0IxR0h0THRlQnNnZXZ5VTBMODVheDdaUm51U2FQbXNRY2c4QkkzbDY1ajVrc2JXVmkybFJjWFBNVGlOVnVwaXZyb08yd2lOODlmeUMyajh6ckZheTh2TDJmMzd0MUpVYlBMT1ZLYjJEc1NOV2ZHVTBxcFZWZFg5eXNvS1BpdUVPSXVwU29ubWNBaGFQd2srZCt0cjI5a1JVUEt0ZnZ4djVqeGJEbFZlQ2dkV0l5dm9aWU42OWN6b3g3V2ZtY0lKYzE3bWZQNE83d1doc0xpWW9iUnpJYXRPNW4zZUl5OEg3cVlmTmFoazFMbmRxd0lJVWJuNStjdmpzVml2M25ublhlZXYvamlpeXVGRUpyRFBZMWp0ZkxaazBUc3pLbFQzSnhiejV6TGcrellzbk80UXl3V282eXNLOWFabDdOaXpod1dyZG1HMzVlTGUrYk1DL25kc2plcDhwWnk2UTNYY0dtUm4zVVB6V0wrS2o5OUw1ek9IU1hsdkxKc0ZRdG4rY2xidTVUcEozbXAxUGJ0MjVPRnQ4NmV6OE5rUG9XejE5TlJsNlpKS1VVa0Vwbm04WGkrQjN4QnFVcG5pQzlzYi8xMy9RNFd2TnBJTE9VdVc3ZldFczNMNXNJckxtZnBoQndJN1diV0Q5N2h6YjM3V0I4YXd1U0tmV3oxWk5CMzJGaFczbm9HUmJUdy9LS1hXRmhSeGFxOU1MbStva3NJbTQzSDQ3bHQ0c1NKWTJwcmF4Y1hGUld0c1dKdm1pVnF0dlZHd25DVHFkYWJTSW5Ea2VxaU9qZW4yUUkzZE9qUUxuYmhSS0hvR3VZdm44cmt2Qlc0YjVsM0phOHRlNU1xMzJobXpyK1RpWlR6VEhrZFVNclVlZk9aTnl6S3BXY3RadFdlWFBMOE9MWXJuMWlrbEh6ODhjZnMzcjI3emNKaWUydVVQWmtqSlVtUUttckplTnIyN2R1N2w1V1ZmVi9UdEhsS1RUb1I5UlhXUDJLcytlc0hiS0FINHdhMnNLRkNUOTVsL0xWZlkyTzZBVkFlTDNrZXlCczVrYmRHcG50d0Yza2VTendIanU5U3AwVUljVzVoWWVGemtVamtpVC8rOFkrL25UMTdkcU5sdmVtMGpzZ3liRUZ6eHQ3c1FhZE9jVXRkKzVnUXVTaE5GZS95NXlmMlVqanJQM2xzNXRsZHFCeGtHTlBuRDdPTnQzUXh0akltWGptS0o3Wjl3T0lyeDdKbTFIakdYM29OTSsrWnpMQ1Q1SW5xdXM3SEgzK2M3Q1pJTGJ4TkxlZXcwdG1wV2M5a2dpQVlERjdvOC9ubUNpRW1LeVhwWkZndFV0RzltMWl3S1VMZkN5WnljM3hkRzJHenFmMXdFd3ZlYTZaMmJ4VWI0aGxjZU8wb0pqczMxQjNhelVPdlZsRlpmNGoxRlJwOXg0emxqc0ZBUE5wbFQ0L1A1N3ZuNXB0dlBudlNwRW5QRGh3NDhGMHI5aGF6WEZNaGhEQVNobHByM00zcG1xWk1Fa2tJV3p4QzNkNHR2TDUvUHdmOEp1Nk1Ya3lkdklNUFA0eHo5dGxuZDhtMWYybVRCOFB1WE03YTBTdFl0dXcxMXExZng3SkhYMlBaNzY1azhkb25tWHlDeFMwU2lhUVZOYnZ3TnQwK0FvZWxsdXA2YXJGWTdIYVh5M1VmMEVlcFNDY2swZ3cwOC96eTNWUmw5dU9KcTN1UnR5TDlYZjE3OTdGcWt6L3huN3h1REN0T3FjZnkxN0ptVXdWMUFPNXNocDNSTGJFSS9MTVUvSFlDTkUyYk5HREFnR0Yrdi84LzgvTHkvZ3hvbG51YXROeHdKQlpzajhleTNvVGxzbUthVVJxcnlxbHRDcU9qNGMzcnlhQnpoelAyM0hNNFM2dGc1ODZFcTNyMjJXZVRrWkhSdGM0UmdNL3lVYU5Sd0wrZVorYk1aZEZyZWN4OGNpbXZibHpMUTZPQXVuV3MybnhpWDF3d0dPU2pqejQ2YkoxYVNseE54R0l4WWZkOFdtYTJacHFtVmxWVjFTY2Vqei9tY3JtZVVLTFd1YW45MTBZV1Y4SzRxOGN5OVRDVHJzdXUvaHA3bnY0R0crNDlpN05DMVN4KzlsK3NDVG51TVBnOE5qNTlFOXNXWE13MUJVRmVXL0U2aS9ZYXA4cHA2cE9ibS92VGFEUjYvNnBWcTBxa2xCbldSOWtMZUtTVUxpbWxabC8vVmd4TjJONU1KQklSNFdBejFRMGhvcVlnbytnTVJvNFl6QmtGR2VqTk5SdzRjSUNLaWdwMjd0ekpSeDk5UkRBWTdHSVdtNitJdkZ3Z3NJWUYwMlpSdm5BaGViVnJXTFZxSFZzclAyQnlTUzNyeWdGdkdhTk9ZTElrRUFpMHNkU2NMVksyb0RuSGQ5dXVwMVdmMWlickdRd0dKL2g4dnZ1RUVKY3EyZWprWkJpcytMOERCSUFOeTEraWRIbnJUUnVXLzRVSis3L0NxNWQ1cWRWZDVCWGtVT1J4VVRSNEdOZVViR05oUlMwYnFtRmlmZ3VWWVFOZlhqZEtzc0JYMEorWnc3SjVxVHJJNXAwdGNNN2dVK1owZWIzZTJWT21UQ25kdTNmdk0yZWNjY1o3VnR6TlRpd0lJWVJobXFacEwzaHVHM2R6aVc3ZE1tVkxNRUs0ZWpjYmF6OGh0N0F2WldjT1lxakRYYldQczg4K3U4dE1CM0hqbThnOTg2OWs2NEkxN0NrdnB5cGF3cDFQTHNYLzBBSit0KzUzTEk1NUtUenJVdTZZdDVCYlRsQlRVWE56YzFMVTdHYjIrdnI2ZHU3bllUS2Z5WGhhTkJyOWh0dnR2aDgxL0xGcmtObVRzalA3Y0tFajVGRmJlWWh0ZnBQYzRtTEdueUZZcy94bDVtMkZjVE8reHZJSk9SQnE0SU1HQUMrRm1WQzUvblV1L1o5R2NzZGN6RnUzOWllUE1PWFZZVUFqTDgvYjZYcEdqNE5yZXNtQUFRTUdORFEwUEpXZm4vK0s1WnFLRk5jVVo5ek5Gam1QSjFOMEwrd21QZWdFQTM2YWF6L2hnOW9xYXVPWGNxSFYyZURzVVQzNzdMUHAxcTFiMTRpeGxVMS9rclhUbmQ4ZXo1M1B2c3FkSitFRk5UVTFmV3BSY3lRSnRGdHV1Y1cxZVBIaUgyaWE5aUNuMlc2SExrM0JjQ1pmZXluT3JNNzYzLytabWVzakRMdGtJbytlbDBtdHB5K0ZXL2V6WWZuTFRIb3ZIMTkxTGR2OGtIdm1FS2IyZ2hMUEVNYXRXYytHVGV1WVZGMUVtZDdNaG1vVDh2b3hjMWdtRkE4OTVVNmJFS0tzUjQ4ZXZ3eUZRbjNHangrLzVLT1BQdEljMXB0dWlWa3k3aGFQeDl0a1RLWFhLM01LZWxQWUcyTEJJTzVvTTQyTnliS1JOc2ZaWjUvZDZVZU9kNm9QZkdOajR4RkZMWjM3bVpva09IVG9VTCtDZ29MN2hSQ3psVkowTVlxSEp1YXVIWWFpTDB4a09adFlzR1l2NjNkVlEyWWU0eTRZd2Z5ckJ5VW1GUlFNNGRsN1hTeGFzWVUxZTZ2WlFBWm5EVHVMTzZhUFlXbzNvR0RncVhyMjNKbVptZlBlZSsrOTR0ZGZmLzAzbDE5K2VhVnR1Vm5XVzl5K1k3cWtRdUtMajh6Y0FqSmxDODNONllYTkZyZk8zRi9hYVFaTk9rWE56bjdhb3VhTXFhV3gxT3pXS00wMFRSRUlCTDZRbVpuNWdKcVoxb1hac0xSTjk4RnhwY2NBR0RmcmMzbm9veDAwZVNJd0RHUDF6cDA3Rnc4Yk5td0xFTFd5cGpxUVhBK29hWm9VUXBqV2RGNXA3VlNRenBIajlrVGU3dDI3VTFCUVFLOWV2WklES3p1enVIVUtpODNwZnFhSzJ1SGNUNnZmTStsK2hzUGh5N3hlNzRPb3liWmRtek12Z28wdmZINlBmUnJnY3JtbURCMDZ0S0N5c3ZMcGtwS1N0NnhFZ20yNUlZVEFtVlN3ZzI2dGxsc3lGc2ZoakovaHc0ZDNTcmYwcEF1Yk0xSGdGTFhHeHNhMEV6cFMzTStrcUVXajBSbHV0L3RCNEV5bERGMmMvSUdKS1J6SGU4SkhKNS9zOFRuRTNjYjI2ZE1udjY2dTdxbkN3c0svU1NtZFNRVWRSMUxCSVdEU2NsM2JxVms2Z1JOQ01IejQ4RTZYVURpcHd1WXM2WERHMUd4Uk81ejc2UlMxV0N4Mmg4dmxlb2lUMXZDbE9PNk11QnI4aDQ3ZlRMWWVBeEtQZVpvaGhCaFVVRkR3VUZOVFUwNzM3dDMveTJHNXRRbEYyZUlXajhmVGlsdEhvbVlmSTBhTTZGU2xJQ2ROMklMQllJZUpnalIxYXNLNTQ5TXBhcnF1ejlVMDdTRWdRNm5CS2NhNFdjZG5pbTZQQVREbSt0UDVUQloxNjladGZrdExTM1pPVHM3dm5XNnBVN1RTaVp1ZFhFZ1Z0RlJoMHpTTkVTTkdrSjJkM1NsK1llMWtQS216VGVvb3NwL0N1VUhLanFrOS9mVFRIbDNYZjZocDJrSWxhcWNvN2d6NDBoMEpGL0t6dUovalpwMXl0V3VmZ296czdPd0hRcUhRN1ZkZWVXVzJvMVBCQTdpdFRnV1hhWnJDTUF6aDZGSWdHbzBLKy9NWURBYngrLzAwTlRWUlgxL1BvVU9IcUt5c3BMeThuSTgvL3BoSUpOSXBmbG5Yd3c4L2ZFS2ZVTmQxL3YzdmY3Y1pQZVMwMUZKaWFzTGV5RzRuQ3FTVTR0MTMzODM1eWxlKzhpTk4wMzZnUHYybkFjVkRFN0d4VUpQVlMzcVVWdG81VjUvUUtSNVNTdngrZjZldThmSjRQT2RObXpZTmw4dTFkZDI2ZGZFT3BuZklOSWtEa2VxU09wcnMyeHhGUlVXNFhLN1RSOWlrbEd6WnNxV05xS1hiSkpVNmRzZ3BhanQyN09neGRPalFIMnFhOWwzMWlUK055T3dPSmFNU0l1ZkxTVGhLbmd5SVdUMk11Y1dRWFpnUXNpR1RvUFNDeE0rY1FMcUNzQUc0M2U2eDU1OS92aWd1THQ3K3Q3LzlUWGRtUmpzU042Y0FPdXZaVWdYTy9scGNYSHhTUng2ZDBCaGJSNzJmVHZlem81SU9LYVVvTHk4djZOKy8vNE5DaUx2VkovMDBKYmRYNGxBTmNwOEpuODkzKzIyMzNhWjV2ZDRsdDk5K2V5MjB4czRjVnBsaEdJYnRhYlZKS0RqamE4NDRtOHZsd3Q1YVAzejQ4Rk5mMk96SnR4Mk5IanBNOFczU1VsT2lwbEFjVjNHNzdhYWJiaUlhalQ0M1o4NmNCcWRsbGs3Y2NHUkxPeEsyVkhFN1daTjRUNGdyV2w1ZW50d21kZkRnd1E3SGVhY3I2YkJqYXBiN09VZGRqb3JPU2xkeFJWUGMwakVqUjQ2VVFvaC92L25tbTRabGpiVnpTMVBFcmwyOHpYa09uTzZweStVaVB6Ly8xTFBZOXUvZmY5UXh0WFIxYWs4Ly9iUm41TWlSRDJxYWRvLzY2Q2dVeDUrTWpJemJIM2pnZ2ZpbVRadWVYYjE2TmVrc045TTBEV2d0QmJIS1JlVGgzRkdYeTRYVnBuWEN0MTk5cnNKV1hWMmRYSkdYdW5qbGNERTFaNTNhN05tekg5UTA3ZnZxOGxNb1BqOHlNek8vdFdMRmlsaDJkdlp2YlVGemlKdkVXdEpzK2FiSm1Kc1FRanJkVU9kaHU2TzJ1SjNJdmFXZm03RFpHOXFkN21kSDQ3eFRZMm9weGJjUHFzdE9vZmo4eWNySytrNGdFSWprNXViK2tiWlpVcGxheEd0L1h5U1FIY1haYkt2TkZyY1QxVFQvdVFoYk9CeHVJMnIyNHBYbTV1YkR1cC9XS085a201VFZVYUJRS0U0UU9UazUzMmxzYkF6MTZORmpwV1cxU1ZKaWJKYTRPUzAySVlTUXRxZzVCYzYyMkd4aE8rZWNjOGpNek94NndpYWxaTWVPSGUxMkZLUmFhdFkyS2VjU1kreUZLOUZvZEliVis2azZDaFNLRTB0RzkrN2Q1MVJYVndlTGk0di9MaFA5VjIwKzMvWlhlMkNsWmEyMXNkeWNGcHZUSmZYNWZJd2NPZkp6cjNFNzdzTG1GTFhVN0tlOTk3T2p5YmVtYVlwd09IeVpOYVZETmJRckZDZUhvcUtpb3J2Mjd0M3JQK09NTS82Wllyblo4VGE3OUFPSG9BbE4wMlJIY1RaYjJESXlNajczTXBEakttd1ZGUlhzMmJPSHFxcXFwS1dXNm40NnVncElLZXZRQW9IQUY2eDVhbXIwa0VKeEVoRkNET3Jmdi8vdG16ZHZiaG85ZXZUSGx1V1duTnNtaEdoanRaR1NJVTJOczduZGJ0eHVOMTZ2RjYvWFMwWkdCZ01IRHV6OHdsWmRYWjBVdGVycTZxU28yZjJmRHZlelRhdVVjNXgzWm1ibUE2Z2hrUXBGcDBEVHRDK09HREZpOXNxVkt4K2RObTFhbFVQY3BHTjJHNlpwbW5hbU5KM1Zac2ZhbkJsU2UwTHY1NVVwUFM3Q0ZnZ0VrcE02cXF1cjJ6UzFPMk5xNmNvNnBKVGlsbHR1Y1ZrN0N0UTRiNFdpRStGeXVTNi80b29yYW9jT0hmclk5dTNielJSeHN6T24wdDRxYjR1Yk01bGdXMnoyVjYvWG0zUkpzN0t5UHBjNWJwOVoyS1NVN1ZxbG5KWmF1cWIyMUF6bzRzV0xmNkFXcnlnVW5ST3YxM3ZqdSsrK1c1T2JtL3Q3UzlETUZIR1RxWmxTVGRQYVdHN3BTajk4UGgrWm1abU1HalhxdUNjVFByT3c3ZHk1azMzNzlpWExPbzVtVFY1S0J2UWJxbFpOb2VqYzVPVGszRk5kWFgyb3VMajQ3NENaeGkxdEUzT3p5ajZTNG5hNFdGdFdWaFpEaGd6cFBNSldXVm5acmxhdGcxWXAwbVZBZzhIZ0JHdVpzZHI3cVZCMGJ0eEZSVVYzYk4yNjlkQ3dZY1BldDZ3ejIwcHJseW1OeCtPeW80TGRkTEcyN094c1NrcU8zMGIyVHkwb1RVMU5hV3ZWT2hBMWtiS2xYVHR3NEVBZm44OTNIMm9BalVMUkpSQkNsQTBlUFBpV0YxOTg4Y0FOTjl4d3dPR1NKaTI0bFBxMnBFdWFUdGljNHBhVmxVVk9UczV4R3lEZy9qVDdHdzNUWk0rL3QxSzVldy9WKzZ0b09GUkRjMzA5Z2FabVF2NEFrV0NJU0NoRU5CSkJqOFNFcnNlSTYzRmhHcWFRTWlGc1BUM2hlYUpwMzZYcWNsR2NuRStwQmk0UGFKN0V3RXB2dGpvblI0SEw1YnA0MnJScEZjQlR0TWJiVE5Ja0UxTEZ6WmxJY0xxa3prVEN5SkVqajh2MDNVOWxzWlh2L1lUS3FvTlUxOVRSME5CSXM5OVBTMHVRVUNoTU9CSWhFbzBTamNYUVk3clE0M0hpY1NNeE5saEtJU1ZhckhyMzdVS0l1OVJsb2pocFNCUGlVU0FLc1JZSU5VSkdMbVRrMmQ2VW9nTXlNakp1cnErdnJ5Z29LUGdyWUhTVVRCQkNTRHZlbG1xNU9kMVJwN0RsNU9Rd2VQRGdFeTlzQjZ0cjJGZFp4YUhxV3VvYkdtbHE5aE1JdEJBTWhRaUZJMFFpVWFMUkdIcE1KeUZxY1JJeE5TbWtsQ0pZdGUxQ2w4dDFuN284RkoxTDZBd0lONEVlaHB5ZUNZdE8wU0g1K2ZsM2JOMjZ0Y0tLdDVrcGg1UlN5b1MyQ2VMeGVESTdHbzFHNlVqY01qTXprK1Vmdlh2M1BuSENGZ3FGK1dSL0pRY1AxVkJiWDA5alV6TW9NaklCQUFBZ0FFbEVRVlQrUUFzdFNWR0xFSTNGaU9reDlIaGM2UEU0aHRFNmdtajdodi90N3ZQNTVnSjkxS1doNkpURW8rQS9tQkEzbCtkemY3cDE2OVoxbWwvOW9vc3VPcGE3OXdadUF2YVNpTEcxRVRaQVdpVmRwbUVZeE9OeEdZdkZSRFFhbGZhMnE1YVdsdVMycStycWFxcXFxcWlvcUdEbnpwMlVsWldSa2ZIcFc4V1BTZGoyN3R0UDFjRnFhdXRzVVF2UUVuUllhckVZc1ppT3JzZUZyc2N4REJORFdpNG9pTEl6Qm54ZndHVDE2VkYwYXN3NGhPb1R1eFZPQUdWbmZyYSt5ZkpkMndIdzlmM2lwMzZNYU5XN0FGU2QrZVN4L05nbFlUTzJiVkQ1OTM5TFlxdThnWjFJQUNrUVVrZ3BNRTFKWEVMVWdHQmNhQ0ltTldKb0lvSkxoSENKSUc2WEg3ZXJDWStuRG8vM0VBY1haWEhHR1dkdzVtMGZmYXJmNTZqdDdmMVZCNmlzT2toTmJSMzFqVTAwK3dNRVdvS0V3bUVpNFVSY0xSYUxFZE4xZEQxTzNEQXdERk5JTXhGWGl4emNPVTNUdEhucVU2UG9NcGJiMGE3Nk80M0oxTHpmZW5mZ2p5ZVFtTVRqQTd5V3dlU1NTSmNFVFNLRmlSUUdramdtT2dZeDRrUmxuSWpVQ2Nzb1FUTkt3QXpUYUFTcGkvdXByYTJscHFibVU3K3VveEsyUUVzTCt5c1BjS2ltbHZyNlJwcWIvUVJhV2hMSkFxZW9XZFphc2w3TnlvQlc3M2l2bjhmai9wNjZEQlJkaW5CeklzbWdPTHhQNnVrKzY5bWlXYjA3RURkTmdtWTZ4RTJYcGtpS0d6b1JxUk9TVVZyTUNINGpUR004bUhSUFc0eFB0NEQ1cUZ6UlQvWlZjYUM2aHJyNkJocWJFM0cxWURCTXlKRUJqU1dTQmJhb1lab1NLYVdRU0swZ3Y4ZDNnUytvUytBVTh0YWFZd1NlMjBIa1g5VVlWYUV1OFpwZGZiUEpPSzhudWQ4Y2d0Yk5leFEvSVJON1MzMjVKKzAxZi9MWEozbUdhL241MWIxUDl0bkQ5L09iS0xpaWpzWXhMeE9PdGQ0aUVLTXZ6UnZ4ZFdyNXRlMlNTakNFTTVrQTBrUktBeE1CYU5JUUxpR2tTMnE0aFlaYnV2Q1lVYnpDamM5d296VTNrNW1aU2FVZVlhanIyRVB5UjdUWTlsY2RwT3JnSVdycjZtbXdrZ1dKREtpenNWMXY2NEphR2RDRUM3cHJ1aXJ0T1BYd1AvRXh3UlY3dTR5b0FSaFZRWUlyOXVKLzR1T2oveUU5ck43c284Q25lVzUrYitCUEpqZ3NOaS9nQWR3U3FRR2FCR0ZDV3BjMEtuWENVcmRjMGdoK3Y1K21waVlPNlUwYzBCdVByOFVXRElhb1BIQ1E2dG82R2hxYWt2VnF3WkF0YWpHaWxxakY0M0VSTjZ3c3FPV0NWbjY4dnBmSDQvNk9ldHRQUFNML3F1bXlyejI2cWY3bzd4eVBkc25mc2ZvZmovRFMzbUlLM0g1YUdnTzRoMDFrY0dBTGU1cjhOSWVMR2YrTm16aTM2UGhtZlh0NXV0MEVmSnpPYXBOSUNVS2FTRk1BQmxMR3BTazBZVWczY2FKb3VIRVJsaTY4cGhzUkROTGMzRXl0SGlWSHk2QzdLNHNzelhkOExMWkV2VnBOc2w3TkZyVkVFVzRzVVlTYkdCaHB1YUFtcGpSdEYxUVVGeFhkQzR4Uk1uQnFJUU02WmtPMHk3NStvemFNR2RDUDhwZnR1akcyZU9HWCtPcnM3M0xydHk4blkrTmE2cys5Z3h2dWVKQ1pZLzI4dmE3aXVEK2ZRSXdDcGx0V213L3dTaXZXWm1tTklHRzFZVnR0Y1dtSUdBWXhhUkNWT2hFWkl5U2poRUloV2xwYWFJd0hxWTM3cVlvMUhCOVg5RkIxTFFjT1ZWTmIxNUFvN1docG9TVVlJaHdKRTdXS2NHTkphODJ3dXd2c0xLZ0lIZGd4V2RPRXN0Wk9RVVN1cDJ2L0FvWkU2K3Evd3hIeGtKMmJtMWdha3BsUGRrNHgvZnNsZnVlYzNFemlrYy9OeGY3bUgvLzR4M1BUdUtSMmxsU2taa25qR09qRWlVa3JVMnJxUkNJUlFxRVFUVWFJK25pQVEzb3pOYnIvc3dtYkhvOWJMbWc5RFZacHh5ZnZyT0t2ZjkvQTN1WW9rVmcwVVlTcjY4U2pBZEhVN0Nlc3QzWVh6SnB4amN2bjlkNmI3ckUzLy9SNlNzKzdseGNQcE54UTl6SXp6cHZHUSsrbGNSMys3eWVNdldrWjVVcFRUaU95eVBqMUxmVForVFd5Q3gwWDdJVHp5Rjk5QzcxMzNrM3ZkNjZueHpmN3Q3bUlqM1M3NHZPblQ1OCtNd2VJN2hrT3E4MWpoYjAwYWNYYVpFTFlFdUxXSmtzYUowSkMyTUxoY0tJRUpCNmlMaDdnb041SVhCcWZYdGlTcFIwTmpUVDUvYlFFZzBSMEEwdy9GZVhWaEdLNm5RVWxiaVJNZGRsYWlLczk5L2pQN3dhKzNPR3p4ajVrMGE5ZXAvYW9YbUlMYTFaOVFNblVTeWhUMTh6cFl4Vk9ta0MzUzFNYTAwdkhrUC8wQ0Z3Yi8wbjlWWCtrN3BkMXVPKytuTzVmeXpxNjJ4VW5CRTNUSnE0KzR3ZFRIVmFicDFYY3BJdWt1TFc2cERwRzRwQnhZbEluR28wU2lVUUlHaEg4Um9qR2VJdmxralorT21GcjlnYzRjS2c2VWRyUjFKem9BdzJHaU1STnBBRFpjcENxeG9qZEJ5cmloa3k0MTFJS3BCUU41UjhNZHJsY2N3NzdyRG5aOE1aL3N1aWZMVWQraFhWdjg5SjdnNWg1VVM5MXhad3U1UFluNzRFQkdLOVZZanBDZWU1SlorS3AzVW56STl1SmJXOUUvKzgzYWRuZ3dqZXA3MUhkcmpoeGRITmwzZlRINHR2N09jV050clZ0d2xuYjVyVGFZc1NKeFdKRW8xRkNNa2FMR2FIWkNGRWZiNkU2M2tUQUNCKzdzRlVkU0hRWE5EUTJPVnFtd3NUaUpyaTdrWjhoQ2RmWEVkVGoxdURJNUtRU0laRmFYcDc0MXVabFB5bVpObmt5cFdNbU0vYWFlU3o2Wjl2QW4zZmdWZHd6R1Y3NjZYTnNQa0lNdXZhTnY3UDVDNWN6dWZCdzRyZVB6VnYyNFZmWFV5Y1RxQjU0Si9URjdTd0RHM3NSUmUvZFFON1lqa2JUdVBEY1BZSE11azAwLzNmYlVwTDQwdi9pME9WdkVZdWwvSWpQZFZTM2QwVUdYRDNuVTlXd0ZWODJqMXN2c3djM25zbVZjKy9tSEd0UHNmdWNPL251Tjg0NXhrYzBpUDdnZVE2TWFGdkRkaGo2bnA4eitHcFNFd2xDdUt4RFF4TkpxODFJSkJLSVc0a0VYZGVKeFdLRVpZeVFHU1ZnUkdpS0I2azdveS9oMzF4RXo5ZHZTaDVGLzNGbXUza3NiY285cW12ck9GUlRTNTA5dGNOcW1RcEhvc1RpRWt4QlpsRTNYQWVhOERlN1JKYTN0UThVaVFnZjJINUozYXI1ZDh4Nk5zWU5QMXZDczROaDYvS2ZNK2YreHpocjFVS21KaS93ZkNaLzc5dHN1T2JuUFBUY1ZieDZkMGV6SmcveHlpdjdHRDlyTEhuMnR3Njh6WUtmTG1OenJEL1gzUDF0SmdlZVk4N1NGc3A2dDdENXFWRTgrdFJNaHZtVXBweHd2SVZrL2VKaXNrdmp4RmYraytZTlJYVDd5Wm13SjRycmdiRkV2dk15TGRzTnFOcEg1TlVvK3A0T1lpVkR4OUo5R29SdS9RQzlhRkpLQ01OQU9nVFFOV0VjT2VPaVJPN2JkM1MzbnlZYzJGZkJDOC8reHhIdk4rbUtyL0hGOHk4NnFzZjBYVFNRZ3VlbUFoQmF1WTJtSDZ3OThzOW9ucHZlNlBmQU94ZnQvK2ttSUc0ZGlYNVNwQW5DTkVHQXhBQnBJSVdPSVYzRUVaYXdSV1Nja0JuREp5SmtHbDZhbTNiUXdCZW85NFNURzY1aWRhT1E3T3BZMkE0Y1RHUkJtNXFhQ2JRa0NuSERZYXNJMTVCSWFhRExESEo5UWpSR3drUTBqOUJNS1VpOE9NM3I5ZDZWZDk2M1diazhuN0krT1FCTW5IRTV3NVl0NDRNS21EckM4V1NGbHpELzdwZVo5S3ZIZVA2YXA3a2xYU0g0M3RkNTZlQW81cDJmay96VytxWEw0UGJIV2RsN0s0c2V1SXNadWRONTlybXJLQVBXLy9SZVh0bzVrMkVqbE02YzhMakt0UFBKcW4yVDJ2dGlaUHppTW9xdTkrUC8xbjhUM2dQaWExZFJjRVVQV3JiWFFkVWVBai9hMDhHajlDRDdKeU1Rci82ZHdJY0dUT3JBb252Z2VncG41Q044Y2VJci8wSHozMExIY1B1cFQ1LytBN24va1NlTzYyTkczNmpnd09Dbmp2bm5TbjA5cndIK0RlaUFMcVdNQzd2T1RhS1I2RXJBQk9LWVVwTkN4SVVoUlR5ZXNOcGtuQWh1UW1iQ0pXMm9yR0hIZFM4UXp5aG1lR2EvSTd1aSs2dGFYZEJtZjhJRlRmU0JKa1lSNllZRWFSQ1B4OEhud3lVa2hoN0hxdkxSN3YvYnJ1dUZFRmY2Q25Pby9jZGpUTHZ5U29hZU41blN5LzZERGJFWTZUek9rdW5mNXA2QnUzbmlwMytuTXMzdFcxZjlIZjlGVnpIZVlZSDV2RkM1WXg5YmQrNm1QT29sTDdDUHlnQkFDLzVBNG5iRmlVZjY0NGlpSG5oSEZlUHJDMmJNaDZjdzhXWm9lUzVrNE1qWkxOZjFFOGp0K3duK1grNXpXRjd0WFNMOXViOVJlKzFmYVBqaEx1U2tTZlM0cWNjeDNLNDRrYmlFZHRtbWdUKzV3T0dTZWxwcjI1SWRDWmhPbDVURTlGMWQxNU5kQ1JFWlMzUWxHR0dhakNCMWV1Q3dIUWx1Z0ppdWM2aTZwdFVGRGJaT3c3WHIxZUptUXRpTWVGekVEWUhISllRUk40VmhDbTFvWHFGTGM3bnZCQ2hmOWhDelh1ckZ3bC85bnFsRDh2RUYvczZNeWM5MThQU0R1T1dCcTNocDFuTXNlbU42cXF5eDdCOHhKdjlzRkU3UGN2VGRQK0RLNTVieHU0cEIzUHlySll5dWY1bTUzNzZMeGJRUUhUaUxKNGVvaStta0NOdmYzc0JmZEQ3Wk0rTEVubnFWNW0wOXlQdVBhUlRsdVlCcUFuY2RJWnZsTFNiN213UFFpcURIUDB1dHYySnVCTkR0Lys0a2ErbC9VZnVyT2l1bTJraThEdUxiNnpEUDZrdkJ0S0c0WC9nWDhXVE05UWkzSzA0b1BUM2RyaDJoOWY3WEZ2T2dibGx1VHBkVWdwQVNhVnJpSnVQU0ZDSWVseTZYQ3gwelVRSWlkY0ptakJZalFyTVdwc0Zvb1VadnBzaWRoMGU0MGd2YkFhc1h0TEdweVdwd1Q4eFlpOW9ON3JwTzNBQ2thWThqd2hRdU5CRVhwcFRDazkvdm04QTRhR0h6UDNlVE4rYWJUQitTbjNpR1FBdUh5dy80UnN4aS9wV3ZjL05UeThpTmVaTWxIZEgzWG1hTjd4S1dwcnFWdnY1TXZmc0hURTI2dEZmeDVBdFhFWTJDVDhYV1RpSWhvaStzSmZxQy9mOEEvaHYzZ2RjRnNhT29QWXJWMFRKN09TR254VDNxZkFwL2trWHcxcldFOS9qeFBuQTkzVXUzMFREN3c2Ukl5U2lKbkJzdXZBOWNlNWpiRlNjdFRJSDQ0cklCZDA4ZXNmZUJWVW1YRkd5WDFHcTVRaVJNcDBUNWg1WVlUb2t1VFhSY1JORUp5eGcrMDBPTEViRUtkMXM0cERmUnoxdlEvam5Ea1FpSGFscG5yTFVFZzRuQmtkRldhMDNYZGVKU0lqR0ZFVTh1T2haQ0NIRk5XZSs4RmlHK21YaTRITW9HNWxQM3IyVTgvOC9kYkgzdjd6eDAvMUkraUVHMFEzWExZZUxkMytaU2dnUmFyM0xXdmJTUm9pc3ZaOWhSbmp3bGFwMlVWRkhyVzBydXo4L0RWOWpleFRUMzFCSGY3ampxb2hDTkpyNWZGMFBmV0ljWU40YThiNWJpTHUyQlo5Slk4cTdJSXY3V25rVDErbUZ2VjV4TWVyaXpyNzA3NTh1NXBEVElKMXhScWFWMkpCaUdJUXpEd0ZrQ2ttaVVqeEUwSXdTczhVYTF1cCtJMmI0OVRtdFhzNVpjbmRjcWFyb2V4N0NHajVpbWFTMW1RVWlFZUd6dTJObGVXdlZuOU8wLzVLRVJoM2ppZTdjeDdZRVYrQytieGN6aE9VVHJEMU96Vm5nSjgrOGUyZnFITmZBMkwvMnpGOWRjMWw5ZEVhY2FmZnVUT2FrVVg5OWpMOEdRYS8rUCtoL3VRWHh0RWtWLy93YUZQeTVGdnJxV3hsOVdIOVh0aXBPSFFBeTlzK2VsbDlLMmFMZE5INmxkdEdzbWhBM0RTSlIvNk5MdUpVMklXOGgyU1kwUTlVWUwxWHBUKytmNzV6OWVZbGQ1UmJzRkxmNFd5eVZ0M1R3bG90SEVMb080WVFocFNtM3Jodi9OSDF4MnhqdHduSnNDRHJ6TjgvL01ZZXIwVVJTcGE2SlRjbURjeTEzNjlmZlpjTlV4bUJzRGp1cHVobUZRV1ZuSmdBRURqdnFodS9ET2d3NTU0NDAzMHY5aGtuTFBILzd3aHp1ZWYvNzVPaUFJaElDd0VDSm11YWlHRU1LMHRsbEphOUdMdExkWTJjdGVjbkp5Nk5hdEcvbjUrUlFYRjFOU1VzS2dRWVBhN0VodzE5VzNyMW16VnVjbHJEVnIwMVE4Ym1CWTFwcVVDWFV0R3pqZ2x1TXVhZ0I5THVDVzZVbzhGS2MrRXlkTzdEU3ZwWFV0Nk9kRzZhaFJveVk5Ly96eksrMVlteEJDeHlyL0VFS1lRb2prbWo3bjNsRjdXM3hPVGc1NWVYbms1K2RUVkZSRTc5Njk2ZCsvUDRNR0RhS3NyRldLTkhzcFN6RG9xRm16ZHhmWW9tYjV1NlpwQ3ROcW5kcjBmNnR5WFM3dEZuVnBLaFNLbzZWYnQyN1h6SjA3TnpmcGprcnBzZHpScEV1YVdOZHBDbXU3bGJCTFB4THJCeEt0VnZhbUs3L2ZUMk5qSXpVMU5ZUkNyZldLbWoxbkxSUU90NDc1dHVKcXVwNFV0bmJXMm9oaFEyWUJnOVJiZFhyaTZwVjFlcngyemFYZTdPT0lFS0xzdnZ2dXU1ajJTUVNYbEZKTFRONld3alJOTEdGTDFyVFo0bVkzeU5zejIrd1Zmb2NPSFdwOTJ4SWRCZ2tYTkdLTitVNjRvRHB4bzYyMUppMXI3Y2F2WCsxeXVWdzNxYmZwOU1VM3BxRHJ2dll2RkI2RENxcGFrZU5OZm43K1YwdExTNzFwckRiTnR0b3NjV3RudGRuaVpvODFDZ2FEQkFJQkdoc2JxYTJ0SlJKSkxIL1JuTmFhTXd0cUQ0ODBEQVBUTUszbExBbHJiY21UaTI0RVZPUFNhVXplUFdlVGRYVi9YSDJ6dTQ2bDFqZUw3T2xua0RkbjJOSC9rQ2RUdmRuSDMybzcrKzIzMzU1d05GYmI0U3czcDlYVzNOemN4bXB6Si9ZWFJOUEcxaEsxSkNhR1phMVpGcHZtZHJ0dlZHL1A2WTNXelV2MyswZWQ0cDlBRGJ3NTZzMytIQ2d1THI0Q2VOTVN0cGlVMGkyRWNKTklKR2d5Z2JES1BxUmhHQ0llajh2VVdGc2tFbWxqdGRYVjFWRlNVb0xiS3VXd2Q0SW1sVEZ1MVpFWXBvRXBKVkpLSklqUXdSMVRnQXZVVzZNNDVjbnNCa0o4L3M5akduQm9LN1RVbkRaYnNUUTRiK2VyaTBjTnZ1S09qWmJGNWtGS0hZRkxTZ3dTaGhTbU5ER2tnU0YxNG1hVXVCRW1IZytpeHdQRVlrMUVvZzJFSXpXMGhBL1FIUHlFK3BiZEhQTC9PeUZzeVdMY3VHMnRHUmkyRzJwS3BKbFl6Z0pTZUQyZUdlcUtWNXp5dUgzZ3kvdjhueWZVQ0pXYlFRK2RkcWQ0WU4vaVNjQUhTYXNOUEVJU1IwZ1hDRk1paFpSZ1Npa053OFF3VE9LR2lXNFk2THBCVEk4VDFYWENrU2pCY0pSQU1FeFRvSVc2eG1hMGFDVGhndXB4dlcwVzFISkRyYVFCVWlLYTltNFpJWVM0VmwzMWlsUGJuSEJCVHM4VDgxd3ROYWVscUFGNDNPNnIvdmUzQy9zbExiWkVuQzFsTndLWVVnb2pFV3NUY1NNUis5ZU5PSG84VGl5bUU0MVo0aFlLMHh3STBkQVVRSE9XZHlRTGNXMFgxRFFUYm1qQ1d0T3lzN091VTFlOTRwUzMxUEo2SitKcko0TG1BNmYxNlI0N1lzaUZwR3l6UWxvWlVva21wUlNtbEppbXhMQVRDYmE0eFExaThUalJtRTRrR2lNWWlSSUlobWdNQk5HU1RlNU9VVXRhYTNiQ0FMSHFUNy9MMERSTkNadmkxRVM0d0pzTnViMFMvejVSbk9hYjVuT3lNcTZZT1dWQ2htMjFTVnZjRXJQYUJJbVpSaUpodFVrTXd4UUpsOVNhL3FISGllbHhJcGJWMWhLTzRBOEUwZXdzcUc2NW9IYlNJR210V1NVZWt5NjY0RnFnbi9vRUtFNE5JZE1TMXBrM0I3SUxvWHNKYmZiOG5TaTY4RUxtNDBUSm8zTnZIWmZHSFhWSjBLUzBoWTJrMVJZM1RPSnhFOTIyMnZSV3F5MFVqaElJaFhIcnVJbmp4c0JGWEFvTUtZUWhCWVlsYUpacWF1N0MwdWtuSkVPa1VDaE9LM29XZEw4RWVOdGh0Ym1GeElXUVd1SXZrSlJTSWd3cE1Vd3BEZE1RY2NPUXR1V214MU9zdGxBRXJkVU5qU2RIaFNSYXA2UjlpTWJHeHVGQ2lNdlVXNkJRZEQyaWIvNkdvWGU4ek5aTyt2cmNMdGNsYTVjc1NFMGl1Q3lyTFRuT1NKclNLdGcxTGN1dE5kWm1KeElTVmxzRWQ3SnV6UkkyTTlrVG1oQTFRT1RrNUh4TlhSNEt4UW1rOGpXdXVQTVZ0clYrL01udE9aREowNmN4ZjBvSmh5MUVhZHpGaS8vclovejBNU2R3eWZndUhycnhLWmFsamtiem5NdmlsYk9ZZklTZi91THd3ZU9BVDFLc05oMkJoaVJSK2lHUXBta2xFcXpTRHp0ODFqYldGbXNWdHRha2dUWEZ3elJ0TjFSb21uYTF1dElVaWhPTVp4QUxmanVIRzNvQTZGUnVXczJjUjU5aWJ2YVBlUGJDd3pUeU4yN2pkOHVxeUx0OERHVW50SEhDemFVUFBzYXo0NC85SjNPek15Y0IvMDNiT0pzYlpOeXFraGFtRldzelRGTWFpVDVTbVlpM0dlaEdhNnd0SEkyaHBicWc5b0hWaUJvTUJpOEJocW1yVEtFNHFTcEh5WmdwM0R4RVovT1dHaXIvNTFkdDNjdnFONWcyN1JmODhyK2VZZXdEYjdCSDM4WGMyUTh6ZDVOMXUxN05TNC8vaWduVDVqRDArb1hNV1Z1ZDNFVVNyZHpFUS9jL3pNaHAzMlhvamIvZzloVzdxTFZ1Vy8vNGc0ejkwWitaZS84dm1IVGpmWXk4NHhtZTMzNk1kWGV4U3A2WjgxMnVXRnFaZU03R1RkeCsvWVBjL3FhMTRyejZJeFkrOE1qUVFmMzZEYlVFcmRVZGxiaE1LVFhEbENKdW1DSnFtQmlteE5RakhLenpVeCt6eXovQzdQN3czN3k1UDhUdURXK2gyYUtXTHI0R0NKL1BkNVc2cUJTS2s0MU83ZlozV0xiRHc3QWgrWlJjT0k3Uk5SK3h5bHJSV3Z2K1Iyd3RPWmV2WFhzbkczOTZFYVdlTTNsMHljTThPc2I2OFpvcWFvZC9nMWRYL29xMXM0dFp2K1JsMXJRQXNRb1dMZndMVzRmY3dOcVZqL0hoenliaFc3MkVPYXZyazg5Y1Z4bm0wbnZ2WSswZkZySjBURDJMWG5nL0tYeEhoYmVFVys2OUNQNytaMTZzOUxQdU55dlpQUHdxRmw2WUI3RUtGdnpvUlRZUHVZN1gvL3I0ZWM0NG03UXlvNENtQ1NGY0FqQk5Jb2JFTUVGQ011YVdHSzBHcG1IUzgreHpFNjZvdy8zRWJuYTNEazBJY2FXNnFCU0trNkZsdTVuLy8rWXdQeGxqNjh2RTZiT1pQeWtQT0lkcmhxeGs4WnVWekN2Tlo5MzZLc291dks3am1GcmZjN2xqVWpGNVFONlljeWg3K2cxcWd4RGQ4VFlyZ2lONGR1YVppVEg4SldPWVAvMGRKcXgrbi9JcGx3SlFPT0pMVEM1T1dJMmpSNVRBK21vcUljM1kvaml2UFRLSFVzZDNMcnpuNXl5ZGxJV3ZkQXFQWHI2TkdRdWZKQzlZd3J3bngxRUVSTGU4d1lyZ0NKNmNlU2I5dkZ3Q0xFMjEyb1JJZENJZ2hLbUJRRXJNaFBVbFRNT1VpVGliaGlIQnRGeFNkNnExWnJ1aGdBaUh3MU9BdnVvS1V5aE9kb3d0bFR3bWZ2bE1Gcnk4amZMcCtieTJJNThyYnlzK1dxODI0WUxxRUcwTUVDMCtpeExIMkxtaW52bjRHcXM3dE1wOG55ckc1bUhZVnk5aTlNc3ZVdjdsNjVodS9VN1JSaitCcGdwdXYvNTlnRDREQnZRZjhja24rOTVyRzJkREJ3UVNJWVFRbWtDYTFoUnowelN0amdRd3BVd0ttNVlxYXBhbEJpQzhYdThVZFhVcEZKMlRvdkZqR1YzelBzdit2b1hOSmVPWVduTHNqK0hya1ltdnVwcktXT3YzYW1zYWlQWW9QczZMbEVLc1g3YWF6U1VEOEwyMW1oZXR4V0crbkR4eWUzNko1U3NmWS92S3g5aSs4aisrbUdxeFNkbmFpV0JLaVNHbE1HV3FLMm9tRnBTYWlkSVB6UkkwZTZpYnNNczhMRGRVQ1p0QzBWbkpPWXRyaGpmdzRyS1BLSmt3Z3FTdWVUUHhFYUt5NmNoQmZ0K0lpNWp1Zlo5Rnl5cW9CYUxWbTFpd29vclJVODQ5cnFVaTBTMnZNUGV0Zk9ZOU9JZEh2K3huMGVOdlV3bjRobzlsTWh0WnRLSUNQNUNoTjE2VVlxMGxWL1JKcEdaYW9tYUNFRWlpRVYzb1JweHd3RTlkSEtTWnFHdHpweVlOYkRjMEZBcGRyTnhRaGFJems4WEVTWVB3YmZCejVYakhxUGFTYzdqNTNIZDQ2TTRmcyszQmhUeDZ1SWZ3RG1UZWo3L09nbDh2WmRJMFA5SHNmQ1orZFRaUFR2azBvOS9ieDlqZ0xCYTlNSWtQZnIyQm9objNjVU94QjJaTVkvSTlMekIzOVZrc256S01oVCtleG9KZkwyWENNajlSYjE2ZnkyWitlOGcvbHYzbmh5VDdSbkZKbVJnWmpoQkNBeUdsa0Y2WElLcEhPVmdmdytWeTQ5TWtwbFgrSVhyMjdFazBHaFd4V0l4NFBDNU0wOVNrbEM1ZDEzK21hZHAzMU1XalVCd2RuMmF2S0IrditteVcwS1kvTW1sNUNjdC9lUkVscDhoNURJWWlTM0xHWHZzaTBBSUVnS0NBTUlLb1FPaENZR2hDbUc2WEpyMGVGejZ2UjJiNnZHVDZmR1JsK3NqT3pFQkx6WWFTcUYvVE5FMmJwQzVWaGFMekVtMnM0UGtWMnlqNThybW5qS2dCWkdYNnprdm5pbUxOYWNOdXM1SlNKRG9SVEd1RmdaSHNSTkJTaW5LUlVvcUdob1pocUdVdENrWG5aYy9MWEhIck03elU0eW9XVHNrN3BYNDFJY1RacTUvNVVlOE94RTFJaVVDQ0thMU1xTE9IMURyY3FRM3ZKSHBETDFKWGprTFJpU205aXJVclQ5M2ErVEZubnprTTJHOExtd1NYa0dnSTIyS1RRb0tVZHUrb2RkaGJyWkpaVVZwSEZBbVh5M1dodW5JVUNzWEpvbnRlemlqTFNrdE8ra2djc2xXcnBOMC9LcE9WSFlaMWFLa1cyL2UrOXoyWEVHS2lPclVLaGVKazRYRzd6aHQ1WnIrVWh2aGtuSzExbEJHV0t5cmJ1cU5haWh2S3d3OC9mQUhRVFoxYWhVSnhFdW4yL0NQZkxYVmFiVExSRkovWUZpL0JtcTZMdEVRdE9kTElhYkZaQ0ovUGQ1NDZwd3FGNG1SVFd0SnJTSHRYRkszVkhVMFlaYVoxR0xJMUVhbzV5enhJekY0N1g1MVNoVUp4c3NuSnpqekhZYkcxS2Z1dzlVcGFXVkpwN1Q4MlpHS3NrV1piYTFKS2NlMjExN3FFRU1waVV5Z1VKeDIzeS9XRkFiM3lYU2tXbThzU05FMUtCRmh4dGpidWFHdU1UUUJpeVpJbFh3UnkxQ2xWS0JTZHdXaGI5dWg5L1oyaUpxMTlvemhXOHlYaWJNNmFOb2ZGQnBDUmtmRUZkUzRWQ2tWbjRjd0JmZHNrRUdnYlp5TTF6aWFsaVNuTlZ1VWpVYjgyUnAxS2hVTFJXZWlXbXpXRWRzbUR0bkUySEhFMjAweTBXYmtkWTRxRUVPSmNkU29WQ2tWbndlTjJENmQ5akMzWkw0cXpuaTNwanJaYWJPemF0YXNuTUZpZFNvVkMwVmtRUWd6NjVmZG01WFFrYmlSVUxWblBacnVsZG94TjlPblRSelc5S3hTS1RzZWw1NS9ieHhJeWErQWtHaEpoVDlXVldKVWRWaGVDbEk3c2dzZmpVY0ttVUNnNkhYMkxDL283ckxSMnRXeFlJNHhhdXhBU3dvYVVVcmhjcnJQVktWUW9GSjJObkt6TU14eWkxa2JZckRoYndpT1ZDTXNWRlpyZEl5cUVVTUttVUNnNkhSNlBlMUNLcUxrY0ZodXQ0cFpJSU5pdUtOWWR6bEtuVUtGUWREWTBJWVk0ckxUMkpSOXBFZ2dhSUdwcWFnWnp1SFdCQ29WQ2NTU3FOekYzem9NTW5Yb2ZjOWJyeC9PUmZTc2Z2Ny9RS1dqU21zZEdzdVREVGlBNExMYWNuSnhCNmwxUktFNVgvTHg0L3k5WVZBbFV2OEcwNzc5QjVURS9oczZhRi83Q3VwNVhzZmFsWC9Ea2VFL2JtN2UveElRYmw3SW05dWxlNGREU2ZrV2tMZEsxT3hBU2dxYnJCdUc0WmJHNTNlNHk5ZVlxRktjcExidDRzM0VnRjVaQTdaWnRSSWNQK2hUTFljTFVOdXFVakJqVVpxdDhrdEtMZUhMZUZNWjdQOTFMTE95UlY1ekdIUlZ0RHlrTTB4UzZBVzRwcGRBMHJWUzl1d3JGNmNaVzV0NzZJdXVDWWVwaUhqYmYrQkhSWUlDb3Q1SUpOZGV4ZHQ0NWJlTlRzVXBlZlByUExGNWZSUzJaRER0M0NndnZ1b0JoT1pVODgvMW5lR0pIbk5pT1JZeGRQWlpuRjEvRGFPZlA3bGpMN1kvb1BQcW5iekQremQ4d2NobmNVQnBtM1k1cWFtT1pUTHpwTmg2ZFZJeXY4VzFtM1BvT2VSZG1Vcm05Z2RvbUtQdnlOQmJjT0tSUFcwc3RHVjhUSmxKb2dHN2F4bU0wNFlvS0lRYXFOMW1oT04wWXhxTy9mWVNWTS9veWF1WjMyZmlIT2R4Uk1vajV6enpDVzZtaVJvZzFqei9ERTQxamVIYkpZMnhmY2lmWEJGY3o2L0ZOMUZMQ25iKzhqL25EM1l5NmFSNGJVMFV0SFRVTk1HVVdhMy83Q0cvZE81RDFTMTVtVFV1cmE4endHMWk1K0dFMlBqT05vdlV2OHBNM1E3MHR5Nnk5dUFGU0NPRjJpY1FkM043RURVS0lBZXBOVmloT1IzUzI3Z2hRZGtZeHRGVHlRYXd2dzNxa2MxZTNzR3g5SnROdnVvaGhPVUJPQ1RmY05vNjg5OTloWGVPbmVOcWVaM0hOaU1UYXdMelNNeW1MTlZBYnRHOHM1c0l4QlFsaDdYRU9kMHpJWmVNN08wbzZFRFY3c1Fza0J4VkozTllOU3RnVWl0T015dFhQTUdOWkpmNm1NR3g1a0hXRXFRdDYySHhyQlRjLytEM3VkQWFvbXZ6VVVrQnBUNmM0OWFXRWo5alRDUFQ0REMvRXlqTkVkU0JOREs2b09BLytIZW1YWXJFSkNacEltYVpyeTV1MmE5ZXVZaUJEdmMwS3hlbEZ5WlE3ZWV1WmFZenYreVdXL3VFUlhwMTVKbWRkZFRjYmY1c2lhZ0RkOHlpaW5qMDFiZDNKV3ZJbzdmSDV2czdLeWdiSXpzMzQyYnhiY2pxMDJGTFFDZ29LZXF1M1dLRTRUYW1wb0prdkJxQUFBQ0FBU1VSQlZMeTRoREtnZkU4OUphWEY2ZStYTTRLWjQ4T3NlT0Z0dHJZQUxaVzh1UFFOYXMvOUVoT1B1N0JWc2VwL0svQUQwY3EzZWVMTk1PTW5uTWtYQjUrUjV4Q3kxbnEyRktScDR2YjVmTVhxM1ZVb1RrLzhsUTFRTW9ZOC9KUlhlaWliNHVuZ25sbE12dmRPYXAvK003Tm1yOFFmeTZScy9CU2V2V3NNUmNmOVZlV1NWN21hYWRmdm9qS1d4K2dwTi9Eb3BEeWFkL2ZJNjhCYWExMUdKUkNHYVVnUmpVYnY5SHE5VDZ1M1dLSDRiQmlHUVdWbEpRTUdIRVBJK3VOVjZzUTVhWHliR2JlK3o1Vy9uY01OS1paZ1pYWGRnbjVmdnZrZElHQWZBa0lJSWdJUkV3SkRFOEowYVpwMGE1cFdwTTZtUXFIbzdHUmwrUEljYm1nYlM4MDU1UU1rbXFacEJlcVVLUlNLem83WDQyNFhZeU5kakExd0N5SHkxU2xUS0JTZGdoNFhzSHpsQldsdmNydmJDRnY3UXlKc21kUDRiQlVvQ29WQ2NVSndhVm82VjVRMlZwdFZxS3NCZWVxVUtSU0t6bzZtaVJ6U3hkWmtHM0VURXRDRUVFcllGQXBGcDBlSTlzS1dhcm5aWFZVYWtLMU9tVUtoNlBUQ2x0QXFwL3VacHV0QUpvVXRTNTB5aFVMUkJTeTJ6QlJSYzJpZWJDTndHcENwVHBsQ29lZ0NaQnpHRFcxanRXbWs3YWRYS0JTS1RvZTN2WGVhVHRaUXdxWlFLSTZHRUp0WFBNT0U2Ny9MME8rL1J2bkpFN1oyQ1lOMkFpZGI1NGNyRklwVGxTMS9adExDajRpaXMyN1JRdVp1K2hRYnBDcmY0YUZsZmlZL3ZKRHR2N3lVNDdja3BaNTEvL01HYTZxUDZzNnV3MWhzMWtaNE1HbHRTMUFvRktjb1d6ZFZVRFJtSUQ2cWVHMVBNUmNPOFJ6N2d6UTJVSnZkbHd1SEh1OWNZd092clZqTmEwZTNGa3ZyMEVxelRMWEVKbmdRVWtxcDNucUY0clBUMmFaN2xQL1BrOHhZVVlXL1NjZlhQUk9mbmxqYVVwamRrNXQvM0g2WVpPMm1sNW43bTNkWVg2UGo2M2ttMDJkOW5mbmpDNGl1WDhxRXh6K2lMZ2k1MlptTW4zMGZ6MDVxVy80YXJkekVnbCsvd2lzNy9FU3ppNW40MVdrc25ING1SY0M2UmZjeE4zczJHNzkxWnVMTzYzL0QwTi9rcy96SGVTeTRmeTFibThLUW5Vdlo1YmZ4NmxjcjB5NXplZlMyY3lnQnhQQ3AwNEFnaWVrZWZxQUZDQXFJU3RDQk9DQTFFcGFiUXFFNHhTajc2aHcyL3ZZbXB2WThoMGQvK3dodjNYc09mUytjemNZL3BKbVFXL2thc3g3OWlKSlo4L2h3NVM5WWUxcys2eDVmd3FJOTRCcy9pNDBQanFPdys3azgrYWRIMm9rYXNRb1dMZndMVzRmY3dOcVZqL0hoenliaFc3MkVPYXZyRC84Q1N5NWw1UjltTTcxN0psUG5Qc0tyc3daYU43UmY1dkxRV2orSDFTcVJtQk9lR01xbW9RR0d1Z1FVaWxPVW1pcktldzVpbUJmS3QxZFROcnh2MnJ0dFh2ME9sY09uTUc5OEFUNDhGSTJaeXJ6aERheFlYWEhFcDRodWVac1Z3UkhNbTVtdzBId2xZNWcvdlMrYlY3Ly9LWk1NN1plNXJIOXJHLzcyV3RXK1Y5VENEY1JJcmxOUUtCU25CbHQ1Nkk2L3NLYkpUMTBzazJrM3JrN3NETTEraEFudlQrUFZlV1BhTkluWE5vYkpLeTV3ZkMrTGtwSmMvSlgxUkJtWXNvb3ZSZGdhQTBTTHoycXpLTG1vWno2K3htcHFqOE52a2xqbUVzYWYwS3FqUXVNWTdxeFFLTG9LdzFpNCtHR1dmam1mQys5NmtJMS9tTVhVbmlNU0xtbUtxQUVVOWNqRVgxMlBQL2tkbmNxYUFIazlDZzRyYWdDK0hwbjRxcXVwZENoSmJVMEQwUjdGaWJIaG43R2d6RnJtUWw1N3JaSXBYOXNJVzFoZEJBckZxVWlJOG1vb0s4bUN4bXJLdmNXVWRTQXlvNmQ4aVpKL3IyWFJKajlSRW9tRUo5N1BaL3FVZ1VkOEZ0K0lpNWp1Zlo5Rnl5cW9CYUxWbTFpd29vclJVODZsRENncHljZS81U1BXTitwRUd5dDRmbldGUTZFOCtMdzZ0VFgxUkpQZlM3L01KUThpUi9Wcnk0UXJHbElYZ0VKeEt0TEFCNVVGbkZVQzdLMml0dWVnanV2UFNpNWw2ZHd3YzMvekNDTWZzYktpOTg1bVh1bFJQSTEzSVBOKy9IVVcvSG9wazZiNWlXYm5NL0dyczNseVNtSTRkOW5sMTNIUGxxWGMvdi9XRWUwK2dLa2o4c2xOL25CZnJwa3lrRm0vZVlSSmUrN2tyWm5RMFRJWEtXVTRqWFhtK0w5QUNJa3BUU21rbEI4QUk5VkZvRkI4TnRReWwrUEFZWmE1bUZKdWNZMjQ2b2UwbG5zNEY3cEVCVUlYZ3JnbWhLbEpLZjNxYkNvVWlzNk9sTEtsWTJ2Tm5wMmJRQU9Vc0NrVWlrNlBhY29XaDRESmRJSm1lYVM0cFpSTlFnaDExaFFLeGNubk1NdGNETU1JSE1aaWMrb2FtcFN5UVoxTmhVTFIyWWtiaGovRllwUHB4VTJnU1NucjFTbFRLQlNkbldoTTkzZmdma3JIdWdNQU5NTXc2dFFwVXlnVW5aMVFKQnFnZld4TnRuZEVRZE4xdlZxZE1vVkMwZGxwOGdjN2NrV1RZbWRuQzl5UlNLUW1KeWRIblRXRm9oUHh5WUVhZFJKUytHRDdua0RIb2lhdEZhT0pRV3p1Z3djUEhpd3NMRlJuVGFIb1JBem8wMU9kaEJTcTZ4dnRjZy9URmpXUjhENmw3WUlLSWRBMGdUWnk1TWdhanJZSFM2RlFLRTRPa2JtL1dobzZqQ3Y2Lzl0NzgvaW82bnYvLy9VNTIreExsc2tlRWhLV0VFUkFLK0R2aWxoLzZOV3FiUzlZV3JTOVNsdSthUHVyMUc4TDFRcTl0cUJ0b2N0RmJ5dFdyMWhic0ZxZ1ZXcFJSQlRVRmxjVU5TeWFSQ0FRUXNqQ3pHU1ptWFBPNS9mSG5IUHltWk16U2JCc3d1ZjFlQndUQW1hWk0vUE02NzE5M3RUYUNZKytvM2IzODhlTmk0dnJUQldsOUlBTlpEcmozREpFRExCUlN1aysvdEJ4Y1hHZHFkSjAvYUFOYWhsdXpkeVliQVNrYWJEcHV2NHhmK2k0dUxqT1ZDV1Rhck9EWTNOcytTQWt2Zk9BYXByV3lCODZMaTZ1TTFYeDdwNW1oeEEwYSt1SGxLWmhza0ZSK041a0xpNnVNMEVwYkZqNkE4eC9UVTMvc1dBYWZuN0haMW94aEJ3YklTUmRHUVZBT3pvNjZ2bUR5Y1YxWmluUjlCWVczWGszeGw5M0cycSs5a3NzMk56RW5ESTdORURVYlg0ZWEzZWZyTE5rVzdCcDdTdlkzbkdpUDYrTTZ4YjlDcnZXL1JMdkxCZ0hCVUJEL2I0MkJtWTIxMmFPVXhIcnZ3SUFXbEZSOFJGd25JOFpGeGZYeVZQeVF5eForaVIyVk0zQStzZC9oczBMejBmVHd3OWd3ZmJqZ1ZRUGRyeXdFV3Yybkt6VC8xdXdiczFMMk5aeGNqNjdTNUVSVEFlU2lUdSt2N3pEN3RRSW9JTms5TFNsQ3dna0hZcWExbTRYZ0FuOEdjWEZkZm9WM2Y0U05tQVNIcDE3ZnZvNDczRlhZT24xYitPYXA5NUQ2NVRKaURpY05MdHA2Zi9Ga3NMYjhQTGNTdXg0OU9lWTkydzdvbDBxa251V1lmempBT1FSV0h6ZlhGeWZBMFEzUDRCSmF5VmNWOWlPSFEzdGFGVktjZjNjRzdGNFN2bzQ3OFMyaHpCK1RTSFdyL3c4YWdFQUgyTFIxeDVHOUxzL3gzMFh0dUNSTysvRGlrWVZpVlFQdHY3d0IxZ053RFg4YWp6KzA4dXlIeitlb1c1c1g3c2FTNTdhaGZvdUlGZzJCblBtZmhtM2pnczYvRnU2eHdZMUhZQk9BUW9LQ3FTM3ZoTmlMQmFsZWpySGhuUmx0RTRRQkE0MkxxNHpRRTBOTFVEVlpBTXFhVldQcmtUd3FROVJqOG5wN1U4RGFPTE5QOERyTjBleCtzNjdzVzdLUXF6L1FsNy9mOVNwWXNLaS80dmxaVEphdHorS0dmKzlHbFVyYnNPTmhZTjlkNFg0K2svdndkZXhFL05tUEkzcWV4Y05iVGNDRzJhL3RSNjNQUVVzL09uUGNYMVpDblViZjQrYjcxbVA2b2R2eHBXMkNVOWQxK3ZSUDdlbUE5Q0oyWlJMUVRWS0lZR0FDQ0lFUWdnRlFGVlZyZU5QSnk2dU0wT0pMaFV1UmNwY2ZlZVQ0RXFwSnk1blZEQUNVOHJTSzRValU2N0dEUVVmNDIvdm5hSUR0UlVacmxRUFdqdWlpTUtMMnF1L2ljMFB6TUkwaDdGMVhVdnVRLy84R2hPQ0Vpb1FBSlJDQTFNOEFFQjdlbm8rNEU4bkxxNHpReTZmaEVUU0JyRXVGUWxaR25UUDV5ZFRBR1U1UUxUejFHempkSTJiZ2NlL093YTcxanlBNlYrNUM5UC9hejAydEtpT1AxdXlOMzdRQmpRTjlwWVBRaWhKVDhKVFF2cEdxdWpldlhzNTJMaTR6aEJWMXhRQ2V6NUVYVVo0Mm9SbzJVZ2poeVVEU0NGeHd0YWR4OURVQWdURG5qUjRGQm11Vk9xa1ZSUVRMUzFJakw0TTkvMTBFVjcvMDEyNGIyb1BWdDY5R21zZENoSFI5Z010QnNBMEJtckdaVlJFS1FVRklCQ1N2a3ppVFo0OCtTaUFEL2xUaW92ckRIQnNGMXlCNitYWHNlU2hPdFRIdTlHNit5VXNXTnVPSzc4d0xwMWZ5eWxGYmNGQi9PM2xKa1NSUXV2dTU3SHFmZFgyV1R3b3k1RlIvL1l1MUNlQlJEeUtLQXZDSXp1eGFYYzNnQlRxTnorTlZVY3FjYTJadkI5ZWllcU9YZmpiZTkwQXVsRzMrU1ZzNnJSL2wwR1U1YlJqKzl0TmlBS0lkblFQR1lTdDI1L0FOWGMrZ1UwdEtRQmVSQW9EY0NYN2c3UTNnWStPSGQ3Wmc2eXRIdWxMcHdDSUFKbWtpd2hXOFFDQXJ1djYyNElnak9SUEt5NnUweXlsRWdzWHpjS1MzenlKYTJhM0ErRlNYSG5EclZnK3hXdjhnekxNLy9abG1QZmZ2OEtFMzhzb1BlOENYSGxlQUUwWm4wVEd0SnRtNE1wN25zWTFNNThFd2hXWWY5ZjNjR3VOOGRjK0wzWTkvaXRNZXE4ZDBaeEtYTC93eHI3Q1FlRy9ZZWxOSCtLMmV4WmhWZEtEQ1pkZWdDbWw5bSt5RXJmTW5ZeDV2L2tWSnZ3ZUNKVCtHKzY3YnlhbURhSFh2K3dMTitQQmp2Vlk5djBmNExZdXdGVlFpZXUvZTZOUjRlMXIwS1dVZnVBVWhwSjBWVlNuNmVQWEFFS29MS2JkR2lFRVJCUkZXZGQxQ1lEYzA5TnpxOHZsK2hsL1ZuRnhIYjgrVFF1VG81c2Z3S1NuUitDWis2NFlZbnZHNmRIaG94Mi9MTDdzUDE5RmVrbHlISmxMa25zQmtoSUlWRUtJTGdrQ1ZTU0JLb3FjenJHWmxkRm9OUG8yZjNweWNYR2RLZHJkY0dDZnphMnhPVFpLakpFcW96R1hrblNPalFwc25EcHIxcXkzRFNweWNYRnhuVzdGdi9hRDVTM0lySVJtZ00yOENDR1VrTDRUZENWQ2lIRktPUFN0VzdmcWxOTHRoSkRwL0RIbDRqcDdGWngrSzNhZjRhOXlWZFBlYW1ydDdBYzFZNVNLQXNSd2JlYU1hQnBxYkI4YmpMZTZxcXJiK1czbjR1STYzWXJHdTk5M0NFUFpjSlNtWTFCWWJvMlk3UjdHSDZpWlo0dkZZcS96aDVTTGkrdDBhKy9IQnhzR2dockpPRG1YUUNCR0g1c2dJQ1BIQmtELzFyZSt0UjNBTWY2d2NuRnhuVVlkKzhhaVh6ZGxnWnBEamcyVUNBU0NRS2dnR0k2TkVYM3l5U2RWWGRkZjVvOHJGeGVYa3lnOStWOGpwYXF2MVRVZVlzTlFOUk51Zldld01lRW5DQkVnRUNGZFBDQ0VtSDF1RklDZVNxVmVjYmxjMS9KYnlNWEZCYVM3WVErblBEaVNVS0NCSUo3UVR1clhhMnRyMjVrdERLWHBBZ0tsNXRRQkNGS1VBRlFFcUFpcWkybXdBVll2bTA0cHBTMHRMYThNR3phTTMwMHVMaTdvRk5nUkN3S3VBUHg1UWZoOGZoU2U1Sy81NFVkL3IzZUFtZ1pBTTFsRkNLRkVFQ0FJQW1SWmhxSzQ0SEs1NEhhNzA4Y1dtWVVEMDdGVlZsYnVCdkErdjZWY1hGeUhVMjdBRlVCaFVRbDhQdjhwQ0hWcDNkeHZmcjNORm9hcUJ0UnNSeGFaUFd5Q2tWOUxnMDRRQkFGTW5zMkNtNnFxVy9ndDVlTGlPcEpRNEE4RVQ5blg2K3JxZWczT3ViVytpbWpha0JrdEhnSUVnY0NDbWloWTdSNW1LQXJqZjlTajBlaEwvSlp5Y1ozYm9oVFFxSkRkcWJWdHg4cnZmUVdmdS94aVRML3FQL0REdnpjREFKcWYvQ1l1dmVSaTQvb20vdHc4OUs5WlgvOVJIVEx6YTdiQ0FYVExpQm1UQm9JZ2dCaFFFd1VSa3VuWUdMaFJTcW1lbjUvL2lwN2V2bHpLYnk4WDE3a3BRb0I0VXN1U1U0dmg1ZnNXNDFsOEN5dWUrZytNVkdLSUlRQUFLSjcxTUxaOUlZRkUrOSt4NE1abmp1ZExIcnIyYzFmdHQ0V2d4bVVQUXlrMFZZY2twNkVtc283TnNHOU9TMGMxVGRPZTQ3ZVdpNHZMV2MzNDRNTWthcS8rSEVZR0FMZ0NDTEJINExwY2NCM251dUtlbnA1dDJkd2FJZENRc1hLUFVsM1hxSjUyYkZRUVJJaUNDRkh2N08vWXpMbFJBSG9zRnRzY0RvZS96bThnRnhjWEUzOWk0NTMvaWZ0M0pKR01KNEZmWEl2UC9RS0FNZ1YzL25rSnBycUc5amxlKytNeVBQamtkdXlQS3lpYWVBM21mZis3eU85c2ZOY0dOYXR3WUxSNTZBUklBODM0VE1sNEhPM3hPQVJQQkZWbFBvakVuUWFiZWVtNm5nRzMzTnpjelR3YzVlTGl5bFFlcnY3cE03Z2FlN0h5aHJuWS8vVy80ZDdweDdlSllkK1RQOENQLzE2Qk94L2NoS201Y2J5MjhuYjgrSHUvUGZUZTFwODBHc1pLdFlNTmxPb2doSUlRS2dvaVJLSWhxUko0d2lFRWpUWVBVUlFnZW5JZ3BDMmNrREV2eXBSVWRVM1ROdklieWNYRmRlSzBGeHYvK2lGcXYvcGRUQzEyQWE0OFRMN2xHNWg0OU9tWDRKaGI2ejlLUlVoNk94VWhBREhDVUVFVUlZb2lSRW1DSUlxaTVkak1rQlI5Ky91MHpzNU9Eall1THE0VHFIYTB0L3RSVkJ6bys1Q3JBZ0Z2MjQ1c1lhZ0Z0NHcyRHdBZ1NFTXRYUTBWUlJHU0tLYkJac0tOZ1pyVnp4YUpSRjVCZWtzOEZ4Y1gxd2xRTG5KejR6amNGck0rUW51Yjkvem1qUVAyYW1qS2hCckpQREhYT0NrMy9mK3lVQk5GQ1pJVzY2dUttbStaWTR5c0FkUmtNcm1CM3d3dUxxNVBySXcxZ2FOdzlSZEhvdTZSMytMbDVnU0FOcnp5MndkZVF2OUpnNHpDZ1hXd3BNRW9RUlJBb05ORWtrSVVDWFFLU0pJSWljWWdzWTZOeWJVUnBqcXFIVHAwNk8rVmxaVUwrZDNoNHVJYWlwcWYvQ2ErZkYvZnF1SjNicndZOXdPWTlNTk4rTVhuQXFpWTlYUDhWOXNTM0QvdlN2dzRya0FMalhqWHdhM1pHM01wVE9NbENCQmtCWDZ0Ry9HT0kyanNKSkQ5WlJpWG13TTVNQkpreElnUjZPM3RSVzl2TDBra0VraWxVa1JWVmFMcnVrQXBsWkRlek9wU1ZmV1BnaUJjeVc4WkY1ZXpQazFicW9ZcVNvRzNZMkVVVnB5OHJaeXFxcjQ0dktKc0pZQmU5RzJqTXE5dVFrZ0NRSW9Rb2hKQ2RGRVVxU1RKVkZFVXVOd3U2bmE3NFhGNzRQVjY0ZlA3RVF3RUlFaVNaRHEyak9xb1BSenQ3dTUrbWo5MXViak9MUkVDU0VSSFY5ZkoyL0hVM0h6b1ZZY1FOQVZBSllSa2JxVXkyQ1FJQWtSUm9GWnVUUkloU1JKa1NZS3NLSDNGQTNzUndWWWQxZSsvLy80TkFBN3dXODNGZFc2cFFFbWdLM1p5RHRXbWxEYjkxNDhXNzJMQWxyS0ZvVHJNSTRyTW5RYlcyRlFmdHlSUlNvTk5scUVvU3A5alkvTnNnaUNBb2FNT1FMdnJycnQ2VXFuVU9uNmJ1YmpPTFJVcENkQkVIRWVhbTA2NGM0dkg0ODg5dittNWxKTmJBNGc5djVhR216RVhhb2VhSk11UUZRVXVsd3VTSktVL2FQd2pLb29pMFRTTkNvSUFUZE1vNDlyVUF3Y08vTFdxcXVxNy9GWnpjWjFiNGVnRmdTaU9KTHB4dUMyTzJGRVJYY2tUYzRMdUs2Kzg4bllXdDZZQzFCeDhUM09JR3RKMWFKcEdOVTJGcXFhUVNvbElKa1ZJdlNKNlpRazlMcVVQYkV5dWpRMUhNMlpIUjR3WXNVdFYxZldDSU16Z3Q1dUw2OXlDVzZGYlJhRTdCa3FCekZVcG4weUpaT3B2bHkxYWROVG0xRklBVWdSUVFjd3dGRlFnb0NJQlpCRlFKTUN0RUhnVXdPc0N2RzRnNEFWQ2ZpQTNDQlRrQUlJc3k3QzVOdGdINDQxUkt3M3BTUVFlam5KeG5lT1FPeEhhM1hqZ1ZRZTNsdEhta2JGaXp6aDNUUlRUb2Fna2lwQWtFYklrUXBZa0tJb010MHVCMStQdUE1c29pdVpiYW9hbHpKSGhWblUwUHo5L0M2WDBWWDU3dWJpNFBxazBUZDgrWWViOHhnSGNtdFozL2xyYVhJbUVVRkVnRUFXUlNxSUlVVXpEVFpZa0tMSUV0eUxENDNiQjczVkRVQlFGc2l6RDd0eHNEYnRXRVFHQTJ0WFY5UVMvTlZ4Y1hKOVVCdzYzdmpDQVcxTU50NmFUOUpaM0toQkFFSWpoMUFSSWttQTROUkdLTE1GbHVUVVhBbDVQSDlnY2lnam1pRlhHN0NnQWJmcjA2ZXNvcFh6WkN4Y1gxM0ZMcDdSdTZsZS8vMzRXdDJiTWgvWVZEZEpnTTl5YUtGRFRxYVhiTzJ4dXplTkdNT0NENEhLNWtBVnVHYTZORFVkZmYvMTF0YmUzOTNGK2k3aTR1STVYUjlvNm4yMXE3V1NobGpTdU5OU0llWkpIdW45Tk1QWWFtQzBlYkc1TmtmcmNtcy90UXNEblJZNGRiRGE0c2E3TlBoaXZybG16NWtrQTlmdzJjWEZ4RFZXVTBvWWYzZitISFlPRW9kWkp1UVJBMnEwSkVNVjBiazJTUk1paVpCVU1YSVpiODNrOUNBVzh5QTBISUhnOEhqakJ6VlloWlVOU0RZQTJkKzdjYUc5djd4LzRyZUxpNGhxcVdqdWlHeDVhOTN6Q3lhMFJJR1VVRFRUQVBFZ3k3ZGhFVVRDS0JRSmtVWVFzRzdrMTJZQ2F4NFdBejROd3dJLzhuRkFhYkc2M3UxODRtcVg5STZQMVk4T0dEVThBYU9DM2k0dUxhd2h1clhIWncwKytaWU1hNjlqNldqelNSUU1JaEVDMGlnWnB0MmJPaENxeURMZExoc2Vsd08vMUlCVHdJUzhjUUZGZURnU2Z6d2UzMjIyNU5oWnc5dFlQVzY1Ti9mS1h2OXpSMDlQekdMOWxYRnhjZzdxMTltTlAvL0t4cDN0dElhanAxbFNRdmhWN3Bsc1RCVUxUYmkwZGhxYUJsbGtKOVhuY0NQZzh5QW1tM1pva2lSRDhmais4WG0rR2F6dWUxbzgvL2VsUGoxTksrUW03WEZ4Y0E3bTFQWGYvNW85dk9rRE5kRzBPTFI1RzBVQVVqUllQZXpPdURLL2JCYi9QY0d1aEFJcnljd0FBUWlBUWdNL25nejBrWmVEbTFQcGhWVWkvOFkxdkhPdnU3djQ5djNWY1hGeloxTnphL3ZRRFR6NDNXRzR0b3lGWE1OeWFKQXEwSDlRVUdSNlhLOE90UlhKRGNCdUxUSVZ3T0F6V3RRMVFKYzNxMm1iTm1yV0dVdm82djMxY1hGeDI2YnIrNXZSdi9IQ0hBOVFHY0d1QUtCQklnamxkMERkaDRKSmx1SlYwTTY3ZjUwRTQ0RU5lT0lpaS9GenJhd281T1RrSUJvT1dhM1BLdGJHdWpka2FiMjFyM3JoeFl6SWFqVDdLYnlFWEY1ZGREVTJIbjluVmVFakY0SlZRSFNCVVNCOGtTVVZCZ0NTSmhsdExRMDJSbWZZT2p4dEJueGM1d1FBS2NzUHdldnAybXdyNStma0loOE1JQkFMd2VyMFczRXpITmxUWEZnNkhOK2k2L25kK0c3bTR1RXlsVlBYNWtaK2J0OHZCcVEzdTFzUk10eVliQlFPUDJ4aWQ4bmtRRHZxUW54TkVVU1FuNCtzS0JRVUZ5TTNOUlRBWWhOL3Z0M0p0RGhNSkE3azJsUkNTT25Ma0NIZHRYRnhjbG5ic3F0K0V6R1pjQzJ5R1cxT0g2dFpjVm51SE1Ucmw5eUkzRkVCQlhoZytqenNUYkNVbEpjalB6MGRPVGc3TVFzSlFjbTFtTVlGMWJjWEZ4ZjlJcFZJUDg5dkp4Y1hWMWRPN1p2THM3eCt3UVMyUnphMEpSaVhVeWEwcHNnU1h5Mnp2Y0NIZzkxcnRIU1dSdkg1ZlcvQjRQQ2dxS2tKZVhoNUNvVkRXUW9KVGhkVGUxMFlJU1gzd3dRZVBBVGpJYnlzWDE3a3JDaHo4NitaL2JvTnp3WUIxYXhsOWExWWwxTzdXRktOZzRIYW4yenY4WHVTRmdpakt6NEhIcmZRSEd3Q1VsSlFnRW9tQUxTUjR2VjY0WEM1a0c1TFBsbXViT0hGaWZYZDM5NFA4MW5KeG5iczZjclRqeWEvZSthc09tMVBMNnRaSWhsc1RNODVaY3lreVhJb0NyMXVCejJzVURFSUJSSEpES0NuSWMvejZBZ0FvaW9LaW9pSmtLeVRZcXFUVW5FcXdyK2d6WGR2VXFWTWYwM1g5Ulg1N3ViZ0drZUk3NjM0a1ZkTmUvc3lYYm50akNHNU5NOXlhYms0WlNFYmZXcjhxcUhFeWJzQ2JidS9JRHdkUkZNbUZJa3Zad1FZQTVlWGxNQXNKWmtqcVZFaGdoK1NaR1ZLZGRXMDdkdXhJSGpseWhPZmF1TGdHVTZqa3JQdVJkdTVwZkthcHRkTStYWkFBa0NETUJpckRyZW5FT2tTU1dFNU50bzFOZVR6cGszSE4wenNLOHNJb0w4clArajBJN0IvTWtOUjBiUVAwdGxtdWpabElZSjFicXJpNCtPVmtNdmtiL3N6bDRocEFrWkZubFd1THhyc2Z2WERXN1I4YmJvMkZXdC9BZS8vejFxaElDRTBQdUlzMGZTcXVuT0hXMGhNR1hvU0Rma1J5c29lZ2ptQXJMQ3pNR3BJNmpGdFJTWkl5Q2dtc2F5T0VKTGRzMmJLS1VycURQM3U1dUxLSUNFRDFwVUJPQlNCN1B0VS9pcTdUZHgvNDB6UDJnb0dWV3lOQTBneEJtZlBXcUdDRm9HbW9aWnlLNnhTQzV1ZWlNQzg4NFBmU0wwQXRMUzFGZTNzN290RW80dkU0ZW5wNmtFZ2trRXdta1V3bWtVcWxvS29xVkZXRnBtblFOQTI2cm9OWjA2ZFJTZ1VBNnRWWFgzMjRyYTN0d2R6YzNKWDhHY3pGbGMxZWlFREp1RS85ai9IaG5qM3I3L2p2eCtJT1VFczdOa0xTQlFOQ05DTjlSUVZSaENqTGtGd3VTQzRYWkk4SGl0Y0xsOThQZHpBSWJ6Z01mMTRlZ29XRnlCMDJEQVVqUnFCMDNEZ2dGQnE2WXdPQVVDZ0VwOTYyTEkyN0dTRXBISnAyOC9MeU5xWlNxWWY0czVlTDYreFZQQjVmWFZOVHM0Y0pRVE9nUmdoaDErcnBBTktOdUtKSXpWWXlXWmFoR0p2YzNXNDNQQjRQZkQ0ZkFvRUFjbkp5a0orZmo1S1NFb1FHZ1pvajJJQjBJY0hzYldPSDVMUE5rdHFhZG5WQ2lOVnBUQWhKdmZycXE0OVFTdC9tdDUrTDYreVRydXZ2UFByb295K2lmMTZOaFZyS01Ec2FJVVEzSnBpc3RaOG0xRXl3ZVR3ZWVMMWUrUDEraE1OaDVPWGxvYWlvQ09YbDVVTXp3VTRmbEdVWlpXVmxLQ3dzN0ZjbGRUaHhkNkJDZ2dvZzlkblBmcmFwcmEyTmg2TmNYR2VoOXV6WnMvNDczL2xPTkdzSTJ0ZTNabXgySjFuZG11blVQQjRQL0g0L1FxRVFjbk56VVZoWWlMS3lNc2l5UEtUdlNjcjJGMFZGUmVqbzZFQTBHa1ZYVjFmV1hCdWJaOU4xbmVxNmJtNjEwaWlseEhCdFFpUVMyZFRiMjd2QzVYTE41MDhGTHE2elE4ZU9IWHU0dHJaMjd3QnV6ZG8rWmJnMWFvTE5iUGhublpycDF2eCtQNExCSUhKeWNoQ0pSRkJTVW9LaW9xSWhmMS9TUUg4NWJOZ3dkSFoySWhhTG9idTdPd051WmdIQnVLaXU2OFJXU0tBQWRFcXBWU1g5NHgvLytMOXo1c3daS3dqQ2RQNlU0T0lDOXUzYjk2bjkzbFZWZmVtZWUrNTUyUWExWHB0Ynk4aXJBYUNFRU90ekdDWUlBSkRHUnZxdHdSSHJZOGY3V0EwSU5wL1BoN0t5TXN1MWRYZDNXMkJMcFZKMjEwWTFUU082cmxQakc5TU54MmJtMjRSdmZ2T2JIZE9uVDMrd29xS2lGa0FKZjFwem5ldXFxS2o0dEg3cnphKysrdXFHVmF0VzlUaUVvTDJ3RlF5TXZKcHVPRFZxT0RScTV0TE1Ja0U0SEVadWJpNEtDZ3BRVmxhR3Fxb3ExTmJXRGptM05pU3dBZWxDd3JGanh5elgxdHZibXdFM3R2WERDRWRCMDRMUjEwWW9wV29hemtTb3JLeDhJeHFOL2s4Z0VMaVhQNjI1dUQ2ZE9uanc0Qjh2dWVTU0pnTnFMTkRzSWFocVRpWVJRcXk4bXIxWTRIYTdMY0FGZzBIazV1WWlFb21ndExUMHVLRUdaQ2tlT1AxV1lWdEEyRUY1V3dzSWRSaVNaOGV0VW9TUVpEQVlmQ0taVFBLUkt5NnVNMVIxUzZhaXF1cG1ySTMyLzd0NFBMNjZyS3pzYldTMmRsZ2hxQzJ2WmtITlZnV2wyYURHdG5aOFVrYzdKTEFGQW9HTUZwQlFLT1E0bFdDRG0xa2x6UmlTTngrSTU1OS8vbUZkMTdmd3B4QVhWMXJSdXJWWU11OGFUQjFmZzZxcUdveWZOQjJ6Rnp5Q3JhMW56dmVvcXVyV2xTdFhib0Z6QmRTQUcwMVNTbFZLcWFicnVxNXBtcTVwT3RWaHVUV3FLQXBFdFF2dDdURWs1WFE0R2dnRUVBcUZNbG83QW9IQUovbytwYUgrdy9MeWNzZHBCSWRjVzdhUUZFYk9UU1dFSksrOTl0cERqWTJORDFSVVZGUVFRcXI1MDVyclhGYnIxZ1dZUFc4ZEdvSVRjTzMxODNGREtSRGJ0UTBiTml6Rm5LMnZZY1V6RCtLNnlPbjlIaW1sRGR1M2IzOTZ3WUlGTVljUXRCZnBJZmNrcFdiQmdHaUVwRWVuS05WcEt0R0RoTWVIZ0dHQ3hHZ3ptbzhvQ05lY2x3RTFNNy8yU1VMUTR3WWJBQXdmUHR5eFF1b3daa1YxWFNkbVpRTUExWFdkYlFFaGhCQmgrUERoYjdhM3Q5K2ZrNVB6aStQOVhyaTR6aDZydGhYTEZxeERRMlFtVnExZmpta1d3RzdGTFRjc3dZeVpxN0JrMlZaY3VYd2FYS2ZSckRVMk5xNlpPblZxazgydFpZYWdsS1lMQmtUUVJNSHFWNE1rYU9qdVNhRTNucUJDWGhBdWx3dWlMSUFRRVc1dlptdEhhV2twaGc4Zi9pOTlzOEx4L0dPdjE0dUtpZ29VRnhkbkhFeVo1ZFJkS3N0eXY1RFVOcFdReU0zTjNkRFQwL01yL3V6bU9uZTV0Z1liamlxNGRQNUMwU0F4c2dBQUlBQkpSRUZVQm1wcEJTZmVnc1VMYnNDVmtRUmFiZm12WmFzWFlNYlVHbFNOWDRDdGFkK0hyUS9jaGhsVHg2T21xZ28xazY3QnpVczJvU25CZk1LdHQyRjgxWFFzV3JzYWkyWlB4L2lhS3RTTW40b1pDOWFpemlHZmxxamZnRVd6cDJQc2lJcUhxcXVyMzJlY1dpOTdFVUlTWUErUVRKL2NvWnVOdUxMTEI3OGtVSUhxSUhvNzluN3dBZDQ3bEFRaGNieS82Uzk0NUsvdkl4V0pvUGpJVTVnemF3NXUvLzJmY05zMWsxQlROUlZMNmdCc21vZWFxa2xZc0Qzeis5dTZZRHlxYXVaaEUvdkJwcTNINzVLS2k0c0hkRzFtT01xR3BHWUxpQkdhc3ZrMkFZQXdaY3FVaDk5ODg4MUNXWlp2NGs5enJuTk5kYS90UUJLMXVHS0tVNndad2JSYmwySmF2NDl2dzhwbFZiamkrdmxZVkZXTGFrU3hkZEVNekZtVHdPUWI1bVBwQkJkYVgxdUhsYXR1d2V6b0ttek9jSHNOV0xOb0ZhNmRQeC8zelE4aXVtMFZscTFjaU5sUkZ6WS9lQjM2dm92dFdIWnpIU28rKy9rbjlyZjhnKzFYNnhlQ3NsQURvRk1LU296RlQrbThtZ0ovVVNtS3ZWNzRQQkp5eHBZQnh4cnd3V0UzeGw0eEhSZVBIb054UlVVWTVnMUJrUko0ZnZrS2pMbjJSc3lmV1lXSkVRQk5RM2UvQzJiUCtXVGhYM1YxTmVMeGVOYjJEd1pzR1NFcHBaVHF1bTV2QVNFN2QrNFV0bXpaOHREMDZkTUxSRkc4bWovVnVjNGRKZERhR2dXVUNDSXMxNkt0YUdXZEZsd0lSb0lNbkVveDg3NzFXRDR0YVB6N1RWaXhIWmh3eTRONGRPSEU5TCs3L2pwRVdpZGg0YWEvWWZ2eWFRd2NGVXhlL0RqdXU5SDRnbE9tb0N3eEhUTlhyY0NxdXV1d3NMYnZhNDYvODRuTm56bXk0ZmtOOFI2blhqVjdGVlFsQXRHaFU1MVNuYVpTS1ZBSVVFUVpzaXhUYTdqZGx3NDlKYmtadTQ1NFVUbHVJaTQ1dndMRHk4cFFmU3k5UnEvcWxzZXhmbUh0Y1lmZWRTdVhZTjNCcWs4R05sRVVVVlZWMVE5czdEU0NiY3lLbUlVRUkrZkdGaE1JSVVTNDZxcXJtdXJxNmxiVzFOVGtFVUltOFNjODE3a0N0a1FpRFJFWDh5cmV2dVFhM0xEdWFOOEhBak94NnQzbERKeXFNWGxpa0lsWnI4VHl6VmZhUG5jUTFXVVJZSHNyb2dtZ2p4SXVSTW9pR2RDY09QTTZWSzFhaWUwN1dvRmE4KzhtdkZXdTdIMTYvdno1VVZ0T3JjZTRlbTM5YXVsR1hJbFFVSjFxdWs3VlpDK090U2RvM09WSFVYa0llVVpyUnlBUWdCU1ZJWW91QlBNTHJXWmM4VjBDSUlEYXliV2ZJSjlZajYxYkc0QXhDejU1d2o0Y0RxT3lzdEtDVzdZS0tldmNUTGdaVXdrZ2hKakZCSUVRUW1wcmE5OXJhbXI2YlVsSlNTNGhaQVIvMG5PZC9US0JaZ0RPZURYWDNuSWZWbDJiQUJERnRtWHpzV29vb1ZpMERtdFhyTUNhVGR0UmR6Q0dwR1hRcXROSUdvZ1VaVlVvQTFEZjBBUWdBa3BSMzlQVDl1ZDdaMTdWWW9OYVh3V1V5YXNadVhNcnJ5YkxMaXJMTW1SQnAycWlGL0dlT0pvYlBnTDFUY2Jra3JSamt6c1VTSklMNGNJU1ZGWldJaHdPLzR1UFpTc2FXZ0ZsWXZXL1Zva3NLeXV6QnVSWnVHWEx0UmxRTTRlL3pMQlVNeDRjQWtBb0t5dDcrZWpSby9mbjVlVXRBaERoVDN5dXN4MXNrVWdRU0RhaHFSVkFtZUcxcXFkZ1dqVUFSTkc2U2hsQ2pxa09EOHllZ2VXdEV6Rm40WElzckM1RDBBWFVyYndaQ3pjTjFUdGFPbnFndlh2MTRjT3ZOQ0p6c0wzWElhK1dNdk5xNWpKMWRyckE3WGJEazErRVNpV0ZwcjM3Y0tUaE1EQ2hDams1T1ZEYVhaQWtEL0xMS2xCV1ZuWkNIOVYvdWNWaTFLaFJHYTZORFVudEozOVFTdGw4bTI0T3d4cmhLU0dFRUVvcHljL1AvM3RuWjZjL0ZBb3RCdURtVDM2dXMxbTFsMDVFWU0xVy9HMVRFNzcrOVUvNEF0K3hCbXQyQVpldWVCQ0xyK3NMVVJQQklRWjA5ZStnQ1VDa3FxejM0TUdEcTY1ZThYWWQrdG82elBDVGRXdjlRbEJDcUs0bWswaUpMbmg5TWhSRnNmSnEza0FleXZNUG9MTXRpVlFnalB6OGZMaU91cUVvUGhSVmpSclNMd0Fna1VIZi9vcWdLZ0lrbTVxT3I5M0RTWVFRakJneHdwcE15TS9QdHlZVDdHTlhaZ3VJYmZHeU9YSmx0b0FrQVNUQzRmQ2Z1N3E2ZUJzSTExbXY0TFJiY0gxcEV1K3NXSUJINmhMOXdxdlcxdVFRN0ZZQ1VRQ0pLUFAvSitydy9JNVd1eHNERUVOOVhUMGJ3MkxUcWswNGlER1lNZ29QR2VOU0xOUjZHYmhsbkxGbXZuN05maldCZ0ZJOWhTVHBLeFo0dlY3NFBDbkU0Z1NDUHc5bGhma29LaXBDUldFSWlxSWdtU1NELzN5UkNDS0lvYjYrS2VQbmU2MHV4dnlqYWt5YlZnWHNXbk5pbW1JRGdRQ3FxNnY3RlJJMFRjczJJRDlZTVlGUVNvbmY3MytzdTd2YjQvRjRidWRQZjY2ek54cWRpSVVQTGtMZDdLVllPbU02bnIvdVNsdzZwaFE0Mm9EWE5tM0F0b1lBSnR3eUV4TUh0SDNYNHNyOGRWaTNaRGJtTlZ5SmFyUml4NllOMkhFd0NTQ0tSQlFBVTJ2WXRYdzJaalJjajJzbjVPUG9hMnV3K205SEViNzA5Z2QvTUtuZ0h3Nmhadzh5anlPeU9UV3pFVmVpYmg4UTYwclMrTkVXSkx1RHlBbW4wQk5ydzc3Mk5yUW5YYWllUGhVWEdJZEdqblNOUXVpSkxWaXpaQWx3eGFXNDdzWnBLQnZvNXl0ZGhWWExic2E4Z3pNeHdYVVE3MnphZ09jYkFEQ0w0R3R2V1l5WkcrYWN1Rzcvd3NKQ3gxeWJxcXBzUDF0R1dNb1dFNHhQbzluRDBsbXpaajM4NXovL1dYRzczZC9tcndDdXM1WnR0Vi9INDV0cjhjaXlGVml6ZFMxV3JJc2hxZVNqcW5ZYWJsazVIL092ckI2NFNoaWNocVdQTDROcjBRcHNXTDBTVzExVm1ITDlmWGg4d3ZOWXRMSUpCNW44SFJEQUZZc1dvMnpiQ3F4YzBvQ29xeFFqcjczN2tmcFhmN2tWL2FjS3JCQ1VFQ1FvTlZmb1dWRHJhOEtWWlNpS2o1YUdLSHFpY2NSN1kyZzlITU5SUVVHNHNBcFRwMTZPYS85dEpFcExTMUZWVllYeXkrL0U0amVic1d6REtxeG96Y2UwRzZjTkRQOUhseUc2WUFVMnJWcU9yWUVxVEx4dU1aWk5YSUdGR3pJZmgrV1Byd1JoRDNJN0VkcTllemQyNzk2TnhzWkdIRHAwQ0VlT0hFRjdlM3ZHMFVjR0FBa0RRR0wwdXdrQVJFcXBCRUFHNEtLVXVuLzBveCtGZi9qREg5N2ljcm5tOFpjQTE1a3FUZFBRMU5SMFpwK3h0dlUyakorekZkTld2WXY3REk3RVlySGZmL3ZiMzk3OGh6LzhvWWR4WlQwQXVvMjNQWVFRcTJCQWpHMVQ3UGxxek5IZTFobHI1dnluZWI1YVNVa0poZzhmanBxYUd0VFUxSnpVSC9PRXoyZU9IajNhQ2tudDdSOVpYSnQ1NGk2UVdTbTF3dEtmL09Rbm5aRkk1T0c1YytjS0xwZHJMbjhKY1hHZEdNVmlzVDhzWHJ4NGl3RzFKQU8xSGdacS9VN0RkYXFBc3NVQ244L25lTHgzWldVbFJvOGVmZEovcmhNT05rSUlSbzhlYllITjN2cWhhWnAxNUMrVGI4dFdLYlUrNTNlKzg1MDJSVkVldnVtbW04RGh4c1YxWXFDMmRPblN6U3RXck9oQ1pxR0FiY0RObGxmVEJVRmdOMHhSY3hHTC9jQkkwNjJaVUdPUEJ2L1VnQTBBUEI0UFJvMGExYTlwMTliUDFxK1lZTGcwMDdXeGNDT0VFREp2M3J6V1JDTHh1N2x6NStwdXQ1dUhwVnhjbjFESjd0anZGeTlldkdVQXFMRk9yZC9xUE9QQVNHcDNhdWJLdkZBb1pCMFlXVnhjaklxS0Nvd2FOUW9lejZuWmRpL2VmZmZkSitVVG13ZFFtbkF6SzZRczNHelhZQmluQUxCeDQ4WVVJZVQ5aXkrK1dKVmxtWTllY1oweG9wUWlHbzJlZ0E3Nms2aktxM0hEelRjODh2U3kvMi9MNzM3M3UrNXNUZzBPa3dWc29jQ0Vtc3Zsb3V3SnVQYVZlV2FoWU15WU1jalB6ejlsUCtaSlBRT3RzTEN3M3pTQ1E0VVVUSjdOcXBRQ2dHMWdIb1FRVUVxeGRPbFN2UFhXV3crdVhiczI2ZlY2ZVNzSUY5Y1ExZEhSOGVBVlYxeXg5YTIzM2twbWMycXdIVVBFVmo4eks2QjlUczNjMnM3bTFJcUtpbEJSVVlHUkkwZWlzTER3bFA2Y0ovMXd4L0x5OGd6WHhrNGoyRjFiK3BjZUpRQ29xcW9tM0RRMkxEWGh0bkhqUnZoOHZ2K054V0s5ZnIvL2R2QUpCUzZ1Z2RUYjJ0cjZVRUZCd1QvUS8vVGJnYUNtRVVJMG9lOElvcXpoWnpBWVJEaWNuaW9vS2lyQ3NHSERyT2I5VTYxVGNtcHRkWFYxMXVQRG1WTjJUVHR2NWRwVVZUWC96aEZ1QUJBSUJQN1kwZEhSSFE2SGJ3T2ZMZVhpY3RMUmd3Y1ByakltQ3RqWnp4NWIrT2tJTldiQmNRYlVuRmJubVZBckx5L0hpQkVqVUYxOWVrNzlQMlhIY2RmVTFHVGJpK0RvM0V5NEFlbitvQUhnUm5OeWN0YTN0TFIwUlNLUmIvRlRRYmk0d0JxRit2cjYrdFVqUjQ2c0c4U3BKYkpCamMycFpRcy9uYUIyc252VnpnaXdBY0RZc1dQN3dTMEwyQ3k0bVFtM2JIQXovMXhZV1Boc1kyTmpkTml3WWZNRVFiaUlQNlc1em5WcG12Yld1KysrKytjTEw3eXdFZjFuUHdkcjZiQ2dObGhPellSYVlXRWh5c3ZMVVYxZGpiRmp4NTdXbi8yVWdvMFFnckZqeDJaMWJRNi9iVmdINXdnMzQvTlNTaWtkUG56NFAzYnMyTkU1YnR5NGI0cWllQlYvYW5PZDhUcjJ1NVB5YVZNcGJmT1diYnVldm1ybS9TMU0rR21mL2V3aHhycThUS2hSalJCS1JZRlFVYUJVbG5USW9nNlhwTUl0cS9BcUtmamRTUVE5Q1lTOVBjanpkNkV3RkVkNVhoVFZoWjBZVzk0R0VuMzkzQUViQU1peWJNRnRFTWZHNXR1eXdZMGFINmRtYURweDRzUVAxcTlmdi95YWE2NXBWUlRsYS95VnczV3VxYnM3K2NURGoyMTdmdjRkZjQ0T0FMVmVBaVJBWUt0K1FpTUVhYWlKaE1xeUFFVVc0WEpKMU8yVzRmVW84UGxjQ1BqZENJZTh5TXYxbzZnd2hQTFNYRlFQTDhEWW1sTElrbmphSDRQVHN2TE83WFpqN05peGpuazIxcTJ4SVNraEJLbFVLbjBVU1ByLzAvcllsdW5jWnN5WWNiQ21wdVpYYjd6eHhoRy8zejhmZkxVZjE3a2h0YTA5L3RENGYvdXZsdzgyeCswN0N0anoxRXlvMlp3YWRJR0FDZ0toa2dFMVdSYVE2RXpRenFBTFkzTFNVQXNHR0tnVmhGQldtb3ZxNFJHTUhWTUN0MXMrSXg2STAvYUM5L2w4RnR6c1lMT0hwWVFRYXVUVDdLMGc5Z2tGYXNKdDkrN2RlaUFRZUt5bHBlVndKQks1aFM5bDVqcFR0ZjJlKzNIejBmOFg3LzY2OWhQdkRhV1VOalR1TzdxbWVzS2k5NUc1VGFyZmVXb00xTlNCb0tZb0luVXBJcWlRUkZLUjRmZTVFVENobHVkSFVVR3dEMm8xcGZCNVhhaC85cC9Zbmo4T04zN0c3L0JkeHJIMXZtZXc1T245YUlwSmlJd2JoOFUvbVk0clM4NGlzQUhwYzl6R2poM3I2TmpZdkJ4Ny93YUJHMldkR3dCYVdGajRiRjFkM2VGUm8wWjlYUlRGei9LWEVkZFpaOU5VYmV2Mk54cWVubnIxTDV5V0dkdVA4MDZBOUIzcDNRYzFRZ1VCVkpJRUtrdkVnSm9NdDF1QUpoS0lMaGNDQVRkeVdLZFcxZ2UxUU1BTlFFWGRjNjlnWlVtVkk5aGFuMzBHdHowdFllbGp0K082a2w1cy9kRWF6THZqRFd4KzdDS1VuVTFnQTRCUUtHVEJiUkNvOVlPYmtXOWp6M096Z0diQVRRZWcxOWJXdnIxNjllcERNMmJNK05qdGRzL2hMd1d1TTFXSlo5ZGgvSVBBamFNVDJMcXpEYTFKRjZiZE5oUExQNThIRjFxdzdEL1dZUHZvS3JqMnRLQXBsb0JZTldiMWVTUFZMYis1NXk4eFpMWnoyTU5QYSs2VFVxUUVRalFRNkNiVVJBRlVUZWswbWRRQlFxZ2dFNVNWeXZCNlJHZ1MwTzEyR1ZEelFEdTBIMzk2TG9aTzNZdnlDOGZqaHo4ZWp1dUMrN0hrUDU3QzJrTWFZbGlEU1hzdXdlTVBYNFMrTUVuRmp1Y09JZmp2czNCZGlRVEFqMmx6eHFINkt4OWllK3dpWEorb3c3eXZiRVhrWjdkaTZXZk9BckFCNlkxWEE1V0hUY0FSUXN5TEVrS0ltWE16YzIyNnJsTzJ2NDExYmpmZWVPTWhBUGUzdGJWOW5KdWJld3VBWXY0eTRqb2pkZWdZY05jc2JQNlpIOUZYbjhIME8xN0Nwcy9PeEhVQkFFaWdWUm1EOVgvNVFuUHk0LzEvTEp0d3o5dGIrNWFxSkJtSXNVZDVKd2hCa2xLa1FLQUtJQm9JTklHQUVvSG9va0JBVXhyVmlJQ2NQQmYxU3hUdHJRbTBkSXNvSzNCQmxRVW8zblQ0NlRuNk1WYnZDdUsySDgvQXZNdHo4ZkZqeitMbWIyOUc1QzlYWWZGZmJzV0UyMytOWlNVMzRPVUY5aEdxWHJUR1ZFUktHQ2VYNzBjRXZXZzlDbUQ0TU54eTE3OGpPTzRzY1d5bWNuSnlNdURHUUt3ZjJPek9EUUJoNWtyN09UY0F1dUhlYUY1ZTNsL3I2dW8rSGpWcTFFMmlLRjdPWDBWY1o1eEtxakRUQ09XQ280ZWhPdmtHV21NQUFnQWdvbVp5eFV0N3QzKzQ0WktyZnRHRWdiZXo5OXBDVHhWSWg1NkVRQmNFUWdXQlFKSUlKUnBCVWdjbGdnaVgzNFVSdVVFb1hpK0NBUWtwUlVEVTcwTnhnUXYxcjNXaCtrdWZ4N3pMaHlFbjdFWE9iWmZodXFmWFljMC9wbVBLWUltZWZxc2JSQUFxWWtrQThHUGlaLzFuVHlocWg5dDU1NTNYRDJvRFFJNlN0UHJsM0N3YjE5Y09Zb2FtV20xdDdkcy8rOW5QR3Ivem5lL3M4bnE5L01oeHJqTlhSalVoWVd4ajZVbHBENy95Mk5xWEgzNXVXNDh0bjlaLzd5ZVFwRUNLV0ZDRER2UkJUUlFKbFNRQ1dSS2dlQ1hxN2traDJ0Nk56clllQkNLNU9ML1lqWnl3Z3FSYlJHY29pUEl5TnhwVUwyb3ZISUdjc05kTUpxR3FSTVh6UjNzeDZMaTJZditBQmtCQ1FEbnhEOXNaMXdZUkRvZUhCRGQ3V0dxK2J4eU5wSnRBWTRvS09pSEVkRzc2SFhmY29kOXh4eDMvZStEQWdiMmxwYVUzRTBJbThsY1IxNWtxcXROM2R1MDVzdjd1VnhyM0FvMnFRejR0dzZVUmdpU29CVFNORUdpZzBFRkFCWkZRU1NCVWt0THRISW9pVWdrRXZrSS95djBLZkxLTzVvK080dDJtZkV3WTRVZlNJNkV0TndjanF2TVFyWGdmcjBaMTVqdUxvK0dvaEVqK1lHZFF1QkhKbDlCNktBNGdsUDdRMFRoYTRVUGtKSnhtSkp5Sk56RVVDbUhjdUhFWU9YSWtoZzBiaHVMaVlrUWlFZVRrNUdSYjdVY1ZSUUd6Mm84eXEvMDA0NHoyRklBa0lTUkJDREhQYys4dUx5L2Z1bTdkdWgvMjl2YXU0aThmcmpOUnFxNnRmdkdKTGY5VE8vbC9kaU56ejZmMVBHWXVhMFVlTloyYWNaWmEraGM4Mjg0aEdJMjNJbExIZXJDL1RZWHNkU09VNDBlK1g0TGk4Nkc0S0loOG40SkFRVDdHamFuQkYyY1BSOTJxRjdEaGtBcWdGenNlMllvTkdJTWIvaDhKZ0FTWFMwS2k3UmhhRS8wOTFKVExoaUg2M0hhc2JWU0J4REZzV3ZVTzZzZU53cFJBR3BBN1hteEFmZUlzZFd5bUFvRUF4bzBiQjBFUUhDOUNpUDJ0NWR4U3FaUlpNV1dMQ3BRSlRVMzNwZ0hRdnZTbEx6VUIrRTFUVTlQT2twS1Ntd2doRS9qTGlldDBTOWZwdXgvV3Q2OWYrK0diZTdEc1RaVUpQWk9PTG8yQkdhVjkrd2xJdWo5TkZ5aEZTdGRwVDFLRXp5dENVU1RxZGtsd3UyWGtqMUNnSEl6aG5UZmpvS0tNZ29waG1IMVZHU3JLdlVnRVhEaFlXb0pBd0kzQTU3K0FCNDgrZ3lYLytXc3NpRW1JakI2RHhiK1pqaWxHeUR6bCtuRW91K01wVFAzUFMvRE1FeGVEYlI0Tlh2WHZlUERRYzFnMDk5ZFlaUFN4M2ZlVGllbFdqNlA3c2ZKSFcxSDJtMXV4K1B4Ly9iRTc0VnVxVHJSNmUzdnh3UWNmb0w2K0hnY09ITURodzRkeDlPaFJkSFoySWhxTm9xdXJ5OXA4bFVna3pGMExoTmwrQlYzWENhVlVNQzhqYXlrQmtDbWxpcEhKY0FGd3JWcTFLakpyMXF6cnZWN3YvK0V2TGE3ajBTZmFVcFZsVmpRYTYzbjBnZjk5Y2RzZGR6OFZSMStCZ0IyUFlzUFFkT2dKTnZRa09rSC9Jb0VzQ1pCbGticVV0THZ5dUdWNHZhNk1pWUw4dkFDS0NrSW9MOHV4eHFUT2xJbUNUNzFqc3lKenR4dm5uMzgrUkZIc2Q3SHV6ZWJnc2hVVktKTjdNNHNLT3RKVlV3MkFPbWZPSEczT25Ea1A3ZDI3OTYycXFxb2JSRkdjeGwreVhLY3M3RlQxbDNlK2YrQ1pDeSs3OTJNRFVuYVh4dWJVa2dSSVprd1JvSzgvelhCcVZCU1lJb0VpVWtXUjRIYkpjQnRROC90Y0NBWTh5QWw1a1ovSHpINVdGV0RzbUROajl2T3NBeHVRSHB3ZlAzNDhKRW5xQnpiN1d3WjJWQkFFSWdnQ1ZGV2x6TDZGOU42L3Z0RFVxQlFSelF4TkFhaWpSbzE2ZmNTSUVUdGZmLzMxNjNKeWNtNENVTXBmZGx3blM1VGk0SkhXWTA5K1p0cFAzbWhLejNteVVFczRYRWtIbDlZWGVwcVRCR0pma1NEdDFHUzQzUkxjYmdVK2IzcjJNeFR3SUJ6MklXSkNyU3dYSTRZWFl1eVlVcHlDaFZMbkx0aUFkSHZIZWVlZEIwbVNqZ2R3L1NxbWhCQnFoS1pnblp1WmQwTjZHNzBHUVAzb280L1UzTnpjOVJzM2Juempzc3N1KzZMYjdiNkp2d1M1VHFoQy93ZGRYVjFyL3ZyWHYyNzc2bGZuZFF6aTBneWdFUk5vS2VNWHNYVitHck9iQUpJa09lNzhORSsrdGUvOVpJL3pQcDJIUko1VFlETlZVMU1EV1piTkNpaU1OV0NPSWFvSk4rTXRZZUFHUFMzclNDU3pnZGZKdlYxOTlkV05BSDViVjFmMzZzaVJJMmRLa3ZUdi9CWEo5YThxbFVvOXYyUEhqazJUSjA4K3dBQXRHOVNTRE5SVTlBMndteEdIdFd6Rk9NYmJmSjFRUlZGZ1B5RFNoRnB1Ym03R2lyelRlWnozT1EwMklMMUR3V3p2TUM4V2NFNmhxWEhEcmRDVXFacGFybzBKVFRYR3ZWbFBvdHJhMnJjQXZOL1UxUFJDY1hIeGwvaEp2VnlmUkxxdXY5blEwUERNeUpFamQ1bS9QRzFBU3pxNHRKU0RTOU9aaXhxLzJMTkN6ZXYxd3V2MUloQUlXSHMvQ3dvS0xLaU5IRG55dEN4ZTRXQmpWRjVlbmdFMzgyYWFvYXJkeFJtZ3MrQ1dTcVVvSWNRODhOSmVXTkFad0dXNE53Q3Bzckt5RnkrODhNSi9QdnZzczFmbTVlVjlpUkJTdzErdVhJUG4wZWllNXVibXA2ZFBuNzVqMTY1ZEtwTWZZM05wN051a0RXb3E4MHZYQXBxNUVrOFVSZmFYUFhXNVhCbFFNNWV1bUhzL0k1RUlTa3BLckdYR3AzcEYzc25VU1Z1WWZDcGsybW1uZkp6NWRvQnhMSHRhMUp3cmhRRTRHSEN6R24xTjJBSFFtNXVidGVYTGx6ZWtVcWtYTHJqZ2dtYTMyMTFDQ01uaEw5OXpHbHlPQzVNcHBZMnRyYTJQTFZ5NDhFK3paOC9lZi9Ub1Vic3I2M2RrTjlMTFZYcnQrVFJtY2JIVFJuWW9pa0lWUmVtWFMyT0J4aTVkcWE2dVB1WExqTGxqRzRKeWNuSncvdm5udy96dHhFd2daT1RoMkN1UlNEaUdwb3g3TTRmckJWdDRxZ0ZRamZBMEJTQjE3NzMzSnUrOTk5Ni9MRjI2OUlWdmYvdmIwME9oMEV4K3FDV1hBYlNHMXRiV0RjdVdMWHZybDcvOFpTK1RHM1BLcGJGaGFBcnA0NFZVUW1CR0N4cEEra1lGQVVwQWFQcXBTa0JCUUNtb1RnRktDWFFLYURxRnBnT3FScEhTZ0pRR0pGV0toQW9rVWtCdmlxQW5SYkQ3b3dNQURweFZqLzJuMnJHWmttVVpoWVdGanFlQURISGUxRzdnekJONzJSTkM3TlZUeTcwQjBMWnMyWkw0K2M5L3ZyZTd1L3Y1Q3k2NG9Nbmo4ZVFTUWdyNHkvdmNjMnpCWUxDdXBhWGxEOS83M3ZjZW56MTdkdU0vLy9uUFhnZUgxbStucHkybnBoSmlnZERJcDZXZmk0UUlFQVdSaXBJSVNUSnlhYklNUlVuL2NuZTUzWEM3UGZCNmZmRDUvQWdFQXdpRndzakp5VVYrcEFERnhTVW9IellNVmRVaklFbnlXWGt2enZqSmcrUFZ4eDkvaklhR0JqUTFOVmxUQ2gwZEhZaEdvNGpGWXVqdTdrWjNkemQ2ZTN1UlNDU1FUQ2JOVGZXRVhlcXM2em94TCtOeE1xY1cyTWtGaVZJcUE1Q1JQcnZBdXFxcXFwUlhYbmxsYW1GaDRUV0NJRnpNWC9abnY1TEo1UFkzM25qamhhOTg1U3Z2TnpVMW1TTk5yRU96RndneUhKb3gwOHlNUWhIemx5aGxLNTVtb1l3dEVHUXJFcGp0SEdiNFdWWldocXFxS2xSV1ZwN1Y5K0tzVzNKU1dWa0pqOGRqRHNlYmVZZWhGQmlvVVUwbHFxcGE0YW5aOTJhNk5TTTgxUWNJVDVNQWxJYUdCcVdrcE9RRkFOdjI3dDA3b2JLeWNyb3N5NS9uTC8relQ0bEU0bSs3ZCs5K2RjS0VDWTBNek5pd00ra0FOUloycWdFMXE5cHBnSTJheFFIanVVbVo1NjRGTkRPbnhoWUovSDUvUms2dHVMall5cW1kVFVXQ2N3WnNBRkJZV0FpdjEyc0J6dTEyZzMwUzJPSFcyOXRyQVM2WlRHYkx2VkZLS1dIUGVEUFBkMk9lbUNuRHdWbUFBNkNNR2pYcWRRRHZ2UERDQzA5TW1qVHBVci9mZncxd3dvOTU1enExWVdkVExCWjc3c1VYWDN6N2kxLzg0dEVzUUhPQ211bk9yR0YxSTQrbTI2dWRCdFJnVmp6TjU2dVRTek9oWmk4VW1PMGNadU50SUJBNEorN1BXUmVLMm5NZWUvZnV4YjU5KzNEbzBDRzB0TFNndmIzZEdxQ1B4K1BXQUwwWm1ocEQ5RWdtazFCVjFYUnZHZUdwc1hoR29KUVN3OEdaNGFsNXNTRXFHNnJLQUpRYmJyakJ2WHo1OHNrRkJRV1hTNUxFVC9IOUZFbFYxUmNQSERqdzZ1MjMzNzdycWFlZVNnMFJhQ2s3MEFDMktKQUJNOTJjZDJiRFR0YWx5YklNdHBYRFBra1FEb2VSbTV1THdzTENqSFlPOG1tZGorSmdjMVpUVXhNKy92aGpORFUxb2FXbEJXMXRiUVBtM2N6Y1d5cVZnbmxLQ0FNNFlxd01KT3cxQU9Da0xJQ1RBY2liTjI4dXYraWlpeVlIQW9IcHZCL3VqUDBGdWFlenMvT2xiZHUydmZ2RkwzNnhqUUdTRTlCU1dZQ20yb0ZtSG54cWhwdDJsOFlDemV4UE0xM2FRUG0wdkx3OEZCWVdvcXlzREpXVmxTZ3JPL2VDZzNNQ2JBRFEyZG1aVVZSb2JXMUZSMGNIamgwN2hsZ3NaaDEvMU52YjYxUllnQUUyWXJvM0ZuQk1nWUVGSEZ0a0VBMEhaNGRjeHZYZWUrL1ZWRmRYWCt6eGVDNEhVTUtSY2xwaGRxaTd1L3VsdXJxNkhaTW1UZHFQdmlyNFlFQ3o1ODVZVjJjUE9hbDVJQU9UNDJWZEdqdnI2Umg2c2syMzdNeW5XU1N3OTlSeHNKMkYwalFOOWZYMTJMOS9QNXFibTlIYTJvcTJ0alljTzNiTU90dXRxNnZMT3R1dHQ3YzNBMjRPN3MwTVQ4MHozd1lDM0ZBZ1ozNU0ycjE3OTdpS2lvcUwzRzczWlJ4eXB3NW1QVDA5Mno3NjZLTjN4NDhmMzJnTEY1MkFwZzRSWnYyQUJtc1BCeWdSQ0JSWjdoZDJzaTdOTEJDNFhDNXIzdFBuOHlFWURDSVVDaUV2THcrUlNNVEtwMVZYVjBNVXhYUDJYcDVUWURQVjNOeU1mZnYyNGVEQmd6aHk1RWhHYUJxUHh5MjRzWWRYc25CakFjY1VGd1lDSERIQUpqaUVxWklOYXJMdFk5TE9uVHRIVjFWVlRmQjZ2UmNUUXNaeUJKMDQ2YnBlMTlYVjlkcWVQWHZxTHJyb0l0YVo2UXlZQmdLYXlnQk5wWlNxUnFYYzZuRTBONld4UURNcm5icXVVMEVRNFhhNytnSE5IbnA2UEo1K1EreG02RmxRVUlEUzBsSlVWRlNndUpodmxqd253UVlBM2QzZGFHeHN6T2gzYTI5dng3Rmp4eENQeHhHUHh5MjRPWVdtV2NKVEMzQU9PVGpDT0xpTVhCd0RPQ2ZRWmZ6ZHhvMGJpeSs4OE1MYWNEZzhRWmJsaTJGdHh1QWFvbzZsVXFuWDJ0cmFkdjd6bi8rc256RmpScHNCSUgwQWQrWUVOZmFFalg3RkFNYWhXYmt6Tm9kbUZnWTBUWWNvaXZENXZPendlci9RMDRTYTMrL3YxOHBoaHA3RGh3K0gxK3ZsZC9oY0JwdXBBd2NPNE1DQkF6aDA2QkJhVzFzSHJKcXlvYWt0OXpZWTRNQVdHV3lRTTUyY0dhYUtkcGc1QVE2QU9INzhlUG1SUng2cHFxcXFHdTMzKzgrWEpPa3pBUHo4YVoyaHVLcXFiMFdqMGZmMzd0M2I4STF2ZktPcHJxNnUzK1NJTFhUTUJqUVdadXovbzl1QVpqazA0NElkYUdiWXFhb2FGU1VKQWI4dkEyaHNiMXEycXFjNXhGNWVYbjdXbk1yQndYWUNGWXZGck5DVXJacWE3czFwcjBJVzk1WUJPRjNYN1ZWVVpBbFQ3WkF6UTFVckwrY0FOc24yZDJKRlJZVzRaczJhWVNOSGpxd0toVUtqWlZrK2p4QXk0aHpMazMyVVRDWS82T2pvK0dqMzd0Mzd2dmExcjdVME5UWHBObGZtNU02eXVUVHI3OHhtYk52bnlJQ1p6YUdCclhLYXgybXhoWUZrU29Va1NRaUhnaGt1elF3OTdRMjNiTlhUREQzUGxkNDBEclovd2IyeFZWUFR2Y1Zpc2F3OWJ3NjVOd3R3cG5zeklXY1BVeG5BT1lXcTluQlZ0QUhPNlgzUmZ2M2lGNy93WDNIRkZTV2xwYVhEL0g3L2NGbVdSd2lDTUJyV0t0NVByUks2cnU5SkpwUDFzVmhzMy83OSt3OCs5OXh6TFhmZGRWZVBDWmhCWUpZTmFobnZNODRzSTh4a1EwM1k1b21adzAySXBRaVhBQUFHR1VsRVFWUXRtREV1alRLTnRrZ2tVNUFrR1htNTRheTlhWUZBSU1PbG1hRW5kMmtjYkVOV1YxY1g5dS9mYnpYMDJudmVzaFVXc2dGTzA3VEJBR2QzY1NiZ2lBUGtCQWZJRGZhKzZPQUdoZlhyMStmWDFOUkU4dlB6Qy8xK2Y0a3N5OFdpS0pZUlFzb3g2RXJ2VTZaZVN1a0JUZE1PSnBQSjVuZzgzbnpreUpIV3VycTZ0aTkvK2NzZFlBNG1HQVJtMlJ5YTQvdjI1RDhMTS9RdEFLSnNNY0IwWndBZ1NWSS9vTEY5YVd4eG9LYzNtVDdFb1NDL1g0SEFxVGV0cEtRRXc0WU5nOC9uNHk5V0RyYmoxK0hEaC9zVkZ1enV6ZDdVYTA0c09MZzNxL2VOQlp5bWFTYll3UFRDd2NIRjJTRm5BWXFCM0dDWFlIdGZzTDF2NWY5Ky9ldGYrOGVOR3hjc0tpb0toa0tob05mckRTcUtFcFFrS1NpS1lsQVFCRDhoeEU4SThSRkNQQVlJelFNQXpNOEpCZ3pXMmpoS2FRK2x0SXRTR3RkMVBhNXBXa3hWMVdnaWtZaDJkM2ZIT2pzN284M056YkdkTzNmR0Z5eFkwTTNBaTlwQVJnZUFtVzV6V05wZ2wvMjh2V3d3WTBGbXVqTm1TeG9GQUVWUkxKalpXamd5aWdPeUxLTzdKd2xGVVZCU1hHQTEyOXBkR2xzZ0tDb3E0aTlPRHJaL1RhbFV5aW9zSERseXhOcG5PdFNtM3FFQ3p1YmlXQWMzRU9RY1ljZE1Qd2dEUUUxMEFKdjlZci9PUUJjYzN0cmZ6MGlET2J6UHZoM29zb1BNZm1WemFmM2VONDkrZDRMWVlEQXozN2Z0MUlBb2lxQ1V3dVZ5WlFXYXZlSVo3K3FGeStWQ3hiRFNqR2JiY0RpTS9QeDhGQlFVV0FVQ1daYjVpNUtEN2NUcDJMRmpPSGp3WUwvYzIxRDYzb3laVTN0NG1oR21HdTdOZ3B3eHpXQ0Zxc3g5c3Vma2lBT0Vzc0ZPeUFJemNRaGdZd0VuT0VCdElNQU5CRGM3ME9BQXNZRWNtcDdGcmRrVCs0TkNqQ2tBVUZ1WWFjTE1LZ1F3RmM2TUhSdWlLRkpLS2R4dWR3YlFKRW15SEpxOU9CQ05kY1B0OFdEVWlPSDlLcDVGUlVVb0xTMUZLTVE3ZWpqWVRxSmFXbG95M0JzN2tqVlFhMGcyOThhMmg1alZVNXVMQXpOMGI3bzNlMDRPRG81dVVPRFpxckZPUUJzSWJzZmozSTRIYk1jVGRqb0NqcWxPWmdVWUF5OFdubUJ6WnVhZjJUQ1RYUTdFQUkyeXVUUktLYnhlYjFhWFptL2g2SXgyd2V2MTRmenphcXh6MDB5WGRpNGNMOFRCZGdicHdJRURsbnR6S2k3WXE2ZE9yU0dwVk1weWJqYkFRZGQxNGdBNDFzbkJGcXJhM1p6OXozWW9aWFZpRHVFdUdRUnMyVnliUFNTbEE4QnRJTURwVG45bW9EU1FzN1AvUHhsZmkvMnpMZFNFM1puWmdFWnRsVTdyYkQ5ZDErSHorUVpzdEdWblBOczZZZ2dFZ3BneWFhTGwwbmkxazRQdHRDbVpUT0xRb1VQOWlndHNlRHBZL20wQTl6WWc1TXhpQStQazdHNE9XUnlkSFVSTzE2RE9qQTJIVDBhT3piWlVodzRSZVBZTHRpUGRZUWVaM1pXWnpvekpuMldGbVIxcUp0ZzBUVU13R0J4d2FKMXR0RzA1ZWd6aGNBNnV1UHdTbEpTVVFGRVUvdUxpWUR2OTZ1bnA2UmVlc3RYVG9iU0gyT0ZtbTJCd21rZTFRNDV0SFlGRFhnNDJLTUhCMldFQUp6YlVmSm9UekxJNXRxRVdFdXlBd3dBQWd4MWM5andaa3krRExXOW0zME9iQVRPMmZZTmQxRzNQcFdtYWhuQTRuSFcrMDZ4Mm1tSG53Y1B0eUk4VTRMSkwrSXJhRXltSlB3VC9tandlRDZxcnExRlVWSVREaHc5bkROV3orVGNUY0hZSE4xRDExQUZ3bE1uREVSdmdxQTEwNWtWTm9GRkt6Y01HMlY5b2c0TEtDWVlEd0d5b3B4blNvVUxPWVMwaWJDRWwrMjh6M21lY21TUElISUJHN1V1M0J3TWFlMm1haHB5Y25INWIxOW1qaGN5aDlhS2lJa0NxNXk4aURyWXpWejZmRDlYVjFTZ3VMdTZYZjJQYlEreUFzOCtlWm1rUGNRcFJxUWsxVGRPcy9Kc1Q2RXpBTWE3T2hGMC8xODVBYkRCb1pRUFlKd1ZiVnNBeEo3LzIwYmdQZHJBNXNneUkyY0xNZmlBek42amJROC9Cd2s1N0RzMjhWRlZGZm42K2RheVFIV2htSG8wUHEzT3dmYXJrOVhwUlZWV0ZrcElTSy8vVzF0YVcwZi9tVkVFOUhnZG5DMDh6M0J5YmczTndjSGJZbVhCajMyWkFqLzI3VTVIQ1lCMlg3V1A5NEdWNzZ3Z3hCNkJsNU5CWXFObkR6c0VjbWoySDVuYTdrVXFsVUZKU2t0R1BscGVYWnpYWnV0MXUvaUxoWVB2MHl1MTJXOGN5c3dVR3RvTEtBdTU0Y25BTzdzMnBUY1FPdW40RkI5UFoyUUhIL0preVJRblcxZldqbWhQOGh1TFVuTTdoWnovR2dzdm14dXp1TEFObWJJdEdsdnlaWTdnNVZJZG16NkdaVXdPcFZBcVZsWlhJeWNuSm1CcVFKUDVTTzVYNi93SEYxRm5aOGoxaXh3QUFBQUJKUlU1RXJrSmdnZz09Il0sWzEsImRlc2NyaXB0aW9uIl0sWyJzcmMiLCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQVRZQUFBRTJDQVlBQUFEcnZMNnBBQUJNQzNwVVdIUlNZWGNnY0hKdlptbHNaU0IwZVhCbElHVjRhV1lBQUhqYXJmMVp0aVc1bFdVTC9rc3JvZ2tpcUFSb0Rpb1o0L1VnbTU5ejRpaU5SdEk5SXZ4bG1sSUwzbnV1Rk1BdTF0b1ZydjMvK1grKzYzLzlyLy8xdktta0srVzNsbGJLelgrcHBSWTYvNmozNzc5Mi9uenVkUDQ4LzhYeTUxL1B2Mzc5K3VzYmdiK2puL3g5NCsyL3Y1L08xL00vZitBZjkzakd2Mzc5cW4rK0UrcWZDLzM1QmhmK1BZRjM5dC9yN3cvSjE4UHY2MC82YzZHMmYvOG9yYjUvZjlUeDUwTHp6d2ZQby96NW5mNTZyTjlmL3Yvclg3N3dza29yYzZNWXdvNVB2TStmNmZjRThmZTc4L3M5ZndZKzkvQzFIbU1zRjM4OThmMXpNUmJrWDE3dkgzL2Y5OThYNkY4VytSLy91djU5OWYvNjE3OHRmdWgvdmg3L2JTM0xuelc2eTMvOWpTZi8yOWZqWDdjSi95SU9mejFSK05kdjNDSEYvM2lkUDcrL2I5WHYyNyszNjBoaFMrV1BSSjNGZnY1eEdUNDRXUEo0ZnF6dzYrVjM1dC92K2RYNFZlOStUN1o4M2ZNZS9KcFBld0s3OGwxUGV0YlRuKy9aNSsvNVRCNHhoUjFlL2c1aGhuaStWdU1iV3BqUmZVcitlcjd3eGhaWHJPemJEUHRpNjFJTWZ6M0xjKzdienYzbVU3bnpldmhvZUxpWVcvM2YvcnIrZDkvOG4veTZ2bSs2Uk05ZC8xb3JuaXNvMXp5R08rZWZmSW9OZWI0Lys1YlBBdi9qMTUvdHYvOG1QNGdxTzVqUE1sZGVzTi9qZDRtUm4zL0tWano3SFBsYzV1K2ZDajNYdS81Y2dDWGkzcG1IZVNJN2NKY241cWM4OXh2Qyt6eXNZMldET2s4ZVlncURIWGh5RG91SFJGNWlDZGNiYXZEZS9NejduTStHSEVyd3k5Z21OaUxIZ201VmRxaXpXU2xsNU9kTkZSbnFPZWFVY3k3NXpmWEtMZmNTU3lxNWxQSVdqVngvNDV2ZS9KYjNmZXZiM2w1alRUWFhVdDlhYTZ1OWhSYXhnYm1WOXJiYVd1czlYSjBiZGE3VitYem5LeU9NT05MSW80eDMxTkZHbjRqUFREUFBNdDlaWjV0OWhSVVhabUtWOWE2NjJ1cjd1VGFXWXFlZGQ5bnZycnZ0L2lGclgvelNsNy95dlYvOTJ0Zi8yclUvdS9vZnYvNEh1L2I4MmJWd2RzclB2WC90R2wrOTN2Y2ZsM2cwSjlrOVk4ZENldGp4MXgxQW9JTjdkdGNucGVET3VXZDNDeWhGRGp4a2RtK3U5YmhqYkdIYVQ4amY4OWZlL1hQbi9xLzI3Y3IxLzJyZnd2OXA1eTYzN3Y4Zk8zZXhkZis1Yi8vRnJpMzkzRHc3OXROQzEvU09hQitmNmFGZS9MNXYvdmpyYng2cDdwN0w2SG4xa1dkZXFhTWk5NzdmRjRmeWNObVpZbjkzdjFOWU82VXZocFRlSzliUWE4Wk81YStOc2Q1N2JOYzhzRFp2K3VwVDhGclBkcW5penBVMXJuMitiWS82MUw3ak84dkhoM2R1VjRtNHlCRXdaWVZscjJGekU0eGYvN2hvU3l6QnlPL3FmYzMwM2pQdzFud1hieHZZMGR4YS9ZbytPbzc3WXNPL09ubVorTDVmcVd6RDJobWZIc1lJdmV5TVJ3UUlQTHhsbmFPdHROTllMZk9jdVlYTXBuN0lFd0pVcjRFUlhwWG5DcW4xUFYvZXVlYjFmbThyOWV1MWpQWStYMEVvSXErNVcxOGRPOU16Ky9IdVozQ2hOMjA4d1hzOTdCNHVvdll2NTQ4djFQeWw4ZDFuVC9IZ2RjZTYyVS8ycnFlRW9JNVVTd2hydHZmRncxUldaQjNkdWNvN25sMTR6VmxIaWp6TllBay8xQUlkd0g0OXBha01uMUw1N2Z6bCtaWEpvOFZudDd6MnF1K2VIMXRjVUpGNWYzM3R3ZDUrTWRZNzl6QlN1dG1kOTVsMXphVVhXdC9kZWNiOERsNXZmVWhQV09OYisvbG1yeXU5Kzd0NGlxeDQ3UGNwNzNkdmZNSEx6OHhSMm14WXlQZDk0c2F2enBCdjlndWREM2ZKZGFQckc2ZjI3SW5FUFN0Y0kwMWVrajhpdCtvKzloZm5qWmNiM3JPbFhka3lkaTZ1Kzlzam9Wbzk4WWc3c0lNWWx6SkNyU0d4L1JPUmFDbjB2VldudVQ3V2xsdVArYjBvM1U0RnVZajM3clBpZFhkZ0M5QzV3YzY5TGgxWHcvWWdGL25DUG9Ua3hTcHFGbmZ4L2R0dXdiL1hOOC8vZjNwaHM1Nm5aVFM3M1RFMmZYZ1liM2kvMkhkZUk2MXJMRjRtM1BWTHJHRmlEenNPS2JjUmUvdFFjT0J1VzJOZ21DYmJ3Zjh3Vm14VGIvRWJvV0Nwa0tuVTN0d3ZmTk5DTXdjN0hWSkJxZ2VHQjdBQXNwdklGelp1YllUanJldkxBMlVaZS9LWU55L2xEU0pyMitabXQ2K05UajF6RlV4YlExYjd5bHZkZjdGSTkrQlJFS0cxUUl4ejhyRTNIRDBzV0krZXhoeiticXYwOWFDMDJpYmM1NDVlTGN6R005MnJwcktScjRhdGlieDFmN25MZzB6c2pxbGFxN1FXTUZBcGxkcnZ2TGdPeUw5aXhQWWNEeVlaUk5YQlZ4R2JJaTVlNmR0UC9saFdWZ3ZKU2JraU1hM3hrYlhxTE9sN0VOUVhGVTF4UWlFKzNqUnJUQkhWK21Jd3NBWCtMOFRCNXM0K1o4UWZvTHgzVGhnbDlCZ2wzOXc5THBUM2V3RjZvUTlzZHJ2ZFl2UVQrTVhiOCsrWSsxMnd6YkgzdDk1alloZmkzZG8zSzR2Q1U5MjVZVTE0aFRsQi9yRXNsdnZDek1YTmpzeGNucFI3VFJqcThLUTNJSU1kTHFDSHV3dUxneWZJZzQwYWhlY2N1d0ZXeHV4bGxZU0hBRVRVbVBKNGNrVFVKMnBYc084VDNMcmJmTit1TUxIM3JPUERzaURzdlBsdUdBM1cwVjNFcDdFay9VWXZMcGE1cE1ETEQyMUw0c1ZRSUM1MmYvNTRYaXhmd2dFTlJHVy8yTitNU3FMMGZLNDJibzZ3aDgwRjl0VzRZNHQ1cnJjTzFCem5zSEJ5dURLRUR1L1YwZmZZNTUxS0tNL0h2MnY1VUY5TU9UOHhQOXhGM0R2anhhRlpHNXVYRTUvQUFLWStzRTY4YnVVdlRENWVBdUY4ZTZxajNCT0ZCbVVETmpGeGVYd0ZiVVlpTXo3andXV3ZoUnRwWGg5bm05N2FlbVpWMFFoV0Z2SEg2bUtHZmVmQk15TmhyNUx4ZklNbmEvVjQzdlcxV2E5SEN5S3c1eG5SRnN4NUx3RkJ3STY2L0E4K0d5ZVJ0SWpOVmVUYkJiRFBXN0RTN0ZoVDBsNFpwRnVNVVFOS1lIa2p0cFJYeTFoUlZpYS82RCtDV1ZyR2tDTSsrR0YwclFxbnY3bGJTWURSa2p2T1pWelNndzlHOElZUlpzVUF5VlhDOXVJZG1VSmxrSjVVUGtES2hpdjBnWWdqSDBYUDlXSE1jWWhMYTMwOXFPVVJwWFhqejlhSDJyZHYrWUg3UXhLaEVBVVFrR0NtTENieXhZOGhBN21pTkI4cnpSODM5dll0MTFzbkYwY0pWd2U4N2JleUl3cmRNeFl1ODFiZXNONVR3SUF2akJxMnIyYzgyQXg0eHc5UitmYis4Q0s4SytnQTRJSVJ3b2hqOFlCbGoyNmQ3V3Y3Z3gwTkVNOUNLRUZCS0M2QzhHMFdQN0o2SDc0Qng5QVJodXZHQ29SM0RGejBERHpqM1dOUkZWa3NTQUtQMnBDRDJZb2NXQlB6WWNBQk9Ed1M5OGFWWWtqdzdSSGp2M2paamRGSndDVllJVGRhZU8xajlNZUdaUDM5SnhyS3picC83NUdma0F1N2dZWlhEUGVGN2VVaURTZ3hwRVRsUlZ0QkZHOTlYTlZieGVkR1BDdTdFU2FlVDBjTGF2eGFqZ3BPeGcxaTBGOEFPeVlVQlh1ZlVQQUtlQSswbGdzQXk5Qlp4SGgvZ3hYTEdLRGVubmV5K3FrOEQ1Z25nVGg1SWxaUWczYTlFL1BMT3BaUFUrbEs3YWNDSDBabDYzc3JlYlQwRnFBVzBvaWZIamp5K1FEWXBqR0NxcmlpM1R3WFFHdlA5dUVBRmV3RjZzR2xjR0hVRkNlUGlSTTVndDJ3VDAvSEZVajlVRHBzVlB0dXR2RURmTU9Obm5JMW5BWXFnM0haQmJERjVvQWZzVnFaalgzQU9NMTM1MllWZzg0LzhYMlFYY3dsL2pHT3dpYmphUkhBZENIdFNGbGNRVU1PbW4vVGdpRUNWc1E0b1VBcWNvQktsSXhqdUpWdGRBaVpQOGdETkFFdUwySGdsYTVibUlOb0taTVF4M0dXSGhkWGdhWW85WU92QmdLK0dHTitQSlNXbG55UzF3c1pnY1gvSWNaM25lbWFGVE8xVmU4bXdjZER4L3VOMEZYV1RjU1IwVXpFSFMvT1ZvTlhjcGh6QXdyeGlZSEwzQ3c3TnFpVks3SUhXTGdHL0FNN0k3MW9PU3Yxdks3eWc1NkhoZy9EK0FZd05nUVB1UHNoZWVLdG1yazVxcFVnVFB2cTZCUXdJUmVjV0FJeklBZ29QcThGT1lZYUpZZ0hkMEh5SjJDVkhaL0lGWmoxdzNOdnZBSGZPVngrWFZpbXg4akpDeVg1eDllUHZ5NTFQVEtHOWZzQUZ1VHZINW5IcHYzdEo2Ly85ei82cno5NW5SL2RvK1M3WWd4N2F0aWVDSnFjWTJKT1lTbUk2SVBSaFphQzlMRGZDR25MRUlDWEhTcWlrZC9iWHZOSUs5Ymh4ZTIvOCtBQWRMVCtZeVYrMzRCRitDMlY5MEFaVE5ETnphS2F6eTNuVGhjQ09QRnlvTCtBSG1GdFhpQXI2b082SHVUSFBrSms4Z3NkMkYySGt6SHU3S0M0SFVCWC9mUERNMStMN1VHNzN4VUVkZy9NQU1VT01zOGN2VFdrWmVEbWNXOTR1dyt2SkU2TGdNUTNkamowRFJBZlJqb3VjSERCR1dPQnNac05nY0dBaHhlNENLWm1LYmduZG0wQWNnR2JQR3BNY1dnVEVxaDFwTHVCYWhOeTNPTjFieTRGcWNHUGJSWm5vQzJzQk9hUGp3VEpJSzQrUkZ3WVZvbEhHYkFqckxEUlQ0aGpiM3VQdmRhbzMyWG9DdUFxb0ZMUDBTelVEWjRjV0JBWU5adGJFbWF2cy8wTkdaMDRwcG1mTU1TbjdEUFVHMk4wZi9tcWNHdUFKZENndmtwSmlobjNCUHY0S3A0NUQ1eCtydHh6ZGhGWVNWS01oQ0dhK203czBvSTJMNjU5VFRRU1NsamZJVHBpalhDV2NUenBHOUQvUGxnMWVQNkh6TUNTeDFmeGRqc0hIQlppMVdTUkQyNityUEZnMkxqekIrd0FqZUJESUFqdm01OThLQVIrQWxTR0NQWENZdDBpL1RkTTlMNjlBVjVRUlNKdzZ3UmtYeGVxSGZSVUJidUJ0SDFmKzRQSEFPOXhZNWphRVZoZ0lkWXN3bmcvWE5QODhEdm9pQnl4QXRUWnp5dGovUnF3SDZ6K3BNQnQ1ZUxuaDFHS0cvekE0K1hJM21ON2VDM2VuMzFubFo4TUZvcEE4WTRGRGUwRnNiRWZRRTJlQTFvQjJVS3FOb1JpcHdSNVlVZUN6QXVVOG9DY01KNll4QWc5d3RtaHVDelhEZVNTb2x6RlhjZkRBWFIxbkJtbUpibzNwaWd3TGVnZnNBR1V6dTQwT0lBc21wL2xIYll1YWNKOU1XUGh1WDc4ck9MdG9KYTd2MndUb3BCNWQ1VDFabFZ1VER1MjFUQUdEQjZ6Q1ppTE9NQ2huMDI4WGtxbzdydzZJQnRFaGs0VWJTK09DSGpUV1V6OENZNUJ6b1RvWWVqaE14MUVDQk9GVGtpMjJNNEhhQVhrZkRSc0NUM283eDRzUFJzeThLcUdIOUNXRFBERGMyRW5CTU0za09jYjJBQnNUeEFuZWowZUwyRE1XYjN5WG1VamU5c2NBekNzMyt4U3llOUJoMi9HdjdGRU9OWlZXUkxqYnM4TFRPa2JHN0x3ZExPQWpockVtblcvUU5aWWlpQlpLdm5CaVJvMUFhYkEyTytXSDNYemhNTEV2RGpZd3JPM0ZjTXFBRng0Q2VqdlpRM3ZjcTNxSG1TbGNIVE1Sb1hpSkw0SUJJMlNZdkFOc0czaGpZYVNBdHlJaWdXaTlPb0gxUW53ejQyS0hDWVBtTUpVOFNCcnZTQjZsQi9oNEw2YlZjS0pZYzRDQ2kwWkc1V05CY0hOVzdXOTN3RWhoRzdzQzRJTDlrSFV3ZGY1L011ZGcrT3pZcENxZ0kxR1lQa1NXTmVRNHR3dk9CZWJuc0V1aGlSUVhBUzhYNENZZ0YvQUM1YU5QT0NLdFZ0VG1NRHl1ZXlvVGw4R0NtS29idzRxY3BlMnNtNExFUXlWRndQNnNUZ1lEVVFNdFVSY3VUZXlFUnFNSE13R2FoQ2xWR3c4SGtxdml6MWx6WkNNelRibWdUSFJoT1BicjVNNkFhQXZzUld3Qm16NUhTZ2RjQ0RmMjNIdXJDRzYvQUVPY0pPZjRmWVhIS2tDQVg0MmN1Sy9UVUpwRU1ieFo0TmJJZnBZZm9CV1FMNXF5TytFTFhXOERsNElLNDJkbCtrQkdQazhKQUtXaVZLOXo1VmcrVGphdHU3ZHE2ckFOcUlEckdMSUlqak1icm1CS3dOZXQ5bkhKUDJHb2Y3alNmN3hJTmVmSjBFUCtyR0tCbjBFMVh5SzNVRkl2N3hPZkplMWhnMFhTRFBZQzhWaWRlSmROSjYzRHYzS01GZE1yczVBRXQxUWJYNmcxSUpBWTdaaGM0akFnNmJmZmNsWnZ2TG4xbmp4OVAzejl0ZmY3eDgvd0sxb0F5TEtBcDBGN1N2ajBnRzZCbG1rUWMzb21ORS9CYlBINTJ1WXROd3ZURnFTaWhiSWZ4TkFnOEZiZERGbHNDOE1EUG4rak9nbTZhQ3hJSmdqdHBVdE5jUjlGbjIwY0NVOFVPQ3hmRGZNTnFBVi93YWlEcytJUU9JQWoxUm1jYWI1T1NMellzV2hWTU9jNE4vQ0dwZHhqZFlibmdIZmNvUmdISkFsc1AwRHQvNXRmLzdyN2JuKzJoOHQvd0NCNEN6eWcvK0YzK0JaRjZRSEd3YnN5TFZnT2xJNFVjVWJwTERuMFU4ajZTakx0YkNRYStiS0MwekRCZ0hsWWRNYjJzYzJicnhVbEZzY29MNm1pQXQrTm5CNzZBQVB4eGFEVEZoWUxPUytIeUQ5MHpvdktNM0xFM3M0MEV5TWJOREh3MGw1NmdlSzYxN2lZOS96cW8veDhyMzdUMW11dTVRNzdxckZFeGd2dlB0RUd5RzFrcTRURTRPWHlScll1eE9kVG51QU96NXN6RjVWNW84Q2xIcE5IQ0hLWFRMd3B3Q1RFSVEzd25OQnFCQVVLSGRmVDNCdEIxNk42L085VlFXdWZDTHlUT3dydXJrMEk0anlQV0RBS0JSbW1MWHBFU0tNbTB3UlVJSGx1Q1Zhc21EZUh5dUUxUVVsU1lDZVZlSEtHM2YwakF1RU53d2FHTjFIWmhkcUpOVjh4MmQ4R0JRTWJPblF3aGhpVWRrTldBL2o4SzlCbEtYeGI2dUVkU0hOTUdtRG5Ed2prZzFkZ0thT2IyWWM3YU5aNkJXeWdLeGxLTXFlMHFHeXNaUEdwa1BTbmlKVkkxMUd6bHBubFg1N1d4dE9RQWdIcW1oUWQ3T3JyQ0Uvelpla3B4aGhRK25pdXNERmNaVGdLL2pLVlJzVzJEVDMvYXBMb3J4dkYwWFlUQVJNc3FPQ09JcVYyc2J3c3pOQTA2NVMzRkJsdkRyUGlud1lRS2g0aW5yamJpclVxT25raGlRS1JJKzNpUk1VQTdQN01zdUNnWTN6Qjd3Z2VSR29rbVlBOEVNbzZoVkVRaER1bGNGUCsyQTE0T3YzYmlRYVVpd0kzem5pOHlGbkgxcXc4Ym52QjVUaEpoK1dISk5UOEpoVHhKYkJIK3JzUE9xNGpTMFhWZzI4T1NlMGMrQWpqQUZEUW5HdllHTjR4c2RGY2VHWXpGWnJpZERRQzE3OExwZGQwYTA0RGZnUnEyaUFrNFZQT0dXZUZ3K3dZaDlyNTJXQXc0MVBPck9HRUppb3h0NWY0Snh0M0NFMGJyaGtMM2xVMEUweUFZQVRPK0lYUG53c1duaVhiNlBhS1R6b2Z0WG56VGRXZ05LYVY5MjRiMURZbDJ0Q3NjRE1DTzhOOFgxZ05pdHh1N3FCT3hEdS9EN2dINU1uY0RVdzJNMXRBQXREM1dueE1qUTBaY2NRNm9DdHdEd2x0UmlTZ0dEK0kzUmZzVTFQaHRpKzBFaDBialhFUndlUVZvc2dqU2RmQVMxeVlUZGVlRWltOTZ0MTI1aUNEREsrTzdnVWZ3cnZpMGEwUUxJYkMzaFhjekdGSmZwKzBQN2tSWkJnby9PUEllMG5KYUF6QXNVK0JoMHkwZzNPM2RLQ1J6ZGw0bjdNOVFCSmNWTy9uQkpMbks4aEdETGtnUkZwaUJ2YWJqRHhSSStCSlZKWUVGWXZFcGtRVVNIZUQ1SEZ0Y016dExwUVg2U3FYeGlVa1JBRVZnRi9OdlBocjF0bkFMaUlRcldGSEdKM3NSY0w4OGJydzlJU3VBaWZlWnM0ZUJhVWFGKzZTendIMndTSGhvYTJwMFlBUENKeWcwL3lFWGJJTDZ6dzQ0RmZTQ0FmUUdLNWIwYnVRZjVnUlJ6WkJYcGNieXFEYjQwSi94NzhSalc1aEtIbkFxb0VSeGovdUxHendNY25MK0g0L1Z2aXB4cWdXeXc0K0tpYXQ5ZWNpWE1OdjJoMHFrYkpid0J4bnR1ZzI5MTF5WWFsMEg1WTJtNXhQWGxHSlFIbHVNU01ZS0tOMFVSV09oQnFwaStFYm5YTjFwMXJ0K2FTR2d5SkFQaVVaY05oY1MrTWNZakJqRW9HUkZTd1pQOFA0UlBuLzIzZE1BaDhNR09ySS9BaG9vV1ovOTdYZVBhZEowK0s4VzhtcGRDeEpkbXl4Q2ViSkdXZkRURmhGZmNHNjBNUEJDYi9manNFOHNjRDQ2VTR4bi9lL2NGVFlDbnJNSTJrU0p0clN5Y3FBaitCZE1TVGhHTFhhOCt4Ui9OK3JZZnhYcCtGTGJWalAxSFIyOWcxUk9NRi9KZit6OXVkdTAyREFGdDRPdXVCRUR3UTNuUGh1d0JQRjhKZkUzZ2Y0SVE1eDhzVUF3SjREM3dxZnROMFg2eVloMSt1RDdNWmtzOHdOL0tCUWdCVnh0RFdYUHpiVDZZdllpaTNBZnp2WkFsOTE3TWdmeTBIK0pnSGlUZHdQT0NDc1cyNDFsWngxWERrKzJLSHh6M2h1cmp6cmFpQk5iV3ZrbzErdGg0OGhkbHIvNGViWFArNFN6NFNBVWptM1lFR2FMVUxEOFpENFRDWXVMc09UOG5uOFYvQS9NdDJBQTdteWZMaGZDN2diUnpZNTR4dmVqNFVHb3ZzbXM2VGpmM1hCL2pidHYvTGU4WWFRUDRzRFJ3REl3Rml3b1ZrVGZHSjZXQXlHOXVDRFVIWlFaZEdrYnFrNWUrN2gvWEMrdlN4TDBnNldvbFV5dEFOT09LWEkyWVZNWmJzakNkQzVORkY3REc4NTMyQnYrQTVKS2RYNUMvcXZrenhLWkQ0YnpZQUlpU016bFdhTnF1R3pqaUNGQkZZQnJvcVg5RUdoWm54UkRqdzl5OVFXaWFROFNyQ3VmRUhtcU9WRTRxTFA4VWxRNUFiMmdRVktDK1diVXYvYnBPRnoxR0NabUprUDloUmRIYysxNUJjR01xQnd0enhYdWptTU04SzFvVE5taHpCaEpaM2M5Rzh6d2FBUlQ0enRaQWhQMzFqUExBb2x6NXZtT21ZK0lOOUloRGNqMlhHeDZmNjRXNHhsU2JKd0NhTlp3UTVyY0x5c3VLc25RVmxHYVRSOTJYQWNuMG1ia3J2WEFWbmhJaU1lbWRaRlR1QzZaOW8wSy9LWmZMcTIxZ1lQamF6UWRVOHZrWVN1cjRUeGlQd1hpYlJYK09kNFBScFRka1RQak5VOG9yZXNaWGJJQnY4MzJqWlNRVWE2Q3JyYWV3UHFMWUI4aDgwZnhnOWovMEJFTEd6Y24xY1NHZGpKcVprakNQU1ZVSWhpREFTemNydllPWTRocThIdkVnNzlZbHd1ME1sUHJqbGhMc1ZUR1FHcFVXcjZmZ1paQzByS1ZQSlI2WndhOXorUzVnU3J2Mll6bEE0VFRWSGxwMVZnU3hiaHZDTGFZSDd1NVVqM0RzTmdCNTcyTER5TDh4UlB3aGdCdFVDTFo1OVJlQWxaQ0dEeE9SNG90MjNJWGxKWklodkxTdkRxMXFZNlFTbjJFeUFDK3lETlRTK1h2UEo1RDJtNlJ0MExCWFRHY2FvOFMxY1RFdHV2WU4wVlN5cytjUEhyRU9WWUlOZ2p2UWtCSjM3NDIyeGtkZnptSFNva3gzQVdJeGpXOFBQKzhLanVPTWI0SU1MaElDSUFIQlJhTVRydFdnbWZnQXpBQW52SFBjRlJ2QmJxSk5xdytzaGpMTjNKQjhvQmwrdGVMWnZRZUdXZ1k3OEdMSlMvLys2NDdtZnlVejkweERpb3lUb2RjVHg0TEFnL2pIaGJzVmhpVjJER0NCSCtIU1RnUG5GVTZNQmo5OFB4a3UrZmpYOE5ONW5BblhhKzVqNkJDV0M4WEEyUXFCUWpBTHhMbENXdUZHa2x2QlhKOWxkQVErZ3laR0tNT3JpVVlCd0E0dUREdDVZVThnQ05HcURBU3JZTytYNFlMYVEvMmNOOXEwY0hnYktRWW5CNFA2NUVKaUpQZnBiamtIY0QwQkt0NG5vWDhidnh4VWp5cHpMNFlxWUdmalJCL1FCNUpna1MrOER3Uy9YMXdjWUtpMWVDU2tDSWdMU3A3YnpPWWtIeGRtNm9CdWptdzB5Z3preGozbGpKdzJyOFB3WStyb25oaTNrb1o1dU1XMHlWN3RNdTNmTE9VQ0NTR1FVdExlbDdSUm5Md1AzM1NEaFNVekdYOHIrMHZGSGpPVUh1TTNscERSK2JQN0J1ZTRIQk1iM3Y2YVIrcjJNMG94d3ZMb0JNVFJlQS9xTzBsYVVITitiSVNuV3ZTQ2tCaTd4aVR4L1J5eXl0VXlnRi9CQnJnQ2h1azRCTlVDTHI0RGg0YTVKTk5KTWVrUlVKUFZYVHplTnpnRmFVNDl2d2lJaWdZWWhlU3VVdmNSa3JBNXZQWUJJMGJEY1l4WVJRbnhGODVQc1RyQktSY3FLalZZTnhoaStoN1JCcnhLTHNWV2NTTVhaWW1DeExqaTdjcTlmREtDVUN3c0NyVGdMRmtvK1A0UVJnT2dCL2pDL3JBK0FBNXVCYU93RjhBY0NBcUVtR2phd0pwZ1M3aHRHWFNCL2ZLSkpBTmxOUlJSV3g2RVpOK0RkYmpsQ040akJicUhYVm9weHp3UytFbTZNdjczNEJVK0hHRm1PdHdZdzRzRk9mTUhhRlRnak1tNGxqd2dKbSszV205RUFxeVFnR080WXVDaGVoSzNkMjByZnVBQUZ0UjVCNFBkU0g3SDRIK2dQQUc3cXE4UGxBK3hyak00aWxjejZXRHRpNlZHMFhNRDgyZ2N1aEd3K3hnQS85dVhCcVBQS3JHUnNRMFdDa3FOZ3dMSnlGcTJlOVFQUW16cWYzSVJyWVJMcTFhQVBrSU1ialc4dzluTFNveDlXRVhPSDgrTDN4cDRNakg5OVRmbnZDbWZsZmdLYzIwVFc4YjRqWHRFUTFYbVg4UDZXTUJzVndIWkIzVzVqN29BdGtDTW9CRVNVZ2hsQlNCR2NXNS95R3ZaK2tKNThJWmEzRjBMZVlEd3NVTG9iajlqUjduYkNFam1mdEJhMElxQjdWaXhpa3RrTHNhakpVdlBGT05lejJKWEw1SGREaTRlbEFZY1ZRU0JBRWF3S3lHNXVFSXFBUWJMQVhtQUxjQjVJc01WU1pSbzltWmVSUVpacytkN28xUnJzY0RReXRBeWU2VG0ybVFjNG82Vi9vby83TTBzeEFhdDgwWW9qci9kZE1JV2VyZUVTTW9kYWNJbzMxczJ5aHdTQTJQR1lpUnRuQXhQY2x2NEJDbnZkRFU4Q1dNMElHRVJ0dGdzTGJFUkdlSmg3TlErRlBxTG5HTFo2U20wQXl0V0VOSStYWXNaNkEvQkFoVkNqOVZoU2NHUHVNQWlBQ0o4SDZHRFdMWnJiUndicVFoYkJUK1UrSmRrWnNqMXcyaGJJWTdBTndBRDhkVVliRnkzZ3llT2FXSWVOQi84c21RSlUxMnJBUWIyTTNDSVhnekhmSVJHc3RlbDYxamRYby9pbXdaRHFWSkc0TmkremY1dDdmNERLOXZaaTZHcytJRHVYR0E2QUlOekJNT1g5amZHcjNMOTNISllWQ3NuTnY3SnFMMDhVNzdSUHJTRWdoMGV0cHJjTTJRd2xQT0NkTUtVR2kzQWNpYlY5bXFVTXhnaTNWZWdBc1g1cVF5K3NNcFRLekUweUNtbHBPbERBU2dZeGlMY0hZbVJFeitvQjYzYkFRUjBFanMxN0UzSTF1blVYRDd0V1VUME1NRGZNMnpJelh1M1JqbjI4UGpDaFdTZG9jQTJ2MExSZFlMM0JUc09WbGNOVmVYYkFON3EydDZVVkpvWUFZNy9rUE1TZWEvbyswTGREQTVCa05CYy9oSERMQkxKNTcySlFOb1lUdVYyc2tmZ0llUVludkJWUVBqSkVKQmpEZkRBZ3dMTStoNldURmVqRzZrSUYrNHVBRnhZWkV6YjdBeUR1YjduMkN4UkZiZ0EyWnJSYTNOTTBtcFV2Z0IzaklkKzB3SEVhY0R2NTBSUGJUMzU1TEdReEh3VDJvR3RUSjQxTzdveHQ0WGRTcmpWOGVLWUVlOENXM01naVd4V01WdFlwU2VhS0FsM1E2N1FjTmdmcklRM001WEkva0JaV2hFdmkrcE5PYW9mT3ZyQVh0NFdsNzdES3cyenVsRHVlY0hzM2pKaGVFT0ZsTmVTZnJFUFYxa2JyUmZqaUwxZUwwVFNDekplZzVjbXlhYXRXMUFSNWk2V2UrME1KY0R3Zy93Y0VCUy9PMll2MXRuR01PTS8zUmErbjRSS1RaRHdRV0FBRDJ3empyMmd4Z0xWalNpVk1qQVc4MHZydkh2YmZuMVZUYlREelZ5TVJiaFpDN3d3UVp6L0RaWmhMYVR4MW1LZzlHS0Nua0tCKzBEUTBLV0NacGd5bDUxTyswR1JCVmpKTlhBZG1Ca0lGQTQvcENtd0NnQWhROWVpcXpCQWExZWFudnYvcXFmNDgvbC9KalQ4dk1QSmwwZnc2M3dJcEhCdUZtQlJjNllrQ2hjT3RjenN4M21DVUVvcWJtb0YxSE9EM0V6TGp3Zmw2MVhkMFBJckhrVEVBeWR4OFNzZ0tsSHQxMDEyc2dyeTk3TU1OMTFxditCV29CL01HQjdNb3NLT3EyWVA4VDR2cUJDalZOSElDL21KdThzbGdKK1N2WWVzQVFCYXZKUFBxa05NTUdKbFkrRzRjQjNka08wRDY2VWI0ZmtwUWZsVnN1azZBblJVMXI3c2FUelhiOGF6YjZrRTRMRitZRFNkWjhnVUJZTjlnUmV3WXptSGpBbmx6WEhFQ3lHUFo1MHdnbmhNUldzYWVIMnM1Z1IxQVZaYm13Nyt4YXZsYjEwa1BRRnh1cUhUYkp0T01oVUFzc0grUHhaTGhHMko4bnE3OEl4bjExNk1kMGpST1U4bUZoRXR1VDJ6OXMwSmxHUWxvL3JpUDBIbzB2NkkxSHZoTXN6bTV6aUFWVXZqNXMwNDg0dXFYRnVqR3dUYXd1dVdrMVlMbFZYaE5pQXQyQmM2RUh3WlNscHdOQ2NrT0FpNGlXL0J6M2hIT0JBYStEQTdNZitUSlhPWHh5NkQ5YzVYLzgyVitVT2JGb1lsc29rYjVRWTRPMjhERUE2QlNNTXp5enZITFZvbS9oQ213aHBGWnhWQnV1OFFDNjgxYW5DUkNBd0ZqUHRFMXl4NEVJVkNiKzFldkx1ZEZzd0xNQmljZnNSd3dDQUFsUUJQNkF2Y01tbGFXaDFkRDlMRmFzb01yS1hRNG5BZEVpSWdpaWpDQS9QNWFmVjVERWMxQThuZGFackNTMnR3aGZZYnlCMUNwVFB3R0YxNUdPSU5PMDRRRmFONW1rLy9wcW8wT3AvMUxPTlAzV3pZWWJJNTJKeVRRL1lpamJMTmtKcGZTdEpRQlMyTWR2dVd5ZVJvZEttMWo4VnpzbUc1Z1dNTkNza0R1UFdhUzJ4c1BBMzBYaUdyRy9YSVIvQU9Zb2dQTit1RVcxb1ZEN0VMZ0JhOW45T2VuWWN0V2pHS2NnL1VWclUwNDlyT2EvbnZITzFjdk8wVVArRGFjTDVRWHNIbi85SE9mcEhnL0pGTmptdUl2NEcySjJIRzEvVFV6S1RWM0RmQ01acFBZNWJidUNlZTAxSHh1Q0NPNkZxcmRWY2JPY1VDMkpKZzNlMW13WllrTW9CMUVqZ3V3akJta2lnQmFZR1kwNXpIcmZVUlR2M0VwT1hIVzMxNTgzQlVlUE8yQ1lUMStYN1BraEZkQWhJOFh4VWppUW5oM05nTHppRU8yL21GZUZyN3hxaFhrcjc0OXVNME9vUVF2c1Y3TE5FblpBOXFDRmJFYWN6MW1IaXhtZk15K1ZlUHQ3T29ET1k0NjBQRWZxd01xdjMreWhHRndFYlg4K1FDVytBdmF3YWp2MzRMWk9IQk4yelVSdTN0TGFSQXZaQmJNaEttd3pjc2FJOGpEampnUkMxOTdmV2Y4UUkvc0t5eENYdnZsWW16NytsanhhaTJMelNSWlBwdngwYmZ0TGkvT0FlLzE5dnNFVlgydUIzS04yMnRZbTEydEFVSEYwVHN3TUo2Mnd3M1JSVjU4V2M5a2p1WlRwbUlwa0M0QlNZVGdQbmlhaWRtTDJDalFLMWJpQkdhbXhkNUFMeE4xMml6OGVRbWdKTU5LcGxUdmFtMEFVTHNBWTRWWXRoeFptd0pJKzdSKzRLenZUNUxsdDdzWEx0UTBtWjRudlBCUGxobWJ6MlpJK0FNcktWNkRackhoRnYxSTBvSEttUFFuVnd0ajd0ZmkvejJ1ekRmYk5vQWM1ZytUdlVheE9raFpKQUFUQ0xZbHhYeHlXZmlXK2t6SXJFVlFBZnJiakI1YW9IOHRnQVVnSVNCZDFlUjlZWGRuTFR3RkdQUzI1OHNWV0pZSmdqS0xKWW80WHcwVlZoWEEvaHBWZzNkY3I5MFhjZ0owcWhpUmg4RStXaXBUTGpPQ1NOZW9keHNOaWRnYlc4bHF2OFppbzQwVnBXTlN4b1BzWHRrNkJIemQrMkJ5Z2xIQitTdkFRYmFCRzQvMTNValQ5QVhaZDVNSXNCbXJkTmtIYkhoa2I4Q2J6OVhNVkcxb3h5bTNoc3MrVm1qRENrQjdvSE13R3JUaWZubkJ0NTMvaSt3OHdJZkM0NWI3eTgrbzJKUUpZcHQyUFVCcWpvdkVmaUVxN0NuSU52Q0R2QWI4aTMxL0Nnd01lbXY1MHdPaGd5c0F2bkpHMEFPWUxkNlhqMnpqajdsTWtOakhtMWRiUWxsTGtWMHhEbjRiZGhrbm1vK2t0bWJlRklsNVBvc1dSQzZQRHZKVEVjNDJjbWZ3RDQ3TnFzTXRSOVNzeFpQWHQwVUxGTmpFZmJOYVVNSUw1OU1qOHV3S283dXlyWFFEeTEveUNDZ1M1aXpmS1ExZkIwYkFRMmJjOTJNczB0b1JNMVJ2ejZlMUNkTTVnRkxSeXFyN21paE5BcXdIaVNEMk5PT2EwaTgzYW1yZjZrbzA1OWxOeW1SZWZwWmZkVmNDYzMwTFd3a2wrdVVnc1VVL2ExT3M5VWtuUFduOVpZVDkzeWM2Rk4vL3ZOamY3bm51ZUV3dHlCWklhY0V2bG9WZGVMSFJvVC80K1JmOEJhS0d0UmdOQk12SUNic0I5OWZvaUltUmIwNlVOVi90Ly9LTy83d2grQVlUdml4RHJTYTg3YzVGYWEzd1NSSFBnREIydUdjSGZleW84N3J4QXljYTlWb2hnYW5VdW9TVFBaQWduU0lDRVlOZUNRWlpRSGw5TmE2UC83VDdnMGMyM1JsaHNSRGZvVnRLRWR4eGVqOHdVYk5ZSklXaFJ5Y0JlQmxrYlJFdHZoOVl4N1hjL0lCMVEyM1JWOVFPbWRQNk50OEQwcCtSLzJVN0ZwK0hwRTE0NUVKYjhaSmNHOFp4d1NXVEtkaGZLOVFHWHFIcEZ2MW1TR0RoU3NzTU1wU1l4MEJoaDJuYlVYRExCWE13Wmg0R2NRVVJ6ekJuY1dCTHNYQ25tVHAvMFVVOGNMYXdEM2lDOEQzUmN0YmJMUFJ0bjJOUGFMaWhTalFScWxXUTdGUWI3OXZTblpHemQxbHpjb3YzT2g5ZkZVS2F0dlY1Q1JObk1NeGtxc0VHNjlnQ1hzVU9UdnZQcnJzZ0hiYStueHdQL3k0ejdPM0RBV1hRUW4wcFc0YmMvT3FScFU1NGw5UFJDcjh3QXdlbnVOc1YwQXRydU5Lako3NFBUbjRWb2JFTUFVRXQ4ZjRiUkpPZko3MFdMNXJBd3loQUt1dmRyWm01YlhpNUxNTXg3V3I0OUhQYnJIdVozUzVsaUxpdG9XWWR6Ly9rODM3QlVoYWtJRFpBVmx0OCtFRXFMNzBremdHaWpWTkRIbitVWloyWUNzOVhzbDAxdHNXODJVNndiOThMNjQ3ODNnYVFSb21vVk5peEE5Z25iZ21pZ3hldnZCeUdOZHZMdGF6N2U1QzlPN1lLbEY2R1RTZlMxSzF1Wkd0aE11aW1WWE8zelpHWHdBQXRPRzA0M1M0NFdJaTE0QWFBeStoSlRtaWpkYlVOVkZ6SGZvN0dTeGE4R2dhQ1MvRXlrSnBxWVVlMFR0Z1FOV3NIZU9rZDN3cUJ3NDNWOXJKSkEzRTBoSG9IYlBtOHhRc1p0cnB2T1N6dmsyYTZVS014dWpLQVkwRWlZSkJXQmtQanpLMmNlcEtWTEtCQjhLMXJRTXBDTWRVL2JCL2IvdUJudzlZRnYzaGF0Sm5Gc29rQXhjM0JlUmYzcjlidVJuZnRkc2FpUG5iZEJRdFJjbzg4S0x4MlFwTXR0T0VScmxvd1hKYUw1ZklyNGx0VzRDZjRLeXNRQkZiVHd2VngrbTROUDBBZlpoSjNSQi9KZm9udEY2NXBFQ3lDUEFNN3lRNmR2SVVKSWR1T3JkaFd1RzhiWG80K2RvakhpWjBsYkRJMDZaVVRBQ2NhaUMzYkNZVWtBOWNBQ3ZNR2wvSmNHS2JIUWtUK0Z5SFpFMkNMYnpzWGh1R2hTSjkxcHNrY0J1UWVNUHE5eTQ2QnZaZUZFVHh3MDZIanZMQitFN2VRd3BrZmczSkdheFhTeEQ4Nm9jTW5xVkNjKzdITE9kMFhUSFBxUjVMSkt2WUhEeFAxMHlDR1lZSHpLb2FnNUErMVlRVWVwOGRnVEIzK1lldkdON1hJNzNkZnRqbEE2Y3FKTTBGVTY3QktwMzVyMWV3NjFjOE12c2g0L1lDQnFNbHNBQ0RsRVdBQXd1NDA4MVY5bTJ3N245NzBzL2UxL0JyWDVtNkdsUnFMZ0sycDVvd2UrTTNhVWxOSkZMU2ExWURlRyt3RytWdkdZNzdIM21BMGtLZDVnRlZmaXZZTVRzdUVPeUsxb3kzaEZRT2FkZmpXMmUzYkpCNm9kd1BKcm1KVlNtT0RiNlhSdmNCbnJiQ2JuWlh3M1c3VmtCR0s3TndJNjdRRm90RTFLOUFkSU9MSE5oVjgvelRpakUxOGJQSkh5SGwrOERPU1p2a2IzcVRaK1hCcXRZQkdwdy84Tlo3UDB4a0gyWGsvTDFoM1h3NmpFTk4rMDU3Sk5uUWt4WWc2R0JuUUFZNDNhMmZhK2IxMXhVRjJEWFlBVU5wNTNwTFY5M2RmMXRXZWR0MWhXNER4WTc0Tk9zTU5JSXdmYm5uV2hCV1BCZ1FRZUFQb0ZkWlJtcGp6VFNrT25TbFUxTmdzUDVBQTYxZ3RLOGJITkVsclZwZWwvekJoUm5kcjBoNThBTnBuV1hsLzkvWktYSGpZZUtvVnJ4V3RJUWkxc0JlZ1k2Zzdvb0FPZ1RkZmROT3VOaXo5YWNROWxCMVViVHZMQnpFQWgyQzVYeXZWNTc3YStCV1pEbXNQZGJ0bXhnUG10cUFaN1o4QmoxOVY4bXQxQ0FvZ285c0YycmJtYTZRNVAxNEkwYmp6MDRDY3ZHK3lwdmdCdFg4RkRXVDVnTDQxb0dHUHIvdVlxYnF0Uzc3TmVlZFdPZzdJZlBuMS9xcnhoNE5jOERsUEhJWURwb0hvejNRREtzSnF1dFJnak1lSW5WV3RwcFFOa3RoaW5ubjUrVnc0QlR1UldBdWNyQ0pxdEJOMStVNWhFbTRjQjJBUExONm0zS2dDcUw0cVU3Y0Y0U2lJVVVCem5sZTI2djdyanJWd3B0T3ZJanR1eWZnN3NYamdlREFHdUczaDY3Q2p1T1JpTlFPMFl1c1owMzc3aGpkY1dDS00xTVFzN1JhNEsvY0ZhQ0diZ3FLVEdMVFVZYkZJOVFiRmZraVY3UENKb0NORXIvRkpmTUtLRjVhZGwwSUoyVXRjb0ROTE9tK0thaTV6NmFjRkhYc045YmVieFhqTXRPTUM4Y0w1N2RIdDlXUTN3b1VUc2Nwaldlc0lXMlB2UU9vTDA3Vk1jdHBtanBHMGZBVCtEN1JmV2VVd2lZQVhlaHhLMEZLSEp0Y0xrTm1xZVNxdzl2MUFsRjQ3eVJxdXhraE5ONHhnZWJ3c09laVgrTmZEVXE1VHBldGJQalpqM2VXeWxla3RQNmxGZ3NISHhoTGk5eE8yQlVuL0pyTFBBd3dqK3JvS3FCNXVHUmRtbmhSMGhIM285NFZmL0xhanZuZ0ExdGU1Tm05SmVpSk10L2xJYS9WUS9mYldkVHVNQnZDVjlPV2dNRVF1Yjl0Zys4YlRzc3ZSeGdRdzlPbi9LRnpEZkgwMndqenN0dWtuczVxc1h4Qms4WDc3QVBvTndaNGlnNDFEdjlBZnE0cmlabHRmRUhKSTNEajVpbVpqV0RTZ3haTlBCOGs3ZVV3YjZONWs4M0VDOUo3WUp0YmlUbGMxeExiakVjVFhDb2J5TEhOMm16VjVPdVRPTWxKOVg1ejJHSlFUMjRoQUFXTWtDYkxDRG9BWnRpb0NKbTAyNFFGdmwyTnFESWFGVTRzTWpnY293bVpWOTNVeU5MeFVzRFNqbi9BOWdORWVSejV4L1I4K01qVjRqaFZ3QkUyMjlRbDZISVRQdVFnVG12U2c3VEV1bHVPRWt1b25BRDVZSFAvUXJWNXpoQXZDYkR3K0FUeFo3aTdFd2p3Q2NEQWVlbDVuTmZRT2w3MldOVnZMSG5XMjNqamo1NVFTU0REbU5waUtyS2U2NmdSMGJMbEIrT0VxQmdoNUpKTjZFOU1BNmRhd0xXTXhXRmNnQnNZODNGYStOMXcrWkFiYk5MdVc2Yk5DTEM1OFZiWlFxanFKQjVjSEFnSzJodzFndHlZa3VndjVzWnFrVDhFTU9qMDZTQXlpNEpnTmk5YmdReG5sQWtuQU5CQ0xHMUF2OXVqSUdSRHh1d0xpL3FIengrWTFhUjBQaiswelBsVW4ydzZrUU9vVHB2UERKSnRZMFgxdHl4ZmduY1hDT0V6dGdJc0FLOUgzZnFyUkM3b2hjUi9WK241OGJNYUJRTCtlSUZuWXAyOHJhd3M2QUdvTHE0OFZBb2RmV2xyOUV0TEhTMWg2K0oxRjVnYnZ2NGlEZEREYkFTOXpTSFl5c2s3b0FCQUhyQUFWeGM5ejlSSE5LNE1WeXd0d0dNRVVCMjRmSzNTZnlVaC9YVk42YnpEMng1WEdMMExBQ2x4bjJKSlZhNWhhczByclYzUno2bDMvN2N2RzBITDlieTU1L2ZPYS83OWQ4dnF2SHZQL3pTV3YvLzJiczd5b0lpUTBZRzV2YStLRTBpZjZrSDRMZVRjY24zRklKejhzZyt6MytJL0wvQ3lIY3hCK3RzTXNwZTIrTVBlZ252ZmY0SUJUdTN6OSs5Y05IdjBYTDJ1ZEpPWUZOZDZJbzUxVXVmMW8xN0xNOUF1WFExdWdaSmdpZkNkVzBNTG5Qait3SWh3cGgybzhoSFd3Wk85VEZHMW0xQ1RvaDBRVHVEV3JOc3ZWM20wUEtmYndYTisrS0J6eHJLNFpvR1pWc0RVZUQ3dXd3cHdPdlVHWjRKSExrbmowUmtoczZPYjZiT2I3ckhVR1c1U0JaZGhXZ3pWNzlEc2VheHNVL09JeDNWWnliSXRoYjl1QkhQMFJzRG1mSTVRc3EzN3QrZnF3elJsc2lFTkV4Wko5YXYxNUxJUUFEZk0xVE1vQ2htclA3Q2ZBQW42R21kakU2YlNEMUM4c2FJZkR0RlFDak8wV2pqdEQ3eGpPTjd6THJqSEwvWUp4TlNjZzdRRGdkdnJNNTJ3MTUwN0FDWnBnRk9XSENzT3VvZzJyZU96UDhIODUxWnJSQnVwa21mVm5kYUxmMUNkRE81Rkt5STNKMHUva3RpNFdDNE1KN3Rxd1NDaUNwc2R3ZExGMHlkaTVmdmZPUHB3ellaQkE4UWtJeUM0bDJ5QUNIaUdZcDUxbjlscTNsWDdjRWtNcHhiUXF4Z2Q3VHFPRkpYcXV6MGtmbWRHRUFkejFjTXJIbUR3c0hONlBpdVR1OXA5Q1dNVHh3MlZEN1NQR1pqeXVaUlVHRnlpcDJhdzE4QU1CcDFLQlIxQkV4ZkNiVmlBNDYwTU90VXdhaFZPZkc1emZ4ZzRub3phVzRTNG43U1FMR3V4VWorQXNiUE50UlFxK3JEM3c0eXZjZ29xU3dRYThUY1R4NXo4Vm8zc3NpZFp0WU1PeHBILzl6Zk82RzlYSmZBQnJLT2Q2KzJrNlpZc0ZLamY3QnZDMFZ1aXpNc1FhVllBOGtFYWkxRSt2L3lmYTNXQk9tT1NMVHp5N0NFLzhlRFVUZElvanFNbm04NDRvZ2M1aWJhQkI1eVhzYWY4RlBnWFFCNUp1eHJUZ0NwSzc1THlPamg5YSs4cllvd25LZi9LcDFFZ1dQeWN1RVIxamd4cW5XRXl6Qk9kQ0RXdlljVTdnOVR3aDNSVStMRlYyVE5hRmxDYzI2OHVIcVlJZGRGK0RIWjIrSDhBR2pKWWN1bW1GRFI1OGRoT2lmaFZENHJnWk5JbWRYSmRSSWhNUW9KaU5YSDJ2cERuZXpyNTY0WDRxVjA4akE2YWRXY1crckZTY0ZLZ0REWTVYbTg0OEt0bW8zOWRPSTlkMkxnK3lETDhRbTIyTVUxYjlUMjJ0ZzV6QTNOemxEbVhQMCtBMnNKbVFLR3U4OXJwMHE5QWpPT1pHSmV5N0dNQWdlSkRCTXJHM1JvRFhXYzZGM2ZPa3VrOXgyTnJQbVRsa3JSRlk1bkxTaGZrdExyRGhmMWdpVUt3OXJvNGNhbGhHN004d0NnUVlTaCs2RDIxaC9leGJDZllKWXRjL2N5QVhhQkwvMEU5UzFwQ1ZMc0ZhdFdMT3o1UkR3VmFjVVlmOU9mV2RJZzZ6UVFzQXI3a3JnSVFTeDNWaW5MRllDZHJ2VmNvOWZHM2N1SE1FNnNNWGlnR3RaQVZBZkQ2UXJ6MHM2N1NQYUtqR3I5UXpYVGFyWlhZQk84SnRSc0MyZDJmZzJhMThRMWJ0ZVVnZENXZEo0VkNBYlg4WTJ4a21ycVpOMlBZMFQyUy95Qm03QnVGN0R4NTZONHNrUTg2aVZNU3UyS2pGbi9kb0xMSnhOaU5ucDZNcG41U01jMENRYkpocXNMYnZrTjdxYUtUMWE4MEY5Wm5ZUEpNNVdqVmRtaUhoblo5dk1lUG53bE1iaU1iWmNuMlB5d1FlNzRrdk5uUTUyc24rTzUzUWNWdFlBc2NFYXA0c2NqMnp3Nnh6Y3ppRjB4ak9hdy9SS2RBUDlKNmp5cE5ZNTJVMzFRamxRY1N4VHJFa3kzcHU3MitGNlBQc1dqRDhUcmw3TFNacnR4TjJIcmp0ZGFmakQ4dy9yejJqdFZIZHlISjJobDl1em5jS1JVTGZUNWs5aG5qeDJmdXhiUGlaaGc2YzZ3VmQvL25YZWlxYkhjVmg0ZWRuL3dYNm9iSUgrK2JMWTVQeGQ0dnBIWGgxaGlnYUhyVmMwMExDbmk5WEptRUxNL3R1YkxMYk8zUjNqSThpblo2K2tuT3k3dXhrcEZoNEcyQUpCaW80ZCtwR3E4Nk9MOW1SUGRZMkNaY1BVQXBzeHJJajdOREtZRWtHUGhkYmJWSHJOSXI5dnBGcnB2WWFjc0NsWUFaUlpCemVaWWtRSnBkZnh0anc2Z2dYcERTYmNJeEFHa0dXeVFNY0UwYldHVWRMaWV0Mkx5Sy9xWnJEUi9pdkh0OWpkNFdEZVZ2Q3NoeXlkaGVuRmpxV1l0c0Q4Q0MyR2FZNzdhZVAwYkdNRmlmYUFZeHd3SG4yOVNURnlqSTJRelN2UmFaV3RGblpDV000Q1ZVYkh4elhOL01OSTMyek5YeHMxVDR6Ry9qQmJ1bm1sYzR3UDd1VExhRnc3aGxMNTU3ajNuU01mQXREWWVVc2l6OC95NTk1OU9lTVQwVFJxMmxBVEVtNEZvNm5JMXloTzIvcVBVbUo5U3dzbXoyR1RrZUM3VXdzTnM0aldyeWFMVWFTejhDRjdER2NKclhMZDdHcEFkRWNmQmljQlNiQWU3Q3I5Mm1CZ0pEZ3pzemtETXpZc2xyRE1rellDaUp1bEd3WVlhaldLRjdSOFpOdlNoTllaREwvTnhjeXNxbjZLQTBscEZ1ZG5mWjhuZ0dnYjNST1N2dWdheGpqTUhyQUZrSkY0V3UzMC92TWlnS2dINmpxWjBzTTJtd3I4R09zekM3MVlWTDJzZllyNUk3VzI1WGk0Rm9NZkovOXNvL0hvVzdRK2ZLY1dBSzJIbmdGRkhvNmNtckxTM1JpREFidlVEVTg4SXZCc3NEVEVHZVZRdS8yWHY5KzE2YzVqTEtPdi9jOGZZYm1ZL3lYai83NnN2NzY4SHV0OTlkVy8xOSsyb28ybTJZY3MyRTIwWG04dU05OU85UmdSSXhMZXh6WFluRUZGZzhuc2o0aHB5WGIrMUVOWUFzWmZ5QkJmTWRVdXZsak9rdXRtalVCeWlLbXhjRmZyOVdhVmVMMzNkVnFKZENRUFBxSGplS2ZSTUZwZEJIQ0c3ZGF6YWhzTXFBRU5FaC9taW02NGNocEVnb2R4dVUxaDhvNHRndGJheGNNTG1WYnhCckFSc3ZlZFdjVW1WZDAxSWR3ekVsc2dGZm5XWHd2YkpnMVNoWnhPbm9EVmNkdk81bkYydVFIWTVmNEY1UTRkSWUxMmd6bkZJVzdDZzJSSFQ2emJLaTNjdmU3T202a3h0amRWRXdGTmxhaHRvUnhWa3lpcWZmZEg1Tmh3QlV3eTBRSFR2QjQyQzJCcDhyMloyS1BCdHVHR1J5T3RJTHl4OU15UEgvVk0vdXpFRktKRjlDZU52UDNoeS90TU1nc084c2F1cFBhL296aytYM2l6L2Vmdnk3WC8zNDVuRUw5MTd2NTdiL3VkZjF1OXU4WCszT3pZWnY3KzRBNXdWbzRHSUM1ZnRZSmV1dTBBSm5RUWNEYm50ZWZCV25sdjdqZC8rM0xPWFhwTW1nSkttR2xMVEhGQm1sZklVYWZVb1ZYaGhYQ1g5N3o5ZGFIeGN0RGFobFAvTkZSRFRndDAvU25nK1kzWFhTViswOWxKazl3aXNrUTAxT3lqSE0zRHY0Q2NFYzZVVDRINTVuM2h1RmFIeEZRMnBGTzJXaHp1RkpDbVVCM1RsdnFqckxVNFJ6QVA3czVxWk1NZ1AwKy9UUGJacmV2ZFJ3MzhEcGV1Nlh0dUJIczJENnIwK2RaZk50Sy96enM3MUZ0MVhQU2I5UmxPaThRZC9SYVpmZllmRjJ1VXV1WVozelV2RSt6VE5vQ01qMDJTL0hzcms1N3lBTm9CUHk1bmFXS0FZZEFSTjFXL2NmY0U1RC9mejRKcE5zaEtkRVorZEJ1YTN1TElkb2MwWFZuWUJRMEpGbjNaSjNLWjA5NXU4Qkx2cXdlSXI0aUhpOW9tOG5FYnlaVEozek1OaVY4VzBOZzdFWlhkRWFNelp6M3dOb0tqSzVvYk1GSm1OYitQK0FTcDVjMHAwM01GSVVXay9mb2o2MjExWEc0SVFHUU1USHhWR25nMjRlOWZXVmNqOFBFQnRwbEZCaW9hT1U4Zmo5aGtuTUZhNHJOeStoeWhkMTJjWnpTRkJra0VCN290STZZdWcyMGw2MVYzU1lDUG4xTTFZMG5ldXhtNDRraXZpZndvbkQxM2NOcnRQZ2RDYnJqcXQ0T2NWYjZNRXRmdll6em5xNnp4eXBIVUtqMW5lY2dDZXhLa0gvYjBkUUJHZFpKWWUxNFRJK1hlREIzRDg0WFI4NFNMVlRFZEFBT3lFamx4NElEY2Ezc2M5ekZzbitUSmNNM2RTSENWZ2Ewejh1U1FHN3NTSVIvekNmSEhUbWtDY0M1Q2p6ZXdZZmdGNFVrR3ZBM2JlSElqZkE2d2hoOFVSMXVCcjIwUUxJMWdLVXpYKzFydHUzTStsN0FvNTFyeHIyWDRSQ2JvMWFSa2JYeHE2Und0eDNmaEMxWmpyYnNOdDA2bXJUWkpoMHV4eCtFaEg4RklJSUNiOGU2R01rNEpZb3hPeGtITUhVYjRyUnJhY3ZHckJoNlBXakRnbjBUREVqOGhZWVg2Yk1KV3JNWUMzTDE4R0pwREljQlliZC9NNkRPZkkvYlFWcE9ZZ05RU0hZVjd3ZVozMjFkZGErVFJuZWtLcHdqTy9kMU9FWWt2bzREZGhqK0djRTBucnV5dUdjMkZvRFNzckU3OVpxbFdPV2N3dkR1bk9ZNE15dXpnL0dCYXdyaTQ5em1NNGhrbEYvaG5vYlVtSVVzSHdQZ3pDelRTaGlDQmRHLzBFaFFITlRWdVRaQ25MYVBWZXY2dVhRN1p2Nk1lVisyemZJU29oZHJZVnQzSUlLbGFyQktRT2pGN2pkc2UvSkpIL2t4OStuamNkemN0b0tGMVRlU2J3R1Vsc2lBRkFyOG1DT2Jwb1k3dEFjb0VDNlA0bkE2aHVVTXAxUlNaQXUxL1pWTXZHY3k3ZW5yZDlhVk9lbmwrUS9RUWg3dHBIczYzaFk1WWRmczNPZS9aYk1pVW1TZ1dDNEQvTXZSbWppSFg2RDMzNGtyNlZKTVhyWlNMRmdLMWlzaXM3a0RqNDA3T2t3aE9CaXVRSHZDeWVNNW9VTHNhbkhhWWd1ZEZ2QnQzUUo3S2tWdlR0aVMrRmwyczY1ZG0wMDF3UmpQNUhtZHZNdWwzcE1iZzBBNTNXN0FPRHFJWTlvTEVneldMSHZjc2pLNk16QUE4Ym84cldHaVhzVmhQZ2tFYmwwd0dJR2ZldTM5QSt0SDUyMWlEcjVwODJNcGdoRWJwTzFTYmJhUGFnSXVQcEhuTktYY25QLytBdmRaVVpPUTJRNTlGSGFoM0V1MzdieVFWTGNRMEs0SkdOeGZZNnNReVBjNHhYOGJYU1U3TmdCNUI4ZFEyQnpDbDE5WDNjd29QdEVDQjE4K1FVMjNTWmIzUWw4dytzV3VKMjluSGF3VG1DcytvVGtZMzk2WmFuK2VrUmhkcTEzOWF4Z3lmUzN5UDJWTWQ3b3YwVlpsMjUyNlpnc05FcThZdjZmZGFUazN4dk9Gd3EvQkhxWUU3Ri9SbWhTbk85OUdmZmNKbjF4bzl3ZU4rRHl5Qld6czNNdHpwc2lYbm1pUnFaMGsyUmR5dE42L0pJTnQ0UG5uOUtyckgrT3JUS0RDR1ROY1o3RzVEaWMwL0dYenRPYzFGQ3YxK002MkpnWlB3UVo4VHRSeElqUU9NYldyQkFzNllNUGZWL0swWVE3U1o5UTFzejBRNHJVMTNwYk9Jay93WFNFUUsycHJFdHVLeW1wRTBhekxtY2VtaW02TXFIUFFVU3hXODhYcllhdTFOZEdPdTU0ek1vQjJzOEFzVnJIYkdHeGcvL2hJNHdNMlgvekViZ1dLZHVielduSUwvd3c0clhMR0w3L0FzQWFZRlpwaG84YXRNTllEWlhHMlJsRVFQbEJMdXh5MVpXOHlaSHBiWFZ4US9TQmN5cGEvcy8rc2lpMHNFK1Z6cUluaXNrOVN6V0J4YzJnNE9qNDMwSzh0eStudEdKeVc3ejdPdUxUekZsS0NKUGRqZHJHWThqMEVGa3A0VzhnVzdTMHZkalZhN3ZhT0s1WnNsNS9sbHVaYkxWcEhzT3B2c3VGdGRHSGdZdkNkR3ZjWm5aZFRuSXlRNjNJOVR3Sk5ZQWluL1pPNk94bGQwVU5VTVIwYTR1a1ZSdHFHRXdhaHFvZ2J6Z1FENUtEdzRXd3g0SktqVkR3bTVESzAvMWl0Q1RNMWh1ZjhWNHdHckFUcVlEN0U2Z04rMnFrZ0huNnc5bTVOUDJER0huVlBJempMT1Y5R2N3VmF4YzRzWHVqTVZpeUNZWFNXbDEvT202MU9sd3ptTVQzSVkySnRicTRNamlwWWFSczdXN3lTSmN3V2UzZ1NUN2RkeHE2Wnp3SkI1Nzg3MkRlbHoyS1U3cUJvVzVSOXdBWVE4WkFKamJyenZMN0w3cDdITWo5ci9lMVl6YzV0QmtMd0FqZHd4RzVlNEtUZGNmZm5EQlI3MjdOczEra2tnS2xsRnRTb0g1TG9kSGVZUFU0ME9lcjZYbzdkNG9HcUk1UU02emxWeGxaT0FGV1Foajl2cWc2akFzS01BWjVCQ0s4Y3ExV2p4OHJaTGZJdHAvS2lBT09NZER6YW5mcDYwalRnbUFxUW96alV5cWJGS0RjbzQ0VGpyN2dkTlpSQWpzYWg4Q0dhTlJ2MzdQVzMwdmFjS3VBRXlSSzVQZThlSGd2UERYTy80YlI0bm5rV0YwaU1hK05ieTRCMHoxMnRyTm0ybnpza0paaitCM0k1dTk2aFA5aU1kaVl1QThHclUwT0FBVHJxV2ZCcjRjbkcrZmM2UlgrYWZGYmx6QUZ3aERsNjVVU284Zm9zemFsYzFlbkhqNTJjRS92blJ2Q0NrSnJQU2FMZENiMjJ3L01Hd2VnaDdCZFcvc3lGRllxWkpXdmwxcnc2dE43REVTQWFxS2I5cEkrVHR1TzRUa2xqUGlOdGVYVUhFUlM3a3M0RzhNcjl6SVhVVE85VHkrR0V0MkszK1BLNEJZQklldkZ2MElQTGVwZDU2dGlzcGtBRnN4bDJHM2lUNGNWMHlwMUJ5S2MxcmhlYkdCOXIyRUcraUFZd3J0NW5jUDNGYXRnNmNzVFplcTBqMEZiTW1pZHF2L1RKZzVmL2paMCtFWXBkQnliQzNwdS82Y0FGTk1oT3JuQW9POThZOVVGcDU2K3QrKzNoc3gzODN5NTUzTVcvL0JUN2Z2MVRxSjczRGhXYzhadGZZckZyLy9kTDVwOVgvdHZQOFBRT3g1N3JPbTJUKzBhZHNSdFNhdERGdWoxbUFTY2QyK256WDh0SjFyRmdYdS84cGpQTzRIWkduYk9qMmpodmVQMXpYWDd2S0VQOVBlLy83UG11ZjMzQWZ6eGZCQXkxVlJ5bSs4QVQrMnRhYmp2SXltcmhRMXl6aFdUM2hIZ0hlKzh2Si9hbDkwK2IxOUVXREdob1dIL2tlK1V6Z2p3QWRvS1JHbmI5SElqenJDK2ZTanFMYUNOUTlKa1hacVpGQi9zdW85Vm5Ndmo0NEVleHZ0bm9mTFVrc1owT2lnZU54Rm5EUkR5MkIzNjZmS0w2RnVOL09NaHpSb1V6MVZ5YU5OZzdRTy9lVHA1ajllMVhyTGFpbndwcGlFVURuajhOV2pyMGZjMTRDY3YzWGF2Vlg1djA5MXRJQ2E3elVESXdkd3RPUUFnVGtRZC9ZV3FEWFp2WWs5Y1JCbVU3Ui9nSTZjMGFtV3Q1REV6djRUU3p3Q3Fpc3RZYkJ0Ti9Ob0VOY1VYVnZ3V25yR0VmdjM0N0ZOUVJjSjQwOGE1d2RZODYrdXhmOEFYT21GdkxWbmZ3K0ozdDZ6Nk92SE0yY1hWMkpaWUVZTHVhQ25lT0g5aW5GaVZmbHFQYVRIeE9mTE4xSU5qQ2J3SUVQYmYwZnZ4NjUrQjJtQ3Nza29YUnhlcFE0KzFHdzlLUksvdjd2OXVoSXlmYnlzOVpCV2pmb3FNWnJDMndXVDJmVXlhSDFYVk8vLzh6YXVXY0paWnhwZTB0OGJJWXhrazUzUW01TmlUb3pWNGpNN2dBOGU5WDg2L3lvUUFxTXErRGV3TDBKUHNFdUFOYytuR3c5OFVLZUpsdDdRRTNQNE94c3pkK2s0ZXN4TjRobUNGM1l6cmRvc2o4Y1p2eFdGenVYSWJqeDVEMHF6dkdjejhuaUtIdnJUYm1aTFBpYk13Wk1tcXpUZ2Rhb25RQlJ1bm8zZjQ2WGRKdW1uRG5DY1Z0VHF0K3pWREpIZU1haGp5QmRmYW1PRWpRR0M4S2dWbSsyN2JjYWxxQ09VNWVFRGZhOFJQR3doY28rS3IxeklhWVFxVG1DSU8yeHVOSktmSUttNVF4SXUxZEh0amxxVkZHMEl5L0EvS2NNeFZDZGd5RXNSR1dZWTFpQXl0SzQ4UUE1NDJiQzdZTFlOdEo2SW1ZemRQV0tqaW1DMTBkaXJlc0szRGUza25Jd1duWm1OZFl6YXRCeHNGQkdCMTlaUWUzalh6T0ZzV0ZoWFBnbUFIV1J6RGtsT3BxLzQ1VEJWN0lTZ2NlNHpsWE94cnlaL1N1cDJ2QWR4T0FFTjRJYnVGQy9PY2NEUWRjUEwybWF1TnBIcFpRWVFYcVBuWCtzTmd6NldlOURqVEJ2TDRPRUpsUS9XV0I5N1pIUERudTFRbW1BOUtQNlFBQ2R0WURhY0pwclFlcGdFSmc5QUtJSlRzWFpNOEhON2xnSlU5ZTZEWTR5NVkrYkxUSFVEUlBXektHSEhqR3gzSnBRZloyd0Jpa0pqdEVibjNPemJiSDdBN2I0SlBSRmRUVzdybGx6WnFKdzVGc3REdmI5OERaUEJPdzVXankzOU5WMkRVNzNMZW54bGh3NGlHc096bnpGdkF5RUIzbnpOZ0RjM3VjWEMvL01ndmJ3cVl5L3ZUVHJyK1pzNXovL3ExLy9jNFptbW5hMElIWXcrRjRTOVNRem5sc0ZqSlZxRGtneTU0OUozNGoxL0VjMVZOdFFSdW5yZ1loVHNueDBKYmNJQWpiM3JMVkZwN2Y4ZXpEYWNUMWdqMEQ4bkowSU1ZcGJiSkw1VDBaaVBramR1Q2svKzdyRzNRS0NhczlOb2Nwc0pvNVFKNnFjMlphc01FNnozTjQwV3RJTldHN25qNGQ2M3BtVE5zMGRRcElteFgvQUc4ZStZa1hGc3l3OFRZMWZsc045ajk4cG1LZmZCd0RtcldPcTBxMVNxOGZFSmVlRnhLQVpRNnZoWXlmQjl2QkFaYjcxb0tWQWw4emNPdEpUWFo1UEU0WnhvUlg2eUtBMG0xRDBXMHlkNmJTaVNMWFgyVFlzMjRNVW5pNG5tTWg0NWxZZ3BOMHJ2Q0p1K1Z3cllWN21WYm9POW9SOFppdjRZUHFxQmN3Tjl0NG5qLy82YS8vRFFhM21lc2M5MlVtNk1oTHZJNjRIR0ZoMWY0cFNQSGZ2aTU5M2JxcWZCRC9hMEdEVll0V21zQUVlcnlLM1NnQTh3cTczc1hJMkZxZUJ3QnlIQTcvZENZemJNMDVkbllreE5xQ25pT1krUmVkUDVLaENJVzROZHJzV0xJWWY4azFrM05qMlYvRGljTW12QS9XMEkyS25LbXJ3VnJuNHJGY0ZsSTRJZVdrMWEvL05xL3VtWGIyWWV1NFVZY3prQW9HNGxRVXlQUDBFS1VCV2hTTTQ4UHlKZkMrblV4Z0JiZlJRS2VncmVuOFM2T1pnODEzcUxlVkx2czljNnN0MDlKYWFFL0RtOUY5UXdZWE1LTURUQ1FRY0xKdUlIS2hoUG11VGxWL25DTnVCMkg5bkwvRXowaEwwam5BemtIb0EvNTlnNGJnSW13aE8zWG5BdXBvNW4wL1IxNkJOWndVTmswR2RTbmU2N3dMUkpBMTNBWnJzRWlHcnozaVlJQXNjNGNjODNPbUwvczlTbUczcG1jdW5CcG0yTFZJQmF2bHFaaUlQSTZTSGZIY1NLZytUc3ltclZHSHVZam53b0FCY1l6ZExOU2dUVXc4cmcvbytTNEw4WjdIdHVuaTNOeHNPKzNub0JnYjd5d1pibmZCVEJlanAvQitUS2FuQVZUcmhMTjFFL0djM2dPZ3ZIZkZjSDlHSEVCaVdGV0xXSVlENDdkRE1MbjE2N2xOc0U3ZUJGMnp2QitIZXRjS0JuRzBlUDg4eEk3bk5HY1RuMmRZWi9mbnlDdVB3b0hTL3M3SWFyZ293K1hoSEp5RXE3SC8rM01NdHVld05tZTA0QzdSWUtSb2ZSVWJ3U1dkVStRWXpISnlMYTloeUF6QkJlMTRFa091bDNQSFc3V1h3bmx0ck84SHRrYWVuWWtsbFB0ekdpT2dFUTd4MDd4UExPM1FobmVkempsWTUwVDdiNFBtT3g2bGdmLzliMzdVb0hZOThZVHFKSlhpYVdmQlRuZFcxTUM0VSs2c25KYm1lOUFkZ3Y3OEFOV050Sm5nRzhsTUNWemRtd0h0SEFFenpsR1JxNkRZb0RHbkREZjcweE13cVlLUW5EWDdIQ0x0eU5LN2ZkWFRPejA1OWN4M1FmcnJjRHlEZHJMQUxJRDdEbEQ1S3J1bXhKeUlpWlRIczE4OFpRL2s3YUc0dytIK3dTRkw4VDdCbHBvZHZnZUtWNTVQZHZCclRxcXpXMHhvNFBTNjRjUkZEMGV0UUtLNlBDUFM4U3hkc3V5cjhrOUFoVlUvejMwYUFUeWYwN3A0YkVudjdUcUpGOUNsZzJhVmllaWg1WkM5UitvdkI3REJBb2RRN0hBby9WUWEyMEpsMVE4bTBIR0pTTjFiQUtOcm56TW5vR0JCL1p1Ty9Cb3ZiQnNEYWsyZFo1M1lsb3ZpUEFHaTFQM0JkZWJWb2pPZXc0YkphNWZwL2pySzQwUUtYTXp6TEQzZEVna0oydTNhVC9ZemRyUGxZR2d3RkovSmY1MTNXcitUKzIrWGRZSDNPZHJIQks1UlRNdTFxb25pWUR0TFlWMkFOcERJSTJKL0JBeGt6RlliY3dkbDJpQ1lFY2hUc1c4OThmQW93SGxLWmw2bkhqaFFFMlZ6aXA1OXlSQ2RmV3V0djJqRjdqNk5uTk9CZFpDdmpvWHN2NGtoeTlFUDZWK1Z3b2cvTUJiejI2b0htb0phV2NFRG5XMTVsWDBYNXp4N0NvTVRiMDZ4Mll1dUJ5VVZNMncweFZOdVlyQUZyVnJwNDZrdGtBZnJHZi8yaWtlSGpnWmQ5emxDcHRXRDZJc1RLb0taaXZ2YnhUa1ljWGhnQVlUVUh1dlg4ZGU1ZUE0Wmh0VVUrdHhXaUdEQjM4dVdCQ2R3Mld0NzZ2L3pMMGJDNHRaUWYyWHAzNS8zenZpUCtEcGtPR0liWXJubFpmMTBIcS9MZzJYUVZDZlFUSDRZeEZxc1Q0Mi9uaFljMWZyZlhmcmtyWUtEMDY4bCtMWnRBUmlNT0ZyZGhqbVl4NDk1Mk5BNTZRNi9GZlJYNW91dHpFUHpEVnhDQVlQdE9pYkFMMzJDZ1NlRGpZNmJEeDRQZ0dMQ2NzN1p3STdBZkR6cEdMVjUwMWgydUtmYndmYnY4YTNnVzZoV0hGYzk3V2FtZE9YeVJWeGN6UzNvZjdjVkVjT2h3Q2ExQzQ3S2s1QTlabU1iZ0JxZVZYc0x1a3l3T0hJWExDbjdpNmJjUHFjdEd0TXNRVXAwVGlscUo2ZDVvMzJtSXg4blY1YUQ1aEgrYUlOem1QUDZwU29GYXNIMHROT2YwMkQ5bHFOM25kRWI0enJUbWMyc3RUT1l6VURmNDRtb3poN3BKeTN6b212ak50MWpxV0p4aXFPbE0veVk4MU1xSy9VQXBSMm1XVytQdXdSSEZEdGNBQmt0Z2ZkZTV5SzNQL05xZVVpWThNblF6TlNkQzJTZStINHdBTHVlU1BHTXU4YmtNYjdaREJlT3VucWVGTXpRTXQxNENtRytDd2RXSCtjQ3ZtVTFzQTk0Mm41YnozNTF2TUE2WTF3ODBleHhMay8rZFZNOGY4N1Z3c0J0VDY0QmRGMVdUTnVRNy9HQXJMT1QvZmM1SE9aOHRCNjNQSm9ub0p3SVRzQzdyNG9yaTU1NitwMVJxeDdNbU9EOVZyRkFRSjBYamJleWlMLzhUUzA5Ly91RkJNZm1hUXBPZFRRRVpxT0RTZnVURVR4RFVDOU1qR2JaZVFmSXlHMEZuUU9tSEhhMFR6cXQ1Tjg1UHRaZEZhZXMyMEg0bi9wLzZVS2RvL0NkdlAzZks4M2ZadkFXUkhMYUJUM2w3VTM0eFZvZFRGQTgzdkp6T1BuNzRnKzNaL253bzlwS2VJaGQzazZVQ3c1OXkwaVEyNDM4VktNcjAyTlZzSDhuVHZTZTA3V2hDajFZRGNvbnJuaHFUWkRrVTNuVG5aNTRzeUxvd0x6UElRT2oyVzZKRUU4bktOcDhiM0d5SWJieU9Ea1poZ0RvU0pjTkx0YVBXVG0yaHZQaGtzZmtnYUVmaDhNSEo1YS9uZ3I2Mmd6ZG5PMnBMM0w2cVJXWW5yV0J2RUhYMzlmanc4VHhqL044K1Jtbk8rQ0lkYVpXN0s3b3NNOXUvUTRPK3daMk8zcjhPY1Z5ZUFCMmFEcE00RG9oRkFDNStHVTYyZ0ZnNWJBZ2c5UFJVOEtEeHhFNS9NekRUNnl0aE94Nzh0M3lhRGxJaEFLUzhQMC8wb0tjTjFOaWdHWkQxMkU2cmNhSjJxK05EaW44OHRIMmJpZlU4UFdjS1N1dGNlWEpRdWRRN3N0Y2RRd1oxbStlZHppdVl0M0NRanZSRGV1Yks1SXh6eE9UdzMyV09UQWxveDhrMGV1SUtET28xck1Ta1dYZFRJRkkyS2xSREpuK0NpdzFUTTZlM3RGRGZLM3g3UmFFYnVNTDJHSGtkVHYwc1RuWjY4OWswN25QSVhNZTBwREZhR3hyR3lmVmhLa2YyOWxtRW1qUFMweW1mOHpqLzg0N0F1cjlacks4QzFPQmVTMmUrUHhyZ2JRbXBKNGhua1hHNlFHTjFWbmlGaVpoNHExbWZteDF4S2ZiakhRNldLWm52enpid1ZPNGpUZWVmQjJ2M2U5d3N1YU9uclJvekJTVnc1ejVUQTdBaHZyMWc5YnZEeVhEdFhtMldKYVlwdGtTQW96bU90SGZFNmxONFFHbHpwRkdOcFFBOHl3TEhSNjEzaDJpM0o1cXM0SDlXTTZybFdBODV0M1J5eGgyUUdNTW5qMm1EeDNRVUIyY1d5eWVsdVp0TEhnemNlRXVPNURXSkNPc3RsMW53aXcyMi9PL3krZTVndmFOVEpkbHRHTTVrY1BuOUkwNkNPSjJCb09EWWhUTlpGdnJPUXNsTFk5eWFpZjV4MjRhWGJIeHFXbmVUdnJPWkp3elJ0WFk3V25BVmt4Z0V1SDEvdGpkalZMakE2dERGSk1CYnE5L2gyTWhEcEhTWEVIZWx0bjltTTVSV3g3QXhMN1pHOHU3MnJpaHF6WWN1YkgybDlVZXJ6bnpjelM5REdlbk03YXBXZk53Q2xkVzV6WGY5M1I4WTVGd21kbkdHNk9BbnZzVHo3SGZGK1ROZ2pWTFM1cjhJdU81N3p3OGRDSmo2UlpiWUNWRkVoMDYrUTAzalgzVElYZ3YrWkJkcDlhd3Z4N2VpZzJ3RU1hS0pydzZUMlgwZEZwMyttWHJZVDh1Q01IQ3VaZmxvUjNZeDlJTlpUM3VnTW5UeTAxWVo5Nzk0TW51NVpFWUNJQnpSb1NrRm0rSm9MZkYzR2RtMWhsbzdSQ3d1czhCMzFhN2xQWmRBUy9aN00wS1R0d2Q5em5zT1ZuVHREekJRalY5ekN1YkVuUzRQUGFlYjJlSHdsYjcxN09uRmZlK0w5dWpIVCtGM21WUDMrck9CdkRjUC90WHduTU9WUExRR0E5eHFpYmcyRi9KWnZmSWVnK3R3YXpwZjY1ekxDckk1ZnIvQXBZVHFBOGFKZXJZQUFBQmcybERRMUJKUTBNZ2NISnZabWxzWlFBQWVKeDlrVDFJdzBBY3hWOVRwYUlWQlR1SU9HU29UaFpFUlJ5MUNrV29FR3FGVmgxTUx2MkNKZzFKaW91ajRGcHc4R094NnVEaXJLdURxeUFJZm9BNE9Ub3B1a2lKLzBzS0xXSThPTzdIdTN1UHUzZUFVQzh6emVvWUJ6VGRObE9KdUpqSnJvcWhWNFFnb0I4OUNNak1NdVlrS1FuZjhYV1BBRi92WWp6TC85eWZvMWZOV1F3SWlNU3p6REJ0NGczaTZVM2I0THhQSEdGRldTVStKeDR6NllMRWoxeFhQSDdqWEhCWjRKa1JNNTJhSjQ0UWk0VTJWdHFZRlUyTmVJbzRxbW82NVFzWmoxWE9XNXkxY3BVMTc4bGZHTTdwSzh0Y3B6bU1CQmF4QkFraUZGUlJRaGsyWXJUcXBGaEkwWDdjeHovaytpVnlLZVFxZ1pGakFSVm9rRjAvK0IvODd0YktUMDU0U2VFNDBQbmlPQjhqUUdnWGFOUWM1L3ZZY1JvblFQQVp1TkpiL2tvZG1Qa2t2ZGJTb2tkQTN6WndjZDNTbEQzZ2NnY1lmREprVTNhbElFMGhud2ZleitpYnNzREFMZEM5NXZYVzNNZnBBNUNtcnBJM3dNRWhNRnFnN0hXZmQzZTE5L2J2bVdaL1A4YTdjbUx3MFh4dkFBQUFCbUpMUjBRQS93RC9BUCtndmFlVEFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFBQjNSSlRVVUg1QWNDRUNRU1IxL1VNUUFBSUFCSlJFRlVlTnJzWFdkNEZGWGJ2cy9NMW5UU0V3SkpxRUtvU3ErQ1NGRXNLS0orb29DZ2lJclN1d2d2dlNnZFFTa1dSSDFGUklvRkMvS0NnQ0NDUWlDMGtKQzJ1OGx1eXZhZGNyNGZPek5zR29ZU2l1eHpYWE50c2p1N00zUG1uSHVlZWorRVVvcTdWZjc4ODArTUdERUNmLy85TjhMRHc5R3paMC9FeHNiaXE2Kyt3dG16WndFQUd6ZHV4T3paczVHYm00dEhIMzBVTE1zaUpDUUVhOWFzQVFEczNic1hJMGVPeE9uVHA1R1ltSWhHalJyaHQ5OSt3OWl4WTJHejJiQjU4MllVRmhiaTBVY2ZoZHZ0aHNQaHdOR2pSMkV5bVFBQW9hR2hTRTVPaGlpSzRIa2VnaUFvcjRJZ1FCUkYzNytKS0lydzNTaWw4aXVobEVMZUFKQ3lyd0JBS1NYUzVTdXZaZDRqNTg2ZGk0bUlpSWpUYXJVeExNdkdNQXdUeFRCTUJDRWtIRUFOQUNHRWtCQUFnUUFDQU9nQmFLU05CY0JJdnljQ0VBQjRwTTBKd0FIQVRpa3RBVkJDS1MyaWxGb29wV1pCRUFvNGpqTzZYQzVUWGw1ZVh2UG16VTNTNzFDZnJkei9oSkN5bjhudkFRQWxoSlI3OWRrb3d6QWdoSUJobUxJYlpWa1dMTXVDWVJqSWY2dFVLdVZWM3RScU5kUnFOVFFhRFRRYURiUmFMYlJhTGZSNlBmUjZQUUlEQXhFVUZJVGc0R0NFaFlXaFJvMGFpSXlNUkhSME5PTGo0M0g0OEdIVXJYOFAvSEpqaE56TndIWTk0dkY0a0p1YkM0UEJnSUtDQWxnc0ZoUVZGYUdrcEFRMm13MTJ1eDBPaHdNdWx3c3Vsd3R1dHhzZWp3Y2Vqd2NjeDRIak9QQThYMnFUQWN4M0UwV1J5QUJYQnN4S0FabjhmeGtBS3dWWXZ2OXYyN2F0Z1Y2dnI4ZXliRjJHWWVvQVNDS0VKQUpJQktDN1RZYlpCZUFTcFRTVFVwb2hpdUpGanVQU3JWYnJoUUVEQnB5WHdjMEgyQ29EdkhJQVNBaWgwbmhSRUhKNVlBZ3BCWHkrSU9jTGVtWEJ6aGYwZk1GT3A5ZERwOVVpTkRRVU1URXhDc0NGaElRZ0xDd000ZUhoaUl5TVJFWkdCdHEyN3dTMVd1MWZYSDVndTNZWk9YSWtWcTVjZVZ1ZFUzUjB0RmZOcVFETVpLMU1CamI1M3NtYW1pOTQrZjYvYi8vQjZKalkyS1pxdGJvcHd6QXBoSkFVQUkwQWFPL3dXK2dHY0ZvVXhWT0NJSnh5dVp5cDZSZlNVeC9wMjZkQTBoUjlRVTBzQTRDZ2xDci9YMEdqbzRSaHdCQUdERVBBTURLWU1aUmgyQXBCalZXeFVLblVVS3RVVUtuVjBLalZFaGdTcURVYTFFcElRRUJBQUFJREF4RWNISXlRa0JEVXFGRURPVGs1YU5xc0pRUkJRRXhNakIrWi9NQjI4OFJvTkNJM054Y21rd2tGQlFVb0xDeEVjWEV4ckZZcmJEWWJIQTRIbkU2bm9xV1YxZEQrUVVzanN0bFpCdEI4TmJOUzJsaFpVSHU0N3lQczRuZVd0TmJwZEswWWhybVBFSEl2Z0FaMzJXMDZKNHJpbjdrNVdjYzBHdldmWThlTStYUHYzcjJpRDlpSmxRQ2VaTVlTU2dnb1FFQklaU0RIZ0dFWnNBd0RobUZwS1lCVHNWQ3hsN1UybFd5aXF0VVFSUkhCd1VHSWlJaUFYcTlIUUVDQVlwNGFqVWJVYjNBUGFrZ2FYR3hNTENLam92eUx6ZzlzMVNmRnhjWEl5Y21Cd1dCQWZuNStoV2FuMCttRTArbUUyKzFXekU2TzQrRHhlTUR6ZkNsUTgvR2pFVjgvV2dXYUdhbkFYNlpvWm1QSGptVWZlK3p4VHVHUlVlMkRnb0k3RUVMYUF3ankzekhBYnJmQldsS01WdmZkYTZPVUh1SjUvcERWYWozODZxdXZIdnJpaXk5NFFraFpvQk1yTW0zTGFIRzBsRitPVWNBTkxNdUFZYjBncDJKWnNMN2dKZ0Vjd3pCZ2lGY3pMK3QvTTV2TnFGVTdDYUdob1Y0VE5TSUMwZEhSaUl1TFEzQndpUCtHK29IdHhnbkhjY2pLeWlxbHBSVVZGU2xhV2xYOGFHVzFORms3OHcwT3lKcVpiR2I2YUdTK3ZqSkNLV1VzRmt2am9LQ2crMW1XN1FLUXJrZU9IQW1OVDZqdHYxa1ZTRzdPSmJScDNicmNjK3JRNzRmM1JVWEg3aThveU4vZnZtM3JOQW5VS3RMcXhFcEE3cklteHpDVUlUNGFITXVDbGJXNGN0cWJDcUlnSWpJeVFna3c2SFE2NkhRNkZCVVZJUzZ1SmdLREFoRWNISUxRMEZCRmU0dUppVVZ3VUJDeXN6Smh0OXNxdmQ3QXdDQWtKZGRGU0dqb0xSdnprdUppWkZ5OGNNdlBVM1czVFhaS0tRd0dBMHdtRTNoQmdNMXFyWEEvaThVQ2s4bFVTanV6MisyS2R1WUxaUDhBWWhWR05XV0h2MlQvZ1BqNHg4cUNtY1BoNktiUmFIb3dETk1EUUZQZjgzUTZIWDRFcTBTY2pnckhKdFR0Y3ZiVmFyVjlhOVpNd0tYc3ZKTTh6LzlpczlsK2JaclNhRDhoRUh5QmpsSmFUcU9UL0hNQUlaU0lJa1JDd0lnTUJNSlFoaEhBc2d4aEdCWXN6MUtlNWFGU1NSb2NwNElnOExEWnROQm9OSXAyNzNLNVVGSlNBcTFPRDZmTHEvazdITjY1WnJOYVVWSlNnaUpMQVFJREF4RVdGblpGTFRYajRnVTBhM0h2TFJ2emkrbm40WERZLzFHYnJ1N3pWTjF0b0hiczJER0FNQWdNQ2taZ1lCQmlZa3Z2NDNBNGtKT1REYmVIQjhlTDRBUVJna2doVWlpdkZLVDBSbEZtbzZBVUVDbUZLRklpS3BGTDcxYld4S1NVRWlxWm1jUWJybU9jVG1jZmpVYlRoeERTQjBETmE3M21IM2YvZ0kwYjFzTmtNaUkrUGg0ZmIvb001ODZkeGRBaGc1UjlKazJaaG9jZWV2aHV4YjhtS3BXcVNWaFkyQnRaT1hrNWdpRDhZTGZiZjBwcDFPQW55VndWS2dVNVNpa0ZvZDRBS3dVaElrU1JRQkI4QUk1bHdmTXNXQlZQVmJ3S29pakE0WENBNHppbzFXckZYV0czMjZFcExsYUFUblp0T0J4MjJPdzJGSmlNQ0EwTmhjMW1RMlJrSkhRNlhhV2djU3ZsbjBEdFpwM25YUVZzQm9NQklBeWlZK0lxTmwxeWM1R1htd3RUdmdsbXN4bEZoWVdLSDgzaHNNTXBtNTF1Tnp4dU56eWNCNXhIMHRaNEh4OGFMMEFRZU1uY0ZDR0tzc2xKQ2FVaUtBVUJLTGxzY25yLy8rMjNBOTBURTJzL0doOGYzL2Q2d016M2VoYk1uNHVacythZ2RlczJLQ2twQVFEVXExY2ZQLzc4S3dEZ3BhR0RxMjI4TjZ4Zmg4Y2U3NGVJaUloeTU3VnN5VHM0Y2VKdmFEUWE5SGl3RjBhOCtocFlsZ1VBWkdkblk4V3lKVGh4OGdTMFdpMTY5dXlGbDRlUFVENnZEcEdPV2ZQRXlSTXZhclhhRjZkTW5aWXpkTmpMMzludDl1K2FOV20wWHdJNG9ZelpXbGFMazRJUElrU1JnU2dTeWdnQ0JJWUZLekJFWUhtSW9raWRUbWM1WUhNNEhGQ3JOVjVYaGpTLzNHNDNuRTRYSEE0bkNpMEZFdEE1WUxmYkVSRVJnY2pJU0w5YTdnYzJ3R1RLUjJCUWNMbjNiVFlic3JPenZEbHArZm13RkZwUVhDVDcwUzVITzkwdUY5d2VOenh1anhmVU9BNDh4NEZUQUkwSEx3Y0VGRkFUSlRDVEUyaTlJQ2FibWFkT24yMFNFQmpZajJHWXgrMTJXK1A4L0h6RXg4ZmZrT3M5azNZYWtaR1I2Tml4RXdBb0M0RVFBcTFXcS94ZFhmTGh4dlhvM0tWTE9XQ2I4ZlkwTkduU0ZQK1pQUmZGUlVVWU0vcE4xRXlvaVg3OW5vUW9pcGcwWVJ5NmRYOEFzK2JNZzhsb3hMaXhveEFWRlkzK1R3Mm9sdk9zNUpnMW82S2loL1YvYXNDd3JCekQ2YzRkMiszNHoreTUzNzR3OFA5T0FSQWs3VTBneEt1WVg5YmtLS1dVVUVJRVNpa2hvaWhTUWtRSUFrTloxdXVPY0xsY1VLbFVWQTRxcWRWcXVGd3VxTlIyeWFYaDlkTzZQUjdKWEhXaHVLaFEwZVpjTGhjY0RnY2NEZ2Vpb3FLZzErdXY2YnEvMnZJbDNsdTlFai85c2hjQThNckx3MkN4V0VxNVl5Wk5ub0llRC9ZRUFKdytmUXE3ZHU1QTgrWXQ4R0RQWHRXK1hoZk1uNHR2ZCsxVTV1anJJOTlFLzZjR0lEMDlIVXZlWFl5UzRpSUVoNFJpNHFUSnFGWEw2MmMrZU9BM3JGbXordTRDTmw3Z0VSZ1lWRVo3eUVGdVRpNk1SaVBNWm04S2gxZExzMTcycDhuUlRvL2tVL1BJL2pRdnFBazhENTczRFFnSXZta2FwSFJBQU14SEgzK2k2OXlsNjFNc3kvWW5oUFR5ZGFyYVNvcXUrenFQSHorR0dkT25LWnJBNDQ5NnpjeCtUL1RIb01GRHF2UWJodzRld01vVnkyRXc1Q0V4TVFsanhvNUhTcE1teXVkN2Y5MkREUnZXSWQ5a1FreHNMSVlQSDRGMjdUc0FBRWErL2lxeUxtVUNBRWEvK1FaVUtoWUpDYld3Y3ZVYWlLS0lybDI3NGVHK2ZhSFZhaEVkRTROV3JWdmo3Smt6eW1LcUVSNk81d1lPaEVhalFVS3RXdWpZcVRQUzBrNVgyN3lvd2pFYkVVSWF4Y2JHVHJpVW5iZmI2WFJzbnpIOXJSMmZmYmJaQ1lDWE5EY1o3QlNRazMxeGhGQlE2alZUS2FYVTdYYUQ1M2tpQlJVb3ovTnd1OTFnV1JWNE5RK092K3l6NWFSZ2xMV2tSQWxNZVR5ZVVnQVhHUmxab2ZZbWlpSVloaW4zTndEazVlWGgyMTA3UysyLzV2MTF5dDl1bHd0REJyK0FqcDA2QXdCV3IxcUo5UFFMY05qdHFGZXYvdFhaK2syYUtJbnNWenJIc3Y5YnpHYTh0K1lETkU1SktmV2RXZjk1RzZOR2pVSHpGaTJ4YStjT0xGKzJGSXNXdnd1WHk0bUZDK1poNWVxMVlPNG1ZUE1ORkRpZFRwdzVjd1puejU3RnhZdnB5TTdPUWw1ZUh2THpUUXJBRlJjWHd5cVpvamE3SFE2N0EwNkgweWRYelEyMzIwM2NiZy94QmhFODRIbU9TRGxwUkJSRlJoUkZobExLVWtyWjFOTm5tMmRjeXA3ZHJmc0RKMVFxMVFlK29PYXJQVjZ2dEdqUkV0dTI3OEtibzhhZ1pzMEViTnUrQzl1Mjc2b3lxRjA0Zng1dlRadUNFYSs5amwzZjdjWlRBNTdHbU5GdndHUTBBZ0F5TXpNd2U5Wk1USnc0QlR1Ly9RR1BQUElZcGs2ZERJZmtyRit4Y2pXMmJkOEZBRml5YkRtMmJkK0ZsYXU5SldnTXcrQzVnYzhqTEt5RzE5bDhNUjBIZnZzTmJkdTJVN1RLRlN0WFE2ZlRLeFA5K0xGamFOYXNlYlhOaTZzNUppR2taMEJBNE1vRmk5N1pYNzlCZ3lscjMxL1hqRktxaFRmaFdRTkFEVkFWcFZRbDMzZDVIa2h6Z25BY1J6eVNOdVp5dVlqTDVTSXlXRG1kVGpnZFRqanNEdGpzZHRoc05saWx3SlhOWmtOeGNURUtDd3RoTnB0aE1wbVFsNWVIckt3c1hMcDBDVzYzV3puUEkwY09ZK3JraWVBNERoYUxCUzhOSFZKS0cxdTBjRDVHdnZGbXBXUHkzWGZmb2xQbkxvbzJPT3lsbDdING5TV29VN2Z1Vlk5dlNFZ0lOQnBOaFordFgvYytObis2Q1FCdzRzVGZlUE9OMThzOWNNcjZ5Ujk5N0hFMGI5RVNBSERQUFkxZ2xnQXpMeThQWVdFMVVMTm16YnN2S3VvMVNZM0l6c3FXbmlMNUtDeTA0TUtGQzlqOXcvZm8xdTBCdUZ4T09GMnV5NmFucEtWbFptWWdyRVlORUVJZzhEemhlYStHNXZHNElRZ0NZVlVxOEJ4SFpKSE56ZDY5Ky9SWis4SDZaL2Y5Yis5VEgyN2NBSTdqVUxkZVBVeWFQRVZaVExlVDdOeTVIVjN2NzZhWXNMMzdQSVR2dnR1RjNidC93TURuWDBCRVJDUTJiUHdZdFdwNzFmOUhIbjBNUzVlOGc2eXNTMmpZc0dyMWpxa25UMkwwcUpGd3VWeTR2MXQzZE9sNmY0WDdyWGx2RmZRQkFYam80YjQzN2ZxcmNreENTSzJJOEloUlFjSEJvekt6Y3JlV2xCUi8xVFNsMFM4QTRhWElxaUJwYllLdkJnZUE4anhQR1lhUjh4ZXBsTmRJR0lZQkw2Z29ML2dtY1h2OXQwNkhvMVErcEt6UmVSUnoxV3VtUmtsSnZhMWF0Y2F2ZTM3QnpCblRrWk9UalNlZmZBcmhFa2hzLzJZYjZ0YXRoMGFOVXlvMXpiZCs5U1VXTG41WGVhOHlZTHBlZWZiL0JtTDBxRGRnTmhkZzMvLytoMWx6NWlxZm1TMW1USjgyQldhTEdXM2F0TVhvTWVPZzFXclJyOStUeWo1ZmZQNFpldmJ1RFFDSWpZMkR4V0pHZW5yNjNhV3hpYUtJOVBRTE9IUG1qS1NsWFVKZVhoNU1KaFBPcEtXQjUzbGN5cnFrVkJMSWVXcE9oeE5PbHhPVVVuamNIdUp4dTB0cGFGTGFCcUdpeUJCQ0dFb3AwKytKSjFVWExsNGFQRzc4aEIrN2RMMS9xOWxzZm1yRjhtVjRkK2t5ZlBMcFoxQ3IxTmo2MVZlM2JaQWxMcTYwbjY5MjdTUVlESGtBZ0tDZ0lCdzkrZ2VHdnp3VXp6MzdOQWEvTUZBWjM2cEtTcE1tMlAzVEhueng1VmJrNWVWaHcvcDE1ZmI1K0tNUDhmdnZoekIzN255b1ZEZm5HVnpWWTFKS1lTbTBJQ2d3Q0F6RFBCRVdWdVBUUzlsNVc5TE9ubisyZWZNV2VrcXBEcGVKQVh3MU9JWlN5Z2lDd1BBOFQzaWVKeHpIRVo3bjVjQUJjYnZjeE9WeWVWTS9IRTRsVjFJT0h2QThyMVFzaElhR1FxL1h3MlF5SVRjM0YxbFpXVWhQdndCS0tZWVBINEUvai80QnJVYXJnTFRSYU1DTzdkOWcyTENYS3IyMjMvYnZRMUp5SGNUR3hsM1hXUGJ1M1J2OSsvZEhmSHc4T25Ub2dQNzkrNk54NDhhbDlna0tDc0lycjd5S0wvLzdCYnAxNzE3cXdUaCsvRVM4OCs1U2JQcjBjNWpOWm55OWRVdXA3Mjc1OHI4b01CZmdxYWVlQmdEbzlYcE1uaklOOCtmTnZuczB0cUtpSXB3L2Z4NnNTZ3RUdmhFV3N6Yy96V3IxbXBwWldaY1FHeGVIM053Y3hNVEVLRTlDUTE0ZU9JNERJUVNVVXNKeEhnQUVITWNSUWVDQjBqV2FaUE5uWHdRdldqaC84SktseXdjUlFwb2VQSGdBOCtZdkJCVkZ2REZxdEdLQ05iem5IdVRsNWQ2V1l4VVRFd05EWGw2cDkzSnlzdEd5cFRmdmFOLy85dUxUVFo5Z3lkTGxTS2hWQ3dEUXBWUDdpclNhY21EbmRybnczWGZmb2srZmg2RFY2UkFYRjRjZVBSN0UvdjM3eWszYUgzZi9nR1VyVnQyMGhOT3JPZWFSSTRlaFVhdlJvR0ZEMyt2dEdCZ1kySEg3em05ZmRydmRuMzM5OVZmL25UQnViQWtoUkpCOGNiSVdwL2ppQkVHZ2xGSXFpaUk0am9NZ2lKUmxSUWlpUUFSQm9JSktnQ0I0UWM4M0o5SnV0ME9qMFVDbjB5bmxXYkwvN2Z5NTh5aklMOENhTmFzdzhQbEJPSHNtRFF2bXo4V2t5Vk94YzhjT1dHMVd2REw4SllCNHlSeUdESG9lYTlaK0FLMlVRdkxGNTUvaDVWZEdYUGQ0ZnYvOTl3Q0FEaDA2SUNNakE3bTU1ZWY3aFFzWE1IL2VIUHhuMWh4czNMQU90Uk9UOFBERGZTRUlBbHEwdkZjeGhYdjI3SVhEdi8rdWZPL1hQYi9neHg5L3dMdExscGVLbHJkcjN3SHQybmU0T3pTMjdPeHNuRHg1RWxsWldjakt1b1M4M0R5WVRKZURCVWFEQVlJZ0lpZ3dDRVdGaFlvZnJTQS9INElnSUNRa2xHaTFPa0lwaFNBSWhCZDRJZ2c4WVNRQndEejVaUC93aTVuWll6dDE3bklvSmpaMmNkcnBVMDJ6c2k0QkFKS1NraEVWSFkzT25ic29pM3ZIam0vUW84ZUR0eTZRSXBrNkFFQWx5aVFaaEI3dSt3ajI3dDJEdzRkL0I4L3orT1dYbjVGNjhnUjY5dks2Qk0xbU13Z0JHSlpGY1hHUjRpT2hZdWtxbHJqNGVCdzZlQkFjeHlGZm9tblNhTFg0NU9PUDhQbm5tOEZ4SElxS0NyRnYzLy9RckZtenk2YndqdTNZOXZWV0xGMitVakdmcXQzOHJ1SXgzVzQzZmo5MEVQUG56Y0h3VjE1RllHQmdSWURlUktmVHpYbjIyZWUrUDM4aFk4VHE5OVpHU1JxY2xsS3FvWlNxZlRVNHlRL0xlTWtQZU1MeEhQRUdEZHpFN1hZVGw4c05INTljS2UzTmJyZkRLaVh4eXI2M3JLeExPSFRvQU9yVXFZdHUzUi9BdE9rem9ORm9ZYkZZTUhUWVMvajhpeTNZK05FbldMTjJIVFFhRFRaKzlJa0NhcWRQbllMYjQ2bFduNmF2SFAzakNDWk5ub3I3dTNYSHUwdFg0RlRxU1ZCS1VWeGNqQmNHL3ArU29uVDgrREVrSlNjcmYzLzA0VWJNWDdDb3d2RUgvdVhwSHBSU25EMTdGcG1abVFyRkVLdFNvNlM0QkZhYkZRNjdIUTZuRTlrNTJRZ0kwRXZPVjRMaTRtSVFoc0RsY2hPMVdnVVA1NEVvQ2dCQWZPaUJHQURraHg5L0NibDBLWFBZZ2YzN2hqRU1VeGNBT25ic2pJTUhEeUl3TUJDZE8zY3RadzdQbVRNTER6elFvMUlmUjNWTDJRVGRCZlBuWXNIOHVYaXdaeSs4TlgwRzZ0ZHZnTGRuenNKN3ExZkNrSmVIMm9tSldMajRYY1JJMmN4OUhub1lKMCtld05BaEw0QmxWWGpzOFg2b1g3OEJMSVdXVXNjWk0yWWNGaTlhNkgwUzE2Nk5kUnMrZ2thandZS0ZpN0Z5eFRKODhmbG5VS3ZWNkhwL053d2EvQ0lBUUJBRUxGcm9OUU9mZmJwL2FUTngwK2JyTm84cWtxb2VjK1JycjRJUUlERXhDV1BIVFZCOGtGZVF1bHFkYmtiZlJ4NTlvY2VEUFQvK1p0dlhuNDBiTzdwWTF0NGsvNXVpeFhsVFE0aElLQVgxVnFoUVFSUWhpZ0xoZVI0c3kxSzVjcVVpaWl2NVlXVXc1S0ZHalhBMGFOQVFaOCtlZ2NQaHdKaXg0NnFVMnZQNVo1L2lxUnVjVm5QZ3dJRktQeHZ3OURQSzN4RVJFUmcvWVJJQUlEdzhIQzhPRzRiWFh4ME9Tb0hrT25YUTd3bXZiMjMrdkRsd3U5MFk1Uk5vbVByVzIyalFvQ0VLQ3kxNGVkalFmMit0cU5WcXhmbno1M0hwMG1VLzJsOS8vUVdHVmNGdXM4SHVrNXVXbG5iNnN2WkNLZFJxTmRIcGRMQmFyVEx2RnBHSUlBbkRNSVJTeWlRbEpiRjc5dTUvbVdYWmwzLzY2Y2ZHKy8rM0Z6UCtNeHNBa0o2ZWpubHpaeU1vTUJDRFh4eUs1czFiS09lMWJPbTc0RGdPNDhaUHJEZ2llUzROWGJ0MnJmSjE3dDI3MTA5UVdJbFVOcGEzY014T3A1NDQvdEh5NWNzM2YvZmRkeDRKNEJRVEZkN2FWUG1WeXNYMkRNTlFRUkFVL2plVlNrVlpsb1ZhcllaS3BWTElMV1hUTkNtNWpzVDNKcEZaeHNTZ1pzMEVKQ2NubFV0M3V0Rnk4TGYvVlhuZjloMjdWTnQ1L0NzMU5xUFJpQXNYTGlBcnk1dkM0VXNFeWJBcXJ6UFc2WVRMN1lMZGJnZlA4NGlPaVFIUGNYQzZYTVJodDROaFdSQkNpQ0FJY2k2YUV1VThmZWI4TXk4TS9MOFJScU94Ylh4OFBQTEsrQTdxMUtrRHU4Mkdnb0o4TkcxNjJjVGEvT2ttbU0xbXpKZzU2NFpkcTE0ZjRFZXdxeHliV3pobWpXclVDSisvYytmT0owcEtTajRNQ3d2YlFRamhmQUZPMHVLSVY0c0RwVlNnb2xTckovbmpJSW9pVWFsVTFKY1ZSdGJhQUlLaW9pTHdISzhrKzdyZGJyaGRMcmhjVGlRbEpsVXJIVkpBUUdDVnlxb0NBZ0tyZGFEL2RjQ1drWkdCOVBSMFpHZG5LMG1CY3RLdDFXb0Z3N0JLS29mSDQ0SEZiSUZLcFlMYjVTWTh6NE5LQmVyZXRBMkdpQ0pQQkVFZ0FKZzJiZHAyZjJmSjBsY0RBd1A3VHBveUZWTW5UMFNOOEhDb1ZDd0N5aXlXanAwNm82UzRTRWsyTkJvTldQUGVLaVFrMU1LUVFkNG9Jc093MlBqUko5ZDF2U3pMd202M1ZmdVQrRTRUdTgxYWFRa1djNHZHekc2emdsV3BRQWhwRXhvYTJrWVFoTDRtaytuRHVMaTRBNFFRamxMS0UwSmtnQk5CSUlKQ2hDZ3FCSm1pNk0wYWthbXRSRkZVekZNQTBPbjBzSmFVZUZOQ2VEa2xoTHRjeWVCeXcrbHlvWllVOUxuUmtseW4zajhXd2djRUJDSzVUcjFxSGV0L2pTbEtLY1daTTJlUW5wNk9uSndjR0kxR2hXWklydmZNeWNrQllSZ3ZLMGVwc2lpZWVOazRlRi82SUZsTFkwNmtwalVJRGc1K2pSRHl5cTB5bnlvSDhreVlMUmJFeE1iNzBjeFhhemZrSWpJeUFvbTF5MU02WldSbXdteSsrV05tTk9RaUlpSUNTWW1sejRuanVIV3BxYWtmdDJ6WjhnSUFEZ0F2UlZJVkg1ek1IK2ZMQ2VkRGNFbkxtcVV5SlpJY01aVlRROExEd3hFVkZZVzR1RGpVcmwyN1drdnFicVg4S3pRMnVZb2dJeU5EQVRXejJZemk0bUtmSW5ZSDNHNDNSRXA5eTZJSXovUGdCUjZpUWl0RUNRVWxvSlQwZjJvQXUzRFJPeU5abG4wRFFNTE51SmFnNE9DcjJqOHhzVGJ5ODAwd0duSVJGQnh5MTJ0dWRwc1ZOcHNWQXM5WENHb0FrSlNZQ0pQcDVvMlpmRTZpSUpRRE5RQlFxOVhEV3JSbzBjZHV0Ni90M0xueng4ZU9IZlBJQUFkdmtNcTNBRi9oaHBOQmptRVlJdm5mcUV4Ujd0dGNSZ1k0WDlaZXVlZEN3NFlOcjduVzlIYVdPMTVqS3l3c3hObXpaNVU4R1Y4T3RiSmtrSVdGaGZCV0MvRGdLdGZTR0FEazNJV01uaHFOWmhTQUIyN21vblM3bldqV3RPbFZhNnNYTXpKaHNaZ2g4Q0pjcnJ1VG8wMnZEd0REc29pTWlFUmlZcTEvMUVZeU15OGh2NkFBQWk5VTI1anA5UUZnVmFvS05iV0tSQlRGUFNhVGFWMWNYTncrUW9odmdJR1hORGRCQWpSUkRpNndMRXQ5d0l5cTFlcFNKSmErUFJia0JqSnlkNnlrcENRMGFOQUFOV3JVOEFQYmJXTnVHSTJsMGpsazJ1NktHRzdkYmpmc2RqdGNMaGNSS1lVZ0VVRXFXaHFsQktETWthUEhZcU9pb2tjUlFrYmY3T3N4R2ZNUUZ4dUR1TGc0K09YdUZvL0hzK3FYWDM3WjJLZFBINE1VWUpBMU9NRW5jaXFERzVXMU5WbFRVNnZWVkc0QldCYmNmRTNTK1BoNEpDWW1va0dEQnYrcUpqSjNyQ21hbFpXRmMrZk9JVE16VTBubjhHMnVJdE82K0RMZENvSkFQQjZ1SXZZTkJnQno0ZUtsL2lxVmFqU0ErMjdtdFRqc050aXNKUUNvSDlUOEFnRFFhRFN2OWVyVnE0UFpiRjRiRVJIeEhTR0VsY0NOODhsL0kxNGxUeFI5R3Y1UUg2cDVXbG11VzJWMXA5VVZWUEFEV3hYa3dvVUxPSC8rdkFKcWNqcEgyZVlxWmVpN0NjZHhBS2g4MCtVdVQ4eTJiZHRxaFlTRWpNbThlUDdWbTMwdHdjSEJVS2xVaUkrUFEyeHNySDlGKytXeU9VVkl5L0R3OERVZWorZUQzMzc3YlVPM2J0MnlDU0dNYkpwU1NubGNabDRXdlY0SjZoc3BKYjVSMDdMcElUSjl2UysxdmNmalFkMXJZUER3QTl0MVNscGFtcEo0SzNlTktpekZkT3NvQzJyRXB4ZUI0a3VEVkRuZ2RydWZVS3ZWWXdHMDhpOGx2OXlPb2xhclgrcmF0ZXQ5K2ZuNWE2S2lvblpMdmpkR0FqVlplNU5UUWNwcWIrWFNRc3BXTHZoMlRwTUI3cDU3N3V5a2I1S1JrWEZIbktoY0hpVUhDWHo5YVdXMU5KOU9VY1JiV096dERDV25jRkJLeWM4Ly94eVdtSmc0am1HWUNmNmw0NWM3eVBlMmJPdldyZXNuVFpwVUNNRGprK0FyeVA0M3VXcEJTZ254OWIxUjN3b0Z1ZlZmVUZCUU9iK2JIRlM0VTlOQlZJbUppYmY5U1hJY2g5VFVWTVYzVmxHSHFBcTZRdmwyVS9jRk5jWnV0M2ZSYXJYakNTRTkvVXZGTDNlWXZEbCsvUGlVWjU1NVptMVNVdElSQUN3QU9YcEtVSnJKRjZJb2doQWlsMlFSbWYrdHJJYm1XMlR2Y0RoZ3RWcFJWRlNFbEpRVXFOVnF2eWw2bzhYbGNpRTFOVlVwa1pLckNYeGI0aWs5Q1NUQ1BWbFRrMDFQQ2RnWVNpbmo4WGlHc3l3N0VZQS9vOVV2ZDZRd0ROTWpNVEd4Y1VsSnljcVFrSkF2QURDU2VTb25sWmNLTE1nV0QvVUtrYXNYZlByWTRrckY5U2twS1pWMnhicHRUZEhiT2QzRGJyZVhBcld5MVFSbEd4YkwvalRKL0pUclBCbFJGRWx1Ym01OGRIVDBCRUxJcS82bDRaZmIxZDFpTUJoZ05Kb2dDQUpzTnVzL2ZvZm4rWFZIamh4Wk4zbnk1RnhKYzVNckY1VGllcCs4TjBpcElYSVNyNUx6Sm5lbUwxdWxFQjBkalpvMWF5STVPZm0yQUxmZzRCQ3dMSVBvNk9nclpoRGN0aHFiMVdxdEZOUmtobHU1OTZKdmtFQUdOWi9JSjJPMzJ6dHJ0ZHFKaEpBSC9jdkhMN2NycUIwN2Rnd1VSS21HcUdKVzJiRDZEUnZYNmRydGdmYzZ0R3Z6QndBRzNzaXBUSURxcFVYeS9rT2x2cmRlalkxU0wwT1MxQWRYM3VRZXVvSkl3UXNVSEMvQzdSR1FtSnlBb0tCYlg5bGl0OXVRbTJkQWJsNGU3cnYzM2pzSDJJcUxpeFZRazR2WnpXWnpoWnBhSlpGUHhaL21kcnNIcWxTcXlRRHErWmVQWDI1WE1SZ01vQ0RYVkwvS01FejNXclZxSjU1TVRWdlJKT1dlSGFDVW9ZQnYzdzFCb2dzUnZiRUFDc2tDQmJ6cmhDb21xUnhSbGN4VVVhUVFxUlJOcFNJYU5taUk0SkNRV3pwV2dZRkJDQXdNZ3NtWUI0UEJVR0dhMUczRm9QdkREeitnZmZ2MmlJbUpRZGV1WFRGaHdnVHMyYk5IWWVpb0tBTHFWdm9QZUgxcTBzYUlvcWlhUDMvK2xQVDA5TFhmZi8vOWJRTnFQTTlqMUtoUmlJNk9SbWhvS0lZUEg2NTBkL0xMM1NzbVV6NkNncThMTU9xR2hvVXRQbmYrNHZDRzl6UUtBS0NUdW1mSlBSZFlTc0ZTS25mTEVnalBjL0J3bkplcDErV1dlaXg0dTJOWnJWWVVGeFhCWWpIRFpEUWhKeWNIR1Jjdkl1MU1Ha3FLaTIrTE1Rc01Db1pSNnB4V1Z0Z1pNMmJjRmllNWQrOWU5T3paRXlrcEtYamdnUWVRbEpTRW9xSWlIRDU4V0k3c0tJQlcxdnlVdFRRdnRiTEFwS1NrMVByODg4L25kdTNhZGN5QUFRT1lrSkFRZE9uUzViYTR6b2tUSjJMYnRtMzQ5Tk5QOGV5enoyTHAwcVU0ZGVvVUhudnNNZi9xdm9zbE56Y1hOY0lqcnZwN3AwK2xZdDVVN01lSEFBQWdBRWxFUVZTYzJlalZ1dzhBTUNxMXV1T3ovL2RjU0t2V2JTNTh2ZlVyQitCVjNTb3pmeWxBY0xtUnQyU08wc3VicEtrVkZPVGowTUdES0N3c1JFUkVCSUtDZ3FIVDZmRDExMTloL3R6WjJMWnRLd290aFdncG1ZYjUrZmw0YTlvVWJONjhDVC8vOUJPYU5HMkswTkF3QU1CZmZ4M0h0Q21Uc0hYckZody85aWRhdDJsN1RWMndOQm9Ock5aaXhGZmdhN3R0VE5HMWE5ZWlhZE9tZU9hWlo1Q1ZsUVZDQ0ZxMmJJbUNnZ0tjT1hNR0tTa3BsU1hlbGdvU1BQamdnNjBhTldvMHBWdTNibjNsbTNlN2lOMXV4NnBWcTdCcDB5YUZtdWo5OTk5SHo1NDlzV0RCZ2dxYjN2cmw3aENydFFUUjEyQ0dOcnluRWQ2ZStaOVM3Nm5WNmtGZHVuU0ovdVhYLzYzcGZuK1hFNVJTUmtJM3hUU1ZzVTBVQkpHWGZHMkE5OVVMZUJLd2dlSkMrZ1Z3SEFlV1lSRVJFWUdNakF4UUFJR0JnZGk2WlF2V2ZyQWVHbzBHWThlOGlTTkhEcU4xNnpaWXZXb0Z1bmQvQUgwZmVSUi8vSEVFQytiTnhhcjMxb0xuZWN5Yk13dnpGeTVHVWxJeTFuM2c3U3Y2MHN2RHIybmNmSHNGMzNhbWFGRlJFZXgyTzNKeWNuRGh3b1ZTUHJYRXhFUWtKaVlxS1IxMnV4MzUrZm1rc0xBUU5wdU51Rnd1SWdnQ0k0b2lrNVNVMVB2SEgzOWNzbno1OHI2RUVIVHAwZ1ZIang3RlcyKzloWGJ0dkExNTI3VnJoOW16WjZONzkrNElDQWhBdlhyMThQMzMzMlBac21WSVNFaEFhR2dvaGcwYnBoRDNVVW94Yjk0ODFLOWZIeHFOQmhFUkVSZzBhQkRzZGpzOEhnK2FObTJLQngrOEhKUFl0R2tUdEZvdGpoOC9EZ0RvMzc4L1dyWHlGalVjTzNZTVRxZXpGTjlhNTg3ZVR0c0hEeDcwcjI2L2xCT3oyWXl4WTBaaDBQUC9oOEdEQnVMM1E5NTVrcDJkalFIOW44Q1QvUjdGcURkR2x2ck81SW5qTVdUUTgzMW0vMmZHMUpTVWxDNEFkS0RVdDVFTUs0b2lLNjhicFlrTXg2R2twSmdZREhsZVFrcW50M0Z6WkdRa0dqWm9DSTFXZzVLU0V1VG01aUF6SXdPN2YvZ0JLVTJhSUNEQVM3SmFJNndHL3BMbS9WOS9IVWVYTHQ1NUhob2FpclMwMC9CNFBERGs1VUduMXlNcHlkdVlKVHc4SEg4ZFAzYkR4KzJXYTJ4eW9LQmR1M2I0OXR0dk1YZnVYTVRGeFNFa0pBUjZ2UjR5MTd1YzBtRTJtd2tBcUZRcVFpbVZ1NjR6VnF2MVdZMUdNN1Z2Mzc3MUd6WnNpRVdMRm9GaEdMUnYzeDZQUFBJSXBreVpvaHh6L3Z6NTJMRmpCenAxNm9SWFhua0YvZnIxdytPUFA0N1RwMC9qMUtsVDZOYXRHeDU2NkNFODhjUVRXTFZxRlJZdVhJak5temVqY2VQR09INzhPQVlPSElqbXpadGp6Smd4K1BEREQ5R3VYVHQ4OHNrbjZONjlPMGFPSEltWk0yZWlSWXNXQ3JBVkZoWUNBSEp5Y2hSdzlIbTZJaUlpQXRuWjJmNVY3SmR5OHNYbm05R3NXVE1NR3Z3aTB0UFRzWHJWQ3JSdDF4NEpDUW40NzVhdE9IZnVMT2JPTGswMVAyL0JJbWx0RmJVWi90TFE4QTgvK21URjRFSFBmeXNwTWtTeVRqa0tDTjRIT0JHbGZGNFFRcWhLcFNKdXQ5dXJ4QUdnb0NDRWdkdmxnczFtUTc0cEh3QkJabVlHQWdJQ2NQRmlPbFlzV3dwQkZCQXMrUW1MaTR1aDFlbXdZL3MzK09tbjNkQm9OTERaYkNncEtZRldxNFhINDhIS0ZjdVFtNXVMb3FLaUd6NXV0MVJqODAzcEVFVVJBd2NPUk4yNmRXRXltWERxMUNrY1BYb1VxYW1wS0NrcGdkdnRSa2xKQ1pIQVFJbjRNQXpEQkFjSHYvTGxsMTh1MG1nMDllV0dGenFkRGhxTkJvUVFoVmxVbG43OStxRmJ0MjVRcTlWNDRva240SEs1TUhmdVhBUUhCNk50MjdabzBxUUpVbE5UQVFCSlNVbFl2MzQ5K3ZUcGc4VEVSRHoyMkdQbzJyV3I4dmw5OTkySFNaTW1ZZno0OFJneVpBaWFOR21DQ1JNdVYyazk4OHd6R0RIQzI2UFI0WEJVbUF1azFXcWxEbGwrOFV0cGFkMm1MWDcrNlVkODlPRkd1RjB1TEg1blNaVytKNG9pWnM1NEd3LzNmYlRlQXowZW5IWXE3ZHdBQURwcDAxQksxYUJVQllBRktLT2tSd0dFWlZYZ09BL3h1RDArcmY3c2NIczhjRGdjc0JSYWtKOXZRbEZSRVU3OC9SZkdqeHVENTU1L0FkMjZsYVl1bkRkbkZqSXlMbUx4TzB1aDFXcExLVE5qUnIrSnhvMVRNUEtOTjZ0bDNHNFpzUGttMzhvcEhTNlhDM1hxMUVHclZxM1F1SEZqUkVSRVFCQUVHSTFHNG5hN0pYWU83eE5IemxIak9HNThTa3JLZ3RUVTFDcDNxUEF0STVNSFBDRWhvWlJUVWdhYXZuMzdvbmJ0MnBnNWN5YWVlKzQ1dEdqUkF0OTk5NTNVT01NcjA2ZFBSMFJFQlBiczJZT1BQLzVZNlhOUVZ2UjZQVHdlVDduMzNXNTNwZjBSL1hLWEExdnJObGk1YWcxcUppVGc0NDgyNHUyM3BsYnBlK3ZYdlErZFRvZUJ6NzhBQUZIQndjRnZmZjNOOXNFQTlCSzRhUWtoYWtLSWlsTEtBbUI4QW5DRTQzaDRPQTlSSXFaT0p6aVBGK2hLaW90aHNWamdjYnRSWEZLQ3h4OS9BZ1FFSmRZU2hJYUZLZVpuaDQ2ZE1QS05VVkNyMWZCNFBBcHpiMGx4TVVhUEdZZmVmUjZDeStWQ21QU2RPeDdZZk11a3NyT3prWk9UZ3kxYnR1RGl4WXRLbmhySGNkRHI5UWdKQ1NHQWwvN2JGOVJXcjE2dDVqaHVPc013czBWUjFKWHRPSDVGKzF0VjNnS3ZyTmgzeVpJbDZOQ2hBekl6TTlHaFF3ZXNYYnNXdlh2M0xyV1AwV2hFVGs0T0tLWDQ5ZGRmS3oxdVFrSUNYQzVYS2RXYjR6aVl6V2JVckZuVHY0cjlVazdteloyTncwY09vMGVQQnpGNXlqUWNPblFRL3pUWDkrL2ZoNzIvL29vcFU5L3luZGU2SmsyYVRybjMzbnVITjJ2V1BCQlNPZ2lsVkEwcEhRUUFTMFdSOER4SEJJRW5QRmM2SFlUbmViamRic1drVkdzMGNEZ2NLQ2pJeDhXTDZkajl3L2RvMUxneEFLQkZpNWJLZWY1NTlDaVNrcEtoMFdnUUd4ZUgwTEF3YUNVTGF2KytmV2plb3NXZDcyT1RDOXA5YXorTGlvcVFuNThQaDhPQjVPUmszK1JiSW1zNGN2czdBR1RuenAxQlBYdjJuTW93ekxpaW9pS2NPblVLUTRjT3JmQjQxOHRPc0dUSkVreWVQQmt6Wjg1VTNzdkl5Q2dWd1h6cHBaZlFva1VMOU92WEQ2TkhqMGJQbmowckJLcVdMVnRDcjlkajM3NTllT1NSUjZSSnVCOE13eWpCRGIvNHhWY0dEbndCaXhjdndPZWJQNFVvaWhnemRqd1loa0YyZGpiR2pIb0RIT2RCY1hFeEJ2Ui9BdmZlZHg4bVRaNktsY3VYd3VWeTRiVVJMeXUvczNMMVdnUUhCMlBCb25kR3Y3Tm9vYWFnSUg5ZGJtNnUvSVNWbzZXOHROWUViMk1zd2V0aWsvYmhlWUY2T0s4NUNnSUVCd1VqTGk0ZW4yN3lkcEsvOTk3N0VCd2NESjduOGVwckl6Ri8zaHg4K2Q4dm9OZnJNWEh5RkVXcG1ETDFMY3lhTlFPY2gwT3RXclV3WWRLVU94dllLS1hseXFUazZHZHljakxPbnorUDFOUlVCQVFFUUJBRXVOM2Vwd1FoUkNiVEl5a3BLVFZtejU0OU5TSWk0azIxV28wcFU2WWdKQ1FFQXdaVTNMMDZLQ2dJQnc4ZXhLRkRoNjRKUE1MRHczSGd3QUhrNXVaQ0VBUXNYTGdRcDA2ZFFsT3BMOEg2OWV1eFo4OGUvUDMzMzZoWHJ4NDJiZHFFbDE1NkNkOSsreTBBNFBQUFAwZGhZU0ZHakJpQndNQkFEQjA2RksrLy9qcUNnNE9oMFdnd2ZQaHdEQmt5Qk9IaDRmNVY3SmR5VXF0MmJTeGJ2cXBDN2YrL1c3WlcrSjNQLy90VnBiOTN6ejJOOE1INmphKzUzVzdWNWs4M3JadisxbFN6dExaOGxBRUdsSXFDS0RLbHdDMG9LQWdhclVhMm5rQkFVQ01zREVsSlNZaUlpRUJNVEN3eU16TEFzaXdhTjA2cDFCL1l0R2t6ckgxL2ZiV08yMDAxUmE5VTBCNFVGSVRZMkZpSW9paWJvMFFHTlpabENhV1VYTGh3SWVMNzc3OS9LeTR1N3MwSEhuZ0FYYnAwZ1ZhcnhmNzkreXUxMDE5NzdUVWNPSEFBZ3djUHZxWnozckJoQTBwS1NsQzNibDIwYTljT05wc05reVpOd3A5Ly9vbXNyQ3lNR1RNR1U2ZE9SWU1HRGNBd0RENzQ0QVA4K09PUDJMQmhBd0JneTVZdFdMLys4azFjdkhneEhucm9JVHorK09QbzI3Y3Y3ci8vZml4YnRzeS9ndjF5VTBXcjFRNS9idURBbCtjdFdCUUZRQ3RWS2FpOXlvNVNwVUJFMFp0NTRHM0E3QTBvdU4zZUtnV0h3K0UxU3lXZm04bGtRbTV1TGpJeU1uRDJ6SmxiZW4wM2pkMGpMUzBOYVdscFNvczh1WnVVWENibHkzeGJKdm1XVUVySm1UTm5hdFNwVStjdFFzaEkvN1FzTGFJb0lpUHpFaXdXQ3dSQmdNdDVkNVpvNmZSNnNDeUw4Qm9SU0VxcVhXa1FSN1lldkdObUJzOVgzNWpwOUhxb1ZDcEVoRWNnS2FseTdzTzllL2VpYnYyYnoxcnJjYnMvMkxUcGsvZmZuajdOQXNCRkNIRkRhUnhEQkVJZ0VNSW9EV1BVYWhYVUdnM1ZhcVMrcFFFQkNBb01STERVemk4aUloS3hzYkdvWGJzMjZ0YXJqM3IxcXJlYXNiSSt2RGZGRkpWN0ZKVGxVNU03U1IwL2Z0eTNRb0Q0MnYzU0ZsU3ZYcjJwQVA3Vm9HWXdHSzY2VTVEYjdjRmZmLzBGVnFWQ2NFaW92NitvM1liQ29rSVVITTFIaStZdG9OR29Ld1MxUC80NENvWmxFUlJjL1dObXQ5dGd0bGlRWDVDUDFxMnV6RUNmYy9QekdWL3ExcTI3ZUhISWkycy8zTGhCV1lkZTA5UmJZZ1dJZ2loU1VHOHhQQlVFa1FpOFFKVnU4ejRrbFU2SEEzYTdEVlpyQ1lvS2kyQXVLQ2lWY1hBanBlWVZmcmZhZ1Mwcks2dFVqNEt5M2RrZERnZHExNjZ0YUdvZWo2ZFU3ZWZxMWF2Vnc0WU5tOG93ekp2d1N6bkpNK1NCVmFuOG5lQWxrWmtmaklaYzVPYmxJcWtDaHVpTEdabGdXUGFtalpudk9XVm1Ya0xpRmZxTDFreEl1QlhETm56cXRPbDhSa2JHMmwvMy9GS1poaXRjQmp1UlVpb1NTc3YzVWVBbFpsNlBoNFBMNDgyQkk0UWcvaVpIL2FzVjJJeEdvOUlpcjJ6amxRbzZTWkdLdU5Ra1VCdm5YN0lWaTduQWpLQ1FVUDlBbEpHZzRCQVVGSmdyQkRhTHhZTGdXekJtUWNFaEtEQVhYQkhZYnBrWnI5Tzk5djRINnowTjZpV3ZsN1ZhT2FCQXZkRUZLcGJLTXlFVUlBUWdjbGQ2RUVMQWVNa3N3VEFzV0phRmlsVkI1VFZmRVJVVmRlY0RtOXloWFc2Umw1K2ZYeW1kZDFtZm1tL3lMY013VS8zTHRESS9FU0FJd2wxdmZsYW1KUlVYV1NyODdGYU5XV0JnRUlvTExkZjAzWkxpWW1SY3ZBQzczWGJGMzA5S3JvdVEwR3NEYmIxZVB6cnQ3QVhYUFEzcWJwTHdUSmxxUG1NblhtN2Z4MUdPOHhBSitFQVlBc0l3RXJBeFlGa0dLcFhDMWd1TlJvUFEwTkE3RjlpY1RtY3BVQ3ZMcDFZSlNhVGNmSVZJdlFsZVlSaG0ycFVYOXRWVEtkOXVVbFdxNDRxRUVNRHA5SE81VlRvUEsrRzV1NVhCbFd1OVh4ZlR6OFBoc0Y5eEg3dmRob3lMRjlDc3hiM1hBYjZCbzArZU91Tm8wcmpoVmg5UW8yVTBPQkVBRlVXUjhEeFBuVTRIWVZtV01vU0FFQVlNUXlDWE5ubzNGVlJxTlRScURSbzFibnhUS01adk9MQlJTbkhtekJtbFRaNGMvU3lycVpXSmZzcU5KUmlKOWZaWmxtV253VnY2VWVseHJwRksrYmFUcWxBZFg2djh1UHNIYk55d0hpYVRFZkh4OGZoNDAyYzRkKzRzaGc0WnBPd3phY28wUFBUUXczNGt2STNsbjBETmR5NWRyMVVhR2hyNnhyRy9UdHBiTm0veXZhKzJWZ2JjQUVDa2xIcDlhcHlIZUhzclhBWTJobVhCTWhLd3lWcWJWb1BHalZPcXZhM2ZEUWMyWDFBcjI4ellicmRYU09mdDYxZHpPcDI5VkNyVlZBQlhOTWl2aDByNWRqU2Ivb25xK0Zva056Y1hDK2JQeGN4WmM5QzZkUnVVbEpRQUFPclZxNDhmZi80VkFQRFMwTUhWZGwwYjFxL0RZNC8zSzhWbUlwL1hzaVh2NE1TSnY2SFJhTkRqd1Y0WThlcHJZRmtXZ0plU1o4V3lKVGh4OGdTMFdpMTY5dXlGbDRlUFVENnZEdm1uWTNicDFCNXF0UnFFTUVoS1NzS1FvY1BRc1dPbmZ5dU9Sa1ZFUkx5NmN1WEtrdGRmZi8xQUdjMk5Fa0tvOUQrUm0yRHhIT2ZsSW1jSUpRd0JReVEvbTZTNUtjQ20xa0NyMGFKZS9mclZlZ0UzTkVFM0l5TUQ2ZW5wbGVhcHlkUkRVb3M4K0xMZlVrb1pxOVhhU3FQUlRBWHdqMWQ5QTZpVWJ6K0F1d0xWOFRVOVpOSk9Jekl5RWgwN2RvSkdvMUhLd0FnaFNtZWk2bnh5ZnJoeFBTd1djN24zWjd3OURUVVRFdkQxTnp2eC9nY2JjT2pnQVd6ZnZnMkFOeWR2MG9SeGFORHdIbXo3WmlkV3JGaU52Yi91d2RkYnY2cTI4NnpxTVZldVhvTWR1NzdEa0tIRHNIamhmR3o5YXNzdG1TZUVFTng3NzczbzJiTW5ldlRvZ2ZqNHEzdTRDNEtBMzM3Ymo4a1R4eU03SzZ1eVk5U0xpb29hdm1EQmdzYVM1U1RUakt1VnVsSks1VzcwaE9kNThKdzM5Y05US3ZYRGpzS2lRdnowNDI2c1hmTWU1cytmZy8zNzl5RkxPbTdXcFVzWStmcXJlUGFacHpCbTFCc29LaXBVenVHakR6Zml1V2VmeGpOUDk4ZXVuVHR1amNabU5Cb1ZVRE1halFxb3libHF2bDNhZlRxMEs2Qm1NQmhxNmZYNktRRGFWdlhtL051YzVvR0JRYkJacjU5UC92anhZNWd4ZlJvOEVzM000NDk2emN4K1QvVEhvTUZEcXZRYmh3NGV3TW9WeTJFdzVDRXhNUWxqeG81SFNwTW15dWQ3ZjkyRERSdldJZDlrUWt4c0xJWVBINEYyN1RzQUFFYSsvaXF5TG1VQ0FFYS8rUVpVS2hZSkNiV3djdlVhaUtLSXJsMjc0ZUcrZmFIVmFoRWRFNE5XclZzcm1lb1dpd1Uxd3NQeDNNQ0IwR2cwU0toVkN4MDdkVVphMnVscUcvZXJPYVplcjBmSGpwMmduaklOYjArZmhsNjkrOXgwWnBiazVHU3dMSXZkdTNkRHE5V2llL2Z1eU0vUGg4UitVd3F3NVNSbDM3L2ZmT04xMUt4WkU2ZFBuNElnQ2xjQzBOYUppWW5EeG80ZHUraWRkOTdKa2JVMkg1K2JIR0FRQlVFRUlieTM3cEV3bERBTUNFUEFzQXh5YzNOQkNNRURQWG9BbEdMRCtuV29WNzgrOURvZGxpNTVCNDg5M2c4OWVqeUlMejcvRE8rdFhvWEpVNmJoeEltL3ZYTnM0MGR3dTkwWVBud1lXdDU3WDVWQi9JWm9iRmFyVldIcThLMy9sRHUzWHltdGcxSktYbnp4UlRZaUltSXlJYVJ2MVk5WmNrTW5pOWxzeHVSSkUvRGNzMDlqM3R6WnR3emNLcU02dmhwcDBhSWx0bTNmaFRkSGpVSE5tZ25ZdG4wWHRtM2ZWV1ZRdTNEK1BONmFOZ1VqWG5zZHU3N2JqYWNHUEkweG85K0FTZEltTXpNek1IdldURXljT0FVN3YvMEJqenp5R0taT25hdzBwVm14Y2pXMmJkOEZBRml5YkRtMmJkK0ZsYXZYZUNjY3crQzVnYzhqTEt5RzF5bCtNUjBIZnZzTmJkdDY2M2dqSXlPeFl1VnE2SFI2WlVFZVAzWU16Wm8xcjdZeHY1Wmp0bTdURmg2T3V5V2xRNUdSa2NqTnpWVjhYYUlvb2thTkdxWDJPWExrTUtaT25naU80MkN4V1BEUzBDR3dXTHdSMlhlWExNUGtLZE9xcEJnd0ROUDd2dnZ1R3h3VEU2T1h0RGFmMGl1d0FCaHZSemlSdUZ3dTRuSzV3SEVlWWpHYmtaZWJDNWZUaGVMaUlnUUdCcUtrcEFRcXRScUNJQ0QxNUFsa1pHWWdMZTIwY3U4ZmVyZ3ZEdjkrQ0FCdy90eFp0R2paRWxxZERpR2hvV2pmdmdQK09ITDQ1cG1pbE5KeVZRVyttcHB2Qk5TM1E3dHZCSFRObWpXVENDSERic1JOLzJyTGwzanUyYWZ4N0ROUFlmNjhPWEM3WEZYNjN2dHIzOE05OXpUQ3A1OTlnYkhqTGhORm1veEc3Tnl4L2E1eVZPL2N1UjFkNysrR2poMDdRYXZWb25lZmgzQlBvMGJZdmZzSEFFQkVSQ1EyYlB3WWpWTlN3REFNSG5uME1YQWVEN0t5TGxYNUdLa25UNkpuajI0WTlQeHp1S2RSSTNUcGVuK0YrNjE1YnhYMEFRRjQ2T0crTiszNnEzSk1RZ2pDYTRURGR2M08rcXNXalVZRFFSQVFFUkdCVHAwNlFSVEZVa1NPQU5DcVZXdUVSMFJnNW96cEdEdm1UZlI3NGttRmFPRnFHNmVvVktybkZ5MWFOQkJlTGpkZmsxUWxZUWdqVWtvWWhvSEg0eUUybXcwdWw0c0VCZ2JDN1haRHBWTEJZTWlEMVdwRmRuWTJDZ3N0eU0zTlJXNU9EaUlqb3lBbkJSODZlQUJXcTNjODY5U3RoNk4vSEZFb2tsSlRUOEptczkwOFlEdDc5aXd1WGJxa3BIVlVwZmRubVFqb3dCdVZxM2JpeE4vWXN1Vy9XUHZCZW55NitRc3dESVAxNjlkVjZidm56NTFEaDQ0ZHk5MzQvUHg4N05qeHpWMEZiQWFEQVhGeHBWWCsycldUWUREa0FmQ3lQQnc5K2dlR3Z6d1V6ejM3TkFhL01GRFJkS29xS1UyYVlQZFBlL0RGbDF1Umw1ZUhEUlhjcDQ4LytoQy8vMzRJYytmT3I1QkRyenFrcXNla2xNSlNhRUhRTFhLSEpDY25vMUdqUnZqdHQ5K1VvRkJaNEIwK2ZBVCtQUG9IdEJydGRUMFk5SG85Qmc0YytLYkJZT2haZ2IvTnE3bDUvVzBNSVFTQ0lFQ3Qxa0FRQk9MeHVCRVVGQXhlRUhENDkwTTRmU29WRE1QQTRYREFaREtoVjYvZStPYWJyekZrOFBOSVRUMkp3RUJ2LzRUbXpWdWdaNjgrR1BuNkNFeWZOZ1VCK2dEb0EvUTN4OGVXbloxZExsZk50MVRLQjlSUVVRVFVicmQzbHBvWjM1QlphN05hRVJRVWpJQ0FBREFNZ3hlSHZvU0xGOU9seFpxSFJRc1hJTjlrUkdoWURZd2JQd0dKaVVuNCtlZWY4Tjh2UGtObVppYm16cGtGalVhRDU1NTdIbDI2M28rbFM5N0JzVCtQd21Bd1lQakxYcjYzdGUrdng0YjE2L0RubjBkaE5CaVEwcVFKTHFaZlFHUlVOTjU1ZHlrb3BWaTlhaVgrK09Nd09BK0g5aDA2NHJYWFI0SlNpbkZqUnVIK2J0M3h5S09QNGNTSnZ6Rm45bit3YnYySHQwVjNiVitKaVltQklTK3YxSHM1T2RsbzJkS2Jpckx2ZjN2eDZhWlBzR1RwY2lUVXFnWEFHeldzYUhHVkJUdTN5NFh2dnZzV2ZmbzhCSzFPaDdpNE9QVG84U0QyNzk5WGFyOHRYLzRYUCs3K0FjdFdyTHJtaE5PcmxhczU1cEVqaDZGUnE5R2dZY09iZm4ra3NrUDgrZWVmQUFDV1pjdFJ5OXRzTm93ZlB3WURueCtFczJmU3NHRCtYRXlhUFBXYWdrVk9weE5idG14UkFYamxyNy8rTWpSdjN2eFB5ZGNtU3Y0MkpXSktLU1VNdzhMamNWT24wOXVVbmpBTW9xS2lFQkFRQUoxT2g3Ly8rZ3VpSU1KaU1VTWJGNC9uWHhpTUJnMGE0bUo2T2k1bFppckhmVzdnODNodTRQTUFnSmVHdllpNmRhdGVVSC9OR2x0UlVWR0Z1V3FWZ0JvcDA2V2R5YzNOamRkcXRSTnhBenUwdDI3VEZqVnIxc1RMdzE3RTExdTNRS2ZUb1hYck5nQ0FPYk5ub1dmUFh2aDQwMmQ0L29WQm1DNVJMRC93UUErc2ZYODlhdGFNeDdTM1ptRHQrK3NWczJqVTZMR1lNSEVLa3BLVHNmYjk5YVU0cE5xMmJZY1pNMmNoTXpNREgzMnlHWmN5TTJHeFdHQTBHaEFZR0lBTkd6L0d4NXMySS9Ya0NSdy9mZ3lFRUV5Wk5oMmZidm9ZYVdtbk1YZk9MRXg3NisxYkJtclMvZkJxSDZLb2FOSUE4SERmUjdCMzd4NGNQdnc3ZUo3SEw3LzhqTlNUSjlDelZ5L0ZIMGtJd0xBc2lvdUxzUG5UVGRMdmxHYUtpWXVQeDZHREI4RnhIUEpOSnE4MnJOWGlrNDgvd3VlZmJ3YkhjU2dxS3NTK2ZmOURzMmJOTHB2Q083WmoyOWRic1hUNXlwdkdVMWZWWTdyZGJ2eCs2Q0RtejV1RDRhKzhla3NvM2ZQejh4V0EwbWcwQ0FzTEs5Y1E1Y0tGOCtqYXRSdis3N21CbURaOUJqUWFyZUpqdXc2cFc3OSsvUmRIalJvVlc1Ry9qVkxLTUF6RHlGUmpIbzhISE04UnpzUEI0M2JEWVhmZ3pKa3ppSXFLZ3QxaFIxRlJFUW9LQ21BMEdQREhIMGV3Zk5rU1BQbFVhVjVGanVPdzZaT1BRWWlYeDYxYU5UWkJFSkNlbnE0RUMzd2pvQldrZFpBeWFSMkVVc3BFUjBkUElJUThlQ052dUVxbHdveVpzM0Q2VkNxKy9mWmJESDVoSUdiTm5vczZkZXZpN0prMDlGemhKZXhyMDZZdDNuVzVZRElhRVIxemJXbTlXcTBXT3IxZU1Wc0RBdlRnT1E2eHNYR0lqSXpDeEFsandUSXNERWF2MzlIcm00ckE2REhqOFBxcnIrRDVGd2FqU1pPbXR3VFV5aWJvTHBnL0Z3dm16OFdEUFh2aHJla3pVTDkrQTd3OWN4YmVXNzBTaHJ3ODFFNU14TUxGN3lJbXhwdGYxK2VoaDNIeTVBa01IZklDV0ZhRnh4N3ZoL3IxRzhCU3BseG96Smh4V0x4b0lUWnVXSWZhdFd0ajNZYVBvTkZvc0dEaFlxeGNzUXhmZlA0WjFHbzF1dDdmRFlNR3Y2ak1yVVVMdldiZ3MwLzNMMjBtYnRxTTJOaTRHejRlVlQzbXlOZGVCU0ZBWW1JU3hvNmJjRVB6MklLRGc2dThiMFpHQnNMQ3d0Q2pSdzhBd1BIang4djEwbWpldkFXYU4yK2hySXV4NDhiZklQL3J6bTZ0VzdmT0FMRENSMnNUQVZCQ2lEZEdTa1VxMTR2eVBFOFp3cEFTYXdubE9RNmhvV0dJam9tRjNXNkhXcVdHV3EzR3JsMDd3RElzbm5yNmFiU1hJdXVBbCtKOCtkSjMwYng1Uzh4ZnNMaENiYk95Y2JzbVlQT05nRmJHcVZZRzFHUUdBTGxjYWpnaDVOVWJQVUZQbno0Rm5VNkhSbzFUMEtoeENyNzl0akUrK0dBdDVzMWJvSmhHaXBuRU1LQzQ4VngwZi8xMUhMdDI3c0RTWlN1ZzFla3dZM3JwcWpDSHd3RzFXZzJYeTFudEFOYXJkeCs1UTNncHFWKy9BZjYzLzhwOVREdDI3RlRwd3RWcXRaajIxdHVsM3F1bzRXMmJ0dTBxWkhtdFY3OCtsaTVmV2VGdnN5eUx2ZnNPM0ZTZ3I4b3gvMm04YnNRNTJPMjJLa1VxNWFxYjY1VlBQL3ZpbXI2blZxdUhiTml3SWVQRkYxL2NCaS9GcmtnQktyV1NwL0NtZ1lpaUtGS0JGOEFURG9FQkFVU3IxVkdkWGdlMzJ3V253MXVOb0ZLcjBLMWJkOFRHeHFGV3Jkckl5TGlJT25YcUFnQTZkZXFNVHAwNlYzb2VkcHUxVWovb1ZadWllWGw1Q2dXUmIxcEhCUkZRK0lDYW9xM1o3Zll1TE10T3JJN0prWFhwRWhiT253ZTczVnQrWWk0b1FHaG9LTFE2SGVvM2FJZ2ZwYWplSDM4Y2dWcWxRblQwUDJ0cm9hR2hLTWd2cUxDN1ZFVmlOcHVoMSt1aDFtaVFuNS92ellXU2lva05oank4dDNvbDN2OWdBdzcvL2p1T1hFWDR1bkxIYmdEOGNuVmpjeXZIckxKalIwZEh3M0dGV3VlQWdLcVp2RlhkNzNwL0t5Z282SlYzMzMyM2hSSk1rSnJDeUNhcG5BSWlpZ0xoZVFFY3o0UGpQUEI0WkFaZUZ4d09CK3cyRzBxS1M3d012UGxHS2JtL2FrbnFkcHNWMGRIUjF3OXNEb2VqRkZ2SFB3UUx5aVhocHFXbGhXbTEydkVBcXFVT3FtZXYzdWpjcFN0ZUh2WWlubjNtS2FTZVBJSFhSM3BwM0taT200NXZkKzNFNEVFRHNYSDlPc3o0ejV3cU9WSVRhdFZDMjNidDhQU0FKL0hDd0dkaE5CcXV1SCtuVHAyaDArdngxSlA5TUgzYUZOU3RWeDkydXgwOHoyUG0yOVB4MHN1dm9GYnQycGo2MXR0WXZIRCtkZnM5NUNlOVg4cFArc3BLc0poYk5HWjJteFZzSlJwR1hGd2NLQldSYjh5cjhOeVM2OVQ3UjlBS0NBaEVjcDBieDFqN0Q4ZU1pNCtQSC9UQ0M0TnF5T0JHeTRNYlF5a2xvaWdRZ2VmQmNiemtiL1BBN1hMQjVYVEM3bkRBYXJPaXVMZ0lGck1GSnFNUjJWblpTbCtGeXNiUlpNZ0ZDQ290UDd3cWF2RFUxRlNrcGFVaE16TlRxUVgxTlVWOUtneUlyTFZKdmpWR29pR2F4VERNaEJzeDZMZUtTcm02cFRLcTQ4cjlMWmt3V3l4K29za3lZalRrSWpJeUFvbTF5M09mWldSbXdteSsrV05tTk9RaUlpSUNTVmZnWXpPWlREQVlET0I1SGxicjdjOVc0M0s1VnZYdTNYczlBSWUwdVFCNENDRWNBSjRRSWhKQ1JJbGFYS1l2b2xxdGwxbzhJQ0FBZ1lHQkNBNE9SbzBhTlJBUkVZRzR1RGpVcmwwYnljbko1VFhGNEdDb1ZTckV4c1pXcXExZGxZOHRLeXNMMmRuWk1KbE1NSnZORlFZTFBCNVB1ZFFPT1ZqZ2NybWV1RkdnZHJYTzFqdEpydmE2RWhOckl6L2ZCS01oVjJFNXVkczFOWnZOQ29Ibkt3UTFBRWhLVElUSmRQUEdURDRuVVJDdUNHcXlTWHFsQlhzYnltdFpXVmxuYTlXcXRWZjJ0eEZDbElBQ0FIaFpQd2hrY0ZPcFZOQm9OTkJxdGREcjlRcXdoWWFHSWp3OEhGRlJVWWlMaTBPZE9uVlFTMG9udWxxcEVyQlpyVmFsc3FBc3FQbldnUHFtZHZpYW9FYWpzWlphclI1N3E1eXRkOUtpdk5wRVZFSUlXclZxaFlzWm1iQll6Q2l5V09CeTNaMGNiWHA5QUJpV1JXUkVKQklUcjd3ZzJyUnVqY3pNUzhndktLaldNZFByQThDcVZQK29xZDNKVXJObXpjRmZmdm5sMmFlZWVpb2JsNk9rTXJCUk9aTGdKYWZrS2NNd2hHVlp5cklzWEM1WEtTSktHZXdDQWdJUUhKdGcwTndBQUNBQVNVUkJWQnlNc0xDd2ExSmlxclNLWk5QVE53bTNnc29DWDFDVHF3c0lwWlNKaUlnWUE2RFZqUnpNNk9ob0dBekdmeDJ3eGNkZmZUb0RJUVIxa3BOUUp6bkpiNE5lcGJhYitDOEZtNXNwaEpDV2ZmdjJIUUJnRlFCQjZvL2dqWlpLcEpUd0VsTlNDZHpBY1p3Q2JpcVZxa0p3Q3d3TVJFaElDSnI0a0M5VVZmNHhlSkNWbFlXY25CekZuMVlacUYzQkJPMWZIYWtkaXJQVlpJRGpEbmVlTyt3MnJ6TVU5SVp4c2ZuRkx6ZFRkRHJka096czdNNlF5cTBvcFJwSXlidStnUVJCRUlnRWJBcHV5QjJ1SEJMTlVVbUpOMHFhbjUrUG5Kd2NoZUxvaG1sc2RydTl3bncxWDhKSUdkaDRuaTluZ21ablo4ZXExZXJSMVRXWTk5NTdMNHhHSTR3bUU2d2x4WGNrTmJqc0RFMUlxSG1uK1ZiODRwZFNFaDhmUDJqanhvMnBRNFlNRVNSL20rQnJscFkxU2FYcUJPcExSR20zMnhXdFRRNHNoSVNFSUR3OC9LcXFQSzRJYkdYejFjcEVQbjN6MVNveVFVbE1UTXdvQVBkVjUyREd4TVJjZFM5T3YvakZMOVZpa3JZWU1HQkEveUZEaG53QWdQY3hTUVhKSkJYaFpkMVZURktHWVloS3BhSXlDNGh2WUtHb3FLaVVyNjFSbzBaVkI3Wk1uNkpUWDhuUHo4ZVpNMmRLTVhlVTlhK1ZEUno0Y3F5bHBhWDF6TXJLR3UyLzNYN3h5MTBsTCsvWnMrZG90MjdkRHN2Z0JpbFNLaGZMUzAxZzVLcDVoVlB1Y3Zlcnk2WnFXVE8xcWkzOFZJbGhQNVI3aytNRjVGL01BbkVhUU54bUVFOHhDR2NESTloQkJCY2d1QURCNDkxRWpsQlJBQ2dsOGpiNC85cXc5YVAzalBMZlk3LzQ1ZTZUaEdiaS85VkxydkgzK1l1RlBBQ0JBQUpBWmJPVWdSZk5BQ3FDaWp5RjZDWVFYQlNDQXhDc0lJSU9qR0FCNGZKQlBMa2c3a3dRNXpuQWxvcjQ1RnBRcS82NTkwV0Z3WU9zYkFzTXBtS1lMVFlVRlR0aHM3bmdjTHJoZEhKd3V6bDRQRHc4SEErT0Y4RHpJZ1NCUWhRcFJFb0pCWmozbHcwZUNlQUIveTMyaTErdVRTaTljOCtkWlptdWgvZE1md1J5SU1FYlJKQURDU3lWaUNsRmtVSVFLSGhlQk1jTDhIQThQQjRlYmpjSHA1T0R3K21HemVaQ1ViRVRab3NOQmxNeExtVlZyVktubkkrdHVNU0ozTHdpRkJSWVVWamtnTlhxaE4zaEJUV1htNFBidzhQakVjQnhBbmhlSkx4QUlRaVVpSlFTVUJETHhYY2JzQ3p6aG45cStzVXZWeWNpQlF5V1NKZ0t3eUNJTEd4M2RqcmlvQVVMRmh5Wk9ISGlSYTlKNmcwbWVFMVNpSklGU2tSS3dBdUVjZ0pEUER4TDNad0tUbzhhTnBjYUpVNHRDbTA2RkZqMU1CWUZJdHNjQkVOeENQSks0bEFuZ1VOY2VBRXFxNG9zQjJ3NXVZVXc1WmZBVW1oSGlkVUptOTBOaDlNRGw4c2pnUm9QanVQQisycHJGS0FVaEFKTVNJaitOUUFKL21ucUY3OWNIYWdkTzFjZllNTVFGSEpuOThtVnBHWkM3ZVRISjA2Y3VCb0FEMitFVkg0VlFRZ0Z2RzM4Q0NFZ1VyTmxJdEVkc1NvMVZDbzFWR29OMUJvdE5Gb2R0TG9BaUNRUXhUWTE4b29Ta0djT3c3MzF6MWNJYnFWTVVXTitDUXpHWWhSWWJDZ3Fkc0JxYzhIaDhNRHA0dUJ5eTZBbXlDWW80YjBtS0tFaUpaU0NPUEpXZENlRXZQSnZtbkRqcG0zQi9YM2Z1V0cveC9NQ1JrMytBdEgxeGlHMDlwc1lQbW9USEE2UGYyWGY1V0lvakFUWU1NVEV4djlya3M2MVd1MmdQYi91YTQ3TFZPSWFTdUZESmU3Tm5oQkZrUWlDQUY3Z0NjOTVBd2VjNS8vWk8rL3dLS28yaXY5bXRtVlRJRTE2Q1VoSGFWSkUwQUFmVWtSQkJDc2xJQWdxTFlMU2xkNkQ5TjVFcFNnSWlpQktFWkFlbENJSVVnVUVFdEo3c21WbXZqOW1kNUpOSXlCTjJmTTgrMEIyWm5idTNwMTU1MjMzSENzV3F3V0xROFpQMVQ1SUpENHVqdVNVRkhRNkErZ0tjelBlTDlkenV4aTJHeEVKUk1jbWs1Q2dHclhVTkF2cEdkYk12SnJEc05udHNtQzNPMEpRR1VFQkFSQ05Sc1A3N2tzMGZ3d2JzNUZOUC96T3VzOTZzV2wxSDNidStaTitnOWU2SitZUlIxUjhvZitjVGk1QXVmTGxPMlF4YkFaUURHU3FXNG5PMWpCSmxnWEpMbUczMndXYjNaWlpGYlZtVmtWVFVsSklURXdrTGphV3lKdVJlUHY0M3Rxdy9YMDlUZzFCNDFKSlRFb2pKZFZDZXBxVmpBd2JGb3VqV0pEcHJTRkpNcktzT0FzY1lrYlV2RGNFZ1JmZGwyamVTRTIxTUcvcGJzTEdkeUM0Y1NXQ0cxZGk4YXpPckZ4emtKaFlOL1hRb3dwRkFVblMzNUduZHViMEh3d012ZmNwN1ROblRoTTJiWXJHYWVqRXhvM2ZFTkxsTFVLNmRuSVI1SW1Pam1iZ0J3TjR1M3ZYbGkxYXRtcE1GaXB4UlZIVUlvS2lpQTdtSHhSSHE0Y2syYlYyRHlmRlVZYWo1U00xTlpYazVDU05Vand4TVFtN3JNKzEwQ0lDV0cxMk5RU05UU0VoS1kza0ZBdHBhUmJTblViTldUQ3dTOWp0a21DWFpDUVp4N0lweEk4L2FxMHo2SFh2UGVnTDVPbm1rd2tkOWhYQmJjSUlxakdjSnhxTzRmdXRKN1R0ZFp0TVpQallqVlN0UDRyaWxUL2k3UGxJTEJZYll5WnZwbnpORVhnVTdVTzlwaFBac2R0VktOZG1rK2dkK2lYZUpmdFR2UEpIZkRwdmUrWVBHSlBNSzUwWDRsZjJBN3hMOXVlRlYrZHc0VktVdHIxajEwWFViVElSZ0dPLy8wMTZ1bzNnUnBXMDdjODJWRVh2RDRaZmROL2hqeWdFQVZMU2hEczZ0bktWcW93YU0vYWVqbS8rdkxrc1c3cUVTeGN2YWlTdUFGZXZYbUhEK3ZVc1dMU1VaY3RYY3VMRU1ZMDhkZjY4T1RScjlqOVdmcjZLZDk5Ny8xVVBEN09ITXh6RlVTRVZCRUVIT0kyYnl0c21TVWlPVlV3Mm13MnJMWXV5ZkhvNnFTbXBKQ2FxSVdsMFZCUUppVkt1T1RZOXdJMGJDVVRISkJPZmtFcFNrbG9GVFhPMGRsaXNkcXlhcHliaHFJSTZ2RFUxRFAxNDhFdTlLS0NDKzczR2dtVy9zSFY5UDVvOVY0WE5QLzdPSzEwV2Nuam5VR3JYVUJjN3o1aS9rNVVMdW1FeTZxbFVvU2c5KzMzQmp6di9ZT0duYjFHcFFsR1dmcjZQRjE2ZHcvRzlJNmxXUmVYck9uRDRJdVhLQm5CMHp3aU9ucmhLajM2ZlU4akhUTSt1alFrZDlqVVdxNDN3bjRjQzBHL3dWNFM4OXhuN2YxSVptanEycTBOOGdscmV1aDZSZ05Hb0o4QS84OGxzTU9nSThQZmkybzBFOXgzdVJnN0V4c1l5Y2NJNFlxS2pFRVNSOTk3clE0T25HM0x0MmpVR2h2YkhaclBpNit2SGlwVmZaS1k3aG56RWpSdlhBVlYweWRQTGl6VnIxd0VxcmYrY1dUTklURXJFMzgrZndVT0hhVm9XQU91Ky9vb05HOVpyK3dQMGZLY1hScU9Sc0dsVFhNYjIrNGtUUEZXM0xwNmVudGp0ZHZ4OC9UaHgvRGoxNnRYbnhJbmpmUENCU3VqajYrdGJyMFNKNGkwdVhicTBHYkE1WGxvaFFWRVUyUkdTT2xZa1NPaDBkdXgyR3phYkhxdk4wYWlibms2YVNRMUpFeElTaUltTndXVEl2YWRObjU1dTFYcldFcE95VkVFMW8rYklxemx5YTQ0UTFPbXRDU2YyZlZ4SXB4TjdQU3dYd2xzZDY5SHNPWldBOHNWV05XamVwQ29MbC8vQ29wbXE5bVdiRmsveVdudVZhQ1F1UHBYUFZoOWcxWklldk5SYVZmMmVOcTRqaDM3OWl5bXpmbUxsQWxVNXZWalJRaXliMHhXVHlVQ2xDa1g1N2ZnVjVpemVSYyt1amJsOE5aYlNKZjBvV2R3UFQwOGp5K2QyNWRxTmVHMDhiM1NvcC8wL0xkMktoNGMrbHlTckhvdlY3cjZMM2NpQnI5YXVwa2FOR29SMGU1dExseTR4Zjk0Y0dqemRrRktsU3ZIMStnMmNQMytPaWVQSHVSd3phY28wQUJJVEUrajlUZzgrR1BnaG9NcjJUUncvbHZFVEoxTzhlSEYrK25FckMrYlBZL1NZek9OcjFxcVZnM2s0TDRIbHhNUkVQRHc4aUk2T1p0S0VjVWl5aEk4alQ1aVltSWpKdzRQdk4zM0hqaDNiOFBUMGZMVkh6M2YyTEZ1NnhPbzBiSTVWQ1pJajM2YklpaUlJYWtpcTJDVzdZTFByRkwwekpEV29JV2w2ZWpxcHFTbHFTQm9majBFdmtwNHVZemE3amxHOEVhbUdvUEdKbVQxckdlbVpCUU9iemRtemx0VmJBOW5oclZXdFhMd25VTzFodVJEcTFIU2xvYWxlcFRpbnp0elEvcTc0ZU9aQzh6Tm5JNUJsaFliMXlyc2MwL2pwQ3Z4eEpsTlhzMjd0SUV3bWcvWjMvYWZLOGVlNVNHUlpac2lBbG56LzQrOEVQajZRTnEvTjRic2ZUbEM5U3U3TXJHWVBBMWFybE9OOWk4V09sNmZSZlJlN2tRUDE2amRnNTQ3dHJQeHNCWmFNRE1LbXp5alFjYklzTTJiMEtOcTgySmI2OWRWZzZxKy9Mbkh0MnQ4TUh6cVk3aUZkV0wzNlM2SnV1dW9MVktwVW1WYzZkQ3p3K0U2Zi9vT1JJNGJ5VHU5M2FkclV0U2QvMG9SeFhMNzhGMkhUWjJJeW1hcDA2OTdqZVZ3S0NZNEtxWm9TRTFDOU5tUlpRckpMU0hhN1F5dEJyWkphTFJZeUxCbWtwNlZyaFlURXhFUnVSQ2JtOU5qVW5yVVVraHplV3JyVFc3TTRRbEJuejVva0M1SmQ5ZGFjemJobndzZjQ2WFJpejRmcFFwQ3phVnRtV096b2RKbkYzNndHSkx1Vnovb1pXWVYramRuY1hiMWVSSzhYRVVXUnRpL1U1UHFaS1h5LzlYZCszUGtIdzhkK3kveGx1em04WXhpZTJZeFZxUkorWkdUWVNFaE13N2V3cDVhL2k0MUxwV1J4WC9kZDdFWk93MWF2UG5QbkxTVDhTRGlmcjF5QjBXaGt6TGdKdHp4dTJkTEZlSGg0MExsTDF5eTVZaHZGaWhWekNWdi9DUW9YTGt4R1JnWmgwMmRTcUZBaFRwdzRUbUZmWDIzYk00MGEwNkpsSzgxYkxGNjgrS3U5ZXIyN2MvSGloZFlzNGFpZExMeHRMbDZiWFJKMGRydmlVaVcxV0VqUFNDYzFOWTNrNUdUME9vR29hSmxpUlF2aDVXbks5TmhpWXBOSlNFeFhlOWJTclZyQndLWlZRZVZNYjAxV3ZUVm5idTN4Y28rOURUeitNRjBJNFVjdnUveDk2TWdsYXRmSW5VMjFZdmtpNlBVaUI0OWNjbm4vUVBoRnFsVEt6RHVjdmVENlZEdCs4bStxVlZZSklZZU0yc0Q1aTFGMGVlTnBWaTNwd2Y2ZlB1TFU2UnNjUDVtVFE2cDJqZEtZelFiMkhqaXZ2YmZ2MEFWRVVlRHBiRjZqRzI0QVRKbzRudkFqNFRSdi9qekRoby9rMEtHRExnL2QzTEJ2MzE3MjdON044QkVmdXdnV1ZhaFFnYVNrSkg3WnMxdkx0MzIvNlR1WFk4K2ZQOGZHamQ4VWFHeFAxcWlCMVdyRlpESWhTUklIRCt5blppMVZ5N1JXcmRyYU9JLys5aHRCUWVVd21VemwrL1R0MTV4c1JZVHNYcHZzOU5yVVFrSm1sZFNtQ2k5Yk1qSklUMWR6YlNrcEtjVEVKaE41MDlWcjA4Y25xQ3NNVWgzZW1zVmlVOWRzT1VOUW04TmJrMXk5dGQvMkRQZlI2Y1MzSDdxY3hJWmZlYWIrNHp6ZnRDb3JWaDNnNU9ucnJGclNJOWQ5Zlh3ODZOZXJHWU5HcnNmYnkwU2xDa1ZaL3VWK0RvWmZZdXJXRDdYOS9qaHpnNFhMOS9EdTI4RWMvdlV2NWl6YXhkSTVYUnhHTDVJK0g2NWhYdGliQlBoN3NXTFZBYnk5VFpwaFhQdk5FZUlUMG5pdlJ6QmVYaVo2ZEdsTTM4RnI4Zkh4d0dqUTB6djBTN3AzZWdaL1B5LzNYZXhHRG5UdTNKV3dzQ21zWGIwS1daWVpPT2dqUkZGMEtSNGtKaWJ5V3NkWHFQUFVVd3dkTm9LNXMyZVNrWkZCbi9jeVU5OXo1eS9DeDhlSFNWT21NZlBUNlN4YXVBQlBUMDhHWmhOU1BuYjBLQnMycktkOSt3NjNIRnZac2tHMGI5K0JkM3YxUkVIaDJXZURxVmV2UGdEdjkrbkg1RWtUV1BmMVY1ak5ab1lNR3c2QW43OS9oL2F2ZE5pK2NjTTNOc0RxTUc1MlZHVXJsVzFYYmRwMTVOcFVyeTFybGRSaXRXcTliVG9SNGhNa29xS1RLVjdVVjR1U2hGbVRYK1ZHUkR4Uk1jbkV4NmVTbUt3dWVrOU5zMnBMcVRJc2ttQzFTdGp0aWlESmlxZ29pTmJvK2YxME9qSHNZYm9Jbm00K21TZXFsdURDWDlFY09uS0pHdFZMTVgxOFI1NTlSbTJwcU50a0lpKzNxY25Jajlwb3gxaXRka2FPLzQ0dnZqcEVRbUk2dFo0c3pmaVJiZmxmc01yOTlPSEk5Wnc1RjRHZnJ5Yy8vM0lXblU1a2FHZ3IrcnpUQkZEYlBRWU0vWXJ0dTg2UW5KSkJuWnBsbURhMkE0MmVWbVhRT25aZHhPV3JzZnk2ZTdnam4yWWpkTmpYclBubUNLSWcwTEZkSFdaUGVRTVBENFA3TG42RXNlZDQ1ZitrNmxwdWlJK1BuMWpqaWFyZkF5bEFLcEFtQ0lJRlZkM0s3bEMxa25VNm5XSXdHakVaVFlxSGh3a1BzeGxQc3lkZTNsNzQrQlRDdDdBdm9nZ05hMG1VRDNxTWFsVktVRDVJcFRVU3hvOTh5WFVabGNON1MwMnprcDVoSlNQREpsaXNFamFiSWtpU0xNZ3lZdWZYNitrL1c5RGpNUERrdzJiWVdqV3Z6dWloTHoyeU40aWlnQ0M0di92RE1tY0YvZXhIeWJBcGl2SkhvNFlOM3YvNzc2c3BEdU9XSmdoQ09tQkJsZXlUUkZHVVJWRlVEQWFEb2hKUGVpZ2VIaDZZUGMxNGVucmg3ZTFONFVLRkVRU0Zlay9LbENubFQ2VUt4YWo1UkdrOFBBem9VeHk1dFl3TUcxWkwxdFVGV1JhNVordGJXenFuVzVlSHphaGxoK0RiKzEvM2cwZWVtMGJSSXJlL3JFWlM5RnlPcWt4OGtoNUpGc2xJZnpSVnFqek1ablNpZ244aE8wRkZ6aUlLZWJmUXlBcGNpYWxNYklJSlNkYmRzemxUeHlRVFdOaEMyY2ZPM3RMSVhiOTI3Vkg0cWFvdldMajQyUmZidE5ycHlMWFpGRVd4Z1dBWEJMV1FJTXV5QUNnMm15M1RJT0pZNlNTckt4VThUQ2ExdVRsRklqRXBrOW9vcUV3Zyt0UTBpNE81STF0dVRaS1JKRm1RSk1XeHlrQjlvU0RxOWJvdUQvMVRJV0hSSTNFenA5djkrUDFDS2ZRR0Qzd0t1M1ZGVTFOVGlFOU9JaWFoS2pVZnY0cEpuNWlyVWZ2MTNCUG85T2I3TW1lcHFTbkVKaWNSRmY4RTlTcWR5dGU0bFN6MWFCRGpGQzlSb2czd2k4T3dXUUc5SUtESDBkZUdxbXdscU12UUJRVUVRUlFFUlJUVmJnUlJwOE5pdFNLZ2tKb21rWnljUVh4Q0dqRXh5WlFxNFllWW5tNVR2VFdyU3lNdWRydUVKTWxxSmRSQm5xU0FrSFp6Ym11ZzhjTTRXWWQyREgza3d0REl1Q0xvRFI3L0tWYUlmd0l2TDIrS0ZpdUJUdTlCUkZ6dWlsK1hvNnVoMDV2djI1eGxqc25NbFpqS3VBR2lLRGJjcy9kQUxUSkpLQTJLb3VoUUs2U3FOVk1VRkVWV0s2U3lNNHJNdXBaVWxTUklUN2VSa3BwQllsSWFzZkdwUkVZbElhWnJQR3RxejVyTkxtR1hIRWJOR1lKbU1uZ0lSb1B1VGZmUDh2QWdOdEgwbjJTRitLZnc5aWxFVEtJcDEyMXhpZm9ITW1mZVBvV0lTVEM1Znh3SFNwY3VuYjMxdzhuOG9YT3lmamhvalpBbHRmM0Q3bGdrYjdmWnNEcGFRTkl6cktTbVdVbE95U0FoSVkyWTJHVDBGa3NtZWFUV3M2Ym0xZ1MxYjAxeFdFNkVoQ3N6bnhRRTRkWGJDZ2tmNFdUMnZaNGZTZFloeVRxM3A1YUhsNVFZSDRzc2d5aTZ6dmVEbWpOMVRIRjM5SnNuSlNaeSthK0xwT2Fqb2V2bDVVMVF1Y2NwVkxqd1hSbnZ2VDZud1dCb3UvYXI5Vis5OFhySEMyUlNoK3NGUWJBN3dsRlpsZXhUQkVtU0ZVbVNCTWt1S1U2dnpXNnpBUW9XaTB4NnVwWFVWQXVKeWVuRXhhV2lWM05yV1pkTnlRNXZUVmFMQmdvNCtkYTh2RXl2RjJUQS96R0s0M3Y3RlBjRW5VNmlpRzlDdmxUSHVVRW5Tbzlzb2FBZ1NFOVBkekZxb0JxVUJ6bG42ZWxwZC9RZysrdlNCZExTVXZQZEp6VTFoY3QvWGFSR3JUcDNaYXozNDV5MTY5UitEcmlhSmRkbWRYaHRrcUtvdVRaRmtSVlZ4VXB5cFRheTJ4RlFzRmdsTWl3MjFXdEx6aUErTVExOUZ2MENOYTltenl3YXlBNVhFQVZoODFkOVBFUlJlTDBnUnUwL1JuRjh6NUdhbWtKRWdsKytWTWQzaXUzYmZtTEY4bVZFUmQya1JJa1NmUDdsR3M2ZlAwZVA3aUhhUGtPSGorU0ZGOXE0ZjRpSEdMY3lNRm12cFgvVE9UMDl2ZHEwZTduOSt1KyszV2pKekxWaEV3UkVVQnk1TmtGUUZCbEpraFZKbGdTN3VrZ2V1OTJHQUZpdE1oa1dHK25wVmxKU00waEtTa2VmblVEU25pVzNsblg1VlBPbTFWNEZTdDlxb0ZrcGp0MG9lSWppNWVYTnpVaVptL0YrRlBPUHZ5dWZlK1BHRGFaTW5zaVljUk9vVjY4K1NVbEpBRlNvVUpIdE8zY0Q4RTZQYnZmc2V5MWZ0cFIyTDdjbklDQWd4N2htelpqT3laTy9ZelFhYWY1OFM5NTd2NC9HS25IdDJqWG16SnJCeVZNbk1abE10R2pSa2w2OTM4dkJPbkUzY2F0elB0ZTRJUWFEQVVFUUNRb0tvbnVQbmpScTFOaDk4ZjV6bEJyNThhZ0czMzI3Y1JmYUVpdEZEMEttUG9KS0lhNWt6YldwaStRbFFNRnFrN0ZZN0dSWWJLU2xxN2syMFJtQ1NwS2MyZUloWjdaNDRHengwT2tLdE9UL3YwcHhmRi9DMG55b2p1OEVaLzg4UTJCZ0lJMGFOY1pvTkJJWUdPZ0l4d1JNSmhNbWs4bGxMZUhkeG1jcmxoRVhGNXZqL2RHalJsS3lWQ2syZnJlWnhVdVdjK2pnQVRadCtsYjErR1dab1lNL3BGTGxLbno3M1dibXpKblBudDI3MkxqaG0zczJ6b0tlYys3OGhYeS9aU3ZkZS9Ra2JPcGtObnl6L29GY0o0SWdVS2RPSFZxMGFFSHo1czBwVWVMMm5BaEprdGkvZngvRGhuekV0Yi8vdmk4cGdiRmpSdkhXRzYvUnZWc1h6cHcrclczNysrcFZ4bzhiMDR3czFWRWM2MGVkREx1U0pBbVNKQW1LSWd1U2F0d0VwN0N5SktrUnA5VnFkL0hhTk1QbTB0NGhPU20vMVJhUCtLc3puaEFFV3Q3cUMvd1RpbU0zVk04dEw2cmoyOEh4NDhkNHVXMGJwazJkVEdSa0pDKzNiY1BMYmR1dzhyTVZCZjZNUXdjUDBQbXROMmplTEpnZTNVUDQ0OVFwbCsxN2R1OGlwR3NuWG1qMVBOMjdkZUhRd1FQYXRuNTkzK2ZsdG1wbys4R0EvcnpjdGcxOTMzOVhNeUxCd1UzcEd0SU5rOGxFa2FKRnFWdXZIdWZPbmdVZ0xpNE9QMzkvT25YdWpORm9wRlRwMGpScS9DeC8vbm5tbnMzNzdaelRiRGJUcUZGamhnMGZ5WkxGQzEwWVplOFh5cFVyaDA2blk5dTJiZXpkdTVlYU5XdGlNQmh5TmRpNS9YOUEvNzc4c21jM1o4NmNScEtsMnpwMzQ4YU4wZXYxZVQ0Z2N2dDczZGRmNGVucHllcTFYek40OEZER2p4dUQ0cmpJWjg2WXpzdnRYMm0yWnUyNjBtVFRId1YwZ2lBSW9pZzYxNDRpYXpVQVNYczVxZFdzRmpzWkdUYlMwcXlJem9LQlhTc1lPTFVNdEtLQjRPM2wwYjVnVDVJN3B6aDJRMFZLcXZDUGMyeTFhdFhtMjAxYkdCQTZrSklsUy9IdHBpMTh1MmtMSWQyNkYrajRpeGN1OFBISTRielhweTlidG03ajFkZGVaK0FIL1RYdXJpdFhMak4rM0JpR0RCbk81aDkrNHFXWDJqRml4RERTMHRTay9KeTU4L2wyMHhZQVpzeWF6YmVidGpCMy9rSUFSRkdrVStjdStQcXFudWxmZjEzaXdQNzlOR2p3TkFDQmdZSE1tVHNmRHcremRuTWNQM2FNR2pWcTNyTTV2NU56MXF2ZkFLdk5waG5rKzRuQXdFQnUzTGpoY0NaVWlpMC9QMWRQLzhpUmNFWU1HNExOWmlNdUxvNTNlblFuTGs0VkcvNTB4aXlHRFI5NVJ3NUlRRUJBbmw3K2h3TkRPWDdzcUdiTUZzeWY1N2llem11L2I5VnExVEVhalZ5N3BucUs1OCtmbzBHRHA2bFZ1MWFEWEx3MkVSQVZCVUVRQkxYdFE4bGFSSEMwZ05pemVtMTIwak9zaUhaSjFzUlpuR0dvckdTeWVLQW9naWdLTC8rVEgyTFF3RkJlNjlpZWtDNXYwYlh6bTJ6Wi9MMlcxM2l0NHl1MGIvY2kzVVB1N1dLRzdpRmR1SGp4OW5RRnR2MzBJNjkxZklVWFdyZGc5cXk4Q2Y1MjdOak82RTlHL21lTTYrYk5td2h1MHBSR2pScGpNcGxvMWZvRnFsU3R5amFIa0VkQVFDRExWM3hPdGVyVkVVV1JsOXEydzJhMTh2ZmZWd3Q4amo5T25hSkY4NmFFZE9sRWxhcFZlUzY0U2E3N0xWd3dEN09uSnkrMHVYODZRUVU1cHlBSStQdjVrNUo2LzBWNGpFWWpraVFSRUJCQTQ4YU5rV1VaazhtMVA2NXUzWHI0QndRd1p2UW5EQm80Z1BhdmRNRGYzMTg3L2w2Z1Q5LytUSnd3bnJselpyUDFoeTEwNmFvV3FCNnZVSUZmOXV4QmxtVXVYYnJFelp1UnBDU3I4L2I0NHhYWXMzc1hYbDdlemJNWk5YMm1jY3ZzYVZOa1J6anExRWVRVk1kTVZaS1hzRmh0cEdmWUVMTVlOYTFnSUN1QW8yaVFHakczR1hlQklmZWpJY05ZK2NWcTVzeGJ3T2NyVjNEcDBpV04zbmhxMktjUDVRM2VvbVVydmw2L2dXN2QzdVpSUW1Sa0pNV0x1K1p0eXBRSklqSlNaUlgyOXZibXQ5OStwWGV2SG5SNjgzVzZkZTJjYXlpU0g2by84UVRiZHV6aXEzVWJpSWlJY0ZFNGN1THpsWjl4K1BBaEprNmNuR2Y0YzdkUjBITXFpa0pjZkJ6ZUR5anRVcTVjT2FwV3JjcisvZnUxb2xCMnc5dTc5M3NjL2UxWFRFYlRQM293bU0xbU9uYnNTTWVPSFRFWURMUnIxNDZPSFR2eTJHT1B1ZXozZUlVSzZqM3oxUnA2OVg2WFFvWFVYUHVycjcyQlRxK2plN2N1ZlBINVozaDdlMlAyVkwzalFSOE81dWVmZC9KMjk2NVZ1b2FFVkhFWXM2eDVOcDJpS0NwWG0zTTFnaXdqT1VOVFdkWTZPbFN2VGNKaXNhR1hzcXd5Y0RUa09zTlFBTUZrMHJlOW16OUk0Y0srUFBGa0RTNWVPRS81OG5tVEt5WW1KakI1NGdTaW9xS3cyMjEwNnR4VlkrTThjK1kwTTJkTUp6MHRqU0pGaXpGMDJBZ3RNYjU3MTgrc1h2MGxsb3dNcWoveEpCOE0vRkRMUCt6NmVTZGpSMzlNZW5vR2ZmdjExN3lFYjlhdlU1UFhpa0xUWnYralcvY2V0L3dlUjQ2RTgrbjBhWWlDU01sU0pmRTBlMnJiOGh0RDgyYkI5Qi93QVV1WExFSlI0UHN0V3g4NncxYTBhRkVpSXlKYzNydCsvUnExYTZ1OVNudC8yY09xTDc5Z3hzelpsQ3F0RnNxZmE5d3cxNXNydTdHelpHU3dkZXNQdEc3OUFpWVBENG9YTDA3ejVzK3piOTllbC8zV3IvdWE3ZHQrWXRhY2VYZXQ0ZlJXdUoxekhqa1NqdEZnb0ZMbCs3OUV5bXExWXJmYk9YcFVEZnQwT2gwV2k4VTFwWkdTd2tjZkRhUnpseERPbmYyVEtaTW5NblRZaURzcUZxV25wN04rdlZvb2FkZXVIVC84OEFOWkY2ZG5qWEIyNy9xWjhSTW1NVDFzR2hNbVRhWlNwY3FZeldhR0Roc0JRRkpTRW0rODFvRVNKVW9DVUtwMGFUNmRNY3R4Myt4cStQbktsWDlrTld5Q0lEakNVVVhJR25xcktUTUpSUkdRSkFXN1hmWGFiRFk3Rm90ZERVVlZiMDBXSEVVRFRhaEZVUlJSRUlTN0dnTkVSMFZ4NnVUdlZLbFNOZC85enAwN3gvK2FQOCt5RlN1Wk0zY0JzMmJPd09wWUd6YnE0eEdFaGc3azh5L1g4TXd6alZpeWFJR1dyMW0vZmgxejVzeG41UmVyQWZoaHkyYnRNMzE4ZkZqNXhXcEdqeG5IL1BsekFaVlliL1BtVFN4Y3RKUWx5ejdqdDk5K1k5ZlBPL01kbThWaVljSzRNWXdhUFpZdlY2K2xUT215MnJaYmpjRnV0eE1WRmNXNmI3NWwvVGNiSDVqeGNuWnZBeWl5ak4xdTE0eFFteGRmWXMrZVhZU0hIOFp1dC9Qenp6djU0OVJKV3JSVTYwZXhzYkVJQW9nNkhZbUpDYXhlOWFYamMxeXJIc1ZMbE9EUXdZUFliRGFpbzFSSlFxUEp4QmVmcjJUdDJ0WFliRFlTRXVMWnUvY1hhdFNva1JrS2Y3K0piemR1WU9ic3VWcjRkTS9EN3dLZTAyS3hjUGpRUVNaUG1rRHZkOS9IeSt2K0U0UkdSMGRyQnNwb05PTHI2MHRDZ3F2SzJjV0xGd2dPYnNwYm5Ub3o4cFBSR0kwbUxjZDJyM0R5NUVrK25UR0w1NEtiTU9MalQvanQxeU11MjVPU2twZzJkVEl2dnRRMlJ6ajg5OTlYV2JaMGNiTXNJYWhXUkhCNGJLSWdDQzdMckZRYU5kbFJJM0ROdGVuVlNxaXNlV3V5eW1FcEFFSjY1THpXUU1tNzhhV25oMDNGN0dIR2FETFNwMjkvU3BjcGsrLytOV3ZXWXZteUpXemI5aU02blI2TEpZUGs1R1FTNHVQeDl2YWhhclhxQUx6VXRoMU5telVENFBEaFExejcreXJ2OW41SGU3SjVlL3RrNWgwYzdKNVZxMVhURXVIaDRZZDQvdm1XbU0ycWEvemlpeThSSG42WXBzMytsK2ZZcmw2OXdtT1BGZEdNYzVWcTFkajN5NTRDalFHZ2EwaTNlNWJuS0FpeU4raE9tVHlSS1pNbjhueUxsbno4eVdncVZxekVxREhqV0RCL0xwRVJFWlFwVzVhcFlaOXFNbTJ0WDJqRHFWTW42ZEc5S3pxZG5uWXZ0NmRpeFVyRXhidmVPQU1IZmtqWXRLbXNXTDZVTW1YS3NIVDVTb3hHSTFPbWhqRjN6aXkrV3JzR2c4RkFjSk9taERqQ2ZVbVNtRFpWRFFQZmZOMjF3K2p6TDFkVHJGanh1ejRmQlQxbnZ6N3ZJd2dxYyt5Z0R3ZmZ0VDQyUlFGdno0S1h3aTlmdm95dnJ5L05temNINFBqeDQxaXQxaHozdzYyQXVRQUFJQUJKUkVGVVQ4MmFLazIzWHE5blVEYW0zRHZGZDk5OWwzY3VQY3M1YXRXcVRhMWF0YlcvRnk5YXdPNWR1L2hmOCtkekZMSDY5M3VmbE9RVVFycS9YV0wwMlBGUE5ubXUwYS9aOG13MlFiWGt6bkJVVVlzSU1vS2dlbXlTbzFiZ3pMWHBKYWZ5bEhQNWxKcGJBeENNUmwzcnUzWHhEUHB3c0VZYlhCQ3NYYk1LdTgzT2xLblRFUVJCYXg5d2hqaE9HQXdHL1B6VUo2ek5haU80U1ZOTmJpeS94Ry9XRUNtcmR5NElnbGFLemkrL2tsZXphRUhHSUdaZjUzT1AwTEpWYTFxMnl2a1RWcXhZaVYvMkhjejMyRWFOR3VkNTQ1cE1Ka1orUE1ybHZYZDY1ZVMvcTkvZ2FiNWV2eUhIK3hVcVZtVG03TG01ZnJaT3AyUFAzZ1AzMWRBWDVKeTNtcTkvQWtFQXZjNU9hbXBLZ1NxVmlxSnc3Tml4ZjN6ZVZXdSt1bTl6M0t2M2UvVHFuYnVtK3V3NTg3T21LdW9CeDdPRm83cHM0YWlneUxJaVNYWkVRVVNTQk1maWdreXZUWlNkWWFpakdxcVN1V2xoYUdzZUVLS2pZL0QyOFVZUUJJNGZQMFpTVWhLS29sQzZUQm1TazVNNWYvNGNBRC85dUZVVGNxMVh2ejQvNzl6SjlldXFXT3pPblRzNGVmTDNmTTlUdDI1OXRtL2JSbnA2T2phYmpSKzJiS2Erb3pTZEY4cVdEU0k2T2xvcnVVZmN5SlQzdTVNeC9KTW52VGxMYnMrTjdFbHZ6eHc5Z1E5NnpuSWJFMEFSM3dSU2svTVd6ZmIwTEZqSVc5RDk3dVpuM2Mxem1qdzhtbVR6MXB3OWJhTGo1U0RsVUFSSmtoQUV1eUE3bzg0c1hwdGVDME1WQlNWTEdKb1dNYmZwM1FwRDgwSitnaFN2dmZZNlk4ZU00b2N0VzZoY3BRb1ZLbFlrTVNHQndNQkF4b3diejZkaDA3QllMQVErRnNpUW9XcGlza3FWcXZUclA0Q2hnei9FWnJkUkxxZ2NnNGNPeTNjTVQ5V3RTOHRXclhtM2wxb3dlUGE1SmpSdDJreExoaTVkc3BpVTFCUmtTV0xmM3IxMDZSckNTMjNiTVhUNENFWU1HNEtmdno5NnZVNHJIdHpKR1A3SmsxNFU1UUkvNlI4bHBLWWtJNHB5anA1QWRjNmtCekpucVNuSjZFUXAxejdGWXY1eDNJajFKeXBTd2N2SEw4Zll5cFd2Y010RjZaNmVYcFFyWCtHdWpmZEJuQk1vc1gzSHJzclBOMjk2Z2l3MFJrNmpwaG8yQkZtV0hlNGJTTEtnZFhZNEs2UkNrVUF6RnF0ZHNGcGw3SklpeUtwWWk4NFdzMkNTS0FvZjNPNm9IaVh1OW51QmkrZi9KTGhXd1pzK0wwZFZKamE1a0h0dGJqYmNqTHhCUUtFa2doN0xPWmVYb3lzVG0zVC81eXkvTVRtOXlhajRRa1RHQjJDVGpLUStvc1F0NmVucFMxdTNicjBLVlE4aEdWWHdKZDBoK0dJVEJDUlJGR1NEWGxDTVJoR1RVYStZUFF5WXpRWTh6U2E4dkV6b25XR29rb1hKUTFFVVVSU0Y1dmM2Q2VwR1RuaDdLcmZGMTFVbThEeFI4ZFc1R1hrRGJ4ODNOWGhxU2pJcEtjblliUm1VQ1RpWGV5b2g4Q3hSY1UvZXR6bHpqa215cDFNMjhHeStIbmhSL3lTSytpYzk0cUk4U2tQZ3F5emhxTTdCOXFGV1J4RWNDK05CbGhWRlZwdDJGVWxTMUFxcFhVS2ZyU2tYQllTNHl6T3FjUWRpTGJlYkJIVWo1dzJnMTlsdjY0SVdSWm02bGM1d09ib3ljWWxXRXVMaXlNaDROQi8xWnJNbm9pZ1RVTmhHMmNmT0lRcEtudGRwdlVvbnVSSlRtWmdFeXoyZE03UFpFNTBvRWVCcm9XemcyUUwvdG84eU9hc2dDTlczcnU5YnZIWEh1WDlweGsxQmgrRElzWUVnS0tyTmttWFViZzVIWmRUNTBxdlUzOW5XaG5wN05MblRRUlh4VFNBaUljRnQyTzRBS1NtSmxQUzdmY29pVWJCVHZzZ2ZsQy9pbHQrN0hjTVI5TmhaZ2g1N09PVDMzSERGVTdXQ3FnRi9PdzJiQWpvaGF3RkJ6YlVwaXFOTlRYS3NSbkQwdHlFNnZEVUJiVzBvZ2s0VW43dlRBUlh6ajBPUkVvaTZlWTIwQjdDTzd0K0l0TlFVb2lLdWdwUklVYjkveHNYMmFEL3BINzQ1Y3h1MU80T3ZyMmN0MUtLQm5zd0NnaXIwb3RHcEtZS3NJRGk4TmtHV2xTd2VtNU9leU9HeERlclhUQ2NJQlArVEgvS3BTcGU0R2UvRHpmZ0FraE9OcEtTNmY2aTg0TzBGQnAyVlVvRnhGUEZOY2srSUcyNEFCcjJ1WWMzcXhRd24vb2pVWndsSFJRUkVCVVVBUVZBVXh4SXJ4Ykc0d0VHN0pza3lncGRaSjlqc2lpQ3AxVkF4K2Zyc3BwNW00NC91cVhYRERUY2VKSTZldU5MbnFlQ0pwOGhTSFJVRTBnR3JJQWcyUVVEV2FkVlJIUjRtdmVMaFljQnNOcUszUzFrV3ZpdUtjRE1xc2VIOTZveDN3dzAzM01qVGF6UG9LZ04vWmcxRkZRVlJFRkE3T0JDUVpRVzdCSUpOUmhEc2FzZ29nT0RoNFNIYTdYWkJVUlJSVVJTZDNXN2ZKQWpDOCs1cGRjTU5OeDRrN0hiN2JvUEJNREdMeDVZaUNFSXFZQkVFd1NvSWdpUUlncXpYNnhXajBhZzQ2TzRWczltTTZGd1hxU2lLOE9xcnIrb0VRV2pvbmxJMzNIRGpRVU92MTljdFc3WnMxc0tCVmtCd09HS3VWRVpaWG9MUmFCUWxTUklWUmRFbEppWTI5UGIyM3VXZVVqZmN1UDlRRklYSXlFaHUzb3hDa2lSU1VwSWYrVGs1ZGVwVTc3NTkrNTUxZW15T1Y3b2dDRmJBN3ZUYWREcWRvdGZyTVJnTWlzbGtRcCtWeWNMRHc2T3UrL0p5dzQwSFk5U09IVHVHZ3FDdGhuRHI4WUt2LzJQbGdRdGthZnR3a0U5cWpUU0NJQ0FJQXFLb1E2L1hvOWNiTWhlV0FvSk9wM3ZxMy9qbFEwTkRhZFdxVllIMlRVbEpRUkFFZHUvZWZjZm5xMVdyRnBNblQ3N1R2QUdob2FFVUtWS0V3b1VMMDd0M2IwMEV4WTFIRjVHUmtTZ0lGQzFXd3QzY25nVStQajZWczRXaG9wTjRNcXZ0VWhtSlpMV2ZUWkhWSEp0em5hZ2dDSFhjVTNsdk1XellNRFp0MnNTNmRldll0R2tUTzNmdXBGKy9mdTZKZWNRUkZSWHQxdVBOQlFhRDRRbHk1dGl5R1RVRmxXNU5RVkZrRkZuV2R1RDgrZk5GZ0VydXFieDNTRTFOWmQ2OGVZU0ZoUkVjSEV4d2NEQ0xGeTltNWNxVnhNVEV1Q2ZvRVlZa1NYZmtxWjA1L1FjRFEvdmY4L0dkT1hPYXNHbFQyTzVRS25OaTQ4WnZDT255RmlGZE83a0k4a1JIUnpQd2d3R0VkTzFFM3o3dmNmWHFGVzNiaVJQSDZmbDJON3FGZEdiMEp5UHoxV1lWQktIQ3lJOUhlZWRqM0FBRUhBc05uTTI2enFxb1VLSkVpU2YvS3hmSmQ5OTlSLzM2OVRHYnpYaDVlZEc4ZVhQT25YTmxldmpsbDErb1ZxMGFIaDRlTkd2V2pMLysra3ZiSnNzeVk4ZU9wWFRwMG5oN2U5T29VU1AyNzkrZjY3bWlvNk41NVpWWDhQUHp3OXZibXhkZWVJRUxGeTVvMndNREEvbndRNVZOOTlpeFk2U25weE1jbkxtdzQ5bG5ud1hnNE1HRDdydjdFVVp5OHAydE9xbGNwU3FqeG95OXAyT2JQMjh1eTVZdTRkTEZpeTVHNk9yVksyeFl2NTRGaTVheWJQbEtUcHc0eHBFajRZNWo1dENzMmY5WStma3F1blYvbXltVEptcXBtRWtUeGpIeWsxRjh0dkpMU3BVdW8ybG01SVZubndzdTRUQmtMb1NUanJCVVc0R2dLbGlwWHB2bTBoa01oditFWWZ2OTk5OTU1WlZYNk55NU0yZk9uR0hIamgzY3ZIbFRNeTVPekpvMWkwbVRKbkg4K0hHOHZiMXAxcXlacHJ3emNlSkVsaXhad3BJbFN6aDU4aVFkT25TZ2VmUG1uTTFGSERjME5CU0x4VUo0ZURqSGpoMURsbVZDUWpMMUJBWU5HcVJ4MDErL2ZoMmowVWhBUUVCV1Y1dUFnQUN1WGJ2bXZydmR5SUhZMkZnR0RRd2xwTXRiZEF2cHpPRkQ2Z1BRcWNuYm9YMWJRdnU3cGpLR0RmbEk5YUs2dkVXN2wxN2d6VGRlMWJaZHZIaVIwUDU5NmQ2dEM0TStHTURObTVFdXg2NzcraXVYL1FGNnZ0T0xzT2t6S1AvNDQ2NzMyb2tUUEZXM0xwNmVLc21xbjY4Zko0NGYxN3l5NTU1VEgrQ0ZDeGZtenovUFlMVmFpWXlJd01Oc0ppaW9IQUQrL3Y2Y09KNC96WG54WXNYS1pERnFqanhiMW5CVXlReEoxVHdiZWxCNzJIUTZYZlgvd29XZ0tBcWZmdm9wL2Z1cjdubFFVQkFoSVNFc1dMREFaYjlQUHZtRWR1M2FBYkJpeFFwS2xTckY1czJiZWVtbGw1ZzhlVExMbHkvWENoSURCdzVrMTY1ZHpKdzVNOGZuWEw1OG1kS2xTMU95WkVrOFBUMVp2bnk1aTVFYU5peVRQVGN0TFEwUEQ0OGNZemFaVERuazA5eHdBK0NydGF1cFVhTUdJZDNlNXRLbFM4eWZONGNHVHpmVU5IblBuei9IeFBIalhJNlpOR1Vhb0VwWTluNm5oNmEvWWJWYW1UaCtMT01uVHFaNDhlTDg5T05XRnN5ZngrZ3htY2ZYckZVcmg1NUhYc0pEaVltSmVIaDRFQjBkemFRSjQ1QmtDUjlIbmpBeE1SR1Rod2ZmYi9xT0hUdTJZVFFhU1VsSklTa3BDWlBKaE5WcVplNmNXZHk0Y1NPSHdsWjJlSGw3bDh0aTFCd0dUaEVkRkFPT1hqYWN0UUpGVVJSQjcyeHlFd1RoUDJIWWF0YXNTVUJBQU5PblQrZk1tVE9jUFh1V1gzLzlsYUpGWFl2bmpSdG5DcFVFQkFSUXZueDUvdmpqRDU1ODhrbFNVMVBwMXEwYmI3K2RLWlJzdFZwZGpuRml5SkFodlBubW13UUdCdEswYVZOZWZQRkZ1bmJ0bXV2WXpHWnpEalVoVUNYZEhvU01teHNQUCtyVmI4Q2NXVE1BZ2ZyMUd4QTJmVWFCanBObG1UR2pSOUhteGJiVXI5OEFVS1VocjEzN20rRkRCNnY3S0RKZTJmUUtLbFdxVEtWS0JkZEtQWDM2RDQ2TkdFcm9CNE00KytlZlhNeVNocGswWVJ3QmdZR0VUWi9KcXgxZWRqR0lBejhZd0lzdnZrU0hqcTh5WXRqUWZNOWhNQmdxWk11dDVjeXhvYUNBVmtEUVoyNmc2bi9oUWpoNDhDRE5taldqU1pNbU5HM2FsTmRlZTQzdzhIQ1dMbDJhNzFOSXI5ZGpOQm8xcmMwMWE5WlF2YnFycmMvTjIycmJ0aTNYcjEvbisrKy81OGNmZjJUNDhPSE1ueitmdzRjUGF5NjZFNlZLbFNJakk0T0VoQVI4ZlgwQnNObHN4TWJHVXJKa1NmZGQ3RVpPdzFhdlBuUG5MU1Q4U0RpZnIxeUIwV2hrekxnSnR6eHUyZExGZUhoNDBMbEw1a1BXWnJOUnJGZ3hWcXo4NHE2TXJYRGh3bVJrWkJBMmZTYUZDaFhpeEluakZIWmMxNFVMRithWlJvMDFrWE5WaHRLYlFvVUtrWlNZeUlTSlUzajg4Y2M1ZS9aUDdWN0lDNElnVk02U1c4dWFaOHRlUUZDY0JRUVJFS0tpb2lvQnB2L0NoYkJnd1FMcTE2L1AxcTFiR1R4NE1DMWF0T0RHalJzNUpQV3k1c3VTazVPNWVQRWkxYXRYcDN6NThwaE1KaTVjdUVDRkNoVzAxNkpGaTlpeVpVdXVIdHY1OCtmcDBxVUxxMWF0WXYvKy9adzZkWXJqamx4RFZ0U3VYUnV6MmN6ZXZabXE1L3YyN1VNVVJaNSsrbW4zWGV4R0RreWFPSjd3SStFMGIvNDh3NGFQNU5DaGd5N1NrYmxoMzc2OTdObTltK0VqUG5hUnFxeFFvUUpKU1VuOHNtZTNsbS83ZnBPclR1ajU4K2ZZdVBHYkFvM3R5Um8xc0ZxdG1Fd21KRW5pNElIOTFLeWxhcG5XcWxWYkcrZlIzMzRqS0tnY1JxT1JZc1dMVTlqWEY1UERzZGkzZDY5MlRENHdMVjY2UERBWGc2YjFzQUZaUERaSGpzM2IyN3ZDZitWQzhQZjNaK2ZPblp3OGVaS1NKVXV5YnQwNmxpMWJocCtmbjh0KzQ4ZVBwM0hqeHZqNitoSWFHa3JGaWhWcDNibzFvaWd5Y09CQXhvNGRTN0ZpeFdqWXNDSHIxNjlueG93WmJOKytQY2Y1enA0OVM1OCtmWmczYng0QkFRR3NXTEVDYjI5dnFsUlJCVzBtVFpwRTdkcTFhZFdxRlY1ZVh2VG8wWU8rZmZ2aTQrT0QwV2lrZCsvZWRPL2UvYjRwbnJ2eDcwTG56bDBKQzV2QzJ0V3JrR1daZ1lNK1FoVEZmQlhlNXM2ZVNVWkdCbjNlNjZWOXp0ejVpL0R4OFdIU2xHbk0vSFE2aXhZdXdOUFRrNEhaaEpTUEhUM0toZzNyYWQrK3d5M0hWclpzRU8zYmQrRGRYajFSVUhqMjJXQk5PL2o5UHYyWVBHa0M2NzcrQ3JQWnpKQmh3N1hJYVBpSWp4azNialEycTQzU3BVc3plT2p3VzU2clFvV0tqd0hYYy9mWUhEb2hHcmVrZ2lDS29vZkZZaG1nMStzbi8xdC8vTkRRVVA3ODgwOSsvUEZIWW1OajZkbXpKenQzN3NSZ01QRFVVMC94eGh0djBMTm5UNjVldllxdnJ5OCtQajVNblRxVmxTdFg4dmZmZjlPb1VTTVdMbHhJR1ljNnZjMW1ZOHlZTVh6MjJXZkV4TVJRdVhKbFB2bmtFenAwNk9CNEd0WGlqVGZlWU9qUW9VUkhSek5nd0FDMmI5OU9jbkl5ZGVyVVlkcTBhVFJxMUFoUTJ6MjZkZXRHV0ZpWWxrOExEUTFselpvMWlLSkl4NDRkbVQxN2RxNWhyaHVQRHZiczJlTldkOHNIY2JHeFlUVnJWTitPdW1iVStVb1RCQ0VEVlNsZUVrVlJYVE5xTUNpQ0lBaG11OTArVXhURlh1N3BjOE1OdDJGN0dKR1JucjY2WW9WeVgyUXpiS2xaREp0ZEVFUlpweE1WdmNHZzZCM0p1YUIvNnhlZU4yOGVmZnYyL1UvOGVKR1JrVG1xdHdXQkxNdGN2bktWdUxnNEpFa2lJLzNSWEh2cVlUYWowK253OXdzZ0tLZ00rUkdtS29yaW1MTlk3UFo3TjJjZVpqTjZ2WjRBL3dDQ2dzcmVjdi9yN243R1hDRkpVbkVjVGJsWlg0cWlwaEhWN2c0WldRYkpMaUVJZ3VBcHkvSlJvTEo3K3Y1OXNGaXNuRGh4QXAxZTc5WVZCVkpUVTBoSlRrS1M3TlNxV1F1ajBaQ3JVZnYxMTk4UWRicjdveXZxR0pNc1M5U3JXOWZ0c2QwQkZFVTVYNlpVOFEvSUpKMTBFazg2cWNMdGpuQlUwZXYxaXJPNlVOWTlkZjlPUkVSR29OUHIzYXdRRG5oNWVWTzBXQWwwT2owM0ltN2t1czlmbDY4ZzZuVDNiYzZjWXhKRkhWZXVYSFZmdEhjQVFSQktaL1BZc3YvZnBWbFhQSC8rZkZIQW5ibitseUkySnRiTkNwRUx2SDBLRVJNVG0rdTJ1TGk0QnpKbjNqNkZpSWwxa3gzY2FWVC95ZWd4M3VUWjh1SFViUUZRMEFjRUJCUjN6OW0vMVQyL2MxYUlSOEZ6UzB5SXkzWGJnNW96THk5dkV1UGo3dWpZcE1SRUx2OTFrZFI4dEhxOXZMd0pLdmM0aFFvWGZtRHpmaS9IV2JWS3RVSkFUQzdlbXZPT3dObjZvVGVaVEVYdi9nM25wamd1S0h4OENxSFRpUlFwVW9UaXhXL3ZHU01Ja0o3dUpxbk1DK2w1RUhnK3lPTEtuZjVlZjEyNlFGcGEvZ0s5cWFrcFhQN3JJalZxUFRoYXhYczV6c2VLRkNtVTNWdHpGQThFMTNCVVVmUTZuZTZ1R2pZM3hmSHRJelUxaFJzUmtkeUlpT0NwT25mM290eSs3U2RXTEY5R1ZOUk5TcFFvd2VkZnJ1SDgrWFAwNko3SlFESjArRWhlZUtHTis0ZDRpSEVyWTVIMVd2cXZqck5Rb1VLRnNoZ3daM091NEZnTW56V1NFZlNpS0Q1Mk43OVlWb3BqTndvZW9uaDVlUk4xTTRMSXlFaUtGU3QyVno3M3hvMGJUSms4a1RIakpsQ3ZYbjJTa2xUT3J3b1ZLcko5NTI0QTN1blI3WjU5citYTGx0THU1Zll1TkUzT2NjMmFNWjJUSjMvSGFEVFMvUG1XdlBkK0g0MVY0dHExYTh5Wk5ZT1RwMDVpTXBsbzBhSWx2WHEvbDROMTRtN2lWdWQ4cm5GRERBWURnaUFTRkJSRTl4NDlhZFNvc2Z2aXZZOHdtejBLdVJxMUhDL0gwa2tGVVJURmdMdDVjamZGOFQ4d2NONCszTHg1ODY1OTN0ay96eEFZR0VpalJvMHhHbzBFQmdZNlFsZ0Jod2FqeTFyQ3U0M1BWaXdqTGk1bkFuLzBxSkdVTEZXS2pkOXRadkdTNVJ3NmVJQk5tNzRGMUo2OG9ZTS9wRkxsS256NzNXYm16Sm5QbnQyNzJMamhtM3Myem9LZWMrNzhoWHkvWlN2ZGUvUWtiT3BrTm55ei9vRmNKNElnVUtkT0hWcTBhRUh6NXMwcFVlTDJuSWlEQi9ZVDByVVRyNy82Q2pNK0RkUFdkTnBzTnNLbVRTR2t5MXQwRCtuQ3ZuMlphNXJ6WThTOWQ1Rk1LcHUrKzVhaGcxWGFKWVBCbU4xakUzRVVEckpHakZhckZWRVFoTHU2U05HZHpQNW5ucHRka3Y3eDV4dy9mb3lYMjdaaDJ0VEpSRVpHOG5MYk5yemN0ZzByUDF0UjRNODRkUEFBbmQ5NmcrYk5ndW5SUFlRL1RwMXkyYjVuOXk1Q3VuYmloVmJQMDcxYkZ3NGRQS0J0NjlmM2ZWNXVxNGEySHd6b3o4dHQyOUQzL1hjMUl4SWMzSlN1SWQwd21Vd1VLVnFVdXZYcWNjNUJTaEFYRjRlZnZ6K2RPbmZHYURSU3FuUnBHalYrbGovL1BIUFA1djEyem1rMm0yblVxREhEaG85a3llS0YrZEphM3l1VUsxY09uVTdIdG0zYjJMdDNMelZyMXNSZ01PUnFzTFAvUHlNam5hbFRKakZ4MGxSV3IxMUhURXdNMjM3NkVZQ3RQMndoSXlPRGxWK3NadnFNV2N5ZSthbm01ZWZGaUZzUVBQSEVFOXBETmI4eFp2MDdKaWFHZDNwMDU4S0Y4OXJ2b05mckMrWGhxV2t2V1piUjYvV0lnTi9kblBRN3BUaDJRMFZLOGo4dnROU3FWWnR2TjIxaFFPaEFTcFlzeGJlYnR2RHRwaTJFZE90ZW9PTXZYcmpBeHlPSDgxNmZ2bXpadW8xWFgzdWRnUi8wSjhyaFRWNjVjcG54NDhZd1pNaHdOdi93RXkrOTFJNFJJNFpwYWx0ejVzN24yMDBxRThxTVdiUDVkdE1XNXM1ZkNJQW9pblRxM0FWZlgvV3krK3V2U3h6WXY1OEdEVlIyazhEQVFPYk1uWStIaDFtNzBJOGZPMGFOR2pYdjJaemZ5VG5yMVcrQTFXYlREUEw5UkdCZ0lEZHUzTkE4RkZtV2M1QThIRGtTem9oaFE3RFpiTVRGeGZGT2orN0V4Y1VSRVJHQnI2OGZKVXVXUktmVDBhcFZhdzRmUGdTb3JMZlBQdnVjNDNjU01CaU1uRHQzVnR1V0d5TnVBWE5qZVpKVkxsdTZXS01HUDNueWR3YjBWMWNSK2ZyNjhzV3FOWVIweStSRTFPbDB1WVdpdUlhaHFrY3JBdmM4Ymh3ME1KVFhPcllucE10YmRPMzhKbHMyZjYvbE5WN3IrQXJ0MjcxSTk1QXU5M1FNM1VPNmNQSGl4ZHM2WnR0UFAvSmF4MWQ0b1hVTFpzL0ttK0J2eDQ3dGpQNWs1SC9HdUc3ZXZJbmdKazFwMUtneEpwT0pWcTFmb0VyVnFteHpDSGtFQkFTeWZNWG5WS3RlSFZFVWVhbHRPMnhXSzMvL1hmRG0wejlPbmFKRjg2YUVkT2xFbGFwVmVTNjRTYTc3TFZ3d0Q3T25KeSswZWZHK2ZmK0NuRk1RQlB6OS9FbDVBTWw2bzlHSUpFa0VCQVRRdUhGalpGbkdaSEpsSGF0YnR4NytBUUdNR2YwSmd3WU9vUDBySGZEMzk2ZFlzZUxFeGNWeTZkSWw3SFk3NGVIaHBLU28zOEhKaUh2cTFFbUdEUDRRbzhsSVltS2l0czNKaUR0M3ppeU5FZmVmNHMyM09yTnIxOC9NbVQyVGNXTkcwN2RmZjZkM2xpT25LZ2lDZHo2NU5SY2pweGNFNGI0a3hENGFNb3g2OWVxVG1KaEFyNTV2VTdXYXluMldGNzN4dzRBV0xWdlJvbVVydnY1cUxaR1JFWStNMXhnWkdVbUZDaFZkM2l0VEpraWJBMjl2YjNaczM4YjQ4V05JU1U3Sk02eklEOVdmZUlKdE8zWVJFUkhCSngrUFlQbXlwZlI4eDVXSDRmT1ZuM0g0OENIbXpKbVBYcSsvTDkrOW9PZFVGSVc0K0RpOEgxRGF4Um1PN3QrL24xcTU4SmtKZ2tEdjN1L3h4dXNkS1ZPbXJHYWt6V1l6dzRhUFpQS2s4WTdmdFN5ZVpyTjIzUGZmYnlJOVBaMUprNmN4ZSthbkxwK1pGeU51WG1qVnFoWGUzdXI4T1BPQXAwK2Y1dlRwMDlvKzN0N2V2UHZ1KzN3UTJvODMzK3BFNWNwNUx5c1RSZEU3bnpCVU0ybzJtdzA5Y0Y4NXFRc1g5dVdKSjJ0dzhjSjV5cGN2bitkK2lZa0pUSjQ0Z2Fpb0tPeDJHNTA2ZDlYWU9NK2NPYzNNR2ROSlQwdWpTTkZpREIwMlFvdmhkKy82bWRXcnY4U1NrVUgxSjU3a2c0RWZhdm1IWFQvdlpPem9qMGxQejZCdnYvNmFsL0ROK25WcThscFJhTnJzZjNUcjN1T1czK1BJa1hBK25UNE5VUkFwV2Fva251Wk10dHo4eHRDOFdURDlCM3pBMGlXTFVCVDRmc3ZXaDg2d0ZTMWFsTWdJVjBOKy9mbzFhdGRXVzFIMi9yS0hWVjkrd1l5WnN5bFZ1alNnVmcxenU3bXlHenRMUmdaYnQvNUE2OVl2WVBMd29Iang0alJ2L3J4TG9ocGcvYnF2MmI3dEoyYk5tWGZmR2s1djU1eEhqb1JqTkJpb1ZQbitMN0cyV3EzWTdYYU9IajNxRE5GeWFHYWtwS1R3MFVjRDZkd2xoSE5uLzJUSzVJa01IVFlDUVJCNHV1RXpQTjN3R1VmdWJLNUdTMSs0Y0dITVpqTmp4MDFBRkVVc0ZndUZIZk9RRnlOdWZ2anhSelYzOTh3enozRDU4bVV0ZkhaSmUxeTh5T1JKRXhnN2JnSXJsaStsVE5rZzJ1VHRLWHRsTTJKWmpKcVFOV1JGQkR6djU0OFNIUlhGcVpPL1U2Vksva3prNTg2ZDQzL05uMmZaaXBYTW1idUFXVE5uWUxWYXNWcXRqUHA0QktHaEEvbjh5elU4ODB3amxpeGFvT1ZyMXE5Zng1dzU4MW41eFdvQWZ0aXlXZnRNSHg4ZlZuNnhtdEZqeGpGLy9seEFKZGJidkhrVEN4Y3RaY215ei9qdHQ5L1k5ZlBPZk1kbXNWaVlNRzRNbzBhUDVjdlZheWxUT25PcDdhM0dZTGZiaVlxS1l0MDMzN0wrbTQwUHpIalo3WGFOQmwyUlpleDJ1MmFFMnJ6NEVudjI3Q0k4L0RCMnU1MmZmOTdKSDZkTzBxSmxTMEJWVGhJRUVIVTZFaE1UdEJ5SklydXlGQmN2VVlKREJ3OWlzOW1Jam9wU3d5aVRpUzgrWDhuYXRhdXgyV3drSk1TemQrOHYxS2hSSXpNVS9uNFQzMjdjd016WmMrOGJBV2RCejJteFdEaDg2Q0NUSjAyZzk3dnZQeEN0aXVqb2FLMmFiVFFhOGZYMXpTR0ljdkhpQllLRG0vSldwODZNL0dRMFJxT0p1RGpYVlErSER4MWt4NDV0V2c5anJWcTFzZHZ0aUtKSVFrSThGeTllcEZMRlN0cTIzQmh4L3lsKysvVUlRNGVOb0VuVFpudzZjdzZuL3ppVmcrMDZ5NFBTbk0yb1pYMkd1cFQzOVlENWZ2d1kwOE9tWXZZd1l6UVo2ZE8zUDZVZHBJNTVvV2JOV2l4ZnRvUnQyMzVFcDlOanNXU1FuSnhNUW53ODN0NCtWSzJtNmhHODFMWWRUWnMxVTMrb3c0ZTQ5dmRWM3UzOVRwYW5pazltM3NIQjdsbTFXalV0RVI0ZWZvam5uMitKMmVHT3YvamlTNFNISDZacHMvL2xPYmFyVjYvdzJHTkZOT05jcFZvMTl2MnlwMEJqQU9nYTB1MnVYQlIzaXV3TnVsTW1UMlRLNUlrODM2SWxIMzh5bW9vVkt6RnF6RGdXeko5TFpFUUVaY3FXWldyWXB4UXRxdmJYdFg2aERhZE9uYVJIOTY3b2RIcmF2ZHllaWhVckVaZHR1ZERBZ1I4U05tMnEraVF1VTRhbHkxZGlOQnFaTWpXTXVYTm04ZFhhTlJnTUJvS2JOTldTeEpJa01XM3FaUFI2UFcrKzN0RTFUUHh5TmNXSzNmMFZnQVU5Wjc4Kzd5TUlLblBzb0E4SDM5VStOaDhmbndMdmUvbnlaWHg5ZlRWWngrUEhqK2RJNU5lc1dZdWFOV3RwK2FwQldaaHk0K1BqNk5XekI2VkxsMmJpcENrOFZxU0k5cnVlTzNkT3kzZjNHeENxZWE1NU1lSVdCQWNPSE1oejIydXZ2Nkg5UHlBZ2dJOEc1eXZzNHBGUEdPcXdjQ0tTSktFSDdzc2ROdWpEd1JwdGNFR3dkczBxN0RZN1U2Wk9SeEFFclgzQWFaNmRNQmdNK1BtcFQxaWIxVVp3azZhYTNGaCtpZCtzSVZMV1ZpNUJFUEo4WW1UTnIrVFZMRnFRTWVUSEUzWTMwYkpWYTFxMmFwM2ovWW9WSy9ITHZ2d0ZtaHMxYXB6bmpXc3ltUmo1OFNpWDk5N3AxVHZIZnZVYlBNM1g2emZrZUw5Q3hZck1uRDAzMTgvVzZYVHMyWHZndmhyNmdwenpWdk4xTjhhUW1wcFNvRllwNStxZU80V2Zuei9yY29rV3NodkFyQWdNREN5d1F0YmRSRUJBZ0ZaaHo4VldDZG50Z1NDQVRxZTJlenc0MXlGZmR6c0dieDl2QkVIZytQRmpKQ1Vsb1NnS3BjdVVJVGs1bWZQblZXWDNuMzdjU3RpMEtRRFVxMStmbjNmdTVQcjE2d0RzM0xtRGt5ZC96L2M4ZGV2V1ovdTJiYVNucDJPejJmaGh5MmJxTjhoZldLVnMyU0NpbzZPMW5FRkVsdHpCbll6aG44QnM5c1NOMjV1YkJ6bG5lWjI3U0pFaXBPV3pwdHJUczJBaGIwSDN1MWU0eCtNMDV1S3BDVW8ycjgwWml1b2UxQ1RrSjBqeDJtdXZNM2JNS0g3WXNvWEtWYXBRb1dKRkVoTVNDQXdNWk15NDhYd2FOZzJMeFVMZ1k0RU1HVHBDRFFtclZLVmYvd0VNSGZ3aE5ydU5ja0hsR0R4MFdMNWplS3B1WFZxMmFzMjd2ZFNDd2JQUE5hRnBVelcwM2ZiVGp5eGRzcGlVMUJSa1NXTGYzcjEwNlJyQ1MyM2JNWFQ0Q0VZTUc0S2Z2ejk2dlU0ckh0ekpHTzdYay81UlFtcEtjcDVldGZpQTVpdzFKUmxkSHBYVzRzV0xFeEVSUWZUTkNEeTlmWEtNclZ6NUNyZGNZTzdwNlVXNThnOVdsK2tlajFPWG04ZVdXOTVOVUc0VmQ5MG1qaDQ5U3BGaWJvM01PMFZVNUhYcTNNWkMrTXVYcnhBYkYrZGVtNXNOTnlOdkVCZ1lRTmxjY3JtWHIxd2hOdmIrejluTnlCc0VCQVFRVkRidi9ISlVWQlNSa1pIWTdYYVNrOTJzT05uUnBFbVQ5a0FhS29OdUVwbWlMaFkwN1FOQnZ1dk5RVzRQNHA4OTBXKzNYNnRzMlRKRVIwY2pudHFQQUFBZ0FFbEVRVlJ4TS9LR214cmNNWWNwS2NsSWRudXVSZzBncUd4Wm9xTHUzNXc1eHlSTFVyNUd6Um1TRm5Fazg5M0lGZG5EVHNHWll4TUVRVjExSUlxQ29DaUtoTHBFNGE0Z0lpS0N5TWliUEZiVXpWOTUrOTdhRFVxVUtIN2I3QjZLb3ZEWDVTdkV4Y1VpMldVeU1oNU5qamF6MlJOUnB5TXdJSkN5WlV2ZmNvSC9sU3RYaVk2SlFiSkw5MnpPekdaUGRIcjlMVDAxTndvRVdSQ0Vqa0JxRm84dFJSQ0VWTUFpQ0lKTkVBUzdLSXFLb0NpS0ZURGM3WEJVRUhWNGVYbmo2ZmJjYm9rMGg5Z0hLTGNWaHJyaHhpTUdteUFJcjJjeGJNbEFzaUFJYVVCR1ZzT21CKzY2WWF0VHB3NDNiOTdrWmxRVXlVbUpiZ2JkZk9EdDQ0TkJyNmRVcVpMdUVNUU5OL0tIdGFBN09nM2JYYThSRnkxYTlJNDBNdDF3d3cwM0NtallsR3ovYWhDQmRQZDh1ZUdHRy84Q1pCVFlZN3R5NVlwYkRjUU5OOXg0NktFb1Nub3UzcG1pT0JSZG5KMXJpcUlvK3JKbHk2YTZwOHdOTjl4NDJDSExjbXFXMEZNemNObmJQUVJCUUZRVXhVMTU2NFliYnZ3YlBMYnN6SlpLdHY5cmYrdFJlMEhjY01PTkIzL2p1dlY0ODRIZGJrL0pZc0NVTEtHb2tqVVVsV1VadmFJb0NmZFNxY2dOTjl3b21GRno2L0htRDR2RmtweWJ4K1pxdnpKRDBiaEhiWUpLbFNwRnRXclZjaFdqOFBiMjVyUFBQcnVYVHgxQ1EwTXBVcVFJaFFzWHBuZnYzcG9JaWh1UExyTHE4YnFYSStaNTd5Umw4OWdVY21uMUFOV3d4VDZLazNUbXpCa21UWnAwMzg4N2JOZ3dObTNheExwMTY5aTBhUk03ZCs2a1g3OSs3cXYyRVlkYmovZldzRnF0U1ZrOHRWenlhNExLclNpQUtFbFN6S000U2VYS2xXUGl4SW1jT1hQbXZwMHpOVFdWZWZQbUVSWVdSbkJ3TU1IQndTeGV2SmlWSzFjU0V4UGp2bklmWWR5cEh1K1owMzh3TUxUL2ZYQUVUaE0yYlFyYkhVcGxUbXpjK0EwaFhkNGlwR3NubGk5YnFyMmZuOER5aVJQSDZmbDJON3FGZEdiMEp5TUxyTTJhbnA2V2pHdFRicmJxcU5OZkE5Rm1zOTE4RkMrazNyMTdVNzE2ZGQ1NTU1MThHWFBYcjEvUGswOCtpZGxzcG5yMTZpeGR1dFJsKzg4Ly8weWRPblV3bTgzVXExZVBzTEF3RjNIWXdNQkFQdnhRWmRNOWR1d1k2ZW5wQkFjSGE5dWZmZlpaQUE0ZVBPaSt1eDloM0trZWIrVXFWUmsxWnV3OUhkdjhlWE5adG5RSmx5NWVkREZDVjY5ZVljUDY5U3hZdEpSbHkxZHk0c1F4amh3SmR4eVR1OEN5M1c1bjBvUnhqUHhrRkordC9KSlNwY3RvbWhtM1FsSmlVbDZoYUk0VkNQcU1qSXlvVzZuTi9CZWgwK2xZc21RSkRSbzBZTkdpUmJ6NzdyczU5dG03ZHkrZE9uVmk5dXpadEdyVmlxTkhqOUs3ZDI5ME9oM2R1M2ZuNHNXTHRHblRocjU5KzdKbXpScCsrZVVYK3Zmdjd5THdNV2pRSUdyWHJnM0E5ZXZYTVJxTkJBUUVhTnNOQmdNQkFRRmN1M2JOZlhlN2tRT3hzYkZNbkRDT21PZ29CRkhrdmZmNjBPRHBoaTRrcmI2K2ZxeFkrVVZtdW1QSVI5eTRvVEk0SnlRazRPbmx4WnExNndCVkZXck9yQmtrSmlYaTcrZlA0S0hETkMwTGdIVmZmOFdHRGV1MS9RRjZ2dE1MbzlHb01WVTc4ZnVKRXp4VnR5NmVucDdZN1hiOGZQMDRjZnc0OWVyVjU4U0o0M3p3d1NEQVZXQTU2dVpOUE14bWdvTEtBZUR2NzgvUE8zY1VhQzV1UnQxTUxvQlJVd0QwRVJFUkVYbkp6Ly9YOGRSVFR4RWFHc3FRSVVObzI3YXRwbjNveElRSkUralJvd2U5ZTZ0OC9tWExsdVhTcFV0TW5UcVY3dDI3czNEaFFxcFVxY0swYWRQVXAyZmx5cHc4ZVpMVnExZTc1TlNjU0V0THc4UERJOGM0VENaVER2azBOOXdBK0dydGFtclVxRUZJdDdlNWRPa1M4K2ZOb2NIVERTbFZxbFNlbXJ5VHBxalhZMkppQXIzZjZhSHBiMWl0VmlhT0g4djRpWk1wWHJ3NFAvMjRsUVh6NXpGNlRPYnhOV3ZWeXNFOG5KZndrRk5nT1RvNm1ra1R4aUhKRWo2T1BHRldnZVVkTzdacEFzdEpTVW1ZVENhc1ZpdHo1OHppeG8wYk9SUzI4ZzY3VHp2YlBlUzhQRFZuTUNyV3JGa3ppdHRZZy9WZnc5aXhZd2tJQ0tCdjM3NDV0cDA2ZFlwbHk1Ymg3ZTJ0dlVhT0hNbUZDeGVRSkluang0OVR2NzZyUUUyalJvM3lQSmZaYk02MUVtdXhXQjZJakpzYkR6L3ExVy9BemgzYldmblpDaXdaR1FVV1ZKRmxtVEdqUjlIbXhiYlVyOThBVUtVaHIxMzdtK0ZEQjlNOXBBdXJWMytwcWJVNVVhbFNaVjdwMExIQTR6dDkrZzlHamhqS083M2ZwV2xUVjJXM1NSUEdjZm55WDRSTm4rbWlWSitZbU1qQUR3WlFyVnAxK3ZVZlVOQlRaVXdZUHpZdG4xQlVNM1NDb0Rib0Fsd0ZLajJLRjQ2bnB5Y0xGeTZrWmN1V2JOem9xdHhqdDlzWk5HZ1FiNy85ZG83alJGRkVyOWZuRUFUT0wxOVhxbFFwTWpJeVNFaEl3TmZYRjFCVnEyTmpZeWxaMGsybjdrWXVocTFlZmViT1cwajRrWEErWDdrQ285SEltSEVUYm5uY3NxV0w4ZkR3b0hPWHJ0cDdOcHVOWXNXS3VZU3Qvd1NGQ3hjbUl5T0RzT2t6S1ZTb0VDZE9IS2V3NDdyT1MyQzVVS0ZDSkNVbU1tSGlGQjUvL0hIT252MVR1eGZ5ZzZJb2YyY3pZSElXenkzbi9ha2VvMXg1bEMrZUZpMWEwTGx6Wi9yMjdhdUpDQU5VcTFhTmt5ZFBVcUZDQmUxMTRNQUJaczJhaFNBSVBQbmtreHc1Y3NUbHM3TC9uUlcxYTlmR2JEYXpkMittNnZtK2Zmc1FSWkdubjM3YWZSZTdrUU9USm80bi9FZzR6WnMvejdEaEl6bDA2R0NPaDJsMjdOdTNsejI3ZHpOOHhNY3V6YXNWS2xRZ0tTbUpYL2JzMXZKdDMyLzZ6dVhZOCtmUHNYSGpOd1VhMjVNMWFtQzFXakdaVEVpU3hNRUQrNmxaUzlVeXpVdGd1Vmp4NGhUMjljWGtDRy8zN2QyckhaTWZKRW02bnMybzVlR3RxZjBlZWtDUlpmbHlYb28randwbXpKaEIxYXBWWFhKZFE0WU1vVldyVm93ZVBacE9uVHB4K3ZScCt2ZnZ6OENCQXdIbzI3Y3ZzMmZQWnVqUW9iejk5dHNjT25TSUJRc1d1SVNWa3laTm9uYnQyclJxMVFvdkx5OTY5T2hCMzc1OThmSHh3V2cwMHJ0M2I3cDM3MzdmRk0vZCtIZWhjK2V1aElWTlllM3FWY2l5ek1CQkh5R0tZcjRLYjNObnp5UWpJNE0rNy9YU1BtZnUvRVg0K1Bnd2FjbzBabjQ2blVVTEYrRHA2Y25BYkRxaXg0NGVaY09HOWJSdjMrR1dZeXRiTm9qMjdUdndicStlS0NnOCsyeXdwaDJjbDhDeVhxOW4rSWlQR1RkdU5EYXJqZEtsU3pONDZLM0ZsMjAyVzBRdUhwdWlxdSs1ZW0yQ2dDSUlndUNka1pIUnoyZzBUbnhVTHBaU3BVb1JHaHFxdFdFNDhjVVhYOUMxYTFkV3JGaEJ0MjdkQUZpMWFoVVRKMDdrd29VTEZDdFdqSjQ5ZXpKeTVFanRTZmpUVHo4eGNPQkFMbHk0UU8zYXRXblFvQUhyMTYvWGRFVURBd1BwMXEwYllXRmhXajR0TkRTVU5XdldJSW9pSFR0MlpQYnMyYmtXRmR4NGRMQm56eDRlcjFqRlBSRjVJQ1ltNXRQYU5aLzRCVmRhOEJRbkxUZ3FiYmdraXFLczArbFZ3NWFVbE5URzI5dDdyWHY2Ymc4blQ1NGtMUzJOQmcwYWFPK05IajJhSDM3NGdmRHc4UHMyRGxtV3VYemxLbkZ4Y1VpU1JFYjZvN2xFeThOc1JxZlQ0ZThYUUZCUUdVUlJ6QzluNDVpeldPejJlemRuSG1ZemVyMmVBUDhBZ29MS3VnM2JIZUxzbjM4T2EvNi9KcWZKS2VTU0RqaWs5MFJKRkVWWnI5Y3Bla0NKajQrLytDajBza21TZE52eWR2bmRHQmN1WEtCTGx5NnNXcldLV3JWcWNmTGtTZWJObThmdzRjUEpqUGNManNqSXlOdW1VN2RZckp3NGNRS2RYbzlQb2NKdStiM1VGT0lUNG9uNUxacGFOV3RoTkJweS9lMSsvZlUzUkowT2I1OTdQMmVwcVNuRXhzVVJIUk5OdmJwMTg5MzN1cnVmTVZjY09uZ2dsc3lDZ1ZZNGNEQjdPRUpSQlFVRldaWVJCRUh3Qkl6L1orKzc0NXVvLy8rZmQ1ZGNkdmVtcFlXMkRGR2dTQUUvRkJGL2JCemdGMFVGUkN4WWtDRWdJaFFVRkdRclFnc2lVNUNsSUdKWkFySmt5aXBZaG15UTBxYnBidE9SY1hlL1AyNDBTZE5Tb0dYbTlYaEVhZFpkM25mM3ZOZDhQbG1XMVFOUXVKYnc3bXpxMUtsWXZIZ3gwdExTRUJ3Y2pMaTRPSXdlUGJwU2I2RTY3V0dKL3o3cXhvc1RleUVzdEx5WGRPMzZEZVRtNWo0VXdXUWZiMitFT3BIaGMzbHNsZCsvUTJvRjlBRXZZMkIwQ0VWTEFKZ0ZvV1NHSkVsT0pwTnhKTXFTY1JkYzYzZjNGaDhmait2WHI4TmtNdUhxMWFzWU0yYk1Bd00xQU1qT3luWU5UenN4cmM0TldWbk8rUjF5Y25JZXlwcHBkVzdJeW5iTkJOOURxdVVpN0ZzOGJGczk3SXNISW9PdTZKMnpMSHZldFlTUGwzSGN2UTlQUCttbTBXakJza3lGS1ltSHNXWWFqUmFNbFhFZG5MczBpOFZ5RmVYNzF4ejcySGgyRHdIY1pBUkJjQnpIY1ZhcjlYeEZveE11ZXpTTklJQ1NFaGVYVzBWV1VnSFAzY01zcnR6cjhTckl6OGVONjFkUlZHU3NGRGpENm9URHpkMzlvZjIrbXRoUG83SHdwaE5BSytleEVVU1o3b0ZNZktHa3BPU2NDOWdxODQ1NDJtYUR3UUFydzhCWVdEMjB6VnF0RGpLNURINit2Z2dNREt6Mi9kNjFjd2VXTDFzS2d5RURRVUZCV0xscUxTNWZ2b1RZL3Yyazk0eU5uNEN1WGJ1NUR2SWpiTmV2WFVGeGNlWDBQa1ZGUnR5NGZoV05telo3b3Ziejl1MjAydzZBeGdCZ2hhSkJ1WWNJYkFEQVhicDA2VngwZExUckRLb0ExSktUa3dHQ2hFYXI0Mm1iQTZydis0dUtqRWpYWnlBOVBSM05tbFhmU1ptV2xvWVowNmZpeThsZkl6cTZCUW9LZUdxY2lJaEk3TnE5RHdBd01QYjlHbHUzWlV1WDRQWHVQZXpZVE1UOW1qdm5HNlNrL0FPYXB0RytReWNNL21pSU5IeWRtcHFLaExsemtISTJCUXFGQWgwN2RzS0hjWU5SazAza2Q5cm1pekV2UUM2WGd5QkloSVdGb1gvc0FMUnVIZlBBenNFN2dZWHR1ZlF3clNiMmMvKyt2UmtDYURFaXFObDdiYnlYQmx1VktoSGxXclpzbVFYZ3Nndkd5cHRlcndjSUVuNytnVFdTbTlGb3RQRHpEd1JBSUQwOXZkcSs5K0svRitEajQ0UFdyV05BMDdURUUwY1FCQlFLQlJRS0JXcFM3K0xINVV1UmsxTStnVDlwNGdUVUNnN0diNzl2d2FMRnkzRDB5R0VrSlcwQ3dQZmtqUjB6R3ZYcU44Q20zN2NnSVdFQjl1L2JpOTgyL2xwaisxblZiU1l1V0lqTlc3ZWpmK3dBeko0NUhSdC8zZUM2T0dyZXFiZ3ljOGEwa3NyQ1VJSVFRbEhZaDZJUTNzQ3lMSHVLSk1sSTEzTGFtOEdRQ1kxV1YrUGIwZWpjWURBWTdqc2tQWDA2R1pPK21BQ3oyWXppNG1KMGY0MFBNM3U4MFJQOTN1OWZwZTg0ZXVRd0VoUG1RYTlQUjJob0dFWjk4aWthUGZ1czdWMFV5NVl0UWFiQkFQK0FBTVRGRFVhckYvNEhBQmcyOUNQY0VoaFRSMzQ4SERJWmhlRGdFQ1F1V0FpV1pkRzJiVHQwZStVVktCUUsrUG43bzNsME5DNWR2QWlBcjFoNmVubWhkNTgrb0drYXdTRWhhQjNUQnYvK1czTkYrN3ZacGtxbFF1dldNWkRIVDhERUx5YWdVK2N1angwekM4TXdPSHIwQ0xZay9ZNGhRNGNqT0NRRUFEOGtQL2U3YjVIeXp4bVFKSVhZZ1I4aUpvWW5RczNNek1TMHFWT1FuWjBGbmM0Tll6NGJpOXExUXl2ZERrRVFpSXFLZ28rUEQxaVd4Zm56NTVHV2xsYmwvVnp4NDNMOHNYM2JPV2RoS0FDVzR6aTJMTDlHY0NBSXZrRzlvRUFxSGdBQVo3RllraFVLUlM4WGxObWJsYkUra0NxYVJxT0ZzU0R2dnIrbmFkTW9iRXJhaWgxL2JNZktGVDlpOWRxZjcrcnpWNjljd2VjVDRqSHBxeWxvM2p3YWUvZnN4cWlSdy9IVHFyWHc4L2ZIelpzM01HWHlsNWc3Yno0YU5HeUlUYjl0eFBqeDQ3QjV5M2FvMVdva0pDNlF3cmM1YytjaE1yS01PSVlrU2ZUdTA3Y3NKM1A5R2c0Zk9vU1BodkMwVVQ0K1B0TG5SVy9xZEhJeVh1L2VvOGJXL1Y2MkdkMmlKY3dXQ3k1ZHZJaW9aczBleWZPV1pWbXA5Y2oyM3g4UEg0cGF0V3Jod29YellHd3F4OXUzYlVWcGFTbFcvTFFHT1RrNUdQUmhMQm8zYmdJM056ZUpFZmVWVjEvRGlSUEhNV1BhVk16Ly9vZEt0MStuVGgxUUZJV2RPM2RDb1ZEZzVaZGZSbVptSml3V2k5Tjl0UDA3SmVVZjdOKzNGN05tZjN2bGhWYlJqbUdvYlk0TklvQVJBamhydFZxKzNVTk13aFVVRkp4eXdWaDVxNjVDUVpXMlpUUSs5Tis3WlVzUzJyN1VEcTFieDBDaFVLQnpsNjVvMExBaGRncDg5OTdlUGxpMmZDV2VhZFFJSkVuaTFkZGVoOFZzeHExYi8xVjVHK2ZPbmtYSDl1M1FyMjl2TkdqWUVDKzJmY25wK3haK1B4OHF0UnBkdTczeXdINS9WYlpKRUFTOFBMMWdMREkra3VmczhlUEhNSDdjWjdCWUxNakp5Y0hBMlA3SXllRUY2YjZkTXhmajRpZVV1MW1mT1hNYWJkcThLTnlBQ01qbE5DNWR1aWk5OXVLTFBLVzlMU1B1blc0WW9vZkdjZnhFZ0tlbnA5MTdsaTVaSkZHRHA2VDhnNCtIOHplNEs1Y3ZvV2xVRkc3eHJyK3R0OFk0Q1VmQmNad0VjSEk1YmRlZ3k3MzExbHVud0hmMnVxd1NPM1BtTkRwMWVCbDVlYm1TaDlPdjc3dFBWRTR4TU5DK0s3OTI3VERvOVh6K1Q2dlY0dVRKRTRqN01CYTkzK21GOTkvckk5MXRxMnFObm4wV08vL2NpNS9YYjBSNmVycWRFSWhvSzFmOGlMLy9Qb3FwVTZkWDJ5amNuYXlxMitRNERqbTVPZEErb2oyRXpadEh3OHZiRzE5TytnS2ZqUG9ZUGQ3NFA0bEI1azZNdUdmUHB1Q3pNYU5CSzJqazUrZExyNG1NdUlrSmN5VkczTXFNcG1rd0RBTnZiMi9FeE1TQVpWazd3a2tBZU9mZFB0aTdkdzhTNW4ySHlWOU93dEJodkRCTjNmQUluRHh4M0RoMHlFY1pEaUdvSGJBSllGWk8xSVVVa3NjY0FIYi8vdjBzeDNGSFhkQjFaeXNwS2NHYTFhdWZ5Ti9tNys4UHZVTVI0L2J0VklrYi84QmYrN0Y2MVUvNC9QTkpXTDMyNXdwRFhZSWd5b0dkcWJRVW0zN2JDRk1wVDlvY0dCaUk5dTA3NE15WjAzYnYyN0QrRit6YXVRTnp2a3Q0WUgxWmQ3UE40OGVQZ1piTFVhOSsvWWR5ZkRwMjdDZzlIRm1jeGJXUGl4dU1VeWRQUUVFcnF1enhidDZjaE9YTGxtTGE5RmtJZGNpaFZjU0llNmR3dEdIRGhqaDA2SkJVbGJjMXJWYUxRWU0rd3ZwZmZrYTdsMTlHL2ZyOFdGbVRKazNSdmtPbmt3WkRSbVdneHBiTmlZckJLSy96UU1LZU41eTFXcTB1WUt2aUFkdTdaN2ZrM3R2YXZyMTc4T0hBRDlDdjc3dVlPV09hbEZOSVMwdkRvQThIb1BjN3ZUQnI1blFwcWY5UThvWldxMFNxeWJFc3JGYXJCRUxkWG5rVisvZnZ4YkZqZjhOcXRXTFBudDA0ZHpZRkhUdDFBc0FMakJBRVFGSVU4dlB6cEZDQ1krM0pUQU9EZ25EMHlCRllMQlprR2d6OFhWeWh3RThyVjJEZHVqV3dXQ3pJeTh2RmdRTi9vWEhqeG1XaDhPWWtiUHB0STc2YmwvakFlT3FxdWsyVHlZUy9qeDdCOUdsZkkyN1FSdytsY0pDUmtZR2RPM2RLRDJkTU1rYWpFWjkrT2dwOSt2WkRRRUFBWmt5ZldpbTdzeGhpZW5oNFlOYnNiK0hsNVFXVHlRUjNBZUJGUnR4aHcwZEFMcGRMakxpVm1kbHNoc2xrd3NHREIyRXltVUJSVkRsdGo2dFhyMkw2dEsveDFlU3ZjZlRJWVd6ZHVrVjY3ZFZYWHp2ckpBeGxiSE5zb21OR0VJU1VxM056ZDRkTUtJOXlvbHRYV0ZoNHpFVjZlR2RUcXpYbzJLa0xWcTlhaVM1ZHlnRHErdlZyMkxCaFBSSVNGa0NoVkdMbWpHbll0blVMWHUvZUEzUG5mSVAySFRxaTU1dHY0ZGpmUjNIbzRJR0hzdStPRGJvenBrL0ZqT2xUMGFGakozeit4U1JFUnRiRHhDOG40L3NGaWRDbnA2TjJhQ2htenY1Vzh0aTZkTzJHczJkVEVOdi9QVkNVREs5Mzc0SEl5SHJJeWJVSCtWR2pSbVAyckpsWXZtd0phdGV1alNYTFZvQ21hY3lZT1J1SkNYUHg4N3Exa012bGFQdFNPL1I3bjZkZlp4Z0dzMmJ5WWVBN3ZleTU5MWV1V29PQWdPcHZZcTdxTm9jTitRZ0V3Uk1zZmpKNnpBUHRZN3RidTNyMUN0cTJiWWQzZS9lQjFXckYzTy9tSUNjbnAxeFBvYTAxYlJxRmMrZk9naVJKNU9YbDR1clZxNmduRkg0cVlzU3R6REl6TSszQ1h3OFBqM0xDTFNkUEhNZlljZVB4ZlBQbWVLNXhFeXhidWhoZHUzWURRUkM0ZHYzYXRZcEFEUTVUQnlSSlFTYWpZRFlERkVtVlRSNklIdHRISDMxMGROMjZkZmtBM0Yzd1ZibTk4WDg5MGE5dmI0azFGQUQrL3Zzb1VtLzloMEZ4QTZXN2xsWm9GVWxKK1FjVEJVV2c4SWlhNzZycDFMa0xPblh1VXU3NXlNaDYrT3RnNVRxbXJWdkhWSGpoS2hRS1RQaDhvdDF6QXorTUsvZStGaTFiNFpjTkc4czlIeEVaaWUvbUpUcjlib3Fpc1AvQTRRZDZIS3V5elR1dDEvMmFUbGU5N1VSTm1qUkZreVk4NWJaTUpzTW5Ea3k1enF4TDEyNjRkT2tTK3ZmanE5YkRQaDRoaGVRVk1lSldaamR1M0lDSGh3ZmF0MjhQQURoOStuUzVnc05idmQ2Vy91M3Q3WTFQeDR5VlVuNXhBMk5UbllJYVFiRGdPSllUakNSSmppUUpqaUJJYUxWYUxqYzNoL2ZZYkhPaXYvenlpM1hObWpVSFNKSjh4UVZkRlJ0QkVGQ3BWSGlqWjArc1dsVW1qbUV4VzlEMnBYYVM1Smxqd3JrbUcySmQ5dmdhUlZFb0tqSSswT0Y4eDl4b1pRRG80K05UWllVczIvTTlPVG41bnZiTllySDhyZGZyYmNOUXF3aHVCQTl1bkRSbFFKSWdDQklrU1lCV0tPRHU3c0VYRHh4bXJsaUx4WExRZGFyZEdkZ0FvRWYzTjNBNzlaYjBmSFNMRnRpemU3ZEVEYjU3OTU5SVNmbEhjdWUzYjl2S2g0TkNHZjErVGFWU3V3N0dYYTdOdzF5emlyYnQ1K2VIWW1OaHBhbVBxcVpJSG5hS3BqcmVsNXViKzA4bFlhaERLQ3FNVXBFa1NJSUVTWkpTVlJSQ0lvNEZ3R1ZrWkxpQXJZcW1VQ3JScDI5WnZxcEJnNFlZTnZ4ampCMHpHbS8zNm9rL2QrNUFjSEF3QUdENGlGSFl1ZU1QOUg2bkY3WnQyd3F5R21ZZnhUdTl5K3l0eUZoWTRXd3ArWkRXck1oWUNLcUNGcExBd0VCd0hJdk1qSFNuKzFhbmJzUWR3VUN0MXFCTzNZaUh1dTdWdForblRwNjQ2Z1RVeEVlWm1BdEI4SVVza2lnRE5aSUVvVktwQ0t2VlNyQXNTM0ljUjNFY0p3ZWdZRmwySDRCblhaY0ljUExVS2ZnSDNML3U1NFVMNTFHclZqRGMzTnl3Wjg5dWJOKzJGYk5tZjJ2M25nejliVHgvRjUzc04yN2NSSGFPaTBIWDBUTDBhZkR4OFVabzdmSnN0UStMZFpobjlmVkdtQk1HWGRFTUJnUDBlajJzVmlzS0gyQmorS05rSE1lZGI5ZXUzU1R3SWkyMjRpMUZBSW9KZ2hBMERnaUdJQWlXSkVtT29palFOTTNSTkEyRlFnRVpINTlLZVI4cEhMVmFyWHRrTXBrTDJBRElxaW4vVVZwU2lqR2pSL0hLNzFvdFBoczdydHdkWFM2WDM5VjNob2JXUm1hbUFSbjZOR2gxYmk3TkEyTWhqTVpDTUZhclUxQURnTERRVUJnTUQyN054SDFpR2FaU1VCTkRVajgvdjZmNkdCWVdGdjROSjdrMUFJd1lWWXF0SGhSRlFTNlhnNlpwS0pWS0tKVktxRlFxRUZxdGxyQllMQVRETUFUTHNoVEhjUlFBT2lzcjYyVXZMNitOTGxnRDB0UFRrYTdQRUJnNGFzNE1HZWtJRFBDLzZ5RjRqdU53L2NaTjVPUmtnN0d5S0MxOU9za25WU28xU0lxQ2o3Y1BRa05EN2xpb3VYbnpQMlJtWllHeE1qVzJaaXFWR3BSTWRrZFB6V1ZsZHVMRWlVK2pvNk92QWloR21jYUJrU0NJSXNHTE13djZCZ3hGVVp4Y0x1Y1VDZ1dVU2lXblZDcWhWcXRCdUxtNUVXYXpXUVEyMjNCVXliSnNNb0JhcnFVR1RwMUtCa0VRMEdoMVVGZnpIYjY0eUFoallRRUFybHI1MkZ6bXNzY3dERTBqU1hLa1RSaHFDMndsQUVvSmdyRFJFS1U0bXFZbFlGT3BWRkNyMVh3b1NwSWt4ekNNYlNqS0FXQVlodGxCVWRRSHJ1VUdtaldMUW5wNk9neUdUQlFXNUZYYnNMcE9wNE5NSmtOUVVDQUNBZ0pjQysyeXA5cEtTa3IrZ24wMTFDNFVkY0Fvb1llTnh6Q1NKRUZSRkNpS0tzdXhpVzBmd2xBcEM0QXRMQ3o4MDhQRHd3VnNnZ1VHQnRZSWZiZkxYT1l5M3E1Y3VYTEdBZFNzQUt3RVFkaTFlaEFPZld3aW9Jbi9Kc1h5cURoblpkUFR4bnA1ZWYwSjRMWnJ1VjNtTXBjOWlEQzBTWk1tMXdYd3NqbzhHRnRRQXdCYjdMSUZONHFpSUdOWmx1TTRyb3h0MHNaakE4QmV1M1p0TzBWUkExekw3aktYdWF5R3c5QjlqcDZhQTZpSnpMbWNHRjBLUEc4Y3d6QmdHQVpXcXhVV2l3VXloVUloa3JSSjAvOEMyTEVBR0hkMzkrM2UzdDR1WUhPWnkxeFdvM2I4K1BIa1NzSlFpZEZEOU5Ca01obmtjam1Fd2dIRXdvRldxd1ZwRzV2YWNMTko0YWl2cis5QnVGVGlYZVl5bDlWc0dIcXhSWXNXL3ptQW1nVVZNSG80NXRha0VGUW00eDgyRlFXQ0pFbU9aVmxDaUdGRnNRVEdiRFp2cG1tNm9XdjVYZWF5R3IyNG9kZnJrWkZoQU1Nd01CcWZuc21Ed3NMQ2ZiQnZ5cFVlSE1lSmpia2l3U1JZbHVVc0ZndHNkQS9BY1p3VWpzcHNQVGJCYStPSU1vVVhGZ0NUbHBhMkxTd3NiSXpyMUhPWnkyb08xSktUazhHQmtLWWgvSitpMzc5enh4OW5uSGhyVnZEVEJuYkVraVJKY3BSTUJscE9RNkdnb1ZBcW9WS3FvRktyb0ZGcm9OUHB5a0pSVzNCekRFZnIxcTE3bm1YWm5VL2FZaVltSmtLcFZEN1FiVnF0Vm93WU1RSitmbjV3ZDNkSFhGd2Npb3VMWFZmMlUyNTZ2UjRjQ1BnSEJEMTFZM0ZXcTNWdjdBZnZaOXNBbThYQmF5c2Zob29ENzdaaEtDV0RUQzZIWEM0SEtaUEpSRkRqYkR3MnpvYnRnd1hBRkJjWEo3bE92L3UzY2VQR0lTa3BDZXZYcjBkU1VoSjI3OTZOWWNPR3VSYm1LVGVESVJOYW5kdFQrZHZUMDlNT09RbEJMYWk0ZjAxb3hpVTVpaFNBVGNibjErUXlHZVEwWFJhS09oWVJDSUt3YS8xSVNFallQRzdjdU04QWhMaE93M3V6b3FJaXpKOC9INnRXclVMYnRyeVUyYUpGaTlDeFkwZk1tREZEVW1wMzJkTm5ETVBjazZkMjRmdzVMRjcwQTc3OWJsNk43dCtGQytleGRjdG1OR25TRkIwNmRwS2UvKzIzWDdGcDQ2OEFRYUJ0MjNiNElKWnZvS2hNWVBuTW1kTkltUHNkckl3VllhRmhxZGV1WDcvZzRLMUpZYWlJUDQ0TnVTUkZnaVFkdkRXaFNrclRkSm5IWmh1S2l1R29qZGZHakI4L3ZzUmlzZno2dEoxd2E5ZXVSWk1tVGFCU3FWQzNibDNNbTJkL0F1M1pzd2ZObWpXRFNxVkNkSFEwWnMrZWJRZFFQWHYyUlBQbXpRRUF5Y25KS0NrcGtVQU5BTnEwNFpXMmp4dzU0cnE2bjJJckxDeTRwOC9WYjlBUUU3Lzhxa2IzYmNIOFJDeGRzaGpYcmw1RlVWR1I5UHgvLzkzRXhnMGI4UDBQUzdCMDJRcWNPWk9NNDhlUENaL2hCWlpYckZ5TjkvdC9nQm5UcGtxcG1HbGZUOGFFTHliaXh4V3I0T1BydDJQdm50MFdaOTRhUU5oWFJFVndJMGxRdHVOVEFxako1SExJUmRvaXNUd3F2SW1qS0lwZ0dJWWpTUklNdzBoNU5nRFdXN2R1YmFwYnQrNklwK1ZrKyttbm54QWJHNHR2dnZrR25UdDN4bDkvL1lYaHc0ZERyVlpqd0lBQnVIcjFLcnAxNjRhaFE0ZGk3ZHExMHV1MnlrVTllL1pFYmk2dlAzcjc5bTNRTkcwbnFDR1h5K0h0N1kzVTFGVFgxZTJ5Y3BhZG5ZMnBYMDlHVnFZQkJFbGk4T0FoYU5ucUJhU21wbUxVaU9Hd1dNenc4UERFOGhWbDlQVGpQdnNVYVduOHdGQmVYaDdVR2czV3Jsc1BnRmVGU3BnN0Iva0YrZkR5OU1LWXNlTWtrUjRBV1AvTHo5aTRjWVAwZmdBWU1QQkQwRFNOMmJObTJPM2JQMmZPNFBubXphRldxMkcxV3VIcDRZa3pwMDhqT3JvRnpwdzVqWkVqUHdGZ0w3QnN5TWlBVXFWQ1dGZ2QwYk03VllHM1ppVUlNYjlHY0FEQkVRQkhrQ1JIa1NSSWt1S2tTRk1NUXdWdlRhRlFsZ0diVGE3Tk5oeTFteDJOaUlpNFlMVmFONUlrK2NiVGNGSjk4ODAzK09DREQ2UWNXR1JrSkc3Y3VJSEpreWRqd0lBQldMaHdJUm8wYUlCWnMyYnhkOC82OVpHU2tvSTFhOVpJMy9IMjIyVmlGY1hGeFU2TEZRcUZvcHdzbWN0Y0JnQS9yMXVEeG8wYm85LzdIK0RhdFd0WU1EOEJMVnU5Z09EZ1lQeXlZU011WDc2RXFWTW0yMzFtMmd6K2ZNelB6MFBjd0ZoSmY4TnNObVBxbEs4d1plcDBCQVlHWXNjZjIvSDlndm1ZOVBqTzdyUUFBQ0FBU1VSQlZHWFo1NXMwYlZxT2VmaE9Bc3VabVptWTl2VmtNQ3dEblpBbnRCVlkvdlBQblpMQWNrRkJBUlFLQmN4bU0rWis5KzJXWlVzWFp6bDRhcmJnSm9TaDRQaUhXRFN3U1ovSnlydzFXbWpXVmFtVUlPVnlPUnk4TmpnT3hndTlJZ3dBSmk4djc2a0pSOCtmUDQ4WFhuakI3cm1ZbUJqODk5OS9NQnFOT0gzNmREbXgydGF0VzFmNGZTcVZxcHhLRDhCclZUNE1mVXFYUGZvVzNhSWxkdis1Q3l0K1hBNVRhV21WQlZWWWxzV1hreWFpMnl1dm9VV0xsZ0I0YWNqVTFGdUlIenNHL2Z2MXhabzFxMkRJeUxEN1hMMTY5ZkhHLy9XOGkydmtIQ2FNSDR1QmNZUFFydDMvc3dmWUNnU1c4L1B6TVdya3gvQnc5empreEZ1ekxScEliQjYydVRXS3NnbERaUlJrTXJtTnQ2YUFTcVdHVEFRMnNXdFhERWNwaXVJRUhVSGIyVkhHeDhkbkQ4TXdod2lDYVAya24xUXFsY3JwQ1NQK1h5YVRsVk02cjB5VU5qZzRHS1dscGNqTHk0T0hod2NBd0dLeElEczdHN1ZxdVdqdlhPWUUyS0piSUhIK1FodzdmZ3dyVnl3SFRkUDRjdkxYZC96YzBpV0xvRlFxMGFmdmU5SnpGb3NGQVFFQmRtSHIvWmk3dXp0S1Mwc3grNXZ2NE9ibWhqTm5Uc05kT0s5RmdlV09uVHBMM3FKV3E0V2JteHNLOHZNeGVjcTBveSsvMU9aNkpkNmEyTHZHbG5WcENHRW9qMUdTUXlhWHlVREw1YUFWQ2lpVktxZzFhcEEwVFVNdTlINVVFSkxhRlJFQVdJdUtpbjUrR2s2cWhnMGJsa3ZxSHo1OEdJR0JnWEJ6YzhOenp6Mkg0OGVQMjczdStMZXRSVVZGUWFWUzRjQ0JNcUhrZ3djUGdpUkp0R3JWeW5VVnU2eWNUWnM2QmNlT0gwUDc5aDB3TG40Q2poNDlVdTVtNm1nSER4N0EvbjM3RUQvK2N6c1c0WWlJQ0JRVUZPQ3YvZnVrZk52bXBOL3RQbnY1OGlYODlsdlZnckxuR2plRzJXeUdRcUVBd3pBNGN2Z1FtalRsdFV3ckVsZ09DQXlFdTRjSDhuSnpkMWZrclFHRUhac0hRTmg0YkdWNU5jck9XMU5BcVZCQ3JWWkJxOUZDSmdKYlJVVUVtN1lQYVJLaGZmdjJ2eDQ1Y3VSRGdpQWVlMDBFbG1YeHh4OS9sSHUrYmR1MmlJK1BSOCtlUGZIc3M4K2ljK2ZPT0hqd0lPYk1tWU9KRTNteDRLRkRoMkxldkhrWU8zWXNQdmpnQXh3OWVoVGZmLys5WFZpNWJ0MDY1T2JtWXZEZ3dkQm9OSWlOamNYUW9VT2gwK2xBMHpUaTR1TFF2MzkvU1RIYlpTNnp0VDU5M3NQczJUT3diczFxc0N5TFVaOThDcElrN1lvSCtmbjVlS3ZuRzJqMi9QTVlPMjQ4RXVkOWg5TFNVZ3daL0tIMFBZa0xmb0JPcDhPMEdiUHczYmZmNEllRjMwT3RWbU9VZzQ1bzhxbFQyTGh4QTNyMCtMODc3bHRvYUJoNjlQZy9EUHB3QURod2FOT21yU1FlWHBIQXNrd213N2o0Q2VkZmU2WHIyUXE4TlF0QmlLQW1GQTBJOE40YVJZSWlLVTRtVlVMbFV0OGFyYUNoVkNtaEZpWVBpSjQ5ZXlJL1B4K0ZoWVVvS2lwQ2NYRXhTa3BLWURLWkNKUEpCQnM5QkpMak9Ca0FPUUJsVVZIUkFKVks5ZlhqZk5Ja0ppWlcyQng3L2ZwMWhJV0ZZZG15WlpneFl3WnUzTGlCc0xBd0RCOCtIRU9HREpIZXQyUEhEb3dhTlFwWHJseEJWRlFVV3Jac2lRMGJOa2k2b2oxNzlzU05HemR3NHNRSktaODJZc1FJckYyN0ZpUkpvbWZQbnBnM2I5NERuNEJ3MmFObCsvZnZSM2hrZzZmaXR4b01obStmajJwOEJEejl0NmhyWUFSUEJWNUNFRVFwRDNDRWxWZWhvamlaVENZcVVIRzJUQjRhclJZNm5RNmVucDd3OGZGRlVGQVF3c0xDUVBUdTNSdDVlWGtvS0NoQVVWRVJpb3FLVUZKU2d0TFNVcGhNSnNKc05zTnF0WklzeXhJMmVnajA0c1dMdldKalkvOEFFUDYwbm93cEtTa29MaTVHeTVZdHBlY21UWnFFYmR1MjRkaXhZdy9VNjd4eDh6L2s1T1NBWVJpVWxqeWRJMXBLbFFvVVJjSEwweHRoWWJVbDhsUm54bkdjc0diWnNGcHJiczJVS2hWa01obTh2YndSRmhiNjFBTWJ4M0hYUGhzemV1TGFOYXVMQUpTZ1ROZkFDRjVhcndTQVdRQTJScERXWTRWd2sxTW9GZnhjcUVvRnRVWURuVllMTjNkM2VIbDV3OS9mRDhIQklRaVBpSUJNcFZLaHBLUUVORTNEYkRaRExwZkRZckU0VmtodFExSUdBRE53NE1DQzNyMTcvNlJVS2ljOWpnczhiTmd3SkNZbTNzOEJ3cFVyVjlDM2IxK3NYcjBhVFpzMlJVcEtDdWJQbjQvNGVON3R2cE5La3FQcDlYcjQrOS9kNkxQSlpNYVpNMmRBeVdUUXVibTc1UGVLak1qTnkwWFd5VXcwYmRJVU5DMTNldXhPbkRnSmtxS2cxZFg4bWhVVkdaR2RrNFBNckV4RUM4M2FGZG50Sjd5Zk1UYzNkL1BhTmF0Tk5pR29XUVF5QUJZT1lBZ0hiUVB4UHh6SGdXTTVzQ3dMbG1WNUpnK0J6Y05xdGNCaXNjQmlOc05zTXZQQXBsUXFVVkpTWXBkcms4bGtzRnF0b0NnS0RNT0E0emlKTnB6ak9BWUFzM256NXAvZmZQUE45d0RVZmR3V09DRWhBUWtKQ2ZmMUhUMTY5RUI4ZkR4R2pCaUJ0TFEwQkFjSDQ5TlBQOFhISDM4c1hVQTFiZW42ZEZBeW1Vc3dXVENOUmd1TlJvc01mUnJTMHRNUUZscmVTN3ArNHlaSWlucGdhMmE3VHpkdi9vZlFTbVQ0YWdVSFA4bmUydldsUzVlY2RBQTFtOXhhV1l0SEdhRWtCYmxNMUEzbHE1Nml0NmJWYXVIdTdnNVBUeS80K2ZraE9EZ1lkY1BEMGFqUnN5QTFHZzJVU2lVVUNnVm9tb1p0TVVFb0lvQ2lLTTZtbjAxcy9iRDI2dFVydDZTa1pPWFRmQ0hGeDhmait2WHJNSmxNdUhyMUtzYU1HVk5wQ0ZUZGxwMlYvZFFPVDFkbVdwMGJzckt5bmI2V2s1UHpVTlpNcTNORFZuYldVM3RNc3JPemt4WXZXbGdLKzRLQkNHNFNrNGR0aXdjZmlwS2daQlJIVVE3TnVNS1VnVnF0a2tETzI4c2JNcGtNcEZhcmhWcXRobEtweEwyMGZxeGJ0MjR0eDNFdWh0MkhjZ2U4OStIcHA4RnpZMW5HNldzUGE4MDBHaTBZSy9PVW5xdmN4VzltenpyaEJOVEVmRm81d1JaZTZaMTBtQWZsUjZma0FxaXBWRXBvTkJxNHVibkJ3OU1Udm42K0FBQ1pUcWVUS3FKQ3djQXUxeWFUeVRpcjFVb3dET08wWVRjMk5qYi9yYmZlV3FIUmFLWS80UWNHZXIwZUJvTUJWb2FCc2JCNjJFMjFXaDFrY2huOGZIM3ZXdHFQSUlDU0VoZVhXMFZXVWdIUDNjTXNydHpyOFNLU00wSE1Ud2F1NU4zYmhpTTh3QTJKQWhmbFd5Mi9veUEvSHpldVgwVlJrYkZTSUErckV3NDNkM2RrWkdRa3JmcHBSWVc1TlRocHlDVkprdVA3MW1TY1RFYnhvQ2FUZzZiTGRBNTRqUU1kNzYxNSswQ2g0THNMWkI0ZUhpZ29LSURSYUpTcW9XYXpXUUkzcTlVS21Vd0dobUhFcEozVTB5YmsycXh2dmZYV21pMWJ0cnhCRUVTTEp4WFVrcE9UQVlLRVJxdmoyVTJyVWR1NHFNaUlkSDBHMHRQVHExMEpmdGZPSFZpK2JDa01oZ3dFQlFWaDVhcTF1SHo1RW1MNzk1UGVNelorQXJwMjdlWkN3a2ZaRXBPQnEzbjMvdmtyZVNEbUo0TmIwckZhZHVmNnRTc29MaTY2NDNsOTQvcFZQTnU0NllsM2VyMlo3QVRVbkhwcmtKaHliWWZjNVpETDVKRFRmRE91UXFHQVVxV0NSc05QTTNoNjhYazIwV1NlbnA3SXk4dERZV0doYlE4YmFKcm1xd3dPWHBzTjY0ZWsxcng5KzNaelFVSEJqKzd1N2s4a3NPbjFlb0FnNGVkZk0yTEpZbkxab0U5RGVucDZ0WWt5cDZXbFljYjBxZmh5OHRlSWptNkJnZ0tlR2ljaUloSzdkdThEQUF5TWZiL0cxbTNaMGlWNHZYc1BPellUY2IvbXp2a0dLU24vZ0tacHRPL1FDWU0vR2lJTlg2ZW1waUpoN2h5a25FMkJRcUZBeDQ2ZDhHSGM0SExEMmRWcGQ5cm1pekV2UUM2WGd5QkloSVdGb1gvc0FMUnVIZlBBemtIaWZrRE5CdHlxeSs0RWFyYmc5dC9ObTF1dlhMbHN2WU8zeHBUUHJWR1FVUlFualU3SjVUd2RPRTJYZVdzNkxkdzlQT0R0N1dNM0FrbjYrUGpBdzhNRE9wME9hclVhS3BVS0NvVkN5clU1eTdjNXk3VjVlSGhzWmxsMjI1TUliQVpESmpSYVhjM25ZSFJ1TUJnTTFmWjlGLys5QUI4Zkg3UnVIUU9hcGlXZU9JSWdvRkR3ZDcyN2JVbTVHL3R4K1ZMazVKUlA0RSthT0FHMWdvUHgyKzlic0dqeE1odzljaGhKU1pzQThEMTVZOGVNUnIzNkRiRHA5eTFJU0ZpQS9mdjI0cmVOTmNlOVVOVnRKaTVZaU0xYnQ2Ti83QURNbmprZEczL2Q0UElrNzJCV3EzVlhtNWdYTGpqeDFDcjAxa2c3YjYwTTFPVENQS2hDcVlSS3hjdnN1YnU1dzh2VEMvNDIzaG9Ba0g1K2Z2RHk4b0tibXh1MFdpM0U5Zyt4U21vRGJKd05oYmpkaUJYNGFYeUx3V0Q0OFlrOE9JejFnU1NiTlJvdHJGYnJmWC9QNmRQSjZQNWFOOHlhT1IxNnZSN2RYK3VHN3E5MXc0b2ZsMWY1TzQ0ZU9Zdys3NzZOOWkrM1JXei9mamgzOXF6ZDYvdjM3VVcvOTNxamErY082UDkrWHh3OWNsaDZiZGpRajlEOU5UNjBIZm54Y0hSL3JSdUdmalJJQXBHMmJkdmh2WDd2UTZGUXdNL2ZIODJqbzNIcDRrVUFmTVhTMDhzTHZmdjBBVTNUQ0E0SlFldVlOdmozMzVxclQ5M05ObFVxRlZxM2pzRzQrQWxZdkdpaEhmSGlrMkJGUlVWSStuMFR4bzRaWFQwaDYvWHJPMkUvRTJvSGJCekhXVG1PWXppT1kxbVc1UWhBOHRaS1NvcTVUSU1CcWJkdW9hQ2dvSXk5UTZtQ1JxT0dRcUhBZ3ZtSk9IandMNmpVYW50Z0N3b0tnbytQRHp3OVBhSFQ2ZURZL2xGSmxiU2MxeFlZR0hqWVlyRXNlZEtBcmJvS0JWWGFsdEY0MzkvUnRHa1VOaVZ0eGNjalJxRldyV0JzU3RxS1RVbGIwZS85L2xYNi9OVXJWL0Q1aEhnTUhqSVVXN2Z2eEp0djljS29rY01saXB1Yk4yOWd5dVF2OGRsbjhkaXliUWRlZmZWMWpCOC9UaEtsU1VoY2dFMUpXd0VBYytiT3c2YWtyVWhjc0pBLzRVZ1N2ZnYwaFllSHAzRGlYOFBoUTRmUXNpVlBBdURqNDRPRXhBVlFLbFVTRUo1T1RrYmp4azFxYk0zdlpadlJMVnJDYkxGSWdQdzRtZU1RdmZoM1ZsWVdCc2IyeDVVcmw2dmxSbEphV3JwbS9Qanh0eHhBemVUb3JmRmpVenllTUF3RGtxVEFzZ3dzRmdzL1NSQWVqc3lzVExBY0I2VkNDWlhRM25IczJGRW9sVXE0dWJtWDJ6YXBVcWtRRUJBQWIyOXZ1THU3dzdiOW96S3Z6VmxmRzBFUWxuUG56cTBFY052bGhEKyt0bVZMRXRxKzFBNnRXOGRBb1ZDZ2M1ZXVhTkN3SVhidTNBRUE4UGIyd2JMbEsvRk1vMFlnU1JLdnZ2WTZMR1l6YnQzNnI4cmJPSGYyTERxMmI0ZCtmWHVqUWNPR2VMSHRTMDdmdC9ENytWQ3AxZWphN1pVSDl2dXJzazJDSU9EbDZRVmprZkhST1hBRW9QMGdDbTZqL3dkQ0tZUHF0ZnB3RzljR2hKdkM3bTJqUjQzQTZlUlRBSGpHM084WHpBY0FlSGg0NEtmVmE5SHYvUStxWTI5dUh6dDI3SzhLUERYYjNqVVc0SE5yRkVWeEhNZHhGRVdCWlZsT29WQUl3KzBxZUh0NXdXZ3NoRW9vR09UbDVjRnNNdUhGRjErRVhGNSt1b1FFZ0tDZ0lQajYrc0xUMHhOdWJtN1FhRFJRcTlWU0hzWVpBMGhGdWJhb3FLaXJ4Y1hGUHp6cEYzL1h6aDFRV1Boa0N0cnE5WG9FQnRwMzVkZXVIUWE5UGgwQW9OVnFjZkxrQ2NSOUdJdmU3L1RDKysvMWNlb0pWR2FObm4wV08vL2NpNS9YYjBSNmVqcVdMUzN2Nks5YzhTUCsvdnNvcGs2ZERwbE05a0IrZTFXM3lYRWNjbkp6b0gyRWVnaVZIU05BcU9SZ2Mwcmd2ZlExcU45b2lOSS9yOEw5VTN2cXhDRkRoMlBxMTFPUW1EQVAyN2R0UmQvMytBcTVlRzFYaCtYbDVmMlNtSmlZNitDcG1aem4xaml1VE1vWWtNa29LSlJLbU0xbVVDU1BOY1hGeFNBSVFuQzZGRGg4NkJBR0RJaUR6czE1bzdVTTRLbC9Bd0lDa0pPVFUySHJoOFZpRVdheXJKekE5c0d4TEF1Q0lGaU80d2piWEZ1Yk5tMVdIajkrdkIxSmt1MWMvcy9qWi83Ky90Q25wOXZmZm0rbklpcUtiMFU1OE5kK3JGNzFFK1o4TncvQklieG8yWXN4THpqMWFoekJ6bFJhaXUzYnQ2RkxsNjVRS0pVSURBeEUrL1lkY1BEZ0FidjNiVmovQzNidDNJRzVDZlBoNXU3K1FINzMzV3p6K1BGam9PVnkxS3RmLzRFZkgwWHJFTGpIdnlqOWJmazNFN21mN0lTOG5qZEt0bDJHOVhvdWRNTmJJbmZrRHBpUHAwSDdnWDBMVVhoRUJEcDI2b3lWSzVaajVxeHY0T1oyNzFNWWNya2M3ZHJaWCtZN2R1dzRNSHIwNk9OVjhOWVlBVDlZcTlYS0NaRWdLSm1NVXlxVUlBa0NOMjVjbDRZSGVEWVBEVTZmVHNaTDdWNUd2UVlOOE8vRkN4VURHd0NFaElRZ0t5dkxhZXVIQ0d3aXVERU1JejJFR1ZJV0FDSDJ0U1VuSjVzTkJzT1NnSUNBcHhMWWZ0MnducS95Y1J6YXZmei84SDcvV0FCOG04TlhrNzVBWVdFaG1rWkY0ZERCQTFJdTZrR2JiWkdDWTFsWXJWWnB3cVRiSzY5aXlPQTRkT2pVQ2MyYVBZKy8vdHFQYzJkVDhOblljUUI0Z1JHQ0FFaUtRbjUrSHJadTJTSjhqLzFzYkdCUUVJNGVPWUs2ZGNPUmw1c0xYejgvMEFvRmZscTVBdm41ZVhpM2QxOFVGUmx4NE1CZmFOS2tMSisxWlhNU052MjJFWE1UNWo4d25ycXFidE5rTXVGMDhpbk1tREVOY1lNK2VpaVU3cVpEdDJEb3RycjhNYjJlQzdxSlArVFArY0Y2TXcrcVYrdkJjamtiY0RndU8zZjhnWDE3OTJESzE5UHd6ZXhaK0hyYWROU3JkMjhBYmJGWXNIT252WmI2dFd2WHRoWVVGRGhPRjRnZVd6bUdYSXFpUUZJVXdIRlMzNnhjTGtkQVlDQTBHZzEwV2gzKytlY00vUDBEUU5NS1hMMXlCWVVGaGJqNDd3WGs1R1NESkVuSTVYTDBldnVkOHNBbWhxUzV1Ym5JejgrSDBXaEVjWEV4VENhVEhialplbTBNdzNBY3gwRjRTTk1JQUN5QmdZRUhUQ2JUZkpxbWh6eE5vSlo4NmhTMmJFbkN3aCtXZ0tJb2ZESnFCRUpEdzlEdTVmK0h1WE8rUWZzT0hkSHp6YmR3N08rak9PVGdwVHdvYzJ6UW5URjlLbVpNbjRvT0hUdmg4eThtSVRLeUhpWitPUm5mTDBpRVBqMGR0VU5ETVhQMnQ1S2FVWmV1M1hEMmJBcGkrNzhIaXBMaDllNDlFQmxaRHptNU9YYmJHVFZxTkdiUG1vbmx5NWFnZHUzYVdMSnNCV2lheG95WnM1R1lNQmMvcjFzTHVWeU90aSsxay9JNkRNTmcxa3crREh5bmx6MzMvc3BWYXhBUVVQMjloRlhkNXJBaEg0RWdlSUxGVDBhUGVhQjliRld4a3UyWDRmYkovMEQ1cUpIVmV5TTBiejREOTg5aWtEL2pvTjM3VWxKUzhPMmN1ZkR6OTRlYnV6dE9uamgrejhCV2JoOUtTbjRjTjI3Y0RRRzh6STRGQTFRd1pRQ0FzMWdzMEdpMW5OeEd3MEF1cDVHV25nYVpUSVk2ZGVyQ3o4OFAwMmZPUm9QNkRlRGo2NHVGMzgrSFZxdXpBN1Z5d09idjc0L3M3R3prNWVWSndDYU9XWWtlbTQzWDVoaVMyazBqRUFSaDNyTm56L0pPblRyOWp5Q0lxS2NGMkk0ZE80b09IVHBKellLdnZQSXFqaDM3RysxZS9uOUlTZmtIRXdWRm9QQ0l5QnJmbDA2ZHU2QlQ1eTdsbm8rTXJJZS9EbGF1WTlxNmRVeUZGNjVDb2NDRXp5ZmFQVGZ3dzdoeTcydlJzaFYrMmJDeDNQTVJrWkg0YnA1enlpaUtvckQvd09FSGVzeXFzczA3cmRmOW1rNVhEWDJTREllQ21ZZWtQNDNMVHdQTFQ1ZDcyeWMyckxsTm0wYWhhZFBxdVR3NWpqdnp4eDkvT0JZTWJITnJaaW0zUmhDc1FQbk5XYTFXRGdDVVNpV24wK21rV2RDaW9tSmN1bmdSL3Y0QjZOQ3hFOC9rSVV3WStQaFdQaHBXTGp0YXExYXRjcmsyMFdOejhOcWtjSlJsV1Z2VmVJYmpPQktBdFV1WEx2cnM3T3dmdkx5OEZqNU5YcHR0ejZ2QVl5Y2xuR3V5SWRabGo2OVJGSVdpSXVNalFXamc3ZTE5VHltU3RMUzBqV3ZYcmpVNkFUV1RIYWp4bkdzc1FZQWpTWktuOXBielBXcmkySlNDcHVIdDVZWDY5ZXNMdEVTKzhQRHdnSStQajkxa3pxREJ6Z1BDY3Z3Njd1N3VjTmJiVmtIakxpZlNHMVhVdE92dDdiM2RZckVzZmxwTzBPYk5XMkRYenAwb0tTbUJ4V0xCdHExYjBFTG8wV3JhTkFyYnQvRW56T1ZMMWRQL3BGS3BYYWh3bDJ2ek1OZXNvbTM3K2ZtaDJGaHhsWjBMOTdoL2o2b2F2a00wdGRvK3QxaGFXcnA2NU1pUkYyMUNVSk9EdDJaWE1DQUlnaU9FWm44WnJ6akZ5ZVV5WVJhVWxtWkIrU0YzZ1NYWDJ4disvZ0dTZHVsZGVXd0FYMGdRdlRaYnFuQkhyODIyaUNCNmJTeGZCbU9FU2lsSkVBUjE2TkNoWlczYnRuMmVJSWhtVDlLRk0rQ0RmaUFFN2pWZlh6OGtKQzdBODgyYm8xUG5MaGowSVY4d2FQUGlTMmpYN21VQXdQQVJvL0RseE0veDY0YjFDSStJNEJPbVQ5Q2QvbEd5SW1OaGhhMEw1RU5hc3lKaklhZ0tXa2dDQXdPUm5wNk96SXgwcUFXaUJUc2JHZ1V1TWZtZVowYTVjQTlnYVBWbGhPclVqWkFHNFRtT083MW56NTY5VHZKcXR1MGRqa1VEZm5SS0hKdVN5eUNYQzU0YkxZNU5sUTI1ZTNsNndjL1hyOG95bFU1WFdTNlhJemc0Mks2SVlFdHBKSWFpanUwZlRnb0pWZ0NXZHUzYXBXWm1aaTcwOGZGWjlEaGVKRm9uK1k5dGYreXE4UDI5M242blhESVRBUEx5Y2pGejlyZHdjM1BEbmoyN1VWSlNVcVZ0M1Nsc3lNN0pjUUdiZ3htTmhmRHg5WEg2bW8rUE43S3pIL3lhR1kyRjVRZ0JiSzFaczJZd0dBelE2L1VvS3N5Mzc1UFVBaGhiRzBEdCs5aURiT0J5ZHZWZEYxb050Rm9OYnQ2OHVmSEhIMzhzcUNnRWhZT3lPNStWRVpUdk9BNGN5M0ljeTRKbEdUQ01sWDlZTGJCYXpMQ1lTMkV4bDhKVVdneFRhUkZ1WHI5eTc4QUdBQUVCQWNqTnpiWHoycHpsMm13OU5vZENndWkxV1FpQ0lIMTlmWGVXbHBiT1ZTZ1VIejl1RjRtc211N3dwU1dsR0RONkZLLzhydFZLN1JPMmQzUm5YZFNWV1dob2JXUm1HcENoVDROVzUrYlNQREFXd21nc0JHTzFJclMyY3hBSUN3MkZ3ZkRnMWt6Y0o1WmhFQlphT1RENStmblowZTg4NnBhZm43L2twWmRldWxTUnQwWVFoQWhzREVFUWpNamNJYXBPMFRRTmxVb2xlR2RsZE45ZVhsN3c5UzFUbldyUW9BRWFObXhZOVd1MnNoZHIxNjVkWVYrYm85ZkdzaXpoVUVnb1Z5VmR0V3JWMHY3OSt6Y2lTYkw5NDNTeCtQbjVJVjJmY2Q4WFFGU3pabGk0cU9KUjJxSWlJd0lEN2s3TWhTQUlORy9lSE5kdjNFUk9UamJ5Y25KUVd2cDBraytxVkdxUUZBVWZieCtFaG9aVSt0NFcwZEc0ZWZNL1pHWmwxZWlhcVZScVVESVp2TDI5N3docWo1dFpyZFo5RXlkT1BPQUFhcVVpc0FtZ1pwOVhFN1FNUkNWM3VWek95ZVZseEpHMkFPZmg0UUZ2YjI4RUJBU2dkdTI3V3p2aVRvSWp0Mjdkd3ZuejUzSHQyaldrcHFiQ1lEQWdKeWRIQWp4SExWSUI5QWlXWlFtV1pTbU80eWp3V3FRMHgzSEtHemR1dEFvTkRaMEw0TEZTSHpsMUtoa0VRVUNqMVVGZHpYZjQ0aUlqaklVRkFMaHFKNXAwbWN0cXlOSVBIVG8wT3lZbTVwWUFaQ1hnTlVLTFlLOFBhaXVseDloNmF3cUZncFAwUVRXODBMR0hod2U4dkd6RVdlcld4VFBQUElPUWtKQzdpN0x1OUlhUWtCQkpVTmt4MStiWStpSEtZbkc4MlU0a1dIbm5naUREd3NLT0Z4UVVKT3AwdXFtUDAxRnMxaXdLNmVucE1CZ3lVVmlRVnkwc0hBRGZ2eVNUeVJBVUZJaUFnQURYNWVLeXg4SnUzNzY5S2lZbUpsVUlNOFhRczlSSkNHb1Z2RFZwMEYwaWpSUkNVVnVhYjFHL1FBeEZhOVdxZGRlZ1ZpVmc0L000b1U1emJVNTYyc1JDZ21Odm16aHVaU0VJZ25KemMvdlpaRExWcFdsNndPTjBNQU1EQTZ1TjNkWmxMbnRjeldnMHJnNE9EajRGKzlZT3h4RFVZaE9Dc3M1QzBJcEFqVmQxOTBGUVVCQkNRMFB2YVIrcnBCT24wK2tRRWhKaVIyOWt5N2dyRHFrSy9XMTJ2VzJDMXliMXRva0xzV3ZYcmlVc3krNXhuU1l1YzlsamxWZmJ2M0Rod2oxd1hnR1ZQRFk0eklNSzVKR2NMYWpSQXNXM0dJN3FkS0lvQzU5WEN3a0p1ZWVKRE5uTm16ZXJqb0k4VlpIVDdubnhPZkYxNFNFbThGaWhBNThRd2UyVlYxNUpPM0Rnd1BjaElTR2hBTUpkcDR6TFhQWm9HOGR4MTA2Y09KSDA2YWVmRmpvSlFjdUJtaUNBYkNlblo0c2ZGZUVJTCtSQ2dtVlozQTArMlFIYjNiaDZ2cjYrVGljUmJBU1dZVU1mVHBoTUpoQUVBVUc2VDJvQklmaGZSTFpwMCtaRVRrNU9ncWVuNSt5cWhzVXVjNW5MSG82emR1M2F0VFZ2dnZsbXFvTzM1aXdFdGRxMmRvamhwOER2S0JVTXRGcXRYZWdwVmo4akl5UFJ1SEZqcU5YM1BpRnlWMkNpVnFzUkdocGFib2EwZ3ZsUmptVlpRaXdrY0J6SENnVUYyNmtFMHN2TGEzTnhjWEdRU3FVYTR6cDNYT2F5UjlPeXM3TVhoNGVIbjdYeDFFcHRId1JCbUd4QnpURUVGU1FHeXVYVmJNSE5WOURXRFEwTnZTOVF1MnRnQS9nRWVrVjhiYzdHck1UR1hRSGNPR0VxUWN5M2tRRElWcTFhTFRseDRvUy9YQzd2NXpxRlhQWVVoM3JRNi9YSXlEQ0FZUmdZalk4R1EzTnBhZW5QNzc3N3JtMi9XcmtRbE9NNENkUTRqbU1GUmx5T1pWbU9ZUmc3dmo4eHNoTWZZcFZVb1ZCQXJWWkRMcGZqMHFWTER4YllBQ0E4UE56cHFKV1RhUVJPNkdjVFI2M0VXVkxiRmhEaW4zLytJZmZzMmJPNGZmdjJmaFJGZFhHZDRpNTdHa0V0T1RrWkhBaHBHc0wvRWRndmk4WHk1MDhyVit6S3ljbXhPQUUxMndrRGZteUtJRmdDWVBsMEZLL2VMakIzY0VvbEw4U2kwV2o1bmpWM0QzaDVlOEhmUHdDMWdvTVJYamRjMHRHNFg3dW5iNkFvQ25YcjFrVndjREQ4L2YzaDVlVmxWeWxWS3BXMitUZE9aQUt4VmJZUzNGVXIrQllRYytmT25WTXZYYnEwa09PNFk0L3pDYnBwMHlZb2xjcUtFeFZXSzBhTUdBRS9Qeis0dTdzakxpNU9VbmR5MmROcmVyMGVIQWo0QndROU1tTnhMTXVlUEhUd1lOTEVMeVlVT09UVVNvUkhxUjJvU1hSRUpGZStDbHArdWtEbnBvT0hoNmRFUlZRN05MUmFRTzJlZ1EzZ0ZXM0N3c0lRRkJRRVIyMVNKeXBYb3BxelhRdUlBN2labm5ubW1aUzB0TFFGSE1kZGVWSlA0SEhqeGlFcEtRbnIxNjlIVWxJU2R1L2VqV0hEaHJtdTdLZmNESVpNYUhWdWo4eitjQngzOWR5NWMrdjc5bmtud3dIVWJDdWdKanRRRTNyV1NGS2FCNFZjSnVma3RDaDBySUJLWlQ5bDRPUGpBLytBQUlTRTFMNHY3WVZxQXpZQUNBNE9SbWhvS0FJREF5WCt0a3JBRGJiOWJRSi9tMFFsTGp4TXdjSEJCM0p5Y2hJQVpENXBKMjlSVVJIbXo1K1AyYk5ubzIzYnRtamJ0aTBXTFZxRUZTdFdJQ3NyeTNWMVA4WEdNTXc5ZVdvWHpwL0RxQkhEcTN0M3NtN2V2TG02YStjTzEyRS8yRzRIYkFSQldEaU9zNGlDeHh6SENSeHJGRWVRSklxS2pNak56VUdtd1FBQ3ZOaTBScTJHMldUQ2diLyt3cFl0bS9IbnJwM3c5dmF1OXNiMysvYjc2dFdyaDlxMWEwdmc1dUhoWVNmaFp3TnVZa2dxOXNPeHprSlNBQ1lmSDU5dCtmbjUzd2tMV0tQV3FsVXJUSmt5QlMrLy9ETFVhalVpSWlMd3h4OS9ZTzdjdVFnT0RvYTd1enNHREJnZ3FTMk5HREVDblR0M3R2dU83dDI3WTlDZ1FVNi92MmZQbm1qZXZEa0FJRGs1R1NVbEpXamJ0cTMwZXBzMmJRQUFSNDRjY1YzZFQ3RVZGaGJjMCtmcU4yaUlpVjkrVloyN1VxclhweTl2MDdyVmVaUzFkWlRhaEo2OHQyYlgya0V5SkVteEhNZXg0RGpJWkJUTUpoTlVLalVYRWxJYi9nRUJTRTlQaDFxdGdWcWpRVXJLUDNqbDFWY3hldlFZUkVSRTR2Q2hROVcrbnZmZE8wWVFCQ0lpSXB3cVdqbXJqb290SUFBSUFFNkxDUnpIa1I0ZUh1dU5ScU5HbzlIRTEvUkpOWDM2ZEd6ZXZCa3hNVEVZTkdnUWV2VG9nZTdkdStQQ2hRczRmLzQ4MnJWcmg2NWR1K0tOTjk2NDYrL3UyYk1uY25OekFRQzNiOThHVGROMm5GeHl1UnplM3Q1SVRVMTFYZDB1SzJmWjJkbVkrdlZrWkdVYVFKQWtCZzhlZ3BhdFhrQnFhaXBHalJnT2k4VU1EdzlQTEYveFUxbTY0N05Qa1piR2E1Ym41ZVZCcmRGZzdicjFBSUNyVjY4aVllNGM1QmZrdzh2VEMyUEdqcE5FZWdCZytiS2xpNy80ZlB3cEIxQXJ0UUUzdmxnQVdJUnJsaVVJc0FSSmNBUkhnT000VGlhVGdXVlp6dDNESFFxRkFnUkJRSitlRHJWS0RZcWlvRmFyVWI5QlF3VFZxb1dpSWlNT0hUejRNcm5Fd0FBQUlBQkpSRUZVNkFFYndJOWNoWWVIbHlPakZNdThUZ2JrYmZ2YklJU2s0bVNDQ0c2RVZxdGRXVnhjckZLcFZDTnI4dVRwMGFPSHBJMzR4aHR2WU5teVpaZzZkU3AwT2gxYXRteUpaNTk5RnVmT25ic25ZSHY3N2JlbGZ4Y1hGenN0TENnVUNwaE1KdGRWN0xKeTl2TzZOV2pjdURINnZmOEJybDI3aGdYekU5Q3kxUXNJRGc3R0x4czI0dkxsUzVnNlpiTGRaNmJObUFVQXlNL1BROXpBV0l3Y05Sb0FZRGFiTVhYS1Y1Z3lkVG9DQXdPeDQ0L3QrSDdCZkV3U0JJYnk4L04rK09MejhZZWRoSjRsZDhpcmNTekRpRlJsa010cFVad0ZSVVZGTUFwc3hrb1ZINzFwdEZyNCt2cGkrN2F0eU0vUFIxNWUzcU1KYkFDdmNHVkxJVzdidEd2anNkbjJ0VW5neHBhcDZqSUMwRW5nOXRaYmJ5MVp2MzQ5clZRcWEwekd6M2I2UXFGUVNQbEQwV2lhcmhiZ1VhbFVNSnZONVo0M21Vd1BSWi9TWlkrK1JiZG9pWVM1Y3dBUWFOR2lKV1ovTTZkS24yTlpGbDlPbW9odXI3eUdGaTFhQWdDdVg3K0cxTlJiaUIvTDk4S3pIQXVOb0YxUVdGaTQ3SjFlYisxSCtha0MreERVUmtKUEZEdG1HSWFUeStVYzc1eUFvMm1lTERYVFlJQkdvMFYwZEF2OC9mZFJ1THQ3UUtWVWdtVlpyUGh4T1hyMWVoc05uM2tHNDhlTmZYU0JEUURDd3NMc3RCRWNweEZzaUNoaDQ2MXhBdmlKa3drUW12MUFFQVN4WmNzV1l0cTBhVXZpNCtObENvVWlyaVpPSHBrVEh2cUsxS1NjUFcreFdLcTBuZURnWUpTV2xpSXZMdzhlSGg3U1o3T3pzNnZNNWU2eXB3ellvbHNnY2Y1Q0hEdCtEQ3RYTEFkTjAvaHk4dGQzL056U0pZdWdWQ3JScCs5N2R1ZHBRRUNBWGRnS0FFYWpjY1dFK0hGN1UxTCtjZXhUY3dRMU96WmNvZG1lb3hVS2pwYkxZYlpZUUpFa2FJVUNGRVhCMTljWGRlclVoYnU3QndpQ1FHQlFJSFJhSFJpckZSTStuNGp3OEhCY3ZQaXZkQzA4c3NBR0FQWHIxeStuUmVvWWpqcDRiU0s5RVd4eWJveVFneU1JZ2lDKyt1cXJQRjlmM3lVREJ3NGtGUXJGd0lkNW90RTBYYzUxdm5UcFVwVTRvNktpb3FCU3FYRGd3QUc4K3VxckFJQ0RCdytDSkVtMGF0WEtkUlc3ckp4Tm16b0YwUzFhb24zN0RtZ1IzUUp2OXV3QmxtVXI3ZmM2ZVBBQTl1L2JoNFdMbHRqZGlDTWlJbEJRVUlDLzl1L0RpMjFmd3RXclYzSHE1SW1menA0OXUyZmp4ZzBsTnA1YWljUERSQkNFV2NpcDJiSGhNaXpMeVNnWlpESTVTa3BLT0hjdmJ5aVZTdWgwYmxBbytQK1hta3I1SnR4YXdRZ0xEVU5BWUNBVU5NM3Y2NEVEYU5LMDZhTVBiQVJCb0g3OStoS3dPWHBzRE1QWWVteTI0QVpoRkFOQ3ZzM3VPNGNORzVaTjAvU1NmdjM2NFdHQ1c4dVdMVEY3OW13c1c3WU16WnMzeDZKRmk1Q2VubDdoKzlldFc0ZmMzRndNSGp3WUdvMEdzYkd4R0RwMEtIUTZIV2lhUmx4Y0hQcjM3dzh2THkvWFZleXljdGFuejN1WVBYc0cxcTFaRFpabE1lcVRUMEdTcEYzeElEOC9IMi8xZkFQTm5uOGVZOGVOUitLODcxQmFXb29oZ3orVXZpZHh3US9RNlhTWU5tTVd2dnYyRy95dzhIdlFOUDJUaDZmbm54dlcvMUlFKzBLQmJRT3V5WEVPVk9wWG95Z1FESU9Ta21LVWxwWndhclVhbmw1ZVVLbFVxRmUvUG03ZXVJR2pSdzlEcDlPaDE5dnZJaVE0QlBYcTEwZjgrTTh4ZWZJa1dNd1doSVNFWU16WStFY2YyTVJjVXIxNjlld3FwTGE1TmlHdlZxNllBUHRLcVMyNEVRUkJFSEZ4Y1prbWsyblJ3SUVEV2FWU0dmY3dUclRYWDM4ZEkwZU94T2pSbzhHeUxQcjE2NGNCQXdhZ3ROUjVaOHFHRFJ0dzQ4WU5EQjQ4R0FBd2UvWnNXSzFXZE8vZUhTUkpvbWZQbnBnN2Q2N3JDbmFaVXd1cFhSdHo1ODEzbXRiNFpjTkc1emZUWDM2dDhQc2FOR2lJaFl1V3dHZzBycGcxYzhhZVpVc1hWd1Jxa3FjbWdocEprZ3hRUmhvcG95aE9ybFNDcGhVYzMzd3JpTEtvTlhCemQwZGtaQ1Q4L1B3UUZGUUxZWFhxb0c1NE9KUktKWjU3cmpGK1dMUzBSdGZ0anBvSDkyTVpHUms0ZCs0Y3JseTVndFRVVk9qMWVtUm5aNWZUU3hCQ1YwSUFRRUpnNFNVNGppTnROQlBrSE1jcEFDZ25USmpnSGg4Zkg2dFNxWWE0VG4wK1VYemo1bi9JeWNrQnd6QW9MWGs2UjdTVUtoVW9pb0tYcHpmQ3dtcFhHcTV4SENlc1dUYXMxcHBiTTZWS0JabE1CbTh2YjRTRlZVd1J0bi8vZm9SSE5uZ2c2MVJZV0xoc1F2eTR2VGJocHpOUXMyWHNzSWlNSFdKelBVWEpPSUhlbXdjMXBiMjRzYWRubWNwVWFGZ1k2dGR2QUY5ZjN3ZDJMdFFvQjVxL3YzKzU0WGduRlZMWTVObWtTcWx3d2RyMnVJbUZCVXlaTWdVblQ1NzhZY09HRFdhMVduM1ByU0FkT25UQW4zLysrY2hjbUhxOUh2NytkemY2YkRLWmNlYk1HVkF5R1hSdTdpNzV2U0lqY3ZOeWtYVXlFMDJiTklWWW9YTUV0Uk1uVG9La0tHaDFOYjltUlVWR1pPZmtJRE1yRTlGQ3MzWkZkcnVHK3hrTENncCtHRHBrOFA1TGx5NmFLd00xbEZWQUpUMVFnVGhXVUpvaUlJeE9TYXdkSkNWUWYxTVU1RElaeFBsUXRWSUZzOGxVNDcvdGdRRWJ3SXZCaU9CV1dYVlVySkFLdld5YzFXb1Z3WTJ4RFV0RmNOdStmVHMwR3MzU3dzTENVcTFXT3hLQThtNzNiZGV1WFkvOWhaeXVUd2NsazhFL0lBZ3VBelFhTFRRYUxUTDBhVWhMVDBPWUV5TFY2emR1Z3FTb0I3Wm10dnQwOCtaL0NLMUVocStXVFp0Uk5WdHBkbmIyNGxZdG14OUdlZmJiaWp3MUt3aUNJUUNHRUR3MUdVVnhNcG5ncVlsRDdXbzF0Qm9OZEhha2tZR29YVHNVa1pHUkNBMExlK0Rud1FOaHJRMFBENjlJWUZrQ09KdTdxWlJyczFxdDRtdE93UTBBZERyZHF0emMzR0lQRDQvaEFIeWZ0Z3M1T3lzYldqZDNGNkk1bUZibmhxeXNiS2ZBbHBPVEE5MURXRE90emcxWjJWbVZBbHNOV1paZW43NDgrdm1vVTdDZi9YVDAwdXhCRFFLb0VTUkhFaVJIa1FKYkIyMURHQ25NZjJvRnZRSStCUFZEclZwOFh1MWhnTm9EQXpZK2FkbkFLYkE1ZW0yaTV5YUNHOEFQQ0ZjQ2JweW5wK2ZHakl5TUlsOWYzNDhJZ29oNFdpNWVqcnYzNGVtbndYUEx6OHR4K3RyRFdqT05Sb3Y4M0p4NytpeVJuQWxpZmpKdzVlNjY5RGx3VjIrYXNsYTMvbS95K1R0NGFxWnlvRVlJb0VZU0FndXVESEk1elNsb2thbERBRFdKQmRjTGJqb2RMT1pTNU9WbUl6TkRnOHlNTktmckVGWW5IRzd1N284L3NBRkFvMGFOeW9GYkJjQW1nWnVZY0tzSTNNUy8vZjM5LzdoKy9YcEI3ZHExNDBpU2pLNStFT0haVFEwR0E2d01BMk5oOWJDYmFyVTZ5T1F5K0FtMHlIZDFzaE5BU1ltTHk2MGlLNm1BNSs1aEZsZnUrWGdsSmdOWDd3N1VXSEFuejVYY1d0ODVkZloxbEovOXRHL3BzTXVwbFFjMW1RQnF0SUwzMUJ5TEJhTElzZFZpZ29lSFI2WEs3VVZGUnR5NGZoV05telo3TW9DTklBZzBhdFNvUXEvTkdaalllSEJPd1UzNFhvN2pPSzVPblRxSGs1T1Q4NTU3N3JrQkZFVjFyazVRUzA1T0JnZ1NHcTJPWnpldFJtM2pvaUlqMHZVWlNFOVByM1lsK0YwN2QyRDVzcVV3R0RJUUZCU0VsYXZXNHZMbFM0anRYOGJDUGpaK0FycDI3ZVpDd2tmWWlMc0VOUXZIL0htdzhHSlNuNHlGR1RiaHArUHNaNGtBYXVaeU9UVTdVSk9ERmdTT2xRcEJMay9qV0FIMVEyQlFFSXdGZVpXQ211MDUvMFNFb3FMSjVYSUozTzdnc2RubTJ5b0NOM0h3bGhORDA2aW9xSE1iTjI2YzFhMWJ0MHlhcHZ0V3h6N3I5WHFBSU9Iblh6Tml5V0p5MmFCUFEzcDZlclZ4VTZXbHBXSEc5S240Y3ZMWGlJNXVnWUlDbmhvbklpSVN1M2J2QXdBTWpIMi94bzcxc3FWTDhIcjNIblpzSnVKK3paM3pEVkpTL2dGTjAyamZvUk1HZnpRRUZFVUJBRkpUVTVFd2R3NVN6cVpBb1ZDZ1k4ZE8rREJ1c1BSNlRkaWR0dmxpekF1UXkrVWdDQkpoWVdIb0h6c0FyVnZIUEpxZUttditlVTMyb1YxZjVQMVdVQW1vbGZQVUJBTFlDa0NONzFWVHFrUVJGbDBacVBueGJSMWhvV0hJejh1dTBlTlVWU01meGthVlNpVWFOV3FFOFBCd0JBY0hTMExNdGx4dVlyT2ZRcUdReEZWbE1obG5JOFRNMkhLNUNUbUNVZ0FsYjd6eHh1MG1UWnA4YXpRYXZ4RmV2eTh6R0RLaDBlcHFmRjAwT2pjWURJWnErNzZMLzE2QWo0OFBXcmVPQVUzVDhQSHhrVHhuUVFxdHdwblk2ckFmbHk5RlRrNTJ1ZWNuVFp5QVdzSEIrTzMzTFZpMGVCbU9Iam1NcEtSTmZQakVzaGc3WmpUcTFXK0FUYjl2UVVMQ0F1emZ0eGUvYmZ5MXh2YXpxdHRNWExBUW03ZHVSLy9ZQVpnOWN6bzIvcnJob1Z5MDNqOTJoOXZvLzBsL2V5VjBoYkpUQkFCWWM2MUYzN2UrTnZIM0wvSit5M2ZJcFJVTGo3THFweTJvZ1dCZ1UvMmtLRms1VUFNSFpHWm1vcmk0V01xcCtmcjZJaWd3Q0tHaFlhaFh2ejVvWVZSS1BNK2FOV3VHamgwN29uMzc5Z2dLdXJzcTlJb2ZsNlAzTzczd2RxK2UyTHBsYzVrM2FyRmc5cXdaNk5mM1hmVHYxeGNIRHg1NCtCNWJtWmVpUWFOR2pad054WmNMUzBXeFZkaFVTNFVUMG5GQ2dSUEQwbi8vL1pmVjZYUXJNekl5OUw2K3ZvTUlncmhuVVdZclkzMGd5V2FOUmd0andmMVR1Sncrbll4SlgweUEyV3hHY1hFeHVyL0doNWs5M3VpSmZ1LzNyOUozSEQxeUdJa0o4NkRYcHlNME5BeWpQdmtValo1OVZucDkvNzY5V0xac0NUSU5CdmdIQkNBdWJqQmF2Y0JmYk1PR2ZvUmIvL0ZDdHlNL0hnNlpqRUp3Y0FnU0Z5d0V5N0pvMjdZZHVyM3lDaFFLQmZ6OC9kRThPaHFYTGw0RXdGY3NQYjI4MEx0UEg5QTBqZUNRRUxTT2FZTi8vNzFRWSt0K045dFVxVlJvM1RvRzh2Z0ptUGpGQkhUcTNPV2hNTE5vK2pTR2NWa3kySndTSVp6aHJ2MW56bHJ6d3MydnpzSmVUY29abjVvUWZoSldnQk5CamVVZEJ0S21VQ0RuYUtGUWtKK2ZEMFpRbXFKcEdsNWVaWjVhYUJnUGFvNlNlWFhxMUFGRlVkaTVjeWNVQ2dWZWZ2bGxaR1ptMnBGR09NNjlpbitucFB6RG4yUExWOEJrTWlFdWJnQ2ltajJQb0tBZ2JOKzJGYVdscFZqeDB4cms1T1JnMElleGFOeTRpVVF0bnA2ZS9uQThOdEYwT3AxVHo4M1QweE02bmM0WnhiaWRNSXlvbitEZ3Vaa0Z6NjBVUUxHL3YvOGYvLzc3N3lTR1lmYmU2MzVXVjZHZ1N0c3kzbi91b1duVEtHeEsyb3FQUjR4Q3JWckIySlMwRlp1U3RsWVoxSzVldVlMUEo4Umo4SkNoMkxwOUo5NThxeGRHalJ3T1EwWUdBT0RtelJ1WU12bExmUFpaUExaczI0RlhYMzBkNDhlUGswUnBFaElYWUZQU1ZnREFuTG56c0NscEt4SVhMT1JEQkpKRTd6NTk0ZUhoQ1lDbjBqbDg2QkJhdHVSSkFIeDhmSkNRdUFCS3BVbzYwVThuSjZOeDR5WTF0dWIzc3Mzb0ZpMWh0bGdrUUg3UVpqbHJnUGJENS9rYkwydmQvL2Z0Yy9OZnVQbFZDdXdaYjRzZEhxVUUvekFEaEFVRXlrQ056K3h3VnF1Rms4bDVDdis4dkh6STVES29WQ3JVQ2F1RHFHYlB3OHZiRzFxdEZyNitmcnluRmhhRyt2WHFRNnZWT2wzWHRMUTB5VmxoV1JhZW5wNTI3MW02WkJIV3JGNEZBRWhKK1FjZkR4OEtBTGh5K1JLYVJrVkJvVlRDemQwZEw3endQNXc0enVzOG5UbHpHbTNhdkNpY1R3VGtjaHFYTHBVZGgxa3pwejljWUFNQWQzZDNDZHhDUWtMc3dPME9GT08yWVNrcmhLYmluVW9FdHhJQXhjODg4OHlwbjMvK2VVcHBhZWx5VnhyNnpyWmxTeExhdnRRT3JWdkhRS0ZRb0hPWHJtalFzQ0YyN3R6QmgwTGVQbGkyZktVa2xmYnFhNi9EWWpiajFxMy9xcnlOYzJmUG9tUDdkdWpYdHpjYU5HeUlGOXUrNVBSOUM3K2ZENVZhamE3ZFhubGd2NzhxMnlRSUFsNmVYakRXY0JLOHdodmd5ak5RZFk1QWlTZTFPdUhYNVN1Ny9UYm1sZ09vT1FKYkNRR1VBb1NaZjhCS0NLcFNKTUNSSURpYXBqbVNKRkZTWE13VkZCVEEzY01kT3EyT24vMTBjNE83dXp0VUtoWGMzTno0bkpvQWFyb0tSRmhvbWdiRE1QRDI5a1pNVEF4WWxwWDREa1Y3NTkwKzJMdDNEeExtZllmSlgwN0MwR0c4ZmtQZDhBaWNQSEVjUnFNUkJRVUZPSGZ1ckhUVHo4L1BoMUtweE5tektmaHN6R2pRQ2hyNStma0FnS1RmTnlFOFBPTGhoYUsyNXVIaGdVYU5HbFY2RW9uL0Z4NGNRUkNFeFdMaGJPc01MTXR5dHYxdFlsZ0tnT3ZkdTNjYWdJVHM3T3diWGw1ZWd3RGNjNGIrd29YemlCc1lpMlhMVnlJaU1oSkxseXpHNXFSTmtwZFNrWDAzNXhzY1BuUUlPVGs1bURqcFM3UjVzZTBqQ1d4NnZSNFJFWkYyejlXdUhRYTlubWN4MFdxMStIUFhUa3laOGlXTWhVYTdNS0txMXVqWlo3SHp6NzFJVDAvSEY1K1B4N0tsU3pCZzRJZDI3MW01NGtmOC9mZFJKQ1FzY01xWlZ4TlcxVzF5SEllYzNCeG9IMUlQSVZka1NiODhmL2VxaHNlR25NSXhpZnhSQkRaVEJhR25CZUJFcFhhR0FNRUp3QVlLQkNlWHk2RlVxcmk4dkZ4UWxBd0IvZ0ZDOVZNSE56YzNlSGw1UWEvWHdOUExTd2cvRzl5eEYwME1SdzhkT29TbVR1aUp0Rm90QmczNkNDTkhETU03Ny9aRy9mcjh2R3lUSmszUnNWTVhEQnM2R081dTdsQ3IxRkNwVmRMbk5tOU9Ra2xKQ2FaTm40VjUzMzBMQU1qSTBHTnowdTlJblAvOW93RnNBT0RwNldrSGJqWWdWZzdZeEdPTHNpWmV3bWF1VkFRNmFhNE5BQ3VTNG5sN2UyODZmLzc4alhyMTZ2V2pLT3JsZTkxZnVWeU92LzdhajRqSVNCdytWRFhPOWhFalA4R0lrWjlnbk1CZytxaWF2NzgvOUE1VVRMZHZweUlxaW05Rk9mRFhmcXhlOVJQbWZEY1B3UUlQM1lzeEx6aTlJVG1DbmFtMEZOdTNiME9YTGwyaFVDb1JHQmlJOXUwN2xFc0FiMWovQzNidDNJRzVDZk5ydEpIelhyZDUvUGd4MEhJNTZ0V3YvOENQajVXeDd2dGJmMzV6dHgvalUxR0pPcnQ5Z1lDUWV0UUFnaVVKZ2lWQWNDVEhnZ0xKeVVCQ0pwTnorZmw1Y0hOM0IyTzF3bURJd0xQUE5TNmJLUER6aFZ2cUxmajYrcUYrL2YvZjNwbkhSMVhlKy8vem5HWDJ5YjRNeVlTRWtJUmN0dUNsd3JWaVhTNHVWRnNwdUsrWHFxMC8vZlc2SWxhOXJiVjFCWmNxeXExNlJhdTFldVVWYmRVZjlkNjZ3cjBnb2xHSkNZUWtKQ1FrSVNHUVpTYVptYk04dnovT2VVNmVPWmxKUUFGSnpQTjZIZVprTXBNWnpweDVuODkzTDBmcUtNZUlOWnY5N0xQUEFCanppTzJkcUJzYUd2REEvZmZpbnQvZWk3WFBQWXZKaFVVNDIxVEtsMTUyT1M2OXpFaHN1T2JxbjJMcTFCTEx5bk83M2JqbnQvZENFQVJFbzFHa3BxYmlyVGZmUkgrb0g5ZisvSnB2M3hTMXcyM216SmtvS1NsQlFVRkIzRmkvMU5SVXkrZm1kcnVaYVVyWjNGS2JXY3I4Ym9yTk5CMWdwdW1xVmF2dUhoZ1llUExydnRkL21ENERIMys4Q1hWMU94RGcwak0rM3J3Sks1YmZZdjM4NkNPcnZyWG8yWWhmRHJPN01RQlFYYmZhU2dIQTJlZjhDQjkrK0Q2MmJQa1lxcXJpdmZmZXhWZlYyM0RHbVdjQ01BYU1FQUlJb29qZTNoN0xSMEwxK0tEUHBMdzhiTjYwQ1lxaW9NdU05anFjVHJ6NHh4Znd5aXN2UTFFVTlQUWN3SVlOSDJIMjdObERwdkNiZjhVYnIxZmlzY2RYSDdVK2RRZjdtdEZvRkI5djNvUUg3cjhYUDcvMnVxTWVPT2pUQnArOS9mSGZyVDM3YjNlTVpub09BSWlZMDZSaUFCUkN6SUhHRkxvZ2lWUWtBcFVnVUJrQ0hFU2toQUIrZndyeTg0T1lWdjRQY0xuY2NMdmN5TWpJUkU1T0R2THo4cEdlbG82OHZMeFJvUVlZRVZRbVJCd09COUxTMG9ZMWFmMTA2eWU0L1pkMzRwUlRUOE1qanoyQm1xK3E0NEtIaXFMZ3BSZi9DRUtBV2JObVd6NWsxUXhrOVBRY1FFTkRBOHBLeTNEVjFkZmdsVmZYWWUwTEx4NDdpbzAzUzJmT25EbE1zWTJ3VVdJc0VFS3NOdU9ta3FOY2dxL09lclFEMEcrLy9YYjk5dHR2LzQrV2xwYTYvUHo4ZnlHRUhIY283OU1oeS9CNlBIanhqeTlnd1VrbjRhdnFiV1BHaDJaUDBIM3dnZnZ3NEFQMzRmUXp6c1MvL2VwdWxKYVc0ZGUvK1MzV1BMVWFIZTN0bUZ4WWlJZFdQV0pOTTFyMHc3TlJYYjBOVnkyN0FxSW80ZHpGUDBGcGFSbjIyOHFGYnI3NVZxeGErWkJ4Slo0OEdjOCs5d0ljRGdjZWZHZ1ZWai94ZTd6NnlwOGh5ekpPUHVWVVhQa3ZQd1ZnNUNtdWZPZ0JTSktFaXk4OEw5NU1mT2xsQkFLSFA1ZndZRi96RjlkZkIwS0F3c0lpM0hMcmJVYzFqMDBIL2J3aHNyZnlsSmI3NnRBNGxPSmtVMnJXTGNGUUh6VUFSaVVCaUE1UUtnQlVwSVJLZ2dCUkEyUWlVaWNrT05QU2gyby9mVDRVRkJRTTVhbVpnWUlkTzdZUGkzNG1XMDFOVFVoTFM4UENoUXNCQUo5Ly92bXdtUjhYWERnMDdDZ3pNeFBMYnh1YWY3Qng0d1k4L3RnanFLZzREZzg4dU1xQzVLSWZubzI2dWpvc3U5SlFjNys0NGNaaENsczZGcjk0cWFtcG1EVnJsdFVPaFJCaTNmTDczSDBXM0FCUXJxcEI1M3h3aVV4VHJhQ2c0TVBYWG51dDdweHp6cm5BNVhJdE85ajNxS2dxVHZ2bmhmajlZNC9naGh0dnhoL1dQSFhNSGNjenoxcUVNODlhTk96KzB0SXlmTFJ4NURtbUo1NjRJT2tYMStsMDRxNS8rM1hjZmRmOGJIamZ6M256L3lsaE04U1MwbEk4OXZqcWhIOWJGRVY4dU9GL2orcHhPcGpYSE8xNGZkUGw5eWZQa3h3SWgvLzAycjRQMzcvclFHVWZaM3JHRWdITjlLY3BBRFdnUmcyZ0VRcWRnRklDUWtVUUtpb2FKQUF5a1F5b1FZYmI0ekdTYi8xRFByWHM3QndqcGNQTVUvdmU5dzYrV3RHcTJQbWFhOEdDazdCZ3dVbkQ3cGNrQ2JmY3VuekU1eDZUWUdNZk5BODMrNVlBY0JiY0ZFV2hab1VDSDFTZ1hLVUNVMjhhQU8zODg4OXZCZkJrYTJ2cmwzbDVlVmNTUWtadHdxNXJHcjUvNGdJME5UWEZSWG9FVVlSK0JKdDNUcXp4dVVSUlJEZ2Npc3VYMUhYOWkxMjdkbFdlOG9NVGQ0QkxaeG9CYWpFeXBOSllkdzZkQUdhUWdFQUVvUklFeUJBc3FMa2d3K1gwd09QendlZnpXVDYxbkJ5alRLcW9NSEdlV3FMbDhYZ3hNQkErcU1jZHlTVWR5eCsyMSt2RjdObXpJWXFpdFkwQ09tb3FPQll4dFFjVm1HMnEyMDFUQUZvd0dQeGc3ZHExWDExd3dRWG5lVHllbjQzMi9qSXlNdkIvZi9HdjZPZnkzUEx6ZzlqZDNJUllMQWFxNjZpdHJVRmhZZEVSTzBadXQyZUNDb2Q0Ykw3Tlk1YnN0WE55Y3REUnNkY0NXeWpVLy93ZlgzaitvL3Z2dXpka1UybDg1SlBmZUtpWlppZDBFMmpVaUh3S1ZBS0JURVRxZ0FnSFpMaUlETGZEQTA5SkRueG1TZ2VER3QvOTFwNm1rV3hOS1M3QnJzYjZFZUhtOFhneHBiamt1d3Myd0NpL3NzUE5EcmtFSmlwVGIvWXFCY3I1M3BocHFwdW1xUVpBWGJac21iWnMyYkpuNnVycVBpMHVMcjVFRk1WRHlzbkl5OHZEcWFmOU15Ni85Q0trcEtSYVpVeEFmTHJIVjlYYjhNVGp2OGY5RHp5RXFTVmYvME5PZEtXZldFRFlITktiYUFuZjBqRUxoL29oSmtraG1UUnBFdHJiMjlIUjFycGhkMHZyMjB1WExHNUtvdEo0bnhvTGpNV0dWSm94UmNxNGNCczFuNElnVWtrU0lVbG1odzZIREFkckVtbk9LR0Q5MUN6ek16L2Z5Rk9iVm41SXFUWXBxYW1vT0c3dXQvNzVIOUdaQjRkelVVcXQrUWt0TFMzbzZPaEFWMWNYZW5wNjBOdmJpM0E0akhBNGpFZ2t3by8vSTl6Z1pxTHJPcHVsUUFDd2VRcWlDWGlaVXVvQTRBRGdCT0FzS1NseGJkbXk1VWVOdTNaZG1SczRPb00vOTNic3dkeEQ2UERSMU5TTTd2MzdKenJvRGp1T2Jjakt5a1JoZ2s0VFRjM042TzQrK3Nkc2IwY2JNak16VVpTZzBTU2xkRTluWitkL3pwa3o1NU9Pamc3RkJyVm9Jb1VHSzlwSlZCaU5JVFRURXFGc015dDBJRWtTSk1tYVV3QW5CemFQeHdPLzM0KzB0RFJrWkdRZ056Y1grZm41bURKbHloR3RKZjVPS3phTHdJUmc1c3laN0FNYXB0enN0K1kyTEdKS0NLRW0zTUFyTjJhYXdwaEdyd0ZRNit2cjFZeU1qTW9ubjN6eWt3VS9PR1Z4UmtibWxVZjZpaTdMOGlFOXA3QndNcnE2T3JHM293MCtmOHJFeklOUVAwS2hmbWlxbWhCcUFGQlVXSWpPenFOM3pOaDcwalV0SWRUQzRmRExiN3p4eGtlWFhYYlpnVkZVV3BSVGFOWkVkbE9sYVNiTWRBNW1Sc2RiMmRiSzI4MzFValBiZVdkblp5TVFDR0R5NU1rb0tTbEJlWG41bUQ0UHhveGk0MWREUXdQcTYrdlIzTnlNOXZaMjdOdTNEL3YzNzBkZlh4OUNvUkRDNFRBR0J3Y3Q1V2JPWENEY0dFQmV2UW1tZWhOTTBFc0FKRTY5V1FydS9RODJWRXdwTGw0cWl1S1pSK0wvMWJtM0haTUN1WWZjdG9oU2lsMU56ZGkvdnh1YXFpTVMrVzQybjNTN1BSQkVFVm1aV1Nnc0xCaFZiVFEzNzBiWHZuM1FWTzJJSFRPMzJ3TlJraElxTlVWUi9ydXFxdXEvNXMrZjM4SUJMUm5VRXBtZDZwRFphUUhObUUxZ0FzMG9aSTlYYUY2djE0SmFSa1lHc3JLeU1HblNKQlFXRnFLa3BBUlRwMDRkOCtmQ21BUWJBTFMwdEdEbnpwMFczRG83TzNIZ3dBSDA5dmFpdjc4ZkF3TUQvR2kvWVhEVE5JMll3NXZabUQ4R04yYWVzcEYvTWc4M0FNNVBQcTFha0pPVGUvN2g2dFE3RUE0aDFOOEhnQjcyUnBNVDY5aGJ1cTV2Yld4c2ZMdTB0TFRXVkZ4MmxSWkxvTktVQkNwTjV6WnFXakJKb2VZeDB6bjgxbnlDZENQeWFVS3R0TFFVQldZbHlWaGYwbGg5NHdVRkJUQ3JEbUFXeFZ1M2ljeFYwMFNsZ2lBUVFSQ2dLQW9saExDR2wvYkFnaFVwSllRdzA5UTZBWStmZTl6N0pTVWxteDUrK09FelVsSlN6aWVFZkczZDd2ZjdJVWtTOHZJbUlSQUlUSHpyeC9HaWxPNW9iMi8vNjhLRkM2dHFhMnNaek95K3RKak5oOFpEelJZY3NJWVhVMUVVcVNpSzF2ZEJsbVhLZXU0eHFIbTlYZ3RxUnBEQWJEdFVXSWl5c3JKREh2MDRBYllqdEhKemM4R2FVUEtBU3dRMXp2ZkdaaUVTUlZGQUNHRUp2WlFPRFRYVmJXa2hHZ0RWbkcrcW1QNDM1ZHh6ejMzcmpqdnUrUERXVzI4OVBTMHQ3WHhDU1BIRTEzZGlKUURhcnE2dXJyL2VmZmZkVzllc1dSUGxUTWxZQXRPVDNTcDJzNU9kaTh5WHhpYXkyMVdhTE1zVzBPeFFZd0VDbHM1UlZGU0Vzckt5WWUyRXhyd3AydFRVTk9iL0U1RklCSTJOalZhMGROKytmVmEwTkJRS1lXQmdBSU9EZzRoR281WlphaGJvRWxZenljeFNMbXBLYkthcFNDbVZtSW5LK2Q4Y0FKeTMzSEpMeWhWWFhMRXdKU1ZsNlRkcGFqbXh4aFhRR3ZmdjMvL21talZyUG4zMjJXY2pIS0NVSkVDTGNiQ3pSenVaVXJPaW5jejg1S3dVcTlzMFUydDhvQ0ExTlJWcGFXbm0zTThBQ2dvS1VGeGNESmZMTmU2Ty9aajFzU1U0aWJCanh3NDBOalppejU0OTJMdDNyd1U0RmxSZ2dPUDlic3ozeGdHT21GMTlDZk8vSVQ0MVJJUVJYRWdFT01meTVjdjlLMWFzT0RVakkrTmNRc2lNaWEvM2Q5S0hWdFBaMmZtM1gvM3FWMVhQUFBOTWRBU2cyVGZGTkR0VkRtWWFiM2JhVlpxcDFPS0FsaWp5eVlER1VqbUtpNHN4YmRxME1adk84WjBCRzF0TlRVMW9iR3hFYTJ1cnBkNE9IRGlBdnI2K3BFR0ZCSUdGdU1ncFUyOE1jaGpLZlVzS3VPTGlZc2ZHalJ0UHlzM05QVnNRaEJNbXZ1N2pmMm1hdHJtbHBlWGRrMDQ2cWJxMXRaWEJpUWVhY2hCQVk4K3pBZ01BS0IveFpDcU5EeEFrQ3hLa3hFMW5EeUFZREtLNHVCaEYzOUlnNHdrZjI5ZGNSVVZGZkZ1ak9CL2NLQUVHZGlWazZvMXFtbWJsdmNITWRUUFZXMXh3d2VaL2l3RndORFkyT3ZMeTh0NEY4RkZkWGQyY29xS2loYklzLzNqaTZ6LytWalFhZld2Nzl1My9NMmZPbkYwY3pIaVZGa3NBTlNVSjBQamdRRnlTTGEvU2VMUFQ0WEFNODZjeDA1TlA1eWdvS01EVXFWUEhWWkRnT3dNMndBZ3E4SDNiWEM0WCtKUEFEcmRJSkdJQkxoYUxXWkZUQmpjdXVFRDRrWCtzUXdpTWZDSVZnR0lxT0F0d0FCeGxaV1ZiQUh6KzdydnZ2anB2M3J3ZitIeStzd0VFSjVBd3BsMGZyZjM5L2UrOC8vNzdueTFldkhoZkVxQWxncG95a2tJekw1aDhsQjRzcHNXdGtKVHlBQUFUVGtsRVFWVG1CdWk2VG5WZGg2WnBWbDh5UlZHc0JIV202QndPQjhMaE1OeHVOL3I3KzlIYjI0dnQyN2RqKy9idGgrVVkrUDBwRUVYQlNobVpNRVdQb3QrdHJxNE96YzNOYUd0cnc5NjllN0YvLy80Ui9XNW1LVmJDNEFLWDFBdlROR1dsV1hGQkJwdUp5cHVxTWdESEpaZGM0bHE1Y3VYOG5KeWMweVJKT20wQ0UyTm5xYXI2Zmt0THkvL2NkTk5OdFgvNXkxK1Vnd1Nha2dCbzlxQUFnNWxPaUFDanhsT2dnaWhDRWtXSXJDUktraUU3WkRoa0I0eXA3S1pTYzd2aDhYcmg5L21Sa21xTXhzdkt5a0p1SUlCZzBBZ1NIQWwvV3BqTHdaeDdET1Znaml1d1hYVFJSWGoxMVZkeC9mWFhZL1hxb1g1ZnJhMnRhR3Bxd2cwMzNJRFBQdnNNNTU1N0xnb0tDcEw2M2JpRVhwaCt0NUdDQzJRVXdFbEpBQ2NEa0JjdFdsU3dkdTNhK1RrNU9RdS9TVDdjeERxaUY4Z2RQVDA5SDN6MDBVZGZMRjY4dUp1RFVpS2dLVW1BcGlZRG10a2prREpmR2hFRWlLWXZUUlFOb0VteVdSb2xPeUE3SEhDYVVITzdYSERINWFnWjZSeFoyZG1tK1RuNXFLaXB6cjN0eUpzVU9HWnlNY2VkS1NyTE10NTQ0dzA4OGNRVDFoVXFHQXhDRUFSVVYxY0RNRHAxQmdLQllUNDRleTVjTEJhREtJcFFGSVZsZFpORTVxbk5COGM2aFFpbWlTcHhKcXBrbnZBVzJOYXZYMThmQ0FTYUFieStiZHUyOHFsVHA1N2dkcnRQQXpCUjFmN3R3cXh0WUdEZ2c1cWFtcXA1OCtidFpqN1Znd0FhdjZtbVF0TVNtWndNYUlJZ1VFcXBtVjlwSk5xS2tnaEpaTFdlRW1UWllTZzFGaVJ3R3BGUHR4bjU5UHVOeUdkR1pnWnlzbk9SbDVlSHlZV0YxcXpOSTcyOFBqLzI3dDA3QWJZanRSWXNXSUFOR3paZ3k1WXRtRDkvdm5YL3hvMGJNV2ZPSEd6ZHV0VXE5alVuemNjQkxod09XMEdHU0NSaUFjNVViOVFlWE5CMW5ROHdKQW95YUFCRTg0b3RVVW9aMk94S1RwNDFhOWJuQUw0QzhQejI3ZHRuRlJZV0h1OXl1VTZaZ056Umc5bmc0T0JIOWZYMVgxUlVWT3ppMVZVU29La0hDYk9FUU9NREE3cXVVMW1XTVV5bHhabWVUcmo0ZEE2dkY3Rm9GRnMvK1FRWFgzSUpNak96a0dPbWN4UVZUWWtiUlB4TlYyMXREZDUrNjAxVVZNekI2V2NNTDVYMmVuMEk5ZmNlTTUvbHVBTmJSa1lHVGozMVZGUldWc2FCYmQyNmRiamdnZ3Z3NmFlZkloZ01vclMwRkI2UEJ6VTFOYWlzckVSUFR3L2NiamZLeTh1Um41K1B3Y0ZCU0pLRW5UdDNZdCsrZmRhZ0UwbVNhR1ptSmtSUkpLRlFDSkZJaElxaUNOYXhGd0FSUmRFQ25LN3JnbWwyaUdia1ZEUlBmR2FtU2dsQUo1V1hsMjhGOERtQXRWOSsrZVcwNHVMaU9SNlA1NFNKM0xqRHUzUmRyd21Id3gvdjJMR2o1dmpqaitlVm1jNkJhU1NncVJ6UTdPWW1pNXpUWkVCajZSdXFxc0xoY0VCa0hUa2swNEpnS3MzaGhOTTEzUFQwcDZSZ3puSEhJUmljYktSekZBU1JrM040bzU1UFBia2FqWTBOR0FpSGg0MWw1TmZSSEN6K25RTWJBQ3hkdWhRUFAvd3dIbnp3UVFEQTRPQWcxcTlmajVVclYyTEZpaFZJVDAvSDdObXpVVmRYaCtlZmZ4NlhYSElKQ2dvS1VGdGJpemZmZkJPeUxDTVlER0wzN3QzbzZ1cENhV2twWkZsR1QwOFA5dXpaZzRHQkFhU21wdEpZTElaSUpFSjBYWWZYNjZXYXBpRVNpVURYZFNwSkV1R2lxTVM4V2dzMk01V3ZhT0EzSG5UUzdObXp2ekNWM0t2cjE2K2ZOSGZ1M09scGFXbHpaRmsrQVVEcUJKNE9hZlVxaXZKeGQzZjNsNXMyYldwWXNtUkpONFlpa2NuVVdTS284UjAyVk50emRVNmhVYjQvR2t1d0ZTd2ZtaEhCRkFTQk9wMHVQajhOc3NNQmdSRHMzcjBibXFwQ2xDVE1ualViK2NFZ0tBWCszOXR2UVJBRXBLZG40SkhISHJlc2tGK3VXSTYydGowQWdKNmVIbmk4WHZ6NWxkY0FHSjF4bnZqOW8ranQ2MFZHZWdadXUvMlgxcEFlQUhqdFAxOUZaZVU2Ni9FQWNQVTFQNFBENGNDcWxRK09tUTk1WElKdDhlTEZ1TzY2NjFCZFhZMlpNMmRpL2ZyMW1ENTlPZ29MQzYzSGVEd2V2UHp5eTdqNDRvdHg3YlhYb3EydERjRmdFS0ZRQ0pzMmJVSkZSUVZ5YzNQaDkvdVJsWldGU0NRQ244K0hmZnYyUWRNMHVOMXVSQ0lSQUtEcDZla1FCTUV5VVZWVmhTaUtiTllDaTZJUzB6UVZ6UHNZNEVUeml5S1pxazYwUVk0SG5iUm8wYUpkQUZvQS9MMmlva0orN3JubmlvdUxpNmY1Zkw3WmtpUjlEOEJFSzEyYmtGQlY5ZE8rdnI3cXVycTZ4cXV1dXFxMXBxWkd0eWt6eldZNkpnTWFEelArT2JyTjNMUVVtcmtoR2RCWXp6UkNDRnd1MXpDVnRxZHREM0t5Y3pCOXhneW9xb3J0dGJXWS8wOG5JRDA5SGQvLy9vbUl4YUo0OVpVL1l4bzMzL1QrQjFjYUJPL3R3Yyt2dVFvMzNYd3JBR1BPNTMyL3V3ZS91KzhCVEpvMENlLzhiVDNXUFBVazd2N05iNjNuVnN5Wk02enpzTVBoR0hNZityak5ZMXV3WUFGZWYvMTF6Snc1RSt2V3JjTjU1NTAzN0hIVjFkWG82dXBDWldVbHVNbFcwSFVkMmRuWmNMbGNhR3hzeE02ZE82MDBFVVZSa0pLU0FxL1hpNEVCbzRlWDMrK0hwbWxVVlZVTURnNFNWVlVoeTdLVmEyUkdVVmsrRWpYSGFRMVRjS2FaYWxVMmNKQkxCRHZwaXkrK2tPYk9uVnNOWUR1QXR3b0xDOFdYWDM1NWNtbHBhWEZxYXVvMFdaWm5Fa0pLdmtzVW81VFd4Mkt4cnc0Y09GQy9mZnYyNXNzdnYzeHZhMnVyYmxObGlkUlpNcFZtL1k0bFk5ditCdTgzaXpNM2VhQnhDZUJ4UUdNS2pSQUN0OGM5bE1aaG1wN0JZQUYyMXUxQVcxc2JTa3BLY01sbGx5RWozWWg2QmdJQlJLTlJ1TjN1UkNZMmZuUDNyM0gyT1QvR3ZIbUdTMmJYcmthMHRyYmdEbk5ndDA1MWVHMURWY3JLcHFHc2JOcVlQdytrOFhxQ0wxMjZGR3ZYcnNWdHQ5Mkd0OTkrRy9mZWUrK3d4NmlxaWx0dXVRVS8vYWt4MDdLOXZkMXFPUzZLSXQ1NDR3Mjg4ODQ3S0M0dXh1VEprekZqeGd4VVZWVkJraVQ0ZkQ1cmlJdlg2N1ZTUTJSWnB0Rm9GRTZuazVqUlUycUxvREt3V1ZQc0thVzZlUitEbkFBalJZQXZ3QmR0Z0J1MjM5emNMSjU0NG9rN0FOUURlQmVBdUdyVkt0L3BwNStlbDUrZlA5bm44MDJSWmJsRUVJUnBNSHJMamVVVjFYVjlSeXdXYStqdjcyL2V2WHYzbm5mZWVXZnZuWGZlT1FndUoyd0VtQ1dEV3R3K3A4eml6RXliT3FNMm9GRytrd3pmWWNZT05MWUJnTmZqalE4UWVEekl5OHZIak9uVGNhQ25CenZyZHFDOXJRMDMzblFMSnVYbElTOHZEenQzMWlVOE9QL3g3Tk53dVZ5NDdQSXJyUHNVUlVFZ0VNRGFGMTRjOXhlNGNRdTJKVXVXNE1ZYmI4VFRUeitOc3JJeVRKa3laZGhqcGsrZmptM2J0cUhFSEtaU1VsS0NaNTU1QmhzM2JzUlZWMTJGVFpzMlllSENoVml3WUlHVjg3WjU4MmE0M1c3NC9YNXJxclhYNjdVaXB3NkhnNWtWbEc5b3FXa2FCRUdncXFxQ1VncFJGQ21sbEpoQkI4S3BPRlo0VHpqSUNTYmtoQVNRRzNILzFsdHZIUVRRRGFDR00zMkZ5c3JLclBMeTh1eXNyS3hjbjgrWEo4dnlKRkVVZzRTUUFnREhTcnVIQ0tXMFJkTzBQYkZZckQwVUNyVjNkbloyMWRUVWRGOTQ0WVVITUpTZHI0OENzMlFLTGVFK0J6UGREak1NRFFDaXlkUlpJcURaaXRhdGpVWGpBY0RuOThlVlJ2bDhQbXpkK2dtbVRTdkhxYWVlQnJmYmpYdC9kdyttbFpmRDUwdnVjZGk0Y1FNKy9PQUQvUHZUejhZbDVaYVVsS0N2cnc4ZmZmZ0JmbkR5S1dob2FFRE5WOVg0MFkvUHRSNnpjMmNkcXF1MzRTYy9XVG9CdG1OeEJZTkJ6SnMzRDNmZGRSZnV2UFBPaEk5WnNXSUZ6anJyTE54OTk5MjQ5TkpMVVZOVGcrWExsK1BtbTIvR2pCa3prSldWaFk2T0R2ajlmaWlLZ3ZmZWV3K1JTQVN5TENNOVBSMzc5eHVUejMwK24xV3h3RTVTdDlzTlZWV3hmLzkrcWlnS2ZENGZKRWtpZzRPRDBEU05NajhHU3hjUkJJRVYyNE1CYmdUSVdZQ3lkUjBaYWVPVGg0VWxTNVlNQU5qRC9WMzJHdVRSUngvMXpabzFLeVVRQ0tTa3BxYW1lRHllRklmRGtTSkpVb29vaWltQ0lQZ0lJVDVDaUpjUTRqWkJ5Qm9Bc05jQ0J3WnJiQnlsZEpCU0dxYVVoblJkRDJtYTFxK3FhbDgwR3UwYkdCam83K25wNld0dmIrLy84c3N2UTh1WEx4L2c0RVZ0SUtNandFeTNLU3h0dEkxMTBVZ0FzamlZOFNBRFM2ZzFwNlR4NWlhRG1hMnRVQnpRV044MHA5TUpTaWxTVTFOdHJidFRjZFpaUDhTNzcvNDNHaHZxNFhRNmNlZGR2NExQNTBOcmF5dHV2dkZmb1NneDlQYjI0b0x6bHVBZjU4N0Y3Yis4RTZzZmZ3eVJTQVRYLzUraENaS3JuL29EL0g0LzduOXdKUjU3NUdIODRkL1h3T1B4NEdiYjRPR3F6ejVEWmVXNk1RKzJjVmQ1b0tvcTFxMWJCd0JZdVhJbGJydnROalEwTktDNDJPZ0JLVWtTWG5ycEpWeDAwVVVBZ0QvOTZVKzQ3Nzc3VUY5ZmowQWdnS3V2dmhwMzNYVVhDQ0hZc21VTHJyNzZhdFRXMXNMajhhQzgzSml2V0ZWVmhXWExscUcydGhaLy8vdmZzWGp4WXF0cVlkZXVYV2h1YmtaRlJRVVVSY0hPblR1aHFpcUN3U0NibG9YdTdtNm0xQ0FJQWp1eENlZUxzeURIOWhOQUxnNTJuSm9URW9Fc3dUNS9tMmpqWDJla0RRbHU3ZnR4YnJBRSsvenRTSnNkWlBZdG1Vb2J0czhHOXlTQzJHZ3dZL3UyeHFVSEJUUmVwZkhOSUh0NmVqQnBVajY4UGkvOGZuTytwMW5BbnBzYlFINSsvaUdOd2ZzMlZzUE83VGo1NUpNbndEWldWbTl2TC9iczJXUDUzK3oxcG14NGpMMlpKVmR6Q200TW9GVzh6TXhVUHNqQXlyVzRzaTMrY3lJMjBNVkJqbElRZ0E2RDNTSCtuQWhzUE9DRUJGQWJDWEFqd2MwT05DU0EyRWdLVFUraTF1eU8vVkVoWm5zOTNtL0dZR2JkY3FhbmZYQTN0WGR0WmpCenVkeElTZkVQYXdMSkZGcDNkemNLSmhkWnpTQXpNak90NG5LL1AyVk1mRStPSmJDTkcxUDBoQk5Pd09iTm04ZGNFSSsveUtTbXBqTHpsSEpkSEFqWDNZRVFRdUpVSEl4eGdjVHcwMEVBQ0VrRUpVb2gyS0JIUmdIYVNIQTdGT1YyS0dBN0ZMTXpHZUNvRFdnakFVeTNBd3dnbEJCUWdJQVFDMlFHekFRQkFqRWhKZ29RK1JJb3RobWxVRU5xVFpZaENBUUNJVkExRGRtcHFjTWFRZnI5ZmhCQ0VBd0dvV2thZkQ0L1VsTlM0ZlY0MGRmYmg3N2V2bVArUk00UEhsdk5hc1lOMkRadDJuVFVYb3NmMk56ZDNSM1h5REljRG8vVXFkZFNib3FpV01yTlZHOThEU3JoRkJ6bGxCeTdwVFpUbGNGRTU5VWRyN0lJQVVrRVBRNlNvNEZNR0FWb3lhQkdFa0I4TkxWR2t5aTNaS0JqY05KSGVnNXo5ck9ac3B6elA1RXFzOEdNUUJEWTdGcUJDc0x3bVJxU0pCbGdrMlRJSnRRY1pxS3QwK0dBcnV1UUpCbVptWmxXNVFCckJDbUtJb3FMcHlMYm5FVXdzU2JBZHRSWFFVRUJjbk56MGRiV1puWHBUV1Nlc280aEl3R08zeGpZUm9NY0J6aG9ta1lKa3hoRFFJdURqVTNoeFVHUFN6MFpCakRUdEIwSlpFZlN4MmI3bVNtcHBNQ2ppWjdQZGM3QXNIMkQ5Z2JRQ0FFQkFSRUlGUWhCbkRvekZCb1ZCUUdDS0VLMFEwMlNJRW5NcDJaQVRYWTQ0SkJsT0V5ejA2Z3FFQ0dLQWdLQmdOV3VteldDbEdVWjAyZk1PT1NCMlJOckFteUhkVGtjRGhRVkZWbUE2K3pzdE5xUTkvVDBvTCsvZjBUL1d6TEFjZjQzcTRNSUR6a3VpZGlDbkdtZUluNjRQYS9jQ0V4QVlRaDJJT3c3bmd4WU5wVTNxaitOc24wNmltSWoxczNCUUc0VTRQRS9HK1lqLzNkc1RuOEFvTHBPSVFnQ0RKNFJhdlkvQTdHVW1jQUZCa1RUN0RSdmVZVW1Nb1hHQWMxVWFQSEJBVGM4SHNPWHBpb0tKaytlYkxYclp0T2lvdEhvaUZBalZWMGdUMVlCOVQySC8yUXVTUU85L2pqUTQ3SW53RFllRjZVVUhSMGQ2T3pzaEtwcGgxVFVHNGxFME4vZmI1bWpiRXZXeUpKdGxBSTZwWkFrQ1U2bmN5VEFRZE0wdnByQmdwd2dpS0JVcDdwT1RjRHBvQlNnb0t6OUtnQkNUUENaMzNlWUlCd09LaTZnUkVhNWpkdTNlSFZ3L1F6cElTcTUrRGVmNEhkY3poWmwrYytpS0ZyUFllYWxwbWtRUldrWXpBaWZnMmI0enl5b2plWkhrMDJ6MCtGd3d1RjB4QUhONHhtYXZENFE3a2RwYVNseWNuSVFDQVRnOVhvUDdnUmJYUVUwOUJ5WkU3KytCK1RKS3RCbno1Z0EyM2lFV2xWVkZVQUVlSDErZUwwKzVINk4xbEtEZzRQbzdPeEVkL2MrOUppVDZmdjYreEFPaFJBT0QyQndjQUNSd1FnaTBRaGlwbm9iR0J4RUpESUlWVkdNcTNwaTh6UnVZNHBOVlZWSWtnUmRwMFNuT3FpdXd3Q2NNUnFWUldWTkFCRFo0WUJ1bXJxTVJ5eTZOOFFuQWs3TklZbDV5WU1TQjJHQ2pnSTJBa0tTQWk0T1dQR1A0MzRtaEplYW9KUmFkWmpzLzBnSU1TcEVIQTdtTzZNTWFoYk1ERC9hY0xOelJLQ3h0a0l1dU53dXVOMGVlTDBlZUgwK3BKanBHMm5wNlFqMzk2S2lvZ0llaitlUXppdHlwS0RHd1czQ0ZCMkhxNk9qQXlBQ2NuSy9XYmRSdDl1TndzSkNCQUs1Nk9yc1F2ZCtNN2pRMjJ1WnB3TURZUXdNR0RDTFJxTndlenlJeFdMbzcrdUZKRWx3dTkwam1xaE10V21hQmtWUklFbnlVSkJoQ0c1RVZZMi80WFE2emNlWS9qaFJoSzRiMWxzMEdqV1VpaWhpeUpaRkhOZ1NwQVF4Zm1Bb2RrRVRYaXlTdGFObWJhRGkxWlQxUEdyL3ZablF6SVBOQWxnQ3B6OElJZEEwRFE2SHd3SWFNeThCd09sd3hxZHFpSUwxR1ZGSzRUTHJORjF1RjBSUndoZWZWMWwvMStQeG9LUzBGSG1abVhIcEczYUY1dmY3a1pLYWl2VDBkR1JtWkNJN0p4dXR1NXNPR1dvVGF3SnNYM3QxZG5iQjYvTWZ0ci9uZExvUUxDaEFZTklrTS9ldDIxSncvZjM5Q0lWREdEQVYzT0JnQk5Gb0JBNVp4dURnQUh3KzM0ZytPSDZMeFdLUVpVZGNBYjhKT0txR0ZCQkM0UGY3VFJWSENhVTZkTXBNVm1vTXJ5RUNaRW5pL1hTY3YyN0lGY1lCei9xSERPME5neDhiTkdLREcxVlYxWUlWcFlDbXFTQ0VRaENNYWd4RlVVQUVBWkpvdkNkVlZhRHJsQnJGNGtNcXpYTDYyemFCR0NhbXBxblU1WElOeXpkajRPS2hGZ3FGRUFxRlVGdzhGUzYzRzNzN090RFd0Z2V6WnMwR1UzM2ZPMzRlMHRMUzBOZlhoK3B0WDhMcGNHTEd6Rmx3bXdyTjQvWEE1L1daTGJvTmhaYVJrWW5zN096RG1seWIrZnhpS05XZDZGdjF2d0NBakNkK2lJRzM2aEI1cHo3cGMvelhIUS9uS1VYWWQ0SFJqc2g3K1d4SVU5TFJlOCtIQi8yNm96V2JQSmJXL3djYUx0Ynd1T0xUcXdBQUFBQkpSVTVFcmtKZ2dnPT0iXSxbInNyYyIsImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBVFlBQUFFMkNBWUFBQURydkw2cEFBQktvbnBVV0hSU1lYY2djSEp2Wm1sc1pTQjBlWEJsSUdWNGFXWUFBSGphcloxdGx1VzRyV1gvYXhSdkNCSy9PUnp4UTJ2MURIcjR2VGNqczF4VnRsLzdyVzZYcXlJejRzYTlFZ2tjbkFNQzBMWC85Ly82cnYvNnIvOTZTbXZoU3JtMjBrdTUrVi9xcVllWFA3VDc1My85L1BlNTAvbnYrVjhzdi83MC9QWDcxeDgvQ0h5TnZ2TG5CL1g5K2ZxOGZELy80eGQrZjhZei92cjlxLzM2U1dpLzN1alhEM2pqbnl2d2svM3ordk5GOHYzdzgvMG4vWHFqdm4vK1VIcXJmNzdVOGV1TjVxOFhua3Y1OVcvNjQ3Sit2dmozNnkvZnFLelN5bnhRREdISEo5N252K25uQ3VMUHZ5Ly8xdlBmd091ZUdQbnpFOXQxdnZ5K0pSYmtMN2YzKyt0OS8zbUIvckxJdi85MC9YMzEvL2pUM3hZL3ZMKytILysybHVYWEd0M2xYLy9neVgvN2Z2empZOEpmek9HUEt3cC8vY0VZNlo5djU5ZS8zN2ZhOSsyZnUzdFRZVVhMTDRzNmkvMzhmaHRlT0ZqeWVINnQ4RS9sMzh5ZjYvbW44MCs3MzN1eTVldWU5K0NmK2ZRbnNDdmY5YVJuUGUvelBmdDhuYy9rRWxQWW9mSTFoQm5pK1Y2TE5mUXdvL3VVL09mNVFvMDlydGpZeXhuMnhmYWxHUDY0bHVkOGJqK2ZONS9HSjYrSGw0YUhOM3Y0bFgvN3ovWGYvZkIvOHMvMWZkTWxldTcyeDFweFhVRzc1akxjT2YvTHE5aUQ1L3UxYi9rczhPOS9mbTMvL1NmN3dWVFp3WHlXdVhHRDd6MSszbUxrNXgrMkZjOCtSMTZYK2ZxenljOVYxNjgzWUluNDdNekZQSkVkdU1zVDgxT2V1NFpRbjRkMWJHelF5NVdIbU1KZ0I1NmN3K0lpUTRxeGhLdUdGdnhzZnFjKzU3VWhoeEw4TnRqRVJ1Ulk4SzNHRHIxc1Zrb1orNm1wWVVOdmpqbmxuRXV1dVYyNTU3ZkVra291cGRRaXlMMDExbFJ6TGJYV1ZudDlXMnlwNVZaYWJhMzE5dmJRSXhpWWUrbTF0OTc3KzRicjVZTmUzdXZsOVMvZkdXSEVrVVllWmRUUlJoL3Z4SHhtbW5tV1dXZWJmYjRyckxpQWlWVldYVzMxOWU3bjJpREZUanZ2c3V0dXUrLzN3OWErK0tVdmYrV3JYL3Y2OS82eGE3OTI5Wi8rK1IvczJ2TnIxOExaS1Y5WC85ZzF2bnZWK3ZzdEh1RWt1MmZzV0VnUE8xN2RBUXc2dUdkM2UxSUs3cHg3ZHZlQVUrVEFSV2IzNWxxUE84WVdwdjJFL0QxLzdOMC9kdTQvMnJjcnQvOW8zOEwvYmVjdXQrNy94ODVkYk4wLzc5dS8yTFZsbkp0bngzNjgwRFc5STk3SGE5N0FGWDFqZmZ5MXhDKy84YXZqMjdOdVlkSWYvK2MvdlY3dlo3LzE0VjdMdStwVGMwaWx2V3h1SEozTEdIUGlWMmxFTDJXL2laZU1IZExYV255NWc5bldNKzg5cmpCbkhMdTJKKzg2ZHN4ZmU0RzZiK3kxVjU0SmU5cVR6MXExMzJ2dDhYQWZNKzkzalRWQ0duenVFL29NcVY1UDQ2MG02NFgxM1h2WG1RWTJzTCtZNy81OE5lMzY4TE9ZNTczbUhwM3RIUFVlVDhwanMyT0EvOHN1WWxUWFRLTFZzK2FxTDhRa3gwMTRmZGZMT25RdU1lVEJubGJXSjR6U0FmWTN6L3FOVk4vd0xTeHJmaVhPWEVlNklEVjEzaXhHYlFtRDdrU1ozc3Yzc01GZjNTekdIUHh4eGEvTkw5eGNudjR6b0NGMThxNnh6b0J6enE5ZGJlV1MwbUtkWnI1SHVWc1A3UHNjUUg3ZnE0VTFTMXhoclB0TCtWc1kwRno0UVk5NXJ4cHEzeVd3RVNtWHE3U0hQZmxxNXVhTU4rdTcyWXpPNjl6WWY3UDV6OHlyY1RIQVFTejl1MGNxMXpEZ3hidVV0UWF3d3EyRnVQRWpEQk96aldzVXRqbHlLWFBFL1BJSkJjZC9CNSs4NDZoY3lvTWg4R3ZYR01lcS9qdUwreGMvbTZXTVdQYVk4Y09wOTJ6ZkZkWXFIZmVPaWJET1BXTWJLVXhYcHNjMlYvYlcxajYzK1h3dllQL0hXMk10SWJBaFJQcjJmQmVoL1FGOUZtQ0NLZlc1dWNmK3hsQXg0bWVYd1hLWDhSVSt2UlI4OHlQQ1l5ZnRUZmViV250NVQ4eDlyblcxOHVVSmlIM0huTXFMRFg3LzdncStmdlBpcjZWdngvcHhRVEdOc0h0Ym9PUDFzb1A4dFh3UkFNSzd1VXBRRE44SEZVYm5mbk1BU2NTczJPVis3N05lYkNBYUJSZi81bzlYNzY5ZVVoNHV2dGZ2aWQvWi9mMDFYZUZsaTJyQldwNVpndWF5ODRRbUxqeGs4LzZzSWV5R1QzMjBsVEJodFlTVHhJY2tQUXgzL1BhajV3NXNhb1JudlBWaks3aitZNWNkTUs2d0JSY3UxZGJmTC9MaGtYZTRObEc2bDhhT0R1Z1NLMVJUK2JCalhqbEhMOXQ3WHZ5aEZaYWtoNmZuRzJzTEtRZnViNy9TNzdyRzgxNnBqRldlZC9JcGdHdHZCQUt3R09OLzhsdnpSK0J2TlU3d2xML09BejR6cHhiM3lDek1malRIY1dOVTE4TTlWWnowVGJNMjdoNUhlOWRSRUptOWxJN0pMbExBMTBKZ0pmK2R5VjcvdVQwL1h2SEtHdzRYSmpmTkJSY2lUK2NlcERVM3hqZUJWVHhhT2xwRHdUS0pydlV0R3lOczd5N2xHNERBZ3BEbGN2ZlJpbXZFUlk5S0dKMVZUSG9IVjlRelZERUJwcE9RcHJrV1ByVHp5ZzF1d25uNC8vZXlpckVOWUpLVjRwNzUwekQyQVR2c3lWcFB2OHJUZExXT05RSlFmT0p1OGRDdXpYczloQzhDWWt4RXhNZFBHUnU4aWdSVklta3BzZDBFOC9SaUd2dGEvVTQ1Z28rZG5jZW5TOFpRSGx5clB4MThZSjltNUJjcWNjWlBXcVcrWHd0N0VqSW4vc1J2YmFJQWNZMzd3RnJaNWtCRVh1bmV4TS8rZU5zdmlBT3lEZEIxMTRKb1drRERBMFpoTWMvZ2QwZHEvVDdzRysrNVFPRmtWRFdDRFlKYzIxWGt4ZWkrQXRCa1FoUG9jRStDL2lEK3M3SjFQanZpOXgzR1V4OUR6cTQ1WFdQaTd2RVJFTURZeGtKeStiemxuQVQrR3JtaU1jcXp1TTNiMEFRUmdPaDhIU3dCL2lOK0dTQXJmTzlLOFNVOGNodjh6U1VocW1DNjVka3BHOGJBSlZaLzg0dG44VEdMbGdGckl4Vy9qemtsc0FFeUVhK1JGb3NPUUk2YXhTaG9GUHpxL25hQU9zQzI5b2RZTFFOQ1JkUWpYb3pBSGNBaXFtamEwaUljZjVOMXV6Wk9DSVpGU0VlcXdENlVZMGxDcHRZRGpFU1FzUzhpVFNHNFZqQ3NOTDZ1dlo4SmZNU1ZoYkV2dlZkSmE5OGd3ZDczT3dpM2tXQ2VYdXc4QXk4ZjcvSHRZcEM1VTJFbFo5dkljYkFLLzBPTHNWdllQcHp0SmtDK2hPUWJ1cGQwcHp1dnRVSW0zTDdiQ3dVRVNzejVXYmxCSE91SFMzUFJtTUtRSlJMU1lERWZzQkhZTlJ5K2x3eDI5bHN0QmJ6aVFSdkN4d2RqZmRBVUdDQXh6VVdGeExWYUNPRmpBOURneFFmZFpITUpKUmU2ekhDQ3pSUGVJVWg0TjVmUDRzUDFRSFo0M3MwTnNVNHBEYUltZG5BTEJqS24vdjVjRmplVzR4VXlSR2krSFhMWUMvNkN4QUtWY0NQOGpoc2hxT1pudndUbXNEYjJuRURWaVRNUVplL2FpWDdZS0phdjhJdlF4ZzVtOTRGNVlFejNCOW9BRzRtTDc4QXc5S2pnM1VSMGRoNEVaM1hlbk5oWjNwZGJ4V1Q3M250ZFMzNUJOQW9ZZDRzRHozZzdMdnBKQS9BYUtCWnZnQk1YMW4yOVdNbWNIZGJSY3lDWUpTVlc1WGQ2dmZTZVJQZ0k4QnRDOWF1ZHdDZ211QTZsSS83Y0IvV1FCa0FNWkJLK1dONVFGd3FoNUFGWTFjNlBCbS9VZVBsczNuWGlWckVNcENCMG5vMURYMWVNSXh2bmVvTkpnZ0VMcmM2YWFrdWJWWGxZbDRWbEJRSWtiTXJOVGMwZFJjZWtHZ2hvcUljMmMrdDU0b2tUTXdBdVFBYmVlMkUxaTFENlFNWUMwZ0NxU2VSWUY4eXVtU0tBanFVcUhpQkljQTU1R1ZFd3NaUlFwRGsvc0creElZU3JDVTBCUjNadVdncHNZY0w1MkRYQXZHdktQVWFpQXdJS2x3V3BXSFB6UGZ3V1ZCTmtqdEF3VENPV2I3NWdub3QrUWhXdndLbnJ2bnJDbTlZTDJ6VHlQVFVBeklRTDRESmtkQVdYRGdxaFBrQ1laMjNlSFJ3QmFOeHEyR3JxT0FnN2VvUFpnQWg0RHVKcWh2ZFRqVE5xc0JjSlhURENSSFI5Mk1EcFp3Z09OMkU3dzhwQmF3SXpEbG9ENEhvQjVIQ0xVREo0OVFiV0N4VGlBb24reUFEczVlMndpL0tDbkVRWGpIYjM1eDR2Q3h6QlVvSUlXOHJXb1VXZ3IwUWIvSE9OcEJXai8xaXhUdUJoWSsrcHo1NTBHeXNFUnR4dzVwNGpJVGRPSWhpVUFFSjhBL0lRclNlVmhZWUpRanM3N0gyK2NDUXVHWDhrSEJDOE96aUZIRzBoSmNJc1lWTWdMdGd2VXFVU1A5VU1GMFFwanU4dUh4NnNXZ256WXpIblU4SGtyK2NLeHpkU0FUeVREWUlrVHJidWdUQUNQQldUZnJHcmhHOWVMOUhLUDZKTStSTkdVSlArNnk5MWJpWEJzN2lxZ0o0QzFBSExoUVJDVmdTa1RKUTlZa2U0TE5RUHZJa2RKb0NPaWxJNUNkR0FrOVVYaEk0RUtaeDgrOEdHT3Q4WHFwYkN5OW9EVTVDS3lwSzFXY2VGZlV3WXdyY0NvaFg5M1JNc0VIN29Uc0FFMGJtOEFRZ3dDTVBwVWJSQjBJM0ZMNlFFbklhMHNNdDN2ZEFrMzBOY2hLR3lwSERhSmpYZXQxSWJVK3FUaTlrOVpKZ2Y5UGcxakhrRkV6S0dHNktGNzdJaDF3bmhSNmoxcGlEampTVU9vTklORkJwckJ5R08vK0JaZXN6NzVjNTFGUlRsQm9sYklPSmwvQnBKeDFaZUVjditqSTEzbDQrQ3dvRVk5TEsyUkVWZXlKMHZUTjBQWVZNSkZ4MlRhd2d4Z2pPWWl4SHRQSUNrQzdjWUgrOFA0bjFMVGY2OU4wNnZqZ1RtVW1oZ0M0dUh3NEVvMkNUT0FnRUQ2aUJWbnd1R1JZLzh0Z3MwakhzaEJGQUZEZmNObUVyMmN4QzRpK0J1S3F5ejZnTW43cUFRd1pOb2puYzExU3ZtR0hDOHVIRVJYZ2tNYnN4RzVNaUdZUUpRZmt0NkFOZTM0VkhObldjTkRpRDFrMVpFNDM1dk96RnA0akFENGNmSHNoTUp3aEpnNVRBRkZ1ZjgxZ0E4TUNlRFVkc0dJbHk1SnhPYUl4THAyRHN3Q3NrTW5zQjhMdmdBZkp4OU53b013UHJlSU4zTnZSQzdNZU1YTzRiRVRwWWZQdjZDZzF3Rmk4VjExd1RyZWdzYjJVYTRaSE1nQmFvZWlXc3VGYU5KWExNOHBCTnA5dEVvbU1lSUNlRDd5ckd6bDZWbEtURS9TRFpMUDVFUWdBdmsrTlhqbDJaRzRBZGxvQk80U0NWU3dmaUlJWlYvdi81RU16UklpVWVYSm1wT0JkNElZOHpyVFJnOGtRVyt6VzlYV0dFMFJUSkN4NGVKRWdBZ2R3SHlmRk41WHpFUzFQNDlzRnpvMzNvRVFaWWxYeTBaN0RHTDczTzdJakljVGNsNnZRQ0l2MDRVYmtab2ZpV1BEMUkrRXlTQmVBUEhiZnpwWFFpSkhTNTBZTTY5dzJ2TC9neTZCUFBLVnZ4YURoY2pFWWhRaWIyYmdJQUNzemhQVFRkUnFiRzF5QVFXdEpsaGYvZzczeFhIUzVBQmJLUXMxbzZqQ095QVVpb3plYkF3RVRWZlJnMzZTWWczS0czSk4rdk5HN1h3Qk5qZDRIS0krTUFQY2FraTVIQnRERGVqKzlnempHS1lNTVRKaUFBZzI1MzRYRmtOL0NHR2hjVmRFMHZlQ2s2azViY2lLLzF6UWR5RWx5VHFIYTcyNVVHWVFESHp1Wkcvb25wQjVZclNmUkNUZlVOR1lkWTNuSFBJWkFKeUQvNmNYendLQm9uUGNTUEFGWnJQZTRaVndqakdxTVh3U2lSOE5QRE94U0N6cXZENXI1YVZnSWlZUkpNVVJENWU4YjRxUHZpN0Y1TUM3MGNvYnhncGtwQXJZaStoS1lxTHBkOGs0aU4zK21IcGtLcWdac201aEhQa2xYbHYrSXFadEk0NzhUMkUyMjlidi83cFFoQWVLUEJ6SmdGU1lZNnNDT3h0QzNoM0FLSUQyaWplUmxsVys4R0xIaVJSdXZobDZUdWNLK0pWaElZTU9VSU9RRFVLWlA4TExNaG1sWEJzeURBaHlqd21sNy8rdGp2WDkzdHpjTkVjRGp2bURiaWhuUk9Pai9hUmZrYzJDeVoxQ0dEYmtERndGeFNxSzV2VUsxOVpGL3JtSVJ3VDdMeFRqMlpNRldmMkZpYi9uWk01S0J3b1FIamQzQlpzOWc5ei9jZEZzVWJiSzY4WksvbHUxRTh3ek8raDYwSzh3R3o4RFZuUmVLOGxyMFZheE5kTUw2UnU5M0diNlVXV2huakJmRk9ycHNyVVpWa1VoWEdFb2YzOXEwOG1aa2kxVFgraUxZQWErWEo5dUtKOW05dG1IV0NGSGJxeVppRFdvTGlBZkN6SENBZFlZcWNtdkJGUUQzK0R0MmJzR1Y0SHFRYW4wS2tROWc0VE80bW50eUpDUy93M1Y4SUs2TEd4d2poWXJGQU5mOHArSUJVeWVSR3VDdEVUTVlWQThKUjJtME1DODkrQi9YNTF3K2FnS093T2tmZE81dUtXeW1pZ0JBdnFMR2dLNE01MW44djQvdXlvZjc2UWp6MEc5cEN4alNoQzdNWVB3UisyRk9XTnIvRCtjUFRTRzhDR1ZtZ05KWHQvQlZZRyswUEJoeUdoQk53N0lUUEJBR1dxUlAveHFvMGdhWmdZNFA3ZUFEaWtBVFZ5N2VlRnR1NnQ5b0pPUWM0RkZSZzZ2UHJGMU1HZVhUL0UrZ1BxcGc5V2h0U0ZnQU8rQ0llWjNJc0t4RjdRUWVMMWN6d2ptM3NzQ01pQ2VxdlRvNVM0aHprbjJRMXZuRG82SFZva2hxc0x3VFRDMkFNRDJSZWhuc1dBTTNTbzJ3ZnRoeVpBR0Q1MzVYbjVWYVFsd211bXdtMFFOTUNGQ0QzQ05jdnU3RE1lRFV5T1pqNzdoeDdoNU5nSFV0SXMyRHNWaUliS2JDb2FWcDBDTWFoNWpBUDNmVEZMZUJVRWxpZ0hQK1NTTC9VdWxrelEzcmZISEpBT1VDeDZxdHkwY3lrQWVyc1hreVVUR0J6L0dnYXZoR1ErWndQbEhGaW5RLy9RTy9EQlYva0hjR1djQWRuVTRHNGdhekRCNFE3eWxqQmJyamRyLzNnL1AyTDFrVzltc0JBU1k2RllSTTEzNFpLWURmc2lBUUV2Q1NkOENqc1BpM2lmMjBUSVJHczh4T3pyZy8zaWhxQlBXRENMWVdvTUFOdmI3QmJMU3B5RzFTQ1FRRjVBR0NkcEd5Zi96TG1pVEovMkZjK3VJRnEvVHZtRnJNZGZPQm54eVdWTFc3RHZpVkVpa2VEeEExV0ZtMFhzaEhVQjV6QnJOTUdFMW02UE13aFJZRTB6dzVuUUhlemFEVmplSUJOdmpBNzU3cDhVNzRSakxQT2szUGQ0YnUrZlVCUlordlRHY3ZrbHY4bzlJbkJQNkErcEpKdmhrVmhCSXhkVGhCRGVneEJRTnFKa0lBaUdqLy80blR0ajhOKytWTHJmQ2JYdzU0VkJCUk9pR3dHQTViTmx2QzF2VE9BSkNpelRjWVowb2dJQjdtTmxaUTR2dGc4ZWdZVlFRUzQrZUtiTmRpRGNDYXNEQnpSTjVCRjlOK1dKVnVtSFBSVitCTWk4VC9tTWZxbDUxQzBiZWZkRVd3K3dybmt3QXkwRTR3bGhEeHdUaTBEVFdINHczRXZvWXovWkhSVjJCN3d6ZUkyd04rbnJZa1RQcjVROWlwWEYvektNaW5qL0lnTUJYV3hwdGladjczampvL0dDYVd5ZktRSzJjMEVUTDZ3Tklib251eFhEQUptTzNHa1JodEZ1ZHJpYWFrVko4NVkzOFNTWlJNZEF1RnpJVTN4dVhtK2VaMTRtYWowQnd5YUEvY3dPc3NxbUdFQlNMbjFnR2JlSG1oTkdVUU1CQ1ViS3k3aVUwUlZqTmNDU0FuZ0VhcmtzbWRYQUlWajNDblNqREpJL3hjeUJUR1F6TzZJOEI1MlIxZHk0YUdndUszZEFHa0JvL1dMVm9rZXFzczlzRHU0eFZ5QVBVR1crejhSK3NmUjFrc0VwbjNPdUFGQTB6NFYwanFtU2UrS0JFYWkvMG9WMVlGZkxCK2VEUFlNV3c2UUZ3UWQyakl3YmdOczM0RnFMSFlNSVJZVHZzOGRraitIUjE0S05OYzJkVDlDYkg4d285Qzk0Nk5XTS8rSXNzY25ySktCREx3TFhORjVvbm1lQmhJWkJuT3JKek9pUnpnTTZSaERrMzlpSmMwaG9FeDEzckhDOFdhYld2VytjQlRoN01pVFovRHJ4SVJIS3NEZENkb05ZOFJWSEtBRHo5cXpRUThlNUlBTlEvTytjbGo0QkdZQjhSSTQ4QVJUbmdyRW4zQnlGalJEYnJQaUZxK1VZQVdoQ1RabGRvd3d2OGNqTTJGNDNsMkMrK2I2SnQ4MWNYczluZllnb0EwWUlQZ0xzUU5wM2VmenRTVEJHMEhDYjZhSFdMSjV3dWtpN1JzKzhBYlNIVDRXRFpVVHBqU2NYZVlmcFhUNGNXQ3hnTnB1MWM0UVZFc0M1YTZ5ZHBSdjZnam93UG1xOGtuRUpOQURnNG5uQkIxT1FxZDBJbklEWUFzbS9xNThqTU5nMFBnakh3Tzg4cW5qalMrd0pVQjh3Q2c3WElKVlFIVURRT0xsMm5oMEhuYXpmbkh4YTdkWkUrS1hpWk1FY2p3b2MzdjZrS2tYNkNCQUxGaDFNc1dXdUFsVDk5b3ZwNEFiZklwUmcyMWdYNkh2bDBuTkpyWXNCSC94K21VZ3o1bnhvSG9nVkxHc1MzeXN3aGd4aGRTcUxGRTUwY2tzc0JZQkExK2ZpTS9PVFFDVElEUGpKZFhzWWlEMjl0YjFjVW9RYnd1WFBnY09ReTZBRmN5dG1nN2NudVI5V2g2eUx2Qkc4Q1JhYk1wSDlQV3dITzVkUUI1VDlGNUk2S21NZGt4Zy9DWnVZSGF2SkhzTjcwTFlZbzZ4bXNtdmZuYzA4WUtGcEhBVDRJTEVzRlIvVk52RVBzLzlraDZ3S09yT2hQelBXNFdGRGZXRHhlRG5zazhWTzdnWDZFd2FTWVdhK2NVbFI4WHR6U1dBcVhBNFhHY3Jld2QzazduRVE3N21RME85M2t0K3MvY1ZHSnBPa2tmODAxaGFWUWNTSXJpRU96SjVpeEN3OHpHTWNkYzdtQnZWU3ZORUxqOWlOQy9NcDJORURTOWtmWVFMVzBJRW1OSWVxSGw0VWpLVGJzeWJRdE4xNFdJdFlLMzhEcVRJYldHY2tKbVF6T0pjNmVucTRiVjFUelBMaURqUlg3TndFVFVvSk8wTGFjaG1JZkZuRmtxRkdrd090c3h6M1NvVVB2Z2pkY0FzVXlrbER3VEF3Tnk3VkUwK1dNSjZERytKc2d3MXpmNnNRdXNmTjlkK2Ztc0xqekd6S2ZsektRY0IvUXk5Z0o3RDNpZWEya3FZQWN1RlFBaHozeTZZb1AwOWNmMzBsM0RlTFQyN1l5Z3Qzdm9KT25ZMzloSTVVZ3A4Rnl1UVA2czc3d2lMeEI0SCtlVmpvZ28vaWIzdzFpSnVQQkxPSlYxaDI4SXY1V3lJN3NhaXVUckErQlJpeXZtYXhnV3lXV0liUVJnZ2h6bDVwNVZnUW1tWFVBc3NoaVZmUHBwb3RaeWp6M21iNVpHS3lnUVEvQWhNQVgwU2UvczV0VEVJSEVXY3JOV0dQT1cwMEgwSHJDOWZIdldZaURCYnZNWEQ3elZsdVM0OStjUllzOEpBV3YvNm1MWWg1L0l6bC8zNFkwT1Y1RUpkcmpVekdWcTJBeUlxUUxuRnFQNVVSNkJ6ZTMrTnBmQVU0Ky9XRFg5OW1PL2pCWmRWcU9uVUdlRW8za2Zld3ljU2pZS2tTenJKWTBZRGRBT2x3NUtWVCt4UGpuWnc2UVF1UTNPa0NRYUxSazlqbUFjTk0yWElsd2pZVXR2MmNTU1NEQXpIOHNXNGwrZG9Kbm52dUZzdDRUNlZKd3RlZ1RTVnNYcTJjWXk4TlJkd2ZGMi9RUWdkbWVBZ3VtTTM4UmVqSmhLVkhWd2w3KzlRcGlBYnprSXNZSU9oRU0vdGFFdW9HU01FOVZPc2VwN0xOZzQwSXJBWGhYbTRGa3JIcW5xeHREQno5QkI2aDlFSEM0QW5JVWoxOW9TVmpHd29DdkdpZXRkMFZydWpCN0NzMzBFL2VmRnNUZ1Q1Q1Q4WXhQWUx1VUdiYzRnVnlJK292L05iNlppd0paNE1ZV2N3NHhXYVZJandobitOd1pDZmlsMGpiUVhZbzk3cFlmZ2drNUFuVUp1S0JEb1ZZQUhzWWFncmVzSGwrRGl5VzVzY0JlRmh3U2FqVEczT0ZFOHdQMHZhdWE5MWNFaUlkY0s0cHZxYU1NWUxDQnNDWDJQM2pKQURMMTBYbUFNZ1JDRGNSZ3N1SGZTV0oyZ0l1TGd0N0lLZTNDSkNlMTN3anZqYlVDcDRhcWhMWnlqcFpKalllUU5NZXUwa0V6d3E0ZHpaMUxld0k0WlZiZ29SWVZRYlAzZENXNWYyZ1FSY1hrenlJQXdkeFYvUU0xTWxVVEFnblNuYlBrdkJzRER4Y3hJbHVMdWdHL2tDTmVKTGpyeUkvSUJwWnZWY2ptTTNnZ2t5VEk0VnpOdm15YmNDRnJLU3lJTmZSZDZnMUJGRXFUMHFZeDRDZG0zajF2Qnl1WkNHSmxIYXREd0dSY0ZIcmJLWlZYTkdqUWV5SnYxOGVGTTdpZ2ZYTEN5dVlnNTU4MkZ3UUZ2a0x1VFdCZzBJcGFYSi9jSXQ4dng2MGJqMHpHOU83U2RmcnVTWGphRTlNNyszcWNHVDlubnRDTEt6VllnOENieFB1VWFmbFkwMHJHcGlBRlJnRUJUZ2dhaTdBajVUQ1ZpWDI1Mlk5RFNYRTdJWnk1QmZoSjU0eEVtMkkxTkUxaDdFSGF3THdqQUlwK0Y3dkJ2NWFMamFQeFNkQWg2Y3ZyTUxqdVY4NnoyUnBSZXQ4ZWc4TURQYThDSENzQVJqU0lBNHhudFNoWlNQek10ZXdQbFFDV0RndGxVaXNNazZWd1pOUUxDK0J1UlBBOHBzOEl3Q05SM3JpMXVnOW8wSnllMnlkKzJYVm1qVTcwQ1BJUW1GaGtYZ3h3bTFhTE83SVBPVlJyRHU4RkRLNGdyQzA1Yjc4ZzZTMi9xTDE3MUlabm16NnRLcGtla3FIQ3NFaXNQYmFNaUNEN3hLVDhXb1kwSWhHR1NMK1l6VVJUSVJWZzR2dzI5ZkRqNkFzME5FR3UxK285S1A5UHp5WXkzeVFjMzE3d0tXZE5lUVRzb2RJSWlNUjEzRi9sQ29Xdks4eWRydk5hWUVHWFBDRzB6WlBYOTZBcDJZcjFtQm1XQnAweWxNbWdpWnVpc1FHS3daMytwMWpQbXdjcUlXQUZDQm40RFNTSzFIWlBJV25hUStoNFVQeVdVN1NNUC9rMFdnbGRPSHVPeGRVQjN0L2QwakF2RTQyQi9mUzRNRFpMeEQ0SmxweWU3S044V1lnazRpQW12M3dLSWdyOGR3Q0NmWWlXNTExRXpvZU5OcEY4SjRQU0pIUTBGNWt4S1BqQjg1akRBblJBdU41OWNKRFkxNVBnWEI5aE1zODVZSEVHZUJDMkxocWhmbUQrT3o3U3F3dmhKVDFqRStjMzcwOFd1ZTlFYWRWczRKaEdkQytVMWgxa3R5OUtPeDE5Q3RDTVZYRXBadGl5ZFkyQTRnbTF2c0E3Vm9hdC9rMjRlelR4aHZHM2l4WHdpOEpaTU55TzI0blhFUWYxTDVITCtZZmVWdDhJbkROQ09mUUJ1dVpWU2pkMCtpWndrOGQyd3hBeU1PMno0Z2ZIWkhiTUVoQ0N0ekhZZ0ZZVEZ2TjBtTkMxU0wyVmlVT3VMSUhqTnJpa3cxZlN3WmlZdDBIMENvd3VZSEFyUkd3WUJFQnNudnlsZWFNdVp6SGNsOVdlbHFJU3h5dHcwekhucm4vOEpaa2FZRkhJT003b3NqRFRIRDVaRVJZMGZNVkR2Mk5NSElBMllpTWgyMThZRDVzNjJSbldNbnp0Y0ozNEsyUTVHRFJIZXJvNXcyYXF2cHdFV0lGSENUOC9PRFAzNFpYRXd3ZVpEaTBMQ05GRTJ3N0FlZzNXRWFBQlBJSSsraVhCOUNLeVlOS1hOeVRTY2lKdVJURVp4andOWXZaaVpaRWJpQlpvMGsvbkNtejM1OTVTRlBYVnVBVFlxRURFTWdXOFE4enc1RC91QWlZNFpYNVZpZ1RkbW9SVDhBaXBiMmdLeTQ0WnVhS0NITUE2aXVmSDBiN1l2RU9ZZTlGejJHY2dNSE9saW53VGxDQTVkNFFjOU5YM2wwOStRVkRDUUR4YXJDb2hrNUE3dktHajNtS2x3L0hlT0Rsbms5K2ZncHk1ejBWM0hDOVlnVU11QldoTFZrakJCZ0dlSVFOVjlBRFVXUEppUTVIK014UTBVV2MvenduaFBkZ0hjWGNSUkVDaVRGcllYZ0VxUnVIUnZQaXhsY05uaktoQklnenNtSVFHSnd3YzVnc3ZIemhpTVAxZ0x2NFpaMzhCVGMzOS9aSTV5UkhhbHdXNkdaTUhPV3dNbmFER09KdGxmeVlKaDZJNTRscm5tOWtzMWMxSGNrN1gxNWlFYUhKM0w0VEYzNnhteXhreTNCN0FKV3dWNENRRE0rekJvOFFvRktLQ0NJUDhyOWR6Mms2b2loWk1vdFZnRkd2UlJuelFwNjQ3NW13bGphTW9pZ25QZHY0dXZLZExRSEtTdWNqVXJmMjB2cVNHeTNBbFFIakE1cGt6dVpOT0czMEhWK1BlamV1VDNUeXlKN3cwME1GbzJBY2pVMW0vL2tLQXB2M0JkUzlLU3RWTEpmMGlDQmYrU2xXVnVMVlpoQ3g1M21EcUFVL2dZZGJRVzdlZnB0T1dOWGFNNnYyVGY0cytTclVDbXFRaUlEemdwV1diWEVac1N5S0RwMlZHM3dHWVQ2WmpLOWY1ZFZkaFdOdHdjWk0wU0tvYm5odkRCNEF3cEZEdk41SC80R2VJK3pGU1U5MFhXZ2dUU3BIZUFraDVCdDA1aDFkb21xbEZ0d1VpRVAzWWFIcWpWUXYweUxGbnBVdmVvWnJ3aGh2KzFEQjhPd01zQzU3aXhEcTMydWxkaXQ0YkpGb0tURm15OFNJT1UyeWVPcGNMUnhKMW95cVdaRFZxa1pXNjMzTW9pcmRjT0JzMGNCandrT3JUNS90RG55RzlTb1FqWGhKYVYrMldlOENtRnMzdFhCYlYyZHhocFdQZUxGNVNuTVkxVkRIZHFOTXNhRjlKNlFKRWhlWGJOalJTYmhtT050VTdySjVzRHJpNC9Ra1pYbFloZmhBNVFIOXczd1ZvdlN6RlNGOEN2bHFRb2RYak1zNmxUWk9xNDh4MUNvL1VNNktHcVR3dWIvTmxYT0R5MmFnUkJodjVpM1IvamFOUUZiT3I1ZDJIVWpyMXNUMDkvRU0veFJYbmFRak1SRCsxUWpnWEhBTG51L0JzT1J0dUJEclY2eW16eWNmY3BkTC95REc0WlZKYmMvVkVDcDlPMjQyWlFGZzVJZGRzUjZNT0llRVlZa3c2Qml5cm9RdmhKTXJ1anl3eGdDMng2WkZhWlVzOWtWK2N1R2JXQkhiOXliUHVvcThXOGU3N1pSQkVjSkVWT29DQUpkMDNkOUo5QUtFSGx3UFAxVkZDS1MrWmdKaGFVSEx0M2o0c1cxdjJ3QlJvSkhZUDR1QnVYbSsvcXpMRTFsM2lrMEJ2RHBvMTB6TlFEUnY2eWNhUE5hVHdHTGhIZ1NZU01hL0NETm8yWHJWY1lYM2duZGREWjVQSU1TSVh1dmhlejVIMHVobnFIQ3N5end2SnZ3TjNyUGV3U0tmMjFSRVZrZmVrSDZDLzNvQXV3c3oyZ1ZDWVM4RWl3cnFZQUxaSlBPNHQxazJjQk0xaUh3SFlTMVg5elQxMjFCWTFtWS9Ia1N0RnllK2Jtemh0bHAydmVWV2I0YjJlVUx3SlF0UTlvc1VqQjllQ0dVS2NBQ2JIOWdRYzRhbklNbmNhSlNsWEF0MitMelFHbUV5V3ZFSGtQWU9WeUVTWTQ5Sk5meHBCekFXNVRCNmhMdkNVVjhFbkdrc3BHU0RSSnk0RDc5RkJKVTVVZUlzdHZtYkV1QWVqYjJ2cHVwTk1scVRYQzEzeHpxZ1U0UUZsdlFKMWRPU3VTL0xKSW5GbUVVbERJQVVjSHZUVzNWd3o3bjNXbGdza05naUQ2SWZFZXk5VHhVenFxdFkzeVl2aEFaY2lOK2Zia3dyZVRFbjhRRXdlSHN3bzNNYmdMY0ZtaG1pVGdSQXNZQm5BMTVrOUFGZlhHbndaVmxXYlVrWjhmdFU4eUs0Q1drS3FTZXRVM2VBSUlIUXNqQVQxUTJKOEtnakRmUk1oNTI3NTJ3eUNBalBQdFgwbGlUZU54b2RhZFYzdHRpaERvM05JdW0wakRLNVNuZUZKVnU4MnQ4eVRkZC9ubXI2dDVrbUlES25DK1BJcDRwKzNoN1lXYzVhMm8wL1AyaHV2L0hhai94Ly8zcjlKeS9FUUwrbXRBNjdib3MzUWR4NDloZXNjdU5tZXkvdUQ2V1BDbEQwZ1JJNXFxNEpaY0dNd2VrSEdxdlVvMVpQcVJwRVEraDNqMUh2dHFmczUwTkN3Snl6WjkrUXpXbDUvcFEwMitGUW9Sa1YvUE13YnMzWHVrRUxPT3A5aWh5TjE3Q1E1Rm51YThmV1pTbWVhRnR0QVNsVGtZWXJSUTgxS3NJaHZ4V3FBU0VBZzFCZEhnaWlrcERXdUdERFh3bGhmcnVuaS9oYjl5bFF0R1RXZzdueVUxYVIwS3daTmcwclRzMDJtdnNoVUJERlRPNWE4RSs0R3FqNXRPMjdhVmZmMmdvc3Q3SHBTNEsxUVo2QTV4eGJoOHBDUHN4L1ZHTFBUMFo1ZWtoeWpyYjVVSlFtU2ljL1Z3YWxyTHQ2ckZJREFQNWhQTmpVTC9PQm1tbEFmdFdBTkovOFZ3SHhwT3ZmQ0FoOGIySGY0QXVJWkdGRUJsRHVjenh1a3lBK3JFSjhna1NtVFVqUnhZNWk1eDU5MjdrUVpDV3RleWpYSUVVR3ptcllHelovZWZCK0UycUl3LzNlN0d1MEgrV3p5YUxlMTRaenhlR2gycHVoNXpnczRkM0RENXM3b2gxZ0ZqYTFJaUdDMHNMNHRnYklVc0lVSVZpSnV3ZHc3Y3kwemhEbW1LeGxKd3hvUmVqVkl4SU1UeS9raUlWOHZtTDhBazZnVndhRmRIK0laaERyNS9TWFhjdmFEc0RMaW9JNzlvRkhHWnRaSHl0eE5od0VqSUpDOHRiYlZ1TzFMSDM4aW9NS0NPTHBOYVYrM2VkMCtnNzRRclRPOUFVb3VXVVRHUGFDVEl0Tmk4ZUdxNEdIMktiY0ZQSG9ZZWhMa0xESkcxVmFMOHU4eHZzaG5UejVObWNhMzNkYVM1VE5pc3JncDgxTHJNT3cyQzE2VjRRTG5EZDUvdGVuRFJscFhqOFY1NmxteTdyWTdoMWdDY05PRUg0WC80UVVQZk93SmE4TTl2amFIT1JaU05WTzdaUE8vSGhkL0lkdHZLc25udUZXQVZiN3Y0TG50REpjWEJtdzl1aFZDUmM4cmJmWGdNQXk4ZVVNc0Z1cWtQTUZ0Vlh6QXJDc2Q3RTBJd1I3MUJJWHhNb2pRU2UveHR2aTR6REw1NjBRaUk1ck51MGh4Zzk5d0VhTnEyY0N1Y0s1bjQ2Qi9tcEFvMldQS203ZEtVNTc1bEZCSDRUL0ZWYzJGdTBwZWJ3Sm9xZVdGWnBEN0VldFFCclNZNDN4NmYrSW1DQ0tGcDV2VFkwbzVYa1h2TG9wcWdEenoycEtZak1xUzFVSDJNdVBoTHB2blB3b3Q5SHdvcG93RHVMYU9aMTRCU0MyRktLQmF5eGdEUzRNSDhNK0pXRlFvS2RCNXVCSFpaNXlTbUo4Wm1NOFhtTEZZTHhzT3BvanRQSGVmTWNRRGtMY0xnOUFjWHVtSW1TbzJjNVhTejJuYVlGbFVTTUJCYU9UUVdlcjBFR0swV1hucVgrYis5NW93enNFOWJrbEpETWFoOHhjNHliWFNnUmw3ZzNlYkRrYVpsVGE1dzVQdTA3Wk9LVDZkNXZ3WGFhTk1EM0NPWXJmUGpVK1BkU2Z2Rkh4WE1RU0dzbnB0bExIWE0yclhuNHRuRVI2b0dtZTZuRXhHdE9hWURTTnhWYnZ1b25YWU53Z1NBSXkxMk41VkxSYVB4TjFZR3hRTFN3cnZLYjRQUWMxdEkxNFRxZms3MkFHTG05REgyNkNxVmlZNXBuQ2xjL0Z3c3B2MDBlQk5VZmNOL2p6WStEeFhKTGJRbVRZOXhUUGVkZmNrR25yVHRHWllEeDB6MmtDbDZtZG5RNlBNTnRkVDRLbm1PRjVmNTFNL1NYRDg1M1dRZkg1QjUwUE5qc0w1UHBUZnVjSHRYL3lPei9ablpQYnNUVG5qK3pPN3h3T1FlZVAxSTdpRDZlVmV1SVVpeFY1YlpuL1VMakk3WjBscUY4TGxtRVppZE50WitZdHN3a1NTTVc3WndMRVBKSGhRdWg3QklBMnR3U0FuUXNtdzNNRnltMGtpV3pUR3NCR1BOM0ZNbDM3a2lyeExSTUk4YlRhUFcwY0Y1UUxYcVhZUnpCK3RwL2NNdEQ1M3RZNnZUYXZJcEpaUHhRb1FvWXJnQ2w3T3BXRzRpS0FyYTBDOGRkMFpVOTlpRjA0dDVvVXJ3aFdMdGhzQURZUUVvcWRMUTJaYzAvelJWdFRXcXphOE9BcFlMb1FkaFF1Sk5hZ2dneUdvNFNJaUo2akhXbUJVUFBVc3lUQlJDUWhaRUcxVjhSRDhmcmNUOCsvZlRMMWdzbWlZdkMzaytNaWltV1BkajBJRlZDdDlhMGIzMzhMZ3NQdXJXSFJIQ3JWRSsvYk9IQVRpcjhYY2R4TlRyS2lxSWFBWnhlNDlsZHFCcEc1ZUpqMU1uOUlyR3V2OVNQZGNvQTJyZkN5UldVb1hiNlJHNkxHUGxMUDgwYUI2VnREbGl3ditPYnRNUnErdk9SQ2FPRlRJem05Wlg2S3JNZGFvS0UyMUJHaFFyN1FyVVJpT0RoTEVrOXVHQ1FZZDdZUkZDVEJZZmtRQy9ROXM3TVNpQVY5OFZhNEdMYUVVV3picUV1OTJHSG9VN2NZSENIK0pxakVBcXFFWnB5WXo1QXMrMm53ZWpQYWIzREtRaUpZUnoweFB1VlVickZyWDdhZERTbldMVWZGTllqMnBkc2xBSnN3aHJNUkhtczBlY3lLL0xENVNTMzkycERubFhSRnQzOWhrOG1TSG1TTUtRTTdaSzFvYlRicDNnZEo4LzNIVjZ6NkJwMGhML2plSFo1b0RjRzhMM1ljaTl6Mzk0eTFJVDVyUTdGd3RpT0NXVXlUSkpXTCtDeU5lSDRUNG1DYlNEdDBlS2F2OFdhb0kvajNwMERLSnNqTVpTUTRoYjIrbUNwQXNDd3o2bTlWWjI1RFZKdldYWnNWcmVFemJNVVBMbkRaMTczNkdDWUlocXpOWG1ZWUwzelp5dExrb1lLdEZYcVNMYzNFQ0FESG1seHJrakMzdUxsSkZydXNaVTlMTEJrVnVvc0ZCN2pTeVc2Q2pmWnpkb2hWd2UvdEJPcjdIdGF3b3hJZUs3WkNMbVlQaU80WHEyTXUxS1JLOWppR1RjUENoMG1mYW9iWlRuWEwxNkVOeGZROS9Bb0RZWGZoTlhnMEcvVlk4ZGl1MC9xUzJUdjdwOUVxV0JDM1pYZFZ1QWZFeFdLdEdON3ErWkx1YTllYmRTK0liTWlrV2Nxa3BvV043T1VwYURTaFM0ejdxZmdiME5PRDJLUEdPM1FwNDJOM3BvWTkyZEZwQ2pRQ3NNbVpTOEQrd1B0L3VpVFp1MDYwWUM5WWVWdUg0UE8rMnRCRGxBUFdRN2Vub0VPM2hpWDdHNTVyZEZIMUUxYjdaUVVjM2dXdTRvZ2Y4Tlh0dFFuMkNPR25ZSWNqYTlnUlpQdXc5UlY3d0ZBa2xpZUt6OWNHZVJpaDNhdklhSFMwNGFoQ01oYmFOMzBlUzhjQlZUcDVMSHZPaUJnSUxXTEd3QnBxcS9DY2lZOXdrWjhXZjltWGg3TURiOHFMaEJvSFpqeFZ0RDBaQW5qYkJvMENaeHNBeG1FNUNsU0hCYnVmKy9Ub1JHTTRscDFodUJxTjgwRkt0dUVBRGRSKzhvK0xxSXFvUUZuY2xreDN4VjUyUnNyQ1B0aWpVNlpzVWU1VDltVWhaVFJ4aXluWEUreTM4cnoyMCtLRVcwTmoyVmpDWXZZOHN2MzVMOE5oV1orQ2E2WExHa2tMRGdQQjFKemViU1YwaFJ0dkR6R3NFYlR2UGllUEZrL040dW5SdCszSlVzc3h3eTQyKzBCR29jb3ZzWThvQkxDZHMvSWJ6bUVueU5MMnVFZVcwOGtoaFZVM0VmdHVBQVQvdGtldnl1RVF3ZDB5eHVIQkl2WVI3dHdxQk1DVCtmZ2tHM3JzNWcvOFB4RllIUDB3alZlWVN6THA5VVhBQXVqajkzRHlDNXJPajl3QVNGUDd3QzlpUk1JNHQrVlhIWE8zOE9KOTdqUVZpdkt3YytDRExUbE9BV00weTlIV2hTTEhKZ25wbnB0OU50MjJFdTdYSTJnLzJLSnAyeFVnSlhhcUNxU1BSN3AyT0Nkb0tWS2pnYVhodWV5R3g1a3hudWVyZzdqM3ZkK3BvdzBUVWJCNGp5U0JKT1NqWlorYkFMdk1QVUhvZ0tKNWl2UHg3NGJ3ZS9OeUhsaDdmaVo1Z0tyQTZZQXduVGFkYXBVMnY0VmZQeGp1UkpUQTMrMHBPdDIzN054cDRCcmo4aUlkSldFZFFuNklZZzRtd1I3NXRJRFdBNjdpK296Y0lOeEk3Q0pYSUFtMHN2QlVvVG04QUtPNlRsVVFIL0M2U3QzMHBiTmlHaXlEaFpYL2VsWmhKVEdMeDRJRTV4NndVNTVXNVJ2NVorbWFKeUtYZlRBQkxPdFdjTUdTMFozb1BrU2d4Uml3VGxRM0RERTYxYU1OOTZoNmhBUGdqMmRwUURZMVFkakNGWnVOWThsNDVrZ25HYUNESnJUY1J3VmFUNjRSNDhja3JTejc4MS9rM0dBenB2TFdDd0k5WlJ0UVpEemdCa0FncjdZWFk2Tld3VXZtTXpwRzFwK1QxUS9OQTdISFJvRGFSSkxHbmdXSDMvRkRhM3VKSHNSS0xUQkNuNU5kc3M4UDNxemJuZ3lMNElJVkFZWHdMc094cHdtZU9nMGMvYnYrakk1UVNHVEp6YkpNQTJxeU5BRHU5SjBnbDg1UWc1dXR1Z1cyZldhQUNGV3ZSd0g5VWhSOEFXRnpHci82R2dSZEM5bWlaMzJZZFNLOFlVRElVM1BGSnBXd1FidUJUbkV4ZnRRMlRtQmY5c09xT0Jya0NNTS9yYU9KUnJQR09KcEYxZyswM2VKZUdGU3h6aEl6OEt3ZXY2eEhrVGxLSlVsa1VmVm5KNGQ1M2drenQxN0hBenhFc0gyUXhWNWNhd3EzS05JZVI4bDRvQUpGQStnZk1MdStaNG9JNEdMSGJMUnAxcmlZUFZHNms0NXNpZitmY2JIeDQyWHpyNEhOUW1Uczhic2lVSm1zbCtINm9ZamRkUFNSY3BZZDN3TG5Qb1RjWmxKTG05My9aWVZycW56T3kxWGFZYmJqaGJERytzWW5nT3BKbm4rcml0ZjNUQk1yc0kzSERubUVZQnFuWlVpQ041RWhqN0tud0tCN2htcGVyS0F6Wmo3TFd1QWN4NUJlbTBtc2owQVdsUXBXMjJHVG1rSXlUWnRsVHBFMEROdUtYbXRQVTNOa0lXeWd5Vk4xbzNxYTA3SUNnS3RzWjU0T1FJRWtLRmJybUt0MGxrMHdqSjRwUWhGb3RUMitYaXpHK094YnJRdFVZRFhzclZtd2htRGJPOXUxZ2FWcWpTbmZYQkdHVXgzWTByRlI4Rzg1RU1WVlRSQ3RhU3J5ak9xeGhPTk1BYnFqZmNvZjlMM1pSYk9reVkxTGcvVEJxVzdMZng5bDF5bll1NjBPT3J0bTlTcWFuSHUxZHJWVm0yS1JYb252SVR0bWI2Y2ZGSmJTTnJHSXEzalhUNjZ3bnVFaHBwRHVkWUh3ZDdZQjlrVzl0cG9KTzl1NVFzUFhlTDZ1QklJOUlJb2VqTnloQU1zVUVPd2JGc0hXM3ZkSlplRWlQNk1WdUd0VWlBWE1kekluQW1kcDQ0ZGF4Ny9YUC95cjhvZnJmMXovQUg1YU9HUVpPM2JOeFJJZEg1dVhuUkFUUFVpOVpUWGJpbXJ6RGNzVGQvVGRBaEpxc2xFWE0vRmtEbmNoZGp2S3hzazVZWjVFMC8xYzUvVGFPc3p1U0pMUUdzUTdHeS81M0czbGFuRHdUYldIQWxjZml1OVJGcGJaaTUwdDNTaUJXQTVYc0VsYWlaUS9ITHlhRWljUUkvQk9TTWJWYjQ5Umt0VlFOc2VjbVQ1SVpNK0phbStZSnlMV1pOaUZnV0JpdTM0ZDQ3SmNuVEFTVGQzT0JWWERWenhDaHBKVmh3MHNQcU5uQzhuUElGRDkrSDVzbnJON0ZTVDJZb1pWT3RnenIzSll4eTBsZEJwQjk4RFpRVGhIdllQMUVWM0xkUk1aK0trZHlkbUVTTG1Lc3pYZ251Z3hqRG9IbEYrSGVFR1F1aE11Y0xzVnovVEQxMFdxVDdKUE1IdUF3R3VzNWp3ZGlTK1dqVXFyNHlIYUZQU0QxUkIyNFh5MUlna3NjSnEyWHp1OElKeVkrazAvMWNsLzBwNlJjZVE2MkFWTHp3Rit5N3lKY253aVc5QnRXUHlRRE9xK0FDRXl0VzM5MWpRTGpabUF2aXhpa2w5Tlc3WnNIMEN1VjhkL25lRlVMMWorVFJ1OTJOd1A3bzA5bVIwN2RiYjNaNHQyUkJTak00dlZaYytaUlFEbFJmek5jZG1SQmJXeGxmTzBRcldmd1hOSVdkNGd2dXhjRWpHKzNFVTlKSjFDMnV6cHRISktRaFNWQ00zaGQ2RE51S1hYWnVmQUFWc3VBQlRlM3g1T0lnbnNkbHF4bHh6Z1lGMUIxYldKeE9hVkliVTJBRjFsOE9sY20yVWFKWEo5ZGJQLzdIN0MwTHVwQzlNTlQ3Y3NoTldwOXM4OUZnNG9Lci9LZmdDb2hQaXJFWG1iTGQ0bXVyVmlHeWVkYVRvOVJiSlBmZndhN21IN0RQQU1TN0ZFWHJFMHpzZ1IxTk00TTFsZ3lyZWpSQ3A0UjZnd0dXSFZ4dlQ4dWhMV3FpMkg2QnRIM2ppSllscm5pWnNjb3BneXdZS1lNNi8zN3J6YWdRaE9hdUd1c1BlcThzOW13KzYxU2lVbzFRUWR0M3ZlbkdNaHlHS1U0WkVtaEFmayszSzRia3ZkTElqWjBhYks5NXlMejI3d05Zc0wrL1BZRGtGRE9QTzA4bFNnY2tmVlJZZDVSdXZkVUtTWGM0bFFsSXVBZzNpQU41eENjU3MrWCtnQVNoakw2bDRKS0FwZmY1VFh3WUtqS20zeTNGOWhOZVBGTzhPNzdHeDB5b1ZETk12SGhVQUE4UFhGeDhFbnAyT0F5bnRTOEN3aWEyZEZyeVB2SE5YRzMxQVQ0TkZXNGtEemw3eU9FRFhVaytha0F1NXo2aEU5TU5zcXlZMjZzeWkxdjkwalYvemI3aGRFMmszc1ArMnVOZG16MjI0ejVPS01LUUdQNmkwUUtrUTRPMEtTczhLU1V5ekRaK0hFTXpkRTFhcFMvZVZhZXptdkFDT0h3cnlaQzI0UUVIQUExMTJXNmVKZGtIQTdXZVA0R1hsa1NYeXc2cmJhQUV1WVF6c0wvazRKR1N0c3h6UWd2bXhQc0Z0NjJXQnUzUzUwVmNpcUd5cndnV2JOMlg2d2dkNHRjV0JYNEJiN0ptUURzRGR4OFN4c3MxNGRVL0N1TUZ1WW5LM2VqdmNzelpZdlFMTnpnNDdVTzNVaCtod3FFN2VEWjc5bmRxbWQvYkF2cStteEhKUVgvby9Mb3BvN24yRm5mSmxJczFqT1hMUElXdzUyTm0raDBwbGVsMVBnTEloK29ZSndBeFR4K0lnY0x3cDFPYXZGZ0dGeXhoUG1ZcFI0aTNYSmFhTmx4NWswWjRGWHlwYyttZXhhYVNkWHgzNVVzM1phcDZNeVc5V2hsbW5LZFVZSVd0RDdoTStJWVNQNDh0QWM1UUhQdG44bUJpZURmQjY2bm82TVd3NkpxRjNPbkgzc3hjMjREQjVwM1F5TVp6WUhYa0E5VXdJUjdaL3RGOXEybTU0bWFuK0NsbnEyT212bWxNNTBCd1FrU3dOTlJXNUhYam9FeGdoSlJMSlJIUm8vbGFRNExTUXhlcnBSN0pERWUrNkdmSHFKSzhFYVdPazNOM1I3S1o5OVJxZmt2cGpmeERiUTVOeThReit1RnUvdGRKZEtHRnpPN0pDa1RZZnVlWVJwMjhjMExYeWZZdHlLMk9HTnEvT01uSzRRUFQ2NHR6SGdzZ0VTSVpzd1l0VGdhNi81czdtWnluSTBTL1VkSFFzWXNCSFR1VFNkS0JSTXZ6d3FEWENVaU9JMHBHdEd1MFl0T0IyM2c4TEVIWWRSc01VT1FhbTh1L2xLTE96R2daRktFS0JvQ2drS21LRWhlcUhvY0ZrOGJMK1VmZ05MbTl0R01rZEx3UjZ4azk2emhjTmVSN2Z1MHg0NVp4amxKRHNCdTBSK3MyalgvMU5Mem9aaXoxZnpjaEp6OUFEanpPT0RIU0VEMGlNdnpXTTVHY0IyUVBndTI0Y202aGtiQ2VkSWVkbGxrMDgrdFNja3JYTzBWaE5CYlg5NzBVN0padjl6V284YXZKWE5CYUFDWDk3WFlpU3JkbzFWdHNWQWRYck5aK29BTGtKSWNtN0hlckl0N2NYWlFleE5pK3V6d1JBUEZtV3lsQTVjbDllWnNMQVNld0RmZ0prN2JUZkV0Vm4xT3Q1bytsSXl0dmRqVWYzS1lJQjE1UkNGYm5jTGhLZnAyVW9FaTVuU2l6Vmx0Nkp4L3dGZ0s5Qm5pOWo0TzdIS28rL0hVdlY2Y3EzQm9jcjJjeFMwUElqaTRCYXU2Sndxb0FHaXVkTzdtOHF6aHAwZGR3NGVETXhCWTNnOGtZK1kxcTNPTWp0bi9xZkhjMkZlUkROOTcvRElNVE1oMFBsNHRmYnJjZklJOHF6ZVZnRGNRUEhKODVnNUtJNERhZjloTWN2MSt3OThORzcyUmFVT1hCRFQ3eTlhaDh2YnJQZVlhSFBIQjVVelZUT1kzM1FqVUMvd3hNOUJBYWRlL3U0T2hTVnNPaEhyNlU2N08rZFcyQW9CMVNQSEl5U3l3d0N5cmpmL2lpMEo1bS9iQ1FSaW52R29lNnhwZXRLcWVaVFdaOHV2OUFYRkRsTkFISFkxaUQzczlwdUFDZmxNNVFYeDZ1WHM4ZWRNTVlDUERZSlJzZSsxbmxFM2RzMXVhRjZBa2lUbk5jQmliaWR4dmE3L0diTmlsc2Z4MSsxQ040VFRBV0RuVWJROWMvdkJYZ3hibzcwTkoxK3pTTzh3N1dMeGJIZXdYaWV1bnVvYVhCZi8xZnUzdllnT29iMm5rNHNjNmZYWnhJdzlnT2RGZUVNeERLQ3NPUmpxTTFMYi9QMFI5d2g2anI3emVMV2o4c3FwS3Q3Mm9pQ1duTGxjRllOZ1ZtZ2VURmhhdE02QXJoYndwK2JzUTJ1S0FJRFBDdnorMU12bzhqcUhwWG9WMXFJVUQvMXdOY2NkalhiS3kyRU9DWVd4UGZNbUppQXJwc1dObnZUZlo3ejNHeTZvMkQraFVScEswTDlxeWhjelE3NkowS3poR1c3V1hZb0pPMzN4NXN1RmN3VFY0L2dqTzJtS1F5VDNHVm50L0RuSXZQVXpVdVpodmFQZE9aSy9nYmRPcS84UVJRNXlRV1VUbDkya1plOEVhMm5DRFM5OEFYTEgyRVhWcFMxMDRUUXZUUk9iTUNNSCtVNUZwM2w0cTJhdXR3SEpBV3RJRHJSR0ZoYWJSQWg2emxvdEhsdHVod0U0d29hVmN6ajI3enFWdzhYQkRsUHJCV0JEZEExRmFQU1F5ZnFRR1J5TUxRNVh1TjFZRGpFdWpvU2RpZGR0MXBQZFc2WnhQNURXNTNhWTVyNmNFMXljaCtjMFJNelowNXB3TDJBU29zL2xwRE12ZFlHZjZSeVI4Z2M0K1RJTnptZG1TN2tKN2M5anliQ2VhSGNySzJxZ3Nya1BpY2oyZU52OEJKb0JCd25tOWp3dWNKWm82ZEdSSGl3Z2xNVXN1SThGV1phbmVJNTYwcnVaYnpnMUJEcTBDclJ0V3Bqd09wak4vQzRYSGR3U0lPV3hOR1E2NDhHcFYrdUtFRElmcllHMlFwQk9PeDJtSlR2TlVZTFd1Nk8zeStlUGNNQ2l1TDJkK0NBa0wraUNyVU1FREpoLytkZ2tEeENjelNCYjNQbFJ2RnNEQVgwTzlaU2lPc242N2JjbnF0bnhWQjJ1UFpKam0wR2JaWTN4aGRzL3MyUWtxN01XSWNUM0dlTmJZY2g1Yi9tUE8yVzFsbWVQVmc3ZERoTUowMkViYzhwNklSYmx1VHcyaTA3QTR6NHJmTlJCamtHVkg1MHpiOVlnclE3dk1WVU10MEpFSjhoRjZpQ2I5U0tJVFdoYlNlbWFMcDFIZHBBS3p6aXFoK2pCSTh4enlieE5VZzQ3VE0yVGRXeEVQaHlNdmc3WmNkWm5YSkM5aXdYTUdYNzBkc2Z0b1Q2Uk11aGFoN281RStBSTR0Y3lXQmFEbjVtSlBLVjFEbnE1WHlzRWlyMEZuU3VLWjc0SFJMUFlyVTBnOXNoWGQrTzMrNHlDdzdJa0p3Y2Y0MkVxMHRMMFBURS9iT0hCMmVaK3kzVnNidU8waHpIeDRhM1pydXhnT0V6YlRtM3I1bStWZGJLczMrSWw1elRDVkk3c2FNN05ubm5ad2ZKNUVqUk85aUtBUXdUWkRXS3hXbDkzd3VGZy80YWQ1Y0ZheERPNDdNT09paFZ3enNnOFIrL3pxaTNyanpiTmdkWFJtbVJFYVkybjZQdUZTamduU2ZZUXpvbU9mZVFZQktMTXJ2a3p3YzdPOFp3dngrNmY0ZllQQkVuY2VDVkt6NmxXVGFZcm0yMnBjVFJMRWRBOTJxdjFNYzVVdUNIYTIvNzJCUnNCTEIxMkFLNklIcFBMeHJQZjVCeGNCMGJaZUJmdEZMR1V6RWNCNUZkZXRVMzJFQmZMM1J4ZmlicTZBUElVcmI2MDJUNmZLZEtRdkFBdlk0M3Q1cTAyeWNWNVlPcWdYUHVzRERXcjlWcU44Slg5Ni9raTJJVFZVRDdVWVZvWG9QVG5zajMvYnR5Q2pjWWorUnFjeXpxTnh5NGJlZVhqbU1uYlUyV2c0eHFLci9zZFVYMktRSzAycnNleXA3eDNFSitSQ0M5ZlFLdmw1QitSZkczSG5kc1JsQWEzUXdBSW1WMUxKdmVlNHVobFFrUkc3N3dKS1pmc0NLM3pPUWZVWnlxbXd6QnRWMHFFTkxZV3VGeW1kcXFqVnNEc3dqM3NFdXd0Tmxub3RDS3ovVTZmSFVzbURPZGVHb2Z6czNlZDVzNm5kYXI3REdRTVcwbGVpTFErZ2NOUjJGeG9IUjBBZStDSVFMNkhTY1Y0RHgrWUUyWmVrYWtZRnJJS3NpY0xiQVpnRzdUdFJMN09JNEdzQkhwUTBRNmk5akVSblVoNFNtbE45Y1ZmcWZ4N1F1ZVFEaTk0VlFuRURvb01UdFhhbFNEREd0blBDb0lRMFZsc0E3V0gvMjg5WTV3czRmbHI2SFlpYzJ0U0FLRHdUSHpHQTlBczF5bnV0Q29wK2N3SVQvQlJiYXVlMlJaT0luSjhxVnhQbW50T1dKeEpqaUpiQlZWeGp1Q1FacWlDeTdaclowK1lQWWxPUkF5RVlQU2lGTHQxL2dWY3h6bDNzVFhrT1pPNG5NMW9sL1FaTHNSclBNKy93blF1SElEQ0lqcHVibHVKdno1QnpKNzZoQjYzTk5LWlhPOHI2eHZkWTRKa2Q1QkpxK0swYnJ0OHRtTS9Tbldvc01PRE1ERTA0SEppM0YyRHg0WFA4ckV2NXU4ZHd1TlFMdE1QM1Q2K25LeGJDY04raGl2RGIvT1ppZXVBR1FkT1pQMklHOTVvMWZjOHBNcVNwdFBicmZKVGdBWWZLR052a3ZPUnQwOGJtUmYyMFcxdHNMVHlTK0VwNDNhYzRuTzYvWjFJdnUwd1I3WEU2dXhpL05tU2FmNis3UUo4N0dpUzVUaXVHSmJrZFVySGlwTzJUanNoUHR1enRVMVdQRVZreG1zamtHY3NIdGE0eks5anBHQXhYRGtoWlY5V2hMUFFZMGhDUWZaWW5DOXZuc2xHRDBlblRvOE5MU3MyZUxDZ3RpRUxGa1FQTUJxL1FrM0VkS0VTQjl4M09HRy9PcXpiYytVN08vUU1FbXA5b3pNNVlYVk83UWtlM1Rrc0lVNGZJd005WklOWm16SHFaUmRldDM0WldVVTBIUVNheDBJQUVCMU9qSGtSOGZGQzNPWG4rVlV6TmJPd1RuTTJnZVRJN0dYZG5OUFBWdFdqOSsxSjhubUVUc3NlMVRUc09ZbWlxWnpKenQxQ1VqYkVrbGxJZ2hKcm5tZGJGUWRMWGVNOG1DRytDQ3M3M1ZzOFBVNTludEgwSGl3RmorM251VDByTjYyRWhxY2lxT2Vwc2JGWFFXUkNpd3l1M2NkVkNJUGd6SFNLbDlVVmhBLzdqWHlhRlZ4M255Rnh6dWNiRXVGRGFnZUNFZlJweHJLTEdNY0cxZWM4eG9WRkM1Wk1ycy8yVWdMSFo4TmRQc09hc3NZL0hPQVNwSnk5clFjZGhjL3NjeGg1V1JUOUFsa2VqQklDMkZySHJmTFNSY0NQOHVVV3dta25URTZPVjJEWTRGT3JKZzZkcmFkSDhDdlhxeGMvbmd3QXpNMm5YWlNOcEd2eWhHYUNncUJLV0o0d2xCTVVYck1hUGxmRE05MDVMYm5rWFV1NUhCeTFidDRob0ltY1EvUVltanhySDVBZGJzV1p5Q1U1QnM0SGpIbVVPOC9NaG16cnVNaGt3K0FMaHdUbXBKcnJnMVRwSDE4MVRMTnlNU0FmSVlUck5uK0VKWVIwQ29vOXdmS3dhNXhuUnRnd05DcVJGbnJpMEhtSFBVcmhjdjJpVTFvY2cyL2VIdk5uKzNCY1p6S2tkVW94WGdMa1poY01sT3E0TTB6NzRrMVpNMGNxUDdhR212WlhnSG00cEVOeDAzMDVUZUZrK2U0enN2UjliU2diVS9WT2pFZHNGd3d5M3phMm4yZVpmT1laNEp1dzVtQnZHMDd4Uk1mN1EyeFlSQ2RlV3B3Umc4Zmp6dUQwRVNMVG04TWpyd290ZEVobFErWkRmMTVQVTZFaHpZbmgzMm1FZGNLTUZkM2JpZ1VucDhYNzFORi90amxMTTFnT3BDalVhSnVIUkhSL1owNDNHR0MzeUxmOW44blFuUkVNSGk2Zkt2Nzl5VUJBdE1VRjMxYTRxYnFMYklTMVU3dHZITVhpVitkT090TEQ2aE5ZS2lFL3p1REpPRCtOTWpaN1BzOVAxOC9JSDJ3RXNMK2NZZ1NYeHRpakU4RXNOVHd0enE4QS9kMjJ4ei8yQ0hUMnhPWVdKQ09PQzJFR1grNC9xc2FKL1E3YlFRQlpvWWNHdWxXdTFlb3ZyTkU1cnRzcFI1OFliTVVMN0tBNm8vaDk2NWxydVRCTTFOWUdOODhBbkR0Z0E4RmhtUWpONlNEb0JlWkRCTE9QQmJEakhFTHdWZDVjZlltT3RwVUNUUUkzMm1kSTBoZlNaVzF2UDQvVklhcER4bDZrOW52TEFCT29LZkt1TTdOQ1BMQ2p2eUsxUk9xZWJjOTQ3QWhTdDkvWHVPMlVLSStqTW53Q0RqUXUyKzRFUEtsV05OdG4ydkl5dkVrdmRxVEVwUTROanQwN3ovMGc0TmpDTUIyK0RuVERtQkQwVHNmM0lWQnpnTnZRNi9ZemhsTmFycnBTbFVHZnUrZkZ6UUhGODhVZzQ4ZXRvV0E4Z0Ivd016dk1hem5WL0E3d3RxcnE3czZVZW4xMmhGMVF2TmR0SVZwWUJNa0owNnNGVE1SUkw3TzRsaFUyczhDQjJIWUdhRXF3VC9YZmFZSHljTWl4K1gzNGtNSk1KQjBPbkxjNDByWnJLZmdIclhGV2c2ak4rL3U0SE1UNjRjL2JLR2VXRFFKamdZeGo3NTA2aGlna0RGbkZBNEttZVZ0NURGZThRQllZOUxkNklNNWo4SGJUelBFTjA2MGQ4d1VvUFhFa2ZpMFBQUWlrUVA3eTJRanMybXpCL0ZWS2xudllIeDU4T0E5czNQeVNUVWZ1UjhGMUxBODNDVmk0TXdkTDMyOXdZcFd4M2o2K24vS29hdU1wck5idXNuNmU4VE1PaFhYV1BRcjljUWQ5TEJEczBVa25acG50MDRBOXFLelk0b25hOGF6VHFkZDVYczR3N2FhelFJd2tGQ0RwQUJBZ3dybWNyK2Mwc3BYWnpJdG11QnNSb0RvVUdnMmY1RGFuWWRFNUVkRklMbXFkZ3ZCbWR0RHhkTU5YMVdvTnZROXVFUWliZGFESlBEWHJMVUxiL0RESGVTYmFldzFqd3VOa2Z2aml5YXRidEdkQnVQWER5Tkg3VjVuYzU4RCs0UFMxQndMNUZvamg2WkU1VTdReHlONWZINVBuVThoWVRaOFFVY3lyQnlLb1RkWUJIKzRQd1luSTVxTWVzek95YlNhMU5zcHNNU0NUbk1kK2ZVS3lVMzU4SXBVUEV3aU9rcldiL05UaFkxQ0ZOVmJrMkZQc09CM0VySlZxYi9JNUtwYVB5S3pMTloxQWMwb2RvNDl1eUVGUXhxOFFDZmVaeER6RVRaOVQxcVd6RG5UY0hxQzlmRnIwak0wbjZPd0ZyUWxPRFN2MmZTVnJWc3JwaE1WSlVOZG55Q0NZMElGTUk5NlEySnc4M2o3UGw0eU9XSzhSZWZMQklaL3d0WHhTSGphVW0rb1o3N1FySldQeFhFNXhVQ3dLMUFlc2JLT1NUZkdPZlBtNlJQbk1nY1Y2ek5VU3d5MnNIaVhhTzB2NFNJTVhPZVFTTkR4SjB0UDRmYWJhcWZGaC9zdGFKQUlDdi9ZNGJ6dDlWeFlwSkZVTzBYWXVUenE1L25rb3UvSEExT3hKTEh2MnZKMjBCN05wNXJQR012QnhYeXhGZ3ZvdER3NlhCK2pGYnMrNStsaU8zTGZRR2VkSXArcmVzckc1N3VqYzNZM2RPc1lmWSsvZXZvTzE3OHZCRW5leUJBTWk1RUFSOWJRZEx1TzBjeW05enpSVnJNc0RUc05nUm01NkcvYlFtQ1k3UVlQRnZzRVczcHdMSkZaOVRrYVdJamh6eEVmdlFXS2NBdS80Y1hqVk5nZnBXU0ZyWFdkQnF2dUFoNG9kWHdnNmZvWFA1UHF3Ryt4b0JuejZ0SVJidE04aU9hU3BPZmZVc2JtT2tuak91SXpwdWZBY3lyZnc1c3NScnl5SkZQUFhzOU13eUdrVHVNODZlVEUrWU5iNXo0NHI4ZnpFZG9UUHlBdjRQVTVYbVYxMjRPZ0NxM2R1TUxuSWJDdG8rOGdGQUZtazFEcXpvM3pvbk95TEJlUm1wYU1lUmNGSnpUNlpQdnVlaTQxblM1N1hHdTNndVkvVFdRQlRLSGVGVjY5dFRaa0greW9taTJ6T2M5dWVIY2JuUXgvMEZ4K08xYS8zVENpMTFNaE9ZR0lIckxIN2JDZXJzdGxESjhkVkoraDZ6T2ZEUFJ3bGtwMDVXbndLVFBJdVRkMWNJN3BYenpQeVQ1bGVObHc2M2dKRzlxQUNsSENQTGZ0UWlzOENoalBQenc0NTYxRWNWcGxmUi9aZTJJbFBuWU9heEF3bjgzZ1pjSWdvQy9UNnlWcURiUFk4bktkZHpXb3Yrc05LQjRQUjgvajRGeTVzK3JBN2EzRjhvcFoxbXltY1pGeDAzTnVwdC9ZeGRQMHRVSDY4OVIxbldwV0hOdXdLTXVXUjBRTUhNNjdydTAvNUtmdnpoVlZPVnQvU041RFVKOFE1VU1hSFBWaHFOTXlVbU9xTHhCK1dtWS8zc1ljSWU3YTJYWTZYZGlpaWJXNDQ2ODlNWkd3YXh2dTVKeU9jeHpqc2JmL1RZMTdmTWp1YkN5Q2J6bW00bXdlYjR6cVJPL2xZWWVodzhyR1B5OVF3Nkg2eXNkc0gxK0syNTdBMjJoWmpoMlV4a3hOOWhBOE1FWmVFK0RwcmJOa3NrYU1QOCswK29jN1JURWZ3TGl2R2lJUmVDbmJoOFlIc3Zwc3ljSnc2RUlzZjVWUFNjNWxXVUxmNllMdm5IR0RZZUswY1JKN0FUeDdpQmN5TDNmUkpJdzQveFBNOUtYMGo3bHJzdXpsbmxsZER5dmlJaGVjMkxZMjVmUEZNQncvTFRyNWdmWVJUaHdnMnhBZTIydGtFNk96aFUrSFdjdjY0bytTMG8yMWZvTW1qZTV4SGU1YndGSityTVFGbHgxaDlCSE1mK3VSakhHQlIrZGVvcWZ2MHo1aVlQWDRNSGprU3gvTnFXR1VqMkcySEREcmdLeE5wWVhIZFpwWGlRNWtMdU9DY3NtYndSUUlhWHl5ejhEUGZlb204NlZjL0k0cnF0YXdmTmVxMFVqMkEzYkk0eDBjMzJibnNRMTdzUUQxUHViS3BHTnN3N3p6MlJiU1lSaFdIbnBxdDRyY3RteVo4RW9BbXhCYjVacnFia0Izbk14NWJhWHdpeE9jakhoM0RpVHBzRnVnQ2xzMnVNcXR3eTdiU0JEbjNzRGg4RWdCUHdQaFRUeVBCNVBuZG5WN0ZFdnYvZVo4eGg3Tjk3Q0tNU0NHZkFGc0pSaDZiblRHcll6cTVQWHVzV1oyQ0dJZlBkNElGL3IzaGtkVzR0a2Q0UG43cmtZR2JxSExlRU84QzZ6QllFMm5FVFpPZ1RqcVJRVHNJQ1hlSzJlZWNkc2M2eExhdVUxV3JCWml0T2dQYmEyMU9GL1NRenZHM1ZreGd1WHRHQjVXZHB5Q2RWdjd1V0NZVFV5THNlQzRIV0ZydFlNdEtkQW9RaXNRSjYrTnpOQ3ZZOFp5Ukt3NDh4UUNoYThnY09LTlpWQ3VLZ2s4cGZYekNRRlhLcnZBNUU5OE8yZXpqQjZyOXZpamY1VE4vRytLMU9QeTZPOG9TVW5JN0dyOURlN0Y4SStEc25tV2o5VDJmeHlpTEhJb0ZnSSs2OEo1NzRTeE8zYTdMNThQNGJKMEEvcjNxcFNSQi9FenhlUnFSZlFJVHhoaUFWcGpGbUQ3Y2JKdTI5Umpma3Ywelh1MDdCeCtPNXhDK2ZXNVdQdW1vZWNvWUVWOEFjcnYyUExOTWtHZndSVlpLVU1TSnN5VWlIakhHMTltSHFUdSszeDZUSHM2elNhQmV3SWZEK29vUGRBNzJISCtWdXh6V0o5bXBCdXQzakh5MnJRekYzQ3JvYW1JZm1MdWRNTUNOUWRSc3IvQTVqNXMzdzJCWnZldk1BU2svbGNTT0xEelBKNFdPTCtOR3NSbHlxRHpmWGoyMUR6NDJPUHRvaWNma2NiU21mSjJ6MjR1bEhvN0U1aXFRaWhha1R4K1RHcERlTXoxQzJVZjR6QjMxNWZOVUxQVzUyK05qcVo5NysxeW5ZQkhVNHlOVG5UUnpwamVpYzMwR2VmbDV4dGdwSC9MSkFzUVk0N3dkYVdDVkE0SldjVFRwTU4zdHdUVC9zbXU3VjgrKytDN3JBRGtFOXg3SENWaHc4bnBnN0lPcEhYWG84eHA5cU9PcC92Rmh5TDRZazM3VTA5RkJremJIM2FnREJ4dXdXdDI0T2thMU5XQWxqMElSRkQ2emFaWUdlWHJpT2NDM1dKL2xyY3VXdSs4ODdheWZydjdoZ2FYajhweStWeUptZDVxSEljMldyampNd0dNZ0tCZlUyTm84eStVcjB2aStjVnVqOCtWNGcyMEJrMCtzdzRZOWh1WENpVUdPVFhmcUdwVFpKeUY1K2o1Zm43c21mOXYyNHpxeC93VDR1dXBWUEhJZ05IZ1c1SUZ1UDdNOXZvUkxmZFZIRDhHSUFmZnNBY1I5R3ZlVEQwQWJCZG1IQTN5UGVlRVhMZEtHbTRyN29aN1BYRWY4QkNKdm5ScXY5eG1OVnQxR0h3NTlocDFqSDhSdEsxVXNpMkZsZllidERENnB3bno3emhIRWM1enpycWRRREJhbWhTenA1NW56WmFzWnZvRTVMZ25rNFpUSnMxdmxmRW5UY1h6ejFKZEVINXhta2lEeUJxOUQ4ckZqYkljRmwvTE94ZldiZzdRbXloSFdEd1NCejc0L2JxZjduR09zNnZVMHdRZk5BUm5Pckx0dDVhaHE2L2M4eFdQZU9UbmNzMFdUZkZZcjNSNHBwek9nVHp6QlJ5NnJuQUNFODh5MEp3MldNcW1uaStOOWJhYXhlOENHZm9tQ3d3THMvZmc4ZXpZVlBCeGtyaXRhZ1dDVGdnY3pQVHZFMzRkdUpwK2ltQjJ3ZFNyMVgydlpBRUZqNkRlQXpXS2F4SWR3UHpBM3Uza2lvdU02RDFKS1g1cWVmTXRLdWRKbGhwdG8ySDFNd1p1ZHR3WEVxdWVjOHd1YXNXT0FyR08rNjdRamkrVytQaDkvKzRxVEZpVzBEaUI2U05LRzAvaHR6MFc0d3BpMlJsODN1NUVTOGdQZHlmWjRQb2lSR2J2aVpibWxOWWFXZkZvbGlMQllwalNmZDNZRjRPdUVGTHVYMXZESnUydlk4dTJENnQvMlpXUUlkdTVVbTN3VkM5VzZjK1J0OGJQWkdtZGp5WjNZeEJyYk1YdGI3dm42Q0hFY3cvUDU2cEFWYktsWk9rQzQ1SXJTOVZrTWRkdVVaOE5Fc04za3RrTjN3YmJsN0dCcFF3QzJuZzArbm9vNDhqaWFyOGRqN0xVQVp2OFBQUGZ2RWE2TzBVNEFBQUdEYVVORFVFbERReUJ3Y205bWFXeGxBQUI0bkgyUlBVakRRQnpGWDFPbG9oVUZPNGc0WktoT0ZrUkZITFVLUmFnUWFvVldIVXd1L1lJbURVbUtpNlBnV25Ed1k3SHE0T0tzcTRPcklBaCtnRGc1T2ltNlNJbi9Td290WWp3NDdzZTdlNCs3ZDRCUUx6UE42aGdITk4wMlU0bTRtTW11aXFGWGhDQ2dIejBJeU13eTVpUXBDZC94ZFk4QVgrOWlQTXYvM0oralY4MVpEQWlJeExQTU1HM2lEZUxwVGR2Z3ZFOGNZVVZaSlQ0bkhqUHBnc1NQWEZjOGZ1TmNjRm5nbVJFem5ab25qaENMaFRaVzJwZ1ZUWTE0aWppcWFqcmxDeG1QVmM1Ym5MVnlsVFh2eVY4WXp1a3J5MXluT1l3RUZyRUVDU0lVVkZGQ0dUWml0T3FrV0VqUmZ0ekhQK1Q2SlhJcDVDcUJrV01CRldpUVhULzRIL3p1MXNwUFRuaEo0VGpRK2VJNEh5TkFhQmRvMUJ6bis5aHhHaWRBOEJtNDBsditTaDJZK1NTOTF0S2lSMERmTm5CeDNkS1VQZUJ5QnhoOE1tUlRkcVVnVFNHZkI5N1A2SnV5d01BdDBMM205ZGJjeCtrRGtLYXVramZBd1NFd1dxRHNkWjkzZDdYMzl1K1pabjgveHJ0eVl2RFJmRzhBQUFBR1lrdEhSQUQvQVA4QS82QzlwNU1BQUFBSmNFaFpjd0FBQ3hNQUFBc1RBUUNhbkJnQUFBQUhkRWxOUlFma0J3SVJFZytzaDBPcUFBQWdBRWxFUVZSNDJ1eGRkM2dVMWQ1K3oyekxwdmVFa0lSaUNDMFFhZ2hkT3FHSU5CRkVVY0VHSW9JRnBQaGh1VjdBY20zWDNwQXJLZ29pSUNBaXZZbDBFa3BDU085bGU1dlptZlA5c1R2RDdHWkRVVVRVL1QzUFBKdmR6Y3llT1hQbW5mZlhDYVVVZnZudFlyUFpVRjVlanVycWF0VFcxa0tuMDBHdjE4TmtNc0ZzTnNOaXNjQm1zOEZtczhIaGNNRGhjSUJsV2JBc0M0N2p3SEVjbkU2bnRQRThMNzN5UEE5QkVPUi9FMEVRSU44b3BlSXJvWlJDM0FBUTcxY0FvSlFTOTlDbFY2L1BTRjVlWGx4VVZGUVRqVVlUcDFBbzRoaUdpV0VZSm9vUUVna2dBa0FvSVNRVVFCQ0FRQUJhQUdyM3BnREF1SThuQU9BQnNPN05Cc0FLd0VJcE5RSXdVa3IxbE5KNlNta2R6L08xSE1kVjJlMzI2b3FLaW9yMDlQUnE5M0dvYkd2d25oRGkvWjM0R1FCUVFraURWOWxHR1lZQklRUU13MEFRQktqVmFqQU1BNFpocUVLaGdFS2hBTU13RVA5V0twWFNxN2lwVkNxb1ZDcW8xV3FvMVdwb05CcG9OQnBvdFZwb3RWb0VCUVVoT0RnWUlTRWhDQThQUjBSRUJLS2pveEViRzR1RWhBUm90VnIvelhRZGhmaUI3YmNKeTdJb0x5OUhaV1VsYW10clVWOWZENzFlRDZQUktBR2ExV3FGM1c2SDNXNi9JcURKd1V5K0NZSkFSSUR6QWpNUElCUEJTUTVTM29BbGYxOWRYWjBhSEJ5Y29sUXFiMkVZcGlVaHBEa2hwQm1BWmdBQ2JwSnB0Z01vcHBRV0NZSlF5UE44QWN1eUYzVTZYWDZ6WnMwdWVBRWN2UXpnTlFCQUVmZ0lJUjVBUnltbFNxVlNCRFlKME9RZ0o5L2s0TllZd0FVRUJDQWdJQUNCZ1lFU3dJV0doaUk4UEJ5UmtaR0lqbzVHZkh3OEVoSVNvRmFyL1RlWEg5aitIQ2twS1VGbFpTVnFhbXBRVjFjSG5VNEhvOUVJazhra0Fack5acnNzb0hFY0o3RXpiMUR6QldZaUt4T0JUYngyUG9ETTQzMWVYbDVzUWtKQ0I1VksxVUdoVUxRbmhMUUgwQmFBNXE5OERYaWVkNVNXbHA1TlNrbzY0M1E2ejloc3RwemMzTnljSGoxNjFMcVpvaHpVQkRkVDgyQjIza0FuQXBzSWFDS2J1eExJaWFDbVVDaWdVcWt1QzNCYXJWWUN1SkNRRUlTR2hpSWlJZ0pSVVZHSWlZbEJmSHc4a3BLUy9EZVpIOWh1bkZSVlZUVlFPdzBHZzZSMnlnSE5icmMzQUxRcnNEUWlxcDFlZ0VZYVlXVU5HTm5FaVJNVkgzMzBVZmVBZ0lCdUNvV2lLeUdrQzREVXYrTzE0SGtlcGFXbGFOYXNtZmRYZVlJZ0hPTTQ3cmpSYUR4Mnh4MTNITnU5ZTdjZ0F6c0o5QWdoZ2plamN3TmJBemJITUF6MUFYQlFLQlQwU3V4TkRuQWlleE1CVGxSUHc4TENHcWluY1hGeC9wdk9EMngvbkJnTUJwU1ZsVWtzelpmYTZjdU94bkVjV0phVkdKb1BPeHFSMjlGOE1EUGl3MTRtc2pMeXhCTlBLSll1WGRwSG85SDBaQmltRnlHa0o0RGdmOEkxdVF5d2VZdVpVbnJJNlhRZU1wbE1oMmZPbkhsb3pabzFUaDlBSjRqQTVnWTA2c011UjcyWm5KZjlqWHJiMzBRR3AxYXJKWUJyelA0bVYwOUY5dGEwYVZPRWhZWDViMEkvc0YwLzRUZ09KU1VsSGl4TnI5ZExMTzFxN0dpK25BTWlvSG14TTBuTmxERXl5SUdNVXNyVTE5ZTNDdzRPdmxXaFVQUWpoUFFIOEk5YzlkY0FiQTJlVTRJZzdPVTRibDlWVmRXKzVzMmJuM09EV3dOV0oyZDBJbnVUL3kwNkdPUWdKd0pjWTg2Rks5bmZSUFlXSGg3dXdkNlNrcEtnVXFuOE42VWYySDZmVkZaV29yUzB0SUZ6UUs1MmlxQW1zalNSb1YwdG9QRThMNm1aZ2lBMENtWldxM1dBV3EwZXpERE1ZQUFkL0ZmbmR3R2J0MlE3bmM0ZFJxTnhWM1IwOUQ2NHZMaUNOOWcxQm5JTXcwanFxa0tob0ZjTGNDS0RFOW1iQ0c1eTlkVGJ1WkNZbUlqNCtIai94ZmNEMjdXTHhXSkJjWEV4eXN2TFVWVlY1ZE01Y0tYd0RTKzFrM2c1QnVUc2pIZ3hOQW5NYkRaYmxscXR6aUtFWkFGbzZyOHlOMFRLZUo3LzBXUXliWStNak55T1MrRXFQa0ZPcHE1NnFLb2lpL1B5b05JcnNUZHY5ZFRidVJBWEY0ZUVoQVFrSnljaktDaklmN1g4d0haMVVsSlNJckUwdVMzTmwzUEEyNWJtZzZWZENkQ0l0ODNNWXJFTTFHZzB0eEZDUnZuQjdLWUF1UzE2dlg1TFRFeU15T1E4UU02YnhjbEFybEdBVXlxVmpRS2NuTDE1T3hlOGJXK0ppWWwrNzZrZjJDNHZKcE1KUlVWRktDc3I4MkJwQm9QQkl5YnRLb05zaWFoNml1cm1aZGdabzlQcDBvS0RnOGN5REhNN2dIYitKWGxUeWxtV1pUZVdsNWR2YnRteTVSa1p3UEV5a0tPeTF3WXNUcTZtdW9HTlhrMXdyenoyVGZTY2l1eXRhZE9tYU5hc0dVSkNRdnhYeUE5c0RWbWE2Q0R3NWZGc0xJUkRCRFZmZ0NiUEVwQURtZ2htbXpadENoZzhlUEJFcFZJNWdSQXl6TDhNL3pvaUNNSTJxOVc2NGEyMzN0cTRhTkVpR3dDbkhPUmtMRTRRMlp1M211b1ZIdUlCY0NLNE5SWWE0dTA1RlIwTGZ2Ym1CellBZ05WcVJVRkJRUU1IZ2NqU3pHYXpaRXU3UXViQTVRQ055TlZPdlY3ZklTZ29hQkxETUpNQStGZmlYL3laeUhIYzJwS1NrdlVwS1Nsblphb3E3NjJxeWdDT1hnbmdMaGZZcTlWcUVSd2NMTEUzYjhkQ2l4WXRFQmdZNkw4eS8xUmdxNmlva0ZUUDZ1cHFEd2ZCbGVMU1pLRG1FOURjQWJVZTZxYlZhczFTcTlXVENTRVQvVXZ1YjhuaTF1bjErclhSMGRFNzNBeE9EbkM4THpWVkZpYlNBT0FhczczNWluc1RWZFBZMkZoSk5XM1NwTWsvL3Bvby8wa255L004OHZQelVWeGNqSXFLQ2lrbHltQXd3R2cwd21LeFNLRG1jRGg4WmcrSWdDYXpvL2tFdEx2dnZsdngwVWNmM2ExVUt1OEcwTWQvKy85OWhXR1ljWkdSa2VONG50OXZzVmkrSGp4NDhOckRodzg3UlpDamxEYndyUEk4VHdWQm9HTGlQYy96VkI0UzVIUTZxVHhjU05RUTVLWVE4YUVyUG9TdFZpdk1aak5NSmhOdXVlVVdLQlNLZnk1akt5d3MvRWVjcU5GbzlBbG9vc2RUcm5aZXpvN21TK1dVc1RPeWFkT21rTmF0VzkrclVDaW13Ujl6OW84VVNtbTJ3K0g0Y3YzNjlXc1dMRmhnSklUd01pYlhRRTJWc1RodkJuZForNXRjUFJVRGU4V2MweVpObWlBNU9SbWhvYUgvVEdEak9PNXZmNUpsWldVb0xDeVV2SjVpQm9HMzZ0bFlHSWVYMmtsa2FVOFNxR1ZuWjBlMGJObnlmb1ZDY1QrQUZQL3Q3UmNBK1hhN2ZkV21UWnUrbmpKbGlzNUxUZVhkNENhcHFPNWdYeXJQUWZWV1QzMkZoWGluWkVWSFIwdGUwK2JObTZOcDAzOWU1TkRmMnNaR0tVVnViaTZLaW9xa2dOdkxlVDI5TXdnYVVUdEZMeWRES1NVblQ1NE1iZHUyN1F5RlFqRUR3QzMrZTlrdlB1U2l6V2I3L0t1dnZ2cHkrdlRwaHNzQkhDRkVrQ1hkZTJjdVVGOFpDNDE1VGNXQTNtYk5taUUxTlJYdWJBay9zUDJWeFdReTRjS0ZDNUw2V1YxZExYazk1UUczamVSNUV1OVVLQzlQSjdOa3lSTEZraVZMSGxRb0ZBL0NIMy9tbDZ0NzBKNjFXcTByNzdqamp0VmJ0bXhoM1FBbnFhZ3lnQlBrSGxUdjFDeVZTa1VieXplVnE2V1JrWkdJalkyVjFOS1VsSlIvVE16YjN4TFlxcXFxa0orZmo1S1NFbFJVVkRRSTVmQk9YcGZiMUx4WW1vZGpRUFJ5MnUzMk8xVXExU01BZXZodlY3LzhCb0E3YkRRYVB3c1BEOTlJQ09HOEFNNmJ3VkZaQmdQMVptL2VNVy9lQWIxaVNFaVRKazJRbEpTRVcyNjU1UjlSRHVsdjV4VXRMQ3pFeFlzWFBlTFQ1TG1lM3NucmNwWW1PZ3JrYXFmTWpzWllyZGFCYXJWNnBqdmx5UzkrK1cxc2dwQ01zTEN3REo3blIxVlhWMy9XcEVtVEEzS0E4L2FpOGp4UDNRSkJFS2hYL1Q3eFBYeDVVVVd6aXVoRnRkdnRzTmxzYU42OHVSL1kvaXIydFBQbnorUGl4WXVOT2drdVU5bTJBVXVUcTUzMTlmV3BvYUdoc3dnaEQvdHZTNzljTDJFWVprUjhmUHdJbG1VL3lzbkorYnh6NTg3NU1vQVR3MFI0QUlJZ0NJTFkzOEs5VVRGbFR3NXUzaUFuT3NDOHdjMXV0Nk4xNjlaL1c3dmIzd0xZYkRZYnpwOC83K0g1bE1lbk5XWlA4MlpwYmxDVDFNNTc3NzFYOGNFSEg4eFdLQlNQQVVqMDM0cCsrU05FcFZMTjZOU3BVNWJGWW5tL2I5KytueDgvZnB3RndMblpHeU9xcUpSU3FSaW0yNEZGNWNVVnZBSE91MXF6SE9CWWxwWEE3ZS9ZU09ZdkQydzZuUTY1dWJrb0xDeVVDa0xLcTNMNEtnYnBmb3JKUVUzTzBoaEtLYkZhclVNMUdzM2pBQWI1YnoyLzNBQnBHaGdZK1B5dnYvNDZvTHE2K3FNbVRacnNKWVN3TXZXVTRGSk9LdlZpY0hLQW83NmFBdmxTVDhVb2dOVFVWRVJFUlBpQjdXYVJxcW9xajNBT01ZbmRWNFZiV1NnSEVlbTVENWJHbEphV3hzZkZ4VDNPTU14Yy83M21sejlCUFIwUUh4OC93T0Z3L0hmSGpoMmZabVZsVmJyVlUwWU9jSzRLNWtSb2pMM0pWRlZjalpxYW1wcjZ0M0lxL0dXQnJhU2tCSGw1ZVNncUtwTENPZVROVlh3NUNieFpHcy96Y3BiRzJPMzJDU3FWYW03cHVlTmR5eDNCeUVodmRWT2RjMzE5UFdwcmE1R2FtdXBIZ0wrQTZQVjZiTnEwQ1E2SEE0TUdEYm9tZzcxYXJaNDFiTml3WG5WMWRlOUhSVVZ0SVlRbzNPb3BKN085RWJuOVRRNXdMTXNTbG1VYnRiMTVNemlPNDFCVFV3T3oyUXdBaUlpSVFPdldyWDgzOFNnb0tBQUF4TWZIWDlYNVYxUlV3T0Z3L0c3bkJ0UG9ONndlbnl4N0VvUDdaeUlqc3o4ZVdmZ3F5a3pPbTJMQjVPZm40OHlaTXg1eGFwZlltZzdGRjg3ZzJKRmZrWjJkZzhMaU1saHNkamdjRGlJQ25EczFpZ2lDd0FpQ29LaXNyRXgyT3AydnFWU3Evd0hvdXZvLzgzRFB3bmR1aW5NOWZQZ3czbnp6VFFEQWtTTkg4TnByci8ycFkvZzl3bkVjQmcwYUJJUEI4S2VONFhyTDJiTm5ZYmZiRzN6dWREb3hZY0lFRkJVVklUQXdFRmFyOVpxUFRRanBIQmtaK1I3THNvdDM3TmpSakZJYVFDblZ3TldZV2tVcFZWQktGWUlnS0FSQllIaWVKMDZuazdBc0M1UEpCS1BSU0VRdnFEeVAxR0F3U0ZXaUt5b3FVRnhjakFzWEx1RFFvVVA0K09PUDhmYmJiLy9tZGZiU1N5L2h6Smt6QUlDQ2dnS3NXN2NPSzFhc3dLcFZxNjVxUFd6WnNzWG4vMTdyZW1nVTJMWjk4Q3hlL0hRM1JrNS9CdiszNEQ3ay9mZ2VIbm4yNHo5OUlaMDdkdzVuejU1RmZuNitSN1Zia2ExVkZlY2h2NlFheXNCUWhBUUhnSE5ZU0gyOW5vaU16YzNVaUNBSUlrc2JGeDBkL1JVaFpPYk4rTlQvOHNzdmtaR1I4YmNZZzBxbHd2dnZ2LytidWk3ZERQUGdTK2JNbVlPU2twSUduK2ZsNVlFUWdrV0xGbUh5NU1sbzE2N2Q3NW0zQi9yMzcvL2ZFeWRPWkFIUXd0VVRWZ1EzcFJ2Z0dCSGMzTDAwQ00vemNEZ2N4RzYzRXhIY0xCWUxUQ1lUVHA0OGlZS0NBdFRVMUVqOVBWaVd4Wmd4WXpCdzRNRGZORTZUeVlUZHUzZWpUWnMyQUlETXpFeXNXTEVDdDkxMjJ3MWZENDBDVzFGUkVVaEVjMHlaTkFZamI3OFhMeTkvRWNPNkpNRUpRRjk0RkhQdm40Q01qRXpjTnZraDdENVhCUUE0dXY1TkRNKzZGM2syQUhEaXhZZEc0dUZsWDdwNStVbE15aHFPZDcvWWlEbFRiMGRtUmlZKzIxM29ZbUNIdnNjOTQ0WWlJNk1YcGo3NkhQSnJIU0p0eE5aUGxtUDBnTDdJN0RzWUR5NTRCYWZQblVOQlFZSFVEcys3SjBGRmVUWEFxQkFhRkFDVldrdlVTZ1dvNEhTQm10TkpPSTVsbkU0bjAyUEFpUEJ2OXAxNVFhVlNmUW1nMjRGdjM4VHcvcjB3OExaN2NMalFKS2V1SG1OWTh1WWFPRzdRVFdNMEduSDI3Rm4wNkhFcER0aHF0V0xldkhubzM3OC9IbnZzTVRnY3J0R1l6V1k4OWRSVEdEcDBLQ1pObW9SVHAwNEJBTDc0NGdzOCt1aWpHREJnQUJZdlhveXNyQ3pNbVROSGJMcU10V3ZYWXVUSWtjakt5dkw1cFBRMWhsOSsrUVhqeDQvSDRNR0RzV1RKRXRoc05nQkFiVzB0WnMrZWpheXNMSXdmUHg2Ly9QS0x0TTlkZDkyRmtTTkhZczZjT1pLNkk4cW5uMzZLNGNPSFk4aVFJWGp0dGRmZ0hUVHVQWWJ2di84ZTc3MzNudlQ5NmRPbnNXREJBb2twTFZ1MkRFT0hEc1hZc1dPbE1aak5aa3lmUGgydnYvNDZoZ3daZ29rVEo2S29xQWdBOE1JTEwyRC8vdjNTOFZhdlhvM1ZxMWRmOXRyczJiTUhFeWRPUkdscEtlYk9uWXVKRXlkaTU4NmRBSUNubjM0YVR6enhCQ29xS2pCeDRrUk1uRGdSTE10ZTluanIxNi9INjYrL2poa3pacUJmdjM1WXVuU3BOQS9MbHkvSHFGR2p1aXhjdVBDRFhidDJ6ZjN3d3crakthVUJBRFNVVWhXbFZDa0lncExuZVViYzNNQkdEQVlEYW10clVWdGJTMncyRzNRNkhVNmZQZzJqMFlqczdHeHMyN1lOUjQ4ZVJXVmxKY3JLeWxCUVVJRGk0bUxVMWRWSnY1K1hsNGQ3N3JrSGdpQkk0NTA5ZXphT0hqM3FjUTRiTjI3RXFGR2p3RERNRmRmMjVkYkR1WFBuTUdIQ0JBd1lNQUNmZnZycEZkZmtoUXNYTUhQbVREend3QVBvMzc4L0ZpNWNDTWgwYzQrdDhzUUc5R2pmRXAxNmpjRFNWOTdCNlJMWGlWTGVnRmtqT3FIN3NHbjRidE42ekpwd0sxcjNtSUFTTzhXdWorZWpSWXMrT0dtbW9KVERJNE5TTUd6Mlc2NzlxdmVoUzRzV2FObTZFMmJNbTQ5Rjg1L0Uzbnd6K0xvVEdOQytKVVkvK0N3MnJGK04wVDNiWXRUanJuMU9yRnVHbGkzYVl2N3JLL0hLMGpsSWlvbEMxclFuTUgvK2ZFeWZQaDNqeG8zRDRNR0RrWm1aaVk0ZE95STFOUlVhQlFGUmFoQVpHVWxDUWtLSVZxc2xhcldhVVNxVkN1S3lLYXBYcmZsMjhPSUhSLy9Zc20wZmVxeWFvNDdTUGJSclNnczY5cUdsZFAzYWxYUll0MVRhZXNUamxGSktUNnhiUmx1MmFFdWZlZXQvZE8ybksyaW5sSlowMmJvVDlFYklxbFdyNk50dnZ5MjkvL0hISDJuLy92MXBXVmtaZFRnYzlNNDc3NlJyMTY2bGxGSzZZTUVDK3E5Ly9Zc0tna0FQSHo1TWUvVG9RYTFXSzMzOTlkZnBmLzd6SDNya3lCRTZkT2hReW5FYzdkV3JGNjJ0cmFVSER4NmtJMGVPcEhxOW51cjFlanBreUJCNjh1VEp5NDVCcDlQUjd0MjcwN05uejFLZTUrbkNoUXZwRzIrOFFTbWw5UDMzMzZlZmYvNDVwWlRTUTRjTzBYNzkra243bVV3bWFqUWFhWHA2T2pVWUROTG41OCtmcC8zNjlhTVdpNFZhTEJZNlpjb1Urc3N2djF4MkREVTFOYlIzNzk2VTR6aEtLYVZMbGl5aGE5YXNvWlJTK3ZycnI5T25uMzZhT3AxT2V2YnNXWnFabVVudGRqczFHQXcwSlNXRkhqaHdnRkpLNllvVksrajgrZk9sZVowNWM2WjAvR0hEaHRIQ3dzS3J1a1pEaGd5aHVibTVEVDQvY2VJRUhUTm16RlZmNjQ4Ly9wamVkdHR0VktmVFViUFpUQWNPSEVoLy9mVlhTaW1sTnB1TkdvMUdPbVBHRFByamp6OVNudWQvS2l3c25BQ2dHWUFtQUtJSUlXRUFnZ0FFTUF5akpvUW9DU0VLdFZyTkJBUUVFQUFrTEN5TXhNZkhJems1R1FFQkFXamV2RGt5TXpNeGVQQmdqQnMzRHRPblQ4ZjgrZlB4MEVNUFllREFnVGgrL0RoWWxnV2xGR1BHak1IT25UdEJLY1c1YytmUXQyOWZPSjFPRDh3WU4yNGN5c3JLR21ESnA1OStpdWVmZjk3ak03ZXFqUFQwZEJnTUJ1bnpqei8rR0dQSGpvWFpiRVpWVlJVeU16T1JuWjN0c2UrcVZhdnc5dHR2Uys5UG56Nk5ybDI3b3F5c0RGYXJGUk1uVG15Y3NjV2xqOGJXcmQvanZxd08yUC9OZXhnemVBZysrZmtjaE9JRDJISFdnSWtQUG8zYlI0N0Jvc2Z1Qmx0OUZMdFAxbDhWQ3huMTZISjgrT295dkxqc1pmUnBHWVNDZzd0UmFHVXdmZDRpakI0ekdXKzgrd0ZtanV2dGVnSjh2d0UwTEFGOHhSbmtGQmtRb0hEaTlQR2pVcHlhZDBpSHpXWURUeWtnOEI2cXA4dnJLVEFVVU14K1k5UERVeWVPWDdsay9zeWhHbnNadHUzT1JmNnZoMURQQitEQnA1L0JtSEgzWUdDWGhFdFBvZTgzQUJGSlNGQVlVV1VMUkdJRWcxMjc5dDBReHJaMjdWcU1HemZPNDdNMmJkb2dJU0VCYXJVYTNicDFRMFZGQlFEZ3A1OSt3b3daTTBBSVFmZnUzWkdjbkl3VEowNEFnRlIxTlNRa0JFcWxFa0ZCUVdCWkZwczNiMGFUSmsyd2R1MWFyRjI3RmpFeE1UaDA2TkJseDNENDhHRjA2TkFCYmRxMEFjTXdXTEJnQWNhUEh3OEFtREZqQmhJU0V2RDIyMjlqNTg2ZHFLbXBrZllUZjk4N0lEUXVMZzRxbFFydnZQTU9UcDgralpVclZ6WlFNYnpIRUIwZGpTNWR1bUQzN3QxZ1dSYTdkKy9HcUZHdVpKQWZmdmdCSVNFaFdMbHlKUTRjT0FDR1lYRCsvSGxwREQxNzlnUUFaR1Jrb0tyS3BXa01IRGdRT1RrNTBPbDBPSG55Sk9MaTRxNUhXNzlybHU3ZHV5TThQQnhCUVVGbzM3NDlLaXNyQVFBQkFRRUlDUW1SNnFzeERETzRXYk5tYjN6enpUZFQzS3BwZ0tpYUFoQlZVd1VBUnN5ZUlZUVF0eU9OMk8xMjhEd1B1OTB1cWFaNnZSNTFkWFZTWUx2UmFFUnViaTVPblRvRnU5Mk9HVE5tNFBQUFB3Y0FmUFhWVjdqbm5uczg2cjNsNXVZaUpDUUVDUWtKVjNXdWphMEhBT2pjdVRPQ2dvSVFHeHVMWWNPR2VURC94dTZMaElRRUpDUWtRS3ZWNHE2Nzdtb00yRmhzVy9NWjloY3llR3p4TW16YnN4ZTNkMURobGRmZWQzbFFBR2cwcnVhdEt2Y3J4L0x1ZlFYSUdHc0RDZmVLbDJFNUJ3QUZOQnFYZzdaRmVoOWs5ZTNzb3B3bUN6aWJIaGZPbjBkaFlSSENrMUlSRzZLOFhQY29Ra0VJcFlKVU84M3A1QmllNTVuaXZPMEp2VnEyZUMxQXEzMERRSUpTbzRZQ0FNZXo0Snc4QUFXVW1vWk9ZcnZORGlYRG82YXlFcFdWMWVpU05RVlp2ZHJlRUZ0aWVIajRaYXVoTWd3anFRc2N4MEdqMFVqZmFiWGFLNm8vTnBzTm9hR2gwaloyN0ZqMDZkUG5zbVBnT0E1cXRWcDZIeElTSXBYRmVlMjExN0IrL1hyMDZORURJMGFNdUtyekRBc0x3OGFORzVHYW1vcHZ2dmtHdzRZTlExbFoyUlhuWWVyVXFmajIyMit4ZmZ0MkRCbzBTQW95dGRsc2lJeU1sTTVwN3R5NVB1ZFFQbmRLcFJMang0L0g5OTkvajNYcjF1R3V1Kzc2MDIxM2hCQmNJWTg3UWExV3Z6Uno1c3huTm0zYWxDaXFwaktBRTRHTmNkdVRJUWdDY1FmbkVrRVFpTVBoOEhBcTZQVjY2ZDZ5V0N3b0xDeVV3SzF2Mzc3SXo4L0h1WFBuc0czYk5reWFOTWxqTUd2V3JNR0VDUk91K3p5bzFXcklTNnRkelgyaDBXZ2FBellsanYrNEVrOHRlQlo3VCthanRMUVFlclByeGxFMDY0Wk8wU3I4c081L0tDd3R4YW92TndDQkxkR3RZd3ppWStJQTFPR1hnOW5JUDdrTEY2cjVLdzY4WlpjTVJDaFliUHBtSGNwSzgvRFl1RXowdnVkRm1Fd21ORW0rQlpiYUtnaWg4YmlsWlRNb0JSWUJha1dET0RWM3hWdkNzaXdVaEFCVUlDekxFWjduR1VHZ3pOQ0hYKzNYcEhubWg1bnR3MmJ1MnJnRzU0cEw4ZTJxTmJDUUVHUjBhWTFiT25SRUlDeFl2Mm9kQ3M4ZnhjbThPbWw4ZlhyM0JLZlhJU0VqQ3c4L09BMXQ0c09Ra2RIbEQxL1lhOWFzd1IxMzNIRk5UL3N0VzdaSWJ2YnM3R3gwN05qeGl2dFVWVlZoekpneG1EQmhBbHEzYnUyeFlIeU5vWFBuempoNjlDajBlcjMwUHg5ODhJSGt0UjAzYmh5NmQrOHVxUWxYa2wyN2R1SGxsMS9HYmJmZGhsZGVlUVZ0MjdiRndZTUhyemdQM2J0M1IybHBLVmF1WElrcFU2WkluMmRrWklCbFdVeVlNQUVUSmt4QVFrTENWUVdmVHBvMENldlhyOGZodzRldnlYaXUxV3BSVjFmM3A0QmZlbm82amg0OU9xTlhyMTR2RlJRVTlQRGxXQUNnRUFTQkVkbWI2RFdsbE1LWFUwSE0xckhaYkZJSi9ieThQSnc5ZXhhVEprM0NvNDgraXFGRGgzcFVDZUU0RHJ0MjdjTFFvVU92eTNrVkZoYUNVZ3FIdzRIZHUzZWpRNGNPVjF3UE9wMU9zamYvOU5OUGpjV3hNWGpzcGYraWV2NUN6QmczQkJ3Rm9sdDJ3Y3N2ejRGUzNRVExYdjhYWnM1N0hnUDdyWUk2ckNtZWVlVnRwSVVDR0h3blJxVjlnK1VQMzRaUFcvZERpNlpoMEYzaEpEVEovZkhLMGdmeDFMOFhvZSs3SEtLYWQ4VnpDNmZnOU9uVGlPNDRCSm10TCtEbmJ6NEQ2K1NoMElhZ1pZb0dBWEI2eDZoSjhXbFFLQWdSQkNJSVBBSEFESjc0eU5UWC8rL2had2pScGl4NCtYVVVQVElQSTI3dEIwVkFCTzViK2hxR3R0SUNHSW9sRHc3QnN4OCtqUjlYeDZKOXdxV3FvOE1mZmg2UGx6NkJOeDZmZ3VVOEVOMnFLMTdxUHhsQStCKzJZRm1XeFo0OWV5U0QrTlhJMHFWTE1YUG1UR3phdEFrVkZSVll1blRwRlcvbzhlUEg0L1RwMDhqS3lrSk1UQXdVQ29YazVtOXNEQWtKQ1pnN2R5NG1USmlBbUpnWUFKRGM3ak5tek1EQ2hRc1JHeHVMMk5oWUNJSUFnOEdBc0xBd2pCczNEdlgxOVRDWlRCZzFhaFNDZ29Ld1pjc1daR1ptWXZYcTFSZ3pab3pyd2FsUVNEZkk1ZWFCRUlLSkV5ZGl5NVl0U0VtNVZOZHo0Y0tGZVBUUlJ6RjI3RmhRU3RHdVhidXI4cWFLUFFOYXRXb0ZwZkxxd3p1blRwMktPWFBtb0huejVoZzllalNtVHAxNjNkZkQ4ODgvangwN2RxQzJ0aGJIamgzRFN5KzloUGZmZngrdFc3ZkcxS2xUTVdyVXFJRnhjWEhOQmcwYTlOYlBQLys4MFoyR0phL3N6QU1BcFZSd3gyNUNvVkJRa1JDbzFXb2FIeDhQczltTVU2ZE9TV3p4czg4K1EvdjI3VEZ5NUVnSWdvQTJiZHFndUxnWTk5NTdyOGY0ZnY3NVovVHQyOWVEeVFQQWhnMGI4TnBycjhGa01zSHBkT0xubjMvR0k0ODhna21USmpXNkhrU1FHanQyTFBSNlBYcjA2Q0daRHk2M0hod09CKzY5OTE0cDlPYUtaWXRZaHdsV0I0UHdVSy9PMDRJVDlYbzlna09qb2ZaWUJ3TDA5WG9FUjBaZVUvU3Z3RHFnTjlzQUJqaWJrK01SemxGZFhZWGFlaDBjTmx1RGJBSTVxTW15Q0pocGQwOVZMUC9QZnhkRWh3Y3Rna2Nnc210ODJ1QndhTlNlaE5WbTBRUEtZR2g5cUtTc3d3S2pqVWQwK0I5ZmF2bnMyYk00Y3VRSTdyNzc3bXZldDY2dURxR2hvVkNwVkZlOWo4MW1BOGR4SG1Xa3J6UUdsbVZoTnBzUkdSblpZSUhaYkRhRWgxOGI4SnRNSmhCQ0VCd2NmRjNtd1dBd1FLMVcvKzQ4eUNsVHBqU0l1OXU0Y2FPSDUwL3NrWEdsY3k0dUxzWWpqenppOFZuNzl1MnhZc1dLM3p5K21wb2FhTFZhTUF5RGYvM3JYODdFeE1UWDNudnZ2WTlPblRwbGQ2ZGtjZTdONmE3ekpoQkNCSGtoUzQxR0E3VmFUY1hhYm1McEk3Rm9aVlJVRk9MajQyRTBHcEdUazROVnExWjVuT3VubjM2S1BuMzZvRldyNnhmUUxpYnJ5ME5CR2xzUDJkblpXTGh3SWI3Nzdqdm85WHBFUmtiZVhQWFlkRG9kY3J4QVRYUVNpTTFXNU4yalpLQW1yNXZHVkZaV0prVkZSVDFEQ0prQnYvamxieXFDSU9EdXUrOUcwNlpOd2ZNOFRwMDZoYSsvL2hvaElTRXJkK3pZOGVIdzRjTkxDU0VPTDNEanZjQk5LajB1Z3B1OEc1WUlicVdscFNnb0tNQ3NXYlBRcDA4ZnRHL2YvcWJKTHhXQmJjT0dEWmNZL2MwQ2JISlFLeWtwOFFBMWVjTVZIMHhOVEkxaUJFRWdKcE9wbTFhclhlaXZtZWFYZndxNFpXZG53MjYzSXowOVhYSWc4VHkvSlRjMzk3MTI3ZHFkQnVDUXNUZW51N2tNNys2eElJaU5ZK1RnSnBZY0Y3MlhZZzIzbEpRVXFXRGx6UUp1VnFzVmhZV0ZIa0hRTndXdzZmVjZaR2RuK3dRMWthbjVVajlsV1FTRVVzclliTFpoYXJWNkVmeVZiZjNpRjFCS0Q1ZVhsNytUbUppNDF3dmNPRGU0U2N6TlhYNjhBYmcxcHBhSzRKYVdsbmJOWm9jYklYOTZFcnpCWVBESjFIUTZuYzhLSFY3cXB3UnFEb2Rqc2xLcFhBU2dsWDlKKzhVdnJrcTlDUWtKa2JXMXRXOUZSMGR2cHBReXhCVTRSaWlsSE54T0JjR2RVdUFtT1JRdXh3UDFBWlMrZmdOcGFXbS9LUzNxYnd0c0pwUEpwMDFOQkxYTHFaOXlVR05aOW1HRlFyRVlRSXgvT2Z2Rkx4N0FreElWRmJWWXI5Y0hoNGVIZitNdWQwUzhOVFlSM0p4T3AwOXdhd3pVeEsxRGh3NDNWYU1ZNXMvNllZdkYwcWlqd0VjVFk5SVlxSEVjOTVSQ29WanVCN1hHN1EvMzNYZmZUVFdtd3NKQy9OVWFkYi84OHN2bzNiczNoZzRkS3FVYVRaNDhHWk1uVDhiMDZkT3YrKy90Mzc4ZjE3SG5iMHhZV05nU3M5bDhMd0N0TEpoWG5xa2daU2s0blU3aXJscEpSN1FBQUNBQVNVUkJWTk1tSmREYmJEYVBRTjY2dWpvcGVUNC9QeDg1T1Rtd1dDdzRlL2FzbE5IaExmUG16Wk15WlJxVHpaczNTeGtPZnpsZ3M5dnQxK0w5SlBJT1VxSk43WjEzM2xGeEhQY3N3ekF2d3BWUzRoY2Z3dk04amh3NWNsT042Y1VYWDRURllwSGVHNDFHeko0OSs2YWR3NU1uVDJMTGxpMzQ2YWVmc0czYk5uVHExQWtxbFFxdnZQSUtubnZ1dWVzK3Z6VTFOVmkrZlBrMWhlejRrb3NYTCtLNTU1NFQzd1lFQlFVdHJLeXNmRWlqMFFRMUFtNEtRUkNJdlB5UnU5S3VCRzRXaXdWR283RlJjSHZpaVNjOFVxM2tjdXJVS2FsZ1FtTlNXVmtwRlNmNFM2bWlITWRkMXZ2cFpWTVRjejRoTDhmeTY2Ky9CcWVucHk5aUdPYkp2eU1ZSFRod0FNMmJOOGYrL2ZzUkZ4ZUh2bjM3U2psMVpyTVoyN2R2QndEMDZkTUgwZEhSMG43bDVlWFl0MjhmSWlNak1YRGdRSjlWRms2ZE9nV05SaU1WRWF5dHJjWE9uVHNSR0JpSWZ2MzZlYWdUUjQ4ZVJWNWVIdnIxNjRmYzNGemNldXV0a2xxeWI5OCtsSmVYbzNmdjNraE12TlFPb3F5c0RQdjI3VU5vYUNnR0Roem9rZVlGdUxJaWFtcHEwTDU5ZXdCQVRrNE96cDQ5aTkyN2QyUGJ0bTBBZ0w1OSswcnhaOFhGeFRodzRBQ1NrNVBScTFjdkNRZ3ZYTGlBbUpnWTdOKy9INm1wcWVqU3Bjc1Z4MEFweGQ2OWUxRlJVWUdlUFhzaU9UbFoyaWNuSndkUlVWRW9MUzFGYm00dSt2WHJoOFRFUk96Y3VST0hEaDFDUkVRRTl1M2JCN1ZhTGMxRDA2Wk5ZVEtaR21XbGh3NGRRbEpTRW5yMTZnVkNDSTRkTzRiVTFGUm90VnFjUG4wYW5UcDF3b1VMRnhBWUdPaVJZN2x1M1RxTUhUdjJpdXZoK1BIamlJNk9SbEpTRWdCSWViT0RCZzNDc1dQSGNQVG9VZXphdFVzS2NCMDZkQ2kwV3UzYzFxMWJxNGNORy9iUnl5Ky9ySGVybEtMZHplbFdTM2wzcVh4UkxZWEQ0U0NDSUZDajBRaTFXbzNFeEVRUFZaUVFncEtTRWdRRUJIalkyOFRyNTZ0czA5R2pSNUdibTR0dTNicDV4TUFKZ29BZE8zYWd2cjRlUTRZTWtZNzN5eSsvb0UyYk5nZ0xDd1BMc2podzRJQjBMZXgyTzdadDJ3YWxVb2wyN2RyZFdNWkdLZlVBTlhreXUzZlRGVmx2QWc5UU8zLytmRVI2ZXZyU3Z5dW9BYTR5T2s4KytTVDBlajJXTFZzbVpRUG9kRHJjZHR0dEtDMHRSV0ZoSVVhUEhvM2EybG9Bd0xGanh6QnAwaVRvOVhwczNyd1pEenp3UUlQamJ0bXlCZlBuejVmQThPTEZpNWc0Y2FLVS9EMW16QmdwTFdYMTZ0VjQrdW1uWVRRYXNXalJJano5OU5NZUtzWFhYMzhObzlHSUtWT21JRHM3R3dCdy9QaHgzSDMzM1RBYWpkaTVjeWNtVDU3Y3dEYXpidDA2andUbXVybzZsSmFXUWhBRUZCVVZvYWlvU0xUellPZk9uWGpnZ1FkZ3NWanc3cnZ2U29Hc3BhV2xtRFZyRnQ1NDR3M29kRHJNbWpVTHUzYnR1dUlZNXMyYmh5KysrQUlta3dsVHAwNzFLRlcwYXRVcVRKOCtIZSsrK3k1eWNuSlFYKzhxNmxCU1VvS2FtaHJZYkRZVUZSV2h0TFQwaXRkdjU4NmR1TysrKzJDeFdQRFJSeDlKa2ZJYk4yN0VrU05IY1Bic1dUenh4Qk1BZ1BmZmY5OURQYU9VNHZ2dnY4ZnR0OTkreGZWdy92eDVQUC84ODlML2JkMjZGWjkvL2prWWhrRjFkVFVxS3l2QnNxdzByNkt3TER2TDRYQThQSEhpeEdnQVl2RktGUUNsSUFnS0FBcEtLV0ZaVmxKTFRTWVRxcXFxWUxGWVVGMWRqWnljSEEvbVZsVlZoYTFidDZKZHUzYkl5Y2tCcFJSbnpwekIrUEhqVVYxZGpjOC8vOXhqN2w1OTlWVzgvdnJyc0ZxdGVPU1JSN0JqeHc3cHV3MGJOdURvMGFNNGZmbzB4b3daSTdINzVjdVhTeVlNbzlHSUo1OThVZ0xDcVZPbll2djI3Y2pQejNkbGZ6Uld0dWlQMkU2ZlBvMXZ2LzBXcjd6eUN1Yk5tNGVwVTZkaTVNaVI2Tk9uRHpwMTZvVFUxRlFrSlNVaE5qWVc0ZUhoSkNnb2lHZzBHa2FwVkNvVUNvV3lzTEF3VGhDRU4rbmZYSVlQSDA2enM3TXBwWlNXbHBiU0RoMDZVS2ZUU1d0cmErbXhZOGNvcFpTeUxFdG56SmhCdDJ6WlFpbWw5UDc3NzZlYk5tMmk3dExRZE1HQ0JWU24wMUdqMFVqVDB0TG8xcTFiNlpBaFEyaFZWWlgwTzZXbHBmVE1tVFBTOGJLeXN1anAwNmNwcFpUMjc5OWZHa041ZVRudDNyMDdwWlRTNDhlUDB4RWpSbEJYTldwS3Yvbm1HL3JVVTA5UlNpbjk5Tk5QNmV6WnM2blQ2WlMrczlsczB1OEpna0N6c3JLb1RxZnpPTithbWhyYXRXdlhCdk13ZVBCZ2FRd1dpNFYyN3R5Wk9od09tcE9UUXdjTkdpU040WU1QUHFEUFBmZmNaY2R3NXN3WmV1dXR0MUt4UitldVhidm8rUEhqcGQrYVAzOCtmZjc1NTMxZWowMmJOdEZaczJiNS9NNW9OTktPSFR0NmZEWnExQ2g2K1BCaFNpbWxITWZSbmoxNzB2ejhmUHJkZDkvUmQ5NTVoMzc0NFlkMDRNQ0J0TEt5a280ZE85WmpqbzRjT2RMZ3R4cGJEM2E3bldaa1pORGk0bUpLS2FWMzNua24zYkZqeDJWTEp4a01CcHFXbGtZNWpxTjJ1LzJEMmJOblp3Qm9BU0FCUUJTQVVFSklJTU13R2dCS2htRVVHbzJHSVlTUXdNQkFFaHNiaTRTRUJEQU1nMDZkT3FGUG56NFlPWElrSmsrZWpDWk5tbURGaWhYNDl0dHZwUnA1SDMvOHNYVC85K3ZYRC9uNSthaXNyRVJHUmdic2Rqc29wVGg0OENDbVRKa2lsUzFhdEdpUnRNLzA2ZE94ZnYxNlVFb3hkdXhZbkRoeEFwUlMxTlRVb0d2WHJxQ1U0cGRmZnNHSUVTTWdzc3kzM25ycnhxbWk1ODZkdzRVTEZ5VDFVOTd6VTdTcE5SSjhLekcxNU9Ua1JZU1EyZmdIaUppdjJMUnBVekFNQTZQUmlKQ1FFS3hldlJvclZxeEFhR2dvY25KeXBDZDdZV0docEY0U1F2RHZmLzhiZ012emJMZmJNWC8rZlBUczJWUEs3d1JjcFdPZWYvNTVXQ3dXQkFjSG82S2lBanpQUzZ4SVBKN2MxcE9ibTR2eThuS01IRGxTc3VHMWJldXFkako1OG1RVUZSVmgyTEJoU0UxTnhiUnAweEFRY01uOGVlVElFYVNrcEZ4VjNCUFA4OGpQejhkVFR6M2xNVjR4K1Y2cjFVcnFlWEJ3c0ZUSnBMRXhGQlFVb0czYnRwSjZucGFXSnRYakYrVjZwUVJkdkhoUlVyMlVTaVhhdEdtRHdzSkNwS2VuWStmT25YQTRISmc2ZFNvT0hqd0lwVkxwTVVlTkpYbjdXZzhSRVJHWU9uVXFWcTFhaGNtVEo2T21wZ2I5Ky9lL3FyWGwzaDRZTjI0Yzl1N2QrOEdKRXlmcXZiVXJkODRvTCthWDhqeFBXWllWKy8vQlpyTkphbWg1ZVRsaVkyTlJYVjBObFVvRmhVS0IwNmRQUytXazVPc29QejhmRm90RlVyY0ZRZkJZRTNMelJXcHFxa2UxRjE5U1ZsYm0wU05WcFZMZEdHREx6OC8zQ1dvK0tuUTBDT2tRYldvdFdyVDR4NENhWEl4R0kxaVdSWEJ3TUxaczJRS2owWWd2djNSVkpYNzAwVWVsLzR1T2prWkZSWVdVRUw1bnp4NTA3OTdkNVNGaUdHemV2Qm56NXMzRGUrKzlKK1Vycmw2OUdvbUppVml5WkFrQWVLZy9VVkZScUt5czlMQ2ZpWiszYmR2V1o0WFp2THc4UFB6d3czajIyV2R4N05neFBQamdnOWkyYlJ1aW9xSXVlOU1TUWp5cXN3S0FRcUZBZUhnNFB2endRNmtza2lpaSt1MUxHaHREVEV5TXh3MVNWbGJtQWZMWFU4VGZFcHZ1aUwvVnZIbHpWRlpXSWpBd0VJTUdEY0xpeFlzOUdxWllMQlljUDM1Y2VpaGRhVDBBcmlUOEVTTkdnR1ZaVEpzMnpjT3U2bXRldlVXdFZqL1FwazBiWWRTb1VlKy8rT0tMYUF6Y1JBRGlPRTRLQlJFZEFZUVFYTHg0RWQyNmRVTnRiUzBVQ29Ya1FEaCsvRGg2OSs0dEhVOWNROUhSMGRpMGFaTlBPN0I4ek9YbDVjak16QlRIS2ozQTVDYU9xS2lvQnVyOEh3NXNKU1VsVXRNVmI2Ym1iVlB6RmRMeHpqdnZxTnlPZ2puL0pFQjc3NzMzTUdYS0ZLeGF0UW9qUm95QVNxVkNiR3lzVkErcnVMZ1l1M2J0a2tyc1RKczJUZktrNWVibTRxdXZ2c0tHRFJ2Z2REcWhWcXVSa0pDQXQ5NTZDN2ZmZmp2YXRXdUgvdjM3SXlZbUJsdTNic1dPSFR0dzRzUUpuRGx6UnJLeFRabzBDUXNYTHNTRER6N29rWVBYdDI5ZnZQTEtLM2oxMVZmUnYzOS83Tml4QTBsSlNaZzhlVEtPSERtQ2JkdTJZYzZjT2FpcHFZRmFyWmFldm1MbGlPWExsemM0MS9Ed2NDZ1VDbnoxMVZkbzBxUUoyclZyaDVpWUdEend3QU9ZTTJjTzVzMmJoN3E2T216WnNnWC8vZTkvTHp0dmpZMmhhOWV1SUlUZzdiZmZSa1pHQnBZdFc5YWdTc1cxZXBzM2JOZ0F1OTBPanVQdzNYZmZJVFEwRklNR0RjTDk5OStQSlV1VzRNa25uOFRldlhzUkZoYUd0TFEwRUVJUUdCaUl0bTNiSWprNUdVVkZSUjc5QURadjNvemh3NGY3dk5sOXJRZkExVTFxOE9EQjJMQmhBL2J0OHl5QW1wU1VoT0xpWXZ6d3d3OElDQWlRQU1KYkZBckZRd3NYTG5UdTNMbnovZjM3OXpld2k3cmY4NElnU0hGdWxGTGljRGdvSVFUeXB1TjZ2VjRDdHRUVVZMejc3cnVJakl5RXpXWkRjWEV4QUtCMTY5Wm8zcnc1RmkxYWhQSGp4K1BZc1dPd1dDeVlPM2V1TkE5ZHUzYUZ5V1RDL3YzN3NYanhZZ0JBMTY1ZDhmbm5uOFBoY09DSEgzNlF4cGVabVluLys3Ly93M3Z2dllkV3JWcGh6Wm8xVUN4ZHV2UVB1em1ycXFwd3p0MmpRTjdNMkdBd2VCU0k5RTZUa3NlcHJWKy9mZ25ETUF2K1NhRDJ4UmRmWU5Tb1VUaDQ4Q0JhdEdpQnVYUG5RcVZTSVRFeEVZbUppZGkzYngvaTQrTXhZY0lFUkVWRklURXhFYTFhdFVKU1VwS3JGcFZTaVJkZWVFSHlMQ29VQ25UdjNoMUJRVUhvMGFNSHpwdzVnL1QwZExScjF3NHFsUXFIRGgxQ1dsb2FoZzRkaW9TRUJNVEV4Q0FqSXdOV3F4VkhqaHhCdDI3ZGNPalFJVXlmUGgwS2hRSzMzWFliY25OemNmVG9VYlJwMHdZVEprd0F3ekJJVDA5SFVGQVFkdTdjQ1l2RmdzV0xGMHU5S3RldFc0Y21UWnBJSGpxNU1BeURYcjE2WWQrK2ZhaW9xRUJhV2hwQ1EwT2xpcktpK2pacjFpeUpxUVFHQm5yVTZZcUxpME9MRmkwYUhRTWhCQ05IamtSMmRqYU9IeitPaVJNbk5tZ3kwckpsUzhUR3h2cThKbEZSVVEwOGQ5dTNiNGZGWWtHM2J0MWdNQmpnZERxUm5wNk85UFIwaElXRllmdjI3WWlLaXNLenp6NHJsZlNKaUloQXQyN2RFQjBkamVqb2FHUm1aa3FlNk9lZWV3NlBQLzU0Z3lqK3h0YURuRHcwYjk0Y0F3WU04TmhQcTlXaVk4ZU8yTE5uRDNRNkhUcDE2b1NBZ0FBb0ZBcDA2OVpOK3Ird3NEQjA3Tmd4NDg0Nzc3Uy85TkpMcDJXTVQwUTRLcXFjY2lhblZDcUo2TlFLQ1FueHFLUkNLVVZrWkNTYU5XdUdFeWRPSUNrcENWbFpXVWhMUzROV3EwVldWaGFxcTZ0eDhPQkJ4TWJHNHQ1Nzc1WFU3ZDY5ZXlNdkx3OWxaV1Y0OXRsbkplOTF0MjdkVUZwYWlweWNIRXlhTkFteHNiSG8ycldyVk9ycThPSERxS3FxUW54OC9CK1hLNnJUNlpDZG5lM0Ixcnl6Q3J6RE91UnhhbUx3clR0T3pTOSs4Y3NORUxQWi9PK1FrSkQvQWJDNUs0TTRBTENRVlFZUmMwdVZTaVYxTTJJcTVwV0tTZk1SRVJGU1htbHljakpTVWxLUWxwWjJ3NUxtL3hCVjFHYXpTUjNhS3lvcVVGdGJLN1hIdTV6NnlmTTg1R2xTRE1NczlpODF2L2pseGtsd2NQQmNuVTVuallpSVdPZG1aaFR1V0RhdjlDdnFJblhFbGFORkNHVVlCZ3pEZ0JBQzhXK2xVZ21WU2dWM2NqMDZkdXo0dTJ2ay9TbkFSaW5GK2ZQblVWaFk2S0YreXF0MGlCNVFlWkZJdDZ1V0VSUGEzYm1mL293Q3Yvamx4a3BBZUhqNFkxVlZWWmE0dUxpdDFKVmM2bTF2Zzd1SGd1QjBPa1hQcUFoeUlJUklkalp4RXdGT285RWdQVDNkWnhPWG14clk1S0FtTmpJV0hRVVdpK1d5bFc4RlFTQTJtMjJZdTBxSFAvZlRMMzc1Y3lRbUppWm1aa0ZCZ2JGRml4WUh2SmdiQlVBRlFSQzlvNUFCR2hHTFY0cWJITlJFWUFzSUNKQ2FLdjhsZ0syd3NCQVhMMTVFV1ZtWlQwZUIzVzV2a0ZVZ0MrdGdUQ1pUTjNjOU5YL3BJYi80NVU4VVFraEtjbkx5UThlUEg5ZDM3dHc1eDgzY1JKV1VpbjBSUk5ZR21ZTkJWRVc5R1p0U3FZUmFyWVphclpiNm12NVJjdDI4b2xWVlZaSmRyYnk4M0tkZHJURVBxRmpPT3pRMDlDVkN5RUQvc3ZLTFgyNEtjR3NhRXhNVDJxbFRwOU5mZi8yMXpRMWVrcWNVUG1xMnVWVlM4Vy81NTVCL0xvYSt5SHRjWEZmR2RqMWFoNW5OWnB3NWMwWmlhMklPcUhlYlBJZkQ0ZUVCRmRYUHUrNjZTd0hnbWZyNmVuODViNy80NWVhUzRabVptVFVwS1NtdlhiaHdRWkF4TjFmNmdmc1A5eXZjV1FuRW5VSUgrZVowT3FYTlhUVUU3ZHExKzBQQVRmbDdhejVSU3BHWGw0Zmk0bUpVVkZRMHNLczFWdExiN1N3Z0FKaGx5NVl0Y0RxZE42VHhpdGhUMGJ2cXhKWEVZckVnTUZBTFFoai9VdmZMUDQyNTNiMTE2OWJxbEpTVXo5MDRKc2pCalJBUnh3VEs4enpoT0k2NmFSc1Z2YVJ5RmRYYlk5cStmZnZyN2t4UUJnVUYvcTRENU9YbG9iYTJCbnE5RG1hekNWYXJCWGE3cEhMS0tuUTRpUmlkTFBlQTF0YldUSFU3QzI2SThMd1RUaWVQYXoxdm5VNkh5TWlJYStvNWFUQVlFUklTN0RPUzNDOSsrU3RKVUZEZ25QejhDNVczM0pLeUZZQTNjNVArVHhBRWdlZDVPSjFPS0JRTTRUaU9LcFZLaWFIWjdUWllyUmFZelNibzlUclUxdGFnb3FMOHVyYnVBd0RsdGR5bzNsSldWb2F5c25KVVY5ZWd2bDRIZzhFSXM3bEJqd0kzdUVtZ1J0eFVsZFRXMXZRTkNBaDRCamV3THB6cmFTSGd0NXkzYUFDOVdqR1pUQWdMQzhYdm1XTy8rT1VtRVdWOGZQekR4NDhmcSt6Y3Vjc3hYOHpOL1VvRVFRRFA4NVRqbkdBWXppdmtRd21WU2cyMVdnT05KZ0JhYlNDQ2dvSVJHaHJhSUNmNGR3MjJzV3FYVjVMUzhqSWNQM3NCT25kR2djRndLYW5kYkxiQWJMV0J2UVJzSWxzanZDQVFLbENtcUtnd0lTZ29hRDZBbEJ0THF4a3B6dVphVlc1NWN1OGZ0YzhmSWZwamU2Qm9sb0dRcUJzVEZrZzVPNncxOVZCR1JFT2pWUU53b21Mckp0aHNnS3BwR3lSbHRQbGIzT20vWlY1dGhUbXdPS01SblJMWHlIL1lVYlhqTUNKdjdRZVZtK2c3aWs2ajdGZytBSUxZUWFNUkhNcGN4N0ZFSURvbDRXcDN1YVYxNjliM3IxeTVzbnphdEdubEFNUkFYZkdWaXA1U251ZmhEdHFWUWtBdWVVY3Q3dEFQdGJzVGxoYkJ3VUVJQ3d1N3BxWXdqdEpjR0l4YXhMWkxhbkJPeW10V2s2Z1ZpejdZZ1AxRjVTQjFaU2l2cVVmWHVGQW9MU1pZTEdhVWxKV2hzTjRNd3RrZ0NFQ0lFc1RwZE1MSmNjVEJPUW5nc3F1OWsydCsrcm40K0NIa1QxaVFsT0thMVVNeFArNWE5dnN0Ky93UlV2TFpjZ1JOL2d4aHZRUC84TitxMi9ZWkRyL3lKYlROV3NCUlZvQm04OTlGbS81SlVBVUV3bkp1Tjg0ZHFFS3p6SFovQzJEN0xmTnFPTEFHaGZwTXhLYU9iSXpuSS8rOXp4RFk5MVpvM0VTZlVXcWcxZ2JnNHRzdlFKMStHMExERzY2bnl1OC9Sc0R0YVFpTDhSeEx3ZnRMb2V6MUdKSTZSRGJZeDN6aVI1UVlPaU0yTmZGYU5KNEI0OGFOSzV3MmJkcGJNdFlteUZnYjRJcHpnMXNscFF6REVJV0NvUTZIQWtxbGF4TXpFZFRxUzIzK2dvT0QwYkZqeDZzbUFwYmptM0gyVkJMaTA1bzFPS2RyQnphbzBUK3REWG8yRFVGaG9ScTc5cFppN3prZHVrY29ZTmJYNFdLZEZZbmhnZUR0UUVWMUhURXJsVkFJVG5DdUNHVkNBTVpTbS8vUXlEZjJ6TXpKVEVYSEc1eGJJRGRpL2pZMWx2bkQ5d0VFVURCdzZxdkEwU0FFUm5oNmpTZ0VFREN3VjVWRDBJUWpNUHpTWXJaWGxZSlhoaUlvS3ZUU0Rxd2RvQVRPdW1vSW1qQUVoSHFtdERpTmRiQVpIUWlNaTRkQzlkdEJtQy9kai8yTFY2TEgybzFvMGl3VUVHeXcxbk5nR0EzaUI0OUFNRk9PL0FLTGova1E0S2lwQnNjcEVKUVFBOCtISFE5YmVRVUVWVEFDWThJOXZxTU9LOHhWdGRERXhFR3QxZHhrOCtyN25BalBnVG9GVUtzQk5nc1FIQmZoT1Q1bkRQcCsreG1JYkk2MHpkcWhlYk4ycVB4b0NZQ0dhNWM2bldqLzNDb1FaY1BQemFjT1FObHFPb2dRRGlpVjBqaW80RVQ4N2ZNUUwvdnMwakE0V01zcndFVEdJU0JRMDJDdDhFYkhmVlVWVllWeFRlTFdBK0I5cWFTQ0lBaUVFT3AwT3NFd0JBNGJKWVF3MUtYQktLRlV1dE9zVkdvRWFOUlFPT3pRS0xVSURRMTEyOXNFMkNyTFFRTWlQYTREQUhDNktuQWtCRVRnUUoyOE5CL3ljMUplcXplaW9xSWVhazZQa3FwSzFOWFZnemhaMk13bVdOUXExT29NSUFvQ2NDNjdtb0pRY0N3TEVFcW9xNlk2c1ZoTS9aVE91dmtjbzBTd2tvQ1FHdzFzbHdEdXR6QzJhOW52dCt3REFPZWZtWWlMdVNvd1NpV0V5b3NJdm4waCtzNGQ3ZnJTZUFycit6K0RwR0V4cUR5bEE4dzZkUGprSnpSTE11TFFmVk5SWjQyRXlsSUdrallSdDc0Nkd5b0dvRTRPaFcvTlI3RktBWHZCR2NUUFhvSHVkN2tLRWhiKzUxR2MzRlNDaU9ZUk1GNm9ROFozR3hFclBkd2RPUG5rVEtnR3pVSzdyQzVYWGhzL3JJZXErd1FrTkhlckU0cEFCTW55UndnVlFIbkJhejZxc1hQd2VMQXhMYUdDQVNaZEtQcXUraENSTVJwUVV6SDJUTGtIOXRDV1VBczYyQk1HSXV0VlYwaysvZTdQc1dmUkp3aHRtd0o3MlVVa1Ava0oyZzFzZnBQTWErUG5CSUdIOGVlVjJIN2dLekNXTXFEMW5SajR4aXdvQVZTdSt5OU9mYmtEK21OMUdIeG1MeUs5c1pyakFIaXVKL2JzejlqOS9FZXduUDRWcmQvZWk3YTNObkdwWk1jMllkL0xYOENTVXdKUzhEaktQOUVpK3JaSDBHVnlQd0JsT0hEM2s5QVZua2ZJN1l2Ui8rbExwZHJ0dVh1d2U5WWlNRTFhZ1MzTVE5eERMNkhiWFgxOXJaV0g5eHpJTHV6WEsrMllTeFdsQWtBRVVTMTF1MGtKejdKdzJ1MVVTUWpzT2gzNDZIZzNhMU9DNk10UTlRdUxXcFVkUWVwZ1hGVCtpSUIzWGtDZ3ZReDV6endITnJRWlVIOFJRVVBub3ZjVDQwQWc0T0pyczNGeVl5SENZalhnV0FkSW0yVDNmSGllMHpVQm05VnFsY0k2YW12cm9LK3Z4dkhDU3NRRmg3cmFjOW5zSUx3QW85RUdvOE5KRkZRQUZTaWhEQWhEd0l4YnNpTDhrVFU3bjZxdjB5ZE1HejhZS2VvL1F4SDliY0QyZS9hN1poRGxuWEJHOXNLb2o1NENNZVhoaDh6eHFKZ3lBZ254U2hldnFEa0ZSZVptakY3ZUVRQUxKNnRFMWVvM1VhWHFoOUhmTDRiQ2FjQ3VJWm5JMnpNTzdRY2tBcndUeXJRc0RINXVDcHpsZTdGK3dCSzBHcmNMRVlIVk9QZmhYbVRzT29XRU9BQk9GandqZjlnSU1KdzZBazE3M1ZXZGcrWENCUVFuOTJ6OGY2a0F3ZWtOYkJIb3MzNDcxQ0V1NnA3M3doU2MrV29YK2o0MkhPWURQNkErYkRER2ZlRXFoTW16ckxSdjRlY2ZvTm5UbjZIVEdOZlRuV2VGSzQ3eHhzMXI0K2NFZ1ljVnlSajc3WnRRQ3dic0hOUUQrWWZ1UUp1ZXNXZ3lmZzZhakIrTEg5cE1kQU9ZMS9pZEhFQTlnVTNUYmpDR2ZqVVlSKzdxQnRCTGF5Mnc2MmdNL1dvMGp0L2ZHNm83MzBMYTBHVFprUkxSNTh1dlVQTCtZN2hRVDJYSHMrTElZM09Rc09CcmRCemNHb0xwUERiM200SDZNWHNSRmRKZ3JUUmhxV0xhc21YL0xsaXc0Qm1CVWdpRVFJRE1ZMG9wQlFVRXlpaWcwQVpRRlp6RVhGdER0YUdCVUNqc0lDd0xjMTAxNG9lUFJHeUxKb2lMamtadFJRVjIvdWRWSkkxOEdjTm5EUUdjT3V3WU9BQ2w0MGFpcWZvUWpuNXlBVU1QYjBWNGtJRGo5dzlHbGZTZzlEeW5hM0xYRlJRVW9Lek1uUU5hWDR1REo4N0FvUXBDc3NJSnM5a09qbVVoY0FLYzFFbkFTNG50RUFRUVFhREVrZHpweWJuOTJ3MnRMem1QVjdjZndhalVFWWhUd1M4K0pMWlBMMWVublpCV2lHa0QxSjhxUjBLOGUzRnFVbkhMNkk2U2FVQ3BCblFuVHlLdTc1TlFBSUF5REUxNnQwZjE2ZFBBQUpmOUpLNm5xNHFwTXFFN29xSXVvajdmam9nT2tZanZHWWtqRDB4RDhwQitpQjg0RFBIdDVmYVdRUFQvNmRRZmZLWU1xamUrZzl6dmRzTm10b090TGtLSXU1eTBOcTBybUZNUFlOY2NCK0o2ZEVYeXlKRUlVcnZucDJjdkhQalhMRGpQamtCVWozNUlIdERsSnBwWFphUG5CQUJSbVpsUU13Q1lNTVIzYjRYNjdHeWc1MDJRY0dQS1JYVzJEWXE5MytEWVFaZHFUcDJsMEJXWUVkWFI1MW9aT0h2MjdMTUxGanp6c1ZzbDViM3NiZFNOMEpUbmVUQXFCZ0xsaWMzT1VxVkNBY0p5Y0FaR1FDQXNqRVlqTkJvTkFtc0tVSCtzQ0h6MGVoeXIvd1VVQU90MG9ENm5CQkdxTTJEU01oQWV4QUJnRU4rM0o2ck9OTGFxcnRaUVdsS0MwdEpTVkZkWG9hNnVGa2RPbkVLSlE0SFdvVXJZN2E1cUhWUVFJSEFjR01KQXpRQzhRQWxBQ2FXVW1mYjhmOFpOSGRybjZaN040ekd5YngrMDV3cXhyZERpUjdCRzZjVmx2dE1HNGZkRmtCRDNsVmVpODBmYjBIdnhkS2k1TXV3ZlB4UjV4MnArODFHRFdqYUhzYUQ0bXZheDdGK0pneCtmUkpkMy9vZVJXN2FnNi8xRDNkb01vRXpzZ2RIN2ZrTEtrRTR3N1ZxRkgyNS9ES3g3djZZUHZJd1JYNjVBZUh3QXppKzVCNGZlMzNIVHpPdmx6c25uWG96aUpsbDBBcUNLUlB6SUxDUm1aU0VwYXlSNmZMb1dUVzhKYkhTdEJBWUd6aW9wS2U0TFZ5VWVEYVZVRFZmNGxvSlNxcUFBUXlsMTl5cmx3UVBnT0JZczY0Q0Q0OEJCZ05WcWhjbGtoc0ZnUUYyZERqcU9BZHVxTFVpWExrakt5a0tYTi8rSGxGN1hGZ3B5VmNCbU1wazhlb0FlUDNVS1o0d1VIYUkwWU8wMjJPME9zS3dEQ2dDVXRST0hLMmFOVUVFZ0JHQ3Fxa3FUUWdQVlR4VFZHbHpUWnplZ3hFSVFIT0NQNzJwTXF2Y2VjQmtyVEhtb09RZEVkcnk4U3o0aXZRT3E5dTRGRHdCT0F5cjI1eUJTVm1HMjZ1QmVsL0czL0ZmVTZWb2hxa1VBQUJhc1JVQlVSaiswbS9jc1V2ckZ3cGd2NytMTkl1Zi81dUQ4OXF0amJRbWp4NEhkdHhwbEJRYjNmV0tGcGRwd3llMFVHUW0yckFST3VYbWpyQXdCcmRJUkhoTUVDQmFVL2JUM2txSGFaQUxDNHBBNGFnSzZ2N1lVeXBKenNMcDNaazBtQk4zU0NTbjNQb3hPRDk0Ry9ibThtMlplTDNkT0FGQzNieDlZd1hXOHlsL3pFTmtoN2VyY2RwSGhzRnloc1ltM0tEVWFzSFgxVi9mUElXMFEyOW9HcXlrY3NkMjZJclpiVjRTM2FBWlZFSFBadGRLMGFkTjd2L2xtVFJNUjNBQkk0QWFBb1FMUHVPeHRUc0lUUUhCeWhHVTVPRGduV040Sm04MFZ0T3NDTnc2MGFTREtDcXRnaXdpSHRuVXFvbHEzaERva0VFR2RPb0JtSDRiZUlnQndvbkx2d2NiUCsyck8xNVhZN2k0WVdWT0tBM21Wc0xGMjdDbTNRV0R0Z0FBa0JDbmhwQ0FxeHRXOUJ0UlZoNDRCbUtpb3VIbVBqdXpkN1lGdk4rTG9rUmpvYTJ1UjBMRW5SaVJwL0FqV2lDaHFEK0xIY1hlQXI3NkkwQWRlY051QkdwZjRPeDlIM0E5MzRvY1JKNkN5bFlHa1BZUlcvUytwbGR6SkxkZzZjU3ZzQldmUWZNbGJjRG1hcXJGcjJGandDYWxRb3g1Rzh5MFlPRlFlaXNHaGN0TTNVTWNPUit2QkhhOThFeVgzUjc5L1Q4SCsyL3Nqb0VVTE9FcUxrZkxTYW5RWTZuSW1hTHFNUkt1V1gyRjl0OTdRZEJtQjBSOHNRdFNnU1ZDL2RSZTJURHdLeGxhUGdPaExEZ0R6d2YvaDU4VmZJcUpOQzlnS3ppQjY1Z0tFdWFmaDdJSTdVSFJSaTVBWU5YUzUxZWo2d2VNM3pid0tsemtuQU5BcXl2SFQ3ZVBBV01yQWRIb010MlJFQWREaDREMzNRRmZ2Z05GUWdRUGpSa09wYllFK2E5K0UyTUs2OWR6NTJQbllPT1F2RFViN2w3OUVxNTRKeUZ2eEtQTDJGTUdhV3cxU2NpOEtYOU1pYmZuL2tOemV0VmZ5UFE5ajF4T1BvT3lURU1UZCtUUXlwZzlHN2RaM2NQanRMV0FyTDhMQi9Zck4rMWVpeVgwTDBYbDhUM1I3ODNYc2ZuQXFTdDVMZ1pLcmhkbVNnQ0UvZll6Z3k2d1ZRa2puVWFORzNRSGd2ektWbEhmVFZJRlNTZ1dua3dvQVZTclZjRHFkNERpT0VKNm5uRUJodDl2ZHdidXV5aDlSUFFlZ2F2dEtiRHorRTNJaUF4QmxEVVBmRGQ4akpyNHZ1ajdRRWo4UEc0N1FXQzE0cW5FMURBUWFuQk9oR21uUWdRQUFJQUJKUkVGVVZMaWlDaW9tdUplV2l1V0k2cURYRzN4MW1YSW51SE9FNXdWQ0tWWFk3YmFKS3BYcWZ5N3JMNGR5Z3dVYWJSQ2l0SCtPY2EyNnVob3N5eUV4OGRxb2JYWjJEbEpUVzBtMTYvK29mUURnN0ZPalllbTZGQjJISllJVGdoRVVGWFRWKzdyQ0VrSVFGTlV3ME5GUlV3a2hJQlRha0VBUDljTldXUWtuVkFpT2o4SDFjT2RRMWdwemVUVlVNZkVJQ0xxS2VCNkJoYW00RXVyWUJHZ0NsVjVmV1dHcHJJVXFJaFlCSVo3SFlnMDFjQmdjQ0V4SWhFSjVrODNyWmM0SkFIaExIV3hteGl2YzQyWVJBZGJ5VWxCTkJJS2lRcTU2clpTVmxjMU5URXphQmNBQ1YybHhPNldVSllSdzdyTGl2SGRKY2ExV2k4REFRQVFGQlNFa0pBVGg0V0dJakl4Q2JHd3M0a0lEMGF4WkszVHVuWW5rcEV0QnVHeGRGWnhNTUFJamduNGJZN05ZTENndExVVlZsYnkybWdrV2k5V2REM29wYmNycGxISkJpU0M0Z25CTFMwdmlWU3JWM0V1UFN4VVNJc1BobDZzVGRVUWMxTmU0VDBCYzQ4R1dtcGg0bjlZSWJYekNkUjAzVVFjaTVGcHFiVEZxaERSUGJ1U3JRSVFrKy81T0hSWURkZGhOT3ErWE9TY0FVQVJGSVRqb1psMTVEQUlUa3E5NXJTUWtKRXo3OU5OUGN1Njc3MzRlQUE5UWliWGhVb0ZLTVplVUtoUUt3cklzZFdVa0tLQlNLV0d4cUtUT1lvR0JXaGhZTzhwS1N4RVZHWW1nSU5lRXFhT3VmUDB1YTJPNzFJVEYxVEpQQkRWWGFXOEhIQTRXSE9lUk1pVjZRZ21sbE1URnhUME9vS3Nmb3E1TkVtZjhIMUp1VGZGUGhIOWUvMUpDQ09sMHh4MTNUSERiMlRTVVF1NUlZRVJja0dVbGdPTTR3bkVzSEE0V2Ryc0ROcHNORm92Vm5TU3ZSMTFkTFNvcks2WFdmVmR0VzJ6c2k4cktTcS95M2lhWXpSYlliRllQcHNheW5GUmpTUkI0S2NIZGFyVU1aUmhtcnY5eVg3dUV0TzdtbndUL3ZQNGxKVEF3OE1IYzNQTkhVMU5iSHdiZ2RERzNTN1kyU0lueVVyb1ZXSmFEUXNGS1NmSTJtd3BtczlxZEpLOURVRkFRUWtOREVSRVJnZmo0K0t2a25ENkU0emd2RmRSVlc4MW1zOEptczd1OW9LeFUybHV1Z2xKS3liMzNUbE5vTkpySC9aZlpMMzc1NTBuTGxpMm5wS1NreUQya0tqZUpZdUFPL3hBRU1RVEVDYWZUU1RpT0E4dUtyTTBPbTgwS3M5a01nOEdJK3ZwNlZGVlZvN1MwRkZkYlA5SW5zTGxDTzZyY0txaEJxck5tczhtWkd1dlJBZHBkSlpOUVNwa1BQdmhnTm9CQi9rdDg3VkpkWFkzUzBqTC9SUGpsTHlzS2hhTC80Y08vakJhQmpWS3FFc0dOVXFxZ2xETHU2dGx5bFZUQ0ZZZkRCVzZYNnJZWjNDcHBGVXBLU240YnNCa01CbmZQZ2hyb2RIcVlUSzYyZVdMTFBIbU5OYWVUSS9JdVV3QklmWDFkcWtLaGVNeC9lZjNpbDMrdVJFUkVUTnV5WlhPU0Y3aEpzVzBBaUNBSU10YkdTYXpOVlpEUzdyYTNXV0F5R2FIVDZWRmJXNFB5OG5JWURJWnJCelo1aHlsWGVXOExyRlpQVURPYXpLZzFtS0EzV1dGak9ibkRnQkU0NjZ4WE51eE1YTEJ1TC9hV21TNGQyR25ITjdzUDRjbXZ0dUhmMjArZ3lrSDlWLzk2aTlPQzJ0UG5YY0drdjFNcVZyK0FnKzl2dSs1RDVDdC94WTdaeXozR2FEaTJIY2VXek1lKzJYTng1cnU5RUg3WEx3alFuOWlQOHgrK2d4TnZyb1RENjd1cXJTdHhjUFpqT1BMS2g3QmFaYi9rck1PKysyZkM1RStHdVY3UzlOWmJiNzNkRFd3ZVFic2lhL04wSkhneU54SGNyRlliekdZTGpFYVhTbHBkWFkyeXF3aFM5Z0MycXFvcVZGWld1aExjM1hGcUxoWFVKck9yMldHdzJNRVFWeUVQd2NrUnB5dG1qVmdORlFObmY3VDVZUzRxRVNOYi9qOTc1eDBmUlozLy8rZk1sdXhtMDNzMmdTUWtoQllnR0NEU0lRS0NvS0FDSXZZR25PVzhzNWV2RFU4NXozTHF6M1lxbGtOUkViRmdwQmNGUktRSENNMlFoUFJlTjl0bmZuL3NKdGtVVWhDVTAzazl6QU96bTVuNXpPZnptZmU4Nit0dDRLSDN2dUZBdldzTGY1VCtIVXR6Yk13ZE1Zamcyanh1WHZIenI5ekFDdHJBZEpRdDF6N2FWSGIwcTJSa1hSbVd5dHF6UHNUakx6MUw4TVV6OFN3aXl2bGlKWDdESnhFM1l4VFpqOTlNNW9iY1gzR0ZLakpmZUlYcXpEMWt2dnB4aTdtbzN2dzJQL3pqYTZMblhvZTJhQ09iN251MXVjSktIVXpNRUMwSDN0K2c3S096QkoxT2QwTm01dUhCSGxyYjZhS2tMYlMybHY2Mnhxb0VsMGxhWGw1QmNYRXhKU1VsWFJkc2hZV3VaaXpWMVZVdFRGQ3IxWUxOMWlqWUpQeTl0WUpXRkJBRkJORlZ4aThBWXVISjdOdVArTVZ5LzZqZWpFbStnTGtKQWl2MkZ3QldOaHd1NGRaSkl4a2FFOEg4UzBkZ1AzYVVnMlpsOGM4V2lyNWV3djZYbHVLb084bmh4WXZadi9oNXFpcWtSaWxGMXB2UHMvMk9POW43OGhJYVRGMTdwY2gxaFJ4YS9BamI3MzJFZ294OFQ2bEg5anN2c2YyT085bjkwcEtXbWsrSGd2Y0l4OWFhaUp2Y3A4WEhnNTk1ZzRSTEp4STFjUmFSS1NHWUNvdC94VXdFTS9LajVhVGVmdzJ0S3pDelAxeEs3TUtINlRGcUdJTVdQWUw5dS85UzVtSFZSTTIrbk9ML3ZvZEZlZU9lTmZUdTNmdEtXZ1lSTkI3bWFLUFcxbFJMNmhsSXNObXNXSzB0VGRMcTZpckt5c29vTEN6cW1tREx5M01WdUxlT2dycE1VRmRhaDBlVDQrYUFnU3VDSzFvczVybkh5NnVuSjBTRTRHeW81MVNkbGNTSUVJNlhWZ0ZPSEpLTVN1VytuS2hDSmRkenN0S3VyUHhaZ2svL1lZU05HWUtvQ1NJNExZMnd0TEhvOWE3NVB2SDBBbzd1cVNIK3RsdlI1RzlrdzkwdmRrbGJMbHJ4R2VvaDA0aWRFTWRQMTh5anZNSUJPTWk0ZXc2L1pEcEpXREFmSC9NZU52NzEzMTA2WDkzUFAyQlBISTdmYWJJcmk1Y3RJanUzRi8wdUgzWU9ac2hDOWRFOC9Qc25Vbi95R0RhdlJBSWl5cW5KYW5hWGlCRXBCSWw3S2M2eUtSdnFMRUd0VmwrY241ODNtcWJjdG1aZlcyTkRKemVkZUl0QWdrdTQyZDM1YlcyanBLV2xKZVRsNVhjczJHdzJHOFhGcmxyUTZ1cHF0d25hNEJFRlBVMTZoOU1weUxJczN2SFFZeXFOUnZNWHM4Mkd0MWJGcDJ2V2NzMktuOUZyMU5UYUhZQTNJK0tEV1BGakJtWDFEYXpkdW85Y1djQnNkU2dyZjViZzIzc1F4bUZKaUxvQUlsSlRNYWFtb3ZNR0tDTjc1UzZTSG4yY2lPUmtCaTU2Rk9lNjVWVFVkMzVPLzZsWDAzZktLS0ttMzBiOE1DYzVHektRUzNkeWJLT1RvWXZ1SWlneGtmaTc3MFhjc1lLcWhzN1BWM3Z5Sklib21IYS9hOWkvZ20ydjdTTnQrUkw4Zk04Rmxib0pteGxVbW1LMlRCeExabm91YWowNDZqek5CaDk4WW5UVVpSVXJHK29zSWpJeWNuWktTb3JPcmJXMUNTUTBtcVh0cFgrNHRMYkdLR21EMnlTdHByeThuT0xpSW15MjlsOUNhcGNKV3RpaUg2aXIvck94WktwWlcydE14SFU2bmE0MmRwSWtDSUlndlBMMFkvT0JWTDFXUzRQSnlkWFRMK0VTcDVxOU96ZmpwM0hWaE40Mll3cld0VHU1ZldrV0EvdjBaWHpRQ2J3VmRvOXpEMGMxRGRYK2VJZTUxU1R2VVBTKzFWZ3FnVTc2MUJvOGtpSDF4a2pLSzh0eGxOWml0UlN5NjlZYm05UjlyNlFrc0FLZFVQL0xPT0EwTk9rVk83WVJjUEZzQWtQUEZWZThBYTBlblBZSUp2NjBEMDFJRUQ4c0JyV3Z2dTJmU2s1bDM1eEZpS0k0Yk0yYTFaTkRROE8rQmV6dUh3ZHVXbkZjeWJ1Q3V5OXBrNXp4MU5xMFdsY2dRYWR6QlJLcXFocE4wa0ppMnluZlU1dk41aVk2SWxjdHFHZVQ0NWI1YWc2SFEzQUxOY0h1Y0FtMWpBUDcvVlFxMVh5QVBxR0IvSEswSE5Gck1LSEE4ZUp5RW51NE9oSnB2UU80NS9LTDNTNmFRaVpzOCtYK1VJVmw4dXp1SUFGQmNyYWtIRk1INEIxUVEwT3BEZUswWUNyRFhCZUFMcWdMT282SHI4dGNXSVIrc0JGMW1BRXZRenlqUHY0VVF6ZmZTMzZSY1pnM3RKK0hGRFR4V3BKc29lMGJrU1g1NEIySXp2ZlhGRmZxQ09qZmc1ck00K2d1R0FhbURLcEx3eGdRNzl2Q1hHMG9NQkVTRjludUdKeGFmd3lCdnNvK094UFBaM0R3N0VjZWVmajdaNTlkYkFQc3NpdzczQXdnVHJmVzFxSjFuOXN5bEp1anBEWjNsTFRSSksyaG9zSVZTQWdQRDBldmIvbUNFcHZvaUtvYTIrYzFlRFE4dGpiV2d1SndOUHJXSE5oc0RnQUJXUmIyMURodVhiYi9WSCtBMkw1OTZWZWJ3L1BiVDdCbC8xNCt6WktabGV3cUhpNDZsY3RIZTA2dzZlQXgvcjUwRTRNdUhFcWNJdGZPc2xJU2c2LzZCSm52ZlVIZXVnMDBtQUJDaWIxaUdJZWUrUWZGR2ZzNStNUmlWSlBuRU96VCtlbHExbjdNMFRYYktmajJIYkwyYU9nNXNUOUNXQ3A5eHRyNDhmN25LZDZmUWRIbU5leCs0WjB1cFpqNGpSaUprTGtIVXpzZWlNcE5Lem0rZW5lN3grMjVkZ3piWDE3VjVXa28rdllqam55K0FhZTluS3dQUGlSNyt5RUFlbDEzUFRsdlBFUHU5enM1OFBpemFLWmNTNmhIRWIxY2NZQnkweUFpK3JUVkdnL2NNWVh2bjEydTdMRXpoQ0FJZmUrNzc3NUp0SzFHOEV6OWFKRzA2M0EwK3ZXYlRWS0x4VlZMV2xkWDU4NXRLMjgza0tDYU8vY3FqOXkxS21wcmE5cHBlbXpGWm5PRllwME9SeE43eHlQdmZSYWs5dlo1M1NwcWc0WkhCNEhLaTdSK1VSdzRsa1ZHcFpNN0x4M0hNSGVmUTZmTndwYk1iUGFYMURJd2FUQVBqSW5uOStBTk5abE1PSjBTZm41KzNUcXV0TFNNNE9EZ2J2VUlQWk5qem5SOHJ0M2pqWEhTaFppT0hxUWh2d2pEd0F2UmV3c0VqNW1NcXV3d2VhdTNJTWFPWlBpamYwSGJoWDRUd2VNbVl6dXdscExNV2dZKy9VL0NZL3dBa2ZBcE0xQ1ZIaVF2ZlFPMWhiVUVqeHhMVUZ4azU1Ukgra2pzR1V1cDhSNURXSytXTEMrU3RRRjFXQ3hCY2ExcUFhVmlEdi96Yll4M1BFWlliTmVZWWFwKzJrUkRyWmF3NFFNUkdreUlmajBKN20xRUYzY0JJVkYyVHFXdlJZZ2V6ZkJIRnFEVk5JKzY2SlBYYU9nMW5jUXg3ZmM5OVJzd2pPRDRTRVZLbmFuT3JOTVpOUnJOK2syYk5sdHgxNDgyVW9rTGd0RFlXZDZ6azV3Z2lnS2lxSEwvaU80T1Z5cDNseXMxV3EwV25jNkxvS0NnRnZSZ3dqZmZmTzNSeTZCUnVOVzZtVHdhazNQTldDeU5YR3NPd2VsMGlySXNpemFiOVY2VlN2WHMvOUxrbnU5OGJHYzZ2djhWMkxJMnNQSHBINW44d2VOZGVySFpNcjVnMVNNL00rUGI1emluSGxsSEJWdXUrQXVEUHZ5VW9FQlJrVUxuQ05YVjFmOEtEQXhhaVl1enpTUUlRZ011RDYxTkVBU0hJQWlTU3FXU0dqbmJkRG92V2FmVDQrMnR4MkF3NE9Qamk1K2ZIMEZCZ1lTR2hoRVZaU1F1TG83Ky9mc1RIeC9mYklwNkJnemNaSkdOR2hwMnU4T3RFam9GZDNwSFUrblVuajI3ZlZVcTFjM0tVaW5vRHJUeEU1bmFSYUVHb0UyYXdlVmZMZWFjaDVuVXdZei9acmtpMU00eC9QMzlyN3ovL3Z0OEc4MVJkNFJVUmF0U0szZHVHdzZISzFKcXR6dXcyZXdlVVZKWGJsdGpJS0cwdEpTR2h1YlF2T2dxY3E5dlpYcTJ6RmxyajJ0dDRNQ0JOd0lLdVpXQ2N3dFJqYWhXaE0wZnlOY1cvK0NERDA1d0M3WjJmVzJ0T2R2YTVyWlpXd1FTWEVYeXJrQkMwN1pwV2VUZW1LL1dOaExxWnU0UUFPRzY2NjVWcVZTcUc1UmxVcUJBUVhjUkZCUTBvMWV2WHRwMnREYXhVV3Z6cUVob3lwMXREaVI0a2xJMkZzbTcwajhzRm90THNMbTBOVmVSZXp0Q3paT1NxRWxiZS9mZGQ2OERCaXBMZFBiaEl0VlRVZ29VL0tHMXRnSGJ0bTBkMHhXdHJYM05yVkc0TlJiSnQwei9BQkJicG5mWVd2alduRTZuTzIrdG1Sa1hFTlZxOVhYSzhweEx3ZWFuVElTQ1B6VEN3OE9udVFWYW85YW1waFVaWldNMVFxTU1hdWxyczUwMi9jUGhjS0J1ckFkdDFOWWE4OVdhS3d5YWZHdTRLYituQXFPcmEydXBzWXRFQmZyUXJndkVLWU9xZFFLQWs2S3FPZ3pldnZoNXFaVFZQUTJLMTN4S1ZiRVZNYVFYZmFhUDZkSXh0dndqbEJTSzlCamVwOHZYc1JjZklXdk56OGhBK01RckNJbytWNXFpaE9Sb1cwMHFxTlZucFN0V2l5dFY1Wkt6dDR4ZUYzV0RCcnd1bjJOZmJFUUNBbE12SnFKZjEraW5LN2F2UnRWN0hBRmgzbDIrVk1YV2RFcXp5aEYwNGNUUG5jTFpTdVdVR2lvbzNMSU5xMG5FZU9tbDZIVy8zWDQxbmRoTnJUV1V5S1NZTGg4aml1S0k0OGVQSmJzcHhCdUw0KzF1cmMzcE5rZWJORGFuMDRuRFpzRlVYNDlUcTRYUVNMeTh2RnJWa1RacWJTV0lybnJRNWdvREQyMnRUY0FBRUxScTI5VjMvZnNEcHIzMUxYLy82RXRHdjdTQ0hhV045WFpXbnZ2b0MwWSs5UjhTRmkzSHMwVFZZYXBnL2lzZnNlQ3p6Vno2NGxJK1BGS21TTERUUU9WbFFGTnpoRDJ2Zk43bFl4cjJmY3UrRDlaMnp5UVF0V2dNQm9vL2VaSEN6S3B6ZGorbjNubVlsU2xEV1ptU3pDZkdhRDRmTXBTVktVUForTVJIditxOCtSOHQ1c2lHSXkxZm5RVzcrUG1GLzNidlJLSWFqY0ZBNWRvUHlmN3hlSmNQeTM3ak1Zb09WWGZ2VWw1NnRHSTUrNTk2bmJOWGF1OWc5MDJYOE11bVE1aEx5NUhPSVR2SndZZHVvcml3NVFVcU55MGo4OHRkM1Q1WGJHenNSRTl6dEZXRVZHZ2RTSEE2blRobEdXdDFPZldWZFUwVkNXYXpwVWxyYzlXUmxpRTJVaEo1Q2pWM2hZRm4wQUJabG9YcTZxcUJna283ZThHc21XeC9ZQjRyNzc2T0IvcDdzV2pEd2NaSGtza2pMMlRWZ290by9lNWY5ZjJQMVBVY3pEY0xMMmZsTlVONSthdnRWQ2owTU8waWRNS2w5SnFjZW5ydHJLS0UybE9GT051WlAyZERIWFg1cGJTaDhaUnNtRTdsWURGWm1qNVNoOFVUUDNzV2dWRytwMzFnR3ZKUFVWOVN4YStoQmUxNTIzUE1PckNmV1FkVzRlY2R5S2kxKzVsMVlEOFRuN3EyZVhpU1M3TXo1ZWRncWJOMHJxRTRISmlPSGFEbVZEbVN3MEdiOXJpU2picWNmT3kyTG13eVF3UzlaczhpTlBFMHJlVWNOa3o1cHpCVnRNL2NhaTB0eEZ6VDBNNWExRkNiazk5aW5RS0hweEUvNHlKT0YraVZMQ1pxYzNLd05saTZPTHNTa2lPZnNuMGlTWXNlcFA5ZmJzRGdvVUE2VFJYVW5jcHZkNi9JQUE0TGRUazVYWm9ueWVHZ2V1Y1dURFUyMTV5M3UvZUsyeks5dUs5aGJXaFpjcUxSYUM3YnVIRkREdytOcmNrY2JmSzF1VnNPdUlRYWd1anREUm9WRG1kakxha0h0VkZkRGFVNTJSUms1NkgyVE85b0xwdHk0blJLU0ZLenhnYUlCb1BoS2hCSjh1amczalBJSDB0SkkvMlFtaUc5b3FBbXA4MFU3c2dxWk1KRll3RUlqdWxGUDhkV2RwWTV1U1JjTVVtN1k5THR2R29NWmVaSXZIMGxxck1iU0gzL0U2TDZ1SnJ1Mmc2dlpzMnN6V2lvd3F3Znh1UlBua2V2QmZPeExXeWUveUFxWXlMVzdPTkUzUDR2aGw4L3JzTXJ5WFc1YkprOUQ0dHZMN1J5Slphb1NVeDdwYmsvaiszWUpyWXVXazd5RzI4UjdQOHI3K3JJbDN5eTRITVNldFZSVmlSaHIzSXdldjFhTEovZXcvSFNrVnowMkN6QXdwYVIvWWo5T0pzWXpRN1cvZTFGTENjT1lqYzhSZlYzQVJoR3ptSE1QWFBjNW1nV1c2NmJpNjJ1bnVwU1B5YXZYMEhBR1ZyWjloUHJXSFhOMC9qMjdvVlVmaElwYmpvWHZmRWdXcmRneW43MVhuTFZLaXpabVVUZS9SS3AxNDhISkU2OTh3aTdsL3lFZjN3UXRmbDJSbjY0alBEWWpnZFJ2Zmw5TmovNEx2NzlFN0FVWkJIejRGSUdUSXpyOEppODkvN0I0VzkyVWx0VHhFL3o1cUpXQnpEcy9YY0o5b1dDOXg3aHB6ZTJFUkFYU0hXdWpaR2ZmVXBrbkd1eENwZmN6NEdkRW1MMkxwd2FiNnoreWN6ODVKK25kUTJVci9zUHU5OWVRMTIybVlwN3J1YUVRVVhQK1UvUmYvSUFBTXo3dm1iOXRjdVJLbjVCNm5NTlU5KytGeFZRdldNNVA5ejlQUG8rZlRFZCs0WEVmN3piZEF6QThPR3BZNEZUYnEzTkJySU5CQld5N0pSbFdaUkFscHhPV1JCRTFHcVg1aVpMTW9Ma2JKSCswVkJ5Z3IwcnZpUXkya2lKMUlDNnRXK3QwVkhuMHRhYVRkQnZ2LzFXSjRyaVZTMVgzY1I3TzdPWU0rbXlUcmFIbGJJNkJ5UDhSRjc0YkEzSm8wY1I3Z05sdFdZSTkxSGtWZGNOR1lhOHV3YXRyK3NCS2ZyZ0VmYS9zNUtvRjI1eHpYSzFscWxydjhTZ3M3SDdxbEZrZnIyZmxObUo3UDdyMzRoKzdETUdUZXlEVkhlTTc4YmVTc1hsV3dudTREbXIzNTVPVmZBVXJ2ajRNZGZidUJVOWpMT3VsSXI5aDdDZEpYdEtQckdId0JjMmt6cmNDQTRMVHFEd2RDWjA5QWltckZqQjhTZm1VaFgzZDFKdmJLbmRTcVVtQnE3OW1tQi9rZDFYRFNmMyt5d0Nwc2VmbVZzZ2FnU1gvcmdWalJyQXdyWXBROG5kUFovZXcxMHZFKzNnUzVuNDFEd2NoVnY1YXNKakpNN2FnaUY3TlR2L2M0eUxOMi9DejFlay9JdG4rT241OTVuK2VzZXRRTEtYdmt2Y294K1FQS00zSU9Ic2doYlY0K2JINlhIektWWWxYTTNJRlNzSWFzeGtyc3ZnNTMrdVovUzJyWVNINmNoLy9XNTJQZmMrbDczVi9IS3Eybm1VU3phdEl5QlloOU5pNmREZkdUSjVBVk1tTDJEcmhEaWlYdjJjWHIxYnBreWJIVVl1LytZNTFKWWMwZ2ZOcEt6aVhpSjhDOWw1K3o5SVdycVJYa21oMlBPMzhQWE1wNGlidUJ3M1ZTQStQb1pwOCtiTlc3RnMyVEtyeXh4Rkl5RGJaUkFGd2ZXZjRDS3p4ZWwweWs2blU1QWxXUmFjVG5jdHFic0JqQ0dBNk5temlJd01wMmZQQ05TTlVWQ1hHZXIwU1BGbzZWK2JPSEhpYktDNXo3eGs1L1V2VnVOSVNHVkIvK0N1ZW5VdzZEUm9SRUdSVVdlSW11MHJ5Znc0SFZORkhZN3FFcVMremU4YVE4cG9ERG9BTFNHamgzSDh3Q0dZQXFXSHpLaTJmczdlSFNBaklUdnlxY3F1SjNqUTZWOHErcVFVeEl6YjJISzNsZkRVRkhwT200YkJvekpNUDNRdWN3N1BQWHMzRm5NaHZZYTdUVUcxN2xmVkVhdmlrd2oyZHoxNGh1aEk2cXFyei9oY2dtamh4UE9MeWQ5NUFMdFZ3cHhUUzBCbERlQVNiT0VqUnJtR2JCeEdjUEJKS3JNc21IZHZBMi9JZXZsWlZ3djB5aFBVSFBUQzZYWWVuUTVoSTBieTR6TjM0RGh5Q2NHcFkrazU0WUl6SHJmbFdBYm1xR0dFaGJtaUNCRmp4MUM3TkwzRkdBSW16aVRBWGN1dDB2MjZhRU5neWhCWGRZZ3VBa05JRFpaYWNKYnZvcnpHaTZBdi8wUFZsNEJrUnF6TXBLWUs5TTBpSS9yNTUvK1Z1bXpac3MyTjVxanNNa2NkSUR0bEdjbmxiNU5rU1hLMjB0ZzhvcVJhTThVL2JhR2lwcDRDalJmcVJoUFU2V3lkNHRHY2tBdUlhclZxbHNmN21rOVhyV2FyR01mN1UvdlRlVjY0RjZHK2FzcHFuZnhseGtWQUEvK3BoMUEvdlNLcE9yWThXN29xVHE1ank2UExHZmZGZndtTERhYnE2eGZaOHJXdEl3WFBkUkpORUJIVHB1TGpYcWdlVTZmakcrL2Q0YlhVMGFsY3VtMDlSVnUzVXZqTlV0TGZXY3ZNelcraFBVZTNLdW9OcDlsSFV0Ty9jaGQ1U1FWUEIxWTNpaGJhZTkxbXYvb1ErYVVwakYyMkNKMjNtdDNYRFVPVzVOT2Z3WDA5cjVqQlJFMmQ2djU4S2oxdkRtZ3hsUGF1RlhYYjgxeVN0cCtpclQ5eDdMSHJLYnp1VlVZdFNEdG4yMHZyYy9hZVAwRThUZEdiZnpSUlU2YzJsY1QxbURhN2pWc2dMQ3dzRGRqV3l0Zm1tYkFydTFJL1hKUkdzb3dnT0oyeVMyYTUzR2hWbVlkQk5qSmdTaHJSUFl5SXpjbTR6dmJTTzVCbFdhaXFxa3dTQk9IaVJuOVordnIxZkZZWHdqdFhwalNwbEoxdG1aR0pSallmeXdhZ0xQY2t4OVNScElZcS9yWFR6bGh3Q09yeVhFd2Vjc3RlVklRYzJaZmcyR0RBUWQ2NmxvMUhUSHUyVVc4QnNGRytiUmVoQXdlQmIxL0MrcGhwcUFzZ2JHZ0tZVU5UQ0lpTFFXTm9Yamh0U0FoMUJTMGJxRGpxNnNBL25PanBzeGoyMHBPbzg0N2k2ZnUxWlcxbCsxMFBVMWwzN3ViQUt5Q0FCamY5czdQNEFKVkZMY21SMUhvRGxzcnlzL2VnaHdSaE90V1NicnFob0lDQUljUFFlYXR4Vmh5aWFHZExQcm1TSFZ0ZDgxVzRpNHFxM2dUSDZRZ1pQaHByMWlIMC9ZWTB6Ym1mTWFoWm1CbUMwRHFLTVZXMWxOUzJ1am9NOGNrazNMaVE1UG1YVVgzMHhCbmZpNjdQSUhRRnV5Z3RkUVVoaW4vWWlsL3k0Ri9OcUtQMjFXTXI3MW9FWFJVM2pCQnlzUnBpbStjaExncE5xN2VqV3ExTzI3QmhmWTkyQkp1cTBXSnNsRWVTSkNFTDRMRFpXblMyc3BnYUVQejljVGl0MUpkbm8yNFVhbTJyREpxQ0JvS1BqOC9semNaMENZczNaVkdyOHlMdFdWZW9YUnZhaSswTEp3RHc1TnNma0Y1c284N21ZTWFpSlNRTkhzYUhNd1l4ZmN3b3ZudG5GWmU5ZVpLYXFscitldmswZ3BVU3dOTUx0ckFSREo0Wnd1b0xSNkEycG5EeHQ2K2hIellWSTIremV1WmN0R0lkdXFDUWxvSWdTT0tIV1planBncUw3MFFtenhnRXdOQlhYK2I3K2RlUzkxWUNhbnM1OVNZams5WXZhU0xRN1hYTFBXeTYrVDYrZkY5SDNOOWZKUG5Lb2RUditJaU4vL2NKZ1gzak1HZG5Fbkw3US9oN3ZKU2Q1U2ZKL3V3clloNWJUTkE1U244TG1YZ0Zxbi9PSVgzbVQ2ajlJdEdGdE5SempKZGZ6OUZiSCtLYjFhL2dOLzU2eGo5NjdhKzZYdlRjQlp5WU41K1ZJOThrNHBxSEdIbkhOR0t1dVpYMUN4WlF0M0VnbGhyUUo3UmtYYkVmV00yYTJXdXdaR2NTKzlqL0k4QWJHRENWMUp1MnMzN0NPUHo3eFdJK2xZM2ZwUTh5OXA1TDNVOXlUd2JmZHhGYjAwYWc4b3RoVFBvS2duM2d5RU56eUQycHh6ZFVTOVh4VWxMZS90dVozNHp2SUZJZnVwanQweWZqSHg5TWRiYU5rWjhzK3RWcmtuRFRRcmJmUFpOZi9BM0UzUDBTQTZjbmRmQ21NSkw2MmtOc3ZXa0tKK0w3SWxlVllnbEtaZnBIaTlvSTJHSERocVVDdVo3Q1RaWmx1K0NLa0VxeUlMak5VUW1WbHc3SlZFOVZ0Z2xiWURqYVdDOTA0VVpxTTM4aXEvd2tKWUlPWWZEZ3dlNytCbVlzRm90Z3RWcXgyKzJDdytFUTNDRlhsZFBwMkFQMFB4dTJWVWxWUFhxREFUL3Q3Nk90bmUrMFJaM0RnU2svSDFWZ0JEcERXNytJczZHT2hsb0xQaEdocmN3ZGlZYkNmR1N2UUF6QlhaTkVrcTBCVTNFNW1zQXdkTDY2MzJXOVpKdUordEk2dktNaitMMzBlMmRESFEybE5YajNqRWJWenN2WVdsYU1wUE5ENzl2U3ZKY3NKa3lsRlhpRlJhRFZkVzBQMkdyS3NOWlk4VFpHb3pvTGxDWk9VdzBORlNhOG80M3RqdjIzY2FuWU1PVVhJL3FIb1BkdlA1bFpsdVdqb3FpNkE2Z0g2bkJSR3BrQmk0QmdGMFRCS1FpQ3BGYXJaWTFHSTN0NWVhSFQ2V1M5WG8rM3Q3ZUwwc2hiajQ5V1QxalBIaTZOcmRrRWJkYlljQ2ZJbVV6MWFXZEhxTGtjSHVHQlNyblFyelFHTUVUSG5sNzk5L2JGMTl1MzNibjNOdmJzM21wcHZmSHQyZk4zdlZ0QmE4QTMydkM3amtIbDdZdHZCNmthWHFIdFZ5cUlPZ08rUGJzM2RxMS9LRnIvc3poMmd6KytCdi9mZDh1S1dneWQ3Q05CRVBvZVBKalJkK0RBUWZ2Ym1LUElUbVFrUVJBRVNYSnBiWTJCQk04NlVvY2tJMm5WMkd3V3hNYkdMTTI1YTgzK05VRHc4dks2VEJFbUNoUW9PTmVJajQ4ZjBjb1ViYzM0UVhPWmxZU243UElza0xkYWJZZ2V2alhCN1ZzVFBCeDJvaUFJMDVVcFY2QkF3Ym1HWHE5UG83bjZvTjBXZmE0ZnFaSDVRMmloc1RWMXRySTFhbXlTUitEQXBha0JndG5jTUJXSVVxWmNnUUlGdndHTVI0OGVHVWpMOHFwR3hvL0cxRE5Ca2p5TDQ1czF0MmIyanliQjFvWnp6ZVhlMEdxbktuUDkyNkswdEpUOC9BSmxJaFQ4S1JFVEV6UE1VMk56bTZPcVZ1Wm9DNjQyTjRWNEM2MU5kQWNNbWxTN3hnUGRacWdpMkJRb1VQQ2JRYWZUalcrbHJiVm5qcmFRV2EwRENYYTdIZEhUREczVTFBQ2hvY0Uwb1gwejFNbk9qTU1zV3JtQmU1ZHY0djE5dVI3MEt6SlplWGw4dW0wdnIyNDhTSzNIVVE1ckE5c1BIZWV0alR0Wm5sbWlyT0J2aUVQM1hjR0pIY1hud1Vna2ZyNTZQQVduL2poemF5dk5wYnF3NGd5UHJtUGJaWmRTMnFYRGJWUmxITUorRmhoeGFqY3RZY01UUzgvcVBNZ05GWlFleVczeitjL1hqQ1V2cDN2bWFFYkdnVDRlV2xzTGphM3hweVZYbTlRbVFpcTJNa1B4TUVNbnRyODM2L2hxYnlGOVltUEV6UktVQUFBZ0FFbEVRVlM0dEg4VW03ZHM0UEVmR2tkdTVyMzFlemhTWE1KYlAyUzJFR3lsZVRtOHN6ZWIvYitjNUl0amltRDdMV0V0SzhCdXRwMEhJeEdKbnJjUXY4QS9rT3RnMVN2c1diTCtqQVc5cFNBUFIxZTZUVlBPanF0dnBOcDhGbDR2cGtvYXlzNHUvNTZVK3dNYi92cGltODh0ZVRuWTdkMDdWNjlldlpJOU5iYlRtS040bXFQTldwdExzS21ibzZHTlRCNHVNMVFVeGZZRm14akE0aHNuTmYwYTJGREdYL2Jud3RoWXdKdG5icDRKTlRsOGMzQm5TekdjMEo4UEV2cXplc05hUHFoVGhNMjVRUFhPZEk0dlg0OGREUUVqcDlIL3l2Rk5TYnEyNHFQc2UreDF6RlpmRXY5Mk55RkdYOEJDM3JJUEtkcDdGTHRkVGZDa1dmU1pub29BVlArY1RtV2xub1k5RzZpcEZJbTc2WGFNU2U0aWRVY2QyZSsvUStIK2szakZENkgvd3B2dzl1NDQrOU4wNkFkT3JOb09vaGJ2MGEwRWI4NStNcGQ4Z3FuYWlpRitDSDBYM3RBNUEreHB4bEN6ZHcxRkJmNzB2WFFFQUpXYlYxSWxKUkovVVJKbDZ6NmlRVzJrY25NNkZtY3dDZlB2SURUVzMvMndsM0w4blhlb3lDckJrRFNPL3JkY2lWYmRxSTJVY2VLOTl5ZzdVb0JYejBRU2JyNlZBUDlxTWw5K240bzlHZFRWbGJGL2NUWkNaREtEYjNSNWJ4d1ZXUng5OTBPcVQ5VVNNUFl5K2wyVjVrNHd0cEgzMFZ1YzJubVNnTFRKZEVVQnEveCtCYWQrM0kvWlZNT0pGeFpUb0JXSm5MT1E4SGgvMS9tV3ZVdmVqcU9valFra3pwL2ZWTmplc1FKWXpiR1huNlU4dTRySVdUZlRhMHkvSnMwdy8vUDN5UHZoRUtxSVJCSVhkbjYrM0E5ZW92TGdBZVRpWFBZdFhveWdDcVQzM3hZMmtTYVlUK3hrOTVKUHNYdEZNK0NldS9Gemw3Qlk4ak00OXM3SDFGVTdDSjE2TllsVGhpSUEzdDdlSTREUFdwdWlqZVlvc2lRNUpVbkE2VVFscW1WSkl3bE91MDAyMWRSZ2t5UXNYdDZJalZMUG5aU0xMQ05VVmxiMHA0dk5XbzZVbHBOb0RGR2t5dThNdVdRbkcrWS9UK2pNYStsejNSVUk1cG9XUklBbmwzOUY2Q1d6Q2RCbHMvWEIxNXBNb1pwQ08xR3pyNlAzdkdrVXZYSTdCOWNjQTZCbVZ6bzcvdlk0bXBScHhFN293WTZycjZXaVJnSWNaTnc5aDE4eW5TUXNtSStQZVE4Yi8vcnZUaDlRVFhnc1lXbWpLZm44VlZxU2JUU3c4NmJyY2ZhNW1IN3piOFEvUU1MYTZSdis5R1B3Nnp1SXdsZnY0OFR1UW14Wlcvbmg0ZjhRTUNqUnBmT3MvNHdkRDd4STRPUzVHQk1kYkxuMlRzd09seFd5ODVvWmxKbU1KTjUySXh6OWpCK2VXOTVrb2Z3MDd6SUtDbjFKdUcwKzRiMjhxTTJ0QkxVdndlUFM4RThNUXh2ZGw3QzBOTUtISnJwdktaOHRNK2ZRRUpCQ245dXVvdjdiWjluOXdYWUFTajU5bGwyZkhpTHVwaHNSOXEya3JMRHp5bjVkM0VEQzBsSlJhNzBJSEpOR1dOcDRmSUpjbklpRlN4NWoxNmNaeE41ME13R2FrNnlmZDErWG1IbnIxbjFLUStTRnhNOGN5YUU3cnlMM21JdEVNK3U1djdCL1ZUYXhOODBuTkt5VXpkYzkxT241L0llT0lXUllFdmhHRUo2V1J0aTRDOTAwVHk2dE5HZEZPc1paMTZBdDNjSlB6eTl6T2JSSzk3TnU1aTJJZ3liUlo5NWxGTDU4QjRjM1pRR3VaaStyVjM4WDJaNmZEVmtXWkFSQkVBUVFhSEtqT2UxV25LalJCSWVpRGRDaGJsM3dqcXMyZEh4WEhxWlQyWWQ1ODdDVGQrN3NwMGlXMzl0NzFWQ0p3NkZIYjR3bUpENkNrT1NXMzhkZGR5ZlJJL29qUjExTnh1VWZZQU8waERMZ3J6ZFJzWDgvNW1vYi9vUGlLTjkxRUthNCtpWUVYSHdOZmFhTUFrWVJ0K0k5Y2pjZEkyaFVKY2MyT3BtNDZ5NThOQkIwOTcxa3BWNUxWY085QkhkQS9hOE43WWt4MU1ndmJUUTdLNVpxSzRGaFlRUU1TQ0o0WUhMblFyeDBad2RqTURMeXRhZFpjOHR0NUJocTZmdmlSd1NITnBjelJjNWJTT3lZWVRCbU1Ma2ZEaUIvYnhVeDZ2WGtsdmRuNXIxWG93TDg3NzJEcjJlOGp1WFJPWWdacThrcFR1REtyMjUzTVpza045ZEdocWVtWWo4VVFaazJIbU5xTXlkYzFmcmwxQmluTWY2R2k1R0JRWGZkeUtwRlh6SDh4bEhrcmxoSjc3OStqZkdDT0l6OTcrZkVoMWQyZXIvZVBmdmczZE1YalVaSFNHb3FvWVptb1pHOTRpdjZQdlE5eGdzaUlQa0pjcFplUU1HSmw0anIzWEVKbCthQ1MwbStLZzBCNkRmek0zTFRmeUFtZmpCSGx1d2llZE9QaElhb2tmdmZUKzdTRVJSbE9ZaUpQMzE5VjBEU01IeFYrUWlHdkJiejBJamVDLytPY1dnZ2dmWlpySHJPVlY5ZThQbjdhTWJmU3Y5cG81R0FnUXV1WU1meWRKTFNYSngxS1NrcC9ZRThUM05VRUlTbVpGMEVRVUFVWlVIRXBaaHB2TkQ1YW5BNnJOZ0ZMNWRnYSt6dTN2aWpVcW5HZGpiWkZVVTVMUGo4QUl0dW1FbWlRYWxtLzcyaGlwdkV5SHN5T0hEbkhING90R0s4NXUrTWVHQnVVMzJsVjZDcjVGM1FhUkVjRGlUQVdaSEoraGszNFQxeUtnRVIvalFVMXlQNU5GTlNlMGVFTnYyL1BqU002c29TSEtYbFdDMkY3THIxeGlZYUhxK2tKTEFDM21jeThrQ0d2Zm9NKzE5OW1DLytua2ZBaU1zWThjcVQrSGF3cHh5bFJSMk9RZGRuUERHSml6aGVNSmp4bzFvMkdOR0hOZEovYS9FMit0TlFYazJEc3hpcE1vTnROOXpZUEtvQjhVaUF0YkFZVFV4OHQraWE2b3Z6Y1J6ZHc1WWJtdnNuQlBjZTdqcGZhUjFCWVdGdVZTd0NROEN2S1FnMVl5azFvMnUwbU1SQURHRmdxNndET3VaSTFJVkZOYmtwZE1Zd0dySXFvYVlJczluTW9YdHY1V2pUbStBQ1ZOamM4dVhNL0tycVFKZFRWYVZSSVZ1dHJwRVhGV0Q2OFFpYmI5amNyUGtOYVM1eUNnZ0lTQVkyZUdocnJoOEJBVmtXSktkVGtKMlNJSW9xSkVtU0hlWmFvYWJVS2h0OGZCRjB0cllhMjczMzNxc1NCS0ZEM3VpNmlnSnUrV2diZDg2ZHdiZ0liMFdxbkJkUTAvT1dCK2w1eTRQWVNqTllOMjQyUmRmT0pkcllnZTltNHdvY1EyNWc3TDl1QitENEU3dndERmcyRkRjMzNER1hsZUoxWVRqcU1BMWVobmhHZmZ3cEJ2WFpHWG5nbUZsTUdETUwyVkxGam5tVE9mN2RIRkptbjU0MVFoMFcyZUVZeXI5NWtkenFJY1QzK29XZlg5L0FxRHVhM2NYbTRrSWdCYkRSVUZoRFpFZ0EzdW9JVkpHcFRQanN0VGFGOWpaakJQYmNuZGdrbXVqQVBTRUlBbktyN2lrK0VkRjRwWVF5OGIySDJ3cVVjSC9NcGFWQUhGaUtNVlU3dWl3Z0JGRnExZHRCank1TWo2V3dISHBIZ0ZTRnFSU01YYUJic1pRV0lMczFHVXRoS2Q0UlFlQWZqdDdnejVDM2xoRWVlQWJLU2plNnlPZ2pqZmhmTkpPSlQ3ZlB5S0xSYUVZTUhqeEljK0JBUnF0RVhVRjA2V3VDZ0N6aHROdVJOR3JzWmdzYW4yQjBZZjdvdkhXb1c1bWhQUG5rRTZPQjAxZk4ydXU0YzBrNnV1ZytWQlprczdRQVZQb0E1aVc3aWx5M0h6akV5WXB5ckU0elgyN1BJQ0U4a3FrSm9VZ04xU3c3Y0lyRHA2b3B0VWtzM1FHcEEvcVI2S2RSWk5KWmdDMXJPMGMyRlJDWk9nQkgvazZzMmhoOEFqb3hjYUo2MExBbm5ZS2ZSMFB4TG81OXV3Lzk5RXVhZ3hGclArYm9ta0g0T2c2UnZjL0ErRmY2SVBoTDlCbHI0OGY3bjJmZ0RSY2pWeFZTc0NlUElmZmQxaUg3UnRYKzdaaHFySmhOVGlwM2JrRjl5b3VRMUJIb2RLVWMvTmNLZ3NhTlJFc2w5YVYyZ21QQ094eTNFSlo2MmpFNHM3YXo3UjlyR2ZYTk40VDRsckYreWh4T3BQYW45MUNYaEMvNjVDMXlVaU1Rc2xkVFlyK1FZUmNFb2hXbjB0UDNSYlkvczRRK2w2YmlLRHhHU2JiRUJYK1pqWGJRVkdJai9zMzIvM3VEL25QSFlzdmRneHc1aVo3dTgvbkg5NlhxZzY4NE9UUUliV2dNMGNQN0VUaHBEajR2WE03UGIvWW1ia3dpNXF4RFZKdkNHRFJ2SWpGenJtVGJxNHNKQ2JtZHFxL2VvTDZyY28wUUFtSWNuSGh6S2Ria1NBSlNSdU1ickNOdTFreCtldkZKQW53WFVyL3BBMm9pcGhIVnUzUDkwcjQzblgyZlhZd3hvb1lqM3h4bHlLZmpRZTFMdjVzR3N2dXVoMG4rNnpXbzdlVVViZHBQd21QMzBCbUJ2eW82SG4zQk14ejZmQlgrZ1VHRWp4L1ZGSHhwRDFHemIrVEFKWDhobzM4SXhnRkc2bzd1eE9xVFROOUxoalVwY08rOTkzNnZsSlNVUXpRM1UxWUpJQ0lJSXJMc1JFWkFGR1JabHBGRkFidTVGbHVEQnJtNkZKVmFyUmJjaWJrQ0lENzExSk5YaTZKNGVoK2JaS2ZLcGlMY29NRmlkMkN4TzdDS1dvWkhCd0Z3TFBjVWVWWTFRMk5Ed2VGQXJmY2xLY3dYMlZyUEQ5bGwrUGdIMGkvSUc0dmRRVlI0QkJINjM1YU14bVF5NFhSSzNXNUtYRnBhUm5Cd01DcVY2cHdlYzZialEzQlN0V3M3UlpzMlUxc3FNSERSMDRRYW03ZWpiNzhVRElIdTZKWW1nTEJoL2RIMUhFeGdVQTA1WDY3QmpKR2syMlpqNkpGQVlGdzROYnZTY2NSY2hMNXNENlhIVFF4OCtwK0U5L0FGUk1LbnpFQlZlcEM4OUEzVUZ0WVNQSElzUVhHUkhYTG1sNjFiU2RYeGZIeVRVaEZyQ3pFWGxPQnpRU282THpCbkhhQm8weWJLRHVjUWZjdWpKSTVONkZSN09kMFl5cmR2Sm5UMlh6RDJqVURRQmhBNW9pOFZod3NKR1JoUHhmcFAwSTJkaStQZ0pxcktmRWg1N2duOEEzUWdlQkYxMlV4c1I3ZVR2KzRIVEZWMndzYU93ejhxQkFRdm9pK2JnVDE3Si9scmY4RHFDTUE0WVFRNmI5ZFRxNDBkVEVpVVFQWGg0MWpNV3NJSDl3YU5IejFuVEtMdTU4MFViTnlLMWFvbFl1eDRmTU44TVF3WWdhK1lUKzQzbTlHTm1VMU1TaStDaGc3RnExTlpKQkkrTVExYjFpSHE4L0xSeFNWakNOTGhlOEU0Zk9RQ1RxMWFqODBRei9Cbkg4YmczYmtxYlJpZWhsZkJ6K1QvbkVYQy9jOFNrK3dTMUVHakw4RkhLQ0l2L1R1cXNvcnh1MkEwWWYxaU9pY2k5Z29uYW13L2FqSU9ZUzZzeG45NENvM01aQUhKSTlDN0RUdkJONXl3UVFtSWhraGlMeGxCeFpZMUZHNzdDWWNZVE9UWTBYZ0hORnVBZXIwKzY3bm5uanVCcTkrb0hYQUk0QUNjZ0NRSW9peXFSRmtRQk5SZU9sU1NFNm5CZ3RvUWlLRFQ2VVJQN2pXSHcvNk5JQWlUL3FpYXpmbk94M2FtNHp2YnlIMzlkckpOa3hqL3dPVi9tTFUvY3YrbG1GS2VaT2pjRkVYRi94K0F3K0hZb3RGb242V1pvNjFlRUFRVFlCVUV3U1lJelJ4dFdxMkxvODNMeThYUkpyb1RjcEZsV1pnOWU1WktFSVFSeXBRcThBcUx3eWNpNkE5MVQ3cVlSTHhERkovdy80elhXSzBlR2hNVDB4dzRhTmxNV1d4MG43bVNkUnQvWEtscmFzODBqM2ZmZlhjWW9QVERVMERFN1B1SitJUGRVOXlkTHlvTCs3OEZuMlhMUHU0NWF0VG9ZelQzUUJEZGFSK05wVldDTE11eUxEZm40MHFTMUt5eEFlaDB1cUhLWENwUW9PQjhRZS9ldlh1NWhacG4ya2VqWUtPbHh1YnExU0pKVXN2Q1VwVktwVGdmemlMQ3drSzdGVGdBTUJnTStQbjVLcE9uUUFIZzcrL2ZwNVVaS25yOENLMDBOeVRKUldtazlxQXBFZ1JCdUVDWnlyTXAyTUs2Zll6QllGQW1Ub0VDTnpRYVRSSnRmV3lOeGZCTlRCK2VSZkdlR2hzblRod1BBeEs3ZXNIcTJscHlLK3B4bkM0bno5bTJxYXpWYkNhM3JCcXpRMVpXVElFQ0JaMUNFSVNFRjE1NDNxZWxZSk5ibTZOQ2N6NnVSL0FBRUl4R1k1ZUszcEhxdWV1VkZleTFhd24zY2xKbzEvUHY2NmN4SWt3UFdIbnVvMi81T3F1Y1VpbUFMVTlkUmJUN3NQZFhydVNOekRwNkJIaVJWMlZod1JXWGNPdUFNR1hsRkNoUTBDRW1UWnBrQkNwb0lweEVGQVFFRDgwTmFQYTF5YktFdXRGRzFXaTBYUk5zb29ZRnMyYVMxTU9WMXI3eXUxVXMybkNRMWZPR0F5b21qN3lRV3llYW1mam1uaGFIalVnZHhUVXp3OUdLa0g5MEQ1TlhiT1B5QVZkMFV0R21RSUdDUHp1aW9xSjZBcGx1UWRhaWN4VnRvcU11NFNhNkpaMmdVb2tEdW5ZWnJ5YWhCdEF6eUI5TEU4K01taUc5b2dqV3Q4MTg3aHNWM2xSckZ4YmtoK2l3WTVXVVJWT2dRRUhIOFBIeGlmTVFhcTFiOGpYbHNyazdXQ0ZKa3RDVTVDWUl3b0J1WDlGdTRyMmRXY3hKN2R1TmcyUSsyWHFRWWNPVE1DcWtJQW9VS09nRUdvMG1vWlZRYStGamE1Mm9LOHR5VXdtWUFIU1BWRTJ5OC9vWHEzRWtwTEtnZjljTnloMC9iK1hqY2o5ZW1EUkFXVEVGQ2hSMENsRVUrM2hvYVc2aEpudWFvOUFpZ09BU2JFSnBhVWtpNE5YMVN6bjVkTlZxdG9weHZESzFQMTFWdkE1bTdPS3huMnA1NTdvMGdoVlNEd1VLRkhRTlhpdFhmaEhpSWR4RVdhWUZoNlJuQUVHV1hla2UrUGo0SkhUOUdqTHA2OWZ6V1YwSTcxeVpncjZMVXUzRThRUDhmVk1CYjl3MGhSaHZ4UVpWb0VCQjE5RzNiOTlRVHArazZ5SFVYT2FvR2hEVWFuVjhsNjlnTG1IeHBpeHFkVjZrUGV1aStkV0c5bUw3d2drQVBQbjJCNlFYMjZpek9aaXhhQWxKZzRmeDRZeEIvR2YxRGdvclJhNTUrVVAzaWZTOGQ5ODhCdXFWUlZPZ1FFSEhDQWtKRFc5cmpyYlUyanpNVVZrUUJFSHZjTmhmRmtWeC9wOWhnbjVMMmlJRkNoU2NIWmpONW1YZTNvYWx1T2lMNm9BNk40V1JCYkFMZ3VBUVJWRlNxOVd5UnFPUlJRQkJFR0tWcVZPZ1FNSDVDbzFHRStuV3lzVFRtS0tlYVIrdUx3UkJpRkdtVG9FQ0JlY3JWQ3BWOUdtRW11QWgzQUFaa0p1K1ZBU2JBZ1VLemxzSWd0Q2psY1lteUhLTGxBOTM5UUhJTW9nblRod1BCM1RLMUNsUW9PQThodTdmLzM3SnAzT056V1dPaXNIQndaSEtuQ2xRb09COHg4Q0JBLzA4QkZtYmRJOUdvU2JMTXFLWGwxZjRtVnprVEdpTHpPWUdjc3VxTWRuL1BMUkZzdVJBa3BTaVdBVUtmaTBpSWlMOFRxT3R0ZjVCclZLcHVpZll6cEMyNktPdlZ2TG1VUlBodmxvS0swM2NPR01xQ3dmOXdaWEZ3azBzVDc0ZVZZOElaSnNGcjdnVWhyLzRFaEc5T3k5Qk0rMyttZ1BiSFl5OCswcGxSeXRRQVBqNys3ZlcyRTVuaWdxaUtJcWgzVHE3bTdabyt3UHpXSG4zZFR6UTM0dEZHdzY2djNUUkZxMWFjQkd0eWEydm5EcWQ3UTlkeDhvN3JpTDkycUc4K3MxUFZQd1pWc01ya1VsN2RqUDc0SDc2RG5Hdy9mLytYNHV2SFRWbDFPWVhJN1hROGlUc3hkbVVIdndGeWRFOWpVOEdjRmlveThuQmJwUGM1M045WjZzcW83NjBwczB4OXBveWFrL2w0N0FwbXFXQzh4ZmUzdDUrcHhGcVRkVGdqYVZWYWxFVXUwbUo1a1ZTaitheTBwNUIvbGhLV3RJV1VaUFQ1aWk5UjBkWUNWQ3J4QTRiN1A3eG9DWnNlQXFXelVkeEFpb3NISHY2TGc1dnlNTS9WRU50YlJBVFBsdENRR0FkTytmZlJzV0pIQnJLSk5iTjNRVUJTVXg0OTBtOEtDUzk3K1VNMzdPVFVBTlVmcm1ZYmVzTlhQYkdYMTBLNHBMN09iQlRRc3plaFZQampkVS9tWm1mL0pPOU42VlNJUXhCTmxYVGNEU0RpTCsveFlpYnh3S1EvY0pDOW4yVFMyQnNFTFcvbEhQaHFyV0VOKzBJQy92L3ZnRDFSWGVSTkYzcDg2UGc5NFZXcSszVXgrYlcyRkFMZ25EbXpTTWJhWXNtWGRhbFAvOXB6eTVlM1pYTnlRb3IvNWgzS1VGL2h0V1E2aWpldElscVN3MG5YL3VDdUd1ZVFnVlViM2lQakIwYUx0dTRCaTgxNUx3OG4zMXZyV0xDdzVkejRic3JxUG51VlRaL1pXWEsyL2QzNjNKVk80OXl5YVoxQkFUcmNGb3NUYXV1NlRlVkNRL093TEo3R1YvZXU0emhONDlGUlNsSGwvekloVnN5TUlZRERodk9GbVc4RWpXSDl1RTFzRnA1cWhUOC9xcUJXdTFIeDc0MW9WbU5nTUF6ZTJDN1QxczBzRzgvbmpMR3NHM3ZIbDdkdUorTGJoM1BINzUxaVZSTDhhcHZFWXFQVWFNZnl1UWJKZ0pRdG4wN0drUXlGLzhEQ2JEblZsQmxQUVQ4dXM3ckFSTm5FaERzeXQ1UjZacXplTUtHREFaQUZ4Mk5XRjJOSFZBUlJNU0lJSGJmZGdNOUo0MGxJdTFpSWdaRWV5ci9qRnVmb1R4UkNzNExxRlNxZGt4UkdSQ0UxZzRaRWZEci9pWE9qTGJJWVBDaGQyUVlOMDBkalYvK01YNnMrQk5FUjlWUkpQLzdKY1orc29wZWtjZlk5VnA2MCtRYmtsS0ptanFWSGxPbjBtdmhJNHg5L0phdVNNcm01V3NuSkszMWFaOVZRRkM3VjBsc2FSNFBlWGNkby83dkZyVDJBclpmT1prVGU4dVVKMGpCZVFsUkZIMW80MXRyV1ZMbC9neFJFSVJ1Q3JZem9TMlNLS294TmYxV1dWcE1ua05Mb083UDVHVVQ2WGYvQTVRc2VaN0tHb25RVVNPcHpUeUJmM0lLWVVOVENCczZHRU5Rcy82cTlqVmdMNitrcGVqeXhjdW5sb2JDQnBmV3QyL1ByeHlURFp0SkluajRXUHJmOHpnSlk4T296U3BwOGYzaEorN20yQVpGYTFQdyswTVFCSjlPVE5BbVhqWTFkTk1hUENQYW9yNjhzdlF6dHB0MWhPcEZjaXRNekpsK0VVUC9aQzAwTmJGcDlCMy9MQWYvazg2NEIyNGxhY2ZkcEkrYlRFQ3ZjT3B6ZnlIcWpwZEl1V3FFUzd0Tm1Vb2tOL0xOdUlsb0lsSzQ2TFBuME9GTDcrc25zWFBXeFJ4TENFZHJFTUhuMTR5b2xDMFhYNDdUbUlpV1NtcnI0MG1iM04vamV6dkYzMzZPTm13S2ZTWU9VcDRzQmIrM1lEUFFzdWk5VGFvSHpSSk9LZ0NNdjhYQVRBMG1LaXdPZ24xOU1XaCtIN0xKODQyMnlHbXFvYUdxRG4yWUViVzJhM05pTFN0RTBnV2c5L1UrQ3lPUU1CY1g0MENEVDBUb255eFNyZUIvREVXQ0lDNEVUTGlvaTJxQmVrRVF6SUJWRUFTN0lBaE9sVW9scVlIZmpPclI0RzNBNEsyc2ppZFVCbjk4RGY3ZE9zWXI5R3kraDBUMEVVWmxJUlQ4TDBEWGdSbnFBVmZ3UUdGT1ZLQkF3ZjhDV3N1cWRnME1XVVlSYkFvVUtQaWZFbXh0QWdidENiaEcvbkFGQ2hRb09OK2g2a0JqYXlIZ0dzc1NGSndESERwMEdKdk5wa3lFQWdWbkIySkhXbHA3ZjZoQWdRSUYvd3NRT3ZrZFFCQ0JibEk2T05tWmNaaEZLemR3Ny9KTnZMOHZsMmFkUkNZckw0OVB0KzNsMVkwSHFXM3ZjSWVKOXpmK3hKYjhHbVdKT29LdG1NeC9QVWZlL3R6ZjVmSy92SFF2NlpkTVl2bm9HMmc0aDljeFo2U1RQdjFTVmc0Znd0SHY4My9YS2EvUE9vU3BSdEd3ejJOMFdWYUpnTE43cDY3anE3MkY5SW1ONGRMK1VXemVzb0hIZjhocDNLYTh0MzRQUjRwTGVPdUh6SFlGMitvdDIzamp4d3kyRk5RcXk5VFJRN2JqYXc1OXNKVDkvL255ZDdsK3dqMHZNdTJUNXhHcktqbVhoVy82UWRPWTl1MHFlaVY1NDdEK3ZyUkpKNTVaUVBiT1ltWHpuYjl3bmtaYmE2TzFxUUVib09tNmxSdkE0aHNuTmYwYTJGREdYL2Jud3RoWXdKdG5icDRKTlRsOGMzQm5tME5yaTdOWld1akQ3RGp2YzZvRi9CR1F0M29OdmU1OWlQeVhQNmJXOWpmOHVoQzdydDZaenZIbDY3R2pJV0RrTlBwZk9iNXB4VTFIdG5OczJUZVlheVg4TDd5WWZsZFBSSVdGdkdVZlVyVDNLSGE3bXVCSnMrZ3pQYlhUSk4ySzdhdklYZjBqRFZVbWZBZU5vZTlOczJsa3BhcmJ1NDdTbWlDOFNuNGlkK3RSZk1aY3dlQzVhV2Y4Z2k3NWJpblphM2VCWHhUeHR5d2tOTmJGMlNBM2xITHM3WGNvUDFHRWx6R0dYamNzSkRqYXhRSm9PcnlWSXgrdXhHb1Y4UmswbHY2M3pPaHdnMXV6ZG5GaytRWktqcFlqcm5nVHh4NC8vRVplU3E5eFNVM25PN2IwSzh4V0xWRnpieVEydFE4QWhWKzhnMndjUk9sM0t6RmJmVW44MjkyRUdGMWpzT2JzSjNQSko1aXFyUmppaDlCMzRRM29kUjNmRTVnNDhmcFNncWRjU002U3BWZ2N2dlQ1Mi8wRUd3M0tBK0cyWTdxanNmMHEzZnRJYVRtSnhwQXU3RkViejMzN013dW5Ec05MU1cvdlpLNnF5RitYVGVUVU9VUW1scERmQlMxQ0x0bkpodm5QRXpyeld2cGNkd1dDdWFaSjA3SWNXY09hZVErZ0czb3hmVzZhZzFEVzZENm9vNmJRVHRUczYrZzlieHBGcjl6T3dUWEhPcjFXWFZZdWdXblQ2YmZnZXFUTXovamhtWSthdjl1M25yMzMvWTFUMlY3RXpKcUoybEYzeGhwZjlZYlgrT0haZEtMbTNreGtuSk10Vjk1RXJmdU5lUHpaMjhrdkRLVHY3UXVKSE5JRFM2VzdGdG1Xei9mejdzSTdiUTU5YjVtTEhoT09UcTZqRG9vaUxDME43eEFEUG9NdUpDd3REZis0OE9hNXUvNVJmTkpta25ERk9JN2VlejNaQjZzQUtQcm1YWFkrOXlHaGw4d21RSmZOMWdkZmM1K3hnWjAzWFkreno4WDBtMzhqL2dFU1Zudm45d1Ftc2w1N2tSLy83elg4UjE1TTlLZ0VMT1YxeXZOd2VzRW10L3EzaGNabTVneXBpMDVsSCtiTncwN2V1Yk5mcDMvNzg4NGRWUGRJWm15b2xuM0tBblVJYThaR0tueFNDVGRxa2RMR2NHVHRPdnFQdWI1aldkaFFpY09oUjIrTUppUStncERrNXU5eWxyNU42SFdQMG4rR1MzTUtTUjdtL2lhVUFYKzlpWXI5K3pGWDIvQWZGRWY1cm9Nd3BVK0gxNHE5L25acWoreW5wcUFjLzZUK0hGdXhHN2kyK1cyWmtNYUloMjlEQUtKL3hUemtMbDlCM08wdjBXUEVCVEJpRUlVckI1SDNVejREMHFLeFZsYWlpUXJCTDc0dklRT1NQTForTlZhVENsMVlCSUdENGdnZU5LelQ2NmdDalJoVGpaU0U2TkVrRHNHWTJyTjU3dDcvRDJFM1BFU3ZzY09RZ2I2emg1R2R2b200Z1M3SzlyanI3aVI2Ukgva3FLdkp1UHdEYklBV0s1WnFLNEZoWVFRTVNDSjRZSEtYN3NuMWlKcnBjKzl6eEE4TlZoNkV0ckIwUjJNN0k2dXdvaWlIQlo4ZllORU5VMGswZEJKY3RWWHdqNDNaREEzWHNQN3dTVTdXMk1rckxPWlFoVWxacW5aUXVHNHRHcjJGbzYrL1FVVmVQV1ZyMTJMdDdPR01tOFRJZThaejRNNDVMQitjeXJaL2ZkcmtrREFYRk9BYkY5ZldZVkdSeWRxME5ESlhyS2ZxMEdFYWl1dVJISjN0SFJPN3I3K1lINS85TDVYN0QxT1hYWVJrczdWNFpmb21KcDZWbWxOTFpTWGVJV0ZONzJCOVdDQ1cwbklBK2p6d0FsNTVYL1B0aUtGOGZjbTFGSjV3RTgzN0pESHlwZHM0K2VRQ3ZoaVF6S1lIWHNicU9QTXhtRW9LS2Z2eVRiYmNjQ1BmMzNBanYveFlqazl3czJub0ZlaGlJUkIwV2dTSHcrM2REbVRZcTg5US9zN0RmREV3bVhXM1BrNmRTZXIwbmx3TEdZSnZ2Q0xVMnJWS1pObmNqbmJXbmtFZ3EzRVZsSFlMZFJVRjNQTFJOdTZjTzROeEVWMG8vcFJWakIwWVMyN3VLWEtCN0hvNzl0SlNUbFRFa2hTcytBOWF2NVR5MTI4bGZNSzlxQXhhVkgxSEVwRCtUd29PbXVnMXNLTzVVdFB6bGdmcGVjdUQyRW96V0RkdU5rWFh6aVhhQ1BvZVVaUmtad010TmV2S2pTdHdETG1Cc2YrNjNXWGVQYkdMVXkya3BSclI0V2l4YytUOEhadzRITUdWZTE1R0M5UnVlSTNET3pKZGRIK05iOHN6U0NJUzFDcWtSbnZORFYxUUVBM2xwVUJQd0lHNXRBcS9NSmZid3l2MkFpNTg2MlBBUWRiaUJleC9hd1hHRnhjQUVIN1pRc0l2VzRpekpwOHQweWFRcy9jRytnenZvbEhTcXIrRUlkeEk1T2g3R0hIYm1HN2RUK0NZV1V3WU13dlpVc1dPZVpNNS90MGNVbVluZFhoUGRESi90b3BpYkE0dmZNSUQvNnlDemVRaHpEcjBjS2hsV2E0VmhHNjhYKzExM0xra0hWMTBIeW9Mc2xsYUFDcDlBUE9TWGVyNzlnT0hPRmxSanRWcDVzdnRHU1NFUnpJMUlaVDdab3h2T3NVckgrZFRsVENJeXhOREZUbldXb3ZLLzVIQzNKNU12ZSsycG9DQmZQQXI4amQrVDYrQmw1eGVLYzdhenBGTkJVU21Ec0NSdnhPck5nYWZBTGZwZU0xOERzOTdpc3g0SFdGeHZwUituMEhjWGJmZ0hkV0RoajNwRlB3OEdvcDNjZXpiZmVpbmUxekRweGVoc1VWa3ZQQWhFWDBpTVU2ZGpDNHdDbS96UWJMVzdTRFlZT0x3cXg4RFEzNzFmWWVtam1EWGYxL0JJRTNDZjlDRmhNU0YwblBPTERZOCtTL0M0eDVDeWxwTmZsRWlGMS9vTXRteVAzZ1ZvZWN3ZkVNMVZKekl3eWY1S3JjcGNZZ0R5L1lRUGlZRm9TYUxCcE12dmwxMHZ2djFUdURZOG5meEZjZmlIVGVJME40UnhONndnTU0zUE1iUnlDY0o2ZWxIOWQ0ZkVIdlBvTmVvdUE3T1ZNckJmNjBnYU54SXRGUlNYMm9uT01ibHMrdm9uanJETDA5ZVQyYnBTR1o5OXVTZlZiRFZkNkN0dFJCMnFpZWVlT0pLUVJBU3UrN1l0bE5sVXhGdTBHQ3hPN0RZSFZoRkxjT2pYUjBNanVXZUlzK3FabWhzS0RnY3FQVytKSVg1dGpsTmRIZzRzWDYvZmJjT3Npd0FBQ0FBU1VSQlZBTjZrOG1FMHluaDU5YzlmczNTMGpLQ2c0TlJxVlRuOUJoclFTSHF2c1Bva1J6ZjlKbDNsQkdIWFVOby85Z09WQjRuVmJ1MlU3UnBNN1dsQWdNWFBVMm8wV1VtcVVNVGlCazNnSksxNlJUL2ZBaDk3MVRDQjhiaTFYTXdnVUUxNUh5NUJqTkdrbTZiamFGSEFvRnhqUjBaTlJndnZnanpzUXdzSlNZQ2hxYWc5UTdGbUJwTHdjb3ZxY3F0cDk5ZHQrTWRIa1Y0Y3JQNTZSVVo3M0dPcnNFM2VRdytZaVcxV2Jtb0l4UHhqd3hBMzJzWW9VWWJwNzVLeDFRZnhKQi9MaUlvMUVWRzQ2ak1wV2pUWmtwKzNJY2hkUzdKdDE2Q1NnUkVnZHFNSFJSdDJVVGxMMVVrUHZnMDBmM0N1cVpsRFJ1UDJseE0zUzg1NEJkRllHd1k2ckFFWXNiMHBuaE5Pc1UvSFVEd2pjVTRiamc2Z3l2TzZ0c3ZCVU9nZXg5ckFnZ2I1bUtVTm1jZG9HalRKc29PNXhCOXk2TWtqazBBNlBDZVhOQVNOR3dvV25YN1l6VDBIa3pvZ05nLzUwdmY2VHo2OU5QLytCbFhFTUhhK0s4Z0NIYkFLUWlDSkFpQ0xBaUNMRGlkam85RVViem16ekk1dnlVZjI3bmljRk9nNEUvcHBMRllWdXIxM3YrbExSOWJBeTM0MkVSSmxHVzVVcGt5QlFvVW5POXdPQnkxSGlhbmZIcGZtNEFveTNLRk1tVUtGQ2c0MzJHMVdodkxsVm9MdERZQ1RuUTZuZVhLbENsUW9PQjhSME5EUXgwdGszSlBHeDBWN1haN2lUSmw1d1poWWFIZENod29VS0RnOUtpdXJqNmRLZG9rN0JvelBFU0x4VktxVE5tNUVteGhpbUJUb09Bc29haW9xSzYxUUJPRU5tVlZzaUNBV0ZSVVhIUkcwck8ybHR5S2VoeW5JMlJ3dHRJUUpSbUhVMnI2a2FRL3o0TEk3bngwdVIzV2xkTVZ1elY5TGlrYldvRUNnSXlNZy9YdVIwTnFGbTVDTzQrUGdIcnc0TUdsa3VTMDRPb0Ewem1rZXU1NlpRVjc3VnJDdlp3VTJ2WDgrL3BwakFqVEExYWUrK2hidnM0cXAxUUtZTXRUVnpYVkNuNjFialdQN0NqQXo1MmdNL3JDVWJ4d1VlSWZmelZxOXZERnBIOHo0K2NuU0I5d0Q1TU9yMnBxNUpxLzVCNU8xa3lnbi9FQUI0NGtNUEdwdVUySGJadVFST3lIaHlpOEo1blFwM2ZUcTU5YTJka0svc3l3M0gvLy9RMGRtS0l0L0cyTlQ4c3BvR3RTUnRTd1lOWk1rbnE0MHRwWGZyZUtSUnNPc25yZWNFREY1SkVYY3V0RU14UGZiTnVsZk9xRUNidzRQa0ZaSWdVS0ZIVFA2cEhsdkZZQ1RQTFEzRnJxYTRLQTZEcEc3Z1pOcTFlVFVBUG9HZVNQcGFuR1Q4MlFYbEVFNjl2WExxcXJxOWh5Sklmc0dzdWZhRWtFVkY1ZWdJaEtyMjlSSEM2cXZCQzFJb0pLaGRncTFWelU2MEVFMFV2djRqbFdvT0JQREtmVFdkQktxTFh5dFFteUlBZzBCZy9VZ0N4SlVzNFpPYm50SnQ3Ym1jV2NTWmQxK3FjYUx4MzJrbkpXN1M5aDYvSjFUSjh5aGNjOTZHSCtzUEMvZ011M0xnSGcwdDNMVzN4bHZIRXhybGJGMDJoTnhUanF1MTBBOVBoNGg3S3JGZnpwWWJQWml0clIyTnBOK1JBRVFWWURzdFBwek82MllKUHN2UDdGYWh3SnFTem8zem5OeXJRSmFVeHovMzlaN21FbXZMZWQ2eS9vU2F4R1dUUUZDaFIwalByNitxSjJUTkRUK3RsRXR6UTgyVTNGa0U5WHJXYXJHTWNyVS90M3U5VlZhSFFrVVk1NlRpbjg0QW9VS09nQ1NrdEx5K2lDajYzUkhCVUJ1YXFxS3F2cmw1QkpYNytleitwQ2VPZktGUFJpMTQ2cHJEYzMvWloxN0NRRittRDYrQ2dMcGtDQmdzNlJtWmxaNFNITXBFNU1VUVJCRUx3QnJTUTVpd0d2VHE5Z0xtYjBvaStvMVhuaEpib2NkZHJRWG14Zk9BR0FKOS8rZ1BSaUcxVm1CLzU2TDVJR0QrUERHUU80NzVYMzJPUHd3Vjhqa1ZjcmNlL3NxY3pyRS9LYlQ5QnZ5ZTZoUUlHQ3N3S3JJSWpYNG1walVJK0wyYU5PRUlSNjkyYzJRUkFjb2lnNlZTcFIxbWcwc2lBSWd0NHQyTFlBeWVkdWJCSmwxZldZblFMaEFiNTQvVTRKK1lwZ1U2RGdmd3VTSkdXb1ZPcEZ1Tm9ZZUFvMms0ZGdjN29FbTByV2FEUnlZNDZCTEVsU3BpaUs1MUN3aVlRRytDbXJwRUNCZ203QlpyTmwwZGEzMXRySEpudVlvWWlDSU1pQTdIQTRNcFVwVktCQXdmbUd1cnE2M0hZRVdwT1ByWFVPVzFQd0FKRE5adk5oWlFvVktGQnd2dUhVcVZNRnJRU2FrOU9rZkRRS3VjYVlwbno4K0FsRnNDbFFvT0M4dzlxMTYwcmNnc3ZwSWRUYXBIczBtYUdpNEtvOEFPVFUxTlJ5U1hLZUFIci9wcU4rNTlLMm4xMXdOYVRNVTFaVWdZSS9PV1JaL3VYUlJ4ODF0elpEM1hSRm5wcWFoM0FUbTRyZ1pVQ1NKR212S0lxOS84Z1Q1VldUaTZvd0U2cTcxNVRXNzlRcFJNY0pVQ3NzR3dvVS9GYXcyZXlIMnpWRFpTUUVXUUpCUnBaQmxtUkJsaEdjSURqa3B1QUJnR3kzMi9kMWZpa25Pek1PczJqbEJ1NWR2b24zOStWaWE1YXZaT1hsOGVtMnZieTY4U0MxclczbC9CeWUrWElqOTYzWXpFZVpoWCs2UlNyZnQ1bXhUMzdSNHJPVDI3NWwrcjlXdC92M1A2NVp3ZWpaZDVFODYxSDIxbmg4NGFobDBaUC9ZTkFWZDNQSjRxOS8yNXR3RkhQdFRROHk5SXFGWFB2R0QxMCs3SVVuSCtHL2U2dTZkYWxsLzNtTjBkZituZWdaejNBMjJWQy9XN242LzdOMzduRlIxZm4vZjU0ekY0WmhHRVlZWUVSRVJGSkRSRU15SkRVemM4M016Rnh6eTh5MXNqSXoxM1ZiYTExei9mVTF0MjI3bUd0bWRqTXoxOHpNVE0xWU5EUFh5c3pJQzVrUklSSWlJZ3pETU16bGZINS96SVVad0d2cVZzNzc4VGdQWmM3bDh6bm44em12ODc2K1BwelI3SE0zc0t1b2xCTXRLTC9talpmSkdUV1pubVAvU2NWNWUvQXU5dTByeHRhTW4yLzVpMDh6NS8xdnoraEtCYXRmcCsrNDZhUmQrd2QyMjg1aEZ4VWJVNmJQNDREOTNKRUlIcmZhRHJaaWhnYjcyUENUVFVwSXlGSlQ4QUIvWk5ScXRlNDZkZWZyV0xPcm5DNnBIYmdob3gyYnQrUXphMnVKYjJjREwzLzRCZnNyanJCbzY3NFFZRHRXZG9EZnZicU51TGJKREwwMEdkbmx2dWlBemUyb3AvUm9iY2h2c1IweXVPdnFMcTBjWGNmc2Y3N0h6UGxQc252Vi81RWQwN1NuL0xPUGVMazhnWjJybjJYOXd6ZGUySnRRVzFqMnl0K1pOeXFMR3J2cjlFSDlhQ1ZXdStlTW1ycjFuc2xzV3pnSmRhMlZjL0dxNUc5NGo0SUR4eml3NXh1cTdjZVovL0phcWs1bkd0cExHWDcvaTdTNk9JaTltQmt2RnJKczZiUHNYdlpITE9mdHdkY3ljZEpjaXBvUjQxaXJxNm11ZDUzUmxRYU92SjF0Uy85Q2txdnV4RVN4WnlHRm05YXlyMDBXbmZYbmpvNm1xUGpRRDgyMHRXQWZtNUQ4NE9ZRE9GK3FoMUFIMjZtalI5K3lhL1BtQWh0dzRtSW4yY1RqNDY4Ti9ObkdmcFQ3ZHY4QS9WTUJQZjgzWVFUVWxyRDI2MDlEVGx1eGJSZlhEUnJJdmJsSkZ4V1lPWTRmNXNtWDExSmNyMlZvdWk3a0M3enN0YmNvc2lwWUxzME9PV2ZudHYrdzVzdHZLYXgyczNybFcyeFRSVEx4enB0SmliU3orTVYzMkxYM2F4eFZHdVk4dDR6WWpwbE1HOWJ6WjNHdmJsc1ZpMWZtcy92N0NoU2RrZEUzM2NEZ2pQZ21jQ3Y5aG9mbXZJbE5uOENVMzQrZ2E1eTMwTVYrL0RBTDN0aklubklibWJsOW1UcThGNmRLZzFZYWpyTm8yWHZzK1A0WXNZbUpqQnM5Z3V5MitwTy8wQU91WXRuS3RiejhTU0ZibERVOE5QNG16S2Z3TEd6NVlCMzVYeGRqclQvTUU4OHRRNC9NcldQSGtORkdKdi85dFd6Wjh5MWxqZ2FXdlBRbWVsMGMwKzYrRHRNSnI5YkkwdGMzVWVPcTVxQTlnYUdkbkt6OC9CalQ3NytkakRnTnV6Ly9oQlVGZXlpdmJTRHQwaDVNSFhNMUpnM3MvdTltVnUwOFNJbTlua1dMbG1IUlNBeTk0VWJ5VWcwK0JiNktKeGNzWnM5UkdELzJ0d3k0cE0xUEdFUTd5OTlZdzZadmptRHBlQWxUYnh1S3hRZFVaVVc3ZVdMRlJ5aHRraG1lRlk4anRoUERlN1FMV0hLTC9sM0FyVk9mRHJIdVZpeC9CMk5xZTlaLzhDbTZ4STVNLy8zMVdIeDFtRFVsKzFtMjMwbU85a2VXRkJTUjBPa3laazY0Q2owdTFxOWV4Nm92ZnJDOXNXSHJrV1phbWdkUWhOY2M5Vk9EQzBsQ0tJcUNyY0dEcmRHRjdITzZDVUQ1NktPUEZDSEVqak41RHZzcnEraWNkS3JTS0JkN1MydUpFY2U1Yy9GYjNQcnlCajc0b2VaaThCQXdmZHBzRHVxN01HbFlOc3ZleVEvYXB5STdweWRkdFVkWmxCK2FRcGpjSVowaHVkMHdTUkhrNVdZekpLODdSZzJBaHQ2OUx5T3ZjeUlHY3lKRHJzeW0vNlZ0VDlvRDY2RUR6Rm40SnJPYmJadUt6djNpWk03cUNxcTFDWXkvWlRoais3Vm42b04vWVh0Vms1YTI1SjB0REJvMmhOeW9IeG55aHhleEF6UWNaZFNFUjZtTTZjeVVXNitoWk5QclRQLzMxNmRzYThuOHAxaC9KSnBwZDl6STBPNEpWQjF2T09VNXhRZjJzK09IT3BMajQwblFPZGoweWQ0V3BsMXpTZXQ4S1VONlg0Sk9ZNlQvbGRrTXViSW5DVHJ2aTVuZTlWS0c1S1NqMHhrWWVHVTJneS92Y2dvYTZrYVd2dkltY3FmZWxIKzhuTVY3dGVSR1ZmREV1MThCY0xDa2dwd3I4NWcyZGdnY0tHRE1zNXNBU0VycHhKQXJNNGpWYU9qZE81c2hWMTVHU3BzbTZGKzk3aitrOWVyTHNJNkMwWDk1aVovQ0xmSHFNLzlnZm1FOUUyOGRSdXlQWHpENHJ5dTg2bEZ0TVVNbnpTY2w5eXBHOXpJeWJmWjhWbjhaWk5EYmZtRFRnU2o2ZG9zT0FiWlZiNzdCak5jL1ovU282NGl0M01uSXVVMnVrNW9maXBqOTVIUE0vMjhOSTYrL2lsU2RDd2RRc0h3SlU5NzlqdHQrZTkwWFRwZGJhY1VFOVp1aGlpS0VrUERxYlkxdUJZMUdUWXhlRzRpS0JzRE43WGJ2MEdnMGcwN25JWlIrdjVmbjkzcDRjZktscC9vTVlITzVXYi92Q00rUEdZYXQvQnNtdkxhUmpnK040ZGRNRHE1VTdHWEY5M0hzZVdrZ0ZobG0zdDZmVVIvNEg3ZE1ScmNNNU1PNzRmdlE4eXp0TzJCcHI4T2dpU0NuVndhWkFhMUNRODhlR2FqTGQyTW9qNlJ2ZHNhcExVZU5sZ1J6U3gzQ29EbjNOVzM2bEV5bUQ2L2hzMisrd3laTVpDUTQrR3hmTlhuOXZWcmJtTnQreStEc1M2RG5IYno4MW4xc09UeUoxRDBGN0V2c3c2clJWeUFEYys0Y1NzYlRXNWwvUy9lVHRsVjkzSXErYlF4cHFSM28yU1h0dFBvbkd5ek1lK1ErWHA3N0RFTm0zQWRGM3lPZndtcEs2ZGlKbERnM1dtMDB1ZGtaSWFabWFxZExTSTJwUnhjUlRWNTJ4a2swdGVEdldSeUQrbDJLODBNelNxL0xHT0NwWjlVWDNvL01xTi9lUlBHM0J5bjZzWmJNcnFuTVgxY0VEQ2FoWFFvSjdmUVlOVnF5c3pQSWFhYVlEaHgySFNQN1pNRGwwY3hlT0k4U0oyU2NWZVZmRFV2WDcyZm1xNCtRbDZJaHI5TTRsdlNmeTI3N3JjZ2ZmNEl6YXhEVGgzaXRnd2xYZjBoaDhFZnR4ekxLWXhKSWFVVUR2dmZPMituZlBZYitLV05ZK0p0RkZEOTZFMm0rNCt5R05CYlBIT00xRWZNQUZKYS8vekZUSmovSFpSMjFlMW94UXoyQVI1Szg0Q1lFSUNIOGE3cW8xU29pSXlKUSszSS9oUGNnSWVycTZqNkxqWTA5NVNNNDltTUo5N3oxRlhQdUdFSG5xRlBaMUdyMGFoalcrekpTalpGZ3pLSlAxSFkrSzdmL3FvSE5XVk9MclUwY1p0L2pzY1RHQXhkMlVUQTVRb2ZGM05JME1lcFBIZDFkdHVCSlpxN2REOGc4OGR4OFJuZUpQUG1IYmxjK2cyYSt5NUJCdVNSRXFhbXllM0M0bS93L3lXYmZ2SktOV0dKY1ZOWTBJbGRXWWozNERTTWZQQlE0cm5mSFMxSGdwSFJZOTk1L1A0OHNXRUgyc05mUkpYWmsvditieXNDT0p5L1pTK3ZVQVlBaE4xOVBFbURzMnZIQ1R3cFpqVm9HV2FWQzFraG9aUlgyUmdFME1IUEtJMndScVF6cVpvSGpWVGhjcHhlQk54dDk5NjFXb1ZhNVVjUloreEtvckRWZ01mdElFaU5OSkVUWktEOE82dG9hTE9ZbVd2K0UySmpRanppZ3lGSXJGOVdRbE9BN05pYVdCTWxLcFIzU2ZGMU83cGpjek8vVlNFVlZJME1zSmc2VWZGdmNHcWdGKzllRWQwT1NaYlFvMURjNHNOa2RoUGpZQUdYU3BQdDNyRmp4WmkwUWM2TDdyenQybUR1WGJXUHltQnU1eXFJL2pTZW1vV09pQVpmYkhYZ01MbytFUnY1MUwwMm5qVFZoUEg2TUtnVXNNbFJVSGIzd1ByN3FvNnovNlBNV3p2Y2hwbFF5MjBhZjlOeXhrNmN6ZHZJSjdrMmp4dUVLRFFhc2VtY0RJeWRPWmQ2SVRvQ0w0aTN2aE93dnE2b0N6S0JZcWFqVmtSUWJRWEpDQWdsWmJkajQxTmdUYURncVpMZW5SVVRTMUw0ekMvOCtDL0N3YlA0L21QbmFGcmJQSG41YXo2UnJ0elBNYUpJbFpNVnp4Z0VNbTdXV0tyc2cxWElhdXR5UGUxbjRUUnlsSHp5SUFTaloralpQZkZFU2RJQUUwcG12N3VhMDJ5Zy8za2h5dXppYWtjK2pWU2s0Z29kUWJTQWh4a1pGbFF0U05HQ3ZvYkxlUUZJYjBKbmpLZDNXRlBNdHF6Z0tRZDhSWFdJOENjY3JLVmNnVFE1MVE1VWZxWUVVRTlSV1V5bU1tSU1nUTI0QmhoRll6QkdVVjlUVVB2cjRNMlVuQUxXUWtpclpWM0VRcWRQU1Jxc1JHaFZlalMxSXhNcVZLOTNMbDcveHNTekx3MXAzbDlVeCthWDMwU1Yzb2Zydzk3eCtHRlNSSm03dDZhWDUvdVNyUFJRZnE2TFIwOEE3bnhTU250aVc2OUxqdWJIWHBVd28rQzg5alRuVUh6N0k1NHFGdjdhTCtGVURtNXlRd2EzcHg1anh3bVltWDJIaXNUYytob1MrWHNDcFBjcTJmWWNwUGZBajlxTnE4dis3RzFOQ01qbWR6aTJWazZsVGR4Yi9yZnM1djdlczd0MG9ldWtkRm1mcFNVMXV6K0FlSFVocGw4Q0tyVnZZMlZWaTM4Y2ZzUDRISlVRalgvbkcyd3hPR1UzbHArOVQycUVmZmR2SzZFMERTVnYwQ05OZWE4ZXRWNlJRV1ZMTUhuc2JIaHFaNHowcHFoMEQyaDlqenZNYkdOekp6TUNCbHhPcmhsWC9YZ1h0dXRMWnJHYm45NVdrWjE1ei9nWlNuMGhYZFJrTFZueEVYdHNvY2k3UDRYUys1eHZmWE15WWRSNXM3ODA0OVJKd01mRWtPYjVqMlVkN3lORTdlT0tsRHduTmxUZVIwZDdEb3FVYnFleG1KaU1yaTdRMnA3WTNDemU5emVWemQvSHRaODhTdW94U0RQMTdSUEhVb3JjcDcyVWhMNjhQeVFZVDQ0WmV5bVBQTGlYMnp2NXNXL1VtdXY1WDAxTVBjcjkrSkQ4OWsrbXZwWkFUV2NXcm54NGhOM2h3amVrTTdsakw5cUlHMGpKQ05mdEZMeThqTS9JM2JGKzFrdVJyQjVCK1VrVlU1dGJyKzNIUDh5OTlldkQ3OG1BejFCMENic0svTXFXdlJsUW8xRHNFa2lTanVEMm8xR3ExSklSQUNDSDV0SC81NFljZlRsQ3IxYTM3MlJRWHg1MHFFcU0wT0Z4dUhDNDNqYktXM3NsZU0rT2JIMG81MUtnbUp6VWUzRzdVa2RGa0prUmpUa3lpbTc2UkRWLy93STlLSkErUDZFY25neHAydmRteWpiYmRJYW43ZVptampkWGxLSFZIMGV2MVozUmViVzB0MGRIUnlQS1poTEpWRE9pWHc0R2RPL2pQL3FQY2Njc3dPcVVra2R1NUxiYUtVbFordklkYUtab2VTVkdVVmxSaDE1ckk3aGdNYkZwNlpYY21xaFVOUHlvdWdaeU84Zjh6ME5hWlV4amMxY2dYUlQ5UXI0bWhkM29pR2QyekVPVUhlUHVqUXFJdTdjdTkxM1NrVTNwblV0cDRQMkRYWDNVNS84bmZ6QTlTSWd2K2ZDdUprU3JRUkhIemIzTDQ5c3N2V2ZmSlYxUTZ0UXpzY3hrZDR2UUJOOFkxQTNMNDhidGlTcW9hNk5HakM5RnFzTmRVc09tVFhlUi9mb0NVN0VITXZqV1hpUE8xNkkyazR6Zjl1MUY4c0pqaThtT2tYWnBCZkdUUW9HZ005T21SU212dmEzeFNDbGQxVHdreXExWDA2SkZPSkpEY3NSUEpNVnAwSmpPWFhaTEc0T3kyckZ1L2xjL0xHbmhnd2syMGl6ZlRyMXY3d0F0L1ZiOWVWSlY4ejdlSGo1S1lrazU3azlZWFhPaElla0pVWU03a1pIY2gyRHNVYmJZd29OY2xOSGNrOUwzeUN1b3JTdmp1eCtPa2RlMUdnbDZpWisvZTZLdS9aK1htTDlFa1o3TGd3WnVJMWtpZ01YTFRvQ3dPZkYxRWpiNDkvUklhT0dycXlnM2RMWUg3U2hCVkxOaFZ6MjE5T2dhQ0J5dmZmSThieG81aWUvNFdHaTBaTEhqZ0JxSTBUYzlPWnpMVE96MDBTYVpqOTU3RVdnKzk4ODcydlljQUo5QUlPSHovT2dHWEgrQlVzcXlvSkFtMVNrWlJCRTYzQjZjaUllbDBPdG50ZGt0Q0NGa0lvUkpDYUV0S3Z1K2VrcEt5N1lLOElSZTRwS3IyMjg5eGwrOGpMdTdNS2c5S1MwdEpTa3BDSGE0OENNdEZLa1hmZkVkcXAwNm9uY2U1OWZkL1pPak1weG5mUGNoajVhcGgxTDFQTWVmWjJXUVlaTURKcUJ2R01YYlJDa2FjR2YwaDcrUnZ2Mi9rSCtiOVNDZ0htMDJDZWlRYUpTU25KT0dSSkVsUnk3TFFxbVVSb2RVUUVhRVIvdUNCa0NRSjRZMHZDRUJKVGUxWXBDaWVQVUJtZURqREVwYXdBR3o5Y0EzalpwZWhTSkVNSFRXSmNkMmJ1ZUUxSmxhOU5DZkVMNWpldFJPeFo3aGdreUxFdnBGL21IZXNtUm5xcG1XNmg1QjhPV3orSUtoS2tsSEpFbXBabGdueXN3WEF6ZTEyRjZqVjZsOGRzTGtqWW5ESHBrRkM0cG1ac0xVU0lqNFZOT0ZsdGNKeWNjckVPUzh3OFF6UG1mZmFXMmZjVHIydC90TVQrTlk4U0pJWDFDUUVrb1FreTk0SXMxcUxTcU5GMWtZZ1IrZ0M2UjVJa3VSVDJyeUlhTFZhdDhUR3hrNzV0UTJPUjJmQ0pVZEJ3cG5weG8yVkxrVDhKUkNtQmc5TFdNNnJmRk82Y3graGFSNXV3Q05KVXBER0ppRkpzcEJrRlpKS2c2elJJbXQxeUZvZHFnaDlrOGJXTEo5Tk1admp0eW1LNXpEUTdyemVSZmJ2V3Y3V3RudDRkTU1TbG90UWhCRGxsMS9ldTdTWkNlcmZmSlJGVWdocnJpekxnVTJsVXFGU3lWNWdrMlZaZUR5ZVlGTlVBQjZQeC9PQlNxV2FjRjd2Sk15N0ZwYXdoTVVuRFEwTlcxdlQxb0syRUI0MldaYUZIOE84d09ZRk43azFqYzJQakhWMXR2d1RkYURHYXVXSFk3WVRzd040UXRPZkZVWEI3UW5kZnZXaVZMTmk4U0lXTFZyRSt1MUZ2N3JicXlrdll2V0s1U3hmZHlFQzZFNEtWcSttMG5FUnZOMk9LdGJuZjNiQzNmdTJiNlN3TkxUV2V2ZVdOUlJWdEY0bFdsbThrNVhMbDdObXkrNW04OVBKWndWcldiNXNHWHRLbTdoNFBpdFlUNVh6ZjNQckJ3OSs5MVV6VUhNRDdsQXpsQllhV3hPZ3FWQ3AxRjVnODI4UTREWVNnQkliRzVzUEhBNTlHRFllZVBwVnJsKzBqajhzZTRlK1Q2M2l2NVgrQXVSRy9yN3NiZkwrOWdMcGMxWlNGampKeFVQL2VvMis4M3piNHk5ejZjd2xmRlFqZnVVelZNWmdNRkM2NHkwV3J0N3hpK3U5dTJRTG82YzgxZnBPNng0RzVWM1A5cUpTS2lwck9QK2ZLVHRQVEh1UXdvdUFPMkhkTTM5aS9iNFRFNld0WC93d3E3ZVhoZnkyOGRXL3MrMkF0U1ZHbG13aWQrQ2Q3Q2t0bzdJNjlPR3RuZmQ3N24zaWJjcktLN0RhbTJvN2JIdldNSDMreHYrSkdkcWpSNC92ZmVEVjNBeHRLcVh5RllZR1k1Y1gwSm8ydFUrRms1clNQaVFoU1NoQ0NBVlFQQjdQQnBWS2RWZlR1NnJobmxFanlHenZMUk5admY0OTV1Ui96WVpiZXdNcUJ1ZmxjdGVnQmdZOS8wVlFselU4K2NEdkEzK1ZGMzNKeU0zSDZXT1NmdVc0Wm1MWXJXUFJWWDlDWWNrSnRKN0tNbXJjT2xLYk02UW9Uc3BLeTVBTlpwTE1vVFdRRGxzMTVaVld6RW5KR0hYbkthOU9VWERVbExGcCsxZTQzVzZRWmRUKzVHUkZ3VnEwazFMTFFPYk5uTzZkV0tkMVRVQUdlMDBWbFRaSVRXNjZaNmU5aHJJS0swbXBLZWlDTCtaMlVGSldpU1hsREpkdVZKeVVsWmFqajdVUWE5U0ZkS0t5ckJTMzNreFNyT0gwQU41aHBjb0dsbGd0WmVVMUpDVmJtdTdYTjA0NmN4Sm1RMmc3MVJYbFdKMXFVbElzSWM5SEFSUzdsYklxRzhrcFNhR0p2YzVTNWkzWnljTGRyN1I0ZUJXbHBlak1MV20vRkxlYjZVcytRYTJXVzFoSnhUdDJZT2g3QzdPbVQwT1cxU0huYk4rK2czRlROak41Y0doKzVzRHhrNWlhL1FDbFU0YVFjZ0ZqWlhhN2Zjc0pmR3VlSVArYUFnRWZXOEFNOVd0c2FyVUt0VnFOMm1lUEVteVMrc0tqQ3VDcHFhblpFQmNYMXdSc1JKRFp2cWtVS2lVMkJzY1JmNkd6bXN2UzJrRnR5VWx2NEsyZGV4bVdmVFVYZFh4UnNURjMvQTI4V3VnbVJWOURsYkV2RzljOGowVUg5cklkREI1MEc3cjBuc2pXTW1MNzM4K0t4OFlCc09YVnYzRFgzUFZrWmFaUWV1QUFNNVovenFnc3d6bnYzaE9UaDdOKzV3L1lEbFF4YU1oMXFPVkVGcTVkUm1jZFBEWnhDSnQySDZibVlBMURobHlIbkhvVkc1Zk1QQ1c0amUvZEJuMy9DV3pOMzRKZWRqQmd5Z3M4TVNHUHRmTWZaT3FDcldSME5sTlUyc2lyYTliVE44MklyWFE3Z3diOURsMTZGZzZIaTVvZ2pxRXhtWkdNV3RYQXFLNVFzMk1KWGFkK1NzV09Gd0U0c0cwcG84Yy9TbXpuTEp4VkpReWE5aUt6eC9UR1hyNkwwU051bzhxWUJsVUhTQjN4S010bmp6MXB2OGZudHFYRW5FdnBycy9vbXRzSGEvRlg5Sno0QWdzbURhUnkzeVpHanJrZmJYSUdOUWYzTVhENjh6dzVjUkJRd2Npc2ZsUW1kQ2FXR2c1VW0xaTUvbTJ5TERvMlBuTTNqNnc5UWl5TjJLdUtjR2JjeWZZVnN3THZRa25CS2lvNi80YVFJWFZXTVduRU5XeXJTY0NFQTdldG1zRkRmSXB6NFRwR1RudVdvbDNibUw3OFc2WU9TZmFkVk1XVWtiOWo1OEVERkZmS0RCbXlHVXZ1TFN4NzdDNUt0eTVqd3B6WEtOcFZqcUg4TnRZOXBXUGNySmNZMTk5YkZvbXhKNE03bDdPcW9JUnBRMUl2MkN1eGI5LytMMDlpaGdacGJLRkJneVlUMUd1R3F0VnFTRTV1aDlsc2xxS2pvNldJaUFoWnJWYXJaRm5XU0pJVUtVbVNVWktrQkNHVWZVSW9vc1htckJQM1BmT1NXTGozYU9qdk5jV2k1NnczeGFGV3puSFZIUko1czVlSy9RMnRYTzhDYkVlT1ZJaERodzZkOFhsZmYvMjFhR3gwbkZXYkh6NTNqN2orankrSC9QYkRCMCtLeEY2M2lGcVBJb1J3aUQ5ZmY2bDQ4SVd0UWdoRi9PZTVlOFhWOXkwTUhCdmM3dTJYeFloWFByZjYvbmFLeGtiM1Nkdis4YVBGb20xaW9raHN0ajM2eG1lbjdIZkQxOHRGVEs4N1d0MTMvUE9YUmVLVjk1elJjN2lqVjVTNDVyNW5oTXQvL1FhN3FQMXFsVWpzZUpYNHZ0WjdIMSs4TVVQMHVuMnVFRUlSejk3ZFIvenU4VFhlOXI1YUlXS2tSUEhoajk1emIra1dJZDdhNyt2TGZ4ZUx4Q3Z1OUxiaktoTlh0NDhYcjN4UzVtdlhMWTRkcnhGQ0tPTFJtN3VMKzU3Tjl4MVhKVzdzMWs2OCs2Mzk1SDIrSWxHOHRkOHBYdnZ6OWVMMmY2d1J4ejVaSXJyOWRvNFF3aVorZjNrNzhmZjM5d2doRk9HcDNTTjZ0YjlVZkZIckhjL2EycWJydnZibjY4VHR2dnZZOFBTZG9sMi9lMFc5VUlSb09DaDZ0V2tuUGo3YTFONWJmN3RGM1BqdzBwQStmUEhHSTZManRkTkVvMUNFYUNnVlY3WFRpRWZmTEF3NTVzL1hkeEJQYnlodE9XL2ZuQ1Y2M1BGRXEvZjJ4K3M3aU9jK0xHOTEzK3NQM3lodStkdktDL1plS29xbkNCZ05EQWNHQWJsQU55QlZrcVFFSHhaRnlyS3NVYXZWcW9pSUNEazZPbG95bTgxU2NuSTcwdFBUeWNyS29rK2ZQbHg3N2JXb1pWbmxqeWhJc2l3TFJWRWtYeERCYjQ1Nm5FN25lMXF0TnBSMFRYSHhyN2MzNEU2L2duc3lUcjg4YWR2Ty9jUmYycFd1T2k1cTJiWHJTM3IydlFhakRLQmx3T0E4SHR1NUd5YjJKYk4zZnc3TS9UUGo1Ukw2NXZWbDVNaWgrSW1rQmd6c3k1eTdidVRBeU92b08yZ29RL05PenNsbTZYOFg1UlYzL1d4OGptUEdqZzJZWGpxZGpoM2JDbEQwc0dqdVg3elRxcXFJUGJ0MEtNQ3VuWHNZT01GTEdtREtHa0JQODZrTlh2ZUJiWHdtOTJadFhsS2d6VmlURWFoa3k5WUR4Sm8vWU1hTUQ3MDZqZHRCNGU0U2hxZDNQY2tWOVJnTWFqQWFNQmxpTVJqdE9PdzJzTzVqeTI0N2NzSHJ6TmpxTlJXZDdsTDJITFNSbmExang2b25XYmppUXlxdERtb3Fpa2tkZFhQZ2lqMXplNk1IMENXUm1sQkRWUTNnczhxcnE2c3dKWWV5Z1JUdS9wSzhBWGQ2dFRwZE1nUHowcys3VDlNWWE2S3E3TUk1Tkd0cWFyYlFzdElneEJTVkpFa0pyQnNhRWcwTjhxMnAxV2cwR3E4cDJzd2NGVkpUdHE0Q2VNckx5OWVucHFZK0ZCVHlaTVY3Ry9oWTdzZ3IxMlZ3MnJYSFNpTXJzU09ncEFBQUlBQkpSRUZVZHhZemNzUkZsdUp4aHNYWkNiM0hzRzkzTGdYNUJheGUramVlWExHZGZXdm5JZ01Ubm55WC9ydTJVYkJsQ3pORzlXUDN3bzk0Wk1TSkMwUXFkNnhnOEwxL2IvSDd1Tm12TVcxRTFvVVBwaGhia2c5WTBub3hZb1IvN1lZYkdUVTU5cFNQek92Vjh6cnRGRVZwZXRGUGVxS2VBVU52b25lQzk2OFJJMjRrSlQzbDlBWlA5akZFZU9FVFVGQzBaZ2FQdkpFVTJYKzltMG5ycktkOHkwSW1MUGlDL0kzdjBUWEJ3UG9uNzJSK1JSTVVxZVVUKzBXTkpoTldxN1dWUHNnWGRLUnNWaXNtaytHQ3RiZDE2OGRmTlFNMTEwbk1VQkdhdHhia1cvTUJtK3hQYUdzQ3R3QlZlQ0E2bXBiV2FaK2lLSnQ4c1F2ZS8vQkQvbDFuNXNXYmV4RjVCcy83NkEvZjhJbW5MY1BUREJjVnJsbGkyMUpjWEJMeWxjM092b3pkMi82RFZRRndzbVhqZG5KeWVnWW1sU0VobFJHM1RtRHhNdzlUc1c4L0RwOEQyV3ExazU3ZG40blRadkhRK0w3czJYZmdwRzJiczRlemZ0MTdyR3UyM1RXNDZ5bjdyZFhwVUtxcmZIMDhmVm4yeEJUbUxzMC9yV096K3c2azZzQlhKR1gySmpjM2w5emNYTko4UVlYczNKNFViUEdta3RRVWJtRlhWVk5IWXMxR1NrdThrY0VkMjNZRW5xMDZ2Uys5bGM5WUdZZ2FLdFRVV0lFRUJ2UlA1bUNGTTlCT2RrYm5Wb0gyOUZTYVRBWm0yQ20xeGdhdWw1bWVodEVnVTFGYVNrTFhYblJOTUlCaVkrMjZndE8rYkU1MkwvYnRDYVdLejg2K2pPMWJ0bmxYZzNPVWtiLzk0UG4zZCszWlEwNTJ6Z1Y1UDl4dTkrWVJJMFljQ3dJMkZ5MFRjNE55MTZTUVpOeGczNXBHbzBhcjFhSldxOVYrVVBORlIyVWhTUXJOelZHN3ZXR3R3UkExbUlZalBGN3dIVlpkQkFQbjd2ZStBUEZwZkhMdjFRRE1YdndxNzFjNHFYTzZ1WEhPUzJUMnVKelhidlJxQm05L3ZwOSt2WHBoa2k4cVhDTnorQVR5WHI2SnRLNXZrVFgwUHRZK05abVVRUk9ac3Z4OWNuS3VJa1ZucGNyWW40M2p2R2JYWnl0bU0vR1pqOG5zbWtKeDRXNG1QZktTMTNUQnpVUERlN0JMU1NmSjZLU3d4TTN5OVlOUHJtOW85U1FsbjkzTEs2Y1BaR3J2WjhuSnVneWpJWlZsQmUvUTlUUXV0V1BUVyt4Tzc4d2o0MDdOTUcvTUdzSGlTUjh4c0dkM3VtYW1VMVZ5a0s2ai9zYXJNMGR4MXlOL1orWGczekZnNjRzNDNZTGtJRk4wM01TN0dUcStINXV5T21NeFJ5RGpXL3RCbmNTaTVmOWd6TGlyV05ZMUU2V3FqRUZUbjJmbW1ONDhOUDhWeG82OG5aemx5VmkwRGc2V0NaWnQzVXJPV1ZIZzZabjM2a3VNSG5NRGE1L3FpczVaU2FtdEhmazdWNUUxZER6bUo2NG5iL0NuNk94VldCTFNUdnVxNllOR1lwaDJHd2NkaitGZit5ZHIxQlNHTGIyR25MeHJpWlZkS09ZbW1wK1haOS9CeS9uRkZPK3JRRmR5RTZzZTB6Tmo0WHNNeXpLZS9ZUzFIMkRqTGlQTGw2VmZrUGZqMEtHeVQxb3hRVjBuTUVPRkpNbEIwZEFtVGMydnJXbTFXcVJ1M2JyUjBOQkFRME1EalkwT3FiSFJpY3Zsa2hSRmtSVkZrWVVRYWtEN2YvLzNtUEhoaHgvZUJyVC9KWU5NWldVbFRxZUw1T1F6cXhUYnMyY3ZuVHRmZ3ZZYzE0cldWSlZqZFd0SnNZUytYVTY3bGZMS2Frd0pTWmowMmhiblZOdGxVcEl0cUg4bEh3bTN3MFo1UlJXeGxpUU1PbTN3RHNyS3FraElTVWJiN0Y1dFZlWFlNR0l4dDJJQktFN0tTOHZSbVMzRUdrSWR1dFVWcFRqUVk3R1l6NEdCcDFCUlZncTZXQ3pCYVRtS2s5S1Njb3lXWkV6Nk0wdkpXVDdySm5hblBjd1Q0M3VIdEZOWlhvYk9sSFJhdE80L1JiWXZtY2FUcFRtc25uUCtYVVpDaUxLYmJocjU1M2ZmZmRkT0UwV1JEYkJKa21USHk4UG1sQ1RKTGN1eUlzdXlvdEZvUkVTRWxvZ0luWWlNakNReU1wS29xQ2dNQmdOR281SFkyRFpJUFhyMHdHNjMwOURRZ01QaGtCb2JHM0c1WEZJempqWU5vR3RzZER5aTBXaW1ob0V0TEdFNWY2SllpMW02cVlUeG93YitUOW92V1BVcTZVUEdrV0k0LzE5TnE5WDZVa3lNNlFPZ2dWRHV0WHBKa2hvQWh5UkpMa21Tdk54cmFyWHdBbHNFT3AwWDJQUjZQVkZSVVVSSFJ4TVRFME5jWEp6WEZQV2JveXFWU3FoVUtzbmo4UWhabHZCNFJIQ0psZnZRb1VOcjB0TFNwb2FuWGxoK1BWTEQ4b1hMcUc3Rmoyako3TXVvQVJkK3pWYlptTWI0VVduL3N5Y3ljTlQ0QzliVzVzMWJkalh6clozUXZ5YkxrdkNibno2c0NqSkIxV2kxR2lJaUlvaU0xUG1CVFVXUXI4MFhIWlh4eGtZRDBWRWxQZjJTL1c2M2E3VXN5eVBETDBSWWZoMWk0dFpKazhPUDRYOGdqWTJONjBhTUdGRkZxRi9OQmJna1NRcXdlUkNvRFExbDhRakdMcjl2VGFlTElESlNqNnpSYUFJSEJLZCtCQmZHK3dJSkhyeVZDRytIaHlRc1lRbkxUNVdpb3FKUFd0SFdnb01HbnRZb2lwcW5lR2cwR2pRYUxWcHRCRHFkRHIwK0FHeWFRTGpVcitLcFZMSm96dllCZU16bStBSWh4Q2ZoWVFsTFdNSnl0dUx4ZUhiMDdIblo5eWZSMWxxd2VhaFVUV2FvRjZ2VXFOV2FGdHFhd1JDRldxdlZvTkY0YlZTWHk0dUFicmNiYjBXQ2dxSW9BWEFUUW5nQWQzMTkvYi9kaW5KbHJVdW1YUnRENjVFNWp3QlZzeUozajR2eTR6WWlvZ3pFUllZcHRuL09zcnRnTlRzT1ZJSXVpWEhqaDZNUFA1S3duRU01ZEtqc1B5ZlIxdnlNdVVwb3Nic3F4QVQxNDViZnQ2YlRlUU1KMGRIUnFMVmFMUnFORnJYYTJVb1F3ZDFpb1JmQWs5SWw4KzFMSDV3N01USENrMW51aXVUcGNkZlRKeUVTTDIzUk90Nzlyb3BLeGNTV3Y5MkN2eVQzeUtGdkdiOXNHM0dXZUk1WEhxVnpyenorT2FnTGNuaU1XNVh5SFRCbkN5eWE4YjlwWDZ2VFk1QXJtZnJRRzR3SUExdFl6cUVvaXJLdlg3KytlMXJYMXBxVzFzTy9ZSXNrQ1ZtV1dna2ErRTFRdjdZV2ljRVFoZEVZZ3h3UkVZRlhhL09hcEUzZ0p2dTBOam1Rck9zSHR1UGxoOXo1RDl6MDV1b0hiK2VoakFqbTVIL3Q2N0tYdHVpOWU2NmgrUnJqYjJ6OWxPNTVWN1BzOThONGQ5SzFmTHA1TzE4MVhDUUQ2ZnZYV2dWbEZhSDc3RFZRWEVySVN1ZUtBclp5MkxvTDNHN09hUFZ2QmU5VUtTa0d1ek8wQTdicWx1MmZTREx5aGpCMjlGQk9GUEYzTzZ3VUY1ZGdkN2JzWEUxbEdTV2w1YlRZcFRncEt5bW12TW9hZnJzdllxbXNyTnhZVm5ZNEdOU2NCTllMRFNtaFVrSzF0ZUNnZ2Q4RWJkTFdvcUs4MmxxYk5pYmtpQWdkV20yRXp3SFhsTUdyVXFtRnZ5SWhLSWpnYXd6Mzh1WExWd0xmcGNURzRHZ01wUzJLaTJ5WlFHalFhbEg1bDdPWEFMVVdnK3JpR01qK0ZwajJFT1FOZ3VHRFlJR3ZPRzN4RE9qWkg2Wk1nS3plVUZUdC9mMmhNVEJ1TnBSc2dTRkRZUEFZOE8waTF3eTdmUnlFZTFaQXo3Rk43ZVF2Z0FGallIQXVqQmtMMlNPOHY4OFlDVU5Hd3NneE1DZ2JKaS84aVdicTJtZm8zTGtYVTZiY1E5Zk9QVmk1bzlTM3g4bVRFNitoNzlBN21EcjU5L1RNSG81L2o3MXNCMzB6TG1YODVEOHhmdVMxakptNU5QeUdYNFFpaENpZU5ldlJMMDloaHJZb2VQZVZUWW5nOUE0dnNFVVFFYUh6SmVrYWlJbUpJVFkyRm5Wa3BJNkdCcTg2NTNScWZMNDJkZk1JYWJCSjZnRThkOTg5MFhyYjZCR3Z2L3pwZDdOSFh6djhsRGQweDNYWDhNRHJteGhmdkpmcVl6WGNPZnBhTHJsWWNsM2RFdFd4Z2owK1ptYUhBNHJYdzJOYm9YQVhtTlN3ZGk0ODlCU3NmUXllWEFrSDE4Q0lGWkMvNHN5YTJya05kdTZHRExPM25jQ0hKUk5XellHYUhaQTZFWjZaQkdlVnY2NVVNbTNTLytPeHRkOXdhN2FaZmF0bU0yRGFZNHpZdmhodHpXNFdyTEt5cGVwelVtVlFuTTZBdHJwanpWSzBBLzlFL3NKN3ZSRG9kSWJmOG90UWpoNDkrdDZMTDc3WTJKcTJKa21TM3d6MTBFVC9MVUlqb2NHZ3BpVWlRa3RrcEM2Z3JabE1Kc3ptZU9USVNEMDZuWTRtWDV1R1prbTd3ZWtmSWFrZmsyYiszNy9kNlZjVW53NXQwWmJQdnFCU1orR2VxN0s1NS9KMnZKRy9rd0EvNWE5ZFpNR3RRWnFWVGdmYnRvQWVtRGNUWnN5QWpidGhUK0ZQYjZyblVDK28rZHZ4UzU2dk9zZVVBcnBxYjNyMzJUbi9DaW0wWnpBZzI5dEl4c0JCcUFzL3AxUUJqT24wVDY5a3pMRGJtZnZNSW5hWDFRVEFNN04zZnc2c2VaenhrMmV3WlBrNmJJbzYvSlpmZk5yYTkwODg4Y1FYelVBdFdHTnJrZUxSSE5SYSt0WjB2a2lvSVZCMVlMRWtJa2RGNmRIcEl2SDYyclQ0bzZTaHFSOHFFUVJxQ3Q0SXFmdVYrYzhjLy91QWprdFBIUUJvWk9XbjMzTGJ0VmZTSjlYQzlmMzYwczFWd3FhUytvc0UyTUJvYU9rTFMra0pJMFo0dDNIVFlOVVRaK2F6VTl3dDl4bFBVUHNjWU1vNW45RWFPWmFsMi9jeWYvb3R5Qlc3R056N2NyYVdlVFV6THhYVFI0ekk2OHpXcFg4amIvUk1sUEM3ZnJGcGEydi8rYytuSE0xTVVMKzIxdW9TZThFWUZGeGg0TlhXV3ZyV3pHWXphclVhMldBd29OZEhobWh0VFVtNzZ0YTQybnpnSm5ra1NYS3ZXYm5pVFNIRS9wUGZrZ3BEaElvZnFtcTlMNlNqbGtQMUVnYmR4ZnZWN2o4QURoUkMxeHpJemZWdUtVRjE4SG9qV0N0RGd3b0FDVVlvOVRIeWJQdnNQSGZTWU1ic0xxZWtPcWdYU1psazZmZXhaVmNWQVBzSzhuRm5YZTdsSkhQYXNMcjE5QjQ0akJuekZqSWkzVUZSaVZjM1BERVZVMWd1RW0zdG05bXpaKzlzQmRTY1FmNjFWbEk4WkVKTHAwSzFOYjArc3BtMjVtVStVVWRIRzZtcnE2TyszbzdEMFVCall5Tk9weGFOeG9YTDVVS3RWZ3UzMnkxNVBCNmhlTU56UWdnVUVJb1FlQ1pNdUxQMmhUckxhenVtWERjUFRreGJOUG42SzdsNzFYdDhzVE9lbXFvcWtyTDZNRFJvN1lTTFRkS0d3c3l0a0pNRm1lbmVLT2JRaDJEdU9COSs1SHI1a2JPeXdKQUVHemRDTERCaEl0dzFDQloyQmJNQk9KL1VkdXBVWnM4YXlxMDl1NkEzcGJGaSs0ZGtHaXc4dGVDdmpCclpoK1daYWV6WlY4NkM1ZTk3MlYxckN1bWZlenZtakN6a21oSnFFc1l3TDlmTC9YdGlLcWF3WEF6eTQ0OC9ybjMrK1VXbjhxMkZKT1FHMFJLSmxxQVdFV0QxaUk0MjBxWk5HK0xqNDlINS9DL1NhNis5U21scEtSVVZSemgycklxYW1scnE2cXpZYlBXbnkvcWh2ZTY2SWZwMTY5YXRraVNwOTBudnp1T2l2TGFlaU1pby8xbUM3cytOM2NOaGc0cHFzRmhBZDVxWHJxNEVSUWRtNC85dW9yb2ROc29xcWtoSVRrRWZuS0d0T0ttb0tNZXROcEdjRUVweGZUSXFwckQ4ZWtWUmxKMlptZDJmMnI5L3Z3TXZpMGU5YjdNQmRoK0xoL04wV0R3TUJpK1FtVXd4eE1XWnNWZ1NTVWxKNFpKTExxRkhqeDdvOWQ3UHBicE5temJVMU5SUVYyZkRicStub2NGQlkyTUVXcTBUbDhzYklWV3JWY0x0OXJOK3lIZzhua0N5THVEWnNHR2owMnExdmhvVEUzTnlZRk5wU0lvMWhVYzZTSFFHU0QxRHJTczI0WC9mYjdYT1FHcHJIWmUxV0pKU1d6MUhxemVTbW1vTUQvcEZKc1hGeGUvdjM3L2Z6YWtqb1FwTnE3djd0TFhtdnJVSUg0T0hWMXN6R3IzYVdrSkNRZ0RVQUdTejJZekpaQ0k2Mm9CZUgwVmtwSTZJaUFpZnI2MTFmMXRRMUNLdytJTEoxT1k5UlZIV2g0Y3hMR0VKaTE5Y0x0ZUhsMXpTZVg4elFEdWxiNjAxdjVwR293M1FFdW4xVVVSSEczenBIZWFBYnkwQWJBa0ppY1RHeG1JMHhtQXdST0ZOLzRpZ3FTSkI3VXNCVVlrZ0N2R1FFaXU4aXk2NEtpc3JYdzBQWlZqQ0VoYS9mUG5sbDVzSVRjWU5BSnRQVzNPZlhGdlROS3NIYlNwME54cTl5YmdKQ1lsRVJVV0ZBbHRTVWx2TVpqTnQycGlJam80bU5QMGpJa2hyMHpTUGtyYlEydHEyVGRydWNybVdoSWN6TEdFSlMzMTkvZklycnNnOTFBelVHaytrcmZtWDFHdGVOdVduSkRwUmVrZFNVdHVXSHBISXlFZ3NGZ3R4Y1hIRXhNVGdUZi93SnUxR1JHaDlLU0FCY3pTNHpFbzBxeUYxUzVMazJydDM3MUxnOEs5dGtESXp1NFZwd2NNU2x0TVVJY1RoTld2V2JHMU5VMnVtcllYa3JiVVdDZlZYR1BpNTFwcW5kMFJHUnJZRU5vQ2twQ1RpNCtOcDA2WU5ScU9ScUtnbzlQcElJaUw4NEtZNWJWL2JaWmRsZjJlMzIxOElEMjFZd25MeFNtVmw1Y3F4WTI4LzNreFRPNkcyZGlMZm10Y0UxUklSNGMxWkN3NFl4TWZIazVTVTFHcjczblhJdFZvc0ZxOUo2ZzBrUktQWDZ3T0JCSzAySWxoekU0b1FPTjBlNGZZb1FoRk5yQjkrZE83YUkzdnBzL21GbTBNNEhOd08zdnBvQjlOWGJPTHgvTjBjYVJUaDBROUxXSDZGNG5hN1A4N0p5Zm44TkxTMWtLWDEvTlVGdmxRUFh5VlVSRkRBSUxnZTFJekYwdmFFVmxRZ0FhbDkrMlQ4Z1lTWUdDTUdnd0YvSFdtdzFxYlJ5RGpkb05ab1VLbFVJQVRDMXprL3VCMDZlTUM1WU1OL2x3UUQyN0wzMS9ONmlaTXhmYktJc3g1aXdxclB3aVUxWVFuTHIxQUtDd3ZmTHlzNzNMeTZvQkZvREFZMUg2QXB3VFdoVFZIUUptMHR0QjdVR0FnWXRHK2ZmTUkraEZRT0ppVzFKVDQrSHBPcERkSFJYcE0wTXRKcmtqWnBiVHJNYmFLRklUS0NDSzFHcUZTeThHSmJ3RmIyU0JLdWcwL2Q5N0hMNmZ5WDk4cU41Tzg5d2wzWDVwSFR3Y0xFRy9yZytxYUlyeHZDa3lBc1lmazFpZFZxZmJWWHI1d1NIM2dGZzFwd3dYdHp2aldmdHFacVJWdlRoVlFZbUV4K0U3VHRTZnNSQW15SmlZbFlMQmJNNWpoTXBoaWZTZW9GTjUydXlSejFSVW1GV3ExR0JOR0xOR2x0a2h0d2Jpc29lRVVJOFNWNGNDc0NsY3JYbkt4Q0pXd1VWN3ZDTXlFc1lmbVZpS0lvWHozLy9LTG1BWU9BYjAyU0pDZXQrOVo4SnFoR05HbHJUV1ZUM3B5MWFFeW1HTXhtYjhBZ01USHg5SUVOb0YyN2RpUWtKUGh5MjR3WURGR0JJbmsvQTRnL2tBQUtpcEJRYTlRQklrcEpDakJndXNkZE43VGkrUEhqTDRDZVBwMWlXYlc5a0tNMk94OTgvQ1UvQ0ltR1JuZDROb1FsTEw4UytmYmJiMWZQbURIRDFncW8rVFUyUDZnRnAzaTBXSEdxaWJuRFgrUWU1VnZoUFphRWhBVGF0VHQxT1dRTFlJdUppU0VwS1Ftek9kNlgyOVpra2dhRG15eEJuY01qZEhvOUdwV3ExYVJkSk1rVkYyZmU0SEs1WHJ6N3hpRjA1d2lUWHQvQXAwb2lBMkpWNkhWaFRxNndoT1hYSURhYjdZMnVYUy85SnNnRWJXeW1yYldhak5zVU1OQ0k1cUFXV3VUdUpaQk1Ta29pSmlibWxQMXBGVm5hdDI5UGRYVTFWcXVWK3ZwNlh5RjhJMDZuRTZmVGlhT2huaU8yUm93bUUycVBrOFpHQlVWUkVFSUlSVkVVRUI0aGtDU1FrU1RWSjU5ODh2SlZWMTNWYTlwTnY4a0djTmVWYy9XMmFQNFVIMTZwS2l4aCtSV1lvTHRmZmZXMXphMzQxWUpCellVMzE5VWpTWkxTUEJtM3lhOFdXalpsTUVTSEZMeTNiOS8rdFByVUtyQnBOQnFTazVPcHJhM0ZacXZEYnJmamNEaThsRWFPQnI0K1ZvY3FNZ3BKdUdod0s4SXRKRW10VWdraEZEd2U4TklhU1lvQU53TFgxVmNQTE52ejVhNUZYM3FpRmlkcEZkNzUrSE95Y252VE1ZeHJZUW5MTDE2KytlYWIxUTg4OElEMUpDWm9pMlJjMzZwVExkSTd2SDYxbGxIUXhNUUVrcE9UMFdoT0R6Uk95S2Rxc1ZpYUplNUcrMnBKSTRtUGk4T2tqd0NWQ2ttbFFwSzlxQ3ZMS2lGSkNDUkpTSkt2WWwvQ0pVbVNNL095N0UybEpTWFByaTg2VE0vZWZYbDZjT2Z3akFoTFdIN2hVbHRidXlRam85dUJrMmhyZm1Eeis5WjhBWU1BcUlVdzRucWpvUDVhME9pUVJOem1oZTVuckxINUpTVWxKWWpTeU82ak5Hb2tQVm54Y2JiWnFLKzMwOURRSUJvYkd5V1B4NE5hcmNiajhRaWZCQlpabGlUSm1WaFQrdEtNMy8rK215ekxnOEpUSWl4aCtXV0wyKzNlOHVpanN6OXVCbW9PbW5MV1RoUUZEVFpCaFplMUk1ZzhVdTh6UVUwK0U5UkNTa3JLR2ZYdHBBejRVVkZSSkNjbms1aVk0RXZjamNGZ0NDNlVid29tK0d1N1ZMNUFnbitwUG9JcUV1NjY2KzdqaHc0ZGVnRW9EMCtMc0lUbEZ5MC9mdnJwcCs4OSsreXpEYTJZb0k1bUptaWd3aUEwWUtBV3dacWF2OERkWUlnT0xLUG5OMEdiczNmOEpJME52SUdFMnRyYWdOWVc4TFU1dmRUaGJyY2J0OXVOeCtOQlVacUNDRUlJZk9BbUNTSGNnQ1JKa3B5YTJ2RnpxN1YyUVhSMDlOenczQWhMV0g2WmN2anc0V1Y5Ky9Zcjg0RlhNS0ExTjBIZFFSVUdvbWxSbHRCZ2diL0FQU3JLNEV2dGFFTjh2RGUxNDNRREJtY0ViQUFkT25Ud1JVaHRORFEwME5qb3dPbDA0bkk1ZzRETmpjZmpFUjZQUndvR09KL1dKdmxNVXBja1NTcWpNZWJmalkyT05LMVdlMWQ0aW9RbExMOHNzZGxzYnlRbnQ5OUZhR3BIY3hQVVJXalpWQXNUdElsakxiakFQWlNPcUVPSERtZlZ4OU5hakMwNk9wcjI3ZHNIMFJzRk0rNzZxeEw4eEpTYVU1bWtUcUR4d3cvemx5aUtVaENlSm1FSnl5OUgzRzczUjRzV0xTcWc5UWhvUUdNN21RbnFCeld0TnFKWmRZR0JtQmhUZ0k2b2ZmdjJSRWRIbjFVL1R6dER0bjM3OWxpdDNrVmVRclUydjBucXdlUHg0UEVvSnpKSkVVSklQdFhVT1d6WXNQTHZ2eTkrdmtPSDFBNlNSS2Z3bEFsTFdIN2VJb1FvM3JGang5by8vZW1odWxaTVVBY3RBd2FlRTV1Z1hrMU5wNHYwc1hiNE9kYThCZTdKeWNsblpZS2VrY2JtbDQ0ZE85S3VuVGNGSkZLdkIwMGsrcWlvSUdMS0NMUWFEWklzQzFubFgwaytoRzAzRUVpUUpNblpzV1BhenBxYTQ4L1Jjdm5NaTBhc3BYdFl2MjNQdWJuTzluMFhwTS9iMXErZ3pQcHpmNjZ3ZnR1RmFzMU93Zm90T0g4aGM2VzVmTFpwTlFlclQva0t1b3UvL3UveWZ2MzZselhUMWxvelFmMkp1TDdxQXE4SnF0SDR0YlZRdjVxL1pLcE5tMWppNCtOcDF5NkpqaDA3L3FSN09pTmcwK3YxZEdodjVxMVBDbm45NnpJK0tTbG4wM2VWTktpOU5ySWtQSlJVMTNITTdzUnFkd2k3UzBGV3FZVXNTMEtTVUJUaFhZdFVDT0VXQXBja1NZMnhzWEh2TlRRMFBQVkxBYUluSm85a1c5bTVJMXlxTE16bm1aVmJmdkoxeWo5YnhTTUwxMTZRZTFydzBPL1o4VE9QYTFjV3dqTXJXM2xPTytEZWVlZTJyZDByNS9Ga3dVRzB2NUM1MGx4ZW5uTS8yNHB0SnozbTJMSHFGOU43OU4wVHBLazVnamRKa2hxRFFhM0pCSldFU3FVV1hsRFRpaFBWZ1hyejFjeTBiWnRFaHc0ZFFsYWNPdS9BQnRDMlhYc20vbTRNODM4L2dnZHVHRVMvOWtiMjF6aUppb3JDRUIzRHBSM2FrWjZVUUx1RU5raEN3WVdNTEt1RUlvUUFTY2l5djFCZStCa0FHbk56YzVlNFhLN1hmZ0grQlFxM2ZVaFpqVGRvRWlyZUNhdzRiQlFYbCtJTW1zLzJtaXFLaTB1d3UwTW51YUlvcEE2WnpNYjVrMXU5bHNOV1JVbFoxWm4xMFc2bHBMU2lCZGVkdzFaRFNYRXhOb2Y3RE83SnUzNW9jVWtwZG1mTEY3U21zb3lLNnBZdmhLMnF2TlYrSzA0N0pjWEZWRm50NTNXY0ZBVlNoOERHK1MxL3Q1WEQxbDNnZG52L0R0bnZnSklTc0xlaWVpbDQ3WXFTNHViNzdUejV4QnRNbWpUMmx6VlhGQ2RsSlNYWVdoblg1dU5rdDl2LzNhTkhqK0I4dFJZbUtDMVRPM3hyR0toRU1NZGE4MkNCbnppeUtWK3RQVzNidHYzSmMrQXNxdEFqdUs1dlQ3NzZTc1p1YnlERmtzQ250ZFVZREJHNFhHNGtXY2FHZ3NmalFhMVJDNkZTUzJvWkhJMU9aRmtTRWlLUUFpSzhLU0JTWWVIWGNrRkJ3WXVEQmcxS1VLbFUxLzBjUWExdzNUTk1lK1pkQ2cvYTJYM1hkU3d4cUJrMjlaOU1IWllGd0t2VGIyUjFUVWNxUDlzTWVoM3F6SnZadG1RR1Q5dzdpR1c3UGFRbDZOaXpyNXpacjc3TjJMN3BnSU5aNDRhVFgvZ050cXo3MkxOc1JxQ3RSVk4vdzRvRGNhamR4Nms2V0VqSzZNZFpPMi84S2Z0WVhiaUdBWU0rUUVjMUZmbzhDdFkvVDRJV1ZzNFp5NnpWMzlNNTFjekJ3aUxHUC9FR0Q0M0tPZVU5clZ2d0lGT2Uya1JHVm1mS0R4UXpkKzBYREVuMzZpWExabzluc2ZVSSszYnVZdXJMLzJINnNFeHdWek5yL00yc0xGSkkwZHVwTnZSbTNlcC9ZZEZCeGU0MURCNzFKMUl5czdCVkhpUjcvTk04TlhIZ2VSbXJXZU1ndnhCc1diQm5XZFB2RDQyQmJVVlFVZ0ZEaGdDeHNISWx4QUk3VnNMNEdaQ2VDUWVLWU81eUdKWGpQUzkvQWN6WkJycURZTlZDalFtS2ZBdE5Pb3JXVTJEUFlVbWE3aGN6VjVTYWc0d2MvQnNxREYyUjdRMDRLcDNrK3ZZMUg2ZWV0LzhqUDgzMXpZZUhEeDl1TFZldE5STlVDYTRGOWE4SnF0Rm9SZE1xVTVHQk90Q1lHQk94c1hFa0ppYVNuTnllVHAzT2tidGRDT1dzdHVQSHEvbDQ4d2YwdjJVODE5My9aKzY3N3o1R2ovNHQxMTU3TFZkY2NRV2RMMGxETnNRUmIybExiR3diU1ZLcEpKVldLMHV5ckpKa1dRTlNCSklVSlVtU1NaS2tSS0REdm4xN2h5dUs1MU52d2NMNTJZNGNxUkNIRGgwNjYvTnY2eEVsM3RydmJQSDdLMys4WHNUM0dpVitySGNMSVJUUjBHZ1hRaWlpdHJZbWNNejNHNTRRSGE2ZEduTGUvcmRtaVc2M3pRMzU3ZmtIcnhHWDN6WlhlSVFpWEljTFJMdTRLOFFQbnBQM2EvOWJzNFNtWFQ5eHFFRVJRampFSDMvVFVmenA5YzlhOUtGdS95b1IzK1ZtVVgrS2U2cjlhcFdJYTNlRjJIL000ZjJ0c1VZY3IvUGUyeTNkVk9LUEwyNFhRaWhpNzc5bmlrNDN6QkJDS0dMemM1TkVqNXNmRVkxQ0VVSzR4ZE4zWHluKzhPSTIzL081VHR6eGo3V0I2emMyT2s3K3JCdjNpVDV0RTBWaVl1aDI5ZjN6VDJ1YzlyK2xpRzYzdGZ6OTIzY1UwZTJXME44OFJ4WFJLVkVSbnh6Mi92M2p4NHBvMzA4Ukx0LytENTlUUkdRN1Jldzk2djI3b2FIcDNDOWVteUc2Lys2eFg5UmNlZmZ4c2FMZmZkN24ySGhraCtnVXFSS3ZmRjdkWXB6Y2J0Zk85OTViK3dEd1cyQTRNQmpvQzJRRFhZRU9raVFsK3Q3aEtGbVdJMVFxbFVhdFZxc2lJaUprZzhFZ3hjYkdTbTNidGlVdHJTT1ptZDI0NG9vcnVQYmFheGs5K3JmY2Q5OTkvTzF2ZitPVlYxN200NCszY3Z4NDlWbmpVZlB0ckhtRFRNWW90dXd0SnJKYkg0YkZleWd2Sy9ORlNOMDBOdFJ6eU9yQ2toaUh4dDJJUTNpRUpNbVNKS3VFMS95V0ZDRjVrTHhxcXdUSWtpUkpHUm5kdmk0ck83UXdLU2twVnBLazlGOWFJR0R3eUZ1eDZMM1d2VTdyL1lKWEZHNWk4ak92Y0tDc0dzVlJSYVdjZDFyWDZwMlhpd3pJU2NtWW5kVlluWUR1NU9lazVWNU5zZzVBUy8rQmVTemN1UnZHNW1BcjNjbU1lZjlpOThFS0ZMZU5tbW9qVnVCa1hveGRPd3BJSFhRelhXTjluaU90RVpPMlNkSHZuZWRWWjVKU1VyQlZmUTdBMXEyYjBkcHptRFhqWVFCS1MreFU2QXFCUExMNzltUEc1RDl4YjhWbjVQWHR6NmhoZ3pqcG1sL2FybXd2Ly9HQ2pGdkpkaWhYdzVyNXNOWnJwV0hkNHkyUDhSZnk5QndLR1didi8zVkI0MUJaZlJTak1ma1hOVmQyN2Z5Yy9pT25leDl6UWc1OU00eUJmVTNqOU9sM1NXMlQzbnAwK3YxSG1nVUtnaU9nSi9DcnlhSnBCWGQvc0tBcEFtb3dHSHhyZ3JZaEljRmJCNXFhbW9ySlpEcG5ZM3FXd09aaHhYc2IyQk9md3hQWEdQaitteUtjUGxvamg3Mk9UNDdXMFM0NW1XakZRWDI5MXo4Z3ExUklzcG9JTGNMamNlTlVFRWlTZ2k5eDF3OXd5Y250UDY2cU92cGNYRnpjVENEK2x3UnNPcU9obWJPcGtGR2ovc3BqNno5Z1dIWUs5bDFMc1V6NDhQUUdSZzRhR3ZuTUhkQ0szNE9xVkRGaCtHME1XL1FoOHdkbm9xN2NnaVh6cno4NURDMEg5OC9uckZLQXJOeHJHVEhZOTAwYWNTUEdoRlFBc2tiTVlGL09jUEkzRmJCMDNuMHMzZkpIOHArNTk4UU5PQTh5SXUrM2xEVHJhTmRoRDdEaXNRbm5mT3lNeVRCeVJOUGZJOGRBUXZCK1krdm5tWTNSMk96V1g5WmNrZVhXM0hUQjQxUzE3UFYvdi9IZzlQdS9KN1N3M2RHS1h5MUE5UjIwMkxId3J3bmFNZ0pxOEFVTHZQeHFiZHQ2azNDVGs1UFA2WGllQmJBSjN2L3dRLzVkWjJicDczcGhrQVdlaGdZY0RnY09XdzNyZGh3ak9TMmRSQnhZcmJWNHpGTmlBQUFnQUVsRVFWU0JVcXVveUFoUjV4U1NUcTFHOGJnQlNaRWxDUUY0Q3hTOC9qWWhoR1EyeDYrdnFUbHVpSW1KK2V1cDlaUUxLd2FqbnFyS2F1aWFjT3FEcThzb1ZhZlF0MmNLTXJCK3pidTQwWiszdmhYdjJFeVpZemJKT2lmYkNyYVRNL1lQNEs2a3ROcEkvN3hNMU1DTzlldXBWRTU5VDltNUF5bVo4dytLcXFkNHRUYTNsUnFIQVpQaHhQR21BZjJ2NXFGdHhXVFBHdXZWeGhRN1ZUWGV4cXhXSzdISkdZeWVrRUZ1a3B1OEo0dE9malBhVkJhdmZZL212bTJ0NGFkOTFmVkdzRlo2dmR6K3laK2FCNFpTa0ZPaHQ0OUFvcXJxOUNaZTE1NDVsRCt6QVNlMDBFQi9ybk9sZDA0djVtM2JDcmRtNGF6Y3liWWlLd044KzZ4V3E2TkJpbm5sd1VmKzN6NmEwam9jUUVNSXFMVk03ZkJyYThIOGFxSzF5Z0wvS2xOdDIxcElTZWxBNTg3bm51bm56SUd0NFFpUEYzeUhWUmZCd0xuN0FWQkZXM2lxZHdxRmhWOXlTTkdpUG5LTWIreDF1QnZzdE5GSFl0YnBpRFhGVUgva21LaHY5RWpDSTRSS3JaWmsvTVNVSWZXa2toQkNOcG5hdkdXejFVVkZSVVU5OG5NQ3RnbVQvc0Q0Q1ZleDJHUmd6Q012OHRESW5pYytPR1VBVS9JZXBXL3VOYVFaRk13cDhZRUhYckZqQmFPbS93dDdWUWtsVlRKOSs3NVA1ckFIV1RSajFGbjN6V0wyTUhiUTFhaXBwdEk0bElMUjJhQlZtRDZoTThOeis5QXpXWStjMUI2TGZPcDdNbWFONE5VWkh6RTBwd2NaV1oycExDM2xzWldmTWpqOXhBYmtnSWx6R1ByWmI4bnNlU1VaS1NZT0hpaG04b0wzdVhlUWdiVlBqT2V4OVVmSlNJMWxYMkVSanl4OCs1UlRNeUhwekwvaUZUdGcxSFN3VjBGSkZmVHRDNW5EWUpIUDM1NlVDNE9BckN3d0pNSEdqUkJyaHVYellWeWVOM2hnTFFkdER1UXZPbzBQWGMraDVMa2ZaV3VaazBISjJsL0VYQmx5N3l4ZUhuUTl1UU0vUU8xMFliUTBxYVBMSHYzZGkvYy9zMkZYTTFCekJJR2J0eGEwbFdDQmY2RmpYd1JVdEJZQmpZa3hCZFl0YU44K2hmVDBUa2lTZE03ZlUwbUljNU5uYytUSUVmYnUzY3QzMzMzSG9VTmxIRGxTd2JGanh6aCt2SWE2dWpycTY3MUY5UFgxRFRoZFRzbnRMYUNYUEI2UEpJU1FmWnNhMEFCYUlZUU9pTFRiNisrSmpJejh3N202NGNyS1NweE9GOG5KN1M0WUdGYVZsZURXbTdIRUdzNTdXMjY3bGZJYUI4bEpDU0c1UERXVlpkZ3drSnh3WmhxUDIyR2p2TElhc3lVWnZmYjBzb1BzTlpWVVdkMVlrcExRQm4wNkhiWXF5cXRzV0pKU1R2dGFGMUlVTjVTVmdkRU1wak1ZcW0xTHBqSy9OSStWYzBiL2d1YUttL0xTY2t4QjQzcjgrUEVYWW1QanRqUXpQUnNBdSs5ZnI5WW1TVTdKbTJRZkFEWmZaWUUvVDAwMEFacUI2R2h2L1dkY1hCeUppUmJhdDArbVU2ZE9kT3ZXN1pTTHNweXRxR2JQZnZUY21HZ0dBNUlrMGRqb0xZNTN1ZnlGOFFxSzR2R1hXUGxEc1Q1UUZVMi9CZHU2WHMwTmdLKysrbXJQeUpFalVhdlZ2YzlGUCt2cjYvRjRGSXduY3BxY0I5RWJUUmdpdFJla0xWa1RRVXgwRk0yL2dib29JOGFvTTdmcVpiV1dtSmdZTktyVC82cHFkRkhFeEVTamFvWmRhcTJlTmliVEdWM3JRb29rUTR3SmRHYzRWQ2xadldrOFhFYlhIbDFSL1dMbWlreDAwTGpXMXRhK1BHalF0WnQvL1BGSFZ5dkE1azNDOWZuVkpFbHlOVE0vQTZEbU56LzlDeHo3QXdWdDJyVHhyVm5RTm1CK25tdS8yamtJSHJRdXFhbXBPQndPbkU0dnJaSGI3UXBRR25rOGlnL2t2R0RXQkdwQ2VKTWxGY1ZYVjRvUXd1VjN1cTFiOTc3MCtPUHpsanp5eU1QcWlJaUllN2hvcFlibEM1ZFIzWXFDYmNuc3k2Z0JQUW5MLzBqVXNZd2ROK0lYTzFmcTZ1cGVlK0NCQnpaLzhjVVh6ZlBVbWtETkd3SDFhMm9lZk13ZC9naG84d1JjYndUVW42c1d1c0pVV2xwSFVsTlR6KytRbk9zTGR1blN4Y2ZaNWd5a2YvZ0w1UDJhbTI4VFFnaWYxa1pBbFZNVTRXY0NrZncrdHpsejV0VEV4NXVYM0gzMzNYSkVSTVRkRitmYlkrTFdTWlBESUJLV2N6cFg2dXJxWHYvclgyY1Z2UDc2c29ZZ1RhMGhlUE9ER2tHVkJiSXN0UllCRGZqVnZJU1JocUFhMElSQVdrZVhMbDNPLzdmbW5Ldnpra1NYTGwxb2JHejA4Ylc1L0Z4dEFjMnRLWkZPQklHYlFBaWgrSWhBUWt4VVNaSjQ0SUVweDdSYTdaSTc3cmlEaXhmY3doS1djeWQxZFhXdlAvYllZL25QUHZ0c1BhR0Jnb0EvelFkcUlmbHFYaE5VYmhFQjlTL0UwcHd3MHB1cjFwYlUxQTUwNmRMbHZBUUx6anV3QVVSR1J0SzVjK2NnV2lPdjF0YmthL09hcEQ2ejFBOXV3cWVsK1NPbHdlQW1TUkxTUGZmY2U3U3hzWEh4M1hmZnJlaDB1bnZDVXpNc1lUbHJVSHZ0cjMrZFZYQVNVR3VRcE5CVnBvS1h6Z3VPZ0RacGFrMEp1REV4eG9CZnpaK3Ixcmx6WnlJakl5L0kvWjJ6NEVGcjRLYlQ2UUxnNXZINHdTM0ExZWJYMnZ5YkQ4YkZpWFJCQWJCaHcwYVhKRWw3K3ZUSmRXczBtak1PS1B3dmdnZGhDY3ZQU1dwcmExK2VQSGx5d2VMRkw5cFBwS25SU21WQkU2akp3ci9BY1dnRU5LckZlZ1YrbjlxbGwxNksyV3krWVBkNEZqRjNENThXN21YTzZueit1TEtBVjc3OEljQkQxVmhmdy9LUFBtWEd2emZ4bDNlM1U2eEVjY2tsbDlDaFF3b0o1amdhRkluRDlZM1VDSzF2ZFhsOThPcnlRcVBSb0ZLcGhUK0QyUjkxb1luRHJSRndQUGJZWTdVMzN6enFCYnZkL3ZTRm5oUUg5K3lrMm5HdXJ1WmszNjdkMkU0NzQ2YWNrVG0vNGNCWkVIOVpLNG9wT2dQMmgyMnZQc0s5VDY3NTJiK2tJM09ncUpYbnNXOFhaL0JjVDBmY3pMdHJORnRLN0QvcHVaNUtLa3VMS0trOFM3STc5d0dHWk45TTJVa09PWDc4K0F2WFhETW9QOGluMWtKVG95VU5VWEJodTQrR0tOU25GaG1wOXlYZ2Vxc0s0dVBOV0N4dDZkQWhoVXN1dWVTOHBYV2NPMkJUNmxpenE1d3VxUjI0SWFNZG03ZmtNMnRyQ1FBL0ZKZndkYjNNMWQwN2t4MHJlT0NGVlJ3MnRDVTlQWjFvblliOURSTDFIc0VSUllQUmFNUmdhRVpTNlFNM3Rkb1BibDV5eW1ZRWxZMkFZOE9HRGZWUlVZYVhiRGJiNDc2QnVTQXllK3pWRkpTY0sxN01TaVlPdllraSsra0RZV2xKTWM2emVHRS9XL1U0MHhlc08rM2piVFZIcWFpeS9leUJiZnhVU0dobEZrOGN5aGs4MTlNWXFSMUxXVkdSUnY5VS9VOTZycWVTdGZQL3dMelZoV2Y5b1N3cExqMVJ1WnpqNk5Hano4WEd4bTBKaW42ZURxaDVKRW55K0lNRkxjM1BVTEpJZjFXQm40SW9QVDM5SnpIaFhqZ2ZtMnppOGZIWEJ2NXNZei9LZmJ0L2dQNnBkTzdlazhlNysvZWtzbXZ2ZnJaK1g4MUQyWjF3dVFZU2s5Q085emV1cDZEY2dja2srY3pTUU5vSFByOWF3TmZtZHVNckpjVVQ3SFB6cFlRQUVCMXRYSGI4ZUxYZFpESk40VHpXbHBidVhNZmlOWjlTV09IRS9zeWo3RGJMNUk2NG0yRTUzakxwZlZ0WHMyVDUrMWpsTm95NWR5cURzcnc1T29xOWdrWFB6R2RIMFdGaWt6c3k3dDVwWktjWTJaMi9qRlZidnFERVZzT2lPWC9Gb3BVWk91NFA1SFUrZFFMdDd2eWx6RisxbVlTTXE1ZytiVHdtTmJpdFpTeGU5REs3aTc1SDBjY3hlc0lVQm1lbmdMT2NwK1krejg0ZHV6aGdyV1Rtek8vUUpmZGk1cjBqQWk5RC9zckZyTnI0QlJqYU1tckNKQWIxOVBYZFdjMlN1WSt3N2VBeGhrMzRJNlA2K2twZjNGWldMSnpQcHAzZmt0RDVjcVpPbXhRbzZONjNiVFdMbHI2UERTMFpBMjVpMnEyRE9SK3B1UHUyd3ZKTjNobmNPK1Rad0tvdFVHS0RSWFBBb29XaDR5RFAxL1h0NjJEWkduQWJZT0kweVBGWHVUdmdtUVV3WkRBc1hnQjJBMHlmQmVtKzRYaDE4UXNNSC90QzA3MmM0cm5hcXc2d1lQNGk5cFRVa2pub3Qwd2ROeVJRY3JWajNXSmVYZjFmbkZvamVjTnY0NjZodlZHcTlqSG4vN2QzN3VGUmxIZjcvOHpzSVp2TlpyTXNJUWtoaVRGZ2lDSEVpQmdSSXlJaUlsSkVSS1NJaUpRaVdxcldvclZLS1M4dlB6elVJcVVVclZJOElaNFFFUkVwSXFVVUVSQVJNVWFNTWNRUVlnZ2hoR1d6MmV6T3p2UDdZL1l3dXptQWVLSytQdGMxMTU1blptZWV1ZWYrbnU3dndoZll0YldDdXJLL002dm1uNlFWWHNhTWNZTlB3TkpjTEYvNENCdEx2MkxJMkl1amtheWhnb1VMRjFOV2Zhd2hQam45cVNjZWZXQTMwYldmTFRIbVo3dWdwbXR3SEFWcWtVQkJBb21KMGFDbVZSWDArdlpraUw1ellJc1puOVkza0p0K1Z0c1AvTWVwT0tJeUtUVUpnTHk4UEJSRm9WdEtOK0piV2toT1J1ZHJDeTFoOEFxREcwQWcwQ200aVM1ZG5Lc09IYXByN3RhdDIyM2ZsU3FJUFNPUDRjTnRiSC94RVlwS0xtTkl0cG0wRE0xUFY3NWhFU1B1ZkkwRmkvNlhaRjhsTThaY3hkSnQ3MU9jWW1icGZUZXl6bmNGODJhT283NXlEdzBOYnNpeWs5NnJIOE10RnRZc2VaSGlJVmVRYjRPczVKTklvRldxV1BaeU9RL2Uva3RXekwrRHlYTXNySjQzSGw5OUpZMldiQ2JmTmdwZi9XNXVHMzBaUzNkK3lzQVVPNE9HWG9IczJrMWxiUitHRDc4QzJSYXBYWHh4OWczTTIyWm53Wnhic1hwcUtOMVhIZ2EyTFM4L3g4Z2xEekVoZXhzVHh0NU1jZlc3WkprVkhweHlCWnZOVnpEN3pqc29YZmtvSXlZM3N1dmwyVkMzbFJIai80Y0Z6LzZkYkx1UGJYczB3Y3ZPZ0czYnFzZlpzUGRRek0yeks3ZmRONE9VVG1ablNqWU1Id3BUUjhQWWV5RXQrTjMwWGpEY0FtdVdRUEVRZ3NjMWFGNHZnNmxQd01KSGdGb1lQd3cyN1lFc1N4RFk1c0c2N1RCMU10QUlqUzdBQWREQSt2V1YzRGV2VUhmbGRISmNQZFdNSFh3RitWTWY0dlpSYVN5Yit4dG1laXdzbWo2WXh0MHJHRDN6RlpZdmV3aUgyc0R1YXMyTWxhMHBEQjErQmQ3eURjaFpGekI4ZUJIVzVCTTNDVjQ1N3hjczNKdkJvdnQreWJwRjkxS2hvMnR6cHY2TStuTm5mWEg5OWJiblI0NjhKbFQ3R1p1bkZscGFPd0sxVUZWQlorYW5CbXBkU1V0TEpUTXprMTY5ZXBLWGwvZURNZmx2Qkd6Vit6L2hzVThDUERuajdGaDdsV2ZXYkNUdTdBRmMyU011L0c2ZlBuMUlUMDhub2JtWjFGUTZDaUlFdnkwRWhLT2xIWUliYUlDWW1wcTJmdi8rL2E2c3JNeGJaRmsrLzlzK1VJNjBYcFNrOVNMTlppUy8veUJLOGlLSGJ1bkN2ekJ4MXF1TUtNa0Qrak4xNkZPc1dMdUw0aWtEYVd4b3dKcVZRazV1QVVXRlJib0xNNStVYkR0MnM0VitKU1gwUDlrS0d0bkt6TGx6S000MlVqajN0NlNNZWc3WHZQSFlldzFpNXFROGR1N1pqVnROSVQvZHpjN2R0UXdja1VYL2toS2E5cVNUYk02bHBLUkVCNUxWTEZ5OGxRVjd2bVJZbGhrb1J2Y3BCU052Wk5xb0lVQXhBMmY5bWIyMWtHWFp5c0oxQ3Bzcjd5WGJEUDN1K3dOUDlQb1pwWjdaNUxzYmFGS3NwR1JrMFM4M25YNzlUL3gzTEE0bmFXbHRiaU1ZVDBEemtyT2dKQXRzeHJhQWw1SU5kalAwS3lIcXVDNTZCTzU2QWdZSDkydjAwN0I2Szl3K05QZ0ZEOXk3Q0lha3gyeXNxWkpLVndiWitpSmIyZGJoY1MxYit5eGxHZGV3Y3Zvb1pHRHV2YmVTZjgrTExKbytHRzlESTZyRlJscEdOZ1ZaL1FnZkltc3lKU1VsN0Z2dHBLbFhVZlI1NnRoaHdQSVZHNW01NmlBREM2d1V6NzJISmF2L0VQR25IV3I4b0xYVi9jcklrVGZ1cDIzdHA2NUVpbGFKamtITllEQUlrOG1JMld6U2dWcHNVWHVvWENvelhDNzFRNDVUQnJZalgxVnh5eXNmTWZlbTBlUW02R2VoWU1PbWpieDZQSm5sTnhaRzNhMGxTU0k3TzV2RTR5NHlNOUNab21xVU9ScGFqOGJnb0RQbUJoSWFlUlBpekRQUDNQYmhoN3ViK3ZidE85VmdNQXovdmc1aWRYVXRaWXQveDY1blEvL1d3dENoMnZQcGMvL09mYlArbDM2NTkyUEpLR0xSc3FjWWt2Y05va055Q3VsQmVtSkp5OERhVkU4ajBMVDFhWVpPZnBUaFk2NG14VzZtd2EzZzlaMGd5dUN1cFVaTkl5ZXIvUktlWkljelBFM01aZ1ZGQVc5ZERZM2VHdTRjZDAza2UwWG5vSHJCMkdza3o4N2F6YXhKVjFCZTQyWDQxUHQ1Zk03a1RuWFhiSTRVMHRKaXZpSGJ2NU04cE9wYVdEb0xWdW1JY1QvOWhoeVFtOTZ1WXhsRi9qcmIrUkpYNlhiR2pQNDAvRjV4M2tXb1FQclF5VHc0cG9LcEl5K2syaVV6K2Q1SG1ULzlWS2RxRTNYMUZqS1NOYitmTVMwTlozQS8vWDcveG9zbjNyN214aG0zSHRLWm4zcFFDeGUxUzdSUjZvZ0JOUk1tVTNzTldFS3kzbTFCN2Z2SVZmdldnZTM0a1lQOFl2bFdab3kvbWt2U29wMnA3NzczSC83eXVjelROMStNdlozQ09ZUFJnQ09ySnozUEZLaHFJSWF0aFlBczVHOExtNlFkZ1ZzSURVWElORDMzM0g2ZnJGcjE2cCt1dXVxcXcyYXorY1p2UGRvaXk2Z3hZdmxaV1JrVVRmOGI5NDVxYXdVN2NvcFpzdUlOUUdINXJKOHphOEZ5dGoxeFp5UjJJNnR0dFBjN0Q5N1VVMU9yVUpSanhGdFhnOGVaUVRMd3hMTEhHRFByS1I2YzNBL3dVYm5tejdFNzNtYS9zYVdUSWRkUldlMmpWOWJKMVNlYTB6Sncybko1ZXUxYllmTlBQNTFHelpqTHFCbHpjZFh0Wm5EaDVXeWVPcGxoblpRRVZ1N1p3dHB0QjJKV2swcnhpQ0hZdjRselRtN2IweUFySGNZc2h2RUZYek9VNXNnbXgxSkhUUVAwU3VHRXh6VXIvUXhTQnFTeWZ1VzhkclpoWThyc2hVeVp2WkQ2MGxVVURmdzlVNllPcDVkUlA3OU9OampsSUQzRlMwMkRCOUtzS0hWMU5LclE0dkc4OU5qU2Y3eDl4eDEvY0hVQ2FsNmRXYXFQZnJZQnRVaGhlN3hPcWNPdTYxV1FHaXhzejZGUG56NllUS1lmUEtqMDlZSE5mNXdaLzNnVFMwWnZHZy91NTdtRFlJaDNNS0VvaS8zbGU3ajFyYys1NGRMK3JQOUFpK3ljZGNhWkRFaFBSUFUwc2VLamFqNnBidUtJVDJWdk55ZjJ0RFBJVUtOOWJEcFFDejBYSWF2VDc5ZHkyYlJFWHdJUmJBc3pRaUdFRUdQR1hIc3dMeTl2d2Z2djc2eTMyV3gzOEMwbUl1Zm45Mkw1b2dWWVJoYlFxM0FnK1ZsT3B0NzVLNGJmOVV0eXpQOURybE5tNTZiMTVJeTZoNkg1ZGxZKy9pQmtEeVEzemN5dWZWWDA2bitUM25BaVAwZmg4UVZQVU44L2cvd0JROGc1a1o5TjliSmd6aXhTYmgvRml2bC9adGpFMzJFRHNyS3plWEh0OCt3cWtpbGI5d1RyeWhYMEtsZTV1WDNZdmVRbFhoeVFqQ010aCtFREM4Q1l4WjB6U3JocnlxMHNtUE1yck40YTlqWGFtRHF1NDE0RWNsb0pkdzcxTVhuNkhHWk5Id1dOTmF6ZFhzWGMyYmZqSzkvTW92WFZEQ2twd2xPOWxRWnpEdG5PenYvTzhDbXpHWDRLdXBHN3QwS2pGMXcrMkw0Skdxd3djSEJFRlRnL0J4NWZBUFg5SVg4QTVDVEQ3VE5oNmpTd3pkZUNDbHZXdytEYm9kOEpDWFFhdzRhbXNHMTdPWU5IUld1SHRYZGM4MGRPSW1mdXBkeTFJSThKUS9LcEw5OURxVHVOZTZhTW9HcnJhbGFWK3hqY0w1ZmEzYnVRczdKSjFzM092RjVuOCtDS2Y3QXF3MDF5Umg2RCtuWG1Ncll4Y2VKdzVzKytuNno3ZnM2YVJZOG94eFhseVV0emUvL25VTnNlQlhwQTgwcVMxQ3FFYUNmNVZoOG9NSWFZbW9pUEQ1bWZOaDFUMDBBdDFLdWdUNTgrV0N5bmgzemkxMC9RVmYwYzlSbElUVERoOVN0NC9RcXRzcG5pRENmSG0xdXcybXlZUkNEOFdWSVhKemxKRmtTcm15MzdEMk5MNnNMWlRpdCtJWkdYbTR2VEtGQVVCVldObEZ1cHFnaWJvanF5Um9pOUNkSGgzZ2xKa2dRZ0dob2ExQWNlZUtEc3R0dHVyYkphclQwbFNYTENOMC9RTFI1eUZVcmRQajZ0cUNLK1J4OXkwNVBvMm5NQVZ4WTVXZlBxcTJ4K3Z3eHJabCtHWG53ZWlYRXlub1pLTnF6L0p4czM3eVNyWkRKemZqMmFPRGxDRVM0WmNTVU41WHY0Zkg4MXFiMzZrOW4xQkJORFRtWFVzRE40L3BtVk9NLzlPUS9kTTU0NEdmSXZ1QlJSdFlOWDMvZ1hDZjNHTVgxMEVUMzdGSk9WckdWNkorV2N4NEFzaWQwZmZVcWR4OHpGNTJtTzNZSkxSNU5ycWVPMVYxL240Mm9YRncrOWd1eFU3ZGc0TTNwVGtKTWEzdGMreFJlVEhDOVRNbW9jbHJvUFdiVnFIWjhlT0VhL1M0WnlUcThlR0NTRkQ3ZjlpdzNyLzBuWlZ4Si9XUEFvNS9WSS9FNG03dHN2dzBjVjBQZENjQitFNmhvNGQxQUUyQzRaQVEzbDhQbCtTTzBGbVYwaDYxd1kwQjFXdlFvN1BvSzBQakQ0ZkxBWUlyZjVBUU1ocnAzdFpYZnhNK2ZwWFV3YmUwblUrKzBlVjFNUzE0Njdpcy9mWGMvYXR6WlIzeHJIa0tIRE9DUFZqb3lYN1p2ZjVxMzE3L0JsU3pjZS9zc0RuSmtVT2VlWjU1WndWdHd4UGl3cngyMTBjbjUrZHFmSDRleUxobUUvOUFFdnJYdTNNbWZ3MVkrdFgvblkrODNIajNlazBLRlA1L0FGQVMwcStUWTIraGxxdmhJZnI1bWZpWW4yb0FTUkpoU3BCUXA2VVZCUWdNMW00M1FaMzVvZTI2bU9ZOGVPVVZwYVNrWEZGeHc0Y0lDNnVqcU9IR21JMFhGckNSYld0K0x6K1NSL1VNdE5WVlZKVmRXUW5wc0JNS0RwdVptRUVIRm9jOVJTVnZaSlVXNXU3aFNEd1hEcEQ2SEg5dFA0TVF3UGQ0NitrbEVMMzJKSXR2VzAyak5GVWY2OWZmdjJOUjAwTSs2Z1Q0SHdDMEZBbHVXQVB2bTIvVHkxV0YyMVVFcUhGdjBzS0NnZ0tTbnB0RG9teGg5NkI1S1NrdWpUcDQvTzlOU2JsbEZFVFUvZkpOQjZKMmltYWRqSklVSit0NkJacWdKcWZuNmYzYzgvLzN6dG1ESFhWQUUzbjg2WFQvbXVUZXl0YW16bkV6dkR4ZzdqcDBLd0gycFlXYmo2MzkvN1ZuME5GYXpadktmZHozS0xoNUxqTkQ3LytPT1BiN3I3N251T0U1M09FV3QrNnR2aytTVkpEa2dTcXI1TXFyMktnbENlV3F6NXFSZUxQTjFBN2JRQU5nQ0h3MEdmUHZrNlVKTjBqMUlZNENSSkNpMUNraVJKODdrcFFVQlRVVlVoOVBsdElaOGJJRzY0NFlaYTRLK2ZmYmF2eW1wTm1BNTBQeDB2bjR5OEl1d1o3VVF6WlNPMm45RGwvOXd3MmpNWVZHS2pIYnZxSzdmSHRUd3hNVHNrNDYxUDU5Q2JvTzMxL2d3QUFhMnlSMWJiTDJqWGZHb2g4ek1VL2RTWVdnalU4ci9WemxJL09tQUQ2TktsU3pEM0pRSm1Hb2lGbUpzVWZoM0wzQUJKVlNVVlZDa0VhbnJtQnFoQjlpWjY5ODVidlduVHBxcnUzZE51TWhnTVEwNjNFMksxT2JIK2hHQS9qZEQ5ekd3aEpTYlJUMUdVelR0MjdIaWpwT1RpR2pydnpxNnZKR2l2OFVxb3FYR2Jpb0pJOG0xSGdZSjh1blRwY3RvZXQrOU0zZU5VUm54OFBIYTdQYXpmRmdva2hMSTZPZ2dhZEpZd0U3WnRRd0FIaUdlZWVlYXcxV3JkMGE5ZlA4K3BLSVQ4Tkg0YVA5UTRkdXpZMHZ2dXUvLzFXMjY1NVlqTzlEeFJ6V2RVTWJ0T2VpZ21uY09pNjlJZUt6Mms5Nm4xT2ExQkRVNkQ0RUVISjQ5UFBpbmppeSsrb0tibUFIVjFoemh5NUFoTlRVMjRYQzZhbTV2eGVEenRCQlQ4S0VvZ0ZGQ0lEU29ZMFlJS1pvSkJCU0R1d0lIcWkzdjA2REZaa3FSemY3cHNmaHFuNjFCVmRjOW5uMzIyS2orL1QzbVFwY1g2MC9RbWFKVHBpU2JqSFdKcUl0TFEyRVRIUGpXOStSbk4xRTVIbjlxM3h0aWFYQzRPdWYzWUxHWmtQV2NLS05RMkhzTWpETmpNMFJtNnJTMHRIR3hxSmk0dURwUGNNZEd5V0N3NEhJNXdUOUxvNmdUQ3ZyaVk1R2FwSS9JV1NnSFJtNmFoMTQ4Kyt1akJnb0tDblRrNU9YNmowZmk5ZzV1cnVwUjNQcTduckt5VWsvK1J0NTVWYTNiUTgrd3p2M0h6a05OcFZPM2R5dnAzdGxEWFlpR25SOWZ2ZndkTzhiaHVYZnNpY2xvQjlyanZacmZjYnZmelR6NjU5T1dSSTBjZXBQMTZUMzBxaDFmcXVPZW5ydTdUSEdacVF2Rmh0am13MnhKSVRJdzBYd2xKRDRWVU9nb0tDazZZSnJWM3l6b0NYWHVTYUpaQWJlVEZKNTloNi91N3FQZlpPQ3Z6KzlOaisvbytOdFhOci8reWt0MStNNmx4QVdyOThUdzY2U291VEltbjV2T1B1ZTdGSFRnZGRqeXU0M1R2MVplL1gxZE1vZ3hQclZyRmtyTGpaRHJpT0hEVXl5MWpSakMxVDhjWGMySmlJbjM3OWtXV1pXVFpFSHlNTEpLa2Y0d0VGQ1JKd3UvM2kyQ0ZnaEJDb0twcVZDQWhxUEdtQ2swNkpIRGRkZU5xZ0wvVjFCelltNTZlZnBNa1NkOXFaNVQxUzJkUmtUNmVHU1BhcHJ6WDc5M0l3ZzFHUnBRVW5Qd0tQVlhNZjNBcGc4Y013ZmxmQkZ4NzFpeGtWV01CY3ljUGJmTlozYlluR0RUbE9hWlAvaGx5aXVjNzI0ZmE3Uzh6ZDdQQzQvZE8rSmFPcThxS0JYOWtWTUY0TXI3bGtMV3FxaDk5L3ZubnEvTHl6djVNeDlKaU83TjN4TklVU1pJQ1FxaXFFQWpaYUZJTkJnT1JFcWxJbmxyZG9hOHdkYzBpTVRFeHFxQTlVaWFsVlJRa0pDUjBmbCtvM3N6a1dTK3daY3VJa0ljUW04M0czZzFQc2JiQ3dvaUJlYWN4c01rbWJoazdtb0pNTFJxeWF0MGJ6TjM0TVc5TktNYnFUT2ZWMzk1RXV0V0U2bk16YWNGenZGU2V4OVE4T3hkZWNCRTNqRTdGTEVQTnZnOFl0bklyMS9RWlEyZjM1WVNFQkFvTEM5Rk9pSXpCMEI3SVNVRmdrd21LVTZKRlRQM0JvRUs0SVROaHBOTVlteXBKVWlpb29BS0JqSXpNelU4OXRleVRjZVBHamJWYXJkUGF2WHMyMVZQdlVzbktTb3M2ZUNyZ2RUWFE0SmJKU285Y0ZxcWlVRjMyQWFXK0lTaUtnaXdia2VYd3hDVjcrQXpXanpTMnVWamNqZlg0ekU3c3NvYzZ0MHhHaWozOG1XTHZ4ODd0eTl0VUFDbEtkQ21PYkRSR3ZxUDZxS211d1pLY1RyTE5FcnM1a0ZYcXFxc3dPdEpKdG4vNzJlT3FxbEJYOVFtN2ErenRIQWVGbmR2ZW85L1lXN2huNW5oazQ4bE5TOFhyb3JxMmtiU01tRDZsS3FpS20rcmFKdEt6TThLMXFxcXE0cTZ0WU10dWIzQWZ0RGwwd3VQcWRkSGdoalNubVpyYUp0SXowc0xmVVJTVlJScy9iVk8wcnlwS1ZDUlQvMzhCbXVxcWNjdjJObjFlUTJvb0IvZVhQLzIzZjZ6WThzRC9tK3NtRWlEUWwwZnB6ZEQyVEU5VmtpUlZWVFhyUktnaXVwbXgyWXdzeThSWnJKaGtpRSt3NFhBNHRNVnV3MktPSXkwOWc5emNzNElWQldadER0VTJrcDZSUmtOTk5iYTBMS3k2VS9Yc3dnY1lNdmwvSXRGNzJjSElDUk94Tkw3TDNxb083dEZOOWRTNUZMS3kwcU91SjhYcnBxYTJIa2RLT283WStSbzhTbzIxMWZnc3pxZ2VyS3JQUTNWdHc2bEVSZU1veUl4dzdpeG5FdDVEZmdDY1hTTXdKWnNUeUxBYmFmRnBGMXRlajRpQ1pvclRqcXo0YVQyUnBrM1FMSTJBbXlFRzVDS3NMY0xncEJEQVNaSWtpZERGSGdRNGdTNWkyZzU3VTI2K2VVcmc1cHVuUEZsZS90a0hPVGs1RXd3R3d5V2hnL24wZlQ5bnp1cEs4dE5rS3R6cHJGNzNFdm5KWmxZL2NpT3pWaDdBYmpRZ2U2b3hGOTNDdW1Vek1WZHZZZmlVLzZWbTMyNmFiSGRUc2NwSjl1QWJXVHByRXVCbDlxUlJiTno3R2U3Q1d5bGRIbXhWN3Q1RGJ0YlBLQ2pKWS92ZVJnYjBTMlBmN3IzTVcvMHhZNG9jckh4NEJvK3YyY0cyS2lmVk5XOFRKdmMxV3hnKy92Nmc0cWFQMHAyN1diVDlLSlA2MmFndjI4Q1k4Yi9DbkpGUFUwVVpRMlkreGlQVE5OYWtsTDZJWS94elRNazl4dFlhZ2FkUlljV3VIZlQ3TnFQNDNuSW1qZm9WWmRXbFZMbTNNWHozQzFoeUwyZnRrbnZBVmNyNHNiK2h2THlVR25VWHc3Yy9ROUhvTzNoa3hzZ1Rzcjh4TS81R2ZtRU9lMHRyZWVURk54azNJSXVtN1V2Sm1mQVlSU2xXTEZhRmZlNTBObXg4aFY3Mkp1NFpmejFiOTFWUVZhY3lmUGg3NER5SGwxOStCQ2QwZUZ3bkQraE9WZklBcW5mdkpHL0FoYmdxUDZKbzJ0OVpmTnNReWpjczViYUhuMmZ2OXUwczJkUEMySEQxazR1N3h2Mk1YZlVhdEZYdjI4M1FXYSt3N000UnFLNUtwbzI5anQwZUp3NWZQUlQ4bkxYTDdnMVdUTlJ4Y1dyLy81d3hyT2pORjVhdnErcUFwZW5OVUY4UTBIeDZsaGE2YVV0YXVFM0VtUXlpVlZFSjlmMDBHK0dyMm9Pb0JoUHlWNGVRVkxBbUp0RzFxNU5Ebi95SDF5czlaR2VrOFB3enk3bmwwWmM1N3p3THkrKzlodm1ibXJHN1A4V1ljUjQyNVN2cWs2OWs5OHR6Z3BkSFBTKytYTWJzZTA4MkZ1ZmxpYWN4dkRnQUFDQUFTVVJCVkh0djRwRjFWZVNtbUtsMEpiTnEvU3ZrT1kxc2ZmbytKai84TmdXNTZWU1hsVEx3dHIrdytNN2dmR2phUlhiZXJZd2RuY3FHWFVkUVhJM01XL01SK2FXUE1QemhMUlE1QkUxTnRlZzZScDNDNGp2T3JRdi93WkpQRHJmNXJIWi9LUmZPZjRVRDN0amZCWGg2NVVvbXYvbngxOXFXcWdiNCtPTzl2UGJhYXl4YTlCZnV1Ky8zL1BLWHYrUzY2OFl5Yk5nd0xycG9JRVZGUmVUbDlTWTdPNXZ1M2J1VG5Kd3NKU1VsU1FrSlZpa3VMazQybVV3R2c4RmdsR1haSk10eW5DUkpWa21TRWlWSjZpSkpVZ3FRQWVRQVp3TkZ2WHIxR3REWWVPVC9DYUhXTkgrNlNuVHRmcUhZMzZ3SUlWVHh0MTlkS241Mi83TkNDRlc4OXFjYlJMY0xKb3ZqQVZVSWY0TzQrdXl1NHFrZERVSUlWUWloaWlkL2U0VzQ1YkV0NGRmNjVkTlhab3MrTjh5UHZIZDh0emlyeDZYaXNGREV6ZWNsaVgrODN5aGVlK0FHOGF2SE5rVytjM2lMNk5Iak1uRzRuZlVKb1lwM0h2dTFPUGZxZTdUOUVXNXg4L2s5eEVOdmxnb2hWQkU0VmlyT3l6eGJmSEJNKzY3LzR4WENZT2dpbm5xM1d2dTkzeU5hL08ydlZ3aFZ2UC84YkpHYW1ocXpkQmRQL3J1Mnc5K0VscmYvK2d0eDFlK1d0ZnZaRzMrNlNWejd4eFVuWEljUXFoQ0JPbkZwank3aStRL3FoUkNxK09TVjJhTGJoVk5GcTFERjBmZWVFSWI0czhTT3cxNGhoQ3IrL011THhFMFByUTMvOXZQWDVvcysxODl1ZjczdEhOZWJMa2dWcjN6cUU4Lzg3aXB4NDU5V2l5UHZMaFY5cnB1cis1MVBYTjhuUWJ6eWVmdjcrdFdISzBYdjNpWGk0K0QrUEhYM1ZlTEszeTRUQWFFS0lUemlqc3ZPRW45NXAxcW9hcUNtcnU2akJUTDhIQmdMakFhdUFpNEhCZ0VYQUVYQnVaa0RaRWlTbEJLY3U0bVNKRmxsV1k2VFpkbGtNQmlNSnBQSllKUWxHY2tnSmRrVEpBa2taMnAzc3JPelNYUEVZYktuY3RGRkE3bDg4UG1ZSkNpNWVoTDMzZmQ3SG5yb0lWNTc3VFUrL25ndnJyS1ZkT3Q5TGMxQzVibmZYYzJ2SDl2TWwyODhUT1pWZHlJQzVaeDc1aVVjQ2w2ZmdmM3I2Tkw5TWc2M2MrMisvZGRidU9xM3k2TGUrK0xOaDhtODhBYU8rclhYci8rLzYvblovU3NRUXVYNHNTWUNvZlVlM1U3UHJ1ZnlSZkI3NHVoT3pqQ1orTU1MdTRMcjh0TFNxdkRwSzNPSlAvTUtEcldxQ09INkJubHNxcCsvdmZvV1NxOEx1Q1UvMnFCc2J2eUtXMS8rZ1B0dnVJYU1HSWZxZXp2L3cvTU5kbDZZOHZYMG1pUkpvcUNnQUtQUmlORm93R0F3aGhtY0xPc2ZvM3h4WWIrYkpDa2g5aVpVVlEwcmh1allXNmkvUWlERTNpb3FLaFNucyt1cXQ5NWE5MzdYUTl0SE93ZGNlbE4yVUNsMjZKRExtUC9FYm1BaUFNV0RCbUdUQWRuSjRJRTU3TnBkeXVUaVFhZDBhR1diSFJzeWRvY2R1ODJPeldiRDdUazVtZTdxcmM4eWZVazU2N2E4b2UyUHE0ek5lenpJbTU3ajNpMGE4L1FwMVpSV3VPblhUNlB3NXB4QmpCOFlsT0F3V3VqTUVPMC9ZUTUxRStiOHNNNjYycjNzOWVRek9GaTluajlrS01iSnY2WmFoV1RBbmorUS9zbWFBVHBrME1Vc1c3c0xHSEdLRzdOaXN4bkJic05oYzJLemUvQ2U1TG53TlpReWJ2ejl6SC94WHhRRTkyZlR4aTM0Y3JPNTc5N1BBQ2gzcXh4NWYvdUtGVisxYnBrNDhjYWpKMkJwb1JwUG55UkpvVFNPZ0M3cUtmVDVhVDdGTDR4eDhaamo0akViUEtMVkQ5YXU4YmdQK2VuYW96dDJleEoyZXlLWjl0MGtkVTJoUjQ4TUVrUWpMeTVkVEhXREIxVngwOVJvSjlTQndXNnpZM1hZY2RvOElOdXc0aWJrRGZVMk5lQ3hPemhab3I5MTg3K3hJdlBnck45ckhMZXlubEx2SG1BOGFsTUY5OTcxSjNhV1ZlRlZmZFM3RzJod1EwNW81Wlo4Sm8zdEYzeGh4aEwwTldUM3Y0QVVNNER0VklFdHdJdHZ2TVYvNURONTZzcjhLR3V5MWQzQXJjOXU1TnFycitLcXJPaE0wNC8zdnM4ZnRydjR4OVFSZEQxRlpaTzh2RHhDemsrajBZakJFQUs2aUptcStlSEN2amdSZkpTQ0VWR2RiellLNEZRZHdJWEFMUUFvVjE0NVlqK3dKUE95WDc2cktNcTFScVB4aXBOeEtuL3pJVWRzOVpOWW5hZDJOK09uL0puRnEvOUZMNGN4dkIrcU9abGhZNjRtSzdpcTBhT3ZKU2MzVXU4b1cyMmNyRmR0NytvRlRKcnpYSnYzNzMzOG40d2ZrTUtQYjhqaGg4alpPQWxaSWFXSjI4ZmZRTW5zcHhoVGxCYTF2Z0ZEcjJaa2dRMUZVZDQrNjZ4ZUc2Wk9IWGRnZVFUUU9nSTF2WTlOMFptZVlYOXhxRStJTEJ1RTBTRHdla0gxdWtWRGF6TUlnYi9GUzBLQ2pUaXpqTWxxbzB1WExqaWREcXhHaWE2cFBlaDVabGZtL2ZJUFhMOXNNOU9IRldDczMweGF3UjlpL20zN2M5Sml0MlAydUhCQjI4Q0wzTjdWb1pKVmRER2pSNGR1L2xjejFaRUJLTnczNldvc2s1NW53eE9ETUZOTmNmSkYwZFBmYXNQU0RuTEpzdkViQkE4UXZQbjIyN3gwUEpsbmYzNGU4YnFkVmp4TjNQSFVlZ1lPR2NhTnZhUC8zdWZsSC9HYlRRZFo4b3VSbkdIOVppcjRQWHYyeEd3MkJ3SE9pTWtVRFhEdE1MY2d3RWxTUkhvOFVxRVFZbTI2d0VKQXg5N0NrK2pBTzA5K1lESTlXVnBUYytDZHQ5L1plRjIvL2xQQ1NyMDd0MnpCclU3R3BqYXllVnNsbzZaR1pLUnRWaHVORGZYZjdmWG5xMmY2dUJzWStlQUxETXZYSFh0N0FVUHlQVlM3bkl3YnJrbnV1QnNhTU5wTzdSemtEWnZLMnY3ajJzeGNaOHFKUS9sV2F5SU5EViszbzVPUGhUT25ZeDB5ZzJramduZnA5QUlLcldWczN0M0FoSDdKbEczYWlGSjRQbGt5ZUFCWDJWWjJOZmdvVGphemFjdC82Ti92OTVGOXNOdHcxZGVnOEYyVzNhZ3N2ZWRHYWdwL3paSUpBNkkrR1RKMElLOStYck5yMHVDU04zdWZsZnRwNk9ZWkEyanRnSnJrbHlRTitJUVFBUUVCT1p4d2l4b0lxQUxKZ05sb0VrYWpFZUZyQnRra3pzaE0xd1FpWlM4ZmYvWVZSbHNpNmFsZCtkenRvVnUzYmppdFhnNDJCUmllY1NiNXVRa2NjWGRsME1BQ2pNRDJkZXVvUDhuN3M1emRqMExmUHNvYW9TUUcyZEtjM2FuY1dCVWxFejlvOENYTW1mOFplZjN2UWJzSEs1cHNQaDZxcXoxTUxTbkdMRVBWcGpYc1BZV21YVi8vM0xZYzRvRk5YK0N5eERGa3ZxWVFhdTZXdzd2VEwyWEhoeCt5c2U0NEg3eStsbis4SG1RSGx3L2ovZ0daL1AydDk2aHRsTGxoNFRQQkZjV3piT1lFK3A1aS85VE16RXdkdUpuUWtnMk5ZVk0xbXNXRmdVNElJYVJnUGFtUXBFQW9WeTRjV05DeHR4REFSYkUzd0orUmtma3YyUmovM3I4L2VYNllFT0k2SUMrRlNvWU51Z3lqcHdaenllK1pNQ0J5ZG9lTnY0VkY0MzVGMGVvSHlCdDJDeS9PbjByZDloY1pPL052ZUJxcXFHcVFLU2w1azRLUmQvRDRqRTcwdDd6N0dEZnNsOVI2WGRUWFZ6T3k1R0xNR1JlejhjWDUxRzk2a2VXNzZpaWNlek12ejlWTzdid1YvMlprdnBVSG4vNEg0OGIvakRVTDhyRDQ2cWwyOTJEanJwVmtuTUp4TjF2dFpGaFBMYStoLzhoSk9CNi9nWUtpRjNBV1hjT1dwMmVkRkxCdFhQa2NqclJSRVdDVDAxaXcrQStNSFhNaEt3cHlLQzJyWmZHS056R2pBWnM5emM2OUl5L0ZhbFVwZDJldzdwR0lRbTM2Z05FTTVSb0tDOC9EbG40QjY5Y3Z3ZG5KY2Uxc3pKOTJCZXZLM095cjlMQjMzRVVzdERwWXNPcE5pdTE3ZVhEUmVzaXJvVi9SMzdUcllPWmYrZU1ORjMwMjlCZXoxdnlxNzZBUGV6OGNVSFJSVEwwaWh5K1dvVW5nRjVvYWh4S2NoMm9FMUNRaHl3aEZFVUpJTW1hemRqMGNiM1lKYzBKeXVBdWMxZXJFWVR5QXF6V080dUtMYUZqM1QxNSt6VVc4MFlTemF6d1pQZlBJN05tTG1WTnlHVFhnUW9veXJNanBtYVNkN1AxUHptRGM2Q3pXYjloRHlmam9iS21DVVZNWXVPd2Fjdkplb1hERXJheFpNSU9jRWJjemE4dk45Qzg4bjRKZTZWUlY3bVBFUFU4eWY5SWdicnR6QWxPSFg4Q3lnalM4MXU3ME9vV2NwdE95OHVEcmpLTkhqMUplWGs1VjFaZlUxdFpTWDE5UFkrTVJtcHFPQldXUFFsVUtMWGk5clhnOEhudytIMEtva3RhaFhpRVFDRWpCL2d1aGFnVXBXTEVnQjhIZkNCaURWUXNtdE1vRk14QjMzMzIvVHp6YlVuSDU2c0ExMXkyL2EyaE9nMWNtSStWMHpDNVRxYXVwQm91VHRPUWZoMGFJNG5WVFU5ZEFTa1lXMW1DK1JkUDJwZVROL0lEYVRYK2lwczVGZWt3YXdROHhoQkQ3RHg4K3ZHYk9uRG03SG52czhWYWRLZWxyeC9RTVBmcURFVTlGdDZoNlgxcXdpb0JnMG0zUWVqR0hHaGxqc1VTNnMydXF0NGs0SEVrNG5WMUpTZWxLdk5uQzJlZWNSMkdmM2xFbFVrMzFOYml4dFVsRk9kRndsYTJoWk1ZR2RtNWFmTkt1RGErN2licEdGMmxwR1ZoMEtUdnV4bm9hUERKWkdjbW4xT1hNK044K3VidDA2VUpoWVNGeGNYSEV4Wm5EZHl3OWc5TXpOeUhVVUljckljdCtTWlpsRkVVUmdVQVVld3NWMThzeDVta0FVSUxtcVIvd3o1Ly9nQTk0cmZjZzhZNzN6dUZEZTNSTHVoYm9lZm9kS1ptMGpPd2ZsZmZMYUxHUm5kMitZb0JzdHBHVlpmdWhBYTN5OE9IRGJ6ejg4TU1mL1BuUEM3dzZnUEozQUdpeGdRRkZIeHdJQXBzSWxVVUY1YnZSUUUzTFR3dFdFMFNCbXMybXFkNG1KWVg2RTJnZDJyT3pzK25kdXpmeDhkRm1reU1sZzFQSjlySG5qMkxoakVacVhTbzVKNm5yYnJFNXlMYTEzWnJObVlMdEcvQ0QvM3JHcHB0RWZQYlpaMVJXN3VmZ3dSb09IVHBFUTBPa3Z0VHRkdVB4ZUhDNWp0SFM0a1VJZ2MvbncrZno0ZmY3SlVWcGw3MUpRZ2c1Q0hDaG1sTkRrTDJaZ3V6TnJGL3V2bnRtNHU5Kzk3dExuVTduMVpJazllR244ZjJ5dUtZYXR1eHpNV1JBL2cvSGpWVzFyTDYrZnYzczJYLzg4TWtubjJ6dEJOQmlGMzhRMU5vRE5EMm9oVmxhRU5SRU1FY052ZVJRQk5UMDFRU3A5T2lSUVU3T21mVHUzZnNIYjdyeVhZMGZEYkNGUmxWVkZaV1ZsZFRVMUZCWFYwZERnNmJHNjNJZDQvaHhOMGVQSHNYajhTQ0VDQmJRdCtMeitmSDcvU0ZsM2lCekMwaXFLcVJnNURSa29vWkNRZ2FkZWRvdXdPWGs1SmkzYnYzUHhhbXBxVmZKc256aFQ1RHo0eCtCUUdEN2dRTTE3MXg4Y1VscFRjMUJKU1l3MEJtbzZRRXQ3RWNMVlE4QVFoL3hiTXZTVEpqTmNlZ1ZiNjFXZmQxbnBKRnhSa1lHT1RrNVpHZG4vNmpQaGZISDlvZXlzN09KajQvSFlva25MaTRPc3prdUhHUXdHazBFQWdGa1dVWUlvVE5UV3pFWURLRTdZWWk5aVVBZ2dDUkpvYnkza0VrcXh3WVhZc3hUSDJDdXJLdzBwNmYzZUFmWVVsNytXVkYyZHZaUWs4azA2cWZMLzhjM1dsdGIxKzdidCsvZG9xSno5K3ZBVE0vU2ZPMkFtcjhEUUF2b1VqakNabWNzU3pNYWpVR1dwb0dheFdMUnlYZ25ZTE1sa3BTVWhOT3BseDNLb21mUEhGSlRVMy8wNThUNFkveFRxYW1wV0szV0lNQlpzRmdpQUJjSUtCZ01CbFJWRFVkUXZWNWpDTnp3K1h4Q2x1WDJmRzhpYUpyR1JrOERCSnRpb0lYaVRYcUFBOHk1dWIxM0FudmVlV2ZqUzhYRkZ3eXkyUkt1Z2xNS1N2NDBUaC9YUjgzeDQ4Zi8rYTkvYmQ0OWV2VG9oZzRBclQxUTgzZkcwRG95TzBNc3JYM1RVKzlQMDRJRVNVa09uRTRuS1NuZDZONjlPMWxaWjlDclYwOFNFeFAvVDV5ZlV6WkZtMXd1anZsbGVuU3hSUmNBQnhScWp4N0hFSjlBYWtKMHI4cVdGZy8xYmgvSmppUVNUTkwzTWZrb0x5L255eSsxaU9taFEvVWNPRkROMGFOTnFHb0F0MXVMbUxhMFJKckZ0TGEyNHZmNzhQbTBoakU2M3h1aDVqRnFRS0FLSVFmYm1ZWk0xSTU4Y0hwVDFRU1lKMHlZWVBuVG54NitJQ1VsWllqUmFPeFF4WGZQNXRWWThvYVJsM2J5elVOcXk2QkNnVUdGUDY2SldyRnJNMnBHTWJuaFk2R2lLRkZsNWhpREUvRkVKY2lxcXVxSzM2TStvYjZtR3AvWjBTWWkyTlJRUTZNYjB0TFQvblhvWU0yN3Yvbk5iejU5L2ZYWC9TY0phUDUyQUMzUUFVTlRRL1hPd1FBQjBTd3Qwcnk0clQ4dG9xUG1kR3BCZ3ZUMGRNNDQ0d3h5YzNPL1UzOWE5ZDZ0dUoyRjVHZWNIaEgzNzAyMmFQbnFWVHkycjVuVVJETzFqYzFNdnZwS3BoZCt0MjBISkVtaWQrL2VKQ1FrQlBONTR2SDcvUmdNUmxRMUVKWGtHNWs4QmxwYmpSZ01QdngrdjlDK0wwdUtFa0JSRktINEF2aFZGVWtTS3RwTk5hd1dFc3gzTXdRbmE0akJHWU9BNWdzQjI0b1ZLMXBYckZqeEwyRHJ4bzF2UDNYKytlZGZrSmlZT0ZTU3BDaGRsL1ZQUDBUeWxBRmZDOWoyYllNVmpUOHVZRk5kNVV5Wit2OVlzZjN0OEhzcjU5M0F4QWZYayt5d2hhZnlJMnMrWW55L1JvcHQ1ekp2MzFHR3Q4ZUpQV1VVcEJWZ0gvY3cyNWZPakFCWHhWYkdqYnVKV21NR2RxVWV1ZkJtdGo1OUQzanJ1V1BDMVordC9zUzNPY25RL05ISG41WWYwWUZTZTREbTd3RFFsQk1BbW1nL09HREFhRFRwcFlhSWl6TVRGMmRweDUrbUtkNTI3WnBNYW1vcUdSazkyUDM2WXR6WExhTDNkeHdrc0NrMWpKbStsbTFySDhSOEdzeVpVMkJzclpRZWFJbVNMWHF5S1pXM0poVFRlT1FJM25oN2xHelI0TkUzTURYUFRrdXJqL2c0N1M4ZjJiK1hpNS8vZ3YvTXVvYnZTMDZ3cWFtSnlzcjlsSmFXVWx0YlN5QVE0T2pSUm80ZDA0SUtzZmx1UVdYZVVOUVVSVkh3Ky8xUzgvRUFmalZBbkRrU1BkVUZHQ1Foa0tGTmtNRVFaSERHR0JZWHRYejg4ZDY4bmoxN1hoZ2ZIejlFVlpSMFZjZENUZ29BVkcyUmpUR01KVWhoM0kzUTVJT010SzhKTEY2b3FvV01iQWlsR25tYW9LNFIwcktJa3E0SjFiNVVWMEZ5QmxoMXMxenhRblVkWkdXM3ZhT3F3YzlTMHFOL0E3QngwVFNXTkE1aDFaenhPbUQ3T1F0ckxtSHI0OU5qMWxSRi8wNkFyWEx0ZzR4ZHNndDMyV0UyVi95YmRDT0FtMG45ZTJLZjloS0xwdzBHb0xTMHJQYk1NOC9ZL05KRDB6Nzh4ZisrVUIzeXFaNEVvT2tYSmNqUUF1MlpuQVNGVDRNMXpURm1wd0dEd1JSc1dteWlJOU16SVNHQlJKc1ZDWWt1S2VuMHpNNElCZ2t5eWM3SzRwRnBBM0ZNZnBPN1JtUkh5MWdCN29aYUdyeG1zak9TMjh5VnhycHFGR3N5S2Zib202cW5xWjY2Smk5cDZSblJVbEg0bUQ2b0Q0TVh2cy80Zmo5OGc1ZnZUYllvQkdxaFkyYzB5SHlmZ1dhSHc4RTU1eFRTMnVyRlpES2hLSDdpNHkzRXhWbUNRUWJORWR2Y2JNSm9iTUZrTXVMMWFpek81L1BoYi9WenBNRWdWRldSQkFxdHJZcVE1QUJtazRxRUpIeCtEZHhDUVFaWkRnY1pBa0pnQUNsWXhTTkN6SzBOeVBYdFc3Z0grQVI0K29JTEx1aDc0TE1QejcvN2hZckJkdzdQU0QrWi96aHRPT3lxZ093SnNIcGU1UDE3eDhBZUdWUTNWSmZDMEZtdytMWVRyKy9wbWJDcUNlcDNBbFl3RnNEV3BmRHdkRmkrQjNKU29MUU01andORTB2QXZRY3l4c0hJWEdod3daNDYyTElMY3UxUXR4c0dqNGFNUXUyZjc5c01XNXNnRzlqK01reStGM29WUVBrK21MOEN4dllQd3lFclZyek82RVVQZnl2ellNM3FOeGc2NFZHOFM2OWw3ZllHcHBVazQ5MjNudFVWV2V5WmZFbXR4K1BaVWxIeHhVZm5uSFBPZmoyNzZnRFEyZ08yMEh1aG9GSWdER2l5ckVwQ3FHcW9JemdJSkVrWVRTWU1zaVM4TFMzSTVnUzZXT1BBM3l3YWpyckl6TTdHYXRGQXpXS0pJeTR1MUpIZFNrS0NqWGpKemVzdnY0RTE3UXppMUdaU2lzZng1SnpCMkJwMk0yNzhQWlR2cWNGWWVSTWJGbGtaTVA1dTVrMGRCa29qc3lkZnk4djdWTEtzSGhwdHhheGQ5VGZTTERCelJDYmJQSDB4bWczVVYrNWw5T3puZUhDeVZzLzU0dHdibVBWeUpZVzlrcW5ZVjg4VFczY3dJSXlKWmthTnVvZ2xMNjlsZkwrSlVjZmNWYmFlQ2ZjOHk3emxLeWh5bkxiQXBoditacGJ0K0lKeGw3Y045bjFWOVNsYmpqbDVXVmN6dXYyRDkxbjAvbjRxajdReWI4TFB2bmYxVjRQQlFNK2VQWW1McytEenRXSzFKZ1M3WE1jQ25KbVdGaTJLMnRyYXFvR2IwY2NaMlVhTzF2bUZLK0NuUzZJV1BRMEVBcUxGRndCSnhXeFNoYXFxa3FJZ0NSQ1NGSTZpQmdDREpLR0FaQWhPZkdQUVREVzJBM1RHSFR0MjdBTDIvT2JLcktjdTIvdFI3NXljbkNLcjFYcGhaN2x4U3pmQTJvV3d0SjF5VEZzQnJKd0xUZHNoZXhvc3ZPM2tUdjcyUGJCM082Ulp3UnZzQ2pqOVliZ242RXFwV2crRDU4TEVEY0U3ZWgzY3N4TUtIWERQY0ZpNUVlNGJBdy9mQzJNZmhIa1RvR29EOU5vWXZNazF3TVRiNGRuZE1EQWQ2clpDOFYwd2VrdHcvM3dWN0N5MWMzdEIyeXVpZE0xZkdGcnhxamFSMHk1ZzlmSjVuV2U4cTNXc1hsZkY3SG45OGRSZXl1TnIxekYxNE1TeThnLzM3ZkIwY1pUMWpEUG9tWm1xWTFtZEFacWlZMmVLSHN3a0NUWFlsRmhvaWd1U2tHUkpHTU9SVG9sV2I2dFFoWUY0czRuNE9CT05UY2RGZ0hpT0hXc2hMYXNuU2JiNHNEOHQwajNLaXMybXFkMGUrYlNVaEw0amVmaXVjZlRva1U1NmVqcFpXVm1RbTh2R2plT1pOZlpzSEpPZlorYkk3UEJoMlB6NGJOWjRMMkx2cm5tWVVWazQ3UkllWHI2TkJWTUhhaVJnd0RqV1BUd1pUL1ZHZXZXL20ybmpkNUJqcVdQSjRzMHMyM3VRUVdtQTRzTVhZMHdVRmhheDY4R2RoQlJ2d3JjbVZ4MjdkbjJFMi9mZkVCVTlCZG1pdm5sbjh6L3BaN0IxOXdjc2VtY1BsMDBkVE1JUFFGTlRVbEp3T3J1UW1KaUl6WllRRlVIVkp0RngzRzR6WnJPSGxoYU40WVZNMDJhekQ4bHZ4R0x4aTJCZ1FmSzRGUXltZ0RBYXRSNE5BVVVWSUNSWkRrZFJKUTNraEJ5OFVPVGdoV0FJbXFuaHNxMTJnTTVZV0hqT1IwRW05OUpiYjYzcmZ0NTU1K1U3SEk0aWs4bDBJWEJTblRVR0J2WC9IRmxnYVFRM25GUjIrYkF4R3FnQllYbVl1cjB3WXlHVTEyZ21aTDF1Z3R0eU5WQUR5TXFDVU8vblhidGg5dFBhOCt5QmtCR2NlVlhib05ZSXF4ZkJHa0QxZ2FzVWFvRXNBRmNEalVZSGpuYmNqRG1Ecm1QeG5LREV0OUYyUXQ5TzQvYTFsS1pkZHV6OHJvRWQ5VVhGZTkrWjlOY3ZEQTlOUGhMeWtYYkN6dG9ETmIzQ1JyVHZERlNCcEdxUFFvUjdic2l5TU1nSTdZYW9DSkMwM3BFR0l4YUxSUmlOUnRLTmNQQndBL2JVYkxwM3Rlc0NCQnFvMld6UnFSelpDZWZ6K3FLVlBMc3lnV0hEUnBCYmRHS2h4eTFiL29YWjA1L1o5LzQrNkRid1VHZlpDMmpBTm1TUVpvNWJzd1pTYkM5bGQ1VkNUbDR5UXdZbGM5dTRheGczOGpJR0R4L0ZvTUtzcVBYYW5RNWM5VWZhYk04NVlESjFkWk5QZDFNVVRsVzJLQ0hCeGxrSk5zNjZzb1EzNXE1ZzI1Rkx1THpyRDVQNWJMVmE2ZE9uRDNhN25jVEVSQklTYkZpdFZxeldlSnFhTkFibmRzZGhOamRqTnB2d2VrMTR2YTBjTnhzeDRDYytQdXg3RTdMa0IyTkFNcHMxQnVkcjFSaWNMR3NwSW9HQVFKS0ZoQWdIN0tUZ1hWM1dtSnprMS9uaURERWdwd2M2WTFCQzZRQ3c4Wnh6Q2szTGxqMlZrNU56Wm0rYnpWWm9OQnI3US90OWxjT0tMbCt6OE00U0crUnl3OWl4TUc4ZGpPd0hudDJRTnFXZDdjUnNTemFDVDRuNEl2U2VYWHNHakJrZGVUMW1QSVFGa093TzdJb0xseGRpNlpqVmtVNWUzZ2wxOU4yS29uemdjcmxLRno3K1ZPV1JEN2ZYMk0zTDFSaG1Gb2p4ZzNVRWFIb3cwLzlHMWZ2UGdvMGlWVWxDSUJDeUxLTUdBa0tXRGFoS3F4RElKTm9UTVp1TUhHdHNFQWFUQmw0bWt3bVA1d2l5TE9Ieks5Z1NiY1RIdE1RTDlmbDBPcDEwNjVaQ2V2cUZiTHZtSmo3NzlGTldQZnNnZjMzdEE4cld6Tzg4S2d3VURyaWMwY09DZ2d1anI4YWVrbjFDcUpqejh2dU0zcjZGTFpzMk1ISEkrVHk0N21NbUZFZWtxdHhOTG16TzA2T0QxZmNrVzZUeTFiRVd1aWRwL0t5eHZvNERpcGt1bGgrK25DTXpNeE9Id3hFRU9Gc1k0T0xqajJLeGFPQ21CUlphTUpsYU9CWm53b0NQaEFSanFHS0JoRGdqTHNVdkxIWURpaThndVlXQ3lSd1FKbGtsRUFqZzk2dElraURZVHliVTZGbHZwc3JCQzhRZ1NWSTQ2S0FEdWZiQXp2alJSM3VONTUxM1hpbXdEMWg3eGhsbkdHNGI5WHhXcStHc0hKOHZxYmZKWkNxUUpLblh0M3JBR3FIYUNDVkYyazZ2VzMxUzZtUU1HZ2pyMThDSUdiQjNQZFFvRWZabXF3WTVHNHFEUVkyR0JoMkdtWE1wem0ya3ROeERZZUdKbzhOQ2lBcFZpRStPSHE2cjJGeXg3OHNiYjV4MHFLYW1SbzFoWmUyeHM0NVlXdml6b05LTEVyTU9WUWloVDlVUVdndGNTY2d5QkZTRXdXQkE4ZnVGd1dSQ1ZWb3htT0t4eHNjSmd4UkFVU0UrVG10N0o3eE5mSFZNMEsrNG1PcTlIMURqeXViOE5JY3U0VllmOWRUcVBidDI2VUpxang2Y2ZlNkZETy9uSUcza2MzZzFsNmpHb0MwVzZoc2EwTHlaMmhnODZGTHUyVnBKdjlrVE5aYXJlbWhvaXR4cU5tM1p4TXlSVS9CVWIyT25xNEFGMlViQWg4dXRValJ3S0VVRGg5SlUray9LeW10QkIyeGxaYVVVOVcvTEdOM2xtNWd4ZnhYM0xGcE12djEwQmJaVGtpMUs1Uy9QdmNTN0xSYTZ4Y3Q4ZWFTWmNTTXZvMy9DYVFIdUpDWW1VbEJRUUZKU2tnN2dFckJhRzJscWlzZGljUkVYMTB4Y25KbkdPRE1tNGNWbU05SGFxa1ZOMHpKOXVDdE0xQi8ySTFSRnlHWUZlNElpQlpON2hkY2JRRGFxUWhhcUZFcjAxUVVhUWlBWFpuSEJ2RGcvMGJseGhoaUFhL1A4eXkrL05QenVyeVdmQVJWeEMza0hNRHp5eUo5c2g1b3VUMDkwOWNocWJiV2RhUkttWGlEM1JsTW8rZm9qQzI0ZkNDVURJTWNHeVZrbk40bnVlaGhHajRIOHBaRGJIN0tDZHFPY0RDc1d3YVNCV3ZEQVZRdm0vckR4OFloVGV1eTRLMWk1ZmlNVENrZEZoK2VGK016cjlYNXgvUGp4TDZ1cnF3Lys4NThiRHQxLy8vMHRnRHFoWDdvNEFaaDFCR3F4ejhOTDhQeEVKZElHMndNSmlLUnJJRWxDUXNKb2tJUmYwZEtLZksxZVRPWTRMQ1pWSEdseWM3akJDMExDYUpBd3g4VmpOY1BlZlhYazlSdElhbGM3R1lNdjR1Mk5PL0hrOXlhN1czSlFsY05KdDI3ZHdxVlJtWm1aYkhyaUxpNWUrQjhLOHJLbzNMdUgyKzc3QjNyNEh6dnRONHlkZGdNYkY5c1pQUGwvV0RCakJJT256V1hFenVzb0tMcUkvQ3dIRmVXVnpGajhKdE9IYW1TL2FmdkxEQnI2R2syVnBVeDYrQmx5TEFCMWpDKytGSGRHUG5ZYXFIVG5zbVprWVJSNVdidm0zNHlkTzYvTnVmZldsL1BNTXk4eDhjSHZEOWkrMTFyUlprOHpSN3dLWFJNVFNUREpQd2lJMWRmWDQvUDV5Y2pvMGY0K05qZFRYVjBkVHVnOWNpUlVhK29LeXlDMXRHaSt0OVpXYnhEY3RIcFRqOXVISWhTRXFxV0hoSXJxUTlVTHdScFVnaldvb1VKN1FrQ25lNVNEZ0NmcmxwQ01raUdtQ2ZTSm5odGlmdy9JcTFhOW1weVhsOWN0T2JsYnFzMldrRzR5bWJvYkRJWU1TWkl5MnhwOWJVZEREU2hXU1B1YUVTQkZBV29oYXlpVWwwZnNabFdCbWhxd0o0TWpZa3g3aFJBSFdnL3ZPamh3K0IrL1dySDI2YStVeHZyRFpXVmxSNjYvZnZ4UklocDY0ZlNKRHNDc0k0Ylc0Zk5ROGJudTkvb1VqWENxUnVneDJCMHRxTllzaVpCY3ZXNkpsRU1aWkFRUzFnUWJscmhRbmFjNUdQRU1CUWdTd3Uzd3VuUnhoRmxhS0RpZ2I0WG44N2lvclcvVU9qcFpUejZMek5OVVQ0TkxJUzA5SFhQdzdqUnplQ2JaTTk5bllxR0NZbkdTSEpYdW9kSlFXNHNiTTFucEtkR3BJL3ZXTW5ENk9yWnZYb0wxTkNBclA3b2krRzhLYktGUlYxY1hMS1EvUkVQRFlSb2JHNE1hYnhHbEVJK24vWW9Gdjk4ZnpuM1RWeTRFQW9vVUNLaGhnQXNFMUNDd3FhaHFHTlRRTWJxT1FDNE1VREdxSTUwdGNzeHpPZVo1YUJ2U280OHVzUFh0MjllZWxwWm1UMHBLc2x1dFZydlpiTFlialVhN3dXQ3d5N0pza3lUSkprbFNnaVJKOFVFZ0RBa0FHSFRldFJBdytHcTM0cHY1TE41emU0dVdiYStKNXZRSndyM3dsNm83RUFnY1Z4VEYxZHJhNnZKNFBNZWJtcHBjWDMzMTFmRzllejkyMzMzMzNSNGRlSWtZSUJPZGIrLzA0Z0FBQzh4SlJFRlVnSmtleURwaWFsRkxKMEFXQldaNklBT0VMRXRDNjVJbVlURElPa0NUTVJpTXNaVURSQkp0MjFZUWFNbTJtaUpIWXFJOXpOS1NrN3NGdTdGck9XcmY1UWdCMjR5aFgyODcrN2F0cGNGUlRFbis2U0VQL3hPd2RaYk40dmR6NE1DQnNJQ2xKb04wbEdQSFhPMktXRWFyaGZpQ0FLZTBBM0FSRnFkMXVsZEQ1VnJFTUxqT1FLNWRzTk9WZDhtZGdKcWhIV0NMWGZUYjZXeWhuY2ZZNTlGTzJyYlA5WStkTGJGQUZydDB4TkxhUEE5SnY3Y0hZaWNDczlEem1KNGFVZXlzTGFDRlFDMVN1TjZSR0dSU2toMkhvd3ZKeVYxeHlHNys4MkVsRG1jWERJYm8vdlQ5aDQxblFPNjMyMTE5Mzg3TldIc05KTXRwL3ErK3puOEN0cE1ZeDQ0ZDQrREJnOVRWMVhINGNJaTlSWFRlbXBzOU92TTBVclVRcVRtTkJyaEFJQkJscHFxcUdnVnlRcWlTcW9xd3FVcTQ0Yk9RaEVBUGRGSTdJQlFEVU1LZ1ZVTzB5OUk2QXplcEE0Q1Qyd0cxemdDdU0zQ0xCVFRhQWJIT0dKcmFBVnVMZXEybDJraWRnbGpRWjZick54djJtNFhBTEdocVNraFNOSmpwUUUyRUZHUDBnR1kwUmhoYXFIcWdiVjZhVFZmbkdmR2w5ZWpSZzZTa0pINGEzM2xVOVAvZVNFcEtJaWtwaWE1ZHUxSmIreFgxOVllQ09tOUhneVZaeDRNRjljM2hnbnF2VjErU3BXZHZJUk0xRUtVZW9nbGNCZ2dFVkZSVkZVR1FFNnFxU3FGK00xcS9CcUpZWFBBQ2ptVjBPZ0NTWkVtS0JUd2hCd0d5TTBEckROeStEblA3T3NEMmRjek9kZ0V1Q0VpZEFoalJ6YkxEb0tyM21ZVmVCd0V0aXBscFFDYUgyajZLRUZPTDFIWWF3d3JPRVpZV3FSNndSS1Z3aEZoYUVsMjZkQ0U1T1ptVWxGVFMwN3YvbjVBWCtnbllmdUJSV3ZvSnVibG5rWnFheW9FRE5kVFZmY1hodzRjNWN1UklsSkJseUR6Vks0Ym9hMDQxMzVzR2NvRkFHT0FJQkFKNmlTUkp4K0JFaE1tSjBLT0lNVlhSUjFjamJGeEk3WU5TRk5oRmZhY2RjMWM2QWJCMXhOcGlUVkxSQ2JoMUJuQnFlNjkxb05RWnM0djlUZFMyOUs5alRFMWtXZFlGQS9TQVppQ2t1aEVMYUFaRGhLSHBpOWJiVTdiVnpNNklFR1RYcmwyRExLMDdtWmsvS1ZyOUJHdy93TWpNekNBMU5ZWGEydHF3U205Yjg3UTVHRndJQVp3dnh2L1docjJGQWd4QmtGTTdCRGtkd0JITjVxUllvSXQ2M3M1bmJaWmdIbDBuekV4TDB2b3VmV3hCMW5XeVRLNmpCYjFwR2ZPYTlsaFppSm5wL0dmdGdGbkk3RFIyd3RMMGZqUnpVQk13WGljQ0dXMTJodFJ0MDlQVE1adk5QMTFnUHd5d0JkaXhkeC8vclBpS1k0cE13Vms5dWVIY016QURyYzFOdkxyck0vYldIY05nc1RHeXVKQUx1OGNrd2l2TlBQWHZqem16OTlrTXp2anY5UjJZeldheXM3TkpUVTF0WTU3cW82ZlIvamM5ZytzNGVxb29Db3EvbFpaV0NZdFppZ0k1WGJDaFBaQWowaVlWS2ZaUlZWVWtXUTRKMk1ReU96cGhZcnJYVWtqVzYyVEJyQ1BHRnZXZUNOblpKMlp5ZEFKZ2tkOExJVlJWWURESVVVeE01eTlEbjZJUkMyYWh3SUMrQ2JlZW9YVVc3WXo0MFN4dC9HaWhhR2VzMlJuYlVLVzlVYllic29xZzNaYXc3aW9tVEhtWXhTdVc0TlJkMWJYbGU1QlQ4a2x6ZkR1QTZTbGR4ZUM1dTlqNTh2eHZ2SjRoYzNleC9SVFdjekwvNlJUMDJJNnplbmN0UllYWnBKcFZscjI5a2MrT1g4YURnN0w1c3JLS2o1dGxMdTJiaS92SVFYNzk5NVVzdm1NaUE3cEVOdlBXNXEwc2VlOUxyckwxK0s4R3R0Q0lqNCtuWjg4YzB0SlNxYXVybzc2K1BtaWU2djF2SVlCcmFTT0wxRkgwdExuaENJY2JBK1JrcGVqVFE0VE9ENmNIT1lSUWhSWndVQWtHSHNKQUY3ek9KU0VFa2l3alJjQ09rMkZkTWNCM0lqQTcyWEtTTnFhcGlQdzRDcVJDN0tvanRxY0h4UER6NFA4ekdBemg5Mk1DQUVRZVk4Rk0xalhkMWdPYUlkaVl1Nk5vWjdTc1VFaUZRd08waUIrdGE5ZXVwS1Nra0phV0ZwV1BkcUl4YlFRc3JJRCs3UlROclZzeUI4dUE4VkdnQnJEa3ZwL2ptUHhXVkJIOE43cWhweFZ3KzZSdm50S2hlbDFVVlI4K3BkK2V6SC82K3NBbU8zaGc4dVhobDEwOGg3bDF6NWN3S0p2Y3ZrVTgwRGYwU1RhN1AvbVVMZnNiR2RCRk94Q3V1djA4VjJ2anVqT3RlSDVrMURjaElZR2VQWHZTdlh2M2NQVDBTTzFuUFAvQ2UvUXRLY0hlY2h6WG9VbzJmVkpMbjc2NUpMUzJCQU1Nc1F6T3k0RXZ2cURwV0ROQ0VSdzVjZ1JWTXBHUzRvUkFnSURpNWZEaFkxaXRSbkhNNVVKRnhwN2tRQloreWVWeW93UzBXSUlwemlKTVJna2hCQUcvRDE4Z0lBQkpsZzFJaE1CT1JWRlVMU0NocXFDeGxwTUZyVFlBcGtYWXBUQ2xDNmJrSTdjdmNpakMzd21CclBiOVlGNFlZWUFLN20yUTFXbUFKSVFxaE5CK0wwa3lScU1oQkhBRUZEOENDVW5Xb3BRaFVBdjRXMUV4b3JTMkVoQmd0ZG14eHBuQ1FOWk8yZ1p0ZldudE16U3Q3MEFRMEl6eDdQbkVTdTRaTm5ac1M2UmJUaEkzVDNTUTNrM3pveDJ0U09OdnoxaHh5VEIrT2d3dEJEeXdjQkdNdnhQU0xPQ3JoMGVlaFJsM1FlVW1XTGtacXR6dytGeElNOE9JU1RBd040UVNqU3grNGwvY3RXVnArT0EybFc5andiTnZzYm0wSHN2eVA5TzAzVUhlNEd1Wk9GUnJabHk1Y3kxYm01SkpxZDNDaTVzK0lYZkl6N2x2OG5BcWQyM2c2WmZmb3JxdWtmVGM4NWx4KzNUUzdScE1ySHY2WWJaVkhNZWFkWDdVaWF6WXZvYnRqWGE4ZXphd3RlSUlJNmY4bHJFbHVTZHgxZmhZdldRZWEzWitTYitSTjNIYjJCSmtvTDU4TzB1ZlhVVjU5U0djR2IyWmR2dWQ1S1ZaVC9pZlZFODl5eFl2Wm12cEFiNXgrdituOVEza3ByZVRTK00vVHNVUmxUNnBRVmFtK25obzdVNm1YM2srY1QvT2psK0FWbHlmazVQRE9lZWNRLzY1Z3pqSDBjQ0xHOHZJeWtwangvbzFtRFB5eVV4THBWdTNGSktUdStKME9uRTR1b1RMdWV4Mk82azlNa2gxSmlLWkUwaExTeU0xcFNzSlZvMEJ4TWNaY0x1UGMrUm9NM2FIRTd2Tmd0RWNSNXhSRnJJcFR0aVRrb1F0d1N4OExjMWdER2EwV3pRNUpzMDJNd21UeVNTTVJxTXdHaVFSQkFoaE1CcUUxc1JCVWcwR2d5ckxjbnRMSUxpRUd2ZEdMNXIybkNKSmtxWjRvZFZWaGwvSExBRkprZ0t5SkFWa1dRNG15V3JybG1VcHZCMkJVSVdHdW1wd3U2ckJZRkFsdEk1TkpwTlJTS2hDQ2FqQ2FEUUtrOGtrVENhek1FaUlnQ3AwaXJOeGlJQkNhMnVyc0NRa0NwdFpGbTdYY1JFWHIvbS9Jbzc5NEhHT2o4ZHF0WEM4c1o1RGh3NVJWMWRIYlcwdEJ3OGU1S3NqYnV4Mk8wbEpTVGdjWFlKK3NxNTA2NVpDYW1vcTZjbmRlVzlMQm1VTlozRDk5VGswN3N4bFcxMCs1NXh6RGtwRkR0ZmVhYVZrTEV3YUNYZU5nWjMxZ0JXeWZERHBIazBzZE5ZVWNLV0JYWWIwWGpCOE9Eak5VRHhFZTU2bHUrUjg1WnZZS2ZkblFIcUVwMWlTc3hnMi9BcXlVMnowNm5jeHc0ZGZRYjllRVZtL3lwMXZjdCswWDdDcXdzTDRpZGRqVlZ3QVZGV1UwMnZBbGR4KzF4MWt1ZDlqMkpSNVljR0N2SDZES2NrSzhNaXlOMktBN1ExbVRMc2J0V0FvRTRabU1uM3N6VlNmaEVSUjArNVZiSEQxWXZxVWExazkrem9XYjZnRW9LYXlBbWQrQ1hmZWRRY2xLWWNZTnVJVzNDZjZUNnFMR1NNdVpsMk5uV20zMy9ITmdnZlYrei9oc1U4Q1BEbmo3RmlpeVROck5oSjM5Z0N1N0tHVkpPN2M4UjVObVVVTTZtYm13LzhEemt1THhVSjJkalozTFg2QlR5Ky9tTWNmLzRER3pKSE12dTRTM0M1OWlvaW5UWW1XMVpxSVRiaW85UGpKeU1pSTlzRVp0Um1UY1ZadkVnMUNaNlphTU1mN2FQWTBvMGp4eUhLTFVERVFGMmRHbU0zRVdWUWFXcjJTMFJ4SG5DRm9zaXFDRnE5ZnhOc1NrSVdndGFVWlJZRFJhQ1Jpd1lxUU9Sb21Xa0VpRmtXK2hORGlwcW8vQUxLTWpDb0ZBbUF3R0pHbGprMVFqV1JKK0gwK0pJTVJveHg1RDBBRUFnUWtDWXNsTHNxa05KdE5CQlNGZ0Nvd0dtUjhBVUZjbkJsSmtwRXNGcFFXRjY1V1NWZ3NjV0Z6cy9XNGhDa3VpV1NuQTFsSzRIaGxMWEpjUFBGR2ZiV0FQakFnMDJwTEpJNW9jOVNjMkFXbnMwdVVEMDNmU01WT0VpYWpnOS8rMFVtLzFHNTBQNTdLcXpWR0xCWll1aEFtem9JUkpkci9uem9VVnF5RjRpa3daaFpzSGdGanhrQlRDbXdNeXBxbFpHdUwzUXo5U3RxYW9yWGxWVmh5TXFOa1hTek9ERXBLTWxpZllzV1JYMHhKU1Z1enpaaDNCWS9QdXgwWkdCNThiOGo0R2RSVzdHVnZlUTBaaGVkUzkreGJOQUxKUUU1aE1TbStNdVJsYlUzSWdwRTNNbTNVRUtDWWdiUCt6TjVhVFNtNTA1RStpUG4zanNjQnpKcHhEZmU4dUlyYmg4MmszL0NKWkZmdlkwOVpKZVplNTJDcGZJQUtOeFIxOHA5Y3UxZXp2RGFQbXMwenNRUC9IM2l4Z0ptUU81d3VBQUFBQUVsRlRrU3VRbUNDIl0sWzEsImRldGFpbHMtY29udGFpbmVyIl0sWzEsImRldGFpbHMiXSxbImhyZWYiLCJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvZGVidWdnaW5nL2V4cGVyaW1lbnRhbC9lbmFibGVfZHVtcF9kZWJ1Z19pbmZvIiwidGFyZ2V0IiwiYmxhbmsiLCJyZWwiLCJub3JlZmVycmVyIG5vb3BlbmVyIl0sWyJocmVmIiwiaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL2RlYnVnZ2luZyIsInRhcmdldCIsImJsYW5rIiwicmVsIiwibm9yZWZlcnJlciBub29wZW5lciJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiZGl2IiwwKSxSbSgxLCJkaXYiLDEpLGt1KDIsIkRlYnVnZ2VyIFYyIGlzIGluYWN0aXZlIGJlY2F1c2Ugbm8gZGF0YSBpcyBhdmFpbGFibGUuIiksQW0oKSxSbSgzLCJkaXYiKSxrdSg0LCJUbyB1c2UgdGhlIGRlYnVnZ2VyLCIpLEFtKCksUm0oNSwiZGl2IiksUm0oNiwib2wiKSxSbSg3LCJsaSIpLGt1KDgsIiBBZGQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHRoZSBiZWdpbm5pbmcgb2YgeW91ciBwcm9ncmFtOiAiKSxSbSg5LCJkaXYiLDIpLFJtKDEwLCJzcGFuIiksa3UoMTEsInRmLmRlYnVnZ2luZy5leHBlcmltZW50YWwuZW5hYmxlX2R1bXBfZGVidWdfaW5mbygiKSxBbSgpLFJtKDEyLCJzcGFuIiwzKSxrdSgxMywibG9nZGlyIiksQW0oKSxrdSgxNCwiLCAiKSxSbSgxNSwic3BhbiIsMyksa3UoMTYsJ3RlbnNvcl9kZWJ1Z19tb2RlPSJGVUxMX0hFQUxUSCInKSxBbSgpLGt1KDE3LCIsICIpLFJtKDE4LCJzcGFuIiwzKSxrdSgxOSwiY2lyY3VsYXJfYnVmZmVyX3NpemU9LTEiKSxBbSgpLFJtKDIwLCJzcGFuIiksa3UoMjEsIikiKSxBbSgpLEFtKCksQW0oKSxSbSgyMiwibGkiKSxrdSgyMywiUmUtcnVuIHRoZSBwcm9ncmFtLiIpLEFtKCksQW0oKSxBbSgpLFJtKDI0LCJkaXYiLDQpLFJtKDI1LCJkaXYiLDUpLFJtKDI2LCJkaXYiLDYpLFRtKDI3LCJpbWciLDcpLEFtKCksUm0oMjgsImRpdiIsOCksa3UoMjksIkF1dG8tYWxlcnRzIGZvciBwcm9ibGVtcyBmb3VuZCIpLEFtKCksQW0oKSxSbSgzMCwiZGl2Iiw1KSxSbSgzMSwiZGl2Iiw2KSxUbSgzMiwiaW1nIiw5KSxBbSgpLFJtKDMzLCJkaXYiLDgpLGt1KDM0LCIgSW50ZWdyYXRlZCBkZWJ1Z2dpbmcgdG8gdHJhY2UgcHJvYmxlbXMgdG8gdGhlaXIgY2F1c2VzICIpLEFtKCksQW0oKSxSbSgzNSwiZGl2Iiw1KSxSbSgzNiwiZGl2Iiw2KSxUbSgzNywiaW1nIiwxMCksQW0oKSxSbSgzOCwiZGl2Iiw4KSxrdSgzOSwiTGluayBsb2cgdG8gY29kZSIpLEFtKCksQW0oKSxBbSgpLFJtKDQwLCJkaXYiLDExKSxSbSg0MSwiZGl2IiwxMiksa3UoNDIsIiBUaGUgbG9nIGRpcmVjdG9yeSBtdXN0IGNvbnRhaW4gVGVuc29yRmxvdyBEZWJ1Z2dlciAoVjIpIGRhdGEuIHRmLmRlYnVnZ2luZy5leHBlcmltZW50YWwuZW5hYmxlX2R1bXBfZGVidWdfaW5mbygpIHdpbGwgY29sbGVjdCB0ZW5zb3IgZGF0YSwgZ3JhcGggc3RydWN0dXJlcywgdGhlIGFzc29jaWF0ZWQgc3RhY2sgdHJhY2VzLCBhbmQgc291cmNlIGNvZGUgdG8gdGhlIHNwZWNpZmljZWQgZGlyZWN0b3J5IGxvZ2RpciBhcyB0aGUgaW5zdHJ1bWVudGVkIFRlbnNvckZsb3cgcHJvZ3JhbSBleGVjdXRlcy4gIiksQW0oKSxSbSg0MywiZGl2IiwxMiksUm0oNDQsImRpdiIpLGt1KDQ1LCIgU2VlICIpLFJtKDQ2LCJhIiwxMyksa3UoNDcsIiBkb2N1bWVudGF0aW9uICIpLEFtKCksa3UoNDgsIiBvZiB0aGUgUHl0aG9uIEFQSSBvZiBEZWJ1Z2dlciBWMi4gIiksQW0oKSxSbSg0OSwiZGl2Iiksa3UoNTAsIiBTZWUgIiksUm0oNTEsImEiLDE0KSxrdSg1MiwiIGhlcmUgIiksQW0oKSxrdSg1MywiIGZvciBvdGhlciBUZW5zb3JGbG93IGRlYnVnZ2luZyBBUElzLiAiKSxBbSgpLEFtKCksQW0oKSxBbSgpKX0sc3R5bGVzOlsiLmFyZ1tfbmdjb250ZW50LSVDT01QJV0ge1xuICBjb2xvcjogbGlnaHRibHVlO1xuICBmb250LXN0eWxlOiBpdGFsaWM7XG4gIG1hcmdpbjogMnB4O1xufVxuXG4uY29kZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJywgbW9ub3NwYWNlO1xuICBtYXJnaW46IDEwcHg7XG59XG5cbi5jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBmb250LWZhbWlseTogUm9ib3RvO1xuICBmb250LXNpemU6IDE1cHg7XG4gIG92ZXJmbG93LXk6IGF1dG87XG4gIHBhZGRpbmc6IDUwcHg7XG59XG5cbi5kZXRhaWxzLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi5kZXRhaWxzW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luOiAxMHB4IDYwcHg7XG4gIHdpZHRoOiA1MCU7XG59XG5cbi5leGhpYml0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB3aWR0aDogMTAwJTtcbn1cblxuLmV4aGliaXRbX25nY29udGVudC0lQ09NUCVdIHtcbiAgYWxpZ24tY29udGVudDogY2VudGVyO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbjogMTBweCA2MHB4O1xuICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuICB3aWR0aDogMzEwcHg7XG59XG5cbi5leGhpYml0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV0ge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB3aWR0aDogMzEwcHg7XG59XG5cbi5leGhpYml0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5zY3JlZW5zaG90W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNhbnZhc1tfbmdjb250ZW50LSVDT01QJV0ge1xuICBoZWlnaHQ6IDIwMHB4O1xuICB3aWR0aDogMTAwJTtcbn1cblxuLnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGZvbnQtc2l6ZTogMTM1JTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIG1hcmdpbi1ib3R0b206IDI1cHg7XG59Il19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKERxLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImluYWN0aXZlLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vaW5hY3RpdmVfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vaW5hY3RpdmVfY29tcG9uZW50LmNzcyJdfV19XSxudWxsLG51bGwpO2NsYXNzIEVxe2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dH19RXEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEVxKShTbShJdykpfSxFcS7JtWNtcD10byh7dHlwZTpFcSxzZWxlY3RvcnM6W1sidGYtZGVidWdnZXItdjItaW5hY3RpdmUiXV0sZGVjbHM6MSx2YXJzOjAsdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmVG0oMCwiaW5hY3RpdmUtY29tcG9uZW50Iil9LGRpcmVjdGl2ZXM6W0RxXSxlbmNhcHN1bGF0aW9uOjJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEVxLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InRmLWRlYnVnZ2VyLXYyLWluYWN0aXZlIix0ZW1wbGF0ZToiIDxpbmFjdGl2ZS1jb21wb25lbnQ+PC9pbmFjdGl2ZS1jb21wb25lbnQ+ICJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y29uc3QgUnE9SlAoIltEZWJ1Z2dlcl0gRGVidWdnZXIgTG9hZGVkIiksQXE9SlAoIltEZWJ1Z2dlcl0gRGVidWdnZXIgVW5sb2FkZWQiKSxUcT1KUCgiW0RlYnVnZ2VyXSBBIE5ldyBEZWJ1Z2dlciBEYXRhIFBvbGxpbmcgRXZlbnQgQmVnaW5zIiksTnE9SlAoIltEZWJ1Z2dlcl0gRGVidWdnZXIgUnVucyBSZXF1ZXN0ZWQiKSx6cT1KUCgiW0RlYnVnZ2VyXSBEZWJ1Z2dlciBSdW5zIExvYWRlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLElxPUpQKCJbRGVidWdnZXJdIERlYnVnZ2VyIFJ1bnMgUmVxdWVzdCBGYWlsZWQiKSxIcT1KUCgiW0RlYnVnZ2VyXSBOdW1iZXIgYW5kIEJyZWFrZG93biBvZiBBbGVydHMgUmVxdWVzdGVkIiksRnE9SlAoIltEZWJ1Z2dlcl0gTnVtYmVyIGFuZCBCcmVha2Rvd24gb2YgQWxlcnRzIExvYWRlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLExxPUpQKCJbRGVidWdnZXJdIEFsZXJ0cyBEYXRhIG9mIGFuIEFsZXJ0VHlwZSBJcyBMb2FkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxCcT1KUCgiW0RlYnVnZ2VyXSBBbGVydCBUeXBlIEZvY3VzIFRvZ2dsZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxWcT1KUCgiW0RlYnVnZ2VyXSBOdW1iZXIgb2YgVG9wLUxldmVsIEV4ZWN1dGlvbnMgUmVxdWVzdGVkIiksanE9SlAoIltEZWJ1Z2dlcl0gTnVtYmVyIG9mIFRvcC1MZXZlbCBFeGVjdXRpb25zIExvYWRlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLFVxPUpQKCJbRGVidWdnZXJdIEV4ZWN1dGlvbkRpZ2VzdHMgUmVxdWVzdGVkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksR3E9SlAoIltEZWJ1Z2dlcl0gRXhlY3V0aW9uRGlnZXN0cyBMb2FkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxXcT1KUCgiW0RlYnVnZ2VyXSBTY3JvbGwgTGVmdHdhcmQgb24gdGhlIEV4ZWN1dGlvbiBUaW1lbGluZSIpLFlxPUpQKCJbRGVidWdnZXJdIFNjcm9sbCBSaWdodHdhcmQgb24gdGhlIEV4ZWN1dGlvbiBUaW1lbGluZSIpLHFxPUpQKCJbRGVidWdnZXJdIFNjcm9sbCB0aGUgRXhlY3V0aW9uIFRpbWVsaW5lIHRvIEdpdmVuIEluZGV4Iix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksWnE9SlAoIltEZWJ1Z2dlcl0gRXhlY3V0aW9uIERhdGEgT2JqZWN0cyBCZWluZyBGb2N1c2VkIE9uIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksWHE9SlAoIltEZWJ1Z2dlcl0gRXhlY3V0aW9uIERhdGEgT2JqZWN0cyBMb2FkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxLcT1KUCgiW0RlYnVnZ2VyXSBOdW1iZXIgb2YgSW50cmEtR3JhcGggRXhlY3V0aW9ucyBSZXF1ZXN0ZWQiKSxKcT1KUCgiW0RlYnVnZ2VyXSBOdW1iZXIgb2YgSW50cmEtR3JhcGggRXhlY3V0aW9ucyBMb2FkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxRcT1KUCgiW0RlYnVnZ2VyXSBJbnRyYS1HcmFwaCBFeGVjdXRpb24gRGF0YSBSZXF1ZXN0ZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSwkcT1KUCgiW0RlYnVnZ2VyXSBJbnRyYS1HcmFwaCBFeGVjdXRpb24gRGF0YSBMb2FkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSx0Wj1KUCgiW0RlYnVnZ2VyXSBTY3JvbGwgSW50cmEtR3JhcGggRXhlY3V0aW9uIExpc3QgdG8gR2l2ZW4gSW5kZXgiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxlWj1KUCgiW0RlYnVnZ2VyXSBHcmFwaCBFeGVjdXRpb24gaXMgRm9jdXNlZCBPbiIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLG5aPUpQKCJbRGVidWdnZXJdIEdyYXBoIE9wIElzIEZvY3VzZWQgT24iLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxvWj1KUCgiW0RlYnVnZ2VyXSBHcmFwaCBPcCBJbmZvIFJlcXVlc3RlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLGlaPUpQKCJbRGVidWdnZXJdIEdyYXBoIE9wIEluZm8gTG9hZGVkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksYVo9SlAoIltEZWJ1Z2dlcl0gU291cmNlIEZpbGUgTGlzdCBSZXF1ZXN0ZWQuIiksclo9SlAoIltEZWJ1Z2dlcl0gU291cmNlIEZpbGUgTGlzdCBMb2FkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxzWj1KUCgiW0RlYnVnZ2VyXSBTb3VyY2UgRmlsZSBMaW5lIElzIEZvY3VzZWQgb24iLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxsWj1KUCgiW0RlYnVnZ2VyXSBTb3VyY2UgRmlsZSBSZXF1ZXN0ZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxjWj1KUCgiW0RlYnVnZ2VyXSBTb3VyY2UgRmlsZSBMb2FkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxkWj1KUCgiW0RlYnVnZ2VyXSBBIFNldCBvZiBTdGFjayBGcmFtZXMgSGF2ZSBCZWVuIExvYWRlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLHBaPSJkZWJ1Z2dlciI7dmFyIG1aLHVaLGZaO2Z1bmN0aW9uIGdaKHQpe2lmKG51bGw9PT10LmNvZGVMb2NhdGlvbkZvY3VzVHlwZSlyZXR1cm4gbnVsbDtsZXQgZT1bXTtpZih0LmNvZGVMb2NhdGlvbkZvY3VzVHlwZT09PWZaLkVYRUNVVElPTil7Y29uc3R7Zm9jdXNJbmRleDpuLGV4ZWN1dGlvbkRhdGE6b309dC5leGVjdXRpb25zO2lmKG51bGw9PT1ufHx2b2lkIDA9PT1vW25dKXJldHVybiBudWxsO2U9b1tuXS5zdGFja19mcmFtZV9pZHN9ZWxzZXtpZihudWxsPT09dC5ncmFwaHMuZm9jdXNlZE9wKXJldHVybiBudWxsO2NvbnN0e2dyYXBoSWQ6bixvcE5hbWU6b309dC5ncmFwaHMuZm9jdXNlZE9wO2lmKHZvaWQgMD09PXQuZ3JhcGhzLm9wc1tuXXx8IXQuZ3JhcGhzLm9wc1tuXS5oYXMobykpcmV0dXJuIG51bGw7ZT10LmdyYXBocy5vcHNbbl0uZ2V0KG8pLnN0YWNrX2ZyYW1lX2lkc31jb25zdCBuPVtdO2Zvcihjb25zdCBvIG9mIGUpe2lmKG51bGw9PXQuc3RhY2tGcmFtZXNbb10pcmV0dXJuIG51bGw7bi5wdXNoKHQuc3RhY2tGcmFtZXNbb10pfXJldHVybiBufWZ1bmN0aW9uIGhaKHQsZSl7cmV0dXJuIHQuZmluZEluZGV4KCh0PT50Lmhvc3RfbmFtZT09PWUuaG9zdF9uYW1lJiZ0LmZpbGVfcGF0aD09PWUuZmlsZV9wYXRoKSl9ZnVuY3Rpb24gYloodCxlLG4pe2lmKGU+PW4pdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBiZWdpbiB0byBiZSBsZXNzIHRoYW4gZW5kLCBidXQgZ290IGJlZ2luPSR7ZX0sIGVuZD0ke259YCk7cmV0dXJuIHQuZmluZEluZGV4KCh0PT50LmJlZ2luPT09ZSYmdC5lbmQ9PT1uKSl9ZnVuY3Rpb24geVoodCl7Y29uc3QgZT10LnNvdXJjZUNvZGUuZm9jdXNMaW5lU3BlYztpZighdC5zdGlja1RvQm90dG9tbW9zdEZyYW1lSW5Gb2N1c2VkRmlsZSlyZXR1cm4gZTtjb25zdCBuPWdaKHQpO2lmKG51bGw9PT1uKXJldHVybiBlO2NvbnN0IG89KGZ1bmN0aW9uIGkodCxlKXtpZihudWxsPT09ZSlyZXR1cm4gbnVsbDtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wOy0tbil7Y29uc3Qgbz10W25dLHtob3N0X25hbWU6aSxmaWxlX3BhdGg6YX09bztpZihpPT09ZS5ob3N0X25hbWUmJmE9PT1lLmZpbGVfcGF0aClyZXR1cm4gb31yZXR1cm4gbnVsbH0pKG4sZSk7cmV0dXJuIG51bGw9PT1vP2U6b30hKGZ1bmN0aW9uKHQpe3RbdC5VTlNQRUNJRklFRD0wXT0iVU5TUEVDSUZJRUQiLHRbdC5OT19URU5TT1I9MV09Ik5PX1RFTlNPUiIsdFt0LkNVUlRfSEVBTFRIPTJdPSJDVVJUX0hFQUxUSCIsdFt0LkNPTkNJU0VfSEVBTFRIPTNdPSJDT05DSVNFX0hFQUxUSCIsdFt0LkZVTExfSEVBTFRIPTRdPSJGVUxMX0hFQUxUSCIsdFt0LlNIQVBFPTVdPSJTSEFQRSIsdFt0LkZVTExfTlVNRVJJQ1M9Nl09IkZVTExfTlVNRVJJQ1MiLHRbdC5GVUxMX1RFTlNPUj03XT0iRlVMTF9URU5TT1IiLHRbdC5SRURVQ0VfSU5GX05BTl9USFJFRV9TTE9UUz04XT0iUkVEVUNFX0lORl9OQU5fVEhSRUVfU0xPVFMifSkobVp8fChtWj17fSkpLChmdW5jdGlvbih0KXt0LkZVTkNUSU9OX1JFQ09NUElMRV9BTEVSVD0iRnVuY3Rpb25SZWNvbXBpbGVzQWxlcnQiLHQuSU5GX05BTl9BTEVSVD0iSW5mTmFuQWxlcnQiLHQuVEVOU09SX1NIQVBFX0FMRVJUPSJUZW5zb3JTaGFwZUFsZXJ0In0pKHVafHwodVo9e30pKSwoZnVuY3Rpb24odCl7dFt0LkVYRUNVVElPTj0wXT0iRVhFQ1VUSU9OIix0W3QuR1JBUEhfT1BfQ1JFQVRJT049MV09IkdSQVBIX09QX0NSRUFUSU9OIn0pKGZafHwoZlo9e30pKTtjb25zdCBfWj15ayh7cnVuczp7fSxydW5zTG9hZGVkOntzdGF0ZTp5RS5OT1RfTE9BREVELGxhc3RMb2FkZWRUaW1lSW5NczpudWxsfSxhY3RpdmVSdW5JZDpudWxsLGxhc3REYXRhUG9sbE9uc2V0VGltZU1zOi0xLGxhc3ROb25FbXB0eVBvbGxEYXRhVGltZU1zOjEsYWxlcnRzOnthbGVydHNMb2FkZWQ6e3N0YXRlOnlFLk5PVF9MT0FERUQsbGFzdExvYWRlZFRpbWVJbk1zOm51bGx9LG51bUFsZXJ0czowLGFsZXJ0c0JyZWFrZG93bjp7fSxhbGVydHM6e30sZXhlY3V0aW9uSW5kaWNlczp7fSxncmFwaEV4ZWN1dGlvbkluZGljZXM6e30sZm9jdXNUeXBlOm51bGx9LGV4ZWN1dGlvbnM6KGZ1bmN0aW9uIENaKCl7cmV0dXJue251bUV4ZWN1dGlvbnNMb2FkZWQ6e3N0YXRlOnlFLk5PVF9MT0FERUQsbGFzdExvYWRlZFRpbWVJbk1zOm51bGx9LGV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQ6e2xvYWRpbmdSYW5nZXM6W10sbnVtRXhlY3V0aW9uczowLHBhZ2VMb2FkZWRTaXplczp7fX0sZGlzcGxheUNvdW50OjUwLHBhZ2VTaXplOjEwMCxzY3JvbGxCZWdpbkluZGV4OjAsZm9jdXNJbmRleDpudWxsLGV4ZWN1dGlvbkRpZ2VzdHM6e30sZXhlY3V0aW9uRGF0YTp7fX19KSgpLGdyYXBoRXhlY3V0aW9uczooZnVuY3Rpb24gTVooKXtyZXR1cm57bnVtRXhlY3V0aW9uc0xvYWRlZDp7c3RhdGU6eUUuTk9UX0xPQURFRCxsYXN0TG9hZGVkVGltZUluTXM6bnVsbH0sZXhlY3V0aW9uRGlnZXN0c0xvYWRlZDp7bG9hZGluZ1JhbmdlczpbXSxudW1FeGVjdXRpb25zOjAscGFnZUxvYWRlZFNpemVzOnt9fSxkaXNwbGF5Q291bnQ6MTAwLHBhZ2VTaXplOjIwMCxzY3JvbGxCZWdpbkluZGV4OjAsZm9jdXNJbmRleDpudWxsLGdyYXBoRXhlY3V0aW9uRGlnZXN0czp7fSxncmFwaEV4ZWN1dGlvbkRhdGFMb2FkaW5nUGFnZXM6W10sZ3JhcGhFeGVjdXRpb25EYXRhUGFnZUxvYWRlZFNpemVzOnt9LGdyYXBoRXhlY3V0aW9uRGF0YTp7fX19KSgpLGdyYXBoczp7b3BzOnt9LGxvYWRpbmdPcHM6e30sZm9jdXNlZE9wOm51bGx9LHN0YWNrRnJhbWVzOnt9LGNvZGVMb2NhdGlvbkZvY3VzVHlwZTpudWxsLHN0aWNrVG9Cb3R0b21tb3N0RnJhbWVJbkZvY3VzZWRGaWxlOiExLHNvdXJjZUNvZGU6e3NvdXJjZUZpbGVMaXN0TG9hZGVkOntzdGF0ZTp5RS5OT1RfTE9BREVELGxhc3RMb2FkZWRUaW1lSW5NczpudWxsfSxzb3VyY2VGaWxlTGlzdDpbXSxmaWxlQ29udGVudHM6W10sZm9jdXNMaW5lU3BlYzpudWxsfX0sYmsoTnEsKHQ9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7cnVuc0xvYWRlZDpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5ydW5zTG9hZGVkKSx7c3RhdGU6eUUuTE9BRElOR30pfSkpKSxiayhJcSwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtydW5zTG9hZGVkOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnJ1bnNMb2FkZWQpLHtzdGF0ZTp5RS5GQUlMRUR9KX0pKSksYmsoenEsKCh0LHtydW5zOmV9KT0+e2NvbnN0IG49T2JqZWN0LmtleXMoZSksbz1uLmxlbmd0aD4wJiZudWxsPT09dC5hY3RpdmVSdW5JZDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtsYXN0Tm9uRW1wdHlQb2xsRGF0YVRpbWVNczpvP0RhdGUubm93KCk6dC5sYXN0Tm9uRW1wdHlQb2xsRGF0YVRpbWVNcyxydW5zOmUscnVuc0xvYWRlZDp7c3RhdGU6eUUuTE9BREVELGxhc3RMb2FkZWRUaW1lSW5NczpEYXRlLm5vdygpfSxhY3RpdmVSdW5JZDpuLmxlbmd0aD4wP25bMF06bnVsbH0pfSkpLGJrKFRxLCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2xhc3REYXRhUG9sbE9uc2V0VGltZU1zOkRhdGUubm93KCl9KSkpLGJrKEhxLCh0PT5udWxsPT09dC5hY3RpdmVSdW5JZD90Ok9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7YWxlcnRzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmFsZXJ0cykse2FsZXJ0c0xvYWRlZDpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5hbGVydHMuYWxlcnRzTG9hZGVkKSx7c3RhdGU6eUUuTE9BRElOR30pfSl9KSkpLGJrKEZxLCgodCx7bnVtQWxlcnRzOmUsYWxlcnRzQnJlYWtkb3duOm59KT0+e2lmKG51bGw9PT10LmFjdGl2ZVJ1bklkKXJldHVybiB0O2NvbnN0IG89ZT50LmFsZXJ0cy5udW1BbGVydHM7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7bGFzdE5vbkVtcHR5UG9sbERhdGFUaW1lTXM6bz9EYXRlLm5vdygpOnQubGFzdE5vbkVtcHR5UG9sbERhdGFUaW1lTXMsYWxlcnRzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmFsZXJ0cykse2FsZXJ0c0xvYWRlZDpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5hbGVydHMuYWxlcnRzTG9hZGVkKSx7c3RhdGU6eUUuTE9BREVELGxhc3RMb2FkZWRUaW1lSW5NczpEYXRlLm5vdygpfSksbnVtQWxlcnRzOmUsYWxlcnRzQnJlYWtkb3duOm59KX0pfSkpLGJrKExxLCgodCx7bnVtQWxlcnRzOmUsYWxlcnRzQnJlYWtkb3duOm4sYWxlcnRUeXBlOm8sYmVnaW46aSxhbGVydHM6YX0pPT57aWYobnVsbD09PXQuYWN0aXZlUnVuSWQpcmV0dXJuIHQ7Y29uc3Qgcj17fSxzPXQuYWxlcnRzLmV4ZWN1dGlvbkluZGljZXNbb10/dC5hbGVydHMuZXhlY3V0aW9uSW5kaWNlc1tvXS5zbGljZSgpOltdLGw9dC5hbGVydHMuZ3JhcGhFeGVjdXRpb25JbmRpY2VzW29dP3QuYWxlcnRzLmdyYXBoRXhlY3V0aW9uSW5kaWNlc1tvXS5zbGljZSgpOltdO2ZvcihsZXQgdD0wO3Q8YS5sZW5ndGg7Kyt0KXtjb25zdCBlPWkrdCxuPWFbdF07aWYocltlXT1uLG4uYWxlcnRfdHlwZT09PXVaLklORl9OQU5fQUxFUlQpe2NvbnN0IHQ9bjtzW2VdPXQuZXhlY3V0aW9uX2luZGV4LG51bGwhPT10LmdyYXBoX2V4ZWN1dGlvbl90cmFjZV9pbmRleCYmKGxbZV09dC5ncmFwaF9leGVjdXRpb25fdHJhY2VfaW5kZXgpfX12b2lkIDAhPT10LmFsZXJ0cy5hbGVydHNbb10mJk9iamVjdC5hc3NpZ24ocix0LmFsZXJ0cy5hbGVydHNbb10pO2xldCBjPXQuZXhlY3V0aW9ucy5zY3JvbGxCZWdpbkluZGV4LGQ9dC5ncmFwaEV4ZWN1dGlvbnMuZm9jdXNJbmRleDtpZihvPT09dVouSU5GX05BTl9BTEVSVCYmMD09PWkpe2NvbnN0IGU9YVswXTtjPU1hdGgubWF4KDAsZS5leGVjdXRpb25faW5kZXgtTWF0aC5mbG9vcih0LmV4ZWN1dGlvbnMuZGlzcGxheUNvdW50LzIpKSxudWxsIT09ZS5ncmFwaF9leGVjdXRpb25fdHJhY2VfaW5kZXgmJihkPWUuZ3JhcGhfZXhlY3V0aW9uX3RyYWNlX2luZGV4KX1yZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtleGVjdXRpb25zOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmV4ZWN1dGlvbnMpLHtzY3JvbGxCZWdpbkluZGV4OmN9KSxncmFwaEV4ZWN1dGlvbnM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuZ3JhcGhFeGVjdXRpb25zKSx7Zm9jdXNJbmRleDpkfSksYWxlcnRzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmFsZXJ0cykse2FsZXJ0c0xvYWRlZDpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5hbGVydHMuYWxlcnRzTG9hZGVkKSx7c3RhdGU6eUUuTE9BREVELGxhc3RMb2FkZWRUaW1lSW5NczpEYXRlLm5vdygpfSksbnVtQWxlcnRzOmUsYWxlcnRzQnJlYWtkb3duOm4sYWxlcnRzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmFsZXJ0cy5hbGVydHMpLHtbb106cn0pLGV4ZWN1dGlvbkluZGljZXM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuYWxlcnRzLmV4ZWN1dGlvbkluZGljZXMpLHtbb106c30pLGdyYXBoRXhlY3V0aW9uSW5kaWNlczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5hbGVydHMuZ3JhcGhFeGVjdXRpb25JbmRpY2VzKSx7W29dOmx9KX0pfSl9KSksYmsoQnEsKCh0LHthbGVydFR5cGU6ZX0pPT57Y29uc3Qgbj1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2FsZXJ0czpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5hbGVydHMpLHtmb2N1c1R5cGU6dC5hbGVydHMuZm9jdXNUeXBlPT09ZT9udWxsOmV9KX0pLG89bi5hbGVydHMuZm9jdXNUeXBlO2lmKG51bGwhPT1vKXtjb25zdCB0PW4uYWxlcnRzLmV4ZWN1dGlvbkluZGljZXNbb118fFtdO3ZvaWQgMCE9PXRbMF0mJihuLmV4ZWN1dGlvbnM9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG4uZXhlY3V0aW9ucykse3Njcm9sbEJlZ2luSW5kZXg6TWF0aC5tYXgoMCxOdW1iZXIodFswXSktTWF0aC5mbG9vcihuLmV4ZWN1dGlvbnMuZGlzcGxheUNvdW50LzIpKX0pKX1yZXR1cm4gbn0pKSxiayhWcSwodD0+bnVsbD09PXQuYWN0aXZlUnVuSWQ/dDpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2V4ZWN1dGlvbnM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuZXhlY3V0aW9ucykse251bUV4ZWN1dGlvbnNMb2FkZWQ6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuZXhlY3V0aW9ucy5udW1FeGVjdXRpb25zTG9hZGVkKSx7c3RhdGU6eUUuTE9BRElOR30pfSl9KSkpLGJrKGpxLCgodCx7bnVtRXhlY3V0aW9uczplfSk9PntpZihudWxsPT09dC5hY3RpdmVSdW5JZClyZXR1cm4gdDtjb25zdCBuPWU+dC5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQubnVtRXhlY3V0aW9ucyxvPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7bGFzdE5vbkVtcHR5UG9sbERhdGFUaW1lTXM6bj9EYXRlLm5vdygpOnQubGFzdE5vbkVtcHR5UG9sbERhdGFUaW1lTXMsZXhlY3V0aW9uczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5leGVjdXRpb25zKSx7bnVtRXhlY3V0aW9uc0xvYWRlZDpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5leGVjdXRpb25zLm51bUV4ZWN1dGlvbnNMb2FkZWQpLHtzdGF0ZTp5RS5MT0FERUQsbGFzdExvYWRlZFRpbWVJbk1zOkRhdGUubm93KCl9KSxleGVjdXRpb25EaWdlc3RzTG9hZGVkOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmV4ZWN1dGlvbnMuZXhlY3V0aW9uRGlnZXN0c0xvYWRlZCkse251bUV4ZWN1dGlvbnM6ZX0pfSl9KTtyZXR1cm4gZT4wJiZudWxsPT09dC5leGVjdXRpb25zLmZvY3VzSW5kZXgmJihvLmV4ZWN1dGlvbnMuZm9jdXNJbmRleD0wKSxvfSkpLGJrKFVxLCgodCxlKT0+e2lmKG51bGw9PT10LmFjdGl2ZVJ1bklkKXJldHVybiB0O2NvbnN0IG49Wy4uLnQuZXhlY3V0aW9ucy5leGVjdXRpb25EaWdlc3RzTG9hZGVkLmxvYWRpbmdSYW5nZXNdO3JldHVybi0xPT09YloobixlLmJlZ2luLGUuZW5kKSYmbi5wdXNoKHtiZWdpbjplLmJlZ2luLGVuZDplLmVuZH0pLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7ZXhlY3V0aW9uczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5leGVjdXRpb25zKSx7ZXhlY3V0aW9uRGlnZXN0c0xvYWRlZDpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQpLHtsb2FkaW5nUmFuZ2VzOm59KX0pfSl9KSksYmsoR3EsKCh0LGUpPT57aWYobnVsbD09PXQuYWN0aXZlUnVuSWQpcmV0dXJuIHQ7Y29uc3Qgbj1bLi4udC5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQubG9hZGluZ1Jhbmdlc10sbz1iWihuLGUuYmVnaW4sZS5lbmQpOy0xIT09byYmbi5zcGxpY2UobywxKTtjb25zdCBpPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7ZXhlY3V0aW9uczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5leGVjdXRpb25zKSx7ZXhlY3V0aW9uRGlnZXN0c0xvYWRlZDpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQpLHtudW1FeGVjdXRpb25zOmUubnVtX2RpZ2VzdHMsbG9hZGluZ1JhbmdlczpufSksZXhlY3V0aW9uRGlnZXN0czpPYmplY3QuYXNzaWduKHt9LHQuZXhlY3V0aW9ucy5leGVjdXRpb25EaWdlc3RzKX0pfSk7Zm9yKGxldCB0PWUuYmVnaW47dDxlLmVuZDsrK3QpaS5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNbdF09ZS5leGVjdXRpb25fZGlnZXN0c1t0LWUuYmVnaW5dO2lmKGUuZW5kPmUuYmVnaW4pe2NvbnN0IG49ZS5iZWdpbi90LmV4ZWN1dGlvbnMucGFnZVNpemU7aS5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQucGFnZUxvYWRlZFNpemVzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpLmV4ZWN1dGlvbnMuZXhlY3V0aW9uRGlnZXN0c0xvYWRlZC5wYWdlTG9hZGVkU2l6ZXMpLHtbbl06ZS5lbmQtZS5iZWdpbn0pfXJldHVybiBpfSkpLGJrKFdxLCh0PT57aWYobnVsbD09PXQuYWN0aXZlUnVuSWQpcmV0dXJuIHQ7bGV0IGU9dC5leGVjdXRpb25zLnNjcm9sbEJlZ2luSW5kZXg7cmV0dXJuIGU+MCYmZS0tLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7ZXhlY3V0aW9uczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5leGVjdXRpb25zKSx7c2Nyb2xsQmVnaW5JbmRleDplfSl9KX0pKSxiayhZcSwodD0+e2lmKG51bGw9PT10LmFjdGl2ZVJ1bklkKXJldHVybiB0O2xldCBlPXQuZXhlY3V0aW9ucy5zY3JvbGxCZWdpbkluZGV4O3JldHVybiBlK3QuZXhlY3V0aW9ucy5kaXNwbGF5Q291bnQrMTw9dC5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQubnVtRXhlY3V0aW9ucyYmZSsrLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7ZXhlY3V0aW9uczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5leGVjdXRpb25zKSx7c2Nyb2xsQmVnaW5JbmRleDplfSl9KX0pKSxiayhxcSwoKHQsZSk9PntpZihlLmluZGV4PDB8fCFOdW1iZXIuaXNJbnRlZ2VyKGUuaW5kZXgpKXRocm93IG5ldyBFcnJvcihgQXR0ZW1wdCB0byBzY3JvbGwgdG8gbmVnYXRpdmUgb3Igbm9uLWludGVnZXIgZXhlY3V0aW9uIGluZGV4ICgke2UuaW5kZXh9KWApO2NvbnN0e2Rpc3BsYXlDb3VudDpufT10LmV4ZWN1dGlvbnMse251bUV4ZWN1dGlvbnM6b309dC5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQ7aWYoZS5pbmRleD5NYXRoLm1heCgwLG8tbikpdGhyb3cgbmV3IEVycm9yKGBBdHRlbXB0IHRvIHNjcm9sbCB0byBleGVjdXRpb24gaW5kZXggKCR7ZS5pbmRleH0pLCB3aGljaCBleGNlZWRzIG1heGltdW0gYWxsb3dlZCBpbmRleCAobnVtRXhlY3V0aW9ucz0ke299OyBkaXNwbGF5Q291bnQ9JHtufSlgKTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtleGVjdXRpb25zOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmV4ZWN1dGlvbnMpLHtzY3JvbGxCZWdpbkluZGV4OmUuaW5kZXh9KX0pfSkpLGJrKFpxLCgodCxlKT0+e2NvbnN0IG49T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtleGVjdXRpb25zOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmV4ZWN1dGlvbnMpLHtmb2N1c0luZGV4OnQuZXhlY3V0aW9ucy5zY3JvbGxCZWdpbkluZGV4K2UuZGlzcGxheUluZGV4fSksY29kZUxvY2F0aW9uRm9jdXNUeXBlOmZaLkVYRUNVVElPTixzb3VyY2VDb2RlOk9iamVjdC5hc3NpZ24oe30sdC5zb3VyY2VDb2RlKX0pO3JldHVybiBuLnNvdXJjZUNvZGUuZm9jdXNMaW5lU3BlYz15WihuKSxufSkpLGJrKFhxLCgodCxlKT0+e2lmKG51bGw9PT10LmFjdGl2ZVJ1bklkKXJldHVybiB0O2NvbnN0IG49T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtleGVjdXRpb25zOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmV4ZWN1dGlvbnMpLHtleGVjdXRpb25EYXRhOk9iamVjdC5hc3NpZ24oe30sdC5leGVjdXRpb25zLmV4ZWN1dGlvbkRhdGEpfSl9KTtmb3IobGV0IHQ9ZS5iZWdpbjt0PGUuZW5kOysrdCluLmV4ZWN1dGlvbnMuZXhlY3V0aW9uRGF0YVt0XT1lLmV4ZWN1dGlvbnNbdC1lLmJlZ2luXTtyZXR1cm4gbn0pKSxiayhLcSwodD0+bnVsbD09PXQuYWN0aXZlUnVuSWQ/dDpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2dyYXBoRXhlY3V0aW9uczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5ncmFwaEV4ZWN1dGlvbnMpLHtudW1FeGVjdXRpb25zTG9hZGVkOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmdyYXBoRXhlY3V0aW9ucy5udW1FeGVjdXRpb25zTG9hZGVkKSx7c3RhdGU6eUUuTE9BRElOR30pfSl9KSkpLGJrKEpxLCgodCx7bnVtR3JhcGhFeGVjdXRpb25zOmV9KT0+e2lmKG51bGw9PT10LmFjdGl2ZVJ1bklkKXJldHVybiB0O2NvbnN0IG49ZT50LmdyYXBoRXhlY3V0aW9ucy5leGVjdXRpb25EaWdlc3RzTG9hZGVkLm51bUV4ZWN1dGlvbnMsbz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2xhc3ROb25FbXB0eVBvbGxEYXRhVGltZU1zOm4/RGF0ZS5ub3coKTp0Lmxhc3ROb25FbXB0eVBvbGxEYXRhVGltZU1zLGdyYXBoRXhlY3V0aW9uczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5ncmFwaEV4ZWN1dGlvbnMpLHtudW1FeGVjdXRpb25zTG9hZGVkOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmdyYXBoRXhlY3V0aW9ucy5udW1FeGVjdXRpb25zTG9hZGVkKSx7c3RhdGU6eUUuTE9BREVELGxhc3RMb2FkZWRUaW1lSW5NczpEYXRlLm5vdygpfSksZXhlY3V0aW9uRGlnZXN0c0xvYWRlZDpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5ncmFwaEV4ZWN1dGlvbnMuZXhlY3V0aW9uRGlnZXN0c0xvYWRlZCkse251bUV4ZWN1dGlvbnM6ZX0pfSl9KTtyZXR1cm4gZT4wJiZudWxsPT09dC5ncmFwaEV4ZWN1dGlvbnMuZm9jdXNJbmRleCYmKG8uZ3JhcGhFeGVjdXRpb25zLmZvY3VzSW5kZXg9MCksb30pKSxiayhRcSwoKHQse3BhZ2VJbmRleDplfSk9PntpZihudWxsPT09dC5hY3RpdmVSdW5JZClyZXR1cm4gdDtjb25zdCBuPXQuZ3JhcGhFeGVjdXRpb25zLmdyYXBoRXhlY3V0aW9uRGF0YUxvYWRpbmdQYWdlcy5zbGljZSgpO3JldHVybi0xPT09bi5pbmRleE9mKGUpJiZuLnB1c2goZSksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtncmFwaEV4ZWN1dGlvbnM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuZ3JhcGhFeGVjdXRpb25zKSx7Z3JhcGhFeGVjdXRpb25EYXRhTG9hZGluZ1BhZ2VzOm59KX0pfSkpLGJrKCRxLCgodCxlKT0+e2lmKG51bGw9PT10LmFjdGl2ZVJ1bklkKXJldHVybiB0O2NvbnN0e3BhZ2VTaXplOm59PXQuZ3JhcGhFeGVjdXRpb25zLG89dC5ncmFwaEV4ZWN1dGlvbnMuZ3JhcGhFeGVjdXRpb25EYXRhTG9hZGluZ1BhZ2VzLnNsaWNlKCksaT1PYmplY3QuYXNzaWduKHt9LHQuZ3JhcGhFeGVjdXRpb25zLmdyYXBoRXhlY3V0aW9uRGF0YVBhZ2VMb2FkZWRTaXplcyksYT1PYmplY3QuYXNzaWduKHt9LHQuZ3JhcGhFeGVjdXRpb25zLmdyYXBoRXhlY3V0aW9uRGF0YSk7Zm9yKGxldCB0PWUuYmVnaW47dDxlLmVuZDsrK3Qpe2NvbnN0IHI9TWF0aC5mbG9vcih0L24pOy0xIT09by5pbmRleE9mKHIpJiZvLnNwbGljZShvLmluZGV4T2YociksMSksdm9pZCAwPT09aVtyXSYmKGlbcl09MCksdm9pZCAwPT09YVt0XSYmaVtyXSsrLGFbdF09ZS5ncmFwaF9leGVjdXRpb25zW3QtZS5iZWdpbl19cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7Z3JhcGhFeGVjdXRpb25zOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmdyYXBoRXhlY3V0aW9ucykse2dyYXBoRXhlY3V0aW9uRGF0YUxvYWRpbmdQYWdlczpvLGdyYXBoRXhlY3V0aW9uRGF0YVBhZ2VMb2FkZWRTaXplczppLGdyYXBoRXhlY3V0aW9uRGF0YTphfSl9KX0pKSxiayh0WiwoKHQsZSk9PntpZihlLmluZGV4PDB8fCFOdW1iZXIuaXNJbnRlZ2VyKGUuaW5kZXgpKXRocm93IG5ldyBFcnJvcihgQXR0ZW1wdCB0byBzY3JvbGwgdG8gbmVnYXRpdmUgb3Igbm9uLWludGVnZXIgZ3JhcGgtZXhlY3V0aW9uIGluZGV4ICgke2UuaW5kZXh9KWApO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2dyYXBoRXhlY3V0aW9uczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5ncmFwaEV4ZWN1dGlvbnMpLHtzY3JvbGxCZWdpbkluZGV4OmUuaW5kZXh9KX0pfSkpLGJrKGVaLCgodCxlKT0+dloodCxlLmdyYXBoX2lkLGUub3BfbmFtZSxlLmluZGV4KSkpLGJrKG5aLCgodCxlKT0+dloodCxlLmdyYXBoX2lkLGUub3BfbmFtZSkpKSxiayhvWiwoKHQsZSk9Pntjb25zdHtncmFwaF9pZDpuLG9wX25hbWU6b309ZSxpPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7Z3JhcGhzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmdyYXBocykse2xvYWRpbmdPcHM6T2JqZWN0LmFzc2lnbih7fSx0LmdyYXBocy5sb2FkaW5nT3BzKX0pfSk7cmV0dXJuIHZvaWQgMD09PWkuZ3JhcGhzLmxvYWRpbmdPcHNbbl0mJihpLmdyYXBocy5sb2FkaW5nT3BzW25dPW5ldyBNYXApLGkuZ3JhcGhzLmxvYWRpbmdPcHNbbl0uaGFzKG8pfHxpLmdyYXBocy5sb2FkaW5nT3BzW25dLnNldChvLHlFLkxPQURJTkcpLGl9KSksYmsoaVosKCh0LGUpPT57Y29uc3R7Z3JhcGhPcEluZm9SZXNwb25zZTpufT1lLHtncmFwaF9pZHM6b309bixpPW9bby5sZW5ndGgtMV0sYT1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2dyYXBoczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5ncmFwaHMpLHtvcHM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuZ3JhcGhzLm9wcykse1tpXTpuZXcgTWFwKHQuZ3JhcGhzLm9wc1tpXSl9KSxsb2FkaW5nT3BzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmdyYXBocy5sb2FkaW5nT3BzKSx7W2ldOm5ldyBNYXAodC5ncmFwaHMubG9hZGluZ09wc1tpXSl9KX0pfSk7Zm9yKGNvbnN0IHQgb2Ygbi5pbnB1dHMpdC5kYXRhJiZhLmdyYXBocy5vcHNbaV0uc2V0KHQub3BfbmFtZSx0LmRhdGEpO2ZvcihsZXQgdD0wO3Q8bi5jb25zdW1lcnMubGVuZ3RoOysrdClmb3IoY29uc3QgZSBvZiBuLmNvbnN1bWVyc1t0XSllLmRhdGEmJmEuZ3JhcGhzLm9wc1tpXS5zZXQoZS5vcF9uYW1lLGUuZGF0YSk7cmV0dXJuIGEuZ3JhcGhzLm9wc1tpXS5zZXQobi5vcF9uYW1lLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7aW5wdXRzOm4uaW5wdXRzLm1hcCgodD0+KHtvcF9uYW1lOnQub3BfbmFtZSxvdXRwdXRfc2xvdDp0Lm91dHB1dF9zbG90fSkpKSxjb25zdW1lcnM6bi5jb25zdW1lcnMubWFwKCh0PT50Lm1hcCgodD0+KHtvcF9uYW1lOnQub3BfbmFtZSxpbnB1dF9zbG90OnQuaW5wdXRfc2xvdH0pKSkpKX0pKSxhLmdyYXBocy5sb2FkaW5nT3BzW2ldLnNldChuLm9wX25hbWUseUUuTE9BREVEKSxhfSkpLGJrKGFaLCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NvdXJjZUNvZGU6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuc291cmNlQ29kZSkse3NvdXJjZUZpbGVMaXN0TG9hZGVkOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnNvdXJjZUNvZGUuc291cmNlRmlsZUxpc3RMb2FkZWQpLHtzdGF0ZTp5RS5MT0FESU5HfSl9KX0pKSksYmsoclosKCh0LGUpPT57dmFyIG47Y29uc3Qgbz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NvdXJjZUNvZGU6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuc291cmNlQ29kZSkse3NvdXJjZUZpbGVMaXN0TG9hZGVkOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnNvdXJjZUNvZGUuc291cmNlRmlsZUxpc3RMb2FkZWQpLHtzdGF0ZTp5RS5MT0FERUQsbGFzdExvYWRlZFRpbWVJbk1zOkRhdGUubm93KCl9KSxzb3VyY2VGaWxlTGlzdDplLnNvdXJjZUZpbGVzLGZpbGVDb250ZW50czp0LnNvdXJjZUNvZGUuZmlsZUNvbnRlbnRzLnNsaWNlKCl9KX0pLGk9ZS5zb3VyY2VGaWxlcy5sZW5ndGgse2ZpbGVDb250ZW50czphfT1vLnNvdXJjZUNvZGU7Zm9yKGxldCBlPTA7ZTxpOysrZSlhW2VdPW51bGwhPT0obj10LnNvdXJjZUNvZGUuZmlsZUNvbnRlbnRzW2VdKSYmdm9pZCAwIT09bj9uOntsb2FkU3RhdGU6eUUuTk9UX0xPQURFRCxsaW5lczpudWxsfTtyZXR1cm4gb30pKSxiayhzWiwoKHQsZSk9Pntjb25zdCBuPWdaKHQpLG89T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzb3VyY2VDb2RlOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnNvdXJjZUNvZGUpLHtmb2N1c0xpbmVTcGVjOmUuc3RhY2tGcmFtZX0pfSk7cmV0dXJuIG51bGwhPT1uJiYoby5zdGlja1RvQm90dG9tbW9zdEZyYW1lSW5Gb2N1c2VkRmlsZT0oZnVuY3Rpb24gaSh0LGUpe2xldCBuPS0xLG89LTE7aWYodC5mb3JFYWNoKCgoe2ZpbGVfcGF0aDp0LGxpbmVubzppfSxhKT0+e3Q9PT1lLmZpbGVfcGF0aCYmKG89YSxpPT09ZS5saW5lbm8mJihuPWEpKX0pKSwtMT09PW4pdGhyb3cgbmV3IEVycm9yKGBTdGFjayBmcmFtZSAke0pTT04uc3RyaW5naWZ5KGUpfSBpcyBub3QgZm91bmQuYCk7cmV0dXJuIG49PT1vfSkobixlLnN0YWNrRnJhbWUpKSxvfSkpLGJrKGxaLCgodCxlKT0+e2NvbnN0IG49T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzb3VyY2VDb2RlOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnNvdXJjZUNvZGUpLHtmaWxlQ29udGVudHM6dC5zb3VyY2VDb2RlLmZpbGVDb250ZW50cy5zbGljZSgpfSl9KSxvPWhaKG4uc291cmNlQ29kZS5zb3VyY2VGaWxlTGlzdCxlKTtpZighKG8+PTApKXRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgdGhlIGZvbGxvd2luZyBmaWxlIGluIGZpbGUgbGlzdDogaG9zdF9uYW1lPSIke2UuaG9zdF9uYW1lfSIsIGZpbGVfcGF0aD0iJHtlLmZpbGVfcGF0aH0iYCk7cmV0dXJuIG4uc291cmNlQ29kZS5maWxlQ29udGVudHMuc3BsaWNlKG8sMSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbi5zb3VyY2VDb2RlLmZpbGVDb250ZW50c1tvXSkse2xvYWRTdGF0ZTp5RS5MT0FESU5HfSkpLG59KSksYmsoY1osKCh0LGUpPT57Y29uc3Qgbj1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NvdXJjZUNvZGU6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuc291cmNlQ29kZSkse2ZpbGVDb250ZW50czp0LnNvdXJjZUNvZGUuZmlsZUNvbnRlbnRzLnNsaWNlKCl9KX0pLG89aFoobi5zb3VyY2VDb2RlLnNvdXJjZUZpbGVMaXN0LGUpO2lmKCEobz49MCkpdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCB0aGUgZm9sbG93aW5nIGZpbGUgaW4gZmlsZSBsaXN0OiBob3N0X25hbWU9IiR7ZS5ob3N0X25hbWV9IiwgZmlsZV9wYXRoPSIke2UuZmlsZV9wYXRofSJgKTtyZXR1cm4gbi5zb3VyY2VDb2RlLmZpbGVDb250ZW50cy5zcGxpY2UobywxLHtsb2FkU3RhdGU6eUUuTE9BREVELGxpbmVzOmUubGluZXN9KSxufSkpLGJrKGRaLCgodCxlKT0+e2lmKG51bGw9PT10LmFjdGl2ZVJ1bklkKXJldHVybiB0O2NvbnN0IG49T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzdGFja0ZyYW1lczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5zdGFja0ZyYW1lcyksZS5zdGFja0ZyYW1lcyksc291cmNlQ29kZTpPYmplY3QuYXNzaWduKHt9LHQuc291cmNlQ29kZSl9KTtyZXR1cm4gbi5zb3VyY2VDb2RlLmZvY3VzTGluZVNwZWM9eVoobiksbn0pKSk7ZnVuY3Rpb24gdloodCxlLG4sbyl7Y29uc3QgaT1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2dyYXBoczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5ncmFwaHMpLHtmb2N1c2VkT3A6e2dyYXBoSWQ6ZSxvcE5hbWU6bn19KSxjb2RlTG9jYXRpb25Gb2N1c1R5cGU6ZlouR1JBUEhfT1BfQ1JFQVRJT04sc291cmNlQ29kZTpPYmplY3QuYXNzaWduKHt9LHQuc291cmNlQ29kZSl9KTtyZXR1cm4gaS5zb3VyY2VDb2RlLmZvY3VzTGluZVNwZWM9eVooaSksdm9pZCAwIT09byYmKGkuZ3JhcGhFeGVjdXRpb25zPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmdyYXBoRXhlY3V0aW9ucykse2ZvY3VzSW5kZXg6b30pKSxpfWZ1bmN0aW9uIHhaKHQsZSl7cmV0dXJuIF9aKHQsZSl9Y29uc3QgT1o9S3cocFopLFBaPVp3KE9aLCh0PT50LnJ1bnMpKSx3Wj1adyhPWiwodD0+dC5ydW5zTG9hZGVkKSksa1o9WncoT1osKHQ9PnQuYWN0aXZlUnVuSWQpKSxTWj1adyhPWiwodD0+dC5sYXN0RGF0YVBvbGxPbnNldFRpbWVNcy10Lmxhc3ROb25FbXB0eVBvbGxEYXRhVGltZU1zKSksRFo9WncoT1osKHQ9PnQuYWxlcnRzKSksRVo9WncoRFosKHQ9PnQuYWxlcnRzTG9hZGVkKSksUlo9WncoRFosKHQ9PnQubnVtQWxlcnRzKSksQVo9WncoRFosKHQ9PnQuZm9jdXNUeXBlKSksVFo9WncoRFosKHQ9Pm51bGw9PT10LmZvY3VzVHlwZT8wOnQuYWxlcnRzQnJlYWtkb3duW3QuZm9jdXNUeXBlXXx8MCkpLE5aPVp3KERaLCh0PT5udWxsPT09dC5mb2N1c1R5cGV8fHZvaWQgMD09PXQuYWxlcnRzW3QuZm9jdXNUeXBlXT9udWxsOnQuYWxlcnRzW3QuZm9jdXNUeXBlXSkpLHpaPVp3KERaLCh0PT50LmFsZXJ0c0JyZWFrZG93bikpLElaPVp3KE9aLCh0PT50LmV4ZWN1dGlvbnMpKSxIWj1adyhJWiwodD0+dC5udW1FeGVjdXRpb25zTG9hZGVkKSksRlo9WncoSVosKHQ9PnQuZXhlY3V0aW9uRGlnZXN0c0xvYWRlZCkpLExaPVp3KElaLCh0PT50LmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQubnVtRXhlY3V0aW9ucykpLEJaPVp3KElaLCh0PT50LnNjcm9sbEJlZ2luSW5kZXgpKSxWWj1adyhJWiwodD0+dC5wYWdlU2l6ZSkpLGpaPVp3KElaLCh0PT50LmRpc3BsYXlDb3VudCkpLFVaPVp3KElaLCh0PT57Y29uc3QgZT1bXTtmb3IobGV0IG49dC5zY3JvbGxCZWdpbkluZGV4O248dC5zY3JvbGxCZWdpbkluZGV4K3QuZGlzcGxheUNvdW50OysrbillLnB1c2gobiBpbiB0LmV4ZWN1dGlvbkRpZ2VzdHM/dC5leGVjdXRpb25EaWdlc3RzW25dOm51bGwpO3JldHVybiBlfSkpLEdaPVp3KE9aLCh0PT50LmdyYXBoRXhlY3V0aW9ucykpLFdaPVp3KEdaLCh0PT50Lm51bUV4ZWN1dGlvbnNMb2FkZWQpKSxZWj1adyhPWiwodD0+dC5ncmFwaEV4ZWN1dGlvbnMuZXhlY3V0aW9uRGlnZXN0c0xvYWRlZC5udW1FeGVjdXRpb25zKSkscVo9WncoR1osKHQ9PnQuc2Nyb2xsQmVnaW5JbmRleCkpLFpaPVp3KEdaLCh0PT50LmRpc3BsYXlDb3VudCkpLFhaPVp3KEdaLCh0PT50LnBhZ2VTaXplKSksS1o9WncoR1osKHQ9PnQuZ3JhcGhFeGVjdXRpb25EYXRhTG9hZGluZ1BhZ2VzKSksSlo9WncoR1osKHQ9PnQuZ3JhcGhFeGVjdXRpb25EYXRhUGFnZUxvYWRlZFNpemVzKSksUVo9WncoR1osKHQ9PnQuZ3JhcGhFeGVjdXRpb25EYXRhKSksJFo9WncoR1osKHQ9PnQuZm9jdXNJbmRleCkpLHRYPVp3KE9aLCh0PT50LmdyYXBocykpLGVYPVp3KHRYLCh0PT57Y29uc3R7Zm9jdXNlZE9wOmUsb3BzOm59PXQ7cmV0dXJuIG51bGw9PT1lfHx2b2lkIDA9PT1uW2UuZ3JhcGhJZF0/bnVsbDpuW2UuZ3JhcGhJZF0uZ2V0KGUub3BOYW1lKXx8bnVsbH0pKSxuWD1adyh0WCwodD0+e2NvbnN0e2ZvY3VzZWRPcDplLG9wczpufT10O2lmKG51bGwhPT1lJiZ2b2lkIDAhPT1uW2UuZ3JhcGhJZF0mJm5bZS5ncmFwaElkXS5oYXMoZS5vcE5hbWUpKXtjb25zdCB0PW5bZS5ncmFwaElkXSx7aW5wdXRzOm99PXQuZ2V0KGUub3BOYW1lKTtyZXR1cm4gby5tYXAoKGU9Pntjb25zdCBuPU9iamVjdC5hc3NpZ24oe30sZSk7cmV0dXJuIHQuaGFzKGUub3BfbmFtZSkmJihuLmRhdGE9dC5nZXQoZS5vcF9uYW1lKSksbn0pKX1yZXR1cm4gbnVsbH0pKSxvWD1adygkWixRWixuWCwoKHQsZSxuKT0+e2lmKG51bGw9PT10fHxudWxsPT09bilyZXR1cm4gbnVsbDtjb25zdCBvPW4ubWFwKCh0PT4hMSkpLGk9W107aWYoMD09PW4ubGVuZ3RoKXJldHVybiBpO2NvbnN0IGE9ZVt0XS5ncmFwaF9pZCxyPU1hdGgubWF4KDAsdC0yMDApO2ZvcihsZXQgcz10LTE7cz49cjstLXMpaWYodm9pZCAwIT09ZVtzXSlmb3IobGV0IHQ9MDt0PG4ubGVuZ3RoJiYob1t0XXx8ZVtzXS5ncmFwaF9pZCE9PWF8fGVbc10ub3BfbmFtZSE9PW5bdF0ub3BfbmFtZXx8ZVtzXS5vdXRwdXRfc2xvdCE9PW5bdF0ub3V0cHV0X3Nsb3R8fChpLnB1c2gocyksb1t0XT0hMCxpLmxlbmd0aCE9PW4ubGVuZ3RoKSk7Kyt0KTtyZXR1cm4gaX0pKSxpWD1adyh0WCwodD0+e2NvbnN0e2ZvY3VzZWRPcDplLG9wczpufT10O2lmKG51bGwhPT1lJiZ2b2lkIDAhPT1uW2UuZ3JhcGhJZF0mJm5bZS5ncmFwaElkXS5oYXMoZS5vcE5hbWUpKXtjb25zdCB0PW5bZS5ncmFwaElkXSx7Y29uc3VtZXJzOm99PXQuZ2V0KGUub3BOYW1lKTtyZXR1cm4gby5tYXAoKGU9PmUubWFwKChlPT57Y29uc3Qgbj1PYmplY3QuYXNzaWduKHt9LGUpO3JldHVybiB0LmhhcyhlLm9wX25hbWUpJiYobi5kYXRhPXQuZ2V0KGUub3BfbmFtZSkpLG59KSkpKX1yZXR1cm4gbnVsbH0pKSxhWD1adyhPWiwodD0+e2NvbnN0IGU9dC5leGVjdXRpb25zLnNjcm9sbEJlZ2luSW5kZXgsbj10LmV4ZWN1dGlvbnMuc2Nyb2xsQmVnaW5JbmRleCt0LmV4ZWN1dGlvbnMuZGlzcGxheUNvdW50LG89bmV3IEFycmF5KG4tZSkuZmlsbChudWxsKSxpPXQuYWxlcnRzLmZvY3VzVHlwZTtpZihudWxsPT09aSlyZXR1cm4gbztjb25zdCBhPXQuYWxlcnRzLmV4ZWN1dGlvbkluZGljZXNbaV07aWYodm9pZCAwPT09YSlyZXR1cm4gbztmb3IobGV0IGk9ZTtpPG47KytpKWEuaW5jbHVkZXMoaSkmJihvW2ktZV09dC5hbGVydHMuZm9jdXNUeXBlKTtyZXR1cm4gb30pKSxyWD1adyhPWiwodD0+dC5leGVjdXRpb25zKSksc1g9WncoclgsKHQ9PnQuZm9jdXNJbmRleCkpLGxYPVp3KHJYLCh0PT57aWYobnVsbD09PXQuZm9jdXNJbmRleClyZXR1cm4gbnVsbDtjb25zdHtmb2N1c0luZGV4OmUsc2Nyb2xsQmVnaW5JbmRleDpuLGRpc3BsYXlDb3VudDpvfT10O3JldHVybiBlPG58fGU+PW4rbz9udWxsOmUtbn0pKSxjWD1adyhyWCwodD0+dC5leGVjdXRpb25EYXRhKSksZFg9WncoT1osKHQ9PnQuZ3JhcGhzLmxvYWRpbmdPcHMpKSxwWD1adyhPWiwodD0+dC5zdGFja0ZyYW1lcykpLG1YPVp3KHJYLCh0PT57Y29uc3R7Zm9jdXNJbmRleDplLGV4ZWN1dGlvbkRhdGE6bn09dDtyZXR1cm4gbnVsbD09PWV8fHZvaWQgMD09PW5bZV0/bnVsbDpuW2VdfSkpLHVYPVp3KE9aLHNYLG1YLGVYLCgodCxlLG4sbyk9Pntjb25zdHtjb2RlTG9jYXRpb25Gb2N1c1R5cGU6aX09dDtyZXR1cm4gbnVsbD09PWk/bnVsbDppPT09ZlouRVhFQ1VUSU9OP251bGw9PT1lfHxudWxsPT09bj9udWxsOntjb2RlTG9jYXRpb25UeXBlOmZaLkVYRUNVVElPTixvcFR5cGU6bi5vcF90eXBlLGV4ZWN1dGlvbkluZGV4OmV9Om51bGw9PT1vP251bGw6e2NvZGVMb2NhdGlvblR5cGU6ZlouR1JBUEhfT1BfQ1JFQVRJT04sb3BUeXBlOm8ub3BfdHlwZSxvcE5hbWU6by5vcF9uYW1lfX0pKSxmWD1adyhPWixnWiksZ1g9WncoT1osKHQ9PnQuc291cmNlQ29kZSkpLGhYPVp3KGdYLCh0PT50LnNvdXJjZUZpbGVMaXN0TG9hZGVkKSk7WncoZ1gsKHQ9PnQuc291cmNlRmlsZUxpc3QpKTtjb25zdCBiWD1adyhnWCwodD0+e2NvbnN0e3NvdXJjZUZpbGVMaXN0OmUsZm9jdXNMaW5lU3BlYzpufT10O3JldHVybiBudWxsPT09bj8tMTpoWihlLG4pfSkpLHlYPVp3KGdYLGJYLCgodCxlKT0+LTE9PT1lP251bGw6dC5maWxlQ29udGVudHNbZV18fG51bGwpKSxfWD1adyhPWiwodD0+dC5zb3VyY2VDb2RlLmZvY3VzTGluZVNwZWMpKSxDWD1adyhPWiwodD0+dC5zdGlja1RvQm90dG9tbW9zdEZyYW1lSW5Gb2N1c2VkRmlsZSkpLE1YPWZ1bmN0aW9uKHQpe3JldHVyblt0XX07ZnVuY3Rpb24gdlgodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDcpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUoKXtjb25zdCBuPWhpKHQpLiRpbXBsaWNpdDtyZXR1cm4gWW0oKS5vblRvZ2dsZUZvY3VzVHlwZS5lbWl0KG4udHlwZSl9KSksUm0oMSwiZGl2Iiw4KSxrdSgyKSxBbSgpLFJtKDMsImRpdiIsOSksa3UoNCksQW0oKSxUbSg1LCJkaXYiKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdCxuPVltKCk7RG0oIm5nQ2xhc3MiLE1oKDQsTVgsdC50eXBlPT09bi5mb2N1c1R5cGU/ImZvY3VzIjoiIikpLHJjKDIpLFN1KHQuZGlzcGxheU5hbWUpLHJjKDIpLEV1KCIgIix0LmRpc3BsYXlTeW1ib2wsIjogIix0LmNvdW50LCIgIil9fWNsYXNzIHhYe2NvbnN0cnVjdG9yKCl7dGhpcy5udW1BbGVydHM9MCx0aGlzLmFsZXJ0c0JyZWFrZG93bj1bXSx0aGlzLmZvY3VzVHlwZT1udWxsLHRoaXMub25Ub2dnbGVGb2N1c1R5cGU9bmV3IExofX14WC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8eFgpfSx4WC7JtWNtcD10byh7dHlwZTp4WCxzZWxlY3RvcnM6W1siYWxlcnRzLWNvbXBvbmVudCJdXSxpbnB1dHM6e251bUFsZXJ0czoibnVtQWxlcnRzIixhbGVydHNCcmVha2Rvd246ImFsZXJ0c0JyZWFrZG93biIsZm9jdXNUeXBlOiJmb2N1c1R5cGUifSxvdXRwdXRzOntvblRvZ2dsZUZvY3VzVHlwZToib25Ub2dnbGVGb2N1c1R5cGUifSxkZWNsczoxMCx2YXJzOjUsY29uc3RzOltbMSwiYWxlcnRzLWNvbnRhaW5lciJdLFsxLCJkZWJ1Z2dpbmctdGl0bGUiXSxbMSwibnVtLWFsZXJ0cy1jb250YWluZXIiXSxbMSwibnVtLWFsZXJ0cy1sYWJlbCJdLFsxLCJudW0tYWxlcnRzLXZhbHVlIiwzLCJuZ0NsYXNzIl0sWzEsImFsZXJ0cy1icmVha2Rvd24tY29udGFpbmVyIl0sWyJjbGFzcyIsImFsZXJ0cy1icmVha2Rvd24tdHlwZSIsMywibmdDbGFzcyIsImNsaWNrIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbMSwiYWxlcnRzLWJyZWFrZG93bi10eXBlIiwzLCJuZ0NsYXNzIiwiY2xpY2siXSxbMSwiYWxlcnQtdHlwZS1uYW1lIl0sWzEsImFsZXJ0LXR5cGUtY291bnQiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImRpdiIsMCksUm0oMSwiZGl2IiwxKSxrdSgyLCJEZWJ1Z2dpbmciKSxBbSgpLFJtKDMsImRpdiIsMiksUm0oNCwiZGl2IiwzKSxrdSg1LCJBbGVydHMiKSxBbSgpLFJtKDYsImRpdiIsNCksa3UoNyksQW0oKSxBbSgpLFJtKDgsImRpdiIsNSksUXAoOSx2WCw2LDYsImRpdiIsNiksQW0oKSxBbSgpKSwyJmUmJihyYyg2KSxEbSgibmdDbGFzcyIsTWgoMyxNWCxuLm51bUFsZXJ0cz4wPyJub24temVybyI6IiIpKSxyYygxKSxEdSgiICIsbi5udW1BbGVydHMsIiAiKSxyYygyKSxEbSgibmdGb3JPZiIsbi5hbGVydHNCcmVha2Rvd24pKX0sZGlyZWN0aXZlczpbYU0sbE1dLHN0eWxlczpbIi5hbGVydHMtYnJlYWtkb3duLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBmb250LXNpemU6IDEzcHg7XG4gIHBhZGRpbmc6IDEwcHggMTBweCAxMHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5hbGVydHMtYnJlYWtkb3duLXR5cGVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgYm9yZGVyLXJhZGl1czogMCAxMHB4IDEwcHggMDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBwYWRkaW5nOiA2cHggMCA2cHggNTBweDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLmFsZXJ0cy1icmVha2Rvd24tdHlwZS5mb2N1c1tfbmdjb250ZW50LSVDT01QJV0ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZlZWUwO1xufVxuXG4uYWxlcnRzLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBmb250LWZhbWlseTogJ1JvYm90bycsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7XG59XG5cbi5hbGVydC10eXBlLWNvdW50W19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTUyNTkyO1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIGNvbG9yOiAjZmZmO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBhZGRpbmc6IDNweDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICByaWdodDogMjBweDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLmFsZXJ0LXR5cGUtbmFtZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBhZGRpbmc6IDNweDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLmRlYnVnZ2luZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBmb250LXNpemU6IDE4cHg7XG59XG5cbi5udW0tYWxlcnRzLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgcGFkZGluZzogMTBweCAxMHB4IDEwcHggMzBweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4ubnVtLWFsZXJ0cy1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGZvbnQtc2l6ZTogMTNweDtcbn1cblxuLm51bS1hbGVydHMtdmFsdWVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250LXNpemU6IDEzcHg7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxpbmUtaGVpZ2h0OiAyNHB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHJpZ2h0OiAyMHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHdpZHRoOiAyNHB4O1xufVxuXG4ubnVtLWFsZXJ0cy12YWx1ZS5ub24temVyb1tfbmdjb250ZW50LSVDT01QJV0ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZiNzgwO1xuICBmb250LXdlaWdodDogYm9sZDtcbn0iXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoeFgsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiYWxlcnRzLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vYWxlcnRzX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyIuL2FsZXJ0c19jb21wb25lbnQuY3NzIl19XX1dLG51bGwse251bUFsZXJ0czpbe3R5cGU6eHl9XSxhbGVydHNCcmVha2Rvd246W3t0eXBlOnh5fV0sZm9jdXNUeXBlOlt7dHlwZTp4eX1dLG9uVG9nZ2xlRm9jdXNUeXBlOlt7dHlwZTpPeX1dfSk7Y29uc3QgT1g9e1t1Wi5GVU5DVElPTl9SRUNPTVBJTEVfQUxFUlRdOntkaXNwbGF5TmFtZToiRnVuY3Rpb24gcmVjb21waWxlcyIsZGlzcGxheVN5bWJvbDoiQyJ9LFt1Wi5JTkZfTkFOX0FMRVJUXTp7ZGlzcGxheU5hbWU6Ik5hTi/iiJ4iLGRpc3BsYXlTeW1ib2w6IuKIniJ9LFt1Wi5URU5TT1JfU0hBUEVfQUxFUlRdOntkaXNwbGF5TmFtZToiVGVuc29yIHNoYXBlIixkaXNwbGF5U3ltYm9sOiLilqAifX07Y2xhc3MgUFh7Y29uc3RydWN0b3IodCl7dGhpcy5zdG9yZT10LHRoaXMubnVtQWxlcnRzJD10aGlzLnN0b3JlLnBpcGUoRncoUlopKSx0aGlzLmFsZXJ0c0JyZWFrZG93biQ9dGhpcy5zdG9yZS5waXBlKEZ3KFp3KHpaLCh0PT57Y29uc3QgZT1PYmplY3Qua2V5cyh0KTtyZXR1cm4gZS5zb3J0KCksZS5tYXAoKGU9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7dHlwZTplfSxPWFtlXSkse2NvdW50OnRbZV19KSkpfSkpKSksdGhpcy5mb2N1c1R5cGUkPXRoaXMuc3RvcmUucGlwZShGdyhBWikpfW9uVG9nZ2xlRm9jdXNUeXBlKHQpe3RoaXMuc3RvcmUuZGlzcGF0Y2goQnEoe2FsZXJ0VHlwZTp0fSkpfX1QWC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8UFgpKFNtKEl3KSl9LFBYLsm1Y21wPXRvKHt0eXBlOlBYLHNlbGVjdG9yczpbWyJ0Zi1kZWJ1Z2dlci12Mi1hbGVydHMiXV0sZGVjbHM6NCx2YXJzOjksY29uc3RzOltbMywibnVtQWxlcnRzIiwiYWxlcnRzQnJlYWtkb3duIiwiZm9jdXNUeXBlIiwib25Ub2dnbGVGb2N1c1R5cGUiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImFsZXJ0cy1jb21wb25lbnQiLDApLFZtKCJvblRvZ2dsZUZvY3VzVHlwZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25Ub2dnbGVGb2N1c1R5cGUoZSl9KSksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQW0oKSksMiZlJiZEbSgibnVtQWxlcnRzIixUaCgxLDMsbi5udW1BbGVydHMkKSkoImFsZXJ0c0JyZWFrZG93biIsVGgoMiw1LG4uYWxlcnRzQnJlYWtkb3duJCkpKCJmb2N1c1R5cGUiLFRoKDMsNyxuLmZvY3VzVHlwZSQpKX0sZGlyZWN0aXZlczpbeFhdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChQWCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJ0Zi1kZWJ1Z2dlci12Mi1hbGVydHMiLHRlbXBsYXRlOidcbiAgICA8YWxlcnRzLWNvbXBvbmVudFxuICAgICAgW251bUFsZXJ0c109Im51bUFsZXJ0cyQgfCBhc3luYyJcbiAgICAgIFthbGVydHNCcmVha2Rvd25dPSJhbGVydHNCcmVha2Rvd24kIHwgYXN5bmMiXG4gICAgICBbZm9jdXNUeXBlXT0iZm9jdXNUeXBlJCB8IGFzeW5jIlxuICAgICAgKG9uVG9nZ2xlRm9jdXNUeXBlKT0ib25Ub2dnbGVGb2N1c1R5cGUoJGV2ZW50KSJcbiAgICA+XG4gICAgPC9hbGVydHMtY29tcG9uZW50PlxuICAnLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y29uc3Qgd1g9WyJzbGlkZXJXcmFwcGVyIl0sa1g9Tnooe3Bhc3NpdmU6ITF9KSxTWD17cHJvdmlkZTpJVix1c2VFeGlzdGluZzpxZSgoKCk9PlJYKSksbXVsdGk6ITB9O2NsYXNzIERYe31jb25zdCBFWD0kSShKSShLSShjbGFzc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl9lbGVtZW50UmVmPXR9fSksImFjY2VudCIpKTtjbGFzcyBSWCBleHRlbmRzIEVYe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIscyl7c3VwZXIodCksdGhpcy5fZm9jdXNNb25pdG9yPWUsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWY9bix0aGlzLl9kaXI9byx0aGlzLl9uZ1pvbmU9YSx0aGlzLl9hbmltYXRpb25Nb2RlPXMsdGhpcy5faW52ZXJ0PSExLHRoaXMuX21heD0xMDAsdGhpcy5fbWluPTAsdGhpcy5fc3RlcD0xLHRoaXMuX3RodW1iTGFiZWw9ITEsdGhpcy5fdGlja0ludGVydmFsPTAsdGhpcy5fdmFsdWU9bnVsbCx0aGlzLl92ZXJ0aWNhbD0hMSx0aGlzLmNoYW5nZT1uZXcgTGgsdGhpcy5pbnB1dD1uZXcgTGgsdGhpcy52YWx1ZUNoYW5nZT1uZXcgTGgsdGhpcy5vblRvdWNoZWQ9KCk9Pnt9LHRoaXMuX3BlcmNlbnQ9MCx0aGlzLl9pc1NsaWRpbmc9bnVsbCx0aGlzLl9pc0FjdGl2ZT0hMSx0aGlzLl90aWNrSW50ZXJ2YWxQZXJjZW50PTAsdGhpcy5fc2xpZGVyRGltZW5zaW9ucz1udWxsLHRoaXMuX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm49KCk9Pnt9LHRoaXMuX2RpckNoYW5nZVN1YnNjcmlwdGlvbj1tLkVNUFRZLHRoaXMuX3BvaW50ZXJEb3duPXQ9Pnt0aGlzLmRpc2FibGVkfHx0aGlzLl9pc1NsaWRpbmd8fCFBWCh0KSYmMCE9PXQuYnV0dG9ufHx0aGlzLl9uZ1pvbmUucnVuKCgoKT0+e3RoaXMuX3RvdWNoSWQ9QVgodCk/KGZ1bmN0aW9uIGUodCxuKXtmb3IobGV0IGU9MDtlPHQudG91Y2hlcy5sZW5ndGg7ZSsrKXtjb25zdCBvPXQudG91Y2hlc1tlXS50YXJnZXQ7aWYobj09PW98fG4uY29udGFpbnMobykpcmV0dXJuIHQudG91Y2hlc1tlXS5pZGVudGlmaWVyfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKSh0LHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk6dm9pZCAwO2NvbnN0IG49VFgodCx0aGlzLl90b3VjaElkKTtpZihuKXtjb25zdCBlPXRoaXMudmFsdWU7dGhpcy5faXNTbGlkaW5nPSJwb2ludGVyIix0aGlzLl9sYXN0UG9pbnRlckV2ZW50PXQsdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2ZvY3VzSG9zdEVsZW1lbnQoKSx0aGlzLl9vbk1vdXNlZW50ZXIoKSx0aGlzLl9iaW5kR2xvYmFsRXZlbnRzKHQpLHRoaXMuX2ZvY3VzSG9zdEVsZW1lbnQoKSx0aGlzLl91cGRhdGVWYWx1ZUZyb21Qb3NpdGlvbihuKSx0aGlzLl92YWx1ZU9uU2xpZGVTdGFydD1lLGUhPXRoaXMudmFsdWUmJnRoaXMuX2VtaXRJbnB1dEV2ZW50KCl9fSkpfSx0aGlzLl9wb2ludGVyTW92ZT10PT57aWYoInBvaW50ZXIiPT09dGhpcy5faXNTbGlkaW5nKXtjb25zdCBlPVRYKHQsdGhpcy5fdG91Y2hJZCk7aWYoZSl7dC5wcmV2ZW50RGVmYXVsdCgpO2NvbnN0IG49dGhpcy52YWx1ZTt0aGlzLl9sYXN0UG9pbnRlckV2ZW50PXQsdGhpcy5fdXBkYXRlVmFsdWVGcm9tUG9zaXRpb24oZSksbiE9dGhpcy52YWx1ZSYmdGhpcy5fZW1pdElucHV0RXZlbnQoKX19fSx0aGlzLl9wb2ludGVyVXA9dD0+eyJwb2ludGVyIj09PXRoaXMuX2lzU2xpZGluZyYmKEFYKHQpJiYibnVtYmVyIj09dHlwZW9mIHRoaXMuX3RvdWNoSWQmJiFOWCh0LmNoYW5nZWRUb3VjaGVzLHRoaXMuX3RvdWNoSWQpfHwodC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX3JlbW92ZUdsb2JhbEV2ZW50cygpLHRoaXMuX2lzU2xpZGluZz1udWxsLHRoaXMuX3RvdWNoSWQ9dm9pZCAwLHRoaXMuX3ZhbHVlT25TbGlkZVN0YXJ0PT10aGlzLnZhbHVlfHx0aGlzLmRpc2FibGVkfHx0aGlzLl9lbWl0Q2hhbmdlRXZlbnQoKSx0aGlzLl92YWx1ZU9uU2xpZGVTdGFydD10aGlzLl9sYXN0UG9pbnRlckV2ZW50PW51bGwpKX0sdGhpcy5fd2luZG93Qmx1cj0oKT0+e3RoaXMuX2xhc3RQb2ludGVyRXZlbnQmJnRoaXMuX3BvaW50ZXJVcCh0aGlzLl9sYXN0UG9pbnRlckV2ZW50KX0sdGhpcy5fZG9jdW1lbnQ9cix0aGlzLnRhYkluZGV4PXBhcnNlSW50KGkpfHwwLGEucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT57Y29uc3QgZT10Lm5hdGl2ZUVsZW1lbnQ7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuX3BvaW50ZXJEb3duLGtYKSxlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuX3BvaW50ZXJEb3duLGtYKX0pKX1nZXQgaW52ZXJ0KCl7cmV0dXJuIHRoaXMuX2ludmVydH1zZXQgaW52ZXJ0KHQpe3RoaXMuX2ludmVydD15eih0KX1nZXQgbWF4KCl7cmV0dXJuIHRoaXMuX21heH1zZXQgbWF4KHQpe3RoaXMuX21heD1feih0LHRoaXMuX21heCksdGhpcy5fcGVyY2VudD10aGlzLl9jYWxjdWxhdGVQZXJjZW50YWdlKHRoaXMuX3ZhbHVlKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX1nZXQgbWluKCl7cmV0dXJuIHRoaXMuX21pbn1zZXQgbWluKHQpe3RoaXMuX21pbj1feih0LHRoaXMuX21pbiksdGhpcy5fcGVyY2VudD10aGlzLl9jYWxjdWxhdGVQZXJjZW50YWdlKHRoaXMuX3ZhbHVlKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX1nZXQgc3RlcCgpe3JldHVybiB0aGlzLl9zdGVwfXNldCBzdGVwKHQpe3RoaXMuX3N0ZXA9X3oodCx0aGlzLl9zdGVwKSx0aGlzLl9zdGVwJTEhPTAmJih0aGlzLl9yb3VuZFRvRGVjaW1hbD10aGlzLl9zdGVwLnRvU3RyaW5nKCkuc3BsaXQoIi4iKS5wb3AoKS5sZW5ndGgpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfWdldCB0aHVtYkxhYmVsKCl7cmV0dXJuIHRoaXMuX3RodW1iTGFiZWx9c2V0IHRodW1iTGFiZWwodCl7dGhpcy5fdGh1bWJMYWJlbD15eih0KX1nZXQgdGlja0ludGVydmFsKCl7cmV0dXJuIHRoaXMuX3RpY2tJbnRlcnZhbH1zZXQgdGlja0ludGVydmFsKHQpe3RoaXMuX3RpY2tJbnRlcnZhbD0iYXV0byI9PT10PyJhdXRvIjoibnVtYmVyIj09dHlwZW9mIHR8fCJzdHJpbmciPT10eXBlb2YgdD9feih0LHRoaXMuX3RpY2tJbnRlcnZhbCk6MH1nZXQgdmFsdWUoKXtyZXR1cm4gbnVsbD09PXRoaXMuX3ZhbHVlJiYodGhpcy52YWx1ZT10aGlzLl9taW4pLHRoaXMuX3ZhbHVlfXNldCB2YWx1ZSh0KXtpZih0IT09dGhpcy5fdmFsdWUpe2xldCBlPV96KHQsMCk7dGhpcy5fcm91bmRUb0RlY2ltYWwmJmUhPT10aGlzLm1pbiYmZSE9PXRoaXMubWF4JiYoZT1wYXJzZUZsb2F0KGUudG9GaXhlZCh0aGlzLl9yb3VuZFRvRGVjaW1hbCkpKSx0aGlzLl92YWx1ZT1lLHRoaXMuX3BlcmNlbnQ9dGhpcy5fY2FsY3VsYXRlUGVyY2VudGFnZSh0aGlzLl92YWx1ZSksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9fWdldCB2ZXJ0aWNhbCgpe3JldHVybiB0aGlzLl92ZXJ0aWNhbH1zZXQgdmVydGljYWwodCl7dGhpcy5fdmVydGljYWw9eXoodCl9Z2V0IGRpc3BsYXlWYWx1ZSgpe3JldHVybiB0aGlzLmRpc3BsYXlXaXRoP3RoaXMuZGlzcGxheVdpdGgodGhpcy52YWx1ZSk6dGhpcy5fcm91bmRUb0RlY2ltYWwmJnRoaXMudmFsdWUmJnRoaXMudmFsdWUlMSE9MD90aGlzLnZhbHVlLnRvRml4ZWQodGhpcy5fcm91bmRUb0RlY2ltYWwpOnRoaXMudmFsdWV8fDB9Zm9jdXModCl7dGhpcy5fZm9jdXNIb3N0RWxlbWVudCh0KX1ibHVyKCl7dGhpcy5fYmx1ckhvc3RFbGVtZW50KCl9Z2V0IHBlcmNlbnQoKXtyZXR1cm4gdGhpcy5fY2xhbXAodGhpcy5fcGVyY2VudCl9X3Nob3VsZEludmVydEF4aXMoKXtyZXR1cm4gdGhpcy52ZXJ0aWNhbD8hdGhpcy5pbnZlcnQ6dGhpcy5pbnZlcnR9X2lzTWluVmFsdWUoKXtyZXR1cm4gMD09PXRoaXMucGVyY2VudH1fZ2V0VGh1bWJHYXAoKXtyZXR1cm4gdGhpcy5kaXNhYmxlZD83OnRoaXMuX2lzTWluVmFsdWUoKSYmIXRoaXMudGh1bWJMYWJlbD90aGlzLl9pc0FjdGl2ZT8xMDo3OjB9X2dldFRyYWNrQmFja2dyb3VuZFN0eWxlcygpe2NvbnN0IHQ9dGhpcy52ZXJ0aWNhbD9gMSwgJHsxLXRoaXMucGVyY2VudH0sIDFgOjEtdGhpcy5wZXJjZW50KyIsIDEsIDEiO3JldHVybnt0cmFuc2Zvcm06YHRyYW5zbGF0ZSR7dGhpcy52ZXJ0aWNhbD8iWSI6IlgifSgke3RoaXMuX3Nob3VsZEludmVydE1vdXNlQ29vcmRzKCk/Ii0iOiIifSR7dGhpcy5fZ2V0VGh1bWJHYXAoKX1weCkgc2NhbGUzZCgke3R9KWB9fV9nZXRUcmFja0ZpbGxTdHlsZXMoKXtjb25zdCB0PXRoaXMucGVyY2VudCxlPXRoaXMudmVydGljYWw/YDEsICR7dH0sIDFgOmAke3R9LCAxLCAxYDtyZXR1cm57dHJhbnNmb3JtOmB0cmFuc2xhdGUke3RoaXMudmVydGljYWw/IlkiOiJYIn0oJHt0aGlzLl9zaG91bGRJbnZlcnRNb3VzZUNvb3JkcygpPyIiOiItIn0ke3RoaXMuX2dldFRodW1iR2FwKCl9cHgpIHNjYWxlM2QoJHtlfSlgLGRpc3BsYXk6MD09PXQ/Im5vbmUiOiIifX1fZ2V0VGlja3NDb250YWluZXJTdHlsZXMoKXtyZXR1cm57dHJhbnNmb3JtOmB0cmFuc2xhdGUke3RoaXMudmVydGljYWw/IlkiOiJYIn0oJHt0aGlzLnZlcnRpY2FsfHwicnRsIiE9dGhpcy5fZ2V0RGlyZWN0aW9uKCk/Ii0iOiIifSR7dGhpcy5fdGlja0ludGVydmFsUGVyY2VudC8yKjEwMH0lKWB9fV9nZXRUaWNrc1N0eWxlcygpe2xldCB0PTEwMCp0aGlzLl90aWNrSW50ZXJ2YWxQZXJjZW50LGU9e2JhY2tncm91bmRTaXplOnRoaXMudmVydGljYWw/YDJweCAke3R9JWA6YCR7dH0lIDJweGAsdHJhbnNmb3JtOmB0cmFuc2xhdGVaKDApIHRyYW5zbGF0ZSR7dGhpcy52ZXJ0aWNhbD8iWSI6IlgifSgke3RoaXMudmVydGljYWx8fCJydGwiIT10aGlzLl9nZXREaXJlY3Rpb24oKT8iIjoiLSJ9JHt0LzJ9JSkke3RoaXMudmVydGljYWx8fCJydGwiIT10aGlzLl9nZXREaXJlY3Rpb24oKT8iIjoiIHJvdGF0ZSgxODBkZWcpIn1gfTtpZih0aGlzLl9pc01pblZhbHVlKCkmJnRoaXMuX2dldFRodW1iR2FwKCkpe2NvbnN0IHQ9dGhpcy5fc2hvdWxkSW52ZXJ0QXhpcygpO2xldCBuO249dGhpcy52ZXJ0aWNhbD90PyJCb3R0b20iOiJUb3AiOnQ/IlJpZ2h0IjoiTGVmdCIsZVtgcGFkZGluZyR7bn1gXT1gJHt0aGlzLl9nZXRUaHVtYkdhcCgpfXB4YH1yZXR1cm4gZX1fZ2V0VGh1bWJDb250YWluZXJTdHlsZXMoKXtjb25zdCB0PXRoaXMuX3Nob3VsZEludmVydEF4aXMoKTtyZXR1cm57dHJhbnNmb3JtOmB0cmFuc2xhdGUke3RoaXMudmVydGljYWw/IlkiOiJYIn0oLSR7MTAwKigoInJ0bCIhPXRoaXMuX2dldERpcmVjdGlvbigpfHx0aGlzLnZlcnRpY2FsP3Q6IXQpP3RoaXMucGVyY2VudDoxLXRoaXMucGVyY2VudCl9JSlgfX1fc2hvdWxkSW52ZXJ0TW91c2VDb29yZHMoKXtjb25zdCB0PXRoaXMuX3Nob3VsZEludmVydEF4aXMoKTtyZXR1cm4icnRsIiE9dGhpcy5fZ2V0RGlyZWN0aW9uKCl8fHRoaXMudmVydGljYWw/dDohdH1fZ2V0RGlyZWN0aW9uKCl7cmV0dXJuIHRoaXMuX2RpciYmInJ0bCI9PXRoaXMuX2Rpci52YWx1ZT8icnRsIjoibHRyIn1uZ0FmdGVyVmlld0luaXQoKXt0aGlzLl9mb2N1c01vbml0b3IubW9uaXRvcih0aGlzLl9lbGVtZW50UmVmLCEwKS5zdWJzY3JpYmUoKHQ9Pnt0aGlzLl9pc0FjdGl2ZT0hIXQmJiJrZXlib2FyZCIhPT10LHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKX0pKSx0aGlzLl9kaXImJih0aGlzLl9kaXJDaGFuZ2VTdWJzY3JpcHRpb249dGhpcy5fZGlyLmNoYW5nZS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9KSkpfW5nT25EZXN0cm95KCl7Y29uc3QgdD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7dC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuX3BvaW50ZXJEb3duLGtYKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuX3BvaW50ZXJEb3duLGtYKSx0aGlzLl9sYXN0UG9pbnRlckV2ZW50PW51bGwsdGhpcy5fcmVtb3ZlR2xvYmFsRXZlbnRzKCksdGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKHRoaXMuX2VsZW1lbnRSZWYpLHRoaXMuX2RpckNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpfV9vbk1vdXNlZW50ZXIoKXt0aGlzLmRpc2FibGVkfHwodGhpcy5fc2xpZGVyRGltZW5zaW9ucz10aGlzLl9nZXRTbGlkZXJEaW1lbnNpb25zKCksdGhpcy5fdXBkYXRlVGlja0ludGVydmFsUGVyY2VudCgpKX1fb25Gb2N1cygpe3RoaXMuX3NsaWRlckRpbWVuc2lvbnM9dGhpcy5fZ2V0U2xpZGVyRGltZW5zaW9ucygpLHRoaXMuX3VwZGF0ZVRpY2tJbnRlcnZhbFBlcmNlbnQoKX1fb25CbHVyKCl7dGhpcy5vblRvdWNoZWQoKX1fb25LZXlkb3duKHQpe2lmKHRoaXMuZGlzYWJsZWR8fGJ6KHQpfHx0aGlzLl9pc1NsaWRpbmcmJiJrZXlib2FyZCIhPT10aGlzLl9pc1NsaWRpbmcpcmV0dXJuO2NvbnN0IGU9dGhpcy52YWx1ZTtzd2l0Y2godC5rZXlDb2RlKXtjYXNlIDMzOnRoaXMuX2luY3JlbWVudCgxMCk7YnJlYWs7Y2FzZSAzNDp0aGlzLl9pbmNyZW1lbnQoLTEwKTticmVhaztjYXNlIDM1OnRoaXMudmFsdWU9dGhpcy5tYXg7YnJlYWs7Y2FzZSAzNjp0aGlzLnZhbHVlPXRoaXMubWluO2JyZWFrO2Nhc2UgMzc6dGhpcy5faW5jcmVtZW50KCJydGwiPT10aGlzLl9nZXREaXJlY3Rpb24oKT8xOi0xKTticmVhaztjYXNlIGd6OnRoaXMuX2luY3JlbWVudCgxKTticmVhaztjYXNlIDM5OnRoaXMuX2luY3JlbWVudCgicnRsIj09dGhpcy5fZ2V0RGlyZWN0aW9uKCk/LTE6MSk7YnJlYWs7Y2FzZSBoejp0aGlzLl9pbmNyZW1lbnQoLTEpO2JyZWFrO2RlZmF1bHQ6cmV0dXJufWUhPXRoaXMudmFsdWUmJih0aGlzLl9lbWl0SW5wdXRFdmVudCgpLHRoaXMuX2VtaXRDaGFuZ2VFdmVudCgpKSx0aGlzLl9pc1NsaWRpbmc9ImtleWJvYXJkIix0LnByZXZlbnREZWZhdWx0KCl9X29uS2V5dXAoKXsia2V5Ym9hcmQiPT09dGhpcy5faXNTbGlkaW5nJiYodGhpcy5faXNTbGlkaW5nPW51bGwpfV9nZXRXaW5kb3coKXtyZXR1cm4gdGhpcy5fZG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvd31fYmluZEdsb2JhbEV2ZW50cyh0KXtjb25zdCBlPXRoaXMuX2RvY3VtZW50LG49QVgodCksbz1uPyJ0b3VjaGVuZCI6Im1vdXNldXAiO2UuYWRkRXZlbnRMaXN0ZW5lcihuPyJ0b3VjaG1vdmUiOiJtb3VzZW1vdmUiLHRoaXMuX3BvaW50ZXJNb3ZlLGtYKSxlLmFkZEV2ZW50TGlzdGVuZXIobyx0aGlzLl9wb2ludGVyVXAsa1gpLG4mJmUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hjYW5jZWwiLHRoaXMuX3BvaW50ZXJVcCxrWCk7Y29uc3QgaT10aGlzLl9nZXRXaW5kb3coKTt2b2lkIDAhPT1pJiZpJiZpLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLHRoaXMuX3dpbmRvd0JsdXIpfV9yZW1vdmVHbG9iYWxFdmVudHMoKXtjb25zdCB0PXRoaXMuX2RvY3VtZW50O3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0aGlzLl9wb2ludGVyTW92ZSxrWCksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0aGlzLl9wb2ludGVyVXAsa1gpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIix0aGlzLl9wb2ludGVyTW92ZSxrWCksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsdGhpcy5fcG9pbnRlclVwLGtYKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoY2FuY2VsIix0aGlzLl9wb2ludGVyVXAsa1gpO2NvbnN0IGU9dGhpcy5fZ2V0V2luZG93KCk7dm9pZCAwIT09ZSYmZSYmZS5yZW1vdmVFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl93aW5kb3dCbHVyKX1faW5jcmVtZW50KHQpe3RoaXMudmFsdWU9dGhpcy5fY2xhbXAoKHRoaXMudmFsdWV8fDApK3RoaXMuc3RlcCp0LHRoaXMubWluLHRoaXMubWF4KX1fdXBkYXRlVmFsdWVGcm9tUG9zaXRpb24odCl7aWYoIXRoaXMuX3NsaWRlckRpbWVuc2lvbnMpcmV0dXJuO2xldCBlPXRoaXMuX2NsYW1wKCgodGhpcy52ZXJ0aWNhbD90Lnk6dC54KS0odGhpcy52ZXJ0aWNhbD90aGlzLl9zbGlkZXJEaW1lbnNpb25zLnRvcDp0aGlzLl9zbGlkZXJEaW1lbnNpb25zLmxlZnQpKS8odGhpcy52ZXJ0aWNhbD90aGlzLl9zbGlkZXJEaW1lbnNpb25zLmhlaWdodDp0aGlzLl9zbGlkZXJEaW1lbnNpb25zLndpZHRoKSk7aWYodGhpcy5fc2hvdWxkSW52ZXJ0TW91c2VDb29yZHMoKSYmKGU9MS1lKSwwPT09ZSl0aGlzLnZhbHVlPXRoaXMubWluO2Vsc2UgaWYoMT09PWUpdGhpcy52YWx1ZT10aGlzLm1heDtlbHNle2NvbnN0IHQ9dGhpcy5fY2FsY3VsYXRlVmFsdWUoZSksbj1NYXRoLnJvdW5kKCh0LXRoaXMubWluKS90aGlzLnN0ZXApKnRoaXMuc3RlcCt0aGlzLm1pbjt0aGlzLnZhbHVlPXRoaXMuX2NsYW1wKG4sdGhpcy5taW4sdGhpcy5tYXgpfX1fZW1pdENoYW5nZUV2ZW50KCl7dGhpcy5fY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbih0aGlzLnZhbHVlKSx0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSksdGhpcy5jaGFuZ2UuZW1pdCh0aGlzLl9jcmVhdGVDaGFuZ2VFdmVudCgpKX1fZW1pdElucHV0RXZlbnQoKXt0aGlzLmlucHV0LmVtaXQodGhpcy5fY3JlYXRlQ2hhbmdlRXZlbnQoKSl9X3VwZGF0ZVRpY2tJbnRlcnZhbFBlcmNlbnQoKXtpZih0aGlzLnRpY2tJbnRlcnZhbCYmdGhpcy5fc2xpZGVyRGltZW5zaW9ucylpZigiYXV0byI9PXRoaXMudGlja0ludGVydmFsKXtsZXQgdD10aGlzLnZlcnRpY2FsP3RoaXMuX3NsaWRlckRpbWVuc2lvbnMuaGVpZ2h0OnRoaXMuX3NsaWRlckRpbWVuc2lvbnMud2lkdGgsZT1NYXRoLmNlaWwoMzAvKHQqdGhpcy5zdGVwLyh0aGlzLm1heC10aGlzLm1pbikpKTt0aGlzLl90aWNrSW50ZXJ2YWxQZXJjZW50PWUqdGhpcy5zdGVwL3R9ZWxzZSB0aGlzLl90aWNrSW50ZXJ2YWxQZXJjZW50PXRoaXMudGlja0ludGVydmFsKnRoaXMuc3RlcC8odGhpcy5tYXgtdGhpcy5taW4pfV9jcmVhdGVDaGFuZ2VFdmVudCh0PXRoaXMudmFsdWUpe2xldCBlPW5ldyBEWDtyZXR1cm4gZS5zb3VyY2U9dGhpcyxlLnZhbHVlPXQsZX1fY2FsY3VsYXRlUGVyY2VudGFnZSh0KXtyZXR1cm4oKHR8fDApLXRoaXMubWluKS8odGhpcy5tYXgtdGhpcy5taW4pfV9jYWxjdWxhdGVWYWx1ZSh0KXtyZXR1cm4gdGhpcy5taW4rdCoodGhpcy5tYXgtdGhpcy5taW4pfV9jbGFtcCh0LGU9MCxuPTEpe3JldHVybiBNYXRoLm1heChlLE1hdGgubWluKHQsbikpfV9nZXRTbGlkZXJEaW1lbnNpb25zKCl7cmV0dXJuIHRoaXMuX3NsaWRlcldyYXBwZXI/dGhpcy5fc2xpZGVyV3JhcHBlci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOm51bGx9X2ZvY3VzSG9zdEVsZW1lbnQodCl7dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKHQpfV9ibHVySG9zdEVsZW1lbnQoKXt0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYmx1cigpfXdyaXRlVmFsdWUodCl7dGhpcy52YWx1ZT10fXJlZ2lzdGVyT25DaGFuZ2UodCl7dGhpcy5fY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbj10fXJlZ2lzdGVyT25Ub3VjaGVkKHQpe3RoaXMub25Ub3VjaGVkPXR9c2V0RGlzYWJsZWRTdGF0ZSh0KXt0aGlzLmRpc2FibGVkPXR9fWZ1bmN0aW9uIEFYKHQpe3JldHVybiJ0Ij09PXQudHlwZVswXX1mdW5jdGlvbiBUWCh0LGUpe2xldCBuO3JldHVybiBuPUFYKHQpPyJudW1iZXIiPT10eXBlb2YgZT9OWCh0LnRvdWNoZXMsZSl8fE5YKHQuY2hhbmdlZFRvdWNoZXMsZSk6dC50b3VjaGVzWzBdfHx0LmNoYW5nZWRUb3VjaGVzWzBdOnQsbj97eDpuLmNsaWVudFgseTpuLmNsaWVudFl9OnZvaWQgMH1mdW5jdGlvbiBOWCh0LGUpe2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKWlmKHRbbl0uaWRlbnRpZmllcj09PWUpcmV0dXJuIHRbbl19UlguybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFJYKShTbShoZyksU20oU0kpLFNtKFVnKSxTbShISSw4KSxOYSgidGFiaW5kZXgiKSxTbShhXyksU20oWl8pLFNtKFZQLDgpKX0sUlguybVjbXA9dG8oe3R5cGU6Ulgsc2VsZWN0b3JzOltbIm1hdC1zbGlkZXIiXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJlFoKHdYLDUpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uX3NsaWRlcldyYXBwZXI9dC5maXJzdCl9fSxob3N0QXR0cnM6WyJyb2xlIiwic2xpZGVyIiwxLCJtYXQtc2xpZGVyIiwibWF0LWZvY3VzLWluZGljYXRvciJdLGhvc3RWYXJzOjI5LGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgiZm9jdXMiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX29uRm9jdXMoKX0pKSgiYmx1ciIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5fb25CbHVyKCl9KSkoImtleWRvd24iLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9vbktleWRvd24oZSl9KSkoImtleXVwIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9vbktleXVwKCl9KSkoIm1vdXNlZW50ZXIiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX29uTW91c2VlbnRlcigpfSkpKCJzZWxlY3RzdGFydCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIGUucHJldmVudERlZmF1bHQoKX0pKSwyJmUmJihUdSgidGFiSW5kZXgiLG4udGFiSW5kZXgpLGpwKCJhcmlhLWRpc2FibGVkIixuLmRpc2FibGVkKSgiYXJpYS12YWx1ZW1heCIsbi5tYXgpKCJhcmlhLXZhbHVlbWluIixuLm1pbikoImFyaWEtdmFsdWVub3ciLG4udmFsdWUpKCJhcmlhLXZhbHVldGV4dCIsbnVsbD09bi52YWx1ZVRleHQ/bi5kaXNwbGF5VmFsdWU6bi52YWx1ZVRleHQpKCJhcmlhLW9yaWVudGF0aW9uIixuLnZlcnRpY2FsPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwiKSxwdSgibWF0LXNsaWRlci1kaXNhYmxlZCIsbi5kaXNhYmxlZCkoIm1hdC1zbGlkZXItaGFzLXRpY2tzIixuLnRpY2tJbnRlcnZhbCkoIm1hdC1zbGlkZXItaG9yaXpvbnRhbCIsIW4udmVydGljYWwpKCJtYXQtc2xpZGVyLWF4aXMtaW52ZXJ0ZWQiLG4uX3Nob3VsZEludmVydEF4aXMoKSkoIm1hdC1zbGlkZXItaW52ZXJ0LW1vdXNlLWNvb3JkcyIsbi5fc2hvdWxkSW52ZXJ0TW91c2VDb29yZHMoKSkoIm1hdC1zbGlkZXItc2xpZGluZyIsbi5faXNTbGlkaW5nKSgibWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nIixuLnRodW1iTGFiZWwpKCJtYXQtc2xpZGVyLXZlcnRpY2FsIixuLnZlcnRpY2FsKSgibWF0LXNsaWRlci1taW4tdmFsdWUiLG4uX2lzTWluVmFsdWUoKSkoIm1hdC1zbGlkZXItaGlkZS1sYXN0LXRpY2siLG4uZGlzYWJsZWR8fG4uX2lzTWluVmFsdWUoKSYmbi5fZ2V0VGh1bWJHYXAoKSYmbi5fc2hvdWxkSW52ZXJ0QXhpcygpKSgiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLCJOb29wQW5pbWF0aW9ucyI9PT1uLl9hbmltYXRpb25Nb2RlKSl9LGlucHV0czp7ZGlzYWJsZWQ6ImRpc2FibGVkIixjb2xvcjoiY29sb3IiLHRhYkluZGV4OiJ0YWJJbmRleCIsaW52ZXJ0OiJpbnZlcnQiLG1heDoibWF4IixtaW46Im1pbiIsc3RlcDoic3RlcCIsdGh1bWJMYWJlbDoidGh1bWJMYWJlbCIsdGlja0ludGVydmFsOiJ0aWNrSW50ZXJ2YWwiLHZhbHVlOiJ2YWx1ZSIsdmVydGljYWw6InZlcnRpY2FsIixkaXNwbGF5V2l0aDoiZGlzcGxheVdpdGgiLHZhbHVlVGV4dDoidmFsdWVUZXh0In0sb3V0cHV0czp7Y2hhbmdlOiJjaGFuZ2UiLGlucHV0OiJpbnB1dCIsdmFsdWVDaGFuZ2U6InZhbHVlQ2hhbmdlIn0sZXhwb3J0QXM6WyJtYXRTbGlkZXIiXSxmZWF0dXJlczpbcGcoW1NYXSkseHBdLGRlY2xzOjEzLHZhcnM6Nixjb25zdHM6W1sxLCJtYXQtc2xpZGVyLXdyYXBwZXIiXSxbInNsaWRlcldyYXBwZXIiLCIiXSxbMSwibWF0LXNsaWRlci10cmFjay13cmFwcGVyIl0sWzEsIm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCIsMywibmdTdHlsZSJdLFsxLCJtYXQtc2xpZGVyLXRyYWNrLWZpbGwiLDMsIm5nU3R5bGUiXSxbMSwibWF0LXNsaWRlci10aWNrcy1jb250YWluZXIiLDMsIm5nU3R5bGUiXSxbMSwibWF0LXNsaWRlci10aWNrcyIsMywibmdTdHlsZSJdLFsxLCJtYXQtc2xpZGVyLXRodW1iLWNvbnRhaW5lciIsMywibmdTdHlsZSJdLFsxLCJtYXQtc2xpZGVyLWZvY3VzLXJpbmciXSxbMSwibWF0LXNsaWRlci10aHVtYiJdLFsxLCJtYXQtc2xpZGVyLXRodW1iLWxhYmVsIl0sWzEsIm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiZGl2IiwwLDEpLFJtKDIsImRpdiIsMiksVG0oMywiZGl2IiwzKSxUbSg0LCJkaXYiLDQpLEFtKCksUm0oNSwiZGl2Iiw1KSxUbSg2LCJkaXYiLDYpLEFtKCksUm0oNywiZGl2Iiw3KSxUbSg4LCJkaXYiLDgpLFRtKDksImRpdiIsOSksUm0oMTAsImRpdiIsMTApLFJtKDExLCJzcGFuIiwxMSksa3UoMTIpLEFtKCksQW0oKSxBbSgpLEFtKCkpLDImZSYmKHJjKDMpLERtKCJuZ1N0eWxlIixuLl9nZXRUcmFja0JhY2tncm91bmRTdHlsZXMoKSkscmMoMSksRG0oIm5nU3R5bGUiLG4uX2dldFRyYWNrRmlsbFN0eWxlcygpKSxyYygxKSxEbSgibmdTdHlsZSIsbi5fZ2V0VGlja3NDb250YWluZXJTdHlsZXMoKSkscmMoMSksRG0oIm5nU3R5bGUiLG4uX2dldFRpY2tzU3R5bGVzKCkpLHJjKDEpLERtKCJuZ1N0eWxlIixuLl9nZXRUaHVtYkNvbnRhaW5lclN0eWxlcygpKSxyYyg1KSxTdShuLmRpc3BsYXlWYWx1ZSkpfSxkaXJlY3RpdmVzOltDTV0sc3R5bGVzOlsnLm1hdC1zbGlkZXJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246cmVsYXRpdmU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O291dGxpbmU6bm9uZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Lm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKTphY3RpdmUsLm1hdC1zbGlkZXIubWF0LXNsaWRlci1zbGlkaW5nOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCl7Y3Vyc29yOi13ZWJraXQtZ3JhYmJpbmc7Y3Vyc29yOmdyYWJiaW5nfS5tYXQtc2xpZGVyLXdyYXBwZXJ7LXdlYmtpdC1wcmludC1jb2xvci1hZGp1c3Q6ZXhhY3Q7Y29sb3ItYWRqdXN0OmV4YWN0O3Bvc2l0aW9uOmFic29sdXRlfS5tYXQtc2xpZGVyLXRyYWNrLXdyYXBwZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO292ZXJmbG93OmhpZGRlbn0ubWF0LXNsaWRlci10cmFjay1maWxse3Bvc2l0aW9uOmFic29sdXRlO3RyYW5zZm9ybS1vcmlnaW46MCAwO3RyYW5zaXRpb246dHJhbnNmb3JtIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJhY2tncm91bmQtY29sb3IgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtwb3NpdGlvbjphYnNvbHV0ZTt0cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMTAwJTt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxiYWNrZ3JvdW5kLWNvbG9yIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtc2xpZGVyLXRpY2tzLWNvbnRhaW5lcntwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dG9wOjA7b3ZlcmZsb3c6aGlkZGVufS5tYXQtc2xpZGVyLXRpY2tzey13ZWJraXQtYmFja2dyb3VuZC1jbGlwOmNvbnRlbnQtYm94O2JhY2tncm91bmQtY2xpcDpjb250ZW50LWJveDtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQ7Ym94LXNpemluZzpib3JkZXItYm94O29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1zbGlkZXItdGh1bWItY29udGFpbmVye3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LXNsaWRlci1mb2N1cy1yaW5ne3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjMwcHg7aGVpZ2h0OjMwcHg7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNmb3JtOnNjYWxlKDApO29wYWNpdHk6MDt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxiYWNrZ3JvdW5kLWNvbG9yIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLG9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1zbGlkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1zbGlkZXItZm9jdXMtcmluZywubWF0LXNsaWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7dHJhbnNmb3JtOnNjYWxlKDEpO29wYWNpdHk6MX0ubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpOm5vdCgubWF0LXNsaWRlci1zbGlkaW5nKSAubWF0LXNsaWRlci10aHVtYi1sYWJlbCwubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpOm5vdCgubWF0LXNsaWRlci1zbGlkaW5nKSAubWF0LXNsaWRlci10aHVtYntjdXJzb3I6LXdlYmtpdC1ncmFiO2N1cnNvcjpncmFifS5tYXQtc2xpZGVyLXRodW1ie3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0Oi0xMHB4O2JvdHRvbTotMTBweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7d2lkdGg6MjBweDtoZWlnaHQ6MjBweDtib3JkZXI6M3B4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zZm9ybTpzY2FsZSgwLjcpO3RyYW5zaXRpb246dHJhbnNmb3JtIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJhY2tncm91bmQtY29sb3IgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYm9yZGVyLWNvbG9yIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2Rpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoyOHB4O2hlaWdodDoyOHB4O2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zaXRpb246dHJhbnNmb3JtIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJvcmRlci1yYWRpdXMgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYmFja2dyb3VuZC1jb2xvciA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse291dGxpbmU6c29saWQgMXB4fS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7ei1pbmRleDoxO29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1zbGlkZXItc2xpZGluZyAubWF0LXNsaWRlci10cmFjay1maWxsLC5tYXQtc2xpZGVyLXNsaWRpbmcgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCwubWF0LXNsaWRlci1zbGlkaW5nIC5tYXQtc2xpZGVyLXRodW1iLWNvbnRhaW5lcnt0cmFuc2l0aW9uLWR1cmF0aW9uOjBtc30ubWF0LXNsaWRlci1oYXMtdGlja3MgLm1hdC1zbGlkZXItd3JhcHBlcjo6YWZ0ZXJ7Y29udGVudDoiIjtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItd2lkdGg6MDtib3JkZXItc3R5bGU6c29saWQ7b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LXNsaWRlci1oYXMtdGlja3MuY2RrLWZvY3VzZWQ6bm90KC5tYXQtc2xpZGVyLWhpZGUtbGFzdC10aWNrKSAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlciwubWF0LXNsaWRlci1oYXMtdGlja3M6aG92ZXI6bm90KC5tYXQtc2xpZGVyLWhpZGUtbGFzdC10aWNrKSAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlcntvcGFjaXR5OjF9Lm1hdC1zbGlkZXItaGFzLXRpY2tzLmNkay1mb2N1c2VkOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCkgLm1hdC1zbGlkZXItdGlja3MsLm1hdC1zbGlkZXItaGFzLXRpY2tzOmhvdmVyOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCkgLm1hdC1zbGlkZXItdGlja3N7b3BhY2l0eToxfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcgLm1hdC1zbGlkZXItZm9jdXMtcmluZ3tkaXNwbGF5Om5vbmV9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtkaXNwbGF5OmZsZXh9Lm1hdC1zbGlkZXItYXhpcy1pbnZlcnRlZCAubWF0LXNsaWRlci10cmFjay1maWxse3RyYW5zZm9ybS1vcmlnaW46MTAwJSAxMDAlfS5tYXQtc2xpZGVyLWF4aXMtaW52ZXJ0ZWQgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHt0cmFuc2Zvcm0tb3JpZ2luOjAgMH0ubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpLmNkay1mb2N1c2VkLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyAubWF0LXNsaWRlci10aHVtYnt0cmFuc2Zvcm06c2NhbGUoMCl9Lm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKS5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtib3JkZXItcmFkaXVzOjUwJSA1MCUgMH0ubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7b3BhY2l0eToxfS5tYXQtc2xpZGVyOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCkuY2RrLW1vdXNlLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKS5jZGstdG91Y2gtZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYiwubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWJ7Ym9yZGVyLXdpZHRoOjJweDt0cmFuc2Zvcm06c2NhbGUoMSl9Lm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItZm9jdXMtcmluZ3t0cmFuc2Zvcm06c2NhbGUoMCk7b3BhY2l0eTowfS5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRodW1ie2JvcmRlci13aWR0aDo0cHg7dHJhbnNmb3JtOnNjYWxlKDAuNSl9Lm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7ZGlzcGxheTpub25lfS5tYXQtc2xpZGVyLWhvcml6b250YWx7aGVpZ2h0OjQ4cHg7bWluLXdpZHRoOjEyOHB4fS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItd3JhcHBlcntoZWlnaHQ6MnB4O3RvcDoyM3B4O2xlZnQ6OHB4O3JpZ2h0OjhweH0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVye2hlaWdodDoycHg7Ym9yZGVyLWxlZnQtd2lkdGg6MnB4O3JpZ2h0OjA7dG9wOjB9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10cmFjay13cmFwcGVye2hlaWdodDoycHg7d2lkdGg6MTAwJX0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGx7aGVpZ2h0OjJweDt3aWR0aDoxMDAlO3RyYW5zZm9ybTpzY2FsZVgoMCl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2hlaWdodDoycHg7d2lkdGg6MTAwJTt0cmFuc2Zvcm06c2NhbGVYKDEpfS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdGlja3MtY29udGFpbmVye2hlaWdodDoycHg7d2lkdGg6MTAwJX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdGlja3MtY29udGFpbmVye2hlaWdodDowO291dGxpbmU6c29saWQgMnB4O3RvcDoxcHh9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aWNrc3toZWlnaHQ6MnB4O3dpZHRoOjEwMCV9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aHVtYi1jb250YWluZXJ7d2lkdGg6MTAwJTtoZWlnaHQ6MDt0b3A6NTAlfS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItZm9jdXMtcmluZ3t0b3A6LTE1cHg7cmlnaHQ6LTE1cHh9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtyaWdodDotMTRweDt0b3A6LTQwcHg7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMjZweCkgc2NhbGUoMC4wMSkgcm90YXRlKDQ1ZGVnKX0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfS5tYXQtc2xpZGVyLWhvcml6b250YWwuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNsaWRlci1ob3Jpem9udGFsLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zbGlkZXItaG9yaXpvbnRhbC5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e3RyYW5zZm9ybTpub25lfS5tYXQtc2xpZGVyLXZlcnRpY2Fse3dpZHRoOjQ4cHg7bWluLWhlaWdodDoxMjhweH0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci13cmFwcGVye3dpZHRoOjJweDt0b3A6OHB4O2JvdHRvbTo4cHg7bGVmdDoyM3B4fS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVye3dpZHRoOjJweDtib3JkZXItdG9wLXdpZHRoOjJweDtib3R0b206MDtsZWZ0OjB9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdHJhY2std3JhcHBlcntoZWlnaHQ6MTAwJTt3aWR0aDoycHh9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdHJhY2stZmlsbHtoZWlnaHQ6MTAwJTt3aWR0aDoycHg7dHJhbnNmb3JtOnNjYWxlWSgwKX0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2hlaWdodDoxMDAlO3dpZHRoOjJweDt0cmFuc2Zvcm06c2NhbGVZKDEpfS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRpY2tzLWNvbnRhaW5lcnt3aWR0aDoycHg7aGVpZ2h0OjEwMCV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aWNrcy1jb250YWluZXJ7d2lkdGg6MDtvdXRsaW5lOnNvbGlkIDJweDtsZWZ0OjFweH0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci1mb2N1cy1yaW5ne2JvdHRvbTotMTVweDtsZWZ0Oi0xNXB4fS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRpY2tze3dpZHRoOjJweDtoZWlnaHQ6MTAwJX0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aHVtYi1jb250YWluZXJ7aGVpZ2h0OjEwMCU7d2lkdGg6MDtsZWZ0OjUwJX0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aHVtYnstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVufS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JvdHRvbTotMTRweDtsZWZ0Oi00MHB4O3RyYW5zZm9ybTp0cmFuc2xhdGVYKDI2cHgpIHNjYWxlKDAuMDEpIHJvdGF0ZSgtNDVkZWcpfS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9Lm1hdC1zbGlkZXItdmVydGljYWwuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfVtkaXI9cnRsXSAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlcntsZWZ0OjA7cmlnaHQ6YXV0b31bZGlyPXJ0bF0gLm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10cmFjay1maWxse3RyYW5zZm9ybS1vcmlnaW46MTAwJSAxMDAlfVtkaXI9cnRsXSAubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmR7dHJhbnNmb3JtLW9yaWdpbjowIDB9W2Rpcj1ydGxdIC5tYXQtc2xpZGVyLWhvcml6b250YWwubWF0LXNsaWRlci1heGlzLWludmVydGVkIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGx7dHJhbnNmb3JtLW9yaWdpbjowIDB9W2Rpcj1ydGxdIC5tYXQtc2xpZGVyLWhvcml6b250YWwubWF0LXNsaWRlci1heGlzLWludmVydGVkIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmR7dHJhbnNmb3JtLW9yaWdpbjoxMDAlIDEwMCV9Lm1hdC1zbGlkZXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXNsaWRlci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kLC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRpY2tzLC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRodW1iLWNvbnRhaW5lciwubWF0LXNsaWRlci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlci1mb2N1cy1yaW5nLC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHQsLm1hdC1zbGlkZXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZXItaGFzLXRpY2tzIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVye3RyYW5zaXRpb246bm9uZX1cbiddLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLFJYLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOlNJfSx7dHlwZTpVZ30se3R5cGU6SEksZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmphLGFyZ3M6WyJ0YWJpbmRleCJdfV19LHt0eXBlOmFffSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19XSxSWC5wcm9wRGVjb3JhdG9ycz17aW52ZXJ0Olt7dHlwZTp4eX1dLG1heDpbe3R5cGU6eHl9XSxtaW46W3t0eXBlOnh5fV0sc3RlcDpbe3R5cGU6eHl9XSx0aHVtYkxhYmVsOlt7dHlwZTp4eX1dLHRpY2tJbnRlcnZhbDpbe3R5cGU6eHl9XSx2YWx1ZTpbe3R5cGU6eHl9XSxkaXNwbGF5V2l0aDpbe3R5cGU6eHl9XSx2YWx1ZVRleHQ6W3t0eXBlOnh5fV0sdmVydGljYWw6W3t0eXBlOnh5fV0sY2hhbmdlOlt7dHlwZTpPeX1dLGlucHV0Olt7dHlwZTpPeX1dLHZhbHVlQ2hhbmdlOlt7dHlwZTpPeX1dLF9zbGlkZXJXcmFwcGVyOlt7dHlwZTpaYSxhcmdzOlsic2xpZGVyV3JhcHBlciJdfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUlgsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWF0LXNsaWRlciIsZXhwb3J0QXM6Im1hdFNsaWRlciIscHJvdmlkZXJzOltTWF0saG9zdDp7Iihmb2N1cykiOiJfb25Gb2N1cygpIiwiKGJsdXIpIjoiX29uQmx1cigpIiwiKGtleWRvd24pIjoiX29uS2V5ZG93bigkZXZlbnQpIiwiKGtleXVwKSI6Il9vbktleXVwKCkiLCIobW91c2VlbnRlcikiOiJfb25Nb3VzZWVudGVyKCkiLCIoc2VsZWN0c3RhcnQpIjoiJGV2ZW50LnByZXZlbnREZWZhdWx0KCkiLGNsYXNzOiJtYXQtc2xpZGVyIG1hdC1mb2N1cy1pbmRpY2F0b3IiLHJvbGU6InNsaWRlciIsIlt0YWJJbmRleF0iOiJ0YWJJbmRleCIsIlthdHRyLmFyaWEtZGlzYWJsZWRdIjoiZGlzYWJsZWQiLCJbYXR0ci5hcmlhLXZhbHVlbWF4XSI6Im1heCIsIlthdHRyLmFyaWEtdmFsdWVtaW5dIjoibWluIiwiW2F0dHIuYXJpYS12YWx1ZW5vd10iOiJ2YWx1ZSIsIlthdHRyLmFyaWEtdmFsdWV0ZXh0XSI6InZhbHVlVGV4dCA9PSBudWxsID8gZGlzcGxheVZhbHVlIDogdmFsdWVUZXh0IiwiW2F0dHIuYXJpYS1vcmllbnRhdGlvbl0iOid2ZXJ0aWNhbCA/ICJ2ZXJ0aWNhbCIgOiAiaG9yaXpvbnRhbCInLCJbY2xhc3MubWF0LXNsaWRlci1kaXNhYmxlZF0iOiJkaXNhYmxlZCIsIltjbGFzcy5tYXQtc2xpZGVyLWhhcy10aWNrc10iOiJ0aWNrSW50ZXJ2YWwiLCJbY2xhc3MubWF0LXNsaWRlci1ob3Jpem9udGFsXSI6IiF2ZXJ0aWNhbCIsIltjbGFzcy5tYXQtc2xpZGVyLWF4aXMtaW52ZXJ0ZWRdIjoiX3Nob3VsZEludmVydEF4aXMoKSIsIltjbGFzcy5tYXQtc2xpZGVyLWludmVydC1tb3VzZS1jb29yZHNdIjoiX3Nob3VsZEludmVydE1vdXNlQ29vcmRzKCkiLCJbY2xhc3MubWF0LXNsaWRlci1zbGlkaW5nXSI6Il9pc1NsaWRpbmciLCJbY2xhc3MubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nXSI6InRodW1iTGFiZWwiLCJbY2xhc3MubWF0LXNsaWRlci12ZXJ0aWNhbF0iOiJ2ZXJ0aWNhbCIsIltjbGFzcy5tYXQtc2xpZGVyLW1pbi12YWx1ZV0iOiJfaXNNaW5WYWx1ZSgpIiwiW2NsYXNzLm1hdC1zbGlkZXItaGlkZS1sYXN0LXRpY2tdIjoiZGlzYWJsZWQgfHwgX2lzTWluVmFsdWUoKSAmJiBfZ2V0VGh1bWJHYXAoKSAmJiBfc2hvdWxkSW52ZXJ0QXhpcygpIiwiW2NsYXNzLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlXSI6J19hbmltYXRpb25Nb2RlID09PSAiTm9vcEFuaW1hdGlvbnMiJ30sdGVtcGxhdGU6JzxkaXYgY2xhc3M9Im1hdC1zbGlkZXItd3JhcHBlciIgI3NsaWRlcldyYXBwZXI+XG4gIDxkaXYgY2xhc3M9Im1hdC1zbGlkZXItdHJhY2std3JhcHBlciI+XG4gICAgPGRpdiBjbGFzcz0ibWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kIiBbbmdTdHlsZV09Il9nZXRUcmFja0JhY2tncm91bmRTdHlsZXMoKSI+PC9kaXY+XG4gICAgPGRpdiBjbGFzcz0ibWF0LXNsaWRlci10cmFjay1maWxsIiBbbmdTdHlsZV09Il9nZXRUcmFja0ZpbGxTdHlsZXMoKSI+PC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPSJtYXQtc2xpZGVyLXRpY2tzLWNvbnRhaW5lciIgW25nU3R5bGVdPSJfZ2V0VGlja3NDb250YWluZXJTdHlsZXMoKSI+XG4gICAgPGRpdiBjbGFzcz0ibWF0LXNsaWRlci10aWNrcyIgW25nU3R5bGVdPSJfZ2V0VGlja3NTdHlsZXMoKSI+PC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPSJtYXQtc2xpZGVyLXRodW1iLWNvbnRhaW5lciIgW25nU3R5bGVdPSJfZ2V0VGh1bWJDb250YWluZXJTdHlsZXMoKSI+XG4gICAgPGRpdiBjbGFzcz0ibWF0LXNsaWRlci1mb2N1cy1yaW5nIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPSJtYXQtc2xpZGVyLXRodW1iIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPSJtYXQtc2xpZGVyLXRodW1iLWxhYmVsIj5cbiAgICAgIDxzcGFuIGNsYXNzPSJtYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHQiPnt7ZGlzcGxheVZhbHVlfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4nLGlucHV0czpbImRpc2FibGVkIiwiY29sb3IiLCJ0YWJJbmRleCJdLGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLHN0eWxlczpbJy5tYXQtc2xpZGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjhweDtvdXRsaW5lOm5vbmU7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtc2xpZGVyOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCk6YWN0aXZlLC5tYXQtc2xpZGVyLm1hdC1zbGlkZXItc2xpZGluZzpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpe2N1cnNvcjotd2Via2l0LWdyYWJiaW5nO2N1cnNvcjpncmFiYmluZ30ubWF0LXNsaWRlci13cmFwcGVyey13ZWJraXQtcHJpbnQtY29sb3ItYWRqdXN0OmV4YWN0O2NvbG9yLWFkanVzdDpleGFjdDtwb3NpdGlvbjphYnNvbHV0ZX0ubWF0LXNsaWRlci10cmFjay13cmFwcGVye3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtvdmVyZmxvdzpoaWRkZW59Lm1hdC1zbGlkZXItdHJhY2stZmlsbHtwb3NpdGlvbjphYnNvbHV0ZTt0cmFuc2Zvcm0tb3JpZ2luOjAgMDt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxiYWNrZ3JvdW5kLWNvbG9yIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmR7cG9zaXRpb246YWJzb2x1dGU7dHJhbnNmb3JtLW9yaWdpbjoxMDAlIDEwMCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYmFja2dyb3VuZC1jb2xvciA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LXNsaWRlci10aWNrcy1jb250YWluZXJ7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3RvcDowO292ZXJmbG93OmhpZGRlbn0ubWF0LXNsaWRlci10aWNrc3std2Via2l0LWJhY2tncm91bmQtY2xpcDpjb250ZW50LWJveDtiYWNrZ3JvdW5kLWNsaXA6Y29udGVudC1ib3g7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0O2JveC1zaXppbmc6Ym9yZGVyLWJveDtvcGFjaXR5OjA7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtc2xpZGVyLXRodW1iLWNvbnRhaW5lcntwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjE7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1zbGlkZXItZm9jdXMtcmluZ3twb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDozMHB4O2hlaWdodDozMHB4O2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zZm9ybTpzY2FsZSgwKTtvcGFjaXR5OjA7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYmFja2dyb3VuZC1jb2xvciA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtc2xpZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmcsLm1hdC1zbGlkZXIuY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LXNsaWRlci1mb2N1cy1yaW5ne3RyYW5zZm9ybTpzY2FsZSgxKTtvcGFjaXR5OjF9Lm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKTpub3QoLm1hdC1zbGlkZXItc2xpZGluZykgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwsLm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKTpub3QoLm1hdC1zbGlkZXItc2xpZGluZykgLm1hdC1zbGlkZXItdGh1bWJ7Y3Vyc29yOi13ZWJraXQtZ3JhYjtjdXJzb3I6Z3JhYn0ubWF0LXNsaWRlci10aHVtYntwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDotMTBweDtib3R0b206LTEwcHg7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Ym9yZGVyOjNweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjUwJTt0cmFuc2Zvcm06c2NhbGUoMC43KTt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxiYWNrZ3JvdW5kLWNvbG9yIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJvcmRlci1jb2xvciA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LXNsaWRlci10aHVtYi1sYWJlbHtkaXNwbGF5Om5vbmU7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtib3JkZXItcmFkaXVzOjUwJTt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxib3JkZXItcmFkaXVzIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJhY2tncm91bmQtY29sb3IgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtvdXRsaW5lOnNvbGlkIDFweH0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e3otaW5kZXg6MTtvcGFjaXR5OjA7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtc2xpZGVyLXNsaWRpbmcgLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXNsaWRlci1zbGlkaW5nIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmQsLm1hdC1zbGlkZXItc2xpZGluZyAubWF0LXNsaWRlci10aHVtYi1jb250YWluZXJ7dHJhbnNpdGlvbi1kdXJhdGlvbjowbXN9Lm1hdC1zbGlkZXItaGFzLXRpY2tzIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVye2NvbnRlbnQ6IiI7cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXdpZHRoOjA7Ym9yZGVyLXN0eWxlOnNvbGlkO29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1zbGlkZXItaGFzLXRpY2tzLmNkay1mb2N1c2VkOm5vdCgubWF0LXNsaWRlci1oaWRlLWxhc3QtdGljaykgLm1hdC1zbGlkZXItd3JhcHBlcjo6YWZ0ZXIsLm1hdC1zbGlkZXItaGFzLXRpY2tzOmhvdmVyOm5vdCgubWF0LXNsaWRlci1oaWRlLWxhc3QtdGljaykgLm1hdC1zbGlkZXItd3JhcHBlcjo6YWZ0ZXJ7b3BhY2l0eToxfS5tYXQtc2xpZGVyLWhhcy10aWNrcy5jZGstZm9jdXNlZDpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpIC5tYXQtc2xpZGVyLXRpY2tzLC5tYXQtc2xpZGVyLWhhcy10aWNrczpob3Zlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpIC5tYXQtc2xpZGVyLXRpY2tze29wYWNpdHk6MX0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7ZGlzcGxheTpub25lfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7ZGlzcGxheTpmbGV4fS5tYXQtc2xpZGVyLWF4aXMtaW52ZXJ0ZWQgLm1hdC1zbGlkZXItdHJhY2stZmlsbHt0cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMTAwJX0ubWF0LXNsaWRlci1heGlzLWludmVydGVkIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmR7dHJhbnNmb3JtLW9yaWdpbjowIDB9Lm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKS5jZGstZm9jdXNlZC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcgLm1hdC1zbGlkZXItdGh1bWJ7dHJhbnNmb3JtOnNjYWxlKDApfS5tYXQtc2xpZGVyOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCkuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7Ym9yZGVyLXJhZGl1czo1MCUgNTAlIDB9Lm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKS5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e29wYWNpdHk6MX0ubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpLmNkay1tb3VzZS1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCkuY2RrLXRvdWNoLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKS5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1ie2JvcmRlci13aWR0aDoycHg7dHJhbnNmb3JtOnNjYWxlKDEpfS5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7dHJhbnNmb3JtOnNjYWxlKDApO29wYWNpdHk6MH0ubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYntib3JkZXItd2lkdGg6NHB4O3RyYW5zZm9ybTpzY2FsZSgwLjUpfS5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2Rpc3BsYXk6bm9uZX0ubWF0LXNsaWRlci1ob3Jpem9udGFse2hlaWdodDo0OHB4O21pbi13aWR0aDoxMjhweH0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXdyYXBwZXJ7aGVpZ2h0OjJweDt0b3A6MjNweDtsZWZ0OjhweDtyaWdodDo4cHh9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlcntoZWlnaHQ6MnB4O2JvcmRlci1sZWZ0LXdpZHRoOjJweDtyaWdodDowO3RvcDowfS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdHJhY2std3JhcHBlcntoZWlnaHQ6MnB4O3dpZHRoOjEwMCV9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10cmFjay1maWxse2hlaWdodDoycHg7d2lkdGg6MTAwJTt0cmFuc2Zvcm06c2NhbGVYKDApfS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtoZWlnaHQ6MnB4O3dpZHRoOjEwMCU7dHJhbnNmb3JtOnNjYWxlWCgxKX0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRpY2tzLWNvbnRhaW5lcntoZWlnaHQ6MnB4O3dpZHRoOjEwMCV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRpY2tzLWNvbnRhaW5lcntoZWlnaHQ6MDtvdXRsaW5lOnNvbGlkIDJweDt0b3A6MXB4fS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdGlja3N7aGVpZ2h0OjJweDt3aWR0aDoxMDAlfS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdGh1bWItY29udGFpbmVye3dpZHRoOjEwMCU7aGVpZ2h0OjA7dG9wOjUwJX0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7dG9wOi0xNXB4O3JpZ2h0Oi0xNXB4fS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7cmlnaHQ6LTE0cHg7dG9wOi00MHB4O3RyYW5zZm9ybTp0cmFuc2xhdGVZKDI2cHgpIHNjYWxlKDAuMDEpIHJvdGF0ZSg0NWRlZyl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX0ubWF0LXNsaWRlci1ob3Jpem9udGFsLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zbGlkZXItaG9yaXpvbnRhbC5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYi1sYWJlbCwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc2xpZGVyLWhvcml6b250YWwuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHt0cmFuc2Zvcm06bm9uZX0ubWF0LXNsaWRlci12ZXJ0aWNhbHt3aWR0aDo0OHB4O21pbi1oZWlnaHQ6MTI4cHh9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItd3JhcHBlcnt3aWR0aDoycHg7dG9wOjhweDtib3R0b206OHB4O2xlZnQ6MjNweH0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlcnt3aWR0aDoycHg7Ym9yZGVyLXRvcC13aWR0aDoycHg7Ym90dG9tOjA7bGVmdDowfS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRyYWNrLXdyYXBwZXJ7aGVpZ2h0OjEwMCU7d2lkdGg6MnB4fS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGx7aGVpZ2h0OjEwMCU7d2lkdGg6MnB4O3RyYW5zZm9ybTpzY2FsZVkoMCl9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtoZWlnaHQ6MTAwJTt3aWR0aDoycHg7dHJhbnNmb3JtOnNjYWxlWSgxKX0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aWNrcy1jb250YWluZXJ7d2lkdGg6MnB4O2hlaWdodDoxMDAlfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdGlja3MtY29udGFpbmVye3dpZHRoOjA7b3V0bGluZTpzb2xpZCAycHg7bGVmdDoxcHh9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItZm9jdXMtcmluZ3tib3R0b206LTE1cHg7bGVmdDotMTVweH0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aWNrc3t3aWR0aDoycHg7aGVpZ2h0OjEwMCV9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdGh1bWItY29udGFpbmVye2hlaWdodDoxMDAlO3dpZHRoOjA7bGVmdDo1MCV9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdGh1bWJ7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjtiYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbn0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtib3R0b206LTE0cHg7bGVmdDotNDBweDt0cmFuc2Zvcm06dHJhbnNsYXRlWCgyNnB4KSBzY2FsZSgwLjAxKSByb3RhdGUoLTQ1ZGVnKX0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfS5tYXQtc2xpZGVyLXZlcnRpY2FsLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX1bZGlyPXJ0bF0gLm1hdC1zbGlkZXItd3JhcHBlcjo6YWZ0ZXJ7bGVmdDowO3JpZ2h0OmF1dG99W2Rpcj1ydGxdIC5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdHJhY2stZmlsbHt0cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMTAwJX1bZGlyPXJ0bF0gLm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke3RyYW5zZm9ybS1vcmlnaW46MCAwfVtkaXI9cnRsXSAubWF0LXNsaWRlci1ob3Jpem9udGFsLm1hdC1zbGlkZXItYXhpcy1pbnZlcnRlZCAubWF0LXNsaWRlci10cmFjay1maWxse3RyYW5zZm9ybS1vcmlnaW46MCAwfVtkaXI9cnRsXSAubWF0LXNsaWRlci1ob3Jpem9udGFsLm1hdC1zbGlkZXItYXhpcy1pbnZlcnRlZCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke3RyYW5zZm9ybS1vcmlnaW46MTAwJSAxMDAlfS5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsLm1hdC1zbGlkZXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCwubWF0LXNsaWRlci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlci10aWNrcywubWF0LXNsaWRlci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlci10aHVtYi1jb250YWluZXIsLm1hdC1zbGlkZXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZXItZm9jdXMtcmluZywubWF0LXNsaWRlci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlci10aHVtYiwubWF0LXNsaWRlci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlci10aHVtYi1sYWJlbCwubWF0LXNsaWRlci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0LC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLWhhcy10aWNrcyAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlcnt0cmFuc2l0aW9uOm5vbmV9XG4nXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTpTSX0se3R5cGU6VWd9LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpqYSxhcmdzOlsidGFiaW5kZXgiXX1dfSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV19KSx7Y2hhbmdlOlt7dHlwZTpPeX1dLGlucHV0Olt7dHlwZTpPeX1dLHZhbHVlQ2hhbmdlOlt7dHlwZTpPeX1dLGludmVydDpbe3R5cGU6eHl9XSxtYXg6W3t0eXBlOnh5fV0sbWluOlt7dHlwZTp4eX1dLHN0ZXA6W3t0eXBlOnh5fV0sdGh1bWJMYWJlbDpbe3R5cGU6eHl9XSx0aWNrSW50ZXJ2YWw6W3t0eXBlOnh5fV0sdmFsdWU6W3t0eXBlOnh5fV0sdmVydGljYWw6W3t0eXBlOnh5fV0sZGlzcGxheVdpdGg6W3t0eXBlOnh5fV0sdmFsdWVUZXh0Olt7dHlwZTp4eX1dLF9zbGlkZXJXcmFwcGVyOlt7dHlwZTpaYSxhcmdzOlsic2xpZGVyV3JhcHBlciJdfV19KTtjbGFzcyB6WHt9elguybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHpYKX0selguybVtb2Q9YW8oe3R5cGU6elh9KSx6WC7JtWluaj12bih7aW1wb3J0czpbW1dNLFhJXSxYSV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHpYLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbV00sWEldLGV4cG9ydHM6W1JYLFhJXSxkZWNsYXJhdGlvbnM6W1JYXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKHpYLHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bUlhdfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1dNLFhJXX0sZXhwb3J0czpmdW5jdGlvbigpe3JldHVybltSWCxYSV19fSk7Y29uc3QgSVg9ezE5OiJmbG9hdDE2IiwxOiJmbG9hdDMyIiwyOiJmbG9hdDY0IiwzOiJpbnQzMiIsNDoidWludDgiLDE3OiJ1aW50MTYiLDIyOiJ1aW50MzIiLDIzOiJ1aW50NjQiLDU6ImludDE2Iiw2OiJpbnQ4Iiw3OiJzdHJpbmciLDg6ImNvbXBsZXg2NCIsMTg6ImNvbXBsZXgxMjgiLDk6ImludDY0IiwxMDoiYm9vbCIsMTE6InFpbnQ4IiwxMjoicXVpbnQ4IiwxNToicWludDE2IiwxNjoicXVpbnQxNiIsMTM6InFpbnQzMiIsMTQ6ImJmbG9hdDE2IiwyMDoicmVzb3VyY2UiLDIxOiJ2YXJpYW50IiwxMTk6ImZsb2F0MTZfcmVmIiwxMDE6ImZsb2F0MzJfcmVmIiwxMDI6ImZsb2F0NjRfcmVmIiwxMDM6ImludDMyX3JlZiIsMTIyOiJ1aW50MzJfcmVmIiwxMDQ6InVpbnQ4X3JlZiIsMTE3OiJ1aW50MTZfcmVmIiwxMDU6ImludDE2X3JlZiIsMTA2OiJpbnQ4X3JlZiIsMTA3OiJzdHJpbmdfcmVmIiwxMDg6ImNvbXBsZXg2NF9yZWYiLDExODoiY29tcGxleDEyOF9yZWYiLDEwOToiaW50NjRfcmVmIiwxMjM6InVpbnQ2NF9yZWYiLDExMDoiYm9vbF9yZWYiLDExMToicWludDhfcmVmIiwxMTI6InF1aW50OF9yZWYiLDExNToicWludDE2X3JlZiIsMTE2OiJxdWludDE2X3JlZiIsMTEzOiJxaW50MzJfcmVmIiwxMTQ6ImJmbG9hdDE2X3JlZiIsMTIwOiJyZXNvdXJjZV9yZWYiLDEyMToidmFyaWFudF9yZWYifTtmdW5jdGlvbiBIWCh0KXtjb25zdHt0ZW5zb3JEZWJ1Z01vZGU6ZSxhcnJheTpufT10O3N3aXRjaChlKXtjYXNlIG1aLk5PX1RFTlNPUjppZihudWxsIT09bil0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWRseSByZWNlaXZlZCBub24tbnVsbCBkZWJ1Zy10ZW5zb3ItdmFsdWUgYXJyYXkgdW5kZXIgTk9fVEVOU09SIG1vZGUiKTtyZXR1cm57fTtjYXNlIG1aLkNVUlRfSEVBTFRIOmlmKG51bGw9PT1ufHwyIT09bi5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBVbmRlciBDVVJUX0hFQUxUSCBtb2RlLCBleHBlY3RlZCBkZWJ1Zy10ZW5zb3ItdmFsdWUgYXJyYXkgdG8gaGF2ZSBsZW5ndGggMiwgYnV0IGdvdCAke0pTT04uc3RyaW5naWZ5KG4pfWApO3JldHVybntoYXNJbmZPck5hTjpCb29sZWFuKG5bMV0pfTtjYXNlIG1aLkNPTkNJU0VfSEVBTFRIOntpZihudWxsPT09bnx8NSE9PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgVW5kZXIgQ09OQ0lTRV9IRUFMVEggbW9kZSwgZXhwZWN0ZWQgZGVidWctdGVuc29yLXZhbHVlIGFycmF5IHRvIGhhdmUgbGVuZ3RoIDUsIGJ1dCBnb3QgJHtKU09OLnN0cmluZ2lmeShuKX1gKTtjb25zdCB0PXtzaXplOm5bMV19O3JldHVybiBuWzJdPjAmJih0Lm51bU5lZ2F0aXZlSW5mcz1uWzJdKSxuWzNdPjAmJih0Lm51bVBvc2l0aXZlSW5mcz1uWzNdKSxuWzRdPjAmJih0Lm51bU5hTnM9bls0XSksdH1jYXNlIG1aLlNIQVBFOntpZihudWxsPT09bnx8MTAhPT1uLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYFVuZGVyIFNIQVBFIG1vZGUsIGV4cGVjdGVkIGRlYnVnLXRlbnNvci12YWx1ZSBhcnJheSB0byBoYXZlIGxlbmd0aCAxMCwgYnV0IGdvdCAke0pTT04uc3RyaW5naWZ5KG4pfWApO2NvbnN0IHQ9blsyXTtsZXQgZT1uLnNsaWNlKDQsTWF0aC5taW4oNCt0LG4ubGVuZ3RoKSk7cmV0dXJuIGUubGVuZ3RoPHQmJihlPW5ldyBBcnJheSh0LWUubGVuZ3RoKS5jb25jYXQoZSkpLHtkdHlwZTpJWFtuWzFdXSxyYW5rOnQsc2l6ZTpuWzNdLHNoYXBlOmV9fWNhc2UgbVouRlVMTF9IRUFMVEg6e2lmKG51bGw9PT1ufHwxMSE9PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgVW5kZXIgRlVMTF9IRUFMVEggbW9kZSwgZXhwZWN0ZWQgZGVidWctdGVuc29yLXZhbHVlIGFycmF5IHRvIGhhdmUgbGVuZ3RoIDExLCBidXQgZ290ICR7SlNPTi5zdHJpbmdpZnkobil9YCk7Y29uc3QgdD17ZHR5cGU6SVhbblsyXV0scmFuazpuWzNdLHNpemU6bls0XX07cmV0dXJuIG5bNV0+MCYmKHQubnVtTmVnYXRpdmVJbmZzPW5bNV0pLG5bNl0+MCYmKHQubnVtUG9zaXRpdmVJbmZzPW5bNl0pLG5bN10+MCYmKHQubnVtTmFOcz1uWzddKSxuWzhdPjAmJih0Lm51bU5lZ2F0aXZlRmluaXRlcz1uWzhdKSxuWzldPjAmJih0Lm51bVplcm9zPW5bOV0pLG5bMTBdPjAmJih0Lm51bVBvc2l0aXZlRmluaXRlcz1uWzEwXSksdH1jYXNlIG1aLkZVTExfVEVOU09SOmlmKG51bGwhPT1uKXRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZGx5IHJlY2VpdmVkIG5vbi1udWxsIGRlYnVnLXRlbnNvci12YWx1ZSBhcnJheSB1bmRlciBGVUxMX1RFTlNPUiBtb2RlIik7cmV0dXJue307ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCB0ZW5zb3JEZWJ1Z01vZGU6ICR7ZX1gKX19Y29uc3QgRlg9Iltfbmdob3N0LSVDT01QJV0ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlM2U1ZTg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2MwYzBjMDtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubycsIG1vbm9zcGFjZTtcbiAgICBoZWlnaHQ6IDE0cHg7XG4gICAgbGluZS1oZWlnaHQ6IDE0cHg7XG4gICAgbWFyZ2luOiAwIDJweDtcbiAgICBwYWRkaW5nOiAxcHggM3B4O1xuICAgIHdpZHRoOiBtYXgtY29udGVudDtcbiAgfSI7ZnVuY3Rpb24gTFgodCxlKXsxJnQmJlRtKDAsImRpdiIsNCl9ZnVuY3Rpb24gQlgodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDcpLFJtKDEsInNwYW4iLDgpLGt1KDIsIk5hTiIpLEFtKCksUm0oMywic3BhbiIsOSksa3UoNCksQW0oKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMik7cmMoNCksRHUoIsOXIix0Lm51bU5hTnMsIiIpfX1mdW5jdGlvbiBWWCh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsNyksUm0oMSwic3BhbiIsOCksa3UoMiwiLeKIniIpLEFtKCksUm0oMywic3BhbiIsOSksa3UoNCksQW0oKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMik7cmMoNCksRHUoIsOXIix0Lm51bU5lZ2F0aXZlSW5mcywiIil9fWZ1bmN0aW9uIGpYKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2Iiw3KSxSbSgxLCJzcGFuIiw4KSxrdSgyLCIr4oieIiksQW0oKSxSbSgzLCJzcGFuIiw5KSxrdSg0KSxBbSgpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgyKTtyYyg0KSxEdSgiw5ciLHQubnVtUG9zaXRpdmVJbmZzLCIiKX19ZnVuY3Rpb24gVVgodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDcpLFJtKDEsInNwYW4iLDEwKSxrdSgyLCItIiksQW0oKSxSbSgzLCJzcGFuIiw5KSxrdSg0KSxBbSgpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgyKTtyYyg0KSxEdSgiw5ciLHQubnVtTmVnYXRpdmVGaW5pdGVzLCIiKX19ZnVuY3Rpb24gR1godCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDcpLFJtKDEsInNwYW4iLDEwKSxrdSgyLCIwIiksQW0oKSxSbSgzLCJzcGFuIiw5KSxrdSg0KSxBbSgpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgyKTtyYyg0KSxEdSgiw5ciLHQubnVtWmVyb3MsIiIpfX1mdW5jdGlvbiBXWCh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsNyksUm0oMSwic3BhbiIsMTApLGt1KDIsIisiKSxBbSgpLFJtKDMsInNwYW4iLDkpLGt1KDQpLEFtKCksQW0oKSksMiZ0KXtjb25zdCB0PVltKDIpO3JjKDQpLER1KCLDlyIsdC5udW1Qb3NpdGl2ZUZpbml0ZXMsIiIpfX1mdW5jdGlvbiBZWCh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsNSksUXAoMSxCWCw1LDEsImRpdiIsNiksUXAoMixWWCw1LDEsImRpdiIsNiksUXAoMyxqWCw1LDEsImRpdiIsNiksUXAoNCxVWCw1LDEsImRpdiIsNiksUXAoNSxHWCw1LDEsImRpdiIsNiksUXAoNixXWCw1LDEsImRpdiIsNiksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoMSksRG0oIm5nSWYiLHZvaWQgMCE9PXQubnVtTmFOcyYmdC5udW1OYU5zPjApLHJjKDEpLERtKCJuZ0lmIix2b2lkIDAhPT10Lm51bU5lZ2F0aXZlSW5mcyYmdC5udW1OZWdhdGl2ZUluZnM+MCkscmMoMSksRG0oIm5nSWYiLHZvaWQgMCE9PXQubnVtUG9zaXRpdmVJbmZzJiZ0Lm51bVBvc2l0aXZlSW5mcz4wKSxyYygxKSxEbSgibmdJZiIsdm9pZCAwIT09dC5udW1OZWdhdGl2ZUZpbml0ZXMmJnQubnVtTmVnYXRpdmVGaW5pdGVzPjApLHJjKDEpLERtKCJuZ0lmIix2b2lkIDAhPT10Lm51bVplcm9zJiZ0Lm51bVplcm9zPjApLHJjKDEpLERtKCJuZ0lmIix2b2lkIDAhPT10Lm51bVBvc2l0aXZlRmluaXRlcyYmdC5udW1Qb3NpdGl2ZUZpbml0ZXM+MCl9fWNvbnN0IHFYPWZ1bmN0aW9uKHQpe3JldHVyblsiY29udGFpbmVyIix0XX07ZnVuY3Rpb24gWlgodCxlKXsxJnQmJlRtKDAsImRlYnVnLXRlbnNvci1kdHlwZSIsNSksMiZ0JiZEbSgiZHR5cGUiLFltKCkuZGVidWdUZW5zb3JWYWx1ZS5kdHlwZSl9ZnVuY3Rpb24gWFgodCxlKXsxJnQmJlRtKDAsImRlYnVnLXRlbnNvci1yYW5rIiw2KSwyJnQmJkRtKCJyYW5rIixZbSgpLmRlYnVnVGVuc29yVmFsdWUucmFuayl9ZnVuY3Rpb24gS1godCxlKXsxJnQmJlRtKDAsImRlYnVnLXRlbnNvci1zaGFwZSIsNyksMiZ0JiZEbSgic2hhcGUiLFltKCkuZGVidWdUZW5zb3JWYWx1ZS5zaGFwZSl9ZnVuY3Rpb24gSlgodCxlKXsxJnQmJlRtKDAsImRlYnVnLXRlbnNvci1oYXMtaW5mLW9yLW5hbiIsOCksMiZ0JiZEbSgiaGFzSW5mT3JOYU4iLFltKCkuZGVidWdUZW5zb3JWYWx1ZS5oYXNJbmZPck5hTil9ZnVuY3Rpb24gUVgodCxlKXtpZigxJnQmJlRtKDAsImRlYnVnLXRlbnNvci1udW1lcmljLWJyZWFrZG93biIsOSksMiZ0KXtjb25zdCB0PVltKCk7S20oInNpemUiLHQuZGVidWdUZW5zb3JWYWx1ZS5zaXplKSxEbSgibnVtTmVnYXRpdmVJbmZzIix0LmRlYnVnVGVuc29yVmFsdWUubnVtTmVnYXRpdmVJbmZzKSgibnVtUG9zaXRpdmVJbmZzIix0LmRlYnVnVGVuc29yVmFsdWUubnVtUG9zaXRpdmVJbmZzKSgibnVtTmFOcyIsdC5kZWJ1Z1RlbnNvclZhbHVlLm51bU5hTnMpKCJudW1OZWdhdGl2ZUZpbml0ZXMiLHQuZGVidWdUZW5zb3JWYWx1ZS5udW1OZWdhdGl2ZUZpbml0ZXMpKCJudW1aZXJvcyIsdC5kZWJ1Z1RlbnNvclZhbHVlLm51bVplcm9zKSgibnVtUG9zaXRpdmVGaW5pdGVzIix0LmRlYnVnVGVuc29yVmFsdWUubnVtUG9zaXRpdmVGaW5pdGVzKX19Y29uc3QgJFg9IlxuICA6aG9zdCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2UzZTVlODtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjYzBjMGMwO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJywgbW9ub3NwYWNlO1xuICAgIGhlaWdodDogMTRweDtcbiAgICBsaW5lLWhlaWdodDogMTRweDtcbiAgICBtYXJnaW46IDAgMnB4O1xuICAgIHBhZGRpbmc6IDFweCAzcHg7XG4gICAgd2lkdGg6IG1heC1jb250ZW50O1xuICB9XG4iO2NsYXNzIHRLe310Sy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8dEspfSx0Sy7JtWNtcD10byh7dHlwZTp0SyxzZWxlY3RvcnM6W1siZGVidWctdGVuc29yLWR0eXBlIl1dLGlucHV0czp7ZHR5cGU6ImR0eXBlIn0sZGVjbHM6MSx2YXJzOjEsdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYma3UoMCksMiZlJiZEdSgiICIsbi5kdHlwZSwiICIpfSxzdHlsZXM6W0ZYXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodEssW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiZGVidWctdGVuc29yLWR0eXBlIix0ZW1wbGF0ZToiIHt7IGR0eXBlIH19ICIsc3R5bGVzOlskWF19XX1dLG51bGwse2R0eXBlOlt7dHlwZTp4eX1dfSk7Y2xhc3MgZUt7fWVLLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxlSyl9LGVLLsm1Y21wPXRvKHt0eXBlOmVLLHNlbGVjdG9yczpbWyJkZWJ1Zy10ZW5zb3ItcmFuayJdXSxpbnB1dHM6e3Jhbms6InJhbmsifSxkZWNsczoxLHZhcnM6MSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiZrdSgwKSwyJmUmJkR1KCIgIixuLnJhbmssIkQgIil9LHN0eWxlczpbRlhdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChlSyxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJkZWJ1Zy10ZW5zb3ItcmFuayIsdGVtcGxhdGU6IiB7eyByYW5rIH19RCAiLHN0eWxlczpbJFhdfV19XSxudWxsLHtyYW5rOlt7dHlwZTp4eX1dfSk7Y2xhc3Mgbkt7Z2V0IHNoYXBlU3RyaW5nKCl7cmV0dXJuIlsiK3RoaXMuc2hhcGUubWFwKCh0PT52b2lkIDA9PT10PyI/IjpTdHJpbmcodCkpKS5qb2luKCIsIikrIl0ifX1uSy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bkspfSxuSy7JtWNtcD10byh7dHlwZTpuSyxzZWxlY3RvcnM6W1siZGVidWctdGVuc29yLXNoYXBlIl1dLGlucHV0czp7c2hhcGU6InNoYXBlIn0sZGVjbHM6MSx2YXJzOjEsdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYma3UoMCksMiZlJiZEdSgiIHNoYXBlOiIsbi5zaGFwZVN0cmluZywiICIpfSxzdHlsZXM6W0ZYXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobkssW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiZGVidWctdGVuc29yLXNoYXBlIix0ZW1wbGF0ZToiIHNoYXBlOnt7IHNoYXBlU3RyaW5nIH19ICIsc3R5bGVzOlskWF19XX1dLG51bGwse3NoYXBlOlt7dHlwZTp4eX1dfSk7Y2xhc3Mgb0t7Z2V0IGJyZWFrZG93bkV4aXN0cygpe3JldHVybiB2b2lkIDAhPT10aGlzLm51bU5hTnN8fHZvaWQgMCE9PXRoaXMubnVtTmVnYXRpdmVJbmZzfHx2b2lkIDAhPT10aGlzLm51bVBvc2l0aXZlSW5mc3x8dm9pZCAwIT09dGhpcy5udW1OZWdhdGl2ZUZpbml0ZXN8fHZvaWQgMCE9PXRoaXMubnVtWmVyb3N8fHZvaWQgMCE9PXRoaXMubnVtUG9zaXRpdmVGaW5pdGVzfX1vSy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8b0spfSxvSy7JtWNtcD10byh7dHlwZTpvSyxzZWxlY3RvcnM6W1siZGVidWctdGVuc29yLW51bWVyaWMtYnJlYWtkb3duIl1dLGlucHV0czp7c2l6ZToic2l6ZSIsbnVtTmFOczoibnVtTmFOcyIsbnVtTmVnYXRpdmVJbmZzOiJudW1OZWdhdGl2ZUluZnMiLG51bVBvc2l0aXZlSW5mczoibnVtUG9zaXRpdmVJbmZzIixudW1OZWdhdGl2ZUZpbml0ZXM6Im51bU5lZ2F0aXZlRmluaXRlcyIsbnVtWmVyb3M6Im51bVplcm9zIixudW1Qb3NpdGl2ZUZpbml0ZXM6Im51bVBvc2l0aXZlRmluaXRlcyJ9LGRlY2xzOjcsdmFyczozLGNvbnN0czpbWzEsInNpemUiXSxbMSwic2l6ZS12YWx1ZSJdLFsiY2xhc3MiLCJicmVhayIsNCwibmdJZiJdLFsiY2xhc3MiLCJicmVha2Rvd24iLDQsIm5nSWYiXSxbMSwiYnJlYWsiXSxbMSwiYnJlYWtkb3duIl0sWyJjbGFzcyIsImNhdGVnb3J5Iiw0LCJuZ0lmIl0sWzEsImNhdGVnb3J5Il0sWzEsImNhdGVnb3J5LXRhZyIsImluZmluaXRlIl0sWzEsImNhdGVnb3J5LWNvdW50Il0sWzEsImNhdGVnb3J5LXRhZyIsImZpbml0ZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiZGl2IiwwKSxSbSgxLCJzcGFuIiksa3UoMiwic2l6ZToiKSxBbSgpLFJtKDMsInNwYW4iLDEpLGt1KDQpLEFtKCksQW0oKSxRcCg1LExYLDEsMCwiZGl2IiwyKSxRcCg2LFlYLDcsNiwiZGl2IiwzKSksMiZlJiYocmMoNCksU3Uobi5zaXplKSxyYygxKSxEbSgibmdJZiIsbi5icmVha2Rvd25FeGlzdHMpLHJjKDEpLERtKCJuZ0lmIixuLmJyZWFrZG93bkV4aXN0cykpfSxkaXJlY3RpdmVzOltkTV0sc3R5bGVzOlsiW19uZ2hvc3QtJUNPTVAlXSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlM2U1ZTg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjMGMwYzA7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubycsIG1vbm9zcGFjZTtcbiAgICAgICAgZm9udC1zaXplOiAxMHB4O1xuICAgICAgICBtYXJnaW46IDAgMnB4O1xuICAgICAgICBwYWRkaW5nOiAxcHg7XG4gICAgICB9XG4gICAgICAuYnJlYWtbX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgZmxleC1iYXNpczogMTAwJTtcbiAgICAgICAgd2lkdGg6IDA7XG4gICAgICB9XG4gICAgICAuc2l6ZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgaGVpZ2h0OiAxMXB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMTFweDtcbiAgICAgICAgbWFyZ2luOiAwIDNweDtcbiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICAgIH1cbiAgICAgIC5icmVha2Rvd25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xMik7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGhlaWdodDogMTFweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDExcHg7XG4gICAgICAgIHBhZGRpbmc6IDJweDtcbiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICAgIH1cbiAgICAgIC5jYXRlZ29yeVtfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAycHg7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiA0cHg7XG4gICAgICAgIG1hcmdpbi10b3A6IDJweDtcbiAgICAgICAgaGVpZ3RoOiAxMDAlO1xuICAgICAgICB3aWR0aDogbWF4LWNvbnRlbnQ7XG4gICAgICB9XG4gICAgICAuY2F0ZWdvcnktdGFnW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICAgICAgcGFkZGluZzogMCAycHg7XG4gICAgICB9XG4gICAgICAuZmluaXRlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNhYWE7XG4gICAgICAgIGNvbG9yOiAjZmVmZWZlO1xuICAgICAgfVxuICAgICAgLmluZmluaXRlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlNTI1OTI7XG4gICAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgfSJdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChvSyxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJkZWJ1Zy10ZW5zb3ItbnVtZXJpYy1icmVha2Rvd24iLHRlbXBsYXRlOidcbiAgICA8ZGl2IGNsYXNzPSJzaXplIj5cbiAgICAgIDxzcGFuPnNpemU6PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9InNpemUtdmFsdWUiPnt7IHNpemUgfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj0iYnJlYWtkb3duRXhpc3RzIiBjbGFzcz0iYnJlYWsiPjwvZGl2PlxuICAgIDxkaXYgKm5nSWY9ImJyZWFrZG93bkV4aXN0cyIgY2xhc3M9ImJyZWFrZG93biI+XG4gICAgICA8ZGl2ICpuZ0lmPSJudW1OYU5zICE9PSB1bmRlZmluZWQgJiYgbnVtTmFOcyA+IDAiIGNsYXNzPSJjYXRlZ29yeSI+XG4gICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS10YWcgaW5maW5pdGUiPk5hTjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LWNvdW50Ij7Dl3t7IG51bU5hTnMgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9Im51bU5lZ2F0aXZlSW5mcyAhPT0gdW5kZWZpbmVkICYmIG51bU5lZ2F0aXZlSW5mcyA+IDAiXG4gICAgICAgIGNsYXNzPSJjYXRlZ29yeSJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LXRhZyBpbmZpbml0ZSI+LeKInjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LWNvdW50Ij7Dl3t7IG51bU5lZ2F0aXZlSW5mcyB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj0ibnVtUG9zaXRpdmVJbmZzICE9PSB1bmRlZmluZWQgJiYgbnVtUG9zaXRpdmVJbmZzID4gMCJcbiAgICAgICAgY2xhc3M9ImNhdGVnb3J5IlxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzcz0iY2F0ZWdvcnktdGFnIGluZmluaXRlIj4r4oiePC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz0iY2F0ZWdvcnktY291bnQiPsOXe3sgbnVtUG9zaXRpdmVJbmZzIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPSJudW1OZWdhdGl2ZUZpbml0ZXMgIT09IHVuZGVmaW5lZCAmJiBudW1OZWdhdGl2ZUZpbml0ZXMgPiAwIlxuICAgICAgICBjbGFzcz0iY2F0ZWdvcnkiXG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS10YWcgZmluaXRlIj4tPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz0iY2F0ZWdvcnktY291bnQiPsOXe3sgbnVtTmVnYXRpdmVGaW5pdGVzIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPSJudW1aZXJvcyAhPT0gdW5kZWZpbmVkICYmIG51bVplcm9zID4gMCIgY2xhc3M9ImNhdGVnb3J5Ij5cbiAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LXRhZyBmaW5pdGUiPjA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS1jb3VudCI+w5d7eyBudW1aZXJvcyB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj0ibnVtUG9zaXRpdmVGaW5pdGVzICE9PSB1bmRlZmluZWQgJiYgbnVtUG9zaXRpdmVGaW5pdGVzID4gMCJcbiAgICAgICAgY2xhc3M9ImNhdGVnb3J5IlxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzcz0iY2F0ZWdvcnktdGFnIGZpbml0ZSI+Kzwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LWNvdW50Ij7Dl3t7IG51bVBvc2l0aXZlRmluaXRlcyB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAnLHN0eWxlczpbIlxuICAgICAgOmhvc3Qge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTNlNWU4O1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjYzBjMGMwO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCBtb25vc3BhY2U7XG4gICAgICAgIGZvbnQtc2l6ZTogMTBweDtcbiAgICAgICAgbWFyZ2luOiAwIDJweDtcbiAgICAgICAgcGFkZGluZzogMXB4O1xuICAgICAgfVxuICAgICAgLmJyZWFrIHtcbiAgICAgICAgZmxleC1iYXNpczogMTAwJTtcbiAgICAgICAgd2lkdGg6IDA7XG4gICAgICB9XG4gICAgICAuc2l6ZSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBoZWlnaHQ6IDExcHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxMXB4O1xuICAgICAgICBtYXJnaW46IDAgM3B4O1xuICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgICAgfVxuICAgICAgLmJyZWFrZG93biB7XG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBoZWlnaHQ6IDExcHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxMXB4O1xuICAgICAgICBwYWRkaW5nOiAycHg7XG4gICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgICB9XG4gICAgICAuY2F0ZWdvcnkge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAycHg7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiA0cHg7XG4gICAgICAgIG1hcmdpbi10b3A6IDJweDtcbiAgICAgICAgaGVpZ3RoOiAxMDAlO1xuICAgICAgICB3aWR0aDogbWF4LWNvbnRlbnQ7XG4gICAgICB9XG4gICAgICAuY2F0ZWdvcnktdGFnIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgICAgICBwYWRkaW5nOiAwIDJweDtcbiAgICAgIH1cbiAgICAgIC5maW5pdGUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYWFhO1xuICAgICAgICBjb2xvcjogI2ZlZmVmZTtcbiAgICAgIH1cbiAgICAgIC5pbmZpbml0ZSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlNTI1OTI7XG4gICAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgfVxuICAgICJdfV19XSxudWxsLHtzaXplOlt7dHlwZTp4eX1dLG51bU5hTnM6W3t0eXBlOnh5fV0sbnVtTmVnYXRpdmVJbmZzOlt7dHlwZTp4eX1dLG51bVBvc2l0aXZlSW5mczpbe3R5cGU6eHl9XSxudW1OZWdhdGl2ZUZpbml0ZXM6W3t0eXBlOnh5fV0sbnVtWmVyb3M6W3t0eXBlOnh5fV0sbnVtUG9zaXRpdmVGaW5pdGVzOlt7dHlwZTp4eX1dfSk7Y2xhc3MgaUt7Z2V0IGluZm9TdHJpbmcoKXtyZXR1cm4gdGhpcy5oYXNJbmZPck5hTj8iSGFzIOKIni9OYU4iOiJObyDiiJ4vTmFOIn19aUsuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGlLKX0saUsuybVjbXA9dG8oe3R5cGU6aUssc2VsZWN0b3JzOltbImRlYnVnLXRlbnNvci1oYXMtaW5mLW9yLW5hbiJdXSxpbnB1dHM6e2hhc0luZk9yTmFOOiJoYXNJbmZPck5hTiJ9LGRlY2xzOjIsdmFyczo0LGNvbnN0czpbWzMsIm5nQ2xhc3MiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImRpdiIsMCksa3UoMSksQW0oKSksMiZlJiYoRG0oIm5nQ2xhc3MiLE1oKDIscVgsbi5oYXNJbmZPck5hTj8iaGFzLWluZi1vci1uYW4iOiIiKSkscmMoMSksRHUoIiAiLG4uaW5mb1N0cmluZywiICIpKX0sZGlyZWN0aXZlczpbYU1dLHN0eWxlczpbIi5jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UzZTVlODtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2MwYzBjMDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgICBjb2xvcjogIzY2NjY2NjtcbiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubycsIG1vbm9zcGFjZTtcbiAgICAgICAgaGVpZ2h0OiAxNHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMTRweDtcbiAgICAgICAgbWFyZ2luOiAwIDJweDtcbiAgICAgICAgcGFkZGluZzogMXB4IDNweDtcbiAgICAgICAgd2lkdGg6IG1heC1jb250ZW50O1xuICAgICAgfVxuICAgICAgLmhhcy1pbmYtb3ItbmFuW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlNTI1OTI7XG4gICAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgfSJdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChpSyxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJkZWJ1Zy10ZW5zb3ItaGFzLWluZi1vci1uYW4iLHRlbXBsYXRlOiJcbiAgICA8ZGl2IFtuZ0NsYXNzXT1cIlsnY29udGFpbmVyJywgaGFzSW5mT3JOYU4gPyAnaGFzLWluZi1vci1uYW4nIDogJyddXCI+XG4gICAgICB7eyBpbmZvU3RyaW5nIH19XG4gICAgPC9kaXY+XG4gICIsc3R5bGVzOlsiXG4gICAgICAuY29udGFpbmVyIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UzZTVlODtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2MwYzBjMDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgICBjb2xvcjogIzY2NjY2NjtcbiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubycsIG1vbm9zcGFjZTtcbiAgICAgICAgaGVpZ2h0OiAxNHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMTRweDtcbiAgICAgICAgbWFyZ2luOiAwIDJweDtcbiAgICAgICAgcGFkZGluZzogMXB4IDNweDtcbiAgICAgICAgd2lkdGg6IG1heC1jb250ZW50O1xuICAgICAgfVxuICAgICAgLmhhcy1pbmYtb3ItbmFuIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2U1MjU5MjtcbiAgICAgICAgY29sb3I6ICNmZmY7XG4gICAgICB9XG4gICAgIl19XX1dLG51bGwse2hhc0luZk9yTmFOOlt7dHlwZTp4eX1dfSk7Y2xhc3MgYUt7fWFLLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxhSyl9LGFLLsm1Y21wPXRvKHt0eXBlOmFLLHNlbGVjdG9yczpbWyJkZWJ1Zy10ZW5zb3ItdmFsdWUiXV0saW5wdXRzOntkZWJ1Z1RlbnNvclZhbHVlOiJkZWJ1Z1RlbnNvclZhbHVlIn0sZGVjbHM6NSx2YXJzOjUsY29uc3RzOltbMywiZHR5cGUiLDQsIm5nSWYiXSxbMywicmFuayIsNCwibmdJZiJdLFszLCJzaGFwZSIsNCwibmdJZiJdLFszLCJoYXNJbmZPck5hTiIsNCwibmdJZiJdLFszLCJzaXplIiwibnVtTmVnYXRpdmVJbmZzIiwibnVtUG9zaXRpdmVJbmZzIiwibnVtTmFOcyIsIm51bU5lZ2F0aXZlRmluaXRlcyIsIm51bVplcm9zIiwibnVtUG9zaXRpdmVGaW5pdGVzIiw0LCJuZ0lmIl0sWzMsImR0eXBlIl0sWzMsInJhbmsiXSxbMywic2hhcGUiXSxbMywiaGFzSW5mT3JOYU4iXSxbMywic2l6ZSIsIm51bU5lZ2F0aXZlSW5mcyIsIm51bVBvc2l0aXZlSW5mcyIsIm51bU5hTnMiLCJudW1OZWdhdGl2ZUZpbml0ZXMiLCJudW1aZXJvcyIsIm51bVBvc2l0aXZlRmluaXRlcyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUXAoMCxaWCwxLDEsImRlYnVnLXRlbnNvci1kdHlwZSIsMCksUXAoMSxYWCwxLDEsImRlYnVnLXRlbnNvci1yYW5rIiwxKSxRcCgyLEtYLDEsMSwiZGVidWctdGVuc29yLXNoYXBlIiwyKSxRcCgzLEpYLDEsMSwiZGVidWctdGVuc29yLWhhcy1pbmYtb3ItbmFuIiwzKSxRcCg0LFFYLDEsNywiZGVidWctdGVuc29yLW51bWVyaWMtYnJlYWtkb3duIiw0KSksMiZlJiYoRG0oIm5nSWYiLHZvaWQgMCE9PW4uZGVidWdUZW5zb3JWYWx1ZS5kdHlwZSkscmMoMSksRG0oIm5nSWYiLHZvaWQgMCE9PW4uZGVidWdUZW5zb3JWYWx1ZS5yYW5rKSxyYygxKSxEbSgibmdJZiIsdm9pZCAwIT09bi5kZWJ1Z1RlbnNvclZhbHVlLnNoYXBlKSxyYygxKSxEbSgibmdJZiIsdm9pZCAwIT09bi5kZWJ1Z1RlbnNvclZhbHVlLmhhc0luZk9yTmFOKSxyYygxKSxEbSgibmdJZiIsdm9pZCAwIT09bi5kZWJ1Z1RlbnNvclZhbHVlLnNpemUpKX0sZGlyZWN0aXZlczpbZE0sdEssZUssbkssaUssb0tdLHN0eWxlczpbIltfbmdob3N0LSVDT01QJV0ge1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gICAgICB9XG4gICAgICBkZWJ1Zy10ZW5zb3ItbnVtZXJpYy1icmVha2Rvd25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgfSJdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChhSyxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJkZWJ1Zy10ZW5zb3ItdmFsdWUiLHRlbXBsYXRlOidcbiAgICA8ZGVidWctdGVuc29yLWR0eXBlXG4gICAgICAqbmdJZj0iZGVidWdUZW5zb3JWYWx1ZS5kdHlwZSAhPT0gdW5kZWZpbmVkIlxuICAgICAgW2R0eXBlXT0iZGVidWdUZW5zb3JWYWx1ZS5kdHlwZSJcbiAgICA+XG4gICAgPC9kZWJ1Zy10ZW5zb3ItZHR5cGU+XG4gICAgPGRlYnVnLXRlbnNvci1yYW5rXG4gICAgICAqbmdJZj0iZGVidWdUZW5zb3JWYWx1ZS5yYW5rICE9PSB1bmRlZmluZWQiXG4gICAgICBbcmFua109ImRlYnVnVGVuc29yVmFsdWUucmFuayJcbiAgICA+XG4gICAgPC9kZWJ1Zy10ZW5zb3ItcmFuaz5cbiAgICA8ZGVidWctdGVuc29yLXNoYXBlXG4gICAgICAqbmdJZj0iZGVidWdUZW5zb3JWYWx1ZS5zaGFwZSAhPT0gdW5kZWZpbmVkIlxuICAgICAgW3NoYXBlXT0iZGVidWdUZW5zb3JWYWx1ZS5zaGFwZSJcbiAgICA+XG4gICAgPC9kZWJ1Zy10ZW5zb3Itc2hhcGU+XG4gICAgPGRlYnVnLXRlbnNvci1oYXMtaW5mLW9yLW5hblxuICAgICAgKm5nSWY9ImRlYnVnVGVuc29yVmFsdWUuaGFzSW5mT3JOYU4gIT09IHVuZGVmaW5lZCJcbiAgICAgIFtoYXNJbmZPck5hTl09ImRlYnVnVGVuc29yVmFsdWUuaGFzSW5mT3JOYU4iXG4gICAgPlxuICAgIDwvZGVidWctdGVuc29yLWhhcy1pbmYtb3ItbmFuPlxuICAgIDxkZWJ1Zy10ZW5zb3ItbnVtZXJpYy1icmVha2Rvd25cbiAgICAgICpuZ0lmPSJkZWJ1Z1RlbnNvclZhbHVlLnNpemUgIT09IHVuZGVmaW5lZCJcbiAgICAgIHNpemU9Int7IGRlYnVnVGVuc29yVmFsdWUuc2l6ZSB9fSJcbiAgICAgIFtudW1OZWdhdGl2ZUluZnNdPSJkZWJ1Z1RlbnNvclZhbHVlLm51bU5lZ2F0aXZlSW5mcyJcbiAgICAgIFtudW1Qb3NpdGl2ZUluZnNdPSJkZWJ1Z1RlbnNvclZhbHVlLm51bVBvc2l0aXZlSW5mcyJcbiAgICAgIFtudW1OYU5zXT0iZGVidWdUZW5zb3JWYWx1ZS5udW1OYU5zIlxuICAgICAgW251bU5lZ2F0aXZlRmluaXRlc109ImRlYnVnVGVuc29yVmFsdWUubnVtTmVnYXRpdmVGaW5pdGVzIlxuICAgICAgW251bVplcm9zXT0iZGVidWdUZW5zb3JWYWx1ZS5udW1aZXJvcyJcbiAgICAgIFtudW1Qb3NpdGl2ZUZpbml0ZXNdPSJkZWJ1Z1RlbnNvclZhbHVlLm51bVBvc2l0aXZlRmluaXRlcyJcbiAgICA+XG4gICAgPC9kZWJ1Zy10ZW5zb3ItbnVtZXJpYy1icmVha2Rvd24+XG4gICcsc3R5bGVzOlsiXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICAgIH1cbiAgICAgIGRlYnVnLXRlbnNvci1udW1lcmljLWJyZWFrZG93biB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIH1cbiAgICAiXX1dfV0sbnVsbCx7ZGVidWdUZW5zb3JWYWx1ZTpbe3R5cGU6eHl9XX0pO2NvbnN0IHJLPWZ1bmN0aW9uKHQsZSl7cmV0dXJue3RlbnNvckRlYnVnTW9kZTp0LGFycmF5OmV9fTtmdW5jdGlvbiBzSyh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsMTIpLFJtKDEsImRpdiIsMTMpLGt1KDIpLEFtKCksUm0oMywiZGl2IiwxNCksVG0oNCwiZGVidWctdGVuc29yLXZhbHVlIiwxNSksQW0oKSxBbSgpKSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQsbj1lLmluZGV4LG89WW0oMyk7cmMoMiksRHUoIk91dHB1dCBzbG90ICIsbiwiOiIpLHJjKDIpLERtKCJkZWJ1Z1RlbnNvclZhbHVlIixvLnBhcnNlRGVidWdUZW5zb3JWYWx1ZSh2aCgyLHJLLG8udGVuc29yRGVidWdNb2RlLHQpKSl9fWZ1bmN0aW9uIGxLKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2IiwxMCksUXAoMSxzSyw1LDUsImRpdiIsMTEpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgyKTtyYygxKSxEbSgibmdGb3JPZiIsdC5kZWJ1Z1RlbnNvclZhbHVlcyl9fWZ1bmN0aW9uIGNLKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2IiksUm0oMSwiZGl2IiksUm0oMiwiZGl2IiwzKSxSbSgzLCJzcGFuIiw0KSxrdSg0LCIgT3A6ICIpLEFtKCksUm0oNSwic3BhbiIsNSksa3UoNiksQW0oKSxBbSgpLFJtKDcsImRpdiIsMyksUm0oOCwic3BhbiIsNCksa3UoOSwiICMgb2YgaW5wdXQgdGVuc29yczogIiksQW0oKSxSbSgxMCwic3BhbiIsNiksa3UoMTEpLEFtKCksQW0oKSxSbSgxMiwiZGl2IiwzKSxSbSgxMywic3BhbiIsNCksa3UoMTQsIiAjIG9mIG91dHB1dCB0ZW5zb3JzOiAiKSxBbSgpLFJtKDE1LCJzcGFuIiw3KSxrdSgxNiksQW0oKSxSbSgxNywic3BhbiIsOCksa3UoMTgpLEFtKCksQW0oKSxRcCgxOSxsSywyLDEsImRpdiIsOSksQW0oKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtyYyg2KSxEdSgiICIsdC5mb2N1c2VkRXhlY3V0aW9uRGF0YS5vcF90eXBlLCIgIikscmMoNSksRHUoIiAiLG51bGw9PXQuZm9jdXNlZEV4ZWN1dGlvbkRhdGEuaW5wdXRfdGVuc29yX2lkcz8wOnQuZm9jdXNlZEV4ZWN1dGlvbkRhdGEuaW5wdXRfdGVuc29yX2lkcy5sZW5ndGgsIiAiKSxyYyg1KSxEdSgiICIsbnVsbD09dC5mb2N1c2VkRXhlY3V0aW9uRGF0YS5vdXRwdXRfdGVuc29yX2lkcz8wOnQuZm9jdXNlZEV4ZWN1dGlvbkRhdGEub3V0cHV0X3RlbnNvcl9pZHMubGVuZ3RoLCIgIikscmMoMiksRHUoIiAoZGVidWcgbW9kZTogIix0LlRlbnNvckRlYnVnTW9kZVt0LnRlbnNvckRlYnVnTW9kZV0sIikgIikscmMoMSksRG0oIm5nSWYiLHQuaGFzRGVidWdUZW5zb3JWYWx1ZXMpfX1mdW5jdGlvbiBkSyh0LGUpe31jbGFzcyBwS3tjb25zdHJ1Y3Rvcigpe3RoaXMudGVuc29yRGVidWdNb2RlPW1aLlVOU1BFQ0lGSUVELHRoaXMuaGFzRGVidWdUZW5zb3JWYWx1ZXM9ITEsdGhpcy5kZWJ1Z1RlbnNvclZhbHVlcz1udWxsLHRoaXMuZGVidWdUZW5zb3JEdHlwZXM9bnVsbCx0aGlzLlRlbnNvckRlYnVnTW9kZT1tWix0aGlzLnBhcnNlRGVidWdUZW5zb3JWYWx1ZT1IWH19cEsuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHBLKX0scEsuybVjbXA9dG8oe3R5cGU6cEssc2VsZWN0b3JzOltbImV4ZWN1dGlvbi1kYXRhLWNvbXBvbmVudCJdXSxpbnB1dHM6e2ZvY3VzZWRFeGVjdXRpb25JbmRleDoiZm9jdXNlZEV4ZWN1dGlvbkluZGV4Iixmb2N1c2VkRXhlY3V0aW9uRGF0YToiZm9jdXNlZEV4ZWN1dGlvbkRhdGEiLHRlbnNvckRlYnVnTW9kZToidGVuc29yRGVidWdNb2RlIixoYXNEZWJ1Z1RlbnNvclZhbHVlczoiaGFzRGVidWdUZW5zb3JWYWx1ZXMiLGRlYnVnVGVuc29yVmFsdWVzOiJkZWJ1Z1RlbnNvclZhbHVlcyIsZGVidWdUZW5zb3JEdHlwZXM6ImRlYnVnVGVuc29yRHR5cGVzIn0sZGVjbHM6Nyx2YXJzOjMsY29uc3RzOltbMSwiZm9jdXMtZXhlY3V0aW9uLWNvbnRhaW5lciJdLFs0LCJuZ0lmIiwibmdJZkVsc2UiXSxbImxvYWRpbmdfc2VjdGlvbiIsIiJdLFsxLCJleGVjdXRpb24tZGF0YS1maWVsZCJdLFsxLCJleGVjdXRpb24tZGF0YS1rZXkiXSxbMSwiZXhlY3V0aW9uLWRhdGEtdmFsdWUiLCJvcC10eXBlIl0sWzEsImV4ZWN1dGlvbi1kYXRhLXZhbHVlIiwiaW5wdXQtdGVuc29ycyJdLFsxLCJleGVjdXRpb24tZGF0YS12YWx1ZSIsIm91dHB1dC10ZW5zb3JzIl0sWzEsImV4ZWN1dGlvbi1kYXRhLXZhbHVlIl0sWyJjbGFzcyIsIm91dHB1dC1zbG90cyIsNCwibmdJZiJdLFsxLCJvdXRwdXQtc2xvdHMiXSxbImNsYXNzIiwib3V0cHV0LXNsb3QtY29udGFpbmVyIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbMSwib3V0cHV0LXNsb3QtY29udGFpbmVyIl0sWzEsIm91dHB1dC1zbG90LW51bWJlciJdLFsxLCJvdXRwdXQtc2xvdC1kZWJ1Zy10ZW5zb3ItdmFsdWUiXSxbMywiZGVidWdUZW5zb3JWYWx1ZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoUm0oMCwiZGl2IiwwKSxSbSgxLCJkaXYiKSxSbSgyLCJzcGFuIiksa3UoMyksQW0oKSxBbSgpLFFwKDQsY0ssMjAsNSwiZGl2IiwxKSxRcCg1LGRLLDAsMCwibmctdGVtcGxhdGUiLG51bGwsMixpYiksQW0oKSksMiZlKXtjb25zdCB0PSRwKDYpO3JjKDMpLER1KCIgUHl0aG9uIEV4ZWN1dGlvbiAjIixuLmZvY3VzZWRFeGVjdXRpb25JbmRleCwiICIpLHJjKDEpLERtKCJuZ0lmIixudWxsIT09bi5mb2N1c2VkRXhlY3V0aW9uRGF0YSkoIm5nSWZFbHNlIix0KX19LGRpcmVjdGl2ZXM6W2RNLGxNLGFLXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0uZGVidWctdGVuc29yLXZhbHVlcy10YWJsZVtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJX0uZGVidWctdGVuc29yLXZhbHVlcy10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0ZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgIzAwMDt0ZXh0LWFsaWduOmxlZnR9LmRlYnVnLXRlbnNvci12YWx1ZXMtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde3RleHQtYWxpZ246bGVmdH0uZXhlY3V0aW9uLWRhdGEtZmllbGRbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcH0uZXhlY3V0aW9uLWRhdGEta2V5W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmlubGluZS1ibG9jazttYXgtd2lkdGg6MTIwcHg7dGV4dC1hbGlnbjpyaWdodDt3aWR0aDoxMjBweH0uZXhlY3V0aW9uLWRhdGEtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1sZWZ0OjEwcHh9LmZvY3VzLWV4ZWN1dGlvbi1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmY2M4MDtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MTJweDtoZWlnaHQ6MTIwcHg7cGFkZGluZzo1cHg7d2lkdGg6MzYwcHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmZvY3VzLWV4ZWN1dGlvbi1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuZm9jdXMtZXhlY3V0aW9uLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTY1MTAwfS5vdXRwdXQtc2xvdHNbX25nY29udGVudC0lQ09NUCVde2hlaWdodDo2MHB4O292ZXJmbG93LXg6YXV0bztvdmVyZmxvdy15OmF1dG99Lm91dHB1dC1zbG90LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgI2ViZWJlYjttYXJnaW4tdG9wOjVweDtwYWRkaW5nOjJweCAwO3ZlcnRpY2FsLWFsaWduOnRvcH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAub3V0cHV0LXNsb3QtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLm91dHB1dC1zbG90LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgIzU1NX0ub3V0cHV0LXNsb3QtbnVtYmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO2ZvbnQtZmFtaWx5OiJSb2JvdG8gTW9ubyIsbW9ub3NwYWNlfS5vdXRwdXQtc2xvdC1kZWJ1Zy10ZW5zb3ItdmFsdWVbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjNweCAwIDNweCAzMHB4fS5vdXRwdXQtdGVuc29yc1tfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDo1cHh9J119KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHBLLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImV4ZWN1dGlvbi1kYXRhLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vZXhlY3V0aW9uX2RhdGFfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vZXhlY3V0aW9uX2RhdGFfY29tcG9uZW50LmNzcyJdfV19XSxudWxsLHtmb2N1c2VkRXhlY3V0aW9uSW5kZXg6W3t0eXBlOnh5fV0sZm9jdXNlZEV4ZWN1dGlvbkRhdGE6W3t0eXBlOnh5fV0sdGVuc29yRGVidWdNb2RlOlt7dHlwZTp4eX1dLGhhc0RlYnVnVGVuc29yVmFsdWVzOlt7dHlwZTp4eX1dLGRlYnVnVGVuc29yVmFsdWVzOlt7dHlwZTp4eX1dLGRlYnVnVGVuc29yRHR5cGVzOlt7dHlwZTp4eX1dfSk7Y29uc3QgbUs9IlVua25vd24gZHR5cGUiO2NsYXNzIHVLe2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLmZvY3VzZWRFeGVjdXRpb25EYXRhJD10aGlzLnN0b3JlLnBpcGUoRncobVgpKSx0aGlzLnRlbnNvckRlYnVnTW9kZSQ9dGhpcy5zdG9yZS5waXBlKEZ3KFp3KG1YLCh0PT5udWxsPT09dD9tWi5VTlNQRUNJRklFRDp0LnRlbnNvcl9kZWJ1Z19tb2RlKSkpKSx0aGlzLmhhc0RlYnVnVGVuc29yVmFsdWVzJD10aGlzLnN0b3JlLnBpcGUoRncoWncobVgsKHQ9PntpZihudWxsPT09dHx8bnVsbD09PXQuZGVidWdfdGVuc29yX3ZhbHVlcylyZXR1cm4hMTtmb3IoY29uc3QgZSBvZiB0LmRlYnVnX3RlbnNvcl92YWx1ZXMpaWYobnVsbCE9PWUmJmUubGVuZ3RoPjApcmV0dXJuITA7cmV0dXJuITF9KSkpKSx0aGlzLmRlYnVnVGVuc29yVmFsdWVzJD10aGlzLnN0b3JlLnBpcGUoRncoWncobVgsKHQ9Pm51bGw9PT10P251bGw6dC5kZWJ1Z190ZW5zb3JfdmFsdWVzKSkpKSx0aGlzLmRlYnVnVGVuc29yRHR5cGVzJD10aGlzLnN0b3JlLnBpcGUoRncoWncobVgsKHQ9PntpZihudWxsPT09dHx8bnVsbD09PXQuZGVidWdfdGVuc29yX3ZhbHVlcylyZXR1cm4gbnVsbDtpZih0LnRlbnNvcl9kZWJ1Z19tb2RlIT09bVouRlVMTF9IRUFMVEgmJnQudGVuc29yX2RlYnVnX21vZGUhPT1tWi5TSEFQRSlyZXR1cm4gbnVsbDtjb25zdCBlPVtdO2Zvcihjb25zdCBuIG9mIHQuZGVidWdfdGVuc29yX3ZhbHVlcylpZihudWxsPT09billLnB1c2gobUspO2Vsc2V7Y29uc3Qgbz1TdHJpbmcodC50ZW5zb3JfZGVidWdfbW9kZT09PW1aLkZVTExfSEVBTFRIP25bMl06blsxXSk7ZS5wdXNoKElYW29dfHxtSyl9cmV0dXJuIGV9KSkpKX19ZnVuY3Rpb24gZksodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJtYXQtc2xpZGVyIiwxMSksVm0oImlucHV0IiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oMikub25TbGlkZXJDaGFuZ2UuZW1pdChuLnZhbHVlKX0pKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgyKTtEbSgibWluIiwwKSgibWF4Iix0LnNjcm9sbEJlZ2luSW5kZXhVcHBlckxpbWl0KSgidmFsdWUiLHQuc2Nyb2xsQmVnaW5JbmRleCl9fWZ1bmN0aW9uIGdLKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2Iiw2KSxSbSgxLCJidXR0b24iLDcpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5vbk5hdmlnYXRlTGVmdC5lbWl0KCl9KSksa3UoMiwiIDwgIiksQW0oKSxSbSgzLCJkaXYiLDgpLGt1KDQpLEFtKCksUm0oNSwiYnV0dG9uIiw5KSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLFltKCkub25OYXZpZ2F0ZVJpZ2h0LmVtaXQoKX0pKSxrdSg2LCIgPiAiKSxBbSgpLFFwKDcsZkssMSwzLCJtYXQtc2xpZGVyIiwxMCksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKTtyYyg0KSxSdSgiICIsdC5zY3JvbGxCZWdpbkluZGV4LCIgfiAiLHQuc2Nyb2xsQmVnaW5JbmRleCt0LmRpc3BsYXlDb3VudC0xLCIgb2YgIix0Lm51bUV4ZWN1dGlvbnMsIiAiKSxyYygzKSxEbSgibmdJZiIsdC5zY3JvbGxCZWdpbkluZGV4VXBwZXJMaW1pdD4wKX19dUsuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHVLKShTbShJdykpfSx1Sy7JtWNtcD10byh7dHlwZTp1SyxzZWxlY3RvcnM6W1sidGYtZGVidWdnZXItdjItZXhlY3V0aW9uLWRhdGEiXV0saW5wdXRzOntmb2N1c2VkRXhlY3V0aW9uSW5kZXg6ImZvY3VzZWRFeGVjdXRpb25JbmRleCJ9LGRlY2xzOjYsdmFyczoxNixjb25zdHM6W1szLCJmb2N1c2VkRXhlY3V0aW9uSW5kZXgiLCJmb2N1c2VkRXhlY3V0aW9uRGF0YSIsInRlbnNvckRlYnVnTW9kZSIsImhhc0RlYnVnVGVuc29yVmFsdWVzIiwiZGVidWdUZW5zb3JWYWx1ZXMiLCJkZWJ1Z1RlbnNvckR0eXBlcyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwiZXhlY3V0aW9uLWRhdGEtY29tcG9uZW50IiwwKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQWgoMywiYXN5bmMiKSxBaCg0LCJhc3luYyIpLEFoKDUsImFzeW5jIikpLDImZSYmRG0oImZvY3VzZWRFeGVjdXRpb25JbmRleCIsbi5mb2N1c2VkRXhlY3V0aW9uSW5kZXgpKCJmb2N1c2VkRXhlY3V0aW9uRGF0YSIsVGgoMSw2LG4uZm9jdXNlZEV4ZWN1dGlvbkRhdGEkKSkoInRlbnNvckRlYnVnTW9kZSIsVGgoMiw4LG4udGVuc29yRGVidWdNb2RlJCkpKCJoYXNEZWJ1Z1RlbnNvclZhbHVlcyIsVGgoMywxMCxuLmhhc0RlYnVnVGVuc29yVmFsdWVzJCkpKCJkZWJ1Z1RlbnNvclZhbHVlcyIsVGgoNCwxMixuLmRlYnVnVGVuc29yVmFsdWVzJCkpKCJkZWJ1Z1RlbnNvckR0eXBlcyIsVGgoNSwxNCxuLmRlYnVnVGVuc29yRHR5cGVzJCkpfSxkaXJlY3RpdmVzOltwS10scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHVLLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InRmLWRlYnVnZ2VyLXYyLWV4ZWN1dGlvbi1kYXRhIix0ZW1wbGF0ZTonXG4gICAgPGV4ZWN1dGlvbi1kYXRhLWNvbXBvbmVudFxuICAgICAgW2ZvY3VzZWRFeGVjdXRpb25JbmRleF09ImZvY3VzZWRFeGVjdXRpb25JbmRleCJcbiAgICAgIFtmb2N1c2VkRXhlY3V0aW9uRGF0YV09ImZvY3VzZWRFeGVjdXRpb25EYXRhJCB8IGFzeW5jIlxuICAgICAgW3RlbnNvckRlYnVnTW9kZV09InRlbnNvckRlYnVnTW9kZSQgfCBhc3luYyJcbiAgICAgIFtoYXNEZWJ1Z1RlbnNvclZhbHVlc109Imhhc0RlYnVnVGVuc29yVmFsdWVzJCB8IGFzeW5jIlxuICAgICAgW2RlYnVnVGVuc29yVmFsdWVzXT0iZGVidWdUZW5zb3JWYWx1ZXMkIHwgYXN5bmMiXG4gICAgICBbZGVidWdUZW5zb3JEdHlwZXNdPSJkZWJ1Z1RlbnNvckR0eXBlcyQgfCBhc3luYyJcbiAgICA+PC9leGVjdXRpb24tZGF0YS1jb21wb25lbnQ+XG4gICd9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSkse2ZvY3VzZWRFeGVjdXRpb25JbmRleDpbe3R5cGU6eHl9XX0pO2NvbnN0IGhLPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm5bdCxlLG5dfTtmdW5jdGlvbiBiSyh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsImRpdiIsMTQpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUoKXtjb25zdCBuPWhpKHQpLmluZGV4O3JldHVybiBZbSgyKS5vbkV4ZWN1dGlvbkRpZ2VzdENsaWNrZWQuZW1pdChuKX0pKSxSbSgxLCJkaXYiLDE1KSxrdSgyKSxBbSgpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49ZS5pbmRleCxvPVltKDIpO3JjKDEpLEttKCJ0aXRsZSIsdC5vcF90eXBlKSxEbSgibmdDbGFzcyIseGgoMyxoSyx0LmlzX2dyYXBoPyJmdW5jLWdyYXBoLWV4ZWN1dGlvbiI6IiIsbj09PW8uZm9jdXNlZEV4ZWN1dGlvbkRpc3BsYXlJbmRleD8iZm9jdXNlZCI6IiIsby5kaXNwbGF5Rm9jdXNlZEFsZXJ0VHlwZXNbbl18fCIiKSkscmMoMSksRHUoIiAiLHQuc2hvcnRfb3BfdHlwZSwiICIpfX1mdW5jdGlvbiB5Syh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsMTIpLFFwKDEsYkssMyw3LCJkaXYiLDEzKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtyYygxKSxEbSgibmdGb3JPZiIsdC5kaXNwbGF5RXhlY3V0aW9uRGlnZXN0cyl9fWZ1bmN0aW9uIF9LKHQsZSl7aWYoMSZ0JiYoTm0oMCksVG0oMSwidGYtZGVidWdnZXItdjItZXhlY3V0aW9uLWRhdGEiLDE2KSx6bSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtyYygxKSxEbSgiZm9jdXNlZEV4ZWN1dGlvbkluZGV4Iix0LmZvY3VzZWRFeGVjdXRpb25JbmRleCl9fWNsYXNzIENLe2NvbnN0cnVjdG9yKCl7dGhpcy5hY3RpdmVSdW5JZD1udWxsLHRoaXMubG9hZGluZ051bUV4ZWN1dGlvbnM9ITEsdGhpcy5udW1FeGVjdXRpb25zPTAsdGhpcy5zY3JvbGxCZWdpbkluZGV4PTAsdGhpcy5zY3JvbGxCZWdpbkluZGV4VXBwZXJMaW1pdD0wLHRoaXMucGFnZVNpemU9MCx0aGlzLmRpc3BsYXlDb3VudD0wLHRoaXMuZGlzcGxheUV4ZWN1dGlvbkRpZ2VzdHM9W10sdGhpcy5kaXNwbGF5Rm9jdXNlZEFsZXJ0VHlwZXM9W10sdGhpcy5mb2N1c2VkRXhlY3V0aW9uSW5kZXg9bnVsbCx0aGlzLmZvY3VzZWRFeGVjdXRpb25EaXNwbGF5SW5kZXg9bnVsbCx0aGlzLmZvY3VzZWRFeGVjdXRpb25EYXRhPW51bGwsdGhpcy5vbk5hdmlnYXRlTGVmdD1uZXcgTGgsdGhpcy5vbk5hdmlnYXRlUmlnaHQ9bmV3IExoLHRoaXMub25FeGVjdXRpb25EaWdlc3RDbGlja2VkPW5ldyBMaCx0aGlzLm9uU2xpZGVyQ2hhbmdlPW5ldyBMaH19Q0suybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fENLKX0sQ0suybVjbXA9dG8oe3R5cGU6Q0ssc2VsZWN0b3JzOltbInRpbWVsaW5lLWNvbXBvbmVudCJdXSxpbnB1dHM6e2FjdGl2ZVJ1bklkOiJhY3RpdmVSdW5JZCIsbG9hZGluZ051bUV4ZWN1dGlvbnM6ImxvYWRpbmdOdW1FeGVjdXRpb25zIixudW1FeGVjdXRpb25zOiJudW1FeGVjdXRpb25zIixzY3JvbGxCZWdpbkluZGV4OiJzY3JvbGxCZWdpbkluZGV4IixzY3JvbGxCZWdpbkluZGV4VXBwZXJMaW1pdDoic2Nyb2xsQmVnaW5JbmRleFVwcGVyTGltaXQiLHBhZ2VTaXplOiJwYWdlU2l6ZSIsZGlzcGxheUNvdW50OiJkaXNwbGF5Q291bnQiLGRpc3BsYXlFeGVjdXRpb25EaWdlc3RzOiJkaXNwbGF5RXhlY3V0aW9uRGlnZXN0cyIsZGlzcGxheUZvY3VzZWRBbGVydFR5cGVzOiJkaXNwbGF5Rm9jdXNlZEFsZXJ0VHlwZXMiLGZvY3VzZWRFeGVjdXRpb25JbmRleDoiZm9jdXNlZEV4ZWN1dGlvbkluZGV4Iixmb2N1c2VkRXhlY3V0aW9uRGlzcGxheUluZGV4OiJmb2N1c2VkRXhlY3V0aW9uRGlzcGxheUluZGV4Iixmb2N1c2VkRXhlY3V0aW9uRGF0YToiZm9jdXNlZEV4ZWN1dGlvbkRhdGEifSxvdXRwdXRzOntvbk5hdmlnYXRlTGVmdDoib25OYXZpZ2F0ZUxlZnQiLG9uTmF2aWdhdGVSaWdodDoib25OYXZpZ2F0ZVJpZ2h0IixvbkV4ZWN1dGlvbkRpZ2VzdENsaWNrZWQ6Im9uRXhlY3V0aW9uRGlnZXN0Q2xpY2tlZCIsb25TbGlkZXJDaGFuZ2U6Im9uU2xpZGVyQ2hhbmdlIn0sZGVjbHM6OSx2YXJzOjQsY29uc3RzOltbMSwidGltZWxpbmUtdGl0bGUiXSxbMSwiZXhlY3V0aW9uLWNvdW50Il0sWzEsInRvcC1sZXZlbC1leGVjdXRpb25zIl0sWyJjbGFzcyIsIm5hdmlnYXRpb24tc2VjdGlvbiIsNCwibmdJZiJdLFsiY2xhc3MiLCJleGVjdXRpb24tdGltZWxpbmUiLDQsIm5nSWYiXSxbNCwibmdJZiJdLFsxLCJuYXZpZ2F0aW9uLXNlY3Rpb24iXSxbIm1hdC1idXR0b24iLCIiLDEsIm5hdmlnYXRpb24tYnV0dG9uLWxlZnQiLDMsImNsaWNrIl0sWzEsIm5hdmlnYXRpb24tcG9zaXRpb24taW5mbyJdLFsibWF0LWJ1dHRvbiIsIiIsMSwibmF2aWdhdGlvbi1idXR0b24tcmlnaHQiLDMsImNsaWNrIl0sWyJjbGFzcyIsInRpbWVsaW5lLXNsaWRlciIsInN0ZXAiLCIxIiwzLCJtaW4iLCJtYXgiLCJ2YWx1ZSIsImlucHV0Iiw0LCJuZ0lmIl0sWyJzdGVwIiwiMSIsMSwidGltZWxpbmUtc2xpZGVyIiwzLCJtaW4iLCJtYXgiLCJ2YWx1ZSIsImlucHV0Il0sWzEsImV4ZWN1dGlvbi10aW1lbGluZSJdLFszLCJjbGljayIsNCwibmdGb3IiLCJuZ0Zvck9mIl0sWzMsImNsaWNrIl0sWzEsImV4ZWN1dGlvbi1kaWdlc3QiLDMsIm5nQ2xhc3MiLCJ0aXRsZSJdLFszLCJmb2N1c2VkRXhlY3V0aW9uSW5kZXgiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImRpdiIpLFJtKDEsImRpdiIsMCksa3UoMiwiIFB5dGhvbiBFeGVjdXRpb24gVGltZWxpbmUgIiksUm0oMywic3BhbiIsMSksa3UoNCksQW0oKSxBbSgpLFJtKDUsImRpdiIsMiksUXAoNixnSyw4LDQsImRpdiIsMyksUXAoNyx5SywyLDEsImRpdiIsNCksUXAoOCxfSywyLDEsIm5nLWNvbnRhaW5lciIsNSksQW0oKSxBbSgpKSwyJmUmJihyYyg0KSxEdSgiICgiLG4ubnVtRXhlY3V0aW9ucywiKSAiKSxyYygyKSxEbSgibmdJZiIsbi5udW1FeGVjdXRpb25zKSxyYygxKSxEbSgibmdJZiIsbi5udW1FeGVjdXRpb25zKSxyYygxKSxEbSgibmdJZiIsbnVsbCE9PW4uYWN0aXZlUnVuSWQmJm51bGwhPT1uLmZvY3VzZWRFeGVjdXRpb25JbmRleCkpfSxkaXJlY3RpdmVzOltkTSxYSCxSWCxsTSxhTSx1S10sc3R5bGVzOlsiLmV4ZWN1dGlvbi1kaWdlc3RbX25nY29udGVudC0lQ09NUCVdIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2UzZTVlODtcbiAgYm9yZGVyOiAxcHggc29saWQgI2MwYzBjMDtcbiAgY29sb3I6ICM0MjUwNjY7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgZm9udC1zaXplOiAxMHB4O1xuICBoZWlnaHQ6IDE1cHg7XG4gIHBhZGRpbmc6IDFweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB3aWR0aDogMTJweDtcbn1cblxuLmV4ZWN1dGlvbi1kaWdlc3QuZnVuYy1ncmFwaC1leGVjdXRpb25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M3ZGJmNTtcbiAgY29sb3I6ICM0ZTU2NjQ7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuXG4uZXhlY3V0aW9uLWRpZ2VzdC5mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmQ0YjM7XG4gIGJvcmRlcjogMXB4IHNvbGlkICMwMDA7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4uZXhlY3V0aW9uLWRpZ2VzdC5JbmZOYW5BbGVydFtfbmdjb250ZW50LSVDT01QJV0ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTUyNTkyO1xuICBjb2xvcjogI2ZmZjtcbn1cblxuXG4uZXhlY3V0aW9uLWRpZ2VzdFtfbmdjb250ZW50LSVDT01QJV06aG92ZXIge1xuICBib3JkZXI6IDFweCBzb2xpZCAjMDAwO1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLmV4ZWN1dGlvbi10aW1lbGluZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBmbGV4O1xuICBvdmVyZmxvdy14OiBoaWRkZW47XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXJnaW4tdG9wOiA1cHg7XG4gIG1hcmdpbi1ib3R0b206IDVweDtcbn1cblxuLnRpbWVsaW5lLXNsaWRlcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGhlaWdodDogNDhweDtcbiAgbGVmdDogMzQwcHg7IFxuICBwYWRkaW5nOiAwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHJpZ2h0OiA0MHB4O1xufVxuXG4gIC50aW1lbGluZS1zbGlkZXIgLm1hdC1zbGlkZXItdGh1bWIge1xuICBib3JkZXItcmFkaXVzOiA1cHg7XG4gIHJpZ2h0OiAtNDBweDtcbiAgd2lkdGg6IDgwcHg7XG59XG5cblxuLm5hdmlnYXRpb24tcG9zaXRpb24taW5mb1tfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogbm9ybWFsO1xuICBtYXgtd2lkdGg6IDIwMHB4O1xuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDEwcHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLm5hdmlnYXRpb24tc2VjdGlvbltfbmdjb250ZW50LSVDT01QJV0ge1xuICBoZWlnaHQ6IDQ4cHg7XG4gIGxpbmUtaGVpZ2h0OiA0OHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHdpZHRoOiAxMDAlO1xufSJdLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChDSyxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJ0aW1lbGluZS1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiIuL3RpbWVsaW5lX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyIuL3RpbWVsaW5lX2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSxudWxsLHthY3RpdmVSdW5JZDpbe3R5cGU6eHl9XSxsb2FkaW5nTnVtRXhlY3V0aW9uczpbe3R5cGU6eHl9XSxudW1FeGVjdXRpb25zOlt7dHlwZTp4eX1dLHNjcm9sbEJlZ2luSW5kZXg6W3t0eXBlOnh5fV0sc2Nyb2xsQmVnaW5JbmRleFVwcGVyTGltaXQ6W3t0eXBlOnh5fV0scGFnZVNpemU6W3t0eXBlOnh5fV0sZGlzcGxheUNvdW50Olt7dHlwZTp4eX1dLGRpc3BsYXlFeGVjdXRpb25EaWdlc3RzOlt7dHlwZTp4eX1dLGRpc3BsYXlGb2N1c2VkQWxlcnRUeXBlczpbe3R5cGU6eHl9XSxmb2N1c2VkRXhlY3V0aW9uSW5kZXg6W3t0eXBlOnh5fV0sZm9jdXNlZEV4ZWN1dGlvbkRpc3BsYXlJbmRleDpbe3R5cGU6eHl9XSxmb2N1c2VkRXhlY3V0aW9uRGF0YTpbe3R5cGU6eHl9XSxvbk5hdmlnYXRlTGVmdDpbe3R5cGU6T3l9XSxvbk5hdmlnYXRlUmlnaHQ6W3t0eXBlOk95fV0sb25FeGVjdXRpb25EaWdlc3RDbGlja2VkOlt7dHlwZTpPeX1dLG9uU2xpZGVyQ2hhbmdlOlt7dHlwZTpPeX1dfSk7Y29uc3QgTUs9WyJfX2ZvcndhcmRfIiwiX19iYWNrd2FyZF8iLCJfX2luZmVyZW5jZV8iXTtjbGFzcyB2S3tjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5hY3RpdmVSdW5JZCQ9dGhpcy5zdG9yZS5waXBlKEZ3KGtaKSksdGhpcy5sb2FkaW5nTnVtRXhlY3V0aW9ucyQ9dGhpcy5zdG9yZS5waXBlKEZ3KFp3KEhaLCh0PT50LnN0YXRlPT15RS5MT0FESU5HKSkpKSx0aGlzLnNjcm9sbEJlZ2luSW5kZXgkPXRoaXMuc3RvcmUucGlwZShGdyhCWikpLHRoaXMuc2Nyb2xsQmVnaW5JbmRleFVwcGVyTGltaXQkPXRoaXMuc3RvcmUucGlwZShGdyhadyhMWixqWiwoKHQsZSk9Pk1hdGgubWF4KDAsdC1lKSkpKSksdGhpcy5wYWdlU2l6ZSQ9dGhpcy5zdG9yZS5waXBlKEZ3KFZaKSksdGhpcy5kaXNwbGF5Q291bnQkPXRoaXMuc3RvcmUucGlwZShGdyhqWikpLHRoaXMuZGlzcGxheUV4ZWN1dGlvbkRpZ2VzdHMkPXRoaXMuc3RvcmUucGlwZShGdyhadyhVWiwodD0+dC5tYXAoKHQ9PihmdW5jdGlvbiBlKHQsbj0xKXtpZighdClyZXR1cm57b3BfdHlwZToiKE4vQSkiLHNob3J0X29wX3R5cGU6Ii4uIixpc19ncmFwaDohMX07Y29uc3Qgbz1NSy5maWx0ZXIoKGU9PnQub3BfdHlwZS5zdGFydHNXaXRoKGUpKSk7aWYoby5sZW5ndGgpe2NvbnN0IGU9dC5vcF90eXBlLnNsaWNlKG9bMF0ubGVuZ3RoKTtyZXR1cm57b3BfdHlwZTp0Lm9wX3R5cGUsc2hvcnRfb3BfdHlwZTplLnNsaWNlKDAsbiksaXNfZ3JhcGg6ITB9fXJldHVybntvcF90eXBlOnQub3BfdHlwZSxzaG9ydF9vcF90eXBlOnQub3BfdHlwZS5zbGljZSgwLG4pLGlzX2dyYXBoOiExfX0pKHQpKSkpKSkpLHRoaXMuZGlzcGxheUZvY3VzZWRBbGVydFR5cGVzJD10aGlzLnN0b3JlLnBpcGUoRncoYVgpKSx0aGlzLmZvY3VzZWRFeGVjdXRpb25JbmRleCQ9dGhpcy5zdG9yZS5waXBlKEZ3KHNYKSksdGhpcy5mb2N1c2VkRXhlY3V0aW9uRGlzcGxheUluZGV4JD10aGlzLnN0b3JlLnBpcGUoRncobFgpKSx0aGlzLm51bUV4ZWN1dGlvbnMkPXRoaXMuc3RvcmUucGlwZShGdyhMWikpfW9uTmF2aWdhdGVMZWZ0KCl7dGhpcy5zdG9yZS5kaXNwYXRjaChXcSgpKX1vbk5hdmlnYXRlUmlnaHQoKXt0aGlzLnN0b3JlLmRpc3BhdGNoKFlxKCkpfW9uRXhlY3V0aW9uRGlnZXN0Q2xpY2tlZCh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKFpxKHtkaXNwbGF5SW5kZXg6dH0pKX1vblNsaWRlckNoYW5nZSh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKHFxKHtpbmRleDp0fSkpfX1mdW5jdGlvbiB4Syh0LGUpezEmdCYmKFJtKDAsInNwYW4iKSxrdSgxLCIgT3V0cHV0ICIpLEFtKCkpfWZ1bmN0aW9uIE9LKHQsZSl7MSZ0JiYoUm0oMCwic3BhbiIpLGt1KDEsIiBJbnB1dCAiKSxBbSgpKX1mdW5jdGlvbiBQSyh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsNiksUm0oMSwic3BhbiIsNyksUXAoMix4SywyLDAsInNwYW4iLDgpLFFwKDMsT0ssMiwwLCJzcGFuIiw4KSxBbSgpLGt1KDQpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpO3JjKDEpLERtKCJuZ1N3aXRjaCIsdC5raW5kKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIiwiaW5wdXQiKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIiwiY29uc3VtZXIiKSxyYygxKSxEdSgiIHNsb3Q6ICIsdC5zbG90LCIgIil9fWZ1bmN0aW9uIHdLKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2Iiw5KSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtyYygxKSxEdSgiICIsdC5vcERhdGEub3BfdHlwZSwiICIpfX1mdW5jdGlvbiBrSyh0LGUpezEmdCYmKFJtKDAsInNwYW4iLDEwKSxrdSgxLCIgKE9wIGluZm8gdW5hdmFpbGFibGUuKSAiKSxBbSgpKX12Sy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8dkspKFNtKEl3KSl9LHZLLsm1Y21wPXRvKHt0eXBlOnZLLHNlbGVjdG9yczpbWyJ0Zi1kZWJ1Z2dlci12Mi10aW1lbGluZSJdXSxkZWNsczoxMix2YXJzOjMzLGNvbnN0czpbWzMsImFjdGl2ZVJ1bklkIiwibG9hZGluZ051bUV4ZWN1dGlvbnMiLCJudW1FeGVjdXRpb25zIiwic2Nyb2xsQmVnaW5JbmRleCIsInNjcm9sbEJlZ2luSW5kZXhVcHBlckxpbWl0IiwicGFnZVNpemUiLCJkaXNwbGF5Q291bnQiLCJkaXNwbGF5RXhlY3V0aW9uRGlnZXN0cyIsImRpc3BsYXlGb2N1c2VkQWxlcnRUeXBlcyIsImZvY3VzZWRFeGVjdXRpb25JbmRleCIsImZvY3VzZWRFeGVjdXRpb25EaXNwbGF5SW5kZXgiLCJvbk5hdmlnYXRlTGVmdCIsIm9uTmF2aWdhdGVSaWdodCIsIm9uRXhlY3V0aW9uRGlnZXN0Q2xpY2tlZCIsIm9uU2xpZGVyQ2hhbmdlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJ0aW1lbGluZS1jb21wb25lbnQiLDApLFZtKCJvbk5hdmlnYXRlTGVmdCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbk5hdmlnYXRlTGVmdCgpfSkpKCJvbk5hdmlnYXRlUmlnaHQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25OYXZpZ2F0ZVJpZ2h0KCl9KSkoIm9uRXhlY3V0aW9uRGlnZXN0Q2xpY2tlZCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25FeGVjdXRpb25EaWdlc3RDbGlja2VkKGUpfSkpKCJvblNsaWRlckNoYW5nZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25TbGlkZXJDaGFuZ2UoZSl9KSksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQWgoNCwiYXN5bmMiKSxBaCg1LCJhc3luYyIpLEFoKDYsImFzeW5jIiksQWgoNywiYXN5bmMiKSxBaCg4LCJhc3luYyIpLEFoKDksImFzeW5jIiksQWgoMTAsImFzeW5jIiksQWgoMTEsImFzeW5jIiksQW0oKSksMiZlJiZEbSgiYWN0aXZlUnVuSWQiLFRoKDEsMTEsbi5hY3RpdmVSdW5JZCQpKSgibG9hZGluZ051bUV4ZWN1dGlvbnMiLFRoKDIsMTMsbi5sb2FkaW5nTnVtRXhlY3V0aW9ucyQpKSgibnVtRXhlY3V0aW9ucyIsVGgoMywxNSxuLm51bUV4ZWN1dGlvbnMkKSkoInNjcm9sbEJlZ2luSW5kZXgiLFRoKDQsMTcsbi5zY3JvbGxCZWdpbkluZGV4JCkpKCJzY3JvbGxCZWdpbkluZGV4VXBwZXJMaW1pdCIsVGgoNSwxOSxuLnNjcm9sbEJlZ2luSW5kZXhVcHBlckxpbWl0JCkpKCJwYWdlU2l6ZSIsVGgoNiwyMSxuLnBhZ2VTaXplJCkpKCJkaXNwbGF5Q291bnQiLFRoKDcsMjMsbi5kaXNwbGF5Q291bnQkKSkoImRpc3BsYXlFeGVjdXRpb25EaWdlc3RzIixUaCg4LDI1LG4uZGlzcGxheUV4ZWN1dGlvbkRpZ2VzdHMkKSkoImRpc3BsYXlGb2N1c2VkQWxlcnRUeXBlcyIsVGgoOSwyNyxuLmRpc3BsYXlGb2N1c2VkQWxlcnRUeXBlcyQpKSgiZm9jdXNlZEV4ZWN1dGlvbkluZGV4IixUaCgxMCwyOSxuLmZvY3VzZWRFeGVjdXRpb25JbmRleCQpKSgiZm9jdXNlZEV4ZWN1dGlvbkRpc3BsYXlJbmRleCIsVGgoMTEsMzEsbi5mb2N1c2VkRXhlY3V0aW9uRGlzcGxheUluZGV4JCkpfSxkaXJlY3RpdmVzOltDS10scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHZLLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InRmLWRlYnVnZ2VyLXYyLXRpbWVsaW5lIix0ZW1wbGF0ZTonXG4gICAgPHRpbWVsaW5lLWNvbXBvbmVudFxuICAgICAgW2FjdGl2ZVJ1bklkXT0iYWN0aXZlUnVuSWQkIHwgYXN5bmMiXG4gICAgICBbbG9hZGluZ051bUV4ZWN1dGlvbnNdPSJsb2FkaW5nTnVtRXhlY3V0aW9ucyQgfCBhc3luYyJcbiAgICAgIFtudW1FeGVjdXRpb25zXT0ibnVtRXhlY3V0aW9ucyQgfCBhc3luYyJcbiAgICAgIFtzY3JvbGxCZWdpbkluZGV4XT0ic2Nyb2xsQmVnaW5JbmRleCQgfCBhc3luYyJcbiAgICAgIFtzY3JvbGxCZWdpbkluZGV4VXBwZXJMaW1pdF09InNjcm9sbEJlZ2luSW5kZXhVcHBlckxpbWl0JCB8IGFzeW5jIlxuICAgICAgW3BhZ2VTaXplXT0icGFnZVNpemUkIHwgYXN5bmMiXG4gICAgICBbZGlzcGxheUNvdW50XT0iZGlzcGxheUNvdW50JCB8IGFzeW5jIlxuICAgICAgW2Rpc3BsYXlFeGVjdXRpb25EaWdlc3RzXT0iZGlzcGxheUV4ZWN1dGlvbkRpZ2VzdHMkIHwgYXN5bmMiXG4gICAgICBbZGlzcGxheUZvY3VzZWRBbGVydFR5cGVzXT0iZGlzcGxheUZvY3VzZWRBbGVydFR5cGVzJCB8IGFzeW5jIlxuICAgICAgW2ZvY3VzZWRFeGVjdXRpb25JbmRleF09ImZvY3VzZWRFeGVjdXRpb25JbmRleCQgfCBhc3luYyJcbiAgICAgIFtmb2N1c2VkRXhlY3V0aW9uRGlzcGxheUluZGV4XT0iZm9jdXNlZEV4ZWN1dGlvbkRpc3BsYXlJbmRleCQgfCBhc3luYyJcbiAgICAgIChvbk5hdmlnYXRlTGVmdCk9Im9uTmF2aWdhdGVMZWZ0KCkiXG4gICAgICAob25OYXZpZ2F0ZVJpZ2h0KT0ib25OYXZpZ2F0ZVJpZ2h0KCkiXG4gICAgICAob25FeGVjdXRpb25EaWdlc3RDbGlja2VkKT0ib25FeGVjdXRpb25EaWdlc3RDbGlja2VkKCRldmVudCkiXG4gICAgICAob25TbGlkZXJDaGFuZ2UpPSJvblNsaWRlckNoYW5nZSgkZXZlbnQpIlxuICAgID48L3RpbWVsaW5lLWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NvbnN0IFNLPWZ1bmN0aW9uKHQpe3JldHVyblt0XX07Y2xhc3MgREt7Y29uc3RydWN0b3IoKXt0aGlzLm9uT3BOYW1lQ2xpY2s9bmV3IExofX1mdW5jdGlvbiBFSyh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsImRpdiIsMTMpLFJtKDEsImRpdiIsMTQpLGt1KDIpLEFtKCksUm0oMywiZ3JhcGgtb3AiLDE1KSxWbSgib25PcE5hbWVDbGljayIsKGZ1bmN0aW9uIGUobil7aGkodCk7Y29uc3Qgbz1ZbSgzKTtyZXR1cm4gby5vbkdyYXBoT3BOYXZpZ2F0ZS5lbWl0KHtvcF9uYW1lOm4ub3BfbmFtZSxncmFwaF9pZDpvLmdyYXBoSWR9KX0pKSxBbSgpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49ZS5pbmRleDtyYygyKSxEdSgiSW5wdXQgc2xvdCAiLG4sIjoiKSxyYygxKSxEbSgia2luZCIsImlucHV0IikoIm9wTmFtZSIsdC5vcF9uYW1lKSgic2xvdCIsdC5vdXRwdXRfc2xvdCkoIm9wRGF0YSIsdC5kYXRhKX19ZnVuY3Rpb24gUksodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDExKSxSbSgxLCJkaXYiKSxRcCgyLEVLLDQsNSwiZGl2IiwxMiksQW0oKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMik7cmMoMiksRG0oIm5nRm9yT2YiLHQuaW5wdXRPcHMpfX1mdW5jdGlvbiBBSyh0LGUpezEmdCYmKFJtKDAsImRpdiIsMTYpLGt1KDEsIiAoVGhpcyBvcCBoYXMgbm8gaW5wdXQgdGVuc29yLikgIiksQW0oKSl9ZnVuY3Rpb24gVEsodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDIzKSxSbSgxLCJncmFwaC1vcCIsMTUpLFZtKCJvbk9wTmFtZUNsaWNrIiwoZnVuY3Rpb24gZShuKXtoaSh0KTtjb25zdCBvPVltKDQpO3JldHVybiBvLm9uR3JhcGhPcE5hdmlnYXRlLmVtaXQoe29wX25hbWU6bi5vcF9uYW1lLGdyYXBoX2lkOm8uZ3JhcGhJZH0pfSkpLEFtKCksQW0oKX1pZigyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQ7cmMoMSksRG0oImtpbmQiLCJjb25zdW1lciIpKCJvcE5hbWUiLHQub3BfbmFtZSkoInNsb3QiLHQuaW5wdXRfc2xvdCkoIm9wRGF0YSIsdC5kYXRhKX19ZnVuY3Rpb24gTksodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDE5KSxSbSgxLCJkaXYiLDIwKSxrdSgyKSxSbSgzLCJzcGFuIiksdGcoNCwyMSksQW0oKSxrdSg1LCIpICIpLEFtKCksUXAoNixUSywyLDQsImRpdiIsMjIpLEFtKCkpLDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdCxuPWUuaW5kZXg7cmMoMiksRXUoIiBPdXRwdXQgc2xvdCAiLG4sIjogKCIsdC5sZW5ndGgsIiAiKSxyYygyKSxlZyh0Lmxlbmd0aCksbmcoNCkscmMoMiksRG0oIm5nRm9yT2YiLHQpfX1mdW5jdGlvbiB6Syh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsMTcpLFJtKDEsImRpdiIpLFFwKDIsTkssNyw0LCJkaXYiLDE4KSxBbSgpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgyKTtyYygyKSxEbSgibmdGb3JPZiIsdC5jb25zdW1lck9wcyl9fWZ1bmN0aW9uIElLKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2IiwyNCksa3UoMSksUm0oMiwic3BhbiIpLHRnKDMsMjUpLEFtKCksa3UoNCwiIGFuZCBubyBjb25zdW1lci4pICIpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgyKTtyYygxKSxEdSgiIChUaGlzIG9wIGhhcyAiLHQub3BJbmZvLmNvbnN1bWVycy5sZW5ndGgsIiBvdXRwdXQgIikscmMoMiksZWcodC5vcEluZm8uY29uc3VtZXJzLmxlbmd0aCksbmcoMyl9fWZ1bmN0aW9uIEhLKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2IiksUXAoMSxSSywzLDEsImRpdiIsNCksUXAoMixBSywyLDAsIm5nLXRlbXBsYXRlIixudWxsLDUsaWIpLFJtKDQsImRpdiIsNiksUm0oNSwiZGl2Iiw3KSxrdSg2LCJPcDoiKSxBbSgpLFJtKDcsImdyYXBoLW9wIiw4KSxWbSgib25PcE5hbWVDbGljayIsKGZ1bmN0aW9uIGUobil7aGkodCk7Y29uc3Qgbz1ZbSgpO3JldHVybiBvLm9uR3JhcGhPcE5hdmlnYXRlLmVtaXQoe29wX25hbWU6bi5vcF9uYW1lLGdyYXBoX2lkOm8uZ3JhcGhJZH0pfSkpLEFtKCksQW0oKSxRcCg4LHpLLDMsMSwiZGl2Iiw5KSxRcCg5LElLLDUsMiwibmctdGVtcGxhdGUiLG51bGwsMTAsaWIpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PSRwKDMpLGU9JHAoMTApLG49WW0oKTtyYygxKSxEbSgibmdJZiIsbi5pbnB1dE9wcy5sZW5ndGg+MCkoIm5nSWZFbHNlIix0KSxyYyg2KSxEbSgia2luZCIsInNlbGYiKSgib3BOYW1lIixuLm9wSW5mby5vcF9uYW1lKSgib3BEYXRhIixuLm9wSW5mbykscmMoMSksRG0oIm5nSWYiLG4udG90YWxOdW1Db25zdW1lcnM+MCkoIm5nSWZFbHNlIixlKX19ZnVuY3Rpb24gRksodCxlKXsxJnQmJihSbSgwLCJzcGFuIiwyNiksa3UoMSwiIChPcCBpbmZvIHVuYXZhaWxhYmxlLikgIiksQW0oKSl9ZnVuY3Rpb24gTEsodCxlKXsxJnQmJihSbSgwLCJkaXYiLDI3KSxrdSgxLCIgTm8gZ3JhcGggb3Agc2VsZWN0ZWQuIENsaWNrIGEgdGVuc29yIG5hbWUgaW4gdGhlIEdyYXBoIEV4ZWN1dGlvbnMgdGFibGUgdG8gdmlldyB0aGUgbmVpZ2hib3Job29kIG9mIHRoZSB0ZW5zb3IncyBvcCBpbiBpdHMgZ3JhcGguICIpLEFtKCkpfURLLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxESyl9LERLLsm1Y21wPXRvKHt0eXBlOkRLLHNlbGVjdG9yczpbWyJncmFwaC1vcCJdXSxpbnB1dHM6e2tpbmQ6ImtpbmQiLG9wTmFtZToib3BOYW1lIixzbG90OiJzbG90IixvcERhdGE6Im9wRGF0YSJ9LG91dHB1dHM6e29uT3BOYW1lQ2xpY2s6Im9uT3BOYW1lQ2xpY2sifSxkZWNsczo5LHZhcnM6Nyxjb25zdHM6W1sxLCJvcC1jb250YWluZXIiXSxbMSwiaW5wdXQtdGVuc29yLW5hbWUiXSxbMSwib3AtbmFtZSIsMywibmdDbGFzcyIsImNsaWNrIl0sWyJjbGFzcyIsInNsb3QiLDQsIm5nSWYiXSxbImNsYXNzIiwib3AtdHlwZSIsNCwibmdJZiIsIm5nSWZFbHNlIl0sWyJvcEluZm9NaXNzaW5nIiwiIl0sWzEsInNsb3QiXSxbMywibmdTd2l0Y2giXSxbNCwibmdTd2l0Y2hDYXNlIl0sWzEsIm9wLXR5cGUiXSxbMSwib3AtaW5mby1taXNzaW5nIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihSbSgwLCJidXR0b24iLDApLFJtKDEsImRpdiIsMSksUm0oMiwiYnV0dG9uIiwyKSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25PcE5hbWVDbGljay5lbWl0KHtvcF9uYW1lOm4ub3BOYW1lfSl9KSksUm0oMywic3BhbiIpLGt1KDQpLEFtKCksQW0oKSxRcCg1LFBLLDUsNCwiZGl2IiwzKSxBbSgpLFFwKDYsd0ssMiwxLCJkaXYiLDQpLFFwKDcsa0ssMiwwLCJuZy10ZW1wbGF0ZSIsbnVsbCw1LGliKSxBbSgpKSwyJmUpe2NvbnN0IHQ9JHAoOCk7cmMoMiksRG0oIm5nQ2xhc3MiLE1oKDUsU0ssInNlbGYiPT09bi5raW5kPyJzZWxmLW9wLW5hbWUiOiIiKSkscmMoMiksU3Uobi5vcE5hbWUpLHJjKDEpLERtKCJuZ0lmIiwic2VsZiIhPT1uLmtpbmQpLHJjKDEpLERtKCJuZ0lmIix2b2lkIDAhPT1uLm9wRGF0YSkoIm5nSWZFbHNlIix0KX19LGRpcmVjdGl2ZXM6W2FNLGRNLGZNLGdNXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ub3AtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm9wLW5hbWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZC1jb2xvcjppbmhlcml0fS5vcC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjoycHggc29saWQgI2ViZWJlYjtib3JkZXItcmFkaXVzOjRweDtib3gtc2hhZG93OjFweCAzcHggI2VlZTtjdXJzb3I6cG9pbnRlcjttYXJnaW46MCA1cHggMCAwO3BhZGRpbmc6MnB4IDZweDt0ZXh0LWFsaWduOnJpZ2h0O3dpZHRoOjIwMHB4fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5vcC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAub3AtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MnB4IHNvbGlkICM1NTV9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLm9wLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5vcC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MXB4IDNweCAjNzU3NTc1fS5vcC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3Vze291dGxpbmU6MH0ub3AtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcntib3JkZXI6MnB4IHNvbGlkICNmZmQzYjJ9Lm9wLWluZm8tbWlzc2luZ1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Z3JheX0ub3AtbmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOm5vbmU7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7b3ZlcmZsb3ctd3JhcDphbnl3aGVyZTtwYWRkaW5nOjA7dGV4dC1hbGlnbjpyaWdodDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO3doaXRlLXNwYWNlOnByZS13cmFwfS5vcC1uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tvdXRsaW5lOjB9Lm9wLXR5cGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2VjZWZmMTtib3JkZXI6MXB4IHNvbGlkICNlYmViZWI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1mYW1pbHk6IlJvYm90byBNb25vIixtb25vc3BhY2U7Zm9udC1zaXplOjEwcHg7aGVpZ2h0OjE0cHg7bGluZS1oZWlnaHQ6MTRweDtwYWRkaW5nOjFweCAzcHg7d2lkdGg6bWF4LWNvbnRlbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDozcHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLm9wLXR5cGVbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAub3AtdHlwZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjFweCBzb2xpZCAjNTU1fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5vcC10eXBlW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLm9wLXR5cGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzQ1NWE2NH0uc2VsZi1vcC1uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpib2xkO3RleHQtZGVjb3JhdGlvbjpub25lfS5zbG90W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5zbG90W19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLnNsb3RbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfSddfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChESyxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJncmFwaC1vcCIsdGVtcGxhdGVVcmw6ImdyYXBoX29wX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyIuL2dyYXBoX29wX2NvbXBvbmVudC5jc3MiXX1dfV0sbnVsbCx7a2luZDpbe3R5cGU6eHl9XSxvcE5hbWU6W3t0eXBlOnh5fV0sc2xvdDpbe3R5cGU6eHl9XSxvcERhdGE6W3t0eXBlOnh5fV0sb25PcE5hbWVDbGljazpbe3R5cGU6T3l9XX0pO2NsYXNzIEJLe2NvbnN0cnVjdG9yKCl7dGhpcy5vbkdyYXBoT3BOYXZpZ2F0ZT1uZXcgTGh9Z2V0IGdyYXBoSWQoKXtyZXR1cm4gdGhpcy5vcEluZm8uZ3JhcGhfaWRzW3RoaXMub3BJbmZvLmdyYXBoX2lkcy5sZW5ndGgtMV19Z2V0IHRvdGFsTnVtQ29uc3VtZXJzKCl7cmV0dXJuIHRoaXMuY29uc3VtZXJPcHMucmVkdWNlKCgodCxlKT0+dCtlLmxlbmd0aCksMCl9fUJLLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxCSyl9LEJLLsm1Y21wPXRvKHt0eXBlOkJLLHNlbGVjdG9yczpbWyJncmFwaC1jb21wb25lbnQiXV0saW5wdXRzOntvcEluZm86Im9wSW5mbyIsaW5wdXRPcHM6ImlucHV0T3BzIixjb25zdW1lck9wczoiY29uc3VtZXJPcHMifSxvdXRwdXRzOntvbkdyYXBoT3BOYXZpZ2F0ZToib25HcmFwaE9wTmF2aWdhdGUifSxkZWNsczo5LHZhcnM6Mixjb25zdHM6ZnVuY3Rpb24oKXtsZXQgdCxlLG4sbztyZXR1cm4gdD0idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZT9nb29nLmdldE1zZygie1ZBUl9QTFVSQUwsIHBsdXJhbCwgPTAge2NvbnN1bWVyfSA9MSB7Y29uc3VtZXJ9IG90aGVyIHtjb25zdW1lcnN9fSIpOiRsb2NhbGl6ZWA64pCfZmU1NWY5YjE5M2VhMjBhYWU1YjU2MzVlNjhkOTM4NjUwMzg0Nzc0NuKQnzQ5NTUxMzM3NDA4NDEyOTk4NTE6e1ZBUl9QTFVSQUwsIHBsdXJhbCwgPTAge2NvbnN1bWVyfSA9MSB7Y29uc3VtZXJ9IG90aGVyIHtjb25zdW1lcnN9fWAsdD1vZyh0LHtWQVJfUExVUkFMOiLvv70w77+9In0pLGU9InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSYmbmdJMThuQ2xvc3VyZU1vZGU/Z29vZy5nZXRNc2coIiB7JGljdX0iLHtpY3U6dH0pOiRsb2NhbGl6ZWA64pCfYmFhNDYwZTJmMmI4NTdlMjYyOTJiMjQ2ZmMxOGFlMGVhOWI1ZTUzN+KQnzU1NTYzNDAzNDM4NTAxNjU1MTY6ICR7dH06SUNVOmAsbj0idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZT9nb29nLmdldE1zZygie1ZBUl9QTFVSQUwsIHBsdXJhbCwgPTAge3RlbnNvcn0gPTEge3RlbnNvcn0gb3RoZXIge3RlbnNvcnN9fSIpOiRsb2NhbGl6ZWA64pCfNmFhNzVmNjI3ZTBkYzE2MTUwZWY0NDg0NjRlMGM4NTdhYWEwZGMxOOKQnzUxNTY3MTI5MzUxNTA1ODY4Nzg6e1ZBUl9QTFVSQUwsIHBsdXJhbCwgPTAge3RlbnNvcn0gPTEge3RlbnNvcn0gb3RoZXIge3RlbnNvcnN9fWAsbj1vZyhuLHtWQVJfUExVUkFMOiLvv70w77+9In0pLG89InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSYmbmdJMThuQ2xvc3VyZU1vZGU/Z29vZy5nZXRNc2coIiB7JGljdX0iLHtpY3U6bn0pOiRsb2NhbGl6ZWA64pCfODkzNDc2YzJjNDIxY2VlNDc2NjNjOTczMmZhNDFhNzUwZDNhNzNkZuKQnzI0NjA2NzA1MzczNTE2MjYzNDogJHtufTpJQ1U6YCxbWzEsImdyYXBoLXN0cnVjdHVyZS1jb250YWluZXIiXSxbNCwibmdJZiIsIm5nSWZFbHNlIl0sWyJvcEluZm9NaXNzaW5nIiwiIl0sWyJub09wRm9jdXNlZCIsIiJdLFsiY2xhc3MiLCJpbnB1dHMtY29udGFpbmVyIiw0LCJuZ0lmIiwibmdJZkVsc2UiXSxbIm5vSW5wdXRzIiwiIl0sWzEsInNlbGYtb3AtY29udGFpbmVyIl0sWzEsInNlbGYtb3AtaGVhZGVyIl0sWzMsImtpbmQiLCJvcE5hbWUiLCJvcERhdGEiLCJvbk9wTmFtZUNsaWNrIl0sWyJjbGFzcyIsImNvbnN1bWVycy1jb250YWluZXIiLDQsIm5nSWYiLCJuZ0lmRWxzZSJdLFsibm9Db25zdW1lcnMiLCIiXSxbMSwiaW5wdXRzLWNvbnRhaW5lciJdLFsiY2xhc3MiLCJpbnB1dC1vcC1zZWN0aW9uIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbMSwiaW5wdXQtb3Atc2VjdGlvbiJdLFsxLCJpbnB1dC1zbG90LWhlYWRlciJdLFszLCJraW5kIiwib3BOYW1lIiwic2xvdCIsIm9wRGF0YSIsIm9uT3BOYW1lQ2xpY2siXSxbMSwiaW5wdXRzLWNvbnRhaW5lciIsIm5vLWlucHV0cy1pbmRpY2F0b3IiXSxbMSwiY29uc3VtZXJzLWNvbnRhaW5lciJdLFsiY2xhc3MiLCJzbG90LWNvbnN1bWVycy1jb250YWluZXIiLDQsIm5nRm9yIiwibmdGb3JPZiJdLFsxLCJzbG90LWNvbnN1bWVycy1jb250YWluZXIiXSxbMSwic2xvdC1jb25zdW1lcnMtaGVhZGVyIl0sZSxbImNsYXNzIiwiY29uc3VtZXItc2VjdGlvbiIsNCwibmdGb3IiLCJuZ0Zvck9mIl0sWzEsImNvbnN1bWVyLXNlY3Rpb24iXSxbMSwib3AtY29uc3VtZXJzLWNvbnRhaW5lciJdLG8sWzEsIm9wLWluZm8tbWlzc2luZyJdLFsxLCJuby1vcC1mb2N1c2VkIl1dfSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoUm0oMCwiZGl2IiksUm0oMSwiZGl2Iiksa3UoMiwiR3JhcGggU3RydWN0dXJlIiksQW0oKSxSbSgzLCJkaXYiLDApLFFwKDQsSEssMTEsNywiZGl2IiwxKSxBbSgpLFFwKDUsRkssMiwwLCJuZy10ZW1wbGF0ZSIsbnVsbCwyLGliKSxRcCg3LExLLDIsMCwibmctdGVtcGxhdGUiLG51bGwsMyxpYiksQW0oKSksMiZlKXtjb25zdCB0PSRwKDgpO3JjKDQpLERtKCJuZ0lmIixudWxsIT1uLm9wSW5mbykoIm5nSWZFbHNlIix0KX19LGRpcmVjdGl2ZXM6W2RNLERLLGxNXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde292ZXJmbG93LXk6YXV0b30uY29uc3VtZXJzLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206NXB4O292ZXJmbG93LXg6YXV0bzt3aGl0ZS1zcGFjZTpub3dyYXB9LmNvbnN1bWVyLXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjVweCAwfS5ncmFwaC1zdHJ1Y3R1cmUtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtvdmVyZmxvdy15OmF1dG87d2hpdGUtc3BhY2U6bm93cmFwfS5pbnB1dHMtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMik7bWFyZ2luLXRvcDo1cHg7b3ZlcmZsb3cteDphdXRvO3BhZGRpbmctYm90dG9tOjA7d2hpdGUtc3BhY2U6bm93cmFwfS5pbnB1dC1vcC1zZWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQ6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKTtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tcmlnaHQ6NXB4O3BhZGRpbmctYm90dG9tOjVweH0uaW5wdXQtc2xvdC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjA5OTttYXJnaW4tYm90dG9tOjVweH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuaW5wdXQtc2xvdC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuaW5wdXQtc2xvdC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2U2NTEwMH0uaW5wdXQtdGVuc29yLW5hbWVbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwfS5uby1vcC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpncmF5O2ZvbnQtZmFtaWx5OiJSb2JvdG8iLEFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxM3B4O3doaXRlLXNwYWNlOm5vcm1hbH0uc2VsZi1vcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OmJvbGQ7bWFyZ2luLWJvdHRvbTo1cHh9LnNlbGYtb3AtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMik7cGFkZGluZy1ib3R0b206NXB4fS5zbG90LWNvbnN1bWVycy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodDoxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpO2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1yaWdodDo1cHg7cGFkZGluZy10b3A6NXB4O3ZlcnRpY2FsLWFsaWduOnRvcH0uc2xvdC1jb25zdW1lcnMtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXB9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEJLLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImdyYXBoLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vZ3JhcGhfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vZ3JhcGhfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse29wSW5mbzpbe3R5cGU6eHl9XSxpbnB1dE9wczpbe3R5cGU6eHl9XSxjb25zdW1lck9wczpbe3R5cGU6eHl9XSxvbkdyYXBoT3BOYXZpZ2F0ZTpbe3R5cGU6T3l9XX0pO2NsYXNzIFZLe2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLm9wSW5mbyQ9dGhpcy5zdG9yZS5waXBlKEZ3KGVYKSksdGhpcy5pbnB1dE9wcyQ9dGhpcy5zdG9yZS5waXBlKEZ3KG5YKSksdGhpcy5jb25zdW1lck9wcyQ9dGhpcy5zdG9yZS5waXBlKEZ3KGlYKSl9b25HcmFwaE9wTmF2aWdhdGUodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChuWih0KSl9fWZ1bmN0aW9uIGpLKHQsZSl7MSZ0JiYoUm0oMCwiZGl2IiwxMiksa3UoMSwi4pa2IiksQW0oKSl9VksuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFZLKShTbShJdykpfSxWSy7JtWNtcD10byh7dHlwZTpWSyxzZWxlY3RvcnM6W1sidGYtZGVidWdnZXItdjItZ3JhcGgiXV0sZGVjbHM6NCx2YXJzOjksY29uc3RzOltbMywib3BJbmZvIiwiaW5wdXRPcHMiLCJjb25zdW1lck9wcyIsIm9uR3JhcGhPcE5hdmlnYXRlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJncmFwaC1jb21wb25lbnQiLDApLFZtKCJvbkdyYXBoT3BOYXZpZ2F0ZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25HcmFwaE9wTmF2aWdhdGUoZSl9KSksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQW0oKSksMiZlJiZEbSgib3BJbmZvIixUaCgxLDMsbi5vcEluZm8kKSkoImlucHV0T3BzIixUaCgyLDUsbi5pbnB1dE9wcyQpKSgiY29uc3VtZXJPcHMiLFRoKDMsNyxuLmNvbnN1bWVyT3BzJCkpfSxkaXJlY3RpdmVzOltCS10scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFZLLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InRmLWRlYnVnZ2VyLXYyLWdyYXBoIix0ZW1wbGF0ZTonXG4gICAgPGdyYXBoLWNvbXBvbmVudFxuICAgICAgW29wSW5mb109Im9wSW5mbyQgfCBhc3luYyJcbiAgICAgIFtpbnB1dE9wc109ImlucHV0T3BzJCB8IGFzeW5jIlxuICAgICAgW2NvbnN1bWVyT3BzXT0iY29uc3VtZXJPcHMkIHwgYXN5bmMiXG4gICAgICAob25HcmFwaE9wTmF2aWdhdGUpPSJvbkdyYXBoT3BOYXZpZ2F0ZSgkZXZlbnQpIlxuICAgID48L2dyYXBoLWNvbXBvbmVudD5cbiAgJ31dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSxudWxsKTtjb25zdCBVSz1mdW5jdGlvbih0LGUpe3JldHVybnt0ZW5zb3JEZWJ1Z01vZGU6dCxhcnJheTplfX07ZnVuY3Rpb24gR0sodCxlKXtpZigxJnQmJlRtKDAsImRlYnVnLXRlbnNvci12YWx1ZSIsMTcpLDImdCl7Y29uc3QgdD1ZbSgyKS4kaW1wbGljaXQsZT1ZbSgyKTtEbSgiZGVidWdUZW5zb3JWYWx1ZSIsZS5wYXJzZURlYnVnVGVuc29yVmFsdWUodmgoMSxVSyxlLmdyYXBoRXhlY3V0aW9uRGF0YVt0XS50ZW5zb3JfZGVidWdfbW9kZSxlLmdyYXBoRXhlY3V0aW9uRGF0YVt0XS5kZWJ1Z190ZW5zb3JfdmFsdWUpKSl9fWZ1bmN0aW9uIFdLKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2IiksUm0oMSwiZGl2IiwxMyksUm0oMiwiYnV0dG9uIiwxNCksVm0oImNsaWNrIiwoZnVuY3Rpb24gZSgpe2hpKHQpO2NvbnN0IG49WW0oKS4kaW1wbGljaXQsbz1ZbSgyKTtyZXR1cm4gby5vblRlbnNvck5hbWVDbGljay5lbWl0KHtpbmRleDpuLGdyYXBoX2lkOm8uZ3JhcGhFeGVjdXRpb25EYXRhW25dLmdyYXBoX2lkLG9wX25hbWU6by5ncmFwaEV4ZWN1dGlvbkRhdGFbbl0ub3BfbmFtZX0pfSkpLGt1KDMpLEFtKCksUm0oNCwiZGl2IiwxNSksa3UoNSksQW0oKSxBbSgpLFFwKDYsR0ssMSw0LCJkZWJ1Zy10ZW5zb3ItdmFsdWUiLDE2KSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgpLiRpbXBsaWNpdCxlPVltKDIpO3JjKDIpLEttKCJ0aXRsZSIsZS5nZXRUZW5zb3JOYW1lKHQpKSxyYygxKSxEdSgiICIsZS5nZXRUZW5zb3JOYW1lKHQpLCIgIikscmMoMiksU3UoZS5ncmFwaEV4ZWN1dGlvbkRhdGFbdF0ub3BfdHlwZSkscmMoMSksRG0oIm5nSWYiLG51bGwhPT1lLmdyYXBoRXhlY3V0aW9uRGF0YVt0XS5kZWJ1Z190ZW5zb3JfdmFsdWUpfX1mdW5jdGlvbiBZSyh0LGUpezEmdCYmKFJtKDAsImRpdiIsMTgpLGt1KDEsIiBMb2FkaW5nLi4uICIpLEFtKCkpfWNvbnN0IHFLPWZ1bmN0aW9uKHQpe3JldHVybnsiaW5wdXQtb2YtZm9jdXMiOnR9fTtmdW5jdGlvbiBaSyh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsNSksUm0oMSwiZGl2Iiw2KSxSbSgyLCJkaXYiLDcpLFFwKDMsakssMiwwLCJkaXYiLDgpLGt1KDQpLEFtKCksUXAoNSxXSyw3LDQsImRpdiIsOSksUXAoNixZSywyLDAsIm5nLXRlbXBsYXRlIiwxMCwxMSxpYiksQW0oKSxBbSgpKSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQsbj0kcCg3KSxvPVltKDIpO3JjKDEpLERtKCJuZ0NsYXNzIixNaCg1LHFLLG8uaXNJbnB1dE9mRm9jdXModCkpKSxyYygyKSxEbSgibmdJZiIsdD09PW8uZm9jdXNJbmRleCkscmMoMSksRHUoIiAiLHQsIiAiKSxyYygxKSxEbSgibmdJZiIsby5ncmFwaEV4ZWN1dGlvbkRhdGFbdF0pKCJuZ0lmRWxzZSIsbil9fWZ1bmN0aW9uIFhLKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0IiwzKSxWbSgic2Nyb2xsZWRJbmRleENoYW5nZSIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkub25TY3JvbGxlZEluZGV4Q2hhbmdlLmVtaXQobil9KSksUXAoMSxaSyw4LDcsImRpdiIsNCksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKTtyYygxKSxEbSgiY2RrVmlydHVhbEZvck9mIix0LmdyYXBoRXhlY3V0aW9uSW5kaWNlcyl9fWNsYXNzIEtLe2NvbnN0cnVjdG9yKCl7dGhpcy5vblNjcm9sbGVkSW5kZXhDaGFuZ2U9bmV3IExoLHRoaXMub25UZW5zb3JOYW1lQ2xpY2s9bmV3IExoLHRoaXMucGFyc2VEZWJ1Z1RlbnNvclZhbHVlPUhYLHRoaXMuVEVTVF9PTkxZPXtnZXRWaWV3UG9ydDooKT0+dGhpcy52aWV3UG9ydH19bmdPbkNoYW5nZXModCl7aWYodGhpcy52aWV3UG9ydCYmdC5mb2N1c0luZGV4JiZudWxsIT09dC5mb2N1c0luZGV4LmN1cnJlbnRWYWx1ZSl7Y29uc3QgZT10aGlzLnZpZXdQb3J0LmdldFJlbmRlcmVkUmFuZ2UoKSxuPXQuZm9jdXNJbmRleC5jdXJyZW50VmFsdWUsbz1NYXRoLnJvdW5kKChlLmVuZC1lLnN0YXJ0KS8zKSxpPU1hdGgubWF4KG4tbywwKTt0aGlzLnZpZXdQb3J0LnNjcm9sbFRvSW5kZXgoaSxuPj1lLnN0YXJ0JiZuPGUuZW5kPyJzbW9vdGgiOnZvaWQgMCl9fWdldFRlbnNvck5hbWUodCl7cmV0dXJuYCR7dGhpcy5ncmFwaEV4ZWN1dGlvbkRhdGFbdF0ub3BfbmFtZX06JHt0aGlzLmdyYXBoRXhlY3V0aW9uRGF0YVt0XS5vdXRwdXRfc2xvdH1gfWlzSW5wdXRPZkZvY3VzKHQpe3JldHVybiBudWxsIT09dGhpcy5mb2N1c0lucHV0SW5kaWNlcyYmdGhpcy5mb2N1c0lucHV0SW5kaWNlcy5pbmNsdWRlcyh0KX19S0suybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEtLKX0sS0suybVjbXA9dG8oe3R5cGU6S0ssc2VsZWN0b3JzOltbImdyYXBoLWV4ZWN1dGlvbnMtY29tcG9uZW50Il1dLHZpZXdRdWVyeTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiZRaChnRiw1KSwyJmUpe2xldCB0O0poKHQ9dGIoKSkmJihuLnZpZXdQb3J0PXQuZmlyc3QpfX0saW5wdXRzOntudW1HcmFwaEV4ZWN1dGlvbnM6Im51bUdyYXBoRXhlY3V0aW9ucyIsZ3JhcGhFeGVjdXRpb25EYXRhOiJncmFwaEV4ZWN1dGlvbkRhdGEiLGdyYXBoRXhlY3V0aW9uSW5kaWNlczoiZ3JhcGhFeGVjdXRpb25JbmRpY2VzIixmb2N1c0luZGV4OiJmb2N1c0luZGV4Iixmb2N1c0lucHV0SW5kaWNlczoiZm9jdXNJbnB1dEluZGljZXMifSxvdXRwdXRzOntvblNjcm9sbGVkSW5kZXhDaGFuZ2U6Im9uU2Nyb2xsZWRJbmRleENoYW5nZSIsb25UZW5zb3JOYW1lQ2xpY2s6Im9uVGVuc29yTmFtZUNsaWNrIn0sZmVhdHVyZXM6W0JvXSxkZWNsczo0LHZhcnM6Mixjb25zdHM6W1sxLCJncmFwaC1leGVjdXRpb25zLWNvbnRhaW5lciJdLFsxLCJncmFwaC1leGVjdXRpb25zLXRpdGxlIl0sWyJpdGVtU2l6ZSIsIjM4IiwiY2xhc3MiLCJncmFwaC1leGVjdXRpb25zLXZpZXdwb3J0IiwzLCJzY3JvbGxlZEluZGV4Q2hhbmdlIiw0LCJuZ0lmIl0sWyJpdGVtU2l6ZSIsIjM4IiwxLCJncmFwaC1leGVjdXRpb25zLXZpZXdwb3J0IiwzLCJzY3JvbGxlZEluZGV4Q2hhbmdlIl0sWyJjbGFzcyIsInRlbnNvci1jb250YWluZXIiLDQsImNka1ZpcnR1YWxGb3IiLCJjZGtWaXJ0dWFsRm9yT2YiXSxbMSwidGVuc29yLWNvbnRhaW5lciJdLFsxLCJ0ZW5zb3ItaXRlbSIsMywibmdDbGFzcyJdLFsxLCJncmFwaC1leGVjdXRpb24taW5kZXgiXSxbImNsYXNzIiwiZ3JhcGgtZXhlY3V0aW9uLWZvY3VzIiw0LCJuZ0lmIl0sWzQsIm5nSWYiLCJuZ0lmRWxzZSJdLFsiY2xhc3MiLCJ0ZW5zb3ItaXRlbSJdLFsiZGF0YUxvYWRpbmciLCIiXSxbMSwiZ3JhcGgtZXhlY3V0aW9uLWZvY3VzIl0sWzEsInRlbnNvci1uYW1lLWFuZC1vcC10eXBlIl0sWzEsInRlbnNvci1uYW1lIiwzLCJ0aXRsZSIsImNsaWNrIl0sWzEsIm9wLXR5cGUiXSxbMywiZGVidWdUZW5zb3JWYWx1ZSIsNCwibmdJZiJdLFszLCJkZWJ1Z1RlbnNvclZhbHVlIl0sWzEsImxvYWRpbmctc3Bpbm5lciJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiZGl2IiwwKSxSbSgxLCJkaXYiLDEpLGt1KDIpLEFtKCksUXAoMyxYSywyLDEsImNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCIsMiksQW0oKSksMiZlJiYocmMoMiksRHUoIiBHcmFwaCBFeGVjdXRpb25zICgiLG4ubnVtR3JhcGhFeGVjdXRpb25zLCIpICIpLHJjKDEpLERtKCJuZ0lmIixudWxsIT09bi5udW1HcmFwaEV4ZWN1dGlvbnMmJm4ubnVtR3JhcGhFeGVjdXRpb25zPjApKX0sZGlyZWN0aXZlczpbZE0sZ0YsZEYsYkYsYU0sYUtdLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5ncmFwaC1leGVjdXRpb25zLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNlYmViZWI7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtoZWlnaHQ6MTAwJTttYXJnaW4tbGVmdDo4cHg7cGFkZGluZy1sZWZ0OjEwcHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmdyYXBoLWV4ZWN1dGlvbnMtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmdyYXBoLWV4ZWN1dGlvbnMtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDoxcHggc29saWQgIzU1NX0uZ3JhcGgtZXhlY3V0aW9uLWZvY3VzW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmlubGluZS1ibG9ja30uZ3JhcGgtZXhlY3V0aW9uLWluZGV4W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmctcmlnaHQ6NHB4O3RleHQtYWxpZ246cmlnaHQ7d2lkdGg6NDBweH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuZ3JhcGgtZXhlY3V0aW9uLWluZGV4W19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmdyYXBoLWV4ZWN1dGlvbi1pbmRleFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9LmdyYXBoLWV4ZWN1dGlvbnMtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MCA1cHggM3B4IC0zcHggI2NjYztwYWRkaW5nLWJvdHRvbTo1cHh9LmdyYXBoLWV4ZWN1dGlvbnMtdmlld3BvcnRbX25nY29udGVudC0lQ09NUCVde2ZsZXgtZ3JvdzoxO2ZvbnQtc2l6ZToxMnB4O3dpZHRoOjEwMCU7b3ZlcmZsb3cteDpoaWRkZW59LmlucHV0LW9mLWZvY3VzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmYwOTl9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmlucHV0LW9mLWZvY3VzW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmlucHV0LW9mLWZvY3VzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlNjUxMDB9LmxvYWRpbmctc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTppbmxpbmUtYmxvY2t9Lm9wLXR5cGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2VjZWZmMTtib3JkZXI6MXB4IHNvbGlkICNlYmViZWI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1mYW1pbHk6IlJvYm90byBNb25vIixtb25vc3BhY2U7Zm9udC1zaXplOjEwcHg7aGVpZ2h0OjE0cHg7bGluZS1oZWlnaHQ6MTRweDtwYWRkaW5nOjFweCAzcHg7d2lkdGg6bWF4LWNvbnRlbnQ7ZGlyZWN0aW9uOnJ0bDtkaXNwbGF5OmJsb2NrfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5vcC10eXBlW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLm9wLXR5cGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjoxcHggc29saWQgIzU1NX1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAub3AtdHlwZVtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5vcC10eXBlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiM0NTVhNjR9LnRlbnNvci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCV9LnRlbnNvci1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmViO2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6bm93cmFwO2hlaWdodDozOHB4O2xpbmUtaGVpZ2h0OjM4cHg7dGV4dC1hbGlnbjpsZWZ0O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTt3aGl0ZS1zcGFjZTpub3dyYXA7d2lkdGg6MTAwJX1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAudGVuc29yLWl0ZW1bX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAudGVuc29yLWl0ZW1bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkICM1NTV9LnRlbnNvci1uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlcjpub25lO2JveC1zaXppbmc6Ym9yZGVyLWJveDtjb2xvcjppbmhlcml0O2N1cnNvcjpwb2ludGVyO2RpcmVjdGlvbjpydGw7ZGlzcGxheTpibG9jaztoZWlnaHQ6MTZweDtsaW5lLWhlaWdodDoxNnB4O21hcmdpbjoycHggMCAxcHg7bWF4LXdpZHRoOmNhbGMoMTAwJSAtIDJweCk7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MCAycHg7dGV4dC1hbGlnbjpyaWdodDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwfS50ZW5zb3ItbmFtZVtfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7b3V0bGluZToxcHggc29saWQgI2M2Y2FkMX0udGVuc29yLW5hbWUtYW5kLW9wLXR5cGVbX25nY29udGVudC0lQ09NUCVde2RpcmVjdGlvbjpydGw7ZGlzcGxheTppbmxpbmUtYmxvY2s7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmctcmlnaHQ6OHB4O3RleHQtYWxpZ246cmlnaHQ7d2lkdGg6MjQwcHh9ZGVidWctdGVuc29yLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW46MnB4IDB9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEtLLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImdyYXBoLWV4ZWN1dGlvbnMtY29tcG9uZW50Iix0ZW1wbGF0ZVVybDoiLi9ncmFwaF9leGVjdXRpb25zX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyIuL2dyYXBoX2V4ZWN1dGlvbnNfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse251bUdyYXBoRXhlY3V0aW9uczpbe3R5cGU6eHl9XSxncmFwaEV4ZWN1dGlvbkRhdGE6W3t0eXBlOnh5fV0sZ3JhcGhFeGVjdXRpb25JbmRpY2VzOlt7dHlwZTp4eX1dLGZvY3VzSW5kZXg6W3t0eXBlOnh5fV0sZm9jdXNJbnB1dEluZGljZXM6W3t0eXBlOnh5fV0sb25TY3JvbGxlZEluZGV4Q2hhbmdlOlt7dHlwZTpPeX1dLG9uVGVuc29yTmFtZUNsaWNrOlt7dHlwZTpPeX1dLHZpZXdQb3J0Olt7dHlwZTpaYSxhcmdzOltnRix7c3RhdGljOiExfV19XX0pO2NsYXNzIEpLe2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLm51bUdyYXBoRXhlY3V0aW9ucyQ9dGhpcy5zdG9yZS5waXBlKEZ3KFlaKSksdGhpcy5ncmFwaEV4ZWN1dGlvbkRhdGEkPXRoaXMuc3RvcmUucGlwZShGdyhRWikpLHRoaXMuZ3JhcGhFeGVjdXRpb25JbmRpY2VzJD10aGlzLnN0b3JlLnBpcGUoRncoWncoWVosKHQ9PjA9PT10P251bGw6QXJyYXkuZnJvbSh7bGVuZ3RoOnR9KS5tYXAoKCh0LGUpPT5lKSkpKSkpLHRoaXMuZm9jdXNJbmRleCQ9dGhpcy5zdG9yZS5waXBlKEZ3KCRaKSksdGhpcy5mb2N1c0lucHV0SW5kaWNlcyQ9dGhpcy5zdG9yZS5waXBlKEZ3KG9YKSl9b25TY3JvbGxlZEluZGV4Q2hhbmdlKHQpe3RoaXMuc3RvcmUuZGlzcGF0Y2godFooe2luZGV4OnR9KSl9b25UZW5zb3JOYW1lQ2xpY2sodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChlWih0KSl9fUpLLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxKSykoU20oSXcpKX0sSksuybVjbXA9dG8oe3R5cGU6Skssc2VsZWN0b3JzOltbInRmLWRlYnVnZ2VyLXYyLWdyYXBoLWV4ZWN1dGlvbnMiXV0sZGVjbHM6Nix2YXJzOjE1LGNvbnN0czpbWzMsIm51bUdyYXBoRXhlY3V0aW9ucyIsImdyYXBoRXhlY3V0aW9uRGF0YSIsImdyYXBoRXhlY3V0aW9uSW5kaWNlcyIsImZvY3VzSW5kZXgiLCJmb2N1c0lucHV0SW5kaWNlcyIsIm9uU2Nyb2xsZWRJbmRleENoYW5nZSIsIm9uVGVuc29yTmFtZUNsaWNrIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJncmFwaC1leGVjdXRpb25zLWNvbXBvbmVudCIsMCksVm0oIm9uU2Nyb2xsZWRJbmRleENoYW5nZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25TY3JvbGxlZEluZGV4Q2hhbmdlKGUpfSkpKCJvblRlbnNvck5hbWVDbGljayIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25UZW5zb3JOYW1lQ2xpY2soZSl9KSksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQWgoNCwiYXN5bmMiKSxBaCg1LCJhc3luYyIpLEFtKCkpLDImZSYmRG0oIm51bUdyYXBoRXhlY3V0aW9ucyIsVGgoMSw1LG4ubnVtR3JhcGhFeGVjdXRpb25zJCkpKCJncmFwaEV4ZWN1dGlvbkRhdGEiLFRoKDIsNyxuLmdyYXBoRXhlY3V0aW9uRGF0YSQpKSgiZ3JhcGhFeGVjdXRpb25JbmRpY2VzIixUaCgzLDksbi5ncmFwaEV4ZWN1dGlvbkluZGljZXMkKSkoImZvY3VzSW5kZXgiLFRoKDQsMTEsbi5mb2N1c0luZGV4JCkpKCJmb2N1c0lucHV0SW5kaWNlcyIsVGgoNSwxMyxuLmZvY3VzSW5wdXRJbmRpY2VzJCkpfSxkaXJlY3RpdmVzOltLS10scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEpLLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InRmLWRlYnVnZ2VyLXYyLWdyYXBoLWV4ZWN1dGlvbnMiLHRlbXBsYXRlOidcbiAgICA8Z3JhcGgtZXhlY3V0aW9ucy1jb21wb25lbnRcbiAgICAgIFtudW1HcmFwaEV4ZWN1dGlvbnNdPSJudW1HcmFwaEV4ZWN1dGlvbnMkIHwgYXN5bmMiXG4gICAgICBbZ3JhcGhFeGVjdXRpb25EYXRhXT0iZ3JhcGhFeGVjdXRpb25EYXRhJCB8IGFzeW5jIlxuICAgICAgW2dyYXBoRXhlY3V0aW9uSW5kaWNlc109ImdyYXBoRXhlY3V0aW9uSW5kaWNlcyQgfCBhc3luYyJcbiAgICAgIFtmb2N1c0luZGV4XT0iZm9jdXNJbmRleCQgfCBhc3luYyJcbiAgICAgIFtmb2N1c0lucHV0SW5kaWNlc109ImZvY3VzSW5wdXRJbmRpY2VzJCB8IGFzeW5jIlxuICAgICAgKG9uU2Nyb2xsZWRJbmRleENoYW5nZSk9Im9uU2Nyb2xsZWRJbmRleENoYW5nZSgkZXZlbnQpIlxuICAgICAgKG9uVGVuc29yTmFtZUNsaWNrKT0ib25UZW5zb3JOYW1lQ2xpY2soJGV2ZW50KSJcbiAgICA+PC9ncmFwaC1leGVjdXRpb25zLWNvbXBvbmVudD5cbiAgJ31dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSxudWxsKTtjb25zdCBRSz1mdW5jdGlvbiAkSygpe3JldHVybiB3aW5kb3d9O2Z1bmN0aW9uIHRKKHQpe2NvbnN0IGU9UUsoKS5yZXF1aXJlO3JldHVybiBuZXcgUHJvbWlzZSgobj0+e2UodCxuKX0pKX1mdW5jdGlvbiBlSigpe3JldHVybiBnQSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9UUsoKTtpZih2b2lkIDA9PT10Lm1vbmFjbyl7aWYoIXQucmVxdWlyZSl0aHJvdyBuZXcgRXJyb3IoImxvYWRNb25hY28oKSBmYWlsZWQgYmVjYXVzZSBmdW5jdGlvbiByZXF1aXJlKCkgaXMgdW5hdmFpbGFibGUiKTt0LnJlcXVpcmUuY29uZmlnKHtwYXRoczp7dnM6Ii90Zi1pbXBvcnRzL3ZzIn19KSx5aWVsZCB0SihbInZzL2VkaXRvci9lZGl0b3IubWFpbiJdKSx5aWVsZCB0SihbInZzL3B5dGhvbi9weXRob24uY29udHJpYnV0aW9uIl0pfX0pKX1mdW5jdGlvbiBuSih0KXtyZXR1cm4gdD8idnMtZGFyayI6InZzIn1jbGFzcyBvSntjb25zdHJ1Y3Rvcih0KXt0aGlzLnJlc2l6ZUV2ZW50RGVib3VuY2VQZXJpb2RJbk1zPTEwMCx0aGlzLm9uUmVzaXplPW5ldyBMaCx0aGlzLm5nVW5zdWJzY3JpYmUkPW5ldyBJLHRoaXMub25SZXNpemUkPW5ldyBJO2NvbnN0IGU9bmV3IFJlc2l6ZU9ic2VydmVyKCgoKT0+e3RoaXMub25SZXNpemUkLm5leHQoKX0pKTtlLm9ic2VydmUodC5uYXRpdmVFbGVtZW50KSx0aGlzLm5nVW5zdWJzY3JpYmUkLnN1YnNjcmliZSgoKCk9PntlLnVub2JzZXJ2ZSh0Lm5hdGl2ZUVsZW1lbnQpfSkpfW5nT25Jbml0KCl7dGhpcy5vblJlc2l6ZSQucGlwZShUZSgxKSxnZSh0aGlzLnJlc2l6ZUV2ZW50RGVib3VuY2VQZXJpb2RJbk1zKSxJZSh0aGlzLm5nVW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKCgoKT0+e3RoaXMub25SZXNpemUuZW1pdCgpfSkpfW5nT25EZXN0cm95KCl7dGhpcy5uZ1Vuc3Vic2NyaWJlJC5uZXh0KCksdGhpcy5uZ1Vuc3Vic2NyaWJlJC5jb21wbGV0ZSgpfX1vSi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8b0opKFNtKGhnKSl9LG9KLsm1ZGlyPWxvKHt0eXBlOm9KLHNlbGVjdG9yczpbWyIiLCJkZXRlY3RSZXNpemUiLCIiXV0saW5wdXRzOntyZXNpemVFdmVudERlYm91bmNlUGVyaW9kSW5NczoicmVzaXplRXZlbnREZWJvdW5jZVBlcmlvZEluTXMifSxvdXRwdXRzOntvblJlc2l6ZToib25SZXNpemUifX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgob0osW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2RldGVjdFJlc2l6ZV0ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9XX0pLHtyZXNpemVFdmVudERlYm91bmNlUGVyaW9kSW5Nczpbe3R5cGU6eHl9XSxvblJlc2l6ZTpbe3R5cGU6T3l9XX0pO2NvbnN0IGlKPVsiY29kZVZpZXdlckNvbnRhaW5lciJdO2NsYXNzIGFKe2NvbnN0cnVjdG9yKCl7dGhpcy5saW5lcz1udWxsLHRoaXMuZm9jdXNlZExpbmVubz1udWxsLHRoaXMubW9uYWNvPW51bGwsdGhpcy5lZGl0b3I9bnVsbCx0aGlzLmRlY29yYXRpb25zPVtdLHRoaXMuUkVTSVpFX0RFQk9VTkNFX0lOVEVSVkFMX01TPTUwfW9uUmVzaXplKCl7dGhpcy5lZGl0b3ImJnRoaXMuZWRpdG9yLmxheW91dCgpfW5nT25DaGFuZ2VzKHQpe3ZhciBlO2lmKG51bGw9PT10aGlzLm1vbmFjbylyZXR1cm47Y29uc3Qgbj10Lm1vbmFjbyYmbnVsbD09PXRoaXMuZWRpdG9yO251bGw9PT10aGlzLmVkaXRvciYmKHRoaXMuZWRpdG9yPXRoaXMubW9uYWNvLmVkaXRvci5jcmVhdGUodGhpcy5jb2RlVmlld2VyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQse3ZhbHVlOihudWxsIT09KGU9dGhpcy5saW5lcykmJnZvaWQgMCE9PWU/ZTpbXSkuam9pbigiXG4iKSxsYW5ndWFnZToicHl0aG9uIixyZWFkT25seTohMCxmb250U2l6ZToxMCxtaW5pbWFwOntlbmFibGVkOiEwfSx0aGVtZTpuSih0aGlzLnVzZURhcmtNb2RlKX0pKSx0LmxpbmVzJiZ0aGlzLmxpbmVzJiZ0aGlzLmVkaXRvci5zZXRWYWx1ZSh0aGlzLmxpbmVzLmpvaW4oIlxuIikpO2NvbnN0IG89bnx8dC5mb2N1c2VkTGluZW5vP3RoaXMuZm9jdXNlZExpbmVubzpudWxsO2lmKG8mJnRoaXMubGluZXMpe3RoaXMuZWRpdG9yLnJldmVhbExpbmVJbkNlbnRlcihvLHRoaXMubW9uYWNvLmVkaXRvci5TY3JvbGxUeXBlLlNtb290aCk7Y29uc3QgdD10aGlzLmxpbmVzW28tMV0ubGVuZ3RoO3RoaXMuZGVjb3JhdGlvbnM9dGhpcy5lZGl0b3IuZGVsdGFEZWNvcmF0aW9ucyh0aGlzLmRlY29yYXRpb25zLFt7cmFuZ2U6bmV3IHRoaXMubW9uYWNvLlJhbmdlKG8sMSxvLDEpLG9wdGlvbnM6e2lzV2hvbGVMaW5lOiEwLGxpbmVzRGVjb3JhdGlvbnNDbGFzc05hbWU6ImhpZ2hsaWdodC1ndXR0ZXIifX0se3JhbmdlOm5ldyB0aGlzLm1vbmFjby5SYW5nZShvLDEsbyx0KzEpLG9wdGlvbnM6e2lubGluZUNsYXNzTmFtZToiaGlnaGxpZ2h0LWxpbmUifX1dKX10LnVzZURhcmtNb2RlJiZ0aGlzLm1vbmFjby5lZGl0b3Iuc2V0VGhlbWUobkoodGhpcy51c2VEYXJrTW9kZSkpfX1hSi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8YUopfSxhSi7JtWNtcD10byh7dHlwZTphSixzZWxlY3RvcnM6W1sic291cmNlLWNvZGUtY29tcG9uZW50Il1dLHZpZXdRdWVyeTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiZRaChpSiw3LGhnKSwyJmUpe2xldCB0O0poKHQ9dGIoKSkmJihuLmNvZGVWaWV3ZXJDb250YWluZXI9dC5maXJzdCl9fSxpbnB1dHM6e2xpbmVzOiJsaW5lcyIsZm9jdXNlZExpbmVubzoiZm9jdXNlZExpbmVubyIsbW9uYWNvOiJtb25hY28iLHVzZURhcmtNb2RlOiJ1c2VEYXJrTW9kZSJ9LGZlYXR1cmVzOltCb10sZGVjbHM6Mix2YXJzOjEsY29uc3RzOltbImRldGVjdFJlc2l6ZSIsIiIsMSwiY29kZS12aWV3ZXItY29udGFpbmVyIiwzLCJyZXNpemVFdmVudERlYm91bmNlUGVyaW9kSW5NcyIsIm9uUmVzaXplIl0sWyJjb2RlVmlld2VyQ29udGFpbmVyIiwiIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJkaXYiLDAsMSksVm0oIm9uUmVzaXplIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uUmVzaXplKCl9KSksQW0oKSksMiZlJiZEbSgicmVzaXplRXZlbnREZWJvdW5jZVBlcmlvZEluTXMiLG4uUkVTSVpFX0RFQk9VTkNFX0lOVEVSVkFMX01TKX0sZGlyZWN0aXZlczpbb0pdLHN0eWxlczpbIi5jb2RlLXZpZXdlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG5bX25naG9zdC0lQ09NUCVdICAgICAuaGlnaGxpZ2h0LWd1dHRlciB7XG4gIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAxMTEsIDAsIDAuNyk7XG4gIHdpZHRoOiA1cHggIWltcG9ydGFudDtcbn1cblxuW19uZ2hvc3QtJUNPTVAlXSAgICAgLmhpZ2hsaWdodC1saW5lIHtcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDExMSwgMCwgMC4zKTtcbn0iXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoYUosW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3Rvcjoic291cmNlLWNvZGUtY29tcG9uZW50Iix0ZW1wbGF0ZVVybDoiLi9zb3VyY2VfY29kZV9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9zb3VyY2VfY29kZV9jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7bGluZXM6W3t0eXBlOnh5fV0sZm9jdXNlZExpbmVubzpbe3R5cGU6eHl9XSxtb25hY286W3t0eXBlOnh5fV0sdXNlRGFya01vZGU6W3t0eXBlOnh5fV0sY29kZVZpZXdlckNvbnRhaW5lcjpbe3R5cGU6WmEsYXJnczpbImNvZGVWaWV3ZXJDb250YWluZXIiLHtzdGF0aWM6ITAscmVhZDpoZ31dfV19KTtjbGFzcyBySntjb25zdHJ1Y3Rvcigpe3RoaXMubGluZXM9bnVsbCx0aGlzLmZvY3VzZWRMaW5lbm89bnVsbCx0aGlzLnVzZURhcmtNb2RlPSExLHRoaXMubW9uYWNvJD1udWxsfW5nT25Jbml0KCl7dGhpcy5tb25hY28kPUN0KGVKKCkpLnBpcGUoSXQoKCgpPT53aW5kb3cubW9uYWNvKSkpfX1mdW5jdGlvbiBzSih0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsNiksa3UoMSksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoMSksRHUoIiAiLHQuZm9jdXNlZFNvdXJjZUxpbmVTcGVjLmZpbGVfcGF0aCwiICIpfX1mdW5jdGlvbiBsSih0LGUpezEmdCYmKFJtKDAsImRpdiIsNyksa3UoMSwiIE5vIGZpbGUgc2VsZWN0ZWQuIENsaWNrIGEgbGluZSBudW1iZXIgaW4gdGhlIFN0YWNrIFRyYWNlIHNlY3Rpb24gdG8gc2hvdyB0aGUgc291cmNlIGNvZGUuICIpLEFtKCkpfWZ1bmN0aW9uIGNKKHQsZSl7aWYoMSZ0JiZUbSgwLCJzb3VyY2UtY29kZSIsOCksMiZ0KXtjb25zdCB0PVltKCk7RG0oImxpbmVzIix0LmZvY3VzZWRTb3VyY2VGaWxlQ29udGVudC5saW5lcykoImZvY3VzZWRMaW5lbm8iLHQuZm9jdXNlZFNvdXJjZUxpbmVTcGVjLmxpbmVubykoInVzZURhcmtNb2RlIix0LnVzZURhcmtNb2RlKX19ckouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHJKKX0sckouybVjbXA9dG8oe3R5cGU6ckosc2VsZWN0b3JzOltbInNvdXJjZS1jb2RlIl1dLGlucHV0czp7bGluZXM6ImxpbmVzIixmb2N1c2VkTGluZW5vOiJmb2N1c2VkTGluZW5vIix1c2VEYXJrTW9kZToidXNlRGFya01vZGUifSxkZWNsczoyLHZhcnM6Nixjb25zdHM6W1szLCJsaW5lcyIsImZvY3VzZWRMaW5lbm8iLCJtb25hY28iLCJ1c2VEYXJrTW9kZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwic291cmNlLWNvZGUtY29tcG9uZW50IiwwKSxBaCgxLCJhc3luYyIpKSwyJmUmJkRtKCJsaW5lcyIsbi5saW5lcykoImZvY3VzZWRMaW5lbm8iLG4uZm9jdXNlZExpbmVubykoIm1vbmFjbyIsVGgoMSw0LG4ubW9uYWNvJCkpKCJ1c2VEYXJrTW9kZSIsbi51c2VEYXJrTW9kZSl9LGRpcmVjdGl2ZXM6W2FKXSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246Mn0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgockosW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3Rvcjoic291cmNlLWNvZGUiLHRlbXBsYXRlOidcbiAgICA8c291cmNlLWNvZGUtY29tcG9uZW50XG4gICAgICBbbGluZXNdPSJsaW5lcyJcbiAgICAgIFtmb2N1c2VkTGluZW5vXT0iZm9jdXNlZExpbmVubyJcbiAgICAgIFttb25hY29dPSJtb25hY28kIHwgYXN5bmMiXG4gICAgICBbdXNlRGFya01vZGVdPSJ1c2VEYXJrTW9kZSJcbiAgICA+PC9zb3VyY2UtY29kZS1jb21wb25lbnQ+XG4gICd9XX1dLChmdW5jdGlvbigpe3JldHVybltdfSkse2xpbmVzOlt7dHlwZTp4eX1dLGZvY3VzZWRMaW5lbm86W3t0eXBlOnh5fV0sdXNlRGFya01vZGU6W3t0eXBlOnh5fV19KTtjbGFzcyBkSntjb25zdHJ1Y3Rvcigpe3RoaXMuZm9jdXNlZFNvdXJjZUZpbGVDb250ZW50PW51bGwsdGhpcy5mb2N1c2VkU291cmNlTGluZVNwZWM9bnVsbH19ZEouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGRKKX0sZEouybVjbXA9dG8oe3R5cGU6ZEosc2VsZWN0b3JzOltbInNvdXJjZS1maWxlcy1jb21wb25lbnQiXV0saW5wdXRzOntmb2N1c2VkU291cmNlRmlsZUNvbnRlbnQ6ImZvY3VzZWRTb3VyY2VGaWxlQ29udGVudCIsZm9jdXNlZFNvdXJjZUxpbmVTcGVjOiJmb2N1c2VkU291cmNlTGluZVNwZWMiLHVzZURhcmtNb2RlOiJ1c2VEYXJrTW9kZSJ9LGRlY2xzOjgsdmFyczozLGNvbnN0czpbWzEsInNvdXJjZS1maWxlcy1jb250YWluZXIiXSxbMSwiaGVhZGVyLXNlY3Rpb24iXSxbMSwidGl0bGUtdGFnIl0sWyJjbGFzcyIsImZpbGUtbGFiZWwiLDQsIm5nSWYiLCJuZ0lmRWxzZSJdLFsibm9GaWxlU2VsZWN0ZWQiLCIiXSxbMywibGluZXMiLCJmb2N1c2VkTGluZW5vIiwidXNlRGFya01vZGUiLDQsIm5nSWYiXSxbMSwiZmlsZS1sYWJlbCJdLFsxLCJuby1maWxlLXNlbGVjdGVkIl0sWzMsImxpbmVzIiwiZm9jdXNlZExpbmVubyIsInVzZURhcmtNb2RlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihSbSgwLCJkaXYiLDApLFJtKDEsImRpdiIsMSksUm0oMiwiZGl2IiwyKSxrdSgzLCJTb3VyY2UgQ29kZSIpLEFtKCksUXAoNCxzSiwyLDEsImRpdiIsMyksUXAoNSxsSiwyLDAsIm5nLXRlbXBsYXRlIixudWxsLDQsaWIpLEFtKCksUXAoNyxjSiwxLDMsInNvdXJjZS1jb2RlIiw1KSxBbSgpKSwyJmUpe2NvbnN0IHQ9JHAoNik7cmMoNCksRG0oIm5nSWYiLG51bGwhPT1uLmZvY3VzZWRTb3VyY2VMaW5lU3BlYykoIm5nSWZFbHNlIix0KSxyYygzKSxEbSgibmdJZiIsbnVsbCE9PW4uZm9jdXNlZFNvdXJjZUZpbGVDb250ZW50JiZudWxsIT09bi5mb2N1c2VkU291cmNlTGluZVNwZWMmJm51bGwhPT1uLmZvY3VzZWRTb3VyY2VGaWxlQ29udGVudC5saW5lcyl9fSxkaXJlY3RpdmVzOltkTSxySl0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9LmhlYWRlci1zZWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmViO2Rpc3BsYXk6ZmxleDtoZWlnaHQ6MjRweDtwYWRkaW5nLWJvdHRvbTo2cHg7dmVydGljYWwtYWxpZ246bWlkZGxlO3doaXRlLXNwYWNlOm5vd3JhcDt3aWR0aDoxMDAlfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5oZWFkZXItc2VjdGlvbltfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5oZWFkZXItc2VjdGlvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzU1NX0uZmlsZS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC13ZWlnaHQ6bm9ybWFsO3doaXRlLXNwYWNlOm5vcm1hbDtvdmVyZmxvdy13cmFwOmFueXdoZXJlO292ZXJmbG93LXk6YXV0bztwYWRkaW5nOjAgMjBweH0ubm8tZmlsZS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTppbmxpbmUtYmxvY2s7Y29sb3I6IzY2NjtwYWRkaW5nOjAgMjBweDt3aGl0ZS1zcGFjZTpub3JtYWx9LnNvdXJjZS1maWxlcy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Zm9udC1mYW1pbHk6IlJvYm90byBNb25vIixtb25vc3BhY2U7Zm9udC1zaXplOjEwcHg7aGVpZ2h0OjEwMCV9LnRpdGxlLXRhZ1tfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC13ZWlnaHQ6Ym9sZDtoZWlnaHQ6MTAwJTtwYWRkaW5nLWxlZnQ6NnB4O3ZlcnRpY2FsLWFsaWduOnRvcH1zb3VyY2UtY29kZVtfbmdjb250ZW50LSVDT01QJV17ZmxleC1ncm93OjE7d2lkdGg6MTAwJX0nXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZEosW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3Rvcjoic291cmNlLWZpbGVzLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vc291cmNlX2ZpbGVzX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyIuL3NvdXJjZV9maWxlc19jb21wb25lbnQuY3NzIl19XX1dLG51bGwse2ZvY3VzZWRTb3VyY2VGaWxlQ29udGVudDpbe3R5cGU6eHl9XSxmb2N1c2VkU291cmNlTGluZVNwZWM6W3t0eXBlOnh5fV0sdXNlRGFya01vZGU6W3t0eXBlOnh5fV19KTtjbGFzcyBwSntjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5mb2N1c2VkU291cmNlRmlsZUNvbnRlbnQkPXRoaXMuc3RvcmUuc2VsZWN0KHlYKSx0aGlzLmZvY3VzZWRTb3VyY2VMaW5lU3BlYyQ9dGhpcy5zdG9yZS5zZWxlY3QoX1gpLHRoaXMudXNlRGFya01vZGUkPXRoaXMuc3RvcmUuc2VsZWN0KEpEKX19cEouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHBKKShTbShJdykpfSxwSi7JtWNtcD10byh7dHlwZTpwSixzZWxlY3RvcnM6W1sidGYtZGVidWdnZXItdjItc291cmNlLWZpbGVzIl1dLGRlY2xzOjQsdmFyczo5LGNvbnN0czpbWzMsImZvY3VzZWRTb3VyY2VGaWxlQ29udGVudCIsImZvY3VzZWRTb3VyY2VMaW5lU3BlYyIsInVzZURhcmtNb2RlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihUbSgwLCJzb3VyY2UtZmlsZXMtY29tcG9uZW50IiwwKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQWgoMywiYXN5bmMiKSksMiZlJiZEbSgiZm9jdXNlZFNvdXJjZUZpbGVDb250ZW50IixUaCgxLDMsbi5mb2N1c2VkU291cmNlRmlsZUNvbnRlbnQkKSkoImZvY3VzZWRTb3VyY2VMaW5lU3BlYyIsVGgoMiw1LG4uZm9jdXNlZFNvdXJjZUxpbmVTcGVjJCkpKCJ1c2VEYXJrTW9kZSIsVGgoMyw3LG4udXNlRGFya01vZGUkKSl9LGRpcmVjdGl2ZXM6W2RKXSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246Mn0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgocEosW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoidGYtZGVidWdnZXItdjItc291cmNlLWZpbGVzIix0ZW1wbGF0ZTonXG4gICAgPHNvdXJjZS1maWxlcy1jb21wb25lbnRcbiAgICAgIFtmb2N1c2VkU291cmNlRmlsZUNvbnRlbnRdPSJmb2N1c2VkU291cmNlRmlsZUNvbnRlbnQkIHwgYXN5bmMiXG4gICAgICBbZm9jdXNlZFNvdXJjZUxpbmVTcGVjXT0iZm9jdXNlZFNvdXJjZUxpbmVTcGVjJCB8IGFzeW5jIlxuICAgICAgW3VzZURhcmtNb2RlXT0idXNlRGFya01vZGUkIHwgYXN5bmMiXG4gICAgPjwvc291cmNlLWZpbGVzLWNvbXBvbmVudD5cbiAgJ31dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSxudWxsKTtjb25zdCBtSj1bInN0YWNrRnJhbWVBcnJheSJdO2Z1bmN0aW9uIHVKKHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIsMTMpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgzKTtyYygxKSxEdSgiICMiLHQuZXhlY3V0aW9uSW5kZXgsIjogIil9fWZ1bmN0aW9uIGZKKHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIsMTQpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgzKTtyYygxKSxEdSgiICIsdC5vcFR5cGUsIiAiKX19ZnVuY3Rpb24gZ0oodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiKSxrdSgxLCIgRWFnZXIgZXhlY3V0aW9uICIpLFFwKDIsdUosMiwxLCJzcGFuIiwxMSksUXAoMyxmSiwyLDEsInNwYW4iLDEyKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMik7cmMoMiksRG0oIm5nSWYiLG51bGwhPT10Lm9wVHlwZSkscmMoMSksRG0oIm5nSWYiLG51bGwhPT10Lm9wVHlwZSl9fWZ1bmN0aW9uIGhKKHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIsMTYpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgzKTtyYygxKSxEdSgnICInLHQub3BOYW1lLCciICcpfX1mdW5jdGlvbiBiSih0LGUpe2lmKDEmdCYmKFJtKDAsInNwYW4iLDE0KSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMyk7cmMoMSksRHUoIiAiLHQub3BUeXBlLCIgIil9fWZ1bmN0aW9uIHlKKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2Iiksa3UoMSwiIENyZWF0aW9uIG9mIGdyYXBoIG9wICIpLFFwKDIsaEosMiwxLCJzcGFuIiwxNSksUXAoMyxiSiwyLDEsInNwYW4iLDEyKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMik7cmMoMiksRG0oIm5nSWYiLG51bGwhPT10Lm9wTmFtZSkscmMoMSksRG0oIm5nSWYiLG51bGwhPT10Lm9wVHlwZSl9fWZ1bmN0aW9uIF9KKHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIsMTcpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgyKTtyYygxKSxEdSgiIChIb3N0IG5hbWU6ICIsdC5zdGFja0ZyYW1lc0ZvckRpc3BsYXlbMF0uaG9zdF9uYW1lLCIpICIpfX1mdW5jdGlvbiBDSih0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsNyksUm0oMSwic3BhbiIpLFJtKDIsInNwYW4iLDgpLFFwKDMsZ0osNCwyLCJkaXYiLDkpLFFwKDQseUosNCwyLCJkaXYiLDkpLEFtKCksQW0oKSxSbSg1LCJkaXYiKSxRcCg2LF9KLDIsMSwic3BhbiIsMTApLEFtKCksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoMiksRG0oIm5nU3dpdGNoIix0LmNvZGVMb2NhdGlvblR5cGUpLHJjKDEpLERtKCJuZ1N3aXRjaENhc2UiLHQuQ29kZUxvY2F0aW9uVHlwZS5FWEVDVVRJT04pLHJjKDEpLERtKCJuZ1N3aXRjaENhc2UiLHQuQ29kZUxvY2F0aW9uVHlwZS5HUkFQSF9PUF9DUkVBVElPTikscmMoMiksRG0oIm5nSWYiLG51bGwhPT10LnN0YWNrRnJhbWVzRm9yRGlzcGxheSYmdC5zdGFja0ZyYW1lc0ZvckRpc3BsYXkubGVuZ3RoPjApfX1mdW5jdGlvbiBNSih0LGUpezEmdCYmKFJtKDAsImRpdiIsMTgpLGt1KDEsIiBDbGljayBhbiBlYWdlciBleGVjdXRpb24gb3IgZ3JhcGggb3AgdG8gc2hvdyBpdHMgb3JpZ2luYWwgc3RhY2sgdHJhY2UuICIpLEFtKCkpfWZ1bmN0aW9uIHZKKHQsZSl7MSZ0JiYoUm0oMCwiZGl2IiwyOCksa3UoMSwiIOKkkyAiKSxBbSgpKX1jb25zdCB4Sj1mdW5jdGlvbih0LGUpe3JldHVyblt0LGVdfTtmdW5jdGlvbiBPSih0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsImRpdiIsMjIpLFJtKDEsImRpdiIsMjMpLGt1KDIpLEFtKCksUm0oMywiZGl2IiwyNCksUXAoNCx2SiwyLDAsImRpdiIsMjUpLFJtKDUsImRpdiIsMjYpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUoKXtjb25zdCBuPWhpKHQpLiRpbXBsaWNpdDtyZXR1cm4gWW0oMikub25Tb3VyY2VMaW5lQ2xpY2tlZC5lbWl0KG4pfSkpLGt1KDYpLEFtKCksUm0oNywiZGl2IiwyNyksa3UoOCksQW0oKSxBbSgpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oMik7RG0oIm5nQ2xhc3MiLHZoKDYseEosdC5iZWxvbmdzVG9Gb2N1c2VkRmlsZT8iZm9jdXNlZC1maWxlIjoiIix0LmZvY3VzZWQ/ImZvY3VzZWQtc3RhY2stZnJhbWUiOiIiKSkscmMoMSksS20oInRpdGxlIix0LmZpbGVfcGF0aCkscmMoMSksRHUoIiAiLHQuY29uY2lzZV9maWxlX3BhdGgsIiAiKSxyYygyKSxEbSgibmdJZiIsbi5zdGlja1RvQm90dG9tbW9zdEZyYW1lSW5Gb2N1c2VkRmlsZSYmdC5mb2N1c2VkKSxyYygyKSxEdSgiIExpbmUgIix0LmxpbmVubywiICIpLHJjKDIpLER1KCIgIix0LmZ1bmN0aW9uX25hbWUsIiAiKX19ZnVuY3Rpb24gUEoodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDE5LDIwKSxRcCgyLE9KLDksOSwiZGl2IiwyMSksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoMiksRG0oIm5nRm9yT2YiLHQuc3RhY2tGcmFtZXNGb3JEaXNwbGF5KX19ZnVuY3Rpb24gd0oodCxlKXt9Y2xhc3Mga0p7Y29uc3RydWN0b3IoKXt0aGlzLnN0YWNrRnJhbWVzRm9yRGlzcGxheT1udWxsLHRoaXMub25Tb3VyY2VMaW5lQ2xpY2tlZD1uZXcgTGgsdGhpcy5Db2RlTG9jYXRpb25UeXBlPWZafW5nQWZ0ZXJWaWV3Q2hlY2tlZCgpe2lmKHZvaWQgMD09PXRoaXMuc3RhY2tGcmFtZUFycmF5KXJldHVybjtjb25zdCB0PXRoaXMuc3RhY2tGcmFtZUFycmF5Lm5hdGl2ZUVsZW1lbnQsZT10LnF1ZXJ5U2VsZWN0b3IoIi5mb2N1c2VkLXN0YWNrLWZyYW1lIik7aWYobnVsbCE9PWUpcmV0dXJuIHZvaWQgdGhpcy5zY3JvbGxUb0VsZW1lbnQodCxlKTtjb25zdCBuPXQucXVlcnlTZWxlY3RvcigiLnN0YWNrLWZyYW1lLWNvbnRhaW5lcjpsYXN0LWNoaWxkIik7bnVsbCE9PW4mJnRoaXMuc2Nyb2xsVG9FbGVtZW50KHQsbil9c2Nyb2xsVG9FbGVtZW50KHQsZSl7dC5zY3JvbGxUb3A9ZS5vZmZzZXRUb3B9fWtKLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxrSil9LGtKLsm1Y21wPXRvKHt0eXBlOmtKLHNlbGVjdG9yczpbWyJzdGFjay10cmFjZS1jb21wb25lbnQiXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJlFoKG1KLDUpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uc3RhY2tGcmFtZUFycmF5PXQuZmlyc3QpfX0saW5wdXRzOntjb2RlTG9jYXRpb25UeXBlOiJjb2RlTG9jYXRpb25UeXBlIixvcFR5cGU6Im9wVHlwZSIsb3BOYW1lOiJvcE5hbWUiLGV4ZWN1dGlvbkluZGV4OiJleGVjdXRpb25JbmRleCIsc3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGU6InN0aWNrVG9Cb3R0b21tb3N0RnJhbWVJbkZvY3VzZWRGaWxlIixzdGFja0ZyYW1lc0ZvckRpc3BsYXk6InN0YWNrRnJhbWVzRm9yRGlzcGxheSJ9LG91dHB1dHM6e29uU291cmNlTGluZUNsaWNrZWQ6Im9uU291cmNlTGluZUNsaWNrZWQifSxkZWNsczoxMCx2YXJzOjQsY29uc3RzOltbMSwic3RhY2stdHJhY2UtY29udGFpbmVyIl0sWzEsInN0YWNrLXRyYWNlLWhlYWRlciJdLFsxLCJzdGFjay10cmFjZS10aXRsZSJdLFsiY2xhc3MiLCJzdGFjay10cmFjZS1hdXgtaW5mbyIsNCwibmdJZiIsIm5nSWZFbHNlIl0sWyJub1N0YWNrVHJhY2UiLCIiXSxbImNsYXNzIiwic3RhY2stZnJhbWUtYXJyYXkiLDQsIm5nSWYiLCJuZ0lmRWxzZSJdLFsibG9hZGluZ1NlY3Rpb24iLCIiXSxbMSwic3RhY2stdHJhY2UtYXV4LWluZm8iXSxbMSwiY29kZS1sb2NhdGlvbi1vcmlnaW4iLDMsIm5nU3dpdGNoIl0sWzQsIm5nU3dpdGNoQ2FzZSJdLFsiY2xhc3MiLCJzdGFjay10cmFjZS1ob3N0LW5hbWUiLDQsIm5nSWYiXSxbImNsYXNzIiwiZWFnZXItZXhlY3V0aW9uLWluZGV4Iiw0LCJuZ0lmIl0sWyJjbGFzcyIsIm9wLXR5cGUiLDQsIm5nSWYiXSxbMSwiZWFnZXItZXhlY3V0aW9uLWluZGV4Il0sWzEsIm9wLXR5cGUiXSxbImNsYXNzIiwib3AtbmFtZSIsNCwibmdJZiJdLFsxLCJvcC1uYW1lIl0sWzEsInN0YWNrLXRyYWNlLWhvc3QtbmFtZSJdLFsxLCJzdGFjay10cmFjZS1hdXgtaW5mbyIsIm5vLXN0YWNrLXRyYWNlIl0sWzEsInN0YWNrLWZyYW1lLWFycmF5Il0sWyJzdGFja0ZyYW1lQXJyYXkiLCIiXSxbImNsYXNzIiwic3RhY2stZnJhbWUtY29udGFpbmVyIiwzLCJuZ0NsYXNzIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbMSwic3RhY2stZnJhbWUtY29udGFpbmVyIiwzLCJuZ0NsYXNzIl0sWzEsInN0YWNrLWZyYW1lLWZpbGUtcGF0aCIsMywidGl0bGUiXSxbMSwic3RhY2stZnJhbWUtbGluZW5vLWZ1bmN0aW9uIl0sWyJjbGFzcyIsInN0aWNrLXRvLWJvdHRvbW1vc3QtaW5kaWNhdG9yIiwidGl0bGUiLCJTdGlja2luZyB0byB0aGUgYm90dG9tbW9zdCBmcmFtZSBpbiB0aGUgY3VycmVudCBzb3VyY2UgZmlsZSB3aGVuIG5hdmlnYXRpbmcgZXhlY3V0aW9ucyBhbmQgZ3JhcGggb3BzLiBUbyByZW1vdmUgdGhpcyBzdGlja2luZywgY2xpY2sgYW55IG5vbi1ib3R0b21tb3N0IHN0YWNrIGZyYW1lLiIsNCwibmdJZiJdLFsxLCJzdGFjay1mcmFtZS1saW5lbm8iLDMsImNsaWNrIl0sWzEsInN0YWNrLWZyYW1lLWZ1bmN0aW9uIl0sWyJ0aXRsZSIsIlN0aWNraW5nIHRvIHRoZSBib3R0b21tb3N0IGZyYW1lIGluIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlIHdoZW4gbmF2aWdhdGluZyBleGVjdXRpb25zIGFuZCBncmFwaCBvcHMuIFRvIHJlbW92ZSB0aGlzIHN0aWNraW5nLCBjbGljayBhbnkgbm9uLWJvdHRvbW1vc3Qgc3RhY2sgZnJhbWUuIiwxLCJzdGljay10by1ib3R0b21tb3N0LWluZGljYXRvciJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoUm0oMCwiZGl2IiwwKSxSbSgxLCJkaXYiLDEpLFJtKDIsInNwYW4iLDIpLGt1KDMsIiBTdGFjayBUcmFjZSAiKSxBbSgpLFFwKDQsQ0osNyw0LCJkaXYiLDMpLFFwKDUsTUosMiwwLCJuZy10ZW1wbGF0ZSIsbnVsbCw0LGliKSxBbSgpLFFwKDcsUEosMywxLCJkaXYiLDUpLFFwKDgsd0osMCwwLCJuZy10ZW1wbGF0ZSIsbnVsbCw2LGliKSxBbSgpKSwyJmUpe2NvbnN0IHQ9JHAoNiksZT0kcCg5KTtyYyg0KSxEbSgibmdJZiIsbnVsbCE9PW4uY29kZUxvY2F0aW9uVHlwZSkoIm5nSWZFbHNlIix0KSxyYygzKSxEbSgibmdJZiIsbnVsbCE9PW4uc3RhY2tGcmFtZXNGb3JEaXNwbGF5KSgibmdJZkVsc2UiLGUpfX0sZGlyZWN0aXZlczpbZE0sZk0sZ00sbE0sYU1dLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5mb2N1c2VkLWZpbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OmJvbGR9LmZvY3VzZWQtc3RhY2stZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTExLDAsLjMpfS5uby1zdGFjay10cmFjZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Z3JheX0ub3AtbmFtZVtfbmdjb250ZW50LSVDT01QJV17d29yZC13cmFwOmFueXdoZXJlfS5vcC10eXBlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlY2VmZjE7Ym9yZGVyOjFweCBzb2xpZCAjZWJlYmViO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtZmFtaWx5OiJSb2JvdG8gTW9ubyIsbW9ub3NwYWNlO2ZvbnQtc2l6ZToxMHB4O2hlaWdodDoxNHB4O2xpbmUtaGVpZ2h0OjE0cHg7cGFkZGluZzoxcHggM3B4O3dpZHRoOm1heC1jb250ZW50fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5vcC10eXBlW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLm9wLXR5cGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjoxcHggc29saWQgIzU1NX1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAub3AtdHlwZVtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5vcC10eXBlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiM0NTVhNjR9LnN0YWNrLWZyYW1lLWFycmF5W19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87d2lkdGg6Y2FsYygxMDAlIC0gOHB4KX0uc3RhY2stZnJhbWUtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjYTBhMGEwfS5zdGFjay1mcmFtZS1maWxlLXBhdGhbX25nY29udGVudC0lQ09NUCVde21heC13aWR0aDoxODBweDt3aWR0aDoxODBweH0uc3RhY2stZnJhbWUtbGluZW5vLWZ1bmN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXt0ZXh0LWFsaWduOnJpZ2h0O3doaXRlLXNwYWNlOm5vd3JhcH0uc3RhY2stZnJhbWUtZnVuY3Rpb25bX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lLWJsb2NrO21heC13aWR0aDoyMDBweDtwYWRkaW5nLWxlZnQ6MTBweDt0ZXh0LWFsaWduOmxlZnQ7d2hpdGUtc3BhY2U6bm9ybWFsO3dpZHRoOjIwMHB4O3dvcmQtd3JhcDphbnl3aGVyZX0uc3RhY2stZnJhbWUtbGluZW5vW19uZ2NvbnRlbnQtJUNPTVAlXXtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmlubGluZS1ibG9jazttYXgtd2lkdGg6ODBweDt0ZXh0LWFsaWduOmxlZnQ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt3aWR0aDo4MHB4fS5zdGFjay10cmFjZS1hdXgtaW5mb1tfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDoxNXB4O3BhZGRpbmctbGVmdDoyNHB4fS5zdGFjay10cmFjZS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjZWJlYmViO2JveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmZsZXg7ZmxleC1mbG93OmNvbHVtbjtmb250LXNpemU6MTBweDtmb250LWZhbWlseToiUm9ib3RvIE1vbm8iLG1vbm9zcGFjZTtoZWlnaHQ6MTAwJTttYXJnaW4tbGVmdDo4cHg7bWF4LWhlaWdodDozNjBweDtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmhpZGRlbjtwYWRkaW5nLWxlZnQ6OHB4O3dpZHRoOjEwMCV9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLnN0YWNrLXRyYWNlLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5zdGFjay10cmFjZS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjNTU1fS5zdGFjay10cmFjZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MCA1cHggM3B4IC0zcHggI2NjYztwYWRkaW5nLWJvdHRvbTozcHh9LnN0YWNrLXRyYWNlLWhvc3QtbmFtZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Z3JheX0uc3RhY2stdHJhY2UtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OmJvbGR9LnN0aWNrLXRvLWJvdHRvbW1vc3QtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXdlaWdodDpib2xkO2ZvbnQtc2l6ZToxMnB4O3BhZGRpbmctcmlnaHQ6M3B4fSddfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChrSixbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJzdGFjay10cmFjZS1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiIuL3N0YWNrX3RyYWNlX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyIuL3N0YWNrX3RyYWNlX2NvbXBvbmVudC5jc3MiXX1dfV0sbnVsbCx7Y29kZUxvY2F0aW9uVHlwZTpbe3R5cGU6eHl9XSxvcFR5cGU6W3t0eXBlOnh5fV0sb3BOYW1lOlt7dHlwZTp4eX1dLGV4ZWN1dGlvbkluZGV4Olt7dHlwZTp4eX1dLHN0aWNrVG9Cb3R0b21tb3N0RnJhbWVJbkZvY3VzZWRGaWxlOlt7dHlwZTp4eX1dLHN0YWNrRnJhbWVzRm9yRGlzcGxheTpbe3R5cGU6eHl9XSxvblNvdXJjZUxpbmVDbGlja2VkOlt7dHlwZTpPeX1dLHN0YWNrRnJhbWVBcnJheTpbe3R5cGU6WmEsYXJnczpbInN0YWNrRnJhbWVBcnJheSJdfV19KTtjbGFzcyBTSntjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5jb2RlTG9jYXRpb25UeXBlJD10aGlzLnN0b3JlLnBpcGUoRncoWncodVgsKHQ9Pm51bGw9PT10P251bGw6dC5jb2RlTG9jYXRpb25UeXBlKSkpKSx0aGlzLm9wVHlwZSQ9dGhpcy5zdG9yZS5waXBlKEZ3KFp3KHVYLCh0PT5udWxsPT09dD9udWxsOnQub3BUeXBlKSkpKSx0aGlzLm9wTmFtZSQ9dGhpcy5zdG9yZS5waXBlKEZ3KFp3KHVYLCh0PT5udWxsPT09dHx8dC5jb2RlTG9jYXRpb25UeXBlIT09ZlouR1JBUEhfT1BfQ1JFQVRJT04/bnVsbDp0Lm9wTmFtZSkpKSksdGhpcy5leGVjdXRpb25JbmRleCQ9dGhpcy5zdG9yZS5waXBlKEZ3KFp3KHVYLCh0PT5udWxsPT09dHx8dC5jb2RlTG9jYXRpb25UeXBlIT09ZlouRVhFQ1VUSU9OP251bGw6dC5leGVjdXRpb25JbmRleCkpKSksdGhpcy5zdGlja1RvQm90dG9tbW9zdEZyYW1lSW5Gb2N1c2VkRmlsZSQ9dGhpcy5zdG9yZS5waXBlKEZ3KENYKSksdGhpcy5zdGFja0ZyYW1lc0ZvckRpc3BsYXkkPXRoaXMuc3RvcmUucGlwZShGdyhadyhmWCxfWCwoKHQsZSk9PntpZihudWxsPT09dClyZXR1cm4gbnVsbDtjb25zdCBuPVtdO2Zvcihjb25zdCBvIG9mIHQpe2NvbnN0e2hvc3RfbmFtZTp0LGZpbGVfcGF0aDppLGxpbmVubzphLGZ1bmN0aW9uX25hbWU6cn09byxzPWkuc3BsaXQoIi8iKSxsPW51bGwhPT1lJiZ0PT09ZS5ob3N0X25hbWUmJmk9PT1lLmZpbGVfcGF0aDtuLnB1c2goe2hvc3RfbmFtZTp0LGZpbGVfcGF0aDppLGNvbmNpc2VfZmlsZV9wYXRoOnNbcy5sZW5ndGgtMV0sbGluZW5vOmEsZnVuY3Rpb25fbmFtZTpyLGJlbG9uZ3NUb0ZvY3VzZWRGaWxlOmwsZm9jdXNlZDpsJiZhPT09ZS5saW5lbm99KX1yZXR1cm4gbn0pKSkpfW9uU291cmNlTGluZUNsaWNrZWQodCl7Y29uc3R7aG9zdF9uYW1lOmUsZmlsZV9wYXRoOm4sbGluZW5vOm8sZnVuY3Rpb25fbmFtZTppfT10O3RoaXMuc3RvcmUuZGlzcGF0Y2goc1ooe3N0YWNrRnJhbWU6e2hvc3RfbmFtZTplLGZpbGVfcGF0aDpuLGxpbmVubzpvLGZ1bmN0aW9uX25hbWU6aX19KSl9fWZ1bmN0aW9uIERKKHQsZSl7MSZ0JiZUbSgwLCJ0Zi1kZWJ1Z2dlci12Mi1pbmFjdGl2ZSIpfWZ1bmN0aW9uIEVKKHQsZSl7MSZ0JiYoUm0oMCwiZGl2IiwzKSxUbSgxLCJ0Zi1kZWJ1Z2dlci12Mi1hbGVydHMiKSxSbSgyLCJkaXYiLDQpLFRtKDMsInRmLWRlYnVnZ2VyLXYyLXRpbWVsaW5lIiksVG0oNCwidGYtZGVidWdnZXItdjItZ3JhcGgiKSxBbSgpLFRtKDUsInRmLWRlYnVnZ2VyLXYyLWdyYXBoLWV4ZWN1dGlvbnMiKSxBbSgpLFJtKDYsImRpdiIsNSksVG0oNywidGYtZGVidWdnZXItdjItc291cmNlLWZpbGVzIiksVG0oOCwidGYtZGVidWdnZXItdjItc3RhY2stdHJhY2UiKSxBbSgpKX1TSi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8U0opKFNtKEl3KSl9LFNKLsm1Y21wPXRvKHt0eXBlOlNKLHNlbGVjdG9yczpbWyJ0Zi1kZWJ1Z2dlci12Mi1zdGFjay10cmFjZSJdXSxkZWNsczo3LHZhcnM6MTgsY29uc3RzOltbMywiY29kZUxvY2F0aW9uVHlwZSIsIm9wVHlwZSIsIm9wTmFtZSIsImV4ZWN1dGlvbkluZGV4Iiwic3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGUiLCJzdGFja0ZyYW1lc0ZvckRpc3BsYXkiLCJvblNvdXJjZUxpbmVDbGlja2VkIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJzdGFjay10cmFjZS1jb21wb25lbnQiLDApLFZtKCJvblNvdXJjZUxpbmVDbGlja2VkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblNvdXJjZUxpbmVDbGlja2VkKGUpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBaCgzLCJhc3luYyIpLEFoKDQsImFzeW5jIiksQWgoNSwiYXN5bmMiKSxBaCg2LCJhc3luYyIpLEFtKCkpLDImZSYmRG0oImNvZGVMb2NhdGlvblR5cGUiLFRoKDEsNixuLmNvZGVMb2NhdGlvblR5cGUkKSkoIm9wVHlwZSIsVGgoMiw4LG4ub3BUeXBlJCkpKCJvcE5hbWUiLFRoKDMsMTAsbi5vcE5hbWUkKSkoImV4ZWN1dGlvbkluZGV4IixUaCg0LDEyLG4uZXhlY3V0aW9uSW5kZXgkKSkoInN0aWNrVG9Cb3R0b21tb3N0RnJhbWVJbkZvY3VzZWRGaWxlIixUaCg1LDE0LG4uc3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGUkKSkoInN0YWNrRnJhbWVzRm9yRGlzcGxheSIsVGgoNiwxNixuLnN0YWNrRnJhbWVzRm9yRGlzcGxheSQpKX0sZGlyZWN0aXZlczpba0pdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChTSixbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJ0Zi1kZWJ1Z2dlci12Mi1zdGFjay10cmFjZSIsdGVtcGxhdGU6J1xuICAgIDxzdGFjay10cmFjZS1jb21wb25lbnRcbiAgICAgIFtjb2RlTG9jYXRpb25UeXBlXT0iY29kZUxvY2F0aW9uVHlwZSQgfCBhc3luYyJcbiAgICAgIFtvcFR5cGVdPSJvcFR5cGUkIHwgYXN5bmMiXG4gICAgICBbb3BOYW1lXT0ib3BOYW1lJCB8IGFzeW5jIlxuICAgICAgW2V4ZWN1dGlvbkluZGV4XT0iZXhlY3V0aW9uSW5kZXgkIHwgYXN5bmMiXG4gICAgICBbc3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGVdPSJcbiAgICAgICAgc3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGUkIHwgYXN5bmNcbiAgICAgICJcbiAgICAgIFtzdGFja0ZyYW1lc0ZvckRpc3BsYXldPSJzdGFja0ZyYW1lc0ZvckRpc3BsYXkkIHwgYXN5bmMiXG4gICAgICAob25Tb3VyY2VMaW5lQ2xpY2tlZCk9Im9uU291cmNlTGluZUNsaWNrZWQoJGV2ZW50KSJcbiAgICA+PC9zdGFjay10cmFjZS1jb21wb25lbnQ+XG4gICd9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y2xhc3MgUkp7Y29uc3RydWN0b3IoKXt0aGlzLnJ1bnM9e30sdGhpcy5ydW5JZHM9W10sdGhpcy5hY3RpdmVSdW5JZD1udWxsfX1SSi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8UkopfSxSSi7JtWNtcD10byh7dHlwZTpSSixzZWxlY3RvcnM6W1siZGVidWdnZXItY29tcG9uZW50Il1dLGlucHV0czp7cnVuczoicnVucyIscnVuSWRzOiJydW5JZHMiLGFjdGl2ZVJ1bklkOiJhY3RpdmVSdW5JZCJ9LGRlY2xzOjQsdmFyczoyLGNvbnN0czpbWzEsImRlYnVnZ2VyLWNvbnRhaW5lciJdLFs0LCJuZ0lmIiwibmdJZkVsc2UiXSxbImRhdGFBdmFpbGFibGUiLCIiXSxbMSwidG9wLXNlY3Rpb24iXSxbMSwidG9wLWNlbnRlci1zZWN0aW9uIl0sWzEsImJvdHRvbS1zZWN0aW9uIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihSbSgwLCJkaXYiLDApLFFwKDEsREosMSwwLCJ0Zi1kZWJ1Z2dlci12Mi1pbmFjdGl2ZSIsMSksUXAoMixFSiw5LDAsIm5nLXRlbXBsYXRlIixudWxsLDIsaWIpLEFtKCkpLDImZSl7Y29uc3QgdD0kcCgzKTtyYygxKSxEbSgibmdJZiIsMD09PW4ucnVuSWRzLmxlbmd0aCkoIm5nSWZFbHNlIix0KX19LGRpcmVjdGl2ZXM6W2RNLEVxLFBYLHZLLFZLLEpLLHBKLFNKXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0uYm90dG9tLXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVde2JveC1zaXppbmc6Ym9yZGVyLWJveDtib3JkZXItdG9wOjFweCBzb2xpZCAjZWJlYmViO2Rpc3BsYXk6ZmxleDtmbGV4LWdyb3c6MTtoZWlnaHQ6MzQlO3BhZGRpbmctdG9wOjZweH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuYm90dG9tLXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuYm90dG9tLXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MXB4IHNvbGlkICM1NTV9LmRlYnVnZ2VyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNpemluZzpib3JkZXItYm94O2hlaWdodDoxMDAlO292ZXJmbG93OmhpZGRlbn0udG9wLXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVde2JveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmZsZXg7ZmxleC1ncm93OjE7aGVpZ2h0OjY2JTtwYWRkaW5nOjZweCAwfXRmLWRlYnVnZ2VyLXYyLWFsZXJ0c1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZWJlYmViO2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1yaWdodDoxMHB4O21pbi13aWR0aDoxNjBweDt3aWR0aDpjYWxjKDE1JSAtIDExcHgpfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIHRmLWRlYnVnZ2VyLXYyLWFsZXJ0c1tfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIHRmLWRlYnVnZ2VyLXYyLWFsZXJ0c1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjNTU1fXRmLWRlYnVnZ2VyLXYyLWdyYXBoLWV4ZWN1dGlvbnNbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZsZXgtZ3JvdzoxO21pbi13aWR0aDo1NDBweDt3aWR0aDo1NDBweH10Zi1kZWJ1Z2dlci12Mi1zb3VyY2UtZmlsZXNbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDoxMDAlO3dpZHRoOjcwJX10Zi1kZWJ1Z2dlci12Mi1zdGFjay10cmFjZVtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTppbmxpbmUtYmxvY2s7ZmxleC1ncm93OjE7aGVpZ2h0OjEwMCU7bWluLXdpZHRoOjU0MHB4O3dpZHRoOjU0MHB4fS50b3AtY2VudGVyLXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lLWJsb2NrO292ZXJmbG93OmF1dG87d2lkdGg6NTUlfXRmLWRlYnVnZ2VyLXYyLXRpbWVsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmJsb2NrfXRmLWRlYnVnZ2VyLXYyLWdyYXBoW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjFweCBzb2xpZCAjZWJlYmViO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDo1cHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgdGYtZGVidWdnZXItdjItZ3JhcGhbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICB0Zi1kZWJ1Z2dlci12Mi1ncmFwaFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgIzU1NX0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUkosW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiZGVidWdnZXItY29tcG9uZW50Iix0ZW1wbGF0ZVVybDoiLi9kZWJ1Z2dlcl9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9kZWJ1Z2dlcl9jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7cnVuczpbe3R5cGU6eHl9XSxydW5JZHM6W3t0eXBlOnh5fV0sYWN0aXZlUnVuSWQ6W3t0eXBlOnh5fV19KTtjbGFzcyBBSntjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5ydW5zJD10aGlzLnN0b3JlLnBpcGUoRncoUFopKSx0aGlzLnJ1bnNJZHMkPXRoaXMuc3RvcmUucGlwZShGdyhadyhQWiwodD0+T2JqZWN0LmtleXModCkpKSkpLHRoaXMuYWN0aXZlUnVuSWQkPXRoaXMuc3RvcmUucGlwZShGdyhrWikpfW5nT25Jbml0KCl7dGhpcy5zdG9yZS5kaXNwYXRjaChScSgpKX1uZ09uRGVzdHJveSgpe3RoaXMuc3RvcmUuZGlzcGF0Y2goQXEoKSl9fUFKLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxBSikoU20oSXcpKX0sQUouybVjbXA9dG8oe3R5cGU6QUosc2VsZWN0b3JzOltbInRmLWRlYnVnZ2VyLXYyIl1dLGRlY2xzOjQsdmFyczo5LGNvbnN0czpbWzMsInJ1bnMiLCJydW5JZHMiLCJhY3RpdmVSdW5JZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwiZGVidWdnZXItY29tcG9uZW50IiwwKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQWgoMywiYXN5bmMiKSksMiZlJiZEbSgicnVucyIsVGgoMSwzLG4ucnVucyQpKSgicnVuSWRzIixUaCgyLDUsbi5ydW5zSWRzJCkpKCJhY3RpdmVSdW5JZCIsVGgoMyw3LG4uYWN0aXZlUnVuSWQkKSl9LGRpcmVjdGl2ZXM6W1JKXSxwaXBlczpbd01dLHN0eWxlczpbIltfbmdob3N0LSVDT01QJV0ge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgfSJdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChBSixbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJ0Zi1kZWJ1Z2dlci12MiIsdGVtcGxhdGU6J1xuICAgIDxkZWJ1Z2dlci1jb21wb25lbnRcbiAgICAgIFtydW5zXT0icnVucyQgfCBhc3luYyJcbiAgICAgIFtydW5JZHNdPSJydW5zSWRzJCB8IGFzeW5jIlxuICAgICAgW2FjdGl2ZVJ1bklkXT0iYWN0aXZlUnVuSWQkIHwgYXN5bmMiXG4gICAgPjwvZGVidWdnZXItY29tcG9uZW50PlxuICAnLHN0eWxlczpbIlxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgfVxuICAgICJdfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NvbnN0IFRKPSJkZWJ1Z2dlci12MiI7ZnVuY3Rpb24gTkoodCxlLG4sbyxpKXtpZihuPD0wfHwhTnVtYmVyLmlzSW50ZWdlcihuKSl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFnZVNpemU6ICR7bn1gKTtpZihlPm8pdGhyb3cgbmV3IEVycm9yKGBlbmQgaW5kZXggKCR7ZX0pIGV4Y2VlZHMgdG90YWwgbnVtYmVyIG9mIGl0ZW1zICgke299KWApO2lmKGUtdD5uKXRocm93IG5ldyBFcnJvcigiYmVnaW4tZW5kIHNwYW4gZXhjZWVkcyBwYWdlIHNpemUsIHdoaWNoIGlzIG5vdCBhbGxvd2VkIik7Y29uc3QgYT1bXSxyPU1hdGguZmxvb3IodC9uKTsoIShyIGluIGkpfHxpW3JdPG4mJnIqbitpW3JdPG8pJiZhLnB1c2gocik7Y29uc3Qgcz1NYXRoLmZsb29yKChlLTEpL24pO3JldHVybiBzIT09ciYmKCEocyBpbiBpKXx8cypuK2lbc108ZSYmZTxvKSYmYS5wdXNoKHMpLGF9Y2xhc3Mgekp7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuYWN0aW9ucyQ9dCx0aGlzLnN0b3JlPWUsdGhpcy5kYXRhU291cmNlPW4sdGhpcy5sb2FkRGF0YSQ9TWsoKCgpPT57Y29uc3QgdD10aGlzLmxvYWREZWJ1Z2dlclJ1bnMocmUodGhpcy5vbkRlYnVnZ2VyRGF0YVBvbGwoKSx0aGlzLm9uQ29yZVJlbG9hZCgpKSkucGlwZShFZSgpKSxlPXRoaXMubG9hZFNvdXJjZUZpbGVMaXN0KHQpLG49dGhpcy5jcmVhdGVOdW1FeGVjdXRpb25Mb2FkZXIodCksbz10aGlzLmNyZWF0ZU51bUFsZXJ0c0FuZEJyZWFrZG93bkxvYWRlcih0KSxpPXRoaXMub25BbGVydFR5cGVGb2N1c2VkKCksYT10aGlzLmZldGNoRXhlY3V0aW9uRGlnZXN0c0ZvckFsZXJ0VHlwZUZvY3VzKGkpLHI9dGhpcy5jcmVhdGVJbml0aWFsRXhlY3V0aW9uRGV0ZWN0b3IobikucGlwZShFZSgpKSxzPXRoaXMuY3JlYXRlRXhlY3V0aW9uRGlnZXN0TG9hZGVyKHJlKHRoaXMub25FeGVjdXRpb25TY3JvbGwoKSx0aGlzLmNyZWF0ZUluaXRpYWxFeGVjdXRpb25EaWdlc3QociksYSkpLGw9dGhpcy5jcmVhdGVFeGVjdXRpb25EYXRhQW5kU3RhY2tGcmFtZXNMb2FkZXIocmUodGhpcy5vbkV4ZWN1dGlvbkRpZ2VzdEZvY3VzZWQoKSxyLnBpcGUoVmUodGhpcy5zdG9yZS5zZWxlY3Qoa1opLHRoaXMuc3RvcmUuc2VsZWN0KGNYKSksSXQoKChbLHQsZV0pPT4oe2FjdGl2ZVJ1bklkOnQsbG9hZGVkRXhlY3V0aW9uRGF0YTplLGZvY3VzSW5kZXg6MH0pKSkpKSk7cmV0dXJuIHJlKG8scyxsLHRoaXMuY3JlYXRlTnVtR3JhcGhFeGVjdXRpb25Mb2FkZXIodCksZSx0aGlzLm9uU291cmNlRmlsZUZvY3VzZWQoKSx0aGlzLmxvYWRHcmFwaEV4ZWN1dGlvblBhZ2VzKHRoaXMub25HcmFwaEV4ZWN1dGlvblNjcm9sbCgpKSx0aGlzLmxvYWRHcmFwaE9wU3RhY2tGcmFtZXModGhpcy5sb2FkR3JhcGhPcEluZm8oKSkpLnBpcGUoSXQoKCgpPT4oe30pKSkpfSkse2Rpc3BhdGNoOiExfSl9b25EZWJ1Z2dlckRhdGFQb2xsKCl7cmV0dXJuIHRoaXMuYWN0aW9ucyQucGlwZShEayhScSksemUoKHQ9PihmdW5jdGlvbiBlKHQsbixvKXtyZXR1cm4gdC5waXBlKChmdW5jdGlvbiBpKHQpe3JldHVybiBSKChmdW5jdGlvbihlLG4pe3ZhciBvLGksYT0hMSxyPSExLHM9ITEsbD1mdW5jdGlvbigpe3JldHVybiBzJiZyJiYobi5jb21wbGV0ZSgpLCEwKX0sYz1mdW5jdGlvbigpe3M9ITEsbz1lLnN1YnNjcmliZShuZXcgVChuLHZvaWQgMCwoZnVuY3Rpb24oKXtzPSEwLCFsKCkmJihpfHwoaT1uZXcgSSx0KGkpLnN1YnNjcmliZShuZXcgVChuLChmdW5jdGlvbigpe28/YygpOmE9ITB9KSwoZnVuY3Rpb24oKXtyPSEwLGwoKX0pKSkpLGkpLm5leHQoKX0pKSksYSYmKG8udW5zdWJzY3JpYmUoKSxvPW51bGwsYT0hMSxjKCkpfTtjKCl9KSl9KSgodD0+dC5waXBlKFZlKG4pLF9lKCgoWyx0XSk9PmFlKHQpKSkpKSksSWUobyksSXQoKCgpPT57fSkpKX0pKEV0KHQpLHRoaXMuc3RvcmUuc2VsZWN0KFNaKS5waXBlKEl0KCh0PT4oZnVuY3Rpb24gZSh0KXtyZXR1cm4gdD42ZTQ/NmU0OnQ+NGUzP3Q6MmUzfSkodCkpKSksdGhpcy5hY3Rpb25zJC5waXBlKERrKEFxKSkpKSksRmUoKCgpPT50aGlzLnN0b3JlLmRpc3BhdGNoKFRxKCkpKSksSXQoKCgpPT57fSkpKX1vbkNvcmVSZWxvYWQoKXtyZXR1cm4gcmUodGhpcy5hY3Rpb25zJC5waXBlKERrKHZFLHhFKSksdGhpcy5hY3Rpb25zJC5waXBlKERrKF9FKSkucGlwZShWZSh0aGlzLnN0b3JlLnNlbGVjdCh3WikpLGNlKCgoWyx0XSk9PnQuc3RhdGU9PT15RS5OT1RfTE9BREVEfHx0LnN0YXRlPT09eUUuRkFJTEVEJiZudWxsPT09dC5sYXN0TG9hZGVkVGltZUluTXMpKSkpLnBpcGUoVmUodGhpcy5zdG9yZS5zZWxlY3QoTVIpKSxjZSgoKFssdF0pPT50PT09VEopKSxGZSgoKCk9PnRoaXMuc3RvcmUuZGlzcGF0Y2goVHEoKSkpKSxJdCgoKCk9Pnt9KSkpfWxvYWREZWJ1Z2dlclJ1bnModCl7cmV0dXJuIHQucGlwZShWZSh0aGlzLnN0b3JlLnNlbGVjdCh3WikpLGNlKCgoWyx7c3RhdGU6dH1dKT0+dCE9PXlFLkxPQURJTkcpKSxGZSgoKCk9PnRoaXMuc3RvcmUuZGlzcGF0Y2goTnEoKSkpKSxadCgoKCk9PnRoaXMuZGF0YVNvdXJjZS5mZXRjaFJ1bnMoKS5waXBlKEZlKCh0PT57dGhpcy5zdG9yZS5kaXNwYXRjaCh6cSh7cnVuczp0fSkpfSkpLEl0KCgoKT0+e30pKSkpKSl9Y3JlYXRlTnVtRXhlY3V0aW9uTG9hZGVyKHQpe3JldHVybiB0LnBpcGUoVmUodGhpcy5zdG9yZS5zZWxlY3QoUFopLHRoaXMuc3RvcmUuc2VsZWN0KEhaKSksY2UoKChbLHQsZV0pPT5PYmplY3Qua2V5cyh0KS5sZW5ndGg+MCYmZS5zdGF0ZSE9PXlFLkxPQURJTkcpKSxGZSgoKCk9PnRoaXMuc3RvcmUuZGlzcGF0Y2goVnEoKSkpKSxadCgoKFssdF0pPT57Y29uc3QgZT1PYmplY3Qua2V5cyh0KVswXTtyZXR1cm4gdGhpcy5kYXRhU291cmNlLmZldGNoRXhlY3V0aW9uRGlnZXN0cyhlLDAsMCkucGlwZShGZSgodD0+e3RoaXMuc3RvcmUuZGlzcGF0Y2goanEoe251bUV4ZWN1dGlvbnM6dC5udW1fZGlnZXN0c30pKX0pKSxJdCgoKCk9Pnt9KSkpfSkpKX1jcmVhdGVOdW1HcmFwaEV4ZWN1dGlvbkxvYWRlcih0KXtyZXR1cm4gdC5waXBlKFZlKHRoaXMuc3RvcmUuc2VsZWN0KFBaKSx0aGlzLnN0b3JlLnNlbGVjdChXWikpLGNlKCgoWyx0LGVdKT0+T2JqZWN0LmtleXModCkubGVuZ3RoPjAmJmUuc3RhdGUhPT15RS5MT0FESU5HKSksRmUoKCgpPT50aGlzLnN0b3JlLmRpc3BhdGNoKEtxKCkpKSksWnQoKChbLHRdKT0+e2NvbnN0IGU9T2JqZWN0LmtleXModClbMF07cmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5mZXRjaEdyYXBoRXhlY3V0aW9uRGlnZXN0cyhlLDAsMCkucGlwZShGZSgodD0+e3RoaXMuc3RvcmUuZGlzcGF0Y2goSnEoe251bUdyYXBoRXhlY3V0aW9uczp0Lm51bV9kaWdlc3RzfSkpfSkpLEl0KCgoKT0+e30pKSl9KSkpfWNyZWF0ZU51bUFsZXJ0c0FuZEJyZWFrZG93bkxvYWRlcih0KXtyZXR1cm4gdC5waXBlKFZlKHRoaXMuc3RvcmUuc2VsZWN0KFBaKSx0aGlzLnN0b3JlLnNlbGVjdChFWikpLGNlKCgoWyx0LGVdKT0+T2JqZWN0LmtleXModCkubGVuZ3RoPjAmJmUuc3RhdGUhPT15RS5MT0FESU5HKSksRmUoKCgpPT50aGlzLnN0b3JlLmRpc3BhdGNoKEhxKCkpKSksWnQoKChbLHRdKT0+e2NvbnN0IGU9T2JqZWN0LmtleXModClbMF07cmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5mZXRjaEFsZXJ0cyhlLDAsMCkucGlwZShGZSgodD0+e3RoaXMuc3RvcmUuZGlzcGF0Y2goRnEoe251bUFsZXJ0czp0Lm51bV9hbGVydHMsYWxlcnRzQnJlYWtkb3duOnQuYWxlcnRzX2JyZWFrZG93bn0pKX0pKSxJdCgoKCk9Pnt9KSkpfSkpKX1jcmVhdGVJbml0aWFsRXhlY3V0aW9uRGV0ZWN0b3IodCl7cmV0dXJuIHQucGlwZShWZSh0aGlzLnN0b3JlLnNlbGVjdChMWiksdGhpcy5zdG9yZS5zZWxlY3QoRlopKSxjZSgoKFssdCxlXSk9PnQ+MCYmMD09PU9iamVjdC5rZXlzKGUucGFnZUxvYWRlZFNpemVzKS5sZW5ndGgpKSxJdCgoKCk9Pnt9KSkpfWNyZWF0ZUluaXRpYWxFeGVjdXRpb25EaWdlc3QodCl7cmV0dXJuIHQucGlwZShWZSh0aGlzLnN0b3JlLnNlbGVjdChMWiksdGhpcy5zdG9yZS5zZWxlY3Qoa1opLHRoaXMuc3RvcmUuc2VsZWN0KFZaKSksY2UoKChbLCx0XSk9Pm51bGwhPT10KSksSXQoKChbLHQsZSxuXSk9Pih7YmVnaW46MCxlbmQ6TWF0aC5taW4odCxuKSxydW5JZDplfSkpKSl9b25FeGVjdXRpb25TY3JvbGwoKXtyZXR1cm4gdGhpcy5hY3Rpb25zJC5waXBlKERrKFdxLFlxLHFxKSxWZSh0aGlzLnN0b3JlLnNlbGVjdChrWiksdGhpcy5zdG9yZS5zZWxlY3QoQlopLHRoaXMuc3RvcmUuc2VsZWN0KExaKSx0aGlzLnN0b3JlLnNlbGVjdChqWiksdGhpcy5zdG9yZS5zZWxlY3QoVlopKSxjZSgoKFt0XSk9Pm51bGwhPT10KSksSXQoKChbLHQsZSxuLG8saV0pPT4oe3J1bklkOnQsYmVnaW46ZSxlbmQ6TWF0aC5taW4obixlK28pLHBhZ2VTaXplOml9KSkpLFZlKHRoaXMuc3RvcmUuc2VsZWN0KEZaKSksSXQoKChbdCxlXSk9Pih7cHJvcHM6dCxsb2FkZWQ6ZSxtaXNzaW5nUGFnZXM6TkoodC5iZWdpbix0LmVuZCx0LnBhZ2VTaXplLGUubnVtRXhlY3V0aW9ucyxlLnBhZ2VMb2FkZWRTaXplcyl9KSkpLGNlKCgoe21pc3NpbmdQYWdlczp0fSk9PnQubGVuZ3RoPjApKSxJdCgoKHtwcm9wczp0LGxvYWRlZDplLG1pc3NpbmdQYWdlczpufSk9Pntjb25zdHtydW5JZDpvLHBhZ2VTaXplOml9PXQ7cmV0dXJue2JlZ2luOm5bMF0qaSxlbmQ6TWF0aC5taW4oZS5udW1FeGVjdXRpb25zLChuW24ubGVuZ3RoLTFdKzEpKmkpLHJ1bklkOm99fSkpKX1jcmVhdGVFeGVjdXRpb25EaWdlc3RMb2FkZXIodCl7cmV0dXJuIHQucGlwZShWZSh0aGlzLnN0b3JlLnNlbGVjdChGWikpLGNlKCgoW3tiZWdpbjp0LGVuZDplfSxuXSk9PmU+dCYmIShmdW5jdGlvbiBvKHQsZSxuKXtpZihlPj1uKXRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYmVnaW4gdG8gYmUgbGVzcyB0aGFuIGVuZCwgYnV0IGdvdCBiZWdpbj0ke2V9LCBlbmQ9JHtufWApO3JldHVybi0xIT09dC5maW5kSW5kZXgoKHQ9PnQuYmVnaW4+PWUmJnQuZW5kPD1uKSl9KShuLmxvYWRpbmdSYW5nZXMsdCxlKSkpLEZlKCgoW3tiZWdpbjp0LGVuZDplfV0pPT57dGhpcy5zdG9yZS5kaXNwYXRjaChVcSh7YmVnaW46dCxlbmQ6ZX0pKX0pKSxadCgoKFt7cnVuSWQ6dCxiZWdpbjplLGVuZDpufV0pPT50aGlzLmRhdGFTb3VyY2UuZmV0Y2hFeGVjdXRpb25EaWdlc3RzKHQsZSxuKS5waXBlKEZlKCh0PT57dGhpcy5zdG9yZS5kaXNwYXRjaChHcSh0KSl9KSksSXQoKCgpPT57fSkpKSkpKX1vbkV4ZWN1dGlvbkRpZ2VzdEZvY3VzZWQoKXtyZXR1cm4gdGhpcy5hY3Rpb25zJC5waXBlKERrKFpxKSxWZSh0aGlzLnN0b3JlLnNlbGVjdChrWiksdGhpcy5zdG9yZS5zZWxlY3QoY1gpLHRoaXMuc3RvcmUuc2VsZWN0KEJaKSksSXQoKChbdCxlLG4sb10pPT4oe2FjdGl2ZVJ1bklkOmUsbG9hZGVkRXhlY3V0aW9uRGF0YTpuLGZvY3VzSW5kZXg6byt0LmRpc3BsYXlJbmRleH0pKSkpfWNyZWF0ZUV4ZWN1dGlvbkRhdGFBbmRTdGFja0ZyYW1lc0xvYWRlcih0KXtyZXR1cm4gdC5waXBlKGNlKCgoe2FjdGl2ZVJ1bklkOnQsbG9hZGVkRXhlY3V0aW9uRGF0YTplLGZvY3VzSW5kZXg6bn0pPT5udWxsIT09dCYmbnVsbCE9PW4mJnZvaWQgMD09PWVbbl0pKSxadCgoKHthY3RpdmVSdW5JZDp0LGZvY3VzSW5kZXg6ZX0pPT57Y29uc3Qgbj1lLG89bisxO3JldHVybiB0aGlzLmRhdGFTb3VyY2UuZmV0Y2hFeGVjdXRpb25EYXRhKHQsbixvKS5waXBlKEZlKCh0PT57dGhpcy5zdG9yZS5kaXNwYXRjaChYcSh0KSl9KSksSXQoKHQ9Pih7ZXhlY3V0aW9uRGF0YTp0LGJlZ2luOm4sZW5kOm99KSkpKX0pKSxJdCgoKHtleGVjdXRpb25EYXRhOnR9KT0+dC5leGVjdXRpb25zWzBdKSksVmUodGhpcy5zdG9yZS5zZWxlY3Qoa1opLHRoaXMuc3RvcmUuc2VsZWN0KHBYKSksY2UoKChbdCxlLG5dKT0+e2lmKG51bGw9PT1lKXJldHVybiExO2Zvcihjb25zdCBlIG9mIHQuc3RhY2tfZnJhbWVfaWRzKWlmKHZvaWQgMD09PW5bZV0pcmV0dXJuITA7cmV0dXJuITF9KSksWnQoKChbdCxlXSk9Pntjb25zdCBuPXQuc3RhY2tfZnJhbWVfaWRzO3JldHVybiB0aGlzLmRhdGFTb3VyY2UuZmV0Y2hTdGFja0ZyYW1lcyhlLG4pLnBpcGUoRmUoKHQ9Pntjb25zdCBlPXt9O2ZvcihsZXQgbz0wO288bi5sZW5ndGg7KytvKWVbbltvXV09dC5zdGFja19mcmFtZXNbb107dGhpcy5zdG9yZS5kaXNwYXRjaChkWih7c3RhY2tGcmFtZXM6ZX0pKX0pKSxJdCgoKCk9Pnt9KSkpfSkpKX1vbkdyYXBoRXhlY3V0aW9uU2Nyb2xsKCl7cmV0dXJuIHRoaXMuYWN0aW9ucyQucGlwZShEayh0WiksZ2UoMTAwKSxWZSh0aGlzLnN0b3JlLnNlbGVjdChrWiksdGhpcy5zdG9yZS5zZWxlY3QoWVopLHRoaXMuc3RvcmUuc2VsZWN0KHFaKSksY2UoKChbLHQsZV0pPT5udWxsIT09dCYmZT4wKSksSXQoKChbLHQsZSxuXSk9Pih7cnVuSWQ6dCxudW1HcmFwaEV4ZWN1dGlvbnM6ZSxzY3JvbGxCZWdpbkluZGV4Om59KSkpLFZlKHRoaXMuc3RvcmUuc2VsZWN0KFhaKSx0aGlzLnN0b3JlLnNlbGVjdChaWiksdGhpcy5zdG9yZS5zZWxlY3QoS1opLHRoaXMuc3RvcmUuc2VsZWN0KEpaKSksSXQoKChbe3J1bklkOnQsbnVtR3JhcGhFeGVjdXRpb25zOmUsc2Nyb2xsQmVnaW5JbmRleDpufSxvLGksYSxyXSk9PntsZXQgcz1OSihuLE1hdGgubWluKG4raSxlKSxvLGUscik7cmV0dXJuIHM9cy5maWx0ZXIoKHQ9Pi0xPT09YS5pbmRleE9mKHQpKSkse3J1bklkOnQsbWlzc2luZ1BhZ2VzOnMscGFnZVNpemU6byxudW1HcmFwaEV4ZWN1dGlvbnM6ZX19KSkpfWxvYWRHcmFwaEV4ZWN1dGlvblBhZ2VzKHQpe3JldHVybiB0LnBpcGUoY2UoKCh7bWlzc2luZ1BhZ2VzOnR9KT0+dC5sZW5ndGg+MCkpLEZlKCgoe21pc3NpbmdQYWdlczp0fSk9Pnt0LmZvckVhY2goKHQ9Pnt0aGlzLnN0b3JlLmRpc3BhdGNoKFFxKHtwYWdlSW5kZXg6dH0pKX0pKX0pKSxadCgoKHtydW5JZDp0LG1pc3NpbmdQYWdlczplLHBhZ2VTaXplOm4sbnVtR3JhcGhFeGVjdXRpb25zOm99KT0+e2NvbnN0IGk9ZVswXSpuLGE9TWF0aC5taW4oKGVbZS5sZW5ndGgtMV0rMSkqbixvKTtyZXR1cm4gdGhpcy5kYXRhU291cmNlLmZldGNoR3JhcGhFeGVjdXRpb25EYXRhKHQsaSxhKS5waXBlKEZlKCh0PT57dGhpcy5zdG9yZS5kaXNwYXRjaCgkcSh0KSl9KSksSXQoKCgpPT57fSkpKX0pKSl9bG9hZEdyYXBoT3BJbmZvKCl7cmV0dXJuIHRoaXMuYWN0aW9ucyQucGlwZShEayhuWixlWiksVmUodGhpcy5zdG9yZS5zZWxlY3Qoa1opLHRoaXMuc3RvcmUuc2VsZWN0KGRYKSksY2UoKChbdCxlLG5dKT0+e2NvbnN0e2dyYXBoX2lkOm8sb3BfbmFtZTppfT10O3JldHVybiEobnVsbD09PWV8fHZvaWQgMCE9PW5bb10mJm5bb10uaGFzKGkpJiYobltvXS5nZXQoaSk9PT15RS5MT0FESU5HfHxuW29dLmdldChpKT09PXlFLkxPQURFRCkpfSkpLEZlKCgoW3tncmFwaF9pZDp0LG9wX25hbWU6ZX1dKT0+dGhpcy5zdG9yZS5kaXNwYXRjaChvWih7Z3JhcGhfaWQ6dCxvcF9uYW1lOmV9KSkpKSxadCgoKFt0LGVdKT0+e2NvbnN0e2dyYXBoX2lkOm4sb3BfbmFtZTpvfT10O3JldHVybiB0aGlzLmRhdGFTb3VyY2UuZmV0Y2hHcmFwaE9wSW5mbyhlLG4sbykucGlwZShGZSgodD0+dGhpcy5zdG9yZS5kaXNwYXRjaChpWih7Z3JhcGhPcEluZm9SZXNwb25zZTp0fSkpKSksSXQoKHQ9Pih7cnVuSWQ6ZSxzdGFja0ZyYW1lSWRzOnQuc3RhY2tfZnJhbWVfaWRzfSkpKSl9KSkpfWxvYWRHcmFwaE9wU3RhY2tGcmFtZXModCl7cmV0dXJuIHQucGlwZShWZSh0aGlzLnN0b3JlLnNlbGVjdChwWCkpLEl0KCgoW3tydW5JZDp0LHN0YWNrRnJhbWVJZHM6ZX0sbl0pPT4oe3J1bklkOnQsbWlzc2luZ1N0YWNrRnJhbWVJZHM6ZS5maWx0ZXIoKHQ9PnZvaWQgMD09PW5bdF0pKX0pKSksY2UoKCh7cnVuSWQ6dCxtaXNzaW5nU3RhY2tGcmFtZUlkczplfSk9Pm51bGwhPT10JiZlLmxlbmd0aD4wKSksWnQoKCh7cnVuSWQ6dCxtaXNzaW5nU3RhY2tGcmFtZUlkczplfSk9PnRoaXMuZGF0YVNvdXJjZS5mZXRjaFN0YWNrRnJhbWVzKHQsZSkucGlwZShGZSgodD0+e2NvbnN0IG49e307Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDsrK28pbltlW29dXT10LnN0YWNrX2ZyYW1lc1tvXTt0aGlzLnN0b3JlLmRpc3BhdGNoKGRaKHtzdGFja0ZyYW1lczpufSkpfSkpLEl0KCgoKT0+e30pKSkpKSl9b25BbGVydFR5cGVGb2N1c2VkKCl7cmV0dXJuIHRoaXMuYWN0aW9ucyQucGlwZShEayhCcSksVmUodGhpcy5zdG9yZS5zZWxlY3Qoa1opLHRoaXMuc3RvcmUuc2VsZWN0KEFaKSx0aGlzLnN0b3JlLnNlbGVjdChUWiksdGhpcy5zdG9yZS5zZWxlY3QoTlopLHRoaXMuc3RvcmUuc2VsZWN0KEVaKSksY2UoKChbLHQsZSxuLG8saV0pPT5udWxsIT09dCYmbnVsbCE9PWUmJm4+MCYmKG51bGw9PT1vfHxPYmplY3Qua2V5cyhvKS5sZW5ndGg8bikmJmkuc3RhdGUhPT15RS5MT0FESU5HKSksRmUoKCgpPT50aGlzLnN0b3JlLmRpc3BhdGNoKEhxKCkpKSksWnQoKChbLHQsZV0pPT50aGlzLmRhdGFTb3VyY2UuZmV0Y2hBbGVydHModCwwLC0xLGUpKSksRmUoKCh7bnVtX2FsZXJ0czp0LGFsZXJ0c19icmVha2Rvd246ZSxhbGVydF90eXBlOm4sYmVnaW46byxlbmQ6aSxhbGVydHM6YX0pPT57dGhpcy5zdG9yZS5kaXNwYXRjaChMcSh7bnVtQWxlcnRzOnQsYWxlcnRzQnJlYWtkb3duOmUsYWxlcnRUeXBlOm4sYmVnaW46byxlbmQ6aSxhbGVydHM6YX0pKX0pKSl9ZmV0Y2hFeGVjdXRpb25EaWdlc3RzRm9yQWxlcnRUeXBlRm9jdXModCl7cmV0dXJuIHQucGlwZShWZSh0aGlzLnN0b3JlLnNlbGVjdChWWiksdGhpcy5zdG9yZS5zZWxlY3QoalopLHRoaXMuc3RvcmUuc2VsZWN0KExaKSx0aGlzLnN0b3JlLnNlbGVjdChGWiksdGhpcy5zdG9yZS5zZWxlY3Qoa1opKSxJdCgoKFt0LGUsbixvLGksYV0pPT57Y29uc3Qgcj10LmFsZXJ0c1swXS5leGVjdXRpb25faW5kZXgscz1OSihNYXRoLm1heCgwLHItTWF0aC5mbG9vcihuLzIpKSxNYXRoLm1pbihyK01hdGguZmxvb3Iobi8yKSxvKSxlLG8saS5wYWdlTG9hZGVkU2l6ZXMpO3JldHVybiAwPT09cy5sZW5ndGg/e3J1bklkOmEsYmVnaW46MCxlbmQ6MH06e3J1bklkOmEsYmVnaW46c1swXSplLGVuZDpNYXRoLm1pbihpLm51bUV4ZWN1dGlvbnMsKHNbcy5sZW5ndGgtMV0rMSkqZSl9fSkpKX1sb2FkU291cmNlRmlsZUxpc3QodCl7cmV0dXJuIHQucGlwZShWZSh0aGlzLnN0b3JlLnNlbGVjdChrWiksdGhpcy5zdG9yZS5zZWxlY3QoaFgpKSxjZSgoKFssdCxlXSk9Pm51bGwhPT10JiZlLnN0YXRlIT09eUUuTE9BRElORykpLEZlKCgoKT0+dGhpcy5zdG9yZS5kaXNwYXRjaChhWigpKSkpLFp0KCgoWyx0XSk9PnRoaXMuZGF0YVNvdXJjZS5mZXRjaFNvdXJjZUZpbGVMaXN0KHQpLnBpcGUoRmUoKHQ9Pntjb25zdCBlPVtdO3QuZm9yRWFjaCgoKFt0LG5dKT0+e2UucHVzaCh7aG9zdF9uYW1lOnQsZmlsZV9wYXRoOm59KX0pKSx0aGlzLnN0b3JlLmRpc3BhdGNoKHJaKHtzb3VyY2VGaWxlczplfSkpfSkpLEl0KCgoKT0+e30pKSkpKSl9b25Tb3VyY2VGaWxlRm9jdXNlZCgpe3JldHVybiB0aGlzLmFjdGlvbnMkLnBpcGUoRGsoc1opLFZlKHRoaXMuc3RvcmUuc2VsZWN0KGtaKSx0aGlzLnN0b3JlLnNlbGVjdChiWCksdGhpcy5zdG9yZS5zZWxlY3QoeVgpKSxJdCgoKFt0LGUsbixvXSk9Pih7cnVuSWQ6ZSxzdGFja0ZyYW1lOnQuc3RhY2tGcmFtZSxmaWxlSW5kZXg6bixmaWxlQ29udGVudDpvfSkpKSxjZSgoKHtydW5JZDp0LGZpbGVDb250ZW50OmV9KT0+bnVsbCE9PXQmJm51bGwhPT1lJiZlLmxvYWRTdGF0ZT09PXlFLk5PVF9MT0FERUQpKSxGZSgoKHtzdGFja0ZyYW1lOnR9KT0+dGhpcy5zdG9yZS5kaXNwYXRjaChsWih7aG9zdF9uYW1lOnQuaG9zdF9uYW1lLGZpbGVfcGF0aDp0LmZpbGVfcGF0aH0pKSkpLFp0KCgoe2ZpbGVJbmRleDp0LHJ1bklkOmV9KT0+dGhpcy5kYXRhU291cmNlLmZldGNoU291cmNlRmlsZShlLHQpLnBpcGUoRmUoKHQ9Pnt0aGlzLnN0b3JlLmRpc3BhdGNoKGNaKHQpKX0pKSxJdCgoKCk9Pnt9KSkpKSkpfX16Si7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8ekopKHZyKFNrKSx2cihJdyksdnIoa3EpKX0sekouybVwcm92PU1uKHt0b2tlbjp6SixmYWN0b3J5OnpKLsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh6Sixbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6U2t9LHt0eXBlOkl3fSx7dHlwZTprcX1dfSksbnVsbCk7Y2xhc3MgSUp7fUlKLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxJSil9LElKLsm1bW9kPWFvKHt0eXBlOklKfSksSUouybVpbmo9dm4oe2ltcG9ydHM6W1tXTV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChJSixbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbeFgsUFhdLGltcG9ydHM6W1dNXSxleHBvcnRzOltQWF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhJSix7ZGVjbGFyYXRpb25zOlt4WCxQWF0saW1wb3J0czpbV01dLGV4cG9ydHM6W1BYXX0pO2NsYXNzIEhKe31ISi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SEopfSxISi7JtW1vZD1hbyh7dHlwZTpISn0pLEhKLsm1aW5qPXZuKHtpbXBvcnRzOltbV01dXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoSEosW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W0JLLERLLFZLXSxpbXBvcnRzOltXTV0sZXhwb3J0czpbVktdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oSEose2RlY2xhcmF0aW9uczpbQkssREssVktdLGltcG9ydHM6W1dNXSxleHBvcnRzOltWS119KTtjbGFzcyBGSnt9RkouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEZKKX0sRkouybVtb2Q9YW8oe3R5cGU6Rkp9KSxGSi7JtWluaj12bih7aW1wb3J0czpbW1dNXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEZKLFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOlt0SyxpSyxvSyxlSyxuSyxhS10saW1wb3J0czpbV01dLGV4cG9ydHM6W2FLXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKEZKLHtkZWNsYXJhdGlvbnM6W3RLLGlLLG9LLGVLLG5LLGFLXSxpbXBvcnRzOltXTV0sZXhwb3J0czpbYUtdfSk7Y2xhc3MgTEp7fUxKLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxMSil9LExKLsm1bW9kPWFvKHt0eXBlOkxKfSksTEouybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxGSixfRl1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChMSixbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbS0ssSktdLGltcG9ydHM6W1dNLEZKLF9GXSxleHBvcnRzOltKS119XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhMSix7ZGVjbGFyYXRpb25zOltLSyxKS10saW1wb3J0czpbV00sRkosX0ZdLGV4cG9ydHM6W0pLXX0pO2NsYXNzIEJKe31CSi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8QkopfSxCSi7JtW1vZD1hbyh7dHlwZTpCSn0pLEJKLsm1aW5qPXZuKHt9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEJKLFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltEcSxFcV0sZXhwb3J0czpbRXFdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oQkose2RlY2xhcmF0aW9uczpbRHEsRXFdLGV4cG9ydHM6W0VxXX0pO2NsYXNzIFZKe31WSi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VkopfSxWSi7JtW1vZD1hbyh7dHlwZTpWSn0pLFZKLsm1aW5qPXZuKHt9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFZKLFt7dHlwZTpBeSxhcmdzOlt7ZXhwb3J0czpbb0pdLGRlY2xhcmF0aW9uczpbb0pdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oVkose2RlY2xhcmF0aW9uczpbb0pdLGV4cG9ydHM6W29KXX0pO2NvbnN0IGpKPVsiY29kZVZpZXdlckNvbnRhaW5lciJdO2NsYXNzIFVKe2NvbnN0cnVjdG9yKCl7dGhpcy5maXJzdFRleHQ9bnVsbCx0aGlzLnNlY29uZFRleHQ9bnVsbCx0aGlzLnJlbmRlclNpZGVCeVNpZGU9ITAsdGhpcy5tb25hY289bnVsbCx0aGlzLmVkaXRvcj1udWxsLHRoaXMuUkVTSVpFX0RFQk9VTkNFX0lOVEVSVkFMX01TPTUwfW9uUmVzaXplKCl7dGhpcy5lZGl0b3ImJnRoaXMuZWRpdG9yLmxheW91dCgpfW5nT25DaGFuZ2VzKHQpe2lmKCF0aGlzLm1vbmFjbylyZXR1cm47Y29uc3QgZT0hdGhpcy5lZGl0b3I7ZSYmKHRoaXMuZWRpdG9yPXRoaXMubW9uYWNvLmVkaXRvci5jcmVhdGVEaWZmRWRpdG9yKHRoaXMuY29kZVZpZXdlckNvbnRhaW5lci5uYXRpdmVFbGVtZW50LHtyZWFkT25seTohMCxmb250U2l6ZToxMCxtaW5pbWFwOntlbmFibGVkOiEwfSxyZW5kZXJTaWRlQnlTaWRlOnRoaXMucmVuZGVyU2lkZUJ5U2lkZSx0aGVtZTpuSih0aGlzLnVzZURhcmtNb2RlKX0pKSwoZXx8dC5maXJzdFRleHR8fHQuc2Vjb25kVGV4dCkmJnRoaXMuZWRpdG9yLnNldE1vZGVsKHtvcmlnaW5hbDp0aGlzLm1vbmFjby5lZGl0b3IuY3JlYXRlTW9kZWwodGhpcy5maXJzdFRleHR8fCIiKSxtb2RpZmllZDp0aGlzLm1vbmFjby5lZGl0b3IuY3JlYXRlTW9kZWwodGhpcy5zZWNvbmRUZXh0fHwiIil9KSx0LnJlbmRlclNpZGVCeVNpZGUmJnRoaXMuZWRpdG9yLnVwZGF0ZU9wdGlvbnMoe3JlbmRlclNpZGVCeVNpZGU6dGhpcy5yZW5kZXJTaWRlQnlTaWRlfSksdC51c2VEYXJrTW9kZSYmdGhpcy5tb25hY28uZWRpdG9yLnNldFRoZW1lKG5KKHRoaXMudXNlRGFya01vZGUpKX19VUouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFVKKX0sVUouybVjbXA9dG8oe3R5cGU6VUosc2VsZWN0b3JzOltbInNvdXJjZS1jb2RlLWRpZmYtY29tcG9uZW50Il1dLHZpZXdRdWVyeTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiZRaChqSiw3LGhnKSwyJmUpe2xldCB0O0poKHQ9dGIoKSkmJihuLmNvZGVWaWV3ZXJDb250YWluZXI9dC5maXJzdCl9fSxpbnB1dHM6e2ZpcnN0VGV4dDoiZmlyc3RUZXh0IixzZWNvbmRUZXh0OiJzZWNvbmRUZXh0IixyZW5kZXJTaWRlQnlTaWRlOiJyZW5kZXJTaWRlQnlTaWRlIixtb25hY286Im1vbmFjbyIsdXNlRGFya01vZGU6InVzZURhcmtNb2RlIn0sZmVhdHVyZXM6W0JvXSxkZWNsczoyLHZhcnM6MSxjb25zdHM6W1siZGV0ZWN0UmVzaXplIiwiIiwxLCJjb2RlLXZpZXdlci1jb250YWluZXIiLDMsInJlc2l6ZUV2ZW50RGVib3VuY2VQZXJpb2RJbk1zIiwib25SZXNpemUiXSxbImNvZGVWaWV3ZXJDb250YWluZXIiLCIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImRpdiIsMCwxKSxWbSgib25SZXNpemUiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25SZXNpemUoKX0pKSxBbSgpKSwyJmUmJkRtKCJyZXNpemVFdmVudERlYm91bmNlUGVyaW9kSW5NcyIsbi5SRVNJWkVfREVCT1VOQ0VfSU5URVJWQUxfTVMpfSxkaXJlY3RpdmVzOltvSl0sc3R5bGVzOlsiLmNvZGUtdmlld2VyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICB9Il0sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFVKLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InNvdXJjZS1jb2RlLWRpZmYtY29tcG9uZW50Iix0ZW1wbGF0ZTonXG4gICAgPGRpdlxuICAgICAgI2NvZGVWaWV3ZXJDb250YWluZXJcbiAgICAgIGNsYXNzPSJjb2RlLXZpZXdlci1jb250YWluZXIiXG4gICAgICBkZXRlY3RSZXNpemVcbiAgICAgIFtyZXNpemVFdmVudERlYm91bmNlUGVyaW9kSW5Nc109IlJFU0laRV9ERUJPVU5DRV9JTlRFUlZBTF9NUyJcbiAgICAgIChvblJlc2l6ZSk9Im9uUmVzaXplKCkiXG4gICAgPjwvZGl2PlxuICAnLHN0eWxlczpbIlxuICAgICAgLmNvZGUtdmlld2VyLWNvbnRhaW5lciB7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIH1cbiAgICAiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSxudWxsLHtmaXJzdFRleHQ6W3t0eXBlOnh5fV0sc2Vjb25kVGV4dDpbe3R5cGU6eHl9XSxyZW5kZXJTaWRlQnlTaWRlOlt7dHlwZTp4eX1dLG1vbmFjbzpbe3R5cGU6eHl9XSx1c2VEYXJrTW9kZTpbe3R5cGU6eHl9XSxjb2RlVmlld2VyQ29udGFpbmVyOlt7dHlwZTpaYSxhcmdzOlsiY29kZVZpZXdlckNvbnRhaW5lciIse3N0YXRpYzohMCxyZWFkOmhnfV19XX0pO2NsYXNzIEdKe2NvbnN0cnVjdG9yKCl7dGhpcy5maXJzdFRleHQ9bnVsbCx0aGlzLnNlY29uZFRleHQ9bnVsbCx0aGlzLnJlbmRlclNpZGVCeVNpZGU9ITAsdGhpcy51c2VEYXJrTW9kZT0hMSx0aGlzLm1vbmFjbyQ9bnVsbH1uZ09uSW5pdCgpe3RoaXMubW9uYWNvJD1DdChlSigpKS5waXBlKEl0KCgoKT0+d2luZG93Lm1vbmFjbykpKX19R0ouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEdKKX0sR0ouybVjbXA9dG8oe3R5cGU6R0osc2VsZWN0b3JzOltbInNvdXJjZS1jb2RlLWRpZmYiXV0saW5wdXRzOntmaXJzdFRleHQ6ImZpcnN0VGV4dCIsc2Vjb25kVGV4dDoic2Vjb25kVGV4dCIscmVuZGVyU2lkZUJ5U2lkZToicmVuZGVyU2lkZUJ5U2lkZSIsdXNlRGFya01vZGU6InVzZURhcmtNb2RlIn0sZGVjbHM6Mix2YXJzOjcsY29uc3RzOltbMywiZmlyc3RUZXh0Iiwic2Vjb25kVGV4dCIsInJlbmRlclNpZGVCeVNpZGUiLCJtb25hY28iLCJ1c2VEYXJrTW9kZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwic291cmNlLWNvZGUtZGlmZi1jb21wb25lbnQiLDApLEFoKDEsImFzeW5jIikpLDImZSYmRG0oImZpcnN0VGV4dCIsbi5maXJzdFRleHQpKCJzZWNvbmRUZXh0IixuLnNlY29uZFRleHQpKCJyZW5kZXJTaWRlQnlTaWRlIixuLnJlbmRlclNpZGVCeVNpZGUpKCJtb25hY28iLFRoKDEsNSxuLm1vbmFjbyQpKSgidXNlRGFya01vZGUiLG4udXNlRGFya01vZGUpfSxkaXJlY3RpdmVzOltVSl0scGlwZXM6W3dNXSxzdHlsZXM6WyJzb3VyY2UtY29kZS1kaWZmLWNvbXBvbmVudFtfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgfSJdLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChHSixbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJzb3VyY2UtY29kZS1kaWZmIix0ZW1wbGF0ZTonXG4gICAgPHNvdXJjZS1jb2RlLWRpZmYtY29tcG9uZW50XG4gICAgICBbZmlyc3RUZXh0XT0iZmlyc3RUZXh0IlxuICAgICAgW3NlY29uZFRleHRdPSJzZWNvbmRUZXh0IlxuICAgICAgW3JlbmRlclNpZGVCeVNpZGVdPSJyZW5kZXJTaWRlQnlTaWRlIlxuICAgICAgW21vbmFjb109Im1vbmFjbyQgfCBhc3luYyJcbiAgICAgIFt1c2VEYXJrTW9kZV09InVzZURhcmtNb2RlIlxuICAgID48L3NvdXJjZS1jb2RlLWRpZmYtY29tcG9uZW50PlxuICAnLHN0eWxlczpbIlxuICAgICAgc291cmNlLWNvZGUtZGlmZi1jb21wb25lbnQge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgfVxuICAgICJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse2ZpcnN0VGV4dDpbe3R5cGU6eHl9XSxzZWNvbmRUZXh0Olt7dHlwZTp4eX1dLHJlbmRlclNpZGVCeVNpZGU6W3t0eXBlOnh5fV0sdXNlRGFya01vZGU6W3t0eXBlOnh5fV19KTtjbGFzcyBXSnt9V0ouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFdKKX0sV0ouybVtb2Q9YW8oe3R5cGU6V0p9KSxXSi7JtWluaj12bih7aW1wb3J0czpbW1dNLFZKXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFdKLFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOlthSixySixVSixHSl0saW1wb3J0czpbV00sVkpdLGV4cG9ydHM6W3JKLEdKXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFdKLHtkZWNsYXJhdGlvbnM6W2FKLHJKLFVKLEdKXSxpbXBvcnRzOltXTSxWSl0sZXhwb3J0czpbckosR0pdfSk7Y2xhc3MgWUp7fVlKLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxZSil9LFlKLsm1bW9kPWFvKHt0eXBlOllKfSksWUouybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxXSl1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChZSixbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbZEoscEpdLGltcG9ydHM6W1dNLFdKXSxleHBvcnRzOltwSl19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhZSix7ZGVjbGFyYXRpb25zOltkSixwSl0saW1wb3J0czpbV00sV0pdLGV4cG9ydHM6W3BKXX0pO2NsYXNzIHFKe31xSi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8cUopfSxxSi7JtW1vZD1hbyh7dHlwZTpxSn0pLHFKLsm1aW5qPXZuKHtpbXBvcnRzOltbV00sV0pdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgocUosW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W2tKLFNKXSxpbXBvcnRzOltXTSxXSl0sZXhwb3J0czpbU0pdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8ocUose2RlY2xhcmF0aW9uczpba0osU0pdLGltcG9ydHM6W1dNLFdKXSxleHBvcnRzOltTSl19KTtjbGFzcyBaSnt9WkouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFpKKX0sWkouybVtb2Q9YW8oe3R5cGU6Wkp9KSxaSi7JtWluaj12bih7aW1wb3J0czpbW1dNLEZKXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFpKLFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltwSyx1S10saW1wb3J0czpbV00sRkpdLGV4cG9ydHM6W3VLXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFpKLHtkZWNsYXJhdGlvbnM6W3BLLHVLXSxpbXBvcnRzOltXTSxGSl0sZXhwb3J0czpbdUtdfSk7Y2xhc3MgWEp7fVhKLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxYSil9LFhKLsm1bW9kPWFvKHt0eXBlOlhKfSksWEouybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxaSixKSCx6WF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChYSixbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbQ0ssdktdLGltcG9ydHM6W1dNLFpKLEpILHpYXSxleHBvcnRzOlt2S119XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhYSix7ZGVjbGFyYXRpb25zOltDSyx2S10saW1wb3J0czpbV00sWkosSkgselhdLGV4cG9ydHM6W3ZLXX0pO2NsYXNzIEtKe31mdW5jdGlvbiBKSih0LGUpe2NvbnN0IG49e307Zm9yKGNvbnN0IG8gb2YgT2JqZWN0LmtleXModCkpbltvXT1lKHRbb10sbyk7cmV0dXJuIG59ZnVuY3Rpb24gUUoodCxlLG4pe2NvbnN0e3BsdWdpbjpvLHRhZzppLHJ1bklkOmEsc2FtcGxlOnJ9PWVbdF0scz1uVChuLG8saSxyKTtpZihzKXtpZihudWxsIT09YSYmcy5ydW5Ub1Nlcmllcy5oYXNPd25Qcm9wZXJ0eShhKSl7Y29uc3QgdD1zLnJ1blRvU2VyaWVzW2FdLmxlbmd0aDtyZXR1cm4gdD4wP3QtMTpudWxsfWNvbnN0IHQ9T2JqZWN0LnZhbHVlcyhzLnJ1blRvU2VyaWVzKS5tYXAoKHQ9PnQubGVuZ3RoKSk7aWYodC5sZW5ndGgpcmV0dXJuIE1hdGgubWF4KC4uLnQpLTF9cmV0dXJuIG51bGx9ZnVuY3Rpb24gJEoodCxlLG4sbyl7Y29uc3QgaT1PYmplY3QuYXNzaWduKHt9LGUpO2Zvcihjb25zdCBhIGluIHQpe2lmKCF0Lmhhc093blByb3BlcnR5KGEpKWNvbnRpbnVlO2NvbnN0IHI9UUooYSx0LG4pO2lmKG51bGw9PT1yKXtlLmhhc093blByb3BlcnR5KGEpJiYoaVthXT1udWxsKTtjb250aW51ZX1jb25zdCBzPWUuaGFzT3duUHJvcGVydHkoYSk/ZVthXTpudWxsLGw9UUooYSx0LG8pLGM9bnVsbCE9PXMmJnM9PT1sLGQ9bnVsbD09PXN8fGM7KG51bGwhPT1zJiZzPnJ8fGQpJiYoaVthXT1yKX1yZXR1cm4gaX1mdW5jdGlvbiB0USh0KXtjb25zdCBlPUpKKHQucnVuVG9Mb2FkU3RhdGUsKHQ9PnQ9PT15RS5MT0FESU5HP3lFLkxPQURJTkc6eUUuTk9UX0xPQURFRCkpO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3J1blRvTG9hZFN0YXRlOmV9KX1mdW5jdGlvbiBlUSh0LGUsbixvKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoW3QsZSxufHwiIixvXSl9S0ouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEtKKX0sS0ouybVtb2Q9YW8oe3R5cGU6S0p9KSxLSi7JtWluaj12bih7aW1wb3J0czpbW0lKLFdNLEVSLExKLEhKLEJKLFlKLHFKLFNxLFhKLGRrLmZvckZlYXR1cmUocFoseFopLFdrLmZvckZlYXR1cmUoW3pKXSksd3EuZm9yUGx1Z2luKFRKLEFKKV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChLSixbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbUkosQUpdLGltcG9ydHM6W0lKLFdNLEVSLExKLEhKLEJKLFlKLHFKLFNxLFhKLGRrLmZvckZlYXR1cmUocFoseFopLFdrLmZvckZlYXR1cmUoW3pKXSksd3EuZm9yUGx1Z2luKFRKLEFKKV0sZXhwb3J0czpbQUpdLGVudHJ5Q29tcG9uZW50czpbQUpdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oS0ose2RlY2xhcmF0aW9uczpbUkosQUpdLGltcG9ydHM6W0lKLFdNLEVSLExKLEhKLEJKLFlKLHFKLFNxLFhKLGNrLEdrLHdxXSxleHBvcnRzOltBSl19KTtjb25zdHtpbml0aWFsU3RhdGU6blEscmVkdWNlcnM6b1F9PUhOKHt0YWdNZXRhZGF0YUxvYWRTdGF0ZTp7c3RhdGU6eUUuTk9UX0xPQURFRCxsYXN0TG9hZGVkVGltZUluTXM6bnVsbH0sdGFnTWV0YWRhdGE6e3NjYWxhcnM6e3RhZ0Rlc2NyaXB0aW9uczp7fSx0YWdUb1J1bnM6e319LGhpc3RvZ3JhbXM6e3RhZ0Rlc2NyaXB0aW9uczp7fSx0YWdUb1J1bnM6e319LGltYWdlczp7dGFnRGVzY3JpcHRpb25zOnt9LHRhZ1J1blNhbXBsZWRJbmZvOnt9fX0sY2FyZExpc3Q6W10sY2FyZFRvUGlubmVkQ29weTpuZXcgTWFwLHBpbm5lZENhcmRUb09yaWdpbmFsOm5ldyBNYXAsdW5yZXNvbHZlZEltcG9ydGVkUGlubmVkQ2FyZHM6W10sY2FyZE1ldGFkYXRhTWFwOnt9LGNhcmRTdGVwSW5kZXg6e30sdGFnRmlsdGVyOiIiLHRhZ0dyb3VwRXhwYW5kZWQ6bmV3IE1hcCxzZWxlY3RlZFRpbWU6bnVsbCxzZWxlY3RUaW1lRW5hYmxlZDohMSx1c2VSYW5nZVNlbGVjdFRpbWU6ITEsZmlsdGVyZWRQbHVnaW5UeXBlczpuZXcgU2V0LHN0ZXBNaW5NYXg6e21pbjoxLzAsbWF4Oi0xLzB9fSx7aXNTZXR0aW5nc1BhbmVPcGVuOiEwLHByb21vdGVUaW1lU2VyaWVzOiEwLHRpbWVTZXJpZXNEYXRhOntzY2FsYXJzOnt9LGhpc3RvZ3JhbXM6e30saW1hZ2VzOnt9fSxzZXR0aW5nczpwVCxzZXR0aW5nT3ZlcnJpZGVzOnt9LHZpc2libGVDYXJkTWFwOm5ldyBNYXB9LCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3Zpc2libGVDYXJkTWFwOm5ldyBNYXB9KSkpLGlRPW5RLGFRPXlrKG5RLGJrKHJTLCgodCx7cm91dGVLaW5kOmUscGFydGlhbFN0YXRlOm59KT0+e2lmKGUhPT1aay5FWFBFUklNRU5UJiZlIT09WmsuQ09NUEFSRV9FWFBFUklNRU5UKXJldHVybiB0O2NvbnN0IG89bmV3IFNldDtmb3IoY29uc3QgZSBvZiB0LnBpbm5lZENhcmRUb09yaWdpbmFsLmtleXMoKSl7Y29uc3R7cGx1Z2luOm4sdGFnOmkscnVuSWQ6YSxzYW1wbGU6cn09dC5jYXJkTWV0YWRhdGFNYXBbZV07by5hZGQoZVEobixpLGEscikpfWNvbnN0IGk9bixhPVtdO2Zvcihjb25zdCBlIG9mWy4uLnQudW5yZXNvbHZlZEltcG9ydGVkUGlubmVkQ2FyZHMsLi4uaS5tZXRyaWNzLnBpbm5lZENhcmRzXSl7Y29uc3QgdD1lUShlLnBsdWdpbixlLnRhZyxlLnJ1bklkLGUuc2FtcGxlKTtvLmhhcyh0KXx8KG8uYWRkKHQpLGEucHVzaChlKSl9Y29uc3Qgcj1zVChhLHQuY2FyZExpc3QsdC5jYXJkTWV0YWRhdGFNYXAsdC5jYXJkVG9QaW5uZWRDb3B5LHQucGlubmVkQ2FyZFRvT3JpZ2luYWwsdC5jYXJkU3RlcEluZGV4KSxzPWkubWV0cmljcy5zbW9vdGhpbmc7bGV0IGw9dC5zZXR0aW5nT3ZlcnJpZGVzO2lmKE51bWJlci5pc0Zpbml0ZShzKSYmbnVsbCE9PXMpe2NvbnN0IGU9TWF0aC5tYXgoMCxNYXRoLm1pbiguOTk5LE51bWJlcihzLnRvUHJlY2lzaW9uKDMpKSkpO2w9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuc2V0dGluZ092ZXJyaWRlcykse3NjYWxhclNtb290aGluZzplfSl9Y29uc3QgYz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSxyKSx7c2V0dGluZ092ZXJyaWRlczpsfSk7cmV0dXJuIG51bGwhPT1pLm1ldHJpY3MudGFnRmlsdGVyJiYoYy50YWdGaWx0ZXI9aS5tZXRyaWNzLnRhZ0ZpbHRlciksY30pKSxiayhXUywoKHQse3BhcnRpYWxTZXR0aW5nczplfSk9Pnt2YXIgbjtjb25zdCBvPXt9O2lmKGUudG9vbHRpcFNvcnRTdHJpbmcpc3dpdGNoKGUudG9vbHRpcFNvcnRTdHJpbmcpe2Nhc2UgYkEuQVNDRU5ESU5HOm8udG9vbHRpcFNvcnQ9YkEuQVNDRU5ESU5HO2JyZWFrO2Nhc2UgYkEuREVTQ0VORElORzpvLnRvb2x0aXBTb3J0PWJBLkRFU0NFTkRJTkc7YnJlYWs7Y2FzZSBiQS5ERUZBVUxUOm8udG9vbHRpcFNvcnQ9YkEuREVGQVVMVDticmVhaztjYXNlIGJBLk5FQVJFU1Q6by50b29sdGlwU29ydD1iQS5ORUFSRVNUfSJib29sZWFuIj09dHlwZW9mIGUuaWdub3JlT3V0bGllcnMmJihvLmlnbm9yZU91dGxpZXJzPWUuaWdub3JlT3V0bGllcnMpLCJudW1iZXIiPT10eXBlb2YgZS5zY2FsYXJTbW9vdGhpbmcmJihvLnNjYWxhclNtb290aGluZz1lLnNjYWxhclNtb290aGluZyk7Y29uc3QgaT0iYm9vbGVhbiI9PXR5cGVvZiBlLnRpbWVTZXJpZXNQcm9tb3Rpb25EaXNtaXNzZWQ/IWUudGltZVNlcmllc1Byb21vdGlvbkRpc21pc3NlZDp0LnByb21vdGVUaW1lU2VyaWVzLGE9bnVsbCE9PShuPWUudGltZVNlcmllc1NldHRpbmdzUGFuZU9wZW5lZCkmJnZvaWQgMCE9PW4/bjp0LmlzU2V0dGluZ3NQYW5lT3BlbjtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtwcm9tb3RlVGltZVNlcmllczppLGlzU2V0dGluZ3NQYW5lT3BlbjphLHNldHRpbmdzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnNldHRpbmdzKSxvKX0pfSkpLGJrKHhFLHZFLCh0PT57Y29uc3QgZT10LnRhZ01ldGFkYXRhTG9hZFN0YXRlLnN0YXRlPT09eUUuTE9BRElORz95RS5MT0FESU5HOnlFLk5PVF9MT0FERUQsbj1KSih0LnRpbWVTZXJpZXNEYXRhLCgodCxlKT0+SkoodCwodD0+TUEoZSk/SkoodCwodD0+dFEodCkpKTp0USh0KSkpKSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7dGFnTWV0YWRhdGFMb2FkU3RhdGU6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQudGFnTWV0YWRhdGFMb2FkU3RhdGUpLHtzdGF0ZTplfSksdGltZVNlcmllc0RhdGE6bn0pfSkpLGJrKElFLCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3RhZ01ldGFkYXRhTG9hZFN0YXRlOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnRhZ01ldGFkYXRhTG9hZFN0YXRlKSx7c3RhdGU6eUUuTE9BRElOR30pfSkpKSxiayhGRSwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHt0YWdNZXRhZGF0YUxvYWRTdGF0ZTpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC50YWdNZXRhZGF0YUxvYWRTdGF0ZSkse3N0YXRlOnlFLkZBSUxFRH0pfSkpKSxiayhIRSwoKHQse3RhZ01ldGFkYXRhOmV9KT0+e2NvbnN0IG49e3NjYWxhcnM6c1EoZSxoQS5TQ0FMQVJTKSxoaXN0b2dyYW1zOnNRKGUsaEEuSElTVE9HUkFNUyksaW1hZ2VzOmVbaEEuSU1BR0VTXX0sbz1PYmplY3QuYXNzaWduKHt9LHQuY2FyZE1ldGFkYXRhTWFwKSxpPShmdW5jdGlvbiBhKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuIG9mIE9iamVjdC5rZXlzKHQpKXtjb25zdCBvPW47bGV0IGk7aWYoTUEobykpe2lmKCF4QShvKSl0aHJvdyBuZXcgRXJyb3IoIk11bHRpLXJ1biwgc2FtcGxlZCBwbHVnaW4gc3VwcG9ydCBub3QgeWV0IGltcGxlbWVudGVkIik7e2NvbnN0IG49dFtvXS50YWdSdW5TYW1wbGVkSW5mbztmb3IoY29uc3QgdCBvZiBPYmplY3Qua2V5cyhuKSlmb3IoY29uc3QgaSBvZiBPYmplY3Qua2V5cyhuW3RdKSl7Y29uc3R7bWF4U2FtcGxlc1BlclN0ZXA6YX09blt0XVtpXTtmb3IobGV0IG49MDtuPGE7bisrKWUucHVzaCh7cGx1Z2luOm8sdGFnOnQscnVuSWQ6aSxzYW1wbGU6bixudW1TYW1wbGU6YX0pfX19ZWxzZSBpZih4QShvKSl7aT10W29dLnRhZ1RvUnVucztmb3IoY29uc3QgdCBvZiBPYmplY3Qua2V5cyhpKSlmb3IoY29uc3QgbiBvZiBpW3RdKWUucHVzaCh7cGx1Z2luOm8sdGFnOnQscnVuSWQ6bn0pfWVsc2V7aT10W29dLnRhZ1RvUnVucztmb3IoY29uc3QgdCBvZiBPYmplY3Qua2V5cyhpKSllLnB1c2goe3BsdWdpbjpvLHRhZzp0LHJ1bklkOm51bGx9KX19cmV0dXJuIGV9KShuKSxyPVtdO2Zvcihjb25zdCBlIG9mIGkpe2NvbnN0IG49aVQoZSk7dC5jYXJkTWV0YWRhdGFNYXAuaGFzT3duUHJvcGVydHkobil8fChvW25dPWUsci5wdXNoKG4pKX1jb25zdCBzPVsuLi50LmNhcmRMaXN0LC4uLnJdLGw9c1QodC51bnJlc29sdmVkSW1wb3J0ZWRQaW5uZWRDYXJkcyxyLG8sdC5jYXJkVG9QaW5uZWRDb3B5LHQucGlubmVkQ2FyZFRvT3JpZ2luYWwsdC5jYXJkU3RlcEluZGV4KTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCksbCkse3RhZ01ldGFkYXRhTG9hZFN0YXRlOntzdGF0ZTp5RS5MT0FERUQsbGFzdExvYWRlZFRpbWVJbk1zOkRhdGUubm93KCl9LHRhZ01ldGFkYXRhOm4sY2FyZExpc3Q6c30pfSkpLGJrKGVSLCgodCx7dGFnRmlsdGVyOmV9KT0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHt0YWdGaWx0ZXI6ZX0pKSksYmsoTEUsKCh0LHtzb3J0OmV9KT0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzZXR0aW5nT3ZlcnJpZGVzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnNldHRpbmdPdmVycmlkZXMpLHt0b29sdGlwU29ydDplfSl9KSkpLGJrKEJFLCh0PT57dmFyIGU7Y29uc3Qgbj0hKG51bGwhPT0oZT10LnNldHRpbmdPdmVycmlkZXMuaWdub3JlT3V0bGllcnMpJiZ2b2lkIDAhPT1lP2U6dC5zZXR0aW5ncy5pZ25vcmVPdXRsaWVycyk7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7c2V0dGluZ092ZXJyaWRlczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5zZXR0aW5nT3ZlcnJpZGVzKSx7aWdub3JlT3V0bGllcnM6bn0pfSl9KSksYmsoVkUsKCh0LHt4QXhpc1R5cGU6ZX0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NldHRpbmdPdmVycmlkZXM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuc2V0dGluZ092ZXJyaWRlcykse3hBeGlzVHlwZTplfSl9KSkpLGJrKGpFLCgodCx7c21vb3RoaW5nOmV9KT0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzZXR0aW5nT3ZlcnJpZGVzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnNldHRpbmdPdmVycmlkZXMpLHtzY2FsYXJTbW9vdGhpbmc6ZX0pfSkpKSxiayhVRSwodD0+e3ZhciBlO2NvbnN0IG49IShudWxsIT09KGU9dC5zZXR0aW5nT3ZlcnJpZGVzLnNjYWxhclBhcnRpdGlvbk5vbk1vbm90b25pY1gpJiZ2b2lkIDAhPT1lP2U6dC5zZXR0aW5ncy5zY2FsYXJQYXJ0aXRpb25Ob25Nb25vdG9uaWNYKTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzZXR0aW5nT3ZlcnJpZGVzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnNldHRpbmdPdmVycmlkZXMpLHtzY2FsYXJQYXJ0aXRpb25Ob25Nb25vdG9uaWNYOm59KX0pfSkpLGJrKEdFLCgodCx7YnJpZ2h0bmVzc0luTWlsbGk6ZX0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NldHRpbmdPdmVycmlkZXM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuc2V0dGluZ092ZXJyaWRlcykse2ltYWdlQnJpZ2h0bmVzc0luTWlsbGk6ZX0pfSkpKSxiayhXRSwoKHQse2NvbnRyYXN0SW5NaWxsaTplfSk9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7c2V0dGluZ092ZXJyaWRlczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5zZXR0aW5nT3ZlcnJpZGVzKSx7aW1hZ2VDb250cmFzdEluTWlsbGk6ZX0pfSkpKSxiayhZRSwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzZXR0aW5nT3ZlcnJpZGVzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnNldHRpbmdPdmVycmlkZXMpLHtpbWFnZUJyaWdodG5lc3NJbk1pbGxpOnZvaWQgMH0pfSkpKSxiayhxRSwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzZXR0aW5nT3ZlcnJpZGVzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnNldHRpbmdPdmVycmlkZXMpLHtpbWFnZUNvbnRyYXN0SW5NaWxsaTp2b2lkIDB9KX0pKSksYmsoWkUsKHQ9Pnt2YXIgZTtjb25zdCBuPSEobnVsbCE9PShlPXQuc2V0dGluZ092ZXJyaWRlcy5pbWFnZVNob3dBY3R1YWxTaXplKSYmdm9pZCAwIT09ZT9lOnQuc2V0dGluZ3MuaW1hZ2VTaG93QWN0dWFsU2l6ZSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7c2V0dGluZ092ZXJyaWRlczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5zZXR0aW5nT3ZlcnJpZGVzKSx7aW1hZ2VTaG93QWN0dWFsU2l6ZTpufSl9KX0pKSxiayhYRSwoKHQse2hpc3RvZ3JhbU1vZGU6ZX0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NldHRpbmdPdmVycmlkZXM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuc2V0dGluZ092ZXJyaWRlcykse2hpc3RvZ3JhbU1vZGU6ZX0pfSkpKSxiayhLRSwoKHQse3JlcXVlc3RzOmV9KT0+e2lmKCFlLmxlbmd0aClyZXR1cm4gdDtjb25zdCBuPU9iamVjdC5hc3NpZ24oe30sdC50aW1lU2VyaWVzRGF0YSk7Zm9yKGNvbnN0IG8gb2YgZSl7Y29uc3R7cGx1Z2luOmUsdGFnOmksc2FtcGxlOmF9PW87bltlXT1vVChuLGUsaSxhKTtjb25zdCByPW5UKG4sZSxpLGEpLHM9T0Eobyk/W28ucnVuSWRdOnJUKHQudGFnTWV0YWRhdGEsZSxpLGEpO3IucnVuVG9Mb2FkU3RhdGU9YVQoeUUuTE9BRElORyxzLHIucnVuVG9Mb2FkU3RhdGUpfXJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3RpbWVTZXJpZXNEYXRhOm59KX0pKSxiayhKRSwoKHQse3JlcXVlc3Q6ZX0pPT57Y29uc3Qgbj1PYmplY3QuYXNzaWduKHt9LHQudGltZVNlcmllc0RhdGEpLHtwbHVnaW46byx0YWc6aSxzYW1wbGU6YX09ZTtuW29dPW9UKG4sbyxpLGEpO2NvbnN0IHI9blQobixvLGksYSkscz1PQShlKT9bZS5ydW5JZF06clQodC50YWdNZXRhZGF0YSxvLGksYSk7cmV0dXJuIHIucnVuVG9Mb2FkU3RhdGU9YVQoeUUuRkFJTEVELHMsci5ydW5Ub0xvYWRTdGF0ZSksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHt0aW1lU2VyaWVzRGF0YTpufSl9KSksYmsoUUUsKCh0LHtyZXNwb25zZTplfSk9Pntjb25zdCBuPU9iamVjdC5hc3NpZ24oe30sdC5zdGVwTWluTWF4KSxvPU9iamVjdC5hc3NpZ24oe30sdC50aW1lU2VyaWVzRGF0YSkse3BsdWdpbjppLHRhZzphLHJ1bklkOnIsc2FtcGxlOnN9PWU7b1tpXT1vVChvLGksYSxzKTtjb25zdCBsPW5UKG8saSxhLHMpO2lmKHdBKGUpKXtjb25zdCBlPXI/W3JdOnJUKHQudGFnTWV0YWRhdGEsaSxhLHMpO2wucnVuVG9Mb2FkU3RhdGU9YVQoeUUuRkFJTEVELGUsbC5ydW5Ub0xvYWRTdGF0ZSl9ZWxzZXtjb25zdCB0PWUucnVuVG9TZXJpZXM7bC5ydW5Ub1Nlcmllcz1PYmplY3QuYXNzaWduKHt9LGwucnVuVG9TZXJpZXMpLGwucnVuVG9Mb2FkU3RhdGU9T2JqZWN0LmFzc2lnbih7fSxsLnJ1blRvTG9hZFN0YXRlKTtmb3IoY29uc3QgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpe2wucnVuVG9TZXJpZXNbZV09dFtlXSxsLnJ1blRvTG9hZFN0YXRlW2VdPXlFLkxPQURFRDtmb3IoY29uc3QgbyBvZiB0W2VdKW4ubWluPU1hdGgubWluKG4ubWluLG8uc3RlcCksbi5tYXg9TWF0aC5tYXgobi5tYXgsby5zdGVwKX19cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7dGltZVNlcmllc0RhdGE6byxjYXJkU3RlcEluZGV4OiRKKHQuY2FyZE1ldGFkYXRhTWFwLHQuY2FyZFN0ZXBJbmRleCxvLHQudGltZVNlcmllc0RhdGEpLHN0ZXBNaW5NYXg6bn0pfSkpLGJrKHRSLCgodCx7Y2FyZElkOmUsc3RlcEluZGV4Om59KT0+e2NvbnN0IG89UUooZSx0LmNhcmRNZXRhZGF0YU1hcCx0LnRpbWVTZXJpZXNEYXRhKTtsZXQgaT1uO3JldHVybiBudWxsPT09bz9pPW51bGw6bj5vJiYoaT1vKSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2NhcmRTdGVwSW5kZXg6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuY2FyZFN0ZXBJbmRleCkse1tlXTppfSl9KX0pKSxiayhuUiwoKHQse3RhZ0dyb3VwOmV9KT0+e2NvbnN0IG49bmV3IE1hcCh0LnRhZ0dyb3VwRXhwYW5kZWQpO3JldHVybiBuLnNldChlLCFuLmdldChlKSksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHt0YWdHcm91cEV4cGFuZGVkOm59KX0pKSxiaygkRSwoKHQse2VudGVyZWRDYXJkczplLGV4aXRlZENhcmRzOm59KT0+e2lmKCFlLmxlbmd0aCYmIW4ubGVuZ3RoKXJldHVybiB0O2NvbnN0IG89bmV3IE1hcCh0LnZpc2libGVDYXJkTWFwKTtyZXR1cm4gZS5mb3JFYWNoKCgoe2VsZW1lbnRJZDp0LGNhcmRJZDplfSk9Pnt2YXIgbjtjb25zdCBpPW51bGwhPT0obj1vLmdldCh0KSkmJnZvaWQgMCE9PW4/bjpudWxsO2lmKG51bGwhPT1pJiZpIT09ZSl0aHJvdyBuZXcgRXJyb3IoIkEgRE9NIGVsZW1lbnQgY2Fubm90IGJlIHJldXNlZCBmb3IgbW9yZSB0aGFuIDEgdW5pcXVlIGNhcmQgbWV0YWRhdGEiKTtvLnNldCh0LGUpfSkpLG4uZm9yRWFjaCgoKHtlbGVtZW50SWQ6dH0pPT57by5kZWxldGUodCl9KSksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHt2aXNpYmxlQ2FyZE1hcDpvfSl9KSksYmsob1IsKCh0LHtjYXJkSWQ6ZX0pPT57Y29uc3Qgbj10LnBpbm5lZENhcmRUb09yaWdpbmFsLmhhcyhlKSxvPSFuJiYhdC5jYXJkVG9QaW5uZWRDb3B5LmhhcyhlKTtpZihvJiYhY1QodCkpcmV0dXJuIHQ7bGV0IGk9bmV3IE1hcCh0LmNhcmRUb1Bpbm5lZENvcHkpLGE9bmV3IE1hcCh0LnBpbm5lZENhcmRUb09yaWdpbmFsKSxyPU9iamVjdC5hc3NpZ24oe30sdC5jYXJkTWV0YWRhdGFNYXApLHM9T2JqZWN0LmFzc2lnbih7fSx0LmNhcmRTdGVwSW5kZXgpO2lmKG4pe2NvbnN0IG49dC5waW5uZWRDYXJkVG9PcmlnaW5hbC5nZXQoZSk7aS5kZWxldGUobiksYS5kZWxldGUoZSksZGVsZXRlIHJbZV0sZGVsZXRlIHNbZV19ZWxzZSBpZihvKXtjb25zdCB0PWxUKGUsaSxhLHMscik7aT10LmNhcmRUb1Bpbm5lZENvcHksYT10LnBpbm5lZENhcmRUb09yaWdpbmFsLHI9dC5jYXJkTWV0YWRhdGFNYXAscz10LmNhcmRTdGVwSW5kZXh9ZWxzZXtjb25zdCBuPXQuY2FyZFRvUGlubmVkQ29weS5nZXQoZSk7aS5kZWxldGUoZSksYS5kZWxldGUobiksZGVsZXRlIHJbbl0sZGVsZXRlIHNbbl19cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7Y2FyZE1ldGFkYXRhTWFwOnIsY2FyZFN0ZXBJbmRleDpzLGNhcmRUb1Bpbm5lZENvcHk6aSxwaW5uZWRDYXJkVG9PcmlnaW5hbDphfSl9KSksYmsobFIsKHQ9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7c2VsZWN0VGltZUVuYWJsZWQ6IXQuc2VsZWN0VGltZUVuYWJsZWR9KSkpLGJrKHJSLCgodCxlKT0+e3ZhciBuLG8saSxhO2NvbnN0IHI9ZS5zdGFydFN0ZXA7bGV0IHM9bnVsbCE9PShhPW51bGwhPT0obj1lLmVuZFN0ZXApJiZ2b2lkIDAhPT1uP246bnVsbD09PShpPW51bGw9PT0obz10LnNlbGVjdGVkVGltZSl8fHZvaWQgMD09PW8/dm9pZCAwOm8uZW5kKXx8dm9pZCAwPT09aT92b2lkIDA6aS5zdGVwKSYmdm9pZCAwIT09YT9hOnQuc3RlcE1pbk1heC5tYXg7cmV0dXJuIHI+cyYmKHM9ciksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzZWxlY3RUaW1lRW5hYmxlZDohMCxzZWxlY3RlZFRpbWU6e3N0YXJ0OntzdGVwOnJ9LGVuZDp7c3RlcDpzfX19KX0pKSxiayhjUiwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHt1c2VSYW5nZVNlbGVjdFRpbWU6IXQudXNlUmFuZ2VTZWxlY3RUaW1lfSkpKSxiayhzUiwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzZWxlY3RlZFRpbWU6bnVsbH0pKSksYmsoaVIsKCh0LHtwbHVnaW46ZX0pPT57bGV0IG49bmV3IFNldCh0LmZpbHRlcmVkUGx1Z2luVHlwZXMpO3JldHVybiBuLmhhcyhlKT9uLmRlbGV0ZShlKTpuLmFkZChlKSxPYmplY3QudmFsdWVzKGhBKS5ldmVyeSgodD0+bi5oYXModCkpKSYmKG49bmV3IFNldCksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtmaWx0ZXJlZFBsdWdpblR5cGVzOm59KX0pKSxiayhhUiwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtmaWx0ZXJlZFBsdWdpblR5cGVzOm5ldyBTZXR9KSkpLGJrKGRSLCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3Byb21vdGVUaW1lU2VyaWVzOiExfSkpKSxiayh6RSwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtpc1NldHRpbmdzUGFuZU9wZW46IXQuaXNTZXR0aW5nc1BhbmVPcGVufSkpKSxiayhORSwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtpc1NldHRpbmdzUGFuZU9wZW46ITF9KSkpKTtmdW5jdGlvbiByUSh0LGUpe3JldHVybiBCTihhUSxvUSkodCxlKX1mdW5jdGlvbiBzUSh0LGUpe3JldHVybnt0YWdEZXNjcmlwdGlvbnM6dFtlXS50YWdEZXNjcmlwdGlvbnMsdGFnVG9SdW5zOmxRKHRbZV0ucnVuVGFnSW5mbyl9fWZ1bmN0aW9uIGxRKHQpe2NvbnN0IGU9e307Zm9yKGNvbnN0IG4gaW4gdClmb3IoY29uc3QgbyBvZiB0W25dKWVbb109Wy4uLmVbb118fFtdLG5dO3JldHVybiBlfWNvbnN0IGNRPVp3KGdULHlULCgodCxlLG4pPT5lP09iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7bG9hZFN0YXRlOnQsaWQ6bn0pOm51bGwpKSxkUT1KUCgiW01ldHJpY3MgRWZmZWN0c10gSW5pdCIpO2NsYXNzIHBRe2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLmFjdGlvbnMkPXQsdGhpcy5zdG9yZT1lLHRoaXMuZGF0YVNvdXJjZT1uLHRoaXMuZGFzaGJvYXJkU2hvd25XaXRob3V0RGF0YSQ9dGhpcy5hY3Rpb25zJC5waXBlKERrKGRRLF9FLFBFLGRTKSxWZSh0aGlzLnN0b3JlLnNlbGVjdChNUiksdGhpcy5zdG9yZS5zZWxlY3QodVQpKSxjZSgoKFssdCxlXSk9PnQ9PT1fQSYmZS5zdGF0ZT09PXlFLk5PVF9MT0FERUQpKSksdGhpcy5yZWxvYWRSZXF1ZXN0ZWRXaGlsZVNob3duJD10aGlzLmFjdGlvbnMkLnBpcGUoRGsoeEUsdkUpLFZlKHRoaXMuc3RvcmUuc2VsZWN0KE1SKSksY2UoKChbLHRdKT0+dD09PV9BKSkpLHRoaXMubG9hZFRhZ01ldGFkYXRhJD1yZSh0aGlzLmRhc2hib2FyZFNob3duV2l0aG91dERhdGEkLHRoaXMucmVsb2FkUmVxdWVzdGVkV2hpbGVTaG93biQpLnBpcGUoVmUodGhpcy5zdG9yZS5zZWxlY3QodVQpLHRoaXMuc3RvcmUuc2VsZWN0KFRTKSksY2UoKChbLHQsZV0pPT50LnN0YXRlIT09eUUuTE9BRElORyYmbnVsbCE9PWUpKSxGZSgoKCk9Pnt0aGlzLnN0b3JlLmRpc3BhdGNoKElFKCkpfSkpLHplKCgoWywsdF0pPT50aGlzLmRhdGFTb3VyY2UuZmV0Y2hUYWdNZXRhZGF0YSh0KS5waXBlKEZlKCh0PT57dGhpcy5zdG9yZS5kaXNwYXRjaChIRSh7dGFnTWV0YWRhdGE6dH0pKX0pKSxwZSgoKCk9Pih0aGlzLnN0b3JlLmRpc3BhdGNoKEZFKCkpLEV0KG51bGwpKSkpKSkpKSx0aGlzLnZpc2libGVDYXJkc1dpdGhvdXREYXRhQ2hhbmdlZCQ9dGhpcy5hY3Rpb25zJC5waXBlKERrKCRFKSx6ZSgoKCk9PnRoaXMuZ2V0VmlzaWJsZUNhcmRGZXRjaEluZm9zKCkucGlwZShiZSgxKSkpKSxJdCgodD0+dC5maWx0ZXIoKHQ9PnQubG9hZFN0YXRlPT09eUUuTk9UX0xPQURFRCkpKSkpLHRoaXMudmlzaWJsZUNhcmRzUmVsb2FkZWQkPXRoaXMucmVsb2FkUmVxdWVzdGVkV2hpbGVTaG93biQucGlwZSh6ZSgoKCk9PnRoaXMuZ2V0VmlzaWJsZUNhcmRGZXRjaEluZm9zKCkucGlwZShiZSgxKSkpKSxJdCgodD0+dC5maWx0ZXIoKHQ9PnQubG9hZFN0YXRlIT09eUUuTE9BRElORykpKSkpLHRoaXMubG9hZFRpbWVTZXJpZXMkPXJlKHRoaXMudmlzaWJsZUNhcmRzV2l0aG91dERhdGFDaGFuZ2VkJCx0aGlzLnZpc2libGVDYXJkc1JlbG9hZGVkJCkucGlwZShjZSgodD0+dC5sZW5ndGg+MCkpLFZlKHRoaXMuc3RvcmUuc2VsZWN0KFRTKS5waXBlKGNlKCh0PT5udWxsIT09dCkpKSksWnQoKChbdCxlXSk9PnRoaXMuZmV0Y2hUaW1lU2VyaWVzRm9yQ2FyZHModCxlKSkpKSx0aGlzLmRhdGFFZmZlY3RzJD1NaygoKCk9PnJlKHRoaXMubG9hZFRhZ01ldGFkYXRhJCx0aGlzLmxvYWRUaW1lU2VyaWVzJCkpLHtkaXNwYXRjaDohMX0pfW5ncnhPbkluaXRFZmZlY3RzKCl7cmV0dXJuIGRRKCl9Z2V0VmlzaWJsZUNhcmRGZXRjaEluZm9zKCl7cmV0dXJuIHRoaXMuc3RvcmUuc2VsZWN0KENUKS5waXBlKHplKCh0PT50LnNpemU/JHQoWy4uLnRdLm1hcCgodD0+dGhpcy5zdG9yZS5zZWxlY3QoY1EsdCkucGlwZShiZSgxKSkpKSk6RXQoW10pKSksSXQoKHQ9PnQuZmlsdGVyKEJvb2xlYW4pKSkpfWZldGNoVGltZVNlcmllcyh0KXtyZXR1cm4gdGhpcy5kYXRhU291cmNlLmZldGNoVGltZVNlcmllcyhbdF0pLnBpcGUoRmUoKHQ9Pntjb25zdCBlPXQuZmlsdGVyKHdBKTtlLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVGltZSBzZXJpZXMgcmVzcG9uc2UgY29udGFpbmVkIGVycm9yczoiLGUpLHRoaXMuc3RvcmUuZGlzcGF0Y2goUUUoe3Jlc3BvbnNlOnRbMF19KSl9KSkscGUoKCgpPT4odGhpcy5zdG9yZS5kaXNwYXRjaChKRSh7cmVxdWVzdDp0fSkpLEV0KG51bGwpKSkpKX1mZXRjaFRpbWVTZXJpZXNGb3JDYXJkcyh0LGUpe3JldHVybiBFdCh0Lm1hcCgodD0+e2NvbnN0e3BsdWdpbjpuLHRhZzpvLHJ1bklkOmksc2FtcGxlOmF9PXQ7cmV0dXJuIHhBKG4pP3twbHVnaW46bix0YWc6byxzYW1wbGU6YSxydW5JZDppfTp7cGx1Z2luOm4sdGFnOm8sc2FtcGxlOmEsZXhwZXJpbWVudElkczplfX0pKSkucGlwZShGZSgodD0+e3RoaXMuc3RvcmUuZGlzcGF0Y2goS0Uoe3JlcXVlc3RzOnR9KSl9KSksWnQoKHQ9PnJlKC4uLnQubWFwKCh0PT50aGlzLmZldGNoVGltZVNlcmllcyh0KSkpKSkpKX19cFEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHBRKSh2cihTayksdnIoSXcpLHZyKFBBKSl9LHBRLsm1cHJvdj1Nbih7dG9rZW46cFEsZmFjdG9yeTpwUS7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgocFEsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlNrfSx7dHlwZTpJd30se3R5cGU6UEF9XX0pLG51bGwpO2NvbnN0IG1RPW5ldyBHYSgiTWV0cmljcyBTdG9yZSBDb25maWciKSx1UT1uZXcgR2EoIk1ldHJpY3MgSW5pdGlhbCBTZXR0aW5ncyBDb25maWciKTtmdW5jdGlvbiBmUSh0KXtyZXR1cm4gdD97aW5pdGlhbFN0YXRlOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpUSkse3NldHRpbmdzOnR9KX06e2luaXRpYWxTdGF0ZTppUX19dmFyIGdROyEoZnVuY3Rpb24odCl7dFt0LkxFRlQ9MV09IkxFRlQiLHRbdC5SSUdIVD0yXT0iUklHSFQiLHRbdC5NSURETEU9NF09Ik1JRERMRSIsdFt0LkZPVVJUSD04XT0iRk9VUlRIIix0W3QuRklGVEg9MzJdPSJGSUZUSCJ9KShnUXx8KGdRPXt9KSk7bGV0IGhRPTA7ZnVuY3Rpb24gYlEodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJidXR0b24iLDMpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5leHBhbmRTaWRlYmFyKCl9KSksVG0oMSwibWF0LWljb24iLDQpLEFtKCl9fWZ1bmN0aW9uIHlRKHQsZSl7aWYoMSZ0JiYoUm0oMCwibmF2Iiw1KSxBaCgxLCJhc3luYyIpLFhtKDIsMSksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7ZHUoIndpZHRoIixUaCgxLDQsdC53aWR0aCQpLCIlIikoIm1pbi13aWR0aCIsdC5NSU5JTVVNX1NJREVCQVJfV0lEVEhfSU5fUFgsInB4Iil9fWZ1bmN0aW9uIF9RKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2Iiw2KSxWbSgibW91c2Vkb3duIiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgpLnJlc2l6ZUdyYWJiZWQoKX0pKSxUbSgxLCJtYXQtaWNvbiIsNyksQW0oKX19Y29uc3QgQ1E9W1tbIiIsIm1haW4iLCIiXV0sW1siIiwic2lkZWJhciIsIiJdXV07Y2xhc3MgTVF7Y29uc3RydWN0b3IodCxlKXt0aGlzLnN0b3JlPXQsdGhpcy53aWR0aCQ9dGhpcy5zdG9yZS5zZWxlY3QoT1IpLHRoaXMubmdVbnN1YnNjcmliZT1uZXcgSSx0aGlzLnJlc2l6aW5nPSExLHRoaXMuTUlOSU1VTV9TSURFQkFSX1dJRFRIX0lOX1BYPTc1LG9lKGUubmF0aXZlRWxlbWVudCwibW91c2Vtb3ZlIikucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpLGNlKCgoKT0+dGhpcy5yZXNpemluZykpKS5zdWJzY3JpYmUoKHQ9PntpZigodC5idXR0b25zJmdRLkxFRlQpIT09Z1EuTEVGVClyZXR1cm4gdm9pZCh0aGlzLnJlc2l6aW5nPSExKTt0LnByZXZlbnREZWZhdWx0KCk7Y29uc3R7d2lkdGg6bn09ZS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMuc3RvcmUuZGlzcGF0Y2goVEUoe3dpZHRoSW5QZXJjZW50OnQuY2xpZW50WDw9dGhpcy5NSU5JTVVNX1NJREVCQVJfV0lEVEhfSU5fUFg/MDp0LmNsaWVudFgvbioxMDB9KSl9KSksb2UoZS5uYXRpdmVFbGVtZW50LCJtb3VzZXVwIix7cGFzc2l2ZTohMH0pLnBpcGUoSWUodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKCgoKT0+e3RoaXMucmVzaXppbmc9ITF9KSl9bmdPbkRlc3Ryb3koKXt0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpLHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpfXJlc2l6ZUdyYWJiZWQoKXt0aGlzLnJlc2l6aW5nPSEwfWV4cGFuZFNpZGViYXIoKXt0aGlzLnN0b3JlLmRpc3BhdGNoKFRFKHt3aWR0aEluUGVyY2VudDoyMH0pKX19dmFyIHZRO01RLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxNUSkoU20oSXcpLFNtKGhnKSl9LE1RLsm1Y21wPXRvKHt0eXBlOk1RLHNlbGVjdG9yczpbWyJ0Yi1kYXNoYm9hcmQtbGF5b3V0Il1dLG5nQ29udGVudFNlbGVjdG9yczpbIlttYWluXSIsIltzaWRlYmFyXSJdLGRlY2xzOjcsdmFyczo5LGNvbnN0czpbWyJjbGFzcyIsImV4cGFuZCIsMywiY2xpY2siLDQsIm5nSWYiXSxbImNsYXNzIiwic2lkZWJhciIsMywid2lkdGgiLCJtaW5XaWR0aCIsNCwibmdJZiJdLFsiY2xhc3MiLCJyZXNpemVyIiwzLCJtb3VzZWRvd24iLDQsIm5nSWYiXSxbMSwiZXhwYW5kIiwzLCJjbGljayJdLFsic3ZnSWNvbiIsImV4cGFuZF9tb3JlXzI0cHgiXSxbMSwic2lkZWJhciJdLFsxLCJyZXNpemVyIiwzLCJtb3VzZWRvd24iXSxbInN2Z0ljb24iLCJkcmFnX2luZGljYXRvcl8yNHB4Il1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabShDUSksUXAoMCxiUSwyLDAsImJ1dHRvbiIsMCksQWgoMSwiYXN5bmMiKSxRcCgyLHlRLDMsNiwibmF2IiwxKSxBaCgzLCJhc3luYyIpLFFwKDQsX1EsMiwwLCJkaXYiLDIpLEFoKDUsImFzeW5jIiksWG0oNikpLDImZSYmKERtKCJuZ0lmIiwwPT09VGgoMSwzLG4ud2lkdGgkKSkscmMoMiksRG0oIm5nSWYiLFRoKDMsNSxuLndpZHRoJCk+MCkscmMoMiksRG0oIm5nSWYiLFRoKDUsNyxuLndpZHRoJCk+MCkpfSxkaXJlY3RpdmVzOltkTSxEV10scGlwZXM6W3dNXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJTtwb3NpdGlvbjpyZWxhdGl2ZX0uc2lkZWJhcltfbmdjb250ZW50LSVDT01QJV17bWF4LXdpZHRoOjgwdnd9LnJlc2l6ZXJbX25nY29udGVudC0lQ09NUCVdLCAuZXhwYW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ViZWJlYjtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZmxleDowIDAgMjBweDtqdXN0aWZ5LXNlbGY6c3RyZXRjaDt3aWR0aDoyMHB4fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5yZXNpemVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLnJlc2l6ZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNTU1fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5leHBhbmRbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuZXhwYW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzU1NX0ucmVzaXplcltfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6MCAxcHg7Y3Vyc29yOmV3LXJlc2l6ZTtkaXNwbGF5OmZsZXg7anVzdGlmeS1zZWxmOnN0cmV0Y2h9LnJlc2l6ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlfS5leHBhbmRbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6MCAxcHggMCAwO2NvbG9yOmluaGVyaXQ7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpmbGV4O2p1c3RpZnktc2VsZjpzdHJldGNoO3BhZGRpbmc6MH0uZXhwYW5kW19uZ2NvbnRlbnQtJUNPTVAlXSAgIG1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06cm90YXRlKC05MGRlZyk7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXJ9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKE1RLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InRiLWRhc2hib2FyZC1sYXlvdXQiLHRlbXBsYXRlOidcbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj0iKHdpZHRoJCB8IGFzeW5jKSA9PT0gMCJcbiAgICAgIGNsYXNzPSJleHBhbmQiXG4gICAgICAoY2xpY2spPSJleHBhbmRTaWRlYmFyKCkiXG4gICAgPlxuICAgICAgPG1hdC1pY29uIHN2Z0ljb249ImV4cGFuZF9tb3JlXzI0cHgiPjwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPG5hdlxuICAgICAgKm5nSWY9Iih3aWR0aCQgfCBhc3luYykgPiAwIlxuICAgICAgY2xhc3M9InNpZGViYXIiXG4gICAgICBbc3R5bGUud2lkdGguJV09IndpZHRoJCB8IGFzeW5jIlxuICAgICAgW3N0eWxlLm1pbldpZHRoLnB4XT0iTUlOSU1VTV9TSURFQkFSX1dJRFRIX0lOX1BYIlxuICAgID5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD0iW3NpZGViYXJdIj48L25nLWNvbnRlbnQ+XG4gICAgPC9uYXY+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9Iih3aWR0aCQgfCBhc3luYykgPiAwIlxuICAgICAgY2xhc3M9InJlc2l6ZXIiXG4gICAgICAobW91c2Vkb3duKT0icmVzaXplR3JhYmJlZCgpIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbiBzdmdJY29uPSJkcmFnX2luZGljYXRvcl8yNHB4Ij48L21hdC1pY29uPlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD0iW21haW5dIj48L25nLWNvbnRlbnQ+XG4gICcsc3R5bGVVcmxzOlsibGF5b3V0X2NvbnRhaW5lci5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9LHt0eXBlOmhnfV19KSxudWxsKSwoZnVuY3Rpb24odCl7dC5DSEVDS0JPWD0iY2hlY2tib3giLHQuUlVOX05BTUU9InJ1bl9uYW1lIix0LkVYUEVSSU1FTlRfTkFNRT0iZXhwZXJpbWVudF9uYW1lIix0LlJVTl9DT0xPUj0icnVuX2NvbG9yIn0pKHZRfHwodlE9e30pKTtjb25zdCB4UT1LdyhUUiksT1E9WncoeFEsKCh0LGUpPT57Y29uc3Qgbj1bXTtmb3IoY29uc3QgbyBvZiBlKXQuc3BlY3Nbb10mJm4ucHVzaCh0LnNwZWNzW29dLmhwYXJhbS5kZWZhdWx0RmlsdGVycyk7cmV0dXJuIHRBKG4pfSkpLFBRPVp3KE9RLHhRLCgodCxlLG4pPT57dmFyIG87Y29uc3QgaT0kUihuKSxhPWUuZmlsdGVyc1tpXTtyZXR1cm4gbmV3IE1hcChbLi4udCwuLi5udWxsIT09KG89bnVsbD09YT92b2lkIDA6YS5ocGFyYW1zKSYmdm9pZCAwIT09bz9vOltdXSl9KSksd1E9WncoeFEsKCh0LGUpPT57Y29uc3Qgbj1bXTtmb3IoY29uc3QgbyBvZiBlKXQuc3BlY3Nbb10mJm4ucHVzaCh0LnNwZWNzW29dLm1ldHJpYy5kZWZhdWx0RmlsdGVycyk7cmV0dXJuIGVBKG4pfSkpLGtRPVp3KHdRLHhRLCgodCxlLG4pPT57dmFyIG87Y29uc3QgaT0kUihuKSxhPWUuZmlsdGVyc1tpXTtyZXR1cm4gbmV3IE1hcChbLi4udCwuLi5udWxsIT09KG89bnVsbD09YT92b2lkIDA6YS5tZXRyaWNzKSYmdm9pZCAwIT09bz9vOltdXSl9KSksU1E9WncoeFEsKCh0LGUpPT4oZnVuY3Rpb24gbiguLi50KXtjb25zdCBlPW5ldyBNYXAsbj1uZXcgTWFwLG89bmV3IE1hcCxpPW5ldyBNYXAsYT1bXTtmb3IoY29uc3QgciBvZiB0KXtmb3IoY29uc3QgdCBvZiByLmhwYXJhbXMpaWYobi5oYXModC5uYW1lKXx8bi5zZXQodC5uYW1lLG5ldyBTZXQpLG4uZ2V0KHQubmFtZSkuYWRkKHQuZGlzcGxheU5hbWUpLGUuaGFzKHQubmFtZSkpe2NvbnN0IG49ZS5nZXQodC5uYW1lKSxvPXQ7aWYobi50eXBlIT09by50eXBlJiZhLnB1c2goYEhwYXJhbSwgJHtvLm5hbWV9LCB0eXBlcyBoYXZlIHRvIG1hdGNoLiBHb3Q6ICR7bi50eXBlfSB2cy4gJHtvLnR5cGV9YCksbi5kb21haW4udHlwZT09PVpSLklOVEVSVkFMJiZvLmRvbWFpbi50eXBlPT09WlIuSU5URVJWQUwpbi5kb21haW4ubWluVmFsdWU9PT1vLmRvbWFpbi5taW5WYWx1ZSYmbi5kb21haW4ubWF4VmFsdWU9PT1vLmRvbWFpbi5tYXhWYWx1ZXx8YS5wdXNoKGBIcGFyYW0sICR7by5uYW1lfSwgZG9tYWlucyBoYXZlIHRvIG1hdGNoLiBHb3Q6ICR7bi5kb21haW59IHZzLiAke28uZG9tYWlufWApO2Vsc2UgaWYobi5kb21haW4udHlwZT09PVpSLkRJU0NSRVRFJiZvLmRvbWFpbi50eXBlPT09WlIuRElTQ1JFVEUpe2NvbnN0IHQ9bmV3IFNldChbLi4ubi5kb21haW4udmFsdWVzLC4uLm8uZG9tYWluLnZhbHVlc10pO24uZG9tYWluLnZhbHVlcy5sZW5ndGg9PT1vLmRvbWFpbi52YWx1ZXMubGVuZ3RoJiZuLmRvbWFpbi52YWx1ZXMubGVuZ3RoPT09dC5zaXplfHxhLnB1c2goYEhwYXJhbSwgJHtvLm5hbWV9LCBkb21haW5zIGhhdmUgdG8gbWF0Y2guIEdvdDogJHtuLmRvbWFpbn0gdnMuICR7by5kb21haW59YCl9ZWxzZSBhLnB1c2goYEhwYXJhbSwgJHtvLm5hbWV9LCBkb21haW5zIGhhdmUgdG8gbWF0Y2guIEdvdDogJHtuLmRvbWFpbn0gdnMuICR7by5kb21haW59YCl9ZWxzZSBlLnNldCh0Lm5hbWUsT2JqZWN0LmFzc2lnbih7fSx0KSk7Zm9yKGNvbnN0IHQgb2Ygci5tZXRyaWNzKWlmKGkuaGFzKHQudGFnKXx8aS5zZXQodC50YWcsbmV3IFNldCksaS5nZXQodC50YWcpLmFkZCh0LmRpc3BsYXlOYW1lKSxvLmhhcyh0LnRhZykpe2NvbnN0IGU9by5nZXQodC50YWcpLG49dDtlLmRhdGFzZXRUeXBlIT09bi5kYXRhc2V0VHlwZSYmYS5wdXNoKGBNZXRyaWMsICR7bi50YWd9LCBkYXRhc2V0VHlwZXMgaGF2ZSB0byBtYXRjaC4gR290OiAke2UuZGF0YXNldFR5cGV9IHZzLiAke24uZGF0YXNldFR5cGV9YCl9ZWxzZSBvLnNldCh0LnRhZyxPYmplY3QuYXNzaWduKHt9LHQpKX1pZihhLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYFZhbGlkYXRpb24gZXJyb3I6XG4ke2Euam9pbigiXG4iKX1gKTtyZXR1cm57aHBhcmFtczpbLi4uZV0ubWFwKCgoW3QsZV0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSkse2Rpc3BsYXlOYW1lOlsuLi5uLmdldCh0KV0uam9pbigiIG9yICIpfSkpKSxtZXRyaWNzOlsuLi5vXS5tYXAoKChbdCxlXSk9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7ZGlzcGxheU5hbWU6Wy4uLmkuZ2V0KHQpXS5qb2luKCIgb3IgIil9KSkpfX0pKC4uLmUuZXhwZXJpbWVudElkcy5tYXAoKGU9Pntjb25zdCBuPXQuc3BlY3NbZV07cmV0dXJuIG4/e2hwYXJhbXM6bi5ocGFyYW0uc3BlY3MsbWV0cmljczpuLm1ldHJpYy5zcGVjc306bnVsbH0pKS5maWx0ZXIoQm9vbGVhbikpKSksRFE9e3Rvb2x0aXBTdGF0ZTpueCgic3RhdGUiLFtyeCgiaW5pdGlhbCwgdm9pZCwgaGlkZGVuIixheCh7b3BhY2l0eTowLHRyYW5zZm9ybToic2NhbGUoMCkifSkpLHJ4KCJ2aXNpYmxlIixheCh7dHJhbnNmb3JtOiJzY2FsZSgxKSJ9KSksbHgoIiogPT4gdmlzaWJsZSIsb3goIjIwMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpIixzeChbYXgoe29wYWNpdHk6MCx0cmFuc2Zvcm06InNjYWxlKDApIixvZmZzZXQ6MH0pLGF4KHtvcGFjaXR5Oi41LHRyYW5zZm9ybToic2NhbGUoMC45OSkiLG9mZnNldDouNX0pLGF4KHtvcGFjaXR5OjEsdHJhbnNmb3JtOiJzY2FsZSgxKSIsb2Zmc2V0OjF9KV0pKSksbHgoIiogPT4gaGlkZGVuIixveCgiMTAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSkiLGF4KHtvcGFjaXR5OjB9KSkpXSl9LEVRPU56KHtwYXNzaXZlOiEwfSk7ZnVuY3Rpb24gUlEodCl7cmV0dXJuIEVycm9yKGBUb29sdGlwIHBvc2l0aW9uICIke3R9IiBpcyBpbnZhbGlkLmApfWNvbnN0IEFRPW5ldyBHYSgibWF0LXRvb2x0aXAtc2Nyb2xsLXN0cmF0ZWd5IiksVFE9e3Byb3ZpZGU6QVEsZGVwczpbcExdLHVzZUZhY3Rvcnk6ZnVuY3Rpb24gTlEodCl7cmV0dXJuKCk9PnQuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKHtzY3JvbGxUaHJvdHRsZToyMH0pfX0selE9bmV3IEdhKCJtYXQtdG9vbHRpcC1kZWZhdWx0LW9wdGlvbnMiLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OmZ1bmN0aW9uIElRKCl7cmV0dXJue3Nob3dEZWxheTowLGhpZGVEZWxheTowLHRvdWNoZW5kSGlkZURlbGF5OjE1MDB9fX0pO2NsYXNzIEhRe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIscyxsLGMsZCxwKXt0aGlzLl9vdmVybGF5PXQsdGhpcy5fZWxlbWVudFJlZj1lLHRoaXMuX3Njcm9sbERpc3BhdGNoZXI9bix0aGlzLl92aWV3Q29udGFpbmVyUmVmPW8sdGhpcy5fbmdab25lPWksdGhpcy5fcGxhdGZvcm09YSx0aGlzLl9hcmlhRGVzY3JpYmVyPXIsdGhpcy5fZm9jdXNNb25pdG9yPXMsdGhpcy5fZGlyPWMsdGhpcy5fZGVmYXVsdE9wdGlvbnM9ZCx0aGlzLl9wb3NpdGlvbj0iYmVsb3ciLHRoaXMuX2Rpc2FibGVkPSExLHRoaXMuX3ZpZXdJbml0aWFsaXplZD0hMSx0aGlzLl9wb2ludGVyRXhpdEV2ZW50c0luaXRpYWxpemVkPSExLHRoaXMuX3ZpZXdwb3J0TWFyZ2luPTgsdGhpcy5fY3NzQ2xhc3NQcmVmaXg9Im1hdCIsdGhpcy5zaG93RGVsYXk9dGhpcy5fZGVmYXVsdE9wdGlvbnMuc2hvd0RlbGF5LHRoaXMuaGlkZURlbGF5PXRoaXMuX2RlZmF1bHRPcHRpb25zLmhpZGVEZWxheSx0aGlzLnRvdWNoR2VzdHVyZXM9ImF1dG8iLHRoaXMuX21lc3NhZ2U9IiIsdGhpcy5fcGFzc2l2ZUxpc3RlbmVycz1bXSx0aGlzLl9kZXN0cm95ZWQ9bmV3IEksdGhpcy5faGFuZGxlS2V5ZG93bj10PT57dGhpcy5faXNUb29sdGlwVmlzaWJsZSgpJiZ0LmtleUNvZGU9PT11eiYmIWJ6KHQpJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5fbmdab25lLnJ1bigoKCk9PnRoaXMuaGlkZSgwKSkpKX0sdGhpcy5fc2Nyb2xsU3RyYXRlZ3k9bCx0aGlzLl9kb2N1bWVudD1wLGQmJihkLnBvc2l0aW9uJiYodGhpcy5wb3NpdGlvbj1kLnBvc2l0aW9uKSxkLnRvdWNoR2VzdHVyZXMmJih0aGlzLnRvdWNoR2VzdHVyZXM9ZC50b3VjaEdlc3R1cmVzKSksYy5jaGFuZ2UucGlwZShJZSh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fb3ZlcmxheVJlZiYmdGhpcy5fdXBkYXRlUG9zaXRpb24odGhpcy5fb3ZlcmxheVJlZil9KSksaS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PntlLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5faGFuZGxlS2V5ZG93bil9KSl9Z2V0IHBvc2l0aW9uKCl7cmV0dXJuIHRoaXMuX3Bvc2l0aW9ufXNldCBwb3NpdGlvbih0KXt2YXIgZTt0IT09dGhpcy5fcG9zaXRpb24mJih0aGlzLl9wb3NpdGlvbj10LHRoaXMuX292ZXJsYXlSZWYmJih0aGlzLl91cGRhdGVQb3NpdGlvbih0aGlzLl9vdmVybGF5UmVmKSxudWxsPT09KGU9dGhpcy5fdG9vbHRpcEluc3RhbmNlKXx8dm9pZCAwPT09ZXx8ZS5zaG93KDApLHRoaXMuX292ZXJsYXlSZWYudXBkYXRlUG9zaXRpb24oKSkpfWdldCBkaXNhYmxlZCgpe3JldHVybiB0aGlzLl9kaXNhYmxlZH1zZXQgZGlzYWJsZWQodCl7dGhpcy5fZGlzYWJsZWQ9eXoodCksdGhpcy5fZGlzYWJsZWQ/dGhpcy5oaWRlKDApOnRoaXMuX3NldHVwUG9pbnRlckVudGVyRXZlbnRzSWZOZWVkZWQoKX1nZXQgbWVzc2FnZSgpe3JldHVybiB0aGlzLl9tZXNzYWdlfXNldCBtZXNzYWdlKHQpe3RoaXMuX2FyaWFEZXNjcmliZXIucmVtb3ZlRGVzY3JpcHRpb24odGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LHRoaXMuX21lc3NhZ2UsInRvb2x0aXAiKSx0aGlzLl9tZXNzYWdlPW51bGwhPXQ/U3RyaW5nKHQpLnRyaW0oKToiIiwhdGhpcy5fbWVzc2FnZSYmdGhpcy5faXNUb29sdGlwVmlzaWJsZSgpP3RoaXMuaGlkZSgwKToodGhpcy5fc2V0dXBQb2ludGVyRW50ZXJFdmVudHNJZk5lZWRlZCgpLHRoaXMuX3VwZGF0ZVRvb2x0aXBNZXNzYWdlKCksdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oKCgpPT57dGhpcy5fYXJpYURlc2NyaWJlci5kZXNjcmliZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsdGhpcy5tZXNzYWdlLCJ0b29sdGlwIil9KSl9KSkpfWdldCB0b29sdGlwQ2xhc3MoKXtyZXR1cm4gdGhpcy5fdG9vbHRpcENsYXNzfXNldCB0b29sdGlwQ2xhc3ModCl7dGhpcy5fdG9vbHRpcENsYXNzPXQsdGhpcy5fdG9vbHRpcEluc3RhbmNlJiZ0aGlzLl9zZXRUb29sdGlwQ2xhc3ModGhpcy5fdG9vbHRpcENsYXNzKX1uZ0FmdGVyVmlld0luaXQoKXt0aGlzLl92aWV3SW5pdGlhbGl6ZWQ9ITAsdGhpcy5fc2V0dXBQb2ludGVyRW50ZXJFdmVudHNJZk5lZWRlZCgpLHRoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHRoaXMuX2VsZW1lbnRSZWYpLnBpcGUoSWUodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCh0PT57dD8ia2V5Ym9hcmQiPT09dCYmdGhpcy5fbmdab25lLnJ1bigoKCk9PnRoaXMuc2hvdygpKSk6dGhpcy5fbmdab25lLnJ1bigoKCk9PnRoaXMuaGlkZSgwKSkpfSkpfW5nT25EZXN0cm95KCl7Y29uc3QgdD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7Y2xlYXJUaW1lb3V0KHRoaXMuX3RvdWNoc3RhcnRUaW1lb3V0KSx0aGlzLl9vdmVybGF5UmVmJiYodGhpcy5fb3ZlcmxheVJlZi5kaXNwb3NlKCksdGhpcy5fdG9vbHRpcEluc3RhbmNlPW51bGwpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5faGFuZGxlS2V5ZG93biksdGhpcy5fcGFzc2l2ZUxpc3RlbmVycy5mb3JFYWNoKCgoW2Usbl0pPT57dC5yZW1vdmVFdmVudExpc3RlbmVyKGUsbixFUSl9KSksdGhpcy5fcGFzc2l2ZUxpc3RlbmVycy5sZW5ndGg9MCx0aGlzLl9kZXN0cm95ZWQubmV4dCgpLHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpLHRoaXMuX2FyaWFEZXNjcmliZXIucmVtb3ZlRGVzY3JpcHRpb24odCx0aGlzLm1lc3NhZ2UsInRvb2x0aXAiKSx0aGlzLl9mb2N1c01vbml0b3Iuc3RvcE1vbml0b3JpbmcodCl9c2hvdyh0PXRoaXMuc2hvd0RlbGF5KXtpZih0aGlzLmRpc2FibGVkfHwhdGhpcy5tZXNzYWdlfHx0aGlzLl9pc1Rvb2x0aXBWaXNpYmxlKCkmJiF0aGlzLl90b29sdGlwSW5zdGFuY2UuX3Nob3dUaW1lb3V0SWQmJiF0aGlzLl90b29sdGlwSW5zdGFuY2UuX2hpZGVUaW1lb3V0SWQpcmV0dXJuO2NvbnN0IGU9dGhpcy5fY3JlYXRlT3ZlcmxheSgpO3RoaXMuX2RldGFjaCgpLHRoaXMuX3BvcnRhbD10aGlzLl9wb3J0YWx8fG5ldyB2Rih0aGlzLl90b29sdGlwQ29tcG9uZW50LHRoaXMuX3ZpZXdDb250YWluZXJSZWYpLHRoaXMuX3Rvb2x0aXBJbnN0YW5jZT1lLmF0dGFjaCh0aGlzLl9wb3J0YWwpLmluc3RhbmNlLHRoaXMuX3Rvb2x0aXBJbnN0YW5jZS5hZnRlckhpZGRlbigpLnBpcGUoSWUodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgoKT0+dGhpcy5fZGV0YWNoKCkpKSx0aGlzLl9zZXRUb29sdGlwQ2xhc3ModGhpcy5fdG9vbHRpcENsYXNzKSx0aGlzLl91cGRhdGVUb29sdGlwTWVzc2FnZSgpLHRoaXMuX3Rvb2x0aXBJbnN0YW5jZS5zaG93KHQpfWhpZGUodD10aGlzLmhpZGVEZWxheSl7dGhpcy5fdG9vbHRpcEluc3RhbmNlJiZ0aGlzLl90b29sdGlwSW5zdGFuY2UuaGlkZSh0KX10b2dnbGUoKXt0aGlzLl9pc1Rvb2x0aXBWaXNpYmxlKCk/dGhpcy5oaWRlKCk6dGhpcy5zaG93KCl9X2lzVG9vbHRpcFZpc2libGUoKXtyZXR1cm4hIXRoaXMuX3Rvb2x0aXBJbnN0YW5jZSYmdGhpcy5fdG9vbHRpcEluc3RhbmNlLmlzVmlzaWJsZSgpfV9jcmVhdGVPdmVybGF5KCl7aWYodGhpcy5fb3ZlcmxheVJlZilyZXR1cm4gdGhpcy5fb3ZlcmxheVJlZjtjb25zdCB0PXRoaXMuX3Njcm9sbERpc3BhdGNoZXIuZ2V0QW5jZXN0b3JTY3JvbGxDb250YWluZXJzKHRoaXMuX2VsZW1lbnRSZWYpLGU9dGhpcy5fb3ZlcmxheS5wb3NpdGlvbigpLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy5fZWxlbWVudFJlZikud2l0aFRyYW5zZm9ybU9yaWdpbk9uKGAuJHt0aGlzLl9jc3NDbGFzc1ByZWZpeH0tdG9vbHRpcGApLndpdGhGbGV4aWJsZURpbWVuc2lvbnMoITEpLndpdGhWaWV3cG9ydE1hcmdpbih0aGlzLl92aWV3cG9ydE1hcmdpbikud2l0aFNjcm9sbGFibGVDb250YWluZXJzKHQpO3JldHVybiBlLnBvc2l0aW9uQ2hhbmdlcy5waXBlKEllKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgodD0+e3RoaXMuX3VwZGF0ZUN1cnJlbnRQb3NpdGlvbkNsYXNzKHQuY29ubmVjdGlvblBhaXIpLHRoaXMuX3Rvb2x0aXBJbnN0YW5jZSYmdC5zY3JvbGxhYmxlVmlld1Byb3BlcnRpZXMuaXNPdmVybGF5Q2xpcHBlZCYmdGhpcy5fdG9vbHRpcEluc3RhbmNlLmlzVmlzaWJsZSgpJiZ0aGlzLl9uZ1pvbmUucnVuKCgoKT0+dGhpcy5oaWRlKDApKSl9KSksdGhpcy5fb3ZlcmxheVJlZj10aGlzLl9vdmVybGF5LmNyZWF0ZSh7ZGlyZWN0aW9uOnRoaXMuX2Rpcixwb3NpdGlvblN0cmF0ZWd5OmUscGFuZWxDbGFzczpgJHt0aGlzLl9jc3NDbGFzc1ByZWZpeH0tdG9vbHRpcC1wYW5lbGAsc2Nyb2xsU3RyYXRlZ3k6dGhpcy5fc2Nyb2xsU3RyYXRlZ3koKX0pLHRoaXMuX3VwZGF0ZVBvc2l0aW9uKHRoaXMuX292ZXJsYXlSZWYpLHRoaXMuX292ZXJsYXlSZWYuZGV0YWNobWVudHMoKS5waXBlKEllKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoKCk9PnRoaXMuX2RldGFjaCgpKSksdGhpcy5fb3ZlcmxheVJlZi5vdXRzaWRlUG9pbnRlckV2ZW50cygpLnBpcGUoSWUodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgoKT0+e3ZhciB0O3JldHVybiBudWxsPT09KHQ9dGhpcy5fdG9vbHRpcEluc3RhbmNlKXx8dm9pZCAwPT09dD92b2lkIDA6dC5faGFuZGxlQm9keUludGVyYWN0aW9uKCl9KSksdGhpcy5fb3ZlcmxheVJlZn1fZGV0YWNoKCl7dGhpcy5fb3ZlcmxheVJlZiYmdGhpcy5fb3ZlcmxheVJlZi5oYXNBdHRhY2hlZCgpJiZ0aGlzLl9vdmVybGF5UmVmLmRldGFjaCgpLHRoaXMuX3Rvb2x0aXBJbnN0YW5jZT1udWxsfV91cGRhdGVQb3NpdGlvbih0KXtjb25zdCBlPXQuZ2V0Q29uZmlnKCkucG9zaXRpb25TdHJhdGVneSxuPXRoaXMuX2dldE9yaWdpbigpLG89dGhpcy5fZ2V0T3ZlcmxheVBvc2l0aW9uKCk7ZS53aXRoUG9zaXRpb25zKFt0aGlzLl9hZGRPZmZzZXQoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG4ubWFpbiksby5tYWluKSksdGhpcy5fYWRkT2Zmc2V0KE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuLmZhbGxiYWNrKSxvLmZhbGxiYWNrKSldKX1fYWRkT2Zmc2V0KHQpe3JldHVybiB0fV9nZXRPcmlnaW4oKXtjb25zdCB0PSF0aGlzLl9kaXJ8fCJsdHIiPT10aGlzLl9kaXIudmFsdWUsZT10aGlzLnBvc2l0aW9uO2xldCBuO2lmKCJhYm92ZSI9PWV8fCJiZWxvdyI9PWUpbj17b3JpZ2luWDoiY2VudGVyIixvcmlnaW5ZOiJhYm92ZSI9PWU/InRvcCI6ImJvdHRvbSJ9O2Vsc2UgaWYoImJlZm9yZSI9PWV8fCJsZWZ0Ij09ZSYmdHx8InJpZ2h0Ij09ZSYmIXQpbj17b3JpZ2luWDoic3RhcnQiLG9yaWdpblk6ImNlbnRlciJ9O2Vsc2UgaWYoImFmdGVyIj09ZXx8InJpZ2h0Ij09ZSYmdHx8ImxlZnQiPT1lJiYhdCluPXtvcmlnaW5YOiJlbmQiLG9yaWdpblk6ImNlbnRlciJ9O2Vsc2UgaWYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSl0aHJvdyBSUShlKTtjb25zdHt4Om8seTppfT10aGlzLl9pbnZlcnRQb3NpdGlvbihuLm9yaWdpblgsbi5vcmlnaW5ZKTtyZXR1cm57bWFpbjpuLGZhbGxiYWNrOntvcmlnaW5YOm8sb3JpZ2luWTppfX19X2dldE92ZXJsYXlQb3NpdGlvbigpe2NvbnN0IHQ9IXRoaXMuX2Rpcnx8Imx0ciI9PXRoaXMuX2Rpci52YWx1ZSxlPXRoaXMucG9zaXRpb247bGV0IG47aWYoImFib3ZlIj09ZSluPXtvdmVybGF5WDoiY2VudGVyIixvdmVybGF5WToiYm90dG9tIn07ZWxzZSBpZigiYmVsb3ciPT1lKW49e292ZXJsYXlYOiJjZW50ZXIiLG92ZXJsYXlZOiJ0b3AifTtlbHNlIGlmKCJiZWZvcmUiPT1lfHwibGVmdCI9PWUmJnR8fCJyaWdodCI9PWUmJiF0KW49e292ZXJsYXlYOiJlbmQiLG92ZXJsYXlZOiJjZW50ZXIifTtlbHNlIGlmKCJhZnRlciI9PWV8fCJyaWdodCI9PWUmJnR8fCJsZWZ0Ij09ZSYmIXQpbj17b3ZlcmxheVg6InN0YXJ0IixvdmVybGF5WToiY2VudGVyIn07ZWxzZSBpZigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKXRocm93IFJRKGUpO2NvbnN0e3g6byx5Oml9PXRoaXMuX2ludmVydFBvc2l0aW9uKG4ub3ZlcmxheVgsbi5vdmVybGF5WSk7cmV0dXJue21haW46bixmYWxsYmFjazp7b3ZlcmxheVg6byxvdmVybGF5WTppfX19X3VwZGF0ZVRvb2x0aXBNZXNzYWdlKCl7dGhpcy5fdG9vbHRpcEluc3RhbmNlJiYodGhpcy5fdG9vbHRpcEluc3RhbmNlLm1lc3NhZ2U9dGhpcy5tZXNzYWdlLHRoaXMuX3Rvb2x0aXBJbnN0YW5jZS5fbWFya0ZvckNoZWNrKCksdGhpcy5fbmdab25lLm9uTWljcm90YXNrRW1wdHkucGlwZShiZSgxKSxJZSh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fdG9vbHRpcEluc3RhbmNlJiZ0aGlzLl9vdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCl9KSkpfV9zZXRUb29sdGlwQ2xhc3ModCl7dGhpcy5fdG9vbHRpcEluc3RhbmNlJiYodGhpcy5fdG9vbHRpcEluc3RhbmNlLnRvb2x0aXBDbGFzcz10LHRoaXMuX3Rvb2x0aXBJbnN0YW5jZS5fbWFya0ZvckNoZWNrKCkpfV9pbnZlcnRQb3NpdGlvbih0LGUpe3JldHVybiJhYm92ZSI9PT10aGlzLnBvc2l0aW9ufHwiYmVsb3ciPT09dGhpcy5wb3NpdGlvbj8idG9wIj09PWU/ZT0iYm90dG9tIjoiYm90dG9tIj09PWUmJihlPSJ0b3AiKToiZW5kIj09PXQ/dD0ic3RhcnQiOiJzdGFydCI9PT10JiYodD0iZW5kIikse3g6dCx5OmV9fV91cGRhdGVDdXJyZW50UG9zaXRpb25DbGFzcyh0KXtjb25zdHtvdmVybGF5WTplLG9yaWdpblg6bixvcmlnaW5ZOm99PXQ7bGV0IGk7aWYoaT0iY2VudGVyIj09PWU/dGhpcy5fZGlyJiYicnRsIj09PXRoaXMuX2Rpci52YWx1ZT8iZW5kIj09PW4/ImxlZnQiOiJyaWdodCI6InN0YXJ0Ij09PW4/ImxlZnQiOiJyaWdodCI6ImJvdHRvbSI9PT1lJiYidG9wIj09PW8/ImFib3ZlIjoiYmVsb3ciLGkhPT10aGlzLl9jdXJyZW50UG9zaXRpb24pe2NvbnN0IHQ9dGhpcy5fb3ZlcmxheVJlZjtpZih0KXtjb25zdCBlPWAke3RoaXMuX2Nzc0NsYXNzUHJlZml4fS10b29sdGlwLXBhbmVsLWA7dC5yZW1vdmVQYW5lbENsYXNzKGUrdGhpcy5fY3VycmVudFBvc2l0aW9uKSx0LmFkZFBhbmVsQ2xhc3MoZStpKX10aGlzLl9jdXJyZW50UG9zaXRpb249aX19X3NldHVwUG9pbnRlckVudGVyRXZlbnRzSWZOZWVkZWQoKXshdGhpcy5fZGlzYWJsZWQmJnRoaXMubWVzc2FnZSYmdGhpcy5fdmlld0luaXRpYWxpemVkJiYhdGhpcy5fcGFzc2l2ZUxpc3RlbmVycy5sZW5ndGgmJih0aGlzLl9wbGF0Zm9ybVN1cHBvcnRzTW91c2VFdmVudHMoKT90aGlzLl9wYXNzaXZlTGlzdGVuZXJzLnB1c2goWyJtb3VzZWVudGVyIiwoKT0+e3RoaXMuX3NldHVwUG9pbnRlckV4aXRFdmVudHNJZk5lZWRlZCgpLHRoaXMuc2hvdygpfV0pOiJvZmYiIT09dGhpcy50b3VjaEdlc3R1cmVzJiYodGhpcy5fZGlzYWJsZU5hdGl2ZUdlc3R1cmVzSWZOZWNlc3NhcnkoKSx0aGlzLl9wYXNzaXZlTGlzdGVuZXJzLnB1c2goWyJ0b3VjaHN0YXJ0IiwoKT0+e3RoaXMuX3NldHVwUG9pbnRlckV4aXRFdmVudHNJZk5lZWRlZCgpLGNsZWFyVGltZW91dCh0aGlzLl90b3VjaHN0YXJ0VGltZW91dCksdGhpcy5fdG91Y2hzdGFydFRpbWVvdXQ9c2V0VGltZW91dCgoKCk9PnRoaXMuc2hvdygpKSw1MDApfV0pKSx0aGlzLl9hZGRMaXN0ZW5lcnModGhpcy5fcGFzc2l2ZUxpc3RlbmVycykpfV9zZXR1cFBvaW50ZXJFeGl0RXZlbnRzSWZOZWVkZWQoKXtpZih0aGlzLl9wb2ludGVyRXhpdEV2ZW50c0luaXRpYWxpemVkKXJldHVybjt0aGlzLl9wb2ludGVyRXhpdEV2ZW50c0luaXRpYWxpemVkPSEwO2NvbnN0IHQ9W107aWYodGhpcy5fcGxhdGZvcm1TdXBwb3J0c01vdXNlRXZlbnRzKCkpdC5wdXNoKFsibW91c2VsZWF2ZSIsKCk9PnRoaXMuaGlkZSgpXSxbIndoZWVsIix0PT50aGlzLl93aGVlbExpc3RlbmVyKHQpXSk7ZWxzZSBpZigib2ZmIiE9PXRoaXMudG91Y2hHZXN0dXJlcyl7dGhpcy5fZGlzYWJsZU5hdGl2ZUdlc3R1cmVzSWZOZWNlc3NhcnkoKTtjb25zdCBlPSgpPT57Y2xlYXJUaW1lb3V0KHRoaXMuX3RvdWNoc3RhcnRUaW1lb3V0KSx0aGlzLmhpZGUodGhpcy5fZGVmYXVsdE9wdGlvbnMudG91Y2hlbmRIaWRlRGVsYXkpfTt0LnB1c2goWyJ0b3VjaGVuZCIsZV0sWyJ0b3VjaGNhbmNlbCIsZV0pfXRoaXMuX2FkZExpc3RlbmVycyh0KSx0aGlzLl9wYXNzaXZlTGlzdGVuZXJzLnB1c2goLi4udCl9X2FkZExpc3RlbmVycyh0KXt0LmZvckVhY2goKChbdCxlXSk9Pnt0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0LGUsRVEpfSkpfV9wbGF0Zm9ybVN1cHBvcnRzTW91c2VFdmVudHMoKXtyZXR1cm4hdGhpcy5fcGxhdGZvcm0uSU9TJiYhdGhpcy5fcGxhdGZvcm0uQU5EUk9JRH1fd2hlZWxMaXN0ZW5lcih0KXtpZih0aGlzLl9pc1Rvb2x0aXBWaXNpYmxlKCkpe2NvbnN0IGU9dGhpcy5fZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh0LmNsaWVudFgsdC5jbGllbnRZKSxuPXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtlPT09bnx8bi5jb250YWlucyhlKXx8dGhpcy5oaWRlKCl9fV9kaXNhYmxlTmF0aXZlR2VzdHVyZXNJZk5lY2Vzc2FyeSgpe2NvbnN0IHQ9dGhpcy50b3VjaEdlc3R1cmVzO2lmKCJvZmYiIT09dCl7Y29uc3QgZT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsbj1lLnN0eWxlOygib24iPT09dHx8IklOUFVUIiE9PWUubm9kZU5hbWUmJiJURVhUQVJFQSIhPT1lLm5vZGVOYW1lKSYmKG4udXNlclNlbGVjdD1uLm1zVXNlclNlbGVjdD1uLndlYmtpdFVzZXJTZWxlY3Q9bi5Nb3pVc2VyU2VsZWN0PSJub25lIiksIm9uIiE9PXQmJmUuZHJhZ2dhYmxlfHwobi53ZWJraXRVc2VyRHJhZz0ibm9uZSIpLG4udG91Y2hBY3Rpb249Im5vbmUiLG4ud2Via2l0VGFwSGlnaGxpZ2h0Q29sb3I9InRyYW5zcGFyZW50In19fUhRLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxIUSkoU20ocEwpLFNtKGhnKSxTbShwRiksU20oZWgpLFNtKGFfKSxTbSh3eiksU20oS3opLFNtKFNJKSxTbSh2b2lkIDApLFNtKEhJKSxTbSh2b2lkIDApLFNtKFpfKSl9LEhRLsm1ZGlyPWxvKHt0eXBlOkhRLGlucHV0czp7c2hvd0RlbGF5OlsibWF0VG9vbHRpcFNob3dEZWxheSIsInNob3dEZWxheSJdLGhpZGVEZWxheTpbIm1hdFRvb2x0aXBIaWRlRGVsYXkiLCJoaWRlRGVsYXkiXSx0b3VjaEdlc3R1cmVzOlsibWF0VG9vbHRpcFRvdWNoR2VzdHVyZXMiLCJ0b3VjaEdlc3R1cmVzIl0scG9zaXRpb246WyJtYXRUb29sdGlwUG9zaXRpb24iLCJwb3NpdGlvbiJdLGRpc2FibGVkOlsibWF0VG9vbHRpcERpc2FibGVkIiwiZGlzYWJsZWQiXSxtZXNzYWdlOlsibWF0VG9vbHRpcCIsIm1lc3NhZ2UiXSx0b29sdGlwQ2xhc3M6WyJtYXRUb29sdGlwQ2xhc3MiLCJ0b29sdGlwQ2xhc3MiXX19KSxIUS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnBMfSx7dHlwZTpoZ30se3R5cGU6cEZ9LHt0eXBlOmVofSx7dHlwZTphX30se3R5cGU6d3p9LHt0eXBlOkt6fSx7dHlwZTpTSX0se3R5cGU6dm9pZCAwfSx7dHlwZTpISX0se3R5cGU6dm9pZCAwfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XSxIUS5wcm9wRGVjb3JhdG9ycz17cG9zaXRpb246W3t0eXBlOnh5LGFyZ3M6WyJtYXRUb29sdGlwUG9zaXRpb24iXX1dLGRpc2FibGVkOlt7dHlwZTp4eSxhcmdzOlsibWF0VG9vbHRpcERpc2FibGVkIl19XSxzaG93RGVsYXk6W3t0eXBlOnh5LGFyZ3M6WyJtYXRUb29sdGlwU2hvd0RlbGF5Il19XSxoaWRlRGVsYXk6W3t0eXBlOnh5LGFyZ3M6WyJtYXRUb29sdGlwSGlkZURlbGF5Il19XSx0b3VjaEdlc3R1cmVzOlt7dHlwZTp4eSxhcmdzOlsibWF0VG9vbHRpcFRvdWNoR2VzdHVyZXMiXX1dLG1lc3NhZ2U6W3t0eXBlOnh5LGFyZ3M6WyJtYXRUb29sdGlwIl19XSx0b29sdGlwQ2xhc3M6W3t0eXBlOnh5LGFyZ3M6WyJtYXRUb29sdGlwQ2xhc3MiXX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEhRLFt7dHlwZTpDeX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpwTH0se3R5cGU6aGd9LHt0eXBlOnBGfSx7dHlwZTplaH0se3R5cGU6YV99LHt0eXBlOnd6fSx7dHlwZTpLen0se3R5cGU6U0l9LHt0eXBlOnZvaWQgMH0se3R5cGU6SEl9LHt0eXBlOnZvaWQgMH0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV19KSx7c2hvd0RlbGF5Olt7dHlwZTp4eSxhcmdzOlsibWF0VG9vbHRpcFNob3dEZWxheSJdfV0saGlkZURlbGF5Olt7dHlwZTp4eSxhcmdzOlsibWF0VG9vbHRpcEhpZGVEZWxheSJdfV0sdG91Y2hHZXN0dXJlczpbe3R5cGU6eHksYXJnczpbIm1hdFRvb2x0aXBUb3VjaEdlc3R1cmVzIl19XSxwb3NpdGlvbjpbe3R5cGU6eHksYXJnczpbIm1hdFRvb2x0aXBQb3NpdGlvbiJdfV0sZGlzYWJsZWQ6W3t0eXBlOnh5LGFyZ3M6WyJtYXRUb29sdGlwRGlzYWJsZWQiXX1dLG1lc3NhZ2U6W3t0eXBlOnh5LGFyZ3M6WyJtYXRUb29sdGlwIl19XSx0b29sdGlwQ2xhc3M6W3t0eXBlOnh5LGFyZ3M6WyJtYXRUb29sdGlwQ2xhc3MiXX1dfSk7Y2xhc3MgRlEgZXh0ZW5kcyBIUXtjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyLHMsbCxjLGQscCl7c3VwZXIodCxlLG4sbyxpLGEscixzLGwsYyxkLHApLHRoaXMuX3Rvb2x0aXBDb21wb25lbnQ9QlF9fUZRLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxGUSkoU20ocEwpLFNtKGhnKSxTbShwRiksU20oZWgpLFNtKGFfKSxTbSh3eiksU20oS3opLFNtKFNJKSxTbShBUSksU20oSEksOCksU20oelEsOCksU20oWl8pKX0sRlEuybVkaXI9bG8oe3R5cGU6RlEsc2VsZWN0b3JzOltbIiIsIm1hdFRvb2x0aXAiLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtdG9vbHRpcC10cmlnZ2VyIl0sZXhwb3J0QXM6WyJtYXRUb29sdGlwIl0sZmVhdHVyZXM6W3hwXX0pLEZRLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6cEx9LHt0eXBlOmhnfSx7dHlwZTpwRn0se3R5cGU6ZWh9LHt0eXBlOmFffSx7dHlwZTp3en0se3R5cGU6S3p9LHt0eXBlOlNJfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbQVFdfV19LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbelFdfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRlEsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW21hdFRvb2x0aXBdIixleHBvcnRBczoibWF0VG9vbHRpcCIsaG9zdDp7Y2xhc3M6Im1hdC10b29sdGlwLXRyaWdnZXIifX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnBMfSx7dHlwZTpoZ30se3R5cGU6cEZ9LHt0eXBlOmVofSx7dHlwZTphX30se3R5cGU6d3p9LHt0eXBlOkt6fSx7dHlwZTpTSX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W0FRXX1dfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3pRXX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XX0pLG51bGwpO2NsYXNzIExRe2NvbnN0cnVjdG9yKHQpe3RoaXMuX2NoYW5nZURldGVjdG9yUmVmPXQsdGhpcy5fdmlzaWJpbGl0eT0iaW5pdGlhbCIsdGhpcy5fY2xvc2VPbkludGVyYWN0aW9uPSExLHRoaXMuX29uSGlkZT1uZXcgSX1zaG93KHQpe2NsZWFyVGltZW91dCh0aGlzLl9oaWRlVGltZW91dElkKSx0aGlzLl9jbG9zZU9uSW50ZXJhY3Rpb249ITAsdGhpcy5fc2hvd1RpbWVvdXRJZD1zZXRUaW1lb3V0KCgoKT0+e3RoaXMuX3Zpc2liaWxpdHk9InZpc2libGUiLHRoaXMuX3Nob3dUaW1lb3V0SWQ9dm9pZCAwLHRoaXMuX29uU2hvdygpLHRoaXMuX21hcmtGb3JDaGVjaygpfSksdCl9aGlkZSh0KXtjbGVhclRpbWVvdXQodGhpcy5fc2hvd1RpbWVvdXRJZCksdGhpcy5faGlkZVRpbWVvdXRJZD1zZXRUaW1lb3V0KCgoKT0+e3RoaXMuX3Zpc2liaWxpdHk9ImhpZGRlbiIsdGhpcy5faGlkZVRpbWVvdXRJZD12b2lkIDAsdGhpcy5fbWFya0ZvckNoZWNrKCl9KSx0KX1hZnRlckhpZGRlbigpe3JldHVybiB0aGlzLl9vbkhpZGV9aXNWaXNpYmxlKCl7cmV0dXJuInZpc2libGUiPT09dGhpcy5fdmlzaWJpbGl0eX1uZ09uRGVzdHJveSgpe2NsZWFyVGltZW91dCh0aGlzLl9zaG93VGltZW91dElkKSxjbGVhclRpbWVvdXQodGhpcy5faGlkZVRpbWVvdXRJZCksdGhpcy5fb25IaWRlLmNvbXBsZXRlKCl9X2FuaW1hdGlvblN0YXJ0KCl7dGhpcy5fY2xvc2VPbkludGVyYWN0aW9uPSExfV9hbmltYXRpb25Eb25lKHQpe2NvbnN0IGU9dC50b1N0YXRlOyJoaWRkZW4iIT09ZXx8dGhpcy5pc1Zpc2libGUoKXx8dGhpcy5fb25IaWRlLm5leHQoKSwidmlzaWJsZSIhPT1lJiYiaGlkZGVuIiE9PWV8fCh0aGlzLl9jbG9zZU9uSW50ZXJhY3Rpb249ITApfV9oYW5kbGVCb2R5SW50ZXJhY3Rpb24oKXt0aGlzLl9jbG9zZU9uSW50ZXJhY3Rpb24mJnRoaXMuaGlkZSgwKX1fbWFya0ZvckNoZWNrKCl7dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9X29uU2hvdygpe319TFEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fExRKShTbShVZykpfSxMUS7JtWRpcj1sbyh7dHlwZTpMUX0pLExRLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6VWd9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKExRLFt7dHlwZTpDeX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpVZ31dfSksbnVsbCk7Y2xhc3MgQlEgZXh0ZW5kcyBMUXtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQpLHRoaXMuX2JyZWFrcG9pbnRPYnNlcnZlcj1lLHRoaXMuX2lzSGFuZHNldD10aGlzLl9icmVha3BvaW50T2JzZXJ2ZXIub2JzZXJ2ZSgiKG1heC13aWR0aDogNTk5Ljk4cHgpIGFuZCAob3JpZW50YXRpb246IHBvcnRyYWl0KSwgKG1heC13aWR0aDogOTU5Ljk4cHgpIGFuZCAob3JpZW50YXRpb246IGxhbmRzY2FwZSkiKX19QlEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEJRKShTbShVZyksU20oUEwpKX0sQlEuybVjbXA9dG8oe3R5cGU6QlEsc2VsZWN0b3JzOltbIm1hdC10b29sdGlwLWNvbXBvbmVudCJdXSxob3N0QXR0cnM6WyJhcmlhLWhpZGRlbiIsInRydWUiXSxob3N0VmFyczoyLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZkdSgiem9vbSIsInZpc2libGUiPT09bi5fdmlzaWJpbGl0eT8xOm51bGwpfSxmZWF0dXJlczpbeHBdLGRlY2xzOjMsdmFyczo3LGNvbnN0czpbWzEsIm1hdC10b29sdGlwIiwzLCJuZ0NsYXNzIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihSbSgwLCJkaXYiLDApLFZtKCJAc3RhdGUuc3RhcnQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX2FuaW1hdGlvblN0YXJ0KCl9KSkoIkBzdGF0ZS5kb25lIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5fYW5pbWF0aW9uRG9uZShlKX0pKSxBaCgxLCJhc3luYyIpLGt1KDIpLEFtKCkpLDImZSl7bGV0IHQ7cHUoIm1hdC10b29sdGlwLWhhbmRzZXQiLG51bGw9PSh0PVRoKDEsNSxuLl9pc0hhbmRzZXQpKT9udWxsOnQubWF0Y2hlcyksRG0oIm5nQ2xhc3MiLG4udG9vbHRpcENsYXNzKSgiQHN0YXRlIixuLl92aXNpYmlsaXR5KSxyYygyKSxTdShuLm1lc3NhZ2UpfX0sZGlyZWN0aXZlczpbYU1dLHBpcGVzOlt3TV0sc3R5bGVzOlsiLm1hdC10b29sdGlwLXBhbmVse3BvaW50ZXItZXZlbnRzOm5vbmUgIWltcG9ydGFudH0ubWF0LXRvb2x0aXB7Y29sb3I6I2ZmZjtib3JkZXItcmFkaXVzOjRweDttYXJnaW46MTRweDttYXgtd2lkdGg6MjUwcHg7cGFkZGluZy1sZWZ0OjhweDtwYWRkaW5nLXJpZ2h0OjhweDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpc30uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdG9vbHRpcHtvdXRsaW5lOnNvbGlkIDFweH0ubWF0LXRvb2x0aXAtaGFuZHNldHttYXJnaW46MjRweDtwYWRkaW5nLWxlZnQ6MTZweDtwYWRkaW5nLXJpZ2h0OjE2cHh9XG4iXSxlbmNhcHN1bGF0aW9uOjIsZGF0YTp7YW5pbWF0aW9uOltEUS50b29sdGlwU3RhdGVdfSxjaGFuZ2VEZXRlY3Rpb246MH0pLEJRLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6VWd9LHt0eXBlOlBMfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChCUSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtYXQtdG9vbHRpcC1jb21wb25lbnQiLHRlbXBsYXRlOic8ZGl2IGNsYXNzPSJtYXQtdG9vbHRpcCJcbiAgICAgW25nQ2xhc3NdPSJ0b29sdGlwQ2xhc3MiXG4gICAgIFtjbGFzcy5tYXQtdG9vbHRpcC1oYW5kc2V0XT0iKF9pc0hhbmRzZXQgfCBhc3luYyk/Lm1hdGNoZXMiXG4gICAgIFtAc3RhdGVdPSJfdmlzaWJpbGl0eSJcbiAgICAgKEBzdGF0ZS5zdGFydCk9Il9hbmltYXRpb25TdGFydCgpIlxuICAgICAoQHN0YXRlLmRvbmUpPSJfYW5pbWF0aW9uRG9uZSgkZXZlbnQpIj57e21lc3NhZ2V9fTwvZGl2PlxuJyxlbmNhcHN1bGF0aW9uOkhuLk5vbmUsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaCxhbmltYXRpb25zOltEUS50b29sdGlwU3RhdGVdLGhvc3Q6eyJbc3R5bGUuem9vbV0iOidfdmlzaWJpbGl0eSA9PT0gInZpc2libGUiID8gMSA6IG51bGwnLCJhcmlhLWhpZGRlbiI6InRydWUifSxzdHlsZXM6WyIubWF0LXRvb2x0aXAtcGFuZWx7cG9pbnRlci1ldmVudHM6bm9uZSAhaW1wb3J0YW50fS5tYXQtdG9vbHRpcHtjb2xvcjojZmZmO2JvcmRlci1yYWRpdXM6NHB4O21hcmdpbjoxNHB4O21heC13aWR0aDoyNTBweDtwYWRkaW5nLWxlZnQ6OHB4O3BhZGRpbmctcmlnaHQ6OHB4O292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10b29sdGlwe291dGxpbmU6c29saWQgMXB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0e21hcmdpbjoyNHB4O3BhZGRpbmctbGVmdDoxNnB4O3BhZGRpbmctcmlnaHQ6MTZweH1cbiJdfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6VWd9LHt0eXBlOlBMfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIFZRe31mdW5jdGlvbiBqUSh0LGUpe2lmKDEmdCYmKFJtKDAsIm1hdC1vcHRpb24iLDE5KSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQ7RG0oInZhbHVlIix0KSxyYygxKSxEdSgiICIsdCwiICIpfX1mdW5jdGlvbiBVUSh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsIm1hdC1mb3JtLWZpZWxkIiwxNiksUm0oMSwibWF0LXNlbGVjdCIsMTcpLFZtKCJzZWxlY3Rpb25DaGFuZ2UiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgyKS5fY2hhbmdlUGFnZVNpemUobi52YWx1ZSl9KSksUXAoMixqUSwyLDIsIm1hdC1vcHRpb24iLDE4KSxBbSgpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKDIpO0RtKCJhcHBlYXJhbmNlIix0Ll9mb3JtRmllbGRBcHBlYXJhbmNlKSgiY29sb3IiLHQuY29sb3IpLHJjKDEpLERtKCJ2YWx1ZSIsdC5wYWdlU2l6ZSkoImRpc2FibGVkIix0LmRpc2FibGVkKSgiYXJpYS1sYWJlbCIsdC5faW50bC5pdGVtc1BlclBhZ2VMYWJlbCkscmMoMSksRG0oIm5nRm9yT2YiLHQuX2Rpc3BsYXllZFBhZ2VTaXplT3B0aW9ucyl9fWZ1bmN0aW9uIEdRKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2IiwyMCksa3UoMSksQW0oKSksMiZ0KXtjb25zdCB0PVltKDIpO3JjKDEpLFN1KHQucGFnZVNpemUpfX1mdW5jdGlvbiBXUSh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsMTIpLFJtKDEsImRpdiIsMTMpLGt1KDIpLEFtKCksUXAoMyxVUSwzLDYsIm1hdC1mb3JtLWZpZWxkIiwxNCksUXAoNCxHUSwyLDEsImRpdiIsMTUpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpO3JjKDIpLER1KCIgIix0Ll9pbnRsLml0ZW1zUGVyUGFnZUxhYmVsLCIgIikscmMoMSksRG0oIm5nSWYiLHQuX2Rpc3BsYXllZFBhZ2VTaXplT3B0aW9ucy5sZW5ndGg+MSkscmMoMSksRG0oIm5nSWYiLHQuX2Rpc3BsYXllZFBhZ2VTaXplT3B0aW9ucy5sZW5ndGg8PTEpfX1mdW5jdGlvbiBZUSh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsImJ1dHRvbiIsMjEpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5maXJzdFBhZ2UoKX0pKSxxaSgpLFJtKDEsInN2ZyIsNyksVG0oMiwicGF0aCIsMjIpLEFtKCksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKTtEbSgibWF0VG9vbHRpcCIsdC5faW50bC5maXJzdFBhZ2VMYWJlbCkoIm1hdFRvb2x0aXBEaXNhYmxlZCIsdC5fcHJldmlvdXNCdXR0b25zRGlzYWJsZWQoKSkoIm1hdFRvb2x0aXBQb3NpdGlvbiIsImFib3ZlIikoImRpc2FibGVkIix0Ll9wcmV2aW91c0J1dHRvbnNEaXNhYmxlZCgpKSxqcCgiYXJpYS1sYWJlbCIsdC5faW50bC5maXJzdFBhZ2VMYWJlbCl9fWZ1bmN0aW9uIHFRKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7cWkoKSxaaSgpLFJtKDAsImJ1dHRvbiIsMjMpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5sYXN0UGFnZSgpfSkpLHFpKCksUm0oMSwic3ZnIiw3KSxUbSgyLCJwYXRoIiwyNCksQW0oKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgpO0RtKCJtYXRUb29sdGlwIix0Ll9pbnRsLmxhc3RQYWdlTGFiZWwpKCJtYXRUb29sdGlwRGlzYWJsZWQiLHQuX25leHRCdXR0b25zRGlzYWJsZWQoKSkoIm1hdFRvb2x0aXBQb3NpdGlvbiIsImFib3ZlIikoImRpc2FibGVkIix0Ll9uZXh0QnV0dG9uc0Rpc2FibGVkKCkpLGpwKCJhcmlhLWxhYmVsIix0Ll9pbnRsLmxhc3RQYWdlTGFiZWwpfX1WUS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VlEpfSxWUS7JtW1vZD1hbyh7dHlwZTpWUX0pLFZRLsm1aW5qPXZuKHtwcm92aWRlcnM6W1RRXSxpbXBvcnRzOltbTkksV00seUwsWEldLFhJLHlGXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoVlEsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltOSSxXTSx5TCxYSV0sZXhwb3J0czpbRlEsQlEsWEkseUZdLGRlY2xhcmF0aW9uczpbRlEsQlFdLGVudHJ5Q29tcG9uZW50czpbQlFdLHByb3ZpZGVyczpbVFFdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oVlEse2RlY2xhcmF0aW9uczpmdW5jdGlvbigpe3JldHVybltGUSxCUV19LGltcG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bTkksV00seUwsWEldfSxleHBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW0ZRLEJRLFhJLHlGXX19KTtjbGFzcyBaUXtjb25zdHJ1Y3Rvcigpe3RoaXMuY2hhbmdlcz1uZXcgSSx0aGlzLml0ZW1zUGVyUGFnZUxhYmVsPSJJdGVtcyBwZXIgcGFnZToiLHRoaXMubmV4dFBhZ2VMYWJlbD0iTmV4dCBwYWdlIix0aGlzLnByZXZpb3VzUGFnZUxhYmVsPSJQcmV2aW91cyBwYWdlIix0aGlzLmZpcnN0UGFnZUxhYmVsPSJGaXJzdCBwYWdlIix0aGlzLmxhc3RQYWdlTGFiZWw9Ikxhc3QgcGFnZSIsdGhpcy5nZXRSYW5nZUxhYmVsPSh0LGUsbik9PntpZigwPT1ufHwwPT1lKXJldHVybmAwIG9mICR7bn1gO2NvbnN0IG89dCplO3JldHVybmAke28rMX0g4oCTICR7bzwobj1NYXRoLm1heChuLDApKT9NYXRoLm1pbihvK2Usbik6bytlfSBvZiAke259YH19fVpRLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxaUSl9LFpRLsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIG5ldyBaUX0sdG9rZW46WlEscHJvdmlkZWRJbjoicm9vdCJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFpRLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVybltdfSksbnVsbCk7Y29uc3QgWFE9e3Byb3ZpZGU6WlEsZGVwczpbW25ldyBTcixuZXcgRXIsWlFdXSx1c2VGYWN0b3J5OmZ1bmN0aW9uIEtRKHQpe3JldHVybiB0fHxuZXcgWlF9fSxKUT1uZXcgR2EoIk1BVF9QQUdJTkFUT1JfREVGQVVMVF9PUFRJT05TIiksUVE9S0koZUgoY2xhc3N7fSkpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyAkUSBleHRlbmRzIFFRe2NvbnN0cnVjdG9yKHQsZSxuKXtpZihzdXBlcigpLHRoaXMuX2ludGw9dCx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZj1lLHRoaXMuX3BhZ2VJbmRleD0wLHRoaXMuX2xlbmd0aD0wLHRoaXMuX3BhZ2VTaXplT3B0aW9ucz1bXSx0aGlzLl9oaWRlUGFnZVNpemU9ITEsdGhpcy5fc2hvd0ZpcnN0TGFzdEJ1dHRvbnM9ITEsdGhpcy5wYWdlPW5ldyBMaCx0aGlzLl9pbnRsQ2hhbmdlcz10LmNoYW5nZXMuc3Vic2NyaWJlKCgoKT0+dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpKSxuKXtjb25zdHtwYWdlU2l6ZTp0LHBhZ2VTaXplT3B0aW9uczplLGhpZGVQYWdlU2l6ZTpvLHNob3dGaXJzdExhc3RCdXR0b25zOml9PW47bnVsbCE9dCYmKHRoaXMuX3BhZ2VTaXplPXQpLG51bGwhPWUmJih0aGlzLl9wYWdlU2l6ZU9wdGlvbnM9ZSksbnVsbCE9byYmKHRoaXMuX2hpZGVQYWdlU2l6ZT1vKSxudWxsIT1pJiYodGhpcy5fc2hvd0ZpcnN0TGFzdEJ1dHRvbnM9aSl9fWdldCBwYWdlSW5kZXgoKXtyZXR1cm4gdGhpcy5fcGFnZUluZGV4fXNldCBwYWdlSW5kZXgodCl7dGhpcy5fcGFnZUluZGV4PU1hdGgubWF4KF96KHQpLDApLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5fbGVuZ3RofXNldCBsZW5ndGgodCl7dGhpcy5fbGVuZ3RoPV96KHQpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfWdldCBwYWdlU2l6ZSgpe3JldHVybiB0aGlzLl9wYWdlU2l6ZX1zZXQgcGFnZVNpemUodCl7dGhpcy5fcGFnZVNpemU9TWF0aC5tYXgoX3oodCksMCksdGhpcy5fdXBkYXRlRGlzcGxheWVkUGFnZVNpemVPcHRpb25zKCl9Z2V0IHBhZ2VTaXplT3B0aW9ucygpe3JldHVybiB0aGlzLl9wYWdlU2l6ZU9wdGlvbnN9c2V0IHBhZ2VTaXplT3B0aW9ucyh0KXt0aGlzLl9wYWdlU2l6ZU9wdGlvbnM9KHR8fFtdKS5tYXAoKHQ9Pl96KHQpKSksdGhpcy5fdXBkYXRlRGlzcGxheWVkUGFnZVNpemVPcHRpb25zKCl9Z2V0IGhpZGVQYWdlU2l6ZSgpe3JldHVybiB0aGlzLl9oaWRlUGFnZVNpemV9c2V0IGhpZGVQYWdlU2l6ZSh0KXt0aGlzLl9oaWRlUGFnZVNpemU9eXoodCl9Z2V0IHNob3dGaXJzdExhc3RCdXR0b25zKCl7cmV0dXJuIHRoaXMuX3Nob3dGaXJzdExhc3RCdXR0b25zfXNldCBzaG93Rmlyc3RMYXN0QnV0dG9ucyh0KXt0aGlzLl9zaG93Rmlyc3RMYXN0QnV0dG9ucz15eih0KX1uZ09uSW5pdCgpe3RoaXMuX2luaXRpYWxpemVkPSEwLHRoaXMuX3VwZGF0ZURpc3BsYXllZFBhZ2VTaXplT3B0aW9ucygpLHRoaXMuX21hcmtJbml0aWFsaXplZCgpfW5nT25EZXN0cm95KCl7dGhpcy5faW50bENoYW5nZXMudW5zdWJzY3JpYmUoKX1uZXh0UGFnZSgpe2lmKCF0aGlzLmhhc05leHRQYWdlKCkpcmV0dXJuO2NvbnN0IHQ9dGhpcy5wYWdlSW5kZXg7dGhpcy5wYWdlSW5kZXgrKyx0aGlzLl9lbWl0UGFnZUV2ZW50KHQpfXByZXZpb3VzUGFnZSgpe2lmKCF0aGlzLmhhc1ByZXZpb3VzUGFnZSgpKXJldHVybjtjb25zdCB0PXRoaXMucGFnZUluZGV4O3RoaXMucGFnZUluZGV4LS0sdGhpcy5fZW1pdFBhZ2VFdmVudCh0KX1maXJzdFBhZ2UoKXtpZighdGhpcy5oYXNQcmV2aW91c1BhZ2UoKSlyZXR1cm47Y29uc3QgdD10aGlzLnBhZ2VJbmRleDt0aGlzLnBhZ2VJbmRleD0wLHRoaXMuX2VtaXRQYWdlRXZlbnQodCl9bGFzdFBhZ2UoKXtpZighdGhpcy5oYXNOZXh0UGFnZSgpKXJldHVybjtjb25zdCB0PXRoaXMucGFnZUluZGV4O3RoaXMucGFnZUluZGV4PXRoaXMuZ2V0TnVtYmVyT2ZQYWdlcygpLTEsdGhpcy5fZW1pdFBhZ2VFdmVudCh0KX1oYXNQcmV2aW91c1BhZ2UoKXtyZXR1cm4gdGhpcy5wYWdlSW5kZXg+PTEmJjAhPXRoaXMucGFnZVNpemV9aGFzTmV4dFBhZ2UoKXtjb25zdCB0PXRoaXMuZ2V0TnVtYmVyT2ZQYWdlcygpLTE7cmV0dXJuIHRoaXMucGFnZUluZGV4PHQmJjAhPXRoaXMucGFnZVNpemV9Z2V0TnVtYmVyT2ZQYWdlcygpe3JldHVybiB0aGlzLnBhZ2VTaXplP01hdGguY2VpbCh0aGlzLmxlbmd0aC90aGlzLnBhZ2VTaXplKTowfV9jaGFuZ2VQYWdlU2l6ZSh0KXtjb25zdCBlPXRoaXMucGFnZUluZGV4O3RoaXMucGFnZUluZGV4PU1hdGguZmxvb3IodGhpcy5wYWdlSW5kZXgqdGhpcy5wYWdlU2l6ZS90KXx8MCx0aGlzLnBhZ2VTaXplPXQsdGhpcy5fZW1pdFBhZ2VFdmVudChlKX1fbmV4dEJ1dHRvbnNEaXNhYmxlZCgpe3JldHVybiB0aGlzLmRpc2FibGVkfHwhdGhpcy5oYXNOZXh0UGFnZSgpfV9wcmV2aW91c0J1dHRvbnNEaXNhYmxlZCgpe3JldHVybiB0aGlzLmRpc2FibGVkfHwhdGhpcy5oYXNQcmV2aW91c1BhZ2UoKX1fdXBkYXRlRGlzcGxheWVkUGFnZVNpemVPcHRpb25zKCl7dGhpcy5faW5pdGlhbGl6ZWQmJih0aGlzLnBhZ2VTaXplfHwodGhpcy5fcGFnZVNpemU9MCE9dGhpcy5wYWdlU2l6ZU9wdGlvbnMubGVuZ3RoP3RoaXMucGFnZVNpemVPcHRpb25zWzBdOjUwKSx0aGlzLl9kaXNwbGF5ZWRQYWdlU2l6ZU9wdGlvbnM9dGhpcy5wYWdlU2l6ZU9wdGlvbnMuc2xpY2UoKSwtMT09PXRoaXMuX2Rpc3BsYXllZFBhZ2VTaXplT3B0aW9ucy5pbmRleE9mKHRoaXMucGFnZVNpemUpJiZ0aGlzLl9kaXNwbGF5ZWRQYWdlU2l6ZU9wdGlvbnMucHVzaCh0aGlzLnBhZ2VTaXplKSx0aGlzLl9kaXNwbGF5ZWRQYWdlU2l6ZU9wdGlvbnMuc29ydCgoKHQsZSk9PnQtZSkpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKX1fZW1pdFBhZ2VFdmVudCh0KXt0aGlzLnBhZ2UuZW1pdCh7cHJldmlvdXNQYWdlSW5kZXg6dCxwYWdlSW5kZXg6dGhpcy5wYWdlSW5kZXgscGFnZVNpemU6dGhpcy5wYWdlU2l6ZSxsZW5ndGg6dGhpcy5sZW5ndGh9KX19JFEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fCRRKShTbShaUSksU20oVWcpLFNtKHZvaWQgMCkpfSwkUS7JtWRpcj1sbyh7dHlwZTokUSxpbnB1dHM6e3BhZ2VJbmRleDoicGFnZUluZGV4IixsZW5ndGg6Imxlbmd0aCIscGFnZVNpemU6InBhZ2VTaXplIixwYWdlU2l6ZU9wdGlvbnM6InBhZ2VTaXplT3B0aW9ucyIsaGlkZVBhZ2VTaXplOiJoaWRlUGFnZVNpemUiLHNob3dGaXJzdExhc3RCdXR0b25zOiJzaG93Rmlyc3RMYXN0QnV0dG9ucyIsY29sb3I6ImNvbG9yIn0sb3V0cHV0czp7cGFnZToicGFnZSJ9LGZlYXR1cmVzOlt4cF19KSwkUS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlpRfSx7dHlwZTpVZ30se3R5cGU6dm9pZCAwfV0sJFEucHJvcERlY29yYXRvcnM9e2NvbG9yOlt7dHlwZTp4eX1dLHBhZ2VJbmRleDpbe3R5cGU6eHl9XSxsZW5ndGg6W3t0eXBlOnh5fV0scGFnZVNpemU6W3t0eXBlOnh5fV0scGFnZVNpemVPcHRpb25zOlt7dHlwZTp4eX1dLGhpZGVQYWdlU2l6ZTpbe3R5cGU6eHl9XSxzaG93Rmlyc3RMYXN0QnV0dG9uczpbe3R5cGU6eHl9XSxwYWdlOlt7dHlwZTpPeX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKCRRLFt7dHlwZTpDeX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpaUX0se3R5cGU6VWd9LHt0eXBlOnZvaWQgMH1dfSkse3BhZ2U6W3t0eXBlOk95fV0scGFnZUluZGV4Olt7dHlwZTp4eX1dLGxlbmd0aDpbe3R5cGU6eHl9XSxwYWdlU2l6ZTpbe3R5cGU6eHl9XSxwYWdlU2l6ZU9wdGlvbnM6W3t0eXBlOnh5fV0saGlkZVBhZ2VTaXplOlt7dHlwZTp4eX1dLHNob3dGaXJzdExhc3RCdXR0b25zOlt7dHlwZTp4eX1dLGNvbG9yOlt7dHlwZTp4eX1dfSk7Y2xhc3MgdCQgZXh0ZW5kcyAkUXtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodCxlLG4pLG4mJm51bGwhPW4uZm9ybUZpZWxkQXBwZWFyYW5jZSYmKHRoaXMuX2Zvcm1GaWVsZEFwcGVhcmFuY2U9bi5mb3JtRmllbGRBcHBlYXJhbmNlKX19dCQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHQkKShTbShaUSksU20oVWcpLFNtKEpRLDgpKX0sdCQuybVjbXA9dG8oe3R5cGU6dCQsc2VsZWN0b3JzOltbIm1hdC1wYWdpbmF0b3IiXV0saG9zdEF0dHJzOlsicm9sZSIsImdyb3VwIiwxLCJtYXQtcGFnaW5hdG9yIl0saW5wdXRzOntkaXNhYmxlZDoiZGlzYWJsZWQifSxleHBvcnRBczpbIm1hdFBhZ2luYXRvciJdLGZlYXR1cmVzOlt4cF0sZGVjbHM6MTQsdmFyczoxNCxjb25zdHM6W1sxLCJtYXQtcGFnaW5hdG9yLW91dGVyLWNvbnRhaW5lciJdLFsxLCJtYXQtcGFnaW5hdG9yLWNvbnRhaW5lciJdLFsiY2xhc3MiLCJtYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSIsNCwibmdJZiJdLFsxLCJtYXQtcGFnaW5hdG9yLXJhbmdlLWFjdGlvbnMiXSxbMSwibWF0LXBhZ2luYXRvci1yYW5nZS1sYWJlbCJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwidHlwZSIsImJ1dHRvbiIsImNsYXNzIiwibWF0LXBhZ2luYXRvci1uYXZpZ2F0aW9uLWZpcnN0IiwzLCJtYXRUb29sdGlwIiwibWF0VG9vbHRpcERpc2FibGVkIiwibWF0VG9vbHRpcFBvc2l0aW9uIiwiZGlzYWJsZWQiLCJjbGljayIsNCwibmdJZiJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwidHlwZSIsImJ1dHRvbiIsMSwibWF0LXBhZ2luYXRvci1uYXZpZ2F0aW9uLXByZXZpb3VzIiwzLCJtYXRUb29sdGlwIiwibWF0VG9vbHRpcERpc2FibGVkIiwibWF0VG9vbHRpcFBvc2l0aW9uIiwiZGlzYWJsZWQiLCJjbGljayJdLFsidmlld0JveCIsIjAgMCAyNCAyNCIsImZvY3VzYWJsZSIsImZhbHNlIiwxLCJtYXQtcGFnaW5hdG9yLWljb24iXSxbImQiLCJNMTUuNDEgNy40MUwxNCA2bC02IDYgNiA2IDEuNDEtMS40MUwxMC44MyAxMnoiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsInR5cGUiLCJidXR0b24iLDEsIm1hdC1wYWdpbmF0b3ItbmF2aWdhdGlvbi1uZXh0IiwzLCJtYXRUb29sdGlwIiwibWF0VG9vbHRpcERpc2FibGVkIiwibWF0VG9vbHRpcFBvc2l0aW9uIiwiZGlzYWJsZWQiLCJjbGljayJdLFsiZCIsIk0xMCA2TDguNTkgNy40MSAxMy4xNyAxMmwtNC41OCA0LjU5TDEwIDE4bDYtNnoiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsInR5cGUiLCJidXR0b24iLCJjbGFzcyIsIm1hdC1wYWdpbmF0b3ItbmF2aWdhdGlvbi1sYXN0IiwzLCJtYXRUb29sdGlwIiwibWF0VG9vbHRpcERpc2FibGVkIiwibWF0VG9vbHRpcFBvc2l0aW9uIiwiZGlzYWJsZWQiLCJjbGljayIsNCwibmdJZiJdLFsxLCJtYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSJdLFsxLCJtYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZS1sYWJlbCJdLFsiY2xhc3MiLCJtYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZS1zZWxlY3QiLDMsImFwcGVhcmFuY2UiLCJjb2xvciIsNCwibmdJZiJdLFsiY2xhc3MiLCJtYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZS12YWx1ZSIsNCwibmdJZiJdLFsxLCJtYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZS1zZWxlY3QiLDMsImFwcGVhcmFuY2UiLCJjb2xvciJdLFszLCJ2YWx1ZSIsImRpc2FibGVkIiwiYXJpYS1sYWJlbCIsInNlbGVjdGlvbkNoYW5nZSJdLFszLCJ2YWx1ZSIsNCwibmdGb3IiLCJuZ0Zvck9mIl0sWzMsInZhbHVlIl0sWzEsIm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplLXZhbHVlIl0sWyJtYXQtaWNvbi1idXR0b24iLCIiLCJ0eXBlIiwiYnV0dG9uIiwxLCJtYXQtcGFnaW5hdG9yLW5hdmlnYXRpb24tZmlyc3QiLDMsIm1hdFRvb2x0aXAiLCJtYXRUb29sdGlwRGlzYWJsZWQiLCJtYXRUb29sdGlwUG9zaXRpb24iLCJkaXNhYmxlZCIsImNsaWNrIl0sWyJkIiwiTTE4LjQxIDE2LjU5TDEzLjgyIDEybDQuNTktNC41OUwxNyA2bC02IDYgNiA2ek02IDZoMnYxMkg2eiJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwidHlwZSIsImJ1dHRvbiIsMSwibWF0LXBhZ2luYXRvci1uYXZpZ2F0aW9uLWxhc3QiLDMsIm1hdFRvb2x0aXAiLCJtYXRUb29sdGlwRGlzYWJsZWQiLCJtYXRUb29sdGlwUG9zaXRpb24iLCJkaXNhYmxlZCIsImNsaWNrIl0sWyJkIiwiTTUuNTkgNy40MUwxMC4xOCAxMmwtNC41OSA0LjU5TDcgMThsNi02LTYtNnpNMTYgNmgydjEyaC0yeiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiZGl2IiwwKSxSbSgxLCJkaXYiLDEpLFFwKDIsV1EsNSwzLCJkaXYiLDIpLFJtKDMsImRpdiIsMyksUm0oNCwiZGl2Iiw0KSxrdSg1KSxBbSgpLFFwKDYsWVEsMyw1LCJidXR0b24iLDUpLFJtKDcsImJ1dHRvbiIsNiksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLnByZXZpb3VzUGFnZSgpfSkpLHFpKCksUm0oOCwic3ZnIiw3KSxUbSg5LCJwYXRoIiw4KSxBbSgpLEFtKCksWmkoKSxSbSgxMCwiYnV0dG9uIiw5KSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ubmV4dFBhZ2UoKX0pKSxxaSgpLFJtKDExLCJzdmciLDcpLFRtKDEyLCJwYXRoIiwxMCksQW0oKSxBbSgpLFFwKDEzLHFRLDMsNSwiYnV0dG9uIiwxMSksQW0oKSxBbSgpLEFtKCkpLDImZSYmKHJjKDIpLERtKCJuZ0lmIiwhbi5oaWRlUGFnZVNpemUpLHJjKDMpLER1KCIgIixuLl9pbnRsLmdldFJhbmdlTGFiZWwobi5wYWdlSW5kZXgsbi5wYWdlU2l6ZSxuLmxlbmd0aCksIiAiKSxyYygxKSxEbSgibmdJZiIsbi5zaG93Rmlyc3RMYXN0QnV0dG9ucykscmMoMSksRG0oIm1hdFRvb2x0aXAiLG4uX2ludGwucHJldmlvdXNQYWdlTGFiZWwpKCJtYXRUb29sdGlwRGlzYWJsZWQiLG4uX3ByZXZpb3VzQnV0dG9uc0Rpc2FibGVkKCkpKCJtYXRUb29sdGlwUG9zaXRpb24iLCJhYm92ZSIpKCJkaXNhYmxlZCIsbi5fcHJldmlvdXNCdXR0b25zRGlzYWJsZWQoKSksanAoImFyaWEtbGFiZWwiLG4uX2ludGwucHJldmlvdXNQYWdlTGFiZWwpLHJjKDMpLERtKCJtYXRUb29sdGlwIixuLl9pbnRsLm5leHRQYWdlTGFiZWwpKCJtYXRUb29sdGlwRGlzYWJsZWQiLG4uX25leHRCdXR0b25zRGlzYWJsZWQoKSkoIm1hdFRvb2x0aXBQb3NpdGlvbiIsImFib3ZlIikoImRpc2FibGVkIixuLl9uZXh0QnV0dG9uc0Rpc2FibGVkKCkpLGpwKCJhcmlhLWxhYmVsIixuLl9pbnRsLm5leHRQYWdlTGFiZWwpLHJjKDMpLERtKCJuZ0lmIixuLnNob3dGaXJzdExhc3RCdXR0b25zKSl9LGRpcmVjdGl2ZXM6W2RNLFhILEZRLEFWLEFHLGxNLEJIXSxzdHlsZXM6WyIubWF0LXBhZ2luYXRvcntkaXNwbGF5OmJsb2NrfS5tYXQtcGFnaW5hdG9yLW91dGVyLWNvbnRhaW5lcntkaXNwbGF5OmZsZXh9Lm1hdC1wYWdpbmF0b3ItY29udGFpbmVye2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO3BhZGRpbmc6MCA4cHg7ZmxleC13cmFwOndyYXAtcmV2ZXJzZTt3aWR0aDoxMDAlfS5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZXtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6YmFzZWxpbmU7bWFyZ2luLXJpZ2h0OjhweH1bZGlyPXJ0bF0gLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXple21hcmdpbi1yaWdodDowO21hcmdpbi1sZWZ0OjhweH0ubWF0LXBhZ2luYXRvci1wYWdlLXNpemUtbGFiZWx7bWFyZ2luOjAgNHB4fS5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZS1zZWxlY3R7bWFyZ2luOjZweCA0cHggMCA0cHg7d2lkdGg6NTZweH0ubWF0LXBhZ2luYXRvci1wYWdlLXNpemUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZXt3aWR0aDo2NHB4fS5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxse3dpZHRoOjY0cHh9Lm1hdC1wYWdpbmF0b3ItcmFuZ2UtbGFiZWx7bWFyZ2luOjAgMzJweCAwIDI0cHh9Lm1hdC1wYWdpbmF0b3ItcmFuZ2UtYWN0aW9uc3tkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyfS5tYXQtcGFnaW5hdG9yLWljb257d2lkdGg6MjhweDtmaWxsOmN1cnJlbnRDb2xvcn1bZGlyPXJ0bF0gLm1hdC1wYWdpbmF0b3ItaWNvbnt0cmFuc2Zvcm06cm90YXRlKDE4MGRlZyl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXBhZ2luYXRvci1pY29ue2ZpbGw6Q2FudmFzVGV4dH1cbiJdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLHQkLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6WlF9LHt0eXBlOlVnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W0pRXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh0JCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtYXQtcGFnaW5hdG9yIixleHBvcnRBczoibWF0UGFnaW5hdG9yIix0ZW1wbGF0ZTonPGRpdiBjbGFzcz0ibWF0LXBhZ2luYXRvci1vdXRlci1jb250YWluZXIiPlxuICA8ZGl2IGNsYXNzPSJtYXQtcGFnaW5hdG9yLWNvbnRhaW5lciI+XG4gICAgPGRpdiBjbGFzcz0ibWF0LXBhZ2luYXRvci1wYWdlLXNpemUiICpuZ0lmPSIhaGlkZVBhZ2VTaXplIj5cbiAgICAgIDxkaXYgY2xhc3M9Im1hdC1wYWdpbmF0b3ItcGFnZS1zaXplLWxhYmVsIj5cbiAgICAgICAge3tfaW50bC5pdGVtc1BlclBhZ2VMYWJlbH19XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgICpuZ0lmPSJfZGlzcGxheWVkUGFnZVNpemVPcHRpb25zLmxlbmd0aCA+IDEiXG4gICAgICAgIFthcHBlYXJhbmNlXT0iX2Zvcm1GaWVsZEFwcGVhcmFuY2UhIlxuICAgICAgICBbY29sb3JdPSJjb2xvciJcbiAgICAgICAgY2xhc3M9Im1hdC1wYWdpbmF0b3ItcGFnZS1zaXplLXNlbGVjdCI+XG4gICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgW3ZhbHVlXT0icGFnZVNpemUiXG4gICAgICAgICAgW2Rpc2FibGVkXT0iZGlzYWJsZWQiXG4gICAgICAgICAgW2FyaWEtbGFiZWxdPSJfaW50bC5pdGVtc1BlclBhZ2VMYWJlbCJcbiAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT0iX2NoYW5nZVBhZ2VTaXplKCRldmVudC52YWx1ZSkiPlxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj0ibGV0IHBhZ2VTaXplT3B0aW9uIG9mIF9kaXNwbGF5ZWRQYWdlU2l6ZU9wdGlvbnMiIFt2YWx1ZV09InBhZ2VTaXplT3B0aW9uIj5cbiAgICAgICAgICAgIHt7cGFnZVNpemVPcHRpb259fVxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz0ibWF0LXBhZ2luYXRvci1wYWdlLXNpemUtdmFsdWUiXG4gICAgICAgICpuZ0lmPSJfZGlzcGxheWVkUGFnZVNpemVPcHRpb25zLmxlbmd0aCA8PSAxIj57e3BhZ2VTaXplfX08L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9Im1hdC1wYWdpbmF0b3ItcmFuZ2UtYWN0aW9ucyI+XG4gICAgICA8ZGl2IGNsYXNzPSJtYXQtcGFnaW5hdG9yLXJhbmdlLWxhYmVsIj5cbiAgICAgICAge3tfaW50bC5nZXRSYW5nZUxhYmVsKHBhZ2VJbmRleCwgcGFnZVNpemUsIGxlbmd0aCl9fVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9ImJ1dHRvbiJcbiAgICAgICAgICAgICAgY2xhc3M9Im1hdC1wYWdpbmF0b3ItbmF2aWdhdGlvbi1maXJzdCJcbiAgICAgICAgICAgICAgKGNsaWNrKT0iZmlyc3RQYWdlKCkiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPSJfaW50bC5maXJzdFBhZ2VMYWJlbCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPSJfaW50bC5maXJzdFBhZ2VMYWJlbCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBEaXNhYmxlZF09Il9wcmV2aW91c0J1dHRvbnNEaXNhYmxlZCgpIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcFBvc2l0aW9uXT0iXCdhYm92ZVwnIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPSJfcHJldmlvdXNCdXR0b25zRGlzYWJsZWQoKSJcbiAgICAgICAgICAgICAgKm5nSWY9InNob3dGaXJzdExhc3RCdXR0b25zIj5cbiAgICAgICAgPHN2ZyBjbGFzcz0ibWF0LXBhZ2luYXRvci1pY29uIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZvY3VzYWJsZT0iZmFsc2UiPlxuICAgICAgICAgIDxwYXRoIGQ9Ik0xOC40MSAxNi41OUwxMy44MiAxMmw0LjU5LTQuNTlMMTcgNmwtNiA2IDYgNnpNNiA2aDJ2MTJINnoiLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9ImJ1dHRvbiJcbiAgICAgICAgICAgICAgY2xhc3M9Im1hdC1wYWdpbmF0b3ItbmF2aWdhdGlvbi1wcmV2aW91cyJcbiAgICAgICAgICAgICAgKGNsaWNrKT0icHJldmlvdXNQYWdlKCkiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPSJfaW50bC5wcmV2aW91c1BhZ2VMYWJlbCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPSJfaW50bC5wcmV2aW91c1BhZ2VMYWJlbCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBEaXNhYmxlZF09Il9wcmV2aW91c0J1dHRvbnNEaXNhYmxlZCgpIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcFBvc2l0aW9uXT0iXCdhYm92ZVwnIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPSJfcHJldmlvdXNCdXR0b25zRGlzYWJsZWQoKSI+XG4gICAgICAgIDxzdmcgY2xhc3M9Im1hdC1wYWdpbmF0b3ItaWNvbiIgdmlld0JveD0iMCAwIDI0IDI0IiBmb2N1c2FibGU9ImZhbHNlIj5cbiAgICAgICAgICA8cGF0aCBkPSJNMTUuNDEgNy40MUwxNCA2bC02IDYgNiA2IDEuNDEtMS40MUwxMC44MyAxMnoiLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9ImJ1dHRvbiJcbiAgICAgICAgICAgICAgY2xhc3M9Im1hdC1wYWdpbmF0b3ItbmF2aWdhdGlvbi1uZXh0IlxuICAgICAgICAgICAgICAoY2xpY2spPSJuZXh0UGFnZSgpIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT0iX2ludGwubmV4dFBhZ2VMYWJlbCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPSJfaW50bC5uZXh0UGFnZUxhYmVsIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcERpc2FibGVkXT0iX25leHRCdXR0b25zRGlzYWJsZWQoKSJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBQb3NpdGlvbl09IlwnYWJvdmVcJyJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT0iX25leHRCdXR0b25zRGlzYWJsZWQoKSI+XG4gICAgICAgIDxzdmcgY2xhc3M9Im1hdC1wYWdpbmF0b3ItaWNvbiIgdmlld0JveD0iMCAwIDI0IDI0IiBmb2N1c2FibGU9ImZhbHNlIj5cbiAgICAgICAgICA8cGF0aCBkPSJNMTAgNkw4LjU5IDcuNDEgMTMuMTcgMTJsLTQuNTggNC41OUwxMCAxOGw2LTZ6Ii8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiB0eXBlPSJidXR0b24iXG4gICAgICAgICAgICAgIGNsYXNzPSJtYXQtcGFnaW5hdG9yLW5hdmlnYXRpb24tbGFzdCJcbiAgICAgICAgICAgICAgKGNsaWNrKT0ibGFzdFBhZ2UoKSJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09Il9pbnRsLmxhc3RQYWdlTGFiZWwiXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwXT0iX2ludGwubGFzdFBhZ2VMYWJlbCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBEaXNhYmxlZF09Il9uZXh0QnV0dG9uc0Rpc2FibGVkKCkiXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwUG9zaXRpb25dPSJcJ2Fib3ZlXCciXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09Il9uZXh0QnV0dG9uc0Rpc2FibGVkKCkiXG4gICAgICAgICAgICAgICpuZ0lmPSJzaG93Rmlyc3RMYXN0QnV0dG9ucyI+XG4gICAgICAgIDxzdmcgY2xhc3M9Im1hdC1wYWdpbmF0b3ItaWNvbiIgdmlld0JveD0iMCAwIDI0IDI0IiBmb2N1c2FibGU9ImZhbHNlIj5cbiAgICAgICAgICA8cGF0aCBkPSJNNS41OSA3LjQxTDEwLjE4IDEybC00LjU5IDQuNTlMNyAxOGw2LTYtNi02ek0xNiA2aDJ2MTJoLTJ6Ii8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4nLGlucHV0czpbImRpc2FibGVkIl0saG9zdDp7Y2xhc3M6Im1hdC1wYWdpbmF0b3IiLHJvbGU6Imdyb3VwIn0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaCxlbmNhcHN1bGF0aW9uOkhuLk5vbmUsc3R5bGVzOlsiLm1hdC1wYWdpbmF0b3J7ZGlzcGxheTpibG9ja30ubWF0LXBhZ2luYXRvci1vdXRlci1jb250YWluZXJ7ZGlzcGxheTpmbGV4fS5tYXQtcGFnaW5hdG9yLWNvbnRhaW5lcntkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpmbGV4LWVuZDtwYWRkaW5nOjAgOHB4O2ZsZXgtd3JhcDp3cmFwLXJldmVyc2U7d2lkdGg6MTAwJX0ubWF0LXBhZ2luYXRvci1wYWdlLXNpemV7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmJhc2VsaW5lO21hcmdpbi1yaWdodDo4cHh9W2Rpcj1ydGxdIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZXttYXJnaW4tcmlnaHQ6MDttYXJnaW4tbGVmdDo4cHh9Lm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplLWxhYmVse21hcmdpbjowIDRweH0ubWF0LXBhZ2luYXRvci1wYWdlLXNpemUtc2VsZWN0e21hcmdpbjo2cHggNHB4IDAgNHB4O3dpZHRoOjU2cHh9Lm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmV7d2lkdGg6NjRweH0ubWF0LXBhZ2luYXRvci1wYWdlLXNpemUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbHt3aWR0aDo2NHB4fS5tYXQtcGFnaW5hdG9yLXJhbmdlLWxhYmVse21hcmdpbjowIDMycHggMCAyNHB4fS5tYXQtcGFnaW5hdG9yLXJhbmdlLWFjdGlvbnN7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcn0ubWF0LXBhZ2luYXRvci1pY29ue3dpZHRoOjI4cHg7ZmlsbDpjdXJyZW50Q29sb3J9W2Rpcj1ydGxdIC5tYXQtcGFnaW5hdG9yLWljb257dHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1wYWdpbmF0b3ItaWNvbntmaWxsOkNhbnZhc1RleHR9XG4iXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlpRfSx7dHlwZTpVZ30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltKUV19XX1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBlJHt9ZnVuY3Rpb24gbiQodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDMpLFZtKCJAYXJyb3dQb3NpdGlvbi5zdGFydCIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5fZGlzYWJsZVZpZXdTdGF0ZUFuaW1hdGlvbj0hMH0pKSgiQGFycm93UG9zaXRpb24uZG9uZSIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5fZGlzYWJsZVZpZXdTdGF0ZUFuaW1hdGlvbj0hMX0pKSxUbSgxLCJkaXYiLDQpLFJtKDIsImRpdiIsNSksVG0oMywiZGl2Iiw2KSxUbSg0LCJkaXYiLDcpLFRtKDUsImRpdiIsOCksQW0oKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgpO0RtKCJAYXJyb3dPcGFjaXR5Iix0Ll9nZXRBcnJvd1ZpZXdTdGF0ZSgpKSgiQGFycm93UG9zaXRpb24iLHQuX2dldEFycm93Vmlld1N0YXRlKCkpKCJAYWxsb3dDaGlsZHJlbiIsdC5fZ2V0QXJyb3dEaXJlY3Rpb25TdGF0ZSgpKSxyYygyKSxEbSgiQGluZGljYXRvciIsdC5fZ2V0QXJyb3dEaXJlY3Rpb25TdGF0ZSgpKSxyYygxKSxEbSgiQGxlZnRQb2ludGVyIix0Ll9nZXRBcnJvd0RpcmVjdGlvblN0YXRlKCkpLHJjKDEpLERtKCJAcmlnaHRQb2ludGVyIix0Ll9nZXRBcnJvd0RpcmVjdGlvblN0YXRlKCkpfX1lJC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8ZSQpfSxlJC7JtW1vZD1hbyh7dHlwZTplJH0pLGUkLsm1aW5qPXZuKHtwcm92aWRlcnM6W1hRXSxpbXBvcnRzOltbV00sSkgsVEcsVlEsWEldXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZSQsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltXTSxKSCxURyxWUSxYSV0sZXhwb3J0czpbdCRdLGRlY2xhcmF0aW9uczpbdCRdLHByb3ZpZGVyczpbWFFdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oZSQse2RlY2xhcmF0aW9uczpmdW5jdGlvbigpe3JldHVyblt0JF19LGltcG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bV00sSkgsVEcsVlEsWEldfSxleHBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW3QkXX19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IG8kPW5ldyBHYSgiTUFUX1NPUlRfREVGQVVMVF9PUFRJT05TIiksaSQ9ZUgoS0koY2xhc3N7fSkpO2NsYXNzIGEkIGV4dGVuZHMgaSR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLl9kZWZhdWx0T3B0aW9ucz10LHRoaXMuc29ydGFibGVzPW5ldyBNYXAsdGhpcy5fc3RhdGVDaGFuZ2VzPW5ldyBJLHRoaXMuc3RhcnQ9ImFzYyIsdGhpcy5fZGlyZWN0aW9uPSIiLHRoaXMuc29ydENoYW5nZT1uZXcgTGh9Z2V0IGRpcmVjdGlvbigpe3JldHVybiB0aGlzLl9kaXJlY3Rpb259c2V0IGRpcmVjdGlvbih0KXtpZih0JiYiYXNjIiE9PXQmJiJkZXNjIiE9PXQmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSl0aHJvdyhmdW5jdGlvbiBlKHQpe3JldHVybiBFcnJvcihgJHt0fSBpcyBub3QgYSB2YWxpZCBzb3J0IGRpcmVjdGlvbiAoJ2FzYycgb3IgJ2Rlc2MnKS5gKX0pKHQpO3RoaXMuX2RpcmVjdGlvbj10fWdldCBkaXNhYmxlQ2xlYXIoKXtyZXR1cm4gdGhpcy5fZGlzYWJsZUNsZWFyfXNldCBkaXNhYmxlQ2xlYXIodCl7dGhpcy5fZGlzYWJsZUNsZWFyPXl6KHQpfXJlZ2lzdGVyKHQpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpe2lmKCF0LmlkKXRocm93KGZ1bmN0aW9uIGUoKXtyZXR1cm4gRXJyb3IoIk1hdFNvcnRIZWFkZXIgbXVzdCBiZSBwcm92aWRlZCB3aXRoIGEgdW5pcXVlIGlkLiIpfSkoKTtpZih0aGlzLnNvcnRhYmxlcy5oYXModC5pZCkpdGhyb3coZnVuY3Rpb24gbih0KXtyZXR1cm4gRXJyb3IoYENhbm5vdCBoYXZlIHR3byBNYXRTb3J0YWJsZXMgd2l0aCB0aGUgc2FtZSBpZCAoJHt0fSkuYCl9KSh0LmlkKX10aGlzLnNvcnRhYmxlcy5zZXQodC5pZCx0KX1kZXJlZ2lzdGVyKHQpe3RoaXMuc29ydGFibGVzLmRlbGV0ZSh0LmlkKX1zb3J0KHQpe3RoaXMuYWN0aXZlIT10LmlkPyh0aGlzLmFjdGl2ZT10LmlkLHRoaXMuZGlyZWN0aW9uPXQuc3RhcnQ/dC5zdGFydDp0aGlzLnN0YXJ0KTp0aGlzLmRpcmVjdGlvbj10aGlzLmdldE5leHRTb3J0RGlyZWN0aW9uKHQpLHRoaXMuc29ydENoYW5nZS5lbWl0KHthY3RpdmU6dGhpcy5hY3RpdmUsZGlyZWN0aW9uOnRoaXMuZGlyZWN0aW9ufSl9Z2V0TmV4dFNvcnREaXJlY3Rpb24odCl7dmFyIGUsbixvO2lmKCF0KXJldHVybiIiO2NvbnN0IGk9bnVsbCE9PShuPW51bGwhPT0oZT1udWxsPT10P3ZvaWQgMDp0LmRpc2FibGVDbGVhcikmJnZvaWQgMCE9PWU/ZTp0aGlzLmRpc2FibGVDbGVhcikmJnZvaWQgMCE9PW4/bjohIShudWxsPT09KG89dGhpcy5fZGVmYXVsdE9wdGlvbnMpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLmRpc2FibGVDbGVhcik7bGV0IGE9KGZ1bmN0aW9uIHIodCxlKXtsZXQgbj1bImFzYyIsImRlc2MiXTtyZXR1cm4iZGVzYyI9PXQmJm4ucmV2ZXJzZSgpLGV8fG4ucHVzaCgiIiksbn0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKSh0LnN0YXJ0fHx0aGlzLnN0YXJ0LGkpLHM9YS5pbmRleE9mKHRoaXMuZGlyZWN0aW9uKSsxO3JldHVybiBzPj1hLmxlbmd0aCYmKHM9MCksYVtzXX1uZ09uSW5pdCgpe3RoaXMuX21hcmtJbml0aWFsaXplZCgpfW5nT25DaGFuZ2VzKCl7dGhpcy5fc3RhdGVDaGFuZ2VzLm5leHQoKX1uZ09uRGVzdHJveSgpe3RoaXMuX3N0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpfX1hJC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8YSQpKFNtKG8kLDgpKX0sYSQuybVkaXI9bG8oe3R5cGU6YSQsc2VsZWN0b3JzOltbIiIsIm1hdFNvcnQiLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtc29ydCJdLGlucHV0czp7ZGlzYWJsZWQ6WyJtYXRTb3J0RGlzYWJsZWQiLCJkaXNhYmxlZCJdLHN0YXJ0OlsibWF0U29ydFN0YXJ0Iiwic3RhcnQiXSxkaXJlY3Rpb246WyJtYXRTb3J0RGlyZWN0aW9uIiwiZGlyZWN0aW9uIl0sZGlzYWJsZUNsZWFyOlsibWF0U29ydERpc2FibGVDbGVhciIsImRpc2FibGVDbGVhciJdLGFjdGl2ZTpbIm1hdFNvcnRBY3RpdmUiLCJhY3RpdmUiXX0sb3V0cHV0czp7c29ydENoYW5nZToibWF0U29ydENoYW5nZSJ9LGV4cG9ydEFzOlsibWF0U29ydCJdLGZlYXR1cmVzOlt4cCxCb119KSxhJC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbbyRdfV19XSxhJC5wcm9wRGVjb3JhdG9ycz17YWN0aXZlOlt7dHlwZTp4eSxhcmdzOlsibWF0U29ydEFjdGl2ZSJdfV0sc3RhcnQ6W3t0eXBlOnh5LGFyZ3M6WyJtYXRTb3J0U3RhcnQiXX1dLGRpcmVjdGlvbjpbe3R5cGU6eHksYXJnczpbIm1hdFNvcnREaXJlY3Rpb24iXX1dLGRpc2FibGVDbGVhcjpbe3R5cGU6eHksYXJnczpbIm1hdFNvcnREaXNhYmxlQ2xlYXIiXX1dLHNvcnRDaGFuZ2U6W3t0eXBlOk95LGFyZ3M6WyJtYXRTb3J0Q2hhbmdlIl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChhJCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbWF0U29ydF0iLGV4cG9ydEFzOiJtYXRTb3J0Iixob3N0OntjbGFzczoibWF0LXNvcnQifSxpbnB1dHM6WyJkaXNhYmxlZDogbWF0U29ydERpc2FibGVkIl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W28kXX1dfV19KSx7c3RhcnQ6W3t0eXBlOnh5LGFyZ3M6WyJtYXRTb3J0U3RhcnQiXX1dLHNvcnRDaGFuZ2U6W3t0eXBlOk95LGFyZ3M6WyJtYXRTb3J0Q2hhbmdlIl19XSxkaXJlY3Rpb246W3t0eXBlOnh5LGFyZ3M6WyJtYXRTb3J0RGlyZWN0aW9uIl19XSxkaXNhYmxlQ2xlYXI6W3t0eXBlOnh5LGFyZ3M6WyJtYXRTb3J0RGlzYWJsZUNsZWFyIl19XSxhY3RpdmU6W3t0eXBlOnh5LGFyZ3M6WyJtYXRTb3J0QWN0aXZlIl19XX0pO2NvbnN0IHIkPVdJLkVOVEVSSU5HKyIgIitHSS5TVEFOREFSRF9DVVJWRSxzJD17aW5kaWNhdG9yOm54KCJpbmRpY2F0b3IiLFtyeCgiYWN0aXZlLWFzYywgYXNjIixheCh7dHJhbnNmb3JtOiJ0cmFuc2xhdGVZKDBweCkifSkpLHJ4KCJhY3RpdmUtZGVzYywgZGVzYyIsYXgoe3RyYW5zZm9ybToidHJhbnNsYXRlWSgxMHB4KSJ9KSksbHgoImFjdGl2ZS1hc2MgPD0+IGFjdGl2ZS1kZXNjIixveChyJCkpXSksbGVmdFBvaW50ZXI6bngoImxlZnRQb2ludGVyIixbcngoImFjdGl2ZS1hc2MsIGFzYyIsYXgoe3RyYW5zZm9ybToicm90YXRlKC00NWRlZykifSkpLHJ4KCJhY3RpdmUtZGVzYywgZGVzYyIsYXgoe3RyYW5zZm9ybToicm90YXRlKDQ1ZGVnKSJ9KSksbHgoImFjdGl2ZS1hc2MgPD0+IGFjdGl2ZS1kZXNjIixveChyJCkpXSkscmlnaHRQb2ludGVyOm54KCJyaWdodFBvaW50ZXIiLFtyeCgiYWN0aXZlLWFzYywgYXNjIixheCh7dHJhbnNmb3JtOiJyb3RhdGUoNDVkZWcpIn0pKSxyeCgiYWN0aXZlLWRlc2MsIGRlc2MiLGF4KHt0cmFuc2Zvcm06InJvdGF0ZSgtNDVkZWcpIn0pKSxseCgiYWN0aXZlLWFzYyA8PT4gYWN0aXZlLWRlc2MiLG94KHIkKSldKSxhcnJvd09wYWNpdHk6bngoImFycm93T3BhY2l0eSIsW3J4KCJkZXNjLXRvLWFjdGl2ZSwgYXNjLXRvLWFjdGl2ZSwgYWN0aXZlIixheCh7b3BhY2l0eToxfSkpLHJ4KCJkZXNjLXRvLWhpbnQsIGFzYy10by1oaW50LCBoaW50IixheCh7b3BhY2l0eTouNTR9KSkscngoImhpbnQtdG8tZGVzYywgYWN0aXZlLXRvLWRlc2MsIGRlc2MsIGhpbnQtdG8tYXNjLCBhY3RpdmUtdG8tYXNjLCBhc2MsIHZvaWQiLGF4KHtvcGFjaXR5OjB9KSksbHgoIiogPT4gYXNjLCAqID0+IGRlc2MsICogPT4gYWN0aXZlLCAqID0+IGhpbnQsICogPT4gdm9pZCIsb3goIjBtcyIpKSxseCgiKiA8PT4gKiIsb3gociQpKV0pLGFycm93UG9zaXRpb246bngoImFycm93UG9zaXRpb24iLFtseCgiKiA9PiBkZXNjLXRvLWhpbnQsICogPT4gZGVzYy10by1hY3RpdmUiLG94KHIkLHN4KFtheCh7dHJhbnNmb3JtOiJ0cmFuc2xhdGVZKC0yNSUpIn0pLGF4KHt0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMCkifSldKSkpLGx4KCIqID0+IGhpbnQtdG8tZGVzYywgKiA9PiBhY3RpdmUtdG8tZGVzYyIsb3gociQsc3goW2F4KHt0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMCkifSksYXgoe3RyYW5zZm9ybToidHJhbnNsYXRlWSgyNSUpIn0pXSkpKSxseCgiKiA9PiBhc2MtdG8taGludCwgKiA9PiBhc2MtdG8tYWN0aXZlIixveChyJCxzeChbYXgoe3RyYW5zZm9ybToidHJhbnNsYXRlWSgyNSUpIn0pLGF4KHt0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMCkifSldKSkpLGx4KCIqID0+IGhpbnQtdG8tYXNjLCAqID0+IGFjdGl2ZS10by1hc2MiLG94KHIkLHN4KFtheCh7dHJhbnNmb3JtOiJ0cmFuc2xhdGVZKDApIn0pLGF4KHt0cmFuc2Zvcm06InRyYW5zbGF0ZVkoLTI1JSkifSldKSkpLHJ4KCJkZXNjLXRvLWhpbnQsIGFzYy10by1oaW50LCBoaW50LCBkZXNjLXRvLWFjdGl2ZSwgYXNjLXRvLWFjdGl2ZSwgYWN0aXZlIixheCh7dHJhbnNmb3JtOiJ0cmFuc2xhdGVZKDApIn0pKSxyeCgiaGludC10by1kZXNjLCBhY3RpdmUtdG8tZGVzYywgZGVzYyIsYXgoe3RyYW5zZm9ybToidHJhbnNsYXRlWSgtMjUlKSJ9KSkscngoImhpbnQtdG8tYXNjLCBhY3RpdmUtdG8tYXNjLCBhc2MiLGF4KHt0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMjUlKSJ9KSldKSxhbGxvd0NoaWxkcmVuOm54KCJhbGxvd0NoaWxkcmVuIixbbHgoIiogPD0+ICoiLFtkeCgiQCoiLGN4KCkse29wdGlvbmFsOiEwfSldKV0pfTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIGwke2NvbnN0cnVjdG9yKCl7dGhpcy5jaGFuZ2VzPW5ldyBJfX1sJC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bCQpfSxsJC7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgbCR9LHRva2VuOmwkLHByb3ZpZGVkSW46InJvb3QifSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChsJCxbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5bXX0pLG51bGwpO2NvbnN0IGMkPXtwcm92aWRlOmwkLGRlcHM6W1tuZXcgU3IsbmV3IEVyLGwkXV0sdXNlRmFjdG9yeTpmdW5jdGlvbiBkJCh0KXtyZXR1cm4gdHx8bmV3IGwkfX0scCQ9S0koY2xhc3N7fSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIG0kIGV4dGVuZHMgcCR7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEpe2lmKHN1cGVyKCksdGhpcy5faW50bD10LHRoaXMuX2NoYW5nZURldGVjdG9yUmVmPWUsdGhpcy5fc29ydD1uLHRoaXMuX2NvbHVtbkRlZj1vLHRoaXMuX2ZvY3VzTW9uaXRvcj1pLHRoaXMuX2VsZW1lbnRSZWY9YSx0aGlzLl9zaG93SW5kaWNhdG9ySGludD0hMSx0aGlzLl92aWV3U3RhdGU9e30sdGhpcy5fYXJyb3dEaXJlY3Rpb249IiIsdGhpcy5fZGlzYWJsZVZpZXdTdGF0ZUFuaW1hdGlvbj0hMSx0aGlzLmFycm93UG9zaXRpb249ImFmdGVyIiwhbiYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93KGZ1bmN0aW9uIHIoKXtyZXR1cm4gRXJyb3IoIk1hdFNvcnRIZWFkZXIgbXVzdCBiZSBwbGFjZWQgd2l0aGluIGEgcGFyZW50IGVsZW1lbnQgd2l0aCB0aGUgTWF0U29ydCBkaXJlY3RpdmUuIil9KSgpO3RoaXMuX2hhbmRsZVN0YXRlQ2hhbmdlcygpfWdldCBkaXNhYmxlQ2xlYXIoKXtyZXR1cm4gdGhpcy5fZGlzYWJsZUNsZWFyfXNldCBkaXNhYmxlQ2xlYXIodCl7dGhpcy5fZGlzYWJsZUNsZWFyPXl6KHQpfW5nT25Jbml0KCl7IXRoaXMuaWQmJnRoaXMuX2NvbHVtbkRlZiYmKHRoaXMuaWQ9dGhpcy5fY29sdW1uRGVmLm5hbWUpLHRoaXMuX3VwZGF0ZUFycm93RGlyZWN0aW9uKCksdGhpcy5fc2V0QW5pbWF0aW9uVHJhbnNpdGlvblN0YXRlKHt0b1N0YXRlOnRoaXMuX2lzU29ydGVkKCk/ImFjdGl2ZSI6dGhpcy5fYXJyb3dEaXJlY3Rpb259KSx0aGlzLl9zb3J0LnJlZ2lzdGVyKHRoaXMpfW5nQWZ0ZXJWaWV3SW5pdCgpe3RoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHRoaXMuX2VsZW1lbnRSZWYsITApLnN1YnNjcmliZSgodD0+e2NvbnN0IGU9ISF0O2UhPT10aGlzLl9zaG93SW5kaWNhdG9ySGludCYmKHRoaXMuX3NldEluZGljYXRvckhpbnRWaXNpYmxlKGUpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKX0pKX1uZ09uRGVzdHJveSgpe3RoaXMuX2ZvY3VzTW9uaXRvci5zdG9wTW9uaXRvcmluZyh0aGlzLl9lbGVtZW50UmVmKSx0aGlzLl9zb3J0LmRlcmVnaXN0ZXIodGhpcyksdGhpcy5fcmVyZW5kZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKX1fc2V0SW5kaWNhdG9ySGludFZpc2libGUodCl7dGhpcy5faXNEaXNhYmxlZCgpJiZ0fHwodGhpcy5fc2hvd0luZGljYXRvckhpbnQ9dCx0aGlzLl9pc1NvcnRlZCgpfHwodGhpcy5fdXBkYXRlQXJyb3dEaXJlY3Rpb24oKSx0aGlzLl9zZXRBbmltYXRpb25UcmFuc2l0aW9uU3RhdGUodGhpcy5fc2hvd0luZGljYXRvckhpbnQ/e2Zyb21TdGF0ZTp0aGlzLl9hcnJvd0RpcmVjdGlvbix0b1N0YXRlOiJoaW50In06e2Zyb21TdGF0ZToiaGludCIsdG9TdGF0ZTp0aGlzLl9hcnJvd0RpcmVjdGlvbn0pKSl9X3NldEFuaW1hdGlvblRyYW5zaXRpb25TdGF0ZSh0KXt0aGlzLl92aWV3U3RhdGU9dHx8e30sdGhpcy5fZGlzYWJsZVZpZXdTdGF0ZUFuaW1hdGlvbiYmKHRoaXMuX3ZpZXdTdGF0ZT17dG9TdGF0ZTp0LnRvU3RhdGV9KX1fdG9nZ2xlT25JbnRlcmFjdGlvbigpe3RoaXMuX3NvcnQuc29ydCh0aGlzKSwiaGludCIhPT10aGlzLl92aWV3U3RhdGUudG9TdGF0ZSYmImFjdGl2ZSIhPT10aGlzLl92aWV3U3RhdGUudG9TdGF0ZXx8KHRoaXMuX2Rpc2FibGVWaWV3U3RhdGVBbmltYXRpb249ITApfV9oYW5kbGVDbGljaygpe3RoaXMuX2lzRGlzYWJsZWQoKXx8dGhpcy5fc29ydC5zb3J0KHRoaXMpfV9oYW5kbGVLZXlkb3duKHQpe3RoaXMuX2lzRGlzYWJsZWQoKXx8dC5rZXlDb2RlIT09ZnomJnQua2V5Q29kZSE9PW16fHwodC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX3RvZ2dsZU9uSW50ZXJhY3Rpb24oKSl9X2lzU29ydGVkKCl7cmV0dXJuIHRoaXMuX3NvcnQuYWN0aXZlPT10aGlzLmlkJiYoImFzYyI9PT10aGlzLl9zb3J0LmRpcmVjdGlvbnx8ImRlc2MiPT09dGhpcy5fc29ydC5kaXJlY3Rpb24pfV9nZXRBcnJvd0RpcmVjdGlvblN0YXRlKCl7cmV0dXJuYCR7dGhpcy5faXNTb3J0ZWQoKT8iYWN0aXZlLSI6IiJ9JHt0aGlzLl9hcnJvd0RpcmVjdGlvbn1gfV9nZXRBcnJvd1ZpZXdTdGF0ZSgpe2NvbnN0IHQ9dGhpcy5fdmlld1N0YXRlLmZyb21TdGF0ZTtyZXR1cm4odD9gJHt0fS10by1gOiIiKSt0aGlzLl92aWV3U3RhdGUudG9TdGF0ZX1fdXBkYXRlQXJyb3dEaXJlY3Rpb24oKXt0aGlzLl9hcnJvd0RpcmVjdGlvbj10aGlzLl9pc1NvcnRlZCgpP3RoaXMuX3NvcnQuZGlyZWN0aW9uOnRoaXMuc3RhcnR8fHRoaXMuX3NvcnQuc3RhcnR9X2lzRGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5fc29ydC5kaXNhYmxlZHx8dGhpcy5kaXNhYmxlZH1fZ2V0QXJpYVNvcnRBdHRyaWJ1dGUoKXtyZXR1cm4gdGhpcy5faXNTb3J0ZWQoKT8iYXNjIj09dGhpcy5fc29ydC5kaXJlY3Rpb24/ImFzY2VuZGluZyI6ImRlc2NlbmRpbmciOiJub25lIn1fcmVuZGVyQXJyb3coKXtyZXR1cm4hdGhpcy5faXNEaXNhYmxlZCgpfHx0aGlzLl9pc1NvcnRlZCgpfV9oYW5kbGVTdGF0ZUNoYW5nZXMoKXt0aGlzLl9yZXJlbmRlclN1YnNjcmlwdGlvbj1yZSh0aGlzLl9zb3J0LnNvcnRDaGFuZ2UsdGhpcy5fc29ydC5fc3RhdGVDaGFuZ2VzLHRoaXMuX2ludGwuY2hhbmdlcykuc3Vic2NyaWJlKCgoKT0+e3RoaXMuX2lzU29ydGVkKCkmJih0aGlzLl91cGRhdGVBcnJvd0RpcmVjdGlvbigpLCJoaW50IiE9PXRoaXMuX3ZpZXdTdGF0ZS50b1N0YXRlJiYiYWN0aXZlIiE9PXRoaXMuX3ZpZXdTdGF0ZS50b1N0YXRlfHwodGhpcy5fZGlzYWJsZVZpZXdTdGF0ZUFuaW1hdGlvbj0hMCksdGhpcy5fc2V0QW5pbWF0aW9uVHJhbnNpdGlvblN0YXRlKHtmcm9tU3RhdGU6dGhpcy5fYXJyb3dEaXJlY3Rpb24sdG9TdGF0ZToiYWN0aXZlIn0pLHRoaXMuX3Nob3dJbmRpY2F0b3JIaW50PSExKSwhdGhpcy5faXNTb3J0ZWQoKSYmdGhpcy5fdmlld1N0YXRlJiYiYWN0aXZlIj09PXRoaXMuX3ZpZXdTdGF0ZS50b1N0YXRlJiYodGhpcy5fZGlzYWJsZVZpZXdTdGF0ZUFuaW1hdGlvbj0hMSx0aGlzLl9zZXRBbmltYXRpb25UcmFuc2l0aW9uU3RhdGUoe2Zyb21TdGF0ZToiYWN0aXZlIix0b1N0YXRlOnRoaXMuX2Fycm93RGlyZWN0aW9ufSkpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfSkpfX1tJC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bSQpKFNtKGwkKSxTbShVZyksU20oYSQsOCksU20oIk1BVF9TT1JUX0hFQURFUl9DT0xVTU5fREVGIiw4KSxTbShTSSksU20oaGcpKX0sbSQuybVjbXA9dG8oe3R5cGU6bSQsc2VsZWN0b3JzOltbIiIsIm1hdC1zb3J0LWhlYWRlciIsIiJdXSxob3N0QXR0cnM6WzEsIm1hdC1zb3J0LWhlYWRlciJdLGhvc3RWYXJzOjMsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJlZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5faGFuZGxlQ2xpY2soKX0pKSgia2V5ZG93biIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX2hhbmRsZUtleWRvd24oZSl9KSkoIm1vdXNlZW50ZXIiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX3NldEluZGljYXRvckhpbnRWaXNpYmxlKCEwKX0pKSgibW91c2VsZWF2ZSIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5fc2V0SW5kaWNhdG9ySGludFZpc2libGUoITEpfSkpLDImZSYmKGpwKCJhcmlhLXNvcnQiLG4uX2dldEFyaWFTb3J0QXR0cmlidXRlKCkpLHB1KCJtYXQtc29ydC1oZWFkZXItZGlzYWJsZWQiLG4uX2lzRGlzYWJsZWQoKSkpfSxpbnB1dHM6e2Rpc2FibGVkOiJkaXNhYmxlZCIsYXJyb3dQb3NpdGlvbjoiYXJyb3dQb3NpdGlvbiIsZGlzYWJsZUNsZWFyOiJkaXNhYmxlQ2xlYXIiLGlkOlsibWF0LXNvcnQtaGVhZGVyIiwiaWQiXSxzdGFydDoic3RhcnQifSxleHBvcnRBczpbIm1hdFNvcnRIZWFkZXIiXSxmZWF0dXJlczpbeHBdLGF0dHJzOlsibWF0LXNvcnQtaGVhZGVyIiwiIl0sbmdDb250ZW50U2VsZWN0b3JzOlsiKiJdLGRlY2xzOjQsdmFyczo2LGNvbnN0czpbWyJyb2xlIiwiYnV0dG9uIiwxLCJtYXQtc29ydC1oZWFkZXItY29udGFpbmVyIiwibWF0LWZvY3VzLWluZGljYXRvciJdLFsxLCJtYXQtc29ydC1oZWFkZXItY29udGVudCJdLFsiY2xhc3MiLCJtYXQtc29ydC1oZWFkZXItYXJyb3ciLDQsIm5nSWYiXSxbMSwibWF0LXNvcnQtaGVhZGVyLWFycm93Il0sWzEsIm1hdC1zb3J0LWhlYWRlci1zdGVtIl0sWzEsIm1hdC1zb3J0LWhlYWRlci1pbmRpY2F0b3IiXSxbMSwibWF0LXNvcnQtaGVhZGVyLXBvaW50ZXItbGVmdCJdLFsxLCJtYXQtc29ydC1oZWFkZXItcG9pbnRlci1yaWdodCJdLFsxLCJtYXQtc29ydC1oZWFkZXItcG9pbnRlci1taWRkbGUiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFptKCksUm0oMCwiZGl2IiwwKSxSbSgxLCJkaXYiLDEpLFhtKDIpLEFtKCksUXAoMyxuJCw2LDYsImRpdiIsMiksQW0oKSksMiZlJiYocHUoIm1hdC1zb3J0LWhlYWRlci1zb3J0ZWQiLG4uX2lzU29ydGVkKCkpKCJtYXQtc29ydC1oZWFkZXItcG9zaXRpb24tYmVmb3JlIiwiYmVmb3JlIj09bi5hcnJvd1Bvc2l0aW9uKSxqcCgidGFiaW5kZXgiLG4uX2lzRGlzYWJsZWQoKT9udWxsOjApLHJjKDMpLERtKCJuZ0lmIixuLl9yZW5kZXJBcnJvdygpKSl9LGRpcmVjdGl2ZXM6W2RNXSxzdHlsZXM6WyIubWF0LXNvcnQtaGVhZGVyLWNvbnRhaW5lcntkaXNwbGF5OmZsZXg7Y3Vyc29yOnBvaW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO2xldHRlci1zcGFjaW5nOm5vcm1hbDtvdXRsaW5lOjB9W21hdC1zb3J0LWhlYWRlcl0uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1zb3J0LWhlYWRlci1jb250YWluZXIsW21hdC1zb3J0LWhlYWRlcl0uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LXNvcnQtaGVhZGVyLWNvbnRhaW5lcntib3JkZXItYm90dG9tOnNvbGlkIDFweCBjdXJyZW50Q29sb3J9Lm1hdC1zb3J0LWhlYWRlci1kaXNhYmxlZCAubWF0LXNvcnQtaGVhZGVyLWNvbnRhaW5lcntjdXJzb3I6ZGVmYXVsdH0ubWF0LXNvcnQtaGVhZGVyLWNvbnRlbnR7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcn0ubWF0LXNvcnQtaGVhZGVyLXBvc2l0aW9uLWJlZm9yZXtmbGV4LWRpcmVjdGlvbjpyb3ctcmV2ZXJzZX0ubWF0LXNvcnQtaGVhZGVyLWFycm93e2hlaWdodDoxMnB4O3dpZHRoOjEycHg7bWluLXdpZHRoOjEycHg7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpmbGV4O29wYWNpdHk6MH0ubWF0LXNvcnQtaGVhZGVyLWFycm93LFtkaXI9cnRsXSAubWF0LXNvcnQtaGVhZGVyLXBvc2l0aW9uLWJlZm9yZSAubWF0LXNvcnQtaGVhZGVyLWFycm93e21hcmdpbjowIDAgMCA2cHh9Lm1hdC1zb3J0LWhlYWRlci1wb3NpdGlvbi1iZWZvcmUgLm1hdC1zb3J0LWhlYWRlci1hcnJvdyxbZGlyPXJ0bF0gLm1hdC1zb3J0LWhlYWRlci1hcnJvd3ttYXJnaW46MCA2cHggMCAwfS5tYXQtc29ydC1oZWFkZXItc3RlbXtiYWNrZ3JvdW5kOmN1cnJlbnRDb2xvcjtoZWlnaHQ6MTBweDt3aWR0aDoycHg7bWFyZ2luOmF1dG87ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcn0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc29ydC1oZWFkZXItc3RlbXt3aWR0aDowO2JvcmRlci1sZWZ0OnNvbGlkIDJweH0ubWF0LXNvcnQtaGVhZGVyLWluZGljYXRvcnt3aWR0aDoxMDAlO2hlaWdodDoycHg7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjB9Lm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLW1pZGRsZXttYXJnaW46YXV0bztoZWlnaHQ6MnB4O3dpZHRoOjJweDtiYWNrZ3JvdW5kOmN1cnJlbnRDb2xvcjt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc29ydC1oZWFkZXItcG9pbnRlci1taWRkbGV7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXItdG9wOnNvbGlkIDJweDtib3JkZXItbGVmdDpzb2xpZCAycHh9Lm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLWxlZnQsLm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLXJpZ2h0e2JhY2tncm91bmQ6Y3VycmVudENvbG9yO3dpZHRoOjZweDtoZWlnaHQ6MnB4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDowfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLWxlZnQsLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNvcnQtaGVhZGVyLXBvaW50ZXItcmlnaHR7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXItbGVmdDpzb2xpZCA2cHg7Ym9yZGVyLXRvcDpzb2xpZCAycHh9Lm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLWxlZnR7dHJhbnNmb3JtLW9yaWdpbjpyaWdodDtsZWZ0OjB9Lm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLXJpZ2h0e3RyYW5zZm9ybS1vcmlnaW46bGVmdDtyaWdodDowfVxuIl0sZW5jYXBzdWxhdGlvbjoyLGRhdGE6e2FuaW1hdGlvbjpbcyQuaW5kaWNhdG9yLHMkLmxlZnRQb2ludGVyLHMkLnJpZ2h0UG9pbnRlcixzJC5hcnJvd09wYWNpdHkscyQuYXJyb3dQb3NpdGlvbixzJC5hbGxvd0NoaWxkcmVuXX0sY2hhbmdlRGV0ZWN0aW9uOjB9KSxtJC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmwkfSx7dHlwZTpVZ30se3R5cGU6YSQsZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6WyJNQVRfU09SVF9IRUFERVJfQ09MVU1OX0RFRiJdfSx7dHlwZTpTcn1dfSx7dHlwZTpTSX0se3R5cGU6aGd9XSxtJC5wcm9wRGVjb3JhdG9ycz17aWQ6W3t0eXBlOnh5LGFyZ3M6WyJtYXQtc29ydC1oZWFkZXIiXX1dLGFycm93UG9zaXRpb246W3t0eXBlOnh5fV0sc3RhcnQ6W3t0eXBlOnh5fV0sZGlzYWJsZUNsZWFyOlt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKG0kLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6IlttYXQtc29ydC1oZWFkZXJdIixleHBvcnRBczoibWF0U29ydEhlYWRlciIsdGVtcGxhdGU6J1x4M2MhLS1cbiAgV2Ugc2V0IHRoZSBgdGFiaW5kZXhgIG9uIGFuIGVsZW1lbnQgaW5zaWRlIHRoZSB0YWJsZSBoZWFkZXIsIHJhdGhlciB0aGFuIHRoZSBoZWFkZXIgaXRzZWxmLFxuICBiZWNhdXNlIG9mIGEgYnVnIGluIE5WREEgd2hlcmUgaGF2aW5nIGEgYHRhYmluZGV4YCBvbiBhIGB0aGAgYnJlYWtzIGtleWJvYXJkIG5hdmlnYXRpb24gaW4gdGhlXG4gIHRhYmxlIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL252YWNjZXNzL252ZGEvaXNzdWVzLzc3MTgpLiBUaGlzIGFsbG93cyBmb3IgdGhlIGhlYWRlciB0byBib3RoXG4gIGJlIGZvY3VzYWJsZSwgYW5kIGhhdmUgc2NyZWVuIHJlYWRlcnMgcmVhZCBvdXQgaXRzIGBhcmlhLXNvcnRgIHN0YXRlLiBXZSBwcmVmZXIgdGhpcyBhcHByb2FjaFxuICBvdmVyIGhhdmluZyBhIGJ1dHRvbiB3aXRoIGFuIGBhcmlhLWxhYmVsYCBpbnNpZGUgdGhlIGhlYWRlciwgYmVjYXVzZSB0aGUgYnV0dG9uXCdzIGBhcmlhLWxhYmVsYFxuICB3aWxsIGJlIHJlYWQgb3V0IGFzIHRoZSB1c2VyIGlzIG5hdmlnYXRpbmcgdGhlIHRhYmxlXCdzIGNlbGwgKHNlZSAjMTMwMTIpLlxuXG4gIFRoZSBhcHByb2FjaCBpcyBiYXNlZCBvZmYgb2Y6IGh0dHBzOi8vZGVxdWV1bml2ZXJzaXR5LmNvbS9saWJyYXJ5L2FyaWEvdGFibGVzL3NmLXNvcnRhYmxlLWdyaWRcbi0tXHgzZVxuPGRpdiBjbGFzcz0ibWF0LXNvcnQtaGVhZGVyLWNvbnRhaW5lciBtYXQtZm9jdXMtaW5kaWNhdG9yIlxuICAgICBbY2xhc3MubWF0LXNvcnQtaGVhZGVyLXNvcnRlZF09Il9pc1NvcnRlZCgpIlxuICAgICBbY2xhc3MubWF0LXNvcnQtaGVhZGVyLXBvc2l0aW9uLWJlZm9yZV09ImFycm93UG9zaXRpb24gPT0gXCdiZWZvcmVcJyJcbiAgICAgW2F0dHIudGFiaW5kZXhdPSJfaXNEaXNhYmxlZCgpID8gbnVsbCA6IDAiXG4gICAgIHJvbGU9ImJ1dHRvbiI+XG5cbiAgXHgzYyEtLVxuICAgIFRPRE8oY3Jpc2JldG8pOiB0aGlzIGRpdiBpc25cJ3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBidXQgd2UgaGF2ZSB0byBrZWVwIGl0IGR1ZSB0byBhIGxhcmdlXG4gICAgbnVtYmVyIG9mIHNjcmVlbnNob3QgZGlmZiBmYWlsdXJlcy4gSXQgc2hvdWxkIGJlIHJlbW92ZWQgZXZlbnR1YWxseS4gTm90ZSB0aGF0IHRoZSBkaWZmZXJlbmNlXG4gICAgaXNuXCd0IHZpc2libGUgd2l0aCBhIHNob3J0ZXIgaGVhZGVyLCBidXQgb25jZSBpdCBicmVha3MgdXAgaW50byBtdWx0aXBsZSBsaW5lcywgdGhpcyBlbGVtZW50XG4gICAgY2F1c2VzIGl0IHRvIGJlIGNlbnRlci1hbGlnbmVkLCB3aGVyZWFzIHJlbW92aW5nIGl0IHdpbGwga2VlcCB0aGUgdGV4dCB0byB0aGUgbGVmdC5cbiAgLS1ceDNlXG4gIDxkaXYgY2xhc3M9Im1hdC1zb3J0LWhlYWRlci1jb250ZW50Ij5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuXG4gIFx4M2MhLS0gRGlzYWJsZSBhbmltYXRpb25zIHdoaWxlIGEgY3VycmVudCBhbmltYXRpb24gaXMgcnVubmluZyAtLVx4M2VcbiAgPGRpdiBjbGFzcz0ibWF0LXNvcnQtaGVhZGVyLWFycm93IlxuICAgICAgICpuZ0lmPSJfcmVuZGVyQXJyb3coKSJcbiAgICAgICBbQGFycm93T3BhY2l0eV09Il9nZXRBcnJvd1ZpZXdTdGF0ZSgpIlxuICAgICAgIFtAYXJyb3dQb3NpdGlvbl09Il9nZXRBcnJvd1ZpZXdTdGF0ZSgpIlxuICAgICAgIFtAYWxsb3dDaGlsZHJlbl09Il9nZXRBcnJvd0RpcmVjdGlvblN0YXRlKCkiXG4gICAgICAgKEBhcnJvd1Bvc2l0aW9uLnN0YXJ0KT0iX2Rpc2FibGVWaWV3U3RhdGVBbmltYXRpb24gPSB0cnVlIlxuICAgICAgIChAYXJyb3dQb3NpdGlvbi5kb25lKT0iX2Rpc2FibGVWaWV3U3RhdGVBbmltYXRpb24gPSBmYWxzZSI+XG4gICAgPGRpdiBjbGFzcz0ibWF0LXNvcnQtaGVhZGVyLXN0ZW0iPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9Im1hdC1zb3J0LWhlYWRlci1pbmRpY2F0b3IiIFtAaW5kaWNhdG9yXT0iX2dldEFycm93RGlyZWN0aW9uU3RhdGUoKSI+XG4gICAgICA8ZGl2IGNsYXNzPSJtYXQtc29ydC1oZWFkZXItcG9pbnRlci1sZWZ0IiBbQGxlZnRQb2ludGVyXT0iX2dldEFycm93RGlyZWN0aW9uU3RhdGUoKSI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPSJtYXQtc29ydC1oZWFkZXItcG9pbnRlci1yaWdodCIgW0ByaWdodFBvaW50ZXJdPSJfZ2V0QXJyb3dEaXJlY3Rpb25TdGF0ZSgpIj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9Im1hdC1zb3J0LWhlYWRlci1wb2ludGVyLW1pZGRsZSI+PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4nLGhvc3Q6e2NsYXNzOiJtYXQtc29ydC1oZWFkZXIiLCIoY2xpY2spIjoiX2hhbmRsZUNsaWNrKCkiLCIoa2V5ZG93bikiOiJfaGFuZGxlS2V5ZG93bigkZXZlbnQpIiwiKG1vdXNlZW50ZXIpIjoiX3NldEluZGljYXRvckhpbnRWaXNpYmxlKHRydWUpIiwiKG1vdXNlbGVhdmUpIjoiX3NldEluZGljYXRvckhpbnRWaXNpYmxlKGZhbHNlKSIsIlthdHRyLmFyaWEtc29ydF0iOiJfZ2V0QXJpYVNvcnRBdHRyaWJ1dGUoKSIsIltjbGFzcy5tYXQtc29ydC1oZWFkZXItZGlzYWJsZWRdIjoiX2lzRGlzYWJsZWQoKSJ9LGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLGlucHV0czpbImRpc2FibGVkIl0sYW5pbWF0aW9uczpbcyQuaW5kaWNhdG9yLHMkLmxlZnRQb2ludGVyLHMkLnJpZ2h0UG9pbnRlcixzJC5hcnJvd09wYWNpdHkscyQuYXJyb3dQb3NpdGlvbixzJC5hbGxvd0NoaWxkcmVuXSxzdHlsZXM6WyIubWF0LXNvcnQtaGVhZGVyLWNvbnRhaW5lcntkaXNwbGF5OmZsZXg7Y3Vyc29yOnBvaW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO2xldHRlci1zcGFjaW5nOm5vcm1hbDtvdXRsaW5lOjB9W21hdC1zb3J0LWhlYWRlcl0uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1zb3J0LWhlYWRlci1jb250YWluZXIsW21hdC1zb3J0LWhlYWRlcl0uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LXNvcnQtaGVhZGVyLWNvbnRhaW5lcntib3JkZXItYm90dG9tOnNvbGlkIDFweCBjdXJyZW50Q29sb3J9Lm1hdC1zb3J0LWhlYWRlci1kaXNhYmxlZCAubWF0LXNvcnQtaGVhZGVyLWNvbnRhaW5lcntjdXJzb3I6ZGVmYXVsdH0ubWF0LXNvcnQtaGVhZGVyLWNvbnRlbnR7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcn0ubWF0LXNvcnQtaGVhZGVyLXBvc2l0aW9uLWJlZm9yZXtmbGV4LWRpcmVjdGlvbjpyb3ctcmV2ZXJzZX0ubWF0LXNvcnQtaGVhZGVyLWFycm93e2hlaWdodDoxMnB4O3dpZHRoOjEycHg7bWluLXdpZHRoOjEycHg7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpmbGV4O29wYWNpdHk6MH0ubWF0LXNvcnQtaGVhZGVyLWFycm93LFtkaXI9cnRsXSAubWF0LXNvcnQtaGVhZGVyLXBvc2l0aW9uLWJlZm9yZSAubWF0LXNvcnQtaGVhZGVyLWFycm93e21hcmdpbjowIDAgMCA2cHh9Lm1hdC1zb3J0LWhlYWRlci1wb3NpdGlvbi1iZWZvcmUgLm1hdC1zb3J0LWhlYWRlci1hcnJvdyxbZGlyPXJ0bF0gLm1hdC1zb3J0LWhlYWRlci1hcnJvd3ttYXJnaW46MCA2cHggMCAwfS5tYXQtc29ydC1oZWFkZXItc3RlbXtiYWNrZ3JvdW5kOmN1cnJlbnRDb2xvcjtoZWlnaHQ6MTBweDt3aWR0aDoycHg7bWFyZ2luOmF1dG87ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcn0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc29ydC1oZWFkZXItc3RlbXt3aWR0aDowO2JvcmRlci1sZWZ0OnNvbGlkIDJweH0ubWF0LXNvcnQtaGVhZGVyLWluZGljYXRvcnt3aWR0aDoxMDAlO2hlaWdodDoycHg7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjB9Lm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLW1pZGRsZXttYXJnaW46YXV0bztoZWlnaHQ6MnB4O3dpZHRoOjJweDtiYWNrZ3JvdW5kOmN1cnJlbnRDb2xvcjt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc29ydC1oZWFkZXItcG9pbnRlci1taWRkbGV7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXItdG9wOnNvbGlkIDJweDtib3JkZXItbGVmdDpzb2xpZCAycHh9Lm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLWxlZnQsLm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLXJpZ2h0e2JhY2tncm91bmQ6Y3VycmVudENvbG9yO3dpZHRoOjZweDtoZWlnaHQ6MnB4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDowfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLWxlZnQsLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNvcnQtaGVhZGVyLXBvaW50ZXItcmlnaHR7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXItbGVmdDpzb2xpZCA2cHg7Ym9yZGVyLXRvcDpzb2xpZCAycHh9Lm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLWxlZnR7dHJhbnNmb3JtLW9yaWdpbjpyaWdodDtsZWZ0OjB9Lm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLXJpZ2h0e3RyYW5zZm9ybS1vcmlnaW46bGVmdDtyaWdodDowfVxuIl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpsJH0se3R5cGU6VWd9LHt0eXBlOmEkLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOlsiTUFUX1NPUlRfSEVBREVSX0NPTFVNTl9ERUYiXX0se3R5cGU6U3J9XX0se3R5cGU6U0l9LHt0eXBlOmhnfV19KSx7YXJyb3dQb3NpdGlvbjpbe3R5cGU6eHl9XSxkaXNhYmxlQ2xlYXI6W3t0eXBlOnh5fV0saWQ6W3t0eXBlOnh5LGFyZ3M6WyJtYXQtc29ydC1oZWFkZXIiXX1dLHN0YXJ0Olt7dHlwZTp4eX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyB1JHt9dSQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHUkKX0sdSQuybVtb2Q9YW8oe3R5cGU6dSR9KSx1JC7JtWluaj12bih7cHJvdmlkZXJzOltjJF0saW1wb3J0czpbW1dNLFhJXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHUkLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbV00sWEldLGV4cG9ydHM6W2EkLG0kXSxkZWNsYXJhdGlvbnM6W2EkLG0kXSxwcm92aWRlcnM6W2MkXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKHUkLHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bYSQsbSRdfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1dNLFhJXX0sZXhwb3J0czpmdW5jdGlvbigpe3JldHVyblthJCxtJF19fSk7Y29uc3QgZiQ9W1tbImNhcHRpb24iXV0sW1siY29sZ3JvdXAiXSxbImNvbCJdXV07ZnVuY3Rpb24gZyQodCxlKXtpZigxJnQmJihSbSgwLCJ0aCIsMyksa3UoMSksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7ZHUoInRleHQtYWxpZ24iLHQuanVzdGlmeSkscmMoMSksRHUoIiAiLHQuaGVhZGVyVGV4dCwiICIpfX1mdW5jdGlvbiBoJCh0LGUpe2lmKDEmdCYmKFJtKDAsInRkIiw0KSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQsbj1ZbSgpO2R1KCJ0ZXh0LWFsaWduIixuLmp1c3RpZnkpLHJjKDEpLER1KCIgIixuLmRhdGFBY2Nlc3Nvcih0LG4ubmFtZSksIiAiKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIGIkKHQpe3JldHVybiBjbGFzcyBleHRlbmRzIHR7Y29uc3RydWN0b3IoLi4udCl7c3VwZXIoLi4udCksdGhpcy5fc3RpY2t5PSExLHRoaXMuX2hhc1N0aWNreUNoYW5nZWQ9ITF9Z2V0IHN0aWNreSgpe3JldHVybiB0aGlzLl9zdGlja3l9c2V0IHN0aWNreSh0KXtjb25zdCBlPXRoaXMuX3N0aWNreTt0aGlzLl9zdGlja3k9eXoodCksdGhpcy5faGFzU3RpY2t5Q2hhbmdlZD1lIT09dGhpcy5fc3RpY2t5fWhhc1N0aWNreUNoYW5nZWQoKXtjb25zdCB0PXRoaXMuX2hhc1N0aWNreUNoYW5nZWQ7cmV0dXJuIHRoaXMuX2hhc1N0aWNreUNoYW5nZWQ9ITEsdH1yZXNldFN0aWNreUNoYW5nZWQoKXt0aGlzLl9oYXNTdGlja3lDaGFuZ2VkPSExfX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NvbnN0IHkkPW5ldyBHYSgiQ0RLX1RBQkxFIiksXyQ9bmV3IEdhKCJ0ZXh0LWNvbHVtbi1vcHRpb25zIik7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBDJHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnRlbXBsYXRlPXR9fUMkLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxDJCkoU20oWGcpKX0sQyQuybVkaXI9bG8oe3R5cGU6QyQsc2VsZWN0b3JzOltbIiIsImNka0NlbGxEZWYiLCIiXV19KSxDJC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlhnfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChDJCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbY2RrQ2VsbERlZl0ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6WGd9XX0pLG51bGwpO2NsYXNzIE0ke2NvbnN0cnVjdG9yKHQpe3RoaXMudGVtcGxhdGU9dH19TSQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fE0kKShTbShYZykpfSxNJC7JtWRpcj1sbyh7dHlwZTpNJCxzZWxlY3RvcnM6W1siIiwiY2RrSGVhZGVyQ2VsbERlZiIsIiJdXX0pLE0kLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6WGd9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKE0kLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IltjZGtIZWFkZXJDZWxsRGVmXSJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpYZ31dfSksbnVsbCk7Y2xhc3MgdiR7Y29uc3RydWN0b3IodCl7dGhpcy50ZW1wbGF0ZT10fX12JC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8diQpKFNtKFhnKSl9LHYkLsm1ZGlyPWxvKHt0eXBlOnYkLHNlbGVjdG9yczpbWyIiLCJjZGtGb290ZXJDZWxsRGVmIiwiIl1dfSksdiQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpYZ31dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodiQsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Nka0Zvb3RlckNlbGxEZWZdIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlhnfV19KSxudWxsKTtjb25zdCB4JD1iJChjbGFzc3t9KTtjbGFzcyBPJCBleHRlbmRzIHgke2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5fdGFibGU9dCx0aGlzLl9zdGlja3lFbmQ9ITF9Z2V0IG5hbWUoKXtyZXR1cm4gdGhpcy5fbmFtZX1zZXQgbmFtZSh0KXt0aGlzLl9zZXROYW1lSW5wdXQodCl9Z2V0IHN0aWNreUVuZCgpe3JldHVybiB0aGlzLl9zdGlja3lFbmR9c2V0IHN0aWNreUVuZCh0KXtjb25zdCBlPXRoaXMuX3N0aWNreUVuZDt0aGlzLl9zdGlja3lFbmQ9eXoodCksdGhpcy5faGFzU3RpY2t5Q2hhbmdlZD1lIT09dGhpcy5fc3RpY2t5RW5kfV91cGRhdGVDb2x1bW5Dc3NDbGFzc05hbWUoKXt0aGlzLl9jb2x1bW5Dc3NDbGFzc05hbWU9W2BjZGstY29sdW1uLSR7dGhpcy5jc3NDbGFzc0ZyaWVuZGx5TmFtZX1gXX1fc2V0TmFtZUlucHV0KHQpe3QmJih0aGlzLl9uYW1lPXQsdGhpcy5jc3NDbGFzc0ZyaWVuZGx5TmFtZT10LnJlcGxhY2UoL1teYS16MC05Xy1dL2dpLCItIiksdGhpcy5fdXBkYXRlQ29sdW1uQ3NzQ2xhc3NOYW1lKCkpfX1PJC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8TyQpKFNtKHkkLDgpKX0sTyQuybVkaXI9bG8oe3R5cGU6TyQsc2VsZWN0b3JzOltbIiIsImNka0NvbHVtbkRlZiIsIiJdXSxjb250ZW50UXVlcmllczpmdW5jdGlvbiB0KGUsbixvKXtpZigxJmUmJigkaChvLEMkLDUpLCRoKG8sTSQsNSksJGgobyx2JCw1KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5jZWxsPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLmhlYWRlckNlbGw9dC5maXJzdCksSmgodD10YigpKSYmKG4uZm9vdGVyQ2VsbD10LmZpcnN0KX19LGlucHV0czp7c3RpY2t5OiJzdGlja3kiLG5hbWU6WyJjZGtDb2x1bW5EZWYiLCJuYW1lIl0sc3RpY2t5RW5kOiJzdGlja3lFbmQifSxmZWF0dXJlczpbcGcoW3twcm92aWRlOiJNQVRfU09SVF9IRUFERVJfQ09MVU1OX0RFRiIsdXNlRXhpc3Rpbmc6TyR9XSkseHBdfSksTyQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbeSRdfSx7dHlwZTpTcn1dfV0sTyQucHJvcERlY29yYXRvcnM9e25hbWU6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb2x1bW5EZWYiXX1dLHN0aWNreUVuZDpbe3R5cGU6eHksYXJnczpbInN0aWNreUVuZCJdfV0sY2VsbDpbe3R5cGU6cWEsYXJnczpbQyRdfV0saGVhZGVyQ2VsbDpbe3R5cGU6cWEsYXJnczpbTSRdfV0sZm9vdGVyQ2VsbDpbe3R5cGU6cWEsYXJnczpbdiRdfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoTyQsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Nka0NvbHVtbkRlZl0iLGlucHV0czpbInN0aWNreSJdLHByb3ZpZGVyczpbe3Byb3ZpZGU6Ik1BVF9TT1JUX0hFQURFUl9DT0xVTU5fREVGIix1c2VFeGlzdGluZzpPJH1dfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3kkXX0se3R5cGU6U3J9XX1dfSkse25hbWU6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb2x1bW5EZWYiXX1dLHN0aWNreUVuZDpbe3R5cGU6eHksYXJnczpbInN0aWNreUVuZCJdfV0sY2VsbDpbe3R5cGU6cWEsYXJnczpbQyRdfV0saGVhZGVyQ2VsbDpbe3R5cGU6cWEsYXJnczpbTSRdfV0sZm9vdGVyQ2VsbDpbe3R5cGU6cWEsYXJnczpbdiRdfV19KTtjbGFzcyBQJHtjb25zdHJ1Y3Rvcih0LGUpe2NvbnN0IG49ZS5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdDtmb3IoY29uc3QgZSBvZiB0Ll9jb2x1bW5Dc3NDbGFzc05hbWUpbi5hZGQoZSl9fWNsYXNzIHckIGV4dGVuZHMgUCR7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpfX13JC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8dyQpKFNtKE8kKSxTbShoZykpfSx3JC7JtWRpcj1sbyh7dHlwZTp3JCxzZWxlY3RvcnM6W1siY2RrLWhlYWRlci1jZWxsIl0sWyJ0aCIsImNkay1oZWFkZXItY2VsbCIsIiJdXSxob3N0QXR0cnM6WyJyb2xlIiwiY29sdW1uaGVhZGVyIiwxLCJjZGstaGVhZGVyLWNlbGwiXSxmZWF0dXJlczpbeHBdfSksdyQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpPJH0se3R5cGU6aGd9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHckLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6ImNkay1oZWFkZXItY2VsbCwgdGhbY2RrLWhlYWRlci1jZWxsXSIsaG9zdDp7Y2xhc3M6ImNkay1oZWFkZXItY2VsbCIscm9sZToiY29sdW1uaGVhZGVyIn19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpPJH0se3R5cGU6aGd9XX0pLG51bGwpO2NsYXNzIGskIGV4dGVuZHMgUCR7Y29uc3RydWN0b3IodCxlKXt2YXIgbjtpZihzdXBlcih0LGUpLDE9PT0obnVsbD09PShuPXQuX3RhYmxlKXx8dm9pZCAwPT09bj92b2lkIDA6bi5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lm5vZGVUeXBlKSl7Y29uc3Qgbj10Ll90YWJsZS5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgicm9sZSIpO2UubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoInJvbGUiLCJncmlkIj09PW58fCJ0cmVlZ3JpZCI9PT1uPyJncmlkY2VsbCI6ImNlbGwiKX19fWskLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxrJCkoU20oTyQpLFNtKGhnKSl9LGskLsm1ZGlyPWxvKHt0eXBlOmskLHNlbGVjdG9yczpbWyJjZGstZm9vdGVyLWNlbGwiXSxbInRkIiwiY2RrLWZvb3Rlci1jZWxsIiwiIl1dLGhvc3RBdHRyczpbMSwiY2RrLWZvb3Rlci1jZWxsIl0sZmVhdHVyZXM6W3hwXX0pLGskLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6TyR9LHt0eXBlOmhnfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChrJCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJjZGstZm9vdGVyLWNlbGwsIHRkW2Nkay1mb290ZXItY2VsbF0iLGhvc3Q6e2NsYXNzOiJjZGstZm9vdGVyLWNlbGwifX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOk8kfSx7dHlwZTpoZ31dfSksbnVsbCk7Y2xhc3MgUyQgZXh0ZW5kcyBQJHtjb25zdHJ1Y3Rvcih0LGUpe3ZhciBuO2lmKHN1cGVyKHQsZSksMT09PShudWxsPT09KG49dC5fdGFibGUpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQubm9kZVR5cGUpKXtjb25zdCBuPXQuX3RhYmxlLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCJyb2xlIik7ZS5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgicm9sZSIsImdyaWQiPT09bnx8InRyZWVncmlkIj09PW4/ImdyaWRjZWxsIjoiY2VsbCIpfX19UyQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFMkKShTbShPJCksU20oaGcpKX0sUyQuybVkaXI9bG8oe3R5cGU6UyQsc2VsZWN0b3JzOltbImNkay1jZWxsIl0sWyJ0ZCIsImNkay1jZWxsIiwiIl1dLGhvc3RBdHRyczpbMSwiY2RrLWNlbGwiXSxmZWF0dXJlczpbeHBdfSksUyQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpPJH0se3R5cGU6aGd9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFMkLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6ImNkay1jZWxsLCB0ZFtjZGstY2VsbF0iLGhvc3Q6e2NsYXNzOiJjZGstY2VsbCJ9fV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6TyR9LHt0eXBlOmhnfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIEQke2NvbnN0cnVjdG9yKCl7dGhpcy50YXNrcz1bXSx0aGlzLmVuZFRhc2tzPVtdfX1jb25zdCBFJD1uZXcgR2EoIl9DT0FMRVNDRURfU1RZTEVfU0NIRURVTEVSIik7Y2xhc3MgUiR7Y29uc3RydWN0b3IodCl7dGhpcy5fbmdab25lPXQsdGhpcy5fY3VycmVudFNjaGVkdWxlPW51bGwsdGhpcy5fZGVzdHJveWVkPW5ldyBJfXNjaGVkdWxlKHQpe3RoaXMuX2NyZWF0ZVNjaGVkdWxlSWZOZWVkZWQoKSx0aGlzLl9jdXJyZW50U2NoZWR1bGUudGFza3MucHVzaCh0KX1zY2hlZHVsZUVuZCh0KXt0aGlzLl9jcmVhdGVTY2hlZHVsZUlmTmVlZGVkKCksdGhpcy5fY3VycmVudFNjaGVkdWxlLmVuZFRhc2tzLnB1c2godCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9kZXN0cm95ZWQubmV4dCgpLHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpfV9jcmVhdGVTY2hlZHVsZUlmTmVlZGVkKCl7dGhpcy5fY3VycmVudFNjaGVkdWxlfHwodGhpcy5fY3VycmVudFNjaGVkdWxlPW5ldyBEJCx0aGlzLl9nZXRTY2hlZHVsZU9ic2VydmFibGUoKS5waXBlKEllKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoKCk9Pntmb3IoO3RoaXMuX2N1cnJlbnRTY2hlZHVsZS50YXNrcy5sZW5ndGh8fHRoaXMuX2N1cnJlbnRTY2hlZHVsZS5lbmRUYXNrcy5sZW5ndGg7KXtjb25zdCB0PXRoaXMuX2N1cnJlbnRTY2hlZHVsZTt0aGlzLl9jdXJyZW50U2NoZWR1bGU9bmV3IEQkO2Zvcihjb25zdCBlIG9mIHQudGFza3MpZSgpO2Zvcihjb25zdCBlIG9mIHQuZW5kVGFza3MpZSgpfXRoaXMuX2N1cnJlbnRTY2hlZHVsZT1udWxsfSkpKX1fZ2V0U2NoZWR1bGVPYnNlcnZhYmxlKCl7cmV0dXJuIHRoaXMuX25nWm9uZS5pc1N0YWJsZT9DdChQcm9taXNlLnJlc29sdmUodm9pZCAwKSk6dGhpcy5fbmdab25lLm9uU3RhYmxlLnBpcGUoYmUoMSkpfX1SJC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8UiQpKHZyKGFfKSl9LFIkLsm1cHJvdj1Nbih7dG9rZW46UiQsZmFjdG9yeTpSJC7JtWZhY30pLFIkLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6YV99XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFIkLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTphX31dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBBJD0iPG5nLWNvbnRhaW5lciBjZGtDZWxsT3V0bGV0PjwvbmctY29udGFpbmVyPiI7Y2xhc3MgVCR7Y29uc3RydWN0b3IodCxlKXt0aGlzLnRlbXBsYXRlPXQsdGhpcy5fZGlmZmVycz1lfW5nT25DaGFuZ2VzKHQpe2lmKCF0aGlzLl9jb2x1bW5zRGlmZmVyKXtjb25zdCBlPXQuY29sdW1ucyYmdC5jb2x1bW5zLmN1cnJlbnRWYWx1ZXx8W107dGhpcy5fY29sdW1uc0RpZmZlcj10aGlzLl9kaWZmZXJzLmZpbmQoZSkuY3JlYXRlKCksdGhpcy5fY29sdW1uc0RpZmZlci5kaWZmKGUpfX1nZXRDb2x1bW5zRGlmZigpe3JldHVybiB0aGlzLl9jb2x1bW5zRGlmZmVyLmRpZmYodGhpcy5jb2x1bW5zKX1leHRyYWN0Q2VsbFRlbXBsYXRlKHQpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgeiQ/dC5oZWFkZXJDZWxsLnRlbXBsYXRlOnRoaXMgaW5zdGFuY2VvZiBIJD90LmZvb3RlckNlbGwudGVtcGxhdGU6dC5jZWxsLnRlbXBsYXRlfX1UJC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VCQpKFNtKFhnKSxTbShIZykpfSxUJC7JtWRpcj1sbyh7dHlwZTpUJCxmZWF0dXJlczpbQm9dfSksVCQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpYZ30se3R5cGU6SGd9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFQkLFt7dHlwZTpDeX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpYZ30se3R5cGU6SGd9XX0pLG51bGwpO2NvbnN0IE4kPWIkKGNsYXNzIGV4dGVuZHMgVCR7fSk7Y2xhc3MgeiQgZXh0ZW5kcyBOJHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodCxlKSx0aGlzLl90YWJsZT1ufW5nT25DaGFuZ2VzKHQpe3N1cGVyLm5nT25DaGFuZ2VzKHQpfX16JC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8eiQpKFNtKFhnKSxTbShIZyksU20oeSQsOCkpfSx6JC7JtWRpcj1sbyh7dHlwZTp6JCxzZWxlY3RvcnM6W1siIiwiY2RrSGVhZGVyUm93RGVmIiwiIl1dLGlucHV0czp7Y29sdW1uczpbImNka0hlYWRlclJvd0RlZiIsImNvbHVtbnMiXSxzdGlja3k6WyJjZGtIZWFkZXJSb3dEZWZTdGlja3kiLCJzdGlja3kiXX0sZmVhdHVyZXM6W3hwLEJvXX0pLHokLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6WGd9LHt0eXBlOkhnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbeSRdfSx7dHlwZTpTcn1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh6JCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbY2RrSGVhZGVyUm93RGVmXSIsaW5wdXRzOlsiY29sdW1uczogY2RrSGVhZGVyUm93RGVmIiwic3RpY2t5OiBjZGtIZWFkZXJSb3dEZWZTdGlja3kiXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlhnfSx7dHlwZTpIZ30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3kkXX0se3R5cGU6U3J9XX1dfSksbnVsbCk7Y29uc3QgSSQ9YiQoY2xhc3MgZXh0ZW5kcyBUJHt9KTtjbGFzcyBIJCBleHRlbmRzIEkke2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcih0LGUpLHRoaXMuX3RhYmxlPW59bmdPbkNoYW5nZXModCl7c3VwZXIubmdPbkNoYW5nZXModCl9fUgkLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxIJCkoU20oWGcpLFNtKEhnKSxTbSh5JCw4KSl9LEgkLsm1ZGlyPWxvKHt0eXBlOkgkLHNlbGVjdG9yczpbWyIiLCJjZGtGb290ZXJSb3dEZWYiLCIiXV0saW5wdXRzOntjb2x1bW5zOlsiY2RrRm9vdGVyUm93RGVmIiwiY29sdW1ucyJdLHN0aWNreTpbImNka0Zvb3RlclJvd0RlZlN0aWNreSIsInN0aWNreSJdfSxmZWF0dXJlczpbeHAsQm9dfSksSCQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpYZ30se3R5cGU6SGd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOlt5JF19LHt0eXBlOlNyfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEgkLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IltjZGtGb290ZXJSb3dEZWZdIixpbnB1dHM6WyJjb2x1bW5zOiBjZGtGb290ZXJSb3dEZWYiLCJzdGlja3k6IGNka0Zvb3RlclJvd0RlZlN0aWNreSJdfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6WGd9LHt0eXBlOkhnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbeSRdfSx7dHlwZTpTcn1dfV19KSxudWxsKTtjbGFzcyBGJCBleHRlbmRzIFQke2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcih0LGUpLHRoaXMuX3RhYmxlPW59fUYkLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxGJCkoU20oWGcpLFNtKEhnKSxTbSh5JCw4KSl9LEYkLsm1ZGlyPWxvKHt0eXBlOkYkLHNlbGVjdG9yczpbWyIiLCJjZGtSb3dEZWYiLCIiXV0saW5wdXRzOntjb2x1bW5zOlsiY2RrUm93RGVmQ29sdW1ucyIsImNvbHVtbnMiXSx3aGVuOlsiY2RrUm93RGVmV2hlbiIsIndoZW4iXX0sZmVhdHVyZXM6W3hwXX0pLEYkLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6WGd9LHt0eXBlOkhnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbeSRdfSx7dHlwZTpTcn1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChGJCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbY2RrUm93RGVmXSIsaW5wdXRzOlsiY29sdW1uczogY2RrUm93RGVmQ29sdW1ucyIsIndoZW46IGNka1Jvd0RlZldoZW4iXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlhnfSx7dHlwZTpIZ30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3kkXX0se3R5cGU6U3J9XX1dfSksbnVsbCk7Y2xhc3MgTCR7Y29uc3RydWN0b3IodCl7dGhpcy5fdmlld0NvbnRhaW5lcj10LEwkLm1vc3RSZWNlbnRDZWxsT3V0bGV0PXRoaXN9bmdPbkRlc3Ryb3koKXtMJC5tb3N0UmVjZW50Q2VsbE91dGxldD09PXRoaXMmJihMJC5tb3N0UmVjZW50Q2VsbE91dGxldD1udWxsKX19TCQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEwkKShTbShlaCkpfSxMJC7JtWRpcj1sbyh7dHlwZTpMJCxzZWxlY3RvcnM6W1siIiwiY2RrQ2VsbE91dGxldCIsIiJdXX0pLEwkLm1vc3RSZWNlbnRDZWxsT3V0bGV0PW51bGwsTCQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTplaH1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoTCQsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Nka0NlbGxPdXRsZXRdIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmVofV19KSxudWxsKTtjbGFzcyBCJHt9QiQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEIkKX0sQiQuybVjbXA9dG8oe3R5cGU6QiQsc2VsZWN0b3JzOltbImNkay1oZWFkZXItcm93Il0sWyJ0ciIsImNkay1oZWFkZXItcm93IiwiIl1dLGhvc3RBdHRyczpbInJvbGUiLCJyb3ciLDEsImNkay1oZWFkZXItcm93Il0sZGVjbHM6MSx2YXJzOjAsY29uc3RzOltbImNka0NlbGxPdXRsZXQiLCIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmSW0oMCwwKX0sZGlyZWN0aXZlczpbTCRdLGVuY2Fwc3VsYXRpb246Mn0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQiQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiY2RrLWhlYWRlci1yb3csIHRyW2Nkay1oZWFkZXItcm93XSIsdGVtcGxhdGU6QSQsaG9zdDp7Y2xhc3M6ImNkay1oZWFkZXItcm93Iixyb2xlOiJyb3cifSxjaGFuZ2VEZXRlY3Rpb246em4uRGVmYXVsdCxlbmNhcHN1bGF0aW9uOkhuLk5vbmV9XX1dLG51bGwsbnVsbCk7Y2xhc3MgViR7fVYkLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxWJCl9LFYkLsm1Y21wPXRvKHt0eXBlOlYkLHNlbGVjdG9yczpbWyJjZGstZm9vdGVyLXJvdyJdLFsidHIiLCJjZGstZm9vdGVyLXJvdyIsIiJdXSxob3N0QXR0cnM6WyJyb2xlIiwicm93IiwxLCJjZGstZm9vdGVyLXJvdyJdLGRlY2xzOjEsdmFyczowLGNvbnN0czpbWyJjZGtDZWxsT3V0bGV0IiwiIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJkltKDAsMCl9LGRpcmVjdGl2ZXM6W0wkXSxlbmNhcHN1bGF0aW9uOjJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFYkLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImNkay1mb290ZXItcm93LCB0cltjZGstZm9vdGVyLXJvd10iLHRlbXBsYXRlOkEkLGhvc3Q6e2NsYXNzOiJjZGstZm9vdGVyLXJvdyIscm9sZToicm93In0sY2hhbmdlRGV0ZWN0aW9uOnpuLkRlZmF1bHQsZW5jYXBzdWxhdGlvbjpIbi5Ob25lfV19XSxudWxsLG51bGwpO2NsYXNzIGoke31qJC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8aiQpfSxqJC7JtWNtcD10byh7dHlwZTpqJCxzZWxlY3RvcnM6W1siY2RrLXJvdyJdLFsidHIiLCJjZGstcm93IiwiIl1dLGhvc3RBdHRyczpbInJvbGUiLCJyb3ciLDEsImNkay1yb3ciXSxkZWNsczoxLHZhcnM6MCxjb25zdHM6W1siY2RrQ2VsbE91dGxldCIsIiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiZJbSgwLDApfSxkaXJlY3RpdmVzOltMJF0sZW5jYXBzdWxhdGlvbjoyfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChqJCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJjZGstcm93LCB0cltjZGstcm93XSIsdGVtcGxhdGU6QSQsaG9zdDp7Y2xhc3M6ImNkay1yb3ciLHJvbGU6InJvdyJ9LGNoYW5nZURldGVjdGlvbjp6bi5EZWZhdWx0LGVuY2Fwc3VsYXRpb246SG4uTm9uZX1dfV0sbnVsbCxudWxsKTtjbGFzcyBVJHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnRlbXBsYXRlUmVmPXR9fVUkLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxVJCkoU20oWGcpKX0sVSQuybVkaXI9bG8oe3R5cGU6VSQsc2VsZWN0b3JzOltbIm5nLXRlbXBsYXRlIiwiY2RrTm9EYXRhUm93IiwiIl1dfSksVSQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpYZ31dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoVSQsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoibmctdGVtcGxhdGVbY2RrTm9EYXRhUm93XSJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpYZ31dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBHJD1bInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCJdO2NsYXNzIFcke2NvbnN0cnVjdG9yKHQsZSxuLG8saT0hMCxhPSEwLHIpe3RoaXMuX2lzTmF0aXZlSHRtbFRhYmxlPXQsdGhpcy5fc3RpY2tDZWxsQ3NzPWUsdGhpcy5kaXJlY3Rpb249bix0aGlzLl9jb2FsZXNjZWRTdHlsZVNjaGVkdWxlcj1vLHRoaXMuX2lzQnJvd3Nlcj1pLHRoaXMuX25lZWRzUG9zaXRpb25TdGlja3lPbkVsZW1lbnQ9YSx0aGlzLl9wb3NpdGlvbkxpc3RlbmVyPXIsdGhpcy5fY2FjaGVkQ2VsbFdpZHRocz1bXSx0aGlzLl9ib3JkZXJDZWxsQ3NzPXt0b3A6YCR7ZX0tYm9yZGVyLWVsZW0tdG9wYCxib3R0b206YCR7ZX0tYm9yZGVyLWVsZW0tYm90dG9tYCxsZWZ0OmAke2V9LWJvcmRlci1lbGVtLWxlZnRgLHJpZ2h0OmAke2V9LWJvcmRlci1lbGVtLXJpZ2h0YH19Y2xlYXJTdGlja3lQb3NpdGlvbmluZyh0LGUpe2NvbnN0IG49W107Zm9yKGNvbnN0IGUgb2YgdClpZihlLm5vZGVUeXBlPT09ZS5FTEVNRU5UX05PREUpe24ucHVzaChlKTtmb3IobGV0IHQ9MDt0PGUuY2hpbGRyZW4ubGVuZ3RoO3QrKyluLnB1c2goZS5jaGlsZHJlblt0XSl9dGhpcy5fY29hbGVzY2VkU3R5bGVTY2hlZHVsZXIuc2NoZWR1bGUoKCgpPT57Zm9yKGNvbnN0IHQgb2Ygbil0aGlzLl9yZW1vdmVTdGlja3lTdHlsZSh0LGUpfSkpfXVwZGF0ZVN0aWNreUNvbHVtbnModCxlLG4sbz0hMCl7aWYoIXQubGVuZ3RofHwhdGhpcy5faXNCcm93c2VyfHwhZS5zb21lKCh0PT50KSkmJiFuLnNvbWUoKHQ9PnQpKSlyZXR1cm4gdm9pZCh0aGlzLl9wb3NpdGlvbkxpc3RlbmVyJiYodGhpcy5fcG9zaXRpb25MaXN0ZW5lci5zdGlja3lDb2x1bW5zVXBkYXRlZCh7c2l6ZXM6W119KSx0aGlzLl9wb3NpdGlvbkxpc3RlbmVyLnN0aWNreUVuZENvbHVtbnNVcGRhdGVkKHtzaXplczpbXX0pKSk7Y29uc3QgaT10WzBdLGE9aS5jaGlsZHJlbi5sZW5ndGgscj10aGlzLl9nZXRDZWxsV2lkdGhzKGksbykscz10aGlzLl9nZXRTdGlja3lTdGFydENvbHVtblBvc2l0aW9ucyhyLGUpLGw9dGhpcy5fZ2V0U3RpY2t5RW5kQ29sdW1uUG9zaXRpb25zKHIsbiksYz1lLmxhc3RJbmRleE9mKCEwKSxkPW4uaW5kZXhPZighMCk7dGhpcy5fY29hbGVzY2VkU3R5bGVTY2hlZHVsZXIuc2NoZWR1bGUoKCgpPT57Y29uc3Qgbz0icnRsIj09PXRoaXMuZGlyZWN0aW9uLGk9bz8icmlnaHQiOiJsZWZ0IixwPW8/ImxlZnQiOiJyaWdodCI7Zm9yKGNvbnN0IG8gb2YgdClmb3IobGV0IHQ9MDt0PGE7dCsrKXtjb25zdCBhPW8uY2hpbGRyZW5bdF07ZVt0XSYmdGhpcy5fYWRkU3RpY2t5U3R5bGUoYSxpLHNbdF0sdD09PWMpLG5bdF0mJnRoaXMuX2FkZFN0aWNreVN0eWxlKGEscCxsW3RdLHQ9PT1kKX10aGlzLl9wb3NpdGlvbkxpc3RlbmVyJiYodGhpcy5fcG9zaXRpb25MaXN0ZW5lci5zdGlja3lDb2x1bW5zVXBkYXRlZCh7c2l6ZXM6LTE9PT1jP1tdOnIuc2xpY2UoMCxjKzEpLm1hcCgoKHQsbik9PmVbbl0/dDpudWxsKSl9KSx0aGlzLl9wb3NpdGlvbkxpc3RlbmVyLnN0aWNreUVuZENvbHVtbnNVcGRhdGVkKHtzaXplczotMT09PWQ/W106ci5zbGljZShkKS5tYXAoKCh0LGUpPT5uW2UrZF0/dDpudWxsKSkucmV2ZXJzZSgpfSkpfSkpfXN0aWNrUm93cyh0LGUsbil7aWYoIXRoaXMuX2lzQnJvd3NlcilyZXR1cm47Y29uc3Qgbz0iYm90dG9tIj09PW4/dC5zbGljZSgpLnJldmVyc2UoKTp0LGk9ImJvdHRvbSI9PT1uP2Uuc2xpY2UoKS5yZXZlcnNlKCk6ZSxhPVtdLHI9W10scz1bXTtmb3IobGV0IHQ9MCxlPTA7dDxvLmxlbmd0aDt0Kyspe2lmKCFpW3RdKWNvbnRpbnVlO2FbdF09ZTtjb25zdCBuPW9bdF07c1t0XT10aGlzLl9pc05hdGl2ZUh0bWxUYWJsZT9BcnJheS5mcm9tKG4uY2hpbGRyZW4pOltuXTtjb25zdCBsPW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O2UrPWwsclt0XT1sfWNvbnN0IGw9aS5sYXN0SW5kZXhPZighMCk7dGhpcy5fY29hbGVzY2VkU3R5bGVTY2hlZHVsZXIuc2NoZWR1bGUoKCgpPT57dmFyIHQsZTtmb3IobGV0IHQ9MDt0PG8ubGVuZ3RoO3QrKyl7aWYoIWlbdF0pY29udGludWU7Y29uc3QgZT1hW3RdLG89dD09PWw7Zm9yKGNvbnN0IGkgb2Ygc1t0XSl0aGlzLl9hZGRTdGlja3lTdHlsZShpLG4sZSxvKX0idG9wIj09PW4/bnVsbD09PSh0PXRoaXMuX3Bvc2l0aW9uTGlzdGVuZXIpfHx2b2lkIDA9PT10fHx0LnN0aWNreUhlYWRlclJvd3NVcGRhdGVkKHtzaXplczpyLG9mZnNldHM6YSxlbGVtZW50czpzfSk6bnVsbD09PShlPXRoaXMuX3Bvc2l0aW9uTGlzdGVuZXIpfHx2b2lkIDA9PT1lfHxlLnN0aWNreUZvb3RlclJvd3NVcGRhdGVkKHtzaXplczpyLG9mZnNldHM6YSxlbGVtZW50czpzfSl9KSl9dXBkYXRlU3RpY2t5Rm9vdGVyQ29udGFpbmVyKHQsZSl7aWYoIXRoaXMuX2lzTmF0aXZlSHRtbFRhYmxlKXJldHVybjtjb25zdCBuPXQucXVlcnlTZWxlY3RvcigidGZvb3QiKTt0aGlzLl9jb2FsZXNjZWRTdHlsZVNjaGVkdWxlci5zY2hlZHVsZSgoKCk9PntlLnNvbWUoKHQ9PiF0KSk/dGhpcy5fcmVtb3ZlU3RpY2t5U3R5bGUobixbImJvdHRvbSJdKTp0aGlzLl9hZGRTdGlja3lTdHlsZShuLCJib3R0b20iLDAsITEpfSkpfV9yZW1vdmVTdGlja3lTdHlsZSh0LGUpe2Zvcihjb25zdCBuIG9mIGUpdC5zdHlsZVtuXT0iIix0LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fYm9yZGVyQ2VsbENzc1tuXSk7RyQuc29tZSgobj0+LTE9PT1lLmluZGV4T2YobikmJnQuc3R5bGVbbl0pKT90LnN0eWxlLnpJbmRleD10aGlzLl9nZXRDYWxjdWxhdGVkWkluZGV4KHQpOih0LnN0eWxlLnpJbmRleD0iIix0aGlzLl9uZWVkc1Bvc2l0aW9uU3RpY2t5T25FbGVtZW50JiYodC5zdHlsZS5wb3NpdGlvbj0iIiksdC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX3N0aWNrQ2VsbENzcykpfV9hZGRTdGlja3lTdHlsZSh0LGUsbixvKXt0LmNsYXNzTGlzdC5hZGQodGhpcy5fc3RpY2tDZWxsQ3NzKSxvJiZ0LmNsYXNzTGlzdC5hZGQodGhpcy5fYm9yZGVyQ2VsbENzc1tlXSksdC5zdHlsZVtlXT1gJHtufXB4YCx0LnN0eWxlLnpJbmRleD10aGlzLl9nZXRDYWxjdWxhdGVkWkluZGV4KHQpLHRoaXMuX25lZWRzUG9zaXRpb25TdGlja3lPbkVsZW1lbnQmJih0LnN0eWxlLmNzc1RleHQrPSJwb3NpdGlvbjogLXdlYmtpdC1zdGlja3k7IHBvc2l0aW9uOiBzdGlja3k7ICIpfV9nZXRDYWxjdWxhdGVkWkluZGV4KHQpe2NvbnN0IGU9e3RvcDoxMDAsYm90dG9tOjEwLGxlZnQ6MSxyaWdodDoxfTtsZXQgbj0wO2Zvcihjb25zdCBvIG9mIEckKXQuc3R5bGVbb10mJihuKz1lW29dKTtyZXR1cm4gbj9gJHtufWA6IiJ9X2dldENlbGxXaWR0aHModCxlPSEwKXtpZighZSYmdGhpcy5fY2FjaGVkQ2VsbFdpZHRocy5sZW5ndGgpcmV0dXJuIHRoaXMuX2NhY2hlZENlbGxXaWR0aHM7Y29uc3Qgbj1bXSxvPXQuY2hpbGRyZW47Zm9yKGxldCB0PTA7dDxvLmxlbmd0aDt0Kyspbi5wdXNoKG9bdF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpO3JldHVybiB0aGlzLl9jYWNoZWRDZWxsV2lkdGhzPW4sbn1fZ2V0U3RpY2t5U3RhcnRDb2x1bW5Qb3NpdGlvbnModCxlKXtjb25zdCBuPVtdO2xldCBvPTA7Zm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspZVtpXSYmKG5baV09byxvKz10W2ldKTtyZXR1cm4gbn1fZ2V0U3RpY2t5RW5kQ29sdW1uUG9zaXRpb25zKHQsZSl7Y29uc3Qgbj1bXTtsZXQgbz0wO2ZvcihsZXQgaT10Lmxlbmd0aDtpPjA7aS0tKWVbaV0mJihuW2ldPW8sbys9dFtpXSk7cmV0dXJuIG59fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBZJCh0KXtyZXR1cm4gRXJyb3IoYENvdWxkIG5vdCBmaW5kIGNvbHVtbiB3aXRoIGlkICIke3R9Ii5gKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IHEkPW5ldyBHYSgiQ0RLX1NQTCIpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBaJHt9WiQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFokKX0sWiQuybVkaXI9bG8oe3R5cGU6WiQsc2VsZWN0b3JzOltbImNkay10YWJsZSIsInJlY3ljbGVSb3dzIiwiIl0sWyJ0YWJsZSIsImNkay10YWJsZSIsIiIsInJlY3ljbGVSb3dzIiwiIl1dLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6YUYsdXNlQ2xhc3M6bkZ9XSldfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChaJCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJjZGstdGFibGVbcmVjeWNsZVJvd3NdLCB0YWJsZVtjZGstdGFibGVdW3JlY3ljbGVSb3dzXSIscHJvdmlkZXJzOlt7cHJvdmlkZTphRix1c2VDbGFzczpuRn1dfV19XSxudWxsLG51bGwpO2NsYXNzIFgke2NvbnN0cnVjdG9yKHQsZSl7dGhpcy52aWV3Q29udGFpbmVyPXQsdGhpcy5lbGVtZW50UmVmPWV9fVgkLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxYJCkoU20oZWgpLFNtKGhnKSl9LFgkLsm1ZGlyPWxvKHt0eXBlOlgkLHNlbGVjdG9yczpbWyIiLCJyb3dPdXRsZXQiLCIiXV19KSxYJC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmVofSx7dHlwZTpoZ31dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWCQsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW3Jvd091dGxldF0ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6ZWh9LHt0eXBlOmhnfV19KSxudWxsKTtjbGFzcyBLJHtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMudmlld0NvbnRhaW5lcj10LHRoaXMuZWxlbWVudFJlZj1lfX1LJC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SyQpKFNtKGVoKSxTbShoZykpfSxLJC7JtWRpcj1sbyh7dHlwZTpLJCxzZWxlY3RvcnM6W1siIiwiaGVhZGVyUm93T3V0bGV0IiwiIl1dfSksSyQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTplaH0se3R5cGU6aGd9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEskLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IltoZWFkZXJSb3dPdXRsZXRdIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmVofSx7dHlwZTpoZ31dfSksbnVsbCk7Y2xhc3MgSiR7Y29uc3RydWN0b3IodCxlKXt0aGlzLnZpZXdDb250YWluZXI9dCx0aGlzLmVsZW1lbnRSZWY9ZX19SiQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEokKShTbShlaCksU20oaGcpKX0sSiQuybVkaXI9bG8oe3R5cGU6SiQsc2VsZWN0b3JzOltbIiIsImZvb3RlclJvd091dGxldCIsIiJdXX0pLEokLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6ZWh9LHt0eXBlOmhnfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChKJCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbZm9vdGVyUm93T3V0bGV0XSJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTplaH0se3R5cGU6aGd9XX0pLG51bGwpO2NsYXNzIFEke2NvbnN0cnVjdG9yKHQsZSl7dGhpcy52aWV3Q29udGFpbmVyPXQsdGhpcy5lbGVtZW50UmVmPWV9fVEkLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxRJCkoU20oZWgpLFNtKGhnKSl9LFEkLsm1ZGlyPWxvKHt0eXBlOlEkLHNlbGVjdG9yczpbWyIiLCJub0RhdGFSb3dPdXRsZXQiLCIiXV19KSxRJC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmVofSx7dHlwZTpoZ31dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUSQsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW25vRGF0YVJvd091dGxldF0ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6ZWh9LHt0eXBlOmhnfV19KSxudWxsKTtjb25zdCAkJD0nXG4gIDxuZy1jb250ZW50IHNlbGVjdD0iY2FwdGlvbiI+PC9uZy1jb250ZW50PlxuICA8bmctY29udGVudCBzZWxlY3Q9ImNvbGdyb3VwLCBjb2wiPjwvbmctY29udGVudD5cbiAgPG5nLWNvbnRhaW5lciBoZWFkZXJSb3dPdXRsZXQ+PC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgcm93T3V0bGV0PjwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyIG5vRGF0YVJvd091dGxldD48L25nLWNvbnRhaW5lcj5cbiAgPG5nLWNvbnRhaW5lciBmb290ZXJSb3dPdXRsZXQ+PC9uZy1jb250YWluZXI+XG4nO2NsYXNzIHQwe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIscyxsLGMsZCl7dGhpcy5fZGlmZmVycz10LHRoaXMuX2NoYW5nZURldGVjdG9yUmVmPWUsdGhpcy5fZWxlbWVudFJlZj1uLHRoaXMuX2Rpcj1pLHRoaXMuX3BsYXRmb3JtPXIsdGhpcy5fdmlld1JlcGVhdGVyPXMsdGhpcy5fY29hbGVzY2VkU3R5bGVTY2hlZHVsZXI9bCx0aGlzLl92aWV3cG9ydFJ1bGVyPWMsdGhpcy5fc3RpY2t5UG9zaXRpb25pbmdMaXN0ZW5lcj1kLHRoaXMuX29uRGVzdHJveT1uZXcgSSx0aGlzLl9jb2x1bW5EZWZzQnlOYW1lPW5ldyBNYXAsdGhpcy5fY3VzdG9tQ29sdW1uRGVmcz1uZXcgU2V0LHRoaXMuX2N1c3RvbVJvd0RlZnM9bmV3IFNldCx0aGlzLl9jdXN0b21IZWFkZXJSb3dEZWZzPW5ldyBTZXQsdGhpcy5fY3VzdG9tRm9vdGVyUm93RGVmcz1uZXcgU2V0LHRoaXMuX2hlYWRlclJvd0RlZkNoYW5nZWQ9ITAsdGhpcy5fZm9vdGVyUm93RGVmQ2hhbmdlZD0hMCx0aGlzLl9zdGlja3lDb2x1bW5TdHlsZXNOZWVkUmVzZXQ9ITAsdGhpcy5fZm9yY2VSZWNhbGN1bGF0ZUNlbGxXaWR0aHM9ITAsdGhpcy5fY2FjaGVkUmVuZGVyUm93c01hcD1uZXcgTWFwLHRoaXMuc3RpY2t5Q3NzQ2xhc3M9ImNkay10YWJsZS1zdGlja3kiLHRoaXMubmVlZHNQb3NpdGlvblN0aWNreU9uRWxlbWVudD0hMCx0aGlzLl9pc1Nob3dpbmdOb0RhdGFSb3c9ITEsdGhpcy5fbXVsdGlUZW1wbGF0ZURhdGFSb3dzPSExLHRoaXMuX2ZpeGVkTGF5b3V0PSExLHRoaXMuY29udGVudENoYW5nZWQ9bmV3IExoLHRoaXMudmlld0NoYW5nZT1uZXcgRih7c3RhcnQ6MCxlbmQ6TnVtYmVyLk1BWF9WQUxVRX0pLG98fHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoInJvbGUiLCJ0YWJsZSIpLHRoaXMuX2RvY3VtZW50PWEsdGhpcy5faXNOYXRpdmVIdG1sVGFibGU9IlRBQkxFIj09PXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5ub2RlTmFtZX1nZXQgdHJhY2tCeSgpe3JldHVybiB0aGlzLl90cmFja0J5Rm59c2V0IHRyYWNrQnkodCl7InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0Rldk1vZGUmJiFuZ0Rldk1vZGV8fG51bGw9PXR8fCJmdW5jdGlvbiI9PXR5cGVvZiB0fHxjb25zb2xlLndhcm4oYHRyYWNrQnkgbXVzdCBiZSBhIGZ1bmN0aW9uLCBidXQgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeSh0KX0uYCksdGhpcy5fdHJhY2tCeUZuPXR9Z2V0IGRhdGFTb3VyY2UoKXtyZXR1cm4gdGhpcy5fZGF0YVNvdXJjZX1zZXQgZGF0YVNvdXJjZSh0KXt0aGlzLl9kYXRhU291cmNlIT09dCYmdGhpcy5fc3dpdGNoRGF0YVNvdXJjZSh0KX1nZXQgbXVsdGlUZW1wbGF0ZURhdGFSb3dzKCl7cmV0dXJuIHRoaXMuX211bHRpVGVtcGxhdGVEYXRhUm93c31zZXQgbXVsdGlUZW1wbGF0ZURhdGFSb3dzKHQpe3RoaXMuX211bHRpVGVtcGxhdGVEYXRhUm93cz15eih0KSx0aGlzLl9yb3dPdXRsZXQmJnRoaXMuX3Jvd091dGxldC52aWV3Q29udGFpbmVyLmxlbmd0aCYmKHRoaXMuX2ZvcmNlUmVuZGVyRGF0YVJvd3MoKSx0aGlzLnVwZGF0ZVN0aWNreUNvbHVtblN0eWxlcygpKX1nZXQgZml4ZWRMYXlvdXQoKXtyZXR1cm4gdGhpcy5fZml4ZWRMYXlvdXR9c2V0IGZpeGVkTGF5b3V0KHQpe3RoaXMuX2ZpeGVkTGF5b3V0PXl6KHQpLHRoaXMuX2ZvcmNlUmVjYWxjdWxhdGVDZWxsV2lkdGhzPSEwLHRoaXMuX3N0aWNreUNvbHVtblN0eWxlc05lZWRSZXNldD0hMH1uZ09uSW5pdCgpe3RoaXMuX3NldHVwU3RpY2t5U3R5bGVyKCksdGhpcy5faXNOYXRpdmVIdG1sVGFibGUmJnRoaXMuX2FwcGx5TmF0aXZlVGFibGVTZWN0aW9ucygpLHRoaXMuX2RhdGFEaWZmZXI9dGhpcy5fZGlmZmVycy5maW5kKFtdKS5jcmVhdGUoKCh0LGUpPT50aGlzLnRyYWNrQnk/dGhpcy50cmFja0J5KGUuZGF0YUluZGV4LGUuZGF0YSk6ZSkpLHRoaXMuX3ZpZXdwb3J0UnVsZXIuY2hhbmdlKCkucGlwZShJZSh0aGlzLl9vbkRlc3Ryb3kpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fZm9yY2VSZWNhbGN1bGF0ZUNlbGxXaWR0aHM9ITB9KSl9bmdBZnRlckNvbnRlbnRDaGVja2VkKCl7aWYodGhpcy5fY2FjaGVSb3dEZWZzKCksdGhpcy5fY2FjaGVDb2x1bW5EZWZzKCksIXRoaXMuX2hlYWRlclJvd0RlZnMubGVuZ3RoJiYhdGhpcy5fZm9vdGVyUm93RGVmcy5sZW5ndGgmJiF0aGlzLl9yb3dEZWZzLmxlbmd0aCYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93KGZ1bmN0aW9uIHQoKXtyZXR1cm4gRXJyb3IoIk1pc3NpbmcgZGVmaW5pdGlvbnMgZm9yIGhlYWRlciwgZm9vdGVyLCBhbmQgcm93OyBjYW5ub3QgZGV0ZXJtaW5lIHdoaWNoIGNvbHVtbnMgc2hvdWxkIGJlIHJlbmRlcmVkLiIpfSkoKTtjb25zdCBlPXRoaXMuX3JlbmRlclVwZGF0ZWRDb2x1bW5zKCl8fHRoaXMuX2hlYWRlclJvd0RlZkNoYW5nZWR8fHRoaXMuX2Zvb3RlclJvd0RlZkNoYW5nZWQ7dGhpcy5fc3RpY2t5Q29sdW1uU3R5bGVzTmVlZFJlc2V0PXRoaXMuX3N0aWNreUNvbHVtblN0eWxlc05lZWRSZXNldHx8ZSx0aGlzLl9mb3JjZVJlY2FsY3VsYXRlQ2VsbFdpZHRocz1lLHRoaXMuX2hlYWRlclJvd0RlZkNoYW5nZWQmJih0aGlzLl9mb3JjZVJlbmRlckhlYWRlclJvd3MoKSx0aGlzLl9oZWFkZXJSb3dEZWZDaGFuZ2VkPSExKSx0aGlzLl9mb290ZXJSb3dEZWZDaGFuZ2VkJiYodGhpcy5fZm9yY2VSZW5kZXJGb290ZXJSb3dzKCksdGhpcy5fZm9vdGVyUm93RGVmQ2hhbmdlZD0hMSksdGhpcy5kYXRhU291cmNlJiZ0aGlzLl9yb3dEZWZzLmxlbmd0aD4wJiYhdGhpcy5fcmVuZGVyQ2hhbmdlU3Vic2NyaXB0aW9uP3RoaXMuX29ic2VydmVSZW5kZXJDaGFuZ2VzKCk6dGhpcy5fc3RpY2t5Q29sdW1uU3R5bGVzTmVlZFJlc2V0JiZ0aGlzLnVwZGF0ZVN0aWNreUNvbHVtblN0eWxlcygpLHRoaXMuX2NoZWNrU3RpY2t5U3RhdGVzKCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9yb3dPdXRsZXQudmlld0NvbnRhaW5lci5jbGVhcigpLHRoaXMuX25vRGF0YVJvd091dGxldC52aWV3Q29udGFpbmVyLmNsZWFyKCksdGhpcy5faGVhZGVyUm93T3V0bGV0LnZpZXdDb250YWluZXIuY2xlYXIoKSx0aGlzLl9mb290ZXJSb3dPdXRsZXQudmlld0NvbnRhaW5lci5jbGVhcigpLHRoaXMuX2NhY2hlZFJlbmRlclJvd3NNYXAuY2xlYXIoKSx0aGlzLl9vbkRlc3Ryb3kubmV4dCgpLHRoaXMuX29uRGVzdHJveS5jb21wbGV0ZSgpLCRIKHRoaXMuZGF0YVNvdXJjZSkmJnRoaXMuZGF0YVNvdXJjZS5kaXNjb25uZWN0KHRoaXMpfXJlbmRlclJvd3MoKXt0aGlzLl9yZW5kZXJSb3dzPXRoaXMuX2dldEFsbFJlbmRlclJvd3MoKTtjb25zdCB0PXRoaXMuX2RhdGFEaWZmZXIuZGlmZih0aGlzLl9yZW5kZXJSb3dzKTtpZighdClyZXR1cm4gdGhpcy5fdXBkYXRlTm9EYXRhUm93KCksdm9pZCB0aGlzLmNvbnRlbnRDaGFuZ2VkLm5leHQoKTtjb25zdCBlPXRoaXMuX3Jvd091dGxldC52aWV3Q29udGFpbmVyO3RoaXMuX3ZpZXdSZXBlYXRlci5hcHBseUNoYW5nZXModCxlLCgodCxlLG4pPT50aGlzLl9nZXRFbWJlZGRlZFZpZXdBcmdzKHQuaXRlbSxuKSksKHQ9PnQuaXRlbS5kYXRhKSwodD0+ezE9PT10Lm9wZXJhdGlvbiYmdC5jb250ZXh0JiZ0aGlzLl9yZW5kZXJDZWxsVGVtcGxhdGVGb3JJdGVtKHQucmVjb3JkLml0ZW0ucm93RGVmLHQuY29udGV4dCl9KSksdGhpcy5fdXBkYXRlUm93SW5kZXhDb250ZXh0KCksdC5mb3JFYWNoSWRlbnRpdHlDaGFuZ2UoKHQ9PntlLmdldCh0LmN1cnJlbnRJbmRleCkuY29udGV4dC4kaW1wbGljaXQ9dC5pdGVtLmRhdGF9KSksdGhpcy5fdXBkYXRlTm9EYXRhUm93KCksdGhpcy51cGRhdGVTdGlja3lDb2x1bW5TdHlsZXMoKSx0aGlzLmNvbnRlbnRDaGFuZ2VkLm5leHQoKX1hZGRDb2x1bW5EZWYodCl7dGhpcy5fY3VzdG9tQ29sdW1uRGVmcy5hZGQodCl9cmVtb3ZlQ29sdW1uRGVmKHQpe3RoaXMuX2N1c3RvbUNvbHVtbkRlZnMuZGVsZXRlKHQpfWFkZFJvd0RlZih0KXt0aGlzLl9jdXN0b21Sb3dEZWZzLmFkZCh0KX1yZW1vdmVSb3dEZWYodCl7dGhpcy5fY3VzdG9tUm93RGVmcy5kZWxldGUodCl9YWRkSGVhZGVyUm93RGVmKHQpe3RoaXMuX2N1c3RvbUhlYWRlclJvd0RlZnMuYWRkKHQpLHRoaXMuX2hlYWRlclJvd0RlZkNoYW5nZWQ9ITB9cmVtb3ZlSGVhZGVyUm93RGVmKHQpe3RoaXMuX2N1c3RvbUhlYWRlclJvd0RlZnMuZGVsZXRlKHQpLHRoaXMuX2hlYWRlclJvd0RlZkNoYW5nZWQ9ITB9YWRkRm9vdGVyUm93RGVmKHQpe3RoaXMuX2N1c3RvbUZvb3RlclJvd0RlZnMuYWRkKHQpLHRoaXMuX2Zvb3RlclJvd0RlZkNoYW5nZWQ9ITB9cmVtb3ZlRm9vdGVyUm93RGVmKHQpe3RoaXMuX2N1c3RvbUZvb3RlclJvd0RlZnMuZGVsZXRlKHQpLHRoaXMuX2Zvb3RlclJvd0RlZkNoYW5nZWQ9ITB9c2V0Tm9EYXRhUm93KHQpe3RoaXMuX2N1c3RvbU5vRGF0YVJvdz10fXVwZGF0ZVN0aWNreUhlYWRlclJvd1N0eWxlcygpe2NvbnN0IHQ9dGhpcy5fZ2V0UmVuZGVyZWRSb3dzKHRoaXMuX2hlYWRlclJvd091dGxldCksZT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigidGhlYWQiKTtlJiYoZS5zdHlsZS5kaXNwbGF5PXQubGVuZ3RoPyIiOiJub25lIik7Y29uc3Qgbj10aGlzLl9oZWFkZXJSb3dEZWZzLm1hcCgodD0+dC5zdGlja3kpKTt0aGlzLl9zdGlja3lTdHlsZXIuY2xlYXJTdGlja3lQb3NpdGlvbmluZyh0LFsidG9wIl0pLHRoaXMuX3N0aWNreVN0eWxlci5zdGlja1Jvd3ModCxuLCJ0b3AiKSx0aGlzLl9oZWFkZXJSb3dEZWZzLmZvckVhY2goKHQ9PnQucmVzZXRTdGlja3lDaGFuZ2VkKCkpKX11cGRhdGVTdGlja3lGb290ZXJSb3dTdHlsZXMoKXtjb25zdCB0PXRoaXMuX2dldFJlbmRlcmVkUm93cyh0aGlzLl9mb290ZXJSb3dPdXRsZXQpLGU9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoInRmb290Iik7ZSYmKGUuc3R5bGUuZGlzcGxheT10Lmxlbmd0aD8iIjoibm9uZSIpO2NvbnN0IG49dGhpcy5fZm9vdGVyUm93RGVmcy5tYXAoKHQ9PnQuc3RpY2t5KSk7dGhpcy5fc3RpY2t5U3R5bGVyLmNsZWFyU3RpY2t5UG9zaXRpb25pbmcodCxbImJvdHRvbSJdKSx0aGlzLl9zdGlja3lTdHlsZXIuc3RpY2tSb3dzKHQsbiwiYm90dG9tIiksdGhpcy5fc3RpY2t5U3R5bGVyLnVwZGF0ZVN0aWNreUZvb3RlckNvbnRhaW5lcih0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsbiksdGhpcy5fZm9vdGVyUm93RGVmcy5mb3JFYWNoKCh0PT50LnJlc2V0U3RpY2t5Q2hhbmdlZCgpKSl9dXBkYXRlU3RpY2t5Q29sdW1uU3R5bGVzKCl7Y29uc3QgdD10aGlzLl9nZXRSZW5kZXJlZFJvd3ModGhpcy5faGVhZGVyUm93T3V0bGV0KSxlPXRoaXMuX2dldFJlbmRlcmVkUm93cyh0aGlzLl9yb3dPdXRsZXQpLG49dGhpcy5fZ2V0UmVuZGVyZWRSb3dzKHRoaXMuX2Zvb3RlclJvd091dGxldCk7KHRoaXMuX2lzTmF0aXZlSHRtbFRhYmxlJiYhdGhpcy5fZml4ZWRMYXlvdXR8fHRoaXMuX3N0aWNreUNvbHVtblN0eWxlc05lZWRSZXNldCkmJih0aGlzLl9zdGlja3lTdHlsZXIuY2xlYXJTdGlja3lQb3NpdGlvbmluZyhbLi4udCwuLi5lLC4uLm5dLFsibGVmdCIsInJpZ2h0Il0pLHRoaXMuX3N0aWNreUNvbHVtblN0eWxlc05lZWRSZXNldD0hMSksdC5mb3JFYWNoKCgodCxlKT0+e3RoaXMuX2FkZFN0aWNreUNvbHVtblN0eWxlcyhbdF0sdGhpcy5faGVhZGVyUm93RGVmc1tlXSl9KSksdGhpcy5fcm93RGVmcy5mb3JFYWNoKCh0PT57Y29uc3Qgbj1bXTtmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rKyl0aGlzLl9yZW5kZXJSb3dzW29dLnJvd0RlZj09PXQmJm4ucHVzaChlW29dKTt0aGlzLl9hZGRTdGlja3lDb2x1bW5TdHlsZXMobix0KX0pKSxuLmZvckVhY2goKCh0LGUpPT57dGhpcy5fYWRkU3RpY2t5Q29sdW1uU3R5bGVzKFt0XSx0aGlzLl9mb290ZXJSb3dEZWZzW2VdKX0pKSxBcnJheS5mcm9tKHRoaXMuX2NvbHVtbkRlZnNCeU5hbWUudmFsdWVzKCkpLmZvckVhY2goKHQ9PnQucmVzZXRTdGlja3lDaGFuZ2VkKCkpKX1fZ2V0QWxsUmVuZGVyUm93cygpe2NvbnN0IHQ9W10sZT10aGlzLl9jYWNoZWRSZW5kZXJSb3dzTWFwO3RoaXMuX2NhY2hlZFJlbmRlclJvd3NNYXA9bmV3IE1hcDtmb3IobGV0IG49MDtuPHRoaXMuX2RhdGEubGVuZ3RoO24rKyl7bGV0IG89dGhpcy5fZGF0YVtuXTtjb25zdCBpPXRoaXMuX2dldFJlbmRlclJvd3NGb3JEYXRhKG8sbixlLmdldChvKSk7dGhpcy5fY2FjaGVkUmVuZGVyUm93c01hcC5oYXMobyl8fHRoaXMuX2NhY2hlZFJlbmRlclJvd3NNYXAuc2V0KG8sbmV3IFdlYWtNYXApO2ZvcihsZXQgZT0wO2U8aS5sZW5ndGg7ZSsrKXtsZXQgbj1pW2VdO2NvbnN0IG89dGhpcy5fY2FjaGVkUmVuZGVyUm93c01hcC5nZXQobi5kYXRhKTtvLmhhcyhuLnJvd0RlZik/by5nZXQobi5yb3dEZWYpLnB1c2gobik6by5zZXQobi5yb3dEZWYsW25dKSx0LnB1c2gobil9fXJldHVybiB0fV9nZXRSZW5kZXJSb3dzRm9yRGF0YSh0LGUsbil7cmV0dXJuIHRoaXMuX2dldFJvd0RlZnModCxlKS5tYXAoKG89Pntjb25zdCBpPW4mJm4uaGFzKG8pP24uZ2V0KG8pOltdO2lmKGkubGVuZ3RoKXtjb25zdCB0PWkuc2hpZnQoKTtyZXR1cm4gdC5kYXRhSW5kZXg9ZSx0fXJldHVybntkYXRhOnQscm93RGVmOm8sZGF0YUluZGV4OmV9fSkpfV9jYWNoZUNvbHVtbkRlZnMoKXt0aGlzLl9jb2x1bW5EZWZzQnlOYW1lLmNsZWFyKCksZTAodGhpcy5fZ2V0T3duRGVmcyh0aGlzLl9jb250ZW50Q29sdW1uRGVmcyksdGhpcy5fY3VzdG9tQ29sdW1uRGVmcykuZm9yRWFjaCgodD0+e2lmKHRoaXMuX2NvbHVtbkRlZnNCeU5hbWUuaGFzKHQubmFtZSkmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSl0aHJvdyhmdW5jdGlvbiBlKHQpe3JldHVybiBFcnJvcihgRHVwbGljYXRlIGNvbHVtbiBkZWZpbml0aW9uIG5hbWUgcHJvdmlkZWQ6ICIke3R9Ii5gKX0pKHQubmFtZSk7dGhpcy5fY29sdW1uRGVmc0J5TmFtZS5zZXQodC5uYW1lLHQpfSkpfV9jYWNoZVJvd0RlZnMoKXt0aGlzLl9oZWFkZXJSb3dEZWZzPWUwKHRoaXMuX2dldE93bkRlZnModGhpcy5fY29udGVudEhlYWRlclJvd0RlZnMpLHRoaXMuX2N1c3RvbUhlYWRlclJvd0RlZnMpLHRoaXMuX2Zvb3RlclJvd0RlZnM9ZTAodGhpcy5fZ2V0T3duRGVmcyh0aGlzLl9jb250ZW50Rm9vdGVyUm93RGVmcyksdGhpcy5fY3VzdG9tRm9vdGVyUm93RGVmcyksdGhpcy5fcm93RGVmcz1lMCh0aGlzLl9nZXRPd25EZWZzKHRoaXMuX2NvbnRlbnRSb3dEZWZzKSx0aGlzLl9jdXN0b21Sb3dEZWZzKTtjb25zdCB0PXRoaXMuX3Jvd0RlZnMuZmlsdGVyKCh0PT4hdC53aGVuKSk7aWYoIXRoaXMubXVsdGlUZW1wbGF0ZURhdGFSb3dzJiZ0Lmxlbmd0aD4xJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkpdGhyb3coZnVuY3Rpb24gZSgpe3JldHVybiBFcnJvcigiVGhlcmUgY2FuIG9ubHkgYmUgb25lIGRlZmF1bHQgcm93IHdpdGhvdXQgYSB3aGVuIHByZWRpY2F0ZSBmdW5jdGlvbi4iKX0pKCk7dGhpcy5fZGVmYXVsdFJvd0RlZj10WzBdfV9yZW5kZXJVcGRhdGVkQ29sdW1ucygpe2NvbnN0IHQ9KHQsZSk9PnR8fCEhZS5nZXRDb2x1bW5zRGlmZigpLGU9dGhpcy5fcm93RGVmcy5yZWR1Y2UodCwhMSk7ZSYmdGhpcy5fZm9yY2VSZW5kZXJEYXRhUm93cygpO2NvbnN0IG49dGhpcy5faGVhZGVyUm93RGVmcy5yZWR1Y2UodCwhMSk7biYmdGhpcy5fZm9yY2VSZW5kZXJIZWFkZXJSb3dzKCk7Y29uc3Qgbz10aGlzLl9mb290ZXJSb3dEZWZzLnJlZHVjZSh0LCExKTtyZXR1cm4gbyYmdGhpcy5fZm9yY2VSZW5kZXJGb290ZXJSb3dzKCksZXx8bnx8b31fc3dpdGNoRGF0YVNvdXJjZSh0KXt0aGlzLl9kYXRhPVtdLCRIKHRoaXMuZGF0YVNvdXJjZSkmJnRoaXMuZGF0YVNvdXJjZS5kaXNjb25uZWN0KHRoaXMpLHRoaXMuX3JlbmRlckNoYW5nZVN1YnNjcmlwdGlvbiYmKHRoaXMuX3JlbmRlckNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX3JlbmRlckNoYW5nZVN1YnNjcmlwdGlvbj1udWxsKSx0fHwodGhpcy5fZGF0YURpZmZlciYmdGhpcy5fZGF0YURpZmZlci5kaWZmKFtdKSx0aGlzLl9yb3dPdXRsZXQudmlld0NvbnRhaW5lci5jbGVhcigpKSx0aGlzLl9kYXRhU291cmNlPXR9X29ic2VydmVSZW5kZXJDaGFuZ2VzKCl7aWYoIXRoaXMuZGF0YVNvdXJjZSlyZXR1cm47bGV0IHQ7aWYoJEgodGhpcy5kYXRhU291cmNlKT90PXRoaXMuZGF0YVNvdXJjZS5jb25uZWN0KHRoaXMpOk50KHRoaXMuZGF0YVNvdXJjZSk/dD10aGlzLmRhdGFTb3VyY2U6QXJyYXkuaXNBcnJheSh0aGlzLmRhdGFTb3VyY2UpJiYodD1FdCh0aGlzLmRhdGFTb3VyY2UpKSx2b2lkIDA9PT10JiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkpdGhyb3coZnVuY3Rpb24gZSgpe3JldHVybiBFcnJvcigiUHJvdmlkZWQgZGF0YSBzb3VyY2UgZGlkIG5vdCBtYXRjaCBhbiBhcnJheSwgT2JzZXJ2YWJsZSwgb3IgRGF0YVNvdXJjZSIpfSkoKTt0aGlzLl9yZW5kZXJDaGFuZ2VTdWJzY3JpcHRpb249dC5waXBlKEllKHRoaXMuX29uRGVzdHJveSkpLnN1YnNjcmliZSgodD0+e3RoaXMuX2RhdGE9dHx8W10sdGhpcy5yZW5kZXJSb3dzKCl9KSl9X2ZvcmNlUmVuZGVySGVhZGVyUm93cygpe3RoaXMuX2hlYWRlclJvd091dGxldC52aWV3Q29udGFpbmVyLmxlbmd0aD4wJiZ0aGlzLl9oZWFkZXJSb3dPdXRsZXQudmlld0NvbnRhaW5lci5jbGVhcigpLHRoaXMuX2hlYWRlclJvd0RlZnMuZm9yRWFjaCgoKHQsZSk9PnRoaXMuX3JlbmRlclJvdyh0aGlzLl9oZWFkZXJSb3dPdXRsZXQsdCxlKSkpLHRoaXMudXBkYXRlU3RpY2t5SGVhZGVyUm93U3R5bGVzKCl9X2ZvcmNlUmVuZGVyRm9vdGVyUm93cygpe3RoaXMuX2Zvb3RlclJvd091dGxldC52aWV3Q29udGFpbmVyLmxlbmd0aD4wJiZ0aGlzLl9mb290ZXJSb3dPdXRsZXQudmlld0NvbnRhaW5lci5jbGVhcigpLHRoaXMuX2Zvb3RlclJvd0RlZnMuZm9yRWFjaCgoKHQsZSk9PnRoaXMuX3JlbmRlclJvdyh0aGlzLl9mb290ZXJSb3dPdXRsZXQsdCxlKSkpLHRoaXMudXBkYXRlU3RpY2t5Rm9vdGVyUm93U3R5bGVzKCl9X2FkZFN0aWNreUNvbHVtblN0eWxlcyh0LGUpe2NvbnN0IG49QXJyYXkuZnJvbShlLmNvbHVtbnN8fFtdKS5tYXAoKHQ9Pntjb25zdCBlPXRoaXMuX2NvbHVtbkRlZnNCeU5hbWUuZ2V0KHQpO2lmKCFlJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkpdGhyb3cgWSQodCk7cmV0dXJuIGV9KSksbz1uLm1hcCgodD0+dC5zdGlja3kpKSxpPW4ubWFwKCh0PT50LnN0aWNreUVuZCkpO3RoaXMuX3N0aWNreVN0eWxlci51cGRhdGVTdGlja3lDb2x1bW5zKHQsbyxpLCF0aGlzLl9maXhlZExheW91dHx8dGhpcy5fZm9yY2VSZWNhbGN1bGF0ZUNlbGxXaWR0aHMpfV9nZXRSZW5kZXJlZFJvd3ModCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPHQudmlld0NvbnRhaW5lci5sZW5ndGg7bisrKXtjb25zdCBvPXQudmlld0NvbnRhaW5lci5nZXQobik7ZS5wdXNoKG8ucm9vdE5vZGVzWzBdKX1yZXR1cm4gZX1fZ2V0Um93RGVmcyh0LGUpe2lmKDE9PXRoaXMuX3Jvd0RlZnMubGVuZ3RoKXJldHVyblt0aGlzLl9yb3dEZWZzWzBdXTtsZXQgbj1bXTtpZih0aGlzLm11bHRpVGVtcGxhdGVEYXRhUm93cyluPXRoaXMuX3Jvd0RlZnMuZmlsdGVyKChuPT4hbi53aGVufHxuLndoZW4oZSx0KSkpO2Vsc2V7bGV0IG89dGhpcy5fcm93RGVmcy5maW5kKChuPT5uLndoZW4mJm4ud2hlbihlLHQpKSl8fHRoaXMuX2RlZmF1bHRSb3dEZWY7byYmbi5wdXNoKG8pfWlmKCFuLmxlbmd0aCYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93KGZ1bmN0aW9uIG8odCl7cmV0dXJuIEVycm9yKGBDb3VsZCBub3QgZmluZCBhIG1hdGNoaW5nIHJvdyBkZWZpbml0aW9uIGZvciB0aGVwcm92aWRlZCByb3cgZGF0YTogJHtKU09OLnN0cmluZ2lmeSh0KX1gKX0pKHQpO3JldHVybiBufV9nZXRFbWJlZGRlZFZpZXdBcmdzKHQsZSl7cmV0dXJue3RlbXBsYXRlUmVmOnQucm93RGVmLnRlbXBsYXRlLGNvbnRleHQ6eyRpbXBsaWNpdDp0LmRhdGF9LGluZGV4OmV9fV9yZW5kZXJSb3codCxlLG4sbz17fSl7Y29uc3QgaT10LnZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KGUudGVtcGxhdGUsbyxuKTtyZXR1cm4gdGhpcy5fcmVuZGVyQ2VsbFRlbXBsYXRlRm9ySXRlbShlLG8pLGl9X3JlbmRlckNlbGxUZW1wbGF0ZUZvckl0ZW0odCxlKXtmb3IobGV0IG4gb2YgdGhpcy5fZ2V0Q2VsbFRlbXBsYXRlcyh0KSlMJC5tb3N0UmVjZW50Q2VsbE91dGxldCYmTCQubW9zdFJlY2VudENlbGxPdXRsZXQuX3ZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KG4sZSk7dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9X3VwZGF0ZVJvd0luZGV4Q29udGV4dCgpe2NvbnN0IHQ9dGhpcy5fcm93T3V0bGV0LnZpZXdDb250YWluZXI7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXtjb25zdCBvPXQuZ2V0KGUpLmNvbnRleHQ7by5jb3VudD1uLG8uZmlyc3Q9MD09PWUsby5sYXN0PWU9PT1uLTEsby5ldmVuPWUlMj09MCxvLm9kZD0hby5ldmVuLHRoaXMubXVsdGlUZW1wbGF0ZURhdGFSb3dzPyhvLmRhdGFJbmRleD10aGlzLl9yZW5kZXJSb3dzW2VdLmRhdGFJbmRleCxvLnJlbmRlckluZGV4PWUpOm8uaW5kZXg9dGhpcy5fcmVuZGVyUm93c1tlXS5kYXRhSW5kZXh9fV9nZXRDZWxsVGVtcGxhdGVzKHQpe3JldHVybiB0JiZ0LmNvbHVtbnM/QXJyYXkuZnJvbSh0LmNvbHVtbnMsKGU9Pntjb25zdCBuPXRoaXMuX2NvbHVtbkRlZnNCeU5hbWUuZ2V0KGUpO2lmKCFuJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkpdGhyb3cgWSQoZSk7cmV0dXJuIHQuZXh0cmFjdENlbGxUZW1wbGF0ZShuKX0pKTpbXX1fYXBwbHlOYXRpdmVUYWJsZVNlY3Rpb25zKCl7Y29uc3QgdD10aGlzLl9kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksZT1be3RhZzoidGhlYWQiLG91dGxldHM6W3RoaXMuX2hlYWRlclJvd091dGxldF19LHt0YWc6InRib2R5IixvdXRsZXRzOlt0aGlzLl9yb3dPdXRsZXQsdGhpcy5fbm9EYXRhUm93T3V0bGV0XX0se3RhZzoidGZvb3QiLG91dGxldHM6W3RoaXMuX2Zvb3RlclJvd091dGxldF19XTtmb3IoY29uc3QgbiBvZiBlKXtjb25zdCBlPXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQobi50YWcpO2Uuc2V0QXR0cmlidXRlKCJyb2xlIiwicm93Z3JvdXAiKTtmb3IoY29uc3QgdCBvZiBuLm91dGxldHMpZS5hcHBlbmRDaGlsZCh0LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7dC5hcHBlbmRDaGlsZChlKX10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQodCl9X2ZvcmNlUmVuZGVyRGF0YVJvd3MoKXt0aGlzLl9kYXRhRGlmZmVyLmRpZmYoW10pLHRoaXMuX3Jvd091dGxldC52aWV3Q29udGFpbmVyLmNsZWFyKCksdGhpcy5yZW5kZXJSb3dzKCl9X2NoZWNrU3RpY2t5U3RhdGVzKCl7Y29uc3QgdD0odCxlKT0+dHx8ZS5oYXNTdGlja3lDaGFuZ2VkKCk7dGhpcy5faGVhZGVyUm93RGVmcy5yZWR1Y2UodCwhMSkmJnRoaXMudXBkYXRlU3RpY2t5SGVhZGVyUm93U3R5bGVzKCksdGhpcy5fZm9vdGVyUm93RGVmcy5yZWR1Y2UodCwhMSkmJnRoaXMudXBkYXRlU3RpY2t5Rm9vdGVyUm93U3R5bGVzKCksQXJyYXkuZnJvbSh0aGlzLl9jb2x1bW5EZWZzQnlOYW1lLnZhbHVlcygpKS5yZWR1Y2UodCwhMSkmJih0aGlzLl9zdGlja3lDb2x1bW5TdHlsZXNOZWVkUmVzZXQ9ITAsdGhpcy51cGRhdGVTdGlja3lDb2x1bW5TdHlsZXMoKSl9X3NldHVwU3RpY2t5U3R5bGVyKCl7dGhpcy5fc3RpY2t5U3R5bGVyPW5ldyBXJCh0aGlzLl9pc05hdGl2ZUh0bWxUYWJsZSx0aGlzLnN0aWNreUNzc0NsYXNzLHRoaXMuX2Rpcj90aGlzLl9kaXIudmFsdWU6Imx0ciIsdGhpcy5fY29hbGVzY2VkU3R5bGVTY2hlZHVsZXIsdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyLHRoaXMubmVlZHNQb3NpdGlvblN0aWNreU9uRWxlbWVudCx0aGlzLl9zdGlja3lQb3NpdGlvbmluZ0xpc3RlbmVyKSwodGhpcy5fZGlyP3RoaXMuX2Rpci5jaGFuZ2U6RXQoKSkucGlwZShJZSh0aGlzLl9vbkRlc3Ryb3kpKS5zdWJzY3JpYmUoKHQ9Pnt0aGlzLl9zdGlja3lTdHlsZXIuZGlyZWN0aW9uPXQsdGhpcy51cGRhdGVTdGlja3lDb2x1bW5TdHlsZXMoKX0pKX1fZ2V0T3duRGVmcyh0KXtyZXR1cm4gdC5maWx0ZXIoKHQ9PiF0Ll90YWJsZXx8dC5fdGFibGU9PT10aGlzKSl9X3VwZGF0ZU5vRGF0YVJvdygpe2NvbnN0IHQ9dGhpcy5fY3VzdG9tTm9EYXRhUm93fHx0aGlzLl9ub0RhdGFSb3c7aWYodCl7Y29uc3QgZT0wPT09dGhpcy5fcm93T3V0bGV0LnZpZXdDb250YWluZXIubGVuZ3RoO2lmKGUhPT10aGlzLl9pc1Nob3dpbmdOb0RhdGFSb3cpe2NvbnN0IG49dGhpcy5fbm9EYXRhUm93T3V0bGV0LnZpZXdDb250YWluZXI7ZT9uLmNyZWF0ZUVtYmVkZGVkVmlldyh0LnRlbXBsYXRlUmVmKTpuLmNsZWFyKCksdGhpcy5faXNTaG93aW5nTm9EYXRhUm93PWV9fX19ZnVuY3Rpb24gZTAodCxlKXtyZXR1cm4gdC5jb25jYXQoQXJyYXkuZnJvbShlKSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL3QwLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx0MCkoU20oSGcpLFNtKFVnKSxTbShoZyksTmEoInJvbGUiKSxTbShISSw4KSxTbShaXyksU20od3opLFNtKGFGKSxTbShFJCksU20odUYpLFNtKHEkLDEyKSl9LHQwLsm1Y21wPXRvKHt0eXBlOnQwLHNlbGVjdG9yczpbWyJjZGstdGFibGUiXSxbInRhYmxlIiwiY2RrLXRhYmxlIiwiIl1dLGNvbnRlbnRRdWVyaWVzOmZ1bmN0aW9uIHQoZSxuLG8pe2lmKDEmZSYmKCRoKG8sVSQsNSksJGgobyxPJCw1KSwkaChvLEYkLDUpLCRoKG8seiQsNSksJGgobyxIJCw1KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5fbm9EYXRhUm93PXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLl9jb250ZW50Q29sdW1uRGVmcz10KSxKaCh0PXRiKCkpJiYobi5fY29udGVudFJvd0RlZnM9dCksSmgodD10YigpKSYmKG4uX2NvbnRlbnRIZWFkZXJSb3dEZWZzPXQpLEpoKHQ9dGIoKSkmJihuLl9jb250ZW50Rm9vdGVyUm93RGVmcz10KX19LHZpZXdRdWVyeTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoUWgoWCQsNyksUWgoSyQsNyksUWgoSiQsNyksUWgoUSQsNykpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uX3Jvd091dGxldD10LmZpcnN0KSxKaCh0PXRiKCkpJiYobi5faGVhZGVyUm93T3V0bGV0PXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLl9mb290ZXJSb3dPdXRsZXQ9dC5maXJzdCksSmgodD10YigpKSYmKG4uX25vRGF0YVJvd091dGxldD10LmZpcnN0KX19LGhvc3RBdHRyczpbMSwiY2RrLXRhYmxlIl0saG9zdFZhcnM6Mixob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmcHUoImNkay10YWJsZS1maXhlZC1sYXlvdXQiLG4uZml4ZWRMYXlvdXQpfSxpbnB1dHM6e3RyYWNrQnk6InRyYWNrQnkiLGRhdGFTb3VyY2U6ImRhdGFTb3VyY2UiLG11bHRpVGVtcGxhdGVEYXRhUm93czoibXVsdGlUZW1wbGF0ZURhdGFSb3dzIixmaXhlZExheW91dDoiZml4ZWRMYXlvdXQifSxvdXRwdXRzOntjb250ZW50Q2hhbmdlZDoiY29udGVudENoYW5nZWQifSxleHBvcnRBczpbImNka1RhYmxlIl0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTp5JCx1c2VFeGlzdGluZzp0MH0se3Byb3ZpZGU6YUYsdXNlQ2xhc3M6ZUZ9LHtwcm92aWRlOkUkLHVzZUNsYXNzOlIkfSx7cHJvdmlkZTpxJCx1c2VWYWx1ZTpudWxsfV0pXSxuZ0NvbnRlbnRTZWxlY3RvcnM6WyJjYXB0aW9uIiwiY29sZ3JvdXAsIGNvbCJdLGRlY2xzOjYsdmFyczowLGNvbnN0czpbWyJoZWFkZXJSb3dPdXRsZXQiLCIiXSxbInJvd091dGxldCIsIiJdLFsibm9EYXRhUm93T3V0bGV0IiwiIl0sWyJmb290ZXJSb3dPdXRsZXQiLCIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFptKGYkKSxYbSgwKSxYbSgxLDEpLEltKDIsMCksSW0oMywxKSxJbSg0LDIpLEltKDUsMykpfSxkaXJlY3RpdmVzOltLJCxYJCxRJCxKJF0sc3R5bGVzOlsiLmNkay10YWJsZS1maXhlZC1sYXlvdXR7dGFibGUtbGF5b3V0OmZpeGVkfVxuIl0sZW5jYXBzdWxhdGlvbjoyfSksdDAuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpIZ30se3R5cGU6VWd9LHt0eXBlOmhnfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6amEsYXJnczpbInJvbGUiXX1dfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOnd6fSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbYUZdfV19LHt0eXBlOlIkLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W0UkXX1dfSx7dHlwZTp1Rn0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpFcn0se3R5cGU6a3IsYXJnczpbcSRdfV19XSx0MC5wcm9wRGVjb3JhdG9ycz17dHJhY2tCeTpbe3R5cGU6eHl9XSxkYXRhU291cmNlOlt7dHlwZTp4eX1dLG11bHRpVGVtcGxhdGVEYXRhUm93czpbe3R5cGU6eHl9XSxmaXhlZExheW91dDpbe3R5cGU6eHl9XSxjb250ZW50Q2hhbmdlZDpbe3R5cGU6T3l9XSxfcm93T3V0bGV0Olt7dHlwZTpaYSxhcmdzOltYJCx7c3RhdGljOiEwfV19XSxfaGVhZGVyUm93T3V0bGV0Olt7dHlwZTpaYSxhcmdzOltLJCx7c3RhdGljOiEwfV19XSxfZm9vdGVyUm93T3V0bGV0Olt7dHlwZTpaYSxhcmdzOltKJCx7c3RhdGljOiEwfV19XSxfbm9EYXRhUm93T3V0bGV0Olt7dHlwZTpaYSxhcmdzOltRJCx7c3RhdGljOiEwfV19XSxfY29udGVudENvbHVtbkRlZnM6W3t0eXBlOllhLGFyZ3M6W08kLHtkZXNjZW5kYW50czohMH1dfV0sX2NvbnRlbnRSb3dEZWZzOlt7dHlwZTpZYSxhcmdzOltGJCx7ZGVzY2VuZGFudHM6ITB9XX1dLF9jb250ZW50SGVhZGVyUm93RGVmczpbe3R5cGU6WWEsYXJnczpbeiQse2Rlc2NlbmRhbnRzOiEwfV19XSxfY29udGVudEZvb3RlclJvd0RlZnM6W3t0eXBlOllhLGFyZ3M6W0gkLHtkZXNjZW5kYW50czohMH1dfV0sX25vRGF0YVJvdzpbe3R5cGU6cWEsYXJnczpbVSRdfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodDAsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiY2RrLXRhYmxlLCB0YWJsZVtjZGstdGFibGVdIixleHBvcnRBczoiY2RrVGFibGUiLHRlbXBsYXRlOiQkLGhvc3Q6e2NsYXNzOiJjZGstdGFibGUiLCJbY2xhc3MuY2RrLXRhYmxlLWZpeGVkLWxheW91dF0iOiJmaXhlZExheW91dCJ9LGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uRGVmYXVsdCxwcm92aWRlcnM6W3twcm92aWRlOnkkLHVzZUV4aXN0aW5nOnQwfSx7cHJvdmlkZTphRix1c2VDbGFzczplRn0se3Byb3ZpZGU6RSQsdXNlQ2xhc3M6UiR9LHtwcm92aWRlOnEkLHVzZVZhbHVlOm51bGx9XSxzdHlsZXM6WyIuY2RrLXRhYmxlLWZpeGVkLWxheW91dHt0YWJsZS1sYXlvdXQ6Zml4ZWR9XG4iXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkhnfSx7dHlwZTpVZ30se3R5cGU6aGd9LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpqYSxhcmdzOlsicm9sZSJdfV19LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6d3p9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOlthRl19XX0se3R5cGU6UiQsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbRSRdfV19LHt0eXBlOnVGfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOkVyfSx7dHlwZTprcixhcmdzOltxJF19XX1dfSkse2NvbnRlbnRDaGFuZ2VkOlt7dHlwZTpPeX1dLHRyYWNrQnk6W3t0eXBlOnh5fV0sZGF0YVNvdXJjZTpbe3R5cGU6eHl9XSxtdWx0aVRlbXBsYXRlRGF0YVJvd3M6W3t0eXBlOnh5fV0sZml4ZWRMYXlvdXQ6W3t0eXBlOnh5fV0sX3Jvd091dGxldDpbe3R5cGU6WmEsYXJnczpbWCQse3N0YXRpYzohMH1dfV0sX2hlYWRlclJvd091dGxldDpbe3R5cGU6WmEsYXJnczpbSyQse3N0YXRpYzohMH1dfV0sX2Zvb3RlclJvd091dGxldDpbe3R5cGU6WmEsYXJnczpbSiQse3N0YXRpYzohMH1dfV0sX25vRGF0YVJvd091dGxldDpbe3R5cGU6WmEsYXJnczpbUSQse3N0YXRpYzohMH1dfV0sX2NvbnRlbnRDb2x1bW5EZWZzOlt7dHlwZTpZYSxhcmdzOltPJCx7ZGVzY2VuZGFudHM6ITB9XX1dLF9jb250ZW50Um93RGVmczpbe3R5cGU6WWEsYXJnczpbRiQse2Rlc2NlbmRhbnRzOiEwfV19XSxfY29udGVudEhlYWRlclJvd0RlZnM6W3t0eXBlOllhLGFyZ3M6W3okLHtkZXNjZW5kYW50czohMH1dfV0sX2NvbnRlbnRGb290ZXJSb3dEZWZzOlt7dHlwZTpZYSxhcmdzOltIJCx7ZGVzY2VuZGFudHM6ITB9XX1dLF9ub0RhdGFSb3c6W3t0eXBlOnFhLGFyZ3M6W1UkXX1dfSk7Y2xhc3MgbjB7Y29uc3RydWN0b3IodCxlKXt0aGlzLl90YWJsZT10LHRoaXMuX29wdGlvbnM9ZSx0aGlzLmp1c3RpZnk9InN0YXJ0Iix0aGlzLl9vcHRpb25zPWV8fHt9fWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuX25hbWV9c2V0IG5hbWUodCl7dGhpcy5fbmFtZT10LHRoaXMuX3N5bmNDb2x1bW5EZWZOYW1lKCl9bmdPbkluaXQoKXtpZih0aGlzLl9zeW5jQ29sdW1uRGVmTmFtZSgpLHZvaWQgMD09PXRoaXMuaGVhZGVyVGV4dCYmKHRoaXMuaGVhZGVyVGV4dD10aGlzLl9jcmVhdGVEZWZhdWx0SGVhZGVyVGV4dCgpKSx0aGlzLmRhdGFBY2Nlc3Nvcnx8KHRoaXMuZGF0YUFjY2Vzc29yPXRoaXMuX29wdGlvbnMuZGVmYXVsdERhdGFBY2Nlc3Nvcnx8KCh0LGUpPT50W2VdKSksdGhpcy5fdGFibGUpdGhpcy5jb2x1bW5EZWYuY2VsbD10aGlzLmNlbGwsdGhpcy5jb2x1bW5EZWYuaGVhZGVyQ2VsbD10aGlzLmhlYWRlckNlbGwsdGhpcy5fdGFibGUuYWRkQ29sdW1uRGVmKHRoaXMuY29sdW1uRGVmKTtlbHNlIGlmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpdGhyb3coZnVuY3Rpb24gdCgpe3JldHVybiBFcnJvcigiVGV4dCBjb2x1bW4gY291bGQgbm90IGZpbmQgYSBwYXJlbnQgdGFibGUgZm9yIHJlZ2lzdHJhdGlvbi4iKX0pKCl9bmdPbkRlc3Ryb3koKXt0aGlzLl90YWJsZSYmdGhpcy5fdGFibGUucmVtb3ZlQ29sdW1uRGVmKHRoaXMuY29sdW1uRGVmKX1fY3JlYXRlRGVmYXVsdEhlYWRlclRleHQoKXtjb25zdCB0PXRoaXMubmFtZTtpZighdCYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93KGZ1bmN0aW9uIGUoKXtyZXR1cm4gRXJyb3IoIlRhYmxlIHRleHQgY29sdW1uIG11c3QgaGF2ZSBhIG5hbWUuIil9KSgpO3JldHVybiB0aGlzLl9vcHRpb25zJiZ0aGlzLl9vcHRpb25zLmRlZmF1bHRIZWFkZXJUZXh0VHJhbnNmb3JtP3RoaXMuX29wdGlvbnMuZGVmYXVsdEhlYWRlclRleHRUcmFuc2Zvcm0odCk6dFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSl9X3N5bmNDb2x1bW5EZWZOYW1lKCl7dGhpcy5jb2x1bW5EZWYmJih0aGlzLmNvbHVtbkRlZi5uYW1lPXRoaXMubmFtZSl9fW4wLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxuMCkoU20odDAsOCksU20oXyQsOCkpfSxuMC7JtWNtcD10byh7dHlwZTpuMCxzZWxlY3RvcnM6W1siY2RrLXRleHQtY29sdW1uIl1dLHZpZXdRdWVyeTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoUWgoTyQsNyksUWgoQyQsNyksUWgoTSQsNykpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uY29sdW1uRGVmPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLmNlbGw9dC5maXJzdCksSmgodD10YigpKSYmKG4uaGVhZGVyQ2VsbD10LmZpcnN0KX19LGlucHV0czp7anVzdGlmeToianVzdGlmeSIsbmFtZToibmFtZSIsaGVhZGVyVGV4dDoiaGVhZGVyVGV4dCIsZGF0YUFjY2Vzc29yOiJkYXRhQWNjZXNzb3IifSxkZWNsczozLHZhcnM6MCxjb25zdHM6W1siY2RrQ29sdW1uRGVmIiwiIl0sWyJjZGstaGVhZGVyLWNlbGwiLCIiLDMsInRleHQtYWxpZ24iLDQsImNka0hlYWRlckNlbGxEZWYiXSxbImNkay1jZWxsIiwiIiwzLCJ0ZXh0LWFsaWduIiw0LCJjZGtDZWxsRGVmIl0sWyJjZGstaGVhZGVyLWNlbGwiLCIiXSxbImNkay1jZWxsIiwiIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihObSgwLDApLFFwKDEsZyQsMiwzLCJ0aCIsMSksUXAoMixoJCwyLDMsInRkIiwyKSx6bSgpKX0sZGlyZWN0aXZlczpbTyQsTSQsQyQsdyQsUyRdLGVuY2Fwc3VsYXRpb246Mn0pLG4wLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6dDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltfJF19XX1dLG4wLnByb3BEZWNvcmF0b3JzPXtuYW1lOlt7dHlwZTp4eX1dLGhlYWRlclRleHQ6W3t0eXBlOnh5fV0sZGF0YUFjY2Vzc29yOlt7dHlwZTp4eX1dLGp1c3RpZnk6W3t0eXBlOnh5fV0sY29sdW1uRGVmOlt7dHlwZTpaYSxhcmdzOltPJCx7c3RhdGljOiEwfV19XSxjZWxsOlt7dHlwZTpaYSxhcmdzOltDJCx7c3RhdGljOiEwfV19XSxoZWFkZXJDZWxsOlt7dHlwZTpaYSxhcmdzOltNJCx7c3RhdGljOiEwfV19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChuMCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJjZGstdGV4dC1jb2x1bW4iLHRlbXBsYXRlOidcbiAgICA8bmctY29udGFpbmVyIGNka0NvbHVtbkRlZj5cbiAgICAgIDx0aCBjZGstaGVhZGVyLWNlbGwgKmNka0hlYWRlckNlbGxEZWYgW3N0eWxlLnRleHQtYWxpZ25dPSJqdXN0aWZ5Ij5cbiAgICAgICAge3toZWFkZXJUZXh0fX1cbiAgICAgIDwvdGg+XG4gICAgICA8dGQgY2RrLWNlbGwgKmNka0NlbGxEZWY9ImxldCBkYXRhIiBbc3R5bGUudGV4dC1hbGlnbl09Imp1c3RpZnkiPlxuICAgICAgICB7e2RhdGFBY2Nlc3NvcihkYXRhLCBuYW1lKX19XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAnLGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uRGVmYXVsdH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnQwLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbXyRdfV19XX0pLHtqdXN0aWZ5Olt7dHlwZTp4eX1dLG5hbWU6W3t0eXBlOnh5fV0saGVhZGVyVGV4dDpbe3R5cGU6eHl9XSxkYXRhQWNjZXNzb3I6W3t0eXBlOnh5fV0sY29sdW1uRGVmOlt7dHlwZTpaYSxhcmdzOltPJCx7c3RhdGljOiEwfV19XSxjZWxsOlt7dHlwZTpaYSxhcmdzOltDJCx7c3RhdGljOiEwfV19XSxoZWFkZXJDZWxsOlt7dHlwZTpaYSxhcmdzOltNJCx7c3RhdGljOiEwfV19XX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgbzA9W3QwLEYkLEMkLEwkLE0kLHYkLE8kLFMkLGokLHckLGskLEIkLHokLFYkLEgkLFgkLEskLEokLG4wLFUkLFokLFEkXTtjbGFzcyBpMHt9aTAuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGkwKX0saTAuybVtb2Q9YW8oe3R5cGU6aTB9KSxpMC7JtWluaj12bih7aW1wb3J0czpbW19GXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGkwLFt7dHlwZTpBeSxhcmdzOlt7ZXhwb3J0czpvMCxkZWNsYXJhdGlvbnM6bzAsaW1wb3J0czpbX0ZdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oaTAse2RlY2xhcmF0aW9uczpmdW5jdGlvbigpe3JldHVyblt0MCxGJCxDJCxMJCxNJCx2JCxPJCxTJCxqJCx3JCxrJCxCJCx6JCxWJCxIJCxYJCxLJCxKJCxuMCxVJCxaJCxRJF19LGltcG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bX0ZdfSxleHBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW3QwLEYkLEMkLEwkLE0kLHYkLE8kLFMkLGokLHckLGskLEIkLHokLFYkLEgkLFgkLEskLEokLG4wLFUkLFokLFEkXX19KTtjb25zdCBhMD1bW1siY2FwdGlvbiJdXSxbWyJjb2xncm91cCJdLFsiY29sIl1dXTtmdW5jdGlvbiByMCh0LGUpe2lmKDEmdCYmKFJtKDAsInRoIiwzKSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtkdSgidGV4dC1hbGlnbiIsdC5qdXN0aWZ5KSxyYygxKSxEdSgiICIsdC5oZWFkZXJUZXh0LCIgIil9fWZ1bmN0aW9uIHMwKHQsZSl7aWYoMSZ0JiYoUm0oMCwidGQiLDQpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdCxuPVltKCk7ZHUoInRleHQtYWxpZ24iLG4uanVzdGlmeSkscmMoMSksRHUoIiAiLG4uZGF0YUFjY2Vzc29yKHQsbi5uYW1lKSwiICIpfX1jbGFzcyBsMHt9bDAuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGwwKX0sbDAuybVkaXI9bG8oe3R5cGU6bDAsc2VsZWN0b3JzOltbIm1hdC10YWJsZSIsInJlY3ljbGVSb3dzIiwiIl0sWyJ0YWJsZSIsIm1hdC10YWJsZSIsIiIsInJlY3ljbGVSb3dzIiwiIl1dLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6YUYsdXNlQ2xhc3M6bkZ9XSldfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChsMCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJtYXQtdGFibGVbcmVjeWNsZVJvd3NdLCB0YWJsZVttYXQtdGFibGVdW3JlY3ljbGVSb3dzXSIscHJvdmlkZXJzOlt7cHJvdmlkZTphRix1c2VDbGFzczpuRn1dfV19XSxudWxsLG51bGwpO2NsYXNzIGMwIGV4dGVuZHMgdDB7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuc3RpY2t5Q3NzQ2xhc3M9Im1hdC10YWJsZS1zdGlja3kiLHRoaXMubmVlZHNQb3NpdGlvblN0aWNreU9uRWxlbWVudD0hMX19YzAuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKGMwKSkpKG58fGMwKX19KSgpLGMwLsm1Y21wPXRvKHt0eXBlOmMwLHNlbGVjdG9yczpbWyJtYXQtdGFibGUiXSxbInRhYmxlIiwibWF0LXRhYmxlIiwiIl1dLGhvc3RBdHRyczpbMSwibWF0LXRhYmxlIl0saG9zdFZhcnM6Mixob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmcHUoIm1hdC10YWJsZS1maXhlZC1sYXlvdXQiLG4uZml4ZWRMYXlvdXQpfSxleHBvcnRBczpbIm1hdFRhYmxlIl0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTphRix1c2VDbGFzczplRn0se3Byb3ZpZGU6dDAsdXNlRXhpc3Rpbmc6YzB9LHtwcm92aWRlOnkkLHVzZUV4aXN0aW5nOmMwfSx7cHJvdmlkZTpFJCx1c2VDbGFzczpSJH0se3Byb3ZpZGU6cSQsdXNlVmFsdWU6bnVsbH1dKSx4cF0sbmdDb250ZW50U2VsZWN0b3JzOlsiY2FwdGlvbiIsImNvbGdyb3VwLCBjb2wiXSxkZWNsczo2LHZhcnM6MCxjb25zdHM6W1siaGVhZGVyUm93T3V0bGV0IiwiIl0sWyJyb3dPdXRsZXQiLCIiXSxbIm5vRGF0YVJvd091dGxldCIsIiJdLFsiZm9vdGVyUm93T3V0bGV0IiwiIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabShhMCksWG0oMCksWG0oMSwxKSxJbSgyLDApLEltKDMsMSksSW0oNCwyKSxJbSg1LDMpKX0sZGlyZWN0aXZlczpbSyQsWCQsUSQsSiRdLHN0eWxlczpbJ21hdC10YWJsZXtkaXNwbGF5OmJsb2NrfW1hdC1oZWFkZXItcm93e21pbi1oZWlnaHQ6NTZweH1tYXQtcm93LG1hdC1mb290ZXItcm93e21pbi1oZWlnaHQ6NDhweH1tYXQtcm93LG1hdC1oZWFkZXItcm93LG1hdC1mb290ZXItcm93e2Rpc3BsYXk6ZmxleDtib3JkZXItd2lkdGg6MDtib3JkZXItYm90dG9tLXdpZHRoOjFweDtib3JkZXItc3R5bGU6c29saWQ7YWxpZ24taXRlbXM6Y2VudGVyO2JveC1zaXppbmc6Ym9yZGVyLWJveH1tYXQtcm93OjphZnRlcixtYXQtaGVhZGVyLXJvdzo6YWZ0ZXIsbWF0LWZvb3Rlci1yb3c6OmFmdGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO21pbi1oZWlnaHQ6aW5oZXJpdDtjb250ZW50OiIifW1hdC1jZWxsOmZpcnN0LW9mLXR5cGUsbWF0LWhlYWRlci1jZWxsOmZpcnN0LW9mLXR5cGUsbWF0LWZvb3Rlci1jZWxsOmZpcnN0LW9mLXR5cGV7cGFkZGluZy1sZWZ0OjI0cHh9W2Rpcj1ydGxdIG1hdC1jZWxsOmZpcnN0LW9mLXR5cGU6bm90KDpvbmx5LW9mLXR5cGUpLFtkaXI9cnRsXSBtYXQtaGVhZGVyLWNlbGw6Zmlyc3Qtb2YtdHlwZTpub3QoOm9ubHktb2YtdHlwZSksW2Rpcj1ydGxdIG1hdC1mb290ZXItY2VsbDpmaXJzdC1vZi10eXBlOm5vdCg6b25seS1vZi10eXBlKXtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjI0cHh9bWF0LWNlbGw6bGFzdC1vZi10eXBlLG1hdC1oZWFkZXItY2VsbDpsYXN0LW9mLXR5cGUsbWF0LWZvb3Rlci1jZWxsOmxhc3Qtb2YtdHlwZXtwYWRkaW5nLXJpZ2h0OjI0cHh9W2Rpcj1ydGxdIG1hdC1jZWxsOmxhc3Qtb2YtdHlwZTpub3QoOm9ubHktb2YtdHlwZSksW2Rpcj1ydGxdIG1hdC1oZWFkZXItY2VsbDpsYXN0LW9mLXR5cGU6bm90KDpvbmx5LW9mLXR5cGUpLFtkaXI9cnRsXSBtYXQtZm9vdGVyLWNlbGw6bGFzdC1vZi10eXBlOm5vdCg6b25seS1vZi10eXBlKXtwYWRkaW5nLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjI0cHh9bWF0LWNlbGwsbWF0LWhlYWRlci1jZWxsLG1hdC1mb290ZXItY2VsbHtmbGV4OjE7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtvdmVyZmxvdzpoaWRkZW47d29yZC13cmFwOmJyZWFrLXdvcmQ7bWluLWhlaWdodDppbmhlcml0fXRhYmxlLm1hdC10YWJsZXtib3JkZXItc3BhY2luZzowfXRyLm1hdC1oZWFkZXItcm93e2hlaWdodDo1NnB4fXRyLm1hdC1yb3csdHIubWF0LWZvb3Rlci1yb3d7aGVpZ2h0OjQ4cHh9dGgubWF0LWhlYWRlci1jZWxse3RleHQtYWxpZ246bGVmdH1bZGlyPXJ0bF0gdGgubWF0LWhlYWRlci1jZWxse3RleHQtYWxpZ246cmlnaHR9dGgubWF0LWhlYWRlci1jZWxsLHRkLm1hdC1jZWxsLHRkLm1hdC1mb290ZXItY2VsbHtwYWRkaW5nOjA7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHg7Ym9yZGVyLWJvdHRvbS1zdHlsZTpzb2xpZH10aC5tYXQtaGVhZGVyLWNlbGw6Zmlyc3Qtb2YtdHlwZSx0ZC5tYXQtY2VsbDpmaXJzdC1vZi10eXBlLHRkLm1hdC1mb290ZXItY2VsbDpmaXJzdC1vZi10eXBle3BhZGRpbmctbGVmdDoyNHB4fVtkaXI9cnRsXSB0aC5tYXQtaGVhZGVyLWNlbGw6Zmlyc3Qtb2YtdHlwZTpub3QoOm9ubHktb2YtdHlwZSksW2Rpcj1ydGxdIHRkLm1hdC1jZWxsOmZpcnN0LW9mLXR5cGU6bm90KDpvbmx5LW9mLXR5cGUpLFtkaXI9cnRsXSB0ZC5tYXQtZm9vdGVyLWNlbGw6Zmlyc3Qtb2YtdHlwZTpub3QoOm9ubHktb2YtdHlwZSl7cGFkZGluZy1sZWZ0OjA7cGFkZGluZy1yaWdodDoyNHB4fXRoLm1hdC1oZWFkZXItY2VsbDpsYXN0LW9mLXR5cGUsdGQubWF0LWNlbGw6bGFzdC1vZi10eXBlLHRkLm1hdC1mb290ZXItY2VsbDpsYXN0LW9mLXR5cGV7cGFkZGluZy1yaWdodDoyNHB4fVtkaXI9cnRsXSB0aC5tYXQtaGVhZGVyLWNlbGw6bGFzdC1vZi10eXBlOm5vdCg6b25seS1vZi10eXBlKSxbZGlyPXJ0bF0gdGQubWF0LWNlbGw6bGFzdC1vZi10eXBlOm5vdCg6b25seS1vZi10eXBlKSxbZGlyPXJ0bF0gdGQubWF0LWZvb3Rlci1jZWxsOmxhc3Qtb2YtdHlwZTpub3QoOm9ubHktb2YtdHlwZSl7cGFkZGluZy1yaWdodDowO3BhZGRpbmctbGVmdDoyNHB4fS5tYXQtdGFibGUtc3RpY2t5e3Bvc2l0aW9uOi13ZWJraXQtc3RpY2t5ICFpbXBvcnRhbnQ7cG9zaXRpb246c3RpY2t5ICFpbXBvcnRhbnR9Lm1hdC10YWJsZS1maXhlZC1sYXlvdXR7dGFibGUtbGF5b3V0OmZpeGVkfVxuJ10sZW5jYXBzdWxhdGlvbjoyfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChjMCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtYXQtdGFibGUsIHRhYmxlW21hdC10YWJsZV0iLGV4cG9ydEFzOiJtYXRUYWJsZSIsdGVtcGxhdGU6JCQsaG9zdDp7Y2xhc3M6Im1hdC10YWJsZSIsIltjbGFzcy5tYXQtdGFibGUtZml4ZWQtbGF5b3V0XSI6ImZpeGVkTGF5b3V0In0scHJvdmlkZXJzOlt7cHJvdmlkZTphRix1c2VDbGFzczplRn0se3Byb3ZpZGU6dDAsdXNlRXhpc3Rpbmc6YzB9LHtwcm92aWRlOnkkLHVzZUV4aXN0aW5nOmMwfSx7cHJvdmlkZTpFJCx1c2VDbGFzczpSJH0se3Byb3ZpZGU6cSQsdXNlVmFsdWU6bnVsbH1dLGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uRGVmYXVsdCxzdHlsZXM6WydtYXQtdGFibGV7ZGlzcGxheTpibG9ja31tYXQtaGVhZGVyLXJvd3ttaW4taGVpZ2h0OjU2cHh9bWF0LXJvdyxtYXQtZm9vdGVyLXJvd3ttaW4taGVpZ2h0OjQ4cHh9bWF0LXJvdyxtYXQtaGVhZGVyLXJvdyxtYXQtZm9vdGVyLXJvd3tkaXNwbGF5OmZsZXg7Ym9yZGVyLXdpZHRoOjA7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHg7Ym9yZGVyLXN0eWxlOnNvbGlkO2FsaWduLWl0ZW1zOmNlbnRlcjtib3gtc2l6aW5nOmJvcmRlci1ib3h9bWF0LXJvdzo6YWZ0ZXIsbWF0LWhlYWRlci1yb3c6OmFmdGVyLG1hdC1mb290ZXItcm93OjphZnRlcntkaXNwbGF5OmlubGluZS1ibG9jazttaW4taGVpZ2h0OmluaGVyaXQ7Y29udGVudDoiIn1tYXQtY2VsbDpmaXJzdC1vZi10eXBlLG1hdC1oZWFkZXItY2VsbDpmaXJzdC1vZi10eXBlLG1hdC1mb290ZXItY2VsbDpmaXJzdC1vZi10eXBle3BhZGRpbmctbGVmdDoyNHB4fVtkaXI9cnRsXSBtYXQtY2VsbDpmaXJzdC1vZi10eXBlOm5vdCg6b25seS1vZi10eXBlKSxbZGlyPXJ0bF0gbWF0LWhlYWRlci1jZWxsOmZpcnN0LW9mLXR5cGU6bm90KDpvbmx5LW9mLXR5cGUpLFtkaXI9cnRsXSBtYXQtZm9vdGVyLWNlbGw6Zmlyc3Qtb2YtdHlwZTpub3QoOm9ubHktb2YtdHlwZSl7cGFkZGluZy1sZWZ0OjA7cGFkZGluZy1yaWdodDoyNHB4fW1hdC1jZWxsOmxhc3Qtb2YtdHlwZSxtYXQtaGVhZGVyLWNlbGw6bGFzdC1vZi10eXBlLG1hdC1mb290ZXItY2VsbDpsYXN0LW9mLXR5cGV7cGFkZGluZy1yaWdodDoyNHB4fVtkaXI9cnRsXSBtYXQtY2VsbDpsYXN0LW9mLXR5cGU6bm90KDpvbmx5LW9mLXR5cGUpLFtkaXI9cnRsXSBtYXQtaGVhZGVyLWNlbGw6bGFzdC1vZi10eXBlOm5vdCg6b25seS1vZi10eXBlKSxbZGlyPXJ0bF0gbWF0LWZvb3Rlci1jZWxsOmxhc3Qtb2YtdHlwZTpub3QoOm9ubHktb2YtdHlwZSl7cGFkZGluZy1yaWdodDowO3BhZGRpbmctbGVmdDoyNHB4fW1hdC1jZWxsLG1hdC1oZWFkZXItY2VsbCxtYXQtZm9vdGVyLWNlbGx7ZmxleDoxO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7b3ZlcmZsb3c6aGlkZGVuO3dvcmQtd3JhcDpicmVhay13b3JkO21pbi1oZWlnaHQ6aW5oZXJpdH10YWJsZS5tYXQtdGFibGV7Ym9yZGVyLXNwYWNpbmc6MH10ci5tYXQtaGVhZGVyLXJvd3toZWlnaHQ6NTZweH10ci5tYXQtcm93LHRyLm1hdC1mb290ZXItcm93e2hlaWdodDo0OHB4fXRoLm1hdC1oZWFkZXItY2VsbHt0ZXh0LWFsaWduOmxlZnR9W2Rpcj1ydGxdIHRoLm1hdC1oZWFkZXItY2VsbHt0ZXh0LWFsaWduOnJpZ2h0fXRoLm1hdC1oZWFkZXItY2VsbCx0ZC5tYXQtY2VsbCx0ZC5tYXQtZm9vdGVyLWNlbGx7cGFkZGluZzowO2JvcmRlci1ib3R0b20td2lkdGg6MXB4O2JvcmRlci1ib3R0b20tc3R5bGU6c29saWR9dGgubWF0LWhlYWRlci1jZWxsOmZpcnN0LW9mLXR5cGUsdGQubWF0LWNlbGw6Zmlyc3Qtb2YtdHlwZSx0ZC5tYXQtZm9vdGVyLWNlbGw6Zmlyc3Qtb2YtdHlwZXtwYWRkaW5nLWxlZnQ6MjRweH1bZGlyPXJ0bF0gdGgubWF0LWhlYWRlci1jZWxsOmZpcnN0LW9mLXR5cGU6bm90KDpvbmx5LW9mLXR5cGUpLFtkaXI9cnRsXSB0ZC5tYXQtY2VsbDpmaXJzdC1vZi10eXBlOm5vdCg6b25seS1vZi10eXBlKSxbZGlyPXJ0bF0gdGQubWF0LWZvb3Rlci1jZWxsOmZpcnN0LW9mLXR5cGU6bm90KDpvbmx5LW9mLXR5cGUpe3BhZGRpbmctbGVmdDowO3BhZGRpbmctcmlnaHQ6MjRweH10aC5tYXQtaGVhZGVyLWNlbGw6bGFzdC1vZi10eXBlLHRkLm1hdC1jZWxsOmxhc3Qtb2YtdHlwZSx0ZC5tYXQtZm9vdGVyLWNlbGw6bGFzdC1vZi10eXBle3BhZGRpbmctcmlnaHQ6MjRweH1bZGlyPXJ0bF0gdGgubWF0LWhlYWRlci1jZWxsOmxhc3Qtb2YtdHlwZTpub3QoOm9ubHktb2YtdHlwZSksW2Rpcj1ydGxdIHRkLm1hdC1jZWxsOmxhc3Qtb2YtdHlwZTpub3QoOm9ubHktb2YtdHlwZSksW2Rpcj1ydGxdIHRkLm1hdC1mb290ZXItY2VsbDpsYXN0LW9mLXR5cGU6bm90KDpvbmx5LW9mLXR5cGUpe3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MjRweH0ubWF0LXRhYmxlLXN0aWNreXtwb3NpdGlvbjotd2Via2l0LXN0aWNreSAhaW1wb3J0YW50O3Bvc2l0aW9uOnN0aWNreSAhaW1wb3J0YW50fS5tYXQtdGFibGUtZml4ZWQtbGF5b3V0e3RhYmxlLWxheW91dDpmaXhlZH1cbiddfV19XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgZDAgZXh0ZW5kcyBDJHt9ZDAuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKGQwKSkpKG58fGQwKX19KSgpLGQwLsm1ZGlyPWxvKHt0eXBlOmQwLHNlbGVjdG9yczpbWyIiLCJtYXRDZWxsRGVmIiwiIl1dLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6QyQsdXNlRXhpc3Rpbmc6ZDB9XSkseHBdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChkMCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbWF0Q2VsbERlZl0iLHByb3ZpZGVyczpbe3Byb3ZpZGU6QyQsdXNlRXhpc3Rpbmc6ZDB9XX1dfV0sbnVsbCxudWxsKTtjbGFzcyBwMCBleHRlbmRzIE0ke31wMC7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEocDApKSkobnx8cDApfX0pKCkscDAuybVkaXI9bG8oe3R5cGU6cDAsc2VsZWN0b3JzOltbIiIsIm1hdEhlYWRlckNlbGxEZWYiLCIiXV0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTpNJCx1c2VFeGlzdGluZzpwMH1dKSx4cF19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHAwLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IlttYXRIZWFkZXJDZWxsRGVmXSIscHJvdmlkZXJzOlt7cHJvdmlkZTpNJCx1c2VFeGlzdGluZzpwMH1dfV19XSxudWxsLG51bGwpO2NsYXNzIG0wIGV4dGVuZHMgdiR7fW0wLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYShtMCkpKShufHxtMCl9fSkoKSxtMC7JtWRpcj1sbyh7dHlwZTptMCxzZWxlY3RvcnM6W1siIiwibWF0Rm9vdGVyQ2VsbERlZiIsIiJdXSxmZWF0dXJlczpbcGcoW3twcm92aWRlOnYkLHVzZUV4aXN0aW5nOm0wfV0pLHhwXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobTAsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW21hdEZvb3RlckNlbGxEZWZdIixwcm92aWRlcnM6W3twcm92aWRlOnYkLHVzZUV4aXN0aW5nOm0wfV19XX1dLG51bGwsbnVsbCk7Y2xhc3MgdTAgZXh0ZW5kcyBPJHtnZXQgbmFtZSgpe3JldHVybiB0aGlzLl9uYW1lfXNldCBuYW1lKHQpe3RoaXMuX3NldE5hbWVJbnB1dCh0KX1fdXBkYXRlQ29sdW1uQ3NzQ2xhc3NOYW1lKCl7c3VwZXIuX3VwZGF0ZUNvbHVtbkNzc0NsYXNzTmFtZSgpLHRoaXMuX2NvbHVtbkNzc0NsYXNzTmFtZS5wdXNoKGBtYXQtY29sdW1uLSR7dGhpcy5jc3NDbGFzc0ZyaWVuZGx5TmFtZX1gKX19dTAuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKHUwKSkpKG58fHUwKX19KSgpLHUwLsm1ZGlyPWxvKHt0eXBlOnUwLHNlbGVjdG9yczpbWyIiLCJtYXRDb2x1bW5EZWYiLCIiXV0saW5wdXRzOntzdGlja3k6InN0aWNreSIsbmFtZTpbIm1hdENvbHVtbkRlZiIsIm5hbWUiXX0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTpPJCx1c2VFeGlzdGluZzp1MH0se3Byb3ZpZGU6Ik1BVF9TT1JUX0hFQURFUl9DT0xVTU5fREVGIix1c2VFeGlzdGluZzp1MH1dKSx4cF19KSx1MC5wcm9wRGVjb3JhdG9ycz17bmFtZTpbe3R5cGU6eHksYXJnczpbIm1hdENvbHVtbkRlZiJdfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodTAsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW21hdENvbHVtbkRlZl0iLGlucHV0czpbInN0aWNreSJdLHByb3ZpZGVyczpbe3Byb3ZpZGU6TyQsdXNlRXhpc3Rpbmc6dTB9LHtwcm92aWRlOiJNQVRfU09SVF9IRUFERVJfQ09MVU1OX0RFRiIsdXNlRXhpc3Rpbmc6dTB9XX1dfV0sbnVsbCx7bmFtZTpbe3R5cGU6eHksYXJnczpbIm1hdENvbHVtbkRlZiJdfV19KTtjbGFzcyBmMCBleHRlbmRzIHcke31mMC7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoZjApKSkobnx8ZjApfX0pKCksZjAuybVkaXI9bG8oe3R5cGU6ZjAsc2VsZWN0b3JzOltbIm1hdC1oZWFkZXItY2VsbCJdLFsidGgiLCJtYXQtaGVhZGVyLWNlbGwiLCIiXV0saG9zdEF0dHJzOlsicm9sZSIsImNvbHVtbmhlYWRlciIsMSwibWF0LWhlYWRlci1jZWxsIl0sZmVhdHVyZXM6W3hwXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZjAsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoibWF0LWhlYWRlci1jZWxsLCB0aFttYXQtaGVhZGVyLWNlbGxdIixob3N0OntjbGFzczoibWF0LWhlYWRlci1jZWxsIixyb2xlOiJjb2x1bW5oZWFkZXIifX1dfV0sbnVsbCxudWxsKTtjbGFzcyBnMCBleHRlbmRzIGske31nMC7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoZzApKSkobnx8ZzApfX0pKCksZzAuybVkaXI9bG8oe3R5cGU6ZzAsc2VsZWN0b3JzOltbIm1hdC1mb290ZXItY2VsbCJdLFsidGQiLCJtYXQtZm9vdGVyLWNlbGwiLCIiXV0saG9zdEF0dHJzOlsicm9sZSIsImdyaWRjZWxsIiwxLCJtYXQtZm9vdGVyLWNlbGwiXSxmZWF0dXJlczpbeHBdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChnMCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJtYXQtZm9vdGVyLWNlbGwsIHRkW21hdC1mb290ZXItY2VsbF0iLGhvc3Q6e2NsYXNzOiJtYXQtZm9vdGVyLWNlbGwiLHJvbGU6ImdyaWRjZWxsIn19XX1dLG51bGwsbnVsbCk7Y2xhc3MgaDAgZXh0ZW5kcyBTJHt9aDAuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKGgwKSkpKG58fGgwKX19KSgpLGgwLsm1ZGlyPWxvKHt0eXBlOmgwLHNlbGVjdG9yczpbWyJtYXQtY2VsbCJdLFsidGQiLCJtYXQtY2VsbCIsIiJdXSxob3N0QXR0cnM6WyJyb2xlIiwiZ3JpZGNlbGwiLDEsIm1hdC1jZWxsIl0sZmVhdHVyZXM6W3hwXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoaDAsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoibWF0LWNlbGwsIHRkW21hdC1jZWxsXSIsaG9zdDp7Y2xhc3M6Im1hdC1jZWxsIixyb2xlOiJncmlkY2VsbCJ9fV19XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgYjAgZXh0ZW5kcyB6JHt9YjAuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKGIwKSkpKG58fGIwKX19KSgpLGIwLsm1ZGlyPWxvKHt0eXBlOmIwLHNlbGVjdG9yczpbWyIiLCJtYXRIZWFkZXJSb3dEZWYiLCIiXV0saW5wdXRzOntjb2x1bW5zOlsibWF0SGVhZGVyUm93RGVmIiwiY29sdW1ucyJdLHN0aWNreTpbIm1hdEhlYWRlclJvd0RlZlN0aWNreSIsInN0aWNreSJdfSxmZWF0dXJlczpbcGcoW3twcm92aWRlOnokLHVzZUV4aXN0aW5nOmIwfV0pLHhwXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoYjAsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW21hdEhlYWRlclJvd0RlZl0iLHByb3ZpZGVyczpbe3Byb3ZpZGU6eiQsdXNlRXhpc3Rpbmc6YjB9XSxpbnB1dHM6WyJjb2x1bW5zOiBtYXRIZWFkZXJSb3dEZWYiLCJzdGlja3k6IG1hdEhlYWRlclJvd0RlZlN0aWNreSJdfV19XSxudWxsLG51bGwpO2NsYXNzIHkwIGV4dGVuZHMgSCR7fXkwLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYSh5MCkpKShufHx5MCl9fSkoKSx5MC7JtWRpcj1sbyh7dHlwZTp5MCxzZWxlY3RvcnM6W1siIiwibWF0Rm9vdGVyUm93RGVmIiwiIl1dLGlucHV0czp7Y29sdW1uczpbIm1hdEZvb3RlclJvd0RlZiIsImNvbHVtbnMiXSxzdGlja3k6WyJtYXRGb290ZXJSb3dEZWZTdGlja3kiLCJzdGlja3kiXX0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTpIJCx1c2VFeGlzdGluZzp5MH1dKSx4cF19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHkwLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IlttYXRGb290ZXJSb3dEZWZdIixwcm92aWRlcnM6W3twcm92aWRlOkgkLHVzZUV4aXN0aW5nOnkwfV0saW5wdXRzOlsiY29sdW1uczogbWF0Rm9vdGVyUm93RGVmIiwic3RpY2t5OiBtYXRGb290ZXJSb3dEZWZTdGlja3kiXX1dfV0sbnVsbCxudWxsKTtjbGFzcyBfMCBleHRlbmRzIEYke31fMC7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoXzApKSkobnx8XzApfX0pKCksXzAuybVkaXI9bG8oe3R5cGU6XzAsc2VsZWN0b3JzOltbIiIsIm1hdFJvd0RlZiIsIiJdXSxpbnB1dHM6e2NvbHVtbnM6WyJtYXRSb3dEZWZDb2x1bW5zIiwiY29sdW1ucyJdLHdoZW46WyJtYXRSb3dEZWZXaGVuIiwid2hlbiJdfSxmZWF0dXJlczpbcGcoW3twcm92aWRlOkYkLHVzZUV4aXN0aW5nOl8wfV0pLHhwXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoXzAsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW21hdFJvd0RlZl0iLHByb3ZpZGVyczpbe3Byb3ZpZGU6RiQsdXNlRXhpc3Rpbmc6XzB9XSxpbnB1dHM6WyJjb2x1bW5zOiBtYXRSb3dEZWZDb2x1bW5zIiwid2hlbjogbWF0Um93RGVmV2hlbiJdfV19XSxudWxsLG51bGwpO2NsYXNzIEMwIGV4dGVuZHMgQiR7fUMwLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYShDMCkpKShufHxDMCl9fSkoKSxDMC7JtWNtcD10byh7dHlwZTpDMCxzZWxlY3RvcnM6W1sibWF0LWhlYWRlci1yb3ciXSxbInRyIiwibWF0LWhlYWRlci1yb3ciLCIiXV0saG9zdEF0dHJzOlsicm9sZSIsInJvdyIsMSwibWF0LWhlYWRlci1yb3ciXSxleHBvcnRBczpbIm1hdEhlYWRlclJvdyJdLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6QiQsdXNlRXhpc3Rpbmc6QzB9XSkseHBdLGRlY2xzOjEsdmFyczowLGNvbnN0czpbWyJjZGtDZWxsT3V0bGV0IiwiIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJkltKDAsMCl9LGRpcmVjdGl2ZXM6W0wkXSxlbmNhcHN1bGF0aW9uOjJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEMwLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC1oZWFkZXItcm93LCB0clttYXQtaGVhZGVyLXJvd10iLHRlbXBsYXRlOkEkLGhvc3Q6e2NsYXNzOiJtYXQtaGVhZGVyLXJvdyIscm9sZToicm93In0sY2hhbmdlRGV0ZWN0aW9uOnpuLkRlZmF1bHQsZW5jYXBzdWxhdGlvbjpIbi5Ob25lLGV4cG9ydEFzOiJtYXRIZWFkZXJSb3ciLHByb3ZpZGVyczpbe3Byb3ZpZGU6QiQsdXNlRXhpc3Rpbmc6QzB9XX1dfV0sbnVsbCxudWxsKTtjbGFzcyBNMCBleHRlbmRzIFYke31NMC7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoTTApKSkobnx8TTApfX0pKCksTTAuybVjbXA9dG8oe3R5cGU6TTAsc2VsZWN0b3JzOltbIm1hdC1mb290ZXItcm93Il0sWyJ0ciIsIm1hdC1mb290ZXItcm93IiwiIl1dLGhvc3RBdHRyczpbInJvbGUiLCJyb3ciLDEsIm1hdC1mb290ZXItcm93Il0sZXhwb3J0QXM6WyJtYXRGb290ZXJSb3ciXSxmZWF0dXJlczpbcGcoW3twcm92aWRlOlYkLHVzZUV4aXN0aW5nOk0wfV0pLHhwXSxkZWNsczoxLHZhcnM6MCxjb25zdHM6W1siY2RrQ2VsbE91dGxldCIsIiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiZJbSgwLDApfSxkaXJlY3RpdmVzOltMJF0sZW5jYXBzdWxhdGlvbjoyfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChNMCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtYXQtZm9vdGVyLXJvdywgdHJbbWF0LWZvb3Rlci1yb3ddIix0ZW1wbGF0ZTpBJCxob3N0OntjbGFzczoibWF0LWZvb3Rlci1yb3ciLHJvbGU6InJvdyJ9LGNoYW5nZURldGVjdGlvbjp6bi5EZWZhdWx0LGVuY2Fwc3VsYXRpb246SG4uTm9uZSxleHBvcnRBczoibWF0Rm9vdGVyUm93Iixwcm92aWRlcnM6W3twcm92aWRlOlYkLHVzZUV4aXN0aW5nOk0wfV19XX1dLG51bGwsbnVsbCk7Y2xhc3MgdjAgZXh0ZW5kcyBqJHt9djAuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKHYwKSkpKG58fHYwKX19KSgpLHYwLsm1Y21wPXRvKHt0eXBlOnYwLHNlbGVjdG9yczpbWyJtYXQtcm93Il0sWyJ0ciIsIm1hdC1yb3ciLCIiXV0saG9zdEF0dHJzOlsicm9sZSIsInJvdyIsMSwibWF0LXJvdyJdLGV4cG9ydEFzOlsibWF0Um93Il0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTpqJCx1c2VFeGlzdGluZzp2MH1dKSx4cF0sZGVjbHM6MSx2YXJzOjAsY29uc3RzOltbImNka0NlbGxPdXRsZXQiLCIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmSW0oMCwwKX0sZGlyZWN0aXZlczpbTCRdLGVuY2Fwc3VsYXRpb246Mn0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodjAsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWF0LXJvdywgdHJbbWF0LXJvd10iLHRlbXBsYXRlOkEkLGhvc3Q6e2NsYXNzOiJtYXQtcm93Iixyb2xlOiJyb3cifSxjaGFuZ2VEZXRlY3Rpb246em4uRGVmYXVsdCxlbmNhcHN1bGF0aW9uOkhuLk5vbmUsZXhwb3J0QXM6Im1hdFJvdyIscHJvdmlkZXJzOlt7cHJvdmlkZTpqJCx1c2VFeGlzdGluZzp2MH1dfV19XSxudWxsLG51bGwpO2NsYXNzIHgwIGV4dGVuZHMgVSR7fXgwLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYSh4MCkpKShufHx4MCl9fSkoKSx4MC7JtWRpcj1sbyh7dHlwZTp4MCxzZWxlY3RvcnM6W1sibmctdGVtcGxhdGUiLCJtYXROb0RhdGFSb3ciLCIiXV0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTpVJCx1c2VFeGlzdGluZzp4MH1dKSx4cF19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHgwLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6Im5nLXRlbXBsYXRlW21hdE5vRGF0YVJvd10iLHByb3ZpZGVyczpbe3Byb3ZpZGU6VSQsdXNlRXhpc3Rpbmc6eDB9XX1dfV0sbnVsbCxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIE8wIGV4dGVuZHMgbjB7fU8wLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYShPMCkpKShufHxPMCl9fSkoKSxPMC7JtWNtcD10byh7dHlwZTpPMCxzZWxlY3RvcnM6W1sibWF0LXRleHQtY29sdW1uIl1dLGZlYXR1cmVzOlt4cF0sZGVjbHM6Myx2YXJzOjAsY29uc3RzOltbIm1hdENvbHVtbkRlZiIsIiJdLFsibWF0LWhlYWRlci1jZWxsIiwiIiwzLCJ0ZXh0LWFsaWduIiw0LCJtYXRIZWFkZXJDZWxsRGVmIl0sWyJtYXQtY2VsbCIsIiIsMywidGV4dC1hbGlnbiIsNCwibWF0Q2VsbERlZiJdLFsibWF0LWhlYWRlci1jZWxsIiwiIl0sWyJtYXQtY2VsbCIsIiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoTm0oMCwwKSxRcCgxLHIwLDIsMywidGgiLDEpLFFwKDIsczAsMiwzLCJ0ZCIsMiksem0oKSl9LGRpcmVjdGl2ZXM6W3UwLHAwLGQwLGYwLGgwXSxlbmNhcHN1bGF0aW9uOjJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKE8wLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC10ZXh0LWNvbHVtbiIsdGVtcGxhdGU6J1xuICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPlxuICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbc3R5bGUudGV4dC1hbGlnbl09Imp1c3RpZnkiPlxuICAgICAgICB7e2hlYWRlclRleHR9fVxuICAgICAgPC90aD5cbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj0ibGV0IGRhdGEiIFtzdHlsZS50ZXh0LWFsaWduXT0ianVzdGlmeSI+XG4gICAgICAgIHt7ZGF0YUFjY2Vzc29yKGRhdGEsIG5hbWUpfX1cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICcsZW5jYXBzdWxhdGlvbjpIbi5Ob25lLGNoYW5nZURldGVjdGlvbjp6bi5EZWZhdWx0fV19XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgUDA9W2MwLGwwLHAwLGIwLHUwLGQwLF8wLG0wLHkwLGYwLGgwLGcwLEMwLHYwLE0wLHgwLE8wXTtjbGFzcyB3MHt9dzAuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHcwKX0sdzAuybVtb2Q9YW8oe3R5cGU6dzB9KSx3MC7JtWluaj12bih7aW1wb3J0czpbW2kwLFhJXSxYSV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHcwLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbaTAsWEldLGV4cG9ydHM6W1hJLFAwXSxkZWNsYXJhdGlvbnM6UDB9XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyh3MCx7ZGVjbGFyYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuW2MwLGwwLHAwLGIwLHUwLGQwLF8wLG0wLHkwLGYwLGgwLGcwLEMwLHYwLE0wLHgwLE8wXX0saW1wb3J0czpmdW5jdGlvbigpe3JldHVybltpMCxYSV19LGV4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bWEksYzAsbDAscDAsYjAsdTAsZDAsXzAsbTAseTAsZjAsaDAsZzAsQzAsdjAsTTAseDAsTzBdfX0pO2NsYXNzIGswIGV4dGVuZHMgUUh7Y29uc3RydWN0b3IodD1bXSl7c3VwZXIoKSx0aGlzLl9yZW5kZXJEYXRhPW5ldyBGKFtdKSx0aGlzLl9maWx0ZXI9bmV3IEYoIiIpLHRoaXMuX2ludGVybmFsUGFnZUNoYW5nZXM9bmV3IEksdGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbj1udWxsLHRoaXMuc29ydGluZ0RhdGFBY2Nlc3Nvcj0odCxlKT0+e2NvbnN0IG49dFtlXTtpZihDeihuKSl7Y29uc3QgdD1OdW1iZXIobik7cmV0dXJuIHQ8OTAwNzE5OTI1NDc0MDk5MT90Om59cmV0dXJuIG59LHRoaXMuc29ydERhdGE9KHQsZSk9Pntjb25zdCBuPWUuYWN0aXZlLG89ZS5kaXJlY3Rpb247cmV0dXJuIG4mJiIiIT1vP3Quc29ydCgoKHQsZSk9PntsZXQgaT10aGlzLnNvcnRpbmdEYXRhQWNjZXNzb3IodCxuKSxhPXRoaXMuc29ydGluZ0RhdGFBY2Nlc3NvcihlLG4pO2NvbnN0IHI9dHlwZW9mIGkscz10eXBlb2YgYTtyIT09cyYmKCJudW1iZXIiPT09ciYmKGkrPSIiKSwibnVtYmVyIj09PXMmJihhKz0iIikpO2xldCBsPTA7cmV0dXJuIG51bGwhPWkmJm51bGwhPWE/aT5hP2w9MTppPGEmJihsPS0xKTpudWxsIT1pP2w9MTpudWxsIT1hJiYobD0tMSksbCooImFzYyI9PW8/MTotMSl9KSk6dH0sdGhpcy5maWx0ZXJQcmVkaWNhdGU9KHQsZSk9Pntjb25zdCBuPU9iamVjdC5rZXlzKHQpLnJlZHVjZSgoKGUsbik9PmUrdFtuXSsi4pesIiksIiIpLnRvTG93ZXJDYXNlKCksbz1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpO3JldHVybi0xIT1uLmluZGV4T2Yobyl9LHRoaXMuX2RhdGE9bmV3IEYodCksdGhpcy5fdXBkYXRlQ2hhbmdlU3Vic2NyaXB0aW9uKCl9Z2V0IGRhdGEoKXtyZXR1cm4gdGhpcy5fZGF0YS52YWx1ZX1zZXQgZGF0YSh0KXt0aGlzLl9kYXRhLm5leHQodCksdGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbnx8dGhpcy5fZmlsdGVyRGF0YSh0KX1nZXQgZmlsdGVyKCl7cmV0dXJuIHRoaXMuX2ZpbHRlci52YWx1ZX1zZXQgZmlsdGVyKHQpe3RoaXMuX2ZpbHRlci5uZXh0KHQpLHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb258fHRoaXMuX2ZpbHRlckRhdGEodGhpcy5kYXRhKX1nZXQgc29ydCgpe3JldHVybiB0aGlzLl9zb3J0fXNldCBzb3J0KHQpe3RoaXMuX3NvcnQ9dCx0aGlzLl91cGRhdGVDaGFuZ2VTdWJzY3JpcHRpb24oKX1nZXQgcGFnaW5hdG9yKCl7cmV0dXJuIHRoaXMuX3BhZ2luYXRvcn1zZXQgcGFnaW5hdG9yKHQpe3RoaXMuX3BhZ2luYXRvcj10LHRoaXMuX3VwZGF0ZUNoYW5nZVN1YnNjcmlwdGlvbigpfV91cGRhdGVDaGFuZ2VTdWJzY3JpcHRpb24oKXt2YXIgdDtjb25zdCBlPXRoaXMuX3NvcnQ/cmUodGhpcy5fc29ydC5zb3J0Q2hhbmdlLHRoaXMuX3NvcnQuaW5pdGlhbGl6ZWQpOkV0KG51bGwpLG49dGhpcy5fcGFnaW5hdG9yP3JlKHRoaXMuX3BhZ2luYXRvci5wYWdlLHRoaXMuX2ludGVybmFsUGFnZUNoYW5nZXMsdGhpcy5fcGFnaW5hdG9yLmluaXRpYWxpemVkKTpFdChudWxsKSxvPVd0KFt0aGlzLl9kYXRhLHRoaXMuX2ZpbHRlcl0pLnBpcGUoSXQoKChbdF0pPT50aGlzLl9maWx0ZXJEYXRhKHQpKSkpLGk9V3QoW28sZV0pLnBpcGUoSXQoKChbdF0pPT50aGlzLl9vcmRlckRhdGEodCkpKSksYT1XdChbaSxuXSkucGlwZShJdCgoKFt0XSk9PnRoaXMuX3BhZ2VEYXRhKHQpKSkpO251bGw9PT0odD10aGlzLl9yZW5kZXJDaGFuZ2VzU3Vic2NyaXB0aW9uKXx8dm9pZCAwPT09dHx8dC51bnN1YnNjcmliZSgpLHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb249YS5zdWJzY3JpYmUoKHQ9PnRoaXMuX3JlbmRlckRhdGEubmV4dCh0KSkpfV9maWx0ZXJEYXRhKHQpe3JldHVybiB0aGlzLmZpbHRlcmVkRGF0YT1udWxsPT10aGlzLmZpbHRlcnx8IiI9PT10aGlzLmZpbHRlcj90OnQuZmlsdGVyKCh0PT50aGlzLmZpbHRlclByZWRpY2F0ZSh0LHRoaXMuZmlsdGVyKSkpLHRoaXMucGFnaW5hdG9yJiZ0aGlzLl91cGRhdGVQYWdpbmF0b3IodGhpcy5maWx0ZXJlZERhdGEubGVuZ3RoKSx0aGlzLmZpbHRlcmVkRGF0YX1fb3JkZXJEYXRhKHQpe3JldHVybiB0aGlzLnNvcnQ/dGhpcy5zb3J0RGF0YSh0LnNsaWNlKCksdGhpcy5zb3J0KTp0fV9wYWdlRGF0YSh0KXtpZighdGhpcy5wYWdpbmF0b3IpcmV0dXJuIHQ7Y29uc3QgZT10aGlzLnBhZ2luYXRvci5wYWdlSW5kZXgqdGhpcy5wYWdpbmF0b3IucGFnZVNpemU7cmV0dXJuIHQuc2xpY2UoZSxlK3RoaXMucGFnaW5hdG9yLnBhZ2VTaXplKX1fdXBkYXRlUGFnaW5hdG9yKHQpe1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oKCgpPT57Y29uc3QgZT10aGlzLnBhZ2luYXRvcjtpZihlJiYoZS5sZW5ndGg9dCxlLnBhZ2VJbmRleD4wKSl7Y29uc3QgdD1NYXRoLmNlaWwoZS5sZW5ndGgvZS5wYWdlU2l6ZSktMXx8MCxuPU1hdGgubWluKGUucGFnZUluZGV4LHQpO24hPT1lLnBhZ2VJbmRleCYmKGUucGFnZUluZGV4PW4sdGhpcy5faW50ZXJuYWxQYWdlQ2hhbmdlcy5uZXh0KCkpfX0pKX1jb25uZWN0KCl7cmV0dXJuIHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb258fHRoaXMuX3VwZGF0ZUNoYW5nZVN1YnNjcmlwdGlvbigpLHRoaXMuX3JlbmRlckRhdGF9ZGlzY29ubmVjdCgpe3ZhciB0O251bGw9PT0odD10aGlzLl9yZW5kZXJDaGFuZ2VzU3Vic2NyaXB0aW9uKXx8dm9pZCAwPT09dHx8dC51bnN1YnNjcmliZSgpLHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb249bnVsbH19Y2xhc3MgUzAgZXh0ZW5kcyBrMHt9Y29uc3QgRDA9WyJwYW5lbCJdO2Z1bmN0aW9uIEUwKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2IiwwLDEpLFhtKDIpLEFtKCkpLDImdCl7Y29uc3QgdD1lLmlkLG49WW0oKTtEbSgiaWQiLG4uaWQpKCJuZ0NsYXNzIixuLl9jbGFzc0xpc3QpLGpwKCJhcmlhLWxhYmVsIixuLmFyaWFMYWJlbHx8bnVsbCkoImFyaWEtbGFiZWxsZWRieSIsbi5fZ2V0UGFuZWxBcmlhTGFiZWxsZWRieSh0KSl9fWxldCBSMD0wO2NsYXNzIEEwe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5zb3VyY2U9dCx0aGlzLm9wdGlvbj1lfX1jb25zdCBUMD1RSShjbGFzc3t9KSxOMD1uZXcgR2EoIm1hdC1hdXRvY29tcGxldGUtZGVmYXVsdC1vcHRpb25zIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbiB6MCgpe3JldHVybnthdXRvQWN0aXZlRmlyc3RPcHRpb246ITF9fX0pO2NsYXNzIEkwIGV4dGVuZHMgVDB7Y29uc3RydWN0b3IodCxlLG4sbyl7c3VwZXIoKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZj10LHRoaXMuX2VsZW1lbnRSZWY9ZSx0aGlzLl9hY3RpdmVPcHRpb25DaGFuZ2VzPW0uRU1QVFksdGhpcy5zaG93UGFuZWw9ITEsdGhpcy5faXNPcGVuPSExLHRoaXMuZGlzcGxheVdpdGg9bnVsbCx0aGlzLm9wdGlvblNlbGVjdGVkPW5ldyBMaCx0aGlzLm9wZW5lZD1uZXcgTGgsdGhpcy5jbG9zZWQ9bmV3IExoLHRoaXMub3B0aW9uQWN0aXZhdGVkPW5ldyBMaCx0aGlzLl9jbGFzc0xpc3Q9e30sdGhpcy5pZD0ibWF0LWF1dG9jb21wbGV0ZS0iK1IwKyssdGhpcy5pbmVydEdyb3Vwcz0obnVsbD09bz92b2lkIDA6by5TQUZBUkkpfHwhMSx0aGlzLl9hdXRvQWN0aXZlRmlyc3RPcHRpb249ISFuLmF1dG9BY3RpdmVGaXJzdE9wdGlvbn1nZXQgaXNPcGVuKCl7cmV0dXJuIHRoaXMuX2lzT3BlbiYmdGhpcy5zaG93UGFuZWx9Z2V0IGF1dG9BY3RpdmVGaXJzdE9wdGlvbigpe3JldHVybiB0aGlzLl9hdXRvQWN0aXZlRmlyc3RPcHRpb259c2V0IGF1dG9BY3RpdmVGaXJzdE9wdGlvbih0KXt0aGlzLl9hdXRvQWN0aXZlRmlyc3RPcHRpb249eXoodCl9c2V0IGNsYXNzTGlzdCh0KXt0aGlzLl9jbGFzc0xpc3Q9dCYmdC5sZW5ndGg/KGZ1bmN0aW9uIGUodCxuPS9ccysvKXtjb25zdCBvPVtdO2lmKG51bGwhPXQpe2NvbnN0IGU9QXJyYXkuaXNBcnJheSh0KT90OmAke3R9YC5zcGxpdChuKTtmb3IoY29uc3QgdCBvZiBlKXtjb25zdCBlPWAke3R9YC50cmltKCk7ZSYmby5wdXNoKGUpfX1yZXR1cm4gb30pKHQpLnJlZHVjZSgoKHQsZSk9Pih0W2VdPSEwLHQpKSx7fSk6e30sdGhpcy5fc2V0VmlzaWJpbGl0eUNsYXNzZXModGhpcy5fY2xhc3NMaXN0KSx0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NOYW1lPSIifW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX2tleU1hbmFnZXI9bmV3IHRJKHRoaXMub3B0aW9ucykud2l0aFdyYXAoKSx0aGlzLl9hY3RpdmVPcHRpb25DaGFuZ2VzPXRoaXMuX2tleU1hbmFnZXIuY2hhbmdlLnN1YnNjcmliZSgodD0+e3RoaXMub3B0aW9uQWN0aXZhdGVkLmVtaXQoe3NvdXJjZTp0aGlzLG9wdGlvbjp0aGlzLm9wdGlvbnMudG9BcnJheSgpW3RdfHxudWxsfSl9KSksdGhpcy5fc2V0VmlzaWJpbGl0eSgpfW5nT25EZXN0cm95KCl7dGhpcy5fYWN0aXZlT3B0aW9uQ2hhbmdlcy51bnN1YnNjcmliZSgpfV9zZXRTY3JvbGxUb3AodCl7dGhpcy5wYW5lbCYmKHRoaXMucGFuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A9dCl9X2dldFNjcm9sbFRvcCgpe3JldHVybiB0aGlzLnBhbmVsP3RoaXMucGFuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A6MH1fc2V0VmlzaWJpbGl0eSgpe3RoaXMuc2hvd1BhbmVsPSEhdGhpcy5vcHRpb25zLmxlbmd0aCx0aGlzLl9zZXRWaXNpYmlsaXR5Q2xhc3Nlcyh0aGlzLl9jbGFzc0xpc3QpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfV9lbWl0U2VsZWN0RXZlbnQodCl7Y29uc3QgZT1uZXcgQTAodGhpcyx0KTt0aGlzLm9wdGlvblNlbGVjdGVkLmVtaXQoZSl9X2dldFBhbmVsQXJpYUxhYmVsbGVkYnkodCl7cmV0dXJuIHRoaXMuYXJpYUxhYmVsP251bGw6dGhpcy5hcmlhTGFiZWxsZWRieT8odD90KyIgIjoiIikrdGhpcy5hcmlhTGFiZWxsZWRieTp0fV9zZXRWaXNpYmlsaXR5Q2xhc3Nlcyh0KXt0W3RoaXMuX3Zpc2libGVDbGFzc109dGhpcy5zaG93UGFuZWwsdFt0aGlzLl9oaWRkZW5DbGFzc109IXRoaXMuc2hvd1BhbmVsfX1JMC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8STApKFNtKFVnKSxTbShoZyksU20oTjApLFNtKHd6KSl9LEkwLsm1ZGlyPWxvKHt0eXBlOkkwLHZpZXdRdWVyeTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoUWgoWGcsNyksUWgoRDAsNSkpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4udGVtcGxhdGU9dC5maXJzdCksSmgodD10YigpKSYmKG4ucGFuZWw9dC5maXJzdCl9fSxpbnB1dHM6e2Rpc3BsYXlXaXRoOiJkaXNwbGF5V2l0aCIsYXV0b0FjdGl2ZUZpcnN0T3B0aW9uOiJhdXRvQWN0aXZlRmlyc3RPcHRpb24iLGNsYXNzTGlzdDpbImNsYXNzIiwiY2xhc3NMaXN0Il0sYXJpYUxhYmVsOlsiYXJpYS1sYWJlbCIsImFyaWFMYWJlbCJdLGFyaWFMYWJlbGxlZGJ5OlsiYXJpYS1sYWJlbGxlZGJ5IiwiYXJpYUxhYmVsbGVkYnkiXSxwYW5lbFdpZHRoOiJwYW5lbFdpZHRoIn0sb3V0cHV0czp7b3B0aW9uU2VsZWN0ZWQ6Im9wdGlvblNlbGVjdGVkIixvcGVuZWQ6Im9wZW5lZCIsY2xvc2VkOiJjbG9zZWQiLG9wdGlvbkFjdGl2YXRlZDoib3B0aW9uQWN0aXZhdGVkIn0sZmVhdHVyZXM6W3hwXX0pLEkwLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6VWd9LHt0eXBlOmhnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbTjBdfV19LHt0eXBlOnd6fV0sSTAucHJvcERlY29yYXRvcnM9e3RlbXBsYXRlOlt7dHlwZTpaYSxhcmdzOltYZyx7c3RhdGljOiEwfV19XSxwYW5lbDpbe3R5cGU6WmEsYXJnczpbInBhbmVsIl19XSxhcmlhTGFiZWw6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsIl19XSxhcmlhTGFiZWxsZWRieTpbe3R5cGU6eHksYXJnczpbImFyaWEtbGFiZWxsZWRieSJdfV0sZGlzcGxheVdpdGg6W3t0eXBlOnh5fV0sYXV0b0FjdGl2ZUZpcnN0T3B0aW9uOlt7dHlwZTp4eX1dLHBhbmVsV2lkdGg6W3t0eXBlOnh5fV0sb3B0aW9uU2VsZWN0ZWQ6W3t0eXBlOk95fV0sb3BlbmVkOlt7dHlwZTpPeX1dLGNsb3NlZDpbe3R5cGU6T3l9XSxvcHRpb25BY3RpdmF0ZWQ6W3t0eXBlOk95fV0sY2xhc3NMaXN0Olt7dHlwZTp4eSxhcmdzOlsiY2xhc3MiXX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEkwLFt7dHlwZTpDeX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpVZ30se3R5cGU6aGd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltOMF19XX0se3R5cGU6d3p9XX0pLHtkaXNwbGF5V2l0aDpbe3R5cGU6eHl9XSxvcHRpb25TZWxlY3RlZDpbe3R5cGU6T3l9XSxvcGVuZWQ6W3t0eXBlOk95fV0sY2xvc2VkOlt7dHlwZTpPeX1dLG9wdGlvbkFjdGl2YXRlZDpbe3R5cGU6T3l9XSxhdXRvQWN0aXZlRmlyc3RPcHRpb246W3t0eXBlOnh5fV0sY2xhc3NMaXN0Olt7dHlwZTp4eSxhcmdzOlsiY2xhc3MiXX1dLHRlbXBsYXRlOlt7dHlwZTpaYSxhcmdzOltYZyx7c3RhdGljOiEwfV19XSxwYW5lbDpbe3R5cGU6WmEsYXJnczpbInBhbmVsIl19XSxhcmlhTGFiZWw6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsIl19XSxhcmlhTGFiZWxsZWRieTpbe3R5cGU6eHksYXJnczpbImFyaWEtbGFiZWxsZWRieSJdfV0scGFuZWxXaWR0aDpbe3R5cGU6eHl9XX0pO2NsYXNzIEgwIGV4dGVuZHMgSTB7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX3Zpc2libGVDbGFzcz0ibWF0LWF1dG9jb21wbGV0ZS12aXNpYmxlIix0aGlzLl9oaWRkZW5DbGFzcz0ibWF0LWF1dG9jb21wbGV0ZS1oaWRkZW4ifX1IMC7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoSDApKSkobnx8SDApfX0pKCksSDAuybVjbXA9dG8oe3R5cGU6SDAsc2VsZWN0b3JzOltbIm1hdC1hdXRvY29tcGxldGUiXV0sY29udGVudFF1ZXJpZXM6ZnVuY3Rpb24gdChlLG4sbyl7aWYoMSZlJiYoJGgobyx6SCw1KSwkaChvLEJILDUpKSwyJmUpe2xldCB0O0poKHQ9dGIoKSkmJihuLm9wdGlvbkdyb3Vwcz10KSxKaCh0PXRiKCkpJiYobi5vcHRpb25zPXQpfX0saG9zdEF0dHJzOlsxLCJtYXQtYXV0b2NvbXBsZXRlIl0saW5wdXRzOntkaXNhYmxlUmlwcGxlOiJkaXNhYmxlUmlwcGxlIn0sZXhwb3J0QXM6WyJtYXRBdXRvY29tcGxldGUiXSxmZWF0dXJlczpbcGcoW3twcm92aWRlOlJILHVzZUV4aXN0aW5nOkgwfV0pLHhwXSxuZ0NvbnRlbnRTZWxlY3RvcnM6WyIqIl0sZGVjbHM6MSx2YXJzOjAsY29uc3RzOltbInJvbGUiLCJsaXN0Ym94IiwxLCJtYXQtYXV0b2NvbXBsZXRlLXBhbmVsIiwzLCJpZCIsIm5nQ2xhc3MiXSxbInBhbmVsIiwiIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabSgpLFFwKDAsRTAsMyw0LCJuZy10ZW1wbGF0ZSIpKX0sZGlyZWN0aXZlczpbYU1dLHN0eWxlczpbIi5tYXQtYXV0b2NvbXBsZXRlLXBhbmVse21pbi13aWR0aDoxMTJweDttYXgtd2lkdGg6MjgwcHg7b3ZlcmZsb3c6YXV0bzstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaDt2aXNpYmlsaXR5OmhpZGRlbjttYXgtd2lkdGg6bm9uZTttYXgtaGVpZ2h0OjI1NnB4O3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjEwMCU7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NHB4fS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsLm1hdC1hdXRvY29tcGxldGUtdmlzaWJsZXt2aXNpYmlsaXR5OnZpc2libGV9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWwubWF0LWF1dG9jb21wbGV0ZS1oaWRkZW57dmlzaWJpbGl0eTpoaWRkZW59Lm1hdC1hdXRvY29tcGxldGUtcGFuZWwtYWJvdmUgLm1hdC1hdXRvY29tcGxldGUtcGFuZWx7Ym9yZGVyLXJhZGl1czowO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6NHB4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweH0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbCAubWF0LWRpdmlkZXItaG9yaXpvbnRhbHttYXJnaW4tdG9wOi0xcHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWF1dG9jb21wbGV0ZS1wYW5lbHtvdXRsaW5lOnNvbGlkIDFweH1tYXQtYXV0b2NvbXBsZXRle2Rpc3BsYXk6bm9uZX1cbiJdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLEgwLnByb3BEZWNvcmF0b3JzPXtvcHRpb25Hcm91cHM6W3t0eXBlOllhLGFyZ3M6W3pILHtkZXNjZW5kYW50czohMH1dfV0sb3B0aW9uczpbe3R5cGU6WWEsYXJnczpbQkgse2Rlc2NlbmRhbnRzOiEwfV19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChIMCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtYXQtYXV0b2NvbXBsZXRlIix0ZW1wbGF0ZTonPG5nLXRlbXBsYXRlIGxldC1mb3JtRmllbGRJZD0iaWQiPlxuICA8ZGl2IGNsYXNzPSJtYXQtYXV0b2NvbXBsZXRlLXBhbmVsIlxuICAgICAgIHJvbGU9Imxpc3Rib3giXG4gICAgICAgW2lkXT0iaWQiXG4gICAgICAgW2F0dHIuYXJpYS1sYWJlbF09ImFyaWFMYWJlbCB8fCBudWxsIlxuICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09Il9nZXRQYW5lbEFyaWFMYWJlbGxlZGJ5KGZvcm1GaWVsZElkKSJcbiAgICAgICBbbmdDbGFzc109Il9jbGFzc0xpc3QiXG4gICAgICAgI3BhbmVsPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuJyxlbmNhcHN1bGF0aW9uOkhuLk5vbmUsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaCxleHBvcnRBczoibWF0QXV0b2NvbXBsZXRlIixpbnB1dHM6WyJkaXNhYmxlUmlwcGxlIl0saG9zdDp7Y2xhc3M6Im1hdC1hdXRvY29tcGxldGUifSxwcm92aWRlcnM6W3twcm92aWRlOlJILHVzZUV4aXN0aW5nOkgwfV0sc3R5bGVzOlsiLm1hdC1hdXRvY29tcGxldGUtcGFuZWx7bWluLXdpZHRoOjExMnB4O21heC13aWR0aDoyODBweDtvdmVyZmxvdzphdXRvOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNoO3Zpc2liaWxpdHk6aGlkZGVuO21heC13aWR0aDpub25lO21heC1oZWlnaHQ6MjU2cHg7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJTtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjRweDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo0cHh9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWwubWF0LWF1dG9jb21wbGV0ZS12aXNpYmxle3Zpc2liaWxpdHk6dmlzaWJsZX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbC5tYXQtYXV0b2NvbXBsZXRlLWhpZGRlbnt2aXNpYmlsaXR5OmhpZGRlbn0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbC1hYm92ZSAubWF0LWF1dG9jb21wbGV0ZS1wYW5lbHtib3JkZXItcmFkaXVzOjA7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo0cHg7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6NHB4fS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsIC5tYXQtZGl2aWRlci1ob3Jpem9udGFse21hcmdpbi10b3A6LTFweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYXV0b2NvbXBsZXRlLXBhbmVse291dGxpbmU6c29saWQgMXB4fW1hdC1hdXRvY29tcGxldGV7ZGlzcGxheTpub25lfVxuIl19XX1dLG51bGwse29wdGlvbkdyb3Vwczpbe3R5cGU6WWEsYXJnczpbekgse2Rlc2NlbmRhbnRzOiEwfV19XSxvcHRpb25zOlt7dHlwZTpZYSxhcmdzOltCSCx7ZGVzY2VuZGFudHM6ITB9XX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBGMHtjb25zdHJ1Y3Rvcih0KXt0aGlzLmVsZW1lbnRSZWY9dH19RjAuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEYwKShTbShoZykpfSxGMC7JtWRpcj1sbyh7dHlwZTpGMH0pLEYwLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEYwLFt7dHlwZTpDeX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ31dfSksbnVsbCk7Y2xhc3MgTDAgZXh0ZW5kcyBGMHt9TDAuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKEwwKSkpKG58fEwwKX19KSgpLEwwLsm1ZGlyPWxvKHt0eXBlOkwwLHNlbGVjdG9yczpbWyIiLCJtYXRBdXRvY29tcGxldGVPcmlnaW4iLCIiXV0sZXhwb3J0QXM6WyJtYXRBdXRvY29tcGxldGVPcmlnaW4iXSxmZWF0dXJlczpbeHBdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChMMCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbWF0QXV0b2NvbXBsZXRlT3JpZ2luXSIsZXhwb3J0QXM6Im1hdEF1dG9jb21wbGV0ZU9yaWdpbiJ9XX1dLG51bGwsbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBCMD1uZXcgR2EoIm1hdC1hdXRvY29tcGxldGUtc2Nyb2xsLXN0cmF0ZWd5IiksVjA9e3Byb3ZpZGU6QjAsZGVwczpbcExdLHVzZUZhY3Rvcnk6ZnVuY3Rpb24gajAodCl7cmV0dXJuKCk9PnQuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKCl9fSxVMD17cHJvdmlkZTpJVix1c2VFeGlzdGluZzpxZSgoKCk9PlcwKSksbXVsdGk6ITB9O2NsYXNzIEcwe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIscyxsLGMsZCl7dGhpcy5fZWxlbWVudD10LHRoaXMuX292ZXJsYXk9ZSx0aGlzLl92aWV3Q29udGFpbmVyUmVmPW4sdGhpcy5fem9uZT1vLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmPWksdGhpcy5fZGlyPXIsdGhpcy5fZm9ybUZpZWxkPXMsdGhpcy5fZG9jdW1lbnQ9bCx0aGlzLl92aWV3cG9ydFJ1bGVyPWMsdGhpcy5fZGVmYXVsdHM9ZCx0aGlzLl9jb21wb25lbnREZXN0cm95ZWQ9ITEsdGhpcy5fYXV0b2NvbXBsZXRlRGlzYWJsZWQ9ITEsdGhpcy5fbWFudWFsbHlGbG9hdGluZ0xhYmVsPSExLHRoaXMuX3ZpZXdwb3J0U3Vic2NyaXB0aW9uPW0uRU1QVFksdGhpcy5fY2FuT3Blbk9uTmV4dEZvY3VzPSEwLHRoaXMuX2Nsb3NlS2V5RXZlbnRTdHJlYW09bmV3IEksdGhpcy5fd2luZG93Qmx1ckhhbmRsZXI9KCk9Pnt0aGlzLl9jYW5PcGVuT25OZXh0Rm9jdXM9dGhpcy5fZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PXRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudHx8dGhpcy5wYW5lbE9wZW59LHRoaXMuX29uQ2hhbmdlPSgpPT57fSx0aGlzLl9vblRvdWNoZWQ9KCk9Pnt9LHRoaXMucG9zaXRpb249ImF1dG8iLHRoaXMuYXV0b2NvbXBsZXRlQXR0cmlidXRlPSJvZmYiLHRoaXMuX292ZXJsYXlBdHRhY2hlZD0hMSx0aGlzLm9wdGlvblNlbGVjdGlvbnM9UXQoKCgpPT50aGlzLmF1dG9jb21wbGV0ZSYmdGhpcy5hdXRvY29tcGxldGUub3B0aW9ucz9yZSguLi50aGlzLmF1dG9jb21wbGV0ZS5vcHRpb25zLm1hcCgodD0+dC5vblNlbGVjdGlvbkNoYW5nZSkpKTp0aGlzLl96b25lLm9uU3RhYmxlLnBpcGUoYmUoMSksemUoKCgpPT50aGlzLm9wdGlvblNlbGVjdGlvbnMpKSkpKSx0aGlzLl9zY3JvbGxTdHJhdGVneT1hfWdldCBhdXRvY29tcGxldGVEaXNhYmxlZCgpe3JldHVybiB0aGlzLl9hdXRvY29tcGxldGVEaXNhYmxlZH1zZXQgYXV0b2NvbXBsZXRlRGlzYWJsZWQodCl7dGhpcy5fYXV0b2NvbXBsZXRlRGlzYWJsZWQ9eXoodCl9bmdBZnRlclZpZXdJbml0KCl7Y29uc3QgdD10aGlzLl9nZXRXaW5kb3coKTt2b2lkIDAhPT10JiZ0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+dC5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl93aW5kb3dCbHVySGFuZGxlcikpKX1uZ09uQ2hhbmdlcyh0KXt0LnBvc2l0aW9uJiZ0aGlzLl9wb3NpdGlvblN0cmF0ZWd5JiYodGhpcy5fc2V0U3RyYXRlZ3lQb3NpdGlvbnModGhpcy5fcG9zaXRpb25TdHJhdGVneSksdGhpcy5wYW5lbE9wZW4mJnRoaXMuX292ZXJsYXlSZWYudXBkYXRlUG9zaXRpb24oKSl9bmdPbkRlc3Ryb3koKXtjb25zdCB0PXRoaXMuX2dldFdpbmRvdygpO3ZvaWQgMCE9PXQmJnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYmx1ciIsdGhpcy5fd2luZG93Qmx1ckhhbmRsZXIpLHRoaXMuX3ZpZXdwb3J0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5fY29tcG9uZW50RGVzdHJveWVkPSEwLHRoaXMuX2Rlc3Ryb3lQYW5lbCgpLHRoaXMuX2Nsb3NlS2V5RXZlbnRTdHJlYW0uY29tcGxldGUoKX1nZXQgcGFuZWxPcGVuKCl7cmV0dXJuIHRoaXMuX292ZXJsYXlBdHRhY2hlZCYmdGhpcy5hdXRvY29tcGxldGUuc2hvd1BhbmVsfW9wZW5QYW5lbCgpe3RoaXMuX2F0dGFjaE92ZXJsYXkoKSx0aGlzLl9mbG9hdExhYmVsKCl9Y2xvc2VQYW5lbCgpe3RoaXMuX3Jlc2V0TGFiZWwoKSx0aGlzLl9vdmVybGF5QXR0YWNoZWQmJih0aGlzLnBhbmVsT3BlbiYmdGhpcy5hdXRvY29tcGxldGUuY2xvc2VkLmVtaXQoKSx0aGlzLmF1dG9jb21wbGV0ZS5faXNPcGVuPXRoaXMuX292ZXJsYXlBdHRhY2hlZD0hMSx0aGlzLl9vdmVybGF5UmVmJiZ0aGlzLl9vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkmJih0aGlzLl9vdmVybGF5UmVmLmRldGFjaCgpLHRoaXMuX2Nsb3NpbmdBY3Rpb25zU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkpLHRoaXMuX2NvbXBvbmVudERlc3Ryb3llZHx8dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpKX11cGRhdGVQb3NpdGlvbigpe3RoaXMuX292ZXJsYXlBdHRhY2hlZCYmdGhpcy5fb3ZlcmxheVJlZi51cGRhdGVQb3NpdGlvbigpfWdldCBwYW5lbENsb3NpbmdBY3Rpb25zKCl7cmV0dXJuIHJlKHRoaXMub3B0aW9uU2VsZWN0aW9ucyx0aGlzLmF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci50YWJPdXQucGlwZShjZSgoKCk9PnRoaXMuX292ZXJsYXlBdHRhY2hlZCkpKSx0aGlzLl9jbG9zZUtleUV2ZW50U3RyZWFtLHRoaXMuX2dldE91dHNpZGVDbGlja1N0cmVhbSgpLHRoaXMuX292ZXJsYXlSZWY/dGhpcy5fb3ZlcmxheVJlZi5kZXRhY2htZW50cygpLnBpcGUoY2UoKCgpPT50aGlzLl9vdmVybGF5QXR0YWNoZWQpKSk6RXQoKSkucGlwZShJdCgodD0+dCBpbnN0YW5jZW9mIEZIP3Q6bnVsbCkpKX1nZXQgYWN0aXZlT3B0aW9uKCl7cmV0dXJuIHRoaXMuYXV0b2NvbXBsZXRlJiZ0aGlzLmF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlcj90aGlzLmF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5hY3RpdmVJdGVtOm51bGx9X2dldE91dHNpZGVDbGlja1N0cmVhbSgpe3JldHVybiByZShvZSh0aGlzLl9kb2N1bWVudCwiY2xpY2siKSxvZSh0aGlzLl9kb2N1bWVudCwiYXV4Y2xpY2siKSxvZSh0aGlzLl9kb2N1bWVudCwidG91Y2hlbmQiKSkucGlwZShjZSgodD0+e2NvbnN0IGU9THoodCksbj10aGlzLl9mb3JtRmllbGQ/dGhpcy5fZm9ybUZpZWxkLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ6bnVsbCxvPXRoaXMuY29ubmVjdGVkVG8/dGhpcy5jb25uZWN0ZWRUby5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ6bnVsbDtyZXR1cm4gdGhpcy5fb3ZlcmxheUF0dGFjaGVkJiZlIT09dGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50JiYoIW58fCFuLmNvbnRhaW5zKGUpKSYmKCFvfHwhby5jb250YWlucyhlKSkmJiEhdGhpcy5fb3ZlcmxheVJlZiYmIXRoaXMuX292ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuY29udGFpbnMoZSl9KSkpfXdyaXRlVmFsdWUodCl7UHJvbWlzZS5yZXNvbHZlKG51bGwpLnRoZW4oKCgpPT50aGlzLl9zZXRUcmlnZ2VyVmFsdWUodCkpKX1yZWdpc3Rlck9uQ2hhbmdlKHQpe3RoaXMuX29uQ2hhbmdlPXR9cmVnaXN0ZXJPblRvdWNoZWQodCl7dGhpcy5fb25Ub3VjaGVkPXR9c2V0RGlzYWJsZWRTdGF0ZSh0KXt0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZGlzYWJsZWQ9dH1faGFuZGxlS2V5ZG93bih0KXtjb25zdCBlPXQua2V5Q29kZTtpZihlIT09dXp8fGJ6KHQpfHx0LnByZXZlbnREZWZhdWx0KCksdGhpcy5hY3RpdmVPcHRpb24mJmU9PT1teiYmdGhpcy5wYW5lbE9wZW4pdGhpcy5hY3RpdmVPcHRpb24uX3NlbGVjdFZpYUludGVyYWN0aW9uKCksdGhpcy5fcmVzZXRBY3RpdmVJdGVtKCksdC5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYodGhpcy5hdXRvY29tcGxldGUpe2NvbnN0IG49dGhpcy5hdXRvY29tcGxldGUuX2tleU1hbmFnZXIuYWN0aXZlSXRlbSxvPWU9PT1nenx8ZT09PWh6O3RoaXMucGFuZWxPcGVufHw5PT09ZT90aGlzLmF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5vbktleWRvd24odCk6byYmdGhpcy5fY2FuT3BlbigpJiZ0aGlzLm9wZW5QYW5lbCgpLChvfHx0aGlzLmF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5hY3RpdmVJdGVtIT09bikmJnRoaXMuX3Njcm9sbFRvT3B0aW9uKHRoaXMuYXV0b2NvbXBsZXRlLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW1JbmRleHx8MCl9fV9oYW5kbGVJbnB1dCh0KXtsZXQgZT10LnRhcmdldCxuPWUudmFsdWU7Im51bWJlciI9PT1lLnR5cGUmJihuPSIiPT1uP251bGw6cGFyc2VGbG9hdChuKSksdGhpcy5fcHJldmlvdXNWYWx1ZSE9PW4mJih0aGlzLl9wcmV2aW91c1ZhbHVlPW4sdGhpcy5fb25DaGFuZ2UobiksdGhpcy5fY2FuT3BlbigpJiZ0aGlzLl9kb2N1bWVudC5hY3RpdmVFbGVtZW50PT09dC50YXJnZXQmJnRoaXMub3BlblBhbmVsKCkpfV9oYW5kbGVGb2N1cygpe3RoaXMuX2Nhbk9wZW5Pbk5leHRGb2N1cz90aGlzLl9jYW5PcGVuKCkmJih0aGlzLl9wcmV2aW91c1ZhbHVlPXRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSx0aGlzLl9hdHRhY2hPdmVybGF5KCksdGhpcy5fZmxvYXRMYWJlbCghMCkpOnRoaXMuX2Nhbk9wZW5Pbk5leHRGb2N1cz0hMH1fZmxvYXRMYWJlbCh0PSExKXt0aGlzLl9mb3JtRmllbGQmJiJhdXRvIj09PXRoaXMuX2Zvcm1GaWVsZC5mbG9hdExhYmVsJiYodD90aGlzLl9mb3JtRmllbGQuX2FuaW1hdGVBbmRMb2NrTGFiZWwoKTp0aGlzLl9mb3JtRmllbGQuZmxvYXRMYWJlbD0iYWx3YXlzIix0aGlzLl9tYW51YWxseUZsb2F0aW5nTGFiZWw9ITApfV9yZXNldExhYmVsKCl7dGhpcy5fbWFudWFsbHlGbG9hdGluZ0xhYmVsJiYodGhpcy5fZm9ybUZpZWxkLmZsb2F0TGFiZWw9ImF1dG8iLHRoaXMuX21hbnVhbGx5RmxvYXRpbmdMYWJlbD0hMSl9X3N1YnNjcmliZVRvQ2xvc2luZ0FjdGlvbnMoKXtyZXR1cm4gcmUodGhpcy5fem9uZS5vblN0YWJsZS5waXBlKGJlKDEpKSx0aGlzLmF1dG9jb21wbGV0ZS5vcHRpb25zLmNoYW5nZXMucGlwZShGZSgoKCk9PnRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kucmVhcHBseUxhc3RQb3NpdGlvbigpKSksQ2UoMCkpKS5waXBlKHplKCgoKT0+e2NvbnN0IHQ9dGhpcy5wYW5lbE9wZW47cmV0dXJuIHRoaXMuX3Jlc2V0QWN0aXZlSXRlbSgpLHRoaXMuYXV0b2NvbXBsZXRlLl9zZXRWaXNpYmlsaXR5KCksdGhpcy5wYW5lbE9wZW4mJih0aGlzLl9vdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCksdCE9PXRoaXMucGFuZWxPcGVuJiZ0aGlzLmF1dG9jb21wbGV0ZS5vcGVuZWQuZW1pdCgpKSx0aGlzLnBhbmVsQ2xvc2luZ0FjdGlvbnN9KSksYmUoMSkpLnN1YnNjcmliZSgodD0+dGhpcy5fc2V0VmFsdWVBbmRDbG9zZSh0KSkpfV9kZXN0cm95UGFuZWwoKXt0aGlzLl9vdmVybGF5UmVmJiYodGhpcy5jbG9zZVBhbmVsKCksdGhpcy5fb3ZlcmxheVJlZi5kaXNwb3NlKCksdGhpcy5fb3ZlcmxheVJlZj1udWxsKX1fc2V0VHJpZ2dlclZhbHVlKHQpe2NvbnN0IGU9dGhpcy5hdXRvY29tcGxldGUmJnRoaXMuYXV0b2NvbXBsZXRlLmRpc3BsYXlXaXRoP3RoaXMuYXV0b2NvbXBsZXRlLmRpc3BsYXlXaXRoKHQpOnQsbj1udWxsIT1lP2U6IiI7dGhpcy5fZm9ybUZpZWxkP3RoaXMuX2Zvcm1GaWVsZC5fY29udHJvbC52YWx1ZT1uOnRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZT1uLHRoaXMuX3ByZXZpb3VzVmFsdWU9bn1fc2V0VmFsdWVBbmRDbG9zZSh0KXt0JiZ0LnNvdXJjZSYmKHRoaXMuX2NsZWFyUHJldmlvdXNTZWxlY3RlZE9wdGlvbih0LnNvdXJjZSksdGhpcy5fc2V0VHJpZ2dlclZhbHVlKHQuc291cmNlLnZhbHVlKSx0aGlzLl9vbkNoYW5nZSh0LnNvdXJjZS52YWx1ZSksdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCksdGhpcy5hdXRvY29tcGxldGUuX2VtaXRTZWxlY3RFdmVudCh0LnNvdXJjZSkpLHRoaXMuY2xvc2VQYW5lbCgpfV9jbGVhclByZXZpb3VzU2VsZWN0ZWRPcHRpb24odCl7dGhpcy5hdXRvY29tcGxldGUub3B0aW9ucy5mb3JFYWNoKChlPT57ZSE9PXQmJmUuc2VsZWN0ZWQmJmUuZGVzZWxlY3QoKX0pKX1fYXR0YWNoT3ZlcmxheSgpe3ZhciB0O2lmKCF0aGlzLmF1dG9jb21wbGV0ZSYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93KGZ1bmN0aW9uIGUoKXtyZXR1cm4gRXJyb3IoIkF0dGVtcHRpbmcgdG8gb3BlbiBhbiB1bmRlZmluZWQgaW5zdGFuY2Ugb2YgYG1hdC1hdXRvY29tcGxldGVgLiBNYWtlIHN1cmUgdGhhdCB0aGUgaWQgcGFzc2VkIHRvIHRoZSBgbWF0QXV0b2NvbXBsZXRlYCBpcyBjb3JyZWN0IGFuZCB0aGF0IHlvdSdyZSBhdHRlbXB0aW5nIHRvIG9wZW4gaXQgYWZ0ZXIgdGhlIG5nQWZ0ZXJDb250ZW50SW5pdCBob29rLiIpfSkoKTtsZXQgbj10aGlzLl9vdmVybGF5UmVmO24/KHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kuc2V0T3JpZ2luKHRoaXMuX2dldENvbm5lY3RlZEVsZW1lbnQoKSksbi51cGRhdGVTaXplKHt3aWR0aDp0aGlzLl9nZXRQYW5lbFdpZHRoKCl9KSk6KHRoaXMuX3BvcnRhbD1uZXcgeEYodGhpcy5hdXRvY29tcGxldGUudGVtcGxhdGUsdGhpcy5fdmlld0NvbnRhaW5lclJlZix7aWQ6bnVsbD09PSh0PXRoaXMuX2Zvcm1GaWVsZCl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuZ2V0TGFiZWxJZCgpfSksbj10aGlzLl9vdmVybGF5LmNyZWF0ZSh0aGlzLl9nZXRPdmVybGF5Q29uZmlnKCkpLHRoaXMuX292ZXJsYXlSZWY9bixuLmtleWRvd25FdmVudHMoKS5zdWJzY3JpYmUoKHQ9PnsodC5rZXlDb2RlPT09dXomJiFieih0KXx8dC5rZXlDb2RlPT09Z3omJmJ6KHQsImFsdEtleSIpKSYmKHRoaXMuX3Jlc2V0QWN0aXZlSXRlbSgpLHRoaXMuX2Nsb3NlS2V5RXZlbnRTdHJlYW0ubmV4dCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksdC5wcmV2ZW50RGVmYXVsdCgpKX0pKSx0aGlzLl92aWV3cG9ydFN1YnNjcmlwdGlvbj10aGlzLl92aWV3cG9ydFJ1bGVyLmNoYW5nZSgpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLnBhbmVsT3BlbiYmbiYmbi51cGRhdGVTaXplKHt3aWR0aDp0aGlzLl9nZXRQYW5lbFdpZHRoKCl9KX0pKSksbiYmIW4uaGFzQXR0YWNoZWQoKSYmKG4uYXR0YWNoKHRoaXMuX3BvcnRhbCksdGhpcy5fY2xvc2luZ0FjdGlvbnNTdWJzY3JpcHRpb249dGhpcy5fc3Vic2NyaWJlVG9DbG9zaW5nQWN0aW9ucygpKTtjb25zdCBvPXRoaXMucGFuZWxPcGVuO3RoaXMuYXV0b2NvbXBsZXRlLl9zZXRWaXNpYmlsaXR5KCksdGhpcy5hdXRvY29tcGxldGUuX2lzT3Blbj10aGlzLl9vdmVybGF5QXR0YWNoZWQ9ITAsdGhpcy5wYW5lbE9wZW4mJm8hPT10aGlzLnBhbmVsT3BlbiYmdGhpcy5hdXRvY29tcGxldGUub3BlbmVkLmVtaXQoKX1fZ2V0T3ZlcmxheUNvbmZpZygpe3ZhciB0O3JldHVybiBuZXcgVkYoe3Bvc2l0aW9uU3RyYXRlZ3k6dGhpcy5fZ2V0T3ZlcmxheVBvc2l0aW9uKCksc2Nyb2xsU3RyYXRlZ3k6dGhpcy5fc2Nyb2xsU3RyYXRlZ3koKSx3aWR0aDp0aGlzLl9nZXRQYW5lbFdpZHRoKCksZGlyZWN0aW9uOnRoaXMuX2RpcixwYW5lbENsYXNzOm51bGw9PT0odD10aGlzLl9kZWZhdWx0cyl8fHZvaWQgMD09PXQ/dm9pZCAwOnQub3ZlcmxheVBhbmVsQ2xhc3N9KX1fZ2V0T3ZlcmxheVBvc2l0aW9uKCl7Y29uc3QgdD10aGlzLl9vdmVybGF5LnBvc2l0aW9uKCkuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLl9nZXRDb25uZWN0ZWRFbGVtZW50KCkpLndpdGhGbGV4aWJsZURpbWVuc2lvbnMoITEpLndpdGhQdXNoKCExKTtyZXR1cm4gdGhpcy5fc2V0U3RyYXRlZ3lQb3NpdGlvbnModCksdGhpcy5fcG9zaXRpb25TdHJhdGVneT10LHR9X3NldFN0cmF0ZWd5UG9zaXRpb25zKHQpe2NvbnN0IGU9W3tvcmlnaW5YOiJzdGFydCIsb3JpZ2luWToiYm90dG9tIixvdmVybGF5WDoic3RhcnQiLG92ZXJsYXlZOiJ0b3AifSx7b3JpZ2luWDoiZW5kIixvcmlnaW5ZOiJib3R0b20iLG92ZXJsYXlYOiJlbmQiLG92ZXJsYXlZOiJ0b3AifV0sbj10aGlzLl9hYm92ZUNsYXNzLG89W3tvcmlnaW5YOiJzdGFydCIsb3JpZ2luWToidG9wIixvdmVybGF5WDoic3RhcnQiLG92ZXJsYXlZOiJib3R0b20iLHBhbmVsQ2xhc3M6bn0se29yaWdpblg6ImVuZCIsb3JpZ2luWToidG9wIixvdmVybGF5WDoiZW5kIixvdmVybGF5WToiYm90dG9tIixwYW5lbENsYXNzOm59XTtsZXQgaTtpPSJhYm92ZSI9PT10aGlzLnBvc2l0aW9uP286ImJlbG93Ij09PXRoaXMucG9zaXRpb24/ZTpbLi4uZSwuLi5vXSx0LndpdGhQb3NpdGlvbnMoaSl9X2dldENvbm5lY3RlZEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5jb25uZWN0ZWRUbz90aGlzLmNvbm5lY3RlZFRvLmVsZW1lbnRSZWY6dGhpcy5fZm9ybUZpZWxkP3RoaXMuX2Zvcm1GaWVsZC5nZXRDb25uZWN0ZWRPdmVybGF5T3JpZ2luKCk6dGhpcy5fZWxlbWVudH1fZ2V0UGFuZWxXaWR0aCgpe3JldHVybiB0aGlzLmF1dG9jb21wbGV0ZS5wYW5lbFdpZHRofHx0aGlzLl9nZXRIb3N0V2lkdGgoKX1fZ2V0SG9zdFdpZHRoKCl7cmV0dXJuIHRoaXMuX2dldENvbm5lY3RlZEVsZW1lbnQoKS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRofV9yZXNldEFjdGl2ZUl0ZW0oKXtjb25zdCB0PXRoaXMuYXV0b2NvbXBsZXRlO3QuYXV0b0FjdGl2ZUZpcnN0T3B0aW9uP3QuX2tleU1hbmFnZXIuc2V0Rmlyc3RJdGVtQWN0aXZlKCk6dC5fa2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKC0xKX1fY2FuT3Blbigpe2NvbnN0IHQ9dGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50O3JldHVybiF0LnJlYWRPbmx5JiYhdC5kaXNhYmxlZCYmIXRoaXMuX2F1dG9jb21wbGV0ZURpc2FibGVkfV9nZXRXaW5kb3coKXt2YXIgdDtyZXR1cm4obnVsbD09PSh0PXRoaXMuX2RvY3VtZW50KXx8dm9pZCAwPT09dD92b2lkIDA6dC5kZWZhdWx0Vmlldyl8fHdpbmRvd31fc2Nyb2xsVG9PcHRpb24odCl7Y29uc3QgZT10aGlzLmF1dG9jb21wbGV0ZSxuPVZIKHQsZS5vcHRpb25zLGUub3B0aW9uR3JvdXBzKTtpZigwPT09dCYmMT09PW4pZS5fc2V0U2Nyb2xsVG9wKDApO2Vsc2UgaWYoZS5wYW5lbCl7Y29uc3Qgbj1lLm9wdGlvbnMudG9BcnJheSgpW3RdO2lmKG4pe2NvbnN0IHQ9bi5fZ2V0SG9zdEVsZW1lbnQoKSxvPWpIKHQub2Zmc2V0VG9wLHQub2Zmc2V0SGVpZ2h0LGUuX2dldFNjcm9sbFRvcCgpLGUucGFuZWwubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQpO2UuX3NldFNjcm9sbFRvcChvKX19fX1HMC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8RzApKFNtKGhnKSxTbShwTCksU20oZWgpLFNtKGFfKSxTbShVZyksU20oQjApLFNtKEhJLDgpLFNtKFJWLDkpLFNtKFpfLDgpLFNtKHVGKSxTbShOMCw4KSl9LEcwLsm1ZGlyPWxvKHt0eXBlOkcwLGlucHV0czp7cG9zaXRpb246WyJtYXRBdXRvY29tcGxldGVQb3NpdGlvbiIsInBvc2l0aW9uIl0sYXV0b2NvbXBsZXRlQXR0cmlidXRlOlsiYXV0b2NvbXBsZXRlIiwiYXV0b2NvbXBsZXRlQXR0cmlidXRlIl0sYXV0b2NvbXBsZXRlRGlzYWJsZWQ6WyJtYXRBdXRvY29tcGxldGVEaXNhYmxlZCIsImF1dG9jb21wbGV0ZURpc2FibGVkIl0sYXV0b2NvbXBsZXRlOlsibWF0QXV0b2NvbXBsZXRlIiwiYXV0b2NvbXBsZXRlIl0sY29ubmVjdGVkVG86WyJtYXRBdXRvY29tcGxldGVDb25uZWN0ZWRUbyIsImNvbm5lY3RlZFRvIl19LGZlYXR1cmVzOltCb119KSxHMC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpwTH0se3R5cGU6ZWh9LHt0eXBlOmFffSx7dHlwZTpVZ30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W0IwXX1dfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpBVixkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbUlZdfSx7dHlwZTpScn1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTp1Rn0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltOMF19XX1dLEcwLnByb3BEZWNvcmF0b3JzPXthdXRvY29tcGxldGU6W3t0eXBlOnh5LGFyZ3M6WyJtYXRBdXRvY29tcGxldGUiXX1dLHBvc2l0aW9uOlt7dHlwZTp4eSxhcmdzOlsibWF0QXV0b2NvbXBsZXRlUG9zaXRpb24iXX1dLGNvbm5lY3RlZFRvOlt7dHlwZTp4eSxhcmdzOlsibWF0QXV0b2NvbXBsZXRlQ29ubmVjdGVkVG8iXX1dLGF1dG9jb21wbGV0ZUF0dHJpYnV0ZTpbe3R5cGU6eHksYXJnczpbImF1dG9jb21wbGV0ZSJdfV0sYXV0b2NvbXBsZXRlRGlzYWJsZWQ6W3t0eXBlOnh5LGFyZ3M6WyJtYXRBdXRvY29tcGxldGVEaXNhYmxlZCJdfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRzAsW3t0eXBlOkN5fV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTpwTH0se3R5cGU6ZWh9LHt0eXBlOmFffSx7dHlwZTpVZ30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W0IwXX1dfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpBVixkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbUlZdfSx7dHlwZTpScn1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTp1Rn0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltOMF19XX1dfSkse3Bvc2l0aW9uOlt7dHlwZTp4eSxhcmdzOlsibWF0QXV0b2NvbXBsZXRlUG9zaXRpb24iXX1dLGF1dG9jb21wbGV0ZUF0dHJpYnV0ZTpbe3R5cGU6eHksYXJnczpbImF1dG9jb21wbGV0ZSJdfV0sYXV0b2NvbXBsZXRlRGlzYWJsZWQ6W3t0eXBlOnh5LGFyZ3M6WyJtYXRBdXRvY29tcGxldGVEaXNhYmxlZCJdfV0sYXV0b2NvbXBsZXRlOlt7dHlwZTp4eSxhcmdzOlsibWF0QXV0b2NvbXBsZXRlIl19XSxjb25uZWN0ZWRUbzpbe3R5cGU6eHksYXJnczpbIm1hdEF1dG9jb21wbGV0ZUNvbm5lY3RlZFRvIl19XX0pO2NsYXNzIFcwIGV4dGVuZHMgRzB7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX2Fib3ZlQ2xhc3M9Im1hdC1hdXRvY29tcGxldGUtcGFuZWwtYWJvdmUifX1XMC7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoVzApKSkobnx8VzApfX0pKCksVzAuybVkaXI9bG8oe3R5cGU6VzAsc2VsZWN0b3JzOltbImlucHV0IiwibWF0QXV0b2NvbXBsZXRlIiwiIl0sWyJ0ZXh0YXJlYSIsIm1hdEF1dG9jb21wbGV0ZSIsIiJdXSxob3N0QXR0cnM6WzEsIm1hdC1hdXRvY29tcGxldGUtdHJpZ2dlciJdLGhvc3RWYXJzOjcsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJlZtKCJmb2N1c2luIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9oYW5kbGVGb2N1cygpfSkpKCJibHVyIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9vblRvdWNoZWQoKX0pKSgiaW5wdXQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9oYW5kbGVJbnB1dChlKX0pKSgia2V5ZG93biIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX2hhbmRsZUtleWRvd24oZSl9KSksMiZlJiZqcCgiYXV0b2NvbXBsZXRlIixuLmF1dG9jb21wbGV0ZUF0dHJpYnV0ZSkoInJvbGUiLG4uYXV0b2NvbXBsZXRlRGlzYWJsZWQ/bnVsbDoiY29tYm9ib3giKSgiYXJpYS1hdXRvY29tcGxldGUiLG4uYXV0b2NvbXBsZXRlRGlzYWJsZWQ/bnVsbDoibGlzdCIpKCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiLG4ucGFuZWxPcGVuJiZuLmFjdGl2ZU9wdGlvbj9uLmFjdGl2ZU9wdGlvbi5pZDpudWxsKSgiYXJpYS1leHBhbmRlZCIsbi5hdXRvY29tcGxldGVEaXNhYmxlZD9udWxsOm4ucGFuZWxPcGVuLnRvU3RyaW5nKCkpKCJhcmlhLW93bnMiLG4uYXV0b2NvbXBsZXRlRGlzYWJsZWR8fCFuLnBhbmVsT3Blbnx8bnVsbD09bi5hdXRvY29tcGxldGU/bnVsbDpuLmF1dG9jb21wbGV0ZS5pZCkoImFyaWEtaGFzcG9wdXAiLCFuLmF1dG9jb21wbGV0ZURpc2FibGVkKX0sZXhwb3J0QXM6WyJtYXRBdXRvY29tcGxldGVUcmlnZ2VyIl0sZmVhdHVyZXM6W3BnKFtVMF0pLHhwXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoVzAsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiaW5wdXRbbWF0QXV0b2NvbXBsZXRlXSwgdGV4dGFyZWFbbWF0QXV0b2NvbXBsZXRlXSIsaG9zdDp7Y2xhc3M6Im1hdC1hdXRvY29tcGxldGUtdHJpZ2dlciIsIlthdHRyLmF1dG9jb21wbGV0ZV0iOiJhdXRvY29tcGxldGVBdHRyaWJ1dGUiLCJbYXR0ci5yb2xlXSI6J2F1dG9jb21wbGV0ZURpc2FibGVkID8gbnVsbCA6ICJjb21ib2JveCInLCJbYXR0ci5hcmlhLWF1dG9jb21wbGV0ZV0iOidhdXRvY29tcGxldGVEaXNhYmxlZCA/IG51bGwgOiAibGlzdCInLCJbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdIjoiKHBhbmVsT3BlbiAmJiBhY3RpdmVPcHRpb24pID8gYWN0aXZlT3B0aW9uLmlkIDogbnVsbCIsIlthdHRyLmFyaWEtZXhwYW5kZWRdIjoiYXV0b2NvbXBsZXRlRGlzYWJsZWQgPyBudWxsIDogcGFuZWxPcGVuLnRvU3RyaW5nKCkiLCJbYXR0ci5hcmlhLW93bnNdIjoiKGF1dG9jb21wbGV0ZURpc2FibGVkIHx8ICFwYW5lbE9wZW4pID8gbnVsbCA6IGF1dG9jb21wbGV0ZT8uaWQiLCJbYXR0ci5hcmlhLWhhc3BvcHVwXSI6IiFhdXRvY29tcGxldGVEaXNhYmxlZCIsIihmb2N1c2luKSI6Il9oYW5kbGVGb2N1cygpIiwiKGJsdXIpIjoiX29uVG91Y2hlZCgpIiwiKGlucHV0KSI6Il9oYW5kbGVJbnB1dCgkZXZlbnQpIiwiKGtleWRvd24pIjoiX2hhbmRsZUtleWRvd24oJGV2ZW50KSJ9LGV4cG9ydEFzOiJtYXRBdXRvY29tcGxldGVUcmlnZ2VyIixwcm92aWRlcnM6W1UwXX1dfV0sbnVsbCxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIFkwe31ZMC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WTApfSxZMC7JtW1vZD1hbyh7dHlwZTpZMH0pLFkwLsm1aW5qPXZuKHtwcm92aWRlcnM6W1YwXSxpbXBvcnRzOltbeUwsVUgsWEksV01dLHlGLFVILFhJXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWTAsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOlt5TCxVSCxYSSxXTV0sZXhwb3J0czpbSDAsVzAsTDAseUYsVUgsWEldLGRlY2xhcmF0aW9uczpbSDAsVzAsTDBdLHByb3ZpZGVyczpbVjBdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oWTAse2RlY2xhcmF0aW9uczpmdW5jdGlvbigpe3JldHVybltIMCxXMCxMMF19LGltcG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5beUwsVUgsWEksV01dfSxleHBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW0gwLFcwLEwwLHlGLFVILFhJXX19KTtjbGFzcyBxMHtjb25zdHJ1Y3Rvcigpe3RoaXMudmFsdWU9IiIsdGhpcy5wbGFjZWhvbGRlcj0iIn1vbklucHV0S2V5VXAodCl7IkVudGVyIj09PXQua2V5JiZ0aGlzLmF1dG9jb21wbGV0ZVRyaWdnZXIuY2xvc2VQYW5lbCgpfX1mdW5jdGlvbiBaMCh0LGUpe2lmKDEmdCYmKHFpKCksVG0oMCwiY2lyY2xlIiwzKSksMiZ0KXtjb25zdCB0PVltKCk7ZHUoImFuaW1hdGlvbi1uYW1lIiwibWF0LXByb2dyZXNzLXNwaW5uZXItc3Ryb2tlLXJvdGF0ZS0iK3QuX3NwaW5uZXJBbmltYXRpb25MYWJlbCkoInN0cm9rZS1kYXNob2Zmc2V0Iix0Ll9nZXRTdHJva2VEYXNoT2Zmc2V0KCksInB4IikoInN0cm9rZS1kYXNoYXJyYXkiLHQuX2dldFN0cm9rZUNpcmN1bWZlcmVuY2UoKSwicHgiKSgic3Ryb2tlLXdpZHRoIix0Ll9nZXRDaXJjbGVTdHJva2VXaWR0aCgpLCIlIiksanAoInIiLHQuX2dldENpcmNsZVJhZGl1cygpKX19ZnVuY3Rpb24gWDAodCxlKXtpZigxJnQmJihxaSgpLFRtKDAsImNpcmNsZSIsMykpLDImdCl7Y29uc3QgdD1ZbSgpO2R1KCJzdHJva2UtZGFzaG9mZnNldCIsdC5fZ2V0U3Ryb2tlRGFzaE9mZnNldCgpLCJweCIpKCJzdHJva2UtZGFzaGFycmF5Iix0Ll9nZXRTdHJva2VDaXJjdW1mZXJlbmNlKCksInB4IikoInN0cm9rZS13aWR0aCIsdC5fZ2V0Q2lyY2xlU3Ryb2tlV2lkdGgoKSwiJSIpLGpwKCJyIix0Ll9nZXRDaXJjbGVSYWRpdXMoKSl9fWZ1bmN0aW9uIEswKHQsZSl7aWYoMSZ0JiYocWkoKSxUbSgwLCJjaXJjbGUiLDMpKSwyJnQpe2NvbnN0IHQ9WW0oKTtkdSgiYW5pbWF0aW9uLW5hbWUiLCJtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1zdHJva2Utcm90YXRlLSIrdC5fc3Bpbm5lckFuaW1hdGlvbkxhYmVsKSgic3Ryb2tlLWRhc2hvZmZzZXQiLHQuX2dldFN0cm9rZURhc2hPZmZzZXQoKSwicHgiKSgic3Ryb2tlLWRhc2hhcnJheSIsdC5fZ2V0U3Ryb2tlQ2lyY3VtZmVyZW5jZSgpLCJweCIpKCJzdHJva2Utd2lkdGgiLHQuX2dldENpcmNsZVN0cm9rZVdpZHRoKCksIiUiKSxqcCgiciIsdC5fZ2V0Q2lyY2xlUmFkaXVzKCkpfX1mdW5jdGlvbiBKMCh0LGUpe2lmKDEmdCYmKHFpKCksVG0oMCwiY2lyY2xlIiwzKSksMiZ0KXtjb25zdCB0PVltKCk7ZHUoInN0cm9rZS1kYXNob2Zmc2V0Iix0Ll9nZXRTdHJva2VEYXNoT2Zmc2V0KCksInB4IikoInN0cm9rZS1kYXNoYXJyYXkiLHQuX2dldFN0cm9rZUNpcmN1bWZlcmVuY2UoKSwicHgiKSgic3Ryb2tlLXdpZHRoIix0Ll9nZXRDaXJjbGVTdHJva2VXaWR0aCgpLCIlIiksanAoInIiLHQuX2dldENpcmNsZVJhZGl1cygpKX19cTAuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHEwKX0scTAuybVjbXA9dG8oe3R5cGU6cTAsc2VsZWN0b3JzOltbInRiLWZpbHRlci1pbnB1dCJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmUWgoVzAsNSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5hdXRvY29tcGxldGVUcmlnZ2VyPXQuZmlyc3QpfX0saW5wdXRzOnt2YWx1ZToidmFsdWUiLG1hdEF1dG9jb21wbGV0ZToibWF0QXV0b2NvbXBsZXRlIixwbGFjZWhvbGRlcjoicGxhY2Vob2xkZXIifSxkZWNsczoyLHZhcnM6NCxjb25zdHM6W1sic3ZnSWNvbiIsInNlYXJjaF8yNHB4Il0sWyJ0eXBlIiwidGV4dCIsImF1dG9jb21wbGV0ZSIsIm9mZiIsMywicGxhY2Vob2xkZXIiLCJtYXRBdXRvY29tcGxldGUiLCJtYXRBdXRvY29tcGxldGVEaXNhYmxlZCIsInZhbHVlIiwia2V5dXAiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFRtKDAsIm1hdC1pY29uIiwwKSxSbSgxLCJpbnB1dCIsMSksVm0oImtleXVwIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vbklucHV0S2V5VXAoZSl9KSksQW0oKSksMiZlJiYocmMoMSksRG0oInBsYWNlaG9sZGVyIixuLnBsYWNlaG9sZGVyKSgibWF0QXV0b2NvbXBsZXRlIixuLm1hdEF1dG9jb21wbGV0ZSkoIm1hdEF1dG9jb21wbGV0ZURpc2FibGVkIiwhbi5tYXRBdXRvY29tcGxldGUpKCJ2YWx1ZSIsbi52YWx1ZSkpfSxkaXJlY3RpdmVzOltEVyxXMF0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9W19uZ2hvc3QtJUNPTVAlXXtkaXNwbGF5OmZsZXg7Zm9udC1zaXplOjEzcHh9bWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjE7ZmxleDpub25lO21hcmdpbi1yaWdodDo1cHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgbWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICBtYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9aW5wdXRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6aW5oZXJpdDtjYXJldC1jb2xvcjpjdXJyZW50Q29sb3I7Y29sb3I6Y3VycmVudENvbG9yO2ZvbnQ6aW5oZXJpdDtib3JkZXI6bm9uZTtvdXRsaW5lOm5vbmU7cGFkZGluZzowO2ZsZXgtZ3JvdzoxfSddfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChxMCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJ0Yi1maWx0ZXItaW5wdXQiLHRlbXBsYXRlOidcbiAgICA8bWF0LWljb24gc3ZnSWNvbj0ic2VhcmNoXzI0cHgiPjwvbWF0LWljb24+XG5cbiAgICBceDNjIS0tIE5vdGU6IHRvIGFsbG93IGZhbHN5IFwnbWF0QXV0b2NvbXBsZXRlXCcgdmFsdWVzLCB3ZSBuZWVkIFwnbWF0QXV0b2NvbXBsZXRlRGlzYWJsZWRcJ1xuICAgIHRvIHByZXZlbnQgcnVudGltZSBlcnJvcnMuIC0tXHgzZVxuICAgIDxpbnB1dFxuICAgICAgdHlwZT0idGV4dCJcbiAgICAgIGF1dG9jb21wbGV0ZT0ib2ZmIlxuICAgICAgW3BsYWNlaG9sZGVyXT0icGxhY2Vob2xkZXIiXG4gICAgICBbbWF0QXV0b2NvbXBsZXRlXT0ibWF0QXV0b2NvbXBsZXRlIlxuICAgICAgW21hdEF1dG9jb21wbGV0ZURpc2FibGVkXT0iIW1hdEF1dG9jb21wbGV0ZSJcbiAgICAgIFt2YWx1ZV09InZhbHVlIlxuICAgICAgKGtleXVwKT0ib25JbnB1dEtleVVwKCRldmVudCkiXG4gICAgLz5cbiAgJyxzdHlsZVVybHM6WyJmaWx0ZXJfaW5wdXRfY29tcG9uZW50LmNzcyJdfV19XSxudWxsLHt2YWx1ZTpbe3R5cGU6eHl9XSxtYXRBdXRvY29tcGxldGU6W3t0eXBlOnh5fV0scGxhY2Vob2xkZXI6W3t0eXBlOnh5fV0sYXV0b2NvbXBsZXRlVHJpZ2dlcjpbe3R5cGU6WmEsYXJnczpbVzBdfV19KTtjb25zdCBRMD0iLm1hdC1wcm9ncmVzcy1zcGlubmVye2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246cmVsYXRpdmU7b3ZlcmZsb3c6aGlkZGVufS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBzdmd7cG9zaXRpb246YWJzb2x1dGU7dHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpO3RvcDowO2xlZnQ6MDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBjaXJjbGV7ZmlsbDp0cmFuc3BhcmVudDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjt0cmFuc2l0aW9uOnN0cm9rZS1kYXNob2Zmc2V0IDIyNW1zIGxpbmVhcn0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXByb2dyZXNzLXNwaW5uZXIgY2lyY2xle3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBjaXJjbGV7c3Ryb2tlOmN1cnJlbnRDb2xvcjtzdHJva2U6Q2FudmFzVGV4dH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBzdmd7YW5pbWF0aW9uOm1hdC1wcm9ncmVzcy1zcGlubmVyLWxpbmVhci1yb3RhdGUgMjAwMG1zIGxpbmVhciBpbmZpbml0ZX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBzdmd7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1pbmRldGVybWluYXRlLWFuaW1hdGlvblttb2RlPWluZGV0ZXJtaW5hdGVdIGNpcmNsZXt0cmFuc2l0aW9uLXByb3BlcnR5OnN0cm9rZTthbmltYXRpb24tZHVyYXRpb246NDAwMG1zO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpO2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6aW5maW5pdGV9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV0gY2lyY2xle3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1mYWxsYmFjay1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBzdmd7YW5pbWF0aW9uOm1hdC1wcm9ncmVzcy1zcGlubmVyLXN0cm9rZS1yb3RhdGUtZmFsbGJhY2sgMTAwMDBtcyBjdWJpYy1iZXppZXIoMC44NywgMC4wMywgMC4zMywgMSkgaW5maW5pdGV9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtZmFsbGJhY2stYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV0gc3Zne3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1mYWxsYmFjay1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBjaXJjbGV7dHJhbnNpdGlvbi1wcm9wZXJ0eTpzdHJva2V9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtZmFsbGJhY2stYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV0gY2lyY2xle3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX1Aa2V5ZnJhbWVzIG1hdC1wcm9ncmVzcy1zcGlubmVyLWxpbmVhci1yb3RhdGV7MCV7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19QGtleWZyYW1lcyBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1zdHJva2Utcm90YXRlLTEwMHswJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMi41JXtzdHJva2UtZGFzaG9mZnNldDo1Ni41NDg2Njc3cHg7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMi41MDAxJXtzdHJva2UtZGFzaG9mZnNldDo1Ni41NDg2Njc3cHg7dHJhbnNmb3JtOnJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoNzIuNWRlZyl9MjUle3N0cm9rZS1kYXNob2Zmc2V0OjI2OC42MDYxNzE1NzVweDt0cmFuc2Zvcm06cm90YXRlWCgxODBkZWcpIHJvdGF0ZSg3Mi41ZGVnKX0yNS4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgyNzBkZWcpfTM3LjUle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlKDI3MGRlZyl9MzcuNTAwMSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDE2MS41ZGVnKX01MCV7c3Ryb2tlLWRhc2hvZmZzZXQ6MjY4LjYwNjE3MTU3NXB4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDE2MS41ZGVnKX01MC4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpfTYyLjUle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlKDE4MGRlZyl9NjIuNTAwMSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDI1MS41ZGVnKX03NSV7c3Ryb2tlLWRhc2hvZmZzZXQ6MjY4LjYwNjE3MTU3NXB4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDI1MS41ZGVnKX03NS4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyl9ODcuNSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGUoOTBkZWcpfTg3LjUwMDEle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlWCgxODBkZWcpIHJvdGF0ZSgzNDEuNWRlZyl9MTAwJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMzQxLjVkZWcpfX1Aa2V5ZnJhbWVzIG1hdC1wcm9ncmVzcy1zcGlubmVyLXN0cm9rZS1yb3RhdGUtZmFsbGJhY2t7MCV7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX0yNSV7dHJhbnNmb3JtOnJvdGF0ZSgxMTcwZGVnKX01MCV7dHJhbnNmb3JtOnJvdGF0ZSgyMzQwZGVnKX03NSV7dHJhbnNmb3JtOnJvdGF0ZSgzNTEwZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoNDY4MGRlZyl9fVxuIiwkMD1KSShjbGFzc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl9lbGVtZW50UmVmPXR9fSwicHJpbWFyeSIpLHQxPW5ldyBHYSgibWF0LXByb2dyZXNzLXNwaW5uZXItZGVmYXVsdC1vcHRpb25zIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbiBlMSgpe3JldHVybntkaWFtZXRlcjoxMDB9fX0pO2NsYXNzIG4xIGV4dGVuZHMgJDB7Y29uc3RydWN0b3IodCxlLG4sbyxpKXtzdXBlcih0KSx0aGlzLl9kb2N1bWVudD1uLHRoaXMuX2RpYW1ldGVyPTEwMCx0aGlzLl92YWx1ZT0wLHRoaXMuX2ZhbGxiYWNrQW5pbWF0aW9uPSExLHRoaXMubW9kZT0iZGV0ZXJtaW5hdGUiO2NvbnN0IGE9bjEuX2RpYW1ldGVyczt0aGlzLl9zcGlubmVyQW5pbWF0aW9uTGFiZWw9dGhpcy5fZ2V0U3Bpbm5lckFuaW1hdGlvbkxhYmVsKCksYS5oYXMobi5oZWFkKXx8YS5zZXQobi5oZWFkLG5ldyBTZXQoWzEwMF0pKSx0aGlzLl9mYWxsYmFja0FuaW1hdGlvbj1lLkVER0V8fGUuVFJJREVOVCx0aGlzLl9ub29wQW5pbWF0aW9ucz0iTm9vcEFuaW1hdGlvbnMiPT09byYmISFpJiYhaS5fZm9yY2VBbmltYXRpb25zLGkmJihpLmRpYW1ldGVyJiYodGhpcy5kaWFtZXRlcj1pLmRpYW1ldGVyKSxpLnN0cm9rZVdpZHRoJiYodGhpcy5zdHJva2VXaWR0aD1pLnN0cm9rZVdpZHRoKSl9Z2V0IGRpYW1ldGVyKCl7cmV0dXJuIHRoaXMuX2RpYW1ldGVyfXNldCBkaWFtZXRlcih0KXt0aGlzLl9kaWFtZXRlcj1feih0KSx0aGlzLl9zcGlubmVyQW5pbWF0aW9uTGFiZWw9dGhpcy5fZ2V0U3Bpbm5lckFuaW1hdGlvbkxhYmVsKCksIXRoaXMuX2ZhbGxiYWNrQW5pbWF0aW9uJiZ0aGlzLl9zdHlsZVJvb3QmJnRoaXMuX2F0dGFjaFN0eWxlTm9kZSgpfWdldCBzdHJva2VXaWR0aCgpe3JldHVybiB0aGlzLl9zdHJva2VXaWR0aHx8dGhpcy5kaWFtZXRlci8xMH1zZXQgc3Ryb2tlV2lkdGgodCl7dGhpcy5fc3Ryb2tlV2lkdGg9X3oodCl9Z2V0IHZhbHVlKCl7cmV0dXJuImRldGVybWluYXRlIj09PXRoaXMubW9kZT90aGlzLl92YWx1ZTowfXNldCB2YWx1ZSh0KXt0aGlzLl92YWx1ZT1NYXRoLm1heCgwLE1hdGgubWluKDEwMCxfeih0KSkpfW5nT25Jbml0KCl7Y29uc3QgdD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7dGhpcy5fc3R5bGVSb290PUh6KHQpfHx0aGlzLl9kb2N1bWVudC5oZWFkLHRoaXMuX2F0dGFjaFN0eWxlTm9kZSgpLHQuY2xhc3NMaXN0LmFkZChgbWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZSR7dGhpcy5fZmFsbGJhY2tBbmltYXRpb24/Ii1mYWxsYmFjayI6IiJ9LWFuaW1hdGlvbmApfV9nZXRDaXJjbGVSYWRpdXMoKXtyZXR1cm4odGhpcy5kaWFtZXRlci0xMCkvMn1fZ2V0Vmlld0JveCgpe2NvbnN0IHQ9Mip0aGlzLl9nZXRDaXJjbGVSYWRpdXMoKSt0aGlzLnN0cm9rZVdpZHRoO3JldHVybmAwIDAgJHt0fSAke3R9YH1fZ2V0U3Ryb2tlQ2lyY3VtZmVyZW5jZSgpe3JldHVybiAyKk1hdGguUEkqdGhpcy5fZ2V0Q2lyY2xlUmFkaXVzKCl9X2dldFN0cm9rZURhc2hPZmZzZXQoKXtyZXR1cm4iZGV0ZXJtaW5hdGUiPT09dGhpcy5tb2RlP3RoaXMuX2dldFN0cm9rZUNpcmN1bWZlcmVuY2UoKSooMTAwLXRoaXMuX3ZhbHVlKS8xMDA6dGhpcy5fZmFsbGJhY2tBbmltYXRpb24mJiJpbmRldGVybWluYXRlIj09PXRoaXMubW9kZT8uMip0aGlzLl9nZXRTdHJva2VDaXJjdW1mZXJlbmNlKCk6bnVsbH1fZ2V0Q2lyY2xlU3Ryb2tlV2lkdGgoKXtyZXR1cm4gdGhpcy5zdHJva2VXaWR0aC90aGlzLmRpYW1ldGVyKjEwMH1fYXR0YWNoU3R5bGVOb2RlKCl7Y29uc3QgdD10aGlzLl9zdHlsZVJvb3QsZT10aGlzLl9kaWFtZXRlcixuPW4xLl9kaWFtZXRlcnM7bGV0IG89bi5nZXQodCk7aWYoIW98fCFvLmhhcyhlKSl7Y29uc3QgaT10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2kuc2V0QXR0cmlidXRlKCJtYXQtc3Bpbm5lci1hbmltYXRpb24iLHRoaXMuX3NwaW5uZXJBbmltYXRpb25MYWJlbCksaS50ZXh0Q29udGVudD10aGlzLl9nZXRBbmltYXRpb25UZXh0KCksdC5hcHBlbmRDaGlsZChpKSxvfHwobz1uZXcgU2V0LG4uc2V0KHQsbykpLG8uYWRkKGUpfX1fZ2V0QW5pbWF0aW9uVGV4dCgpe2NvbnN0IHQ9dGhpcy5fZ2V0U3Ryb2tlQ2lyY3VtZmVyZW5jZSgpO3JldHVybiJcbiBAa2V5ZnJhbWVzIG1hdC1wcm9ncmVzcy1zcGlubmVyLXN0cm9rZS1yb3RhdGUtRElBTUVURVIge1xuICAgIDAlICAgICAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZSgwKTsgfVxuICAgIDEyLjUlICAgeyBzdHJva2UtZGFzaG9mZnNldDogRU5EX1ZBTFVFOyAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwKTsgfVxuICAgIDEyLjUwMDElICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlWCgxODBkZWcpIHJvdGF0ZSg3Mi41ZGVnKTsgfVxuICAgIDI1JSAgICAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoNzIuNWRlZyk7IH1cblxuICAgIDI1LjAwMDElICAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOyB9XG4gICAgMzcuNSUgICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7IH1cbiAgICAzNy41MDAxJSAgeyBzdHJva2UtZGFzaG9mZnNldDogRU5EX1ZBTFVFOyAgICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMTYxLjVkZWcpOyB9XG4gICAgNTAlICAgICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBTVEFSVF9WQUxVRTsgIHRyYW5zZm9ybTogcm90YXRlWCgxODBkZWcpIHJvdGF0ZSgxNjEuNWRlZyk7IH1cblxuICAgIDUwLjAwMDElICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBTVEFSVF9WQUxVRTsgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7IH1cbiAgICA2Mi41JSAgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IEVORF9WQUxVRTsgICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTsgfVxuICAgIDYyLjUwMDElICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlWCgxODBkZWcpIHJvdGF0ZSgyNTEuNWRlZyk7IH1cbiAgICA3NSUgICAgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGVYKDE4MGRlZykgcm90YXRlKDI1MS41ZGVnKTsgfVxuXG4gICAgNzUuMDAwMSUgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpOyB9XG4gICAgODcuNSUgICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsgfVxuICAgIDg3LjUwMDElICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlWCgxODBkZWcpIHJvdGF0ZSgzNDEuNWRlZyk7IH1cbiAgICAxMDAlICAgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGVYKDE4MGRlZykgcm90YXRlKDM0MS41ZGVnKTsgfVxuICB9XG4iLnJlcGxhY2UoL1NUQVJUX1ZBTFVFL2csIiIrLjk1KnQpLnJlcGxhY2UoL0VORF9WQUxVRS9nLCIiKy4yKnQpLnJlcGxhY2UoL0RJQU1FVEVSL2csYCR7dGhpcy5fc3Bpbm5lckFuaW1hdGlvbkxhYmVsfWApfV9nZXRTcGlubmVyQW5pbWF0aW9uTGFiZWwoKXtyZXR1cm4gdGhpcy5kaWFtZXRlci50b1N0cmluZygpLnJlcGxhY2UoIi4iLCJfIil9fW4xLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxuMSkoU20oaGcpLFNtKHd6KSxTbShaXyw4KSxTbShWUCw4KSxTbSh0MSkpfSxuMS7JtWNtcD10byh7dHlwZTpuMSxzZWxlY3RvcnM6W1sibWF0LXByb2dyZXNzLXNwaW5uZXIiXV0saG9zdEF0dHJzOlsicm9sZSIsInByb2dyZXNzYmFyIiwidGFiaW5kZXgiLCItMSIsMSwibWF0LXByb2dyZXNzLXNwaW5uZXIiXSxob3N0VmFyczoxMCxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmKGpwKCJhcmlhLXZhbHVlbWluIiwiZGV0ZXJtaW5hdGUiPT09bi5tb2RlPzA6bnVsbCkoImFyaWEtdmFsdWVtYXgiLCJkZXRlcm1pbmF0ZSI9PT1uLm1vZGU/MTAwOm51bGwpKCJhcmlhLXZhbHVlbm93IiwiZGV0ZXJtaW5hdGUiPT09bi5tb2RlP24udmFsdWU6bnVsbCkoIm1vZGUiLG4ubW9kZSksZHUoIndpZHRoIixuLmRpYW1ldGVyLCJweCIpKCJoZWlnaHQiLG4uZGlhbWV0ZXIsInB4IikscHUoIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIixuLl9ub29wQW5pbWF0aW9ucykpfSxpbnB1dHM6e2NvbG9yOiJjb2xvciIsbW9kZToibW9kZSIsZGlhbWV0ZXI6ImRpYW1ldGVyIixzdHJva2VXaWR0aDoic3Ryb2tlV2lkdGgiLHZhbHVlOiJ2YWx1ZSJ9LGV4cG9ydEFzOlsibWF0UHJvZ3Jlc3NTcGlubmVyIl0sZmVhdHVyZXM6W3hwXSxkZWNsczozLHZhcnM6OCxjb25zdHM6W1sicHJlc2VydmVBc3BlY3RSYXRpbyIsInhNaWRZTWlkIG1lZXQiLCJmb2N1c2FibGUiLCJmYWxzZSIsImFyaWEtaGlkZGVuIiwidHJ1ZSIsMywibmdTd2l0Y2giXSxbImN4IiwiNTAlIiwiY3kiLCI1MCUiLDMsImFuaW1hdGlvbi1uYW1lIiwic3Ryb2tlLWRhc2hvZmZzZXQiLCJzdHJva2UtZGFzaGFycmF5Iiwic3Ryb2tlLXdpZHRoIiw0LCJuZ1N3aXRjaENhc2UiXSxbImN4IiwiNTAlIiwiY3kiLCI1MCUiLDMsInN0cm9rZS1kYXNob2Zmc2V0Iiwic3Ryb2tlLWRhc2hhcnJheSIsInN0cm9rZS13aWR0aCIsNCwibmdTd2l0Y2hDYXNlIl0sWyJjeCIsIjUwJSIsImN5IiwiNTAlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihxaSgpLFJtKDAsInN2ZyIsMCksUXAoMSxaMCwxLDksImNpcmNsZSIsMSksUXAoMixYMCwxLDcsImNpcmNsZSIsMiksQW0oKSksMiZlJiYoZHUoIndpZHRoIixuLmRpYW1ldGVyLCJweCIpKCJoZWlnaHQiLG4uZGlhbWV0ZXIsInB4IiksRG0oIm5nU3dpdGNoIiwiaW5kZXRlcm1pbmF0ZSI9PT1uLm1vZGUpLGpwKCJ2aWV3Qm94IixuLl9nZXRWaWV3Qm94KCkpLHJjKDEpLERtKCJuZ1N3aXRjaENhc2UiLCEwKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIiwhMSkpfSxkaXJlY3RpdmVzOltmTSxnTV0sc3R5bGVzOltRMF0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksbjEuX2RpYW1ldGVycz1uZXcgV2Vha01hcCxuMS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTp3en0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3QxXX1dfV0sbjEucHJvcERlY29yYXRvcnM9e2RpYW1ldGVyOlt7dHlwZTp4eX1dLHN0cm9rZVdpZHRoOlt7dHlwZTp4eX1dLG1vZGU6W3t0eXBlOnh5fV0sdmFsdWU6W3t0eXBlOnh5fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobjEsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWF0LXByb2dyZXNzLXNwaW5uZXIiLGV4cG9ydEFzOiJtYXRQcm9ncmVzc1NwaW5uZXIiLGhvc3Q6e3JvbGU6InByb2dyZXNzYmFyIixjbGFzczoibWF0LXByb2dyZXNzLXNwaW5uZXIiLHRhYmluZGV4OiItMSIsIltjbGFzcy5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZV0iOiJfbm9vcEFuaW1hdGlvbnMiLCJbc3R5bGUud2lkdGgucHhdIjoiZGlhbWV0ZXIiLCJbc3R5bGUuaGVpZ2h0LnB4XSI6ImRpYW1ldGVyIiwiW2F0dHIuYXJpYS12YWx1ZW1pbl0iOidtb2RlID09PSAiZGV0ZXJtaW5hdGUiID8gMCA6IG51bGwnLCJbYXR0ci5hcmlhLXZhbHVlbWF4XSI6J21vZGUgPT09ICJkZXRlcm1pbmF0ZSIgPyAxMDAgOiBudWxsJywiW2F0dHIuYXJpYS12YWx1ZW5vd10iOidtb2RlID09PSAiZGV0ZXJtaW5hdGUiID8gdmFsdWUgOiBudWxsJywiW2F0dHIubW9kZV0iOiJtb2RlIn0saW5wdXRzOlsiY29sb3IiXSx0ZW1wbGF0ZTonXHgzYyEtLVxuICBwcmVzZXJ2ZUFzcGVjdFJhdGlvIG9mIHhNaWRZTWlkIG1lZXQgYXMgdGhlIGNlbnRlciBvZiB0aGUgdmlld3BvcnQgaXMgdGhlIGNpcmNsZVwnc1xuICBjZW50ZXIuIFRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZSB3aWxsIHJlbWFpbiBhdCB0aGUgY2VudGVyIG9mIHRoZSBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxuICBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIFNWRy4gYGZvY3VzYWJsZT0iZmFsc2UiYCBwcmV2ZW50cyBJRSBmcm9tIGFsbG93aW5nIHRoZSB1c2VyIHRvXG4gIHRhYiBpbnRvIHRoZSBTVkcgZWxlbWVudC5cbi0tXHgzZVxuXHgzYyEtLVxuICBBbGwgY2hpbGRyZW4gbmVlZCB0byBiZSBoaWRkZW4gZm9yIHNjcmVlbiByZWFkZXJzIGluIG9yZGVyIHRvIHN1cHBvcnQgQ2hyb21lVm94LlxuICBNb3JlIGNvbnRleHQgaW4gdGhlIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy8yMjE2NS5cbi0tXHgzZVxuPHN2Z1xuICBbc3R5bGUud2lkdGgucHhdPSJkaWFtZXRlciJcbiAgW3N0eWxlLmhlaWdodC5weF09ImRpYW1ldGVyIlxuICBbYXR0ci52aWV3Qm94XT0iX2dldFZpZXdCb3goKSJcbiAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCJcbiAgZm9jdXNhYmxlPSJmYWxzZSJcbiAgW25nU3dpdGNoXT0ibW9kZSA9PT0gXCdpbmRldGVybWluYXRlXCciXG4gIGFyaWEtaGlkZGVuPSJ0cnVlIj5cblxuICBceDNjIS0tXG4gICAgVGVjaG5pY2FsbHkgd2UgY2FuIHJldXNlIHRoZSBzYW1lIGBjaXJjbGVgIGVsZW1lbnQsIGhvd2V2ZXIgU2FmYXJpIGhhcyBhbiBpc3N1ZSB0aGF0IGJyZWFrc1xuICAgIHRoZSBTVkcgcmVuZGVyaW5nIGluIGRldGVybWluYXRlIG1vZGUsIGFmdGVyIHN3aXRjaGluZyBiZXR3ZWVuIGluZGV0ZXJtaW5hdGUgYW5kIGRldGVybWluYXRlLlxuICAgIFVzaW5nIGEgZGlmZmVyZW50IGVsZW1lbnQgYXZvaWRzIHRoZSBpc3N1ZS4gQW4gYWx0ZXJuYXRpdmUgdG8gdGhpcyBpcyBhZGRpbmcgYGRpc3BsYXk6IG5vbmVgXG4gICAgZm9yIGEgc3BsaXQgc2Vjb25kIGFuZCB0aGVuIHJlbW92aW5nIGl0IHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gbW9kZXMsIGJ1dCBpdFwncyBoYXJkIHRvIGtub3dcbiAgICBmb3IgaG93IGxvbmcgdG8gaGlkZSB0aGUgZWxlbWVudCBhbmQgaXQgY2FuIGNhdXNlIHRoZSBVSSB0byBibGluay5cbiAgLS1ceDNlXG4gIDxjaXJjbGVcbiAgICAqbmdTd2l0Y2hDYXNlPSJ0cnVlIlxuICAgIGN4PSI1MCUiXG4gICAgY3k9IjUwJSJcbiAgICBbYXR0ci5yXT0iX2dldENpcmNsZVJhZGl1cygpIlxuICAgIFtzdHlsZS5hbmltYXRpb24tbmFtZV09IlwnbWF0LXByb2dyZXNzLXNwaW5uZXItc3Ryb2tlLXJvdGF0ZS1cJyArIF9zcGlubmVyQW5pbWF0aW9uTGFiZWwiXG4gICAgW3N0eWxlLnN0cm9rZS1kYXNob2Zmc2V0LnB4XT0iX2dldFN0cm9rZURhc2hPZmZzZXQoKSJcbiAgICBbc3R5bGUuc3Ryb2tlLWRhc2hhcnJheS5weF09Il9nZXRTdHJva2VDaXJjdW1mZXJlbmNlKCkiXG4gICAgW3N0eWxlLnN0cm9rZS13aWR0aC4lXT0iX2dldENpcmNsZVN0cm9rZVdpZHRoKCkiPjwvY2lyY2xlPlxuXG4gIDxjaXJjbGVcbiAgICAqbmdTd2l0Y2hDYXNlPSJmYWxzZSJcbiAgICBjeD0iNTAlIlxuICAgIGN5PSI1MCUiXG4gICAgW2F0dHIucl09Il9nZXRDaXJjbGVSYWRpdXMoKSJcbiAgICBbc3R5bGUuc3Ryb2tlLWRhc2hvZmZzZXQucHhdPSJfZ2V0U3Ryb2tlRGFzaE9mZnNldCgpIlxuICAgIFtzdHlsZS5zdHJva2UtZGFzaGFycmF5LnB4XT0iX2dldFN0cm9rZUNpcmN1bWZlcmVuY2UoKSJcbiAgICBbc3R5bGUuc3Ryb2tlLXdpZHRoLiVdPSJfZ2V0Q2lyY2xlU3Ryb2tlV2lkdGgoKSI+PC9jaXJjbGU+XG48L3N2Zz5cbicsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaCxlbmNhcHN1bGF0aW9uOkhuLk5vbmUsc3R5bGVzOlsiLm1hdC1wcm9ncmVzcy1zcGlubmVye2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246cmVsYXRpdmU7b3ZlcmZsb3c6aGlkZGVufS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBzdmd7cG9zaXRpb246YWJzb2x1dGU7dHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpO3RvcDowO2xlZnQ6MDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBjaXJjbGV7ZmlsbDp0cmFuc3BhcmVudDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjt0cmFuc2l0aW9uOnN0cm9rZS1kYXNob2Zmc2V0IDIyNW1zIGxpbmVhcn0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXByb2dyZXNzLXNwaW5uZXIgY2lyY2xle3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBjaXJjbGV7c3Ryb2tlOmN1cnJlbnRDb2xvcjtzdHJva2U6Q2FudmFzVGV4dH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBzdmd7YW5pbWF0aW9uOm1hdC1wcm9ncmVzcy1zcGlubmVyLWxpbmVhci1yb3RhdGUgMjAwMG1zIGxpbmVhciBpbmZpbml0ZX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBzdmd7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1pbmRldGVybWluYXRlLWFuaW1hdGlvblttb2RlPWluZGV0ZXJtaW5hdGVdIGNpcmNsZXt0cmFuc2l0aW9uLXByb3BlcnR5OnN0cm9rZTthbmltYXRpb24tZHVyYXRpb246NDAwMG1zO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpO2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6aW5maW5pdGV9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV0gY2lyY2xle3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1mYWxsYmFjay1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBzdmd7YW5pbWF0aW9uOm1hdC1wcm9ncmVzcy1zcGlubmVyLXN0cm9rZS1yb3RhdGUtZmFsbGJhY2sgMTAwMDBtcyBjdWJpYy1iZXppZXIoMC44NywgMC4wMywgMC4zMywgMSkgaW5maW5pdGV9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtZmFsbGJhY2stYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV0gc3Zne3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1mYWxsYmFjay1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBjaXJjbGV7dHJhbnNpdGlvbi1wcm9wZXJ0eTpzdHJva2V9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtZmFsbGJhY2stYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV0gY2lyY2xle3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX1Aa2V5ZnJhbWVzIG1hdC1wcm9ncmVzcy1zcGlubmVyLWxpbmVhci1yb3RhdGV7MCV7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19QGtleWZyYW1lcyBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1zdHJva2Utcm90YXRlLTEwMHswJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMi41JXtzdHJva2UtZGFzaG9mZnNldDo1Ni41NDg2Njc3cHg7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMi41MDAxJXtzdHJva2UtZGFzaG9mZnNldDo1Ni41NDg2Njc3cHg7dHJhbnNmb3JtOnJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoNzIuNWRlZyl9MjUle3N0cm9rZS1kYXNob2Zmc2V0OjI2OC42MDYxNzE1NzVweDt0cmFuc2Zvcm06cm90YXRlWCgxODBkZWcpIHJvdGF0ZSg3Mi41ZGVnKX0yNS4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgyNzBkZWcpfTM3LjUle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlKDI3MGRlZyl9MzcuNTAwMSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDE2MS41ZGVnKX01MCV7c3Ryb2tlLWRhc2hvZmZzZXQ6MjY4LjYwNjE3MTU3NXB4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDE2MS41ZGVnKX01MC4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpfTYyLjUle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlKDE4MGRlZyl9NjIuNTAwMSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDI1MS41ZGVnKX03NSV7c3Ryb2tlLWRhc2hvZmZzZXQ6MjY4LjYwNjE3MTU3NXB4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDI1MS41ZGVnKX03NS4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyl9ODcuNSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGUoOTBkZWcpfTg3LjUwMDEle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlWCgxODBkZWcpIHJvdGF0ZSgzNDEuNWRlZyl9MTAwJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMzQxLjVkZWcpfX1Aa2V5ZnJhbWVzIG1hdC1wcm9ncmVzcy1zcGlubmVyLXN0cm9rZS1yb3RhdGUtZmFsbGJhY2t7MCV7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX0yNSV7dHJhbnNmb3JtOnJvdGF0ZSgxMTcwZGVnKX01MCV7dHJhbnNmb3JtOnJvdGF0ZSgyMzQwZGVnKX03NSV7dHJhbnNmb3JtOnJvdGF0ZSgzNTEwZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoNDY4MGRlZyl9fVxuIl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6d3p9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOlt0MV19XX1dfSkse21vZGU6W3t0eXBlOnh5fV0sZGlhbWV0ZXI6W3t0eXBlOnh5fV0sc3Ryb2tlV2lkdGg6W3t0eXBlOnh5fV0sdmFsdWU6W3t0eXBlOnh5fV19KTtjbGFzcyBvMSBleHRlbmRzIG4xe2NvbnN0cnVjdG9yKHQsZSxuLG8saSl7c3VwZXIodCxlLG4sbyxpKSx0aGlzLm1vZGU9ImluZGV0ZXJtaW5hdGUifX1vMS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bzEpKFNtKGhnKSxTbSh3eiksU20oWl8sOCksU20oVlAsOCksU20odDEpKX0sbzEuybVjbXA9dG8oe3R5cGU6bzEsc2VsZWN0b3JzOltbIm1hdC1zcGlubmVyIl1dLGhvc3RBdHRyczpbInJvbGUiLCJwcm9ncmVzc2JhciIsIm1vZGUiLCJpbmRldGVybWluYXRlIiwxLCJtYXQtc3Bpbm5lciIsIm1hdC1wcm9ncmVzcy1zcGlubmVyIl0saG9zdFZhcnM6Nixob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmKGR1KCJ3aWR0aCIsbi5kaWFtZXRlciwicHgiKSgiaGVpZ2h0IixuLmRpYW1ldGVyLCJweCIpLHB1KCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbi5fbm9vcEFuaW1hdGlvbnMpKX0saW5wdXRzOntjb2xvcjoiY29sb3IifSxmZWF0dXJlczpbeHBdLGRlY2xzOjMsdmFyczo4LGNvbnN0czpbWyJwcmVzZXJ2ZUFzcGVjdFJhdGlvIiwieE1pZFlNaWQgbWVldCIsImZvY3VzYWJsZSIsImZhbHNlIiwiYXJpYS1oaWRkZW4iLCJ0cnVlIiwzLCJuZ1N3aXRjaCJdLFsiY3giLCI1MCUiLCJjeSIsIjUwJSIsMywiYW5pbWF0aW9uLW5hbWUiLCJzdHJva2UtZGFzaG9mZnNldCIsInN0cm9rZS1kYXNoYXJyYXkiLCJzdHJva2Utd2lkdGgiLDQsIm5nU3dpdGNoQ2FzZSJdLFsiY3giLCI1MCUiLCJjeSIsIjUwJSIsMywic3Ryb2tlLWRhc2hvZmZzZXQiLCJzdHJva2UtZGFzaGFycmF5Iiwic3Ryb2tlLXdpZHRoIiw0LCJuZ1N3aXRjaENhc2UiXSxbImN4IiwiNTAlIiwiY3kiLCI1MCUiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKHFpKCksUm0oMCwic3ZnIiwwKSxRcCgxLEswLDEsOSwiY2lyY2xlIiwxKSxRcCgyLEowLDEsNywiY2lyY2xlIiwyKSxBbSgpKSwyJmUmJihkdSgid2lkdGgiLG4uZGlhbWV0ZXIsInB4IikoImhlaWdodCIsbi5kaWFtZXRlciwicHgiKSxEbSgibmdTd2l0Y2giLCJpbmRldGVybWluYXRlIj09PW4ubW9kZSksanAoInZpZXdCb3giLG4uX2dldFZpZXdCb3goKSkscmMoMSksRG0oIm5nU3dpdGNoQ2FzZSIsITApLHJjKDEpLERtKCJuZ1N3aXRjaENhc2UiLCExKSl9LGRpcmVjdGl2ZXM6W2ZNLGdNXSxzdHlsZXM6W1EwXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSxvMS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTp3en0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3QxXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChvMSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtYXQtc3Bpbm5lciIsaG9zdDp7cm9sZToicHJvZ3Jlc3NiYXIiLG1vZGU6ImluZGV0ZXJtaW5hdGUiLGNsYXNzOiJtYXQtc3Bpbm5lciBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lciIsIltjbGFzcy5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZV0iOiJfbm9vcEFuaW1hdGlvbnMiLCJbc3R5bGUud2lkdGgucHhdIjoiZGlhbWV0ZXIiLCJbc3R5bGUuaGVpZ2h0LnB4XSI6ImRpYW1ldGVyIn0saW5wdXRzOlsiY29sb3IiXSx0ZW1wbGF0ZTonXHgzYyEtLVxuICBwcmVzZXJ2ZUFzcGVjdFJhdGlvIG9mIHhNaWRZTWlkIG1lZXQgYXMgdGhlIGNlbnRlciBvZiB0aGUgdmlld3BvcnQgaXMgdGhlIGNpcmNsZVwnc1xuICBjZW50ZXIuIFRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZSB3aWxsIHJlbWFpbiBhdCB0aGUgY2VudGVyIG9mIHRoZSBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxuICBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIFNWRy4gYGZvY3VzYWJsZT0iZmFsc2UiYCBwcmV2ZW50cyBJRSBmcm9tIGFsbG93aW5nIHRoZSB1c2VyIHRvXG4gIHRhYiBpbnRvIHRoZSBTVkcgZWxlbWVudC5cbi0tXHgzZVxuXHgzYyEtLVxuICBBbGwgY2hpbGRyZW4gbmVlZCB0byBiZSBoaWRkZW4gZm9yIHNjcmVlbiByZWFkZXJzIGluIG9yZGVyIHRvIHN1cHBvcnQgQ2hyb21lVm94LlxuICBNb3JlIGNvbnRleHQgaW4gdGhlIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy8yMjE2NS5cbi0tXHgzZVxuPHN2Z1xuICBbc3R5bGUud2lkdGgucHhdPSJkaWFtZXRlciJcbiAgW3N0eWxlLmhlaWdodC5weF09ImRpYW1ldGVyIlxuICBbYXR0ci52aWV3Qm94XT0iX2dldFZpZXdCb3goKSJcbiAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCJcbiAgZm9jdXNhYmxlPSJmYWxzZSJcbiAgW25nU3dpdGNoXT0ibW9kZSA9PT0gXCdpbmRldGVybWluYXRlXCciXG4gIGFyaWEtaGlkZGVuPSJ0cnVlIj5cblxuICBceDNjIS0tXG4gICAgVGVjaG5pY2FsbHkgd2UgY2FuIHJldXNlIHRoZSBzYW1lIGBjaXJjbGVgIGVsZW1lbnQsIGhvd2V2ZXIgU2FmYXJpIGhhcyBhbiBpc3N1ZSB0aGF0IGJyZWFrc1xuICAgIHRoZSBTVkcgcmVuZGVyaW5nIGluIGRldGVybWluYXRlIG1vZGUsIGFmdGVyIHN3aXRjaGluZyBiZXR3ZWVuIGluZGV0ZXJtaW5hdGUgYW5kIGRldGVybWluYXRlLlxuICAgIFVzaW5nIGEgZGlmZmVyZW50IGVsZW1lbnQgYXZvaWRzIHRoZSBpc3N1ZS4gQW4gYWx0ZXJuYXRpdmUgdG8gdGhpcyBpcyBhZGRpbmcgYGRpc3BsYXk6IG5vbmVgXG4gICAgZm9yIGEgc3BsaXQgc2Vjb25kIGFuZCB0aGVuIHJlbW92aW5nIGl0IHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gbW9kZXMsIGJ1dCBpdFwncyBoYXJkIHRvIGtub3dcbiAgICBmb3IgaG93IGxvbmcgdG8gaGlkZSB0aGUgZWxlbWVudCBhbmQgaXQgY2FuIGNhdXNlIHRoZSBVSSB0byBibGluay5cbiAgLS1ceDNlXG4gIDxjaXJjbGVcbiAgICAqbmdTd2l0Y2hDYXNlPSJ0cnVlIlxuICAgIGN4PSI1MCUiXG4gICAgY3k9IjUwJSJcbiAgICBbYXR0ci5yXT0iX2dldENpcmNsZVJhZGl1cygpIlxuICAgIFtzdHlsZS5hbmltYXRpb24tbmFtZV09IlwnbWF0LXByb2dyZXNzLXNwaW5uZXItc3Ryb2tlLXJvdGF0ZS1cJyArIF9zcGlubmVyQW5pbWF0aW9uTGFiZWwiXG4gICAgW3N0eWxlLnN0cm9rZS1kYXNob2Zmc2V0LnB4XT0iX2dldFN0cm9rZURhc2hPZmZzZXQoKSJcbiAgICBbc3R5bGUuc3Ryb2tlLWRhc2hhcnJheS5weF09Il9nZXRTdHJva2VDaXJjdW1mZXJlbmNlKCkiXG4gICAgW3N0eWxlLnN0cm9rZS13aWR0aC4lXT0iX2dldENpcmNsZVN0cm9rZVdpZHRoKCkiPjwvY2lyY2xlPlxuXG4gIDxjaXJjbGVcbiAgICAqbmdTd2l0Y2hDYXNlPSJmYWxzZSJcbiAgICBjeD0iNTAlIlxuICAgIGN5PSI1MCUiXG4gICAgW2F0dHIucl09Il9nZXRDaXJjbGVSYWRpdXMoKSJcbiAgICBbc3R5bGUuc3Ryb2tlLWRhc2hvZmZzZXQucHhdPSJfZ2V0U3Ryb2tlRGFzaE9mZnNldCgpIlxuICAgIFtzdHlsZS5zdHJva2UtZGFzaGFycmF5LnB4XT0iX2dldFN0cm9rZUNpcmN1bWZlcmVuY2UoKSJcbiAgICBbc3R5bGUuc3Ryb2tlLXdpZHRoLiVdPSJfZ2V0Q2lyY2xlU3Ryb2tlV2lkdGgoKSI+PC9jaXJjbGU+XG48L3N2Zz5cbicsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaCxlbmNhcHN1bGF0aW9uOkhuLk5vbmUsc3R5bGVzOlsiLm1hdC1wcm9ncmVzcy1zcGlubmVye2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246cmVsYXRpdmU7b3ZlcmZsb3c6aGlkZGVufS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBzdmd7cG9zaXRpb246YWJzb2x1dGU7dHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpO3RvcDowO2xlZnQ6MDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBjaXJjbGV7ZmlsbDp0cmFuc3BhcmVudDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjt0cmFuc2l0aW9uOnN0cm9rZS1kYXNob2Zmc2V0IDIyNW1zIGxpbmVhcn0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXByb2dyZXNzLXNwaW5uZXIgY2lyY2xle3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBjaXJjbGV7c3Ryb2tlOmN1cnJlbnRDb2xvcjtzdHJva2U6Q2FudmFzVGV4dH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBzdmd7YW5pbWF0aW9uOm1hdC1wcm9ncmVzcy1zcGlubmVyLWxpbmVhci1yb3RhdGUgMjAwMG1zIGxpbmVhciBpbmZpbml0ZX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBzdmd7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1pbmRldGVybWluYXRlLWFuaW1hdGlvblttb2RlPWluZGV0ZXJtaW5hdGVdIGNpcmNsZXt0cmFuc2l0aW9uLXByb3BlcnR5OnN0cm9rZTthbmltYXRpb24tZHVyYXRpb246NDAwMG1zO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpO2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6aW5maW5pdGV9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV0gY2lyY2xle3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1mYWxsYmFjay1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBzdmd7YW5pbWF0aW9uOm1hdC1wcm9ncmVzcy1zcGlubmVyLXN0cm9rZS1yb3RhdGUtZmFsbGJhY2sgMTAwMDBtcyBjdWJpYy1iZXppZXIoMC44NywgMC4wMywgMC4zMywgMSkgaW5maW5pdGV9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtZmFsbGJhY2stYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV0gc3Zne3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1mYWxsYmFjay1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBjaXJjbGV7dHJhbnNpdGlvbi1wcm9wZXJ0eTpzdHJva2V9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtZmFsbGJhY2stYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV0gY2lyY2xle3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX1Aa2V5ZnJhbWVzIG1hdC1wcm9ncmVzcy1zcGlubmVyLWxpbmVhci1yb3RhdGV7MCV7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19QGtleWZyYW1lcyBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1zdHJva2Utcm90YXRlLTEwMHswJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMi41JXtzdHJva2UtZGFzaG9mZnNldDo1Ni41NDg2Njc3cHg7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMi41MDAxJXtzdHJva2UtZGFzaG9mZnNldDo1Ni41NDg2Njc3cHg7dHJhbnNmb3JtOnJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoNzIuNWRlZyl9MjUle3N0cm9rZS1kYXNob2Zmc2V0OjI2OC42MDYxNzE1NzVweDt0cmFuc2Zvcm06cm90YXRlWCgxODBkZWcpIHJvdGF0ZSg3Mi41ZGVnKX0yNS4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgyNzBkZWcpfTM3LjUle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlKDI3MGRlZyl9MzcuNTAwMSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDE2MS41ZGVnKX01MCV7c3Ryb2tlLWRhc2hvZmZzZXQ6MjY4LjYwNjE3MTU3NXB4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDE2MS41ZGVnKX01MC4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpfTYyLjUle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlKDE4MGRlZyl9NjIuNTAwMSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDI1MS41ZGVnKX03NSV7c3Ryb2tlLWRhc2hvZmZzZXQ6MjY4LjYwNjE3MTU3NXB4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDI1MS41ZGVnKX03NS4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyl9ODcuNSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGUoOTBkZWcpfTg3LjUwMDEle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlWCgxODBkZWcpIHJvdGF0ZSgzNDEuNWRlZyl9MTAwJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMzQxLjVkZWcpfX1Aa2V5ZnJhbWVzIG1hdC1wcm9ncmVzcy1zcGlubmVyLXN0cm9rZS1yb3RhdGUtZmFsbGJhY2t7MCV7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX0yNSV7dHJhbnNmb3JtOnJvdGF0ZSgxMTcwZGVnKX01MCV7dHJhbnNmb3JtOnJvdGF0ZSgyMzQwZGVnKX03NSV7dHJhbnNmb3JtOnJvdGF0ZSgzNTEwZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoNDY4MGRlZyl9fVxuIl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6d3p9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOlt0MV19XX1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBpMXt9aTEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGkxKX0saTEuybVtb2Q9YW8oe3R5cGU6aTF9KSxpMS7JtWluaj12bih7aW1wb3J0czpbW1hJLFdNXSxYSV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGkxLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbWEksV01dLGV4cG9ydHM6W24xLG8xLFhJXSxkZWNsYXJhdGlvbnM6W24xLG8xXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKGkxLHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bbjEsbzFdfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1hJLFdNXX0sZXhwb3J0czpmdW5jdGlvbigpe3JldHVybltuMSxvMSxYSV19fSk7Y29uc3QgYTE9WyJyZWdleFN0cmluZ0lucHV0Il07ZnVuY3Rpb24gcjEodCxlKXtpZigxJnQmJihObSgwKSxSbSgxLCJsaSIsMjIpLGt1KDIpLEFtKCksem0oKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0O3JjKDEpLERtKCJ0aXRsZSIsdC5uYW1lKSxyYygxKSxTdSh0Lm5hbWUpfX1mdW5jdGlvbiBzMSh0LGUpe2lmKDEmdCYmKFJtKDAsImxpIiwyMyksUm0oMSwiZW0iKSxrdSgyKSxBaCgzLCJudW1iZXIiKSxBbSgpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpLiRpbXBsaWNpdDtyYygyKSxEdSgiYW5kICIsVGgoMywxLHQucnVucy5sZW5ndGgtNSksIiBtb3JlIil9fWZ1bmN0aW9uIGwxKHQsZSl7MSZ0JiYoUm0oMCwibGkiLDI0KSxSbSgxLCJlbSIpLGt1KDIsIk5vIHJ1bnMgYXJlIGluIHRoZSBncm91cCIpLEFtKCksQW0oKSl9Y29uc3QgYzE9ZnVuY3Rpb24odCl7cmV0dXJue2JvcmRlckNvbG9yOnR9fSxkMT1mdW5jdGlvbih0KXtyZXR1cm57YmFja2dyb3VuZENvbG9yOnR9fTtmdW5jdGlvbiBwMSh0LGUpe2lmKDEmdCYmKFJtKDAsInVsIiwxNiksUm0oMSwibGkiKSxSbSgyLCJsYWJlbCIpLFRtKDMsInNwYW4iLDE3KSxSbSg0LCJjb2RlIiwxOCksa3UoNSksQW0oKSxBbSgpLFJtKDYsInVsIiksUXAoNyxyMSwzLDIsIm5nLWNvbnRhaW5lciIsMTkpLEFoKDgsInNsaWNlIiksUXAoOSxzMSw0LDMsImxpIiwyMCksUXAoMTAsbDEsMywwLCJsaSIsMjEpLEFtKCksQW0oKSxBbSgpKSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQ7RG0oIm5nU3R5bGUiLE1oKDExLGMxLHQuY29sb3IpKSxyYygzKSxEbSgibmdTdHlsZSIsTWgoMTMsZDEsdC5jb2xvcikpLHJjKDEpLERtKCJ0aXRsZSIsdC5ncm91cElkKSxyYygxKSxTdSh0Lmdyb3VwSWQpLHJjKDIpLERtKCJuZ0Zvck9mIix6aCg4LDcsdC5ydW5zLDAsNSkpLHJjKDIpLERtKCJuZ0lmIix0LnJ1bnMubGVuZ3RoPjUpLHJjKDEpLERtKCJuZ0lmIiwwPT09dC5ydW5zLmxlbmd0aCl9fWZ1bmN0aW9uIG0xKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2IiwxNCksUXAoMSxwMSwxMSwxNSwidWwiLDE1KSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMik7cmMoMSksRG0oIm5nRm9yT2YiLHQuY29sb3JSdW5QYWlyTGlzdCl9fWZ1bmN0aW9uIHUxKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2IiwyNSksa3UoMSwiIFRoZXJlIGFyZSBubyBydW5zIG1hdGNoaW5nIHRoZSByZWdleCwgIiksUm0oMiwiY29kZSIpLGt1KDMpLEFtKCksa3UoNCwiLiBQbGVhc2UgY2hlY2sgaWYgeW91ciByZWdleCBzdHJpbmcgaXMgY29ycmVjdC4gIiksQW0oKSksMiZ0KXtjb25zdCB0PVltKDIpO3JjKDMpLER1KCIvIix0LnJlZ2V4U3RyaW5nLCIvIil9fWZ1bmN0aW9uIGYxKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2IiwxMCksUm0oMSwiaDQiKSxrdSgyLCJDb2xvciBncm91cCBwcmV2aWV3IiksQW0oKSxSbSgzLCJkaXYiLDExKSxRcCg0LG0xLDIsMSwiZGl2IiwxMiksUXAoNSx1MSw1LDEsIm5nLXRlbXBsYXRlIixudWxsLDEzLGliKSxBbSgpLEFtKCkpLDImdCl7Y29uc3QgdD0kcCg2KSxlPVltKCk7cmMoNCksRG0oIm5nSWYiLGUuY29sb3JSdW5QYWlyTGlzdC5sZW5ndGgpKCJuZ0lmRWxzZSIsdCl9fWNsYXNzIGcxe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5kaWFsb2dSZWY9dCx0aGlzLmhvc3RFbFJlZj1lLHRoaXMub25TYXZlPW5ldyBMaCx0aGlzLnJlZ2V4SW5wdXRPbkNoYW5nZT1uZXcgTGgsdGhpcy50aW1lT3V0SWQ9MH1yZXNldEZvY3VzKCl7dGhpcy5ob3N0RWxSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KXx8dGhpcy5yZWdleFN0cmluZ0lucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKX1vbkVudGVyKHQpe3RoaXMub25TYXZlQ2xpY2sodCksdGhpcy5kaWFsb2dSZWYuY2xvc2UoKX1vblNhdmVDbGljayh0KXt0aGlzLm9uU2F2ZS5lbWl0KHQpfWZpbGxFeGFtcGxlKHQpe3RoaXMucmVnZXhTdHJpbmc9dCx0aGlzLnJlZ2V4SW5wdXRDaGFuZ2UodCl9cmVnZXhJbnB1dENoYW5nZSh0KXt0aGlzLnJlZ2V4SW5wdXRPbkNoYW5nZS5lbWl0KHQpfWhhbmRsZUZvY3VzT3V0KCl7Y2xlYXJUaW1lb3V0KHRoaXMudGltZU91dElkKSx0aGlzLnRpbWVPdXRJZD1zZXRUaW1lb3V0KHRoaXMucmVzZXRGb2N1cy5iaW5kKHRoaXMpLDApfX1nMS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8ZzEpKFNtKFhHKSxTbShoZykpfSxnMS7JtWNtcD10byh7dHlwZTpnMSxzZWxlY3RvcnM6W1sicmVnZXgtZWRpdC1kaWFsb2ctY29tcG9uZW50Il1dLHZpZXdRdWVyeTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiZRaChhMSw3KSwyJmUpe2xldCB0O0poKHQ9dGIoKSkmJihuLnJlZ2V4U3RyaW5nSW5wdXQ9dC5maXJzdCl9fSxpbnB1dHM6e3JlZ2V4U3RyaW5nOiJyZWdleFN0cmluZyIsY29sb3JSdW5QYWlyTGlzdDoiY29sb3JSdW5QYWlyTGlzdCJ9LG91dHB1dHM6e29uU2F2ZToib25TYXZlIixyZWdleElucHV0T25DaGFuZ2U6InJlZ2V4SW5wdXRPbkNoYW5nZSJ9LGRlY2xzOjMwLHZhcnM6Mixjb25zdHM6ZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gdD0idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZT9nb29nLmdldE1zZygiQ29sb3IgUnVucyBieSBSZWdleCBRdWVyeSIpOiRsb2NhbGl6ZWA6Q29sb3IgUnVucyBieSBSZWdleCBRdWVyeeKQnzE1ZWQ5ZjZmZDJkNDkwNmE0ODAzZmMxMjU1ZGUzYzVkYjJjNTY1MzDikJ85MDg4OTg1MTEzOTYwMzEyODA4OkNvbG9yIFJ1bnMgYnkgUmVnZXggUXVlcnlgLFtbMSwicmVnZXgtZWRpdC1kaWFsb2ciLDMsImZvY3Vzb3V0Il0sWyJtYXQtZGlhbG9nLXRpdGxlIiwiIl0sWyJtYXRJbnB1dCIsIiIsImFyaWEtbGFiZWwiLHQsImNka0ZvY3VzSW5pdGlhbCIsIiIsMywidmFsdWUiLCJrZXlkb3duLmVudGVyIiwiaW5wdXQiXSxbInJlZ2V4U3RyaW5nSW5wdXQiLCIiXSxbMSwiZXhhbXBsZS1kZXRhaWxzIl0sWzMsImNsaWNrIl0sWyJjbGFzcyIsImdyb3VwLWNvbnRhaW5lciIsNCwibmdJZiJdLFsibWF0LWRpYWxvZy1hY3Rpb25zIiwiIiwiYWxpZ24iLCJlbmQiXSxbIm1hdC1idXR0b24iLCIiLCJtYXQtZGlhbG9nLWNsb3NlIiwiIl0sWyJtYXQtcmFpc2VkLWJ1dHRvbiIsIiIsImNvbG9yIiwicHJpbWFyeSIsIm1hdC1kaWFsb2ctY2xvc2UiLCIiLDMsImNsaWNrIl0sWzEsImdyb3VwLWNvbnRhaW5lciJdLFsxLCJncm91cGluZy1wcmV2aWV3Il0sWyJjbGFzcyIsIm1hdGNoLWNvbnRhaW5lciIsNCwibmdJZiIsIm5nSWZFbHNlIl0sWyJlbXB0eSIsIiJdLFsxLCJtYXRjaC1jb250YWluZXIiXSxbImNsYXNzIiwiZ3JvdXAiLDMsIm5nU3R5bGUiLDQsIm5nRm9yIiwibmdGb3JPZiJdLFsxLCJncm91cCIsMywibmdTdHlsZSJdLFsxLCJjb2xvci1zd2F0Y2giLDMsIm5nU3R5bGUiXSxbMSwiZ3JvdXAtaWQiLDMsInRpdGxlIl0sWzQsIm5nRm9yIiwibmdGb3JPZiJdLFsiY2xhc3MiLCJtb3JlIiw0LCJuZ0lmIl0sWyJjbGFzcyIsIm5vLW1hdGNoIiw0LCJuZ0lmIl0sWzMsInRpdGxlIl0sWzEsIm1vcmUiXSxbMSwibm8tbWF0Y2giXSxbMSwid2FybmluZyJdXX0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSl7Y29uc3QgdD1IbSgpO1JtKDAsImRpdiIsMCksVm0oImZvY3Vzb3V0IiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLmhhbmRsZUZvY3VzT3V0KCl9KSksUm0oMSwiaDEiLDEpLGt1KDIsIkNvbG9yIHJ1bnMgYnkgcmVnZXgiKSxBbSgpLFJtKDMsIm1hdC1kaWFsb2ctY29udGVudCIpLFJtKDQsInAiKSxrdSg1LCJFbnRlciBhIHJlZ2V4IHdpdGggY2FwdHVyaW5nIGdyb3VwcyB0byBtYXRjaCBhZ2FpbnN0IHJ1biBuYW1lczoiKSxBbSgpLFJtKDYsIm1hdC1mb3JtLWZpZWxkIiksUm0oNywiaW5wdXQiLDIsMyksVm0oImtleWRvd24uZW50ZXIiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uRW50ZXIoZS50YXJnZXQudmFsdWUpfSkpKCJpbnB1dCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ucmVnZXhJbnB1dENoYW5nZShlLnRhcmdldC52YWx1ZSl9KSksQW0oKSxBbSgpLEFtKCksUm0oOSwiZGl2Iiw0KSxSbSgxMCwicCIpLGt1KDExLCcgRWFjaCBtYXRjaGluZyBydW4gd2lsbCBiZSBhc3NpZ25lZCBhIGNvbG9yIGJhc2VkIG9uIHRoZSAia2V5IiBmb3JtZWQgYnkgaXRzIG1hdGNoZXMgdG8gdGhlIGNhcHR1cmluZyBncm91cHMuICcpLFRtKDEyLCJiciIpLFJtKDEzLCJidXR0b24iLDUpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5maWxsRXhhbXBsZSgiKHRyYWlufGV2YWwpIil9KSksa3UoMTQsIiBUcnkgIiksUm0oMTUsImNvZGUiKSxrdSgxNiwiKHRyYWlufGV2YWwpIiksQW0oKSxBbSgpLGt1KDE3LCIgdG8gYXNzaWduIGFsbCBydW5zIGNvbnRhaW5pbmcgIiksUm0oMTgsImNvZGUiKSxrdSgxOSwidHJhaW4iKSxBbSgpLGt1KDIwLCIgdG8gb25lIGNvbG9yIGFuZCBhbGwgcnVucyBjb250YWluaW5nICIpLFJtKDIxLCJjb2RlIiksa3UoMjIsImV2YWwiKSxBbSgpLGt1KDIzLCIgdG8gYW5vdGhlciBjb2xvci4gIiksQW0oKSxBbSgpLFFwKDI0LGYxLDcsMiwiZGl2Iiw2KSxSbSgyNSwiZGl2Iiw3KSxSbSgyNiwiYnV0dG9uIiw4KSxrdSgyNywiQ2FuY2VsIiksQW0oKSxSbSgyOCwiYnV0dG9uIiw5KSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7aGkodCk7Y29uc3Qgbz0kcCg4KTtyZXR1cm4gbi5vblNhdmVDbGljayhvLnZhbHVlKX0pKSxrdSgyOSwiIFNhdmUgIiksQW0oKSxBbSgpLEFtKCl9MiZlJiYocmMoNyksS20oInZhbHVlIixuLnJlZ2V4U3RyaW5nKSxyYygxNyksRG0oIm5nSWYiLG4ucmVnZXhTdHJpbmcpKX0sZGlyZWN0aXZlczpbclcsc1csQVYsTFksZE0sbFcsWEgsYVcsbE0sQ01dLHBpcGVzOltVTSxGTV0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9LmV4YW1wbGUtZGV0YWlsc1tfbmdjb250ZW50LSVDT01QJV0gICBidXR0b25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7cGFkZGluZzowO2JvcmRlcjpub25lO2N1cnNvcjpwb2ludGVyO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y29sb3I6IzE5NzZkMn1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuZXhhbXBsZS1kZXRhaWxzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5leGFtcGxlLWRldGFpbHNbX25nY29udGVudC0lQ09NUCVdICAgYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNDJhNWY1fS5leGFtcGxlLWRldGFpbHNbX25nY29udGVudC0lQ09NUCVdICAgYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTp2aXNpdGVke2NvbG9yOiM3YjFmYTJ9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmV4YW1wbGUtZGV0YWlsc1tfbmdjb250ZW50LSVDT01QJV0gICBidXR0b25bX25nY29udGVudC0lQ09NUCVdOnZpc2l0ZWQsIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5leGFtcGxlLWRldGFpbHNbX25nY29udGVudC0lQ09NUCVdICAgYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTp2aXNpdGVke2NvbG9yOiNiYTY4Yzh9Lmdyb3VwLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjEwcHggMH0uZ3JvdXAtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOjEwcHh9Lmdyb3VwLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0gICAud2FybmluZ1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MTtmb250LXNpemU6LjllbX1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXAtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC53YXJuaW5nW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmdyb3VwLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0gICAud2FybmluZ1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9Lmdyb3VwaW5nLXByZXZpZXdbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjoxcHggc29saWQgI2ViZWJlYjttYXgtaGVpZ2h0OjUwdmg7b3ZlcmZsb3cteTphdXRvO3BhZGRpbmc6MjBweH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXBpbmctcHJldmlld1tfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cGluZy1wcmV2aWV3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MXB4IHNvbGlkICM1NTV9Lm1hdGNoLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6ZmxleC1zdGFydDtkaXNwbGF5OmdyaWQ7ZmxleC13cmFwOndyYXA7Z2FwOjEwcHg7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdCgyLCBtaW5tYXgoNTAlLCAxZnIpKX0uY29sb3Itc3dhdGNoW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmFkaXVzOjUwJTtib3gtc2hhZG93OjAgMCAycHggIzAwMDtkaXNwbGF5OmlubGluZS1ibG9jaztoZWlnaHQ6MTVweDt3aWR0aDoxNXB4fXVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaXN0LXN0eWxlLXR5cGU6bm9uZTtwYWRkaW5nOjB9bWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCV9Lmdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MXB4IHNvbGlkICNlYmViZWI7Ym9yZGVyLXJhZGl1czozcHg7bWFyZ2luOjA7cGFkZGluZzoxMHB4fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cFtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjFweCBzb2xpZCAjNTU1fS5ncm91cFtfbmdjb250ZW50LSVDT01QJV0gICBsYWJlbFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2ViZWJlYjthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpncmlkO2dhcDoxMHB4O2dyaWQtdGVtcGxhdGUtY29sdW1uczptYXgtY29udGVudCBhdXRvO3BhZGRpbmc6NXB4IDB9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjNTU1fS5ncm91cFtfbmdjb250ZW50LSVDT01QJV0gICBsYWJlbFtfbmdjb250ZW50LSVDT01QJV0gICAuZ3JvdXAtaWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTouOTVlbTtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9Lmdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6LjllbX0uZ3JvdXBbX25nY29udGVudC0lQ09NUCVdICAgdWxbX25nY29udGVudC0lQ09NUCVdICAgbGlbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcH0uZ3JvdXBbX25nY29udGVudC0lQ09NUCVdICAgLm1vcmVbX25nY29udGVudC0lQ09NUCVdLCAuZ3JvdXBbX25nY29udGVudC0lQ09NUCVdICAgLm5vLW1hdGNoW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxO21hcmdpbi10b3A6NXB4fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cFtfbmdjb250ZW50LSVDT01QJV0gICAubW9yZVtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cFtfbmdjb250ZW50LSVDT01QJV0gICAubW9yZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5uby1tYXRjaFtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cFtfbmdjb250ZW50LSVDT01QJV0gICAubm8tbWF0Y2hbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChnMSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJyZWdleC1lZGl0LWRpYWxvZy1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiJyZWdleF9lZGl0X2RpYWxvZy5uZy5odG1sIixzdHlsZVVybHM6WyJyZWdleF9lZGl0X2RpYWxvZ19jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlhHfSx7dHlwZTpoZ31dfSkse3JlZ2V4U3RyaW5nOlt7dHlwZTp4eX1dLGNvbG9yUnVuUGFpckxpc3Q6W3t0eXBlOnh5fV0sb25TYXZlOlt7dHlwZTpPeX1dLHJlZ2V4SW5wdXRPbkNoYW5nZTpbe3R5cGU6T3l9XSxyZWdleFN0cmluZ0lucHV0Olt7dHlwZTpaYSxhcmdzOlsicmVnZXhTdHJpbmdJbnB1dCIse3N0YXRpYzohMH1dfV19KTtjbGFzcyBoMXtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5zdG9yZT10LHRoaXMuZGlhbG9nUmVmPWUsdGhpcy50ZW50YXRpdmVSZWdleFN0cmluZyQ9bmV3IEksdGhpcy5ncm91cEJ5UmVnZXhTdHJpbmckPVF0KCgoKT0+cmUodGhpcy5zdG9yZS5zZWxlY3QoTU4pLnBpcGUoYmUoMSkpLHRoaXMudGVudGF0aXZlUmVnZXhTdHJpbmckKSkpLnBpcGUoTmUoIiIpKSx0aGlzLmNvbG9yUnVuUGFpckxpc3QkPVF0KCgoKT0+dGhpcy5ncm91cEJ5UmVnZXhTdHJpbmckLnBpcGUoZ2UoNTAwKSxjZSgodD0+e3RyeXtjb25zdCBlPW5ldyBSZWdFeHAodCk7cmV0dXJuIEJvb2xlYW4oZSl9Y2F0Y2godCl7cmV0dXJuITF9fSkpLGZlKHRoaXMuYWxsUnVucyQsdGhpcy5ydW5JZFRvRWlkJCx0aGlzLnN0b3JlLnNlbGVjdChBTiksdGhpcy5zdG9yZS5zZWxlY3QoSkQpKSxJdCgoKFt0LGUsbixvLGldKT0+e2NvbnN0IGE9bk4oe2tleTp0Ti5SRUdFWCxyZWdleFN0cmluZzp0fSxlLG4pLHI9bmV3IE1hcCxzPVtdO2Zvcihjb25zdFt0LGVdb2YgT2JqZWN0LmVudHJpZXMoYS5tYXRjaGVzKSl7bGV0IG49ci5nZXQodCk7aWYoIW4pe2NvbnN0IGU9by5jb2xvcnNbci5zaXplJW8uY29sb3JzLmxlbmd0aF07bj1pP2UuZGFya0hleDplLmxpZ2h0SGV4LHIuc2V0KHQsbil9cy5wdXNoKHtncm91cElkOnQsY29sb3I6bixydW5zOmV9KX1yZXR1cm4gc30pKSkpKS5waXBlKE5lKFtdKSksdGhpcy5leHBlcmltZW50SWRzPW4uZXhwZXJpbWVudElkcyx0aGlzLnJ1bklkVG9FaWQkPVd0KHRoaXMuZXhwZXJpbWVudElkcy5tYXAoKHQ9PnRoaXMuc3RvcmUuc2VsZWN0KGNOLHtleHBlcmltZW50SWQ6dH0pLnBpcGUoSXQoKGU9Pih7ZXhwZXJpbWVudElkOnQscnVuSWRzOmV9KSkpKSkpKS5waXBlKEl0KCh0PT57Y29uc3QgZT17fTtmb3IoY29uc3R7cnVuSWRzOm4sZXhwZXJpbWVudElkOm99b2YgdClmb3IoY29uc3QgdCBvZiBuKWVbdF09bztyZXR1cm4gZX0pKSksdGhpcy5hbGxSdW5zJD1XdCh0aGlzLmV4cGVyaW1lbnRJZHMubWFwKCh0PT50aGlzLnN0b3JlLnNlbGVjdChsTix7ZXhwZXJpbWVudElkOnR9KSkpKS5waXBlKEl0KCh0PT50LmZsYXQoKSkpKX1vblJlZ2V4SW5wdXRPbkNoYW5nZSh0KXt0aGlzLnRlbnRhdGl2ZVJlZ2V4U3RyaW5nJC5uZXh0KHQpfW9uU2F2ZSh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKEdSKHtleHBlcmltZW50SWRzOnRoaXMuZXhwZXJpbWVudElkcyxncm91cEJ5OntrZXk6dE4uUkVHRVgscmVnZXhTdHJpbmc6dH19KSl9fWZ1bmN0aW9uIGIxKHQsZSl7MSZ0JiZUbSgwLCJtYXQtaWNvbiIsMTEpfWZ1bmN0aW9uIHkxKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiYnV0dG9uIiwxMCksVm0oImNsaWNrIiwoZnVuY3Rpb24gZSgpe2hpKHQpO2NvbnN0IG49WW0oKTtyZXR1cm4gbi5vbkdyb3VwQnlDaGFuZ2UuZW1pdCh7a2V5Om4uR3JvdXBCeUtleS5FWFBFUklNRU5UfSl9KSksUm0oMSwic3BhbiIpLFFwKDIsYjEsMSwwLCJtYXQtaWNvbiIsNyksQW0oKSxSbSgzLCJsYWJlbCIpLGt1KDQsIkV4cGVyaW1lbnQiKSxBbSgpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKCk7anAoImFyaWEtY2hlY2tlZCIsdC5zZWxlY3RlZEdyb3VwQnkua2V5PT09dC5Hcm91cEJ5S2V5LkVYUEVSSU1FTlQpLHJjKDIpLERtKCJuZ0lmIix0LnNlbGVjdGVkR3JvdXBCeS5rZXk9PT10Lkdyb3VwQnlLZXkuRVhQRVJJTUVOVCl9fWZ1bmN0aW9uIF8xKHQsZSl7MSZ0JiZUbSgwLCJtYXQtaWNvbiIsMTEpfWZ1bmN0aW9uIEMxKHQsZSl7MSZ0JiZUbSgwLCJtYXQtaWNvbiIsMTEpfWZ1bmN0aW9uIE0xKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiYnV0dG9uIiwxMiksVm0oImNsaWNrIiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgpLm9uR3JvdXBCeVJlZ2V4Q2xpY2soKX0pKSxSbSgxLCJzcGFuIiksUXAoMixDMSwxLDAsIm1hdC1pY29uIiw3KSxBbSgpLFJtKDMsImxhYmVsIiksa3UoNCwiUmVnZXgiKSxBbSgpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKCk7anAoImFyaWEtY2hlY2tlZCIsdC5zZWxlY3RlZEdyb3VwQnkua2V5PT09dC5Hcm91cEJ5S2V5LlJFR0VYKSxyYygyKSxEbSgibmdJZiIsdC5zZWxlY3RlZEdyb3VwQnkua2V5PT09dC5Hcm91cEJ5S2V5LlJFR0VYKX19ZnVuY3Rpb24gdjEodCxlKXtpZigxJnQmJihSbSgwLCJsYWJlbCIpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgyKTtyYygxKSxTdSh0LnJlZ2V4U3RyaW5nKX19ZnVuY3Rpb24geDEodCxlKXsxJnQmJihSbSgwLCJsYWJlbCIsMTcpLGt1KDEsIihub25lIHNldCkiKSxBbSgpKX1mdW5jdGlvbiBPMSh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsImJ1dHRvbiIsMTMpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5vblJlZ2V4U3RyaW5nRWRpdCgpfSkpLFJtKDEsInNwYW4iKSxUbSgyLCJtYXQtaWNvbiIsMTQpLEFtKCksUXAoMyx2MSwyLDEsImxhYmVsIiwxNSksUXAoNCx4MSwyLDAsImxhYmVsIiwxNiksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKTtyYygzKSxEbSgibmdJZiIsdC5yZWdleFN0cmluZykscmMoMSksRG0oIm5nSWYiLCF0LnJlZ2V4U3RyaW5nKX19aDEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGgxKShTbShJdyksU20oWEcpLFNtKEpHKSl9LGgxLsm1Y21wPXRvKHt0eXBlOmgxLHNlbGVjdG9yczpbWyJyZWdleC1lZGl0LWRpYWxvZyJdXSxkZWNsczozLHZhcnM6Nixjb25zdHM6W1szLCJyZWdleFN0cmluZyIsImNvbG9yUnVuUGFpckxpc3QiLCJvblNhdmUiLCJyZWdleElucHV0T25DaGFuZ2UiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsInJlZ2V4LWVkaXQtZGlhbG9nLWNvbXBvbmVudCIsMCksVm0oIm9uU2F2ZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25TYXZlKGUpfSkpKCJyZWdleElucHV0T25DaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uUmVnZXhJbnB1dE9uQ2hhbmdlKGUpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBbSgpKSwyJmUmJkRtKCJyZWdleFN0cmluZyIsVGgoMSwyLG4uZ3JvdXBCeVJlZ2V4U3RyaW5nJCkpKCJjb2xvclJ1blBhaXJMaXN0IixUaCgyLDQsbi5jb2xvclJ1blBhaXJMaXN0JCkpfSxkaXJlY3RpdmVzOltnMV0scGlwZXM6W3dNXSxzdHlsZXM6WyJbX25naG9zdC0lQ09NUCVdLCByZWdleC1lZGl0LWRpYWxvZy1jb21wb25lbnRbX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB9Il19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGgxLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InJlZ2V4LWVkaXQtZGlhbG9nIix0ZW1wbGF0ZTonPHJlZ2V4LWVkaXQtZGlhbG9nLWNvbXBvbmVudFxuICAgIFtyZWdleFN0cmluZ109Imdyb3VwQnlSZWdleFN0cmluZyQgfCBhc3luYyJcbiAgICBbY29sb3JSdW5QYWlyTGlzdF09ImNvbG9yUnVuUGFpckxpc3QkIHwgYXN5bmMiXG4gICAgKG9uU2F2ZSk9Im9uU2F2ZSgkZXZlbnQpIlxuICAgIChyZWdleElucHV0T25DaGFuZ2UpPSJvblJlZ2V4SW5wdXRPbkNoYW5nZSgkZXZlbnQpIlxuICA+PC9yZWdleC1lZGl0LWRpYWxvZy1jb21wb25lbnQ+JyxzdHlsZXM6WyJcbiAgICAgIDpob3N0LFxuICAgICAgcmVnZXgtZWRpdC1kaWFsb2ctY29tcG9uZW50IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB9XG4gICAgIl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd30se3R5cGU6WEd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltKR119XX1dfSksbnVsbCk7Y2xhc3MgUDF7Y29uc3RydWN0b3IodCl7dGhpcy5kaWFsb2c9dCx0aGlzLkdyb3VwQnlLZXk9dE4sdGhpcy5vbkdyb3VwQnlDaGFuZ2U9bmV3IExofW9uUmVnZXhTdHJpbmdFZGl0KCl7dGhpcy5kaWFsb2cub3BlbihoMSx7bWF4SGVpZ2h0OiI5NXZoIixtYXhXaWR0aDoiODB2dyIsZGF0YTp7ZXhwZXJpbWVudElkczp0aGlzLmV4cGVyaW1lbnRJZHN9fSl9b25Hcm91cEJ5UmVnZXhDbGljaygpe3RoaXMucmVnZXhTdHJpbmc/dGhpcy5vbkdyb3VwQnlDaGFuZ2UuZW1pdCh7a2V5OnROLlJFR0VYLHJlZ2V4U3RyaW5nOnRoaXMucmVnZXhTdHJpbmd9KTp0aGlzLm9uUmVnZXhTdHJpbmdFZGl0KCl9fVAxLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxQMSkoU20ob1cpKX0sUDEuybVjbXA9dG8oe3R5cGU6UDEsc2VsZWN0b3JzOltbInJ1bnMtZ3JvdXAtbWVudS1idXR0b24tY29tcG9uZW50Il1dLGlucHV0czp7c2hvd0V4cGVyaW1lbnRzR3JvdXBCeToic2hvd0V4cGVyaW1lbnRzR3JvdXBCeSIsZXhwZXJpbWVudElkczoiZXhwZXJpbWVudElkcyIscmVnZXhTdHJpbmc6InJlZ2V4U3RyaW5nIixzZWxlY3RlZEdyb3VwQnk6InNlbGVjdGVkR3JvdXBCeSIsc2hvd0dyb3VwQnlSZWdleDoic2hvd0dyb3VwQnlSZWdleCJ9LG91dHB1dHM6e29uR3JvdXBCeUNoYW5nZToib25Hcm91cEJ5Q2hhbmdlIn0sZGVjbHM6MTQsdmFyczo2LGNvbnN0czpbWyJtYXQtaWNvbi1idXR0b24iLCIiLCJ0aXRsZSIsIkNvbG9yIHJ1bnMgYnkuLi4iLDMsIm1hdE1lbnVUcmlnZ2VyRm9yIl0sWyJzdmdJY29uIiwicGFsZXR0ZV8yNHB4Il0sWzEsInJ1bi10YWJsZS1jb2xvci1ncm91cC1ieSJdLFsiZ3JvdXBCeU1lbnUiLCJtYXRNZW51Il0sWzEsImxhYmVsIl0sWyJtYXQtbWVudS1pdGVtIiwiIiwicm9sZSIsIm1lbnVpdGVtcmFkaW8iLCJkYXRhLXZhbHVlIiwiZXhwZXJpbWVudCIsMywiY2xpY2siLDQsIm5nSWYiXSxbIm1hdC1tZW51LWl0ZW0iLCIiLCJyb2xlIiwibWVudWl0ZW1yYWRpbyIsImRhdGEtdmFsdWUiLCJydW4iLDMsImNsaWNrIl0sWyJzdmdJY29uIiwiZG9uZV8yNHB4Iiw0LCJuZ0lmIl0sWyJtYXQtbWVudS1pdGVtIiwiIiwicm9sZSIsIm1lbnVpdGVtcmFkaW8iLCJkYXRhLXZhbHVlIiwicmVnZXgiLDMsImNsaWNrIiw0LCJuZ0lmIl0sWyJtYXQtbWVudS1pdGVtIiwiIiwicm9sZSIsIm1lbnVpdGVtIiwiZGF0YS12YWx1ZSIsInJlZ2V4LWVkaXQiLCJjbGFzcyIsImRpc3BsYXktcmVnZXgtc3RyaW5nIiwzLCJjbGljayIsNCwibmdJZiJdLFsibWF0LW1lbnUtaXRlbSIsIiIsInJvbGUiLCJtZW51aXRlbXJhZGlvIiwiZGF0YS12YWx1ZSIsImV4cGVyaW1lbnQiLDMsImNsaWNrIl0sWyJzdmdJY29uIiwiZG9uZV8yNHB4Il0sWyJtYXQtbWVudS1pdGVtIiwiIiwicm9sZSIsIm1lbnVpdGVtcmFkaW8iLCJkYXRhLXZhbHVlIiwicmVnZXgiLDMsImNsaWNrIl0sWyJtYXQtbWVudS1pdGVtIiwiIiwicm9sZSIsIm1lbnVpdGVtIiwiZGF0YS12YWx1ZSIsInJlZ2V4LWVkaXQiLDEsImRpc3BsYXktcmVnZXgtc3RyaW5nIiwzLCJjbGljayJdLFsic3ZnSWNvbiIsImVkaXRfMjRweCJdLFs0LCJuZ0lmIl0sWyJjbGFzcyIsIm5vbmUtc2V0LXN0cmluZyIsNCwibmdJZiJdLFsxLCJub25lLXNldC1zdHJpbmciXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImJ1dHRvbiIsMCksVG0oMSwibWF0LWljb24iLDEpLEFtKCksUm0oMiwibWF0LW1lbnUiLDIsMyksUm0oNCwiZGl2Iiw0KSxrdSg1LCJDb2xvciBydW5zIGJ5IiksQW0oKSxRcCg2LHkxLDUsMiwiYnV0dG9uIiw1KSxSbSg3LCJidXR0b24iLDYpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkdyb3VwQnlDaGFuZ2UuZW1pdCh7a2V5Om4uR3JvdXBCeUtleS5SVU59KX0pKSxSbSg4LCJzcGFuIiksUXAoOSxfMSwxLDAsIm1hdC1pY29uIiw3KSxBbSgpLFJtKDEwLCJsYWJlbCIpLGt1KDExLCJSdW4iKSxBbSgpLEFtKCksUXAoMTIsTTEsNSwyLCJidXR0b24iLDgpLFFwKDEzLE8xLDUsMiwiYnV0dG9uIiw5KSxBbSgpKSwyJmUmJihEbSgibWF0TWVudVRyaWdnZXJGb3IiLCRwKDMpKSxyYyg2KSxEbSgibmdJZiIsbi5zaG93RXhwZXJpbWVudHNHcm91cEJ5KSxyYygxKSxqcCgiYXJpYS1jaGVja2VkIixuLnNlbGVjdGVkR3JvdXBCeS5rZXk9PT1uLkdyb3VwQnlLZXkuUlVOKSxyYygyKSxEbSgibmdJZiIsbi5zZWxlY3RlZEdyb3VwQnkua2V5PT09bi5Hcm91cEJ5S2V5LlJVTikscmMoMyksRG0oIm5nSWYiLG4uc2hvd0dyb3VwQnlSZWdleCkscmMoMSksRG0oIm5nSWYiLG4uc2hvd0dyb3VwQnlSZWdleCkpfSxkaXJlY3RpdmVzOltYSCxlWSxEVyxLVyxkTSxXV10sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9ICAucnVuLXRhYmxlLWNvbG9yLWdyb3VwLWJ5e2ZvbnQtc2l6ZToxNnB4fSAgLnJ1bi10YWJsZS1jb2xvci1ncm91cC1ieSAubGFiZWx7Y29sb3I6IzYxNjE2MTtmb250LXNpemU6LjllbTttYXJnaW46MTBweCAwO3BhZGRpbmc6MCAxNnB4O3BvaW50ZXItZXZlbnRzOm5vbmV9ICAucnVuLXRhYmxlLWNvbG9yLWdyb3VwLWJ5IGJ1dHRvbntkaXNwbGF5OmdyaWQ7Z2FwOjJweCAxMHB4O2dyaWQtdGVtcGxhdGUtY29sdW1uczoyMHB4IGF1dG99ICAucnVuLXRhYmxlLWNvbG9yLWdyb3VwLWJ5IG1hdC1pY29ue2hlaWdodDoyMHB4O3dpZHRoOjIwcHh9ICAucnVuLXRhYmxlLWNvbG9yLWdyb3VwLWJ5IC5kaXNwbGF5LXJlZ2V4LXN0cmluZ3twYWRkaW5nLWxlZnQ6NDBweH0gIC5ydW4tdGFibGUtY29sb3ItZ3JvdXAtYnkgLmRpc3BsYXktcmVnZXgtc3RyaW5nIC5ub25lLXNldC1zdHJpbmd7Y29sb3I6IzYxNjE2MX1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAgIC5ydW4tdGFibGUtY29sb3ItZ3JvdXAtYnkgLmRpc3BsYXktcmVnZXgtc3RyaW5nIC5ub25lLXNldC1zdHJpbmcsIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgICAgLnJ1bi10YWJsZS1jb2xvci1ncm91cC1ieSAuZGlzcGxheS1yZWdleC1zdHJpbmcgLm5vbmUtc2V0LXN0cmluZ3tjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUDEsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoicnVucy1ncm91cC1tZW51LWJ1dHRvbi1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiJydW5zX2dyb3VwX21lbnVfYnV0dG9uX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyJydW5zX2dyb3VwX21lbnVfYnV0dG9uX2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6b1d9XX0pLHtzaG93RXhwZXJpbWVudHNHcm91cEJ5Olt7dHlwZTp4eX1dLGV4cGVyaW1lbnRJZHM6W3t0eXBlOnh5fV0scmVnZXhTdHJpbmc6W3t0eXBlOnh5fV0sc2VsZWN0ZWRHcm91cEJ5Olt7dHlwZTp4eX1dLHNob3dHcm91cEJ5UmVnZXg6W3t0eXBlOnh5fV0sb25Hcm91cEJ5Q2hhbmdlOlt7dHlwZTpPeX1dfSk7Y2xhc3MgdzF7Y29uc3RydWN0b3IodCl7dGhpcy5zdG9yZT10LHRoaXMuc2hvd0dyb3VwQnlSZWdleCQ9dGhpcy5zdG9yZS5zZWxlY3QobkUpLHRoaXMuc2hvd0V4cGVyaW1lbnRzR3JvdXBCeSQ9dGhpcy5zdG9yZS5zZWxlY3QoRVMpLnBpcGUoSXQoKHQ9PnQuaGFzKFprLkNPTVBBUkVfRVhQRVJJTUVOVCkpKSksdGhpcy5zZWxlY3RlZEdyb3VwQnkkPXRoaXMuc3RvcmUuc2VsZWN0KGZOKSx0aGlzLmdyb3VwQnlSZWdleFN0cmluZyQ9dGhpcy5zdG9yZS5zZWxlY3QoTU4pfW9uR3JvdXBCeUNoYW5nZSh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKEdSKHtleHBlcmltZW50SWRzOnRoaXMuZXhwZXJpbWVudElkcyxncm91cEJ5OnR9KSl9fXcxLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx3MSkoU20oSXcpKX0sdzEuybVjbXA9dG8oe3R5cGU6dzEsc2VsZWN0b3JzOltbInJ1bnMtZ3JvdXAtbWVudS1idXR0b24iXV0saW5wdXRzOntleHBlcmltZW50SWRzOiJleHBlcmltZW50SWRzIn0sZGVjbHM6NSx2YXJzOjEzLGNvbnN0czpbWzMsInJlZ2V4U3RyaW5nIiwic2VsZWN0ZWRHcm91cEJ5Iiwic2hvd0dyb3VwQnlSZWdleCIsInNob3dFeHBlcmltZW50c0dyb3VwQnkiLCJleHBlcmltZW50SWRzIiwib25Hcm91cEJ5Q2hhbmdlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJydW5zLWdyb3VwLW1lbnUtYnV0dG9uLWNvbXBvbmVudCIsMCksVm0oIm9uR3JvdXBCeUNoYW5nZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25Hcm91cEJ5Q2hhbmdlKGUpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBaCgzLCJhc3luYyIpLEFoKDQsImFzeW5jIiksQW0oKSksMiZlJiZEbSgicmVnZXhTdHJpbmciLFRoKDEsNSxuLmdyb3VwQnlSZWdleFN0cmluZyQpKSgic2VsZWN0ZWRHcm91cEJ5IixUaCgyLDcsbi5zZWxlY3RlZEdyb3VwQnkkKSkoInNob3dHcm91cEJ5UmVnZXgiLFRoKDMsOSxuLnNob3dHcm91cEJ5UmVnZXgkKSkoInNob3dFeHBlcmltZW50c0dyb3VwQnkiLFRoKDQsMTEsbi5zaG93RXhwZXJpbWVudHNHcm91cEJ5JCkpKCJleHBlcmltZW50SWRzIixuLmV4cGVyaW1lbnRJZHMpfSxkaXJlY3RpdmVzOltQMV0scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHcxLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InJ1bnMtZ3JvdXAtbWVudS1idXR0b24iLHRlbXBsYXRlOidcbiAgICA8cnVucy1ncm91cC1tZW51LWJ1dHRvbi1jb21wb25lbnRcbiAgICAgIFtyZWdleFN0cmluZ109Imdyb3VwQnlSZWdleFN0cmluZyQgfCBhc3luYyJcbiAgICAgIFtzZWxlY3RlZEdyb3VwQnldPSJzZWxlY3RlZEdyb3VwQnkkIHwgYXN5bmMiXG4gICAgICBbc2hvd0dyb3VwQnlSZWdleF09InNob3dHcm91cEJ5UmVnZXgkIHwgYXN5bmMiXG4gICAgICBbc2hvd0V4cGVyaW1lbnRzR3JvdXBCeV09InNob3dFeHBlcmltZW50c0dyb3VwQnkkIHwgYXN5bmMiXG4gICAgICBbZXhwZXJpbWVudElkc109ImV4cGVyaW1lbnRJZHMiXG4gICAgICAob25Hcm91cEJ5Q2hhbmdlKT0ib25Hcm91cEJ5Q2hhbmdlKCRldmVudCkiXG4gICAgPjwvcnVucy1ncm91cC1tZW51LWJ1dHRvbi1jb21wb25lbnQ+XG4gICcsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSx7ZXhwZXJpbWVudElkczpbe3R5cGU6eHl9XX0pO2NvbnN0IGsxPVsiY29udGFpbmVyIl07dmFyIFMxOyEoZnVuY3Rpb24odCl7dFt0Lk5PTkU9MF09Ik5PTkUiLHRbdC5MRUZUPTFdPSJMRUZUIix0W3QuUklHSFQ9Ml09IlJJR0hUIn0pKFMxfHwoUzE9e30pKTtjbGFzcyBEMXtjb25zdHJ1Y3Rvcih0KXt0aGlzLmNoYW5nZURldGVjdG9yPXQsdGhpcy50aWNrQ291bnQ9MjAsdGhpcy52YWx1ZT1uZXcgTGgsdGhpcy5Qb3NpdGlvbj1TMSx0aGlzLmFjdGl2ZVRodW1iPVMxLk5PTkUsdGhpcy5vZmZzZXRYRnJvbU9yaWdpbk9mQWN0aXZlVGh1bWI9MCx0aGlzLm5nVW5zdWJzY3JpYmU9bmV3IEl9Z2V0VGh1bWJQb3NpdGlvbih0KXtjb25zdCBlPXRoaXMuZ2V0Q2xpcHBlZFZhbHVlKHQpLG49dGhpcy5tYXgtdGhpcy5taW47cmV0dXJuIG48PTA/IjUwJSI6KGUtdGhpcy5taW4pL24qMTAwKyIlIn1nZXRUcmFja1dpZHRoKCl7Y29uc3QgdD10aGlzLm1heC10aGlzLm1pbjtyZXR1cm4gdDw9MD8iMCUiOih0aGlzLmdldENsaXBwZWRWYWx1ZSh0aGlzLnVwcGVyVmFsdWUpLXRoaXMuZ2V0Q2xpcHBlZFZhbHVlKHRoaXMubG93ZXJWYWx1ZSkpL3QqMTAwKyIlIn1nZXRDbGlwcGVkVmFsdWUodCl7cmV0dXJuIE1hdGgubWluKE1hdGgubWF4KHQsdGhpcy5taW4pLHRoaXMubWF4KX1uZ09uRGVzdHJveSgpe3RoaXMubmdVbnN1YnNjcmliZS5uZXh0KCksdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCl9bmdPbkluaXQoKXtvZShkb2N1bWVudCwibW91c2Vtb3ZlIix7cGFzc2l2ZTohMH0pLnBpcGUoSWUodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKCh0PT57dGhpcy5oYW5kbGVNb3VzZU1vdmUodCl9KSksb2UoZG9jdW1lbnQsIm1vdXNldXAiLHtwYXNzaXZlOiEwfSkucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpKS5zdWJzY3JpYmUoKHQ9Pnt0aGlzLmhhbmRsZU1vdXNlT3V0KHQpfSkpfWhhbmRsZU1vdXNlRG93bih0LGUpe3RoaXMuYWN0aXZlVGh1bWI9ZSx0aGlzLm9mZnNldFhGcm9tT3JpZ2luT2ZBY3RpdmVUaHVtYj02LXQub2Zmc2V0WH1jYWxjdWxhdGVWYWx1ZUZyb21Nb3VzZUV2ZW50KHQpe2NvbnN0e2xlZnQ6ZSxyaWdodDpufT10aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG89dC5jbGllbnRYLWUrdGhpcy5vZmZzZXRYRnJvbU9yaWdpbk9mQWN0aXZlVGh1bWI7bGV0IGk7aWYobnVsbCE9PXRoaXMudGlja0NvdW50JiZ0aGlzLnRpY2tDb3VudD4wKXtjb25zdCB0PShuLWUpL3RoaXMudGlja0NvdW50O2k9TWF0aC5yb3VuZChvL3QpKnQvKG4tZSl9ZWxzZSBpPW8vKG4tZSk7Y29uc3QgYT10aGlzLmdldENsaXBwZWRWYWx1ZSh0aGlzLm1pbisodGhpcy5tYXgtdGhpcy5taW4pKmkpO3JldHVybiBOdW1iZXIoYS50b0ZpeGVkKDEwKSl9aGFuZGxlTW91c2VNb3ZlKHQpe2lmKHRoaXMuYWN0aXZlVGh1bWI9PT1TMS5OT05FKXJldHVybjtjb25zdCBlPXRoaXMuY2FsY3VsYXRlVmFsdWVGcm9tTW91c2VFdmVudCh0KTtsZXQgbj1bdGhpcy5sb3dlclZhbHVlLHRoaXMudXBwZXJWYWx1ZV07dGhpcy5hY3RpdmVUaHVtYj09PVMxLkxFRlQ/KGU+dGhpcy51cHBlclZhbHVlJiYodGhpcy5hY3RpdmVUaHVtYj1TMS5SSUdIVCksbj1bZSx0aGlzLnVwcGVyVmFsdWVdKTooZTx0aGlzLmxvd2VyVmFsdWUmJih0aGlzLmFjdGl2ZVRodW1iPVMxLkxFRlQpLG49W3RoaXMubG93ZXJWYWx1ZSxlXSksdGhpcy5tYXliZU5vdGlmeU5leHRWYWx1ZShuKSx0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpfW1heWJlTm90aWZ5TmV4dFZhbHVlKHQpe2NvbnN0W2Usbl09dC5zb3J0KCgodCxlKT0+dC1lKSk7dGhpcy5sb3dlclZhbHVlPT09ZSYmdGhpcy51cHBlclZhbHVlPT09bnx8dGhpcy52YWx1ZS5lbWl0KHtsb3dlclZhbHVlOmUsdXBwZXJWYWx1ZTpufSl9aGFuZGxlTW91c2VPdXQodCl7dGhpcy5hY3RpdmVUaHVtYiE9PVMxLk5PTkUmJih0aGlzLmFjdGl2ZVRodW1iPVMxLk5PTkUsdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKSl9aGFuZGxlSW5wdXRDaGFuZ2UodCxlKXtjb25zdCBuPXRoaXMuZ2V0Q2xpcHBlZFZhbHVlKE51bWJlcih0LnRhcmdldC52YWx1ZSkpO2lmKGlzTmFOKG4pKXJldHVybjtsZXQgbz1bdGhpcy5sb3dlclZhbHVlLHRoaXMudXBwZXJWYWx1ZV07bz1lPT09UzEuTEVGVD9bbix0aGlzLnVwcGVyVmFsdWVdOlt0aGlzLmxvd2VyVmFsdWUsbl0sdGhpcy5tYXliZU5vdGlmeU5leHRWYWx1ZShvKX1pc1RodW1iQWN0aXZlKHQpe3JldHVybiB0aGlzLmFjdGl2ZVRodW1iPT09dH19RDEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEQxKShTbShVZykpfSxEMS7JtWNtcD10byh7dHlwZTpEMSxzZWxlY3RvcnM6W1sidGItcmFuZ2UtaW5wdXQiXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJlFoKGsxLDcsaGcpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uY29udGFpbmVyPXQuZmlyc3QpfX0saW5wdXRzOnttaW46Im1pbiIsbWF4OiJtYXgiLGxvd2VyVmFsdWU6Imxvd2VyVmFsdWUiLHVwcGVyVmFsdWU6InVwcGVyVmFsdWUiLHRpY2tDb3VudDoidGlja0NvdW50In0sb3V0cHV0czp7dmFsdWU6InZhbHVlIn0sZGVjbHM6OCx2YXJzOjE0LGNvbnN0czpbWyJ0eXBlIiwibnVtYmVyIiwxLCJsb3dlci1pbnB1dCIsMywidmFsdWUiLCJjaGFuZ2UiXSxbInR5cGUiLCJudW1iZXIiLDEsInVwcGVyLWlucHV0IiwzLCJ2YWx1ZSIsImNoYW5nZSJdLFsxLCJjb250YWluZXIiXSxbImNvbnRhaW5lciIsIiJdLFsxLCJzbGlkZXItdHJhY2siXSxbMSwic2xpZGVyLXRyYWNrLWZpbGwiXSxbMSwidGh1bWIiLDMsIm1vdXNlZG93biJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiaW5wdXQiLDApLFZtKCJjaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLmhhbmRsZUlucHV0Q2hhbmdlKGUsbi5Qb3NpdGlvbi5MRUZUKX0pKSxBbSgpLFJtKDEsImlucHV0IiwxKSxWbSgiY2hhbmdlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5oYW5kbGVJbnB1dENoYW5nZShlLG4uUG9zaXRpb24uUklHSFQpfSkpLEFtKCksUm0oMiwic3BhbiIsMiwzKSxUbSg0LCJzcGFuIiw0KSxUbSg1LCJzcGFuIiw1KSxSbSg2LCJzcGFuIiw2KSxWbSgibW91c2Vkb3duIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5oYW5kbGVNb3VzZURvd24oZSxuLlBvc2l0aW9uLkxFRlQpfSkpLEFtKCksUm0oNywic3BhbiIsNiksVm0oIm1vdXNlZG93biIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uaGFuZGxlTW91c2VEb3duKGUsbi5Qb3NpdGlvbi5SSUdIVCl9KSksQW0oKSxBbSgpKSwyJmUmJihEbSgidmFsdWUiLG4ubG93ZXJWYWx1ZSkscmMoMSksRG0oInZhbHVlIixuLnVwcGVyVmFsdWUpLHJjKDQpLGR1KCJsZWZ0IixuLmdldFRodW1iUG9zaXRpb24obi5sb3dlclZhbHVlKSkoIndpZHRoIixuLmdldFRyYWNrV2lkdGgoKSkscmMoMSksZHUoImxlZnQiLG4uZ2V0VGh1bWJQb3NpdGlvbihuLmxvd2VyVmFsdWUpKSxwdSgiYWN0aXZlIixuLmlzVGh1bWJBY3RpdmUobi5Qb3NpdGlvbi5MRUZUKSkscmMoMSksZHUoImxlZnQiLG4uZ2V0VGh1bWJQb3NpdGlvbihuLnVwcGVyVmFsdWUpKSxwdSgiYWN0aXZlIixuLmlzVGh1bWJBY3RpdmUobi5Qb3NpdGlvbi5SSUdIVCkpKX0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9W19uZ2hvc3QtJUNPTVAlXXtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTppbmxpbmUtZ3JpZDtncmlkLWdhcDoxMHB4O2dyaWQtdGVtcGxhdGUtYXJlYXM6Imxvd2VyLWlucHV0IHVwcGVyLWlucHV0IiAic2xpZGVyIHNsaWRlciI7Zm9udC1zaXplOjA7bWluLXdpZHRoOjEwMHB4O3BhZGRpbmc6NnB4fWlucHV0W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOmluaGVyaXQ7Ym9yZGVyLXN0eWxlOnNvbGlkO2JveC1zaXppbmc6Ym9yZGVyLWJveDtjb2xvcjppbmhlcml0O292ZXJmbG93OmhpZGRlbjt3aWR0aDoxMDAlfS5sb3dlci1pbnB1dFtfbmdjb250ZW50LSVDT01QJV17Z3JpZC1hcmVhOmxvd2VyLWlucHV0fS51cHBlci1pbnB1dFtfbmdjb250ZW50LSVDT01QJV17Z3JpZC1hcmVhOnVwcGVyLWlucHV0O2p1c3RpZnktc2VsZjpmbGV4LWVuZH0uY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtncmlkLWFyZWE6c2xpZGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTppbmxpbmUtZmxleDtoZWlnaHQ6MTJweDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjEwMCV9LnNsaWRlci10cmFja1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4yNik7aGVpZ2h0OjJweDt3aWR0aDoxMDAlfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5zbGlkZXItdHJhY2tbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuc2xpZGVyLXRyYWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjMpfS5zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7aGVpZ2h0OjJweH0udGh1bWJbX25nY29udGVudC0lQ09NUCVde2JveC1zYWRob3c6MCAwIDAgMXB4IHJnYmEoMCwwLDAsLjI2KTtib3JkZXItcmFkaXVzOjEwMCU7ZGlzcGxheTppbmxpbmUtYmxvY2s7aGVpZ2h0OjEycHg7bWFyZ2luLWxlZnQ6LTZweDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuM3MgZWFzZTt3aWR0aDoxMnB4O3dpbGwtY2hhbmdlOnRyYW5zZm9ybX1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAudGh1bWJbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAudGh1bWJbX25nY29udGVudC0lQ09NUCVde2JveC1zYWRob3c6MCAwIDAgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjMpfS50aHVtYi5hY3RpdmVbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTpzY2FsZSgxLjIpfS5zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC50aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZWY2YzAwfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC50aHVtYltfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC50aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZWY2YzAwfSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChEMSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJ0Yi1yYW5nZS1pbnB1dCIsdGVtcGxhdGVVcmw6Ii4vcmFuZ2VfaW5wdXRfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vcmFuZ2VfaW5wdXRfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpVZ31dfSkse2NvbnRhaW5lcjpbe3R5cGU6WmEsYXJnczpbImNvbnRhaW5lciIse3N0YXRpYzohMCxyZWFkOmhnfV19XSxtaW46W3t0eXBlOnh5fV0sbWF4Olt7dHlwZTp4eX1dLGxvd2VyVmFsdWU6W3t0eXBlOnh5fV0sdXBwZXJWYWx1ZTpbe3R5cGU6eHl9XSx0aWNrQ291bnQ6W3t0eXBlOnh5fV0sdmFsdWU6W3t0eXBlOk95fV19KTtjb25zdCBFMT1bImRpYWxvZ1BvcHVwIl0sUjE9WyJodWVTbGlkZXIiXSxBMT1bImFscGhhU2xpZGVyIl07ZnVuY3Rpb24gVDEodCxlKXtpZigxJnQmJlRtKDAsImRpdiIpLDImdCl7Y29uc3QgdD1ZbSgpO0F1KCJhcnJvdyBhcnJvdy0iLHQuY3BVc2VQb3NpdGlvbiwiIiksZHUoInRvcCIsdC5hcnJvd1RvcCwicHgiKX19ZnVuY3Rpb24gTjEodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDI2KSxWbSgibmV3VmFsdWUiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uQ29sb3JDaGFuZ2Uobil9KSkoImRyYWdTdGFydCIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5vbkRyYWdTdGFydCgic2F0dXJhdGlvbi1saWdodG5lc3MiKX0pKSgiZHJhZ0VuZCIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5vbkRyYWdFbmQoInNhdHVyYXRpb24tbGlnaHRuZXNzIil9KSksVG0oMSwiZGl2IiwxMyksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKTtkdSgiYmFja2dyb3VuZC1jb2xvciIsdC5odWVTbGlkZXJDb2xvciksRG0oInJnWCIsMSkoInJnWSIsMSkscmMoMSksZHUoInRvcCIsbnVsbD09dC5zbGlkZXI/bnVsbDp0LnNsaWRlci52LCJweCIpKCJsZWZ0IixudWxsPT10LnNsaWRlcj9udWxsOnQuc2xpZGVyLnMsInB4Iil9fWZ1bmN0aW9uIHoxKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiYnV0dG9uIiwyNyksVm0oImNsaWNrIiwoZnVuY3Rpb24gZShuKXtoaSh0KTtjb25zdCBvPVltKCk7cmV0dXJuIG8ub25BZGRQcmVzZXRDb2xvcihuLG8uc2VsZWN0ZWRDb2xvcil9KSksa3UoMSksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKTtmdSh0LmNwQWRkQ29sb3JCdXR0b25DbGFzcyksRG0oImRpc2FibGVkIix0LmNwUHJlc2V0Q29sb3JzJiZ0LmNwUHJlc2V0Q29sb3JzLmxlbmd0aD49dC5jcE1heFByZXNldENvbG9yc0xlbmd0aCkscmMoMSksRHUoIiAiLHQuY3BBZGRDb2xvckJ1dHRvblRleHQsIiAiKX19ZnVuY3Rpb24gSTEodCxlKXsxJnQmJlRtKDAsImRpdiIsMjgpfWZ1bmN0aW9uIEgxKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiaW5wdXQiLDM0KSxWbSgia2V5dXAuZW50ZXIiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgyKS5vbkFjY2VwdENvbG9yKG4pfSkpKCJuZXdWYWx1ZSIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKDIpLm9uQWxwaGFJbnB1dChuKX0pKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgyKTtEbSgicmciLDEpKCJ2YWx1ZSIsbnVsbD09dC5jbXlrVGV4dD9udWxsOnQuY215a1RleHQuYSl9fWZ1bmN0aW9uIEYxKHQsZSl7MSZ0JiYoUm0oMCwiZGl2Iiksa3UoMSwiQSIpLEFtKCkpfWZ1bmN0aW9uIEwxKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2IiwyOSksUm0oMSwiZGl2IiwzMCksUm0oMiwiaW5wdXQiLDMxKSxWbSgia2V5dXAuZW50ZXIiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uQWNjZXB0Q29sb3Iobil9KSkoIm5ld1ZhbHVlIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oKS5vbkN5YW5JbnB1dChuKX0pKSxBbSgpLFJtKDMsImlucHV0IiwzMSksVm0oImtleXVwLmVudGVyIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oKS5vbkFjY2VwdENvbG9yKG4pfSkpKCJuZXdWYWx1ZSIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkub25NYWdlbnRhSW5wdXQobil9KSksQW0oKSxSbSg0LCJpbnB1dCIsMzEpLFZtKCJrZXl1cC5lbnRlciIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkub25BY2NlcHRDb2xvcihuKX0pKSgibmV3VmFsdWUiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uWWVsbG93SW5wdXQobil9KSksQW0oKSxSbSg1LCJpbnB1dCIsMzEpLFZtKCJrZXl1cC5lbnRlciIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkub25BY2NlcHRDb2xvcihuKX0pKSgibmV3VmFsdWUiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uQmxhY2tJbnB1dChuKX0pKSxBbSgpLFFwKDYsSDEsMSwyLCJpbnB1dCIsMzIpLEFtKCksUm0oNywiZGl2IiwzMCksUm0oOCwiZGl2Iiksa3UoOSwiQyIpLEFtKCksUm0oMTAsImRpdiIpLGt1KDExLCJNIiksQW0oKSxSbSgxMiwiZGl2Iiksa3UoMTMsIlkiKSxBbSgpLFJtKDE0LCJkaXYiKSxrdSgxNSwiSyIpLEFtKCksUXAoMTYsRjEsMiwwLCJkaXYiLDMzKSxBbSgpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKCk7ZHUoImRpc3BsYXkiLDMhPT10LmZvcm1hdD8ibm9uZSI6ImJsb2NrIikscmMoMiksRG0oInJnIiwxMDApKCJ2YWx1ZSIsbnVsbD09dC5jbXlrVGV4dD9udWxsOnQuY215a1RleHQuYykscmMoMSksRG0oInJnIiwxMDApKCJ2YWx1ZSIsbnVsbD09dC5jbXlrVGV4dD9udWxsOnQuY215a1RleHQubSkscmMoMSksRG0oInJnIiwxMDApKCJ2YWx1ZSIsbnVsbD09dC5jbXlrVGV4dD9udWxsOnQuY215a1RleHQueSkscmMoMSksRG0oInJnIiwxMDApKCJ2YWx1ZSIsbnVsbD09dC5jbXlrVGV4dD9udWxsOnQuY215a1RleHQuaykscmMoMSksRG0oIm5nSWYiLCJkaXNhYmxlZCIhPT10LmNwQWxwaGFDaGFubmVsKSxyYygxMCksRG0oIm5nSWYiLCJkaXNhYmxlZCIhPT10LmNwQWxwaGFDaGFubmVsKX19ZnVuY3Rpb24gQjEodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJpbnB1dCIsMzQpLFZtKCJrZXl1cC5lbnRlciIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKDIpLm9uQWNjZXB0Q29sb3Iobil9KSkoIm5ld1ZhbHVlIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oMikub25BbHBoYUlucHV0KG4pfSkpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKDIpO0RtKCJyZyIsMSkoInZhbHVlIixudWxsPT10LmhzbGFUZXh0P251bGw6dC5oc2xhVGV4dC5hKX19ZnVuY3Rpb24gVjEodCxlKXsxJnQmJihSbSgwLCJkaXYiKSxrdSgxLCJBIiksQW0oKSl9ZnVuY3Rpb24gajEodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDM1KSxSbSgxLCJkaXYiLDMwKSxSbSgyLCJpbnB1dCIsMzYpLFZtKCJrZXl1cC5lbnRlciIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkub25BY2NlcHRDb2xvcihuKX0pKSgibmV3VmFsdWUiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uSHVlSW5wdXQobil9KSksQW0oKSxSbSgzLCJpbnB1dCIsMzEpLFZtKCJrZXl1cC5lbnRlciIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkub25BY2NlcHRDb2xvcihuKX0pKSgibmV3VmFsdWUiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uU2F0dXJhdGlvbklucHV0KG4pfSkpLEFtKCksUm0oNCwiaW5wdXQiLDMxKSxWbSgia2V5dXAuZW50ZXIiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uQWNjZXB0Q29sb3Iobil9KSkoIm5ld1ZhbHVlIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oKS5vbkxpZ2h0bmVzc0lucHV0KG4pfSkpLEFtKCksUXAoNSxCMSwxLDIsImlucHV0IiwzMiksQW0oKSxSbSg2LCJkaXYiLDMwKSxSbSg3LCJkaXYiKSxrdSg4LCJIIiksQW0oKSxSbSg5LCJkaXYiKSxrdSgxMCwiUyIpLEFtKCksUm0oMTEsImRpdiIpLGt1KDEyLCJMIiksQW0oKSxRcCgxMyxWMSwyLDAsImRpdiIsMzMpLEFtKCksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKTtkdSgiZGlzcGxheSIsMiE9PXQuZm9ybWF0PyJub25lIjoiYmxvY2siKSxyYygyKSxEbSgicmciLDM2MCkoInZhbHVlIixudWxsPT10LmhzbGFUZXh0P251bGw6dC5oc2xhVGV4dC5oKSxyYygxKSxEbSgicmciLDEwMCkoInZhbHVlIixudWxsPT10LmhzbGFUZXh0P251bGw6dC5oc2xhVGV4dC5zKSxyYygxKSxEbSgicmciLDEwMCkoInZhbHVlIixudWxsPT10LmhzbGFUZXh0P251bGw6dC5oc2xhVGV4dC5sKSxyYygxKSxEbSgibmdJZiIsImRpc2FibGVkIiE9PXQuY3BBbHBoYUNoYW5uZWwpLHJjKDgpLERtKCJuZ0lmIiwiZGlzYWJsZWQiIT09dC5jcEFscGhhQ2hhbm5lbCl9fWZ1bmN0aW9uIFUxKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiaW5wdXQiLDM0KSxWbSgia2V5dXAuZW50ZXIiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgyKS5vbkFjY2VwdENvbG9yKG4pfSkpKCJuZXdWYWx1ZSIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKDIpLm9uQWxwaGFJbnB1dChuKX0pKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgyKTtEbSgicmciLDEpKCJ2YWx1ZSIsbnVsbD09dC5yZ2JhVGV4dD9udWxsOnQucmdiYVRleHQuYSl9fWZ1bmN0aW9uIEcxKHQsZSl7MSZ0JiYoUm0oMCwiZGl2Iiksa3UoMSwiQSIpLEFtKCkpfWZ1bmN0aW9uIFcxKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2IiwzNyksUm0oMSwiZGl2IiwzMCksUm0oMiwiaW5wdXQiLDM4KSxWbSgia2V5dXAuZW50ZXIiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uQWNjZXB0Q29sb3Iobil9KSkoIm5ld1ZhbHVlIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oKS5vblJlZElucHV0KG4pfSkpLEFtKCksUm0oMywiaW5wdXQiLDM4KSxWbSgia2V5dXAuZW50ZXIiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uQWNjZXB0Q29sb3Iobil9KSkoIm5ld1ZhbHVlIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oKS5vbkdyZWVuSW5wdXQobil9KSksQW0oKSxSbSg0LCJpbnB1dCIsMzgpLFZtKCJrZXl1cC5lbnRlciIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkub25BY2NlcHRDb2xvcihuKX0pKSgibmV3VmFsdWUiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uQmx1ZUlucHV0KG4pfSkpLEFtKCksUXAoNSxVMSwxLDIsImlucHV0IiwzMiksQW0oKSxSbSg2LCJkaXYiLDMwKSxSbSg3LCJkaXYiKSxrdSg4LCJSIiksQW0oKSxSbSg5LCJkaXYiKSxrdSgxMCwiRyIpLEFtKCksUm0oMTEsImRpdiIpLGt1KDEyLCJCIiksQW0oKSxRcCgxMyxHMSwyLDAsImRpdiIsMzMpLEFtKCksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKTtkdSgiZGlzcGxheSIsMSE9PXQuZm9ybWF0PyJub25lIjoiYmxvY2siKSxyYygyKSxEbSgicmciLDI1NSkoInZhbHVlIixudWxsPT10LnJnYmFUZXh0P251bGw6dC5yZ2JhVGV4dC5yKSxyYygxKSxEbSgicmciLDI1NSkoInZhbHVlIixudWxsPT10LnJnYmFUZXh0P251bGw6dC5yZ2JhVGV4dC5nKSxyYygxKSxEbSgicmciLDI1NSkoInZhbHVlIixudWxsPT10LnJnYmFUZXh0P251bGw6dC5yZ2JhVGV4dC5iKSxyYygxKSxEbSgibmdJZiIsImRpc2FibGVkIiE9PXQuY3BBbHBoYUNoYW5uZWwpLHJjKDgpLERtKCJuZ0lmIiwiZGlzYWJsZWQiIT09dC5jcEFscGhhQ2hhbm5lbCl9fWZ1bmN0aW9uIFkxKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiaW5wdXQiLDM0KSxWbSgia2V5dXAuZW50ZXIiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgyKS5vbkFjY2VwdENvbG9yKG4pfSkpKCJuZXdWYWx1ZSIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKDIpLm9uQWxwaGFJbnB1dChuKX0pKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgyKTtEbSgicmciLDEpKCJ2YWx1ZSIsdC5oZXhBbHBoYSl9fWZ1bmN0aW9uIHExKHQsZSl7MSZ0JiYoUm0oMCwiZGl2Iiksa3UoMSwiQSIpLEFtKCkpfWZ1bmN0aW9uIFoxKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2IiwzOSksUm0oMSwiZGl2IiwzMCksUm0oMiwiaW5wdXQiLDQwKSxWbSgiYmx1ciIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5vbkhleElucHV0KG51bGwpfSkpKCJrZXl1cC5lbnRlciIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkub25BY2NlcHRDb2xvcihuKX0pKSgibmV3VmFsdWUiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uSGV4SW5wdXQobil9KSksQW0oKSxRcCgzLFkxLDEsMiwiaW5wdXQiLDMyKSxBbSgpLFJtKDQsImRpdiIsMzApLFJtKDUsImRpdiIpLGt1KDYsIkhleCIpLEFtKCksUXAoNyxxMSwyLDAsImRpdiIsMzMpLEFtKCksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKTtkdSgiZGlzcGxheSIsMCE9PXQuZm9ybWF0PyJub25lIjoiYmxvY2siKSxwdSgiaGV4LWFscGhhIiwiZm9yY2VkIj09PXQuY3BBbHBoYUNoYW5uZWwpLHJjKDIpLERtKCJ2YWx1ZSIsdC5oZXhUZXh0KSxyYygxKSxEbSgibmdJZiIsImZvcmNlZCI9PT10LmNwQWxwaGFDaGFubmVsKSxyYyg0KSxEbSgibmdJZiIsImZvcmNlZCI9PT10LmNwQWxwaGFDaGFubmVsKX19ZnVuY3Rpb24gWDEodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJpbnB1dCIsMzQpLFZtKCJrZXl1cC5lbnRlciIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKDIpLm9uQWNjZXB0Q29sb3Iobil9KSkoIm5ld1ZhbHVlIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oMikub25BbHBoYUlucHV0KG4pfSkpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKDIpO0RtKCJyZyIsMSkoInZhbHVlIixudWxsPT10LmhzbGFUZXh0P251bGw6dC5oc2xhVGV4dC5hKX19ZnVuY3Rpb24gSzEodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDQxKSxSbSgxLCJkaXYiLDMwKSxSbSgyLCJpbnB1dCIsMzEpLFZtKCJrZXl1cC5lbnRlciIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkub25BY2NlcHRDb2xvcihuKX0pKSgibmV3VmFsdWUiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uVmFsdWVJbnB1dChuKX0pKSxBbSgpLFFwKDMsWDEsMSwyLCJpbnB1dCIsMzIpLEFtKCksUm0oNCwiZGl2IiwzMCksUm0oNSwiZGl2Iiksa3UoNiwiViIpLEFtKCksUm0oNywiZGl2Iiksa3UoOCwiQSIpLEFtKCksQW0oKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgpO3JjKDIpLERtKCJyZyIsMTAwKSgidmFsdWUiLG51bGw9PXQuaHNsYVRleHQ/bnVsbDp0LmhzbGFUZXh0LmwpLHJjKDEpLERtKCJuZ0lmIiwiZGlzYWJsZWQiIT09dC5jcEFscGhhQ2hhbm5lbCl9fWZ1bmN0aW9uIEoxKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2Iiw0MiksUm0oMSwic3BhbiIsNDMpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5vbkZvcm1hdFRvZ2dsZSgtMSl9KSksQW0oKSxSbSgyLCJzcGFuIiw0MyksVm0oImNsaWNrIiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgpLm9uRm9ybWF0VG9nZ2xlKDEpfSkpLEFtKCksQW0oKX19ZnVuY3Rpb24gUTEodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJzcGFuIiw1MCksVm0oImNsaWNrIiwoZnVuY3Rpb24gZShuKXtoaSh0KTtjb25zdCBvPVltKCkuJGltcGxpY2l0O3JldHVybiBZbSgzKS5vblJlbW92ZVByZXNldENvbG9yKG4sbyl9KSksQW0oKX0yJnQmJmZ1KFltKDQpLmNwUmVtb3ZlQ29sb3JCdXR0b25DbGFzcyl9ZnVuY3Rpb24gJDEodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDQ4KSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7Y29uc3Qgbj1oaSh0KS4kaW1wbGljaXQ7cmV0dXJuIFltKDMpLnNldENvbG9yRnJvbVN0cmluZyhuKX0pKSxRcCgxLFExLDEsMywic3BhbiIsNDkpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oMyk7ZHUoImJhY2tncm91bmQtY29sb3IiLHQpLHJjKDEpLERtKCJuZ0lmIixuLmNwQWRkQ29sb3JCdXR0b24pfX1mdW5jdGlvbiB0Myh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIpLFFwKDEsJDEsMiwzLCJkaXYiLDQ3KSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMik7ZnUodC5jcFByZXNldENvbG9yc0NsYXNzKSxyYygxKSxEbSgibmdGb3JPZiIsdC5jcFByZXNldENvbG9ycyl9fWZ1bmN0aW9uIGUzKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2Iiksa3UoMSksQW0oKSksMiZ0KXtjb25zdCB0PVltKDIpO2Z1KHQuY3BQcmVzZXRFbXB0eU1lc3NhZ2VDbGFzcykscmMoMSksU3UodC5jcFByZXNldEVtcHR5TWVzc2FnZSl9fWZ1bmN0aW9uIG4zKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2Iiw0NCksVG0oMSwiaHIiKSxSbSgyLCJkaXYiLDQ1KSxrdSgzKSxBbSgpLFFwKDQsdDMsMiw0LCJkaXYiLDQ2KSxRcCg1LGUzLDIsNCwiZGl2Iiw0NiksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoMyksU3UodC5jcFByZXNldExhYmVsKSxyYygxKSxEbSgibmdJZiIsbnVsbD09dC5jcFByZXNldENvbG9ycz9udWxsOnQuY3BQcmVzZXRDb2xvcnMubGVuZ3RoKSxyYygxKSxEbSgibmdJZiIsIShudWxsIT10LmNwUHJlc2V0Q29sb3JzJiZ0LmNwUHJlc2V0Q29sb3JzLmxlbmd0aCkmJnQuY3BBZGRDb2xvckJ1dHRvbil9fWZ1bmN0aW9uIG8zKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiYnV0dG9uIiw1MyksVm0oImNsaWNrIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oMikub25DYW5jZWxDb2xvcihuKX0pKSxrdSgxKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgyKTtmdSh0LmNwQ2FuY2VsQnV0dG9uQ2xhc3MpLHJjKDEpLFN1KHQuY3BDYW5jZWxCdXR0b25UZXh0KX19ZnVuY3Rpb24gaTModCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJidXR0b24iLDUzKSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgyKS5vbkFjY2VwdENvbG9yKG4pfSkpLGt1KDEpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKDIpO2Z1KHQuY3BPS0J1dHRvbkNsYXNzKSxyYygxKSxTdSh0LmNwT0tCdXR0b25UZXh0KX19ZnVuY3Rpb24gYTModCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDUxKSxRcCgxLG8zLDIsNCwiYnV0dG9uIiw1MiksUXAoMixpMywyLDQsImJ1dHRvbiIsNTIpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpO3JjKDEpLERtKCJuZ0lmIix0LmNwQ2FuY2VsQnV0dG9uKSxyYygxKSxEbSgibmdJZiIsdC5jcE9LQnV0dG9uKX19dmFyIHIzOyEoZnVuY3Rpb24odCl7dFt0LkhFWD0wXT0iSEVYIix0W3QuUkdCQT0xXT0iUkdCQSIsdFt0LkhTTEE9Ml09IkhTTEEiLHRbdC5DTVlLPTNdPSJDTVlLIn0pKHIzfHwocjM9e30pKTtjbGFzcyBzM3tjb25zdHJ1Y3Rvcih0LGUsbixvKXt0aGlzLnI9dCx0aGlzLmc9ZSx0aGlzLmI9bix0aGlzLmE9b319Y2xhc3MgbDN7Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy5oPXQsdGhpcy5zPWUsdGhpcy52PW4sdGhpcy5hPW99fWNsYXNzIGMze2NvbnN0cnVjdG9yKHQsZSxuLG8pe3RoaXMuaD10LHRoaXMucz1lLHRoaXMubD1uLHRoaXMuYT1vfX1jbGFzcyBkM3tjb25zdHJ1Y3Rvcih0LGUsbixvLGk9MSl7dGhpcy5jPXQsdGhpcy5tPWUsdGhpcy55PW4sdGhpcy5rPW8sdGhpcy5hPWl9fWNsYXNzIHAze2NvbnN0cnVjdG9yKCl7dGhpcy5uZXdWYWx1ZT1uZXcgTGh9aW5wdXRDaGFuZ2UodCl7Y29uc3QgZT10LnRhcmdldC52YWx1ZTtpZih2b2lkIDA9PT10aGlzLnJnKXRoaXMubmV3VmFsdWUuZW1pdChlKTtlbHNle2NvbnN0IHQ9cGFyc2VGbG9hdChlKTt0aGlzLm5ld1ZhbHVlLmVtaXQoe3Y6dCxyZzp0aGlzLnJnfSl9fX1wMy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8cDMpfSxwMy7JtWRpcj1sbyh7dHlwZTpwMyxzZWxlY3RvcnM6W1siIiwidGV4dCIsIiJdXSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezEmZSYmVm0oImlucHV0IiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5pbnB1dENoYW5nZShlKX0pKX0saW5wdXRzOntyZzoicmciLHRleHQ6InRleHQifSxvdXRwdXRzOntuZXdWYWx1ZToibmV3VmFsdWUifX0pLHAzLnByb3BEZWNvcmF0b3JzPXtyZzpbe3R5cGU6eHl9XSx0ZXh0Olt7dHlwZTp4eX1dLG5ld1ZhbHVlOlt7dHlwZTpPeX1dLGlucHV0Q2hhbmdlOlt7dHlwZTp3eSxhcmdzOlsiaW5wdXQiLFsiJGV2ZW50Il1dfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgocDMsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW3RleHRdIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW119KSx7bmV3VmFsdWU6W3t0eXBlOk95fV0saW5wdXRDaGFuZ2U6W3t0eXBlOnd5LGFyZ3M6WyJpbnB1dCIsWyIkZXZlbnQiXV19XSxyZzpbe3R5cGU6eHl9XSx0ZXh0Olt7dHlwZTp4eX1dfSk7Y2xhc3MgbTN7Y29uc3RydWN0b3IodCl7dGhpcy5lbFJlZj10LHRoaXMuZHJhZ0VuZD1uZXcgTGgsdGhpcy5kcmFnU3RhcnQ9bmV3IExoLHRoaXMubmV3VmFsdWU9bmV3IExoLHRoaXMubGlzdGVuZXJNb3ZlPXQ9PnRoaXMubW92ZSh0KSx0aGlzLmxpc3RlbmVyU3RvcD0oKT0+dGhpcy5zdG9wKCl9bW91c2VEb3duKHQpe3RoaXMuc3RhcnQodCl9dG91Y2hTdGFydCh0KXt0aGlzLnN0YXJ0KHQpfW1vdmUodCl7dC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuc2V0Q3Vyc29yKHQpfXN0YXJ0KHQpe3RoaXMuc2V0Q3Vyc29yKHQpLHQuc3RvcFByb3BhZ2F0aW9uKCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsdGhpcy5saXN0ZW5lclN0b3ApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix0aGlzLmxpc3RlbmVyU3RvcCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0aGlzLmxpc3RlbmVyTW92ZSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIix0aGlzLmxpc3RlbmVyTW92ZSksdGhpcy5kcmFnU3RhcnQuZW1pdCgpfXN0b3AoKXtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0aGlzLmxpc3RlbmVyU3RvcCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHRoaXMubGlzdGVuZXJTdG9wKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMubGlzdGVuZXJNb3ZlKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLHRoaXMubGlzdGVuZXJNb3ZlKSx0aGlzLmRyYWdFbmQuZW1pdCgpfWdldFgodCl7Y29uc3QgZT10aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuKHZvaWQgMCE9PXQucGFnZVg/dC5wYWdlWDp0LnRvdWNoZXNbMF0ucGFnZVgpLWUubGVmdC13aW5kb3cucGFnZVhPZmZzZXR9Z2V0WSh0KXtjb25zdCBlPXRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4odm9pZCAwIT09dC5wYWdlWT90LnBhZ2VZOnQudG91Y2hlc1swXS5wYWdlWSktZS50b3Atd2luZG93LnBhZ2VZT2Zmc2V0fXNldEN1cnNvcih0KXtjb25zdCBlPXRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCxuPXRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQsbz1NYXRoLm1heCgwLE1hdGgubWluKHRoaXMuZ2V0WCh0KSxlKSksaT1NYXRoLm1heCgwLE1hdGgubWluKHRoaXMuZ2V0WSh0KSxuKSk7dm9pZCAwIT09dGhpcy5yZ1gmJnZvaWQgMCE9PXRoaXMucmdZP3RoaXMubmV3VmFsdWUuZW1pdCh7czpvL2UsdjoxLWkvbixyZ1g6dGhpcy5yZ1gscmdZOnRoaXMucmdZfSk6dm9pZCAwPT09dGhpcy5yZ1gmJnZvaWQgMCE9PXRoaXMucmdZP3RoaXMubmV3VmFsdWUuZW1pdCh7djppL24scmdZOnRoaXMucmdZfSk6dm9pZCAwIT09dGhpcy5yZ1gmJnZvaWQgMD09PXRoaXMucmdZJiZ0aGlzLm5ld1ZhbHVlLmVtaXQoe3Y6by9lLHJnWDp0aGlzLnJnWH0pfX1tMy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bTMpKFNtKGhnKSl9LG0zLsm1ZGlyPWxvKHt0eXBlOm0zLHNlbGVjdG9yczpbWyIiLCJzbGlkZXIiLCIiXV0saG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJlZtKCJtb3VzZWRvd24iLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm1vdXNlRG93bihlKX0pKSgidG91Y2hzdGFydCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4udG91Y2hTdGFydChlKX0pKX0saW5wdXRzOntyZ1g6InJnWCIscmdZOiJyZ1kiLHNsaWRlcjoic2xpZGVyIn0sb3V0cHV0czp7ZHJhZ0VuZDoiZHJhZ0VuZCIsZHJhZ1N0YXJ0OiJkcmFnU3RhcnQiLG5ld1ZhbHVlOiJuZXdWYWx1ZSJ9fSksbTMuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ31dLG0zLnByb3BEZWNvcmF0b3JzPXtyZ1g6W3t0eXBlOnh5fV0scmdZOlt7dHlwZTp4eX1dLHNsaWRlcjpbe3R5cGU6eHl9XSxkcmFnRW5kOlt7dHlwZTpPeX1dLGRyYWdTdGFydDpbe3R5cGU6T3l9XSxuZXdWYWx1ZTpbe3R5cGU6T3l9XSxtb3VzZURvd246W3t0eXBlOnd5LGFyZ3M6WyJtb3VzZWRvd24iLFsiJGV2ZW50Il1dfV0sdG91Y2hTdGFydDpbe3R5cGU6d3ksYXJnczpbInRvdWNoc3RhcnQiLFsiJGV2ZW50Il1dfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobTMsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW3NsaWRlcl0ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9XX0pLHtkcmFnRW5kOlt7dHlwZTpPeX1dLGRyYWdTdGFydDpbe3R5cGU6T3l9XSxuZXdWYWx1ZTpbe3R5cGU6T3l9XSxtb3VzZURvd246W3t0eXBlOnd5LGFyZ3M6WyJtb3VzZWRvd24iLFsiJGV2ZW50Il1dfV0sdG91Y2hTdGFydDpbe3R5cGU6d3ksYXJnczpbInRvdWNoc3RhcnQiLFsiJGV2ZW50Il1dfV0scmdYOlt7dHlwZTp4eX1dLHJnWTpbe3R5cGU6eHl9XSxzbGlkZXI6W3t0eXBlOnh5fV19KTtjbGFzcyB1M3tjb25zdHJ1Y3Rvcih0LGUsbixvKXt0aGlzLmg9dCx0aGlzLnM9ZSx0aGlzLnY9bix0aGlzLmE9b319Y2xhc3MgZjN7Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy5oPXQsdGhpcy5zPWUsdGhpcy52PW4sdGhpcy5hPW99fWNsYXNzIGcze2NvbnN0cnVjdG9yKCl7dGhpcy5hY3RpdmU9bnVsbH1zZXRBY3RpdmUodCl7dGhpcy5hY3RpdmUmJnRoaXMuYWN0aXZlIT09dCYmImlubGluZSIhPT10aGlzLmFjdGl2ZS5jcERpYWxvZ0Rpc3BsYXkmJnRoaXMuYWN0aXZlLmNsb3NlRGlhbG9nKCksdGhpcy5hY3RpdmU9dH1oc3ZhMmhzbGEodCl7Y29uc3QgZT10Lmgsbj10LnMsbz10LnYsaT10LmE7aWYoMD09PW8pcmV0dXJuIG5ldyBjMyhlLDAsMCxpKTtpZigwPT09biYmMT09PW8pcmV0dXJuIG5ldyBjMyhlLDEsMSxpKTt7Y29uc3QgdD1vKigyLW4pLzI7cmV0dXJuIG5ldyBjMyhlLG8qbi8oMS1NYXRoLmFicygyKnQtMSkpLHQsaSl9fWhzbGEyaHN2YSh0KXtjb25zdCBlPU1hdGgubWluKHQuaCwxKSxuPU1hdGgubWluKHQucywxKSxvPU1hdGgubWluKHQubCwxKSxpPU1hdGgubWluKHQuYSwxKTtpZigwPT09bylyZXR1cm4gbmV3IGwzKGUsMCwwLGkpO3tjb25zdCB0PW8rbiooMS1NYXRoLmFicygyKm8tMSkpLzI7cmV0dXJuIG5ldyBsMyhlLDIqKHQtbykvdCx0LGkpfX1oc3ZhVG9SZ2JhKHQpe2xldCBlLG4sbztjb25zdCBpPXQuaCxhPXQucyxyPXQudixzPXQuYSxsPU1hdGguZmxvb3IoNippKSxjPTYqaS1sLGQ9ciooMS1hKSxwPXIqKDEtYyphKSxtPXIqKDEtKDEtYykqYSk7c3dpdGNoKGwlNil7Y2FzZSAwOmU9cixuPW0sbz1kO2JyZWFrO2Nhc2UgMTplPXAsbj1yLG89ZDticmVhaztjYXNlIDI6ZT1kLG49cixvPW07YnJlYWs7Y2FzZSAzOmU9ZCxuPXAsbz1yO2JyZWFrO2Nhc2UgNDplPW0sbj1kLG89cjticmVhaztjYXNlIDU6ZT1yLG49ZCxvPXA7YnJlYWs7ZGVmYXVsdDplPTAsbj0wLG89MH1yZXR1cm4gbmV3IHMzKGUsbixvLHMpfWNteWtUb1JnYih0KXtyZXR1cm4gbmV3IHMzKCgxLXQuYykqKDEtdC5rKSwoMS10Lm0pKigxLXQuayksKDEtdC55KSooMS10LmspLHQuYSl9cmdiYVRvQ215ayh0KXtjb25zdCBlPTEtTWF0aC5tYXgodC5yLHQuZyx0LmIpO3JldHVybiAxPT09ZT9uZXcgZDMoMCwwLDAsMSx0LmEpOm5ldyBkMygoMS10LnItZSkvKDEtZSksKDEtdC5nLWUpLygxLWUpLCgxLXQuYi1lKS8oMS1lKSxlLHQuYSl9cmdiYVRvSHN2YSh0KXtsZXQgZSxuO2NvbnN0IG89TWF0aC5taW4odC5yLDEpLGk9TWF0aC5taW4odC5nLDEpLGE9TWF0aC5taW4odC5iLDEpLHI9TWF0aC5taW4odC5hLDEpLHM9TWF0aC5tYXgobyxpLGEpLGw9TWF0aC5taW4obyxpLGEpLGM9cyxkPXMtbDtpZihuPTA9PT1zPzA6ZC9zLHM9PT1sKWU9MDtlbHNle3N3aXRjaChzKXtjYXNlIG86ZT0oaS1hKS9kKyhpPGE/NjowKTticmVhaztjYXNlIGk6ZT0oYS1vKS9kKzI7YnJlYWs7Y2FzZSBhOmU9KG8taSkvZCs0O2JyZWFrO2RlZmF1bHQ6ZT0wfWUvPTZ9cmV0dXJuIG5ldyBsMyhlLG4sYyxyKX1yZ2JhVG9IZXgodCxlKXtsZXQgbj0iIyIrKDE8PDI0fHQucjw8MTZ8dC5nPDw4fHQuYikudG9TdHJpbmcoMTYpLnN1YnN0cigxKTtyZXR1cm4gZSYmKG4rPSgyNTZ8TWF0aC5yb3VuZCgyNTUqdC5hKSkudG9TdHJpbmcoMTYpLnN1YnN0cigxKSksbn1ub3JtYWxpemVDTVlLKHQpe3JldHVybiBuZXcgZDModC5jLzEwMCx0Lm0vMTAwLHQueS8xMDAsdC5rLzEwMCx0LmEpfWRlbm9ybWFsaXplQ01ZSyh0KXtyZXR1cm4gbmV3IGQzKE1hdGguZmxvb3IoMTAwKnQuYyksTWF0aC5mbG9vcigxMDAqdC5tKSxNYXRoLmZsb29yKDEwMCp0LnkpLE1hdGguZmxvb3IoMTAwKnQuayksdC5hKX1kZW5vcm1hbGl6ZVJHQkEodCl7cmV0dXJuIG5ldyBzMyhNYXRoLnJvdW5kKDI1NSp0LnIpLE1hdGgucm91bmQoMjU1KnQuZyksTWF0aC5yb3VuZCgyNTUqdC5iKSx0LmEpfXN0cmluZ1RvSHN2YSh0PSIiLGU9ITEpe2xldCBuPW51bGw7dD0odHx8IiIpLnRvTG93ZXJDYXNlKCk7Y29uc3Qgbz1be3JlOi8ocmdiKWE/XChccyooXGR7MSwzfSlccyosXHMqKFxkezEsM30pXHMqJT8sXHMqKFxkezEsM30pXHMqJT8oPzosXHMqKFxkKyg/OlwuXGQrKT8pXHMqKT9cKS8scGFyc2U6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBzMyhwYXJzZUludCh0WzJdLDEwKS8yNTUscGFyc2VJbnQodFszXSwxMCkvMjU1LHBhcnNlSW50KHRbNF0sMTApLzI1NSxpc05hTihwYXJzZUZsb2F0KHRbNV0pKT8xOnBhcnNlRmxvYXQodFs1XSkpfX0se3JlOi8oaHNsKWE/XChccyooXGR7MSwzfSlccyosXHMqKFxkezEsM30pJVxzKixccyooXGR7MSwzfSklXHMqKD86LFxzKihcZCsoPzpcLlxkKyk/KVxzKik/XCkvLHBhcnNlOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgYzMocGFyc2VJbnQodFsyXSwxMCkvMzYwLHBhcnNlSW50KHRbM10sMTApLzEwMCxwYXJzZUludCh0WzRdLDEwKS8xMDAsaXNOYU4ocGFyc2VGbG9hdCh0WzVdKSk/MTpwYXJzZUZsb2F0KHRbNV0pKX19XTtvLnB1c2goZT97cmU6LyMoW2EtZkEtRjAtOV17Mn0pKFthLWZBLUYwLTldezJ9KShbYS1mQS1GMC05XXsyfSkoW2EtZkEtRjAtOV17Mn0pPyQvLHBhcnNlOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgczMocGFyc2VJbnQodFsxXSwxNikvMjU1LHBhcnNlSW50KHRbMl0sMTYpLzI1NSxwYXJzZUludCh0WzNdLDE2KS8yNTUscGFyc2VJbnQodFs0XXx8IkZGIiwxNikvMjU1KX19OntyZTovIyhbYS1mQS1GMC05XXsyfSkoW2EtZkEtRjAtOV17Mn0pKFthLWZBLUYwLTldezJ9KSQvLHBhcnNlOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgczMocGFyc2VJbnQodFsxXSwxNikvMjU1LHBhcnNlSW50KHRbMl0sMTYpLzI1NSxwYXJzZUludCh0WzNdLDE2KS8yNTUsMSl9fSksby5wdXNoKHtyZTovIyhbYS1mQS1GMC05XSkoW2EtZkEtRjAtOV0pKFthLWZBLUYwLTldKSQvLHBhcnNlOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgczMocGFyc2VJbnQodFsxXSt0WzFdLDE2KS8yNTUscGFyc2VJbnQodFsyXSt0WzJdLDE2KS8yNTUscGFyc2VJbnQodFszXSt0WzNdLDE2KS8yNTUsMSl9fSk7Zm9yKGNvbnN0IGUgaW4gbylpZihvLmhhc093blByb3BlcnR5KGUpKXtjb25zdCBpPW9bZV0sYT1pLnJlLmV4ZWModCkscj1hJiZpLnBhcnNlKGEpO2lmKHIpcmV0dXJuIHIgaW5zdGFuY2VvZiBzMz9uPXRoaXMucmdiYVRvSHN2YShyKTpyIGluc3RhbmNlb2YgYzMmJihuPXRoaXMuaHNsYTJoc3ZhKHIpKSxufXJldHVybiBufW91dHB1dEZvcm1hdCh0LGUsbil7c3dpdGNoKCJhdXRvIj09PWUmJihlPXQuYTwxPyJyZ2JhIjoiaGV4IiksZSl7Y2FzZSJoc2xhIjpjb25zdCBlPXRoaXMuaHN2YTJoc2xhKHQpLG89bmV3IGMzKE1hdGgucm91bmQoMzYwKmUuaCksTWF0aC5yb3VuZCgxMDAqZS5zKSxNYXRoLnJvdW5kKDEwMCplLmwpLE1hdGgucm91bmQoMTAwKmUuYSkvMTAwKTtyZXR1cm4gdC5hPDF8fCJhbHdheXMiPT09bj8iaHNsYSgiK28uaCsiLCIrby5zKyIlLCIrby5sKyIlLCIrby5hKyIpIjoiaHNsKCIrby5oKyIsIitvLnMrIiUsIitvLmwrIiUpIjtjYXNlInJnYmEiOmNvbnN0IGk9dGhpcy5kZW5vcm1hbGl6ZVJHQkEodGhpcy5oc3ZhVG9SZ2JhKHQpKTtyZXR1cm4gdC5hPDF8fCJhbHdheXMiPT09bj8icmdiYSgiK2kucisiLCIraS5nKyIsIitpLmIrIiwiK01hdGgucm91bmQoMTAwKmkuYSkvMTAwKyIpIjoicmdiKCIraS5yKyIsIitpLmcrIiwiK2kuYisiKSI7ZGVmYXVsdDpjb25zdCBhPSJhbHdheXMiPT09bnx8ImZvcmNlZCI9PT1uO3JldHVybiB0aGlzLnJnYmFUb0hleCh0aGlzLmRlbm9ybWFsaXplUkdCQSh0aGlzLmhzdmFUb1JnYmEodCkpLGEpfX19ZzMuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGczKX0sZzMuybVwcm92PU1uKHt0b2tlbjpnMyxmYWN0b3J5OmczLsm1ZmFjfSksZzMuY3RvclBhcmFtZXRlcnM9KCk9PltdLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZzMsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW119KSxudWxsKTtjbGFzcyBoM3tjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5lbFJlZj10LHRoaXMuY2RSZWY9ZSx0aGlzLnNlcnZpY2U9bix0aGlzLmlzSUUxMD0hMSx0aGlzLmRpYWxvZ0Fycm93U2l6ZT0xMCx0aGlzLmRpYWxvZ0Fycm93T2Zmc2V0PTE1LHRoaXMuZGlhbG9nSW5wdXRGaWVsZHM9W3IzLkhFWCxyMy5SR0JBLHIzLkhTTEEscjMuQ01ZS10sdGhpcy51c2VSb290Vmlld0NvbnRhaW5lcj0hMX1oYW5kbGVFc2ModCl7dGhpcy5zaG93JiYicG9wdXAiPT09dGhpcy5jcERpYWxvZ0Rpc3BsYXkmJnRoaXMub25DYW5jZWxDb2xvcih0KX1oYW5kbGVFbnRlcih0KXt0aGlzLnNob3cmJiJwb3B1cCI9PT10aGlzLmNwRGlhbG9nRGlzcGxheSYmdGhpcy5vbkFjY2VwdENvbG9yKHQpfW5nT25Jbml0KCl7dGhpcy5zbGlkZXI9bmV3IHUzKDAsMCwwLDApLHRoaXMuc2xpZGVyRGltTWF4PW5ldyBmMyh0aGlzLmh1ZVNsaWRlci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRofHwxNDAsdGhpcy5jcFdpZHRoLDEzMCx0aGlzLmFscGhhU2xpZGVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGh8fDE0MCksdGhpcy5mb3JtYXQ9dGhpcy5jcENteWtFbmFibGVkP3IzLkNNWUs6InJnYmEiPT09dGhpcy5jcE91dHB1dEZvcm1hdD9yMy5SR0JBOiJoc2xhIj09PXRoaXMuY3BPdXRwdXRGb3JtYXQ/cjMuSFNMQTpyMy5IRVgsdGhpcy5saXN0ZW5lck1vdXNlRG93bj10PT57dGhpcy5vbk1vdXNlRG93bih0KX0sdGhpcy5saXN0ZW5lclJlc2l6ZT0oKT0+e3RoaXMub25SZXNpemUoKX0sdGhpcy5vcGVuRGlhbG9nKHRoaXMuaW5pdGlhbENvbG9yLCExKX1uZ09uRGVzdHJveSgpe3RoaXMuY2xvc2VEaWFsb2coKX1uZ0FmdGVyVmlld0luaXQoKXsyMzA9PT10aGlzLmNwV2lkdGgmJiJpbmxpbmUiIT09dGhpcy5jcERpYWxvZ0Rpc3BsYXl8fCh0aGlzLnNsaWRlckRpbU1heD1uZXcgZjModGhpcy5odWVTbGlkZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aHx8MTQwLHRoaXMuY3BXaWR0aCwxMzAsdGhpcy5hbHBoYVNsaWRlci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRofHwxNDApLHRoaXMudXBkYXRlQ29sb3JQaWNrZXIoITEpLHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpKX1vcGVuRGlhbG9nKHQsZT0hMCl7dGhpcy5zZXJ2aWNlLnNldEFjdGl2ZSh0aGlzKSx0aGlzLndpZHRofHwodGhpcy5jcFdpZHRoPXRoaXMuZGlyZWN0aXZlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoKSx0aGlzLmhlaWdodHx8KHRoaXMuaGVpZ2h0PTMyMCksdGhpcy5zZXRJbml0aWFsQ29sb3IodCksdGhpcy5zZXRDb2xvckZyb21TdHJpbmcodCxlKSx0aGlzLm9wZW5Db2xvclBpY2tlcigpfWNsb3NlRGlhbG9nKCl7dGhpcy5jbG9zZUNvbG9yUGlja2VyKCl9c2V0dXBEaWFsb2codCxlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYsZyxoLGIseSxfLEMsTSx2LHgsTyxQLHcsayxTLEQsRSxSLEEsVCxOLHope3RoaXMuc2V0SW5pdGlhbENvbG9yKG4pLHRoaXMuc2V0Q29sb3JNb2RlKHMpLHRoaXMuaXNJRTEwPTEwPT09KGZ1bmN0aW9uIEkoKXtsZXQgdD0iIjsidW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvciYmKHQ9bmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKTtjb25zdCBlPXQuaW5kZXhPZigibXNpZSAiKTtyZXR1cm4gZT4wJiZwYXJzZUludCh0LnN1YnN0cmluZyhlKzUsdC5pbmRleE9mKCIuIixlKSksMTApfSkoKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlPXQsdGhpcy5kaXJlY3RpdmVFbGVtZW50UmVmPWUsdGhpcy5jcERpc2FibGVJbnB1dD1wLHRoaXMuY3BDbXlrRW5hYmxlZD1sLHRoaXMuY3BBbHBoYUNoYW5uZWw9Yyx0aGlzLmNwT3V0cHV0Rm9ybWF0PWQsdGhpcy5jcERpYWxvZ0Rpc3BsYXk9YSx0aGlzLmNwSWdub3JlZEVsZW1lbnRzPW0sdGhpcy5jcFNhdmVDbGlja091dHNpZGU9dSx0aGlzLmNwQ2xvc2VDbGlja091dHNpZGU9Zix0aGlzLnVzZVJvb3RWaWV3Q29udGFpbmVyPWcsdGhpcy53aWR0aD10aGlzLmNwV2lkdGg9cGFyc2VJbnQobywxMCksdGhpcy5oZWlnaHQ9dGhpcy5jcEhlaWdodD1wYXJzZUludChpLDEwKSx0aGlzLmNwUG9zaXRpb249aCx0aGlzLmNwUG9zaXRpb25PZmZzZXQ9cGFyc2VJbnQoYiwxMCksdGhpcy5jcE9LQnV0dG9uPVAsdGhpcy5jcE9LQnV0dG9uVGV4dD1rLHRoaXMuY3BPS0J1dHRvbkNsYXNzPXcsdGhpcy5jcENhbmNlbEJ1dHRvbj1TLHRoaXMuY3BDYW5jZWxCdXR0b25UZXh0PUUsdGhpcy5jcENhbmNlbEJ1dHRvbkNsYXNzPUQsdGhpcy5mYWxsYmFja0NvbG9yPXJ8fCIjZmZmIix0aGlzLnNldFByZXNldENvbmZpZyhfLEMpLHRoaXMuY3BQcmVzZXRDb2xvcnNDbGFzcz1NLHRoaXMuY3BNYXhQcmVzZXRDb2xvcnNMZW5ndGg9dix0aGlzLmNwUHJlc2V0RW1wdHlNZXNzYWdlPXgsdGhpcy5jcFByZXNldEVtcHR5TWVzc2FnZUNsYXNzPU8sdGhpcy5jcEFkZENvbG9yQnV0dG9uPVIsdGhpcy5jcEFkZENvbG9yQnV0dG9uVGV4dD1ULHRoaXMuY3BBZGRDb2xvckJ1dHRvbkNsYXNzPUEsdGhpcy5jcFJlbW92ZUNvbG9yQnV0dG9uQ2xhc3M9Tix0aGlzLmNwVHJpZ2dlckVsZW1lbnQ9eix5fHwodGhpcy5kaWFsb2dBcnJvd09mZnNldD0wKSwiaW5saW5lIj09PWEmJih0aGlzLmRpYWxvZ0Fycm93U2l6ZT0wLHRoaXMuZGlhbG9nQXJyb3dPZmZzZXQ9MCksImhleCI9PT1kJiYiYWx3YXlzIiE9PWMmJiJmb3JjZWQiIT09YyYmKHRoaXMuY3BBbHBoYUNoYW5uZWw9ImRpc2FibGVkIil9c2V0Q29sb3JNb2RlKHQpe3N3aXRjaCh0LnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKSl7Y2FzZSIxIjpjYXNlIkMiOmNhc2UiQ09MT1IiOnRoaXMuY3BDb2xvck1vZGU9MTticmVhaztjYXNlIjIiOmNhc2UiRyI6Y2FzZSJHUkFZU0NBTEUiOnRoaXMuY3BDb2xvck1vZGU9MjticmVhaztjYXNlIjMiOmNhc2UiUCI6Y2FzZSJQUkVTRVRTIjp0aGlzLmNwQ29sb3JNb2RlPTM7YnJlYWs7ZGVmYXVsdDp0aGlzLmNwQ29sb3JNb2RlPTF9fXNldEluaXRpYWxDb2xvcih0KXt0aGlzLmluaXRpYWxDb2xvcj10fXNldFByZXNldENvbmZpZyh0LGUpe3RoaXMuY3BQcmVzZXRMYWJlbD10LHRoaXMuY3BQcmVzZXRDb2xvcnM9ZX1zZXRDb2xvckZyb21TdHJpbmcodCxlPSEwLG49ITApe2xldCBvOyJhbHdheXMiPT09dGhpcy5jcEFscGhhQ2hhbm5lbHx8ImZvcmNlZCI9PT10aGlzLmNwQWxwaGFDaGFubmVsPyhvPXRoaXMuc2VydmljZS5zdHJpbmdUb0hzdmEodCwhMCksb3x8dGhpcy5oc3ZhfHwobz10aGlzLnNlcnZpY2Uuc3RyaW5nVG9Ic3ZhKHQsITEpKSk6bz10aGlzLnNlcnZpY2Uuc3RyaW5nVG9Ic3ZhKHQsITEpLG98fHRoaXMuaHN2YXx8KG89dGhpcy5zZXJ2aWNlLnN0cmluZ1RvSHN2YSh0aGlzLmZhbGxiYWNrQ29sb3IsITEpKSxvJiYodGhpcy5oc3ZhPW8sdGhpcy5zbGlkZXJIPXRoaXMuaHN2YS5oLCJoZXgiPT09dGhpcy5jcE91dHB1dEZvcm1hdCYmImRpc2FibGVkIj09PXRoaXMuY3BBbHBoYUNoYW5uZWwmJih0aGlzLmhzdmEuYT0xKSx0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKGUsbikpfW9uUmVzaXplKCl7ImZpeGVkIj09PXRoaXMucG9zaXRpb24/dGhpcy5zZXREaWFsb2dQb3NpdGlvbigpOiJpbmxpbmUiIT09dGhpcy5jcERpYWxvZ0Rpc3BsYXkmJnRoaXMuY2xvc2VDb2xvclBpY2tlcigpfW9uRHJhZ0VuZCh0KXt0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLnNsaWRlckRyYWdFbmQoe3NsaWRlcjp0LGNvbG9yOnRoaXMub3V0cHV0Q29sb3J9KX1vbkRyYWdTdGFydCh0KXt0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLnNsaWRlckRyYWdTdGFydCh7c2xpZGVyOnQsY29sb3I6dGhpcy5vdXRwdXRDb2xvcn0pfW9uTW91c2VEb3duKHQpeyF0aGlzLnNob3d8fHRoaXMuaXNJRTEwfHwicG9wdXAiIT09dGhpcy5jcERpYWxvZ0Rpc3BsYXl8fHQudGFyZ2V0PT09dGhpcy5kaXJlY3RpdmVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnR8fHRoaXMuaXNEZXNjZW5kYW50KHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCx0LnRhcmdldCl8fHRoaXMuaXNEZXNjZW5kYW50KHRoaXMuZGlyZWN0aXZlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LHQudGFyZ2V0KXx8MCE9PXRoaXMuY3BJZ25vcmVkRWxlbWVudHMuZmlsdGVyKChlPT5lPT09dC50YXJnZXQpKS5sZW5ndGh8fCh0aGlzLmNwU2F2ZUNsaWNrT3V0c2lkZT90aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmNvbG9yU2VsZWN0ZWQodGhpcy5vdXRwdXRDb2xvcik6KHRoaXMuaHN2YT1udWxsLHRoaXMuc2V0Q29sb3JGcm9tU3RyaW5nKHRoaXMuaW5pdGlhbENvbG9yLCExKSx0aGlzLmNwQ215a0VuYWJsZWQmJnRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuY215a0NoYW5nZWQodGhpcy5jbXlrQ29sb3IpLHRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuY29sb3JDaGFuZ2VkKHRoaXMuaW5pdGlhbENvbG9yKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmNvbG9yQ2FuY2VsZWQoKSksdGhpcy5jcENsb3NlQ2xpY2tPdXRzaWRlJiZ0aGlzLmNsb3NlQ29sb3JQaWNrZXIoKSl9b25BY2NlcHRDb2xvcih0KXt0LnN0b3BQcm9wYWdhdGlvbigpLHRoaXMub3V0cHV0Q29sb3ImJnRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuY29sb3JTZWxlY3RlZCh0aGlzLm91dHB1dENvbG9yKSwicG9wdXAiPT09dGhpcy5jcERpYWxvZ0Rpc3BsYXkmJnRoaXMuY2xvc2VDb2xvclBpY2tlcigpfW9uQ2FuY2VsQ29sb3IodCl7dGhpcy5oc3ZhPW51bGwsdC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmNvbG9yQ2FuY2VsZWQoKSx0aGlzLnNldENvbG9yRnJvbVN0cmluZyh0aGlzLmluaXRpYWxDb2xvciwhMCksInBvcHVwIj09PXRoaXMuY3BEaWFsb2dEaXNwbGF5JiYodGhpcy5jcENteWtFbmFibGVkJiZ0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmNteWtDaGFuZ2VkKHRoaXMuY215a0NvbG9yKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmNvbG9yQ2hhbmdlZCh0aGlzLmluaXRpYWxDb2xvciwhMCksdGhpcy5jbG9zZUNvbG9yUGlja2VyKCkpfW9uRm9ybWF0VG9nZ2xlKHQpe2NvbnN0IGU9dGhpcy5kaWFsb2dJbnB1dEZpZWxkcy5sZW5ndGgtKHRoaXMuY3BDbXlrRW5hYmxlZD8wOjEpLG49KCh0aGlzLmRpYWxvZ0lucHV0RmllbGRzLmluZGV4T2YodGhpcy5mb3JtYXQpK3QpJWUrZSklZTt0aGlzLmZvcm1hdD10aGlzLmRpYWxvZ0lucHV0RmllbGRzW25dfW9uQ29sb3JDaGFuZ2UodCl7dGhpcy5oc3ZhLnM9dC5zL3QucmdYLHRoaXMuaHN2YS52PXQudi90LnJnWSx0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKCksdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5zbGlkZXJDaGFuZ2VkKHtzbGlkZXI6ImxpZ2h0bmVzcyIsdmFsdWU6dGhpcy5oc3ZhLnYsY29sb3I6dGhpcy5vdXRwdXRDb2xvcn0pLHRoaXMuZGlyZWN0aXZlSW5zdGFuY2Uuc2xpZGVyQ2hhbmdlZCh7c2xpZGVyOiJzYXR1cmF0aW9uIix2YWx1ZTp0aGlzLmhzdmEucyxjb2xvcjp0aGlzLm91dHB1dENvbG9yfSl9b25IdWVDaGFuZ2UodCl7dGhpcy5oc3ZhLmg9dC52L3QucmdYLHRoaXMuc2xpZGVySD10aGlzLmhzdmEuaCx0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKCksdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5zbGlkZXJDaGFuZ2VkKHtzbGlkZXI6Imh1ZSIsdmFsdWU6dGhpcy5oc3ZhLmgsY29sb3I6dGhpcy5vdXRwdXRDb2xvcn0pfW9uVmFsdWVDaGFuZ2UodCl7dGhpcy5oc3ZhLnY9dC52L3QucmdYLHRoaXMudXBkYXRlQ29sb3JQaWNrZXIoKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLnNsaWRlckNoYW5nZWQoe3NsaWRlcjoidmFsdWUiLHZhbHVlOnRoaXMuaHN2YS52LGNvbG9yOnRoaXMub3V0cHV0Q29sb3J9KX1vbkFscGhhQ2hhbmdlKHQpe3RoaXMuaHN2YS5hPXQudi90LnJnWCx0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKCksdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5zbGlkZXJDaGFuZ2VkKHtzbGlkZXI6ImFscGhhIix2YWx1ZTp0aGlzLmhzdmEuYSxjb2xvcjp0aGlzLm91dHB1dENvbG9yfSl9b25IZXhJbnB1dCh0KXtpZihudWxsPT09dCl0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKCk7ZWxzZXt0JiYiIyIhPT10WzBdJiYodD0iIyIrdCk7bGV0IGU9L14jKFthLWYwLTldezN9fFthLWYwLTldezZ9KSQvZ2k7ImFsd2F5cyI9PT10aGlzLmNwQWxwaGFDaGFubmVsJiYoZT0vXiMoW2EtZjAtOV17M318W2EtZjAtOV17Nn18W2EtZjAtOV17OH0pJC9naSk7Y29uc3Qgbj1lLnRlc3QodCk7biYmKHQubGVuZ3RoPDUmJih0PSIjIit0LnN1YnN0cmluZygxKS5zcGxpdCgiIikubWFwKCh0PT50K3QpKS5qb2luKCIiKSksImZvcmNlZCI9PT10aGlzLmNwQWxwaGFDaGFubmVsJiYodCs9TWF0aC5yb3VuZCgyNTUqdGhpcy5oc3ZhLmEpLnRvU3RyaW5nKDE2KSksdGhpcy5zZXRDb2xvckZyb21TdHJpbmcodCwhMCwhMSkpLHRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuaW5wdXRDaGFuZ2VkKHtpbnB1dDoiaGV4Iix2YWxpZDpuLHZhbHVlOnQsY29sb3I6dGhpcy5vdXRwdXRDb2xvcn0pfX1vblJlZElucHV0KHQpe2NvbnN0IGU9dGhpcy5zZXJ2aWNlLmhzdmFUb1JnYmEodGhpcy5oc3ZhKSxuPSFpc05hTih0LnYpJiZ0LnY+PTAmJnQudjw9dC5yZztuJiYoZS5yPXQudi90LnJnLHRoaXMuaHN2YT10aGlzLnNlcnZpY2UucmdiYVRvSHN2YShlKSx0aGlzLnNsaWRlckg9dGhpcy5oc3ZhLmgsdGhpcy51cGRhdGVDb2xvclBpY2tlcigpKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmlucHV0Q2hhbmdlZCh7aW5wdXQ6InJlZCIsdmFsaWQ6bix2YWx1ZTplLnIsY29sb3I6dGhpcy5vdXRwdXRDb2xvcn0pfW9uQmx1ZUlucHV0KHQpe2NvbnN0IGU9dGhpcy5zZXJ2aWNlLmhzdmFUb1JnYmEodGhpcy5oc3ZhKSxuPSFpc05hTih0LnYpJiZ0LnY+PTAmJnQudjw9dC5yZztuJiYoZS5iPXQudi90LnJnLHRoaXMuaHN2YT10aGlzLnNlcnZpY2UucmdiYVRvSHN2YShlKSx0aGlzLnNsaWRlckg9dGhpcy5oc3ZhLmgsdGhpcy51cGRhdGVDb2xvclBpY2tlcigpKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmlucHV0Q2hhbmdlZCh7aW5wdXQ6ImJsdWUiLHZhbGlkOm4sdmFsdWU6ZS5iLGNvbG9yOnRoaXMub3V0cHV0Q29sb3J9KX1vbkdyZWVuSW5wdXQodCl7Y29uc3QgZT10aGlzLnNlcnZpY2UuaHN2YVRvUmdiYSh0aGlzLmhzdmEpLG49IWlzTmFOKHQudikmJnQudj49MCYmdC52PD10LnJnO24mJihlLmc9dC52L3QucmcsdGhpcy5oc3ZhPXRoaXMuc2VydmljZS5yZ2JhVG9Ic3ZhKGUpLHRoaXMuc2xpZGVySD10aGlzLmhzdmEuaCx0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKCkpLHRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuaW5wdXRDaGFuZ2VkKHtpbnB1dDoiZ3JlZW4iLHZhbGlkOm4sdmFsdWU6ZS5nLGNvbG9yOnRoaXMub3V0cHV0Q29sb3J9KX1vbkh1ZUlucHV0KHQpe2NvbnN0IGU9IWlzTmFOKHQudikmJnQudj49MCYmdC52PD10LnJnO2UmJih0aGlzLmhzdmEuaD10LnYvdC5yZyx0aGlzLnNsaWRlckg9dGhpcy5oc3ZhLmgsdGhpcy51cGRhdGVDb2xvclBpY2tlcigpKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmlucHV0Q2hhbmdlZCh7aW5wdXQ6Imh1ZSIsdmFsaWQ6ZSx2YWx1ZTp0aGlzLmhzdmEuaCxjb2xvcjp0aGlzLm91dHB1dENvbG9yfSl9b25WYWx1ZUlucHV0KHQpe2NvbnN0IGU9IWlzTmFOKHQudikmJnQudj49MCYmdC52PD10LnJnO2UmJih0aGlzLmhzdmEudj10LnYvdC5yZyx0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKCkpLHRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuaW5wdXRDaGFuZ2VkKHtpbnB1dDoidmFsdWUiLHZhbGlkOmUsdmFsdWU6dGhpcy5oc3ZhLnYsY29sb3I6dGhpcy5vdXRwdXRDb2xvcn0pfW9uQWxwaGFJbnB1dCh0KXtjb25zdCBlPSFpc05hTih0LnYpJiZ0LnY+PTAmJnQudjw9dC5yZztlJiYodGhpcy5oc3ZhLmE9dC52L3QucmcsdGhpcy51cGRhdGVDb2xvclBpY2tlcigpKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmlucHV0Q2hhbmdlZCh7aW5wdXQ6ImFscGhhIix2YWxpZDplLHZhbHVlOnRoaXMuaHN2YS5hLGNvbG9yOnRoaXMub3V0cHV0Q29sb3J9KX1vbkxpZ2h0bmVzc0lucHV0KHQpe2NvbnN0IGU9dGhpcy5zZXJ2aWNlLmhzdmEyaHNsYSh0aGlzLmhzdmEpLG49IWlzTmFOKHQudikmJnQudj49MCYmdC52PD10LnJnO24mJihlLmw9dC52L3QucmcsdGhpcy5oc3ZhPXRoaXMuc2VydmljZS5oc2xhMmhzdmEoZSksdGhpcy5zbGlkZXJIPXRoaXMuaHN2YS5oLHRoaXMudXBkYXRlQ29sb3JQaWNrZXIoKSksdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5pbnB1dENoYW5nZWQoe2lucHV0OiJsaWdodG5lc3MiLHZhbGlkOm4sdmFsdWU6ZS5sLGNvbG9yOnRoaXMub3V0cHV0Q29sb3J9KX1vblNhdHVyYXRpb25JbnB1dCh0KXtjb25zdCBlPXRoaXMuc2VydmljZS5oc3ZhMmhzbGEodGhpcy5oc3ZhKSxuPSFpc05hTih0LnYpJiZ0LnY+PTAmJnQudjw9dC5yZztuJiYoZS5zPXQudi90LnJnLHRoaXMuaHN2YT10aGlzLnNlcnZpY2UuaHNsYTJoc3ZhKGUpLHRoaXMuc2xpZGVySD10aGlzLmhzdmEuaCx0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKCkpLHRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuaW5wdXRDaGFuZ2VkKHtpbnB1dDoic2F0dXJhdGlvbiIsdmFsaWQ6bix2YWx1ZTplLnMsY29sb3I6dGhpcy5vdXRwdXRDb2xvcn0pfW9uQ3lhbklucHV0KHQpeyFpc05hTih0LnYpJiZ0LnY+PTAmJnQudjw9dC5yZyYmKHRoaXMuY215ay5jPXQudix0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKCExLCEwLCEwKSksdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5pbnB1dENoYW5nZWQoe2lucHV0OiJjeWFuIix2YWxpZDohMCx2YWx1ZTp0aGlzLmNteWsuYyxjb2xvcjp0aGlzLm91dHB1dENvbG9yfSl9b25NYWdlbnRhSW5wdXQodCl7IWlzTmFOKHQudikmJnQudj49MCYmdC52PD10LnJnJiYodGhpcy5jbXlrLm09dC52LHRoaXMudXBkYXRlQ29sb3JQaWNrZXIoITEsITAsITApKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmlucHV0Q2hhbmdlZCh7aW5wdXQ6Im1hZ2VudGEiLHZhbGlkOiEwLHZhbHVlOnRoaXMuY215ay5tLGNvbG9yOnRoaXMub3V0cHV0Q29sb3J9KX1vblllbGxvd0lucHV0KHQpeyFpc05hTih0LnYpJiZ0LnY+PTAmJnQudjw9dC5yZyYmKHRoaXMuY215ay55PXQudix0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKCExLCEwLCEwKSksdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5pbnB1dENoYW5nZWQoe2lucHV0OiJ5ZWxsb3ciLHZhbGlkOiEwLHZhbHVlOnRoaXMuY215ay55LGNvbG9yOnRoaXMub3V0cHV0Q29sb3J9KX1vbkJsYWNrSW5wdXQodCl7IWlzTmFOKHQudikmJnQudj49MCYmdC52PD10LnJnJiYodGhpcy5jbXlrLms9dC52LHRoaXMudXBkYXRlQ29sb3JQaWNrZXIoITEsITAsITApKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmlucHV0Q2hhbmdlZCh7aW5wdXQ6ImJsYWNrIix2YWxpZDohMCx2YWx1ZTp0aGlzLmNteWsuayxjb2xvcjp0aGlzLm91dHB1dENvbG9yfSl9b25BZGRQcmVzZXRDb2xvcih0LGUpe3Quc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5jcFByZXNldENvbG9ycy5maWx0ZXIoKHQ9PnQ9PT1lKSkubGVuZ3RofHwodGhpcy5jcFByZXNldENvbG9ycz10aGlzLmNwUHJlc2V0Q29sb3JzLmNvbmNhdChlKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLnByZXNldENvbG9yc0NoYW5nZWQodGhpcy5jcFByZXNldENvbG9ycykpfW9uUmVtb3ZlUHJlc2V0Q29sb3IodCxlKXt0LnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuY3BQcmVzZXRDb2xvcnM9dGhpcy5jcFByZXNldENvbG9ycy5maWx0ZXIoKHQ9PnQhPT1lKSksdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5wcmVzZXRDb2xvcnNDaGFuZ2VkKHRoaXMuY3BQcmVzZXRDb2xvcnMpfW9wZW5Db2xvclBpY2tlcigpe3RoaXMuc2hvd3x8KHRoaXMuc2hvdz0hMCx0aGlzLmhpZGRlbj0hMCxzZXRUaW1lb3V0KCgoKT0+e3RoaXMuaGlkZGVuPSExLHRoaXMuc2V0RGlhbG9nUG9zaXRpb24oKSx0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKX0pLDApLHRoaXMuZGlyZWN0aXZlSW5zdGFuY2Uuc3RhdGVDaGFuZ2VkKCEwKSx0aGlzLmlzSUUxMHx8KGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5saXN0ZW5lck1vdXNlRG93biksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5saXN0ZW5lck1vdXNlRG93bikpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRoaXMubGlzdGVuZXJSZXNpemUpKX1jbG9zZUNvbG9yUGlja2VyKCl7dGhpcy5zaG93JiYodGhpcy5zaG93PSExLHRoaXMuZGlyZWN0aXZlSW5zdGFuY2Uuc3RhdGVDaGFuZ2VkKCExKSx0aGlzLmlzSUUxMHx8KGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5saXN0ZW5lck1vdXNlRG93biksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5saXN0ZW5lck1vdXNlRG93bikpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLHRoaXMubGlzdGVuZXJSZXNpemUpLHRoaXMuY2RSZWYuZGVzdHJveWVkfHx0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKSl9dXBkYXRlQ29sb3JQaWNrZXIodD0hMCxlPSEwLG49ITEpe2lmKHRoaXMuc2xpZGVyRGltTWF4KXtsZXQgbyxpLGE7Mj09PXRoaXMuY3BDb2xvck1vZGUmJih0aGlzLmhzdmEucz0wKTtjb25zdCByPXRoaXMub3V0cHV0Q29sb3I7aWYoaT10aGlzLnNlcnZpY2UuaHN2YTJoc2xhKHRoaXMuaHN2YSksdGhpcy5jcENteWtFbmFibGVkPyhuPyhhPXRoaXMuc2VydmljZS5jbXlrVG9SZ2IodGhpcy5zZXJ2aWNlLm5vcm1hbGl6ZUNNWUsodGhpcy5jbXlrKSksdGhpcy5oc3ZhPXRoaXMuc2VydmljZS5yZ2JhVG9Ic3ZhKGEpKTooYT10aGlzLnNlcnZpY2UuaHN2YVRvUmdiYSh0aGlzLmhzdmEpLHRoaXMuY215az10aGlzLnNlcnZpY2UuZGVub3JtYWxpemVDTVlLKHRoaXMuc2VydmljZS5yZ2JhVG9DbXlrKGEpKSksYT10aGlzLnNlcnZpY2UuZGVub3JtYWxpemVSR0JBKGEpLHRoaXMuc2xpZGVySD10aGlzLmhzdmEuaCk6YT10aGlzLnNlcnZpY2UuZGVub3JtYWxpemVSR0JBKHRoaXMuc2VydmljZS5oc3ZhVG9SZ2JhKHRoaXMuaHN2YSkpLG89dGhpcy5zZXJ2aWNlLmRlbm9ybWFsaXplUkdCQSh0aGlzLnNlcnZpY2UuaHN2YVRvUmdiYShuZXcgbDModGhpcy5zbGlkZXJIfHx0aGlzLmhzdmEuaCwxLDEsMSkpKSxlJiYodGhpcy5oc2xhVGV4dD1uZXcgYzMoTWF0aC5yb3VuZCgzNjAqaS5oKSxNYXRoLnJvdW5kKDEwMCppLnMpLE1hdGgucm91bmQoMTAwKmkubCksTWF0aC5yb3VuZCgxMDAqaS5hKS8xMDApLHRoaXMucmdiYVRleHQ9bmV3IHMzKGEucixhLmcsYS5iLE1hdGgucm91bmQoMTAwKmEuYSkvMTAwKSx0aGlzLmNwQ215a0VuYWJsZWQmJih0aGlzLmNteWtUZXh0PW5ldyBkMyh0aGlzLmNteWsuYyx0aGlzLmNteWsubSx0aGlzLmNteWsueSx0aGlzLmNteWsuayxNYXRoLnJvdW5kKDEwMCp0aGlzLmNteWsuYSkvMTAwKSksdGhpcy5oZXhUZXh0PXRoaXMuc2VydmljZS5yZ2JhVG9IZXgoYSwiYWx3YXlzIj09PXRoaXMuY3BBbHBoYUNoYW5uZWwpLHRoaXMuaGV4QWxwaGE9dGhpcy5yZ2JhVGV4dC5hKSwiYXV0byI9PT10aGlzLmNwT3V0cHV0Rm9ybWF0JiZ0aGlzLmZvcm1hdCE9PXIzLlJHQkEmJnRoaXMuZm9ybWF0IT09cjMuQ01ZSyYmdGhpcy5oc3ZhLmE8MSYmKHRoaXMuZm9ybWF0PXRoaXMuaHN2YS5hPDE/cjMuUkdCQTpyMy5IRVgpLHRoaXMuaHVlU2xpZGVyQ29sb3I9InJnYigiK28ucisiLCIrby5nKyIsIitvLmIrIikiLHRoaXMuYWxwaGFTbGlkZXJDb2xvcj0icmdiKCIrYS5yKyIsIithLmcrIiwiK2EuYisiKSIsdGhpcy5vdXRwdXRDb2xvcj10aGlzLnNlcnZpY2Uub3V0cHV0Rm9ybWF0KHRoaXMuaHN2YSx0aGlzLmNwT3V0cHV0Rm9ybWF0LHRoaXMuY3BBbHBoYUNoYW5uZWwpLHRoaXMuc2VsZWN0ZWRDb2xvcj10aGlzLnNlcnZpY2Uub3V0cHV0Rm9ybWF0KHRoaXMuaHN2YSwicmdiYSIsbnVsbCksdGhpcy5mb3JtYXQhPT1yMy5DTVlLKXRoaXMuY215a0NvbG9yPSIiO2Vsc2UgaWYoImFsd2F5cyI9PT10aGlzLmNwQWxwaGFDaGFubmVsfHwiZW5hYmxlZCI9PT10aGlzLmNwQWxwaGFDaGFubmVsfHwiZm9yY2VkIj09PXRoaXMuY3BBbHBoYUNoYW5uZWwpe2NvbnN0IHQ9TWF0aC5yb3VuZCgxMDAqdGhpcy5jbXlrLmEpLzEwMDt0aGlzLmNteWtDb2xvcj1gY215a2EoJHt0aGlzLmNteWsuY30sJHt0aGlzLmNteWsubX0sJHt0aGlzLmNteWsueX0sJHt0aGlzLmNteWsua30sJHt0fSlgfWVsc2UgdGhpcy5jbXlrQ29sb3I9YGNteWsoJHt0aGlzLmNteWsuY30sJHt0aGlzLmNteWsubX0sJHt0aGlzLmNteWsueX0sJHt0aGlzLmNteWsua30pYDt0aGlzLnNsaWRlcj1uZXcgdTMoKHRoaXMuc2xpZGVySHx8dGhpcy5oc3ZhLmgpKnRoaXMuc2xpZGVyRGltTWF4LmgtOCx0aGlzLmhzdmEucyp0aGlzLnNsaWRlckRpbU1heC5zLTgsKDEtdGhpcy5oc3ZhLnYpKnRoaXMuc2xpZGVyRGltTWF4LnYtOCx0aGlzLmhzdmEuYSp0aGlzLnNsaWRlckRpbU1heC5hLTgpLHQmJnIhPT10aGlzLm91dHB1dENvbG9yJiYodGhpcy5jcENteWtFbmFibGVkJiZ0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmNteWtDaGFuZ2VkKHRoaXMuY215a0NvbG9yKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmNvbG9yQ2hhbmdlZCh0aGlzLm91dHB1dENvbG9yKSl9fXNldERpYWxvZ1Bvc2l0aW9uKCl7aWYoImlubGluZSI9PT10aGlzLmNwRGlhbG9nRGlzcGxheSl0aGlzLnBvc2l0aW9uPSJyZWxhdGl2ZSI7ZWxzZXtsZXQgdCxlPSJzdGF0aWMiLG49IiIsbz1udWxsLGk9bnVsbCxhPXRoaXMuZGlyZWN0aXZlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnBhcmVudE5vZGU7Y29uc3Qgcj10aGlzLmRpYWxvZ0VsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7Zm9yKDtudWxsIT09YSYmIkhUTUwiIT09YS50YWdOYW1lOyl7aWYodD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKSxlPXQuZ2V0UHJvcGVydHlWYWx1ZSgicG9zaXRpb24iKSxuPXQuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNmb3JtIiksInN0YXRpYyIhPT1lJiZudWxsPT09byYmKG89YSksbiYmIm5vbmUiIT09biYmbnVsbD09PWkmJihpPWEpLCJmaXhlZCI9PT1lKXtvPWk7YnJlYWt9YT1hLnBhcmVudE5vZGV9Y29uc3Qgcz10aGlzLmNyZWF0ZURpYWxvZ0JveCh0aGlzLmRpcmVjdGl2ZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwiZml4ZWQiIT09ZSk7aWYodGhpcy51c2VSb290Vmlld0NvbnRhaW5lcnx8ImZpeGVkIj09PWUmJighb3x8byBpbnN0YW5jZW9mIEhUTUxVbmtub3duRWxlbWVudCkpdGhpcy50b3A9cy50b3AsdGhpcy5sZWZ0PXMubGVmdDtlbHNle251bGw9PT1vJiYobz1hKTtjb25zdCB0PXRoaXMuY3JlYXRlRGlhbG9nQm94KG8sImZpeGVkIiE9PWUpO3RoaXMudG9wPXMudG9wLXQudG9wLHRoaXMubGVmdD1zLmxlZnQtdC5sZWZ0fSJmaXhlZCI9PT1lJiYodGhpcy5wb3NpdGlvbj0iZml4ZWQiKTtsZXQgbD10aGlzLmNwUG9zaXRpb247ImF1dG8iPT09dGhpcy5jcFBvc2l0aW9uJiYobD0oZnVuY3Rpb24gYyh0LGUpe2xldCBuPSJyaWdodCIsbz0iYm90dG9tIjtjb25zdHtoZWlnaHQ6aSx3aWR0aDphfT10LHt0b3A6cixsZWZ0OnN9PWUsbD1yK2UuaGVpZ2h0LGM9cytlLndpZHRoLGQ9ci1pPDAscD1sK2k+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCksbT1zLWE8MCx1PWMrYT4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk7cmV0dXJuIHAmJihvPSJ0b3AiKSxkJiYobz0iYm90dG9tIiksbSYmKG49InJpZ2h0IiksdSYmKG49ImxlZnQiKSxkJiZwJiZtJiZ1P1sibGVmdCIsInJpZ2h0IiwidG9wIiwiYm90dG9tIl0ucmVkdWNlKCgoZSxuKT0+dFtlXT50W25dP2U6bikpOm0mJnU/ZD8iYm90dG9tIjpwfHxyPmw/InRvcCI6ImJvdHRvbSI6ZCYmcD9tPyJyaWdodCI6dXx8cz5jPyJsZWZ0IjoicmlnaHQiOmAke299LSR7bn1gfSkodGhpcy5kaWFsb2dFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdGhpcy5jcFRyaWdnZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKSwidG9wIj09PWw/KHRoaXMuYXJyb3dUb3A9ci0xLHRoaXMudG9wLT1yK3RoaXMuZGlhbG9nQXJyb3dTaXplLHRoaXMubGVmdCs9dGhpcy5jcFBvc2l0aW9uT2Zmc2V0LzEwMCpzLndpZHRoLXRoaXMuZGlhbG9nQXJyb3dPZmZzZXQpOiJib3R0b20iPT09bD8odGhpcy50b3ArPXMuaGVpZ2h0K3RoaXMuZGlhbG9nQXJyb3dTaXplLHRoaXMubGVmdCs9dGhpcy5jcFBvc2l0aW9uT2Zmc2V0LzEwMCpzLndpZHRoLXRoaXMuZGlhbG9nQXJyb3dPZmZzZXQpOiJ0b3AtbGVmdCI9PT1sfHwibGVmdC10b3AiPT09bD8odGhpcy50b3AtPXItcy5oZWlnaHQrcy5oZWlnaHQqdGhpcy5jcFBvc2l0aW9uT2Zmc2V0LzEwMCx0aGlzLmxlZnQtPXRoaXMuY3BXaWR0aCt0aGlzLmRpYWxvZ0Fycm93U2l6ZS0yLXRoaXMuZGlhbG9nQXJyb3dPZmZzZXQpOiJ0b3AtcmlnaHQiPT09bHx8InJpZ2h0LXRvcCI9PT1sPyh0aGlzLnRvcC09ci1zLmhlaWdodCtzLmhlaWdodCp0aGlzLmNwUG9zaXRpb25PZmZzZXQvMTAwLHRoaXMubGVmdCs9cy53aWR0aCt0aGlzLmRpYWxvZ0Fycm93U2l6ZS0yLXRoaXMuZGlhbG9nQXJyb3dPZmZzZXQpOiJsZWZ0Ij09PWx8fCJib3R0b20tbGVmdCI9PT1sfHwibGVmdC1ib3R0b20iPT09bD8odGhpcy50b3ArPXMuaGVpZ2h0KnRoaXMuY3BQb3NpdGlvbk9mZnNldC8xMDAtdGhpcy5kaWFsb2dBcnJvd09mZnNldCx0aGlzLmxlZnQtPXRoaXMuY3BXaWR0aCt0aGlzLmRpYWxvZ0Fycm93U2l6ZS0yKToodGhpcy50b3ArPXMuaGVpZ2h0KnRoaXMuY3BQb3NpdGlvbk9mZnNldC8xMDAtdGhpcy5kaWFsb2dBcnJvd09mZnNldCx0aGlzLmxlZnQrPXMud2lkdGgrdGhpcy5kaWFsb2dBcnJvd1NpemUtMiksdGhpcy5jcFVzZVBvc2l0aW9uPWx9fWlzRGVzY2VuZGFudCh0LGUpe2xldCBuPWUucGFyZW50Tm9kZTtmb3IoO251bGwhPT1uOyl7aWYobj09PXQpcmV0dXJuITA7bj1uLnBhcmVudE5vZGV9cmV0dXJuITF9Y3JlYXRlRGlhbG9nQm94KHQsZSl7cmV0dXJue3RvcDp0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCsoZT93aW5kb3cucGFnZVlPZmZzZXQ6MCksbGVmdDp0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQrKGU/d2luZG93LnBhZ2VYT2Zmc2V0OjApLHdpZHRoOnQub2Zmc2V0V2lkdGgsaGVpZ2h0OnQub2Zmc2V0SGVpZ2h0fX19aDMuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGgzKShTbShoZyksU20oVWcpLFNtKGczKSl9LGgzLsm1Y21wPXRvKHt0eXBlOmgzLHNlbGVjdG9yczpbWyJjb2xvci1waWNrZXIiXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihRaChFMSw3KSxRaChSMSw3KSxRaChBMSw3KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5kaWFsb2dFbGVtZW50PXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLmh1ZVNsaWRlcj10LmZpcnN0KSxKaCh0PXRiKCkpJiYobi5hbHBoYVNsaWRlcj10LmZpcnN0KX19LGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgia2V5dXAuZXNjIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5oYW5kbGVFc2MoZSl9KSwhMSxpbCkoImtleXVwLmVudGVyIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5oYW5kbGVFbnRlcihlKX0pLCExLGlsKX0sZGVjbHM6MjgsdmFyczo0Nyxjb25zdHM6W1sxLCJjb2xvci1waWNrZXIiLDMsImNsaWNrIl0sWyJkaWFsb2dQb3B1cCIsIiJdLFszLCJjbGFzcyIsInRvcCIsNCwibmdJZiJdLFsiY2xhc3MiLCJzYXR1cmF0aW9uLWxpZ2h0bmVzcyIsMywic2xpZGVyIiwicmdYIiwicmdZIiwiYmFja2dyb3VuZC1jb2xvciIsIm5ld1ZhbHVlIiwiZHJhZ1N0YXJ0IiwiZHJhZ0VuZCIsNCwibmdJZiJdLFsxLCJodWUtYWxwaGEiLCJib3giXSxbMSwibGVmdCJdLFsxLCJzZWxlY3RlZC1jb2xvci1iYWNrZ3JvdW5kIl0sWzEsInNlbGVjdGVkLWNvbG9yIl0sWyJ0eXBlIiwiYnV0dG9uIiwzLCJjbGFzcyIsImRpc2FibGVkIiwiY2xpY2siLDQsIm5nSWYiXSxbMSwicmlnaHQiXSxbInN0eWxlIiwiaGVpZ2h0OiAxNnB4OyIsNCwibmdJZiJdLFsxLCJodWUiLDMsInNsaWRlciIsInJnWCIsIm5ld1ZhbHVlIiwiZHJhZ1N0YXJ0IiwiZHJhZ0VuZCJdLFsiaHVlU2xpZGVyIiwiIl0sWzEsImN1cnNvciJdLFsxLCJ2YWx1ZSIsMywic2xpZGVyIiwicmdYIiwibmV3VmFsdWUiLCJkcmFnU3RhcnQiLCJkcmFnRW5kIl0sWyJ2YWx1ZVNsaWRlciIsIiJdLFsxLCJhbHBoYSIsMywic2xpZGVyIiwicmdYIiwibmV3VmFsdWUiLCJkcmFnU3RhcnQiLCJkcmFnRW5kIl0sWyJhbHBoYVNsaWRlciIsIiJdLFsiY2xhc3MiLCJjbXlrLXRleHQiLDMsImRpc3BsYXkiLDQsIm5nSWYiXSxbImNsYXNzIiwiaHNsYS10ZXh0IiwzLCJkaXNwbGF5Iiw0LCJuZ0lmIl0sWyJjbGFzcyIsInJnYmEtdGV4dCIsMywiZGlzcGxheSIsNCwibmdJZiJdLFsiY2xhc3MiLCJoZXgtdGV4dCIsMywiaGV4LWFscGhhIiwiZGlzcGxheSIsNCwibmdJZiJdLFsiY2xhc3MiLCJ2YWx1ZS10ZXh0Iiw0LCJuZ0lmIl0sWyJjbGFzcyIsInR5cGUtcG9saWN5Iiw0LCJuZ0lmIl0sWyJjbGFzcyIsInByZXNldC1hcmVhIiw0LCJuZ0lmIl0sWyJjbGFzcyIsImJ1dHRvbi1hcmVhIiw0LCJuZ0lmIl0sWzEsInNhdHVyYXRpb24tbGlnaHRuZXNzIiwzLCJzbGlkZXIiLCJyZ1giLCJyZ1kiLCJuZXdWYWx1ZSIsImRyYWdTdGFydCIsImRyYWdFbmQiXSxbInR5cGUiLCJidXR0b24iLDMsImRpc2FibGVkIiwiY2xpY2siXSxbMiwiaGVpZ2h0IiwiMTZweCJdLFsxLCJjbXlrLXRleHQiXSxbMSwiYm94Il0sWyJ0eXBlIiwibnVtYmVyIiwicGF0dGVybiIsIlswLTldKiIsIm1pbiIsIjAiLCJtYXgiLCIxMDAiLDMsInRleHQiLCJyZyIsInZhbHVlIiwia2V5dXAuZW50ZXIiLCJuZXdWYWx1ZSJdLFsidHlwZSIsIm51bWJlciIsInBhdHRlcm4iLCJbMC05XSsoW1xcLixdWzAtOV17MSwyfSk/IiwibWluIiwiMCIsIm1heCIsIjEiLCJzdGVwIiwiMC4xIiwzLCJ0ZXh0IiwicmciLCJ2YWx1ZSIsImtleXVwLmVudGVyIiwibmV3VmFsdWUiLDQsIm5nSWYiXSxbNCwibmdJZiJdLFsidHlwZSIsIm51bWJlciIsInBhdHRlcm4iLCJbMC05XSsoW1xcLixdWzAtOV17MSwyfSk/IiwibWluIiwiMCIsIm1heCIsIjEiLCJzdGVwIiwiMC4xIiwzLCJ0ZXh0IiwicmciLCJ2YWx1ZSIsImtleXVwLmVudGVyIiwibmV3VmFsdWUiXSxbMSwiaHNsYS10ZXh0Il0sWyJ0eXBlIiwibnVtYmVyIiwicGF0dGVybiIsIlswLTldKiIsIm1pbiIsIjAiLCJtYXgiLCIzNjAiLDMsInRleHQiLCJyZyIsInZhbHVlIiwia2V5dXAuZW50ZXIiLCJuZXdWYWx1ZSJdLFsxLCJyZ2JhLXRleHQiXSxbInR5cGUiLCJudW1iZXIiLCJwYXR0ZXJuIiwiWzAtOV0qIiwibWluIiwiMCIsIm1heCIsIjI1NSIsMywidGV4dCIsInJnIiwidmFsdWUiLCJrZXl1cC5lbnRlciIsIm5ld1ZhbHVlIl0sWzEsImhleC10ZXh0Il0sWzMsInRleHQiLCJ2YWx1ZSIsImJsdXIiLCJrZXl1cC5lbnRlciIsIm5ld1ZhbHVlIl0sWzEsInZhbHVlLXRleHQiXSxbMSwidHlwZS1wb2xpY3kiXSxbMSwidHlwZS1wb2xpY3ktYXJyb3ciLDMsImNsaWNrIl0sWzEsInByZXNldC1hcmVhIl0sWzEsInByZXNldC1sYWJlbCJdLFszLCJjbGFzcyIsNCwibmdJZiJdLFsiY2xhc3MiLCJwcmVzZXQtY29sb3IiLDMsImJhY2tncm91bmRDb2xvciIsImNsaWNrIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbMSwicHJlc2V0LWNvbG9yIiwzLCJjbGljayJdLFszLCJjbGFzcyIsImNsaWNrIiw0LCJuZ0lmIl0sWzMsImNsaWNrIl0sWzEsImJ1dHRvbi1hcmVhIl0sWyJ0eXBlIiwiYnV0dG9uIiwzLCJjbGFzcyIsImNsaWNrIiw0LCJuZ0lmIl0sWyJ0eXBlIiwiYnV0dG9uIiwzLCJjbGljayJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiZGl2IiwwLDEpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCl9KSksUXAoMixUMSwxLDUsImRpdiIsMiksUXAoMyxOMSwyLDgsImRpdiIsMyksUm0oNCwiZGl2Iiw0KSxSbSg1LCJkaXYiLDUpLFRtKDYsImRpdiIsNiksVG0oNywiZGl2Iiw3KSxRcCg4LHoxLDIsNSwiYnV0dG9uIiw4KSxBbSgpLFJtKDksImRpdiIsOSksUXAoMTAsSTEsMSwwLCJkaXYiLDEwKSxSbSgxMSwiZGl2IiwxMSwxMiksVm0oIm5ld1ZhbHVlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vbkh1ZUNoYW5nZShlKX0pKSgiZHJhZ1N0YXJ0IiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uRHJhZ1N0YXJ0KCJodWUiKX0pKSgiZHJhZ0VuZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkRyYWdFbmQoImh1ZSIpfSkpLFRtKDEzLCJkaXYiLDEzKSxBbSgpLFJtKDE0LCJkaXYiLDE0LDE1KSxWbSgibmV3VmFsdWUiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uVmFsdWVDaGFuZ2UoZSl9KSkoImRyYWdTdGFydCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkRyYWdTdGFydCgidmFsdWUiKX0pKSgiZHJhZ0VuZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkRyYWdFbmQoInZhbHVlIil9KSksVG0oMTYsImRpdiIsMTMpLEFtKCksUm0oMTcsImRpdiIsMTYsMTcpLFZtKCJuZXdWYWx1ZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25BbHBoYUNoYW5nZShlKX0pKSgiZHJhZ1N0YXJ0IiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uRHJhZ1N0YXJ0KCJhbHBoYSIpfSkpKCJkcmFnRW5kIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uRHJhZ0VuZCgiYWxwaGEiKX0pKSxUbSgxOSwiZGl2IiwxMyksQW0oKSxBbSgpLEFtKCksUXAoMjAsTDEsMTcsMTIsImRpdiIsMTgpLFFwKDIxLGoxLDE0LDEwLCJkaXYiLDE5KSxRcCgyMixXMSwxNCwxMCwiZGl2IiwyMCksUXAoMjMsWjEsOCw3LCJkaXYiLDIxKSxRcCgyNCxLMSw5LDMsImRpdiIsMjIpLFFwKDI1LEoxLDMsMCwiZGl2IiwyMyksUXAoMjYsbjMsNiwzLCJkaXYiLDI0KSxRcCgyNyxhMywzLDIsImRpdiIsMjUpLEFtKCkpLDImZSYmKGR1KCJkaXNwbGF5IixuLnNob3c/ImJsb2NrIjoibm9uZSIpKCJ2aXNpYmlsaXR5IixuLmhpZGRlbj8iaGlkZGVuIjoidmlzaWJsZSIpKCJ0b3AiLG4udG9wLCJweCIpKCJsZWZ0IixuLmxlZnQsInB4IikoInBvc2l0aW9uIixuLnBvc2l0aW9uKSgiaGVpZ2h0IixuLmNwSGVpZ2h0LCJweCIpKCJ3aWR0aCIsbi5jcFdpZHRoLCJweCIpLHB1KCJvcGVuIixuLnNob3cpLHJjKDIpLERtKCJuZ0lmIiwicG9wdXAiPT1uLmNwRGlhbG9nRGlzcGxheSkscmMoMSksRG0oIm5nSWYiLDE9PT0obi5jcENvbG9yTW9kZXx8MSkpLHJjKDQpLGR1KCJiYWNrZ3JvdW5kLWNvbG9yIixuLnNlbGVjdGVkQ29sb3IpLHJjKDEpLERtKCJuZ0lmIixuLmNwQWRkQ29sb3JCdXR0b24pLHJjKDIpLERtKCJuZ0lmIiwiZGlzYWJsZWQiPT09bi5jcEFscGhhQ2hhbm5lbCkscmMoMSksZHUoImRpc3BsYXkiLDE9PT0obi5jcENvbG9yTW9kZXx8MSk/ImJsb2NrIjoibm9uZSIpLERtKCJyZ1giLDEpLHJjKDIpLGR1KCJsZWZ0IixudWxsPT1uLnNsaWRlcj9udWxsOm4uc2xpZGVyLmgsInB4IikscmMoMSksZHUoImRpc3BsYXkiLDI9PT0obi5jcENvbG9yTW9kZXx8MSk/ImJsb2NrIjoibm9uZSIpLERtKCJyZ1giLDEpLHJjKDIpLGR1KCJyaWdodCIsbnVsbD09bi5zbGlkZXI/bnVsbDpuLnNsaWRlci52LCJweCIpLHJjKDEpLGR1KCJkaXNwbGF5IiwiZGlzYWJsZWQiPT09bi5jcEFscGhhQ2hhbm5lbD8ibm9uZSI6ImJsb2NrIikoImJhY2tncm91bmQtY29sb3IiLG4uYWxwaGFTbGlkZXJDb2xvciksRG0oInJnWCIsMSkscmMoMiksZHUoImxlZnQiLG51bGw9PW4uc2xpZGVyP251bGw6bi5zbGlkZXIuYSwicHgiKSxyYygxKSxEbSgibmdJZiIsIW4uY3BEaXNhYmxlSW5wdXQmJjE9PT0obi5jcENvbG9yTW9kZXx8MSkpLHJjKDEpLERtKCJuZ0lmIiwhbi5jcERpc2FibGVJbnB1dCYmMT09PShuLmNwQ29sb3JNb2RlfHwxKSkscmMoMSksRG0oIm5nSWYiLCFuLmNwRGlzYWJsZUlucHV0JiYxPT09KG4uY3BDb2xvck1vZGV8fDEpKSxyYygxKSxEbSgibmdJZiIsIW4uY3BEaXNhYmxlSW5wdXQmJjE9PT0obi5jcENvbG9yTW9kZXx8MSkpLHJjKDEpLERtKCJuZ0lmIiwhbi5jcERpc2FibGVJbnB1dCYmMj09PShuLmNwQ29sb3JNb2RlfHwxKSkscmMoMSksRG0oIm5nSWYiLCFuLmNwRGlzYWJsZUlucHV0JiYxPT09KG4uY3BDb2xvck1vZGV8fDEpKSxyYygxKSxEbSgibmdJZiIsKG51bGw9PW4uY3BQcmVzZXRDb2xvcnM/bnVsbDpuLmNwUHJlc2V0Q29sb3JzLmxlbmd0aCl8fG4uY3BBZGRDb2xvckJ1dHRvbikscmMoMSksRG0oIm5nSWYiLG4uY3BPS0J1dHRvbnx8bi5jcENhbmNlbEJ1dHRvbikpfSxkaXJlY3RpdmVzOltkTSxtMyxwMyxsTV0sc3R5bGVzOlsnLmNvbG9yLXBpY2tlcnstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lO2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICM3Nzc7Y3Vyc29yOmRlZmF1bHQ7aGVpZ2h0OmF1dG87cG9zaXRpb246YWJzb2x1dGU7dXNlci1zZWxlY3Q6bm9uZTt3aWR0aDoyMzBweDt6LWluZGV4OjEwMDB9LmNvbG9yLXBpY2tlciAqe2JveC1zaXppbmc6Ym9yZGVyLWJveDtmb250LXNpemU6MTFweDttYXJnaW46MH0uY29sb3ItcGlja2VyIGlucHV0e2NvbG9yOiMwMDA7Zm9udC1zaXplOjEzcHg7aGVpZ2h0OjI2cHg7bWluLXdpZHRoOjA7dGV4dC1hbGlnbjpjZW50ZXI7d2lkdGg6MH0uY29sb3ItcGlja2VyIGlucHV0Oi1tb3otc3VibWl0LWludmFsaWQsLmNvbG9yLXBpY2tlciBpbnB1dDotbW96LXVpLWludmFsaWQsLmNvbG9yLXBpY2tlciBpbnB1dDppbnZhbGlke2JveC1zaGFkb3c6bm9uZX0uY29sb3ItcGlja2VyIGlucHV0Ojotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLC5jb2xvci1waWNrZXIgaW5wdXQ6Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7bWFyZ2luOjB9LmNvbG9yLXBpY2tlciAuYXJyb3d7Ym9yZGVyLXN0eWxlOnNvbGlkO2hlaWdodDowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjA7ei1pbmRleDo5OTk5OTl9LmNvbG9yLXBpY2tlciAuYXJyb3cuYXJyb3ctdG9we2JvcmRlci1jb2xvcjojNzc3IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O2JvcmRlci13aWR0aDoxMHB4IDVweDtsZWZ0OjhweH0uY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy1ib3R0b217Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICM3Nzc7Ym9yZGVyLXdpZHRoOjEwcHggNXB4O2xlZnQ6OHB4O3RvcDotMjBweH0uY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy1sZWZ0LXRvcCwuY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy10b3AtbGVmdHtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgIzc3Nztib3JkZXItd2lkdGg6NXB4IDEwcHg7Ym90dG9tOjhweDtyaWdodDotMjFweH0uY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy1yaWdodC10b3AsLmNvbG9yLXBpY2tlciAuYXJyb3cuYXJyb3ctdG9wLXJpZ2h0e2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudCAjNzc3IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O2JvcmRlci13aWR0aDo1cHggMTBweDtib3R0b206OHB4O2xlZnQ6LTIwcHh9LmNvbG9yLXBpY2tlciAuYXJyb3cuYXJyb3ctYm90dG9tLWxlZnQsLmNvbG9yLXBpY2tlciAuYXJyb3cuYXJyb3ctbGVmdCwuY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy1sZWZ0LWJvdHRvbXtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgIzc3Nztib3JkZXItd2lkdGg6NXB4IDEwcHg7cmlnaHQ6LTIxcHg7dG9wOjhweH0uY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy1ib3R0b20tcmlnaHQsLmNvbG9yLXBpY2tlciAuYXJyb3cuYXJyb3ctcmlnaHQsLmNvbG9yLXBpY2tlciAuYXJyb3cuYXJyb3ctcmlnaHQtYm90dG9te2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudCAjNzc3IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O2JvcmRlci13aWR0aDo1cHggMTBweDtsZWZ0Oi0yMHB4O3RvcDo4cHh9LmNvbG9yLXBpY2tlciAuY3Vyc29ye2JvcmRlcjoycHggc29saWQgIzIyMjtib3JkZXItcmFkaXVzOjUwJTtjdXJzb3I6ZGVmYXVsdDtoZWlnaHQ6MTZweDtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxNnB4fS5jb2xvci1waWNrZXIgLmJveHtkaXNwbGF5OmZsZXg7cGFkZGluZzo0cHggOHB4fS5jb2xvci1waWNrZXIgLmxlZnR7cGFkZGluZzoxNnB4IDhweDtwb3NpdGlvbjpyZWxhdGl2ZX0uY29sb3ItcGlja2VyIC5yaWdodHtmbGV4OjEgMSBhdXRvO3BhZGRpbmc6MTJweCA4cHh9LmNvbG9yLXBpY2tlciAuYnV0dG9uLWFyZWF7cGFkZGluZzowIDE2cHggMTZweDt0ZXh0LWFsaWduOnJpZ2h0fS5jb2xvci1waWNrZXIgLmJ1dHRvbi1hcmVhIGJ1dHRvbnttYXJnaW4tbGVmdDo4cHh9LmNvbG9yLXBpY2tlciAucHJlc2V0LWFyZWF7cGFkZGluZzo0cHggMTVweH0uY29sb3ItcGlja2VyIC5wcmVzZXQtYXJlYSAucHJlc2V0LWxhYmVse2NvbG9yOiM1NTU7Zm9udC1zaXplOjExcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6NHB4O3RleHQtYWxpZ246bGVmdDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDt3aWR0aDoxMDAlfS5jb2xvci1waWNrZXIgLnByZXNldC1hcmVhIC5wcmVzZXQtY29sb3J7Ym9yZGVyOjFweCBzb2xpZCAjYTlhOWE5O2JvcmRlci1yYWRpdXM6MjUlO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDoxOHB4O21hcmdpbjo0cHggNnB4IDhweDtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxOHB4fS5jb2xvci1waWNrZXIgLnByZXNldC1hcmVhIC5wcmVzZXQtZW1wdHktbWVzc2FnZXtmb250LXN0eWxlOml0YWxpYzttYXJnaW4tYm90dG9tOjhweDttYXJnaW4tdG9wOjRweDttaW4taGVpZ2h0OjE4cHg7dGV4dC1hbGlnbjpjZW50ZXJ9LmNvbG9yLXBpY2tlciAuaGV4LXRleHR7Zm9udC1zaXplOjExcHg7cGFkZGluZzo0cHggOHB4O3dpZHRoOjEwMCV9LmNvbG9yLXBpY2tlciAuaGV4LXRleHQgLmJveHtwYWRkaW5nOjAgMjRweCA4cHggOHB4fS5jb2xvci1waWNrZXIgLmhleC10ZXh0IC5ib3ggZGl2e2NsZWFyOmxlZnQ7Y29sb3I6IzU1NTtmbGV4OjEgMSBhdXRvO2Zsb2F0OmxlZnQ7dGV4dC1hbGlnbjpjZW50ZXJ9LmNvbG9yLXBpY2tlciAuaGV4LXRleHQgLmJveCBpbnB1dHtib3JkZXI6MXB4IHNvbGlkICNhOWE5YTk7ZmxleDoxIDEgYXV0bztwYWRkaW5nOjFweH0uY29sb3ItcGlja2VyIC5oZXgtYWxwaGEgLmJveCBkaXY6Zmlyc3QtY2hpbGQsLmNvbG9yLXBpY2tlciAuaGV4LWFscGhhIC5ib3ggaW5wdXQ6Zmlyc3QtY2hpbGR7ZmxleC1ncm93OjM7bWFyZ2luLXJpZ2h0OjhweH0uY29sb3ItcGlja2VyIC5jbXlrLXRleHQsLmNvbG9yLXBpY2tlciAuaHNsYS10ZXh0LC5jb2xvci1waWNrZXIgLnJnYmEtdGV4dCwuY29sb3ItcGlja2VyIC52YWx1ZS10ZXh0e2ZvbnQtc2l6ZToxMXB4O3BhZGRpbmc6NHB4IDhweDt3aWR0aDoxMDAlfS5jb2xvci1waWNrZXIgLmNteWstdGV4dCAuYm94LC5jb2xvci1waWNrZXIgLmhzbGEtdGV4dCAuYm94LC5jb2xvci1waWNrZXIgLnJnYmEtdGV4dCAuYm94e3BhZGRpbmc6MCAyNHB4IDhweCA4cHh9LmNvbG9yLXBpY2tlciAudmFsdWUtdGV4dCAuYm94e3BhZGRpbmc6MCA4cHggOHB4fS5jb2xvci1waWNrZXIgLmNteWstdGV4dCAuYm94IGRpdiwuY29sb3ItcGlja2VyIC5oc2xhLXRleHQgLmJveCBkaXYsLmNvbG9yLXBpY2tlciAucmdiYS10ZXh0IC5ib3ggZGl2LC5jb2xvci1waWNrZXIgLnZhbHVlLXRleHQgLmJveCBkaXZ7Y29sb3I6IzU1NTtmbGV4OjEgMSBhdXRvO21hcmdpbi1yaWdodDo4cHg7dGV4dC1hbGlnbjpjZW50ZXJ9LmNvbG9yLXBpY2tlciAuY215ay10ZXh0IC5ib3ggZGl2Omxhc3QtY2hpbGQsLmNvbG9yLXBpY2tlciAuaHNsYS10ZXh0IC5ib3ggZGl2Omxhc3QtY2hpbGQsLmNvbG9yLXBpY2tlciAucmdiYS10ZXh0IC5ib3ggZGl2Omxhc3QtY2hpbGQsLmNvbG9yLXBpY2tlciAudmFsdWUtdGV4dCAuYm94IGRpdjpsYXN0LWNoaWxke21hcmdpbi1yaWdodDowfS5jb2xvci1waWNrZXIgLmNteWstdGV4dCAuYm94IGlucHV0LC5jb2xvci1waWNrZXIgLmhzbGEtdGV4dCAuYm94IGlucHV0LC5jb2xvci1waWNrZXIgLnJnYmEtdGV4dCAuYm94IGlucHV0LC5jb2xvci1waWNrZXIgLnZhbHVlLXRleHQgLmJveCBpbnB1dHtib3JkZXI6MXB4IHNvbGlkICNhOWE5YTk7ZmxleDoxO2Zsb2F0OmxlZnQ7bWFyZ2luOjAgOHB4IDAgMDtwYWRkaW5nOjFweH0uY29sb3ItcGlja2VyIC5jbXlrLXRleHQgLmJveCBpbnB1dDpsYXN0LWNoaWxkLC5jb2xvci1waWNrZXIgLmhzbGEtdGV4dCAuYm94IGlucHV0Omxhc3QtY2hpbGQsLmNvbG9yLXBpY2tlciAucmdiYS10ZXh0IC5ib3ggaW5wdXQ6bGFzdC1jaGlsZCwuY29sb3ItcGlja2VyIC52YWx1ZS10ZXh0IC5ib3ggaW5wdXQ6bGFzdC1jaGlsZHttYXJnaW4tcmlnaHQ6MH0uY29sb3ItcGlja2VyIC5odWUtYWxwaGF7YWxpZ24taXRlbXM6Y2VudGVyO21hcmdpbi1ib3R0b206M3B4fS5jb2xvci1waWNrZXIgLmh1ZXtiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFKWUFBQUFRQ0FZQUFBRDA2SVluQUFBQUJtSkxSMFFBL3dEL0FQK2d2YWVUQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUFCM1JKVFVVSDRBSVdEd2tVRldiQ0NBQUFBRnhKUkVGVWFON3Qwa0VLZzBBUUFNRTJ4ODMvbjJxdTVxQ2dEMWlEaENvWWRwbmJRQzliYlkxcVZPL2p2YzZrM2FkOTFzNy83RjEvY3NnUHJ1anVRMTdCRFlTRnNCQVd3Z0poSVN5RUJjSkNXQWdMaElXd0VCWUlpMmY3QXIvMVRDZ0ZIMlg5QUFBQUFFbEZUa1N1UW1DQyIpO2RpcmVjdGlvbjpsdHJ9LmNvbG9yLXBpY2tlciAuaHVlLC5jb2xvci1waWNrZXIgLnZhbHVle2JhY2tncm91bmQtc2l6ZToxMDAlIDEwMCU7Ym9yZGVyOm5vbmU7Y3Vyc29yOnBvaW50ZXI7aGVpZ2h0OjE2cHg7bWFyZ2luLWJvdHRvbToxNnB4O3dpZHRoOjEwMCV9LmNvbG9yLXBpY2tlciAudmFsdWV7YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSllBQUFBUUNBWUFBQUQwNklZbkFBQUNUa2xFUVZSNDJ1M1NZVWNyQUJoQTRVMlNrbVJKTW1XU0prbEtKaVdaWnBLVUpKc2tLVW1hVEZJbUtaT1V6TXlTcEdSbWxpUk5KaWxKU3BLU0pFdG1TcElwbVdtU2RPNzM2LzZEK3g3T1AzZ1VDb1dDdjFjcWxTUWxKWkdjbkV4S1NncXBxYW1rcGFXUm5wNU9Sa1lHbVptWnFGUXFzckt5eU03T0ppY25oOXpjWE5ScU5YbDVlZVRuNTZQUmFDZ29LS0N3c0pDaW9pSzBXaTNGeGNXVWxKUlFXbHBLV1ZrWjVlWGxWRlJVVUZsWmlVNm5vNnFxaXVycWFtcHFhcWl0cmFXdXJnNjlYazk5ZlQwR2d3R2owVWhEUXdPTmpZMDBOVFhSM054TVMwc0xyYTJ0dExXMTBkN2Vqc2xrd213MjA5SFJRV2RuSjExZFhYUjNkOVBUMDBOdmJ5OTlmWDMwOS9jek1EREE0T0FnRm91Rm9hRWhyRllydzhQRGpJeU1NRG82eXRqWUdEYWJqZkh4Y1NZbUpwaWNuR1JxYWdxNzNjNzA5RFF6TXpQTXpzNHlOemZIL1B3OERvY0RwOU9KeStYQzdYYXpzTERBNHVJaVMwdExMQzh2czdLeXd1cnFLbXRyYTNnOEhyeGVMejZmRDcvZnovcjZPaHNiRzJ4dWJySzF0Y1gyOWphQlFJQ2RuUjJDd1NDN3U3dnM3ZTJ4djcvUHdjRUJoNGVISEIwZGNYeDh6TW5KQ2FlbnA1eWRuWEYrZnM3RnhRV1hsNWRjWFYxeGZYM056YzBOdDdlMzNOM2RFUXFGdUwrLzUrSGhnWEE0VENRUzRmSHhrYWVuSjU2Zm4zbDVlZUgxOVpWb05NcmIyeHZ2Nys5OGZId1FpOFdJeCtOOGZuNlNTQ1Q0K3ZyaSsvdWJuNThmZm45LytWY0tnU1d3QkpiQUVsZ0NTMkFKTElFbHNBU1d3QkpZQWt0Z0NTeUJKYkFFbHNBU1dBSkxZQWtzZ1NXd0JKYkFFbGdDUzJBSkxJRWxzUDQvV0g4QW1KNVo2akhTNGg4QUFBQUFTVVZPUks1Q1lJST0iKTtkaXJlY3Rpb246cnRsfS5jb2xvci1waWNrZXIgLmFscGhhe2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUpZQUFBQVFDQVlBQUFEMDZJWW5BQUFBQm1KTFIwUUEvd0QvQVArZ3ZhZVRBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBQUIzUkpUVVVINEFJV0R3WVFsWk1hM2dBQUFXVkpSRUZVYU43dG1FR082akFRUkNzT0FySGdCcHlBSllHamNHb2N4QW00QTJJSHBtb1dFMGVCSCtlem1GbE52VTA2c2hKM1c2VkVlbFdNVVFBSUlGOWY2cVpwaW1zQTFMWXRTMnVGNTEvdTI3WVZBRlpWUlVrRW9HSGRQVi9zSWNiSUVJSWtVZEkvOVhhN25leXY2MStTV0ZVVkFWQ1NjdDAwVFduMmZ2NnUzK0VjZmQzdFh6eS8wK25FVXUrU1Bqby9rcXpybWlRcFNjTjZ2OThYZXdmQTgvbE1raUxKMld4R1NVb3BjVDZmTTZVME5YOS9mcmZiamV2MVd0ZnJsWmZMaFlmRFFRSEcvQUlPbG5Hd2pJTmxIQ3hqSEN6allKbS9USldkQ3dxdUpYc2VGRnpHd0ROTmVpS01PSlRPOHhRZERRYWVCMjkrSzllZmVMYUJvOUo3dmR2dEpqMVJqRkZqZml2N3F2OTV0angvN2xlU1FnaDkzZTFmZk1lSXA2TytZUWpoby9ONzkxdDFYVk9TU0k3Ti8vSys0L0dveFdMQngrUEI1L09wNVhMSisvM09sSkpXcXhVM204M292djVpR2Y4S2pZTmxIQ3hqSEN6allCa0h5NWdmNWd1c3ZRVTdVMzdqVEFBQUFBQkpSVTVFcmtKZ2dnPT0iKTtiYWNrZ3JvdW5kLXNpemU6MTAwJSAxMDAlO2JvcmRlcjpub25lO2N1cnNvcjpwb2ludGVyO2RpcmVjdGlvbjpsdHI7aGVpZ2h0OjE2cHg7d2lkdGg6MTAwJX0uY29sb3ItcGlja2VyIC50eXBlLXBvbGljeXtiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCSUFBQUFnQ0FZQUFBQWZmQ2p4QUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUFDZXdBQUFuc0IwMUNPM0FBQUFCbDBSVmgwVTI5bWRIZGhjbVVBZDNkM0xtbHVhM05qWVhCbExtOXlaNXZ1UEJvQUFBSUFTVVJCVkVpSjdaWTlheFJSRklhZnN4TVN0ckxRSnBBZ3BCRmhpK0M5dzFZU28wMEk2UlovZzl2WnBCZi9RT3I0R3lSZ2tTS05TckFhZHNacVFHd0NrdUFXeVJaSnN5U3d2aFo3Ti92aHpyZ2JMSDNMZDg1OTdqbHp6NTB6Sm9reXhYSDhEcURWYXIwcWk2djhCYkl0cVNHcEVjZnhkbG1zRldYa3ZYOEFmQVZXZzNVS1BFblQ5R0t1ak16c0FGZ1pzVmFDTjFWVFFkNzdYVW5yZ0Uxa3YrNjkzNTI2OFdScHpybkhadllSV0M3WXZDM3BSWlpsM3dvenF0VnFpeUg5SWdqQXNwa2QxR3ExeFVKUXRWcmRCOVpLSUFPdGhkZy9RYzY1TFVrN3dOSU1vQ1ZKTzg2NXJZRmhrcWpYNi9kN3ZWNEdQSndCTXFvZlVSUzVKRWs2RllCZXIvZWVZYi9NbzlXd0ZuUE92UWJlQXZmdUFBSzRCTjRzQUp0QUcvZ0pJRWxtTnVpSnliYTNFR05tWmlQZVp1RVZtVmVsbC9ZLzZOK0N6RG4zQVhoRU9PbzdIdi8zQmVBejhJelFrTVBuSmJ1UHgxd0MreVlKNy8wbllJUDVTLzBGSEtkcCtyd0NFRVhSUy9yZjVIbDFHdGIyTTBpU3BDT3BDWnpQQVRtWDFFeVNwSE1MQXNpeTdNak1Eb0hyR1NEWFpuYVlaZG5Sd0JoN0o5MXV0d21jekFBNkNiRzNHZ1BsZVg0anFVSC9hMUNrdHFSR251YzNoU0NBTUIzMmdLc3BrQ3RnYjNLQ1FNbWtqZVA0V05KVGhyTk5admFsMVdwdFRJc3Y3SnRRNHRtSWRSYThxU29FcFdsNllXWk5vQU4wekt4Wk5QZWhwTFNCWnYydCtRMENKOWxMbkFSUUxBQUFBQUJKUlU1RXJrSmdnZz09Iik7YmFja2dyb3VuZC1wb3NpdGlvbjo1MCU7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtc2l6ZTo4cHggMTZweDtoZWlnaHQ6MjRweDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDoxMnB4O3RvcDoyMThweDt3aWR0aDoxNnB4fS5jb2xvci1waWNrZXIgLnR5cGUtcG9saWN5IC50eXBlLXBvbGljeS1hcnJvd3tkaXNwbGF5OmJsb2NrO2hlaWdodDo1MCU7d2lkdGg6MTAwJX0uY29sb3ItcGlja2VyIC5zZWxlY3RlZC1jb2xvcntib3JkZXI6MXB4IHNvbGlkICNhOWE5YTk7Ym9yZGVyLXJhZGl1czo1MCU7aGVpZ2h0OjQwcHg7bGVmdDo4cHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjE2cHg7d2lkdGg6NDBweH0uY29sb3ItcGlja2VyIC5zZWxlY3RlZC1jb2xvci1iYWNrZ3JvdW5ke2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNnQUFBQW9DQVlBQUFDTS9yaHRBQUFBaDBsRVFWUllSKzJXMFFsQU1RZ0Q2MHpkZndPZHFhOFRtSS93UU1yNUswSTViWkxJekxPYTJudDM3VlZWYmQrZER4NW9iZ0NDM0tCTHdKMmZmNFBuVmlka2YrdWNJaHc4MEhRYUNMbzNETUgzQ1JLM2lGc21BV1ZsNmhQTkR3dDhFdk5FNXErWXVFWGNNZ2tvblZNNlNkeUNvRXZBblo4djFIang4MTdNaWxteFNVQjVyZExKRHljWmdVQVpVY2gvQUFBQUFFbEZUa1N1UW1DQyIpO2JvcmRlci1yYWRpdXM6NTAlO2hlaWdodDo0MHB4O3dpZHRoOjQwcHh9LmNvbG9yLXBpY2tlciAuc2F0dXJhdGlvbi1saWdodG5lc3N7YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBT1lBQUFDQ0NBWUFBQUJTRDdUM0FBQUFCbUpMUjBRQS93RC9BUCtndmFlVEFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFBQjNSSlRVVUg0QUlXRHdrc1BXUjZsZ0FBSUFCSlJFRlVlTnJ0blZ1VDQ3Z1JyQUhOK1AvL09yLzYxWTV3T05aN21aMXUzWEFlTE1qSlpHWlZnZEtzZmM1eFIzUzBSSUlVVytDSHpDcGMyTWNZbzdYR3YzZXg3VWlaZDU3cmp5enp2K3YrMzNYL1IvKzNyL2Y3dlIzODZZK1R2S05jZi93ZGhUTFBjdjlxVTJ3WmQ3NHV0aDB0MTgyMWprSVpMUGNzSS82bldhNFh2dXRxdVUwWjg1bW54ODBTL1p6Z3BuTG5PdEhOdDcvb2Z4MVRLWGNTTnpOLzdxYk1RM2p1N3JOUW1NWVlkLzRzMmo5YWErUCtnR2FNY1pyYjFNL3RkcnZmNy9kMnY5OVA5L3Q5M08vM2NidmR4dTEyRzlmcmRWd3VsM0UrbjhjLy8vblArMisvL1hiNjZhZWZ4bC8vK3RmeDV6Ly8yWUs1QWwycmd2ZjRVc2JwZEdyQjUyYkF2QXJYcHV6am1pcUFWU0d6NWVEbUdZWHpoYkFabUNybm16ZGRwVVUrOFkxZEFPWWVYQ3REVXdWd1Y3WUNHSDZ1QW15TWNaOWw1dmtVYUJQR01VWjcvSjV3Lzc5Mi9mdnY5WHE5MzI2M2RyL2ZUeFBFQ2VNRThuSzVqTS9Qei9IVFR6L2R2MzM3ZHZybGwxL0dQLzd4ai9HM3YvMXQvT1V2ZndrVnN3b25namRPcDlQekgzVTNEM3ptV0duWlZYbjRqQ3FzN3dDMkJLUDQvOHRBemtac29XeDZYcnFlSFp5bXZwNEFCQ0JKaFRRd0tmRFQ4Z3pyWkNJcWk1QWhpQUNqQmZFQjJyUDgvWDYzTU03ZjYvVjZ2OS92N1hhN2JZQzgzVzdqY3Jsc1ZISXE1ZmZ2MzArLy9mYmIrT1dYWDhaUFAvMDAvdjczdjQrZmYvNzVKU3ZiZXUrYkwyV01NYUZiQWxwQk5NODVRWCtjdDZxb1Nxa1BBd3VRbEJWS3FHTkZTVU9BQTNCbXU3Z0M1aE5PZDE1blN3dkFPVVc3QzRnaVVDVjhTZ241TDloTkZJcVRzcDBHeEkweXNpb3lqQWprWS90R0pWRXB6K2Z6K09XWFgrN2Z2MzgvL2Y3NzcrUGJ0Mi9qMTE5L0hULy8vUFA0OWRkZng4ZkhSd3JtVGpWNzc5RVh1MnB4Mnhoand0ZEpaUWNBV1FJUExQSVNzTUphU3dpRDhneklLcndTeUFURTVqNW5BYlI1YzFkQlV3QmxzRVdXMGg2THFpWXNxRlBBUXhDeVJaM3dPU0FSeG1sWE1YNWs2NHBRZnZ2MjdmNzUrZGsrUGo1T0h4OGY0L3YzNytQYnQyL2p0OTkrRzkrK2ZSc2ZIeC9qY3JtVUZMTzMxZ1lEV2JseFJJcy9UcWZUN291c3hKc0F4WEEyR2M3VEE5WGRnZmRvSGJGc2o3NlgyKzFXQXJnSTFhZ2VHd0EzcXVwcW9Ic21jYkk2RnU5M3F1Z2dGYTlkN0xlRHRnS2ZBRkhCSitORUJ5SWtjSjVLZXJ2ZFRtaGhHY2dKSlNaNXZuLy9maitmeisxOFBwOCtQei9INStmbm1HRCsvdnZ2NC92MzcrUGo0Mk44Zm42TzIrMVdzN0pqalA2d3JhTUk1RTRSWjh4MnZWNVRTd2txdW90VjcvZDdUejZIRldzRC9xTmNkdzBDUTNxLzMyMWM2ODZUd0RWSWRidXk3M3pObGRoU0hiOEkya2xaem5tK0luQlM0VTZuMDMwMmFCRnNMaEhEQUtKVkpWZ2xmSTlqaHZ1NTNXNTNzTEFOWU54QWlEQTZNQ2VVSHg4ZjkrdjEyaTZYUzd0Y0xxY1pXNTdQNXllWTgvZno4M09jeitmbnNTbVlVeWtuV0VHODVXQnN0OXN0elNMeU1kZnI5UWkwOGlZMTVVWjBMbERHTGhSM281eksyajdPUFVURDBFK25VM3RrN1hiLzE2TkZiaGxvQU11WTF6akxVT08zQktlSURlK1o4czMvSjRnRm80VE01alBtdVJnMjhmb1VLS1ZTd28xNlRnQTVucHl3Y1dMSGdZbC9QejgvNzMvNjA1L2FiNy85MW02M1c3dGNMaWUwc1pqNG1hbzVnVHlmejg4RTBmMStqOEVjWXp3VFBFRzJjcWp5ZkhORjBNOGZ1cUVpYU9WblJ6WlpRTmg1ZndReUhnL0hER2ZKbzg5UTF6Yi9xdXU1WEM2NzczSTJYS2ZUcWQvdjkrZDN3dXFXdmEvWVRkVWRFVjNmaEl2L1ZpeXBzNllFM3gzcjQzSzViSlFTNjZ6YXhWR0ZzdmQrLy9qNGFGKy9mbTNmdjM5dnQ5dXRmZjM2dGYzKysrL3RkcnVkdm4zN1p1TkxCYWFDTWdVekMrclpSaUZvd3hVdUpJOFlNcWNDcDlPcHE1dmFnYVlVNmxHSkExWFFxZWpjaHc2Q2owR3c1bllCckd3MDFBMk8yMDZuMDRCR291Tk55VGZwL0Z3RWxoVWV5Nm5YcklLdzdRUVdkZHh1TjJsZEw1Zkw4MzlnU1BGOGFodS9KdkJPNDhDUFN1cU1mOFZwOS9QNTNMNTgrZEx1OTNzN244L3RmcjgvMzkvdjkvYjUrVGtoUEozUDU2bVE0MzYvaisvZnYrL2lTZ2J6ZXIwK0FaeC81Kzg4YnY2T01kYTZTNXo2a2QyMWZZQzlkeHY3Y0lKSjJkOUFPUzMwZlBNenlIaVRNOEI0REY2WFVsWUhwNEtRVzNXKzF0NzdNTkIxdkdIeFdxN1hhN3ZmNzgreTUvTjVBK0gxZXQyOXh1UDVkYll0eWFSdTRBa3NiUHE2OTM2ZmpSelhSeEJiUHIvYitiMTgrZktsalRIYUJCQmZuOC9uMC8xK0gxKytmQm5uOHptMHNCOGZINXU0Y3I1R3VCaE1WazBFRW45UnNjdGdWaE0raXhsSnRNQTIzUjhCNnl5c0FzdEJPZ0ZYSUtLQ01JZ1RvTXFORXUyZllNSDd6dGM3MzJkUUtrQ2oxeXRBWnRZMEt4OHBJcjhHR0orQVQzVisySGlyaGwrK2ZCbVh5Mld6NzN3K2IxN1A4cCtmbjgvdFV3R1ZsZVZrVHlVYjY4RGtmYXlXWTR6eE5SaWhVNEVwTEpQWlZySyt1N0o0L21nZktxZUxXOVgyUkVXbEl0TDFkaXluYkREYjMralhnWWpRcW4wcnJ4V2MrTmtJTFA3Rjd4SWJNdng3dlY1M3g0MHhubGJXSkYxMlpTYWcvTjBwVzZ0K1p6bU9NekhqYWpLd0Rmb25kNzh6WVRkZnExOHVwOTd6cjJxOHYzSWlvQnByUnRCbDBFWjlvZzVXQlJHT2RPSGpJalhGN1VvdEZiZ09Xblh6SUp5ell2akc1SVlnc21NT3hIa3o4T3NNU3JWTldlcTVUOERhT2NiRXYxT2Q1cmJzOWFPN1l2TWV0NjNFa0YrK2ZNRXhxK01SbDQvTDViTFpOLytleitmblo2S2F6dU1xWFNRVk81c3BKWGZsSEFJemVzL3hKc2Vja1JKaURNb2c5ZDZWZlJycVhNcjZLcFZWMjdqUndKYWNHb3ZPQU0xek1kUU1ud0sxQXViSzYza2RDQ2h2STFDN2cwejluZi9EK1h6ZTJWajhIN0d4NFA5ZHVRbHNZQ3JxeU44WHFHM0htLzEwT2ozancvbitjcmxzdHVNK2pQbW14VDJkVHVQejgzUHp0MnBuMVhzRUhYL2JuUGFWcVZtaDB4d090MG82WExMQUhlUFVVMjAzd0hmY3JzcEN3bVYzVHJ5QjVzME1zZWVnOTd4L0J3ekNqQmxiQitwUkFQbGEwQlZRdVQ2VjZRSGRCbGozZDBLRzE0N2IrRHF4UWVVeW1ETzQzVzRkUWFyK1RJandtQWQwejgvaDY1dmYwL3lMdjNQYjVYTHBydS95ZERvOXM3RVQwSStQajZkS0s5VlVFSWVLV1FXUEFPcko4TEtkNHZFK3Q5MVkzZTdVRmxXYXRnMlZ3Sm5iK0hQbXR2bS9zZks1OS9PYVdGM3gvZVAxVVBIdkE1RERZRHBZWGZiMGRydjFWMkRrQmt4dHcvdEVXVlZsWFdkQzlwRllzNS9qZmg5ZFMvMTZ2VzdzNmxURytUZnFzeFNKSHhrWFhxL1hkcjFldTRMc2ZENlAzdnNUM043N0RrTCt6UG01alNkS0w0elIzQXhRZDZySGtMa1lsU293c3JxN3puenU2d1N3ZHNNSk9YbUE1ZkJjanh0Z01HQllIbHI1em9raHRzTUNUZ1hMUU9XNFhDNmRFeUVNcHJMOG1BUXpYUmdkdWl4Mnlaem9yeGtZc0RuM2hCMVZlTUxHc1hzVnRnbDJwVzhTM3N2azB2dzdSNGhOYUh2djRjQUNsNUhGendJSDBLYzZ6dTRYakRQUi9qcEFWeFd6TzFYazJERGIzdlRjeGVHVTFpV1pIa21JRFd6aVdLdmlyQ0o0RHJhdnM2SUovR0c2Y1RxV2RYRHkrZkFyUURWVmtMcWtWakFvWklJVGRtbUlxWHdxYTk1TjMrTUdZb1pRZFJWTk81M1kxeFJraE8xNnZZN2V1NTA3Q2E5bEpuYkdweE9lbVFoU3cvQVFzbW1wNXpVOUJpVThHNnd2WDc2TTYvVTZQajQrZG8wQno0Q3BnaWtuVFVlRHF3bEtCbWczdTRPVmpyWjFBK3JBY2dhZWpXcTZlSkN2Q1lGRE9OU3dPZ0hYNEVRUnc4bHhiekRPZEVLNmdaM0hrMWIrOGcybzFKRnRLWHl2L2ZFZFRYdVdqV1hkQVppQnA2QURlRHJDRmlpbTdCNlpGbmVlSTdHdm0vUE1rVURYNjdXN3hJOGIwRDcvdjhkQTlxZk41b2FDZjc0V1pqSDBtZjFjbWZZMVkwSlVGbVZyVFd1OHV6a05jTHRFajd1NUZYQlRrZkM2R09BNXE4WU14TzhLVnZGNnNBVkdkY3JVYnNLT0RjUUtrTE1PTWRtbHh1bTY0MllyUG0yNkFsaFpXMVlCMVIrcnJHc3dFOFRhWUFXZVVNeGRmK1dqd1N2WjJFZjN5dE95Zm41K1BwVlBBYXFPbjQzTXROQnF2bWpqeGJqTTRsWmpaWTRncU5NSTVrdGFXL3NZS053Uys5bEZRekdpaG1NQ0tQYTcrWjBWNkViMEdSbW9idHBYOEpsald1NUZNTE41amE2aEc5a3dRZ1pxZjUrMU5INVV4emtGUmVDZFdoSjhYZGxHVWt4TzdIUmxZUm00bVZPNDNXN3RlcjEyVFBKRXcvcm1FTjNMNVNLSElXWmc5bXorcFVvS09ZcTViSlRKZFgyZ21lMVVjeE1aUUZhRVFJbEhjdDMyTStZMUJ6R2tHdXpmaXlBTjl6K3VncGxaMXN5bUNyRENZWWtHeERUcEk5UnpCeTBySHllRFVDMW5XYWVVYUQ5bjR4a055WU1CRFp0elozQisrZkpsWTIxWEZET2NBUkpsYWJPeWlTM3VDcExJOWpyWmpDRGthVnZjQ0Nqd29nbktTaFdkelhaV2xaTXZWVGdEOExwcWxDTHJxZ2JjQitxWXdyZ0tZcFQwY2NDcWJLeUNWYWxrRWFibi9GeW5vZ0NyUEtmcWY1MXhKN3NHQjJaWGNabXhvU096dGp4MzAwRFppN2EwLzJBSVIwVWxCYWc5U3VEdzZLY0F6bGFCN3ZIWnZXcGpLOTBkeXJxNmJLeURVWlFiUjBCMDViaUxRa0hJY1NVbWdJSytTd3VxZ0hDbm9pbzJSUVUxeWorQm5CeTlwcGhWS0xHeUM3WnpGSzFweFdLK0U4SWhWQ1dMTi91THRuVVU0YXlvWUxvYUFOejhGZHRhU3ZZNHBWMEJFVzJsczYxY3pxbGxCS3BUeUtnTUFocloxY2RjMVJST3RQbXZXTmtkY0taN1pLeGFXamlQTEpNcHA3T1pLeEErcnFHL29KTGp4ZjBwbkpscUxvRFpvM2d5VTBtS0d5czJ0YUtlY2ovZDFDK3JKU3BsQnFsVHlBcWdSK0Q4S2pLbG1STDJndFVjQWRDdHNMK2lqQ05UMW9xcXFrSDJPSEViRzVzREZuVWc1QWEreUxvdTJWVTFwdGoxUzJaUXF2MU9SWk45SVd6UmZnYVJCeEtvQkU4VVd5cWxKRnRySWMwQXhOalNqZWQ5OUNUWS9YRGZTekN6NU0wSVpvVkVzV25QRk5Uc2w4b29WQzFUemJHZ3FGWk5EU2dWd0tLKzFzR0RNS3F4WkNXR1ZNRHlzaUVyMWpWU1FKVVl3ajVpSE9sVGhkSHQ0NFNRZzlDTitubDhEOTBOTUlnQWRncjQ2SnFSaVI5STh2UmRGdmJyMTdtL3l4VU1Lak5MTWlWVUFEd3UyQ1dHaGhpK0Y1NVRXTTlNOWNvZ3ptczFkbk00dU9GL0xBRVlXZGNxbk03eUZteXEzSWZ3bU9ST2Q3WTFpRld0T2pvWThUbzQxbVRWNUl5c2dGRnVSenNiV0ZHYk5JSUpDRHYxZE9vNGxaRzdqV0J3UkZ0VlRLdVd5ZUNCeUpLT2FuOG9aM2VwOVhkZE5sMHREdWF5d0x6OWNYUFllREFBMFNwa0JPOXNiVmNUT1ZXbGRQdjR1eXpFa3p4SHRqdm9uSG9Ta0ZFV05vbzFkOERoY1FwdXRkMnBwTm9uNEJ6b0FpSjFoQkZRZzBkVnRkYkdISERRV3VzaG1ORVF1a0xNMlFPMUcyWThiZ1RYcUZoY0JKajdFalBnY1B0czhVUzhxUHBQQi9kWHpuT2g1WjQzOHR6SDVlYzZRZ3JPS3JSUmZLbXlzQm1VREIrUGhZYWJNbFZQRVIrR0NTSVRUenI3YW0ydEFySDNiZ2NFelBKbStjcjVqSjRObkhORkRWckZYY0k1TGU5azVKbncrYmVkYlYrRmZSelpJSGFPT2FPc0xZMC83VUdzNThEanJHd0tNSU1GSUd6T0VXMS9qR3NkQXRDTjZoRUFJNGhCZTlZWGVSUk9CU1ZQQVZQQXF2SU01Yng1aFZLV0FNUDZ6QlJ5M2llc2NyaWRWZEZCaW5CeFhEbkcyR1JZMlhiQ3ZwMWxodkd0TzlCeHU1aDkwOFhRdTQybG5TQXJNRmRpek1pbTh1d1JDeFBHbm5PUzhsd3BuYk9pRHFUQWpzclJOL1Bjb0FTY0NiYUFDcVZNNDB5bG5qalRCcytid1dsQUcyMy9VS2Jka2l3S1dJUVBHeldhY3pwb1NseFBFajgyMmNOV2twUzdGeXpzRHJxcGZncEczamFodzJ2Z2JhU1FBeHVMV1pZdDdKenlOZThKb1pwTkFjdkRGT2R3MHdxWVQ5QUsxclp6L0RkYlNsTFBwMHJ5SXhnUUpsSzlBWmxFcTdJT1hwb2hnOVBJaHJDbmc4OEpzT3hpVjRaV0FZZmc0c2lreC84a3kyWjlsODYydXF3cmZzY0lIOCt1Z1RtVkd5aWRkZVZZVWdFTW40R1p6ZzE0RXdJc2g5c3gyY0tLaVdYUmV1T0U1Z3pHT1FnZGxSS1ZWZGxldnFiMjc5WHEwUW5zdHMyVkRhQk8wY29lenNydVd0SEFwdTZzS0c0SUJoTjBhR1Uya0xyTUtHUlROM0htYkNEd0tWMTR6dmtNRURHNFFmWlZzcFZsYU5VMm1oYzVURVozTjFoL3pxVGhldUxwVzA1WldUR1ZqYjNkYm5ObXhLWkJuTjhKcWlkYVZMS0FPeUFSTkxTK01CNTRaMitWYXFvTUxLcm9WQmxuZ2VmblRQQWNvSE5XQ1N2bGZBOENJMEhFbUJOQm5CbFh5TXJ6VTdBN1dWbTk0UFBxUTJnbXFLeCtXREdzbnZpbG1jU09CSnFPSzFuWXlBSXp1QXllc3EzVWRTSzNLZldjWUtEOTVIbWZZT1UzcXNlcjJDdFlFVUErRnBmcWROdmdQQlpVQmhEckdPTlJWbFFzaDhyTGNhVUN5a0hHME9PVXdUbExCcnNoNXNvRU1HZXppMUU0SFJWdDFpY3A1d1pFRlhkaWJDa0c4WTh2WDc1c2JPNEUwaW9tOXoraGpTaU9meTNEaHBYSXRwVmhFK1VHUWR2b1dqdENobXJHSGY0WUF6S2dCTm5HdHVKeEZDZUdkaFVBZlFMTEs4a0JZQVA2Z3ZGSlphak1HM1hreWN5OEt1QzBxNEV5eW13dHdkeGR2Mk0wbUlCdEswTEtuZjY0MGowMEF1cTRnVWtkV0dsaHMyMnFKYzZkWkNzTDE5b3hubFRKRzRTWVZSSUdwRDhUUEZCdU02T0VsYlMxcGxkaWQ0bUdBeU42Wkl1cGJDNWJYSk45ZmRwYlRoU3hMVWFJOElHMVhJWUJ4VzNUanM2S1Fvc0tjeGZ4Y1FtZG53UkdNMTBHbkZjQ3kyWFl1bkxNeUFrZGdrNG1lUGljenNMeWd0aGNCdXQ2Z29PcVM3WVZGWEFETGphb3NCNnM2b2ZjWldBWlNJUllxU1VraXpZd3R0WWFiM3ZVT1E5dzJIUnhJSWc4V3dSVmVFNjh4aTRVdEwzelJwaHhwbHp3dVpyY3FZQ3ExSTNqUEk1ZG5KSXlnRW9oTWJQcVZKU3pyd3p4QkpUczV6TitSZVVTZ3hpa1BRVkYzSlZCZU5ReGJIRU5yRU1OdkVkRlpWVjlsSDkrT1JHRXNOWlFweVROYzRDM0FHN1hGNG5nenErRHJPMnpidWFhT1hnZGFGY2RrRW90b1NGQlZYMnFKMEM4T1daZUc0S0dscGdoQTBYZlRPUENxVjJxcXdRMjZRV2ZGMlBNTGhJMncxbFZBYTJhUHNZZDB6YTI1TVFSd2djWk42dVFEQ2krWnhpRDRYRU0ya1p4T1Q0MUZuWm5hUmxjcFpvdXpsUnFxZGJRVldvcFFvU0I1OFJWNTBsQk5ySGkvQXdYUzVMcndEVmxwWTNGYzNCeWlZR2M1MlRyaXN0NmtPWGR3SW5BUXRKcHA1UWNoeWFxdVlPVjdTdStmeFZNYVYzZGMwUkUyUzZtVVkwZ0x0MnBNY1lxcktJUTl3MmwxZ3BRVU10UVljbW1idDVEVE54ZGhuVUNqUXF0Yks5U1VTenZyQzBtbWhoRTFlMkZTMitveHlweS9aQVN1dGttdGp4M3ZjQkMyNFBYNjVuYnFrQkNSaGZqUzlrSVlQbmVlOGNNYWdWT2hJLzNUMWZBbWR0QVdac0Nzd1RKQ2tRVk5hMHFXS1NLUE9wSEFVaEQ5RHJiVmN5b1lrd3FodmgxN3ZZQWF5WExReUtHWWR4bFVERnA0OTRyQlhSallnTzE3RERZZXROSVVqL2V6cDZTMGxubHBFd3NXbUpNa093c0tYZVpLRUFqSUhuMEVRSklTYVJCY082VU1JTno3cC9iRWpqbnc0ZnQreG1EdmtzeFg0RzJySXJpczdxYWVLd0FGTVAyT2k3bjRjcml1Wnd0cFNVd3BmTHhTbk9SU3JJcXVzYzVaRmFYeXNxUldqaVoyRHlBV0VJTDM1dFZTb1FFbEZBQ2pPZUdHU0U3QUhFUWdkby9MU3ZDT2dHQnZreHNtRGJ2bFMzRnA1dmhhQjJUQUdxUktyS0tNcmhMVnBhR3pFVmpaME9ReERoYUNUQStReVJSMWQxNWFRenJKbnRMM1JpYnNpcGpHNmpsZ0w0eXFiUzBzTllnMWU4NHZoYkJWckVsSzY0Q1VjV1lYRGZLeGhwSXV4aVZKWlV4c2JNeS91UkJLVE5SUTRrUTNMZFJZTFMwckpqUlBsVFBxWTZnZEpzRURjK2FRWEFuK0hnc05VQ2JSdUYwT2owenduQTdiV0RrYmhPNUVuczAwcWVRaFMxbGFCTWw1TS9jQWF4c0xGOHJLeXFsK1RmN0VMTEVHdS9peGlpbWRDdm8wVGpmcGpLd2FnZ2VuNGVoNXY3TG9rTEtiTHV5dkhoY1pHOGRoR3JFRHg3SGc5M1pwcEpGN3FCcU8zaVZ2ZVhFRFFOSW56ZW9lOFlxNmVQYVpCWjJKdmlNM1cyVUFHb3Rla1JDQUdxNEVrRjFYM0RPblIxMXlSc0JMMXRSYTBQVmNaaU5GWFoyYzM0RnNrdm9tSW5RUTZsenBKb1piSnhrNDNOd0tKRkJxdUpTc3JCeUh5ZHhLT25UeFFBU0JtUzNqK0pNbnNIU2xhM0VjNks5VldvSlZuOXpmandPTTdocVlBQXFKUXdFMmEzbkE0OEoyUUdlZ1JrcFpOaXZTWSt5czNFa0tkNG9KSXdzdklIbDNjV2dMdDVrNE5INk9tdExXZHB1ck9rd0VNdXBZYzdlTXREUmhPY0kydWk1SmhWSXpYekx5dG8vR0FQdVpveW84d2tvZHVWZ0pnbEN0N09oR2JnSUQ0TXE0c2krNjN6VVMxRnVGRlhGbHF5YWoyZW1IbExNY0JxWXUwRk11UjI4QmJCN2xPeFJNU2lDUVhGaENLdXdraForcFlEaUdTZ2JzS0tWOE1pU1JzdUhTSVdNOXJrbFJpSWxaWnVxWGpzUUs4b29ZSk1ncTNKS1dWa2hIYmhzVnhGVXp0aE9XUGtZaWpjYng1NElLc1NkVCt1THIzY3JHS3lvWWdGaUdSOWlCazRrZmxvVVgrSklsUVJRcWFibXBnbmhxdHBRcGI2UlZRMVdINURuclM0aEVvR1pxYWVyUTJkaEZiejhYZVB4U2htRGJvNzBlSVNqb29yTzJ2SzhTSlhJNFNVbUVVNHpXS0R6VUR0V1RZdzd4WGxiU1RFajRGUmc3ektuS29HUkFMdjBHczlUZ2MxQnBDeXdHWlJRQXRxVnoyeHJCY0FNekVwZlp3RlNhMkc1VzBRQkZqU01hcFdBRUZhM0hjR043Q3hEekVDeUlrSjk3cXdycVdOVFdWbzg3NlBQc2pQa2oyd3Zncm9NNWxMWktNRVRLVnFsL0N2bldWRmlGYS9TekpVUXdrb1pzcjY3WTZ2bFNSVjMvMnRtTlRPWTN2bmF4WXdNdW9QS3FkelIxdzdJcUh5bWxQeGFBVGhmVTdLbzJaWFlqNEFZSkhMK2tOZEt3UlFZRVNUUmE1ZnNVWi9yVkMxVE1UeVdWeVlvcU50dXphSHNNeXYydHZvYXJ4ZGZxd1lnVTFheEZvL2NucWwxRkdzcUsrdUFST1Y4Qlg0R1U4V2NaVEFUaTJxN1FjeWkwTzBWK0doV0JNTlJVa244SDFTc1dWRTVCeTNHaTBFQ3FVZUpvQmZBdERhNGFta2RYRzM3QUdQNUdnZWI4NHA3VWF6cG9LUnpkRnplUThIa29IR3hwckt5L0hwbTV0MTJwNDdKNnhUWURFejd1SU5FWFN1eFlYdkZza1lBYyt5U3hIOXNmNWZ0S3pVNklid1ZCY1VHZzVlNUZNQ0VYU0VyWlIwd0dheVYxOXdvTTlndVBqVHFKZFZUcVI0dUU0bkpuTGxkV1ZrRUNDWkxkMlZMRit4dGFtZXg3SXBpcmlTRFVwdnJwbjlscndHTUNIeXBwTUgrcHM2TElMc3VGR1VqMVhFT1hpcWJxU0hQVUtuQ2xwV1Y2OGtxdFVSVk5EWTRUTmFvY3lrb1llVFU1bmdHRVFhL1MxRG5uRTRBZVhNY0tqSFBBbUZWakNCRU5hZXlMVk5IZnIzcHg4eFVzdEo5NGhJcGZINEhLRS9lRGFBcks2bFN5VlZGYmR0MWd4VElWazNwcHBWbEZYaTRwRWhWQlRPYnF1b2hVODVNTFhuMWlhaHZVa0hKalNDTWMwMXRMRnZlVlZCeDBEb2RNNmpmdEN1N0RPdEl6WXhyYzBxcDFKR1AyYXlZRnoyR2I2SHZNck84Y25HdFY2R2ptM3VJbVNmRDJHcFdLNnVvd2JaR014RktRQ28xcE9NdGNNWEZwUnN0K2hYR29Bb21GM3NTVEJHZ1RnbGJCS1d3c1EzdFpxYVlTcDBaMUNpbVJEV0ZjQ0pVUFlKMDBCSTVGa0tZTm9pZnVReG1OODhTV1ZYV0xNYVVxcXFnQzBCbVFKUjZzazN1OU5DZjZqWUxYeEFmcXNZRWdWTEFoUlkyQXRndGZsWk5GbUZ5aHhkckxrQWRXbGs0RDg4TTJpeEh5ZXBJZGhNSHJHL2lSMVpHdHEwTUdwYkRiUlBZT1hlU1kxTTZOeTRac3R2R1NrdEsrWGJGUEFUajJEMzcxc2FQRXNBTVhoWHJzWjBrbS9YU3RraGhNeUJmc2E2dVhGWmUyVkNlK1lNcjErR0tnd3JReU5ZcTFWUnJCK0VpekFvdzZOc2ROS2N5VkVrWWVNNzN5czZxNGtBSHA2QmlGa2xUa0lyVkM1b1lWN3V6d09HQ3o0VUowU3RxMmxXTUp5NHd0YitSZXRMNnRaRmljbkptQnc1VWpDdlhYTVpWSlgyTVFrYmYrWE41RVdkNzhWejgvSkVzTVpUQmlLTnpzbTFpbkxSVVE3NEg0TmlkYXFJNjhqNXNBRmd4Y1J2ZUM3aWVMSlhmUVl4alpaMkNzaVdGZXdaWEptQklsWjF0ZHRyWDRoU3VhdGVLc28vUlpPdE9LVzJubXExb1R6ZUs2ZFJXQVd1Mk5SVmI0aHEwU1htMUd2dHVnSHJicjVJWHFtU2t0ZzVDdURFMk1TbFB3c1k1a05FMldwM0FxaVpiV1ZMQXhpQkYrMmlCWmJ1Tmo2TUI2cnNNTEM3Rnlhc2FZRHlvN0trb1B5RXR3M3BFTVhmUHZ4QUppMmpBUVFnanJ6MHJMSVpTV1psSW9OaHdkNXhLNEFSOW1ZTmpXQWFMcm51SW1KZUJWTjl6Qk9ST2JWdmJyK21UVGZGU0VKTFNSbkhvN2hFSm9JaThNRnFqeG12Z21GNVVSWno0ekxGZ1paOEN0dTJYN2dnVmNjS205Z1Z4SXNPSHF4WGdOTUtuRldaWW5mMWRCbk9oYXlYcTE3UXdGbFdXMDllTkt5VkpGbVhxYU9OR0E1YUNlZ01iSjNVVWtHWTFpYzNuS1dnanE4cWZWWUdRRzFnUnQ2cnM2MmE2SGlxcVVPcWRlc0s1Tm1YNG5Hb2ZKb2lFMWQwZEY5bFZWa3ZUMS9rRUVhYUNvWU93RnBjVmNvTE0rNzY2OVB4QzlyV3FrdEgwc1dVWWxkMFZDcHVCWi9zdFZSY0dneTlXWDIrVTFRdGhpOVN6QXFTeHpac3krT2lGekJZbnlTR1Y2R2t1NDRyRDhCQ09aQlYzQnZENStBS1JITndNRXNCNkV6SG5KcGtUQWVpVWxFR2tjRUNlQjZHRFpUcDVZRUpUbHZkcmtueFlqVGxsTWtmTnRYd0RqTTd1VmpLNUpYVVVuNDNycnFwSzJqeXRheEhXME01RzhEQzhydEhNWXM3S1NnZHVWUU1HVFlGcUZ2VlM2cmtEM3NESjQ2YWZkWUZ3b3ExMUFPS0NCTGh2d29VZ2M4SUdBTnljUjZrblpyZEpQZHN1eG55amZkM0ZvdlRsUk1kRWR0T2w1Q01WNUVIc1hRQmlzN1RPd3ZJRFphR2oyVm5wYmg3Y3BLNjNWd1lFTUx3cWJqenlsNjk5c2F3RkZrRjF5cWpVVTMxSGZDNnNXMVpGVkZ1WFZYVmd6OWtlRWF3MHlzMWxXZm0rYXpRQVFTV0EraEtZVmZzWmpQbmNBY1VCOW9JYXl5L1VaWFJOY2tER2ppNzdHc1didkJvNnRQcldQcU95VmtCVXErSU5lcXB6TmRZcy91MGlmaDVxbXBxSVcrMzNKVlNVY3dZNzBLTDRVOWxZZFU2bGp0U2xzN2xtZmk5ZzNZemVRZlZrYUdGYVYzT0RDbmFEMk44d3NFREZrbEUzUnpNM1pnaGRZa1dIc3N6cTcwRkllY25La1ZrdDhlek16UnE5YmtHdUtvalJMQlZTb2QzWTF5UHFLZ1lXN0pSUVRQVnl5NXhJWUxqT2d4Z1Q1MlJLSlVZMWRPcklpUmQ0ZnV0UXgvQTVBY1NtRWp6MHZGV3JrTHp2YldBdTlIT1diR2d4RmsxVk5UcG5CS2s2VGd3aXNJL0hjeFlYUDF1QVdPNzJVTEZsQlRxK2FTdTJWVFVzNmhyeE0yQ0YraEVvcjFWSUE5Wm1GVWFhYjFsU1NnWnNWczRzeHpIbFZMb0pIcjlINERoT05Ua0kxWEMwL3dpWTJOb1dBRzVSbG5IRm5xNm9MY2NwUWRkTXVKL08xN0pWQTVPSExpMEJxQ3p0cTdZMSsrdWNDZDk4cUxJOE1JSEJWL2NLanhRVG1lM2hGQlMzTXlDcW5Ec3V5bTJvODBIanZGRlR0clVSbU5hR0pzbVZhaEltalRzVVhLdFFaVEFWczdNdnY4LytmelVyWkFYY0xKNk00a29lNlhQMGI2U21XV05EenlVcFE4YmwrTHRXeDR0dXFaMzZjUllWM3l1VnhQTnd2SWlxaVFDU211N3NyZ1R6UjZua3locENhclh3RnkxdkdkNWlQMmNZMDZsRnI1TmpoaGcxWTYrTkIyOGZ0Yks4M3M4cmY3a0xKYkt3REZQYkxnMjVhMEFkWkpFaXFyNXBoaXhLTURsUlV0Y3NzcTFocmlMcUdvSCt6ZU5nVm05T2VtanNFVFY4SmRGME5IbmtJRnhXWTFPQjRZcnA3cnRXSjdOZ0FBQVBYa2xFUVZRM29OczVucGx5VmY4dTJGb0x1MUpySHZlYVpXUWpxQWtzaHRGYTJnenNTRzNacGtidmczSGFmRjlzbFBQbGxkakZsSzgwR3lzbThNcjRNUGhuZU5XRU5QR2pBSXBtaWxUUEFUZFRSVFhsQ0JZSFlBUXVQd0EzNnhJcFd0R040cTNZMk1oaUdzVXB1U1NubEVKUkQ4UG9yQzdDRllWdytGNTFxVGhnYWJ4c1R4V3pDR1kwWlNzYjNsZnFBeTBPUE5qTnk4eGlRUUtzSFlGUTJIQlpWdlZiQnVxM20xb1dLYWpxYW9uc002dVpVcjZDalhXTlowbDVFM2gzalVSbWE2a1AzTUpJaXkxTG0ra2FoUXE0MU4yaVpqYTVzanRsTFlOWkhackg2cVVHbTR2TWJEcDZSdzJDRm12dXlGa3JCY0N5TXRGcUJhRUNtc0hvSzlCWjJMQS9sSmNScVNhRHFuYVdiclpkR2F6M0RMZ0l2QmxuNHdvR3p0YnlKR3FzbHd4a2hoSHJUalRZRlhDdE9vS1M4dUxkb2ZWZEFiT3lsR1U2bmxZcFhXWnRzNG5YQnE2V3hKaXRNTm9rSFVKbmJuSnBsUW0rYUdwWTJhNUdNVjJRRDFoUnViQlBGS2R1bWY1T0hrTEh6MEY5bHVFNWtqQmpSYTBuRkU1Q1VHcUh3MzJNbWpaNnhrZ0lOVm5TbloxVlpTdEsycUtsUmFMbFFnSzd1VHE3SkZYSndNKzNTT0VLeWhaTkkrdEowSTVxTVl5OWsycUpEN2RWV2RxS1hhMENLTlIwQ2NqZytCMklZdTJmY0JaSlprTUZnTTExcjBYOTJ3aWxnaEZHZ3pWbmV4bHFCN3hMOW1TMjlTaVlVVlkyblhPWmpOQlJzeURzUVBSV1c1aHJaNFhjZEM0SFZXUmJqZ0pyNHNGb2ZLNVN6alE3cmhJMVVlYmRQZEViajZzcUl2VFpRWjV2YTA4ckFCc0FXMFV4ZVd5dEFrN0EyS0o5WnB4ekNpb0IyNFhGdFlBZVhZeHI2YW5TcWhMZ3BwRXFXYkd3THVuVGdyVitJaldsTDI5bGphQWw0RVFNR3NFcnA0YXBlWmlxdXdSWExYQXFPQ2VydTMybW15ZGM2b1dUU1dwRkFHZHplVEI4UlRIVk1FdGxNOTBDYmJRQ1loUGpxM2VnWXIxRkdkWUlRaml1REdaNXpaL0F6b2JLR095THh0aTZjNFJ3dHYyYW55V2xMSUNubExoeEpSWHQ2QTVlYkRCV0ZOT05ieFdaMmQwMm1udTRTOVlFQ3BlcHBWMXpTV1JCV3hIWXpWSXYxQ1hTb3V3cXFYM2pCQkJEWmRZUWJwVFFXNFpRbFM4cjVrSDRzdVNSbWcyKyszSk4xMHgxUGFBbUVrbXRZbEVkZUdwSkVNNmtPdUNxQ1IyMm9TdWpqNUlWMkhkVDB6ajVwckxLVGpYRkFQamRRbHlxN3hJQnhBUVA1eU1jekc0VnhBS3cwbjZpbFoyUUJjZTJwTHVsa3V4eHFub0l6RmZncXlxamlsOVMxVk53QnJGbWV5ZW9wczh5T2paVXliWmRmUzhDdWFUSUp1bXpzNXRPRGFOdExwRkRRL1BjSkd3ZUxobWVMMW5CMEtxaVVEU2NzaVVWRDg5RGkzSHRyS3RTVUx3M1JMaXlnWkQrN3NGOEpUT2JnWXNyR3ZETlVGUkdsMWl5MExsMVlrVWMyYUpZTW9nOTIwSThxVzZZRENnMU1xazBKSEpGS1hrYmdiUnJlSStxcFlOT1pIclZjRFViYTdwanNwaFNKTnRLNnVwZ1JOQVZvT1MwbXVnQmVONGJJWmdIaHVQWi9zMUVOYVg2S3NWcitZTnJoMU5iN2lwUjBQRTV6Yk5SZWdDYnJIUlV3NllmMDdkTEJKbDFmOEtCOWFzMlYxbk5xQXNsNjJMQkJoZWh3YWxlcmtIbUIxSkZJRVpLU0V1c2RsNUpRajFuSmxIWFNDRjM0MmdKOUNZR3JYZWxrbkpJWHFWUDhzRCtxdHBsQ1IzWEgycWZLcTB5Z01wK0tuVmtLeE5sWjhtMllrSWxWTWlDblhVd2w3cXpuQktTdlF6M20zUHQ2b1FiWE81YjVGaXhDaC9mSHhVUVcvQUVjSzZ6Q05xS1FuTDlzeXdxbUt1d3ZxU1l6VC9hUFZOTnBWeWh2UlcyMWFxY2lDc2pkV3ZCd0lMVXZoNVZ5Q3piV29DMXBKako2ODBDV3NsK3VkS0I2VDVSd0cxbWxvaG5scGJnNDdpejVVOWhhMEZHdG1STEZZQnRPOTl5OTdBcDB6K1pEVEFvZzZrU0xac01IZy9JRmtrZ3A2Q3B2VTJVMGNZVlNkbm1randCZE9tWGJ4VFdOV3p1SWJpcE1pb1Z4RWNrWkVvYWhTT2l5Mk0zSzBqY0MxTGhWRHdhcUcwWnZrY1dxQ25yRzRHSXh5a3JxbGJXZHc2TFF5QmFaUjhIbUxSSWhRV3NIc3dENDJaWFZMTmtmOWwrRmxXMEhWUTJsd0ZzQy9aMUZkemxRUjBLYVBmbytGZGZ1Ky9kd1ZSSUN1MUNHUjdBRUlpQWhjK0FaVUYwa09CYVB4bVVxZzRpNjR2UW5VNG5GRFlKOU56KzFmVlh2ZUg5cW1yK2tQSUx4OG9LY1JWL0JGYnhiRTBKTVQwa1NENHc2TC9sTlk4b2NzcWFnVmRVM0EzTWp4aHhjR3VxenNQSDRpcnBhb3cxcTZPeXJWanZwOU5wYzU5RTkxTGxkYm9ZVnpKV2RpbVdmQVcyU05FS2NEYVgyRm1CTExBL3VLeGxtaGg2MTNJczFVUlFBcGJLZnR0d3hMMDJxNk9ueDVwUXhTYlBvakFnK3Y1aEFuTjZMSFZSRFhJc3ZLdFJqaVMwcUpVeVpUQVhWYkFLODJFbEZKV2FRZFZvcVVDMVVudDdCVmFUUXVkTTZTdXFleGpRSk40KzBpY2F4di91dGJLdjgzRVRiVDhIOGdqY09LeE9KbWJVYTZPT1ZYaHQzZEZZNnJIdjlYb056RkxjZUVBMW84K3BLbTBMQUhQSFoycllLakZxMGhmWkZpeHNxSEpnRDNlRDVuK1Uwa2IxbUZqWGtuMmx2TVNTT3NORS9DZElBS0YwU3l0cTZ1ck9IVU41Z3dnNEdab3NnYm1nZ001dWNyYTJxclMySWcxY2JpQkJjeFl6Z3pVRE5MQ3ZMOEdiWlhOcDZPUnkzTG1TK0trODN6UklBSzZBMWlvS2EySTlOYXBJdWlVRmRmQzk3NjZQRlpVdHFVcjZLYldrK3paVTFhL1pySVhFenRyalRPZno3aHdLemlDZVhJYXJhSHRiWklNeisycEdnYXpDbXc0cVdBRnZFZGhvZFlwMFhxMHBWN0cxWVdZV2JPNHFoR3E0MitaOEJZdHJMV3ZsdU5QcFpBZWFGRlMxdnViUGdiZ3hzcWNwbkFhc3pCb3ZLYUZvRFE4Qkd0amZVT2w0TkFHMm5tUVYwNGZlSmd1bXZYMmZzclFFV1pnaEwwSm5WZFlrbjNET1pJZVJOODZScVBXQ21zdkdWcUVNUm53eFFBeHdTOEVNWW8zSXptWTIrQkNjTHA0TUtpdXl1aEltYW1sYlpGY05vTmw3dHArUkhkMThaalFJUkt5WGRGUmhOOTgvaHlLcXdYV05vN08xd2lhWG9ITjEwOFJFWlpXRXE2Z3JuSWZqemVnOGpkUmYxWEVMNGtrWGE1YkJqS3hvS2FsakJqZUhsVnhRNEdheWNwVzRsRE9BS3RuVHhIQXRPZnpPdFp3SEFNN3NxVlhrVjZ5dTZrYXAxbkhrWEtxV0YvNFhIcWplbk5LcUJqcFIzbDFjaDNFamcxK0VzZ2RRaHNkRzBCNEZNOXNXQVZXcHVBeWl3VFBsZVp4dDlWeVpWUzJxWGZSZVdxVEFpbHByOUFwb1dUanh5bWl0N053VjRKVHJpWnlPQTlCMGs3SEZmVUxvdXJtS1lIVm5SUXZxR0w1SE1IZHFGY1IycVdwbWNLNmVUd3gyZGlwV3J2aURpbHIrZktXcTNPV1JXZEhLd0E0ZXU4d2pjaGJlUnpGaWxxampaTjN1ZkNwZmtKMC9zY1ZwbllrNkwwUEk3N2x4ZFdDWjg3V2lXbTdCL0FHcXVRU251akdLc0I4Q0ptaUpxOHExcEtJVld5cU9pVEs2NnIxOEJOOHI3NC9BRTcxZmRDM3lQUzJNeGRPcG5FMXRsVnhEOUptVk9vZ2dOK3I0UGpBWFZGUGEzRWc1alZKR0ZWVUdOb2xIMjBHVnJVQjdCT3lTV3E2V3FZUWRXUjkycGNGTVlNd2NrYlNnQ0tDcUQ2N0RpaVd1MWc4TVFDOUJ5ZmNGcVcxTCtqTDcxNHFOQ3V6bm9TeHQwZGEyZ3RXTjFHOEYwQkswTk4wbnVpbWVsVUY5ZElkQWZqTzQ0VVQzQ2pRTG9VZUxISkZUTzNnbXBSdUlJT3Z3QlFDYnFOZW8zcXRaOWlGNnhWSzEzR1JsbzR6cWltcStDR2RUaVIxdVJZOG9xZ0UwMmhaQmE3OWtaWFBNcXV4UkhLbGEyc2FaV040bVJxWlVqMHZMQ0toa2pLbnFPUUhOdVNaVkpvS3ZBcVMxd3BFcXV2V0RDMUIyeXB3ckNQc1JNRVBWVE9ETUxKTUR2NnFlS1h3aTJKWVY1U3E0cUt5dmdHc0hDTGl1ajJqUjU5VjhnTXFTSjJGSlpSWEVIVlJIajNzRlByY3Q2T3BxbFcxR3BhdFFkdDBHdndmTTZuNjNJbnNHVkZoSkdhQnFncXFJVjZJc1hsbFpneVNQcTRSM2JudDN3aTVjditjTjJ5cVFMVzFUOTVLWVZzV1d0S2s0Y0I5VzUzV1FRZmxRWVI2V2w0SGFKWmp2VkUwRDV5dnErUktnWkNzNXFkQkVQNXNEOTRjQXZRTGxTZ05hU01BdEh4ODhCdU5RNDF6ZEZzWDMwektiY3MwTUxEL2loa3BRemwwd2lUcUtMVGZiS21DbXlZSUNuSzBJYmFpZUM0Q0c5aVN5TFE3Y0lNR1F3YXU2VEtvcTYwQXBsM1dONDBMWnBjYTFDS0tLOVZReXlJRW44dzBGOEY2Q0wyaDhvM2l4R3dDN3M3RVd6Q09xbWNBcFl4WUQ0anNBelZTMHNsMnQ5OHBBN3ZyS29waENWU29uYllwZ0g2bXZTbjI0cFRCVjRzZHRWM0J0TXE1azgyeStJQUR2VUowdUFsa0NWVHhJYVBtK1VOdS9xa1Y0RjFUekhYQ0dyWElBcUl0Qkt5cHFLOTlWdEFPVnM2NE80T2JYN3BITFZDcFlIY1Jtd3ZMUjdUdllBS0JCTjU4TEdWekR1RnoraFFiV2duY1F5Q1pBaytWYnNQU291ZjkzMjYxaVpnbWZDcHdSYkF2cW1TcXJpVTJQd2hqYW9PeVlxdEllZ1ZYVmlUc215dGE2Ykd5U3BZM2d5UnJwSXlBZWFXRER4dHBzWHdLeWFsTURLTlA3WUJYTXFFc2tVc2kydUM4Rk5BUHhBS1RWZlQxbzZWek0wRTBqRisxcldjVXVIdmR5Zzd2Z29GcGxYOEhwdkhwTUNPTVJVUEh6WmtJbnNxbEZLTlgvRUlPNTJFMFN4U3pPd29iMlZtUkxXNUQxWElVMHJiZ00xQXpXZ3lDN2ZlOEc3eFVBSy90YUVCYXQ3bHVxdHlQN0Vtc2FKUU9qNUYrbXJuWmZDdVlDZkJVQVd3U2h5ZDZwTVkvdkFIRzFVcU9ZcGJJL2d5NVQwQ01LbStVTzNnRnVDODVkZ2ZEVmVndVBEZklUcklCTHNMcmNnZGgzQ0ZnRlpqYUtKNEl2M0Y4QU5FcXZ1eFIxdFZLT2dMb0NhMWp4Ym9CQWtqNnY3ai9pY0ZiQTdmNHJmUm5RRExSVmlHMTNpMHZxQlFyWVZxQmJBRFpUMFpwaUhvU3p2UXBvcEtJRlMzc0UxSGZCV2xIWGQwSDdMbkFycXZvdWdNdGxqSEJnWm5oM0Vvei9CS2pMTUw0WjJBcTAraEVKcjlqYVZVQmJ2TnpDSVVpcm9DN0FXbW1GdzRvNUFLM010QjVWeXBaTVNGZ3MwNUp5R1Z3bHdCcXNFR0FBYTJaVTFDalVleFhHc0U0cktyaWlsQnZGek9LS28zQXVBcm9FNlFGUVUzdThZcE5Yd1M1aysxVFp0NVVyd291TjRLaVVFdytrM1pXRHAxUlhITlJxWGIyMVRzMzk5NDV5WlNnM1ZuWkZOUTlDRjNYZVp5cjVEZ0JYS2l3Q01hMk14ZVREWVhnUDFGc2Y5UU5LWmMwazgxUkprM3I2RVEzckNtQlZ5TEw3NUVqWjFwSVZESG9GdGlPQUhvQjBCZFRWeWxxQnNLS0tTK0FlQlhKVkxZK0NYQVN1R3ZPL0F1cTdHdUVqRGZHS2cxb0thMXovZG1taTlJOVNVR05obDBBdGZ1bEhBYXdvWXJuU2ttTlhBVnVHRWhyRVZYdlVGK0E1Q3QyUHFOT2pEZXR5bmE0Q21lVW9sbWVYTE40QXE3QzVTajEwUTd5amdsK3Q2Q054U1JIbUk1WCtDcHdyZVlCM1FmZHFuYTRxMjFLZEJ1YzRHb1pzbjQ5Wk9PaVZpbndIcUs5V3pqdmdld2VFaDJBVTUrdnR4WjlDZDlXcWtoNDlWMThFNW9qNnZWeW4wUlN0QXlHSU81ZWRYUktkNUIwVkdWWHEyeXIzeFlwKzVVdCtDNFFKNFAxTjMzOXBRTWpSZWpqNHZiL0RjcjZyUWMzTy8wcmptdFpwZVlDQmlDSGZDZW1SYk5oYksvcE5VUGMzd2ZLeTVmMkQ3T2xMMy91UGh2ZS9vVTRUMEY4ZitWTk0ydnlvaXYwaksrS0hRZmRIcSswYm5jejRvejczLytZNkxiS3cxby81QjdlT2YxUmwvMGR1OUI5dG4vOWJ2cmYvait2MGg2dHRuMnRwL3IvNDgxOXk0L3p2NTM5MXV2enpmd0RpZno2cGhUMU1QZ0FBQUFCSlJVNUVya0pnZ2c9PSIpO2JhY2tncm91bmQtc2l6ZToxMDAlIDEwMCU7Ym9yZGVyOm5vbmU7Y3Vyc29yOnBvaW50ZXI7ZGlyZWN0aW9uOmx0cjtoZWlnaHQ6MTMwcHg7dG91Y2gtYWN0aW9uOm1hbmlwdWxhdGlvbjt3aWR0aDoxMDAlfS5jb2xvci1waWNrZXIgLmNwLWFkZC1jb2xvci1idXR0b24tY2xhc3N7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtib3JkZXI6MDtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmlubGluZTttYXJnaW46M3B4IC0zcHg7cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlfS5jb2xvci1waWNrZXIgLmNwLWFkZC1jb2xvci1idXR0b24tY2xhc3M6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0uY29sb3ItcGlja2VyIC5jcC1hZGQtY29sb3ItYnV0dG9uLWNsYXNzOmRpc2FibGVke2NvbG9yOiM5OTk7Y3Vyc29yOm5vdC1hbGxvd2VkfS5jb2xvci1waWNrZXIgLmNwLWFkZC1jb2xvci1idXR0b24tY2xhc3M6ZGlzYWJsZWQ6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LmNvbG9yLXBpY2tlciAuY3AtcmVtb3ZlLWNvbG9yLWJ1dHRvbi1jbGFzc3tiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXJhZGl1czo1MCU7Ym94LXNoYWRvdzoxcHggMXB4IDVweCAjMzMzO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjEwcHg7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6LTVweDt0ZXh0LWFsaWduOmNlbnRlcjt0b3A6LTVweDt3aWR0aDoxMHB4fS5jb2xvci1waWNrZXIgLmNwLXJlbW92ZS1jb2xvci1idXR0b24tY2xhc3M6YmVmb3Jle2JvdHRvbTozLjVweDtjb250ZW50OiJ4IjtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6MTBweDtwb3NpdGlvbjpyZWxhdGl2ZX0nXSxlbmNhcHN1bGF0aW9uOjJ9KSxoMy5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpVZ30se3R5cGU6ZzN9XSxoMy5wcm9wRGVjb3JhdG9ycz17ZGlhbG9nRWxlbWVudDpbe3R5cGU6WmEsYXJnczpbImRpYWxvZ1BvcHVwIix7c3RhdGljOiEwfV19XSxodWVTbGlkZXI6W3t0eXBlOlphLGFyZ3M6WyJodWVTbGlkZXIiLHtzdGF0aWM6ITB9XX1dLGFscGhhU2xpZGVyOlt7dHlwZTpaYSxhcmdzOlsiYWxwaGFTbGlkZXIiLHtzdGF0aWM6ITB9XX1dLGhhbmRsZUVzYzpbe3R5cGU6d3ksYXJnczpbImRvY3VtZW50OmtleXVwLmVzYyIsWyIkZXZlbnQiXV19XSxoYW5kbGVFbnRlcjpbe3R5cGU6d3ksYXJnczpbImRvY3VtZW50OmtleXVwLmVudGVyIixbIiRldmVudCJdXX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGgzLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImNvbG9yLXBpY2tlciIsdGVtcGxhdGU6JzxkaXYgI2RpYWxvZ1BvcHVwIGNsYXNzPSJjb2xvci1waWNrZXIiIFtjbGFzcy5vcGVuXT0ic2hvdyIgW3N0eWxlLmRpc3BsYXldPSIhc2hvdyA/IFwnbm9uZVwnIDogXCdibG9ja1wnIiBbc3R5bGUudmlzaWJpbGl0eV09ImhpZGRlbiA/IFwnaGlkZGVuXCcgOiBcJ3Zpc2libGVcJyIgW3N0eWxlLnRvcC5weF09InRvcCIgW3N0eWxlLmxlZnQucHhdPSJsZWZ0IiBbc3R5bGUucG9zaXRpb25dPSJwb3NpdGlvbiIgW3N0eWxlLmhlaWdodC5weF09ImNwSGVpZ2h0IiBbc3R5bGUud2lkdGgucHhdPSJjcFdpZHRoIiAoY2xpY2spPSIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkiPlxuICA8ZGl2ICpuZ0lmPSJjcERpYWxvZ0Rpc3BsYXk9PVwncG9wdXBcJyIgY2xhc3M9ImFycm93IGFycm93LXt7Y3BVc2VQb3NpdGlvbn19IiBbc3R5bGUudG9wLnB4XT0iYXJyb3dUb3AiPjwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9IihjcENvbG9yTW9kZSB8fMKgMSkgPT09IDEiIGNsYXNzPSJzYXR1cmF0aW9uLWxpZ2h0bmVzcyIgW3NsaWRlcl0gW3JnWF09IjEiIFtyZ1ldPSIxIiBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09Imh1ZVNsaWRlckNvbG9yIiAobmV3VmFsdWUpPSJvbkNvbG9yQ2hhbmdlKCRldmVudCkiIChkcmFnU3RhcnQpPSJvbkRyYWdTdGFydChcJ3NhdHVyYXRpb24tbGlnaHRuZXNzXCcpIiAoZHJhZ0VuZCk9Im9uRHJhZ0VuZChcJ3NhdHVyYXRpb24tbGlnaHRuZXNzXCcpIj5cbiAgICA8ZGl2IGNsYXNzPSJjdXJzb3IiIFtzdHlsZS50b3AucHhdPSJzbGlkZXI/LnYiIFtzdHlsZS5sZWZ0LnB4XT0ic2xpZGVyPy5zIj48L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz0iaHVlLWFscGhhIGJveCI+XG4gICAgPGRpdiBjbGFzcz0ibGVmdCI+XG4gICAgICA8ZGl2IGNsYXNzPSJzZWxlY3RlZC1jb2xvci1iYWNrZ3JvdW5kIj48L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz0ic2VsZWN0ZWQtY29sb3IiIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT0ic2VsZWN0ZWRDb2xvciI+PC9kaXY+XG5cbiAgICAgIDxidXR0b24gKm5nSWY9ImNwQWRkQ29sb3JCdXR0b24iIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Int7Y3BBZGRDb2xvckJ1dHRvbkNsYXNzfX0iIFtkaXNhYmxlZF09ImNwUHJlc2V0Q29sb3JzICYmIGNwUHJlc2V0Q29sb3JzLmxlbmd0aCA+PSBjcE1heFByZXNldENvbG9yc0xlbmd0aCIgKGNsaWNrKT0ib25BZGRQcmVzZXRDb2xvcigkZXZlbnQsIHNlbGVjdGVkQ29sb3IpIj5cbiAgICAgICAge3tjcEFkZENvbG9yQnV0dG9uVGV4dH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9InJpZ2h0Ij5cbiAgICAgIDxkaXYgKm5nSWY9ImNwQWxwaGFDaGFubmVsPT09XCdkaXNhYmxlZFwnIiBzdHlsZT0iaGVpZ2h0OiAxNnB4OyI+PC9kaXY+XG5cbiAgICAgIDxkaXYgI2h1ZVNsaWRlciBjbGFzcz0iaHVlIiBbc2xpZGVyXSBbcmdYXT0iMSIgW3N0eWxlLmRpc3BsYXldPSIoY3BDb2xvck1vZGUgfHzCoDEpID09PSAxID8gXCdibG9ja1wnIDogXCdub25lXCciIChuZXdWYWx1ZSk9Im9uSHVlQ2hhbmdlKCRldmVudCkiIChkcmFnU3RhcnQpPSJvbkRyYWdTdGFydChcJ2h1ZVwnKSIgKGRyYWdFbmQpPSJvbkRyYWdFbmQoXCdodWVcJykiPlxuICAgICAgICA8ZGl2IGNsYXNzPSJjdXJzb3IiIFtzdHlsZS5sZWZ0LnB4XT0ic2xpZGVyPy5oIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICN2YWx1ZVNsaWRlciBjbGFzcz0idmFsdWUiIFtzbGlkZXJdIFtyZ1hdPSIxIiBbc3R5bGUuZGlzcGxheV09IihjcENvbG9yTW9kZSB8fMKgMSkgPT09IDIgPyBcJ2Jsb2NrXCc6IFwnbm9uZVwnIiAobmV3VmFsdWUpPSJvblZhbHVlQ2hhbmdlKCRldmVudCkiIChkcmFnU3RhcnQpPSJvbkRyYWdTdGFydChcJ3ZhbHVlXCcpIiAoZHJhZ0VuZCk9Im9uRHJhZ0VuZChcJ3ZhbHVlXCcpIj5cbiAgICAgICAgPGRpdiBjbGFzcz0iY3Vyc29yIiBbc3R5bGUucmlnaHQucHhdPSJzbGlkZXI/LnYiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgI2FscGhhU2xpZGVyIGNsYXNzPSJhbHBoYSIgW3NsaWRlcl0gW3JnWF09IjEiIFtzdHlsZS5kaXNwbGF5XT0iY3BBbHBoYUNoYW5uZWwgPT09IFwnZGlzYWJsZWRcJyA/IFwnbm9uZVwnIDogXCdibG9ja1wnIiBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09ImFscGhhU2xpZGVyQ29sb3IiIChuZXdWYWx1ZSk9Im9uQWxwaGFDaGFuZ2UoJGV2ZW50KSIgKGRyYWdTdGFydCk9Im9uRHJhZ1N0YXJ0KFwnYWxwaGFcJykiIChkcmFnRW5kKT0ib25EcmFnRW5kKFwnYWxwaGFcJykiPlxuICAgICAgICA8ZGl2IGNsYXNzPSJjdXJzb3IiIFtzdHlsZS5sZWZ0LnB4XT0ic2xpZGVyPy5hIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPSIhY3BEaXNhYmxlSW5wdXQgJiYgKGNwQ29sb3JNb2RlIHx8wqAxKSA9PT0gMSIgY2xhc3M9ImNteWstdGV4dCIgW3N0eWxlLmRpc3BsYXldPSJmb3JtYXQgIT09IDMgPyBcJ25vbmVcJyA6IFwnYmxvY2tcJyI+XG4gICAgPGRpdiBjbGFzcz0iYm94Ij5cbiAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIHBhdHRlcm49IlswLTldKiIgbWluPSIwIiBtYXg9IjEwMCIgW3RleHRdIFtyZ109IjEwMCIgW3ZhbHVlXT0iY215a1RleHQ/LmMiIChrZXl1cC5lbnRlcik9Im9uQWNjZXB0Q29sb3IoJGV2ZW50KSIgKG5ld1ZhbHVlKT0ib25DeWFuSW5wdXQoJGV2ZW50KSIgLz5cbiAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIHBhdHRlcm49IlswLTldKiIgbWluPSIwIiBtYXg9IjEwMCIgW3RleHRdIFtyZ109IjEwMCIgW3ZhbHVlXT0iY215a1RleHQ/Lm0iIChrZXl1cC5lbnRlcik9Im9uQWNjZXB0Q29sb3IoJGV2ZW50KSIgKG5ld1ZhbHVlKT0ib25NYWdlbnRhSW5wdXQoJGV2ZW50KSIgLz5cbiAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIHBhdHRlcm49IlswLTldKiIgbWluPSIwIiBtYXg9IjEwMCIgW3RleHRdIFtyZ109IjEwMCIgW3ZhbHVlXT0iY215a1RleHQ/LnkiIChrZXl1cC5lbnRlcik9Im9uQWNjZXB0Q29sb3IoJGV2ZW50KSIgKG5ld1ZhbHVlKT0ib25ZZWxsb3dJbnB1dCgkZXZlbnQpIiAvPlxuICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgcGF0dGVybj0iWzAtOV0qIiBtaW49IjAiIG1heD0iMTAwIiBbdGV4dF0gW3JnXT0iMTAwIiBbdmFsdWVdPSJjbXlrVGV4dD8uayIgKGtleXVwLmVudGVyKT0ib25BY2NlcHRDb2xvcigkZXZlbnQpIiAobmV3VmFsdWUpPSJvbkJsYWNrSW5wdXQoJGV2ZW50KSIgLz5cbiAgICAgIDxpbnB1dCAqbmdJZj0iY3BBbHBoYUNoYW5uZWwhPT1cJ2Rpc2FibGVkXCciIHR5cGU9Im51bWJlciIgcGF0dGVybj0iWzAtOV0rKFtcXC4sXVswLTldezEsMn0pPyIgbWluPSIwIiBtYXg9IjEiIHN0ZXA9IjAuMSIgW3RleHRdIFtyZ109IjEiIFt2YWx1ZV09ImNteWtUZXh0Py5hIiAoa2V5dXAuZW50ZXIpPSJvbkFjY2VwdENvbG9yKCRldmVudCkiIChuZXdWYWx1ZSk9Im9uQWxwaGFJbnB1dCgkZXZlbnQpIiAvPlxuICAgIDwvZGl2PlxuXG4gICAgIDxkaXYgY2xhc3M9ImJveCI+XG4gICAgICA8ZGl2PkM8L2Rpdj48ZGl2Pk08L2Rpdj48ZGl2Plk8L2Rpdj48ZGl2Pks8L2Rpdj48ZGl2ICpuZ0lmPSJjcEFscGhhQ2hhbm5lbCE9PVwnZGlzYWJsZWRcJyIgPkE8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj0iIWNwRGlzYWJsZUlucHV0ICYmIChjcENvbG9yTW9kZSB8fMKgMSkgPT09IDEgIiBjbGFzcz0iaHNsYS10ZXh0IiBbc3R5bGUuZGlzcGxheV09ImZvcm1hdCAhPT0gMiA/IFwnbm9uZVwnIDogXCdibG9ja1wnIj5cbiAgICA8ZGl2IGNsYXNzPSJib3giPlxuICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgcGF0dGVybj0iWzAtOV0qIiBtaW49IjAiIG1heD0iMzYwIiBbdGV4dF0gW3JnXT0iMzYwIiBbdmFsdWVdPSJoc2xhVGV4dD8uaCIgKGtleXVwLmVudGVyKT0ib25BY2NlcHRDb2xvcigkZXZlbnQpIiAobmV3VmFsdWUpPSJvbkh1ZUlucHV0KCRldmVudCkiIC8+XG4gICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBwYXR0ZXJuPSJbMC05XSoiIG1pbj0iMCIgbWF4PSIxMDAiIFt0ZXh0XSBbcmddPSIxMDAiIFt2YWx1ZV09ImhzbGFUZXh0Py5zIiAoa2V5dXAuZW50ZXIpPSJvbkFjY2VwdENvbG9yKCRldmVudCkiIChuZXdWYWx1ZSk9Im9uU2F0dXJhdGlvbklucHV0KCRldmVudCkiIC8+XG4gICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBwYXR0ZXJuPSJbMC05XSoiIG1pbj0iMCIgbWF4PSIxMDAiIFt0ZXh0XSBbcmddPSIxMDAiIFt2YWx1ZV09ImhzbGFUZXh0Py5sIiAoa2V5dXAuZW50ZXIpPSJvbkFjY2VwdENvbG9yKCRldmVudCkiIChuZXdWYWx1ZSk9Im9uTGlnaHRuZXNzSW5wdXQoJGV2ZW50KSIgLz5cbiAgICAgIDxpbnB1dCAqbmdJZj0iY3BBbHBoYUNoYW5uZWwhPT1cJ2Rpc2FibGVkXCciIHR5cGU9Im51bWJlciIgcGF0dGVybj0iWzAtOV0rKFtcXC4sXVswLTldezEsMn0pPyIgbWluPSIwIiBtYXg9IjEiIHN0ZXA9IjAuMSIgW3RleHRdIFtyZ109IjEiIFt2YWx1ZV09ImhzbGFUZXh0Py5hIiAoa2V5dXAuZW50ZXIpPSJvbkFjY2VwdENvbG9yKCRldmVudCkiIChuZXdWYWx1ZSk9Im9uQWxwaGFJbnB1dCgkZXZlbnQpIiAvPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz0iYm94Ij5cbiAgICAgIDxkaXY+SDwvZGl2PjxkaXY+UzwvZGl2PjxkaXY+TDwvZGl2PjxkaXYgKm5nSWY9ImNwQWxwaGFDaGFubmVsIT09XCdkaXNhYmxlZFwnIj5BPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9IiFjcERpc2FibGVJbnB1dCAmJiAoY3BDb2xvck1vZGUgfHzCoDEpID09PSAxICIgW3N0eWxlLmRpc3BsYXldPSJmb3JtYXQgIT09IDEgPyBcJ25vbmVcJyA6IFwnYmxvY2tcJyIgY2xhc3M9InJnYmEtdGV4dCI+XG4gICAgPGRpdiBjbGFzcz0iYm94Ij5cbiAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIHBhdHRlcm49IlswLTldKiIgbWluPSIwIiBtYXg9IjI1NSIgW3RleHRdIFtyZ109IjI1NSIgW3ZhbHVlXT0icmdiYVRleHQ/LnIiIChrZXl1cC5lbnRlcik9Im9uQWNjZXB0Q29sb3IoJGV2ZW50KSIgKG5ld1ZhbHVlKT0ib25SZWRJbnB1dCgkZXZlbnQpIiAvPlxuICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgcGF0dGVybj0iWzAtOV0qIiBtaW49IjAiIG1heD0iMjU1IiBbdGV4dF0gW3JnXT0iMjU1IiBbdmFsdWVdPSJyZ2JhVGV4dD8uZyIgKGtleXVwLmVudGVyKT0ib25BY2NlcHRDb2xvcigkZXZlbnQpIiAobmV3VmFsdWUpPSJvbkdyZWVuSW5wdXQoJGV2ZW50KSIgLz5cbiAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIHBhdHRlcm49IlswLTldKiIgbWluPSIwIiBtYXg9IjI1NSIgW3RleHRdIFtyZ109IjI1NSIgW3ZhbHVlXT0icmdiYVRleHQ/LmIiIChrZXl1cC5lbnRlcik9Im9uQWNjZXB0Q29sb3IoJGV2ZW50KSIgKG5ld1ZhbHVlKT0ib25CbHVlSW5wdXQoJGV2ZW50KSIgLz5cbiAgICAgIDxpbnB1dCAqbmdJZj0iY3BBbHBoYUNoYW5uZWwhPT1cJ2Rpc2FibGVkXCciIHR5cGU9Im51bWJlciIgcGF0dGVybj0iWzAtOV0rKFtcXC4sXVswLTldezEsMn0pPyIgbWluPSIwIiBtYXg9IjEiIHN0ZXA9IjAuMSIgW3RleHRdIFtyZ109IjEiIFt2YWx1ZV09InJnYmFUZXh0Py5hIiAoa2V5dXAuZW50ZXIpPSJvbkFjY2VwdENvbG9yKCRldmVudCkiIChuZXdWYWx1ZSk9Im9uQWxwaGFJbnB1dCgkZXZlbnQpIiAvPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz0iYm94Ij5cbiAgICAgIDxkaXY+UjwvZGl2PjxkaXY+RzwvZGl2PjxkaXY+QjwvZGl2PjxkaXYgKm5nSWY9ImNwQWxwaGFDaGFubmVsIT09XCdkaXNhYmxlZFwnIiA+QTwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPSIhY3BEaXNhYmxlSW5wdXQgJiYgKGNwQ29sb3JNb2RlIHx8wqAxKSA9PT0gMSIgY2xhc3M9ImhleC10ZXh0IiBbY2xhc3MuaGV4LWFscGhhXT0iY3BBbHBoYUNoYW5uZWw9PT1cJ2ZvcmNlZFwnIlxuICAgIFtzdHlsZS5kaXNwbGF5XT0iZm9ybWF0ICE9PSAwID8gXCdub25lXCcgOiBcJ2Jsb2NrXCciPlxuICAgIDxkaXYgY2xhc3M9ImJveCI+XG4gICAgICA8aW5wdXQgW3RleHRdIFt2YWx1ZV09ImhleFRleHQiIChibHVyKT0ib25IZXhJbnB1dChudWxsKSIgKGtleXVwLmVudGVyKT0ib25BY2NlcHRDb2xvcigkZXZlbnQpIiAobmV3VmFsdWUpPSJvbkhleElucHV0KCRldmVudCkiLz5cbiAgICAgIDxpbnB1dCAqbmdJZj0iY3BBbHBoYUNoYW5uZWw9PT1cJ2ZvcmNlZFwnIiB0eXBlPSJudW1iZXIiIHBhdHRlcm49IlswLTldKyhbXFwuLF1bMC05XXsxLDJ9KT8iIG1pbj0iMCIgbWF4PSIxIiBzdGVwPSIwLjEiIFt0ZXh0XSBbcmddPSIxIiBbdmFsdWVdPSJoZXhBbHBoYSIgKGtleXVwLmVudGVyKT0ib25BY2NlcHRDb2xvcigkZXZlbnQpIiAobmV3VmFsdWUpPSJvbkFscGhhSW5wdXQoJGV2ZW50KSIvPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz0iYm94Ij5cbiAgICAgIDxkaXY+SGV4PC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPSJjcEFscGhhQ2hhbm5lbD09PVwnZm9yY2VkXCciPkE8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj0iIWNwRGlzYWJsZUlucHV0ICYmIChjcENvbG9yTW9kZSB8fMKgMSkgPT09IDIiIGNsYXNzPSJ2YWx1ZS10ZXh0Ij5cbiAgICA8ZGl2IGNsYXNzPSJib3giPlxuICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgcGF0dGVybj0iWzAtOV0qIiBtaW49IjAiIG1heD0iMTAwIiBbdGV4dF0gW3JnXT0iMTAwIiBbdmFsdWVdPSJoc2xhVGV4dD8ubCIgKGtleXVwLmVudGVyKT0ib25BY2NlcHRDb2xvcigkZXZlbnQpIiAobmV3VmFsdWUpPSJvblZhbHVlSW5wdXQoJGV2ZW50KSIgLz5cbiAgICAgIDxpbnB1dCAqbmdJZj0iY3BBbHBoYUNoYW5uZWwhPT1cJ2Rpc2FibGVkXCciIHR5cGU9Im51bWJlciIgcGF0dGVybj0iWzAtOV0rKFtcXC4sXVswLTldezEsMn0pPyIgbWluPSIwIiBtYXg9IjEiIHN0ZXA9IjAuMSIgIFt0ZXh0XSBbcmddPSIxIiBbdmFsdWVdPSJoc2xhVGV4dD8uYSIgKGtleXVwLmVudGVyKT0ib25BY2NlcHRDb2xvcigkZXZlbnQpIiAobmV3VmFsdWUpPSJvbkFscGhhSW5wdXQoJGV2ZW50KSIgLz5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9ImJveCI+XG4gICAgICA8ZGl2PlY8L2Rpdj48ZGl2PkE8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj0iIWNwRGlzYWJsZUlucHV0ICYmIChjcENvbG9yTW9kZSB8fMKgMSkgPT09IDEiIGNsYXNzPSJ0eXBlLXBvbGljeSI+XG4gICAgPHNwYW4gY2xhc3M9InR5cGUtcG9saWN5LWFycm93IiAoY2xpY2spPSJvbkZvcm1hdFRvZ2dsZSgtMSkiPjwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz0idHlwZS1wb2xpY3ktYXJyb3ciIChjbGljayk9Im9uRm9ybWF0VG9nZ2xlKDEpIj48L3NwYW4+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9ImNwUHJlc2V0Q29sb3JzPy5sZW5ndGggfHwgY3BBZGRDb2xvckJ1dHRvbiIgY2xhc3M9InByZXNldC1hcmVhIj5cbiAgICA8aHI+XG5cbiAgICA8ZGl2IGNsYXNzPSJwcmVzZXQtbGFiZWwiPnt7Y3BQcmVzZXRMYWJlbH19PC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPSJjcFByZXNldENvbG9ycz8ubGVuZ3RoIiBjbGFzcz0ie3tjcFByZXNldENvbG9yc0NsYXNzfX0iPlxuICAgICAgPGRpdiAqbmdGb3I9ImxldCBjb2xvciBvZiBjcFByZXNldENvbG9ycyIgY2xhc3M9InByZXNldC1jb2xvciIgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09ImNvbG9yIiAoY2xpY2spPSJzZXRDb2xvckZyb21TdHJpbmcoY29sb3IpIj5cbiAgICAgICAgPHNwYW4gKm5nSWY9ImNwQWRkQ29sb3JCdXR0b24iIGNsYXNzPSJ7e2NwUmVtb3ZlQ29sb3JCdXR0b25DbGFzc319IiAoY2xpY2spPSJvblJlbW92ZVByZXNldENvbG9yKCRldmVudCwgY29sb3IpIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9IiFjcFByZXNldENvbG9ycz8ubGVuZ3RoICYmIGNwQWRkQ29sb3JCdXR0b24iIGNsYXNzPSJ7e2NwUHJlc2V0RW1wdHlNZXNzYWdlQ2xhc3N9fSI+e3tjcFByZXNldEVtcHR5TWVzc2FnZX19PC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9ImNwT0tCdXR0b24gfHwgY3BDYW5jZWxCdXR0b24iIGNsYXNzPSJidXR0b24tYXJlYSI+XG4gICAgPGJ1dHRvbiAqbmdJZj0iY3BDYW5jZWxCdXR0b24iIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Int7Y3BDYW5jZWxCdXR0b25DbGFzc319IiAoY2xpY2spPSJvbkNhbmNlbENvbG9yKCRldmVudCkiPnt7Y3BDYW5jZWxCdXR0b25UZXh0fX08L2J1dHRvbj5cblxuICAgIDxidXR0b24gKm5nSWY9ImNwT0tCdXR0b24iIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Int7Y3BPS0J1dHRvbkNsYXNzfX0iIChjbGljayk9Im9uQWNjZXB0Q29sb3IoJGV2ZW50KSI+e3tjcE9LQnV0dG9uVGV4dH19PC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG4nLGVuY2Fwc3VsYXRpb246SG4uTm9uZSxzdHlsZXM6WycuY29sb3ItcGlja2Vyey1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlcjoxcHggc29saWQgIzc3NztjdXJzb3I6ZGVmYXVsdDtoZWlnaHQ6YXV0bztwb3NpdGlvbjphYnNvbHV0ZTt1c2VyLXNlbGVjdDpub25lO3dpZHRoOjIzMHB4O3otaW5kZXg6MTAwMH0uY29sb3ItcGlja2VyICp7Ym94LXNpemluZzpib3JkZXItYm94O2ZvbnQtc2l6ZToxMXB4O21hcmdpbjowfS5jb2xvci1waWNrZXIgaW5wdXR7Y29sb3I6IzAwMDtmb250LXNpemU6MTNweDtoZWlnaHQ6MjZweDttaW4td2lkdGg6MDt0ZXh0LWFsaWduOmNlbnRlcjt3aWR0aDowfS5jb2xvci1waWNrZXIgaW5wdXQ6LW1vei1zdWJtaXQtaW52YWxpZCwuY29sb3ItcGlja2VyIGlucHV0Oi1tb3otdWktaW52YWxpZCwuY29sb3ItcGlja2VyIGlucHV0OmludmFsaWR7Ym94LXNoYWRvdzpub25lfS5jb2xvci1waWNrZXIgaW5wdXQ6Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sLmNvbG9yLXBpY2tlciBpbnB1dDo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTttYXJnaW46MH0uY29sb3ItcGlja2VyIC5hcnJvd3tib3JkZXItc3R5bGU6c29saWQ7aGVpZ2h0OjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MDt6LWluZGV4Ojk5OTk5OX0uY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy10b3B7Ym9yZGVyLWNvbG9yOiM3NzcgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXdpZHRoOjEwcHggNXB4O2xlZnQ6OHB4fS5jb2xvci1waWNrZXIgLmFycm93LmFycm93LWJvdHRvbXtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgIzc3Nztib3JkZXItd2lkdGg6MTBweCA1cHg7bGVmdDo4cHg7dG9wOi0yMHB4fS5jb2xvci1waWNrZXIgLmFycm93LmFycm93LWxlZnQtdG9wLC5jb2xvci1waWNrZXIgLmFycm93LmFycm93LXRvcC1sZWZ0e2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAjNzc3O2JvcmRlci13aWR0aDo1cHggMTBweDtib3R0b206OHB4O3JpZ2h0Oi0yMXB4fS5jb2xvci1waWNrZXIgLmFycm93LmFycm93LXJpZ2h0LXRvcCwuY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy10b3AtcmlnaHR7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50ICM3NzcgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXdpZHRoOjVweCAxMHB4O2JvdHRvbTo4cHg7bGVmdDotMjBweH0uY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy1ib3R0b20tbGVmdCwuY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy1sZWZ0LC5jb2xvci1waWNrZXIgLmFycm93LmFycm93LWxlZnQtYm90dG9te2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAjNzc3O2JvcmRlci13aWR0aDo1cHggMTBweDtyaWdodDotMjFweDt0b3A6OHB4fS5jb2xvci1waWNrZXIgLmFycm93LmFycm93LWJvdHRvbS1yaWdodCwuY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy1yaWdodCwuY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy1yaWdodC1ib3R0b217Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50ICM3NzcgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXdpZHRoOjVweCAxMHB4O2xlZnQ6LTIwcHg7dG9wOjhweH0uY29sb3ItcGlja2VyIC5jdXJzb3J7Ym9yZGVyOjJweCBzb2xpZCAjMjIyO2JvcmRlci1yYWRpdXM6NTAlO2N1cnNvcjpkZWZhdWx0O2hlaWdodDoxNnB4O3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjE2cHh9LmNvbG9yLXBpY2tlciAuYm94e2Rpc3BsYXk6ZmxleDtwYWRkaW5nOjRweCA4cHh9LmNvbG9yLXBpY2tlciAubGVmdHtwYWRkaW5nOjE2cHggOHB4O3Bvc2l0aW9uOnJlbGF0aXZlfS5jb2xvci1waWNrZXIgLnJpZ2h0e2ZsZXg6MSAxIGF1dG87cGFkZGluZzoxMnB4IDhweH0uY29sb3ItcGlja2VyIC5idXR0b24tYXJlYXtwYWRkaW5nOjAgMTZweCAxNnB4O3RleHQtYWxpZ246cmlnaHR9LmNvbG9yLXBpY2tlciAuYnV0dG9uLWFyZWEgYnV0dG9ue21hcmdpbi1sZWZ0OjhweH0uY29sb3ItcGlja2VyIC5wcmVzZXQtYXJlYXtwYWRkaW5nOjRweCAxNXB4fS5jb2xvci1waWNrZXIgLnByZXNldC1hcmVhIC5wcmVzZXQtbGFiZWx7Y29sb3I6IzU1NTtmb250LXNpemU6MTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzo0cHg7dGV4dC1hbGlnbjpsZWZ0O3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwO3dpZHRoOjEwMCV9LmNvbG9yLXBpY2tlciAucHJlc2V0LWFyZWEgLnByZXNldC1jb2xvcntib3JkZXI6MXB4IHNvbGlkICNhOWE5YTk7Ym9yZGVyLXJhZGl1czoyNSU7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7aGVpZ2h0OjE4cHg7bWFyZ2luOjRweCA2cHggOHB4O3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjE4cHh9LmNvbG9yLXBpY2tlciAucHJlc2V0LWFyZWEgLnByZXNldC1lbXB0eS1tZXNzYWdle2ZvbnQtc3R5bGU6aXRhbGljO21hcmdpbi1ib3R0b206OHB4O21hcmdpbi10b3A6NHB4O21pbi1oZWlnaHQ6MThweDt0ZXh0LWFsaWduOmNlbnRlcn0uY29sb3ItcGlja2VyIC5oZXgtdGV4dHtmb250LXNpemU6MTFweDtwYWRkaW5nOjRweCA4cHg7d2lkdGg6MTAwJX0uY29sb3ItcGlja2VyIC5oZXgtdGV4dCAuYm94e3BhZGRpbmc6MCAyNHB4IDhweCA4cHh9LmNvbG9yLXBpY2tlciAuaGV4LXRleHQgLmJveCBkaXZ7Y2xlYXI6bGVmdDtjb2xvcjojNTU1O2ZsZXg6MSAxIGF1dG87ZmxvYXQ6bGVmdDt0ZXh0LWFsaWduOmNlbnRlcn0uY29sb3ItcGlja2VyIC5oZXgtdGV4dCAuYm94IGlucHV0e2JvcmRlcjoxcHggc29saWQgI2E5YTlhOTtmbGV4OjEgMSBhdXRvO3BhZGRpbmc6MXB4fS5jb2xvci1waWNrZXIgLmhleC1hbHBoYSAuYm94IGRpdjpmaXJzdC1jaGlsZCwuY29sb3ItcGlja2VyIC5oZXgtYWxwaGEgLmJveCBpbnB1dDpmaXJzdC1jaGlsZHtmbGV4LWdyb3c6MzttYXJnaW4tcmlnaHQ6OHB4fS5jb2xvci1waWNrZXIgLmNteWstdGV4dCwuY29sb3ItcGlja2VyIC5oc2xhLXRleHQsLmNvbG9yLXBpY2tlciAucmdiYS10ZXh0LC5jb2xvci1waWNrZXIgLnZhbHVlLXRleHR7Zm9udC1zaXplOjExcHg7cGFkZGluZzo0cHggOHB4O3dpZHRoOjEwMCV9LmNvbG9yLXBpY2tlciAuY215ay10ZXh0IC5ib3gsLmNvbG9yLXBpY2tlciAuaHNsYS10ZXh0IC5ib3gsLmNvbG9yLXBpY2tlciAucmdiYS10ZXh0IC5ib3h7cGFkZGluZzowIDI0cHggOHB4IDhweH0uY29sb3ItcGlja2VyIC52YWx1ZS10ZXh0IC5ib3h7cGFkZGluZzowIDhweCA4cHh9LmNvbG9yLXBpY2tlciAuY215ay10ZXh0IC5ib3ggZGl2LC5jb2xvci1waWNrZXIgLmhzbGEtdGV4dCAuYm94IGRpdiwuY29sb3ItcGlja2VyIC5yZ2JhLXRleHQgLmJveCBkaXYsLmNvbG9yLXBpY2tlciAudmFsdWUtdGV4dCAuYm94IGRpdntjb2xvcjojNTU1O2ZsZXg6MSAxIGF1dG87bWFyZ2luLXJpZ2h0OjhweDt0ZXh0LWFsaWduOmNlbnRlcn0uY29sb3ItcGlja2VyIC5jbXlrLXRleHQgLmJveCBkaXY6bGFzdC1jaGlsZCwuY29sb3ItcGlja2VyIC5oc2xhLXRleHQgLmJveCBkaXY6bGFzdC1jaGlsZCwuY29sb3ItcGlja2VyIC5yZ2JhLXRleHQgLmJveCBkaXY6bGFzdC1jaGlsZCwuY29sb3ItcGlja2VyIC52YWx1ZS10ZXh0IC5ib3ggZGl2Omxhc3QtY2hpbGR7bWFyZ2luLXJpZ2h0OjB9LmNvbG9yLXBpY2tlciAuY215ay10ZXh0IC5ib3ggaW5wdXQsLmNvbG9yLXBpY2tlciAuaHNsYS10ZXh0IC5ib3ggaW5wdXQsLmNvbG9yLXBpY2tlciAucmdiYS10ZXh0IC5ib3ggaW5wdXQsLmNvbG9yLXBpY2tlciAudmFsdWUtdGV4dCAuYm94IGlucHV0e2JvcmRlcjoxcHggc29saWQgI2E5YTlhOTtmbGV4OjE7ZmxvYXQ6bGVmdDttYXJnaW46MCA4cHggMCAwO3BhZGRpbmc6MXB4fS5jb2xvci1waWNrZXIgLmNteWstdGV4dCAuYm94IGlucHV0Omxhc3QtY2hpbGQsLmNvbG9yLXBpY2tlciAuaHNsYS10ZXh0IC5ib3ggaW5wdXQ6bGFzdC1jaGlsZCwuY29sb3ItcGlja2VyIC5yZ2JhLXRleHQgLmJveCBpbnB1dDpsYXN0LWNoaWxkLC5jb2xvci1waWNrZXIgLnZhbHVlLXRleHQgLmJveCBpbnB1dDpsYXN0LWNoaWxke21hcmdpbi1yaWdodDowfS5jb2xvci1waWNrZXIgLmh1ZS1hbHBoYXthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLWJvdHRvbTozcHh9LmNvbG9yLXBpY2tlciAuaHVle2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUpZQUFBQVFDQVlBQUFEMDZJWW5BQUFBQm1KTFIwUUEvd0QvQVArZ3ZhZVRBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBQUIzUkpUVVVINEFJV0R3a1VGV2JDQ0FBQUFGeEpSRUZVYU43dDBrRUtnMEFRQU1FMng4My9uMnF1NXFDZ0QxaURoQ29ZZHBuYlFDOWJiWTFxVk8vanZjNmszYWQ5MXM3LzdGMS9jc2dQcnVqdVExN0JEWVNGc0JBV3dnSmhJU3lFQmNKQ1dBZ0xoSVd3RUJZSWkyZjdBci8xVENnRkgyWDlBQUFBQUVsRlRrU3VRbUNDIik7ZGlyZWN0aW9uOmx0cn0uY29sb3ItcGlja2VyIC5odWUsLmNvbG9yLXBpY2tlciAudmFsdWV7YmFja2dyb3VuZC1zaXplOjEwMCUgMTAwJTtib3JkZXI6bm9uZTtjdXJzb3I6cG9pbnRlcjtoZWlnaHQ6MTZweDttYXJnaW4tYm90dG9tOjE2cHg7d2lkdGg6MTAwJX0uY29sb3ItcGlja2VyIC52YWx1ZXtiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFKWUFBQUFRQ0FZQUFBRDA2SVluQUFBQ1RrbEVRVlI0MnUzU1lVY3JBQmhBNFUyU2ttUkpNbVdTSmtsS0ppV1pacEtVSkpza0tVbWFURkltS1pPVXpNeVNwR1JtbGlSTkppbEpTcEtTSkV0bVNwSXBtV21TZE83MzYvNkQreDdPUDNnVUNvV0N2MWNxbFNRbEpaR2NuRXhLU2dxcHFhbWtwYVdSbnA1T1JrWUdtWm1acUZRcXNyS3l5TTdPSmljbmg5emNYTlJxTlhsNWVlVG41NlBSYUNnb0tLQ3dzSkNpb2lLMFdpM0Z4Y1dVbEpSUVdscEtXVmtaNWVYbFZGUlVVRmxaaVU2bm82cXFpdXJxYW1wcWFxaXRyYVd1cmc2OVhrOTlmVDBHZ3dHajBVaERRd09OalkwME5UWFIzTnhNUzBzTHJhMnR0TFcxMGQ3ZWpzbGt3bXcyMDlIUlFXZG5KMTFkWFhSM2Q5UFQwME52Ynk5OWZYMzA5L2N6TUREQTRPQWdGb3VGb2FFaHJGWXJ3OFBEakl5TU1EbzZ5dGpZR0RhYmpmSHhjU1ltSnBpY25HUnFhZ3E3M2M3MDlEUXpNelBNenM0eU56ZkgvUHc4RG9jRHA5T0p5K1hDN1hhenNMREE0dUlpUzB0TExDOHZzN0t5d3VycUttdHJhM2c4SHJ4ZUx6NmZENy9mei9yNk9oc2JHMnh1YnJLMXRjWDI5amFCUUlDZG5SMkN3U0M3dTd2czdlMnh2Ny9Qd2NFQmg0ZUhIQjBkY1h4OHpNbkpDYWVucDV5ZG5YRitmczdGeFFXWGw1ZGNYVjF4ZlgzTnpjME50N2UzM04zZEVRcUZ1TCsvNStIaGdYQTRUQ1FTNGZIeGthZW5KNTZmbjNsNWVlSDE5WlZvTk1yYjJ4dnY3Kzk4Zkh3UWk4V0l4K044Zm42U1NDVDQrdnJpKy91Ym41OGZmbjkvK1ZjS2dTV3dCSmJBRWxnQ1MyQUpMSUVsc0FTV3dCSllBa3RnQ1N5QkpiQUVsc0FTV0FKTFlBa3NnU1d3QkpiQUVsZ0NTMkFKTElFbHNQNC9XSDhBbUo1WjZqSFM0aDhBQUFBQVNVVk9SSzVDWUlJPSIpO2RpcmVjdGlvbjpydGx9LmNvbG9yLXBpY2tlciAuYWxwaGF7YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSllBQUFBUUNBWUFBQUQwNklZbkFBQUFCbUpMUjBRQS93RC9BUCtndmFlVEFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFBQjNSSlRVVUg0QUlXRHdZUWxaTWEzZ0FBQVdWSlJFRlVhTjd0bUVHTzZqQVFSQ3NPQXJIZ0JweUFKWUdqY0dvY3hBbTRBMklIcG1vV0UwZUJIK2V6bUZsTnZVMDZzaEozVzZWRWVsV01VUUFJSUY5ZjZxWnBpbXNBMUxZdFMydUY1MS91MjdZVkFGWlZSVWtFb0dIZFBWL3NJY2JJRUlJa1VkSS85WGE3bmV5djYxK1NXRlVWQVZDU2N0MDBUV24yZnY2dTMrRWNmZDN0WHp5LzArbkVVdStTUGpvL2txenJtaVFwU2NONnY5OFhld2ZBOC9sTWtpTEoyV3hHU1VvcGNUNmZNNlUwTlg5L2ZyZmJqZXYxV3RmcmxaZkxoWWZEUVFIRy9BSU9sbkd3aklObEhDeGpIQ3pqWUptL1RKV2RDd3F1SlhzZUZGekd3RE5OZWlLTU9KVE84eFFkRFFhZUIyOStLOWVmZUxhQm85Sjd2ZHZ0SmoxUmpGRmpmaXY3cXY5NXRqeC83bGVTUWdoOTNlMWZmTWVJcDZPK1lRamhvL043OTF0MVhWT1NTSTdOLy9LKzQvR294V0xCeCtQQjUvT3A1WExKKy8zT2xKSldxeFUzbTgzb3Z2NWlHZjhLallObEhDeGpIQ3pqWUJrSHk1Z2Y1Z3VzdlFVN1UzN2pUQUFBQUFCSlJVNUVya0pnZ2c9PSIpO2JhY2tncm91bmQtc2l6ZToxMDAlIDEwMCU7Ym9yZGVyOm5vbmU7Y3Vyc29yOnBvaW50ZXI7ZGlyZWN0aW9uOmx0cjtoZWlnaHQ6MTZweDt3aWR0aDoxMDAlfS5jb2xvci1waWNrZXIgLnR5cGUtcG9saWN5e2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJJQUFBQWdDQVlBQUFBZmZDanhBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBQWx3U0ZsekFBQUNld0FBQW5zQjAxQ08zQUFBQUJsMFJWaDBVMjltZEhkaGNtVUFkM2QzTG1sdWEzTmpZWEJsTG05eVo1dnVQQm9BQUFJQVNVUkJWRWlKN1pZOWF4UlJGSWFmc3hNU3RyTFFKcEFncEJGaGkrQzl3MVlTbzAwSTZSWi9nOXZacEJmL1FPcjRHeVJna1NLTlNyQWFkc1pxUUd3Q2t1QVd5UlpKc3lTd3ZoWjdOL3ZoenJnYkxIM0xkODU5N2pseno1MHpKb2t5eFhIOERxRFZhcjBxaTZ2OEJiSXRxU0dwRWNmeGRsbXNGV1hrdlg4QWZBVldnM1VLUEVuVDlHS3VqTXpzQUZnWnNWYUNOMVZUUWQ3N1hVbnJnRTFrdis2OTM1MjY4V1JwenJuSFp2WVJXQzdZdkMzcFJaWmwzd296cXRWcWl5SDlJZ2pBc3BrZDFHcTF4VUpRdFZyZEI5WktJQU90aGRnL1FjNjVMVWs3d05JTW9DVkpPODY1cllGaGtxalg2L2Q3dlY0R1BKd0JNcW9mVVJTNUpFazZGWUJlci9lZVliL01vOVd3Rm5QT3ZRYmVBdmZ1QUFLNEJONHNBSnRBRy9nSklFbG1OdWlKeWJhM0VHTm1aaVBlWnVFVm1WZWxsL1kvNk4rQ3pEbjNBWGhFT09vN0h2LzNCZUF6OEl6UWtNUG5KYnVQeDF3Qyt5WUo3LzBuWUlQNVMvMEZIS2RwK3J3Q0VFWFJTL3JmNUhsMUd0YjJNMGlTcENPcENaelBBVG1YMUV5U3BITUxBc2l5N01qTURvSHJHU0RYWm5hWVpkblJ3Qmg3SjkxdXR3bWN6QUE2Q2JHM0dnUGxlWDRqcVVIL2ExQ2t0cVJHbnVjM2hTQ0FNQjMyZ0tzcGtDdGdiM0tDUU1ta2plUDRXTkpUaHJOTlp2YWwxV3B0VElzdjdKdFE0dG1JZFJhOHFTb0VwV2w2WVdaTm9BTjB6S3haTlBlaHBMU0JadjJ0K1EwQ0o5bExuQVJRTEFBQUFBQkpSVTVFcmtKZ2dnPT0iKTtiYWNrZ3JvdW5kLXBvc2l0aW9uOjUwJTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1zaXplOjhweCAxNnB4O2hlaWdodDoyNHB4O3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjEycHg7dG9wOjIxOHB4O3dpZHRoOjE2cHh9LmNvbG9yLXBpY2tlciAudHlwZS1wb2xpY3kgLnR5cGUtcG9saWN5LWFycm93e2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjUwJTt3aWR0aDoxMDAlfS5jb2xvci1waWNrZXIgLnNlbGVjdGVkLWNvbG9ye2JvcmRlcjoxcHggc29saWQgI2E5YTlhOTtib3JkZXItcmFkaXVzOjUwJTtoZWlnaHQ6NDBweDtsZWZ0OjhweDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTZweDt3aWR0aDo0MHB4fS5jb2xvci1waWNrZXIgLnNlbGVjdGVkLWNvbG9yLWJhY2tncm91bmR7YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ2dBQUFBb0NBWUFBQUNNL3JodEFBQUFoMGxFUVZSWVIrMlcwUWxBTVFnRDYwemRmd09kcWE4VG1JL3dRTXI1SzBJNWJaTEl6TE9hMm50MzdWVlZiZCtkRHg1b2JnQ0MzS0JMd0oyZmY0UG5WaWRrZit1Y0lodzgwSFFhQ0xvM0RNSDNDUkszaUZzbUFXVmw2aFBORHd0OEV2TkU1cStZdUVYY01na29uVk02U2R5Q29FdkFuWjh2MUhqeDgxN01pbG14U1VCNXJkTEpEeWNaZ1VBWlVjaC9BQUFBQUVsRlRrU3VRbUNDIik7Ym9yZGVyLXJhZGl1czo1MCU7aGVpZ2h0OjQwcHg7d2lkdGg6NDBweH0uY29sb3ItcGlja2VyIC5zYXR1cmF0aW9uLWxpZ2h0bmVzc3tiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFPWUFBQUNDQ0FZQUFBQlNEN1QzQUFBQUJtSkxSMFFBL3dEL0FQK2d2YWVUQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUFCM1JKVFVVSDRBSVdEd2tzUFdSNmxnQUFJQUJKUkVGVWVOcnRuVnVUNDdnUnJBSE4rUC8vT3IvNjFZNXdPTlo3bVoxdTNYQWVMTWpKWkdaVmdkS3NmYzV4UjNTMFJJSVVXK0NIekNwYzJNY1lvN1hHdjNleDdVaVpkNTdyanl6enYrdiszM1gvUi8rM3IvZjd2UjM4NlkrVHZLTmNmL3dkaFRMUGN2OXFVMndaZDc0dXRoMHQxODIxamtJWkxQY3NJLzZuV2E0WHZ1dHF1VTBaODVtbng4MFMvWnpncG5Mbk90SE50Ny9vZngxVEtYY1NOek4vN3FiTVEzanU3ck5RbU1ZWWQvNHMyajlhYStQK2dHYU1jWnJiMU0vdGRydmY3L2Qydjk5UDkvdDkzTy8zY2J2ZHh1MTJHOWZyZFZ3dWwzRStuOGMvLy9uUCsyKy8vWGI2NmFlZnhsLy8rdGZ4NXovLzJZSzVBbDJyZ3ZmNFVzYnBkR3JCNTJiQXZBclhwdXpqbWlxQVZTR3o1ZURtR1lYemhiQVptQ3JubXpkZHBVVSs4WTFkQU9ZZVhDdERVd1Z3VjdZQ0dINnVBbXlNY1o5bDV2a1VhQlBHTVVaNy9KNXcvNzkyL2Z2djlYcTkzMjYzZHIvZlR4UEVDZU1FOG5LNWpNL1B6L0hUVHovZHYzMzdkdnJsbDEvR1AvN3hqL0czdi8xdC9PVXZmd2tWc3dvbmdqZE9wOVB6SDNVM0Qzem1XR25aVlhuNGpDcXM3d0MyQktQNC84dEF6a1pzb1d4NlhycWVIWnltdnA0QUJDQkpoVFF3S2ZEVDhnenJaQ0lxaTVBaGlBQ2pCZkVCMnJQOC9YNjNNTTdmNi9WNnY5L3Y3WGE3YllDODNXN2pjcmxzVkhJcTVmZnYzMCsvL2ZiYitPV1hYOFpQUC8wMC92NzN2NCtmZi83NUpTdmJldStiTDJXTU1hRmJBbHBCTk04NVFYK2N0NnFvU3FrUEF3dVFsQlZLcUdORlNVT0FBM0JtdTdnQzVoTk9kMTVuU3d2QU9VVzdDNGdpVUNWOFNnbjVMOWhORklxVHNwMEd4STB5c2lveWpBamtZL3RHSlZFcHorZnorT1dYWCs3ZnYzOC8vZjc3NytQYnQyL2oxMTkvSFQvLy9QUDQ5ZGRmeDhmSFJ3cm1UalY3NzlFWHUycHgyeGhqd3RkSlpRY0FXUUlQTFBJU3NNSmFTd2lEOGd6SUtyd1N5QVRFNWo1bkFiUjVjMWRCVXdCbHNFV1cwaDZMcWlZc3FGUEFReEN5Ulozd09TQVJ4bWxYTVg1azY0cFFmdnYyN2Y3NStkaytQajVPSHg4ZjQvdjM3K1BidDIvanQ5OStHOSsrZlJzZkh4L2pjcm1VRkxPMzFnWURXYmx4UklzL1RxZlQ3b3VzeEpzQXhYQTJHYzdUQTlYZGdmZG9IYkZzajc2WDIrMVdBcmdJMWFnZUd3QTNxdXBxb0hzbWNiSTZGdTkzcXVnZ0ZhOWQ3TGVEdGdLZkFGSEJKK05FQnlJa2NKNUtlcnZkVG1oaEdjZ0pKU1o1dm4vL2ZqK2Z6KzE4UHA4K1B6L0g1K2ZubUdEKy92dnY0L3YzNytQajQyTjhmbjZPMisxV3M3SmpqUDZ3cmFNSTVFNFJaOHgydlY1VFN3a3F1b3RWNy9kN1R6NkhGV3NEL3FOY2R3MENRM3EvMzIxYzY4NlR3RFZJZGJ1eTczek5sZGhTSGI4STJrbFp6bm0rSW5CUzRVNm4wMzAyYUJGc0xoSERBS0pWSlZnbGZJOWpodnU1M1c1M3NMQU5ZTnhBaURBNk1DZVVIeDhmOSt2MTJpNlhTN3RjTHFjWlc1N1A1eWVZOC9mejgzT2N6K2Zuc1NtWVV5a25XRUc4NVdCc3Q5c3R6U0x5TWRmcjlRaTA4aVkxNVVaMExsREdMaFIzbzV6SzJqN09QVVREMEUrblUzdGs3WGIvMTZORmJobG9BTXVZMXpqTFVPTzNCS2VJRGUrWjhzMy9KNGdGbzRUTTVqUG11UmcyOGZvVUtLVlN3bzE2VGdBNW5weXdjV0xIZ1lsL1B6OC83My82MDUvYWI3LzkxbTYzVzd0Y0xpZTBzWmo0bWFvNWdUeWZ6ODhFMGYxK2o4RWNZendUUEVHMmNxanlmSE5GME04ZnVxRWlhT1ZuUnpaWlFOaDVmd1F5SGcvSERHZkpvODlRMXpiL3F1dTVYQzY3NzNJMlhLZlRxZC92OStkM3d1cVd2YS9ZVGRVZEVWM2ZoSXYvVml5cHM2WUUzeDNyNDNLNWJKUVM2NnpheFZHRnN2ZCsvL2o0YUYrL2ZtM2Z2Mzl2dDl1dGZmMzZ0ZjMrKysvdGRydWR2bjM3WnVOTEJhYUNNZ1V6QytyWlJpRm93eFV1Skk4WU1xY0NwOU9wcTV2YWdhWVU2bEdKQTFYUXFlamNodzZDajBHdzVuWUJyR3cwMUEyTzIwNm4wNEJHb3VOTnlUZnAvRndFbGhVZXk2blhySUt3N1FRV2RkeHVOMmxkTDVmTDgzOWdTUEY4YWh1L0p2Qk80OENQU3VxTWY4VnA5L1A1M0w1OCtkTHU5M3M3bjgvdGZyOC8zOS92OS9iNStUa2hQSjNQNTZtUTQzNi9qKy9mdisvaVNnYnplcjArQVp4LzUrODhidjZPTWRhNlM1ejZrZDIxZllDOWR4djdjSUpKMmQ5QU9TMzBmUE16eUhpVE04QjRERjZYVWxZSHA0S1FXM1crMXQ3N01OQjF2R0h4V3E3WGE3dmY3OCt5NS9ONUErSDFldDI5eHVQNWRiWXR5YVJ1NEFrc2JQcTY5MzZmalJ6WFJ4QmJQci9iK2IxOCtmS2xqVEhhQkJCZm44L24wLzErSDErK2ZCbm44em0wc0I4Zkg1dTRjcjVHdUJoTVZrMEVFbjlSc2N0Z1ZoTStpeGxKdE1BMjNSOEI2eXlzQXN0Qk9nRlhJS0tDTUlnVG9NcU5FdTJmWU1IN3p0YzczMmRRS2tDajF5dEFadFkwS3g4cElyOEdHSitBVDNWKzJIaXJobCsrZkJtWHkyV3o3M3crYjE3UDhwK2ZuOC90VXdHVmxlVmtUeVViNjhEa2ZheVdZNHp4TlJpaFU0RXBMSlBaVnJLK3U3SjQvbWdmS3FlTFc5WDJSRVdsSXRMMWRpeW5iRERiMytqWGdZalFxbjBycnhXYytOa0lMUDdGN3hJYk12eDd2VjUzeDQweG5sYldKRjEyWlNhZy9OMHBXNnQrWnptT016SGphakt3RGZvbmQ3OHpZVGRmcTE4dXA5N3pyMnE4djNJaW9CcHJSdEJsMEVaOW9nNVdCUkdPZE9IaklqWEY3VW90RmJnT1duWHpJSnl6WXZqRzVJWWdzbU1PeEhrejhPc01TclZOV2VxNVQ4RGFPY2JFdjFPZDVyYnM5YU83WXZNZXQ2M0VrRisrZk1FeHErTVJsNC9MNWJMWk4vK2V6K2ZuWjZLYXp1TXFYU1FWTzVzcEpYZmxIQUl6ZXMveEpzZWNrUkppRE1vZzlkNlZmUnJxWE1yNktwVlYyN2pSd0phY0dvdk9BTTF6TWRRTW53SzFBdWJLNjNrZENDaHZJMUM3ZzB6OW5mL0QrWHplMlZqOEg3R3g0UDlkdVFsc1lDcnF5TjhYcUczSG0vMTBPajNqdy9uK2NybHN0dU0ralBtbXhUMmRUdVB6ODNQenQycG4xWHNFSFgvYm5QYVZxVm1oMHh3T3QwbzZYTExBSGVQVVUyMDN3SGZjcnNwQ3dtVjNUcnlCNXMwTXNlZWc5N3gvQnd6Q2pCbGJCK3BSQVBsYTBCVlF1VDZWNlFIZEJsajNkMEtHMTQ3YitEcXhRZVV5bURPNDNXNGRRYXIrVElqd21BZDB6OC9oNjV2ZjAveUx2M1BiNVhMcHJ1L3lkRG85czdFVDBJK1BqNmRLSzlWVUVJZUtXUVdQQU9ySjhMS2Q0dkUrdDkxWTNlN1VGbFdhdGcyVndKbmIrSFBtdHZtL3NmSzU5L09hV0YzeC9lUDFVUEh2QTVERFlEcFlYZmIwZHJ2MVYyRGtCa3h0dy90RVdWVmxYV2RDOXBGWXM1L2pmaDlkUy8xNnZXN3M2bFRHK1RmcXN4U0pIeGtYWHEvWGRyMWV1NExzZkQ2UDN2c1QzTjc3RGtMK3pQbTVqU2RLTDR6UjNBeFFkNnJIa0xrWWxTb3dzcnE3em56dTZ3U3dkc01KT1htQTVmQmNqeHRnTUdCWUhscjV6b2todHNNQ1RnWExRT1c0WEM2ZEV5RU1wckw4bUFRelhSZ2R1aXgyeVp6b3J4a1lzRG4zaEIxVmVNTEdzWHNWdGdsMnBXOFMzc3ZrMHZ3N1I0aE5hSHZ2NGNBQ2w1SEZ6d0lIMEtjNnp1NFhqRFBSL2pwQVZ4V3pPMVhrMkREYjN2VGN4ZUdVMWlXWkhrbUlEV3ppV0t2aXJDSjREcmF2czZJSi9HRzZjVHFXZFhEeStmQXJRRFZWa0xxa1ZqQW9aSUlUZG1tSXFYd3FhOTVOMytNR1lvWlFkUlZOTzUzWTF4UmtoTzE2dlk3ZXU1MDdDYTlsSm5iR3B4T2VtUWhTdy9BUXNtbXA1elU5QmlVOEc2d3ZYNzZNNi9VNlBqNCtkbzBCejRDcGdpa25UVWVEcXdsS0JtZzN1NE9WanJaMUErckFjZ2FlaldxNmVKQ3ZDWUZET05Td09nSFg0RVFSdzhseGJ6RE9kRUs2Z1ozSGsxYis4ZzJvMUpGdEtYeXYvZkVkVFh1V2pXWGRBWmlCcDZBRGVEckNGaWltN0I2WkZuZWVJN0d2bS9QTWtVRFg2N1c3eEk4YjBENy92OGRBOXFmTjVvYUNmNzRXWmpIMG1mMWNtZlkxWTBKVUZtVnJUV3U4dXprTmNMdEVqN3U1RlhCVGtmQzZHT0E1cThZTXhPOEtWdkY2c0FWR2RjclVic0tPRGNRS2tMTU9NZG1seHVtNjQyWXJQbTI2QWxoWlcxWUIxUityckdzd0U4VGFZQVdlVU14ZGYrV2p3U3ZaMkVmM3l0T3lmbjUrUHBWUEFhcU9uNDNNdE5CcXZtamp4YmpNNGxaalpZNGdxTk1JNWt0YVcvc1lLTndTKzlsRlF6R2lobU1DS1BhNytaMFY2RWIwR1Jtb2J0cFg4SmxqV3U1Rk1MTjVqYTZoRzlrd1FnWnFmNSsxTkg1VXh6a0ZSZUNkV2hKOFhkbEdVa3hPN0hSbFlSbTRtVk80M1c3dGVyMTJUUEpFdy9ybUVOM0w1U0tISVdaZzlteitwVW9LT1lxNWJKVEpkWDJnbWUxVWN4TVpRRmFFUUlsSGN0MzJNK1kxQnpHa0d1emZpeUFOOXordWdwbFoxc3ltQ3JEQ1lZa0d4RFRwSTlSekJ5MHJIeWVEVUMxbldhZVVhRDluNHhrTnlZTUJEWnR6WjNCKytmSmxZMjFYRkRPY0FSSmxhYk95aVMzdUNwTEk5anJaakNEa2FWdmNDQ2p3b2duS1NoV2R6WFpXbFpNdlZUZ0Q4THBxbENMcnFnYmNCK3FZd3JnS1lwVDBjY0NxYkt5Q1ZhbGtFYWJuL0Z5bm9nQ3JQS2ZxZjUxeEo3c0dCMlpYY1pteG9TT3p0angzMDBEWmk3YTAvMkFJUjBVbEJhZzlTdUR3NktjQXpsYUI3dkhadldwaks5MGR5cnE2Ykt5RFVaUWJSMEIwNWJpTFFrSEljU1VtZ0lLK1N3dXFnSENub2lvMlJRVTF5aitCbkJ5OXBwaFZLTEd5QzdaekZLMXB4V0srRThJaFZDV0xOL3VMdG5VVTRheW9ZTG9hQU56OEZkdGFTdlk0cFYwQkVXMmxzNjFjenFsbEJLcFR5S2dNQWhyWjFjZGMxUlJPdFBtdldOa2RjS1o3Wkt4YVdqaVBMSk1wcDdPWkt4QStycUcvb0pManhmMHBuSmxxTG9EWm8zZ3lVMG1LR3lzMnRhS2Vjai9kMUMrckpTcGxCcWxUeUFxZ1IrRDhLaktsbVJMMmd0VWNBZEN0c0wraWpDTlQxb3FxcWtIMk9IRWJHNXNERm5VZzVBYSt5TG91MlZVMXB0ajFTMlpRcXYxT1JaTjlJV3pSZmdhUkJ4S29CRThVV3lxbEpGdHJJYzBBeE5qU2plZDk5Q1RZL1hEZlN6Q3o1TTBJWm9WRXNXblBGTlRzbDhvb1ZDMVR6YkdncUZaTkRTZ1Z3S0srMXNHRE1LcXhaQ1dHVk1EeXNpRXIxalZTUUpVWXdqNWlIT2xUaGRIdDQ0U1FnOUNOK25sOEQ5ME5NSWdBZGdyNDZKcVJpUjlJOHZSZEZ2YnIxN20veXhVTUtqTkxNaVZVQUR3dTJDV0doaGkrRjU1VFdNOU05Y29nem1zMWRuTTR1T0YvTEFFWVdkY3FuTTd5Rm15cTNJZndtT1JPZDdZMWlGV3RPam9ZOFRvNDFtVFY1SXlzZ0ZGdVJ6c2JXRkdiTklJSkNEdjFkT280bFpHN2pXQndSRnRWVEt1V3llQ0J5SktPYW44b1ozZXA5WGRkTmwwdER1YXl3THo5Y1hQWWVEQUEwU3BrQk85c2JWY1RPVldsZFB2NHV5ekVrenhIdGp2b25Ib1NrRkVXTm9vMWQ4RGhjUXB1dGQycHBOb240QnpvQWlKMWhCRlFnMGRWdGRiR0hIRFFXdXNobU5FUXVrTE0yUU8xRzJZOGJnVFhxRmhjQkpqN0VqUGdjUHRzOFVTOHFQcFBCL2RYem5PaDVaNDM4dHpINWVjNlFnck9LclJSZktteXNCbVVEQitQaFlhYk1sVlBFUitHQ1NJVFR6cjdhbTJ0QXJIM2JnY0V6UEptK2NyNWpKNE5uSE5GRFZyRlhjSTVMZTlrNUpudytiZWRiVitGZlJ6WklIYU9PYU9zTFkwLzdVR3M1OERqckd3S01JTUZJR3pPRVcxL2pHc2RBdENONmhFQUk0aEJlOVlYZVJST0JTVlBBVlBBcXZJTTVieDVoVktXQU1QNnpCUnkzaWVzY3JpZFZkRkJpbkJ4WERuRzJHUlkyWGJDdnAxbGh2R3RPOUJ4dTVoOTA4WFF1NDJsblNBck1GZGl6TWltOHV3UkN4UEdubk9TOGx3cG5iT2lEcVRBanNyUk4vUGNvQVNjQ2JhQUNxVk00MHlsbmpqVEJzK2J3V2xBRzIzL1VLYmRraXdLV0lRUEd6V2FjenBvU2x4UEVqODIyY05Xa3BTN0Z5enNEcnFwZmdwRzNqYWh3MnZnYmFTUUF4dUxXWll0N0p6eU5lOEpvWnBOQWN2REZPZHcwd3FZVDlBSzFyWnovRGRiU2xMUHAwcnlJeGdRSmxLOUFabEVxN0lPWHBvaGc5UElockNuZzg4SnNPeGlWNFpXQVlmZzRzaWt4LzhreTJaOWw4NjJ1cXdyZnNjSUg4K3VnVG1WR3lpZGRlVllVZ0VNbjRHWnpnMTRFd0lzaDlzeDJjS0tpV1hSZXVPRTVnekdPUWdkbFJLVlZkbGV2cWIyNzlYcTBRbnN0czJWRGFCTzBjb2V6c3J1V3RIQXB1NnNLRzRJQmhOMGFHVTJrTHJNS0dSVE4zSG1iQ0R3S1YxNHp2a01FREc0UWZaVnNwVmxhTlUybWhjNVRFWjNOMWgvenFUaGV1THBXMDVaV1RHVmpiM2Ribk5teEtaQm5OOEpxaWRhVkxLQU95QVJOTFMrTUI1NFoyK1ZhcW9NTEtyb1ZCbG5nZWZuVFBBY29ITldDU3ZsZkE4Q0kwSEVtQk5CbkJsWHlNcnpVN0E3V1ZtOTRQUHFRMmdtcUt4K1dER3NudmlsbWNTT0JKcU9LMW5ZeUFJenVBeWVzcTNVZFNLM0tmV2NZS0Q5NUhtZllPVTNxc2VyMkN0WUVVQStGcGZxZE52Z1BCWlVCaERyR09OUlZsUXNoOHJMY2FVQ3lrSEcwT09Vd1RsTEJyc2g1c29FTUdlemkxRTRIUlZ0MWljcDV3WkVGWGRpYkNrRzhZOHZYNzVzYk80RTBpb205eitoalNpT2Z5M0RocFhJdHBWaEUrVUdRZHZvV2p0Q2htckdIZjRZQXpLZ0JObkd0dUp4RkNlR2RoVUFmUUxMSzhrQllBUDZndkZKWmFqTUczWGt5Y3k4S3VDMHE0RXl5bXd0d2R4ZHYyTTBtSUJ0SzBMS25mNjQwajAwQXVxNGdVa2RXR2xoczIycUpjNmRaQ3NMMTlveG5sVEpHNFNZVlJJR3BEOFRQRkJ1TTZPRWxiUzFwbGRpZDRtR0F5TjZaSXVwYkM1YlhKTjlmZHBiVGhTeExVYUk4SUcxWElZQnhXM1RqczZLUW9zS2N4ZnhjUW1kbndSR00xMEduRmNDeTJYWXVuTE15QWtkZ2s0bWVQaWN6c0x5Z3RoY0J1dDZnb09xUzdZVkZYQURMamFvc0I2czZvZmNaV0FaU0lSWXFTVWtpell3dHRZYWIzdlVPUTl3MkhSeElJZzhXd1JWZUU2OHhpNFV0TDN6UnBoeHBsend1WnJjcVlDcTFJM2pQSTVkbkpJeWdFb2hNYlBxVkpTenJ3enhCSlRzNXpOK1JlVVNneGlrUFFWRjNKVkJlTlF4YkhFTnJFTU52RWRGWlZWOWxIOStPUkdFc05aUXB5VE5jNEMzQUc3WEY0bmd6cStEck8yemJ1YWFPWGdkYUZjZGtFb3RvU0ZCVlgycUowQzhPV1plRzRLR2xwZ2hBMFhmVE9QQ3FWMnFxd1EyNlFXZkYyUE1MaEkydzFsVkFhMmFQc1lkMHphMjVNUVJ3Z2NaTjZ1UURDaStaeGlENFhFTTJrWnhPVDQxRm5abmFSbGNwWm91emxScXFkYlFWV29wUW9TQjU4UlY1MGxCTnJIaS9Bd1hTNUxyd0RWbHBZM0ZjM0J5aVlHYzUyVHJpc3Q2a09YZHdJbkFRdEpwcDVRY2h5YXF1WU9WN1N1K2Z4Vk1hVjNkYzBSRTJTNm1VWTBnTHQycE1jWXFyS0lROXcybDFncFFVTXRRWWNtbWJ0NURUTnhkaG5VQ2pRcXRiSzlTVVN6dnJDMG1taGhFMWUyRlMyK294eXB5L1pBU3V0a210angzdmNCQzI0UFg2NW5icWtCQ1JoZmpTOWtJWVBuZWU4Y01hZ1ZPaEkvM1QxZkFtZHRBV1pzQ3N3VEpDa1FWTmEwcVdLU0tQT3BIQVVoRDlEcmJWY3lvWWt3cWh2aDE3dllBYXlYTFF5S0dZZHhsVURGcDQ5NHJCWFJqWWdPMTdERFlldE5JVWovZXpwNlMwbG5scEV3c1dtSk1rT3dzS1hlWktFQWpJSG4wRVFKSVNhUkJjTzZVTUlOejdwL2JFampudzRmdCt4bUR2a3N4WDRHMnJJcmlzN3FhZUt3QUZNUDJPaTduNGNyaXVad3RwU1V3cGZMeFNuT1JTcklxdXNjNVpGYVh5c3FSV2ppWjJEeUFXRUlMMzV0VlNvUUVsRkFDak9lR0dTRTdBSEVRZ2RvL0xTdkNPZ0dCdmt4c21EYnZsUzNGcDV2aGFCMlRBR3FSS3JLS01yaExWcGFHekVWalowT1F4RGhhQ1RBK1F5UlIxZDE1YVF6ckpudEwzUmlic2lwakc2amxnTDR5cWJTMHNOWWcxZTg0dmhiQlZyRWxLNjRDVWNXWVhEZkt4aHBJdXhpVkpaVXhzYk15L3VSQktUTlJRNGtRM0xkUllMUzBySmpSUGxUUHFZNmdkSnNFRGMrYVFYQW4rSGdzTlVDYlJ1RjBPajB6d25BN2JXRGtiaE81RW5zMDBxZVFoUzFsYUJNbDVNL2NBYXhzTEY4ckt5cWwrVGY3RUxMRUd1L2l4aWltZEN2bzBUamZwakt3YWdnZW40ZWg1djdMb2tMS2JMdXl2SGhjWkc4ZGhHckVEeDdIZzkzWnBwSkY3cUJxTzNpVnZlWEVEUU5Jbnplb2U4WXE2ZVBhWkJaMkp2aU0zVzJVQUdvdGVrUkNBR3E0RWtGMVgzRE9uUjExeVJzQkwxdFJhMFBWY1ppTkZYWjJjMzRGc2t2b21JblFRNmx6cEpvWmJKeGs0M053S0pGQnF1SlNzckJ5SHlkeEtPblR4UUFTQm1TM2orSk1uc0hTbGEzRWM2SzlWV29KVm45emZqd09NN2hxWUFBcUpRd0UyYTNuQTQ4SjJRR2VnUmtwWk5pdlNZK3lzM0VrS2Q0b0pJd3N2SUhsM2NXZ0x0NWs0Tkg2T210TFdkcHVyT2t3RU11cFljN2VNdERSaE9jSTJ1aTVKaFZJelh6THl0by9HQVB1Wm95bzh3a29kdVZnSmdsQ3Q3T2hHYmdJRDRNcTRzaSs2M3pVUzFGdUZGWEZscXlhajJlbUhsTE1jQnFZdTBGTXVSMjhCYkI3bE94Uk1TaUNRWEZoQ0t1d2toWitwWURpR1NnYnNLS1Y4TWlTUnN1SFNJV005cmtsUmlJbFpadXFYanNRSzhvb1lKTWdxM0pLV1ZraEhiaHNWeEZVenRoT1dQa1lpamNieDU0SUtzU2RUK3VMcjNjckdLeW9ZZ0ZpR1I5aUJrNGtmbG9VWCtKSWxRUlFxYWJtcGduaHF0cFFwYjZSVlExV0g1RG5yUzRoRW9HWnFhZXJRMmRoRmJ6OFhlUHhTaG1EYm83MGVJU2pvb3JPMnZLOFNKWEk0U1VtRVU0eldLRHpVRHRXVFl3N3hYbGJTVEVqNEZSZzd6S25Lb0dSQUx2MEdzOVRnYzFCcEN5d0daUlFBdHFWejJ4ckJjQU16RXBmWndGU2EyRzVXMFFCRmpTTWFwV0FFRmEzSGNHTjdDeER6RUN5SWtKOTdxd3JxV05UV1ZvODc2UFBzalBrajJ3dmdyb001bExaS01FVEtWcWwvQ3ZuV1ZGaUZhL1N6SlVRd2tvWnNyNjdZNnZsU1JWMy8ydG1OVE9ZM3ZuYXhZd011b1BLcWR6UjF3N0lxSHltbFB4YUFUaGZVN0tvMlpYWWo0QVlKSEwra05kS3dSUVlFU1RSYTVmc1VaL3JWQzFUTVR5V1Z5WW9xTnR1emFIc015djJ0dm9hcnhkZnF3WWdVMWF4Rm8vY25xbDFGR3NxSyt1QVJPVjhCWDRHVThXY1pUQVRpMnE3UWN5aTBPMFYrR2hXQk1OUlVrbjhIMVNzV1ZFNUJ5M0dpMEVDcVVlSm9CZkF0RGE0YW1rZFhHMzdBR1A1R2dlYjg0cDdVYXpwb0tSemRGemVROEhrb0hHeHByS3kvSHBtNXQxMnA0N0o2eFRZREV6N3VJTkVYU3V4WVh2RnNrWUFjK3lTeEg5c2Y1ZnRLelU2SWJ3VkJjVUdnNWU1Rk1DRVhTRXJaUjB3R2F5VjE5d29NOWd1UGpUcUpkVlRxUjR1RTRuSm5MbGRXVmtFQ0NaTGQyVkxGK3h0YW1leDdJcGlyaVNEVXB2cnBuOWxyd0dNQ0h5cHBNSCtwczZMSUxzdUZHVWoxWEVPWGlxYnFTSFBVS25DbHBXVjY4a3F0VVJWTkRZNFROYW9jeWtvWWVUVTVuZ0dFUWEvUzFEbm5FNEFlWE1jS2pIUEFtRlZqQ0JFTmFleUxWTkhmcjNweDh4VXN0Sjk0aElwZkg0SEtFL2VEYUFySzZsU3lWVkZiZHQxZ3hUSVZrM3BwcFZsRlhpNHBFaFZCVE9icXVvaFU4NU1MWG4xaWFodlVrSEpqU0NNYzAxdExGdmVWVkJ4MERvZE02amZ0Q3U3RE90SXpZeHJjMHFwMUpHUDJheVlGejJHYjZIdk1yTzhjbkd0VjZHam0zdUltU2ZEMkdwV0s2dW93YlpHTXhGS1FDbzFwT010Y01YRnBSc3QraFhHb0FvbUYzc1NUQkdnVGdsYkJLV3dzUTN0WnFhWVNwMFoxQ2ltUkRXRmNDSlVQWUowMEJJNUZrS1lOb2lmdVF4bU44OFNXVlhXTE1hVXFxcWdDMEJtUUpSNnNrM3U5TkNmNmpZTFh4QWZxc1lFZ1ZMQWhSWTJBdGd0ZmxaTkZtRnloeGRyTGtBZFdsazREODhNMml4SHllcElkaE1IckcvaVIxWkd0cTBNR3BiRGJSUFlPWGVTWTFNNk55NFpzdHZHU2t0SytYYkZQQVRqMkQzNzFzYVBFc0FNWGhYcnNaMGttL1hTdGtoaE15QmZzYTZ1WEZaZTJWQ2UrWU1yMStHS2d3clF5TllxMVZSckIrRWl6QW93Nk5zZE5LY3lWRWtZZU03M3lzNnE0a0FIcDZCaUZrbFRrSXJWQzVvWVY3dXp3T0dDejRVSjBTdHEybFdNSnk0d3RiK1JldEw2dFpGaWNuSm1CdzVVakN2WFhNWlZKWDJNUWtiZitYTjVFV2Q3OFZ6OC9KRXNNWlRCaUtOenNtMWluTFJVUTc0SDROaWRhcUk2OGo1c0FGZ3hjUnZlQzdpZUxKWGZRWXhqWloyQ3NpV0Zld1pYSm1CSWxaMXRkdHJYNGhTdWF0ZUtzby9SWk90T0tXMm5tcTFvVHplSzZkUldBV3UyTlJWYjRocTBTWG0xR3Z0dWdIcmJyNUlYcW1Ta3RnNUN1REUyTVNsUHdzWTVrTkUyV3AzQXFpWmJXVkxBeGlCRisyaUJaYnVOajZNQjZyc01MQzdGeWFzYVlEeW83S2tvUHlFdHczcEVNWGZQdnhBSmkyakFRUWdqcnowckxJWlNXWmxJb05od2Q1eEs0QVI5bVlOaldBYUxybnVJbUplQlZOOXpCT1JPYlZ2YnIrbVRUZkZTRUpMU1JuSG83aEVKb0lpOE1GcWp4bXZnbUY1VVJaejR6TEZnWlo4Q3R1Mlg3Z2dWY2NLbTlnVnhJc09IcXhYZ05NS25GV1pZbmYxZEJuT2hheVhxMTdRd0ZsV1cwOWVOS3lWSkZtWHFhT05HQTVhQ2VnTWJKM1VVa0dZMWljM25LV2dqcThxZlZZR1FHMWdSdDZyczYyYTZIaXFxVU9xZGVzSzVObVg0bkdvZkpvaUUxZDBkRjlsVlZrdlQxL2tFRWFhQ29ZT3dGcGNWY29MTSs3NjY5UHhDOXJXcWt0SDBzV1VZbGQwVkNwdUJaL3N0VlJjR2d5OVdYMitVMVF0aGk5U3pBcVN4elpzeStPaUZ6QllueVNHVjZHa3U0NHJEOEJDT1pCVjNCdkQ1K0FLUkhOd01Fc0I2RXpIbkpwa1RBZWlVbEVHa2NFQ2VCNkdEWlRwNVlFSlRsdmRya254WWpUbGxNa2ZOdFh3RGpNN3VWaks1SlhVVW40M3JycXBLMmp5dGF4SFcwTTVHOERDOHJ0SE1ZczdLU2dkdVZRTUdUWUZxRnZWUzZya0Qzc0RKNDZhZmRZRndvcTExQU9LQ0JMaHZ3b1VnYzhJR0FOeWNSNmtuWnJkSlBkc3V4bnlqZmQzRm92VGxSTWRFZHRPbDVDTVY1RUhzWFFCaXM3VE93dklEWmFHajJWbnBiaDdjcEs2M1Z3WUVNTHdxYmp6eWw2OTlzYXdGRmtGMXlxalVVMzFIZkM2c1cxWkZWRnVYVlhWZ3o5a2VFYXcweXMxbFdmbSthelFBUVNXQStoS1lWZnNaalBuY0FjVUI5b0lheXkvVVpYUk5ja0RHamk3N0dzV2J2Qm82dFByV1BxT3lWa0JVcStJTmVxcHpOZFlzL3UwaWZoNXFtcHFJVyszM0pWU1Vjd1k3MEtMNFU5bFlkVTZsanRTbHM3bG1maTlnM1l6ZVFmVmthR0ZhVjNPRENuYUQyTjh3c0VERmtsRTNSek0zWmdoZFlrV0hzc3pxNzBGSWVjbktrVmt0OGV6TXpScTlia0d1S29qUkxCVlNvZDNZMXlQcUtnWVc3SlJRVFBWeXk1eElZTGpPZ3hnVDUyUktKVVkxZE9ySWlSZDRmdXRReC9BNUFjU21FanowdkZXcmtMenZiV0F1OUhPV2JHZ3hGazFWTlRwbkJLazZUZ3dpc0kvSGN4WVhQMXVBV083MlVMRmxCVHErYVN1MlZUVXM2aHJ4TTJDRitoRW9yMVZJQTlabUZVYWFiMWxTU2dac1ZzNHN4ekhsVkxvSkhyOUg0RGhPTlRrSTFYQzAvd2lZMk5vV0FHNVJsbkhGbnE2b0xjY3BRZGRNdUovTzE3SlZBNU9ITGkwQnFDenRxN1kxKyt1Y0NkOThxTEk4TUlIQlYvY0tqeFFUbWUzaEZCUzNNeUNxbkRzdXltMm84MEhqdkZGVHRyVVJtTmFHSnNtVmFoSW1qVHNVWEt0UVpUQVZzN012djgvK2Z6VXJaQVhjTEo2TTRrb2U2WFAwYjZTbVdXTkR6eVVwUThibCtMdFd4NHR1cVozNmNSWVYzeXVWeFBOd3ZJaXFpUUNTbXU3c3JnVHpSNm5reWhwQ2FyWHdGeTF2R2Q1aVAyY1kwNmxGcjVOamhoZzFZNitOQjI4ZnRiSzgzczhyZjdrTEpiS3dERlBiTGcyNWEwQWRaSkVpcXI1cGhpeEtNRGxSVXRjc3NxMWhyaUxxR29IK3plTmdWbTlPZW1qc0VUVjhKZEYwTkhua0lGeFdZMU9CNFlycDdydFdKN05nQUFBUFhrbEVRVlEzb05zNW5wbHlWZjh1MkZvTHUxSnJIdmVhWldRanFBa3NodEZhMmd6c1NHM1pwa2J2ZzNIYWZGOXNsUFBsbGRqRmxLODBHeXNtOE1yNE1QaG5lTldFTlBHakFJcG1pbFRQQVRkVFJUWGxDQllIWUFRdVB3QTM2eElwV3RHTjRxM1kyTWhpR3NVcHVTU25sRUpSRDhQb3JDN0NGWVZ3K0Y1MXFUaGdhYnhzVHhXekNHWTBaU3NiM2xmcUF5ME9QTmpOeTh4aVFRS3NIWUZRMkhCWlZ2VmJCdXEzbTFvV0thanFhb25zTTZ1WlVyNkNqWFdOWjBsNUUzaDNqVVJtYTZrUDNNSklpeTFMbStrYWhRcTQxTjJpWmphNXNqdGxMWU5aSFpySDZxVUdtNHZNYkRwNlJ3MkNGbXZ1eUZrckJjQ3lNdEZxQmFFQ21zSG9LOUJaMkxBL2xKY1JxU2FEcW5hV2JyWmRHYXozRExnSXZCbG40d29HenRieUpHcXNsd3hraGhIclRqVFlGWEN0T29LUzh1TGRvZlZkQWJPeWxHVTZubFlwWFdadHM0blhCcTZXeEppdE1Ob2tIVUpuYm5KcGxRbSthR3BZMmE1R01WMlFEMWhSdWJCUEZLZHVtZjVPSGtMSHowRjlsdUU1a2pCalJhMG5GRTVDVUdxSHczMk1talo2eGtnSU5WblNuWjFWWlN0SzJxS2xSYUxsUWdLN3VUcTdKRlhKd00rM1NPRUt5aFpOSSt0SjBJNXFNWXk5azJxSkQ3ZFZXZHFLWGEwQ0tOUjBDY2pnK0IySVl1MmZjQlpKWmtNRmdNMTFyMFg5MndpbGdoRkdnelZuZXhscUI3eEw5bVMyOVNpWVVWWTJuWE9aak5CUnN5RHNRUFJXVzVoclo0WGNkQzRIVldSYmpnSnI0c0ZvZks1U3pqUTdyaEkxVWViZFBkRWJqNnNxSXZUWlFaNXZhMDhyQUJzQVcwVXhlV3l0QWs3QTJLSjlacHh6Q2lvQjI0WEZ0WUFlWFl4cjZhblNxaExncHBFcVdiR3dMdW5UZ3JWK0lqV2xMMjlsamFBbDRFUU1Hc0VycDRhcGVaaXF1d1JYTFhBcU9DZXJ1MzJtbXlkYzZvV1RTV3BGQUdkemVUQjhSVEhWTUV0bE05MENiYlFDWWhQanEzZWdZcjFGR2RZSVFqaXVER1o1elovQXpvYktHT3lMeHRpNmM0Und0djJhbnlXbExJQ25sTGh4SlJYdDZBNWViREJXRk5PTmJ4V1oyZDAybW51NFM5WUVDcGVwcFYxelNXUkJXeEhZelZJdjFDWFNvdXdxcVgzakJCQkRaZFlRYnBUUVc0WlFsUzhyNWtINHN1U1JtZzIrKzNKTjEweDFQYUFtRWttdFlsRWRlR3BKRU02a091Q3FDUjIyb1N1amo1SVYySGRUMHpqNXByTEtUalhGQVBqZFFseXE3eElCeEFRUDV5TWN6RzRWeEFLdzBuNmlsWjJRQmNlMnBMdWxrdXh4cW5vSXpGZmdxeXFqaWw5UzFWTndCckZtZXllb3BzOHlPalpVeWJaZGZTOEN1YVRJSnVtenM1dE9EYU50THBGRFEvUGNKR3dlTGhtZUwxbkIwS3FpVURTY3NpVVZEODlEaTNIdHJLdFNVTHczUkxpeWdaRCs3c0Y4SlRPYmdZc3JHdkROVUZSR2wxaXkwTGwxWWtVYzJhSllNb2c5MjBJOHFXNllEQ2cxTXFrMEpISkZLWGtiZ2JScmVJK3FwWU5PWkhyVmNEVWJhN3Bqc3BoU0pOdEs2dXBnUk5BVm9PUzBtdWdCZU40YklaZ0hodVBaL3MxRU5hWDZLc1ZyK1lOcmgxTmI3aXBSMFBFNXpiTlJlZ0NickhSVXc2WWYwN2RMQkpsMWY4S0I5YXMyVjFuTnFBc2w2MkxCQmhlaHdhbGVya0htQjFKRklFWktTRXVzZGw1SlFqMW5KbEhYU0NGMzQyZ0o5Q1lHclhlbGtuSklYcVZQOHNEK3F0cGxDUjNYSDJxZktxMHlnTXArS25Wa0t4TmxaOG0yWWtJbFZNaUNuWFV3bDdxem5CS1N2UXozbTNQdDZvUWJYTzViNUZpeENoL2ZIeFVRVy9BRWNLNnpDTnFLUW5MOXN5d3FtS3V3dnFTWXpUL2FQVk5OcFZ5aHZSVzIxYXFjaUNzamRXdkJ3SUxVdmg1VnlDemJXb0MxcEpqSjY4MENXc2wrdWRLQjZUNVJ3RzFtbG9obmxwYmc0N2l6NVU5aGEwRkd0bVJMRllCdE85OXk5N0FwMHorWkRUQW9nNmtTTFpzTUhnL0lGa2tncDZDcHZVMlUwY1lWU2RubWtqd0JkT21YYnhUV05XenVJYmlwTWlvVnhFY2taRW9haFNPaXkyTTNLMGpjQzFMaFZEd2FxRzBadmtjV3FDbnJHNEdJeHlrcnFsYldkdzZMUXlCYVpSOEhtTFJJaFFXc0hzd0Q0MlpYVkxOa2Y5bCtGbFcwSFZRMmx3RnNDL1oxRmR6bFFSMEthUGZvK0ZkZnUrL2R3VlJJQ3UxQ0dSN0FFSWlBaGMrQVpVRjBrT0JhUHhtVXFnNGk2NHZRblU0bkZEWUo5TnorMWZWWHZlSDlxbXIra1BJTHg4b0tjUlYvQkZieGJFMEpNVDBrU0Q0dzZML2xOWThvY3NxYWdWZFUzQTNNanhoeGNHdXF6c1BINGlycGFvdzFxNk95clZqdnA5TnBjNTlFOTFMbGRib1lWekpXZGltV2ZBVzJTTkVLY0RhWDJGbUJMTEEvdUt4bG1oaDYxM0lzMVVSUUFwYktmdHR3eEwwMnE2T254NXBReFNiUG9qQWcrdjVoQW5ONkxIVlJEWElzdkt0UmppUzBxSlV5WlRBWFZiQUs4MkVsRkpXYVFkVm9xVUMxVW50N0JWYVRRdWRNNlN1cWV4alFKTjQrMGljYXh2L3V0Ykt2ODNFVGJUOEg4Z2pjT0t4T0ptYlVhNk9PVlhodDNkRlk2ckh2OVhvTnpGTGNlRUExbzgrcEttMExBSFBIWjJyWUtqRnEwaGZaRml4c3FISmdEM2VENW4rVTBrYjFtRmpYa24ybHZNU1NPc05FL0NkSUFLRjBTeXRxNnVyT0hVTjVnd2c0R1pvc2dibWdnTTV1Y3JhMnFyUzJJZzFjYmlCQmN4WXpnelVETkxDdkw4R2JaWE5wNk9SeTNMbVMrS2s4M3pSSUFLNkExaW9LYTJJOU5hcEl1aVVGZGZDOTc2NlBGWlV0cVVyNktiV2srelpVMWEvWnJJWEV6dHJqVE9mejdod0t6aUNlWElhcmFIdGJaSU16KzJwR2dhekNtdzRxV0FGdkVkaG9kWXAwWHEwcFY3RzFZV1lXYk80cWhHcTQyK1o4Qll0ckxXdmx1TlBwWkFlYUZGUzF2dWJQZ2JneHNxY3BuQWFzekJvdkthRm9EUThCR3RqZlVPbDROQUcybm1RVjA0ZmVKZ3VtdlgyZnNyUUVXWmdoTDBKblZkWWtuM0RPWkllUk44NlJxUFdDbXN2R1ZxRU1Sbnd4UUF4d1M4RU1ZbzNJem1ZMitCQ2NMcDRNS2l1eXVoSW1hbWxiWkZjTm9ObDd0cCtSSGQxOFpqUUlSS3lYZEZSaE45OC9oeUtxd1hXTm83TzF3aWFYb0hOMTA4UkVaWldFcTZncm5JZmp6ZWc4amRSZjFYRUw0a2tYYTViQmpLeG9LYWxqQmplSGxWeFE0R2F5Y3BXNGxET0FLdG5UeEhBdE9mek90WndIQU03c3FWWGtWNnl1NmthcDFuSGtYS3FXRi80WEhxamVuTktxQmpwUjNsMWNoM0VqZzErRXNnZFFoc2RHMEI0Rk05c1dBVldwdUF5aXdUUGxlWnh0OVZ5WlZTMnFYZlJlV3FUQWlscHI5QXBvV1RqeHltaXQ3TndWNEpUcmlaeU9BOUIwazdIRmZVTG91cm1LWUhWblJRdnFHTDVITUhkcUZjUjJxV3BtY0s2ZVR3eDJkaXBXcnZpRGlscitmS1dxM09XUldkSEt3QTRldTh3amNoYmVSekZpbHFqalpOM3VmQ3Bma0owL3NjVnBuWWs2TDBQSTc3bHhkV0NaODdXaVdtN0IvQUdxdVFTbnVqR0tzQjhDSm1pSnE4cTFwS0lWV3lxT2lUSzY2cjE4Qk44cjc0L0FFNzFmZEMzeVBTMk14ZE9wbkUxdGxWeEQ5Sm1WT29nZ04rcjRQakFYVkZQYTNFZzVqVkpHRlZVR05vbEgyMEdWclVCN0JPeVNXcTZXcVlRZFdSOTJwY0ZNWU13Y2tiU2dDS0NxRDY3RGlpV3UxZzhNUUM5QnlmY0ZxVzFMK2pMNzE0cU5DdXpub1N4dDBkYTJndFdOMUc4RjBCSzBOTjBudWltZWxVRjlkSWRBZmpPNDRVVDNDalFMb1VlTEhKRlRPM2dtcFJ1SUlPdndCUUNicU5lbzNxdFo5aUY2eFZLMTNHUmxvNHpxaW1xK0NHZFRpUjF1Ulk4b3FnRTAyaFpCYTc5a1pYUE1xdXhSSEtsYTJzYVpXTjRtUnFaVWowdkxDS2hraktucU9RSE51U1pWSm9LdkFxUzF3cEVxdXZXREMxQjJ5cHdyQ1BzUk1FUFZUT0RNTEpNRHY2cWVLWHdpMkpZVjVTcTRxS3l2Z0dzSENMaXVqMmpSNTlWOGdNcVNKMkZKWlJYRUhWUkhqM3NGUHJjdDZPcHFsVzFHcGF0UWR0MEd2d2ZNNm42M0luc0dWRmhKR2FCcWdxcUlWNklzWGxsWmd5U1BxNFIzYm50M3dpNWN2K2NOMnlxUUxXMVQ5NUtZVnNXV3RLazRjQjlXNTNXUVFmbFFZUjZXbDRIYUpaanZWRTBENXl2cStSS2daQ3M1cWRCRVA1c0Q5NGNBdlFMbFNnTmFTTUF0SHg4OEJ1TlE0MXpkRnNYMzB6S2JjczBNTEQvaWhrcFF6bDB3aVRxS0xUZmJLbUNteVlJQ25LMEliYWllQzRDRzlpU3lMUTdjSU1HUXdhdTZUS29xNjBBcGwzV040MExacGNhMUNLS0s5VlF5eUlFbjh3MEY4RjZDTDJoOG8zaXhHd0M3czdFV3pDT3FtY0FwWXhZRDRqc0F6VlMwc2wydDk4cEE3dnJLb3BoQ1ZTb25iWXBnSDZtdlNuMjRwVEJWNHNkdFYzQnRNcTVrODJ5K0lBRHZVSjB1QWxrQ1ZUeElhUG0rVU51L3FrVjRGMVR6SFhDR3JYSUFxSXRCS3lwcUs5OVZ0QU9WczY0TzRPYlg3cEhMVkNwWUhjUm13dkxSN1R2WUFLQkJONThMR1Z6RHVGeitoUWJXZ25jUXlDWkFrK1Zic1BTb3VmOTMyNjFpWmdtZkNwd1JiQXZxbVNxcmlVMlB3aGphb095WXF0SWVnVlhWaVRzbXl0YTZiR3lTcFkzZ3lScnBJeUFlYVdERHh0cHNYd0t5YWxNREtOUDdZQlhNcUVza1VzaTJ1QzhGTkFQeEFLVFZmVDFvNlZ6TTBFMGpGKzFyV2NVdUh2ZHlnN3Znb0ZwbFg4SHB2SHBNQ09NUlVQSHpaa0luc3FsRktOWC9FSU81MkUwU3hTek93b2IyVm1STFc1RDFYSVUwcmJnTTFBeldneUM3ZmU4Rzd4VUFLL3RhRUJhdDdsdXF0eVA3RW1zYUpRT2o1Rittcm5aZkN1WUNmQlVBV3dTaHlkNnBNWS92QUhHMVVxT1lwYkkvZ3k1VDBDTUttK1VPM2dGdUM4NWRnZkRWZWd1UERmSVRySUJMc0xyY2dkaDNDRmdGWmphS0o0SXYzRjhBTkVxdnV4UjF0VktPZ0xvQ2Exanhib0JBa2o2djdqL2ljRmJBN2Y0cmZSblFETFJWaUcxM2kwdnFCUXJZVnFCYkFEWlQwWnBpSG9TenZRcG9wS0lGUzNzRTFIZkJXbEhYZDBIN0xuQXJxdm91Z010bGpIQmdabmgzRW96L0JLakxNTDRaMkFxMCtoRUpyOWphVlVCYnZOekNJVWlyb0M3QVdtbUZ3NG81QUszTXRCNVZ5cFpNU0ZnczA1SnlHVndsd0Jxc0VHQUFhMlpVMUNqVWV4WEdzRTRyS3JpaWxCdkZ6T0tLbzNBdUFyb0U2UUZRVTN1OFlwTlh3UzVrKzFUWnQ1VXJ3b3VONEtpVUV3K2szWldEcDFSWEhOUnFYYjIxVHMzOTk0NXlaU2czVm5aRk5ROUNGM1hlWnlyNURnQlhLaXdDTWEyTXhlVERZWGdQMUZzZjlRTktaYzBrODFSSmszcjZFUTNyQ21CVnlMTDc1RWpaMXBJVkRIb0Z0aU9BSG9CMEJkVFZ5bHFCc0tLS1MrQWVCWEpWTFkrQ1hBU3VHdk8vQXVxN0d1RWpEZkdLZzFvS2Exei9kbW1pOUk5U1VHTmhsMEF0ZnVsSEFhd29Zcm5Ta21OWEFWdUdFaHJFVlh2VUYrQTVDdDJQcU5PakRldHluYTRDbWVVb2xtZVhMTjRBcTdDNVNqMTBRN3lqZ2wrdDZDTnhTUkhtSTVYK0Nwd3JlWUIzUWZkcW5hNHEyMUtkQnVjNEdvWnNuNDlaT09pVmlud0hxSzlXemp2Z2V3ZUVoMkFVNSt2dHhaOUNkOVdxa2g0OVYxOEU1b2o2dlZ5bjBSU3RBeUdJTzVlZFhSS2Q1QjBWR1ZYcTJ5cjN4WXArNVV0K0M0UUo0UDFOMzM5cFFNalJlamo0dmIvRGNyNnJRYzNPLzByam10WnBlWUNCaUNIZkNlbVJiTmhiSy9wTlVQYzN3Zkt5NWYyRDdPbEwzL3VQaHZlL29VNFQwRjhmK1ZOTTJ2eW9pdjBqSytLSFFmZEhxKzBibmN6NG96NzMvK1k2TGJLdzFvLzVCN2VPZjFSbC8wZHU5Qjl0bi85YnZyZi9qK3YwaDZ0dG4ydHAvci80ODE5eTQvenY1MzkxdXZ6emZ3RGlmejZwaFQxTVBnQUFBQUJKUlU1RXJrSmdnZz09Iik7YmFja2dyb3VuZC1zaXplOjEwMCUgMTAwJTtib3JkZXI6bm9uZTtjdXJzb3I6cG9pbnRlcjtkaXJlY3Rpb246bHRyO2hlaWdodDoxMzBweDt0b3VjaC1hY3Rpb246bWFuaXB1bGF0aW9uO3dpZHRoOjEwMCV9LmNvbG9yLXBpY2tlciAuY3AtYWRkLWNvbG9yLWJ1dHRvbi1jbGFzc3tiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JvcmRlcjowO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6aW5saW5lO21hcmdpbjozcHggLTNweDtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGV9LmNvbG9yLXBpY2tlciAuY3AtYWRkLWNvbG9yLWJ1dHRvbi1jbGFzczpob3Zlcnt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfS5jb2xvci1waWNrZXIgLmNwLWFkZC1jb2xvci1idXR0b24tY2xhc3M6ZGlzYWJsZWR7Y29sb3I6Izk5OTtjdXJzb3I6bm90LWFsbG93ZWR9LmNvbG9yLXBpY2tlciAuY3AtYWRkLWNvbG9yLWJ1dHRvbi1jbGFzczpkaXNhYmxlZDpob3Zlcnt0ZXh0LWRlY29yYXRpb246bm9uZX0uY29sb3ItcGlja2VyIC5jcC1yZW1vdmUtY29sb3ItYnV0dG9uLWNsYXNze2JhY2tncm91bmQ6I2ZmZjtib3JkZXItcmFkaXVzOjUwJTtib3gtc2hhZG93OjFweCAxcHggNXB4ICMzMzM7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpibG9jaztoZWlnaHQ6MTBweDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDotNXB4O3RleHQtYWxpZ246Y2VudGVyO3RvcDotNXB4O3dpZHRoOjEwcHh9LmNvbG9yLXBpY2tlciAuY3AtcmVtb3ZlLWNvbG9yLWJ1dHRvbi1jbGFzczpiZWZvcmV7Ym90dG9tOjMuNXB4O2NvbnRlbnQ6IngiO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtc2l6ZToxMHB4O3Bvc2l0aW9uOnJlbGF0aXZlfSddfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOlVnfSx7dHlwZTpnM31dfSkse2hhbmRsZUVzYzpbe3R5cGU6d3ksYXJnczpbImRvY3VtZW50OmtleXVwLmVzYyIsWyIkZXZlbnQiXV19XSxoYW5kbGVFbnRlcjpbe3R5cGU6d3ksYXJnczpbImRvY3VtZW50OmtleXVwLmVudGVyIixbIiRldmVudCJdXX1dLGRpYWxvZ0VsZW1lbnQ6W3t0eXBlOlphLGFyZ3M6WyJkaWFsb2dQb3B1cCIse3N0YXRpYzohMH1dfV0saHVlU2xpZGVyOlt7dHlwZTpaYSxhcmdzOlsiaHVlU2xpZGVyIix7c3RhdGljOiEwfV19XSxhbHBoYVNsaWRlcjpbe3R5cGU6WmEsYXJnczpbImFscGhhU2xpZGVyIix7c3RhdGljOiEwfV19XX0pO2NsYXNzIGIze2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhKXt0aGlzLmluamVjdG9yPXQsdGhpcy5jZnI9ZSx0aGlzLmFwcFJlZj1uLHRoaXMudmNSZWY9byx0aGlzLmVsUmVmPWksdGhpcy5fc2VydmljZT1hLHRoaXMuZGlhbG9nQ3JlYXRlZD0hMSx0aGlzLmlnbm9yZUNoYW5nZXM9ITEsdGhpcy52aWV3QXR0YWNoZWRUb0FwcFJlZj0hMSx0aGlzLmNwV2lkdGg9IjIzMHB4Iix0aGlzLmNwSGVpZ2h0PSJhdXRvIix0aGlzLmNwVG9nZ2xlPSExLHRoaXMuY3BEaXNhYmxlZD0hMSx0aGlzLmNwSWdub3JlZEVsZW1lbnRzPVtdLHRoaXMuY3BGYWxsYmFja0NvbG9yPSIiLHRoaXMuY3BDb2xvck1vZGU9ImNvbG9yIix0aGlzLmNwQ215a0VuYWJsZWQ9ITEsdGhpcy5jcE91dHB1dEZvcm1hdD0iYXV0byIsdGhpcy5jcEFscGhhQ2hhbm5lbD0iZW5hYmxlZCIsdGhpcy5jcERpc2FibGVJbnB1dD0hMSx0aGlzLmNwRGlhbG9nRGlzcGxheT0icG9wdXAiLHRoaXMuY3BTYXZlQ2xpY2tPdXRzaWRlPSEwLHRoaXMuY3BDbG9zZUNsaWNrT3V0c2lkZT0hMCx0aGlzLmNwVXNlUm9vdFZpZXdDb250YWluZXI9ITEsdGhpcy5jcFBvc2l0aW9uPSJhdXRvIix0aGlzLmNwUG9zaXRpb25PZmZzZXQ9IjAlIix0aGlzLmNwUG9zaXRpb25SZWxhdGl2ZVRvQXJyb3c9ITEsdGhpcy5jcE9LQnV0dG9uPSExLHRoaXMuY3BPS0J1dHRvblRleHQ9Ik9LIix0aGlzLmNwT0tCdXR0b25DbGFzcz0iY3Atb2stYnV0dG9uLWNsYXNzIix0aGlzLmNwQ2FuY2VsQnV0dG9uPSExLHRoaXMuY3BDYW5jZWxCdXR0b25UZXh0PSJDYW5jZWwiLHRoaXMuY3BDYW5jZWxCdXR0b25DbGFzcz0iY3AtY2FuY2VsLWJ1dHRvbi1jbGFzcyIsdGhpcy5jcFByZXNldExhYmVsPSJQcmVzZXQgY29sb3JzIix0aGlzLmNwUHJlc2V0Q29sb3JzQ2xhc3M9ImNwLXByZXNldC1jb2xvcnMtY2xhc3MiLHRoaXMuY3BNYXhQcmVzZXRDb2xvcnNMZW5ndGg9Nix0aGlzLmNwUHJlc2V0RW1wdHlNZXNzYWdlPSJObyBjb2xvcnMgYWRkZWQiLHRoaXMuY3BQcmVzZXRFbXB0eU1lc3NhZ2VDbGFzcz0icHJlc2V0LWVtcHR5LW1lc3NhZ2UiLHRoaXMuY3BBZGRDb2xvckJ1dHRvbj0hMSx0aGlzLmNwQWRkQ29sb3JCdXR0b25UZXh0PSJBZGQgY29sb3IiLHRoaXMuY3BBZGRDb2xvckJ1dHRvbkNsYXNzPSJjcC1hZGQtY29sb3ItYnV0dG9uLWNsYXNzIix0aGlzLmNwUmVtb3ZlQ29sb3JCdXR0b25DbGFzcz0iY3AtcmVtb3ZlLWNvbG9yLWJ1dHRvbi1jbGFzcyIsdGhpcy5jcElucHV0Q2hhbmdlPW5ldyBMaCghMCksdGhpcy5jcFRvZ2dsZUNoYW5nZT1uZXcgTGgoITApLHRoaXMuY3BTbGlkZXJDaGFuZ2U9bmV3IExoKCEwKSx0aGlzLmNwU2xpZGVyRHJhZ0VuZD1uZXcgTGgoITApLHRoaXMuY3BTbGlkZXJEcmFnU3RhcnQ9bmV3IExoKCEwKSx0aGlzLmNvbG9yUGlja2VyT3Blbj1uZXcgTGgoITApLHRoaXMuY29sb3JQaWNrZXJDbG9zZT1uZXcgTGgoITApLHRoaXMuY29sb3JQaWNrZXJDYW5jZWw9bmV3IExoKCEwKSx0aGlzLmNvbG9yUGlja2VyU2VsZWN0PW5ldyBMaCghMCksdGhpcy5jb2xvclBpY2tlckNoYW5nZT1uZXcgTGgoITEpLHRoaXMuY3BDbXlrQ29sb3JDaGFuZ2U9bmV3IExoKCEwKSx0aGlzLmNwUHJlc2V0Q29sb3JzQ2hhbmdlPW5ldyBMaCghMCl9aGFuZGxlQ2xpY2soKXt0aGlzLmlucHV0Rm9jdXMoKX1oYW5kbGVGb2N1cygpe3RoaXMuaW5wdXRGb2N1cygpfWhhbmRsZUlucHV0KHQpe3RoaXMuaW5wdXRDaGFuZ2UodCl9bmdPbkRlc3Ryb3koKXtudWxsIT10aGlzLmNtcFJlZiYmKHRoaXMudmlld0F0dGFjaGVkVG9BcHBSZWYmJnRoaXMuYXBwUmVmLmRldGFjaFZpZXcodGhpcy5jbXBSZWYuaG9zdFZpZXcpLHRoaXMuY21wUmVmLmRlc3Ryb3koKSx0aGlzLmNtcFJlZj1udWxsLHRoaXMuZGlhbG9nPW51bGwpfW5nT25DaGFuZ2VzKHQpe3QuY3BUb2dnbGUmJiF0aGlzLmNwRGlzYWJsZWQmJih0LmNwVG9nZ2xlLmN1cnJlbnRWYWx1ZT90aGlzLm9wZW5EaWFsb2coKTp0LmNwVG9nZ2xlLmN1cnJlbnRWYWx1ZXx8dGhpcy5jbG9zZURpYWxvZygpKSx0LmNvbG9yUGlja2VyJiYodGhpcy5kaWFsb2cmJiF0aGlzLmlnbm9yZUNoYW5nZXMmJigiaW5saW5lIj09PXRoaXMuY3BEaWFsb2dEaXNwbGF5JiZ0aGlzLmRpYWxvZy5zZXRJbml0aWFsQ29sb3IodC5jb2xvclBpY2tlci5jdXJyZW50VmFsdWUpLHRoaXMuZGlhbG9nLnNldENvbG9yRnJvbVN0cmluZyh0LmNvbG9yUGlja2VyLmN1cnJlbnRWYWx1ZSwhMSksdGhpcy5jcFVzZVJvb3RWaWV3Q29udGFpbmVyJiYiaW5saW5lIiE9PXRoaXMuY3BEaWFsb2dEaXNwbGF5JiZ0aGlzLmNtcFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCkpLHRoaXMuaWdub3JlQ2hhbmdlcz0hMSksKHQuY3BQcmVzZXRMYWJlbHx8dC5jcFByZXNldENvbG9ycykmJnRoaXMuZGlhbG9nJiZ0aGlzLmRpYWxvZy5zZXRQcmVzZXRDb25maWcodGhpcy5jcFByZXNldExhYmVsLHRoaXMuY3BQcmVzZXRDb2xvcnMpfW9wZW5EaWFsb2coKXtpZih0aGlzLmRpYWxvZ0NyZWF0ZWQpdGhpcy5kaWFsb2cmJnRoaXMuZGlhbG9nLm9wZW5EaWFsb2codGhpcy5jb2xvclBpY2tlcik7ZWxzZXtsZXQgdD10aGlzLnZjUmVmO2lmKHRoaXMuZGlhbG9nQ3JlYXRlZD0hMCx0aGlzLnZpZXdBdHRhY2hlZFRvQXBwUmVmPSExLHRoaXMuY3BVc2VSb290Vmlld0NvbnRhaW5lciYmImlubGluZSIhPT10aGlzLmNwRGlhbG9nRGlzcGxheSl7Y29uc3QgZT10aGlzLmluamVjdG9yLmdldCh0aGlzLmFwcFJlZi5jb21wb25lbnRUeXBlc1swXSxycC5OVUxMKTtlIT09cnAuTlVMTD8odD1lLnZjUmVmfHxlLnZpZXdDb250YWluZXJSZWZ8fHRoaXMudmNSZWYsdD09PXRoaXMudmNSZWYmJmNvbnNvbGUud2FybigiWW91IGFyZSB1c2luZyBjcFVzZVJvb3RWaWV3Q29udGFpbmVyLCBidXQgdGhlIHJvb3QgY29tcG9uZW50IGlzIG5vdCBleHBvc2luZyB2aWV3Q29udGFpbmVyUmVmIVBsZWFzZSBleHBvc2UgaXQgYnkgYWRkaW5nICdwdWJsaWMgdmNSZWY6IFZpZXdDb250YWluZXJSZWYnIHRvIHRoZSBjb25zdHJ1Y3Rvci4iKSk6dGhpcy52aWV3QXR0YWNoZWRUb0FwcFJlZj0hMH1jb25zdCBlPXRoaXMuY2ZyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGgzKTtpZih0aGlzLnZpZXdBdHRhY2hlZFRvQXBwUmVmKXRoaXMuY21wUmVmPWUuY3JlYXRlKHRoaXMuaW5qZWN0b3IpLHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcodGhpcy5jbXBSZWYuaG9zdFZpZXcpLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5jbXBSZWYuaG9zdFZpZXcucm9vdE5vZGVzWzBdKTtlbHNle2NvbnN0IG49d20uZnJvbVJlc29sdmVkUHJvdmlkZXJzKFtdLHQucGFyZW50SW5qZWN0b3IpO3RoaXMuY21wUmVmPXQuY3JlYXRlQ29tcG9uZW50KGUsMCxuLFtdKX10aGlzLmNtcFJlZi5pbnN0YW5jZS5zZXR1cERpYWxvZyh0aGlzLHRoaXMuZWxSZWYsdGhpcy5jb2xvclBpY2tlcix0aGlzLmNwV2lkdGgsdGhpcy5jcEhlaWdodCx0aGlzLmNwRGlhbG9nRGlzcGxheSx0aGlzLmNwRmFsbGJhY2tDb2xvcix0aGlzLmNwQ29sb3JNb2RlLHRoaXMuY3BDbXlrRW5hYmxlZCx0aGlzLmNwQWxwaGFDaGFubmVsLHRoaXMuY3BPdXRwdXRGb3JtYXQsdGhpcy5jcERpc2FibGVJbnB1dCx0aGlzLmNwSWdub3JlZEVsZW1lbnRzLHRoaXMuY3BTYXZlQ2xpY2tPdXRzaWRlLHRoaXMuY3BDbG9zZUNsaWNrT3V0c2lkZSx0aGlzLmNwVXNlUm9vdFZpZXdDb250YWluZXIsdGhpcy5jcFBvc2l0aW9uLHRoaXMuY3BQb3NpdGlvbk9mZnNldCx0aGlzLmNwUG9zaXRpb25SZWxhdGl2ZVRvQXJyb3csdGhpcy5jcFByZXNldExhYmVsLHRoaXMuY3BQcmVzZXRDb2xvcnMsdGhpcy5jcFByZXNldENvbG9yc0NsYXNzLHRoaXMuY3BNYXhQcmVzZXRDb2xvcnNMZW5ndGgsdGhpcy5jcFByZXNldEVtcHR5TWVzc2FnZSx0aGlzLmNwUHJlc2V0RW1wdHlNZXNzYWdlQ2xhc3MsdGhpcy5jcE9LQnV0dG9uLHRoaXMuY3BPS0J1dHRvbkNsYXNzLHRoaXMuY3BPS0J1dHRvblRleHQsdGhpcy5jcENhbmNlbEJ1dHRvbix0aGlzLmNwQ2FuY2VsQnV0dG9uQ2xhc3MsdGhpcy5jcENhbmNlbEJ1dHRvblRleHQsdGhpcy5jcEFkZENvbG9yQnV0dG9uLHRoaXMuY3BBZGRDb2xvckJ1dHRvbkNsYXNzLHRoaXMuY3BBZGRDb2xvckJ1dHRvblRleHQsdGhpcy5jcFJlbW92ZUNvbG9yQnV0dG9uQ2xhc3MsdGhpcy5lbFJlZiksdGhpcy5kaWFsb2c9dGhpcy5jbXBSZWYuaW5zdGFuY2UsdGhpcy52Y1JlZiE9PXQmJnRoaXMuY21wUmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKX19Y2xvc2VEaWFsb2coKXt0aGlzLmRpYWxvZyYmInBvcHVwIj09PXRoaXMuY3BEaWFsb2dEaXNwbGF5JiZ0aGlzLmRpYWxvZy5jbG9zZURpYWxvZygpfWNteWtDaGFuZ2VkKHQpe3RoaXMuY3BDbXlrQ29sb3JDaGFuZ2UuZW1pdCh0KX1zdGF0ZUNoYW5nZWQodCl7dGhpcy5jcFRvZ2dsZUNoYW5nZS5lbWl0KHQpLHQ/dGhpcy5jb2xvclBpY2tlck9wZW4uZW1pdCh0aGlzLmNvbG9yUGlja2VyKTp0aGlzLmNvbG9yUGlja2VyQ2xvc2UuZW1pdCh0aGlzLmNvbG9yUGlja2VyKX1jb2xvckNoYW5nZWQodCxlPSEwKXt0aGlzLmlnbm9yZUNoYW5nZXM9ZSx0aGlzLmNvbG9yUGlja2VyQ2hhbmdlLmVtaXQodCl9Y29sb3JTZWxlY3RlZCh0KXt0aGlzLmNvbG9yUGlja2VyU2VsZWN0LmVtaXQodCl9Y29sb3JDYW5jZWxlZCgpe3RoaXMuY29sb3JQaWNrZXJDYW5jZWwuZW1pdCgpfWlucHV0Rm9jdXMoKXtjb25zdCB0PXRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCxlPXRoaXMuY3BJZ25vcmVkRWxlbWVudHMuZmlsdGVyKChlPT5lPT09dCkpO3RoaXMuY3BEaXNhYmxlZHx8ZS5sZW5ndGh8fCgidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZ0PT09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudD90aGlzLm9wZW5EaWFsb2coKTp0aGlzLmRpYWxvZyYmdGhpcy5kaWFsb2cuc2hvdz90aGlzLmNsb3NlRGlhbG9nKCk6dGhpcy5vcGVuRGlhbG9nKCkpfWlucHV0Q2hhbmdlKHQpe3RoaXMuZGlhbG9nP3RoaXMuZGlhbG9nLnNldENvbG9yRnJvbVN0cmluZyh0LnRhcmdldC52YWx1ZSwhMCk6KHRoaXMuY29sb3JQaWNrZXI9dC50YXJnZXQudmFsdWUsdGhpcy5jb2xvclBpY2tlckNoYW5nZS5lbWl0KHRoaXMuY29sb3JQaWNrZXIpKX1pbnB1dENoYW5nZWQodCl7dGhpcy5jcElucHV0Q2hhbmdlLmVtaXQodCl9c2xpZGVyQ2hhbmdlZCh0KXt0aGlzLmNwU2xpZGVyQ2hhbmdlLmVtaXQodCl9c2xpZGVyRHJhZ0VuZCh0KXt0aGlzLmNwU2xpZGVyRHJhZ0VuZC5lbWl0KHQpfXNsaWRlckRyYWdTdGFydCh0KXt0aGlzLmNwU2xpZGVyRHJhZ1N0YXJ0LmVtaXQodCl9cHJlc2V0Q29sb3JzQ2hhbmdlZCh0KXt0aGlzLmNwUHJlc2V0Q29sb3JzQ2hhbmdlLmVtaXQodCl9fWIzLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxiMykoU20ocnApLFNtKHVnKSxTbShPXyksU20oZWgpLFNtKGhnKSxTbShnMykpfSxiMy7JtWRpcj1sbyh7dHlwZTpiMyxzZWxlY3RvcnM6W1siIiwiY29sb3JQaWNrZXIiLCIiXV0saG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJlZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5oYW5kbGVDbGljaygpfSkpKCJmb2N1cyIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5oYW5kbGVGb2N1cygpfSkpKCJpbnB1dCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uaGFuZGxlSW5wdXQoZSl9KSl9LGlucHV0czp7Y3BXaWR0aDoiY3BXaWR0aCIsY3BIZWlnaHQ6ImNwSGVpZ2h0IixjcFRvZ2dsZToiY3BUb2dnbGUiLGNwRGlzYWJsZWQ6ImNwRGlzYWJsZWQiLGNwSWdub3JlZEVsZW1lbnRzOiJjcElnbm9yZWRFbGVtZW50cyIsY3BGYWxsYmFja0NvbG9yOiJjcEZhbGxiYWNrQ29sb3IiLGNwQ29sb3JNb2RlOiJjcENvbG9yTW9kZSIsY3BDbXlrRW5hYmxlZDoiY3BDbXlrRW5hYmxlZCIsY3BPdXRwdXRGb3JtYXQ6ImNwT3V0cHV0Rm9ybWF0IixjcEFscGhhQ2hhbm5lbDoiY3BBbHBoYUNoYW5uZWwiLGNwRGlzYWJsZUlucHV0OiJjcERpc2FibGVJbnB1dCIsY3BEaWFsb2dEaXNwbGF5OiJjcERpYWxvZ0Rpc3BsYXkiLGNwU2F2ZUNsaWNrT3V0c2lkZToiY3BTYXZlQ2xpY2tPdXRzaWRlIixjcENsb3NlQ2xpY2tPdXRzaWRlOiJjcENsb3NlQ2xpY2tPdXRzaWRlIixjcFVzZVJvb3RWaWV3Q29udGFpbmVyOiJjcFVzZVJvb3RWaWV3Q29udGFpbmVyIixjcFBvc2l0aW9uOiJjcFBvc2l0aW9uIixjcFBvc2l0aW9uT2Zmc2V0OiJjcFBvc2l0aW9uT2Zmc2V0IixjcFBvc2l0aW9uUmVsYXRpdmVUb0Fycm93OiJjcFBvc2l0aW9uUmVsYXRpdmVUb0Fycm93IixjcE9LQnV0dG9uOiJjcE9LQnV0dG9uIixjcE9LQnV0dG9uVGV4dDoiY3BPS0J1dHRvblRleHQiLGNwT0tCdXR0b25DbGFzczoiY3BPS0J1dHRvbkNsYXNzIixjcENhbmNlbEJ1dHRvbjoiY3BDYW5jZWxCdXR0b24iLGNwQ2FuY2VsQnV0dG9uVGV4dDoiY3BDYW5jZWxCdXR0b25UZXh0IixjcENhbmNlbEJ1dHRvbkNsYXNzOiJjcENhbmNlbEJ1dHRvbkNsYXNzIixjcFByZXNldExhYmVsOiJjcFByZXNldExhYmVsIixjcFByZXNldENvbG9yc0NsYXNzOiJjcFByZXNldENvbG9yc0NsYXNzIixjcE1heFByZXNldENvbG9yc0xlbmd0aDoiY3BNYXhQcmVzZXRDb2xvcnNMZW5ndGgiLGNwUHJlc2V0RW1wdHlNZXNzYWdlOiJjcFByZXNldEVtcHR5TWVzc2FnZSIsY3BQcmVzZXRFbXB0eU1lc3NhZ2VDbGFzczoiY3BQcmVzZXRFbXB0eU1lc3NhZ2VDbGFzcyIsY3BBZGRDb2xvckJ1dHRvbjoiY3BBZGRDb2xvckJ1dHRvbiIsY3BBZGRDb2xvckJ1dHRvblRleHQ6ImNwQWRkQ29sb3JCdXR0b25UZXh0IixjcEFkZENvbG9yQnV0dG9uQ2xhc3M6ImNwQWRkQ29sb3JCdXR0b25DbGFzcyIsY3BSZW1vdmVDb2xvckJ1dHRvbkNsYXNzOiJjcFJlbW92ZUNvbG9yQnV0dG9uQ2xhc3MiLGNvbG9yUGlja2VyOiJjb2xvclBpY2tlciIsY3BQcmVzZXRDb2xvcnM6ImNwUHJlc2V0Q29sb3JzIn0sb3V0cHV0czp7Y3BJbnB1dENoYW5nZToiY3BJbnB1dENoYW5nZSIsY3BUb2dnbGVDaGFuZ2U6ImNwVG9nZ2xlQ2hhbmdlIixjcFNsaWRlckNoYW5nZToiY3BTbGlkZXJDaGFuZ2UiLGNwU2xpZGVyRHJhZ0VuZDoiY3BTbGlkZXJEcmFnRW5kIixjcFNsaWRlckRyYWdTdGFydDoiY3BTbGlkZXJEcmFnU3RhcnQiLGNvbG9yUGlja2VyT3BlbjoiY29sb3JQaWNrZXJPcGVuIixjb2xvclBpY2tlckNsb3NlOiJjb2xvclBpY2tlckNsb3NlIixjb2xvclBpY2tlckNhbmNlbDoiY29sb3JQaWNrZXJDYW5jZWwiLGNvbG9yUGlja2VyU2VsZWN0OiJjb2xvclBpY2tlclNlbGVjdCIsY29sb3JQaWNrZXJDaGFuZ2U6ImNvbG9yUGlja2VyQ2hhbmdlIixjcENteWtDb2xvckNoYW5nZToiY3BDbXlrQ29sb3JDaGFuZ2UiLGNwUHJlc2V0Q29sb3JzQ2hhbmdlOiJjcFByZXNldENvbG9yc0NoYW5nZSJ9LGV4cG9ydEFzOlsibmd4Q29sb3JQaWNrZXIiXSxmZWF0dXJlczpbQm9dfSksYjMuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpycH0se3R5cGU6dWd9LHt0eXBlOk9ffSx7dHlwZTplaH0se3R5cGU6aGd9LHt0eXBlOmczfV0sYjMucHJvcERlY29yYXRvcnM9e2NvbG9yUGlja2VyOlt7dHlwZTp4eX1dLGNwV2lkdGg6W3t0eXBlOnh5fV0sY3BIZWlnaHQ6W3t0eXBlOnh5fV0sY3BUb2dnbGU6W3t0eXBlOnh5fV0sY3BEaXNhYmxlZDpbe3R5cGU6eHl9XSxjcElnbm9yZWRFbGVtZW50czpbe3R5cGU6eHl9XSxjcEZhbGxiYWNrQ29sb3I6W3t0eXBlOnh5fV0sY3BDb2xvck1vZGU6W3t0eXBlOnh5fV0sY3BDbXlrRW5hYmxlZDpbe3R5cGU6eHl9XSxjcE91dHB1dEZvcm1hdDpbe3R5cGU6eHl9XSxjcEFscGhhQ2hhbm5lbDpbe3R5cGU6eHl9XSxjcERpc2FibGVJbnB1dDpbe3R5cGU6eHl9XSxjcERpYWxvZ0Rpc3BsYXk6W3t0eXBlOnh5fV0sY3BTYXZlQ2xpY2tPdXRzaWRlOlt7dHlwZTp4eX1dLGNwQ2xvc2VDbGlja091dHNpZGU6W3t0eXBlOnh5fV0sY3BVc2VSb290Vmlld0NvbnRhaW5lcjpbe3R5cGU6eHl9XSxjcFBvc2l0aW9uOlt7dHlwZTp4eX1dLGNwUG9zaXRpb25PZmZzZXQ6W3t0eXBlOnh5fV0sY3BQb3NpdGlvblJlbGF0aXZlVG9BcnJvdzpbe3R5cGU6eHl9XSxjcE9LQnV0dG9uOlt7dHlwZTp4eX1dLGNwT0tCdXR0b25UZXh0Olt7dHlwZTp4eX1dLGNwT0tCdXR0b25DbGFzczpbe3R5cGU6eHl9XSxjcENhbmNlbEJ1dHRvbjpbe3R5cGU6eHl9XSxjcENhbmNlbEJ1dHRvblRleHQ6W3t0eXBlOnh5fV0sY3BDYW5jZWxCdXR0b25DbGFzczpbe3R5cGU6eHl9XSxjcFByZXNldExhYmVsOlt7dHlwZTp4eX1dLGNwUHJlc2V0Q29sb3JzOlt7dHlwZTp4eX1dLGNwUHJlc2V0Q29sb3JzQ2xhc3M6W3t0eXBlOnh5fV0sY3BNYXhQcmVzZXRDb2xvcnNMZW5ndGg6W3t0eXBlOnh5fV0sY3BQcmVzZXRFbXB0eU1lc3NhZ2U6W3t0eXBlOnh5fV0sY3BQcmVzZXRFbXB0eU1lc3NhZ2VDbGFzczpbe3R5cGU6eHl9XSxjcEFkZENvbG9yQnV0dG9uOlt7dHlwZTp4eX1dLGNwQWRkQ29sb3JCdXR0b25UZXh0Olt7dHlwZTp4eX1dLGNwQWRkQ29sb3JCdXR0b25DbGFzczpbe3R5cGU6eHl9XSxjcFJlbW92ZUNvbG9yQnV0dG9uQ2xhc3M6W3t0eXBlOnh5fV0sY3BJbnB1dENoYW5nZTpbe3R5cGU6T3l9XSxjcFRvZ2dsZUNoYW5nZTpbe3R5cGU6T3l9XSxjcFNsaWRlckNoYW5nZTpbe3R5cGU6T3l9XSxjcFNsaWRlckRyYWdFbmQ6W3t0eXBlOk95fV0sY3BTbGlkZXJEcmFnU3RhcnQ6W3t0eXBlOk95fV0sY29sb3JQaWNrZXJPcGVuOlt7dHlwZTpPeX1dLGNvbG9yUGlja2VyQ2xvc2U6W3t0eXBlOk95fV0sY29sb3JQaWNrZXJDYW5jZWw6W3t0eXBlOk95fV0sY29sb3JQaWNrZXJTZWxlY3Q6W3t0eXBlOk95fV0sY29sb3JQaWNrZXJDaGFuZ2U6W3t0eXBlOk95fV0sY3BDbXlrQ29sb3JDaGFuZ2U6W3t0eXBlOk95fV0sY3BQcmVzZXRDb2xvcnNDaGFuZ2U6W3t0eXBlOk95fV0saGFuZGxlQ2xpY2s6W3t0eXBlOnd5LGFyZ3M6WyJjbGljayJdfV0saGFuZGxlRm9jdXM6W3t0eXBlOnd5LGFyZ3M6WyJmb2N1cyJdfV0saGFuZGxlSW5wdXQ6W3t0eXBlOnd5LGFyZ3M6WyJpbnB1dCIsWyIkZXZlbnQiXV19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChiMyxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbY29sb3JQaWNrZXJdIixleHBvcnRBczoibmd4Q29sb3JQaWNrZXIifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6cnB9LHt0eXBlOnVnfSx7dHlwZTpPX30se3R5cGU6ZWh9LHt0eXBlOmhnfSx7dHlwZTpnM31dfSkse2NwV2lkdGg6W3t0eXBlOnh5fV0sY3BIZWlnaHQ6W3t0eXBlOnh5fV0sY3BUb2dnbGU6W3t0eXBlOnh5fV0sY3BEaXNhYmxlZDpbe3R5cGU6eHl9XSxjcElnbm9yZWRFbGVtZW50czpbe3R5cGU6eHl9XSxjcEZhbGxiYWNrQ29sb3I6W3t0eXBlOnh5fV0sY3BDb2xvck1vZGU6W3t0eXBlOnh5fV0sY3BDbXlrRW5hYmxlZDpbe3R5cGU6eHl9XSxjcE91dHB1dEZvcm1hdDpbe3R5cGU6eHl9XSxjcEFscGhhQ2hhbm5lbDpbe3R5cGU6eHl9XSxjcERpc2FibGVJbnB1dDpbe3R5cGU6eHl9XSxjcERpYWxvZ0Rpc3BsYXk6W3t0eXBlOnh5fV0sY3BTYXZlQ2xpY2tPdXRzaWRlOlt7dHlwZTp4eX1dLGNwQ2xvc2VDbGlja091dHNpZGU6W3t0eXBlOnh5fV0sY3BVc2VSb290Vmlld0NvbnRhaW5lcjpbe3R5cGU6eHl9XSxjcFBvc2l0aW9uOlt7dHlwZTp4eX1dLGNwUG9zaXRpb25PZmZzZXQ6W3t0eXBlOnh5fV0sY3BQb3NpdGlvblJlbGF0aXZlVG9BcnJvdzpbe3R5cGU6eHl9XSxjcE9LQnV0dG9uOlt7dHlwZTp4eX1dLGNwT0tCdXR0b25UZXh0Olt7dHlwZTp4eX1dLGNwT0tCdXR0b25DbGFzczpbe3R5cGU6eHl9XSxjcENhbmNlbEJ1dHRvbjpbe3R5cGU6eHl9XSxjcENhbmNlbEJ1dHRvblRleHQ6W3t0eXBlOnh5fV0sY3BDYW5jZWxCdXR0b25DbGFzczpbe3R5cGU6eHl9XSxjcFByZXNldExhYmVsOlt7dHlwZTp4eX1dLGNwUHJlc2V0Q29sb3JzQ2xhc3M6W3t0eXBlOnh5fV0sY3BNYXhQcmVzZXRDb2xvcnNMZW5ndGg6W3t0eXBlOnh5fV0sY3BQcmVzZXRFbXB0eU1lc3NhZ2U6W3t0eXBlOnh5fV0sY3BQcmVzZXRFbXB0eU1lc3NhZ2VDbGFzczpbe3R5cGU6eHl9XSxjcEFkZENvbG9yQnV0dG9uOlt7dHlwZTp4eX1dLGNwQWRkQ29sb3JCdXR0b25UZXh0Olt7dHlwZTp4eX1dLGNwQWRkQ29sb3JCdXR0b25DbGFzczpbe3R5cGU6eHl9XSxjcFJlbW92ZUNvbG9yQnV0dG9uQ2xhc3M6W3t0eXBlOnh5fV0sY3BJbnB1dENoYW5nZTpbe3R5cGU6T3l9XSxjcFRvZ2dsZUNoYW5nZTpbe3R5cGU6T3l9XSxjcFNsaWRlckNoYW5nZTpbe3R5cGU6T3l9XSxjcFNsaWRlckRyYWdFbmQ6W3t0eXBlOk95fV0sY3BTbGlkZXJEcmFnU3RhcnQ6W3t0eXBlOk95fV0sY29sb3JQaWNrZXJPcGVuOlt7dHlwZTpPeX1dLGNvbG9yUGlja2VyQ2xvc2U6W3t0eXBlOk95fV0sY29sb3JQaWNrZXJDYW5jZWw6W3t0eXBlOk95fV0sY29sb3JQaWNrZXJTZWxlY3Q6W3t0eXBlOk95fV0sY29sb3JQaWNrZXJDaGFuZ2U6W3t0eXBlOk95fV0sY3BDbXlrQ29sb3JDaGFuZ2U6W3t0eXBlOk95fV0sY3BQcmVzZXRDb2xvcnNDaGFuZ2U6W3t0eXBlOk95fV0saGFuZGxlQ2xpY2s6W3t0eXBlOnd5LGFyZ3M6WyJjbGljayJdfV0saGFuZGxlRm9jdXM6W3t0eXBlOnd5LGFyZ3M6WyJmb2N1cyJdfV0saGFuZGxlSW5wdXQ6W3t0eXBlOnd5LGFyZ3M6WyJpbnB1dCIsWyIkZXZlbnQiXV19XSxjb2xvclBpY2tlcjpbe3R5cGU6eHl9XSxjcFByZXNldENvbG9yczpbe3R5cGU6eHl9XX0pO2NsYXNzIHkze315My7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8eTMpfSx5My7JtW1vZD1hbyh7dHlwZTp5M30pLHkzLsm1aW5qPXZuKHtwcm92aWRlcnM6W2czXSxpbXBvcnRzOltbV01dXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoeTMsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltXTV0sZXhwb3J0czpbYjNdLHByb3ZpZGVyczpbZzNdLGRlY2xhcmF0aW9uczpbaDMsYjMscDMsbTNdLGVudHJ5Q29tcG9uZW50czpbaDNdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oeTMse2RlY2xhcmF0aW9uczpmdW5jdGlvbigpe3JldHVybltoMyxiMyxwMyxtM119LGltcG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bV01dfSxleHBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW2IzXX19KTtjb25zdCBfMz1bImZpbHRlciJdO2Z1bmN0aW9uIEMzKHQsZSl7MSZ0JiZJbSgwKX1mdW5jdGlvbiBNMyh0LGUpezEmdCYmSW0oMCl9Y29uc3QgdjM9ZnVuY3Rpb24odCl7cmV0dXJue2l0ZW06dH19O2Z1bmN0aW9uIHgzKHQsZSl7aWYoMSZ0JiYoTm0oMCksUXAoMSxNMywxLDAsIm5nLWNvbnRhaW5lciIsMTIpLHptKCkpLDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdDtZbSgpO2NvbnN0IG49JHAoMTQpO3JjKDEpLERtKCJuZ1RlbXBsYXRlT3V0bGV0IixuKSgibmdUZW1wbGF0ZU91dGxldENvbnRleHQiLE1oKDIsdjMsdCkpfX1mdW5jdGlvbiBPMyh0LGUpezEmdCYmKFJtKDAsImRpdiIsMTMpLFRtKDEsIm1hdC1zcGlubmVyIiwxNCksQW0oKSl9ZnVuY3Rpb24gUDModCxlKXsxJnQmJihSbSgwLCJkaXYiLDE1KSxrdSgxLCJObyBSdW5zIiksQW0oKSl9ZnVuY3Rpb24gdzModCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDE1KSxSbSgxLCJzcGFuIiksa3UoMiwnTm8gcnVucyBtYXRjaCAiJyksUm0oMywiY29kZSIpLGt1KDQpLEFtKCksa3UoNSwnIicpLEFtKCksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoNCksU3UodC5yZWdleEZpbHRlcil9fWNvbnN0IGszPWZ1bmN0aW9uKCl7cmV0dXJuWzUsMTAsMjBdfTtmdW5jdGlvbiBTMyh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsIm1hdC1wYWdpbmF0b3IiLDE2KSxWbSgicGFnZSIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkub25QYWdpbmF0aW9uQ2hhbmdlLmVtaXQobil9KSksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKTtEbSgicGFnZVNpemVPcHRpb25zIixDaCg0LGszKSkoInBhZ2VJbmRleCIsdC5wYWdpbmF0aW9uT3B0aW9uLnBhZ2VJbmRleCkoInBhZ2VTaXplIix0LnBhZ2luYXRpb25PcHRpb24ucGFnZVNpemUpKCJsZW5ndGgiLHQuZmlsdGVyZWRJdGVtc0xlbmd0aCl9fWZ1bmN0aW9uIEQzKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwibWF0LWNoZWNrYm94IiwyNiksVm0oImNoYW5nZSIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oMykuaGFuZGxlUGFnZVRvZ2dsZSgpfSkpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKDMpO0RtKCJjaGVja2VkIix0LmFsbFBhZ2VJdGVtc1NlbGVjdGVkKCkpKCJpbmRldGVybWluYXRlIiwhdC5hbGxQYWdlSXRlbXNTZWxlY3RlZCgpJiZ0LnNvbWVQYWdlSXRlbXNTZWxlY3RlZCgpKX19Y29uc3QgRTM9ZnVuY3Rpb24odCl7cmV0dXJue3R5cGU6dH19O2Z1bmN0aW9uIFIzKHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIsMjcpLGt1KDEsIkV4cGVyaW1lbnQiKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMyk7RG0oIm1hdC1zb3J0LWhlYWRlciIsTWgoMSxFMyx0LlNvcnRUeXBlLkVYUEVSSU1FTlRfTkFNRSkpfX1mdW5jdGlvbiBBMyh0LGUpe2lmKDEmdCYmKFJtKDAsInNwYW4iLDI3KSxrdSgxLCJSdW4iKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMyk7RG0oIm1hdC1zb3J0LWhlYWRlciIsTWgoMSxFMyx0LlNvcnRUeXBlLlJVTl9OQU1FKSl9fWZ1bmN0aW9uIFQzKHQsZSl7MSZ0JiZUbSgwLCJydW5zLWdyb3VwLW1lbnUtYnV0dG9uIiwyOSksMiZ0JiZEbSgiZXhwZXJpbWVudElkcyIsWW0oNCkuZXhwZXJpbWVudElkcyl9ZnVuY3Rpb24gTjModCxlKXtpZigxJnQmJihSbSgwLCJzcGFuIiksUXAoMSxUMywxLDEsInJ1bnMtZ3JvdXAtbWVudS1idXR0b24iLDI4KSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMyk7cmMoMSksRG0oIm5nSWYiLHQuc2hvd0dyb3VwQ29udHJvbCl9fWNvbnN0IHozPWZ1bmN0aW9uKHQpe3JldHVyblsiY29sdW1uIix0XX07ZnVuY3Rpb24gSTModCxlKXtpZigxJnQmJihSbSgwLCJzcGFuIiwyMSksTm0oMSwyMiksUXAoMixEMywxLDIsIm1hdC1jaGVja2JveCIsMjMpLFFwKDMsUjMsMiwzLCJzcGFuIiwyNCksUXAoNCxBMywyLDMsInNwYW4iLDI0KSxRcCg1LE4zLDIsMSwic3BhbiIsMjUpLHptKCksQW0oKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oMik7RG0oIm5nQ2xhc3MiLE1oKDYsejMsInRiLWNvbHVtbi0iK3QpKSxyYygxKSxEbSgibmdTd2l0Y2giLHQpLHJjKDEpLERtKCJuZ1N3aXRjaENhc2UiLG4uUnVuc1RhYmxlQ29sdW1uLkNIRUNLQk9YKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIixuLlJ1bnNUYWJsZUNvbHVtbi5FWFBFUklNRU5UX05BTUUpLHJjKDEpLERtKCJuZ1N3aXRjaENhc2UiLG4uUnVuc1RhYmxlQ29sdW1uLlJVTl9OQU1FKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIixuLlJ1bnNUYWJsZUNvbHVtbi5SVU5fQ09MT1IpfX1mdW5jdGlvbiBIMyh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO05tKDApLFJtKDEsImRpdiIsMzgpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCl9KSksUm0oMiwidGItcmFuZ2UtaW5wdXQiLDM5KSxWbSgidmFsdWUiLChmdW5jdGlvbiBlKG4pe2hpKHQpO2NvbnN0IG89WW0oMikuJGltcGxpY2l0O3JldHVybiBZbSgyKS5oYW5kbGVIcGFyYW1JbnRlcnZhbENoYW5nZWQobyxuKX0pKSxBbSgpLEFtKCksem0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oMikuJGltcGxpY2l0O3JjKDIpLERtKCJtaW4iLHQuZmlsdGVyLm1pblZhbHVlKSgibWF4Iix0LmZpbHRlci5tYXhWYWx1ZSkoImxvd2VyVmFsdWUiLHQuZmlsdGVyLmZpbHRlckxvd2VyVmFsdWUpKCJ1cHBlclZhbHVlIix0LmZpbHRlci5maWx0ZXJVcHBlclZhbHVlKX19ZnVuY3Rpb24gRjModCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDQxKSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KGUpe3JldHVybiBlLnN0b3BQcm9wYWdhdGlvbigpfSkpLFJtKDEsIm1hdC1jaGVja2JveCIsMzcpLFZtKCJjaGFuZ2UiLChmdW5jdGlvbiBlKCl7Y29uc3Qgbj1oaSh0KS4kaW1wbGljaXQsbz1ZbSgzKS4kaW1wbGljaXQ7cmV0dXJuIFltKDIpLmhhbmRsZUhwYXJhbURpc2NyZXRlQ2hhbmdlZChvLG4pfSkpLFJtKDIsInNwYW4iKSxrdSgzKSxBbSgpLEFtKCksQW0oKX1pZigyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQsbj1ZbSgzKS4kaW1wbGljaXQ7cmMoMSksRG0oImNoZWNrZWQiLG4uZmlsdGVyLmZpbHRlclZhbHVlcy5pbmNsdWRlcyh0KSkscmMoMiksU3UodCl9fWZ1bmN0aW9uIEwzKHQsZSl7aWYoMSZ0JiYoTm0oMCksUXAoMSxGMyw0LDIsImRpdiIsNDApLHptKCkpLDImdCl7Y29uc3QgdD1ZbSgyKS4kaW1wbGljaXQ7cmMoMSksRG0oIm5nRm9yT2YiLHQuZmlsdGVyLnBvc3NpYmxlVmFsdWVzKX19ZnVuY3Rpb24gQjModCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtObSgwKSxSbSgxLCJidXR0b24iLDMzKSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KGUpe3JldHVybiBlLnN0b3BQcm9wYWdhdGlvbigpfSkpLFRtKDIsIm1hdC1pY29uIiwzNCksQW0oKSxSbSgzLCJtYXQtbWVudSIsbnVsbCwzNSksUm0oNSwiZGl2IiwzNiksVm0oImNsaWNrIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gZS5zdG9wUHJvcGFnYXRpb24oKX0pKSxSbSg2LCJtYXQtY2hlY2tib3giLDM3KSxWbSgiY2hhbmdlIiwoZnVuY3Rpb24gZSgpe2hpKHQpO2NvbnN0IG49WW0oKS4kaW1wbGljaXQ7cmV0dXJuIFltKDIpLmhhbmRsZUhwYXJhbUluY2x1ZGVVbmRlZmluZWRUb2dnbGVkKG4pfSkpLFJtKDcsInNwYW4iKSxrdSg4LCIoc2hvdyBlbXB0eSB2YWx1ZSkiKSxBbSgpLEFtKCksQW0oKSxRcCg5LEgzLDMsNCwibmctY29udGFpbmVyIiwzMiksUXAoMTAsTDMsMiwxLCJuZy1jb250YWluZXIiLDMyKSxBbSgpLHptKCl9aWYoMiZ0KXtjb25zdCB0PSRwKDQpLGU9WW0oKS4kaW1wbGljaXQsbj1ZbSgyKTtyYygxKSxEbSgibWF0TWVudVRyaWdnZXJGb3IiLHQpLGpwKCJhcmlhLWxhYmVsIiwiRmlsdGVyIGhwYXJhbSAiKyhlLmRpc3BsYXlOYW1lfHxlLm5hbWUpKSxyYyg1KSxEbSgiY2hlY2tlZCIsZS5maWx0ZXIuaW5jbHVkZVVuZGVmaW5lZCkscmMoMyksRG0oIm5nSWYiLGUuZmlsdGVyLnR5cGU9PT1uLkRvbWFpblR5cGUuSU5URVJWQUwpLHJjKDEpLERtKCJuZ0lmIixlLmZpbHRlci50eXBlPT09bi5Eb21haW5UeXBlLkRJU0NSRVRFKX19Y29uc3QgVjM9ZnVuY3Rpb24odCxlKXtyZXR1cm57dHlwZTp0LG5hbWU6ZX19O2Z1bmN0aW9uIGozKHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIsMzApLFJtKDEsInNwYW4iLDMxKSxrdSgyKSxBbSgpLFFwKDMsQjMsMTEsNSwibmctY29udGFpbmVyIiwzMiksQW0oKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oMik7RG0oIm1hdC1zb3J0LWhlYWRlciIsdmgoMyxWMyxuLlNvcnRUeXBlLkhQQVJBTSx0Lm5hbWUpKSxyYygyKSxTdSh0LmRpc3BsYXlOYW1lfHx0Lm5hbWUpLHJjKDEpLERtKCJuZ0lmIix0LmZpbHRlcil9fWZ1bmN0aW9uIFUzKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Tm0oMCksUm0oMSwiYnV0dG9uIiwzMyksVm0oImNsaWNrIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gZS5zdG9wUHJvcGFnYXRpb24oKX0pKSxUbSgyLCJtYXQtaWNvbiIsMzQpLEFtKCksUm0oMywibWF0LW1lbnUiLG51bGwsMzUpLFJtKDUsImRpdiIsMzYpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCl9KSksUm0oNiwibWF0LWNoZWNrYm94IiwzNyksVm0oImNoYW5nZSIsKGZ1bmN0aW9uIGUoKXtoaSh0KTtjb25zdCBuPVltKCkuJGltcGxpY2l0O3JldHVybiBZbSgyKS5oYW5kbGVNZXRyaWNJbmNsdWRlVW5kZWZpbmVkQ2hhbmdlZChuKX0pKSxSbSg3LCJzcGFuIiksa3UoOCwiKHNob3cgZW1wdHkgdmFsdWUpIiksQW0oKSxBbSgpLEFtKCksUm0oOSwiZGl2IiwzOCksVm0oImNsaWNrIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gZS5zdG9wUHJvcGFnYXRpb24oKX0pKSxSbSgxMCwidGItcmFuZ2UtaW5wdXQiLDM5KSxWbSgidmFsdWUiLChmdW5jdGlvbiBlKG4pe2hpKHQpO2NvbnN0IG89WW0oKS4kaW1wbGljaXQ7cmV0dXJuIFltKDIpLmhhbmRsZU1ldHJpY0ZpbHRlckNoYW5nZWQobyxuKX0pKSxBbSgpLEFtKCksQW0oKSx6bSgpfWlmKDImdCl7Y29uc3QgdD0kcCg0KSxlPVltKCkuJGltcGxpY2l0O3JjKDEpLERtKCJtYXRNZW51VHJpZ2dlckZvciIsdCksanAoImFyaWEtbGFiZWwiLCJGaWx0ZXIgbWV0cmljICIrKGUuZGlzcGxheU5hbWV8fGUudGFnKSkscmMoNSksRG0oImNoZWNrZWQiLGUuZmlsdGVyLmluY2x1ZGVVbmRlZmluZWQpLHJjKDQpLERtKCJtaW4iLGUuZmlsdGVyLm1pblZhbHVlKSgibWF4IixlLmZpbHRlci5tYXhWYWx1ZSkoImxvd2VyVmFsdWUiLGUuZmlsdGVyLmZpbHRlckxvd2VyVmFsdWUpKCJ1cHBlclZhbHVlIixlLmZpbHRlci5maWx0ZXJVcHBlclZhbHVlKX19Y29uc3QgRzM9ZnVuY3Rpb24odCxlKXtyZXR1cm57dHlwZTp0LHRhZzplfX07ZnVuY3Rpb24gVzModCxlKXtpZigxJnQmJihSbSgwLCJzcGFuIiwzMCksUm0oMSwic3BhbiIsMzEpLGt1KDIpLEFtKCksUXAoMyxVMywxMSw3LCJuZy1jb250YWluZXIiLDMyKSxBbSgpKSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQsbj1ZbSgyKTtEbSgibWF0LXNvcnQtaGVhZGVyIix2aCgzLEczLG4uU29ydFR5cGUuTUVUUklDLHQudGFnKSkscmMoMiksU3UodC5kaXNwbGF5TmFtZXx8dC50YWcpLHJjKDEpLERtKCJuZ0lmIix0LmZpbHRlcil9fWZ1bmN0aW9uIFkzKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2IiwxNyksUm0oMSwiZGl2IiwxOCksVm0oIm1hdFNvcnRDaGFuZ2UiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLmhhbmRsZVNvcnRDaGFuZ2Uobil9KSksUXAoMixJMyw2LDgsInNwYW4iLDE5KSxRcCgzLGozLDQsNiwic3BhbiIsMjApLFFwKDQsVzMsNCw2LCJzcGFuIiwyMCksQW0oKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgpO3JjKDEpLERtKCJtYXRTb3J0QWN0aXZlIix0LnNvcnRPcHRpb24uY29sdW1uKSxyYygxKSxEbSgibmdGb3JPZiIsdC5jb2x1bW5zKSxyYygxKSxEbSgibmdGb3JPZiIsdC5ocGFyYW1Db2x1bW5zKSgibmdGb3JUcmFja0J5Iix0LnRyYWNrQnlIcGFyYW1Db2x1bW4pLHJjKDEpLERtKCJuZ0Zvck9mIix0Lm1ldHJpY0NvbHVtbnMpKCJuZ0ZvclRyYWNrQnkiLHQudHJhY2tCeU1ldHJpY0NvbHVtbil9fWZ1bmN0aW9uIHEzKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwic3BhbiIpLFJtKDEsIm1hdC1jaGVja2JveCIsMzcpLFZtKCJjaGFuZ2UiLChmdW5jdGlvbiBlKCl7aGkodCk7Y29uc3Qgbj1ZbSgyKS5pdGVtO3JldHVybiBZbSgpLm9uU2VsZWN0aW9uVG9nZ2xlLmVtaXQobil9KSksQW0oKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgyKS5pdGVtO3JjKDEpLERtKCJjaGVja2VkIix0LnNlbGVjdGVkKX19ZnVuY3Rpb24gWjModCxlKXtpZigxJnQmJihSbSgwLCJzcGFuIiwzMSksa3UoMSksQW0oKSksMiZ0KXtjb25zdCB0PVltKDIpLml0ZW07anAoInRpdGxlIix0LmV4cGVyaW1lbnROYW1lKSxyYygxKSxTdSh0LmV4cGVyaW1lbnRBbGlhcyl9fWZ1bmN0aW9uIFgzKHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIsMzEpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgyKS5pdGVtO3JjKDEpLFN1KHQucnVuLm5hbWUpfX1jb25zdCBLMz1mdW5jdGlvbih0KXtyZXR1cm57InJ1bi1jb2xvci1zd2F0Y2giOiEwLCJuby1jb2xvciI6dH19O2Z1bmN0aW9uIEozKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwic3BhbiIpLFJtKDEsImJ1dHRvbiIsNDcpLFZtKCJjb2xvclBpY2tlckNoYW5nZSIsKGZ1bmN0aW9uIGUobil7aGkodCk7Y29uc3Qgbz1ZbSgyKS5pdGVtO3JldHVybiBZbSgpLm9uUnVuQ29sb3JDaGFuZ2UuZW1pdCh7cnVuSWQ6by5ydW4uaWQsbmV3Q29sb3I6bn0pfSkpLEFtKCksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oMikuaXRlbTtyYygxKSxkdSgiYmFja2dyb3VuZCIsdC5ydW5Db2xvciksRG0oIm5nQ2xhc3MiLE1oKDgsSzMsIXQucnVuQ29sb3IpKSgiY29sb3JQaWNrZXIiLHQucnVuQ29sb3IpKCJjcERpYWxvZ0Rpc3BsYXkiLCJwb3B1cCIpKCJjcFBvc2l0aW9uT2Zmc2V0IiwtMjApKCJjcFVzZVJvb3RWaWV3Q29udGFpbmVyIiwhMCkoImNwT3V0cHV0Rm9ybWF0IiwiaGV4Iil9fWZ1bmN0aW9uIFEzKHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIsNDUpLE5tKDEsMjIpLFFwKDIscTMsMiwxLCJzcGFuIiwyNSksUXAoMyxaMywyLDIsInNwYW4iLDQ2KSxRcCg0LFgzLDIsMSwic3BhbiIsNDYpLFFwKDUsSjMsMiwxMCwic3BhbiIsMjUpLHptKCksQW0oKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oMik7RG0oIm5nQ2xhc3MiLE1oKDYsejMsInRiLWNvbHVtbi0iK3QpKSxyYygxKSxEbSgibmdTd2l0Y2giLHQpLHJjKDEpLERtKCJuZ1N3aXRjaENhc2UiLG4uUnVuc1RhYmxlQ29sdW1uLkNIRUNLQk9YKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIixuLlJ1bnNUYWJsZUNvbHVtbi5FWFBFUklNRU5UX05BTUUpLHJjKDEpLERtKCJuZ1N3aXRjaENhc2UiLG4uUnVuc1RhYmxlQ29sdW1uLlJVTl9OQU1FKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIixuLlJ1bnNUYWJsZUNvbHVtbi5SVU5fQ09MT1IpfX1mdW5jdGlvbiAkMyh0LGUpe2lmKDEmdCYmKFJtKDAsInNwYW4iLDQ4KSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQsbj1ZbSgpLml0ZW07cmMoMSksU3Uobi5ocGFyYW1zLmdldCh0Lm5hbWUpKX19ZnVuY3Rpb24gdDIodCxlKXtpZigxJnQmJihSbSgwLCJzcGFuIiw0OCksa3UoMSksQW0oKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oKS5pdGVtO3JjKDEpLFN1KG4ubWV0cmljcy5nZXQodC50YWcpKX19ZnVuY3Rpb24gZTIodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDQyKSxRcCgxLFEzLDYsOCwic3BhbiIsNDMpLFFwKDIsJDMsMiwxLCJzcGFuIiw0NCksUXAoMyx0MiwyLDEsInNwYW4iLDQ0KSxBbSgpKSwyJnQpe2NvbnN0IHQ9ZS5pdGVtLG49WW0oKTtqcCgiZGF0YS1pZCIsdC5ydW4uaWQpLHJjKDEpLERtKCJuZ0Zvck9mIixuLmNvbHVtbnMpLHJjKDEpLERtKCJuZ0Zvck9mIixuLmhwYXJhbUNvbHVtbnMpLHJjKDEpLERtKCJuZ0Zvck9mIixuLm1ldHJpY0NvbHVtbnMpfX1jbGFzcyBuMiBleHRlbmRzIFpRe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLml0ZW1zUGVyUGFnZUxhYmVsPSJTaG93IHJ1bnM6In19bjIuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKG4yKSkpKG58fG4yKX19KSgpLG4yLsm1cHJvdj1Nbih7dG9rZW46bjIsZmFjdG9yeTpuMi7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobjIsW3t0eXBlOmltfV0sbnVsbCxudWxsKTtjbGFzcyBvMntjb25zdHJ1Y3Rvcigpe3RoaXMuZGF0YVNvdXJjZT1uZXcgUzAsdGhpcy5Eb21haW5UeXBlPVpSLHRoaXMuUnVuc1RhYmxlQ29sdW1uPXZRLHRoaXMuU29ydFR5cGU9JFQsdGhpcy5vblJlZ2V4RmlsdGVyQ2hhbmdlPW5ldyBMaCx0aGlzLm9uU2VsZWN0aW9uVG9nZ2xlPW5ldyBMaCx0aGlzLm9uUGFnZVNlbGVjdGlvblRvZ2dsZT1uZXcgTGgsdGhpcy5vblBhZ2luYXRpb25DaGFuZ2U9bmV3IExoLHRoaXMub25Tb3J0Q2hhbmdlPW5ldyBMaCx0aGlzLm9uUnVuQ29sb3JDaGFuZ2U9bmV3IExoLHRoaXMub25IcGFyYW1EaXNjcmV0ZUZpbHRlckNoYW5nZWQ9bmV3IExoLHRoaXMub25IcGFyYW1JbnRlcnZhbEZpbHRlckNoYW5nZWQ9bmV3IExoLHRoaXMub25NZXRyaWNGaWx0ZXJDaGFuZ2VkPW5ldyBMaH1uZ09uQ2hhbmdlcygpe3RoaXMuZGF0YVNvdXJjZS5kYXRhPXRoaXMucGFnZUl0ZW1zfWdldEhwYXJhbUNvbHVtbklkKHQpe3JldHVybmBoOiR7dC5uYW1lfWB9Z2V0TWV0cmljQ29sdW1uSWQodCl7cmV0dXJuYG06JHt0LnRhZ31gfWdldENvbHVtbklkcygpe3JldHVyblsuLi50aGlzLmNvbHVtbnMsLi4udGhpcy5ocGFyYW1Db2x1bW5zLm1hcCh0aGlzLmdldEhwYXJhbUNvbHVtbklkKSwuLi50aGlzLm1ldHJpY0NvbHVtbnMubWFwKHRoaXMuZ2V0TWV0cmljQ29sdW1uSWQpXX1hbGxQYWdlSXRlbXNTZWxlY3RlZCgpe3JldHVybiBCb29sZWFuKHRoaXMucGFnZUl0ZW1zLmxlbmd0aCkmJnRoaXMucGFnZUl0ZW1zLmV2ZXJ5KCh0PT50LnNlbGVjdGVkKSl9c29tZVBhZ2VJdGVtc1NlbGVjdGVkKCl7cmV0dXJuIHRoaXMucGFnZUl0ZW1zLnNvbWUoKHQ9PnQuc2VsZWN0ZWQpKX1oYW5kbGVQYWdlVG9nZ2xlKCl7dGhpcy5vblBhZ2VTZWxlY3Rpb25Ub2dnbGUuZW1pdCh7aXRlbXM6dGhpcy5wYWdlSXRlbXN9KX1oYW5kbGVTb3J0Q2hhbmdlKHQpe2xldCBlO3N3aXRjaCh0LmRpcmVjdGlvbil7Y2FzZSJhc2MiOmU9Rk4uQVNDO2JyZWFrO2Nhc2UiZGVzYyI6ZT1GTi5ERVNDO2JyZWFrO2RlZmF1bHQ6ZT1GTi5VTlNFVH10aGlzLm9uU29ydENoYW5nZS5lbWl0KHtrZXk6dC5hY3RpdmUsZGlyZWN0aW9uOmV9KX1vbkZpbHRlcktleVVwKHQpe3RoaXMub25SZWdleEZpbHRlckNoYW5nZS5lbWl0KHQudGFyZ2V0LnZhbHVlKX10YWJsZVRyYWNrQnkodCxlKXtyZXR1cm4gZS5ydW4uaWR9aGFuZGxlSHBhcmFtSW5jbHVkZVVuZGVmaW5lZFRvZ2dsZWQodCl7Y29uc3R7bmFtZTplLGZpbHRlcjpufT10O2lmKCFuKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhcmlhbnQgZXJyb3I6IHJlcXVpcmUgZmlsdGVyIHRvIGV4aXN0IGZvciBpdCB0byBjaGFuZ2UiKTtuLnR5cGU9PT1aUi5ESVNDUkVURT90aGlzLm9uSHBhcmFtRGlzY3JldGVGaWx0ZXJDaGFuZ2VkLmVtaXQoe2hwYXJhbU5hbWU6ZSxpbmNsdWRlVW5kZWZpbmVkOiFuLmluY2x1ZGVVbmRlZmluZWQsZmlsdGVyVmFsdWVzOm4uZmlsdGVyVmFsdWVzfSk6dGhpcy5vbkhwYXJhbUludGVydmFsRmlsdGVyQ2hhbmdlZC5lbWl0KHtuYW1lOmUsaW5jbHVkZVVuZGVmaW5lZDohbi5pbmNsdWRlVW5kZWZpbmVkLGZpbHRlckxvd2VyVmFsdWU6bi5maWx0ZXJMb3dlclZhbHVlLGZpbHRlclVwcGVyVmFsdWU6bi5maWx0ZXJVcHBlclZhbHVlfSl9aGFuZGxlSHBhcmFtSW50ZXJ2YWxDaGFuZ2VkKHQsZSl7Y29uc3R7bmFtZTpuLGZpbHRlcjpvfT10O2lmKCFvKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhcmlhbnQgZXJyb3I6IHJlcXVpcmUgZmlsdGVyIHRvIGV4aXN0IGZvciBpdCB0byBjaGFuZ2UiKTt0aGlzLm9uSHBhcmFtSW50ZXJ2YWxGaWx0ZXJDaGFuZ2VkLmVtaXQoe25hbWU6bixpbmNsdWRlVW5kZWZpbmVkOm8uaW5jbHVkZVVuZGVmaW5lZCxmaWx0ZXJMb3dlclZhbHVlOmUubG93ZXJWYWx1ZSxmaWx0ZXJVcHBlclZhbHVlOmUudXBwZXJWYWx1ZX0pfWhhbmRsZUhwYXJhbURpc2NyZXRlQ2hhbmdlZCh0LGUpe2NvbnN0e25hbWU6bixmaWx0ZXI6b309dDtpZighbyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YXJpYW50IGVycm9yOiByZXF1aXJlIGZpbHRlciB0byBleGlzdCBmb3IgaXQgdG8gY2hhbmdlIik7aWYoby50eXBlIT09WlIuRElTQ1JFVEUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFyaWFudCBlcnJvcjogZXhwZWN0ZWQgZGlzY3JldGUgZG9tYWluIGZvciAke259YCk7Y29uc3QgaT1uZXcgU2V0KFsuLi5vLmZpbHRlclZhbHVlc10pO2kuaGFzKGUpP2kuZGVsZXRlKGUpOmkuYWRkKGUpLHRoaXMub25IcGFyYW1EaXNjcmV0ZUZpbHRlckNoYW5nZWQuZW1pdCh7aHBhcmFtTmFtZTpuLGluY2x1ZGVVbmRlZmluZWQ6by5pbmNsdWRlVW5kZWZpbmVkLGZpbHRlclZhbHVlczpbLi4uaV19KX1oYW5kbGVNZXRyaWNJbmNsdWRlVW5kZWZpbmVkQ2hhbmdlZCh0KXtpZighdC5maWx0ZXIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFyaWFudCBlcnJvcjogcmVxdWlyZSBmaWx0ZXIgdG8gZXhpc3QgZm9yIGl0IHRvIGNoYW5nZSIpO3RoaXMub25NZXRyaWNGaWx0ZXJDaGFuZ2VkLmVtaXQoe25hbWU6dC50YWcsaW5jbHVkZVVuZGVmaW5lZDohdC5maWx0ZXIuaW5jbHVkZVVuZGVmaW5lZCxmaWx0ZXJMb3dlclZhbHVlOnQuZmlsdGVyLmZpbHRlckxvd2VyVmFsdWUsZmlsdGVyVXBwZXJWYWx1ZTp0LmZpbHRlci5maWx0ZXJVcHBlclZhbHVlfSl9aGFuZGxlTWV0cmljRmlsdGVyQ2hhbmdlZCh0LGUpe2lmKCF0LmZpbHRlcil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YXJpYW50IGVycm9yOiByZXF1aXJlIGZpbHRlciB0byBleGlzdCBmb3IgaXQgdG8gY2hhbmdlIik7dGhpcy5vbk1ldHJpY0ZpbHRlckNoYW5nZWQuZW1pdCh7bmFtZTp0LnRhZyxpbmNsdWRlVW5kZWZpbmVkOnQuZmlsdGVyLmluY2x1ZGVVbmRlZmluZWQsZmlsdGVyTG93ZXJWYWx1ZTplLmxvd2VyVmFsdWUsZmlsdGVyVXBwZXJWYWx1ZTplLnVwcGVyVmFsdWV9KX10cmFja0J5SHBhcmFtQ29sdW1uKHQpe3JldHVybiB0Lm5hbWV9dHJhY2tCeU1ldHJpY0NvbHVtbih0KXtyZXR1cm4gdC50YWd9fW8yLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxvMil9LG8yLsm1Y21wPXRvKHt0eXBlOm8yLHNlbGVjdG9yczpbWyJydW5zLXRhYmxlLWNvbXBvbmVudCJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmKFFoKF8zLDcsaGcpLFFoKHQkLDcpLFFoKGEkLDcpKSwyJmUpe2xldCB0O0poKHQ9dGIoKSkmJihuLmZpbHRlcj10LmZpcnN0KSxKaCh0PXRiKCkpJiYobi5wYWdpbmF0b3I9dC5maXJzdCksSmgodD10YigpKSYmKG4uc29ydD10LmZpcnN0KX19LGhvc3RWYXJzOjIsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJnB1KCJmbGV4LWxheW91dCIsbi51c2VGbGV4aWJsZUxheW91dCl9LGlucHV0czp7ZXhwZXJpbWVudElkczoiZXhwZXJpbWVudElkcyIsc2hvd0V4cGVyaW1lbnROYW1lOiJzaG93RXhwZXJpbWVudE5hbWUiLGNvbHVtbnM6ImNvbHVtbnMiLGhwYXJhbUNvbHVtbnM6ImhwYXJhbUNvbHVtbnMiLG1ldHJpY0NvbHVtbnM6Im1ldHJpY0NvbHVtbnMiLGFsbEl0ZW1zTGVuZ3RoOiJhbGxJdGVtc0xlbmd0aCIsZmlsdGVyZWRJdGVtc0xlbmd0aDoiZmlsdGVyZWRJdGVtc0xlbmd0aCIsdXNlRmxleGlibGVMYXlvdXQ6InVzZUZsZXhpYmxlTGF5b3V0Iix1c2VQYWdpbmF0aW9uOiJ1c2VQYWdpbmF0aW9uIixzaG93R3JvdXBDb250cm9sOiJzaG93R3JvdXBDb250cm9sIixwYWdlSXRlbXM6InBhZ2VJdGVtcyIsbG9hZGluZzoibG9hZGluZyIsbnVtU2VsZWN0ZWRJdGVtczoibnVtU2VsZWN0ZWRJdGVtcyIsc29ydE9wdGlvbjoic29ydE9wdGlvbiIscGFnaW5hdGlvbk9wdGlvbjoicGFnaW5hdGlvbk9wdGlvbiIscmVnZXhGaWx0ZXI6InJlZ2V4RmlsdGVyIn0sb3V0cHV0czp7b25SZWdleEZpbHRlckNoYW5nZToib25SZWdleEZpbHRlckNoYW5nZSIsb25TZWxlY3Rpb25Ub2dnbGU6Im9uU2VsZWN0aW9uVG9nZ2xlIixvblBhZ2VTZWxlY3Rpb25Ub2dnbGU6Im9uUGFnZVNlbGVjdGlvblRvZ2dsZSIsb25QYWdpbmF0aW9uQ2hhbmdlOiJvblBhZ2luYXRpb25DaGFuZ2UiLG9uU29ydENoYW5nZToib25Tb3J0Q2hhbmdlIixvblJ1bkNvbG9yQ2hhbmdlOiJvblJ1bkNvbG9yQ2hhbmdlIixvbkhwYXJhbURpc2NyZXRlRmlsdGVyQ2hhbmdlZDoib25IcGFyYW1EaXNjcmV0ZUZpbHRlckNoYW5nZWQiLG9uSHBhcmFtSW50ZXJ2YWxGaWx0ZXJDaGFuZ2VkOiJvbkhwYXJhbUludGVydmFsRmlsdGVyQ2hhbmdlZCIsb25NZXRyaWNGaWx0ZXJDaGFuZ2VkOiJvbk1ldHJpY0ZpbHRlckNoYW5nZWQifSxmZWF0dXJlczpbcGcoW3twcm92aWRlOlpRLHVzZUNsYXNzOm4yfV0pLEJvXSxkZWNsczoxNSx2YXJzOjcsY29uc3RzOltbMSwiZmlsdGVyLXJvdyJdLFsicGxhY2Vob2xkZXIiLCJGaWx0ZXIgcnVucyAocmVnZXgpIiwxLCJydW4tZmlsdGVyIiwzLCJrZXl1cCJdLFsxLCJ0YWJsZS1jb250YWluZXIiXSxbInJvbGUiLCJ0YWJsZSJdLFs0LCJuZ1RlbXBsYXRlT3V0bGV0Il0sWyJyb2xlIiwicm93Z3JvdXAiLDEsInJvd3MiXSxbNCwibmdGb3IiLCJuZ0Zvck9mIiwibmdGb3JUcmFja0J5Il0sWyJjbGFzcyIsImxvYWRpbmciLDQsIm5nSWYiXSxbImNsYXNzIiwibm8tcnVucyIsNCwibmdJZiJdLFsic2hvd0ZpcnN0TGFzdEJ1dHRvbnMiLCIiLDMsInBhZ2VTaXplT3B0aW9ucyIsInBhZ2VJbmRleCIsInBhZ2VTaXplIiwibGVuZ3RoIiwicGFnZSIsNCwibmdJZiJdLFsiaGVhZGVyIiwiIl0sWyJyb3ciLCIiXSxbNCwibmdUZW1wbGF0ZU91dGxldCIsIm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0Il0sWzEsImxvYWRpbmciXSxbIm1vZGUiLCJpbmRldGVybWluYXRlIiwiZGlhbWV0ZXIiLCIyOCJdLFsxLCJuby1ydW5zIl0sWyJzaG93Rmlyc3RMYXN0QnV0dG9ucyIsIiIsMywicGFnZVNpemVPcHRpb25zIiwicGFnZUluZGV4IiwicGFnZVNpemUiLCJsZW5ndGgiLCJwYWdlIl0sWyJyb2xlIiwicm93Z3JvdXAiLDEsImhlYWRlciJdLFsibWF0U29ydCIsIiIsInJvbGUiLCJyb3ciLDMsIm1hdFNvcnRBY3RpdmUiLCJtYXRTb3J0Q2hhbmdlIl0sWyJyb2xlIiwiY29sdW1uaGVhZGVyIiwzLCJuZ0NsYXNzIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbInJvbGUiLCJjb2x1bW5oZWFkZXIiLCJjbGFzcyIsImNvbHVtbiIsMywibWF0LXNvcnQtaGVhZGVyIiw0LCJuZ0ZvciIsIm5nRm9yT2YiLCJuZ0ZvclRyYWNrQnkiXSxbInJvbGUiLCJjb2x1bW5oZWFkZXIiLDMsIm5nQ2xhc3MiXSxbMywibmdTd2l0Y2giXSxbMywiY2hlY2tlZCIsImluZGV0ZXJtaW5hdGUiLCJjaGFuZ2UiLDQsIm5nU3dpdGNoQ2FzZSJdLFszLCJtYXQtc29ydC1oZWFkZXIiLDQsIm5nU3dpdGNoQ2FzZSJdLFs0LCJuZ1N3aXRjaENhc2UiXSxbMywiY2hlY2tlZCIsImluZGV0ZXJtaW5hdGUiLCJjaGFuZ2UiXSxbMywibWF0LXNvcnQtaGVhZGVyIl0sWzMsImV4cGVyaW1lbnRJZHMiLDQsIm5nSWYiXSxbMywiZXhwZXJpbWVudElkcyJdLFsicm9sZSIsImNvbHVtbmhlYWRlciIsMSwiY29sdW1uIiwzLCJtYXQtc29ydC1oZWFkZXIiXSxbMSwibmFtZSJdLFs0LCJuZ0lmIl0sWyJtYXQtaWNvbi1idXR0b24iLCIiLDMsIm1hdE1lbnVUcmlnZ2VyRm9yIiwiY2xpY2siXSxbInN2Z0ljb24iLCJmaWx0ZXJfYWx0XzI0cHgiXSxbImZpbHRlck1lbnUiLCJtYXRNZW51Il0sWyJtYXQtbWVudS1pdGVtIiwiIiwicm9sZSIsIm1lbnVpdGVtY2hlY2tib3giLCJkaXNhYmxlUmlwcGxlIiwiIiwxLCJmaWx0ZXItbWVudS1jaGVja2JveC1yb3ciLDMsImNsaWNrIl0sWzMsImNoZWNrZWQiLCJjaGFuZ2UiXSxbImRpc2FibGVSaXBwbGUiLCIiLCJtYXQtbWVudS1pdGVtIiwiIiwxLCJyYW5nZS1pbnB1dC1jb250YWluZXIiLDMsImNsaWNrIl0sWzMsIm1pbiIsIm1heCIsImxvd2VyVmFsdWUiLCJ1cHBlclZhbHVlIiwidmFsdWUiXSxbIm1hdC1tZW51LWl0ZW0iLCIiLCJjbGFzcyIsImZpbHRlci1tZW51LWNoZWNrYm94LXJvdyIsInJvbGUiLCJtZW51aXRlbWNoZWNrYm94IiwzLCJjbGljayIsNCwibmdGb3IiLCJuZ0Zvck9mIl0sWyJtYXQtbWVudS1pdGVtIiwiIiwicm9sZSIsIm1lbnVpdGVtY2hlY2tib3giLDEsImZpbHRlci1tZW51LWNoZWNrYm94LXJvdyIsMywiY2xpY2siXSxbInJvbGUiLCJyb3ciXSxbInJvbGUiLCJjZWxsIiwzLCJuZ0NsYXNzIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbInJvbGUiLCJjZWxsIiwiY2xhc3MiLCJjb2x1bW4iLDQsIm5nRm9yIiwibmdGb3JPZiJdLFsicm9sZSIsImNlbGwiLDMsIm5nQ2xhc3MiXSxbImNsYXNzIiwibmFtZSIsNCwibmdTd2l0Y2hDYXNlIl0sWzMsIm5nQ2xhc3MiLCJjb2xvclBpY2tlciIsImNwRGlhbG9nRGlzcGxheSIsImNwUG9zaXRpb25PZmZzZXQiLCJjcFVzZVJvb3RWaWV3Q29udGFpbmVyIiwiY3BPdXRwdXRGb3JtYXQiLCJjb2xvclBpY2tlckNoYW5nZSJdLFsicm9sZSIsImNlbGwiLDEsImNvbHVtbiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoUm0oMCwiZGl2IiwwKSxSbSgxLCJ0Yi1maWx0ZXItaW5wdXQiLDEpLFZtKCJrZXl1cCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25GaWx0ZXJLZXlVcChlKX0pKSxBbSgpLEFtKCksUm0oMiwiZGl2IiwyKSxSbSgzLCJkaXYiLDMpLFFwKDQsQzMsMSwwLCJuZy1jb250YWluZXIiLDQpLFJtKDUsImRpdiIsNSksUXAoNix4MywyLDQsIm5nLWNvbnRhaW5lciIsNiksQW0oKSxBbSgpLFFwKDcsTzMsMiwwLCJkaXYiLDcpLFFwKDgsUDMsMiwwLCJkaXYiLDgpLFFwKDksdzMsNiwxLCJkaXYiLDgpLEFtKCksUXAoMTAsUzMsMSw1LCJtYXQtcGFnaW5hdG9yIiw5KSxRcCgxMSxZMyw1LDYsIm5nLXRlbXBsYXRlIixudWxsLDEwLGliKSxRcCgxMyxlMiw0LDQsIm5nLXRlbXBsYXRlIixudWxsLDExLGliKSksMiZlKXtjb25zdCB0PSRwKDEyKTtyYyg0KSxEbSgibmdUZW1wbGF0ZU91dGxldCIsdCkscmMoMiksRG0oIm5nRm9yT2YiLG4ucGFnZUl0ZW1zKSgibmdGb3JUcmFja0J5IixuLnRhYmxlVHJhY2tCeSkscmMoMSksRG0oIm5nSWYiLG4ubG9hZGluZykscmMoMSksRG0oIm5nSWYiLCFuLmxvYWRpbmcmJjA9PT1uLmFsbEl0ZW1zTGVuZ3RoKSxyYygxKSxEbSgibmdJZiIsIW4ubG9hZGluZyYmbi5hbGxJdGVtc0xlbmd0aD4wJiYwPT09bi5maWx0ZXJlZEl0ZW1zTGVuZ3RoKSxyYygxKSxEbSgibmdJZiIsbi51c2VQYWdpbmF0aW9uKX19LGRpcmVjdGl2ZXM6W3EwLE1NLGxNLGRNLG8xLHQkLGEkLGFNLGZNLGdNLE9ZLG0kLHcxLFhILGVZLERXLEtXLFdXLEQxLGIzXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Zm9udC1zaXplOjEzcHg7b3ZlcmZsb3c6aGlkZGVufS5maWx0ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4Om5vbmV9LnRhYmxlLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Y29udGFpbjpsYXlvdXQgcGFpbnQ7ZmxleC1ncm93OjE7bWF4LXdpZHRoOjEwMCU7b3ZlcmZsb3cteDphdXRvO292ZXJmbG93LXk6YXV0bzt3aWxsLWNoYW5nZTp0cmFuc2Zvcm0sc2Nyb2xsLXBvc2l0aW9ufS5mbGV4LWxheW91dFtfbmdob3N0LSVDT01QJV0gICAubmFtZVtfbmdjb250ZW50LSVDT01QJV17d29yZC1icmVhazpicmVhay13b3JkO292ZXJmbG93LXdyYXA6YnJlYWstd29yZH0uZmxleC1sYXlvdXRbX25naG9zdC0lQ09NUCVdICAgbWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgI2ViZWJlYjtwYWRkaW5nLWJvdHRvbToxMnB4fWJvZHkuZGFyay1tb2RlICAgLmZsZXgtbGF5b3V0W19uZ2hvc3QtJUNPTVAlXSAgIG1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MXB4IHNvbGlkICM1NTV9W3JvbGU9dGFibGVdW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OnRhYmxlO3dpZHRoOjEwMCV9W3JvbGU9dGFibGVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5oZWFkZXJbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcH1bcm9sZT10YWJsZV1bX25nY29udGVudC0lQ09NUCVdICAgLmhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICBbcm9sZT1jb2x1bW5oZWFkZXJdW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7cG9zaXRpb246c3RpY2t5O3RvcDowO3otaW5kZXg6MX1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICBbcm9sZT10YWJsZV1bX25nY29udGVudC0lQ09NUCVdICAgLmhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICBbcm9sZT1jb2x1bW5oZWFkZXJdW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgW3JvbGU9dGFibGVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgW3JvbGU9Y29sdW1uaGVhZGVyXVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMzAzMDMwfVtyb2xlPXRhYmxlXVtfbmdjb250ZW50LSVDT01QJV0gICBbcm9sZT1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXXtjb250YWluOnN0cmljdDtkaXNwbGF5OnRhYmxlLXJvdztoZWlnaHQ6NDNweH1bcm9sZT10YWJsZV1bX25nY29udGVudC0lQ09NUCVdICAgW3JvbGU9cm93XVtfbmdjb250ZW50LSVDT01QJV0gICAuY29sdW1uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmViO2Rpc3BsYXk6dGFibGUtY2VsbDtwYWRkaW5nOjVweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgW3JvbGU9dGFibGVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIFtyb2xlPXJvd11bX25nY29udGVudC0lQ09NUCVdICAgLmNvbHVtbltfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIFtyb2xlPXRhYmxlXVtfbmdjb250ZW50LSVDT01QJV0gICBbcm9sZT1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jb2x1bW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkICM1NTV9W3JvbGU9dGFibGVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIFtyb2xlPXJvd11bX25nY29udGVudC0lQ09NUCVdICAgLmNvbHVtbltfbmdjb250ZW50LSVDT01QJV06Zmlyc3QtY2hpbGR7cGFkZGluZy1sZWZ0OjI0cHh9W3JvbGU9dGFibGVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIFtyb2xlPXJvd11bX25nY29udGVudC0lQ09NUCVdICAgLmNvbHVtbltfbmdjb250ZW50LSVDT01QJV06bGFzdC1jaGlsZHtwYWRkaW5nLXJpZ2h0OjI0cHh9W3JvbGU9cm93Z3JvdXBdW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OnRhYmxlLXJvdy1ncm91cH1bcm9sZT1yb3dncm91cF0uaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OnRhYmxlLWhlYWRlci1ncm91cH0ubG9hZGluZ1tfbmdjb250ZW50LSVDT01QJV0sIC5uby1ydW5zW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7Ym9yZGVyOjA7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2ViZWJlYjtkaXNwbGF5OmZsZXg7aGVpZ2h0OjQ4cHg7cGFkZGluZzowIDI0cHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmxvYWRpbmdbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAubG9hZGluZ1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzU1NX1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAubm8tcnVuc1tfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5uby1ydW5zW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjNTU1fS5sb2FkaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5zZWxlY3QtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxMnB4O3BhZGRpbmctdG9wOjEycHh9LnNlbGVjdC1hbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV0sIC5zZWxlY3QtYWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS42O3RleHQtYWxpZ246bGVmdH0uc2VsZWN0LWFsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NTAwO3BhZGRpbmc6MCA0cHh9LmZpbHRlci1yb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWI7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtoZWlnaHQ6NDhweDtwYWRkaW5nOjAgMTZweCAwIDIxcHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmZpbHRlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuZmlsdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzU1NX0uZmlsdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0gICB0Yi1maWx0ZXItaW5wdXRbX25nY29udGVudC0lQ09NUCVde2ZsZXgtZ3JvdzoxfS50Yi1jb2x1bW4tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdLCAudGItY29sdW1uLXJ1bl9jb2xvcltfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjBweH0udGItY29sdW1uLXJ1bl9jb2xvcltfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpjZW50ZXJ9LnJ1bi1jb2xvci1zd2F0Y2hbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yYWRpdXM6MTAwJTtib3JkZXI6MXB4IHNvbGlkICNlYmViZWI7aGVpZ2h0OjIwcHg7d2lkdGg6MjBweDtvdXRsaW5lOm5vbmV9LnJ1bi1jb2xvci1zd2F0Y2gubm8tY29sb3JbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojYzZjYWQxO2JvcmRlci13aWR0aDoycHh9LnJhbmdlLWlucHV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OmF1dG99W19uZ2hvc3QtJUNPTVAlXSAgICAgbWF0LXBhZ2luYXRvciBtYXQtZm9ybS1maWVsZHttYXJnaW46MH0uZmlsdGVyLW1lbnUtY2hlY2tib3gtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIG1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV0gICAgIGxhYmVse2Rpc3BsYXk6ZmxleDtoZWlnaHQ6MTAwJTthbGlnbi1pdGVtczpjZW50ZXJ9LmZpbHRlci1tZW51LWNoZWNrYm94LXJvd1tfbmdjb250ZW50LSVDT01QJV0gICBtYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdICAgICBsYWJlbCAubWF0LWNoZWNrYm94LWlubmVyLWNvbnRhaW5lcnttYXJnaW4tbGVmdDowfS5maWx0ZXItbWVudS1jaGVja2JveC1yb3dbX25nY29udGVudC0lQ09NUCVdICAgbWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXSAgICAgbGFiZWwgLm1hdC1jaGVja2JveC1sYWJlbHtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpc31ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICBtYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgbWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMzAzMDMwfSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChvMixbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJydW5zLXRhYmxlLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6InJ1bnNfdGFibGVfY29tcG9uZW50Lm5nLmh0bWwiLGhvc3Q6eyJbY2xhc3MuZmxleC1sYXlvdXRdIjoidXNlRmxleGlibGVMYXlvdXQifSxzdHlsZVVybHM6WyJydW5zX3RhYmxlX2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLHByb3ZpZGVyczpbe3Byb3ZpZGU6WlEsdXNlQ2xhc3M6bjJ9XX1dfV0sbnVsbCx7ZXhwZXJpbWVudElkczpbe3R5cGU6eHl9XSxzaG93RXhwZXJpbWVudE5hbWU6W3t0eXBlOnh5fV0sY29sdW1uczpbe3R5cGU6eHl9XSxocGFyYW1Db2x1bW5zOlt7dHlwZTp4eX1dLG1ldHJpY0NvbHVtbnM6W3t0eXBlOnh5fV0sYWxsSXRlbXNMZW5ndGg6W3t0eXBlOnh5fV0sZmlsdGVyZWRJdGVtc0xlbmd0aDpbe3R5cGU6eHl9XSx1c2VGbGV4aWJsZUxheW91dDpbe3R5cGU6eHl9XSx1c2VQYWdpbmF0aW9uOlt7dHlwZTp4eX1dLHNob3dHcm91cENvbnRyb2w6W3t0eXBlOnh5fV0scGFnZUl0ZW1zOlt7dHlwZTp4eX1dLGxvYWRpbmc6W3t0eXBlOnh5fV0sbnVtU2VsZWN0ZWRJdGVtczpbe3R5cGU6eHl9XSxzb3J0T3B0aW9uOlt7dHlwZTp4eX1dLHBhZ2luYXRpb25PcHRpb246W3t0eXBlOnh5fV0scmVnZXhGaWx0ZXI6W3t0eXBlOnh5fV0sb25SZWdleEZpbHRlckNoYW5nZTpbe3R5cGU6T3l9XSxvblNlbGVjdGlvblRvZ2dsZTpbe3R5cGU6T3l9XSxvblBhZ2VTZWxlY3Rpb25Ub2dnbGU6W3t0eXBlOk95fV0sb25QYWdpbmF0aW9uQ2hhbmdlOlt7dHlwZTpPeX1dLG9uU29ydENoYW5nZTpbe3R5cGU6T3l9XSxvblJ1bkNvbG9yQ2hhbmdlOlt7dHlwZTpPeX1dLG9uSHBhcmFtRGlzY3JldGVGaWx0ZXJDaGFuZ2VkOlt7dHlwZTpPeX1dLG9uSHBhcmFtSW50ZXJ2YWxGaWx0ZXJDaGFuZ2VkOlt7dHlwZTpPeX1dLG9uTWV0cmljRmlsdGVyQ2hhbmdlZDpbe3R5cGU6T3l9XSxmaWx0ZXI6W3t0eXBlOlphLGFyZ3M6WyJmaWx0ZXIiLHtzdGF0aWM6ITAscmVhZDpoZ31dfV0scGFnaW5hdG9yOlt7dHlwZTpaYSxhcmdzOlt0JCx7c3RhdGljOiEwfV19XSxzb3J0Olt7dHlwZTpaYSxhcmdzOlthJCx7c3RhdGljOiEwfV19XX0pO2NvbnN0IGkyPVp3KHBOLCh0PT50LnN0YXRlPT09eUUuTE9BRElORykpO2Z1bmN0aW9uIGEyKHQsZSl7c3dpdGNoKGUudHlwZSl7Y2FzZSAkVC5FWFBFUklNRU5UX05BTUU6cmV0dXJuW3QuZXhwZXJpbWVudEFsaWFzLHQucnVuLm5hbWUsdC5ydW4uaWRdO2Nhc2UgJFQuUlVOX05BTUU6cmV0dXJuW3QucnVuLm5hbWUsdC5leHBlcmltZW50QWxpYXMsdC5ydW4uaWRdO2Nhc2UgJFQuSFBBUkFNOnJldHVyblt0LmhwYXJhbXMuZ2V0KGUubmFtZSksdC5ydW4ubmFtZSx0LmV4cGVyaW1lbnRBbGlhcyx0LnJ1bi5pZF07Y2FzZSAkVC5NRVRSSUM6cmV0dXJuW3QubWV0cmljcy5nZXQoZS50YWcpLHQucnVuLm5hbWUsdC5leHBlcmltZW50QWxpYXMsdC5ydW4uaWRdO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBOb3QgeWV0IGltcGxlbWVudGVkOiAke2V9YCl9fWZ1bmN0aW9uIHIyKHQsZSl7cmV0dXJuIHZvaWQgMD09PWU/dC5pbmNsdWRlVW5kZWZpbmVkOnQudHlwZT09PVpSLkRJU0NSRVRFP3QuZmlsdGVyVmFsdWVzLmluY2x1ZGVzKGUpOnQudHlwZT09PVpSLklOVEVSVkFMJiZ0LmZpbHRlckxvd2VyVmFsdWU8PWUmJmU8PXQuZmlsdGVyVXBwZXJWYWx1ZX1jbGFzcyBzMntjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5sb2FkaW5nJD1udWxsLHRoaXMuaHBhcmFtQ29sdW1ucyQ9RXQoW10pLHRoaXMubWV0cmljQ29sdW1ucyQ9RXQoW10pLHRoaXMudXNlRmxleGlibGVMYXlvdXQ9ITEsdGhpcy51c2VQYWdpbmF0aW9uPSExLHRoaXMuY29sdW1ucz1bdlEuUlVOX05BTUVdLHRoaXMuc2hvd0hwYXJhbXNBbmRNZXRyaWNzPSExLHRoaXMuc29ydE9wdGlvbiQ9dGhpcy5zdG9yZS5zZWxlY3QoeU4pLHRoaXMucGFnaW5hdGlvbk9wdGlvbiQ9dGhpcy5zdG9yZS5zZWxlY3QoYk4pLHRoaXMucmVnZXhGaWx0ZXIkPXRoaXMuc3RvcmUuc2VsZWN0KGdOKSx0aGlzLm5nVW5zdWJzY3JpYmU9bmV3IEl9aXNFeHBlcmltZW50TmFtZVZpc2libGUoKXtyZXR1cm4gdGhpcy5jb2x1bW5zLnNvbWUoKHQ9PnQ9PT12US5FWFBFUklNRU5UX05BTUUpKX1uZ09uSW5pdCgpe2NvbnN0IHQ9V3QodGhpcy5leHBlcmltZW50SWRzLm1hcCgodD0+dGhpcy5nZXRSdW5UYWJsZUl0ZW1zRm9yRXhwZXJpbWVudCh0KSkpKS5waXBlKEl0KCh0PT5bXS5jb25jYXQoLi4udCkpKSk7dGhpcy5hbGxVbnNvcnRlZFJ1blRhYmxlSXRlbXMkPXQucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpLEFlKDEpKSx0aGlzLmFsbEl0ZW1zTGVuZ3RoJD10aGlzLmFsbFVuc29ydGVkUnVuVGFibGVJdGVtcyQucGlwZShJdCgodD0+dC5sZW5ndGgpKSk7Y29uc3QgZT10aGlzLmdldEZpbHRlcmVkSXRlbXMkKHRoaXMuYWxsVW5zb3J0ZWRSdW5UYWJsZUl0ZW1zJCkucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpLEFlKDEpKTt0aGlzLmZpbHRlcmVkSXRlbXNMZW5ndGgkPWUucGlwZShJdCgodD0+dC5sZW5ndGgpKSksdGhpcy5wYWdlSXRlbXMkPXRoaXMuc29ydGVkQW5kU2xpY2VkSXRlbXMkKGUpLHRoaXMubnVtU2VsZWN0ZWRJdGVtcyQ9dGhpcy5hbGxVbnNvcnRlZFJ1blRhYmxlSXRlbXMkLnBpcGUoSXQoKHQ9PnQucmVkdWNlKCgodCxlKT0+dCtOdW1iZXIoZS5zZWxlY3RlZCkpLDApKSkpO2NvbnN0IG49dGhpcy5leHBlcmltZW50SWRzLm1hcCgodD0+dGhpcy5zdG9yZS5zZWxlY3QoaTIse2V4cGVyaW1lbnRJZDp0fSkpKTtpZih0aGlzLmxvYWRpbmckPVd0KG4pLnBpcGUoSXQoKHQ9PnQuc29tZSgodD0+dCkpKSkpLHRoaXMuc2hvd0hwYXJhbXNBbmRNZXRyaWNzKXtjb25zdCB0PXRoaXMuc3RvcmUuc2VsZWN0KFNRLHtleHBlcmltZW50SWRzOnRoaXMuZXhwZXJpbWVudElkc30pO3RoaXMuaHBhcmFtQ29sdW1ucyQ9V3QoW3RoaXMuc3RvcmUuc2VsZWN0KFBRLHRoaXMuZXhwZXJpbWVudElkcyksdF0pLnBpcGUoSXQoKChbdCx7aHBhcmFtczplfV0pPT5lLm1hcCgoKHtuYW1lOmUsZGlzcGxheU5hbWU6bn0pPT57Y29uc3Qgbz10LmdldChlKTtpZighbyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YXJpYW50IGVycm9yOiBhIGZpbHRlciBmb3IgJHtlfSBtdXN0IGV4aXN0IHdoZW4gdGhlIGhwYXJhbSBleGlzdHNgKTtyZXR1cm57ZGlzcGxheU5hbWU6bixuYW1lOmUsZmlsdGVyOm99fSkpKSkpLHRoaXMubWV0cmljQ29sdW1ucyQ9V3QoW3RoaXMuc3RvcmUuc2VsZWN0KGtRLHRoaXMuZXhwZXJpbWVudElkcyksdF0pLnBpcGUoSXQoKChbdCx7bWV0cmljczplfV0pPT5lLm1hcCgoKHt0YWc6ZSxkaXNwbGF5TmFtZTpufSk9Pntjb25zdCBvPXQuZ2V0KGUpO2lmKCFvKXRocm93IG5ldyBSYW5nZUVycm9yKGBJbnZhcmlhbnQgZXJyb3I6IGEgZmlsdGVyIGZvciAke2V9IG11c3QgZXhpc3Qgd2hlbiB0aGUgbWV0cmljIGV4aXN0c2ApO3JldHVybntkaXNwbGF5TmFtZTpuLHRhZzplLGZpbHRlcjpvfX0pKSkpKX10aGlzLmNvbHVtbnMuaW5jbHVkZXModlEuQ0hFQ0tCT1gpJiZ0aGlzLnN0b3JlLnNlbGVjdChOUykucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpLHplKCgoKT0+dC5waXBlKGNlKCh0PT50Lmxlbmd0aD41MDApKSxiZSgxKSkpKSkuc3Vic2NyaWJlKCgoKT0+e3RoaXMuc3RvcmUuZGlzcGF0Y2gobHooe2xvY2FsaXplZE1lc3NhZ2U6IlRoZSBudW1iZXIgb2YgcnVucyBleGNlZWRzIDUwMC4gTmV3IHJ1bnMgYXJlIHVuc2VsZWN0ZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIn0pKX0pKSx0aGlzLnNob3dHcm91cENvbnRyb2wkPXRoaXMuc3RvcmUuc2VsZWN0KGVFKS5waXBlKEl0KCh0PT50JiZ0aGlzLmNvbHVtbnMuaW5jbHVkZXModlEuUlVOX0NPTE9SKSkpKSx0aGlzLnN0b3JlLmRpc3BhdGNoKFVSKHtleHBlcmltZW50SWRzOnRoaXMuZXhwZXJpbWVudElkc30pKX1uZ09uRGVzdHJveSgpe3RoaXMubmdVbnN1YnNjcmliZS5uZXh0KCksdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCl9Z2V0RmlsdGVyZWRJdGVtcyQodCl7cmV0dXJuIFd0KFt0LHRoaXMuc3RvcmUuc2VsZWN0KGdOKV0pLnBpcGUoSXQoKChbdCxlXSk9PntpZighZSlyZXR1cm4gdDtjb25zdCBuPXRoaXMuY29sdW1ucy5pbmNsdWRlcyh2US5FWFBFUklNRU5UX05BTUUpO3JldHVybiB0LmZpbHRlcigodD0+VE4oe3J1bk5hbWU6dC5ydW4ubmFtZSxleHBlcmltZW50QWxpYXM6dC5leHBlcmltZW50QWxpYXMsZXhwZXJpbWVudE5hbWU6dC5leHBlcmltZW50TmFtZX0sZSxuKSkpfSkpLHplKCh0PT50aGlzLnNob3dIcGFyYW1zQW5kTWV0cmljcz9XdCh0aGlzLnN0b3JlLnNlbGVjdChQUSx0aGlzLmV4cGVyaW1lbnRJZHMpLHRoaXMuc3RvcmUuc2VsZWN0KGtRLHRoaXMuZXhwZXJpbWVudElkcykpLnBpcGUoSXQoKChbZSxuXSk9PnQuZmlsdGVyKCgoe2hwYXJhbXM6dCxtZXRyaWNzOm99KT0+Wy4uLmUuZW50cmllcygpXS5ldmVyeSgoKFtlLG5dKT0+cjIobix0LmdldChlKSkpKSYmWy4uLm4uZW50cmllcygpXS5ldmVyeSgoKFt0LGVdKT0+cjIoZSxvLmdldCh0KSkpKSkpKSkpOkV0KHQpKSkpfXNvcnRlZEFuZFNsaWNlZEl0ZW1zJCh0KXtjb25zdCBlPVd0KFt0LHRoaXMuc3RvcmUuc2VsZWN0KHlOKV0pLnBpcGUoSXQoKChbdCxlXSk9PihmdW5jdGlvbiBuKHQsZSl7Y29uc3Qgbj1lLmtleSxvPVsuLi50XTtyZXR1cm4gbnVsbD09PW58fGUuZGlyZWN0aW9uPT09Rk4uVU5TRVR8fG8uc29ydCgoKHQsbyk9Pntjb25zdCBpPWEyKHQsbiksYT1hMihvLG4pO2lmKGkubGVuZ3RoIT09YS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBJbnZhcmlhbnQgZXJyb3I6IGEgZ2l2ZW4gc29ydCBzaG91bGQgcmVzdWx0IGluIHNhbWUgbnVtYmVyIG9mIGl0ZW1zOiAke2V9YCk7Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0Kyspe2NvbnN0IG49aVt0XSxvPWFbdF07aWYobiE9PW8pe2lmKHZvaWQgMD09PW58fHZvaWQgMD09PW8pcmV0dXJuIHZvaWQgMD09PW8/LTE6MTtpZih0eXBlb2YgbiE9dHlwZW9mIG8pdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29tcGFyZSB2YWx1ZXMgb2YgZGlmZmVyZW50IHR5cGVzOiAke3R5cGVvZiBufSB2cy4gJHt0eXBlb2Ygb31gKTtyZXR1cm4gbjxvPT0oZS5kaXJlY3Rpb249PT1GTi5BU0MpPy0xOjF9fXJldHVybiAwfSkpLG99KSh0LGUpKSkpO3JldHVybiBXdChbZSx0aGlzLnN0b3JlLnNlbGVjdChiTildKS5waXBlKEl0KCgoW3QsZV0pPT57aWYoIXRoaXMudXNlUGFnaW5hdGlvbilyZXR1cm4gdC5zbGljZSgpO2NvbnN0e3BhZ2VTaXplOm4scGFnZUluZGV4Om99PWU7cmV0dXJuIHQuc2xpY2UobypuLChvKzEpKm4pfSkpLE5lKFtdKSl9Z2V0UnVuVGFibGVJdGVtc0ZvckV4cGVyaW1lbnQodCl7cmV0dXJuIFd0KFt0aGlzLnN0b3JlLnNlbGVjdChsTix7ZXhwZXJpbWVudElkOnR9KSx0aGlzLnN0b3JlLnNlbGVjdCh1QSx7ZXhwZXJpbWVudElkOnR9KSx0aGlzLnN0b3JlLnNlbGVjdChOTiksdGhpcy5zdG9yZS5zZWxlY3Qoek4pLHRoaXMuc3RvcmUuc2VsZWN0KHpTKV0pLnBpcGUoSXQoKChbZSxuLG8saSxhXSk9PmUubWFwKChlPT57Y29uc3Qgcj1uZXcgTWFwOyhlLmhwYXJhbXN8fFtdKS5mb3JFYWNoKCh0PT57ci5zZXQodC5uYW1lLHQudmFsdWUpfSkpO2NvbnN0IHM9bmV3IE1hcDtyZXR1cm4oZS5tZXRyaWNzfHxbXSkuZm9yRWFjaCgodD0+e3Muc2V0KHQudGFnLHQudmFsdWUpfSkpLHtydW46ZSxleHBlcmltZW50TmFtZToobnVsbD09bj92b2lkIDA6bi5uYW1lKXx8IiIsZXhwZXJpbWVudEFsaWFzOmFbdF0sc2VsZWN0ZWQ6Qm9vbGVhbihvJiZvLmdldChlLmlkKSkscnVuQ29sb3I6aVtlLmlkXSxocGFyYW1zOnIsbWV0cmljczpzfX0pKSkpKX1vblJ1blNlbGVjdGlvblRvZ2dsZSh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKEhSKHtleHBlcmltZW50SWRzOnRoaXMuZXhwZXJpbWVudElkcyxydW5JZDp0LnJ1bi5pZH0pKX1vblBhZ2VTZWxlY3Rpb25Ub2dnbGUodCl7Y29uc3R7aXRlbXM6ZX09dCxuPWUubWFwKCgoe3J1bjp0fSk9PnQuaWQpKTt0aGlzLnN0b3JlLmRpc3BhdGNoKEZSKHtleHBlcmltZW50SWRzOnRoaXMuZXhwZXJpbWVudElkcyxydW5JZHM6bn0pKX1vblBhZ2luYXRpb25DaGFuZ2UodCl7aWYoIXRoaXMudXNlUGFnaW5hdGlvbil0aHJvdyBuZXcgRXJyb3IoIlBhZ2luYXRpb24gZXZlbnRzIGNhbm5vdCBiZSBkaXNwYXRjaGVkIHdoZW4gcGFnaW5hdGlvbiBpcyBkaXNhYmxlZCIpO2NvbnN0e3BhZ2VJbmRleDplLHBhZ2VTaXplOm59PXQ7dGhpcy5zdG9yZS5kaXNwYXRjaChMUih7cGFnZUluZGV4OmUscGFnZVNpemU6bn0pKX1vblNvcnRDaGFuZ2UodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChCUih0KSl9b25SZWdleEZpbHRlckNoYW5nZSh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKFZSKHtyZWdleFN0cmluZzp0fSkpfW9uUnVuQ29sb3JDaGFuZ2Uoe3J1bklkOnQsbmV3Q29sb3I6ZX0pe3RoaXMuc3RvcmUuZGlzcGF0Y2goalIoe3J1bklkOnQsbmV3Q29sb3I6ZX0pKX1vbkhwYXJhbURpc2NyZXRlRmlsdGVyQ2hhbmdlZCh0KXtjb25zdHtocGFyYW1OYW1lOmUsZmlsdGVyVmFsdWVzOm4saW5jbHVkZVVuZGVmaW5lZDpvfT10O3RoaXMuc3RvcmUuZGlzcGF0Y2goS1Ioe2V4cGVyaW1lbnRJZHM6dGhpcy5leHBlcmltZW50SWRzLGhwYXJhbU5hbWU6ZSxmaWx0ZXJWYWx1ZXM6bixpbmNsdWRlVW5kZWZpbmVkOm99KSl9b25IcGFyYW1JbnRlcnZhbEZpbHRlckNoYW5nZWQodCl7Y29uc3R7bmFtZTplLGZpbHRlckxvd2VyVmFsdWU6bixmaWx0ZXJVcHBlclZhbHVlOm8saW5jbHVkZVVuZGVmaW5lZDppfT10O3RoaXMuc3RvcmUuZGlzcGF0Y2goSlIoe2V4cGVyaW1lbnRJZHM6dGhpcy5leHBlcmltZW50SWRzLGhwYXJhbU5hbWU6ZSxmaWx0ZXJMb3dlclZhbHVlOm4sZmlsdGVyVXBwZXJWYWx1ZTpvLGluY2x1ZGVVbmRlZmluZWQ6aX0pKX1vbk1ldHJpY0ZpbHRlckNoYW5nZWQodCl7Y29uc3R7bmFtZTplLGluY2x1ZGVVbmRlZmluZWQ6bixmaWx0ZXJMb3dlclZhbHVlOm8sZmlsdGVyVXBwZXJWYWx1ZTppfT10O3RoaXMuc3RvcmUuZGlzcGF0Y2goUVIoe2V4cGVyaW1lbnRJZHM6dGhpcy5leHBlcmltZW50SWRzLG1ldHJpY1RhZzplLGluY2x1ZGVVbmRlZmluZWQ6bixmaWx0ZXJMb3dlclZhbHVlOm8sZmlsdGVyVXBwZXJWYWx1ZTppfSkpfX1zMi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8czIpKFNtKEl3KSl9LHMyLsm1Y21wPXRvKHt0eXBlOnMyLHNlbGVjdG9yczpbWyJydW5zLXRhYmxlIl1dLGhvc3RWYXJzOjIsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJnB1KCJmbGV4LWxheW91dCIsbi51c2VGbGV4aWJsZUxheW91dCl9LGlucHV0czp7dXNlRmxleGlibGVMYXlvdXQ6InVzZUZsZXhpYmxlTGF5b3V0Iix1c2VQYWdpbmF0aW9uOiJ1c2VQYWdpbmF0aW9uIixjb2x1bW5zOiJjb2x1bW5zIixleHBlcmltZW50SWRzOiJleHBlcmltZW50SWRzIixzaG93SHBhcmFtc0FuZE1ldHJpY3M6InNob3dIcGFyYW1zQW5kTWV0cmljcyJ9LGRlY2xzOjEyLHZhcnM6MzgsY29uc3RzOltbMywiZXhwZXJpbWVudElkcyIsInVzZUZsZXhpYmxlTGF5b3V0IiwibnVtU2VsZWN0ZWRJdGVtcyIsImNvbHVtbnMiLCJocGFyYW1Db2x1bW5zIiwibWV0cmljQ29sdW1ucyIsInNob3dFeHBlcmltZW50TmFtZSIsInBhZ2VJdGVtcyIsImZpbHRlcmVkSXRlbXNMZW5ndGgiLCJhbGxJdGVtc0xlbmd0aCIsImxvYWRpbmciLCJwYWdpbmF0aW9uT3B0aW9uIiwicmVnZXhGaWx0ZXIiLCJzaG93R3JvdXBDb250cm9sIiwic29ydE9wdGlvbiIsInVzZVBhZ2luYXRpb24iLCJvblNlbGVjdGlvblRvZ2dsZSIsIm9uUGFnZVNlbGVjdGlvblRvZ2dsZSIsIm9uUGFnaW5hdGlvbkNoYW5nZSIsIm9uUmVnZXhGaWx0ZXJDaGFuZ2UiLCJvblNvcnRDaGFuZ2UiLCJvblJ1bkNvbG9yQ2hhbmdlIiwib25IcGFyYW1JbnRlcnZhbEZpbHRlckNoYW5nZWQiLCJvbkhwYXJhbURpc2NyZXRlRmlsdGVyQ2hhbmdlZCIsIm9uTWV0cmljRmlsdGVyQ2hhbmdlZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwicnVucy10YWJsZS1jb21wb25lbnQiLDApLFZtKCJvblNlbGVjdGlvblRvZ2dsZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25SdW5TZWxlY3Rpb25Ub2dnbGUoZSl9KSkoIm9uUGFnZVNlbGVjdGlvblRvZ2dsZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25QYWdlU2VsZWN0aW9uVG9nZ2xlKGUpfSkpKCJvblBhZ2luYXRpb25DaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uUGFnaW5hdGlvbkNoYW5nZShlKX0pKSgib25SZWdleEZpbHRlckNoYW5nZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25SZWdleEZpbHRlckNoYW5nZShlKX0pKSgib25Tb3J0Q2hhbmdlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblNvcnRDaGFuZ2UoZSl9KSkoIm9uUnVuQ29sb3JDaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uUnVuQ29sb3JDaGFuZ2UoZSl9KSkoIm9uSHBhcmFtSW50ZXJ2YWxGaWx0ZXJDaGFuZ2VkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vbkhwYXJhbUludGVydmFsRmlsdGVyQ2hhbmdlZChlKX0pKSgib25IcGFyYW1EaXNjcmV0ZUZpbHRlckNoYW5nZWQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uSHBhcmFtRGlzY3JldGVGaWx0ZXJDaGFuZ2VkKGUpfSkpKCJvbk1ldHJpY0ZpbHRlckNoYW5nZWQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uTWV0cmljRmlsdGVyQ2hhbmdlZChlKX0pKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQWgoMywiYXN5bmMiKSxBaCg0LCJhc3luYyIpLEFoKDUsImFzeW5jIiksQWgoNiwiYXN5bmMiKSxBaCg3LCJhc3luYyIpLEFoKDgsImFzeW5jIiksQWgoOSwiYXN5bmMiKSxBaCgxMCwiYXN5bmMiKSxBaCgxMSwiYXN5bmMiKSxBbSgpKSwyJmUmJkRtKCJleHBlcmltZW50SWRzIixuLmV4cGVyaW1lbnRJZHMpKCJ1c2VGbGV4aWJsZUxheW91dCIsbi51c2VGbGV4aWJsZUxheW91dCkoIm51bVNlbGVjdGVkSXRlbXMiLFRoKDEsMTYsbi5udW1TZWxlY3RlZEl0ZW1zJCkpKCJjb2x1bW5zIixuLmNvbHVtbnMpKCJocGFyYW1Db2x1bW5zIixUaCgyLDE4LG4uaHBhcmFtQ29sdW1ucyQpKSgibWV0cmljQ29sdW1ucyIsVGgoMywyMCxuLm1ldHJpY0NvbHVtbnMkKSkoInNob3dFeHBlcmltZW50TmFtZSIsbi5pc0V4cGVyaW1lbnROYW1lVmlzaWJsZSgpKSgicGFnZUl0ZW1zIixUaCg0LDIyLG4ucGFnZUl0ZW1zJCkpKCJmaWx0ZXJlZEl0ZW1zTGVuZ3RoIixUaCg1LDI0LG4uZmlsdGVyZWRJdGVtc0xlbmd0aCQpKSgiYWxsSXRlbXNMZW5ndGgiLFRoKDYsMjYsbi5hbGxJdGVtc0xlbmd0aCQpKSgibG9hZGluZyIsVGgoNywyOCxuLmxvYWRpbmckKSkoInBhZ2luYXRpb25PcHRpb24iLFRoKDgsMzAsbi5wYWdpbmF0aW9uT3B0aW9uJCkpKCJyZWdleEZpbHRlciIsVGgoOSwzMixuLnJlZ2V4RmlsdGVyJCkpKCJzaG93R3JvdXBDb250cm9sIixUaCgxMCwzNCxuLnNob3dHcm91cENvbnRyb2wkKSkoInNvcnRPcHRpb24iLFRoKDExLDM2LG4uc29ydE9wdGlvbiQpKSgidXNlUGFnaW5hdGlvbiIsbi51c2VQYWdpbmF0aW9uKX0sZGlyZWN0aXZlczpbbzJdLHBpcGVzOlt3TV0sc3R5bGVzOlsiLmZsZXgtbGF5b3V0W19uZ2hvc3QtJUNPTVAlXSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB9XG5cbiAgICAgIC5mbGV4LWxheW91dFtfbmdob3N0LSVDT01QJV0gICAgPiBydW5zLXRhYmxlLWNvbXBvbmVudFtfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH0iXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoczIsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoicnVucy10YWJsZSIsdGVtcGxhdGU6J1xuICAgIDxydW5zLXRhYmxlLWNvbXBvbmVudFxuICAgICAgW2V4cGVyaW1lbnRJZHNdPSJleHBlcmltZW50SWRzIlxuICAgICAgW3VzZUZsZXhpYmxlTGF5b3V0XT0idXNlRmxleGlibGVMYXlvdXQiXG4gICAgICBbbnVtU2VsZWN0ZWRJdGVtc109Im51bVNlbGVjdGVkSXRlbXMkIHwgYXN5bmMiXG4gICAgICBbY29sdW1uc109ImNvbHVtbnMiXG4gICAgICBbaHBhcmFtQ29sdW1uc109ImhwYXJhbUNvbHVtbnMkIHwgYXN5bmMiXG4gICAgICBbbWV0cmljQ29sdW1uc109Im1ldHJpY0NvbHVtbnMkIHwgYXN5bmMiXG4gICAgICBbc2hvd0V4cGVyaW1lbnROYW1lXT0iaXNFeHBlcmltZW50TmFtZVZpc2libGUoKSJcbiAgICAgIFtwYWdlSXRlbXNdPSJwYWdlSXRlbXMkIHwgYXN5bmMiXG4gICAgICBbZmlsdGVyZWRJdGVtc0xlbmd0aF09ImZpbHRlcmVkSXRlbXNMZW5ndGgkIHwgYXN5bmMiXG4gICAgICBbYWxsSXRlbXNMZW5ndGhdPSJhbGxJdGVtc0xlbmd0aCQgfCBhc3luYyJcbiAgICAgIFtsb2FkaW5nXT0ibG9hZGluZyQgfCBhc3luYyJcbiAgICAgIFtwYWdpbmF0aW9uT3B0aW9uXT0icGFnaW5hdGlvbk9wdGlvbiQgfCBhc3luYyJcbiAgICAgIFtyZWdleEZpbHRlcl09InJlZ2V4RmlsdGVyJCB8IGFzeW5jIlxuICAgICAgW3Nob3dHcm91cENvbnRyb2xdPSJzaG93R3JvdXBDb250cm9sJCB8IGFzeW5jIlxuICAgICAgW3NvcnRPcHRpb25dPSJzb3J0T3B0aW9uJCB8IGFzeW5jIlxuICAgICAgW3VzZVBhZ2luYXRpb25dPSJ1c2VQYWdpbmF0aW9uIlxuICAgICAgKG9uU2VsZWN0aW9uVG9nZ2xlKT0ib25SdW5TZWxlY3Rpb25Ub2dnbGUoJGV2ZW50KSJcbiAgICAgIChvblBhZ2VTZWxlY3Rpb25Ub2dnbGUpPSJvblBhZ2VTZWxlY3Rpb25Ub2dnbGUoJGV2ZW50KSJcbiAgICAgIChvblBhZ2luYXRpb25DaGFuZ2UpPSJvblBhZ2luYXRpb25DaGFuZ2UoJGV2ZW50KSJcbiAgICAgIChvblJlZ2V4RmlsdGVyQ2hhbmdlKT0ib25SZWdleEZpbHRlckNoYW5nZSgkZXZlbnQpIlxuICAgICAgKG9uU29ydENoYW5nZSk9Im9uU29ydENoYW5nZSgkZXZlbnQpIlxuICAgICAgKG9uUnVuQ29sb3JDaGFuZ2UpPSJvblJ1bkNvbG9yQ2hhbmdlKCRldmVudCkiXG4gICAgICAob25IcGFyYW1JbnRlcnZhbEZpbHRlckNoYW5nZWQpPSJvbkhwYXJhbUludGVydmFsRmlsdGVyQ2hhbmdlZCgkZXZlbnQpIlxuICAgICAgKG9uSHBhcmFtRGlzY3JldGVGaWx0ZXJDaGFuZ2VkKT0ib25IcGFyYW1EaXNjcmV0ZUZpbHRlckNoYW5nZWQoJGV2ZW50KSJcbiAgICAgIChvbk1ldHJpY0ZpbHRlckNoYW5nZWQpPSJvbk1ldHJpY0ZpbHRlckNoYW5nZWQoJGV2ZW50KSJcbiAgICA+PC9ydW5zLXRhYmxlLWNvbXBvbmVudD5cbiAgJyxob3N0OnsiW2NsYXNzLmZsZXgtbGF5b3V0XSI6InVzZUZsZXhpYmxlTGF5b3V0In0sc3R5bGVzOlsiXG4gICAgICA6aG9zdC5mbGV4LWxheW91dCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB9XG5cbiAgICAgIDpob3N0LmZsZXgtbGF5b3V0ID4gcnVucy10YWJsZS1jb21wb25lbnQge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH1cbiAgICAiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLHt1c2VGbGV4aWJsZUxheW91dDpbe3R5cGU6eHl9XSx1c2VQYWdpbmF0aW9uOlt7dHlwZTp4eX1dLGNvbHVtbnM6W3t0eXBlOnh5fV0sZXhwZXJpbWVudElkczpbe3R5cGU6eHl9XSxzaG93SHBhcmFtc0FuZE1ldHJpY3M6W3t0eXBlOnh5fV19KTtjbGFzcyBsMnt9bDIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGwyKX0sbDIuybVjbXA9dG8oe3R5cGU6bDIsc2VsZWN0b3JzOltbInJ1bnMtc2VsZWN0b3ItY29tcG9uZW50Il1dLGlucHV0czp7ZXhwZXJpbWVudElkczoiZXhwZXJpbWVudElkcyIsc2hvd0hwYXJhbXNBbmRNZXRyaWNzOiJzaG93SHBhcmFtc0FuZE1ldHJpY3MiLGNvbHVtbnM6ImNvbHVtbnMifSxkZWNsczoxLHZhcnM6NCxjb25zdHM6W1szLCJ1c2VGbGV4aWJsZUxheW91dCIsImNvbHVtbnMiLCJleHBlcmltZW50SWRzIiwic2hvd0hwYXJhbXNBbmRNZXRyaWNzIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJlRtKDAsInJ1bnMtdGFibGUiLDApLDImZSYmRG0oInVzZUZsZXhpYmxlTGF5b3V0IiwhMCkoImNvbHVtbnMiLG4uY29sdW1ucykoImV4cGVyaW1lbnRJZHMiLG4uZXhwZXJpbWVudElkcykoInNob3dIcGFyYW1zQW5kTWV0cmljcyIsbi5zaG93SHBhcmFtc0FuZE1ldHJpY3MpfSxkaXJlY3RpdmVzOltzMl0sc3R5bGVzOlsicnVucy10YWJsZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICB9Il0sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGwyLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InJ1bnMtc2VsZWN0b3ItY29tcG9uZW50Iix0ZW1wbGF0ZTonXG4gICAgPHJ1bnMtdGFibGVcbiAgICAgIFt1c2VGbGV4aWJsZUxheW91dF09InRydWUiXG4gICAgICBbY29sdW1uc109ImNvbHVtbnMiXG4gICAgICBbZXhwZXJpbWVudElkc109ImV4cGVyaW1lbnRJZHMiXG4gICAgICBbc2hvd0hwYXJhbXNBbmRNZXRyaWNzXT0ic2hvd0hwYXJhbXNBbmRNZXRyaWNzIlxuICAgID48L3J1bnMtdGFibGU+XG4gICcsc3R5bGVzOlsiXG4gICAgICBydW5zLXRhYmxlIHtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgfVxuICAgICJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse2V4cGVyaW1lbnRJZHM6W3t0eXBlOnh5fV0sc2hvd0hwYXJhbXNBbmRNZXRyaWNzOlt7dHlwZTp4eX1dLGNvbHVtbnM6W3t0eXBlOnh5fV19KTtjbGFzcyBjMntjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5leHBlcmltZW50SWRzJD10aGlzLnN0b3JlLnNlbGVjdChUUykucGlwZShJdCgodD0+bnVsbCE9dD90OltdKSkpLHRoaXMuY29sdW1ucyQ9dGhpcy5zdG9yZS5zZWxlY3QoVFMpLnBpcGUoSXQoKHQ9Plt2US5DSEVDS0JPWCx2US5SVU5fTkFNRSx0JiZ0Lmxlbmd0aD4xP3ZRLkVYUEVSSU1FTlRfTkFNRTpudWxsLHZRLlJVTl9DT0xPUl0uZmlsdGVyKCh0PT5udWxsIT09dCkpKSkpfX1jMi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8YzIpKFNtKEl3KSl9LGMyLsm1Y21wPXRvKHt0eXBlOmMyLHNlbGVjdG9yczpbWyJydW5zLXNlbGVjdG9yIl1dLGlucHV0czp7c2hvd0hwYXJhbXNBbmRNZXRyaWNzOiJzaG93SHBhcmFtc0FuZE1ldHJpY3MifSxkZWNsczozLHZhcnM6Nyxjb25zdHM6W1szLCJleHBlcmltZW50SWRzIiwiY29sdW1ucyIsInNob3dIcGFyYW1zQW5kTWV0cmljcyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwicnVucy1zZWxlY3Rvci1jb21wb25lbnQiLDApLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSksMiZlJiZEbSgiZXhwZXJpbWVudElkcyIsVGgoMSwzLG4uZXhwZXJpbWVudElkcyQpKSgiY29sdW1ucyIsVGgoMiw1LG4uY29sdW1ucyQpKSgic2hvd0hwYXJhbXNBbmRNZXRyaWNzIixuLnNob3dIcGFyYW1zQW5kTWV0cmljcyl9LGRpcmVjdGl2ZXM6W2wyXSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoYzIsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoicnVucy1zZWxlY3RvciIsdGVtcGxhdGU6J1xuICAgIDxydW5zLXNlbGVjdG9yLWNvbXBvbmVudFxuICAgICAgW2V4cGVyaW1lbnRJZHNdPSJleHBlcmltZW50SWRzJCB8IGFzeW5jIlxuICAgICAgW2NvbHVtbnNdPSJjb2x1bW5zJCB8IGFzeW5jIlxuICAgICAgW3Nob3dIcGFyYW1zQW5kTWV0cmljc109InNob3dIcGFyYW1zQW5kTWV0cmljcyJcbiAgICA+PC9ydW5zLXNlbGVjdG9yLWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLHtzaG93SHBhcmFtc0FuZE1ldHJpY3M6W3t0eXBlOnh5fV19KTtjb25zdCBkMj1uZXcgV2Vha01hcDtjbGFzcyBwMntjb25zdHJ1Y3Rvcih0LGUpe3RoaXMucm9vdD10LHRoaXMuYnVmZmVyPWUsdGhpcy5kZXN0cm95ZWRUYXJnZXRzPW5ldyBXZWFrU2V0fWluaXRpYWxpemUodCl7dGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlcnx8KHRoaXMuaW50ZXJzZWN0aW9uQ2FsbGJhY2s9dCx0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyPW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcih0aGlzLm9uQ2FyZEludGVyc2VjdGlvbi5iaW5kKHRoaXMpLHt0aHJlc2hvbGQ6MCxyb290OnRoaXMucm9vdCxyb290TWFyZ2luOnRoaXMuYnVmZmVyfSkpfWFkZCh0KXt0aGlzLmVuc3VyZUluaXRpYWxpemVkKCkmJnRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIub2JzZXJ2ZSh0KX13aWxsRGVzdHJveSh0KXt0aGlzLmVuc3VyZUluaXRpYWxpemVkKCkmJnRoaXMuZGVzdHJveWVkVGFyZ2V0cy5hZGQodCl9ZW5zdXJlSW5pdGlhbGl6ZWQoKXtpZighdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlcil0aHJvdyBuZXcgRXJyb3IoIkNhcmRPYnNlcnZlciBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB1c2UiKTtyZXR1cm4hMH1vbkNhcmRJbnRlcnNlY3Rpb24odCl7dC5zb3J0KCgodCxlKT0+dC50aW1lLWUudGltZSkpO2NvbnN0IGU9bmV3IFNldCxuPW5ldyBTZXQ7Zm9yKGNvbnN0e2lzSW50ZXJzZWN0aW5nOm8sdGFyZ2V0Oml9b2YgdClvPyhlLmFkZChpKSxuLmRlbGV0ZShpKSk6KGUuZGVsZXRlKGkpLG4uYWRkKGkpKSx0aGlzLmRlc3Ryb3llZFRhcmdldHMuaGFzKGkpJiYhbyYmKHRoaXMuZGVzdHJveWVkVGFyZ2V0cy5kZWxldGUoaSksdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlci51bm9ic2VydmUoaSkpO3RoaXMuaW50ZXJzZWN0aW9uQ2FsbGJhY2soZSxuKX1vbkNhcmRJbnRlcnNlY3Rpb25Gb3JUZXN0KHQpe3RoaXMub25DYXJkSW50ZXJzZWN0aW9uKHQpfX1jbGFzcyBtMntjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuaG9zdD10LHRoaXMuc3RvcmU9ZX1vbkNhcmRJbnRlcnNlY3Rpb24odCxlKXtjb25zdCBuPVsuLi50XS5tYXAoKHQ9Pntjb25zdCBlPWQyLmdldCh0KTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIkEgQ2FyZE9ic2VydmVyIGVsZW1lbnQgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgZWxlbWVudCBpZCBhbmQgY2FyZCBpZC4iKTtyZXR1cm57ZWxlbWVudElkOmUuZWxlbWVudElkLGNhcmRJZDplLmNhcmRJZH19KSksbz1bLi4uZV0ubWFwKCh0PT57Y29uc3QgZT1kMi5nZXQodCk7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJBIENhcmRPYnNlcnZlciBlbGVtZW50IG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGVsZW1lbnQgaWQgYW5kIGNhcmQgaWQuIik7cmV0dXJue2VsZW1lbnRJZDplLmVsZW1lbnRJZCxjYXJkSWQ6ZS5jYXJkSWR9fSkpO3RoaXMuc3RvcmUuZGlzcGF0Y2goJEUoe2VudGVyZWRDYXJkczpuLGV4aXRlZENhcmRzOm99KSl9bmdPbkluaXQoKXtjb25zdCB0PXRoaXMuaG9zdC5uYXRpdmVFbGVtZW50O2QyLnNldCh0LHtlbGVtZW50SWQ6KGhRKyssU3ltYm9sKGhRKSksY2FyZElkOnRoaXMuY2FyZElkfSksdGhpcy5jYXJkT2JzZXJ2ZXJ8fCh0aGlzLmNhcmRPYnNlcnZlcj1uZXcgcDIpLHRoaXMuY2FyZE9ic2VydmVyLmluaXRpYWxpemUodGhpcy5vbkNhcmRJbnRlcnNlY3Rpb24uYmluZCh0aGlzKSksdGhpcy5jYXJkT2JzZXJ2ZXIuYWRkKHQpfW5nT25EZXN0cm95KCl7dGhpcy5jYXJkT2JzZXJ2ZXImJnRoaXMuY2FyZE9ic2VydmVyLndpbGxEZXN0cm95KHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50KX1ob3N0Rm9yVGVzdCgpe3JldHVybiB0aGlzLmhvc3R9fW0yLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxtMikoU20oaGcpLFNtKEl3KSl9LG0yLsm1ZGlyPWxvKHt0eXBlOm0yLHNlbGVjdG9yczpbWyIiLCJjYXJkTGF6eUxvYWRlciIsIiJdXSxpbnB1dHM6e2NhcmRJZDpbImNhcmRMYXp5TG9hZGVyIiwiY2FyZElkIl0sY2FyZE9ic2VydmVyOiJjYXJkT2JzZXJ2ZXIifX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobTIsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2NhcmRMYXp5TG9hZGVyXSJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6SXd9XX0pLHtjYXJkSWQ6W3t0eXBlOnh5LGFyZ3M6WyJjYXJkTGF6eUxvYWRlciJdfV0sY2FyZE9ic2VydmVyOlt7dHlwZTp4eX1dfSk7Y29uc3QgdTI9Ii9zY2FsYXJfc3VtbWFyeSI7ZnVuY3Rpb24gZjIodCxlKXtsZXQgbj10O3JldHVybiBlJiZ0LnN0YXJ0c1dpdGgoZSsiLyIpJiYobj10LnNsaWNlKGUubGVuZ3RoKzEpKSxuLmVuZHNXaXRoKHUyKSYmKG49bi5zbGljZSgwLC11Mi5sZW5ndGgpKSxufHx0fWZ1bmN0aW9uIGcyKHQsZSl7bGV0IG49MCxvPTA7Zm9yKDs7KXtpZihuPT09dC5sZW5ndGgpcmV0dXJuIG89PT1lLmxlbmd0aD8wOi0xO2lmKG89PT1lLmxlbmd0aClyZXR1cm4gMTtpZihiMih0W25dKSYmYjIoZVtvXSkpe2NvbnN0IGk9bixhPW87bj1oMih0LG4rMSksbz1oMihlLG8rMSk7Y29uc3Qgcj1OdW1iZXIodC5zbGljZShpLG4pKSxzPU51bWJlcihlLnNsaWNlKGEsbykpO2lmKHI8cylyZXR1cm4tMTtpZihyPnMpcmV0dXJuIDF9ZWxzZXtpZih5Mih0W25dKSl7aWYoIXkyKGVbb10pKXJldHVybi0xfWVsc2V7aWYoeTIoZVtvXSkpcmV0dXJuIDE7aWYodFtuXTxlW29dKXJldHVybi0xO2lmKHRbbl0+ZVtvXSlyZXR1cm4gMX1uKyssbysrfX19ZnVuY3Rpb24gaDIodCxlKXtsZXQgbjshKGZ1bmN0aW9uKHQpe3RbdC5OQVRVUkFMPTBdPSJOQVRVUkFMIix0W3QuUkVBTD0xXT0iUkVBTCIsdFt0LkVYUE9ORU5UX1NJR049Ml09IkVYUE9ORU5UX1NJR04iLHRbdC5FWFBPTkVOVD0zXT0iRVhQT05FTlQifSkobnx8KG49e30pKTtsZXQgbz1uLk5BVFVSQUwsaT1lO2Zvcig7aTx0Lmxlbmd0aDtpKyspaWYobz09PW4uTkFUVVJBTCl7aWYoIi4iPT09dFtpXSlvPW4uUkVBTDtlbHNlIGlmKCJlIj09PXRbaV18fCJFIj09PXRbaV0pbz1uLkVYUE9ORU5UX1NJR047ZWxzZSBpZighYjIodFtpXSkpYnJlYWt9ZWxzZSBpZihvPT09bi5SRUFMKXtpZigiZSI9PT10W2ldfHwiRSI9PT10W2ldKW89bi5FWFBPTkVOVF9TSUdOO2Vsc2UgaWYoIWIyKHRbaV0pKWJyZWFrfWVsc2UgaWYobz09PW4uRVhQT05FTlRfU0lHTil7aWYoIWIyKHRbaV0pJiYiKyIhPT10W2ldJiYiLSIhPT10W2ldKWJyZWFrO289bi5FWFBPTkVOVH1lbHNlIGlmKG89PT1uLkVYUE9ORU5UJiYhYjIodFtpXSkpYnJlYWs7cmV0dXJuIGl9ZnVuY3Rpb24gYjIodCl7cmV0dXJuIjAiPD10JiZ0PD0iOSJ9ZnVuY3Rpb24geTIodCl7cmV0dXJuIi8iPT09dHx8YjIodCl9ZnVuY3Rpb24gXzIodCxlKXsxJnQmJlRtKDAsIm1hdC1pY29uIiw3KX1mdW5jdGlvbiBDMih0LGUpe2lmKDEmdCYmKFJtKDAsIm1hdC1vcHRpb24iLDgpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdDtEbSgidmFsdWUiLHQpLGpwKCJ0aXRsZSIsdCkscmMoMSksU3UodCl9fWZ1bmN0aW9uIE0yKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2Iiw5KSxSbSgxLCJlbSIpLGt1KDIpLEFoKDMsIm51bWJlciIpLEFtKCksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoMiksRHUoImFuZCAiLFRoKDMsMSx0LmNvbXBsZXRpb25zLmxlbmd0aC0yNSksIiBtb3JlIHRhZ3MgbWF0Y2hlZCIpfX1jbGFzcyB2Mntjb25zdHJ1Y3Rvcigpe3RoaXMub25SZWdleEZpbHRlclZhbHVlQ2hhbmdlPW5ldyBMaH1vbkNvbXBsZXRpb25BY2NlcHRlZCh0KXt0aGlzLm9uUmVnZXhGaWx0ZXJWYWx1ZUNoYW5nZS5lbWl0KChmdW5jdGlvbiBlKHQpe3JldHVybiB0LnJlcGxhY2UoQkwsIlxcJCYiKX0pKHQpKX19djIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHYyKX0sdjIuybVjbXA9dG8oe3R5cGU6djIsc2VsZWN0b3JzOltbIm1ldHJpY3MtdGFnLWZpbHRlci1jb21wb25lbnQiXV0saG9zdFZhcnM6Mixob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmcHUoInZhbGlkIixuLmlzUmVnZXhGaWx0ZXJWYWxpZCl9LGlucHV0czp7cmVnZXhGaWx0ZXJWYWx1ZToicmVnZXhGaWx0ZXJWYWx1ZSIsaXNSZWdleEZpbHRlclZhbGlkOiJpc1JlZ2V4RmlsdGVyVmFsaWQiLGNvbXBsZXRpb25zOiJjb21wbGV0aW9ucyJ9LG91dHB1dHM6e29uUmVnZXhGaWx0ZXJWYWx1ZUNoYW5nZToib25SZWdleEZpbHRlclZhbHVlQ2hhbmdlIn0sZGVjbHM6Nyx2YXJzOjUsY29uc3RzOltbMSwidGFnLWZpbHRlciJdLFsicGxhY2Vob2xkZXIiLCJGaWx0ZXIgdGFncyAocmVnZXgpIiwzLCJ2YWx1ZSIsIm1hdEF1dG9jb21wbGV0ZSIsImlucHV0Il0sWyJzdmdJY29uIiwiZXJyb3JfMjRweCIsImNsYXNzIiwiZXJyb3ItaWNvbiIsInRpdGxlIiwiSW52YWxpZCByZWdleCBmaWx0ZXIuIFRoZSByZXN1bHQgbWF5IGJlIHN0YWxlLiIsNCwibmdJZiJdLFsxLCJ0YWctb3B0aW9ucyIsMywib3B0aW9uU2VsZWN0ZWQiXSxbImZpbHRlck1hdGNoZXMiLCJtYXRBdXRvY29tcGxldGUiXSxbImNsYXNzIiwib3B0aW9uIiwzLCJ2YWx1ZSIsNCwibmdGb3IiLCJuZ0Zvck9mIl0sWyJjbGFzcyIsImFuZC1tb3JlIiw0LCJuZ0lmIl0sWyJzdmdJY29uIiwiZXJyb3JfMjRweCIsInRpdGxlIiwiSW52YWxpZCByZWdleCBmaWx0ZXIuIFRoZSByZXN1bHQgbWF5IGJlIHN0YWxlLiIsMSwiZXJyb3ItaWNvbiJdLFsxLCJvcHRpb24iLDMsInZhbHVlIl0sWzEsImFuZC1tb3JlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihSbSgwLCJkaXYiLDApLFJtKDEsInRiLWZpbHRlci1pbnB1dCIsMSksVm0oImlucHV0IiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UuZW1pdChlLnRhcmdldC52YWx1ZSl9KSksQW0oKSxRcCgyLF8yLDEsMCwibWF0LWljb24iLDIpLEFtKCksUm0oMywibWF0LWF1dG9jb21wbGV0ZSIsMyw0KSxWbSgib3B0aW9uU2VsZWN0ZWQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uQ29tcGxldGlvbkFjY2VwdGVkKGUub3B0aW9uLnZhbHVlKX0pKSxRcCg1LEMyLDIsMywibWF0LW9wdGlvbiIsNSksUXAoNixNMiw0LDMsImRpdiIsNiksQW0oKSksMiZlKXtjb25zdCB0PSRwKDQpO3JjKDEpLERtKCJ2YWx1ZSIsbi5yZWdleEZpbHRlclZhbHVlKSgibWF0QXV0b2NvbXBsZXRlIix0KSxyYygxKSxEbSgibmdJZiIsIW4uaXNSZWdleEZpbHRlclZhbGlkKSxyYygzKSxEbSgibmdGb3JPZiIsbnVsbD09bi5jb21wbGV0aW9ucz9udWxsOm4uY29tcGxldGlvbnMuc2xpY2UoMCwyNSkpLHJjKDEpLERtKCJuZ0lmIiwobnVsbD09bi5jb21wbGV0aW9ucz9udWxsOm4uY29tcGxldGlvbnMubGVuZ3RoKT4yNSl9fSxkaXJlY3RpdmVzOltxMCxkTSxIMCxsTSxEVyxCSF0scGlwZXM6W0ZNXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0udGFnLWZpbHRlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOnJlbGF0aXZlfXRiLWZpbHRlci1pbnB1dFtfbmdjb250ZW50LSVDT01QJV17ZmxleC1ncm93OjF9W19uZ2hvc3QtJUNPTVAlXXtjb2xvcjojMjEyMTIxfWJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXXtjb2xvcjojZmZmfVtfbmdob3N0LSVDT01QJV06bm90KC52YWxpZCl7Y29sb3I6I2M2MjgyOH1bX25naG9zdC0lQ09NUCVdOm5vdCgudmFsaWQpICAgLmVycm9yLWljb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNjNjI4Mjg7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MH0gIC50YWctb3B0aW9ucyAub3B0aW9uLCAgIC50YWctb3B0aW9ucyAuYW5kLW1vcmV7LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsOy13ZWJraXQtbGluZS1jbGFtcDozO2Rpc3BsYXk6LXdlYmtpdC1ib3g7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS40O3BhZGRpbmc6OHB4IDE2cHh9ICAudGFnLW9wdGlvbnMgLmFuZC1tb3Jle2NvbG9yOiM2MTYxNjF9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgICAudGFnLW9wdGlvbnMgLmFuZC1tb3JlLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAgIC50YWctb3B0aW9ucyAuYW5kLW1vcmV7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHYyLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1ldHJpY3MtdGFnLWZpbHRlci1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiJmaWx0ZXJfaW5wdXRfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbImZpbHRlcl9pbnB1dF9jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7cmVnZXhGaWx0ZXJWYWx1ZTpbe3R5cGU6eHl9XSxpc1JlZ2V4RmlsdGVyVmFsaWQ6W3t0eXBlOlB5LGFyZ3M6WyJjbGFzcy52YWxpZCJdfSx7dHlwZTp4eX1dLGNvbXBsZXRpb25zOlt7dHlwZTp4eX1dLG9uUmVnZXhGaWx0ZXJWYWx1ZUNoYW5nZTpbe3R5cGU6T3l9XX0pO2NsYXNzIHgye2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLnRhZ0ZpbHRlciQ9dGhpcy5zdG9yZS5zZWxlY3QoQlQpLHRoaXMuaXNUYWdGaWx0ZXJSZWdleFZhbGlkJD10aGlzLnRhZ0ZpbHRlciQucGlwZShJdCgodD0+e3RyeXtyZXR1cm4gbmV3IFJlZ0V4cCh0KSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KSkpLHRoaXMuY29tcGxldGlvbnMkPXRoaXMuc3RvcmUuc2VsZWN0KE1UKS5waXBlKGZlKHRoaXMuc3RvcmUuc2VsZWN0KHFUKSksSXQoKChbdCxlXSk9PnQuZmlsdGVyKCgoe3BsdWdpbjp0fSk9PiFlLnNpemV8fGUuaGFzKHQpKSkubWFwKCgoe3RhZzp0fSk9PnQpKSkpLEl0KCh0PT5bLi4ubmV3IFNldCh0KV0pKSxJdCgodD0+dC5zb3J0KGcyKSkpLGZlKHRoaXMuc3RvcmUuc2VsZWN0KEJUKSksSXQoKChbdCxlXSk9Pnt0cnl7cmV0dXJuW3QsbmV3IFJlZ0V4cChlLCJpIildfWNhdGNoKGUpe3JldHVyblt0LG51bGxdfX0pKSxjZSgoKFssdF0pPT5udWxsIT09dCkpLEl0KCgoW3QsZV0pPT50LmZpbHRlcigodD0+ZS50ZXN0KHQpKSkpKSl9b25UYWdGaWx0ZXJDaGFuZ2UodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChlUih7dGFnRmlsdGVyOnR9KSl9fXgyLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx4MikoU20oSXcpKX0seDIuybVjbXA9dG8oe3R5cGU6eDIsc2VsZWN0b3JzOltbIm1ldHJpY3MtdGFnLWZpbHRlciJdXSxkZWNsczo0LHZhcnM6OSxjb25zdHM6W1szLCJyZWdleEZpbHRlclZhbHVlIiwiaXNSZWdleEZpbHRlclZhbGlkIiwiY29tcGxldGlvbnMiLCJvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsIm1ldHJpY3MtdGFnLWZpbHRlci1jb21wb25lbnQiLDApLFZtKCJvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uVGFnRmlsdGVyQ2hhbmdlKGUpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBaCgzLCJhc3luYyIpLEFtKCkpLDImZSYmRG0oInJlZ2V4RmlsdGVyVmFsdWUiLFRoKDEsMyxuLnRhZ0ZpbHRlciQpKSgiaXNSZWdleEZpbHRlclZhbGlkIixUaCgyLDUsbi5pc1RhZ0ZpbHRlclJlZ2V4VmFsaWQkKSkoImNvbXBsZXRpb25zIixUaCgzLDcsbi5jb21wbGV0aW9ucyQpKX0sZGlyZWN0aXZlczpbdjJdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh4Mixbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtZXRyaWNzLXRhZy1maWx0ZXIiLHRlbXBsYXRlOidcbiAgICA8bWV0cmljcy10YWctZmlsdGVyLWNvbXBvbmVudFxuICAgICAgW3JlZ2V4RmlsdGVyVmFsdWVdPSJ0YWdGaWx0ZXIkIHwgYXN5bmMiXG4gICAgICBbaXNSZWdleEZpbHRlclZhbGlkXT0iaXNUYWdGaWx0ZXJSZWdleFZhbGlkJCB8IGFzeW5jIlxuICAgICAgW2NvbXBsZXRpb25zXT0iY29tcGxldGlvbnMkIHwgYXN5bmMiXG4gICAgICAob25SZWdleEZpbHRlclZhbHVlQ2hhbmdlKT0ib25UYWdGaWx0ZXJDaGFuZ2UoJGV2ZW50KSJcbiAgICA+PC9tZXRyaWNzLXRhZy1maWx0ZXItY29tcG9uZW50PlxuICAnLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y29uc3QgTzI9WyJidXR0b24iXSxQMj1uZXcgR2EoIk1BVF9CVVRUT05fVE9HR0xFX0RFRkFVTFRfT1BUSU9OUyIpLHcyPW5ldyBHYSgiTWF0QnV0dG9uVG9nZ2xlR3JvdXAiKSxrMj17cHJvdmlkZTpJVix1c2VFeGlzdGluZzpxZSgoKCk9PkUyKSksbXVsdGk6ITB9O2xldCBTMj0wO2NsYXNzIEQye2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5zb3VyY2U9dCx0aGlzLnZhbHVlPWV9fWNsYXNzIEUye2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fY2hhbmdlRGV0ZWN0b3I9dCx0aGlzLl92ZXJ0aWNhbD0hMSx0aGlzLl9tdWx0aXBsZT0hMSx0aGlzLl9kaXNhYmxlZD0hMSx0aGlzLl9jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuPSgpPT57fSx0aGlzLl9vblRvdWNoZWQ9KCk9Pnt9LHRoaXMuX25hbWU9Im1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLSIrUzIrKyx0aGlzLnZhbHVlQ2hhbmdlPW5ldyBMaCx0aGlzLmNoYW5nZT1uZXcgTGgsdGhpcy5hcHBlYXJhbmNlPWUmJmUuYXBwZWFyYW5jZT9lLmFwcGVhcmFuY2U6InN0YW5kYXJkIn1nZXQgbmFtZSgpe3JldHVybiB0aGlzLl9uYW1lfXNldCBuYW1lKHQpe3RoaXMuX25hbWU9dCx0aGlzLl9idXR0b25Ub2dnbGVzJiZ0aGlzLl9idXR0b25Ub2dnbGVzLmZvckVhY2goKHQ9Pnt0Lm5hbWU9dGhpcy5fbmFtZSx0Ll9tYXJrRm9yQ2hlY2soKX0pKX1nZXQgdmVydGljYWwoKXtyZXR1cm4gdGhpcy5fdmVydGljYWx9c2V0IHZlcnRpY2FsKHQpe3RoaXMuX3ZlcnRpY2FsPXl6KHQpfWdldCB2YWx1ZSgpe2NvbnN0IHQ9dGhpcy5fc2VsZWN0aW9uTW9kZWw/dGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQ6W107cmV0dXJuIHRoaXMubXVsdGlwbGU/dC5tYXAoKHQ9PnQudmFsdWUpKTp0WzBdP3RbMF0udmFsdWU6dm9pZCAwfXNldCB2YWx1ZSh0KXt0aGlzLl9zZXRTZWxlY3Rpb25CeVZhbHVlKHQpLHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKX1nZXQgc2VsZWN0ZWQoKXtjb25zdCB0PXRoaXMuX3NlbGVjdGlvbk1vZGVsP3RoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkOltdO3JldHVybiB0aGlzLm11bHRpcGxlP3Q6dFswXXx8bnVsbH1nZXQgbXVsdGlwbGUoKXtyZXR1cm4gdGhpcy5fbXVsdGlwbGV9c2V0IG11bHRpcGxlKHQpe3RoaXMuX211bHRpcGxlPXl6KHQpfWdldCBkaXNhYmxlZCgpe3JldHVybiB0aGlzLl9kaXNhYmxlZH1zZXQgZGlzYWJsZWQodCl7dGhpcy5fZGlzYWJsZWQ9eXoodCksdGhpcy5fYnV0dG9uVG9nZ2xlcyYmdGhpcy5fYnV0dG9uVG9nZ2xlcy5mb3JFYWNoKCh0PT50Ll9tYXJrRm9yQ2hlY2soKSkpfW5nT25Jbml0KCl7dGhpcy5fc2VsZWN0aW9uTW9kZWw9bmV3IG9GKHRoaXMubXVsdGlwbGUsdm9pZCAwLCExKX1uZ0FmdGVyQ29udGVudEluaXQoKXt0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3QoLi4udGhpcy5fYnV0dG9uVG9nZ2xlcy5maWx0ZXIoKHQ9PnQuY2hlY2tlZCkpKX13cml0ZVZhbHVlKHQpe3RoaXMudmFsdWU9dCx0aGlzLl9jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKX1yZWdpc3Rlck9uQ2hhbmdlKHQpe3RoaXMuX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm49dH1yZWdpc3Rlck9uVG91Y2hlZCh0KXt0aGlzLl9vblRvdWNoZWQ9dH1zZXREaXNhYmxlZFN0YXRlKHQpe3RoaXMuZGlzYWJsZWQ9dH1fZW1pdENoYW5nZUV2ZW50KCl7Y29uc3QgdD10aGlzLnNlbGVjdGVkLGU9QXJyYXkuaXNBcnJheSh0KT90W3QubGVuZ3RoLTFdOnQsbj1uZXcgRDIoZSx0aGlzLnZhbHVlKTt0aGlzLl9jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuKG4udmFsdWUpLHRoaXMuY2hhbmdlLmVtaXQobil9X3N5bmNCdXR0b25Ub2dnbGUodCxlLG49ITEsbz0hMSl7dGhpcy5tdWx0aXBsZXx8IXRoaXMuc2VsZWN0ZWR8fHQuY2hlY2tlZHx8KHRoaXMuc2VsZWN0ZWQuY2hlY2tlZD0hMSksdGhpcy5fc2VsZWN0aW9uTW9kZWw/ZT90aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3QodCk6dGhpcy5fc2VsZWN0aW9uTW9kZWwuZGVzZWxlY3QodCk6bz0hMCxvP1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oKCgpPT50aGlzLl91cGRhdGVNb2RlbFZhbHVlKG4pKSk6dGhpcy5fdXBkYXRlTW9kZWxWYWx1ZShuKX1faXNTZWxlY3RlZCh0KXtyZXR1cm4gdGhpcy5fc2VsZWN0aW9uTW9kZWwmJnRoaXMuX3NlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWQodCl9X2lzUHJlY2hlY2tlZCh0KXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fcmF3VmFsdWUmJih0aGlzLm11bHRpcGxlJiZBcnJheS5pc0FycmF5KHRoaXMuX3Jhd1ZhbHVlKT90aGlzLl9yYXdWYWx1ZS5zb21lKChlPT5udWxsIT10LnZhbHVlJiZlPT09dC52YWx1ZSkpOnQudmFsdWU9PT10aGlzLl9yYXdWYWx1ZSl9X3NldFNlbGVjdGlvbkJ5VmFsdWUodCl7aWYodGhpcy5fcmF3VmFsdWU9dCx0aGlzLl9idXR0b25Ub2dnbGVzKWlmKHRoaXMubXVsdGlwbGUmJnQpe2lmKCFBcnJheS5pc0FycmF5KHQpJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkpdGhyb3cgRXJyb3IoIlZhbHVlIG11c3QgYmUgYW4gYXJyYXkgaW4gbXVsdGlwbGUtc2VsZWN0aW9uIG1vZGUuIik7dGhpcy5fY2xlYXJTZWxlY3Rpb24oKSx0LmZvckVhY2goKHQ9PnRoaXMuX3NlbGVjdFZhbHVlKHQpKSl9ZWxzZSB0aGlzLl9jbGVhclNlbGVjdGlvbigpLHRoaXMuX3NlbGVjdFZhbHVlKHQpfV9jbGVhclNlbGVjdGlvbigpe3RoaXMuX3NlbGVjdGlvbk1vZGVsLmNsZWFyKCksdGhpcy5fYnV0dG9uVG9nZ2xlcy5mb3JFYWNoKCh0PT50LmNoZWNrZWQ9ITEpKX1fc2VsZWN0VmFsdWUodCl7Y29uc3QgZT10aGlzLl9idXR0b25Ub2dnbGVzLmZpbmQoKGU9Pm51bGwhPWUudmFsdWUmJmUudmFsdWU9PT10KSk7ZSYmKGUuY2hlY2tlZD0hMCx0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3QoZSkpfV91cGRhdGVNb2RlbFZhbHVlKHQpe3QmJnRoaXMuX2VtaXRDaGFuZ2VFdmVudCgpLHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKX19RTIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEUyKShTbShVZyksU20oUDIsOCkpfSxFMi7JtWRpcj1sbyh7dHlwZTpFMixzZWxlY3RvcnM6W1sibWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAiXV0sY29udGVudFF1ZXJpZXM6ZnVuY3Rpb24gdChlLG4sbyl7aWYoMSZlJiYkaChvLEEyLDUpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uX2J1dHRvblRvZ2dsZXM9dCl9fSxob3N0QXR0cnM6WyJyb2xlIiwiZ3JvdXAiLDEsIm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIl0saG9zdFZhcnM6NSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmKGpwKCJhcmlhLWRpc2FibGVkIixuLmRpc2FibGVkKSxwdSgibWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWwiLG4udmVydGljYWwpKCJtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkIiwic3RhbmRhcmQiPT09bi5hcHBlYXJhbmNlKSl9LGlucHV0czp7YXBwZWFyYW5jZToiYXBwZWFyYW5jZSIsbmFtZToibmFtZSIsdmVydGljYWw6InZlcnRpY2FsIix2YWx1ZToidmFsdWUiLG11bHRpcGxlOiJtdWx0aXBsZSIsZGlzYWJsZWQ6ImRpc2FibGVkIn0sb3V0cHV0czp7dmFsdWVDaGFuZ2U6InZhbHVlQ2hhbmdlIixjaGFuZ2U6ImNoYW5nZSJ9LGV4cG9ydEFzOlsibWF0QnV0dG9uVG9nZ2xlR3JvdXAiXSxmZWF0dXJlczpbcGcoW2syLHtwcm92aWRlOncyLHVzZUV4aXN0aW5nOkUyfV0pXX0pLEUyLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6VWd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbUDJdfV19XSxFMi5wcm9wRGVjb3JhdG9ycz17X2J1dHRvblRvZ2dsZXM6W3t0eXBlOllhLGFyZ3M6W3FlKCgoKT0+QTIpKSx7ZGVzY2VuZGFudHM6ITB9XX1dLGFwcGVhcmFuY2U6W3t0eXBlOnh5fV0sbmFtZTpbe3R5cGU6eHl9XSx2ZXJ0aWNhbDpbe3R5cGU6eHl9XSx2YWx1ZTpbe3R5cGU6eHl9XSx2YWx1ZUNoYW5nZTpbe3R5cGU6T3l9XSxtdWx0aXBsZTpbe3R5cGU6eHl9XSxkaXNhYmxlZDpbe3R5cGU6eHl9XSxjaGFuZ2U6W3t0eXBlOk95fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRTIsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoibWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAiLHByb3ZpZGVyczpbazIse3Byb3ZpZGU6dzIsdXNlRXhpc3Rpbmc6RTJ9XSxob3N0Ontyb2xlOiJncm91cCIsY2xhc3M6Im1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIiwiW2F0dHIuYXJpYS1kaXNhYmxlZF0iOiJkaXNhYmxlZCIsIltjbGFzcy5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbF0iOiJ2ZXJ0aWNhbCIsIltjbGFzcy5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkXSI6J2FwcGVhcmFuY2UgPT09ICJzdGFuZGFyZCInfSxleHBvcnRBczoibWF0QnV0dG9uVG9nZ2xlR3JvdXAifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6VWd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbUDJdfV19XX0pLHt2YWx1ZUNoYW5nZTpbe3R5cGU6T3l9XSxjaGFuZ2U6W3t0eXBlOk95fV0sYXBwZWFyYW5jZTpbe3R5cGU6eHl9XSxuYW1lOlt7dHlwZTp4eX1dLHZlcnRpY2FsOlt7dHlwZTp4eX1dLHZhbHVlOlt7dHlwZTp4eX1dLG11bHRpcGxlOlt7dHlwZTp4eX1dLGRpc2FibGVkOlt7dHlwZTp4eX1dLF9idXR0b25Ub2dnbGVzOlt7dHlwZTpZYSxhcmdzOltxZSgoKCk9PkEyKSkse2Rlc2NlbmRhbnRzOiEwfV19XX0pO2NvbnN0IFIyPVFJKGNsYXNze30pO2NsYXNzIEEyIGV4dGVuZHMgUjJ7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEpe3N1cGVyKCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWY9ZSx0aGlzLl9lbGVtZW50UmVmPW4sdGhpcy5fZm9jdXNNb25pdG9yPW8sdGhpcy5faXNTaW5nbGVTZWxlY3Rvcj0hMSx0aGlzLl9jaGVja2VkPSExLHRoaXMuYXJpYUxhYmVsbGVkYnk9bnVsbCx0aGlzLl9kaXNhYmxlZD0hMSx0aGlzLmNoYW5nZT1uZXcgTGg7Y29uc3Qgcj1OdW1iZXIoaSk7dGhpcy50YWJJbmRleD1yfHwwPT09cj9yOm51bGwsdGhpcy5idXR0b25Ub2dnbGVHcm91cD10LHRoaXMuYXBwZWFyYW5jZT1hJiZhLmFwcGVhcmFuY2U/YS5hcHBlYXJhbmNlOiJzdGFuZGFyZCJ9Z2V0IGJ1dHRvbklkKCl7cmV0dXJuYCR7dGhpcy5pZH0tYnV0dG9uYH1nZXQgYXBwZWFyYW5jZSgpe3JldHVybiB0aGlzLmJ1dHRvblRvZ2dsZUdyb3VwP3RoaXMuYnV0dG9uVG9nZ2xlR3JvdXAuYXBwZWFyYW5jZTp0aGlzLl9hcHBlYXJhbmNlfXNldCBhcHBlYXJhbmNlKHQpe3RoaXMuX2FwcGVhcmFuY2U9dH1nZXQgY2hlY2tlZCgpe3JldHVybiB0aGlzLmJ1dHRvblRvZ2dsZUdyb3VwP3RoaXMuYnV0dG9uVG9nZ2xlR3JvdXAuX2lzU2VsZWN0ZWQodGhpcyk6dGhpcy5fY2hlY2tlZH1zZXQgY2hlY2tlZCh0KXtjb25zdCBlPXl6KHQpO2UhPT10aGlzLl9jaGVja2VkJiYodGhpcy5fY2hlY2tlZD1lLHRoaXMuYnV0dG9uVG9nZ2xlR3JvdXAmJnRoaXMuYnV0dG9uVG9nZ2xlR3JvdXAuX3N5bmNCdXR0b25Ub2dnbGUodGhpcyx0aGlzLl9jaGVja2VkKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSl9Z2V0IGRpc2FibGVkKCl7cmV0dXJuIHRoaXMuX2Rpc2FibGVkfHx0aGlzLmJ1dHRvblRvZ2dsZUdyb3VwJiZ0aGlzLmJ1dHRvblRvZ2dsZUdyb3VwLmRpc2FibGVkfXNldCBkaXNhYmxlZCh0KXt0aGlzLl9kaXNhYmxlZD15eih0KX1uZ09uSW5pdCgpe2NvbnN0IHQ9dGhpcy5idXR0b25Ub2dnbGVHcm91cDt0aGlzLl9pc1NpbmdsZVNlbGVjdG9yPXQmJiF0Lm11bHRpcGxlLHRoaXMuaWQ9dGhpcy5pZHx8Im1hdC1idXR0b24tdG9nZ2xlLSIrUzIrKyx0aGlzLl9pc1NpbmdsZVNlbGVjdG9yJiYodGhpcy5uYW1lPXQubmFtZSksdCYmKHQuX2lzUHJlY2hlY2tlZCh0aGlzKT90aGlzLmNoZWNrZWQ9ITA6dC5faXNTZWxlY3RlZCh0aGlzKSE9PXRoaXMuX2NoZWNrZWQmJnQuX3N5bmNCdXR0b25Ub2dnbGUodGhpcyx0aGlzLl9jaGVja2VkKSl9bmdBZnRlclZpZXdJbml0KCl7dGhpcy5fZm9jdXNNb25pdG9yLm1vbml0b3IodGhpcy5fZWxlbWVudFJlZiwhMCl9bmdPbkRlc3Ryb3koKXtjb25zdCB0PXRoaXMuYnV0dG9uVG9nZ2xlR3JvdXA7dGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKHRoaXMuX2VsZW1lbnRSZWYpLHQmJnQuX2lzU2VsZWN0ZWQodGhpcykmJnQuX3N5bmNCdXR0b25Ub2dnbGUodGhpcywhMSwhMSwhMCl9Zm9jdXModCl7dGhpcy5fYnV0dG9uRWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKHQpfV9vbkJ1dHRvbkNsaWNrKCl7Y29uc3QgdD0hIXRoaXMuX2lzU2luZ2xlU2VsZWN0b3J8fCF0aGlzLl9jaGVja2VkO3QhPT10aGlzLl9jaGVja2VkJiYodGhpcy5fY2hlY2tlZD10LHRoaXMuYnV0dG9uVG9nZ2xlR3JvdXAmJih0aGlzLmJ1dHRvblRvZ2dsZUdyb3VwLl9zeW5jQnV0dG9uVG9nZ2xlKHRoaXMsdGhpcy5fY2hlY2tlZCwhMCksdGhpcy5idXR0b25Ub2dnbGVHcm91cC5fb25Ub3VjaGVkKCkpKSx0aGlzLmNoYW5nZS5lbWl0KG5ldyBEMih0aGlzLHRoaXMudmFsdWUpKX1fbWFya0ZvckNoZWNrKCl7dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9fUEyLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxBMikoU20odzIsOCksU20oVWcpLFNtKGhnKSxTbShTSSksTmEoInRhYmluZGV4IiksU20oUDIsOCkpfSxBMi7JtWNtcD10byh7dHlwZTpBMixzZWxlY3RvcnM6W1sibWF0LWJ1dHRvbi10b2dnbGUiXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJlFoKE8yLDUpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uX2J1dHRvbkVsZW1lbnQ9dC5maXJzdCl9fSxob3N0QXR0cnM6WyJyb2xlIiwicHJlc2VudGF0aW9uIiwxLCJtYXQtYnV0dG9uLXRvZ2dsZSJdLGhvc3RWYXJzOjEyLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgiZm9jdXMiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uZm9jdXMoKX0pKSwyJmUmJihqcCgiYXJpYS1sYWJlbCIsbnVsbCkoImFyaWEtbGFiZWxsZWRieSIsbnVsbCkoImlkIixuLmlkKSgibmFtZSIsbnVsbCkscHUoIm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUiLCFuLmJ1dHRvblRvZ2dsZUdyb3VwKSgibWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZCIsbi5jaGVja2VkKSgibWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQiLG4uZGlzYWJsZWQpKCJtYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkIiwic3RhbmRhcmQiPT09bi5hcHBlYXJhbmNlKSl9LGlucHV0czp7ZGlzYWJsZVJpcHBsZToiZGlzYWJsZVJpcHBsZSIsYXJpYUxhYmVsbGVkYnk6WyJhcmlhLWxhYmVsbGVkYnkiLCJhcmlhTGFiZWxsZWRieSJdLHRhYkluZGV4OiJ0YWJJbmRleCIsYXBwZWFyYW5jZToiYXBwZWFyYW5jZSIsY2hlY2tlZDoiY2hlY2tlZCIsZGlzYWJsZWQ6ImRpc2FibGVkIixpZDoiaWQiLG5hbWU6Im5hbWUiLGFyaWFMYWJlbDpbImFyaWEtbGFiZWwiLCJhcmlhTGFiZWwiXSx2YWx1ZToidmFsdWUifSxvdXRwdXRzOntjaGFuZ2U6ImNoYW5nZSJ9LGV4cG9ydEFzOlsibWF0QnV0dG9uVG9nZ2xlIl0sZmVhdHVyZXM6W3hwXSxuZ0NvbnRlbnRTZWxlY3RvcnM6WyIqIl0sZGVjbHM6Nix2YXJzOjksY29uc3RzOltbInR5cGUiLCJidXR0b24iLDEsIm1hdC1idXR0b24tdG9nZ2xlLWJ1dHRvbiIsIm1hdC1mb2N1cy1pbmRpY2F0b3IiLDMsImlkIiwiZGlzYWJsZWQiLCJjbGljayJdLFsiYnV0dG9uIiwiIl0sWzEsIm1hdC1idXR0b24tdG9nZ2xlLWxhYmVsLWNvbnRlbnQiXSxbMSwibWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheSJdLFsibWF0UmlwcGxlIiwiIiwxLCJtYXQtYnV0dG9uLXRvZ2dsZS1yaXBwbGUiLDMsIm1hdFJpcHBsZVRyaWdnZXIiLCJtYXRSaXBwbGVEaXNhYmxlZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoWm0oKSxSbSgwLCJidXR0b24iLDAsMSksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9vbkJ1dHRvbkNsaWNrKCl9KSksUm0oMiwic3BhbiIsMiksWG0oMyksQW0oKSxBbSgpLFRtKDQsInNwYW4iLDMpLFRtKDUsInNwYW4iLDQpKSwyJmUpe2NvbnN0IHQ9JHAoMSk7RG0oImlkIixuLmJ1dHRvbklkKSgiZGlzYWJsZWQiLG4uZGlzYWJsZWR8fG51bGwpLGpwKCJ0YWJpbmRleCIsbi5kaXNhYmxlZD8tMTpuLnRhYkluZGV4KSgiYXJpYS1wcmVzc2VkIixuLmNoZWNrZWQpKCJuYW1lIixuLm5hbWV8fG51bGwpKCJhcmlhLWxhYmVsIixuLmFyaWFMYWJlbCkoImFyaWEtbGFiZWxsZWRieSIsbi5hcmlhTGFiZWxsZWRieSkscmMoNSksRG0oIm1hdFJpcHBsZVRyaWdnZXIiLHQpKCJtYXRSaXBwbGVEaXNhYmxlZCIsbi5kaXNhYmxlUmlwcGxlfHxuLmRpc2FibGVkKX19LGRpcmVjdGl2ZXM6W2tIXSxzdHlsZXM6WyIubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZSwubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXB7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTppbmxpbmUtZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjtib3JkZXItcmFkaXVzOjJweDstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnR9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZSwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cHtvdXRsaW5lOnNvbGlkIDFweH0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJke2JvcmRlci1yYWRpdXM6NHB4fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJke291dGxpbmU6MH0ubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWx7ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbCAubWF0LWJ1dHRvbi10b2dnbGUtbGFiZWwtY29udGVudHtkaXNwbGF5OmJsb2NrfS5tYXQtYnV0dG9uLXRvZ2dsZXt3aGl0ZS1zcGFjZTpub3dyYXA7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1idXR0b24tdG9nZ2xlIC5tYXQtaWNvbiBzdmd7dmVydGljYWwtYWxpZ246dG9wfS5tYXQtYnV0dG9uLXRvZ2dsZS5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJ1dHRvbi10b2dnbGUuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTouNX0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZDpub3QoLm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkKTpob3ZlciAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4wNH0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkKSAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4xMn0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQpIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjV9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZDpub3QoLm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkKTpob3ZlciAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtkaXNwbGF5Om5vbmV9fS5tYXQtYnV0dG9uLXRvZ2dsZS1sYWJlbC1jb250ZW50ey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtkaXNwbGF5OmlubGluZS1ibG9jaztsaW5lLWhlaWdodDozNnB4O3BhZGRpbmc6MCAxNnB4O3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtYnV0dG9uLXRvZ2dsZS1sYWJlbC1jb250ZW50e3BhZGRpbmc6MCAxMnB4fS5tYXQtYnV0dG9uLXRvZ2dsZS1sYWJlbC1jb250ZW50Pip7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e2JvcmRlci1yYWRpdXM6aW5oZXJpdDtwb2ludGVyLWV2ZW50czpub25lO29wYWNpdHk6MDt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtib3JkZXItYm90dG9tOnNvbGlkIDM2cHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi41O2hlaWdodDowfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtib3JkZXItYm90dG9tOnNvbGlkIDUwMHB4fS5tYXQtYnV0dG9uLXRvZ2dsZSAubWF0LWJ1dHRvbi10b2dnbGUtcmlwcGxle3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1hdC1idXR0b24tdG9nZ2xlLWJ1dHRvbntib3JkZXI6MDtiYWNrZ3JvdW5kOm5vbmU7Y29sb3I6aW5oZXJpdDtwYWRkaW5nOjA7bWFyZ2luOjA7Zm9udDppbmhlcml0O291dGxpbmU6bm9uZTt3aWR0aDoxMDAlO2N1cnNvcjpwb2ludGVyfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZCAubWF0LWJ1dHRvbi10b2dnbGUtYnV0dG9ue2N1cnNvcjpkZWZhdWx0fS5tYXQtYnV0dG9uLXRvZ2dsZS1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9XG4iXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSxBMi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOkUyLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOlt3Ml19XX0se3R5cGU6VWd9LHt0eXBlOmhnfSx7dHlwZTpTSX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmphLGFyZ3M6WyJ0YWJpbmRleCJdfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbUDJdfV19XSxBMi5wcm9wRGVjb3JhdG9ycz17YXJpYUxhYmVsOlt7dHlwZTp4eSxhcmdzOlsiYXJpYS1sYWJlbCJdfV0sYXJpYUxhYmVsbGVkYnk6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsbGVkYnkiXX1dLF9idXR0b25FbGVtZW50Olt7dHlwZTpaYSxhcmdzOlsiYnV0dG9uIl19XSxpZDpbe3R5cGU6eHl9XSxuYW1lOlt7dHlwZTp4eX1dLHZhbHVlOlt7dHlwZTp4eX1dLHRhYkluZGV4Olt7dHlwZTp4eX1dLGFwcGVhcmFuY2U6W3t0eXBlOnh5fV0sY2hlY2tlZDpbe3R5cGU6eHl9XSxkaXNhYmxlZDpbe3R5cGU6eHl9XSxjaGFuZ2U6W3t0eXBlOk95fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQTIsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWF0LWJ1dHRvbi10b2dnbGUiLHRlbXBsYXRlOic8YnV0dG9uICNidXR0b24gY2xhc3M9Im1hdC1idXR0b24tdG9nZ2xlLWJ1dHRvbiBtYXQtZm9jdXMtaW5kaWNhdG9yIlxuICAgICAgICB0eXBlPSJidXR0b24iXG4gICAgICAgIFtpZF09ImJ1dHRvbklkIlxuICAgICAgICBbYXR0ci50YWJpbmRleF09ImRpc2FibGVkID8gLTEgOiB0YWJJbmRleCJcbiAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT0iY2hlY2tlZCJcbiAgICAgICAgW2Rpc2FibGVkXT0iZGlzYWJsZWQgfHwgbnVsbCJcbiAgICAgICAgW2F0dHIubmFtZV09Im5hbWUgfHwgbnVsbCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09ImFyaWFMYWJlbCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT0iYXJpYUxhYmVsbGVkYnkiXG4gICAgICAgIChjbGljayk9Il9vbkJ1dHRvbkNsaWNrKCkiPlxuICA8c3BhbiBjbGFzcz0ibWF0LWJ1dHRvbi10b2dnbGUtbGFiZWwtY29udGVudCI+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L3NwYW4+XG48L2J1dHRvbj5cblxuPHNwYW4gY2xhc3M9Im1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXkiPjwvc3Bhbj5cbjxzcGFuIGNsYXNzPSJtYXQtYnV0dG9uLXRvZ2dsZS1yaXBwbGUiIG1hdFJpcHBsZVxuICAgICBbbWF0UmlwcGxlVHJpZ2dlcl09ImJ1dHRvbiJcbiAgICAgW21hdFJpcHBsZURpc2FibGVkXT0idGhpcy5kaXNhYmxlUmlwcGxlIHx8IHRoaXMuZGlzYWJsZWQiPlxuPC9zcGFuPlxuJyxlbmNhcHN1bGF0aW9uOkhuLk5vbmUsZXhwb3J0QXM6Im1hdEJ1dHRvblRvZ2dsZSIsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaCxpbnB1dHM6WyJkaXNhYmxlUmlwcGxlIl0saG9zdDp7IltjbGFzcy5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lXSI6IiFidXR0b25Ub2dnbGVHcm91cCIsIltjbGFzcy5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkXSI6ImNoZWNrZWQiLCJbY2xhc3MubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWRdIjoiZGlzYWJsZWQiLCJbY2xhc3MubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZF0iOidhcHBlYXJhbmNlID09PSAic3RhbmRhcmQiJyxjbGFzczoibWF0LWJ1dHRvbi10b2dnbGUiLCJbYXR0ci5hcmlhLWxhYmVsXSI6Im51bGwiLCJbYXR0ci5hcmlhLWxhYmVsbGVkYnldIjoibnVsbCIsIlthdHRyLmlkXSI6ImlkIiwiW2F0dHIubmFtZV0iOiJudWxsIiwiKGZvY3VzKSI6ImZvY3VzKCkiLHJvbGU6InByZXNlbnRhdGlvbiJ9LHN0eWxlczpbIi5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cHtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1mbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdzt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO2JvcmRlci1yYWRpdXM6MnB4Oy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3Vwe291dGxpbmU6c29saWQgMXB4fS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQsLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmR7Ym9yZGVyLXJhZGl1czo0cHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmR7b3V0bGluZTowfS5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbHtmbGV4LWRpcmVjdGlvbjpjb2x1bW59Lm1hdC1idXR0b24tdG9nZ2xlLXZlcnRpY2FsIC5tYXQtYnV0dG9uLXRvZ2dsZS1sYWJlbC1jb250ZW50e2Rpc3BsYXk6YmxvY2t9Lm1hdC1idXR0b24tdG9nZ2xle3doaXRlLXNwYWNlOm5vd3JhcDtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWJ1dHRvbi10b2dnbGUgLm1hdC1pY29uIHN2Z3t2ZXJ0aWNhbC1hbGlnbjp0b3B9Lm1hdC1idXR0b24tdG9nZ2xlLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLXRvZ2dsZS5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi41fS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkOm5vdCgubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQpOmhvdmVyIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjA0fS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQpIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjEyfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZCkgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTouNX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkOm5vdCgubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQpOmhvdmVyIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e2Rpc3BsYXk6bm9uZX19Lm1hdC1idXR0b24tdG9nZ2xlLWxhYmVsLWNvbnRlbnR7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlLWxhYmVsLWNvbnRlbnR7cGFkZGluZzowIDEycHh9Lm1hdC1idXR0b24tdG9nZ2xlLWxhYmVsLWNvbnRlbnQ+Knt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Lm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7Ym9yZGVyLXJhZGl1czppbmhlcml0O3BvaW50ZXItZXZlbnRzOm5vbmU7b3BhY2l0eTowO3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e2JvcmRlci1ib3R0b206c29saWQgMzZweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjU7aGVpZ2h0OjB9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e2JvcmRlci1ib3R0b206c29saWQgNTAwcHh9Lm1hdC1idXR0b24tdG9nZ2xlIC5tYXQtYnV0dG9uLXRvZ2dsZS1yaXBwbGV7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6bm9uZX0ubWF0LWJ1dHRvbi10b2dnbGUtYnV0dG9ue2JvcmRlcjowO2JhY2tncm91bmQ6bm9uZTtjb2xvcjppbmhlcml0O3BhZGRpbmc6MDttYXJnaW46MDtmb250OmluaGVyaXQ7b3V0bGluZTpub25lO3dpZHRoOjEwMCU7Y3Vyc29yOnBvaW50ZXJ9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkIC5tYXQtYnV0dG9uLXRvZ2dsZS1idXR0b257Y3Vyc29yOmRlZmF1bHR9Lm1hdC1idXR0b24tdG9nZ2xlLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH1cbiJdfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6RTIsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3cyXX1dfSx7dHlwZTpVZ30se3R5cGU6aGd9LHt0eXBlOlNJfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6amEsYXJnczpbInRhYmluZGV4Il19XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltQMl19XX1dfSkse2FyaWFMYWJlbGxlZGJ5Olt7dHlwZTp4eSxhcmdzOlsiYXJpYS1sYWJlbGxlZGJ5Il19XSxjaGFuZ2U6W3t0eXBlOk95fV0sdGFiSW5kZXg6W3t0eXBlOnh5fV0sYXBwZWFyYW5jZTpbe3R5cGU6eHl9XSxjaGVja2VkOlt7dHlwZTp4eX1dLGRpc2FibGVkOlt7dHlwZTp4eX1dLGlkOlt7dHlwZTp4eX1dLG5hbWU6W3t0eXBlOnh5fV0sYXJpYUxhYmVsOlt7dHlwZTp4eSxhcmdzOlsiYXJpYS1sYWJlbCJdfV0sX2J1dHRvbkVsZW1lbnQ6W3t0eXBlOlphLGFyZ3M6WyJidXR0b24iXX1dLHZhbHVlOlt7dHlwZTp4eX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBUMnt9ZnVuY3Rpb24gTjIodCxlKXtpZigxJnQmJihSbSgwLCJzcGFuIiwyKSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtyYygxKSxTdSh0LmZpcnN0VGV4dFBhcnQoKSl9fVQyLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxUMil9LFQyLsm1bW9kPWFvKHt0eXBlOlQyfSksVDIuybVpbmo9dm4oe2ltcG9ydHM6W1tYSSxTSF0sWEldfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChUMixbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W1hJLFNIXSxleHBvcnRzOltYSSxFMixBMl0sZGVjbGFyYXRpb25zOltFMixBMl19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhUMix7ZGVjbGFyYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuW0UyLEEyXX0saW1wb3J0czpmdW5jdGlvbigpe3JldHVybltYSSxTSF19LGV4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bWEksRTIsQTJdfX0pO2NsYXNzIHoye3BhcnNlVmFsdWUoKXtjb25zdCB0PXRoaXMudmFsdWUubGFzdEluZGV4T2YoIi8iKTtyZXR1cm4tMT09PXQ/e2ZpcnN0OiIiLHNlY29uZDp0aGlzLnZhbHVlfTp7Zmlyc3Q6dGhpcy52YWx1ZS5zbGljZSgwLHQpLHNlY29uZDp0aGlzLnZhbHVlLnNsaWNlKHQpfX1maXJzdFRleHRQYXJ0KCl7cmV0dXJuIHRoaXMucGFyc2VWYWx1ZSgpLmZpcnN0fXNlY29uZFRleHRQYXJ0KCl7cmV0dXJuIHRoaXMucGFyc2VWYWx1ZSgpLnNlY29uZH19ZnVuY3Rpb24gSTIodCxlLG4pe3JldHVybiBlfHxuP1tuLGU/ZS5uYW1lOiIuLi4iXS5maWx0ZXIoQm9vbGVhbikuam9pbigiLyIpOnR9ZnVuY3Rpb24gSDIodCxlLG4pe3ZhciBvLGksYSxyO3JldHVybiB0LnN0YXJ0LnN0ZXA8PWUmJnQuZW5kJiZuPD10LmVuZC5zdGVwfHxlPD10LnN0YXJ0LnN0ZXAmJnQuc3RhcnQuc3RlcDw9bnx8dC5lbmQmJmU8PShudWxsPT09KG89dC5lbmQpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLnN0ZXApJiYobnVsbD09PShpPXQuZW5kKXx8dm9pZCAwPT09aT92b2lkIDA6aS5zdGVwKTw9bj97c3RhcnRTdGVwOnQuc3RhcnQuc3RlcCxlbmRTdGVwOm51bGwhPT0ocj1udWxsPT09KGE9dC5lbmQpfHx2b2lkIDA9PT1hP3ZvaWQgMDphLnN0ZXApJiZ2b2lkIDAhPT1yP3I6bnVsbCxjbGlwcGVkOiExfTpuPD10LnN0YXJ0LnN0ZXA/e3N0YXJ0U3RlcDpuLGVuZFN0ZXA6bnVsbCxjbGlwcGVkOiEwfTp7c3RhcnRTdGVwOmUsZW5kU3RlcDpudWxsLGNsaXBwZWQ6ITB9fXoyLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx6Mil9LHoyLsm1Y21wPXRvKHt0eXBlOnoyLHNlbGVjdG9yczpbWyJ0Yi10cnVuY2F0ZWQtcGF0aCJdXSxpbnB1dHM6e3ZhbHVlOiJ2YWx1ZSJ9LGRlY2xzOjMsdmFyczoyLGNvbnN0czpbWyJjbGFzcyIsImZpcnN0LXRleHQtcGFydCIsNCwibmdJZiJdLFsxLCJzZWNvbmQtdGV4dC1wYXJ0Il0sWzEsImZpcnN0LXRleHQtcGFydCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUXAoMCxOMiwyLDEsInNwYW4iLDApLFJtKDEsInNwYW4iLDEpLGt1KDIpLEFtKCkpLDImZSYmKERtKCJuZ0lmIixuLmZpcnN0VGV4dFBhcnQoKS5sZW5ndGg+MCkscmMoMiksU3Uobi5zZWNvbmRUZXh0UGFydCgpKSl9LGRpcmVjdGl2ZXM6W2RNXSxzdHlsZXM6WyJbX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lLWZsZXg7d2hpdGUtc3BhY2U6bm93cmFwfS5maXJzdC10ZXh0LXBhcnRbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MSAxIDRjaDttYXgtd2lkdGg6bWF4LWNvbnRlbnR9LmZpcnN0LXRleHQtcGFydFtfbmdjb250ZW50LSVDT01QJV0sIC5zZWNvbmQtdGV4dC1wYXJ0W19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpc30iXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoejIsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoidGItdHJ1bmNhdGVkLXBhdGgiLHRlbXBsYXRlOidcbiAgICA8c3BhbiAqbmdJZj0iZmlyc3RUZXh0UGFydCgpLmxlbmd0aCA+IDAiIGNsYXNzPSJmaXJzdC10ZXh0LXBhcnQiPnt7XG4gICAgICBmaXJzdFRleHRQYXJ0KClcbiAgICB9fTwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz0ic2Vjb25kLXRleHQtcGFydCI+e3sgc2Vjb25kVGV4dFBhcnQoKSB9fTwvc3Bhbj5cbiAgJyxzdHlsZVVybHM6WyJ0cnVuY2F0ZWRfcGF0aF9jb21wb25lbnQuY3NzIl19XX1dLG51bGwse3ZhbHVlOlt7dHlwZTp4eX1dfSk7Y2xhc3MgRjJ7fUYyLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxGMil9LEYyLsm1Y21wPXRvKHt0eXBlOkYyLHNlbGVjdG9yczpbWyJjYXJkLXJ1bi1uYW1lLWNvbXBvbmVudCJdXSxpbnB1dHM6e25hbWU6Im5hbWUifSxkZWNsczoxLHZhcnM6MSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiZrdSgwKSwyJmUmJlN1KG4ubmFtZSl9LHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV17Y29sb3I6IzYxNjE2MX1ib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEYyLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImNhcmQtcnVuLW5hbWUtY29tcG9uZW50Iix0ZW1wbGF0ZToie3sgbmFtZSB9fSIsc3R5bGVVcmxzOlsicnVuX25hbWVfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse25hbWU6W3t0eXBlOnh5fV19KTtjbGFzcyBMMntjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXR9bmdPbkluaXQoKXt0aGlzLm5hbWUkPVd0KFt0aGlzLnN0b3JlLnNlbGVjdChzTix7cnVuSWQ6dGhpcy5ydW5JZH0pLHRoaXMuc3RvcmUuc2VsZWN0KHJOLHtydW5JZDp0aGlzLnJ1bklkfSksdGhpcy5zdG9yZS5zZWxlY3QoelMpXSkucGlwZShJdCgoKFt0LGUsbl0pPT5JMih0aGlzLnJ1bklkLHQsZT9uW2VdOm51bGwpKSkpfX1mdW5jdGlvbiBCMih0LGUpe2lmKDEmdCYmKFJtKDAsInNwYW4iLDE3KSxrdSgxKSxBaCgyLCJudW1iZXIiKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtyYygxKSxEdSgiU3RlcCAiLFRoKDIsMSx0LnN0ZXBWYWx1ZXNbdC5zdGVwSW5kZXhdKSwiIil9fWZ1bmN0aW9uIFYyKHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIsMTgpLGt1KDEpLEFoKDIsIm51bWJlciIpLEFoKDMsIm51bWJlciIpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpO3JjKDEpLEV1KCJTYW1wbGUgIixUaCgyLDIsdC5zYW1wbGUrMSksIi8iLFRoKDMsNCx0Lm51bVNhbXBsZSksIiIpfX1mdW5jdGlvbiBqMih0LGUpezEmdCYmVG0oMCwibWF0LXNwaW5uZXIiLDE5KX1MMi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8TDIpKFNtKEl3KSl9LEwyLsm1Y21wPXRvKHt0eXBlOkwyLHNlbGVjdG9yczpbWyJjYXJkLXJ1bi1uYW1lIl1dLGlucHV0czp7cnVuSWQ6InJ1bklkIn0sZGVjbHM6Myx2YXJzOjYsY29uc3RzOltbMywibmFtZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwiY2FyZC1ydW4tbmFtZS1jb21wb25lbnQiLDApLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSksMiZlJiYoRG0oIm5hbWUiLFRoKDEsMixuLm5hbWUkKSksanAoInRpdGxlIixUaCgyLDQsbi5uYW1lJCkpKX0sZGlyZWN0aXZlczpbRjJdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChMMixbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJjYXJkLXJ1bi1uYW1lIix0ZW1wbGF0ZTonXG4gICAgPGNhcmQtcnVuLW5hbWUtY29tcG9uZW50XG4gICAgICBbbmFtZV09Im5hbWUkIHwgYXN5bmMiXG4gICAgICBbYXR0ci50aXRsZV09Im5hbWUkIHwgYXN5bmMiXG4gICAgPjwvY2FyZC1ydW4tbmFtZS1jb21wb25lbnQ+XG4gICcsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSx7cnVuSWQ6W3t0eXBlOnh5fV19KTtjb25zdCBVMj1mdW5jdGlvbih0KXtyZXR1cm57ZmlsdGVyOnR9fTtmdW5jdGlvbiBHMih0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO05tKDApLFJtKDEsImRpdiIsMjApLFJtKDIsIm1hdC1zbGlkZXIiLDIxKSxWbSgiaW5wdXQiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uU2xpZGVySW5wdXQobil9KSksQW0oKSxBbSgpLFJtKDMsImRpdiIsMjIpLFRtKDQsImltZyIsMjMpLEFtKCksem0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKTtyYygyKSxEbSgiZGlzYWJsZWQiLHQuc3RlcFZhbHVlcy5sZW5ndGg8PTEpKCJtaW4iLDApKCJtYXgiLHQuc3RlcFZhbHVlcy5sZW5ndGgtMSkoInN0ZXAiLDEpKCJ0aWNrSW50ZXJ2YWwiLDEpKCJ2YWx1ZSIsdC5zdGVwSW5kZXgpLHJjKDIpLEptKCJhbHQiLCJJbWFnZSBhdCBzdGVwICIsdC5zdGVwVmFsdWVzW3Quc3RlcEluZGV4XSwiIiksS20oInNyYyIsdC5pbWFnZVVybCxUcyksRG0oIm5nU3R5bGUiLE1oKDksVTIsdC5jc3NGaWx0ZXIoKSkpfX1mdW5jdGlvbiBXMih0LGUpezEmdCYmKFJtKDAsImRpdiIsMjUpLGt1KDEsIiBEYXRhIGZhaWxlZCB0byBsb2FkLiAiKSxBbSgpKX1mdW5jdGlvbiBZMih0LGUpe2lmKDEmdCYmUXAoMCxXMiwyLDAsImRpdiIsMjQpLDImdCl7Y29uc3QgdD1ZbSgpO0RtKCJuZ0lmIix0LmxvYWRTdGF0ZT09PXQuRGF0YUxvYWRTdGF0ZS5GQUlMRUQpfX1jb25zdCBxMj1mdW5jdGlvbih0KXtyZXR1cm57YmFja2dyb3VuZENvbG9yOnR9fTtjbGFzcyBaMntjb25zdHJ1Y3Rvcigpe3RoaXMuRGF0YUxvYWRTdGF0ZT15RSx0aGlzLm9uQWN0dWFsU2l6ZVRvZ2dsZT1uZXcgTGgsdGhpcy5zdGVwSW5kZXhDaGFuZ2U9bmV3IExoLHRoaXMub25QaW5DbGlja2VkPW5ldyBMaH1jc3NGaWx0ZXIoKXtyZXR1cm5gY29udHJhc3QoJHt0aGlzLmNvbnRyYXN0SW5NaWxsaS8xMH0lKSBicmlnaHRuZXNzKCR7dGhpcy5icmlnaHRuZXNzSW5NaWxsaS8xZTN9KWB9b25TbGlkZXJJbnB1dCh0KXt0aGlzLnN0ZXBJbmRleENoYW5nZS5lbWl0KHQudmFsdWUpfX1aMi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WjIpfSxaMi7JtWNtcD10byh7dHlwZTpaMixzZWxlY3RvcnM6W1siaW1hZ2UtY2FyZC1jb21wb25lbnQiXV0saG9zdFZhcnM6Mixob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmcHUoImFjdHVhbC1zaXplIixuLnNob3dBY3R1YWxTaXplKX0saW5wdXRzOntsb2FkU3RhdGU6ImxvYWRTdGF0ZSIsdGl0bGU6InRpdGxlIix0YWc6InRhZyIscnVuSWQ6InJ1bklkIixzYW1wbGU6InNhbXBsZSIsbnVtU2FtcGxlOiJudW1TYW1wbGUiLGltYWdlVXJsOiJpbWFnZVVybCIsc3RlcEluZGV4OiJzdGVwSW5kZXgiLHN0ZXBWYWx1ZXM6InN0ZXBWYWx1ZXMiLGJyaWdodG5lc3NJbk1pbGxpOiJicmlnaHRuZXNzSW5NaWxsaSIsY29udHJhc3RJbk1pbGxpOiJjb250cmFzdEluTWlsbGkiLHNob3dBY3R1YWxTaXplOiJzaG93QWN0dWFsU2l6ZSIscnVuQ29sb3JTY2FsZToicnVuQ29sb3JTY2FsZSIsYWxsb3dUb2dnbGVBY3R1YWxTaXplOiJhbGxvd1RvZ2dsZUFjdHVhbFNpemUiLGlzUGlubmVkOiJpc1Bpbm5lZCJ9LG91dHB1dHM6e29uQWN0dWFsU2l6ZVRvZ2dsZToib25BY3R1YWxTaXplVG9nZ2xlIixzdGVwSW5kZXhDaGFuZ2U6InN0ZXBJbmRleENoYW5nZSIsb25QaW5DbGlja2VkOiJvblBpbkNsaWNrZWQifSxkZWNsczoxOSx2YXJzOjE0LGNvbnN0czpmdW5jdGlvbigpe2xldCB0LGU7cmV0dXJuIHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSYmbmdJMThuQ2xvc3VyZU1vZGU/Z29vZy5nZXRNc2coIlBpbiBjYXJkIik6JGxvY2FsaXplYDpBIGJ1dHRvbiB0byBwaW4gYSBjYXJkLuKQn2U2NjVkYzcxMmJkNWYxOGQ0ZGZhM2EyOWUxMjVkNTY1Y2M1MWUyZjbikJ83Mjg0NjA2NDI2MjM0Mzc1MzQ0OlBpbiBjYXJkYCxlPSJ1bmRlZmluZWQiIT10eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUmJm5nSTE4bkNsb3N1cmVNb2RlP2dvb2cuZ2V0TXNnKCJUb2dnbGUgYWN0dWFsIGltYWdlIHNpemUiKTokbG9jYWxpemVgOkEgYnV0dG9uIG9uIGFuIGltYWdlIGNhcmQgdGhhdCB0b2dnbGVzIGFjdHVhbCBpbWFnZSBzaXplLuKQnzNjYTA1ZWYzYTZlM2EzNzA2NWY1ZTBmNjljNWQ1YTIxNzhkOTA3OTHikJ83NjM1MTAxOTM2NjY0Nzg5MTQwOlRvZ2dsZSBhY3R1YWwgaW1hZ2Ugc2l6ZWAsW1sxLCJoZWFkaW5nIl0sWzEsImxpbmUiXSxbMSwidGFnIiwzLCJ0aXRsZSIsInZhbHVlIl0sWzEsImNvbnRyb2xzIl0sWyJtYXQtaWNvbi1idXR0b24iLCIiLCJhcmlhLWxhYmVsIix0LDEsInBpbi1idXR0b24iLDMsImNsaWNrIl0sWzMsInN2Z0ljb24iXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLGUsInRpdGxlIiwiVG9nZ2xlIGFjdHVhbCBpbWFnZSBzaXplIiwzLCJkaXNhYmxlZCIsImNsaWNrIl0sWyJzdmdJY29uIiwiaW1hZ2Vfc2VhcmNoXzI0cHgiXSxbMSwicnVuIl0sWzEsImRvdCIsMywibmdTdHlsZSJdLFsxLCJydW4tdGV4dCIsMywicnVuSWQiXSxbMSwibWV0YWRhdGEiXSxbImNsYXNzIiwic3RlcCIsNCwibmdJZiJdLFsiY2xhc3MiLCJzYW1wbGUiLDQsIm5nSWYiXSxbImNsYXNzIiwibG9hZGluZyIsImRpYW1ldGVyIiwiMTgiLDQsIm5nSWYiXSxbNCwibmdJZiIsIm5nSWZFbHNlIl0sWyJub0ltYWdlRGF0YSIsIiJdLFsxLCJzdGVwIl0sWzEsInNhbXBsZSJdLFsiZGlhbWV0ZXIiLCIxOCIsMSwibG9hZGluZyJdLFsxLCJzbGlkZXItcm93Il0sWyJjb2xvciIsInByaW1hcnkiLDEsInN0ZXAtc2xpZGVyIiwzLCJkaXNhYmxlZCIsIm1pbiIsIm1heCIsInN0ZXAiLCJ0aWNrSW50ZXJ2YWwiLCJ2YWx1ZSIsImlucHV0Il0sWzEsImltZy1jb250YWluZXIiXSxbMywiYWx0Iiwic3JjIiwibmdTdHlsZSJdLFsiY2xhc3MiLCJlbXB0eS1tZXNzYWdlIiw0LCJuZ0lmIl0sWzEsImVtcHR5LW1lc3NhZ2UiXV19LHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihSbSgwLCJkaXYiLDApLFJtKDEsImRpdiIsMSksVG0oMiwidGItdHJ1bmNhdGVkLXBhdGgiLDIpLFJtKDMsInNwYW4iLDMpLFJtKDQsImJ1dHRvbiIsNCksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uUGluQ2xpY2tlZC5lbWl0KCFuLmlzUGlubmVkKX0pKSxUbSg1LCJtYXQtaWNvbiIsNSksQW0oKSxSbSg2LCJidXR0b24iLDYpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkFjdHVhbFNpemVUb2dnbGUuZW1pdCgpfSkpLFRtKDcsIm1hdC1pY29uIiw3KSxBbSgpLEFtKCksQW0oKSxSbSg4LCJkaXYiLDEpLFJtKDksInNwYW4iLDgpLFRtKDEwLCJzcGFuIiw5KSxUbSgxMSwiY2FyZC1ydW4tbmFtZSIsMTApLEFtKCksUm0oMTIsImRpdiIsMTEpLFFwKDEzLEIyLDMsMywic3BhbiIsMTIpLFFwKDE0LFYyLDQsNiwic3BhbiIsMTMpLFFwKDE1LGoyLDEsMCwibWF0LXNwaW5uZXIiLDE0KSxBbSgpLEFtKCksQW0oKSxRcCgxNixHMiw1LDExLCJuZy1jb250YWluZXIiLDE1KSxRcCgxNyxZMiwxLDEsIm5nLXRlbXBsYXRlIixudWxsLDE2LGliKSksMiZlKXtjb25zdCB0PSRwKDE4KTtyYygyKSxLbSgidGl0bGUiLG4udGFnKSxLbSgidmFsdWUiLG4udGl0bGUpLHJjKDIpLGpwKCJ0aXRsZSIsbi5pc1Bpbm5lZD8iVW5waW4gY2FyZCI6IlBpbiBjYXJkIikscmMoMSksRG0oInN2Z0ljb24iLG4uaXNQaW5uZWQ/ImtlZXBfMjRweCI6ImtlZXBfb3V0bGluZV8yNHB4IikscmMoMSksRG0oImRpc2FibGVkIiwhbi5hbGxvd1RvZ2dsZUFjdHVhbFNpemUpLHJjKDQpLERtKCJuZ1N0eWxlIixNaCgxMixxMixuLnJ1bkNvbG9yU2NhbGUobi5ydW5JZCkpKSxyYygxKSxEbSgicnVuSWQiLG4ucnVuSWQpLHJjKDIpLERtKCJuZ0lmIixudWxsIT09bi5zdGVwSW5kZXgmJm4uc3RlcEluZGV4PG4uc3RlcFZhbHVlcy5sZW5ndGgpLHJjKDEpLERtKCJuZ0lmIixuLm51bVNhbXBsZT4xKSxyYygxKSxEbSgibmdJZiIsbi5sb2FkU3RhdGU9PT1uLkRhdGFMb2FkU3RhdGUuTE9BRElORykscmMoMSksRG0oIm5nSWYiLG51bGwhPT1uLnN0ZXBJbmRleCYmbi5zdGVwSW5kZXg8bi5zdGVwVmFsdWVzLmxlbmd0aCkoIm5nSWZFbHNlIix0KX19LGRpcmVjdGl2ZXM6W3oyLFhILERXLENNLEwyLGRNLG8xLFJYXSxwaXBlczpbRk1dLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtib3gtc2l6aW5nOmJvcmRlci1ib3g7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6YXV0bztwYWRkaW5nOjE2cHg7cGFkZGluZy10b3A6NHB4fS5hY3R1YWwtc2l6ZVtfbmdob3N0LSVDT01QJV17aGVpZ2h0OmF1dG99LmhlYWRpbmdbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtmb250LXNpemU6MTRweDttYXJnaW4tYm90dG9tOjRweDtwb3NpdGlvbjpyZWxhdGl2ZX0ubGluZVtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIG1heC1jb250ZW50fS5tZXRhZGF0YVtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2dhcDo1cHg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO21heC13aWR0aDoxNzVweDt0ZXh0LWFsaWduOmVuZH0udGFnW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW59LnBpbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgbWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxOHB4fS5ydW5bX25nY29udGVudC0lQ09NUCVde2FsaWduLXNlbGY6YmFzZWxpbmU7ZGlzcGxheTpmbGV4O292ZXJmbG93OmhpZGRlbjt3aGl0ZS1zcGFjZTpub3dyYXB9LnJ1bltfbmdjb250ZW50LSVDT01QJV0gICAuZG90W19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4Om5vbmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTNweDtoZWlnaHQ6MTNweDtib3JkZXItcmFkaXVzOjUwJTttYXJnaW4tcmlnaHQ6NHB4fS5ydW5bX25nY29udGVudC0lQ09NUCVdICAgLnJ1bi10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczttYXgtd2lkdGg6MTIwcHh9LnJ1bltfbmdjb250ZW50LSVDT01QJV0sIC5zYW1wbGVbX25nY29udGVudC0lQ09NUCVdLCAuc3RlcFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MTtmb250LXNpemU6MTNweH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAucnVuW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLnJ1bltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLnNhbXBsZVtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5zYW1wbGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5zdGVwW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLnN0ZXBbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfS5jb250cm9sc1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MTt3aGl0ZS1zcGFjZTpub3dyYXA7anVzdGlmeS1zZWxmOmZsZXgtZW5kO2ZsZXgtc2hyaW5rOjA7bWFyZ2luLXJpZ2h0Oi0xMnB4fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5jb250cm9sc1tfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5jb250cm9sc1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9LmltZy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MSAxIDA7b3ZlcmZsb3cteTphdXRvO3Bvc2l0aW9uOnJlbGF0aXZlfS5pbWctY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGltZ1tfbmdjb250ZW50LSVDT01QJV17aW1hZ2UtcmVuZGVyaW5nOi1tb3otY3Jpc3AtZWRnZXM7aW1hZ2UtcmVuZGVyaW5nOnBpeGVsYXRlZH0uYWN0dWFsLXNpemVbX25naG9zdC0lQ09NUCVdICAgLmltZy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmF1dG87ZmxleDpub25lfVtfbmdob3N0LSVDT01QJV06bm90KC5hY3R1YWwtc2l6ZSkgICBpbWdbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO21heC1oZWlnaHQ6MTAwJTttYXgtd2lkdGg6MTAwJTt3aWR0aDphdXRvO2hlaWdodDoxMDAlO29iamVjdC1maXQ6Y29udGFpbn0uc2xpZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtoZWlnaHQ6MjRweH0uc3RlcC1zbGlkZXJbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MX1bX25naG9zdC0lQ09NUCVdICAgICAubWF0LXNsaWRlci1taW4tdmFsdWUgLm1hdC1zbGlkZXItdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5lbXB0eS1tZXNzYWdlW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOjFlbTtmb250LXNpemU6MTNweH0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWjIsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiaW1hZ2UtY2FyZC1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiJpbWFnZV9jYXJkX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyJpbWFnZV9jYXJkX2NvbXBvbmVudC5jc3MiXSxob3N0OnsiW2NsYXNzLmFjdHVhbC1zaXplXSI6InNob3dBY3R1YWxTaXplIn0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7bG9hZFN0YXRlOlt7dHlwZTp4eX1dLHRpdGxlOlt7dHlwZTp4eX1dLHRhZzpbe3R5cGU6eHl9XSxydW5JZDpbe3R5cGU6eHl9XSxzYW1wbGU6W3t0eXBlOnh5fV0sbnVtU2FtcGxlOlt7dHlwZTp4eX1dLGltYWdlVXJsOlt7dHlwZTp4eX1dLHN0ZXBJbmRleDpbe3R5cGU6eHl9XSxzdGVwVmFsdWVzOlt7dHlwZTp4eX1dLGJyaWdodG5lc3NJbk1pbGxpOlt7dHlwZTp4eX1dLGNvbnRyYXN0SW5NaWxsaTpbe3R5cGU6eHl9XSxzaG93QWN0dWFsU2l6ZTpbe3R5cGU6eHl9XSxydW5Db2xvclNjYWxlOlt7dHlwZTp4eX1dLGFsbG93VG9nZ2xlQWN0dWFsU2l6ZTpbe3R5cGU6eHl9XSxpc1Bpbm5lZDpbe3R5cGU6eHl9XSxvbkFjdHVhbFNpemVUb2dnbGU6W3t0eXBlOk95fV0sc3RlcEluZGV4Q2hhbmdlOlt7dHlwZTpPeX1dLG9uUGluQ2xpY2tlZDpbe3R5cGU6T3l9XX0pO2NsYXNzIFgye2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5zdG9yZT10LHRoaXMuZGF0YVNvdXJjZT1lLHRoaXMuZnVsbFdpZHRoQ2hhbmdlZD1uZXcgTGgsdGhpcy5waW5TdGF0ZUNoYW5nZWQ9bmV3IExoLHRoaXMuYnJpZ2h0bmVzc0luTWlsbGkkPXRoaXMuc3RvcmUuc2VsZWN0KEhUKSx0aGlzLmNvbnRyYXN0SW5NaWxsaSQ9dGhpcy5zdG9yZS5zZWxlY3QoRlQpLHRoaXMuYWN0dWFsU2l6ZUdsb2JhbFNldHRpbmckPXRoaXMuc3RvcmUuc2VsZWN0KExUKSx0aGlzLnNob3dBY3R1YWxTaXplPSExLHRoaXMuYWN0dWFsU2l6ZVVpVG9nZ2xlZD0hMSx0aGlzLmFjdHVhbFNpemVVaVRvZ2dsZVN1YmplY3Q9bmV3IEYodGhpcy5hY3R1YWxTaXplVWlUb2dnbGVkKSx0aGlzLm5nVW5zdWJzY3JpYmU9bmV3IEl9b25TdGVwSW5kZXhDaGFuZ2VkKHQpe3RoaXMuc3RvcmUuZGlzcGF0Y2godFIoe2NhcmRJZDp0aGlzLmNhcmRJZCxzdGVwSW5kZXg6dH0pKX1pc0ltYWdlQ2FyZE1ldGFkYXRhKHQpe2NvbnN0e3BsdWdpbjplfT10O3JldHVybiBlPT09aEEuSU1BR0VTfW9uQWN0dWFsU2l6ZVRvZ2dsZSgpe3RoaXMuYWN0dWFsU2l6ZVVpVG9nZ2xlZD0hdGhpcy5hY3R1YWxTaXplVWlUb2dnbGVkLHRoaXMuYWN0dWFsU2l6ZVVpVG9nZ2xlU3ViamVjdC5uZXh0KHRoaXMuYWN0dWFsU2l6ZVVpVG9nZ2xlZCl9bmdPbkluaXQoKXtXdChbdGhpcy5hY3R1YWxTaXplR2xvYmFsU2V0dGluZyQsdGhpcy5hY3R1YWxTaXplVWlUb2dnbGVTdWJqZWN0XSkucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpLEZlKCgoW3QsZV0pPT57dGhpcy5zaG93QWN0dWFsU2l6ZT10fHxlLHRoaXMuZnVsbFdpZHRoQ2hhbmdlZC5lbWl0KHRoaXMuc2hvd0FjdHVhbFNpemUpfSkpKS5zdWJzY3JpYmUoKCgpPT57fSkpO2NvbnN0IHQ9dGhpcy5zdG9yZS5zZWxlY3QoeVQsdGhpcy5jYXJkSWQpLnBpcGUoSWUodGhpcy5uZ1Vuc3Vic2NyaWJlKSxjZSgodD0+ISF0JiZ0aGlzLmlzSW1hZ2VDYXJkTWV0YWRhdGEodCkpKSxJdCgodD0+dCkpLEFlKDEpKSxlPVd0KFt0LHRoaXMuc3RvcmUuc2VsZWN0KGhULHRoaXMuY2FyZElkKV0pLnBpcGUoSWUodGhpcy5uZ1Vuc3Vic2NyaWJlKSxJdCgoKFt0LGVdKT0+e2NvbnN0IG49dC5ydW5JZDtyZXR1cm4gZSYmZS5oYXNPd25Qcm9wZXJ0eShuKT9lW25dOltdfSkpLE1lKCgodCxlKT0+dC5sZW5ndGg9PT1lLmxlbmd0aCYmMD09PXQubGVuZ3RofHx0PT09ZSkpLEFlKDEpKTt0aGlzLnN0ZXBJbmRleCQ9dGhpcy5zdG9yZS5zZWxlY3QodlQsdGhpcy5jYXJkSWQpLHRoaXMubG9hZFN0YXRlJD10aGlzLnN0b3JlLnNlbGVjdChnVCx0aGlzLmNhcmRJZCk7Y29uc3Qgbj1XdChbZSx0aGlzLnN0ZXBJbmRleCRdKS5waXBlKEl0KCgoW3QsZV0pPT5udWxsIT09ZSYmdFtlXT90W2VdOm51bGwpKSk7dGhpcy50YWckPXQucGlwZShJdCgodD0+dC50YWcpKSksdGhpcy50aXRsZSQ9dGhpcy50YWckLnBpcGUoSXQoKHQ9PmYyKHQsdGhpcy5ncm91cE5hbWUpKSkpLHRoaXMucnVuSWQkPXQucGlwZShJdCgodD0+dC5ydW5JZCkpKSx0aGlzLnNhbXBsZSQ9dC5waXBlKEl0KCh0PT50LnNhbXBsZSkpKSx0aGlzLm51bVNhbXBsZSQ9dC5waXBlKEl0KCh0PT50Lm51bVNhbXBsZSkpKSx0aGlzLmltYWdlVXJsJD1uLnBpcGUoSXQoKHQ9PnQ/dGhpcy5kYXRhU291cmNlLmltYWdlVXJsKHQuaW1hZ2VJZCk6bnVsbCkpKSx0aGlzLnN0ZXBWYWx1ZXMkPWUucGlwZShJdCgodD0+dC5tYXAoKHQ9PnQuc3RlcCkpKSkpLHRoaXMuaXNQaW5uZWQkPXRoaXMuc3RvcmUuc2VsZWN0KHdULHRoaXMuY2FyZElkKX1uZ09uRGVzdHJveSgpe3RoaXMubmdVbnN1YnNjcmliZS5uZXh0KCksdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCl9fXZhciBLMixKMixRMjtmdW5jdGlvbiAkMih0LGUpezEmdCYmKFJtKDAsInNwYW4iKSxrdSgxLCJzY2FsYXIiKSxBbSgpKX1mdW5jdGlvbiB0NSh0LGUpezEmdCYmKFJtKDAsInNwYW4iKSxrdSgxLCJoaXN0b2dyYW0iKSxBbSgpKX1mdW5jdGlvbiBlNSh0LGUpezEmdCYmKFJtKDAsInNwYW4iKSxrdSgxLCJ1bmtub3duIiksQW0oKSl9ZnVuY3Rpb24gbjUodCxlKXtpZigxJnQmJihObSgwLDEzKSxRcCgxLCQyLDIsMCwic3BhbiIsMTQpLFFwKDIsdDUsMiwwLCJzcGFuIiwxNCksUXAoMyxlNSwyLDAsInNwYW4iLDE1KSx6bSgpKSwyJnQpe2NvbnN0IHQ9WW0oMik7RG0oIm5nU3dpdGNoIix0LmNhcmRNZXRhZGF0YS5wbHVnaW4pLHJjKDEpLERtKCJuZ1N3aXRjaENhc2UiLHQuUGx1Z2luVHlwZS5TQ0FMQVJTKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIix0LlBsdWdpblR5cGUuSElTVE9HUkFNUyl9fWZ1bmN0aW9uIG81KHQsZSl7MSZ0JiZJbSgwKX1mdW5jdGlvbiBpNSh0LGUpe2lmKDEmdCYmKFJtKDAsIm9wdGlvbiIsMTYpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdDtEbSgidmFsdWUiLHQuaWQpLHJjKDEpLFN1KHQubmFtZSl9fWZ1bmN0aW9uIGE1KHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Tm0oMCksUm0oMSwiaDIiKSxRcCgyLG41LDQsMywibmctdGVtcGxhdGUiLG51bGwsMixpYiksUm0oNCwic3BhbiIpLGt1KDUsIkRvd25sb2FkwqAiKSxBbSgpLFFwKDYsbzUsMSwwLCJuZy1jb250YWluZXIiLDMpLFJtKDcsInNwYW4iKSxrdSg4LCLCoGRhdGEgZm9ywqAiKSxBbSgpLFJtKDksImNvZGUiLDQpLGt1KDEwKSxBbSgpLEFtKCksUm0oMTEsIm1hdC1kaWFsb2ctY29udGVudCIpLFJtKDEyLCJtYXQtZm9ybS1maWVsZCIsNSksUm0oMTMsIm1hdC1sYWJlbCIpLGt1KDE0LCJTZWxlY3QgYSBydW4gdG8gZG93bmxvYWQgYSBkYXRhIGZvciBhIHNlcmllcyIpLEFtKCksUm0oMTUsInNlbGVjdCIsNiksVm0oImNoYW5nZSIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkucnVuU2VsZWN0ZWQuZW1pdChuLnRhcmdldC52YWx1ZSl9KSksUm0oMTYsIm9wdGlvbiIsNyksa3UoMTcsIi0iKSxBbSgpLFFwKDE4LGk1LDIsMiwib3B0aW9uIiw4KSxBbSgpLEFtKCksUm0oMTksImRpdiIsOSksUm0oMjAsInNwYW4iKSxrdSgyMSwiRG93bmxvYWQgYXPigKYiKSxBbSgpLGt1KDIyLCLCoCIpLFJtKDIzLCJhIiwxMCksa3UoMjQsIkpTT04iKSxBbSgpLFJtKDI1LCJhIiwxMCksa3UoMjYsIkNTViIpLEFtKCksQW0oKSxBbSgpLFJtKDI3LCJtYXQtZGlhbG9nLWFjdGlvbnMiLDExKSxSbSgyOCwiYnV0dG9uIiwxMiksa3UoMjksIkNsb3NlIiksQW0oKSxBbSgpLHptKCl9aWYoMiZ0KXtjb25zdCB0PSRwKDMpLGU9WW0oKTtyYyg2KSxEbSgibmdUZW1wbGF0ZU91dGxldCIsdCkscmMoMyksRG0oInRpdGxlIixlLmNhcmRNZXRhZGF0YS50YWcpLHJjKDEpLFN1KGUuY2FyZE1ldGFkYXRhLnRhZykscmMoNSksRG0oInZhbHVlIixlLnNlbGVjdGVkUnVuSWR8fCIiKSxyYygxKSxEbSgidmFsdWUiLCIiKSxyYygyKSxEbSgibmdGb3JPZiIsZS5ydW5zKSxyYyg1KSxEbSgiZGlzYWJsZWQiLCFlLmRvd25sb2FkVXJsSnNvbikoImRvd25sb2FkIixlLmdldERvd25sb2FkTmFtZSgianNvbiIpKSxqcCgiaHJlZiIsZS5kb3dubG9hZFVybEpzb24sVHMpLHJjKDIpLERtKCJkaXNhYmxlZCIsIWUuZG93bmxvYWRVcmxDc3YpKCJkb3dubG9hZCIsZS5nZXREb3dubG9hZE5hbWUoImNzdiIpKSxqcCgiaHJlZiIsZS5kb3dubG9hZFVybENzdixUcyl9fWZ1bmN0aW9uIHI1KHQsZSl7MSZ0JiZrdSgwLCJMb2FkaW5nLi4uIil9WDIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFgyKShTbShJdyksU20oUEEpKX0sWDIuybVjbXA9dG8oe3R5cGU6WDIsc2VsZWN0b3JzOltbImltYWdlLWNhcmQiXV0saW5wdXRzOntjYXJkSWQ6ImNhcmRJZCIsZ3JvdXBOYW1lOiJncm91cE5hbWUiLHJ1bkNvbG9yU2NhbGU6InJ1bkNvbG9yU2NhbGUifSxvdXRwdXRzOntmdWxsV2lkdGhDaGFuZ2VkOiJmdWxsV2lkdGhDaGFuZ2VkIixwaW5TdGF0ZUNoYW5nZWQ6InBpblN0YXRlQ2hhbmdlZCJ9LGRlY2xzOjE0LHZhcnM6NDEsY29uc3RzOltbMywibG9hZFN0YXRlIiwidGl0bGUiLCJ0YWciLCJydW5JZCIsInNhbXBsZSIsIm51bVNhbXBsZSIsImltYWdlVXJsIiwic3RlcEluZGV4Iiwic3RlcFZhbHVlcyIsImJyaWdodG5lc3NJbk1pbGxpIiwiY29udHJhc3RJbk1pbGxpIiwicnVuQ29sb3JTY2FsZSIsInNob3dBY3R1YWxTaXplIiwiYWxsb3dUb2dnbGVBY3R1YWxTaXplIiwiaXNQaW5uZWQiLCJzdGVwSW5kZXhDaGFuZ2UiLCJvbkFjdHVhbFNpemVUb2dnbGUiLCJvblBpbkNsaWNrZWQiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImltYWdlLWNhcmQtY29tcG9uZW50IiwwKSxWbSgic3RlcEluZGV4Q2hhbmdlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblN0ZXBJbmRleENoYW5nZWQoZSl9KSkoIm9uQWN0dWFsU2l6ZVRvZ2dsZSIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkFjdHVhbFNpemVUb2dnbGUoKX0pKSgib25QaW5DbGlja2VkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5waW5TdGF0ZUNoYW5nZWQuZW1pdChlKX0pKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQWgoMywiYXN5bmMiKSxBaCg0LCJhc3luYyIpLEFoKDUsImFzeW5jIiksQWgoNiwiYXN5bmMiKSxBaCg3LCJhc3luYyIpLEFoKDgsImFzeW5jIiksQWgoOSwiYXN5bmMiKSxBaCgxMCwiYXN5bmMiKSxBaCgxMSwiYXN5bmMiKSxBaCgxMiwiYXN5bmMiKSxBaCgxMywiYXN5bmMiKSxBbSgpKSwyJmUmJkRtKCJsb2FkU3RhdGUiLFRoKDEsMTUsbi5sb2FkU3RhdGUkKSkoInRpdGxlIixUaCgyLDE3LG4udGl0bGUkKSkoInRhZyIsVGgoMywxOSxuLnRhZyQpKSgicnVuSWQiLFRoKDQsMjEsbi5ydW5JZCQpKSgic2FtcGxlIixUaCg1LDIzLG4uc2FtcGxlJCkpKCJudW1TYW1wbGUiLFRoKDYsMjUsbi5udW1TYW1wbGUkKSkoImltYWdlVXJsIixUaCg3LDI3LG4uaW1hZ2VVcmwkKSkoInN0ZXBJbmRleCIsVGgoOCwyOSxuLnN0ZXBJbmRleCQpKSgic3RlcFZhbHVlcyIsVGgoOSwzMSxuLnN0ZXBWYWx1ZXMkKSkoImJyaWdodG5lc3NJbk1pbGxpIixUaCgxMCwzMyxuLmJyaWdodG5lc3NJbk1pbGxpJCkpKCJjb250cmFzdEluTWlsbGkiLFRoKDExLDM1LG4uY29udHJhc3RJbk1pbGxpJCkpKCJydW5Db2xvclNjYWxlIixuLnJ1bkNvbG9yU2NhbGUpKCJzaG93QWN0dWFsU2l6ZSIsbi5zaG93QWN0dWFsU2l6ZSkoImFsbG93VG9nZ2xlQWN0dWFsU2l6ZSIsITE9PT1UaCgxMiwzNyxuLmFjdHVhbFNpemVHbG9iYWxTZXR0aW5nJCkpKCJpc1Bpbm5lZCIsVGgoMTMsMzksbi5pc1Bpbm5lZCQpKX0sZGlyZWN0aXZlczpbWjJdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChYMixbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJpbWFnZS1jYXJkIix0ZW1wbGF0ZTonXG4gICAgPGltYWdlLWNhcmQtY29tcG9uZW50XG4gICAgICBbbG9hZFN0YXRlXT0ibG9hZFN0YXRlJCB8IGFzeW5jIlxuICAgICAgW3RpdGxlXT0idGl0bGUkIHwgYXN5bmMiXG4gICAgICBbdGFnXT0idGFnJCB8IGFzeW5jIlxuICAgICAgW3J1bklkXT0icnVuSWQkIHwgYXN5bmMiXG4gICAgICBbc2FtcGxlXT0ic2FtcGxlJCB8IGFzeW5jIlxuICAgICAgW251bVNhbXBsZV09Im51bVNhbXBsZSQgfCBhc3luYyJcbiAgICAgIFtpbWFnZVVybF09ImltYWdlVXJsJCB8IGFzeW5jIlxuICAgICAgW3N0ZXBJbmRleF09InN0ZXBJbmRleCQgfCBhc3luYyJcbiAgICAgIFtzdGVwVmFsdWVzXT0ic3RlcFZhbHVlcyQgfCBhc3luYyJcbiAgICAgIChzdGVwSW5kZXhDaGFuZ2UpPSJvblN0ZXBJbmRleENoYW5nZWQoJGV2ZW50KSJcbiAgICAgIFticmlnaHRuZXNzSW5NaWxsaV09ImJyaWdodG5lc3NJbk1pbGxpJCB8IGFzeW5jIlxuICAgICAgW2NvbnRyYXN0SW5NaWxsaV09ImNvbnRyYXN0SW5NaWxsaSQgfCBhc3luYyJcbiAgICAgIFtydW5Db2xvclNjYWxlXT0icnVuQ29sb3JTY2FsZSJcbiAgICAgIFtzaG93QWN0dWFsU2l6ZV09InNob3dBY3R1YWxTaXplIlxuICAgICAgW2FsbG93VG9nZ2xlQWN0dWFsU2l6ZV09IihhY3R1YWxTaXplR2xvYmFsU2V0dGluZyQgfCBhc3luYykgPT09IGZhbHNlIlxuICAgICAgW2lzUGlubmVkXT0iaXNQaW5uZWQkIHwgYXN5bmMiXG4gICAgICAob25BY3R1YWxTaXplVG9nZ2xlKT0ib25BY3R1YWxTaXplVG9nZ2xlKCkiXG4gICAgICAob25QaW5DbGlja2VkKT0icGluU3RhdGVDaGFuZ2VkLmVtaXQoJGV2ZW50KSJcbiAgICA+PC9pbWFnZS1jYXJkLWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9LHt0eXBlOlBBfV19KSx7Y2FyZElkOlt7dHlwZTp4eX1dLGdyb3VwTmFtZTpbe3R5cGU6eHl9XSxydW5Db2xvclNjYWxlOlt7dHlwZTp4eX1dLGZ1bGxXaWR0aENoYW5nZWQ6W3t0eXBlOk95fV0scGluU3RhdGVDaGFuZ2VkOlt7dHlwZTpPeX1dfSksKGZ1bmN0aW9uKHQpe3RbdC5TVkc9MF09IlNWRyIsdFt0LldFQkdMPTFdPSJXRUJHTCJ9KShLMnx8KEsyPXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5MSU5FQVI9MF09IkxJTkVBUiIsdFt0LkxPRzEwPTFdPSJMT0cxMCIsdFt0LlRJTUU9Ml09IlRJTUUifSkoSjJ8fChKMj17fSkpO2NsYXNzIHM1e2NvbnN0cnVjdG9yKCl7dGhpcy5ydW5TZWxlY3RlZD1uZXcgTGgsdGhpcy5QbHVnaW5UeXBlPWhBfWdldERvd25sb2FkTmFtZSh0KXtjb25zdCBlPXRoaXMucnVucy5maW5kKCh0PT50LmlkPT09dGhpcy5zZWxlY3RlZFJ1bklkKSk7cmV0dXJuIGU/YCR7ZS5uYW1lfS4ke3R9YDoiIn19czUuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHM1KX0sczUuybVjbXA9dG8oe3R5cGU6czUsc2VsZWN0b3JzOltbImRhdGFfZG93bmxvYWRfZGlhbG9nX2NvbXBvbmVudCJdXSxpbnB1dHM6e2NhcmRNZXRhZGF0YToiY2FyZE1ldGFkYXRhIixydW5zOiJydW5zIixzZWxlY3RlZFJ1bklkOiJzZWxlY3RlZFJ1bklkIixkb3dubG9hZFVybENzdjoiZG93bmxvYWRVcmxDc3YiLGRvd25sb2FkVXJsSnNvbjoiZG93bmxvYWRVcmxKc29uIn0sb3V0cHV0czp7cnVuU2VsZWN0ZWQ6InJ1blNlbGVjdGVkIn0sZGVjbHM6Myx2YXJzOjIsY29uc3RzOltbNCwibmdJZiIsIm5nSWZFbHNlIl0sWyJub0NhcmRNZXRhZGF0YSIsIiJdLFsiZGF0YU5hbWUiLCIiXSxbNCwibmdUZW1wbGF0ZU91dGxldCJdLFsxLCJ0YWctbmFtZSIsMywidGl0bGUiXSxbImFwcGVhcmFuY2UiLCJmaWxsIiwxLCJydW4tc2VsZWN0b3IiXSxbIm1hdE5hdGl2ZUNvbnRyb2wiLCIiLCJuYW1lIiwicnVuIiwiY2RrRm9jdXNJbml0aWFsIiwiIiwicmVxdWlyZWQiLCIiLDMsInZhbHVlIiwiY2hhbmdlIl0sWyJzZWxlY3RlZCIsIiIsMywidmFsdWUiXSxbMywidmFsdWUiLDQsIm5nRm9yIiwibmdGb3JPZiJdLFsxLCJkb3dubG9hZC1jb250cm9scyJdLFsibWF0LXN0cm9rZWQtYnV0dG9uIiwiIiwzLCJkaXNhYmxlZCIsImRvd25sb2FkIl0sWyJhbGlnbiIsImVuZCJdLFsibWF0LWJ1dHRvbiIsIiIsIm1hdC1kaWFsb2ctY2xvc2UiLCIiXSxbMywibmdTd2l0Y2giXSxbNCwibmdTd2l0Y2hDYXNlIl0sWzQsIk5nU3dpdGNoRGVmYXVsdCJdLFszLCJ2YWx1ZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoUXAoMCxhNSwzMCwxMiwibmctY29udGFpbmVyIiwwKSxRcCgxLHI1LDEsMCwibmctdGVtcGxhdGUiLG51bGwsMSxpYikpLDImZSl7Y29uc3QgdD0kcCgyKTtEbSgibmdJZiIsbi5jYXJkTWV0YWRhdGEpKCJuZ0lmRWxzZSIsdCl9fSxkaXJlY3RpdmVzOltkTSxNTSxzVyxBVix2VixMWSxJVSxCVSxsTSxLSCxsVyxYSCxhVyxmTSxnTV0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9aDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxLjI1ZW07b3ZlcmZsb3ctd3JhcDpicmVhay13b3JkfS5ydW4tc2VsZWN0b3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTouOWVtO3dpZHRoOjEwMCV9LmRvd25sb2FkLWNvbnRyb2xzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6LjllbX0uZG93bmxvYWQtY29udHJvbHNbX25nY29udGVudC0lQ09NUCVdICAgYVtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjNweCAxMHB4IDNweCAwfSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChzNSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJkYXRhX2Rvd25sb2FkX2RpYWxvZ19jb21wb25lbnQiLHRlbXBsYXRlVXJsOiJkYXRhX2Rvd25sb2FkX2RpYWxvZ19jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiZGF0YV9kb3dubG9hZF9kaWFsb2dfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse2NhcmRNZXRhZGF0YTpbe3R5cGU6eHl9XSxydW5zOlt7dHlwZTp4eX1dLHNlbGVjdGVkUnVuSWQ6W3t0eXBlOnh5fV0sZG93bmxvYWRVcmxDc3Y6W3t0eXBlOnh5fV0sZG93bmxvYWRVcmxKc29uOlt7dHlwZTp4eX1dLHJ1blNlbGVjdGVkOlt7dHlwZTpPeX1dfSk7Y2xhc3MgbDV7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuc2VsZWN0ZWRSdW5JZCQ9bmV3IEYobnVsbCksdGhpcy5jYXJkTWV0YWRhdGEkPXQuc2VsZWN0KHlULG4uY2FyZElkKS5waXBlKGNlKCh0PT5Cb29sZWFuKHQpKSkpLHRoaXMuZG93bmxvYWRVcmxDc3YkPVd0KFt0LnNlbGVjdCh5VCxuLmNhcmRJZCksdGhpcy5zZWxlY3RlZFJ1bklkJF0pLnBpcGUoSXQoKChbdCxuXSk9PnQmJm4/ZS5kb3dubG9hZFVybCh0LnBsdWdpbix0LnRhZyxuLCJjc3YiKTpudWxsKSksTmUobnVsbCkpLHRoaXMuZG93bmxvYWRVcmxKc29uJD1XdChbdC5zZWxlY3QoeVQsbi5jYXJkSWQpLHRoaXMuc2VsZWN0ZWRSdW5JZCRdKS5waXBlKEl0KCgoW3Qsbl0pPT50JiZuP2UuZG93bmxvYWRVcmwodC5wbHVnaW4sdC50YWcsbiwianNvbiIpOm51bGwpKSxOZShudWxsKSksdGhpcy5ydW5zJD1XdChbdC5zZWxlY3QoZE4pLHQuc2VsZWN0KGhULG4uY2FyZElkKV0pLnBpcGUoSXQoKChbdCxlXSk9PmU/T2JqZWN0LmtleXMoZSkubWFwKChlPT50LmdldChlKSkpLmZpbHRlcihCb29sZWFuKTpbXSkpKX19ZnVuY3Rpb24gYzUodCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOnQ+PWU/MDpOYU59ZnVuY3Rpb24gZDUodCl7cmV0dXJuIDE9PT10Lmxlbmd0aCYmKHQ9KGZ1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuIGM1KHQoZSksbil9fSkodCkpLHtsZWZ0OmZ1bmN0aW9uKGUsbixvLGkpe2ZvcihudWxsPT1vJiYobz0wKSxudWxsPT1pJiYoaT1lLmxlbmd0aCk7bzxpOyl7dmFyIGE9bytpPj4+MTt0KGVbYV0sbik8MD9vPWErMTppPWF9cmV0dXJuIG99LHJpZ2h0OmZ1bmN0aW9uKGUsbixvLGkpe2ZvcihudWxsPT1vJiYobz0wKSxudWxsPT1pJiYoaT1lLmxlbmd0aCk7bzxpOyl7dmFyIGE9bytpPj4+MTt0KGVbYV0sbik+MD9pPWE6bz1hKzF9cmV0dXJuIG99fX1sNS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bDUpKFNtKEl3KSxTbShQQSksU20oSkcpKX0sbDUuybVjbXA9dG8oe3R5cGU6bDUsc2VsZWN0b3JzOltbImRhdGFfZG93bmxvYWRfZGlhbG9nIl1dLGRlY2xzOjYsdmFyczoxNSxjb25zdHM6W1szLCJjYXJkTWV0YWRhdGEiLCJydW5zIiwic2VsZWN0ZWRSdW5JZCIsImRvd25sb2FkVXJsQ3N2IiwiZG93bmxvYWRVcmxKc29uIiwicnVuU2VsZWN0ZWQiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImRhdGFfZG93bmxvYWRfZGlhbG9nX2NvbXBvbmVudCIsMCksVm0oInJ1blNlbGVjdGVkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5zZWxlY3RlZFJ1bklkJC5uZXh0KGUpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBaCgzLCJhc3luYyIpLEFoKDQsImFzeW5jIiksQWgoNSwiYXN5bmMiKSxBbSgpKSwyJmUmJkRtKCJjYXJkTWV0YWRhdGEiLFRoKDEsNSxuLmNhcmRNZXRhZGF0YSQpKSgicnVucyIsVGgoMiw3LG4ucnVucyQpKSgic2VsZWN0ZWRSdW5JZCIsVGgoMyw5LG4uc2VsZWN0ZWRSdW5JZCQpKSgiZG93bmxvYWRVcmxDc3YiLFRoKDQsMTEsbi5kb3dubG9hZFVybENzdiQpKSgiZG93bmxvYWRVcmxKc29uIixUaCg1LDEzLG4uZG93bmxvYWRVcmxKc29uJCkpfSxkaXJlY3RpdmVzOltzNV0scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGw1LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImRhdGFfZG93bmxvYWRfZGlhbG9nIix0ZW1wbGF0ZTonPGRhdGFfZG93bmxvYWRfZGlhbG9nX2NvbXBvbmVudFxuICAgIFtjYXJkTWV0YWRhdGFdPSJjYXJkTWV0YWRhdGEkIHwgYXN5bmMiXG4gICAgW3J1bnNdPSJydW5zJCB8IGFzeW5jIlxuICAgIFtzZWxlY3RlZFJ1bklkXT0ic2VsZWN0ZWRSdW5JZCQgfCBhc3luYyJcbiAgICBbZG93bmxvYWRVcmxDc3ZdPSJkb3dubG9hZFVybENzdiQgfCBhc3luYyJcbiAgICBbZG93bmxvYWRVcmxKc29uXT0iZG93bmxvYWRVcmxKc29uJCB8IGFzeW5jIlxuICAgIChydW5TZWxlY3RlZCk9InNlbGVjdGVkUnVuSWQkLm5leHQoJGV2ZW50KSJcbiAgPjwvZGF0YV9kb3dubG9hZF9kaWFsb2dfY29tcG9uZW50PicsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fSx7dHlwZTpQQX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W0pHXX1dfV19KSxudWxsKSwoZnVuY3Rpb24odCl7dFt0Lk9SSUdJTkFMPTBdPSJPUklHSU5BTCIsdFt0LkRFUklWRUQ9MV09IkRFUklWRUQifSkoUTJ8fChRMj17fSkpO3ZhciBwNT1kNShjNSkucmlnaHQ7ZnVuY3Rpb24gbTUodCxlKXt2YXIgbixvLGksYT10Lmxlbmd0aCxyPS0xO2lmKG51bGw9PWUpe2Zvcig7KytyPGE7KWlmKG51bGwhPShuPXRbcl0pJiZuPj1uKWZvcihvPWk9bjsrK3I8YTspbnVsbCE9KG49dFtyXSkmJihvPm4mJihvPW4pLGk8biYmKGk9bikpfWVsc2UgZm9yKDsrK3I8YTspaWYobnVsbCE9KG49ZSh0W3JdLHIsdCkpJiZuPj1uKWZvcihvPWk9bjsrK3I8YTspbnVsbCE9KG49ZSh0W3JdLHIsdCkpJiYobz5uJiYobz1uKSxpPG4mJihpPW4pKTtyZXR1cm5bbyxpXX12YXIgdTU9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIGY1KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBnNSh0KXtyZXR1cm4gdH1mdW5jdGlvbiBoNSh0LGUsbil7dD0rdCxlPStlLG49KGk9YXJndW1lbnRzLmxlbmd0aCk8Mj8oZT10LHQ9MCwxKTppPDM/MTorbjtmb3IodmFyIG89LTEsaT0wfE1hdGgubWF4KDAsTWF0aC5jZWlsKChlLXQpL24pKSxhPW5ldyBBcnJheShpKTsrK288aTspYVtvXT10K28qbjtyZXR1cm4gYX12YXIgYjU9TWF0aC5zcXJ0KDUwKSx5NT1NYXRoLnNxcnQoMTApLF81PU1hdGguc3FydCgyKTtmdW5jdGlvbiBDNSh0LGUsbil7dmFyIG8saSxhLHIscz0tMTtpZihuPStuLCh0PSt0KT09KGU9K2UpJiZuPjApcmV0dXJuW3RdO2lmKChvPWU8dCkmJihpPXQsdD1lLGU9aSksMD09PShyPU01KHQsZSxuKSl8fCFpc0Zpbml0ZShyKSlyZXR1cm5bXTtpZihyPjApZm9yKHQ9TWF0aC5jZWlsKHQvciksZT1NYXRoLmZsb29yKGUvciksYT1uZXcgQXJyYXkoaT1NYXRoLmNlaWwoZS10KzEpKTsrK3M8aTspYVtzXT0odCtzKSpyO2Vsc2UgZm9yKHQ9TWF0aC5mbG9vcih0KnIpLGU9TWF0aC5jZWlsKGUqciksYT1uZXcgQXJyYXkoaT1NYXRoLmNlaWwodC1lKzEpKTsrK3M8aTspYVtzXT0odC1zKS9yO3JldHVybiBvJiZhLnJldmVyc2UoKSxhfWZ1bmN0aW9uIE01KHQsZSxuKXt2YXIgbz0oZS10KS9NYXRoLm1heCgwLG4pLGk9TWF0aC5mbG9vcihNYXRoLmxvZyhvKS9NYXRoLkxOMTApLGE9by9NYXRoLnBvdygxMCxpKTtyZXR1cm4gaT49MD8oYT49YjU/MTA6YT49eTU/NTphPj1fNT8yOjEpKk1hdGgucG93KDEwLGkpOi1NYXRoLnBvdygxMCwtaSkvKGE+PWI1PzEwOmE+PXk1PzU6YT49XzU/MjoxKX1mdW5jdGlvbiB2NSh0LGUsbil7dmFyIG89TWF0aC5hYnMoZS10KS9NYXRoLm1heCgwLG4pLGk9TWF0aC5wb3coMTAsTWF0aC5mbG9vcihNYXRoLmxvZyhvKS9NYXRoLkxOMTApKSxhPW8vaTtyZXR1cm4gYT49YjU/aSo9MTA6YT49eTU/aSo9NTphPj1fNSYmKGkqPTIpLGU8dD8taTppfWZ1bmN0aW9uIHg1KHQpe3JldHVybiBNYXRoLmNlaWwoTWF0aC5sb2codC5sZW5ndGgpL01hdGguTE4yKSsxfWZ1bmN0aW9uIE81KCl7dmFyIHQ9ZzUsZT1tNSxuPXg1O2Z1bmN0aW9uIG8obyl7dmFyIGksYSxyPW8ubGVuZ3RoLHM9bmV3IEFycmF5KHIpO2ZvcihpPTA7aTxyOysraSlzW2ldPXQob1tpXSxpLG8pO3ZhciBsPWUocyksYz1sWzBdLGQ9bFsxXSxwPW4ocyxjLGQpO0FycmF5LmlzQXJyYXkocCl8fChwPXY1KGMsZCxwKSxwPWg1KE1hdGguY2VpbChjL3ApKnAsZCxwKSk7Zm9yKHZhciBtPXAubGVuZ3RoO3BbMF08PWM7KXAuc2hpZnQoKSwtLW07Zm9yKDtwW20tMV0+ZDspcC5wb3AoKSwtLW07dmFyIHUsZj1uZXcgQXJyYXkobSsxKTtmb3IoaT0wO2k8PW07KytpKSh1PWZbaV09W10pLngwPWk+MD9wW2ktMV06Yyx1LngxPWk8bT9wW2ldOmQ7Zm9yKGk9MDtpPHI7KytpKWM8PShhPXNbaV0pJiZhPD1kJiZmW3A1KHAsYSwwLG0pXS5wdXNoKG9baV0pO3JldHVybiBmfXJldHVybiBvLnZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6ZjUoZSksbyk6dH0sby5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmNShbdFswXSx0WzFdXSksbyk6ZX0sby50aHJlc2hvbGRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6QXJyYXkuaXNBcnJheSh0KT9mNSh1NS5jYWxsKHQpKTpmNSh0KSxvKTpufSxvfXZhciBQNT1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gdzUodCl7cmV0dXJuIHR9dmFyIGs1PTFlLTY7ZnVuY3Rpb24gUzUodCl7cmV0dXJuInRyYW5zbGF0ZSgiKyh0Ky41KSsiLDApIn1mdW5jdGlvbiBENSh0KXtyZXR1cm4idHJhbnNsYXRlKDAsIisodCsuNSkrIikifWZ1bmN0aW9uIEU1KHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4rdChlKX19ZnVuY3Rpb24gUjUodCl7dmFyIGU9TWF0aC5tYXgoMCx0LmJhbmR3aWR0aCgpLTEpLzI7cmV0dXJuIHQucm91bmQoKSYmKGU9TWF0aC5yb3VuZChlKSksZnVuY3Rpb24obil7cmV0dXJuK3QobikrZX19ZnVuY3Rpb24gQTUoKXtyZXR1cm4hdGhpcy5fX2F4aXN9ZnVuY3Rpb24gVDUodCxlKXt2YXIgbj1bXSxvPW51bGwsaT1udWxsLGE9NixyPTYscz0zLGw9MT09PXR8fDQ9PT10Py0xOjEsYz00PT09dHx8Mj09PXQ/IngiOiJ5IixkPTE9PT10fHwzPT09dD9TNTpENTtmdW5jdGlvbiBwKHApe3ZhciBtPW51bGw9PW8/ZS50aWNrcz9lLnRpY2tzLmFwcGx5KGUsbik6ZS5kb21haW4oKTpvLHU9bnVsbD09aT9lLnRpY2tGb3JtYXQ/ZS50aWNrRm9ybWF0LmFwcGx5KGUsbik6dzU6aSxmPU1hdGgubWF4KGEsMCkrcyxnPWUucmFuZ2UoKSxoPStnWzBdKy41LGI9K2dbZy5sZW5ndGgtMV0rLjUseT0oZS5iYW5kd2lkdGg/UjU6RTUpKGUuY29weSgpKSxfPXAuc2VsZWN0aW9uP3Auc2VsZWN0aW9uKCk6cCxDPV8uc2VsZWN0QWxsKCIuZG9tYWluIikuZGF0YShbbnVsbF0pLE09Xy5zZWxlY3RBbGwoIi50aWNrIikuZGF0YShtLGUpLm9yZGVyKCksdj1NLmV4aXQoKSx4PU0uZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInRpY2siKSxPPU0uc2VsZWN0KCJsaW5lIiksUD1NLnNlbGVjdCgidGV4dCIpO0M9Qy5tZXJnZShDLmVudGVyKCkuaW5zZXJ0KCJwYXRoIiwiLnRpY2siKS5hdHRyKCJjbGFzcyIsImRvbWFpbiIpLmF0dHIoInN0cm9rZSIsImN1cnJlbnRDb2xvciIpKSxNPU0ubWVyZ2UoeCksTz1PLm1lcmdlKHguYXBwZW5kKCJsaW5lIikuYXR0cigic3Ryb2tlIiwiY3VycmVudENvbG9yIikuYXR0cihjKyIyIixsKmEpKSxQPVAubWVyZ2UoeC5hcHBlbmQoInRleHQiKS5hdHRyKCJmaWxsIiwiY3VycmVudENvbG9yIikuYXR0cihjLGwqZikuYXR0cigiZHkiLDE9PT10PyIwZW0iOjM9PT10PyIwLjcxZW0iOiIwLjMyZW0iKSkscCE9PV8mJihDPUMudHJhbnNpdGlvbihwKSxNPU0udHJhbnNpdGlvbihwKSxPPU8udHJhbnNpdGlvbihwKSxQPVAudHJhbnNpdGlvbihwKSx2PXYudHJhbnNpdGlvbihwKS5hdHRyKCJvcGFjaXR5IixrNSkuYXR0cigidHJhbnNmb3JtIiwoZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9eSh0KSk/ZCh0KTp0aGlzLmdldEF0dHJpYnV0ZSgidHJhbnNmb3JtIil9KSkseC5hdHRyKCJvcGFjaXR5IixrNSkuYXR0cigidHJhbnNmb3JtIiwoZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wYXJlbnROb2RlLl9fYXhpcztyZXR1cm4gZChlJiZpc0Zpbml0ZShlPWUodCkpP2U6eSh0KSl9KSkpLHYucmVtb3ZlKCksQy5hdHRyKCJkIiw0PT09dHx8Mj09dD9yPyJNIitsKnIrIiwiK2grIkgwLjVWIitiKyJIIitsKnI6Ik0wLjUsIitoKyJWIitiOnI/Ik0iK2grIiwiK2wqcisiVjAuNUgiK2IrIlYiK2wqcjoiTSIraCsiLDAuNUgiK2IpLE0uYXR0cigib3BhY2l0eSIsMSkuYXR0cigidHJhbnNmb3JtIiwoZnVuY3Rpb24odCl7cmV0dXJuIGQoeSh0KSl9KSksTy5hdHRyKGMrIjIiLGwqYSksUC5hdHRyKGMsbCpmKS50ZXh0KHUpLF8uZmlsdGVyKEE1KS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoImZvbnQtc2l6ZSIsMTApLmF0dHIoImZvbnQtZmFtaWx5Iiwic2Fucy1zZXJpZiIpLmF0dHIoInRleHQtYW5jaG9yIiwyPT09dD8ic3RhcnQiOjQ9PT10PyJlbmQiOiJtaWRkbGUiKSxfLmVhY2goKGZ1bmN0aW9uKCl7dGhpcy5fX2F4aXM9eX0pKX1yZXR1cm4gcC5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LHApOmV9LHAudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gbj1QNS5jYWxsKGFyZ3VtZW50cykscH0scC50aWNrQXJndW1lbnRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPW51bGw9PXQ/W106UDUuY2FsbCh0KSxwKTpuLnNsaWNlKCl9LHAudGlja1ZhbHVlcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1udWxsPT10P251bGw6UDUuY2FsbCh0KSxwKTpvJiZvLnNsaWNlKCl9LHAudGlja0Zvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LHApOml9LHAudGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9cj0rdCxwKTphfSxwLnRpY2tTaXplSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9K3QscCk6YX0scC50aWNrU2l6ZU91dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0LHApOnJ9LHAudGlja1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9K3QscCk6c30scH1mdW5jdGlvbiBONSh0KXtyZXR1cm4gVDUoMix0KX1mdW5jdGlvbiB6NSh0KXtyZXR1cm4gVDUoMyx0KX12YXIgSTU9e3ZhbHVlOmZ1bmN0aW9uKCl7fX07ZnVuY3Rpb24gSDUoKXtmb3IodmFyIHQsZT0wLG49YXJndW1lbnRzLmxlbmd0aCxvPXt9O2U8bjsrK2Upe2lmKCEodD1hcmd1bWVudHNbZV0rIiIpfHx0IGluIG98fC9bXHMuXS8udGVzdCh0KSl0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgdHlwZTogIit0KTtvW3RdPVtdfXJldHVybiBuZXcgRjUobyl9ZnVuY3Rpb24gRjUodCl7dGhpcy5fPXR9ZnVuY3Rpb24gTDUodCxlKXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKChmdW5jdGlvbih0KXt2YXIgbj0iIixvPXQuaW5kZXhPZigiLiIpO2lmKG8+PTAmJihuPXQuc2xpY2UobysxKSx0PXQuc2xpY2UoMCxvKSksdCYmIWUuaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7cmV0dXJue3R5cGU6dCxuYW1lOm59fSkpfWZ1bmN0aW9uIEI1KHQsZSl7Zm9yKHZhciBuLG89MCxpPXQubGVuZ3RoO288aTsrK28paWYoKG49dFtvXSkubmFtZT09PWUpcmV0dXJuIG4udmFsdWV9ZnVuY3Rpb24gVjUodCxlLG4pe2Zvcih2YXIgbz0wLGk9dC5sZW5ndGg7bzxpOysrbylpZih0W29dLm5hbWU9PT1lKXt0W29dPUk1LHQ9dC5zbGljZSgwLG8pLmNvbmNhdCh0LnNsaWNlKG8rMSkpO2JyZWFrfXJldHVybiBudWxsIT1uJiZ0LnB1c2goe25hbWU6ZSx2YWx1ZTpufSksdH1GNS5wcm90b3R5cGU9SDUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpGNSxvbjpmdW5jdGlvbih0LGUpe3ZhciBuLG89dGhpcy5fLGk9TDUodCsiIixvKSxhPS0xLHI9aS5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrZSk7Zm9yKDsrK2E8cjspaWYobj0odD1pW2FdKS50eXBlKW9bbl09VjUob1tuXSx0Lm5hbWUsZSk7ZWxzZSBpZihudWxsPT1lKWZvcihuIGluIG8pb1tuXT1WNShvW25dLHQubmFtZSxudWxsKTtyZXR1cm4gdGhpc31mb3IoOysrYTxyOylpZigobj0odD1pW2FdKS50eXBlKSYmKG49QjUob1tuXSx0Lm5hbWUpKSlyZXR1cm4gbn0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LGU9dGhpcy5fO2Zvcih2YXIgbiBpbiBlKXRbbl09ZVtuXS5zbGljZSgpO3JldHVybiBuZXcgRjUodCl9LGNhbGw6ZnVuY3Rpb24odCxlKXtpZigobj1hcmd1bWVudHMubGVuZ3RoLTIpPjApZm9yKHZhciBuLG8saT1uZXcgQXJyYXkobiksYT0wO2E8bjsrK2EpaVthXT1hcmd1bWVudHNbYSsyXTtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2ZvcihhPTAsbj0obz10aGlzLl9bdF0pLmxlbmd0aDthPG47KythKW9bYV0udmFsdWUuYXBwbHkoZSxpKX0sYXBwbHk6ZnVuY3Rpb24odCxlLG4pe2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKHZhciBvPXRoaXMuX1t0XSxpPTAsYT1vLmxlbmd0aDtpPGE7KytpKW9baV0udmFsdWUuYXBwbHkoZSxuKX19O3ZhciBqNT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsVTU9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOmo1LHhsaW5rOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIix4bWw6Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIn07ZnVuY3Rpb24gRzUodCl7dmFyIGU9dCs9IiIsbj1lLmluZGV4T2YoIjoiKTtyZXR1cm4gbj49MCYmInhtbG5zIiE9PShlPXQuc2xpY2UoMCxuKSkmJih0PXQuc2xpY2UobisxKSksVTUuaGFzT3duUHJvcGVydHkoZSk/e3NwYWNlOlU1W2VdLGxvY2FsOnR9OnR9ZnVuY3Rpb24gVzUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vd25lckRvY3VtZW50LG49dGhpcy5uYW1lc3BhY2VVUkk7cmV0dXJuIG49PT1qNSYmZS5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJPT09ajU/ZS5jcmVhdGVFbGVtZW50KHQpOmUuY3JlYXRlRWxlbWVudE5TKG4sdCl9fWZ1bmN0aW9uIFk1KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIHE1KHQpe3ZhciBlPUc1KHQpO3JldHVybihlLmxvY2FsP1k1Olc1KShlKX1mdW5jdGlvbiBaNSgpe31mdW5jdGlvbiBYNSh0KXtyZXR1cm4gbnVsbD09dD9aNTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IodCl9fWZ1bmN0aW9uIEs1KCl7cmV0dXJuW119ZnVuY3Rpb24gSjUodCl7cmV0dXJuIG51bGw9PXQ/SzU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHQpfX1mdW5jdGlvbiBRNSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXRjaGVzKHQpfX1mdW5jdGlvbiAkNSh0KXtyZXR1cm4gbmV3IEFycmF5KHQubGVuZ3RoKX1mdW5jdGlvbiB0NCh0LGUpe3RoaXMub3duZXJEb2N1bWVudD10Lm93bmVyRG9jdW1lbnQsdGhpcy5uYW1lc3BhY2VVUkk9dC5uYW1lc3BhY2VVUkksdGhpcy5fbmV4dD1udWxsLHRoaXMuX3BhcmVudD10LHRoaXMuX19kYXRhX189ZX1mdW5jdGlvbiBlNCh0LGUsbixvLGksYSl7Zm9yKHZhciByLHM9MCxsPWUubGVuZ3RoLGM9YS5sZW5ndGg7czxjOysrcykocj1lW3NdKT8oci5fX2RhdGFfXz1hW3NdLG9bc109cik6bltzXT1uZXcgdDQodCxhW3NdKTtmb3IoO3M8bDsrK3MpKHI9ZVtzXSkmJihpW3NdPXIpfWZ1bmN0aW9uIG40KHQsZSxuLG8saSxhLHIpe3ZhciBzLGwsYyxkPXt9LHA9ZS5sZW5ndGgsbT1hLmxlbmd0aCx1PW5ldyBBcnJheShwKTtmb3Iocz0wO3M8cDsrK3MpKGw9ZVtzXSkmJih1W3NdPWM9IiQiK3IuY2FsbChsLGwuX19kYXRhX18scyxlKSxjIGluIGQ/aVtzXT1sOmRbY109bCk7Zm9yKHM9MDtzPG07KytzKShsPWRbYz0iJCIrci5jYWxsKHQsYVtzXSxzLGEpXSk/KG9bc109bCxsLl9fZGF0YV9fPWFbc10sZFtjXT1udWxsKTpuW3NdPW5ldyB0NCh0LGFbc10pO2ZvcihzPTA7czxwOysrcykobD1lW3NdKSYmZFt1W3NdXT09PWwmJihpW3NdPWwpfWZ1bmN0aW9uIG80KHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTp0Pj1lPzA6TmFOfWZ1bmN0aW9uIGk0KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX1mdW5jdGlvbiBhNCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIHI0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUodCxlKX19ZnVuY3Rpb24gczQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxlKX19ZnVuY3Rpb24gbDQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpOnRoaXMuc2V0QXR0cmlidXRlKHQsbil9fWZ1bmN0aW9uIGM0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk6dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsbil9fWZ1bmN0aW9uIGQ0KHQpe3JldHVybiB0Lm93bmVyRG9jdW1lbnQmJnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8dC5kb2N1bWVudCYmdHx8dC5kZWZhdWx0Vmlld31mdW5jdGlvbiBwNCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX1mdW5jdGlvbiBtNCh0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LGUsbil9fWZ1bmN0aW9uIHU0KHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1vP3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCk6dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LG8sbil9fWZ1bmN0aW9uIGY0KHQsZSl7cmV0dXJuIHQuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShlKXx8ZDQodCkuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpLmdldFByb3BlcnR5VmFsdWUoZSl9ZnVuY3Rpb24gZzQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbdF19fWZ1bmN0aW9uIGg0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpc1t0XT1lfX1mdW5jdGlvbiBiNCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PW4/ZGVsZXRlIHRoaXNbdF06dGhpc1t0XT1ufX1mdW5jdGlvbiB5NCh0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLyl9ZnVuY3Rpb24gXzQodCl7cmV0dXJuIHQuY2xhc3NMaXN0fHxuZXcgQzQodCl9ZnVuY3Rpb24gQzQodCl7dGhpcy5fbm9kZT10LHRoaXMuX25hbWVzPXk0KHQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9ZnVuY3Rpb24gTTQodCxlKXtmb3IodmFyIG49XzQodCksbz0tMSxpPWUubGVuZ3RoOysrbzxpOyluLmFkZChlW29dKX1mdW5jdGlvbiB2NCh0LGUpe2Zvcih2YXIgbj1fNCh0KSxvPS0xLGk9ZS5sZW5ndGg7KytvPGk7KW4ucmVtb3ZlKGVbb10pfWZ1bmN0aW9uIHg0KHQpe3JldHVybiBmdW5jdGlvbigpe000KHRoaXMsdCl9fWZ1bmN0aW9uIE80KHQpe3JldHVybiBmdW5jdGlvbigpe3Y0KHRoaXMsdCl9fWZ1bmN0aW9uIFA0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7KGUuYXBwbHkodGhpcyxhcmd1bWVudHMpP000OnY0KSh0aGlzLHQpfX1mdW5jdGlvbiB3NCgpe3RoaXMudGV4dENvbnRlbnQ9IiJ9ZnVuY3Rpb24gazQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD10fX1mdW5jdGlvbiBTNCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PWU/IiI6ZX19ZnVuY3Rpb24gRDQoKXt0aGlzLmlubmVySFRNTD0iIn1mdW5jdGlvbiBFNCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD10fX1mdW5jdGlvbiBSNCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT1lPyIiOmV9fWZ1bmN0aW9uIEE0KCl7dGhpcy5uZXh0U2libGluZyYmdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpfWZ1bmN0aW9uIFQ0KCl7dGhpcy5wcmV2aW91c1NpYmxpbmcmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcyx0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gTjQoKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiB6NCgpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTt0JiZ0LnJlbW92ZUNoaWxkKHRoaXMpfWZ1bmN0aW9uIEk0KCl7dmFyIHQ9dGhpcy5jbG9uZU5vZGUoITEpLGU9dGhpcy5wYXJlbnROb2RlO3JldHVybiBlP2UuaW5zZXJ0QmVmb3JlKHQsdGhpcy5uZXh0U2libGluZyk6dH1mdW5jdGlvbiBINCgpe3ZhciB0PXRoaXMuY2xvbmVOb2RlKCEwKSxlPXRoaXMucGFyZW50Tm9kZTtyZXR1cm4gZT9lLmluc2VydEJlZm9yZSh0LHRoaXMubmV4dFNpYmxpbmcpOnR9dDQucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp0NCxhcHBlbmRDaGlsZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LHRoaXMuX25leHQpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LGUpfSxxdWVyeVNlbGVjdG9yOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3Rvcih0KX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCl9fSxDNC5wcm90b3R5cGU9e2FkZDpmdW5jdGlvbih0KXt0aGlzLl9uYW1lcy5pbmRleE9mKHQpPDAmJih0aGlzLl9uYW1lcy5wdXNoKHQpLHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5fbmFtZXMuam9pbigiICIpKSl9LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9uYW1lcy5pbmRleE9mKHQpO2U+PTAmJih0aGlzLl9uYW1lcy5zcGxpY2UoZSwxKSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxjb250YWluczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZih0KT49MH19O3ZhciBGND17fSxMND1udWxsO2Z1bmN0aW9uIEI0KHQsZSxuKXtyZXR1cm4gdD1WNCh0LGUsbiksZnVuY3Rpb24oZSl7dmFyIG49ZS5yZWxhdGVkVGFyZ2V0O24mJihuPT09dGhpc3x8OCZuLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpKXx8dC5jYWxsKHRoaXMsZSl9fWZ1bmN0aW9uIFY0KHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24obyl7dmFyIGk9TDQ7TDQ9bzt0cnl7dC5jYWxsKHRoaXMsdGhpcy5fX2RhdGFfXyxlLG4pfWZpbmFsbHl7TDQ9aX19fWZ1bmN0aW9uIGo0KHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlPSIiLG49dC5pbmRleE9mKCIuIik7cmV0dXJuIG4+PTAmJihlPXQuc2xpY2UobisxKSx0PXQuc2xpY2UoMCxuKSkse3R5cGU6dCxuYW1lOmV9fSkpfWZ1bmN0aW9uIFU0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuX19vbjtpZihlKXtmb3IodmFyIG4sbz0wLGk9LTEsYT1lLmxlbmd0aDtvPGE7KytvKW49ZVtvXSx0LnR5cGUmJm4udHlwZSE9PXQudHlwZXx8bi5uYW1lIT09dC5uYW1lP2VbKytpXT1uOnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLnR5cGUsbi5saXN0ZW5lcixuLmNhcHR1cmUpOysraT9lLmxlbmd0aD1pOmRlbGV0ZSB0aGlzLl9fb259fX1mdW5jdGlvbiBHNCh0LGUsbil7dmFyIG89RjQuaGFzT3duUHJvcGVydHkodC50eXBlKT9CNDpWNDtyZXR1cm4gZnVuY3Rpb24oaSxhLHIpe3ZhciBzLGw9dGhpcy5fX29uLGM9byhlLGEscik7aWYobClmb3IodmFyIGQ9MCxwPWwubGVuZ3RoO2Q8cDsrK2QpaWYoKHM9bFtkXSkudHlwZT09PXQudHlwZSYmcy5uYW1lPT09dC5uYW1lKXJldHVybiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIocy50eXBlLHMubGlzdGVuZXIscy5jYXB0dXJlKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIocy50eXBlLHMubGlzdGVuZXI9YyxzLmNhcHR1cmU9biksdm9pZChzLnZhbHVlPWUpO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LnR5cGUsYyxuKSxzPXt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSx2YWx1ZTplLGxpc3RlbmVyOmMsY2FwdHVyZTpufSxsP2wucHVzaChzKTp0aGlzLl9fb249W3NdfX1mdW5jdGlvbiBXNCh0LGUsbil7dmFyIG89ZDQodCksaT1vLkN1c3RvbUV2ZW50OyJmdW5jdGlvbiI9PXR5cGVvZiBpP2k9bmV3IGkoZSxuKTooaT1vLmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLG4/KGkuaW5pdEV2ZW50KGUsbi5idWJibGVzLG4uY2FuY2VsYWJsZSksaS5kZXRhaWw9bi5kZXRhaWwpOmkuaW5pdEV2ZW50KGUsITEsITEpKSx0LmRpc3BhdGNoRXZlbnQoaSl9ZnVuY3Rpb24gWTQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gVzQodGhpcyx0LGUpfX1mdW5jdGlvbiBxNCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBXNCh0aGlzLHQsZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX0idW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiYoIm9ubW91c2VlbnRlciJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fChGND17bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9KSk7dmFyIFo0PVtudWxsXTtmdW5jdGlvbiBYNCh0LGUpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9ZX1mdW5jdGlvbiBLNCgpe3JldHVybiBuZXcgWDQoW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSxaNCl9ZnVuY3Rpb24gSjQodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P25ldyBYNChbW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCldXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IFg0KFtbdF1dLFo0KX1mdW5jdGlvbiBRNCgpe2Zvcih2YXIgdCxlPUw0O3Q9ZS5zb3VyY2VFdmVudDspZT10O3JldHVybiBlfWZ1bmN0aW9uICQ0KHQsZSl7dmFyIG49dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYobi5jcmVhdGVTVkdQb2ludCl7dmFyIG89bi5jcmVhdGVTVkdQb2ludCgpO3JldHVybiBvLng9ZS5jbGllbnRYLG8ueT1lLmNsaWVudFksWyhvPW8ubWF0cml4VHJhbnNmb3JtKHQuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSkueCxvLnldfXZhciBpPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW2UuY2xpZW50WC1pLmxlZnQtdC5jbGllbnRMZWZ0LGUuY2xpZW50WS1pLnRvcC10LmNsaWVudFRvcF19ZnVuY3Rpb24gdDYodCl7dmFyIGU9UTQoKTtyZXR1cm4gZS5jaGFuZ2VkVG91Y2hlcyYmKGU9ZS5jaGFuZ2VkVG91Y2hlc1swXSksJDQodCxlKX1mdW5jdGlvbiBlNigpe0w0LnByZXZlbnREZWZhdWx0KCksTDQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gbjYodCl7dmFyIGU9dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbj1KNCh0KS5vbigiZHJhZ3N0YXJ0LmRyYWciLGU2LCEwKTsib25zZWxlY3RzdGFydCJpbiBlP24ub24oInNlbGVjdHN0YXJ0LmRyYWciLGU2LCEwKTooZS5fX25vc2VsZWN0PWUuc3R5bGUuTW96VXNlclNlbGVjdCxlLnN0eWxlLk1velVzZXJTZWxlY3Q9Im5vbmUiKX1mdW5jdGlvbiBvNih0LGUpe3ZhciBuPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LG89SjQodCkub24oImRyYWdzdGFydC5kcmFnIixudWxsKTtlJiYoby5vbigiY2xpY2suZHJhZyIsZTYsITApLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7by5vbigiY2xpY2suZHJhZyIsbnVsbCl9KSwwKSksIm9uc2VsZWN0c3RhcnQiaW4gbj9vLm9uKCJzZWxlY3RzdGFydC5kcmFnIixudWxsKToobi5zdHlsZS5Nb3pVc2VyU2VsZWN0PW4uX19ub3NlbGVjdCxkZWxldGUgbi5fX25vc2VsZWN0KX1mdW5jdGlvbiBpNih0LGUsbil7dC5wcm90b3R5cGU9ZS5wcm90b3R5cGU9bixuLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24gYTYodCxlKXt2YXIgbj1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIG8gaW4gZSluW29dPWVbb107cmV0dXJuIG59ZnVuY3Rpb24gcjYoKXt9WDQucHJvdG90eXBlPUs0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6WDQsc2VsZWN0OmZ1bmN0aW9uIHM2KHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1YNSh0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLG89bmV3IEFycmF5KG4pLGk9MDtpPG47KytpKWZvcih2YXIgYSxyLHM9ZVtpXSxsPXMubGVuZ3RoLGM9b1tpXT1uZXcgQXJyYXkobCksZD0wO2Q8bDsrK2QpKGE9c1tkXSkmJihyPXQuY2FsbChhLGEuX19kYXRhX18sZCxzKSkmJigiX19kYXRhX18iaW4gYSYmKHIuX19kYXRhX189YS5fX2RhdGFfXyksY1tkXT1yKTtyZXR1cm4gbmV3IFg0KG8sdGhpcy5fcGFyZW50cyl9LHNlbGVjdEFsbDpmdW5jdGlvbiBsNih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9SjUodCkpO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj1lLmxlbmd0aCxvPVtdLGk9W10sYT0wO2E8bjsrK2EpZm9yKHZhciByLHM9ZVthXSxsPXMubGVuZ3RoLGM9MDtjPGw7KytjKShyPXNbY10pJiYoby5wdXNoKHQuY2FsbChyLHIuX19kYXRhX18sYyxzKSksaS5wdXNoKHIpKTtyZXR1cm4gbmV3IFg0KG8saSl9LGZpbHRlcjpmdW5jdGlvbiBjNih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9UTUodCkpO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj1lLmxlbmd0aCxvPW5ldyBBcnJheShuKSxpPTA7aTxuOysraSlmb3IodmFyIGEscj1lW2ldLHM9ci5sZW5ndGgsbD1vW2ldPVtdLGM9MDtjPHM7KytjKShhPXJbY10pJiZ0LmNhbGwoYSxhLl9fZGF0YV9fLGMscikmJmwucHVzaChhKTtyZXR1cm4gbmV3IFg0KG8sdGhpcy5fcGFyZW50cyl9LGRhdGE6ZnVuY3Rpb24gZDYodCxlKXtpZighdClyZXR1cm4gZj1uZXcgQXJyYXkodGhpcy5zaXplKCkpLGQ9LTEsdGhpcy5lYWNoKChmdW5jdGlvbih0KXtmWysrZF09dH0pKSxmO3ZhciBuPWU/bjQ6ZTQsbz10aGlzLl9wYXJlbnRzLGk9dGhpcy5fZ3JvdXBzOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD0oZnVuY3Rpb24gYSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KSh0KSk7Zm9yKHZhciByPWkubGVuZ3RoLHM9bmV3IEFycmF5KHIpLGw9bmV3IEFycmF5KHIpLGM9bmV3IEFycmF5KHIpLGQ9MDtkPHI7KytkKXt2YXIgcD1vW2RdLG09aVtkXSx1PW0ubGVuZ3RoLGY9dC5jYWxsKHAscCYmcC5fX2RhdGFfXyxkLG8pLGc9Zi5sZW5ndGgsaD1sW2RdPW5ldyBBcnJheShnKSxiPXNbZF09bmV3IEFycmF5KGcpO24ocCxtLGgsYixjW2RdPW5ldyBBcnJheSh1KSxmLGUpO2Zvcih2YXIgeSxfLEM9MCxNPTA7QzxnOysrQylpZih5PWhbQ10pe2ZvcihDPj1NJiYoTT1DKzEpOyEoXz1iW01dKSYmKytNPGc7KTt5Ll9uZXh0PV98fG51bGx9fXJldHVybihzPW5ldyBYNChzLG8pKS5fZW50ZXI9bCxzLl9leGl0PWMsc30sZW50ZXI6ZnVuY3Rpb24gcDYoKXtyZXR1cm4gbmV3IFg0KHRoaXMuX2VudGVyfHx0aGlzLl9ncm91cHMubWFwKCQ1KSx0aGlzLl9wYXJlbnRzKX0sZXhpdDpmdW5jdGlvbiBtNigpe3JldHVybiBuZXcgWDQodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcCgkNSksdGhpcy5fcGFyZW50cyl9LGpvaW46ZnVuY3Rpb24gdTYodCxlLG4pe3ZhciBvPXRoaXMuZW50ZXIoKSxpPXRoaXMsYT10aGlzLmV4aXQoKTtyZXR1cm4gbz0iZnVuY3Rpb24iPT10eXBlb2YgdD90KG8pOm8uYXBwZW5kKHQrIiIpLG51bGwhPWUmJihpPWUoaSkpLG51bGw9PW4/YS5yZW1vdmUoKTpuKGEpLG8mJmk/by5tZXJnZShpKS5vcmRlcigpOml9LG1lcmdlOmZ1bmN0aW9uIGY2KHQpe2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj10Ll9ncm91cHMsbz1lLmxlbmd0aCxpPU1hdGgubWluKG8sbi5sZW5ndGgpLGE9bmV3IEFycmF5KG8pLHI9MDtyPGk7KytyKWZvcih2YXIgcyxsPWVbcl0sYz1uW3JdLGQ9bC5sZW5ndGgscD1hW3JdPW5ldyBBcnJheShkKSxtPTA7bTxkOysrbSkocz1sW21dfHxjW21dKSYmKHBbbV09cyk7Zm9yKDtyPG87KytyKWFbcl09ZVtyXTtyZXR1cm4gbmV3IFg0KGEsdGhpcy5fcGFyZW50cyl9LG9yZGVyOmZ1bmN0aW9uIGc2KCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxlPS0xLG49dC5sZW5ndGg7KytlPG47KWZvcih2YXIgbyxpPXRbZV0sYT1pLmxlbmd0aC0xLHI9aVthXTstLWE+PTA7KShvPWlbYV0pJiYociYmNF5vLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpJiZyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG8scikscj1vKTtyZXR1cm4gdGhpc30sc29ydDpmdW5jdGlvbiBoNih0KXtmdW5jdGlvbiBlKGUsbil7cmV0dXJuIGUmJm4/dChlLl9fZGF0YV9fLG4uX19kYXRhX18pOiFlLSFufXR8fCh0PW80KTtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLG89bi5sZW5ndGgsaT1uZXcgQXJyYXkobyksYT0wO2E8bzsrK2Epe2Zvcih2YXIgcixzPW5bYV0sbD1zLmxlbmd0aCxjPWlbYV09bmV3IEFycmF5KGwpLGQ9MDtkPGw7KytkKShyPXNbZF0pJiYoY1tkXT1yKTtjLnNvcnQoZSl9cmV0dXJuIG5ldyBYNChpLHRoaXMuX3BhcmVudHMpLm9yZGVyKCl9LGNhbGw6ZnVuY3Rpb24gYjYoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGFyZ3VtZW50c1swXT10aGlzLHQuYXBwbHkobnVsbCxhcmd1bWVudHMpLHRoaXN9LG5vZGVzOmZ1bmN0aW9uIHk2KCl7dmFyIHQ9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSxlPS0xO3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7dFsrK2VdPXRoaXN9KSksdH0sbm9kZTpmdW5jdGlvbiBfNigpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsZT0wLG49dC5sZW5ndGg7ZTxuOysrZSlmb3IodmFyIG89dFtlXSxpPTAsYT1vLmxlbmd0aDtpPGE7KytpKXt2YXIgcj1vW2ldO2lmKHIpcmV0dXJuIHJ9cmV0dXJuIG51bGx9LHNpemU6ZnVuY3Rpb24gQzYoKXt2YXIgdD0wO3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7Kyt0fSkpLHR9LGVtcHR5OmZ1bmN0aW9uIE02KCl7cmV0dXJuIXRoaXMubm9kZSgpfSxlYWNoOmZ1bmN0aW9uIHY2KHQpe2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj0wLG89ZS5sZW5ndGg7bjxvOysrbilmb3IodmFyIGksYT1lW25dLHI9MCxzPWEubGVuZ3RoO3I8czsrK3IpKGk9YVtyXSkmJnQuY2FsbChpLGkuX19kYXRhX18scixhKTtyZXR1cm4gdGhpc30sYXR0cjpmdW5jdGlvbiB4Nih0LGUpe3ZhciBuPUc1KHQpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7dmFyIG89dGhpcy5ub2RlKCk7cmV0dXJuIG4ubG9jYWw/by5nZXRBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOm8uZ2V0QXR0cmlidXRlKG4pfXJldHVybiB0aGlzLmVhY2goKG51bGw9PWU/bi5sb2NhbD9hNDppNDoiZnVuY3Rpb24iPT10eXBlb2YgZT9uLmxvY2FsP2M0Omw0Om4ubG9jYWw/czQ6cjQpKG4sZSkpfSxzdHlsZTpmdW5jdGlvbiBPNih0LGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PWU/cDQ6ImZ1bmN0aW9uIj09dHlwZW9mIGU/dTQ6bTQpKHQsZSxudWxsPT1uPyIiOm4pKTpmNCh0aGlzLm5vZGUoKSx0KX0scHJvcGVydHk6ZnVuY3Rpb24gUDYodCxlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09ZT9nNDoiZnVuY3Rpb24iPT10eXBlb2YgZT9iNDpoNCkodCxlKSk6dGhpcy5ub2RlKClbdF19LGNsYXNzZWQ6ZnVuY3Rpb24gdzYodCxlKXt2YXIgbj15NCh0KyIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgbz1fNCh0aGlzLm5vZGUoKSksaT0tMSxhPW4ubGVuZ3RoOysraTxhOylpZighby5jb250YWlucyhuW2ldKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgZT9QNDplP3g0Ok80KShuLGUpKX0sdGV4dDpmdW5jdGlvbiBrNih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD93NDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/UzQ6azQpKHQpKTp0aGlzLm5vZGUoKS50ZXh0Q29udGVudH0saHRtbDpmdW5jdGlvbiBTNih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9ENDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/UjQ6RTQpKHQpKTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LHJhaXNlOmZ1bmN0aW9uIEQ2KCl7cmV0dXJuIHRoaXMuZWFjaChBNCl9LGxvd2VyOmZ1bmN0aW9uIEU2KCl7cmV0dXJuIHRoaXMuZWFjaChUNCl9LGFwcGVuZDpmdW5jdGlvbiBSNih0KXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnE1KHQpO3JldHVybiB0aGlzLnNlbGVjdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KSl9LGluc2VydDpmdW5jdGlvbiBBNih0LGUpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6cTUodCksbz1udWxsPT1lP040OiJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6WDUoZSk7cmV0dXJuIHRoaXMuc2VsZWN0KChmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxvLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8bnVsbCl9KSl9LHJlbW92ZTpmdW5jdGlvbiBUNigpe3JldHVybiB0aGlzLmVhY2goejQpfSxjbG9uZTpmdW5jdGlvbiBONih0KXtyZXR1cm4gdGhpcy5zZWxlY3QodD9INDpJNCl9LGRhdHVtOmZ1bmN0aW9uIHo2KHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIix0KTp0aGlzLm5vZGUoKS5fX2RhdGFfX30sb246ZnVuY3Rpb24gSTYodCxlLG4pe3ZhciBvLGksYT1qNCh0KyIiKSxyPWEubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7Zm9yKHM9ZT9HNDpVNCxudWxsPT1uJiYobj0hMSksbz0wO288cjsrK28pdGhpcy5lYWNoKHMoYVtvXSxlLG4pKTtyZXR1cm4gdGhpc312YXIgcz10aGlzLm5vZGUoKS5fX29uO2lmKHMpZm9yKHZhciBsLGM9MCxkPXMubGVuZ3RoO2M8ZDsrK2MpZm9yKG89MCxsPXNbY107bzxyOysrbylpZigoaT1hW29dKS50eXBlPT09bC50eXBlJiZpLm5hbWU9PT1sLm5hbWUpcmV0dXJuIGwudmFsdWV9LGRpc3BhdGNoOmZ1bmN0aW9uIEg2KHQsZSl7cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIGU/cTQ6WTQpKHQsZSkpfX07dmFyIEY2PS43LEw2PTEvRjYsQjY9IlxccyooWystXT9cXGQrKVxccyoiLFY2PSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLGo2PSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixVNj0vXiMoWzAtOWEtZl17Myw4fSkkLyxHNj1uZXcgUmVnRXhwKCJecmdiXFwoIitbQjYsQjYsQjZdKyJcXCkkIiksVzY9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW2o2LGo2LGo2XSsiXFwpJCIpLFk2PW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbQjYsQjYsQjYsVjZdKyJcXCkkIikscTY9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tqNixqNixqNixWNl0rIlxcKSQiKSxaNj1uZXcgUmVnRXhwKCJeaHNsXFwoIitbVjYsajYsajZdKyJcXCkkIiksWDY9bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1tWNixqNixqNixWNl0rIlxcKSQiKSxLNj17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtmdW5jdGlvbiBKNigpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpfWZ1bmN0aW9uIFE2KCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCl9ZnVuY3Rpb24gJDYodCl7dmFyIGUsbjtyZXR1cm4gdD0odCsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKGU9VTYuZXhlYyh0KSk/KG49ZVsxXS5sZW5ndGgsZT1wYXJzZUludChlWzFdLDE2KSw2PT09bj90NyhlKTozPT09bj9uZXcgaTcoZT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgxNSZlKTw8NHwxNSZlLDEpOjg9PT1uP2U3KGU+PjI0JjI1NSxlPj4xNiYyNTUsZT4+OCYyNTUsKDI1NSZlKS8yNTUpOjQ9PT1uP2U3KGU+PjEyJjE1fGU+PjgmMjQwLGU+PjgmMTV8ZT4+NCYyNDAsZT4+NCYxNXwyNDAmZSwoKDE1JmUpPDw0fDE1JmUpLzI1NSk6bnVsbCk6KGU9RzYuZXhlYyh0KSk/bmV3IGk3KGVbMV0sZVsyXSxlWzNdLDEpOihlPVc2LmV4ZWModCkpP25ldyBpNygyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCwxKTooZT1ZNi5leGVjKHQpKT9lNyhlWzFdLGVbMl0sZVszXSxlWzRdKTooZT1xNi5leGVjKHQpKT9lNygyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCxlWzRdKTooZT1aNi5leGVjKHQpKT9sNyhlWzFdLGVbMl0vMTAwLGVbM10vMTAwLDEpOihlPVg2LmV4ZWModCkpP2w3KGVbMV0sZVsyXS8xMDAsZVszXS8xMDAsZVs0XSk6SzYuaGFzT3duUHJvcGVydHkodCk/dDcoSzZbdF0pOiJ0cmFuc3BhcmVudCI9PT10P25ldyBpNyhOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIHQ3KHQpe3JldHVybiBuZXcgaTcodD4+MTYmMjU1LHQ+PjgmMjU1LDI1NSZ0LDEpfWZ1bmN0aW9uIGU3KHQsZSxuLG8pe3JldHVybiBvPD0wJiYodD1lPW49TmFOKSxuZXcgaTcodCxlLG4sbyl9ZnVuY3Rpb24gbjcodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiByNnx8KHQ9JDYodCkpLHQ/bmV3IGk3KCh0PXQucmdiKCkpLnIsdC5nLHQuYix0Lm9wYWNpdHkpOm5ldyBpN31mdW5jdGlvbiBvNyh0LGUsbixvKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/bjcodCk6bmV3IGk3KHQsZSxuLG51bGw9PW8/MTpvKX1mdW5jdGlvbiBpNyh0LGUsbixvKXt0aGlzLnI9K3QsdGhpcy5nPStlLHRoaXMuYj0rbix0aGlzLm9wYWNpdHk9K299ZnVuY3Rpb24gYTcoKXtyZXR1cm4iIyIrczcodGhpcy5yKStzNyh0aGlzLmcpK3M3KHRoaXMuYil9ZnVuY3Rpb24gcjcoKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX1mdW5jdGlvbiBzNyh0KXtyZXR1cm4oKHQ9TWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0KXx8MCkpKTwxNj8iMCI6IiIpK3QudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIGw3KHQsZSxuLG8pe3JldHVybiBvPD0wP3Q9ZT1uPU5hTjpuPD0wfHxuPj0xP3Q9ZT1OYU46ZTw9MCYmKHQ9TmFOKSxuZXcgcDcodCxlLG4sbyl9ZnVuY3Rpb24gYzcodCl7aWYodCBpbnN0YW5jZW9mIHA3KXJldHVybiBuZXcgcDcodC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YgcjZ8fCh0PSQ2KHQpKSwhdClyZXR1cm4gbmV3IHA3O2lmKHQgaW5zdGFuY2VvZiBwNylyZXR1cm4gdDt2YXIgZT0odD10LnJnYigpKS5yLzI1NSxuPXQuZy8yNTUsbz10LmIvMjU1LGk9TWF0aC5taW4oZSxuLG8pLGE9TWF0aC5tYXgoZSxuLG8pLHI9TmFOLHM9YS1pLGw9KGEraSkvMjtyZXR1cm4gcz8ocj1lPT09YT8obi1vKS9zKzYqKG48byk6bj09PWE/KG8tZSkvcysyOihlLW4pL3MrNCxzLz1sPC41P2EraToyLWEtaSxyKj02MCk6cz1sPjAmJmw8MT8wOnIsbmV3IHA3KHIscyxsLHQub3BhY2l0eSl9ZnVuY3Rpb24gZDcodCxlLG4sbyl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2M3KHQpOm5ldyBwNyh0LGUsbixudWxsPT1vPzE6byl9ZnVuY3Rpb24gcDcodCxlLG4sbyl7dGhpcy5oPSt0LHRoaXMucz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStvfWZ1bmN0aW9uIG03KHQsZSxuKXtyZXR1cm4gMjU1Kih0PDYwP2UrKG4tZSkqdC82MDp0PDE4MD9uOnQ8MjQwP2UrKG4tZSkqKDI0MC10KS82MDplKX1pNihyNiwkNix7Y29weTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3Rvcix0aGlzLHQpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCl9LGhleDpKNixmb3JtYXRIZXg6SjYsZm9ybWF0SHNsOmZ1bmN0aW9uIHU3KCl7cmV0dXJuIGM3KHRoaXMpLmZvcm1hdEhzbCgpfSxmb3JtYXRSZ2I6UTYsdG9TdHJpbmc6UTZ9KSxpNihpNyxvNyxhNihyNix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9MNjpNYXRoLnBvdyhMNix0KSxuZXcgaTcodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/RjY6TWF0aC5wb3coRjYsdCksbmV3IGk3KHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybi0uNTw9dGhpcy5yJiZ0aGlzLnI8MjU1LjUmJi0uNTw9dGhpcy5nJiZ0aGlzLmc8MjU1LjUmJi0uNTw9dGhpcy5iJiZ0aGlzLmI8MjU1LjUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxoZXg6YTcsZm9ybWF0SGV4OmE3LGZvcm1hdFJnYjpyNyx0b1N0cmluZzpyN30pKSxpNihwNyxkNyxhNihyNix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9MNjpNYXRoLnBvdyhMNix0KSxuZXcgcDcodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9GNjpNYXRoLnBvdyhGNix0KSxuZXcgcDcodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmglMzYwKzM2MCoodGhpcy5oPDApLGU9aXNOYU4odCl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsbj10aGlzLmwsbz1uKyhuPC41P246MS1uKSplLGk9MipuLW87cmV0dXJuIG5ldyBpNyhtNyh0Pj0yNDA/dC0yNDA6dCsxMjAsaSxvKSxtNyh0LGksbyksbTcodDwxMjA/dCsyNDA6dC0xMjAsaSxvKSx0aGlzLm9wYWNpdHkpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybigwPD10aGlzLnMmJnRoaXMuczw9MXx8aXNOYU4odGhpcy5zKSkmJjA8PXRoaXMubCYmdGhpcy5sPD0xJiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sZm9ybWF0SHNsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcGFjaXR5O3JldHVybigxPT09KHQ9aXNOYU4odCk/MTpNYXRoLm1heCgwLE1hdGgubWluKDEsdCkpKT8iaHNsKCI6ImhzbGEoIikrKHRoaXMuaHx8MCkrIiwgIisxMDAqKHRoaXMuc3x8MCkrIiUsICIrMTAwKih0aGlzLmx8fDApKyIlIisoMT09PXQ/IikiOiIsICIrdCsiKSIpfX0pKTt2YXIgZjc9TWF0aC5QSS8xODAsZzc9MTgwL01hdGguUEksaDc9Ljk2NDIyLGI3PS44MjUyMSx5Nz00LzI5LF83PTYvMjksQzc9MypfNypfNztmdW5jdGlvbiBNNyh0KXtpZih0IGluc3RhbmNlb2YgdjcpcmV0dXJuIG5ldyB2Nyh0LmwsdC5hLHQuYix0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiBENylyZXR1cm4gRTcodCk7dCBpbnN0YW5jZW9mIGk3fHwodD1uNyh0KSk7dmFyIGUsbixvPXc3KHQuciksaT13Nyh0LmcpLGE9dzcodC5iKSxyPXg3KCguMjIyNTA0NSpvKy43MTY4Nzg2KmkrLjA2MDYxNjkqYSkvMSk7cmV0dXJuIG89PT1pJiZpPT09YT9lPW49cjooZT14NygoLjQzNjA3NDcqbysuMzg1MDY0OSppKy4xNDMwODA0KmEpL2g3KSxuPXg3KCguMDEzOTMyMipvKy4wOTcxMDQ1KmkrLjcxNDE3MzMqYSkvYjcpKSxuZXcgdjcoMTE2KnItMTYsNTAwKihlLXIpLDIwMCooci1uKSx0Lm9wYWNpdHkpfWZ1bmN0aW9uIHY3KHQsZSxuLG8pe3RoaXMubD0rdCx0aGlzLmE9K2UsdGhpcy5iPStuLHRoaXMub3BhY2l0eT0rb31mdW5jdGlvbiB4Nyh0KXtyZXR1cm4gdD4uMDA4ODU2NDUxNjc5MDM1NjMxP01hdGgucG93KHQsMS8zKTp0L0M3K3k3fWZ1bmN0aW9uIE83KHQpe3JldHVybiB0Pl83P3QqdCp0OkM3Kih0LXk3KX1mdW5jdGlvbiBQNyh0KXtyZXR1cm4gMjU1Kih0PD0uMDAzMTMwOD8xMi45Mip0OjEuMDU1Kk1hdGgucG93KHQsMS8yLjQpLS4wNTUpfWZ1bmN0aW9uIHc3KHQpe3JldHVybih0Lz0yNTUpPD0uMDQwNDU/dC8xMi45MjpNYXRoLnBvdygodCsuMDU1KS8xLjA1NSwyLjQpfWZ1bmN0aW9uIGs3KHQpe2lmKHQgaW5zdGFuY2VvZiBENylyZXR1cm4gbmV3IEQ3KHQuaCx0LmMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIHY3fHwodD1NNyh0KSksMD09PXQuYSYmMD09PXQuYilyZXR1cm4gbmV3IEQ3KE5hTiwwPHQubCYmdC5sPDEwMD8wOk5hTix0LmwsdC5vcGFjaXR5KTt2YXIgZT1NYXRoLmF0YW4yKHQuYix0LmEpKmc3O3JldHVybiBuZXcgRDcoZTwwP2UrMzYwOmUsTWF0aC5zcXJ0KHQuYSp0LmErdC5iKnQuYiksdC5sLHQub3BhY2l0eSl9ZnVuY3Rpb24gUzcodCxlLG4sbyl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2s3KHQpOm5ldyBENyh0LGUsbixudWxsPT1vPzE6byl9ZnVuY3Rpb24gRDcodCxlLG4sbyl7dGhpcy5oPSt0LHRoaXMuYz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStvfWZ1bmN0aW9uIEU3KHQpe2lmKGlzTmFOKHQuaCkpcmV0dXJuIG5ldyB2Nyh0LmwsMCwwLHQub3BhY2l0eSk7dmFyIGU9dC5oKmY3O3JldHVybiBuZXcgdjcodC5sLE1hdGguY29zKGUpKnQuYyxNYXRoLnNpbihlKSp0LmMsdC5vcGFjaXR5KX1mdW5jdGlvbiBSNyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gQTcodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQrbiplfX1mdW5jdGlvbiBUNyh0LGUpe3ZhciBuPWUtdDtyZXR1cm4gbj9BNyh0LG4+MTgwfHxuPC0xODA/bi0zNjAqTWF0aC5yb3VuZChuLzM2MCk6bik6UjcoaXNOYU4odCk/ZTp0KX1mdW5jdGlvbiBONyh0LGUpe3ZhciBuPWUtdDtyZXR1cm4gbj9BNyh0LG4pOlI3KGlzTmFOKHQpP2U6dCl9aTYodjcsKGZ1bmN0aW9uIHo3KHQsZSxuLG8pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9NNyh0KTpuZXcgdjcodCxlLG4sbnVsbD09bz8xOm8pfSksYTYocjYse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgdjcodGhpcy5sKzE4KihudWxsPT10PzE6dCksdGhpcy5hLHRoaXMuYix0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB2Nyh0aGlzLmwtMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PSh0aGlzLmwrMTYpLzExNixlPWlzTmFOKHRoaXMuYSk/dDp0K3RoaXMuYS81MDAsbj1pc05hTih0aGlzLmIpP3Q6dC10aGlzLmIvMjAwO3JldHVybiBuZXcgaTcoUDcoMy4xMzM4NTYxKihlPWg3Kk83KGUpKS0xLjYxNjg2NjcqKHQ9MSpPNyh0KSktLjQ5MDYxNDYqKG49YjcqTzcobikpKSxQNygtLjk3ODc2ODQqZSsxLjkxNjE0MTUqdCsuMDMzNDU0Km4pLFA3KC4wNzE5NDUzKmUtLjIyODk5MTQqdCsxLjQwNTI0MjcqbiksdGhpcy5vcGFjaXR5KX19KSksaTYoRDcsUzcsYTYocjYse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRDcodGhpcy5oLHRoaXMuYyx0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBENyh0aGlzLmgsdGhpcy5jLHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiBFNyh0aGlzKS5yZ2IoKX19KSk7dmFyIEk3PShmdW5jdGlvbiB0KGUpe3ZhciBuPShmdW5jdGlvbiBvKHQpe3JldHVybiAxPT0odD0rdCk/Tjc6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gbi1lPyhmdW5jdGlvbiBvKHQsZSxuKXtyZXR1cm4gdD1NYXRoLnBvdyh0LG4pLGU9TWF0aC5wb3coZSxuKS10LG49MS9uLGZ1bmN0aW9uKG8pe3JldHVybiBNYXRoLnBvdyh0K28qZSxuKX19KShlLG4sdCk6UjcoaXNOYU4oZSk/bjplKX19KShlKTtmdW5jdGlvbiBpKHQsZSl7dmFyIG89bigodD1vNyh0KSkuciwoZT1vNyhlKSkuciksaT1uKHQuZyxlLmcpLGE9bih0LmIsZS5iKSxyPU43KHQub3BhY2l0eSxlLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5yPW8oZSksdC5nPWkoZSksdC5iPWEoZSksdC5vcGFjaXR5PXIoZSksdCsiIn19cmV0dXJuIGkuZ2FtbWE9dCxpfSkoMSksSDc9KGZ1bmN0aW9uIEw3KHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbixvLGk9ZS5sZW5ndGgsYT1uZXcgQXJyYXkoaSkscj1uZXcgQXJyYXkoaSkscz1uZXcgQXJyYXkoaSk7Zm9yKG49MDtuPGk7KytuKW89bzcoZVtuXSksYVtuXT1vLnJ8fDAscltuXT1vLmd8fDAsc1tuXT1vLmJ8fDA7cmV0dXJuIGE9dChhKSxyPXQocikscz10KHMpLG8ub3BhY2l0eT0xLGZ1bmN0aW9uKHQpe3JldHVybiBvLnI9YSh0KSxvLmc9cih0KSxvLmI9cyh0KSxvKyIifX19KSgoZnVuY3Rpb24gRjcodCl7dmFyIGU9dC5sZW5ndGgtMTtyZXR1cm4gZnVuY3Rpb24obil7dmFyIG89bjw9MD9uPTA6bj49MT8obj0xLGUtMSk6TWF0aC5mbG9vcihuKmUpLGk9dFtvXSxhPXRbbysxXTtyZXR1cm4oZnVuY3Rpb24gcih0LGUsbixvLGkpe3ZhciBhPXQqdCxyPWEqdDtyZXR1cm4oKDEtMyp0KzMqYS1yKSplKyg0LTYqYSszKnIpKm4rKDErMyp0KzMqYS0zKnIpKm8rcippKS82fSkoKG4tby9lKSplLG8+MD90W28tMV06MippLWEsaSxhLG88ZS0xP3RbbysyXToyKmEtaSl9fSkpO2Z1bmN0aW9uIEI3KHQsZSl7ZXx8KGU9W10pO3ZhciBuLG89dD9NYXRoLm1pbihlLmxlbmd0aCx0Lmxlbmd0aCk6MCxpPWUuc2xpY2UoKTtyZXR1cm4gZnVuY3Rpb24oYSl7Zm9yKG49MDtuPG87KytuKWlbbl09dFtuXSooMS1hKStlW25dKmE7cmV0dXJuIGl9fWZ1bmN0aW9uIFY3KHQsZSl7dmFyIG4sbz1lP2UubGVuZ3RoOjAsaT10P01hdGgubWluKG8sdC5sZW5ndGgpOjAsYT1uZXcgQXJyYXkoaSkscj1uZXcgQXJyYXkobyk7Zm9yKG49MDtuPGk7KytuKWFbbl09WjcodFtuXSxlW25dKTtmb3IoO248bzsrK24pcltuXT1lW25dO3JldHVybiBmdW5jdGlvbih0KXtmb3Iobj0wO248aTsrK24pcltuXT1hW25dKHQpO3JldHVybiByfX1mdW5jdGlvbiBqNyh0LGUpe3ZhciBuPW5ldyBEYXRlO3JldHVybiB0PSt0LGU9K2UsZnVuY3Rpb24obyl7cmV0dXJuIG4uc2V0VGltZSh0KigxLW8pK2Uqbyksbn19ZnVuY3Rpb24gVTcodCxlKXtyZXR1cm4gdD0rdCxlPStlLGZ1bmN0aW9uKG4pe3JldHVybiB0KigxLW4pK2Uqbn19ZnVuY3Rpb24gRzcodCxlKXt2YXIgbixvPXt9LGk9e307Zm9yKG4gaW4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdHx8KHQ9e30pLG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV8fChlPXt9KSxlKW4gaW4gdD9vW25dPVo3KHRbbl0sZVtuXSk6aVtuXT1lW25dO3JldHVybiBmdW5jdGlvbih0KXtmb3IobiBpbiBvKWlbbl09b1tuXSh0KTtyZXR1cm4gaX19dmFyIFc3PS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxZNz1uZXcgUmVnRXhwKFc3LnNvdXJjZSwiZyIpO2Z1bmN0aW9uIHE3KHQsZSl7dmFyIG4sbyxpLGE9VzcubGFzdEluZGV4PVk3Lmxhc3RJbmRleD0wLHI9LTEscz1bXSxsPVtdO2Zvcih0Kz0iIixlKz0iIjsobj1XNy5leGVjKHQpKSYmKG89WTcuZXhlYyhlKSk7KShpPW8uaW5kZXgpPmEmJihpPWUuc2xpY2UoYSxpKSxzW3JdP3Nbcl0rPWk6c1srK3JdPWkpLChuPW5bMF0pPT09KG89b1swXSk/c1tyXT9zW3JdKz1vOnNbKytyXT1vOihzWysrcl09bnVsbCxsLnB1c2goe2k6cix4OlU3KG4sbyl9KSksYT1ZNy5sYXN0SW5kZXg7cmV0dXJuIGE8ZS5sZW5ndGgmJihpPWUuc2xpY2UoYSksc1tyXT9zW3JdKz1pOnNbKytyXT1pKSxzLmxlbmd0aDwyP2xbMF0/KGZ1bmN0aW9uIGModCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpKyIifX0pKGxbMF0ueCk6KGZ1bmN0aW9uIGQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSkoZSk6KGU9bC5sZW5ndGgsZnVuY3Rpb24odCl7Zm9yKHZhciBuLG89MDtvPGU7KytvKXNbKG49bFtvXSkuaV09bi54KHQpO3JldHVybiBzLmpvaW4oIiIpfSl9ZnVuY3Rpb24gWjcodCxlKXt2YXIgbixvPXR5cGVvZiBlO3JldHVybiBudWxsPT1lfHwiYm9vbGVhbiI9PT1vP1I3KGUpOigibnVtYmVyIj09PW8/VTc6InN0cmluZyI9PT1vPyhuPSQ2KGUpKT8oZT1uLEk3KTpxNzplIGluc3RhbmNlb2YgJDY/STc6ZSBpbnN0YW5jZW9mIERhdGU/ajc6KGZ1bmN0aW9uIGkodCl7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyh0KSYmISh0IGluc3RhbmNlb2YgRGF0YVZpZXcpfSkoZSk/Qjc6QXJyYXkuaXNBcnJheShlKT9WNzoiZnVuY3Rpb24iIT10eXBlb2YgZS52YWx1ZU9mJiYiZnVuY3Rpb24iIT10eXBlb2YgZS50b1N0cmluZ3x8aXNOYU4oZSk/Rzc6VTcpKHQsZSl9ZnVuY3Rpb24gWDcodCxlKXtyZXR1cm4gdD0rdCxlPStlLGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnJvdW5kKHQqKDEtbikrZSpuKX19dmFyIEs3LEo3LFE3LCQ3LHQ4PTE4MC9NYXRoLlBJLGU4PXt0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTowLHJvdGF0ZTowLHNrZXdYOjAsc2NhbGVYOjEsc2NhbGVZOjF9O2Z1bmN0aW9uIG44KHQsZSxuLG8saSxhKXt2YXIgcixzLGw7cmV0dXJuKHI9TWF0aC5zcXJ0KHQqdCtlKmUpKSYmKHQvPXIsZS89ciksKGw9dCpuK2UqbykmJihuLT10Kmwsby09ZSpsKSwocz1NYXRoLnNxcnQobipuK28qbykpJiYobi89cyxvLz1zLGwvPXMpLHQqbzxlKm4mJih0PS10LGU9LWUsbD0tbCxyPS1yKSx7dHJhbnNsYXRlWDppLHRyYW5zbGF0ZVk6YSxyb3RhdGU6TWF0aC5hdGFuMihlLHQpKnQ4LHNrZXdYOk1hdGguYXRhbihsKSp0OCxzY2FsZVg6cixzY2FsZVk6c319ZnVuY3Rpb24gbzgodCxlLG4sbyl7ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdC5sZW5ndGg/dC5wb3AoKSsiICI6IiJ9cmV0dXJuIGZ1bmN0aW9uKGEscil7dmFyIHM9W10sbD1bXTtyZXR1cm4gYT10KGEpLHI9dChyKSwoZnVuY3Rpb24gYyh0LG8saSxhLHIscyl7aWYodCE9PWl8fG8hPT1hKXt2YXIgbD1yLnB1c2goInRyYW5zbGF0ZSgiLG51bGwsZSxudWxsLG4pO3MucHVzaCh7aTpsLTQseDpVNyh0LGkpfSx7aTpsLTIseDpVNyhvLGEpfSl9ZWxzZShpfHxhKSYmci5wdXNoKCJ0cmFuc2xhdGUoIitpK2UrYStuKX0pKGEudHJhbnNsYXRlWCxhLnRyYW5zbGF0ZVksci50cmFuc2xhdGVYLHIudHJhbnNsYXRlWSxzLGwpLChmdW5jdGlvbiBkKHQsZSxuLGEpe3QhPT1lPyh0LWU+MTgwP2UrPTM2MDplLXQ+MTgwJiYodCs9MzYwKSxhLnB1c2goe2k6bi5wdXNoKGkobikrInJvdGF0ZSgiLG51bGwsbyktMix4OlU3KHQsZSl9KSk6ZSYmbi5wdXNoKGkobikrInJvdGF0ZSgiK2Urbyl9KShhLnJvdGF0ZSxyLnJvdGF0ZSxzLGwpLChmdW5jdGlvbiBwKHQsZSxuLGEpe3QhPT1lP2EucHVzaCh7aTpuLnB1c2goaShuKSsic2tld1goIixudWxsLG8pLTIseDpVNyh0LGUpfSk6ZSYmbi5wdXNoKGkobikrInNrZXdYKCIrZStvKX0pKGEuc2tld1gsci5za2V3WCxzLGwpLChmdW5jdGlvbiBtKHQsZSxuLG8sYSxyKXtpZih0IT09bnx8ZSE9PW8pe3ZhciBzPWEucHVzaChpKGEpKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKTtyLnB1c2goe2k6cy00LHg6VTcodCxuKX0se2k6cy0yLHg6VTcoZSxvKX0pfWVsc2UgMT09PW4mJjE9PT1vfHxhLnB1c2goaShhKSsic2NhbGUoIituKyIsIitvKyIpIil9KShhLnNjYWxlWCxhLnNjYWxlWSxyLnNjYWxlWCxyLnNjYWxlWSxzLGwpLGE9cj1udWxsLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPS0xLG89bC5sZW5ndGg7KytuPG87KXNbKGU9bFtuXSkuaV09ZS54KHQpO3JldHVybiBzLmpvaW4oIiIpfX19dmFyIGk4LGE4LHI4PW84KChmdW5jdGlvbiBzOCh0KXtyZXR1cm4ibm9uZSI9PT10P2U4OihLN3x8KEs3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLEo3PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxRNz1kb2N1bWVudC5kZWZhdWx0VmlldyksSzcuc3R5bGUudHJhbnNmb3JtPXQsdD1RNy5nZXRDb21wdXRlZFN0eWxlKEo3LmFwcGVuZENoaWxkKEs3KSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKSxKNy5yZW1vdmVDaGlsZChLNyksbjgoKyh0PXQuc2xpY2UoNywtMSkuc3BsaXQoIiwiKSlbMF0sK3RbMV0sK3RbMl0sK3RbM10sK3RbNF0sK3RbNV0pKX0pLCJweCwgIiwicHgpIiwiZGVnKSIpLGw4PW84KChmdW5jdGlvbiBjOCh0KXtyZXR1cm4gbnVsbD09dD9lODooJDd8fCgkNz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwiZyIpKSwkNy5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsdCksKHQ9JDcudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKSk/bjgoKHQ9dC5tYXRyaXgpLmEsdC5iLHQuYyx0LmQsdC5lLHQuZik6ZTgpfSksIiwgIiwiKSIsIikiKSxkOD0oZnVuY3Rpb24gcDgodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIG89dCgoZT1kNyhlKSkuaCwobj1kNyhuKSkuaCksaT1ONyhlLnMsbi5zKSxhPU43KGUubCxuLmwpLHI9TjcoZS5vcGFjaXR5LG4ub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmg9byh0KSxlLnM9aSh0KSxlLmw9YSh0KSxlLm9wYWNpdHk9cih0KSxlKyIifX19KShUNyksbTg9KGZ1bmN0aW9uIHU4KHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciBvPXQoKGU9UzcoZSkpLmgsKG49UzcobikpLmgpLGk9TjcoZS5jLG4uYyksYT1ONyhlLmwsbi5sKSxyPU43KGUub3BhY2l0eSxuLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5oPW8odCksZS5jPWkodCksZS5sPWEodCksZS5vcGFjaXR5PXIodCksZSsiIn19fSkoVDcpLGY4PTAsZzg9MCxoOD0wLGI4PTAseTg9MCxfOD0wLEM4PSJvYmplY3QiPT10eXBlb2YgcGVyZm9ybWFuY2UmJnBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZTpEYXRlLE04PSJvYmplY3QiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lP3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpOmZ1bmN0aW9uKHQpe3NldFRpbWVvdXQodCwxNyl9O2Z1bmN0aW9uIHY4KCl7cmV0dXJuIHk4fHwoTTgoeDgpLHk4PUM4Lm5vdygpK184KX1mdW5jdGlvbiB4OCgpe3k4PTB9ZnVuY3Rpb24gTzgoKXt0aGlzLl9jYWxsPXRoaXMuX3RpbWU9dGhpcy5fbmV4dD1udWxsfWZ1bmN0aW9uIFA4KHQsZSxuKXt2YXIgbz1uZXcgTzg7cmV0dXJuIG8ucmVzdGFydCh0LGUsbiksb31mdW5jdGlvbiB3OCgpe3k4PShiOD1DOC5ub3coKSkrXzgsZjg9Zzg9MDt0cnl7IShmdW5jdGlvbiB0KCl7djgoKSwrK2Y4O2Zvcih2YXIgdCxlPWk4O2U7KSh0PXk4LWUuX3RpbWUpPj0wJiZlLl9jYWxsLmNhbGwobnVsbCx0KSxlPWUuX25leHQ7LS1mOH0pKCl9ZmluYWxseXtmOD0wLChmdW5jdGlvbiBlKCl7Zm9yKHZhciB0LGUsbj1pOCxvPTEvMDtuOyluLl9jYWxsPyhvPm4uX3RpbWUmJihvPW4uX3RpbWUpLHQ9bixuPW4uX25leHQpOihlPW4uX25leHQsbi5fbmV4dD1udWxsLG49dD90Ll9uZXh0PWU6aTg9ZSk7YTg9dCxTOChvKX0pKCkseTg9MH19ZnVuY3Rpb24gazgoKXt2YXIgdD1DOC5ub3coKSxlPXQtYjg7ZT4xZTMmJihfOC09ZSxiOD10KX1mdW5jdGlvbiBTOCh0KXtmOHx8KGc4JiYoZzg9Y2xlYXJUaW1lb3V0KGc4KSksdC15OD4yND8odDwxLzAmJihnOD1zZXRUaW1lb3V0KHc4LHQtQzgubm93KCktXzgpKSxoOCYmKGg4PWNsZWFySW50ZXJ2YWwoaDgpKSk6KGg4fHwoYjg9Qzgubm93KCksaDg9c2V0SW50ZXJ2YWwoazgsMWUzKSksZjg9MSxNOCh3OCkpKX1mdW5jdGlvbiBEOCh0LGUsbil7dmFyIG89bmV3IE84O3JldHVybiBvLnJlc3RhcnQoKGZ1bmN0aW9uKG4pe28uc3RvcCgpLHQobitlKX0pLGU9bnVsbD09ZT8wOitlLG4pLG99TzgucHJvdG90eXBlPVA4LnByb3RvdHlwZT17Y29uc3RydWN0b3I6TzgscmVzdGFydDpmdW5jdGlvbih0LGUsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24iKTtuPShudWxsPT1uP3Y4KCk6K24pKyhudWxsPT1lPzA6K2UpLHRoaXMuX25leHR8fGE4PT09dGhpc3x8KGE4P2E4Ll9uZXh0PXRoaXM6aTg9dGhpcyxhOD10aGlzKSx0aGlzLl9jYWxsPXQsdGhpcy5fdGltZT1uLFM4KCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9jYWxsJiYodGhpcy5fY2FsbD1udWxsLHRoaXMuX3RpbWU9MS8wLFM4KCkpfX07dmFyIEU4PUg1KCJzdGFydCIsImVuZCIsImNhbmNlbCIsImludGVycnVwdCIpLFI4PVtdO2Z1bmN0aW9uIEE4KHQsZSxuLG8saSxhKXt2YXIgcj10Ll9fdHJhbnNpdGlvbjtpZihyKXtpZihuIGluIHIpcmV0dXJufWVsc2UgdC5fX3RyYW5zaXRpb249e307IShmdW5jdGlvbiBzKHQsZSxuKXt2YXIgbyxpPXQuX190cmFuc2l0aW9uO2Z1bmN0aW9uIGEobCl7dmFyIGMsZCxwLG07aWYoMSE9PW4uc3RhdGUpcmV0dXJuIHMoKTtmb3IoYyBpbiBpKWlmKChtPWlbY10pLm5hbWU9PT1uLm5hbWUpe2lmKDM9PT1tLnN0YXRlKXJldHVybiBEOChhKTs0PT09bS5zdGF0ZT8obS5zdGF0ZT02LG0udGltZXIuc3RvcCgpLG0ub24uY2FsbCgiaW50ZXJydXB0Iix0LHQuX19kYXRhX18sbS5pbmRleCxtLmdyb3VwKSxkZWxldGUgaVtjXSk6K2M8ZSYmKG0uc3RhdGU9NixtLnRpbWVyLnN0b3AoKSxtLm9uLmNhbGwoImNhbmNlbCIsdCx0Ll9fZGF0YV9fLG0uaW5kZXgsbS5ncm91cCksZGVsZXRlIGlbY10pfWlmKEQ4KChmdW5jdGlvbigpezM9PT1uLnN0YXRlJiYobi5zdGF0ZT00LG4udGltZXIucmVzdGFydChyLG4uZGVsYXksbi50aW1lKSxyKGwpKX0pKSxuLnN0YXRlPTIsbi5vbi5jYWxsKCJzdGFydCIsdCx0Ll9fZGF0YV9fLG4uaW5kZXgsbi5ncm91cCksMj09PW4uc3RhdGUpe2ZvcihuLnN0YXRlPTMsbz1uZXcgQXJyYXkocD1uLnR3ZWVuLmxlbmd0aCksYz0wLGQ9LTE7YzxwOysrYykobT1uLnR3ZWVuW2NdLnZhbHVlLmNhbGwodCx0Ll9fZGF0YV9fLG4uaW5kZXgsbi5ncm91cCkpJiYob1srK2RdPW0pO28ubGVuZ3RoPWQrMX19ZnVuY3Rpb24gcihlKXtmb3IodmFyIGk9ZTxuLmR1cmF0aW9uP24uZWFzZS5jYWxsKG51bGwsZS9uLmR1cmF0aW9uKToobi50aW1lci5yZXN0YXJ0KHMpLG4uc3RhdGU9NSwxKSxhPS0xLHI9by5sZW5ndGg7KythPHI7KW9bYV0uY2FsbCh0LGkpOzU9PT1uLnN0YXRlJiYobi5vbi5jYWxsKCJlbmQiLHQsdC5fX2RhdGFfXyxuLmluZGV4LG4uZ3JvdXApLHMoKSl9ZnVuY3Rpb24gcygpe2Zvcih2YXIgbyBpbiBuLnN0YXRlPTYsbi50aW1lci5zdG9wKCksZGVsZXRlIGlbZV0saSlyZXR1cm47ZGVsZXRlIHQuX190cmFuc2l0aW9ufWlbZV09bixuLnRpbWVyPVA4KChmdW5jdGlvbiBsKHQpe24uc3RhdGU9MSxuLnRpbWVyLnJlc3RhcnQoYSxuLmRlbGF5LG4udGltZSksbi5kZWxheTw9dCYmYSh0LW4uZGVsYXkpfSksMCxuLnRpbWUpfSkodCxuLHtuYW1lOmUsaW5kZXg6byxncm91cDppLG9uOkU4LHR3ZWVuOlI4LHRpbWU6YS50aW1lLGRlbGF5OmEuZGVsYXksZHVyYXRpb246YS5kdXJhdGlvbixlYXNlOmEuZWFzZSx0aW1lcjpudWxsLHN0YXRlOjB9KX1mdW5jdGlvbiBUOCh0LGUpe3ZhciBuPXo4KHQsZSk7aWYobi5zdGF0ZT4wKXRocm93IG5ldyBFcnJvcigidG9vIGxhdGU7IGFscmVhZHkgc2NoZWR1bGVkIik7cmV0dXJuIG59ZnVuY3Rpb24gTjgodCxlKXt2YXIgbj16OCh0LGUpO2lmKG4uc3RhdGU+Myl0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHJ1bm5pbmciKTtyZXR1cm4gbn1mdW5jdGlvbiB6OCh0LGUpe3ZhciBuPXQuX190cmFuc2l0aW9uO2lmKCFufHwhKG49bltlXSkpdGhyb3cgbmV3IEVycm9yKCJ0cmFuc2l0aW9uIG5vdCBmb3VuZCIpO3JldHVybiBufWZ1bmN0aW9uIEk4KHQsZSl7dmFyIG4sbyxpLGE9dC5fX3RyYW5zaXRpb24scj0hMDtpZihhKXtmb3IoaSBpbiBlPW51bGw9PWU/bnVsbDplKyIiLGEpKG49YVtpXSkubmFtZT09PWU/KG89bi5zdGF0ZT4yJiZuLnN0YXRlPDUsbi5zdGF0ZT02LG4udGltZXIuc3RvcCgpLG4ub24uY2FsbChvPyJpbnRlcnJ1cHQiOiJjYW5jZWwiLHQsdC5fX2RhdGFfXyxuLmluZGV4LG4uZ3JvdXApLGRlbGV0ZSBhW2ldKTpyPSExO3ImJmRlbGV0ZSB0Ll9fdHJhbnNpdGlvbn19ZnVuY3Rpb24gSDgodCxlKXt2YXIgbixvO3JldHVybiBmdW5jdGlvbigpe3ZhciBpPU44KHRoaXMsdCksYT1pLnR3ZWVuO2lmKGEhPT1uKWZvcih2YXIgcj0wLHM9KG89bj1hKS5sZW5ndGg7cjxzOysrcilpZihvW3JdLm5hbWU9PT1lKXsobz1vLnNsaWNlKCkpLnNwbGljZShyLDEpO2JyZWFrfWkudHdlZW49b319ZnVuY3Rpb24gRjgodCxlLG4pe3ZhciBvLGk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPU44KHRoaXMsdCkscj1hLnR3ZWVuO2lmKHIhPT1vKXtpPShvPXIpLnNsaWNlKCk7Zm9yKHZhciBzPXtuYW1lOmUsdmFsdWU6bn0sbD0wLGM9aS5sZW5ndGg7bDxjOysrbClpZihpW2xdLm5hbWU9PT1lKXtpW2xdPXM7YnJlYWt9bD09PWMmJmkucHVzaChzKX1hLnR3ZWVuPWl9fWZ1bmN0aW9uIEw4KHQsZSxuKXt2YXIgbz10Ll9pZDtyZXR1cm4gdC5lYWNoKChmdW5jdGlvbigpe3ZhciB0PU44KHRoaXMsbyk7KHQudmFsdWV8fCh0LnZhbHVlPXt9KSlbZV09bi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSksZnVuY3Rpb24odCl7cmV0dXJuIHo4KHQsbykudmFsdWVbZV19fWZ1bmN0aW9uIEI4KHQsZSl7dmFyIG47cmV0dXJuKCJudW1iZXIiPT10eXBlb2YgZT9VNzplIGluc3RhbmNlb2YgJDY/STc6KG49JDYoZSkpPyhlPW4sSTcpOnE3KSh0LGUpfWZ1bmN0aW9uIFY4KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX1mdW5jdGlvbiBqOCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIFU4KHQsZSxuKXt2YXIgbyxpLGE9bisiIjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj10aGlzLmdldEF0dHJpYnV0ZSh0KTtyZXR1cm4gcj09PWE/bnVsbDpyPT09bz9pOmk9ZShvPXIsbil9fWZ1bmN0aW9uIEc4KHQsZSxuKXt2YXIgbyxpLGE9bisiIjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk7cmV0dXJuIHI9PT1hP251bGw6cj09PW8/aTppPWUobz1yLG4pfX1mdW5jdGlvbiBXOCh0LGUsbil7dmFyIG8saSxhO3JldHVybiBmdW5jdGlvbigpe3ZhciByLHMsbD1uKHRoaXMpO2lmKG51bGwhPWwpcmV0dXJuKHI9dGhpcy5nZXRBdHRyaWJ1dGUodCkpPT09KHM9bCsiIik/bnVsbDpyPT09byYmcz09PWk/YTooaT1zLGE9ZShvPXIsbCkpO3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX1mdW5jdGlvbiBZOCh0LGUsbil7dmFyIG8saSxhO3JldHVybiBmdW5jdGlvbigpe3ZhciByLHMsbD1uKHRoaXMpO2lmKG51bGwhPWwpcmV0dXJuKHI9dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpKT09PShzPWwrIiIpP251bGw6cj09PW8mJnM9PT1pP2E6KGk9cyxhPWUobz1yLGwpKTt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIHE4KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlKHQsZS5jYWxsKHRoaXMsbikpfX1mdW5jdGlvbiBaOCh0LGUpe3JldHVybiBmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxlLmNhbGwodGhpcyxuKSl9fWZ1bmN0aW9uIFg4KHQsZSl7dmFyIG4sbztmdW5jdGlvbiBpKCl7dmFyIGk9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGkhPT1vJiYobj0obz1pKSYmWjgodCxpKSksbn1yZXR1cm4gaS5fdmFsdWU9ZSxpfWZ1bmN0aW9uIEs4KHQsZSl7dmFyIG4sbztmdW5jdGlvbiBpKCl7dmFyIGk9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGkhPT1vJiYobj0obz1pKSYmcTgodCxpKSksbn1yZXR1cm4gaS5fdmFsdWU9ZSxpfWZ1bmN0aW9uIEo4KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7VDgodGhpcyx0KS5kZWxheT0rZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIFE4KHQsZSl7cmV0dXJuIGU9K2UsZnVuY3Rpb24oKXtUOCh0aGlzLHQpLmRlbGF5PWV9fWZ1bmN0aW9uICQ4KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7TjgodGhpcyx0KS5kdXJhdGlvbj0rZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIHQ5KHQsZSl7cmV0dXJuIGU9K2UsZnVuY3Rpb24oKXtOOCh0aGlzLHQpLmR1cmF0aW9uPWV9fWZ1bmN0aW9uIGU5KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO3JldHVybiBmdW5jdGlvbigpe044KHRoaXMsdCkuZWFzZT1lfX1mdW5jdGlvbiBuOSh0LGUsbil7dmFyIG8saSxhPShmdW5jdGlvbiByKHQpe3JldHVybih0KyIiKS50cmltKCkuc3BsaXQoL158XHMrLykuZXZlcnkoKGZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5kZXhPZigiLiIpO3JldHVybiBlPj0wJiYodD10LnNsaWNlKDAsZSkpLCF0fHwic3RhcnQiPT09dH0pKX0pKGUpP1Q4Ok44O3JldHVybiBmdW5jdGlvbigpe3ZhciByPWEodGhpcyx0KSxzPXIub247cyE9PW8mJihpPShvPXMpLmNvcHkoKSkub24oZSxuKSxyLm9uPWl9fXZhciBvOT1LNC5wcm90b3R5cGUuY29uc3RydWN0b3I7ZnVuY3Rpb24gaTkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KX19ZnVuY3Rpb24gYTkodCxlLG4pe3JldHVybiBmdW5jdGlvbihvKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsZS5jYWxsKHRoaXMsbyksbil9fWZ1bmN0aW9uIHI5KHQsZSxuKXt2YXIgbyxpO2Z1bmN0aW9uIGEoKXt2YXIgYT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gYSE9PWkmJihvPShpPWEpJiZhOSh0LGEsbikpLG99cmV0dXJuIGEuX3ZhbHVlPWUsYX1mdW5jdGlvbiBzOSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dGhpcy50ZXh0Q29udGVudD10LmNhbGwodGhpcyxlKX19ZnVuY3Rpb24gbDkodCl7dmFyIGUsbjtmdW5jdGlvbiBvKCl7dmFyIG89dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG8hPT1uJiYoZT0obj1vKSYmczkobykpLGV9cmV0dXJuIG8uX3ZhbHVlPXQsb312YXIgYzk9MDtmdW5jdGlvbiBkOSh0LGUsbixvKXt0aGlzLl9ncm91cHM9dCx0aGlzLl9wYXJlbnRzPWUsdGhpcy5fbmFtZT1uLHRoaXMuX2lkPW99ZnVuY3Rpb24gcDkoKXtyZXR1cm4rK2M5fXZhciBtOT1LNC5wcm90b3R5cGU7ZDkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpkOSxzZWxlY3Q6ZnVuY3Rpb24gdTkodCl7dmFyIGU9dGhpcy5fbmFtZSxuPXRoaXMuX2lkOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1YNSh0KSk7Zm9yKHZhciBvPXRoaXMuX2dyb3VwcyxpPW8ubGVuZ3RoLGE9bmV3IEFycmF5KGkpLHI9MDtyPGk7KytyKWZvcih2YXIgcyxsLGM9b1tyXSxkPWMubGVuZ3RoLHA9YVtyXT1uZXcgQXJyYXkoZCksbT0wO208ZDsrK20pKHM9Y1ttXSkmJihsPXQuY2FsbChzLHMuX19kYXRhX18sbSxjKSkmJigiX19kYXRhX18iaW4gcyYmKGwuX19kYXRhX189cy5fX2RhdGFfXykscFttXT1sLEE4KHBbbV0sZSxuLG0scCx6OChzLG4pKSk7cmV0dXJuIG5ldyBkOShhLHRoaXMuX3BhcmVudHMsZSxuKX0sc2VsZWN0QWxsOmZ1bmN0aW9uIGY5KHQpe3ZhciBlPXRoaXMuX25hbWUsbj10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9SjUodCkpO2Zvcih2YXIgbz10aGlzLl9ncm91cHMsaT1vLmxlbmd0aCxhPVtdLHI9W10scz0wO3M8aTsrK3MpZm9yKHZhciBsLGM9b1tzXSxkPWMubGVuZ3RoLHA9MDtwPGQ7KytwKWlmKGw9Y1twXSl7Zm9yKHZhciBtLHU9dC5jYWxsKGwsbC5fX2RhdGFfXyxwLGMpLGY9ejgobCxuKSxnPTAsaD11Lmxlbmd0aDtnPGg7KytnKShtPXVbZ10pJiZBOChtLGUsbixnLHUsZik7YS5wdXNoKHUpLHIucHVzaChsKX1yZXR1cm4gbmV3IGQ5KGEscixlLG4pfSxmaWx0ZXI6ZnVuY3Rpb24gZzkodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVE1KHQpKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49ZS5sZW5ndGgsbz1uZXcgQXJyYXkobiksaT0wO2k8bjsrK2kpZm9yKHZhciBhLHI9ZVtpXSxzPXIubGVuZ3RoLGw9b1tpXT1bXSxjPTA7YzxzOysrYykoYT1yW2NdKSYmdC5jYWxsKGEsYS5fX2RhdGFfXyxjLHIpJiZsLnB1c2goYSk7cmV0dXJuIG5ldyBkOShvLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LG1lcmdlOmZ1bmN0aW9uIGg5KHQpe2lmKHQuX2lkIT09dGhpcy5faWQpdGhyb3cgbmV3IEVycm9yO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj10Ll9ncm91cHMsbz1lLmxlbmd0aCxpPU1hdGgubWluKG8sbi5sZW5ndGgpLGE9bmV3IEFycmF5KG8pLHI9MDtyPGk7KytyKWZvcih2YXIgcyxsPWVbcl0sYz1uW3JdLGQ9bC5sZW5ndGgscD1hW3JdPW5ldyBBcnJheShkKSxtPTA7bTxkOysrbSkocz1sW21dfHxjW21dKSYmKHBbbV09cyk7Zm9yKDtyPG87KytyKWFbcl09ZVtyXTtyZXR1cm4gbmV3IGQ5KGEsdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sc2VsZWN0aW9uOmZ1bmN0aW9uIGI5KCl7cmV0dXJuIG5ldyBvOSh0aGlzLl9ncm91cHMsdGhpcy5fcGFyZW50cyl9LHRyYW5zaXRpb246ZnVuY3Rpb24geTkoKXtmb3IodmFyIHQ9dGhpcy5fbmFtZSxlPXRoaXMuX2lkLG49cDkoKSxvPXRoaXMuX2dyb3VwcyxpPW8ubGVuZ3RoLGE9MDthPGk7KythKWZvcih2YXIgcixzPW9bYV0sbD1zLmxlbmd0aCxjPTA7YzxsOysrYylpZihyPXNbY10pe3ZhciBkPXo4KHIsZSk7QTgocix0LG4sYyxzLHt0aW1lOmQudGltZStkLmRlbGF5K2QuZHVyYXRpb24sZGVsYXk6MCxkdXJhdGlvbjpkLmR1cmF0aW9uLGVhc2U6ZC5lYXNlfSl9cmV0dXJuIG5ldyBkOShvLHRoaXMuX3BhcmVudHMsdCxuKX0sY2FsbDptOS5jYWxsLG5vZGVzOm05Lm5vZGVzLG5vZGU6bTkubm9kZSxzaXplOm05LnNpemUsZW1wdHk6bTkuZW1wdHksZWFjaDptOS5lYWNoLG9uOmZ1bmN0aW9uIF85KHQsZSl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj96OCh0aGlzLm5vZGUoKSxuKS5vbi5vbih0KTp0aGlzLmVhY2gobjkobix0LGUpKX0sYXR0cjpmdW5jdGlvbiBDOSh0LGUpe3ZhciBuPUc1KHQpLG89InRyYW5zZm9ybSI9PT1uP2w4OkI4O3JldHVybiB0aGlzLmF0dHJUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBlPyhuLmxvY2FsP1k4Olc4KShuLG8sTDgodGhpcywiYXR0ci4iK3QsZSkpOm51bGw9PWU/KG4ubG9jYWw/ajg6VjgpKG4pOihuLmxvY2FsP0c4OlU4KShuLG8sZSkpfSxhdHRyVHdlZW46ZnVuY3Rpb24gTTkodCxlKXt2YXIgbj0iYXR0ci4iK3Q7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXJldHVybihuPXRoaXMudHdlZW4obikpJiZuLl92YWx1ZTtpZihudWxsPT1lKXJldHVybiB0aGlzLnR3ZWVuKG4sbnVsbCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO3ZhciBvPUc1KHQpO3JldHVybiB0aGlzLnR3ZWVuKG4sKG8ubG9jYWw/WDg6SzgpKG8sZSkpfSxzdHlsZTpmdW5jdGlvbiB2OSh0LGUsbil7dmFyIG89InRyYW5zZm9ybSI9PSh0Kz0iIik/cjg6Qjg7cmV0dXJuIG51bGw9PWU/dGhpcy5zdHlsZVR3ZWVuKHQsKGZ1bmN0aW9uIGkodCxlKXt2YXIgbixvLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9ZjQodGhpcyx0KSxyPSh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLGY0KHRoaXMsdCkpO3JldHVybiBhPT09cj9udWxsOmE9PT1uJiZyPT09bz9pOmk9ZShuPWEsbz1yKX19KSh0LG8pKS5vbigiZW5kLnN0eWxlLiIrdCxpOSh0KSk6ImZ1bmN0aW9uIj09dHlwZW9mIGU/dGhpcy5zdHlsZVR3ZWVuKHQsKGZ1bmN0aW9uIHIodCxlLG4pe3ZhciBvLGksYTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1mNCh0aGlzLHQpLHM9bih0aGlzKSxsPXMrIiI7cmV0dXJuIG51bGw9PXMmJih0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLGw9cz1mNCh0aGlzLHQpKSxyPT09bD9udWxsOnI9PT1vJiZsPT09aT9hOihpPWwsYT1lKG89cixzKSl9fSkodCxvLEw4KHRoaXMsInN0eWxlLiIrdCxlKSkpLmVhY2goKGZ1bmN0aW9uIGEodCxlKXt2YXIgbixvLGksYSxyPSJzdHlsZS4iK2Uscz0iZW5kLiIrcjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbD1OOCh0aGlzLHQpLGM9bC5vbixkPW51bGw9PWwudmFsdWVbcl0/YXx8KGE9aTkoZSkpOnZvaWQgMDtjPT09biYmaT09PWR8fChvPShuPWMpLmNvcHkoKSkub24ocyxpPWQpLGwub249b319KSh0aGlzLl9pZCx0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsKGZ1bmN0aW9uIHModCxlLG4pe3ZhciBvLGksYT1uKyIiO3JldHVybiBmdW5jdGlvbigpe3ZhciByPWY0KHRoaXMsdCk7cmV0dXJuIHI9PT1hP251bGw6cj09PW8/aTppPWUobz1yLG4pfX0pKHQsbyxlKSxuKS5vbigiZW5kLnN0eWxlLiIrdCxudWxsKX0sc3R5bGVUd2VlbjpmdW5jdGlvbiB4OSh0LGUsbil7dmFyIG89InN0eWxlLiIrKHQrPSIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKG89dGhpcy50d2VlbihvKSkmJm8uX3ZhbHVlO2lmKG51bGw9PWUpcmV0dXJuIHRoaXMudHdlZW4obyxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4obyxyOSh0LGUsbnVsbD09bj8iIjpuKSl9LHRleHQ6ZnVuY3Rpb24gTzkodCl7cmV0dXJuIHRoaXMudHdlZW4oInRleHQiLCJmdW5jdGlvbiI9PXR5cGVvZiB0PyhmdW5jdGlvbiBlKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQodGhpcyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT1lPyIiOmV9fSkoTDgodGhpcywidGV4dCIsdCkpOihmdW5jdGlvbiBuKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KShudWxsPT10PyIiOnQrIiIpKX0sdGV4dFR3ZWVuOmZ1bmN0aW9uIFA5KHQpe3ZhciBlPSJ0ZXh0IjtpZihhcmd1bWVudHMubGVuZ3RoPDEpcmV0dXJuKGU9dGhpcy50d2VlbihlKSkmJmUuX3ZhbHVlO2lmKG51bGw9PXQpcmV0dXJuIHRoaXMudHdlZW4oZSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4oZSxsOSh0KSl9LHJlbW92ZTpmdW5jdGlvbiB3OSgpe3JldHVybiB0aGlzLm9uKCJlbmQucmVtb3ZlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7Zm9yKHZhciBuIGluIHRoaXMuX190cmFuc2l0aW9uKWlmKCtuIT09ZSlyZXR1cm47dCYmdC5yZW1vdmVDaGlsZCh0aGlzKX19KSh0aGlzLl9pZCkpfSx0d2VlbjpmdW5jdGlvbiBrOSh0LGUpe3ZhciBuPXRoaXMuX2lkO2lmKHQrPSIiLGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciBvLGk9ejgodGhpcy5ub2RlKCksbikudHdlZW4sYT0wLHI9aS5sZW5ndGg7YTxyOysrYSlpZigobz1pW2FdKS5uYW1lPT09dClyZXR1cm4gby52YWx1ZTtyZXR1cm4gbnVsbH1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1lP0g4OkY4KShuLHQsZSkpfSxkZWxheTpmdW5jdGlvbiBTOSh0KXt2YXIgZT10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiB0P0o4OlE4KShlLHQpKTp6OCh0aGlzLm5vZGUoKSxlKS5kZWxheX0sZHVyYXRpb246ZnVuY3Rpb24gRDkodCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD8kODp0OSkoZSx0KSk6ejgodGhpcy5ub2RlKCksZSkuZHVyYXRpb259LGVhc2U6ZnVuY3Rpb24gRTkodCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKGU5KGUsdCkpOno4KHRoaXMubm9kZSgpLGUpLmVhc2V9LGVuZDpmdW5jdGlvbiBSOSgpe3ZhciB0LGUsbj10aGlzLG89bi5faWQsaT1uLnNpemUoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGEscil7dmFyIHM9e3ZhbHVlOnJ9LGw9e3ZhbHVlOmZ1bmN0aW9uKCl7MD09LS1pJiZhKCl9fTtuLmVhY2goKGZ1bmN0aW9uKCl7dmFyIG49TjgodGhpcyxvKSxpPW4ub247aSE9PXQmJigoZT0odD1pKS5jb3B5KCkpLl8uY2FuY2VsLnB1c2gocyksZS5fLmludGVycnVwdC5wdXNoKHMpLGUuXy5lbmQucHVzaChsKSksbi5vbj1lfSkpfSkpfX07dmFyIEE5PXt0aW1lOm51bGwsZGVsYXk6MCxkdXJhdGlvbjoyNTAsZWFzZTpmdW5jdGlvbiBUOSh0KXtyZXR1cm4oKHQqPTIpPD0xP3QqdCp0Oih0LT0yKSp0KnQrMikvMn19O2Z1bmN0aW9uIE45KHQsZSl7Zm9yKHZhciBuOyEobj10Ll9fdHJhbnNpdGlvbil8fCEobj1uW2VdKTspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuIEE5LnRpbWU9djgoKSxBOTtyZXR1cm4gbn1mdW5jdGlvbiB6OSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gSTkodCxlLG4pe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPWUsdGhpcy5zZWxlY3Rpb249bn1mdW5jdGlvbiBIOSgpe0w0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIEY5KCl7TDQucHJldmVudERlZmF1bHQoKSxMNC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1LNC5wcm90b3R5cGUuaW50ZXJydXB0PWZ1bmN0aW9uIEw5KHQpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7STgodGhpcyx0KX0pKX0sSzQucHJvdG90eXBlLnRyYW5zaXRpb249ZnVuY3Rpb24gQjkodCl7dmFyIGUsbjt0IGluc3RhbmNlb2YgZDk/KGU9dC5faWQsdD10Ll9uYW1lKTooZT1wOSgpLChuPUE5KS50aW1lPXY4KCksdD1udWxsPT10P251bGw6dCsiIik7Zm9yKHZhciBvPXRoaXMuX2dyb3VwcyxpPW8ubGVuZ3RoLGE9MDthPGk7KythKWZvcih2YXIgcixzPW9bYV0sbD1zLmxlbmd0aCxjPTA7YzxsOysrYykocj1zW2NdKSYmQTgocix0LGUsYyxzLG58fE45KHIsZSkpO3JldHVybiBuZXcgZDkobyx0aGlzLl9wYXJlbnRzLHQsZSl9O3ZhciBWOT17bmFtZToiZHJhZyJ9LGo5PXtuYW1lOiJzcGFjZSJ9LFU5PXtuYW1lOiJoYW5kbGUifSxHOT17bmFtZToiY2VudGVyIn07ZnVuY3Rpb24gVzkodCl7cmV0dXJuWyt0WzBdLCt0WzFdXX1mdW5jdGlvbiBZOSh0KXtyZXR1cm5bVzkodFswXSksVzkodFsxXSldfWZ1bmN0aW9uIHE5KHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4oZnVuY3Rpb24gbih0LGUsbyl7YXJndW1lbnRzLmxlbmd0aDwzJiYobz1lLGU9UTQoKS5jaGFuZ2VkVG91Y2hlcyk7Zm9yKHZhciBpLGE9MCxyPWU/ZS5sZW5ndGg6MDthPHI7KythKWlmKChpPWVbYV0pLmlkZW50aWZpZXI9PT1vKXJldHVybiAkNCh0LGkpO3JldHVybiBudWxsfSkoZSxMNC50b3VjaGVzLHQpfX12YXIgWjk9e25hbWU6IngiLGhhbmRsZXM6WyJ3IiwiZSJdLm1hcChldHQpLGlucHV0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/bnVsbDpbWyt0WzBdLGVbMF1bMV1dLFsrdFsxXSxlWzFdWzFdXV19LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmW3RbMF1bMF0sdFsxXVswXV19fSxYOT17bmFtZToieSIsaGFuZGxlczpbIm4iLCJzIl0ubWFwKGV0dCksaW5wdXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD9udWxsOltbZVswXVswXSwrdFswXV0sW2VbMV1bMF0sK3RbMV1dXX0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZbdFswXVsxXSx0WzFdWzFdXX19LEs5PXtvdmVybGF5OiJjcm9zc2hhaXIiLHNlbGVjdGlvbjoibW92ZSIsbjoibnMtcmVzaXplIixlOiJldy1yZXNpemUiLHM6Im5zLXJlc2l6ZSIsdzoiZXctcmVzaXplIixudzoibndzZS1yZXNpemUiLG5lOiJuZXN3LXJlc2l6ZSIsc2U6Im53c2UtcmVzaXplIixzdzoibmVzdy1yZXNpemUifSxKOT17ZToidyIsdzoiZSIsbnc6Im5lIixuZToibnciLHNlOiJzdyIsc3c6InNlIn0sUTk9e246InMiLHM6Im4iLG53OiJzdyIsbmU6InNlIixzZToibmUiLHN3OiJudyJ9LCQ5PXtvdmVybGF5OjEsc2VsZWN0aW9uOjEsbjpudWxsLGU6MSxzOm51bGwsdzotMSxudzotMSxuZToxLHNlOjEsc3c6LTF9LHR0dD17b3ZlcmxheToxLHNlbGVjdGlvbjoxLG46LTEsZTpudWxsLHM6MSx3Om51bGwsbnc6LTEsbmU6LTEsc2U6MSxzdzoxfTtmdW5jdGlvbiBldHQodCl7cmV0dXJue3R5cGU6dH19ZnVuY3Rpb24gbnR0KCl7cmV0dXJuIUw0LmN0cmxLZXkmJiFMNC5idXR0b259ZnVuY3Rpb24gb3R0KCl7dmFyIHQ9dGhpcy5vd25lclNWR0VsZW1lbnR8fHRoaXM7cmV0dXJuIHQuaGFzQXR0cmlidXRlKCJ2aWV3Qm94Iik/W1sodD10LnZpZXdCb3guYmFzZVZhbCkueCx0LnldLFt0LngrdC53aWR0aCx0LnkrdC5oZWlnaHRdXTpbWzAsMF0sW3Qud2lkdGguYmFzZVZhbC52YWx1ZSx0LmhlaWdodC5iYXNlVmFsLnZhbHVlXV19ZnVuY3Rpb24gaXR0KCl7cmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50c3x8Im9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIGF0dCh0KXtmb3IoOyF0Ll9fYnJ1c2g7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybjtyZXR1cm4gdC5fX2JydXNofWZ1bmN0aW9uIHJ0dCh0KXtyZXR1cm4gdFswXVswXT09PXRbMV1bMF18fHRbMF1bMV09PT10WzFdWzFdfXZhciBzdHQ9TWF0aC5QSSxsdHQ9MipzdHQsY3R0PTFlLTYsZHR0PWx0dC1jdHQ7ZnVuY3Rpb24gcHR0KCl7dGhpcy5feDA9dGhpcy5feTA9dGhpcy5feDE9dGhpcy5feTE9bnVsbCx0aGlzLl89IiJ9ZnVuY3Rpb24gbXR0KCl7cmV0dXJuIG5ldyBwdHR9cHR0LnByb3RvdHlwZT1tdHQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpwdHQsbW92ZVRvOmZ1bmN0aW9uKHQsZSl7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStlKX0sY2xvc2VQYXRoOmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuX3gxJiYodGhpcy5feDE9dGhpcy5feDAsdGhpcy5feTE9dGhpcy5feTAsdGhpcy5fKz0iWiIpfSxsaW5lVG86ZnVuY3Rpb24odCxlKXt0aGlzLl8rPSJMIisodGhpcy5feDE9K3QpKyIsIisodGhpcy5feTE9K2UpfSxxdWFkcmF0aWNDdXJ2ZVRvOmZ1bmN0aW9uKHQsZSxuLG8pe3RoaXMuXys9IlEiKyArdCsiLCIrICtlKyIsIisodGhpcy5feDE9K24pKyIsIisodGhpcy5feTE9K28pfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsZSxuLG8saSxhKXt0aGlzLl8rPSJDIisgK3QrIiwiKyArZSsiLCIrICtuKyIsIisgK28rIiwiKyh0aGlzLl94MT0raSkrIiwiKyh0aGlzLl95MT0rYSl9LGFyY1RvOmZ1bmN0aW9uKHQsZSxuLG8saSl7dmFyIGE9dGhpcy5feDEscj10aGlzLl95MSxzPShuPStuKS0odD0rdCksbD0obz0rbyktKGU9K2UpLGM9YS10LGQ9ci1lLHA9YypjK2QqZDtpZigoaT0raSk8MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIitpKTtpZihudWxsPT09dGhpcy5feDEpdGhpcy5fKz0iTSIrKHRoaXMuX3gxPXQpKyIsIisodGhpcy5feTE9ZSk7ZWxzZSBpZihwPmN0dClpZihNYXRoLmFicyhkKnMtbCpjKT5jdHQmJmkpe3ZhciBtPW4tYSx1PW8tcixmPXMqcytsKmwsZz1tKm0rdSp1LGg9TWF0aC5zcXJ0KGYpLGI9TWF0aC5zcXJ0KHApLHk9aSpNYXRoLnRhbigoc3R0LU1hdGguYWNvcygoZitwLWcpLygyKmgqYikpKS8yKSxfPXkvYixDPXkvaDtNYXRoLmFicyhfLTEpPmN0dCYmKHRoaXMuXys9IkwiKyh0K18qYykrIiwiKyhlK18qZCkpLHRoaXMuXys9IkEiK2krIiwiK2krIiwwLDAsIisgKyhkKm0+Yyp1KSsiLCIrKHRoaXMuX3gxPXQrQypzKSsiLCIrKHRoaXMuX3kxPWUrQypsKX1lbHNlIHRoaXMuXys9IkwiKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPWUpfSxhcmM6ZnVuY3Rpb24odCxlLG4sbyxpLGEpe3Q9K3QsZT0rZSxhPSEhYTt2YXIgcj0obj0rbikqTWF0aC5jb3Mobykscz1uKk1hdGguc2luKG8pLGw9dCtyLGM9ZStzLGQ9MV5hLHA9YT9vLWk6aS1vO2lmKG48MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIituKTtudWxsPT09dGhpcy5feDE/dGhpcy5fKz0iTSIrbCsiLCIrYzooTWF0aC5hYnModGhpcy5feDEtbCk+Y3R0fHxNYXRoLmFicyh0aGlzLl95MS1jKT5jdHQpJiYodGhpcy5fKz0iTCIrbCsiLCIrYyksbiYmKHA8MCYmKHA9cCVsdHQrbHR0KSxwPmR0dD90aGlzLl8rPSJBIituKyIsIituKyIsMCwxLCIrZCsiLCIrKHQtcikrIiwiKyhlLXMpKyJBIituKyIsIituKyIsMCwxLCIrZCsiLCIrKHRoaXMuX3gxPWwpKyIsIisodGhpcy5feTE9Yyk6cD5jdHQmJih0aGlzLl8rPSJBIituKyIsIituKyIsMCwiKyArKHA+PXN0dCkrIiwiK2QrIiwiKyh0aGlzLl94MT10K24qTWF0aC5jb3MoaSkpKyIsIisodGhpcy5feTE9ZStuKk1hdGguc2luKGkpKSkpfSxyZWN0OmZ1bmN0aW9uKHQsZSxuLG8pe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rZSkrImgiKyArbisidiIrICtvKyJoIistbisiWiJ9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX319O3ZhciB1dHQ9IiQiO2Z1bmN0aW9uIGZ0dCgpe31mdW5jdGlvbiBndHQodCxlKXt2YXIgbj1uZXcgZnR0O2lmKHQgaW5zdGFuY2VvZiBmdHQpdC5lYWNoKChmdW5jdGlvbih0LGUpe24uc2V0KGUsdCl9KSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgbyxpPS0xLGE9dC5sZW5ndGg7aWYobnVsbD09ZSlmb3IoOysraTxhOyluLnNldChpLHRbaV0pO2Vsc2UgZm9yKDsrK2k8YTspbi5zZXQoZShvPXRbaV0saSx0KSxvKX1lbHNlIGlmKHQpZm9yKHZhciByIGluIHQpbi5zZXQocix0W3JdKTtyZXR1cm4gbn1mdW5jdGlvbiBodHQoKXt9ZnR0LnByb3RvdHlwZT1ndHQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpmdHQsaGFzOmZ1bmN0aW9uKHQpe3JldHVybiB1dHQrdCBpbiB0aGlzfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbdXR0K3RdfSxzZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpc1t1dHQrdF09ZSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9dXR0K3Q7cmV0dXJuIGUgaW4gdGhpcyYmZGVsZXRlIHRoaXNbZV19LGNsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpdFswXT09PXV0dCYmZGVsZXRlIHRoaXNbdF19LGtleXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gdGhpcyllWzBdPT09dXR0JiZ0LnB1c2goZS5zbGljZSgxKSk7cmV0dXJuIHR9LHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT11dHQmJnQucHVzaCh0aGlzW2VdKTtyZXR1cm4gdH0sZW50cmllczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT11dHQmJnQucHVzaCh7a2V5OmUuc2xpY2UoMSksdmFsdWU6dGhpc1tlXX0pO3JldHVybiB0fSxzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9MDtmb3IodmFyIGUgaW4gdGhpcyllWzBdPT09dXR0JiYrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpaWYodFswXT09PXV0dClyZXR1cm4hMTtyZXR1cm4hMH0sZWFjaDpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdGhpcyllWzBdPT09dXR0JiZ0KHRoaXNbZV0sZS5zbGljZSgxKSx0aGlzKX19O3ZhciBidHQ9Z3R0LnByb3RvdHlwZTtmdW5jdGlvbiB5dHQodCxlKXtpZigobj0odD1lP3QudG9FeHBvbmVudGlhbChlLTEpOnQudG9FeHBvbmVudGlhbCgpKS5pbmRleE9mKCJlIikpPDApcmV0dXJuIG51bGw7dmFyIG4sbz10LnNsaWNlKDAsbik7cmV0dXJuW28ubGVuZ3RoPjE/b1swXStvLnNsaWNlKDIpOm8sK3Quc2xpY2UobisxKV19ZnVuY3Rpb24gX3R0KHQpe3JldHVybih0PXl0dChNYXRoLmFicyh0KSkpP3RbMV06TmFOfWh0dC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmh0dCxoYXM6YnR0LmhhcyxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbdXR0Kyh0Kz0iIildPXQsdGhpc30scmVtb3ZlOmJ0dC5yZW1vdmUsY2xlYXI6YnR0LmNsZWFyLHZhbHVlczpidHQua2V5cyxzaXplOmJ0dC5zaXplLGVtcHR5OmJ0dC5lbXB0eSxlYWNoOmJ0dC5lYWNofTt2YXIgQ3R0LE10dD0vXig/OiguKT8oWzw+PV5dKSk/KFsrXC0oIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KH4pPyhbYS16JV0pPyQvaTtmdW5jdGlvbiB2dHQodCl7aWYoIShlPU10dC5leGVjKHQpKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9ybWF0OiAiK3QpO3ZhciBlO3JldHVybiBuZXcgeHR0KHtmaWxsOmVbMV0sYWxpZ246ZVsyXSxzaWduOmVbM10sc3ltYm9sOmVbNF0semVybzplWzVdLHdpZHRoOmVbNl0sY29tbWE6ZVs3XSxwcmVjaXNpb246ZVs4XSYmZVs4XS5zbGljZSgxKSx0cmltOmVbOV0sdHlwZTplWzEwXX0pfWZ1bmN0aW9uIHh0dCh0KXt0aGlzLmZpbGw9dm9pZCAwPT09dC5maWxsPyIgIjp0LmZpbGwrIiIsdGhpcy5hbGlnbj12b2lkIDA9PT10LmFsaWduPyI+Ijp0LmFsaWduKyIiLHRoaXMuc2lnbj12b2lkIDA9PT10LnNpZ24/Ii0iOnQuc2lnbisiIix0aGlzLnN5bWJvbD12b2lkIDA9PT10LnN5bWJvbD8iIjp0LnN5bWJvbCsiIix0aGlzLnplcm89ISF0Lnplcm8sdGhpcy53aWR0aD12b2lkIDA9PT10LndpZHRoP3ZvaWQgMDordC53aWR0aCx0aGlzLmNvbW1hPSEhdC5jb21tYSx0aGlzLnByZWNpc2lvbj12b2lkIDA9PT10LnByZWNpc2lvbj92b2lkIDA6K3QucHJlY2lzaW9uLHRoaXMudHJpbT0hIXQudHJpbSx0aGlzLnR5cGU9dm9pZCAwPT09dC50eXBlPyIiOnQudHlwZSsiIn1mdW5jdGlvbiBPdHQodCxlKXt2YXIgbj15dHQodCxlKTtpZighbilyZXR1cm4gdCsiIjt2YXIgbz1uWzBdLGk9blsxXTtyZXR1cm4gaTwwPyIwLiIrbmV3IEFycmF5KC1pKS5qb2luKCIwIikrbzpvLmxlbmd0aD5pKzE/by5zbGljZSgwLGkrMSkrIi4iK28uc2xpY2UoaSsxKTpvK25ldyBBcnJheShpLW8ubGVuZ3RoKzIpLmpvaW4oIjAiKX12dHQucHJvdG90eXBlPXh0dC5wcm90b3R5cGUseHR0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbGwrdGhpcy5hbGlnbit0aGlzLnNpZ24rdGhpcy5zeW1ib2wrKHRoaXMuemVybz8iMCI6IiIpKyh2b2lkIDA9PT10aGlzLndpZHRoPyIiOk1hdGgubWF4KDEsMHx0aGlzLndpZHRoKSkrKHRoaXMuY29tbWE/IiwiOiIiKSsodm9pZCAwPT09dGhpcy5wcmVjaXNpb24/IiI6Ii4iK01hdGgubWF4KDAsMHx0aGlzLnByZWNpc2lvbikpKyh0aGlzLnRyaW0/In4iOiIiKSt0aGlzLnR5cGV9O3ZhciBQdHQ9eyIlIjpmdW5jdGlvbih0LGUpe3JldHVybigxMDAqdCkudG9GaXhlZChlKX0sYjpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZygyKX0sYzpmdW5jdGlvbih0KXtyZXR1cm4gdCsiIn0sZDpmdW5jdGlvbiB3dHQodCl7cmV0dXJuIE1hdGguYWJzKHQ9TWF0aC5yb3VuZCh0KSk+PTFlMjE/dC50b0xvY2FsZVN0cmluZygiZW4iKS5yZXBsYWNlKC8sL2csIiIpOnQudG9TdHJpbmcoMTApfSxlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9FeHBvbmVudGlhbChlKX0sZjpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRvRml4ZWQoZSl9LGc6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50b1ByZWNpc2lvbihlKX0sbzpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZyg4KX0scDpmdW5jdGlvbih0LGUpe3JldHVybiBPdHQoMTAwKnQsZSl9LHI6T3R0LHM6ZnVuY3Rpb24ga3R0KHQsZSl7dmFyIG49eXR0KHQsZSk7aWYoIW4pcmV0dXJuIHQrIiI7dmFyIG89blswXSxpPW5bMV0sYT1pLShDdHQ9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoaS8zKSkpKSsxLHI9by5sZW5ndGg7cmV0dXJuIGE9PT1yP286YT5yP28rbmV3IEFycmF5KGEtcisxKS5qb2luKCIwIik6YT4wP28uc2xpY2UoMCxhKSsiLiIrby5zbGljZShhKToiMC4iK25ldyBBcnJheSgxLWEpLmpvaW4oIjAiKSt5dHQodCxNYXRoLm1heCgwLGUrYS0xKSlbMF19LFg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LHg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpfX07ZnVuY3Rpb24gU3R0KHQpe3JldHVybiB0fXZhciBEdHQsRXR0LFJ0dCxBdHQ9QXJyYXkucHJvdG90eXBlLm1hcCxUdHQ9WyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCLCtSIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdO2Z1bmN0aW9uIE50dCh0LGUpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6YnJlYWs7Y2FzZSAxOnRoaXMucmFuZ2UodCk7YnJlYWs7ZGVmYXVsdDp0aGlzLnJhbmdlKGUpLmRvbWFpbih0KX1yZXR1cm4gdGhpc30hKGZ1bmN0aW9uIHp0dCh0KXtEdHQ9KGZ1bmN0aW9uIGUodCl7dmFyIGU9dm9pZCAwPT09dC5ncm91cGluZ3x8dm9pZCAwPT09dC50aG91c2FuZHM/U3R0OihmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4sbyl7Zm9yKHZhciBpPW4ubGVuZ3RoLGE9W10scj0wLHM9dFswXSxsPTA7aT4wJiZzPjAmJihsK3MrMT5vJiYocz1NYXRoLm1heCgxLG8tbCkpLGEucHVzaChuLnN1YnN0cmluZyhpLT1zLGkrcykpLCEoKGwrPXMrMSk+bykpOylzPXRbcj0ocisxKSV0Lmxlbmd0aF07cmV0dXJuIGEucmV2ZXJzZSgpLmpvaW4oZSl9fSkoQXR0LmNhbGwodC5ncm91cGluZyxOdW1iZXIpLHQudGhvdXNhbmRzKyIiKSxvPXZvaWQgMD09PXQuY3VycmVuY3k/IiI6dC5jdXJyZW5jeVswXSsiIixpPXZvaWQgMD09PXQuY3VycmVuY3k/IiI6dC5jdXJyZW5jeVsxXSsiIixhPXZvaWQgMD09PXQuZGVjaW1hbD8iLiI6dC5kZWNpbWFsKyIiLHI9dm9pZCAwPT09dC5udW1lcmFscz9TdHQ6KGZ1bmN0aW9uIHModCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1swLTldL2csKGZ1bmN0aW9uKGUpe3JldHVybiB0WytlXX0pKX19KShBdHQuY2FsbCh0Lm51bWVyYWxzLFN0cmluZykpLGw9dm9pZCAwPT09dC5wZXJjZW50PyIlIjp0LnBlcmNlbnQrIiIsYz12b2lkIDA9PT10Lm1pbnVzPyItIjp0Lm1pbnVzKyIiLGQ9dm9pZCAwPT09dC5uYW4/Ik5hTiI6dC5uYW4rIiI7ZnVuY3Rpb24gcCh0KXt2YXIgbj0odD12dHQodCkpLmZpbGwscz10LmFsaWduLHA9dC5zaWduLG09dC5zeW1ib2wsdT10Lnplcm8sZj10LndpZHRoLGc9dC5jb21tYSxoPXQucHJlY2lzaW9uLGI9dC50cmltLHk9dC50eXBlOyJuIj09PXk/KGc9ITAseT0iZyIpOlB0dFt5XXx8KHZvaWQgMD09PWgmJihoPTEyKSxiPSEwLHk9ImciKSwodXx8IjAiPT09biYmIj0iPT09cykmJih1PSEwLG49IjAiLHM9Ij0iKTt2YXIgXz0iJCI9PT1tP286IiMiPT09bSYmL1tib3hYXS8udGVzdCh5KT8iMCIreS50b0xvd2VyQ2FzZSgpOiIiLEM9IiQiPT09bT9pOi9bJXBdLy50ZXN0KHkpP2w6IiIsTT1QdHRbeV0sdj0vW2RlZmdwcnMlXS8udGVzdCh5KTtmdW5jdGlvbiB4KHQpe3ZhciBvLGksbCxtPV8seD1DO2lmKCJjIj09PXkpeD1NKHQpK3gsdD0iIjtlbHNle3ZhciBPPSh0PSt0KTwwfHwxL3Q8MDtpZih0PWlzTmFOKHQpP2Q6TShNYXRoLmFicyh0KSxoKSxiJiYodD0oZnVuY3Rpb24gUCh0KXt0OmZvcih2YXIgZSxuPXQubGVuZ3RoLG89MSxpPS0xO288bjsrK28pc3dpdGNoKHRbb10pe2Nhc2UiLiI6aT1lPW87YnJlYWs7Y2FzZSIwIjowPT09aSYmKGk9byksZT1vO2JyZWFrO2RlZmF1bHQ6aWYoISt0W29dKWJyZWFrIHQ7aT4wJiYoaT0wKX1yZXR1cm4gaT4wP3Quc2xpY2UoMCxpKSt0LnNsaWNlKGUrMSk6dH0pKHQpKSxPJiYwPT0rdCYmIisiIT09cCYmKE89ITEpLG09KE8/IigiPT09cD9wOmM6Ii0iPT09cHx8IigiPT09cD8iIjpwKSttLHg9KCJzIj09PXk/VHR0WzgrQ3R0LzNdOiIiKSt4KyhPJiYiKCI9PT1wPyIpIjoiIiksdilmb3Iobz0tMSxpPXQubGVuZ3RoOysrbzxpOylpZig0OD4obD10LmNoYXJDb2RlQXQobykpfHxsPjU3KXt4PSg0Nj09PWw/YSt0LnNsaWNlKG8rMSk6dC5zbGljZShvKSkreCx0PXQuc2xpY2UoMCxvKTticmVha319ZyYmIXUmJih0PWUodCwxLzApKTt2YXIgdz1tLmxlbmd0aCt0Lmxlbmd0aCt4Lmxlbmd0aCxrPXc8Zj9uZXcgQXJyYXkoZi13KzEpLmpvaW4obik6IiI7c3dpdGNoKGcmJnUmJih0PWUoayt0LGsubGVuZ3RoP2YteC5sZW5ndGg6MS8wKSxrPSIiKSxzKXtjYXNlIjwiOnQ9bSt0K3grazticmVhaztjYXNlIj0iOnQ9bStrK3QreDticmVhaztjYXNlIl4iOnQ9ay5zbGljZSgwLHc9ay5sZW5ndGg+PjEpK20rdCt4K2suc2xpY2Uodyk7YnJlYWs7ZGVmYXVsdDp0PWsrbSt0K3h9cmV0dXJuIHIodCl9cmV0dXJuIGg9dm9pZCAwPT09aD82Oi9bZ3Byc10vLnRlc3QoeSk/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxoKSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxoKSkseC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0KyIifSx4fXJldHVybntmb3JtYXQ6cCxmb3JtYXRQcmVmaXg6ZnVuY3Rpb24gbSh0LGUpe3ZhciBuPXAoKCh0PXZ0dCh0KSkudHlwZT0iZiIsdCkpLG89MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoX3R0KGUpLzMpKSksaT1NYXRoLnBvdygxMCwtbyksYT1UdHRbOCtvLzNdO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbihpKnQpK2F9fX19KSh0KSxFdHQ9RHR0LmZvcm1hdCxSdHQ9RHR0LmZvcm1hdFByZWZpeH0pKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXSxtaW51czoiLSJ9KTt2YXIgSXR0PUFycmF5LnByb3RvdHlwZSxIdHQ9SXR0Lm1hcCxGdHQ9SXR0LnNsaWNlLEx0dD17bmFtZToiaW1wbGljaXQifTtmdW5jdGlvbiBCdHQoKXt2YXIgdD1ndHQoKSxlPVtdLG49W10sbz1MdHQ7ZnVuY3Rpb24gaShpKXt2YXIgYT1pKyIiLHI9dC5nZXQoYSk7aWYoIXIpe2lmKG8hPT1MdHQpcmV0dXJuIG87dC5zZXQoYSxyPWUucHVzaChpKSl9cmV0dXJuIG5bKHItMSklbi5sZW5ndGhdfXJldHVybiBpLmRvbWFpbj1mdW5jdGlvbihuKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZS5zbGljZSgpO2U9W10sdD1ndHQoKTtmb3IodmFyIG8sYSxyPS0xLHM9bi5sZW5ndGg7KytyPHM7KXQuaGFzKGE9KG89bltyXSkrIiIpfHx0LnNldChhLGUucHVzaChvKSk7cmV0dXJuIGl9LGkucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49RnR0LmNhbGwodCksaSk6bi5zbGljZSgpfSxpLnVua25vd249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89dCxpKTpvfSxpLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gQnR0KGUsbikudW5rbm93bihvKX0sTnR0LmFwcGx5KGksYXJndW1lbnRzKSxpfWZ1bmN0aW9uIFZ0dCgpe3ZhciB0LGUsbj1CdHQoKS51bmtub3duKHZvaWQgMCksbz1uLmRvbWFpbixpPW4ucmFuZ2UsYT1bMCwxXSxyPSExLHM9MCxsPTAsYz0uNTtmdW5jdGlvbiBkKCl7dmFyIG49bygpLmxlbmd0aCxkPWFbMV08YVswXSxwPWFbZC0wXSxtPWFbMS1kXTt0PShtLXApL01hdGgubWF4KDEsbi1zKzIqbCksciYmKHQ9TWF0aC5mbG9vcih0KSkscCs9KG0tcC10KihuLXMpKSpjLGU9dCooMS1zKSxyJiYocD1NYXRoLnJvdW5kKHApLGU9TWF0aC5yb3VuZChlKSk7dmFyIHU9aDUobikubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gcCt0KmV9KSk7cmV0dXJuIGkoZD91LnJldmVyc2UoKTp1KX1yZXR1cm4gZGVsZXRlIG4udW5rbm93bixuLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obyh0KSxkKCkpOm8oKX0sbi5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1bK3RbMF0sK3RbMV1dLGQoKSk6YS5zbGljZSgpfSxuLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGE9Wyt0WzBdLCt0WzFdXSxyPSEwLGQoKX0sbi5iYW5kd2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5zdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LG4ucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ISF0LGQoKSk6cn0sbi5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPU1hdGgubWluKDEsbD0rdCksZCgpKTpzfSxuLnBhZGRpbmdJbm5lcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1NYXRoLm1pbigxLHQpLGQoKSk6c30sbi5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9K3QsZCgpKTpsfSxuLmFsaWduPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSksZCgpKTpjfSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gVnR0KG8oKSxhKS5yb3VuZChyKS5wYWRkaW5nSW5uZXIocykucGFkZGluZ091dGVyKGwpLmFsaWduKGMpfSxOdHQuYXBwbHkoZCgpLGFyZ3VtZW50cyl9ZnVuY3Rpb24ganR0KHQpe3ZhciBlPXQuY29weTtyZXR1cm4gdC5wYWRkaW5nPXQucGFkZGluZ091dGVyLGRlbGV0ZSB0LnBhZGRpbmdJbm5lcixkZWxldGUgdC5wYWRkaW5nT3V0ZXIsdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGp0dChlKCkpfSx0fWZ1bmN0aW9uIFV0dCgpe3JldHVybiBqdHQoVnR0LmFwcGx5KG51bGwsYXJndW1lbnRzKS5wYWRkaW5nSW5uZXIoMSkpfWZ1bmN0aW9uIEd0dCh0KXtyZXR1cm4rdH12YXIgV3R0PVswLDFdO2Z1bmN0aW9uIFl0dCh0KXtyZXR1cm4gdH1mdW5jdGlvbiBxdHQodCxlKXtyZXR1cm4oZS09dD0rdCk/ZnVuY3Rpb24obil7cmV0dXJuKG4tdCkvZX06KGZ1bmN0aW9uIG4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSkoaXNOYU4oZSk/TmFOOi41KX1mdW5jdGlvbiBadHQodCl7dmFyIGUsbj10WzBdLG89dFt0Lmxlbmd0aC0xXTtyZXR1cm4gbj5vJiYoZT1uLG49byxvPWUpLGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLm1heChuLE1hdGgubWluKG8sdCkpfX1mdW5jdGlvbiBYdHQodCxlLG4pe3ZhciBvPXRbMF0saT10WzFdLGE9ZVswXSxyPWVbMV07cmV0dXJuIGk8bz8obz1xdHQoaSxvKSxhPW4ocixhKSk6KG89cXR0KG8saSksYT1uKGEscikpLGZ1bmN0aW9uKHQpe3JldHVybiBhKG8odCkpfX1mdW5jdGlvbiBLdHQodCxlLG4pe3ZhciBvPU1hdGgubWluKHQubGVuZ3RoLGUubGVuZ3RoKS0xLGk9bmV3IEFycmF5KG8pLGE9bmV3IEFycmF5KG8pLHI9LTE7Zm9yKHRbb108dFswXSYmKHQ9dC5zbGljZSgpLnJldmVyc2UoKSxlPWUuc2xpY2UoKS5yZXZlcnNlKCkpOysrcjxvOylpW3JdPXF0dCh0W3JdLHRbcisxXSksYVtyXT1uKGVbcl0sZVtyKzFdKTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49cDUodCxlLDEsbyktMTtyZXR1cm4gYVtuXShpW25dKGUpKX19ZnVuY3Rpb24gSnR0KHQsZSl7cmV0dXJuIGUuZG9tYWluKHQuZG9tYWluKCkpLnJhbmdlKHQucmFuZ2UoKSkuaW50ZXJwb2xhdGUodC5pbnRlcnBvbGF0ZSgpKS5jbGFtcCh0LmNsYW1wKCkpLnVua25vd24odC51bmtub3duKCkpfWZ1bmN0aW9uIFF0dCgpe3ZhciB0LGUsbixvLGksYSxyPVd0dCxzPVd0dCxsPVo3LGM9WXR0O2Z1bmN0aW9uIGQoKXtyZXR1cm4gbz1NYXRoLm1pbihyLmxlbmd0aCxzLmxlbmd0aCk+Mj9LdHQ6WHR0LGk9YT1udWxsLHB9ZnVuY3Rpb24gcChlKXtyZXR1cm4gaXNOYU4oZT0rZSk/bjooaXx8KGk9byhyLm1hcCh0KSxzLGwpKSkodChjKGUpKSl9cmV0dXJuIHAuaW52ZXJ0PWZ1bmN0aW9uKG4pe3JldHVybiBjKGUoKGF8fChhPW8ocyxyLm1hcCh0KSxVNykpKShuKSkpfSxwLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1IdHQuY2FsbCh0LEd0dCksYz09PVl0dHx8KGM9WnR0KHIpKSxkKCkpOnIuc2xpY2UoKX0scC5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1GdHQuY2FsbCh0KSxkKCkpOnMuc2xpY2UoKX0scC5yYW5nZVJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBzPUZ0dC5jYWxsKHQpLGw9WDcsZCgpfSxwLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPXQ/WnR0KHIpOll0dCxwKTpjIT09WXR0fSxwLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPXQsZCgpKTpsfSxwLnVua25vd249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxwKTpufSxmdW5jdGlvbihuLG8pe3JldHVybiB0PW4sZT1vLGQoKX19ZnVuY3Rpb24gJHR0KHQsZSl7cmV0dXJuIFF0dCgpKHQsZSl9ZnVuY3Rpb24gdGV0KHQpe3ZhciBlPXQuZG9tYWluO3JldHVybiB0LnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBuPWUoKTtyZXR1cm4gQzUoblswXSxuW24ubGVuZ3RoLTFdLG51bGw9PXQ/MTA6dCl9LHQudGlja0Zvcm1hdD1mdW5jdGlvbih0LG4pe3ZhciBvPWUoKTtyZXR1cm4oZnVuY3Rpb24gaSh0LGUsbixvKXt2YXIgaSxhPXY1KHQsZSxuKTtzd2l0Y2goKG89dnR0KG51bGw9PW8/IixmIjpvKSkudHlwZSl7Y2FzZSJzIjp2YXIgcj1NYXRoLm1heChNYXRoLmFicyh0KSxNYXRoLmFicyhlKSk7cmV0dXJuIG51bGwhPW8ucHJlY2lzaW9ufHxpc05hTihpPShmdW5jdGlvbiBzKHQsZSl7cmV0dXJuIE1hdGgubWF4KDAsMypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoX3R0KGUpLzMpKSktX3R0KE1hdGguYWJzKHQpKSl9KShhLHIpKXx8KG8ucHJlY2lzaW9uPWkpLFJ0dChvLHIpO2Nhc2UiIjpjYXNlImUiOmNhc2UiZyI6Y2FzZSJwIjpjYXNlInIiOm51bGwhPW8ucHJlY2lzaW9ufHxpc05hTihpPShmdW5jdGlvbiBsKHQsZSl7cmV0dXJuIHQ9TWF0aC5hYnModCksZT1NYXRoLmFicyhlKS10LE1hdGgubWF4KDAsX3R0KGUpLV90dCh0KSkrMX0pKGEsTWF0aC5tYXgoTWF0aC5hYnModCksTWF0aC5hYnMoZSkpKSl8fChvLnByZWNpc2lvbj1pLSgiZSI9PT1vLnR5cGUpKTticmVhaztjYXNlImYiOmNhc2UiJSI6bnVsbCE9by5wcmVjaXNpb258fGlzTmFOKGk9KGZ1bmN0aW9uIGModCl7cmV0dXJuIE1hdGgubWF4KDAsLV90dChNYXRoLmFicyh0KSkpfSkoYSkpfHwoby5wcmVjaXNpb249aS0yKigiJSI9PT1vLnR5cGUpKX1yZXR1cm4gRXR0KG8pfSkob1swXSxvW28ubGVuZ3RoLTFdLG51bGw9PXQ/MTA6dCxuKX0sdC5uaWNlPWZ1bmN0aW9uKG4pe251bGw9PW4mJihuPTEwKTt2YXIgbyxpPWUoKSxhPTAscj1pLmxlbmd0aC0xLHM9aVthXSxsPWlbcl07cmV0dXJuIGw8cyYmKG89cyxzPWwsbD1vLG89YSxhPXIscj1vKSwobz1NNShzLGwsbikpPjA/bz1NNShzPU1hdGguZmxvb3Iocy9vKSpvLGw9TWF0aC5jZWlsKGwvbykqbyxuKTpvPDAmJihvPU01KHM9TWF0aC5jZWlsKHMqbykvbyxsPU1hdGguZmxvb3IobCpvKS9vLG4pKSxvPjA/KGlbYV09TWF0aC5mbG9vcihzL28pKm8saVtyXT1NYXRoLmNlaWwobC9vKSpvLGUoaSkpOm88MCYmKGlbYV09TWF0aC5jZWlsKHMqbykvbyxpW3JdPU1hdGguZmxvb3IobCpvKS9vLGUoaSkpLHR9LHR9ZnVuY3Rpb24gZWV0KCl7dmFyIHQ9JHR0KFl0dCxZdHQpO3JldHVybiB0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gSnR0KHQsZWV0KCkpfSxOdHQuYXBwbHkodCxhcmd1bWVudHMpLHRldCh0KX1mdW5jdGlvbiBuZXQodCxlKXt2YXIgbixvPTAsaT0odD10LnNsaWNlKCkpLmxlbmd0aC0xLGE9dFtvXSxyPXRbaV07cmV0dXJuIHI8YSYmKG49byxvPWksaT1uLG49YSxhPXIscj1uKSx0W29dPWUuZmxvb3IoYSksdFtpXT1lLmNlaWwociksdH1mdW5jdGlvbiBvZXQodCl7cmV0dXJuIE1hdGgubG9nKHQpfWZ1bmN0aW9uIGlldCh0KXtyZXR1cm4gTWF0aC5leHAodCl9ZnVuY3Rpb24gYWV0KHQpe3JldHVybi1NYXRoLmxvZygtdCl9ZnVuY3Rpb24gcmV0KHQpe3JldHVybi1NYXRoLmV4cCgtdCl9ZnVuY3Rpb24gc2V0KHQpe3JldHVybiBpc0Zpbml0ZSh0KT8rKCIxZSIrdCk6dDwwPzA6dH1mdW5jdGlvbiBjZXQodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybi10KC1lKX19ZnVuY3Rpb24gZGV0KHQpe3ZhciBlLG4sbz10KG9ldCxpZXQpLGk9by5kb21haW4sYT0xMDtmdW5jdGlvbiByKCl7cmV0dXJuIGU9KGZ1bmN0aW9uIHIodCl7cmV0dXJuIHQ9PT1NYXRoLkU/TWF0aC5sb2c6MTA9PT10JiZNYXRoLmxvZzEwfHwyPT09dCYmTWF0aC5sb2cyfHwodD1NYXRoLmxvZyh0KSxmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5sb2coZSkvdH0pfSkoYSksbj0oZnVuY3Rpb24gcyh0KXtyZXR1cm4gMTA9PT10P3NldDp0PT09TWF0aC5FP01hdGguZXhwOmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnBvdyh0LGUpfX0pKGEpLGkoKVswXTwwPyhlPWNldChlKSxuPWNldChuKSx0KGFldCxyZXQpKTp0KG9ldCxpZXQpLG99cmV0dXJuIG8uYmFzZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rdCxyKCkpOmF9LG8uZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpKHQpLHIoKSk6aSgpfSxvLnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBvLHI9aSgpLHM9clswXSxsPXJbci5sZW5ndGgtMV07KG89bDxzKSYmKG09cyxzPWwsbD1tKTt2YXIgYyxkLHAsbT1lKHMpLHU9ZShsKSxmPW51bGw9PXQ/MTA6K3QsZz1bXTtpZighKGElMSkmJnUtbTxmKXtpZihtPU1hdGgucm91bmQobSktMSx1PU1hdGgucm91bmQodSkrMSxzPjApe2Zvcig7bTx1OysrbSlmb3IoZD0xLGM9bihtKTtkPGE7KytkKWlmKCEoKHA9YypkKTxzKSl7aWYocD5sKWJyZWFrO2cucHVzaChwKX19ZWxzZSBmb3IoO208dTsrK20pZm9yKGQ9YS0xLGM9bihtKTtkPj0xOy0tZClpZighKChwPWMqZCk8cykpe2lmKHA+bClicmVhaztnLnB1c2gocCl9fWVsc2UgZz1DNShtLHUsTWF0aC5taW4odS1tLGYpKS5tYXAobik7cmV0dXJuIG8/Zy5yZXZlcnNlKCk6Z30sby50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsaSl7aWYobnVsbD09aSYmKGk9MTA9PT1hPyIuMGUiOiIsIiksImZ1bmN0aW9uIiE9dHlwZW9mIGkmJihpPUV0dChpKSksdD09PTEvMClyZXR1cm4gaTtudWxsPT10JiYodD0xMCk7dmFyIHI9TWF0aC5tYXgoMSxhKnQvby50aWNrcygpLmxlbmd0aCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBvPXQvbihNYXRoLnJvdW5kKGUodCkpKTtyZXR1cm4gbyphPGEtLjUmJihvKj1hKSxvPD1yP2kodCk6IiJ9fSxvLm5pY2U9ZnVuY3Rpb24oKXtyZXR1cm4gaShuZXQoaSgpLHtmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gbihNYXRoLmZsb29yKGUodCkpKX0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gbihNYXRoLmNlaWwoZSh0KSkpfX0pKX0sb31mdW5jdGlvbiBwZXQoKXt2YXIgdD1kZXQoUXR0KCkpLmRvbWFpbihbMSwxMF0pO3JldHVybiB0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gSnR0KHQscGV0KCkpLmJhc2UodC5iYXNlKCkpfSxOdHQuYXBwbHkodCxhcmd1bWVudHMpLHR9dmFyIG1ldD1uZXcgRGF0ZSx1ZXQ9bmV3IERhdGU7ZnVuY3Rpb24gZmV0KHQsZSxuLG8pe2Z1bmN0aW9uIGkoZSl7cmV0dXJuIHQoZT0wPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgRGF0ZTpuZXcgRGF0ZSgrZSkpLGV9cmV0dXJuIGkuZmxvb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZT1uZXcgRGF0ZSgrZSkpLGV9LGkuY2VpbD1mdW5jdGlvbihuKXtyZXR1cm4gdChuPW5ldyBEYXRlKG4tMSkpLGUobiwxKSx0KG4pLG59LGkucm91bmQ9ZnVuY3Rpb24odCl7dmFyIGU9aSh0KSxuPWkuY2VpbCh0KTtyZXR1cm4gdC1lPG4tdD9lOm59LGkub2Zmc2V0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIGUodD1uZXcgRGF0ZSgrdCksbnVsbD09bj8xOk1hdGguZmxvb3IobikpLHR9LGkucmFuZ2U9ZnVuY3Rpb24obixvLGEpe3ZhciByLHM9W107aWYobj1pLmNlaWwobiksYT1udWxsPT1hPzE6TWF0aC5mbG9vcihhKSwhKG48byYmYT4wKSlyZXR1cm4gcztkb3tzLnB1c2gocj1uZXcgRGF0ZSgrbikpLGUobixhKSx0KG4pfXdoaWxlKHI8biYmbjxvKTtyZXR1cm4gc30saS5maWx0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIGZldCgoZnVuY3Rpb24oZSl7aWYoZT49ZSlmb3IoO3QoZSksIW4oZSk7KWUuc2V0VGltZShlLTEpfSksKGZ1bmN0aW9uKHQsbyl7aWYodD49dClpZihvPDApZm9yKDsrK288PTA7KWZvcig7ZSh0LC0xKSwhbih0KTspO2Vsc2UgZm9yKDstLW8+PTA7KWZvcig7ZSh0LDEpLCFuKHQpOyk7fSkpfSxuJiYoaS5jb3VudD1mdW5jdGlvbihlLG8pe3JldHVybiBtZXQuc2V0VGltZSgrZSksdWV0LnNldFRpbWUoK28pLHQobWV0KSx0KHVldCksTWF0aC5mbG9vcihuKG1ldCx1ZXQpKX0saS5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP2kuZmlsdGVyKG8/ZnVuY3Rpb24oZSl7cmV0dXJuIG8oZSkldD09MH06ZnVuY3Rpb24oZSl7cmV0dXJuIGkuY291bnQoMCxlKSV0PT0wfSk6aTpudWxsfSksaX12YXIgZ2V0PWZldCgoZnVuY3Rpb24oKXt9KSwoZnVuY3Rpb24odCxlKXt0LnNldFRpbWUoK3QrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS10fSkpO2dldC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP2ZldCgoZnVuY3Rpb24oZSl7ZS5zZXRUaW1lKE1hdGguZmxvb3IoZS90KSp0KX0pLChmdW5jdGlvbihlLG4pe2Uuc2V0VGltZSgrZStuKnQpfSksKGZ1bmN0aW9uKGUsbil7cmV0dXJuKG4tZSkvdH0pKTpnZXQ6bnVsbH07dmFyIGhldD1nZXQsYmV0PTFlMyx5ZXQ9NmU0LF9ldD0zNmU1LENldD04NjRlNSxNZXQ9NjA0OGU1LHZldD1mZXQoKGZ1bmN0aW9uKHQpe3Quc2V0VGltZSh0LXQuZ2V0TWlsbGlzZWNvbmRzKCkpfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UqYmV0KX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL2JldH0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENTZWNvbmRzKCl9KSkseGV0PWZldCgoZnVuY3Rpb24odCl7dC5zZXRUaW1lKHQtdC5nZXRNaWxsaXNlY29uZHMoKS10LmdldFNlY29uZHMoKSpiZXQpfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UqeWV0KX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL3lldH0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNaW51dGVzKCl9KSksT2V0PWZldCgoZnVuY3Rpb24odCl7dC5zZXRUaW1lKHQtdC5nZXRNaWxsaXNlY29uZHMoKS10LmdldFNlY29uZHMoKSpiZXQtdC5nZXRNaW51dGVzKCkqeWV0KX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKl9ldCl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS9fZXR9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0SG91cnMoKX0pKSxQZXQ9ZmV0KChmdW5jdGlvbih0KXt0LnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpK2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdC0oZS5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkqeWV0KS9DZXR9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RGF0ZSgpLTF9KSk7ZnVuY3Rpb24gd2V0KHQpe3JldHVybiBmZXQoKGZ1bmN0aW9uKGUpe2Uuc2V0RGF0ZShlLmdldERhdGUoKS0oZS5nZXREYXkoKSs3LXQpJTcpLGUuc2V0SG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldERhdGUodC5nZXREYXRlKCkrNyplKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQtKGUuZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKnlldCkvTWV0fSkpfXZhciBrZXQ9d2V0KDApLERldD13ZXQoMSk7d2V0KDIpLHdldCgzKTt2YXIgRWV0PXdldCg0KTt3ZXQoNSksd2V0KDYpO3ZhciBSZXQ9ZmV0KChmdW5jdGlvbih0KXt0LnNldERhdGUoMSksdC5zZXRIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0TW9udGgodC5nZXRNb250aCgpK2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZ2V0TW9udGgoKS10LmdldE1vbnRoKCkrMTIqKGUuZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCkpfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE1vbnRoKCl9KSksQWV0PWZldCgoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldEZ1bGxZZWFyKHQuZ2V0RnVsbFllYXIoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybiBlLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KSk7QWV0LmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PU1hdGguZmxvb3IodCkpJiZ0PjA/ZmV0KChmdW5jdGlvbihlKXtlLnNldEZ1bGxZZWFyKE1hdGguZmxvb3IoZS5nZXRGdWxsWWVhcigpL3QpKnQpLGUuc2V0TW9udGgoMCwxKSxlLnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKGUsbil7ZS5zZXRGdWxsWWVhcihlLmdldEZ1bGxZZWFyKCkrbip0KX0pKTpudWxsfTt2YXIgVGV0PUFldCxOZXQ9ZmV0KChmdW5jdGlvbih0KXt0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpK2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvQ2V0fSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0RhdGUoKS0xfSkpO2Z1bmN0aW9uIHpldCh0KXtyZXR1cm4gZmV0KChmdW5jdGlvbihlKXtlLnNldFVUQ0RhdGUoZS5nZXRVVENEYXRlKCktKGUuZ2V0VVRDRGF5KCkrNy10KSU3KSxlLnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpKzcqZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS9NZXR9KSl9dmFyIElldD16ZXQoMCksSGV0PXpldCgxKTt6ZXQoMiksemV0KDMpO3ZhciBGZXQ9emV0KDQpO3pldCg1KSx6ZXQoNik7dmFyIExldD1mZXQoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTW9udGgoMCwxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRVVENGdWxsWWVhcih0LmdldFVUQ0Z1bGxZZWFyKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5nZXRVVENGdWxsWWVhcigpLXQuZ2V0VVRDRnVsbFllYXIoKX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENGdWxsWWVhcigpfSkpO0xldC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP2ZldCgoZnVuY3Rpb24oZSl7ZS5zZXRVVENGdWxsWWVhcihNYXRoLmZsb29yKGUuZ2V0VVRDRnVsbFllYXIoKS90KSp0KSxlLnNldFVUQ01vbnRoKDAsMSksZS5zZXRVVENIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbihlLG4pe2Uuc2V0VVRDRnVsbFllYXIoZS5nZXRVVENGdWxsWWVhcigpK24qdCl9KSk6bnVsbH07dmFyIEJldD1MZXQ7ZnVuY3Rpb24gVmV0KHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIGU9bmV3IERhdGUoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpO3JldHVybiBlLnNldEZ1bGxZZWFyKHQueSksZX1yZXR1cm4gbmV3IERhdGUodC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKX1mdW5jdGlvbiBqZXQodCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgZT1uZXcgRGF0ZShEYXRlLlVUQygtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpO3JldHVybiBlLnNldFVUQ0Z1bGxZZWFyKHQueSksZX1yZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEModC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKSl9ZnVuY3Rpb24gVWV0KHQsZSxuKXtyZXR1cm57eTp0LG06ZSxkOm4sSDowLE06MCxTOjAsTDowfX12YXIgR2V0LFdldCxZZXQ9eyItIjoiIixfOiIgIiwwOiIwIn0scWV0PS9eXHMqXGQrLyxaZXQ9L14lLyxYZXQ9L1tcXF4kKis/fFtcXSgpLnt9XS9nO2Z1bmN0aW9uIEtldCh0LGUsbil7dmFyIG89dDwwPyItIjoiIixpPShvPy10OnQpKyIiLGE9aS5sZW5ndGg7cmV0dXJuIG8rKGE8bj9uZXcgQXJyYXkobi1hKzEpLmpvaW4oZSkraTppKX1mdW5jdGlvbiBKZXQodCl7cmV0dXJuIHQucmVwbGFjZShYZXQsIlxcJCYiKX1mdW5jdGlvbiBRZXQodCl7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK3QubWFwKEpldCkuam9pbigifCIpKyIpIiwiaSIpfWZ1bmN0aW9uICRldCh0KXtmb3IodmFyIGU9e30sbj0tMSxvPXQubGVuZ3RoOysrbjxvOyllW3Rbbl0udG9Mb3dlckNhc2UoKV09bjtyZXR1cm4gZX1mdW5jdGlvbiB0bnQodCxlLG4pe3ZhciBvPXFldC5leGVjKGUuc2xpY2UobixuKzEpKTtyZXR1cm4gbz8odC53PStvWzBdLG4rb1swXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGVudCh0LGUsbil7dmFyIG89cWV0LmV4ZWMoZS5zbGljZShuLG4rMSkpO3JldHVybiBvPyh0LnU9K29bMF0sbitvWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbm50KHQsZSxuKXt2YXIgbz1xZXQuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIG8/KHQuVT0rb1swXSxuK29bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBvbnQodCxlLG4pe3ZhciBvPXFldC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gbz8odC5WPStvWzBdLG4rb1swXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGludCh0LGUsbil7dmFyIG89cWV0LmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBvPyh0Llc9K29bMF0sbitvWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gYW50KHQsZSxuKXt2YXIgbz1xZXQuZXhlYyhlLnNsaWNlKG4sbis0KSk7cmV0dXJuIG8/KHQueT0rb1swXSxuK29bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBybnQodCxlLG4pe3ZhciBvPXFldC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gbz8odC55PStvWzBdKygrb1swXT42OD8xOTAwOjJlMyksbitvWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gc250KHQsZSxuKXt2YXIgbz0vXihaKXwoWystXVxkXGQpKD86Oj8oXGRcZCkpPy8uZXhlYyhlLnNsaWNlKG4sbis2KSk7cmV0dXJuIG8/KHQuWj1vWzFdPzA6LShvWzJdKyhvWzNdfHwiMDAiKSksbitvWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbG50KHQsZSxuKXt2YXIgbz1xZXQuZXhlYyhlLnNsaWNlKG4sbisxKSk7cmV0dXJuIG8/KHQucT0zKm9bMF0tMyxuK29bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBjbnQodCxlLG4pe3ZhciBvPXFldC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gbz8odC5tPW9bMF0tMSxuK29bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBkbnQodCxlLG4pe3ZhciBvPXFldC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gbz8odC5kPStvWzBdLG4rb1swXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHBudCh0LGUsbil7dmFyIG89cWV0LmV4ZWMoZS5zbGljZShuLG4rMykpO3JldHVybiBvPyh0Lm09MCx0LmQ9K29bMF0sbitvWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbW50KHQsZSxuKXt2YXIgbz1xZXQuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIG8/KHQuSD0rb1swXSxuK29bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1bnQodCxlLG4pe3ZhciBvPXFldC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gbz8odC5NPStvWzBdLG4rb1swXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGZudCh0LGUsbil7dmFyIG89cWV0LmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBvPyh0LlM9K29bMF0sbitvWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gZ250KHQsZSxuKXt2YXIgbz1xZXQuZXhlYyhlLnNsaWNlKG4sbiszKSk7cmV0dXJuIG8/KHQuTD0rb1swXSxuK29bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBobnQodCxlLG4pe3ZhciBvPXFldC5leGVjKGUuc2xpY2UobixuKzYpKTtyZXR1cm4gbz8odC5MPU1hdGguZmxvb3Iob1swXS8xZTMpLG4rb1swXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGJudCh0LGUsbil7dmFyIG89WmV0LmV4ZWMoZS5zbGljZShuLG4rMSkpO3JldHVybiBvP24rb1swXS5sZW5ndGg6LTF9ZnVuY3Rpb24geW50KHQsZSxuKXt2YXIgbz1xZXQuZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gbz8odC5RPStvWzBdLG4rb1swXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIF9udCh0LGUsbil7dmFyIG89cWV0LmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIG8/KHQucz0rb1swXSxuK29bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBDbnQodCxlKXtyZXR1cm4gS2V0KHQuZ2V0RGF0ZSgpLGUsMil9ZnVuY3Rpb24gTW50KHQsZSl7cmV0dXJuIEtldCh0LmdldEhvdXJzKCksZSwyKX1mdW5jdGlvbiB2bnQodCxlKXtyZXR1cm4gS2V0KHQuZ2V0SG91cnMoKSUxMnx8MTIsZSwyKX1mdW5jdGlvbiB4bnQodCxlKXtyZXR1cm4gS2V0KDErUGV0LmNvdW50KFRldCh0KSx0KSxlLDMpfWZ1bmN0aW9uIE9udCh0LGUpe3JldHVybiBLZXQodC5nZXRNaWxsaXNlY29uZHMoKSxlLDMpfWZ1bmN0aW9uIFBudCh0LGUpe3JldHVybiBPbnQodCxlKSsiMDAwIn1mdW5jdGlvbiB3bnQodCxlKXtyZXR1cm4gS2V0KHQuZ2V0TW9udGgoKSsxLGUsMil9ZnVuY3Rpb24ga250KHQsZSl7cmV0dXJuIEtldCh0LmdldE1pbnV0ZXMoKSxlLDIpfWZ1bmN0aW9uIFNudCh0LGUpe3JldHVybiBLZXQodC5nZXRTZWNvbmRzKCksZSwyKX1mdW5jdGlvbiBEbnQodCl7dmFyIGU9dC5nZXREYXkoKTtyZXR1cm4gMD09PWU/NzplfWZ1bmN0aW9uIEVudCh0LGUpe3JldHVybiBLZXQoa2V0LmNvdW50KFRldCh0KS0xLHQpLGUsMil9ZnVuY3Rpb24gUm50KHQpe3ZhciBlPXQuZ2V0RGF5KCk7cmV0dXJuIGU+PTR8fDA9PT1lP0VldCh0KTpFZXQuY2VpbCh0KX1mdW5jdGlvbiBBbnQodCxlKXtyZXR1cm4gdD1SbnQodCksS2V0KEVldC5jb3VudChUZXQodCksdCkrKDQ9PT1UZXQodCkuZ2V0RGF5KCkpLGUsMil9ZnVuY3Rpb24gVG50KHQpe3JldHVybiB0LmdldERheSgpfWZ1bmN0aW9uIE5udCh0LGUpe3JldHVybiBLZXQoRGV0LmNvdW50KFRldCh0KS0xLHQpLGUsMil9ZnVuY3Rpb24gem50KHQsZSl7cmV0dXJuIEtldCh0LmdldEZ1bGxZZWFyKCklMTAwLGUsMil9ZnVuY3Rpb24gSW50KHQsZSl7cmV0dXJuIEtldCgodD1SbnQodCkpLmdldEZ1bGxZZWFyKCklMTAwLGUsMil9ZnVuY3Rpb24gSG50KHQsZSl7cmV0dXJuIEtldCh0LmdldEZ1bGxZZWFyKCklMWU0LGUsNCl9ZnVuY3Rpb24gRm50KHQsZSl7dmFyIG49dC5nZXREYXkoKTtyZXR1cm4gS2V0KCh0PW4+PTR8fDA9PT1uP0VldCh0KTpFZXQuY2VpbCh0KSkuZ2V0RnVsbFllYXIoKSUxZTQsZSw0KX1mdW5jdGlvbiBMbnQodCl7dmFyIGU9dC5nZXRUaW1lem9uZU9mZnNldCgpO3JldHVybihlPjA/Ii0iOihlKj0tMSwiKyIpKStLZXQoZS82MHwwLCIwIiwyKStLZXQoZSU2MCwiMCIsMil9ZnVuY3Rpb24gQm50KHQsZSl7cmV0dXJuIEtldCh0LmdldFVUQ0RhdGUoKSxlLDIpfWZ1bmN0aW9uIFZudCh0LGUpe3JldHVybiBLZXQodC5nZXRVVENIb3VycygpLGUsMil9ZnVuY3Rpb24gam50KHQsZSl7cmV0dXJuIEtldCh0LmdldFVUQ0hvdXJzKCklMTJ8fDEyLGUsMil9ZnVuY3Rpb24gVW50KHQsZSl7cmV0dXJuIEtldCgxK05ldC5jb3VudChCZXQodCksdCksZSwzKX1mdW5jdGlvbiBHbnQodCxlKXtyZXR1cm4gS2V0KHQuZ2V0VVRDTWlsbGlzZWNvbmRzKCksZSwzKX1mdW5jdGlvbiBXbnQodCxlKXtyZXR1cm4gR250KHQsZSkrIjAwMCJ9ZnVuY3Rpb24gWW50KHQsZSl7cmV0dXJuIEtldCh0LmdldFVUQ01vbnRoKCkrMSxlLDIpfWZ1bmN0aW9uIHFudCh0LGUpe3JldHVybiBLZXQodC5nZXRVVENNaW51dGVzKCksZSwyKX1mdW5jdGlvbiBabnQodCxlKXtyZXR1cm4gS2V0KHQuZ2V0VVRDU2Vjb25kcygpLGUsMil9ZnVuY3Rpb24gWG50KHQpe3ZhciBlPXQuZ2V0VVRDRGF5KCk7cmV0dXJuIDA9PT1lPzc6ZX1mdW5jdGlvbiBLbnQodCxlKXtyZXR1cm4gS2V0KElldC5jb3VudChCZXQodCktMSx0KSxlLDIpfWZ1bmN0aW9uIEpudCh0KXt2YXIgZT10LmdldFVUQ0RheSgpO3JldHVybiBlPj00fHwwPT09ZT9GZXQodCk6RmV0LmNlaWwodCl9ZnVuY3Rpb24gUW50KHQsZSl7cmV0dXJuIHQ9Sm50KHQpLEtldChGZXQuY291bnQoQmV0KHQpLHQpKyg0PT09QmV0KHQpLmdldFVUQ0RheSgpKSxlLDIpfWZ1bmN0aW9uICRudCh0KXtyZXR1cm4gdC5nZXRVVENEYXkoKX1mdW5jdGlvbiB0b3QodCxlKXtyZXR1cm4gS2V0KEhldC5jb3VudChCZXQodCktMSx0KSxlLDIpfWZ1bmN0aW9uIGVvdCh0LGUpe3JldHVybiBLZXQodC5nZXRVVENGdWxsWWVhcigpJTEwMCxlLDIpfWZ1bmN0aW9uIG5vdCh0LGUpe3JldHVybiBLZXQoKHQ9Sm50KHQpKS5nZXRVVENGdWxsWWVhcigpJTEwMCxlLDIpfWZ1bmN0aW9uIG9vdCh0LGUpe3JldHVybiBLZXQodC5nZXRVVENGdWxsWWVhcigpJTFlNCxlLDQpfWZ1bmN0aW9uIGlvdCh0LGUpe3ZhciBuPXQuZ2V0VVRDRGF5KCk7cmV0dXJuIEtldCgodD1uPj00fHwwPT09bj9GZXQodCk6RmV0LmNlaWwodCkpLmdldFVUQ0Z1bGxZZWFyKCklMWU0LGUsNCl9ZnVuY3Rpb24gYW90KCl7cmV0dXJuIiswMDAwIn1mdW5jdGlvbiByb3QoKXtyZXR1cm4iJSJ9ZnVuY3Rpb24gc290KHQpe3JldHVybit0fWZ1bmN0aW9uIGxvdCh0KXtyZXR1cm4gTWF0aC5mbG9vcigrdC8xZTMpfSEoZnVuY3Rpb24gY290KHQpe0dldD0oZnVuY3Rpb24gZSh0KXt2YXIgZT10LmRhdGVUaW1lLG49dC5kYXRlLG89dC50aW1lLGk9dC5wZXJpb2RzLGE9dC5kYXlzLHI9dC5zaG9ydERheXMscz10Lm1vbnRocyxsPXQuc2hvcnRNb250aHMsYz1RZXQoaSksZD0kZXQoaSkscD1RZXQoYSksbT0kZXQoYSksdT1RZXQociksZj0kZXQociksZz1RZXQocyksaD0kZXQocyksYj1RZXQobCkseT0kZXQobCksXz17YTpmdW5jdGlvbiBDKHQpe3JldHVybiByW3QuZ2V0RGF5KCldfSxBOmZ1bmN0aW9uIE0odCl7cmV0dXJuIGFbdC5nZXREYXkoKV19LGI6ZnVuY3Rpb24gdih0KXtyZXR1cm4gbFt0LmdldE1vbnRoKCldfSxCOmZ1bmN0aW9uIHgodCl7cmV0dXJuIHNbdC5nZXRNb250aCgpXX0sYzpudWxsLGQ6Q250LGU6Q250LGY6UG50LGc6SW50LEc6Rm50LEg6TW50LEk6dm50LGo6eG50LEw6T250LG06d250LE06a250LHA6ZnVuY3Rpb24gTyh0KXtyZXR1cm4gaVsrKHQuZ2V0SG91cnMoKT49MTIpXX0scTpmdW5jdGlvbiBQKHQpe3JldHVybiAxK35+KHQuZ2V0TW9udGgoKS8zKX0sUTpzb3Qsczpsb3QsUzpTbnQsdTpEbnQsVTpFbnQsVjpBbnQsdzpUbnQsVzpObnQseDpudWxsLFg6bnVsbCx5OnpudCxZOkhudCxaOkxudCwiJSI6cm90fSx3PXthOmZ1bmN0aW9uIGsodCl7cmV0dXJuIHJbdC5nZXRVVENEYXkoKV19LEE6ZnVuY3Rpb24gUyh0KXtyZXR1cm4gYVt0LmdldFVUQ0RheSgpXX0sYjpmdW5jdGlvbiBEKHQpe3JldHVybiBsW3QuZ2V0VVRDTW9udGgoKV19LEI6ZnVuY3Rpb24gRSh0KXtyZXR1cm4gc1t0LmdldFVUQ01vbnRoKCldfSxjOm51bGwsZDpCbnQsZTpCbnQsZjpXbnQsZzpub3QsRzppb3QsSDpWbnQsSTpqbnQsajpVbnQsTDpHbnQsbTpZbnQsTTpxbnQscDpmdW5jdGlvbiBSKHQpe3JldHVybiBpWysodC5nZXRVVENIb3VycygpPj0xMildfSxxOmZ1bmN0aW9uIEEodCl7cmV0dXJuIDErfn4odC5nZXRVVENNb250aCgpLzMpfSxROnNvdCxzOmxvdCxTOlpudCx1OlhudCxVOktudCxWOlFudCx3OiRudCxXOnRvdCx4Om51bGwsWDpudWxsLHk6ZW90LFk6b290LFo6YW90LCIlIjpyb3R9LFQ9e2E6ZnVuY3Rpb24gTih0LGUsbil7dmFyIG89dS5leGVjKGUuc2xpY2UobikpO3JldHVybiBvPyh0Lnc9ZltvWzBdLnRvTG93ZXJDYXNlKCldLG4rb1swXS5sZW5ndGgpOi0xfSxBOmZ1bmN0aW9uIHoodCxlLG4pe3ZhciBvPXAuZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gbz8odC53PW1bb1swXS50b0xvd2VyQ2FzZSgpXSxuK29bMF0ubGVuZ3RoKTotMX0sYjpmdW5jdGlvbiBJKHQsZSxuKXt2YXIgbz1iLmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIG8/KHQubT15W29bMF0udG9Mb3dlckNhc2UoKV0sbitvWzBdLmxlbmd0aCk6LTF9LEI6ZnVuY3Rpb24gSCh0LGUsbil7dmFyIG89Zy5leGVjKGUuc2xpY2UobikpO3JldHVybiBvPyh0Lm09aFtvWzBdLnRvTG93ZXJDYXNlKCldLG4rb1swXS5sZW5ndGgpOi0xfSxjOmZ1bmN0aW9uIEYodCxuLG8pe3JldHVybiBHKHQsZSxuLG8pfSxkOmRudCxlOmRudCxmOmhudCxnOnJudCxHOmFudCxIOm1udCxJOm1udCxqOnBudCxMOmdudCxtOmNudCxNOnVudCxwOmZ1bmN0aW9uIEwodCxlLG4pe3ZhciBvPWMuZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gbz8odC5wPWRbb1swXS50b0xvd2VyQ2FzZSgpXSxuK29bMF0ubGVuZ3RoKTotMX0scTpsbnQsUTp5bnQsczpfbnQsUzpmbnQsdTplbnQsVTpubnQsVjpvbnQsdzp0bnQsVzppbnQseDpmdW5jdGlvbiBCKHQsZSxvKXtyZXR1cm4gRyh0LG4sZSxvKX0sWDpmdW5jdGlvbiBWKHQsZSxuKXtyZXR1cm4gRyh0LG8sZSxuKX0seTpybnQsWTphbnQsWjpzbnQsIiUiOmJudH07ZnVuY3Rpb24gaih0LGUpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgbyxpLGEscj1bXSxzPS0xLGw9MCxjPXQubGVuZ3RoO2ZvcihuIGluc3RhbmNlb2YgRGF0ZXx8KG49bmV3IERhdGUoK24pKTsrK3M8YzspMzc9PT10LmNoYXJDb2RlQXQocykmJihyLnB1c2godC5zbGljZShsLHMpKSxudWxsIT0oaT1ZZXRbbz10LmNoYXJBdCgrK3MpXSk/bz10LmNoYXJBdCgrK3MpOmk9ImUiPT09bz8iICI6IjAiLChhPWVbb10pJiYobz1hKG4saSkpLHIucHVzaChvKSxsPXMrMSk7cmV0dXJuIHIucHVzaCh0LnNsaWNlKGwscykpLHIuam9pbigiIil9fWZ1bmN0aW9uIFUodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIG8saSxhPVVldCgxOTAwLHZvaWQgMCwxKTtpZihHKGEsdCxuKz0iIiwwKSE9bi5sZW5ndGgpcmV0dXJuIG51bGw7aWYoIlEiaW4gYSlyZXR1cm4gbmV3IERhdGUoYS5RKTtpZigicyJpbiBhKXJldHVybiBuZXcgRGF0ZSgxZTMqYS5zKygiTCJpbiBhP2EuTDowKSk7aWYoZSYmISgiWiJpbiBhKSYmKGEuWj0wKSwicCJpbiBhJiYoYS5IPWEuSCUxMisxMiphLnApLHZvaWQgMD09PWEubSYmKGEubT0icSJpbiBhP2EucTowKSwiViJpbiBhKXtpZihhLlY8MXx8YS5WPjUzKXJldHVybiBudWxsOyJ3ImluIGF8fChhLnc9MSksIloiaW4gYT8oaT0obz1qZXQoVWV0KGEueSwwLDEpKSkuZ2V0VVRDRGF5KCksbz1pPjR8fDA9PT1pP0hldC5jZWlsKG8pOkhldChvKSxvPU5ldC5vZmZzZXQobyw3KihhLlYtMSkpLGEueT1vLmdldFVUQ0Z1bGxZZWFyKCksYS5tPW8uZ2V0VVRDTW9udGgoKSxhLmQ9by5nZXRVVENEYXRlKCkrKGEudys2KSU3KTooaT0obz1WZXQoVWV0KGEueSwwLDEpKSkuZ2V0RGF5KCksbz1pPjR8fDA9PT1pP0RldC5jZWlsKG8pOkRldChvKSxvPVBldC5vZmZzZXQobyw3KihhLlYtMSkpLGEueT1vLmdldEZ1bGxZZWFyKCksYS5tPW8uZ2V0TW9udGgoKSxhLmQ9by5nZXREYXRlKCkrKGEudys2KSU3KX1lbHNlKCJXImluIGF8fCJVImluIGEpJiYoInciaW4gYXx8KGEudz0idSJpbiBhP2EudSU3OiJXImluIGE/MTowKSxpPSJaImluIGE/amV0KFVldChhLnksMCwxKSkuZ2V0VVRDRGF5KCk6VmV0KFVldChhLnksMCwxKSkuZ2V0RGF5KCksYS5tPTAsYS5kPSJXImluIGE/KGEudys2KSU3KzcqYS5XLShpKzUpJTc6YS53KzcqYS5VLShpKzYpJTcpO3JldHVybiJaImluIGE/KGEuSCs9YS5aLzEwMHwwLGEuTSs9YS5aJTEwMCxqZXQoYSkpOlZldChhKX19ZnVuY3Rpb24gRyh0LGUsbixvKXtmb3IodmFyIGksYSxyPTAscz1lLmxlbmd0aCxsPW4ubGVuZ3RoO3I8czspe2lmKG8+PWwpcmV0dXJuLTE7aWYoMzc9PT0oaT1lLmNoYXJDb2RlQXQocisrKSkpe2lmKGk9ZS5jaGFyQXQocisrKSwhKGE9VFtpIGluIFlldD9lLmNoYXJBdChyKyspOmldKXx8KG89YSh0LG4sbykpPDApcmV0dXJuLTF9ZWxzZSBpZihpIT1uLmNoYXJDb2RlQXQobysrKSlyZXR1cm4tMX1yZXR1cm4gb31yZXR1cm4gXy54PWoobixfKSxfLlg9aihvLF8pLF8uYz1qKGUsXyksdy54PWoobix3KSx3Llg9aihvLHcpLHcuYz1qKGUsdykse2Zvcm1hdDpmdW5jdGlvbih0KXt2YXIgZT1qKHQrPSIiLF8pO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9LHBhcnNlOmZ1bmN0aW9uKHQpe3ZhciBlPVUodCs9IiIsITEpO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9LHV0Y0Zvcm1hdDpmdW5jdGlvbih0KXt2YXIgZT1qKHQrPSIiLHcpO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9LHV0Y1BhcnNlOmZ1bmN0aW9uKHQpe3ZhciBlPVUodCs9IiIsITApO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9fX0pKHQpLFdldD1HZXQuZm9ybWF0fSkoe2RhdGVUaW1lOiIleCwgJVgiLGRhdGU6IiUtbS8lLWQvJVkiLHRpbWU6IiUtSTolTTolUyAlcCIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTt2YXIgZG90PTMxNTM2ZTY7ZnVuY3Rpb24gcG90KHQpe3JldHVybiBuZXcgRGF0ZSh0KX1mdW5jdGlvbiBtb3QodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlPyt0OituZXcgRGF0ZSgrdCl9ZnVuY3Rpb24gdW90KHQsZSxuLG8saSxhLHIscyxsKXt2YXIgYz0kdHQoWXR0LFl0dCksZD1jLmludmVydCxwPWMuZG9tYWluLG09bCgiLiVMIiksdT1sKCI6JVMiKSxmPWwoIiVJOiVNIiksZz1sKCIlSSAlcCIpLGg9bCgiJWEgJWQiKSxiPWwoIiViICVkIikseT1sKCIlQiIpLF89bCgiJVkiKSxDPVtbciwxLDFlM10sW3IsNSw1ZTNdLFtyLDE1LDE1ZTNdLFtyLDMwLDNlNF0sW2EsMSw2ZTRdLFthLDUsM2U1XSxbYSwxNSw5ZTVdLFthLDMwLDE4ZTVdLFtpLDEsMzZlNV0sW2ksMywxMDhlNV0sW2ksNiwyMTZlNV0sW2ksMTIsNDMyZTVdLFtvLDEsODY0ZTVdLFtvLDIsMTcyOGU1XSxbbiwxLDYwNDhlNV0sW2UsMSwyNTkyZTZdLFtlLDMsNzc3NmU2XSxbdCwxLGRvdF1dO2Z1bmN0aW9uIE0ocyl7cmV0dXJuKHIocyk8cz9tOmEocyk8cz91Omkocyk8cz9mOm8ocyk8cz9nOmUocyk8cz9uKHMpPHM/aDpiOnQocyk8cz95Ol8pKHMpfWZ1bmN0aW9uIHYoZSxuLG8saSl7aWYobnVsbD09ZSYmKGU9MTApLCJudW1iZXIiPT10eXBlb2YgZSl7dmFyIGE9TWF0aC5hYnMoby1uKS9lLHI9ZDUoKGZ1bmN0aW9uKHQpe3JldHVybiB0WzJdfSkpLnJpZ2h0KEMsYSk7cj09PUMubGVuZ3RoPyhpPXY1KG4vZG90LG8vZG90LGUpLGU9dCk6cj8oaT0ocj1DW2EvQ1tyLTFdWzJdPENbcl1bMl0vYT9yLTE6cl0pWzFdLGU9clswXSk6KGk9TWF0aC5tYXgodjUobixvLGUpLDEpLGU9cyl9cmV0dXJuIG51bGw9PWk/ZTplLmV2ZXJ5KGkpfXJldHVybiBjLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IERhdGUoZCh0KSl9LGMuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3AoSHR0LmNhbGwodCxtb3QpKTpwKCkubWFwKHBvdCl9LGMudGlja3M9ZnVuY3Rpb24odCxlKXt2YXIgbixvPXAoKSxpPW9bMF0sYT1vW28ubGVuZ3RoLTFdLHI9YTxpO3JldHVybiByJiYobj1pLGk9YSxhPW4pLG49KG49dih0LGksYSxlKSk/bi5yYW5nZShpLGErMSk6W10scj9uLnJldmVyc2UoKTpufSxjLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09ZT9NOmwoZSl9LGMubmljZT1mdW5jdGlvbih0LGUpe3ZhciBuPXAoKTtyZXR1cm4odD12KHQsblswXSxuW24ubGVuZ3RoLTFdLGUpKT9wKG5ldChuLHQpKTpjfSxjLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gSnR0KGMsdW90KHQsZSxuLG8saSxhLHIscyxsKSl9LGN9ZnVuY3Rpb24gZm90KCl7cmV0dXJuIE50dC5hcHBseSh1b3QoVGV0LFJldCxrZXQsUGV0LE9ldCx4ZXQsdmV0LGhldCxXZXQpLmRvbWFpbihbbmV3IERhdGUoMmUzLDAsMSksbmV3IERhdGUoMmUzLDAsMildKSxhcmd1bWVudHMpfWZ1bmN0aW9uIGdvdCh0KXtmb3IodmFyIGU9dC5sZW5ndGgvNnwwLG49bmV3IEFycmF5KGUpLG89MDtvPGU7KW5bb109IiMiK3Quc2xpY2UoNipvLDYqKytvKTtyZXR1cm4gbn1mdW5jdGlvbiBob3QodCl7cmV0dXJuIEg3KHRbdC5sZW5ndGgtMV0pfXZhciBib3Q9aG90KG5ldyBBcnJheSgzKS5jb25jYXQoImRlZWJmNzllY2FlMTMxODJiZCIsImVmZjNmZmJkZDdlNzZiYWVkNjIxNzFiNSIsImVmZjNmZmJkZDdlNzZiYWVkNjMxODJiZDA4NTE5YyIsImVmZjNmZmM2ZGJlZjllY2FlMTZiYWVkNjMxODJiZDA4NTE5YyIsImVmZjNmZmM2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NDU5NCIsImY3ZmJmZmRlZWJmN2M2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NDU5NCIsImY3ZmJmZmRlZWJmN2M2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NTE5YzA4MzA2YiIpLm1hcChnb3QpKSx5b3Q9aG90KG5ldyBBcnJheSgzKS5jb25jYXQoImYwZjBmMGJkYmRiZDYzNjM2MyIsImY3ZjdmN2NjY2NjYzk2OTY5NjUyNTI1MiIsImY3ZjdmN2NjY2NjYzk2OTY5NjYzNjM2MzI1MjUyNSIsImY3ZjdmN2Q5ZDlkOWJkYmRiZDk2OTY5NjYzNjM2MzI1MjUyNSIsImY3ZjdmN2Q5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUyNTI1MjI1MjUyNSIsImZmZmZmZmYwZjBmMGQ5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUyNTI1MjI1MjUyNSIsImZmZmZmZmYwZjBmMGQ5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUyNTI1MjI1MjUyNTAwMDAwMCIpLm1hcChnb3QpKSxfb3Q9aG90KG5ldyBBcnJheSgzKS5jb25jYXQoImZlZTBkMmZjOTI3MmRlMmQyNiIsImZlZTVkOWZjYWU5MWZiNmE0YWNiMTgxZCIsImZlZTVkOWZjYWU5MWZiNmE0YWRlMmQyNmE1MGYxNSIsImZlZTVkOWZjYmJhMWZjOTI3MmZiNmE0YWRlMmQyNmE1MGYxNSIsImZlZTVkOWZjYmJhMWZjOTI3MmZiNmE0YWVmM2IyY2NiMTgxZDk5MDAwZCIsImZmZjVmMGZlZTBkMmZjYmJhMWZjOTI3MmZiNmE0YWVmM2IyY2NiMTgxZDk5MDAwZCIsImZmZjVmMGZlZTBkMmZjYmJhMWZjOTI3MmZiNmE0YWVmM2IyY2NiMTgxZGE1MGYxNTY3MDAwZCIpLm1hcChnb3QpKTtmdW5jdGlvbiBDb3QodCl7cmV0dXJuIGZ1bmN0aW9uIGUoKXtyZXR1cm4gdH19ZnVuY3Rpb24gTW90KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiB2b3QodCl7cmV0dXJuIG5ldyBNb3QodCl9ZnVuY3Rpb24geG90KHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIE9vdCh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBQb3QoKXt2YXIgdD14b3QsZT1Pb3Qsbj1Db3QoITApLG89bnVsbCxpPXZvdCxhPW51bGw7ZnVuY3Rpb24gcihyKXt2YXIgcyxsLGMsZD1yLmxlbmd0aCxwPSExO2ZvcihudWxsPT1vJiYoYT1pKGM9bXR0KCkpKSxzPTA7czw9ZDsrK3MpIShzPGQmJm4obD1yW3NdLHMscikpPT09cCYmKChwPSFwKT9hLmxpbmVTdGFydCgpOmEubGluZUVuZCgpKSxwJiZhLnBvaW50KCt0KGwscyxyKSwrZShsLHMscikpO2lmKGMpcmV0dXJuIGE9bnVsbCxjKyIifHxudWxsfXJldHVybiByLng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpDb3QoK2UpLHIpOnR9LHIueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkNvdCgrdCkscik6ZX0sci5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Q290KCEhdCkscik6bn0sci5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LG51bGwhPW8mJihhPWkobykpLHIpOml9LHIuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9vPWE9bnVsbDphPWkobz10KSxyKTpvfSxyfWZ1bmN0aW9uIHdvdCh0LGUsbil7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHQuX3gxK3QuX2sqKHQuX3gyLXQuX3gwKSx0Ll95MSt0Ll9rKih0Ll95Mi10Ll95MCksdC5feDIrdC5fayoodC5feDEtZSksdC5feTIrdC5fayoodC5feTEtbiksdC5feDIsdC5feTIpfWZ1bmN0aW9uIGtvdCh0LGUpe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9rPSgxLWUpLzZ9ZnVuY3Rpb24gU290KHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPWV9TW90LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsZSk7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7ZGVmYXVsdDp0aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpfX19LGtvdC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6d290KHRoaXMsdGhpcy5feDEsdGhpcy5feTEpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtzd2l0Y2godD0rdCxlPStlLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsZSk6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxlKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94MT10LHRoaXMuX3kxPWU7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7ZGVmYXVsdDp3b3QodGhpcyx0LGUpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9ZX19LFNvdC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95Mil9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LGUpe2lmKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7dmFyIG49dGhpcy5feDItdCxvPXRoaXMuX3kyLWU7dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhuKm4rbypvLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsZSk6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxlKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0OiEoZnVuY3Rpb24gaSh0LGUsbil7dmFyIG89dC5feDEsaT10Ll95MSxhPXQuX3gyLHI9dC5feTI7aWYodC5fbDAxX2E+MWUtMTIpe3ZhciBzPTIqdC5fbDAxXzJhKzMqdC5fbDAxX2EqdC5fbDEyX2ErdC5fbDEyXzJhLGw9Myp0Ll9sMDFfYSoodC5fbDAxX2ErdC5fbDEyX2EpO289KG8qcy10Ll94MCp0Ll9sMTJfMmErdC5feDIqdC5fbDAxXzJhKS9sLGk9KGkqcy10Ll95MCp0Ll9sMTJfMmErdC5feTIqdC5fbDAxXzJhKS9sfWlmKHQuX2wyM19hPjFlLTEyKXt2YXIgYz0yKnQuX2wyM18yYSszKnQuX2wyM19hKnQuX2wxMl9hK3QuX2wxMl8yYSxkPTMqdC5fbDIzX2EqKHQuX2wyM19hK3QuX2wxMl9hKTthPShhKmMrdC5feDEqdC5fbDIzXzJhLWUqdC5fbDEyXzJhKS9kLHI9KHIqYyt0Ll95MSp0Ll9sMjNfMmEtbip0Ll9sMTJfMmEpL2R9dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKG8saSxhLHIsdC5feDIsdC5feTIpfSkodGhpcyx0LGUpfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPWV9fTt2YXIgRG90PShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIGU/bmV3IFNvdCh0LGUpOm5ldyBrb3QodCwwKX1yZXR1cm4gbi5hbHBoYT1mdW5jdGlvbihlKXtyZXR1cm4gdCgrZSl9LG59KSguNSk7Y29uc3QgRW90PTFlNCxSb3Q9LjAwMSxBb3Q9RXR0KCIuMn5lIiksVG90PUV0dCgiLjR+ciIpLE5vdD1FdHQoIix+Iik7ZnVuY3Rpb24gem90KHQpe2lmKDA9PT10KXJldHVybiIwIjtjb25zdCBlPU1hdGguYWJzKHQpO3JldHVybiBlPj1Fb3R8fGU8Um90P0FvdCh0KTpUb3QodCl9Y29uc3QgSW90PXtmb3JtYXRUaWNrOnpvdCxmb3JtYXRTaG9ydDp6b3QsZm9ybWF0UmVhZGFibGUodCl7Y29uc3QgZT1NYXRoLmFicyh0KTtyZXR1cm4gZT49RW90fHxlPFJvdD9Bb3QodCk6Tm90KHQpfSxmb3JtYXRMb25nOk5vdH0sSG90PW5ldyBJbnRsLk51bWJlckZvcm1hdCh2b2lkIDAse21heGltdW1GcmFjdGlvbkRpZ2l0czozfSk7ZnVuY3Rpb24gRm90KHQpe3JldHVybiBIb3QuZm9ybWF0KHQpfWNvbnN0IExvdD17Zm9ybWF0VGljazpGb3QsZm9ybWF0U2hvcnQ6Rm90LGZvcm1hdFJlYWRhYmxlOkZvdCxmb3JtYXRMb25nOkZvdH0sQm90PUV0dCgiMC4zfnMiKSxWb3Q9RXR0KCIsLjN+ZiIpO2Z1bmN0aW9uIGpvdCh0KXtjb25zdCBlPU1hdGguYWJzKHQpO3JldHVybiBlPj1Fb3R8fGU8Um90P0JvdCh0KTpWb3QodCl9Y29uc3QgVW90PXtmb3JtYXRUaWNrOmpvdCxmb3JtYXRTaG9ydDpqb3QsZm9ybWF0UmVhZGFibGU6am90LGZvcm1hdExvbmc6am90fSxHb3Q9MzZlNSxXb3Q9ODY0ZTUsWW90PTMxNTM2ZTYscW90PUV0dCgiLjR+Iik7ZnVuY3Rpb24gWm90KHQpe2lmKDA9PT10KXJldHVybiIwIjtsZXQgZT1NYXRoLnNpZ24odCk+MD8iIjoiLSI7Y29uc3Qgbj1NYXRoLmFicyh0KTtyZXR1cm4gZSs9bjwxZTM/YCR7cW90KG4pfSBtc2A6bjw2ZTQ/YCR7cW90KG4vMWUzKX0gc2VjYDpuPEdvdD9gJHtxb3Qobi82ZTQpfSBtaW5gOm48V290P2Ake3FvdChuL0dvdCl9IGhyYDpuPFlvdD9gJHtxb3Qobi9Xb3QpfSBkYXlgOmAke3FvdChuL1lvdCl9IHlyYCxlfWNvbnN0IFhvdD17Zm9ybWF0VGljazpab3QsZm9ybWF0U2hvcnQ6Wm90LGZvcm1hdFJlYWRhYmxlOlpvdCxmb3JtYXRMb25nOlpvdH0sS290PWZvdCgpLnRpY2tGb3JtYXQoKTtsZXQgSm90O2NvbnN0IFFvdD17Zm9ybWF0VGljazp0PT5Lb3QobmV3IERhdGUodCkpLGZvcm1hdFNob3J0OnQ9Pm5ldyBEYXRlKHQpLnRvTG9jYWxlU3RyaW5nKEpvdCx7eWVhcjoibnVtZXJpYyIsbW9udGg6InNob3J0IixkYXk6Im51bWVyaWMiLGhvdXI6Im51bWVyaWMiLG1pbnV0ZToibnVtZXJpYyIsc2Vjb25kOiJudW1lcmljIn0pLGZvcm1hdFJlYWRhYmxlOnQ9Pm5ldyBEYXRlKHQpLnRvTG9jYWxlU3RyaW5nKEpvdCx7eWVhcjoibnVtZXJpYyIsbW9udGg6InNob3J0IixkYXk6Im51bWVyaWMiLGhvdXI6Im51bWVyaWMiLG1pbnV0ZToibnVtZXJpYyIsc2Vjb25kOiJudW1lcmljIix0aW1lWm9uZU5hbWU6InNob3J0In0pLGZvcm1hdExvbmc6dD0+bmV3IERhdGUodCkudG9Mb2NhbGVTdHJpbmcoSm90LHt5ZWFyOiJudW1lcmljIixtb250aDoibG9uZyIsZGF5OiJudW1lcmljIixob3VyOiJudW1lcmljIixtaW51dGU6Im51bWVyaWMiLHNlY29uZDoibnVtZXJpYyIsdGltZVpvbmVOYW1lOiJzaG9ydCIsZnJhY3Rpb25hbFNlY29uZERpZ2l0czozfSl9O2Z1bmN0aW9uICRvdCh0KXtzd2l0Y2godCl7Y2FzZSBKMi5MSU5FQVI6cmV0dXJuIG5ldyB0aXQ7Y2FzZSBKMi5MT0cxMDpyZXR1cm4gbmV3IGVpdDtjYXNlIEoyLlRJTUU6cmV0dXJuIG5ldyBuaXQ7ZGVmYXVsdDp0aHJvdyBuZXcgUmFuZ2VFcnJvcihgU2NhbGVUeXBlICR7dH0gbm90IHN1cHBvcnRlZC5gKX19Y2xhc3MgdGl0e2NvbnN0cnVjdG9yKCl7dGhpcy5kZWZhdWx0Rm9ybWF0dGVyPUlvdH10cmFuc2Zvcm0odCxlLG4pe2NvbnN0W28saV09dCxhPWktbyxbcixzXT1lO3JldHVybiAwPT09YT9yOihzLXIpL2EqKG4tbykrcn1mb3J3YXJkKHQsZSxuKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0odCxlLG4pfXJldmVyc2UodCxlLG4pe3JldHVybiB0aGlzLnRyYW5zZm9ybShlLHQsbil9bmljZURvbWFpbih0KXtsZXRbZSxuXT10O2lmKG48ZSl0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgaW5wdXQ6IG1pbiBpcyBsYXJnZXIgdGhhbiBtYXgiKTtpZihuPT09ZSlyZXR1cm4gMD09PWU/Wy0xLDFdOmU8MD9bMiplLDBdOlswLDIqZV07Y29uc3Qgbz1lZXQoKSxpPS4wNSoobi1lK051bWJlci5FUFNJTE9OKSxbYSxyXT1vLmRvbWFpbihbZS1pLG4raV0pLm5pY2UoKS5kb21haW4oKTtyZXR1cm5bYSxyXX10aWNrcyh0LGUpe3JldHVybiBlZXQoKS5kb21haW4odCkudGlja3MoZSl9aXNTYWZlTnVtYmVyKHQpe3JldHVybiBOdW1iZXIuaXNGaW5pdGUodCl9fWNsYXNzIGVpdHtjb25zdHJ1Y3Rvcigpe3RoaXMuZGVmYXVsdEZvcm1hdHRlcj1Jb3R9dHJhbnNmb3JtKHQpe3JldHVybiBNYXRoLmxvZzEwKHQ+MD90Ok51bWJlci5NSU5fVkFMVUUpfXVudHJhbnNmb3JtKHQpe3JldHVybiBNYXRoLmV4cCh0L01hdGguTE9HMTBFKX1mb3J3YXJkKHQsZSxuKXtpZihuPD0wKXJldHVybiBlWzBdO2NvbnN0W28saV09dCxbYSxyXT1lLHM9dGhpcy50cmFuc2Zvcm0obyksbD10aGlzLnRyYW5zZm9ybShpKS1zLGM9ci1hO3JldHVybiBuPXRoaXMudHJhbnNmb3JtKG4pLGMvKGwrTnVtYmVyLkVQU0lMT04pKihuLXMpK2F9cmV2ZXJzZSh0LGUsbil7Y29uc3RbbyxpXT10LFthLHJdPWUscz10aGlzLnRyYW5zZm9ybShvKSxsPXRoaXMudHJhbnNmb3JtKGkpO3JldHVybiB0aGlzLnVudHJhbnNmb3JtKChsLXMpLyhyLWErTnVtYmVyLkVQU0lMT04pKihuLWEpK3MpfW5pY2VEb21haW4odCl7Y29uc3RbZSxuXT10O2lmKGU+bil0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgaW5wdXQ6IG1pbiBpcyBsYXJnZXIgdGhhbiBtYXgiKTtjb25zdCBvPU1hdGgubWF4KGUsTnVtYmVyLk1JTl9WQUxVRSksaT1NYXRoLm1heChuLE51bWJlci5NSU5fVkFMVUUpO3JldHVybiBuPD0wP1tOdW1iZXIuTUlOX1ZBTFVFLDFdOltNYXRoLm1heChOdW1iZXIuTUlOX1ZBTFVFLC41Km8pLDIqaV19dGlja3ModCxlKXtjb25zdCBuPXRbMF08PTA/TnVtYmVyLk1JTl9WQUxVRTp0WzBdLG89dFsxXTw9MD9OdW1iZXIuTUlOX1ZBTFVFOnRbMV0saT1wZXQoKS5kb21haW4oW24sb10pLnRpY2tzKGUpO3JldHVybiBpLmxlbmd0aD9pOnR9aXNTYWZlTnVtYmVyKHQpe3JldHVybiBOdW1iZXIuaXNGaW5pdGUodCkmJnQ+MH19Y2xhc3Mgbml0e2NvbnN0cnVjdG9yKCl7dGhpcy5zY2FsZT1mb3QoKSx0aGlzLmRlZmF1bHRGb3JtYXR0ZXI9UW90fWZvcndhcmQodCxlLG4pe3JldHVybiB0aGlzLnNjYWxlLmRvbWFpbih0KS5yYW5nZShlKShuKX1yZXZlcnNlKHQsZSxuKXtyZXR1cm4gdGhpcy5zY2FsZS5kb21haW4odCkucmFuZ2UoZSkuaW52ZXJ0KG4pLmdldFRpbWUoKX1uaWNlRG9tYWluKHQpe2NvbnN0W2Usbl09dGhpcy5zY2FsZS5kb21haW4odCkubmljZSgpLmRvbWFpbigpO3JldHVybltlLmdldFRpbWUoKSxuLmdldFRpbWUoKV19dGlja3ModCxlKXtyZXR1cm4gdGhpcy5zY2FsZS5kb21haW4odCkudGlja3MoZSkubWFwKCh0PT50LmdldFRpbWUoKSkpfWlzU2FmZU51bWJlcih0KXtyZXR1cm4gTnVtYmVyLmlzRmluaXRlKHQpfX1jb25zdCBvaXQ9Qm9vbGVhbihzZWxmLmhhc093blByb3BlcnR5KCJkb2N1bWVudCIpJiZkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCJ3ZWJnbDIiKSk7ZnVuY3Rpb24gaWl0KCl7cmV0dXJuIHNlbGYuaGFzT3duUHJvcGVydHkoIk9mZnNjcmVlbkNhbnZhcyIpfWZ1bmN0aW9uIGFpdCh0LGUpe2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspaWYodFtuXSE9PWVbbl0pcmV0dXJuITE7cmV0dXJuITB9Y2xhc3Mgcml0e2NvbnN0cnVjdG9yKCl7dGhpcy54U2NhbGU9JG90KEoyLkxJTkVBUiksdGhpcy55U2NhbGU9JG90KEoyLkxJTkVBUiksdGhpcy5kb21Db250YWluZXJSZWN0PXt4OjAsd2lkdGg6MSx5OjAsaGVpZ2h0OjF9LHRoaXMubGFzdFVwZGF0ZWQ9MCx0aGlzLmN1cnJlbnRWaWV3Qm94UmVjdD17eDowLHdpZHRoOjEseTowLGhlaWdodDoxfX1nZXRVcGRhdGVJZGVudGlmaWVyKCl7cmV0dXJuIHRoaXMubGFzdFVwZGF0ZWR9dXBkYXRlSWRlbnRpZmllcigpe3RoaXMubGFzdFVwZGF0ZWQrK31pc1lBeGlzUG9pbnRlZERvd24oKXtyZXR1cm4hMH1zZXRYU2NhbGUodCl7dGhpcy54U2NhbGU9dCx0aGlzLnVwZGF0ZUlkZW50aWZpZXIoKX1zZXRZU2NhbGUodCl7dGhpcy55U2NhbGU9dCx0aGlzLnVwZGF0ZUlkZW50aWZpZXIoKX1nZXRDdXJyZW50Vmlld0JveFJlY3QoKXtyZXR1cm4gdGhpcy5jdXJyZW50Vmlld0JveFJlY3R9c2V0Vmlld0JveFJlY3QodCl7dGhpcy5jdXJyZW50Vmlld0JveFJlY3Q9dCx0aGlzLnVwZGF0ZUlkZW50aWZpZXIoKX1zZXREb21Db250YWluZXJSZWN0KHQpe3RoaXMuZG9tQ29udGFpbmVyUmVjdD10LHRoaXMudXBkYXRlSWRlbnRpZmllcigpfXRyYW5zZm9ybURhdGFUb1VpQ29vcmQodCxlKXtjb25zdCBuPXQsbz0oZnVuY3Rpb24gaSh0KXtyZXR1cm57eDpbdC54LHQueCt0LndpZHRoXSx5Olt0LnksdC55K3QuaGVpZ2h0XX19KSh0aGlzLmN1cnJlbnRWaWV3Qm94UmVjdCk7cmV0dXJuW3RoaXMueFNjYWxlLmZvcndhcmQoby54LFtuLngsbi54K24ud2lkdGhdLGVbMF0pLHRoaXMueVNjYWxlLmZvcndhcmQoby55LHRoaXMuaXNZQXhpc1BvaW50ZWREb3duKCk/W24ueStuLmhlaWdodCxuLnldOltuLnksbi55K24uaGVpZ2h0XSxlWzFdKV19fWZ1bmN0aW9uIHNpdCh0LGUsbixvKXtjb25zdHtjb2xvcjppLHZpc2libGU6YSxvcGFjaXR5OnJ9PW87bGV0IHM9dDtpZihzKXtpZighYSlyZXR1cm4gcy5zdHlsZS5kaXNwbGF5PSJub25lIixzfWVsc2V7aWYoIWEpcmV0dXJuIG51bGw7cz1lKCl9cmV0dXJuIHM9bihzKSxzLnN0eWxlLmRpc3BsYXk9IiIscy5zdHlsZS5zdHJva2U9aSxzLnN0eWxlLm9wYWNpdHk9U3RyaW5nKG51bGwhPXI/cjoxKSxzfWNsYXNzIGxpdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN2Zz10fWZsdXNoKCl7fW9uUmVzaXplKHQpe31kZXN0cm95T2JqZWN0KHQpe3RoaXMuc3ZnLnJlbW92ZUNoaWxkKHQuZG9tKX1zZXRVc2VEYXJrTW9kZSh0KXt9Y3JlYXRlUGF0aERTdHJpbmcodCl7aWYoIXQubGVuZ3RoKXJldHVybiIiO2NvbnN0IGU9bmV3IEFycmF5KHQubGVuZ3RoLzIpO2VbMF09YE0ke3RbMF19LCR7dFsxXX1gO2ZvcihsZXQgbj0xO248dC5sZW5ndGgvMjtuKyspZVtuXT1gTCR7dFsyKm5dfSwke3RbMipuKzFdfWA7cmV0dXJuIGUuam9pbigiIil9Y3JlYXRlT3JVcGRhdGVMaW5lT2JqZWN0KHQsZSxuKXtjb25zdCBvPXNpdChudWxsPT10P3ZvaWQgMDp0LmRvbSwoKCk9Pntjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJwYXRoIik7dC5zdHlsZS5maWxsPSJub25lIjtjb25zdCBuPXRoaXMuY3JlYXRlUGF0aERTdHJpbmcoZSk7cmV0dXJuIHQuc2V0QXR0cmlidXRlKCJkIixuKSx0aGlzLnN2Zy5hcHBlbmRDaGlsZCh0KSx0fSksKG49PntpZighKG51bGw9PXQ/dm9pZCAwOnQuZGF0YSl8fCFhaXQoZSxudWxsPT10P3ZvaWQgMDp0LmRhdGEpKXtjb25zdCB0PXRoaXMuY3JlYXRlUGF0aERTdHJpbmcoZSk7bi5zZXRBdHRyaWJ1dGUoImQiLHQpfXJldHVybiBufSksbik7cmV0dXJuIG51bGw9PT1vP251bGw6KG8uc3R5bGUuc3Ryb2tlV2lkdGg9U3RyaW5nKG4ud2lkdGgpLHtkb206byxkYXRhOmV9KX1jcmVhdGVPclVwZGF0ZVRyaWFuZ2xlT2JqZWN0KHQsZSxuKXtjb25zdHtzaXplOm8sY29sb3I6aX09bixhPW8qTWF0aC5zcXJ0KDMpLzIscj1uZXcgRmxvYXQzMkFycmF5KFtlLngtby8yLGUueSthLzMsZS54K28vMixlLnkrYS8zLGUueCxlLnktMiphLzNdKSxzPXNpdChudWxsPT10P3ZvaWQgMDp0LmRvbSwoKCk9Pntjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJwYXRoIik7dC5jbGFzc0xpc3QuYWRkKCJ0cmlhbmdsZSIpLHQuc3R5bGUuZmlsbD0ibm9uZSI7Y29uc3QgZT10aGlzLmNyZWF0ZVBhdGhEU3RyaW5nKHIpO3JldHVybiB0LnNldEF0dHJpYnV0ZSgiZCIsZSsiWiIpLHRoaXMuc3ZnLmFwcGVuZENoaWxkKHQpLHR9KSwodD0+e2NvbnN0IGU9dGhpcy5jcmVhdGVQYXRoRFN0cmluZyhyKTtyZXR1cm4gdC5zZXRBdHRyaWJ1dGUoImQiLGUrIloiKSx0fSksbik7cmV0dXJuIG51bGw9PT1zP251bGw6KHMuc3R5bGUuZmlsbD1pLHtkb206cyxkYXRhOnJ9KX1jcmVhdGVPclVwZGF0ZUNpcmNsZU9iamVjdCh0LGUsbil7Y29uc3R7Y29sb3I6byxyYWRpdXM6aX09bixhPXNpdChudWxsPT10P3ZvaWQgMDp0LmRvbSwoKCk9Pntjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJjaXJjbGUiKTtyZXR1cm4gdC5zdHlsZS5maWxsPW8sdC5zZXRBdHRyaWJ1dGUoImN4IixTdHJpbmcoZS54KSksdC5zZXRBdHRyaWJ1dGUoImN5IixTdHJpbmcoZS55KSksdC5zZXRBdHRyaWJ1dGUoInIiLFN0cmluZyhpKSksdGhpcy5zdmcuYXBwZW5kQ2hpbGQodCksdH0pLCh0PT4odC5zdHlsZS5maWxsPW8sdC5zZXRBdHRyaWJ1dGUoImN4IixTdHJpbmcoZS54KSksdC5zZXRBdHRyaWJ1dGUoImN5IixTdHJpbmcoZS55KSksdC5zZXRBdHRyaWJ1dGUoInIiLFN0cmluZyhpKSksdCkpLG4pO3JldHVybiBudWxsPT09YT9udWxsOntkb206YSxkYXRhOmV9fWNyZWF0ZU9yVXBkYXRlVHJhcGV6b2lkT2JqZWN0KHQsZSxuLG8pe2lmKGUueSE9PW4ueSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5wdXQgZXJyb3I6IHN0YXJ0LnkgIT0gZW5kLnkuIik7Y29uc3R7YWx0aXR1ZGU6aSxjb2xvcjphfT1vLHI9Mi9NYXRoLnNxcnQoMykqaSxzPW5ldyBGbG9hdDMyQXJyYXkoW2UueC1yLzIsZS55K2kvMixlLngsZS55LWkvMixuLngsbi55LWkvMixuLngrci8yLG4ueStpLzJdKSxsPXNpdChudWxsPT10P3ZvaWQgMDp0LmRvbSwoKCk9Pntjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJwYXRoIik7dC5jbGFzc0xpc3QuYWRkKCJ0cmFwZXpvaWQiKSx0LnN0eWxlLmZpbGw9Im5vbmUiO2NvbnN0IGU9dGhpcy5jcmVhdGVQYXRoRFN0cmluZyhzKTtyZXR1cm4gdC5zZXRBdHRyaWJ1dGUoImQiLGUrIloiKSx0aGlzLnN2Zy5hcHBlbmRDaGlsZCh0KSx0fSksKHQ9Pntjb25zdCBlPXRoaXMuY3JlYXRlUGF0aERTdHJpbmcocyk7cmV0dXJuIHQuc2V0QXR0cmlidXRlKCJkIixlKyJaIiksdH0pLG8pO3JldHVybiBudWxsPT09bD9udWxsOihsLnN0eWxlLmZpbGw9YSx7ZG9tOmwsZGF0YTpzfSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgMjAxMC0yMDIxIFRocmVlLmpzIEF1dGhvcnMKICAgICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICAgICAqL2NvbnN0IGNpdD0xMDAsZGl0PTMwMSxwaXQ9MzAyLG1pdD0zMDYsdWl0PTFlMyxmaXQ9MTAwMSxnaXQ9MTAwMixoaXQ9MTAwMyxiaXQ9MTAwNix5aXQ9MTAwOCxfaXQ9MTAwOSxDaXQ9MTAxMixNaXQ9MTAxNCx2aXQ9MTAxNSx4aXQ9MTAxNixPaXQ9MTAyMCxQaXQ9MTAyMix3aXQ9MTAyMyxraXQ9MTAyNixTaXQ9MTAyNyxEaXQ9MjMwMCxFaXQ9MjMwMSxSaXQ9MjMwMixBaXQ9MjQwMCxUaXQ9MjQwMSxOaXQ9MjQwMix6aXQ9M2UzLElpdD0zMDAxLEhpdD0zMDA3LEZpdD0zMDAyLExpdD03NjgwLEJpdD0zNTA0NCxWaXQ9MzUwNDgsaml0PSIzMDAgZXMiO2NsYXNzIFVpdHthZGRFdmVudExpc3RlbmVyKHQsZSl7dm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzJiYodGhpcy5fbGlzdGVuZXJzPXt9KTtjb25zdCBuPXRoaXMuX2xpc3RlbmVyczt2b2lkIDA9PT1uW3RdJiYoblt0XT1bXSksLTE9PT1uW3RdLmluZGV4T2YoZSkmJm5bdF0ucHVzaChlKX1oYXNFdmVudExpc3RlbmVyKHQsZSl7aWYodm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzKXJldHVybiExO2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzO3JldHVybiB2b2lkIDAhPT1uW3RdJiYtMSE9PW5bdF0uaW5kZXhPZihlKX1yZW1vdmVFdmVudExpc3RlbmVyKHQsZSl7aWYodm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzKXJldHVybjtjb25zdCBuPXRoaXMuX2xpc3RlbmVyc1t0XTtpZih2b2lkIDAhPT1uKXtjb25zdCB0PW4uaW5kZXhPZihlKTstMSE9PXQmJm4uc3BsaWNlKHQsMSl9fWRpc3BhdGNoRXZlbnQodCl7aWYodm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzKXJldHVybjtjb25zdCBlPXRoaXMuX2xpc3RlbmVyc1t0LnR5cGVdO2lmKHZvaWQgMCE9PWUpe3QudGFyZ2V0PXRoaXM7Y29uc3Qgbj1lLnNsaWNlKDApO2ZvcihsZXQgZT0wLG89bi5sZW5ndGg7ZTxvO2UrKyluW2VdLmNhbGwodGhpcyx0KTt0LnRhcmdldD1udWxsfX19Y29uc3QgR2l0PVtdO2ZvcihsZXQgdD0wO3Q8MjU2O3QrKylHaXRbdF09KHQ8MTY/IjAiOiIiKSt0LnRvU3RyaW5nKDE2KTtjb25zdCBXaXQ9TWF0aC5QSS8xODAsWWl0PTE4MC9NYXRoLlBJO2Z1bmN0aW9uIHFpdCgpe2NvbnN0IHQ9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAsZT00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxuPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLG89NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDA7cmV0dXJuKEdpdFsyNTUmdF0rR2l0W3Q+PjgmMjU1XStHaXRbdD4+MTYmMjU1XStHaXRbdD4+MjQmMjU1XSsiLSIrR2l0WzI1NSZlXStHaXRbZT4+OCYyNTVdKyItIitHaXRbZT4+MTYmMTV8NjRdK0dpdFtlPj4yNCYyNTVdKyItIitHaXRbNjMmbnwxMjhdK0dpdFtuPj44JjI1NV0rIi0iK0dpdFtuPj4xNiYyNTVdK0dpdFtuPj4yNCYyNTVdK0dpdFsyNTUmb10rR2l0W28+PjgmMjU1XStHaXRbbz4+MTYmMjU1XStHaXRbbz4+MjQmMjU1XSkudG9VcHBlckNhc2UoKX1mdW5jdGlvbiBaaXQodCxlLG4pe3JldHVybiBNYXRoLm1heChlLE1hdGgubWluKG4sdCkpfWZ1bmN0aW9uIFhpdCh0LGUsbil7cmV0dXJuKDEtbikqdCtuKmV9ZnVuY3Rpb24gS2l0KHQpe3JldHVybiAwPT0odCZ0LTEpJiYwIT09dH1mdW5jdGlvbiBKaXQodCl7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMikpfWNsYXNzIFFpdHtjb25zdHJ1Y3Rvcih0PTAsZT0wKXt0aGlzLng9dCx0aGlzLnk9ZX1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpcy54fXNldCB3aWR0aCh0KXt0aGlzLng9dH1nZXQgaGVpZ2h0KCl7cmV0dXJuIHRoaXMueX1zZXQgaGVpZ2h0KHQpe3RoaXMueT10fXNldCh0LGUpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Q29tcG9uZW50KHQsZSl7c3dpdGNoKHQpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnkpfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzfWFkZCh0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmFkZFZlY3RvcnModCxlKSk6KHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXMpfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXN9c3ViKHQsZSl7cmV0dXJuIHZvaWQgMCE9PWU/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuc3ViVmVjdG9ycyh0LGUpKToodGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcyl9c3ViU2NhbGFyKHQpe3JldHVybiB0aGlzLngtPXQsdGhpcy55LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXN9ZGl2aWRlKHQpe3JldHVybiB0aGlzLngvPXQueCx0aGlzLnkvPXQueSx0aGlzfWRpdmlkZVNjYWxhcih0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigxL3QpfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxvPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1vWzBdKmUrb1szXSpuK29bNl0sdGhpcy55PW9bMV0qZStvWzRdKm4rb1s3XSx0aGlzfW1pbih0KXtyZXR1cm4gdGhpcy54PU1hdGgubWluKHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1pbih0aGlzLnksdC55KSx0aGlzfW1heCh0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksdC55KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LngsTWF0aC5taW4oZS54LHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LnksTWF0aC5taW4oZS55LHRoaXMueSkpLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueSkpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KHQsTWF0aC5taW4oZSxuKSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD10aGlzLng8MD9NYXRoLmNlaWwodGhpcy54KTpNYXRoLmZsb29yKHRoaXMueCksdGhpcy55PXRoaXMueTwwP01hdGguY2VpbCh0aGlzLnkpOk1hdGguZmxvb3IodGhpcy55KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55fWNyb3NzKHQpe3JldHVybiB0aGlzLngqdC55LXRoaXMueSp0Lnh9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55KX1tYW5oYXR0YW5MZW5ndGgoKXtyZXR1cm4gTWF0aC5hYnModGhpcy54KStNYXRoLmFicyh0aGlzLnkpfW5vcm1hbGl6ZSgpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX1hbmdsZSgpe3JldHVybiBNYXRoLmF0YW4yKC10aGlzLnksLXRoaXMueCkrTWF0aC5QSX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LG49dGhpcy55LXQueTtyZXR1cm4gZSplK24qbn1tYW5oYXR0YW5EaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLngtdC54KStNYXRoLmFicyh0aGlzLnktdC55KX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnl9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUsbil7cmV0dXJuIHZvaWQgMCE9PW4mJmNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpLHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzfXJvdGF0ZUFyb3VuZCh0LGUpe2NvbnN0IG49TWF0aC5jb3MoZSksbz1NYXRoLnNpbihlKSxpPXRoaXMueC10LngsYT10aGlzLnktdC55O3JldHVybiB0aGlzLng9aSpuLWEqbyt0LngsdGhpcy55PWkqbythKm4rdC55LHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXN9fVFpdC5wcm90b3R5cGUuaXNWZWN0b3IyPSEwO2NsYXNzICRpdHtjb25zdHJ1Y3Rvcigpe3RoaXMuZWxlbWVudHM9WzEsMCwwLDAsMSwwLDAsMCwxXSxhcmd1bWVudHMubGVuZ3RoPjAmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDM6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuIil9c2V0KHQsZSxuLG8saSxhLHIscyxsKXtjb25zdCBjPXRoaXMuZWxlbWVudHM7cmV0dXJuIGNbMF09dCxjWzFdPW8sY1syXT1yLGNbM109ZSxjWzRdPWksY1s1XT1zLGNbNl09bixjWzddPWEsY1s4XT1sLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwxLDAsMCwwLDEpLHRoaXN9Y29weSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO3JldHVybiBlWzBdPW5bMF0sZVsxXT1uWzFdLGVbMl09blsyXSxlWzNdPW5bM10sZVs0XT1uWzRdLGVbNV09bls1XSxlWzZdPW5bNl0sZVs3XT1uWzddLGVbOF09bls4XSx0aGlzfWV4dHJhY3RCYXNpcyh0LGUsbil7cmV0dXJuIHQuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywwKSxlLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMSksbi5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDIpLHRoaXN9c2V0RnJvbU1hdHJpeDQodCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnNldChlWzBdLGVbNF0sZVs4XSxlWzFdLGVbNV0sZVs5XSxlWzJdLGVbNl0sZVsxMF0pLHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLHQpfXByZW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModCx0aGlzKX1tdWx0aXBseU1hdHJpY2VzKHQsZSl7Y29uc3Qgbj10LmVsZW1lbnRzLG89ZS5lbGVtZW50cyxpPXRoaXMuZWxlbWVudHMsYT1uWzBdLHI9blszXSxzPW5bNl0sbD1uWzFdLGM9bls0XSxkPW5bN10scD1uWzJdLG09bls1XSx1PW5bOF0sZj1vWzBdLGc9b1szXSxoPW9bNl0sYj1vWzFdLHk9b1s0XSxfPW9bN10sQz1vWzJdLE09b1s1XSx2PW9bOF07cmV0dXJuIGlbMF09YSpmK3IqYitzKkMsaVszXT1hKmcrcip5K3MqTSxpWzZdPWEqaCtyKl8rcyp2LGlbMV09bCpmK2MqYitkKkMsaVs0XT1sKmcrYyp5K2QqTSxpWzddPWwqaCtjKl8rZCp2LGlbMl09cCpmK20qYit1KkMsaVs1XT1wKmcrbSp5K3UqTSxpWzhdPXAqaCttKl8rdSp2LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbM10qPXQsZVs2XSo9dCxlWzFdKj10LGVbNF0qPXQsZVs3XSo9dCxlWzJdKj10LGVbNV0qPXQsZVs4XSo9dCx0aGlzfWRldGVybWluYW50KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbMV0sbz10WzJdLGk9dFszXSxhPXRbNF0scj10WzVdLHM9dFs2XSxsPXRbN10sYz10WzhdO3JldHVybiBlKmEqYy1lKnIqbC1uKmkqYytuKnIqcytvKmkqbC1vKmEqc31pbnZlcnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFsxXSxvPXRbMl0saT10WzNdLGE9dFs0XSxyPXRbNV0scz10WzZdLGw9dFs3XSxjPXRbOF0sZD1jKmEtcipsLHA9cipzLWMqaSxtPWwqaS1hKnMsdT1lKmQrbipwK28qbTtpZigwPT09dSlyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDApO2NvbnN0IGY9MS91O3JldHVybiB0WzBdPWQqZix0WzFdPShvKmwtYypuKSpmLHRbMl09KHIqbi1vKmEpKmYsdFszXT1wKmYsdFs0XT0oYyplLW8qcykqZix0WzVdPShvKmktciplKSpmLHRbNl09bSpmLHRbN109KG4qcy1sKmUpKmYsdFs4XT0oYSplLW4qaSkqZix0aGlzfXRyYW5zcG9zZSgpe2xldCB0O2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gdD1lWzFdLGVbMV09ZVszXSxlWzNdPXQsdD1lWzJdLGVbMl09ZVs2XSxlWzZdPXQsdD1lWzVdLGVbNV09ZVs3XSxlWzddPXQsdGhpc31nZXROb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeDQodCkuaW52ZXJ0KCkudHJhbnNwb3NlKCl9dHJhbnNwb3NlSW50b0FycmF5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVszXSx0WzJdPWVbNl0sdFszXT1lWzFdLHRbNF09ZVs0XSx0WzVdPWVbN10sdFs2XT1lWzJdLHRbN109ZVs1XSx0WzhdPWVbOF0sdGhpc31zZXRVdlRyYW5zZm9ybSh0LGUsbixvLGksYSxyKXtjb25zdCBzPU1hdGguY29zKGkpLGw9TWF0aC5zaW4oaSk7cmV0dXJuIHRoaXMuc2V0KG4qcyxuKmwsLW4qKHMqYStsKnIpK2ErdCwtbypsLG8qcywtbyooLWwqYStzKnIpK3IrZSwwLDAsMSksdGhpc31zY2FsZSh0LGUpe2NvbnN0IG49dGhpcy5lbGVtZW50cztyZXR1cm4gblswXSo9dCxuWzNdKj10LG5bNl0qPXQsblsxXSo9ZSxuWzRdKj1lLG5bN10qPWUsdGhpc31yb3RhdGUodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpLG89dGhpcy5lbGVtZW50cyxpPW9bMF0sYT1vWzNdLHI9b1s2XSxzPW9bMV0sbD1vWzRdLGM9b1s3XTtyZXR1cm4gb1swXT1lKmkrbipzLG9bM109ZSphK24qbCxvWzZdPWUqcituKmMsb1sxXT0tbippK2UqcyxvWzRdPS1uKmErZSpsLG9bN109LW4qcitlKmMsdGhpc310cmFuc2xhdGUodCxlKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIG5bMF0rPXQqblsyXSxuWzNdKz10Km5bNV0sbls2XSs9dCpuWzhdLG5bMV0rPWUqblsyXSxuWzRdKz1lKm5bNV0sbls3XSs9ZSpuWzhdLHRoaXN9ZXF1YWxzKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7Zm9yKGxldCB0PTA7dDw5O3QrKylpZihlW3RdIT09blt0XSlyZXR1cm4hMTtyZXR1cm4hMH1mcm9tQXJyYXkodCxlPTApe2ZvcihsZXQgbj0wO248OTtuKyspdGhpcy5lbGVtZW50c1tuXT10W24rZV07cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO3JldHVybiB0W2VdPW5bMF0sdFtlKzFdPW5bMV0sdFtlKzJdPW5bMl0sdFtlKzNdPW5bM10sdFtlKzRdPW5bNF0sdFtlKzVdPW5bNV0sdFtlKzZdPW5bNl0sdFtlKzddPW5bN10sdFtlKzhdPW5bOF0sdH1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfX1sZXQgdGF0OyRpdC5wcm90b3R5cGUuaXNNYXRyaXgzPSEwO2NsYXNzIGVhdHtzdGF0aWMgZ2V0RGF0YVVSTCh0KXtpZigvXmRhdGE6L2kudGVzdCh0LnNyYykpcmV0dXJuIHQuc3JjO2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQpcmV0dXJuIHQuc3JjO2xldCBlO2lmKHQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCllPXQ7ZWxzZXt2b2lkIDA9PT10YXQmJih0YXQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiY2FudmFzIikpLHRhdC53aWR0aD10LndpZHRoLHRhdC5oZWlnaHQ9dC5oZWlnaHQ7Y29uc3Qgbj10YXQuZ2V0Q29udGV4dCgiMmQiKTt0IGluc3RhbmNlb2YgSW1hZ2VEYXRhP24ucHV0SW1hZ2VEYXRhKHQsMCwwKTpuLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KSxlPXRhdH1yZXR1cm4gZS53aWR0aD4yMDQ4fHxlLmhlaWdodD4yMDQ4Pyhjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlVXRpbHMuZ2V0RGF0YVVSTDogSW1hZ2UgY29udmVydGVkIHRvIGpwZyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyIsdCksZS50b0RhdGFVUkwoImltYWdlL2pwZWciLC42KSk6ZS50b0RhdGFVUkwoImltYWdlL3BuZyIpfX1sZXQgbmF0PTA7Y2xhc3Mgb2F0IGV4dGVuZHMgVWl0e2NvbnN0cnVjdG9yKHQ9b2F0LkRFRkFVTFRfSU1BR0UsZT1vYXQuREVGQVVMVF9NQVBQSU5HLG49MTAwMSxvPTEwMDEsaT0xMDA2LGE9MTAwOCxyPTEwMjMscz0xMDA5LGw9MSxjPTNlMyl7c3VwZXIoKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpuYXQrK30pLHRoaXMudXVpZD1xaXQoKSx0aGlzLm5hbWU9IiIsdGhpcy5pbWFnZT10LHRoaXMubWlwbWFwcz1bXSx0aGlzLm1hcHBpbmc9ZSx0aGlzLndyYXBTPW4sdGhpcy53cmFwVD1vLHRoaXMubWFnRmlsdGVyPWksdGhpcy5taW5GaWx0ZXI9YSx0aGlzLmFuaXNvdHJvcHk9bCx0aGlzLmZvcm1hdD1yLHRoaXMuaW50ZXJuYWxGb3JtYXQ9bnVsbCx0aGlzLnR5cGU9cyx0aGlzLm9mZnNldD1uZXcgUWl0KDAsMCksdGhpcy5yZXBlYXQ9bmV3IFFpdCgxLDEpLHRoaXMuY2VudGVyPW5ldyBRaXQoMCwwKSx0aGlzLnJvdGF0aW9uPTAsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPSEwLHRoaXMubWF0cml4PW5ldyAkaXQsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITAsdGhpcy5wcmVtdWx0aXBseUFscGhhPSExLHRoaXMuZmxpcFk9ITAsdGhpcy51bnBhY2tBbGlnbm1lbnQ9NCx0aGlzLmVuY29kaW5nPWMsdGhpcy52ZXJzaW9uPTAsdGhpcy5vblVwZGF0ZT1udWxsLHRoaXMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSExfXVwZGF0ZU1hdHJpeCgpe3RoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKHRoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueSx0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnksdGhpcy5yb3RhdGlvbix0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnkpfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMubmFtZT10Lm5hbWUsdGhpcy5pbWFnZT10LmltYWdlLHRoaXMubWlwbWFwcz10Lm1pcG1hcHMuc2xpY2UoMCksdGhpcy5tYXBwaW5nPXQubWFwcGluZyx0aGlzLndyYXBTPXQud3JhcFMsdGhpcy53cmFwVD10LndyYXBULHRoaXMubWFnRmlsdGVyPXQubWFnRmlsdGVyLHRoaXMubWluRmlsdGVyPXQubWluRmlsdGVyLHRoaXMuYW5pc290cm9weT10LmFuaXNvdHJvcHksdGhpcy5mb3JtYXQ9dC5mb3JtYXQsdGhpcy5pbnRlcm5hbEZvcm1hdD10LmludGVybmFsRm9ybWF0LHRoaXMudHlwZT10LnR5cGUsdGhpcy5vZmZzZXQuY29weSh0Lm9mZnNldCksdGhpcy5yZXBlYXQuY29weSh0LnJlcGVhdCksdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5yb3RhdGlvbj10LnJvdGF0aW9uLHRoaXMubWF0cml4QXV0b1VwZGF0ZT10Lm1hdHJpeEF1dG9VcGRhdGUsdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5nZW5lcmF0ZU1pcG1hcHM9dC5nZW5lcmF0ZU1pcG1hcHMsdGhpcy5wcmVtdWx0aXBseUFscGhhPXQucHJlbXVsdGlwbHlBbHBoYSx0aGlzLmZsaXBZPXQuZmxpcFksdGhpcy51bnBhY2tBbGlnbm1lbnQ9dC51bnBhY2tBbGlnbm1lbnQsdGhpcy5lbmNvZGluZz10LmVuY29kaW5nLHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9dm9pZCAwPT09dHx8InN0cmluZyI9PXR5cGVvZiB0O2lmKCFlJiZ2b2lkIDAhPT10LnRleHR1cmVzW3RoaXMudXVpZF0pcmV0dXJuIHQudGV4dHVyZXNbdGhpcy51dWlkXTtjb25zdCBuPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiVGV4dHVyZSIsZ2VuZXJhdG9yOiJUZXh0dXJlLnRvSlNPTiJ9LHV1aWQ6dGhpcy51dWlkLG5hbWU6dGhpcy5uYW1lLG1hcHBpbmc6dGhpcy5tYXBwaW5nLHJlcGVhdDpbdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55XSxvZmZzZXQ6W3RoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueV0sY2VudGVyOlt0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnldLHJvdGF0aW9uOnRoaXMucm90YXRpb24sd3JhcDpbdGhpcy53cmFwUyx0aGlzLndyYXBUXSxmb3JtYXQ6dGhpcy5mb3JtYXQsdHlwZTp0aGlzLnR5cGUsZW5jb2Rpbmc6dGhpcy5lbmNvZGluZyxtaW5GaWx0ZXI6dGhpcy5taW5GaWx0ZXIsbWFnRmlsdGVyOnRoaXMubWFnRmlsdGVyLGFuaXNvdHJvcHk6dGhpcy5hbmlzb3Ryb3B5LGZsaXBZOnRoaXMuZmxpcFkscHJlbXVsdGlwbHlBbHBoYTp0aGlzLnByZW11bHRpcGx5QWxwaGEsdW5wYWNrQWxpZ25tZW50OnRoaXMudW5wYWNrQWxpZ25tZW50fTtpZih2b2lkIDAhPT10aGlzLmltYWdlKXtjb25zdCBvPXRoaXMuaW1hZ2U7aWYodm9pZCAwPT09by51dWlkJiYoby51dWlkPXFpdCgpKSwhZSYmdm9pZCAwPT09dC5pbWFnZXNbby51dWlkXSl7bGV0IGU7aWYoQXJyYXkuaXNBcnJheShvKSl7ZT1bXTtmb3IobGV0IHQ9MCxuPW8ubGVuZ3RoO3Q8bjt0KyspZS5wdXNoKGlhdChvW3RdLmlzRGF0YVRleHR1cmU/b1t0XS5pbWFnZTpvW3RdKSl9ZWxzZSBlPWlhdChvKTt0LmltYWdlc1tvLnV1aWRdPXt1dWlkOm8udXVpZCx1cmw6ZX19bi5pbWFnZT1vLnV1aWR9cmV0dXJuIGV8fCh0LnRleHR1cmVzW3RoaXMudXVpZF09biksbn1kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXRyYW5zZm9ybVV2KHQpe2lmKDMwMCE9PXRoaXMubWFwcGluZylyZXR1cm4gdDtpZih0LmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCksdC54PDB8fHQueD4xKXN3aXRjaCh0aGlzLndyYXBTKXtjYXNlIHVpdDp0Lng9dC54LU1hdGguZmxvb3IodC54KTticmVhaztjYXNlIGZpdDp0Lng9dC54PDA/MDoxO2JyZWFrO2Nhc2UgZ2l0OnQueD0xPT09TWF0aC5hYnMoTWF0aC5mbG9vcih0LngpJTIpP01hdGguY2VpbCh0LngpLXQueDp0LngtTWF0aC5mbG9vcih0LngpfWlmKHQueTwwfHx0Lnk+MSlzd2l0Y2godGhpcy53cmFwVCl7Y2FzZSB1aXQ6dC55PXQueS1NYXRoLmZsb29yKHQueSk7YnJlYWs7Y2FzZSBmaXQ6dC55PXQueTwwPzA6MTticmVhaztjYXNlIGdpdDp0Lnk9MT09PU1hdGguYWJzKE1hdGguZmxvb3IodC55KSUyKT9NYXRoLmNlaWwodC55KS10Lnk6dC55LU1hdGguZmxvb3IodC55KX1yZXR1cm4gdGhpcy5mbGlwWSYmKHQueT0xLXQueSksdH1zZXQgbmVlZHNVcGRhdGUodCl7ITA9PT10JiZ0aGlzLnZlcnNpb24rK319ZnVuY3Rpb24gaWF0KHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTEltYWdlRWxlbWVudCYmdCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fCJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8InVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZUJpdG1hcCYmdCBpbnN0YW5jZW9mIEltYWdlQml0bWFwP2VhdC5nZXREYXRhVVJMKHQpOnQuZGF0YT97ZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0LmRhdGEpLHdpZHRoOnQud2lkdGgsaGVpZ2h0OnQuaGVpZ2h0LHR5cGU6dC5kYXRhLmNvbnN0cnVjdG9yLm5hbWV9Oihjb25zb2xlLndhcm4oIlRIUkVFLlRleHR1cmU6IFVuYWJsZSB0byBzZXJpYWxpemUgVGV4dHVyZS4iKSx7fSl9b2F0LkRFRkFVTFRfSU1BR0U9dm9pZCAwLG9hdC5ERUZBVUxUX01BUFBJTkc9MzAwLG9hdC5wcm90b3R5cGUuaXNUZXh0dXJlPSEwO2NsYXNzIGFhdHtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCxvPTEpe3RoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXMudz1vfWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnp9c2V0IHdpZHRoKHQpe3RoaXMuej10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy53fXNldCBoZWlnaHQodCl7dGhpcy53PXR9c2V0KHQsZSxuLG8pe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzLnc9byx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpcy53PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRXKHQpe3JldHVybiB0aGlzLnc9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztjYXNlIDM6dGhpcy53PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2Nhc2UgMzpyZXR1cm4gdGhpcy53O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56LHRoaXMudyl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXMuej10LnosdGhpcy53PXZvaWQgMCE9PXQudz90Lnc6MSx0aGlzfWFkZCh0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmFkZFZlY3RvcnModCxlKSk6KHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXMueis9dC56LHRoaXMudys9dC53LHRoaXMpfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzLnorPXQsdGhpcy53Kz10LHRoaXN9YWRkVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54K2UueCx0aGlzLnk9dC55K2UueSx0aGlzLno9dC56K2Uueix0aGlzLnc9dC53K2Uudyx0aGlzfWFkZFNjYWxlZFZlY3Rvcih0LGUpe3JldHVybiB0aGlzLngrPXQueCplLHRoaXMueSs9dC55KmUsdGhpcy56Kz10LnoqZSx0aGlzLncrPXQudyplLHRoaXN9c3ViKHQsZSl7cmV0dXJuIHZvaWQgMCE9PWU/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yNDogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuc3ViVmVjdG9ycyh0LGUpKToodGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpcy53LT10LncsdGhpcyl9c3ViU2NhbGFyKHQpe3JldHVybiB0aGlzLngtPXQsdGhpcy55LT10LHRoaXMuei09dCx0aGlzLnctPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXMuej10LnotZS56LHRoaXMudz10LnctZS53LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXMueio9dC56LHRoaXMudyo9dC53LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpcy56Kj10LHRoaXMudyo9dCx0aGlzfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxvPXRoaXMueixpPXRoaXMudyxhPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1hWzBdKmUrYVs0XSpuK2FbOF0qbythWzEyXSppLHRoaXMueT1hWzFdKmUrYVs1XSpuK2FbOV0qbythWzEzXSppLHRoaXMuej1hWzJdKmUrYVs2XSpuK2FbMTBdKm8rYVsxNF0qaSx0aGlzLnc9YVszXSplK2FbN10qbithWzExXSpvK2FbMTVdKmksdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1zZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbih0KXt0aGlzLnc9MipNYXRoLmFjb3ModC53KTtjb25zdCBlPU1hdGguc3FydCgxLXQudyp0LncpO3JldHVybiBlPDFlLTQ/KHRoaXMueD0xLHRoaXMueT0wLHRoaXMuej0wKToodGhpcy54PXQueC9lLHRoaXMueT10LnkvZSx0aGlzLno9dC56L2UpLHRoaXN9c2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4KHQpe2xldCBlLG4sbyxpO2NvbnN0IGE9LjAxLHI9LjEscz10LmVsZW1lbnRzLGw9c1swXSxjPXNbNF0sZD1zWzhdLHA9c1sxXSxtPXNbNV0sdT1zWzldLGY9c1syXSxnPXNbNl0saD1zWzEwXTtpZihNYXRoLmFicyhjLXApPGEmJk1hdGguYWJzKGQtZik8YSYmTWF0aC5hYnModS1nKTxhKXtpZihNYXRoLmFicyhjK3ApPHImJk1hdGguYWJzKGQrZik8ciYmTWF0aC5hYnModStnKTxyJiZNYXRoLmFicyhsK20raC0zKTxyKXJldHVybiB0aGlzLnNldCgxLDAsMCwwKSx0aGlzO2U9TWF0aC5QSTtjb25zdCB0PShsKzEpLzIscz0obSsxKS8yLGI9KGgrMSkvMix5PShjK3ApLzQsXz0oZCtmKS80LEM9KHUrZykvNDtyZXR1cm4gdD5zJiZ0PmI/dDxhPyhuPTAsbz0uNzA3MTA2NzgxLGk9LjcwNzEwNjc4MSk6KG49TWF0aC5zcXJ0KHQpLG89eS9uLGk9Xy9uKTpzPmI/czxhPyhuPS43MDcxMDY3ODEsbz0wLGk9LjcwNzEwNjc4MSk6KG89TWF0aC5zcXJ0KHMpLG49eS9vLGk9Qy9vKTpiPGE/KG49LjcwNzEwNjc4MSxvPS43MDcxMDY3ODEsaT0wKTooaT1NYXRoLnNxcnQoYiksbj1fL2ksbz1DL2kpLHRoaXMuc2V0KG4sbyxpLGUpLHRoaXN9bGV0IGI9TWF0aC5zcXJ0KChnLXUpKihnLXUpKyhkLWYpKihkLWYpKyhwLWMpKihwLWMpKTtyZXR1cm4gTWF0aC5hYnMoYik8LjAwMSYmKGI9MSksdGhpcy54PShnLXUpL2IsdGhpcy55PShkLWYpL2IsdGhpcy56PShwLWMpL2IsdGhpcy53PU1hdGguYWNvcygobCttK2gtMSkvMiksdGhpc31taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpcy56PU1hdGgubWluKHRoaXMueix0LnopLHRoaXMudz1NYXRoLm1pbih0aGlzLncsdC53KSx0aGlzfW1heCh0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksdC55KSx0aGlzLno9TWF0aC5tYXgodGhpcy56LHQueiksdGhpcy53PU1hdGgubWF4KHRoaXMudyx0LncpLHRoaXN9Y2xhbXAodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQueCxNYXRoLm1pbihlLngsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQueSxNYXRoLm1pbihlLnksdGhpcy55KSksdGhpcy56PU1hdGgubWF4KHQueixNYXRoLm1pbihlLnosdGhpcy56KSksdGhpcy53PU1hdGgubWF4KHQudyxNYXRoLm1pbihlLncsdGhpcy53KSksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy55KSksdGhpcy56PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnopKSx0aGlzLnc9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMudykpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KHQsTWF0aC5taW4oZSxuKSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXMudz1NYXRoLmZsb29yKHRoaXMudyksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpcy56PU1hdGguY2VpbCh0aGlzLnopLHRoaXMudz1NYXRoLmNlaWwodGhpcy53KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXMudz1NYXRoLnJvdW5kKHRoaXMudyksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9dGhpcy54PDA/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT10aGlzLnk8MD9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSksdGhpcy56PXRoaXMuejwwP01hdGguY2VpbCh0aGlzLnopOk1hdGguZmxvb3IodGhpcy56KSx0aGlzLnc9dGhpcy53PDA/TWF0aC5jZWlsKHRoaXMudyk6TWF0aC5mbG9vcih0aGlzLncpLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXMuej0tdGhpcy56LHRoaXMudz0tdGhpcy53LHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLngqdC54K3RoaXMueSp0LnkrdGhpcy56KnQueit0aGlzLncqdC53fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56K3RoaXMudyp0aGlzLnd9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53KX1tYW5oYXR0YW5MZW5ndGgoKXtyZXR1cm4gTWF0aC5hYnModGhpcy54KStNYXRoLmFicyh0aGlzLnkpK01hdGguYWJzKHRoaXMueikrTWF0aC5hYnModGhpcy53KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXMueis9KHQuei10aGlzLnopKmUsdGhpcy53Kz0odC53LXRoaXMudykqZSx0aGlzfWxlcnBWZWN0b3JzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQueCsoZS54LXQueCkqbix0aGlzLnk9dC55KyhlLnktdC55KSpuLHRoaXMuej10LnorKGUuei10LnopKm4sdGhpcy53PXQudysoZS53LXQudykqbix0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnkmJnQuej09PXRoaXMueiYmdC53PT09dGhpcy53fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpcy56PXRbZSsyXSx0aGlzLnc9dFtlKzNdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy54LHRbZSsxXT10aGlzLnksdFtlKzJdPXRoaXMueix0W2UrM109dGhpcy53LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUsbil7cmV0dXJuIHZvaWQgMCE9PW4mJmNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yNDogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpLHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXMudz10LmdldFcoZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpcy53PU1hdGgucmFuZG9tKCksdGhpc319YWF0LnByb3RvdHlwZS5pc1ZlY3RvcjQ9ITA7Y2xhc3MgcmF0IGV4dGVuZHMgVWl0e2NvbnN0cnVjdG9yKHQsZSxuPXt9KXtzdXBlcigpLHRoaXMud2lkdGg9dCx0aGlzLmhlaWdodD1lLHRoaXMuZGVwdGg9MSx0aGlzLnNjaXNzb3I9bmV3IGFhdCgwLDAsdCxlKSx0aGlzLnNjaXNzb3JUZXN0PSExLHRoaXMudmlld3BvcnQ9bmV3IGFhdCgwLDAsdCxlKSx0aGlzLnRleHR1cmU9bmV3IG9hdCh2b2lkIDAsbi5tYXBwaW5nLG4ud3JhcFMsbi53cmFwVCxuLm1hZ0ZpbHRlcixuLm1pbkZpbHRlcixuLmZvcm1hdCxuLnR5cGUsbi5hbmlzb3Ryb3B5LG4uZW5jb2RpbmcpLHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITAsdGhpcy50ZXh0dXJlLmltYWdlPXt3aWR0aDp0LGhlaWdodDplLGRlcHRoOjF9LHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9dm9pZCAwIT09bi5nZW5lcmF0ZU1pcG1hcHMmJm4uZ2VuZXJhdGVNaXBtYXBzLHRoaXMudGV4dHVyZS5taW5GaWx0ZXI9dm9pZCAwIT09bi5taW5GaWx0ZXI/bi5taW5GaWx0ZXI6Yml0LHRoaXMuZGVwdGhCdWZmZXI9dm9pZCAwPT09bi5kZXB0aEJ1ZmZlcnx8bi5kZXB0aEJ1ZmZlcix0aGlzLnN0ZW5jaWxCdWZmZXI9dm9pZCAwIT09bi5zdGVuY2lsQnVmZmVyJiZuLnN0ZW5jaWxCdWZmZXIsdGhpcy5kZXB0aFRleHR1cmU9dm9pZCAwIT09bi5kZXB0aFRleHR1cmU/bi5kZXB0aFRleHR1cmU6bnVsbH1zZXRUZXh0dXJlKHQpe3QuaW1hZ2U9e3dpZHRoOnRoaXMud2lkdGgsaGVpZ2h0OnRoaXMuaGVpZ2h0LGRlcHRoOnRoaXMuZGVwdGh9LHRoaXMudGV4dHVyZT10fXNldFNpemUodCxlLG49MSl7dGhpcy53aWR0aD09PXQmJnRoaXMuaGVpZ2h0PT09ZSYmdGhpcy5kZXB0aD09PW58fCh0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9ZSx0aGlzLmRlcHRoPW4sdGhpcy50ZXh0dXJlLmltYWdlLndpZHRoPXQsdGhpcy50ZXh0dXJlLmltYWdlLmhlaWdodD1lLHRoaXMudGV4dHVyZS5pbWFnZS5kZXB0aD1uLHRoaXMuZGlzcG9zZSgpKSx0aGlzLnZpZXdwb3J0LnNldCgwLDAsdCxlKSx0aGlzLnNjaXNzb3Iuc2V0KDAsMCx0LGUpfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMud2lkdGg9dC53aWR0aCx0aGlzLmhlaWdodD10LmhlaWdodCx0aGlzLmRlcHRoPXQuZGVwdGgsdGhpcy52aWV3cG9ydC5jb3B5KHQudmlld3BvcnQpLHRoaXMudGV4dHVyZT10LnRleHR1cmUuY2xvbmUoKSx0aGlzLnRleHR1cmUuaW1hZ2U9ey4uLnRoaXMudGV4dHVyZS5pbWFnZX0sdGhpcy5kZXB0aEJ1ZmZlcj10LmRlcHRoQnVmZmVyLHRoaXMuc3RlbmNpbEJ1ZmZlcj10LnN0ZW5jaWxCdWZmZXIsdGhpcy5kZXB0aFRleHR1cmU9dC5kZXB0aFRleHR1cmUsdGhpc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX1yYXQucHJvdG90eXBlLmlzV2ViR0xSZW5kZXJUYXJnZXQ9ITAsY2xhc3MgZXh0ZW5kcyByYXR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHQsZSk7Y29uc3Qgbz10aGlzLnRleHR1cmU7dGhpcy50ZXh0dXJlPVtdO2ZvcihsZXQgdD0wO3Q8bjt0KyspdGhpcy50ZXh0dXJlW3RdPW8uY2xvbmUoKX1zZXRTaXplKHQsZSxuPTEpe2lmKHRoaXMud2lkdGghPT10fHx0aGlzLmhlaWdodCE9PWV8fHRoaXMuZGVwdGghPT1uKXt0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9ZSx0aGlzLmRlcHRoPW47Zm9yKGxldCBvPTAsaT10aGlzLnRleHR1cmUubGVuZ3RoO288aTtvKyspdGhpcy50ZXh0dXJlW29dLmltYWdlLndpZHRoPXQsdGhpcy50ZXh0dXJlW29dLmltYWdlLmhlaWdodD1lLHRoaXMudGV4dHVyZVtvXS5pbWFnZS5kZXB0aD1uO3RoaXMuZGlzcG9zZSgpfXJldHVybiB0aGlzLnZpZXdwb3J0LnNldCgwLDAsdCxlKSx0aGlzLnNjaXNzb3Iuc2V0KDAsMCx0LGUpLHRoaXN9Y29weSh0KXt0aGlzLmRpc3Bvc2UoKSx0aGlzLndpZHRoPXQud2lkdGgsdGhpcy5oZWlnaHQ9dC5oZWlnaHQsdGhpcy5kZXB0aD10LmRlcHRoLHRoaXMudmlld3BvcnQuc2V0KDAsMCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KSx0aGlzLnNjaXNzb3Iuc2V0KDAsMCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KSx0aGlzLmRlcHRoQnVmZmVyPXQuZGVwdGhCdWZmZXIsdGhpcy5zdGVuY2lsQnVmZmVyPXQuc3RlbmNpbEJ1ZmZlcix0aGlzLmRlcHRoVGV4dHVyZT10LmRlcHRoVGV4dHVyZSx0aGlzLnRleHR1cmUubGVuZ3RoPTA7Zm9yKGxldCBlPTAsbj10LnRleHR1cmUubGVuZ3RoO2U8bjtlKyspdGhpcy50ZXh0dXJlW2VdPXQudGV4dHVyZVtlXS5jbG9uZSgpO3JldHVybiB0aGlzfX0ucHJvdG90eXBlLmlzV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHM9ITA7Y2xhc3Mgc2F0IGV4dGVuZHMgcmF0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcih0LGUsbiksdGhpcy5zYW1wbGVzPTR9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weS5jYWxsKHRoaXMsdCksdGhpcy5zYW1wbGVzPXQuc2FtcGxlcyx0aGlzfX1zYXQucHJvdG90eXBlLmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldD0hMDtjbGFzcyBsYXR7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAsbz0xKXt0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl93PW99c3RhdGljIHNsZXJwKHQsZSxuLG8pe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlF1YXRlcm5pb246IFN0YXRpYyAuc2xlcnAoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgcW0uc2xlcnBRdWF0ZXJuaW9ucyggcWEsIHFiLCB0ICkgaW5zdGVhZC4iKSxuLnNsZXJwUXVhdGVybmlvbnModCxlLG8pfXN0YXRpYyBzbGVycEZsYXQodCxlLG4sbyxpLGEscil7bGV0IHM9bltvKzBdLGw9bltvKzFdLGM9bltvKzJdLGQ9bltvKzNdO2NvbnN0IHA9aVthKzBdLG09aVthKzFdLHU9aVthKzJdLGY9aVthKzNdO2lmKDA9PT1yKXJldHVybiB0W2UrMF09cyx0W2UrMV09bCx0W2UrMl09Yyx2b2lkKHRbZSszXT1kKTtpZigxPT09cilyZXR1cm4gdFtlKzBdPXAsdFtlKzFdPW0sdFtlKzJdPXUsdm9pZCh0W2UrM109Zik7aWYoZCE9PWZ8fHMhPT1wfHxsIT09bXx8YyE9PXUpe2xldCB0PTEtcjtjb25zdCBlPXMqcCtsKm0rYyp1K2QqZixuPWU+PTA/MTotMSxvPTEtZSplO2lmKG8+TnVtYmVyLkVQU0lMT04pe2NvbnN0IGk9TWF0aC5zcXJ0KG8pLGE9TWF0aC5hdGFuMihpLGUqbik7dD1NYXRoLnNpbih0KmEpL2kscj1NYXRoLnNpbihyKmEpL2l9Y29uc3QgaT1yKm47aWYocz1zKnQrcCppLGw9bCp0K20qaSxjPWMqdCt1KmksZD1kKnQrZippLHQ9PT0xLXIpe2NvbnN0IHQ9MS9NYXRoLnNxcnQocypzK2wqbCtjKmMrZCpkKTtzKj10LGwqPXQsYyo9dCxkKj10fX10W2VdPXMsdFtlKzFdPWwsdFtlKzJdPWMsdFtlKzNdPWR9c3RhdGljIG11bHRpcGx5UXVhdGVybmlvbnNGbGF0KHQsZSxuLG8saSxhKXtjb25zdCByPW5bb10scz1uW28rMV0sbD1uW28rMl0sYz1uW28rM10sZD1pW2FdLHA9aVthKzFdLG09aVthKzJdLHU9aVthKzNdO3JldHVybiB0W2VdPXIqdStjKmQrcyptLWwqcCx0W2UrMV09cyp1K2MqcCtsKmQtciptLHRbZSsyXT1sKnUrYyptK3IqcC1zKmQsdFtlKzNdPWMqdS1yKmQtcypwLWwqbSx0fWdldCB4KCl7cmV0dXJuIHRoaXMuX3h9c2V0IHgodCl7dGhpcy5feD10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeSgpe3JldHVybiB0aGlzLl95fXNldCB5KHQpe3RoaXMuX3k9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fen1zZXQgeih0KXt0aGlzLl96PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB3KCl7cmV0dXJuIHRoaXMuX3d9c2V0IHcodCl7dGhpcy5fdz10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1zZXQodCxlLG4sbyl7cmV0dXJuIHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX3c9byx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl93KX1jb3B5KHQpe3JldHVybiB0aGlzLl94PXQueCx0aGlzLl95PXQueSx0aGlzLl96PXQueix0aGlzLl93PXQudyx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tRXVsZXIodCxlKXtpZighdHx8IXQuaXNFdWxlcil0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLiIpO2NvbnN0IG49dC5feCxvPXQuX3ksaT10Ll96LGE9dC5fb3JkZXIscj1NYXRoLmNvcyxzPU1hdGguc2luLGw9cihuLzIpLGM9cihvLzIpLGQ9cihpLzIpLHA9cyhuLzIpLG09cyhvLzIpLHU9cyhpLzIpO3N3aXRjaChhKXtjYXNlIlhZWiI6dGhpcy5feD1wKmMqZCtsKm0qdSx0aGlzLl95PWwqbSpkLXAqYyp1LHRoaXMuX3o9bCpjKnUrcCptKmQsdGhpcy5fdz1sKmMqZC1wKm0qdTticmVhaztjYXNlIllYWiI6dGhpcy5feD1wKmMqZCtsKm0qdSx0aGlzLl95PWwqbSpkLXAqYyp1LHRoaXMuX3o9bCpjKnUtcCptKmQsdGhpcy5fdz1sKmMqZCtwKm0qdTticmVhaztjYXNlIlpYWSI6dGhpcy5feD1wKmMqZC1sKm0qdSx0aGlzLl95PWwqbSpkK3AqYyp1LHRoaXMuX3o9bCpjKnUrcCptKmQsdGhpcy5fdz1sKmMqZC1wKm0qdTticmVhaztjYXNlIlpZWCI6dGhpcy5feD1wKmMqZC1sKm0qdSx0aGlzLl95PWwqbSpkK3AqYyp1LHRoaXMuX3o9bCpjKnUtcCptKmQsdGhpcy5fdz1sKmMqZCtwKm0qdTticmVhaztjYXNlIllaWCI6dGhpcy5feD1wKmMqZCtsKm0qdSx0aGlzLl95PWwqbSpkK3AqYyp1LHRoaXMuX3o9bCpjKnUtcCptKmQsdGhpcy5fdz1sKmMqZC1wKm0qdTticmVhaztjYXNlIlhaWSI6dGhpcy5feD1wKmMqZC1sKm0qdSx0aGlzLl95PWwqbSpkLXAqYyp1LHRoaXMuX3o9bCpjKnUrcCptKmQsdGhpcy5fdz1sKmMqZCtwKm0qdTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrYSl9cmV0dXJuITEhPT1lJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tQXhpc0FuZ2xlKHQsZSl7Y29uc3Qgbj1lLzIsbz1NYXRoLnNpbihuKTtyZXR1cm4gdGhpcy5feD10Lngqbyx0aGlzLl95PXQueSpvLHRoaXMuX3o9dC56Km8sdGhpcy5fdz1NYXRoLmNvcyhuKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUm90YXRpb25NYXRyaXgodCl7Y29uc3QgZT10LmVsZW1lbnRzLG49ZVswXSxvPWVbNF0saT1lWzhdLGE9ZVsxXSxyPWVbNV0scz1lWzldLGw9ZVsyXSxjPWVbNl0sZD1lWzEwXSxwPW4rcitkO2lmKHA+MCl7Y29uc3QgdD0uNS9NYXRoLnNxcnQocCsxKTt0aGlzLl93PS4yNS90LHRoaXMuX3g9KGMtcykqdCx0aGlzLl95PShpLWwpKnQsdGhpcy5fej0oYS1vKSp0fWVsc2UgaWYobj5yJiZuPmQpe2NvbnN0IHQ9MipNYXRoLnNxcnQoMStuLXItZCk7dGhpcy5fdz0oYy1zKS90LHRoaXMuX3g9LjI1KnQsdGhpcy5feT0obythKS90LHRoaXMuX3o9KGkrbCkvdH1lbHNlIGlmKHI+ZCl7Y29uc3QgdD0yKk1hdGguc3FydCgxK3Itbi1kKTt0aGlzLl93PShpLWwpL3QsdGhpcy5feD0obythKS90LHRoaXMuX3k9LjI1KnQsdGhpcy5fej0ocytjKS90fWVsc2V7Y29uc3QgdD0yKk1hdGguc3FydCgxK2Qtbi1yKTt0aGlzLl93PShhLW8pL3QsdGhpcy5feD0oaStsKS90LHRoaXMuX3k9KHMrYykvdCx0aGlzLl96PS4yNSp0fXJldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tVW5pdFZlY3RvcnModCxlKXtsZXQgbj10LmRvdChlKSsxO3JldHVybiBuPE51bWJlci5FUFNJTE9OPyhuPTAsTWF0aC5hYnModC54KT5NYXRoLmFicyh0LnopPyh0aGlzLl94PS10LnksdGhpcy5feT10LngsdGhpcy5fej0wLHRoaXMuX3c9bik6KHRoaXMuX3g9MCx0aGlzLl95PS10LnosdGhpcy5fej10LnksdGhpcy5fdz1uKSk6KHRoaXMuX3g9dC55KmUuei10LnoqZS55LHRoaXMuX3k9dC56KmUueC10LngqZS56LHRoaXMuX3o9dC54KmUueS10LnkqZS54LHRoaXMuX3c9biksdGhpcy5ub3JtYWxpemUoKX1hbmdsZVRvKHQpe3JldHVybiAyKk1hdGguYWNvcyhNYXRoLmFicyhaaXQodGhpcy5kb3QodCksLTEsMSkpKX1yb3RhdGVUb3dhcmRzKHQsZSl7Y29uc3Qgbj10aGlzLmFuZ2xlVG8odCk7aWYoMD09PW4pcmV0dXJuIHRoaXM7Y29uc3Qgbz1NYXRoLm1pbigxLGUvbik7cmV0dXJuIHRoaXMuc2xlcnAodCxvKSx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDAsMCwwLDEpfWludmVydCgpe3JldHVybiB0aGlzLmNvbmp1Z2F0ZSgpfWNvbmp1Z2F0ZSgpe3JldHVybiB0aGlzLl94Kj0tMSx0aGlzLl95Kj0tMSx0aGlzLl96Kj0tMSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31kb3QodCl7cmV0dXJuIHRoaXMuX3gqdC5feCt0aGlzLl95KnQuX3krdGhpcy5feip0Ll96K3RoaXMuX3cqdC5fd31sZW5ndGhTcSgpe3JldHVybiB0aGlzLl94KnRoaXMuX3grdGhpcy5feSp0aGlzLl95K3RoaXMuX3oqdGhpcy5feit0aGlzLl93KnRoaXMuX3d9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLl94KnRoaXMuX3grdGhpcy5feSp0aGlzLl95K3RoaXMuX3oqdGhpcy5feit0aGlzLl93KnRoaXMuX3cpfW5vcm1hbGl6ZSgpe2xldCB0PXRoaXMubGVuZ3RoKCk7cmV0dXJuIDA9PT10Pyh0aGlzLl94PTAsdGhpcy5feT0wLHRoaXMuX3o9MCx0aGlzLl93PTEpOih0PTEvdCx0aGlzLl94PXRoaXMuX3gqdCx0aGlzLl95PXRoaXMuX3kqdCx0aGlzLl96PXRoaXMuX3oqdCx0aGlzLl93PXRoaXMuX3cqdCksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9bXVsdGlwbHkodCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseVF1YXRlcm5pb25zKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5UXVhdGVybmlvbnModCxlKSk6dGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0LHRoaXMpfW11bHRpcGx5UXVhdGVybmlvbnModCxlKXtjb25zdCBuPXQuX3gsbz10Ll95LGk9dC5feixhPXQuX3cscj1lLl94LHM9ZS5feSxsPWUuX3osYz1lLl93O3JldHVybiB0aGlzLl94PW4qYythKnIrbypsLWkqcyx0aGlzLl95PW8qYythKnMraSpyLW4qbCx0aGlzLl96PWkqYythKmwrbipzLW8qcix0aGlzLl93PWEqYy1uKnItbypzLWkqbCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycCh0LGUpe2lmKDA9PT1lKXJldHVybiB0aGlzO2lmKDE9PT1lKXJldHVybiB0aGlzLmNvcHkodCk7Y29uc3Qgbj10aGlzLl94LG89dGhpcy5feSxpPXRoaXMuX3osYT10aGlzLl93O2xldCByPWEqdC5fdytuKnQuX3grbyp0Ll95K2kqdC5fejtpZihyPDA/KHRoaXMuX3c9LXQuX3csdGhpcy5feD0tdC5feCx0aGlzLl95PS10Ll95LHRoaXMuX3o9LXQuX3oscj0tcik6dGhpcy5jb3B5KHQpLHI+PTEpcmV0dXJuIHRoaXMuX3c9YSx0aGlzLl94PW4sdGhpcy5feT1vLHRoaXMuX3o9aSx0aGlzO2NvbnN0IHM9MS1yKnI7aWYoczw9TnVtYmVyLkVQU0lMT04pe2NvbnN0IHQ9MS1lO3JldHVybiB0aGlzLl93PXQqYStlKnRoaXMuX3csdGhpcy5feD10Km4rZSp0aGlzLl94LHRoaXMuX3k9dCpvK2UqdGhpcy5feSx0aGlzLl96PXQqaStlKnRoaXMuX3osdGhpcy5ub3JtYWxpemUoKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jb25zdCBsPU1hdGguc3FydChzKSxjPU1hdGguYXRhbjIobCxyKSxkPU1hdGguc2luKCgxLWUpKmMpL2wscD1NYXRoLnNpbihlKmMpL2w7cmV0dXJuIHRoaXMuX3c9YSpkK3RoaXMuX3cqcCx0aGlzLl94PW4qZCt0aGlzLl94KnAsdGhpcy5feT1vKmQrdGhpcy5feSpwLHRoaXMuX3o9aSpkK3RoaXMuX3oqcCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycFF1YXRlcm5pb25zKHQsZSxuKXt0aGlzLmNvcHkodCkuc2xlcnAoZSxuKX1lcXVhbHModCl7cmV0dXJuIHQuX3g9PT10aGlzLl94JiZ0Ll95PT09dGhpcy5feSYmdC5fej09PXRoaXMuX3omJnQuX3c9PT10aGlzLl93fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMuX3g9dFtlXSx0aGlzLl95PXRbZSsxXSx0aGlzLl96PXRbZSsyXSx0aGlzLl93PXRbZSszXSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLl94LHRbZSsxXT10aGlzLl95LHRbZSsyXT10aGlzLl96LHRbZSszXT10aGlzLl93LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLl94PXQuZ2V0WChlKSx0aGlzLl95PXQuZ2V0WShlKSx0aGlzLl96PXQuZ2V0WihlKSx0aGlzLl93PXQuZ2V0VyhlKSx0aGlzfV9vbkNoYW5nZSh0KXtyZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaz10LHRoaXN9X29uQ2hhbmdlQ2FsbGJhY2soKXt9fWxhdC5wcm90b3R5cGUuaXNRdWF0ZXJuaW9uPSEwO2NsYXNzIGNhdHtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCl7dGhpcy54PXQsdGhpcy55PWUsdGhpcy56PW59c2V0KHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49dGhpcy56KSx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztjYXNlIDI6dGhpcy56PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQueix0aGlzfWFkZCh0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmFkZFZlY3RvcnModCxlKSk6KHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXMueis9dC56LHRoaXMpfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzLnorPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXMuej10LnorZS56LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzLnorPXQueiplLHRoaXN9c3ViKHQsZSl7cmV0dXJuIHZvaWQgMCE9PWU/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuc3ViVmVjdG9ycyh0LGUpKToodGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpcyl9c3ViU2NhbGFyKHQpe3JldHVybiB0aGlzLngtPXQsdGhpcy55LT10LHRoaXMuei09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpcy56PXQuei1lLnosdGhpc31tdWx0aXBseSh0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5VmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5tdWx0aXBseVZlY3RvcnModCxlKSk6KHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXMueio9dC56LHRoaXMpfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXMueio9dCx0aGlzfW11bHRpcGx5VmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54KmUueCx0aGlzLnk9dC55KmUueSx0aGlzLno9dC56KmUueix0aGlzfWFwcGx5RXVsZXIodCl7cmV0dXJuIHQmJnQuaXNFdWxlcnx8Y29uc29sZS5lcnJvcigiVEhSRUUuVmVjdG9yMzogLmFwcGx5RXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLiIpLHRoaXMuYXBwbHlRdWF0ZXJuaW9uKHBhdC5zZXRGcm9tRXVsZXIodCkpfWFwcGx5QXhpc0FuZ2xlKHQsZSl7cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKHBhdC5zZXRGcm9tQXhpc0FuZ2xlKHQsZSkpfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxvPXRoaXMueixpPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1pWzBdKmUraVszXSpuK2lbNl0qbyx0aGlzLnk9aVsxXSplK2lbNF0qbitpWzddKm8sdGhpcy56PWlbMl0qZStpWzVdKm4raVs4XSpvLHRoaXN9YXBwbHlOb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXgzKHQpLm5vcm1hbGl6ZSgpfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxvPXRoaXMueixpPXQuZWxlbWVudHMsYT0xLyhpWzNdKmUraVs3XSpuK2lbMTFdKm8raVsxNV0pO3JldHVybiB0aGlzLng9KGlbMF0qZStpWzRdKm4raVs4XSpvK2lbMTJdKSphLHRoaXMueT0oaVsxXSplK2lbNV0qbitpWzldKm8raVsxM10pKmEsdGhpcy56PShpWzJdKmUraVs2XSpuK2lbMTBdKm8raVsxNF0pKmEsdGhpc31hcHBseVF1YXRlcm5pb24odCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnksbz10aGlzLnosaT10LngsYT10Lnkscj10Lnoscz10LncsbD1zKmUrYSpvLXIqbixjPXMqbityKmUtaSpvLGQ9cypvK2kqbi1hKmUscD0taSplLWEqbi1yKm87cmV0dXJuIHRoaXMueD1sKnMrcCotaStjKi1yLWQqLWEsdGhpcy55PWMqcytwKi1hK2QqLWktbCotcix0aGlzLno9ZCpzK3AqLXIrbCotYS1jKi1pLHRoaXN9cHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZEludmVyc2UpLmFwcGx5TWF0cml4NCh0LnByb2plY3Rpb25NYXRyaXgpfXVucHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSkuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpfXRyYW5zZm9ybURpcmVjdGlvbih0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxvPXRoaXMueixpPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1pWzBdKmUraVs0XSpuK2lbOF0qbyx0aGlzLnk9aVsxXSplK2lbNV0qbitpWzldKm8sdGhpcy56PWlbMl0qZStpWzZdKm4raVsxMF0qbyx0aGlzLm5vcm1hbGl6ZSgpfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpcy56Lz10LnosdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpcy56PU1hdGgubWluKHRoaXMueix0LnopLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LngsTWF0aC5taW4oZS54LHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LnksTWF0aC5taW4oZS55LHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LnosTWF0aC5taW4oZS56LHRoaXMueikpLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy56KSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IG49dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobnx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgodCxNYXRoLm1pbihlLG4pKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej1NYXRoLmZsb29yKHRoaXMueiksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpcy56PU1hdGguY2VpbCh0aGlzLnopLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXMuej1NYXRoLnJvdW5kKHRoaXMueiksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9dGhpcy54PDA/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT10aGlzLnk8MD9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSksdGhpcy56PXRoaXMuejwwP01hdGguY2VpbCh0aGlzLnopOk1hdGguZmxvb3IodGhpcy56KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzLno9LXRoaXMueix0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55K3RoaXMueip0Lnp9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnp9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueil9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopfW5vcm1hbGl6ZSgpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpcy56Kz0odC56LXRoaXMueikqZSx0aGlzfWxlcnBWZWN0b3JzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQueCsoZS54LXQueCkqbix0aGlzLnk9dC55KyhlLnktdC55KSpuLHRoaXMuej10LnorKGUuei10LnopKm4sdGhpc31jcm9zcyh0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5jcm9zcygpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmNyb3NzVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5jcm9zc1ZlY3RvcnModCxlKSk6dGhpcy5jcm9zc1ZlY3RvcnModGhpcyx0KX1jcm9zc1ZlY3RvcnModCxlKXtjb25zdCBuPXQueCxvPXQueSxpPXQueixhPWUueCxyPWUueSxzPWUuejtyZXR1cm4gdGhpcy54PW8qcy1pKnIsdGhpcy55PWkqYS1uKnMsdGhpcy56PW4qci1vKmEsdGhpc31wcm9qZWN0T25WZWN0b3IodCl7Y29uc3QgZT10Lmxlbmd0aFNxKCk7aWYoMD09PWUpcmV0dXJuIHRoaXMuc2V0KDAsMCwwKTtjb25zdCBuPXQuZG90KHRoaXMpL2U7cmV0dXJuIHRoaXMuY29weSh0KS5tdWx0aXBseVNjYWxhcihuKX1wcm9qZWN0T25QbGFuZSh0KXtyZXR1cm4gZGF0LmNvcHkodGhpcykucHJvamVjdE9uVmVjdG9yKHQpLHRoaXMuc3ViKGRhdCl9cmVmbGVjdCh0KXtyZXR1cm4gdGhpcy5zdWIoZGF0LmNvcHkodCkubXVsdGlwbHlTY2FsYXIoMip0aGlzLmRvdCh0KSkpfWFuZ2xlVG8odCl7Y29uc3QgZT1NYXRoLnNxcnQodGhpcy5sZW5ndGhTcSgpKnQubGVuZ3RoU3EoKSk7aWYoMD09PWUpcmV0dXJuIE1hdGguUEkvMjtjb25zdCBuPXRoaXMuZG90KHQpL2U7cmV0dXJuIE1hdGguYWNvcyhaaXQobiwtMSwxKSl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnksbz10aGlzLnotdC56O3JldHVybiBlKmUrbipuK28qb31tYW5oYXR0YW5EaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLngtdC54KStNYXRoLmFicyh0aGlzLnktdC55KStNYXRoLmFicyh0aGlzLnotdC56KX1zZXRGcm9tU3BoZXJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHModC5yYWRpdXMsdC5waGksdC50aGV0YSl9c2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LGUsbil7Y29uc3Qgbz1NYXRoLnNpbihlKSp0O3JldHVybiB0aGlzLng9bypNYXRoLnNpbihuKSx0aGlzLnk9TWF0aC5jb3MoZSkqdCx0aGlzLno9bypNYXRoLmNvcyhuKSx0aGlzfXNldEZyb21DeWxpbmRyaWNhbCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHModC5yYWRpdXMsdC50aGV0YSx0LnkpfXNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LGUsbil7cmV0dXJuIHRoaXMueD10Kk1hdGguc2luKGUpLHRoaXMueT1uLHRoaXMuej10Kk1hdGguY29zKGUpLHRoaXN9c2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWVbMTJdLHRoaXMueT1lWzEzXSx0aGlzLno9ZVsxNF0sdGhpc31zZXRGcm9tTWF0cml4U2NhbGUodCl7Y29uc3QgZT10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwwKS5sZW5ndGgoKSxuPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLG89dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMikubGVuZ3RoKCk7cmV0dXJuIHRoaXMueD1lLHRoaXMueT1uLHRoaXMuej1vLHRoaXN9c2V0RnJvbU1hdHJpeENvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLDQqZSl9c2V0RnJvbU1hdHJpeDNDb2x1bW4odCxlKXtyZXR1cm4gdGhpcy5mcm9tQXJyYXkodC5lbGVtZW50cywzKmUpfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnkmJnQuej09PXRoaXMuen1mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLng9dFtlXSx0aGlzLnk9dFtlKzFdLHRoaXMuej10W2UrMl0sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0W2UrMl09dGhpcy56LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUsbil7cmV0dXJuIHZvaWQgMCE9PW4mJmNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpLHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXN9fWNhdC5wcm90b3R5cGUuaXNWZWN0b3IzPSEwO2NvbnN0IGRhdD1uZXcgY2F0LHBhdD1uZXcgbGF0O2NsYXNzIG1hdHtjb25zdHJ1Y3Rvcih0PW5ldyBjYXQoMS8wLDEvMCwxLzApLGU9bmV3IGNhdCgtMS8wLC0xLzAsLTEvMCkpe3RoaXMubWluPXQsdGhpcy5tYXg9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5taW4uY29weSh0KSx0aGlzLm1heC5jb3B5KGUpLHRoaXN9c2V0RnJvbUFycmF5KHQpe2xldCBlPTEvMCxuPTEvMCxvPTEvMCxpPS0xLzAsYT0tMS8wLHI9LTEvMDtmb3IobGV0IHM9MCxsPXQubGVuZ3RoO3M8bDtzKz0zKXtjb25zdCBsPXRbc10sYz10W3MrMV0sZD10W3MrMl07bDxlJiYoZT1sKSxjPG4mJihuPWMpLGQ8byYmKG89ZCksbD5pJiYoaT1sKSxjPmEmJihhPWMpLGQ+ciYmKHI9ZCl9cmV0dXJuIHRoaXMubWluLnNldChlLG4sbyksdGhpcy5tYXguc2V0KGksYSxyKSx0aGlzfXNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCl7bGV0IGU9MS8wLG49MS8wLG89MS8wLGk9LTEvMCxhPS0xLzAscj0tMS8wO2ZvcihsZXQgcz0wLGw9dC5jb3VudDtzPGw7cysrKXtjb25zdCBsPXQuZ2V0WChzKSxjPXQuZ2V0WShzKSxkPXQuZ2V0WihzKTtsPGUmJihlPWwpLGM8biYmKG49YyksZDxvJiYobz1kKSxsPmkmJihpPWwpLGM+YSYmKGE9YyksZD5yJiYocj1kKX1yZXR1cm4gdGhpcy5taW4uc2V0KGUsbixvKSx0aGlzLm1heC5zZXQoaSxhLHIpLHRoaXN9c2V0RnJvbVBvaW50cyh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQodFtlXSk7cmV0dXJuIHRoaXN9c2V0RnJvbUNlbnRlckFuZFNpemUodCxlKXtjb25zdCBuPWZhdC5jb3B5KGUpLm11bHRpcGx5U2NhbGFyKC41KTtyZXR1cm4gdGhpcy5taW4uY29weSh0KS5zdWIobiksdGhpcy5tYXguY29weSh0KS5hZGQobiksdGhpc31zZXRGcm9tT2JqZWN0KHQpe3JldHVybiB0aGlzLm1ha2VFbXB0eSgpLHRoaXMuZXhwYW5kQnlPYmplY3QodCl9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpc31tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5taW4ueD10aGlzLm1pbi55PXRoaXMubWluLno9MS8wLHRoaXMubWF4Lng9dGhpcy5tYXgueT10aGlzLm1heC56PS0xLzAsdGhpc31pc0VtcHR5KCl7cmV0dXJuIHRoaXMubWF4Lng8dGhpcy5taW4ueHx8dGhpcy5tYXgueTx0aGlzLm1pbi55fHx0aGlzLm1heC56PHRoaXMubWluLnp9Z2V0Q2VudGVyKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDAsMCk6dC5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9Z2V0U2l6ZSh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwLDApOnQuc3ViVmVjdG9ycyh0aGlzLm1heCx0aGlzLm1pbil9ZXhwYW5kQnlQb2ludCh0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQpLHRoaXMubWF4Lm1heCh0KSx0aGlzfWV4cGFuZEJ5VmVjdG9yKHQpe3JldHVybiB0aGlzLm1pbi5zdWIodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXhwYW5kQnlTY2FsYXIodCl7cmV0dXJuIHRoaXMubWluLmFkZFNjYWxhcigtdCksdGhpcy5tYXguYWRkU2NhbGFyKHQpLHRoaXN9ZXhwYW5kQnlPYmplY3QodCl7dC51cGRhdGVXb3JsZE1hdHJpeCghMSwhMSk7Y29uc3QgZT10Lmdlb21ldHJ5O3ZvaWQgMCE9PWUmJihudWxsPT09ZS5ib3VuZGluZ0JveCYmZS5jb21wdXRlQm91bmRpbmdCb3goKSxnYXQuY29weShlLmJvdW5kaW5nQm94KSxnYXQuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMudW5pb24oZ2F0KSk7Y29uc3Qgbj10LmNoaWxkcmVuO2ZvcihsZXQgdD0wLGU9bi5sZW5ndGg7dDxlO3QrKyl0aGlzLmV4cGFuZEJ5T2JqZWN0KG5bdF0pO3JldHVybiB0aGlzfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuISh0Lng8dGhpcy5taW4ueHx8dC54PnRoaXMubWF4Lnh8fHQueTx0aGlzLm1pbi55fHx0Lnk+dGhpcy5tYXgueXx8dC56PHRoaXMubWluLnp8fHQuej50aGlzLm1heC56KX1jb250YWluc0JveCh0KXtyZXR1cm4gdGhpcy5taW4ueDw9dC5taW4ueCYmdC5tYXgueDw9dGhpcy5tYXgueCYmdGhpcy5taW4ueTw9dC5taW4ueSYmdC5tYXgueTw9dGhpcy5tYXgueSYmdGhpcy5taW4uejw9dC5taW4ueiYmdC5tYXguejw9dGhpcy5tYXguen1nZXRQYXJhbWV0ZXIodCxlKXtyZXR1cm4gZS5zZXQoKHQueC10aGlzLm1pbi54KS8odGhpcy5tYXgueC10aGlzLm1pbi54KSwodC55LXRoaXMubWluLnkpLyh0aGlzLm1heC55LXRoaXMubWluLnkpLCh0LnotdGhpcy5taW4ueikvKHRoaXMubWF4LnotdGhpcy5taW4ueikpfWludGVyc2VjdHNCb3godCl7cmV0dXJuISh0Lm1heC54PHRoaXMubWluLnh8fHQubWluLng+dGhpcy5tYXgueHx8dC5tYXgueTx0aGlzLm1pbi55fHx0Lm1pbi55PnRoaXMubWF4Lnl8fHQubWF4Lno8dGhpcy5taW4uenx8dC5taW4uej50aGlzLm1heC56KX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0aGlzLmNsYW1wUG9pbnQodC5jZW50ZXIsZmF0KSxmYXQuZGlzdGFuY2VUb1NxdWFyZWQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31pbnRlcnNlY3RzUGxhbmUodCl7bGV0IGUsbjtyZXR1cm4gdC5ub3JtYWwueD4wPyhlPXQubm9ybWFsLngqdGhpcy5taW4ueCxuPXQubm9ybWFsLngqdGhpcy5tYXgueCk6KGU9dC5ub3JtYWwueCp0aGlzLm1heC54LG49dC5ub3JtYWwueCp0aGlzLm1pbi54KSx0Lm5vcm1hbC55PjA/KGUrPXQubm9ybWFsLnkqdGhpcy5taW4ueSxuKz10Lm5vcm1hbC55KnRoaXMubWF4LnkpOihlKz10Lm5vcm1hbC55KnRoaXMubWF4Lnksbis9dC5ub3JtYWwueSp0aGlzLm1pbi55KSx0Lm5vcm1hbC56PjA/KGUrPXQubm9ybWFsLnoqdGhpcy5taW4ueixuKz10Lm5vcm1hbC56KnRoaXMubWF4LnopOihlKz10Lm5vcm1hbC56KnRoaXMubWF4Lnosbis9dC5ub3JtYWwueip0aGlzLm1pbi56KSxlPD0tdC5jb25zdGFudCYmbj49LXQuY29uc3RhbnR9aW50ZXJzZWN0c1RyaWFuZ2xlKHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiExO3RoaXMuZ2V0Q2VudGVyKHZhdCkseGF0LnN1YlZlY3RvcnModGhpcy5tYXgsdmF0KSxoYXQuc3ViVmVjdG9ycyh0LmEsdmF0KSxiYXQuc3ViVmVjdG9ycyh0LmIsdmF0KSx5YXQuc3ViVmVjdG9ycyh0LmMsdmF0KSxfYXQuc3ViVmVjdG9ycyhiYXQsaGF0KSxDYXQuc3ViVmVjdG9ycyh5YXQsYmF0KSxNYXQuc3ViVmVjdG9ycyhoYXQseWF0KTtsZXQgZT1bMCwtX2F0LnosX2F0LnksMCwtQ2F0LnosQ2F0LnksMCwtTWF0LnosTWF0LnksX2F0LnosMCwtX2F0LngsQ2F0LnosMCwtQ2F0LngsTWF0LnosMCwtTWF0LngsLV9hdC55LF9hdC54LDAsLUNhdC55LENhdC54LDAsLU1hdC55LE1hdC54LDBdO3JldHVybiEhd2F0KGUsaGF0LGJhdCx5YXQseGF0KSYmKGU9WzEsMCwwLDAsMSwwLDAsMCwxXSwhIXdhdChlLGhhdCxiYXQseWF0LHhhdCkmJihPYXQuY3Jvc3NWZWN0b3JzKF9hdCxDYXQpLGU9W09hdC54LE9hdC55LE9hdC56XSx3YXQoZSxoYXQsYmF0LHlhdCx4YXQpKSl9Y2xhbXBQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gZmF0LmNvcHkodCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpLnN1Yih0KS5sZW5ndGgoKX1nZXRCb3VuZGluZ1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5nZXRDZW50ZXIodC5jZW50ZXIpLHQucmFkaXVzPS41KnRoaXMuZ2V0U2l6ZShmYXQpLmxlbmd0aCgpLHR9aW50ZXJzZWN0KHQpe3JldHVybiB0aGlzLm1pbi5tYXgodC5taW4pLHRoaXMubWF4Lm1pbih0Lm1heCksdGhpcy5pc0VtcHR5KCkmJnRoaXMubWFrZUVtcHR5KCksdGhpc311bmlvbih0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQubWluKSx0aGlzLm1heC5tYXgodC5tYXgpLHRoaXN9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKXx8KHVhdFswXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSx1YXRbMV0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksdWF0WzJdLnNldCh0aGlzLm1pbi54LHRoaXMubWF4LnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLHVhdFszXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx1YXRbNF0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksdWF0WzVdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLHVhdFs2XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSx1YXRbN10uc2V0KHRoaXMubWF4LngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksdGhpcy5zZXRGcm9tUG9pbnRzKHVhdCkpLHRoaXN9dHJhbnNsYXRlKHQpe3JldHVybiB0aGlzLm1pbi5hZGQodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm1pbi5lcXVhbHModGhpcy5taW4pJiZ0Lm1heC5lcXVhbHModGhpcy5tYXgpfX1tYXQucHJvdG90eXBlLmlzQm94Mz0hMDtjb25zdCB1YXQ9W25ldyBjYXQsbmV3IGNhdCxuZXcgY2F0LG5ldyBjYXQsbmV3IGNhdCxuZXcgY2F0LG5ldyBjYXQsbmV3IGNhdF0sZmF0PW5ldyBjYXQsZ2F0PW5ldyBtYXQsaGF0PW5ldyBjYXQsYmF0PW5ldyBjYXQseWF0PW5ldyBjYXQsX2F0PW5ldyBjYXQsQ2F0PW5ldyBjYXQsTWF0PW5ldyBjYXQsdmF0PW5ldyBjYXQseGF0PW5ldyBjYXQsT2F0PW5ldyBjYXQsUGF0PW5ldyBjYXQ7ZnVuY3Rpb24gd2F0KHQsZSxuLG8saSl7Zm9yKGxldCBhPTAscj10Lmxlbmd0aC0zO2E8PXI7YSs9Myl7UGF0LmZyb21BcnJheSh0LGEpO2NvbnN0IHI9aS54Kk1hdGguYWJzKFBhdC54KStpLnkqTWF0aC5hYnMoUGF0LnkpK2kueipNYXRoLmFicyhQYXQueikscz1lLmRvdChQYXQpLGw9bi5kb3QoUGF0KSxjPW8uZG90KFBhdCk7aWYoTWF0aC5tYXgoLU1hdGgubWF4KHMsbCxjKSxNYXRoLm1pbihzLGwsYykpPnIpcmV0dXJuITF9cmV0dXJuITB9Y29uc3Qga2F0PW5ldyBtYXQsU2F0PW5ldyBjYXQsRGF0PW5ldyBjYXQsRWF0PW5ldyBjYXQ7Y2xhc3MgUmF0e2NvbnN0cnVjdG9yKHQ9bmV3IGNhdCxlPS0xKXt0aGlzLmNlbnRlcj10LHRoaXMucmFkaXVzPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodCksdGhpcy5yYWRpdXM9ZSx0aGlzfXNldEZyb21Qb2ludHModCxlKXtjb25zdCBuPXRoaXMuY2VudGVyO3ZvaWQgMCE9PWU/bi5jb3B5KGUpOmthdC5zZXRGcm9tUG9pbnRzKHQpLmdldENlbnRlcihuKTtsZXQgbz0wO2ZvcihsZXQgZT0wLGk9dC5sZW5ndGg7ZTxpO2UrKylvPU1hdGgubWF4KG8sbi5kaXN0YW5jZVRvU3F1YXJlZCh0W2VdKSk7cmV0dXJuIHRoaXMucmFkaXVzPU1hdGguc3FydChvKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodC5jZW50ZXIpLHRoaXMucmFkaXVzPXQucmFkaXVzLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLnJhZGl1czwwfW1ha2VFbXB0eSgpe3JldHVybiB0aGlzLmNlbnRlci5zZXQoMCwwLDApLHRoaXMucmFkaXVzPS0xLHRoaXN9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdC5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcik8PXRoaXMucmFkaXVzKnRoaXMucmFkaXVzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdC5kaXN0YW5jZVRvKHRoaXMuY2VudGVyKS10aGlzLnJhZGl1c31pbnRlcnNlY3RzU3BoZXJlKHQpe2NvbnN0IGU9dGhpcy5yYWRpdXMrdC5yYWRpdXM7cmV0dXJuIHQuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9ZSplfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQuaW50ZXJzZWN0c1NwaGVyZSh0aGlzKX1pbnRlcnNlY3RzUGxhbmUodCl7cmV0dXJuIE1hdGguYWJzKHQuZGlzdGFuY2VUb1BvaW50KHRoaXMuY2VudGVyKSk8PXRoaXMucmFkaXVzfWNsYW1wUG9pbnQodCxlKXtjb25zdCBuPXRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHQpO3JldHVybiBlLmNvcHkodCksbj50aGlzLnJhZGl1cyp0aGlzLnJhZGl1cyYmKGUuc3ViKHRoaXMuY2VudGVyKS5ub3JtYWxpemUoKSxlLm11bHRpcGx5U2NhbGFyKHRoaXMucmFkaXVzKS5hZGQodGhpcy5jZW50ZXIpKSxlfWdldEJvdW5kaW5nQm94KHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT8odC5tYWtlRW1wdHkoKSx0KToodC5zZXQodGhpcy5jZW50ZXIsdGhpcy5jZW50ZXIpLHQuZXhwYW5kQnlTY2FsYXIodGhpcy5yYWRpdXMpLHQpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0KHQpLHRoaXMucmFkaXVzPXRoaXMucmFkaXVzKnQuZ2V0TWF4U2NhbGVPbkF4aXMoKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuYWRkKHQpLHRoaXN9ZXhwYW5kQnlQb2ludCh0KXtFYXQuc3ViVmVjdG9ycyh0LHRoaXMuY2VudGVyKTtjb25zdCBlPUVhdC5sZW5ndGhTcSgpO2lmKGU+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMpe2NvbnN0IHQ9TWF0aC5zcXJ0KGUpLG49LjUqKHQtdGhpcy5yYWRpdXMpO3RoaXMuY2VudGVyLmFkZChFYXQubXVsdGlwbHlTY2FsYXIobi90KSksdGhpcy5yYWRpdXMrPW59cmV0dXJuIHRoaXN9dW5pb24odCl7cmV0dXJuIERhdC5zdWJWZWN0b3JzKHQuY2VudGVyLHRoaXMuY2VudGVyKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0LnJhZGl1cyksdGhpcy5leHBhbmRCeVBvaW50KFNhdC5jb3B5KHQuY2VudGVyKS5hZGQoRGF0KSksdGhpcy5leHBhbmRCeVBvaW50KFNhdC5jb3B5KHQuY2VudGVyKS5zdWIoRGF0KSksdGhpc31lcXVhbHModCl7cmV0dXJuIHQuY2VudGVyLmVxdWFscyh0aGlzLmNlbnRlcikmJnQucmFkaXVzPT09dGhpcy5yYWRpdXN9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fWNvbnN0IEFhdD1uZXcgY2F0LFRhdD1uZXcgY2F0LE5hdD1uZXcgY2F0LHphdD1uZXcgY2F0LElhdD1uZXcgY2F0LEhhdD1uZXcgY2F0LEZhdD1uZXcgY2F0O2NsYXNzIExhdHtjb25zdHJ1Y3Rvcih0PW5ldyBjYXQsZT1uZXcgY2F0KDAsMCwtMSkpe3RoaXMub3JpZ2luPXQsdGhpcy5kaXJlY3Rpb249ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5vcmlnaW4uY29weSh0KSx0aGlzLmRpcmVjdGlvbi5jb3B5KGUpLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5vcmlnaW4uY29weSh0Lm9yaWdpbiksdGhpcy5kaXJlY3Rpb24uY29weSh0LmRpcmVjdGlvbiksdGhpc31hdCh0LGUpe3JldHVybiBlLmNvcHkodGhpcy5kaXJlY3Rpb24pLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLm9yaWdpbil9bG9va0F0KHQpe3JldHVybiB0aGlzLmRpcmVjdGlvbi5jb3B5KHQpLnN1Yih0aGlzLm9yaWdpbikubm9ybWFsaXplKCksdGhpc31yZWNhc3QodCl7cmV0dXJuIHRoaXMub3JpZ2luLmNvcHkodGhpcy5hdCh0LEFhdCkpLHRoaXN9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2Uuc3ViVmVjdG9ycyh0LHRoaXMub3JpZ2luKTtjb25zdCBuPWUuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gbjwwP2UuY29weSh0aGlzLm9yaWdpbik6ZS5jb3B5KHRoaXMuZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcihuKS5hZGQodGhpcy5vcmlnaW4pfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQodCkpfWRpc3RhbmNlU3FUb1BvaW50KHQpe2NvbnN0IGU9QWF0LnN1YlZlY3RvcnModCx0aGlzLm9yaWdpbikuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gZTwwP3RoaXMub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKHQpOihBYXQuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoZSkuYWRkKHRoaXMub3JpZ2luKSxBYXQuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlU3FUb1NlZ21lbnQodCxlLG4sbyl7VGF0LmNvcHkodCkuYWRkKGUpLm11bHRpcGx5U2NhbGFyKC41KSxOYXQuY29weShlKS5zdWIodCkubm9ybWFsaXplKCksemF0LmNvcHkodGhpcy5vcmlnaW4pLnN1YihUYXQpO2NvbnN0IGk9LjUqdC5kaXN0YW5jZVRvKGUpLGE9LXRoaXMuZGlyZWN0aW9uLmRvdChOYXQpLHI9emF0LmRvdCh0aGlzLmRpcmVjdGlvbikscz0temF0LmRvdChOYXQpLGw9emF0Lmxlbmd0aFNxKCksYz1NYXRoLmFicygxLWEqYSk7bGV0IGQscCxtLHU7aWYoYz4wKWlmKGQ9YSpzLXIscD1hKnItcyx1PWkqYyxkPj0wKWlmKHA+PS11KWlmKHA8PXUpe2NvbnN0IHQ9MS9jO2QqPXQscCo9dCxtPWQqKGQrYSpwKzIqcikrcCooYSpkK3ArMipzKStsfWVsc2UgcD1pLGQ9TWF0aC5tYXgoMCwtKGEqcCtyKSksbT0tZCpkK3AqKHArMipzKStsO2Vsc2UgcD0taSxkPU1hdGgubWF4KDAsLShhKnArcikpLG09LWQqZCtwKihwKzIqcykrbDtlbHNlIHA8PS11PyhkPU1hdGgubWF4KDAsLSgtYSppK3IpKSxwPWQ+MD8taTpNYXRoLm1pbihNYXRoLm1heCgtaSwtcyksaSksbT0tZCpkK3AqKHArMipzKStsKTpwPD11PyhkPTAscD1NYXRoLm1pbihNYXRoLm1heCgtaSwtcyksaSksbT1wKihwKzIqcykrbCk6KGQ9TWF0aC5tYXgoMCwtKGEqaStyKSkscD1kPjA/aTpNYXRoLm1pbihNYXRoLm1heCgtaSwtcyksaSksbT0tZCpkK3AqKHArMipzKStsKTtlbHNlIHA9YT4wPy1pOmksZD1NYXRoLm1heCgwLC0oYSpwK3IpKSxtPS1kKmQrcCoocCsyKnMpK2w7cmV0dXJuIG4mJm4uY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoZCkuYWRkKHRoaXMub3JpZ2luKSxvJiZvLmNvcHkoTmF0KS5tdWx0aXBseVNjYWxhcihwKS5hZGQoVGF0KSxtfWludGVyc2VjdFNwaGVyZSh0LGUpe0FhdC5zdWJWZWN0b3JzKHQuY2VudGVyLHRoaXMub3JpZ2luKTtjb25zdCBuPUFhdC5kb3QodGhpcy5kaXJlY3Rpb24pLG89QWF0LmRvdChBYXQpLW4qbixpPXQucmFkaXVzKnQucmFkaXVzO2lmKG8+aSlyZXR1cm4gbnVsbDtjb25zdCBhPU1hdGguc3FydChpLW8pLHI9bi1hLHM9bithO3JldHVybiByPDAmJnM8MD9udWxsOnRoaXMuYXQocjwwP3M6cixlKX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KHQuY2VudGVyKTw9dC5yYWRpdXMqdC5yYWRpdXN9ZGlzdGFuY2VUb1BsYW5lKHQpe2NvbnN0IGU9dC5ub3JtYWwuZG90KHRoaXMuZGlyZWN0aW9uKTtpZigwPT09ZSlyZXR1cm4gMD09PXQuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKT8wOm51bGw7Y29uc3Qgbj0tKHRoaXMub3JpZ2luLmRvdCh0Lm5vcm1hbCkrdC5jb25zdGFudCkvZTtyZXR1cm4gbj49MD9uOm51bGx9aW50ZXJzZWN0UGxhbmUodCxlKXtjb25zdCBuPXRoaXMuZGlzdGFuY2VUb1BsYW5lKHQpO3JldHVybiBudWxsPT09bj9udWxsOnRoaXMuYXQobixlKX1pbnRlcnNlY3RzUGxhbmUodCl7Y29uc3QgZT10LmRpc3RhbmNlVG9Qb2ludCh0aGlzLm9yaWdpbik7cmV0dXJuIDA9PT1lfHx0Lm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pKmU8MH1pbnRlcnNlY3RCb3godCxlKXtsZXQgbixvLGksYSxyLHM7Y29uc3QgbD0xL3RoaXMuZGlyZWN0aW9uLngsYz0xL3RoaXMuZGlyZWN0aW9uLnksZD0xL3RoaXMuZGlyZWN0aW9uLnoscD10aGlzLm9yaWdpbjtyZXR1cm4gbD49MD8obj0odC5taW4ueC1wLngpKmwsbz0odC5tYXgueC1wLngpKmwpOihuPSh0Lm1heC54LXAueCkqbCxvPSh0Lm1pbi54LXAueCkqbCksYz49MD8oaT0odC5taW4ueS1wLnkpKmMsYT0odC5tYXgueS1wLnkpKmMpOihpPSh0Lm1heC55LXAueSkqYyxhPSh0Lm1pbi55LXAueSkqYyksbj5hfHxpPm8/bnVsbDooKGk+bnx8biE9bikmJihuPWkpLChhPG98fG8hPW8pJiYobz1hKSxkPj0wPyhyPSh0Lm1pbi56LXAueikqZCxzPSh0Lm1heC56LXAueikqZCk6KHI9KHQubWF4LnotcC56KSpkLHM9KHQubWluLnotcC56KSpkKSxuPnN8fHI+bz9udWxsOigocj5ufHxuIT1uKSYmKG49ciksKHM8b3x8byE9bykmJihvPXMpLG88MD9udWxsOnRoaXMuYXQobj49MD9uOm8sZSkpKX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiBudWxsIT09dGhpcy5pbnRlcnNlY3RCb3godCxBYXQpfWludGVyc2VjdFRyaWFuZ2xlKHQsZSxuLG8saSl7SWF0LnN1YlZlY3RvcnMoZSx0KSxIYXQuc3ViVmVjdG9ycyhuLHQpLEZhdC5jcm9zc1ZlY3RvcnMoSWF0LEhhdCk7bGV0IGEscj10aGlzLmRpcmVjdGlvbi5kb3QoRmF0KTtpZihyPjApe2lmKG8pcmV0dXJuIG51bGw7YT0xfWVsc2V7aWYoIShyPDApKXJldHVybiBudWxsO2E9LTEscj0tcn16YXQuc3ViVmVjdG9ycyh0aGlzLm9yaWdpbix0KTtjb25zdCBzPWEqdGhpcy5kaXJlY3Rpb24uZG90KEhhdC5jcm9zc1ZlY3RvcnMoemF0LEhhdCkpO2lmKHM8MClyZXR1cm4gbnVsbDtjb25zdCBsPWEqdGhpcy5kaXJlY3Rpb24uZG90KElhdC5jcm9zcyh6YXQpKTtpZihsPDApcmV0dXJuIG51bGw7aWYocytsPnIpcmV0dXJuIG51bGw7Y29uc3QgYz0tYSp6YXQuZG90KEZhdCk7cmV0dXJuIGM8MD9udWxsOnRoaXMuYXQoYy9yLGkpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5vcmlnaW4uYXBwbHlNYXRyaXg0KHQpLHRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5vcmlnaW4uZXF1YWxzKHRoaXMub3JpZ2luKSYmdC5kaXJlY3Rpb24uZXF1YWxzKHRoaXMuZGlyZWN0aW9uKX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19Y2xhc3MgQmF0e2NvbnN0cnVjdG9yKCl7dGhpcy5lbGVtZW50cz1bMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV0sYXJndW1lbnRzLmxlbmd0aD4wJiZjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLiIpfXNldCh0LGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZixnKXtjb25zdCBoPXRoaXMuZWxlbWVudHM7cmV0dXJuIGhbMF09dCxoWzRdPWUsaFs4XT1uLGhbMTJdPW8saFsxXT1pLGhbNV09YSxoWzldPXIsaFsxM109cyxoWzJdPWwsaFs2XT1jLGhbMTBdPWQsaFsxNF09cCxoWzNdPW0saFs3XT11LGhbMTFdPWYsaFsxNV09Zyx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDEpLHRoaXN9Y2xvbmUoKXtyZXR1cm4obmV3IEJhdCkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfWNvcHkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVswXT1uWzBdLGVbMV09blsxXSxlWzJdPW5bMl0sZVszXT1uWzNdLGVbNF09bls0XSxlWzVdPW5bNV0sZVs2XT1uWzZdLGVbN109bls3XSxlWzhdPW5bOF0sZVs5XT1uWzldLGVbMTBdPW5bMTBdLGVbMTFdPW5bMTFdLGVbMTJdPW5bMTJdLGVbMTNdPW5bMTNdLGVbMTRdPW5bMTRdLGVbMTVdPW5bMTVdLHRoaXN9Y29weVBvc2l0aW9uKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7cmV0dXJuIGVbMTJdPW5bMTJdLGVbMTNdPW5bMTNdLGVbMTRdPW5bMTRdLHRoaXN9c2V0RnJvbU1hdHJpeDModCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnNldChlWzBdLGVbM10sZVs2XSwwLGVbMV0sZVs0XSxlWzddLDAsZVsyXSxlWzVdLGVbOF0sMCwwLDAsMCwxKSx0aGlzfWV4dHJhY3RCYXNpcyh0LGUsbil7cmV0dXJuIHQuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDEpLG4uc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDIpLHRoaXN9bWFrZUJhc2lzKHQsZSxuKXtyZXR1cm4gdGhpcy5zZXQodC54LGUueCxuLngsMCx0LnksZS55LG4ueSwwLHQueixlLnosbi56LDAsMCwwLDAsMSksdGhpc31leHRyYWN0Um90YXRpb24odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cyxvPTEvVmF0LnNldEZyb21NYXRyaXhDb2x1bW4odCwwKS5sZW5ndGgoKSxpPTEvVmF0LnNldEZyb21NYXRyaXhDb2x1bW4odCwxKS5sZW5ndGgoKSxhPTEvVmF0LnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gZVswXT1uWzBdKm8sZVsxXT1uWzFdKm8sZVsyXT1uWzJdKm8sZVszXT0wLGVbNF09bls0XSppLGVbNV09bls1XSppLGVbNl09bls2XSppLGVbN109MCxlWzhdPW5bOF0qYSxlWzldPW5bOV0qYSxlWzEwXT1uWzEwXSphLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21FdWxlcih0KXt0JiZ0LmlzRXVsZXJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5tYWtlUm90YXRpb25Gcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuIik7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC54LG89dC55LGk9dC56LGE9TWF0aC5jb3Mobikscj1NYXRoLnNpbihuKSxzPU1hdGguY29zKG8pLGw9TWF0aC5zaW4obyksYz1NYXRoLmNvcyhpKSxkPU1hdGguc2luKGkpO2lmKCJYWVoiPT09dC5vcmRlcil7Y29uc3QgdD1hKmMsbj1hKmQsbz1yKmMsaT1yKmQ7ZVswXT1zKmMsZVs0XT0tcypkLGVbOF09bCxlWzFdPW4rbypsLGVbNV09dC1pKmwsZVs5XT0tcipzLGVbMl09aS10KmwsZVs2XT1vK24qbCxlWzEwXT1hKnN9ZWxzZSBpZigiWVhaIj09PXQub3JkZXIpe2NvbnN0IHQ9cypjLG49cypkLG89bCpjLGk9bCpkO2VbMF09dCtpKnIsZVs0XT1vKnItbixlWzhdPWEqbCxlWzFdPWEqZCxlWzVdPWEqYyxlWzldPS1yLGVbMl09bipyLW8sZVs2XT1pK3QqcixlWzEwXT1hKnN9ZWxzZSBpZigiWlhZIj09PXQub3JkZXIpe2NvbnN0IHQ9cypjLG49cypkLG89bCpjLGk9bCpkO2VbMF09dC1pKnIsZVs0XT0tYSpkLGVbOF09bytuKnIsZVsxXT1uK28qcixlWzVdPWEqYyxlWzldPWktdCpyLGVbMl09LWEqbCxlWzZdPXIsZVsxMF09YSpzfWVsc2UgaWYoIlpZWCI9PT10Lm9yZGVyKXtjb25zdCB0PWEqYyxuPWEqZCxvPXIqYyxpPXIqZDtlWzBdPXMqYyxlWzRdPW8qbC1uLGVbOF09dCpsK2ksZVsxXT1zKmQsZVs1XT1pKmwrdCxlWzldPW4qbC1vLGVbMl09LWwsZVs2XT1yKnMsZVsxMF09YSpzfWVsc2UgaWYoIllaWCI9PT10Lm9yZGVyKXtjb25zdCB0PWEqcyxuPWEqbCxvPXIqcyxpPXIqbDtlWzBdPXMqYyxlWzRdPWktdCpkLGVbOF09bypkK24sZVsxXT1kLGVbNV09YSpjLGVbOV09LXIqYyxlWzJdPS1sKmMsZVs2XT1uKmQrbyxlWzEwXT10LWkqZH1lbHNlIGlmKCJYWlkiPT09dC5vcmRlcil7Y29uc3QgdD1hKnMsbj1hKmwsbz1yKnMsaT1yKmw7ZVswXT1zKmMsZVs0XT0tZCxlWzhdPWwqYyxlWzFdPXQqZCtpLGVbNV09YSpjLGVbOV09bipkLW8sZVsyXT1vKmQtbixlWzZdPXIqYyxlWzEwXT1pKmQrdH1yZXR1cm4gZVszXT0wLGVbN109MCxlWzExXT0wLGVbMTJdPTAsZVsxM109MCxlWzE0XT0wLGVbMTVdPTEsdGhpc31tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy5jb21wb3NlKFVhdCx0LEdhdCl9bG9va0F0KHQsZSxuKXtjb25zdCBvPXRoaXMuZWxlbWVudHM7cmV0dXJuIHFhdC5zdWJWZWN0b3JzKHQsZSksMD09PXFhdC5sZW5ndGhTcSgpJiYocWF0Lno9MSkscWF0Lm5vcm1hbGl6ZSgpLFdhdC5jcm9zc1ZlY3RvcnMobixxYXQpLDA9PT1XYXQubGVuZ3RoU3EoKSYmKDE9PT1NYXRoLmFicyhuLnopP3FhdC54Kz0xZS00OnFhdC56Kz0xZS00LHFhdC5ub3JtYWxpemUoKSxXYXQuY3Jvc3NWZWN0b3JzKG4scWF0KSksV2F0Lm5vcm1hbGl6ZSgpLFlhdC5jcm9zc1ZlY3RvcnMocWF0LFdhdCksb1swXT1XYXQueCxvWzRdPVlhdC54LG9bOF09cWF0Lngsb1sxXT1XYXQueSxvWzVdPVlhdC55LG9bOV09cWF0Lnksb1syXT1XYXQueixvWzZdPVlhdC56LG9bMTBdPXFhdC56LHRoaXN9bXVsdGlwbHkodCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseU1hdHJpY2VzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5TWF0cmljZXModCxlKSk6dGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LHRoaXMpfW11bHRpcGx5TWF0cmljZXModCxlKXtjb25zdCBuPXQuZWxlbWVudHMsbz1lLmVsZW1lbnRzLGk9dGhpcy5lbGVtZW50cyxhPW5bMF0scj1uWzRdLHM9bls4XSxsPW5bMTJdLGM9blsxXSxkPW5bNV0scD1uWzldLG09blsxM10sdT1uWzJdLGY9bls2XSxnPW5bMTBdLGg9blsxNF0sYj1uWzNdLHk9bls3XSxfPW5bMTFdLEM9blsxNV0sTT1vWzBdLHY9b1s0XSx4PW9bOF0sTz1vWzEyXSxQPW9bMV0sdz1vWzVdLGs9b1s5XSxTPW9bMTNdLEQ9b1syXSxFPW9bNl0sUj1vWzEwXSxBPW9bMTRdLFQ9b1szXSxOPW9bN10sej1vWzExXSxJPW9bMTVdO3JldHVybiBpWzBdPWEqTStyKlArcypEK2wqVCxpWzRdPWEqdityKncrcypFK2wqTixpWzhdPWEqeCtyKmsrcypSK2wqeixpWzEyXT1hKk8rcipTK3MqQStsKkksaVsxXT1jKk0rZCpQK3AqRCttKlQsaVs1XT1jKnYrZCp3K3AqRSttKk4saVs5XT1jKngrZCprK3AqUittKnosaVsxM109YypPK2QqUytwKkErbSpJLGlbMl09dSpNK2YqUCtnKkQraCpULGlbNl09dSp2K2YqdytnKkUraCpOLGlbMTBdPXUqeCtmKmsrZypSK2gqeixpWzE0XT11Kk8rZipTK2cqQStoKkksaVszXT1iKk0reSpQK18qRCtDKlQsaVs3XT1iKnYreSp3K18qRStDKk4saVsxMV09Yip4K3kqaytfKlIrQyp6LGlbMTVdPWIqTyt5KlMrXypBK0MqSSx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gZVswXSo9dCxlWzRdKj10LGVbOF0qPXQsZVsxMl0qPXQsZVsxXSo9dCxlWzVdKj10LGVbOV0qPXQsZVsxM10qPXQsZVsyXSo9dCxlWzZdKj10LGVbMTBdKj10LGVbMTRdKj10LGVbM10qPXQsZVs3XSo9dCxlWzExXSo9dCxlWzE1XSo9dCx0aGlzfWRldGVybWluYW50KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbNF0sbz10WzhdLGk9dFsxMl0sYT10WzFdLHI9dFs1XSxzPXRbOV0sbD10WzEzXSxjPXRbMl0sZD10WzZdLHA9dFsxMF0sbT10WzE0XTtyZXR1cm4gdFszXSooK2kqcypkLW8qbCpkLWkqcipwK24qbCpwK28qciptLW4qcyptKSt0WzddKigrZSpzKm0tZSpsKnAraSphKnAtbyphKm0rbypsKmMtaSpzKmMpK3RbMTFdKigrZSpsKmQtZSpyKm0taSphKmQrbiphKm0raSpyKmMtbipsKmMpK3RbMTVdKigtbypyKmMtZSpzKmQrZSpyKnArbyphKmQtbiphKnArbipzKmMpfXRyYW5zcG9zZSgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cztsZXQgZTtyZXR1cm4gZT10WzFdLHRbMV09dFs0XSx0WzRdPWUsZT10WzJdLHRbMl09dFs4XSx0WzhdPWUsZT10WzZdLHRbNl09dFs5XSx0WzldPWUsZT10WzNdLHRbM109dFsxMl0sdFsxMl09ZSxlPXRbN10sdFs3XT10WzEzXSx0WzEzXT1lLGU9dFsxMV0sdFsxMV09dFsxNF0sdFsxNF09ZSx0aGlzfXNldFBvc2l0aW9uKHQsZSxuKXtjb25zdCBvPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQuaXNWZWN0b3IzPyhvWzEyXT10Lngsb1sxM109dC55LG9bMTRdPXQueik6KG9bMTJdPXQsb1sxM109ZSxvWzE0XT1uKSx0aGlzfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLG89dFsyXSxpPXRbM10sYT10WzRdLHI9dFs1XSxzPXRbNl0sbD10WzddLGM9dFs4XSxkPXRbOV0scD10WzEwXSxtPXRbMTFdLHU9dFsxMl0sZj10WzEzXSxnPXRbMTRdLGg9dFsxNV0sYj1kKmcqbC1mKnAqbCtmKnMqbS1yKmcqbS1kKnMqaCtyKnAqaCx5PXUqcCpsLWMqZypsLXUqcyptK2EqZyptK2MqcypoLWEqcCpoLF89YypmKmwtdSpkKmwrdSpyKm0tYSpmKm0tYypyKmgrYSpkKmgsQz11KmQqcy1jKmYqcy11KnIqcCthKmYqcCtjKnIqZy1hKmQqZyxNPWUqYituKnkrbypfK2kqQztpZigwPT09TSlyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3Qgdj0xL007cmV0dXJuIHRbMF09Yip2LHRbMV09KGYqcCppLWQqZyppLWYqbyptK24qZyptK2QqbypoLW4qcCpoKSp2LHRbMl09KHIqZyppLWYqcyppK2YqbypsLW4qZypsLXIqbypoK24qcypoKSp2LHRbM109KGQqcyppLXIqcCppLWQqbypsK24qcCpsK3IqbyptLW4qcyptKSp2LHRbNF09eSp2LHRbNV09KGMqZyppLXUqcCppK3UqbyptLWUqZyptLWMqbypoK2UqcCpoKSp2LHRbNl09KHUqcyppLWEqZyppLXUqbypsK2UqZypsK2EqbypoLWUqcypoKSp2LHRbN109KGEqcCppLWMqcyppK2MqbypsLWUqcCpsLWEqbyptK2UqcyptKSp2LHRbOF09Xyp2LHRbOV09KHUqZCppLWMqZippLXUqbiptK2UqZiptK2MqbipoLWUqZCpoKSp2LHRbMTBdPShhKmYqaS11KnIqaSt1Km4qbC1lKmYqbC1hKm4qaCtlKnIqaCkqdix0WzExXT0oYypyKmktYSpkKmktYypuKmwrZSpkKmwrYSpuKm0tZSpyKm0pKnYsdFsxMl09Qyp2LHRbMTNdPShjKmYqby11KmQqbyt1Km4qcC1lKmYqcC1jKm4qZytlKmQqZykqdix0WzE0XT0odSpyKm8tYSpmKm8tdSpuKnMrZSpmKnMrYSpuKmctZSpyKmcpKnYsdFsxNV09KGEqZCpvLWMqcipvK2MqbipzLWUqZCpzLWEqbipwK2UqcipwKSp2LHRoaXN9c2NhbGUodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC54LG89dC55LGk9dC56O3JldHVybiBlWzBdKj1uLGVbNF0qPW8sZVs4XSo9aSxlWzFdKj1uLGVbNV0qPW8sZVs5XSo9aSxlWzJdKj1uLGVbNl0qPW8sZVsxMF0qPWksZVszXSo9bixlWzddKj1vLGVbMTFdKj1pLHRoaXN9Z2V0TWF4U2NhbGVPbkF4aXMoKXtjb25zdCB0PXRoaXMuZWxlbWVudHM7cmV0dXJuIE1hdGguc3FydChNYXRoLm1heCh0WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSx0WzRdKnRbNF0rdFs1XSp0WzVdK3RbNl0qdFs2XSx0WzhdKnRbOF0rdFs5XSp0WzldK3RbMTBdKnRbMTBdKSl9bWFrZVRyYW5zbGF0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsdCwwLDEsMCxlLDAsMCwxLG4sMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25YKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLGUsLW4sMCwwLG4sZSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWSh0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsMCxuLDAsMCwxLDAsMCwtbiwwLGUsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbloodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLC1uLDAsMCxuLGUsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25BeGlzKHQsZSl7Y29uc3Qgbj1NYXRoLmNvcyhlKSxvPU1hdGguc2luKGUpLGk9MS1uLGE9dC54LHI9dC55LHM9dC56LGw9aSphLGM9aSpyO3JldHVybiB0aGlzLnNldChsKmErbixsKnItbypzLGwqcytvKnIsMCxsKnIrbypzLGMqcituLGMqcy1vKmEsMCxsKnMtbypyLGMqcytvKmEsaSpzKnMrbiwwLDAsMCwwLDEpLHRoaXN9bWFrZVNjYWxlKHQsZSxuKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCwwLGUsMCwwLDAsMCxuLDAsMCwwLDAsMSksdGhpc31tYWtlU2hlYXIodCxlLG4sbyxpLGEpe3JldHVybiB0aGlzLnNldCgxLG4saSwwLHQsMSxhLDAsZSxvLDEsMCwwLDAsMCwxKSx0aGlzfWNvbXBvc2UodCxlLG4pe2NvbnN0IG89dGhpcy5lbGVtZW50cyxpPWUuX3gsYT1lLl95LHI9ZS5feixzPWUuX3csbD1pK2ksYz1hK2EsZD1yK3IscD1pKmwsbT1pKmMsdT1pKmQsZj1hKmMsZz1hKmQsaD1yKmQsYj1zKmwseT1zKmMsXz1zKmQsQz1uLngsTT1uLnksdj1uLno7cmV0dXJuIG9bMF09KDEtKGYraCkpKkMsb1sxXT0obStfKSpDLG9bMl09KHUteSkqQyxvWzNdPTAsb1s0XT0obS1fKSpNLG9bNV09KDEtKHAraCkpKk0sb1s2XT0oZytiKSpNLG9bN109MCxvWzhdPSh1K3kpKnYsb1s5XT0oZy1iKSp2LG9bMTBdPSgxLShwK2YpKSp2LG9bMTFdPTAsb1sxMl09dC54LG9bMTNdPXQueSxvWzE0XT10Lnosb1sxNV09MSx0aGlzfWRlY29tcG9zZSh0LGUsbil7Y29uc3Qgbz10aGlzLmVsZW1lbnRzO2xldCBpPVZhdC5zZXQob1swXSxvWzFdLG9bMl0pLmxlbmd0aCgpO2NvbnN0IGE9VmF0LnNldChvWzRdLG9bNV0sb1s2XSkubGVuZ3RoKCkscj1WYXQuc2V0KG9bOF0sb1s5XSxvWzEwXSkubGVuZ3RoKCk7dGhpcy5kZXRlcm1pbmFudCgpPDAmJihpPS1pKSx0Lng9b1sxMl0sdC55PW9bMTNdLHQuej1vWzE0XSxqYXQuY29weSh0aGlzKTtjb25zdCBzPTEvaSxsPTEvYSxjPTEvcjtyZXR1cm4gamF0LmVsZW1lbnRzWzBdKj1zLGphdC5lbGVtZW50c1sxXSo9cyxqYXQuZWxlbWVudHNbMl0qPXMsamF0LmVsZW1lbnRzWzRdKj1sLGphdC5lbGVtZW50c1s1XSo9bCxqYXQuZWxlbWVudHNbNl0qPWwsamF0LmVsZW1lbnRzWzhdKj1jLGphdC5lbGVtZW50c1s5XSo9YyxqYXQuZWxlbWVudHNbMTBdKj1jLGUuc2V0RnJvbVJvdGF0aW9uTWF0cml4KGphdCksbi54PWksbi55PWEsbi56PXIsdGhpc31tYWtlUGVyc3BlY3RpdmUodCxlLG4sbyxpLGEpe3ZvaWQgMD09PWEmJmNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm1ha2VQZXJzcGVjdGl2ZSgpIGhhcyBiZWVuIHJlZGVmaW5lZCBhbmQgaGFzIGEgbmV3IHNpZ25hdHVyZS4gUGxlYXNlIGNoZWNrIHRoZSBkb2NzLiIpO2NvbnN0IHI9dGhpcy5lbGVtZW50cyxzPTIqaS8obi1vKSxsPShlK3QpLyhlLXQpLGM9KG4rbykvKG4tbyksZD0tKGEraSkvKGEtaSkscD0tMiphKmkvKGEtaSk7cmV0dXJuIHJbMF09MippLyhlLXQpLHJbNF09MCxyWzhdPWwsclsxMl09MCxyWzFdPTAscls1XT1zLHJbOV09YyxyWzEzXT0wLHJbMl09MCxyWzZdPTAsclsxMF09ZCxyWzE0XT1wLHJbM109MCxyWzddPTAsclsxMV09LTEsclsxNV09MCx0aGlzfW1ha2VPcnRob2dyYXBoaWModCxlLG4sbyxpLGEpe2NvbnN0IHI9dGhpcy5lbGVtZW50cyxzPTEvKGUtdCksbD0xLyhuLW8pLGM9MS8oYS1pKSxkPShlK3QpKnMscD0obitvKSpsLG09KGEraSkqYztyZXR1cm4gclswXT0yKnMscls0XT0wLHJbOF09MCxyWzEyXT0tZCxyWzFdPTAscls1XT0yKmwscls5XT0wLHJbMTNdPS1wLHJbMl09MCxyWzZdPTAsclsxMF09LTIqYyxyWzE0XT0tbSxyWzNdPTAscls3XT0wLHJbMTFdPTAsclsxNV09MSx0aGlzfWVxdWFscyh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO2ZvcihsZXQgdD0wO3Q8MTY7dCsrKWlmKGVbdF0hPT1uW3RdKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheSh0LGU9MCl7Zm9yKGxldCBuPTA7bjwxNjtuKyspdGhpcy5lbGVtZW50c1tuXT10W24rZV07cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO3JldHVybiB0W2VdPW5bMF0sdFtlKzFdPW5bMV0sdFtlKzJdPW5bMl0sdFtlKzNdPW5bM10sdFtlKzRdPW5bNF0sdFtlKzVdPW5bNV0sdFtlKzZdPW5bNl0sdFtlKzddPW5bN10sdFtlKzhdPW5bOF0sdFtlKzldPW5bOV0sdFtlKzEwXT1uWzEwXSx0W2UrMTFdPW5bMTFdLHRbZSsxMl09blsxMl0sdFtlKzEzXT1uWzEzXSx0W2UrMTRdPW5bMTRdLHRbZSsxNV09blsxNV0sdH19QmF0LnByb3RvdHlwZS5pc01hdHJpeDQ9ITA7Y29uc3QgVmF0PW5ldyBjYXQsamF0PW5ldyBCYXQsVWF0PW5ldyBjYXQoMCwwLDApLEdhdD1uZXcgY2F0KDEsMSwxKSxXYXQ9bmV3IGNhdCxZYXQ9bmV3IGNhdCxxYXQ9bmV3IGNhdCxaYXQ9bmV3IEJhdCxYYXQ9bmV3IGxhdDtjbGFzcyBLYXR7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAsbz1LYXQuRGVmYXVsdE9yZGVyKXt0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl9vcmRlcj1vfWdldCB4KCl7cmV0dXJuIHRoaXMuX3h9c2V0IHgodCl7dGhpcy5feD10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeSgpe3JldHVybiB0aGlzLl95fXNldCB5KHQpe3RoaXMuX3k9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fen1zZXQgeih0KXt0aGlzLl96PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCBvcmRlcigpe3JldHVybiB0aGlzLl9vcmRlcn1zZXQgb3JkZXIodCl7dGhpcy5fb3JkZXI9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9c2V0KHQsZSxuLG89dGhpcy5fb3JkZXIpe3JldHVybiB0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl9vcmRlcj1vLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX29yZGVyKX1jb3B5KHQpe3JldHVybiB0aGlzLl94PXQuX3gsdGhpcy5feT10Ll95LHRoaXMuX3o9dC5feix0aGlzLl9vcmRlcj10Ll9vcmRlcix0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUm90YXRpb25NYXRyaXgodCxlPXRoaXMuX29yZGVyLG49ITApe2NvbnN0IG89dC5lbGVtZW50cyxpPW9bMF0sYT1vWzRdLHI9b1s4XSxzPW9bMV0sbD1vWzVdLGM9b1s5XSxkPW9bMl0scD1vWzZdLG09b1sxMF07c3dpdGNoKGUpe2Nhc2UiWFlaIjp0aGlzLl95PU1hdGguYXNpbihaaXQociwtMSwxKSksTWF0aC5hYnMocik8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMigtYyxtKSx0aGlzLl96PU1hdGguYXRhbjIoLWEsaSkpOih0aGlzLl94PU1hdGguYXRhbjIocCxsKSx0aGlzLl96PTApO2JyZWFrO2Nhc2UiWVhaIjp0aGlzLl94PU1hdGguYXNpbigtWml0KGMsLTEsMSkpLE1hdGguYWJzKGMpPC45OTk5OTk5Pyh0aGlzLl95PU1hdGguYXRhbjIocixtKSx0aGlzLl96PU1hdGguYXRhbjIocyxsKSk6KHRoaXMuX3k9TWF0aC5hdGFuMigtZCxpKSx0aGlzLl96PTApO2JyZWFrO2Nhc2UiWlhZIjp0aGlzLl94PU1hdGguYXNpbihaaXQocCwtMSwxKSksTWF0aC5hYnMocCk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMigtZCxtKSx0aGlzLl96PU1hdGguYXRhbjIoLWEsbCkpOih0aGlzLl95PTAsdGhpcy5fej1NYXRoLmF0YW4yKHMsaSkpO2JyZWFrO2Nhc2UiWllYIjp0aGlzLl95PU1hdGguYXNpbigtWml0KGQsLTEsMSkpLE1hdGguYWJzKGQpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIocCxtKSx0aGlzLl96PU1hdGguYXRhbjIocyxpKSk6KHRoaXMuX3g9MCx0aGlzLl96PU1hdGguYXRhbjIoLWEsbCkpO2JyZWFrO2Nhc2UiWVpYIjp0aGlzLl96PU1hdGguYXNpbihaaXQocywtMSwxKSksTWF0aC5hYnMocyk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMigtYyxsKSx0aGlzLl95PU1hdGguYXRhbjIoLWQsaSkpOih0aGlzLl94PTAsdGhpcy5feT1NYXRoLmF0YW4yKHIsbSkpO2JyZWFrO2Nhc2UiWFpZIjp0aGlzLl96PU1hdGguYXNpbigtWml0KGEsLTEsMSkpLE1hdGguYWJzKGEpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIocCxsKSx0aGlzLl95PU1hdGguYXRhbjIocixpKSk6KHRoaXMuX3g9TWF0aC5hdGFuMigtYyxtKSx0aGlzLl95PTApO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrZSl9cmV0dXJuIHRoaXMuX29yZGVyPWUsITA9PT1uJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUXVhdGVybmlvbih0LGUsbil7cmV0dXJuIFphdC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KSx0aGlzLnNldEZyb21Sb3RhdGlvbk1hdHJpeChaYXQsZSxuKX1zZXRGcm9tVmVjdG9yMyh0LGU9dGhpcy5fb3JkZXIpe3JldHVybiB0aGlzLnNldCh0LngsdC55LHQueixlKX1yZW9yZGVyKHQpe3JldHVybiBYYXQuc2V0RnJvbUV1bGVyKHRoaXMpLHRoaXMuc2V0RnJvbVF1YXRlcm5pb24oWGF0LHQpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fb3JkZXI9PT10aGlzLl9vcmRlcn1mcm9tQXJyYXkodCl7cmV0dXJuIHRoaXMuX3g9dFswXSx0aGlzLl95PXRbMV0sdGhpcy5fej10WzJdLHZvaWQgMCE9PXRbM10mJih0aGlzLl9vcmRlcj10WzNdKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLl94LHRbZSsxXT10aGlzLl95LHRbZSsyXT10aGlzLl96LHRbZSszXT10aGlzLl9vcmRlcix0fXRvVmVjdG9yMyh0KXtyZXR1cm4gdD90LnNldCh0aGlzLl94LHRoaXMuX3ksdGhpcy5feik6bmV3IGNhdCh0aGlzLl94LHRoaXMuX3ksdGhpcy5feil9X29uQ2hhbmdlKHQpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPXQsdGhpc31fb25DaGFuZ2VDYWxsYmFjaygpe319S2F0LnByb3RvdHlwZS5pc0V1bGVyPSEwLEthdC5EZWZhdWx0T3JkZXI9IlhZWiIsS2F0LlJvdGF0aW9uT3JkZXJzPVsiWFlaIiwiWVpYIiwiWlhZIiwiWFpZIiwiWVhaIiwiWllYIl07Y2xhc3MgSmF0e2NvbnN0cnVjdG9yKCl7dGhpcy5tYXNrPTF9c2V0KHQpe3RoaXMubWFzaz0xPDx0fDB9ZW5hYmxlKHQpe3RoaXMubWFza3w9MTw8dHwwfWVuYWJsZUFsbCgpe3RoaXMubWFzaz0tMX10b2dnbGUodCl7dGhpcy5tYXNrXj0xPDx0fDB9ZGlzYWJsZSh0KXt0aGlzLm1hc2smPX4oMTw8dHwwKX1kaXNhYmxlQWxsKCl7dGhpcy5tYXNrPTB9dGVzdCh0KXtyZXR1cm4gMCE9KHRoaXMubWFzayZ0Lm1hc2spfX1sZXQgUWF0PTA7Y29uc3QgJGF0PW5ldyBjYXQsdHJ0PW5ldyBsYXQsZXJ0PW5ldyBCYXQsbnJ0PW5ldyBjYXQsb3J0PW5ldyBjYXQsaXJ0PW5ldyBjYXQsYXJ0PW5ldyBsYXQscnJ0PW5ldyBjYXQoMSwwLDApLHNydD1uZXcgY2F0KDAsMSwwKSxscnQ9bmV3IGNhdCgwLDAsMSksY3J0PXt0eXBlOiJhZGRlZCJ9LGRydD17dHlwZToicmVtb3ZlZCJ9O2NsYXNzIHBydCBleHRlbmRzIFVpdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6UWF0Kyt9KSx0aGlzLnV1aWQ9cWl0KCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iT2JqZWN0M0QiLHRoaXMucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnVwPXBydC5EZWZhdWx0VXAuY2xvbmUoKTtjb25zdCB0PW5ldyBjYXQsZT1uZXcgS2F0LG49bmV3IGxhdCxvPW5ldyBjYXQoMSwxLDEpO2UuX29uQ2hhbmdlKChmdW5jdGlvbiBpKCl7bi5zZXRGcm9tRXVsZXIoZSwhMSl9KSksbi5fb25DaGFuZ2UoKGZ1bmN0aW9uIGEoKXtlLnNldEZyb21RdWF0ZXJuaW9uKG4sdm9pZCAwLCExKX0pKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtwb3NpdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dH0scm90YXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmV9LHF1YXRlcm5pb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm59LHNjYWxlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpvfSxtb2RlbFZpZXdNYXRyaXg6e3ZhbHVlOm5ldyBCYXR9LG5vcm1hbE1hdHJpeDp7dmFsdWU6bmV3ICRpdH19KSx0aGlzLm1hdHJpeD1uZXcgQmF0LHRoaXMubWF0cml4V29ybGQ9bmV3IEJhdCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9cHJ0LkRlZmF1bHRNYXRyaXhBdXRvVXBkYXRlLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSx0aGlzLmxheWVycz1uZXcgSmF0LHRoaXMudmlzaWJsZT0hMCx0aGlzLmNhc3RTaGFkb3c9ITEsdGhpcy5yZWNlaXZlU2hhZG93PSExLHRoaXMuZnJ1c3R1bUN1bGxlZD0hMCx0aGlzLnJlbmRlck9yZGVyPTAsdGhpcy5hbmltYXRpb25zPVtdLHRoaXMudXNlckRhdGE9e319b25CZWZvcmVSZW5kZXIoKXt9b25BZnRlclJlbmRlcigpe31hcHBseU1hdHJpeDQodCl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLHRoaXMubWF0cml4LnByZW11bHRpcGx5KHQpLHRoaXMubWF0cml4LmRlY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKX1hcHBseVF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSh0KSx0aGlzfXNldFJvdGF0aW9uRnJvbUF4aXNBbmdsZSh0LGUpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKHQsZSl9c2V0Um90YXRpb25Gcm9tRXVsZXIodCl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21FdWxlcih0LCEwKX1zZXRSb3RhdGlvbkZyb21NYXRyaXgodCl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCh0KX1zZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpe3RoaXMucXVhdGVybmlvbi5jb3B5KHQpfXJvdGF0ZU9uQXhpcyh0LGUpe3JldHVybiB0cnQuc2V0RnJvbUF4aXNBbmdsZSh0LGUpLHRoaXMucXVhdGVybmlvbi5tdWx0aXBseSh0cnQpLHRoaXN9cm90YXRlT25Xb3JsZEF4aXModCxlKXtyZXR1cm4gdHJ0LnNldEZyb21BeGlzQW5nbGUodCxlKSx0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkodHJ0KSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKHJydCx0KX1yb3RhdGVZKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhzcnQsdCl9cm90YXRlWih0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMobHJ0LHQpfXRyYW5zbGF0ZU9uQXhpcyh0LGUpe3JldHVybiAkYXQuY29weSh0KS5hcHBseVF1YXRlcm5pb24odGhpcy5xdWF0ZXJuaW9uKSx0aGlzLnBvc2l0aW9uLmFkZCgkYXQubXVsdGlwbHlTY2FsYXIoZSkpLHRoaXN9dHJhbnNsYXRlWCh0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMocnJ0LHQpfXRyYW5zbGF0ZVkodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKHNydCx0KX10cmFuc2xhdGVaKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhscnQsdCl9bG9jYWxUb1dvcmxkKHQpe3JldHVybiB0LmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKX13b3JsZFRvTG9jYWwodCl7cmV0dXJuIHQuYXBwbHlNYXRyaXg0KGVydC5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpKX1sb29rQXQodCxlLG4pe3QuaXNWZWN0b3IzP25ydC5jb3B5KHQpOm5ydC5zZXQodCxlLG4pO2NvbnN0IG89dGhpcy5wYXJlbnQ7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksb3J0LnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKSx0aGlzLmlzQ2FtZXJhfHx0aGlzLmlzTGlnaHQ/ZXJ0Lmxvb2tBdChvcnQsbnJ0LHRoaXMudXApOmVydC5sb29rQXQobnJ0LG9ydCx0aGlzLnVwKSx0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KGVydCksbyYmKGVydC5leHRyYWN0Um90YXRpb24oby5tYXRyaXhXb3JsZCksdHJ0LnNldEZyb21Sb3RhdGlvbk1hdHJpeChlcnQpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSh0cnQuaW52ZXJ0KCkpKX1hZGQodCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXRoaXMuYWRkKGFyZ3VtZW50c1t0XSk7cmV0dXJuIHRoaXN9cmV0dXJuIHQ9PT10aGlzPyhjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBjYW4ndCBiZSBhZGRlZCBhcyBhIGNoaWxkIG9mIGl0c2VsZi4iLHQpLHRoaXMpOih0JiZ0LmlzT2JqZWN0M0Q/KG51bGwhPT10LnBhcmVudCYmdC5wYXJlbnQucmVtb3ZlKHQpLHQucGFyZW50PXRoaXMsdGhpcy5jaGlsZHJlbi5wdXNoKHQpLHQuZGlzcGF0Y2hFdmVudChjcnQpKTpjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuT2JqZWN0M0QuIix0KSx0aGlzKX1yZW1vdmUodCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXRoaXMucmVtb3ZlKGFyZ3VtZW50c1t0XSk7cmV0dXJuIHRoaXN9Y29uc3QgZT10aGlzLmNoaWxkcmVuLmluZGV4T2YodCk7cmV0dXJuLTEhPT1lJiYodC5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuLnNwbGljZShlLDEpLHQuZGlzcGF0Y2hFdmVudChkcnQpKSx0aGlzfXJlbW92ZUZyb21QYXJlbnQoKXtjb25zdCB0PXRoaXMucGFyZW50O3JldHVybiBudWxsIT09dCYmdC5yZW1vdmUodGhpcyksdGhpc31jbGVhcigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5jaGlsZHJlbi5sZW5ndGg7dCsrKXtjb25zdCBlPXRoaXMuY2hpbGRyZW5bdF07ZS5wYXJlbnQ9bnVsbCxlLmRpc3BhdGNoRXZlbnQoZHJ0KX1yZXR1cm4gdGhpcy5jaGlsZHJlbi5sZW5ndGg9MCx0aGlzfWF0dGFjaCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksZXJ0LmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksbnVsbCE9PXQucGFyZW50JiYodC5wYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLGVydC5tdWx0aXBseSh0LnBhcmVudC5tYXRyaXhXb3JsZCkpLHQuYXBwbHlNYXRyaXg0KGVydCksdGhpcy5hZGQodCksdC51cGRhdGVXb3JsZE1hdHJpeCghMSwhMCksdGhpc31nZXRPYmplY3RCeUlkKHQpe3JldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoImlkIix0KX1nZXRPYmplY3RCeU5hbWUodCl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgibmFtZSIsdCl9Z2V0T2JqZWN0QnlQcm9wZXJ0eSh0LGUpe2lmKHRoaXNbdF09PT1lKXJldHVybiB0aGlzO2ZvcihsZXQgbj0wLG89dGhpcy5jaGlsZHJlbi5sZW5ndGg7bjxvO24rKyl7Y29uc3Qgbz10aGlzLmNoaWxkcmVuW25dLmdldE9iamVjdEJ5UHJvcGVydHkodCxlKTtpZih2b2lkIDAhPT1vKXJldHVybiBvfX1nZXRXb3JsZFBvc2l0aW9uKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKX1nZXRXb3JsZFF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKG9ydCx0LGlydCksdH1nZXRXb3JsZFNjYWxlKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShvcnQsYXJ0LHQpLHR9Z2V0V29ybGREaXJlY3Rpb24odCl7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSk7Y29uc3QgZT10aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO3JldHVybiB0LnNldChlWzhdLGVbOV0sZVsxMF0pLm5vcm1hbGl6ZSgpfXJheWNhc3QoKXt9dHJhdmVyc2UodCl7dCh0aGlzKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAsbz1lLmxlbmd0aDtuPG87bisrKWVbbl0udHJhdmVyc2UodCl9dHJhdmVyc2VWaXNpYmxlKHQpe2lmKCExPT09dGhpcy52aXNpYmxlKXJldHVybjt0KHRoaXMpO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxvPWUubGVuZ3RoO248bztuKyspZVtuXS50cmF2ZXJzZVZpc2libGUodCl9dHJhdmVyc2VBbmNlc3RvcnModCl7Y29uc3QgZT10aGlzLnBhcmVudDtudWxsIT09ZSYmKHQoZSksZS50cmF2ZXJzZUFuY2VzdG9ycyh0KSl9dXBkYXRlTWF0cml4KCl7dGhpcy5tYXRyaXguY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9dXBkYXRlTWF0cml4V29ybGQodCl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLCh0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGV8fHQpJiYobnVsbD09PXRoaXMucGFyZW50P3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITEsdD0hMCk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLG89ZS5sZW5ndGg7bjxvO24rKyllW25dLnVwZGF0ZU1hdHJpeFdvcmxkKHQpfXVwZGF0ZVdvcmxkTWF0cml4KHQsZSl7Y29uc3Qgbj10aGlzLnBhcmVudDtpZighMD09PXQmJm51bGwhPT1uJiZuLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksbnVsbD09PXRoaXMucGFyZW50P3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KSwhMD09PWUpe2NvbnN0IHQ9dGhpcy5jaGlsZHJlbjtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspdFtlXS51cGRhdGVXb3JsZE1hdHJpeCghMSwhMCl9fXRvSlNPTih0KXtjb25zdCBlPXZvaWQgMD09PXR8fCJzdHJpbmciPT10eXBlb2YgdCxuPXt9O2UmJih0PXtnZW9tZXRyaWVzOnt9LG1hdGVyaWFsczp7fSx0ZXh0dXJlczp7fSxpbWFnZXM6e30sc2hhcGVzOnt9LHNrZWxldG9uczp7fSxhbmltYXRpb25zOnt9fSxuLm1ldGFkYXRhPXt2ZXJzaW9uOjQuNSx0eXBlOiJPYmplY3QiLGdlbmVyYXRvcjoiT2JqZWN0M0QudG9KU09OIn0pO2NvbnN0IG89e307ZnVuY3Rpb24gaShlLG4pe3JldHVybiB2b2lkIDA9PT1lW24udXVpZF0mJihlW24udXVpZF09bi50b0pTT04odCkpLG4udXVpZH1pZihvLnV1aWQ9dGhpcy51dWlkLG8udHlwZT10aGlzLnR5cGUsIiIhPT10aGlzLm5hbWUmJihvLm5hbWU9dGhpcy5uYW1lKSwhMD09PXRoaXMuY2FzdFNoYWRvdyYmKG8uY2FzdFNoYWRvdz0hMCksITA9PT10aGlzLnJlY2VpdmVTaGFkb3cmJihvLnJlY2VpdmVTaGFkb3c9ITApLCExPT09dGhpcy52aXNpYmxlJiYoby52aXNpYmxlPSExKSwhMT09PXRoaXMuZnJ1c3R1bUN1bGxlZCYmKG8uZnJ1c3R1bUN1bGxlZD0hMSksMCE9PXRoaXMucmVuZGVyT3JkZXImJihvLnJlbmRlck9yZGVyPXRoaXMucmVuZGVyT3JkZXIpLCJ7fSIhPT1KU09OLnN0cmluZ2lmeSh0aGlzLnVzZXJEYXRhKSYmKG8udXNlckRhdGE9dGhpcy51c2VyRGF0YSksby5sYXllcnM9dGhpcy5sYXllcnMubWFzayxvLm1hdHJpeD10aGlzLm1hdHJpeC50b0FycmF5KCksITE9PT10aGlzLm1hdHJpeEF1dG9VcGRhdGUmJihvLm1hdHJpeEF1dG9VcGRhdGU9ITEpLHRoaXMuaXNJbnN0YW5jZWRNZXNoJiYoby50eXBlPSJJbnN0YW5jZWRNZXNoIixvLmNvdW50PXRoaXMuY291bnQsby5pbnN0YW5jZU1hdHJpeD10aGlzLmluc3RhbmNlTWF0cml4LnRvSlNPTigpLG51bGwhPT10aGlzLmluc3RhbmNlQ29sb3ImJihvLmluc3RhbmNlQ29sb3I9dGhpcy5pbnN0YW5jZUNvbG9yLnRvSlNPTigpKSksdGhpcy5pc1NjZW5lKXRoaXMuYmFja2dyb3VuZCYmKHRoaXMuYmFja2dyb3VuZC5pc0NvbG9yP28uYmFja2dyb3VuZD10aGlzLmJhY2tncm91bmQudG9KU09OKCk6dGhpcy5iYWNrZ3JvdW5kLmlzVGV4dHVyZSYmKG8uYmFja2dyb3VuZD10aGlzLmJhY2tncm91bmQudG9KU09OKHQpLnV1aWQpKSx0aGlzLmVudmlyb25tZW50JiZ0aGlzLmVudmlyb25tZW50LmlzVGV4dHVyZSYmKG8uZW52aXJvbm1lbnQ9dGhpcy5lbnZpcm9ubWVudC50b0pTT04odCkudXVpZCk7ZWxzZSBpZih0aGlzLmlzTWVzaHx8dGhpcy5pc0xpbmV8fHRoaXMuaXNQb2ludHMpe28uZ2VvbWV0cnk9aSh0Lmdlb21ldHJpZXMsdGhpcy5nZW9tZXRyeSk7Y29uc3QgZT10aGlzLmdlb21ldHJ5LnBhcmFtZXRlcnM7aWYodm9pZCAwIT09ZSYmdm9pZCAwIT09ZS5zaGFwZXMpe2NvbnN0IG49ZS5zaGFwZXM7aWYoQXJyYXkuaXNBcnJheShuKSlmb3IobGV0IGU9MCxvPW4ubGVuZ3RoO2U8bztlKyspaSh0LnNoYXBlcyxuW2VdKTtlbHNlIGkodC5zaGFwZXMsbil9fWlmKHRoaXMuaXNTa2lubmVkTWVzaCYmKG8uYmluZE1vZGU9dGhpcy5iaW5kTW9kZSxvLmJpbmRNYXRyaXg9dGhpcy5iaW5kTWF0cml4LnRvQXJyYXkoKSx2b2lkIDAhPT10aGlzLnNrZWxldG9uJiYoaSh0LnNrZWxldG9ucyx0aGlzLnNrZWxldG9uKSxvLnNrZWxldG9uPXRoaXMuc2tlbGV0b24udXVpZCkpLHZvaWQgMCE9PXRoaXMubWF0ZXJpYWwpaWYoQXJyYXkuaXNBcnJheSh0aGlzLm1hdGVyaWFsKSl7Y29uc3QgZT1bXTtmb3IobGV0IG49MCxvPXRoaXMubWF0ZXJpYWwubGVuZ3RoO248bztuKyspZS5wdXNoKGkodC5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbFtuXSkpO28ubWF0ZXJpYWw9ZX1lbHNlIG8ubWF0ZXJpYWw9aSh0Lm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsKTtpZih0aGlzLmNoaWxkcmVuLmxlbmd0aD4wKXtvLmNoaWxkcmVuPVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5jaGlsZHJlbi5sZW5ndGg7ZSsrKW8uY2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2VdLnRvSlNPTih0KS5vYmplY3QpfWlmKHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg+MCl7by5hbmltYXRpb25zPVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5hbmltYXRpb25zLmxlbmd0aDtlKyspby5hbmltYXRpb25zLnB1c2goaSh0LmFuaW1hdGlvbnMsdGhpcy5hbmltYXRpb25zW2VdKSl9aWYoZSl7Y29uc3QgZT1hKHQuZ2VvbWV0cmllcyksbz1hKHQubWF0ZXJpYWxzKSxpPWEodC50ZXh0dXJlcykscj1hKHQuaW1hZ2VzKSxzPWEodC5zaGFwZXMpLGw9YSh0LnNrZWxldG9ucyksYz1hKHQuYW5pbWF0aW9ucyk7ZS5sZW5ndGg+MCYmKG4uZ2VvbWV0cmllcz1lKSxvLmxlbmd0aD4wJiYobi5tYXRlcmlhbHM9byksaS5sZW5ndGg+MCYmKG4udGV4dHVyZXM9aSksci5sZW5ndGg+MCYmKG4uaW1hZ2VzPXIpLHMubGVuZ3RoPjAmJihuLnNoYXBlcz1zKSxsLmxlbmd0aD4wJiYobi5za2VsZXRvbnM9bCksYy5sZW5ndGg+MCYmKG4uYW5pbWF0aW9ucz1jKX1yZXR1cm4gbi5vYmplY3Q9byxuO2Z1bmN0aW9uIGEodCl7Y29uc3QgZT1bXTtmb3IoY29uc3QgbiBpbiB0KXtjb25zdCBvPXRbbl07ZGVsZXRlIG8ubWV0YWRhdGEsZS5wdXNoKG8pfXJldHVybiBlfX1jbG9uZSh0KXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyx0KX1jb3B5KHQsZT0hMCl7aWYodGhpcy5uYW1lPXQubmFtZSx0aGlzLnVwLmNvcHkodC51cCksdGhpcy5wb3NpdGlvbi5jb3B5KHQucG9zaXRpb24pLHRoaXMucm90YXRpb24ub3JkZXI9dC5yb3RhdGlvbi5vcmRlcix0aGlzLnF1YXRlcm5pb24uY29weSh0LnF1YXRlcm5pb24pLHRoaXMuc2NhbGUuY29weSh0LnNjYWxlKSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLm1hdHJpeFdvcmxkLmNvcHkodC5tYXRyaXhXb3JsZCksdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9dC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlLHRoaXMubGF5ZXJzLm1hc2s9dC5sYXllcnMubWFzayx0aGlzLnZpc2libGU9dC52aXNpYmxlLHRoaXMuY2FzdFNoYWRvdz10LmNhc3RTaGFkb3csdGhpcy5yZWNlaXZlU2hhZG93PXQucmVjZWl2ZVNoYWRvdyx0aGlzLmZydXN0dW1DdWxsZWQ9dC5mcnVzdHVtQ3VsbGVkLHRoaXMucmVuZGVyT3JkZXI9dC5yZW5kZXJPcmRlcix0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLCEwPT09ZSlmb3IobGV0IGU9MDtlPHQuY2hpbGRyZW4ubGVuZ3RoO2UrKyl0aGlzLmFkZCh0LmNoaWxkcmVuW2VdLmNsb25lKCkpO3JldHVybiB0aGlzfX1wcnQuRGVmYXVsdFVwPW5ldyBjYXQoMCwxLDApLHBydC5EZWZhdWx0TWF0cml4QXV0b1VwZGF0ZT0hMCxwcnQucHJvdG90eXBlLmlzT2JqZWN0M0Q9ITA7Y29uc3QgbXJ0PW5ldyBjYXQsdXJ0PW5ldyBjYXQsZnJ0PW5ldyBjYXQsZ3J0PW5ldyBjYXQsaHJ0PW5ldyBjYXQsYnJ0PW5ldyBjYXQseXJ0PW5ldyBjYXQsX3J0PW5ldyBjYXQsQ3J0PW5ldyBjYXQsTXJ0PW5ldyBjYXQ7Y2xhc3MgdnJ0e2NvbnN0cnVjdG9yKHQ9bmV3IGNhdCxlPW5ldyBjYXQsbj1uZXcgY2F0KXt0aGlzLmE9dCx0aGlzLmI9ZSx0aGlzLmM9bn1zdGF0aWMgZ2V0Tm9ybWFsKHQsZSxuLG8pe28uc3ViVmVjdG9ycyhuLGUpLG1ydC5zdWJWZWN0b3JzKHQsZSksby5jcm9zcyhtcnQpO2NvbnN0IGk9by5sZW5ndGhTcSgpO3JldHVybiBpPjA/by5tdWx0aXBseVNjYWxhcigxL01hdGguc3FydChpKSk6by5zZXQoMCwwLDApfXN0YXRpYyBnZXRCYXJ5Y29vcmQodCxlLG4sbyxpKXttcnQuc3ViVmVjdG9ycyhvLGUpLHVydC5zdWJWZWN0b3JzKG4sZSksZnJ0LnN1YlZlY3RvcnModCxlKTtjb25zdCBhPW1ydC5kb3QobXJ0KSxyPW1ydC5kb3QodXJ0KSxzPW1ydC5kb3QoZnJ0KSxsPXVydC5kb3QodXJ0KSxjPXVydC5kb3QoZnJ0KSxkPWEqbC1yKnI7aWYoMD09PWQpcmV0dXJuIGkuc2V0KC0yLC0xLC0xKTtjb25zdCBwPTEvZCxtPShsKnMtcipjKSpwLHU9KGEqYy1yKnMpKnA7cmV0dXJuIGkuc2V0KDEtbS11LHUsbSl9c3RhdGljIGNvbnRhaW5zUG9pbnQodCxlLG4sbyl7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKHQsZSxuLG8sZ3J0KSxncnQueD49MCYmZ3J0Lnk+PTAmJmdydC54K2dydC55PD0xfXN0YXRpYyBnZXRVVih0LGUsbixvLGksYSxyLHMpe3JldHVybiB0aGlzLmdldEJhcnljb29yZCh0LGUsbixvLGdydCkscy5zZXQoMCwwKSxzLmFkZFNjYWxlZFZlY3RvcihpLGdydC54KSxzLmFkZFNjYWxlZFZlY3RvcihhLGdydC55KSxzLmFkZFNjYWxlZFZlY3RvcihyLGdydC56KSxzfXN0YXRpYyBpc0Zyb250RmFjaW5nKHQsZSxuLG8pe3JldHVybiBtcnQuc3ViVmVjdG9ycyhuLGUpLHVydC5zdWJWZWN0b3JzKHQsZSksbXJ0LmNyb3NzKHVydCkuZG90KG8pPDB9c2V0KHQsZSxuKXtyZXR1cm4gdGhpcy5hLmNvcHkodCksdGhpcy5iLmNvcHkoZSksdGhpcy5jLmNvcHkobiksdGhpc31zZXRGcm9tUG9pbnRzQW5kSW5kaWNlcyh0LGUsbixvKXtyZXR1cm4gdGhpcy5hLmNvcHkodFtlXSksdGhpcy5iLmNvcHkodFtuXSksdGhpcy5jLmNvcHkodFtvXSksdGhpc31jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLmEuY29weSh0LmEpLHRoaXMuYi5jb3B5KHQuYiksdGhpcy5jLmNvcHkodC5jKSx0aGlzfWdldEFyZWEoKXtyZXR1cm4gbXJ0LnN1YlZlY3RvcnModGhpcy5jLHRoaXMuYiksdXJ0LnN1YlZlY3RvcnModGhpcy5hLHRoaXMuYiksLjUqbXJ0LmNyb3NzKHVydCkubGVuZ3RoKCl9Z2V0TWlkcG9pbnQodCl7cmV0dXJuIHQuYWRkVmVjdG9ycyh0aGlzLmEsdGhpcy5iKS5hZGQodGhpcy5jKS5tdWx0aXBseVNjYWxhcigxLzMpfWdldE5vcm1hbCh0KXtyZXR1cm4gdnJ0LmdldE5vcm1hbCh0aGlzLmEsdGhpcy5iLHRoaXMuYyx0KX1nZXRQbGFuZSh0KXtyZXR1cm4gdC5zZXRGcm9tQ29wbGFuYXJQb2ludHModGhpcy5hLHRoaXMuYix0aGlzLmMpfWdldEJhcnljb29yZCh0LGUpe3JldHVybiB2cnQuZ2V0QmFyeWNvb3JkKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSl9Z2V0VVYodCxlLG4sbyxpKXtyZXR1cm4gdnJ0LmdldFVWKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSxuLG8saSl9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdnJ0LmNvbnRhaW5zUG9pbnQodCx0aGlzLmEsdGhpcy5iLHRoaXMuYyl9aXNGcm9udEZhY2luZyh0KXtyZXR1cm4gdnJ0LmlzRnJvbnRGYWNpbmcodGhpcy5hLHRoaXMuYix0aGlzLmMsdCl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzVHJpYW5nbGUodGhpcyl9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2NvbnN0IG49dGhpcy5hLG89dGhpcy5iLGk9dGhpcy5jO2xldCBhLHI7aHJ0LnN1YlZlY3RvcnMobyxuKSxicnQuc3ViVmVjdG9ycyhpLG4pLF9ydC5zdWJWZWN0b3JzKHQsbik7Y29uc3Qgcz1ocnQuZG90KF9ydCksbD1icnQuZG90KF9ydCk7aWYoczw9MCYmbDw9MClyZXR1cm4gZS5jb3B5KG4pO0NydC5zdWJWZWN0b3JzKHQsbyk7Y29uc3QgYz1ocnQuZG90KENydCksZD1icnQuZG90KENydCk7aWYoYz49MCYmZDw9YylyZXR1cm4gZS5jb3B5KG8pO2NvbnN0IHA9cypkLWMqbDtpZihwPD0wJiZzPj0wJiZjPD0wKXJldHVybiBhPXMvKHMtYyksZS5jb3B5KG4pLmFkZFNjYWxlZFZlY3RvcihocnQsYSk7TXJ0LnN1YlZlY3RvcnModCxpKTtjb25zdCBtPWhydC5kb3QoTXJ0KSx1PWJydC5kb3QoTXJ0KTtpZih1Pj0wJiZtPD11KXJldHVybiBlLmNvcHkoaSk7Y29uc3QgZj1tKmwtcyp1O2lmKGY8PTAmJmw+PTAmJnU8PTApcmV0dXJuIHI9bC8obC11KSxlLmNvcHkobikuYWRkU2NhbGVkVmVjdG9yKGJydCxyKTtjb25zdCBnPWMqdS1tKmQ7aWYoZzw9MCYmZC1jPj0wJiZtLXU+PTApcmV0dXJuIHlydC5zdWJWZWN0b3JzKGksbykscj0oZC1jKS8oZC1jKyhtLXUpKSxlLmNvcHkobykuYWRkU2NhbGVkVmVjdG9yKHlydCxyKTtjb25zdCBoPTEvKGcrZitwKTtyZXR1cm4gYT1mKmgscj1wKmgsZS5jb3B5KG4pLmFkZFNjYWxlZFZlY3RvcihocnQsYSkuYWRkU2NhbGVkVmVjdG9yKGJydCxyKX1lcXVhbHModCl7cmV0dXJuIHQuYS5lcXVhbHModGhpcy5hKSYmdC5iLmVxdWFscyh0aGlzLmIpJiZ0LmMuZXF1YWxzKHRoaXMuYyl9fWxldCB4cnQ9MDtjbGFzcyBPcnQgZXh0ZW5kcyBVaXR7Y29uc3RydWN0b3IoKXtzdXBlcigpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOnhydCsrfSksdGhpcy51dWlkPXFpdCgpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9Ik1hdGVyaWFsIix0aGlzLmZvZz0hMCx0aGlzLmJsZW5kaW5nPTEsdGhpcy5zaWRlPTAsdGhpcy52ZXJ0ZXhDb2xvcnM9ITEsdGhpcy5vcGFjaXR5PTEsdGhpcy50cmFuc3BhcmVudD0hMSx0aGlzLmJsZW5kU3JjPTIwNCx0aGlzLmJsZW5kRHN0PTIwNSx0aGlzLmJsZW5kRXF1YXRpb249Y2l0LHRoaXMuYmxlbmRTcmNBbHBoYT1udWxsLHRoaXMuYmxlbmREc3RBbHBoYT1udWxsLHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhPW51bGwsdGhpcy5kZXB0aEZ1bmM9Myx0aGlzLmRlcHRoVGVzdD0hMCx0aGlzLmRlcHRoV3JpdGU9ITAsdGhpcy5zdGVuY2lsV3JpdGVNYXNrPTI1NSx0aGlzLnN0ZW5jaWxGdW5jPTUxOSx0aGlzLnN0ZW5jaWxSZWY9MCx0aGlzLnN0ZW5jaWxGdW5jTWFzaz0yNTUsdGhpcy5zdGVuY2lsRmFpbD1MaXQsdGhpcy5zdGVuY2lsWkZhaWw9TGl0LHRoaXMuc3RlbmNpbFpQYXNzPUxpdCx0aGlzLnN0ZW5jaWxXcml0ZT0hMSx0aGlzLmNsaXBwaW5nUGxhbmVzPW51bGwsdGhpcy5jbGlwSW50ZXJzZWN0aW9uPSExLHRoaXMuY2xpcFNoYWRvd3M9ITEsdGhpcy5zaGFkb3dTaWRlPW51bGwsdGhpcy5jb2xvcldyaXRlPSEwLHRoaXMucHJlY2lzaW9uPW51bGwsdGhpcy5wb2x5Z29uT2Zmc2V0PSExLHRoaXMucG9seWdvbk9mZnNldEZhY3Rvcj0wLHRoaXMucG9seWdvbk9mZnNldFVuaXRzPTAsdGhpcy5kaXRoZXJpbmc9ITEsdGhpcy5hbHBoYVRlc3Q9MCx0aGlzLmFscGhhVG9Db3ZlcmFnZT0hMSx0aGlzLnByZW11bHRpcGxpZWRBbHBoYT0hMSx0aGlzLnZpc2libGU9ITAsdGhpcy50b25lTWFwcGVkPSEwLHRoaXMudXNlckRhdGE9e30sdGhpcy52ZXJzaW9uPTB9b25CdWlsZCgpe31vbkJlZm9yZUNvbXBpbGUoKXt9Y3VzdG9tUHJvZ3JhbUNhY2hlS2V5KCl7cmV0dXJuIHRoaXMub25CZWZvcmVDb21waWxlLnRvU3RyaW5nKCl9c2V0VmFsdWVzKHQpe2lmKHZvaWQgMCE9PXQpZm9yKGNvbnN0IGUgaW4gdCl7Y29uc3Qgbj10W2VdO2lmKHZvaWQgMD09PW4pe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6ICciK2UrIicgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZC4iKTtjb250aW51ZX1pZigic2hhZGluZyI9PT1lKXtjb25zb2xlLndhcm4oIlRIUkVFLiIrdGhpcy50eXBlKyI6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4iKSx0aGlzLmZsYXRTaGFkaW5nPTE9PT1uO2NvbnRpbnVlfWNvbnN0IG89dGhpc1tlXTt2b2lkIDAhPT1vP28mJm8uaXNDb2xvcj9vLnNldChuKTpvJiZvLmlzVmVjdG9yMyYmbiYmbi5pc1ZlY3RvcjM/by5jb3B5KG4pOnRoaXNbZV09bjpjb25zb2xlLndhcm4oIlRIUkVFLiIrdGhpcy50eXBlKyI6ICciK2UrIicgaXMgbm90IGEgcHJvcGVydHkgb2YgdGhpcyBtYXRlcmlhbC4iKX19dG9KU09OKHQpe2NvbnN0IGU9dm9pZCAwPT09dHx8InN0cmluZyI9PXR5cGVvZiB0O2UmJih0PXt0ZXh0dXJlczp7fSxpbWFnZXM6e319KTtjb25zdCBuPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiTWF0ZXJpYWwiLGdlbmVyYXRvcjoiTWF0ZXJpYWwudG9KU09OIn19O2Z1bmN0aW9uIG8odCl7Y29uc3QgZT1bXTtmb3IoY29uc3QgbiBpbiB0KXtjb25zdCBvPXRbbl07ZGVsZXRlIG8ubWV0YWRhdGEsZS5wdXNoKG8pfXJldHVybiBlfWlmKG4udXVpZD10aGlzLnV1aWQsbi50eXBlPXRoaXMudHlwZSwiIiE9PXRoaXMubmFtZSYmKG4ubmFtZT10aGlzLm5hbWUpLHRoaXMuY29sb3ImJnRoaXMuY29sb3IuaXNDb2xvciYmKG4uY29sb3I9dGhpcy5jb2xvci5nZXRIZXgoKSksdm9pZCAwIT09dGhpcy5yb3VnaG5lc3MmJihuLnJvdWdobmVzcz10aGlzLnJvdWdobmVzcyksdm9pZCAwIT09dGhpcy5tZXRhbG5lc3MmJihuLm1ldGFsbmVzcz10aGlzLm1ldGFsbmVzcyksdGhpcy5zaGVlbiYmdGhpcy5zaGVlbi5pc0NvbG9yJiYobi5zaGVlbj10aGlzLnNoZWVuLmdldEhleCgpKSx0aGlzLmVtaXNzaXZlJiZ0aGlzLmVtaXNzaXZlLmlzQ29sb3ImJihuLmVtaXNzaXZlPXRoaXMuZW1pc3NpdmUuZ2V0SGV4KCkpLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkmJjEhPT10aGlzLmVtaXNzaXZlSW50ZW5zaXR5JiYobi5lbWlzc2l2ZUludGVuc2l0eT10aGlzLmVtaXNzaXZlSW50ZW5zaXR5KSx0aGlzLnNwZWN1bGFyJiZ0aGlzLnNwZWN1bGFyLmlzQ29sb3ImJihuLnNwZWN1bGFyPXRoaXMuc3BlY3VsYXIuZ2V0SGV4KCkpLHZvaWQgMCE9PXRoaXMuc3BlY3VsYXJJbnRlbnNpdHkmJihuLnNwZWN1bGFySW50ZW5zaXR5PXRoaXMuc3BlY3VsYXJJbnRlbnNpdHkpLHRoaXMuc3BlY3VsYXJUaW50JiZ0aGlzLnNwZWN1bGFyVGludC5pc0NvbG9yJiYobi5zcGVjdWxhclRpbnQ9dGhpcy5zcGVjdWxhclRpbnQuZ2V0SGV4KCkpLHZvaWQgMCE9PXRoaXMuc2hpbmluZXNzJiYobi5zaGluaW5lc3M9dGhpcy5zaGluaW5lc3MpLHZvaWQgMCE9PXRoaXMuY2xlYXJjb2F0JiYobi5jbGVhcmNvYXQ9dGhpcy5jbGVhcmNvYXQpLHZvaWQgMCE9PXRoaXMuY2xlYXJjb2F0Um91Z2huZXNzJiYobi5jbGVhcmNvYXRSb3VnaG5lc3M9dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MpLHRoaXMuY2xlYXJjb2F0TWFwJiZ0aGlzLmNsZWFyY29hdE1hcC5pc1RleHR1cmUmJihuLmNsZWFyY29hdE1hcD10aGlzLmNsZWFyY29hdE1hcC50b0pTT04odCkudXVpZCksdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAmJnRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLmlzVGV4dHVyZSYmKG4uY2xlYXJjb2F0Um91Z2huZXNzTWFwPXRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmNsZWFyY29hdE5vcm1hbE1hcCYmdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAuaXNUZXh0dXJlJiYobi5jbGVhcmNvYXROb3JtYWxNYXA9dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAudG9KU09OKHQpLnV1aWQsbi5jbGVhcmNvYXROb3JtYWxTY2FsZT10aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLnRvQXJyYXkoKSksdGhpcy5tYXAmJnRoaXMubWFwLmlzVGV4dHVyZSYmKG4ubWFwPXRoaXMubWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLm1hdGNhcCYmdGhpcy5tYXRjYXAuaXNUZXh0dXJlJiYobi5tYXRjYXA9dGhpcy5tYXRjYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuYWxwaGFNYXAmJnRoaXMuYWxwaGFNYXAuaXNUZXh0dXJlJiYobi5hbHBoYU1hcD10aGlzLmFscGhhTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmxpZ2h0TWFwJiZ0aGlzLmxpZ2h0TWFwLmlzVGV4dHVyZSYmKG4ubGlnaHRNYXA9dGhpcy5saWdodE1hcC50b0pTT04odCkudXVpZCxuLmxpZ2h0TWFwSW50ZW5zaXR5PXRoaXMubGlnaHRNYXBJbnRlbnNpdHkpLHRoaXMuYW9NYXAmJnRoaXMuYW9NYXAuaXNUZXh0dXJlJiYobi5hb01hcD10aGlzLmFvTWFwLnRvSlNPTih0KS51dWlkLG4uYW9NYXBJbnRlbnNpdHk9dGhpcy5hb01hcEludGVuc2l0eSksdGhpcy5idW1wTWFwJiZ0aGlzLmJ1bXBNYXAuaXNUZXh0dXJlJiYobi5idW1wTWFwPXRoaXMuYnVtcE1hcC50b0pTT04odCkudXVpZCxuLmJ1bXBTY2FsZT10aGlzLmJ1bXBTY2FsZSksdGhpcy5ub3JtYWxNYXAmJnRoaXMubm9ybWFsTWFwLmlzVGV4dHVyZSYmKG4ubm9ybWFsTWFwPXRoaXMubm9ybWFsTWFwLnRvSlNPTih0KS51dWlkLG4ubm9ybWFsTWFwVHlwZT10aGlzLm5vcm1hbE1hcFR5cGUsbi5ub3JtYWxTY2FsZT10aGlzLm5vcm1hbFNjYWxlLnRvQXJyYXkoKSksdGhpcy5kaXNwbGFjZW1lbnRNYXAmJnRoaXMuZGlzcGxhY2VtZW50TWFwLmlzVGV4dHVyZSYmKG4uZGlzcGxhY2VtZW50TWFwPXRoaXMuZGlzcGxhY2VtZW50TWFwLnRvSlNPTih0KS51dWlkLG4uZGlzcGxhY2VtZW50U2NhbGU9dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSxuLmRpc3BsYWNlbWVudEJpYXM9dGhpcy5kaXNwbGFjZW1lbnRCaWFzKSx0aGlzLnJvdWdobmVzc01hcCYmdGhpcy5yb3VnaG5lc3NNYXAuaXNUZXh0dXJlJiYobi5yb3VnaG5lc3NNYXA9dGhpcy5yb3VnaG5lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubWV0YWxuZXNzTWFwJiZ0aGlzLm1ldGFsbmVzc01hcC5pc1RleHR1cmUmJihuLm1ldGFsbmVzc01hcD10aGlzLm1ldGFsbmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5lbWlzc2l2ZU1hcCYmdGhpcy5lbWlzc2l2ZU1hcC5pc1RleHR1cmUmJihuLmVtaXNzaXZlTWFwPXRoaXMuZW1pc3NpdmVNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuc3BlY3VsYXJNYXAmJnRoaXMuc3BlY3VsYXJNYXAuaXNUZXh0dXJlJiYobi5zcGVjdWxhck1hcD10aGlzLnNwZWN1bGFyTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwJiZ0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwLmlzVGV4dHVyZSYmKG4uc3BlY3VsYXJJbnRlbnNpdHlNYXA9dGhpcy5zcGVjdWxhckludGVuc2l0eU1hcC50b0pTT04odCkudXVpZCksdGhpcy5zcGVjdWxhclRpbnRNYXAmJnRoaXMuc3BlY3VsYXJUaW50TWFwLmlzVGV4dHVyZSYmKG4uc3BlY3VsYXJUaW50TWFwPXRoaXMuc3BlY3VsYXJUaW50TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVudk1hcCYmdGhpcy5lbnZNYXAuaXNUZXh0dXJlJiYobi5lbnZNYXA9dGhpcy5lbnZNYXAudG9KU09OKHQpLnV1aWQsdm9pZCAwIT09dGhpcy5jb21iaW5lJiYobi5jb21iaW5lPXRoaXMuY29tYmluZSkpLHZvaWQgMCE9PXRoaXMuZW52TWFwSW50ZW5zaXR5JiYobi5lbnZNYXBJbnRlbnNpdHk9dGhpcy5lbnZNYXBJbnRlbnNpdHkpLHZvaWQgMCE9PXRoaXMucmVmbGVjdGl2aXR5JiYobi5yZWZsZWN0aXZpdHk9dGhpcy5yZWZsZWN0aXZpdHkpLHZvaWQgMCE9PXRoaXMucmVmcmFjdGlvblJhdGlvJiYobi5yZWZyYWN0aW9uUmF0aW89dGhpcy5yZWZyYWN0aW9uUmF0aW8pLHRoaXMuZ3JhZGllbnRNYXAmJnRoaXMuZ3JhZGllbnRNYXAuaXNUZXh0dXJlJiYobi5ncmFkaWVudE1hcD10aGlzLmdyYWRpZW50TWFwLnRvSlNPTih0KS51dWlkKSx2b2lkIDAhPT10aGlzLnRyYW5zbWlzc2lvbiYmKG4udHJhbnNtaXNzaW9uPXRoaXMudHJhbnNtaXNzaW9uKSx0aGlzLnRyYW5zbWlzc2lvbk1hcCYmdGhpcy50cmFuc21pc3Npb25NYXAuaXNUZXh0dXJlJiYobi50cmFuc21pc3Npb25NYXA9dGhpcy50cmFuc21pc3Npb25NYXAudG9KU09OKHQpLnV1aWQpLHZvaWQgMCE9PXRoaXMudGhpY2tuZXNzJiYobi50aGlja25lc3M9dGhpcy50aGlja25lc3MpLHRoaXMudGhpY2tuZXNzTWFwJiZ0aGlzLnRoaWNrbmVzc01hcC5pc1RleHR1cmUmJihuLnRoaWNrbmVzc01hcD10aGlzLnRoaWNrbmVzc01hcC50b0pTT04odCkudXVpZCksdm9pZCAwIT09dGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlJiYobi5hdHRlbnVhdGlvbkRpc3RhbmNlPXRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSksdm9pZCAwIT09dGhpcy5hdHRlbnVhdGlvblRpbnQmJihuLmF0dGVudWF0aW9uVGludD10aGlzLmF0dGVudWF0aW9uVGludC5nZXRIZXgoKSksdm9pZCAwIT09dGhpcy5zaXplJiYobi5zaXplPXRoaXMuc2l6ZSksbnVsbCE9PXRoaXMuc2hhZG93U2lkZSYmKG4uc2hhZG93U2lkZT10aGlzLnNoYWRvd1NpZGUpLHZvaWQgMCE9PXRoaXMuc2l6ZUF0dGVudWF0aW9uJiYobi5zaXplQXR0ZW51YXRpb249dGhpcy5zaXplQXR0ZW51YXRpb24pLDEhPT10aGlzLmJsZW5kaW5nJiYobi5ibGVuZGluZz10aGlzLmJsZW5kaW5nKSwwIT09dGhpcy5zaWRlJiYobi5zaWRlPXRoaXMuc2lkZSksdGhpcy52ZXJ0ZXhDb2xvcnMmJihuLnZlcnRleENvbG9ycz0hMCksdGhpcy5vcGFjaXR5PDEmJihuLm9wYWNpdHk9dGhpcy5vcGFjaXR5KSwhMD09PXRoaXMudHJhbnNwYXJlbnQmJihuLnRyYW5zcGFyZW50PXRoaXMudHJhbnNwYXJlbnQpLG4uZGVwdGhGdW5jPXRoaXMuZGVwdGhGdW5jLG4uZGVwdGhUZXN0PXRoaXMuZGVwdGhUZXN0LG4uZGVwdGhXcml0ZT10aGlzLmRlcHRoV3JpdGUsbi5jb2xvcldyaXRlPXRoaXMuY29sb3JXcml0ZSxuLnN0ZW5jaWxXcml0ZT10aGlzLnN0ZW5jaWxXcml0ZSxuLnN0ZW5jaWxXcml0ZU1hc2s9dGhpcy5zdGVuY2lsV3JpdGVNYXNrLG4uc3RlbmNpbEZ1bmM9dGhpcy5zdGVuY2lsRnVuYyxuLnN0ZW5jaWxSZWY9dGhpcy5zdGVuY2lsUmVmLG4uc3RlbmNpbEZ1bmNNYXNrPXRoaXMuc3RlbmNpbEZ1bmNNYXNrLG4uc3RlbmNpbEZhaWw9dGhpcy5zdGVuY2lsRmFpbCxuLnN0ZW5jaWxaRmFpbD10aGlzLnN0ZW5jaWxaRmFpbCxuLnN0ZW5jaWxaUGFzcz10aGlzLnN0ZW5jaWxaUGFzcyx0aGlzLnJvdGF0aW9uJiYwIT09dGhpcy5yb3RhdGlvbiYmKG4ucm90YXRpb249dGhpcy5yb3RhdGlvbiksITA9PT10aGlzLnBvbHlnb25PZmZzZXQmJihuLnBvbHlnb25PZmZzZXQ9ITApLDAhPT10aGlzLnBvbHlnb25PZmZzZXRGYWN0b3ImJihuLnBvbHlnb25PZmZzZXRGYWN0b3I9dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yKSwwIT09dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMmJihuLnBvbHlnb25PZmZzZXRVbml0cz10aGlzLnBvbHlnb25PZmZzZXRVbml0cyksdGhpcy5saW5ld2lkdGgmJjEhPT10aGlzLmxpbmV3aWR0aCYmKG4ubGluZXdpZHRoPXRoaXMubGluZXdpZHRoKSx2b2lkIDAhPT10aGlzLmRhc2hTaXplJiYobi5kYXNoU2l6ZT10aGlzLmRhc2hTaXplKSx2b2lkIDAhPT10aGlzLmdhcFNpemUmJihuLmdhcFNpemU9dGhpcy5nYXBTaXplKSx2b2lkIDAhPT10aGlzLnNjYWxlJiYobi5zY2FsZT10aGlzLnNjYWxlKSwhMD09PXRoaXMuZGl0aGVyaW5nJiYobi5kaXRoZXJpbmc9ITApLHRoaXMuYWxwaGFUZXN0PjAmJihuLmFscGhhVGVzdD10aGlzLmFscGhhVGVzdCksITA9PT10aGlzLmFscGhhVG9Db3ZlcmFnZSYmKG4uYWxwaGFUb0NvdmVyYWdlPXRoaXMuYWxwaGFUb0NvdmVyYWdlKSwhMD09PXRoaXMucHJlbXVsdGlwbGllZEFscGhhJiYobi5wcmVtdWx0aXBsaWVkQWxwaGE9dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEpLCEwPT09dGhpcy53aXJlZnJhbWUmJihuLndpcmVmcmFtZT10aGlzLndpcmVmcmFtZSksdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg+MSYmKG4ud2lyZWZyYW1lTGluZXdpZHRoPXRoaXMud2lyZWZyYW1lTGluZXdpZHRoKSwicm91bmQiIT09dGhpcy53aXJlZnJhbWVMaW5lY2FwJiYobi53aXJlZnJhbWVMaW5lY2FwPXRoaXMud2lyZWZyYW1lTGluZWNhcCksInJvdW5kIiE9PXRoaXMud2lyZWZyYW1lTGluZWpvaW4mJihuLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWpvaW4pLCEwPT09dGhpcy5mbGF0U2hhZGluZyYmKG4uZmxhdFNoYWRpbmc9dGhpcy5mbGF0U2hhZGluZyksITE9PT10aGlzLnZpc2libGUmJihuLnZpc2libGU9ITEpLCExPT09dGhpcy50b25lTWFwcGVkJiYobi50b25lTWFwcGVkPSExKSwie30iIT09SlNPTi5zdHJpbmdpZnkodGhpcy51c2VyRGF0YSkmJihuLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLGUpe2NvbnN0IGU9byh0LnRleHR1cmVzKSxpPW8odC5pbWFnZXMpO2UubGVuZ3RoPjAmJihuLnRleHR1cmVzPWUpLGkubGVuZ3RoPjAmJihuLmltYWdlcz1pKX1yZXR1cm4gbn1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMubmFtZT10Lm5hbWUsdGhpcy5mb2c9dC5mb2csdGhpcy5ibGVuZGluZz10LmJsZW5kaW5nLHRoaXMuc2lkZT10LnNpZGUsdGhpcy52ZXJ0ZXhDb2xvcnM9dC52ZXJ0ZXhDb2xvcnMsdGhpcy5vcGFjaXR5PXQub3BhY2l0eSx0aGlzLnRyYW5zcGFyZW50PXQudHJhbnNwYXJlbnQsdGhpcy5ibGVuZFNyYz10LmJsZW5kU3JjLHRoaXMuYmxlbmREc3Q9dC5ibGVuZERzdCx0aGlzLmJsZW5kRXF1YXRpb249dC5ibGVuZEVxdWF0aW9uLHRoaXMuYmxlbmRTcmNBbHBoYT10LmJsZW5kU3JjQWxwaGEsdGhpcy5ibGVuZERzdEFscGhhPXQuYmxlbmREc3RBbHBoYSx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT10LmJsZW5kRXF1YXRpb25BbHBoYSx0aGlzLmRlcHRoRnVuYz10LmRlcHRoRnVuYyx0aGlzLmRlcHRoVGVzdD10LmRlcHRoVGVzdCx0aGlzLmRlcHRoV3JpdGU9dC5kZXB0aFdyaXRlLHRoaXMuc3RlbmNpbFdyaXRlTWFzaz10LnN0ZW5jaWxXcml0ZU1hc2ssdGhpcy5zdGVuY2lsRnVuYz10LnN0ZW5jaWxGdW5jLHRoaXMuc3RlbmNpbFJlZj10LnN0ZW5jaWxSZWYsdGhpcy5zdGVuY2lsRnVuY01hc2s9dC5zdGVuY2lsRnVuY01hc2ssdGhpcy5zdGVuY2lsRmFpbD10LnN0ZW5jaWxGYWlsLHRoaXMuc3RlbmNpbFpGYWlsPXQuc3RlbmNpbFpGYWlsLHRoaXMuc3RlbmNpbFpQYXNzPXQuc3RlbmNpbFpQYXNzLHRoaXMuc3RlbmNpbFdyaXRlPXQuc3RlbmNpbFdyaXRlO2NvbnN0IGU9dC5jbGlwcGluZ1BsYW5lcztsZXQgbj1udWxsO2lmKG51bGwhPT1lKXtjb25zdCB0PWUubGVuZ3RoO249bmV3IEFycmF5KHQpO2ZvcihsZXQgbz0wO28hPT10OysrbyluW29dPWVbb10uY2xvbmUoKX1yZXR1cm4gdGhpcy5jbGlwcGluZ1BsYW5lcz1uLHRoaXMuY2xpcEludGVyc2VjdGlvbj10LmNsaXBJbnRlcnNlY3Rpb24sdGhpcy5jbGlwU2hhZG93cz10LmNsaXBTaGFkb3dzLHRoaXMuc2hhZG93U2lkZT10LnNoYWRvd1NpZGUsdGhpcy5jb2xvcldyaXRlPXQuY29sb3JXcml0ZSx0aGlzLnByZWNpc2lvbj10LnByZWNpc2lvbix0aGlzLnBvbHlnb25PZmZzZXQ9dC5wb2x5Z29uT2Zmc2V0LHRoaXMucG9seWdvbk9mZnNldEZhY3Rvcj10LnBvbHlnb25PZmZzZXRGYWN0b3IsdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHM9dC5wb2x5Z29uT2Zmc2V0VW5pdHMsdGhpcy5kaXRoZXJpbmc9dC5kaXRoZXJpbmcsdGhpcy5hbHBoYVRlc3Q9dC5hbHBoYVRlc3QsdGhpcy5hbHBoYVRvQ292ZXJhZ2U9dC5hbHBoYVRvQ292ZXJhZ2UsdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9dC5wcmVtdWx0aXBsaWVkQWxwaGEsdGhpcy52aXNpYmxlPXQudmlzaWJsZSx0aGlzLnRvbmVNYXBwZWQ9dC50b25lTWFwcGVkLHRoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnVzZXJEYXRhKSksdGhpc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXNldCBuZWVkc1VwZGF0ZSh0KXshMD09PXQmJnRoaXMudmVyc2lvbisrfX1PcnQucHJvdG90eXBlLmlzTWF0ZXJpYWw9ITA7Y29uc3QgUHJ0PXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9LHdydD17aDowLHM6MCxsOjB9LGtydD17aDowLHM6MCxsOjB9O2Z1bmN0aW9uIFNydCh0LGUsbil7cmV0dXJuIG48MCYmKG4rPTEpLG4+MSYmKG4tPTEpLG48MS82P3QrNiooZS10KSpuOm48LjU/ZTpuPDIvMz90KzYqKGUtdCkqKDIvMy1uKTp0fWZ1bmN0aW9uIERydCh0KXtyZXR1cm4gdDwuMDQwNDU/LjA3NzM5OTM4MDgqdDpNYXRoLnBvdyguOTQ3ODY3Mjk4Nip0Ky4wNTIxMzI3MDE0LDIuNCl9ZnVuY3Rpb24gRXJ0KHQpe3JldHVybiB0PC4wMDMxMzA4PzEyLjkyKnQ6MS4wNTUqTWF0aC5wb3codCwuNDE2NjYpLS4wNTV9Y2xhc3MgUnJ0e2NvbnN0cnVjdG9yKHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09ZSYmdm9pZCAwPT09bj90aGlzLnNldCh0KTp0aGlzLnNldFJHQih0LGUsbil9c2V0KHQpe3JldHVybiB0JiZ0LmlzQ29sb3I/dGhpcy5jb3B5KHQpOiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnNldEhleCh0KToic3RyaW5nIj09dHlwZW9mIHQmJnRoaXMuc2V0U3R5bGUodCksdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMucj10LHRoaXMuZz10LHRoaXMuYj10LHRoaXN9c2V0SGV4KHQpe3JldHVybiB0PU1hdGguZmxvb3IodCksdGhpcy5yPSh0Pj4xNiYyNTUpLzI1NSx0aGlzLmc9KHQ+PjgmMjU1KS8yNTUsdGhpcy5iPSgyNTUmdCkvMjU1LHRoaXN9c2V0UkdCKHQsZSxuKXtyZXR1cm4gdGhpcy5yPXQsdGhpcy5nPWUsdGhpcy5iPW4sdGhpc31zZXRIU0wodCxlLG4pe2lmKHQ9KGZ1bmN0aW9uIG8odCxlKXtyZXR1cm4odCVlK2UpJWV9KSh0LDEpLGU9Wml0KGUsMCwxKSxuPVppdChuLDAsMSksMD09PWUpdGhpcy5yPXRoaXMuZz10aGlzLmI9bjtlbHNle2NvbnN0IG89bjw9LjU/biooMStlKTpuK2UtbiplLGk9MipuLW87dGhpcy5yPVNydChpLG8sdCsxLzMpLHRoaXMuZz1TcnQoaSxvLHQpLHRoaXMuYj1TcnQoaSxvLHQtMS8zKX1yZXR1cm4gdGhpc31zZXRTdHlsZSh0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMCE9PWUmJnBhcnNlRmxvYXQoZSk8MSYmY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogQWxwaGEgY29tcG9uZW50IG9mICIrdCsiIHdpbGwgYmUgaWdub3JlZC4iKX1sZXQgbjtpZihuPS9eKCg/OnJnYnxoc2wpYT8pXCgoW15cKV0qKVwpLy5leGVjKHQpKXtsZXQgdDtjb25zdCBvPW5bMl07c3dpdGNoKG5bMV0pe2Nhc2UicmdiIjpjYXNlInJnYmEiOmlmKHQ9L15ccyooXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhvKSlyZXR1cm4gdGhpcy5yPU1hdGgubWluKDI1NSxwYXJzZUludCh0WzFdLDEwKSkvMjU1LHRoaXMuZz1NYXRoLm1pbigyNTUscGFyc2VJbnQodFsyXSwxMCkpLzI1NSx0aGlzLmI9TWF0aC5taW4oMjU1LHBhcnNlSW50KHRbM10sMTApKS8yNTUsZSh0WzRdKSx0aGlzO2lmKHQ9L15ccyooXGQrKVwlXHMqLFxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhvKSlyZXR1cm4gdGhpcy5yPU1hdGgubWluKDEwMCxwYXJzZUludCh0WzFdLDEwKSkvMTAwLHRoaXMuZz1NYXRoLm1pbigxMDAscGFyc2VJbnQodFsyXSwxMCkpLzEwMCx0aGlzLmI9TWF0aC5taW4oMTAwLHBhcnNlSW50KHRbM10sMTApKS8xMDAsZSh0WzRdKSx0aGlzO2JyZWFrO2Nhc2UiaHNsIjpjYXNlImhzbGEiOmlmKHQ9L15ccyooXGQqXC4/XGQrKVxzKixccyooXGQrKVwlXHMqLFxzKihcZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMobykpe2NvbnN0IG49cGFyc2VGbG9hdCh0WzFdKS8zNjAsbz1wYXJzZUludCh0WzJdLDEwKS8xMDAsaT1wYXJzZUludCh0WzNdLDEwKS8xMDA7cmV0dXJuIGUodFs0XSksdGhpcy5zZXRIU0wobixvLGkpfX19ZWxzZSBpZihuPS9eXCMoW0EtRmEtZlxkXSspJC8uZXhlYyh0KSl7Y29uc3QgdD1uWzFdLGU9dC5sZW5ndGg7aWYoMz09PWUpcmV0dXJuIHRoaXMucj1wYXJzZUludCh0LmNoYXJBdCgwKSt0LmNoYXJBdCgwKSwxNikvMjU1LHRoaXMuZz1wYXJzZUludCh0LmNoYXJBdCgxKSt0LmNoYXJBdCgxKSwxNikvMjU1LHRoaXMuYj1wYXJzZUludCh0LmNoYXJBdCgyKSt0LmNoYXJBdCgyKSwxNikvMjU1LHRoaXM7aWYoNj09PWUpcmV0dXJuIHRoaXMucj1wYXJzZUludCh0LmNoYXJBdCgwKSt0LmNoYXJBdCgxKSwxNikvMjU1LHRoaXMuZz1wYXJzZUludCh0LmNoYXJBdCgyKSt0LmNoYXJBdCgzKSwxNikvMjU1LHRoaXMuYj1wYXJzZUludCh0LmNoYXJBdCg0KSt0LmNoYXJBdCg1KSwxNikvMjU1LHRoaXN9cmV0dXJuIHQmJnQubGVuZ3RoPjA/dGhpcy5zZXRDb2xvck5hbWUodCk6dGhpc31zZXRDb2xvck5hbWUodCl7Y29uc3QgZT1QcnRbdC50b0xvd2VyQ2FzZSgpXTtyZXR1cm4gdm9pZCAwIT09ZT90aGlzLnNldEhleChlKTpjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yICIrdCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnIsdGhpcy5nLHRoaXMuYil9Y29weSh0KXtyZXR1cm4gdGhpcy5yPXQucix0aGlzLmc9dC5nLHRoaXMuYj10LmIsdGhpc31jb3B5R2FtbWFUb0xpbmVhcih0LGU9Mil7cmV0dXJuIHRoaXMucj1NYXRoLnBvdyh0LnIsZSksdGhpcy5nPU1hdGgucG93KHQuZyxlKSx0aGlzLmI9TWF0aC5wb3codC5iLGUpLHRoaXN9Y29weUxpbmVhclRvR2FtbWEodCxlPTIpe2NvbnN0IG49ZT4wPzEvZToxO3JldHVybiB0aGlzLnI9TWF0aC5wb3codC5yLG4pLHRoaXMuZz1NYXRoLnBvdyh0LmcsbiksdGhpcy5iPU1hdGgucG93KHQuYixuKSx0aGlzfWNvbnZlcnRHYW1tYVRvTGluZWFyKHQpe3JldHVybiB0aGlzLmNvcHlHYW1tYVRvTGluZWFyKHRoaXMsdCksdGhpc31jb252ZXJ0TGluZWFyVG9HYW1tYSh0KXtyZXR1cm4gdGhpcy5jb3B5TGluZWFyVG9HYW1tYSh0aGlzLHQpLHRoaXN9Y29weVNSR0JUb0xpbmVhcih0KXtyZXR1cm4gdGhpcy5yPURydCh0LnIpLHRoaXMuZz1EcnQodC5nKSx0aGlzLmI9RHJ0KHQuYiksdGhpc31jb3B5TGluZWFyVG9TUkdCKHQpe3JldHVybiB0aGlzLnI9RXJ0KHQuciksdGhpcy5nPUVydCh0LmcpLHRoaXMuYj1FcnQodC5iKSx0aGlzfWNvbnZlcnRTUkdCVG9MaW5lYXIoKXtyZXR1cm4gdGhpcy5jb3B5U1JHQlRvTGluZWFyKHRoaXMpLHRoaXN9Y29udmVydExpbmVhclRvU1JHQigpe3JldHVybiB0aGlzLmNvcHlMaW5lYXJUb1NSR0IodGhpcyksdGhpc31nZXRIZXgoKXtyZXR1cm4gMjU1KnRoaXMucjw8MTZeMjU1KnRoaXMuZzw8OF4yNTUqdGhpcy5iPDwwfWdldEhleFN0cmluZygpe3JldHVybigiMDAwMDAwIit0aGlzLmdldEhleCgpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTYpfWdldEhTTCh0KXtjb25zdCBlPXRoaXMucixuPXRoaXMuZyxvPXRoaXMuYixpPU1hdGgubWF4KGUsbixvKSxhPU1hdGgubWluKGUsbixvKTtsZXQgcixzO2NvbnN0IGw9KGEraSkvMjtpZihhPT09aSlyPTAscz0wO2Vsc2V7Y29uc3QgdD1pLWE7c3dpdGNoKHM9bDw9LjU/dC8oaSthKTp0LygyLWktYSksaSl7Y2FzZSBlOnI9KG4tbykvdCsobjxvPzY6MCk7YnJlYWs7Y2FzZSBuOnI9KG8tZSkvdCsyO2JyZWFrO2Nhc2UgbzpyPShlLW4pL3QrNH1yLz02fXJldHVybiB0Lmg9cix0LnM9cyx0Lmw9bCx0fWdldFN0eWxlKCl7cmV0dXJuInJnYigiKygyNTUqdGhpcy5yfDApKyIsIisoMjU1KnRoaXMuZ3wwKSsiLCIrKDI1NSp0aGlzLmJ8MCkrIikifW9mZnNldEhTTCh0LGUsbil7cmV0dXJuIHRoaXMuZ2V0SFNMKHdydCksd3J0LmgrPXQsd3J0LnMrPWUsd3J0LmwrPW4sdGhpcy5zZXRIU0wod3J0Lmgsd3J0LnMsd3J0LmwpLHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLnIrPXQucix0aGlzLmcrPXQuZyx0aGlzLmIrPXQuYix0aGlzfWFkZENvbG9ycyh0LGUpe3JldHVybiB0aGlzLnI9dC5yK2Uucix0aGlzLmc9dC5nK2UuZyx0aGlzLmI9dC5iK2UuYix0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy5yKz10LHRoaXMuZys9dCx0aGlzLmIrPXQsdGhpc31zdWIodCl7cmV0dXJuIHRoaXMucj1NYXRoLm1heCgwLHRoaXMuci10LnIpLHRoaXMuZz1NYXRoLm1heCgwLHRoaXMuZy10LmcpLHRoaXMuYj1NYXRoLm1heCgwLHRoaXMuYi10LmIpLHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMucio9dC5yLHRoaXMuZyo9dC5nLHRoaXMuYio9dC5iLHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMucio9dCx0aGlzLmcqPXQsdGhpcy5iKj10LHRoaXN9bGVycCh0LGUpe3JldHVybiB0aGlzLnIrPSh0LnItdGhpcy5yKSplLHRoaXMuZys9KHQuZy10aGlzLmcpKmUsdGhpcy5iKz0odC5iLXRoaXMuYikqZSx0aGlzfWxlcnBDb2xvcnModCxlLG4pe3JldHVybiB0aGlzLnI9dC5yKyhlLnItdC5yKSpuLHRoaXMuZz10LmcrKGUuZy10LmcpKm4sdGhpcy5iPXQuYisoZS5iLXQuYikqbix0aGlzfWxlcnBIU0wodCxlKXt0aGlzLmdldEhTTCh3cnQpLHQuZ2V0SFNMKGtydCk7Y29uc3Qgbj1YaXQod3J0Lmgsa3J0LmgsZSksbz1YaXQod3J0LnMsa3J0LnMsZSksaT1YaXQod3J0Lmwsa3J0LmwsZSk7cmV0dXJuIHRoaXMuc2V0SFNMKG4sbyxpKSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5yPT09dGhpcy5yJiZ0Lmc9PT10aGlzLmcmJnQuYj09PXRoaXMuYn1mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLnI9dFtlXSx0aGlzLmc9dFtlKzFdLHRoaXMuYj10W2UrMl0sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLnIsdFtlKzFdPXRoaXMuZyx0W2UrMl09dGhpcy5iLHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLnI9dC5nZXRYKGUpLHRoaXMuZz10LmdldFkoZSksdGhpcy5iPXQuZ2V0WihlKSwhMD09PXQubm9ybWFsaXplZCYmKHRoaXMuci89MjU1LHRoaXMuZy89MjU1LHRoaXMuYi89MjU1KSx0aGlzfXRvSlNPTigpe3JldHVybiB0aGlzLmdldEhleCgpfX1ScnQuTkFNRVM9UHJ0LFJydC5wcm90b3R5cGUuaXNDb2xvcj0hMCxScnQucHJvdG90eXBlLnI9MSxScnQucHJvdG90eXBlLmc9MSxScnQucHJvdG90eXBlLmI9MTtjbGFzcyBBcnQgZXh0ZW5kcyBPcnR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9Ik1lc2hCYXNpY01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyBScnQoMTY3NzcyMTUpLHRoaXMubWFwPW51bGwsdGhpcy5saWdodE1hcD1udWxsLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9MSx0aGlzLmFvTWFwPW51bGwsdGhpcy5hb01hcEludGVuc2l0eT0xLHRoaXMuc3BlY3VsYXJNYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5lbnZNYXA9bnVsbCx0aGlzLmNvbWJpbmU9MCx0aGlzLnJlZmxlY3Rpdml0eT0xLHRoaXMucmVmcmFjdGlvblJhdGlvPS45OCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiLHRoaXMud2lyZWZyYW1lTGluZWpvaW49InJvdW5kIix0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSx0aGlzLm1hcD10Lm1hcCx0aGlzLmxpZ2h0TWFwPXQubGlnaHRNYXAsdGhpcy5saWdodE1hcEludGVuc2l0eT10LmxpZ2h0TWFwSW50ZW5zaXR5LHRoaXMuYW9NYXA9dC5hb01hcCx0aGlzLmFvTWFwSW50ZW5zaXR5PXQuYW9NYXBJbnRlbnNpdHksdGhpcy5zcGVjdWxhck1hcD10LnNwZWN1bGFyTWFwLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLmVudk1hcD10LmVudk1hcCx0aGlzLmNvbWJpbmU9dC5jb21iaW5lLHRoaXMucmVmbGVjdGl2aXR5PXQucmVmbGVjdGl2aXR5LHRoaXMucmVmcmFjdGlvblJhdGlvPXQucmVmcmFjdGlvblJhdGlvLHRoaXMud2lyZWZyYW1lPXQud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoLHRoaXMud2lyZWZyYW1lTGluZWNhcD10LndpcmVmcmFtZUxpbmVjYXAsdGhpcy53aXJlZnJhbWVMaW5lam9pbj10LndpcmVmcmFtZUxpbmVqb2luLHRoaXN9fUFydC5wcm90b3R5cGUuaXNNZXNoQmFzaWNNYXRlcmlhbD0hMDtjb25zdCBUcnQ9bmV3IGNhdCxOcnQ9bmV3IFFpdDtjbGFzcyB6cnR7Y29uc3RydWN0b3IodCxlLG4pe2lmKEFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTt0aGlzLm5hbWU9IiIsdGhpcy5hcnJheT10LHRoaXMuaXRlbVNpemU9ZSx0aGlzLmNvdW50PXZvaWQgMCE9PXQ/dC5sZW5ndGgvZTowLHRoaXMubm9ybWFsaXplZD0hMD09PW4sdGhpcy51c2FnZT1CaXQsdGhpcy51cGRhdGVSYW5nZT17b2Zmc2V0OjAsY291bnQ6LTF9LHRoaXMudmVyc2lvbj0wfW9uVXBsb2FkQ2FsbGJhY2soKXt9c2V0IG5lZWRzVXBkYXRlKHQpeyEwPT09dCYmdGhpcy52ZXJzaW9uKyt9c2V0VXNhZ2UodCl7cmV0dXJuIHRoaXMudXNhZ2U9dCx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMubmFtZT10Lm5hbWUsdGhpcy5hcnJheT1uZXcgdC5hcnJheS5jb25zdHJ1Y3Rvcih0LmFycmF5KSx0aGlzLml0ZW1TaXplPXQuaXRlbVNpemUsdGhpcy5jb3VudD10LmNvdW50LHRoaXMubm9ybWFsaXplZD10Lm5vcm1hbGl6ZWQsdGhpcy51c2FnZT10LnVzYWdlLHRoaXN9Y29weUF0KHQsZSxuKXt0Kj10aGlzLml0ZW1TaXplLG4qPWUuaXRlbVNpemU7Zm9yKGxldCBvPTAsaT10aGlzLml0ZW1TaXplO288aTtvKyspdGhpcy5hcnJheVt0K29dPWUuYXJyYXlbbitvXTtyZXR1cm4gdGhpc31jb3B5QXJyYXkodCl7cmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQpLHRoaXN9Y29weUNvbG9yc0FycmF5KHQpe2NvbnN0IGU9dGhpcy5hcnJheTtsZXQgbj0wO2ZvcihsZXQgbz0wLGk9dC5sZW5ndGg7bzxpO28rKyl7bGV0IGk9dFtvXTt2b2lkIDA9PT1pJiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weUNvbG9yc0FycmF5KCk6IGNvbG9yIGlzIHVuZGVmaW5lZCIsbyksaT1uZXcgUnJ0KSxlW24rK109aS5yLGVbbisrXT1pLmcsZVtuKytdPWkuYn1yZXR1cm4gdGhpc31jb3B5VmVjdG9yMnNBcnJheSh0KXtjb25zdCBlPXRoaXMuYXJyYXk7bGV0IG49MDtmb3IobGV0IG89MCxpPXQubGVuZ3RoO288aTtvKyspe2xldCBpPXRbb107dm9pZCAwPT09aSYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3Iyc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQiLG8pLGk9bmV3IFFpdCksZVtuKytdPWkueCxlW24rK109aS55fXJldHVybiB0aGlzfWNvcHlWZWN0b3Izc0FycmF5KHQpe2NvbnN0IGU9dGhpcy5hcnJheTtsZXQgbj0wO2ZvcihsZXQgbz0wLGk9dC5sZW5ndGg7bzxpO28rKyl7bGV0IGk9dFtvXTt2b2lkIDA9PT1pJiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCIsbyksaT1uZXcgY2F0KSxlW24rK109aS54LGVbbisrXT1pLnksZVtuKytdPWkuen1yZXR1cm4gdGhpc31jb3B5VmVjdG9yNHNBcnJheSh0KXtjb25zdCBlPXRoaXMuYXJyYXk7bGV0IG49MDtmb3IobGV0IG89MCxpPXQubGVuZ3RoO288aTtvKyspe2xldCBpPXRbb107dm9pZCAwPT09aSYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3I0c0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQiLG8pLGk9bmV3IGFhdCksZVtuKytdPWkueCxlW24rK109aS55LGVbbisrXT1pLnosZVtuKytdPWkud31yZXR1cm4gdGhpc31hcHBseU1hdHJpeDModCl7aWYoMj09PXRoaXMuaXRlbVNpemUpZm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspTnJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxOcnQuYXBwbHlNYXRyaXgzKHQpLHRoaXMuc2V0WFkoZSxOcnQueCxOcnQueSk7ZWxzZSBpZigzPT09dGhpcy5pdGVtU2l6ZSlmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylUcnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLFRydC5hcHBseU1hdHJpeDModCksdGhpcy5zZXRYWVooZSxUcnQueCxUcnQueSxUcnQueik7cmV0dXJuIHRoaXN9YXBwbHlNYXRyaXg0KHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKVRydC54PXRoaXMuZ2V0WChlKSxUcnQueT10aGlzLmdldFkoZSksVHJ0Lno9dGhpcy5nZXRaKGUpLFRydC5hcHBseU1hdHJpeDQodCksdGhpcy5zZXRYWVooZSxUcnQueCxUcnQueSxUcnQueik7cmV0dXJuIHRoaXN9YXBwbHlOb3JtYWxNYXRyaXgodCl7Zm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspVHJ0Lng9dGhpcy5nZXRYKGUpLFRydC55PXRoaXMuZ2V0WShlKSxUcnQuej10aGlzLmdldFooZSksVHJ0LmFwcGx5Tm9ybWFsTWF0cml4KHQpLHRoaXMuc2V0WFlaKGUsVHJ0LngsVHJ0LnksVHJ0LnopO3JldHVybiB0aGlzfXRyYW5zZm9ybURpcmVjdGlvbih0KXtmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylUcnQueD10aGlzLmdldFgoZSksVHJ0Lnk9dGhpcy5nZXRZKGUpLFRydC56PXRoaXMuZ2V0WihlKSxUcnQudHJhbnNmb3JtRGlyZWN0aW9uKHQpLHRoaXMuc2V0WFlaKGUsVHJ0LngsVHJ0LnksVHJ0LnopO3JldHVybiB0aGlzfXNldCh0LGU9MCl7cmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQsZSksdGhpc31nZXRYKHQpe3JldHVybiB0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZV19c2V0WCh0LGUpe3JldHVybiB0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZV09ZSx0aGlzfWdldFkodCl7cmV0dXJuIHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzFdfXNldFkodCxlKXtyZXR1cm4gdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMV09ZSx0aGlzfWdldFoodCl7cmV0dXJuIHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzJdfXNldFoodCxlKXtyZXR1cm4gdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl09ZSx0aGlzfWdldFcodCl7cmV0dXJuIHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzNdfXNldFcodCxlKXtyZXR1cm4gdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrM109ZSx0aGlzfXNldFhZKHQsZSxuKXtyZXR1cm4gdGhpcy5hcnJheVswKyh0Kj10aGlzLml0ZW1TaXplKV09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzfXNldFhZWih0LGUsbixvKXtyZXR1cm4gdGhpcy5hcnJheVswKyh0Kj10aGlzLml0ZW1TaXplKV09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzLmFycmF5W3QrMl09byx0aGlzfXNldFhZWlcodCxlLG4sbyxpKXtyZXR1cm4gdGhpcy5hcnJheVswKyh0Kj10aGlzLml0ZW1TaXplKV09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzLmFycmF5W3QrMl09byx0aGlzLmFycmF5W3QrM109aSx0aGlzfW9uVXBsb2FkKHQpe3JldHVybiB0aGlzLm9uVXBsb2FkQ2FsbGJhY2s9dCx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuYXJyYXksdGhpcy5pdGVtU2l6ZSkuY29weSh0aGlzKX10b0pTT04oKXtjb25zdCB0PXtpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuYXJyYXkpLG5vcm1hbGl6ZWQ6dGhpcy5ub3JtYWxpemVkfTtyZXR1cm4iIiE9PXRoaXMubmFtZSYmKHQubmFtZT10aGlzLm5hbWUpLHRoaXMudXNhZ2UhPT1CaXQmJih0LnVzYWdlPXRoaXMudXNhZ2UpLDA9PT10aGlzLnVwZGF0ZVJhbmdlLm9mZnNldCYmLTE9PT10aGlzLnVwZGF0ZVJhbmdlLmNvdW50fHwodC51cGRhdGVSYW5nZT10aGlzLnVwZGF0ZVJhbmdlKSx0fX16cnQucHJvdG90eXBlLmlzQnVmZmVyQXR0cmlidXRlPSEwO2NsYXNzIElydCBleHRlbmRzIHpydHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQxNkFycmF5KHQpLGUsbil9fWNsYXNzIEhydCBleHRlbmRzIHpydHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQzMkFycmF5KHQpLGUsbil9fShjbGFzcyBleHRlbmRzIHpydHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQxNkFycmF5KHQpLGUsbil9fSkucHJvdG90eXBlLmlzRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZT0hMDtjbGFzcyBGcnQgZXh0ZW5kcyB6cnR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBGbG9hdDMyQXJyYXkodCksZSxuKX19ZnVuY3Rpb24gTHJ0KHQpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4tMS8wO2xldCBlPXRbMF07Zm9yKGxldCBuPTEsbz10Lmxlbmd0aDtuPG87KytuKXRbbl0+ZSYmKGU9dFtuXSk7cmV0dXJuIGV9bGV0IEJydD0wO2NvbnN0IFZydD1uZXcgQmF0LGpydD1uZXcgcHJ0LFVydD1uZXcgY2F0LEdydD1uZXcgbWF0LFdydD1uZXcgbWF0LFlydD1uZXcgY2F0O2NsYXNzIHFydCBleHRlbmRzIFVpdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6QnJ0Kyt9KSx0aGlzLnV1aWQ9cWl0KCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iQnVmZmVyR2VvbWV0cnkiLHRoaXMuaW5kZXg9bnVsbCx0aGlzLmF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaEF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT0hMSx0aGlzLmdyb3Vwcz1bXSx0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsLHRoaXMuZHJhd1JhbmdlPXtzdGFydDowLGNvdW50OjEvMH0sdGhpcy51c2VyRGF0YT17fX1nZXRJbmRleCgpe3JldHVybiB0aGlzLmluZGV4fXNldEluZGV4KHQpe3JldHVybiB0aGlzLmluZGV4PUFycmF5LmlzQXJyYXkodCk/bmV3KExydCh0KT42NTUzNT9IcnQ6SXJ0KSh0LDEpOnQsdGhpc31nZXRBdHRyaWJ1dGUodCl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XX1zZXRBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW3RdPWUsdGhpc31kZWxldGVBdHRyaWJ1dGUodCl7cmV0dXJuIGRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXNbdF0sdGhpc31oYXNBdHRyaWJ1dGUodCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuYXR0cmlidXRlc1t0XX1hZGRHcm91cCh0LGUsbj0wKXt0aGlzLmdyb3Vwcy5wdXNoKHtzdGFydDp0LGNvdW50OmUsbWF0ZXJpYWxJbmRleDpufSl9Y2xlYXJHcm91cHMoKXt0aGlzLmdyb3Vwcz1bXX1zZXREcmF3UmFuZ2UodCxlKXt0aGlzLmRyYXdSYW5nZS5zdGFydD10LHRoaXMuZHJhd1JhbmdlLmNvdW50PWV9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO3ZvaWQgMCE9PWUmJihlLmFwcGx5TWF0cml4NCh0KSxlLm5lZWRzVXBkYXRlPSEwKTtjb25zdCBuPXRoaXMuYXR0cmlidXRlcy5ub3JtYWw7aWYodm9pZCAwIT09bil7Y29uc3QgZT0obmV3ICRpdCkuZ2V0Tm9ybWFsTWF0cml4KHQpO24uYXBwbHlOb3JtYWxNYXRyaXgoZSksbi5uZWVkc1VwZGF0ZT0hMH1jb25zdCBvPXRoaXMuYXR0cmlidXRlcy50YW5nZW50O3JldHVybiB2b2lkIDAhPT1vJiYoby50cmFuc2Zvcm1EaXJlY3Rpb24odCksby5uZWVkc1VwZGF0ZT0hMCksbnVsbCE9PXRoaXMuYm91bmRpbmdCb3gmJnRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCksbnVsbCE9PXRoaXMuYm91bmRpbmdTcGhlcmUmJnRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksdGhpc31hcHBseVF1YXRlcm5pb24odCl7cmV0dXJuIFZydC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KSx0aGlzLmFwcGx5TWF0cml4NChWcnQpLHRoaXN9cm90YXRlWCh0KXtyZXR1cm4gVnJ0Lm1ha2VSb3RhdGlvblgodCksdGhpcy5hcHBseU1hdHJpeDQoVnJ0KSx0aGlzfXJvdGF0ZVkodCl7cmV0dXJuIFZydC5tYWtlUm90YXRpb25ZKHQpLHRoaXMuYXBwbHlNYXRyaXg0KFZydCksdGhpc31yb3RhdGVaKHQpe3JldHVybiBWcnQubWFrZVJvdGF0aW9uWih0KSx0aGlzLmFwcGx5TWF0cml4NChWcnQpLHRoaXN9dHJhbnNsYXRlKHQsZSxuKXtyZXR1cm4gVnJ0Lm1ha2VUcmFuc2xhdGlvbih0LGUsbiksdGhpcy5hcHBseU1hdHJpeDQoVnJ0KSx0aGlzfXNjYWxlKHQsZSxuKXtyZXR1cm4gVnJ0Lm1ha2VTY2FsZSh0LGUsbiksdGhpcy5hcHBseU1hdHJpeDQoVnJ0KSx0aGlzfWxvb2tBdCh0KXtyZXR1cm4ganJ0Lmxvb2tBdCh0KSxqcnQudXBkYXRlTWF0cml4KCksdGhpcy5hcHBseU1hdHJpeDQoanJ0Lm1hdHJpeCksdGhpc31jZW50ZXIoKXtyZXR1cm4gdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKSx0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlcihVcnQpLm5lZ2F0ZSgpLHRoaXMudHJhbnNsYXRlKFVydC54LFVydC55LFVydC56KSx0aGlzfXNldEZyb21Qb2ludHModCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MCxvPXQubGVuZ3RoO248bztuKyspe2NvbnN0IG89dFtuXTtlLnB1c2goby54LG8ueSxvLnp8fDApfXJldHVybiB0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBGcnQoZSwzKSksdGhpc31jb21wdXRlQm91bmRpbmdCb3goKXtudWxsPT09dGhpcy5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IG1hdCk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBib3guIEFsdGVybmF0aXZlbHkgc2V0ICJtZXNoLmZydXN0dW1DdWxsZWQiIHRvICJmYWxzZSIuJyx0aGlzKSx2b2lkIHRoaXMuYm91bmRpbmdCb3guc2V0KG5ldyBjYXQoLTEvMCwtMS8wLC0xLzApLG5ldyBjYXQoMS8wLDEvMCwxLzApKTtpZih2b2lkIDAhPT10KXtpZih0aGlzLmJvdW5kaW5nQm94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCksZSlmb3IobGV0IHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspR3J0LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUoZVt0XSksdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT8oWXJ0LmFkZFZlY3RvcnModGhpcy5ib3VuZGluZ0JveC5taW4sR3J0Lm1pbiksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KFlydCksWXJ0LmFkZFZlY3RvcnModGhpcy5ib3VuZGluZ0JveC5tYXgsR3J0Lm1heCksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KFlydCkpOih0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoR3J0Lm1pbiksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KEdydC5tYXgpKX1lbHNlIHRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7KGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLngpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi55KXx8aXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueikpJiZjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTogQ29tcHV0ZWQgbWluL21heCBoYXZlIE5hTiB2YWx1ZXMuIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsdGhpcyl9Y29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl7bnVsbD09PXRoaXMuYm91bmRpbmdTcGhlcmUmJih0aGlzLmJvdW5kaW5nU3BoZXJlPW5ldyBSYXQpO2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYodCYmdC5pc0dMQnVmZmVyQXR0cmlidXRlKXJldHVybiBjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogR0xCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgYSBtYW51YWwgYm91bmRpbmcgc3BoZXJlLiBBbHRlcm5hdGl2ZWx5IHNldCAibWVzaC5mcnVzdHVtQ3VsbGVkIiB0byAiZmFsc2UiLicsdGhpcyksdm9pZCB0aGlzLmJvdW5kaW5nU3BoZXJlLnNldChuZXcgY2F0LDEvMCk7aWYodCl7Y29uc3Qgbj10aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlcjtpZihHcnQuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KSxlKWZvcihsZXQgdD0wLG49ZS5sZW5ndGg7dDxuO3QrKylXcnQuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShlW3RdKSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPyhZcnQuYWRkVmVjdG9ycyhHcnQubWluLFdydC5taW4pLEdydC5leHBhbmRCeVBvaW50KFlydCksWXJ0LmFkZFZlY3RvcnMoR3J0Lm1heCxXcnQubWF4KSxHcnQuZXhwYW5kQnlQb2ludChZcnQpKTooR3J0LmV4cGFuZEJ5UG9pbnQoV3J0Lm1pbiksR3J0LmV4cGFuZEJ5UG9pbnQoV3J0Lm1heCkpO0dydC5nZXRDZW50ZXIobik7bGV0IG89MDtmb3IobGV0IGU9MCxpPXQuY291bnQ7ZTxpO2UrKylZcnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpLG89TWF0aC5tYXgobyxuLmRpc3RhbmNlVG9TcXVhcmVkKFlydCkpO2lmKGUpZm9yKGxldCBpPTAsYT1lLmxlbmd0aDtpPGE7aSsrKXtjb25zdCBhPWVbaV0scj10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2ZvcihsZXQgZT0wLGk9YS5jb3VudDtlPGk7ZSsrKVlydC5mcm9tQnVmZmVyQXR0cmlidXRlKGEsZSksciYmKFVydC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksWXJ0LmFkZChVcnQpKSxvPU1hdGgubWF4KG8sbi5kaXN0YW5jZVRvU3F1YXJlZChZcnQpKX10aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cz1NYXRoLnNxcnQobyksaXNOYU4odGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMpJiZjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogQ29tcHV0ZWQgcmFkaXVzIGlzIE5hTi4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX19Y29tcHV0ZUZhY2VOb3JtYWxzKCl7fWNvbXB1dGVUYW5nZW50cygpe2NvbnN0IHQ9dGhpcy5pbmRleCxlPXRoaXMuYXR0cmlidXRlcztpZihudWxsPT09dHx8dm9pZCAwPT09ZS5wb3NpdGlvbnx8dm9pZCAwPT09ZS5ub3JtYWx8fHZvaWQgMD09PWUudXYpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBmYWlsZWQuIE1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlcyAoaW5kZXgsIHBvc2l0aW9uLCBub3JtYWwgb3IgdXYpIik7Y29uc3Qgbj10LmFycmF5LG89ZS5wb3NpdGlvbi5hcnJheSxpPWUubm9ybWFsLmFycmF5LGE9ZS51di5hcnJheSxyPW8ubGVuZ3RoLzM7dm9pZCAwPT09ZS50YW5nZW50JiZ0aGlzLnNldEF0dHJpYnV0ZSgidGFuZ2VudCIsbmV3IHpydChuZXcgRmxvYXQzMkFycmF5KDQqciksNCkpO2NvbnN0IHM9ZS50YW5nZW50LmFycmF5LGw9W10sYz1bXTtmb3IobGV0IHQ9MDt0PHI7dCsrKWxbdF09bmV3IGNhdCxjW3RdPW5ldyBjYXQ7Y29uc3QgZD1uZXcgY2F0LHA9bmV3IGNhdCxtPW5ldyBjYXQsdT1uZXcgUWl0LGY9bmV3IFFpdCxnPW5ldyBRaXQsaD1uZXcgY2F0LGI9bmV3IGNhdDtmdW5jdGlvbiB5KHQsZSxuKXtkLmZyb21BcnJheShvLDMqdCkscC5mcm9tQXJyYXkobywzKmUpLG0uZnJvbUFycmF5KG8sMypuKSx1LmZyb21BcnJheShhLDIqdCksZi5mcm9tQXJyYXkoYSwyKmUpLGcuZnJvbUFycmF5KGEsMipuKSxwLnN1YihkKSxtLnN1YihkKSxmLnN1Yih1KSxnLnN1Yih1KTtjb25zdCBpPTEvKGYueCpnLnktZy54KmYueSk7aXNGaW5pdGUoaSkmJihoLmNvcHkocCkubXVsdGlwbHlTY2FsYXIoZy55KS5hZGRTY2FsZWRWZWN0b3IobSwtZi55KS5tdWx0aXBseVNjYWxhcihpKSxiLmNvcHkobSkubXVsdGlwbHlTY2FsYXIoZi54KS5hZGRTY2FsZWRWZWN0b3IocCwtZy54KS5tdWx0aXBseVNjYWxhcihpKSxsW3RdLmFkZChoKSxsW2VdLmFkZChoKSxsW25dLmFkZChoKSxjW3RdLmFkZChiKSxjW2VdLmFkZChiKSxjW25dLmFkZChiKSl9bGV0IF89dGhpcy5ncm91cHM7MD09PV8ubGVuZ3RoJiYoXz1be3N0YXJ0OjAsY291bnQ6bi5sZW5ndGh9XSk7Zm9yKGxldCB0PTAsZT1fLmxlbmd0aDt0PGU7Kyt0KXtjb25zdCBlPV9bdF0sbz1lLnN0YXJ0O2ZvcihsZXQgdD1vLGk9bytlLmNvdW50O3Q8aTt0Kz0zKXkoblt0KzBdLG5bdCsxXSxuW3QrMl0pfWNvbnN0IEM9bmV3IGNhdCxNPW5ldyBjYXQsdj1uZXcgY2F0LHg9bmV3IGNhdDtmdW5jdGlvbiBPKHQpe3YuZnJvbUFycmF5KGksMyp0KSx4LmNvcHkodik7Y29uc3QgZT1sW3RdO0MuY29weShlKSxDLnN1Yih2Lm11bHRpcGx5U2NhbGFyKHYuZG90KGUpKSkubm9ybWFsaXplKCksTS5jcm9zc1ZlY3RvcnMoeCxlKTtjb25zdCBuPU0uZG90KGNbdF0pPDA/LTE6MTtzWzQqdF09Qy54LHNbNCp0KzFdPUMueSxzWzQqdCsyXT1DLnosc1s0KnQrM109bn1mb3IobGV0IHQ9MCxlPV8ubGVuZ3RoO3Q8ZTsrK3Qpe2NvbnN0IGU9X1t0XSxvPWUuc3RhcnQ7Zm9yKGxldCB0PW8saT1vK2UuY291bnQ7dDxpO3QrPTMpTyhuW3QrMF0pLE8oblt0KzFdKSxPKG5bdCsyXSl9fWNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCl7Y29uc3QgdD10aGlzLmluZGV4LGU9dGhpcy5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7aWYodm9pZCAwIT09ZSl7bGV0IG49dGhpcy5nZXRBdHRyaWJ1dGUoIm5vcm1hbCIpO2lmKHZvaWQgMD09PW4pbj1uZXcgenJ0KG5ldyBGbG9hdDMyQXJyYXkoMyplLmNvdW50KSwzKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuKTtlbHNlIGZvcihsZXQgdD0wLGU9bi5jb3VudDt0PGU7dCsrKW4uc2V0WFlaKHQsMCwwLDApO2NvbnN0IG89bmV3IGNhdCxpPW5ldyBjYXQsYT1uZXcgY2F0LHI9bmV3IGNhdCxzPW5ldyBjYXQsbD1uZXcgY2F0LGM9bmV3IGNhdCxkPW5ldyBjYXQ7aWYodClmb3IobGV0IHA9MCxtPXQuY291bnQ7cDxtO3ArPTMpe2NvbnN0IG09dC5nZXRYKHArMCksdT10LmdldFgocCsxKSxmPXQuZ2V0WChwKzIpO28uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLG0pLGkuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHUpLGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGYpLGMuc3ViVmVjdG9ycyhhLGkpLGQuc3ViVmVjdG9ycyhvLGkpLGMuY3Jvc3MoZCksci5mcm9tQnVmZmVyQXR0cmlidXRlKG4sbSkscy5mcm9tQnVmZmVyQXR0cmlidXRlKG4sdSksbC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sZiksci5hZGQoYykscy5hZGQoYyksbC5hZGQoYyksbi5zZXRYWVoobSxyLngsci55LHIueiksbi5zZXRYWVoodSxzLngscy55LHMueiksbi5zZXRYWVooZixsLngsbC55LGwueil9ZWxzZSBmb3IobGV0IHQ9MCxyPWUuY291bnQ7dDxyO3QrPTMpby5mcm9tQnVmZmVyQXR0cmlidXRlKGUsdCswKSxpLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSx0KzEpLGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHQrMiksYy5zdWJWZWN0b3JzKGEsaSksZC5zdWJWZWN0b3JzKG8saSksYy5jcm9zcyhkKSxuLnNldFhZWih0KzAsYy54LGMueSxjLnopLG4uc2V0WFlaKHQrMSxjLngsYy55LGMueiksbi5zZXRYWVoodCsyLGMueCxjLnksYy56KTt0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKSxuLm5lZWRzVXBkYXRlPSEwfX1tZXJnZSh0LGUpe2lmKCF0fHwhdC5pc0J1ZmZlckdlb21ldHJ5KXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IGdlb21ldHJ5IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5CdWZmZXJHZW9tZXRyeS4iLHQpO3ZvaWQgMD09PWUmJihlPTAsY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS5tZXJnZSgpOiBPdmVyd3JpdGluZyBvcmlnaW5hbCBnZW9tZXRyeSwgc3RhcnRpbmcgYXQgb2Zmc2V0PTAuIFVzZSBCdWZmZXJHZW9tZXRyeVV0aWxzLm1lcmdlQnVmZmVyR2VvbWV0cmllcygpIGZvciBsb3NzbGVzcyBtZXJnZS4iKSk7Y29uc3Qgbj10aGlzLmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IG8gaW4gbil7aWYodm9pZCAwPT09dC5hdHRyaWJ1dGVzW29dKWNvbnRpbnVlO2NvbnN0IGk9bltvXS5hcnJheSxhPXQuYXR0cmlidXRlc1tvXSxyPWEuYXJyYXkscz1hLml0ZW1TaXplKmUsbD1NYXRoLm1pbihyLmxlbmd0aCxpLmxlbmd0aC1zKTtmb3IobGV0IHQ9MCxlPXM7dDxsO3QrKyxlKyspaVtlXT1yW3RdfXJldHVybiB0aGlzfW5vcm1hbGl6ZU5vcm1hbHMoKXtjb25zdCB0PXRoaXMuYXR0cmlidXRlcy5ub3JtYWw7Zm9yKGxldCBlPTAsbj10LmNvdW50O2U8bjtlKyspWXJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSxZcnQubm9ybWFsaXplKCksdC5zZXRYWVooZSxZcnQueCxZcnQueSxZcnQueil9dG9Ob25JbmRleGVkKCl7ZnVuY3Rpb24gdCh0LGUpe2NvbnN0IG49dC5hcnJheSxvPXQuaXRlbVNpemUsaT10Lm5vcm1hbGl6ZWQsYT1uZXcgbi5jb25zdHJ1Y3RvcihlLmxlbmd0aCpvKTtsZXQgcj0wLHM9MDtmb3IobGV0IGk9MCxsPWUubGVuZ3RoO2k8bDtpKyspe3I9dC5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlP2VbaV0qdC5kYXRhLnN0cmlkZSt0Lm9mZnNldDplW2ldKm87Zm9yKGxldCB0PTA7dDxvO3QrKylhW3MrK109bltyKytdfXJldHVybiBuZXcgenJ0KGEsbyxpKX1pZihudWxsPT09dGhpcy5pbmRleClyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTogQnVmZmVyR2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4iKSx0aGlzO2NvbnN0IGU9bmV3IHFydCxuPXRoaXMuaW5kZXguYXJyYXksbz10aGlzLmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGkgaW4gbyl7Y29uc3QgYT10KG9baV0sbik7ZS5zZXRBdHRyaWJ1dGUoaSxhKX1jb25zdCBpPXRoaXMubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCBvIGluIGkpe2NvbnN0IGE9W10scj1pW29dO2ZvcihsZXQgZT0wLG89ci5sZW5ndGg7ZTxvO2UrKyl7Y29uc3Qgbz10KHJbZV0sbik7YS5wdXNoKG8pfWUubW9ycGhBdHRyaWJ1dGVzW29dPWF9ZS5tb3JwaFRhcmdldHNSZWxhdGl2ZT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2NvbnN0IGE9dGhpcy5ncm91cHM7Zm9yKGxldCB0PTAsbj1hLmxlbmd0aDt0PG47dCsrKXtjb25zdCBuPWFbdF07ZS5hZGRHcm91cChuLnN0YXJ0LG4uY291bnQsbi5tYXRlcmlhbEluZGV4KX1yZXR1cm4gZX10b0pTT04oKXtjb25zdCB0PXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiQnVmZmVyR2VvbWV0cnkiLGdlbmVyYXRvcjoiQnVmZmVyR2VvbWV0cnkudG9KU09OIn19O2lmKHQudXVpZD10aGlzLnV1aWQsdC50eXBlPXRoaXMudHlwZSwiIiE9PXRoaXMubmFtZSYmKHQubmFtZT10aGlzLm5hbWUpLE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYodC51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSx2b2lkIDAhPT10aGlzLnBhcmFtZXRlcnMpe2NvbnN0IGU9dGhpcy5wYXJhbWV0ZXJzO2Zvcihjb25zdCBuIGluIGUpdm9pZCAwIT09ZVtuXSYmKHRbbl09ZVtuXSk7cmV0dXJuIHR9dC5kYXRhPXthdHRyaWJ1dGVzOnt9fTtjb25zdCBlPXRoaXMuaW5kZXg7bnVsbCE9PWUmJih0LmRhdGEuaW5kZXg9e3R5cGU6ZS5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUuYXJyYXkpfSk7Y29uc3Qgbj10aGlzLmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGUgaW4gbil0LmRhdGEuYXR0cmlidXRlc1tlXT1uW2VdLnRvSlNPTih0LmRhdGEpO2NvbnN0IG89e307bGV0IGk9ITE7Zm9yKGNvbnN0IGUgaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMpe2NvbnN0IG49dGhpcy5tb3JwaEF0dHJpYnV0ZXNbZV0sYT1bXTtmb3IobGV0IGU9MCxvPW4ubGVuZ3RoO2U8bztlKyspYS5wdXNoKG5bZV0udG9KU09OKHQuZGF0YSkpO2EubGVuZ3RoPjAmJihvW2VdPWEsaT0hMCl9aSYmKHQuZGF0YS5tb3JwaEF0dHJpYnV0ZXM9byx0LmRhdGEubW9ycGhUYXJnZXRzUmVsYXRpdmU9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZSk7Y29uc3QgYT10aGlzLmdyb3VwczthLmxlbmd0aD4wJiYodC5kYXRhLmdyb3Vwcz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGEpKSk7Y29uc3Qgcj10aGlzLmJvdW5kaW5nU3BoZXJlO3JldHVybiBudWxsIT09ciYmKHQuZGF0YS5ib3VuZGluZ1NwaGVyZT17Y2VudGVyOnIuY2VudGVyLnRvQXJyYXkoKSxyYWRpdXM6ci5yYWRpdXN9KSx0fWNsb25lKCl7cmV0dXJuKG5ldyBxcnQpLmNvcHkodGhpcyl9Y29weSh0KXt0aGlzLmluZGV4PW51bGwsdGhpcy5hdHRyaWJ1dGVzPXt9LHRoaXMubW9ycGhBdHRyaWJ1dGVzPXt9LHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGw7Y29uc3QgZT17fTt0aGlzLm5hbWU9dC5uYW1lO2NvbnN0IG49dC5pbmRleDtudWxsIT09biYmdGhpcy5zZXRJbmRleChuLmNsb25lKGUpKTtjb25zdCBvPXQuYXR0cmlidXRlcztmb3IoY29uc3QgdCBpbiBvKXRoaXMuc2V0QXR0cmlidXRlKHQsb1t0XS5jbG9uZShlKSk7Y29uc3QgaT10Lm1vcnBoQXR0cmlidXRlcztmb3IoY29uc3QgdCBpbiBpKXtjb25zdCBuPVtdLG89aVt0XTtmb3IobGV0IHQ9MCxpPW8ubGVuZ3RoO3Q8aTt0Kyspbi5wdXNoKG9bdF0uY2xvbmUoZSkpO3RoaXMubW9ycGhBdHRyaWJ1dGVzW3RdPW59dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT10Lm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2NvbnN0IGE9dC5ncm91cHM7Zm9yKGxldCB0PTAsZT1hLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPWFbdF07dGhpcy5hZGRHcm91cChlLnN0YXJ0LGUuY291bnQsZS5tYXRlcmlhbEluZGV4KX1jb25zdCByPXQuYm91bmRpbmdCb3g7bnVsbCE9PXImJih0aGlzLmJvdW5kaW5nQm94PXIuY2xvbmUoKSk7Y29uc3Qgcz10LmJvdW5kaW5nU3BoZXJlO3JldHVybiBudWxsIT09cyYmKHRoaXMuYm91bmRpbmdTcGhlcmU9cy5jbG9uZSgpKSx0aGlzLmRyYXdSYW5nZS5zdGFydD10LmRyYXdSYW5nZS5zdGFydCx0aGlzLmRyYXdSYW5nZS5jb3VudD10LmRyYXdSYW5nZS5jb3VudCx0aGlzLnVzZXJEYXRhPXQudXNlckRhdGEsdGhpc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX1xcnQucHJvdG90eXBlLmlzQnVmZmVyR2VvbWV0cnk9ITA7Y29uc3QgWnJ0PW5ldyBCYXQsWHJ0PW5ldyBMYXQsS3J0PW5ldyBSYXQsSnJ0PW5ldyBjYXQsUXJ0PW5ldyBjYXQsJHJ0PW5ldyBjYXQsdHN0PW5ldyBjYXQsZXN0PW5ldyBjYXQsbnN0PW5ldyBjYXQsb3N0PW5ldyBjYXQsaXN0PW5ldyBjYXQsYXN0PW5ldyBjYXQscnN0PW5ldyBRaXQsc3N0PW5ldyBRaXQsbHN0PW5ldyBRaXQsY3N0PW5ldyBjYXQsZHN0PW5ldyBjYXQ7Y2xhc3MgcHN0IGV4dGVuZHMgcHJ0e2NvbnN0cnVjdG9yKHQ9bmV3IHFydCxlPW5ldyBBcnQpe3N1cGVyKCksdGhpcy50eXBlPSJNZXNoIix0aGlzLmdlb21ldHJ5PXQsdGhpcy5tYXRlcmlhbD1lLHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx2b2lkIDAhPT10Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyYmKHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPXQubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCkpLHZvaWQgMCE9PXQubW9ycGhUYXJnZXREaWN0aW9uYXJ5JiYodGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9T2JqZWN0LmFzc2lnbih7fSx0Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeSkpLHRoaXMubWF0ZXJpYWw9dC5tYXRlcmlhbCx0aGlzLmdlb21ldHJ5PXQuZ2VvbWV0cnksdGhpc311cGRhdGVNb3JwaFRhcmdldHMoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnk7aWYodC5pc0J1ZmZlckdlb21ldHJ5KXtjb25zdCBlPXQubW9ycGhBdHRyaWJ1dGVzLG49T2JqZWN0LmtleXMoZSk7aWYobi5sZW5ndGg+MCl7Y29uc3QgdD1lW25bMF1dO2lmKHZvaWQgMCE9PXQpe3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPVtdLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXt9O2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgbj10W2VdLm5hbWV8fFN0cmluZyhlKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W25dPWV9fX19ZWxzZXtjb25zdCBlPXQubW9ycGhUYXJnZXRzO3ZvaWQgMCE9PWUmJmUubGVuZ3RoPjAmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1lc2gudXBkYXRlTW9ycGhUYXJnZXRzKCkgbm8gbG9uZ2VyIHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKX19cmF5Y2FzdCh0LGUpe2NvbnN0IG49dGhpcy5nZW9tZXRyeSxvPXRoaXMubWF0ZXJpYWwsaT10aGlzLm1hdHJpeFdvcmxkO2lmKHZvaWQgMD09PW8pcmV0dXJuO2lmKG51bGw9PT1uLmJvdW5kaW5nU3BoZXJlJiZuLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLEtydC5jb3B5KG4uYm91bmRpbmdTcGhlcmUpLEtydC5hcHBseU1hdHJpeDQoaSksITE9PT10LnJheS5pbnRlcnNlY3RzU3BoZXJlKEtydCkpcmV0dXJuO2lmKFpydC5jb3B5KGkpLmludmVydCgpLFhydC5jb3B5KHQucmF5KS5hcHBseU1hdHJpeDQoWnJ0KSxudWxsIT09bi5ib3VuZGluZ0JveCYmITE9PT1YcnQuaW50ZXJzZWN0c0JveChuLmJvdW5kaW5nQm94KSlyZXR1cm47bGV0IGE7aWYobi5pc0J1ZmZlckdlb21ldHJ5KXtjb25zdCBpPW4uaW5kZXgscj1uLmF0dHJpYnV0ZXMucG9zaXRpb24scz1uLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixsPW4ubW9ycGhUYXJnZXRzUmVsYXRpdmUsYz1uLmF0dHJpYnV0ZXMudXYsZD1uLmF0dHJpYnV0ZXMudXYyLHA9bi5ncm91cHMsbT1uLmRyYXdSYW5nZTtpZihudWxsIT09aSlpZihBcnJheS5pc0FycmF5KG8pKWZvcihsZXQgbj0wLHU9cC5sZW5ndGg7bjx1O24rKyl7Y29uc3QgdT1wW25dLGY9b1t1Lm1hdGVyaWFsSW5kZXhdO2ZvcihsZXQgbj1NYXRoLm1heCh1LnN0YXJ0LG0uc3RhcnQpLG89TWF0aC5taW4odS5zdGFydCt1LmNvdW50LG0uc3RhcnQrbS5jb3VudCk7bjxvO24rPTMpe2NvbnN0IG89aS5nZXRYKG4pLHA9aS5nZXRYKG4rMSksbT1pLmdldFgobisyKTthPW1zdCh0aGlzLGYsdCxYcnQscixzLGwsYyxkLG8scCxtKSxhJiYoYS5mYWNlSW5kZXg9TWF0aC5mbG9vcihuLzMpLGEuZmFjZS5tYXRlcmlhbEluZGV4PXUubWF0ZXJpYWxJbmRleCxlLnB1c2goYSkpfX1lbHNlIGZvcihsZXQgbj1NYXRoLm1heCgwLG0uc3RhcnQpLHA9TWF0aC5taW4oaS5jb3VudCxtLnN0YXJ0K20uY291bnQpO248cDtuKz0zKXtjb25zdCBwPWkuZ2V0WChuKSxtPWkuZ2V0WChuKzEpLHU9aS5nZXRYKG4rMik7YT1tc3QodGhpcyxvLHQsWHJ0LHIscyxsLGMsZCxwLG0sdSksYSYmKGEuZmFjZUluZGV4PU1hdGguZmxvb3Iobi8zKSxlLnB1c2goYSkpfWVsc2UgaWYodm9pZCAwIT09cilpZihBcnJheS5pc0FycmF5KG8pKWZvcihsZXQgbj0wLGk9cC5sZW5ndGg7bjxpO24rKyl7Y29uc3QgaT1wW25dLHU9b1tpLm1hdGVyaWFsSW5kZXhdO2ZvcihsZXQgbj1NYXRoLm1heChpLnN0YXJ0LG0uc3RhcnQpLG89TWF0aC5taW4oaS5zdGFydCtpLmNvdW50LG0uc3RhcnQrbS5jb3VudCk7bjxvO24rPTMpYT1tc3QodGhpcyx1LHQsWHJ0LHIscyxsLGMsZCxuLG4rMSxuKzIpLGEmJihhLmZhY2VJbmRleD1NYXRoLmZsb29yKG4vMyksYS5mYWNlLm1hdGVyaWFsSW5kZXg9aS5tYXRlcmlhbEluZGV4LGUucHVzaChhKSl9ZWxzZSBmb3IobGV0IG49TWF0aC5tYXgoMCxtLnN0YXJ0KSxpPU1hdGgubWluKHIuY291bnQsbS5zdGFydCttLmNvdW50KTtuPGk7bis9MylhPW1zdCh0aGlzLG8sdCxYcnQscixzLGwsYyxkLG4sbisxLG4rMiksYSYmKGEuZmFjZUluZGV4PU1hdGguZmxvb3Iobi8zKSxlLnB1c2goYSkpfWVsc2Ugbi5pc0dlb21ldHJ5JiZjb25zb2xlLmVycm9yKCJUSFJFRS5NZXNoLnJheWNhc3QoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpfX1mdW5jdGlvbiBtc3QodCxlLG4sbyxpLGEscixzLGwsYyxkLHApe0pydC5mcm9tQnVmZmVyQXR0cmlidXRlKGksYyksUXJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUoaSxkKSwkcnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLHApO2NvbnN0IG09dC5tb3JwaFRhcmdldEluZmx1ZW5jZXM7aWYoYSYmbSl7b3N0LnNldCgwLDAsMCksaXN0LnNldCgwLDAsMCksYXN0LnNldCgwLDAsMCk7Zm9yKGxldCB0PTAsZT1hLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPW1bdF0sbj1hW3RdOzAhPT1lJiYodHN0LmZyb21CdWZmZXJBdHRyaWJ1dGUobixjKSxlc3QuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLGQpLG5zdC5mcm9tQnVmZmVyQXR0cmlidXRlKG4scCkscj8ob3N0LmFkZFNjYWxlZFZlY3Rvcih0c3QsZSksaXN0LmFkZFNjYWxlZFZlY3Rvcihlc3QsZSksYXN0LmFkZFNjYWxlZFZlY3Rvcihuc3QsZSkpOihvc3QuYWRkU2NhbGVkVmVjdG9yKHRzdC5zdWIoSnJ0KSxlKSxpc3QuYWRkU2NhbGVkVmVjdG9yKGVzdC5zdWIoUXJ0KSxlKSxhc3QuYWRkU2NhbGVkVmVjdG9yKG5zdC5zdWIoJHJ0KSxlKSkpfUpydC5hZGQob3N0KSxRcnQuYWRkKGlzdCksJHJ0LmFkZChhc3QpfXQuaXNTa2lubmVkTWVzaCYmKHQuYm9uZVRyYW5zZm9ybShjLEpydCksdC5ib25lVHJhbnNmb3JtKGQsUXJ0KSx0LmJvbmVUcmFuc2Zvcm0ocCwkcnQpKTtjb25zdCB1PShmdW5jdGlvbiBmKHQsZSxuLG8saSxhLHIscyl7bGV0IGw7aWYobD0xPT09ZS5zaWRlP28uaW50ZXJzZWN0VHJpYW5nbGUocixhLGksITAscyk6by5pbnRlcnNlY3RUcmlhbmdsZShpLGEsciwyIT09ZS5zaWRlLHMpLG51bGw9PT1sKXJldHVybiBudWxsO2RzdC5jb3B5KHMpLGRzdC5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCk7Y29uc3QgYz1uLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhkc3QpO3JldHVybiBjPG4ubmVhcnx8Yz5uLmZhcj9udWxsOntkaXN0YW5jZTpjLHBvaW50OmRzdC5jbG9uZSgpLG9iamVjdDp0fX0pKHQsZSxuLG8sSnJ0LFFydCwkcnQsY3N0KTtpZih1KXtzJiYocnN0LmZyb21CdWZmZXJBdHRyaWJ1dGUocyxjKSxzc3QuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLGQpLGxzdC5mcm9tQnVmZmVyQXR0cmlidXRlKHMscCksdS51dj12cnQuZ2V0VVYoY3N0LEpydCxRcnQsJHJ0LHJzdCxzc3QsbHN0LG5ldyBRaXQpKSxsJiYocnN0LmZyb21CdWZmZXJBdHRyaWJ1dGUobCxjKSxzc3QuZnJvbUJ1ZmZlckF0dHJpYnV0ZShsLGQpLGxzdC5mcm9tQnVmZmVyQXR0cmlidXRlKGwscCksdS51djI9dnJ0LmdldFVWKGNzdCxKcnQsUXJ0LCRydCxyc3Qsc3N0LGxzdCxuZXcgUWl0KSk7Y29uc3QgdD17YTpjLGI6ZCxjOnAsbm9ybWFsOm5ldyBjYXQsbWF0ZXJpYWxJbmRleDowfTt2cnQuZ2V0Tm9ybWFsKEpydCxRcnQsJHJ0LHQubm9ybWFsKSx1LmZhY2U9dH1yZXR1cm4gdX1wc3QucHJvdG90eXBlLmlzTWVzaD0hMDtjbGFzcyB1c3QgZXh0ZW5kcyBxcnR7Y29uc3RydWN0b3IodD0xLGU9MSxuPTEsbz0xLGk9MSxhPTEpe3N1cGVyKCksdGhpcy50eXBlPSJCb3hHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXt3aWR0aDp0LGhlaWdodDplLGRlcHRoOm4sd2lkdGhTZWdtZW50czpvLGhlaWdodFNlZ21lbnRzOmksZGVwdGhTZWdtZW50czphfTtjb25zdCByPXRoaXM7bz1NYXRoLmZsb29yKG8pLGk9TWF0aC5mbG9vcihpKSxhPU1hdGguZmxvb3IoYSk7Y29uc3Qgcz1bXSxsPVtdLGM9W10sZD1bXTtsZXQgcD0wLG09MDtmdW5jdGlvbiB1KHQsZSxuLG8saSxhLHUsZixnLGgsYil7Y29uc3QgeT1hL2csXz11L2gsQz1hLzIsTT11LzIsdj1mLzIseD1nKzEsTz1oKzE7bGV0IFA9MCx3PTA7Y29uc3Qgaz1uZXcgY2F0O2ZvcihsZXQgYT0wO2E8TzthKyspe2NvbnN0IHI9YSpfLU07Zm9yKGxldCBzPTA7czx4O3MrKylrW3RdPShzKnktQykqbyxrW2VdPXIqaSxrW25dPXYsbC5wdXNoKGsueCxrLnksay56KSxrW3RdPTAsa1tlXT0wLGtbbl09Zj4wPzE6LTEsYy5wdXNoKGsueCxrLnksay56KSxkLnB1c2gocy9nKSxkLnB1c2goMS1hL2gpLFArPTF9Zm9yKGxldCB0PTA7dDxoO3QrKylmb3IobGV0IGU9MDtlPGc7ZSsrKXtjb25zdCBuPXArZSt4Kih0KzEpLG89cCsoZSsxKSt4Kih0KzEpLGk9cCsoZSsxKSt4KnQ7cy5wdXNoKHArZSt4KnQsbixpKSxzLnB1c2gobixvLGkpLHcrPTZ9ci5hZGRHcm91cChtLHcsYiksbSs9dyxwKz1QfXUoInoiLCJ5IiwieCIsLTEsLTEsbixlLHQsYSxpLDApLHUoInoiLCJ5IiwieCIsMSwtMSxuLGUsLXQsYSxpLDEpLHUoIngiLCJ6IiwieSIsMSwxLHQsbixlLG8sYSwyKSx1KCJ4IiwieiIsInkiLDEsLTEsdCxuLC1lLG8sYSwzKSx1KCJ4IiwieSIsInoiLDEsLTEsdCxlLG4sbyxpLDQpLHUoIngiLCJ5IiwieiIsLTEsLTEsdCxlLC1uLG8saSw1KSx0aGlzLnNldEluZGV4KHMpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IEZydChsLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgRnJ0KGMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IEZydChkLDIpKX1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyB1c3QodC53aWR0aCx0LmhlaWdodCx0LmRlcHRoLHQud2lkdGhTZWdtZW50cyx0LmhlaWdodFNlZ21lbnRzLHQuZGVwdGhTZWdtZW50cyl9fWZ1bmN0aW9uIGZzdCh0KXtjb25zdCBlPXt9O2Zvcihjb25zdCBuIGluIHQpe2Vbbl09e307Zm9yKGNvbnN0IG8gaW4gdFtuXSl7Y29uc3QgaT10W25dW29dO2Vbbl1bb109aSYmKGkuaXNDb2xvcnx8aS5pc01hdHJpeDN8fGkuaXNNYXRyaXg0fHxpLmlzVmVjdG9yMnx8aS5pc1ZlY3RvcjN8fGkuaXNWZWN0b3I0fHxpLmlzVGV4dHVyZXx8aS5pc1F1YXRlcm5pb24pP2kuY2xvbmUoKTpBcnJheS5pc0FycmF5KGkpP2kuc2xpY2UoKTppfX1yZXR1cm4gZX1mdW5jdGlvbiBnc3QodCl7Y29uc3QgZT17fTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3Qgbz1mc3QodFtuXSk7Zm9yKGNvbnN0IHQgaW4gbyllW3RdPW9bdF19cmV0dXJuIGV9Y29uc3QgaHN0PXtjbG9uZTpmc3QsbWVyZ2U6Z3N0fTtjbGFzcyBic3QgZXh0ZW5kcyBPcnR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9IlNoYWRlck1hdGVyaWFsIix0aGlzLmRlZmluZXM9e30sdGhpcy51bmlmb3Jtcz17fSx0aGlzLnZlcnRleFNoYWRlcj0idm9pZCBtYWluKCkge1xuXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XG59Iix0aGlzLmZyYWdtZW50U2hhZGVyPSJ2b2lkIG1haW4oKSB7XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIDEuMCwgMC4wLCAwLjAsIDEuMCApO1xufSIsdGhpcy5saW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMuZm9nPSExLHRoaXMubGlnaHRzPSExLHRoaXMuY2xpcHBpbmc9ITEsdGhpcy5leHRlbnNpb25zPXtkZXJpdmF0aXZlczohMSxmcmFnRGVwdGg6ITEsZHJhd0J1ZmZlcnM6ITEsc2hhZGVyVGV4dHVyZUxPRDohMX0sdGhpcy5kZWZhdWx0QXR0cmlidXRlVmFsdWVzPXtjb2xvcjpbMSwxLDFdLHV2OlswLDBdLHV2MjpbMCwwXX0sdGhpcy5pbmRleDBBdHRyaWJ1dGVOYW1lPXZvaWQgMCx0aGlzLnVuaWZvcm1zTmVlZFVwZGF0ZT0hMSx0aGlzLmdsc2xWZXJzaW9uPW51bGwsdm9pZCAwIT09dCYmKHZvaWQgMCE9PXQuYXR0cmlidXRlcyYmY29uc29sZS5lcnJvcigiVEhSRUUuU2hhZGVyTWF0ZXJpYWw6IGF0dHJpYnV0ZXMgc2hvdWxkIG5vdyBiZSBkZWZpbmVkIGluIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIiksdGhpcy5zZXRWYWx1ZXModCkpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5mcmFnbWVudFNoYWRlcj10LmZyYWdtZW50U2hhZGVyLHRoaXMudmVydGV4U2hhZGVyPXQudmVydGV4U2hhZGVyLHRoaXMudW5pZm9ybXM9ZnN0KHQudW5pZm9ybXMpLHRoaXMuZGVmaW5lcz1PYmplY3QuYXNzaWduKHt9LHQuZGVmaW5lcyksdGhpcy53aXJlZnJhbWU9dC53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy5saWdodHM9dC5saWdodHMsdGhpcy5jbGlwcGluZz10LmNsaXBwaW5nLHRoaXMuZXh0ZW5zaW9ucz1PYmplY3QuYXNzaWduKHt9LHQuZXh0ZW5zaW9ucyksdGhpcy5nbHNsVmVyc2lvbj10Lmdsc2xWZXJzaW9uLHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO2UuZ2xzbFZlcnNpb249dGhpcy5nbHNsVmVyc2lvbixlLnVuaWZvcm1zPXt9O2Zvcihjb25zdCBuIGluIHRoaXMudW5pZm9ybXMpe2NvbnN0IG89dGhpcy51bmlmb3Jtc1tuXS52YWx1ZTtlLnVuaWZvcm1zW25dPW8mJm8uaXNUZXh0dXJlP3t0eXBlOiJ0Iix2YWx1ZTpvLnRvSlNPTih0KS51dWlkfTpvJiZvLmlzQ29sb3I/e3R5cGU6ImMiLHZhbHVlOm8uZ2V0SGV4KCl9Om8mJm8uaXNWZWN0b3IyP3t0eXBlOiJ2MiIsdmFsdWU6by50b0FycmF5KCl9Om8mJm8uaXNWZWN0b3IzP3t0eXBlOiJ2MyIsdmFsdWU6by50b0FycmF5KCl9Om8mJm8uaXNWZWN0b3I0P3t0eXBlOiJ2NCIsdmFsdWU6by50b0FycmF5KCl9Om8mJm8uaXNNYXRyaXgzP3t0eXBlOiJtMyIsdmFsdWU6by50b0FycmF5KCl9Om8mJm8uaXNNYXRyaXg0P3t0eXBlOiJtNCIsdmFsdWU6by50b0FycmF5KCl9Ont2YWx1ZTpvfX1PYmplY3Qua2V5cyh0aGlzLmRlZmluZXMpLmxlbmd0aD4wJiYoZS5kZWZpbmVzPXRoaXMuZGVmaW5lcyksZS52ZXJ0ZXhTaGFkZXI9dGhpcy52ZXJ0ZXhTaGFkZXIsZS5mcmFnbWVudFNoYWRlcj10aGlzLmZyYWdtZW50U2hhZGVyO2NvbnN0IG49e307Zm9yKGNvbnN0IHQgaW4gdGhpcy5leHRlbnNpb25zKSEwPT09dGhpcy5leHRlbnNpb25zW3RdJiYoblt0XT0hMCk7cmV0dXJuIE9iamVjdC5rZXlzKG4pLmxlbmd0aD4wJiYoZS5leHRlbnNpb25zPW4pLGV9fWJzdC5wcm90b3R5cGUuaXNTaGFkZXJNYXRlcmlhbD0hMDtjbGFzcyB5c3QgZXh0ZW5kcyBwcnR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudHlwZT0iQ2FtZXJhIix0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZT1uZXcgQmF0LHRoaXMucHJvamVjdGlvbk1hdHJpeD1uZXcgQmF0LHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2U9bmV3IEJhdH1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KHQubWF0cml4V29ybGRJbnZlcnNlKSx0aGlzLnByb2plY3Rpb25NYXRyaXguY29weSh0LnByb2plY3Rpb25NYXRyaXgpLHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSh0LnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKSx0aGlzfWdldFdvcmxkRGlyZWN0aW9uKHQpe3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpO2NvbnN0IGU9dGhpcy5tYXRyaXhXb3JsZC5lbGVtZW50cztyZXR1cm4gdC5zZXQoLWVbOF0sLWVbOV0sLWVbMTBdKS5ub3JtYWxpemUoKX11cGRhdGVNYXRyaXhXb3JsZCh0KXtzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KSx0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpfXVwZGF0ZVdvcmxkTWF0cml4KHQsZSl7c3VwZXIudXBkYXRlV29ybGRNYXRyaXgodCxlKSx0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfX15c3QucHJvdG90eXBlLmlzQ2FtZXJhPSEwO2NsYXNzIF9zdCBleHRlbmRzIHlzdHtjb25zdHJ1Y3Rvcih0PTUwLGU9MSxuPS4xLG89MmUzKXtzdXBlcigpLHRoaXMudHlwZT0iUGVyc3BlY3RpdmVDYW1lcmEiLHRoaXMuZm92PXQsdGhpcy56b29tPTEsdGhpcy5uZWFyPW4sdGhpcy5mYXI9byx0aGlzLmZvY3VzPTEwLHRoaXMuYXNwZWN0PWUsdGhpcy52aWV3PW51bGwsdGhpcy5maWxtR2F1Z2U9MzUsdGhpcy5maWxtT2Zmc2V0PTAsdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5mb3Y9dC5mb3YsdGhpcy56b29tPXQuem9vbSx0aGlzLm5lYXI9dC5uZWFyLHRoaXMuZmFyPXQuZmFyLHRoaXMuZm9jdXM9dC5mb2N1cyx0aGlzLmFzcGVjdD10LmFzcGVjdCx0aGlzLnZpZXc9bnVsbD09PXQudmlldz9udWxsOk9iamVjdC5hc3NpZ24oe30sdC52aWV3KSx0aGlzLmZpbG1HYXVnZT10LmZpbG1HYXVnZSx0aGlzLmZpbG1PZmZzZXQ9dC5maWxtT2Zmc2V0LHRoaXN9c2V0Rm9jYWxMZW5ndGgodCl7Y29uc3QgZT0uNSp0aGlzLmdldEZpbG1IZWlnaHQoKS90O3RoaXMuZm92PTIqWWl0Kk1hdGguYXRhbihlKSx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1nZXRGb2NhbExlbmd0aCgpe2NvbnN0IHQ9TWF0aC50YW4oLjUqV2l0KnRoaXMuZm92KTtyZXR1cm4uNSp0aGlzLmdldEZpbG1IZWlnaHQoKS90fWdldEVmZmVjdGl2ZUZPVigpe3JldHVybiAyKllpdCpNYXRoLmF0YW4oTWF0aC50YW4oLjUqV2l0KnRoaXMuZm92KS90aGlzLnpvb20pfWdldEZpbG1XaWR0aCgpe3JldHVybiB0aGlzLmZpbG1HYXVnZSpNYXRoLm1pbih0aGlzLmFzcGVjdCwxKX1nZXRGaWxtSGVpZ2h0KCl7cmV0dXJuIHRoaXMuZmlsbUdhdWdlL01hdGgubWF4KHRoaXMuYXNwZWN0LDEpfXNldFZpZXdPZmZzZXQodCxlLG4sbyxpLGEpe3RoaXMuYXNwZWN0PXQvZSxudWxsPT09dGhpcy52aWV3JiYodGhpcy52aWV3PXtlbmFibGVkOiEwLGZ1bGxXaWR0aDoxLGZ1bGxIZWlnaHQ6MSxvZmZzZXRYOjAsb2Zmc2V0WTowLHdpZHRoOjEsaGVpZ2h0OjF9KSx0aGlzLnZpZXcuZW5hYmxlZD0hMCx0aGlzLnZpZXcuZnVsbFdpZHRoPXQsdGhpcy52aWV3LmZ1bGxIZWlnaHQ9ZSx0aGlzLnZpZXcub2Zmc2V0WD1uLHRoaXMudmlldy5vZmZzZXRZPW8sdGhpcy52aWV3LndpZHRoPWksdGhpcy52aWV3LmhlaWdodD1hLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfWNsZWFyVmlld09mZnNldCgpe251bGwhPT10aGlzLnZpZXcmJih0aGlzLnZpZXcuZW5hYmxlZD0hMSksdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9dXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpe2NvbnN0IHQ9dGhpcy5uZWFyO2xldCBlPXQqTWF0aC50YW4oLjUqV2l0KnRoaXMuZm92KS90aGlzLnpvb20sbj0yKmUsbz10aGlzLmFzcGVjdCpuLGk9LS41Km87Y29uc3QgYT10aGlzLnZpZXc7aWYobnVsbCE9PXRoaXMudmlldyYmdGhpcy52aWV3LmVuYWJsZWQpe2NvbnN0IHQ9YS5mdWxsV2lkdGgscj1hLmZ1bGxIZWlnaHQ7aSs9YS5vZmZzZXRYKm8vdCxlLT1hLm9mZnNldFkqbi9yLG8qPWEud2lkdGgvdCxuKj1hLmhlaWdodC9yfWNvbnN0IHI9dGhpcy5maWxtT2Zmc2V0OzAhPT1yJiYoaSs9dCpyL3RoaXMuZ2V0RmlsbVdpZHRoKCkpLHRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUoaSxpK28sZSxlLW4sdCx0aGlzLmZhciksdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMucHJvamVjdGlvbk1hdHJpeCkuaW52ZXJ0KCl9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO3JldHVybiBlLm9iamVjdC5mb3Y9dGhpcy5mb3YsZS5vYmplY3Quem9vbT10aGlzLnpvb20sZS5vYmplY3QubmVhcj10aGlzLm5lYXIsZS5vYmplY3QuZmFyPXRoaXMuZmFyLGUub2JqZWN0LmZvY3VzPXRoaXMuZm9jdXMsZS5vYmplY3QuYXNwZWN0PXRoaXMuYXNwZWN0LG51bGwhPT10aGlzLnZpZXcmJihlLm9iamVjdC52aWV3PU9iamVjdC5hc3NpZ24oe30sdGhpcy52aWV3KSksZS5vYmplY3QuZmlsbUdhdWdlPXRoaXMuZmlsbUdhdWdlLGUub2JqZWN0LmZpbG1PZmZzZXQ9dGhpcy5maWxtT2Zmc2V0LGV9fV9zdC5wcm90b3R5cGUuaXNQZXJzcGVjdGl2ZUNhbWVyYT0hMDtjb25zdCBDc3Q9OTA7Y2xhc3MgTXN0IGV4dGVuZHMgcHJ0e2NvbnN0cnVjdG9yKHQsZSxuKXtpZihzdXBlcigpLHRoaXMudHlwZT0iQ3ViZUNhbWVyYSIsITAhPT1uLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0KXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkN1YmVDYW1lcmE6IFRoZSBjb25zdHJ1Y3RvciBub3cgZXhwZWN0cyBhbiBpbnN0YW5jZSBvZiBXZWJHTEN1YmVSZW5kZXJUYXJnZXQgYXMgdGhpcmQgcGFyYW1ldGVyLiIpO3RoaXMucmVuZGVyVGFyZ2V0PW47Y29uc3Qgbz1uZXcgX3N0KENzdCwxLHQsZSk7by5sYXllcnM9dGhpcy5sYXllcnMsby51cC5zZXQoMCwtMSwwKSxvLmxvb2tBdChuZXcgY2F0KDEsMCwwKSksdGhpcy5hZGQobyk7Y29uc3QgaT1uZXcgX3N0KENzdCwxLHQsZSk7aS5sYXllcnM9dGhpcy5sYXllcnMsaS51cC5zZXQoMCwtMSwwKSxpLmxvb2tBdChuZXcgY2F0KC0xLDAsMCkpLHRoaXMuYWRkKGkpO2NvbnN0IGE9bmV3IF9zdChDc3QsMSx0LGUpO2EubGF5ZXJzPXRoaXMubGF5ZXJzLGEudXAuc2V0KDAsMCwxKSxhLmxvb2tBdChuZXcgY2F0KDAsMSwwKSksdGhpcy5hZGQoYSk7Y29uc3Qgcj1uZXcgX3N0KENzdCwxLHQsZSk7ci5sYXllcnM9dGhpcy5sYXllcnMsci51cC5zZXQoMCwwLC0xKSxyLmxvb2tBdChuZXcgY2F0KDAsLTEsMCkpLHRoaXMuYWRkKHIpO2NvbnN0IHM9bmV3IF9zdChDc3QsMSx0LGUpO3MubGF5ZXJzPXRoaXMubGF5ZXJzLHMudXAuc2V0KDAsLTEsMCkscy5sb29rQXQobmV3IGNhdCgwLDAsMSkpLHRoaXMuYWRkKHMpO2NvbnN0IGw9bmV3IF9zdChDc3QsMSx0LGUpO2wubGF5ZXJzPXRoaXMubGF5ZXJzLGwudXAuc2V0KDAsLTEsMCksbC5sb29rQXQobmV3IGNhdCgwLDAsLTEpKSx0aGlzLmFkZChsKX11cGRhdGUodCxlKXtudWxsPT09dGhpcy5wYXJlbnQmJnRoaXMudXBkYXRlTWF0cml4V29ybGQoKTtjb25zdCBuPXRoaXMucmVuZGVyVGFyZ2V0LFtvLGksYSxyLHMsbF09dGhpcy5jaGlsZHJlbixjPXQueHIuZW5hYmxlZCxkPXQuZ2V0UmVuZGVyVGFyZ2V0KCk7dC54ci5lbmFibGVkPSExO2NvbnN0IHA9bi50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztuLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPSExLHQuc2V0UmVuZGVyVGFyZ2V0KG4sMCksdC5yZW5kZXIoZSxvKSx0LnNldFJlbmRlclRhcmdldChuLDEpLHQucmVuZGVyKGUsaSksdC5zZXRSZW5kZXJUYXJnZXQobiwyKSx0LnJlbmRlcihlLGEpLHQuc2V0UmVuZGVyVGFyZ2V0KG4sMyksdC5yZW5kZXIoZSxyKSx0LnNldFJlbmRlclRhcmdldChuLDQpLHQucmVuZGVyKGUscyksbi50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz1wLHQuc2V0UmVuZGVyVGFyZ2V0KG4sNSksdC5yZW5kZXIoZSxsKSx0LnNldFJlbmRlclRhcmdldChkKSx0LnhyLmVuYWJsZWQ9Y319Y2xhc3MgdnN0IGV4dGVuZHMgb2F0e2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIscyxsLGMpe3N1cGVyKHQ9dm9pZCAwIT09dD90OltdLGU9dm9pZCAwIT09ZT9lOmRpdCxuLG8saSxhLHI9dm9pZCAwIT09cj9yOlBpdCxzLGwsYyksdGhpcy5mbGlwWT0hMX1nZXQgaW1hZ2VzKCl7cmV0dXJuIHRoaXMuaW1hZ2V9c2V0IGltYWdlcyh0KXt0aGlzLmltYWdlPXR9fXZzdC5wcm90b3R5cGUuaXNDdWJlVGV4dHVyZT0hMDtjbGFzcyB4c3QgZXh0ZW5kcyByYXR7Y29uc3RydWN0b3IodCxlLG4pe051bWJlci5pc0ludGVnZXIoZSkmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMQ3ViZVJlbmRlclRhcmdldDogY29uc3RydWN0b3Igc2lnbmF0dXJlIGlzIG5vdyBXZWJHTEN1YmVSZW5kZXJUYXJnZXQoIHNpemUsIG9wdGlvbnMgKSIpLGU9biksc3VwZXIodCx0LGUpLHRoaXMudGV4dHVyZT1uZXcgdnN0KHZvaWQgMCwoZT1lfHx7fSkubWFwcGluZyxlLndyYXBTLGUud3JhcFQsZS5tYWdGaWx0ZXIsZS5taW5GaWx0ZXIsZS5mb3JtYXQsZS50eXBlLGUuYW5pc290cm9weSxlLmVuY29kaW5nKSx0aGlzLnRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSEwLHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9dm9pZCAwIT09ZS5nZW5lcmF0ZU1pcG1hcHMmJmUuZ2VuZXJhdGVNaXBtYXBzLHRoaXMudGV4dHVyZS5taW5GaWx0ZXI9dm9pZCAwIT09ZS5taW5GaWx0ZXI/ZS5taW5GaWx0ZXI6Yml0LHRoaXMudGV4dHVyZS5fbmVlZHNGbGlwRW52TWFwPSExfWZyb21FcXVpcmVjdGFuZ3VsYXJUZXh0dXJlKHQsZSl7dGhpcy50ZXh0dXJlLnR5cGU9ZS50eXBlLHRoaXMudGV4dHVyZS5mb3JtYXQ9d2l0LHRoaXMudGV4dHVyZS5lbmNvZGluZz1lLmVuY29kaW5nLHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9ZS5nZW5lcmF0ZU1pcG1hcHMsdGhpcy50ZXh0dXJlLm1pbkZpbHRlcj1lLm1pbkZpbHRlcix0aGlzLnRleHR1cmUubWFnRmlsdGVyPWUubWFnRmlsdGVyO2NvbnN0IG49bmV3IHVzdCg1LDUsNSksbz1uZXcgYnN0KHtuYW1lOiJDdWJlbWFwRnJvbUVxdWlyZWN0Iix1bmlmb3Jtczpmc3Qoe3RFcXVpcmVjdDp7dmFsdWU6bnVsbH19KSx2ZXJ0ZXhTaGFkZXI6IlxuXG5cdFx0XHRcdHZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG5cblx0XHRcdFx0dmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcblxuXHRcdFx0XHRcdHJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2b2lkIG1haW4oKSB7XG5cblx0XHRcdFx0XHR2V29ybGREaXJlY3Rpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApO1xuXG5cdFx0XHRcdFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0XHRcdFx0XHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cblx0XHRcdFx0fVxuXHRcdFx0IixmcmFnbWVudFNoYWRlcjoiXG5cblx0XHRcdFx0dW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0O1xuXG5cdFx0XHRcdHZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG5cblx0XHRcdFx0I2luY2x1ZGUgPGNvbW1vbj5cblxuXHRcdFx0XHR2b2lkIG1haW4oKSB7XG5cblx0XHRcdFx0XHR2ZWMzIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdldvcmxkRGlyZWN0aW9uICk7XG5cblx0XHRcdFx0XHR2ZWMyIHNhbXBsZVVWID0gZXF1aXJlY3RVdiggZGlyZWN0aW9uICk7XG5cblx0XHRcdFx0XHRnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTtcblxuXHRcdFx0XHR9XG5cdFx0XHQiLHNpZGU6MSxibGVuZGluZzowfSk7by51bmlmb3Jtcy50RXF1aXJlY3QudmFsdWU9ZTtjb25zdCBpPW5ldyBwc3QobixvKSxhPWUubWluRmlsdGVyO3JldHVybiBlLm1pbkZpbHRlcj09PXlpdCYmKGUubWluRmlsdGVyPWJpdCksbmV3IE1zdCgxLDEwLHRoaXMpLnVwZGF0ZSh0LGkpLGUubWluRmlsdGVyPWEsaS5nZW9tZXRyeS5kaXNwb3NlKCksaS5tYXRlcmlhbC5kaXNwb3NlKCksdGhpc31jbGVhcih0LGUsbixvKXtjb25zdCBpPXQuZ2V0UmVuZGVyVGFyZ2V0KCk7Zm9yKGxldCBpPTA7aTw2O2krKyl0LnNldFJlbmRlclRhcmdldCh0aGlzLGkpLHQuY2xlYXIoZSxuLG8pO3Quc2V0UmVuZGVyVGFyZ2V0KGkpfX14c3QucHJvdG90eXBlLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0PSEwO2NvbnN0IE9zdD1uZXcgY2F0LFBzdD1uZXcgY2F0LHdzdD1uZXcgJGl0O2NsYXNzIGtzdHtjb25zdHJ1Y3Rvcih0PW5ldyBjYXQoMSwwLDApLGU9MCl7dGhpcy5ub3JtYWw9dCx0aGlzLmNvbnN0YW50PWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodCksdGhpcy5jb25zdGFudD1lLHRoaXN9c2V0Q29tcG9uZW50cyh0LGUsbixvKXtyZXR1cm4gdGhpcy5ub3JtYWwuc2V0KHQsZSxuKSx0aGlzLmNvbnN0YW50PW8sdGhpc31zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQpLHRoaXMuY29uc3RhbnQ9LWUuZG90KHRoaXMubm9ybWFsKSx0aGlzfXNldEZyb21Db3BsYW5hclBvaW50cyh0LGUsbil7Y29uc3Qgbz1Pc3Quc3ViVmVjdG9ycyhuLGUpLmNyb3NzKFBzdC5zdWJWZWN0b3JzKHQsZSkpLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KG8sdCksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQubm9ybWFsKSx0aGlzLmNvbnN0YW50PXQuY29uc3RhbnQsdGhpc31ub3JtYWxpemUoKXtjb25zdCB0PTEvdGhpcy5ub3JtYWwubGVuZ3RoKCk7cmV0dXJuIHRoaXMubm9ybWFsLm11bHRpcGx5U2NhbGFyKHQpLHRoaXMuY29uc3RhbnQqPXQsdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy5jb25zdGFudCo9LTEsdGhpcy5ub3JtYWwubmVnYXRlKCksdGhpc31kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHRoaXMubm9ybWFsLmRvdCh0KSt0aGlzLmNvbnN0YW50fWRpc3RhbmNlVG9TcGhlcmUodCl7cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KHQuY2VudGVyKS10LnJhZGl1c31wcm9qZWN0UG9pbnQodCxlKXtyZXR1cm4gZS5jb3B5KHRoaXMubm9ybWFsKS5tdWx0aXBseVNjYWxhcigtdGhpcy5kaXN0YW5jZVRvUG9pbnQodCkpLmFkZCh0KX1pbnRlcnNlY3RMaW5lKHQsZSl7Y29uc3Qgbj10LmRlbHRhKE9zdCksbz10aGlzLm5vcm1hbC5kb3Qobik7aWYoMD09PW8pcmV0dXJuIDA9PT10aGlzLmRpc3RhbmNlVG9Qb2ludCh0LnN0YXJ0KT9lLmNvcHkodC5zdGFydCk6bnVsbDtjb25zdCBpPS0odC5zdGFydC5kb3QodGhpcy5ub3JtYWwpK3RoaXMuY29uc3RhbnQpL287cmV0dXJuIGk8MHx8aT4xP251bGw6ZS5jb3B5KG4pLm11bHRpcGx5U2NhbGFyKGkpLmFkZCh0LnN0YXJ0KX1pbnRlcnNlY3RzTGluZSh0KXtjb25zdCBlPXRoaXMuZGlzdGFuY2VUb1BvaW50KHQuc3RhcnQpLG49dGhpcy5kaXN0YW5jZVRvUG9pbnQodC5lbmQpO3JldHVybiBlPDAmJm4+MHx8bjwwJiZlPjB9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzUGxhbmUodGhpcyl9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzUGxhbmUodGhpcyl9Y29wbGFuYXJQb2ludCh0KXtyZXR1cm4gdC5jb3B5KHRoaXMubm9ybWFsKS5tdWx0aXBseVNjYWxhcigtdGhpcy5jb25zdGFudCl9YXBwbHlNYXRyaXg0KHQsZSl7Y29uc3Qgbj1lfHx3c3QuZ2V0Tm9ybWFsTWF0cml4KHQpLG89dGhpcy5jb3BsYW5hclBvaW50KE9zdCkuYXBwbHlNYXRyaXg0KHQpLGk9dGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKG4pLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLmNvbnN0YW50PS1vLmRvdChpKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jb25zdGFudC09dC5kb3QodGhpcy5ub3JtYWwpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpJiZ0LmNvbnN0YW50PT09dGhpcy5jb25zdGFudH1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19a3N0LnByb3RvdHlwZS5pc1BsYW5lPSEwO2NvbnN0IFNzdD1uZXcgUmF0LERzdD1uZXcgY2F0O2NsYXNzIEVzdHtjb25zdHJ1Y3Rvcih0PW5ldyBrc3QsZT1uZXcga3N0LG49bmV3IGtzdCxvPW5ldyBrc3QsaT1uZXcga3N0LGE9bmV3IGtzdCl7dGhpcy5wbGFuZXM9W3QsZSxuLG8saSxhXX1zZXQodCxlLG4sbyxpLGEpe2NvbnN0IHI9dGhpcy5wbGFuZXM7cmV0dXJuIHJbMF0uY29weSh0KSxyWzFdLmNvcHkoZSksclsyXS5jb3B5KG4pLHJbM10uY29weShvKSxyWzRdLmNvcHkoaSkscls1XS5jb3B5KGEpLHRoaXN9Y29weSh0KXtjb25zdCBlPXRoaXMucGxhbmVzO2ZvcihsZXQgbj0wO248NjtuKyspZVtuXS5jb3B5KHQucGxhbmVzW25dKTtyZXR1cm4gdGhpc31zZXRGcm9tUHJvamVjdGlvbk1hdHJpeCh0KXtjb25zdCBlPXRoaXMucGxhbmVzLG49dC5lbGVtZW50cyxvPW5bMF0saT1uWzFdLGE9blsyXSxyPW5bM10scz1uWzRdLGw9bls1XSxjPW5bNl0sZD1uWzddLHA9bls4XSxtPW5bOV0sdT1uWzEwXSxmPW5bMTFdLGc9blsxMl0saD1uWzEzXSxiPW5bMTRdLHk9blsxNV07cmV0dXJuIGVbMF0uc2V0Q29tcG9uZW50cyhyLW8sZC1zLGYtcCx5LWcpLm5vcm1hbGl6ZSgpLGVbMV0uc2V0Q29tcG9uZW50cyhyK28sZCtzLGYrcCx5K2cpLm5vcm1hbGl6ZSgpLGVbMl0uc2V0Q29tcG9uZW50cyhyK2ksZCtsLGYrbSx5K2gpLm5vcm1hbGl6ZSgpLGVbM10uc2V0Q29tcG9uZW50cyhyLWksZC1sLGYtbSx5LWgpLm5vcm1hbGl6ZSgpLGVbNF0uc2V0Q29tcG9uZW50cyhyLWEsZC1jLGYtdSx5LWIpLm5vcm1hbGl6ZSgpLGVbNV0uc2V0Q29tcG9uZW50cyhyK2EsZCtjLGYrdSx5K2IpLm5vcm1hbGl6ZSgpLHRoaXN9aW50ZXJzZWN0c09iamVjdCh0KXtjb25zdCBlPXQuZ2VvbWV0cnk7cmV0dXJuIG51bGw9PT1lLmJvdW5kaW5nU3BoZXJlJiZlLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLFNzdC5jb3B5KGUuYm91bmRpbmdTcGhlcmUpLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKSx0aGlzLmludGVyc2VjdHNTcGhlcmUoU3N0KX1pbnRlcnNlY3RzU3ByaXRlKHQpe3JldHVybiBTc3QuY2VudGVyLnNldCgwLDAsMCksU3N0LnJhZGl1cz0uNzA3MTA2NzgxMTg2NTQ3NixTc3QuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMuaW50ZXJzZWN0c1NwaGVyZShTc3QpfWludGVyc2VjdHNTcGhlcmUodCl7Y29uc3QgZT10aGlzLnBsYW5lcyxuPXQuY2VudGVyLG89LXQucmFkaXVzO2ZvcihsZXQgdD0wO3Q8Njt0KyspaWYoZVt0XS5kaXN0YW5jZVRvUG9pbnQobik8bylyZXR1cm4hMTtyZXR1cm4hMH1pbnRlcnNlY3RzQm94KHQpe2NvbnN0IGU9dGhpcy5wbGFuZXM7Zm9yKGxldCBuPTA7bjw2O24rKyl7Y29uc3Qgbz1lW25dO2lmKERzdC54PW8ubm9ybWFsLng+MD90Lm1heC54OnQubWluLngsRHN0Lnk9by5ub3JtYWwueT4wP3QubWF4Lnk6dC5taW4ueSxEc3Quej1vLm5vcm1hbC56PjA/dC5tYXguejp0Lm1pbi56LG8uZGlzdGFuY2VUb1BvaW50KERzdCk8MClyZXR1cm4hMX1yZXR1cm4hMH1jb250YWluc1BvaW50KHQpe2NvbnN0IGU9dGhpcy5wbGFuZXM7Zm9yKGxldCBuPTA7bjw2O24rKylpZihlW25dLmRpc3RhbmNlVG9Qb2ludCh0KTwwKXJldHVybiExO3JldHVybiEwfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfX1mdW5jdGlvbiBSc3QoKXtsZXQgdD1udWxsLGU9ITEsbj1udWxsLG89bnVsbDtmdW5jdGlvbiBpKGUsYSl7bihlLGEpLG89dC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaSl9cmV0dXJue3N0YXJ0OmZ1bmN0aW9uKCl7ITAhPT1lJiZudWxsIT09biYmKG89dC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaSksZT0hMCl9LHN0b3A6ZnVuY3Rpb24oKXt0LmNhbmNlbEFuaW1hdGlvbkZyYW1lKG8pLGU9ITF9LHNldEFuaW1hdGlvbkxvb3A6ZnVuY3Rpb24odCl7bj10fSxzZXRDb250ZXh0OmZ1bmN0aW9uKGUpe3Q9ZX19fWZ1bmN0aW9uIEFzdCh0LGUpe2NvbnN0IG49ZS5pc1dlYkdMMixvPW5ldyBXZWFrTWFwO3JldHVybntnZXQ6ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdC5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYodD10LmRhdGEpLG8uZ2V0KHQpfSxyZW1vdmU6ZnVuY3Rpb24gYShlKXtlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihlPWUuZGF0YSk7Y29uc3Qgbj1vLmdldChlKTtuJiYodC5kZWxldGVCdWZmZXIobi5idWZmZXIpLG8uZGVsZXRlKGUpKX0sdXBkYXRlOmZ1bmN0aW9uIHIoZSxpKXtpZihlLmlzR0xCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IHQ9by5nZXQoZSk7cmV0dXJuIHZvaWQoKCF0fHx0LnZlcnNpb248ZS52ZXJzaW9uKSYmby5zZXQoZSx7YnVmZmVyOmUuYnVmZmVyLHR5cGU6ZS50eXBlLGJ5dGVzUGVyRWxlbWVudDplLmVsZW1lbnRTaXplLHZlcnNpb246ZS52ZXJzaW9ufSkpfWUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKGU9ZS5kYXRhKTtjb25zdCBhPW8uZ2V0KGUpO3ZvaWQgMD09PWE/by5zZXQoZSwoZnVuY3Rpb24gcihlLG8pe2NvbnN0IGk9ZS5hcnJheSxhPWUudXNhZ2Uscj10LmNyZWF0ZUJ1ZmZlcigpO3QuYmluZEJ1ZmZlcihvLHIpLHQuYnVmZmVyRGF0YShvLGksYSksZS5vblVwbG9hZENhbGxiYWNrKCk7bGV0IHM9NTEyNjtyZXR1cm4gaSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheT9zPTUxMjY6aSBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheT9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMQXR0cmlidXRlczogVW5zdXBwb3J0ZWQgZGF0YSBidWZmZXIgZm9ybWF0OiBGbG9hdDY0QXJyYXkuIik6aSBpbnN0YW5jZW9mIFVpbnQxNkFycmF5P2UuaXNGbG9hdDE2QnVmZmVyQXR0cmlidXRlP24/cz01MTMxOmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xBdHRyaWJ1dGVzOiBVc2FnZSBvZiBGbG9hdDE2QnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIFdlYkdMMi4iKTpzPTUxMjM6aSBpbnN0YW5jZW9mIEludDE2QXJyYXk/cz01MTIyOmkgaW5zdGFuY2VvZiBVaW50MzJBcnJheT9zPTUxMjU6aSBpbnN0YW5jZW9mIEludDMyQXJyYXk/cz01MTI0OmkgaW5zdGFuY2VvZiBJbnQ4QXJyYXk/cz01MTIwOihpIGluc3RhbmNlb2YgVWludDhBcnJheXx8aSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSYmKHM9NTEyMSkse2J1ZmZlcjpyLHR5cGU6cyxieXRlc1BlckVsZW1lbnQ6aS5CWVRFU19QRVJfRUxFTUVOVCx2ZXJzaW9uOmUudmVyc2lvbn19KShlLGkpKTphLnZlcnNpb248ZS52ZXJzaW9uJiYoKGZ1bmN0aW9uIHMoZSxvLGkpe2NvbnN0IGE9by5hcnJheSxyPW8udXBkYXRlUmFuZ2U7dC5iaW5kQnVmZmVyKGksZSksLTE9PT1yLmNvdW50P3QuYnVmZmVyU3ViRGF0YShpLDAsYSk6KG4/dC5idWZmZXJTdWJEYXRhKGksci5vZmZzZXQqYS5CWVRFU19QRVJfRUxFTUVOVCxhLHIub2Zmc2V0LHIuY291bnQpOnQuYnVmZmVyU3ViRGF0YShpLHIub2Zmc2V0KmEuQllURVNfUEVSX0VMRU1FTlQsYS5zdWJhcnJheShyLm9mZnNldCxyLm9mZnNldCtyLmNvdW50KSksci5jb3VudD0tMSl9KShhLmJ1ZmZlcixlLGkpLGEudmVyc2lvbj1lLnZlcnNpb24pfX19Y2xhc3MgVHN0IGV4dGVuZHMgcXJ0e2NvbnN0cnVjdG9yKHQ9MSxlPTEsbj0xLG89MSl7c3VwZXIoKSx0aGlzLnR5cGU9IlBsYW5lR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17d2lkdGg6dCxoZWlnaHQ6ZSx3aWR0aFNlZ21lbnRzOm4saGVpZ2h0U2VnbWVudHM6b307Y29uc3QgaT10LzIsYT1lLzIscj1NYXRoLmZsb29yKG4pLHM9TWF0aC5mbG9vcihvKSxsPXIrMSxjPXMrMSxkPXQvcixwPWUvcyxtPVtdLHU9W10sZj1bXSxnPVtdO2ZvcihsZXQgdD0wO3Q8Yzt0Kyspe2NvbnN0IGU9dCpwLWE7Zm9yKGxldCBuPTA7bjxsO24rKyl1LnB1c2gobipkLWksLWUsMCksZi5wdXNoKDAsMCwxKSxnLnB1c2gobi9yKSxnLnB1c2goMS10L3MpfWZvcihsZXQgdD0wO3Q8czt0KyspZm9yKGxldCBlPTA7ZTxyO2UrKyl7Y29uc3Qgbj1lK2wqKHQrMSksbz1lKzErbCoodCsxKSxpPWUrMStsKnQ7bS5wdXNoKGUrbCp0LG4saSksbS5wdXNoKG4sbyxpKX10aGlzLnNldEluZGV4KG0pLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IEZydCh1LDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgRnJ0KGYsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IEZydChnLDIpKX1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBUc3QodC53aWR0aCx0LmhlaWdodCx0LndpZHRoU2VnbWVudHMsdC5oZWlnaHRTZWdtZW50cyl9fWNvbnN0IE5zdD17YWxwaGFtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQUxQSEFNQVBcblx0ZGlmZnVzZUNvbG9yLmEgKj0gdGV4dHVyZTJEKCBhbHBoYU1hcCwgdlV2ICkuZztcbiNlbmRpZiIsYWxwaGFtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9BTFBIQU1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBhbHBoYU1hcDtcbiNlbmRpZiIsYWxwaGF0ZXN0X2ZyYWdtZW50OiIjaWZkZWYgQUxQSEFURVNUXG5cdGlmICggZGlmZnVzZUNvbG9yLmEgPCBBTFBIQVRFU1QgKSBkaXNjYXJkO1xuI2VuZGlmIixhb21hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9BT01BUFxuXHRmbG9hdCBhbWJpZW50T2NjbHVzaW9uID0gKCB0ZXh0dXJlMkQoIGFvTWFwLCB2VXYyICkuciAtIDEuMCApICogYW9NYXBJbnRlbnNpdHkgKyAxLjA7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBhbWJpZW50T2NjbHVzaW9uO1xuXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFNUQU5EQVJEIClcblx0XHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciAqPSBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGRvdE5WLCBhbWJpZW50T2NjbHVzaW9uLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xuXHQjZW5kaWZcbiNlbmRpZiIsYW9tYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9BT01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBhb01hcDtcblx0dW5pZm9ybSBmbG9hdCBhb01hcEludGVuc2l0eTtcbiNlbmRpZiIsYmVnaW5fdmVydGV4OiJ2ZWMzIHRyYW5zZm9ybWVkID0gdmVjMyggcG9zaXRpb24gKTsiLGJlZ2lubm9ybWFsX3ZlcnRleDoidmVjMyBvYmplY3ROb3JtYWwgPSB2ZWMzKCBub3JtYWwgKTtcbiNpZmRlZiBVU0VfVEFOR0VOVFxuXHR2ZWMzIG9iamVjdFRhbmdlbnQgPSB2ZWMzKCB0YW5nZW50Lnh5eiApO1xuI2VuZGlmIixic2RmczoidmVjMiBpbnRlZ3JhdGVTcGVjdWxhckJSREYoIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGNvbnN0IHZlYzQgYzAgPSB2ZWM0KCAtIDEsIC0gMC4wMjc1LCAtIDAuNTcyLCAwLjAyMiApO1xuXHRjb25zdCB2ZWM0IGMxID0gdmVjNCggMSwgMC4wNDI1LCAxLjA0LCAtIDAuMDQgKTtcblx0dmVjNCByID0gcm91Z2huZXNzICogYzAgKyBjMTtcblx0ZmxvYXQgYTAwNCA9IG1pbiggci54ICogci54LCBleHAyKCAtIDkuMjggKiBkb3ROViApICkgKiByLnggKyByLnk7XG5cdHJldHVybiB2ZWMyKCAtMS4wNCwgMS4wNCApICogYTAwNCArIHIuenc7XG59XG5mbG9hdCBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBjb25zdCBpbiBmbG9hdCBsaWdodERpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBjdXRvZmZEaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgZGVjYXlFeHBvbmVudCApIHtcbiNpZiBkZWZpbmVkICggUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUyApXG5cdGZsb2F0IGRpc3RhbmNlRmFsbG9mZiA9IDEuMCAvIG1heCggcG93KCBsaWdodERpc3RhbmNlLCBkZWNheUV4cG9uZW50ICksIDAuMDEgKTtcblx0aWYoIGN1dG9mZkRpc3RhbmNlID4gMC4wICkge1xuXHRcdGRpc3RhbmNlRmFsbG9mZiAqPSBwb3cyKCBzYXR1cmF0ZSggMS4wIC0gcG93NCggbGlnaHREaXN0YW5jZSAvIGN1dG9mZkRpc3RhbmNlICkgKSApO1xuXHR9XG5cdHJldHVybiBkaXN0YW5jZUZhbGxvZmY7XG4jZWxzZVxuXHRpZiggY3V0b2ZmRGlzdGFuY2UgPiAwLjAgJiYgZGVjYXlFeHBvbmVudCA+IDAuMCApIHtcblx0XHRyZXR1cm4gcG93KCBzYXR1cmF0ZSggLWxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSArIDEuMCApLCBkZWNheUV4cG9uZW50ICk7XG5cdH1cblx0cmV0dXJuIDEuMDtcbiNlbmRpZlxufVxudmVjMyBCUkRGX0RpZmZ1c2VfTGFtYmVydCggY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IgKSB7XG5cdHJldHVybiBSRUNJUFJPQ0FMX1BJICogZGlmZnVzZUNvbG9yO1xufVxudmVjMyBGX1NjaGxpY2soIGNvbnN0IGluIHZlYzMgZjAsIGNvbnN0IGluIHZlYzMgZjkwLCBjb25zdCBpbiBmbG9hdCBkb3RWSCApIHtcblx0ZmxvYXQgZnJlc25lbCA9IGV4cDIoICggLTUuNTU0NzMgKiBkb3RWSCAtIDYuOTgzMTYgKSAqIGRvdFZIICk7XG5cdHJldHVybiAoIGY5MCAtIGYwICkgKiBmcmVzbmVsICsgZjA7XG59XG52ZWMzIEZfU2NobGlja19Sb3VnaG5lc3NEZXBlbmRlbnQoIGNvbnN0IGluIHZlYzMgRjAsIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGZyZXNuZWwgPSBleHAyKCAoIC01LjU1NDczICogZG90TlYgLSA2Ljk4MzE2ICkgKiBkb3ROViApO1xuXHR2ZWMzIEZyID0gbWF4KCB2ZWMzKCAxLjAgLSByb3VnaG5lc3MgKSwgRjAgKSAtIEYwO1xuXHRyZXR1cm4gRnIgKiBmcmVzbmVsICsgRjA7XG59XG5mbG9hdCBHX0dHWF9TbWl0aCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5MLCBjb25zdCBpbiBmbG9hdCBkb3ROViApIHtcblx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xuXHRmbG9hdCBnbCA9IGRvdE5MICsgc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XG5cdGZsb2F0IGd2ID0gZG90TlYgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcblx0cmV0dXJuIDEuMCAvICggZ2wgKiBndiApO1xufVxuZmxvYXQgR19HR1hfU21pdGhDb3JyZWxhdGVkKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xuXHRmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGd2ID0gZG90TkwgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcblx0ZmxvYXQgZ2wgPSBkb3ROViAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TkwgKSApO1xuXHRyZXR1cm4gMC41IC8gbWF4KCBndiArIGdsLCBFUFNJTE9OICk7XG59XG5mbG9hdCBEX0dHWCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkge1xuXHRmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGRlbm9tID0gcG93MiggZG90TkggKSAqICggYTIgLSAxLjAgKSArIDEuMDtcblx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBhMiAvIHBvdzIoIGRlbm9tICk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfR0dYKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGluY2lkZW50TGlnaHQsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgZjAsIGNvbnN0IGluIHZlYzMgZjkwLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGFscGhhID0gcG93Miggcm91Z2huZXNzICk7XG5cdHZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKyB2aWV3RGlyICk7XG5cdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTtcblx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApO1xuXHRmbG9hdCBkb3RMSCA9IHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcblx0dmVjMyBGID0gRl9TY2hsaWNrKCBmMCwgZjkwLCBkb3RMSCApO1xuXHRmbG9hdCBHID0gR19HR1hfU21pdGhDb3JyZWxhdGVkKCBhbHBoYSwgZG90TkwsIGRvdE5WICk7XG5cdGZsb2F0IEQgPSBEX0dHWCggYWxwaGEsIGRvdE5IICk7XG5cdHJldHVybiBGICogKCBHICogRCApO1xufVxudmVjMiBMVENfVXYoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGNvbnN0IGZsb2F0IExVVF9TSVpFID0gNjQuMDtcblx0Y29uc3QgZmxvYXQgTFVUX1NDQUxFID0gKCBMVVRfU0laRSAtIDEuMCApIC8gTFVUX1NJWkU7XG5cdGNvbnN0IGZsb2F0IExVVF9CSUFTID0gMC41IC8gTFVUX1NJWkU7XG5cdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggTiwgViApICk7XG5cdHZlYzIgdXYgPSB2ZWMyKCByb3VnaG5lc3MsIHNxcnQoIDEuMCAtIGRvdE5WICkgKTtcblx0dXYgPSB1diAqIExVVF9TQ0FMRSArIExVVF9CSUFTO1xuXHRyZXR1cm4gdXY7XG59XG5mbG9hdCBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgZiApIHtcblx0ZmxvYXQgbCA9IGxlbmd0aCggZiApO1xuXHRyZXR1cm4gbWF4KCAoIGwgKiBsICsgZi56ICkgLyAoIGwgKyAxLjAgKSwgMC4wICk7XG59XG52ZWMzIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyB2MSwgY29uc3QgaW4gdmVjMyB2MiApIHtcblx0ZmxvYXQgeCA9IGRvdCggdjEsIHYyICk7XG5cdGZsb2F0IHkgPSBhYnMoIHggKTtcblx0ZmxvYXQgYSA9IDAuODU0Mzk4NSArICggMC40OTY1MTU1ICsgMC4wMTQ1MjA2ICogeSApICogeTtcblx0ZmxvYXQgYiA9IDMuNDE3NTk0MCArICggNC4xNjE2NzI0ICsgeSApICogeTtcblx0ZmxvYXQgdiA9IGEgLyBiO1xuXHRmbG9hdCB0aGV0YV9zaW50aGV0YSA9ICggeCA+IDAuMCApID8gdiA6IDAuNSAqIGludmVyc2VzcXJ0KCBtYXgoIDEuMCAtIHggKiB4LCAxZS03ICkgKSAtIHY7XG5cdHJldHVybiBjcm9zcyggdjEsIHYyICkgKiB0aGV0YV9zaW50aGV0YTtcbn1cbnZlYzMgTFRDX0V2YWx1YXRlKCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gdmVjMyBQLCBjb25zdCBpbiBtYXQzIG1JbnYsIGNvbnN0IGluIHZlYzMgcmVjdENvb3Jkc1sgNCBdICkge1xuXHR2ZWMzIHYxID0gcmVjdENvb3Jkc1sgMSBdIC0gcmVjdENvb3Jkc1sgMCBdO1xuXHR2ZWMzIHYyID0gcmVjdENvb3Jkc1sgMyBdIC0gcmVjdENvb3Jkc1sgMCBdO1xuXHR2ZWMzIGxpZ2h0Tm9ybWFsID0gY3Jvc3MoIHYxLCB2MiApO1xuXHRpZiggZG90KCBsaWdodE5vcm1hbCwgUCAtIHJlY3RDb29yZHNbIDAgXSApIDwgMC4wICkgcmV0dXJuIHZlYzMoIDAuMCApO1xuXHR2ZWMzIFQxLCBUMjtcblx0VDEgPSBub3JtYWxpemUoIFYgLSBOICogZG90KCBWLCBOICkgKTtcblx0VDIgPSAtIGNyb3NzKCBOLCBUMSApO1xuXHRtYXQzIG1hdCA9IG1JbnYgKiB0cmFuc3Bvc2VNYXQzKCBtYXQzKCBUMSwgVDIsIE4gKSApO1xuXHR2ZWMzIGNvb3Jkc1sgNCBdO1xuXHRjb29yZHNbIDAgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMCBdIC0gUCApO1xuXHRjb29yZHNbIDEgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMSBdIC0gUCApO1xuXHRjb29yZHNbIDIgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMiBdIC0gUCApO1xuXHRjb29yZHNbIDMgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMyBdIC0gUCApO1xuXHRjb29yZHNbIDAgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAwIF0gKTtcblx0Y29vcmRzWyAxIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMSBdICk7XG5cdGNvb3Jkc1sgMiBdID0gbm9ybWFsaXplKCBjb29yZHNbIDIgXSApO1xuXHRjb29yZHNbIDMgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAzIF0gKTtcblx0dmVjMyB2ZWN0b3JGb3JtRmFjdG9yID0gdmVjMyggMC4wICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDAgXSwgY29vcmRzWyAxIF0gKTtcblx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMSBdLCBjb29yZHNbIDIgXSApO1xuXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAyIF0sIGNvb3Jkc1sgMyBdICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDMgXSwgY29vcmRzWyAwIF0gKTtcblx0ZmxvYXQgcmVzdWx0ID0gTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCB2ZWN0b3JGb3JtRmFjdG9yICk7XG5cdHJldHVybiB2ZWMzKCByZXN1bHQgKTtcbn1cbnZlYzMgQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7XG5cdHZlYzIgYnJkZiA9IGludGVncmF0ZVNwZWN1bGFyQlJERiggZG90TlYsIHJvdWdobmVzcyApO1xuXHRyZXR1cm4gc3BlY3VsYXJDb2xvciAqIGJyZGYueCArIGJyZGYueTtcbn1cbnZvaWQgQlJERl9TcGVjdWxhcl9NdWx0aXNjYXR0ZXJpbmdfRW52aXJvbm1lbnQoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBpbm91dCB2ZWMzIHNpbmdsZVNjYXR0ZXIsIGlub3V0IHZlYzMgbXVsdGlTY2F0dGVyICkge1xuXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdHZlYzMgRiA9IEZfU2NobGlja19Sb3VnaG5lc3NEZXBlbmRlbnQoIHNwZWN1bGFyQ29sb3IsIGRvdE5WLCByb3VnaG5lc3MgKTtcblx0dmVjMiBicmRmID0gaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBkb3ROViwgcm91Z2huZXNzICk7XG5cdHZlYzMgRnNzRXNzID0gRiAqIGJyZGYueCArIGJyZGYueTtcblx0ZmxvYXQgRXNzID0gYnJkZi54ICsgYnJkZi55O1xuXHRmbG9hdCBFbXMgPSAxLjAgLSBFc3M7XG5cdHZlYzMgRmF2ZyA9IHNwZWN1bGFyQ29sb3IgKyAoIDEuMCAtIHNwZWN1bGFyQ29sb3IgKSAqIDAuMDQ3NjE5O1x0dmVjMyBGbXMgPSBGc3NFc3MgKiBGYXZnIC8gKCAxLjAgLSBFbXMgKiBGYXZnICk7XG5cdHNpbmdsZVNjYXR0ZXIgKz0gRnNzRXNzO1xuXHRtdWx0aVNjYXR0ZXIgKz0gRm1zICogRW1zO1xufVxuZmxvYXQgR19CbGlublBob25nX0ltcGxpY2l0KCApIHtcblx0cmV0dXJuIDAuMjU7XG59XG5mbG9hdCBEX0JsaW5uUGhvbmcoIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7XG5cdHJldHVybiBSRUNJUFJPQ0FMX1BJICogKCBzaGluaW5lc3MgKiAwLjUgKyAxLjAgKSAqIHBvdyggZG90TkgsIHNoaW5pbmVzcyApO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MgKSB7XG5cdHZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKyBnZW9tZXRyeS52aWV3RGlyICk7XG5cdGZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoYWxmRGlyICkgKTtcblx0ZmxvYXQgZG90TEggPSBzYXR1cmF0ZSggZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRpciApICk7XG5cdHZlYzMgRiA9IEZfU2NobGljayggc3BlY3VsYXJDb2xvciwgdmVjMyggMS4wICksIGRvdExIICk7XG5cdGZsb2F0IEcgPSBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICk7XG5cdGZsb2F0IEQgPSBEX0JsaW5uUGhvbmcoIHNoaW5pbmVzcywgZG90TkggKTtcblx0cmV0dXJuIEYgKiAoIEcgKiBEICk7XG59XG5mbG9hdCBHR1hSb3VnaG5lc3NUb0JsaW5uRXhwb25lbnQoIGNvbnN0IGluIGZsb2F0IGdneFJvdWdobmVzcyApIHtcblx0cmV0dXJuICggMi4wIC8gcG93MiggZ2d4Um91Z2huZXNzICsgMC4wMDAxICkgLSAyLjAgKTtcbn1cbmZsb2F0IEJsaW5uRXhwb25lbnRUb0dHWFJvdWdobmVzcyggY29uc3QgaW4gZmxvYXQgYmxpbm5FeHBvbmVudCApIHtcblx0cmV0dXJuIHNxcnQoIDIuMCAvICggYmxpbm5FeHBvbmVudCArIDIuMCApICk7XG59XG4jaWYgZGVmaW5lZCggVVNFX1NIRUVOIClcbmZsb2F0IERfQ2hhcmxpZShmbG9hdCByb3VnaG5lc3MsIGZsb2F0IE5vSCkge1xuXHRmbG9hdCBpbnZBbHBoYSA9IDEuMCAvIHJvdWdobmVzcztcblx0ZmxvYXQgY29zMmggPSBOb0ggKiBOb0g7XG5cdGZsb2F0IHNpbjJoID0gbWF4KDEuMCAtIGNvczJoLCAwLjAwNzgxMjUpO1x0cmV0dXJuICgyLjAgKyBpbnZBbHBoYSkgKiBwb3coc2luMmgsIGludkFscGhhICogMC41KSAvICgyLjAgKiBQSSk7XG59XG5mbG9hdCBWX05ldWJlbHQoZmxvYXQgTm9WLCBmbG9hdCBOb0wpIHtcblx0cmV0dXJuIHNhdHVyYXRlKDEuMCAvICg0LjAgKiAoTm9MICsgTm9WIC0gTm9MICogTm9WKSkpO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX1NoZWVuKCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIHZlYzMgTCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgdmVjMyBzcGVjdWxhckNvbG9yICkge1xuXHR2ZWMzIE4gPSBnZW9tZXRyeS5ub3JtYWw7XG5cdHZlYzMgViA9IGdlb21ldHJ5LnZpZXdEaXI7XG5cdHZlYzMgSCA9IG5vcm1hbGl6ZSggViArIEwgKTtcblx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBOLCBIICkgKTtcblx0cmV0dXJuIHNwZWN1bGFyQ29sb3IgKiBEX0NoYXJsaWUoIHJvdWdobmVzcywgZG90TkggKSAqIFZfTmV1YmVsdCggZG90KE4sIFYpLCBkb3QoTiwgTCkgKTtcbn1cbiNlbmRpZiIsYnVtcG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0JVTVBNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgYnVtcE1hcDtcblx0dW5pZm9ybSBmbG9hdCBidW1wU2NhbGU7XG5cdHZlYzIgZEhkeHlfZndkKCkge1xuXHRcdHZlYzIgZFNUZHggPSBkRmR4KCB2VXYgKTtcblx0XHR2ZWMyIGRTVGR5ID0gZEZkeSggdlV2ICk7XG5cdFx0ZmxvYXQgSGxsID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKS54O1xuXHRcdGZsb2F0IGRCeCA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHggKS54IC0gSGxsO1xuXHRcdGZsb2F0IGRCeSA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHkgKS54IC0gSGxsO1xuXHRcdHJldHVybiB2ZWMyKCBkQngsIGRCeSApO1xuXHR9XG5cdHZlYzMgcGVydHVyYk5vcm1hbEFyYiggdmVjMyBzdXJmX3BvcywgdmVjMyBzdXJmX25vcm0sIHZlYzIgZEhkeHksIGZsb2F0IGZhY2VEaXJlY3Rpb24gKSB7XG5cdFx0dmVjMyB2U2lnbWFYID0gdmVjMyggZEZkeCggc3VyZl9wb3MueCApLCBkRmR4KCBzdXJmX3Bvcy55ICksIGRGZHgoIHN1cmZfcG9zLnogKSApO1xuXHRcdHZlYzMgdlNpZ21hWSA9IHZlYzMoIGRGZHkoIHN1cmZfcG9zLnggKSwgZEZkeSggc3VyZl9wb3MueSApLCBkRmR5KCBzdXJmX3Bvcy56ICkgKTtcblx0XHR2ZWMzIHZOID0gc3VyZl9ub3JtO1xuXHRcdHZlYzMgUjEgPSBjcm9zcyggdlNpZ21hWSwgdk4gKTtcblx0XHR2ZWMzIFIyID0gY3Jvc3MoIHZOLCB2U2lnbWFYICk7XG5cdFx0ZmxvYXQgZkRldCA9IGRvdCggdlNpZ21hWCwgUjEgKSAqIGZhY2VEaXJlY3Rpb247XG5cdFx0dmVjMyB2R3JhZCA9IHNpZ24oIGZEZXQgKSAqICggZEhkeHkueCAqIFIxICsgZEhkeHkueSAqIFIyICk7XG5cdFx0cmV0dXJuIG5vcm1hbGl6ZSggYWJzKCBmRGV0ICkgKiBzdXJmX25vcm0gLSB2R3JhZCApO1xuXHR9XG4jZW5kaWYiLGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudDoiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXG5cdHZlYzQgcGxhbmU7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkge1xuXHRcdHBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTtcblx0XHRpZiAoIGRvdCggdkNsaXBQb3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgZGlzY2FyZDtcblx0fVxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuXHQjaWYgVU5JT05fQ0xJUFBJTkdfUExBTkVTIDwgTlVNX0NMSVBQSU5HX1BMQU5FU1xuXHRcdGJvb2wgY2xpcHBlZCA9IHRydWU7XG5cdFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxuXHRcdGZvciAoIGludCBpID0gVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpIDwgTlVNX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHtcblx0XHRcdHBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTtcblx0XHRcdGNsaXBwZWQgPSAoIGRvdCggdkNsaXBQb3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgJiYgY2xpcHBlZDtcblx0XHR9XG5cdFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcblx0XHRpZiAoIGNsaXBwZWQgKSBkaXNjYXJkO1xuXHQjZW5kaWZcbiNlbmRpZiIsY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMFxuXHR2YXJ5aW5nIHZlYzMgdkNsaXBQb3NpdGlvbjtcblx0dW5pZm9ybSB2ZWM0IGNsaXBwaW5nUGxhbmVzWyBOVU1fQ0xJUFBJTkdfUExBTkVTIF07XG4jZW5kaWYiLGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleDoiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXG5cdHZhcnlpbmcgdmVjMyB2Q2xpcFBvc2l0aW9uO1xuI2VuZGlmIixjbGlwcGluZ19wbGFuZXNfdmVydGV4OiIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcblx0dkNsaXBQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XG4jZW5kaWYiLGNvbG9yX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBIClcblx0ZGlmZnVzZUNvbG9yICo9IHZDb2xvcjtcbiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApXG5cdGRpZmZ1c2VDb2xvci5yZ2IgKj0gdkNvbG9yO1xuI2VuZGlmIixjb2xvcl9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBIClcblx0dmFyeWluZyB2ZWM0IHZDb2xvcjtcbiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApXG5cdHZhcnlpbmcgdmVjMyB2Q29sb3I7XG4jZW5kaWYiLGNvbG9yX3BhcnNfdmVydGV4OiIjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBIClcblx0dmFyeWluZyB2ZWM0IHZDb2xvcjtcbiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApIHx8IGRlZmluZWQoIFVTRV9JTlNUQU5DSU5HX0NPTE9SIClcblx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcbiNlbmRpZiIsY29sb3JfdmVydGV4OiIjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBIClcblx0dkNvbG9yID0gdmVjNCggMS4wICk7XG4jZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKSB8fCBkZWZpbmVkKCBVU0VfSU5TVEFOQ0lOR19DT0xPUiApXG5cdHZDb2xvciA9IHZlYzMoIDEuMCApO1xuI2VuZGlmXG4jaWZkZWYgVVNFX0NPTE9SXG5cdHZDb2xvciAqPSBjb2xvcjtcbiNlbmRpZlxuI2lmZGVmIFVTRV9JTlNUQU5DSU5HX0NPTE9SXG5cdHZDb2xvci54eXogKj0gaW5zdGFuY2VDb2xvci54eXo7XG4jZW5kaWYiLGNvbW1vbjoiI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5M1xuI2RlZmluZSBQSTIgNi4yODMxODUzMDcxNzk1ODZcbiNkZWZpbmUgUElfSEFMRiAxLjU3MDc5NjMyNjc5NDg5NjZcbiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NjE4Mzc5MDdcbiNkZWZpbmUgUkVDSVBST0NBTF9QSTIgMC4xNTkxNTQ5NDMwOTE4OTUzNVxuI2RlZmluZSBFUFNJTE9OIDFlLTZcbiNpZm5kZWYgc2F0dXJhdGVcbiNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcbiNlbmRpZlxuI2RlZmluZSB3aGl0ZUNvbXBsZW1lbnQoYSkgKCAxLjAgLSBzYXR1cmF0ZSggYSApIClcbmZsb2F0IHBvdzIoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4Kng7IH1cbmZsb2F0IHBvdzMoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4KngqeDsgfVxuZmxvYXQgcG93NCggY29uc3QgaW4gZmxvYXQgeCApIHsgZmxvYXQgeDIgPSB4Kng7IHJldHVybiB4Mip4MjsgfVxuZmxvYXQgYXZlcmFnZSggY29uc3QgaW4gdmVjMyBjb2xvciApIHsgcmV0dXJuIGRvdCggY29sb3IsIHZlYzMoIDAuMzMzMyApICk7IH1cbmhpZ2hwIGZsb2F0IHJhbmQoIGNvbnN0IGluIHZlYzIgdXYgKSB7XG5cdGNvbnN0IGhpZ2hwIGZsb2F0IGEgPSAxMi45ODk4LCBiID0gNzguMjMzLCBjID0gNDM3NTguNTQ1Mztcblx0aGlnaHAgZmxvYXQgZHQgPSBkb3QoIHV2Lnh5LCB2ZWMyKCBhLGIgKSApLCBzbiA9IG1vZCggZHQsIFBJICk7XG5cdHJldHVybiBmcmFjdChzaW4oc24pICogYyk7XG59XG4jaWZkZWYgSElHSF9QUkVDSVNJT05cblx0ZmxvYXQgcHJlY2lzaW9uU2FmZUxlbmd0aCggdmVjMyB2ICkgeyByZXR1cm4gbGVuZ3RoKCB2ICk7IH1cbiNlbHNlXG5cdGZsb2F0IG1heDMoIHZlYzMgdiApIHsgcmV0dXJuIG1heCggbWF4KCB2LngsIHYueSApLCB2LnogKTsgfVxuXHRmbG9hdCBwcmVjaXNpb25TYWZlTGVuZ3RoKCB2ZWMzIHYgKSB7XG5cdFx0ZmxvYXQgbWF4Q29tcG9uZW50ID0gbWF4MyggYWJzKCB2ICkgKTtcblx0XHRyZXR1cm4gbGVuZ3RoKCB2IC8gbWF4Q29tcG9uZW50ICkgKiBtYXhDb21wb25lbnQ7XG5cdH1cbiNlbmRpZlxuc3RydWN0IEluY2lkZW50TGlnaHQge1xuXHR2ZWMzIGNvbG9yO1xuXHR2ZWMzIGRpcmVjdGlvbjtcblx0Ym9vbCB2aXNpYmxlO1xufTtcbnN0cnVjdCBSZWZsZWN0ZWRMaWdodCB7XG5cdHZlYzMgZGlyZWN0RGlmZnVzZTtcblx0dmVjMyBkaXJlY3RTcGVjdWxhcjtcblx0dmVjMyBpbmRpcmVjdERpZmZ1c2U7XG5cdHZlYzMgaW5kaXJlY3RTcGVjdWxhcjtcbn07XG5zdHJ1Y3QgR2VvbWV0cmljQ29udGV4dCB7XG5cdHZlYzMgcG9zaXRpb247XG5cdHZlYzMgbm9ybWFsO1xuXHR2ZWMzIHZpZXdEaXI7XG4jaWZkZWYgQ0xFQVJDT0FUXG5cdHZlYzMgY2xlYXJjb2F0Tm9ybWFsO1xuI2VuZGlmXG59O1xudmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcblx0cmV0dXJuIG5vcm1hbGl6ZSggKCBtYXRyaXggKiB2ZWM0KCBkaXIsIDAuMCApICkueHl6ICk7XG59XG52ZWMzIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcblx0cmV0dXJuIG5vcm1hbGl6ZSggKCB2ZWM0KCBkaXIsIDAuMCApICogbWF0cml4ICkueHl6ICk7XG59XG52ZWMzIHByb2plY3RPblBsYW5lKGluIHZlYzMgcG9pbnQsIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xuXHRmbG9hdCBkaXN0YW5jZSA9IGRvdCggcGxhbmVOb3JtYWwsIHBvaW50IC0gcG9pbnRPblBsYW5lICk7XG5cdHJldHVybiAtIGRpc3RhbmNlICogcGxhbmVOb3JtYWwgKyBwb2ludDtcbn1cbmZsb2F0IHNpZGVPZlBsYW5lKCBpbiB2ZWMzIHBvaW50LCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcblx0cmV0dXJuIHNpZ24oIGRvdCggcG9pbnQgLSBwb2ludE9uUGxhbmUsIHBsYW5lTm9ybWFsICkgKTtcbn1cbnZlYzMgbGluZVBsYW5lSW50ZXJzZWN0KCBpbiB2ZWMzIHBvaW50T25MaW5lLCBpbiB2ZWMzIGxpbmVEaXJlY3Rpb24sIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xuXHRyZXR1cm4gbGluZURpcmVjdGlvbiAqICggZG90KCBwbGFuZU5vcm1hbCwgcG9pbnRPblBsYW5lIC0gcG9pbnRPbkxpbmUgKSAvIGRvdCggcGxhbmVOb3JtYWwsIGxpbmVEaXJlY3Rpb24gKSApICsgcG9pbnRPbkxpbmU7XG59XG5tYXQzIHRyYW5zcG9zZU1hdDMoIGNvbnN0IGluIG1hdDMgbSApIHtcblx0bWF0MyB0bXA7XG5cdHRtcFsgMCBdID0gdmVjMyggbVsgMCBdLngsIG1bIDEgXS54LCBtWyAyIF0ueCApO1xuXHR0bXBbIDEgXSA9IHZlYzMoIG1bIDAgXS55LCBtWyAxIF0ueSwgbVsgMiBdLnkgKTtcblx0dG1wWyAyIF0gPSB2ZWMzKCBtWyAwIF0ueiwgbVsgMSBdLnosIG1bIDIgXS56ICk7XG5cdHJldHVybiB0bXA7XG59XG5mbG9hdCBsaW5lYXJUb1JlbGF0aXZlTHVtaW5hbmNlKCBjb25zdCBpbiB2ZWMzIGNvbG9yICkge1xuXHR2ZWMzIHdlaWdodHMgPSB2ZWMzKCAwLjIxMjYsIDAuNzE1MiwgMC4wNzIyICk7XG5cdHJldHVybiBkb3QoIHdlaWdodHMsIGNvbG9yLnJnYiApO1xufVxuYm9vbCBpc1BlcnNwZWN0aXZlTWF0cml4KCBtYXQ0IG0gKSB7XG5cdHJldHVybiBtWyAyIF1bIDMgXSA9PSAtIDEuMDtcbn1cbnZlYzIgZXF1aXJlY3RVdiggaW4gdmVjMyBkaXIgKSB7XG5cdGZsb2F0IHUgPSBhdGFuKCBkaXIueiwgZGlyLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xuXHRmbG9hdCB2ID0gYXNpbiggY2xhbXAoIGRpci55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdHJldHVybiB2ZWMyKCB1LCB2ICk7XG59IixjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ6IiNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWXG5cdCNkZWZpbmUgY3ViZVVWX21heE1pcExldmVsIDguMFxuXHQjZGVmaW5lIGN1YmVVVl9taW5NaXBMZXZlbCA0LjBcblx0I2RlZmluZSBjdWJlVVZfbWF4VGlsZVNpemUgMjU2LjBcblx0I2RlZmluZSBjdWJlVVZfbWluVGlsZVNpemUgMTYuMFxuXHRmbG9hdCBnZXRGYWNlKCB2ZWMzIGRpcmVjdGlvbiApIHtcblx0XHR2ZWMzIGFic0RpcmVjdGlvbiA9IGFicyggZGlyZWN0aW9uICk7XG5cdFx0ZmxvYXQgZmFjZSA9IC0gMS4wO1xuXHRcdGlmICggYWJzRGlyZWN0aW9uLnggPiBhYnNEaXJlY3Rpb24ueiApIHtcblx0XHRcdGlmICggYWJzRGlyZWN0aW9uLnggPiBhYnNEaXJlY3Rpb24ueSApXG5cdFx0XHRcdGZhY2UgPSBkaXJlY3Rpb24ueCA+IDAuMCA/IDAuMCA6IDMuMDtcblx0XHRcdGVsc2Vcblx0XHRcdFx0ZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMS4wIDogNC4wO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIGFic0RpcmVjdGlvbi56ID4gYWJzRGlyZWN0aW9uLnkgKVxuXHRcdFx0XHRmYWNlID0gZGlyZWN0aW9uLnogPiAwLjAgPyAyLjAgOiA1LjA7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdGZhY2UgPSBkaXJlY3Rpb24ueSA+IDAuMCA/IDEuMCA6IDQuMDtcblx0XHR9XG5cdFx0cmV0dXJuIGZhY2U7XG5cdH1cblx0dmVjMiBnZXRVViggdmVjMyBkaXJlY3Rpb24sIGZsb2F0IGZhY2UgKSB7XG5cdFx0dmVjMiB1djtcblx0XHRpZiAoIGZhY2UgPT0gMC4wICkge1xuXHRcdFx0dXYgPSB2ZWMyKCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnggKTtcblx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDEuMCApIHtcblx0XHRcdHV2ID0gdmVjMiggLSBkaXJlY3Rpb24ueCwgLSBkaXJlY3Rpb24ueiApIC8gYWJzKCBkaXJlY3Rpb24ueSApO1xuXHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMi4wICkge1xuXHRcdFx0dXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueiApO1xuXHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMy4wICkge1xuXHRcdFx0dXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueCApO1xuXHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gNC4wICkge1xuXHRcdFx0dXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueiApIC8gYWJzKCBkaXJlY3Rpb24ueSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR1diA9IHZlYzIoIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueiApO1xuXHRcdH1cblx0XHRyZXR1cm4gMC41ICogKCB1diArIDEuMCApO1xuXHR9XG5cdHZlYzMgYmlsaW5lYXJDdWJlVVYoIHNhbXBsZXIyRCBlbnZNYXAsIHZlYzMgZGlyZWN0aW9uLCBmbG9hdCBtaXBJbnQgKSB7XG5cdFx0ZmxvYXQgZmFjZSA9IGdldEZhY2UoIGRpcmVjdGlvbiApO1xuXHRcdGZsb2F0IGZpbHRlckludCA9IG1heCggY3ViZVVWX21pbk1pcExldmVsIC0gbWlwSW50LCAwLjAgKTtcblx0XHRtaXBJbnQgPSBtYXgoIG1pcEludCwgY3ViZVVWX21pbk1pcExldmVsICk7XG5cdFx0ZmxvYXQgZmFjZVNpemUgPSBleHAyKCBtaXBJbnQgKTtcblx0XHRmbG9hdCB0ZXhlbFNpemUgPSAxLjAgLyAoIDMuMCAqIGN1YmVVVl9tYXhUaWxlU2l6ZSApO1xuXHRcdHZlYzIgdXYgPSBnZXRVViggZGlyZWN0aW9uLCBmYWNlICkgKiAoIGZhY2VTaXplIC0gMS4wICk7XG5cdFx0dmVjMiBmID0gZnJhY3QoIHV2ICk7XG5cdFx0dXYgKz0gMC41IC0gZjtcblx0XHRpZiAoIGZhY2UgPiAyLjAgKSB7XG5cdFx0XHR1di55ICs9IGZhY2VTaXplO1xuXHRcdFx0ZmFjZSAtPSAzLjA7XG5cdFx0fVxuXHRcdHV2LnggKz0gZmFjZSAqIGZhY2VTaXplO1xuXHRcdGlmICggbWlwSW50IDwgY3ViZVVWX21heE1pcExldmVsICkge1xuXHRcdFx0dXYueSArPSAyLjAgKiBjdWJlVVZfbWF4VGlsZVNpemU7XG5cdFx0fVxuXHRcdHV2LnkgKz0gZmlsdGVySW50ICogMi4wICogY3ViZVVWX21pblRpbGVTaXplO1xuXHRcdHV2LnggKz0gMy4wICogbWF4KCAwLjAsIGN1YmVVVl9tYXhUaWxlU2l6ZSAtIDIuMCAqIGZhY2VTaXplICk7XG5cdFx0dXYgKj0gdGV4ZWxTaXplO1xuXHRcdHZlYzMgdGwgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCB0ZXh0dXJlMkQoIGVudk1hcCwgdXYgKSApLnJnYjtcblx0XHR1di54ICs9IHRleGVsU2l6ZTtcblx0XHR2ZWMzIHRyID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEKCBlbnZNYXAsIHV2ICkgKS5yZ2I7XG5cdFx0dXYueSArPSB0ZXhlbFNpemU7XG5cdFx0dmVjMyBiciA9IGVudk1hcFRleGVsVG9MaW5lYXIoIHRleHR1cmUyRCggZW52TWFwLCB1diApICkucmdiO1xuXHRcdHV2LnggLT0gdGV4ZWxTaXplO1xuXHRcdHZlYzMgYmwgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCB0ZXh0dXJlMkQoIGVudk1hcCwgdXYgKSApLnJnYjtcblx0XHR2ZWMzIHRtID0gbWl4KCB0bCwgdHIsIGYueCApO1xuXHRcdHZlYzMgYm0gPSBtaXgoIGJsLCBiciwgZi54ICk7XG5cdFx0cmV0dXJuIG1peCggdG0sIGJtLCBmLnkgKTtcblx0fVxuXHQjZGVmaW5lIHIwIDEuMFxuXHQjZGVmaW5lIHYwIDAuMzM5XG5cdCNkZWZpbmUgbTAgLSAyLjBcblx0I2RlZmluZSByMSAwLjhcblx0I2RlZmluZSB2MSAwLjI3NlxuXHQjZGVmaW5lIG0xIC0gMS4wXG5cdCNkZWZpbmUgcjQgMC40XG5cdCNkZWZpbmUgdjQgMC4wNDZcblx0I2RlZmluZSBtNCAyLjBcblx0I2RlZmluZSByNSAwLjMwNVxuXHQjZGVmaW5lIHY1IDAuMDE2XG5cdCNkZWZpbmUgbTUgMy4wXG5cdCNkZWZpbmUgcjYgMC4yMVxuXHQjZGVmaW5lIHY2IDAuMDAzOFxuXHQjZGVmaW5lIG02IDQuMFxuXHRmbG9hdCByb3VnaG5lc3NUb01pcCggZmxvYXQgcm91Z2huZXNzICkge1xuXHRcdGZsb2F0IG1pcCA9IDAuMDtcblx0XHRpZiAoIHJvdWdobmVzcyA+PSByMSApIHtcblx0XHRcdG1pcCA9ICggcjAgLSByb3VnaG5lc3MgKSAqICggbTEgLSBtMCApIC8gKCByMCAtIHIxICkgKyBtMDtcblx0XHR9IGVsc2UgaWYgKCByb3VnaG5lc3MgPj0gcjQgKSB7XG5cdFx0XHRtaXAgPSAoIHIxIC0gcm91Z2huZXNzICkgKiAoIG00IC0gbTEgKSAvICggcjEgLSByNCApICsgbTE7XG5cdFx0fSBlbHNlIGlmICggcm91Z2huZXNzID49IHI1ICkge1xuXHRcdFx0bWlwID0gKCByNCAtIHJvdWdobmVzcyApICogKCBtNSAtIG00ICkgLyAoIHI0IC0gcjUgKSArIG00O1xuXHRcdH0gZWxzZSBpZiAoIHJvdWdobmVzcyA+PSByNiApIHtcblx0XHRcdG1pcCA9ICggcjUgLSByb3VnaG5lc3MgKSAqICggbTYgLSBtNSApIC8gKCByNSAtIHI2ICkgKyBtNTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWlwID0gLSAyLjAgKiBsb2cyKCAxLjE2ICogcm91Z2huZXNzICk7XHRcdH1cblx0XHRyZXR1cm4gbWlwO1xuXHR9XG5cdHZlYzQgdGV4dHVyZUN1YmVVViggc2FtcGxlcjJEIGVudk1hcCwgdmVjMyBzYW1wbGVEaXIsIGZsb2F0IHJvdWdobmVzcyApIHtcblx0XHRmbG9hdCBtaXAgPSBjbGFtcCggcm91Z2huZXNzVG9NaXAoIHJvdWdobmVzcyApLCBtMCwgY3ViZVVWX21heE1pcExldmVsICk7XG5cdFx0ZmxvYXQgbWlwRiA9IGZyYWN0KCBtaXAgKTtcblx0XHRmbG9hdCBtaXBJbnQgPSBmbG9vciggbWlwICk7XG5cdFx0dmVjMyBjb2xvcjAgPSBiaWxpbmVhckN1YmVVViggZW52TWFwLCBzYW1wbGVEaXIsIG1pcEludCApO1xuXHRcdGlmICggbWlwRiA9PSAwLjAgKSB7XG5cdFx0XHRyZXR1cm4gdmVjNCggY29sb3IwLCAxLjAgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmVjMyBjb2xvcjEgPSBiaWxpbmVhckN1YmVVViggZW52TWFwLCBzYW1wbGVEaXIsIG1pcEludCArIDEuMCApO1xuXHRcdFx0cmV0dXJuIHZlYzQoIG1peCggY29sb3IwLCBjb2xvcjEsIG1pcEYgKSwgMS4wICk7XG5cdFx0fVxuXHR9XG4jZW5kaWYiLGRlZmF1bHRub3JtYWxfdmVydGV4OiJ2ZWMzIHRyYW5zZm9ybWVkTm9ybWFsID0gb2JqZWN0Tm9ybWFsO1xuI2lmZGVmIFVTRV9JTlNUQU5DSU5HXG5cdG1hdDMgbSA9IG1hdDMoIGluc3RhbmNlTWF0cml4ICk7XG5cdHRyYW5zZm9ybWVkTm9ybWFsIC89IHZlYzMoIGRvdCggbVsgMCBdLCBtWyAwIF0gKSwgZG90KCBtWyAxIF0sIG1bIDEgXSApLCBkb3QoIG1bIDIgXSwgbVsgMiBdICkgKTtcblx0dHJhbnNmb3JtZWROb3JtYWwgPSBtICogdHJhbnNmb3JtZWROb3JtYWw7XG4jZW5kaWZcbnRyYW5zZm9ybWVkTm9ybWFsID0gbm9ybWFsTWF0cml4ICogdHJhbnNmb3JtZWROb3JtYWw7XG4jaWZkZWYgRkxJUF9TSURFRFxuXHR0cmFuc2Zvcm1lZE5vcm1hbCA9IC0gdHJhbnNmb3JtZWROb3JtYWw7XG4jZW5kaWZcbiNpZmRlZiBVU0VfVEFOR0VOVFxuXHR2ZWMzIHRyYW5zZm9ybWVkVGFuZ2VudCA9ICggbW9kZWxWaWV3TWF0cml4ICogdmVjNCggb2JqZWN0VGFuZ2VudCwgMC4wICkgKS54eXo7XG5cdCNpZmRlZiBGTElQX1NJREVEXG5cdFx0dHJhbnNmb3JtZWRUYW5nZW50ID0gLSB0cmFuc2Zvcm1lZFRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmIixkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGRpc3BsYWNlbWVudE1hcDtcblx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRTY2FsZTtcblx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRCaWFzO1xuI2VuZGlmIixkaXNwbGFjZW1lbnRtYXBfdmVydGV4OiIjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHR0cmFuc2Zvcm1lZCArPSBub3JtYWxpemUoIG9iamVjdE5vcm1hbCApICogKCB0ZXh0dXJlMkQoIGRpc3BsYWNlbWVudE1hcCwgdlV2ICkueCAqIGRpc3BsYWNlbWVudFNjYWxlICsgZGlzcGxhY2VtZW50QmlhcyApO1xuI2VuZGlmIixlbWlzc2l2ZW1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxuXHR2ZWM0IGVtaXNzaXZlQ29sb3IgPSB0ZXh0dXJlMkQoIGVtaXNzaXZlTWFwLCB2VXYgKTtcblx0ZW1pc3NpdmVDb2xvci5yZ2IgPSBlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXIoIGVtaXNzaXZlQ29sb3IgKS5yZ2I7XG5cdHRvdGFsRW1pc3NpdmVSYWRpYW5jZSAqPSBlbWlzc2l2ZUNvbG9yLnJnYjtcbiNlbmRpZiIsZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBlbWlzc2l2ZU1hcDtcbiNlbmRpZiIsZW5jb2RpbmdzX2ZyYWdtZW50OiJnbF9GcmFnQ29sb3IgPSBsaW5lYXJUb091dHB1dFRleGVsKCBnbF9GcmFnQ29sb3IgKTsiLGVuY29kaW5nc19wYXJzX2ZyYWdtZW50OiJcbnZlYzQgTGluZWFyVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2YWx1ZTtcbn1cbnZlYzQgR2FtbWFUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XG5cdHJldHVybiB2ZWM0KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggZ2FtbWFGYWN0b3IgKSApLCB2YWx1ZS5hICk7XG59XG52ZWM0IExpbmVhclRvR2FtbWEoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IGdhbW1hRmFjdG9yICkge1xuXHRyZXR1cm4gdmVjNCggcG93KCB2YWx1ZS5yZ2IsIHZlYzMoIDEuMCAvIGdhbW1hRmFjdG9yICkgKSwgdmFsdWUuYSApO1xufVxudmVjNCBzUkdCVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiICogMC45NDc4NjcyOTg2ICsgdmVjMyggMC4wNTIxMzI3MDE0ICksIHZlYzMoIDIuNCApICksIHZhbHVlLnJnYiAqIDAuMDc3Mzk5MzgwOCwgdmVjMyggbGVzc1RoYW5FcXVhbCggdmFsdWUucmdiLCB2ZWMzKCAwLjA0MDQ1ICkgKSApICksIHZhbHVlLmEgKTtcbn1cbnZlYzQgTGluZWFyVG9zUkdCKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMC40MTY2NiApICkgKiAxLjA1NSAtIHZlYzMoIDAuMDU1ICksIHZhbHVlLnJnYiAqIDEyLjkyLCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDAzMTMwOCApICkgKSApLCB2YWx1ZS5hICk7XG59XG52ZWM0IFJHQkVUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqIGV4cDIoIHZhbHVlLmEgKiAyNTUuMCAtIDEyOC4wICksIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQkUoIGluIHZlYzQgdmFsdWUgKSB7XG5cdGZsb2F0IG1heENvbXBvbmVudCA9IG1heCggbWF4KCB2YWx1ZS5yLCB2YWx1ZS5nICksIHZhbHVlLmIgKTtcblx0ZmxvYXQgZkV4cCA9IGNsYW1wKCBjZWlsKCBsb2cyKCBtYXhDb21wb25lbnQgKSApLCAtMTI4LjAsIDEyNy4wICk7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgLyBleHAyKCBmRXhwICksICggZkV4cCArIDEyOC4wICkgLyAyNTUuMCApO1xufVxudmVjNCBSR0JNVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogdmFsdWUuYSAqIG1heFJhbmdlLCAxLjAgKTtcbn1cbnZlYzQgTGluZWFyVG9SR0JNKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcblx0ZmxvYXQgbWF4UkdCID0gbWF4KCB2YWx1ZS5yLCBtYXgoIHZhbHVlLmcsIHZhbHVlLmIgKSApO1xuXHRmbG9hdCBNID0gY2xhbXAoIG1heFJHQiAvIG1heFJhbmdlLCAwLjAsIDEuMCApO1xuXHRNID0gY2VpbCggTSAqIDI1NS4wICkgLyAyNTUuMDtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvICggTSAqIG1heFJhbmdlICksIE0gKTtcbn1cbnZlYzQgUkdCRFRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICggKCBtYXhSYW5nZSAvIDI1NS4wICkgLyB2YWx1ZS5hICksIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQkQoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRmbG9hdCBtYXhSR0IgPSBtYXgoIHZhbHVlLnIsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XG5cdGZsb2F0IEQgPSBtYXgoIG1heFJhbmdlIC8gbWF4UkdCLCAxLjAgKTtcblx0RCA9IGNsYW1wKCBmbG9vciggRCApIC8gMjU1LjAsIDAuMCwgMS4wICk7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiAoIEQgKiAoIDI1NS4wIC8gbWF4UmFuZ2UgKSApLCBEICk7XG59XG5jb25zdCBtYXQzIGNMb2dMdXZNID0gbWF0MyggMC4yMjA5LCAwLjMzOTAsIDAuNDE4NCwgMC4xMTM4LCAwLjY3ODAsIDAuNzMxOSwgMC4wMTAyLCAwLjExMzAsIDAuMjk2OSApO1xudmVjNCBMaW5lYXJUb0xvZ0x1diggaW4gdmVjNCB2YWx1ZSApIHtcblx0dmVjMyBYcF9ZX1hZWnAgPSBjTG9nTHV2TSAqIHZhbHVlLnJnYjtcblx0WHBfWV9YWVpwID0gbWF4KCBYcF9ZX1hZWnAsIHZlYzMoIDFlLTYsIDFlLTYsIDFlLTYgKSApO1xuXHR2ZWM0IHZSZXN1bHQ7XG5cdHZSZXN1bHQueHkgPSBYcF9ZX1hZWnAueHkgLyBYcF9ZX1hZWnAuejtcblx0ZmxvYXQgTGUgPSAyLjAgKiBsb2cyKFhwX1lfWFlacC55KSArIDEyNy4wO1xuXHR2UmVzdWx0LncgPSBmcmFjdCggTGUgKTtcblx0dlJlc3VsdC56ID0gKCBMZSAtICggZmxvb3IoIHZSZXN1bHQudyAqIDI1NS4wICkgKSAvIDI1NS4wICkgLyAyNTUuMDtcblx0cmV0dXJuIHZSZXN1bHQ7XG59XG5jb25zdCBtYXQzIGNMb2dMdXZJbnZlcnNlTSA9IG1hdDMoIDYuMDAxNCwgLTIuNzAwOCwgLTEuNzk5NiwgLTEuMzMyMCwgMy4xMDI5LCAtNS43NzIxLCAwLjMwMDgsIC0xLjA4ODIsIDUuNjI2OCApO1xudmVjNCBMb2dMdXZUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0ZmxvYXQgTGUgPSB2YWx1ZS56ICogMjU1LjAgKyB2YWx1ZS53O1xuXHR2ZWMzIFhwX1lfWFlacDtcblx0WHBfWV9YWVpwLnkgPSBleHAyKCAoIExlIC0gMTI3LjAgKSAvIDIuMCApO1xuXHRYcF9ZX1hZWnAueiA9IFhwX1lfWFlacC55IC8gdmFsdWUueTtcblx0WHBfWV9YWVpwLnggPSB2YWx1ZS54ICogWHBfWV9YWVpwLno7XG5cdHZlYzMgdlJHQiA9IGNMb2dMdXZJbnZlcnNlTSAqIFhwX1lfWFlacC5yZ2I7XG5cdHJldHVybiB2ZWM0KCBtYXgoIHZSR0IsIDAuMCApLCAxLjAgKTtcbn0iLGVudm1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdHZlYzMgY2FtZXJhVG9GcmFnO1xuXHRcdGlmICggaXNPcnRob2dyYXBoaWMgKSB7XG5cdFx0XHRjYW1lcmFUb0ZyYWcgPSBub3JtYWxpemUoIHZlYzMoIC0gdmlld01hdHJpeFsgMCBdWyAyIF0sIC0gdmlld01hdHJpeFsgMSBdWyAyIF0sIC0gdmlld01hdHJpeFsgMiBdWyAyIF0gKSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjYW1lcmFUb0ZyYWcgPSBub3JtYWxpemUoIHZXb3JsZFBvc2l0aW9uIC0gY2FtZXJhUG9zaXRpb24gKTtcblx0XHR9XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0XHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCBjYW1lcmFUb0ZyYWcsIHdvcmxkTm9ybWFsICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZnJhY3QoIGNhbWVyYVRvRnJhZywgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xuXHRcdCNlbmRpZlxuXHQjZWxzZVxuXHRcdHZlYzMgcmVmbGVjdFZlYyA9IHZSZWZsZWN0O1xuXHQjZW5kaWZcblx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHR2ZWM0IGVudkNvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxuXHRcdHZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIHJlZmxlY3RWZWMsIDAuMCApO1xuXHQjZWxzZVxuXHRcdHZlYzQgZW52Q29sb3IgPSB2ZWM0KCAwLjAgKTtcblx0I2VuZGlmXG5cdCNpZm5kZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVlxuXHRcdGVudkNvbG9yID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52Q29sb3IgKTtcblx0I2VuZGlmXG5cdCNpZmRlZiBFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFlcblx0XHRvdXRnb2luZ0xpZ2h0ID0gbWl4KCBvdXRnb2luZ0xpZ2h0LCBvdXRnb2luZ0xpZ2h0ICogZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19NSVggKVxuXHRcdG91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfQkxFTkRJTkdfQUREIClcblx0XHRvdXRnb2luZ0xpZ2h0ICs9IGVudkNvbG9yLnh5eiAqIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHk7XG5cdCNlbmRpZlxuI2VuZGlmIixlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdHVuaWZvcm0gZmxvYXQgZW52TWFwSW50ZW5zaXR5O1xuXHR1bmlmb3JtIGZsb2F0IGZsaXBFbnZNYXA7XG5cdHVuaWZvcm0gaW50IG1heE1pcExldmVsO1xuXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxuXHRcdHVuaWZvcm0gc2FtcGxlckN1YmUgZW52TWFwO1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDtcblx0I2VuZGlmXG5cdFxuI2VuZGlmIixlbnZtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0dW5pZm9ybSBmbG9hdCByZWZsZWN0aXZpdHk7XG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApXG5cdFx0I2RlZmluZSBFTlZfV09STERQT1Ncblx0I2VuZGlmXG5cdCNpZmRlZiBFTlZfV09STERQT1Ncblx0XHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbHNlXG5cdFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xuXHQjZW5kaWZcbiNlbmRpZiIsZW52bWFwX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX0VOVk1BUFxuXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHxkZWZpbmVkKCBQSE9ORyApXG5cdFx0I2RlZmluZSBFTlZfV09STERQT1Ncblx0I2VuZGlmXG5cdCNpZmRlZiBFTlZfV09STERQT1Ncblx0XHRcblx0XHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG5cdCNlbHNlXG5cdFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xuXHRcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xuXHQjZW5kaWZcbiNlbmRpZiIsZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQIClcblx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRlJBQ1RJT05cblx0XHR1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbztcblx0I2VuZGlmXG5cdHZlYzMgZ2V0TGlnaHRQcm9iZUluZGlyZWN0SXJyYWRpYW5jZSggY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gaW50IG1heE1JUExldmVsICkge1xuXHRcdHZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBnZW9tZXRyeS5ub3JtYWwsIHZpZXdNYXRyaXggKTtcblx0XHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxuXHRcdFx0dmVjMyBxdWVyeVZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiB3b3JsZE5vcm1hbC54LCB3b3JsZE5vcm1hbC55eiApO1xuXHRcdFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVMb2RFWFQoIGVudk1hcCwgcXVlcnlWZWMsIGZsb2F0KCBtYXhNSVBMZXZlbCApICk7XG5cdFx0XHQjZWxzZVxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgcXVlcnlWZWMsIGZsb2F0KCBtYXhNSVBMZXZlbCApICk7XG5cdFx0XHQjZW5kaWZcblx0XHRcdGVudk1hcENvbG9yLnJnYiA9IGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxuXHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlVVYoIGVudk1hcCwgd29ybGROb3JtYWwsIDEuMCApO1xuXHRcdCNlbHNlXG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdmVjNCggMC4wICk7XG5cdFx0I2VuZGlmXG5cdFx0cmV0dXJuIFBJICogZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xuXHR9XG5cdGZsb2F0IGdldFNwZWN1bGFyTUlQTGV2ZWwoIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gaW50IG1heE1JUExldmVsICkge1xuXHRcdGZsb2F0IG1heE1JUExldmVsU2NhbGFyID0gZmxvYXQoIG1heE1JUExldmVsICk7XG5cdFx0ZmxvYXQgc2lnbWEgPSBQSSAqIHJvdWdobmVzcyAqIHJvdWdobmVzcyAvICggMS4wICsgcm91Z2huZXNzICk7XG5cdFx0ZmxvYXQgZGVzaXJlZE1JUExldmVsID0gbWF4TUlQTGV2ZWxTY2FsYXIgKyBsb2cyKCBzaWdtYSApO1xuXHRcdHJldHVybiBjbGFtcCggZGVzaXJlZE1JUExldmVsLCAwLjAsIG1heE1JUExldmVsU2NhbGFyICk7XG5cdH1cblx0dmVjMyBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XG5cdFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cblx0XHRcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZmxlY3QoIC12aWV3RGlyLCBub3JtYWwgKTtcblx0XHRcdHJlZmxlY3RWZWMgPSBub3JtYWxpemUoIG1peCggcmVmbGVjdFZlYywgbm9ybWFsLCByb3VnaG5lc3MgKiByb3VnaG5lc3MpICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZnJhY3QoIC12aWV3RGlyLCBub3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xuXHRcdCNlbmRpZlxuXHRcdHJlZmxlY3RWZWMgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCByZWZsZWN0VmVjLCB2aWV3TWF0cml4ICk7XG5cdFx0ZmxvYXQgc3BlY3VsYXJNSVBMZXZlbCA9IGdldFNwZWN1bGFyTUlQTGV2ZWwoIHJvdWdobmVzcywgbWF4TUlQTGV2ZWwgKTtcblx0XHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxuXHRcdFx0dmVjMyBxdWVyeVJlZmxlY3RWZWMgPSB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICk7XG5cdFx0XHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZUxvZEVYVCggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcblx0XHRcdCNlbHNlXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcblx0XHRcdCNlbmRpZlxuXHRcdFx0ZW52TWFwQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XG5cdFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVViggZW52TWFwLCByZWZsZWN0VmVjLCByb3VnaG5lc3MgKTtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xuXHR9XG4jZW5kaWYiLGVudm1hcF92ZXJ0ZXg6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpZmRlZiBFTlZfV09STERQT1Ncblx0XHR2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6O1xuXHQjZWxzZVxuXHRcdHZlYzMgY2FtZXJhVG9WZXJ0ZXg7XG5cdFx0aWYgKCBpc09ydGhvZ3JhcGhpYyApIHtcblx0XHRcdGNhbWVyYVRvVmVydGV4ID0gbm9ybWFsaXplKCB2ZWMzKCAtIHZpZXdNYXRyaXhbIDAgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDEgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDIgXVsgMiBdICkgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y2FtZXJhVG9WZXJ0ZXggPSBub3JtYWxpemUoIHdvcmxkUG9zaXRpb24ueHl6IC0gY2FtZXJhUG9zaXRpb24gKTtcblx0XHR9XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cblx0XHRcdHZSZWZsZWN0ID0gcmVmbGVjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZSZWZsZWN0ID0gcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZcblx0I2VuZGlmXG4jZW5kaWYiLGZvZ192ZXJ0ZXg6IiNpZmRlZiBVU0VfRk9HXG5cdGZvZ0RlcHRoID0gLSBtdlBvc2l0aW9uLno7XG4jZW5kaWYiLGZvZ19wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9GT0dcblx0dmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcbiNlbmRpZiIsZm9nX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0ZPR1xuXHQjaWZkZWYgRk9HX0VYUDJcblx0XHRmbG9hdCBmb2dGYWN0b3IgPSAxLjAgLSBleHAoIC0gZm9nRGVuc2l0eSAqIGZvZ0RlbnNpdHkgKiBmb2dEZXB0aCAqIGZvZ0RlcHRoICk7XG5cdCNlbHNlXG5cdFx0ZmxvYXQgZm9nRmFjdG9yID0gc21vb3Roc3RlcCggZm9nTmVhciwgZm9nRmFyLCBmb2dEZXB0aCApO1xuXHQjZW5kaWZcblx0Z2xfRnJhZ0NvbG9yLnJnYiA9IG1peCggZ2xfRnJhZ0NvbG9yLnJnYiwgZm9nQ29sb3IsIGZvZ0ZhY3RvciApO1xuI2VuZGlmIixmb2dfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9GT0dcblx0dW5pZm9ybSB2ZWMzIGZvZ0NvbG9yO1xuXHR2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoO1xuXHQjaWZkZWYgRk9HX0VYUDJcblx0XHR1bmlmb3JtIGZsb2F0IGZvZ0RlbnNpdHk7XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBmbG9hdCBmb2dOZWFyO1xuXHRcdHVuaWZvcm0gZmxvYXQgZm9nRmFyO1xuXHQjZW5kaWZcbiNlbmRpZiIsZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9HUkFESUVOVE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudE1hcDtcbiNlbmRpZlxudmVjMyBnZXRHcmFkaWVudElycmFkaWFuY2UoIHZlYzMgbm9ybWFsLCB2ZWMzIGxpZ2h0RGlyZWN0aW9uICkge1xuXHRmbG9hdCBkb3ROTCA9IGRvdCggbm9ybWFsLCBsaWdodERpcmVjdGlvbiApO1xuXHR2ZWMyIGNvb3JkID0gdmVjMiggZG90TkwgKiAwLjUgKyAwLjUsIDAuMCApO1xuXHQjaWZkZWYgVVNFX0dSQURJRU5UTUFQXG5cdFx0cmV0dXJuIHRleHR1cmUyRCggZ3JhZGllbnRNYXAsIGNvb3JkICkucmdiO1xuXHQjZWxzZVxuXHRcdHJldHVybiAoIGNvb3JkLnggPCAwLjcgKSA/IHZlYzMoIDAuNyApIDogdmVjMyggMS4wICk7XG5cdCNlbmRpZlxufSIsbGlnaHRtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTElHSFRNQVBcblx0dmVjNCBsaWdodE1hcFRleGVsPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICk7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBQSSAqIGxpZ2h0TWFwVGV4ZWxUb0xpbmVhciggbGlnaHRNYXBUZXhlbCApLnJnYiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xuI2VuZGlmIixsaWdodG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0xJR0hUTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGxpZ2h0TWFwO1xuXHR1bmlmb3JtIGZsb2F0IGxpZ2h0TWFwSW50ZW5zaXR5O1xuI2VuZGlmIixsaWdodHNfbGFtYmVydF92ZXJ0ZXg6InZlYzMgZGlmZnVzZSA9IHZlYzMoIDEuMCApO1xuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeTtcbmdlb21ldHJ5LnBvc2l0aW9uID0gbXZQb3NpdGlvbi54eXo7XG5nZW9tZXRyeS5ub3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG5nZW9tZXRyeS52aWV3RGlyID0gKCBpc09ydGhvZ3JhcGhpYyApID8gdmVjMyggMCwgMCwgMSApIDogbm9ybWFsaXplKCAtbXZQb3NpdGlvbi54eXogKTtcbkdlb21ldHJpY0NvbnRleHQgYmFja0dlb21ldHJ5O1xuYmFja0dlb21ldHJ5LnBvc2l0aW9uID0gZ2VvbWV0cnkucG9zaXRpb247XG5iYWNrR2VvbWV0cnkubm9ybWFsID0gLWdlb21ldHJ5Lm5vcm1hbDtcbmJhY2tHZW9tZXRyeS52aWV3RGlyID0gZ2VvbWV0cnkudmlld0RpcjtcbnZMaWdodEZyb250ID0gdmVjMyggMC4wICk7XG52SW5kaXJlY3RGcm9udCA9IHZlYzMoIDAuMCApO1xuI2lmZGVmIERPVUJMRV9TSURFRFxuXHR2TGlnaHRCYWNrID0gdmVjMyggMC4wICk7XG5cdHZJbmRpcmVjdEJhY2sgPSB2ZWMzKCAwLjAgKTtcbiNlbmRpZlxuSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodDtcbmZsb2F0IGRvdE5MO1xudmVjMyBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG52SW5kaXJlY3RGcm9udCArPSBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xudkluZGlyZWN0RnJvbnQgKz0gZ2V0TGlnaHRQcm9iZUlycmFkaWFuY2UoIGxpZ2h0UHJvYmUsIGdlb21ldHJ5ICk7XG4jaWZkZWYgRE9VQkxFX1NJREVEXG5cdHZJbmRpcmVjdEJhY2sgKz0gZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcblx0dkluZGlyZWN0QmFjayArPSBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggbGlnaHRQcm9iZSwgYmFja0dlb21ldHJ5ICk7XG4jZW5kaWZcbiNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XG5cdFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSA9IFBJICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0dkxpZ2h0RnJvbnQgKz0gc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2VuZGlmXG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcbiNlbmRpZlxuI2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XG5cdFx0Z2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggc3BvdExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHRkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgPSBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdHZMaWdodEZyb250ICs9IHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZMaWdodEJhY2sgKz0gc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNlbmRpZlxuXHR9XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG4jZW5kaWZcbiNpZiBOVU1fRElSX0xJR0hUUyA+IDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0ZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHR2TGlnaHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2TGlnaHRCYWNrICs9IHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjZW5kaWZcblx0fVxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuI2VuZGlmXG4jaWYgTlVNX0hFTUlfTElHSFRTID4gMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHtcblx0XHR2SW5kaXJlY3RGcm9udCArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5ICk7XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdFx0dkluZGlyZWN0QmFjayArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGJhY2tHZW9tZXRyeSApO1xuXHRcdCNlbmRpZlxuXHR9XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG4jZW5kaWYiLGxpZ2h0c19wYXJzX2JlZ2luOiJ1bmlmb3JtIGJvb2wgcmVjZWl2ZVNoYWRvdztcbnVuaWZvcm0gdmVjMyBhbWJpZW50TGlnaHRDb2xvcjtcbnVuaWZvcm0gdmVjMyBsaWdodFByb2JlWyA5IF07XG52ZWMzIHNoR2V0SXJyYWRpYW5jZUF0KCBpbiB2ZWMzIG5vcm1hbCwgaW4gdmVjMyBzaENvZWZmaWNpZW50c1sgOSBdICkge1xuXHRmbG9hdCB4ID0gbm9ybWFsLngsIHkgPSBub3JtYWwueSwgeiA9IG5vcm1hbC56O1xuXHR2ZWMzIHJlc3VsdCA9IHNoQ29lZmZpY2llbnRzWyAwIF0gKiAwLjg4NjIyNztcblx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyAxIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHk7XG5cdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgMiBdICogMi4wICogMC41MTE2NjQgKiB6O1xuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDMgXSAqIDIuMCAqIDAuNTExNjY0ICogeDtcblx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA0IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHggKiB5O1xuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDUgXSAqIDIuMCAqIDAuNDI5MDQzICogeSAqIHo7XG5cdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNiBdICogKCAwLjc0MzEyNSAqIHogKiB6IC0gMC4yNDc3MDggKTtcblx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA3IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHggKiB6O1xuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDggXSAqIDAuNDI5MDQzICogKCB4ICogeCAtIHkgKiB5ICk7XG5cdHJldHVybiByZXN1bHQ7XG59XG52ZWMzIGdldExpZ2h0UHJvYmVJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGxpZ2h0UHJvYmVbIDkgXSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSApIHtcblx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGdlb21ldHJ5Lm5vcm1hbCwgdmlld01hdHJpeCApO1xuXHR2ZWMzIGlycmFkaWFuY2UgPSBzaEdldElycmFkaWFuY2VBdCggd29ybGROb3JtYWwsIGxpZ2h0UHJvYmUgKTtcblx0cmV0dXJuIGlycmFkaWFuY2U7XG59XG52ZWMzIGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgYW1iaWVudExpZ2h0Q29sb3IgKSB7XG5cdHZlYzMgaXJyYWRpYW5jZSA9IGFtYmllbnRMaWdodENvbG9yO1xuXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRpcnJhZGlhbmNlICo9IFBJO1xuXHQjZW5kaWZcblx0cmV0dXJuIGlycmFkaWFuY2U7XG59XG4jaWYgTlVNX0RJUl9MSUdIVFMgPiAwXG5cdHN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0IHtcblx0XHR2ZWMzIGRpcmVjdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHR9O1xuXHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodHNbIE5VTV9ESVJfTElHSFRTIF07XG5cdHZvaWQgZ2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgKSB7XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBkaXJlY3Rpb25hbExpZ2h0LmNvbG9yO1xuXHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbmFsTGlnaHQuZGlyZWN0aW9uO1xuXHRcdGRpcmVjdExpZ2h0LnZpc2libGUgPSB0cnVlO1xuXHR9XG4jZW5kaWZcbiNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxuXHRzdHJ1Y3QgUG9pbnRMaWdodCB7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGZsb2F0IGRpc3RhbmNlO1xuXHRcdGZsb2F0IGRlY2F5O1xuXHR9O1xuXHR1bmlmb3JtIFBvaW50TGlnaHQgcG9pbnRMaWdodHNbIE5VTV9QT0lOVF9MSUdIVFMgXTtcblx0dm9pZCBnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gUG9pbnRMaWdodCBwb2ludExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCApIHtcblx0XHR2ZWMzIGxWZWN0b3IgPSBwb2ludExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnkucG9zaXRpb247XG5cdFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBsVmVjdG9yICk7XG5cdFx0ZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApO1xuXHRcdGRpcmVjdExpZ2h0LmNvbG9yID0gcG9pbnRMaWdodC5jb2xvcjtcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqPSBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBsaWdodERpc3RhbmNlLCBwb2ludExpZ2h0LmRpc3RhbmNlLCBwb2ludExpZ2h0LmRlY2F5ICk7XG5cdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9ICggZGlyZWN0TGlnaHQuY29sb3IgIT0gdmVjMyggMC4wICkgKTtcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1NQT1RfTElHSFRTID4gMFxuXHRzdHJ1Y3QgU3BvdExpZ2h0IHtcblx0XHR2ZWMzIHBvc2l0aW9uO1xuXHRcdHZlYzMgZGlyZWN0aW9uO1xuXHRcdHZlYzMgY29sb3I7XG5cdFx0ZmxvYXQgZGlzdGFuY2U7XG5cdFx0ZmxvYXQgZGVjYXk7XG5cdFx0ZmxvYXQgY29uZUNvcztcblx0XHRmbG9hdCBwZW51bWJyYUNvcztcblx0fTtcblx0dW5pZm9ybSBTcG90TGlnaHQgc3BvdExpZ2h0c1sgTlVNX1NQT1RfTElHSFRTIF07XG5cdHZvaWQgZ2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gU3BvdExpZ2h0IHNwb3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgKSB7XG5cdFx0dmVjMyBsVmVjdG9yID0gc3BvdExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnkucG9zaXRpb247XG5cdFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBsVmVjdG9yICk7XG5cdFx0ZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApO1xuXHRcdGZsb2F0IGFuZ2xlQ29zID0gZG90KCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIHNwb3RMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRpZiAoIGFuZ2xlQ29zID4gc3BvdExpZ2h0LmNvbmVDb3MgKSB7XG5cdFx0XHRmbG9hdCBzcG90RWZmZWN0ID0gc21vb3Roc3RlcCggc3BvdExpZ2h0LmNvbmVDb3MsIHNwb3RMaWdodC5wZW51bWJyYUNvcywgYW5nbGVDb3MgKTtcblx0XHRcdGRpcmVjdExpZ2h0LmNvbG9yID0gc3BvdExpZ2h0LmNvbG9yO1xuXHRcdFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gc3BvdEVmZmVjdCAqIHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGxpZ2h0RGlzdGFuY2UsIHNwb3RMaWdodC5kaXN0YW5jZSwgc3BvdExpZ2h0LmRlY2F5ICk7XG5cdFx0XHRkaXJlY3RMaWdodC52aXNpYmxlID0gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGlyZWN0TGlnaHQuY29sb3IgPSB2ZWMzKCAwLjAgKTtcblx0XHRcdGRpcmVjdExpZ2h0LnZpc2libGUgPSBmYWxzZTtcblx0XHR9XG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxuXHRzdHJ1Y3QgUmVjdEFyZWFMaWdodCB7XG5cdFx0dmVjMyBjb2xvcjtcblx0XHR2ZWMzIHBvc2l0aW9uO1xuXHRcdHZlYzMgaGFsZldpZHRoO1xuXHRcdHZlYzMgaGFsZkhlaWdodDtcblx0fTtcblx0dW5pZm9ybSBzYW1wbGVyMkQgbHRjXzE7XHR1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMjtcblx0dW5pZm9ybSBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHRzWyBOVU1fUkVDVF9BUkVBX0xJR0hUUyBdO1xuI2VuZGlmXG4jaWYgTlVNX0hFTUlfTElHSFRTID4gMFxuXHRzdHJ1Y3QgSGVtaXNwaGVyZUxpZ2h0IHtcblx0XHR2ZWMzIGRpcmVjdGlvbjtcblx0XHR2ZWMzIHNreUNvbG9yO1xuXHRcdHZlYzMgZ3JvdW5kQ29sb3I7XG5cdH07XG5cdHVuaWZvcm0gSGVtaXNwaGVyZUxpZ2h0IGhlbWlzcGhlcmVMaWdodHNbIE5VTV9IRU1JX0xJR0hUUyBdO1xuXHR2ZWMzIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIEhlbWlzcGhlcmVMaWdodCBoZW1pTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnkgKSB7XG5cdFx0ZmxvYXQgZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgaGVtaUxpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGZsb2F0IGhlbWlEaWZmdXNlV2VpZ2h0ID0gMC41ICogZG90TkwgKyAwLjU7XG5cdFx0dmVjMyBpcnJhZGlhbmNlID0gbWl4KCBoZW1pTGlnaHQuZ3JvdW5kQ29sb3IsIGhlbWlMaWdodC5za3lDb2xvciwgaGVtaURpZmZ1c2VXZWlnaHQgKTtcblx0XHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRcdGlycmFkaWFuY2UgKj0gUEk7XG5cdFx0I2VuZGlmXG5cdFx0cmV0dXJuIGlycmFkaWFuY2U7XG5cdH1cbiNlbmRpZiIsbGlnaHRzX3Rvb25fZnJhZ21lbnQ6IlRvb25NYXRlcmlhbCBtYXRlcmlhbDtcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2I7IixsaWdodHNfdG9vbl9wYXJzX2ZyYWdtZW50OiJ2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbnN0cnVjdCBUb29uTWF0ZXJpYWwge1xuXHR2ZWMzIGRpZmZ1c2VDb2xvcjtcbn07XG52b2lkIFJFX0RpcmVjdF9Ub29uKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBUb29uTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHR2ZWMzIGlycmFkaWFuY2UgPSBnZXRHcmFkaWVudElycmFkaWFuY2UoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0aXJyYWRpYW5jZSAqPSBQSTtcblx0I2VuZGlmXG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX1Rvb24oIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gVG9vbk1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG59XG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X1Rvb25cbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9Ub29uXG4jZGVmaW5lIE1hdGVyaWFsX0xpZ2h0UHJvYmVMT0QoIG1hdGVyaWFsIClcdCgwKSIsbGlnaHRzX3Bob25nX2ZyYWdtZW50OiJCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWw7XG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiO1xubWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IHNwZWN1bGFyO1xubWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgPSBzaGluaW5lc3M7XG5tYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoID0gc3BlY3VsYXJTdHJlbmd0aDsiLGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50OiJ2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbnN0cnVjdCBCbGlublBob25nTWF0ZXJpYWwge1xuXHR2ZWMzIGRpZmZ1c2VDb2xvcjtcblx0dmVjMyBzcGVjdWxhckNvbG9yO1xuXHRmbG9hdCBzcGVjdWxhclNoaW5pbmVzcztcblx0ZmxvYXQgc3BlY3VsYXJTdHJlbmd0aDtcbn07XG52b2lkIFJFX0RpcmVjdF9CbGlublBob25nKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0dmVjMyBpcnJhZGlhbmNlID0gZG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0aXJyYWRpYW5jZSAqPSBQSTtcblx0I2VuZGlmXG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyApICogbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aDtcbn1cbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmcoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG59XG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X0JsaW5uUGhvbmdcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nXG4jZGVmaW5lIE1hdGVyaWFsX0xpZ2h0UHJvYmVMT0QoIG1hdGVyaWFsIClcdCgwKSIsbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50OiJQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsO1xubWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYiAqICggMS4wIC0gbWV0YWxuZXNzRmFjdG9yICk7XG52ZWMzIGR4eSA9IG1heCggYWJzKCBkRmR4KCBnZW9tZXRyeU5vcm1hbCApICksIGFicyggZEZkeSggZ2VvbWV0cnlOb3JtYWwgKSApICk7XG5mbG9hdCBnZW9tZXRyeVJvdWdobmVzcyA9IG1heCggbWF4KCBkeHkueCwgZHh5LnkgKSwgZHh5LnogKTtcbm1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzID0gbWF4KCByb3VnaG5lc3NGYWN0b3IsIDAuMDUyNSApO21hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzICs9IGdlb21ldHJ5Um91Z2huZXNzO1xubWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgPSBtaW4oIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLCAxLjAgKTtcbiNpZmRlZiBSRUZMRUNUSVZJVFlcblx0I2lmZGVmIFNQRUNVTEFSXG5cdFx0dmVjMyBzcGVjdWxhckludGVuc2l0eUZhY3RvciA9IHZlYzMoIHNwZWN1bGFySW50ZW5zaXR5ICk7XG5cdFx0dmVjMyBzcGVjdWxhclRpbnRGYWN0b3IgPSBzcGVjdWxhclRpbnQ7XG5cdFx0I2lmZGVmIFVTRV9TUEVDVUxBUklOVEVOU0lUWU1BUFxuXHRcdFx0c3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IgKj0gdGV4dHVyZTJEKCBzcGVjdWxhckludGVuc2l0eU1hcCwgdlV2ICkuYTtcblx0XHQjZW5kaWZcblx0XHQjaWZkZWYgVVNFX1NQRUNVTEFSVElOVE1BUFxuXHRcdFx0c3BlY3VsYXJUaW50RmFjdG9yICo9IHNwZWN1bGFyVGludE1hcFRleGVsVG9MaW5lYXIoIHRleHR1cmUyRCggc3BlY3VsYXJUaW50TWFwLCB2VXYgKSApLnJnYjtcblx0XHQjZW5kaWZcblx0XHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yRjkwID0gbWl4KCBzcGVjdWxhckludGVuc2l0eUZhY3RvciwgdmVjMyggMS4wICksIG1ldGFsbmVzc0ZhY3RvciApO1xuXHQjZWxzZVxuXHRcdHZlYzMgc3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IgPSB2ZWMzKCAxLjAgKTtcblx0XHR2ZWMzIHNwZWN1bGFyVGludEZhY3RvciA9IHZlYzMoIDEuMCApO1xuXHRcdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3JGOTAgPSB2ZWMzKCAxLjAgKTtcblx0I2VuZGlmXG5cdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIG1pbiggdmVjMyggTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAqIHBvdzIoIHJlZmxlY3Rpdml0eSApICkgKiBzcGVjdWxhclRpbnRGYWN0b3IsIHZlYzMoIDEuMCApICkgKiBzcGVjdWxhckludGVuc2l0eUZhY3RvciwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7XG4jZWxzZVxuXHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yID0gbWl4KCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xuXHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yRjkwID0gdmVjMyggMS4wICk7XG4jZW5kaWZcbiNpZmRlZiBDTEVBUkNPQVRcblx0bWF0ZXJpYWwuY2xlYXJjb2F0ID0gY2xlYXJjb2F0O1xuXHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgPSBjbGVhcmNvYXRSb3VnaG5lc3M7XG5cdCNpZmRlZiBVU0VfQ0xFQVJDT0FUTUFQXG5cdFx0bWF0ZXJpYWwuY2xlYXJjb2F0ICo9IHRleHR1cmUyRCggY2xlYXJjb2F0TWFwLCB2VXYgKS54O1xuXHQjZW5kaWZcblx0I2lmZGVmIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQXG5cdFx0bWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICo9IHRleHR1cmUyRCggY2xlYXJjb2F0Um91Z2huZXNzTWFwLCB2VXYgKS55O1xuXHQjZW5kaWZcblx0bWF0ZXJpYWwuY2xlYXJjb2F0ID0gc2F0dXJhdGUoIG1hdGVyaWFsLmNsZWFyY29hdCApO1x0bWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzID0gbWF4KCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIDAuMDUyNSApO1xuXHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKz0gZ2VvbWV0cnlSb3VnaG5lc3M7XG5cdG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IG1pbiggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCAxLjAgKTtcbiNlbmRpZlxuI2lmZGVmIFVTRV9TSEVFTlxuXHRtYXRlcmlhbC5zaGVlbkNvbG9yID0gc2hlZW47XG4jZW5kaWYiLGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50OiJzdHJ1Y3QgUGh5c2ljYWxNYXRlcmlhbCB7XG5cdHZlYzMgZGlmZnVzZUNvbG9yO1xuXHRmbG9hdCBzcGVjdWxhclJvdWdobmVzcztcblx0dmVjMyBzcGVjdWxhckNvbG9yO1xuXHR2ZWMzIHNwZWN1bGFyQ29sb3JGOTA7XG4jaWZkZWYgQ0xFQVJDT0FUXG5cdGZsb2F0IGNsZWFyY29hdDtcblx0ZmxvYXQgY2xlYXJjb2F0Um91Z2huZXNzO1xuI2VuZGlmXG4jaWZkZWYgVVNFX1NIRUVOXG5cdHZlYzMgc2hlZW5Db2xvcjtcbiNlbmRpZlxufTtcbiNkZWZpbmUgTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAwLjE2XG4jZGVmaW5lIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgMC4wNFxuZmxvYXQgY2xlYXJjb2F0REhSQXBwcm94KCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGZsb2F0IGRvdE5MICkge1xuXHRyZXR1cm4gREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCArICggMS4wIC0gREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApICogKCBwb3coIDEuMCAtIGRvdE5MLCA1LjAgKSAqIHBvdyggMS4wIC0gcm91Z2huZXNzLCAyLjAgKSApO1xufVxuI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxuXHR2b2lkIFJFX0RpcmVjdF9SZWN0QXJlYV9QaHlzaWNhbCggY29uc3QgaW4gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0XHR2ZWMzIG5vcm1hbCA9IGdlb21ldHJ5Lm5vcm1hbDtcblx0XHR2ZWMzIHZpZXdEaXIgPSBnZW9tZXRyeS52aWV3RGlyO1xuXHRcdHZlYzMgcG9zaXRpb24gPSBnZW9tZXRyeS5wb3NpdGlvbjtcblx0XHR2ZWMzIGxpZ2h0UG9zID0gcmVjdEFyZWFMaWdodC5wb3NpdGlvbjtcblx0XHR2ZWMzIGhhbGZXaWR0aCA9IHJlY3RBcmVhTGlnaHQuaGFsZldpZHRoO1xuXHRcdHZlYzMgaGFsZkhlaWdodCA9IHJlY3RBcmVhTGlnaHQuaGFsZkhlaWdodDtcblx0XHR2ZWMzIGxpZ2h0Q29sb3IgPSByZWN0QXJlYUxpZ2h0LmNvbG9yO1xuXHRcdGZsb2F0IHJvdWdobmVzcyA9IG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzO1xuXHRcdHZlYzMgcmVjdENvb3Jkc1sgNCBdO1xuXHRcdHJlY3RDb29yZHNbIDAgXSA9IGxpZ2h0UG9zICsgaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcdFx0cmVjdENvb3Jkc1sgMSBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1xuXHRcdHJlY3RDb29yZHNbIDIgXSA9IGxpZ2h0UG9zIC0gaGFsZldpZHRoICsgaGFsZkhlaWdodDtcblx0XHRyZWN0Q29vcmRzWyAzIF0gPSBsaWdodFBvcyArIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7XG5cdFx0dmVjMiB1diA9IExUQ19Vdiggbm9ybWFsLCB2aWV3RGlyLCByb3VnaG5lc3MgKTtcblx0XHR2ZWM0IHQxID0gdGV4dHVyZTJEKCBsdGNfMSwgdXYgKTtcblx0XHR2ZWM0IHQyID0gdGV4dHVyZTJEKCBsdGNfMiwgdXYgKTtcblx0XHRtYXQzIG1JbnYgPSBtYXQzKFxuXHRcdFx0dmVjMyggdDEueCwgMCwgdDEueSApLFxuXHRcdFx0dmVjMyggICAgMCwgMSwgICAgMCApLFxuXHRcdFx0dmVjMyggdDEueiwgMCwgdDEudyApXG5cdFx0KTtcblx0XHR2ZWMzIGZyZXNuZWwgPSAoIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKiB0Mi54ICsgKCB2ZWMzKCAxLjAgKSAtIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKSAqIHQyLnkgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBsaWdodENvbG9yICogZnJlc25lbCAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbUludiwgcmVjdENvb3JkcyApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gbGlnaHRDb2xvciAqIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbWF0MyggMS4wICksIHJlY3RDb29yZHMgKTtcblx0fVxuI2VuZGlmXG52b2lkIFJFX0RpcmVjdF9QaHlzaWNhbCggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xuXHR2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRpcnJhZGlhbmNlICo9IFBJO1xuXHQjZW5kaWZcblx0I2lmZGVmIENMRUFSQ09BVFxuXHRcdGZsb2F0IGNjRG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdFx0dmVjMyBjY0lycmFkaWFuY2UgPSBjY0RvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0XHRjY0lycmFkaWFuY2UgKj0gUEk7XG5cdFx0I2VuZGlmXG5cdFx0ZmxvYXQgY2xlYXJjb2F0REhSID0gbWF0ZXJpYWwuY2xlYXJjb2F0ICogY2xlYXJjb2F0REhSQXBwcm94KCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIGNjRG90TkwgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBjY0lycmFkaWFuY2UgKiBtYXRlcmlhbC5jbGVhcmNvYXQgKiBCUkRGX1NwZWN1bGFyX0dHWCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCB2ZWMzKCAxLjAgKSwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7XG5cdCNlbHNlXG5cdFx0ZmxvYXQgY2xlYXJjb2F0REhSID0gMC4wO1xuXHQjZW5kaWZcblx0I2lmZGVmIFVTRV9TSEVFTlxuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9ICggMS4wIC0gY2xlYXJjb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9TaGVlbihcblx0XHRcdG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLFxuXHRcdFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uLFxuXHRcdFx0Z2VvbWV0cnksXG5cdFx0XHRtYXRlcmlhbC5zaGVlbkNvbG9yXG5cdFx0KTtcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yRjkwLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyk7XG5cdCNlbmRpZlxuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9ICggMS4wIC0gY2xlYXJjb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xufVxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xufVxudm9pZCBSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsKCBjb25zdCBpbiB2ZWMzIHJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgY2xlYXJjb2F0UmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0KSB7XG5cdCNpZmRlZiBDTEVBUkNPQVRcblx0XHRmbG9hdCBjY0RvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IGNsZWFyY29hdFJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJjb2F0ICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTtcblx0XHRmbG9hdCBjY0RvdE5MID0gY2NEb3ROVjtcblx0XHRmbG9hdCBjbGVhcmNvYXRESFIgPSBtYXRlcmlhbC5jbGVhcmNvYXQgKiBjbGVhcmNvYXRESFJBcHByb3goIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgY2NEb3ROTCApO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGNsZWFyY29hdERIUiA9IDAuMDtcblx0I2VuZGlmXG5cdGZsb2F0IGNsZWFyY29hdEludiA9IDEuMCAtIGNsZWFyY29hdERIUjtcblx0dmVjMyBzaW5nbGVTY2F0dGVyaW5nID0gdmVjMyggMC4wICk7XG5cdHZlYzMgbXVsdGlTY2F0dGVyaW5nID0gdmVjMyggMC4wICk7XG5cdHZlYzMgY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlID0gaXJyYWRpYW5jZSAqIFJFQ0lQUk9DQUxfUEk7XG5cdEJSREZfU3BlY3VsYXJfTXVsdGlzY2F0dGVyaW5nX0Vudmlyb25tZW50KCBnZW9tZXRyeSwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MsIHNpbmdsZVNjYXR0ZXJpbmcsIG11bHRpU2NhdHRlcmluZyApO1xuXHR2ZWMzIGRpZmZ1c2UgPSBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiAoIDEuMCAtICggc2luZ2xlU2NhdHRlcmluZyArIG11bHRpU2NhdHRlcmluZyApICk7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gY2xlYXJjb2F0SW52ICogcmFkaWFuY2UgKiBzaW5nbGVTY2F0dGVyaW5nO1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IG11bHRpU2NhdHRlcmluZyAqIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZTtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGRpZmZ1c2UgKiBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2U7XG59XG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X1BoeXNpY2FsXG4jZGVmaW5lIFJFX0RpcmVjdF9SZWN0QXJlYVx0XHRSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWxcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbFxuI2RlZmluZSBSRV9JbmRpcmVjdFNwZWN1bGFyXHRcdFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWxcbmZsb2F0IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IGFtYmllbnRPY2NsdXNpb24sIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0cmV0dXJuIHNhdHVyYXRlKCBwb3coIGRvdE5WICsgYW1iaWVudE9jY2x1c2lvbiwgZXhwMiggLSAxNi4wICogcm91Z2huZXNzIC0gMS4wICkgKSAtIDEuMCArIGFtYmllbnRPY2NsdXNpb24gKTtcbn0iLGxpZ2h0c19mcmFnbWVudF9iZWdpbjoiXG5HZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5O1xuZ2VvbWV0cnkucG9zaXRpb24gPSAtIHZWaWV3UG9zaXRpb247XG5nZW9tZXRyeS5ub3JtYWwgPSBub3JtYWw7XG5nZW9tZXRyeS52aWV3RGlyID0gKCBpc09ydGhvZ3JhcGhpYyApID8gdmVjMyggMCwgMCwgMSApIDogbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XG4jaWZkZWYgQ0xFQVJDT0FUXG5cdGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCA9IGNsZWFyY29hdE5vcm1hbDtcbiNlbmRpZlxuSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodDtcbiNpZiAoIE5VTV9QT0lOVF9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcblx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xuXHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxuXHRQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHRTaGFkb3c7XG5cdCNlbmRpZlxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XG5cdFx0cG9pbnRMaWdodCA9IHBvaW50TGlnaHRzWyBpIF07XG5cdFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgKCBVTlJPTExFRF9MT09QX0lOREVYIDwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgKVxuXHRcdHBvaW50TGlnaHRTaGFkb3cgPSBwb2ludExpZ2h0U2hhZG93c1sgaSBdO1xuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICo9IGFsbCggYnZlYzIoIGRpcmVjdExpZ2h0LnZpc2libGUsIHJlY2VpdmVTaGFkb3cgKSApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dCaWFzLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xuXHRcdCNlbmRpZlxuXHRcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcblx0fVxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuI2VuZGlmXG4jaWYgKCBOVU1fU1BPVF9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcblx0U3BvdExpZ2h0IHNwb3RMaWdodDtcblx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMFxuXHRTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0U2hhZG93O1xuXHQjZW5kaWZcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XG5cdFx0c3BvdExpZ2h0ID0gc3BvdExpZ2h0c1sgaSBdO1xuXHRcdGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIHNwb3RMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIClcblx0XHRzcG90TGlnaHRTaGFkb3cgPSBzcG90TGlnaHRTaGFkb3dzWyBpIF07XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggZGlyZWN0TGlnaHQudmlzaWJsZSwgcmVjZWl2ZVNoYWRvdyApICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0U2hhZG93LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodFNoYWRvdy5zaGFkb3dCaWFzLCBzcG90TGlnaHRTaGFkb3cuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0XHQjZW5kaWZcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcbiNlbmRpZlxuI2lmICggTlVNX0RJUl9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcblx0RGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0O1xuXHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDBcblx0RGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93O1xuXHQjZW5kaWZcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcblx0XHRkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcblx0XHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fRElSX0xJR0hUX1NIQURPV1MgKVxuXHRcdGRpcmVjdGlvbmFsTGlnaHRTaGFkb3cgPSBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgaSBdO1xuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICo9IGFsbCggYnZlYzIoIGRpcmVjdExpZ2h0LnZpc2libGUsIHJlY2VpdmVTaGFkb3cgKSApID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3cuc2hhZG93QmlhcywgZGlyZWN0aW9uYWxMaWdodFNoYWRvdy5zaGFkb3dSYWRpdXMsIHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0XHQjZW5kaWZcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcbiNlbmRpZlxuI2lmICggTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0X1JlY3RBcmVhIClcblx0UmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9SRUNUX0FSRUFfTElHSFRTOyBpICsrICkge1xuXHRcdHJlY3RBcmVhTGlnaHQgPSByZWN0QXJlYUxpZ2h0c1sgaSBdO1xuXHRcdFJFX0RpcmVjdF9SZWN0QXJlYSggcmVjdEFyZWFMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG4jZW5kaWZcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHR2ZWMzIGlibElycmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTtcblx0dmVjMyBpcnJhZGlhbmNlID0gZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcblx0aXJyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggbGlnaHRQcm9iZSwgZ2VvbWV0cnkgKTtcblx0I2lmICggTlVNX0hFTUlfTElHSFRTID4gMCApXG5cdFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxuXHRcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHtcblx0XHRcdGlycmFkaWFuY2UgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeSApO1xuXHRcdH1cblx0XHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuXHQjZW5kaWZcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxuXHR2ZWMzIHJhZGlhbmNlID0gdmVjMyggMC4wICk7XG5cdHZlYzMgY2xlYXJjb2F0UmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTtcbiNlbmRpZiIsbGlnaHRzX2ZyYWdtZW50X21hcHM6IiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHQjaWZkZWYgVVNFX0xJR0hUTUFQXG5cdFx0dmVjNCBsaWdodE1hcFRleGVsPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICk7XG5cdFx0dmVjMyBsaWdodE1hcElycmFkaWFuY2UgPSBsaWdodE1hcFRleGVsVG9MaW5lYXIoIGxpZ2h0TWFwVGV4ZWwgKS5yZ2IgKiBsaWdodE1hcEludGVuc2l0eTtcblx0XHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRcdGxpZ2h0TWFwSXJyYWRpYW5jZSAqPSBQSTtcblx0XHQjZW5kaWZcblx0XHRpcnJhZGlhbmNlICs9IGxpZ2h0TWFwSXJyYWRpYW5jZTtcblx0I2VuZGlmXG5cdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggU1RBTkRBUkQgKSAmJiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRpYmxJcnJhZGlhbmNlICs9IGdldExpZ2h0UHJvYmVJbmRpcmVjdElycmFkaWFuY2UoIGdlb21ldHJ5LCBtYXhNaXBMZXZlbCApO1xuXHQjZW5kaWZcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcblx0cmFkaWFuY2UgKz0gZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5Lm5vcm1hbCwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MsIG1heE1pcExldmVsICk7XG5cdCNpZmRlZiBDTEVBUkNPQVRcblx0XHRjbGVhcmNvYXRSYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIG1heE1pcExldmVsICk7XG5cdCNlbmRpZlxuI2VuZGlmIixsaWdodHNfZnJhZ21lbnRfZW5kOiIjaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcblx0UkVfSW5kaXJlY3REaWZmdXNlKCBpcnJhZGlhbmNlLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG4jZW5kaWZcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcblx0UkVfSW5kaXJlY3RTcGVjdWxhciggcmFkaWFuY2UsIGlibElycmFkaWFuY2UsIGNsZWFyY29hdFJhZGlhbmNlLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG4jZW5kaWYiLGxvZ2RlcHRoYnVmX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGICkgJiYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGX0VYVCApXG5cdGdsX0ZyYWdEZXB0aEVYVCA9IHZJc1BlcnNwZWN0aXZlID09IDAuMCA/IGdsX0ZyYWdDb29yZC56IDogbG9nMiggdkZyYWdEZXB0aCApICogbG9nRGVwdGhCdWZGQyAqIDAuNTtcbiNlbmRpZiIsbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApICYmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKVxuXHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XG5cdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDtcblx0dmFyeWluZyBmbG9hdCB2SXNQZXJzcGVjdGl2ZTtcbiNlbmRpZiIsbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcblx0I2lmZGVmIFVTRV9MT0dERVBUSEJVRl9FWFRcblx0XHR2YXJ5aW5nIGZsb2F0IHZGcmFnRGVwdGg7XG5cdFx0dmFyeWluZyBmbG9hdCB2SXNQZXJzcGVjdGl2ZTtcblx0I2Vsc2Vcblx0XHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XG5cdCNlbmRpZlxuI2VuZGlmIixsb2dkZXB0aGJ1Zl92ZXJ0ZXg6IiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcblx0I2lmZGVmIFVTRV9MT0dERVBUSEJVRl9FWFRcblx0XHR2RnJhZ0RlcHRoID0gMS4wICsgZ2xfUG9zaXRpb24udztcblx0XHR2SXNQZXJzcGVjdGl2ZSA9IGZsb2F0KCBpc1BlcnNwZWN0aXZlTWF0cml4KCBwcm9qZWN0aW9uTWF0cml4ICkgKTtcblx0I2Vsc2Vcblx0XHRpZiAoIGlzUGVyc3BlY3RpdmVNYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKSApIHtcblx0XHRcdGdsX1Bvc2l0aW9uLnogPSBsb2cyKCBtYXgoIEVQU0lMT04sIGdsX1Bvc2l0aW9uLncgKyAxLjAgKSApICogbG9nRGVwdGhCdWZGQyAtIDEuMDtcblx0XHRcdGdsX1Bvc2l0aW9uLnogKj0gZ2xfUG9zaXRpb24udztcblx0XHR9XG5cdCNlbmRpZlxuI2VuZGlmIixtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTUFQXG5cdHZlYzQgdGV4ZWxDb2xvciA9IHRleHR1cmUyRCggbWFwLCB2VXYgKTtcblx0dGV4ZWxDb2xvciA9IG1hcFRleGVsVG9MaW5lYXIoIHRleGVsQ29sb3IgKTtcblx0ZGlmZnVzZUNvbG9yICo9IHRleGVsQ29sb3I7XG4jZW5kaWYiLG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XG4jZW5kaWYiLG1hcF9wYXJ0aWNsZV9mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9NQVAgKSB8fCBkZWZpbmVkKCBVU0VfQUxQSEFNQVAgKVxuXHR2ZWMyIHV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIGdsX1BvaW50Q29vcmQueCwgMS4wIC0gZ2xfUG9pbnRDb29yZC55LCAxICkgKS54eTtcbiNlbmRpZlxuI2lmZGVmIFVTRV9NQVBcblx0dmVjNCBtYXBUZXhlbCA9IHRleHR1cmUyRCggbWFwLCB1diApO1xuXHRkaWZmdXNlQ29sb3IgKj0gbWFwVGV4ZWxUb0xpbmVhciggbWFwVGV4ZWwgKTtcbiNlbmRpZlxuI2lmZGVmIFVTRV9BTFBIQU1BUFxuXHRkaWZmdXNlQ29sb3IuYSAqPSB0ZXh0dXJlMkQoIGFscGhhTWFwLCB1diApLmc7XG4jZW5kaWYiLG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApXG5cdHVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcbiNlbmRpZlxuI2lmZGVmIFVTRV9NQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xuI2VuZGlmXG4jaWZkZWYgVVNFX0FMUEhBTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwO1xuI2VuZGlmIixtZXRhbG5lc3NtYXBfZnJhZ21lbnQ6ImZsb2F0IG1ldGFsbmVzc0ZhY3RvciA9IG1ldGFsbmVzcztcbiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQXG5cdHZlYzQgdGV4ZWxNZXRhbG5lc3MgPSB0ZXh0dXJlMkQoIG1ldGFsbmVzc01hcCwgdlV2ICk7XG5cdG1ldGFsbmVzc0ZhY3RvciAqPSB0ZXhlbE1ldGFsbmVzcy5iO1xuI2VuZGlmIixtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwO1xuI2VuZGlmIixtb3JwaG5vcm1hbF92ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTXG5cdG9iamVjdE5vcm1hbCAqPSBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7XG5cdG9iamVjdE5vcm1hbCArPSBtb3JwaE5vcm1hbDAgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTtcblx0b2JqZWN0Tm9ybWFsICs9IG1vcnBoTm9ybWFsMSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMSBdO1xuXHRvYmplY3ROb3JtYWwgKz0gbW9ycGhOb3JtYWwyICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XG5cdG9iamVjdE5vcm1hbCArPSBtb3JwaE5vcm1hbDMgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDMgXTtcbiNlbmRpZiIsbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXG5cdHVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlO1xuXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0XHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgOCBdO1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA0IF07XG5cdCNlbmRpZlxuI2VuZGlmIixtb3JwaHRhcmdldF92ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXG5cdHRyYW5zZm9ybWVkICo9IG1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZTtcblx0dHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQwICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07XG5cdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0MSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMSBdO1xuXHR0cmFuc2Zvcm1lZCArPSBtb3JwaFRhcmdldDIgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcblx0dHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQzICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07XG5cdCNpZm5kZWYgVVNFX01PUlBITk9STUFMU1xuXHRcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NCAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNCBdO1xuXHRcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNSBdO1xuXHRcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNiBdO1xuXHRcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NyAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNyBdO1xuXHQjZW5kaWZcbiNlbmRpZiIsbm9ybWFsX2ZyYWdtZW50X2JlZ2luOiJmbG9hdCBmYWNlRGlyZWN0aW9uID0gZ2xfRnJvbnRGYWNpbmcgPyAxLjAgOiAtIDEuMDtcbiNpZmRlZiBGTEFUX1NIQURFRFxuXHR2ZWMzIGZkeCA9IHZlYzMoIGRGZHgoIHZWaWV3UG9zaXRpb24ueCApLCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnkgKSwgZEZkeCggdlZpZXdQb3NpdGlvbi56ICkgKTtcblx0dmVjMyBmZHkgPSB2ZWMzKCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeSggdlZpZXdQb3NpdGlvbi55ICksIGRGZHkoIHZWaWV3UG9zaXRpb24ueiApICk7XG5cdHZlYzMgbm9ybWFsID0gbm9ybWFsaXplKCBjcm9zcyggZmR4LCBmZHkgKSApO1xuI2Vsc2Vcblx0dmVjMyBub3JtYWwgPSBub3JtYWxpemUoIHZOb3JtYWwgKTtcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdG5vcm1hbCA9IG5vcm1hbCAqIGZhY2VEaXJlY3Rpb247XG5cdCNlbmRpZlxuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2ZWMzIHRhbmdlbnQgPSBub3JtYWxpemUoIHZUYW5nZW50ICk7XG5cdFx0dmVjMyBiaXRhbmdlbnQgPSBub3JtYWxpemUoIHZCaXRhbmdlbnQgKTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR0YW5nZW50ID0gdGFuZ2VudCAqIGZhY2VEaXJlY3Rpb247XG5cdFx0XHRiaXRhbmdlbnQgPSBiaXRhbmdlbnQgKiBmYWNlRGlyZWN0aW9uO1xuXHRcdCNlbmRpZlxuXHRcdCNpZiBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKVxuXHRcdFx0bWF0MyB2VEJOID0gbWF0MyggdGFuZ2VudCwgYml0YW5nZW50LCBub3JtYWwgKTtcblx0XHQjZW5kaWZcblx0I2VuZGlmXG4jZW5kaWZcbnZlYzMgZ2VvbWV0cnlOb3JtYWwgPSBub3JtYWw7Iixub3JtYWxfZnJhZ21lbnRfbWFwczoiI2lmZGVmIE9CSkVDVFNQQUNFX05PUk1BTE1BUFxuXHRub3JtYWwgPSB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xuXHQjaWZkZWYgRkxJUF9TSURFRFxuXHRcdG5vcm1hbCA9IC0gbm9ybWFsO1xuXHQjZW5kaWZcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdG5vcm1hbCA9IG5vcm1hbCAqIGZhY2VEaXJlY3Rpb247XG5cdCNlbmRpZlxuXHRub3JtYWwgPSBub3JtYWxpemUoIG5vcm1hbE1hdHJpeCAqIG5vcm1hbCApO1xuI2VsaWYgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXG5cdHZlYzMgbWFwTiA9IHRleHR1cmUyRCggbm9ybWFsTWFwLCB2VXYgKS54eXogKiAyLjAgLSAxLjA7XG5cdG1hcE4ueHkgKj0gbm9ybWFsU2NhbGU7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdG5vcm1hbCA9IG5vcm1hbGl6ZSggdlRCTiAqIG1hcE4gKTtcblx0I2Vsc2Vcblx0XHRub3JtYWwgPSBwZXJ0dXJiTm9ybWFsMkFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCwgbWFwTiwgZmFjZURpcmVjdGlvbiApO1xuXHQjZW5kaWZcbiNlbGlmIGRlZmluZWQoIFVTRV9CVU1QTUFQIClcblx0bm9ybWFsID0gcGVydHVyYk5vcm1hbEFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCwgZEhkeHlfZndkKCksIGZhY2VEaXJlY3Rpb24gKTtcbiNlbmRpZiIsbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTk9STUFMTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIG5vcm1hbE1hcDtcblx0dW5pZm9ybSB2ZWMyIG5vcm1hbFNjYWxlO1xuI2VuZGlmXG4jaWZkZWYgT0JKRUNUU1BBQ0VfTk9STUFMTUFQXG5cdHVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7XG4jZW5kaWZcbiNpZiAhIGRlZmluZWQgKCBVU0VfVEFOR0VOVCApICYmICggZGVmaW5lZCAoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkICggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKSApXG5cdHZlYzMgcGVydHVyYk5vcm1hbDJBcmIoIHZlYzMgZXllX3BvcywgdmVjMyBzdXJmX25vcm0sIHZlYzMgbWFwTiwgZmxvYXQgZmFjZURpcmVjdGlvbiApIHtcblx0XHR2ZWMzIHEwID0gdmVjMyggZEZkeCggZXllX3Bvcy54ICksIGRGZHgoIGV5ZV9wb3MueSApLCBkRmR4KCBleWVfcG9zLnogKSApO1xuXHRcdHZlYzMgcTEgPSB2ZWMzKCBkRmR5KCBleWVfcG9zLnggKSwgZEZkeSggZXllX3Bvcy55ICksIGRGZHkoIGV5ZV9wb3MueiApICk7XG5cdFx0dmVjMiBzdDAgPSBkRmR4KCB2VXYuc3QgKTtcblx0XHR2ZWMyIHN0MSA9IGRGZHkoIHZVdi5zdCApO1xuXHRcdHZlYzMgTiA9IHN1cmZfbm9ybTtcblx0XHR2ZWMzIHExcGVycCA9IGNyb3NzKCBxMSwgTiApO1xuXHRcdHZlYzMgcTBwZXJwID0gY3Jvc3MoIE4sIHEwICk7XG5cdFx0dmVjMyBUID0gcTFwZXJwICogc3QwLnggKyBxMHBlcnAgKiBzdDEueDtcblx0XHR2ZWMzIEIgPSBxMXBlcnAgKiBzdDAueSArIHEwcGVycCAqIHN0MS55O1xuXHRcdGZsb2F0IGRldCA9IG1heCggZG90KCBULCBUICksIGRvdCggQiwgQiApICk7XG5cdFx0ZmxvYXQgc2NhbGUgPSAoIGRldCA9PSAwLjAgKSA/IDAuMCA6IGZhY2VEaXJlY3Rpb24gKiBpbnZlcnNlc3FydCggZGV0ICk7XG5cdFx0cmV0dXJuIG5vcm1hbGl6ZSggVCAqICggbWFwTi54ICogc2NhbGUgKSArIEIgKiAoIG1hcE4ueSAqIHNjYWxlICkgKyBOICogbWFwTi56ICk7XG5cdH1cbiNlbmRpZiIsY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9iZWdpbjoiI2lmZGVmIENMRUFSQ09BVFxuXHR2ZWMzIGNsZWFyY29hdE5vcm1hbCA9IGdlb21ldHJ5Tm9ybWFsO1xuI2VuZGlmIixjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X21hcHM6IiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUFxuXHR2ZWMzIGNsZWFyY29hdE1hcE4gPSB0ZXh0dXJlMkQoIGNsZWFyY29hdE5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xuXHRjbGVhcmNvYXRNYXBOLnh5ICo9IGNsZWFyY29hdE5vcm1hbFNjYWxlO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHRjbGVhcmNvYXROb3JtYWwgPSBub3JtYWxpemUoIHZUQk4gKiBjbGVhcmNvYXRNYXBOICk7XG5cdCNlbHNlXG5cdFx0Y2xlYXJjb2F0Tm9ybWFsID0gcGVydHVyYk5vcm1hbDJBcmIoIC0gdlZpZXdQb3NpdGlvbiwgY2xlYXJjb2F0Tm9ybWFsLCBjbGVhcmNvYXRNYXBOLCBmYWNlRGlyZWN0aW9uICk7XG5cdCNlbmRpZlxuI2VuZGlmIixjbGVhcmNvYXRfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9DTEVBUkNPQVRNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgY2xlYXJjb2F0TWFwO1xuI2VuZGlmXG4jaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgY2xlYXJjb2F0Um91Z2huZXNzTWFwO1xuI2VuZGlmXG4jaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgY2xlYXJjb2F0Tm9ybWFsTWFwO1xuXHR1bmlmb3JtIHZlYzIgY2xlYXJjb2F0Tm9ybWFsU2NhbGU7XG4jZW5kaWYiLHBhY2tpbmc6InZlYzMgcGFja05vcm1hbFRvUkdCKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHtcblx0cmV0dXJuIG5vcm1hbGl6ZSggbm9ybWFsICkgKiAwLjUgKyAwLjU7XG59XG52ZWMzIHVucGFja1JHQlRvTm9ybWFsKCBjb25zdCBpbiB2ZWMzIHJnYiApIHtcblx0cmV0dXJuIDIuMCAqIHJnYi54eXogLSAxLjA7XG59XG5jb25zdCBmbG9hdCBQYWNrVXBzY2FsZSA9IDI1Ni4gLyAyNTUuO2NvbnN0IGZsb2F0IFVucGFja0Rvd25zY2FsZSA9IDI1NS4gLyAyNTYuO1xuY29uc3QgdmVjMyBQYWNrRmFjdG9ycyA9IHZlYzMoIDI1Ni4gKiAyNTYuICogMjU2LiwgMjU2LiAqIDI1Ni4sIDI1Ni4gKTtcbmNvbnN0IHZlYzQgVW5wYWNrRmFjdG9ycyA9IFVucGFja0Rvd25zY2FsZSAvIHZlYzQoIFBhY2tGYWN0b3JzLCAxLiApO1xuY29uc3QgZmxvYXQgU2hpZnRSaWdodDggPSAxLiAvIDI1Ni47XG52ZWM0IHBhY2tEZXB0aFRvUkdCQSggY29uc3QgaW4gZmxvYXQgdiApIHtcblx0dmVjNCByID0gdmVjNCggZnJhY3QoIHYgKiBQYWNrRmFjdG9ycyApLCB2ICk7XG5cdHIueXp3IC09IHIueHl6ICogU2hpZnRSaWdodDg7XHRyZXR1cm4gciAqIFBhY2tVcHNjYWxlO1xufVxuZmxvYXQgdW5wYWNrUkdCQVRvRGVwdGgoIGNvbnN0IGluIHZlYzQgdiApIHtcblx0cmV0dXJuIGRvdCggdiwgVW5wYWNrRmFjdG9ycyApO1xufVxudmVjNCBwYWNrMkhhbGZUb1JHQkEoIHZlYzIgdiApIHtcblx0dmVjNCByID0gdmVjNCggdi54LCBmcmFjdCggdi54ICogMjU1LjAgKSwgdi55LCBmcmFjdCggdi55ICogMjU1LjAgKSk7XG5cdHJldHVybiB2ZWM0KCByLnggLSByLnkgLyAyNTUuMCwgci55LCByLnogLSByLncgLyAyNTUuMCwgci53KTtcbn1cbnZlYzIgdW5wYWNrUkdCQVRvMkhhbGYoIHZlYzQgdiApIHtcblx0cmV0dXJuIHZlYzIoIHYueCArICggdi55IC8gMjU1LjAgKSwgdi56ICsgKCB2LncgLyAyNTUuMCApICk7XG59XG5mbG9hdCB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiAoIHZpZXdaICsgbmVhciApIC8gKCBuZWFyIC0gZmFyICk7XG59XG5mbG9hdCBvcnRob2dyYXBoaWNEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGxpbmVhckNsaXBaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiBsaW5lYXJDbGlwWiAqICggbmVhciAtIGZhciApIC0gbmVhcjtcbn1cbmZsb2F0IHZpZXdaVG9QZXJzcGVjdGl2ZURlcHRoKCBjb25zdCBpbiBmbG9hdCB2aWV3WiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xuXHRyZXR1cm4gKCggbmVhciArIHZpZXdaICkgKiBmYXIgKSAvICgoIGZhciAtIG5lYXIgKSAqIHZpZXdaICk7XG59XG5mbG9hdCBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgaW52Q2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuICggbmVhciAqIGZhciApIC8gKCAoIGZhciAtIG5lYXIgKSAqIGludkNsaXBaIC0gZmFyICk7XG59IixwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50OiIjaWZkZWYgUFJFTVVMVElQTElFRF9BTFBIQVxuXHRnbF9GcmFnQ29sb3IucmdiICo9IGdsX0ZyYWdDb2xvci5hO1xuI2VuZGlmIixwcm9qZWN0X3ZlcnRleDoidmVjNCBtdlBvc2l0aW9uID0gdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuI2lmZGVmIFVTRV9JTlNUQU5DSU5HXG5cdG12UG9zaXRpb24gPSBpbnN0YW5jZU1hdHJpeCAqIG12UG9zaXRpb247XG4jZW5kaWZcbm12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiBtdlBvc2l0aW9uO1xuZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjsiLGRpdGhlcmluZ19mcmFnbWVudDoiI2lmZGVmIERJVEhFUklOR1xuXHRnbF9GcmFnQ29sb3IucmdiID0gZGl0aGVyaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7XG4jZW5kaWYiLGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50OiIjaWZkZWYgRElUSEVSSU5HXG5cdHZlYzMgZGl0aGVyaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRcdGZsb2F0IGdyaWRfcG9zaXRpb24gPSByYW5kKCBnbF9GcmFnQ29vcmQueHkgKTtcblx0XHR2ZWMzIGRpdGhlcl9zaGlmdF9SR0IgPSB2ZWMzKCAwLjI1IC8gMjU1LjAsIC0wLjI1IC8gMjU1LjAsIDAuMjUgLyAyNTUuMCApO1xuXHRcdGRpdGhlcl9zaGlmdF9SR0IgPSBtaXgoIDIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIC0yLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCBncmlkX3Bvc2l0aW9uICk7XG5cdFx0cmV0dXJuIGNvbG9yICsgZGl0aGVyX3NoaWZ0X1JHQjtcblx0fVxuI2VuZGlmIixyb3VnaG5lc3NtYXBfZnJhZ21lbnQ6ImZsb2F0IHJvdWdobmVzc0ZhY3RvciA9IHJvdWdobmVzcztcbiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQXG5cdHZlYzQgdGV4ZWxSb3VnaG5lc3MgPSB0ZXh0dXJlMkQoIHJvdWdobmVzc01hcCwgdlV2ICk7XG5cdHJvdWdobmVzc0ZhY3RvciAqPSB0ZXhlbFJvdWdobmVzcy5nO1xuI2VuZGlmIixyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgcm91Z2huZXNzTWFwO1xuI2VuZGlmIixzaGFkb3dtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9TSEFET1dNQVBcblx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0XHRzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodFNoYWRvdyB7XG5cdFx0XHRmbG9hdCBzaGFkb3dCaWFzO1xuXHRcdFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcblx0XHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcblx0XHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0XHR9O1xuXHRcdHVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBzcG90U2hhZG93TWFwWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZTcG90U2hhZG93Q29vcmRbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0XHRzdHJ1Y3QgU3BvdExpZ2h0U2hhZG93IHtcblx0XHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0XHRmbG9hdCBzaGFkb3dOb3JtYWxCaWFzO1xuXHRcdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHRcdH07XG5cdFx0dW5pZm9ybSBTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0U2hhZG93c1sgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIHBvaW50U2hhZG93TWFwWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2UG9pbnRTaGFkb3dDb29yZFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcblx0XHRzdHJ1Y3QgUG9pbnRMaWdodFNoYWRvdyB7XG5cdFx0XHRmbG9hdCBzaGFkb3dCaWFzO1xuXHRcdFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcblx0XHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcblx0XHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0XHRcdGZsb2F0IHNoYWRvd0NhbWVyYU5lYXI7XG5cdFx0XHRmbG9hdCBzaGFkb3dDYW1lcmFGYXI7XG5cdFx0fTtcblx0XHR1bmlmb3JtIFBvaW50TGlnaHRTaGFkb3cgcG9pbnRMaWdodFNoYWRvd3NbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHRmbG9hdCB0ZXh0dXJlMkRDb21wYXJlKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkge1xuXHRcdHJldHVybiBzdGVwKCBjb21wYXJlLCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBkZXB0aHMsIHV2ICkgKSApO1xuXHR9XG5cdHZlYzIgdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2ICkge1xuXHRcdHJldHVybiB1bnBhY2tSR0JBVG8ySGFsZiggdGV4dHVyZTJEKCBzaGFkb3csIHV2ICkgKTtcblx0fVxuXHRmbG9hdCBWU01TaGFkb3cgKHNhbXBsZXIyRCBzaGFkb3csIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKXtcblx0XHRmbG9hdCBvY2NsdXNpb24gPSAxLjA7XG5cdFx0dmVjMiBkaXN0cmlidXRpb24gPSB0ZXh0dXJlMkREaXN0cmlidXRpb24oIHNoYWRvdywgdXYgKTtcblx0XHRmbG9hdCBoYXJkX3NoYWRvdyA9IHN0ZXAoIGNvbXBhcmUgLCBkaXN0cmlidXRpb24ueCApO1xuXHRcdGlmIChoYXJkX3NoYWRvdyAhPSAxLjAgKSB7XG5cdFx0XHRmbG9hdCBkaXN0YW5jZSA9IGNvbXBhcmUgLSBkaXN0cmlidXRpb24ueCA7XG5cdFx0XHRmbG9hdCB2YXJpYW5jZSA9IG1heCggMC4wMDAwMCwgZGlzdHJpYnV0aW9uLnkgKiBkaXN0cmlidXRpb24ueSApO1xuXHRcdFx0ZmxvYXQgc29mdG5lc3NfcHJvYmFiaWxpdHkgPSB2YXJpYW5jZSAvICh2YXJpYW5jZSArIGRpc3RhbmNlICogZGlzdGFuY2UgKTtcdFx0XHRzb2Z0bmVzc19wcm9iYWJpbGl0eSA9IGNsYW1wKCAoIHNvZnRuZXNzX3Byb2JhYmlsaXR5IC0gMC4zICkgLyAoIDAuOTUgLSAwLjMgKSwgMC4wLCAxLjAgKTtcdFx0XHRvY2NsdXNpb24gPSBjbGFtcCggbWF4KCBoYXJkX3NoYWRvdywgc29mdG5lc3NfcHJvYmFiaWxpdHkgKSwgMC4wLCAxLjAgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9jY2x1c2lvbjtcblx0fVxuXHRmbG9hdCBnZXRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkICkge1xuXHRcdGZsb2F0IHNoYWRvdyA9IDEuMDtcblx0XHRzaGFkb3dDb29yZC54eXogLz0gc2hhZG93Q29vcmQudztcblx0XHRzaGFkb3dDb29yZC56ICs9IHNoYWRvd0JpYXM7XG5cdFx0YnZlYzQgaW5GcnVzdHVtVmVjID0gYnZlYzQgKCBzaGFkb3dDb29yZC54ID49IDAuMCwgc2hhZG93Q29vcmQueCA8PSAxLjAsIHNoYWRvd0Nvb3JkLnkgPj0gMC4wLCBzaGFkb3dDb29yZC55IDw9IDEuMCApO1xuXHRcdGJvb2wgaW5GcnVzdHVtID0gYWxsKCBpbkZydXN0dW1WZWMgKTtcblx0XHRidmVjMiBmcnVzdHVtVGVzdFZlYyA9IGJ2ZWMyKCBpbkZydXN0dW0sIHNoYWRvd0Nvb3JkLnogPD0gMS4wICk7XG5cdFx0Ym9vbCBmcnVzdHVtVGVzdCA9IGFsbCggZnJ1c3R1bVRlc3RWZWMgKTtcblx0XHRpZiAoIGZydXN0dW1UZXN0ICkge1xuXHRcdCNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKVxuXHRcdFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XG5cdFx0XHRmbG9hdCBkeDAgPSAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHkwID0gLSB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR4MSA9ICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTEgPSArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHgyID0gZHgwIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHkyID0gZHkwIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHgzID0gZHgxIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHkzID0gZHkxIC8gMi4wO1xuXHRcdFx0c2hhZG93ID0gKFxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgzLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApXG5cdFx0XHQpICogKCAxLjAgLyAxNy4wICk7XG5cdFx0I2VsaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKVxuXHRcdFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XG5cdFx0XHRmbG9hdCBkeCA9IHRleGVsU2l6ZS54O1xuXHRcdFx0ZmxvYXQgZHkgPSB0ZXhlbFNpemUueTtcblx0XHRcdHZlYzIgdXYgPSBzaGFkb3dDb29yZC54eTtcblx0XHRcdHZlYzIgZiA9IGZyYWN0KCB1diAqIHNoYWRvd01hcFNpemUgKyAwLjUgKTtcblx0XHRcdHV2IC09IGYgKiB0ZXhlbFNpemU7XG5cdFx0XHRzaGFkb3cgPSAoXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYsIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCBkeCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAwLjAsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB0ZXhlbFNpemUsIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdG1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIC1keCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSwgXG5cdFx0XHRcdFx0IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAyLjAgKiBkeCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSxcblx0XHRcdFx0XHQgZi54ICkgK1xuXHRcdFx0XHRtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwgXG5cdFx0XHRcdFx0IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAyLjAgKiBkeCwgZHkgKSwgc2hhZG93Q29vcmQueiApLFxuXHRcdFx0XHRcdCBmLnggKSArXG5cdFx0XHRcdG1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDAuMCwgLWR5ICksIHNoYWRvd0Nvb3JkLnogKSwgXG5cdFx0XHRcdFx0IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAwLjAsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSxcblx0XHRcdFx0XHQgZi55ICkgK1xuXHRcdFx0XHRtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCBkeCwgLWR5ICksIHNoYWRvd0Nvb3JkLnogKSwgXG5cdFx0XHRcdFx0IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCBkeCwgMi4wICogZHkgKSwgc2hhZG93Q29vcmQueiApLFxuXHRcdFx0XHRcdCBmLnkgKSArXG5cdFx0XHRcdG1peCggbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCAtZHkgKSwgc2hhZG93Q29vcmQueiApLCBcblx0XHRcdFx0XHRcdCAgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCAtZHkgKSwgc2hhZG93Q29vcmQueiApLFxuXHRcdFx0XHRcdFx0ICBmLnggKSxcblx0XHRcdFx0XHQgbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCAyLjAgKiBkeSApLCBzaGFkb3dDb29yZC56ICksIFxuXHRcdFx0XHRcdFx0ICB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSxcblx0XHRcdFx0XHRcdCAgZi54ICksXG5cdFx0XHRcdFx0IGYueSApXG5cdFx0XHQpICogKCAxLjAgLyA5LjAgKTtcblx0XHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9WU00gKVxuXHRcdFx0c2hhZG93ID0gVlNNU2hhZG93KCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHNoYWRvdyA9IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKTtcblx0XHQjZW5kaWZcblx0XHR9XG5cdFx0cmV0dXJuIHNoYWRvdztcblx0fVxuXHR2ZWMyIGN1YmVUb1VWKCB2ZWMzIHYsIGZsb2F0IHRleGVsU2l6ZVkgKSB7XG5cdFx0dmVjMyBhYnNWID0gYWJzKCB2ICk7XG5cdFx0ZmxvYXQgc2NhbGVUb0N1YmUgPSAxLjAgLyBtYXgoIGFic1YueCwgbWF4KCBhYnNWLnksIGFic1YueiApICk7XG5cdFx0YWJzViAqPSBzY2FsZVRvQ3ViZTtcblx0XHR2ICo9IHNjYWxlVG9DdWJlICogKCAxLjAgLSAyLjAgKiB0ZXhlbFNpemVZICk7XG5cdFx0dmVjMiBwbGFuYXIgPSB2Lnh5O1xuXHRcdGZsb2F0IGFsbW9zdEFUZXhlbCA9IDEuNSAqIHRleGVsU2l6ZVk7XG5cdFx0ZmxvYXQgYWxtb3N0T25lID0gMS4wIC0gYWxtb3N0QVRleGVsO1xuXHRcdGlmICggYWJzVi56ID49IGFsbW9zdE9uZSApIHtcblx0XHRcdGlmICggdi56ID4gMC4wIClcblx0XHRcdFx0cGxhbmFyLnggPSA0LjAgLSB2Lng7XG5cdFx0fSBlbHNlIGlmICggYWJzVi54ID49IGFsbW9zdE9uZSApIHtcblx0XHRcdGZsb2F0IHNpZ25YID0gc2lnbiggdi54ICk7XG5cdFx0XHRwbGFuYXIueCA9IHYueiAqIHNpZ25YICsgMi4wICogc2lnblg7XG5cdFx0fSBlbHNlIGlmICggYWJzVi55ID49IGFsbW9zdE9uZSApIHtcblx0XHRcdGZsb2F0IHNpZ25ZID0gc2lnbiggdi55ICk7XG5cdFx0XHRwbGFuYXIueCA9IHYueCArIDIuMCAqIHNpZ25ZICsgMi4wO1xuXHRcdFx0cGxhbmFyLnkgPSB2LnogKiBzaWduWSAtIDIuMDtcblx0XHR9XG5cdFx0cmV0dXJuIHZlYzIoIDAuMTI1LCAwLjI1ICkgKiBwbGFuYXIgKyB2ZWMyKCAwLjM3NSwgMC43NSApO1xuXHR9XG5cdGZsb2F0IGdldFBvaW50U2hhZG93KCBzYW1wbGVyMkQgc2hhZG93TWFwLCB2ZWMyIHNoYWRvd01hcFNpemUsIGZsb2F0IHNoYWRvd0JpYXMsIGZsb2F0IHNoYWRvd1JhZGl1cywgdmVjNCBzaGFkb3dDb29yZCwgZmxvYXQgc2hhZG93Q2FtZXJhTmVhciwgZmxvYXQgc2hhZG93Q2FtZXJhRmFyICkge1xuXHRcdHZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyAoIHNoYWRvd01hcFNpemUgKiB2ZWMyKCA0LjAsIDIuMCApICk7XG5cdFx0dmVjMyBsaWdodFRvUG9zaXRpb24gPSBzaGFkb3dDb29yZC54eXo7XG5cdFx0ZmxvYXQgZHAgPSAoIGxlbmd0aCggbGlnaHRUb1Bvc2l0aW9uICkgLSBzaGFkb3dDYW1lcmFOZWFyICkgLyAoIHNoYWRvd0NhbWVyYUZhciAtIHNoYWRvd0NhbWVyYU5lYXIgKTtcdFx0ZHAgKz0gc2hhZG93Qmlhcztcblx0XHR2ZWMzIGJkM0QgPSBub3JtYWxpemUoIGxpZ2h0VG9Qb3NpdGlvbiApO1xuXHRcdCNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApIHx8IGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1ZTTSApXG5cdFx0XHR2ZWMyIG9mZnNldCA9IHZlYzIoIC0gMSwgMSApICogc2hhZG93UmFkaXVzICogdGV4ZWxTaXplLnk7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl5LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXh5LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKVxuXHRcdFx0KSAqICggMS4wIC8gOS4wICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHJldHVybiB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWYiLHNoYWRvd21hcF9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9TSEFET1dNQVBcblx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDBcblx0XHR1bmlmb3JtIG1hdDQgZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XG5cdFx0c3RydWN0IERpcmVjdGlvbmFsTGlnaHRTaGFkb3cge1xuXHRcdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRcdGZsb2F0IHNoYWRvd05vcm1hbEJpYXM7XG5cdFx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0XHR2ZWMyIHNoYWRvd01hcFNpemU7XG5cdFx0fTtcblx0XHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwXG5cdFx0dW5pZm9ybSBtYXQ0IHNwb3RTaGFkb3dNYXRyaXhbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlNwb3RTaGFkb3dDb29yZFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHN0cnVjdCBTcG90TGlnaHRTaGFkb3cge1xuXHRcdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRcdGZsb2F0IHNoYWRvd05vcm1hbEJpYXM7XG5cdFx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0XHR2ZWMyIHNoYWRvd01hcFNpemU7XG5cdFx0fTtcblx0XHR1bmlmb3JtIFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHRTaGFkb3dzWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwXG5cdFx0dW5pZm9ybSBtYXQ0IHBvaW50U2hhZG93TWF0cml4WyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2UG9pbnRTaGFkb3dDb29yZFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcblx0XHRzdHJ1Y3QgUG9pbnRMaWdodFNoYWRvdyB7XG5cdFx0XHRmbG9hdCBzaGFkb3dCaWFzO1xuXHRcdFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcblx0XHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcblx0XHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0XHRcdGZsb2F0IHNoYWRvd0NhbWVyYU5lYXI7XG5cdFx0XHRmbG9hdCBzaGFkb3dDYW1lcmFGYXI7XG5cdFx0fTtcblx0XHR1bmlmb3JtIFBvaW50TGlnaHRTaGFkb3cgcG9pbnRMaWdodFNoYWRvd3NbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuI2VuZGlmIixzaGFkb3dtYXBfdmVydGV4OiIjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMCB8fCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMCB8fCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcblx0XHR2ZWMzIHNoYWRvd1dvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggdHJhbnNmb3JtZWROb3JtYWwsIHZpZXdNYXRyaXggKTtcblx0XHR2ZWM0IHNoYWRvd1dvcmxkUG9zaXRpb247XG5cdCNlbmRpZlxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHRzaGFkb3dXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbiArIHZlYzQoIHNoYWRvd1dvcmxkTm9ybWFsICogZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIGkgXS5zaGFkb3dOb3JtYWxCaWFzLCAwICk7XG5cdFx0dkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSA9IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBpIF0gKiBzaGFkb3dXb3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHNoYWRvd1dvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uICsgdmVjNCggc2hhZG93V29ybGROb3JtYWwgKiBzcG90TGlnaHRTaGFkb3dzWyBpIF0uc2hhZG93Tm9ybWFsQmlhcywgMCApO1xuXHRcdHZTcG90U2hhZG93Q29vcmRbIGkgXSA9IHNwb3RTaGFkb3dNYXRyaXhbIGkgXSAqIHNoYWRvd1dvcmxkUG9zaXRpb247XG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHRzaGFkb3dXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbiArIHZlYzQoIHNoYWRvd1dvcmxkTm9ybWFsICogcG9pbnRMaWdodFNoYWRvd3NbIGkgXS5zaGFkb3dOb3JtYWxCaWFzLCAwICk7XG5cdFx0dlBvaW50U2hhZG93Q29vcmRbIGkgXSA9IHBvaW50U2hhZG93TWF0cml4WyBpIF0gKiBzaGFkb3dXb3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG5cdCNlbmRpZlxuI2VuZGlmIixzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ6ImZsb2F0IGdldFNoYWRvd01hc2soKSB7XG5cdGZsb2F0IHNoYWRvdyA9IDEuMDtcblx0I2lmZGVmIFVTRV9TSEFET1dNQVBcblx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDBcblx0RGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHRkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIGkgXTtcblx0XHRzaGFkb3cgKj0gcmVjZWl2ZVNoYWRvdyA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMFxuXHRTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0c3BvdExpZ2h0ID0gc3BvdExpZ2h0U2hhZG93c1sgaSBdO1xuXHRcdHNoYWRvdyAqPSByZWNlaXZlU2hhZG93ID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcblx0UG9pbnRMaWdodFNoYWRvdyBwb2ludExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHBvaW50TGlnaHQgPSBwb2ludExpZ2h0U2hhZG93c1sgaSBdO1xuXHRcdHNoYWRvdyAqPSByZWNlaXZlU2hhZG93ID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xuXHR9XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG5cdCNlbmRpZlxuXHQjZW5kaWZcblx0cmV0dXJuIHNoYWRvdztcbn0iLHNraW5iYXNlX3ZlcnRleDoiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHRtYXQ0IGJvbmVNYXRYID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnggKTtcblx0bWF0NCBib25lTWF0WSA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC55ICk7XG5cdG1hdDQgYm9uZU1hdFogPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueiApO1xuXHRtYXQ0IGJvbmVNYXRXID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LncgKTtcbiNlbmRpZiIsc2tpbm5pbmdfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXg7XG5cdHVuaWZvcm0gbWF0NCBiaW5kTWF0cml4SW52ZXJzZTtcblx0I2lmZGVmIEJPTkVfVEVYVFVSRVxuXHRcdHVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIGJvbmVUZXh0dXJlO1xuXHRcdHVuaWZvcm0gaW50IGJvbmVUZXh0dXJlU2l6ZTtcblx0XHRtYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7XG5cdFx0XHRmbG9hdCBqID0gaSAqIDQuMDtcblx0XHRcdGZsb2F0IHggPSBtb2QoIGosIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKSApO1xuXHRcdFx0ZmxvYXQgeSA9IGZsb29yKCBqIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XG5cdFx0XHRmbG9hdCBkeCA9IDEuMCAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKTtcblx0XHRcdGZsb2F0IGR5ID0gMS4wIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xuXHRcdFx0eSA9IGR5ICogKCB5ICsgMC41ICk7XG5cdFx0XHR2ZWM0IHYxID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAwLjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHYyID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAxLjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHYzID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAyLjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHY0ID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAzLjUgKSwgeSApICk7XG5cdFx0XHRtYXQ0IGJvbmUgPSBtYXQ0KCB2MSwgdjIsIHYzLCB2NCApO1xuXHRcdFx0cmV0dXJuIGJvbmU7XG5cdFx0fVxuXHQjZWxzZVxuXHRcdHVuaWZvcm0gbWF0NCBib25lTWF0cmljZXNbIE1BWF9CT05FUyBdO1xuXHRcdG1hdDQgZ2V0Qm9uZU1hdHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHtcblx0XHRcdG1hdDQgYm9uZSA9IGJvbmVNYXRyaWNlc1sgaW50KGkpIF07XG5cdFx0XHRyZXR1cm4gYm9uZTtcblx0XHR9XG5cdCNlbmRpZlxuI2VuZGlmIixza2lubmluZ192ZXJ0ZXg6IiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0dmVjNCBza2luVmVydGV4ID0gYmluZE1hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcblx0dmVjNCBza2lubmVkID0gdmVjNCggMC4wICk7XG5cdHNraW5uZWQgKz0gYm9uZU1hdFggKiBza2luVmVydGV4ICogc2tpbldlaWdodC54O1xuXHRza2lubmVkICs9IGJvbmVNYXRZICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueTtcblx0c2tpbm5lZCArPSBib25lTWF0WiAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lno7XG5cdHNraW5uZWQgKz0gYm9uZU1hdFcgKiBza2luVmVydGV4ICogc2tpbldlaWdodC53O1xuXHR0cmFuc2Zvcm1lZCA9ICggYmluZE1hdHJpeEludmVyc2UgKiBza2lubmVkICkueHl6O1xuI2VuZGlmIixza2lubm9ybWFsX3ZlcnRleDoiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHRtYXQ0IHNraW5NYXRyaXggPSBtYXQ0KCAwLjAgKTtcblx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnggKiBib25lTWF0WDtcblx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnkgKiBib25lTWF0WTtcblx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnogKiBib25lTWF0Wjtcblx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LncgKiBib25lTWF0Vztcblx0c2tpbk1hdHJpeCA9IGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbk1hdHJpeCAqIGJpbmRNYXRyaXg7XG5cdG9iamVjdE5vcm1hbCA9IHZlYzQoIHNraW5NYXRyaXggKiB2ZWM0KCBvYmplY3ROb3JtYWwsIDAuMCApICkueHl6O1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHRvYmplY3RUYW5nZW50ID0gdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdFRhbmdlbnQsIDAuMCApICkueHl6O1xuXHQjZW5kaWZcbiNlbmRpZiIsc3BlY3VsYXJtYXBfZnJhZ21lbnQ6ImZsb2F0IHNwZWN1bGFyU3RyZW5ndGg7XG4jaWZkZWYgVVNFX1NQRUNVTEFSTUFQXG5cdHZlYzQgdGV4ZWxTcGVjdWxhciA9IHRleHR1cmUyRCggc3BlY3VsYXJNYXAsIHZVdiApO1xuXHRzcGVjdWxhclN0cmVuZ3RoID0gdGV4ZWxTcGVjdWxhci5yO1xuI2Vsc2Vcblx0c3BlY3VsYXJTdHJlbmd0aCA9IDEuMDtcbiNlbmRpZiIsc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhck1hcDtcbiNlbmRpZiIsdG9uZW1hcHBpbmdfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBUT05FX01BUFBJTkcgKVxuXHRnbF9GcmFnQ29sb3IucmdiID0gdG9uZU1hcHBpbmcoIGdsX0ZyYWdDb2xvci5yZ2IgKTtcbiNlbmRpZiIsdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudDoiI2lmbmRlZiBzYXR1cmF0ZVxuI2RlZmluZSBzYXR1cmF0ZShhKSBjbGFtcCggYSwgMC4wLCAxLjAgKVxuI2VuZGlmXG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG52ZWMzIExpbmVhclRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRyZXR1cm4gdG9uZU1hcHBpbmdFeHBvc3VyZSAqIGNvbG9yO1xufVxudmVjMyBSZWluaGFyZFRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRjb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlO1xuXHRyZXR1cm4gc2F0dXJhdGUoIGNvbG9yIC8gKCB2ZWMzKCAxLjAgKSArIGNvbG9yICkgKTtcbn1cbnZlYzMgT3B0aW1pemVkQ2luZW9uVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdGNvbG9yID0gbWF4KCB2ZWMzKCAwLjAgKSwgY29sb3IgLSAwLjAwNCApO1xuXHRyZXR1cm4gcG93KCAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDAuNSApICkgLyAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDEuNyApICsgMC4wNiApLCB2ZWMzKCAyLjIgKSApO1xufVxudmVjMyBSUlRBbmRPRFRGaXQoIHZlYzMgdiApIHtcblx0dmVjMyBhID0gdiAqICggdiArIDAuMDI0NTc4NiApIC0gMC4wMDAwOTA1Mzc7XG5cdHZlYzMgYiA9IHYgKiAoIDAuOTgzNzI5ICogdiArIDAuNDMyOTUxMCApICsgMC4yMzgwODE7XG5cdHJldHVybiBhIC8gYjtcbn1cbnZlYzMgQUNFU0ZpbG1pY1RvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRjb25zdCBtYXQzIEFDRVNJbnB1dE1hdCA9IG1hdDMoXG5cdFx0dmVjMyggMC41OTcxOSwgMC4wNzYwMCwgMC4wMjg0MCApLFx0XHR2ZWMzKCAwLjM1NDU4LCAwLjkwODM0LCAwLjEzMzgzICksXG5cdFx0dmVjMyggMC4wNDgyMywgMC4wMTU2NiwgMC44Mzc3NyApXG5cdCk7XG5cdGNvbnN0IG1hdDMgQUNFU091dHB1dE1hdCA9IG1hdDMoXG5cdFx0dmVjMyggIDEuNjA0NzUsIC0wLjEwMjA4LCAtMC4wMDMyNyApLFx0XHR2ZWMzKCAtMC41MzEwOCwgIDEuMTA4MTMsIC0wLjA3Mjc2ICksXG5cdFx0dmVjMyggLTAuMDczNjcsIC0wLjAwNjA1LCAgMS4wNzYwMiApXG5cdCk7XG5cdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmUgLyAwLjY7XG5cdGNvbG9yID0gQUNFU0lucHV0TWF0ICogY29sb3I7XG5cdGNvbG9yID0gUlJUQW5kT0RURml0KCBjb2xvciApO1xuXHRjb2xvciA9IEFDRVNPdXRwdXRNYXQgKiBjb2xvcjtcblx0cmV0dXJuIHNhdHVyYXRlKCBjb2xvciApO1xufVxudmVjMyBDdXN0b21Ub25lTWFwcGluZyggdmVjMyBjb2xvciApIHsgcmV0dXJuIGNvbG9yOyB9Iix0cmFuc21pc3Npb25fZnJhZ21lbnQ6IiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OXG5cdGZsb2F0IHRyYW5zbWlzc2lvbkZhY3RvciA9IHRyYW5zbWlzc2lvbjtcblx0ZmxvYXQgdGhpY2tuZXNzRmFjdG9yID0gdGhpY2tuZXNzO1xuXHQjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTk1BUFxuXHRcdHRyYW5zbWlzc2lvbkZhY3RvciAqPSB0ZXh0dXJlMkQoIHRyYW5zbWlzc2lvbk1hcCwgdlV2ICkucjtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfVEhJQ0tORVNTTUFQXG5cdFx0dGhpY2tuZXNzRmFjdG9yICo9IHRleHR1cmUyRCggdGhpY2tuZXNzTWFwLCB2VXYgKS5nO1xuXHQjZW5kaWZcblx0dmVjMyBwb3MgPSB2V29ybGRQb3NpdGlvbi54eXogLyB2V29ybGRQb3NpdGlvbi53O1xuXHR2ZWMzIHYgPSBub3JtYWxpemUoIGNhbWVyYVBvc2l0aW9uIC0gcG9zICk7XG5cdHZlYzMgbiA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRmbG9hdCBpb3IgPSAoIDEuMCArIDAuNCAqIHJlZmxlY3Rpdml0eSApIC8gKCAxLjAgLSAwLjQgKiByZWZsZWN0aXZpdHkgKTtcblx0dmVjMyB0cmFuc21pc3Npb24gPSB0cmFuc21pc3Npb25GYWN0b3IgKiBnZXRJQkxWb2x1bWVSZWZyYWN0aW9uKFxuXHRcdG4sIHYsIHJvdWdobmVzc0ZhY3RvciwgbWF0ZXJpYWwuZGlmZnVzZUNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLFxuXHRcdHBvcywgbW9kZWxNYXRyaXgsIHZpZXdNYXRyaXgsIHByb2plY3Rpb25NYXRyaXgsIGlvciwgdGhpY2tuZXNzRmFjdG9yLFxuXHRcdGF0dGVudWF0aW9uVGludCwgYXR0ZW51YXRpb25EaXN0YW5jZSApO1xuXHR0b3RhbERpZmZ1c2UgPSBtaXgoIHRvdGFsRGlmZnVzZSwgdHJhbnNtaXNzaW9uLCB0cmFuc21pc3Npb25GYWN0b3IgKTtcbiNlbmRpZiIsdHJhbnNtaXNzaW9uX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OXG5cdCNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OTUFQXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgdHJhbnNtaXNzaW9uTWFwO1xuXHQjZW5kaWZcblx0I2lmZGVmIFVTRV9USElDS05FU1NNQVBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCB0aGlja25lc3NNYXA7XG5cdCNlbmRpZlxuXHR1bmlmb3JtIHZlYzIgdHJhbnNtaXNzaW9uU2FtcGxlclNpemU7XG5cdHVuaWZvcm0gc2FtcGxlcjJEIHRyYW5zbWlzc2lvblNhbXBsZXJNYXA7XG5cdHVuaWZvcm0gbWF0NCBtb2RlbE1hdHJpeDtcblx0dW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7XG5cdHZhcnlpbmcgdmVjNCB2V29ybGRQb3NpdGlvbjtcblx0dmVjMyBnZXRWb2x1bWVUcmFuc21pc3Npb25SYXkodmVjMyBuLCB2ZWMzIHYsIGZsb2F0IHRoaWNrbmVzcywgZmxvYXQgaW9yLCBtYXQ0IG1vZGVsTWF0cml4KSB7XG5cdFx0dmVjMyByZWZyYWN0aW9uVmVjdG9yID0gcmVmcmFjdCgtdiwgbm9ybWFsaXplKG4pLCAxLjAgLyBpb3IpO1xuXHRcdHZlYzMgbW9kZWxTY2FsZTtcblx0XHRtb2RlbFNjYWxlLnggPSBsZW5ndGgodmVjMyhtb2RlbE1hdHJpeFswXS54eXopKTtcblx0XHRtb2RlbFNjYWxlLnkgPSBsZW5ndGgodmVjMyhtb2RlbE1hdHJpeFsxXS54eXopKTtcblx0XHRtb2RlbFNjYWxlLnogPSBsZW5ndGgodmVjMyhtb2RlbE1hdHJpeFsyXS54eXopKTtcblx0XHRyZXR1cm4gbm9ybWFsaXplKHJlZnJhY3Rpb25WZWN0b3IpICogdGhpY2tuZXNzICogbW9kZWxTY2FsZTtcblx0fVxuXHRmbG9hdCBhcHBseUlvclRvUm91Z2huZXNzKGZsb2F0IHJvdWdobmVzcywgZmxvYXQgaW9yKSB7XG5cdFx0cmV0dXJuIHJvdWdobmVzcyAqIGNsYW1wKGlvciAqIDIuMCAtIDIuMCwgMC4wLCAxLjApO1xuXHR9XG5cdHZlYzMgZ2V0VHJhbnNtaXNzaW9uU2FtcGxlKHZlYzIgZnJhZ0Nvb3JkLCBmbG9hdCByb3VnaG5lc3MsIGZsb2F0IGlvcikge1xuXHRcdGZsb2F0IGZyYW1lYnVmZmVyTG9kID0gbG9nMih0cmFuc21pc3Npb25TYW1wbGVyU2l6ZS54KSAqIGFwcGx5SW9yVG9Sb3VnaG5lc3Mocm91Z2huZXNzLCBpb3IpO1xuXHRcdHJldHVybiB0ZXh0dXJlMkRMb2RFWFQodHJhbnNtaXNzaW9uU2FtcGxlck1hcCwgZnJhZ0Nvb3JkLnh5LCBmcmFtZWJ1ZmZlckxvZCkucmdiO1xuXHR9XG5cdHZlYzMgYXBwbHlWb2x1bWVBdHRlbnVhdGlvbih2ZWMzIHJhZGlhbmNlLCBmbG9hdCB0cmFuc21pc3Npb25EaXN0YW5jZSwgdmVjMyBhdHRlbnVhdGlvbkNvbG9yLCBmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlKSB7XG5cdFx0aWYgKGF0dGVudWF0aW9uRGlzdGFuY2UgPT0gMC4wKSB7XG5cdFx0XHRyZXR1cm4gcmFkaWFuY2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZlYzMgYXR0ZW51YXRpb25Db2VmZmljaWVudCA9IC1sb2coYXR0ZW51YXRpb25Db2xvcikgLyBhdHRlbnVhdGlvbkRpc3RhbmNlO1xuXHRcdFx0dmVjMyB0cmFuc21pdHRhbmNlID0gZXhwKC1hdHRlbnVhdGlvbkNvZWZmaWNpZW50ICogdHJhbnNtaXNzaW9uRGlzdGFuY2UpO1x0XHRcdHJldHVybiB0cmFuc21pdHRhbmNlICogcmFkaWFuY2U7XG5cdFx0fVxuXHR9XG5cdHZlYzMgZ2V0SUJMVm9sdW1lUmVmcmFjdGlvbih2ZWMzIG4sIHZlYzMgdiwgZmxvYXQgcGVyY2VwdHVhbFJvdWdobmVzcywgdmVjMyBiYXNlQ29sb3IsIHZlYzMgc3BlY3VsYXJDb2xvcixcblx0XHR2ZWMzIHBvc2l0aW9uLCBtYXQ0IG1vZGVsTWF0cml4LCBtYXQ0IHZpZXdNYXRyaXgsIG1hdDQgcHJvak1hdHJpeCwgZmxvYXQgaW9yLCBmbG9hdCB0aGlja25lc3MsXG5cdFx0dmVjMyBhdHRlbnVhdGlvbkNvbG9yLCBmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlKSB7XG5cdFx0dmVjMyB0cmFuc21pc3Npb25SYXkgPSBnZXRWb2x1bWVUcmFuc21pc3Npb25SYXkobiwgdiwgdGhpY2tuZXNzLCBpb3IsIG1vZGVsTWF0cml4KTtcblx0XHR2ZWMzIHJlZnJhY3RlZFJheUV4aXQgPSBwb3NpdGlvbiArIHRyYW5zbWlzc2lvblJheTtcblx0XHR2ZWM0IG5kY1BvcyA9IHByb2pNYXRyaXggKiB2aWV3TWF0cml4ICogdmVjNChyZWZyYWN0ZWRSYXlFeGl0LCAxLjApO1xuXHRcdHZlYzIgcmVmcmFjdGlvbkNvb3JkcyA9IG5kY1Bvcy54eSAvIG5kY1Bvcy53O1xuXHRcdHJlZnJhY3Rpb25Db29yZHMgKz0gMS4wO1xuXHRcdHJlZnJhY3Rpb25Db29yZHMgLz0gMi4wO1xuXHRcdHZlYzMgdHJhbnNtaXR0ZWRMaWdodCA9IGdldFRyYW5zbWlzc2lvblNhbXBsZShyZWZyYWN0aW9uQ29vcmRzLCBwZXJjZXB0dWFsUm91Z2huZXNzLCBpb3IpO1xuXHRcdHZlYzMgYXR0ZW51YXRlZENvbG9yID0gYXBwbHlWb2x1bWVBdHRlbnVhdGlvbih0cmFuc21pdHRlZExpZ2h0LCBsZW5ndGgodHJhbnNtaXNzaW9uUmF5KSwgYXR0ZW51YXRpb25Db2xvciwgYXR0ZW51YXRpb25EaXN0YW5jZSk7XG5cdFx0cmV0dXJuICgxLjAgLSBzcGVjdWxhckNvbG9yKSAqIGF0dGVudWF0ZWRDb2xvciAqIGJhc2VDb2xvcjtcblx0fVxuI2VuZGlmIix1dl9wYXJzX2ZyYWdtZW50OiIjaWYgKCBkZWZpbmVkKCBVU0VfVVYgKSAmJiAhIGRlZmluZWQoIFVWU19WRVJURVhfT05MWSApIClcblx0dmFyeWluZyB2ZWMyIHZVdjtcbiNlbmRpZiIsdXZfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfVVZcblx0I2lmZGVmIFVWU19WRVJURVhfT05MWVxuXHRcdHZlYzIgdlV2O1xuXHQjZWxzZVxuXHRcdHZhcnlpbmcgdmVjMiB2VXY7XG5cdCNlbmRpZlxuXHR1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XG4jZW5kaWYiLHV2X3ZlcnRleDoiI2lmZGVmIFVTRV9VVlxuXHR2VXYgPSAoIHV2VHJhbnNmb3JtICogdmVjMyggdXYsIDEgKSApLnh5O1xuI2VuZGlmIix1djJfcGFyc19mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXG5cdHZhcnlpbmcgdmVjMiB2VXYyO1xuI2VuZGlmIix1djJfcGFyc192ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxuXHRhdHRyaWJ1dGUgdmVjMiB1djI7XG5cdHZhcnlpbmcgdmVjMiB2VXYyO1xuXHR1bmlmb3JtIG1hdDMgdXYyVHJhbnNmb3JtO1xuI2VuZGlmIix1djJfdmVydGV4OiIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcblx0dlV2MiA9ICggdXYyVHJhbnNmb3JtICogdmVjMyggdXYyLCAxICkgKS54eTtcbiNlbmRpZiIsd29ybGRwb3NfdmVydGV4OiIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQoIERJU1RBTkNFICkgfHwgZGVmaW5lZCAoIFVTRV9TSEFET1dNQVAgKSB8fCBkZWZpbmVkICggVVNFX1RSQU5TTUlTU0lPTiApXG5cdHZlYzQgd29ybGRQb3NpdGlvbiA9IHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcblx0I2lmZGVmIFVTRV9JTlNUQU5DSU5HXG5cdFx0d29ybGRQb3NpdGlvbiA9IGluc3RhbmNlTWF0cml4ICogd29ybGRQb3NpdGlvbjtcblx0I2VuZGlmXG5cdHdvcmxkUG9zaXRpb24gPSBtb2RlbE1hdHJpeCAqIHdvcmxkUG9zaXRpb247XG4jZW5kaWYiLGJhY2tncm91bmRfZnJhZzoidW5pZm9ybSBzYW1wbGVyMkQgdDJEO1xudmFyeWluZyB2ZWMyIHZVdjtcbnZvaWQgbWFpbigpIHtcblx0dmVjNCB0ZXhDb2xvciA9IHRleHR1cmUyRCggdDJELCB2VXYgKTtcblx0Z2xfRnJhZ0NvbG9yID0gbWFwVGV4ZWxUb0xpbmVhciggdGV4Q29sb3IgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxufSIsYmFja2dyb3VuZF92ZXJ0OiJ2YXJ5aW5nIHZlYzIgdlV2O1xudW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xudm9pZCBtYWluKCkge1xuXHR2VXYgPSAoIHV2VHJhbnNmb3JtICogdmVjMyggdXYsIDEgKSApLnh5O1xuXHRnbF9Qb3NpdGlvbiA9IHZlYzQoIHBvc2l0aW9uLnh5LCAxLjAsIDEuMCApO1xufSIsY3ViZV9mcmFnOiIjaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PlxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdHZlYzMgdlJlZmxlY3QgPSB2V29ybGREaXJlY3Rpb247XG5cdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+XG5cdGdsX0ZyYWdDb2xvciA9IGVudkNvbG9yO1xuXHRnbF9GcmFnQ29sb3IuYSAqPSBvcGFjaXR5O1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG59IixjdWJlX3ZlcnQ6InZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG4jaW5jbHVkZSA8Y29tbW9uPlxudm9pZCBtYWluKCkge1xuXHR2V29ybGREaXJlY3Rpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApO1xuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdGdsX1Bvc2l0aW9uLnogPSBnbF9Qb3NpdGlvbi53O1xufSIsZGVwdGhfZnJhZzoiI2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMFxuXHR1bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZhcnlpbmcgdmVjMiB2SGlnaFByZWNpc2lvblpXO1xudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApO1xuXHQjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXG5cdFx0ZGlmZnVzZUNvbG9yLmEgPSBvcGFjaXR5O1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdGZsb2F0IGZyYWdDb29yZFogPSAwLjUgKiB2SGlnaFByZWNpc2lvblpXWzBdIC8gdkhpZ2hQcmVjaXNpb25aV1sxXSArIDAuNTtcblx0I2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMFxuXHRcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIHZlYzMoIDEuMCAtIGZyYWdDb29yZFogKSwgb3BhY2l0eSApO1xuXHQjZWxpZiBERVBUSF9QQUNLSU5HID09IDMyMDFcblx0XHRnbF9GcmFnQ29sb3IgPSBwYWNrRGVwdGhUb1JHQkEoIGZyYWdDb29yZFogKTtcblx0I2VuZGlmXG59IixkZXB0aF92ZXJ0OiIjaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52YXJ5aW5nIHZlYzIgdkhpZ2hQcmVjaXNpb25aVztcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cblx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0XHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHRcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxuXHQjZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdHZIaWdoUHJlY2lzaW9uWlcgPSBnbF9Qb3NpdGlvbi56dztcbn0iLGRpc3RhbmNlUkdCQV9mcmFnOiIjZGVmaW5lIERJU1RBTkNFXG51bmlmb3JtIHZlYzMgcmVmZXJlbmNlUG9zaXRpb247XG51bmlmb3JtIGZsb2F0IG5lYXJEaXN0YW5jZTtcbnVuaWZvcm0gZmxvYXQgZmFyRGlzdGFuY2U7XG52YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHBhY2tpbmc+XG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluICgpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCAxLjAgKTtcblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHRmbG9hdCBkaXN0ID0gbGVuZ3RoKCB2V29ybGRQb3NpdGlvbiAtIHJlZmVyZW5jZVBvc2l0aW9uICk7XG5cdGRpc3QgPSAoIGRpc3QgLSBuZWFyRGlzdGFuY2UgKSAvICggZmFyRGlzdGFuY2UgLSBuZWFyRGlzdGFuY2UgKTtcblx0ZGlzdCA9IHNhdHVyYXRlKCBkaXN0ICk7XG5cdGdsX0ZyYWdDb2xvciA9IHBhY2tEZXB0aFRvUkdCQSggZGlzdCApO1xufSIsZGlzdGFuY2VSR0JBX3ZlcnQ6IiNkZWZpbmUgRElTVEFOQ0VcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cblx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0XHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHRcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxuXHQjZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdHZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbi54eXo7XG59IixlcXVpcmVjdF9mcmFnOiJ1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7XG52YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2luY2x1ZGUgPGNvbW1vbj5cbnZvaWQgbWFpbigpIHtcblx0dmVjMyBkaXJlY3Rpb24gPSBub3JtYWxpemUoIHZXb3JsZERpcmVjdGlvbiApO1xuXHR2ZWMyIHNhbXBsZVVWID0gZXF1aXJlY3RVdiggZGlyZWN0aW9uICk7XG5cdHZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTtcblx0Z2xfRnJhZ0NvbG9yID0gbWFwVGV4ZWxUb0xpbmVhciggdGV4Q29sb3IgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxufSIsZXF1aXJlY3RfdmVydDoidmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIDxjb21tb24+XG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cbn0iLGxpbmVkYXNoZWRfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG51bmlmb3JtIGZsb2F0IGRhc2hTaXplO1xudW5pZm9ybSBmbG9hdCB0b3RhbFNpemU7XG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0aWYgKCBtb2QoIHZMaW5lRGlzdGFuY2UsIHRvdGFsU2l6ZSApID4gZGFzaFNpemUgKSB7XG5cdFx0ZGlzY2FyZDtcblx0fVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTtcblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXHRvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cbn0iLGxpbmVkYXNoZWRfdmVydDoidW5pZm9ybSBmbG9hdCBzY2FsZTtcbmF0dHJpYnV0ZSBmbG9hdCBsaW5lRGlzdGFuY2U7XG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdHZMaW5lRGlzdGFuY2UgPSBzY2FsZSAqIGxpbmVEaXN0YW5jZTtcblx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XG59IixtZXNoYmFzaWNfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD5cblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0I2lmZGVmIFVTRV9MSUdIVE1BUFxuXHRcblx0XHR2ZWM0IGxpZ2h0TWFwVGV4ZWw9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gbGlnaHRNYXBUZXhlbFRvTGluZWFyKCBsaWdodE1hcFRleGVsICkucmdiICogbGlnaHRNYXBJbnRlbnNpdHk7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IHZlYzMoIDEuMCApO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gZGlmZnVzZUNvbG9yLnJnYjtcblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlO1xuXHQjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50PlxufSIsbWVzaGJhc2ljX3ZlcnQ6IiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cblx0I2lmIGRlZmluZWQgKCBVU0VfRU5WTUFQICkgfHwgZGVmaW5lZCAoIFVTRV9TS0lOTklORyApXG5cdFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cblx0XHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHRcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxuXHRcdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cblx0I2VuZGlmXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn0iLG1lc2hsYW1iZXJ0X2ZyYWc6InVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xudmFyeWluZyB2ZWMzIHZMaWdodEZyb250O1xudmFyeWluZyB2ZWMzIHZJbmRpcmVjdEZyb250O1xuI2lmZGVmIERPVUJMRV9TSURFRFxuXHR2YXJ5aW5nIHZlYzMgdkxpZ2h0QmFjaztcblx0dmFyeWluZyB2ZWMzIHZJbmRpcmVjdEJhY2s7XG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJzZGZzPlxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNoYWRvd21hc2tfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSAoIGdsX0Zyb250RmFjaW5nICkgPyB2SW5kaXJlY3RGcm9udCA6IHZJbmRpcmVjdEJhY2s7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IHZJbmRpcmVjdEZyb250O1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgPGxpZ2h0bWFwX2ZyYWdtZW50PlxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gQlJERl9EaWZmdXNlX0xhbWJlcnQoIGRpZmZ1c2VDb2xvci5yZ2IgKTtcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgPSAoIGdsX0Zyb250RmFjaW5nICkgPyB2TGlnaHRGcm9udCA6IHZMaWdodEJhY2s7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSA9IHZMaWdodEZyb250O1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSAqPSBCUkRGX0RpZmZ1c2VfTGFtYmVydCggZGlmZnVzZUNvbG9yLnJnYiApICogZ2V0U2hhZG93TWFzaygpO1xuXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5cdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XG59IixtZXNobGFtYmVydF92ZXJ0OiIjZGVmaW5lIExBTUJFUlRcbnZhcnlpbmcgdmVjMyB2TGlnaHRGcm9udDtcbnZhcnlpbmcgdmVjMyB2SW5kaXJlY3RGcm9udDtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dmFyeWluZyB2ZWMzIHZMaWdodEJhY2s7XG5cdHZhcnlpbmcgdmVjMyB2SW5kaXJlY3RCYWNrO1xuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8YnNkZnM+XG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx1djJfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsaWdodHNfbGFtYmVydF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn0iLG1lc2htYXRjYXBfZnJhZzoiI2RlZmluZSBNQVRDQVBcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xudW5pZm9ybSBzYW1wbGVyMkQgbWF0Y2FwO1xudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxuXHR2ZWMzIHZpZXdEaXIgPSBub3JtYWxpemUoIHZWaWV3UG9zaXRpb24gKTtcblx0dmVjMyB4ID0gbm9ybWFsaXplKCB2ZWMzKCB2aWV3RGlyLnosIDAuMCwgLSB2aWV3RGlyLnggKSApO1xuXHR2ZWMzIHkgPSBjcm9zcyggdmlld0RpciwgeCApO1xuXHR2ZWMyIHV2ID0gdmVjMiggZG90KCB4LCBub3JtYWwgKSwgZG90KCB5LCBub3JtYWwgKSApICogMC40OTUgKyAwLjU7XG5cdCNpZmRlZiBVU0VfTUFUQ0FQXG5cdFx0dmVjNCBtYXRjYXBDb2xvciA9IHRleHR1cmUyRCggbWF0Y2FwLCB1diApO1xuXHRcdG1hdGNhcENvbG9yID0gbWF0Y2FwVGV4ZWxUb0xpbmVhciggbWF0Y2FwQ29sb3IgKTtcblx0I2Vsc2Vcblx0XHR2ZWM0IG1hdGNhcENvbG9yID0gdmVjNCggMS4wICk7XG5cdCNlbmRpZlxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiICogbWF0Y2FwQ29sb3IucmdiO1xuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50PlxufSIsbWVzaG1hdGNhcF92ZXJ0OiIjZGVmaW5lIE1BVENBUFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cblx0I2lmbmRlZiBGTEFUX1NIQURFRFxuXHRcdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG5cdFx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0XHR2VGFuZ2VudCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWRUYW5nZW50ICk7XG5cdFx0XHR2Qml0YW5nZW50ID0gbm9ybWFsaXplKCBjcm9zcyggdk5vcm1hbCwgdlRhbmdlbnQgKSAqIHRhbmdlbnQudyApO1xuXHRcdCNlbmRpZlxuXHQjZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxuXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcbn0iLG1lc2h0b29uX2ZyYWc6IiNkZWZpbmUgVE9PTlxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHBhY2tpbmc+XG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Z3JhZGllbnRtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxic2Rmcz5cbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cbiNpbmNsdWRlIDxsaWdodHNfdG9vbl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxuXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxsaWdodHNfdG9vbl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9iZWdpbj5cblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD5cblx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50PlxufSIsbWVzaHRvb25fdmVydDoiI2RlZmluZSBUT09OXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuI2VuZGlmXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufSIsbWVzaHBob25nX2ZyYWc6IiNkZWZpbmUgUEhPTkdcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xudW5pZm9ybSB2ZWMzIHNwZWN1bGFyO1xudW5pZm9ybSBmbG9hdCBzaGluaW5lc3M7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHBhY2tpbmc+XG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxic2Rmcz5cbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cbiNpbmNsdWRlIDxsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPlxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XG5cdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGxpZ2h0c19waG9uZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9iZWdpbj5cblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD5cblx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xuXHQjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50PlxufSIsbWVzaHBob25nX3ZlcnQ6IiNkZWZpbmUgUEhPTkdcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuI2VuZGlmXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn0iLG1lc2hwaHlzaWNhbF9mcmFnOiIjZGVmaW5lIFNUQU5EQVJEXG4jaWZkZWYgUEhZU0lDQUxcblx0I2RlZmluZSBSRUZMRUNUSVZJVFlcblx0I2RlZmluZSBDTEVBUkNPQVRcblx0I2RlZmluZSBTUEVDVUxBUlxuI2VuZGlmXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcbnVuaWZvcm0gZmxvYXQgcm91Z2huZXNzO1xudW5pZm9ybSBmbG9hdCBtZXRhbG5lc3M7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaWZkZWYgVVNFX1RSQU5TTUlTU0lPTlxuXHR1bmlmb3JtIGZsb2F0IHRyYW5zbWlzc2lvbjtcblx0dW5pZm9ybSBmbG9hdCB0aGlja25lc3M7XG5cdHVuaWZvcm0gZmxvYXQgYXR0ZW51YXRpb25EaXN0YW5jZTtcblx0dW5pZm9ybSB2ZWMzIGF0dGVudWF0aW9uVGludDtcbiNlbmRpZlxuI2lmZGVmIFJFRkxFQ1RJVklUWVxuXHR1bmlmb3JtIGZsb2F0IHJlZmxlY3Rpdml0eTtcbiNlbmRpZlxuI2lmZGVmIFNQRUNVTEFSXG5cdHVuaWZvcm0gZmxvYXQgc3BlY3VsYXJJbnRlbnNpdHk7XG5cdHVuaWZvcm0gdmVjMyBzcGVjdWxhclRpbnQ7XG5cdCNpZmRlZiBVU0VfU1BFQ1VMQVJJTlRFTlNJVFlNQVBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhckludGVuc2l0eU1hcDtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfU1BFQ1VMQVJUSU5UTUFQXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgc3BlY3VsYXJUaW50TWFwO1xuXHQjZW5kaWZcbiNlbmRpZlxuI2lmZGVmIENMRUFSQ09BVFxuXHR1bmlmb3JtIGZsb2F0IGNsZWFyY29hdDtcblx0dW5pZm9ybSBmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7XG4jZW5kaWZcbiNpZmRlZiBVU0VfU0hFRU5cblx0dW5pZm9ybSB2ZWMzIHNoZWVuO1xuI2VuZGlmXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxic2Rmcz5cbiNpbmNsdWRlIDx0cmFuc21pc3Npb25fcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxuI2luY2x1ZGUgPGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGVhcmNvYXRfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPHJvdWdobmVzc21hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG1ldGFsbmVzc21hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxuXHQjaW5jbHVkZSA8Y2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9iZWdpbj5cblx0I2luY2x1ZGUgPGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwcz5cblx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+XG5cdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPlxuXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XG5cdHZlYzMgdG90YWxEaWZmdXNlID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZTtcblx0dmVjMyB0b3RhbFNwZWN1bGFyID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyO1xuXHQjaW5jbHVkZSA8dHJhbnNtaXNzaW9uX2ZyYWdtZW50PlxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSB0b3RhbERpZmZ1c2UgKyB0b3RhbFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50PlxufSIsbWVzaHBoeXNpY2FsX3ZlcnQ6IiNkZWZpbmUgU1RBTkRBUkRcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZlxuI2lmZGVmIFVTRV9UUkFOU01JU1NJT05cblx0dmFyeWluZyB2ZWM0IHZXb3JsZFBvc2l0aW9uO1xuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx1djJfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dlRhbmdlbnQgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkVGFuZ2VudCApO1xuXHRcdHZCaXRhbmdlbnQgPSBub3JtYWxpemUoIGNyb3NzKCB2Tm9ybWFsLCB2VGFuZ2VudCApICogdGFuZ2VudC53ICk7XG5cdCNlbmRpZlxuI2VuZGlmXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxuI2lmZGVmIFVTRV9UUkFOU01JU1NJT05cblx0dldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uO1xuI2VuZGlmXG59Iixub3JtYWxfZnJhZzoiI2RlZmluZSBOT1JNQUxcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz5cblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggcGFja05vcm1hbFRvUkdCKCBub3JtYWwgKSwgb3BhY2l0eSApO1xufSIsbm9ybWFsX3ZlcnQ6IiNkZWZpbmUgTk9STUFMXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKVxuXHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNlbmRpZlxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dlRhbmdlbnQgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkVGFuZ2VudCApO1xuXHRcdHZCaXRhbmdlbnQgPSBub3JtYWxpemUoIGNyb3NzKCB2Tm9ybWFsLCB2VGFuZ2VudCApICogdGFuZ2VudC53ICk7XG5cdCNlbmRpZlxuI2VuZGlmXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XG4jZW5kaWZcbn0iLHBvaW50c19mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTtcblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG1hcF9wYXJ0aWNsZV9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHRvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cbn0iLHBvaW50c192ZXJ0OiJ1bmlmb3JtIGZsb2F0IHNpemU7XG51bmlmb3JtIGZsb2F0IHNjYWxlO1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdGdsX1BvaW50U2l6ZSA9IHNpemU7XG5cdCNpZmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OXG5cdFx0Ym9vbCBpc1BlcnNwZWN0aXZlID0gaXNQZXJzcGVjdGl2ZU1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApO1xuXHRcdGlmICggaXNQZXJzcGVjdGl2ZSApIGdsX1BvaW50U2l6ZSAqPSAoIHNjYWxlIC8gLSBtdlBvc2l0aW9uLnogKTtcblx0I2VuZGlmXG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn0iLHNoYWRvd19mcmFnOiJ1bmlmb3JtIHZlYzMgY29sb3I7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHBhY2tpbmc+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YnNkZnM+XG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFza19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBjb2xvciwgb3BhY2l0eSAqICggMS4wIC0gZ2V0U2hhZG93TWFzaygpICkgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxufSIsc2hhZG93X3ZlcnQ6IiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufSIsc3ByaXRlX2ZyYWc6InVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0b3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cbn0iLHNwcml0ZV92ZXJ0OiJ1bmlmb3JtIGZsb2F0IHJvdGF0aW9uO1xudW5pZm9ybSB2ZWMyIGNlbnRlcjtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0dmVjNCBtdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7XG5cdHZlYzIgc2NhbGU7XG5cdHNjYWxlLnggPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAwIF0ueCwgbW9kZWxNYXRyaXhbIDAgXS55LCBtb2RlbE1hdHJpeFsgMCBdLnogKSApO1xuXHRzY2FsZS55ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMSBdLngsIG1vZGVsTWF0cml4WyAxIF0ueSwgbW9kZWxNYXRyaXhbIDEgXS56ICkgKTtcblx0I2lmbmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OXG5cdFx0Ym9vbCBpc1BlcnNwZWN0aXZlID0gaXNQZXJzcGVjdGl2ZU1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApO1xuXHRcdGlmICggaXNQZXJzcGVjdGl2ZSApIHNjYWxlICo9IC0gbXZQb3NpdGlvbi56O1xuXHQjZW5kaWZcblx0dmVjMiBhbGlnbmVkUG9zaXRpb24gPSAoIHBvc2l0aW9uLnh5IC0gKCBjZW50ZXIgLSB2ZWMyKCAwLjUgKSApICkgKiBzY2FsZTtcblx0dmVjMiByb3RhdGVkUG9zaXRpb247XG5cdHJvdGF0ZWRQb3NpdGlvbi54ID0gY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggLSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTtcblx0cm90YXRlZFBvc2l0aW9uLnkgPSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCArIGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55O1xuXHRtdlBvc2l0aW9uLnh5ICs9IHJvdGF0ZWRQb3NpdGlvbjtcblx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufSJ9LHpzdD17Y29tbW9uOntkaWZmdXNlOnt2YWx1ZTpuZXcgUnJ0KDE2Nzc3MjE1KX0sb3BhY2l0eTp7dmFsdWU6MX0sbWFwOnt2YWx1ZTpudWxsfSx1dlRyYW5zZm9ybTp7dmFsdWU6bmV3ICRpdH0sdXYyVHJhbnNmb3JtOnt2YWx1ZTpuZXcgJGl0fSxhbHBoYU1hcDp7dmFsdWU6bnVsbH19LHNwZWN1bGFybWFwOntzcGVjdWxhck1hcDp7dmFsdWU6bnVsbH19LGVudm1hcDp7ZW52TWFwOnt2YWx1ZTpudWxsfSxmbGlwRW52TWFwOnt2YWx1ZTotMX0scmVmbGVjdGl2aXR5Ont2YWx1ZToxfSxyZWZyYWN0aW9uUmF0aW86e3ZhbHVlOi45OH0sbWF4TWlwTGV2ZWw6e3ZhbHVlOjB9fSxhb21hcDp7YW9NYXA6e3ZhbHVlOm51bGx9LGFvTWFwSW50ZW5zaXR5Ont2YWx1ZToxfX0sbGlnaHRtYXA6e2xpZ2h0TWFwOnt2YWx1ZTpudWxsfSxsaWdodE1hcEludGVuc2l0eTp7dmFsdWU6MX19LGVtaXNzaXZlbWFwOntlbWlzc2l2ZU1hcDp7dmFsdWU6bnVsbH19LGJ1bXBtYXA6e2J1bXBNYXA6e3ZhbHVlOm51bGx9LGJ1bXBTY2FsZTp7dmFsdWU6MX19LG5vcm1hbG1hcDp7bm9ybWFsTWFwOnt2YWx1ZTpudWxsfSxub3JtYWxTY2FsZTp7dmFsdWU6bmV3IFFpdCgxLDEpfX0sZGlzcGxhY2VtZW50bWFwOntkaXNwbGFjZW1lbnRNYXA6e3ZhbHVlOm51bGx9LGRpc3BsYWNlbWVudFNjYWxlOnt2YWx1ZToxfSxkaXNwbGFjZW1lbnRCaWFzOnt2YWx1ZTowfX0scm91Z2huZXNzbWFwOntyb3VnaG5lc3NNYXA6e3ZhbHVlOm51bGx9fSxtZXRhbG5lc3NtYXA6e21ldGFsbmVzc01hcDp7dmFsdWU6bnVsbH19LGdyYWRpZW50bWFwOntncmFkaWVudE1hcDp7dmFsdWU6bnVsbH19LGZvZzp7Zm9nRGVuc2l0eTp7dmFsdWU6MjVlLTV9LGZvZ05lYXI6e3ZhbHVlOjF9LGZvZ0Zhcjp7dmFsdWU6MmUzfSxmb2dDb2xvcjp7dmFsdWU6bmV3IFJydCgxNjc3NzIxNSl9fSxsaWdodHM6e2FtYmllbnRMaWdodENvbG9yOnt2YWx1ZTpbXX0sbGlnaHRQcm9iZTp7dmFsdWU6W119LGRpcmVjdGlvbmFsTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntkaXJlY3Rpb246e30sY29sb3I6e319fSxkaXJlY3Rpb25hbExpZ2h0U2hhZG93czp7dmFsdWU6W10scHJvcGVydGllczp7c2hhZG93Qmlhczp7fSxzaGFkb3dOb3JtYWxCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9fX0sZGlyZWN0aW9uYWxTaGFkb3dNYXA6e3ZhbHVlOltdfSxkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDp7dmFsdWU6W119LHNwb3RMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2NvbG9yOnt9LHBvc2l0aW9uOnt9LGRpcmVjdGlvbjp7fSxkaXN0YW5jZTp7fSxjb25lQ29zOnt9LHBlbnVtYnJhQ29zOnt9LGRlY2F5Ont9fX0sc3BvdExpZ2h0U2hhZG93czp7dmFsdWU6W10scHJvcGVydGllczp7c2hhZG93Qmlhczp7fSxzaGFkb3dOb3JtYWxCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9fX0sc3BvdFNoYWRvd01hcDp7dmFsdWU6W119LHNwb3RTaGFkb3dNYXRyaXg6e3ZhbHVlOltdfSxwb2ludExpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7Y29sb3I6e30scG9zaXRpb246e30sZGVjYXk6e30sZGlzdGFuY2U6e319fSxwb2ludExpZ2h0U2hhZG93czp7dmFsdWU6W10scHJvcGVydGllczp7c2hhZG93Qmlhczp7fSxzaGFkb3dOb3JtYWxCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9LHNoYWRvd0NhbWVyYU5lYXI6e30sc2hhZG93Q2FtZXJhRmFyOnt9fX0scG9pbnRTaGFkb3dNYXA6e3ZhbHVlOltdfSxwb2ludFNoYWRvd01hdHJpeDp7dmFsdWU6W119LGhlbWlzcGhlcmVMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2RpcmVjdGlvbjp7fSxza3lDb2xvcjp7fSxncm91bmRDb2xvcjp7fX19LHJlY3RBcmVhTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSxwb3NpdGlvbjp7fSx3aWR0aDp7fSxoZWlnaHQ6e319fSxsdGNfMTp7dmFsdWU6bnVsbH0sbHRjXzI6e3ZhbHVlOm51bGx9fSxwb2ludHM6e2RpZmZ1c2U6e3ZhbHVlOm5ldyBScnQoMTY3NzcyMTUpfSxvcGFjaXR5Ont2YWx1ZToxfSxzaXplOnt2YWx1ZToxfSxzY2FsZTp7dmFsdWU6MX0sbWFwOnt2YWx1ZTpudWxsfSxhbHBoYU1hcDp7dmFsdWU6bnVsbH0sdXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyAkaXR9fSxzcHJpdGU6e2RpZmZ1c2U6e3ZhbHVlOm5ldyBScnQoMTY3NzcyMTUpfSxvcGFjaXR5Ont2YWx1ZToxfSxjZW50ZXI6e3ZhbHVlOm5ldyBRaXQoLjUsLjUpfSxyb3RhdGlvbjp7dmFsdWU6MH0sbWFwOnt2YWx1ZTpudWxsfSxhbHBoYU1hcDp7dmFsdWU6bnVsbH0sdXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyAkaXR9fX0sSXN0PXtiYXNpYzp7dW5pZm9ybXM6Z3N0KFt6c3QuY29tbW9uLHpzdC5zcGVjdWxhcm1hcCx6c3QuZW52bWFwLHpzdC5hb21hcCx6c3QubGlnaHRtYXAsenN0LmZvZ10pLHZlcnRleFNoYWRlcjpOc3QubWVzaGJhc2ljX3ZlcnQsZnJhZ21lbnRTaGFkZXI6TnN0Lm1lc2hiYXNpY19mcmFnfSxsYW1iZXJ0Ont1bmlmb3Jtczpnc3QoW3pzdC5jb21tb24senN0LnNwZWN1bGFybWFwLHpzdC5lbnZtYXAsenN0LmFvbWFwLHpzdC5saWdodG1hcCx6c3QuZW1pc3NpdmVtYXAsenN0LmZvZyx6c3QubGlnaHRzLHtlbWlzc2l2ZTp7dmFsdWU6bmV3IFJydCgwKX19XSksdmVydGV4U2hhZGVyOk5zdC5tZXNobGFtYmVydF92ZXJ0LGZyYWdtZW50U2hhZGVyOk5zdC5tZXNobGFtYmVydF9mcmFnfSxwaG9uZzp7dW5pZm9ybXM6Z3N0KFt6c3QuY29tbW9uLHpzdC5zcGVjdWxhcm1hcCx6c3QuZW52bWFwLHpzdC5hb21hcCx6c3QubGlnaHRtYXAsenN0LmVtaXNzaXZlbWFwLHpzdC5idW1wbWFwLHpzdC5ub3JtYWxtYXAsenN0LmRpc3BsYWNlbWVudG1hcCx6c3QuZm9nLHpzdC5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgUnJ0KDApfSxzcGVjdWxhcjp7dmFsdWU6bmV3IFJydCgxMTE4NDgxKX0sc2hpbmluZXNzOnt2YWx1ZTozMH19XSksdmVydGV4U2hhZGVyOk5zdC5tZXNocGhvbmdfdmVydCxmcmFnbWVudFNoYWRlcjpOc3QubWVzaHBob25nX2ZyYWd9LHN0YW5kYXJkOnt1bmlmb3Jtczpnc3QoW3pzdC5jb21tb24senN0LmVudm1hcCx6c3QuYW9tYXAsenN0LmxpZ2h0bWFwLHpzdC5lbWlzc2l2ZW1hcCx6c3QuYnVtcG1hcCx6c3Qubm9ybWFsbWFwLHpzdC5kaXNwbGFjZW1lbnRtYXAsenN0LnJvdWdobmVzc21hcCx6c3QubWV0YWxuZXNzbWFwLHpzdC5mb2csenN0LmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyBScnQoMCl9LHJvdWdobmVzczp7dmFsdWU6MX0sbWV0YWxuZXNzOnt2YWx1ZTowfSxlbnZNYXBJbnRlbnNpdHk6e3ZhbHVlOjF9fV0pLHZlcnRleFNoYWRlcjpOc3QubWVzaHBoeXNpY2FsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6TnN0Lm1lc2hwaHlzaWNhbF9mcmFnfSx0b29uOnt1bmlmb3Jtczpnc3QoW3pzdC5jb21tb24senN0LmFvbWFwLHpzdC5saWdodG1hcCx6c3QuZW1pc3NpdmVtYXAsenN0LmJ1bXBtYXAsenN0Lm5vcm1hbG1hcCx6c3QuZGlzcGxhY2VtZW50bWFwLHpzdC5ncmFkaWVudG1hcCx6c3QuZm9nLHpzdC5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgUnJ0KDApfX1dKSx2ZXJ0ZXhTaGFkZXI6TnN0Lm1lc2h0b29uX3ZlcnQsZnJhZ21lbnRTaGFkZXI6TnN0Lm1lc2h0b29uX2ZyYWd9LG1hdGNhcDp7dW5pZm9ybXM6Z3N0KFt6c3QuY29tbW9uLHpzdC5idW1wbWFwLHpzdC5ub3JtYWxtYXAsenN0LmRpc3BsYWNlbWVudG1hcCx6c3QuZm9nLHttYXRjYXA6e3ZhbHVlOm51bGx9fV0pLHZlcnRleFNoYWRlcjpOc3QubWVzaG1hdGNhcF92ZXJ0LGZyYWdtZW50U2hhZGVyOk5zdC5tZXNobWF0Y2FwX2ZyYWd9LHBvaW50czp7dW5pZm9ybXM6Z3N0KFt6c3QucG9pbnRzLHpzdC5mb2ddKSx2ZXJ0ZXhTaGFkZXI6TnN0LnBvaW50c192ZXJ0LGZyYWdtZW50U2hhZGVyOk5zdC5wb2ludHNfZnJhZ30sZGFzaGVkOnt1bmlmb3Jtczpnc3QoW3pzdC5jb21tb24senN0LmZvZyx7c2NhbGU6e3ZhbHVlOjF9LGRhc2hTaXplOnt2YWx1ZToxfSx0b3RhbFNpemU6e3ZhbHVlOjJ9fV0pLHZlcnRleFNoYWRlcjpOc3QubGluZWRhc2hlZF92ZXJ0LGZyYWdtZW50U2hhZGVyOk5zdC5saW5lZGFzaGVkX2ZyYWd9LGRlcHRoOnt1bmlmb3Jtczpnc3QoW3pzdC5jb21tb24senN0LmRpc3BsYWNlbWVudG1hcF0pLHZlcnRleFNoYWRlcjpOc3QuZGVwdGhfdmVydCxmcmFnbWVudFNoYWRlcjpOc3QuZGVwdGhfZnJhZ30sbm9ybWFsOnt1bmlmb3Jtczpnc3QoW3pzdC5jb21tb24senN0LmJ1bXBtYXAsenN0Lm5vcm1hbG1hcCx6c3QuZGlzcGxhY2VtZW50bWFwLHtvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6TnN0Lm5vcm1hbF92ZXJ0LGZyYWdtZW50U2hhZGVyOk5zdC5ub3JtYWxfZnJhZ30sc3ByaXRlOnt1bmlmb3Jtczpnc3QoW3pzdC5zcHJpdGUsenN0LmZvZ10pLHZlcnRleFNoYWRlcjpOc3Quc3ByaXRlX3ZlcnQsZnJhZ21lbnRTaGFkZXI6TnN0LnNwcml0ZV9mcmFnfSxiYWNrZ3JvdW5kOnt1bmlmb3Jtczp7dXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyAkaXR9LHQyRDp7dmFsdWU6bnVsbH19LHZlcnRleFNoYWRlcjpOc3QuYmFja2dyb3VuZF92ZXJ0LGZyYWdtZW50U2hhZGVyOk5zdC5iYWNrZ3JvdW5kX2ZyYWd9LGN1YmU6e3VuaWZvcm1zOmdzdChbenN0LmVudm1hcCx7b3BhY2l0eTp7dmFsdWU6MX19XSksdmVydGV4U2hhZGVyOk5zdC5jdWJlX3ZlcnQsZnJhZ21lbnRTaGFkZXI6TnN0LmN1YmVfZnJhZ30sZXF1aXJlY3Q6e3VuaWZvcm1zOnt0RXF1aXJlY3Q6e3ZhbHVlOm51bGx9fSx2ZXJ0ZXhTaGFkZXI6TnN0LmVxdWlyZWN0X3ZlcnQsZnJhZ21lbnRTaGFkZXI6TnN0LmVxdWlyZWN0X2ZyYWd9LGRpc3RhbmNlUkdCQTp7dW5pZm9ybXM6Z3N0KFt6c3QuY29tbW9uLHpzdC5kaXNwbGFjZW1lbnRtYXAse3JlZmVyZW5jZVBvc2l0aW9uOnt2YWx1ZTpuZXcgY2F0fSxuZWFyRGlzdGFuY2U6e3ZhbHVlOjF9LGZhckRpc3RhbmNlOnt2YWx1ZToxZTN9fV0pLHZlcnRleFNoYWRlcjpOc3QuZGlzdGFuY2VSR0JBX3ZlcnQsZnJhZ21lbnRTaGFkZXI6TnN0LmRpc3RhbmNlUkdCQV9mcmFnfSxzaGFkb3c6e3VuaWZvcm1zOmdzdChbenN0LmxpZ2h0cyx6c3QuZm9nLHtjb2xvcjp7dmFsdWU6bmV3IFJydCgwKX0sb3BhY2l0eTp7dmFsdWU6MX19XSksdmVydGV4U2hhZGVyOk5zdC5zaGFkb3dfdmVydCxmcmFnbWVudFNoYWRlcjpOc3Quc2hhZG93X2ZyYWd9fTtmdW5jdGlvbiBIc3QodCxlLG4sbyxpKXtjb25zdCBhPW5ldyBScnQoMCk7bGV0IHIscyxsPTAsYz1udWxsLGQ9MCxwPW51bGw7ZnVuY3Rpb24gbSh0LGUpe24uYnVmZmVycy5jb2xvci5zZXRDbGVhcih0LnIsdC5nLHQuYixlLGkpfXJldHVybntnZXRDbGVhckNvbG9yOmZ1bmN0aW9uKCl7cmV0dXJuIGF9LHNldENsZWFyQ29sb3I6ZnVuY3Rpb24odCxlPTEpe2Euc2V0KHQpLGw9ZSxtKGEsbCl9LGdldENsZWFyQWxwaGE6ZnVuY3Rpb24oKXtyZXR1cm4gbH0sc2V0Q2xlYXJBbHBoYTpmdW5jdGlvbih0KXtsPXQsbShhLGwpfSxyZW5kZXI6ZnVuY3Rpb24gdShuLGkpe2xldCB1PSExLGY9ITA9PT1pLmlzU2NlbmU/aS5iYWNrZ3JvdW5kOm51bGw7ZiYmZi5pc1RleHR1cmUmJihmPWUuZ2V0KGYpKTtjb25zdCBnPXQueHIsaD1nLmdldFNlc3Npb24mJmcuZ2V0U2Vzc2lvbigpO2gmJiJhZGRpdGl2ZSI9PT1oLmVudmlyb25tZW50QmxlbmRNb2RlJiYoZj1udWxsKSxudWxsPT09Zj9tKGEsbCk6ZiYmZi5pc0NvbG9yJiYobShmLDEpLHU9ITApLCh0LmF1dG9DbGVhcnx8dSkmJnQuY2xlYXIodC5hdXRvQ2xlYXJDb2xvcix0LmF1dG9DbGVhckRlcHRoLHQuYXV0b0NsZWFyU3RlbmNpbCksZiYmKGYuaXNDdWJlVGV4dHVyZXx8Zi5tYXBwaW5nPT09bWl0KT8odm9pZCAwPT09cyYmKHM9bmV3IHBzdChuZXcgdXN0KDEsMSwxKSxuZXcgYnN0KHtuYW1lOiJCYWNrZ3JvdW5kQ3ViZU1hdGVyaWFsIix1bmlmb3Jtczpmc3QoSXN0LmN1YmUudW5pZm9ybXMpLHZlcnRleFNoYWRlcjpJc3QuY3ViZS52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6SXN0LmN1YmUuZnJhZ21lbnRTaGFkZXIsc2lkZToxLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExLGZvZzohMX0pKSxzLmdlb21ldHJ5LmRlbGV0ZUF0dHJpYnV0ZSgibm9ybWFsIikscy5nZW9tZXRyeS5kZWxldGVBdHRyaWJ1dGUoInV2Iikscy5vbkJlZm9yZVJlbmRlcj1mdW5jdGlvbih0LGUsbil7dGhpcy5tYXRyaXhXb3JsZC5jb3B5UG9zaXRpb24obi5tYXRyaXhXb3JsZCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLm1hdGVyaWFsLCJlbnZNYXAiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy5lbnZNYXAudmFsdWV9fSksby51cGRhdGUocykpLHMubWF0ZXJpYWwudW5pZm9ybXMuZW52TWFwLnZhbHVlPWYscy5tYXRlcmlhbC51bmlmb3Jtcy5mbGlwRW52TWFwLnZhbHVlPWYuaXNDdWJlVGV4dHVyZSYmITE9PT1mLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT8tMToxLGM9PT1mJiZkPT09Zi52ZXJzaW9uJiZwPT09dC50b25lTWFwcGluZ3x8KHMubWF0ZXJpYWwubmVlZHNVcGRhdGU9ITAsYz1mLGQ9Zi52ZXJzaW9uLHA9dC50b25lTWFwcGluZyksbi51bnNoaWZ0KHMscy5nZW9tZXRyeSxzLm1hdGVyaWFsLDAsMCxudWxsKSk6ZiYmZi5pc1RleHR1cmUmJih2b2lkIDA9PT1yJiYocj1uZXcgcHN0KG5ldyBUc3QoMiwyKSxuZXcgYnN0KHtuYW1lOiJCYWNrZ3JvdW5kTWF0ZXJpYWwiLHVuaWZvcm1zOmZzdChJc3QuYmFja2dyb3VuZC51bmlmb3JtcyksdmVydGV4U2hhZGVyOklzdC5iYWNrZ3JvdW5kLnZlcnRleFNoYWRlcixmcmFnbWVudFNoYWRlcjpJc3QuYmFja2dyb3VuZC5mcmFnbWVudFNoYWRlcixzaWRlOjAsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsZm9nOiExfSkpLHIuZ2VvbWV0cnkuZGVsZXRlQXR0cmlidXRlKCJub3JtYWwiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoci5tYXRlcmlhbCwibWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMudDJELnZhbHVlfX0pLG8udXBkYXRlKHIpKSxyLm1hdGVyaWFsLnVuaWZvcm1zLnQyRC52YWx1ZT1mLCEwPT09Zi5tYXRyaXhBdXRvVXBkYXRlJiZmLnVwZGF0ZU1hdHJpeCgpLHIubWF0ZXJpYWwudW5pZm9ybXMudXZUcmFuc2Zvcm0udmFsdWUuY29weShmLm1hdHJpeCksYz09PWYmJmQ9PT1mLnZlcnNpb24mJnA9PT10LnRvbmVNYXBwaW5nfHwoci5tYXRlcmlhbC5uZWVkc1VwZGF0ZT0hMCxjPWYsZD1mLnZlcnNpb24scD10LnRvbmVNYXBwaW5nKSxuLnVuc2hpZnQocixyLmdlb21ldHJ5LHIubWF0ZXJpYWwsMCwwLG51bGwpKX19fWZ1bmN0aW9uIEZzdCh0LGUsbixvKXtjb25zdCBpPXQuZ2V0UGFyYW1ldGVyKDM0OTIxKSxhPW8uaXNXZWJHTDI/bnVsbDplLmdldCgiT0VTX3ZlcnRleF9hcnJheV9vYmplY3QiKSxyPW8uaXNXZWJHTDJ8fG51bGwhPT1hLHM9e30sbD1tKG51bGwpO2xldCBjPWw7ZnVuY3Rpb24gZChlKXtyZXR1cm4gby5pc1dlYkdMMj90LmJpbmRWZXJ0ZXhBcnJheShlKTphLmJpbmRWZXJ0ZXhBcnJheU9FUyhlKX1mdW5jdGlvbiBwKGUpe3JldHVybiBvLmlzV2ViR0wyP3QuZGVsZXRlVmVydGV4QXJyYXkoZSk6YS5kZWxldGVWZXJ0ZXhBcnJheU9FUyhlKX1mdW5jdGlvbiBtKHQpe2NvbnN0IGU9W10sbj1bXSxvPVtdO2ZvcihsZXQgdD0wO3Q8aTt0KyspZVt0XT0wLG5bdF09MCxvW3RdPTA7cmV0dXJue2dlb21ldHJ5Om51bGwscHJvZ3JhbTpudWxsLHdpcmVmcmFtZTohMSxuZXdBdHRyaWJ1dGVzOmUsZW5hYmxlZEF0dHJpYnV0ZXM6bixhdHRyaWJ1dGVEaXZpc29yczpvLG9iamVjdDp0LGF0dHJpYnV0ZXM6e30saW5kZXg6bnVsbH19ZnVuY3Rpb24gdSgpe2NvbnN0IHQ9Yy5uZXdBdHRyaWJ1dGVzO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl0W2VdPTB9ZnVuY3Rpb24gZih0KXtnKHQsMCl9ZnVuY3Rpb24gZyhuLGkpe2NvbnN0IGE9Yy5lbmFibGVkQXR0cmlidXRlcyxyPWMuYXR0cmlidXRlRGl2aXNvcnM7Yy5uZXdBdHRyaWJ1dGVzW25dPTEsMD09PWFbbl0mJih0LmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG4pLGFbbl09MSkscltuXSE9PWkmJigoby5pc1dlYkdMMj90OmUuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpW28uaXNXZWJHTDI/InZlcnRleEF0dHJpYkRpdmlzb3IiOiJ2ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUiXShuLGkpLHJbbl09aSl9ZnVuY3Rpb24gaCgpe2NvbnN0IGU9Yy5uZXdBdHRyaWJ1dGVzLG49Yy5lbmFibGVkQXR0cmlidXRlcztmb3IobGV0IG89MCxpPW4ubGVuZ3RoO288aTtvKyspbltvXSE9PWVbb10mJih0LmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShvKSxuW29dPTApfWZ1bmN0aW9uIGIoZSxuLGksYSxyLHMpeyEwIT09by5pc1dlYkdMMnx8NTEyNCE9PWkmJjUxMjUhPT1pP3QudmVydGV4QXR0cmliUG9pbnRlcihlLG4saSxhLHIscyk6dC52ZXJ0ZXhBdHRyaWJJUG9pbnRlcihlLG4saSxyLHMpfWZ1bmN0aW9uIHkoKXtfKCksYyE9PWwmJihjPWwsZChjLm9iamVjdCkpfWZ1bmN0aW9uIF8oKXtsLmdlb21ldHJ5PW51bGwsbC5wcm9ncmFtPW51bGwsbC53aXJlZnJhbWU9ITF9cmV0dXJue3NldHVwOmZ1bmN0aW9uIEMoaSxsLHAseSxfKXtsZXQgQz0hMTtpZihyKXtjb25zdCBlPShmdW5jdGlvbiBNKGUsbixpKXtjb25zdCByPSEwPT09aS53aXJlZnJhbWU7bGV0IGw9c1tlLmlkXTt2b2lkIDA9PT1sJiYobD17fSxzW2UuaWRdPWwpO2xldCBjPWxbbi5pZF07dm9pZCAwPT09YyYmKGM9e30sbFtuLmlkXT1jKTtsZXQgZD1jW3JdO3JldHVybiB2b2lkIDA9PT1kJiYoZD1tKChmdW5jdGlvbiBwKCl7cmV0dXJuIG8uaXNXZWJHTDI/dC5jcmVhdGVWZXJ0ZXhBcnJheSgpOmEuY3JlYXRlVmVydGV4QXJyYXlPRVMoKX0pKCkpLGNbcl09ZCksZH0pKHkscCxsKTtjIT09ZSYmKGM9ZSxkKGMub2JqZWN0KSksQz0oZnVuY3Rpb24gdih0LGUpe2NvbnN0IG49Yy5hdHRyaWJ1dGVzLG89dC5hdHRyaWJ1dGVzO2xldCBpPTA7Zm9yKGNvbnN0IHQgaW4gbyl7Y29uc3QgZT1uW3RdLGE9b1t0XTtpZih2b2lkIDA9PT1lKXJldHVybiEwO2lmKGUuYXR0cmlidXRlIT09YSlyZXR1cm4hMDtpZihlLmRhdGEhPT1hLmRhdGEpcmV0dXJuITA7aSsrfXJldHVybiBjLmF0dHJpYnV0ZXNOdW0hPT1pfHxjLmluZGV4IT09ZX0pKHksXyksQyYmKGZ1bmN0aW9uIHgodCxlKXtjb25zdCBuPXt9LG89dC5hdHRyaWJ1dGVzO2xldCBpPTA7Zm9yKGNvbnN0IHQgaW4gbyl7Y29uc3QgZT1vW3RdLGE9e307YS5hdHRyaWJ1dGU9ZSxlLmRhdGEmJihhLmRhdGE9ZS5kYXRhKSxuW3RdPWEsaSsrfWMuYXR0cmlidXRlcz1uLGMuYXR0cmlidXRlc051bT1pLGMuaW5kZXg9ZX0pKHksXyl9ZWxzZXtjb25zdCB0PSEwPT09bC53aXJlZnJhbWU7Yy5nZW9tZXRyeT09PXkuaWQmJmMucHJvZ3JhbT09PXAuaWQmJmMud2lyZWZyYW1lPT09dHx8KGMuZ2VvbWV0cnk9eS5pZCxjLnByb2dyYW09cC5pZCxjLndpcmVmcmFtZT10LEM9ITApfSEwPT09aS5pc0luc3RhbmNlZE1lc2gmJihDPSEwKSxudWxsIT09XyYmbi51cGRhdGUoXywzNDk2MyksQyYmKChmdW5jdGlvbiBPKGksYSxyLHMpe2lmKCExPT09by5pc1dlYkdMMiYmKGkuaXNJbnN0YW5jZWRNZXNofHxzLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkpJiZudWxsPT09ZS5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSlyZXR1cm47dSgpO2NvbnN0IGw9cy5hdHRyaWJ1dGVzLGM9ci5nZXRBdHRyaWJ1dGVzKCksZD1hLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM7Zm9yKGNvbnN0IGUgaW4gYyl7Y29uc3Qgbz1jW2VdO2lmKG8+PTApe2NvbnN0IGE9bFtlXTtpZih2b2lkIDAhPT1hKXtjb25zdCBlPWEubm9ybWFsaXplZCxpPWEuaXRlbVNpemUscj1uLmdldChhKTtpZih2b2lkIDA9PT1yKWNvbnRpbnVlO2NvbnN0IGw9ci5idWZmZXIsYz1yLnR5cGUsZD1yLmJ5dGVzUGVyRWxlbWVudDtpZihhLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IG49YS5kYXRhLHI9bi5zdHJpZGUscD1hLm9mZnNldDtuJiZuLmlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI/KGcobyxuLm1lc2hQZXJBdHRyaWJ1dGUpLHZvaWQgMD09PXMuX21heEluc3RhbmNlQ291bnQmJihzLl9tYXhJbnN0YW5jZUNvdW50PW4ubWVzaFBlckF0dHJpYnV0ZSpuLmNvdW50KSk6ZihvKSx0LmJpbmRCdWZmZXIoMzQ5NjIsbCksYihvLGksYyxlLHIqZCxwKmQpfWVsc2UgYS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZT8oZyhvLGEubWVzaFBlckF0dHJpYnV0ZSksdm9pZCAwPT09cy5fbWF4SW5zdGFuY2VDb3VudCYmKHMuX21heEluc3RhbmNlQ291bnQ9YS5tZXNoUGVyQXR0cmlidXRlKmEuY291bnQpKTpmKG8pLHQuYmluZEJ1ZmZlcigzNDk2MixsKSxiKG8saSxjLGUsMCwwKX1lbHNlIGlmKCJpbnN0YW5jZU1hdHJpeCI9PT1lKXtjb25zdCBlPW4uZ2V0KGkuaW5zdGFuY2VNYXRyaXgpO2lmKHZvaWQgMD09PWUpY29udGludWU7Y29uc3QgYT1lLmJ1ZmZlcixyPWUudHlwZTtnKG8rMCwxKSxnKG8rMSwxKSxnKG8rMiwxKSxnKG8rMywxKSx0LmJpbmRCdWZmZXIoMzQ5NjIsYSksdC52ZXJ0ZXhBdHRyaWJQb2ludGVyKG8rMCw0LHIsITEsNjQsMCksdC52ZXJ0ZXhBdHRyaWJQb2ludGVyKG8rMSw0LHIsITEsNjQsMTYpLHQudmVydGV4QXR0cmliUG9pbnRlcihvKzIsNCxyLCExLDY0LDMyKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIobyszLDQsciwhMSw2NCw0OCl9ZWxzZSBpZigiaW5zdGFuY2VDb2xvciI9PT1lKXtjb25zdCBlPW4uZ2V0KGkuaW5zdGFuY2VDb2xvcik7aWYodm9pZCAwPT09ZSljb250aW51ZTtjb25zdCBhPWUuYnVmZmVyLHI9ZS50eXBlO2cobywxKSx0LmJpbmRCdWZmZXIoMzQ5NjIsYSksdC52ZXJ0ZXhBdHRyaWJQb2ludGVyKG8sMyxyLCExLDEyLDApfWVsc2UgaWYodm9pZCAwIT09ZCl7Y29uc3Qgbj1kW2VdO2lmKHZvaWQgMCE9PW4pc3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDI6dC52ZXJ0ZXhBdHRyaWIyZnYobyxuKTticmVhaztjYXNlIDM6dC52ZXJ0ZXhBdHRyaWIzZnYobyxuKTticmVhaztjYXNlIDQ6dC52ZXJ0ZXhBdHRyaWI0ZnYobyxuKTticmVhaztkZWZhdWx0OnQudmVydGV4QXR0cmliMWZ2KG8sbil9fX19aCgpfSkoaSxsLHAseSksbnVsbCE9PV8mJnQuYmluZEJ1ZmZlcigzNDk2MyxuLmdldChfKS5idWZmZXIpKX0scmVzZXQ6eSxyZXNldERlZmF1bHRTdGF0ZTpfLGRpc3Bvc2U6ZnVuY3Rpb24gTSgpe3koKTtmb3IoY29uc3QgdCBpbiBzKXtjb25zdCBlPXNbdF07Zm9yKGNvbnN0IHQgaW4gZSl7Y29uc3Qgbj1lW3RdO2Zvcihjb25zdCB0IGluIG4pcChuW3RdLm9iamVjdCksZGVsZXRlIG5bdF07ZGVsZXRlIGVbdF19ZGVsZXRlIHNbdF19fSxyZWxlYXNlU3RhdGVzT2ZHZW9tZXRyeTpmdW5jdGlvbiB2KHQpe2lmKHZvaWQgMD09PXNbdC5pZF0pcmV0dXJuO2NvbnN0IGU9c1t0LmlkXTtmb3IoY29uc3QgdCBpbiBlKXtjb25zdCBuPWVbdF07Zm9yKGNvbnN0IHQgaW4gbilwKG5bdF0ub2JqZWN0KSxkZWxldGUgblt0XTtkZWxldGUgZVt0XX1kZWxldGUgc1t0LmlkXX0scmVsZWFzZVN0YXRlc09mUHJvZ3JhbTpmdW5jdGlvbiB4KHQpe2Zvcihjb25zdCBlIGluIHMpe2NvbnN0IG49c1tlXTtpZih2b2lkIDA9PT1uW3QuaWRdKWNvbnRpbnVlO2NvbnN0IG89blt0LmlkXTtmb3IoY29uc3QgdCBpbiBvKXAob1t0XS5vYmplY3QpLGRlbGV0ZSBvW3RdO2RlbGV0ZSBuW3QuaWRdfX0saW5pdEF0dHJpYnV0ZXM6dSxlbmFibGVBdHRyaWJ1dGU6ZixkaXNhYmxlVW51c2VkQXR0cmlidXRlczpofX1mdW5jdGlvbiBMc3QodCxlLG4sbyl7Y29uc3QgaT1vLmlzV2ViR0wyO2xldCBhO3RoaXMuc2V0TW9kZT1mdW5jdGlvbiByKHQpe2E9dH0sdGhpcy5yZW5kZXI9ZnVuY3Rpb24gcyhlLG8pe3QuZHJhd0FycmF5cyhhLGUsbyksbi51cGRhdGUobyxhLDEpfSx0aGlzLnJlbmRlckluc3RhbmNlcz1mdW5jdGlvbiBsKG8scixzKXtpZigwPT09cylyZXR1cm47bGV0IGwsYztpZihpKWw9dCxjPSJkcmF3QXJyYXlzSW5zdGFuY2VkIjtlbHNlIGlmKGw9ZS5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSxjPSJkcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUiLG51bGw9PT1sKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLiIpO2xbY10oYSxvLHIscyksbi51cGRhdGUocixhLHMpfX1mdW5jdGlvbiBCc3QodCxlLG4pe2xldCBvO2Z1bmN0aW9uIGkoZSl7aWYoImhpZ2hwIj09PWUpe2lmKHQuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMzLDM2MzM4KS5wcmVjaXNpb24+MCYmdC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoMzU2MzIsMzYzMzgpLnByZWNpc2lvbj4wKXJldHVybiJoaWdocCI7ZT0ibWVkaXVtcCJ9cmV0dXJuIm1lZGl1bXAiPT09ZSYmdC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoMzU2MzMsMzYzMzcpLnByZWNpc2lvbj4wJiZ0LmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCgzNTYzMiwzNjMzNykucHJlY2lzaW9uPjA/Im1lZGl1bXAiOiJsb3dwIn1jb25zdCBhPSJ1bmRlZmluZWQiIT10eXBlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCYmdCBpbnN0YW5jZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHR8fCJ1bmRlZmluZWQiIT10eXBlb2YgV2ViR0wyQ29tcHV0ZVJlbmRlcmluZ0NvbnRleHQmJnQgaW5zdGFuY2VvZiBXZWJHTDJDb21wdXRlUmVuZGVyaW5nQ29udGV4dDtsZXQgcj12b2lkIDAhPT1uLnByZWNpc2lvbj9uLnByZWNpc2lvbjoiaGlnaHAiO2NvbnN0IHM9aShyKTtzIT09ciYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjoiLHIsIm5vdCBzdXBwb3J0ZWQsIHVzaW5nIixzLCJpbnN0ZWFkLiIpLHI9cyk7Y29uc3QgbD1hfHxlLmhhcygiV0VCR0xfZHJhd19idWZmZXJzIiksYz0hMD09PW4ubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcixkPXQuZ2V0UGFyYW1ldGVyKDM0OTMwKSxwPXQuZ2V0UGFyYW1ldGVyKDM1NjYwKSxtPXQuZ2V0UGFyYW1ldGVyKDMzNzkpLHU9dC5nZXRQYXJhbWV0ZXIoMzQwNzYpLGY9dC5nZXRQYXJhbWV0ZXIoMzQ5MjEpLGc9dC5nZXRQYXJhbWV0ZXIoMzYzNDcpLGg9dC5nZXRQYXJhbWV0ZXIoMzYzNDgpLGI9dC5nZXRQYXJhbWV0ZXIoMzYzNDkpLHk9cD4wLF89YXx8ZS5oYXMoIk9FU190ZXh0dXJlX2Zsb2F0Iik7cmV0dXJue2lzV2ViR0wyOmEsZHJhd0J1ZmZlcnM6bCxnZXRNYXhBbmlzb3Ryb3B5OmZ1bmN0aW9uIEMoKXtpZih2b2lkIDAhPT1vKXJldHVybiBvO2lmKCEwPT09ZS5oYXMoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpKXtjb25zdCBuPWUuZ2V0KCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTtvPXQuZ2V0UGFyYW1ldGVyKG4uTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUKX1lbHNlIG89MDtyZXR1cm4gb30sZ2V0TWF4UHJlY2lzaW9uOmkscHJlY2lzaW9uOnIsbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjpjLG1heFRleHR1cmVzOmQsbWF4VmVydGV4VGV4dHVyZXM6cCxtYXhUZXh0dXJlU2l6ZTptLG1heEN1YmVtYXBTaXplOnUsbWF4QXR0cmlidXRlczpmLG1heFZlcnRleFVuaWZvcm1zOmcsbWF4VmFyeWluZ3M6aCxtYXhGcmFnbWVudFVuaWZvcm1zOmIsdmVydGV4VGV4dHVyZXM6eSxmbG9hdEZyYWdtZW50VGV4dHVyZXM6XyxmbG9hdFZlcnRleFRleHR1cmVzOnkmJl8sbWF4U2FtcGxlczphP3QuZ2V0UGFyYW1ldGVyKDM2MTgzKTowfX1mdW5jdGlvbiBWc3QodCl7Y29uc3QgZT10aGlzO2xldCBuPW51bGwsbz0wLGk9ITEsYT0hMTtjb25zdCByPW5ldyBrc3Qscz1uZXcgJGl0LGw9e3ZhbHVlOm51bGwsbmVlZHNVcGRhdGU6ITF9O2Z1bmN0aW9uIGMoKXtsLnZhbHVlIT09biYmKGwudmFsdWU9bixsLm5lZWRzVXBkYXRlPW8+MCksZS5udW1QbGFuZXM9byxlLm51bUludGVyc2VjdGlvbj0wfWZ1bmN0aW9uIGQodCxuLG8saSl7Y29uc3QgYT1udWxsIT09dD90Lmxlbmd0aDowO2xldCBjPW51bGw7aWYoMCE9PWEpe2lmKGM9bC52YWx1ZSwhMCE9PWl8fG51bGw9PT1jKXtjb25zdCBlPW8rNCphLGk9bi5tYXRyaXhXb3JsZEludmVyc2U7cy5nZXROb3JtYWxNYXRyaXgoaSksKG51bGw9PT1jfHxjLmxlbmd0aDxlKSYmKGM9bmV3IEZsb2F0MzJBcnJheShlKSk7Zm9yKGxldCBlPTAsbj1vO2UhPT1hOysrZSxuKz00KXIuY29weSh0W2VdKS5hcHBseU1hdHJpeDQoaSxzKSxyLm5vcm1hbC50b0FycmF5KGMsbiksY1tuKzNdPXIuY29uc3RhbnR9bC52YWx1ZT1jLGwubmVlZHNVcGRhdGU9ITB9cmV0dXJuIGUubnVtUGxhbmVzPWEsZS5udW1JbnRlcnNlY3Rpb249MCxjfXRoaXMudW5pZm9ybT1sLHRoaXMubnVtUGxhbmVzPTAsdGhpcy5udW1JbnRlcnNlY3Rpb249MCx0aGlzLmluaXQ9ZnVuY3Rpb24odCxlLGEpe2NvbnN0IHI9MCE9PXQubGVuZ3RofHxlfHwwIT09b3x8aTtyZXR1cm4gaT1lLG49ZCh0LGEsMCksbz10Lmxlbmd0aCxyfSx0aGlzLmJlZ2luU2hhZG93cz1mdW5jdGlvbigpe2E9ITAsZChudWxsKX0sdGhpcy5lbmRTaGFkb3dzPWZ1bmN0aW9uKCl7YT0hMSxjKCl9LHRoaXMuc2V0U3RhdGU9ZnVuY3Rpb24oZSxyLHMpe2NvbnN0IHA9ZS5jbGlwcGluZ1BsYW5lcyxtPWUuY2xpcEludGVyc2VjdGlvbix1PWUuY2xpcFNoYWRvd3MsZj10LmdldChlKTtpZighaXx8bnVsbD09PXB8fDA9PT1wLmxlbmd0aHx8YSYmIXUpYT9kKG51bGwpOmMoKTtlbHNle2NvbnN0IHQ9YT8wOm8sZT00KnQ7bGV0IGk9Zi5jbGlwcGluZ1N0YXRlfHxudWxsO2wudmFsdWU9aSxpPWQocCxyLGUscyk7Zm9yKGxldCB0PTA7dCE9PWU7Kyt0KWlbdF09blt0XTtmLmNsaXBwaW5nU3RhdGU9aSx0aGlzLm51bUludGVyc2VjdGlvbj1tP3RoaXMubnVtUGxhbmVzOjAsdGhpcy5udW1QbGFuZXMrPXR9fX1mdW5jdGlvbiBqc3QodCl7bGV0IGU9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gbih0LGUpe3JldHVybiAzMDM9PT1lP3QubWFwcGluZz1kaXQ6MzA0PT09ZSYmKHQubWFwcGluZz1waXQpLHR9ZnVuY3Rpb24gbyh0KXtjb25zdCBuPXQudGFyZ2V0O24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsbyk7Y29uc3QgaT1lLmdldChuKTt2b2lkIDAhPT1pJiYoZS5kZWxldGUobiksaS5kaXNwb3NlKCkpfXJldHVybntnZXQ6ZnVuY3Rpb24gaShhKXtpZihhJiZhLmlzVGV4dHVyZSYmITE9PT1hLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSl7Y29uc3QgaT1hLm1hcHBpbmc7aWYoMzAzPT09aXx8MzA0PT09aSl7aWYoZS5oYXMoYSkpcmV0dXJuIG4oZS5nZXQoYSkudGV4dHVyZSxhLm1hcHBpbmcpO3tjb25zdCBpPWEuaW1hZ2U7aWYoaSYmaS5oZWlnaHQ+MCl7Y29uc3Qgcj10LmdldFJlbmRlclRhcmdldCgpLHM9bmV3IHhzdChpLmhlaWdodC8yKTtyZXR1cm4gcy5mcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZSh0LGEpLGUuc2V0KGEscyksdC5zZXRSZW5kZXJUYXJnZXQociksYS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixvKSxuKHMudGV4dHVyZSxhLm1hcHBpbmcpfXJldHVybiBudWxsfX19cmV0dXJuIGF9LGRpc3Bvc2U6ZnVuY3Rpb24gYSgpe2U9bmV3IFdlYWtNYXB9fX1Jc3QucGh5c2ljYWw9e3VuaWZvcm1zOmdzdChbSXN0LnN0YW5kYXJkLnVuaWZvcm1zLHtjbGVhcmNvYXQ6e3ZhbHVlOjB9LGNsZWFyY29hdE1hcDp7dmFsdWU6bnVsbH0sY2xlYXJjb2F0Um91Z2huZXNzOnt2YWx1ZTowfSxjbGVhcmNvYXRSb3VnaG5lc3NNYXA6e3ZhbHVlOm51bGx9LGNsZWFyY29hdE5vcm1hbFNjYWxlOnt2YWx1ZTpuZXcgUWl0KDEsMSl9LGNsZWFyY29hdE5vcm1hbE1hcDp7dmFsdWU6bnVsbH0sc2hlZW46e3ZhbHVlOm5ldyBScnQoMCl9LHRyYW5zbWlzc2lvbjp7dmFsdWU6MH0sdHJhbnNtaXNzaW9uTWFwOnt2YWx1ZTpudWxsfSx0cmFuc21pc3Npb25TYW1wbGVyU2l6ZTp7dmFsdWU6bmV3IFFpdH0sdHJhbnNtaXNzaW9uU2FtcGxlck1hcDp7dmFsdWU6bnVsbH0sdGhpY2tuZXNzOnt2YWx1ZTowfSx0aGlja25lc3NNYXA6e3ZhbHVlOm51bGx9LGF0dGVudWF0aW9uRGlzdGFuY2U6e3ZhbHVlOjB9LGF0dGVudWF0aW9uVGludDp7dmFsdWU6bmV3IFJydCgwKX0sc3BlY3VsYXJJbnRlbnNpdHk6e3ZhbHVlOjB9LHNwZWN1bGFySW50ZW5zaXR5TWFwOnt2YWx1ZTpudWxsfSxzcGVjdWxhclRpbnQ6e3ZhbHVlOm5ldyBScnQoMSwxLDEpfSxzcGVjdWxhclRpbnRNYXA6e3ZhbHVlOm51bGx9fV0pLHZlcnRleFNoYWRlcjpOc3QubWVzaHBoeXNpY2FsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6TnN0Lm1lc2hwaHlzaWNhbF9mcmFnfTtjbGFzcyBVc3QgZXh0ZW5kcyB5c3R7Y29uc3RydWN0b3IodD0tMSxlPTEsbj0xLG89LTEsaT0uMSxhPTJlMyl7c3VwZXIoKSx0aGlzLnR5cGU9Ik9ydGhvZ3JhcGhpY0NhbWVyYSIsdGhpcy56b29tPTEsdGhpcy52aWV3PW51bGwsdGhpcy5sZWZ0PXQsdGhpcy5yaWdodD1lLHRoaXMudG9wPW4sdGhpcy5ib3R0b209byx0aGlzLm5lYXI9aSx0aGlzLmZhcj1hLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHRoaXMubGVmdD10LmxlZnQsdGhpcy5yaWdodD10LnJpZ2h0LHRoaXMudG9wPXQudG9wLHRoaXMuYm90dG9tPXQuYm90dG9tLHRoaXMubmVhcj10Lm5lYXIsdGhpcy5mYXI9dC5mYXIsdGhpcy56b29tPXQuem9vbSx0aGlzLnZpZXc9bnVsbD09PXQudmlldz9udWxsOk9iamVjdC5hc3NpZ24oe30sdC52aWV3KSx0aGlzfXNldFZpZXdPZmZzZXQodCxlLG4sbyxpLGEpe251bGw9PT10aGlzLnZpZXcmJih0aGlzLnZpZXc9e2VuYWJsZWQ6ITAsZnVsbFdpZHRoOjEsZnVsbEhlaWdodDoxLG9mZnNldFg6MCxvZmZzZXRZOjAsd2lkdGg6MSxoZWlnaHQ6MX0pLHRoaXMudmlldy5lbmFibGVkPSEwLHRoaXMudmlldy5mdWxsV2lkdGg9dCx0aGlzLnZpZXcuZnVsbEhlaWdodD1lLHRoaXMudmlldy5vZmZzZXRYPW4sdGhpcy52aWV3Lm9mZnNldFk9byx0aGlzLnZpZXcud2lkdGg9aSx0aGlzLnZpZXcuaGVpZ2h0PWEsdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Y2xlYXJWaWV3T2Zmc2V0KCl7bnVsbCE9PXRoaXMudmlldyYmKHRoaXMudmlldy5lbmFibGVkPSExKSx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX11cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl7Y29uc3QgdD0odGhpcy5yaWdodC10aGlzLmxlZnQpLygyKnRoaXMuem9vbSksZT0odGhpcy50b3AtdGhpcy5ib3R0b20pLygyKnRoaXMuem9vbSksbj0odGhpcy5yaWdodCt0aGlzLmxlZnQpLzIsbz0odGhpcy50b3ArdGhpcy5ib3R0b20pLzI7bGV0IGk9bi10LGE9bit0LHI9bytlLHM9by1lO2lmKG51bGwhPT10aGlzLnZpZXcmJnRoaXMudmlldy5lbmFibGVkKXtjb25zdCB0PSh0aGlzLnJpZ2h0LXRoaXMubGVmdCkvdGhpcy52aWV3LmZ1bGxXaWR0aC90aGlzLnpvb20sZT0odGhpcy50b3AtdGhpcy5ib3R0b20pL3RoaXMudmlldy5mdWxsSGVpZ2h0L3RoaXMuem9vbTtpKz10KnRoaXMudmlldy5vZmZzZXRYLGE9aSt0KnRoaXMudmlldy53aWR0aCxyLT1lKnRoaXMudmlldy5vZmZzZXRZLHM9ci1lKnRoaXMudmlldy5oZWlnaHR9dGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VPcnRob2dyYXBoaWMoaSxhLHIscyx0aGlzLm5lYXIsdGhpcy5mYXIpLHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSh0aGlzLnByb2plY3Rpb25NYXRyaXgpLmludmVydCgpfXRvSlNPTih0KXtjb25zdCBlPXN1cGVyLnRvSlNPTih0KTtyZXR1cm4gZS5vYmplY3Quem9vbT10aGlzLnpvb20sZS5vYmplY3QubGVmdD10aGlzLmxlZnQsZS5vYmplY3QucmlnaHQ9dGhpcy5yaWdodCxlLm9iamVjdC50b3A9dGhpcy50b3AsZS5vYmplY3QuYm90dG9tPXRoaXMuYm90dG9tLGUub2JqZWN0Lm5lYXI9dGhpcy5uZWFyLGUub2JqZWN0LmZhcj10aGlzLmZhcixudWxsIT09dGhpcy52aWV3JiYoZS5vYmplY3Qudmlldz1PYmplY3QuYXNzaWduKHt9LHRoaXMudmlldykpLGV9fVVzdC5wcm90b3R5cGUuaXNPcnRob2dyYXBoaWNDYW1lcmE9ITA7Y2xhc3MgR3N0IGV4dGVuZHMgYnN0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMudHlwZT0iUmF3U2hhZGVyTWF0ZXJpYWwifX1Hc3QucHJvdG90eXBlLmlzUmF3U2hhZGVyTWF0ZXJpYWw9ITA7Y29uc3QgV3N0PU1hdGgucG93KDIsOCksWXN0PVsuMTI1LC4yMTUsLjM1LC40NDYsLjUyNiwuNTgyXSxxc3Q9NStZc3QubGVuZ3RoLFpzdD17W3ppdF06MCxbSWl0XToxLFtGaXRdOjIsMzAwNDozLDMwMDU6NCwzMDA2OjUsW0hpdF06Nn0sWHN0PW5ldyBBcnQoe3NpZGU6MSxkZXB0aFdyaXRlOiExLGRlcHRoVGVzdDohMX0pLEtzdD1uZXcgcHN0KG5ldyB1c3QsWHN0KSxKc3Q9bmV3IFVzdCx7X2xvZFBsYW5lczpRc3QsX3NpemVMb2RzOiRzdCxfc2lnbWFzOnRsdH09Y2x0KCksZWx0PW5ldyBScnQ7bGV0IG5sdD1udWxsO2NvbnN0IG9sdD0oMStNYXRoLnNxcnQoNSkpLzIsaWx0PTEvb2x0LGFsdD1bbmV3IGNhdCgxLDEsMSksbmV3IGNhdCgtMSwxLDEpLG5ldyBjYXQoMSwxLC0xKSxuZXcgY2F0KC0xLDEsLTEpLG5ldyBjYXQoMCxvbHQsaWx0KSxuZXcgY2F0KDAsb2x0LC1pbHQpLG5ldyBjYXQoaWx0LDAsb2x0KSxuZXcgY2F0KC1pbHQsMCxvbHQpLG5ldyBjYXQob2x0LGlsdCwwKSxuZXcgY2F0KC1vbHQsaWx0LDApXTtmdW5jdGlvbiBybHQodCl7Y29uc3QgZT1NYXRoLm1heCh0LnIsdC5nLHQuYiksbj1NYXRoLm1pbihNYXRoLm1heChNYXRoLmNlaWwoTWF0aC5sb2cyKGUpKSwtMTI4KSwxMjcpO3JldHVybiB0Lm11bHRpcGx5U2NhbGFyKE1hdGgucG93KDIsLW4pKSwobisxMjgpLzI1NX1jbGFzcyBzbHR7Y29uc3RydWN0b3IodCl7dGhpcy5fcmVuZGVyZXI9dCx0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldD1udWxsLHRoaXMuX2JsdXJNYXRlcmlhbD0oZnVuY3Rpb24gZSh0KXtjb25zdCBlPW5ldyBGbG9hdDMyQXJyYXkodCksbj1uZXcgY2F0KDAsMSwwKTtyZXR1cm4gbmV3IEdzdCh7bmFtZToiU3BoZXJpY2FsR2F1c3NpYW5CbHVyIixkZWZpbmVzOntuOnR9LHVuaWZvcm1zOntlbnZNYXA6e3ZhbHVlOm51bGx9LHNhbXBsZXM6e3ZhbHVlOjF9LHdlaWdodHM6e3ZhbHVlOmV9LGxhdGl0dWRpbmFsOnt2YWx1ZTohMX0sZFRoZXRhOnt2YWx1ZTowfSxtaXBJbnQ6e3ZhbHVlOjB9LHBvbGVBeGlzOnt2YWx1ZTpufSxpbnB1dEVuY29kaW5nOnt2YWx1ZTpac3RbM2UzXX0sb3V0cHV0RW5jb2Rpbmc6e3ZhbHVlOlpzdFszZTNdfX0sdmVydGV4U2hhZGVyOiJcblxuXHRcdHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXHRcdHByZWNpc2lvbiBtZWRpdW1wIGludDtcblxuXHRcdGF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uO1xuXHRcdGF0dHJpYnV0ZSB2ZWMyIHV2O1xuXHRcdGF0dHJpYnV0ZSBmbG9hdCBmYWNlSW5kZXg7XG5cblx0XHR2YXJ5aW5nIHZlYzMgdk91dHB1dERpcmVjdGlvbjtcblxuXHRcdC8vIFJIIGNvb3JkaW5hdGUgc3lzdGVtOyBQTVJFTSBmYWNlLWluZGV4aW5nIGNvbnZlbnRpb25cblx0XHR2ZWMzIGdldERpcmVjdGlvbiggdmVjMiB1diwgZmxvYXQgZmFjZSApIHtcblxuXHRcdFx0dXYgPSAyLjAgKiB1diAtIDEuMDtcblxuXHRcdFx0dmVjMyBkaXJlY3Rpb24gPSB2ZWMzKCB1diwgMS4wICk7XG5cblx0XHRcdGlmICggZmFjZSA9PSAwLjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnp5eDsgLy8gKCAxLCB2LCB1ICkgcG9zIHhcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSAxLjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnh6eTtcblx0XHRcdFx0ZGlyZWN0aW9uLnh6ICo9IC0xLjA7IC8vICggLXUsIDEsIC12ICkgcG9zIHlcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSAyLjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uLnggKj0gLTEuMDsgLy8gKCAtdSwgdiwgMSApIHBvcyB6XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMy4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi56eXg7XG5cdFx0XHRcdGRpcmVjdGlvbi54eiAqPSAtMS4wOyAvLyAoIC0xLCB2LCAtdSApIG5lZyB4XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gNC4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi54enk7XG5cdFx0XHRcdGRpcmVjdGlvbi54eSAqPSAtMS4wOyAvLyAoIC11LCAtMSwgdiApIG5lZyB5XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gNS4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbi56ICo9IC0xLjA7IC8vICggdSwgdiwgLTEgKSBuZWcgelxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkaXJlY3Rpb247XG5cblx0XHR9XG5cblx0XHR2b2lkIG1haW4oKSB7XG5cblx0XHRcdHZPdXRwdXREaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oIHV2LCBmYWNlSW5kZXggKTtcblx0XHRcdGdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24sIDEuMCApO1xuXG5cdFx0fVxuXHQiLGZyYWdtZW50U2hhZGVyOiJcblxuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBpbnQ7XG5cblx0XHRcdHZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uO1xuXG5cdFx0XHR1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7XG5cdFx0XHR1bmlmb3JtIGludCBzYW1wbGVzO1xuXHRcdFx0dW5pZm9ybSBmbG9hdCB3ZWlnaHRzWyBuIF07XG5cdFx0XHR1bmlmb3JtIGJvb2wgbGF0aXR1ZGluYWw7XG5cdFx0XHR1bmlmb3JtIGZsb2F0IGRUaGV0YTtcblx0XHRcdHVuaWZvcm0gZmxvYXQgbWlwSW50O1xuXHRcdFx0dW5pZm9ybSB2ZWMzIHBvbGVBeGlzO1xuXG5cdFx0XHRcblxuXHRcdHVuaWZvcm0gaW50IGlucHV0RW5jb2Rpbmc7XG5cdFx0dW5pZm9ybSBpbnQgb3V0cHV0RW5jb2Rpbmc7XG5cblx0XHQjaW5jbHVkZSA8ZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ+XG5cblx0XHR2ZWM0IGlucHV0VGV4ZWxUb0xpbmVhciggdmVjNCB2YWx1ZSApIHtcblxuXHRcdFx0aWYgKCBpbnB1dEVuY29kaW5nID09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDEgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHNSR0JUb0xpbmVhciggdmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW5wdXRFbmNvZGluZyA9PSAyICkge1xuXG5cdFx0XHRcdHJldHVybiBSR0JFVG9MaW5lYXIoIHZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gMyApIHtcblxuXHRcdFx0XHRyZXR1cm4gUkdCTVRvTGluZWFyKCB2YWx1ZSwgNy4wICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gNCApIHtcblxuXHRcdFx0XHRyZXR1cm4gUkdCTVRvTGluZWFyKCB2YWx1ZSwgMTYuMCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIFJHQkRUb0xpbmVhciggdmFsdWUsIDI1Ni4wICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIEdhbW1hVG9MaW5lYXIoIHZhbHVlLCAyLjIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmVjNCBsaW5lYXJUb091dHB1dFRleGVsKCB2ZWM0IHZhbHVlICkge1xuXG5cdFx0XHRpZiAoIG91dHB1dEVuY29kaW5nID09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvdXRwdXRFbmNvZGluZyA9PSAxICkge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb3NSR0IoIHZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDIgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvUkdCRSggdmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gMyApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9SR0JNKCB2YWx1ZSwgNy4wICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvUkdCTSggdmFsdWUsIDE2LjAgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gNSApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9SR0JEKCB2YWx1ZSwgMjU2LjAgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9HYW1tYSggdmFsdWUsIDIuMiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2ZWM0IGVudk1hcFRleGVsVG9MaW5lYXIoIHZlYzQgY29sb3IgKSB7XG5cblx0XHRcdHJldHVybiBpbnB1dFRleGVsVG9MaW5lYXIoIGNvbG9yICk7XG5cblx0XHR9XG5cdFxuXG5cdFx0XHQjZGVmaW5lIEVOVk1BUF9UWVBFX0NVQkVfVVZcblx0XHRcdCNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XG5cblx0XHRcdHZlYzMgZ2V0U2FtcGxlKCBmbG9hdCB0aGV0YSwgdmVjMyBheGlzICkge1xuXG5cdFx0XHRcdGZsb2F0IGNvc1RoZXRhID0gY29zKCB0aGV0YSApO1xuXHRcdFx0XHQvLyBSb2RyaWd1ZXMnIGF4aXMtYW5nbGUgcm90YXRpb25cblx0XHRcdFx0dmVjMyBzYW1wbGVEaXJlY3Rpb24gPSB2T3V0cHV0RGlyZWN0aW9uICogY29zVGhldGFcblx0XHRcdFx0XHQrIGNyb3NzKCBheGlzLCB2T3V0cHV0RGlyZWN0aW9uICkgKiBzaW4oIHRoZXRhIClcblx0XHRcdFx0XHQrIGF4aXMgKiBkb3QoIGF4aXMsIHZPdXRwdXREaXJlY3Rpb24gKSAqICggMS4wIC0gY29zVGhldGEgKTtcblxuXHRcdFx0XHRyZXR1cm4gYmlsaW5lYXJDdWJlVVYoIGVudk1hcCwgc2FtcGxlRGlyZWN0aW9uLCBtaXBJbnQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2b2lkIG1haW4oKSB7XG5cblx0XHRcdFx0dmVjMyBheGlzID0gbGF0aXR1ZGluYWwgPyBwb2xlQXhpcyA6IGNyb3NzKCBwb2xlQXhpcywgdk91dHB1dERpcmVjdGlvbiApO1xuXG5cdFx0XHRcdGlmICggYWxsKCBlcXVhbCggYXhpcywgdmVjMyggMC4wICkgKSApICkge1xuXG5cdFx0XHRcdFx0YXhpcyA9IHZlYzMoIHZPdXRwdXREaXJlY3Rpb24ueiwgMC4wLCAtIHZPdXRwdXREaXJlY3Rpb24ueCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRheGlzID0gbm9ybWFsaXplKCBheGlzICk7XG5cblx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7XG5cdFx0XHRcdGdsX0ZyYWdDb2xvci5yZ2IgKz0gd2VpZ2h0c1sgMCBdICogZ2V0U2FtcGxlKCAwLjAsIGF4aXMgKTtcblxuXHRcdFx0XHRmb3IgKCBpbnQgaSA9IDE7IGkgPCBuOyBpKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGkgPj0gc2FtcGxlcyApIHtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRmbG9hdCB0aGV0YSA9IGRUaGV0YSAqIGZsb2F0KCBpICk7XG5cdFx0XHRcdFx0Z2xfRnJhZ0NvbG9yLnJnYiArPSB3ZWlnaHRzWyBpIF0gKiBnZXRTYW1wbGUoIC0xLjAgKiB0aGV0YSwgYXhpcyApO1xuXHRcdFx0XHRcdGdsX0ZyYWdDb2xvci5yZ2IgKz0gd2VpZ2h0c1sgaSBdICogZ2V0U2FtcGxlKCB0aGV0YSwgYXhpcyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRnbF9GcmFnQ29sb3IgPSBsaW5lYXJUb091dHB1dFRleGVsKCBnbF9GcmFnQ29sb3IgKTtcblxuXHRcdFx0fVxuXHRcdCIsYmxlbmRpbmc6MCxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMX0pfSkoMjApLHRoaXMuX2VxdWlyZWN0U2hhZGVyPW51bGwsdGhpcy5fY3ViZW1hcFNoYWRlcj1udWxsLHRoaXMuX2NvbXBpbGVNYXRlcmlhbCh0aGlzLl9ibHVyTWF0ZXJpYWwpfWZyb21TY2VuZSh0LGU9MCxuPS4xLG89MTAwKXtubHQ9dGhpcy5fcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7Y29uc3QgaT10aGlzLl9hbGxvY2F0ZVRhcmdldHMoKTtyZXR1cm4gdGhpcy5fc2NlbmVUb0N1YmVVVih0LG4sbyxpKSxlPjAmJnRoaXMuX2JsdXIoaSwwLDAsZSksdGhpcy5fYXBwbHlQTVJFTShpKSx0aGlzLl9jbGVhbnVwKGkpLGl9ZnJvbUVxdWlyZWN0YW5ndWxhcih0KXtyZXR1cm4gdGhpcy5fZnJvbVRleHR1cmUodCl9ZnJvbUN1YmVtYXAodCl7cmV0dXJuIHRoaXMuX2Zyb21UZXh0dXJlKHQpfWNvbXBpbGVDdWJlbWFwU2hhZGVyKCl7bnVsbD09PXRoaXMuX2N1YmVtYXBTaGFkZXImJih0aGlzLl9jdWJlbWFwU2hhZGVyPXVsdCgpLHRoaXMuX2NvbXBpbGVNYXRlcmlhbCh0aGlzLl9jdWJlbWFwU2hhZGVyKSl9Y29tcGlsZUVxdWlyZWN0YW5ndWxhclNoYWRlcigpe251bGw9PT10aGlzLl9lcXVpcmVjdFNoYWRlciYmKHRoaXMuX2VxdWlyZWN0U2hhZGVyPW1sdCgpLHRoaXMuX2NvbXBpbGVNYXRlcmlhbCh0aGlzLl9lcXVpcmVjdFNoYWRlcikpfWRpc3Bvc2UoKXt0aGlzLl9ibHVyTWF0ZXJpYWwuZGlzcG9zZSgpLG51bGwhPT10aGlzLl9jdWJlbWFwU2hhZGVyJiZ0aGlzLl9jdWJlbWFwU2hhZGVyLmRpc3Bvc2UoKSxudWxsIT09dGhpcy5fZXF1aXJlY3RTaGFkZXImJnRoaXMuX2VxdWlyZWN0U2hhZGVyLmRpc3Bvc2UoKTtmb3IobGV0IHQ9MDt0PFFzdC5sZW5ndGg7dCsrKVFzdFt0XS5kaXNwb3NlKCl9X2NsZWFudXAodCl7dGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQuZGlzcG9zZSgpLHRoaXMuX3JlbmRlcmVyLnNldFJlbmRlclRhcmdldChubHQpLHQuc2Npc3NvclRlc3Q9ITEscGx0KHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpfV9mcm9tVGV4dHVyZSh0KXtubHQ9dGhpcy5fcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7Y29uc3QgZT10aGlzLl9hbGxvY2F0ZVRhcmdldHModCk7cmV0dXJuIHRoaXMuX3RleHR1cmVUb0N1YmVVVih0LGUpLHRoaXMuX2FwcGx5UE1SRU0oZSksdGhpcy5fY2xlYW51cChlKSxlfV9hbGxvY2F0ZVRhcmdldHModCl7Y29uc3QgZT17bWFnRmlsdGVyOmhpdCxtaW5GaWx0ZXI6aGl0LGdlbmVyYXRlTWlwbWFwczohMSx0eXBlOl9pdCxmb3JtYXQ6MTAyMyxlbmNvZGluZzpsbHQodCk/dC5lbmNvZGluZzpGaXQsZGVwdGhCdWZmZXI6ITF9LG49ZGx0KGUpO3JldHVybiBuLmRlcHRoQnVmZmVyPSF0LHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0PWRsdChlKSxufV9jb21waWxlTWF0ZXJpYWwodCl7Y29uc3QgZT1uZXcgcHN0KFFzdFswXSx0KTt0aGlzLl9yZW5kZXJlci5jb21waWxlKGUsSnN0KX1fc2NlbmVUb0N1YmVVVih0LGUsbixvKXtjb25zdCBpPW5ldyBfc3QoOTAsMSxlLG4pLGE9WzEsLTEsMSwxLDEsMV0scj1bMSwxLDEsLTEsLTEsLTFdLHM9dGhpcy5fcmVuZGVyZXIsbD1zLmF1dG9DbGVhcixjPXMub3V0cHV0RW5jb2RpbmcsZD1zLnRvbmVNYXBwaW5nO3MuZ2V0Q2xlYXJDb2xvcihlbHQpLHMudG9uZU1hcHBpbmc9MCxzLm91dHB1dEVuY29kaW5nPXppdCxzLmF1dG9DbGVhcj0hMTtsZXQgcD0hMTtjb25zdCBtPXQuYmFja2dyb3VuZDtpZihtKXtpZihtLmlzQ29sb3Ipe1hzdC5jb2xvci5jb3B5KG0pLmNvbnZlcnRTUkdCVG9MaW5lYXIoKSx0LmJhY2tncm91bmQ9bnVsbDtjb25zdCBlPXJsdChYc3QuY29sb3IpO1hzdC5vcGFjaXR5PWUscD0hMH19ZWxzZXtYc3QuY29sb3IuY29weShlbHQpLmNvbnZlcnRTUkdCVG9MaW5lYXIoKTtjb25zdCB0PXJsdChYc3QuY29sb3IpO1hzdC5vcGFjaXR5PXQscD0hMH1mb3IobGV0IGU9MDtlPDY7ZSsrKXtjb25zdCBuPWUlMzswPT1uPyhpLnVwLnNldCgwLGFbZV0sMCksaS5sb29rQXQocltlXSwwLDApKToxPT1uPyhpLnVwLnNldCgwLDAsYVtlXSksaS5sb29rQXQoMCxyW2VdLDApKTooaS51cC5zZXQoMCxhW2VdLDApLGkubG9va0F0KDAsMCxyW2VdKSkscGx0KG8sbipXc3QsZT4yP1dzdDowLFdzdCxXc3QpLHMuc2V0UmVuZGVyVGFyZ2V0KG8pLHAmJnMucmVuZGVyKEtzdCxpKSxzLnJlbmRlcih0LGkpfXMudG9uZU1hcHBpbmc9ZCxzLm91dHB1dEVuY29kaW5nPWMscy5hdXRvQ2xlYXI9bH1fdGV4dHVyZVRvQ3ViZVVWKHQsZSl7Y29uc3Qgbj10aGlzLl9yZW5kZXJlcjt0LmlzQ3ViZVRleHR1cmU/bnVsbD09dGhpcy5fY3ViZW1hcFNoYWRlciYmKHRoaXMuX2N1YmVtYXBTaGFkZXI9dWx0KCkpOm51bGw9PXRoaXMuX2VxdWlyZWN0U2hhZGVyJiYodGhpcy5fZXF1aXJlY3RTaGFkZXI9bWx0KCkpO2NvbnN0IG89dC5pc0N1YmVUZXh0dXJlP3RoaXMuX2N1YmVtYXBTaGFkZXI6dGhpcy5fZXF1aXJlY3RTaGFkZXIsaT1uZXcgcHN0KFFzdFswXSxvKSxhPW8udW5pZm9ybXM7YS5lbnZNYXAudmFsdWU9dCx0LmlzQ3ViZVRleHR1cmV8fGEudGV4ZWxTaXplLnZhbHVlLnNldCgxL3QuaW1hZ2Uud2lkdGgsMS90LmltYWdlLmhlaWdodCksYS5pbnB1dEVuY29kaW5nLnZhbHVlPVpzdFt0LmVuY29kaW5nXSxhLm91dHB1dEVuY29kaW5nLnZhbHVlPVpzdFtlLnRleHR1cmUuZW5jb2RpbmddLHBsdChlLDAsMCwzKldzdCwyKldzdCksbi5zZXRSZW5kZXJUYXJnZXQoZSksbi5yZW5kZXIoaSxKc3QpfV9hcHBseVBNUkVNKHQpe2NvbnN0IGU9dGhpcy5fcmVuZGVyZXIsbj1lLmF1dG9DbGVhcjtlLmF1dG9DbGVhcj0hMTtmb3IobGV0IGU9MTtlPHFzdDtlKyspe2NvbnN0IG49TWF0aC5zcXJ0KHRsdFtlXSp0bHRbZV0tdGx0W2UtMV0qdGx0W2UtMV0pO3RoaXMuX2JsdXIodCxlLTEsZSxuLGFsdFsoZS0xKSVhbHQubGVuZ3RoXSl9ZS5hdXRvQ2xlYXI9bn1fYmx1cih0LGUsbixvLGkpe2NvbnN0IGE9dGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQ7dGhpcy5faGFsZkJsdXIodCxhLGUsbixvLCJsYXRpdHVkaW5hbCIsaSksdGhpcy5faGFsZkJsdXIoYSx0LG4sbixvLCJsb25naXR1ZGluYWwiLGkpfV9oYWxmQmx1cih0LGUsbixvLGksYSxyKXtjb25zdCBzPXRoaXMuX3JlbmRlcmVyLGw9dGhpcy5fYmx1ck1hdGVyaWFsOyJsYXRpdHVkaW5hbCIhPT1hJiYibG9uZ2l0dWRpbmFsIiE9PWEmJmNvbnNvbGUuZXJyb3IoImJsdXIgZGlyZWN0aW9uIG11c3QgYmUgZWl0aGVyIGxhdGl0dWRpbmFsIG9yIGxvbmdpdHVkaW5hbCEiKTtjb25zdCBjPW5ldyBwc3QoUXN0W29dLGwpLGQ9bC51bmlmb3JtcyxwPSRzdFtuXS0xLG09aXNGaW5pdGUoaSk/TWF0aC5QSS8oMipwKToyKk1hdGguUEkvMzksdT1pL20sZj1pc0Zpbml0ZShpKT8xK01hdGguZmxvb3IoMyp1KToyMDtmPjIwJiZjb25zb2xlLndhcm4oYHNpZ21hUmFkaWFucywgJHtpfSwgaXMgdG9vIGxhcmdlIGFuZCB3aWxsIGNsaXAsIGFzIGl0IHJlcXVlc3RlZCAke2Z9IHNhbXBsZXMgd2hlbiB0aGUgbWF4aW11bSBpcyBzZXQgdG8gMjBgKTtjb25zdCBnPVtdO2xldCBoPTA7Zm9yKGxldCB0PTA7dDwyMDsrK3Qpe2NvbnN0IGU9dC91LG49TWF0aC5leHAoLWUqZS8yKTtnLnB1c2gobiksMD09dD9oKz1uOnQ8ZiYmKGgrPTIqbil9Zm9yKGxldCB0PTA7dDxnLmxlbmd0aDt0KyspZ1t0XT1nW3RdL2g7ZC5lbnZNYXAudmFsdWU9dC50ZXh0dXJlLGQuc2FtcGxlcy52YWx1ZT1mLGQud2VpZ2h0cy52YWx1ZT1nLGQubGF0aXR1ZGluYWwudmFsdWU9ImxhdGl0dWRpbmFsIj09PWEsciYmKGQucG9sZUF4aXMudmFsdWU9ciksZC5kVGhldGEudmFsdWU9bSxkLm1pcEludC52YWx1ZT04LW4sZC5pbnB1dEVuY29kaW5nLnZhbHVlPVpzdFt0LnRleHR1cmUuZW5jb2RpbmddLGQub3V0cHV0RW5jb2RpbmcudmFsdWU9WnN0W3QudGV4dHVyZS5lbmNvZGluZ107Y29uc3QgYj0kc3Rbb107cGx0KGUsMypNYXRoLm1heCgwLFdzdC0yKmIpLCgwPT09bz8wOjIqV3N0KSsyKmIqKG8+ND9vLTgrNDowKSwzKmIsMipiKSxzLnNldFJlbmRlclRhcmdldChlKSxzLnJlbmRlcihjLEpzdCl9fWZ1bmN0aW9uIGxsdCh0KXtyZXR1cm4gdm9pZCAwIT09dCYmdC50eXBlPT09X2l0JiYodC5lbmNvZGluZz09PXppdHx8dC5lbmNvZGluZz09PUlpdHx8dC5lbmNvZGluZz09PUhpdCl9ZnVuY3Rpb24gY2x0KCl7Y29uc3QgdD1bXSxlPVtdLG49W107bGV0IG89ODtmb3IobGV0IGk9MDtpPHFzdDtpKyspe2NvbnN0IGE9TWF0aC5wb3coMixvKTtlLnB1c2goYSk7bGV0IHI9MS9hO2k+ND9yPVlzdFtpLTgrNC0xXTowPT1pJiYocj0wKSxuLnB1c2gocik7Y29uc3Qgcz0xLyhhLTEpLGw9LXMvMixjPTErcy8yLGQ9W2wsbCxjLGwsYyxjLGwsbCxjLGMsbCxjXSxwPTYsbT02LHU9MyxmPTIsZz0xLGg9bmV3IEZsb2F0MzJBcnJheSh1Km0qcCksYj1uZXcgRmxvYXQzMkFycmF5KGYqbSpwKSx5PW5ldyBGbG9hdDMyQXJyYXkoZyptKnApO2ZvcihsZXQgdD0wO3Q8cDt0Kyspe2NvbnN0IGU9dCUzKjIvMy0xLG49dD4yPzA6LTE7aC5zZXQoW2UsbiwwLGUrMi8zLG4sMCxlKzIvMyxuKzEsMCxlLG4sMCxlKzIvMyxuKzEsMCxlLG4rMSwwXSx1Km0qdCksYi5zZXQoZCxmKm0qdCkseS5zZXQoW3QsdCx0LHQsdCx0XSxnKm0qdCl9Y29uc3QgXz1uZXcgcXJ0O18uc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IHpydChoLHUpKSxfLnNldEF0dHJpYnV0ZSgidXYiLG5ldyB6cnQoYixmKSksXy5zZXRBdHRyaWJ1dGUoImZhY2VJbmRleCIsbmV3IHpydCh5LGcpKSx0LnB1c2goXyksbz40JiZvLS19cmV0dXJue19sb2RQbGFuZXM6dCxfc2l6ZUxvZHM6ZSxfc2lnbWFzOm59fWZ1bmN0aW9uIGRsdCh0KXtjb25zdCBlPW5ldyByYXQoMypXc3QsMypXc3QsdCk7cmV0dXJuIGUudGV4dHVyZS5tYXBwaW5nPW1pdCxlLnRleHR1cmUubmFtZT0iUE1SRU0uY3ViZVV2IixlLnNjaXNzb3JUZXN0PSEwLGV9ZnVuY3Rpb24gcGx0KHQsZSxuLG8saSl7dC52aWV3cG9ydC5zZXQoZSxuLG8saSksdC5zY2lzc29yLnNldChlLG4sbyxpKX1mdW5jdGlvbiBtbHQoKXtjb25zdCB0PW5ldyBRaXQoMSwxKTtyZXR1cm4gbmV3IEdzdCh7bmFtZToiRXF1aXJlY3Rhbmd1bGFyVG9DdWJlVVYiLHVuaWZvcm1zOntlbnZNYXA6e3ZhbHVlOm51bGx9LHRleGVsU2l6ZTp7dmFsdWU6dH0saW5wdXRFbmNvZGluZzp7dmFsdWU6WnN0WzNlM119LG91dHB1dEVuY29kaW5nOnt2YWx1ZTpac3RbM2UzXX19LHZlcnRleFNoYWRlcjoiXG5cblx0XHRwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblx0XHRwcmVjaXNpb24gbWVkaXVtcCBpbnQ7XG5cblx0XHRhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjtcblx0XHRhdHRyaWJ1dGUgdmVjMiB1djtcblx0XHRhdHRyaWJ1dGUgZmxvYXQgZmFjZUluZGV4O1xuXG5cdFx0dmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247XG5cblx0XHQvLyBSSCBjb29yZGluYXRlIHN5c3RlbTsgUE1SRU0gZmFjZS1pbmRleGluZyBjb252ZW50aW9uXG5cdFx0dmVjMyBnZXREaXJlY3Rpb24oIHZlYzIgdXYsIGZsb2F0IGZhY2UgKSB7XG5cblx0XHRcdHV2ID0gMi4wICogdXYgLSAxLjA7XG5cblx0XHRcdHZlYzMgZGlyZWN0aW9uID0gdmVjMyggdXYsIDEuMCApO1xuXG5cdFx0XHRpZiAoIGZhY2UgPT0gMC4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi56eXg7IC8vICggMSwgdiwgdSApIHBvcyB4XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMS4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi54enk7XG5cdFx0XHRcdGRpcmVjdGlvbi54eiAqPSAtMS4wOyAvLyAoIC11LCAxLCAtdiApIHBvcyB5XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMi4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbi54ICo9IC0xLjA7IC8vICggLXUsIHYsIDEgKSBwb3MgelxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDMuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24uenl4O1xuXHRcdFx0XHRkaXJlY3Rpb24ueHogKj0gLTEuMDsgLy8gKCAtMSwgdiwgLXUgKSBuZWcgeFxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDQuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24ueHp5O1xuXHRcdFx0XHRkaXJlY3Rpb24ueHkgKj0gLTEuMDsgLy8gKCAtdSwgLTEsIHYgKSBuZWcgeVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDUuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24ueiAqPSAtMS4wOyAvLyAoIHUsIHYsIC0xICkgbmVnIHpcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGlyZWN0aW9uO1xuXG5cdFx0fVxuXG5cdFx0dm9pZCBtYWluKCkge1xuXG5cdFx0XHR2T3V0cHV0RGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKCB1diwgZmFjZUluZGV4ICk7XG5cdFx0XHRnbF9Qb3NpdGlvbiA9IHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcblxuXHRcdH1cblx0IixmcmFnbWVudFNoYWRlcjoiXG5cblx0XHRcdHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgaW50O1xuXG5cdFx0XHR2YXJ5aW5nIHZlYzMgdk91dHB1dERpcmVjdGlvbjtcblxuXHRcdFx0dW5pZm9ybSBzYW1wbGVyMkQgZW52TWFwO1xuXHRcdFx0dW5pZm9ybSB2ZWMyIHRleGVsU2l6ZTtcblxuXHRcdFx0XG5cblx0XHR1bmlmb3JtIGludCBpbnB1dEVuY29kaW5nO1xuXHRcdHVuaWZvcm0gaW50IG91dHB1dEVuY29kaW5nO1xuXG5cdFx0I2luY2x1ZGUgPGVuY29kaW5nc19wYXJzX2ZyYWdtZW50PlxuXG5cdFx0dmVjNCBpbnB1dFRleGVsVG9MaW5lYXIoIHZlYzQgdmFsdWUgKSB7XG5cblx0XHRcdGlmICggaW5wdXRFbmNvZGluZyA9PSAwICkge1xuXG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW5wdXRFbmNvZGluZyA9PSAxICkge1xuXG5cdFx0XHRcdHJldHVybiBzUkdCVG9MaW5lYXIoIHZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gMiApIHtcblxuXHRcdFx0XHRyZXR1cm4gUkdCRVRvTGluZWFyKCB2YWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDMgKSB7XG5cblx0XHRcdFx0cmV0dXJuIFJHQk1Ub0xpbmVhciggdmFsdWUsIDcuMCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIFJHQk1Ub0xpbmVhciggdmFsdWUsIDE2LjAgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW5wdXRFbmNvZGluZyA9PSA1ICkge1xuXG5cdFx0XHRcdHJldHVybiBSR0JEVG9MaW5lYXIoIHZhbHVlLCAyNTYuMCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBHYW1tYVRvTGluZWFyKCB2YWx1ZSwgMi4yICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZlYzQgbGluZWFyVG9PdXRwdXRUZXhlbCggdmVjNCB2YWx1ZSApIHtcblxuXHRcdFx0aWYgKCBvdXRwdXRFbmNvZGluZyA9PSAwICkge1xuXG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gMSApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9zUkdCKCB2YWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvdXRwdXRFbmNvZGluZyA9PSAyICkge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb1JHQkUoIHZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDMgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvUkdCTSggdmFsdWUsIDcuMCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvdXRwdXRFbmNvZGluZyA9PSA0ICkge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb1JHQk0oIHZhbHVlLCAxNi4wICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvUkdCRCggdmFsdWUsIDI1Ni4wICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvR2FtbWEoIHZhbHVlLCAyLjIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmVjNCBlbnZNYXBUZXhlbFRvTGluZWFyKCB2ZWM0IGNvbG9yICkge1xuXG5cdFx0XHRyZXR1cm4gaW5wdXRUZXhlbFRvTGluZWFyKCBjb2xvciApO1xuXG5cdFx0fVxuXHRcblxuXHRcdFx0I2luY2x1ZGUgPGNvbW1vbj5cblxuXHRcdFx0dm9pZCBtYWluKCkge1xuXG5cdFx0XHRcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIDAuMCwgMC4wLCAwLjAsIDEuMCApO1xuXG5cdFx0XHRcdHZlYzMgb3V0cHV0RGlyZWN0aW9uID0gbm9ybWFsaXplKCB2T3V0cHV0RGlyZWN0aW9uICk7XG5cdFx0XHRcdHZlYzIgdXYgPSBlcXVpcmVjdFV2KCBvdXRwdXREaXJlY3Rpb24gKTtcblxuXHRcdFx0XHR2ZWMyIGYgPSBmcmFjdCggdXYgLyB0ZXhlbFNpemUgLSAwLjUgKTtcblx0XHRcdFx0dXYgLT0gZiAqIHRleGVsU2l6ZTtcblx0XHRcdFx0dmVjMyB0bCA9IGVudk1hcFRleGVsVG9MaW5lYXIoIHRleHR1cmUyRCAoIGVudk1hcCwgdXYgKSApLnJnYjtcblx0XHRcdFx0dXYueCArPSB0ZXhlbFNpemUueDtcblx0XHRcdFx0dmVjMyB0ciA9IGVudk1hcFRleGVsVG9MaW5lYXIoIHRleHR1cmUyRCAoIGVudk1hcCwgdXYgKSApLnJnYjtcblx0XHRcdFx0dXYueSArPSB0ZXhlbFNpemUueTtcblx0XHRcdFx0dmVjMyBiciA9IGVudk1hcFRleGVsVG9MaW5lYXIoIHRleHR1cmUyRCAoIGVudk1hcCwgdXYgKSApLnJnYjtcblx0XHRcdFx0dXYueCAtPSB0ZXhlbFNpemUueDtcblx0XHRcdFx0dmVjMyBibCA9IGVudk1hcFRleGVsVG9MaW5lYXIoIHRleHR1cmUyRCAoIGVudk1hcCwgdXYgKSApLnJnYjtcblxuXHRcdFx0XHR2ZWMzIHRtID0gbWl4KCB0bCwgdHIsIGYueCApO1xuXHRcdFx0XHR2ZWMzIGJtID0gbWl4KCBibCwgYnIsIGYueCApO1xuXHRcdFx0XHRnbF9GcmFnQ29sb3IucmdiID0gbWl4KCB0bSwgYm0sIGYueSApO1xuXG5cdFx0XHRcdGdsX0ZyYWdDb2xvciA9IGxpbmVhclRvT3V0cHV0VGV4ZWwoIGdsX0ZyYWdDb2xvciApO1xuXG5cdFx0XHR9XG5cdFx0IixibGVuZGluZzowLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExfSl9ZnVuY3Rpb24gdWx0KCl7cmV0dXJuIG5ldyBHc3Qoe25hbWU6IkN1YmVtYXBUb0N1YmVVViIsdW5pZm9ybXM6e2Vudk1hcDp7dmFsdWU6bnVsbH0saW5wdXRFbmNvZGluZzp7dmFsdWU6WnN0WzNlM119LG91dHB1dEVuY29kaW5nOnt2YWx1ZTpac3RbM2UzXX19LHZlcnRleFNoYWRlcjoiXG5cblx0XHRwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblx0XHRwcmVjaXNpb24gbWVkaXVtcCBpbnQ7XG5cblx0XHRhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjtcblx0XHRhdHRyaWJ1dGUgdmVjMiB1djtcblx0XHRhdHRyaWJ1dGUgZmxvYXQgZmFjZUluZGV4O1xuXG5cdFx0dmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247XG5cblx0XHQvLyBSSCBjb29yZGluYXRlIHN5c3RlbTsgUE1SRU0gZmFjZS1pbmRleGluZyBjb252ZW50aW9uXG5cdFx0dmVjMyBnZXREaXJlY3Rpb24oIHZlYzIgdXYsIGZsb2F0IGZhY2UgKSB7XG5cblx0XHRcdHV2ID0gMi4wICogdXYgLSAxLjA7XG5cblx0XHRcdHZlYzMgZGlyZWN0aW9uID0gdmVjMyggdXYsIDEuMCApO1xuXG5cdFx0XHRpZiAoIGZhY2UgPT0gMC4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi56eXg7IC8vICggMSwgdiwgdSApIHBvcyB4XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMS4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi54enk7XG5cdFx0XHRcdGRpcmVjdGlvbi54eiAqPSAtMS4wOyAvLyAoIC11LCAxLCAtdiApIHBvcyB5XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMi4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbi54ICo9IC0xLjA7IC8vICggLXUsIHYsIDEgKSBwb3MgelxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDMuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24uenl4O1xuXHRcdFx0XHRkaXJlY3Rpb24ueHogKj0gLTEuMDsgLy8gKCAtMSwgdiwgLXUgKSBuZWcgeFxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDQuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24ueHp5O1xuXHRcdFx0XHRkaXJlY3Rpb24ueHkgKj0gLTEuMDsgLy8gKCAtdSwgLTEsIHYgKSBuZWcgeVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDUuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24ueiAqPSAtMS4wOyAvLyAoIHUsIHYsIC0xICkgbmVnIHpcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGlyZWN0aW9uO1xuXG5cdFx0fVxuXG5cdFx0dm9pZCBtYWluKCkge1xuXG5cdFx0XHR2T3V0cHV0RGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKCB1diwgZmFjZUluZGV4ICk7XG5cdFx0XHRnbF9Qb3NpdGlvbiA9IHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcblxuXHRcdH1cblx0IixmcmFnbWVudFNoYWRlcjoiXG5cblx0XHRcdHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgaW50O1xuXG5cdFx0XHR2YXJ5aW5nIHZlYzMgdk91dHB1dERpcmVjdGlvbjtcblxuXHRcdFx0dW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZNYXA7XG5cblx0XHRcdFxuXG5cdFx0dW5pZm9ybSBpbnQgaW5wdXRFbmNvZGluZztcblx0XHR1bmlmb3JtIGludCBvdXRwdXRFbmNvZGluZztcblxuXHRcdCNpbmNsdWRlIDxlbmNvZGluZ3NfcGFyc19mcmFnbWVudD5cblxuXHRcdHZlYzQgaW5wdXRUZXhlbFRvTGluZWFyKCB2ZWM0IHZhbHVlICkge1xuXG5cdFx0XHRpZiAoIGlucHV0RW5jb2RpbmcgPT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gMSApIHtcblxuXHRcdFx0XHRyZXR1cm4gc1JHQlRvTGluZWFyKCB2YWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDIgKSB7XG5cblx0XHRcdFx0cmV0dXJuIFJHQkVUb0xpbmVhciggdmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW5wdXRFbmNvZGluZyA9PSAzICkge1xuXG5cdFx0XHRcdHJldHVybiBSR0JNVG9MaW5lYXIoIHZhbHVlLCA3LjAgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW5wdXRFbmNvZGluZyA9PSA0ICkge1xuXG5cdFx0XHRcdHJldHVybiBSR0JNVG9MaW5lYXIoIHZhbHVlLCAxNi4wICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gNSApIHtcblxuXHRcdFx0XHRyZXR1cm4gUkdCRFRvTGluZWFyKCB2YWx1ZSwgMjU2LjAgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZXR1cm4gR2FtbWFUb0xpbmVhciggdmFsdWUsIDIuMiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2ZWM0IGxpbmVhclRvT3V0cHV0VGV4ZWwoIHZlYzQgdmFsdWUgKSB7XG5cblx0XHRcdGlmICggb3V0cHV0RW5jb2RpbmcgPT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDEgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvc1JHQiggdmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gMiApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9SR0JFKCB2YWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvdXRwdXRFbmNvZGluZyA9PSAzICkge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb1JHQk0oIHZhbHVlLCA3LjAgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gNCApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9SR0JNKCB2YWx1ZSwgMTYuMCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvdXRwdXRFbmNvZGluZyA9PSA1ICkge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb1JHQkQoIHZhbHVlLCAyNTYuMCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb0dhbW1hKCB2YWx1ZSwgMi4yICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZlYzQgZW52TWFwVGV4ZWxUb0xpbmVhciggdmVjNCBjb2xvciApIHtcblxuXHRcdFx0cmV0dXJuIGlucHV0VGV4ZWxUb0xpbmVhciggY29sb3IgKTtcblxuXHRcdH1cblx0XG5cblx0XHRcdHZvaWQgbWFpbigpIHtcblxuXHRcdFx0XHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTtcblx0XHRcdFx0Z2xfRnJhZ0NvbG9yLnJnYiA9IGVudk1hcFRleGVsVG9MaW5lYXIoIHRleHR1cmVDdWJlKCBlbnZNYXAsIHZlYzMoIC0gdk91dHB1dERpcmVjdGlvbi54LCB2T3V0cHV0RGlyZWN0aW9uLnl6ICkgKSApLnJnYjtcblx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbCggZ2xfRnJhZ0NvbG9yICk7XG5cblx0XHRcdH1cblx0XHQiLGJsZW5kaW5nOjAsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITF9KX1mdW5jdGlvbiBmbHQodCl7bGV0IGU9bmV3IFdlYWtNYXAsbj1udWxsO2Z1bmN0aW9uIG8odCl7Y29uc3Qgbj10LnRhcmdldDtuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLG8pO2NvbnN0IGk9ZS5nZXQobik7dm9pZCAwIT09aSYmKGkuZGVsZXRlKG4pLGkuZGlzcG9zZSgpKX1yZXR1cm57Z2V0OmZ1bmN0aW9uIGkoYSl7aWYoYSYmYS5pc1RleHR1cmUmJiExPT09YS5pc1JlbmRlclRhcmdldFRleHR1cmUpe2NvbnN0IGk9YS5tYXBwaW5nLHI9MzAzPT09aXx8MzA0PT09aSxzPWk9PT1kaXR8fGk9PT1waXQ7aWYocnx8cyl7aWYoZS5oYXMoYSkpcmV0dXJuIGUuZ2V0KGEpLnRleHR1cmU7e2NvbnN0IGk9YS5pbWFnZTtpZihyJiZpJiZpLmhlaWdodD4wfHxzJiZpJiYoZnVuY3Rpb24gcih0KXtsZXQgZT0wO2ZvcihsZXQgbj0wO248NjtuKyspdm9pZCAwIT09dFtuXSYmZSsrO3JldHVybiA2PT09ZX0pKGkpKXtjb25zdCBpPXQuZ2V0UmVuZGVyVGFyZ2V0KCk7bnVsbD09PW4mJihuPW5ldyBzbHQodCkpO2NvbnN0IHM9cj9uLmZyb21FcXVpcmVjdGFuZ3VsYXIoYSk6bi5mcm9tQ3ViZW1hcChhKTtyZXR1cm4gZS5zZXQoYSxzKSx0LnNldFJlbmRlclRhcmdldChpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLG8pLHMudGV4dHVyZX1yZXR1cm4gbnVsbH19fXJldHVybiBhfSxkaXNwb3NlOmZ1bmN0aW9uIGEoKXtlPW5ldyBXZWFrTWFwLG51bGwhPT1uJiYobi5kaXNwb3NlKCksbj1udWxsKX19fWZ1bmN0aW9uIGdsdCh0KXtjb25zdCBlPXt9O2Z1bmN0aW9uIG4obil7aWYodm9pZCAwIT09ZVtuXSlyZXR1cm4gZVtuXTtsZXQgbztzd2l0Y2gobil7Y2FzZSJXRUJHTF9kZXB0aF90ZXh0dXJlIjpvPXQuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9kZXB0aF90ZXh0dXJlIil8fHQuZ2V0RXh0ZW5zaW9uKCJNT1pfV0VCR0xfZGVwdGhfdGV4dHVyZSIpfHx0LmdldEV4dGVuc2lvbigiV0VCS0lUX1dFQkdMX2RlcHRoX3RleHR1cmUiKTticmVhaztjYXNlIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyI6bz10LmdldEV4dGVuc2lvbigiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIil8fHQuZ2V0RXh0ZW5zaW9uKCJNT1pfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIil8fHQuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik7YnJlYWs7Y2FzZSJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyI6bz10LmdldEV4dGVuc2lvbigiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKXx8dC5nZXRFeHRlbnNpb24oIk1PWl9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpfHx0LmdldEV4dGVuc2lvbigiV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIik7YnJlYWs7Y2FzZSJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiOm89dC5nZXRFeHRlbnNpb24oIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpfHx0LmdldEV4dGVuc2lvbigiV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpO2JyZWFrO2RlZmF1bHQ6bz10LmdldEV4dGVuc2lvbihuKX1yZXR1cm4gZVtuXT1vLG99cmV0dXJue2hhczpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9PW4odCl9LGluaXQ6ZnVuY3Rpb24odCl7dC5pc1dlYkdMMj9uKCJFWFRfY29sb3JfYnVmZmVyX2Zsb2F0Iik6KG4oIldFQkdMX2RlcHRoX3RleHR1cmUiKSxuKCJPRVNfdGV4dHVyZV9mbG9hdCIpLG4oIk9FU190ZXh0dXJlX2hhbGZfZmxvYXQiKSxuKCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhciIpLG4oIk9FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyIpLG4oIk9FU19lbGVtZW50X2luZGV4X3VpbnQiKSxuKCJPRVNfdmVydGV4X2FycmF5X29iamVjdCIpLG4oIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSksbigiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIiksbigiRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0Iil9LGdldDpmdW5jdGlvbih0KXtjb25zdCBlPW4odCk7cmV0dXJuIG51bGw9PT1lJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6ICIrdCsiIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLiIpLGV9fX1mdW5jdGlvbiBobHQodCxlLG4sbyl7Y29uc3QgaT17fSxhPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIHIodCl7Y29uc3Qgcz10LnRhcmdldDtudWxsIT09cy5pbmRleCYmZS5yZW1vdmUocy5pbmRleCk7Zm9yKGNvbnN0IHQgaW4gcy5hdHRyaWJ1dGVzKWUucmVtb3ZlKHMuYXR0cmlidXRlc1t0XSk7cy5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixyKSxkZWxldGUgaVtzLmlkXTtjb25zdCBsPWEuZ2V0KHMpO2wmJihlLnJlbW92ZShsKSxhLmRlbGV0ZShzKSksby5yZWxlYXNlU3RhdGVzT2ZHZW9tZXRyeShzKSwhMD09PXMuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSYmZGVsZXRlIHMuX21heEluc3RhbmNlQ291bnQsbi5tZW1vcnkuZ2VvbWV0cmllcy0tfWZ1bmN0aW9uIHModCl7Y29uc3Qgbj1bXSxvPXQuaW5kZXgsaT10LmF0dHJpYnV0ZXMucG9zaXRpb247bGV0IHI9MDtpZihudWxsIT09byl7Y29uc3QgdD1vLmFycmF5O3I9by52ZXJzaW9uO2ZvcihsZXQgZT0wLG89dC5sZW5ndGg7ZTxvO2UrPTMpe2NvbnN0IG89dFtlKzBdLGk9dFtlKzFdLGE9dFtlKzJdO24ucHVzaChvLGksaSxhLGEsbyl9fWVsc2V7cj1pLnZlcnNpb247Zm9yKGxldCB0PTAsZT1pLmFycmF5Lmxlbmd0aC8zLTE7dDxlO3QrPTMpe2NvbnN0IGU9dCswLG89dCsxLGk9dCsyO24ucHVzaChlLG8sbyxpLGksZSl9fWNvbnN0IHM9bmV3KExydChuKT42NTUzNT9IcnQ6SXJ0KShuLDEpO3MudmVyc2lvbj1yO2NvbnN0IGw9YS5nZXQodCk7bCYmZS5yZW1vdmUobCksYS5zZXQodCxzKX1yZXR1cm57Z2V0OmZ1bmN0aW9uIGwodCxlKXtyZXR1cm4hMD09PWlbZS5pZF18fChlLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHIpLGlbZS5pZF09ITAsbi5tZW1vcnkuZ2VvbWV0cmllcysrKSxlfSx1cGRhdGU6ZnVuY3Rpb24gYyh0KXtjb25zdCBuPXQuYXR0cmlidXRlcztmb3IoY29uc3QgdCBpbiBuKWUudXBkYXRlKG5bdF0sMzQ5NjIpO2NvbnN0IG89dC5tb3JwaEF0dHJpYnV0ZXM7Zm9yKGNvbnN0IHQgaW4gbyl7Y29uc3Qgbj1vW3RdO2ZvcihsZXQgdD0wLG89bi5sZW5ndGg7dDxvO3QrKyllLnVwZGF0ZShuW3RdLDM0OTYyKX19LGdldFdpcmVmcmFtZUF0dHJpYnV0ZTpmdW5jdGlvbiBkKHQpe2NvbnN0IGU9YS5nZXQodCk7aWYoZSl7Y29uc3Qgbj10LmluZGV4O251bGwhPT1uJiZlLnZlcnNpb248bi52ZXJzaW9uJiZzKHQpfWVsc2Ugcyh0KTtyZXR1cm4gYS5nZXQodCl9fX1mdW5jdGlvbiBibHQodCxlLG4sbyl7Y29uc3QgaT1vLmlzV2ViR0wyO2xldCBhLHIsczt0aGlzLnNldE1vZGU9ZnVuY3Rpb24gbCh0KXthPXR9LHRoaXMuc2V0SW5kZXg9ZnVuY3Rpb24gYyh0KXtyPXQudHlwZSxzPXQuYnl0ZXNQZXJFbGVtZW50fSx0aGlzLnJlbmRlcj1mdW5jdGlvbiBkKGUsbyl7dC5kcmF3RWxlbWVudHMoYSxvLHIsZSpzKSxuLnVwZGF0ZShvLGEsMSl9LHRoaXMucmVuZGVySW5zdGFuY2VzPWZ1bmN0aW9uIHAobyxsLGMpe2lmKDA9PT1jKXJldHVybjtsZXQgZCxwO2lmKGkpZD10LHA9ImRyYXdFbGVtZW50c0luc3RhbmNlZCI7ZWxzZSBpZihkPWUuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikscD0iZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUiLG51bGw9PT1kKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyOiB1c2luZyBUSFJFRS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNpb24gQU5HTEVfaW5zdGFuY2VkX2FycmF5cy4iKTtkW3BdKGEsbCxyLG8qcyxjKSxuLnVwZGF0ZShsLGEsYyl9fWZ1bmN0aW9uIHlsdCh0KXtjb25zdCBlPXtmcmFtZTowLGNhbGxzOjAsdHJpYW5nbGVzOjAscG9pbnRzOjAsbGluZXM6MH07cmV0dXJue21lbW9yeTp7Z2VvbWV0cmllczowLHRleHR1cmVzOjB9LHJlbmRlcjplLHByb2dyYW1zOm51bGwsYXV0b1Jlc2V0OiEwLHJlc2V0OmZ1bmN0aW9uIG4oKXtlLmZyYW1lKyssZS5jYWxscz0wLGUudHJpYW5nbGVzPTAsZS5wb2ludHM9MCxlLmxpbmVzPTB9LHVwZGF0ZTpmdW5jdGlvbiBvKHQsbixpKXtzd2l0Y2goZS5jYWxscysrLG4pe2Nhc2UgNDplLnRyaWFuZ2xlcys9aSoodC8zKTticmVhaztjYXNlIDE6ZS5saW5lcys9aSoodC8yKTticmVhaztjYXNlIDM6ZS5saW5lcys9aSoodC0xKTticmVhaztjYXNlIDI6ZS5saW5lcys9aSp0O2JyZWFrO2Nhc2UgMDplLnBvaW50cys9aSp0O2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xJbmZvOiBVbmtub3duIGRyYXcgbW9kZToiLG4pfX19fWZ1bmN0aW9uIF9sdCh0LGUpe3JldHVybiB0WzBdLWVbMF19ZnVuY3Rpb24gQ2x0KHQsZSl7cmV0dXJuIE1hdGguYWJzKGVbMV0pLU1hdGguYWJzKHRbMV0pfWZ1bmN0aW9uIE1sdCh0KXtjb25zdCBlPXt9LG49bmV3IEZsb2F0MzJBcnJheSg4KSxvPVtdO2ZvcihsZXQgdD0wO3Q8ODt0Kyspb1t0XT1bdCwwXTtyZXR1cm57dXBkYXRlOmZ1bmN0aW9uIGkoYSxyLHMsbCl7Y29uc3QgYz1hLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyxkPXZvaWQgMD09PWM/MDpjLmxlbmd0aDtsZXQgcD1lW3IuaWRdO2lmKHZvaWQgMD09PXB8fHAubGVuZ3RoIT09ZCl7cD1bXTtmb3IobGV0IHQ9MDt0PGQ7dCsrKXBbdF09W3QsMF07ZVtyLmlkXT1wfWZvcihsZXQgdD0wO3Q8ZDt0Kyspe2NvbnN0IGU9cFt0XTtlWzBdPXQsZVsxXT1jW3RdfXAuc29ydChDbHQpO2ZvcihsZXQgdD0wO3Q8ODt0KyspdDxkJiZwW3RdWzFdPyhvW3RdWzBdPXBbdF1bMF0sb1t0XVsxXT1wW3RdWzFdKToob1t0XVswXT1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUixvW3RdWzFdPTApO28uc29ydChfbHQpO2NvbnN0IG09ci5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24sdT1yLm1vcnBoQXR0cmlidXRlcy5ub3JtYWw7bGV0IGY9MDtmb3IobGV0IHQ9MDt0PDg7dCsrKXtjb25zdCBlPW9bdF0saT1lWzBdLGE9ZVsxXTtpIT09TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVImJmE/KG0mJnIuZ2V0QXR0cmlidXRlKCJtb3JwaFRhcmdldCIrdCkhPT1tW2ldJiZyLnNldEF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK3QsbVtpXSksdSYmci5nZXRBdHRyaWJ1dGUoIm1vcnBoTm9ybWFsIit0KSE9PXVbaV0mJnIuc2V0QXR0cmlidXRlKCJtb3JwaE5vcm1hbCIrdCx1W2ldKSxuW3RdPWEsZis9YSk6KG0mJiEwPT09ci5oYXNBdHRyaWJ1dGUoIm1vcnBoVGFyZ2V0Iit0KSYmci5kZWxldGVBdHRyaWJ1dGUoIm1vcnBoVGFyZ2V0Iit0KSx1JiYhMD09PXIuaGFzQXR0cmlidXRlKCJtb3JwaE5vcm1hbCIrdCkmJnIuZGVsZXRlQXR0cmlidXRlKCJtb3JwaE5vcm1hbCIrdCksblt0XT0wKX1jb25zdCBnPXIubW9ycGhUYXJnZXRzUmVsYXRpdmU/MToxLWY7bC5nZXRVbmlmb3JtcygpLnNldFZhbHVlKHQsIm1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZSIsZyksbC5nZXRVbmlmb3JtcygpLnNldFZhbHVlKHQsIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyIsbil9fX1mdW5jdGlvbiB2bHQodCxlLG4sbyl7bGV0IGk9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gYSh0KXtjb25zdCBlPXQudGFyZ2V0O2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYSksbi5yZW1vdmUoZS5pbnN0YW5jZU1hdHJpeCksbnVsbCE9PWUuaW5zdGFuY2VDb2xvciYmbi5yZW1vdmUoZS5pbnN0YW5jZUNvbG9yKX1yZXR1cm57dXBkYXRlOmZ1bmN0aW9uIHIodCl7Y29uc3Qgcj1vLnJlbmRlci5mcmFtZSxzPWUuZ2V0KHQsdC5nZW9tZXRyeSk7cmV0dXJuIGkuZ2V0KHMpIT09ciYmKGUudXBkYXRlKHMpLGkuc2V0KHMscikpLHQuaXNJbnN0YW5jZWRNZXNoJiYoITE9PT10Lmhhc0V2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGEpJiZ0LmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGEpLG4udXBkYXRlKHQuaW5zdGFuY2VNYXRyaXgsMzQ5NjIpLG51bGwhPT10Lmluc3RhbmNlQ29sb3ImJm4udXBkYXRlKHQuaW5zdGFuY2VDb2xvciwzNDk2MikpLHN9LGRpc3Bvc2U6ZnVuY3Rpb24gcygpe2k9bmV3IFdlYWtNYXB9fX1jbGFzcyB4bHQgZXh0ZW5kcyBvYXR7Y29uc3RydWN0b3IodD1udWxsLGU9MSxuPTEsbz0xKXtzdXBlcihudWxsKSx0aGlzLmltYWdlPXtkYXRhOnQsd2lkdGg6ZSxoZWlnaHQ6bixkZXB0aDpvfSx0aGlzLm1hZ0ZpbHRlcj1oaXQsdGhpcy5taW5GaWx0ZXI9aGl0LHRoaXMud3JhcFI9Zml0LHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExLHRoaXMuZmxpcFk9ITEsdGhpcy51bnBhY2tBbGlnbm1lbnQ9MSx0aGlzLm5lZWRzVXBkYXRlPSEwfX14bHQucHJvdG90eXBlLmlzRGF0YVRleHR1cmUyREFycmF5PSEwO2NsYXNzIE9sdCBleHRlbmRzIG9hdHtjb25zdHJ1Y3Rvcih0PW51bGwsZT0xLG49MSxvPTEpe3N1cGVyKG51bGwpLHRoaXMuaW1hZ2U9e2RhdGE6dCx3aWR0aDplLGhlaWdodDpuLGRlcHRoOm99LHRoaXMubWFnRmlsdGVyPWhpdCx0aGlzLm1pbkZpbHRlcj1oaXQsdGhpcy53cmFwUj1maXQsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITEsdGhpcy5mbGlwWT0hMSx0aGlzLnVucGFja0FsaWdubWVudD0xLHRoaXMubmVlZHNVcGRhdGU9ITB9fU9sdC5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZTNEPSEwO2NvbnN0IFBsdD1uZXcgb2F0LHdsdD1uZXcgeGx0LGtsdD1uZXcgT2x0LFNsdD1uZXcgdnN0LERsdD1bXSxFbHQ9W10sUmx0PW5ldyBGbG9hdDMyQXJyYXkoMTYpLEFsdD1uZXcgRmxvYXQzMkFycmF5KDkpLFRsdD1uZXcgRmxvYXQzMkFycmF5KDQpO2Z1bmN0aW9uIE5sdCh0LGUsbil7Y29uc3Qgbz10WzBdO2lmKG88PTB8fG8+MClyZXR1cm4gdDtjb25zdCBpPWUqbjtsZXQgYT1EbHRbaV07aWYodm9pZCAwPT09YSYmKGE9bmV3IEZsb2F0MzJBcnJheShpKSxEbHRbaV09YSksMCE9PWUpe28udG9BcnJheShhLDApO2ZvcihsZXQgbz0xLGk9MDtvIT09ZTsrK28paSs9bix0W29dLnRvQXJyYXkoYSxpKX1yZXR1cm4gYX1mdW5jdGlvbiB6bHQodCxlKXtpZih0Lmxlbmd0aCE9PWUubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgbj0wLG89dC5sZW5ndGg7bjxvO24rKylpZih0W25dIT09ZVtuXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBJbHQodCxlKXtmb3IobGV0IG49MCxvPWUubGVuZ3RoO248bztuKyspdFtuXT1lW25dfWZ1bmN0aW9uIEhsdCh0LGUpe2xldCBuPUVsdFtlXTt2b2lkIDA9PT1uJiYobj1uZXcgSW50MzJBcnJheShlKSxFbHRbZV09bik7Zm9yKGxldCBvPTA7byE9PWU7KytvKW5bb109dC5hbGxvY2F0ZVRleHR1cmVVbml0KCk7cmV0dXJuIG59ZnVuY3Rpb24gRmx0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlO25bMF0hPT1lJiYodC51bmlmb3JtMWYodGhpcy5hZGRyLGUpLG5bMF09ZSl9ZnVuY3Rpb24gTGx0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlO2lmKHZvaWQgMCE9PWUueCluWzBdPT09ZS54JiZuWzFdPT09ZS55fHwodC51bmlmb3JtMmYodGhpcy5hZGRyLGUueCxlLnkpLG5bMF09ZS54LG5bMV09ZS55KTtlbHNle2lmKHpsdChuLGUpKXJldHVybjt0LnVuaWZvcm0yZnYodGhpcy5hZGRyLGUpLElsdChuLGUpfX1mdW5jdGlvbiBCbHQodCxlKXtjb25zdCBuPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09ZS54KW5bMF09PT1lLngmJm5bMV09PT1lLnkmJm5bMl09PT1lLnp8fCh0LnVuaWZvcm0zZih0aGlzLmFkZHIsZS54LGUueSxlLnopLG5bMF09ZS54LG5bMV09ZS55LG5bMl09ZS56KTtlbHNlIGlmKHZvaWQgMCE9PWUuciluWzBdPT09ZS5yJiZuWzFdPT09ZS5nJiZuWzJdPT09ZS5ifHwodC51bmlmb3JtM2YodGhpcy5hZGRyLGUucixlLmcsZS5iKSxuWzBdPWUucixuWzFdPWUuZyxuWzJdPWUuYik7ZWxzZXtpZih6bHQobixlKSlyZXR1cm47dC51bmlmb3JtM2Z2KHRoaXMuYWRkcixlKSxJbHQobixlKX19ZnVuY3Rpb24gVmx0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlO2lmKHZvaWQgMCE9PWUueCluWzBdPT09ZS54JiZuWzFdPT09ZS55JiZuWzJdPT09ZS56JiZuWzNdPT09ZS53fHwodC51bmlmb3JtNGYodGhpcy5hZGRyLGUueCxlLnksZS56LGUudyksblswXT1lLngsblsxXT1lLnksblsyXT1lLnosblszXT1lLncpO2Vsc2V7aWYoemx0KG4sZSkpcmV0dXJuO3QudW5pZm9ybTRmdih0aGlzLmFkZHIsZSksSWx0KG4sZSl9fWZ1bmN0aW9uIGpsdCh0LGUpe2NvbnN0IG49dGhpcy5jYWNoZSxvPWUuZWxlbWVudHM7aWYodm9pZCAwPT09byl7aWYoemx0KG4sZSkpcmV0dXJuO3QudW5pZm9ybU1hdHJpeDJmdih0aGlzLmFkZHIsITEsZSksSWx0KG4sZSl9ZWxzZXtpZih6bHQobixvKSlyZXR1cm47VGx0LnNldChvKSx0LnVuaWZvcm1NYXRyaXgyZnYodGhpcy5hZGRyLCExLFRsdCksSWx0KG4sbyl9fWZ1bmN0aW9uIFVsdCh0LGUpe2NvbnN0IG49dGhpcy5jYWNoZSxvPWUuZWxlbWVudHM7aWYodm9pZCAwPT09byl7aWYoemx0KG4sZSkpcmV0dXJuO3QudW5pZm9ybU1hdHJpeDNmdih0aGlzLmFkZHIsITEsZSksSWx0KG4sZSl9ZWxzZXtpZih6bHQobixvKSlyZXR1cm47QWx0LnNldChvKSx0LnVuaWZvcm1NYXRyaXgzZnYodGhpcy5hZGRyLCExLEFsdCksSWx0KG4sbyl9fWZ1bmN0aW9uIEdsdCh0LGUpe2NvbnN0IG49dGhpcy5jYWNoZSxvPWUuZWxlbWVudHM7aWYodm9pZCAwPT09byl7aWYoemx0KG4sZSkpcmV0dXJuO3QudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsITEsZSksSWx0KG4sZSl9ZWxzZXtpZih6bHQobixvKSlyZXR1cm47Umx0LnNldChvKSx0LnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5hZGRyLCExLFJsdCksSWx0KG4sbyl9fWZ1bmN0aW9uIFdsdCh0LGUpe2NvbnN0IG49dGhpcy5jYWNoZTtuWzBdIT09ZSYmKHQudW5pZm9ybTFpKHRoaXMuYWRkcixlKSxuWzBdPWUpfWZ1bmN0aW9uIFlsdCh0LGUpe2NvbnN0IG49dGhpcy5jYWNoZTt6bHQobixlKXx8KHQudW5pZm9ybTJpdih0aGlzLmFkZHIsZSksSWx0KG4sZSkpfWZ1bmN0aW9uIHFsdCh0LGUpe2NvbnN0IG49dGhpcy5jYWNoZTt6bHQobixlKXx8KHQudW5pZm9ybTNpdih0aGlzLmFkZHIsZSksSWx0KG4sZSkpfWZ1bmN0aW9uIFpsdCh0LGUpe2NvbnN0IG49dGhpcy5jYWNoZTt6bHQobixlKXx8KHQudW5pZm9ybTRpdih0aGlzLmFkZHIsZSksSWx0KG4sZSkpfWZ1bmN0aW9uIFhsdCh0LGUpe2NvbnN0IG49dGhpcy5jYWNoZTtuWzBdIT09ZSYmKHQudW5pZm9ybTF1aSh0aGlzLmFkZHIsZSksblswXT1lKX1mdW5jdGlvbiBLbHQodCxlKXtjb25zdCBuPXRoaXMuY2FjaGU7emx0KG4sZSl8fCh0LnVuaWZvcm0ydWl2KHRoaXMuYWRkcixlKSxJbHQobixlKSl9ZnVuY3Rpb24gSmx0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlO3psdChuLGUpfHwodC51bmlmb3JtM3Vpdih0aGlzLmFkZHIsZSksSWx0KG4sZSkpfWZ1bmN0aW9uIFFsdCh0LGUpe2NvbnN0IG49dGhpcy5jYWNoZTt6bHQobixlKXx8KHQudW5pZm9ybTR1aXYodGhpcy5hZGRyLGUpLElsdChuLGUpKX1mdW5jdGlvbiAkbHQodCxlLG4pe2NvbnN0IG89dGhpcy5jYWNoZSxpPW4uYWxsb2NhdGVUZXh0dXJlVW5pdCgpO29bMF0hPT1pJiYodC51bmlmb3JtMWkodGhpcy5hZGRyLGkpLG9bMF09aSksbi5zYWZlU2V0VGV4dHVyZTJEKGV8fFBsdCxpKX1mdW5jdGlvbiB0Y3QodCxlLG4pe2NvbnN0IG89dGhpcy5jYWNoZSxpPW4uYWxsb2NhdGVUZXh0dXJlVW5pdCgpO29bMF0hPT1pJiYodC51bmlmb3JtMWkodGhpcy5hZGRyLGkpLG9bMF09aSksbi5zZXRUZXh0dXJlM0QoZXx8a2x0LGkpfWZ1bmN0aW9uIGVjdCh0LGUsbil7Y29uc3Qgbz10aGlzLmNhY2hlLGk9bi5hbGxvY2F0ZVRleHR1cmVVbml0KCk7b1swXSE9PWkmJih0LnVuaWZvcm0xaSh0aGlzLmFkZHIsaSksb1swXT1pKSxuLnNhZmVTZXRUZXh0dXJlQ3ViZShlfHxTbHQsaSl9ZnVuY3Rpb24gbmN0KHQsZSxuKXtjb25zdCBvPXRoaXMuY2FjaGUsaT1uLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtvWzBdIT09aSYmKHQudW5pZm9ybTFpKHRoaXMuYWRkcixpKSxvWzBdPWkpLG4uc2V0VGV4dHVyZTJEQXJyYXkoZXx8d2x0LGkpfWZ1bmN0aW9uIG9jdCh0LGUpe3QudW5pZm9ybTFmdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gaWN0KHQsZSl7Y29uc3Qgbj1ObHQoZSx0aGlzLnNpemUsMik7dC51bmlmb3JtMmZ2KHRoaXMuYWRkcixuKX1mdW5jdGlvbiBhY3QodCxlKXtjb25zdCBuPU5sdChlLHRoaXMuc2l6ZSwzKTt0LnVuaWZvcm0zZnYodGhpcy5hZGRyLG4pfWZ1bmN0aW9uIHJjdCh0LGUpe2NvbnN0IG49Tmx0KGUsdGhpcy5zaXplLDQpO3QudW5pZm9ybTRmdih0aGlzLmFkZHIsbil9ZnVuY3Rpb24gc2N0KHQsZSl7Y29uc3Qgbj1ObHQoZSx0aGlzLnNpemUsNCk7dC51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxuKX1mdW5jdGlvbiBsY3QodCxlKXtjb25zdCBuPU5sdChlLHRoaXMuc2l6ZSw5KTt0LnVuaWZvcm1NYXRyaXgzZnYodGhpcy5hZGRyLCExLG4pfWZ1bmN0aW9uIGNjdCh0LGUpe2NvbnN0IG49Tmx0KGUsdGhpcy5zaXplLDE2KTt0LnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5hZGRyLCExLG4pfWZ1bmN0aW9uIGRjdCh0LGUpe3QudW5pZm9ybTFpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gcGN0KHQsZSl7dC51bmlmb3JtMml2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBtY3QodCxlKXt0LnVuaWZvcm0zaXYodGhpcy5hZGRyLGUpfWZ1bmN0aW9uIHVjdCh0LGUpe3QudW5pZm9ybTRpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gZmN0KHQsZSl7dC51bmlmb3JtMXVpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gZ2N0KHQsZSl7dC51bmlmb3JtMnVpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gaGN0KHQsZSl7dC51bmlmb3JtM3Vpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gYmN0KHQsZSl7dC51bmlmb3JtNHVpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24geWN0KHQsZSxuKXtjb25zdCBvPWUubGVuZ3RoLGk9SGx0KG4sbyk7dC51bmlmb3JtMWl2KHRoaXMuYWRkcixpKTtmb3IobGV0IHQ9MDt0IT09bzsrK3Qpbi5zYWZlU2V0VGV4dHVyZTJEKGVbdF18fFBsdCxpW3RdKX1mdW5jdGlvbiBfY3QodCxlLG4pe2NvbnN0IG89ZS5sZW5ndGgsaT1IbHQobixvKTt0LnVuaWZvcm0xaXYodGhpcy5hZGRyLGkpO2ZvcihsZXQgdD0wO3QhPT1vOysrdCluLnNhZmVTZXRUZXh0dXJlQ3ViZShlW3RdfHxTbHQsaVt0XSl9ZnVuY3Rpb24gQ2N0KHQsZSxuKXt0aGlzLmlkPXQsdGhpcy5hZGRyPW4sdGhpcy5jYWNoZT1bXSx0aGlzLnNldFZhbHVlPShmdW5jdGlvbiBvKHQpe3N3aXRjaCh0KXtjYXNlIDUxMjY6cmV0dXJuIEZsdDtjYXNlIDM1NjY0OnJldHVybiBMbHQ7Y2FzZSAzNTY2NTpyZXR1cm4gQmx0O2Nhc2UgMzU2NjY6cmV0dXJuIFZsdDtjYXNlIDM1Njc0OnJldHVybiBqbHQ7Y2FzZSAzNTY3NTpyZXR1cm4gVWx0O2Nhc2UgMzU2NzY6cmV0dXJuIEdsdDtjYXNlIDUxMjQ6Y2FzZSAzNTY3MDpyZXR1cm4gV2x0O2Nhc2UgMzU2Njc6Y2FzZSAzNTY3MTpyZXR1cm4gWWx0O2Nhc2UgMzU2Njg6Y2FzZSAzNTY3MjpyZXR1cm4gcWx0O2Nhc2UgMzU2Njk6Y2FzZSAzNTY3MzpyZXR1cm4gWmx0O2Nhc2UgNTEyNTpyZXR1cm4gWGx0O2Nhc2UgMzYyOTQ6cmV0dXJuIEtsdDtjYXNlIDM2Mjk1OnJldHVybiBKbHQ7Y2FzZSAzNjI5NjpyZXR1cm4gUWx0O2Nhc2UgMzU2Nzg6Y2FzZSAzNjE5ODpjYXNlIDM2Mjk4OmNhc2UgMzYzMDY6Y2FzZSAzNTY4MjpyZXR1cm4gJGx0O2Nhc2UgMzU2Nzk6Y2FzZSAzNjI5OTpjYXNlIDM2MzA3OnJldHVybiB0Y3Q7Y2FzZSAzNTY4MDpjYXNlIDM2MzAwOmNhc2UgMzYzMDg6Y2FzZSAzNjI5MzpyZXR1cm4gZWN0O2Nhc2UgMzYyODk6Y2FzZSAzNjMwMzpjYXNlIDM2MzExOmNhc2UgMzYyOTI6cmV0dXJuIG5jdH19KShlLnR5cGUpfWZ1bmN0aW9uIE1jdCh0LGUsbil7dGhpcy5pZD10LHRoaXMuYWRkcj1uLHRoaXMuY2FjaGU9W10sdGhpcy5zaXplPWUuc2l6ZSx0aGlzLnNldFZhbHVlPShmdW5jdGlvbiBvKHQpe3N3aXRjaCh0KXtjYXNlIDUxMjY6cmV0dXJuIG9jdDtjYXNlIDM1NjY0OnJldHVybiBpY3Q7Y2FzZSAzNTY2NTpyZXR1cm4gYWN0O2Nhc2UgMzU2NjY6cmV0dXJuIHJjdDtjYXNlIDM1Njc0OnJldHVybiBzY3Q7Y2FzZSAzNTY3NTpyZXR1cm4gbGN0O2Nhc2UgMzU2NzY6cmV0dXJuIGNjdDtjYXNlIDUxMjQ6Y2FzZSAzNTY3MDpyZXR1cm4gZGN0O2Nhc2UgMzU2Njc6Y2FzZSAzNTY3MTpyZXR1cm4gcGN0O2Nhc2UgMzU2Njg6Y2FzZSAzNTY3MjpyZXR1cm4gbWN0O2Nhc2UgMzU2Njk6Y2FzZSAzNTY3MzpyZXR1cm4gdWN0O2Nhc2UgNTEyNTpyZXR1cm4gZmN0O2Nhc2UgMzYyOTQ6cmV0dXJuIGdjdDtjYXNlIDM2Mjk1OnJldHVybiBoY3Q7Y2FzZSAzNjI5NjpyZXR1cm4gYmN0O2Nhc2UgMzU2Nzg6Y2FzZSAzNjE5ODpjYXNlIDM2Mjk4OmNhc2UgMzYzMDY6Y2FzZSAzNTY4MjpyZXR1cm4geWN0O2Nhc2UgMzU2ODA6Y2FzZSAzNjMwMDpjYXNlIDM2MzA4OmNhc2UgMzYyOTM6cmV0dXJuIF9jdH19KShlLnR5cGUpfWZ1bmN0aW9uIHZjdCh0KXt0aGlzLmlkPXQsdGhpcy5zZXE9W10sdGhpcy5tYXA9e319TWN0LnByb3RvdHlwZS51cGRhdGVDYWNoZT1mdW5jdGlvbih0KXtjb25zdCBlPXRoaXMuY2FjaGU7dCBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSYmZS5sZW5ndGghPT10Lmxlbmd0aCYmKHRoaXMuY2FjaGU9bmV3IEZsb2F0MzJBcnJheSh0Lmxlbmd0aCkpLElsdChlLHQpfSx2Y3QucHJvdG90eXBlLnNldFZhbHVlPWZ1bmN0aW9uKHQsZSxuKXtjb25zdCBvPXRoaXMuc2VxO2ZvcihsZXQgaT0wLGE9by5sZW5ndGg7aSE9PWE7KytpKXtjb25zdCBhPW9baV07YS5zZXRWYWx1ZSh0LGVbYS5pZF0sbil9fTtjb25zdCB4Y3Q9LyhcdyspKFxdKT8oXFt8XC4pPy9nO2Z1bmN0aW9uIE9jdCh0LGUpe3Quc2VxLnB1c2goZSksdC5tYXBbZS5pZF09ZX1mdW5jdGlvbiBQY3QodCxlLG4pe2NvbnN0IG89dC5uYW1lLGk9by5sZW5ndGg7Zm9yKHhjdC5sYXN0SW5kZXg9MDs7KXtjb25zdCBhPXhjdC5leGVjKG8pLHI9eGN0Lmxhc3RJbmRleDtsZXQgcz1hWzFdO2NvbnN0IGw9YVszXTtpZigiXSI9PT1hWzJdJiYoc3w9MCksdm9pZCAwPT09bHx8IlsiPT09bCYmcisyPT09aSl7T2N0KG4sdm9pZCAwPT09bD9uZXcgQ2N0KHMsdCxlKTpuZXcgTWN0KHMsdCxlKSk7YnJlYWt9e2xldCB0PW4ubWFwW3NdO3ZvaWQgMD09PXQmJih0PW5ldyB2Y3QocyksT2N0KG4sdCkpLG49dH19fWZ1bmN0aW9uIHdjdCh0LGUpe3RoaXMuc2VxPVtdLHRoaXMubWFwPXt9O2NvbnN0IG49dC5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsMzU3MTgpO2ZvcihsZXQgbz0wO288bjsrK28pe2NvbnN0IG49dC5nZXRBY3RpdmVVbmlmb3JtKGUsbyk7UGN0KG4sdC5nZXRVbmlmb3JtTG9jYXRpb24oZSxuLm5hbWUpLHRoaXMpfX1mdW5jdGlvbiBrY3QodCxlLG4pe2NvbnN0IG89dC5jcmVhdGVTaGFkZXIoZSk7cmV0dXJuIHQuc2hhZGVyU291cmNlKG8sbiksdC5jb21waWxlU2hhZGVyKG8pLG99d2N0LnByb3RvdHlwZS5zZXRWYWx1ZT1mdW5jdGlvbih0LGUsbixvKXtjb25zdCBpPXRoaXMubWFwW2VdO3ZvaWQgMCE9PWkmJmkuc2V0VmFsdWUodCxuLG8pfSx3Y3QucHJvdG90eXBlLnNldE9wdGlvbmFsPWZ1bmN0aW9uKHQsZSxuKXtjb25zdCBvPWVbbl07dm9pZCAwIT09byYmdGhpcy5zZXRWYWx1ZSh0LG4sbyl9LHdjdC51cGxvYWQ9ZnVuY3Rpb24odCxlLG4sbyl7Zm9yKGxldCBpPTAsYT1lLmxlbmd0aDtpIT09YTsrK2kpe2NvbnN0IGE9ZVtpXSxyPW5bYS5pZF07ITEhPT1yLm5lZWRzVXBkYXRlJiZhLnNldFZhbHVlKHQsci52YWx1ZSxvKX19LHdjdC5zZXFXaXRoVmFsdWU9ZnVuY3Rpb24odCxlKXtjb25zdCBuPVtdO2ZvcihsZXQgbz0wLGk9dC5sZW5ndGg7byE9PWk7KytvKXtjb25zdCBpPXRbb107aS5pZCBpbiBlJiZuLnB1c2goaSl9cmV0dXJuIG59O2xldCBTY3Q9MDtmdW5jdGlvbiBEY3QodCl7c3dpdGNoKHQpe2Nhc2Ugeml0OnJldHVyblsiTGluZWFyIiwiKCB2YWx1ZSApIl07Y2FzZSBJaXQ6cmV0dXJuWyJzUkdCIiwiKCB2YWx1ZSApIl07Y2FzZSBGaXQ6cmV0dXJuWyJSR0JFIiwiKCB2YWx1ZSApIl07Y2FzZSAzMDA0OnJldHVyblsiUkdCTSIsIiggdmFsdWUsIDcuMCApIl07Y2FzZSAzMDA1OnJldHVyblsiUkdCTSIsIiggdmFsdWUsIDE2LjAgKSJdO2Nhc2UgMzAwNjpyZXR1cm5bIlJHQkQiLCIoIHZhbHVlLCAyNTYuMCApIl07Y2FzZSBIaXQ6cmV0dXJuWyJHYW1tYSIsIiggdmFsdWUsIGZsb2F0KCBHQU1NQV9GQUNUT1IgKSApIl07Y2FzZSAzMDAzOnJldHVyblsiTG9nTHV2IiwiKCB2YWx1ZSApIl07ZGVmYXVsdDpyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW06IFVuc3VwcG9ydGVkIGVuY29kaW5nOiIsdCksWyJMaW5lYXIiLCIoIHZhbHVlICkiXX19ZnVuY3Rpb24gRWN0KHQsZSxuKXtjb25zdCBvPXQuZ2V0U2hhZGVyUGFyYW1ldGVyKGUsMzU3MTMpLGk9dC5nZXRTaGFkZXJJbmZvTG9nKGUpLnRyaW0oKTtyZXR1cm4gbyYmIiI9PT1pPyIiOiJUSFJFRS5XZWJHTFNoYWRlcjogZ2wuZ2V0U2hhZGVySW5mb0xvZygpICIrbisiXG4iK2krKGZ1bmN0aW9uIGEodCl7Y29uc3QgZT10LnNwbGl0KCJcbiIpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF09dCsxKyI6ICIrZVt0XTtyZXR1cm4gZS5qb2luKCJcbiIpfSkodC5nZXRTaGFkZXJTb3VyY2UoZSkpfWZ1bmN0aW9uIFJjdCh0LGUpe2NvbnN0IG49RGN0KGUpO3JldHVybiJ2ZWM0ICIrdCsiKCB2ZWM0IHZhbHVlICkgeyByZXR1cm4gIituWzBdKyJUb0xpbmVhciIrblsxXSsiOyB9In1mdW5jdGlvbiBBY3QodCxlKXtjb25zdCBuPURjdChlKTtyZXR1cm4idmVjNCAiK3QrIiggdmVjNCB2YWx1ZSApIHsgcmV0dXJuIExpbmVhclRvIituWzBdK25bMV0rIjsgfSJ9ZnVuY3Rpb24gVGN0KHQsZSl7bGV0IG47c3dpdGNoKGUpe2Nhc2UgMTpuPSJMaW5lYXIiO2JyZWFrO2Nhc2UgMjpuPSJSZWluaGFyZCI7YnJlYWs7Y2FzZSAzOm49Ik9wdGltaXplZENpbmVvbiI7YnJlYWs7Y2FzZSA0Om49IkFDRVNGaWxtaWMiO2JyZWFrO2Nhc2UgNTpuPSJDdXN0b20iO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW06IFVuc3VwcG9ydGVkIHRvbmVNYXBwaW5nOiIsZSksbj0iTGluZWFyIn1yZXR1cm4idmVjMyAiK3QrIiggdmVjMyBjb2xvciApIHsgcmV0dXJuICIrbisiVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0ifWZ1bmN0aW9uIE5jdCh0KXtyZXR1cm4iIiE9PXR9ZnVuY3Rpb24gemN0KHQsZSl7cmV0dXJuIHQucmVwbGFjZSgvTlVNX0RJUl9MSUdIVFMvZyxlLm51bURpckxpZ2h0cykucmVwbGFjZSgvTlVNX1NQT1RfTElHSFRTL2csZS5udW1TcG90TGlnaHRzKS5yZXBsYWNlKC9OVU1fUkVDVF9BUkVBX0xJR0hUUy9nLGUubnVtUmVjdEFyZWFMaWdodHMpLnJlcGxhY2UoL05VTV9QT0lOVF9MSUdIVFMvZyxlLm51bVBvaW50TGlnaHRzKS5yZXBsYWNlKC9OVU1fSEVNSV9MSUdIVFMvZyxlLm51bUhlbWlMaWdodHMpLnJlcGxhY2UoL05VTV9ESVJfTElHSFRfU0hBRE9XUy9nLGUubnVtRGlyTGlnaHRTaGFkb3dzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9TSEFET1dTL2csZS5udW1TcG90TGlnaHRTaGFkb3dzKS5yZXBsYWNlKC9OVU1fUE9JTlRfTElHSFRfU0hBRE9XUy9nLGUubnVtUG9pbnRMaWdodFNoYWRvd3MpfWZ1bmN0aW9uIEljdCh0LGUpe3JldHVybiB0LnJlcGxhY2UoL05VTV9DTElQUElOR19QTEFORVMvZyxlLm51bUNsaXBwaW5nUGxhbmVzKS5yZXBsYWNlKC9VTklPTl9DTElQUElOR19QTEFORVMvZyxlLm51bUNsaXBwaW5nUGxhbmVzLWUubnVtQ2xpcEludGVyc2VjdGlvbil9Y29uc3QgSGN0PS9eWyBcdF0qI2luY2x1ZGUgKzwoW1x3XGQuL10rKT4vZ207ZnVuY3Rpb24gRmN0KHQpe3JldHVybiB0LnJlcGxhY2UoSGN0LExjdCl9ZnVuY3Rpb24gTGN0KHQsZSl7Y29uc3Qgbj1Oc3RbZV07aWYodm9pZCAwPT09bil0aHJvdyBuZXcgRXJyb3IoIkNhbiBub3QgcmVzb2x2ZSAjaW5jbHVkZSA8IitlKyI+Iik7cmV0dXJuIEZjdChuKX1jb25zdCBCY3Q9LyNwcmFnbWEgdW5yb2xsX2xvb3BbXHNdKz9mb3IgXCggaW50IGkgXD0gKFxkKylcOyBpIDwgKFxkKylcOyBpIFwrXCsgXCkgXHsoW1xzXFNdKz8pKD89XH0pXH0vZyxWY3Q9LyNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRccytmb3JccypcKFxzKmludFxzK2lccyo9XHMqKFxkKylccyo7XHMqaVxzKjxccyooXGQrKVxzKjtccyppXHMqXCtcK1xzKlwpXHMqeyhbXHNcU10rPyl9XHMrI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQvZztmdW5jdGlvbiBqY3QodCl7cmV0dXJuIHQucmVwbGFjZShWY3QsR2N0KS5yZXBsYWNlKEJjdCxVY3QpfWZ1bmN0aW9uIFVjdCh0LGUsbixvKXtyZXR1cm4gY29uc29sZS53YXJuKCJXZWJHTFByb2dyYW06ICNwcmFnbWEgdW5yb2xsX2xvb3Agc2hhZGVyIHN5bnRheCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlICNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQgc3ludGF4IGluc3RlYWQuIiksR2N0KDAsZSxuLG8pfWZ1bmN0aW9uIEdjdCh0LGUsbixvKXtsZXQgaT0iIjtmb3IobGV0IHQ9cGFyc2VJbnQoZSk7dDxwYXJzZUludChuKTt0KyspaSs9by5yZXBsYWNlKC9cW1xzKmlccypcXS9nLCJbICIrdCsiIF0iKS5yZXBsYWNlKC9VTlJPTExFRF9MT09QX0lOREVYL2csdCk7cmV0dXJuIGl9ZnVuY3Rpb24gV2N0KHQpe2xldCBlPSJwcmVjaXNpb24gIit0LnByZWNpc2lvbisiIGZsb2F0O1xucHJlY2lzaW9uICIrdC5wcmVjaXNpb24rIiBpbnQ7IjtyZXR1cm4iaGlnaHAiPT09dC5wcmVjaXNpb24/ZSs9IlxuI2RlZmluZSBISUdIX1BSRUNJU0lPTiI6Im1lZGl1bXAiPT09dC5wcmVjaXNpb24/ZSs9IlxuI2RlZmluZSBNRURJVU1fUFJFQ0lTSU9OIjoibG93cCI9PT10LnByZWNpc2lvbiYmKGUrPSJcbiNkZWZpbmUgTE9XX1BSRUNJU0lPTiIpLGV9ZnVuY3Rpb24gWWN0KHQsZSxuLG8pe2NvbnN0IGk9dC5nZXRDb250ZXh0KCksYT1uLmRlZmluZXM7bGV0IHI9bi52ZXJ0ZXhTaGFkZXIscz1uLmZyYWdtZW50U2hhZGVyO2NvbnN0IGw9KGZ1bmN0aW9uIGModCl7bGV0IGU9IlNIQURPV01BUF9UWVBFX0JBU0lDIjtyZXR1cm4gMT09PXQuc2hhZG93TWFwVHlwZT9lPSJTSEFET1dNQVBfVFlQRV9QQ0YiOjI9PT10LnNoYWRvd01hcFR5cGU/ZT0iU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQiOjM9PT10LnNoYWRvd01hcFR5cGUmJihlPSJTSEFET1dNQVBfVFlQRV9WU00iKSxlfSkobiksZD0oZnVuY3Rpb24gcCh0KXtsZXQgZT0iRU5WTUFQX1RZUEVfQ1VCRSI7aWYodC5lbnZNYXApc3dpdGNoKHQuZW52TWFwTW9kZSl7Y2FzZSBkaXQ6Y2FzZSBwaXQ6ZT0iRU5WTUFQX1RZUEVfQ1VCRSI7YnJlYWs7Y2FzZSBtaXQ6Y2FzZSAzMDc6ZT0iRU5WTUFQX1RZUEVfQ1VCRV9VViJ9cmV0dXJuIGV9KShuKSxtPShmdW5jdGlvbiB1KHQpe2xldCBlPSJFTlZNQVBfTU9ERV9SRUZMRUNUSU9OIjtpZih0LmVudk1hcClzd2l0Y2godC5lbnZNYXBNb2RlKXtjYXNlIHBpdDpjYXNlIDMwNzplPSJFTlZNQVBfTU9ERV9SRUZSQUNUSU9OIn1yZXR1cm4gZX0pKG4pLGY9KGZ1bmN0aW9uIGcodCl7bGV0IGU9IkVOVk1BUF9CTEVORElOR19OT05FIjtpZih0LmVudk1hcClzd2l0Y2godC5jb21iaW5lKXtjYXNlIDA6ZT0iRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZIjticmVhaztjYXNlIDE6ZT0iRU5WTUFQX0JMRU5ESU5HX01JWCI7YnJlYWs7Y2FzZSAyOmU9IkVOVk1BUF9CTEVORElOR19BREQifXJldHVybiBlfSkobiksaD10LmdhbW1hRmFjdG9yPjA/dC5nYW1tYUZhY3RvcjoxLGI9bi5pc1dlYkdMMj8iIjooZnVuY3Rpb24geSh0KXtyZXR1cm5bdC5leHRlbnNpb25EZXJpdmF0aXZlc3x8dC5lbnZNYXBDdWJlVVZ8fHQuYnVtcE1hcHx8dC50YW5nZW50U3BhY2VOb3JtYWxNYXB8fHQuY2xlYXJjb2F0Tm9ybWFsTWFwfHx0LmZsYXRTaGFkaW5nfHwicGh5c2ljYWwiPT09dC5zaGFkZXJJRD8iI2V4dGVuc2lvbiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgOiBlbmFibGUiOiIiLCh0LmV4dGVuc2lvbkZyYWdEZXB0aHx8dC5sb2dhcml0aG1pY0RlcHRoQnVmZmVyKSYmdC5yZW5kZXJlckV4dGVuc2lvbkZyYWdEZXB0aD8iI2V4dGVuc2lvbiBHTF9FWFRfZnJhZ19kZXB0aCA6IGVuYWJsZSI6IiIsdC5leHRlbnNpb25EcmF3QnVmZmVycyYmdC5yZW5kZXJlckV4dGVuc2lvbkRyYXdCdWZmZXJzPyIjZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlIjoiIiwodC5leHRlbnNpb25TaGFkZXJUZXh0dXJlTE9EfHx0LmVudk1hcHx8dC50cmFuc21pc3Npb24+MCkmJnQucmVuZGVyZXJFeHRlbnNpb25TaGFkZXJUZXh0dXJlTG9kPyIjZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgOiBlbmFibGUiOiIiXS5maWx0ZXIoTmN0KS5qb2luKCJcbiIpfSkobiksXz0oZnVuY3Rpb24gQyh0KXtjb25zdCBlPVtdO2Zvcihjb25zdCBuIGluIHQpe2NvbnN0IG89dFtuXTshMSE9PW8mJmUucHVzaCgiI2RlZmluZSAiK24rIiAiK28pfXJldHVybiBlLmpvaW4oIlxuIil9KShhKSxNPWkuY3JlYXRlUHJvZ3JhbSgpO2xldCB2LHgsTz1uLmdsc2xWZXJzaW9uPyIjdmVyc2lvbiAiK24uZ2xzbFZlcnNpb24rIlxuIjoiIjtuLmlzUmF3U2hhZGVyTWF0ZXJpYWw/KHY9W19dLmZpbHRlcihOY3QpLmpvaW4oIlxuIiksdi5sZW5ndGg+MCYmKHYrPSJcbiIpLHg9W2IsX10uZmlsdGVyKE5jdCkuam9pbigiXG4iKSx4Lmxlbmd0aD4wJiYoeCs9IlxuIikpOih2PVtXY3QobiksIiNkZWZpbmUgU0hBREVSX05BTUUgIituLnNoYWRlck5hbWUsXyxuLmluc3RhbmNpbmc/IiNkZWZpbmUgVVNFX0lOU1RBTkNJTkciOiIiLG4uaW5zdGFuY2luZ0NvbG9yPyIjZGVmaW5lIFVTRV9JTlNUQU5DSU5HX0NPTE9SIjoiIixuLnN1cHBvcnRzVmVydGV4VGV4dHVyZXM/IiNkZWZpbmUgVkVSVEVYX1RFWFRVUkVTIjoiIiwiI2RlZmluZSBHQU1NQV9GQUNUT1IgIitoLCIjZGVmaW5lIE1BWF9CT05FUyAiK24ubWF4Qm9uZXMsbi51c2VGb2cmJm4uZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLG4udXNlRm9nJiZuLmZvZ0V4cDI/IiNkZWZpbmUgRk9HX0VYUDIiOiIiLG4ubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLG4uZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLG4uZW52TWFwPyIjZGVmaW5lICIrbToiIixuLmxpZ2h0TWFwPyIjZGVmaW5lIFVTRV9MSUdIVE1BUCI6IiIsbi5hb01hcD8iI2RlZmluZSBVU0VfQU9NQVAiOiIiLG4uZW1pc3NpdmVNYXA/IiNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQIjoiIixuLmJ1bXBNYXA/IiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLG4ubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLG4ubm9ybWFsTWFwJiZuLm9iamVjdFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCI6IiIsbi5ub3JtYWxNYXAmJm4udGFuZ2VudFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAiOiIiLG4uY2xlYXJjb2F0TWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRNQVAiOiIiLG4uY2xlYXJjb2F0Um91Z2huZXNzTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQIjoiIixuLmNsZWFyY29hdE5vcm1hbE1hcD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCI6IiIsbi5kaXNwbGFjZW1lbnRNYXAmJm4uc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcz8iI2RlZmluZSBVU0VfRElTUExBQ0VNRU5UTUFQIjoiIixuLnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsbi5zcGVjdWxhckludGVuc2l0eU1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJJTlRFTlNJVFlNQVAiOiIiLG4uc3BlY3VsYXJUaW50TWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUlRJTlRNQVAiOiIiLG4ucm91Z2huZXNzTWFwPyIjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAiOiIiLG4ubWV0YWxuZXNzTWFwPyIjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAiOiIiLG4uYWxwaGFNYXA/IiNkZWZpbmUgVVNFX0FMUEhBTUFQIjoiIixuLnRyYW5zbWlzc2lvbj8iI2RlZmluZSBVU0VfVFJBTlNNSVNTSU9OIjoiIixuLnRyYW5zbWlzc2lvbk1hcD8iI2RlZmluZSBVU0VfVFJBTlNNSVNTSU9OTUFQIjoiIixuLnRoaWNrbmVzc01hcD8iI2RlZmluZSBVU0VfVEhJQ0tORVNTTUFQIjoiIixuLnZlcnRleFRhbmdlbnRzPyIjZGVmaW5lIFVTRV9UQU5HRU5UIjoiIixuLnZlcnRleENvbG9ycz8iI2RlZmluZSBVU0VfQ09MT1IiOiIiLG4udmVydGV4QWxwaGFzPyIjZGVmaW5lIFVTRV9DT0xPUl9BTFBIQSI6IiIsbi52ZXJ0ZXhVdnM/IiNkZWZpbmUgVVNFX1VWIjoiIixuLnV2c1ZlcnRleE9ubHk/IiNkZWZpbmUgVVZTX1ZFUlRFWF9PTkxZIjoiIixuLmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIixuLnNraW5uaW5nPyIjZGVmaW5lIFVTRV9TS0lOTklORyI6IiIsbi51c2VWZXJ0ZXhUZXh0dXJlPyIjZGVmaW5lIEJPTkVfVEVYVFVSRSI6IiIsbi5tb3JwaFRhcmdldHM/IiNkZWZpbmUgVVNFX01PUlBIVEFSR0VUUyI6IiIsbi5tb3JwaE5vcm1hbHMmJiExPT09bi5mbGF0U2hhZGluZz8iI2RlZmluZSBVU0VfTU9SUEhOT1JNQUxTIjoiIixuLmRvdWJsZVNpZGVkPyIjZGVmaW5lIERPVUJMRV9TSURFRCI6IiIsbi5mbGlwU2lkZWQ/IiNkZWZpbmUgRkxJUF9TSURFRCI6IiIsbi5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lIFVTRV9TSEFET1dNQVAiOiIiLG4uc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSAiK2w6IiIsbi5zaXplQXR0ZW51YXRpb24/IiNkZWZpbmUgVVNFX1NJWkVBVFRFTlVBVElPTiI6IiIsbi5sb2dhcml0aG1pY0RlcHRoQnVmZmVyPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRiI6IiIsbi5sb2dhcml0aG1pY0RlcHRoQnVmZmVyJiZuLnJlbmRlcmVyRXh0ZW5zaW9uRnJhZ0RlcHRoPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQiOiIiLCJ1bmlmb3JtIG1hdDQgbW9kZWxNYXRyaXg7IiwidW5pZm9ybSBtYXQ0IG1vZGVsVmlld01hdHJpeDsiLCJ1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsiLCJ1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsiLCJ1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4OyIsInVuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsiLCJ1bmlmb3JtIGJvb2wgaXNPcnRob2dyYXBoaWM7IiwiI2lmZGVmIFVTRV9JTlNUQU5DSU5HIiwiXHRhdHRyaWJ1dGUgbWF0NCBpbnN0YW5jZU1hdHJpeDsiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX0lOU1RBTkNJTkdfQ09MT1IiLCJcdGF0dHJpYnV0ZSB2ZWMzIGluc3RhbmNlQ29sb3I7IiwiI2VuZGlmIiwiYXR0cmlidXRlIHZlYzMgcG9zaXRpb247IiwiYXR0cmlidXRlIHZlYzMgbm9ybWFsOyIsImF0dHJpYnV0ZSB2ZWMyIHV2OyIsIiNpZmRlZiBVU0VfVEFOR0VOVCIsIlx0YXR0cmlidXRlIHZlYzQgdGFuZ2VudDsiLCIjZW5kaWYiLCIjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBICkiLCJcdGF0dHJpYnV0ZSB2ZWM0IGNvbG9yOyIsIiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApIiwiXHRhdHRyaWJ1dGUgdmVjMyBjb2xvcjsiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX01PUlBIVEFSR0VUUyIsIlx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQwOyIsIlx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQxOyIsIlx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQyOyIsIlx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQzOyIsIlx0I2lmZGVmIFVTRV9NT1JQSE5PUk1BTFMiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwwOyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDE7IiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMjsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwzOyIsIlx0I2Vsc2UiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ0OyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDU7IiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NjsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ3OyIsIlx0I2VuZGlmIiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9TS0lOTklORyIsIlx0YXR0cmlidXRlIHZlYzQgc2tpbkluZGV4OyIsIlx0YXR0cmlidXRlIHZlYzQgc2tpbldlaWdodDsiLCIjZW5kaWYiLCJcbiJdLmZpbHRlcihOY3QpLmpvaW4oIlxuIikseD1bYixXY3QobiksIiNkZWZpbmUgU0hBREVSX05BTUUgIituLnNoYWRlck5hbWUsXyxuLmFscGhhVGVzdD8iI2RlZmluZSBBTFBIQVRFU1QgIituLmFscGhhVGVzdCsobi5hbHBoYVRlc3QlMT8iIjoiLjAiKToiIiwiI2RlZmluZSBHQU1NQV9GQUNUT1IgIitoLG4udXNlRm9nJiZuLmZvZz8iI2RlZmluZSBVU0VfRk9HIjoiIixuLnVzZUZvZyYmbi5mb2dFeHAyPyIjZGVmaW5lIEZPR19FWFAyIjoiIixuLm1hcD8iI2RlZmluZSBVU0VfTUFQIjoiIixuLm1hdGNhcD8iI2RlZmluZSBVU0VfTUFUQ0FQIjoiIixuLmVudk1hcD8iI2RlZmluZSBVU0VfRU5WTUFQIjoiIixuLmVudk1hcD8iI2RlZmluZSAiK2Q6IiIsbi5lbnZNYXA/IiNkZWZpbmUgIittOiIiLG4uZW52TWFwPyIjZGVmaW5lICIrZjoiIixuLmxpZ2h0TWFwPyIjZGVmaW5lIFVTRV9MSUdIVE1BUCI6IiIsbi5hb01hcD8iI2RlZmluZSBVU0VfQU9NQVAiOiIiLG4uZW1pc3NpdmVNYXA/IiNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQIjoiIixuLmJ1bXBNYXA/IiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLG4ubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLG4ubm9ybWFsTWFwJiZuLm9iamVjdFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCI6IiIsbi5ub3JtYWxNYXAmJm4udGFuZ2VudFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAiOiIiLG4uY2xlYXJjb2F0TWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRNQVAiOiIiLG4uY2xlYXJjb2F0Um91Z2huZXNzTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQIjoiIixuLmNsZWFyY29hdE5vcm1hbE1hcD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCI6IiIsbi5zcGVjdWxhck1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAiOiIiLG4uc3BlY3VsYXJJbnRlbnNpdHlNYXA/IiNkZWZpbmUgVVNFX1NQRUNVTEFSSU5URU5TSVRZTUFQIjoiIixuLnNwZWN1bGFyVGludE1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJUSU5UTUFQIjoiIixuLnJvdWdobmVzc01hcD8iI2RlZmluZSBVU0VfUk9VR0hORVNTTUFQIjoiIixuLm1ldGFsbmVzc01hcD8iI2RlZmluZSBVU0VfTUVUQUxORVNTTUFQIjoiIixuLmFscGhhTWFwPyIjZGVmaW5lIFVTRV9BTFBIQU1BUCI6IiIsbi5zaGVlbj8iI2RlZmluZSBVU0VfU0hFRU4iOiIiLG4udHJhbnNtaXNzaW9uPyIjZGVmaW5lIFVTRV9UUkFOU01JU1NJT04iOiIiLG4udHJhbnNtaXNzaW9uTWFwPyIjZGVmaW5lIFVTRV9UUkFOU01JU1NJT05NQVAiOiIiLG4udGhpY2tuZXNzTWFwPyIjZGVmaW5lIFVTRV9USElDS05FU1NNQVAiOiIiLG4udmVydGV4VGFuZ2VudHM/IiNkZWZpbmUgVVNFX1RBTkdFTlQiOiIiLG4udmVydGV4Q29sb3JzfHxuLmluc3RhbmNpbmdDb2xvcj8iI2RlZmluZSBVU0VfQ09MT1IiOiIiLG4udmVydGV4QWxwaGFzPyIjZGVmaW5lIFVTRV9DT0xPUl9BTFBIQSI6IiIsbi52ZXJ0ZXhVdnM/IiNkZWZpbmUgVVNFX1VWIjoiIixuLnV2c1ZlcnRleE9ubHk/IiNkZWZpbmUgVVZTX1ZFUlRFWF9PTkxZIjoiIixuLmdyYWRpZW50TWFwPyIjZGVmaW5lIFVTRV9HUkFESUVOVE1BUCI6IiIsbi5mbGF0U2hhZGluZz8iI2RlZmluZSBGTEFUX1NIQURFRCI6IiIsbi5kb3VibGVTaWRlZD8iI2RlZmluZSBET1VCTEVfU0lERUQiOiIiLG4uZmxpcFNpZGVkPyIjZGVmaW5lIEZMSVBfU0lERUQiOiIiLG4uc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSBVU0VfU0hBRE9XTUFQIjoiIixuLnNoYWRvd01hcEVuYWJsZWQ/IiNkZWZpbmUgIitsOiIiLG4ucHJlbXVsdGlwbGllZEFscGhhPyIjZGVmaW5lIFBSRU1VTFRJUExJRURfQUxQSEEiOiIiLG4ucGh5c2ljYWxseUNvcnJlY3RMaWdodHM/IiNkZWZpbmUgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUyI6IiIsbi5sb2dhcml0aG1pY0RlcHRoQnVmZmVyPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRiI6IiIsbi5sb2dhcml0aG1pY0RlcHRoQnVmZmVyJiZuLnJlbmRlcmVyRXh0ZW5zaW9uRnJhZ0RlcHRoPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQiOiIiLChuLmV4dGVuc2lvblNoYWRlclRleHR1cmVMT0R8fG4uZW52TWFwKSYmbi5yZW5kZXJlckV4dGVuc2lvblNoYWRlclRleHR1cmVMb2Q/IiNkZWZpbmUgVEVYVFVSRV9MT0RfRVhUIjoiIiwidW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7IiwidW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOyIsInVuaWZvcm0gYm9vbCBpc09ydGhvZ3JhcGhpYzsiLDAhPT1uLnRvbmVNYXBwaW5nPyIjZGVmaW5lIFRPTkVfTUFQUElORyI6IiIsMCE9PW4udG9uZU1hcHBpbmc/TnN0LnRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IiIsMCE9PW4udG9uZU1hcHBpbmc/VGN0KCJ0b25lTWFwcGluZyIsbi50b25lTWFwcGluZyk6IiIsbi5kaXRoZXJpbmc/IiNkZWZpbmUgRElUSEVSSU5HIjoiIixOc3QuZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQsbi5tYXA/UmN0KCJtYXBUZXhlbFRvTGluZWFyIixuLm1hcEVuY29kaW5nKToiIixuLm1hdGNhcD9SY3QoIm1hdGNhcFRleGVsVG9MaW5lYXIiLG4ubWF0Y2FwRW5jb2RpbmcpOiIiLG4uZW52TWFwP1JjdCgiZW52TWFwVGV4ZWxUb0xpbmVhciIsbi5lbnZNYXBFbmNvZGluZyk6IiIsbi5lbWlzc2l2ZU1hcD9SY3QoImVtaXNzaXZlTWFwVGV4ZWxUb0xpbmVhciIsbi5lbWlzc2l2ZU1hcEVuY29kaW5nKToiIixuLnNwZWN1bGFyVGludE1hcD9SY3QoInNwZWN1bGFyVGludE1hcFRleGVsVG9MaW5lYXIiLG4uc3BlY3VsYXJUaW50TWFwRW5jb2RpbmcpOiIiLG4ubGlnaHRNYXA/UmN0KCJsaWdodE1hcFRleGVsVG9MaW5lYXIiLG4ubGlnaHRNYXBFbmNvZGluZyk6IiIsQWN0KCJsaW5lYXJUb091dHB1dFRleGVsIixuLm91dHB1dEVuY29kaW5nKSxuLmRlcHRoUGFja2luZz8iI2RlZmluZSBERVBUSF9QQUNLSU5HICIrbi5kZXB0aFBhY2tpbmc6IiIsIlxuIl0uZmlsdGVyKE5jdCkuam9pbigiXG4iKSkscj1GY3Qocikscj16Y3QocixuKSxyPUljdChyLG4pLHM9RmN0KHMpLHM9emN0KHMsbikscz1JY3QocyxuKSxyPWpjdChyKSxzPWpjdChzKSxuLmlzV2ViR0wyJiYhMCE9PW4uaXNSYXdTaGFkZXJNYXRlcmlhbCYmKE89IiN2ZXJzaW9uIDMwMCBlc1xuIix2PVsiI2RlZmluZSBhdHRyaWJ1dGUgaW4iLCIjZGVmaW5lIHZhcnlpbmcgb3V0IiwiI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZSJdLmpvaW4oIlxuIikrIlxuIit2LHg9WyIjZGVmaW5lIHZhcnlpbmcgaW4iLG4uZ2xzbFZlcnNpb249PT1qaXQ/IiI6Im91dCBoaWdocCB2ZWM0IHBjX2ZyYWdDb2xvcjsiLG4uZ2xzbFZlcnNpb249PT1qaXQ/IiI6IiNkZWZpbmUgZ2xfRnJhZ0NvbG9yIHBjX2ZyYWdDb2xvciIsIiNkZWZpbmUgZ2xfRnJhZ0RlcHRoRVhUIGdsX0ZyYWdEZXB0aCIsIiNkZWZpbmUgdGV4dHVyZTJEIHRleHR1cmUiLCIjZGVmaW5lIHRleHR1cmVDdWJlIHRleHR1cmUiLCIjZGVmaW5lIHRleHR1cmUyRFByb2ogdGV4dHVyZVByb2oiLCIjZGVmaW5lIHRleHR1cmUyRExvZEVYVCB0ZXh0dXJlTG9kIiwiI2RlZmluZSB0ZXh0dXJlMkRQcm9qTG9kRVhUIHRleHR1cmVQcm9qTG9kIiwiI2RlZmluZSB0ZXh0dXJlQ3ViZUxvZEVYVCB0ZXh0dXJlTG9kIiwiI2RlZmluZSB0ZXh0dXJlMkRHcmFkRVhUIHRleHR1cmVHcmFkIiwiI2RlZmluZSB0ZXh0dXJlMkRQcm9qR3JhZEVYVCB0ZXh0dXJlUHJvakdyYWQiLCIjZGVmaW5lIHRleHR1cmVDdWJlR3JhZEVYVCB0ZXh0dXJlR3JhZCJdLmpvaW4oIlxuIikrIlxuIit4KTtjb25zdCBQPU8reCtzLHc9a2N0KGksMzU2MzMsTyt2K3IpLGs9a2N0KGksMzU2MzIsUCk7aWYoaS5hdHRhY2hTaGFkZXIoTSx3KSxpLmF0dGFjaFNoYWRlcihNLGspLHZvaWQgMCE9PW4uaW5kZXgwQXR0cmlidXRlTmFtZT9pLmJpbmRBdHRyaWJMb2NhdGlvbihNLDAsbi5pbmRleDBBdHRyaWJ1dGVOYW1lKTohMD09PW4ubW9ycGhUYXJnZXRzJiZpLmJpbmRBdHRyaWJMb2NhdGlvbihNLDAsInBvc2l0aW9uIiksaS5saW5rUHJvZ3JhbShNKSx0LmRlYnVnLmNoZWNrU2hhZGVyRXJyb3JzKXtjb25zdCB0PWkuZ2V0UHJvZ3JhbUluZm9Mb2coTSkudHJpbSgpLGU9aS5nZXRTaGFkZXJJbmZvTG9nKHcpLnRyaW0oKSxuPWkuZ2V0U2hhZGVySW5mb0xvZyhrKS50cmltKCk7bGV0IG89ITAsYT0hMDtpZighMT09PWkuZ2V0UHJvZ3JhbVBhcmFtZXRlcihNLDM1NzE0KSl7bz0hMTtjb25zdCBlPUVjdChpLHcsInZlcnRleCIpLG49RWN0KGksaywiZnJhZ21lbnQiKTtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFByb2dyYW06IHNoYWRlciBlcnJvcjogIixpLmdldEVycm9yKCksIjM1NzE1IixpLmdldFByb2dyYW1QYXJhbWV0ZXIoTSwzNTcxNSksImdsLmdldFByb2dyYW1JbmZvTG9nIix0LGUsbil9ZWxzZSIiIT09dD9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUHJvZ3JhbTogZ2wuZ2V0UHJvZ3JhbUluZm9Mb2coKSIsdCk6IiIhPT1lJiYiIiE9PW58fChhPSExKTthJiYodGhpcy5kaWFnbm9zdGljcz17cnVubmFibGU6byxwcm9ncmFtTG9nOnQsdmVydGV4U2hhZGVyOntsb2c6ZSxwcmVmaXg6dn0sZnJhZ21lbnRTaGFkZXI6e2xvZzpuLHByZWZpeDp4fX0pfWxldCBTLEQ7cmV0dXJuIGkuZGVsZXRlU2hhZGVyKHcpLGkuZGVsZXRlU2hhZGVyKGspLHRoaXMuZ2V0VW5pZm9ybXM9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09UyYmKFM9bmV3IHdjdChpLE0pKSxTfSx0aGlzLmdldEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09RCYmKEQ9KGZ1bmN0aW9uIHQoZSxuKXtjb25zdCBvPXt9LGk9ZS5nZXRQcm9ncmFtUGFyYW1ldGVyKG4sMzU3MjEpO2ZvcihsZXQgdD0wO3Q8aTt0Kyspe2NvbnN0IGk9ZS5nZXRBY3RpdmVBdHRyaWIobix0KS5uYW1lO29baV09ZS5nZXRBdHRyaWJMb2NhdGlvbihuLGkpfXJldHVybiBvfSkoaSxNKSksRH0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7by5yZWxlYXNlU3RhdGVzT2ZQcm9ncmFtKHRoaXMpLGkuZGVsZXRlUHJvZ3JhbShNKSx0aGlzLnByb2dyYW09dm9pZCAwfSx0aGlzLm5hbWU9bi5zaGFkZXJOYW1lLHRoaXMuaWQ9U2N0KyssdGhpcy5jYWNoZUtleT1lLHRoaXMudXNlZFRpbWVzPTEsdGhpcy5wcm9ncmFtPU0sdGhpcy52ZXJ0ZXhTaGFkZXI9dyx0aGlzLmZyYWdtZW50U2hhZGVyPWssdGhpc31mdW5jdGlvbiBxY3QodCxlLG4sbyxpLGEscil7Y29uc3Qgcz1bXSxsPWkuaXNXZWJHTDIsYz1pLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIsZD1pLmZsb2F0VmVydGV4VGV4dHVyZXMscD1pLm1heFZlcnRleFVuaWZvcm1zLG09aS52ZXJ0ZXhUZXh0dXJlcztsZXQgdT1pLnByZWNpc2lvbjtjb25zdCBmPXtNZXNoRGVwdGhNYXRlcmlhbDoiZGVwdGgiLE1lc2hEaXN0YW5jZU1hdGVyaWFsOiJkaXN0YW5jZVJHQkEiLE1lc2hOb3JtYWxNYXRlcmlhbDoibm9ybWFsIixNZXNoQmFzaWNNYXRlcmlhbDoiYmFzaWMiLE1lc2hMYW1iZXJ0TWF0ZXJpYWw6ImxhbWJlcnQiLE1lc2hQaG9uZ01hdGVyaWFsOiJwaG9uZyIsTWVzaFRvb25NYXRlcmlhbDoidG9vbiIsTWVzaFN0YW5kYXJkTWF0ZXJpYWw6InBoeXNpY2FsIixNZXNoUGh5c2ljYWxNYXRlcmlhbDoicGh5c2ljYWwiLE1lc2hNYXRjYXBNYXRlcmlhbDoibWF0Y2FwIixMaW5lQmFzaWNNYXRlcmlhbDoiYmFzaWMiLExpbmVEYXNoZWRNYXRlcmlhbDoiZGFzaGVkIixQb2ludHNNYXRlcmlhbDoicG9pbnRzIixTaGFkb3dNYXRlcmlhbDoic2hhZG93IixTcHJpdGVNYXRlcmlhbDoic3ByaXRlIn0sZz1bInByZWNpc2lvbiIsImlzV2ViR0wyIiwic3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyIsIm91dHB1dEVuY29kaW5nIiwiaW5zdGFuY2luZyIsImluc3RhbmNpbmdDb2xvciIsIm1hcCIsIm1hcEVuY29kaW5nIiwibWF0Y2FwIiwibWF0Y2FwRW5jb2RpbmciLCJlbnZNYXAiLCJlbnZNYXBNb2RlIiwiZW52TWFwRW5jb2RpbmciLCJlbnZNYXBDdWJlVVYiLCJsaWdodE1hcCIsImxpZ2h0TWFwRW5jb2RpbmciLCJhb01hcCIsImVtaXNzaXZlTWFwIiwiZW1pc3NpdmVNYXBFbmNvZGluZyIsImJ1bXBNYXAiLCJub3JtYWxNYXAiLCJvYmplY3RTcGFjZU5vcm1hbE1hcCIsInRhbmdlbnRTcGFjZU5vcm1hbE1hcCIsImNsZWFyY29hdE1hcCIsImNsZWFyY29hdFJvdWdobmVzc01hcCIsImNsZWFyY29hdE5vcm1hbE1hcCIsImRpc3BsYWNlbWVudE1hcCIsInNwZWN1bGFyTWFwIiwic3BlY3VsYXJJbnRlbnNpdHlNYXAiLCJzcGVjdWxhclRpbnRNYXAiLCJzcGVjdWxhclRpbnRNYXBFbmNvZGluZyIsInJvdWdobmVzc01hcCIsIm1ldGFsbmVzc01hcCIsImdyYWRpZW50TWFwIiwiYWxwaGFNYXAiLCJjb21iaW5lIiwidmVydGV4Q29sb3JzIiwidmVydGV4QWxwaGFzIiwidmVydGV4VGFuZ2VudHMiLCJ2ZXJ0ZXhVdnMiLCJ1dnNWZXJ0ZXhPbmx5IiwiZm9nIiwidXNlRm9nIiwiZm9nRXhwMiIsImZsYXRTaGFkaW5nIiwic2l6ZUF0dGVudWF0aW9uIiwibG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciIsInNraW5uaW5nIiwibWF4Qm9uZXMiLCJ1c2VWZXJ0ZXhUZXh0dXJlIiwibW9ycGhUYXJnZXRzIiwibW9ycGhOb3JtYWxzIiwicHJlbXVsdGlwbGllZEFscGhhIiwibnVtRGlyTGlnaHRzIiwibnVtUG9pbnRMaWdodHMiLCJudW1TcG90TGlnaHRzIiwibnVtSGVtaUxpZ2h0cyIsIm51bVJlY3RBcmVhTGlnaHRzIiwibnVtRGlyTGlnaHRTaGFkb3dzIiwibnVtUG9pbnRMaWdodFNoYWRvd3MiLCJudW1TcG90TGlnaHRTaGFkb3dzIiwic2hhZG93TWFwRW5hYmxlZCIsInNoYWRvd01hcFR5cGUiLCJ0b25lTWFwcGluZyIsInBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzIiwiYWxwaGFUZXN0IiwiZG91YmxlU2lkZWQiLCJmbGlwU2lkZWQiLCJudW1DbGlwcGluZ1BsYW5lcyIsIm51bUNsaXBJbnRlcnNlY3Rpb24iLCJkZXB0aFBhY2tpbmciLCJkaXRoZXJpbmciLCJzaGVlbiIsInRyYW5zbWlzc2lvbiIsInRyYW5zbWlzc2lvbk1hcCIsInRoaWNrbmVzc01hcCJdO2Z1bmN0aW9uIGgodCl7bGV0IGU7cmV0dXJuIHQmJnQuaXNUZXh0dXJlP2U9dC5lbmNvZGluZzp0JiZ0LmlzV2ViR0xSZW5kZXJUYXJnZXQ/KGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtcy5nZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwOiBkb24ndCB1c2UgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLiIpLGU9dC50ZXh0dXJlLmVuY29kaW5nKTplPXppdCxlfXJldHVybntnZXRQYXJhbWV0ZXJzOmZ1bmN0aW9uIGIoYSxzLGcseSxfKXtjb25zdCBDPXkuZm9nLE09KGEuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD9uOmUpLmdldChhLmVudk1hcHx8KGEuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD95LmVudmlyb25tZW50Om51bGwpKSx2PWZbYS50eXBlXSx4PV8uaXNTa2lubmVkTWVzaD8oZnVuY3Rpb24gTyh0KXtjb25zdCBlPXQuc2tlbGV0b24uYm9uZXM7aWYoZClyZXR1cm4gMTAyNDt7Y29uc3QgdD1NYXRoLmZsb29yKChwLTIwKS80KSxuPU1hdGgubWluKHQsZS5sZW5ndGgpO3JldHVybiBuPGUubGVuZ3RoPyhjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFNrZWxldG9uIGhhcyAiK2UubGVuZ3RoKyIgYm9uZXMuIFRoaXMgR1BVIHN1cHBvcnRzICIrbisiLiIpLDApOm59fSkoXyk6MDtsZXQgUCx3O2lmKG51bGwhPT1hLnByZWNpc2lvbiYmKHU9aS5nZXRNYXhQcmVjaXNpb24oYS5wcmVjaXNpb24pLHUhPT1hLnByZWNpc2lvbiYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW0uZ2V0UGFyYW1ldGVyczoiLGEucHJlY2lzaW9uLCJub3Qgc3VwcG9ydGVkLCB1c2luZyIsdSwiaW5zdGVhZC4iKSksdil7Y29uc3QgdD1Jc3Rbdl07UD10LnZlcnRleFNoYWRlcix3PXQuZnJhZ21lbnRTaGFkZXJ9ZWxzZSBQPWEudmVydGV4U2hhZGVyLHc9YS5mcmFnbWVudFNoYWRlcjtjb25zdCBrPXQuZ2V0UmVuZGVyVGFyZ2V0KCk7cmV0dXJue2lzV2ViR0wyOmwsc2hhZGVySUQ6dixzaGFkZXJOYW1lOmEudHlwZSx2ZXJ0ZXhTaGFkZXI6UCxmcmFnbWVudFNoYWRlcjp3LGRlZmluZXM6YS5kZWZpbmVzLGlzUmF3U2hhZGVyTWF0ZXJpYWw6ITA9PT1hLmlzUmF3U2hhZGVyTWF0ZXJpYWwsZ2xzbFZlcnNpb246YS5nbHNsVmVyc2lvbixwcmVjaXNpb246dSxpbnN0YW5jaW5nOiEwPT09Xy5pc0luc3RhbmNlZE1lc2gsaW5zdGFuY2luZ0NvbG9yOiEwPT09Xy5pc0luc3RhbmNlZE1lc2gmJm51bGwhPT1fLmluc3RhbmNlQ29sb3Isc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczptLG91dHB1dEVuY29kaW5nOm51bGwhPT1rP2goay50ZXh0dXJlKTp0Lm91dHB1dEVuY29kaW5nLG1hcDohIWEubWFwLG1hcEVuY29kaW5nOmgoYS5tYXApLG1hdGNhcDohIWEubWF0Y2FwLG1hdGNhcEVuY29kaW5nOmgoYS5tYXRjYXApLGVudk1hcDohIU0sZW52TWFwTW9kZTpNJiZNLm1hcHBpbmcsZW52TWFwRW5jb2Rpbmc6aChNKSxlbnZNYXBDdWJlVVY6ISFNJiYoTS5tYXBwaW5nPT09bWl0fHwzMDc9PT1NLm1hcHBpbmcpLGxpZ2h0TWFwOiEhYS5saWdodE1hcCxsaWdodE1hcEVuY29kaW5nOmgoYS5saWdodE1hcCksYW9NYXA6ISFhLmFvTWFwLGVtaXNzaXZlTWFwOiEhYS5lbWlzc2l2ZU1hcCxlbWlzc2l2ZU1hcEVuY29kaW5nOmgoYS5lbWlzc2l2ZU1hcCksYnVtcE1hcDohIWEuYnVtcE1hcCxub3JtYWxNYXA6ISFhLm5vcm1hbE1hcCxvYmplY3RTcGFjZU5vcm1hbE1hcDoxPT09YS5ub3JtYWxNYXBUeXBlLHRhbmdlbnRTcGFjZU5vcm1hbE1hcDowPT09YS5ub3JtYWxNYXBUeXBlLGNsZWFyY29hdE1hcDohIWEuY2xlYXJjb2F0TWFwLGNsZWFyY29hdFJvdWdobmVzc01hcDohIWEuY2xlYXJjb2F0Um91Z2huZXNzTWFwLGNsZWFyY29hdE5vcm1hbE1hcDohIWEuY2xlYXJjb2F0Tm9ybWFsTWFwLGRpc3BsYWNlbWVudE1hcDohIWEuZGlzcGxhY2VtZW50TWFwLHJvdWdobmVzc01hcDohIWEucm91Z2huZXNzTWFwLG1ldGFsbmVzc01hcDohIWEubWV0YWxuZXNzTWFwLHNwZWN1bGFyTWFwOiEhYS5zcGVjdWxhck1hcCxzcGVjdWxhckludGVuc2l0eU1hcDohIWEuc3BlY3VsYXJJbnRlbnNpdHlNYXAsc3BlY3VsYXJUaW50TWFwOiEhYS5zcGVjdWxhclRpbnRNYXAsc3BlY3VsYXJUaW50TWFwRW5jb2Rpbmc6aChhLnNwZWN1bGFyVGludE1hcCksYWxwaGFNYXA6ISFhLmFscGhhTWFwLGdyYWRpZW50TWFwOiEhYS5ncmFkaWVudE1hcCxzaGVlbjohIWEuc2hlZW4sdHJhbnNtaXNzaW9uOiEhYS50cmFuc21pc3Npb24sdHJhbnNtaXNzaW9uTWFwOiEhYS50cmFuc21pc3Npb25NYXAsdGhpY2tuZXNzTWFwOiEhYS50aGlja25lc3NNYXAsY29tYmluZTphLmNvbWJpbmUsdmVydGV4VGFuZ2VudHM6ISFhLm5vcm1hbE1hcCYmISFfLmdlb21ldHJ5JiYhIV8uZ2VvbWV0cnkuYXR0cmlidXRlcy50YW5nZW50LHZlcnRleENvbG9yczphLnZlcnRleENvbG9ycyx2ZXJ0ZXhBbHBoYXM6ITA9PT1hLnZlcnRleENvbG9ycyYmISFfLmdlb21ldHJ5JiYhIV8uZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvciYmND09PV8uZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvci5pdGVtU2l6ZSx2ZXJ0ZXhVdnM6ISEoYS5tYXB8fGEuYnVtcE1hcHx8YS5ub3JtYWxNYXB8fGEuc3BlY3VsYXJNYXB8fGEuYWxwaGFNYXB8fGEuZW1pc3NpdmVNYXB8fGEucm91Z2huZXNzTWFwfHxhLm1ldGFsbmVzc01hcHx8YS5jbGVhcmNvYXRNYXB8fGEuY2xlYXJjb2F0Um91Z2huZXNzTWFwfHxhLmNsZWFyY29hdE5vcm1hbE1hcHx8YS5kaXNwbGFjZW1lbnRNYXB8fGEudHJhbnNtaXNzaW9uTWFwfHxhLnRoaWNrbmVzc01hcHx8YS5zcGVjdWxhckludGVuc2l0eU1hcHx8YS5zcGVjdWxhclRpbnRNYXApLHV2c1ZlcnRleE9ubHk6IShhLm1hcHx8YS5idW1wTWFwfHxhLm5vcm1hbE1hcHx8YS5zcGVjdWxhck1hcHx8YS5hbHBoYU1hcHx8YS5lbWlzc2l2ZU1hcHx8YS5yb3VnaG5lc3NNYXB8fGEubWV0YWxuZXNzTWFwfHxhLmNsZWFyY29hdE5vcm1hbE1hcHx8YS50cmFuc21pc3Npb258fGEudHJhbnNtaXNzaW9uTWFwfHxhLnRoaWNrbmVzc01hcHx8YS5zcGVjdWxhckludGVuc2l0eU1hcHx8YS5zcGVjdWxhclRpbnRNYXB8fCFhLmRpc3BsYWNlbWVudE1hcCksZm9nOiEhQyx1c2VGb2c6YS5mb2csZm9nRXhwMjpDJiZDLmlzRm9nRXhwMixmbGF0U2hhZGluZzohIWEuZmxhdFNoYWRpbmcsc2l6ZUF0dGVudWF0aW9uOmEuc2l6ZUF0dGVudWF0aW9uLGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6Yyxza2lubmluZzohMD09PV8uaXNTa2lubmVkTWVzaCYmeD4wLG1heEJvbmVzOngsdXNlVmVydGV4VGV4dHVyZTpkLG1vcnBoVGFyZ2V0czohIV8uZ2VvbWV0cnkmJiEhXy5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24sbW9ycGhOb3JtYWxzOiEhXy5nZW9tZXRyeSYmISFfLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5ub3JtYWwsbnVtRGlyTGlnaHRzOnMuZGlyZWN0aW9uYWwubGVuZ3RoLG51bVBvaW50TGlnaHRzOnMucG9pbnQubGVuZ3RoLG51bVNwb3RMaWdodHM6cy5zcG90Lmxlbmd0aCxudW1SZWN0QXJlYUxpZ2h0czpzLnJlY3RBcmVhLmxlbmd0aCxudW1IZW1pTGlnaHRzOnMuaGVtaS5sZW5ndGgsbnVtRGlyTGlnaHRTaGFkb3dzOnMuZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoLG51bVBvaW50TGlnaHRTaGFkb3dzOnMucG9pbnRTaGFkb3dNYXAubGVuZ3RoLG51bVNwb3RMaWdodFNoYWRvd3M6cy5zcG90U2hhZG93TWFwLmxlbmd0aCxudW1DbGlwcGluZ1BsYW5lczpyLm51bVBsYW5lcyxudW1DbGlwSW50ZXJzZWN0aW9uOnIubnVtSW50ZXJzZWN0aW9uLGRpdGhlcmluZzphLmRpdGhlcmluZyxzaGFkb3dNYXBFbmFibGVkOnQuc2hhZG93TWFwLmVuYWJsZWQmJmcubGVuZ3RoPjAsc2hhZG93TWFwVHlwZTp0LnNoYWRvd01hcC50eXBlLHRvbmVNYXBwaW5nOmEudG9uZU1hcHBlZD90LnRvbmVNYXBwaW5nOjAscGh5c2ljYWxseUNvcnJlY3RMaWdodHM6dC5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyxwcmVtdWx0aXBsaWVkQWxwaGE6YS5wcmVtdWx0aXBsaWVkQWxwaGEsYWxwaGFUZXN0OmEuYWxwaGFUZXN0LGRvdWJsZVNpZGVkOjI9PT1hLnNpZGUsZmxpcFNpZGVkOjE9PT1hLnNpZGUsZGVwdGhQYWNraW5nOnZvaWQgMCE9PWEuZGVwdGhQYWNraW5nJiZhLmRlcHRoUGFja2luZyxpbmRleDBBdHRyaWJ1dGVOYW1lOmEuaW5kZXgwQXR0cmlidXRlTmFtZSxleHRlbnNpb25EZXJpdmF0aXZlczphLmV4dGVuc2lvbnMmJmEuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcyxleHRlbnNpb25GcmFnRGVwdGg6YS5leHRlbnNpb25zJiZhLmV4dGVuc2lvbnMuZnJhZ0RlcHRoLGV4dGVuc2lvbkRyYXdCdWZmZXJzOmEuZXh0ZW5zaW9ucyYmYS5leHRlbnNpb25zLmRyYXdCdWZmZXJzLGV4dGVuc2lvblNoYWRlclRleHR1cmVMT0Q6YS5leHRlbnNpb25zJiZhLmV4dGVuc2lvbnMuc2hhZGVyVGV4dHVyZUxPRCxyZW5kZXJlckV4dGVuc2lvbkZyYWdEZXB0aDpsfHxvLmhhcygiRVhUX2ZyYWdfZGVwdGgiKSxyZW5kZXJlckV4dGVuc2lvbkRyYXdCdWZmZXJzOmx8fG8uaGFzKCJXRUJHTF9kcmF3X2J1ZmZlcnMiKSxyZW5kZXJlckV4dGVuc2lvblNoYWRlclRleHR1cmVMb2Q6bHx8by5oYXMoIkVYVF9zaGFkZXJfdGV4dHVyZV9sb2QiKSxjdXN0b21Qcm9ncmFtQ2FjaGVLZXk6YS5jdXN0b21Qcm9ncmFtQ2FjaGVLZXkoKX19LGdldFByb2dyYW1DYWNoZUtleTpmdW5jdGlvbiB5KGUpe2NvbnN0IG49W107aWYoZS5zaGFkZXJJRD9uLnB1c2goZS5zaGFkZXJJRCk6KG4ucHVzaChlLmZyYWdtZW50U2hhZGVyKSxuLnB1c2goZS52ZXJ0ZXhTaGFkZXIpKSx2b2lkIDAhPT1lLmRlZmluZXMpZm9yKGNvbnN0IHQgaW4gZS5kZWZpbmVzKW4ucHVzaCh0KSxuLnB1c2goZS5kZWZpbmVzW3RdKTtpZighMT09PWUuaXNSYXdTaGFkZXJNYXRlcmlhbCl7Zm9yKGxldCB0PTA7dDxnLmxlbmd0aDt0Kyspbi5wdXNoKGVbZ1t0XV0pO24ucHVzaCh0Lm91dHB1dEVuY29kaW5nKSxuLnB1c2godC5nYW1tYUZhY3Rvcil9cmV0dXJuIG4ucHVzaChlLmN1c3RvbVByb2dyYW1DYWNoZUtleSksbi5qb2luKCl9LGdldFVuaWZvcm1zOmZ1bmN0aW9uIF8odCl7Y29uc3QgZT1mW3QudHlwZV07bGV0IG47cmV0dXJuIG49ZT9oc3QuY2xvbmUoSXN0W2VdLnVuaWZvcm1zKTp0LnVuaWZvcm1zLG59LGFjcXVpcmVQcm9ncmFtOmZ1bmN0aW9uIEMoZSxuKXtsZXQgbztmb3IobGV0IHQ9MCxlPXMubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9c1t0XTtpZihlLmNhY2hlS2V5PT09bil7bz1lLCsrby51c2VkVGltZXM7YnJlYWt9fXJldHVybiB2b2lkIDA9PT1vJiYobz1uZXcgWWN0KHQsbixlLGEpLHMucHVzaChvKSksb30scmVsZWFzZVByb2dyYW06ZnVuY3Rpb24gTSh0KXtpZigwPT0tLXQudXNlZFRpbWVzKXtjb25zdCBlPXMuaW5kZXhPZih0KTtzW2VdPXNbcy5sZW5ndGgtMV0scy5wb3AoKSx0LmRlc3Ryb3koKX19LHByb2dyYW1zOnN9fWZ1bmN0aW9uIFpjdCgpe2xldCB0PW5ldyBXZWFrTWFwO3JldHVybntnZXQ6ZnVuY3Rpb24gZShuKXtsZXQgbz10LmdldChuKTtyZXR1cm4gdm9pZCAwPT09byYmKG89e30sdC5zZXQobixvKSksb30scmVtb3ZlOmZ1bmN0aW9uIG4oZSl7dC5kZWxldGUoZSl9LHVwZGF0ZTpmdW5jdGlvbiBvKGUsbixpKXt0LmdldChlKVtuXT1pfSxkaXNwb3NlOmZ1bmN0aW9uIGkoKXt0PW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24gWGN0KHQsZSl7cmV0dXJuIHQuZ3JvdXBPcmRlciE9PWUuZ3JvdXBPcmRlcj90Lmdyb3VwT3JkZXItZS5ncm91cE9yZGVyOnQucmVuZGVyT3JkZXIhPT1lLnJlbmRlck9yZGVyP3QucmVuZGVyT3JkZXItZS5yZW5kZXJPcmRlcjp0LnByb2dyYW0hPT1lLnByb2dyYW0/dC5wcm9ncmFtLmlkLWUucHJvZ3JhbS5pZDp0Lm1hdGVyaWFsLmlkIT09ZS5tYXRlcmlhbC5pZD90Lm1hdGVyaWFsLmlkLWUubWF0ZXJpYWwuaWQ6dC56IT09ZS56P3Quei1lLno6dC5pZC1lLmlkfWZ1bmN0aW9uIEtjdCh0LGUpe3JldHVybiB0Lmdyb3VwT3JkZXIhPT1lLmdyb3VwT3JkZXI/dC5ncm91cE9yZGVyLWUuZ3JvdXBPcmRlcjp0LnJlbmRlck9yZGVyIT09ZS5yZW5kZXJPcmRlcj90LnJlbmRlck9yZGVyLWUucmVuZGVyT3JkZXI6dC56IT09ZS56P2Uuei10Lno6dC5pZC1lLmlkfWZ1bmN0aW9uIEpjdCh0KXtjb25zdCBlPVtdO2xldCBuPTA7Y29uc3Qgbz1bXSxpPVtdLGE9W10scj17aWQ6LTF9O2Z1bmN0aW9uIHMobyxpLGEscyxsLGMpe2xldCBkPWVbbl07Y29uc3QgcD10LmdldChhKTtyZXR1cm4gdm9pZCAwPT09ZD8oZD17aWQ6by5pZCxvYmplY3Q6byxnZW9tZXRyeTppLG1hdGVyaWFsOmEscHJvZ3JhbTpwLnByb2dyYW18fHIsZ3JvdXBPcmRlcjpzLHJlbmRlck9yZGVyOm8ucmVuZGVyT3JkZXIsejpsLGdyb3VwOmN9LGVbbl09ZCk6KGQuaWQ9by5pZCxkLm9iamVjdD1vLGQuZ2VvbWV0cnk9aSxkLm1hdGVyaWFsPWEsZC5wcm9ncmFtPXAucHJvZ3JhbXx8cixkLmdyb3VwT3JkZXI9cyxkLnJlbmRlck9yZGVyPW8ucmVuZGVyT3JkZXIsZC56PWwsZC5ncm91cD1jKSxuKyssZH1yZXR1cm57b3BhcXVlOm8sdHJhbnNtaXNzaXZlOmksdHJhbnNwYXJlbnQ6YSxpbml0OmZ1bmN0aW9uIGwoKXtuPTAsby5sZW5ndGg9MCxpLmxlbmd0aD0wLGEubGVuZ3RoPTB9LHB1c2g6ZnVuY3Rpb24gYyh0LGUsbixyLGwsZCl7Y29uc3QgcD1zKHQsZSxuLHIsbCxkKTtuLnRyYW5zbWlzc2lvbj4wP2kucHVzaChwKTohMD09PW4udHJhbnNwYXJlbnQ/YS5wdXNoKHApOm8ucHVzaChwKX0sdW5zaGlmdDpmdW5jdGlvbiBkKHQsZSxuLHIsbCxjKXtjb25zdCBkPXModCxlLG4scixsLGMpO24udHJhbnNtaXNzaW9uPjA/aS51bnNoaWZ0KGQpOiEwPT09bi50cmFuc3BhcmVudD9hLnVuc2hpZnQoZCk6by51bnNoaWZ0KGQpfSxmaW5pc2g6ZnVuY3Rpb24gcCgpe2ZvcihsZXQgdD1uLG89ZS5sZW5ndGg7dDxvO3QrKyl7Y29uc3Qgbj1lW3RdO2lmKG51bGw9PT1uLmlkKWJyZWFrO24uaWQ9bnVsbCxuLm9iamVjdD1udWxsLG4uZ2VvbWV0cnk9bnVsbCxuLm1hdGVyaWFsPW51bGwsbi5wcm9ncmFtPW51bGwsbi5ncm91cD1udWxsfX0sc29ydDpmdW5jdGlvbiBtKHQsZSl7by5sZW5ndGg+MSYmby5zb3J0KHR8fFhjdCksaS5sZW5ndGg+MSYmaS5zb3J0KGV8fEtjdCksYS5sZW5ndGg+MSYmYS5zb3J0KGV8fEtjdCl9fX1mdW5jdGlvbiBRY3QodCl7bGV0IGU9bmV3IFdlYWtNYXA7cmV0dXJue2dldDpmdW5jdGlvbiBuKG8saSl7bGV0IGE7cmV0dXJuITE9PT1lLmhhcyhvKT8oYT1uZXcgSmN0KHQpLGUuc2V0KG8sW2FdKSk6aT49ZS5nZXQobykubGVuZ3RoPyhhPW5ldyBKY3QodCksZS5nZXQobykucHVzaChhKSk6YT1lLmdldChvKVtpXSxhfSxkaXNwb3NlOmZ1bmN0aW9uIG8oKXtlPW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24gJGN0KCl7Y29uc3QgdD17fTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUpe2lmKHZvaWQgMCE9PXRbZS5pZF0pcmV0dXJuIHRbZS5pZF07bGV0IG47c3dpdGNoKGUudHlwZSl7Y2FzZSJEaXJlY3Rpb25hbExpZ2h0IjpuPXtkaXJlY3Rpb246bmV3IGNhdCxjb2xvcjpuZXcgUnJ0fTticmVhaztjYXNlIlNwb3RMaWdodCI6bj17cG9zaXRpb246bmV3IGNhdCxkaXJlY3Rpb246bmV3IGNhdCxjb2xvcjpuZXcgUnJ0LGRpc3RhbmNlOjAsY29uZUNvczowLHBlbnVtYnJhQ29zOjAsZGVjYXk6MH07YnJlYWs7Y2FzZSJQb2ludExpZ2h0IjpuPXtwb3NpdGlvbjpuZXcgY2F0LGNvbG9yOm5ldyBScnQsZGlzdGFuY2U6MCxkZWNheTowfTticmVhaztjYXNlIkhlbWlzcGhlcmVMaWdodCI6bj17ZGlyZWN0aW9uOm5ldyBjYXQsc2t5Q29sb3I6bmV3IFJydCxncm91bmRDb2xvcjpuZXcgUnJ0fTticmVhaztjYXNlIlJlY3RBcmVhTGlnaHQiOm49e2NvbG9yOm5ldyBScnQscG9zaXRpb246bmV3IGNhdCxoYWxmV2lkdGg6bmV3IGNhdCxoYWxmSGVpZ2h0Om5ldyBjYXR9fXJldHVybiB0W2UuaWRdPW4sbn19fWxldCB0ZHQ9MDtmdW5jdGlvbiBlZHQodCxlKXtyZXR1cm4oZS5jYXN0U2hhZG93PzE6MCktKHQuY2FzdFNoYWRvdz8xOjApfWZ1bmN0aW9uIG5kdCh0LGUpe2NvbnN0IG49bmV3ICRjdCxvPShmdW5jdGlvbiBpKCl7Y29uc3QgdD17fTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUpe2lmKHZvaWQgMCE9PXRbZS5pZF0pcmV0dXJuIHRbZS5pZF07bGV0IG47c3dpdGNoKGUudHlwZSl7Y2FzZSJEaXJlY3Rpb25hbExpZ2h0IjpjYXNlIlNwb3RMaWdodCI6bj17c2hhZG93QmlhczowLHNoYWRvd05vcm1hbEJpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBRaXR9O2JyZWFrO2Nhc2UiUG9pbnRMaWdodCI6bj17c2hhZG93QmlhczowLHNoYWRvd05vcm1hbEJpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBRaXQsc2hhZG93Q2FtZXJhTmVhcjoxLHNoYWRvd0NhbWVyYUZhcjoxZTN9fXJldHVybiB0W2UuaWRdPW4sbn19fSkoKSxhPXt2ZXJzaW9uOjAsaGFzaDp7ZGlyZWN0aW9uYWxMZW5ndGg6LTEscG9pbnRMZW5ndGg6LTEsc3BvdExlbmd0aDotMSxyZWN0QXJlYUxlbmd0aDotMSxoZW1pTGVuZ3RoOi0xLG51bURpcmVjdGlvbmFsU2hhZG93czotMSxudW1Qb2ludFNoYWRvd3M6LTEsbnVtU3BvdFNoYWRvd3M6LTF9LGFtYmllbnQ6WzAsMCwwXSxwcm9iZTpbXSxkaXJlY3Rpb25hbDpbXSxkaXJlY3Rpb25hbFNoYWRvdzpbXSxkaXJlY3Rpb25hbFNoYWRvd01hcDpbXSxkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDpbXSxzcG90OltdLHNwb3RTaGFkb3c6W10sc3BvdFNoYWRvd01hcDpbXSxzcG90U2hhZG93TWF0cml4OltdLHJlY3RBcmVhOltdLHJlY3RBcmVhTFRDMTpudWxsLHJlY3RBcmVhTFRDMjpudWxsLHBvaW50OltdLHBvaW50U2hhZG93OltdLHBvaW50U2hhZG93TWFwOltdLHBvaW50U2hhZG93TWF0cml4OltdLGhlbWk6W119O2ZvcihsZXQgdD0wO3Q8OTt0KyspYS5wcm9iZS5wdXNoKG5ldyBjYXQpO2NvbnN0IHI9bmV3IGNhdCxzPW5ldyBCYXQsbD1uZXcgQmF0O3JldHVybntzZXR1cDpmdW5jdGlvbiBjKGkpe2xldCByPTAscz0wLGw9MDtmb3IobGV0IHQ9MDt0PDk7dCsrKWEucHJvYmVbdF0uc2V0KDAsMCwwKTtsZXQgYz0wLGQ9MCxwPTAsbT0wLHU9MCxmPTAsZz0wLGg9MDtpLnNvcnQoZWR0KTtmb3IobGV0IHQ9MCxlPWkubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9aVt0XSxiPWUuY29sb3IseT1lLmludGVuc2l0eSxfPWUuZGlzdGFuY2UsQz1lLnNoYWRvdyYmZS5zaGFkb3cubWFwP2Uuc2hhZG93Lm1hcC50ZXh0dXJlOm51bGw7aWYoZS5pc0FtYmllbnRMaWdodClyKz1iLnIqeSxzKz1iLmcqeSxsKz1iLmIqeTtlbHNlIGlmKGUuaXNMaWdodFByb2JlKWZvcihsZXQgdD0wO3Q8OTt0KyspYS5wcm9iZVt0XS5hZGRTY2FsZWRWZWN0b3IoZS5zaC5jb2VmZmljaWVudHNbdF0seSk7ZWxzZSBpZihlLmlzRGlyZWN0aW9uYWxMaWdodCl7Y29uc3QgdD1uLmdldChlKTtpZih0LmNvbG9yLmNvcHkoZS5jb2xvcikubXVsdGlwbHlTY2FsYXIoZS5pbnRlbnNpdHkpLGUuY2FzdFNoYWRvdyl7Y29uc3QgdD1lLnNoYWRvdyxuPW8uZ2V0KGUpO24uc2hhZG93Qmlhcz10LmJpYXMsbi5zaGFkb3dOb3JtYWxCaWFzPXQubm9ybWFsQmlhcyxuLnNoYWRvd1JhZGl1cz10LnJhZGl1cyxuLnNoYWRvd01hcFNpemU9dC5tYXBTaXplLGEuZGlyZWN0aW9uYWxTaGFkb3dbY109bixhLmRpcmVjdGlvbmFsU2hhZG93TWFwW2NdPUMsYS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeFtjXT1lLnNoYWRvdy5tYXRyaXgsZisrfWEuZGlyZWN0aW9uYWxbY109dCxjKyt9ZWxzZSBpZihlLmlzU3BvdExpZ2h0KXtjb25zdCB0PW4uZ2V0KGUpO2lmKHQucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGUubWF0cml4V29ybGQpLHQuY29sb3IuY29weShiKS5tdWx0aXBseVNjYWxhcih5KSx0LmRpc3RhbmNlPV8sdC5jb25lQ29zPU1hdGguY29zKGUuYW5nbGUpLHQucGVudW1icmFDb3M9TWF0aC5jb3MoZS5hbmdsZSooMS1lLnBlbnVtYnJhKSksdC5kZWNheT1lLmRlY2F5LGUuY2FzdFNoYWRvdyl7Y29uc3QgdD1lLnNoYWRvdyxuPW8uZ2V0KGUpO24uc2hhZG93Qmlhcz10LmJpYXMsbi5zaGFkb3dOb3JtYWxCaWFzPXQubm9ybWFsQmlhcyxuLnNoYWRvd1JhZGl1cz10LnJhZGl1cyxuLnNoYWRvd01hcFNpemU9dC5tYXBTaXplLGEuc3BvdFNoYWRvd1twXT1uLGEuc3BvdFNoYWRvd01hcFtwXT1DLGEuc3BvdFNoYWRvd01hdHJpeFtwXT1lLnNoYWRvdy5tYXRyaXgsaCsrfWEuc3BvdFtwXT10LHArK31lbHNlIGlmKGUuaXNSZWN0QXJlYUxpZ2h0KXtjb25zdCB0PW4uZ2V0KGUpO3QuY29sb3IuY29weShiKS5tdWx0aXBseVNjYWxhcih5KSx0LmhhbGZXaWR0aC5zZXQoLjUqZS53aWR0aCwwLDApLHQuaGFsZkhlaWdodC5zZXQoMCwuNSplLmhlaWdodCwwKSxhLnJlY3RBcmVhW21dPXQsbSsrfWVsc2UgaWYoZS5pc1BvaW50TGlnaHQpe2NvbnN0IHQ9bi5nZXQoZSk7aWYodC5jb2xvci5jb3B5KGUuY29sb3IpLm11bHRpcGx5U2NhbGFyKGUuaW50ZW5zaXR5KSx0LmRpc3RhbmNlPWUuZGlzdGFuY2UsdC5kZWNheT1lLmRlY2F5LGUuY2FzdFNoYWRvdyl7Y29uc3QgdD1lLnNoYWRvdyxuPW8uZ2V0KGUpO24uc2hhZG93Qmlhcz10LmJpYXMsbi5zaGFkb3dOb3JtYWxCaWFzPXQubm9ybWFsQmlhcyxuLnNoYWRvd1JhZGl1cz10LnJhZGl1cyxuLnNoYWRvd01hcFNpemU9dC5tYXBTaXplLG4uc2hhZG93Q2FtZXJhTmVhcj10LmNhbWVyYS5uZWFyLG4uc2hhZG93Q2FtZXJhRmFyPXQuY2FtZXJhLmZhcixhLnBvaW50U2hhZG93W2RdPW4sYS5wb2ludFNoYWRvd01hcFtkXT1DLGEucG9pbnRTaGFkb3dNYXRyaXhbZF09ZS5zaGFkb3cubWF0cml4LGcrK31hLnBvaW50W2RdPXQsZCsrfWVsc2UgaWYoZS5pc0hlbWlzcGhlcmVMaWdodCl7Y29uc3QgdD1uLmdldChlKTt0LnNreUNvbG9yLmNvcHkoZS5jb2xvcikubXVsdGlwbHlTY2FsYXIoeSksdC5ncm91bmRDb2xvci5jb3B5KGUuZ3JvdW5kQ29sb3IpLm11bHRpcGx5U2NhbGFyKHkpLGEuaGVtaVt1XT10LHUrK319bT4wJiYoZS5pc1dlYkdMMnx8ITA9PT10LmhhcygiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIik/KGEucmVjdEFyZWFMVEMxPXpzdC5MVENfRkxPQVRfMSxhLnJlY3RBcmVhTFRDMj16c3QuTFRDX0ZMT0FUXzIpOiEwPT09dC5oYXMoIk9FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyIik/KGEucmVjdEFyZWFMVEMxPXpzdC5MVENfSEFMRl8xLGEucmVjdEFyZWFMVEMyPXpzdC5MVENfSEFMRl8yKTpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBVbmFibGUgdG8gdXNlIFJlY3RBcmVhTGlnaHQuIE1pc3NpbmcgV2ViR0wgZXh0ZW5zaW9ucy4iKSksYS5hbWJpZW50WzBdPXIsYS5hbWJpZW50WzFdPXMsYS5hbWJpZW50WzJdPWw7Y29uc3QgYj1hLmhhc2g7Yi5kaXJlY3Rpb25hbExlbmd0aD09PWMmJmIucG9pbnRMZW5ndGg9PT1kJiZiLnNwb3RMZW5ndGg9PT1wJiZiLnJlY3RBcmVhTGVuZ3RoPT09bSYmYi5oZW1pTGVuZ3RoPT09dSYmYi5udW1EaXJlY3Rpb25hbFNoYWRvd3M9PT1mJiZiLm51bVBvaW50U2hhZG93cz09PWcmJmIubnVtU3BvdFNoYWRvd3M9PT1ofHwoYS5kaXJlY3Rpb25hbC5sZW5ndGg9YyxhLnNwb3QubGVuZ3RoPXAsYS5yZWN0QXJlYS5sZW5ndGg9bSxhLnBvaW50Lmxlbmd0aD1kLGEuaGVtaS5sZW5ndGg9dSxhLmRpcmVjdGlvbmFsU2hhZG93Lmxlbmd0aD1mLGEuZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoPWYsYS5wb2ludFNoYWRvdy5sZW5ndGg9ZyxhLnBvaW50U2hhZG93TWFwLmxlbmd0aD1nLGEuc3BvdFNoYWRvdy5sZW5ndGg9aCxhLnNwb3RTaGFkb3dNYXAubGVuZ3RoPWgsYS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC5sZW5ndGg9ZixhLnBvaW50U2hhZG93TWF0cml4Lmxlbmd0aD1nLGEuc3BvdFNoYWRvd01hdHJpeC5sZW5ndGg9aCxiLmRpcmVjdGlvbmFsTGVuZ3RoPWMsYi5wb2ludExlbmd0aD1kLGIuc3BvdExlbmd0aD1wLGIucmVjdEFyZWFMZW5ndGg9bSxiLmhlbWlMZW5ndGg9dSxiLm51bURpcmVjdGlvbmFsU2hhZG93cz1mLGIubnVtUG9pbnRTaGFkb3dzPWcsYi5udW1TcG90U2hhZG93cz1oLGEudmVyc2lvbj10ZHQrKyl9LHNldHVwVmlldzpmdW5jdGlvbiBkKHQsZSl7bGV0IG49MCxvPTAsaT0wLGM9MCxkPTA7Y29uc3QgcD1lLm1hdHJpeFdvcmxkSW52ZXJzZTtmb3IobGV0IGU9MCxtPXQubGVuZ3RoO2U8bTtlKyspe2NvbnN0IG09dFtlXTtpZihtLmlzRGlyZWN0aW9uYWxMaWdodCl7Y29uc3QgdD1hLmRpcmVjdGlvbmFsW25dO3QuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihtLm1hdHJpeFdvcmxkKSxyLnNldEZyb21NYXRyaXhQb3NpdGlvbihtLnRhcmdldC5tYXRyaXhXb3JsZCksdC5kaXJlY3Rpb24uc3ViKHIpLHQuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihwKSxuKyt9ZWxzZSBpZihtLmlzU3BvdExpZ2h0KXtjb25zdCB0PWEuc3BvdFtpXTt0LnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihtLm1hdHJpeFdvcmxkKSx0LnBvc2l0aW9uLmFwcGx5TWF0cml4NChwKSx0LmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24obS5tYXRyaXhXb3JsZCksci5zZXRGcm9tTWF0cml4UG9zaXRpb24obS50YXJnZXQubWF0cml4V29ybGQpLHQuZGlyZWN0aW9uLnN1YihyKSx0LmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24ocCksaSsrfWVsc2UgaWYobS5pc1JlY3RBcmVhTGlnaHQpe2NvbnN0IHQ9YS5yZWN0QXJlYVtjXTt0LnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihtLm1hdHJpeFdvcmxkKSx0LnBvc2l0aW9uLmFwcGx5TWF0cml4NChwKSxsLmlkZW50aXR5KCkscy5jb3B5KG0ubWF0cml4V29ybGQpLHMucHJlbXVsdGlwbHkocCksbC5leHRyYWN0Um90YXRpb24ocyksdC5oYWxmV2lkdGguc2V0KC41Km0ud2lkdGgsMCwwKSx0LmhhbGZIZWlnaHQuc2V0KDAsLjUqbS5oZWlnaHQsMCksdC5oYWxmV2lkdGguYXBwbHlNYXRyaXg0KGwpLHQuaGFsZkhlaWdodC5hcHBseU1hdHJpeDQobCksYysrfWVsc2UgaWYobS5pc1BvaW50TGlnaHQpe2NvbnN0IHQ9YS5wb2ludFtvXTt0LnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihtLm1hdHJpeFdvcmxkKSx0LnBvc2l0aW9uLmFwcGx5TWF0cml4NChwKSxvKyt9ZWxzZSBpZihtLmlzSGVtaXNwaGVyZUxpZ2h0KXtjb25zdCB0PWEuaGVtaVtkXTt0LmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24obS5tYXRyaXhXb3JsZCksdC5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKHApLHQuZGlyZWN0aW9uLm5vcm1hbGl6ZSgpLGQrK319fSxzdGF0ZTphfX1mdW5jdGlvbiBvZHQodCxlKXtjb25zdCBuPW5ldyBuZHQodCxlKSxvPVtdLGk9W107cmV0dXJue2luaXQ6ZnVuY3Rpb24gYSgpe28ubGVuZ3RoPTAsaS5sZW5ndGg9MH0sc3RhdGU6e2xpZ2h0c0FycmF5Om8sc2hhZG93c0FycmF5OmksbGlnaHRzOm59LHNldHVwTGlnaHRzOmZ1bmN0aW9uIHIoKXtuLnNldHVwKG8pfSxzZXR1cExpZ2h0c1ZpZXc6ZnVuY3Rpb24gcyh0KXtuLnNldHVwVmlldyhvLHQpfSxwdXNoTGlnaHQ6ZnVuY3Rpb24gbCh0KXtvLnB1c2godCl9LHB1c2hTaGFkb3c6ZnVuY3Rpb24gYyh0KXtpLnB1c2godCl9fX1mdW5jdGlvbiBpZHQodCxlKXtsZXQgbj1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uIG8oaSxhPTApe2xldCByO3JldHVybiExPT09bi5oYXMoaSk/KHI9bmV3IG9kdCh0LGUpLG4uc2V0KGksW3JdKSk6YT49bi5nZXQoaSkubGVuZ3RoPyhyPW5ldyBvZHQodCxlKSxuLmdldChpKS5wdXNoKHIpKTpyPW4uZ2V0KGkpW2FdLHJ9LGRpc3Bvc2U6ZnVuY3Rpb24gaSgpe249bmV3IFdlYWtNYXB9fX1jbGFzcyBhZHQgZXh0ZW5kcyBPcnR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9Ik1lc2hEZXB0aE1hdGVyaWFsIix0aGlzLmRlcHRoUGFja2luZz0zMjAwLHRoaXMubWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50TWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz0wLHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy5mb2c9ITEsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmRlcHRoUGFja2luZz10LmRlcHRoUGFja2luZyx0aGlzLm1hcD10Lm1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5kaXNwbGFjZW1lbnRNYXA9dC5kaXNwbGFjZW1lbnRNYXAsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT10LmRpc3BsYWNlbWVudFNjYWxlLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz10LmRpc3BsYWNlbWVudEJpYXMsdGhpcy53aXJlZnJhbWU9dC53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgsdGhpc319YWR0LnByb3RvdHlwZS5pc01lc2hEZXB0aE1hdGVyaWFsPSEwO2NsYXNzIHJkdCBleHRlbmRzIE9ydHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iTWVzaERpc3RhbmNlTWF0ZXJpYWwiLHRoaXMucmVmZXJlbmNlUG9zaXRpb249bmV3IGNhdCx0aGlzLm5lYXJEaXN0YW5jZT0xLHRoaXMuZmFyRGlzdGFuY2U9MWUzLHRoaXMubWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50TWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz0wLHRoaXMuZm9nPSExLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5yZWZlcmVuY2VQb3NpdGlvbi5jb3B5KHQucmVmZXJlbmNlUG9zaXRpb24pLHRoaXMubmVhckRpc3RhbmNlPXQubmVhckRpc3RhbmNlLHRoaXMuZmFyRGlzdGFuY2U9dC5mYXJEaXN0YW5jZSx0aGlzLm1hcD10Lm1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5kaXNwbGFjZW1lbnRNYXA9dC5kaXNwbGFjZW1lbnRNYXAsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT10LmRpc3BsYWNlbWVudFNjYWxlLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz10LmRpc3BsYWNlbWVudEJpYXMsdGhpc319ZnVuY3Rpb24gc2R0KHQsZSxuKXtsZXQgbz1uZXcgRXN0O2NvbnN0IGk9bmV3IFFpdCxhPW5ldyBRaXQscj1uZXcgYWF0LHM9bmV3IGFkdCh7ZGVwdGhQYWNraW5nOjMyMDF9KSxsPW5ldyByZHQsYz17fSxkPW4ubWF4VGV4dHVyZVNpemUscD17MDoxLDE6MCwyOjJ9LG09bmV3IGJzdCh7ZGVmaW5lczp7U0FNUExFX1JBVEU6Mi84LEhBTEZfU0FNUExFX1JBVEU6MS84fSx1bmlmb3Jtczp7c2hhZG93X3Bhc3M6e3ZhbHVlOm51bGx9LHJlc29sdXRpb246e3ZhbHVlOm5ldyBRaXR9LHJhZGl1czp7dmFsdWU6NH19LHZlcnRleFNoYWRlcjoidm9pZCBtYWluKCkge1xuXHRnbF9Qb3NpdGlvbiA9IHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcbn0iLGZyYWdtZW50U2hhZGVyOiJ1bmlmb3JtIHNhbXBsZXIyRCBzaGFkb3dfcGFzcztcbnVuaWZvcm0gdmVjMiByZXNvbHV0aW9uO1xudW5pZm9ybSBmbG9hdCByYWRpdXM7XG4jaW5jbHVkZSA8cGFja2luZz5cbnZvaWQgbWFpbigpIHtcblx0ZmxvYXQgbWVhbiA9IDAuMDtcblx0ZmxvYXQgc3F1YXJlZF9tZWFuID0gMC4wO1xuXHRmbG9hdCBkZXB0aCA9IHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIHNoYWRvd19wYXNzLCAoIGdsX0ZyYWdDb29yZC54eSApIC8gcmVzb2x1dGlvbiApICk7XG5cdGZvciAoIGZsb2F0IGkgPSAtMS4wOyBpIDwgMS4wIDsgaSArPSBTQU1QTEVfUkFURSkge1xuXHRcdCNpZmRlZiBIT1JJWk9OVEFMX1BBU1Ncblx0XHRcdHZlYzIgZGlzdHJpYnV0aW9uID0gdW5wYWNrUkdCQVRvMkhhbGYoIHRleHR1cmUyRCggc2hhZG93X3Bhc3MsICggZ2xfRnJhZ0Nvb3JkLnh5ICsgdmVjMiggaSwgMC4wICkgKiByYWRpdXMgKSAvIHJlc29sdXRpb24gKSApO1xuXHRcdFx0bWVhbiArPSBkaXN0cmlidXRpb24ueDtcblx0XHRcdHNxdWFyZWRfbWVhbiArPSBkaXN0cmlidXRpb24ueSAqIGRpc3RyaWJ1dGlvbi55ICsgZGlzdHJpYnV0aW9uLnggKiBkaXN0cmlidXRpb24ueDtcblx0XHQjZWxzZVxuXHRcdFx0ZmxvYXQgZGVwdGggPSB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCAwLjAsIGkgKSAqIHJhZGl1cyApIC8gcmVzb2x1dGlvbiApICk7XG5cdFx0XHRtZWFuICs9IGRlcHRoO1xuXHRcdFx0c3F1YXJlZF9tZWFuICs9IGRlcHRoICogZGVwdGg7XG5cdFx0I2VuZGlmXG5cdH1cblx0bWVhbiA9IG1lYW4gKiBIQUxGX1NBTVBMRV9SQVRFO1xuXHRzcXVhcmVkX21lYW4gPSBzcXVhcmVkX21lYW4gKiBIQUxGX1NBTVBMRV9SQVRFO1xuXHRmbG9hdCBzdGRfZGV2ID0gc3FydCggc3F1YXJlZF9tZWFuIC0gbWVhbiAqIG1lYW4gKTtcblx0Z2xfRnJhZ0NvbG9yID0gcGFjazJIYWxmVG9SR0JBKCB2ZWMyKCBtZWFuLCBzdGRfZGV2ICkgKTtcbn0ifSksdT1tLmNsb25lKCk7dS5kZWZpbmVzLkhPUklaT05UQUxfUEFTUz0xO2NvbnN0IGY9bmV3IHFydDtmLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyB6cnQobmV3IEZsb2F0MzJBcnJheShbLTEsLTEsLjUsMywtMSwuNSwtMSwzLC41XSksMykpO2NvbnN0IGc9bmV3IHBzdChmLG0pLGg9dGhpcztmdW5jdGlvbiBiKG4sbyl7Y29uc3QgaT1lLnVwZGF0ZShnKTttLnVuaWZvcm1zLnNoYWRvd19wYXNzLnZhbHVlPW4ubWFwLnRleHR1cmUsbS51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlPW4ubWFwU2l6ZSxtLnVuaWZvcm1zLnJhZGl1cy52YWx1ZT1uLnJhZGl1cyx0LnNldFJlbmRlclRhcmdldChuLm1hcFBhc3MpLHQuY2xlYXIoKSx0LnJlbmRlckJ1ZmZlckRpcmVjdChvLG51bGwsaSxtLGcsbnVsbCksdS51bmlmb3Jtcy5zaGFkb3dfcGFzcy52YWx1ZT1uLm1hcFBhc3MudGV4dHVyZSx1LnVuaWZvcm1zLnJlc29sdXRpb24udmFsdWU9bi5tYXBTaXplLHUudW5pZm9ybXMucmFkaXVzLnZhbHVlPW4ucmFkaXVzLHQuc2V0UmVuZGVyVGFyZ2V0KG4ubWFwKSx0LmNsZWFyKCksdC5yZW5kZXJCdWZmZXJEaXJlY3QobyxudWxsLGksdSxnLG51bGwpfWZ1bmN0aW9uIHkoZSxuLG8saSxhLHIsZCl7bGV0IG09bnVsbDtjb25zdCB1PSEwPT09aS5pc1BvaW50TGlnaHQ/ZS5jdXN0b21EaXN0YW5jZU1hdGVyaWFsOmUuY3VzdG9tRGVwdGhNYXRlcmlhbDtpZihtPXZvaWQgMCE9PXU/dTohMD09PWkuaXNQb2ludExpZ2h0P2w6cyx0LmxvY2FsQ2xpcHBpbmdFbmFibGVkJiYhMD09PW8uY2xpcFNoYWRvd3MmJjAhPT1vLmNsaXBwaW5nUGxhbmVzLmxlbmd0aCl7Y29uc3QgdD1tLnV1aWQsZT1vLnV1aWQ7bGV0IG49Y1t0XTt2b2lkIDA9PT1uJiYobj17fSxjW3RdPW4pO2xldCBpPW5bZV07dm9pZCAwPT09aSYmKGk9bS5jbG9uZSgpLG5bZV09aSksbT1pfXJldHVybiBtLnZpc2libGU9by52aXNpYmxlLG0ud2lyZWZyYW1lPW8ud2lyZWZyYW1lLG0uc2lkZT0zPT09ZD9udWxsIT09by5zaGFkb3dTaWRlP28uc2hhZG93U2lkZTpvLnNpZGU6bnVsbCE9PW8uc2hhZG93U2lkZT9vLnNoYWRvd1NpZGU6cFtvLnNpZGVdLG0uY2xpcFNoYWRvd3M9by5jbGlwU2hhZG93cyxtLmNsaXBwaW5nUGxhbmVzPW8uY2xpcHBpbmdQbGFuZXMsbS5jbGlwSW50ZXJzZWN0aW9uPW8uY2xpcEludGVyc2VjdGlvbixtLndpcmVmcmFtZUxpbmV3aWR0aD1vLndpcmVmcmFtZUxpbmV3aWR0aCxtLmxpbmV3aWR0aD1vLmxpbmV3aWR0aCwhMD09PWkuaXNQb2ludExpZ2h0JiYhMD09PW0uaXNNZXNoRGlzdGFuY2VNYXRlcmlhbCYmKG0ucmVmZXJlbmNlUG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGkubWF0cml4V29ybGQpLG0ubmVhckRpc3RhbmNlPWEsbS5mYXJEaXN0YW5jZT1yKSxtfWZ1bmN0aW9uIF8obixpLGEscixzKXtpZighMT09PW4udmlzaWJsZSlyZXR1cm47aWYobi5sYXllcnMudGVzdChpLmxheWVycykmJihuLmlzTWVzaHx8bi5pc0xpbmV8fG4uaXNQb2ludHMpJiYobi5jYXN0U2hhZG93fHxuLnJlY2VpdmVTaGFkb3cmJjM9PT1zKSYmKCFuLmZydXN0dW1DdWxsZWR8fG8uaW50ZXJzZWN0c09iamVjdChuKSkpe24ubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoYS5tYXRyaXhXb3JsZEludmVyc2Usbi5tYXRyaXhXb3JsZCk7Y29uc3Qgbz1lLnVwZGF0ZShuKSxpPW4ubWF0ZXJpYWw7aWYoQXJyYXkuaXNBcnJheShpKSl7Y29uc3QgZT1vLmdyb3Vwcztmb3IobGV0IGw9MCxjPWUubGVuZ3RoO2w8YztsKyspe2NvbnN0IGM9ZVtsXSxkPWlbYy5tYXRlcmlhbEluZGV4XTtpZihkJiZkLnZpc2libGUpe2NvbnN0IGU9eShuLDAsZCxyLGEubmVhcixhLmZhcixzKTt0LnJlbmRlckJ1ZmZlckRpcmVjdChhLG51bGwsbyxlLG4sYyl9fX1lbHNlIGlmKGkudmlzaWJsZSl7Y29uc3QgZT15KG4sMCxpLHIsYS5uZWFyLGEuZmFyLHMpO3QucmVuZGVyQnVmZmVyRGlyZWN0KGEsbnVsbCxvLGUsbixudWxsKX19Y29uc3QgbD1uLmNoaWxkcmVuO2ZvcihsZXQgdD0wLGU9bC5sZW5ndGg7dDxlO3QrKylfKGxbdF0saSxhLHIscyl9dGhpcy5lbmFibGVkPSExLHRoaXMuYXV0b1VwZGF0ZT0hMCx0aGlzLm5lZWRzVXBkYXRlPSExLHRoaXMudHlwZT0xLHRoaXMucmVuZGVyPWZ1bmN0aW9uKGUsbixzKXtpZighMT09PWguZW5hYmxlZClyZXR1cm47aWYoITE9PT1oLmF1dG9VcGRhdGUmJiExPT09aC5uZWVkc1VwZGF0ZSlyZXR1cm47aWYoMD09PWUubGVuZ3RoKXJldHVybjtjb25zdCBsPXQuZ2V0UmVuZGVyVGFyZ2V0KCksYz10LmdldEFjdGl2ZUN1YmVGYWNlKCkscD10LmdldEFjdGl2ZU1pcG1hcExldmVsKCksbT10LnN0YXRlO20uc2V0QmxlbmRpbmcoMCksbS5idWZmZXJzLmNvbG9yLnNldENsZWFyKDEsMSwxLDEpLG0uYnVmZmVycy5kZXB0aC5zZXRUZXN0KCEwKSxtLnNldFNjaXNzb3JUZXN0KCExKTtmb3IobGV0IGw9MCxjPWUubGVuZ3RoO2w8YztsKyspe2NvbnN0IGM9ZVtsXSxwPWMuc2hhZG93O2lmKHZvaWQgMD09PXApe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xTaGFkb3dNYXA6IixjLCJoYXMgbm8gc2hhZG93LiIpO2NvbnRpbnVlfWlmKCExPT09cC5hdXRvVXBkYXRlJiYhMT09PXAubmVlZHNVcGRhdGUpY29udGludWU7aS5jb3B5KHAubWFwU2l6ZSk7Y29uc3QgdT1wLmdldEZyYW1lRXh0ZW50cygpO2lmKGkubXVsdGlwbHkodSksYS5jb3B5KHAubWFwU2l6ZSksKGkueD5kfHxpLnk+ZCkmJihpLng+ZCYmKGEueD1NYXRoLmZsb29yKGQvdS54KSxpLng9YS54KnUueCxwLm1hcFNpemUueD1hLngpLGkueT5kJiYoYS55PU1hdGguZmxvb3IoZC91LnkpLGkueT1hLnkqdS55LHAubWFwU2l6ZS55PWEueSkpLG51bGw9PT1wLm1hcCYmIXAuaXNQb2ludExpZ2h0U2hhZG93JiYzPT09dGhpcy50eXBlKXtjb25zdCB0PXttaW5GaWx0ZXI6Yml0LG1hZ0ZpbHRlcjpiaXQsZm9ybWF0OndpdH07cC5tYXA9bmV3IHJhdChpLngsaS55LHQpLHAubWFwLnRleHR1cmUubmFtZT1jLm5hbWUrIi5zaGFkb3dNYXAiLHAubWFwUGFzcz1uZXcgcmF0KGkueCxpLnksdCkscC5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfW51bGw9PT1wLm1hcCYmKHAubWFwPW5ldyByYXQoaS54LGkueSx7bWluRmlsdGVyOmhpdCxtYWdGaWx0ZXI6aGl0LGZvcm1hdDp3aXR9KSxwLm1hcC50ZXh0dXJlLm5hbWU9Yy5uYW1lKyIuc2hhZG93TWFwIixwLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCkpLHQuc2V0UmVuZGVyVGFyZ2V0KHAubWFwKSx0LmNsZWFyKCk7Y29uc3QgZj1wLmdldFZpZXdwb3J0Q291bnQoKTtmb3IobGV0IHQ9MDt0PGY7dCsrKXtjb25zdCBlPXAuZ2V0Vmlld3BvcnQodCk7ci5zZXQoYS54KmUueCxhLnkqZS55LGEueCplLnosYS55KmUudyksbS52aWV3cG9ydChyKSxwLnVwZGF0ZU1hdHJpY2VzKGMsdCksbz1wLmdldEZydXN0dW0oKSxfKG4scyxwLmNhbWVyYSxjLHRoaXMudHlwZSl9cC5pc1BvaW50TGlnaHRTaGFkb3d8fDMhPT10aGlzLnR5cGV8fGIocCxzKSxwLm5lZWRzVXBkYXRlPSExfWgubmVlZHNVcGRhdGU9ITEsdC5zZXRSZW5kZXJUYXJnZXQobCxjLHApfX1mdW5jdGlvbiBsZHQodCxlLG4pe2NvbnN0IG89bi5pc1dlYkdMMixpPW5ldyhmdW5jdGlvbiBhKCl7bGV0IGU9ITE7Y29uc3Qgbj1uZXcgYWF0O2xldCBvPW51bGw7Y29uc3QgaT1uZXcgYWF0KDAsMCwwLDApO3JldHVybntzZXRNYXNrOmZ1bmN0aW9uKG4pe289PT1ufHxlfHwodC5jb2xvck1hc2sobixuLG4sbiksbz1uKX0sc2V0TG9ja2VkOmZ1bmN0aW9uKHQpe2U9dH0sc2V0Q2xlYXI6ZnVuY3Rpb24oZSxvLGEscixzKXshMD09PXMmJihlKj1yLG8qPXIsYSo9ciksbi5zZXQoZSxvLGEsciksITE9PT1pLmVxdWFscyhuKSYmKHQuY2xlYXJDb2xvcihlLG8sYSxyKSxpLmNvcHkobikpfSxyZXNldDpmdW5jdGlvbigpe2U9ITEsbz1udWxsLGkuc2V0KC0xLDAsMCwwKX19fSkscj1uZXcoZnVuY3Rpb24gcygpe2xldCBlPSExLG49bnVsbCxvPW51bGwsaT1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKHQpe3Q/QigyOTI5KTpWKDI5MjkpfSxzZXRNYXNrOmZ1bmN0aW9uKG8pe249PT1vfHxlfHwodC5kZXB0aE1hc2sobyksbj1vKX0sc2V0RnVuYzpmdW5jdGlvbihlKXtpZihvIT09ZSl7aWYoZSlzd2l0Y2goZSl7Y2FzZSAwOnQuZGVwdGhGdW5jKDUxMik7YnJlYWs7Y2FzZSAxOnQuZGVwdGhGdW5jKDUxOSk7YnJlYWs7Y2FzZSAyOnQuZGVwdGhGdW5jKDUxMyk7YnJlYWs7Y2FzZSAzOnQuZGVwdGhGdW5jKDUxNSk7YnJlYWs7Y2FzZSA0OnQuZGVwdGhGdW5jKDUxNCk7YnJlYWs7Y2FzZSA1OnQuZGVwdGhGdW5jKDUxOCk7YnJlYWs7Y2FzZSA2OnQuZGVwdGhGdW5jKDUxNik7YnJlYWs7Y2FzZSA3OnQuZGVwdGhGdW5jKDUxNyk7YnJlYWs7ZGVmYXVsdDp0LmRlcHRoRnVuYyg1MTUpfWVsc2UgdC5kZXB0aEZ1bmMoNTE1KTtvPWV9fSxzZXRMb2NrZWQ6ZnVuY3Rpb24odCl7ZT10fSxzZXRDbGVhcjpmdW5jdGlvbihlKXtpIT09ZSYmKHQuY2xlYXJEZXB0aChlKSxpPWUpfSxyZXNldDpmdW5jdGlvbigpe2U9ITEsbj1udWxsLG89bnVsbCxpPW51bGx9fX0pLGw9bmV3KGZ1bmN0aW9uIGMoKXtsZXQgZT0hMSxuPW51bGwsbz1udWxsLGk9bnVsbCxhPW51bGwscj1udWxsLHM9bnVsbCxsPW51bGwsYz1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKHQpe2V8fCh0P0IoMjk2MCk6VigyOTYwKSl9LHNldE1hc2s6ZnVuY3Rpb24obyl7bj09PW98fGV8fCh0LnN0ZW5jaWxNYXNrKG8pLG49byl9LHNldEZ1bmM6ZnVuY3Rpb24oZSxuLHIpe289PT1lJiZpPT09biYmYT09PXJ8fCh0LnN0ZW5jaWxGdW5jKGUsbixyKSxvPWUsaT1uLGE9cil9LHNldE9wOmZ1bmN0aW9uKGUsbixvKXtyPT09ZSYmcz09PW4mJmw9PT1vfHwodC5zdGVuY2lsT3AoZSxuLG8pLHI9ZSxzPW4sbD1vKX0sc2V0TG9ja2VkOmZ1bmN0aW9uKHQpe2U9dH0sc2V0Q2xlYXI6ZnVuY3Rpb24oZSl7YyE9PWUmJih0LmNsZWFyU3RlbmNpbChlKSxjPWUpfSxyZXNldDpmdW5jdGlvbigpe2U9ITEsbj1udWxsLG89bnVsbCxpPW51bGwsYT1udWxsLHI9bnVsbCxzPW51bGwsbD1udWxsLGM9bnVsbH19fSk7bGV0IGQ9e30scD1udWxsLG09e30sdT1udWxsLGY9ITEsZz1udWxsLGg9bnVsbCxiPW51bGwseT1udWxsLF89bnVsbCxDPW51bGwsTT1udWxsLHY9ITEseD1udWxsLE89bnVsbCxQPW51bGwsdz1udWxsLGs9bnVsbDtjb25zdCBTPXQuZ2V0UGFyYW1ldGVyKDM1NjYxKTtsZXQgRD0hMSxFPTA7Y29uc3QgUj10LmdldFBhcmFtZXRlcig3OTM4KTstMSE9PVIuaW5kZXhPZigiV2ViR0wiKT8oRT1wYXJzZUZsb2F0KC9eV2ViR0wgKFxkKS8uZXhlYyhSKVsxXSksRD1FPj0xKTotMSE9PVIuaW5kZXhPZigiT3BlbkdMIEVTIikmJihFPXBhcnNlRmxvYXQoL15PcGVuR0wgRVMgKFxkKS8uZXhlYyhSKVsxXSksRD1FPj0yKTtsZXQgQT1udWxsLFQ9e307Y29uc3QgTj10LmdldFBhcmFtZXRlcigzMDg4KSx6PXQuZ2V0UGFyYW1ldGVyKDI5NzgpLEk9KG5ldyBhYXQpLmZyb21BcnJheShOKSxIPShuZXcgYWF0KS5mcm9tQXJyYXkoeik7ZnVuY3Rpb24gRihlLG4sbyl7Y29uc3QgaT1uZXcgVWludDhBcnJheSg0KSxhPXQuY3JlYXRlVGV4dHVyZSgpO3QuYmluZFRleHR1cmUoZSxhKSx0LnRleFBhcmFtZXRlcmkoZSwxMDI0MSw5NzI4KSx0LnRleFBhcmFtZXRlcmkoZSwxMDI0MCw5NzI4KTtmb3IobGV0IGU9MDtlPG87ZSsrKXQudGV4SW1hZ2UyRChuK2UsMCw2NDA4LDEsMSwwLDY0MDgsNTEyMSxpKTtyZXR1cm4gYX1jb25zdCBMPXt9O2Z1bmN0aW9uIEIoZSl7ITAhPT1kW2VdJiYodC5lbmFibGUoZSksZFtlXT0hMCl9ZnVuY3Rpb24gVihlKXshMSE9PWRbZV0mJih0LmRpc2FibGUoZSksZFtlXT0hMSl9TFszNTUzXT1GKDM1NTMsMzU1MywxKSxMWzM0MDY3XT1GKDM0MDY3LDM0MDY5LDYpLGkuc2V0Q2xlYXIoMCwwLDAsMSksci5zZXRDbGVhcigxKSxsLnNldENsZWFyKDApLEIoMjkyOSksci5zZXRGdW5jKDMpLFcoITEpLFkoMSksQigyODg0KSxHKDApO2NvbnN0IGo9e1tjaXRdOjMyNzc0LDEwMTozMjc3OCwxMDI6MzI3Nzl9O2lmKG8palsxMDNdPTMyNzc1LGpbMTA0XT0zMjc3NjtlbHNle2NvbnN0IHQ9ZS5nZXQoIkVYVF9ibGVuZF9taW5tYXgiKTtudWxsIT09dCYmKGpbMTAzXT10Lk1JTl9FWFQsalsxMDRdPXQuTUFYX0VYVCl9Y29uc3QgVT17MjAwOjAsMjAxOjEsMjAyOjc2OCwyMDQ6NzcwLDIxMDo3NzYsMjA4Ojc3NCwyMDY6NzcyLDIwMzo3NjksMjA1Ojc3MSwyMDk6Nzc1LDIwNzo3NzN9O2Z1bmN0aW9uIEcoZSxuLG8saSxhLHIscyxsKXtpZigwIT09ZSl7aWYoITE9PT1mJiYoQigzMDQyKSxmPSEwKSw1PT09ZSlhPWF8fG4scj1yfHxvLHM9c3x8aSxuPT09aCYmYT09PV98fCh0LmJsZW5kRXF1YXRpb25TZXBhcmF0ZShqW25dLGpbYV0pLGg9bixfPWEpLG89PT1iJiZpPT09eSYmcj09PUMmJnM9PT1NfHwodC5ibGVuZEZ1bmNTZXBhcmF0ZShVW29dLFVbaV0sVVtyXSxVW3NdKSxiPW8seT1pLEM9cixNPXMpLGc9ZSx2PW51bGw7ZWxzZSBpZihlIT09Z3x8bCE9PXYpe2lmKGg9PT1jaXQmJl89PT1jaXR8fCh0LmJsZW5kRXF1YXRpb24oMzI3NzQpLGg9Y2l0LF89Y2l0KSxsKXN3aXRjaChlKXtjYXNlIDE6dC5ibGVuZEZ1bmNTZXBhcmF0ZSgxLDc3MSwxLDc3MSk7YnJlYWs7Y2FzZSAyOnQuYmxlbmRGdW5jKDEsMSk7YnJlYWs7Y2FzZSAzOnQuYmxlbmRGdW5jU2VwYXJhdGUoMCwwLDc2OSw3NzEpO2JyZWFrO2Nhc2UgNDp0LmJsZW5kRnVuY1NlcGFyYXRlKDAsNzY4LDAsNzcwKTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICIsZSl9ZWxzZSBzd2l0Y2goZSl7Y2FzZSAxOnQuYmxlbmRGdW5jU2VwYXJhdGUoNzcwLDc3MSwxLDc3MSk7YnJlYWs7Y2FzZSAyOnQuYmxlbmRGdW5jKDc3MCwxKTticmVhaztjYXNlIDM6dC5ibGVuZEZ1bmMoMCw3NjkpO2JyZWFrO2Nhc2UgNDp0LmJsZW5kRnVuYygwLDc2OCk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAiLGUpfWI9bnVsbCx5PW51bGwsQz1udWxsLE09bnVsbCxnPWUsdj1sfX1lbHNlITA9PT1mJiYoVigzMDQyKSxmPSExKX1mdW5jdGlvbiBXKGUpe3ghPT1lJiYodC5mcm9udEZhY2UoZT8yMzA0OjIzMDUpLHg9ZSl9ZnVuY3Rpb24gWShlKXswIT09ZT8oQigyODg0KSxlIT09TyYmdC5jdWxsRmFjZSgxPT09ZT8xMDI5OjI9PT1lPzEwMjg6MTAzMikpOlYoMjg4NCksTz1lfWZ1bmN0aW9uIHEoZSxuLG8pe2U/KEIoMzI4MjMpLHc9PT1uJiZrPT09b3x8KHQucG9seWdvbk9mZnNldChuLG8pLHc9bixrPW8pKTpWKDMyODIzKX1mdW5jdGlvbiBaKGUpe3ZvaWQgMD09PWUmJihlPTMzOTg0K1MtMSksQSE9PWUmJih0LmFjdGl2ZVRleHR1cmUoZSksQT1lKX1yZXR1cm57YnVmZmVyczp7Y29sb3I6aSxkZXB0aDpyLHN0ZW5jaWw6bH0sZW5hYmxlOkIsZGlzYWJsZTpWLGJpbmRGcmFtZWJ1ZmZlcjpmdW5jdGlvbiBYKGUsbil7cmV0dXJuIG51bGw9PT1uJiZudWxsIT09cCYmKG49cCksbVtlXSE9PW4mJih0LmJpbmRGcmFtZWJ1ZmZlcihlLG4pLG1bZV09bixvJiYoMzYwMDk9PT1lJiYobVszNjE2MF09biksMzYxNjA9PT1lJiYobVszNjAwOV09bikpLCEwKX0sYmluZFhSRnJhbWVidWZmZXI6ZnVuY3Rpb24gSyhlKXtlIT09cCYmKHQuYmluZEZyYW1lYnVmZmVyKDM2MTYwLGUpLHA9ZSl9LHVzZVByb2dyYW06ZnVuY3Rpb24gSihlKXtyZXR1cm4gdSE9PWUmJih0LnVzZVByb2dyYW0oZSksdT1lLCEwKX0sc2V0QmxlbmRpbmc6RyxzZXRNYXRlcmlhbDpmdW5jdGlvbiBRKHQsZSl7Mj09PXQuc2lkZT9WKDI4ODQpOkIoMjg4NCk7bGV0IG49MT09PXQuc2lkZTtlJiYobj0hbiksVyhuKSwxPT09dC5ibGVuZGluZyYmITE9PT10LnRyYW5zcGFyZW50P0coMCk6Ryh0LmJsZW5kaW5nLHQuYmxlbmRFcXVhdGlvbix0LmJsZW5kU3JjLHQuYmxlbmREc3QsdC5ibGVuZEVxdWF0aW9uQWxwaGEsdC5ibGVuZFNyY0FscGhhLHQuYmxlbmREc3RBbHBoYSx0LnByZW11bHRpcGxpZWRBbHBoYSksci5zZXRGdW5jKHQuZGVwdGhGdW5jKSxyLnNldFRlc3QodC5kZXB0aFRlc3QpLHIuc2V0TWFzayh0LmRlcHRoV3JpdGUpLGkuc2V0TWFzayh0LmNvbG9yV3JpdGUpO2NvbnN0IG89dC5zdGVuY2lsV3JpdGU7bC5zZXRUZXN0KG8pLG8mJihsLnNldE1hc2sodC5zdGVuY2lsV3JpdGVNYXNrKSxsLnNldEZ1bmModC5zdGVuY2lsRnVuYyx0LnN0ZW5jaWxSZWYsdC5zdGVuY2lsRnVuY01hc2spLGwuc2V0T3AodC5zdGVuY2lsRmFpbCx0LnN0ZW5jaWxaRmFpbCx0LnN0ZW5jaWxaUGFzcykpLHEodC5wb2x5Z29uT2Zmc2V0LHQucG9seWdvbk9mZnNldEZhY3Rvcix0LnBvbHlnb25PZmZzZXRVbml0cyksITA9PT10LmFscGhhVG9Db3ZlcmFnZT9CKDMyOTI2KTpWKDMyOTI2KX0sc2V0RmxpcFNpZGVkOlcsc2V0Q3VsbEZhY2U6WSxzZXRMaW5lV2lkdGg6ZnVuY3Rpb24gJChlKXtlIT09UCYmKEQmJnQubGluZVdpZHRoKGUpLFA9ZSl9LHNldFBvbHlnb25PZmZzZXQ6cSxzZXRTY2lzc29yVGVzdDpmdW5jdGlvbiB0dCh0KXt0P0IoMzA4OSk6VigzMDg5KX0sYWN0aXZlVGV4dHVyZTpaLGJpbmRUZXh0dXJlOmZ1bmN0aW9uIGV0KGUsbil7bnVsbD09PUEmJlooKTtsZXQgbz1UW0FdO3ZvaWQgMD09PW8mJihvPXt0eXBlOnZvaWQgMCx0ZXh0dXJlOnZvaWQgMH0sVFtBXT1vKSxvLnR5cGU9PT1lJiZvLnRleHR1cmU9PT1ufHwodC5iaW5kVGV4dHVyZShlLG58fExbZV0pLG8udHlwZT1lLG8udGV4dHVyZT1uKX0sdW5iaW5kVGV4dHVyZTpmdW5jdGlvbiBudCgpe2NvbnN0IGU9VFtBXTt2b2lkIDAhPT1lJiZ2b2lkIDAhPT1lLnR5cGUmJih0LmJpbmRUZXh0dXJlKGUudHlwZSxudWxsKSxlLnR5cGU9dm9pZCAwLGUudGV4dHVyZT12b2lkIDApfSxjb21wcmVzc2VkVGV4SW1hZ2UyRDpmdW5jdGlvbiBvdCgpe3RyeXt0LmNvbXByZXNzZWRUZXhJbWFnZTJELmFwcGx5KHQsYXJndW1lbnRzKX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIsdCl9fSx0ZXhJbWFnZTJEOmZ1bmN0aW9uIGl0KCl7dHJ5e3QudGV4SW1hZ2UyRC5hcHBseSh0LGFyZ3VtZW50cyl9Y2F0Y2godCl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLHQpfX0sdGV4SW1hZ2UzRDpmdW5jdGlvbiBhdCgpe3RyeXt0LnRleEltYWdlM0QuYXBwbHkodCxhcmd1bWVudHMpfWNhdGNoKHQpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6Iix0KX19LHNjaXNzb3I6ZnVuY3Rpb24gcnQoZSl7ITE9PT1JLmVxdWFscyhlKSYmKHQuc2Npc3NvcihlLngsZS55LGUueixlLncpLEkuY29weShlKSl9LHZpZXdwb3J0OmZ1bmN0aW9uIHN0KGUpeyExPT09SC5lcXVhbHMoZSkmJih0LnZpZXdwb3J0KGUueCxlLnksZS56LGUudyksSC5jb3B5KGUpKX0scmVzZXQ6ZnVuY3Rpb24gbHQoKXt0LmRpc2FibGUoMzA0MiksdC5kaXNhYmxlKDI4ODQpLHQuZGlzYWJsZSgyOTI5KSx0LmRpc2FibGUoMzI4MjMpLHQuZGlzYWJsZSgzMDg5KSx0LmRpc2FibGUoMjk2MCksdC5kaXNhYmxlKDMyOTI2KSx0LmJsZW5kRXF1YXRpb24oMzI3NzQpLHQuYmxlbmRGdW5jKDEsMCksdC5ibGVuZEZ1bmNTZXBhcmF0ZSgxLDAsMSwwKSx0LmNvbG9yTWFzayghMCwhMCwhMCwhMCksdC5jbGVhckNvbG9yKDAsMCwwLDApLHQuZGVwdGhNYXNrKCEwKSx0LmRlcHRoRnVuYyg1MTMpLHQuY2xlYXJEZXB0aCgxKSx0LnN0ZW5jaWxNYXNrKDQyOTQ5NjcyOTUpLHQuc3RlbmNpbEZ1bmMoNTE5LDAsNDI5NDk2NzI5NSksdC5zdGVuY2lsT3AoNzY4MCw3NjgwLDc2ODApLHQuY2xlYXJTdGVuY2lsKDApLHQuY3VsbEZhY2UoMTAyOSksdC5mcm9udEZhY2UoMjMwNSksdC5wb2x5Z29uT2Zmc2V0KDAsMCksdC5hY3RpdmVUZXh0dXJlKDMzOTg0KSx0LmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxudWxsKSwhMD09PW8mJih0LmJpbmRGcmFtZWJ1ZmZlcigzNjAwOSxudWxsKSx0LmJpbmRGcmFtZWJ1ZmZlcigzNjAwOCxudWxsKSksdC51c2VQcm9ncmFtKG51bGwpLHQubGluZVdpZHRoKDEpLHQuc2Npc3NvcigwLDAsdC5jYW52YXMud2lkdGgsdC5jYW52YXMuaGVpZ2h0KSx0LnZpZXdwb3J0KDAsMCx0LmNhbnZhcy53aWR0aCx0LmNhbnZhcy5oZWlnaHQpLGQ9e30sQT1udWxsLFQ9e30scD1udWxsLG09e30sdT1udWxsLGY9ITEsZz1udWxsLGg9bnVsbCxiPW51bGwseT1udWxsLF89bnVsbCxDPW51bGwsTT1udWxsLHY9ITEseD1udWxsLE89bnVsbCxQPW51bGwsdz1udWxsLGs9bnVsbCxJLnNldCgwLDAsdC5jYW52YXMud2lkdGgsdC5jYW52YXMuaGVpZ2h0KSxILnNldCgwLDAsdC5jYW52YXMud2lkdGgsdC5jYW52YXMuaGVpZ2h0KSxpLnJlc2V0KCksci5yZXNldCgpLGwucmVzZXQoKX19fWZ1bmN0aW9uIGNkdCh0LGUsbixvLGksYSxyKXtjb25zdCBzPWkuaXNXZWJHTDIsbD1pLm1heFRleHR1cmVzLGM9aS5tYXhDdWJlbWFwU2l6ZSxkPWkubWF4VGV4dHVyZVNpemUscD1pLm1heFNhbXBsZXMsbT1uZXcgV2Vha01hcDtsZXQgdSxmPSExO3RyeXtmPSJ1bmRlZmluZWQiIT10eXBlb2YgT2Zmc2NyZWVuQ2FudmFzJiZudWxsIT09bmV3IE9mZnNjcmVlbkNhbnZhcygxLDEpLmdldENvbnRleHQoIjJkIil9Y2F0Y2godCl7fWZ1bmN0aW9uIGcodCxlKXtyZXR1cm4gZj9uZXcgT2Zmc2NyZWVuQ2FudmFzKHQsZSk6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiY2FudmFzIil9ZnVuY3Rpb24gaCh0LGUsbixvKXtsZXQgaT0xO2lmKCh0LndpZHRoPm98fHQuaGVpZ2h0Pm8pJiYoaT1vL01hdGgubWF4KHQud2lkdGgsdC5oZWlnaHQpKSxpPDF8fCEwPT09ZSl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50JiZ0IGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudHx8InVuZGVmaW5lZCIhPXR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCYmdCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHwidW5kZWZpbmVkIiE9dHlwZW9mIEltYWdlQml0bWFwJiZ0IGluc3RhbmNlb2YgSW1hZ2VCaXRtYXApe2NvbnN0IG89ZT9KaXQ6TWF0aC5mbG9vcixhPW8oaSp0LndpZHRoKSxyPW8oaSp0LmhlaWdodCk7dm9pZCAwPT09dSYmKHU9ZyhhLHIpKTtjb25zdCBzPW4/ZyhhLHIpOnU7cmV0dXJuIHMud2lkdGg9YSxzLmhlaWdodD1yLHMuZ2V0Q29udGV4dCgiMmQiKS5kcmF3SW1hZ2UodCwwLDAsYSxyKSxjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgaGFzIGJlZW4gcmVzaXplZCBmcm9tICgiK3Qud2lkdGgrIngiK3QuaGVpZ2h0KyIpIHRvICgiK2ErIngiK3IrIikuIiksc31yZXR1cm4iZGF0YSJpbiB0JiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEltYWdlIGluIERhdGFUZXh0dXJlIGlzIHRvbyBiaWcgKCIrdC53aWR0aCsieCIrdC5oZWlnaHQrIikuIiksdH1yZXR1cm4gdH1mdW5jdGlvbiBiKHQpe3JldHVybiBLaXQodC53aWR0aCkmJktpdCh0LmhlaWdodCl9ZnVuY3Rpb24geSh0LGUpe3JldHVybiB0LmdlbmVyYXRlTWlwbWFwcyYmZSYmdC5taW5GaWx0ZXIhPT1oaXQmJnQubWluRmlsdGVyIT09Yml0fWZ1bmN0aW9uIF8oZSxuLGksYSxyPTEpe3QuZ2VuZXJhdGVNaXBtYXAoZSksby5nZXQobikuX19tYXhNaXBMZXZlbD1NYXRoLmxvZzIoTWF0aC5tYXgoaSxhLHIpKX1mdW5jdGlvbiBDKG4sbyxpKXtpZighMT09PXMpcmV0dXJuIG87aWYobnVsbCE9PW4pe2lmKHZvaWQgMCE9PXRbbl0pcmV0dXJuIHRbbl07Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIHVzZSBub24tZXhpc3RpbmcgV2ViR0wgaW50ZXJuYWwgZm9ybWF0ICciK24rIiciKX1sZXQgYT1vO3JldHVybiA2NDAzPT09byYmKDUxMjY9PT1pJiYoYT0zMzMyNiksNTEzMT09PWkmJihhPTMzMzI1KSw1MTIxPT09aSYmKGE9MzMzMjEpKSw2NDA3PT09byYmKDUxMjY9PT1pJiYoYT0zNDgzNyksNTEzMT09PWkmJihhPTM0ODQzKSw1MTIxPT09aSYmKGE9MzI4NDkpKSw2NDA4PT09byYmKDUxMjY9PT1pJiYoYT0zNDgzNiksNTEzMT09PWkmJihhPTM0ODQyKSw1MTIxPT09aSYmKGE9MzI4NTYpKSwzMzMyNSE9PWEmJjMzMzI2IT09YSYmMzQ4NDIhPT1hJiYzNDgzNiE9PWF8fGUuZ2V0KCJFWFRfY29sb3JfYnVmZmVyX2Zsb2F0IiksYX1mdW5jdGlvbiBNKHQpe3JldHVybiB0PT09aGl0fHwxMDA0PT09dHx8MTAwNT09PXQ/OTcyODo5NzI5fWZ1bmN0aW9uIHYoZSl7Y29uc3Qgbj1lLnRhcmdldDtuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHYpLChmdW5jdGlvbiBpKGUpe2NvbnN0IG49by5nZXQoZSk7dm9pZCAwIT09bi5fX3dlYmdsSW5pdCYmKHQuZGVsZXRlVGV4dHVyZShuLl9fd2ViZ2xUZXh0dXJlKSxvLnJlbW92ZShlKSl9KShuKSxuLmlzVmlkZW9UZXh0dXJlJiZtLmRlbGV0ZShuKSxyLm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIHgoZSl7Y29uc3Qgbj1lLnRhcmdldDtuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHgpLChmdW5jdGlvbiBpKGUpe2NvbnN0IG49ZS50ZXh0dXJlLGk9by5nZXQoZSksYT1vLmdldChuKTtpZihlKXtpZih2b2lkIDAhPT1hLl9fd2ViZ2xUZXh0dXJlJiYodC5kZWxldGVUZXh0dXJlKGEuX193ZWJnbFRleHR1cmUpLHIubWVtb3J5LnRleHR1cmVzLS0pLGUuZGVwdGhUZXh0dXJlJiZlLmRlcHRoVGV4dHVyZS5kaXNwb3NlKCksZS5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldClmb3IobGV0IGU9MDtlPDY7ZSsrKXQuZGVsZXRlRnJhbWVidWZmZXIoaS5fX3dlYmdsRnJhbWVidWZmZXJbZV0pLGkuX193ZWJnbERlcHRoYnVmZmVyJiZ0LmRlbGV0ZVJlbmRlcmJ1ZmZlcihpLl9fd2ViZ2xEZXB0aGJ1ZmZlcltlXSk7ZWxzZSB0LmRlbGV0ZUZyYW1lYnVmZmVyKGkuX193ZWJnbEZyYW1lYnVmZmVyKSxpLl9fd2ViZ2xEZXB0aGJ1ZmZlciYmdC5kZWxldGVSZW5kZXJidWZmZXIoaS5fX3dlYmdsRGVwdGhidWZmZXIpLGkuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyJiZ0LmRlbGV0ZUZyYW1lYnVmZmVyKGkuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKSxpLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlciYmdC5kZWxldGVSZW5kZXJidWZmZXIoaS5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIpLGkuX193ZWJnbERlcHRoUmVuZGVyYnVmZmVyJiZ0LmRlbGV0ZVJlbmRlcmJ1ZmZlcihpLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcik7aWYoZS5pc1dlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzKWZvcihsZXQgZT0wLGk9bi5sZW5ndGg7ZTxpO2UrKyl7Y29uc3QgaT1vLmdldChuW2VdKTtpLl9fd2ViZ2xUZXh0dXJlJiYodC5kZWxldGVUZXh0dXJlKGkuX193ZWJnbFRleHR1cmUpLHIubWVtb3J5LnRleHR1cmVzLS0pLG8ucmVtb3ZlKG5bZV0pfW8ucmVtb3ZlKG4pLG8ucmVtb3ZlKGUpfX0pKG4pfWxldCBPPTA7ZnVuY3Rpb24gUCh0LGUpe2NvbnN0IGk9by5nZXQodCk7aWYodC5pc1ZpZGVvVGV4dHVyZSYmKGZ1bmN0aW9uIGEodCl7Y29uc3QgZT1yLnJlbmRlci5mcmFtZTttLmdldCh0KSE9PWUmJihtLnNldCh0LGUpLHQudXBkYXRlKCkpfSkodCksdC52ZXJzaW9uPjAmJmkuX192ZXJzaW9uIT09dC52ZXJzaW9uKXtjb25zdCBuPXQuaW1hZ2U7aWYodm9pZCAwPT09biljb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIHVuZGVmaW5lZCIpO2Vsc2V7aWYoITEhPT1uLmNvbXBsZXRlKXJldHVybiB2b2lkIFIoaSx0LGUpO2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgaW5jb21wbGV0ZSIpfX1uLmFjdGl2ZVRleHR1cmUoMzM5ODQrZSksbi5iaW5kVGV4dHVyZSgzNTUzLGkuX193ZWJnbFRleHR1cmUpfWZ1bmN0aW9uIHcoZSxpKXtjb25zdCByPW8uZ2V0KGUpO2UudmVyc2lvbj4wJiZyLl9fdmVyc2lvbiE9PWUudmVyc2lvbj8oZnVuY3Rpb24gbChlLG8saSl7aWYoNiE9PW8uaW1hZ2UubGVuZ3RoKXJldHVybjtFKGUsbyksbi5hY3RpdmVUZXh0dXJlKDMzOTg0K2kpLG4uYmluZFRleHR1cmUoMzQwNjcsZS5fX3dlYmdsVGV4dHVyZSksdC5waXhlbFN0b3JlaSgzNzQ0MCxvLmZsaXBZKSx0LnBpeGVsU3RvcmVpKDM3NDQxLG8ucHJlbXVsdGlwbHlBbHBoYSksdC5waXhlbFN0b3JlaSgzMzE3LG8udW5wYWNrQWxpZ25tZW50KSx0LnBpeGVsU3RvcmVpKDM3NDQzLDApO2NvbnN0IHI9byYmKG8uaXNDb21wcmVzc2VkVGV4dHVyZXx8by5pbWFnZVswXS5pc0NvbXByZXNzZWRUZXh0dXJlKSxsPW8uaW1hZ2VbMF0mJm8uaW1hZ2VbMF0uaXNEYXRhVGV4dHVyZSxkPVtdO2ZvcihsZXQgdD0wO3Q8Njt0KyspZFt0XT1yfHxsP2w/by5pbWFnZVt0XS5pbWFnZTpvLmltYWdlW3RdOmgoby5pbWFnZVt0XSwhMSwhMCxjKTtjb25zdCBwPWRbMF0sbT1iKHApfHxzLHU9YS5jb252ZXJ0KG8uZm9ybWF0KSxmPWEuY29udmVydChvLnR5cGUpLGc9QyhvLmludGVybmFsRm9ybWF0LHUsZik7bGV0IE07aWYoRCgzNDA2NyxvLG0pLHIpe2ZvcihsZXQgdD0wO3Q8Njt0Kyspe009ZFt0XS5taXBtYXBzO2ZvcihsZXQgZT0wO2U8TS5sZW5ndGg7ZSsrKXtjb25zdCBpPU1bZV07by5mb3JtYXQhPT13aXQmJm8uZm9ybWF0IT09UGl0P251bGwhPT11P24uY29tcHJlc3NlZFRleEltYWdlMkQoMzQwNjkrdCxlLGcsaS53aWR0aCxpLmhlaWdodCwwLGkuZGF0YSk6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAuc2V0VGV4dHVyZUN1YmUoKSIpOm4udGV4SW1hZ2UyRCgzNDA2OSt0LGUsZyxpLndpZHRoLGkuaGVpZ2h0LDAsdSxmLGkuZGF0YSl9fWUuX19tYXhNaXBMZXZlbD1NLmxlbmd0aC0xfWVsc2V7TT1vLm1pcG1hcHM7Zm9yKGxldCB0PTA7dDw2O3QrKylpZihsKXtuLnRleEltYWdlMkQoMzQwNjkrdCwwLGcsZFt0XS53aWR0aCxkW3RdLmhlaWdodCwwLHUsZixkW3RdLmRhdGEpO2ZvcihsZXQgZT0wO2U8TS5sZW5ndGg7ZSsrKXtjb25zdCBvPU1bZV0uaW1hZ2VbdF0uaW1hZ2U7bi50ZXhJbWFnZTJEKDM0MDY5K3QsZSsxLGcsby53aWR0aCxvLmhlaWdodCwwLHUsZixvLmRhdGEpfX1lbHNle24udGV4SW1hZ2UyRCgzNDA2OSt0LDAsZyx1LGYsZFt0XSk7Zm9yKGxldCBlPTA7ZTxNLmxlbmd0aDtlKyspbi50ZXhJbWFnZTJEKDM0MDY5K3QsZSsxLGcsdSxmLE1bZV0uaW1hZ2VbdF0pfWUuX19tYXhNaXBMZXZlbD1NLmxlbmd0aH15KG8sbSkmJl8oMzQwNjcsbyxwLndpZHRoLHAuaGVpZ2h0KSxlLl9fdmVyc2lvbj1vLnZlcnNpb24sby5vblVwZGF0ZSYmby5vblVwZGF0ZShvKX0pKHIsZSxpKToobi5hY3RpdmVUZXh0dXJlKDMzOTg0K2kpLG4uYmluZFRleHR1cmUoMzQwNjcsci5fX3dlYmdsVGV4dHVyZSkpfWNvbnN0IGs9e1t1aXRdOjEwNDk3LFtmaXRdOjMzMDcxLFtnaXRdOjMzNjQ4fSxTPXtbaGl0XTo5NzI4LDEwMDQ6OTk4NCwxMDA1Ojk5ODYsW2JpdF06OTcyOSwxMDA3Ojk5ODUsW3lpdF06OTk4N307ZnVuY3Rpb24gRChuLGEscil7aWYocj8odC50ZXhQYXJhbWV0ZXJpKG4sMTAyNDIsa1thLndyYXBTXSksdC50ZXhQYXJhbWV0ZXJpKG4sMTAyNDMsa1thLndyYXBUXSksMzI4NzkhPT1uJiYzNTg2NiE9PW58fHQudGV4UGFyYW1ldGVyaShuLDMyODgyLGtbYS53cmFwUl0pLHQudGV4UGFyYW1ldGVyaShuLDEwMjQwLFNbYS5tYWdGaWx0ZXJdKSx0LnRleFBhcmFtZXRlcmkobiwxMDI0MSxTW2EubWluRmlsdGVyXSkpOih0LnRleFBhcmFtZXRlcmkobiwxMDI0MiwzMzA3MSksdC50ZXhQYXJhbWV0ZXJpKG4sMTAyNDMsMzMwNzEpLDMyODc5IT09biYmMzU4NjYhPT1ufHx0LnRleFBhcmFtZXRlcmkobiwzMjg4MiwzMzA3MSksYS53cmFwUz09PWZpdCYmYS53cmFwVD09PWZpdHx8Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLiIpLHQudGV4UGFyYW1ldGVyaShuLDEwMjQwLE0oYS5tYWdGaWx0ZXIpKSx0LnRleFBhcmFtZXRlcmkobiwxMDI0MSxNKGEubWluRmlsdGVyKSksYS5taW5GaWx0ZXIhPT1oaXQmJmEubWluRmlsdGVyIT09Yml0JiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgaXMgbm90IHBvd2VyIG9mIHR3by4gVGV4dHVyZS5taW5GaWx0ZXIgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5OZWFyZXN0RmlsdGVyIG9yIFRIUkVFLkxpbmVhckZpbHRlci4iKSksITA9PT1lLmhhcygiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIikpe2NvbnN0IHI9ZS5nZXQoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpO2lmKGEudHlwZT09PXZpdCYmITE9PT1lLmhhcygiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIikpcmV0dXJuO2lmKCExPT09cyYmYS50eXBlPT09eGl0JiYhMT09PWUuaGFzKCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhciIpKXJldHVybjsoYS5hbmlzb3Ryb3B5PjF8fG8uZ2V0KGEpLl9fY3VycmVudEFuaXNvdHJvcHkpJiYodC50ZXhQYXJhbWV0ZXJmKG4sci5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCxNYXRoLm1pbihhLmFuaXNvdHJvcHksaS5nZXRNYXhBbmlzb3Ryb3B5KCkpKSxvLmdldChhKS5fX2N1cnJlbnRBbmlzb3Ryb3B5PWEuYW5pc290cm9weSl9fWZ1bmN0aW9uIEUoZSxuKXt2b2lkIDA9PT1lLl9fd2ViZ2xJbml0JiYoZS5fX3dlYmdsSW5pdD0hMCxuLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHYpLGUuX193ZWJnbFRleHR1cmU9dC5jcmVhdGVUZXh0dXJlKCksci5tZW1vcnkudGV4dHVyZXMrKyl9ZnVuY3Rpb24gUihlLG8saSl7bGV0IHI9MzU1MztvLmlzRGF0YVRleHR1cmUyREFycmF5JiYocj0zNTg2Niksby5pc0RhdGFUZXh0dXJlM0QmJihyPTMyODc5KSxFKGUsbyksbi5hY3RpdmVUZXh0dXJlKDMzOTg0K2kpLG4uYmluZFRleHR1cmUocixlLl9fd2ViZ2xUZXh0dXJlKSx0LnBpeGVsU3RvcmVpKDM3NDQwLG8uZmxpcFkpLHQucGl4ZWxTdG9yZWkoMzc0NDEsby5wcmVtdWx0aXBseUFscGhhKSx0LnBpeGVsU3RvcmVpKDMzMTcsby51bnBhY2tBbGlnbm1lbnQpLHQucGl4ZWxTdG9yZWkoMzc0NDMsMCk7Y29uc3QgbD0oZnVuY3Rpb24gYyh0KXtyZXR1cm4hcyYmKHQud3JhcFMhPT1maXR8fHQud3JhcFQhPT1maXR8fHQubWluRmlsdGVyIT09aGl0JiZ0Lm1pbkZpbHRlciE9PWJpdCl9KShvKSYmITE9PT1iKG8uaW1hZ2UpLHA9aChvLmltYWdlLGwsITEsZCksbT1iKHApfHxzLHU9YS5jb252ZXJ0KG8uZm9ybWF0KTtsZXQgZixnPWEuY29udmVydChvLnR5cGUpLE09QyhvLmludGVybmFsRm9ybWF0LHUsZyk7RChyLG8sbSk7Y29uc3Qgdj1vLm1pcG1hcHM7aWYoby5pc0RlcHRoVGV4dHVyZSlNPTY0MDIscz9NPW8udHlwZT09PXZpdD8zNjAxMjpvLnR5cGU9PT1NaXQ/MzMxOTA6by50eXBlPT09T2l0PzM1MDU2OjMzMTg5Om8udHlwZT09PXZpdCYmY29uc29sZS5lcnJvcigiV2ViR0xSZW5kZXJlcjogRmxvYXRpbmcgcG9pbnQgZGVwdGggdGV4dHVyZSByZXF1aXJlcyBXZWJHTDIuIiksby5mb3JtYXQ9PT1raXQmJjY0MDI9PT1NJiZvLnR5cGUhPT1DaXQmJm8udHlwZSE9PU1pdCYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVXNlIFVuc2lnbmVkU2hvcnRUeXBlIG9yIFVuc2lnbmVkSW50VHlwZSBmb3IgRGVwdGhGb3JtYXQgRGVwdGhUZXh0dXJlLiIpLG8udHlwZT1DaXQsZz1hLmNvbnZlcnQoby50eXBlKSksby5mb3JtYXQ9PT1TaXQmJjY0MDI9PT1NJiYoTT0zNDA0MSxvLnR5cGUhPT1PaXQmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERlcHRoU3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuIiksby50eXBlPU9pdCxnPWEuY29udmVydChvLnR5cGUpKSksbi50ZXhJbWFnZTJEKDM1NTMsMCxNLHAud2lkdGgscC5oZWlnaHQsMCx1LGcsbnVsbCk7ZWxzZSBpZihvLmlzRGF0YVRleHR1cmUpaWYodi5sZW5ndGg+MCYmbSl7Zm9yKGxldCB0PTAsZT12Lmxlbmd0aDt0PGU7dCsrKWY9dlt0XSxuLnRleEltYWdlMkQoMzU1Myx0LE0sZi53aWR0aCxmLmhlaWdodCwwLHUsZyxmLmRhdGEpO28uZ2VuZXJhdGVNaXBtYXBzPSExLGUuX19tYXhNaXBMZXZlbD12Lmxlbmd0aC0xfWVsc2Ugbi50ZXhJbWFnZTJEKDM1NTMsMCxNLHAud2lkdGgscC5oZWlnaHQsMCx1LGcscC5kYXRhKSxlLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKG8uaXNDb21wcmVzc2VkVGV4dHVyZSl7Zm9yKGxldCB0PTAsZT12Lmxlbmd0aDt0PGU7dCsrKWY9dlt0XSxvLmZvcm1hdCE9PXdpdCYmby5mb3JtYXQhPT1QaXQ/bnVsbCE9PXU/bi5jb21wcmVzc2VkVGV4SW1hZ2UyRCgzNTUzLHQsTSxmLndpZHRoLGYuaGVpZ2h0LDAsZi5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC51cGxvYWRUZXh0dXJlKCkiKTpuLnRleEltYWdlMkQoMzU1Myx0LE0sZi53aWR0aCxmLmhlaWdodCwwLHUsZyxmLmRhdGEpO2UuX19tYXhNaXBMZXZlbD12Lmxlbmd0aC0xfWVsc2UgaWYoby5pc0RhdGFUZXh0dXJlMkRBcnJheSluLnRleEltYWdlM0QoMzU4NjYsMCxNLHAud2lkdGgscC5oZWlnaHQscC5kZXB0aCwwLHUsZyxwLmRhdGEpLGUuX19tYXhNaXBMZXZlbD0wO2Vsc2UgaWYoby5pc0RhdGFUZXh0dXJlM0Qpbi50ZXhJbWFnZTNEKDMyODc5LDAsTSxwLndpZHRoLHAuaGVpZ2h0LHAuZGVwdGgsMCx1LGcscC5kYXRhKSxlLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKHYubGVuZ3RoPjAmJm0pe2ZvcihsZXQgdD0wLGU9di5sZW5ndGg7dDxlO3QrKylmPXZbdF0sbi50ZXhJbWFnZTJEKDM1NTMsdCxNLHUsZyxmKTtvLmdlbmVyYXRlTWlwbWFwcz0hMSxlLl9fbWF4TWlwTGV2ZWw9di5sZW5ndGgtMX1lbHNlIG4udGV4SW1hZ2UyRCgzNTUzLDAsTSx1LGcscCksZS5fX21heE1pcExldmVsPTA7eShvLG0pJiZfKHIsbyxwLndpZHRoLHAuaGVpZ2h0KSxlLl9fdmVyc2lvbj1vLnZlcnNpb24sby5vblVwZGF0ZSYmby5vblVwZGF0ZShvKX1mdW5jdGlvbiBBKGUsaSxyLHMsbCl7Y29uc3QgYz1hLmNvbnZlcnQoci5mb3JtYXQpLGQ9YS5jb252ZXJ0KHIudHlwZSkscD1DKHIuaW50ZXJuYWxGb3JtYXQsYyxkKTszMjg3OT09PWx8fDM1ODY2PT09bD9uLnRleEltYWdlM0QobCwwLHAsaS53aWR0aCxpLmhlaWdodCxpLmRlcHRoLDAsYyxkLG51bGwpOm4udGV4SW1hZ2UyRChsLDAscCxpLndpZHRoLGkuaGVpZ2h0LDAsYyxkLG51bGwpLG4uYmluZEZyYW1lYnVmZmVyKDM2MTYwLGUpLHQuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAscyxsLG8uZ2V0KHIpLl9fd2ViZ2xUZXh0dXJlLDApLG4uYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWZ1bmN0aW9uIFQoZSxuLG8pe2lmKHQuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxlKSxuLmRlcHRoQnVmZmVyJiYhbi5zdGVuY2lsQnVmZmVyKXtsZXQgaT0zMzE4OTtpZihvKXtjb25zdCBlPW4uZGVwdGhUZXh0dXJlO2UmJmUuaXNEZXB0aFRleHR1cmUmJihlLnR5cGU9PT12aXQ/aT0zNjAxMjplLnR5cGU9PT1NaXQmJihpPTMzMTkwKSk7Y29uc3Qgbz1OKG4pO3QucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLG8saSxuLndpZHRoLG4uaGVpZ2h0KX1lbHNlIHQucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSxpLG4ud2lkdGgsbi5oZWlnaHQpO3QuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoMzYxNjAsMzYwOTYsMzYxNjEsZSl9ZWxzZSBpZihuLmRlcHRoQnVmZmVyJiZuLnN0ZW5jaWxCdWZmZXIpe2lmKG8pe2NvbnN0IGU9TihuKTt0LnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSxlLDM1MDU2LG4ud2lkdGgsbi5oZWlnaHQpfWVsc2UgdC5yZW5kZXJidWZmZXJTdG9yYWdlKDM2MTYxLDM0MDQxLG4ud2lkdGgsbi5oZWlnaHQpO3QuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoMzYxNjAsMzMzMDYsMzYxNjEsZSl9ZWxzZXtjb25zdCBlPSEwPT09bi5pc1dlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzP24udGV4dHVyZVswXTpuLnRleHR1cmUsaT1hLmNvbnZlcnQoZS5mb3JtYXQpLHI9YS5jb252ZXJ0KGUudHlwZSkscz1DKGUuaW50ZXJuYWxGb3JtYXQsaSxyKTtpZihvKXtjb25zdCBlPU4obik7dC5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoMzYxNjEsZSxzLG4ud2lkdGgsbi5oZWlnaHQpfWVsc2UgdC5yZW5kZXJidWZmZXJTdG9yYWdlKDM2MTYxLHMsbi53aWR0aCxuLmhlaWdodCl9dC5iaW5kUmVuZGVyYnVmZmVyKDM2MTYxLG51bGwpfWZ1bmN0aW9uIE4odCl7cmV0dXJuIHMmJnQuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0P01hdGgubWluKHAsdC5zYW1wbGVzKTowfWxldCB6PSExLEk9ITE7dGhpcy5hbGxvY2F0ZVRleHR1cmVVbml0PWZ1bmN0aW9uIEgoKXtjb25zdCB0PU87cmV0dXJuIHQ+PWwmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlczogVHJ5aW5nIHRvIHVzZSAiK3QrIiB0ZXh0dXJlIHVuaXRzIHdoaWxlIHRoaXMgR1BVIHN1cHBvcnRzIG9ubHkgIitsKSxPKz0xLHR9LHRoaXMucmVzZXRUZXh0dXJlVW5pdHM9ZnVuY3Rpb24gRigpe089MH0sdGhpcy5zZXRUZXh0dXJlMkQ9UCx0aGlzLnNldFRleHR1cmUyREFycmF5PWZ1bmN0aW9uIEwodCxlKXtjb25zdCBpPW8uZ2V0KHQpO3QudmVyc2lvbj4wJiZpLl9fdmVyc2lvbiE9PXQudmVyc2lvbj9SKGksdCxlKToobi5hY3RpdmVUZXh0dXJlKDMzOTg0K2UpLG4uYmluZFRleHR1cmUoMzU4NjYsaS5fX3dlYmdsVGV4dHVyZSkpfSx0aGlzLnNldFRleHR1cmUzRD1mdW5jdGlvbiBCKHQsZSl7Y29uc3QgaT1vLmdldCh0KTt0LnZlcnNpb24+MCYmaS5fX3ZlcnNpb24hPT10LnZlcnNpb24/UihpLHQsZSk6KG4uYWN0aXZlVGV4dHVyZSgzMzk4NCtlKSxuLmJpbmRUZXh0dXJlKDMyODc5LGkuX193ZWJnbFRleHR1cmUpKX0sdGhpcy5zZXRUZXh0dXJlQ3ViZT13LHRoaXMuc2V0dXBSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24gVihlKXtjb25zdCBsPWUudGV4dHVyZSxjPW8uZ2V0KGUpLGQ9by5nZXQobCk7ZS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIix4KSwhMCE9PWUuaXNXZWJHTE11bHRpcGxlUmVuZGVyVGFyZ2V0cyYmKGQuX193ZWJnbFRleHR1cmU9dC5jcmVhdGVUZXh0dXJlKCksZC5fX3ZlcnNpb249bC52ZXJzaW9uLHIubWVtb3J5LnRleHR1cmVzKyspO2NvbnN0IHA9ITA9PT1lLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0LG09ITA9PT1lLmlzV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHMsdT0hMD09PWUuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0LGY9bC5pc0RhdGFUZXh0dXJlM0R8fGwuaXNEYXRhVGV4dHVyZTJEQXJyYXksZz1iKGUpfHxzO2lmKCFzfHxsLmZvcm1hdCE9PVBpdHx8bC50eXBlIT09dml0JiZsLnR5cGUhPT14aXR8fChsLmZvcm1hdD13aXQsY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBSZW5kZXJpbmcgdG8gdGV4dHVyZXMgd2l0aCBSR0IgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuIFVzaW5nIFJHQkEgZm9ybWF0IGluc3RlYWQuIikpLHApe2MuX193ZWJnbEZyYW1lYnVmZmVyPVtdO2ZvcihsZXQgZT0wO2U8NjtlKyspYy5fX3dlYmdsRnJhbWVidWZmZXJbZV09dC5jcmVhdGVGcmFtZWJ1ZmZlcigpfWVsc2UgaWYoYy5fX3dlYmdsRnJhbWVidWZmZXI9dC5jcmVhdGVGcmFtZWJ1ZmZlcigpLG0paWYoaS5kcmF3QnVmZmVycyl7Y29uc3Qgbj1lLnRleHR1cmU7Zm9yKGxldCBlPTAsaT1uLmxlbmd0aDtlPGk7ZSsrKXtjb25zdCBpPW8uZ2V0KG5bZV0pO3ZvaWQgMD09PWkuX193ZWJnbFRleHR1cmUmJihpLl9fd2ViZ2xUZXh0dXJlPXQuY3JlYXRlVGV4dHVyZSgpLHIubWVtb3J5LnRleHR1cmVzKyspfX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHMgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFdlYkdMMiBvciBXRUJHTF9kcmF3X2J1ZmZlcnMgZXh0ZW5zaW9uLiIpO2Vsc2UgaWYodSlpZihzKXtjLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcj10LmNyZWF0ZUZyYW1lYnVmZmVyKCksYy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXI9dC5jcmVhdGVSZW5kZXJidWZmZXIoKSx0LmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsYy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIpO2NvbnN0IG89YS5jb252ZXJ0KGwuZm9ybWF0KSxpPWEuY29udmVydChsLnR5cGUpLHI9QyhsLmludGVybmFsRm9ybWF0LG8saSkscz1OKGUpO3QucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLHMscixlLndpZHRoLGUuaGVpZ2h0KSxuLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxjLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciksdC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzNjA2NCwzNjE2MSxjLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlciksdC5iaW5kUmVuZGVyYnVmZmVyKDM2MTYxLG51bGwpLGUuZGVwdGhCdWZmZXImJihjLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcj10LmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLFQoYy5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIsZSwhMCkpLG4uYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIik7aWYocCl7bi5iaW5kVGV4dHVyZSgzNDA2NyxkLl9fd2ViZ2xUZXh0dXJlKSxEKDM0MDY3LGwsZyk7Zm9yKGxldCB0PTA7dDw2O3QrKylBKGMuX193ZWJnbEZyYW1lYnVmZmVyW3RdLGUsbCwzNjA2NCwzNDA2OSt0KTt5KGwsZykmJl8oMzQwNjcsbCxlLndpZHRoLGUuaGVpZ2h0KSxuLmJpbmRUZXh0dXJlKDM0MDY3LG51bGwpfWVsc2UgaWYobSl7Y29uc3QgdD1lLnRleHR1cmU7Zm9yKGxldCBpPTAsYT10Lmxlbmd0aDtpPGE7aSsrKXtjb25zdCBhPXRbaV0scj1vLmdldChhKTtuLmJpbmRUZXh0dXJlKDM1NTMsci5fX3dlYmdsVGV4dHVyZSksRCgzNTUzLGEsZyksQShjLl9fd2ViZ2xGcmFtZWJ1ZmZlcixlLGEsMzYwNjQraSwzNTUzKSx5KGEsZykmJl8oMzU1MyxhLGUud2lkdGgsZS5oZWlnaHQpfW4uYmluZFRleHR1cmUoMzU1MyxudWxsKX1lbHNle2xldCB0PTM1NTM7ZiYmKHM/dD1sLmlzRGF0YVRleHR1cmUzRD8zMjg3OTozNTg2Njpjb25zb2xlLndhcm4oIlRIUkVFLkRhdGFUZXh0dXJlM0QgYW5kIFRIUkVFLkRhdGFUZXh0dXJlMkRBcnJheSBvbmx5IHN1cHBvcnRlZCB3aXRoIFdlYkdMMi4iKSksbi5iaW5kVGV4dHVyZSh0LGQuX193ZWJnbFRleHR1cmUpLEQodCxsLGcpLEEoYy5fX3dlYmdsRnJhbWVidWZmZXIsZSxsLDM2MDY0LHQpLHkobCxnKSYmXyh0LGwsZS53aWR0aCxlLmhlaWdodCxlLmRlcHRoKSxuLmJpbmRUZXh0dXJlKHQsbnVsbCl9ZS5kZXB0aEJ1ZmZlciYmKGZ1bmN0aW9uIGgoZSl7Y29uc3QgaT1vLmdldChlKSxhPSEwPT09ZS5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldDtpZihlLmRlcHRoVGV4dHVyZSl7aWYoYSl0aHJvdyBuZXcgRXJyb3IoInRhcmdldC5kZXB0aFRleHR1cmUgbm90IHN1cHBvcnRlZCBpbiBDdWJlIHJlbmRlciB0YXJnZXRzIik7IShmdW5jdGlvbiByKGUsaSl7aWYoaSYmaS5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCl0aHJvdyBuZXcgRXJyb3IoIkRlcHRoIFRleHR1cmUgd2l0aCBjdWJlIHJlbmRlciB0YXJnZXRzIGlzIG5vdCBzdXBwb3J0ZWQiKTtpZihuLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxlKSwhaS5kZXB0aFRleHR1cmV8fCFpLmRlcHRoVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSl0aHJvdyBuZXcgRXJyb3IoInJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBUSFJFRS5EZXB0aFRleHR1cmUiKTtvLmdldChpLmRlcHRoVGV4dHVyZSkuX193ZWJnbFRleHR1cmUmJmkuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoPT09aS53aWR0aCYmaS5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0PT09aS5oZWlnaHR8fChpLmRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aD1pLndpZHRoLGkuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodD1pLmhlaWdodCxpLmRlcHRoVGV4dHVyZS5uZWVkc1VwZGF0ZT0hMCksUChpLmRlcHRoVGV4dHVyZSwwKTtjb25zdCBhPW8uZ2V0KGkuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZTtpZihpLmRlcHRoVGV4dHVyZS5mb3JtYXQ9PT1raXQpdC5mcmFtZWJ1ZmZlclRleHR1cmUyRCgzNjE2MCwzNjA5NiwzNTUzLGEsMCk7ZWxzZXtpZihpLmRlcHRoVGV4dHVyZS5mb3JtYXQhPT1TaXQpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGRlcHRoVGV4dHVyZSBmb3JtYXQiKTt0LmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDMzMzA2LDM1NTMsYSwwKX19KShpLl9fd2ViZ2xGcmFtZWJ1ZmZlcixlKX1lbHNlIGlmKGEpe2kuX193ZWJnbERlcHRoYnVmZmVyPVtdO2ZvcihsZXQgbz0wO288NjtvKyspbi5iaW5kRnJhbWVidWZmZXIoMzYxNjAsaS5fX3dlYmdsRnJhbWVidWZmZXJbb10pLGkuX193ZWJnbERlcHRoYnVmZmVyW29dPXQuY3JlYXRlUmVuZGVyYnVmZmVyKCksVChpLl9fd2ViZ2xEZXB0aGJ1ZmZlcltvXSxlLCExKX1lbHNlIG4uYmluZEZyYW1lYnVmZmVyKDM2MTYwLGkuX193ZWJnbEZyYW1lYnVmZmVyKSxpLl9fd2ViZ2xEZXB0aGJ1ZmZlcj10LmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLFQoaS5fX3dlYmdsRGVwdGhidWZmZXIsZSwhMSk7bi5iaW5kRnJhbWVidWZmZXIoMzYxNjAsbnVsbCl9KShlKX0sdGhpcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA9ZnVuY3Rpb24gaih0KXtjb25zdCBlPWIodCl8fHMsaT0hMD09PXQuaXNXZWJHTE11bHRpcGxlUmVuZGVyVGFyZ2V0cz90LnRleHR1cmU6W3QudGV4dHVyZV07Zm9yKGxldCBhPTAscj1pLmxlbmd0aDthPHI7YSsrKXtjb25zdCByPWlbYV07aWYoeShyLGUpKXtjb25zdCBlPXQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQ/MzQwNjc6MzU1MyxpPW8uZ2V0KHIpLl9fd2ViZ2xUZXh0dXJlO24uYmluZFRleHR1cmUoZSxpKSxfKGUscix0LndpZHRoLHQuaGVpZ2h0KSxuLmJpbmRUZXh0dXJlKGUsbnVsbCl9fX0sdGhpcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldD1mdW5jdGlvbiBVKGUpe2lmKGUuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KWlmKHMpe2NvbnN0IGk9ZS53aWR0aCxhPWUuaGVpZ2h0O2xldCByPTE2Mzg0O2UuZGVwdGhCdWZmZXImJihyfD0yNTYpLGUuc3RlbmNpbEJ1ZmZlciYmKHJ8PTEwMjQpO2NvbnN0IHM9by5nZXQoZSk7bi5iaW5kRnJhbWVidWZmZXIoMzYwMDgscy5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIpLG4uYmluZEZyYW1lYnVmZmVyKDM2MDA5LHMuX193ZWJnbEZyYW1lYnVmZmVyKSx0LmJsaXRGcmFtZWJ1ZmZlcigwLDAsaSxhLDAsMCxpLGEsciw5NzI4KSxuLmJpbmRGcmFtZWJ1ZmZlcigzNjAwOCxudWxsKSxuLmJpbmRGcmFtZWJ1ZmZlcigzNjAwOSxzLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcil9ZWxzZSBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFdlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFdlYkdMMi4iKX0sdGhpcy5zYWZlU2V0VGV4dHVyZTJEPWZ1bmN0aW9uIEcodCxlKXt0JiZ0LmlzV2ViR0xSZW5kZXJUYXJnZXQmJighMT09PXomJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMVGV4dHVyZXMuc2FmZVNldFRleHR1cmUyRDogZG9uJ3QgdXNlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC4iKSx6PSEwKSx0PXQudGV4dHVyZSksUCh0LGUpfSx0aGlzLnNhZmVTZXRUZXh0dXJlQ3ViZT1mdW5jdGlvbiBXKHQsZSl7dCYmdC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCYmKCExPT09SSYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlcy5zYWZlU2V0VGV4dHVyZUN1YmU6IGRvbid0IHVzZSBjdWJlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC4iKSxJPSEwKSx0PXQudGV4dHVyZSksdyh0LGUpfX1mdW5jdGlvbiBkZHQodCxlLG4pe2NvbnN0IG89bi5pc1dlYkdMMjtyZXR1cm57Y29udmVydDpmdW5jdGlvbiBpKHQpe2xldCBuO2lmKHQ9PT1faXQpcmV0dXJuIDUxMjE7aWYoMTAxNz09PXQpcmV0dXJuIDMyODE5O2lmKDEwMTg9PT10KXJldHVybiAzMjgyMDtpZigxMDE5PT09dClyZXR1cm4gMzM2MzU7aWYoMTAxMD09PXQpcmV0dXJuIDUxMjA7aWYoMTAxMT09PXQpcmV0dXJuIDUxMjI7aWYodD09PUNpdClyZXR1cm4gNTEyMztpZigxMDEzPT09dClyZXR1cm4gNTEyNDtpZih0PT09TWl0KXJldHVybiA1MTI1O2lmKHQ9PT12aXQpcmV0dXJuIDUxMjY7aWYodD09PXhpdClyZXR1cm4gbz81MTMxOihuPWUuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IiksbnVsbCE9PW4/bi5IQUxGX0ZMT0FUX09FUzpudWxsKTtpZigxMDIxPT09dClyZXR1cm4gNjQwNjtpZih0PT09UGl0KXJldHVybiA2NDA3O2lmKHQ9PT13aXQpcmV0dXJuIDY0MDg7aWYoMTAyND09PXQpcmV0dXJuIDY0MDk7aWYoMTAyNT09PXQpcmV0dXJuIDY0MTA7aWYodD09PWtpdClyZXR1cm4gNjQwMjtpZih0PT09U2l0KXJldHVybiAzNDA0MTtpZigxMDI4PT09dClyZXR1cm4gNjQwMztpZigxMDI5PT09dClyZXR1cm4gMzYyNDQ7aWYoMTAzMD09PXQpcmV0dXJuIDMzMzE5O2lmKDEwMzE9PT10KXJldHVybiAzMzMyMDtpZigxMDMyPT09dClyZXR1cm4gMzYyNDg7aWYoMTAzMz09PXQpcmV0dXJuIDM2MjQ5O2lmKDMzNzc2PT09dHx8MzM3Nzc9PT10fHwzMzc3OD09PXR8fDMzNzc5PT09dCl7aWYobj1lLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKSxudWxsPT09bilyZXR1cm4gbnVsbDtpZigzMzc3Nj09PXQpcmV0dXJuIG4uQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVDtpZigzMzc3Nz09PXQpcmV0dXJuIG4uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ7aWYoMzM3Nzg9PT10KXJldHVybiBuLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUO2lmKDMzNzc5PT09dClyZXR1cm4gbi5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVH1pZigzNTg0MD09PXR8fDM1ODQxPT09dHx8MzU4NDI9PT10fHwzNTg0Mz09PXQpe2lmKG49ZS5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpLG51bGw9PT1uKXJldHVybiBudWxsO2lmKDM1ODQwPT09dClyZXR1cm4gbi5DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HO2lmKDM1ODQxPT09dClyZXR1cm4gbi5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HO2lmKDM1ODQyPT09dClyZXR1cm4gbi5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRztpZigzNTg0Mz09PXQpcmV0dXJuIG4uQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUd9aWYoMzYxOTY9PT10KXJldHVybiBuPWUuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMSIpLG51bGwhPT1uP24uQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTDpudWxsO2lmKCgzNzQ5Mj09PXR8fDM3NDk2PT09dCkmJihuPWUuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjIiksbnVsbCE9PW4pKXtpZigzNzQ5Mj09PXQpcmV0dXJuIG4uQ09NUFJFU1NFRF9SR0I4X0VUQzI7aWYoMzc0OTY9PT10KXJldHVybiBuLkNPTVBSRVNTRURfUkdCQThfRVRDMl9FQUN9cmV0dXJuIDM3ODA4PT09dHx8Mzc4MDk9PT10fHwzNzgxMD09PXR8fDM3ODExPT09dHx8Mzc4MTI9PT10fHwzNzgxMz09PXR8fDM3ODE0PT09dHx8Mzc4MTU9PT10fHwzNzgxNj09PXR8fDM3ODE3PT09dHx8Mzc4MTg9PT10fHwzNzgxOT09PXR8fDM3ODIwPT09dHx8Mzc4MjE9PT10fHwzNzg0MD09PXR8fDM3ODQxPT09dHx8Mzc4NDI9PT10fHwzNzg0Mz09PXR8fDM3ODQ0PT09dHx8Mzc4NDU9PT10fHwzNzg0Nj09PXR8fDM3ODQ3PT09dHx8Mzc4NDg9PT10fHwzNzg0OT09PXR8fDM3ODUwPT09dHx8Mzc4NTE9PT10fHwzNzg1Mj09PXR8fDM3ODUzPT09dD8obj1lLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiKSxudWxsIT09bj90Om51bGwpOjM2NDkyPT09dD8obj1lLmdldCgiRVhUX3RleHR1cmVfY29tcHJlc3Npb25fYnB0YyIpLG51bGwhPT1uP3Q6bnVsbCk6dD09PU9pdD9vPzM0MDQyOihuPWUuZ2V0KCJXRUJHTF9kZXB0aF90ZXh0dXJlIiksbnVsbCE9PW4/bi5VTlNJR05FRF9JTlRfMjRfOF9XRUJHTDpudWxsKTp2b2lkIDB9fX1yZHQucHJvdG90eXBlLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWw9ITA7Y2xhc3MgcGR0IGV4dGVuZHMgX3N0e2NvbnN0cnVjdG9yKHQ9W10pe3N1cGVyKCksdGhpcy5jYW1lcmFzPXR9fXBkdC5wcm90b3R5cGUuaXNBcnJheUNhbWVyYT0hMDtjbGFzcyBtZHQgZXh0ZW5kcyBwcnR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudHlwZT0iR3JvdXAifX1tZHQucHJvdG90eXBlLmlzR3JvdXA9ITA7Y29uc3QgdWR0PXt0eXBlOiJtb3ZlIn07Y2xhc3MgZmR0e2NvbnN0cnVjdG9yKCl7dGhpcy5fdGFyZ2V0UmF5PW51bGwsdGhpcy5fZ3JpcD1udWxsLHRoaXMuX2hhbmQ9bnVsbH1nZXRIYW5kU3BhY2UoKXtyZXR1cm4gbnVsbD09PXRoaXMuX2hhbmQmJih0aGlzLl9oYW5kPW5ldyBtZHQsdGhpcy5faGFuZC5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuX2hhbmQudmlzaWJsZT0hMSx0aGlzLl9oYW5kLmpvaW50cz17fSx0aGlzLl9oYW5kLmlucHV0U3RhdGU9e3BpbmNoaW5nOiExfSksdGhpcy5faGFuZH1nZXRUYXJnZXRSYXlTcGFjZSgpe3JldHVybiBudWxsPT09dGhpcy5fdGFyZ2V0UmF5JiYodGhpcy5fdGFyZ2V0UmF5PW5ldyBtZHQsdGhpcy5fdGFyZ2V0UmF5Lm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5fdGFyZ2V0UmF5LnZpc2libGU9ITEsdGhpcy5fdGFyZ2V0UmF5Lmhhc0xpbmVhclZlbG9jaXR5PSExLHRoaXMuX3RhcmdldFJheS5saW5lYXJWZWxvY2l0eT1uZXcgY2F0LHRoaXMuX3RhcmdldFJheS5oYXNBbmd1bGFyVmVsb2NpdHk9ITEsdGhpcy5fdGFyZ2V0UmF5LmFuZ3VsYXJWZWxvY2l0eT1uZXcgY2F0KSx0aGlzLl90YXJnZXRSYXl9Z2V0R3JpcFNwYWNlKCl7cmV0dXJuIG51bGw9PT10aGlzLl9ncmlwJiYodGhpcy5fZ3JpcD1uZXcgbWR0LHRoaXMuX2dyaXAubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLl9ncmlwLnZpc2libGU9ITEsdGhpcy5fZ3JpcC5oYXNMaW5lYXJWZWxvY2l0eT0hMSx0aGlzLl9ncmlwLmxpbmVhclZlbG9jaXR5PW5ldyBjYXQsdGhpcy5fZ3JpcC5oYXNBbmd1bGFyVmVsb2NpdHk9ITEsdGhpcy5fZ3JpcC5hbmd1bGFyVmVsb2NpdHk9bmV3IGNhdCksdGhpcy5fZ3JpcH1kaXNwYXRjaEV2ZW50KHQpe3JldHVybiBudWxsIT09dGhpcy5fdGFyZ2V0UmF5JiZ0aGlzLl90YXJnZXRSYXkuZGlzcGF0Y2hFdmVudCh0KSxudWxsIT09dGhpcy5fZ3JpcCYmdGhpcy5fZ3JpcC5kaXNwYXRjaEV2ZW50KHQpLG51bGwhPT10aGlzLl9oYW5kJiZ0aGlzLl9oYW5kLmRpc3BhdGNoRXZlbnQodCksdGhpc31kaXNjb25uZWN0KHQpe3JldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc2Nvbm5lY3RlZCIsZGF0YTp0fSksbnVsbCE9PXRoaXMuX3RhcmdldFJheSYmKHRoaXMuX3RhcmdldFJheS52aXNpYmxlPSExKSxudWxsIT09dGhpcy5fZ3JpcCYmKHRoaXMuX2dyaXAudmlzaWJsZT0hMSksbnVsbCE9PXRoaXMuX2hhbmQmJih0aGlzLl9oYW5kLnZpc2libGU9ITEpLHRoaXN9dXBkYXRlKHQsZSxuKXtsZXQgbz1udWxsLGk9bnVsbCxhPW51bGw7Y29uc3Qgcj10aGlzLl90YXJnZXRSYXkscz10aGlzLl9ncmlwLGw9dGhpcy5faGFuZDtpZih0JiYidmlzaWJsZS1ibHVycmVkIiE9PWUuc2Vzc2lvbi52aXNpYmlsaXR5U3RhdGUpaWYobnVsbCE9PXImJihvPWUuZ2V0UG9zZSh0LnRhcmdldFJheVNwYWNlLG4pLG51bGwhPT1vJiYoci5tYXRyaXguZnJvbUFycmF5KG8udHJhbnNmb3JtLm1hdHJpeCksci5tYXRyaXguZGVjb21wb3NlKHIucG9zaXRpb24sci5yb3RhdGlvbixyLnNjYWxlKSxvLmxpbmVhclZlbG9jaXR5PyhyLmhhc0xpbmVhclZlbG9jaXR5PSEwLHIubGluZWFyVmVsb2NpdHkuY29weShvLmxpbmVhclZlbG9jaXR5KSk6ci5oYXNMaW5lYXJWZWxvY2l0eT0hMSxvLmFuZ3VsYXJWZWxvY2l0eT8oci5oYXNBbmd1bGFyVmVsb2NpdHk9ITAsci5hbmd1bGFyVmVsb2NpdHkuY29weShvLmFuZ3VsYXJWZWxvY2l0eSkpOnIuaGFzQW5ndWxhclZlbG9jaXR5PSExLHRoaXMuZGlzcGF0Y2hFdmVudCh1ZHQpKSksbCYmdC5oYW5kKXthPSEwO2Zvcihjb25zdCBvIG9mIHQuaGFuZC52YWx1ZXMoKSl7Y29uc3QgdD1lLmdldEpvaW50UG9zZShvLG4pO2lmKHZvaWQgMD09PWwuam9pbnRzW28uam9pbnROYW1lXSl7Y29uc3QgdD1uZXcgbWR0O3QubWF0cml4QXV0b1VwZGF0ZT0hMSx0LnZpc2libGU9ITEsbC5qb2ludHNbby5qb2ludE5hbWVdPXQsbC5hZGQodCl9Y29uc3QgaT1sLmpvaW50c1tvLmpvaW50TmFtZV07bnVsbCE9PXQmJihpLm1hdHJpeC5mcm9tQXJyYXkodC50cmFuc2Zvcm0ubWF0cml4KSxpLm1hdHJpeC5kZWNvbXBvc2UoaS5wb3NpdGlvbixpLnJvdGF0aW9uLGkuc2NhbGUpLGkuam9pbnRSYWRpdXM9dC5yYWRpdXMpLGkudmlzaWJsZT1udWxsIT09dH1jb25zdCBvPWwuam9pbnRzWyJpbmRleC1maW5nZXItdGlwIl0ucG9zaXRpb24uZGlzdGFuY2VUbyhsLmpvaW50c1sidGh1bWItdGlwIl0ucG9zaXRpb24pLGk9LjAyLHI9LjAwNTtsLmlucHV0U3RhdGUucGluY2hpbmcmJm8+aStyPyhsLmlucHV0U3RhdGUucGluY2hpbmc9ITEsdGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJwaW5jaGVuZCIsaGFuZGVkbmVzczp0LmhhbmRlZG5lc3MsdGFyZ2V0OnRoaXN9KSk6IWwuaW5wdXRTdGF0ZS5waW5jaGluZyYmbzw9aS1yJiYobC5pbnB1dFN0YXRlLnBpbmNoaW5nPSEwLHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToicGluY2hzdGFydCIsaGFuZGVkbmVzczp0LmhhbmRlZG5lc3MsdGFyZ2V0OnRoaXN9KSl9ZWxzZSBudWxsIT09cyYmdC5ncmlwU3BhY2UmJihpPWUuZ2V0UG9zZSh0LmdyaXBTcGFjZSxuKSxudWxsIT09aSYmKHMubWF0cml4LmZyb21BcnJheShpLnRyYW5zZm9ybS5tYXRyaXgpLHMubWF0cml4LmRlY29tcG9zZShzLnBvc2l0aW9uLHMucm90YXRpb24scy5zY2FsZSksaS5saW5lYXJWZWxvY2l0eT8ocy5oYXNMaW5lYXJWZWxvY2l0eT0hMCxzLmxpbmVhclZlbG9jaXR5LmNvcHkoaS5saW5lYXJWZWxvY2l0eSkpOnMuaGFzTGluZWFyVmVsb2NpdHk9ITEsaS5hbmd1bGFyVmVsb2NpdHk/KHMuaGFzQW5ndWxhclZlbG9jaXR5PSEwLHMuYW5ndWxhclZlbG9jaXR5LmNvcHkoaS5hbmd1bGFyVmVsb2NpdHkpKTpzLmhhc0FuZ3VsYXJWZWxvY2l0eT0hMSkpO3JldHVybiBudWxsIT09ciYmKHIudmlzaWJsZT1udWxsIT09byksbnVsbCE9PXMmJihzLnZpc2libGU9bnVsbCE9PWkpLG51bGwhPT1sJiYobC52aXNpYmxlPW51bGwhPT1hKSx0aGlzfX1jbGFzcyBnZHQgZXh0ZW5kcyBVaXR7Y29uc3RydWN0b3IodCxlKXtzdXBlcigpO2NvbnN0IG49dGhpcyxvPXQuc3RhdGU7bGV0IGk9bnVsbCxhPTEscj1udWxsLHM9ImxvY2FsLWZsb29yIixsPW51bGwsYz1udWxsLGQ9bnVsbCxwPW51bGwsbT1udWxsO2NvbnN0IHU9W10sZj1uZXcgTWFwLGc9bmV3IF9zdDtnLmxheWVycy5lbmFibGUoMSksZy52aWV3cG9ydD1uZXcgYWF0O2NvbnN0IGg9bmV3IF9zdDtoLmxheWVycy5lbmFibGUoMiksaC52aWV3cG9ydD1uZXcgYWF0O2NvbnN0IGI9W2csaF0seT1uZXcgcGR0O3kubGF5ZXJzLmVuYWJsZSgxKSx5LmxheWVycy5lbmFibGUoMik7bGV0IF89bnVsbCxDPW51bGw7ZnVuY3Rpb24gTSh0KXtjb25zdCBlPWYuZ2V0KHQuaW5wdXRTb3VyY2UpO2UmJmUuZGlzcGF0Y2hFdmVudCh7dHlwZTp0LnR5cGUsZGF0YTp0LmlucHV0U291cmNlfSl9ZnVuY3Rpb24gdigpe2YuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt0LmRpc2Nvbm5lY3QoZSl9KSksZi5jbGVhcigpLF89bnVsbCxDPW51bGwsby5iaW5kWFJGcmFtZWJ1ZmZlcihudWxsKSx0LnNldFJlbmRlclRhcmdldCh0LmdldFJlbmRlclRhcmdldCgpKSxTLnN0b3AoKSxuLmlzUHJlc2VudGluZz0hMSxuLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9ZnVuY3Rpb24geCh0KXtjb25zdCBlPWkuaW5wdXRTb3VyY2VzO2ZvcihsZXQgdD0wO3Q8dS5sZW5ndGg7dCsrKWYuc2V0KGVbdF0sdVt0XSk7Zm9yKGxldCBlPTA7ZTx0LnJlbW92ZWQubGVuZ3RoO2UrKyl7Y29uc3Qgbj10LnJlbW92ZWRbZV0sbz1mLmdldChuKTtvJiYoby5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNjb25uZWN0ZWQiLGRhdGE6bn0pLGYuZGVsZXRlKG4pKX1mb3IobGV0IGU9MDtlPHQuYWRkZWQubGVuZ3RoO2UrKyl7Y29uc3Qgbj10LmFkZGVkW2VdLG89Zi5nZXQobik7byYmby5kaXNwYXRjaEV2ZW50KHt0eXBlOiJjb25uZWN0ZWQiLGRhdGE6bn0pfX10aGlzLmNhbWVyYUF1dG9VcGRhdGU9ITAsdGhpcy5lbmFibGVkPSExLHRoaXMuaXNQcmVzZW50aW5nPSExLHRoaXMuZ2V0Q29udHJvbGxlcj1mdW5jdGlvbih0KXtsZXQgZT11W3RdO3JldHVybiB2b2lkIDA9PT1lJiYoZT1uZXcgZmR0LHVbdF09ZSksZS5nZXRUYXJnZXRSYXlTcGFjZSgpfSx0aGlzLmdldENvbnRyb2xsZXJHcmlwPWZ1bmN0aW9uKHQpe2xldCBlPXVbdF07cmV0dXJuIHZvaWQgMD09PWUmJihlPW5ldyBmZHQsdVt0XT1lKSxlLmdldEdyaXBTcGFjZSgpfSx0aGlzLmdldEhhbmQ9ZnVuY3Rpb24odCl7bGV0IGU9dVt0XTtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9bmV3IGZkdCx1W3RdPWUpLGUuZ2V0SGFuZFNwYWNlKCl9LHRoaXMuc2V0RnJhbWVidWZmZXJTY2FsZUZhY3Rvcj1mdW5jdGlvbih0KXthPXQsITA9PT1uLmlzUHJlc2VudGluZyYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IENhbm5vdCBjaGFuZ2UgZnJhbWVidWZmZXIgc2NhbGUgd2hpbGUgcHJlc2VudGluZy4iKX0sdGhpcy5zZXRSZWZlcmVuY2VTcGFjZVR5cGU9ZnVuY3Rpb24odCl7cz10LCEwPT09bi5pc1ByZXNlbnRpbmcmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViWFJNYW5hZ2VyOiBDYW5ub3QgY2hhbmdlIHJlZmVyZW5jZSBzcGFjZSB0eXBlIHdoaWxlIHByZXNlbnRpbmcuIil9LHRoaXMuZ2V0UmVmZXJlbmNlU3BhY2U9ZnVuY3Rpb24oKXtyZXR1cm4gcn0sdGhpcy5nZXRTZXNzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGl9LHRoaXMuc2V0U2Vzc2lvbj1hc3luYyBmdW5jdGlvbih0KXtpZihpPXQsbnVsbCE9PWkpe2kuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0IixNKSxpLmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdHN0YXJ0IixNKSxpLmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGVuZCIsTSksaS5hZGRFdmVudExpc3RlbmVyKCJzcXVlZXplIixNKSxpLmFkZEV2ZW50TGlzdGVuZXIoInNxdWVlemVzdGFydCIsTSksaS5hZGRFdmVudExpc3RlbmVyKCJzcXVlZXplZW5kIixNKSxpLmFkZEV2ZW50TGlzdGVuZXIoImVuZCIsdiksaS5hZGRFdmVudExpc3RlbmVyKCJpbnB1dHNvdXJjZXNjaGFuZ2UiLHgpO2NvbnN0IHQ9ZS5nZXRDb250ZXh0QXR0cmlidXRlcygpO2lmKCEwIT09dC54ckNvbXBhdGlibGUmJmF3YWl0IGUubWFrZVhSQ29tcGF0aWJsZSgpLHZvaWQgMD09PWkucmVuZGVyU3RhdGUubGF5ZXJzKW09bmV3IFhSV2ViR0xMYXllcihpLGUse2FudGlhbGlhczp0LmFudGlhbGlhcyxhbHBoYTp0LmFscGhhLGRlcHRoOnQuZGVwdGgsc3RlbmNpbDp0LnN0ZW5jaWwsZnJhbWVidWZmZXJTY2FsZUZhY3RvcjphfSksaS51cGRhdGVSZW5kZXJTdGF0ZSh7YmFzZUxheWVyOm19KTtlbHNle2xldCBuPTA7aWYodC5hbnRpYWxpYXMpbT1uZXcgWFJXZWJHTExheWVyKGksZSx7YW50aWFsaWFzOiEwLGFscGhhOnQuYWxwaGEsZGVwdGg6dC5kZXB0aCxzdGVuY2lsOnQuc3RlbmNpbCxmcmFtZWJ1ZmZlclNjYWxlRmFjdG9yOmF9KSxpLnVwZGF0ZVJlbmRlclN0YXRlKHtsYXllcnM6W21dfSk7ZWxzZXt0LmRlcHRoJiYobj10LnN0ZW5jaWw/MzQwNDE6NjQwMik7Y29uc3Qgbz17Y29sb3JGb3JtYXQ6dC5hbHBoYT82NDA4OjY0MDcsZGVwdGhGb3JtYXQ6bixzY2FsZUZhY3RvcjphfTtjPW5ldyBYUldlYkdMQmluZGluZyhpLGUpLHA9Yy5jcmVhdGVQcm9qZWN0aW9uTGF5ZXIobyksZD1lLmNyZWF0ZUZyYW1lYnVmZmVyKCksaS51cGRhdGVSZW5kZXJTdGF0ZSh7bGF5ZXJzOltwXX0pfX1yPWF3YWl0IGkucmVxdWVzdFJlZmVyZW5jZVNwYWNlKHMpLFMuc2V0Q29udGV4dChpKSxTLnN0YXJ0KCksbi5pc1ByZXNlbnRpbmc9ITAsbi5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZXNzaW9uc3RhcnQifSl9fTtjb25zdCBPPW5ldyBjYXQsUD1uZXcgY2F0O2Z1bmN0aW9uIHcodCxlKXtudWxsPT09ZT90Lm1hdHJpeFdvcmxkLmNvcHkodC5tYXRyaXgpOnQubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyhlLm1hdHJpeFdvcmxkLHQubWF0cml4KSx0Lm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KHQubWF0cml4V29ybGQpLmludmVydCgpfXRoaXMudXBkYXRlQ2FtZXJhPWZ1bmN0aW9uKHQpe2lmKG51bGw9PT1pKXJldHVybjt5Lm5lYXI9aC5uZWFyPWcubmVhcj10Lm5lYXIseS5mYXI9aC5mYXI9Zy5mYXI9dC5mYXIsXz09PXkubmVhciYmQz09PXkuZmFyfHwoaS51cGRhdGVSZW5kZXJTdGF0ZSh7ZGVwdGhOZWFyOnkubmVhcixkZXB0aEZhcjp5LmZhcn0pLF89eS5uZWFyLEM9eS5mYXIpO2NvbnN0IGU9dC5wYXJlbnQsbj15LmNhbWVyYXM7dyh5LGUpO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKXcoblt0XSxlKTt5Lm1hdHJpeFdvcmxkLmRlY29tcG9zZSh5LnBvc2l0aW9uLHkucXVhdGVybmlvbix5LnNjYWxlKSx0LnBvc2l0aW9uLmNvcHkoeS5wb3NpdGlvbiksdC5xdWF0ZXJuaW9uLmNvcHkoeS5xdWF0ZXJuaW9uKSx0LnNjYWxlLmNvcHkoeS5zY2FsZSksdC5tYXRyaXguY29weSh5Lm1hdHJpeCksdC5tYXRyaXhXb3JsZC5jb3B5KHkubWF0cml4V29ybGQpO2NvbnN0IG89dC5jaGlsZHJlbjtmb3IobGV0IHQ9MCxlPW8ubGVuZ3RoO3Q8ZTt0Kyspb1t0XS51cGRhdGVNYXRyaXhXb3JsZCghMCk7Mj09PW4ubGVuZ3RoPyhmdW5jdGlvbiBhKHQsZSxuKXtPLnNldEZyb21NYXRyaXhQb3NpdGlvbihlLm1hdHJpeFdvcmxkKSxQLnNldEZyb21NYXRyaXhQb3NpdGlvbihuLm1hdHJpeFdvcmxkKTtjb25zdCBvPU8uZGlzdGFuY2VUbyhQKSxpPWUucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50cyxhPW4ucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50cyxyPWlbMTRdLyhpWzEwXS0xKSxzPWlbMTRdLyhpWzEwXSsxKSxsPShpWzldKzEpL2lbNV0sYz0oaVs5XS0xKS9pWzVdLGQ9KGlbOF0tMSkvaVswXSxwPShhWzhdKzEpL2FbMF0sbT1yKmQsdT1yKnAsZj1vLygtZCtwKSxnPWYqLWQ7ZS5tYXRyaXhXb3JsZC5kZWNvbXBvc2UodC5wb3NpdGlvbix0LnF1YXRlcm5pb24sdC5zY2FsZSksdC50cmFuc2xhdGVYKGcpLHQudHJhbnNsYXRlWihmKSx0Lm1hdHJpeFdvcmxkLmNvbXBvc2UodC5wb3NpdGlvbix0LnF1YXRlcm5pb24sdC5zY2FsZSksdC5tYXRyaXhXb3JsZEludmVyc2UuY29weSh0Lm1hdHJpeFdvcmxkKS5pbnZlcnQoKTtjb25zdCBoPXIrZixiPXMrZjt0LnByb2plY3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKG0tZyx1KyhvLWcpLGwqcy9iKmgsYypzL2IqaCxoLGIpfSkoeSxnLGgpOnkucHJvamVjdGlvbk1hdHJpeC5jb3B5KGcucHJvamVjdGlvbk1hdHJpeCl9LHRoaXMuZ2V0Q2FtZXJhPWZ1bmN0aW9uKCl7cmV0dXJuIHl9LHRoaXMuZ2V0Rm92ZWF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT1wP3AuZml4ZWRGb3ZlYXRpb246bnVsbCE9PW0/bS5maXhlZEZvdmVhdGlvbjp2b2lkIDB9LHRoaXMuc2V0Rm92ZWF0aW9uPWZ1bmN0aW9uKHQpe251bGwhPT1wJiYocC5maXhlZEZvdmVhdGlvbj10KSxudWxsIT09bSYmdm9pZCAwIT09bS5maXhlZEZvdmVhdGlvbiYmKG0uZml4ZWRGb3ZlYXRpb249dCl9O2xldCBrPW51bGw7Y29uc3QgUz1uZXcgUnN0O1Muc2V0QW5pbWF0aW9uTG9vcCgoZnVuY3Rpb24gRCh0LG4pe2lmKGw9bi5nZXRWaWV3ZXJQb3NlKHIpLG51bGwhPT1sKXtjb25zdCB0PWwudmlld3M7bnVsbCE9PW0mJm8uYmluZFhSRnJhbWVidWZmZXIobS5mcmFtZWJ1ZmZlcik7bGV0IG49ITE7dC5sZW5ndGghPT15LmNhbWVyYXMubGVuZ3RoJiYoeS5jYW1lcmFzLmxlbmd0aD0wLG49ITApO2ZvcihsZXQgaT0wO2k8dC5sZW5ndGg7aSsrKXtjb25zdCBhPXRbaV07bGV0IHI9bnVsbDtpZihudWxsIT09bSlyPW0uZ2V0Vmlld3BvcnQoYSk7ZWxzZXtjb25zdCB0PWMuZ2V0Vmlld1N1YkltYWdlKHAsYSk7by5iaW5kWFJGcmFtZWJ1ZmZlcihkKSx2b2lkIDAhPT10LmRlcHRoU3RlbmNpbFRleHR1cmUmJmUuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsMzYwOTYsMzU1Myx0LmRlcHRoU3RlbmNpbFRleHR1cmUsMCksZS5mcmFtZWJ1ZmZlclRleHR1cmUyRCgzNjE2MCwzNjA2NCwzNTUzLHQuY29sb3JUZXh0dXJlLDApLHI9dC52aWV3cG9ydH1jb25zdCBzPWJbaV07cy5tYXRyaXguZnJvbUFycmF5KGEudHJhbnNmb3JtLm1hdHJpeCkscy5wcm9qZWN0aW9uTWF0cml4LmZyb21BcnJheShhLnByb2plY3Rpb25NYXRyaXgpLHMudmlld3BvcnQuc2V0KHIueCxyLnksci53aWR0aCxyLmhlaWdodCksMD09PWkmJnkubWF0cml4LmNvcHkocy5tYXRyaXgpLCEwPT09biYmeS5jYW1lcmFzLnB1c2gocyl9fWNvbnN0IGE9aS5pbnB1dFNvdXJjZXM7Zm9yKGxldCB0PTA7dDx1Lmxlbmd0aDt0KyspdVt0XS51cGRhdGUoYVt0XSxuLHIpO2smJmsodCxuKX0pKSx0aGlzLnNldEFuaW1hdGlvbkxvb3A9ZnVuY3Rpb24odCl7az10fSx0aGlzLmRpc3Bvc2U9ZnVuY3Rpb24oKXt9fX1mdW5jdGlvbiBoZHQodCl7ZnVuY3Rpb24gZShlLG4pe2Uub3BhY2l0eS52YWx1ZT1uLm9wYWNpdHksbi5jb2xvciYmZS5kaWZmdXNlLnZhbHVlLmNvcHkobi5jb2xvciksbi5lbWlzc2l2ZSYmZS5lbWlzc2l2ZS52YWx1ZS5jb3B5KG4uZW1pc3NpdmUpLm11bHRpcGx5U2NhbGFyKG4uZW1pc3NpdmVJbnRlbnNpdHkpLG4ubWFwJiYoZS5tYXAudmFsdWU9bi5tYXApLG4uYWxwaGFNYXAmJihlLmFscGhhTWFwLnZhbHVlPW4uYWxwaGFNYXApLG4uc3BlY3VsYXJNYXAmJihlLnNwZWN1bGFyTWFwLnZhbHVlPW4uc3BlY3VsYXJNYXApO2NvbnN0IG89dC5nZXQobikuZW52TWFwO2lmKG8pe2UuZW52TWFwLnZhbHVlPW8sZS5mbGlwRW52TWFwLnZhbHVlPW8uaXNDdWJlVGV4dHVyZSYmITE9PT1vLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT8tMToxLGUucmVmbGVjdGl2aXR5LnZhbHVlPW4ucmVmbGVjdGl2aXR5LGUucmVmcmFjdGlvblJhdGlvLnZhbHVlPW4ucmVmcmFjdGlvblJhdGlvO2NvbnN0IGk9dC5nZXQobykuX19tYXhNaXBMZXZlbDt2b2lkIDAhPT1pJiYoZS5tYXhNaXBMZXZlbC52YWx1ZT1pKX1sZXQgaSxhO24ubGlnaHRNYXAmJihlLmxpZ2h0TWFwLnZhbHVlPW4ubGlnaHRNYXAsZS5saWdodE1hcEludGVuc2l0eS52YWx1ZT1uLmxpZ2h0TWFwSW50ZW5zaXR5KSxuLmFvTWFwJiYoZS5hb01hcC52YWx1ZT1uLmFvTWFwLGUuYW9NYXBJbnRlbnNpdHkudmFsdWU9bi5hb01hcEludGVuc2l0eSksbi5tYXA/aT1uLm1hcDpuLnNwZWN1bGFyTWFwP2k9bi5zcGVjdWxhck1hcDpuLmRpc3BsYWNlbWVudE1hcD9pPW4uZGlzcGxhY2VtZW50TWFwOm4ubm9ybWFsTWFwP2k9bi5ub3JtYWxNYXA6bi5idW1wTWFwP2k9bi5idW1wTWFwOm4ucm91Z2huZXNzTWFwP2k9bi5yb3VnaG5lc3NNYXA6bi5tZXRhbG5lc3NNYXA/aT1uLm1ldGFsbmVzc01hcDpuLmFscGhhTWFwP2k9bi5hbHBoYU1hcDpuLmVtaXNzaXZlTWFwP2k9bi5lbWlzc2l2ZU1hcDpuLmNsZWFyY29hdE1hcD9pPW4uY2xlYXJjb2F0TWFwOm4uY2xlYXJjb2F0Tm9ybWFsTWFwP2k9bi5jbGVhcmNvYXROb3JtYWxNYXA6bi5jbGVhcmNvYXRSb3VnaG5lc3NNYXA/aT1uLmNsZWFyY29hdFJvdWdobmVzc01hcDpuLnNwZWN1bGFySW50ZW5zaXR5TWFwP2k9bi5zcGVjdWxhckludGVuc2l0eU1hcDpuLnNwZWN1bGFyVGludE1hcCYmKGk9bi5zcGVjdWxhclRpbnRNYXApLHZvaWQgMCE9PWkmJihpLmlzV2ViR0xSZW5kZXJUYXJnZXQmJihpPWkudGV4dHVyZSksITA9PT1pLm1hdHJpeEF1dG9VcGRhdGUmJmkudXBkYXRlTWF0cml4KCksZS51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KGkubWF0cml4KSksbi5hb01hcD9hPW4uYW9NYXA6bi5saWdodE1hcCYmKGE9bi5saWdodE1hcCksdm9pZCAwIT09YSYmKGEuaXNXZWJHTFJlbmRlclRhcmdldCYmKGE9YS50ZXh0dXJlKSwhMD09PWEubWF0cml4QXV0b1VwZGF0ZSYmYS51cGRhdGVNYXRyaXgoKSxlLnV2MlRyYW5zZm9ybS52YWx1ZS5jb3B5KGEubWF0cml4KSl9ZnVuY3Rpb24gbihlLG4pe2Uucm91Z2huZXNzLnZhbHVlPW4ucm91Z2huZXNzLGUubWV0YWxuZXNzLnZhbHVlPW4ubWV0YWxuZXNzLG4ucm91Z2huZXNzTWFwJiYoZS5yb3VnaG5lc3NNYXAudmFsdWU9bi5yb3VnaG5lc3NNYXApLG4ubWV0YWxuZXNzTWFwJiYoZS5tZXRhbG5lc3NNYXAudmFsdWU9bi5tZXRhbG5lc3NNYXApLG4uZW1pc3NpdmVNYXAmJihlLmVtaXNzaXZlTWFwLnZhbHVlPW4uZW1pc3NpdmVNYXApLG4uYnVtcE1hcCYmKGUuYnVtcE1hcC52YWx1ZT1uLmJ1bXBNYXAsZS5idW1wU2NhbGUudmFsdWU9bi5idW1wU2NhbGUsMT09PW4uc2lkZSYmKGUuYnVtcFNjYWxlLnZhbHVlKj0tMSkpLG4ubm9ybWFsTWFwJiYoZS5ub3JtYWxNYXAudmFsdWU9bi5ub3JtYWxNYXAsZS5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KG4ubm9ybWFsU2NhbGUpLDE9PT1uLnNpZGUmJmUubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpLG4uZGlzcGxhY2VtZW50TWFwJiYoZS5kaXNwbGFjZW1lbnRNYXAudmFsdWU9bi5kaXNwbGFjZW1lbnRNYXAsZS5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1uLmRpc3BsYWNlbWVudFNjYWxlLGUuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1uLmRpc3BsYWNlbWVudEJpYXMpLHQuZ2V0KG4pLmVudk1hcCYmKGUuZW52TWFwSW50ZW5zaXR5LnZhbHVlPW4uZW52TWFwSW50ZW5zaXR5KX1yZXR1cm57cmVmcmVzaEZvZ1VuaWZvcm1zOmZ1bmN0aW9uIG8odCxlKXt0LmZvZ0NvbG9yLnZhbHVlLmNvcHkoZS5jb2xvciksZS5pc0ZvZz8odC5mb2dOZWFyLnZhbHVlPWUubmVhcix0LmZvZ0Zhci52YWx1ZT1lLmZhcik6ZS5pc0ZvZ0V4cDImJih0LmZvZ0RlbnNpdHkudmFsdWU9ZS5kZW5zaXR5KX0scmVmcmVzaE1hdGVyaWFsVW5pZm9ybXM6ZnVuY3Rpb24gaSh0LG8sYSxyLHMpe28uaXNNZXNoQmFzaWNNYXRlcmlhbD9lKHQsbyk6by5pc01lc2hMYW1iZXJ0TWF0ZXJpYWw/KGUodCxvKSwoZnVuY3Rpb24gbCh0LGUpe2UuZW1pc3NpdmVNYXAmJih0LmVtaXNzaXZlTWFwLnZhbHVlPWUuZW1pc3NpdmVNYXApfSkodCxvKSk6by5pc01lc2hUb29uTWF0ZXJpYWw/KGUodCxvKSwoZnVuY3Rpb24gYyh0LGUpe2UuZ3JhZGllbnRNYXAmJih0LmdyYWRpZW50TWFwLnZhbHVlPWUuZ3JhZGllbnRNYXApLGUuZW1pc3NpdmVNYXAmJih0LmVtaXNzaXZlTWFwLnZhbHVlPWUuZW1pc3NpdmVNYXApLGUuYnVtcE1hcCYmKHQuYnVtcE1hcC52YWx1ZT1lLmJ1bXBNYXAsdC5idW1wU2NhbGUudmFsdWU9ZS5idW1wU2NhbGUsMT09PWUuc2lkZSYmKHQuYnVtcFNjYWxlLnZhbHVlKj0tMSkpLGUubm9ybWFsTWFwJiYodC5ub3JtYWxNYXAudmFsdWU9ZS5ub3JtYWxNYXAsdC5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KGUubm9ybWFsU2NhbGUpLDE9PT1lLnNpZGUmJnQubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpLGUuZGlzcGxhY2VtZW50TWFwJiYodC5kaXNwbGFjZW1lbnRNYXAudmFsdWU9ZS5kaXNwbGFjZW1lbnRNYXAsdC5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1lLmRpc3BsYWNlbWVudFNjYWxlLHQuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1lLmRpc3BsYWNlbWVudEJpYXMpfSkodCxvKSk6by5pc01lc2hQaG9uZ01hdGVyaWFsPyhlKHQsbyksKGZ1bmN0aW9uIGQodCxlKXt0LnNwZWN1bGFyLnZhbHVlLmNvcHkoZS5zcGVjdWxhciksdC5zaGluaW5lc3MudmFsdWU9TWF0aC5tYXgoZS5zaGluaW5lc3MsMWUtNCksZS5lbWlzc2l2ZU1hcCYmKHQuZW1pc3NpdmVNYXAudmFsdWU9ZS5lbWlzc2l2ZU1hcCksZS5idW1wTWFwJiYodC5idW1wTWFwLnZhbHVlPWUuYnVtcE1hcCx0LmJ1bXBTY2FsZS52YWx1ZT1lLmJ1bXBTY2FsZSwxPT09ZS5zaWRlJiYodC5idW1wU2NhbGUudmFsdWUqPS0xKSksZS5ub3JtYWxNYXAmJih0Lm5vcm1hbE1hcC52YWx1ZT1lLm5vcm1hbE1hcCx0Lm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoZS5ub3JtYWxTY2FsZSksMT09PWUuc2lkZSYmdC5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKSksZS5kaXNwbGFjZW1lbnRNYXAmJih0LmRpc3BsYWNlbWVudE1hcC52YWx1ZT1lLmRpc3BsYWNlbWVudE1hcCx0LmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWUuZGlzcGxhY2VtZW50U2NhbGUsdC5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPWUuZGlzcGxhY2VtZW50Qmlhcyl9KSh0LG8pKTpvLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw/KGUodCxvKSxvLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWw/KGZ1bmN0aW9uIHAodCxlLG8pe24odCxlKSx0LnJlZmxlY3Rpdml0eS52YWx1ZT1lLnJlZmxlY3Rpdml0eSx0LmNsZWFyY29hdC52YWx1ZT1lLmNsZWFyY29hdCx0LmNsZWFyY29hdFJvdWdobmVzcy52YWx1ZT1lLmNsZWFyY29hdFJvdWdobmVzcyxlLnNoZWVuJiZ0LnNoZWVuLnZhbHVlLmNvcHkoZS5zaGVlbiksZS5jbGVhcmNvYXRNYXAmJih0LmNsZWFyY29hdE1hcC52YWx1ZT1lLmNsZWFyY29hdE1hcCksZS5jbGVhcmNvYXRSb3VnaG5lc3NNYXAmJih0LmNsZWFyY29hdFJvdWdobmVzc01hcC52YWx1ZT1lLmNsZWFyY29hdFJvdWdobmVzc01hcCksZS5jbGVhcmNvYXROb3JtYWxNYXAmJih0LmNsZWFyY29hdE5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoZS5jbGVhcmNvYXROb3JtYWxTY2FsZSksdC5jbGVhcmNvYXROb3JtYWxNYXAudmFsdWU9ZS5jbGVhcmNvYXROb3JtYWxNYXAsMT09PWUuc2lkZSYmdC5jbGVhcmNvYXROb3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKSksdC50cmFuc21pc3Npb24udmFsdWU9ZS50cmFuc21pc3Npb24sZS50cmFuc21pc3Npb25NYXAmJih0LnRyYW5zbWlzc2lvbk1hcC52YWx1ZT1lLnRyYW5zbWlzc2lvbk1hcCksZS50cmFuc21pc3Npb24+MCYmKHQudHJhbnNtaXNzaW9uU2FtcGxlck1hcC52YWx1ZT1vLnRleHR1cmUsdC50cmFuc21pc3Npb25TYW1wbGVyU2l6ZS52YWx1ZS5zZXQoby53aWR0aCxvLmhlaWdodCkpLHQudGhpY2tuZXNzLnZhbHVlPWUudGhpY2tuZXNzLGUudGhpY2tuZXNzTWFwJiYodC50aGlja25lc3NNYXAudmFsdWU9ZS50aGlja25lc3NNYXApLHQuYXR0ZW51YXRpb25EaXN0YW5jZS52YWx1ZT1lLmF0dGVudWF0aW9uRGlzdGFuY2UsdC5hdHRlbnVhdGlvblRpbnQudmFsdWUuY29weShlLmF0dGVudWF0aW9uVGludCksdC5zcGVjdWxhckludGVuc2l0eS52YWx1ZT1lLnNwZWN1bGFySW50ZW5zaXR5LHQuc3BlY3VsYXJUaW50LnZhbHVlLmNvcHkoZS5zcGVjdWxhclRpbnQpLGUuc3BlY3VsYXJJbnRlbnNpdHlNYXAmJih0LnNwZWN1bGFySW50ZW5zaXR5TWFwLnZhbHVlPWUuc3BlY3VsYXJJbnRlbnNpdHlNYXApLGUuc3BlY3VsYXJUaW50TWFwJiYodC5zcGVjdWxhclRpbnRNYXAudmFsdWU9ZS5zcGVjdWxhclRpbnRNYXApfSkodCxvLHMpOm4odCxvKSk6by5pc01lc2hNYXRjYXBNYXRlcmlhbD8oZSh0LG8pLChmdW5jdGlvbiBtKHQsZSl7ZS5tYXRjYXAmJih0Lm1hdGNhcC52YWx1ZT1lLm1hdGNhcCksZS5idW1wTWFwJiYodC5idW1wTWFwLnZhbHVlPWUuYnVtcE1hcCx0LmJ1bXBTY2FsZS52YWx1ZT1lLmJ1bXBTY2FsZSwxPT09ZS5zaWRlJiYodC5idW1wU2NhbGUudmFsdWUqPS0xKSksZS5ub3JtYWxNYXAmJih0Lm5vcm1hbE1hcC52YWx1ZT1lLm5vcm1hbE1hcCx0Lm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoZS5ub3JtYWxTY2FsZSksMT09PWUuc2lkZSYmdC5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKSksZS5kaXNwbGFjZW1lbnRNYXAmJih0LmRpc3BsYWNlbWVudE1hcC52YWx1ZT1lLmRpc3BsYWNlbWVudE1hcCx0LmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWUuZGlzcGxhY2VtZW50U2NhbGUsdC5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPWUuZGlzcGxhY2VtZW50Qmlhcyl9KSh0LG8pKTpvLmlzTWVzaERlcHRoTWF0ZXJpYWw/KGUodCxvKSwoZnVuY3Rpb24gdSh0LGUpe2UuZGlzcGxhY2VtZW50TWFwJiYodC5kaXNwbGFjZW1lbnRNYXAudmFsdWU9ZS5kaXNwbGFjZW1lbnRNYXAsdC5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1lLmRpc3BsYWNlbWVudFNjYWxlLHQuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1lLmRpc3BsYWNlbWVudEJpYXMpfSkodCxvKSk6by5pc01lc2hEaXN0YW5jZU1hdGVyaWFsPyhlKHQsbyksKGZ1bmN0aW9uIGYodCxlKXtlLmRpc3BsYWNlbWVudE1hcCYmKHQuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWUuZGlzcGxhY2VtZW50TWFwLHQuZGlzcGxhY2VtZW50U2NhbGUudmFsdWU9ZS5kaXNwbGFjZW1lbnRTY2FsZSx0LmRpc3BsYWNlbWVudEJpYXMudmFsdWU9ZS5kaXNwbGFjZW1lbnRCaWFzKSx0LnJlZmVyZW5jZVBvc2l0aW9uLnZhbHVlLmNvcHkoZS5yZWZlcmVuY2VQb3NpdGlvbiksdC5uZWFyRGlzdGFuY2UudmFsdWU9ZS5uZWFyRGlzdGFuY2UsdC5mYXJEaXN0YW5jZS52YWx1ZT1lLmZhckRpc3RhbmNlfSkodCxvKSk6by5pc01lc2hOb3JtYWxNYXRlcmlhbD8oZSh0LG8pLChmdW5jdGlvbiBnKHQsZSl7ZS5idW1wTWFwJiYodC5idW1wTWFwLnZhbHVlPWUuYnVtcE1hcCx0LmJ1bXBTY2FsZS52YWx1ZT1lLmJ1bXBTY2FsZSwxPT09ZS5zaWRlJiYodC5idW1wU2NhbGUudmFsdWUqPS0xKSksZS5ub3JtYWxNYXAmJih0Lm5vcm1hbE1hcC52YWx1ZT1lLm5vcm1hbE1hcCx0Lm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoZS5ub3JtYWxTY2FsZSksMT09PWUuc2lkZSYmdC5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKSksZS5kaXNwbGFjZW1lbnRNYXAmJih0LmRpc3BsYWNlbWVudE1hcC52YWx1ZT1lLmRpc3BsYWNlbWVudE1hcCx0LmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWUuZGlzcGxhY2VtZW50U2NhbGUsdC5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPWUuZGlzcGxhY2VtZW50Qmlhcyl9KSh0LG8pKTpvLmlzTGluZUJhc2ljTWF0ZXJpYWw/KChmdW5jdGlvbiBoKHQsZSl7dC5kaWZmdXNlLnZhbHVlLmNvcHkoZS5jb2xvciksdC5vcGFjaXR5LnZhbHVlPWUub3BhY2l0eX0pKHQsbyksby5pc0xpbmVEYXNoZWRNYXRlcmlhbCYmKGZ1bmN0aW9uIGIodCxlKXt0LmRhc2hTaXplLnZhbHVlPWUuZGFzaFNpemUsdC50b3RhbFNpemUudmFsdWU9ZS5kYXNoU2l6ZStlLmdhcFNpemUsdC5zY2FsZS52YWx1ZT1lLnNjYWxlfSkodCxvKSk6by5pc1BvaW50c01hdGVyaWFsPyhmdW5jdGlvbiB5KHQsZSxuLG8pe2xldCBpO3QuZGlmZnVzZS52YWx1ZS5jb3B5KGUuY29sb3IpLHQub3BhY2l0eS52YWx1ZT1lLm9wYWNpdHksdC5zaXplLnZhbHVlPWUuc2l6ZSpuLHQuc2NhbGUudmFsdWU9LjUqbyxlLm1hcCYmKHQubWFwLnZhbHVlPWUubWFwKSxlLmFscGhhTWFwJiYodC5hbHBoYU1hcC52YWx1ZT1lLmFscGhhTWFwKSxlLm1hcD9pPWUubWFwOmUuYWxwaGFNYXAmJihpPWUuYWxwaGFNYXApLHZvaWQgMCE9PWkmJighMD09PWkubWF0cml4QXV0b1VwZGF0ZSYmaS51cGRhdGVNYXRyaXgoKSx0LnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoaS5tYXRyaXgpKX0pKHQsbyxhLHIpOm8uaXNTcHJpdGVNYXRlcmlhbD8oZnVuY3Rpb24gXyh0LGUpe2xldCBuO3QuZGlmZnVzZS52YWx1ZS5jb3B5KGUuY29sb3IpLHQub3BhY2l0eS52YWx1ZT1lLm9wYWNpdHksdC5yb3RhdGlvbi52YWx1ZT1lLnJvdGF0aW9uLGUubWFwJiYodC5tYXAudmFsdWU9ZS5tYXApLGUuYWxwaGFNYXAmJih0LmFscGhhTWFwLnZhbHVlPWUuYWxwaGFNYXApLGUubWFwP249ZS5tYXA6ZS5hbHBoYU1hcCYmKG49ZS5hbHBoYU1hcCksdm9pZCAwIT09biYmKCEwPT09bi5tYXRyaXhBdXRvVXBkYXRlJiZuLnVwZGF0ZU1hdHJpeCgpLHQudXZUcmFuc2Zvcm0udmFsdWUuY29weShuLm1hdHJpeCkpfSkodCxvKTpvLmlzU2hhZG93TWF0ZXJpYWw/KHQuY29sb3IudmFsdWUuY29weShvLmNvbG9yKSx0Lm9wYWNpdHkudmFsdWU9by5vcGFjaXR5KTpvLmlzU2hhZGVyTWF0ZXJpYWwmJihvLnVuaWZvcm1zTmVlZFVwZGF0ZT0hMSl9fX1mdW5jdGlvbiBiZHQodD17fSl7Y29uc3QgZT12b2lkIDAhPT10LmNhbnZhcz90LmNhbnZhczooZnVuY3Rpb24gbigpe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiY2FudmFzIik7cmV0dXJuIHQuc3R5bGUuZGlzcGxheT0iYmxvY2siLHR9KSgpLG89dm9pZCAwIT09dC5jb250ZXh0P3QuY29udGV4dDpudWxsLGk9dm9pZCAwIT09dC5hbHBoYSYmdC5hbHBoYSxhPXZvaWQgMD09PXQuZGVwdGh8fHQuZGVwdGgscj12b2lkIDA9PT10LnN0ZW5jaWx8fHQuc3RlbmNpbCxzPXZvaWQgMCE9PXQuYW50aWFsaWFzJiZ0LmFudGlhbGlhcyxsPXZvaWQgMD09PXQucHJlbXVsdGlwbGllZEFscGhhfHx0LnByZW11bHRpcGxpZWRBbHBoYSxjPXZvaWQgMCE9PXQucHJlc2VydmVEcmF3aW5nQnVmZmVyJiZ0LnByZXNlcnZlRHJhd2luZ0J1ZmZlcixkPXZvaWQgMCE9PXQucG93ZXJQcmVmZXJlbmNlP3QucG93ZXJQcmVmZXJlbmNlOiJkZWZhdWx0IixwPXZvaWQgMCE9PXQuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCYmdC5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0O2xldCBtPW51bGwsdT1udWxsO2NvbnN0IGY9W10sZz1bXTt0aGlzLmRvbUVsZW1lbnQ9ZSx0aGlzLmRlYnVnPXtjaGVja1NoYWRlckVycm9yczohMH0sdGhpcy5hdXRvQ2xlYXI9ITAsdGhpcy5hdXRvQ2xlYXJDb2xvcj0hMCx0aGlzLmF1dG9DbGVhckRlcHRoPSEwLHRoaXMuYXV0b0NsZWFyU3RlbmNpbD0hMCx0aGlzLnNvcnRPYmplY3RzPSEwLHRoaXMuY2xpcHBpbmdQbGFuZXM9W10sdGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZD0hMSx0aGlzLmdhbW1hRmFjdG9yPTIsdGhpcy5vdXRwdXRFbmNvZGluZz16aXQsdGhpcy5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cz0hMSx0aGlzLnRvbmVNYXBwaW5nPTAsdGhpcy50b25lTWFwcGluZ0V4cG9zdXJlPTE7Y29uc3QgaD10aGlzO2xldCBiPSExLHk9MCxfPTAsQz1udWxsLE09LTEsdj1udWxsO2NvbnN0IHg9bmV3IGFhdCxPPW5ldyBhYXQ7bGV0IFA9bnVsbCx3PWUud2lkdGgsaz1lLmhlaWdodCxTPTEsRD1udWxsLEU9bnVsbDtjb25zdCBSPW5ldyBhYXQoMCwwLHcsayksQT1uZXcgYWF0KDAsMCx3LGspO2xldCBUPSExO2NvbnN0IE49W10sej1uZXcgRXN0O2xldCBJPSExLEg9ITEsRj1udWxsO2NvbnN0IEw9bmV3IEJhdCxCPW5ldyBjYXQsVj17YmFja2dyb3VuZDpudWxsLGZvZzpudWxsLGVudmlyb25tZW50Om51bGwsb3ZlcnJpZGVNYXRlcmlhbDpudWxsLGlzU2NlbmU6ITB9O2Z1bmN0aW9uIGooKXtyZXR1cm4gbnVsbD09PUM/UzoxfWxldCBVLEcsVyxZLHEsWixYLEssSixRLCQsdHQsZXQsbnQsb3QsaXQsYXQscnQsc3QsbHQsY3QsZHQscHQsbXQ9bztmdW5jdGlvbiB1dCh0LG4pe2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtjb25zdCBpPWUuZ2V0Q29udGV4dCh0W29dLG4pO2lmKG51bGwhPT1pKXJldHVybiBpfXJldHVybiBudWxsfXRyeXtjb25zdCB0PXthbHBoYTppLGRlcHRoOmEsc3RlbmNpbDpyLGFudGlhbGlhczpzLHByZW11bHRpcGxpZWRBbHBoYTpsLHByZXNlcnZlRHJhd2luZ0J1ZmZlcjpjLHBvd2VyUHJlZmVyZW5jZTpkLGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6cH07aWYoZS5hZGRFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRsb3N0IixodCwhMSksZS5hZGRFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRyZXN0b3JlZCIsYnQsITEpLG51bGw9PT1tdCl7Y29uc3QgZT1bIndlYmdsMiIsIndlYmdsIiwiZXhwZXJpbWVudGFsLXdlYmdsIl07aWYoITA9PT1oLmlzV2ViR0wxUmVuZGVyZXImJmUuc2hpZnQoKSxtdD11dChlLHQpLG51bGw9PT1tdCl0aHJvdyB1dChlKT9uZXcgRXJyb3IoIkVycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQgd2l0aCB5b3VyIHNlbGVjdGVkIGF0dHJpYnV0ZXMuIik6bmV3IEVycm9yKCJFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0LiIpfXZvaWQgMD09PW10LmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCYmKG10LmdldFNoYWRlclByZWNpc2lvbkZvcm1hdD1mdW5jdGlvbigpe3JldHVybntyYW5nZU1pbjoxLHJhbmdlTWF4OjEscHJlY2lzaW9uOjF9fSl9Y2F0Y2godCl7dGhyb3cgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlcjogIit0Lm1lc3NhZ2UpLHR9ZnVuY3Rpb24gZnQoKXtVPW5ldyBnbHQobXQpLEc9bmV3IEJzdChtdCxVLHQpLFUuaW5pdChHKSxkdD1uZXcgZGR0KG10LFUsRyksVz1uZXcgbGR0KG10LFUsRyksTlswXT0xMDI5LFk9bmV3IHlsdChtdCkscT1uZXcgWmN0LFo9bmV3IGNkdChtdCxVLFcscSxHLGR0LFkpLFg9bmV3IGpzdChoKSxLPW5ldyBmbHQoaCksSj1uZXcgQXN0KG10LEcpLHB0PW5ldyBGc3QobXQsVSxKLEcpLFE9bmV3IGhsdChtdCxKLFkscHQpLCQ9bmV3IHZsdChtdCxRLEosWSksc3Q9bmV3IE1sdChtdCksaXQ9bmV3IFZzdChxKSx0dD1uZXcgcWN0KGgsWCxLLFUsRyxwdCxpdCksZXQ9bmV3IGhkdChxKSxudD1uZXcgUWN0KHEpLG90PW5ldyBpZHQoVSxHKSxydD1uZXcgSHN0KGgsWCxXLCQsbCksYXQ9bmV3IHNkdChoLCQsRyksbHQ9bmV3IExzdChtdCxVLFksRyksY3Q9bmV3IGJsdChtdCxVLFksRyksWS5wcm9ncmFtcz10dC5wcm9ncmFtcyxoLmNhcGFiaWxpdGllcz1HLGguZXh0ZW5zaW9ucz1VLGgucHJvcGVydGllcz1xLGgucmVuZGVyTGlzdHM9bnQsaC5zaGFkb3dNYXA9YXQsaC5zdGF0ZT1XLGguaW5mbz1ZfWZ0KCk7Y29uc3QgZ3Q9bmV3IGdkdChoLG10KTtmdW5jdGlvbiBodCh0KXt0LnByZXZlbnREZWZhdWx0KCksY29uc29sZS5sb2coIlRIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgTG9zdC4iKSxiPSEwfWZ1bmN0aW9uIGJ0KCl7Y29uc29sZS5sb2coIlRIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgUmVzdG9yZWQuIiksYj0hMTtjb25zdCB0PVkuYXV0b1Jlc2V0LGU9YXQuZW5hYmxlZCxuPWF0LmF1dG9VcGRhdGUsbz1hdC5uZWVkc1VwZGF0ZSxpPWF0LnR5cGU7ZnQoKSxZLmF1dG9SZXNldD10LGF0LmVuYWJsZWQ9ZSxhdC5hdXRvVXBkYXRlPW4sYXQubmVlZHNVcGRhdGU9byxhdC50eXBlPWl9ZnVuY3Rpb24geXQodCl7Y29uc3QgZT10LnRhcmdldDtlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHl0KSwoZnVuY3Rpb24gbih0KXsoZnVuY3Rpb24gZSh0KXtjb25zdCBlPXEuZ2V0KHQpLnByb2dyYW1zO3ZvaWQgMCE9PWUmJmUuZm9yRWFjaCgoZnVuY3Rpb24odCl7dHQucmVsZWFzZVByb2dyYW0odCl9KSl9KSh0KSxxLnJlbW92ZSh0KX0pKGUpfXRoaXMueHI9Z3QsdGhpcy5nZXRDb250ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIG10fSx0aGlzLmdldENvbnRleHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7cmV0dXJuIG10LmdldENvbnRleHRBdHRyaWJ1dGVzKCl9LHRoaXMuZm9yY2VDb250ZXh0TG9zcz1mdW5jdGlvbigpe2NvbnN0IHQ9VS5nZXQoIldFQkdMX2xvc2VfY29udGV4dCIpO3QmJnQubG9zZUNvbnRleHQoKX0sdGhpcy5mb3JjZUNvbnRleHRSZXN0b3JlPWZ1bmN0aW9uKCl7Y29uc3QgdD1VLmdldCgiV0VCR0xfbG9zZV9jb250ZXh0Iik7dCYmdC5yZXN0b3JlQ29udGV4dCgpfSx0aGlzLmdldFBpeGVsUmF0aW89ZnVuY3Rpb24oKXtyZXR1cm4gU30sdGhpcy5zZXRQaXhlbFJhdGlvPWZ1bmN0aW9uKHQpe3ZvaWQgMCE9PXQmJihTPXQsdGhpcy5zZXRTaXplKHcsaywhMSkpfSx0aGlzLmdldFNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIHQuc2V0KHcsayl9LHRoaXMuc2V0U2l6ZT1mdW5jdGlvbih0LG4sbyl7Z3QuaXNQcmVzZW50aW5nP2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogQ2FuJ3QgY2hhbmdlIHNpemUgd2hpbGUgVlIgZGV2aWNlIGlzIHByZXNlbnRpbmcuIik6KHc9dCxrPW4sZS53aWR0aD1NYXRoLmZsb29yKHQqUyksZS5oZWlnaHQ9TWF0aC5mbG9vcihuKlMpLCExIT09byYmKGUuc3R5bGUud2lkdGg9dCsicHgiLGUuc3R5bGUuaGVpZ2h0PW4rInB4IiksdGhpcy5zZXRWaWV3cG9ydCgwLDAsdCxuKSl9LHRoaXMuZ2V0RHJhd2luZ0J1ZmZlclNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIHQuc2V0KHcqUyxrKlMpLmZsb29yKCl9LHRoaXMuc2V0RHJhd2luZ0J1ZmZlclNpemU9ZnVuY3Rpb24odCxuLG8pe3c9dCxrPW4sUz1vLGUud2lkdGg9TWF0aC5mbG9vcih0Km8pLGUuaGVpZ2h0PU1hdGguZmxvb3IobipvKSx0aGlzLnNldFZpZXdwb3J0KDAsMCx0LG4pfSx0aGlzLmdldEN1cnJlbnRWaWV3cG9ydD1mdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KHgpfSx0aGlzLmdldFZpZXdwb3J0PWZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoUil9LHRoaXMuc2V0Vmlld3BvcnQ9ZnVuY3Rpb24odCxlLG4sbyl7dC5pc1ZlY3RvcjQ/Ui5zZXQodC54LHQueSx0LnosdC53KTpSLnNldCh0LGUsbixvKSxXLnZpZXdwb3J0KHguY29weShSKS5tdWx0aXBseVNjYWxhcihTKS5mbG9vcigpKX0sdGhpcy5nZXRTY2lzc29yPWZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoQSl9LHRoaXMuc2V0U2Npc3Nvcj1mdW5jdGlvbih0LGUsbixvKXt0LmlzVmVjdG9yND9BLnNldCh0LngsdC55LHQueix0LncpOkEuc2V0KHQsZSxuLG8pLFcuc2Npc3NvcihPLmNvcHkoQSkubXVsdGlwbHlTY2FsYXIoUykuZmxvb3IoKSl9LHRoaXMuZ2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gVH0sdGhpcy5zZXRTY2lzc29yVGVzdD1mdW5jdGlvbih0KXtXLnNldFNjaXNzb3JUZXN0KFQ9dCl9LHRoaXMuc2V0T3BhcXVlU29ydD1mdW5jdGlvbih0KXtEPXR9LHRoaXMuc2V0VHJhbnNwYXJlbnRTb3J0PWZ1bmN0aW9uKHQpe0U9dH0sdGhpcy5nZXRDbGVhckNvbG9yPWZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkocnQuZ2V0Q2xlYXJDb2xvcigpKX0sdGhpcy5zZXRDbGVhckNvbG9yPWZ1bmN0aW9uKCl7cnQuc2V0Q2xlYXJDb2xvci5hcHBseShydCxhcmd1bWVudHMpfSx0aGlzLmdldENsZWFyQWxwaGE9ZnVuY3Rpb24oKXtyZXR1cm4gcnQuZ2V0Q2xlYXJBbHBoYSgpfSx0aGlzLnNldENsZWFyQWxwaGE9ZnVuY3Rpb24oKXtydC5zZXRDbGVhckFscGhhLmFwcGx5KHJ0LGFyZ3VtZW50cyl9LHRoaXMuY2xlYXI9ZnVuY3Rpb24odCxlLG4pe2xldCBvPTA7KHZvaWQgMD09PXR8fHQpJiYob3w9MTYzODQpLCh2b2lkIDA9PT1lfHxlKSYmKG98PTI1NiksKHZvaWQgMD09PW58fG4pJiYob3w9MTAyNCksbXQuY2xlYXIobyl9LHRoaXMuY2xlYXJDb2xvcj1mdW5jdGlvbigpe3RoaXMuY2xlYXIoITAsITEsITEpfSx0aGlzLmNsZWFyRGVwdGg9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCExLCEwLCExKX0sdGhpcy5jbGVhclN0ZW5jaWw9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCExLCExLCEwKX0sdGhpcy5kaXNwb3NlPWZ1bmN0aW9uKCl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRsb3N0IixodCwhMSksZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRyZXN0b3JlZCIsYnQsITEpLG50LmRpc3Bvc2UoKSxvdC5kaXNwb3NlKCkscS5kaXNwb3NlKCksWC5kaXNwb3NlKCksSy5kaXNwb3NlKCksJC5kaXNwb3NlKCkscHQuZGlzcG9zZSgpLGd0LmRpc3Bvc2UoKSxndC5yZW1vdmVFdmVudExpc3RlbmVyKCJzZXNzaW9uc3RhcnQiLEN0KSxndC5yZW1vdmVFdmVudExpc3RlbmVyKCJzZXNzaW9uZW5kIixNdCksRiYmKEYuZGlzcG9zZSgpLEY9bnVsbCksdnQuc3RvcCgpfSx0aGlzLnJlbmRlckJ1ZmZlckltbWVkaWF0ZT1mdW5jdGlvbih0LGUpe3B0LmluaXRBdHRyaWJ1dGVzKCk7Y29uc3Qgbj1xLmdldCh0KTt0Lmhhc1Bvc2l0aW9ucyYmIW4ucG9zaXRpb24mJihuLnBvc2l0aW9uPW10LmNyZWF0ZUJ1ZmZlcigpKSx0Lmhhc05vcm1hbHMmJiFuLm5vcm1hbCYmKG4ubm9ybWFsPW10LmNyZWF0ZUJ1ZmZlcigpKSx0Lmhhc1V2cyYmIW4udXYmJihuLnV2PW10LmNyZWF0ZUJ1ZmZlcigpKSx0Lmhhc0NvbG9ycyYmIW4uY29sb3ImJihuLmNvbG9yPW10LmNyZWF0ZUJ1ZmZlcigpKTtjb25zdCBvPWUuZ2V0QXR0cmlidXRlcygpO3QuaGFzUG9zaXRpb25zJiYobXQuYmluZEJ1ZmZlcigzNDk2MixuLnBvc2l0aW9uKSxtdC5idWZmZXJEYXRhKDM0OTYyLHQucG9zaXRpb25BcnJheSwzNTA0OCkscHQuZW5hYmxlQXR0cmlidXRlKG8ucG9zaXRpb24pLG10LnZlcnRleEF0dHJpYlBvaW50ZXIoby5wb3NpdGlvbiwzLDUxMjYsITEsMCwwKSksdC5oYXNOb3JtYWxzJiYobXQuYmluZEJ1ZmZlcigzNDk2MixuLm5vcm1hbCksbXQuYnVmZmVyRGF0YSgzNDk2Mix0Lm5vcm1hbEFycmF5LDM1MDQ4KSxwdC5lbmFibGVBdHRyaWJ1dGUoby5ub3JtYWwpLG10LnZlcnRleEF0dHJpYlBvaW50ZXIoby5ub3JtYWwsMyw1MTI2LCExLDAsMCkpLHQuaGFzVXZzJiYobXQuYmluZEJ1ZmZlcigzNDk2MixuLnV2KSxtdC5idWZmZXJEYXRhKDM0OTYyLHQudXZBcnJheSwzNTA0OCkscHQuZW5hYmxlQXR0cmlidXRlKG8udXYpLG10LnZlcnRleEF0dHJpYlBvaW50ZXIoby51diwyLDUxMjYsITEsMCwwKSksdC5oYXNDb2xvcnMmJihtdC5iaW5kQnVmZmVyKDM0OTYyLG4uY29sb3IpLG10LmJ1ZmZlckRhdGEoMzQ5NjIsdC5jb2xvckFycmF5LDM1MDQ4KSxwdC5lbmFibGVBdHRyaWJ1dGUoby5jb2xvciksbXQudmVydGV4QXR0cmliUG9pbnRlcihvLmNvbG9yLDMsNTEyNiwhMSwwLDApKSxwdC5kaXNhYmxlVW51c2VkQXR0cmlidXRlcygpLG10LmRyYXdBcnJheXMoNCwwLHQuY291bnQpLHQuY291bnQ9MH0sdGhpcy5yZW5kZXJCdWZmZXJEaXJlY3Q9ZnVuY3Rpb24odCxlLG4sbyxpLGEpe251bGw9PT1lJiYoZT1WKTtjb25zdCByPWkuaXNNZXNoJiZpLm1hdHJpeFdvcmxkLmRldGVybWluYW50KCk8MCxzPVN0KHQsZSxvLGkpO1cuc2V0TWF0ZXJpYWwobyxyKTtsZXQgbD1uLmluZGV4O2NvbnN0IGM9bi5hdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKG51bGw9PT1sKXtpZih2b2lkIDA9PT1jfHwwPT09Yy5jb3VudClyZXR1cm59ZWxzZSBpZigwPT09bC5jb3VudClyZXR1cm47bGV0IGQscD0xOyEwPT09by53aXJlZnJhbWUmJihsPVEuZ2V0V2lyZWZyYW1lQXR0cmlidXRlKG4pLHA9Miksdm9pZCAwPT09bi5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24mJnZvaWQgMD09PW4ubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbHx8c3QudXBkYXRlKGksbixvLHMpLHB0LnNldHVwKGksbyxzLG4sbCk7bGV0IG09bHQ7bnVsbCE9PWwmJihkPUouZ2V0KGwpLG09Y3QsbS5zZXRJbmRleChkKSk7Y29uc3QgdT1udWxsIT09bD9sLmNvdW50OmMuY291bnQsZj1uLmRyYXdSYW5nZS5zdGFydCpwLGc9bi5kcmF3UmFuZ2UuY291bnQqcCxoPW51bGwhPT1hP2Euc3RhcnQqcDowLGI9bnVsbCE9PWE/YS5jb3VudCpwOjEvMCx5PU1hdGgubWF4KGYsaCksXz1NYXRoLm1pbih1LGYrZyxoK2IpLTEsQz1NYXRoLm1heCgwLF8teSsxKTtpZigwIT09Qyl7aWYoaS5pc01lc2gpITA9PT1vLndpcmVmcmFtZT8oVy5zZXRMaW5lV2lkdGgoby53aXJlZnJhbWVMaW5ld2lkdGgqaigpKSxtLnNldE1vZGUoMSkpOm0uc2V0TW9kZSg0KTtlbHNlIGlmKGkuaXNMaW5lKXtsZXQgdD1vLmxpbmV3aWR0aDt2b2lkIDA9PT10JiYodD0xKSxXLnNldExpbmVXaWR0aCh0KmooKSksbS5zZXRNb2RlKGkuaXNMaW5lU2VnbWVudHM/MTppLmlzTGluZUxvb3A/MjozKX1lbHNlIGkuaXNQb2ludHM/bS5zZXRNb2RlKDApOmkuaXNTcHJpdGUmJm0uc2V0TW9kZSg0KTtpZihpLmlzSW5zdGFuY2VkTWVzaCltLnJlbmRlckluc3RhbmNlcyh5LEMsaS5jb3VudCk7ZWxzZSBpZihuLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkpe2NvbnN0IHQ9TWF0aC5taW4obi5pbnN0YW5jZUNvdW50LG4uX21heEluc3RhbmNlQ291bnQpO20ucmVuZGVySW5zdGFuY2VzKHksQyx0KX1lbHNlIG0ucmVuZGVyKHksQyl9fSx0aGlzLmNvbXBpbGU9ZnVuY3Rpb24odCxlKXt1PW90LmdldCh0KSx1LmluaXQoKSxnLnB1c2godSksdC50cmF2ZXJzZVZpc2libGUoKGZ1bmN0aW9uKHQpe3QuaXNMaWdodCYmdC5sYXllcnMudGVzdChlLmxheWVycykmJih1LnB1c2hMaWdodCh0KSx0LmNhc3RTaGFkb3cmJnUucHVzaFNoYWRvdyh0KSl9KSksdS5zZXR1cExpZ2h0cygpLHQudHJhdmVyc2UoKGZ1bmN0aW9uKGUpe2NvbnN0IG49ZS5tYXRlcmlhbDtpZihuKWlmKEFycmF5LmlzQXJyYXkobikpZm9yKGxldCBvPTA7bzxuLmxlbmd0aDtvKyspd3QobltvXSx0LGUpO2Vsc2Ugd3Qobix0LGUpfSkpLGcucG9wKCksdT1udWxsfTtsZXQgX3Q9bnVsbDtmdW5jdGlvbiBDdCgpe3Z0LnN0b3AoKX1mdW5jdGlvbiBNdCgpe3Z0LnN0YXJ0KCl9Y29uc3QgdnQ9bmV3IFJzdDtmdW5jdGlvbiB4dCh0LGUsbixvKXtpZighMT09PXQudmlzaWJsZSlyZXR1cm47aWYodC5sYXllcnMudGVzdChlLmxheWVycykpaWYodC5pc0dyb3VwKW49dC5yZW5kZXJPcmRlcjtlbHNlIGlmKHQuaXNMT0QpITA9PT10LmF1dG9VcGRhdGUmJnQudXBkYXRlKGUpO2Vsc2UgaWYodC5pc0xpZ2h0KXUucHVzaExpZ2h0KHQpLHQuY2FzdFNoYWRvdyYmdS5wdXNoU2hhZG93KHQpO2Vsc2UgaWYodC5pc1Nwcml0ZSl7aWYoIXQuZnJ1c3R1bUN1bGxlZHx8ei5pbnRlcnNlY3RzU3ByaXRlKHQpKXtvJiZCLnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKS5hcHBseU1hdHJpeDQoTCk7Y29uc3QgZT0kLnVwZGF0ZSh0KSxpPXQubWF0ZXJpYWw7aS52aXNpYmxlJiZtLnB1c2godCxlLGksbixCLnosbnVsbCl9fWVsc2UgaWYodC5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdClvJiZCLnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKS5hcHBseU1hdHJpeDQoTCksbS5wdXNoKHQsbnVsbCx0Lm1hdGVyaWFsLG4sQi56LG51bGwpO2Vsc2UgaWYoKHQuaXNNZXNofHx0LmlzTGluZXx8dC5pc1BvaW50cykmJih0LmlzU2tpbm5lZE1lc2gmJnQuc2tlbGV0b24uZnJhbWUhPT1ZLnJlbmRlci5mcmFtZSYmKHQuc2tlbGV0b24udXBkYXRlKCksdC5za2VsZXRvbi5mcmFtZT1ZLnJlbmRlci5mcmFtZSksIXQuZnJ1c3R1bUN1bGxlZHx8ei5pbnRlcnNlY3RzT2JqZWN0KHQpKSl7byYmQi5zZXRGcm9tTWF0cml4UG9zaXRpb24odC5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KEwpO2NvbnN0IGU9JC51cGRhdGUodCksaT10Lm1hdGVyaWFsO2lmKEFycmF5LmlzQXJyYXkoaSkpe2NvbnN0IG89ZS5ncm91cHM7Zm9yKGxldCBhPTAscj1vLmxlbmd0aDthPHI7YSsrKXtjb25zdCByPW9bYV0scz1pW3IubWF0ZXJpYWxJbmRleF07cyYmcy52aXNpYmxlJiZtLnB1c2godCxlLHMsbixCLnoscil9fWVsc2UgaS52aXNpYmxlJiZtLnB1c2godCxlLGksbixCLnosbnVsbCl9Y29uc3QgaT10LmNoaWxkcmVuO2ZvcihsZXQgdD0wLGE9aS5sZW5ndGg7dDxhO3QrKyl4dChpW3RdLGUsbixvKX1mdW5jdGlvbiBPdCh0LGUsbil7Y29uc3Qgbz0hMD09PWUuaXNTY2VuZT9lLm92ZXJyaWRlTWF0ZXJpYWw6bnVsbDtpZihuLmlzQXJyYXlDYW1lcmEpe2NvbnN0IGk9bi5jYW1lcmFzO2ZvcihsZXQgbj0wLGE9aS5sZW5ndGg7bjxhO24rKyl7Y29uc3QgYT1pW25dO1cudmlld3BvcnQoeC5jb3B5KGEudmlld3BvcnQpKSx1LnNldHVwTGlnaHRzVmlldyhhKTtmb3IobGV0IG49MCxpPXQubGVuZ3RoO248aTtuKyspe2NvbnN0IGk9dFtuXSxyPWkub2JqZWN0LHM9aS5nZW9tZXRyeSxsPW51bGw9PT1vP2kubWF0ZXJpYWw6byxjPWkuZ3JvdXA7ci5sYXllcnMudGVzdChhLmxheWVycykmJlB0KHIsZSxhLHMsbCxjKX19fWVsc2UgZm9yKGxldCBpPTAsYT10Lmxlbmd0aDtpPGE7aSsrKXtjb25zdCBhPXRbaV07UHQoYS5vYmplY3QsZSxuLGEuZ2VvbWV0cnksbnVsbD09PW8/YS5tYXRlcmlhbDpvLGEuZ3JvdXApfX1mdW5jdGlvbiBQdCh0LGUsbixvLGksYSl7aWYodC5vbkJlZm9yZVJlbmRlcihoLGUsbixvLGksYSksdC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyhuLm1hdHJpeFdvcmxkSW52ZXJzZSx0Lm1hdHJpeFdvcmxkKSx0Lm5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgodC5tb2RlbFZpZXdNYXRyaXgpLHQuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3Qpe2NvbnN0IG89U3QobixlLGksdCk7Vy5zZXRNYXRlcmlhbChpKSxwdC5yZXNldCgpLChmdW5jdGlvbiByKHQsZSl7dC5yZW5kZXIoKGZ1bmN0aW9uKHQpe2gucmVuZGVyQnVmZmVySW1tZWRpYXRlKHQsZSl9KSl9KSh0LG8pfWVsc2UhMD09PWkudHJhbnNwYXJlbnQmJjI9PT1pLnNpZGU/KGkuc2lkZT0xLGkubmVlZHNVcGRhdGU9ITAsaC5yZW5kZXJCdWZmZXJEaXJlY3QobixlLG8saSx0LGEpLGkuc2lkZT0wLGkubmVlZHNVcGRhdGU9ITAsaC5yZW5kZXJCdWZmZXJEaXJlY3QobixlLG8saSx0LGEpLGkuc2lkZT0yKTpoLnJlbmRlckJ1ZmZlckRpcmVjdChuLGUsbyxpLHQsYSk7dC5vbkFmdGVyUmVuZGVyKGgsZSxuLG8saSxhKX1mdW5jdGlvbiB3dCh0LGUsbil7ITAhPT1lLmlzU2NlbmUmJihlPVYpO2NvbnN0IG89cS5nZXQodCksaT11LnN0YXRlLmxpZ2h0cyxhPWkuc3RhdGUudmVyc2lvbixyPXR0LmdldFBhcmFtZXRlcnModCxpLnN0YXRlLHUuc3RhdGUuc2hhZG93c0FycmF5LGUsbikscz10dC5nZXRQcm9ncmFtQ2FjaGVLZXkocik7bGV0IGw9by5wcm9ncmFtcztvLmVudmlyb25tZW50PXQuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD9lLmVudmlyb25tZW50Om51bGwsby5mb2c9ZS5mb2csby5lbnZNYXA9KHQuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD9LOlgpLmdldCh0LmVudk1hcHx8by5lbnZpcm9ubWVudCksdm9pZCAwPT09bCYmKHQuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIseXQpLGw9bmV3IE1hcCxvLnByb2dyYW1zPWwpO2xldCBjPWwuZ2V0KHMpO2lmKHZvaWQgMCE9PWMpe2lmKG8uY3VycmVudFByb2dyYW09PT1jJiZvLmxpZ2h0c1N0YXRlVmVyc2lvbj09PWEpcmV0dXJuIGt0KHQsciksY31lbHNlIHIudW5pZm9ybXM9dHQuZ2V0VW5pZm9ybXModCksdC5vbkJ1aWxkKHIsaCksdC5vbkJlZm9yZUNvbXBpbGUocixoKSxjPXR0LmFjcXVpcmVQcm9ncmFtKHIscyksbC5zZXQocyxjKSxvLnVuaWZvcm1zPXIudW5pZm9ybXM7Y29uc3QgZD1vLnVuaWZvcm1zOyh0LmlzU2hhZGVyTWF0ZXJpYWx8fHQuaXNSYXdTaGFkZXJNYXRlcmlhbCkmJiEwIT09dC5jbGlwcGluZ3x8KGQuY2xpcHBpbmdQbGFuZXM9aXQudW5pZm9ybSksa3QodCxyKSxvLm5lZWRzTGlnaHRzPShmdW5jdGlvbiBwKHQpe3JldHVybiB0LmlzTWVzaExhbWJlcnRNYXRlcmlhbHx8dC5pc01lc2hUb29uTWF0ZXJpYWx8fHQuaXNNZXNoUGhvbmdNYXRlcmlhbHx8dC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsfHx0LmlzU2hhZG93TWF0ZXJpYWx8fHQuaXNTaGFkZXJNYXRlcmlhbCYmITA9PT10LmxpZ2h0c30pKHQpLG8ubGlnaHRzU3RhdGVWZXJzaW9uPWEsby5uZWVkc0xpZ2h0cyYmKGQuYW1iaWVudExpZ2h0Q29sb3IudmFsdWU9aS5zdGF0ZS5hbWJpZW50LGQubGlnaHRQcm9iZS52YWx1ZT1pLnN0YXRlLnByb2JlLGQuZGlyZWN0aW9uYWxMaWdodHMudmFsdWU9aS5zdGF0ZS5kaXJlY3Rpb25hbCxkLmRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzLnZhbHVlPWkuc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3csZC5zcG90TGlnaHRzLnZhbHVlPWkuc3RhdGUuc3BvdCxkLnNwb3RMaWdodFNoYWRvd3MudmFsdWU9aS5zdGF0ZS5zcG90U2hhZG93LGQucmVjdEFyZWFMaWdodHMudmFsdWU9aS5zdGF0ZS5yZWN0QXJlYSxkLmx0Y18xLnZhbHVlPWkuc3RhdGUucmVjdEFyZWFMVEMxLGQubHRjXzIudmFsdWU9aS5zdGF0ZS5yZWN0QXJlYUxUQzIsZC5wb2ludExpZ2h0cy52YWx1ZT1pLnN0YXRlLnBvaW50LGQucG9pbnRMaWdodFNoYWRvd3MudmFsdWU9aS5zdGF0ZS5wb2ludFNoYWRvdyxkLmhlbWlzcGhlcmVMaWdodHMudmFsdWU9aS5zdGF0ZS5oZW1pLGQuZGlyZWN0aW9uYWxTaGFkb3dNYXAudmFsdWU9aS5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcCxkLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4LnZhbHVlPWkuc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgsZC5zcG90U2hhZG93TWFwLnZhbHVlPWkuc3RhdGUuc3BvdFNoYWRvd01hcCxkLnNwb3RTaGFkb3dNYXRyaXgudmFsdWU9aS5zdGF0ZS5zcG90U2hhZG93TWF0cml4LGQucG9pbnRTaGFkb3dNYXAudmFsdWU9aS5zdGF0ZS5wb2ludFNoYWRvd01hcCxkLnBvaW50U2hhZG93TWF0cml4LnZhbHVlPWkuc3RhdGUucG9pbnRTaGFkb3dNYXRyaXgpO2NvbnN0IG09Yy5nZXRVbmlmb3JtcygpLGY9d2N0LnNlcVdpdGhWYWx1ZShtLnNlcSxkKTtyZXR1cm4gby5jdXJyZW50UHJvZ3JhbT1jLG8udW5pZm9ybXNMaXN0PWYsY31mdW5jdGlvbiBrdCh0LGUpe2NvbnN0IG49cS5nZXQodCk7bi5vdXRwdXRFbmNvZGluZz1lLm91dHB1dEVuY29kaW5nLG4uaW5zdGFuY2luZz1lLmluc3RhbmNpbmcsbi5za2lubmluZz1lLnNraW5uaW5nLG4ubW9ycGhUYXJnZXRzPWUubW9ycGhUYXJnZXRzLG4ubW9ycGhOb3JtYWxzPWUubW9ycGhOb3JtYWxzLG4ubnVtQ2xpcHBpbmdQbGFuZXM9ZS5udW1DbGlwcGluZ1BsYW5lcyxuLm51bUludGVyc2VjdGlvbj1lLm51bUNsaXBJbnRlcnNlY3Rpb24sbi52ZXJ0ZXhBbHBoYXM9ZS52ZXJ0ZXhBbHBoYXMsbi52ZXJ0ZXhUYW5nZW50cz1lLnZlcnRleFRhbmdlbnRzfWZ1bmN0aW9uIFN0KHQsZSxuLG8peyEwIT09ZS5pc1NjZW5lJiYoZT1WKSxaLnJlc2V0VGV4dHVyZVVuaXRzKCk7Y29uc3QgaT1lLmZvZyxhPW51bGw9PT1DP2gub3V0cHV0RW5jb2Rpbmc6Qy50ZXh0dXJlLmVuY29kaW5nLHI9KG4uaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD9LOlgpLmdldChuLmVudk1hcHx8KG4uaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD9lLmVudmlyb25tZW50Om51bGwpKSxzPSEwPT09bi52ZXJ0ZXhDb2xvcnMmJiEhby5nZW9tZXRyeSYmISFvLmdlb21ldHJ5LmF0dHJpYnV0ZXMuY29sb3ImJjQ9PT1vLmdlb21ldHJ5LmF0dHJpYnV0ZXMuY29sb3IuaXRlbVNpemUsbD0hIW8uZ2VvbWV0cnkmJiEhby5nZW9tZXRyeS5hdHRyaWJ1dGVzLnRhbmdlbnQsYz0hIW8uZ2VvbWV0cnkmJiEhby5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24sZD0hIW8uZ2VvbWV0cnkmJiEhby5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsLHA9cS5nZXQobiksbT11LnN0YXRlLmxpZ2h0czshMCE9PUl8fCEwIT09SCYmdD09PXZ8fGl0LnNldFN0YXRlKG4sdCx0PT09diYmbi5pZD09PU0pO2xldCBmPSExO24udmVyc2lvbj09PXAuX192ZXJzaW9uP3AubmVlZHNMaWdodHMmJnAubGlnaHRzU3RhdGVWZXJzaW9uIT09bS5zdGF0ZS52ZXJzaW9ufHxwLm91dHB1dEVuY29kaW5nIT09YXx8by5pc0luc3RhbmNlZE1lc2gmJiExPT09cC5pbnN0YW5jaW5nP2Y9ITA6by5pc0luc3RhbmNlZE1lc2h8fCEwIT09cC5pbnN0YW5jaW5nP28uaXNTa2lubmVkTWVzaCYmITE9PT1wLnNraW5uaW5nP2Y9ITA6by5pc1NraW5uZWRNZXNofHwhMCE9PXAuc2tpbm5pbmc/cC5lbnZNYXAhPT1yfHxuLmZvZyYmcC5mb2chPT1pP2Y9ITA6dm9pZCAwPT09cC5udW1DbGlwcGluZ1BsYW5lc3x8cC5udW1DbGlwcGluZ1BsYW5lcz09PWl0Lm51bVBsYW5lcyYmcC5udW1JbnRlcnNlY3Rpb249PT1pdC5udW1JbnRlcnNlY3Rpb24/KHAudmVydGV4QWxwaGFzIT09c3x8cC52ZXJ0ZXhUYW5nZW50cyE9PWx8fHAubW9ycGhUYXJnZXRzIT09Y3x8cC5tb3JwaE5vcm1hbHMhPT1kKSYmKGY9ITApOmY9ITA6Zj0hMDpmPSEwOihmPSEwLHAuX192ZXJzaW9uPW4udmVyc2lvbik7bGV0IGc9cC5jdXJyZW50UHJvZ3JhbTshMD09PWYmJihnPXd0KG4sZSxvKSk7bGV0IGI9ITEseT0hMSxfPSExO2NvbnN0IHg9Zy5nZXRVbmlmb3JtcygpLE89cC51bmlmb3JtcztpZihXLnVzZVByb2dyYW0oZy5wcm9ncmFtKSYmKGI9ITAseT0hMCxfPSEwKSxuLmlkIT09TSYmKE09bi5pZCx5PSEwKSxifHx2IT09dCl7aWYoeC5zZXRWYWx1ZShtdCwicHJvamVjdGlvbk1hdHJpeCIsdC5wcm9qZWN0aW9uTWF0cml4KSxHLmxvZ2FyaXRobWljRGVwdGhCdWZmZXImJnguc2V0VmFsdWUobXQsImxvZ0RlcHRoQnVmRkMiLDIvKE1hdGgubG9nKHQuZmFyKzEpL01hdGguTE4yKSksdiE9PXQmJih2PXQseT0hMCxfPSEwKSxuLmlzU2hhZGVyTWF0ZXJpYWx8fG4uaXNNZXNoUGhvbmdNYXRlcmlhbHx8bi5pc01lc2hUb29uTWF0ZXJpYWx8fG4uaXNNZXNoU3RhbmRhcmRNYXRlcmlhbHx8bi5lbnZNYXApe2NvbnN0IGU9eC5tYXAuY2FtZXJhUG9zaXRpb247dm9pZCAwIT09ZSYmZS5zZXRWYWx1ZShtdCxCLnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKSl9KG4uaXNNZXNoUGhvbmdNYXRlcmlhbHx8bi5pc01lc2hUb29uTWF0ZXJpYWx8fG4uaXNNZXNoTGFtYmVydE1hdGVyaWFsfHxuLmlzTWVzaEJhc2ljTWF0ZXJpYWx8fG4uaXNNZXNoU3RhbmRhcmRNYXRlcmlhbHx8bi5pc1NoYWRlck1hdGVyaWFsKSYmeC5zZXRWYWx1ZShtdCwiaXNPcnRob2dyYXBoaWMiLCEwPT09dC5pc09ydGhvZ3JhcGhpY0NhbWVyYSksKG4uaXNNZXNoUGhvbmdNYXRlcmlhbHx8bi5pc01lc2hUb29uTWF0ZXJpYWx8fG4uaXNNZXNoTGFtYmVydE1hdGVyaWFsfHxuLmlzTWVzaEJhc2ljTWF0ZXJpYWx8fG4uaXNNZXNoU3RhbmRhcmRNYXRlcmlhbHx8bi5pc1NoYWRlck1hdGVyaWFsfHxuLmlzU2hhZG93TWF0ZXJpYWx8fG8uaXNTa2lubmVkTWVzaCkmJnguc2V0VmFsdWUobXQsInZpZXdNYXRyaXgiLHQubWF0cml4V29ybGRJbnZlcnNlKX1pZihvLmlzU2tpbm5lZE1lc2gpe3guc2V0T3B0aW9uYWwobXQsbywiYmluZE1hdHJpeCIpLHguc2V0T3B0aW9uYWwobXQsbywiYmluZE1hdHJpeEludmVyc2UiKTtjb25zdCB0PW8uc2tlbGV0b247dCYmKEcuZmxvYXRWZXJ0ZXhUZXh0dXJlcz8obnVsbD09PXQuYm9uZVRleHR1cmUmJnQuY29tcHV0ZUJvbmVUZXh0dXJlKCkseC5zZXRWYWx1ZShtdCwiYm9uZVRleHR1cmUiLHQuYm9uZVRleHR1cmUsWikseC5zZXRWYWx1ZShtdCwiYm9uZVRleHR1cmVTaXplIix0LmJvbmVUZXh0dXJlU2l6ZSkpOnguc2V0T3B0aW9uYWwobXQsdCwiYm9uZU1hdHJpY2VzIikpfXJldHVybih5fHxwLnJlY2VpdmVTaGFkb3chPT1vLnJlY2VpdmVTaGFkb3cpJiYocC5yZWNlaXZlU2hhZG93PW8ucmVjZWl2ZVNoYWRvdyx4LnNldFZhbHVlKG10LCJyZWNlaXZlU2hhZG93IixvLnJlY2VpdmVTaGFkb3cpKSx5JiYoeC5zZXRWYWx1ZShtdCwidG9uZU1hcHBpbmdFeHBvc3VyZSIsaC50b25lTWFwcGluZ0V4cG9zdXJlKSxwLm5lZWRzTGlnaHRzJiYoZnVuY3Rpb24gUCh0LGUpe3QuYW1iaWVudExpZ2h0Q29sb3IubmVlZHNVcGRhdGU9ZSx0LmxpZ2h0UHJvYmUubmVlZHNVcGRhdGU9ZSx0LmRpcmVjdGlvbmFsTGlnaHRzLm5lZWRzVXBkYXRlPWUsdC5kaXJlY3Rpb25hbExpZ2h0U2hhZG93cy5uZWVkc1VwZGF0ZT1lLHQucG9pbnRMaWdodHMubmVlZHNVcGRhdGU9ZSx0LnBvaW50TGlnaHRTaGFkb3dzLm5lZWRzVXBkYXRlPWUsdC5zcG90TGlnaHRzLm5lZWRzVXBkYXRlPWUsdC5zcG90TGlnaHRTaGFkb3dzLm5lZWRzVXBkYXRlPWUsdC5yZWN0QXJlYUxpZ2h0cy5uZWVkc1VwZGF0ZT1lLHQuaGVtaXNwaGVyZUxpZ2h0cy5uZWVkc1VwZGF0ZT1lfSkoTyxfKSxpJiZuLmZvZyYmZXQucmVmcmVzaEZvZ1VuaWZvcm1zKE8saSksZXQucmVmcmVzaE1hdGVyaWFsVW5pZm9ybXMoTyxuLFMsayxGKSx3Y3QudXBsb2FkKG10LHAudW5pZm9ybXNMaXN0LE8sWikpLG4uaXNTaGFkZXJNYXRlcmlhbCYmITA9PT1uLnVuaWZvcm1zTmVlZFVwZGF0ZSYmKHdjdC51cGxvYWQobXQscC51bmlmb3Jtc0xpc3QsTyxaKSxuLnVuaWZvcm1zTmVlZFVwZGF0ZT0hMSksbi5pc1Nwcml0ZU1hdGVyaWFsJiZ4LnNldFZhbHVlKG10LCJjZW50ZXIiLG8uY2VudGVyKSx4LnNldFZhbHVlKG10LCJtb2RlbFZpZXdNYXRyaXgiLG8ubW9kZWxWaWV3TWF0cml4KSx4LnNldFZhbHVlKG10LCJub3JtYWxNYXRyaXgiLG8ubm9ybWFsTWF0cml4KSx4LnNldFZhbHVlKG10LCJtb2RlbE1hdHJpeCIsby5tYXRyaXhXb3JsZCksZ312dC5zZXRBbmltYXRpb25Mb29wKChmdW5jdGlvbiBEdCh0KXtfdCYmX3QodCl9KSksInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJnZ0LnNldENvbnRleHQod2luZG93KSx0aGlzLnNldEFuaW1hdGlvbkxvb3A9ZnVuY3Rpb24odCl7X3Q9dCxndC5zZXRBbmltYXRpb25Mb29wKHQpLG51bGw9PT10P3Z0LnN0b3AoKTp2dC5zdGFydCgpfSxndC5hZGRFdmVudExpc3RlbmVyKCJzZXNzaW9uc3RhcnQiLEN0KSxndC5hZGRFdmVudExpc3RlbmVyKCJzZXNzaW9uZW5kIixNdCksdGhpcy5yZW5kZXI9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1lJiYhMCE9PWUuaXNDYW1lcmEpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXI6IGNhbWVyYSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQ2FtZXJhLiIpO2lmKCEwPT09YilyZXR1cm47ITA9PT10LmF1dG9VcGRhdGUmJnQudXBkYXRlTWF0cml4V29ybGQoKSxudWxsPT09ZS5wYXJlbnQmJmUudXBkYXRlTWF0cml4V29ybGQoKSwhMD09PWd0LmVuYWJsZWQmJiEwPT09Z3QuaXNQcmVzZW50aW5nJiYoITA9PT1ndC5jYW1lcmFBdXRvVXBkYXRlJiZndC51cGRhdGVDYW1lcmEoZSksZT1ndC5nZXRDYW1lcmEoKSksITA9PT10LmlzU2NlbmUmJnQub25CZWZvcmVSZW5kZXIoaCx0LGUsQyksdT1vdC5nZXQodCxnLmxlbmd0aCksdS5pbml0KCksZy5wdXNoKHUpLEwubXVsdGlwbHlNYXRyaWNlcyhlLnByb2plY3Rpb25NYXRyaXgsZS5tYXRyaXhXb3JsZEludmVyc2UpLHouc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoTCksSD10aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkLEk9aXQuaW5pdCh0aGlzLmNsaXBwaW5nUGxhbmVzLEgsZSksbT1udC5nZXQodCxmLmxlbmd0aCksbS5pbml0KCksZi5wdXNoKG0pLHh0KHQsZSwwLGguc29ydE9iamVjdHMpLG0uZmluaXNoKCksITA9PT1oLnNvcnRPYmplY3RzJiZtLnNvcnQoRCxFKSwhMD09PUkmJml0LmJlZ2luU2hhZG93cygpLGF0LnJlbmRlcih1LnN0YXRlLnNoYWRvd3NBcnJheSx0LGUpLHUuc2V0dXBMaWdodHMoKSx1LnNldHVwTGlnaHRzVmlldyhlKSwhMD09PUkmJml0LmVuZFNoYWRvd3MoKSwhMD09PXRoaXMuaW5mby5hdXRvUmVzZXQmJnRoaXMuaW5mby5yZXNldCgpLHJ0LnJlbmRlcihtLHQpO2NvbnN0IG49bS5vcGFxdWUsbz1tLnRyYW5zbWlzc2l2ZSxpPW0udHJhbnNwYXJlbnQ7bi5sZW5ndGg+MCYmT3Qobix0LGUpLG8ubGVuZ3RoPjAmJihmdW5jdGlvbiBhKHQsZSxuLG8pe251bGw9PT1GJiYoRj1uZXcoITA9PT1zJiYhMD09PUcuaXNXZWJHTDI/c2F0OnJhdCkoMTAyNCwxMDI0LHtnZW5lcmF0ZU1pcG1hcHM6ITAsdHlwZTpudWxsIT09ZHQuY29udmVydCh4aXQpP3hpdDpfaXQsbWluRmlsdGVyOnlpdCxtYWdGaWx0ZXI6aGl0LHdyYXBTOmZpdCx3cmFwVDpmaXR9KSk7Y29uc3QgaT1oLmdldFJlbmRlclRhcmdldCgpO2guc2V0UmVuZGVyVGFyZ2V0KEYpLGguY2xlYXIoKTtjb25zdCBhPWgudG9uZU1hcHBpbmc7aC50b25lTWFwcGluZz0wLE90KHQsbixvKSxoLnRvbmVNYXBwaW5nPWEsWi51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldChGKSxaLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcChGKSxoLnNldFJlbmRlclRhcmdldChpKSxPdChlLG4sbyl9KShuLG8sdCxlKSxpLmxlbmd0aD4wJiZPdChpLHQsZSksbnVsbCE9PUMmJihaLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KEMpLFoudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKEMpKSwhMD09PXQuaXNTY2VuZSYmdC5vbkFmdGVyUmVuZGVyKGgsdCxlKSxXLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCghMCksVy5idWZmZXJzLmRlcHRoLnNldE1hc2soITApLFcuYnVmZmVycy5jb2xvci5zZXRNYXNrKCEwKSxXLnNldFBvbHlnb25PZmZzZXQoITEpLHB0LnJlc2V0RGVmYXVsdFN0YXRlKCksTT0tMSx2PW51bGwsZy5wb3AoKSx1PWcubGVuZ3RoPjA/Z1tnLmxlbmd0aC0xXTpudWxsLGYucG9wKCksbT1mLmxlbmd0aD4wP2ZbZi5sZW5ndGgtMV06bnVsbH0sdGhpcy5nZXRBY3RpdmVDdWJlRmFjZT1mdW5jdGlvbigpe3JldHVybiB5fSx0aGlzLmdldEFjdGl2ZU1pcG1hcExldmVsPWZ1bmN0aW9uKCl7cmV0dXJuIF99LHRoaXMuZ2V0UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIEN9LHRoaXMuc2V0UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKHQsZT0wLG49MCl7Qz10LHk9ZSxfPW4sdCYmdm9pZCAwPT09cS5nZXQodCkuX193ZWJnbEZyYW1lYnVmZmVyJiZaLnNldHVwUmVuZGVyVGFyZ2V0KHQpO2xldCBvPW51bGwsaT0hMSxhPSExO2lmKHQpe2NvbnN0IG49dC50ZXh0dXJlOyhuLmlzRGF0YVRleHR1cmUzRHx8bi5pc0RhdGFUZXh0dXJlMkRBcnJheSkmJihhPSEwKTtjb25zdCByPXEuZ2V0KHQpLl9fd2ViZ2xGcmFtZWJ1ZmZlcjt0LmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0PyhvPXJbZV0saT0hMCk6bz10LmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldD9xLmdldCh0KS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXI6cix4LmNvcHkodC52aWV3cG9ydCksTy5jb3B5KHQuc2Npc3NvciksUD10LnNjaXNzb3JUZXN0fWVsc2UgeC5jb3B5KFIpLm11bHRpcGx5U2NhbGFyKFMpLmZsb29yKCksTy5jb3B5KEEpLm11bHRpcGx5U2NhbGFyKFMpLmZsb29yKCksUD1UO2lmKFcuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG8pJiZHLmRyYXdCdWZmZXJzKXtsZXQgZT0hMTtpZih0KWlmKHQuaXNXZWJHTE11bHRpcGxlUmVuZGVyVGFyZ2V0cyl7Y29uc3Qgbj10LnRleHR1cmU7aWYoTi5sZW5ndGghPT1uLmxlbmd0aHx8MzYwNjQhPT1OWzBdKXtmb3IobGV0IHQ9MCxlPW4ubGVuZ3RoO3Q8ZTt0KyspTlt0XT0zNjA2NCt0O04ubGVuZ3RoPW4ubGVuZ3RoLGU9ITB9fWVsc2UgMT09PU4ubGVuZ3RoJiYzNjA2ND09PU5bMF18fChOWzBdPTM2MDY0LE4ubGVuZ3RoPTEsZT0hMCk7ZWxzZSAxPT09Ti5sZW5ndGgmJjEwMjk9PT1OWzBdfHwoTlswXT0xMDI5LE4ubGVuZ3RoPTEsZT0hMCk7ZSYmKEcuaXNXZWJHTDI/bXQuZHJhd0J1ZmZlcnMoTik6VS5nZXQoIldFQkdMX2RyYXdfYnVmZmVycyIpLmRyYXdCdWZmZXJzV0VCR0woTikpfWlmKFcudmlld3BvcnQoeCksVy5zY2lzc29yKE8pLFcuc2V0U2Npc3NvclRlc3QoUCksaSl7Y29uc3Qgbz1xLmdldCh0LnRleHR1cmUpO210LmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDM2MDY0LDM0MDY5K2Usby5fX3dlYmdsVGV4dHVyZSxuKX1lbHNlIGlmKGEpe2NvbnN0IG89cS5nZXQodC50ZXh0dXJlKTttdC5mcmFtZWJ1ZmZlclRleHR1cmVMYXllcigzNjE2MCwzNjA2NCxvLl9fd2ViZ2xUZXh0dXJlLG58fDAsZXx8MCl9fSx0aGlzLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM9ZnVuY3Rpb24odCxlLG4sbyxpLGEscil7aWYoIXR8fCF0LmlzV2ViR0xSZW5kZXJUYXJnZXQpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0LiIpO2xldCBzPXEuZ2V0KHQpLl9fd2ViZ2xGcmFtZWJ1ZmZlcjtpZih0LmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0JiZ2b2lkIDAhPT1yJiYocz1zW3JdKSxzKXtXLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxzKTt0cnl7Y29uc3Qgcj10LnRleHR1cmUscz1yLmZvcm1hdCxsPXIudHlwZTtpZihzIT09d2l0JiZkdC5jb252ZXJ0KHMpIT09bXQuZ2V0UGFyYW1ldGVyKDM1NzM5KSlyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZvcm1hdC4iKTtjb25zdCBjPWw9PT14aXQmJihVLmhhcygiRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0Iil8fEcuaXNXZWJHTDImJlUuaGFzKCJFWFRfY29sb3JfYnVmZmVyX2Zsb2F0IikpO2lmKCEobD09PV9pdHx8ZHQuY29udmVydChsKT09PW10LmdldFBhcmFtZXRlcigzNTczOCl8fGw9PT12aXQmJihHLmlzV2ViR0wyfHxVLmhhcygiT0VTX3RleHR1cmVfZmxvYXQiKXx8VS5oYXMoIldFQkdMX2NvbG9yX2J1ZmZlcl9mbG9hdCIpKXx8YykpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IGluIFVuc2lnbmVkQnl0ZVR5cGUgb3IgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB0eXBlLiIpOzM2MDUzPT09bXQuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cygzNjE2MCk/ZT49MCYmZTw9dC53aWR0aC1vJiZuPj0wJiZuPD10LmhlaWdodC1pJiZtdC5yZWFkUGl4ZWxzKGUsbixvLGksZHQuY29udmVydChzKSxkdC5jb252ZXJ0KGwpLGEpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVhZFBpeGVscyBmcm9tIHJlbmRlclRhcmdldCBmYWlsZWQuIEZyYW1lYnVmZmVyIG5vdCBjb21wbGV0ZS4iKX1maW5hbGx5e2NvbnN0IHQ9bnVsbCE9PUM/cS5nZXQoQykuX193ZWJnbEZyYW1lYnVmZmVyOm51bGw7Vy5iaW5kRnJhbWVidWZmZXIoMzYxNjAsdCl9fX0sdGhpcy5jb3B5RnJhbWVidWZmZXJUb1RleHR1cmU9ZnVuY3Rpb24odCxlLG49MCl7Y29uc3Qgbz1NYXRoLnBvdygyLC1uKSxpPU1hdGguZmxvb3IoZS5pbWFnZS53aWR0aCpvKSxhPU1hdGguZmxvb3IoZS5pbWFnZS5oZWlnaHQqbyk7bGV0IHI9ZHQuY29udmVydChlLmZvcm1hdCk7Ry5pc1dlYkdMMiYmKDY0MDc9PT1yJiYocj0zMjg0OSksNjQwOD09PXImJihyPTMyODU2KSksWi5zZXRUZXh0dXJlMkQoZSwwKSxtdC5jb3B5VGV4SW1hZ2UyRCgzNTUzLG4scix0LngsdC55LGksYSwwKSxXLnVuYmluZFRleHR1cmUoKX0sdGhpcy5jb3B5VGV4dHVyZVRvVGV4dHVyZT1mdW5jdGlvbih0LGUsbixvPTApe2NvbnN0IGk9ZS5pbWFnZS53aWR0aCxhPWUuaW1hZ2UuaGVpZ2h0LHI9ZHQuY29udmVydChuLmZvcm1hdCkscz1kdC5jb252ZXJ0KG4udHlwZSk7Wi5zZXRUZXh0dXJlMkQobiwwKSxtdC5waXhlbFN0b3JlaSgzNzQ0MCxuLmZsaXBZKSxtdC5waXhlbFN0b3JlaSgzNzQ0MSxuLnByZW11bHRpcGx5QWxwaGEpLG10LnBpeGVsU3RvcmVpKDMzMTcsbi51bnBhY2tBbGlnbm1lbnQpLGUuaXNEYXRhVGV4dHVyZT9tdC50ZXhTdWJJbWFnZTJEKDM1NTMsbyx0LngsdC55LGksYSxyLHMsZS5pbWFnZS5kYXRhKTplLmlzQ29tcHJlc3NlZFRleHR1cmU/bXQuY29tcHJlc3NlZFRleFN1YkltYWdlMkQoMzU1MyxvLHQueCx0LnksZS5taXBtYXBzWzBdLndpZHRoLGUubWlwbWFwc1swXS5oZWlnaHQscixlLm1pcG1hcHNbMF0uZGF0YSk6bXQudGV4U3ViSW1hZ2UyRCgzNTUzLG8sdC54LHQueSxyLHMsZS5pbWFnZSksMD09PW8mJm4uZ2VuZXJhdGVNaXBtYXBzJiZtdC5nZW5lcmF0ZU1pcG1hcCgzNTUzKSxXLnVuYmluZFRleHR1cmUoKX0sdGhpcy5jb3B5VGV4dHVyZVRvVGV4dHVyZTNEPWZ1bmN0aW9uKHQsZSxuLG8saT0wKXtpZihoLmlzV2ViR0wxUmVuZGVyZXIpcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyLmNvcHlUZXh0dXJlVG9UZXh0dXJlM0Q6IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIik7Y29uc3QgYT10Lm1heC54LXQubWluLngrMSxyPXQubWF4LnktdC5taW4ueSsxLHM9dC5tYXguei10Lm1pbi56KzEsbD1kdC5jb252ZXJ0KG8uZm9ybWF0KSxjPWR0LmNvbnZlcnQoby50eXBlKTtsZXQgZDtpZihvLmlzRGF0YVRleHR1cmUzRClaLnNldFRleHR1cmUzRChvLDApLGQ9MzI4Nzk7ZWxzZXtpZighby5pc0RhdGFUZXh0dXJlMkRBcnJheSlyZXR1cm4gdm9pZCBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXIuY29weVRleHR1cmVUb1RleHR1cmUzRDogb25seSBzdXBwb3J0cyBUSFJFRS5EYXRhVGV4dHVyZTNEIGFuZCBUSFJFRS5EYXRhVGV4dHVyZTJEQXJyYXkuIik7Wi5zZXRUZXh0dXJlMkRBcnJheShvLDApLGQ9MzU4NjZ9bXQucGl4ZWxTdG9yZWkoMzc0NDAsby5mbGlwWSksbXQucGl4ZWxTdG9yZWkoMzc0NDEsby5wcmVtdWx0aXBseUFscGhhKSxtdC5waXhlbFN0b3JlaSgzMzE3LG8udW5wYWNrQWxpZ25tZW50KTtjb25zdCBwPW10LmdldFBhcmFtZXRlcigzMzE0KSxtPW10LmdldFBhcmFtZXRlcigzMjg3OCksdT1tdC5nZXRQYXJhbWV0ZXIoMzMxNiksZj1tdC5nZXRQYXJhbWV0ZXIoMzMxNSksZz1tdC5nZXRQYXJhbWV0ZXIoMzI4NzcpLGI9bi5pc0NvbXByZXNzZWRUZXh0dXJlP24ubWlwbWFwc1swXTpuLmltYWdlO210LnBpeGVsU3RvcmVpKDMzMTQsYi53aWR0aCksbXQucGl4ZWxTdG9yZWkoMzI4NzgsYi5oZWlnaHQpLG10LnBpeGVsU3RvcmVpKDMzMTYsdC5taW4ueCksbXQucGl4ZWxTdG9yZWkoMzMxNSx0Lm1pbi55KSxtdC5waXhlbFN0b3JlaSgzMjg3Nyx0Lm1pbi56KSxuLmlzRGF0YVRleHR1cmV8fG4uaXNEYXRhVGV4dHVyZTNEP210LnRleFN1YkltYWdlM0QoZCxpLGUueCxlLnksZS56LGEscixzLGwsYyxiLmRhdGEpOm4uaXNDb21wcmVzc2VkVGV4dHVyZT8oY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyLmNvcHlUZXh0dXJlVG9UZXh0dXJlM0Q6IHVudGVzdGVkIHN1cHBvcnQgZm9yIGNvbXByZXNzZWQgc3JjVGV4dHVyZS4iKSxtdC5jb21wcmVzc2VkVGV4U3ViSW1hZ2UzRChkLGksZS54LGUueSxlLnosYSxyLHMsbCxiLmRhdGEpKTptdC50ZXhTdWJJbWFnZTNEKGQsaSxlLngsZS55LGUueixhLHIscyxsLGMsYiksbXQucGl4ZWxTdG9yZWkoMzMxNCxwKSxtdC5waXhlbFN0b3JlaSgzMjg3OCxtKSxtdC5waXhlbFN0b3JlaSgzMzE2LHUpLG10LnBpeGVsU3RvcmVpKDMzMTUsZiksbXQucGl4ZWxTdG9yZWkoMzI4NzcsZyksMD09PWkmJm8uZ2VuZXJhdGVNaXBtYXBzJiZtdC5nZW5lcmF0ZU1pcG1hcChkKSxXLnVuYmluZFRleHR1cmUoKX0sdGhpcy5pbml0VGV4dHVyZT1mdW5jdGlvbih0KXtaLnNldFRleHR1cmUyRCh0LDApLFcudW5iaW5kVGV4dHVyZSgpfSx0aGlzLnJlc2V0U3RhdGU9ZnVuY3Rpb24oKXt5PTAsXz0wLEM9bnVsbCxXLnJlc2V0KCkscHQucmVzZXQoKX0sInVuZGVmaW5lZCIhPXR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18mJl9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgib2JzZXJ2ZSIse2RldGFpbDp0aGlzfSkpfShjbGFzcyBleHRlbmRzIGJkdHt9KS5wcm90b3R5cGUuaXNXZWJHTDFSZW5kZXJlcj0hMDtjbGFzcyB5ZHQgZXh0ZW5kcyBwcnR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudHlwZT0iU2NlbmUiLHRoaXMuYmFja2dyb3VuZD1udWxsLHRoaXMuZW52aXJvbm1lbnQ9bnVsbCx0aGlzLmZvZz1udWxsLHRoaXMub3ZlcnJpZGVNYXRlcmlhbD1udWxsLHRoaXMuYXV0b1VwZGF0ZT0hMCwidW5kZWZpbmVkIiE9dHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyYmX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJvYnNlcnZlIix7ZGV0YWlsOnRoaXN9KSl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksbnVsbCE9PXQuYmFja2dyb3VuZCYmKHRoaXMuYmFja2dyb3VuZD10LmJhY2tncm91bmQuY2xvbmUoKSksbnVsbCE9PXQuZW52aXJvbm1lbnQmJih0aGlzLmVudmlyb25tZW50PXQuZW52aXJvbm1lbnQuY2xvbmUoKSksbnVsbCE9PXQuZm9nJiYodGhpcy5mb2c9dC5mb2cuY2xvbmUoKSksbnVsbCE9PXQub3ZlcnJpZGVNYXRlcmlhbCYmKHRoaXMub3ZlcnJpZGVNYXRlcmlhbD10Lm92ZXJyaWRlTWF0ZXJpYWwuY2xvbmUoKSksdGhpcy5hdXRvVXBkYXRlPXQuYXV0b1VwZGF0ZSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlLHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO3JldHVybiBudWxsIT09dGhpcy5mb2cmJihlLm9iamVjdC5mb2c9dGhpcy5mb2cudG9KU09OKCkpLGV9fXlkdC5wcm90b3R5cGUuaXNTY2VuZT0hMDtjbGFzcyBfZHR7Y29uc3RydWN0b3IodCxlKXt0aGlzLmFycmF5PXQsdGhpcy5zdHJpZGU9ZSx0aGlzLmNvdW50PXZvaWQgMCE9PXQ/dC5sZW5ndGgvZTowLHRoaXMudXNhZ2U9Qml0LHRoaXMudXBkYXRlUmFuZ2U9e29mZnNldDowLGNvdW50Oi0xfSx0aGlzLnZlcnNpb249MCx0aGlzLnV1aWQ9cWl0KCl9b25VcGxvYWRDYWxsYmFjaygpe31zZXQgbmVlZHNVcGRhdGUodCl7ITA9PT10JiZ0aGlzLnZlcnNpb24rK31zZXRVc2FnZSh0KXtyZXR1cm4gdGhpcy51c2FnZT10LHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5hcnJheT1uZXcgdC5hcnJheS5jb25zdHJ1Y3Rvcih0LmFycmF5KSx0aGlzLmNvdW50PXQuY291bnQsdGhpcy5zdHJpZGU9dC5zdHJpZGUsdGhpcy51c2FnZT10LnVzYWdlLHRoaXN9Y29weUF0KHQsZSxuKXt0Kj10aGlzLnN0cmlkZSxuKj1lLnN0cmlkZTtmb3IobGV0IG89MCxpPXRoaXMuc3RyaWRlO288aTtvKyspdGhpcy5hcnJheVt0K29dPWUuYXJyYXlbbitvXTtyZXR1cm4gdGhpc31zZXQodCxlPTApe3JldHVybiB0aGlzLmFycmF5LnNldCh0LGUpLHRoaXN9Y2xvbmUodCl7dm9pZCAwPT09dC5hcnJheUJ1ZmZlcnMmJih0LmFycmF5QnVmZmVycz17fSksdm9pZCAwPT09dGhpcy5hcnJheS5idWZmZXIuX3V1aWQmJih0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZD1xaXQoKSksdm9pZCAwPT09dC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdJiYodC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPXRoaXMuYXJyYXkuc2xpY2UoMCkuYnVmZmVyKTtjb25zdCBlPW5ldyB0aGlzLmFycmF5LmNvbnN0cnVjdG9yKHQuYXJyYXlCdWZmZXJzW3RoaXMuYXJyYXkuYnVmZmVyLl91dWlkXSksbj1uZXcgdGhpcy5jb25zdHJ1Y3RvcihlLHRoaXMuc3RyaWRlKTtyZXR1cm4gbi5zZXRVc2FnZSh0aGlzLnVzYWdlKSxufW9uVXBsb2FkKHQpe3JldHVybiB0aGlzLm9uVXBsb2FkQ2FsbGJhY2s9dCx0aGlzfXRvSlNPTih0KXtyZXR1cm4gdm9pZCAwPT09dC5hcnJheUJ1ZmZlcnMmJih0LmFycmF5QnVmZmVycz17fSksdm9pZCAwPT09dGhpcy5hcnJheS5idWZmZXIuX3V1aWQmJih0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZD1xaXQoKSksdm9pZCAwPT09dC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdJiYodC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5LmJ1ZmZlcikpKSx7dXVpZDp0aGlzLnV1aWQsYnVmZmVyOnRoaXMuYXJyYXkuYnVmZmVyLl91dWlkLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLHN0cmlkZTp0aGlzLnN0cmlkZX19fV9kdC5wcm90b3R5cGUuaXNJbnRlcmxlYXZlZEJ1ZmZlcj0hMDtjb25zdCBDZHQ9bmV3IGNhdDtjbGFzcyBNZHR7Y29uc3RydWN0b3IodCxlLG4sbz0hMSl7dGhpcy5uYW1lPSIiLHRoaXMuZGF0YT10LHRoaXMuaXRlbVNpemU9ZSx0aGlzLm9mZnNldD1uLHRoaXMubm9ybWFsaXplZD0hMD09PW99Z2V0IGNvdW50KCl7cmV0dXJuIHRoaXMuZGF0YS5jb3VudH1nZXQgYXJyYXkoKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5fXNldCBuZWVkc1VwZGF0ZSh0KXt0aGlzLmRhdGEubmVlZHNVcGRhdGU9dH1hcHBseU1hdHJpeDQodCl7Zm9yKGxldCBlPTAsbj10aGlzLmRhdGEuY291bnQ7ZTxuO2UrKylDZHQueD10aGlzLmdldFgoZSksQ2R0Lnk9dGhpcy5nZXRZKGUpLENkdC56PXRoaXMuZ2V0WihlKSxDZHQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0WFlaKGUsQ2R0LngsQ2R0LnksQ2R0LnopO3JldHVybiB0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKUNkdC54PXRoaXMuZ2V0WChlKSxDZHQueT10aGlzLmdldFkoZSksQ2R0Lno9dGhpcy5nZXRaKGUpLENkdC5hcHBseU5vcm1hbE1hdHJpeCh0KSx0aGlzLnNldFhZWihlLENkdC54LENkdC55LENkdC56KTtyZXR1cm4gdGhpc310cmFuc2Zvcm1EaXJlY3Rpb24odCl7Zm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspQ2R0Lng9dGhpcy5nZXRYKGUpLENkdC55PXRoaXMuZ2V0WShlKSxDZHQuej10aGlzLmdldFooZSksQ2R0LnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzLnNldFhZWihlLENkdC54LENkdC55LENkdC56KTtyZXR1cm4gdGhpc31zZXRYKHQsZSl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXRdPWUsdGhpc31zZXRZKHQsZSl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMV09ZSx0aGlzfXNldFoodCxlKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCsyXT1lLHRoaXN9c2V0Vyh0LGUpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzNdPWUsdGhpc31nZXRYKHQpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0XX1nZXRZKHQpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzFdfWdldFoodCl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMl19Z2V0Vyh0KXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCszXX1zZXRYWSh0LGUsbil7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsodD10KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQpKzBdPWUsdGhpcy5kYXRhLmFycmF5W3QrMV09bix0aGlzfXNldFhZWih0LGUsbixvKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5Wyh0PXQqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCkrMF09ZSx0aGlzLmRhdGEuYXJyYXlbdCsxXT1uLHRoaXMuZGF0YS5hcnJheVt0KzJdPW8sdGhpc31zZXRYWVpXKHQsZSxuLG8saSl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsodD10KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQpKzBdPWUsdGhpcy5kYXRhLmFycmF5W3QrMV09bix0aGlzLmRhdGEuYXJyYXlbdCsyXT1vLHRoaXMuZGF0YS5hcnJheVt0KzNdPWksdGhpc31jbG9uZSh0KXtpZih2b2lkIDA9PT10KXtjb25zb2xlLmxvZygiVEhSRUUuSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUuY2xvbmUoKTogQ2xvbmluZyBhbiBpbnRlcmxhdmVkIGJ1ZmZlciBhdHRyaWJ1dGUgd2lsbCBkZWludGVybGVhdmUgYnVmZmVyIGRhdGEuIik7Y29uc3QgdD1bXTtmb3IobGV0IGU9MDtlPHRoaXMuY291bnQ7ZSsrKXtjb25zdCBuPWUqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldDtmb3IobGV0IGU9MDtlPHRoaXMuaXRlbVNpemU7ZSsrKXQucHVzaCh0aGlzLmRhdGEuYXJyYXlbbitlXSl9cmV0dXJuIG5ldyB6cnQobmV3IHRoaXMuYXJyYXkuY29uc3RydWN0b3IodCksdGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQpfXJldHVybiB2b2lkIDA9PT10LmludGVybGVhdmVkQnVmZmVycyYmKHQuaW50ZXJsZWF2ZWRCdWZmZXJzPXt9KSx2b2lkIDA9PT10LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF0mJih0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF09dGhpcy5kYXRhLmNsb25lKHQpKSxuZXcgTWR0KHQuaW50ZXJsZWF2ZWRCdWZmZXJzW3RoaXMuZGF0YS51dWlkXSx0aGlzLml0ZW1TaXplLHRoaXMub2Zmc2V0LHRoaXMubm9ybWFsaXplZCl9dG9KU09OKHQpe2lmKHZvaWQgMD09PXQpe2NvbnNvbGUubG9nKCJUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS50b0pTT04oKTogU2VyaWFsaXppbmcgYW4gaW50ZXJsYXZlZCBidWZmZXIgYXR0cmlidXRlIHdpbGwgZGVpbnRlcmxlYXZlIGJ1ZmZlciBkYXRhLiIpO2NvbnN0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLmNvdW50O2UrKyl7Y29uc3Qgbj1lKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQ7Zm9yKGxldCBlPTA7ZTx0aGlzLml0ZW1TaXplO2UrKyl0LnB1c2godGhpcy5kYXRhLmFycmF5W24rZV0pfXJldHVybntpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OnQsbm9ybWFsaXplZDp0aGlzLm5vcm1hbGl6ZWR9fXJldHVybiB2b2lkIDA9PT10LmludGVybGVhdmVkQnVmZmVycyYmKHQuaW50ZXJsZWF2ZWRCdWZmZXJzPXt9KSx2b2lkIDA9PT10LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF0mJih0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF09dGhpcy5kYXRhLnRvSlNPTih0KSkse2lzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6ITAsaXRlbVNpemU6dGhpcy5pdGVtU2l6ZSxkYXRhOnRoaXMuZGF0YS51dWlkLG9mZnNldDp0aGlzLm9mZnNldCxub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH19fU1kdC5wcm90b3R5cGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZT0hMDtjbGFzcyB2ZHQgZXh0ZW5kcyBPcnR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9IlNwcml0ZU1hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyBScnQoMTY3NzcyMTUpLHRoaXMubWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMucm90YXRpb249MCx0aGlzLnNpemVBdHRlbnVhdGlvbj0hMCx0aGlzLnRyYW5zcGFyZW50PSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubWFwPXQubWFwLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLnJvdGF0aW9uPXQucm90YXRpb24sdGhpcy5zaXplQXR0ZW51YXRpb249dC5zaXplQXR0ZW51YXRpb24sdGhpc319bGV0IHhkdDt2ZHQucHJvdG90eXBlLmlzU3ByaXRlTWF0ZXJpYWw9ITA7Y29uc3QgT2R0PW5ldyBjYXQsUGR0PW5ldyBjYXQsd2R0PW5ldyBjYXQsa2R0PW5ldyBRaXQsU2R0PW5ldyBRaXQsRGR0PW5ldyBCYXQsRWR0PW5ldyBjYXQsUmR0PW5ldyBjYXQsQWR0PW5ldyBjYXQsVGR0PW5ldyBRaXQsTmR0PW5ldyBRaXQsemR0PW5ldyBRaXQ7ZnVuY3Rpb24gSWR0KHQsZSxuLG8saSxhKXtrZHQuc3ViVmVjdG9ycyh0LG4pLmFkZFNjYWxhciguNSkubXVsdGlwbHkobyksdm9pZCAwIT09aT8oU2R0Lng9YSprZHQueC1pKmtkdC55LFNkdC55PWkqa2R0LngrYSprZHQueSk6U2R0LmNvcHkoa2R0KSx0LmNvcHkoZSksdC54Kz1TZHQueCx0LnkrPVNkdC55LHQuYXBwbHlNYXRyaXg0KERkdCl9KGNsYXNzIGV4dGVuZHMgcHJ0e2NvbnN0cnVjdG9yKHQpe2lmKHN1cGVyKCksdGhpcy50eXBlPSJTcHJpdGUiLHZvaWQgMD09PXhkdCl7eGR0PW5ldyBxcnQ7Y29uc3QgdD1uZXcgRmxvYXQzMkFycmF5KFstLjUsLS41LDAsMCwwLC41LC0uNSwwLDEsMCwuNSwuNSwwLDEsMSwtLjUsLjUsMCwwLDFdKSxlPW5ldyBfZHQodCw1KTt4ZHQuc2V0SW5kZXgoWzAsMSwyLDAsMiwzXSkseGR0LnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBNZHQoZSwzLDAsITEpKSx4ZHQuc2V0QXR0cmlidXRlKCJ1diIsbmV3IE1kdChlLDIsMywhMSkpfXRoaXMuZ2VvbWV0cnk9eGR0LHRoaXMubWF0ZXJpYWw9dm9pZCAwIT09dD90Om5ldyB2ZHQsdGhpcy5jZW50ZXI9bmV3IFFpdCguNSwuNSl9cmF5Y2FzdCh0LGUpe251bGw9PT10LmNhbWVyYSYmY29uc29sZS5lcnJvcignVEhSRUUuU3ByaXRlOiAiUmF5Y2FzdGVyLmNhbWVyYSIgbmVlZHMgdG8gYmUgc2V0IGluIG9yZGVyIHRvIHJheWNhc3QgYWdhaW5zdCBzcHJpdGVzLicpLFBkdC5zZXRGcm9tTWF0cml4U2NhbGUodGhpcy5tYXRyaXhXb3JsZCksRGR0LmNvcHkodC5jYW1lcmEubWF0cml4V29ybGQpLHRoaXMubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXModC5jYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLHRoaXMubWF0cml4V29ybGQpLHdkdC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tb2RlbFZpZXdNYXRyaXgpLHQuY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEmJiExPT09dGhpcy5tYXRlcmlhbC5zaXplQXR0ZW51YXRpb24mJlBkdC5tdWx0aXBseVNjYWxhcigtd2R0LnopO2NvbnN0IG49dGhpcy5tYXRlcmlhbC5yb3RhdGlvbjtsZXQgbyxpOzAhPT1uJiYoaT1NYXRoLmNvcyhuKSxvPU1hdGguc2luKG4pKTtjb25zdCBhPXRoaXMuY2VudGVyO0lkdChFZHQuc2V0KC0uNSwtLjUsMCksd2R0LGEsUGR0LG8saSksSWR0KFJkdC5zZXQoLjUsLS41LDApLHdkdCxhLFBkdCxvLGkpLElkdChBZHQuc2V0KC41LC41LDApLHdkdCxhLFBkdCxvLGkpLFRkdC5zZXQoMCwwKSxOZHQuc2V0KDEsMCksemR0LnNldCgxLDEpO2xldCByPXQucmF5LmludGVyc2VjdFRyaWFuZ2xlKEVkdCxSZHQsQWR0LCExLE9kdCk7aWYobnVsbD09PXImJihJZHQoUmR0LnNldCgtLjUsLjUsMCksd2R0LGEsUGR0LG8saSksTmR0LnNldCgwLDEpLHI9dC5yYXkuaW50ZXJzZWN0VHJpYW5nbGUoRWR0LEFkdCxSZHQsITEsT2R0KSxudWxsPT09cikpcmV0dXJuO2NvbnN0IHM9dC5yYXkub3JpZ2luLmRpc3RhbmNlVG8oT2R0KTtzPHQubmVhcnx8cz50LmZhcnx8ZS5wdXNoKHtkaXN0YW5jZTpzLHBvaW50Ok9kdC5jbG9uZSgpLHV2OnZydC5nZXRVVihPZHQsRWR0LFJkdCxBZHQsVGR0LE5kdCx6ZHQsbmV3IFFpdCksZmFjZTpudWxsLG9iamVjdDp0aGlzfSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx2b2lkIDAhPT10LmNlbnRlciYmdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5tYXRlcmlhbD10Lm1hdGVyaWFsLHRoaXN9fSkucHJvdG90eXBlLmlzU3ByaXRlPSEwO2NvbnN0IEhkdD1uZXcgY2F0LEZkdD1uZXcgYWF0LExkdD1uZXcgYWF0LEJkdD1uZXcgY2F0LFZkdD1uZXcgQmF0O2NsYXNzIGpkdCBleHRlbmRzIHBzdHtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy50eXBlPSJTa2lubmVkTWVzaCIsdGhpcy5iaW5kTW9kZT0iYXR0YWNoZWQiLHRoaXMuYmluZE1hdHJpeD1uZXcgQmF0LHRoaXMuYmluZE1hdHJpeEludmVyc2U9bmV3IEJhdH1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuYmluZE1vZGU9dC5iaW5kTW9kZSx0aGlzLmJpbmRNYXRyaXguY29weSh0LmJpbmRNYXRyaXgpLHRoaXMuYmluZE1hdHJpeEludmVyc2UuY29weSh0LmJpbmRNYXRyaXhJbnZlcnNlKSx0aGlzLnNrZWxldG9uPXQuc2tlbGV0b24sdGhpc31iaW5kKHQsZSl7dGhpcy5za2VsZXRvbj10LHZvaWQgMD09PWUmJih0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKSx0aGlzLnNrZWxldG9uLmNhbGN1bGF0ZUludmVyc2VzKCksZT10aGlzLm1hdHJpeFdvcmxkKSx0aGlzLmJpbmRNYXRyaXguY29weShlKSx0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkoZSkuaW52ZXJ0KCl9cG9zZSgpe3RoaXMuc2tlbGV0b24ucG9zZSgpfW5vcm1hbGl6ZVNraW5XZWlnaHRzKCl7Y29uc3QgdD1uZXcgYWF0LGU9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnNraW5XZWlnaHQ7Zm9yKGxldCBuPTAsbz1lLmNvdW50O248bztuKyspe3QueD1lLmdldFgobiksdC55PWUuZ2V0WShuKSx0Lno9ZS5nZXRaKG4pLHQudz1lLmdldFcobik7Y29uc3Qgbz0xL3QubWFuaGF0dGFuTGVuZ3RoKCk7byE9PTEvMD90Lm11bHRpcGx5U2NhbGFyKG8pOnQuc2V0KDEsMCwwLDApLGUuc2V0WFlaVyhuLHQueCx0LnksdC56LHQudyl9fXVwZGF0ZU1hdHJpeFdvcmxkKHQpe3N1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKHQpLCJhdHRhY2hlZCI9PT10aGlzLmJpbmRNb2RlP3RoaXMuYmluZE1hdHJpeEludmVyc2UuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKToiZGV0YWNoZWQiPT09dGhpcy5iaW5kTW9kZT90aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5iaW5kTWF0cml4KS5pbnZlcnQoKTpjb25zb2xlLndhcm4oIlRIUkVFLlNraW5uZWRNZXNoOiBVbnJlY29nbml6ZWQgYmluZE1vZGU6ICIrdGhpcy5iaW5kTW9kZSl9Ym9uZVRyYW5zZm9ybSh0LGUpe2NvbnN0IG49dGhpcy5za2VsZXRvbixvPXRoaXMuZ2VvbWV0cnk7RmR0LmZyb21CdWZmZXJBdHRyaWJ1dGUoby5hdHRyaWJ1dGVzLnNraW5JbmRleCx0KSxMZHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLmF0dHJpYnV0ZXMuc2tpbldlaWdodCx0KSxIZHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLmF0dHJpYnV0ZXMucG9zaXRpb24sdCkuYXBwbHlNYXRyaXg0KHRoaXMuYmluZE1hdHJpeCksZS5zZXQoMCwwLDApO2ZvcihsZXQgdD0wO3Q8NDt0Kyspe2NvbnN0IG89TGR0LmdldENvbXBvbmVudCh0KTtpZigwIT09byl7Y29uc3QgaT1GZHQuZ2V0Q29tcG9uZW50KHQpO1ZkdC5tdWx0aXBseU1hdHJpY2VzKG4uYm9uZXNbaV0ubWF0cml4V29ybGQsbi5ib25lSW52ZXJzZXNbaV0pLGUuYWRkU2NhbGVkVmVjdG9yKEJkdC5jb3B5KEhkdCkuYXBwbHlNYXRyaXg0KFZkdCksbyl9fXJldHVybiBlLmFwcGx5TWF0cml4NCh0aGlzLmJpbmRNYXRyaXhJbnZlcnNlKX19amR0LnByb3RvdHlwZS5pc1NraW5uZWRNZXNoPSEwLGNsYXNzIGV4dGVuZHMgcHJ0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnR5cGU9IkJvbmUifX0ucHJvdG90eXBlLmlzQm9uZT0hMCxjbGFzcyBleHRlbmRzIG9hdHtjb25zdHJ1Y3Rvcih0PW51bGwsZT0xLG49MSxvLGksYSxyLHMsbD0xMDAzLGM9MTAwMyxkLHApe3N1cGVyKG51bGwsYSxyLHMsbCxjLG8saSxkLHApLHRoaXMuaW1hZ2U9e2RhdGE6dCx3aWR0aDplLGhlaWdodDpufSx0aGlzLm1hZ0ZpbHRlcj1sLHRoaXMubWluRmlsdGVyPWMsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITEsdGhpcy5mbGlwWT0hMSx0aGlzLnVucGFja0FsaWdubWVudD0xLHRoaXMubmVlZHNVcGRhdGU9ITB9fS5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZT0hMDtjb25zdCBVZHQ9bmV3IEJhdCxHZHQ9bmV3IEJhdCxXZHQ9W10sWWR0PW5ldyBwc3Q7KGNsYXNzIGV4dGVuZHMgcHN0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcih0LGUpLHRoaXMuaW5zdGFuY2VNYXRyaXg9bmV3IHpydChuZXcgRmxvYXQzMkFycmF5KDE2Km4pLDE2KSx0aGlzLmluc3RhbmNlQ29sb3I9bnVsbCx0aGlzLmNvdW50PW4sdGhpcy5mcnVzdHVtQ3VsbGVkPSExfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5pbnN0YW5jZU1hdHJpeC5jb3B5KHQuaW5zdGFuY2VNYXRyaXgpLG51bGwhPT10Lmluc3RhbmNlQ29sb3ImJih0aGlzLmluc3RhbmNlQ29sb3I9dC5pbnN0YW5jZUNvbG9yLmNsb25lKCkpLHRoaXMuY291bnQ9dC5jb3VudCx0aGlzfWdldENvbG9yQXQodCxlKXtlLmZyb21BcnJheSh0aGlzLmluc3RhbmNlQ29sb3IuYXJyYXksMyp0KX1nZXRNYXRyaXhBdCh0LGUpe2UuZnJvbUFycmF5KHRoaXMuaW5zdGFuY2VNYXRyaXguYXJyYXksMTYqdCl9cmF5Y2FzdCh0LGUpe2NvbnN0IG49dGhpcy5tYXRyaXhXb3JsZCxvPXRoaXMuY291bnQ7aWYoWWR0Lmdlb21ldHJ5PXRoaXMuZ2VvbWV0cnksWWR0Lm1hdGVyaWFsPXRoaXMubWF0ZXJpYWwsdm9pZCAwIT09WWR0Lm1hdGVyaWFsKWZvcihsZXQgaT0wO2k8bztpKyspe3RoaXMuZ2V0TWF0cml4QXQoaSxVZHQpLEdkdC5tdWx0aXBseU1hdHJpY2VzKG4sVWR0KSxZZHQubWF0cml4V29ybGQ9R2R0LFlkdC5yYXljYXN0KHQsV2R0KTtmb3IobGV0IHQ9MCxuPVdkdC5sZW5ndGg7dDxuO3QrKyl7Y29uc3Qgbj1XZHRbdF07bi5pbnN0YW5jZUlkPWksbi5vYmplY3Q9dGhpcyxlLnB1c2gobil9V2R0Lmxlbmd0aD0wfX1zZXRDb2xvckF0KHQsZSl7bnVsbD09PXRoaXMuaW5zdGFuY2VDb2xvciYmKHRoaXMuaW5zdGFuY2VDb2xvcj1uZXcgenJ0KG5ldyBGbG9hdDMyQXJyYXkoMyp0aGlzLmluc3RhbmNlTWF0cml4LmNvdW50KSwzKSksZS50b0FycmF5KHRoaXMuaW5zdGFuY2VDb2xvci5hcnJheSwzKnQpfXNldE1hdHJpeEF0KHQsZSl7ZS50b0FycmF5KHRoaXMuaW5zdGFuY2VNYXRyaXguYXJyYXksMTYqdCl9dXBkYXRlTW9ycGhUYXJnZXRzKCl7fWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fSkucHJvdG90eXBlLmlzSW5zdGFuY2VkTWVzaD0hMDtjbGFzcyBxZHQgZXh0ZW5kcyBPcnR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9IkxpbmVCYXNpY01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyBScnQoMTY3NzcyMTUpLHRoaXMubGluZXdpZHRoPTEsdGhpcy5saW5lY2FwPSJyb3VuZCIsdGhpcy5saW5lam9pbj0icm91bmQiLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubGluZXdpZHRoPXQubGluZXdpZHRoLHRoaXMubGluZWNhcD10LmxpbmVjYXAsdGhpcy5saW5lam9pbj10LmxpbmVqb2luLHRoaXN9fXFkdC5wcm90b3R5cGUuaXNMaW5lQmFzaWNNYXRlcmlhbD0hMDtjb25zdCBaZHQ9bmV3IGNhdCxYZHQ9bmV3IGNhdCxLZHQ9bmV3IEJhdCxKZHQ9bmV3IExhdCxRZHQ9bmV3IFJhdDtjbGFzcyAkZHQgZXh0ZW5kcyBwcnR7Y29uc3RydWN0b3IodD1uZXcgcXJ0LGU9bmV3IHFkdCl7c3VwZXIoKSx0aGlzLnR5cGU9IkxpbmUiLHRoaXMuZ2VvbWV0cnk9dCx0aGlzLm1hdGVyaWFsPWUsdGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMubWF0ZXJpYWw9dC5tYXRlcmlhbCx0aGlzLmdlb21ldHJ5PXQuZ2VvbWV0cnksdGhpc31jb21wdXRlTGluZURpc3RhbmNlcygpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeTtpZih0LmlzQnVmZmVyR2VvbWV0cnkpaWYobnVsbD09PXQuaW5kZXgpe2NvbnN0IGU9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLG49WzBdO2ZvcihsZXQgdD0xLG89ZS5jb3VudDt0PG87dCsrKVpkdC5mcm9tQnVmZmVyQXR0cmlidXRlKGUsdC0xKSxYZHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHQpLG5bdF09blt0LTFdLG5bdF0rPVpkdC5kaXN0YW5jZVRvKFhkdCk7dC5zZXRBdHRyaWJ1dGUoImxpbmVEaXN0YW5jZSIsbmV3IEZydChuLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuIik7ZWxzZSB0LmlzR2VvbWV0cnkmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzfXJheWNhc3QodCxlKXtjb25zdCBuPXRoaXMuZ2VvbWV0cnksbz10aGlzLm1hdHJpeFdvcmxkLGk9dC5wYXJhbXMuTGluZS50aHJlc2hvbGQsYT1uLmRyYXdSYW5nZTtpZihudWxsPT09bi5ib3VuZGluZ1NwaGVyZSYmbi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxRZHQuY29weShuLmJvdW5kaW5nU3BoZXJlKSxRZHQuYXBwbHlNYXRyaXg0KG8pLFFkdC5yYWRpdXMrPWksITE9PT10LnJheS5pbnRlcnNlY3RzU3BoZXJlKFFkdCkpcmV0dXJuO0tkdC5jb3B5KG8pLmludmVydCgpLEpkdC5jb3B5KHQucmF5KS5hcHBseU1hdHJpeDQoS2R0KTtjb25zdCByPWkvKCh0aGlzLnNjYWxlLngrdGhpcy5zY2FsZS55K3RoaXMuc2NhbGUueikvMykscz1yKnIsbD1uZXcgY2F0LGM9bmV3IGNhdCxkPW5ldyBjYXQscD1uZXcgY2F0LG09dGhpcy5pc0xpbmVTZWdtZW50cz8yOjE7aWYobi5pc0J1ZmZlckdlb21ldHJ5KXtjb25zdCBvPW4uaW5kZXgsaT1uLmF0dHJpYnV0ZXMucG9zaXRpb247aWYobnVsbCE9PW8pZm9yKGxldCBuPU1hdGgubWF4KDAsYS5zdGFydCkscj1NYXRoLm1pbihvLmNvdW50LGEuc3RhcnQrYS5jb3VudCktMTtuPHI7bis9bSl7Y29uc3QgYT1vLmdldFgobikscj1vLmdldFgobisxKTtpZihsLmZyb21CdWZmZXJBdHRyaWJ1dGUoaSxhKSxjLmZyb21CdWZmZXJBdHRyaWJ1dGUoaSxyKSxKZHQuZGlzdGFuY2VTcVRvU2VnbWVudChsLGMscCxkKT5zKWNvbnRpbnVlO3AuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpO2NvbnN0IG09dC5yYXkub3JpZ2luLmRpc3RhbmNlVG8ocCk7bTx0Lm5lYXJ8fG0+dC5mYXJ8fGUucHVzaCh7ZGlzdGFuY2U6bSxwb2ludDpkLmNsb25lKCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLGluZGV4Om4sZmFjZTpudWxsLGZhY2VJbmRleDpudWxsLG9iamVjdDp0aGlzfSl9ZWxzZSBmb3IobGV0IG49TWF0aC5tYXgoMCxhLnN0YXJ0KSxvPU1hdGgubWluKGkuY291bnQsYS5zdGFydCthLmNvdW50KS0xO248bztuKz1tKXtpZihsLmZyb21CdWZmZXJBdHRyaWJ1dGUoaSxuKSxjLmZyb21CdWZmZXJBdHRyaWJ1dGUoaSxuKzEpLEpkdC5kaXN0YW5jZVNxVG9TZWdtZW50KGwsYyxwLGQpPnMpY29udGludWU7cC5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCk7Y29uc3Qgbz10LnJheS5vcmlnaW4uZGlzdGFuY2VUbyhwKTtvPHQubmVhcnx8bz50LmZhcnx8ZS5wdXNoKHtkaXN0YW5jZTpvLHBvaW50OmQuY2xvbmUoKS5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCksaW5kZXg6bixmYWNlOm51bGwsZmFjZUluZGV4Om51bGwsb2JqZWN0OnRoaXN9KX19ZWxzZSBuLmlzR2VvbWV0cnkmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLkxpbmUucmF5Y2FzdCgpIG5vIGxvbmdlciBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIil9dXBkYXRlTW9ycGhUYXJnZXRzKCl7Y29uc3QgdD10aGlzLmdlb21ldHJ5O2lmKHQuaXNCdWZmZXJHZW9tZXRyeSl7Y29uc3QgZT10Lm1vcnBoQXR0cmlidXRlcyxuPU9iamVjdC5rZXlzKGUpO2lmKG4ubGVuZ3RoPjApe2NvbnN0IHQ9ZVtuWzBdXTtpZih2b2lkIDAhPT10KXt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1bXSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT17fTtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspe2NvbnN0IG49dFtlXS5uYW1lfHxTdHJpbmcoZSk7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCgwKSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVtuXT1lfX19fWVsc2V7Y29uc3QgZT10Lm1vcnBoVGFyZ2V0czt2b2lkIDAhPT1lJiZlLmxlbmd0aD4wJiZjb25zb2xlLmVycm9yKCJUSFJFRS5MaW5lLnVwZGF0ZU1vcnBoVGFyZ2V0cygpIGRvZXMgbm90IHN1cHBvcnQgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpfX19JGR0LnByb3RvdHlwZS5pc0xpbmU9ITA7Y29uc3QgdHB0PW5ldyBjYXQsZXB0PW5ldyBjYXQ7Y2xhc3MgbnB0IGV4dGVuZHMgJGR0e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLnR5cGU9IkxpbmVTZWdtZW50cyJ9Y29tcHV0ZUxpbmVEaXN0YW5jZXMoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnk7aWYodC5pc0J1ZmZlckdlb21ldHJ5KWlmKG51bGw9PT10LmluZGV4KXtjb25zdCBlPXQuYXR0cmlidXRlcy5wb3NpdGlvbixuPVtdO2ZvcihsZXQgdD0wLG89ZS5jb3VudDt0PG87dCs9Mil0cHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHQpLGVwdC5mcm9tQnVmZmVyQXR0cmlidXRlKGUsdCsxKSxuW3RdPTA9PT10PzA6blt0LTFdLG5bdCsxXT1uW3RdK3RwdC5kaXN0YW5jZVRvKGVwdCk7dC5zZXRBdHRyaWJ1dGUoImxpbmVEaXN0YW5jZSIsbmV3IEZydChuLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZVNlZ21lbnRzLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4iKTtlbHNlIHQuaXNHZW9tZXRyeSYmY29uc29sZS5lcnJvcigiVEhSRUUuTGluZVNlZ21lbnRzLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCkgbm8gbG9uZ2VyIHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpc319bnB0LnByb3RvdHlwZS5pc0xpbmVTZWdtZW50cz0hMCxjbGFzcyBleHRlbmRzICRkdHtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy50eXBlPSJMaW5lTG9vcCJ9fS5wcm90b3R5cGUuaXNMaW5lTG9vcD0hMDtjbGFzcyBvcHQgZXh0ZW5kcyBPcnR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9IlBvaW50c01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyBScnQoMTY3NzcyMTUpLHRoaXMubWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuc2l6ZT0xLHRoaXMuc2l6ZUF0dGVudWF0aW9uPSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubWFwPXQubWFwLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLnNpemU9dC5zaXplLHRoaXMuc2l6ZUF0dGVudWF0aW9uPXQuc2l6ZUF0dGVudWF0aW9uLHRoaXN9fW9wdC5wcm90b3R5cGUuaXNQb2ludHNNYXRlcmlhbD0hMDtjb25zdCBpcHQ9bmV3IEJhdCxhcHQ9bmV3IExhdCxycHQ9bmV3IFJhdCxzcHQ9bmV3IGNhdDtmdW5jdGlvbiBscHQodCxlLG4sbyxpLGEscil7Y29uc3Qgcz1hcHQuZGlzdGFuY2VTcVRvUG9pbnQodCk7aWYoczxuKXtjb25zdCBuPW5ldyBjYXQ7YXB0LmNsb3Nlc3RQb2ludFRvUG9pbnQodCxuKSxuLmFwcGx5TWF0cml4NChvKTtjb25zdCBsPWkucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKG4pO2lmKGw8aS5uZWFyfHxsPmkuZmFyKXJldHVybjthLnB1c2goe2Rpc3RhbmNlOmwsZGlzdGFuY2VUb1JheTpNYXRoLnNxcnQocykscG9pbnQ6bixpbmRleDplLGZhY2U6bnVsbCxvYmplY3Q6cn0pfX0oY2xhc3MgZXh0ZW5kcyBwcnR7Y29uc3RydWN0b3IodD1uZXcgcXJ0LGU9bmV3IG9wdCl7c3VwZXIoKSx0aGlzLnR5cGU9IlBvaW50cyIsdGhpcy5nZW9tZXRyeT10LHRoaXMubWF0ZXJpYWw9ZSx0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5tYXRlcmlhbD10Lm1hdGVyaWFsLHRoaXMuZ2VvbWV0cnk9dC5nZW9tZXRyeSx0aGlzfXJheWNhc3QodCxlKXtjb25zdCBuPXRoaXMuZ2VvbWV0cnksbz10aGlzLm1hdHJpeFdvcmxkLGk9dC5wYXJhbXMuUG9pbnRzLnRocmVzaG9sZCxhPW4uZHJhd1JhbmdlO2lmKG51bGw9PT1uLmJvdW5kaW5nU3BoZXJlJiZuLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHJwdC5jb3B5KG4uYm91bmRpbmdTcGhlcmUpLHJwdC5hcHBseU1hdHJpeDQobykscnB0LnJhZGl1cys9aSwhMT09PXQucmF5LmludGVyc2VjdHNTcGhlcmUocnB0KSlyZXR1cm47aXB0LmNvcHkobykuaW52ZXJ0KCksYXB0LmNvcHkodC5yYXkpLmFwcGx5TWF0cml4NChpcHQpO2NvbnN0IHI9aS8oKHRoaXMuc2NhbGUueCt0aGlzLnNjYWxlLnkrdGhpcy5zY2FsZS56KS8zKSxzPXIqcjtpZihuLmlzQnVmZmVyR2VvbWV0cnkpe2NvbnN0IGk9bi5pbmRleCxyPW4uYXR0cmlidXRlcy5wb3NpdGlvbjtpZihudWxsIT09aSlmb3IobGV0IG49TWF0aC5tYXgoMCxhLnN0YXJ0KSxsPU1hdGgubWluKGkuY291bnQsYS5zdGFydCthLmNvdW50KTtuPGw7bisrKXtjb25zdCBhPWkuZ2V0WChuKTtzcHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLGEpLGxwdChzcHQsYSxzLG8sdCxlLHRoaXMpfWVsc2UgZm9yKGxldCBuPU1hdGgubWF4KDAsYS5zdGFydCksaT1NYXRoLm1pbihyLmNvdW50LGEuc3RhcnQrYS5jb3VudCk7bjxpO24rKylzcHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLG4pLGxwdChzcHQsbixzLG8sdCxlLHRoaXMpfWVsc2UgY29uc29sZS5lcnJvcigiVEhSRUUuUG9pbnRzLnJheWNhc3QoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpfXVwZGF0ZU1vcnBoVGFyZ2V0cygpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeTtpZih0LmlzQnVmZmVyR2VvbWV0cnkpe2NvbnN0IGU9dC5tb3JwaEF0dHJpYnV0ZXMsbj1PYmplY3Qua2V5cyhlKTtpZihuLmxlbmd0aD4wKXtjb25zdCB0PWVbblswXV07aWYodm9pZCAwIT09dCl7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9W10sdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9e307Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXtjb25zdCBuPXRbZV0ubmFtZXx8U3RyaW5nKGUpO3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goMCksdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbbl09ZX19fX1lbHNle2NvbnN0IGU9dC5tb3JwaFRhcmdldHM7dm9pZCAwIT09ZSYmZS5sZW5ndGg+MCYmY29uc29sZS5lcnJvcigiVEhSRUUuUG9pbnRzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpIGRvZXMgbm90IHN1cHBvcnQgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpfX19KS5wcm90b3R5cGUuaXNQb2ludHM9ITAsY2xhc3MgZXh0ZW5kcyBvYXR7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEscixzLGwpe3N1cGVyKHQsZSxuLG8saSxhLHIscyxsKSx0aGlzLmZvcm1hdD12b2lkIDAhPT1yP3I6UGl0LHRoaXMubWluRmlsdGVyPXZvaWQgMCE9PWE/YTpiaXQsdGhpcy5tYWdGaWx0ZXI9dm9pZCAwIT09aT9pOmJpdCx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMTtjb25zdCBjPXRoaXM7InJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2siaW4gdCYmdC5yZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrKChmdW5jdGlvbiBlKCl7Yy5uZWVkc1VwZGF0ZT0hMCx0LnJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2soZSl9KSl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5pbWFnZSkuY29weSh0aGlzKX11cGRhdGUoKXtjb25zdCB0PXRoaXMuaW1hZ2U7MD09InJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2siaW4gdCYmdC5yZWFkeVN0YXRlPj10LkhBVkVfQ1VSUkVOVF9EQVRBJiYodGhpcy5uZWVkc1VwZGF0ZT0hMCl9fS5wcm90b3R5cGUuaXNWaWRlb1RleHR1cmU9ITAsY2xhc3MgZXh0ZW5kcyBvYXR7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEscixzLGwsYyxkLHApe3N1cGVyKG51bGwsYSxyLHMsbCxjLG8saSxkLHApLHRoaXMuaW1hZ2U9e3dpZHRoOmUsaGVpZ2h0Om59LHRoaXMubWlwbWFwcz10LHRoaXMuZmxpcFk9ITEsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITF9fS5wcm90b3R5cGUuaXNDb21wcmVzc2VkVGV4dHVyZT0hMCxjbGFzcyBleHRlbmRzIG9hdHtjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyLHMsbCl7c3VwZXIodCxlLG4sbyxpLGEscixzLGwpLHRoaXMubmVlZHNVcGRhdGU9ITB9fS5wcm90b3R5cGUuaXNDYW52YXNUZXh0dXJlPSEwLGNsYXNzIGV4dGVuZHMgb2F0e2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIscyxsLGMpe2lmKChjPXZvaWQgMCE9PWM/YzpraXQpIT09a2l0JiZjIT09U2l0KXRocm93IG5ldyBFcnJvcigiRGVwdGhUZXh0dXJlIGZvcm1hdCBtdXN0IGJlIGVpdGhlciBUSFJFRS5EZXB0aEZvcm1hdCBvciBUSFJFRS5EZXB0aFN0ZW5jaWxGb3JtYXQiKTt2b2lkIDA9PT1uJiZjPT09a2l0JiYobj1DaXQpLHZvaWQgMD09PW4mJmM9PT1TaXQmJihuPU9pdCksc3VwZXIobnVsbCxvLGksYSxyLHMsYyxuLGwpLHRoaXMuaW1hZ2U9e3dpZHRoOnQsaGVpZ2h0OmV9LHRoaXMubWFnRmlsdGVyPXZvaWQgMCE9PXI/cjpoaXQsdGhpcy5taW5GaWx0ZXI9dm9pZCAwIT09cz9zOmhpdCx0aGlzLmZsaXBZPSExLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExfX0ucHJvdG90eXBlLmlzRGVwdGhUZXh0dXJlPSEwO2NsYXNzIGNwdCBleHRlbmRzIHFydHtjb25zdHJ1Y3Rvcih0PTEsZT04LG49MCxvPTIqTWF0aC5QSSl7c3VwZXIoKSx0aGlzLnR5cGU9IkNpcmNsZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czp0LHNlZ21lbnRzOmUsdGhldGFTdGFydDpuLHRoZXRhTGVuZ3RoOm99LGU9TWF0aC5tYXgoMyxlKTtjb25zdCBpPVtdLGE9W10scj1bXSxzPVtdLGw9bmV3IGNhdCxjPW5ldyBRaXQ7YS5wdXNoKDAsMCwwKSxyLnB1c2goMCwwLDEpLHMucHVzaCguNSwuNSk7Zm9yKGxldCBpPTAsZD0zO2k8PWU7aSsrLGQrPTMpe2NvbnN0IHA9bitpL2UqbztsLng9dCpNYXRoLmNvcyhwKSxsLnk9dCpNYXRoLnNpbihwKSxhLnB1c2gobC54LGwueSxsLnopLHIucHVzaCgwLDAsMSksYy54PShhW2RdL3QrMSkvMixjLnk9KGFbZCsxXS90KzEpLzIscy5wdXNoKGMueCxjLnkpfWZvcihsZXQgdD0xO3Q8PWU7dCsrKWkucHVzaCh0LHQrMSwwKTt0aGlzLnNldEluZGV4KGkpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IEZydChhLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgRnJ0KHIsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IEZydChzLDIpKX1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBjcHQodC5yYWRpdXMsdC5zZWdtZW50cyx0LnRoZXRhU3RhcnQsdC50aGV0YUxlbmd0aCl9fW5ldyBjYXQsbmV3IGNhdCxuZXcgY2F0LG5ldyB2cnQ7Y2xhc3MgZHB0e2NvbnN0cnVjdG9yKCl7dGhpcy50eXBlPSJDdXJ2ZSIsdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9MjAwfWdldFBvaW50KCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRlZC4iKSxudWxsfWdldFBvaW50QXQodCxlKXtjb25zdCBuPXRoaXMuZ2V0VXRvVG1hcHBpbmcodCk7cmV0dXJuIHRoaXMuZ2V0UG9pbnQobixlKX1nZXRQb2ludHModD01KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248PXQ7bisrKWUucHVzaCh0aGlzLmdldFBvaW50KG4vdCkpO3JldHVybiBlfWdldFNwYWNlZFBvaW50cyh0PTUpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjw9dDtuKyspZS5wdXNoKHRoaXMuZ2V0UG9pbnRBdChuL3QpKTtyZXR1cm4gZX1nZXRMZW5ndGgoKXtjb25zdCB0PXRoaXMuZ2V0TGVuZ3RocygpO3JldHVybiB0W3QubGVuZ3RoLTFdfWdldExlbmd0aHModD10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyl7aWYodGhpcy5jYWNoZUFyY0xlbmd0aHMmJnRoaXMuY2FjaGVBcmNMZW5ndGhzLmxlbmd0aD09PXQrMSYmIXRoaXMubmVlZHNVcGRhdGUpcmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzO3RoaXMubmVlZHNVcGRhdGU9ITE7Y29uc3QgZT1bXTtsZXQgbixvPXRoaXMuZ2V0UG9pbnQoMCksaT0wO2UucHVzaCgwKTtmb3IobGV0IGE9MTthPD10O2ErKyluPXRoaXMuZ2V0UG9pbnQoYS90KSxpKz1uLmRpc3RhbmNlVG8obyksZS5wdXNoKGkpLG89bjtyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM9ZSxlfXVwZGF0ZUFyY0xlbmd0aHMoKXt0aGlzLm5lZWRzVXBkYXRlPSEwLHRoaXMuZ2V0TGVuZ3RocygpfWdldFV0b1RtYXBwaW5nKHQsZSl7Y29uc3Qgbj10aGlzLmdldExlbmd0aHMoKTtsZXQgbz0wO2NvbnN0IGk9bi5sZW5ndGg7bGV0IGE7YT1lfHx0Km5baS0xXTtsZXQgcixzPTAsbD1pLTE7Zm9yKDtzPD1sOylpZihvPU1hdGguZmxvb3IocysobC1zKS8yKSxyPW5bb10tYSxyPDApcz1vKzE7ZWxzZXtpZighKHI+MCkpe2w9bzticmVha31sPW8tMX1pZihvPWwsbltvXT09PWEpcmV0dXJuIG8vKGktMSk7Y29uc3QgYz1uW29dO3JldHVybihvKyhhLWMpLyhuW28rMV0tYykpLyhpLTEpfWdldFRhbmdlbnQodCxlKXtjb25zdCBuPTFlLTQ7bGV0IG89dC1uLGk9dCtuO288MCYmKG89MCksaT4xJiYoaT0xKTtjb25zdCBhPXRoaXMuZ2V0UG9pbnQobykscj10aGlzLmdldFBvaW50KGkpLHM9ZXx8KGEuaXNWZWN0b3IyP25ldyBRaXQ6bmV3IGNhdCk7cmV0dXJuIHMuY29weShyKS5zdWIoYSkubm9ybWFsaXplKCksc31nZXRUYW5nZW50QXQodCxlKXtjb25zdCBuPXRoaXMuZ2V0VXRvVG1hcHBpbmcodCk7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudChuLGUpfWNvbXB1dGVGcmVuZXRGcmFtZXModCxlKXtjb25zdCBuPW5ldyBjYXQsbz1bXSxpPVtdLGE9W10scj1uZXcgY2F0LHM9bmV3IEJhdDtmb3IobGV0IGU9MDtlPD10O2UrKylvW2VdPXRoaXMuZ2V0VGFuZ2VudEF0KGUvdCxuZXcgY2F0KSxvW2VdLm5vcm1hbGl6ZSgpO2lbMF09bmV3IGNhdCxhWzBdPW5ldyBjYXQ7bGV0IGw9TnVtYmVyLk1BWF9WQUxVRTtjb25zdCBjPU1hdGguYWJzKG9bMF0ueCksZD1NYXRoLmFicyhvWzBdLnkpLHA9TWF0aC5hYnMob1swXS56KTtjPD1sJiYobD1jLG4uc2V0KDEsMCwwKSksZDw9bCYmKGw9ZCxuLnNldCgwLDEsMCkpLHA8PWwmJm4uc2V0KDAsMCwxKSxyLmNyb3NzVmVjdG9ycyhvWzBdLG4pLm5vcm1hbGl6ZSgpLGlbMF0uY3Jvc3NWZWN0b3JzKG9bMF0sciksYVswXS5jcm9zc1ZlY3RvcnMob1swXSxpWzBdKTtmb3IobGV0IGU9MTtlPD10O2UrKyl7aWYoaVtlXT1pW2UtMV0uY2xvbmUoKSxhW2VdPWFbZS0xXS5jbG9uZSgpLHIuY3Jvc3NWZWN0b3JzKG9bZS0xXSxvW2VdKSxyLmxlbmd0aCgpPk51bWJlci5FUFNJTE9OKXtyLm5vcm1hbGl6ZSgpO2NvbnN0IHQ9TWF0aC5hY29zKFppdChvW2UtMV0uZG90KG9bZV0pLC0xLDEpKTtpW2VdLmFwcGx5TWF0cml4NChzLm1ha2VSb3RhdGlvbkF4aXMocix0KSl9YVtlXS5jcm9zc1ZlY3RvcnMob1tlXSxpW2VdKX1pZighMD09PWUpe2xldCBlPU1hdGguYWNvcyhaaXQoaVswXS5kb3QoaVt0XSksLTEsMSkpO2UvPXQsb1swXS5kb3Qoci5jcm9zc1ZlY3RvcnMoaVswXSxpW3RdKSk+MCYmKGU9LWUpO2ZvcihsZXQgbj0xO248PXQ7bisrKWlbbl0uYXBwbHlNYXRyaXg0KHMubWFrZVJvdGF0aW9uQXhpcyhvW25dLGUqbikpLGFbbl0uY3Jvc3NWZWN0b3JzKG9bbl0saVtuXSl9cmV0dXJue3RhbmdlbnRzOm8sbm9ybWFsczppLGJpbm9ybWFsczphfX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz10LmFyY0xlbmd0aERpdmlzaW9ucyx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNSx0eXBlOiJDdXJ2ZSIsZ2VuZXJhdG9yOiJDdXJ2ZS50b0pTT04ifX07cmV0dXJuIHQuYXJjTGVuZ3RoRGl2aXNpb25zPXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zLHQudHlwZT10aGlzLnR5cGUsdH1mcm9tSlNPTih0KXtyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9dC5hcmNMZW5ndGhEaXZpc2lvbnMsdGhpc319Y2xhc3MgcHB0IGV4dGVuZHMgZHB0e2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0xLG89MSxpPTAsYT0yKk1hdGguUEkscj0hMSxzPTApe3N1cGVyKCksdGhpcy50eXBlPSJFbGxpcHNlQ3VydmUiLHRoaXMuYVg9dCx0aGlzLmFZPWUsdGhpcy54UmFkaXVzPW4sdGhpcy55UmFkaXVzPW8sdGhpcy5hU3RhcnRBbmdsZT1pLHRoaXMuYUVuZEFuZ2xlPWEsdGhpcy5hQ2xvY2t3aXNlPXIsdGhpcy5hUm90YXRpb249c31nZXRQb2ludCh0LGUpe2NvbnN0IG49ZXx8bmV3IFFpdCxvPTIqTWF0aC5QSTtsZXQgaT10aGlzLmFFbmRBbmdsZS10aGlzLmFTdGFydEFuZ2xlO2NvbnN0IGE9TWF0aC5hYnMoaSk8TnVtYmVyLkVQU0lMT047Zm9yKDtpPDA7KWkrPW87Zm9yKDtpPm87KWktPW87aTxOdW1iZXIuRVBTSUxPTiYmKGk9YT8wOm8pLCEwIT09dGhpcy5hQ2xvY2t3aXNlfHxhfHwoaT09PW8/aT0tbzppLT1vKTtjb25zdCByPXRoaXMuYVN0YXJ0QW5nbGUrdCppO2xldCBzPXRoaXMuYVgrdGhpcy54UmFkaXVzKk1hdGguY29zKHIpLGw9dGhpcy5hWSt0aGlzLnlSYWRpdXMqTWF0aC5zaW4ocik7aWYoMCE9PXRoaXMuYVJvdGF0aW9uKXtjb25zdCB0PU1hdGguY29zKHRoaXMuYVJvdGF0aW9uKSxlPU1hdGguc2luKHRoaXMuYVJvdGF0aW9uKSxuPXMtdGhpcy5hWCxvPWwtdGhpcy5hWTtzPW4qdC1vKmUrdGhpcy5hWCxsPW4qZStvKnQrdGhpcy5hWX1yZXR1cm4gbi5zZXQocyxsKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuYVg9dC5hWCx0aGlzLmFZPXQuYVksdGhpcy54UmFkaXVzPXQueFJhZGl1cyx0aGlzLnlSYWRpdXM9dC55UmFkaXVzLHRoaXMuYVN0YXJ0QW5nbGU9dC5hU3RhcnRBbmdsZSx0aGlzLmFFbmRBbmdsZT10LmFFbmRBbmdsZSx0aGlzLmFDbG9ja3dpc2U9dC5hQ2xvY2t3aXNlLHRoaXMuYVJvdGF0aW9uPXQuYVJvdGF0aW9uLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5hWD10aGlzLmFYLHQuYVk9dGhpcy5hWSx0LnhSYWRpdXM9dGhpcy54UmFkaXVzLHQueVJhZGl1cz10aGlzLnlSYWRpdXMsdC5hU3RhcnRBbmdsZT10aGlzLmFTdGFydEFuZ2xlLHQuYUVuZEFuZ2xlPXRoaXMuYUVuZEFuZ2xlLHQuYUNsb2Nrd2lzZT10aGlzLmFDbG9ja3dpc2UsdC5hUm90YXRpb249dGhpcy5hUm90YXRpb24sdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy5hWD10LmFYLHRoaXMuYVk9dC5hWSx0aGlzLnhSYWRpdXM9dC54UmFkaXVzLHRoaXMueVJhZGl1cz10LnlSYWRpdXMsdGhpcy5hU3RhcnRBbmdsZT10LmFTdGFydEFuZ2xlLHRoaXMuYUVuZEFuZ2xlPXQuYUVuZEFuZ2xlLHRoaXMuYUNsb2Nrd2lzZT10LmFDbG9ja3dpc2UsdGhpcy5hUm90YXRpb249dC5hUm90YXRpb24sdGhpc319cHB0LnByb3RvdHlwZS5pc0VsbGlwc2VDdXJ2ZT0hMDtjbGFzcyBtcHQgZXh0ZW5kcyBwcHR7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEpe3N1cGVyKHQsZSxuLG4sbyxpLGEpLHRoaXMudHlwZT0iQXJjQ3VydmUifX1mdW5jdGlvbiB1cHQoKXtsZXQgdD0wLGU9MCxuPTAsbz0wO2Z1bmN0aW9uIGkoaSxhLHIscyl7dD1pLGU9cixuPS0zKmkrMyphLTIqci1zLG89MippLTIqYStyK3N9cmV0dXJue2luaXRDYXRtdWxsUm9tOmZ1bmN0aW9uKHQsZSxuLG8sYSl7aShlLG4sYSoobi10KSxhKihvLWUpKX0saW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tOmZ1bmN0aW9uKHQsZSxuLG8sYSxyLHMpe2xldCBsPShlLXQpL2EtKG4tdCkvKGErcikrKG4tZSkvcixjPShuLWUpL3ItKG8tZSkvKHIrcykrKG8tbikvcztsKj1yLGMqPXIsaShlLG4sbCxjKX0sY2FsYzpmdW5jdGlvbihpKXtjb25zdCBhPWkqaTtyZXR1cm4gdCtlKmkrbiphK28qKGEqaSl9fX1tcHQucHJvdG90eXBlLmlzQXJjQ3VydmU9ITA7Y29uc3QgZnB0PW5ldyBjYXQsZ3B0PW5ldyB1cHQsaHB0PW5ldyB1cHQsYnB0PW5ldyB1cHQ7Y2xhc3MgeXB0IGV4dGVuZHMgZHB0e2NvbnN0cnVjdG9yKHQ9W10sZT0hMSxuPSJjZW50cmlwZXRhbCIsbz0uNSl7c3VwZXIoKSx0aGlzLnR5cGU9IkNhdG11bGxSb21DdXJ2ZTMiLHRoaXMucG9pbnRzPXQsdGhpcy5jbG9zZWQ9ZSx0aGlzLmN1cnZlVHlwZT1uLHRoaXMudGVuc2lvbj1vfWdldFBvaW50KHQsZT1uZXcgY2F0KXtjb25zdCBuPWUsbz10aGlzLnBvaW50cyxpPW8ubGVuZ3RoLGE9KGktKHRoaXMuY2xvc2VkPzA6MSkpKnQ7bGV0IHIscyxsPU1hdGguZmxvb3IoYSksYz1hLWw7dGhpcy5jbG9zZWQ/bCs9bD4wPzA6KE1hdGguZmxvb3IoTWF0aC5hYnMobCkvaSkrMSkqaTowPT09YyYmbD09PWktMSYmKGw9aS0yLGM9MSksdGhpcy5jbG9zZWR8fGw+MD9yPW9bKGwtMSklaV06KGZwdC5zdWJWZWN0b3JzKG9bMF0sb1sxXSkuYWRkKG9bMF0pLHI9ZnB0KTtjb25zdCBkPW9bbCVpXSxwPW9bKGwrMSklaV07aWYodGhpcy5jbG9zZWR8fGwrMjxpP3M9b1sobCsyKSVpXTooZnB0LnN1YlZlY3RvcnMob1tpLTFdLG9baS0yXSkuYWRkKG9baS0xXSkscz1mcHQpLCJjZW50cmlwZXRhbCI9PT10aGlzLmN1cnZlVHlwZXx8ImNob3JkYWwiPT09dGhpcy5jdXJ2ZVR5cGUpe2NvbnN0IHQ9ImNob3JkYWwiPT09dGhpcy5jdXJ2ZVR5cGU/LjU6LjI1O2xldCBlPU1hdGgucG93KHIuZGlzdGFuY2VUb1NxdWFyZWQoZCksdCksbj1NYXRoLnBvdyhkLmRpc3RhbmNlVG9TcXVhcmVkKHApLHQpLG89TWF0aC5wb3cocC5kaXN0YW5jZVRvU3F1YXJlZChzKSx0KTtuPDFlLTQmJihuPTEpLGU8MWUtNCYmKGU9biksbzwxZS00JiYobz1uKSxncHQuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKHIueCxkLngscC54LHMueCxlLG4sbyksaHB0LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShyLnksZC55LHAueSxzLnksZSxuLG8pLGJwdC5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oci56LGQueixwLnoscy56LGUsbixvKX1lbHNlImNhdG11bGxyb20iPT09dGhpcy5jdXJ2ZVR5cGUmJihncHQuaW5pdENhdG11bGxSb20oci54LGQueCxwLngscy54LHRoaXMudGVuc2lvbiksaHB0LmluaXRDYXRtdWxsUm9tKHIueSxkLnkscC55LHMueSx0aGlzLnRlbnNpb24pLGJwdC5pbml0Q2F0bXVsbFJvbShyLnosZC56LHAueixzLnosdGhpcy50ZW5zaW9uKSk7cmV0dXJuIG4uc2V0KGdwdC5jYWxjKGMpLGhwdC5jYWxjKGMpLGJwdC5jYWxjKGMpKSxufWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXRoaXMucG9pbnRzLnB1c2godC5wb2ludHNbZV0uY2xvbmUoKSk7cmV0dXJuIHRoaXMuY2xvc2VkPXQuY2xvc2VkLHRoaXMuY3VydmVUeXBlPXQuY3VydmVUeXBlLHRoaXMudGVuc2lvbj10LnRlbnNpb24sdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5wb2ludHMubGVuZ3RoO2U8bjtlKyspdC5wb2ludHMucHVzaCh0aGlzLnBvaW50c1tlXS50b0FycmF5KCkpO3JldHVybiB0LmNsb3NlZD10aGlzLmNsb3NlZCx0LmN1cnZlVHlwZT10aGlzLmN1cnZlVHlwZSx0LnRlbnNpb249dGhpcy50ZW5zaW9uLHR9ZnJvbUpTT04odCl7c3VwZXIuZnJvbUpTT04odCksdGhpcy5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10LnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgbj10LnBvaW50c1tlXTt0aGlzLnBvaW50cy5wdXNoKChuZXcgY2F0KS5mcm9tQXJyYXkobikpfXJldHVybiB0aGlzLmNsb3NlZD10LmNsb3NlZCx0aGlzLmN1cnZlVHlwZT10LmN1cnZlVHlwZSx0aGlzLnRlbnNpb249dC50ZW5zaW9uLHRoaXN9fWZ1bmN0aW9uIF9wdCh0LGUsbixvLGkpe2NvbnN0IGE9LjUqKG8tZSkscj0uNSooaS1uKSxzPXQqdDtyZXR1cm4oMipuLTIqbythK3IpKih0KnMpKygtMypuKzMqby0yKmEtcikqcythKnQrbn1mdW5jdGlvbiBDcHQodCxlLG4sbyl7cmV0dXJuKGZ1bmN0aW9uIGkodCxlKXtjb25zdCBuPTEtdDtyZXR1cm4gbipuKmV9KSh0LGUpKyhmdW5jdGlvbiBhKHQsZSl7cmV0dXJuIDIqKDEtdCkqdCplfSkodCxuKSsoZnVuY3Rpb24gcih0LGUpe3JldHVybiB0KnQqZX0pKHQsbyl9ZnVuY3Rpb24gTXB0KHQsZSxuLG8saSl7cmV0dXJuKGZ1bmN0aW9uIGEodCxlKXtjb25zdCBuPTEtdDtyZXR1cm4gbipuKm4qZX0pKHQsZSkrKGZ1bmN0aW9uIHIodCxlKXtjb25zdCBuPTEtdDtyZXR1cm4gMypuKm4qdCplfSkodCxuKSsoZnVuY3Rpb24gcyh0LGUpe3JldHVybiAzKigxLXQpKnQqdCplfSkodCxvKSsoZnVuY3Rpb24gbCh0LGUpe3JldHVybiB0KnQqdCplfSkodCxpKX15cHQucHJvdG90eXBlLmlzQ2F0bXVsbFJvbUN1cnZlMz0hMDtjbGFzcyB2cHQgZXh0ZW5kcyBkcHR7Y29uc3RydWN0b3IodD1uZXcgUWl0LGU9bmV3IFFpdCxuPW5ldyBRaXQsbz1uZXcgUWl0KXtzdXBlcigpLHRoaXMudHlwZT0iQ3ViaWNCZXppZXJDdXJ2ZSIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW4sdGhpcy52Mz1vfWdldFBvaW50KHQsZT1uZXcgUWl0KXtjb25zdCBuPWUsbz10aGlzLnYwLGk9dGhpcy52MSxhPXRoaXMudjIscj10aGlzLnYzO3JldHVybiBuLnNldChNcHQodCxvLngsaS54LGEueCxyLngpLE1wdCh0LG8ueSxpLnksYS55LHIueSkpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYwLmNvcHkodC52MCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzLnYzLmNvcHkodC52MyksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0LnYzPXRoaXMudjMudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjAuZnJvbUFycmF5KHQudjApLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXMudjMuZnJvbUFycmF5KHQudjMpLHRoaXN9fXZwdC5wcm90b3R5cGUuaXNDdWJpY0JlemllckN1cnZlPSEwO2NsYXNzIHhwdCBleHRlbmRzIGRwdHtjb25zdHJ1Y3Rvcih0PW5ldyBjYXQsZT1uZXcgY2F0LG49bmV3IGNhdCxvPW5ldyBjYXQpe3N1cGVyKCksdGhpcy50eXBlPSJDdWJpY0JlemllckN1cnZlMyIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW4sdGhpcy52Mz1vfWdldFBvaW50KHQsZT1uZXcgY2F0KXtjb25zdCBuPWUsbz10aGlzLnYwLGk9dGhpcy52MSxhPXRoaXMudjIscj10aGlzLnYzO3JldHVybiBuLnNldChNcHQodCxvLngsaS54LGEueCxyLngpLE1wdCh0LG8ueSxpLnksYS55LHIueSksTXB0KHQsby56LGkueixhLnosci56KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXMudjMuY29weSh0LnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHQudjM9dGhpcy52My50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpcy52My5mcm9tQXJyYXkodC52MyksdGhpc319eHB0LnByb3RvdHlwZS5pc0N1YmljQmV6aWVyQ3VydmUzPSEwO2NsYXNzIE9wdCBleHRlbmRzIGRwdHtjb25zdHJ1Y3Rvcih0PW5ldyBRaXQsZT1uZXcgUWl0KXtzdXBlcigpLHRoaXMudHlwZT0iTGluZUN1cnZlIix0aGlzLnYxPXQsdGhpcy52Mj1lfWdldFBvaW50KHQsZT1uZXcgUWl0KXtjb25zdCBuPWU7cmV0dXJuIDE9PT10P24uY29weSh0aGlzLnYyKToobi5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSxuLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnYxKSksbn1nZXRQb2ludEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQodCxlKX1nZXRUYW5nZW50KHQsZSl7Y29uc3Qgbj1lfHxuZXcgUWl0O3JldHVybiBuLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLm5vcm1hbGl6ZSgpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXN9fU9wdC5wcm90b3R5cGUuaXNMaW5lQ3VydmU9ITA7Y2xhc3MgUHB0IGV4dGVuZHMgZHB0e2NvbnN0cnVjdG9yKHQ9bmV3IFFpdCxlPW5ldyBRaXQsbj1uZXcgUWl0KXtzdXBlcigpLHRoaXMudHlwZT0iUXVhZHJhdGljQmV6aWVyQ3VydmUiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1ufWdldFBvaW50KHQsZT1uZXcgUWl0KXtjb25zdCBuPWUsbz10aGlzLnYwLGk9dGhpcy52MSxhPXRoaXMudjI7cmV0dXJuIG4uc2V0KENwdCh0LG8ueCxpLngsYS54KSxDcHQodCxvLnksaS55LGEueSkpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYwLmNvcHkodC52MCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjAuZnJvbUFycmF5KHQudjApLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXN9fVBwdC5wcm90b3R5cGUuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZT0hMDtjbGFzcyB3cHQgZXh0ZW5kcyBkcHR7Y29uc3RydWN0b3IodD1uZXcgY2F0LGU9bmV3IGNhdCxuPW5ldyBjYXQpe3N1cGVyKCksdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1ufWdldFBvaW50KHQsZT1uZXcgY2F0KXtjb25zdCBuPWUsbz10aGlzLnYwLGk9dGhpcy52MSxhPXRoaXMudjI7cmV0dXJuIG4uc2V0KENwdCh0LG8ueCxpLngsYS54KSxDcHQodCxvLnksaS55LGEueSksQ3B0KHQsby56LGkueixhLnopKSxufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MC5jb3B5KHQudjApLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYwLmZyb21BcnJheSh0LnYwKSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX13cHQucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUzPSEwO2NsYXNzIGtwdCBleHRlbmRzIGRwdHtjb25zdHJ1Y3Rvcih0PVtdKXtzdXBlcigpLHRoaXMudHlwZT0iU3BsaW5lQ3VydmUiLHRoaXMucG9pbnRzPXR9Z2V0UG9pbnQodCxlPW5ldyBRaXQpe2NvbnN0IG49ZSxvPXRoaXMucG9pbnRzLGk9KG8ubGVuZ3RoLTEpKnQsYT1NYXRoLmZsb29yKGkpLHI9aS1hLHM9b1swPT09YT9hOmEtMV0sbD1vW2FdLGM9b1thPm8ubGVuZ3RoLTI/by5sZW5ndGgtMTphKzFdLGQ9b1thPm8ubGVuZ3RoLTM/by5sZW5ndGgtMTphKzJdO3JldHVybiBuLnNldChfcHQocixzLngsbC54LGMueCxkLngpLF9wdChyLHMueSxsLnksYy55LGQueSkpLG59Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspdGhpcy5wb2ludHMucHVzaCh0LnBvaW50c1tlXS5jbG9uZSgpKTtyZXR1cm4gdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5wb2ludHMubGVuZ3RoO2U8bjtlKyspdC5wb2ludHMucHVzaCh0aGlzLnBvaW50c1tlXS50b0FycmF5KCkpO3JldHVybiB0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IG49dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaCgobmV3IFFpdCkuZnJvbUFycmF5KG4pKX1yZXR1cm4gdGhpc319a3B0LnByb3RvdHlwZS5pc1NwbGluZUN1cnZlPSEwO3ZhciBTcHQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQXJjQ3VydmU6bXB0LENhdG11bGxSb21DdXJ2ZTM6eXB0LEN1YmljQmV6aWVyQ3VydmU6dnB0LEN1YmljQmV6aWVyQ3VydmUzOnhwdCxFbGxpcHNlQ3VydmU6cHB0LExpbmVDdXJ2ZTpPcHQsTGluZUN1cnZlMzpjbGFzcyBleHRlbmRzIGRwdHtjb25zdHJ1Y3Rvcih0PW5ldyBjYXQsZT1uZXcgY2F0KXtzdXBlcigpLHRoaXMudHlwZT0iTGluZUN1cnZlMyIsdGhpcy5pc0xpbmVDdXJ2ZTM9ITAsdGhpcy52MT10LHRoaXMudjI9ZX1nZXRQb2ludCh0LGU9bmV3IGNhdCl7Y29uc3Qgbj1lO3JldHVybiAxPT09dD9uLmNvcHkodGhpcy52Mik6KG4uY29weSh0aGlzLnYyKS5zdWIodGhpcy52MSksbi5tdWx0aXBseVNjYWxhcih0KS5hZGQodGhpcy52MSkpLG59Z2V0UG9pbnRBdCh0LGUpe3JldHVybiB0aGlzLmdldFBvaW50KHQsZSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXN9fSxRdWFkcmF0aWNCZXppZXJDdXJ2ZTpQcHQsUXVhZHJhdGljQmV6aWVyQ3VydmUzOndwdCxTcGxpbmVDdXJ2ZTprcHR9KTtmdW5jdGlvbiBEcHQodCxlLG4sbyxpKXtsZXQgYSxyO2lmKGk9PT0oZnVuY3Rpb24gcyh0LGUsbixvKXtsZXQgaT0wO2ZvcihsZXQgYT1lLHI9bi1vO2E8bjthKz1vKWkrPSh0W3JdLXRbYV0pKih0W2ErMV0rdFtyKzFdKSxyPWE7cmV0dXJuIGl9KSh0LGUsbixvKT4wKWZvcihhPWU7YTxuO2ErPW8pcj1LcHQoYSx0W2FdLHRbYSsxXSxyKTtlbHNlIGZvcihhPW4tbzthPj1lO2EtPW8pcj1LcHQoYSx0W2FdLHRbYSsxXSxyKTtyZXR1cm4gciYmR3B0KHIsci5uZXh0KSYmKEpwdChyKSxyPXIubmV4dCkscn1mdW5jdGlvbiBFcHQodCxlKXtpZighdClyZXR1cm4gdDtlfHwoZT10KTtsZXQgbixvPXQ7ZG97aWYobj0hMSxvLnN0ZWluZXJ8fCFHcHQobyxvLm5leHQpJiYwIT09VXB0KG8ucHJldixvLG8ubmV4dCkpbz1vLm5leHQ7ZWxzZXtpZihKcHQobyksbz1lPW8ucHJldixvPT09by5uZXh0KWJyZWFrO249ITB9fXdoaWxlKG58fG8hPT1lKTtyZXR1cm4gZX1mdW5jdGlvbiBScHQodCxlLG4sbyxpLGEscil7aWYoIXQpcmV0dXJuOyFyJiZhJiYoZnVuY3Rpb24gcyh0LGUsbixvKXtsZXQgaT10O2Rve251bGw9PT1pLnomJihpLno9THB0KGkueCxpLnksZSxuLG8pKSxpLnByZXZaPWkucHJldixpLm5leHRaPWkubmV4dCxpPWkubmV4dH13aGlsZShpIT09dCk7aS5wcmV2Wi5uZXh0Wj1udWxsLGkucHJldlo9bnVsbCwoZnVuY3Rpb24gYSh0KXtsZXQgZSxuLG8saSxhLHIscyxsLGM9MTtkb3tmb3Iobj10LHQ9bnVsbCxhPW51bGwscj0wO247KXtmb3IocisrLG89bixzPTAsZT0wO2U8YyYmKHMrKyxvPW8ubmV4dFosbyk7ZSsrKTtmb3IobD1jO3M+MHx8bD4wJiZvOykwIT09cyYmKDA9PT1sfHwhb3x8bi56PD1vLnopPyhpPW4sbj1uLm5leHRaLHMtLSk6KGk9byxvPW8ubmV4dFosbC0tKSxhP2EubmV4dFo9aTp0PWksaS5wcmV2Wj1hLGE9aTtuPW99YS5uZXh0Wj1udWxsLGMqPTJ9d2hpbGUocj4xKX0pKGkpfSkodCxvLGksYSk7bGV0IGwsYyxkPXQ7Zm9yKDt0LnByZXYhPT10Lm5leHQ7KWlmKGw9dC5wcmV2LGM9dC5uZXh0LGE/VHB0KHQsbyxpLGEpOkFwdCh0KSllLnB1c2gobC5pL24pLGUucHVzaCh0LmkvbiksZS5wdXNoKGMuaS9uKSxKcHQodCksdD1jLm5leHQsZD1jLm5leHQ7ZWxzZSBpZigodD1jKT09PWQpe3I/MT09PXI/UnB0KHQ9TnB0KEVwdCh0KSxlLG4pLGUsbixvLGksYSwyKToyPT09ciYmenB0KHQsZSxuLG8saSxhKTpScHQoRXB0KHQpLGUsbixvLGksYSwxKTticmVha319ZnVuY3Rpb24gQXB0KHQpe2NvbnN0IGU9dC5wcmV2LG49dCxvPXQubmV4dDtpZihVcHQoZSxuLG8pPj0wKXJldHVybiExO2xldCBpPXQubmV4dC5uZXh0O2Zvcig7aSE9PXQucHJldjspe2lmKFZwdChlLngsZS55LG4ueCxuLnksby54LG8ueSxpLngsaS55KSYmVXB0KGkucHJldixpLGkubmV4dCk+PTApcmV0dXJuITE7aT1pLm5leHR9cmV0dXJuITB9ZnVuY3Rpb24gVHB0KHQsZSxuLG8pe2NvbnN0IGk9dC5wcmV2LGE9dCxyPXQubmV4dDtpZihVcHQoaSxhLHIpPj0wKXJldHVybiExO2NvbnN0IHM9aS54PmEueD9pLng+ci54P2kueDpyLng6YS54PnIueD9hLng6ci54LGw9aS55PmEueT9pLnk+ci55P2kueTpyLnk6YS55PnIueT9hLnk6ci55LGM9THB0KGkueDxhLng/aS54PHIueD9pLng6ci54OmEueDxyLng/YS54OnIueCxpLnk8YS55P2kueTxyLnk/aS55OnIueTphLnk8ci55P2EueTpyLnksZSxuLG8pLGQ9THB0KHMsbCxlLG4sbyk7bGV0IHA9dC5wcmV2WixtPXQubmV4dFo7Zm9yKDtwJiZwLno+PWMmJm0mJm0uejw9ZDspe2lmKHAhPT10LnByZXYmJnAhPT10Lm5leHQmJlZwdChpLngsaS55LGEueCxhLnksci54LHIueSxwLngscC55KSYmVXB0KHAucHJldixwLHAubmV4dCk+PTApcmV0dXJuITE7aWYocD1wLnByZXZaLG0hPT10LnByZXYmJm0hPT10Lm5leHQmJlZwdChpLngsaS55LGEueCxhLnksci54LHIueSxtLngsbS55KSYmVXB0KG0ucHJldixtLG0ubmV4dCk+PTApcmV0dXJuITE7bT1tLm5leHRafWZvcig7cCYmcC56Pj1jOyl7aWYocCE9PXQucHJldiYmcCE9PXQubmV4dCYmVnB0KGkueCxpLnksYS54LGEueSxyLngsci55LHAueCxwLnkpJiZVcHQocC5wcmV2LHAscC5uZXh0KT49MClyZXR1cm4hMTtwPXAucHJldlp9Zm9yKDttJiZtLno8PWQ7KXtpZihtIT09dC5wcmV2JiZtIT09dC5uZXh0JiZWcHQoaS54LGkueSxhLngsYS55LHIueCxyLnksbS54LG0ueSkmJlVwdChtLnByZXYsbSxtLm5leHQpPj0wKXJldHVybiExO209bS5uZXh0Wn1yZXR1cm4hMH1mdW5jdGlvbiBOcHQodCxlLG4pe2xldCBvPXQ7ZG97Y29uc3QgaT1vLnByZXYsYT1vLm5leHQubmV4dDshR3B0KGksYSkmJldwdChpLG8sby5uZXh0LGEpJiZacHQoaSxhKSYmWnB0KGEsaSkmJihlLnB1c2goaS5pL24pLGUucHVzaChvLmkvbiksZS5wdXNoKGEuaS9uKSxKcHQobyksSnB0KG8ubmV4dCksbz10PWEpLG89by5uZXh0fXdoaWxlKG8hPT10KTtyZXR1cm4gRXB0KG8pfWZ1bmN0aW9uIHpwdCh0LGUsbixvLGksYSl7bGV0IHI9dDtkb3tsZXQgdD1yLm5leHQubmV4dDtmb3IoO3QhPT1yLnByZXY7KXtpZihyLmkhPT10LmkmJmpwdChyLHQpKXtsZXQgcz1YcHQocix0KTtyZXR1cm4gcj1FcHQocixyLm5leHQpLHM9RXB0KHMscy5uZXh0KSxScHQocixlLG4sbyxpLGEpLHZvaWQgUnB0KHMsZSxuLG8saSxhKX10PXQubmV4dH1yPXIubmV4dH13aGlsZShyIT09dCl9ZnVuY3Rpb24gSXB0KHQsZSl7cmV0dXJuIHQueC1lLnh9ZnVuY3Rpb24gSHB0KHQsZSl7aWYoZT0oZnVuY3Rpb24gbih0LGUpe2xldCBuPWU7Y29uc3Qgbz10LngsaT10Lnk7bGV0IGEscj0tMS8wO2Rve2lmKGk8PW4ueSYmaT49bi5uZXh0LnkmJm4ubmV4dC55IT09bi55KXtjb25zdCB0PW4ueCsoaS1uLnkpKihuLm5leHQueC1uLngpLyhuLm5leHQueS1uLnkpO2lmKHQ8PW8mJnQ+cil7aWYocj10LHQ9PT1vKXtpZihpPT09bi55KXJldHVybiBuO2lmKGk9PT1uLm5leHQueSlyZXR1cm4gbi5uZXh0fWE9bi54PG4ubmV4dC54P246bi5uZXh0fX1uPW4ubmV4dH13aGlsZShuIT09ZSk7aWYoIWEpcmV0dXJuIG51bGw7aWYobz09PXIpcmV0dXJuIGE7Y29uc3Qgcz1hLGw9YS54LGM9YS55O2xldCBkLHA9MS8wO249YTtkb3tvPj1uLngmJm4ueD49bCYmbyE9PW4ueCYmVnB0KGk8Yz9vOnIsaSxsLGMsaTxjP3I6byxpLG4ueCxuLnkpJiYoZD1NYXRoLmFicyhpLW4ueSkvKG8tbi54KSxacHQobix0KSYmKGQ8cHx8ZD09PXAmJihuLng+YS54fHxuLng9PT1hLngmJkZwdChhLG4pKSkmJihhPW4scD1kKSksbj1uLm5leHR9d2hpbGUobiE9PXMpO3JldHVybiBhfSkodCxlKSl7Y29uc3Qgbj1YcHQoZSx0KTtFcHQoZSxlLm5leHQpLEVwdChuLG4ubmV4dCl9fWZ1bmN0aW9uIEZwdCh0LGUpe3JldHVybiBVcHQodC5wcmV2LHQsZS5wcmV2KTwwJiZVcHQoZS5uZXh0LHQsdC5uZXh0KTwwfWZ1bmN0aW9uIExwdCh0LGUsbixvLGkpe3JldHVybih0PTE0MzE2NTU3NjUmKCh0PTg1ODk5MzQ1OSYoKHQ9MjUyNjQ1MTM1JigodD0xNjcxMTkzNSYoKHQ9MzI3NjcqKHQtbikqaSl8dDw8OCkpfHQ8PDQpKXx0PDwyKSl8dDw8MSkpfChlPTE0MzE2NTU3NjUmKChlPTg1ODk5MzQ1OSYoKGU9MjUyNjQ1MTM1JigoZT0xNjcxMTkzNSYoKGU9MzI3NjcqKGUtbykqaSl8ZTw8OCkpfGU8PDQpKXxlPDwyKSl8ZTw8MSkpPDwxfWZ1bmN0aW9uIEJwdCh0KXtsZXQgZT10LG49dDtkb3soZS54PG4ueHx8ZS54PT09bi54JiZlLnk8bi55KSYmKG49ZSksZT1lLm5leHR9d2hpbGUoZSE9PXQpO3JldHVybiBufWZ1bmN0aW9uIFZwdCh0LGUsbixvLGksYSxyLHMpe3JldHVybihpLXIpKihlLXMpLSh0LXIpKihhLXMpPj0wJiYodC1yKSooby1zKS0obi1yKSooZS1zKT49MCYmKG4tcikqKGEtcyktKGktcikqKG8tcyk+PTB9ZnVuY3Rpb24ganB0KHQsZSl7cmV0dXJuIHQubmV4dC5pIT09ZS5pJiZ0LnByZXYuaSE9PWUuaSYmIShmdW5jdGlvbiBuKHQsZSl7bGV0IG49dDtkb3tpZihuLmkhPT10LmkmJm4ubmV4dC5pIT09dC5pJiZuLmkhPT1lLmkmJm4ubmV4dC5pIT09ZS5pJiZXcHQobixuLm5leHQsdCxlKSlyZXR1cm4hMDtuPW4ubmV4dH13aGlsZShuIT09dCk7cmV0dXJuITF9KSh0LGUpJiYoWnB0KHQsZSkmJlpwdChlLHQpJiYoZnVuY3Rpb24gbyh0LGUpe2xldCBuPXQsbz0hMTtjb25zdCBpPSh0LngrZS54KS8yLGE9KHQueStlLnkpLzI7ZG97bi55PmEhPW4ubmV4dC55PmEmJm4ubmV4dC55IT09bi55JiZpPChuLm5leHQueC1uLngpKihhLW4ueSkvKG4ubmV4dC55LW4ueSkrbi54JiYobz0hbyksbj1uLm5leHR9d2hpbGUobiE9PXQpO3JldHVybiBvfSkodCxlKSYmKFVwdCh0LnByZXYsdCxlLnByZXYpfHxVcHQodCxlLnByZXYsZSkpfHxHcHQodCxlKSYmVXB0KHQucHJldix0LHQubmV4dCk+MCYmVXB0KGUucHJldixlLGUubmV4dCk+MCl9ZnVuY3Rpb24gVXB0KHQsZSxuKXtyZXR1cm4oZS55LXQueSkqKG4ueC1lLngpLShlLngtdC54KSoobi55LWUueSl9ZnVuY3Rpb24gR3B0KHQsZSl7cmV0dXJuIHQueD09PWUueCYmdC55PT09ZS55fWZ1bmN0aW9uIFdwdCh0LGUsbixvKXtjb25zdCBpPXFwdChVcHQodCxlLG4pKSxhPXFwdChVcHQodCxlLG8pKSxyPXFwdChVcHQobixvLHQpKSxzPXFwdChVcHQobixvLGUpKTtyZXR1cm4gaSE9PWEmJnIhPT1zfHwhKDAhPT1pfHwhWXB0KHQsbixlKSl8fCEoMCE9PWF8fCFZcHQodCxvLGUpKXx8ISgwIT09cnx8IVlwdChuLHQsbykpfHwhKDAhPT1zfHwhWXB0KG4sZSxvKSl9ZnVuY3Rpb24gWXB0KHQsZSxuKXtyZXR1cm4gZS54PD1NYXRoLm1heCh0Lngsbi54KSYmZS54Pj1NYXRoLm1pbih0Lngsbi54KSYmZS55PD1NYXRoLm1heCh0Lnksbi55KSYmZS55Pj1NYXRoLm1pbih0Lnksbi55KX1mdW5jdGlvbiBxcHQodCl7cmV0dXJuIHQ+MD8xOnQ8MD8tMTowfWZ1bmN0aW9uIFpwdCh0LGUpe3JldHVybiBVcHQodC5wcmV2LHQsdC5uZXh0KTwwP1VwdCh0LGUsdC5uZXh0KT49MCYmVXB0KHQsdC5wcmV2LGUpPj0wOlVwdCh0LGUsdC5wcmV2KTwwfHxVcHQodCx0Lm5leHQsZSk8MH1mdW5jdGlvbiBYcHQodCxlKXtjb25zdCBuPW5ldyBRcHQodC5pLHQueCx0LnkpLG89bmV3IFFwdChlLmksZS54LGUueSksaT10Lm5leHQsYT1lLnByZXY7cmV0dXJuIHQubmV4dD1lLGUucHJldj10LG4ubmV4dD1pLGkucHJldj1uLG8ubmV4dD1uLG4ucHJldj1vLGEubmV4dD1vLG8ucHJldj1hLG99ZnVuY3Rpb24gS3B0KHQsZSxuLG8pe2NvbnN0IGk9bmV3IFFwdCh0LGUsbik7cmV0dXJuIG8/KGkubmV4dD1vLm5leHQsaS5wcmV2PW8sby5uZXh0LnByZXY9aSxvLm5leHQ9aSk6KGkucHJldj1pLGkubmV4dD1pKSxpfWZ1bmN0aW9uIEpwdCh0KXt0Lm5leHQucHJldj10LnByZXYsdC5wcmV2Lm5leHQ9dC5uZXh0LHQucHJldlomJih0LnByZXZaLm5leHRaPXQubmV4dFopLHQubmV4dFomJih0Lm5leHRaLnByZXZaPXQucHJldlopfWZ1bmN0aW9uIFFwdCh0LGUsbil7dGhpcy5pPXQsdGhpcy54PWUsdGhpcy55PW4sdGhpcy5wcmV2PW51bGwsdGhpcy5uZXh0PW51bGwsdGhpcy56PW51bGwsdGhpcy5wcmV2Wj1udWxsLHRoaXMubmV4dFo9bnVsbCx0aGlzLnN0ZWluZXI9ITF9Y2xhc3MgJHB0e3N0YXRpYyBhcmVhKHQpe2NvbnN0IGU9dC5sZW5ndGg7bGV0IG49MDtmb3IobGV0IG89ZS0xLGk9MDtpPGU7bz1pKyspbis9dFtvXS54KnRbaV0ueS10W2ldLngqdFtvXS55O3JldHVybi41Km59c3RhdGljIGlzQ2xvY2tXaXNlKHQpe3JldHVybiAkcHQuYXJlYSh0KTwwfXN0YXRpYyB0cmlhbmd1bGF0ZVNoYXBlKHQsZSl7Y29uc3Qgbj1bXSxvPVtdLGk9W107dG10KHQpLGVtdChuLHQpO2xldCBhPXQubGVuZ3RoO2UuZm9yRWFjaCh0bXQpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKW8ucHVzaChhKSxhKz1lW3RdLmxlbmd0aCxlbXQobixlW3RdKTtjb25zdCByPShmdW5jdGlvbih0LGUsbj0yKXtjb25zdCBvPWUmJmUubGVuZ3RoLGk9bz9lWzBdKm46dC5sZW5ndGg7bGV0IGE9RHB0KHQsMCxpLG4sITApO2NvbnN0IHI9W107aWYoIWF8fGEubmV4dD09PWEucHJldilyZXR1cm4gcjtsZXQgcyxsLGMsZCxwLG0sdTtpZihvJiYoYT0oZnVuY3Rpb24gZih0LGUsbixvKXtjb25zdCBpPVtdO2xldCBhLHIscyxsLGM7Zm9yKGE9MCxyPWUubGVuZ3RoO2E8cjthKyspcz1lW2FdKm8sbD1hPHItMT9lW2ErMV0qbzp0Lmxlbmd0aCxjPURwdCh0LHMsbCxvLCExKSxjPT09Yy5uZXh0JiYoYy5zdGVpbmVyPSEwKSxpLnB1c2goQnB0KGMpKTtmb3IoaS5zb3J0KElwdCksYT0wO2E8aS5sZW5ndGg7YSsrKUhwdChpW2FdLG4pLG49RXB0KG4sbi5uZXh0KTtyZXR1cm4gbn0pKHQsZSxhLG4pKSx0Lmxlbmd0aD44MCpuKXtzPWM9dFswXSxsPWQ9dFsxXTtmb3IobGV0IGU9bjtlPGk7ZSs9bilwPXRbZV0sbT10W2UrMV0scDxzJiYocz1wKSxtPGwmJihsPW0pLHA+YyYmKGM9cCksbT5kJiYoZD1tKTt1PU1hdGgubWF4KGMtcyxkLWwpLHU9MCE9PXU/MS91OjB9cmV0dXJuIFJwdChhLHIsbixzLGwsdSkscn0pKG4sbyk7Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0Kz0zKWkucHVzaChyLnNsaWNlKHQsdCszKSk7cmV0dXJuIGl9fWZ1bmN0aW9uIHRtdCh0KXtjb25zdCBlPXQubGVuZ3RoO2U+MiYmdFtlLTFdLmVxdWFscyh0WzBdKSYmdC5wb3AoKX1mdW5jdGlvbiBlbXQodCxlKXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl0LnB1c2goZVtuXS54KSx0LnB1c2goZVtuXS55KX1jbGFzcyBubXQgZXh0ZW5kcyBxcnR7Y29uc3RydWN0b3IodCxlKXtzdXBlcigpLHRoaXMudHlwZT0iRXh0cnVkZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3NoYXBlczp0LG9wdGlvbnM6ZX0sdD1BcnJheS5pc0FycmF5KHQpP3Q6W3RdO2NvbnN0IG49dGhpcyxvPVtdLGk9W107Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKWEodFtlXSk7ZnVuY3Rpb24gYSh0KXtjb25zdCBhPVtdLHI9dm9pZCAwIT09ZS5jdXJ2ZVNlZ21lbnRzP2UuY3VydmVTZWdtZW50czoxMixzPXZvaWQgMCE9PWUuc3RlcHM/ZS5zdGVwczoxO2xldCBsPXZvaWQgMCE9PWUuZGVwdGg/ZS5kZXB0aDoxMDAsYz12b2lkIDA9PT1lLmJldmVsRW5hYmxlZHx8ZS5iZXZlbEVuYWJsZWQsZD12b2lkIDAhPT1lLmJldmVsVGhpY2tuZXNzP2UuYmV2ZWxUaGlja25lc3M6NixwPXZvaWQgMCE9PWUuYmV2ZWxTaXplP2UuYmV2ZWxTaXplOmQtMixtPXZvaWQgMCE9PWUuYmV2ZWxPZmZzZXQ/ZS5iZXZlbE9mZnNldDowLHU9dm9pZCAwIT09ZS5iZXZlbFNlZ21lbnRzP2UuYmV2ZWxTZWdtZW50czozO2NvbnN0IGY9ZS5leHRydWRlUGF0aCxnPXZvaWQgMCE9PWUuVVZHZW5lcmF0b3I/ZS5VVkdlbmVyYXRvcjpvbXQ7dm9pZCAwIT09ZS5hbW91bnQmJihjb25zb2xlLndhcm4oIlRIUkVFLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogYW1vdW50IGhhcyBiZWVuIHJlbmFtZWQgdG8gZGVwdGguIiksbD1lLmFtb3VudCk7bGV0IGgsYix5LF8sQyxNPSExO2YmJihoPWYuZ2V0U3BhY2VkUG9pbnRzKHMpLE09ITAsYz0hMSxiPWYuY29tcHV0ZUZyZW5ldEZyYW1lcyhzLCExKSx5PW5ldyBjYXQsXz1uZXcgY2F0LEM9bmV3IGNhdCksY3x8KHU9MCxkPTAscD0wLG09MCk7Y29uc3Qgdj10LmV4dHJhY3RQb2ludHMocik7bGV0IHg9di5zaGFwZTtjb25zdCBPPXYuaG9sZXM7aWYoISRwdC5pc0Nsb2NrV2lzZSh4KSl7eD14LnJldmVyc2UoKTtmb3IobGV0IHQ9MCxlPU8ubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9T1t0XTskcHQuaXNDbG9ja1dpc2UoZSkmJihPW3RdPWUucmV2ZXJzZSgpKX19Y29uc3QgUD0kcHQudHJpYW5ndWxhdGVTaGFwZSh4LE8pLHc9eDtmb3IobGV0IHQ9MCxlPU8ubGVuZ3RoO3Q8ZTt0KyspeD14LmNvbmNhdChPW3RdKTtmdW5jdGlvbiBrKHQsZSxuKXtyZXR1cm4gZXx8Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiB2ZWMgZG9lcyBub3QgZXhpc3QiKSxlLmNsb25lKCkubXVsdGlwbHlTY2FsYXIobikuYWRkKHQpfWNvbnN0IFM9eC5sZW5ndGgsRD1QLmxlbmd0aDtmdW5jdGlvbiBFKHQsZSxuKXtsZXQgbyxpLGE7Y29uc3Qgcj10LngtZS54LHM9dC55LWUueSxsPW4ueC10LngsYz1uLnktdC55LGQ9cipyK3MqcztpZihNYXRoLmFicyhyKmMtcypsKT5OdW1iZXIuRVBTSUxPTil7Y29uc3QgcD1NYXRoLnNxcnQoZCksbT1NYXRoLnNxcnQobCpsK2MqYyksdT1lLngtcy9wLGY9ZS55K3IvcCxnPSgobi54LWMvbS11KSpjLShuLnkrbC9tLWYpKmwpLyhyKmMtcypsKTtvPXUrcipnLXQueCxpPWYrcypnLXQueTtjb25zdCBoPW8qbytpKmk7aWYoaDw9MilyZXR1cm4gbmV3IFFpdChvLGkpO2E9TWF0aC5zcXJ0KGgvMil9ZWxzZXtsZXQgdD0hMTtyPk51bWJlci5FUFNJTE9OP2w+TnVtYmVyLkVQU0lMT04mJih0PSEwKTpyPC1OdW1iZXIuRVBTSUxPTj9sPC1OdW1iZXIuRVBTSUxPTiYmKHQ9ITApOk1hdGguc2lnbihzKT09PU1hdGguc2lnbihjKSYmKHQ9ITApLHQ/KG89LXMsaT1yLGE9TWF0aC5zcXJ0KGQpKToobz1yLGk9cyxhPU1hdGguc3FydChkLzIpKX1yZXR1cm4gbmV3IFFpdChvL2EsaS9hKX1jb25zdCBSPVtdO2ZvcihsZXQgdD0wLGU9dy5sZW5ndGgsbj1lLTEsbz10KzE7dDxlO3QrKyxuKyssbysrKW49PT1lJiYobj0wKSxvPT09ZSYmKG89MCksUlt0XT1FKHdbdF0sd1tuXSx3W29dKTtjb25zdCBBPVtdO2xldCBULE49Ui5jb25jYXQoKTtmb3IobGV0IHQ9MCxlPU8ubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9T1t0XTtUPVtdO2ZvcihsZXQgdD0wLG49ZS5sZW5ndGgsbz1uLTEsaT10KzE7dDxuO3QrKyxvKyssaSsrKW89PT1uJiYobz0wKSxpPT09biYmKGk9MCksVFt0XT1FKGVbdF0sZVtvXSxlW2ldKTtBLnB1c2goVCksTj1OLmNvbmNhdChUKX1mb3IobGV0IHQ9MDt0PHU7dCsrKXtjb25zdCBlPXQvdSxuPWQqTWF0aC5jb3MoZSpNYXRoLlBJLzIpLG89cCpNYXRoLnNpbihlKk1hdGguUEkvMikrbTtmb3IobGV0IHQ9MCxlPXcubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9ayh3W3RdLFJbdF0sbyk7SChlLngsZS55LC1uKX1mb3IobGV0IHQ9MCxlPU8ubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9T1t0XTtUPUFbdF07Zm9yKGxldCB0PTAsaT1lLmxlbmd0aDt0PGk7dCsrKXtjb25zdCBpPWsoZVt0XSxUW3RdLG8pO0goaS54LGkueSwtbil9fX1jb25zdCB6PXArbTtmb3IobGV0IHQ9MDt0PFM7dCsrKXtjb25zdCBlPWM/ayh4W3RdLE5bdF0seik6eFt0XTtNPyhfLmNvcHkoYi5ub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcihlLngpLHkuY29weShiLmJpbm9ybWFsc1swXSkubXVsdGlwbHlTY2FsYXIoZS55KSxDLmNvcHkoaFswXSkuYWRkKF8pLmFkZCh5KSxIKEMueCxDLnksQy56KSk6SChlLngsZS55LDApfWZvcihsZXQgdD0xO3Q8PXM7dCsrKWZvcihsZXQgZT0wO2U8UztlKyspe2NvbnN0IG49Yz9rKHhbZV0sTltlXSx6KTp4W2VdO00/KF8uY29weShiLm5vcm1hbHNbdF0pLm11bHRpcGx5U2NhbGFyKG4ueCkseS5jb3B5KGIuYmlub3JtYWxzW3RdKS5tdWx0aXBseVNjYWxhcihuLnkpLEMuY29weShoW3RdKS5hZGQoXykuYWRkKHkpLEgoQy54LEMueSxDLnopKTpIKG4ueCxuLnksbC9zKnQpfWZvcihsZXQgdD11LTE7dD49MDt0LS0pe2NvbnN0IGU9dC91LG49ZCpNYXRoLmNvcyhlKk1hdGguUEkvMiksbz1wKk1hdGguc2luKGUqTWF0aC5QSS8yKSttO2ZvcihsZXQgdD0wLGU9dy5sZW5ndGg7dDxlO3QrKyl7Y29uc3QgZT1rKHdbdF0sUlt0XSxvKTtIKGUueCxlLnksbCtuKX1mb3IobGV0IHQ9MCxlPU8ubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9T1t0XTtUPUFbdF07Zm9yKGxldCB0PTAsaT1lLmxlbmd0aDt0PGk7dCsrKXtjb25zdCBpPWsoZVt0XSxUW3RdLG8pO00/SChpLngsaS55K2hbcy0xXS55LGhbcy0xXS54K24pOkgoaS54LGkueSxsK24pfX19ZnVuY3Rpb24gSSh0LGUpe2xldCBuPXQubGVuZ3RoO2Zvcig7LS1uPj0wOyl7Y29uc3Qgbz1uO2xldCBpPW4tMTtpPDAmJihpPXQubGVuZ3RoLTEpO2ZvcihsZXQgdD0wLG49cysyKnU7dDxuO3QrKyl7Y29uc3Qgbj1TKnQsYT1TKih0KzEpO0woZStvK24sZStpK24sZStpK2EsZStvK2EpfX19ZnVuY3Rpb24gSCh0LGUsbil7YS5wdXNoKHQpLGEucHVzaChlKSxhLnB1c2gobil9ZnVuY3Rpb24gRih0LGUsaSl7Qih0KSxCKGUpLEIoaSk7Y29uc3QgYT1vLmxlbmd0aC8zLHI9Zy5nZW5lcmF0ZVRvcFVWKG4sbyxhLTMsYS0yLGEtMSk7VihyWzBdKSxWKHJbMV0pLFYoclsyXSl9ZnVuY3Rpb24gTCh0LGUsaSxhKXtCKHQpLEIoZSksQihhKSxCKGUpLEIoaSksQihhKTtjb25zdCByPW8ubGVuZ3RoLzMscz1nLmdlbmVyYXRlU2lkZVdhbGxVVihuLG8sci02LHItMyxyLTIsci0xKTtWKHNbMF0pLFYoc1sxXSksVihzWzNdKSxWKHNbMV0pLFYoc1syXSksVihzWzNdKX1mdW5jdGlvbiBCKHQpe28ucHVzaChhWzMqdCswXSksby5wdXNoKGFbMyp0KzFdKSxvLnB1c2goYVszKnQrMl0pfWZ1bmN0aW9uIFYodCl7aS5wdXNoKHQueCksaS5wdXNoKHQueSl9IShmdW5jdGlvbiBqKCl7Y29uc3QgdD1vLmxlbmd0aC8zO2lmKGMpe2xldCB0PTAsZT1TKnQ7Zm9yKGxldCB0PTA7dDxEO3QrKyl7Y29uc3Qgbj1QW3RdO0YoblsyXStlLG5bMV0rZSxuWzBdK2UpfXQ9cysyKnUsZT1TKnQ7Zm9yKGxldCB0PTA7dDxEO3QrKyl7Y29uc3Qgbj1QW3RdO0YoblswXStlLG5bMV0rZSxuWzJdK2UpfX1lbHNle2ZvcihsZXQgdD0wO3Q8RDt0Kyspe2NvbnN0IGU9UFt0XTtGKGVbMl0sZVsxXSxlWzBdKX1mb3IobGV0IHQ9MDt0PEQ7dCsrKXtjb25zdCBlPVBbdF07RihlWzBdK1MqcyxlWzFdK1MqcyxlWzJdK1Mqcyl9fW4uYWRkR3JvdXAodCxvLmxlbmd0aC8zLXQsMCl9KSgpLChmdW5jdGlvbiBVKCl7Y29uc3QgdD1vLmxlbmd0aC8zO2xldCBlPTA7SSh3LGUpLGUrPXcubGVuZ3RoO2ZvcihsZXQgdD0wLG49Ty5sZW5ndGg7dDxuO3QrKyl7Y29uc3Qgbj1PW3RdO0kobixlKSxlKz1uLmxlbmd0aH1uLmFkZEdyb3VwKHQsby5sZW5ndGgvMy10LDEpfSkoKX10aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBGcnQobywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgRnJ0KGksMikpLHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKX10b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybihmdW5jdGlvbiBlKHQsbixvKXtpZihvLnNoYXBlcz1bXSxBcnJheS5pc0FycmF5KHQpKWZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKylvLnNoYXBlcy5wdXNoKHRbZV0udXVpZCk7ZWxzZSBvLnNoYXBlcy5wdXNoKHQudXVpZCk7cmV0dXJuIHZvaWQgMCE9PW4uZXh0cnVkZVBhdGgmJihvLm9wdGlvbnMuZXh0cnVkZVBhdGg9bi5leHRydWRlUGF0aC50b0pTT04oKSksb30pKHRoaXMucGFyYW1ldGVycy5zaGFwZXMsdGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnMsdCl9c3RhdGljIGZyb21KU09OKHQsZSl7Y29uc3Qgbj1bXTtmb3IobGV0IG89MCxpPXQuc2hhcGVzLmxlbmd0aDtvPGk7bysrKW4ucHVzaChlW3Quc2hhcGVzW29dXSk7Y29uc3Qgbz10Lm9wdGlvbnMuZXh0cnVkZVBhdGg7cmV0dXJuIHZvaWQgMCE9PW8mJih0Lm9wdGlvbnMuZXh0cnVkZVBhdGg9KG5ldyBTcHRbby50eXBlXSkuZnJvbUpTT04obykpLG5ldyBubXQobix0Lm9wdGlvbnMpfX1jb25zdCBvbXQ9e2dlbmVyYXRlVG9wVVY6ZnVuY3Rpb24odCxlLG4sbyxpKXtjb25zdCBhPWVbMypvXSxyPWVbMypvKzFdLHM9ZVszKmldLGw9ZVszKmkrMV07cmV0dXJuW25ldyBRaXQoZVszKm5dLGVbMypuKzFdKSxuZXcgUWl0KGEsciksbmV3IFFpdChzLGwpXX0sZ2VuZXJhdGVTaWRlV2FsbFVWOmZ1bmN0aW9uKHQsZSxuLG8saSxhKXtjb25zdCByPWVbMypuXSxzPWVbMypuKzFdLGw9ZVszKm4rMl0sYz1lWzMqb10sZD1lWzMqbysxXSxwPWVbMypvKzJdLG09ZVszKmldLHU9ZVszKmkrMV0sZj1lWzMqaSsyXSxnPWVbMyphXSxoPWVbMyphKzFdLGI9ZVszKmErMl07cmV0dXJuIE1hdGguYWJzKHMtZCk8TWF0aC5hYnMoci1jKT9bbmV3IFFpdChyLDEtbCksbmV3IFFpdChjLDEtcCksbmV3IFFpdChtLDEtZiksbmV3IFFpdChnLDEtYildOltuZXcgUWl0KHMsMS1sKSxuZXcgUWl0KGQsMS1wKSxuZXcgUWl0KHUsMS1mKSxuZXcgUWl0KGgsMS1iKV19fTtjbGFzcyBpbXQgZXh0ZW5kcyBxcnR7Y29uc3RydWN0b3IodCxlPTEyKXtzdXBlcigpLHRoaXMudHlwZT0iU2hhcGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6dCxjdXJ2ZVNlZ21lbnRzOmV9O2NvbnN0IG49W10sbz1bXSxpPVtdLGE9W107bGV0IHI9MCxzPTA7aWYoITE9PT1BcnJheS5pc0FycmF5KHQpKWwodCk7ZWxzZSBmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKylsKHRbZV0pLHRoaXMuYWRkR3JvdXAocixzLGUpLHIrPXMscz0wO2Z1bmN0aW9uIGwodCl7Y29uc3Qgcj1vLmxlbmd0aC8zLGw9dC5leHRyYWN0UG9pbnRzKGUpO2xldCBjPWwuc2hhcGU7Y29uc3QgZD1sLmhvbGVzOyExPT09JHB0LmlzQ2xvY2tXaXNlKGMpJiYoYz1jLnJldmVyc2UoKSk7Zm9yKGxldCB0PTAsZT1kLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPWRbdF07ITA9PT0kcHQuaXNDbG9ja1dpc2UoZSkmJihkW3RdPWUucmV2ZXJzZSgpKX1jb25zdCBwPSRwdC50cmlhbmd1bGF0ZVNoYXBlKGMsZCk7Zm9yKGxldCB0PTAsZT1kLmxlbmd0aDt0PGU7dCsrKWM9Yy5jb25jYXQoZFt0XSk7Zm9yKGxldCB0PTAsZT1jLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPWNbdF07by5wdXNoKGUueCxlLnksMCksaS5wdXNoKDAsMCwxKSxhLnB1c2goZS54LGUueSl9Zm9yKGxldCB0PTAsZT1wLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPXBbdF07bi5wdXNoKGVbMF0rcixlWzFdK3IsZVsyXStyKSxzKz0zfX10aGlzLnNldEluZGV4KG4pLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IEZydChvLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgRnJ0KGksMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IEZydChhLDIpKX10b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybihmdW5jdGlvbiBlKHQsbil7aWYobi5zaGFwZXM9W10sQXJyYXkuaXNBcnJheSh0KSlmb3IobGV0IGU9MCxvPXQubGVuZ3RoO2U8bztlKyspbi5zaGFwZXMucHVzaCh0W2VdLnV1aWQpO2Vsc2Ugbi5zaGFwZXMucHVzaCh0LnV1aWQpO3JldHVybiBufSkodGhpcy5wYXJhbWV0ZXJzLnNoYXBlcyx0KX1zdGF0aWMgZnJvbUpTT04odCxlKXtjb25zdCBuPVtdO2ZvcihsZXQgbz0wLGk9dC5zaGFwZXMubGVuZ3RoO288aTtvKyspbi5wdXNoKGVbdC5zaGFwZXNbb11dKTtyZXR1cm4gbmV3IGltdChuLHQuY3VydmVTZWdtZW50cyl9fShjbGFzcyBleHRlbmRzIE9ydHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iU2hhZG93TWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IFJydCgwKSx0aGlzLnRyYW5zcGFyZW50PSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXN9fSkucHJvdG90eXBlLmlzU2hhZG93TWF0ZXJpYWw9ITA7Y2xhc3MgYW10IGV4dGVuZHMgT3J0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIn0sdGhpcy50eXBlPSJNZXNoU3RhbmRhcmRNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgUnJ0KDE2Nzc3MjE1KSx0aGlzLnJvdWdobmVzcz0xLHRoaXMubWV0YWxuZXNzPTAsdGhpcy5tYXA9bnVsbCx0aGlzLmxpZ2h0TWFwPW51bGwsdGhpcy5saWdodE1hcEludGVuc2l0eT0xLHRoaXMuYW9NYXA9bnVsbCx0aGlzLmFvTWFwSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZT1uZXcgUnJ0KDApLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlTWFwPW51bGwsdGhpcy5idW1wTWFwPW51bGwsdGhpcy5idW1wU2NhbGU9MSx0aGlzLm5vcm1hbE1hcD1udWxsLHRoaXMubm9ybWFsTWFwVHlwZT0wLHRoaXMubm9ybWFsU2NhbGU9bmV3IFFpdCgxLDEpLHRoaXMuZGlzcGxhY2VtZW50TWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz0wLHRoaXMucm91Z2huZXNzTWFwPW51bGwsdGhpcy5tZXRhbG5lc3NNYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5lbnZNYXA9bnVsbCx0aGlzLmVudk1hcEludGVuc2l0eT0xLHRoaXMucmVmcmFjdGlvblJhdGlvPS45OCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiLHRoaXMud2lyZWZyYW1lTGluZWpvaW49InJvdW5kIix0aGlzLmZsYXRTaGFkaW5nPSExLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIn0sdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMucm91Z2huZXNzPXQucm91Z2huZXNzLHRoaXMubWV0YWxuZXNzPXQubWV0YWxuZXNzLHRoaXMubWFwPXQubWFwLHRoaXMubGlnaHRNYXA9dC5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD10LmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSx0aGlzLmVtaXNzaXZlLmNvcHkodC5lbWlzc2l2ZSksdGhpcy5lbWlzc2l2ZU1hcD10LmVtaXNzaXZlTWFwLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9dC5lbWlzc2l2ZUludGVuc2l0eSx0aGlzLmJ1bXBNYXA9dC5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPXQuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPXQubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMucm91Z2huZXNzTWFwPXQucm91Z2huZXNzTWFwLHRoaXMubWV0YWxuZXNzTWFwPXQubWV0YWxuZXNzTWFwLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLmVudk1hcD10LmVudk1hcCx0aGlzLmVudk1hcEludGVuc2l0eT10LmVudk1hcEludGVuc2l0eSx0aGlzLnJlZnJhY3Rpb25SYXRpbz10LnJlZnJhY3Rpb25SYXRpbyx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbix0aGlzLmZsYXRTaGFkaW5nPXQuZmxhdFNoYWRpbmcsdGhpc319YW10LnByb3RvdHlwZS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsPSEwLGNsYXNzIGV4dGVuZHMgYW10e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIixQSFlTSUNBTDoiIn0sdGhpcy50eXBlPSJNZXNoUGh5c2ljYWxNYXRlcmlhbCIsdGhpcy5jbGVhcmNvYXQ9MCx0aGlzLmNsZWFyY29hdE1hcD1udWxsLHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzPTAsdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXA9bnVsbCx0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlPW5ldyBRaXQoMSwxKSx0aGlzLmNsZWFyY29hdE5vcm1hbE1hcD1udWxsLHRoaXMucmVmbGVjdGl2aXR5PS41LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpb3IiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4oMSsuNCp0aGlzLnJlZmxlY3Rpdml0eSkvKDEtLjQqdGhpcy5yZWZsZWN0aXZpdHkpfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5yZWZsZWN0aXZpdHk9Wml0KDIuNSoodC0xKS8odCsxKSwwLDEpfX0pLHRoaXMuc2hlZW49bnVsbCx0aGlzLnRyYW5zbWlzc2lvbj0wLHRoaXMudHJhbnNtaXNzaW9uTWFwPW51bGwsdGhpcy50aGlja25lc3M9LjAxLHRoaXMudGhpY2tuZXNzTWFwPW51bGwsdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlPTAsdGhpcy5hdHRlbnVhdGlvblRpbnQ9bmV3IFJydCgxLDEsMSksdGhpcy5zcGVjdWxhckludGVuc2l0eT0xLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXA9bnVsbCx0aGlzLnNwZWN1bGFyVGludD1uZXcgUnJ0KDEsMSwxKSx0aGlzLnNwZWN1bGFyVGludE1hcD1udWxsLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIixQSFlTSUNBTDoiIn0sdGhpcy5jbGVhcmNvYXQ9dC5jbGVhcmNvYXQsdGhpcy5jbGVhcmNvYXRNYXA9dC5jbGVhcmNvYXRNYXAsdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3M9dC5jbGVhcmNvYXRSb3VnaG5lc3MsdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXA9dC5jbGVhcmNvYXRSb3VnaG5lc3NNYXAsdGhpcy5jbGVhcmNvYXROb3JtYWxNYXA9dC5jbGVhcmNvYXROb3JtYWxNYXAsdGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZS5jb3B5KHQuY2xlYXJjb2F0Tm9ybWFsU2NhbGUpLHRoaXMucmVmbGVjdGl2aXR5PXQucmVmbGVjdGl2aXR5LHRoaXMuc2hlZW49dC5zaGVlbj8odGhpcy5zaGVlbnx8bmV3IFJydCkuY29weSh0LnNoZWVuKTpudWxsLHRoaXMudHJhbnNtaXNzaW9uPXQudHJhbnNtaXNzaW9uLHRoaXMudHJhbnNtaXNzaW9uTWFwPXQudHJhbnNtaXNzaW9uTWFwLHRoaXMudGhpY2tuZXNzPXQudGhpY2tuZXNzLHRoaXMudGhpY2tuZXNzTWFwPXQudGhpY2tuZXNzTWFwLHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZT10LmF0dGVudWF0aW9uRGlzdGFuY2UsdGhpcy5hdHRlbnVhdGlvblRpbnQuY29weSh0LmF0dGVudWF0aW9uVGludCksdGhpcy5zcGVjdWxhckludGVuc2l0eT10LnNwZWN1bGFySW50ZW5zaXR5LHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXA9dC5zcGVjdWxhckludGVuc2l0eU1hcCx0aGlzLnNwZWN1bGFyVGludC5jb3B5KHQuc3BlY3VsYXJUaW50KSx0aGlzLnNwZWN1bGFyVGludE1hcD10LnNwZWN1bGFyVGludE1hcCx0aGlzfX0ucHJvdG90eXBlLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWw9ITAsY2xhc3MgZXh0ZW5kcyBPcnR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9Ik1lc2hQaG9uZ01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyBScnQoMTY3NzcyMTUpLHRoaXMuc3BlY3VsYXI9bmV3IFJydCgxMTE4NDgxKSx0aGlzLnNoaW5pbmVzcz0zMCx0aGlzLm1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlPW5ldyBScnQoMCksdGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmVNYXA9bnVsbCx0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPTAsdGhpcy5ub3JtYWxTY2FsZT1uZXcgUWl0KDEsMSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy5zcGVjdWxhck1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmVudk1hcD1udWxsLHRoaXMuY29tYmluZT0wLHRoaXMucmVmbGVjdGl2aXR5PTEsdGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4LHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuZmxhdFNoYWRpbmc9ITEsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5zcGVjdWxhci5jb3B5KHQuc3BlY3VsYXIpLHRoaXMuc2hpbmluZXNzPXQuc2hpbmluZXNzLHRoaXMubWFwPXQubWFwLHRoaXMubGlnaHRNYXA9dC5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD10LmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSx0aGlzLmVtaXNzaXZlLmNvcHkodC5lbWlzc2l2ZSksdGhpcy5lbWlzc2l2ZU1hcD10LmVtaXNzaXZlTWFwLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9dC5lbWlzc2l2ZUludGVuc2l0eSx0aGlzLmJ1bXBNYXA9dC5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPXQuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPXQubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMuc3BlY3VsYXJNYXA9dC5zcGVjdWxhck1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5lbnZNYXA9dC5lbnZNYXAsdGhpcy5jb21iaW5lPXQuY29tYmluZSx0aGlzLnJlZmxlY3Rpdml0eT10LnJlZmxlY3Rpdml0eSx0aGlzLnJlZnJhY3Rpb25SYXRpbz10LnJlZnJhY3Rpb25SYXRpbyx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbix0aGlzLmZsYXRTaGFkaW5nPXQuZmxhdFNoYWRpbmcsdGhpc319LnByb3RvdHlwZS5pc01lc2hQaG9uZ01hdGVyaWFsPSEwLGNsYXNzIGV4dGVuZHMgT3J0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5kZWZpbmVzPXtUT09OOiIifSx0aGlzLnR5cGU9Ik1lc2hUb29uTWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IFJydCgxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmdyYWRpZW50TWFwPW51bGwsdGhpcy5saWdodE1hcD1udWxsLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9MSx0aGlzLmFvTWFwPW51bGwsdGhpcy5hb01hcEludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmU9bmV3IFJydCgwKSx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZU1hcD1udWxsLHRoaXMuYnVtcE1hcD1udWxsLHRoaXMuYnVtcFNjYWxlPTEsdGhpcy5ub3JtYWxNYXA9bnVsbCx0aGlzLm5vcm1hbE1hcFR5cGU9MCx0aGlzLm5vcm1hbFNjYWxlPW5ldyBRaXQoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIix0aGlzLndpcmVmcmFtZUxpbmVqb2luPSJyb3VuZCIsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXA9dC5tYXAsdGhpcy5ncmFkaWVudE1hcD10LmdyYWRpZW50TWFwLHRoaXMubGlnaHRNYXA9dC5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD10LmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSx0aGlzLmVtaXNzaXZlLmNvcHkodC5lbWlzc2l2ZSksdGhpcy5lbWlzc2l2ZU1hcD10LmVtaXNzaXZlTWFwLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9dC5lbWlzc2l2ZUludGVuc2l0eSx0aGlzLmJ1bXBNYXA9dC5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPXQuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPXQubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbix0aGlzfX0ucHJvdG90eXBlLmlzTWVzaFRvb25NYXRlcmlhbD0hMCxjbGFzcyBleHRlbmRzIE9ydHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iTWVzaE5vcm1hbE1hdGVyaWFsIix0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPTAsdGhpcy5ub3JtYWxTY2FsZT1uZXcgUWl0KDEsMSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLmZvZz0hMSx0aGlzLmZsYXRTaGFkaW5nPSExLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5idW1wTWFwPXQuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT10LmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD10Lm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9dC5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weSh0Lm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD10LmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPXQuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPXQuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLmZsYXRTaGFkaW5nPXQuZmxhdFNoYWRpbmcsdGhpc319LnByb3RvdHlwZS5pc01lc2hOb3JtYWxNYXRlcmlhbD0hMCxjbGFzcyBleHRlbmRzIE9ydHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iTWVzaExhbWJlcnRNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgUnJ0KDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlPW5ldyBScnQoMCksdGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmVNYXA9bnVsbCx0aGlzLnNwZWN1bGFyTWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZW52TWFwPW51bGwsdGhpcy5jb21iaW5lPTAsdGhpcy5yZWZsZWN0aXZpdHk9MSx0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTgsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIix0aGlzLndpcmVmcmFtZUxpbmVqb2luPSJyb3VuZCIsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXA9dC5tYXAsdGhpcy5saWdodE1hcD10LmxpZ2h0TWFwLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9dC5saWdodE1hcEludGVuc2l0eSx0aGlzLmFvTWFwPXQuYW9NYXAsdGhpcy5hb01hcEludGVuc2l0eT10LmFvTWFwSW50ZW5zaXR5LHRoaXMuZW1pc3NpdmUuY29weSh0LmVtaXNzaXZlKSx0aGlzLmVtaXNzaXZlTWFwPXQuZW1pc3NpdmVNYXAsdGhpcy5lbWlzc2l2ZUludGVuc2l0eT10LmVtaXNzaXZlSW50ZW5zaXR5LHRoaXMuc3BlY3VsYXJNYXA9dC5zcGVjdWxhck1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5lbnZNYXA9dC5lbnZNYXAsdGhpcy5jb21iaW5lPXQuY29tYmluZSx0aGlzLnJlZmxlY3Rpdml0eT10LnJlZmxlY3Rpdml0eSx0aGlzLnJlZnJhY3Rpb25SYXRpbz10LnJlZnJhY3Rpb25SYXRpbyx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbix0aGlzfX0ucHJvdG90eXBlLmlzTWVzaExhbWJlcnRNYXRlcmlhbD0hMCxjbGFzcyBleHRlbmRzIE9ydHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuZGVmaW5lcz17TUFUQ0FQOiIifSx0aGlzLnR5cGU9Ik1lc2hNYXRjYXBNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgUnJ0KDE2Nzc3MjE1KSx0aGlzLm1hdGNhcD1udWxsLHRoaXMubWFwPW51bGwsdGhpcy5idW1wTWFwPW51bGwsdGhpcy5idW1wU2NhbGU9MSx0aGlzLm5vcm1hbE1hcD1udWxsLHRoaXMubm9ybWFsTWFwVHlwZT0wLHRoaXMubm9ybWFsU2NhbGU9bmV3IFFpdCgxLDEpLHRoaXMuZGlzcGxhY2VtZW50TWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz0wLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmZsYXRTaGFkaW5nPSExLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5kZWZpbmVzPXtNQVRDQVA6IiJ9LHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSx0aGlzLm1hdGNhcD10Lm1hdGNhcCx0aGlzLm1hcD10Lm1hcCx0aGlzLmJ1bXBNYXA9dC5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPXQuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPXQubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLmZsYXRTaGFkaW5nPXQuZmxhdFNoYWRpbmcsdGhpc319LnByb3RvdHlwZS5pc01lc2hNYXRjYXBNYXRlcmlhbD0hMCxjbGFzcyBleHRlbmRzIHFkdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iTGluZURhc2hlZE1hdGVyaWFsIix0aGlzLnNjYWxlPTEsdGhpcy5kYXNoU2l6ZT0zLHRoaXMuZ2FwU2l6ZT0xLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5zY2FsZT10LnNjYWxlLHRoaXMuZGFzaFNpemU9dC5kYXNoU2l6ZSx0aGlzLmdhcFNpemU9dC5nYXBTaXplLHRoaXN9fS5wcm90b3R5cGUuaXNMaW5lRGFzaGVkTWF0ZXJpYWw9ITA7Y29uc3Qgcm10PXthcnJheVNsaWNlOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcm10LmlzVHlwZWRBcnJheSh0KT9uZXcgdC5jb25zdHJ1Y3Rvcih0LnN1YmFycmF5KGUsdm9pZCAwIT09bj9uOnQubGVuZ3RoKSk6dC5zbGljZShlLG4pfSxjb252ZXJ0QXJyYXk6ZnVuY3Rpb24odCxlLG4pe3JldHVybiF0fHwhbiYmdC5jb25zdHJ1Y3Rvcj09PWU/dDoibnVtYmVyIj09dHlwZW9mIGUuQllURVNfUEVSX0VMRU1FTlQ/bmV3IGUodCk6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCl9LGlzVHlwZWRBcnJheTpmdW5jdGlvbih0KXtyZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KHQpJiYhKHQgaW5zdGFuY2VvZiBEYXRhVmlldyl9LGdldEtleWZyYW1lT3JkZXI6ZnVuY3Rpb24odCl7Y29uc3QgZT10Lmxlbmd0aCxuPW5ldyBBcnJheShlKTtmb3IobGV0IHQ9MDt0IT09ZTsrK3Qpblt0XT10O3JldHVybiBuLnNvcnQoKGZ1bmN0aW9uIG8oZSxuKXtyZXR1cm4gdFtlXS10W25dfSkpLG59LHNvcnRlZEFycmF5OmZ1bmN0aW9uKHQsZSxuKXtjb25zdCBvPXQubGVuZ3RoLGk9bmV3IHQuY29uc3RydWN0b3Iobyk7Zm9yKGxldCBhPTAscj0wO3IhPT1vOysrYSl7Y29uc3Qgbz1uW2FdKmU7Zm9yKGxldCBuPTA7biE9PWU7KytuKWlbcisrXT10W28rbl19cmV0dXJuIGl9LGZsYXR0ZW5KU09OOmZ1bmN0aW9uKHQsZSxuLG8pe2xldCBpPTEsYT10WzBdO2Zvcig7dm9pZCAwIT09YSYmdm9pZCAwPT09YVtvXTspYT10W2krK107aWYodm9pZCAwPT09YSlyZXR1cm47bGV0IHI9YVtvXTtpZih2b2lkIDAhPT1yKWlmKEFycmF5LmlzQXJyYXkocikpZG97cj1hW29dLHZvaWQgMCE9PXImJihlLnB1c2goYS50aW1lKSxuLnB1c2guYXBwbHkobixyKSksYT10W2krK119d2hpbGUodm9pZCAwIT09YSk7ZWxzZSBpZih2b2lkIDAhPT1yLnRvQXJyYXkpZG97cj1hW29dLHZvaWQgMCE9PXImJihlLnB1c2goYS50aW1lKSxyLnRvQXJyYXkobixuLmxlbmd0aCkpLGE9dFtpKytdfXdoaWxlKHZvaWQgMCE9PWEpO2Vsc2UgZG97cj1hW29dLHZvaWQgMCE9PXImJihlLnB1c2goYS50aW1lKSxuLnB1c2gocikpLGE9dFtpKytdfXdoaWxlKHZvaWQgMCE9PWEpfSxzdWJjbGlwOmZ1bmN0aW9uKHQsZSxuLG8saT0zMCl7Y29uc3QgYT10LmNsb25lKCk7YS5uYW1lPWU7Y29uc3Qgcj1bXTtmb3IobGV0IHQ9MDt0PGEudHJhY2tzLmxlbmd0aDsrK3Qpe2NvbnN0IGU9YS50cmFja3NbdF0scz1lLmdldFZhbHVlU2l6ZSgpLGw9W10sYz1bXTtmb3IobGV0IHQ9MDt0PGUudGltZXMubGVuZ3RoOysrdCl7Y29uc3QgYT1lLnRpbWVzW3RdKmk7aWYoIShhPG58fGE+PW8pKXtsLnB1c2goZS50aW1lc1t0XSk7Zm9yKGxldCBuPTA7bjxzOysrbiljLnB1c2goZS52YWx1ZXNbdCpzK25dKX19MCE9PWwubGVuZ3RoJiYoZS50aW1lcz1ybXQuY29udmVydEFycmF5KGwsZS50aW1lcy5jb25zdHJ1Y3RvciksZS52YWx1ZXM9cm10LmNvbnZlcnRBcnJheShjLGUudmFsdWVzLmNvbnN0cnVjdG9yKSxyLnB1c2goZSkpfWEudHJhY2tzPXI7bGV0IHM9MS8wO2ZvcihsZXQgdD0wO3Q8YS50cmFja3MubGVuZ3RoOysrdClzPmEudHJhY2tzW3RdLnRpbWVzWzBdJiYocz1hLnRyYWNrc1t0XS50aW1lc1swXSk7Zm9yKGxldCB0PTA7dDxhLnRyYWNrcy5sZW5ndGg7Kyt0KWEudHJhY2tzW3RdLnNoaWZ0KC0xKnMpO3JldHVybiBhLnJlc2V0RHVyYXRpb24oKSxhfSxtYWtlQ2xpcEFkZGl0aXZlOmZ1bmN0aW9uKHQsZT0wLG49dCxvPTMwKXtvPD0wJiYobz0zMCk7Y29uc3QgaT1uLnRyYWNrcy5sZW5ndGgsYT1lL287Zm9yKGxldCBlPTA7ZTxpOysrZSl7Y29uc3Qgbz1uLnRyYWNrc1tlXSxpPW8uVmFsdWVUeXBlTmFtZTtpZigiYm9vbCI9PT1pfHwic3RyaW5nIj09PWkpY29udGludWU7Y29uc3Qgcj10LnRyYWNrcy5maW5kKChmdW5jdGlvbih0KXtyZXR1cm4gdC5uYW1lPT09by5uYW1lJiZ0LlZhbHVlVHlwZU5hbWU9PT1pfSkpO2lmKHZvaWQgMD09PXIpY29udGludWU7bGV0IHM9MDtjb25zdCBsPW8uZ2V0VmFsdWVTaXplKCk7by5jcmVhdGVJbnRlcnBvbGFudC5pc0ludGVycG9sYW50RmFjdG9yeU1ldGhvZEdMVEZDdWJpY1NwbGluZSYmKHM9bC8zKTtsZXQgYz0wO2NvbnN0IGQ9ci5nZXRWYWx1ZVNpemUoKTtyLmNyZWF0ZUludGVycG9sYW50LmlzSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kR0xURkN1YmljU3BsaW5lJiYoYz1kLzMpO2NvbnN0IHA9by50aW1lcy5sZW5ndGgtMTtsZXQgbTtpZihhPD1vLnRpbWVzWzBdKW09cm10LmFycmF5U2xpY2Uoby52YWx1ZXMscyxsLXMpO2Vsc2UgaWYoYT49by50aW1lc1twXSl7Y29uc3QgdD1wKmwrczttPXJtdC5hcnJheVNsaWNlKG8udmFsdWVzLHQsdCtsLXMpfWVsc2V7Y29uc3QgdD1vLmNyZWF0ZUludGVycG9sYW50KCksZT1zLG49bC1zO3QuZXZhbHVhdGUoYSksbT1ybXQuYXJyYXlTbGljZSh0LnJlc3VsdEJ1ZmZlcixlLG4pfSJxdWF0ZXJuaW9uIj09PWkmJihuZXcgbGF0KS5mcm9tQXJyYXkobSkubm9ybWFsaXplKCkuY29uanVnYXRlKCkudG9BcnJheShtKTtjb25zdCB1PXIudGltZXMubGVuZ3RoO2ZvcihsZXQgdD0wO3Q8dTsrK3Qpe2NvbnN0IGU9dCpkK2M7aWYoInF1YXRlcm5pb24iPT09aSlsYXQubXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQoci52YWx1ZXMsZSxtLDAsci52YWx1ZXMsZSk7ZWxzZXtjb25zdCB0PWQtMipjO2ZvcihsZXQgbj0wO248dDsrK24pci52YWx1ZXNbZStuXS09bVtuXX19fXJldHVybiB0LmJsZW5kTW9kZT0yNTAxLHR9fTtjbGFzcyBzbXR7Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnM9dCx0aGlzLl9jYWNoZWRJbmRleD0wLHRoaXMucmVzdWx0QnVmZmVyPXZvaWQgMCE9PW8/bzpuZXcgZS5jb25zdHJ1Y3RvcihuKSx0aGlzLnNhbXBsZVZhbHVlcz1lLHRoaXMudmFsdWVTaXplPW4sdGhpcy5zZXR0aW5ncz1udWxsLHRoaXMuRGVmYXVsdFNldHRpbmdzXz17fX1ldmFsdWF0ZSh0KXtjb25zdCBlPXRoaXMucGFyYW1ldGVyUG9zaXRpb25zO2xldCBuPXRoaXMuX2NhY2hlZEluZGV4LG89ZVtuXSxpPWVbbi0xXTt0OntlOntsZXQgYTtuOntvOmlmKCEodDxvKSl7Zm9yKGxldCBhPW4rMjs7KXtpZih2b2lkIDA9PT1vKXtpZih0PGkpYnJlYWsgbztyZXR1cm4gbj1lLmxlbmd0aCx0aGlzLl9jYWNoZWRJbmRleD1uLHRoaXMuYWZ0ZXJFbmRfKG4tMSx0LGkpfWlmKG49PT1hKWJyZWFrO2lmKGk9byxvPWVbKytuXSx0PG8pYnJlYWsgZX1hPWUubGVuZ3RoO2JyZWFrIG59aWYodD49aSlicmVhayB0O3tjb25zdCByPWVbMV07dDxyJiYobj0yLGk9cik7Zm9yKGxldCBhPW4tMjs7KXtpZih2b2lkIDA9PT1pKXJldHVybiB0aGlzLl9jYWNoZWRJbmRleD0wLHRoaXMuYmVmb3JlU3RhcnRfKDAsdCxvKTtpZihuPT09YSlicmVhaztpZihvPWksaT1lWy0tbi0xXSx0Pj1pKWJyZWFrIGV9YT1uLG49MH19Zm9yKDtuPGE7KXtjb25zdCBvPW4rYT4+PjE7dDxlW29dP2E9bzpuPW8rMX1pZihvPWVbbl0saT1lW24tMV0sdm9pZCAwPT09aSlyZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXg9MCx0aGlzLmJlZm9yZVN0YXJ0XygwLHQsbyk7aWYodm9pZCAwPT09bylyZXR1cm4gbj1lLmxlbmd0aCx0aGlzLl9jYWNoZWRJbmRleD1uLHRoaXMuYWZ0ZXJFbmRfKG4tMSxpLHQpfXRoaXMuX2NhY2hlZEluZGV4PW4sdGhpcy5pbnRlcnZhbENoYW5nZWRfKG4saSxvKX1yZXR1cm4gdGhpcy5pbnRlcnBvbGF0ZV8obixpLHQsbyl9Z2V0U2V0dGluZ3NfKCl7cmV0dXJuIHRoaXMuc2V0dGluZ3N8fHRoaXMuRGVmYXVsdFNldHRpbmdzX31jb3B5U2FtcGxlVmFsdWVfKHQpe2NvbnN0IGU9dGhpcy5yZXN1bHRCdWZmZXIsbj10aGlzLnNhbXBsZVZhbHVlcyxvPXRoaXMudmFsdWVTaXplLGk9dCpvO2ZvcihsZXQgdD0wO3QhPT1vOysrdCllW3RdPW5baSt0XTtyZXR1cm4gZX1pbnRlcnBvbGF0ZV8oKXt0aHJvdyBuZXcgRXJyb3IoImNhbGwgdG8gYWJzdHJhY3QgbWV0aG9kIil9aW50ZXJ2YWxDaGFuZ2VkXygpe319c210LnByb3RvdHlwZS5iZWZvcmVTdGFydF89c210LnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVfLHNtdC5wcm90b3R5cGUuYWZ0ZXJFbmRfPXNtdC5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXztjbGFzcyBsbXQgZXh0ZW5kcyBzbXR7Y29uc3RydWN0b3IodCxlLG4sbyl7c3VwZXIodCxlLG4sbyksdGhpcy5fd2VpZ2h0UHJldj0tMCx0aGlzLl9vZmZzZXRQcmV2PS0wLHRoaXMuX3dlaWdodE5leHQ9LTAsdGhpcy5fb2Zmc2V0TmV4dD0tMCx0aGlzLkRlZmF1bHRTZXR0aW5nc189e2VuZGluZ1N0YXJ0OkFpdCxlbmRpbmdFbmQ6QWl0fX1pbnRlcnZhbENoYW5nZWRfKHQsZSxuKXtjb25zdCBvPXRoaXMucGFyYW1ldGVyUG9zaXRpb25zO2xldCBpPXQtMixhPXQrMSxyPW9baV0scz1vW2FdO2lmKHZvaWQgMD09PXIpc3dpdGNoKHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nU3RhcnQpe2Nhc2UgVGl0Omk9dCxyPTIqZS1uO2JyZWFrO2Nhc2UgTml0Omk9by5sZW5ndGgtMixyPWUrb1tpXS1vW2krMV07YnJlYWs7ZGVmYXVsdDppPXQscj1ufWlmKHZvaWQgMD09PXMpc3dpdGNoKHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nRW5kKXtjYXNlIFRpdDphPXQscz0yKm4tZTticmVhaztjYXNlIE5pdDphPTEscz1uK29bMV0tb1swXTticmVhaztkZWZhdWx0OmE9dC0xLHM9ZX1jb25zdCBsPS41KihuLWUpLGM9dGhpcy52YWx1ZVNpemU7dGhpcy5fd2VpZ2h0UHJldj1sLyhlLXIpLHRoaXMuX3dlaWdodE5leHQ9bC8ocy1uKSx0aGlzLl9vZmZzZXRQcmV2PWkqYyx0aGlzLl9vZmZzZXROZXh0PWEqY31pbnRlcnBvbGF0ZV8odCxlLG4sbyl7Y29uc3QgaT10aGlzLnJlc3VsdEJ1ZmZlcixhPXRoaXMuc2FtcGxlVmFsdWVzLHI9dGhpcy52YWx1ZVNpemUscz10KnIsbD1zLXIsYz10aGlzLl9vZmZzZXRQcmV2LGQ9dGhpcy5fb2Zmc2V0TmV4dCxwPXRoaXMuX3dlaWdodFByZXYsbT10aGlzLl93ZWlnaHROZXh0LHU9KG4tZSkvKG8tZSksZj11KnUsZz1mKnUsaD0tcCpnKzIqcCpmLXAqdSxiPSgxK3ApKmcrKC0xLjUtMipwKSpmKygtLjUrcCkqdSsxLHk9KC0xLW0pKmcrKDEuNSttKSpmKy41KnUsXz1tKmctbSpmO2ZvcihsZXQgdD0wO3QhPT1yOysrdClpW3RdPWgqYVtjK3RdK2IqYVtsK3RdK3kqYVtzK3RdK18qYVtkK3RdO3JldHVybiBpfX1jbGFzcyBjbXQgZXh0ZW5kcyBzbXR7Y29uc3RydWN0b3IodCxlLG4sbyl7c3VwZXIodCxlLG4sbyl9aW50ZXJwb2xhdGVfKHQsZSxuLG8pe2NvbnN0IGk9dGhpcy5yZXN1bHRCdWZmZXIsYT10aGlzLnNhbXBsZVZhbHVlcyxyPXRoaXMudmFsdWVTaXplLHM9dCpyLGw9cy1yLGM9KG4tZSkvKG8tZSksZD0xLWM7Zm9yKGxldCB0PTA7dCE9PXI7Kyt0KWlbdF09YVtsK3RdKmQrYVtzK3RdKmM7cmV0dXJuIGl9fWNsYXNzIGRtdCBleHRlbmRzIHNtdHtjb25zdHJ1Y3Rvcih0LGUsbixvKXtzdXBlcih0LGUsbixvKX1pbnRlcnBvbGF0ZV8odCl7cmV0dXJuIHRoaXMuY29weVNhbXBsZVZhbHVlXyh0LTEpfX1jbGFzcyBwbXR7Y29uc3RydWN0b3IodCxlLG4sbyl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIG5hbWUgaXMgdW5kZWZpbmVkIik7aWYodm9pZCAwPT09ZXx8MD09PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogbm8ga2V5ZnJhbWVzIGluIHRyYWNrIG5hbWVkICIrdCk7dGhpcy5uYW1lPXQsdGhpcy50aW1lcz1ybXQuY29udmVydEFycmF5KGUsdGhpcy5UaW1lQnVmZmVyVHlwZSksdGhpcy52YWx1ZXM9cm10LmNvbnZlcnRBcnJheShuLHRoaXMuVmFsdWVCdWZmZXJUeXBlKSx0aGlzLnNldEludGVycG9sYXRpb24ob3x8dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil9c3RhdGljIHRvSlNPTih0KXtjb25zdCBlPXQuY29uc3RydWN0b3I7bGV0IG47aWYoZS50b0pTT04hPT10aGlzLnRvSlNPTiluPWUudG9KU09OKHQpO2Vsc2V7bj17bmFtZTp0Lm5hbWUsdGltZXM6cm10LmNvbnZlcnRBcnJheSh0LnRpbWVzLEFycmF5KSx2YWx1ZXM6cm10LmNvbnZlcnRBcnJheSh0LnZhbHVlcyxBcnJheSl9O2NvbnN0IGU9dC5nZXRJbnRlcnBvbGF0aW9uKCk7ZSE9PXQuRGVmYXVsdEludGVycG9sYXRpb24mJihuLmludGVycG9sYXRpb249ZSl9cmV0dXJuIG4udHlwZT10LlZhbHVlVHlwZU5hbWUsbn1JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZSh0KXtyZXR1cm4gbmV3IGRtdCh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksdCl9SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyKHQpe3JldHVybiBuZXcgY210KHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSx0KX1JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGgodCl7cmV0dXJuIG5ldyBsbXQodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLHQpfXNldEludGVycG9sYXRpb24odCl7bGV0IGU7c3dpdGNoKHQpe2Nhc2UgRGl0OmU9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTticmVhaztjYXNlIEVpdDplPXRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyO2JyZWFrO2Nhc2UgUml0OmU9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGh9aWYodm9pZCAwPT09ZSl7Y29uc3QgZT0idW5zdXBwb3J0ZWQgaW50ZXJwb2xhdGlvbiBmb3IgIit0aGlzLlZhbHVlVHlwZU5hbWUrIiBrZXlmcmFtZSB0cmFjayBuYW1lZCAiK3RoaXMubmFtZTtpZih2b2lkIDA9PT10aGlzLmNyZWF0ZUludGVycG9sYW50KXtpZih0PT09dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil0aHJvdyBuZXcgRXJyb3IoZSk7dGhpcy5zZXRJbnRlcnBvbGF0aW9uKHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pfXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLktleWZyYW1lVHJhY2s6IixlKSx0aGlzfXJldHVybiB0aGlzLmNyZWF0ZUludGVycG9sYW50PWUsdGhpc31nZXRJbnRlcnBvbGF0aW9uKCl7c3dpdGNoKHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQpe2Nhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTpyZXR1cm4gRGl0O2Nhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6cmV0dXJuIEVpdDtjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOnJldHVybiBSaXR9fWdldFZhbHVlU2l6ZSgpe3JldHVybiB0aGlzLnZhbHVlcy5sZW5ndGgvdGhpcy50aW1lcy5sZW5ndGh9c2hpZnQodCl7aWYoMCE9PXQpe2NvbnN0IGU9dGhpcy50aW1lcztmb3IobGV0IG49MCxvPWUubGVuZ3RoO24hPT1vOysrbillW25dKz10fXJldHVybiB0aGlzfXNjYWxlKHQpe2lmKDEhPT10KXtjb25zdCBlPXRoaXMudGltZXM7Zm9yKGxldCBuPTAsbz1lLmxlbmd0aDtuIT09bzsrK24pZVtuXSo9dH1yZXR1cm4gdGhpc310cmltKHQsZSl7Y29uc3Qgbj10aGlzLnRpbWVzLG89bi5sZW5ndGg7bGV0IGk9MCxhPW8tMTtmb3IoO2khPT1vJiZuW2ldPHQ7KSsraTtmb3IoOy0xIT09YSYmblthXT5lOyktLWE7aWYoKythLDAhPT1pfHxhIT09byl7aT49YSYmKGE9TWF0aC5tYXgoYSwxKSxpPWEtMSk7Y29uc3QgdD10aGlzLmdldFZhbHVlU2l6ZSgpO3RoaXMudGltZXM9cm10LmFycmF5U2xpY2UobixpLGEpLHRoaXMudmFsdWVzPXJtdC5hcnJheVNsaWNlKHRoaXMudmFsdWVzLGkqdCxhKnQpfXJldHVybiB0aGlzfXZhbGlkYXRlKCl7bGV0IHQ9ITA7Y29uc3QgZT10aGlzLmdldFZhbHVlU2l6ZSgpO2UtTWF0aC5mbG9vcihlKSE9MCYmKGNvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IEludmFsaWQgdmFsdWUgc2l6ZSBpbiB0cmFjay4iLHRoaXMpLHQ9ITEpO2NvbnN0IG49dGhpcy50aW1lcyxvPXRoaXMudmFsdWVzLGk9bi5sZW5ndGg7MD09PWkmJihjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBUcmFjayBpcyBlbXB0eS4iLHRoaXMpLHQ9ITEpO2xldCBhPW51bGw7Zm9yKGxldCBlPTA7ZSE9PWk7ZSsrKXtjb25zdCBvPW5bZV07aWYoIm51bWJlciI9PXR5cGVvZiBvJiZpc05hTihvKSl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVGltZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuIix0aGlzLGUsbyksdD0hMTticmVha31pZihudWxsIT09YSYmYT5vKXtjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBPdXQgb2Ygb3JkZXIga2V5cy4iLHRoaXMsZSxvLGEpLHQ9ITE7YnJlYWt9YT1vfWlmKHZvaWQgMCE9PW8mJnJtdC5pc1R5cGVkQXJyYXkobykpZm9yKGxldCBlPTAsbj1vLmxlbmd0aDtlIT09bjsrK2Upe2NvbnN0IG49b1tlXTtpZihpc05hTihuKSl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVmFsdWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLiIsdGhpcyxlLG4pLHQ9ITE7YnJlYWt9fXJldHVybiB0fW9wdGltaXplKCl7Y29uc3QgdD1ybXQuYXJyYXlTbGljZSh0aGlzLnRpbWVzKSxlPXJtdC5hcnJheVNsaWNlKHRoaXMudmFsdWVzKSxuPXRoaXMuZ2V0VmFsdWVTaXplKCksbz10aGlzLmdldEludGVycG9sYXRpb24oKT09PVJpdCxpPXQubGVuZ3RoLTE7bGV0IGE9MTtmb3IobGV0IHI9MTtyPGk7KytyKXtsZXQgaT0hMTtjb25zdCBzPXRbcl07aWYocyE9PXRbcisxXSYmKDEhPT1yfHxzIT09dFswXSkpaWYobylpPSEwO2Vsc2V7Y29uc3QgdD1yKm4sbz10LW4sYT10K247Zm9yKGxldCByPTA7ciE9PW47KytyKXtjb25zdCBuPWVbdCtyXTtpZihuIT09ZVtvK3JdfHxuIT09ZVthK3JdKXtpPSEwO2JyZWFrfX19aWYoaSl7aWYociE9PWEpe3RbYV09dFtyXTtjb25zdCBvPXIqbixpPWEqbjtmb3IobGV0IHQ9MDt0IT09bjsrK3QpZVtpK3RdPWVbbyt0XX0rK2F9fWlmKGk+MCl7dFthXT10W2ldO2ZvcihsZXQgdD1pKm4sbz1hKm4scj0wO3IhPT1uOysrcillW28rcl09ZVt0K3JdOysrYX1yZXR1cm4gYSE9PXQubGVuZ3RoPyh0aGlzLnRpbWVzPXJtdC5hcnJheVNsaWNlKHQsMCxhKSx0aGlzLnZhbHVlcz1ybXQuYXJyYXlTbGljZShlLDAsYSpuKSk6KHRoaXMudGltZXM9dCx0aGlzLnZhbHVlcz1lKSx0aGlzfWNsb25lKCl7Y29uc3QgdD1ybXQuYXJyYXlTbGljZSh0aGlzLnRpbWVzLDApLGU9cm10LmFycmF5U2xpY2UodGhpcy52YWx1ZXMsMCksbj1uZXcoMCx0aGlzLmNvbnN0cnVjdG9yKSh0aGlzLm5hbWUsdCxlKTtyZXR1cm4gbi5jcmVhdGVJbnRlcnBvbGFudD10aGlzLmNyZWF0ZUludGVycG9sYW50LG59fXBtdC5wcm90b3R5cGUuVGltZUJ1ZmZlclR5cGU9RmxvYXQzMkFycmF5LHBtdC5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlPUZsb2F0MzJBcnJheSxwbXQucHJvdG90eXBlLkRlZmF1bHRJbnRlcnBvbGF0aW9uPUVpdDtjbGFzcyBtbXQgZXh0ZW5kcyBwbXR7fW1tdC5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0iYm9vbCIsbW10LnByb3RvdHlwZS5WYWx1ZUJ1ZmZlclR5cGU9QXJyYXksbW10LnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbj1EaXQsbW10LnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI9dm9pZCAwLG1tdC5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoPXZvaWQgMDtjbGFzcyB1bXQgZXh0ZW5kcyBwbXR7fXVtdC5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0iY29sb3IiO2NsYXNzIGZtdCBleHRlbmRzIHBtdHt9Zm10LnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lPSJudW1iZXIiO2NsYXNzIGdtdCBleHRlbmRzIHNtdHtjb25zdHJ1Y3Rvcih0LGUsbixvKXtzdXBlcih0LGUsbixvKX1pbnRlcnBvbGF0ZV8odCxlLG4sbyl7Y29uc3QgaT10aGlzLnJlc3VsdEJ1ZmZlcixhPXRoaXMuc2FtcGxlVmFsdWVzLHI9dGhpcy52YWx1ZVNpemUscz0obi1lKS8oby1lKTtsZXQgbD10KnI7Zm9yKGxldCB0PWwrcjtsIT09dDtsKz00KWxhdC5zbGVycEZsYXQoaSwwLGEsbC1yLGEsbCxzKTtyZXR1cm4gaX19Y2xhc3MgaG10IGV4dGVuZHMgcG10e0ludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcih0KXtyZXR1cm4gbmV3IGdtdCh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksdCl9fWhtdC5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0icXVhdGVybmlvbiIsaG10LnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbj1FaXQsaG10LnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg9dm9pZCAwO2NsYXNzIGJtdCBleHRlbmRzIHBtdHt9Ym10LnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lPSJzdHJpbmciLGJtdC5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlPUFycmF5LGJtdC5wcm90b3R5cGUuRGVmYXVsdEludGVycG9sYXRpb249RGl0LGJtdC5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyPXZvaWQgMCxibXQucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aD12b2lkIDA7Y2xhc3MgeW10IGV4dGVuZHMgcG10e315bXQucHJvdG90eXBlLlZhbHVlVHlwZU5hbWU9InZlY3RvciI7Y2xhc3MgX210e2NvbnN0cnVjdG9yKHQsZT0tMSxuLG89MjUwMCl7dGhpcy5uYW1lPXQsdGhpcy50cmFja3M9bix0aGlzLmR1cmF0aW9uPWUsdGhpcy5ibGVuZE1vZGU9byx0aGlzLnV1aWQ9cWl0KCksdGhpcy5kdXJhdGlvbjwwJiZ0aGlzLnJlc2V0RHVyYXRpb24oKX1zdGF0aWMgcGFyc2UodCl7Y29uc3QgZT1bXSxuPXQudHJhY2tzLG89MS8odC5mcHN8fDEpO2ZvcihsZXQgdD0wLGk9bi5sZW5ndGg7dCE9PWk7Kyt0KWUucHVzaChDbXQoblt0XSkuc2NhbGUobykpO2NvbnN0IGk9bmV3IHRoaXModC5uYW1lLHQuZHVyYXRpb24sZSx0LmJsZW5kTW9kZSk7cmV0dXJuIGkudXVpZD10LnV1aWQsaX1zdGF0aWMgdG9KU09OKHQpe2NvbnN0IGU9W10sbj10LnRyYWNrcyxvPXtuYW1lOnQubmFtZSxkdXJhdGlvbjp0LmR1cmF0aW9uLHRyYWNrczplLHV1aWQ6dC51dWlkLGJsZW5kTW9kZTp0LmJsZW5kTW9kZX07Zm9yKGxldCB0PTAsbz1uLmxlbmd0aDt0IT09bzsrK3QpZS5wdXNoKHBtdC50b0pTT04oblt0XSkpO3JldHVybiBvfXN0YXRpYyBDcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZSh0LGUsbixvKXtjb25zdCBpPWUubGVuZ3RoLGE9W107Zm9yKGxldCB0PTA7dDxpO3QrKyl7bGV0IHI9W10scz1bXTtyLnB1c2goKHQraS0xKSVpLHQsKHQrMSklaSkscy5wdXNoKDAsMSwwKTtjb25zdCBsPXJtdC5nZXRLZXlmcmFtZU9yZGVyKHIpO3I9cm10LnNvcnRlZEFycmF5KHIsMSxsKSxzPXJtdC5zb3J0ZWRBcnJheShzLDEsbCksb3x8MCE9PXJbMF18fChyLnB1c2goaSkscy5wdXNoKHNbMF0pKSxhLnB1c2gobmV3IGZtdCgiLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1siK2VbdF0ubmFtZSsiXSIscixzKS5zY2FsZSgxL24pKX1yZXR1cm4gbmV3IHRoaXModCwtMSxhKX1zdGF0aWMgZmluZEJ5TmFtZSh0LGUpe2xldCBuPXQ7aWYoIUFycmF5LmlzQXJyYXkodCkpe2NvbnN0IGU9dDtuPWUuZ2VvbWV0cnkmJmUuZ2VvbWV0cnkuYW5pbWF0aW9uc3x8ZS5hbmltYXRpb25zfWZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKWlmKG5bdF0ubmFtZT09PWUpcmV0dXJuIG5bdF07cmV0dXJuIG51bGx9c3RhdGljIENyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2VzKHQsZSxuKXtjb25zdCBvPXt9LGk9L14oW1x3LV0qPykoW1xkXSspJC87Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXtjb25zdCBuPXRbZV0sYT1uLm5hbWUubWF0Y2goaSk7aWYoYSYmYS5sZW5ndGg+MSl7Y29uc3QgdD1hWzFdO2xldCBlPW9bdF07ZXx8KG9bdF09ZT1bXSksZS5wdXNoKG4pfX1jb25zdCBhPVtdO2Zvcihjb25zdCB0IGluIG8pYS5wdXNoKHRoaXMuQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UodCxvW3RdLGUsbikpO3JldHVybiBhfXN0YXRpYyBwYXJzZUFuaW1hdGlvbih0LGUpe2lmKCF0KXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5BbmltYXRpb25DbGlwOiBObyBhbmltYXRpb24gaW4gSlNPTkxvYWRlciBkYXRhLiIpLG51bGw7Y29uc3Qgbj1mdW5jdGlvbih0LGUsbixvLGkpe2lmKDAhPT1uLmxlbmd0aCl7Y29uc3QgYT1bXSxyPVtdO3JtdC5mbGF0dGVuSlNPTihuLGEscixvKSwwIT09YS5sZW5ndGgmJmkucHVzaChuZXcgdChlLGEscikpfX0sbz1bXSxpPXQubmFtZXx8ImRlZmF1bHQiLGE9dC5mcHN8fDMwLHI9dC5ibGVuZE1vZGU7bGV0IHM9dC5sZW5ndGh8fC0xO2NvbnN0IGw9dC5oaWVyYXJjaHl8fFtdO2ZvcihsZXQgdD0wO3Q8bC5sZW5ndGg7dCsrKXtjb25zdCBpPWxbdF0ua2V5cztpZihpJiYwIT09aS5sZW5ndGgpaWYoaVswXS5tb3JwaFRhcmdldHMpe2NvbnN0IHQ9e307bGV0IGU7Zm9yKGU9MDtlPGkubGVuZ3RoO2UrKylpZihpW2VdLm1vcnBoVGFyZ2V0cylmb3IobGV0IG49MDtuPGlbZV0ubW9ycGhUYXJnZXRzLmxlbmd0aDtuKyspdFtpW2VdLm1vcnBoVGFyZ2V0c1tuXV09LTE7Zm9yKGNvbnN0IG4gaW4gdCl7Y29uc3QgdD1bXSxhPVtdO2ZvcihsZXQgbz0wO28hPT1pW2VdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7KytvKXtjb25zdCBvPWlbZV07dC5wdXNoKG8udGltZSksYS5wdXNoKG8ubW9ycGhUYXJnZXQ9PT1uPzE6MCl9by5wdXNoKG5ldyBmbXQoIi5tb3JwaFRhcmdldEluZmx1ZW5jZVsiK24rIl0iLHQsYSkpfXM9dC5sZW5ndGgqKGF8fDEpfWVsc2V7Y29uc3QgYT0iLmJvbmVzWyIrZVt0XS5uYW1lKyJdIjtuKHltdCxhKyIucG9zaXRpb24iLGksInBvcyIsbyksbihobXQsYSsiLnF1YXRlcm5pb24iLGksInJvdCIsbyksbih5bXQsYSsiLnNjYWxlIixpLCJzY2wiLG8pfX1yZXR1cm4gMD09PW8ubGVuZ3RoP251bGw6bmV3IHRoaXMoaSxzLG8scil9cmVzZXREdXJhdGlvbigpe2xldCB0PTA7Zm9yKGxldCBlPTAsbj10aGlzLnRyYWNrcy5sZW5ndGg7ZSE9PW47KytlKXtjb25zdCBuPXRoaXMudHJhY2tzW2VdO3Q9TWF0aC5tYXgodCxuLnRpbWVzW24udGltZXMubGVuZ3RoLTFdKX1yZXR1cm4gdGhpcy5kdXJhdGlvbj10LHRoaXN9dHJpbSgpe2ZvcihsZXQgdD0wO3Q8dGhpcy50cmFja3MubGVuZ3RoO3QrKyl0aGlzLnRyYWNrc1t0XS50cmltKDAsdGhpcy5kdXJhdGlvbik7cmV0dXJuIHRoaXN9dmFsaWRhdGUoKXtsZXQgdD0hMDtmb3IobGV0IGU9MDtlPHRoaXMudHJhY2tzLmxlbmd0aDtlKyspdD10JiZ0aGlzLnRyYWNrc1tlXS52YWxpZGF0ZSgpO3JldHVybiB0fW9wdGltaXplKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnRyYWNrcy5sZW5ndGg7dCsrKXRoaXMudHJhY2tzW3RdLm9wdGltaXplKCk7cmV0dXJuIHRoaXN9Y2xvbmUoKXtjb25zdCB0PVtdO2ZvcihsZXQgZT0wO2U8dGhpcy50cmFja3MubGVuZ3RoO2UrKyl0LnB1c2godGhpcy50cmFja3NbZV0uY2xvbmUoKSk7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMubmFtZSx0aGlzLmR1cmF0aW9uLHQsdGhpcy5ibGVuZE1vZGUpfXRvSlNPTigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvSlNPTih0aGlzKX19ZnVuY3Rpb24gQ210KHQpe2lmKHZvaWQgMD09PXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIHR5cGUgdW5kZWZpbmVkLCBjYW4gbm90IHBhcnNlIik7Y29uc3QgZT0oZnVuY3Rpb24gbih0KXtzd2l0Y2godC50b0xvd2VyQ2FzZSgpKXtjYXNlInNjYWxhciI6Y2FzZSJkb3VibGUiOmNhc2UiZmxvYXQiOmNhc2UibnVtYmVyIjpjYXNlImludGVnZXIiOnJldHVybiBmbXQ7Y2FzZSJ2ZWN0b3IiOmNhc2UidmVjdG9yMiI6Y2FzZSJ2ZWN0b3IzIjpjYXNlInZlY3RvcjQiOnJldHVybiB5bXQ7Y2FzZSJjb2xvciI6cmV0dXJuIHVtdDtjYXNlInF1YXRlcm5pb24iOnJldHVybiBobXQ7Y2FzZSJib29sIjpjYXNlImJvb2xlYW4iOnJldHVybiBtbXQ7Y2FzZSJzdHJpbmciOnJldHVybiBibXR9dGhyb3cgbmV3IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBVbnN1cHBvcnRlZCB0eXBlTmFtZTogIit0KX0pKHQudHlwZSk7aWYodm9pZCAwPT09dC50aW1lcyl7Y29uc3QgZT1bXSxuPVtdO3JtdC5mbGF0dGVuSlNPTih0LmtleXMsZSxuLCJ2YWx1ZSIpLHQudGltZXM9ZSx0LnZhbHVlcz1ufXJldHVybiB2b2lkIDAhPT1lLnBhcnNlP2UucGFyc2UodCk6bmV3IGUodC5uYW1lLHQudGltZXMsdC52YWx1ZXMsdC5pbnRlcnBvbGF0aW9uKX1jb25zdCBNbXQ9e2VuYWJsZWQ6ITEsZmlsZXM6e30sYWRkOmZ1bmN0aW9uKHQsZSl7ITEhPT10aGlzLmVuYWJsZWQmJih0aGlzLmZpbGVzW3RdPWUpfSxnZXQ6ZnVuY3Rpb24odCl7aWYoITEhPT10aGlzLmVuYWJsZWQpcmV0dXJuIHRoaXMuZmlsZXNbdF19LHJlbW92ZTpmdW5jdGlvbih0KXtkZWxldGUgdGhpcy5maWxlc1t0XX0sY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLmZpbGVzPXt9fX0sdm10PW5ldyBjbGFzc3tjb25zdHJ1Y3Rvcih0LGUsbil7Y29uc3Qgbz10aGlzO2xldCBpLGE9ITEscj0wLHM9MDtjb25zdCBsPVtdO3RoaXMub25TdGFydD12b2lkIDAsdGhpcy5vbkxvYWQ9dCx0aGlzLm9uUHJvZ3Jlc3M9ZSx0aGlzLm9uRXJyb3I9bix0aGlzLml0ZW1TdGFydD1mdW5jdGlvbih0KXtzKyssITE9PT1hJiZ2b2lkIDAhPT1vLm9uU3RhcnQmJm8ub25TdGFydCh0LHIscyksYT0hMH0sdGhpcy5pdGVtRW5kPWZ1bmN0aW9uKHQpe3IrKyx2b2lkIDAhPT1vLm9uUHJvZ3Jlc3MmJm8ub25Qcm9ncmVzcyh0LHIscykscj09PXMmJihhPSExLHZvaWQgMCE9PW8ub25Mb2FkJiZvLm9uTG9hZCgpKX0sdGhpcy5pdGVtRXJyb3I9ZnVuY3Rpb24odCl7dm9pZCAwIT09by5vbkVycm9yJiZvLm9uRXJyb3IodCl9LHRoaXMucmVzb2x2ZVVSTD1mdW5jdGlvbih0KXtyZXR1cm4gaT9pKHQpOnR9LHRoaXMuc2V0VVJMTW9kaWZpZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGk9dCx0aGlzfSx0aGlzLmFkZEhhbmRsZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbC5wdXNoKHQsZSksdGhpc30sdGhpcy5yZW1vdmVIYW5kbGVyPWZ1bmN0aW9uKHQpe2NvbnN0IGU9bC5pbmRleE9mKHQpO3JldHVybi0xIT09ZSYmbC5zcGxpY2UoZSwyKSx0aGlzfSx0aGlzLmdldEhhbmRsZXI9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTAsbj1sLmxlbmd0aDtlPG47ZSs9Mil7Y29uc3Qgbj1sW2VdLG89bFtlKzFdO2lmKG4uZ2xvYmFsJiYobi5sYXN0SW5kZXg9MCksbi50ZXN0KHQpKXJldHVybiBvfXJldHVybiBudWxsfX19O2NsYXNzIHhtdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLm1hbmFnZXI9dm9pZCAwIT09dD90OnZtdCx0aGlzLmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiLHRoaXMud2l0aENyZWRlbnRpYWxzPSExLHRoaXMucGF0aD0iIix0aGlzLnJlc291cmNlUGF0aD0iIix0aGlzLnJlcXVlc3RIZWFkZXI9e319bG9hZCgpe31sb2FkQXN5bmModCxlKXtjb25zdCBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGkpe24ubG9hZCh0LG8sZSxpKX0pKX1wYXJzZSgpe31zZXRDcm9zc09yaWdpbih0KXtyZXR1cm4gdGhpcy5jcm9zc09yaWdpbj10LHRoaXN9c2V0V2l0aENyZWRlbnRpYWxzKHQpe3JldHVybiB0aGlzLndpdGhDcmVkZW50aWFscz10LHRoaXN9c2V0UGF0aCh0KXtyZXR1cm4gdGhpcy5wYXRoPXQsdGhpc31zZXRSZXNvdXJjZVBhdGgodCl7cmV0dXJuIHRoaXMucmVzb3VyY2VQYXRoPXQsdGhpc31zZXRSZXF1ZXN0SGVhZGVyKHQpe3JldHVybiB0aGlzLnJlcXVlc3RIZWFkZXI9dCx0aGlzfX1jb25zdCBPbXQ9e307Y2xhc3MgUG10IGV4dGVuZHMgeG10e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4sbyl7dm9pZCAwPT09dCYmKHQ9IiIpLHZvaWQgMCE9PXRoaXMucGF0aCYmKHQ9dGhpcy5wYXRoK3QpLHQ9dGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwodCk7Y29uc3QgaT10aGlzLGE9TW10LmdldCh0KTtpZih2b2lkIDAhPT1hKXJldHVybiBpLm1hbmFnZXIuaXRlbVN0YXJ0KHQpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZSYmZShhKSxpLm1hbmFnZXIuaXRlbUVuZCh0KX0pLDApLGE7aWYodm9pZCAwIT09T210W3RdKXJldHVybiB2b2lkIE9tdFt0XS5wdXNoKHtvbkxvYWQ6ZSxvblByb2dyZXNzOm4sb25FcnJvcjpvfSk7Y29uc3Qgcj10Lm1hdGNoKC9eZGF0YTooLio/KSg7YmFzZTY0KT8sKC4qKSQvKTtsZXQgcztpZihyKXtjb25zdCBuPXJbMV0sYT0hIXJbMl07bGV0IHM9clszXTtzPWRlY29kZVVSSUNvbXBvbmVudChzKSxhJiYocz1hdG9iKHMpKTt0cnl7bGV0IG87Y29uc3QgYT0odGhpcy5yZXNwb25zZVR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpO3N3aXRjaChhKXtjYXNlImFycmF5YnVmZmVyIjpjYXNlImJsb2IiOmNvbnN0IHQ9bmV3IFVpbnQ4QXJyYXkocy5sZW5ndGgpO2ZvcihsZXQgZT0wO2U8cy5sZW5ndGg7ZSsrKXRbZV09cy5jaGFyQ29kZUF0KGUpO289ImJsb2IiPT09YT9uZXcgQmxvYihbdC5idWZmZXJdLHt0eXBlOm59KTp0LmJ1ZmZlcjticmVhaztjYXNlImRvY3VtZW50Ijpjb25zdCBlPW5ldyBET01QYXJzZXI7bz1lLnBhcnNlRnJvbVN0cmluZyhzLG4pO2JyZWFrO2Nhc2UianNvbiI6bz1KU09OLnBhcnNlKHMpO2JyZWFrO2RlZmF1bHQ6bz1zfXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZSYmZShvKSxpLm1hbmFnZXIuaXRlbUVuZCh0KX0pLDApfWNhdGNoKGUpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7byYmbyhlKSxpLm1hbmFnZXIuaXRlbUVycm9yKHQpLGkubWFuYWdlci5pdGVtRW5kKHQpfSksMCl9fWVsc2V7T210W3RdPVtdLE9tdFt0XS5wdXNoKHtvbkxvYWQ6ZSxvblByb2dyZXNzOm4sb25FcnJvcjpvfSkscz1uZXcgWE1MSHR0cFJlcXVlc3Qscy5vcGVuKCJHRVQiLHQsITApLHMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKGUpe2NvbnN0IG49dGhpcy5yZXNwb25zZSxvPU9tdFt0XTtpZihkZWxldGUgT210W3RdLDIwMD09PXRoaXMuc3RhdHVzfHwwPT09dGhpcy5zdGF0dXMpezA9PT10aGlzLnN0YXR1cyYmY29uc29sZS53YXJuKCJUSFJFRS5GaWxlTG9hZGVyOiBIVFRQIFN0YXR1cyAwIHJlY2VpdmVkLiIpLE1tdC5hZGQodCxuKTtmb3IobGV0IHQ9MCxlPW8ubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9b1t0XTtlLm9uTG9hZCYmZS5vbkxvYWQobil9aS5tYW5hZ2VyLml0ZW1FbmQodCl9ZWxzZXtmb3IobGV0IHQ9MCxuPW8ubGVuZ3RoO3Q8bjt0Kyspe2NvbnN0IG49b1t0XTtuLm9uRXJyb3ImJm4ub25FcnJvcihlKX1pLm1hbmFnZXIuaXRlbUVycm9yKHQpLGkubWFuYWdlci5pdGVtRW5kKHQpfX0pLCExKSxzLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIiwoZnVuY3Rpb24oZSl7Y29uc3Qgbj1PbXRbdF07Zm9yKGxldCB0PTAsbz1uLmxlbmd0aDt0PG87dCsrKXtjb25zdCBvPW5bdF07by5vblByb2dyZXNzJiZvLm9uUHJvZ3Jlc3MoZSl9fSksITEpLHMuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLChmdW5jdGlvbihlKXtjb25zdCBuPU9tdFt0XTtkZWxldGUgT210W3RdO2ZvcihsZXQgdD0wLG89bi5sZW5ndGg7dDxvO3QrKyl7Y29uc3Qgbz1uW3RdO28ub25FcnJvciYmby5vbkVycm9yKGUpfWkubWFuYWdlci5pdGVtRXJyb3IodCksaS5tYW5hZ2VyLml0ZW1FbmQodCl9KSwhMSkscy5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsKGZ1bmN0aW9uKGUpe2NvbnN0IG49T210W3RdO2RlbGV0ZSBPbXRbdF07Zm9yKGxldCB0PTAsbz1uLmxlbmd0aDt0PG87dCsrKXtjb25zdCBvPW5bdF07by5vbkVycm9yJiZvLm9uRXJyb3IoZSl9aS5tYW5hZ2VyLml0ZW1FcnJvcih0KSxpLm1hbmFnZXIuaXRlbUVuZCh0KX0pLCExKSx2b2lkIDAhPT10aGlzLnJlc3BvbnNlVHlwZSYmKHMucmVzcG9uc2VUeXBlPXRoaXMucmVzcG9uc2VUeXBlKSx2b2lkIDAhPT10aGlzLndpdGhDcmVkZW50aWFscyYmKHMud2l0aENyZWRlbnRpYWxzPXRoaXMud2l0aENyZWRlbnRpYWxzKSxzLm92ZXJyaWRlTWltZVR5cGUmJnMub3ZlcnJpZGVNaW1lVHlwZSh2b2lkIDAhPT10aGlzLm1pbWVUeXBlP3RoaXMubWltZVR5cGU6InRleHQvcGxhaW4iKTtmb3IoY29uc3QgdCBpbiB0aGlzLnJlcXVlc3RIZWFkZXIpcy5zZXRSZXF1ZXN0SGVhZGVyKHQsdGhpcy5yZXF1ZXN0SGVhZGVyW3RdKTtzLnNlbmQobnVsbCl9cmV0dXJuIGkubWFuYWdlci5pdGVtU3RhcnQodCksc31zZXRSZXNwb25zZVR5cGUodCl7cmV0dXJuIHRoaXMucmVzcG9uc2VUeXBlPXQsdGhpc31zZXRNaW1lVHlwZSh0KXtyZXR1cm4gdGhpcy5taW1lVHlwZT10LHRoaXN9fWNsYXNzIHdtdCBleHRlbmRzIHhtdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxuLG8pe3ZvaWQgMCE9PXRoaXMucGF0aCYmKHQ9dGhpcy5wYXRoK3QpLHQ9dGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwodCk7Y29uc3QgaT10aGlzLGE9TW10LmdldCh0KTtpZih2b2lkIDAhPT1hKXJldHVybiBpLm1hbmFnZXIuaXRlbVN0YXJ0KHQpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZSYmZShhKSxpLm1hbmFnZXIuaXRlbUVuZCh0KX0pLDApLGE7Y29uc3Qgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJpbWciKTtmdW5jdGlvbiBzKCl7ci5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixzLCExKSxyLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIixsLCExKSxNbXQuYWRkKHQsdGhpcyksZSYmZSh0aGlzKSxpLm1hbmFnZXIuaXRlbUVuZCh0KX1mdW5jdGlvbiBsKGUpe3IucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIscywhMSksci5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsbCwhMSksbyYmbyhlKSxpLm1hbmFnZXIuaXRlbUVycm9yKHQpLGkubWFuYWdlci5pdGVtRW5kKHQpfXJldHVybiByLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLHMsITEpLHIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGwsITEpLCJkYXRhOiIhPT10LnN1YnN0cigwLDUpJiZ2b2lkIDAhPT10aGlzLmNyb3NzT3JpZ2luJiYoci5jcm9zc09yaWdpbj10aGlzLmNyb3NzT3JpZ2luKSxpLm1hbmFnZXIuaXRlbVN0YXJ0KHQpLHIuc3JjPXQscn19Y2xhc3Mga210IGV4dGVuZHMgeG10e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4sbyl7Y29uc3QgaT1uZXcgdnN0LGE9bmV3IHdtdCh0aGlzLm1hbmFnZXIpO2Euc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbiksYS5zZXRQYXRoKHRoaXMucGF0aCk7bGV0IHI9MDtmdW5jdGlvbiBzKG4pe2EubG9hZCh0W25dLChmdW5jdGlvbih0KXtpLmltYWdlc1tuXT10LHIrKyw2PT09ciYmKGkubmVlZHNVcGRhdGU9ITAsZSYmZShpKSl9KSx2b2lkIDAsbyl9Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDsrK2UpcyhlKTtyZXR1cm4gaX19Y2xhc3MgU210IGV4dGVuZHMgeG10e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4sbyl7Y29uc3QgaT1uZXcgb2F0LGE9bmV3IHdtdCh0aGlzLm1hbmFnZXIpO3JldHVybiBhLnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pLGEuc2V0UGF0aCh0aGlzLnBhdGgpLGEubG9hZCh0LChmdW5jdGlvbihuKXtpLmltYWdlPW47Y29uc3Qgbz10LnNlYXJjaCgvXC5qcGU/ZygkfFw/KS9pKT4wfHwwPT09dC5zZWFyY2goL15kYXRhXDppbWFnZVwvanBlZy8pO2kuZm9ybWF0PW8/UGl0OndpdCxpLm5lZWRzVXBkYXRlPSEwLHZvaWQgMCE9PWUmJmUoaSl9KSxuLG8pLGl9fWNsYXNzIERtdCBleHRlbmRzIGRwdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy50eXBlPSJDdXJ2ZVBhdGgiLHRoaXMuY3VydmVzPVtdLHRoaXMuYXV0b0Nsb3NlPSExfWFkZCh0KXt0aGlzLmN1cnZlcy5wdXNoKHQpfWNsb3NlUGF0aCgpe2NvbnN0IHQ9dGhpcy5jdXJ2ZXNbMF0uZ2V0UG9pbnQoMCksZT10aGlzLmN1cnZlc1t0aGlzLmN1cnZlcy5sZW5ndGgtMV0uZ2V0UG9pbnQoMSk7dC5lcXVhbHMoZSl8fHRoaXMuY3VydmVzLnB1c2gobmV3IE9wdChlLHQpKX1nZXRQb2ludCh0KXtjb25zdCBlPXQqdGhpcy5nZXRMZW5ndGgoKSxuPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7bGV0IG89MDtmb3IoO288bi5sZW5ndGg7KXtpZihuW29dPj1lKXtjb25zdCB0PW5bb10tZSxpPXRoaXMuY3VydmVzW29dLGE9aS5nZXRMZW5ndGgoKTtyZXR1cm4gaS5nZXRQb2ludEF0KDA9PT1hPzA6MS10L2EpfW8rK31yZXR1cm4gbnVsbH1nZXRMZW5ndGgoKXtjb25zdCB0PXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7cmV0dXJuIHRbdC5sZW5ndGgtMV19dXBkYXRlQXJjTGVuZ3Rocygpe3RoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5jYWNoZUxlbmd0aHM9bnVsbCx0aGlzLmdldEN1cnZlTGVuZ3RocygpfWdldEN1cnZlTGVuZ3Rocygpe2lmKHRoaXMuY2FjaGVMZW5ndGhzJiZ0aGlzLmNhY2hlTGVuZ3Rocy5sZW5ndGg9PT10aGlzLmN1cnZlcy5sZW5ndGgpcmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzO2NvbnN0IHQ9W107bGV0IGU9MDtmb3IobGV0IG49MCxvPXRoaXMuY3VydmVzLmxlbmd0aDtuPG87bisrKWUrPXRoaXMuY3VydmVzW25dLmdldExlbmd0aCgpLHQucHVzaChlKTtyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM9dCx0fWdldFNwYWNlZFBvaW50cyh0PTQwKXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248PXQ7bisrKWUucHVzaCh0aGlzLmdldFBvaW50KG4vdCkpO3JldHVybiB0aGlzLmF1dG9DbG9zZSYmZS5wdXNoKGVbMF0pLGV9Z2V0UG9pbnRzKHQ9MTIpe2NvbnN0IGU9W107bGV0IG47Zm9yKGxldCBvPTAsaT10aGlzLmN1cnZlcztvPGkubGVuZ3RoO28rKyl7Y29uc3QgYT1pW29dLHI9YS5nZXRQb2ludHMoYSYmYS5pc0VsbGlwc2VDdXJ2ZT8yKnQ6YSYmKGEuaXNMaW5lQ3VydmV8fGEuaXNMaW5lQ3VydmUzKT8xOmEmJmEuaXNTcGxpbmVDdXJ2ZT90KmEucG9pbnRzLmxlbmd0aDp0KTtmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrKyl7Y29uc3Qgbz1yW3RdO24mJm4uZXF1YWxzKG8pfHwoZS5wdXNoKG8pLG49byl9fXJldHVybiB0aGlzLmF1dG9DbG9zZSYmZS5sZW5ndGg+MSYmIWVbZS5sZW5ndGgtMV0uZXF1YWxzKGVbMF0pJiZlLnB1c2goZVswXSksZX1jb3B5KHQpe3N1cGVyLmNvcHkodCksdGhpcy5jdXJ2ZXM9W107Zm9yKGxldCBlPTAsbj10LmN1cnZlcy5sZW5ndGg7ZTxuO2UrKyl0aGlzLmN1cnZlcy5wdXNoKHQuY3VydmVzW2VdLmNsb25lKCkpO3JldHVybiB0aGlzLmF1dG9DbG9zZT10LmF1dG9DbG9zZSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5hdXRvQ2xvc2U9dGhpcy5hdXRvQ2xvc2UsdC5jdXJ2ZXM9W107Zm9yKGxldCBlPTAsbj10aGlzLmN1cnZlcy5sZW5ndGg7ZTxuO2UrKyl0LmN1cnZlcy5wdXNoKHRoaXMuY3VydmVzW2VdLnRvSlNPTigpKTtyZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLmF1dG9DbG9zZT10LmF1dG9DbG9zZSx0aGlzLmN1cnZlcz1bXTtmb3IobGV0IGU9MCxuPXQuY3VydmVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBuPXQuY3VydmVzW2VdO3RoaXMuY3VydmVzLnB1c2goKG5ldyBTcHRbbi50eXBlXSkuZnJvbUpTT04obikpfXJldHVybiB0aGlzfX1jbGFzcyBFbXQgZXh0ZW5kcyBEbXR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9IlBhdGgiLHRoaXMuY3VycmVudFBvaW50PW5ldyBRaXQsdCYmdGhpcy5zZXRGcm9tUG9pbnRzKHQpfXNldEZyb21Qb2ludHModCl7dGhpcy5tb3ZlVG8odFswXS54LHRbMF0ueSk7Zm9yKGxldCBlPTEsbj10Lmxlbmd0aDtlPG47ZSsrKXRoaXMubGluZVRvKHRbZV0ueCx0W2VdLnkpO3JldHVybiB0aGlzfW1vdmVUbyh0LGUpe3JldHVybiB0aGlzLmN1cnJlbnRQb2ludC5zZXQodCxlKSx0aGlzfWxpbmVUbyh0LGUpe2NvbnN0IG49bmV3IE9wdCh0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBRaXQodCxlKSk7cmV0dXJuIHRoaXMuY3VydmVzLnB1c2gobiksdGhpcy5jdXJyZW50UG9pbnQuc2V0KHQsZSksdGhpc31xdWFkcmF0aWNDdXJ2ZVRvKHQsZSxuLG8pe2NvbnN0IGk9bmV3IFBwdCh0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBRaXQodCxlKSxuZXcgUWl0KG4sbykpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKGkpLHRoaXMuY3VycmVudFBvaW50LnNldChuLG8pLHRoaXN9YmV6aWVyQ3VydmVUbyh0LGUsbixvLGksYSl7Y29uc3Qgcj1uZXcgdnB0KHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksbmV3IFFpdCh0LGUpLG5ldyBRaXQobixvKSxuZXcgUWl0KGksYSkpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKHIpLHRoaXMuY3VycmVudFBvaW50LnNldChpLGEpLHRoaXN9c3BsaW5lVGhydSh0KXtjb25zdCBlPVt0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpXS5jb25jYXQodCksbj1uZXcga3B0KGUpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKG4pLHRoaXMuY3VycmVudFBvaW50LmNvcHkodFt0Lmxlbmd0aC0xXSksdGhpc31hcmModCxlLG4sbyxpLGEpe3JldHVybiB0aGlzLmFic2FyYyh0K3RoaXMuY3VycmVudFBvaW50LngsZSt0aGlzLmN1cnJlbnRQb2ludC55LG4sbyxpLGEpLHRoaXN9YWJzYXJjKHQsZSxuLG8saSxhKXtyZXR1cm4gdGhpcy5hYnNlbGxpcHNlKHQsZSxuLG4sbyxpLGEpLHRoaXN9ZWxsaXBzZSh0LGUsbixvLGksYSxyLHMpe3JldHVybiB0aGlzLmFic2VsbGlwc2UodCt0aGlzLmN1cnJlbnRQb2ludC54LGUrdGhpcy5jdXJyZW50UG9pbnQueSxuLG8saSxhLHIscyksdGhpc31hYnNlbGxpcHNlKHQsZSxuLG8saSxhLHIscyl7Y29uc3QgbD1uZXcgcHB0KHQsZSxuLG8saSxhLHIscyk7aWYodGhpcy5jdXJ2ZXMubGVuZ3RoPjApe2NvbnN0IHQ9bC5nZXRQb2ludCgwKTt0LmVxdWFscyh0aGlzLmN1cnJlbnRQb2ludCl8fHRoaXMubGluZVRvKHQueCx0LnkpfXRoaXMuY3VydmVzLnB1c2gobCk7Y29uc3QgYz1sLmdldFBvaW50KDEpO3JldHVybiB0aGlzLmN1cnJlbnRQb2ludC5jb3B5KGMpLHRoaXN9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmN1cnJlbnRQb2ludC5jb3B5KHQuY3VycmVudFBvaW50KSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQuY3VycmVudFBvaW50PXRoaXMuY3VycmVudFBvaW50LnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLmN1cnJlbnRQb2ludC5mcm9tQXJyYXkodC5jdXJyZW50UG9pbnQpLHRoaXN9fWNsYXNzIFJtdCBleHRlbmRzIEVtdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLnV1aWQ9cWl0KCksdGhpcy50eXBlPSJTaGFwZSIsdGhpcy5ob2xlcz1bXX1nZXRQb2ludHNIb2xlcyh0KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wLG89dGhpcy5ob2xlcy5sZW5ndGg7bjxvO24rKyllW25dPXRoaXMuaG9sZXNbbl0uZ2V0UG9pbnRzKHQpO3JldHVybiBlfWV4dHJhY3RQb2ludHModCl7cmV0dXJue3NoYXBlOnRoaXMuZ2V0UG9pbnRzKHQpLGhvbGVzOnRoaXMuZ2V0UG9pbnRzSG9sZXModCl9fWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLmhvbGVzPVtdO2ZvcihsZXQgZT0wLG49dC5ob2xlcy5sZW5ndGg7ZTxuO2UrKyl0aGlzLmhvbGVzLnB1c2godC5ob2xlc1tlXS5jbG9uZSgpKTtyZXR1cm4gdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QudXVpZD10aGlzLnV1aWQsdC5ob2xlcz1bXTtmb3IobGV0IGU9MCxuPXRoaXMuaG9sZXMubGVuZ3RoO2U8bjtlKyspdC5ob2xlcy5wdXNoKHRoaXMuaG9sZXNbZV0udG9KU09OKCkpO3JldHVybiB0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMudXVpZD10LnV1aWQsdGhpcy5ob2xlcz1bXTtmb3IobGV0IGU9MCxuPXQuaG9sZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IG49dC5ob2xlc1tlXTt0aGlzLmhvbGVzLnB1c2goKG5ldyBFbXQpLmZyb21KU09OKG4pKX1yZXR1cm4gdGhpc319Y2xhc3MgQW10IGV4dGVuZHMgcHJ0e2NvbnN0cnVjdG9yKHQsZT0xKXtzdXBlcigpLHRoaXMudHlwZT0iTGlnaHQiLHRoaXMuY29sb3I9bmV3IFJydCh0KSx0aGlzLmludGVuc2l0eT1lfWRpc3Bvc2UoKXt9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5pbnRlbnNpdHk9dC5pbnRlbnNpdHksdGhpc310b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUub2JqZWN0LmNvbG9yPXRoaXMuY29sb3IuZ2V0SGV4KCksZS5vYmplY3QuaW50ZW5zaXR5PXRoaXMuaW50ZW5zaXR5LHZvaWQgMCE9PXRoaXMuZ3JvdW5kQ29sb3ImJihlLm9iamVjdC5ncm91bmRDb2xvcj10aGlzLmdyb3VuZENvbG9yLmdldEhleCgpKSx2b2lkIDAhPT10aGlzLmRpc3RhbmNlJiYoZS5vYmplY3QuZGlzdGFuY2U9dGhpcy5kaXN0YW5jZSksdm9pZCAwIT09dGhpcy5hbmdsZSYmKGUub2JqZWN0LmFuZ2xlPXRoaXMuYW5nbGUpLHZvaWQgMCE9PXRoaXMuZGVjYXkmJihlLm9iamVjdC5kZWNheT10aGlzLmRlY2F5KSx2b2lkIDAhPT10aGlzLnBlbnVtYnJhJiYoZS5vYmplY3QucGVudW1icmE9dGhpcy5wZW51bWJyYSksdm9pZCAwIT09dGhpcy5zaGFkb3cmJihlLm9iamVjdC5zaGFkb3c9dGhpcy5zaGFkb3cudG9KU09OKCkpLGV9fUFtdC5wcm90b3R5cGUuaXNMaWdodD0hMCxjbGFzcyBleHRlbmRzIEFtdHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodCxuKSx0aGlzLnR5cGU9IkhlbWlzcGhlcmVMaWdodCIsdGhpcy5wb3NpdGlvbi5jb3B5KHBydC5EZWZhdWx0VXApLHRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5ncm91bmRDb2xvcj1uZXcgUnJ0KGUpfWNvcHkodCl7cmV0dXJuIEFtdC5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsdCksdGhpcy5ncm91bmRDb2xvci5jb3B5KHQuZ3JvdW5kQ29sb3IpLHRoaXN9fS5wcm90b3R5cGUuaXNIZW1pc3BoZXJlTGlnaHQ9ITA7Y29uc3QgVG10PW5ldyBCYXQsTm10PW5ldyBjYXQsem10PW5ldyBjYXQ7Y2xhc3MgSW10e2NvbnN0cnVjdG9yKHQpe3RoaXMuY2FtZXJhPXQsdGhpcy5iaWFzPTAsdGhpcy5ub3JtYWxCaWFzPTAsdGhpcy5yYWRpdXM9MSx0aGlzLm1hcFNpemU9bmV3IFFpdCg1MTIsNTEyKSx0aGlzLm1hcD1udWxsLHRoaXMubWFwUGFzcz1udWxsLHRoaXMubWF0cml4PW5ldyBCYXQsdGhpcy5hdXRvVXBkYXRlPSEwLHRoaXMubmVlZHNVcGRhdGU9ITEsdGhpcy5fZnJ1c3R1bT1uZXcgRXN0LHRoaXMuX2ZyYW1lRXh0ZW50cz1uZXcgUWl0KDEsMSksdGhpcy5fdmlld3BvcnRDb3VudD0xLHRoaXMuX3ZpZXdwb3J0cz1bbmV3IGFhdCgwLDAsMSwxKV19Z2V0Vmlld3BvcnRDb3VudCgpe3JldHVybiB0aGlzLl92aWV3cG9ydENvdW50fWdldEZydXN0dW0oKXtyZXR1cm4gdGhpcy5fZnJ1c3R1bX11cGRhdGVNYXRyaWNlcyh0KXtjb25zdCBlPXRoaXMuY2FtZXJhLG49dGhpcy5tYXRyaXg7Tm10LnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKSxlLnBvc2l0aW9uLmNvcHkoTm10KSx6bXQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQudGFyZ2V0Lm1hdHJpeFdvcmxkKSxlLmxvb2tBdCh6bXQpLGUudXBkYXRlTWF0cml4V29ybGQoKSxUbXQubXVsdGlwbHlNYXRyaWNlcyhlLnByb2plY3Rpb25NYXRyaXgsZS5tYXRyaXhXb3JsZEludmVyc2UpLHRoaXMuX2ZydXN0dW0uc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoVG10KSxuLnNldCguNSwwLDAsLjUsMCwuNSwwLC41LDAsMCwuNSwuNSwwLDAsMCwxKSxuLm11bHRpcGx5KGUucHJvamVjdGlvbk1hdHJpeCksbi5tdWx0aXBseShlLm1hdHJpeFdvcmxkSW52ZXJzZSl9Z2V0Vmlld3BvcnQodCl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0c1t0XX1nZXRGcmFtZUV4dGVudHMoKXtyZXR1cm4gdGhpcy5fZnJhbWVFeHRlbnRzfWRpc3Bvc2UoKXt0aGlzLm1hcCYmdGhpcy5tYXAuZGlzcG9zZSgpLHRoaXMubWFwUGFzcyYmdGhpcy5tYXBQYXNzLmRpc3Bvc2UoKX1jb3B5KHQpe3JldHVybiB0aGlzLmNhbWVyYT10LmNhbWVyYS5jbG9uZSgpLHRoaXMuYmlhcz10LmJpYXMsdGhpcy5yYWRpdXM9dC5yYWRpdXMsdGhpcy5tYXBTaXplLmNvcHkodC5tYXBTaXplKSx0aGlzfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfXRvSlNPTigpe2NvbnN0IHQ9e307cmV0dXJuIDAhPT10aGlzLmJpYXMmJih0LmJpYXM9dGhpcy5iaWFzKSwwIT09dGhpcy5ub3JtYWxCaWFzJiYodC5ub3JtYWxCaWFzPXRoaXMubm9ybWFsQmlhcyksMSE9PXRoaXMucmFkaXVzJiYodC5yYWRpdXM9dGhpcy5yYWRpdXMpLDUxMj09PXRoaXMubWFwU2l6ZS54JiY1MTI9PT10aGlzLm1hcFNpemUueXx8KHQubWFwU2l6ZT10aGlzLm1hcFNpemUudG9BcnJheSgpKSx0LmNhbWVyYT10aGlzLmNhbWVyYS50b0pTT04oITEpLm9iamVjdCxkZWxldGUgdC5jYW1lcmEubWF0cml4LHR9fWNsYXNzIEhtdCBleHRlbmRzIEltdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKG5ldyBfc3QoNTAsMSwuNSw1MDApKSx0aGlzLmZvY3VzPTF9dXBkYXRlTWF0cmljZXModCl7Y29uc3QgZT10aGlzLmNhbWVyYSxuPTIqWWl0KnQuYW5nbGUqdGhpcy5mb2N1cyxvPXRoaXMubWFwU2l6ZS53aWR0aC90aGlzLm1hcFNpemUuaGVpZ2h0LGk9dC5kaXN0YW5jZXx8ZS5mYXI7bj09PWUuZm92JiZvPT09ZS5hc3BlY3QmJmk9PT1lLmZhcnx8KGUuZm92PW4sZS5hc3BlY3Q9byxlLmZhcj1pLGUudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpKSxzdXBlci51cGRhdGVNYXRyaWNlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuZm9jdXM9dC5mb2N1cyx0aGlzfX1IbXQucHJvdG90eXBlLmlzU3BvdExpZ2h0U2hhZG93PSEwLGNsYXNzIGV4dGVuZHMgQW10e2NvbnN0cnVjdG9yKHQsZSxuPTAsbz1NYXRoLlBJLzMsaT0wLGE9MSl7c3VwZXIodCxlKSx0aGlzLnR5cGU9IlNwb3RMaWdodCIsdGhpcy5wb3NpdGlvbi5jb3B5KHBydC5EZWZhdWx0VXApLHRoaXMudXBkYXRlTWF0cml4KCksdGhpcy50YXJnZXQ9bmV3IHBydCx0aGlzLmRpc3RhbmNlPW4sdGhpcy5hbmdsZT1vLHRoaXMucGVudW1icmE9aSx0aGlzLmRlY2F5PWEsdGhpcy5zaGFkb3c9bmV3IEhtdH1nZXQgcG93ZXIoKXtyZXR1cm4gdGhpcy5pbnRlbnNpdHkqTWF0aC5QSX1zZXQgcG93ZXIodCl7dGhpcy5pbnRlbnNpdHk9dC9NYXRoLlBJfWRpc3Bvc2UoKXt0aGlzLnNoYWRvdy5kaXNwb3NlKCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmRpc3RhbmNlPXQuZGlzdGFuY2UsdGhpcy5hbmdsZT10LmFuZ2xlLHRoaXMucGVudW1icmE9dC5wZW51bWJyYSx0aGlzLmRlY2F5PXQuZGVjYXksdGhpcy50YXJnZXQ9dC50YXJnZXQuY2xvbmUoKSx0aGlzLnNoYWRvdz10LnNoYWRvdy5jbG9uZSgpLHRoaXN9fS5wcm90b3R5cGUuaXNTcG90TGlnaHQ9ITA7Y29uc3QgRm10PW5ldyBCYXQsTG10PW5ldyBjYXQsQm10PW5ldyBjYXQ7Y2xhc3MgVm10IGV4dGVuZHMgSW10e2NvbnN0cnVjdG9yKCl7c3VwZXIobmV3IF9zdCg5MCwxLC41LDUwMCkpLHRoaXMuX2ZyYW1lRXh0ZW50cz1uZXcgUWl0KDQsMiksdGhpcy5fdmlld3BvcnRDb3VudD02LHRoaXMuX3ZpZXdwb3J0cz1bbmV3IGFhdCgyLDEsMSwxKSxuZXcgYWF0KDAsMSwxLDEpLG5ldyBhYXQoMywxLDEsMSksbmV3IGFhdCgxLDEsMSwxKSxuZXcgYWF0KDMsMCwxLDEpLG5ldyBhYXQoMSwwLDEsMSldLHRoaXMuX2N1YmVEaXJlY3Rpb25zPVtuZXcgY2F0KDEsMCwwKSxuZXcgY2F0KC0xLDAsMCksbmV3IGNhdCgwLDAsMSksbmV3IGNhdCgwLDAsLTEpLG5ldyBjYXQoMCwxLDApLG5ldyBjYXQoMCwtMSwwKV0sdGhpcy5fY3ViZVVwcz1bbmV3IGNhdCgwLDEsMCksbmV3IGNhdCgwLDEsMCksbmV3IGNhdCgwLDEsMCksbmV3IGNhdCgwLDEsMCksbmV3IGNhdCgwLDAsMSksbmV3IGNhdCgwLDAsLTEpXX11cGRhdGVNYXRyaWNlcyh0LGU9MCl7Y29uc3Qgbj10aGlzLmNhbWVyYSxvPXRoaXMubWF0cml4LGk9dC5kaXN0YW5jZXx8bi5mYXI7aSE9PW4uZmFyJiYobi5mYXI9aSxuLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSksTG10LnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKSxuLnBvc2l0aW9uLmNvcHkoTG10KSxCbXQuY29weShuLnBvc2l0aW9uKSxCbXQuYWRkKHRoaXMuX2N1YmVEaXJlY3Rpb25zW2VdKSxuLnVwLmNvcHkodGhpcy5fY3ViZVVwc1tlXSksbi5sb29rQXQoQm10KSxuLnVwZGF0ZU1hdHJpeFdvcmxkKCksby5tYWtlVHJhbnNsYXRpb24oLUxtdC54LC1MbXQueSwtTG10LnopLEZtdC5tdWx0aXBseU1hdHJpY2VzKG4ucHJvamVjdGlvbk1hdHJpeCxuLm1hdHJpeFdvcmxkSW52ZXJzZSksdGhpcy5fZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChGbXQpfX1WbXQucHJvdG90eXBlLmlzUG9pbnRMaWdodFNoYWRvdz0hMCxjbGFzcyBleHRlbmRzIEFtdHtjb25zdHJ1Y3Rvcih0LGUsbj0wLG89MSl7c3VwZXIodCxlKSx0aGlzLnR5cGU9IlBvaW50TGlnaHQiLHRoaXMuZGlzdGFuY2U9bix0aGlzLmRlY2F5PW8sdGhpcy5zaGFkb3c9bmV3IFZtdH1nZXQgcG93ZXIoKXtyZXR1cm4gNCp0aGlzLmludGVuc2l0eSpNYXRoLlBJfXNldCBwb3dlcih0KXt0aGlzLmludGVuc2l0eT10Lyg0Kk1hdGguUEkpfWRpc3Bvc2UoKXt0aGlzLnNoYWRvdy5kaXNwb3NlKCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmRpc3RhbmNlPXQuZGlzdGFuY2UsdGhpcy5kZWNheT10LmRlY2F5LHRoaXMuc2hhZG93PXQuc2hhZG93LmNsb25lKCksdGhpc319LnByb3RvdHlwZS5pc1BvaW50TGlnaHQ9ITA7Y2xhc3Mgam10IGV4dGVuZHMgSW10e2NvbnN0cnVjdG9yKCl7c3VwZXIobmV3IFVzdCgtNSw1LDUsLTUsLjUsNTAwKSl9fWptdC5wcm90b3R5cGUuaXNEaXJlY3Rpb25hbExpZ2h0U2hhZG93PSEwLGNsYXNzIGV4dGVuZHMgQW10e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLnR5cGU9IkRpcmVjdGlvbmFsTGlnaHQiLHRoaXMucG9zaXRpb24uY29weShwcnQuRGVmYXVsdFVwKSx0aGlzLnVwZGF0ZU1hdHJpeCgpLHRoaXMudGFyZ2V0PW5ldyBwcnQsdGhpcy5zaGFkb3c9bmV3IGptdH1kaXNwb3NlKCl7dGhpcy5zaGFkb3cuZGlzcG9zZSgpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy50YXJnZXQ9dC50YXJnZXQuY2xvbmUoKSx0aGlzLnNoYWRvdz10LnNoYWRvdy5jbG9uZSgpLHRoaXN9fS5wcm90b3R5cGUuaXNEaXJlY3Rpb25hbExpZ2h0PSEwLGNsYXNzIGV4dGVuZHMgQW10e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLnR5cGU9IkFtYmllbnRMaWdodCJ9fS5wcm90b3R5cGUuaXNBbWJpZW50TGlnaHQ9ITAsY2xhc3MgZXh0ZW5kcyBBbXR7Y29uc3RydWN0b3IodCxlLG49MTAsbz0xMCl7c3VwZXIodCxlKSx0aGlzLnR5cGU9IlJlY3RBcmVhTGlnaHQiLHRoaXMud2lkdGg9bix0aGlzLmhlaWdodD1vfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy53aWR0aD10LndpZHRoLHRoaXMuaGVpZ2h0PXQuaGVpZ2h0LHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO3JldHVybiBlLm9iamVjdC53aWR0aD10aGlzLndpZHRoLGUub2JqZWN0LmhlaWdodD10aGlzLmhlaWdodCxlfX0ucHJvdG90eXBlLmlzUmVjdEFyZWFMaWdodD0hMDtjbGFzcyBVbXR7Y29uc3RydWN0b3IoKXt0aGlzLmNvZWZmaWNpZW50cz1bXTtmb3IobGV0IHQ9MDt0PDk7dCsrKXRoaXMuY29lZmZpY2llbnRzLnB1c2gobmV3IGNhdCl9c2V0KHQpe2ZvcihsZXQgZT0wO2U8OTtlKyspdGhpcy5jb2VmZmljaWVudHNbZV0uY29weSh0W2VdKTtyZXR1cm4gdGhpc316ZXJvKCl7Zm9yKGxldCB0PTA7dDw5O3QrKyl0aGlzLmNvZWZmaWNpZW50c1t0XS5zZXQoMCwwLDApO3JldHVybiB0aGlzfWdldEF0KHQsZSl7Y29uc3Qgbj10Lngsbz10LnksaT10LnosYT10aGlzLmNvZWZmaWNpZW50cztyZXR1cm4gZS5jb3B5KGFbMF0pLm11bHRpcGx5U2NhbGFyKC4yODIwOTUpLGUuYWRkU2NhbGVkVmVjdG9yKGFbMV0sLjQ4ODYwMypvKSxlLmFkZFNjYWxlZFZlY3RvcihhWzJdLC40ODg2MDMqaSksZS5hZGRTY2FsZWRWZWN0b3IoYVszXSwuNDg4NjAzKm4pLGUuYWRkU2NhbGVkVmVjdG9yKGFbNF0sbipvKjEuMDkyNTQ4KSxlLmFkZFNjYWxlZFZlY3RvcihhWzVdLG8qaSoxLjA5MjU0OCksZS5hZGRTY2FsZWRWZWN0b3IoYVs2XSwuMzE1MzkyKigzKmkqaS0xKSksZS5hZGRTY2FsZWRWZWN0b3IoYVs3XSxuKmkqMS4wOTI1NDgpLGUuYWRkU2NhbGVkVmVjdG9yKGFbOF0sLjU0NjI3NCoobipuLW8qbykpLGV9Z2V0SXJyYWRpYW5jZUF0KHQsZSl7Y29uc3Qgbj10Lngsbz10LnksaT10LnosYT10aGlzLmNvZWZmaWNpZW50cztyZXR1cm4gZS5jb3B5KGFbMF0pLm11bHRpcGx5U2NhbGFyKC44ODYyMjcpLGUuYWRkU2NhbGVkVmVjdG9yKGFbMV0sMS4wMjMzMjgqbyksZS5hZGRTY2FsZWRWZWN0b3IoYVsyXSwxLjAyMzMyOCppKSxlLmFkZFNjYWxlZFZlY3RvcihhWzNdLDEuMDIzMzI4Km4pLGUuYWRkU2NhbGVkVmVjdG9yKGFbNF0sLjg1ODA4NipuKm8pLGUuYWRkU2NhbGVkVmVjdG9yKGFbNV0sLjg1ODA4NipvKmkpLGUuYWRkU2NhbGVkVmVjdG9yKGFbNl0sLjc0MzEyNSppKmktLjI0NzcwOCksZS5hZGRTY2FsZWRWZWN0b3IoYVs3XSwuODU4MDg2Km4qaSksZS5hZGRTY2FsZWRWZWN0b3IoYVs4XSwuNDI5MDQzKihuKm4tbypvKSksZX1hZGQodCl7Zm9yKGxldCBlPTA7ZTw5O2UrKyl0aGlzLmNvZWZmaWNpZW50c1tlXS5hZGQodC5jb2VmZmljaWVudHNbZV0pO3JldHVybiB0aGlzfWFkZFNjYWxlZFNIKHQsZSl7Zm9yKGxldCBuPTA7bjw5O24rKyl0aGlzLmNvZWZmaWNpZW50c1tuXS5hZGRTY2FsZWRWZWN0b3IodC5jb2VmZmljaWVudHNbbl0sZSk7cmV0dXJuIHRoaXN9c2NhbGUodCl7Zm9yKGxldCBlPTA7ZTw5O2UrKyl0aGlzLmNvZWZmaWNpZW50c1tlXS5tdWx0aXBseVNjYWxhcih0KTtyZXR1cm4gdGhpc31sZXJwKHQsZSl7Zm9yKGxldCBuPTA7bjw5O24rKyl0aGlzLmNvZWZmaWNpZW50c1tuXS5sZXJwKHQuY29lZmZpY2llbnRzW25dLGUpO3JldHVybiB0aGlzfWVxdWFscyh0KXtmb3IobGV0IGU9MDtlPDk7ZSsrKWlmKCF0aGlzLmNvZWZmaWNpZW50c1tlXS5lcXVhbHModC5jb2VmZmljaWVudHNbZV0pKXJldHVybiExO3JldHVybiEwfWNvcHkodCl7cmV0dXJuIHRoaXMuc2V0KHQuY29lZmZpY2llbnRzKX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1mcm9tQXJyYXkodCxlPTApe2NvbnN0IG49dGhpcy5jb2VmZmljaWVudHM7Zm9yKGxldCBvPTA7bzw5O28rKyluW29dLmZyb21BcnJheSh0LGUrMypvKTtyZXR1cm4gdGhpc310b0FycmF5KHQ9W10sZT0wKXtjb25zdCBuPXRoaXMuY29lZmZpY2llbnRzO2ZvcihsZXQgbz0wO288OTtvKyspbltvXS50b0FycmF5KHQsZSszKm8pO3JldHVybiB0fXN0YXRpYyBnZXRCYXNpc0F0KHQsZSl7Y29uc3Qgbj10Lngsbz10LnksaT10Lno7ZVswXT0uMjgyMDk1LGVbMV09LjQ4ODYwMypvLGVbMl09LjQ4ODYwMyppLGVbM109LjQ4ODYwMypuLGVbNF09MS4wOTI1NDgqbipvLGVbNV09MS4wOTI1NDgqbyppLGVbNl09LjMxNTM5MiooMyppKmktMSksZVs3XT0xLjA5MjU0OCpuKmksZVs4XT0uNTQ2Mjc0KihuKm4tbypvKX19VW10LnByb3RvdHlwZS5pc1NwaGVyaWNhbEhhcm1vbmljczM9ITA7Y2xhc3MgR210IGV4dGVuZHMgQW10e2NvbnN0cnVjdG9yKHQ9bmV3IFVtdCxlPTEpe3N1cGVyKHZvaWQgMCxlKSx0aGlzLnNoPXR9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnNoLmNvcHkodC5zaCksdGhpc31mcm9tSlNPTih0KXtyZXR1cm4gdGhpcy5pbnRlbnNpdHk9dC5pbnRlbnNpdHksdGhpcy5zaC5mcm9tQXJyYXkodC5zaCksdGhpc310b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUub2JqZWN0LnNoPXRoaXMuc2gudG9BcnJheSgpLGV9fWxldCBXbXQ7R210LnByb3RvdHlwZS5pc0xpZ2h0UHJvYmU9ITAsY2xhc3MgZXh0ZW5kcyBxcnR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudHlwZT0iSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkiLHRoaXMuaW5zdGFuY2VDb3VudD0xLzB9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmluc3RhbmNlQ291bnQ9dC5pbnN0YW5jZUNvdW50LHRoaXN9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04odGhpcyk7cmV0dXJuIHQuaW5zdGFuY2VDb3VudD10aGlzLmluc3RhbmNlQ291bnQsdC5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5PSEwLHR9fS5wcm90b3R5cGUuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT0hMCxjbGFzcyBleHRlbmRzIHpydHtjb25zdHJ1Y3Rvcih0LGUsbixvPTEpeyJudW1iZXIiPT10eXBlb2YgbiYmKG89bixuPSExLGNvbnNvbGUuZXJyb3IoIlRIUkVFLkluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZTogVGhlIGNvbnN0cnVjdG9yIG5vdyBleHBlY3RzIG5vcm1hbGl6ZWQgYXMgdGhlIHRoaXJkIGFyZ3VtZW50LiIpKSxzdXBlcih0LGUsbiksdGhpcy5tZXNoUGVyQXR0cmlidXRlPW99Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9dC5tZXNoUGVyQXR0cmlidXRlLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5tZXNoUGVyQXR0cmlidXRlPXRoaXMubWVzaFBlckF0dHJpYnV0ZSx0LmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlPSEwLHR9fS5wcm90b3R5cGUuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU9ITAsY2xhc3MgZXh0ZW5kcyB4bXR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksInVuZGVmaW5lZCI9PXR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcCYmY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogY3JlYXRlSW1hZ2VCaXRtYXAoKSBub3Qgc3VwcG9ydGVkLiIpLCJ1bmRlZmluZWQiPT10eXBlb2YgZmV0Y2gmJmNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGZldGNoKCkgbm90IHN1cHBvcnRlZC4iKSx0aGlzLm9wdGlvbnM9e3ByZW11bHRpcGx5QWxwaGE6Im5vbmUifX1zZXRPcHRpb25zKHQpe3JldHVybiB0aGlzLm9wdGlvbnM9dCx0aGlzfWxvYWQodCxlLG4sbyl7dm9pZCAwPT09dCYmKHQ9IiIpLHZvaWQgMCE9PXRoaXMucGF0aCYmKHQ9dGhpcy5wYXRoK3QpLHQ9dGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwodCk7Y29uc3QgaT10aGlzLGE9TW10LmdldCh0KTtpZih2b2lkIDAhPT1hKXJldHVybiBpLm1hbmFnZXIuaXRlbVN0YXJ0KHQpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZSYmZShhKSxpLm1hbmFnZXIuaXRlbUVuZCh0KX0pLDApLGE7Y29uc3Qgcj17fTtyLmNyZWRlbnRpYWxzPSJhbm9ueW1vdXMiPT09dGhpcy5jcm9zc09yaWdpbj8ic2FtZS1vcmlnaW4iOiJpbmNsdWRlIixyLmhlYWRlcnM9dGhpcy5yZXF1ZXN0SGVhZGVyLGZldGNoKHQscikudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIHQuYmxvYigpfSkpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiBjcmVhdGVJbWFnZUJpdG1hcCh0LE9iamVjdC5hc3NpZ24oaS5vcHRpb25zLHtjb2xvclNwYWNlQ29udmVyc2lvbjoibm9uZSJ9KSl9KSkudGhlbigoZnVuY3Rpb24obil7TW10LmFkZCh0LG4pLGUmJmUobiksaS5tYW5hZ2VyLml0ZW1FbmQodCl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28mJm8oZSksaS5tYW5hZ2VyLml0ZW1FcnJvcih0KSxpLm1hbmFnZXIuaXRlbUVuZCh0KX0pKSxpLm1hbmFnZXIuaXRlbVN0YXJ0KHQpfX0ucHJvdG90eXBlLmlzSW1hZ2VCaXRtYXBMb2FkZXI9ITA7Y2xhc3MgWW10IGV4dGVuZHMgeG10e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4sbyl7Y29uc3QgaT10aGlzLGE9bmV3IFBtdCh0aGlzLm1hbmFnZXIpO2Euc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpLGEuc2V0UGF0aCh0aGlzLnBhdGgpLGEuc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLGEuc2V0V2l0aENyZWRlbnRpYWxzKHRoaXMud2l0aENyZWRlbnRpYWxzKSxhLmxvYWQodCwoZnVuY3Rpb24obil7dHJ5e2NvbnN0IHQ9bi5zbGljZSgwKTsodm9pZCAwPT09V210JiYoV210PW5ldyh3aW5kb3cuQXVkaW9Db250ZXh0fHx3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0KSksV210KS5kZWNvZGVBdWRpb0RhdGEodCwoZnVuY3Rpb24odCl7ZSh0KX0pKX1jYXRjaChlKXtvP28oZSk6Y29uc29sZS5lcnJvcihlKSxpLm1hbmFnZXIuaXRlbUVycm9yKHQpfX0pLG4sbyl9fShjbGFzcyBleHRlbmRzIEdtdHtjb25zdHJ1Y3Rvcih0LGUsbj0xKXtzdXBlcih2b2lkIDAsbik7Y29uc3Qgbz0obmV3IFJydCkuc2V0KHQpLGk9KG5ldyBScnQpLnNldChlKSxhPW5ldyBjYXQoby5yLG8uZyxvLmIpLHI9bmV3IGNhdChpLnIsaS5nLGkuYikscz1NYXRoLnNxcnQoTWF0aC5QSSksbD1zKk1hdGguc3FydCguNzUpO3RoaXMuc2guY29lZmZpY2llbnRzWzBdLmNvcHkoYSkuYWRkKHIpLm11bHRpcGx5U2NhbGFyKHMpLHRoaXMuc2guY29lZmZpY2llbnRzWzFdLmNvcHkoYSkuc3ViKHIpLm11bHRpcGx5U2NhbGFyKGwpfX0pLnByb3RvdHlwZS5pc0hlbWlzcGhlcmVMaWdodFByb2JlPSEwLGNsYXNzIGV4dGVuZHMgR210e2NvbnN0cnVjdG9yKHQsZT0xKXtzdXBlcih2b2lkIDAsZSk7Y29uc3Qgbj0obmV3IFJydCkuc2V0KHQpO3RoaXMuc2guY29lZmZpY2llbnRzWzBdLnNldChuLnIsbi5nLG4uYikubXVsdGlwbHlTY2FsYXIoMipNYXRoLnNxcnQoTWF0aC5QSSkpfX0ucHJvdG90eXBlLmlzQW1iaWVudExpZ2h0UHJvYmU9ITA7Y2xhc3MgcW10e2NvbnN0cnVjdG9yKHQsZSxuKXtsZXQgbyxpLGE7c3dpdGNoKHRoaXMuYmluZGluZz10LHRoaXMudmFsdWVTaXplPW4sZSl7Y2FzZSJxdWF0ZXJuaW9uIjpvPXRoaXMuX3NsZXJwLGk9dGhpcy5fc2xlcnBBZGRpdGl2ZSxhPXRoaXMuX3NldEFkZGl0aXZlSWRlbnRpdHlRdWF0ZXJuaW9uLHRoaXMuYnVmZmVyPW5ldyBGbG9hdDY0QXJyYXkoNipuKSx0aGlzLl93b3JrSW5kZXg9NTticmVhaztjYXNlInN0cmluZyI6Y2FzZSJib29sIjpvPXRoaXMuX3NlbGVjdCxpPXRoaXMuX3NlbGVjdCxhPXRoaXMuX3NldEFkZGl0aXZlSWRlbnRpdHlPdGhlcix0aGlzLmJ1ZmZlcj1uZXcgQXJyYXkoNSpuKTticmVhaztkZWZhdWx0Om89dGhpcy5fbGVycCxpPXRoaXMuX2xlcnBBZGRpdGl2ZSxhPXRoaXMuX3NldEFkZGl0aXZlSWRlbnRpdHlOdW1lcmljLHRoaXMuYnVmZmVyPW5ldyBGbG9hdDY0QXJyYXkoNSpuKX10aGlzLl9taXhCdWZmZXJSZWdpb249byx0aGlzLl9taXhCdWZmZXJSZWdpb25BZGRpdGl2ZT1pLHRoaXMuX3NldElkZW50aXR5PWEsdGhpcy5fb3JpZ0luZGV4PTMsdGhpcy5fYWRkSW5kZXg9NCx0aGlzLmN1bXVsYXRpdmVXZWlnaHQ9MCx0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZT0wLHRoaXMudXNlQ291bnQ9MCx0aGlzLnJlZmVyZW5jZUNvdW50PTB9YWNjdW11bGF0ZSh0LGUpe2NvbnN0IG49dGhpcy5idWZmZXIsbz10aGlzLnZhbHVlU2l6ZSxpPXQqbytvO2xldCBhPXRoaXMuY3VtdWxhdGl2ZVdlaWdodDtpZigwPT09YSl7Zm9yKGxldCB0PTA7dCE9PW87Kyt0KW5baSt0XT1uW3RdO2E9ZX1lbHNlIGErPWUsdGhpcy5fbWl4QnVmZmVyUmVnaW9uKG4saSwwLGUvYSxvKTt0aGlzLmN1bXVsYXRpdmVXZWlnaHQ9YX1hY2N1bXVsYXRlQWRkaXRpdmUodCl7Y29uc3QgZT10aGlzLmJ1ZmZlcixuPXRoaXMudmFsdWVTaXplLG89bip0aGlzLl9hZGRJbmRleDswPT09dGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUmJnRoaXMuX3NldElkZW50aXR5KCksdGhpcy5fbWl4QnVmZmVyUmVnaW9uQWRkaXRpdmUoZSxvLDAsdCxuKSx0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSs9dH1hcHBseSh0KXtjb25zdCBlPXRoaXMudmFsdWVTaXplLG49dGhpcy5idWZmZXIsbz10KmUrZSxpPXRoaXMuY3VtdWxhdGl2ZVdlaWdodCxhPXRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlLHI9dGhpcy5iaW5kaW5nO3RoaXMuY3VtdWxhdGl2ZVdlaWdodD0wLHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlPTAsaTwxJiZ0aGlzLl9taXhCdWZmZXJSZWdpb24obixvLGUqdGhpcy5fb3JpZ0luZGV4LDEtaSxlKSxhPjAmJnRoaXMuX21peEJ1ZmZlclJlZ2lvbkFkZGl0aXZlKG4sbyx0aGlzLl9hZGRJbmRleCplLDEsZSk7Zm9yKGxldCB0PWUsaT1lK2U7dCE9PWk7Kyt0KWlmKG5bdF0hPT1uW3QrZV0pe3Iuc2V0VmFsdWUobixvKTticmVha319c2F2ZU9yaWdpbmFsU3RhdGUoKXtjb25zdCB0PXRoaXMuYnVmZmVyLGU9dGhpcy52YWx1ZVNpemUsbj1lKnRoaXMuX29yaWdJbmRleDt0aGlzLmJpbmRpbmcuZ2V0VmFsdWUodCxuKTtmb3IobGV0IG89ZSxpPW47byE9PWk7KytvKXRbb109dFtuK28lZV07dGhpcy5fc2V0SWRlbnRpdHkoKSx0aGlzLmN1bXVsYXRpdmVXZWlnaHQ9MCx0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZT0wfXJlc3RvcmVPcmlnaW5hbFN0YXRlKCl7dGhpcy5iaW5kaW5nLnNldFZhbHVlKHRoaXMuYnVmZmVyLDMqdGhpcy52YWx1ZVNpemUpfV9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYygpe2NvbnN0IHQ9dGhpcy5fYWRkSW5kZXgqdGhpcy52YWx1ZVNpemUsZT10K3RoaXMudmFsdWVTaXplO2ZvcihsZXQgbj10O248ZTtuKyspdGhpcy5idWZmZXJbbl09MH1fc2V0QWRkaXRpdmVJZGVudGl0eVF1YXRlcm5pb24oKXt0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYygpLHRoaXMuYnVmZmVyW3RoaXMuX2FkZEluZGV4KnRoaXMudmFsdWVTaXplKzNdPTF9X3NldEFkZGl0aXZlSWRlbnRpdHlPdGhlcigpe2NvbnN0IHQ9dGhpcy5fb3JpZ0luZGV4KnRoaXMudmFsdWVTaXplLGU9dGhpcy5fYWRkSW5kZXgqdGhpcy52YWx1ZVNpemU7Zm9yKGxldCBuPTA7bjx0aGlzLnZhbHVlU2l6ZTtuKyspdGhpcy5idWZmZXJbZStuXT10aGlzLmJ1ZmZlclt0K25dfV9zZWxlY3QodCxlLG4sbyxpKXtpZihvPj0uNSlmb3IobGV0IG89MDtvIT09aTsrK28pdFtlK29dPXRbbitvXX1fc2xlcnAodCxlLG4sbyl7bGF0LnNsZXJwRmxhdCh0LGUsdCxlLHQsbixvKX1fc2xlcnBBZGRpdGl2ZSh0LGUsbixvLGkpe2NvbnN0IGE9dGhpcy5fd29ya0luZGV4Kmk7bGF0Lm11bHRpcGx5UXVhdGVybmlvbnNGbGF0KHQsYSx0LGUsdCxuKSxsYXQuc2xlcnBGbGF0KHQsZSx0LGUsdCxhLG8pfV9sZXJwKHQsZSxuLG8saSl7Y29uc3QgYT0xLW87Zm9yKGxldCByPTA7ciE9PWk7KytyKXtjb25zdCBpPWUrcjt0W2ldPXRbaV0qYSt0W24rcl0qb319X2xlcnBBZGRpdGl2ZSh0LGUsbixvLGkpe2ZvcihsZXQgYT0wO2EhPT1pOysrYSl7Y29uc3QgaT1lK2E7dFtpXT10W2ldK3RbbithXSpvfX19Y29uc3QgWm10PW5ldyBSZWdFeHAoIltcXFtcXF1cXC46XFwvXSIsImciKSxYbXQ9IlteXFxbXFxdXFwuOlxcL10iLEttdD0iW14iKyJcXFtcXF1cXC46XFwvIi5yZXBsYWNlKCJcXC4iLCIiKSsiXSIsSm10PS8oKD86V0MrW1wvOl0pKikvLnNvdXJjZS5yZXBsYWNlKCJXQyIsWG10KSxRbXQ9LyhXQ09EKyk/Ly5zb3VyY2UucmVwbGFjZSgiV0NPRCIsS210KSwkbXQ9Lyg/OlwuKFdDKykoPzpcWyguKylcXSk/KT8vLnNvdXJjZS5yZXBsYWNlKCJXQyIsWG10KSx0dXQ9L1wuKFdDKykoPzpcWyguKylcXSk/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLFhtdCksZXV0PW5ldyBSZWdFeHAoIl4iK0ptdCtRbXQrJG10K3R1dCsiJCIpLG51dD1bIm1hdGVyaWFsIiwibWF0ZXJpYWxzIiwiYm9uZXMiXTtjbGFzcyBvdXR7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMucGF0aD1lLHRoaXMucGFyc2VkUGF0aD1ufHxvdXQucGFyc2VUcmFja05hbWUoZSksdGhpcy5ub2RlPW91dC5maW5kTm9kZSh0LHRoaXMucGFyc2VkUGF0aC5ub2RlTmFtZSl8fHQsdGhpcy5yb290Tm9kZT10LHRoaXMuZ2V0VmFsdWU9dGhpcy5fZ2V0VmFsdWVfdW5ib3VuZCx0aGlzLnNldFZhbHVlPXRoaXMuX3NldFZhbHVlX3VuYm91bmR9c3RhdGljIGNyZWF0ZSh0LGUsbil7cmV0dXJuIHQmJnQuaXNBbmltYXRpb25PYmplY3RHcm91cD9uZXcgb3V0LkNvbXBvc2l0ZSh0LGUsbik6bmV3IG91dCh0LGUsbil9c3RhdGljIHNhbml0aXplTm9kZU5hbWUodCl7cmV0dXJuIHQucmVwbGFjZSgvXHMvZywiXyIpLnJlcGxhY2UoWm10LCIiKX1zdGF0aWMgcGFyc2VUcmFja05hbWUodCl7Y29uc3QgZT1ldXQuZXhlYyh0KTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIlByb3BlcnR5QmluZGluZzogQ2Fubm90IHBhcnNlIHRyYWNrTmFtZTogIit0KTtjb25zdCBuPXtub2RlTmFtZTplWzJdLG9iamVjdE5hbWU6ZVszXSxvYmplY3RJbmRleDplWzRdLHByb3BlcnR5TmFtZTplWzVdLHByb3BlcnR5SW5kZXg6ZVs2XX0sbz1uLm5vZGVOYW1lJiZuLm5vZGVOYW1lLmxhc3RJbmRleE9mKCIuIik7aWYodm9pZCAwIT09byYmLTEhPT1vKXtjb25zdCB0PW4ubm9kZU5hbWUuc3Vic3RyaW5nKG8rMSk7LTEhPT1udXQuaW5kZXhPZih0KSYmKG4ubm9kZU5hbWU9bi5ub2RlTmFtZS5zdWJzdHJpbmcoMCxvKSxuLm9iamVjdE5hbWU9dCl9aWYobnVsbD09PW4ucHJvcGVydHlOYW1lfHwwPT09bi5wcm9wZXJ0eU5hbWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiUHJvcGVydHlCaW5kaW5nOiBjYW4gbm90IHBhcnNlIHByb3BlcnR5TmFtZSBmcm9tIHRyYWNrTmFtZTogIit0KTtyZXR1cm4gbn1zdGF0aWMgZmluZE5vZGUodCxlKXtpZighZXx8IiI9PT1lfHwiLiI9PT1lfHwtMT09PWV8fGU9PT10Lm5hbWV8fGU9PT10LnV1aWQpcmV0dXJuIHQ7aWYodC5za2VsZXRvbil7Y29uc3Qgbj10LnNrZWxldG9uLmdldEJvbmVCeU5hbWUoZSk7aWYodm9pZCAwIT09bilyZXR1cm4gbn1pZih0LmNoaWxkcmVuKXtjb25zdCBuPWZ1bmN0aW9uKHQpe2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtjb25zdCBpPXRbb107aWYoaS5uYW1lPT09ZXx8aS51dWlkPT09ZSlyZXR1cm4gaTtjb25zdCBhPW4oaS5jaGlsZHJlbik7aWYoYSlyZXR1cm4gYX1yZXR1cm4gbnVsbH0sbz1uKHQuY2hpbGRyZW4pO2lmKG8pcmV0dXJuIG99cmV0dXJuIG51bGx9X2dldFZhbHVlX3VuYXZhaWxhYmxlKCl7fV9zZXRWYWx1ZV91bmF2YWlsYWJsZSgpe31fZ2V0VmFsdWVfZGlyZWN0KHQsZSl7dFtlXT10aGlzLm5vZGVbdGhpcy5wcm9wZXJ0eU5hbWVdfV9nZXRWYWx1ZV9hcnJheSh0LGUpe2NvbnN0IG49dGhpcy5yZXNvbHZlZFByb3BlcnR5O2ZvcihsZXQgbz0wLGk9bi5sZW5ndGg7byE9PWk7KytvKXRbZSsrXT1uW29dfV9nZXRWYWx1ZV9hcnJheUVsZW1lbnQodCxlKXt0W2VdPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdfV9nZXRWYWx1ZV90b0FycmF5KHQsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LnRvQXJyYXkodCxlKX1fc2V0VmFsdWVfZGlyZWN0KHQsZSl7dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdPXRbZV19X3NldFZhbHVlX2RpcmVjdF9zZXROZWVkc1VwZGF0ZSh0LGUpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT10W2VdLHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9kaXJlY3Rfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSh0LGUpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT10W2VdLHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2FycmF5KHQsZSl7Y29uc3Qgbj10aGlzLnJlc29sdmVkUHJvcGVydHk7Zm9yKGxldCBvPTAsaT1uLmxlbmd0aDtvIT09aTsrK28pbltvXT10W2UrK119X3NldFZhbHVlX2FycmF5X3NldE5lZWRzVXBkYXRlKHQsZSl7Y29uc3Qgbj10aGlzLnJlc29sdmVkUHJvcGVydHk7Zm9yKGxldCBvPTAsaT1uLmxlbmd0aDtvIT09aTsrK28pbltvXT10W2UrK107dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2FycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUodCxlKXtjb25zdCBuPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtmb3IobGV0IG89MCxpPW4ubGVuZ3RoO28hPT1pOysrbyluW29dPXRbZSsrXTt0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9hcnJheUVsZW1lbnQodCxlKXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT10W2VdfV9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TmVlZHNVcGRhdGUodCxlKXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT10W2VdLHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSh0LGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdPXRbZV0sdGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1fc2V0VmFsdWVfZnJvbUFycmF5KHQsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSh0LGUpfV9zZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TmVlZHNVcGRhdGUodCxlKXt0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KHQsZSksdGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2Zyb21BcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKHQsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSh0LGUpLHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9X2dldFZhbHVlX3VuYm91bmQodCxlKXt0aGlzLmJpbmQoKSx0aGlzLmdldFZhbHVlKHQsZSl9X3NldFZhbHVlX3VuYm91bmQodCxlKXt0aGlzLmJpbmQoKSx0aGlzLnNldFZhbHVlKHQsZSl9YmluZCgpe2xldCB0PXRoaXMubm9kZTtjb25zdCBlPXRoaXMucGFyc2VkUGF0aCxuPWUub2JqZWN0TmFtZSxvPWUucHJvcGVydHlOYW1lO2xldCBpPWUucHJvcGVydHlJbmRleDtpZih0fHwodD1vdXQuZmluZE5vZGUodGhpcy5yb290Tm9kZSxlLm5vZGVOYW1lKXx8dGhpcy5yb290Tm9kZSx0aGlzLm5vZGU9dCksdGhpcy5nZXRWYWx1ZT10aGlzLl9nZXRWYWx1ZV91bmF2YWlsYWJsZSx0aGlzLnNldFZhbHVlPXRoaXMuX3NldFZhbHVlX3VuYXZhaWxhYmxlLCF0KXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIHVwZGF0ZSBub2RlIGZvciB0cmFjazogIit0aGlzLnBhdGgrIiBidXQgaXQgd2Fzbid0IGZvdW5kLiIpO2lmKG4pe2xldCBvPWUub2JqZWN0SW5kZXg7c3dpdGNoKG4pe2Nhc2UibWF0ZXJpYWxzIjppZighdC5tYXRlcmlhbClyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbCBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbC4iLHRoaXMpO2lmKCF0Lm1hdGVyaWFsLm1hdGVyaWFscylyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbC5tYXRlcmlhbHMgYXMgbm9kZS5tYXRlcmlhbCBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWxzIGFycmF5LiIsdGhpcyk7dD10Lm1hdGVyaWFsLm1hdGVyaWFsczticmVhaztjYXNlImJvbmVzIjppZighdC5za2VsZXRvbilyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBib25lcyBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBza2VsZXRvbi4iLHRoaXMpO3Q9dC5za2VsZXRvbi5ib25lcztmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKylpZih0W2VdLm5hbWU9PT1vKXtvPWU7YnJlYWt9YnJlYWs7ZGVmYXVsdDppZih2b2lkIDA9PT10W25dKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG9iamVjdE5hbWUgb2Ygbm9kZSB1bmRlZmluZWQuIix0aGlzKTt0PXRbbl19aWYodm9pZCAwIT09byl7aWYodm9pZCAwPT09dFtvXSlyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byBiaW5kIHRvIG9iamVjdEluZGV4IG9mIG9iamVjdE5hbWUsIGJ1dCBpcyB1bmRlZmluZWQuIix0aGlzLHQpO3Q9dFtvXX19Y29uc3QgYT10W29dO2lmKHZvaWQgMD09PWEpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIHByb3BlcnR5IGZvciB0cmFjazogIitlLm5vZGVOYW1lKyIuIitvKyIgYnV0IGl0IHdhc24ndCBmb3VuZC4iLHQpO2xldCByPXRoaXMuVmVyc2lvbmluZy5Ob25lO3RoaXMudGFyZ2V0T2JqZWN0PXQsdm9pZCAwIT09dC5uZWVkc1VwZGF0ZT9yPXRoaXMuVmVyc2lvbmluZy5OZWVkc1VwZGF0ZTp2b2lkIDAhPT10Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUmJihyPXRoaXMuVmVyc2lvbmluZy5NYXRyaXhXb3JsZE5lZWRzVXBkYXRlKTtsZXQgcz10aGlzLkJpbmRpbmdUeXBlLkRpcmVjdDtpZih2b2lkIDAhPT1pKXtpZigibW9ycGhUYXJnZXRJbmZsdWVuY2VzIj09PW8pe2lmKCF0Lmdlb21ldHJ5KXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5LiIsdGhpcyk7aWYoIXQuZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSlyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgb24gVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIsdGhpcyk7aWYoIXQuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy4iLHRoaXMpO3ZvaWQgMCE9PXQubW9ycGhUYXJnZXREaWN0aW9uYXJ5W2ldJiYoaT10Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeVtpXSl9cz10aGlzLkJpbmRpbmdUeXBlLkFycmF5RWxlbWVudCx0aGlzLnJlc29sdmVkUHJvcGVydHk9YSx0aGlzLnByb3BlcnR5SW5kZXg9aX1lbHNlIHZvaWQgMCE9PWEuZnJvbUFycmF5JiZ2b2lkIDAhPT1hLnRvQXJyYXk/KHM9dGhpcy5CaW5kaW5nVHlwZS5IYXNGcm9tVG9BcnJheSx0aGlzLnJlc29sdmVkUHJvcGVydHk9YSk6QXJyYXkuaXNBcnJheShhKT8ocz10aGlzLkJpbmRpbmdUeXBlLkVudGlyZUFycmF5LHRoaXMucmVzb2x2ZWRQcm9wZXJ0eT1hKTp0aGlzLnByb3BlcnR5TmFtZT1vO3RoaXMuZ2V0VmFsdWU9dGhpcy5HZXR0ZXJCeUJpbmRpbmdUeXBlW3NdLHRoaXMuc2V0VmFsdWU9dGhpcy5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZ1tzXVtyXX11bmJpbmQoKXt0aGlzLm5vZGU9bnVsbCx0aGlzLmdldFZhbHVlPXRoaXMuX2dldFZhbHVlX3VuYm91bmQsdGhpcy5zZXRWYWx1ZT10aGlzLl9zZXRWYWx1ZV91bmJvdW5kfX1vdXQuQ29tcG9zaXRlPWNsYXNze2NvbnN0cnVjdG9yKHQsZSxuKXtjb25zdCBvPW58fG91dC5wYXJzZVRyYWNrTmFtZShlKTt0aGlzLl90YXJnZXRHcm91cD10LHRoaXMuX2JpbmRpbmdzPXQuc3Vic2NyaWJlXyhlLG8pfWdldFZhbHVlKHQsZSl7dGhpcy5iaW5kKCk7Y29uc3Qgbj10aGlzLl9iaW5kaW5nc1t0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c19dO3ZvaWQgMCE9PW4mJm4uZ2V0VmFsdWUodCxlKX1zZXRWYWx1ZSh0LGUpe2NvbnN0IG49dGhpcy5fYmluZGluZ3M7Zm9yKGxldCBvPXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxpPW4ubGVuZ3RoO28hPT1pOysrbyluW29dLnNldFZhbHVlKHQsZSl9YmluZCgpe2NvbnN0IHQ9dGhpcy5fYmluZGluZ3M7Zm9yKGxldCBlPXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxuPXQubGVuZ3RoO2UhPT1uOysrZSl0W2VdLmJpbmQoKX11bmJpbmQoKXtjb25zdCB0PXRoaXMuX2JpbmRpbmdzO2ZvcihsZXQgZT10aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sbj10Lmxlbmd0aDtlIT09bjsrK2UpdFtlXS51bmJpbmQoKX19LG91dC5wcm90b3R5cGUuQmluZGluZ1R5cGU9e0RpcmVjdDowLEVudGlyZUFycmF5OjEsQXJyYXlFbGVtZW50OjIsSGFzRnJvbVRvQXJyYXk6M30sb3V0LnByb3RvdHlwZS5WZXJzaW9uaW5nPXtOb25lOjAsTmVlZHNVcGRhdGU6MSxNYXRyaXhXb3JsZE5lZWRzVXBkYXRlOjJ9LG91dC5wcm90b3R5cGUuR2V0dGVyQnlCaW5kaW5nVHlwZT1bb3V0LnByb3RvdHlwZS5fZ2V0VmFsdWVfZGlyZWN0LG91dC5wcm90b3R5cGUuX2dldFZhbHVlX2FycmF5LG91dC5wcm90b3R5cGUuX2dldFZhbHVlX2FycmF5RWxlbWVudCxvdXQucHJvdG90eXBlLl9nZXRWYWx1ZV90b0FycmF5XSxvdXQucHJvdG90eXBlLlNldHRlckJ5QmluZGluZ1R5cGVBbmRWZXJzaW9uaW5nPVtbb3V0LnByb3RvdHlwZS5fc2V0VmFsdWVfZGlyZWN0LG91dC5wcm90b3R5cGUuX3NldFZhbHVlX2RpcmVjdF9zZXROZWVkc1VwZGF0ZSxvdXQucHJvdG90eXBlLl9zZXRWYWx1ZV9kaXJlY3Rfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZV0sW291dC5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5LG91dC5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5X3NldE5lZWRzVXBkYXRlLG91dC5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGVdLFtvdXQucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheUVsZW1lbnQsb3V0LnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE5lZWRzVXBkYXRlLG91dC5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5RWxlbWVudF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlXSxbb3V0LnByb3RvdHlwZS5fc2V0VmFsdWVfZnJvbUFycmF5LG91dC5wcm90b3R5cGUuX3NldFZhbHVlX2Zyb21BcnJheV9zZXROZWVkc1VwZGF0ZSxvdXQucHJvdG90eXBlLl9zZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZV1dO2NsYXNzIGl1dHtjb25zdHJ1Y3Rvcih0LGUsbj1udWxsLG89ZS5ibGVuZE1vZGUpe3RoaXMuX21peGVyPXQsdGhpcy5fY2xpcD1lLHRoaXMuX2xvY2FsUm9vdD1uLHRoaXMuYmxlbmRNb2RlPW87Y29uc3QgaT1lLnRyYWNrcyxhPWkubGVuZ3RoLHI9bmV3IEFycmF5KGEpLHM9e2VuZGluZ1N0YXJ0OkFpdCxlbmRpbmdFbmQ6QWl0fTtmb3IobGV0IHQ9MDt0IT09YTsrK3Qpe2NvbnN0IGU9aVt0XS5jcmVhdGVJbnRlcnBvbGFudChudWxsKTtyW3RdPWUsZS5zZXR0aW5ncz1zfXRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M9cyx0aGlzLl9pbnRlcnBvbGFudHM9cix0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzPW5ldyBBcnJheShhKSx0aGlzLl9jYWNoZUluZGV4PW51bGwsdGhpcy5fYnlDbGlwQ2FjaGVJbmRleD1udWxsLHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PW51bGwsdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9bnVsbCx0aGlzLmxvb3A9MjIwMSx0aGlzLl9sb29wQ291bnQ9LTEsdGhpcy5fc3RhcnRUaW1lPW51bGwsdGhpcy50aW1lPTAsdGhpcy50aW1lU2NhbGU9MSx0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU9MSx0aGlzLndlaWdodD0xLHRoaXMuX2VmZmVjdGl2ZVdlaWdodD0xLHRoaXMucmVwZXRpdGlvbnM9MS8wLHRoaXMucGF1c2VkPSExLHRoaXMuZW5hYmxlZD0hMCx0aGlzLmNsYW1wV2hlbkZpbmlzaGVkPSExLHRoaXMuemVyb1Nsb3BlQXRTdGFydD0hMCx0aGlzLnplcm9TbG9wZUF0RW5kPSEwfXBsYXkoKXtyZXR1cm4gdGhpcy5fbWl4ZXIuX2FjdGl2YXRlQWN0aW9uKHRoaXMpLHRoaXN9c3RvcCgpe3JldHVybiB0aGlzLl9taXhlci5fZGVhY3RpdmF0ZUFjdGlvbih0aGlzKSx0aGlzLnJlc2V0KCl9cmVzZXQoKXtyZXR1cm4gdGhpcy5wYXVzZWQ9ITEsdGhpcy5lbmFibGVkPSEwLHRoaXMudGltZT0wLHRoaXMuX2xvb3BDb3VudD0tMSx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLnN0b3BGYWRpbmcoKS5zdG9wV2FycGluZygpfWlzUnVubmluZygpe3JldHVybiB0aGlzLmVuYWJsZWQmJiF0aGlzLnBhdXNlZCYmMCE9PXRoaXMudGltZVNjYWxlJiZudWxsPT09dGhpcy5fc3RhcnRUaW1lJiZ0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24odGhpcyl9aXNTY2hlZHVsZWQoKXtyZXR1cm4gdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKHRoaXMpfXN0YXJ0QXQodCl7cmV0dXJuIHRoaXMuX3N0YXJ0VGltZT10LHRoaXN9c2V0TG9vcCh0LGUpe3JldHVybiB0aGlzLmxvb3A9dCx0aGlzLnJlcGV0aXRpb25zPWUsdGhpc31zZXRFZmZlY3RpdmVXZWlnaHQodCl7cmV0dXJuIHRoaXMud2VpZ2h0PXQsdGhpcy5fZWZmZWN0aXZlV2VpZ2h0PXRoaXMuZW5hYmxlZD90OjAsdGhpcy5zdG9wRmFkaW5nKCl9Z2V0RWZmZWN0aXZlV2VpZ2h0KCl7cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdlaWdodH1mYWRlSW4odCl7cmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKHQsMCwxKX1mYWRlT3V0KHQpe3JldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyh0LDEsMCl9Y3Jvc3NGYWRlRnJvbSh0LGUsbil7aWYodC5mYWRlT3V0KGUpLHRoaXMuZmFkZUluKGUpLG4pe2NvbnN0IG49dGhpcy5fY2xpcC5kdXJhdGlvbixvPXQuX2NsaXAuZHVyYXRpb24saT1uL287dC53YXJwKDEsby9uLGUpLHRoaXMud2FycChpLDEsZSl9cmV0dXJuIHRoaXN9Y3Jvc3NGYWRlVG8odCxlLG4pe3JldHVybiB0LmNyb3NzRmFkZUZyb20odGhpcyxlLG4pfXN0b3BGYWRpbmcoKXtjb25zdCB0PXRoaXMuX3dlaWdodEludGVycG9sYW50O3JldHVybiBudWxsIT09dCYmKHRoaXMuX3dlaWdodEludGVycG9sYW50PW51bGwsdGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KHQpKSx0aGlzfXNldEVmZmVjdGl2ZVRpbWVTY2FsZSh0KXtyZXR1cm4gdGhpcy50aW1lU2NhbGU9dCx0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU9dGhpcy5wYXVzZWQ/MDp0LHRoaXMuc3RvcFdhcnBpbmcoKX1nZXRFZmZlY3RpdmVUaW1lU2NhbGUoKXtyZXR1cm4gdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlfXNldER1cmF0aW9uKHQpe3JldHVybiB0aGlzLnRpbWVTY2FsZT10aGlzLl9jbGlwLmR1cmF0aW9uL3QsdGhpcy5zdG9wV2FycGluZygpfXN5bmNXaXRoKHQpe3JldHVybiB0aGlzLnRpbWU9dC50aW1lLHRoaXMudGltZVNjYWxlPXQudGltZVNjYWxlLHRoaXMuc3RvcFdhcnBpbmcoKX1oYWx0KHQpe3JldHVybiB0aGlzLndhcnAodGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlLDAsdCl9d2FycCh0LGUsbil7Y29uc3Qgbz10aGlzLl9taXhlcixpPW8udGltZSxhPXRoaXMudGltZVNjYWxlO2xldCByPXRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O251bGw9PT1yJiYocj1vLl9sZW5kQ29udHJvbEludGVycG9sYW50KCksdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ9cik7Y29uc3Qgcz1yLnBhcmFtZXRlclBvc2l0aW9ucyxsPXIuc2FtcGxlVmFsdWVzO3JldHVybiBzWzBdPWksc1sxXT1pK24sbFswXT10L2EsbFsxXT1lL2EsdGhpc31zdG9wV2FycGluZygpe2NvbnN0IHQ9dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7cmV0dXJuIG51bGwhPT10JiYodGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ9bnVsbCx0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQodCkpLHRoaXN9Z2V0TWl4ZXIoKXtyZXR1cm4gdGhpcy5fbWl4ZXJ9Z2V0Q2xpcCgpe3JldHVybiB0aGlzLl9jbGlwfWdldFJvb3QoKXtyZXR1cm4gdGhpcy5fbG9jYWxSb290fHx0aGlzLl9taXhlci5fcm9vdH1fdXBkYXRlKHQsZSxuLG8pe2lmKCF0aGlzLmVuYWJsZWQpcmV0dXJuIHZvaWQgdGhpcy5fdXBkYXRlV2VpZ2h0KHQpO2NvbnN0IGk9dGhpcy5fc3RhcnRUaW1lO2lmKG51bGwhPT1pKXtjb25zdCBvPSh0LWkpKm47aWYobzwwfHwwPT09bilyZXR1cm47dGhpcy5fc3RhcnRUaW1lPW51bGwsZT1uKm99ZSo9dGhpcy5fdXBkYXRlVGltZVNjYWxlKHQpO2NvbnN0IGE9dGhpcy5fdXBkYXRlVGltZShlKSxyPXRoaXMuX3VwZGF0ZVdlaWdodCh0KTtpZihyPjApe2NvbnN0IHQ9dGhpcy5faW50ZXJwb2xhbnRzLGU9dGhpcy5fcHJvcGVydHlCaW5kaW5ncztzd2l0Y2godGhpcy5ibGVuZE1vZGUpe2Nhc2UgMjUwMTpmb3IobGV0IG49MCxvPXQubGVuZ3RoO24hPT1vOysrbil0W25dLmV2YWx1YXRlKGEpLGVbbl0uYWNjdW11bGF0ZUFkZGl0aXZlKHIpO2JyZWFrO2Nhc2UgMjUwMDpkZWZhdWx0OmZvcihsZXQgbj0wLGk9dC5sZW5ndGg7biE9PWk7KytuKXRbbl0uZXZhbHVhdGUoYSksZVtuXS5hY2N1bXVsYXRlKG8scil9fX1fdXBkYXRlV2VpZ2h0KHQpe2xldCBlPTA7aWYodGhpcy5lbmFibGVkKXtlPXRoaXMud2VpZ2h0O2NvbnN0IG49dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7aWYobnVsbCE9PW4pe2NvbnN0IG89bi5ldmFsdWF0ZSh0KVswXTtlKj1vLHQ+bi5wYXJhbWV0ZXJQb3NpdGlvbnNbMV0mJih0aGlzLnN0b3BGYWRpbmcoKSwwPT09byYmKHRoaXMuZW5hYmxlZD0hMSkpfX1yZXR1cm4gdGhpcy5fZWZmZWN0aXZlV2VpZ2h0PWUsZX1fdXBkYXRlVGltZVNjYWxlKHQpe2xldCBlPTA7aWYoIXRoaXMucGF1c2VkKXtlPXRoaXMudGltZVNjYWxlO2NvbnN0IG49dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7bnVsbCE9PW4mJihlKj1uLmV2YWx1YXRlKHQpWzBdLHQ+bi5wYXJhbWV0ZXJQb3NpdGlvbnNbMV0mJih0aGlzLnN0b3BXYXJwaW5nKCksMD09PWU/dGhpcy5wYXVzZWQ9ITA6dGhpcy50aW1lU2NhbGU9ZSkpfXJldHVybiB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU9ZSxlfV91cGRhdGVUaW1lKHQpe2NvbnN0IGU9dGhpcy5fY2xpcC5kdXJhdGlvbixuPXRoaXMubG9vcDtsZXQgbz10aGlzLnRpbWUrdCxpPXRoaXMuX2xvb3BDb3VudDtjb25zdCBhPTIyMDI9PT1uO2lmKDA9PT10KXJldHVybi0xPT09aT9vOmEmJjE9PSgxJmkpP2UtbzpvO2lmKDIyMDA9PT1uKXstMT09PWkmJih0aGlzLl9sb29wQ291bnQ9MCx0aGlzLl9zZXRFbmRpbmdzKCEwLCEwLCExKSk7dDp7aWYobz49ZSlvPWU7ZWxzZXtpZighKG88MCkpe3RoaXMudGltZT1vO2JyZWFrIHR9bz0wfXRoaXMuY2xhbXBXaGVuRmluaXNoZWQ/dGhpcy5wYXVzZWQ9ITA6dGhpcy5lbmFibGVkPSExLHRoaXMudGltZT1vLHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImZpbmlzaGVkIixhY3Rpb246dGhpcyxkaXJlY3Rpb246dDwwPy0xOjF9KX19ZWxzZXtpZigtMT09PWkmJih0Pj0wPyhpPTAsdGhpcy5fc2V0RW5kaW5ncyghMCwwPT09dGhpcy5yZXBldGl0aW9ucyxhKSk6dGhpcy5fc2V0RW5kaW5ncygwPT09dGhpcy5yZXBldGl0aW9ucywhMCxhKSksbz49ZXx8bzwwKXtjb25zdCBuPU1hdGguZmxvb3Ioby9lKTtvLT1lKm4saSs9TWF0aC5hYnMobik7Y29uc3Qgcj10aGlzLnJlcGV0aXRpb25zLWk7aWYocjw9MCl0aGlzLmNsYW1wV2hlbkZpbmlzaGVkP3RoaXMucGF1c2VkPSEwOnRoaXMuZW5hYmxlZD0hMSxvPXQ+MD9lOjAsdGhpcy50aW1lPW8sdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7dHlwZToiZmluaXNoZWQiLGFjdGlvbjp0aGlzLGRpcmVjdGlvbjp0PjA/MTotMX0pO2Vsc2V7aWYoMT09PXIpe2NvbnN0IGU9dDwwO3RoaXMuX3NldEVuZGluZ3MoZSwhZSxhKX1lbHNlIHRoaXMuX3NldEVuZGluZ3MoITEsITEsYSk7dGhpcy5fbG9vcENvdW50PWksdGhpcy50aW1lPW8sdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7dHlwZToibG9vcCIsYWN0aW9uOnRoaXMsbG9vcERlbHRhOm59KX19ZWxzZSB0aGlzLnRpbWU9bztpZihhJiYxPT0oMSZpKSlyZXR1cm4gZS1vfXJldHVybiBvfV9zZXRFbmRpbmdzKHQsZSxuKXtjb25zdCBvPXRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M7bj8oby5lbmRpbmdTdGFydD1UaXQsby5lbmRpbmdFbmQ9VGl0KTooby5lbmRpbmdTdGFydD10P3RoaXMuemVyb1Nsb3BlQXRTdGFydD9UaXQ6QWl0Ok5pdCxvLmVuZGluZ0VuZD1lP3RoaXMuemVyb1Nsb3BlQXRFbmQ/VGl0OkFpdDpOaXQpfV9zY2hlZHVsZUZhZGluZyh0LGUsbil7Y29uc3Qgbz10aGlzLl9taXhlcixpPW8udGltZTtsZXQgYT10aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtudWxsPT09YSYmKGE9by5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpLHRoaXMuX3dlaWdodEludGVycG9sYW50PWEpO2NvbnN0IHI9YS5wYXJhbWV0ZXJQb3NpdGlvbnMscz1hLnNhbXBsZVZhbHVlcztyZXR1cm4gclswXT1pLHNbMF09ZSxyWzFdPWkrdCxzWzFdPW4sdGhpc319KGNsYXNzIGV4dGVuZHMgVWl0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5fcm9vdD10LHRoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCksdGhpcy5fYWNjdUluZGV4PTAsdGhpcy50aW1lPTAsdGhpcy50aW1lU2NhbGU9MX1fYmluZEFjdGlvbih0LGUpe2NvbnN0IG49dC5fbG9jYWxSb290fHx0aGlzLl9yb290LG89dC5fY2xpcC50cmFja3MsaT1vLmxlbmd0aCxhPXQuX3Byb3BlcnR5QmluZGluZ3Mscj10Ll9pbnRlcnBvbGFudHMscz1uLnV1aWQsbD10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWU7bGV0IGM9bFtzXTt2b2lkIDA9PT1jJiYoYz17fSxsW3NdPWMpO2ZvcihsZXQgdD0wO3QhPT1pOysrdCl7Y29uc3QgaT1vW3RdLGw9aS5uYW1lO2xldCBkPWNbbF07aWYodm9pZCAwIT09ZClhW3RdPWQ7ZWxzZXtpZihkPWFbdF0sdm9pZCAwIT09ZCl7bnVsbD09PWQuX2NhY2hlSW5kZXgmJigrK2QucmVmZXJlbmNlQ291bnQsdGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKGQscyxsKSk7Y29udGludWV9ZD1uZXcgcW10KG91dC5jcmVhdGUobixsLGUmJmUuX3Byb3BlcnR5QmluZGluZ3NbdF0uYmluZGluZy5wYXJzZWRQYXRoKSxpLlZhbHVlVHlwZU5hbWUsaS5nZXRWYWx1ZVNpemUoKSksKytkLnJlZmVyZW5jZUNvdW50LHRoaXMuX2FkZEluYWN0aXZlQmluZGluZyhkLHMsbCksYVt0XT1kfXJbdF0ucmVzdWx0QnVmZmVyPWQuYnVmZmVyfX1fYWN0aXZhdGVBY3Rpb24odCl7aWYoIXRoaXMuX2lzQWN0aXZlQWN0aW9uKHQpKXtpZihudWxsPT09dC5fY2FjaGVJbmRleCl7Y29uc3QgZT0odC5fbG9jYWxSb290fHx0aGlzLl9yb290KS51dWlkLG49dC5fY2xpcC51dWlkLG89dGhpcy5fYWN0aW9uc0J5Q2xpcFtuXTt0aGlzLl9iaW5kQWN0aW9uKHQsbyYmby5rbm93bkFjdGlvbnNbMF0pLHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKHQsbixlKX1jb25zdCBlPXQuX3Byb3BlcnR5QmluZGluZ3M7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aDt0IT09bjsrK3Qpe2NvbnN0IG49ZVt0XTswPT1uLnVzZUNvdW50KysmJih0aGlzLl9sZW5kQmluZGluZyhuKSxuLnNhdmVPcmlnaW5hbFN0YXRlKCkpfXRoaXMuX2xlbmRBY3Rpb24odCl9fV9kZWFjdGl2YXRlQWN0aW9uKHQpe2lmKHRoaXMuX2lzQWN0aXZlQWN0aW9uKHQpKXtjb25zdCBlPXQuX3Byb3BlcnR5QmluZGluZ3M7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aDt0IT09bjsrK3Qpe2NvbnN0IG49ZVt0XTswPT0tLW4udXNlQ291bnQmJihuLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCksdGhpcy5fdGFrZUJhY2tCaW5kaW5nKG4pKX10aGlzLl90YWtlQmFja0FjdGlvbih0KX19X2luaXRNZW1vcnlNYW5hZ2VyKCl7dGhpcy5fYWN0aW9ucz1bXSx0aGlzLl9uQWN0aXZlQWN0aW9ucz0wLHRoaXMuX2FjdGlvbnNCeUNsaXA9e30sdGhpcy5fYmluZGluZ3M9W10sdGhpcy5fbkFjdGl2ZUJpbmRpbmdzPTAsdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lPXt9LHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHM9W10sdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHM9MDtjb25zdCB0PXRoaXM7dGhpcy5zdGF0cz17YWN0aW9uczp7Z2V0IHRvdGFsKCl7cmV0dXJuIHQuX2FjdGlvbnMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gdC5fbkFjdGl2ZUFjdGlvbnN9fSxiaW5kaW5nczp7Z2V0IHRvdGFsKCl7cmV0dXJuIHQuX2JpbmRpbmdzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIHQuX25BY3RpdmVCaW5kaW5nc319LGNvbnRyb2xJbnRlcnBvbGFudHM6e2dldCB0b3RhbCgpe3JldHVybiB0Ll9jb250cm9sSW50ZXJwb2xhbnRzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIHQuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzfX19fV9pc0FjdGl2ZUFjdGlvbih0KXtjb25zdCBlPXQuX2NhY2hlSW5kZXg7cmV0dXJuIG51bGwhPT1lJiZlPHRoaXMuX25BY3RpdmVBY3Rpb25zfV9hZGRJbmFjdGl2ZUFjdGlvbih0LGUsbil7Y29uc3Qgbz10aGlzLl9hY3Rpb25zLGk9dGhpcy5fYWN0aW9uc0J5Q2xpcDtsZXQgYT1pW2VdO2lmKHZvaWQgMD09PWEpYT17a25vd25BY3Rpb25zOlt0XSxhY3Rpb25CeVJvb3Q6e319LHQuX2J5Q2xpcENhY2hlSW5kZXg9MCxpW2VdPWE7ZWxzZXtjb25zdCBlPWEua25vd25BY3Rpb25zO3QuX2J5Q2xpcENhY2hlSW5kZXg9ZS5sZW5ndGgsZS5wdXNoKHQpfXQuX2NhY2hlSW5kZXg9by5sZW5ndGgsby5wdXNoKHQpLGEuYWN0aW9uQnlSb290W25dPXR9X3JlbW92ZUluYWN0aXZlQWN0aW9uKHQpe2NvbnN0IGU9dGhpcy5fYWN0aW9ucyxuPWVbZS5sZW5ndGgtMV0sbz10Ll9jYWNoZUluZGV4O24uX2NhY2hlSW5kZXg9byxlW29dPW4sZS5wb3AoKSx0Ll9jYWNoZUluZGV4PW51bGw7Y29uc3QgaT10Ll9jbGlwLnV1aWQsYT10aGlzLl9hY3Rpb25zQnlDbGlwLHI9YVtpXSxzPXIua25vd25BY3Rpb25zLGw9c1tzLmxlbmd0aC0xXSxjPXQuX2J5Q2xpcENhY2hlSW5kZXg7bC5fYnlDbGlwQ2FjaGVJbmRleD1jLHNbY109bCxzLnBvcCgpLHQuX2J5Q2xpcENhY2hlSW5kZXg9bnVsbCxkZWxldGUgci5hY3Rpb25CeVJvb3RbKHQuX2xvY2FsUm9vdHx8dGhpcy5fcm9vdCkudXVpZF0sMD09PXMubGVuZ3RoJiZkZWxldGUgYVtpXSx0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKHQpfV9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKHQpe2NvbnN0IGU9dC5fcHJvcGVydHlCaW5kaW5ncztmb3IobGV0IHQ9MCxuPWUubGVuZ3RoO3QhPT1uOysrdCl7Y29uc3Qgbj1lW3RdOzA9PS0tbi5yZWZlcmVuY2VDb3VudCYmdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKG4pfX1fbGVuZEFjdGlvbih0KXtjb25zdCBlPXRoaXMuX2FjdGlvbnMsbj10Ll9jYWNoZUluZGV4LG89dGhpcy5fbkFjdGl2ZUFjdGlvbnMrKyxpPWVbb107dC5fY2FjaGVJbmRleD1vLGVbb109dCxpLl9jYWNoZUluZGV4PW4sZVtuXT1pfV90YWtlQmFja0FjdGlvbih0KXtjb25zdCBlPXRoaXMuX2FjdGlvbnMsbj10Ll9jYWNoZUluZGV4LG89LS10aGlzLl9uQWN0aXZlQWN0aW9ucyxpPWVbb107dC5fY2FjaGVJbmRleD1vLGVbb109dCxpLl9jYWNoZUluZGV4PW4sZVtuXT1pfV9hZGRJbmFjdGl2ZUJpbmRpbmcodCxlLG4pe2NvbnN0IG89dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLGk9dGhpcy5fYmluZGluZ3M7bGV0IGE9b1tlXTt2b2lkIDA9PT1hJiYoYT17fSxvW2VdPWEpLGFbbl09dCx0Ll9jYWNoZUluZGV4PWkubGVuZ3RoLGkucHVzaCh0KX1fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKHQpe2NvbnN0IGU9dGhpcy5fYmluZGluZ3Msbj10LmJpbmRpbmcsbz1uLnJvb3ROb2RlLnV1aWQsaT1uLnBhdGgsYT10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUscj1hW29dLHM9ZVtlLmxlbmd0aC0xXSxsPXQuX2NhY2hlSW5kZXg7cy5fY2FjaGVJbmRleD1sLGVbbF09cyxlLnBvcCgpLGRlbGV0ZSByW2ldLDA9PT1PYmplY3Qua2V5cyhyKS5sZW5ndGgmJmRlbGV0ZSBhW29dfV9sZW5kQmluZGluZyh0KXtjb25zdCBlPXRoaXMuX2JpbmRpbmdzLG49dC5fY2FjaGVJbmRleCxvPXRoaXMuX25BY3RpdmVCaW5kaW5ncysrLGk9ZVtvXTt0Ll9jYWNoZUluZGV4PW8sZVtvXT10LGkuX2NhY2hlSW5kZXg9bixlW25dPWl9X3Rha2VCYWNrQmluZGluZyh0KXtjb25zdCBlPXRoaXMuX2JpbmRpbmdzLG49dC5fY2FjaGVJbmRleCxvPS0tdGhpcy5fbkFjdGl2ZUJpbmRpbmdzLGk9ZVtvXTt0Ll9jYWNoZUluZGV4PW8sZVtvXT10LGkuX2NhY2hlSW5kZXg9bixlW25dPWl9X2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKXtjb25zdCB0PXRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsZT10aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cysrO2xldCBuPXRbZV07cmV0dXJuIHZvaWQgMD09PW4mJihuPW5ldyBjbXQobmV3IEZsb2F0MzJBcnJheSgyKSxuZXcgRmxvYXQzMkFycmF5KDIpLDEsdGhpcy5fY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlciksbi5fX2NhY2hlSW5kZXg9ZSx0W2VdPW4pLG59X3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KHQpe2NvbnN0IGU9dGhpcy5fY29udHJvbEludGVycG9sYW50cyxuPXQuX19jYWNoZUluZGV4LG89LS10aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyxpPWVbb107dC5fX2NhY2hlSW5kZXg9byxlW29dPXQsaS5fX2NhY2hlSW5kZXg9bixlW25dPWl9Y2xpcEFjdGlvbih0LGUsbil7Y29uc3Qgbz1lfHx0aGlzLl9yb290LGk9by51dWlkO2xldCBhPSJzdHJpbmciPT10eXBlb2YgdD9fbXQuZmluZEJ5TmFtZShvLHQpOnQ7Y29uc3Qgcj1udWxsIT09YT9hLnV1aWQ6dCxzPXRoaXMuX2FjdGlvbnNCeUNsaXBbcl07bGV0IGw9bnVsbDtpZih2b2lkIDA9PT1uJiYobj1udWxsIT09YT9hLmJsZW5kTW9kZToyNTAwKSx2b2lkIDAhPT1zKXtjb25zdCB0PXMuYWN0aW9uQnlSb290W2ldO2lmKHZvaWQgMCE9PXQmJnQuYmxlbmRNb2RlPT09bilyZXR1cm4gdDtsPXMua25vd25BY3Rpb25zWzBdLG51bGw9PT1hJiYoYT1sLl9jbGlwKX1pZihudWxsPT09YSlyZXR1cm4gbnVsbDtjb25zdCBjPW5ldyBpdXQodGhpcyxhLGUsbik7cmV0dXJuIHRoaXMuX2JpbmRBY3Rpb24oYyxsKSx0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbihjLHIsaSksY31leGlzdGluZ0FjdGlvbih0LGUpe2NvbnN0IG49ZXx8dGhpcy5fcm9vdCxvPW4udXVpZCxpPSJzdHJpbmciPT10eXBlb2YgdD9fbXQuZmluZEJ5TmFtZShuLHQpOnQsYT10aGlzLl9hY3Rpb25zQnlDbGlwW2k/aS51dWlkOnRdO3JldHVybiB2b2lkIDAhPT1hJiZhLmFjdGlvbkJ5Um9vdFtvXXx8bnVsbH1zdG9wQWxsQWN0aW9uKCl7Y29uc3QgdD10aGlzLl9hY3Rpb25zO2ZvcihsZXQgZT10aGlzLl9uQWN0aXZlQWN0aW9ucy0xO2U+PTA7LS1lKXRbZV0uc3RvcCgpO3JldHVybiB0aGlzfXVwZGF0ZSh0KXtjb25zdCBlPXRoaXMuX2FjdGlvbnMsbj10aGlzLl9uQWN0aXZlQWN0aW9ucyxvPXRoaXMudGltZSs9dCo9dGhpcy50aW1lU2NhbGUsaT1NYXRoLnNpZ24odCksYT10aGlzLl9hY2N1SW5kZXhePTE7Zm9yKGxldCByPTA7ciE9PW47KytyKWVbcl0uX3VwZGF0ZShvLHQsaSxhKTtjb25zdCByPXRoaXMuX2JpbmRpbmdzLHM9dGhpcy5fbkFjdGl2ZUJpbmRpbmdzO2ZvcihsZXQgdD0wO3QhPT1zOysrdClyW3RdLmFwcGx5KGEpO3JldHVybiB0aGlzfXNldFRpbWUodCl7dGhpcy50aW1lPTA7Zm9yKGxldCB0PTA7dDx0aGlzLl9hY3Rpb25zLmxlbmd0aDt0KyspdGhpcy5fYWN0aW9uc1t0XS50aW1lPTA7cmV0dXJuIHRoaXMudXBkYXRlKHQpfWdldFJvb3QoKXtyZXR1cm4gdGhpcy5fcm9vdH11bmNhY2hlQ2xpcCh0KXtjb25zdCBlPXRoaXMuX2FjdGlvbnMsbj10LnV1aWQsbz10aGlzLl9hY3Rpb25zQnlDbGlwLGk9b1tuXTtpZih2b2lkIDAhPT1pKXtjb25zdCB0PWkua25vd25BY3Rpb25zO2ZvcihsZXQgbj0wLG89dC5sZW5ndGg7biE9PW87KytuKXtjb25zdCBvPXRbbl07dGhpcy5fZGVhY3RpdmF0ZUFjdGlvbihvKTtjb25zdCBpPW8uX2NhY2hlSW5kZXgsYT1lW2UubGVuZ3RoLTFdO28uX2NhY2hlSW5kZXg9bnVsbCxvLl9ieUNsaXBDYWNoZUluZGV4PW51bGwsYS5fY2FjaGVJbmRleD1pLGVbaV09YSxlLnBvcCgpLHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24obyl9ZGVsZXRlIG9bbl19fXVuY2FjaGVSb290KHQpe2NvbnN0IGU9dC51dWlkLG49dGhpcy5fYWN0aW9uc0J5Q2xpcDtmb3IoY29uc3QgdCBpbiBuKXtjb25zdCBvPW5bdF0uYWN0aW9uQnlSb290W2VdO3ZvaWQgMCE9PW8mJih0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKG8pLHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKG8pKX1jb25zdCBvPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZVtlXTtpZih2b2lkIDAhPT1vKWZvcihjb25zdCB0IGluIG8pe2NvbnN0IGU9b1t0XTtlLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCksdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKGUpfX11bmNhY2hlQWN0aW9uKHQsZSl7Y29uc3Qgbj10aGlzLmV4aXN0aW5nQWN0aW9uKHQsZSk7bnVsbCE9PW4mJih0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKG4pLHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKG4pKX19KS5wcm90b3R5cGUuX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXI9bmV3IEZsb2F0MzJBcnJheSgxKSxjbGFzcyBleHRlbmRzIF9kdHtjb25zdHJ1Y3Rvcih0LGUsbj0xKXtzdXBlcih0LGUpLHRoaXMubWVzaFBlckF0dHJpYnV0ZT1ufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5tZXNoUGVyQXR0cmlidXRlPXQubWVzaFBlckF0dHJpYnV0ZSx0aGlzfWNsb25lKHQpe2NvbnN0IGU9c3VwZXIuY2xvbmUodCk7cmV0dXJuIGUubWVzaFBlckF0dHJpYnV0ZT10aGlzLm1lc2hQZXJBdHRyaWJ1dGUsZX10b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcj0hMCxlLm1lc2hQZXJBdHRyaWJ1dGU9dGhpcy5tZXNoUGVyQXR0cmlidXRlLGV9fS5wcm90b3R5cGUuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcj0hMCxjbGFzcyBleHRlbmRzIHBydHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMubWF0ZXJpYWw9dCx0aGlzLnJlbmRlcj1mdW5jdGlvbigpe30sdGhpcy5oYXNQb3NpdGlvbnM9ITEsdGhpcy5oYXNOb3JtYWxzPSExLHRoaXMuaGFzQ29sb3JzPSExLHRoaXMuaGFzVXZzPSExLHRoaXMucG9zaXRpb25BcnJheT1udWxsLHRoaXMubm9ybWFsQXJyYXk9bnVsbCx0aGlzLmNvbG9yQXJyYXk9bnVsbCx0aGlzLnV2QXJyYXk9bnVsbCx0aGlzLmNvdW50PTB9fS5wcm90b3R5cGUuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3Q9ITA7Y29uc3QgYXV0PW5ldyBjYXQscnV0PW5ldyBCYXQsc3V0PW5ldyBCYXQ7ZnVuY3Rpb24gbHV0KHQpe2NvbnN0IGU9W107dCYmdC5pc0JvbmUmJmUucHVzaCh0KTtmb3IobGV0IG49MDtuPHQuY2hpbGRyZW4ubGVuZ3RoO24rKyllLnB1c2guYXBwbHkoZSxsdXQodC5jaGlsZHJlbltuXSkpO3JldHVybiBlfWNvbnN0IGN1dD1uZXcgRmxvYXQzMkFycmF5KDEpO2Z1bmN0aW9uIGR1dCh0LGUsbil7aWYoMT09PW4pcmV0dXJuIG5ldyBScnQoZSk7Y29uc3Qgbz1kNyhlKTtpZighbyl0aHJvdyBuZXcgRXJyb3IoYGQzIGZhaWxlZCB0byByZWNvZ25pemUgdGhlIGNvbG9yOiAke2V9YCk7cmV0dXJuIG5ldyBScnQoZDgobyx0KSgxLW4pKX12YXIgcHV0LG11dCx1dXQsZnV0O2Z1bmN0aW9uIGd1dCh0LGUpe2NvbnN0IG49ZS5sZW5ndGgvMjtsZXQgbz10LmF0dHJpYnV0ZXMucG9zaXRpb247byYmby5jb3VudD09PTMqbnx8KG89bmV3IHpydChuZXcgRmxvYXQzMkFycmF5KDMqbiksMyksdC5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixvKSk7Y29uc3QgaT1vLmFycmF5O2ZvcihsZXQgdD0wO3Q8bjt0KyspaVszKnRdPWVbMip0XSxpWzMqdCsxXT1lWzIqdCsxXTtvLm5lZWRzVXBkYXRlPSEwLHQuc2V0RHJhd1JhbmdlKDAsMypuKSx0LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpfWZ1bmN0aW9uIGh1dCh0LGUsbil7Y29uc3Qgbz1NYXRoLm1heChlLmxlbmd0aC8yLTEsMCksaT0yKm8qMyxhPTMqaTtsZXQgcj10LmF0dHJpYnV0ZXMucG9zaXRpb247ciYmci5jb3VudD09PWl8fChyPW5ldyB6cnQobmV3IEZsb2F0MzJBcnJheShhKSwzKSx0LnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLHIpKTtjb25zdCBzPXIuYXJyYXk7Zm9yKGxldCB0PTA7dDxvO3QrKyl7Y29uc3RbbyxpLGEscl09W2VbMip0XSxlWzIqdCsxXSxlWzIqdCsyXSxlWzIqdCszXV0sbD1uZXcgUWl0KG8saSksYz1uZXcgUWl0KGEsciksZD1uZXcgUWl0KGEtbyxyLWkpLHA9bmV3IFFpdCgtZC55LGQueCkuc2V0TGVuZ3RoKG4vMiksbT1sLmNsb25lKCkuYWRkKHApLHU9bC5jbG9uZSgpLnN1YihwKSxmPWMuY2xvbmUoKS5hZGQocCksZz1jLmNsb25lKCkuc3ViKHApLGg9W20ueCxtLnksMCx1LngsdS55LDAsZi54LGYueSwwLGYueCxmLnksMCx1LngsdS55LDAsZy54LGcueSwwXTtzLnNldChoLHQqaC5sZW5ndGgpfXIubmVlZHNVcGRhdGU9ITAsdC5zZXREcmF3UmFuZ2UoMCxhKSx0LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpfWZ1bmN0aW9uIGJ1dCh0LGUsbixvKXtjb25zdHt2aXNpYmxlOmksY29sb3I6YSxvcGFjaXR5OnJ9PW87aWYoQXJyYXkuaXNBcnJheShlLm1hdGVyaWFsKSl0aHJvdyBuZXcgRXJyb3IoIkludmFyaWFudCBlcnJvcjogb25seSBleHBlY3Qgb25lIG1hdGVyaWFsIG9uIGFuIG9iamVjdCIpO2NvbnN0IHM9ZS5tYXRlcmlhbDtpZihzLnZpc2libGUhPT1pJiYocy52aXNpYmxlPWkscy5uZWVkc1VwZGF0ZT0hMCksIWkpcmV0dXJuITE7Y29uc3QgbD1kdXQodCxhLG51bGwhPXI/cjoxKSxjPW4oZS5nZW9tZXRyeSk7cmV0dXJuIGUuZ2VvbWV0cnkhPT1jJiYoZS5nZW9tZXRyeT1jKSxzLmNvbG9yLmVxdWFscyhsKXx8KHMuY29sb3Iuc2V0KGwpLHMubmVlZHNVcGRhdGU9ITApLCEwfW5ldyBJbnQzMkFycmF5KGN1dC5idWZmZXIpLGRwdC5jcmVhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gY29uc29sZS5sb2coIlRIUkVFLkN1cnZlLmNyZWF0ZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQiKSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGRwdC5wcm90b3R5cGUpLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXQsdC5wcm90b3R5cGUuZ2V0UG9pbnQ9ZSx0fSxFbXQucHJvdG90eXBlLmZyb21Qb2ludHM9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUGF0aDogLmZyb21Qb2ludHMoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tUG9pbnRzKCkuIiksdGhpcy5zZXRGcm9tUG9pbnRzKHQpfSxjbGFzcyBleHRlbmRzIG5wdHtjb25zdHJ1Y3Rvcih0PTEwLGU9MTAsbj00NDczOTI0LG89ODk0Nzg0OCl7bj1uZXcgUnJ0KG4pLG89bmV3IFJydChvKTtjb25zdCBpPWUvMixhPXQvZSxyPXQvMixzPVtdLGw9W107Zm9yKGxldCB0PTAsYz0wLGQ9LXI7dDw9ZTt0KyssZCs9YSl7cy5wdXNoKC1yLDAsZCxyLDAsZCkscy5wdXNoKGQsMCwtcixkLDAscik7Y29uc3QgZT10PT09aT9uOm87ZS50b0FycmF5KGwsYyksYys9MyxlLnRvQXJyYXkobCxjKSxjKz0zLGUudG9BcnJheShsLGMpLGMrPTMsZS50b0FycmF5KGwsYyksYys9M31jb25zdCBjPW5ldyBxcnQ7Yy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgRnJ0KHMsMykpLGMuc2V0QXR0cmlidXRlKCJjb2xvciIsbmV3IEZydChsLDMpKSxzdXBlcihjLG5ldyBxZHQoe3ZlcnRleENvbG9yczohMCx0b25lTWFwcGVkOiExfSkpLHRoaXMudHlwZT0iR3JpZEhlbHBlciJ9fS5wcm90b3R5cGUuc2V0Q29sb3JzPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuR3JpZEhlbHBlcjogc2V0Q29sb3JzKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCwgcGFzcyB0aGVtIGluIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkLiIpfSxjbGFzcyBleHRlbmRzIG5wdHtjb25zdHJ1Y3Rvcih0KXtjb25zdCBlPWx1dCh0KSxuPW5ldyBxcnQsbz1bXSxpPVtdLGE9bmV3IFJydCgwLDAsMSkscj1uZXcgUnJ0KDAsMSwwKTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7Y29uc3Qgbj1lW3RdO24ucGFyZW50JiZuLnBhcmVudC5pc0JvbmUmJihvLnB1c2goMCwwLDApLG8ucHVzaCgwLDAsMCksaS5wdXNoKGEucixhLmcsYS5iKSxpLnB1c2goci5yLHIuZyxyLmIpKX1uLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBGcnQobywzKSksbi5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgRnJ0KGksMykpLHN1cGVyKG4sbmV3IHFkdCh7dmVydGV4Q29sb3JzOiEwLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExLHRvbmVNYXBwZWQ6ITEsdHJhbnNwYXJlbnQ6ITB9KSksdGhpcy50eXBlPSJTa2VsZXRvbkhlbHBlciIsdGhpcy5pc1NrZWxldG9uSGVscGVyPSEwLHRoaXMucm9vdD10LHRoaXMuYm9uZXM9ZSx0aGlzLm1hdHJpeD10Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMX11cGRhdGVNYXRyaXhXb3JsZCh0KXtjb25zdCBlPXRoaXMuYm9uZXMsbj10aGlzLmdlb21ldHJ5LG89bi5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7c3V0LmNvcHkodGhpcy5yb290Lm1hdHJpeFdvcmxkKS5pbnZlcnQoKTtmb3IobGV0IHQ9MCxuPTA7dDxlLmxlbmd0aDt0Kyspe2NvbnN0IGk9ZVt0XTtpLnBhcmVudCYmaS5wYXJlbnQuaXNCb25lJiYocnV0Lm11bHRpcGx5TWF0cmljZXMoc3V0LGkubWF0cml4V29ybGQpLGF1dC5zZXRGcm9tTWF0cml4UG9zaXRpb24ocnV0KSxvLnNldFhZWihuLGF1dC54LGF1dC55LGF1dC56KSxydXQubXVsdGlwbHlNYXRyaWNlcyhzdXQsaS5wYXJlbnQubWF0cml4V29ybGQpLGF1dC5zZXRGcm9tTWF0cml4UG9zaXRpb24ocnV0KSxvLnNldFhZWihuKzEsYXV0LngsYXV0LnksYXV0LnopLG4rPTIpfW4uZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLm5lZWRzVXBkYXRlPSEwLHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKHQpfX0ucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNrZWxldG9uSGVscGVyOiB1cGRhdGUoKSBubyBsb25nZXIgbmVlZHMgdG8gYmUgY2FsbGVkLiIpfSx4bXQucHJvdG90eXBlLmV4dHJhY3RVcmxCYXNlPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkxvYWRlcjogLmV4dHJhY3RVcmxCYXNlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkxvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKCkgaW5zdGVhZC4iKSxjbGFzc3tzdGF0aWMgZGVjb2RlVGV4dCh0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIFRleHREZWNvZGVyKXJldHVybihuZXcgVGV4dERlY29kZXIpLmRlY29kZSh0KTtsZXQgZT0iIjtmb3IobGV0IG49MCxvPXQubGVuZ3RoO248bztuKyspZSs9U3RyaW5nLmZyb21DaGFyQ29kZSh0W25dKTt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoZSkpfWNhdGNoKHQpe3JldHVybiBlfX1zdGF0aWMgZXh0cmFjdFVybEJhc2UodCl7Y29uc3QgZT10Lmxhc3RJbmRleE9mKCIvIik7cmV0dXJuLTE9PT1lPyIuLyI6dC5zdWJzdHIoMCxlKzEpfX0uZXh0cmFjdFVybEJhc2UodCl9LHhtdC5IYW5kbGVycz17YWRkOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTG9hZGVyOiBIYW5kbGVycy5hZGQoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgTG9hZGluZ01hbmFnZXIuYWRkSGFuZGxlcigpIGluc3RlYWQuIil9LGdldDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkxvYWRlcjogSGFuZGxlcnMuZ2V0KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIExvYWRpbmdNYW5hZ2VyLmdldEhhbmRsZXIoKSBpbnN0ZWFkLiIpfX0sbWF0LnByb3RvdHlwZS5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLiIpLHRoaXMuZ2V0Q2VudGVyKHQpfSxtYXQucHJvdG90eXBlLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLiIpLHRoaXMuaXNFbXB0eSgpfSxtYXQucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uQm94PWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4iKSx0aGlzLmludGVyc2VjdHNCb3godCl9LG1hdC5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb25TcGhlcmU9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1NwaGVyZSgpLiIpLHRoaXMuaW50ZXJzZWN0c1NwaGVyZSh0KX0sbWF0LnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0U2l6ZSgpLiIpLHRoaXMuZ2V0U2l6ZSh0KX0sUmF0LnByb3RvdHlwZS5lbXB0eT1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlNwaGVyZTogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLiIpLHRoaXMuaXNFbXB0eSgpfSxFc3QucHJvdG90eXBlLnNldEZyb21NYXRyaXg9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuRnJ1c3R1bTogLnNldEZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeCgpLiIpLHRoaXMuc2V0RnJvbVByb2plY3Rpb25NYXRyaXgodCl9LCRpdC5wcm90b3R5cGUuZmxhdHRlblRvQXJyYXlPZmZzZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXgzOiAuZmxhdHRlblRvQXJyYXlPZmZzZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnRvQXJyYXkoKSBpbnN0ZWFkLiIpLHRoaXMudG9BcnJheSh0LGUpfSwkaXQucHJvdG90eXBlLm11bHRpcGx5VmVjdG9yMz1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDMoIG1hdHJpeCApIGluc3RlYWQuIiksdC5hcHBseU1hdHJpeDModGhpcyl9LCRpdC5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzQXJyYXk9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSwkaXQucHJvdG90eXBlLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGU9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4MzogLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYXR0cmlidXRlLmFwcGx5TWF0cml4MyggbWF0cml4ICkgaW5zdGVhZC4iKSx0LmFwcGx5TWF0cml4Myh0aGlzKX0sJGl0LnByb3RvdHlwZS5hcHBseVRvVmVjdG9yM0FycmF5PWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4MzogLmFwcGx5VG9WZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSwkaXQucHJvdG90eXBlLmdldEludmVyc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4MzogLmdldEludmVyc2UoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbWF0cml4SW52LmNvcHkoIG1hdHJpeCApLmludmVydCgpOyBpbnN0ZWFkLiIpLHRoaXMuY29weSh0KS5pbnZlcnQoKX0sQmF0LnByb3RvdHlwZS5leHRyYWN0UG9zaXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmV4dHJhY3RQb3NpdGlvbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmNvcHlQb3NpdGlvbigpLiIpLHRoaXMuY29weVBvc2l0aW9uKHQpfSxCYXQucHJvdG90eXBlLmZsYXR0ZW5Ub0FycmF5T2Zmc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmZsYXR0ZW5Ub0FycmF5T2Zmc2V0KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC50b0FycmF5KCkgaW5zdGVhZC4iKSx0aGlzLnRvQXJyYXkodCxlKX0sQmF0LnByb3RvdHlwZS5nZXRQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5nZXRQb3NpdGlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBWZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbWF0cml4ICkgaW5zdGVhZC4iKSwobmV3IGNhdCkuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDMpfSxCYXQucHJvdG90eXBlLnNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb249ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLnNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbigpLiIpLHRoaXMubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCl9LEJhdC5wcm90b3R5cGUubXVsdGlwbHlUb0FycmF5PWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlUb0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sQmF0LnByb3RvdHlwZS5tdWx0aXBseVZlY3RvcjM9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLiIpLHQuYXBwbHlNYXRyaXg0KHRoaXMpfSxCYXQucHJvdG90eXBlLm11bHRpcGx5VmVjdG9yND1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3I0KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuIiksdC5hcHBseU1hdHJpeDQodGhpcyl9LEJhdC5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzQXJyYXk9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxCYXQucHJvdG90eXBlLnJvdGF0ZUF4aXM9ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlQXhpcygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBWZWN0b3IzLnRyYW5zZm9ybURpcmVjdGlvbiggbWF0cml4ICkgaW5zdGVhZC4iKSx0LnRyYW5zZm9ybURpcmVjdGlvbih0aGlzKX0sQmF0LnByb3RvdHlwZS5jcm9zc1ZlY3Rvcj1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuY3Jvc3NWZWN0b3IoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4NCggbWF0cml4ICkgaW5zdGVhZC4iKSx0LmFwcGx5TWF0cml4NCh0aGlzKX0sQmF0LnByb3RvdHlwZS50cmFuc2xhdGU9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAudHJhbnNsYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sQmF0LnByb3RvdHlwZS5yb3RhdGVYPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLnJvdGF0ZVgoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxCYXQucHJvdG90eXBlLnJvdGF0ZVk9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlWSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LEJhdC5wcm90b3R5cGUucm90YXRlWj1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVaKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sQmF0LnByb3RvdHlwZS5yb3RhdGVCeUF4aXM9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlQnlBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sQmF0LnByb3RvdHlwZS5hcHBseVRvQnVmZmVyQXR0cmlidXRlPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGF0dHJpYnV0ZS5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuIiksdC5hcHBseU1hdHJpeDQodGhpcyl9LEJhdC5wcm90b3R5cGUuYXBwbHlUb1ZlY3RvcjNBcnJheT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sQmF0LnByb3RvdHlwZS5tYWtlRnJ1c3R1bT1mdW5jdGlvbih0LGUsbixvLGksYSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm1ha2VGcnVzdHVtKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5tYWtlUGVyc3BlY3RpdmUoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkgaW5zdGVhZC4iKSx0aGlzLm1ha2VQZXJzcGVjdGl2ZSh0LGUsbyxuLGksYSl9LEJhdC5wcm90b3R5cGUuZ2V0SW52ZXJzZT1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuZ2V0SW52ZXJzZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBtYXRyaXhJbnYuY29weSggbWF0cml4ICkuaW52ZXJ0KCk7IGluc3RlYWQuIiksdGhpcy5jb3B5KHQpLmludmVydCgpfSxrc3QucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uTGluZT1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5QbGFuZTogLmlzSW50ZXJzZWN0aW9uTGluZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNMaW5lKCkuIiksdGhpcy5pbnRlcnNlY3RzTGluZSh0KX0sbGF0LnByb3RvdHlwZS5tdWx0aXBseVZlY3RvcjM9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBpcyBub3cgdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApIGluc3RlYWQuIiksdC5hcHBseVF1YXRlcm5pb24odGhpcyl9LGxhdC5wcm90b3R5cGUuaW52ZXJzZT1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlF1YXRlcm5pb246IC5pbnZlcnNlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byBpbnZlcnQoKS4iKSx0aGlzLmludmVydCgpfSxMYXQucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uQm94PWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLiIpLHRoaXMuaW50ZXJzZWN0c0JveCh0KX0sTGF0LnByb3RvdHlwZS5pc0ludGVyc2VjdGlvblBsYW5lPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uUGxhbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzUGxhbmUoKS4iKSx0aGlzLmludGVyc2VjdHNQbGFuZSh0KX0sTGF0LnByb3RvdHlwZS5pc0ludGVyc2VjdGlvblNwaGVyZT1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4iKSx0aGlzLmludGVyc2VjdHNTcGhlcmUodCl9LHZydC5wcm90b3R5cGUuYXJlYT1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAuYXJlYSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEFyZWEoKS4iKSx0aGlzLmdldEFyZWEoKX0sdnJ0LnByb3RvdHlwZS5iYXJ5Y29vcmRGcm9tUG9pbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmJhcnljb29yZEZyb21Qb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEJhcnljb29yZCgpLiIpLHRoaXMuZ2V0QmFyeWNvb3JkKHQsZSl9LHZydC5wcm90b3R5cGUubWlkcG9pbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5taWRwb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE1pZHBvaW50KCkuIiksdGhpcy5nZXRNaWRwb2ludCh0KX0sdnJ0LnByb3RvdHlwZW5vcm1hbD1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLm5vcm1hbCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE5vcm1hbCgpLiIpLHRoaXMuZ2V0Tm9ybWFsKHQpfSx2cnQucHJvdG90eXBlLnBsYW5lPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAucGxhbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRQbGFuZSgpLiIpLHRoaXMuZ2V0UGxhbmUodCl9LHZydC5iYXJ5Y29vcmRGcm9tUG9pbnQ9ZnVuY3Rpb24odCxlLG4sbyxpKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmJhcnljb29yZEZyb21Qb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEJhcnljb29yZCgpLiIpLHZydC5nZXRCYXJ5Y29vcmQodCxlLG4sbyxpKX0sdnJ0Lm5vcm1hbD1mdW5jdGlvbih0LGUsbixvKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLm5vcm1hbCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE5vcm1hbCgpLiIpLHZydC5nZXROb3JtYWwodCxlLG4sbyl9LFJtdC5wcm90b3R5cGUuZXh0cmFjdEFsbFBvaW50cz1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5TaGFwZTogLmV4dHJhY3RBbGxQb2ludHMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmV4dHJhY3RQb2ludHMoKSBpbnN0ZWFkLiIpLHRoaXMuZXh0cmFjdFBvaW50cyh0KX0sUm10LnByb3RvdHlwZS5leHRydWRlPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlNoYXBlOiAuZXh0cnVkZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFeHRydWRlR2VvbWV0cnkoKSBpbnN0ZWFkLiIpLG5ldyBubXQodGhpcyx0KX0sUm10LnByb3RvdHlwZS5tYWtlR2VvbWV0cnk9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuU2hhcGU6IC5tYWtlR2VvbWV0cnkoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgU2hhcGVHZW9tZXRyeSgpIGluc3RlYWQuIiksbmV3IGltdCh0aGlzLHQpfSxRaXQucHJvdG90eXBlLmZyb21BdHRyaWJ1dGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpLHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUsbil9LFFpdC5wcm90b3R5cGUuZGlzdGFuY2VUb01hbmhhdHRhbj1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiAuZGlzdGFuY2VUb01hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkRpc3RhbmNlVG8oKS4iKSx0aGlzLm1hbmhhdHRhbkRpc3RhbmNlVG8odCl9LFFpdC5wcm90b3R5cGUubGVuZ3RoTWFuaGF0dGFuPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLiIpLHRoaXMubWFuaGF0dGFuTGVuZ3RoKCl9LGNhdC5wcm90b3R5cGUuc2V0RXVsZXJGcm9tUm90YXRpb25NYXRyaXg9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5WZWN0b3IzOiAuc2V0RXVsZXJGcm9tUm90YXRpb25NYXRyaXgoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXVsZXIuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgaW5zdGVhZC4iKX0sY2F0LnByb3RvdHlwZS5zZXRFdWxlckZyb21RdWF0ZXJuaW9uPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuVmVjdG9yMzogLnNldEV1bGVyRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXVsZXIuc2V0RnJvbVF1YXRlcm5pb24oKSBpbnN0ZWFkLiIpfSxjYXQucHJvdG90eXBlLmdldFBvc2l0aW9uRnJvbU1hdHJpeD1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZ2V0UG9zaXRpb25Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCkuIiksdGhpcy5zZXRGcm9tTWF0cml4UG9zaXRpb24odCl9LGNhdC5wcm90b3R5cGUuZ2V0U2NhbGVGcm9tTWF0cml4PWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5nZXRTY2FsZUZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4U2NhbGUoKS4iKSx0aGlzLnNldEZyb21NYXRyaXhTY2FsZSh0KX0sY2F0LnByb3RvdHlwZS5nZXRDb2x1bW5Gcm9tTWF0cml4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmdldENvbHVtbkZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4Q29sdW1uKCkuIiksdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKGUsdCl9LGNhdC5wcm90b3R5cGUuYXBwbHlQcm9qZWN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5hcHBseVByb2plY3Rpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmFwcGx5TWF0cml4NCggbSApIGluc3RlYWQuIiksdGhpcy5hcHBseU1hdHJpeDQodCl9LGNhdC5wcm90b3R5cGUuZnJvbUF0dHJpYnV0ZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuIiksdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSxuKX0sY2F0LnByb3RvdHlwZS5kaXN0YW5jZVRvTWFuaGF0dGFuPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5kaXN0YW5jZVRvTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuRGlzdGFuY2VUbygpLiIpLHRoaXMubWFuaGF0dGFuRGlzdGFuY2VUbyh0KX0sY2F0LnByb3RvdHlwZS5sZW5ndGhNYW5oYXR0YW49ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAubGVuZ3RoTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuTGVuZ3RoKCkuIiksdGhpcy5tYW5oYXR0YW5MZW5ndGgoKX0sYWF0LnByb3RvdHlwZS5mcm9tQXR0cmlidXRlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3I0OiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKSx0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlLG4pfSxhYXQucHJvdG90eXBlLmxlbmd0aE1hbmhhdHRhbj1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4iKSx0aGlzLm1hbmhhdHRhbkxlbmd0aCgpfSxwcnQucHJvdG90eXBlLmdldENoaWxkQnlOYW1lPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuZ2V0Q2hpbGRCeU5hbWUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRPYmplY3RCeU5hbWUoKS4iKSx0aGlzLmdldE9iamVjdEJ5TmFtZSh0KX0scHJ0LnByb3RvdHlwZS5yZW5kZXJEZXB0aD1mdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5yZW5kZXJEZXB0aCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnJlbmRlck9yZGVyLCBpbnN0ZWFkLiIpfSxwcnQucHJvdG90eXBlLnRyYW5zbGF0ZT1mdW5jdGlvbih0LGUpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAudHJhbnNsYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC50cmFuc2xhdGVPbkF4aXMoIGF4aXMsIGRpc3RhbmNlICkgaW5zdGVhZC4iKSx0aGlzLnRyYW5zbGF0ZU9uQXhpcyhlLHQpfSxwcnQucHJvdG90eXBlLmdldFdvcmxkUm90YXRpb249ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUm90YXRpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuT2JqZWN0M0QuZ2V0V29ybGRRdWF0ZXJuaW9uKCB0YXJnZXQgKSBpbnN0ZWFkLiIpfSxwcnQucHJvdG90eXBlLmFwcGx5TWF0cml4PWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuYXBwbHlNYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5hcHBseU1hdHJpeDQoKS4iKSx0aGlzLmFwcGx5TWF0cml4NCh0KX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocHJ0LnByb3RvdHlwZSx7ZXVsZXJPcmRlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuIiksdGhpcy5yb3RhdGlvbi5vcmRlcn0sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuIiksdGhpcy5yb3RhdGlvbi5vcmRlcj10fX0sdXNlUXVhdGVybmlvbjp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnVzZVF1YXRlcm5pb24gaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIGxpYnJhcnkgbm93IHVzZXMgcXVhdGVybmlvbnMgYnkgZGVmYXVsdC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnVzZVF1YXRlcm5pb24gaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIGxpYnJhcnkgbm93IHVzZXMgcXVhdGVybmlvbnMgYnkgZGVmYXVsdC4iKX19fSkscHN0LnByb3RvdHlwZS5zZXREcmF3TW9kZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1lc2g6IC5zZXREcmF3TW9kZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSByZW5kZXJlciBub3cgYWx3YXlzIGFzc3VtZXMgVEhSRUUuVHJpYW5nbGVzRHJhd01vZGUuIFRyYW5zZm9ybSB5b3VyIGdlb21ldHJ5IHZpYSBCdWZmZXJHZW9tZXRyeVV0aWxzLnRvVHJpYW5nbGVzRHJhd01vZGUoKSBpZiBuZWNlc3NhcnkuIil9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHBzdC5wcm90b3R5cGUse2RyYXdNb2RlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuTWVzaDogLmRyYXdNb2RlIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSByZW5kZXJlciBub3cgYWx3YXlzIGFzc3VtZXMgVEhSRUUuVHJpYW5nbGVzRHJhd01vZGUuIiksMH0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWVzaDogLmRyYXdNb2RlIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSByZW5kZXJlciBub3cgYWx3YXlzIGFzc3VtZXMgVEhSRUUuVHJpYW5nbGVzRHJhd01vZGUuIFRyYW5zZm9ybSB5b3VyIGdlb21ldHJ5IHZpYSBCdWZmZXJHZW9tZXRyeVV0aWxzLnRvVHJpYW5nbGVzRHJhd01vZGUoKSBpZiBuZWNlc3NhcnkuIil9fX0pLGpkdC5wcm90b3R5cGUuaW5pdEJvbmVzPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2tpbm5lZE1lc2g6IGluaXRCb25lcygpIGhhcyBiZWVuIHJlbW92ZWQuIil9LF9zdC5wcm90b3R5cGUuc2V0TGVucz1mdW5jdGlvbih0LGUpe2NvbnNvbGUud2FybigiVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEuc2V0TGVucyBpcyBkZXByZWNhdGVkLiBVc2UgLnNldEZvY2FsTGVuZ3RoIGFuZCAuZmlsbUdhdWdlIGZvciBhIHBob3RvZ3JhcGhpYyBzZXR1cC4iKSx2b2lkIDAhPT1lJiYodGhpcy5maWxtR2F1Z2U9ZSksdGhpcy5zZXRGb2NhbExlbmd0aCh0KX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQW10LnByb3RvdHlwZSx7b25seVNoYWRvdzp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLm9ubHlTaGFkb3cgaGFzIGJlZW4gcmVtb3ZlZC4iKX19LHNoYWRvd0NhbWVyYUZvdjp7c2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGb3YgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZvdi4iKSx0aGlzLnNoYWRvdy5jYW1lcmEuZm92PXR9fSxzaGFkb3dDYW1lcmFMZWZ0OntzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUxlZnQgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmxlZnQuIiksdGhpcy5zaGFkb3cuY2FtZXJhLmxlZnQ9dH19LHNoYWRvd0NhbWVyYVJpZ2h0OntzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVJpZ2h0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5yaWdodC4iKSx0aGlzLnNoYWRvdy5jYW1lcmEucmlnaHQ9dH19LHNoYWRvd0NhbWVyYVRvcDp7c2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFUb3AgaXMgbm93IC5zaGFkb3cuY2FtZXJhLnRvcC4iKSx0aGlzLnNoYWRvdy5jYW1lcmEudG9wPXR9fSxzaGFkb3dDYW1lcmFCb3R0b206e3NldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhQm90dG9tIGlzIG5vdyAuc2hhZG93LmNhbWVyYS5ib3R0b20uIiksdGhpcy5zaGFkb3cuY2FtZXJhLmJvdHRvbT10fX0sc2hhZG93Q2FtZXJhTmVhcjp7c2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFOZWFyIGlzIG5vdyAuc2hhZG93LmNhbWVyYS5uZWFyLiIpLHRoaXMuc2hhZG93LmNhbWVyYS5uZWFyPXR9fSxzaGFkb3dDYW1lcmFGYXI6e3NldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhRmFyIGlzIG5vdyAuc2hhZG93LmNhbWVyYS5mYXIuIiksdGhpcy5zaGFkb3cuY2FtZXJhLmZhcj10fX0sc2hhZG93Q2FtZXJhVmlzaWJsZTp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVZpc2libGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5DYW1lcmFIZWxwZXIoIGxpZ2h0LnNoYWRvdy5jYW1lcmEgKSBpbnN0ZWFkLiIpfX0sc2hhZG93Qmlhczp7c2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dCaWFzIGlzIG5vdyAuc2hhZG93LmJpYXMuIiksdGhpcy5zaGFkb3cuYmlhcz10fX0sc2hhZG93RGFya25lc3M6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dEYXJrbmVzcyBoYXMgYmVlbiByZW1vdmVkLiIpfX0sc2hhZG93TWFwV2lkdGg6e3NldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93TWFwV2lkdGggaXMgbm93IC5zaGFkb3cubWFwU2l6ZS53aWR0aC4iKSx0aGlzLnNoYWRvdy5tYXBTaXplLndpZHRoPXR9fSxzaGFkb3dNYXBIZWlnaHQ6e3NldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93TWFwSGVpZ2h0IGlzIG5vdyAuc2hhZG93Lm1hcFNpemUuaGVpZ2h0LiIpLHRoaXMuc2hhZG93Lm1hcFNpemUuaGVpZ2h0PXR9fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHpydC5wcm90b3R5cGUse2xlbmd0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAubGVuZ3RoIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuY291bnQgaW5zdGVhZC4iKSx0aGlzLmFycmF5Lmxlbmd0aH19LGR5bmFtaWM6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmR5bmFtaWMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC51c2FnZSBpbnN0ZWFkLiIpLHRoaXMudXNhZ2U9PT1WaXR9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAuZHluYW1pYyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnVzYWdlIGluc3RlYWQuIiksdGhpcy5zZXRVc2FnZShWaXQpfX19KSx6cnQucHJvdG90eXBlLnNldER5bmFtaWM9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAuc2V0RHluYW1pYygpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuc2V0VXNhZ2UoKSBpbnN0ZWFkLiIpLHRoaXMuc2V0VXNhZ2UoITA9PT10P1ZpdDpCaXQpLHRoaXN9LHpydC5wcm90b3R5cGUuY29weUluZGljZXNBcnJheT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmNvcHlJbmRpY2VzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSx6cnQucHJvdG90eXBlLnNldEFycmF5PWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAuc2V0QXJyYXkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEJ1ZmZlckdlb21ldHJ5IC5zZXRBdHRyaWJ1dGUgdG8gcmVwbGFjZS9yZXNpemUgYXR0cmlidXRlIGJ1ZmZlcnMiKX0scXJ0LnByb3RvdHlwZS5hZGRJbmRleD1mdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkSW5kZXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRJbmRleCgpLiIpLHRoaXMuc2V0SW5kZXgodCl9LHFydC5wcm90b3R5cGUuYWRkQXR0cmlidXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRBdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRBdHRyaWJ1dGUoKS4iKSxlJiZlLmlzQnVmZmVyQXR0cmlidXRlfHxlJiZlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU/ImluZGV4Ij09PXQ/KGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnkuYWRkQXR0cmlidXRlOiBVc2UgLnNldEluZGV4KCkgZm9yIGluZGV4IGF0dHJpYnV0ZS4iKSx0aGlzLnNldEluZGV4KGUpLHRoaXMpOnRoaXMuc2V0QXR0cmlidXRlKHQsZSk6KGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRBdHRyaWJ1dGUoKSBub3cgZXhwZWN0cyAoIG5hbWUsIGF0dHJpYnV0ZSApLiIpLHRoaXMuc2V0QXR0cmlidXRlKHQsbmV3IHpydChhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKSkpfSxxcnQucHJvdG90eXBlLmFkZERyYXdDYWxsPWZ1bmN0aW9uKHQsZSxuKXt2b2lkIDAhPT1uJiZjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkRHJhd0NhbGwoKSBubyBsb25nZXIgc3VwcG9ydHMgaW5kZXhPZmZzZXQuIiksY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZERyYXdDYWxsKCkgaXMgbm93IC5hZGRHcm91cCgpLiIpLHRoaXMuYWRkR3JvdXAodCxlKX0scXJ0LnByb3RvdHlwZS5jbGVhckRyYXdDYWxscz1mdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jbGVhckRyYXdDYWxscygpIGlzIG5vdyAuY2xlYXJHcm91cHMoKS4iKSx0aGlzLmNsZWFyR3JvdXBzKCl9LHFydC5wcm90b3R5cGUuY29tcHV0ZU9mZnNldHM9ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZU9mZnNldHMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxxcnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZT1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLnJlbW92ZUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmRlbGV0ZUF0dHJpYnV0ZSgpLiIpLHRoaXMuZGVsZXRlQXR0cmlidXRlKHQpfSxxcnQucHJvdG90eXBlLmFwcGx5TWF0cml4PWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYXBwbHlNYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5hcHBseU1hdHJpeDQoKS4iKSx0aGlzLmFwcGx5TWF0cml4NCh0KX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocXJ0LnByb3RvdHlwZSx7ZHJhd2NhbGxzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5kcmF3Y2FsbHMgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ3JvdXBzLiIpLHRoaXMuZ3JvdXBzfX0sb2Zmc2V0czp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5vZmZzZXRzIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdyb3Vwcy4iKSx0aGlzLmdyb3Vwc319fSksX2R0LnByb3RvdHlwZS5zZXREeW5hbWljPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkludGVybGVhdmVkQnVmZmVyOiAuc2V0RHluYW1pYygpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuc2V0VXNhZ2UoKSBpbnN0ZWFkLiIpLHRoaXMuc2V0VXNhZ2UoITA9PT10P1ZpdDpCaXQpLHRoaXN9LF9kdC5wcm90b3R5cGUuc2V0QXJyYXk9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlcjogLnNldEFycmF5IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBCdWZmZXJHZW9tZXRyeSAuc2V0QXR0cmlidXRlIHRvIHJlcGxhY2UvcmVzaXplIGF0dHJpYnV0ZSBidWZmZXJzIil9LG5tdC5wcm90b3R5cGUuZ2V0QXJyYXlzPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiAuZ2V0QXJyYXlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sbm10LnByb3RvdHlwZS5hZGRTaGFwZUxpc3Q9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlR2VvbWV0cnk6IC5hZGRTaGFwZUxpc3QoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxubXQucHJvdG90eXBlLmFkZFNoYXBlPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiAuYWRkU2hhcGUoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSx5ZHQucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TY2VuZTogLmRpc3Bvc2UoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPcnQucHJvdG90eXBlLHt3cmFwQXJvdW5kOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLiIpfX0sb3ZlcmRyYXc6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6IC5vdmVyZHJhdyBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAub3ZlcmRyYXcgaGFzIGJlZW4gcmVtb3ZlZC4iKX19LHdyYXBSR0I6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcFJHQiBoYXMgYmVlbiByZW1vdmVkLiIpLG5ldyBScnR9fSxzaGFkaW5nOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS4iK3RoaXMudHlwZSsiOiAuc2hhZGluZyBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdGhlIGJvb2xlYW4gLmZsYXRTaGFkaW5nIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLiIrdGhpcy50eXBlKyI6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4iKSx0aGlzLmZsYXRTaGFkaW5nPTE9PT10fX0sc3RlbmNpbE1hc2s6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLiIrdGhpcy50eXBlKyI6IC5zdGVuY2lsTWFzayBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnN0ZW5jaWxGdW5jTWFzayBpbnN0ZWFkLiIpLHRoaXMuc3RlbmNpbEZ1bmNNYXNrfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS4iK3RoaXMudHlwZSsiOiAuc3RlbmNpbE1hc2sgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5zdGVuY2lsRnVuY01hc2sgaW5zdGVhZC4iKSx0aGlzLnN0ZW5jaWxGdW5jTWFzaz10fX0sdmVydGV4VGFuZ2VudHM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnZlcnRleFRhbmdlbnRzIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnZlcnRleFRhbmdlbnRzIGhhcyBiZWVuIHJlbW92ZWQuIil9fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGJzdC5wcm90b3R5cGUse2Rlcml2YXRpdmVzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5TaGFkZXJNYXRlcmlhbDogLmRlcml2YXRpdmVzIGhhcyBiZWVuIG1vdmVkIHRvIC5leHRlbnNpb25zLmRlcml2YXRpdmVzLiIpLHRoaXMuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlc30sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuIFNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuIiksdGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzPXR9fX0pLGJkdC5wcm90b3R5cGUuY2xlYXJUYXJnZXQ9ZnVuY3Rpb24odCxlLG4sbyl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuY2xlYXJUYXJnZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnNldFJlbmRlclRhcmdldCgpIGFuZCAuY2xlYXIoKSBpbnN0ZWFkLiIpLHRoaXMuc2V0UmVuZGVyVGFyZ2V0KHQpLHRoaXMuY2xlYXIoZSxuLG8pfSxiZHQucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYW5pbWF0ZSgpIGlzIG5vdyAuc2V0QW5pbWF0aW9uTG9vcCgpLiIpLHRoaXMuc2V0QW5pbWF0aW9uTG9vcCh0KX0sYmR0LnByb3RvdHlwZS5nZXRDdXJyZW50UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldEN1cnJlbnRSZW5kZXJUYXJnZXQoKSBpcyBub3cgLmdldFJlbmRlclRhcmdldCgpLiIpLHRoaXMuZ2V0UmVuZGVyVGFyZ2V0KCl9LGJkdC5wcm90b3R5cGUuZ2V0TWF4QW5pc290cm9weT1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRNYXhBbmlzb3Ryb3B5KCkgaXMgbm93IC5jYXBhYmlsaXRpZXMuZ2V0TWF4QW5pc290cm9weSgpLiIpLHRoaXMuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKX0sYmR0LnByb3RvdHlwZS5nZXRQcmVjaXNpb249ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0UHJlY2lzaW9uKCkgaXMgbm93IC5jYXBhYmlsaXRpZXMucHJlY2lzaW9uLiIpLHRoaXMuY2FwYWJpbGl0aWVzLnByZWNpc2lvbn0sYmR0LnByb3RvdHlwZS5yZXNldEdMU3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAucmVzZXRHTFN0YXRlKCkgaXMgbm93IC5zdGF0ZS5yZXNldCgpLiIpLHRoaXMuc3RhdGUucmVzZXQoKX0sYmR0LnByb3RvdHlwZS5zdXBwb3J0c0Zsb2F0VGV4dHVyZXM9ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApLiIpLHRoaXMuZXh0ZW5zaW9ucy5nZXQoIk9FU190ZXh0dXJlX2Zsb2F0Iil9LGJkdC5wcm90b3R5cGUuc3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlcz1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0hhbGZGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnICkuIiksdGhpcy5leHRlbnNpb25zLmdldCgiT0VTX3RleHR1cmVfaGFsZl9mbG9hdCIpfSxiZHQucHJvdG90eXBlLnN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlcz1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyApLiIpLHRoaXMuZXh0ZW5zaW9ucy5nZXQoIk9FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyIpfSxiZHQucHJvdG90eXBlLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApLiIpLHRoaXMuZXh0ZW5zaW9ucy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil9LGJkdC5wcm90b3R5cGUuc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICkuIiksdGhpcy5leHRlbnNpb25zLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIil9LGJkdC5wcm90b3R5cGUuc3VwcG9ydHNCbGVuZE1pbk1heD1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0JsZW5kTWluTWF4KCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICkuIiksdGhpcy5leHRlbnNpb25zLmdldCgiRVhUX2JsZW5kX21pbm1heCIpfSxiZHQucHJvdG90eXBlLnN1cHBvcnRzVmVydGV4VGV4dHVyZXM9ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcygpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzLiIpLHRoaXMuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzfSxiZHQucHJvdG90eXBlLnN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICkuIiksdGhpcy5leHRlbnNpb25zLmdldCgiQU5HTEVfaW5zdGFuY2VkX2FycmF5cyIpfSxiZHQucHJvdG90eXBlLmVuYWJsZVNjaXNzb3JUZXN0PWZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmVuYWJsZVNjaXNzb3JUZXN0KCkgaXMgbm93IC5zZXRTY2lzc29yVGVzdCgpLiIpLHRoaXMuc2V0U2Npc3NvclRlc3QodCl9LGJkdC5wcm90b3R5cGUuaW5pdE1hdGVyaWFsPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuaW5pdE1hdGVyaWFsKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYmR0LnByb3RvdHlwZS5hZGRQcmVQbHVnaW49ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQcmVQbHVnaW4oKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxiZHQucHJvdG90eXBlLmFkZFBvc3RQbHVnaW49ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQb3N0UGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYmR0LnByb3RvdHlwZS51cGRhdGVTaGFkb3dNYXA9ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC51cGRhdGVTaGFkb3dNYXAoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxiZHQucHJvdG90eXBlLnNldEZhY2VDdWxsaW5nPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0RmFjZUN1bGxpbmcoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxiZHQucHJvdG90eXBlLmFsbG9jVGV4dHVyZVVuaXQ9ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5hbGxvY1RleHR1cmVVbml0KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYmR0LnByb3RvdHlwZS5zZXRUZXh0dXJlPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGJkdC5wcm90b3R5cGUuc2V0VGV4dHVyZTJEPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZTJEKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYmR0LnByb3RvdHlwZS5zZXRUZXh0dXJlQ3ViZT1mdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldFRleHR1cmVDdWJlKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYmR0LnByb3RvdHlwZS5nZXRBY3RpdmVNaXBNYXBMZXZlbD1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRBY3RpdmVNaXBNYXBMZXZlbCgpIGlzIG5vdyAuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKS4iKSx0aGlzLmdldEFjdGl2ZU1pcG1hcExldmVsKCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGJkdC5wcm90b3R5cGUse3NoYWRvd01hcEVuYWJsZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNoYWRvd01hcC5lbmFibGVkfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwRW5hYmxlZCBpcyBub3cgLnNoYWRvd01hcC5lbmFibGVkLiIpLHRoaXMuc2hhZG93TWFwLmVuYWJsZWQ9dH19LHNoYWRvd01hcFR5cGU6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNoYWRvd01hcC50eXBlfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwVHlwZSBpcyBub3cgLnNoYWRvd01hcC50eXBlLiIpLHRoaXMuc2hhZG93TWFwLnR5cGU9dH19LHNoYWRvd01hcEN1bGxGYWNlOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBDdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBDdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX0sY29udGV4dDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmNvbnRleHQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5nZXRDb250ZXh0KCkgaW5zdGVhZC4iKSx0aGlzLmdldENvbnRleHQoKX19LHZyOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAudnIgaGFzIGJlZW4gcmVuYW1lZCB0byAueHIiKSx0aGlzLnhyfX0sZ2FtbWFJbnB1dDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdhbW1hSW5wdXQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IHRoZSBlbmNvZGluZyBmb3IgdGV4dHVyZXMgdmlhIFRleHR1cmUuZW5jb2RpbmcgaW5zdGVhZC4iKSwhMX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2FtbWFJbnB1dCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgdGhlIGVuY29kaW5nIGZvciB0ZXh0dXJlcyB2aWEgVGV4dHVyZS5lbmNvZGluZyBpbnN0ZWFkLiIpfX0sZ2FtbWFPdXRwdXQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5nYW1tYU91dHB1dCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgV2ViR0xSZW5kZXJlci5vdXRwdXRFbmNvZGluZyBpbnN0ZWFkLiIpLCExfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2FtbWFPdXRwdXQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IFdlYkdMUmVuZGVyZXIub3V0cHV0RW5jb2RpbmcgaW5zdGVhZC4iKSx0aGlzLm91dHB1dEVuY29kaW5nPSEwPT09dD9JaXQ6eml0fX0sdG9uZU1hcHBpbmdXaGl0ZVBvaW50OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAudG9uZU1hcHBpbmdXaGl0ZVBvaW50IGhhcyBiZWVuIHJlbW92ZWQuIiksMX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAudG9uZU1hcHBpbmdXaGl0ZVBvaW50IGhhcyBiZWVuIHJlbW92ZWQuIil9fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHNkdC5wcm90b3R5cGUse2N1bGxGYWNlOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAuY3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9fSxyZW5kZXJSZXZlcnNlU2lkZWQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclJldmVyc2VTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX0scmVuZGVyU2luZ2xlU2lkZWQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJTaW5nbGVTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyU2luZ2xlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX19fSksT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocmF0LnByb3RvdHlwZSx7d3JhcFM6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLiIpLHRoaXMudGV4dHVyZS53cmFwU30sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwUyBpcyBub3cgLnRleHR1cmUud3JhcFMuIiksdGhpcy50ZXh0dXJlLndyYXBTPXR9fSx3cmFwVDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwVCBpcyBub3cgLnRleHR1cmUud3JhcFQuIiksdGhpcy50ZXh0dXJlLndyYXBUfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBUIGlzIG5vdyAudGV4dHVyZS53cmFwVC4iKSx0aGlzLnRleHR1cmUud3JhcFQ9dH19LG1hZ0ZpbHRlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5tYWdGaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1hZ0ZpbHRlci4iKSx0aGlzLnRleHR1cmUubWFnRmlsdGVyfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLiIpLHRoaXMudGV4dHVyZS5tYWdGaWx0ZXI9dH19LG1pbkZpbHRlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4iKSx0aGlzLnRleHR1cmUubWluRmlsdGVyfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1pbkZpbHRlciBpcyBub3cgLnRleHR1cmUubWluRmlsdGVyLiIpLHRoaXMudGV4dHVyZS5taW5GaWx0ZXI9dH19LGFuaXNvdHJvcHk6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4iKSx0aGlzLnRleHR1cmUuYW5pc290cm9weX0sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LiIpLHRoaXMudGV4dHVyZS5hbmlzb3Ryb3B5PXR9fSxvZmZzZXQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuIiksdGhpcy50ZXh0dXJlLm9mZnNldH0sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4iKSx0aGlzLnRleHR1cmUub2Zmc2V0PXR9fSxyZXBlYXQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuIiksdGhpcy50ZXh0dXJlLnJlcGVhdH0sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5yZXBlYXQgaXMgbm93IC50ZXh0dXJlLnJlcGVhdC4iKSx0aGlzLnRleHR1cmUucmVwZWF0PXR9fSxmb3JtYXQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZm9ybWF0IGlzIG5vdyAudGV4dHVyZS5mb3JtYXQuIiksdGhpcy50ZXh0dXJlLmZvcm1hdH0sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5mb3JtYXQgaXMgbm93IC50ZXh0dXJlLmZvcm1hdC4iKSx0aGlzLnRleHR1cmUuZm9ybWF0PXR9fSx0eXBlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnR5cGUgaXMgbm93IC50ZXh0dXJlLnR5cGUuIiksdGhpcy50ZXh0dXJlLnR5cGV9LHNldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4iKSx0aGlzLnRleHR1cmUudHlwZT10fX0sZ2VuZXJhdGVNaXBtYXBzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmdlbmVyYXRlTWlwbWFwcyBpcyBub3cgLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzLiIpLHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHN9LHNldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZ2VuZXJhdGVNaXBtYXBzIGlzIG5vdyAudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMuIiksdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz10fX19KSxjbGFzcyBleHRlbmRzIHBydHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iQXVkaW8iLHRoaXMubGlzdGVuZXI9dCx0aGlzLmNvbnRleHQ9dC5jb250ZXh0LHRoaXMuZ2Fpbj10aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpLHRoaXMuZ2Fpbi5jb25uZWN0KHQuZ2V0SW5wdXQoKSksdGhpcy5hdXRvcGxheT0hMSx0aGlzLmJ1ZmZlcj1udWxsLHRoaXMuZGV0dW5lPTAsdGhpcy5sb29wPSExLHRoaXMubG9vcFN0YXJ0PTAsdGhpcy5sb29wRW5kPTAsdGhpcy5vZmZzZXQ9MCx0aGlzLmR1cmF0aW9uPXZvaWQgMCx0aGlzLnBsYXliYWNrUmF0ZT0xLHRoaXMuaXNQbGF5aW5nPSExLHRoaXMuaGFzUGxheWJhY2tDb250cm9sPSEwLHRoaXMuc291cmNlPW51bGwsdGhpcy5zb3VyY2VUeXBlPSJlbXB0eSIsdGhpcy5fc3RhcnRlZEF0PTAsdGhpcy5fcHJvZ3Jlc3M9MCx0aGlzLl9jb25uZWN0ZWQ9ITEsdGhpcy5maWx0ZXJzPVtdfWdldE91dHB1dCgpe3JldHVybiB0aGlzLmdhaW59c2V0Tm9kZVNvdXJjZSh0KXtyZXR1cm4gdGhpcy5oYXNQbGF5YmFja0NvbnRyb2w9ITEsdGhpcy5zb3VyY2VUeXBlPSJhdWRpb05vZGUiLHRoaXMuc291cmNlPXQsdGhpcy5jb25uZWN0KCksdGhpc31zZXRNZWRpYUVsZW1lbnRTb3VyY2UodCl7cmV0dXJuIHRoaXMuaGFzUGxheWJhY2tDb250cm9sPSExLHRoaXMuc291cmNlVHlwZT0ibWVkaWFOb2RlIix0aGlzLnNvdXJjZT10aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFFbGVtZW50U291cmNlKHQpLHRoaXMuY29ubmVjdCgpLHRoaXN9c2V0TWVkaWFTdHJlYW1Tb3VyY2UodCl7cmV0dXJuIHRoaXMuaGFzUGxheWJhY2tDb250cm9sPSExLHRoaXMuc291cmNlVHlwZT0ibWVkaWFTdHJlYW1Ob2RlIix0aGlzLnNvdXJjZT10aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFTdHJlYW1Tb3VyY2UodCksdGhpcy5jb25uZWN0KCksdGhpc31zZXRCdWZmZXIodCl7cmV0dXJuIHRoaXMuYnVmZmVyPXQsdGhpcy5zb3VyY2VUeXBlPSJidWZmZXIiLHRoaXMuYXV0b3BsYXkmJnRoaXMucGxheSgpLHRoaXN9cGxheSh0PTApe2lmKCEwPT09dGhpcy5pc1BsYXlpbmcpcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogQXVkaW8gaXMgYWxyZWFkeSBwbGF5aW5nLiIpO2lmKCExPT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wpcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTt0aGlzLl9zdGFydGVkQXQ9dGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lK3Q7Y29uc3QgZT10aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7cmV0dXJuIGUuYnVmZmVyPXRoaXMuYnVmZmVyLGUubG9vcD10aGlzLmxvb3AsZS5sb29wU3RhcnQ9dGhpcy5sb29wU3RhcnQsZS5sb29wRW5kPXRoaXMubG9vcEVuZCxlLm9uZW5kZWQ9dGhpcy5vbkVuZGVkLmJpbmQodGhpcyksZS5zdGFydCh0aGlzLl9zdGFydGVkQXQsdGhpcy5fcHJvZ3Jlc3MrdGhpcy5vZmZzZXQsdGhpcy5kdXJhdGlvbiksdGhpcy5pc1BsYXlpbmc9ITAsdGhpcy5zb3VyY2U9ZSx0aGlzLnNldERldHVuZSh0aGlzLmRldHVuZSksdGhpcy5zZXRQbGF5YmFja1JhdGUodGhpcy5wbGF5YmFja1JhdGUpLHRoaXMuY29ubmVjdCgpfXBhdXNlKCl7aWYoITEhPT10aGlzLmhhc1BsYXliYWNrQ29udHJvbClyZXR1cm4hMD09PXRoaXMuaXNQbGF5aW5nJiYodGhpcy5fcHJvZ3Jlc3MrPU1hdGgubWF4KHRoaXMuY29udGV4dC5jdXJyZW50VGltZS10aGlzLl9zdGFydGVkQXQsMCkqdGhpcy5wbGF5YmFja1JhdGUsITA9PT10aGlzLmxvb3AmJih0aGlzLl9wcm9ncmVzcz10aGlzLl9wcm9ncmVzcyUodGhpcy5kdXJhdGlvbnx8dGhpcy5idWZmZXIuZHVyYXRpb24pKSx0aGlzLnNvdXJjZS5zdG9wKCksdGhpcy5zb3VyY2Uub25lbmRlZD1udWxsLHRoaXMuaXNQbGF5aW5nPSExKSx0aGlzO2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIil9c3RvcCgpe2lmKCExIT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wpcmV0dXJuIHRoaXMuX3Byb2dyZXNzPTAsdGhpcy5zb3VyY2Uuc3RvcCgpLHRoaXMuc291cmNlLm9uZW5kZWQ9bnVsbCx0aGlzLmlzUGxheWluZz0hMSx0aGlzO2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIil9Y29ubmVjdCgpe2lmKHRoaXMuZmlsdGVycy5sZW5ndGg+MCl7dGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pO2ZvcihsZXQgdD0xLGU9dGhpcy5maWx0ZXJzLmxlbmd0aDt0PGU7dCsrKXRoaXMuZmlsdGVyc1t0LTFdLmNvbm5lY3QodGhpcy5maWx0ZXJzW3RdKTt0aGlzLmZpbHRlcnNbdGhpcy5maWx0ZXJzLmxlbmd0aC0xXS5jb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpfWVsc2UgdGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKTtyZXR1cm4gdGhpcy5fY29ubmVjdGVkPSEwLHRoaXN9ZGlzY29ubmVjdCgpe2lmKHRoaXMuZmlsdGVycy5sZW5ndGg+MCl7dGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pO2ZvcihsZXQgdD0xLGU9dGhpcy5maWx0ZXJzLmxlbmd0aDt0PGU7dCsrKXRoaXMuZmlsdGVyc1t0LTFdLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXJzW3RdKTt0aGlzLmZpbHRlcnNbdGhpcy5maWx0ZXJzLmxlbmd0aC0xXS5kaXNjb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpfWVsc2UgdGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKTtyZXR1cm4gdGhpcy5fY29ubmVjdGVkPSExLHRoaXN9Z2V0RmlsdGVycygpe3JldHVybiB0aGlzLmZpbHRlcnN9c2V0RmlsdGVycyh0KXtyZXR1cm4gdHx8KHQ9W10pLCEwPT09dGhpcy5fY29ubmVjdGVkPyh0aGlzLmRpc2Nvbm5lY3QoKSx0aGlzLmZpbHRlcnM9dC5zbGljZSgpLHRoaXMuY29ubmVjdCgpKTp0aGlzLmZpbHRlcnM9dC5zbGljZSgpLHRoaXN9c2V0RGV0dW5lKHQpe2lmKHRoaXMuZGV0dW5lPXQsdm9pZCAwIT09dGhpcy5zb3VyY2UuZGV0dW5lKXJldHVybiEwPT09dGhpcy5pc1BsYXlpbmcmJnRoaXMuc291cmNlLmRldHVuZS5zZXRUYXJnZXRBdFRpbWUodGhpcy5kZXR1bmUsdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLC4wMSksdGhpc31nZXREZXR1bmUoKXtyZXR1cm4gdGhpcy5kZXR1bmV9Z2V0RmlsdGVyKCl7cmV0dXJuIHRoaXMuZ2V0RmlsdGVycygpWzBdfXNldEZpbHRlcih0KXtyZXR1cm4gdGhpcy5zZXRGaWx0ZXJzKHQ/W3RdOltdKX1zZXRQbGF5YmFja1JhdGUodCl7aWYoITEhPT10aGlzLmhhc1BsYXliYWNrQ29udHJvbClyZXR1cm4gdGhpcy5wbGF5YmFja1JhdGU9dCwhMD09PXRoaXMuaXNQbGF5aW5nJiZ0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VGFyZ2V0QXRUaW1lKHRoaXMucGxheWJhY2tSYXRlLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXM7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKX1nZXRQbGF5YmFja1JhdGUoKXtyZXR1cm4gdGhpcy5wbGF5YmFja1JhdGV9b25FbmRlZCgpe3RoaXMuaXNQbGF5aW5nPSExfWdldExvb3AoKXtyZXR1cm4hMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sPyhjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpLCExKTp0aGlzLmxvb3B9c2V0TG9vcCh0KXtpZighMSE9PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKXJldHVybiB0aGlzLmxvb3A9dCwhMD09PXRoaXMuaXNQbGF5aW5nJiYodGhpcy5zb3VyY2UubG9vcD10aGlzLmxvb3ApLHRoaXM7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKX1zZXRMb29wU3RhcnQodCl7cmV0dXJuIHRoaXMubG9vcFN0YXJ0PXQsdGhpc31zZXRMb29wRW5kKHQpe3JldHVybiB0aGlzLmxvb3BFbmQ9dCx0aGlzfWdldFZvbHVtZSgpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZX1zZXRWb2x1bWUodCl7cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSh0LHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXN9fS5wcm90b3R5cGUubG9hZD1mdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiAubG9hZCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQXVkaW9Mb2FkZXIgaW5zdGVhZC4iKTtjb25zdCBlPXRoaXM7cmV0dXJuKG5ldyBZbXQpLmxvYWQodCwoZnVuY3Rpb24odCl7ZS5zZXRCdWZmZXIodCl9KSksdGhpc30sTXN0LnByb3RvdHlwZS51cGRhdGVDdWJlTWFwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQ3ViZUNhbWVyYTogLnVwZGF0ZUN1YmVNYXAoKSBpcyBub3cgLnVwZGF0ZSgpLiIpLHRoaXMudXBkYXRlKHQsZSl9LE1zdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24odCxlLG4sbyl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQ3ViZUNhbWVyYTogLmNsZWFyKCkgaXMgbm93IC5yZW5kZXJUYXJnZXQuY2xlYXIoKS4iKSx0aGlzLnJlbmRlclRhcmdldC5jbGVhcih0LGUsbixvKX0sZWF0LmNyb3NzT3JpZ2luPXZvaWQgMCxlYXQubG9hZFRleHR1cmU9ZnVuY3Rpb24odCxlLG4sbyl7Y29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRUZXh0dXJlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5UZXh0dXJlTG9hZGVyKCkgaW5zdGVhZC4iKTtjb25zdCBpPW5ldyBTbXQ7aS5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTtjb25zdCBhPWkubG9hZCh0LG4sdm9pZCAwLG8pO3JldHVybiBlJiYoYS5tYXBwaW5nPWUpLGF9LGVhdC5sb2FkVGV4dHVyZUN1YmU9ZnVuY3Rpb24odCxlLG4sbyl7Y29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRUZXh0dXJlQ3ViZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ3ViZVRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLiIpO2NvbnN0IGk9bmV3IGttdDtpLnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pO2NvbnN0IGE9aS5sb2FkKHQsbix2b2lkIDAsbyk7cmV0dXJuIGUmJihhLm1hcHBpbmc9ZSksYX0sZWF0LmxvYWRDb21wcmVzc2VkVGV4dHVyZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5ERFNMb2FkZXIgaW5zdGVhZC4iKX0sZWF0LmxvYWRDb21wcmVzc2VkVGV4dHVyZUN1YmU9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZUN1YmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkREU0xvYWRlciBpbnN0ZWFkLiIpfSwidW5kZWZpbmVkIiE9dHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyYmX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJyZWdpc3RlciIse2RldGFpbDp7cmV2aXNpb246IjEzMSJ9fSkpLCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYod2luZG93Ll9fVEhSRUVfXz9jb25zb2xlLndhcm4oIldBUk5JTkc6IE11bHRpcGxlIGluc3RhbmNlcyBvZiBUaHJlZS5qcyBiZWluZyBpbXBvcnRlZC4iKTp3aW5kb3cuX19USFJFRV9fPSIxMzEiKSwoZnVuY3Rpb24odCl7dFt0LkNJUkNMRT0wXT0iQ0lSQ0xFIix0W3QuTElORT0xXT0iTElORSIsdFt0LlRSSUFOR0xFPTJdPSJUUklBTkdMRSIsdFt0LlRSQVBFWk9JRD0zXT0iVFJBUEVaT0lEIn0pKHB1dHx8KHB1dD17fSkpO2NsYXNzIHl1dHtjb25zdHJ1Y3Rvcih0LGUsbixvKXt0aGlzLmNvb3JkaW5hdG9yPWUsdGhpcy5zY2VuZT1uZXcgeWR0LHRoaXMuYmFja2dyb3VuZENvbG9yPSIjZmZmIixpaXQoKSYmdCBpbnN0YW5jZW9mIE9mZnNjcmVlbkNhbnZhcyYmKHQuc3R5bGU9dC5zdHlsZXx8e30pLG8mJnQuYWRkRXZlbnRMaXN0ZW5lcigid2ViZ2xjb250ZXh0bG9zdCIsbyksdGhpcy5yZW5kZXJlcj1uZXcgYmR0KHtjYW52YXM6dCxjb250ZXh0OnQuZ2V0Q29udGV4dCgid2ViZ2wyIix7YW50aWFsaWFzOiEwLHByZWNpc2lvbjoiaGlnaHAiLGFscGhhOiEwfSl9KSx0aGlzLnJlbmRlcmVyLnNldFBpeGVsUmF0aW8obil9b25SZXNpemUodCl7dGhpcy5yZW5kZXJlci5zZXRTaXplKHQud2lkdGgsdC5oZWlnaHQpfWRlc3Ryb3lPYmplY3QodCl7Y29uc3QgZT10Lm9iajNkO2lmKHRoaXMuc2NlbmUucmVtb3ZlKGUpLGUgaW5zdGFuY2VvZiBwc3Qpe2UuZ2VvbWV0cnkuZGlzcG9zZSgpO2NvbnN0IHQ9QXJyYXkuaXNBcnJheShlLm1hdGVyaWFsKT9lLm1hdGVyaWFsOltlLm1hdGVyaWFsXTtmb3IoY29uc3QgZSBvZiB0KWUuZGlzcG9zZSgpfX1zZXRVc2VEYXJrTW9kZSh0KXt0aGlzLmJhY2tncm91bmRDb2xvcj10PyIjMzAzMDMwIjoiI2ZmZiJ9Y3JlYXRlT3JVcGRhdGVMaW5lT2JqZWN0KHQsZSxuKXt2YXIgbztpZighdCYmIW4udmlzaWJsZSlyZXR1cm4gbnVsbDtjb25zdHt2aXNpYmxlOmksd2lkdGg6YX09bjtpZighdCl7Y29uc3QgdD1kdXQodGhpcy5iYWNrZ3JvdW5kQ29sb3Isbi5jb2xvcixudWxsIT09KG89bi5vcGFjaXR5KSYmdm9pZCAwIT09bz9vOjEpLHI9bmV3IHFydCxzPW5ldyBxZHQoe2NvbG9yOnR9KSxsPW5ldyBwc3QocixzKTtyZXR1cm4gcy52aXNpYmxlPWksaHV0KHIsZSxhKSx0aGlzLnNjZW5lLmFkZChsKSx7dHlwZTpwdXQuTElORSxkYXRhOmUsb2JqM2Q6bCx3aWR0aDphfX1jb25zdHtkYXRhOnIsb2JqM2Q6cyx3aWR0aDpsfT10O3JldHVybiBidXQodGhpcy5iYWNrZ3JvdW5kQ29sb3IscywodD0+KGE9PT1sJiZyJiZhaXQocixlKXx8aHV0KHQsZSxhKSx0KSksbik/e3R5cGU6cHV0LkxJTkUsZGF0YTplLG9iajNkOnMsd2lkdGg6YX06dH1jcmVhdGVNZXNoKHQsZSl7aWYoIWUudmlzaWJsZSlyZXR1cm4gbnVsbDtjb25zdHt2aXNpYmxlOm4sY29sb3I6byxvcGFjaXR5Oml9PWUsYT1kdXQodGhpcy5iYWNrZ3JvdW5kQ29sb3IsbyxudWxsIT1pP2k6MSkscj1uZXcgQXJ0KHtjb2xvcjphLHZpc2libGU6bn0pO3JldHVybiBuZXcgcHN0KHQscil9Y3JlYXRlT3JVcGRhdGVUcmlhbmdsZU9iamVjdCh0LGUsbil7Y29uc3R7c2l6ZTpvfT1uLGk9bypNYXRoLnNxcnQoMykvMixhPW5ldyBGbG9hdDMyQXJyYXkoW2UueC1vLzIsZS55LWkvMyxlLngrby8yLGUueS1pLzMsZS54LGUueSsyKmkvM10pO2lmKCF0KXtjb25zdCB0PW5ldyBxcnQ7Z3V0KHQsYSk7Y29uc3Qgbz10aGlzLmNyZWF0ZU1lc2godCxuKTtyZXR1cm4gbnVsbD09PW8/bnVsbDoodGhpcy5zY2VuZS5hZGQobykse3R5cGU6cHV0LlRSSUFOR0xFLGRhdGE6ZSxvYmozZDpvfSl9cmV0dXJuIGJ1dCh0aGlzLmJhY2tncm91bmRDb2xvcix0Lm9iajNkLCh0PT4oZ3V0KHQsYSksdCkpLG4pP3t0eXBlOnB1dC5UUklBTkdMRSxkYXRhOmUsb2JqM2Q6dC5vYmozZH06dH1jcmVhdGVPclVwZGF0ZUNpcmNsZU9iamVjdCh0LGUsbil7Y29uc3R7cmFkaXVzOm99PW4saT1uZXcgY3B0KG4ucmFkaXVzKTtpZighdCl7Y29uc3QgdD10aGlzLmNyZWF0ZU1lc2goaSxuKTtyZXR1cm4gbnVsbD09PXQ/bnVsbDoodC5wb3NpdGlvbi5zZXQoZS54LGUueSwwKSx0aGlzLnNjZW5lLmFkZCh0KSx7dHlwZTpwdXQuQ0lSQ0xFLGRhdGE6e2xvYzplLHJhZGl1czpvfSxvYmozZDp0fSl9cmV0dXJuIGJ1dCh0aGlzLmJhY2tncm91bmRDb2xvcix0Lm9iajNkLCgoKT0+aSksbik/KHQub2JqM2QucG9zaXRpb24uc2V0KGUueCxlLnksMCkse3R5cGU6cHV0LkNJUkNMRSxkYXRhOntsb2M6ZSxyYWRpdXM6b30sb2JqM2Q6dC5vYmozZH0pOnR9Y3JlYXRlT3JVcGRhdGVUcmFwZXpvaWRPYmplY3QodCxlLG4sbyl7aWYoZS55IT09bi55KXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnB1dCBlcnJvcjogc3RhcnQueSAhPSBlbmQueS4iKTtjb25zdHthbHRpdHVkZTppfT1vLGE9Mi9NYXRoLnNxcnQoMykqaSxyPW5ldyBSbXQoW25ldyBRaXQoZS54LWEvMixlLnktaS8yKSxuZXcgUWl0KGUueCxlLnkraS8yKSxuZXcgUWl0KG4ueCxuLnkraS8yKSxuZXcgUWl0KG4ueCthLzIsbi55LWkvMildKTtyLmF1dG9DbG9zZT0hMDtjb25zdCBzPW5ldyBpbXQocik7aWYoIXQpe2NvbnN0IHQ9dGhpcy5jcmVhdGVNZXNoKHMsbyk7cmV0dXJuIG51bGw9PT10P251bGw6KHRoaXMuc2NlbmUuYWRkKHQpLHt0eXBlOnB1dC5UUkFQRVpPSUQsZGF0YTpbZSxuXSxvYmozZDp0fSl9cmV0dXJuIGJ1dCh0aGlzLmJhY2tncm91bmRDb2xvcix0Lm9iajNkLCgoKT0+cyksbyk/e3R5cGU6cHV0LlRSQVBFWk9JRCxkYXRhOltlLG5dLG9iajNkOnQub2JqM2R9OnR9Zmx1c2goKXt0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLHRoaXMuY29vcmRpbmF0b3IuZ2V0Q2FtZXJhKCkpfX1jbGFzcyBfdXR7Y29uc3RydWN0b3IodCxlKXt0aGlzLnJlbmRlckNhY2hlPXQsdGhpcy5yZW5kZXJlcj1lfXNldExpbmUodCxlLG4pe2NvbnN0IG89dGhpcy5yZW5kZXJlci5jcmVhdGVPclVwZGF0ZUxpbmVPYmplY3QodGhpcy5yZW5kZXJDYWNoZS5nZXRGcm9tUHJldmlvdXNGcmFtZSh0KSxlLG4pO28mJnRoaXMucmVuZGVyQ2FjaGUuc2V0VG9DdXJyZW50RnJhbWUodCxvKX1zZXRUcmlhbmdsZSh0LGUsbil7Y29uc3Qgbz10aGlzLnJlbmRlcmVyLmNyZWF0ZU9yVXBkYXRlVHJpYW5nbGVPYmplY3QodGhpcy5yZW5kZXJDYWNoZS5nZXRGcm9tUHJldmlvdXNGcmFtZSh0KSxlLG4pO28mJnRoaXMucmVuZGVyQ2FjaGUuc2V0VG9DdXJyZW50RnJhbWUodCxvKX1zZXRDaXJjbGUodCxlLG4pe2NvbnN0IG89dGhpcy5yZW5kZXJlci5jcmVhdGVPclVwZGF0ZUNpcmNsZU9iamVjdCh0aGlzLnJlbmRlckNhY2hlLmdldEZyb21QcmV2aW91c0ZyYW1lKHQpLGUsbik7byYmdGhpcy5yZW5kZXJDYWNoZS5zZXRUb0N1cnJlbnRGcmFtZSh0LG8pfXNldFRyYXBlem9pZCh0LGUsbixvKXtjb25zdCBpPXRoaXMucmVuZGVyZXIuY3JlYXRlT3JVcGRhdGVUcmFwZXpvaWRPYmplY3QodGhpcy5yZW5kZXJDYWNoZS5nZXRGcm9tUHJldmlvdXNGcmFtZSh0KSxlLG4sbyk7aSYmdGhpcy5yZW5kZXJDYWNoZS5zZXRUb0N1cnJlbnRGcmFtZSh0LGkpfX1jbGFzcyBDdXR7Y29uc3RydWN0b3IoKXt0aGlzLnByZXZGcmFtZUNhY2hlPW5ldyBNYXAsdGhpcy5jdXJyRnJhbWVDYWNoZT1uZXcgTWFwfWdldEZyb21QcmV2aW91c0ZyYW1lKHQpe2NvbnN0IGU9dGhpcy5wcmV2RnJhbWVDYWNoZS5nZXQodCk7cmV0dXJuIG51bGwhPWU/ZTpudWxsfXNldFRvQ3VycmVudEZyYW1lKHQsZSl7dGhpcy5jdXJyRnJhbWVDYWNoZS5zZXQodCxlKX1maW5hbGl6ZUZyYW1lQW5kR2V0UmVtb3ZlZCgpe2NvbnN0IHQ9W107Zm9yKGNvbnN0W2Usbl1vZiB0aGlzLnByZXZGcmFtZUNhY2hlLmVudHJpZXMoKSl0aGlzLmN1cnJGcmFtZUNhY2hlLmhhcyhlKXx8dC5wdXNoKG4pO3JldHVybiB0aGlzLnByZXZGcmFtZUNhY2hlPXRoaXMuY3VyckZyYW1lQ2FjaGUsdGhpcy5jdXJyRnJhbWVDYWNoZT1uZXcgTWFwLHR9fSEoZnVuY3Rpb24odCl7dFt0Lk5VTUJFUj0wXT0iTlVNQkVSIix0W3QuTkFOPTFdPSJOQU4ifSkobXV0fHwobXV0PXt9KSk7Y2xhc3MgTXV0IGV4dGVuZHMgY2xhc3N7Y29uc3RydWN0b3IodCl7dGhpcy5yYXdTZXJpZXNEYXRhPVtdLHRoaXMuc2VyaWVzPVtdLHRoaXMucGFpbnREaXJ0eT0hMCx0aGlzLnJlbmRlckNhY2hlPW5ldyBDdXQsdGhpcy5jb29yZGluYXRlSWRlbnRpZmllcj1udWxsLHRoaXMubGF5b3V0PXt4OjAsd2lkdGg6MSx5OjAsaGVpZ2h0OjF9LHRoaXMuZ2V0TWV0YWRhdGFNYXBJbXBsPXQuZ2V0TWV0YWRhdGFNYXAsdGhpcy5jb29yZGluYXRvcj10LmNvb3JkaW5hdG9yLHRoaXMucmVuZGVyZXI9dC5yZW5kZXJlcix0aGlzLnBhaW50QnJ1c2g9bmV3IF91dCh0aGlzLnJlbmRlckNhY2hlLHRoaXMucmVuZGVyZXIpfXNldExheW91dFJlY3QodCl7dGhpcy5sYXlvdXQueD09PXQueCYmdGhpcy5sYXlvdXQud2lkdGg9PT10LndpZHRoJiZ0aGlzLmxheW91dC55PT09dC55JiZ0aGlzLmxheW91dC5oZWlnaHQ9PT10LmhlaWdodHx8KHRoaXMucGFpbnREaXJ0eT0hMCksdGhpcy5sYXlvdXQ9dH1nZXRMYXlvdXRSZWN0KCl7cmV0dXJuIHRoaXMubGF5b3V0fWdldE1ldGFkYXRhTWFwKCl7cmV0dXJuIHRoaXMuZ2V0TWV0YWRhdGFNYXBJbXBsKCl9bWFya0FzUGFpbnREaXJ0eSgpe3RoaXMucGFpbnREaXJ0eT0hMH1yZW5kZXIoKXtpZih0aGlzLnRyYW5zZm9ybUNvb3JkaW5hdGVzSWZTdGFsZSgpLHRoaXMucGFpbnREaXJ0eSl7dGhpcy5yZWRyYXcoKTtmb3IoY29uc3QgdCBvZiB0aGlzLnJlbmRlckNhY2hlLmZpbmFsaXplRnJhbWVBbmRHZXRSZW1vdmVkKCkpdGhpcy5yZW5kZXJlci5kZXN0cm95T2JqZWN0KHQpO3RoaXMucGFpbnREaXJ0eT0hMX19aXNDb29yZGluYXRlVXBkYXRlZCgpe3JldHVybiB0aGlzLmNvb3JkaW5hdG9yLmdldFVwZGF0ZUlkZW50aWZpZXIoKSE9PXRoaXMuY29vcmRpbmF0ZUlkZW50aWZpZXJ9Y2xlYXJDb29yZGluYXRlSWRlbnRpZmllcigpe3RoaXMuY29vcmRpbmF0ZUlkZW50aWZpZXI9bnVsbH1zZXREYXRhKHQpe3RoaXMuY2xlYXJDb29yZGluYXRlSWRlbnRpZmllcigpLHRoaXMucmF3U2VyaWVzRGF0YT10fXRyYW5zZm9ybUNvb3JkaW5hdGVzSWZTdGFsZSgpe2lmKCF0aGlzLmlzQ29vcmRpbmF0ZVVwZGF0ZWQoKSlyZXR1cm47Y29uc3QgdD10aGlzLmdldExheW91dFJlY3QoKTt0aGlzLnNlcmllcz1uZXcgQXJyYXkodGhpcy5yYXdTZXJpZXNEYXRhLmxlbmd0aCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJhd1Nlcmllc0RhdGEubGVuZ3RoO2UrKyl7Y29uc3Qgbj10aGlzLnJhd1Nlcmllc0RhdGFbZV07dGhpcy5zZXJpZXNbZV09e2lkOm4uaWQscG9seWxpbmU6bmV3IEZsb2F0MzJBcnJheSgyKm4ucG9pbnRzLmxlbmd0aCl9O2ZvcihsZXQgbz0wO288bi5wb2ludHMubGVuZ3RoO28rKyl7Y29uc3RbaSxhXT10aGlzLmNvb3JkaW5hdG9yLnRyYW5zZm9ybURhdGFUb1VpQ29vcmQodCxbbi5wb2ludHNbb10ueCxuLnBvaW50c1tvXS55XSk7dGhpcy5zZXJpZXNbZV0ucG9seWxpbmVbMipvXT1pLHRoaXMuc2VyaWVzW2VdLnBvbHlsaW5lWzIqbysxXT1hfX10aGlzLmNvb3JkaW5hdGVJZGVudGlmaWVyPXRoaXMuY29vcmRpbmF0b3IuZ2V0VXBkYXRlSWRlbnRpZmllcigpLHRoaXMubWFya0FzUGFpbnREaXJ0eSgpfX17cmVjb3JkUGFydGl0aW9uKHQsZSxuKXtyZXR1cm4gdD97dHlwZTptdXQuTlVNQkVSLHBvbHlsaW5lOmV9Ont0eXBlOm11dC5OQU4scG9seWxpbmU6ZS5tYXAoKCh0LGUpPT5pc05hTih0KT9lJTI9PTA/bi54Om4ueTp0KSl9fXBhcnRpdGlvblBvbHlsaW5lKHQpe2NvbnN0IGU9W107bGV0IG49MCxvPSExO2NvbnN0IGk9dGhpcy5jb29yZGluYXRvci50cmFuc2Zvcm1EYXRhVG9VaUNvb3JkKHRoaXMuZ2V0TGF5b3V0UmVjdCgpLFswLDBdKSxhPXt4OmlbMF0seTppWzFdfTtsZXQgcj1udWxsO2ZvcihsZXQgaT0wO2k8dC5sZW5ndGg7aSs9Mil7Y29uc3QgYT10W2ldLHM9dFtpKzFdLGw9aXNOYU4oYSl8fGlzTmFOKHMpO2whPT1vJiZuIT09aSYmKGUucHVzaCh0aGlzLnJlY29yZFBhcnRpdGlvbighbyx0LnNsaWNlKG4saSksbnVsbD09PXI/e3g6YSx5OnN9OnIpKSxuPWkpLGx8fChyPXt4OmEseTpzfSksbz1sfXJldHVybiBuIT09dC5sZW5ndGgtMSYmZS5wdXNoKHRoaXMucmVjb3JkUGFydGl0aW9uKCFvLHQuc2xpY2Uobix0Lmxlbmd0aCksbnVsbCE9cj9yOmEpKSxlfXJlZHJhdygpe3ZhciB0LGUsbjtmb3IoY29uc3QgbyBvZiB0aGlzLnNlcmllcyl7Y29uc3QgaT10aGlzLmdldE1ldGFkYXRhTWFwKClbby5pZF07aWYoIWkpY29udGludWU7aWYoby5wb2x5bGluZS5sZW5ndGglMiE9MCl0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBoYXZlIG9kZCBsZW5ndGgtZWQgcG9seWxpbmU6ICR7by5wb2x5bGluZS5sZW5ndGh9YCk7Y29uc3QgYT10aGlzLnBhcnRpdGlvblBvbHlsaW5lKG8ucG9seWxpbmUpO2Zvcihjb25zdFtyLHt0eXBlOnMscG9seWxpbmU6bH1db2YgYS5lbnRyaWVzKCkpaWYocz09PW11dC5OVU1CRVIpMj09PWwubGVuZ3RoP3RoaXMucGFpbnRCcnVzaC5zZXRDaXJjbGUoSlNPTi5zdHJpbmdpZnkoWyJjaXJjbGUiLG8uaWQscl0pLHt4OmxbMF0seTpsWzFdfSx7Y29sb3I6aS5jb2xvcix2aXNpYmxlOmkudmlzaWJsZSxvcGFjaXR5Om51bGwhPT0odD1pLm9wYWNpdHkpJiZ2b2lkIDAhPT10P3Q6MSxyYWRpdXM6NH0pOnRoaXMucGFpbnRCcnVzaC5zZXRMaW5lKEpTT04uc3RyaW5naWZ5KFsibGluZSIsby5pZCxyXSksbCx7Y29sb3I6aS5jb2xvcix2aXNpYmxlOmkudmlzaWJsZSxvcGFjaXR5Om51bGwhPT0oZT1pLm9wYWNpdHkpJiZ2b2lkIDAhPT1lP2U6MSx3aWR0aDoyfSk7ZWxzZSBpZighaS5hdXgpZm9yKGxldCB0PTA7dDxsLmxlbmd0aDt0Kz0yKXRoaXMucGFpbnRCcnVzaC5zZXRUcmlhbmdsZShKU09OLnN0cmluZ2lmeShbIk5hTiIsby5pZCxsW3RdLGxbdCsxXV0pLHt4OmxbdF0seTpsW3QrMV19LHtjb2xvcjppLmNvbG9yLHZpc2libGU6aS52aXNpYmxlLG9wYWNpdHk6bnVsbCE9PShuPWkub3BhY2l0eSkmJnZvaWQgMCE9PW4/bjoxLHNpemU6MTJ9KX19fWNsYXNzIHZ1dCBleHRlbmRzIHJpdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jYW1lcmE9bmV3IFVzdCgwLDFlMywxZTMsMCwwLDEwMCl9aXNZQXhpc1BvaW50ZWREb3duKCl7cmV0dXJuITF9c2V0RG9tQ29udGFpbmVyUmVjdCh0KXtzdXBlci5zZXREb21Db250YWluZXJSZWN0KHQpLHRoaXMuY2FtZXJhLmxlZnQ9dC54LHRoaXMuY2FtZXJhLnJpZ2h0PXQueCt0LndpZHRoLHRoaXMuY2FtZXJhLnRvcD10LnkrdC5oZWlnaHQsdGhpcy5jYW1lcmEuYm90dG9tPXQueSx0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Z2V0Q2FtZXJhKCl7cmV0dXJuIHRoaXMuY2FtZXJhfX1jbGFzcyB4dXR7Y29uc3RydWN0b3IodCl7c3dpdGNoKHRoaXMubWV0YWRhdGFNYXA9e30sdGhpcy5zaG91bGRSZXBhaW50PSExLHRoaXMuY2FsbGJhY2tzPXQuY2FsbGJhY2tzLHQudHlwZSl7Y2FzZSBLMi5TVkc6dGhpcy5jb29yZGluYXRvcj1uZXcgcml0LHRoaXMucmVuZGVyZXI9bmV3IGxpdCh0LmNvbnRhaW5lcik7YnJlYWs7Y2FzZSBLMi5XRUJHTDp7Y29uc3QgZT1uZXcgdnV0O3RoaXMuY29vcmRpbmF0b3I9ZSx0aGlzLnJlbmRlcmVyPW5ldyB5dXQodC5jb250YWluZXIsZSx0LmRldmljZVBpeGVsUmF0aW8sdC5jYWxsYmFja3Mub25Db250ZXh0TG9zdCk7YnJlYWt9fXRoaXMucmVuZGVyZXIuc2V0VXNlRGFya01vZGUodC51c2VEYXJrTW9kZSksdGhpcy5zZXJpZXNMaW5lVmlldz1uZXcgTXV0KHtyZW5kZXJlcjp0aGlzLnJlbmRlcmVyLGNvb3JkaW5hdG9yOnRoaXMuY29vcmRpbmF0b3IsZ2V0TWV0YWRhdGFNYXA6KCk9PnRoaXMubWV0YWRhdGFNYXB9KSx0aGlzLnJlc2l6ZSh0LmRvbURpbWVuc2lvbil9ZGlzcG9zZSgpe31zZXRYU2NhbGVUeXBlKHQpe3RoaXMuY29vcmRpbmF0b3Iuc2V0WFNjYWxlKCRvdCh0KSksdGhpcy5zY2hlZHVsZVJlcGFpbnQoKX1zZXRZU2NhbGVUeXBlKHQpe3RoaXMuY29vcmRpbmF0b3Iuc2V0WVNjYWxlKCRvdCh0KSksdGhpcy5zY2hlZHVsZVJlcGFpbnQoKX1yZXNpemUodCl7dGhpcy5jb29yZGluYXRvci5zZXREb21Db250YWluZXJSZWN0KE9iamVjdC5hc3NpZ24oe3g6MCx5OjB9LHQpKSx0aGlzLnJlbmRlcmVyLm9uUmVzaXplKE9iamVjdC5hc3NpZ24oe3g6MCx5OjB9LHQpKSx0aGlzLnNlcmllc0xpbmVWaWV3LnNldExheW91dFJlY3QoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHt4OjAseTowfSkpLHRoaXMuc2NoZWR1bGVSZXBhaW50KCl9c2V0TWV0YWRhdGEodCl7bGV0IGU9ITE7T2JqZWN0LmVudHJpZXModCkuZm9yRWFjaCgoKFt0LG5dKT0+e2NvbnN0IG89dGhpcy5tZXRhZGF0YU1hcFt0XTtvJiZuLmNvbG9yPT09by5jb2xvciYmbi52aXNpYmxlPT09by52aXNpYmxlJiZuLm9wYWNpdHk9PT1vLm9wYWNpdHl8fChlPSEwKSx0aGlzLm1ldGFkYXRhTWFwW3RdPW59KSksZSYmdGhpcy5zZXJpZXNMaW5lVmlldy5tYXJrQXNQYWludERpcnR5KCksdGhpcy5zY2hlZHVsZVJlcGFpbnQoKX1zZXRWaWV3Qm94KHQpe3RoaXMuY29vcmRpbmF0b3Iuc2V0Vmlld0JveFJlY3Qoe3g6dC54WzBdLHdpZHRoOnQueFsxXS10LnhbMF0seTp0LnlbMF0saGVpZ2h0OnQueVsxXS10LnlbMF19KSx0aGlzLnNjaGVkdWxlUmVwYWludCgpfXNldERhdGEodCl7dGhpcy5zZXJpZXNMaW5lVmlldy5zZXREYXRhKHQpLHRoaXMuc2NoZWR1bGVSZXBhaW50KCl9c2V0VXNlRGFya01vZGUodCl7dGhpcy5yZW5kZXJlci5zZXRVc2VEYXJrTW9kZSh0KSx0aGlzLnNjaGVkdWxlUmVwYWludCgpfXNjaGVkdWxlUmVwYWludCgpe3RoaXMuc2hvdWxkUmVwYWludHx8KHRoaXMuc2hvdWxkUmVwYWludD0hMCxzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKCk9Pnt0aGlzLnJlcGFpbnQoKSx0aGlzLnNob3VsZFJlcGFpbnQ9ITF9KSkpfXJlcGFpbnQoKXt0aGlzLnNlcmllc0xpbmVWaWV3LnJlbmRlcigpLHRoaXMucmVuZGVyZXIuZmx1c2goKSx0aGlzLmNhbGxiYWNrcy5vbkRyYXdFbmQoKX19ZnVuY3Rpb24gT3V0KHQpe2lmKHQuaW5jbHVkZXMoIi8iKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiV29ya2VyIGZhY3Rvcnkgb25seSBhbGxvd3MgZmlsZSBuYW1lIGFuZCBubyByZXNvdXJjZSBwYXRoLiIpO3JldHVybiBuZXcgV29ya2VyKHQpfSEoZnVuY3Rpb24odCl7dFt0LlNFUklFU19EQVRBX1VQREFURUQ9MF09IlNFUklFU19EQVRBX1VQREFURUQiLHRbdC5TRVJJRVNfTUVUQURBVEFfQ0hBTkdFRD0xXT0iU0VSSUVTX01FVEFEQVRBX0NIQU5HRUQiLHRbdC5TQ0FMRV9VUERBVEVEPTJdPSJTQ0FMRV9VUERBVEVEIix0W3QuVklFV19CT1hfVVBEQVRFRD0zXT0iVklFV19CT1hfVVBEQVRFRCIsdFt0LklOSVQ9NF09IklOSVQiLHRbdC5ET01fUkVTSVpFRD01XT0iRE9NX1JFU0laRUQiLHRbdC5EQVJLX01PREVfVVBEQVRFRD02XT0iREFSS19NT0RFX1VQREFURUQifSkodXV0fHwodXV0PXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5PTl9SRURSQVdfRU5EPTBdPSJPTl9SRURSQVdfRU5EIix0W3QuT05fQ09OVEVYVF9MT1NUPTFdPSJPTl9DT05URVhUX0xPU1QifSkoZnV0fHwoZnV0PXt9KSk7Y2xhc3MgUHV0e2NvbnN0cnVjdG9yKHQpe2lmKHRoaXMuY2FsbGJhY2tzPXQuY2FsbGJhY2tzLHQudHlwZSE9PUsyLldFQkdMKXRocm93IG5ldyBSYW5nZUVycm9yKGBDYW5ub3QgdXNlIG5vbiBXRUJHTCByZW5kZXJlciBmb3IgdGhlIG9mZnNjcmVlbiBsaW5lIGNoYXJ0LiBSZWNlaXZlZCAke0syW3QudHlwZV19IGApO2NvbnN0IGU9bmV3IE1lc3NhZ2VDaGFubmVsO2UucG9ydDEub25tZXNzYWdlPXQ9Pnt0aGlzLm9uTWVzc2FnZUZyb21Xb3JrZXIodC5kYXRhKX0sdGhpcy50eE1lc3NhZ2VQb3J0PWUucG9ydDE7Y29uc3Qgbj10LmNvbnRhaW5lci50cmFuc2ZlckNvbnRyb2xUb09mZnNjcmVlbigpO3RoaXMud29ya2VySW5zdGFuY2U9UHV0LndvcmtlclBvb2wuZ2V0TmV4dCgpO2NvbnN0IG89e3R5cGU6dXV0LklOSVQsY2FudmFzOm4sZGV2aWNlUGl4ZWxSYXRpbzp3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxkaW06dC5kb21EaW1lbnNpb24scmVuZGVyZXJUeXBlOnQudHlwZSx1c2VEYXJrTW9kZTp0LnVzZURhcmtNb2RlfTt0aGlzLndvcmtlckluc3RhbmNlLnBvc3RNZXNzYWdlKG8sW24sZS5wb3J0Ml0pfWRpc3Bvc2UoKXt0aGlzLndvcmtlckluc3RhbmNlLmZyZWUoKSx0aGlzLnR4TWVzc2FnZVBvcnQuY2xvc2UoKX1zZXRYU2NhbGVUeXBlKHQpe3RoaXMuc2VuZE1lc3NhZ2Uoe3R5cGU6dXV0LlNDQUxFX1VQREFURUQsYXhpczoieCIsc2NhbGVUeXBlOnR9KX1zZXRZU2NhbGVUeXBlKHQpe3RoaXMuc2VuZE1lc3NhZ2Uoe3R5cGU6dXV0LlNDQUxFX1VQREFURUQsYXhpczoieSIsc2NhbGVUeXBlOnR9KX1yZXNpemUodCl7dGhpcy5zZW5kTWVzc2FnZSh7dHlwZTp1dXQuRE9NX1JFU0laRUQsZGltOnR9KX1zZXRNZXRhZGF0YSh0KXt0aGlzLnNlbmRNZXNzYWdlKHt0eXBlOnV1dC5TRVJJRVNfTUVUQURBVEFfQ0hBTkdFRCxtZXRhZGF0YTp0fSl9c2V0Vmlld0JveCh0KXt0aGlzLnNlbmRNZXNzYWdlKHt0eXBlOnV1dC5WSUVXX0JPWF9VUERBVEVELGV4dGVudDp0fSl9c2V0RGF0YSh0KXtjb25zdCBlPShmdW5jdGlvbiBuKHQpe2NvbnN0IGU9dC5yZWR1Y2UoKCh0LGUpPT50K2UucG9pbnRzLmxlbmd0aCksMCk7bGV0IG49MDtjb25zdCBvPW5ldyBGbG9hdDY0QXJyYXkoMiplKSxpPVtdO2Zvcihjb25zdCBlIG9mIHQpe2kucHVzaCh7aWQ6ZS5pZCxsZW5ndGg6ZS5wb2ludHMubGVuZ3RofSk7Zm9yKGxldCB0PTA7dDxlLnBvaW50cy5sZW5ndGg7dCsrKW9bbisrXT1lLnBvaW50c1t0XS54LG9bbisrXT1lLnBvaW50c1t0XS55fXJldHVybntpZHNBbmRMZW5ndGhzOmksZmxhdHRlbmVkU2VyaWVzOm8uYnVmZmVyfX0pKHQpO3RoaXMuc2VuZE1lc3NhZ2Uoe3R5cGU6dXV0LlNFUklFU19EQVRBX1VQREFURUQsY29tcGFjdERhdGFTZXJpZXM6ZX0sW2UuZmxhdHRlbmVkU2VyaWVzXSl9c2V0VXNlRGFya01vZGUodCl7dGhpcy5zZW5kTWVzc2FnZSh7dHlwZTp1dXQuREFSS19NT0RFX1VQREFURUQsdXNlRGFya01vZGU6dH0pfXNlbmRNZXNzYWdlKHQsZSl7ZT90aGlzLnR4TWVzc2FnZVBvcnQucG9zdE1lc3NhZ2UodCxlKTp0aGlzLnR4TWVzc2FnZVBvcnQucG9zdE1lc3NhZ2UodCl9b25NZXNzYWdlRnJvbVdvcmtlcih0KXtzd2l0Y2godC50eXBlKXtjYXNlIGZ1dC5PTl9SRURSQVdfRU5EOnRoaXMuY2FsbGJhY2tzLm9uRHJhd0VuZCgpO2JyZWFrO2Nhc2UgZnV0Lk9OX0NPTlRFWFRfTE9TVDp0aGlzLmNhbGxiYWNrcy5vbkNvbnRleHRMb3N0KCl9fX1mdW5jdGlvbiB3dXQodCxlKXtyZXR1cm4ieCI9PT1lP1swLHQud2lkdGhdOlt0LmhlaWdodCwwXX1mdW5jdGlvbiBrdXQodCxlKXtjb25zdCBuPU1hdGguZmxvb3IodC81MCk7cmV0dXJuIE1hdGgubWluKG4sZSl9ZnVuY3Rpb24gU3V0KHQsZSl7aWYoMSZ0JiYocWkoKSxUbSgwLCJsaW5lIiwyKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oKTtwdSgiemVybyIsMD09PXQpLGpwKCJ4MSIsbi5nZXREb21YKHQpKSgieDIiLG4uZ2V0RG9tWCh0KSkoInkyIixuLmRvbURpbS5oZWlnaHQpfX1mdW5jdGlvbiBEdXQodCxlKXtpZigxJnQmJihxaSgpLFRtKDAsImxpbmUiLDMpKSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQsbj1ZbSgpO3B1KCJ6ZXJvIiwwPT09dCksanAoInkxIixuLmdldERvbVkodCkpKCJ4MiIsbi5kb21EaW0ud2lkdGgpKCJ5MiIsbi5nZXREb21ZKHQpKX19UHV0LndvcmtlclBvb2w9bmV3IGNsYXNze2NvbnN0cnVjdG9yKHQsZT0xMCxuPU91dCl7dGhpcy53b3JrZXJSZXNvdXJjZVBhdGg9dCx0aGlzLm1heFBvb2xTaXplPWUsdGhpcy53b3JrZXJGYWN0b3J5PW4sdGhpcy53b3JrZXJzPVtdfWdldE5leHQoKXtsZXQgdDtpZih0aGlzLndvcmtlcnMuZXZlcnkoKCh7YWN0aXZlQ291bnQ6dH0pPT50PjApKSYmdGhpcy53b3JrZXJzLmxlbmd0aDx0aGlzLm1heFBvb2xTaXplKXtjb25zdCBlPXRoaXMud29ya2VyRmFjdG9yeSh0aGlzLndvcmtlclJlc291cmNlUGF0aCk7dD17YWN0aXZlQ291bnQ6MCxwb3N0TWVzc2FnZToodCxuKT0+e2UucG9zdE1lc3NhZ2UodCxuKX0sZnJlZTooKT0+e3QuYWN0aXZlQ291bnQ9TWF0aC5tYXgodC5hY3RpdmVDb3VudC0xLDApfX0sdGhpcy53b3JrZXJzLnB1c2godCl9ZWxzZXtjb25zdCBlPXRoaXMud29ya2Vycy5tYXAoKCh7YWN0aXZlQ291bnQ6dH0pPT50KSksbj1lLmluZGV4T2YoTWF0aC5taW4oLi4uZSkpO3Q9dGhpcy53b3JrZXJzW25dfXJldHVybiB0LmFjdGl2ZUNvdW50KyssdH19KCJjaGFydF93b3JrZXIuanM/X2ZpbGVfaGFzaD0yNTMzODA2NSIpO2NsYXNzIEV1dHtnZXREb21YKHQpe3JldHVybiB0aGlzLnhTY2FsZS5mb3J3YXJkKHRoaXMudmlld0V4dGVudC54LHd1dCh0aGlzLmRvbURpbSwieCIpLHQpfWdldERvbVkodCl7cmV0dXJuIHRoaXMueVNjYWxlLmZvcndhcmQodGhpcy52aWV3RXh0ZW50Lnksd3V0KHRoaXMuZG9tRGltLCJ5IiksdCl9Z2V0WFRpY2tzKCl7cmV0dXJuIHRoaXMueFNjYWxlLnRpY2tzKHRoaXMudmlld0V4dGVudC54LGt1dCh0aGlzLmRvbURpbS53aWR0aCx0aGlzLnhHcmlkQ291bnQpKX1nZXRZVGlja3MoKXtyZXR1cm4gdGhpcy55U2NhbGUudGlja3ModGhpcy52aWV3RXh0ZW50Lnksa3V0KHRoaXMuZG9tRGltLmhlaWdodCx0aGlzLnlHcmlkQ291bnQpKX19ZnVuY3Rpb24gUnV0KHQsZSxuLG8saSxhKXtsZXQgcjtzd2l0Y2godC5kZWx0YU1vZGUpe2Nhc2UgV2hlZWxFdmVudC5ET01fREVMVEFfUElYRUw6cj0xO2JyZWFrO2Nhc2UgV2hlZWxFdmVudC5ET01fREVMVEFfTElORTpyPTg7YnJlYWs7Y2FzZSBXaGVlbEV2ZW50LkRPTV9ERUxUQV9QQUdFOnI9MjA7YnJlYWs7ZGVmYXVsdDpyPTEsY29uc29sZS53YXJuKGBVbmtub3duIFdoZWVsRXZlbnQgZGVsdGFNb2RlOiAke3QuZGVsdGFNb2RlfS5gKX1jb25zdCBzPXQuZGVsdGFZKnIsbD1zPDA/TWF0aC5tYXgocypvLC0uOTUpOnMqbyx7d2lkdGg6YyxoZWlnaHQ6ZH09bixwPVtpLnJldmVyc2UoZS54LFswLGNdLC10Lm9mZnNldFgqbCksaS5yZXZlcnNlKGUueCxbMCxjXSxjKyhjLXQub2Zmc2V0WCkqbCldLG09W2EucmV2ZXJzZShlLnksW2QsMF0sLXQub2Zmc2V0WSpsKSxhLnJldmVyc2UoZS55LFtkLDBdLGQrKGQtdC5vZmZzZXRZKSpsKV07cmV0dXJue3g6cFsxXTxwWzBdP1twWzFdLHBbMF1dOnAseTptWzFdPG1bMF0/W21bMV0sbVswXV06bX19RXV0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxFdXQpfSxFdXQuybVjbXA9dG8oe3R5cGU6RXV0LHNlbGVjdG9yczpbWyJsaW5lLWNoYXJ0LWdyaWQtdmlldyJdXSxpbnB1dHM6e3ZpZXdFeHRlbnQ6InZpZXdFeHRlbnQiLHhTY2FsZToieFNjYWxlIix4R3JpZENvdW50OiJ4R3JpZENvdW50Iix5U2NhbGU6InlTY2FsZSIseUdyaWRDb3VudDoieUdyaWRDb3VudCIsZG9tRGltOiJkb21EaW0ifSxkZWNsczozLHZhcnM6Mixjb25zdHM6W1sieTEiLCIwIiwzLCJ6ZXJvIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbIngxIiwiMCIsMywiemVybyIsNCwibmdGb3IiLCJuZ0Zvck9mIl0sWyJ5MSIsIjAiXSxbIngxIiwiMCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYocWkoKSxSbSgwLCJzdmciKSxRcCgxLFN1dCwxLDUsImxpbmUiLDApLFFwKDIsRHV0LDEsNSwibGluZSIsMSksQW0oKSksMiZlJiYocmMoMSksRG0oIm5nRm9yT2YiLG4uZ2V0WFRpY2tzKCkpLHJjKDEpLERtKCJuZ0Zvck9mIixuLmdldFlUaWNrcygpKSl9LGRpcmVjdGl2ZXM6W2xNXSxzdHlsZXM6WyJbX25naG9zdC0lQ09NUCVdIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIH1cblxuICAgICAgc3ZnW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB9XG5cbiAgICAgIGxpbmVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgc3Ryb2tlOiAjY2NjO1xuICAgICAgICBzdHJva2Utd2lkdGg6IDFweDtcbiAgICAgIH1cblxuICAgICAgLnplcm9bX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgc3Ryb2tlOiAjYWFhO1xuICAgICAgICBzdHJva2Utd2lkdGg6IDEuNXB4O1xuICAgICAgfSJdLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChFdXQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibGluZS1jaGFydC1ncmlkLXZpZXciLHRlbXBsYXRlOic8c3ZnPlxuICAgIDxsaW5lXG4gICAgICAqbmdGb3I9ImxldCB0aWNrIG9mIGdldFhUaWNrcygpIlxuICAgICAgW2NsYXNzLnplcm9dPSJ0aWNrID09PSAwIlxuICAgICAgW2F0dHIueDFdPSJnZXREb21YKHRpY2spIlxuICAgICAgeTE9IjAiXG4gICAgICBbYXR0ci54Ml09ImdldERvbVgodGljaykiXG4gICAgICBbYXR0ci55Ml09ImRvbURpbS5oZWlnaHQiXG4gICAgPjwvbGluZT5cbiAgICA8bGluZVxuICAgICAgKm5nRm9yPSJsZXQgdGljayBvZiBnZXRZVGlja3MoKSJcbiAgICAgIFtjbGFzcy56ZXJvXT0idGljayA9PT0gMCJcbiAgICAgIHgxPSIwIlxuICAgICAgW2F0dHIueTFdPSJnZXREb21ZKHRpY2spIlxuICAgICAgW2F0dHIueDJdPSJkb21EaW0ud2lkdGgiXG4gICAgICBbYXR0ci55Ml09ImdldERvbVkodGljaykiXG4gICAgPjwvbGluZT5cbiAgPC9zdmc+JyxzdHlsZXM6WyJcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIH1cblxuICAgICAgc3ZnIHtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH1cblxuICAgICAgbGluZSB7XG4gICAgICAgIHN0cm9rZTogI2NjYztcbiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxcHg7XG4gICAgICB9XG5cbiAgICAgIC56ZXJvIHtcbiAgICAgICAgc3Ryb2tlOiAjYWFhO1xuICAgICAgICBzdHJva2Utd2lkdGg6IDEuNXB4O1xuICAgICAgfVxuICAgICJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse3ZpZXdFeHRlbnQ6W3t0eXBlOnh5fV0seFNjYWxlOlt7dHlwZTp4eX1dLHhHcmlkQ291bnQ6W3t0eXBlOnh5fV0seVNjYWxlOlt7dHlwZTp4eX1dLHlHcmlkQ291bnQ6W3t0eXBlOnh5fV0sZG9tRGltOlt7dHlwZTp4eX1dfSk7Y29uc3QgQXV0PVsiZG90cyJdO2Z1bmN0aW9uIFR1dCh0LGUpe2lmKDEmdCYmKHFpKCksVG0oMCwiY2lyY2xlIiwxMikpLDImdCl7Y29uc3QgdD1ZbSgpLiRpbXBsaWNpdCxlPVltKDIpO2pwKCJjeCIsZS5nZXREb21YKHQucG9pbnQueCkpKCJjeSIsZS5nZXREb21ZKHQucG9pbnQueSkpKCJmaWxsIix0Lm1ldGFkYXRhLmNvbG9yKX19ZnVuY3Rpb24gTnV0KHQsZSl7aWYoMSZ0JiYocWkoKSxObSgwKSxRcCgxLFR1dCwxLDMsImNpcmNsZSIsMTEpLHptKCkpLDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdCxuPVltKDIpO3JjKDEpLERtKCJuZ0lmIixuLnNob3VsZFJlbmRlclRvb2x0aXBQb2ludCh0LnBvaW50KSl9fWZ1bmN0aW9uIHp1dCh0LGUpe2lmKDEmdCYmKHFpKCksTm0oMCksUXAoMSxOdXQsMiwxLCJuZy1jb250YWluZXIiLDEwKSx6bSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtyYygxKSxEbSgibmdGb3JPZiIsdC5jdXJzb3JlZERhdGEpKCJuZ0ZvclRyYWNrQnkiLHQudHJhY2tCeVNlcmllc05hbWUpfX1mdW5jdGlvbiBJdXQodCxlKXtpZigxJnQmJihxaSgpLFRtKDAsInJlY3QiLDEzKSksMiZ0KXtjb25zdCB0PVltKCk7anAoIngiLHQuem9vbUJveEluVWlDb29yZGluYXRlLngpKCJ3aWR0aCIsdC56b29tQm94SW5VaUNvb3JkaW5hdGUud2lkdGgpKCJ5Iix0Lnpvb21Cb3hJblVpQ29vcmRpbmF0ZS55KSgiaGVpZ2h0Iix0Lnpvb21Cb3hJblVpQ29vcmRpbmF0ZS5oZWlnaHQpfX1jb25zdCBIdXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm57ZGF0YTp0LGN1cnNvckxvY2F0aW9uSW5EYXRhQ29vcmQ6ZX19O2Z1bmN0aW9uIEZ1dCh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsMTQpLEltKDEsMTUpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpLGU9JHAoMTEpO3JjKDEpLERtKCJuZ1RlbXBsYXRlT3V0bGV0Iix0LnRvb2x0aXBUZW1wbGF0ZT90LnRvb2x0aXBUZW1wbGF0ZTplKSgibmdUZW1wbGF0ZU91dGxldENvbnRleHQiLHZoKDIsSHV0LHQuY3Vyc29yZWREYXRhLHQuY3Vyc29yTG9jYXRpb25JbkRhdGFDb29yZCkpfX1mdW5jdGlvbiBMdXQodCxlKXtpZigxJnQmJihObSgwKSxSbSgxLCJ0ciIsMTcpLFJtKDIsInRkIiwxOCksVG0oMywic3BhbiIpLEFtKCksUm0oNCwidGQiLDE5KSxrdSg1KSxBbSgpLFJtKDYsInRkIiksa3UoNyksQW0oKSxSbSg4LCJ0ZCIpLGt1KDkpLEFtKCksQW0oKSx6bSgpKSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQ7cmMoMyksZHUoImJhY2tncm91bmQtY29sb3IiLHQubWV0YWRhdGEuY29sb3IpLHJjKDIpLFN1KHQubWV0YWRhdGEuZGlzcGxheU5hbWUpLHJjKDIpLFN1KHQucG9pbnQueSkscmMoMiksU3UodC5wb2ludC54KX19ZnVuY3Rpb24gQnV0KHQsZSl7aWYoMSZ0JiYoUm0oMCwidGFibGUiKSxSbSgxLCJ0aGVhZCIpLFJtKDIsInRyIiksVG0oMywidGgiLDE2KSxSbSg0LCJ0aCIpLGt1KDUsIk5hbWUiKSxBbSgpLFJtKDYsInRoIiksa3UoNywiWSIpLEFtKCksUm0oOCwidGgiKSxrdSg5LCJYIiksQW0oKSxBbSgpLEFtKCksUm0oMTAsInRib2R5IiksUXAoMTEsTHV0LDEwLDUsIm5nLWNvbnRhaW5lciIsMTApLEFtKCksQW0oKSksMiZ0KXtjb25zdCB0PWUuZGF0YSxuPVltKCk7cmMoMTEpLERtKCJuZ0Zvck9mIix0KSgibmdGb3JUcmFja0J5IixuLnRyYWNrQnlTZXJpZXNOYW1lKX19dmFyIFZ1dDtmdW5jdGlvbiBqdXQodCl7cmV0dXJuIHQuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKCl9IShmdW5jdGlvbih0KXt0W3QuTk9ORT0wXT0iTk9ORSIsdFt0LkRSQUdfWk9PTUlORz0xXT0iRFJBR19aT09NSU5HIix0W3QuU0NST0xMX1pPT01JTkc9Ml09IlNDUk9MTF9aT09NSU5HIix0W3QuUEFOTklORz0zXT0iUEFOTklORyJ9KShWdXR8fChWdXQ9e30pKTtjbGFzcyBVdXR7Y29uc3RydWN0b3IodCxlKXt0aGlzLmNoYW5nZURldGVjdG9yPXQsdGhpcy5zY3JvbGxTdHJhdGVneT1lLHRoaXMub25WaWV3RXh0ZW50Q2hhbmdlPW5ldyBMaCx0aGlzLm9uVmlld0V4dGVudFJlc2V0PW5ldyBMaCx0aGlzLkludGVyYWN0aW9uU3RhdGU9VnV0LHRoaXMuc3RhdGU9VnV0Lk5PTkUsdGhpcy5zcGVjaWFsS2V5UHJlc3NlZD0hMSx0aGlzLnpvb21Cb3hJblVpQ29vcmRpbmF0ZT17eDowLHdpZHRoOjAsaGVpZ2h0OjAseTowfSx0aGlzLnRvb2x0aXBQb3NpdGlvbnM9W3tvZmZzZXRZOjUsb3JpZ2luWDoic3RhcnQiLG92ZXJsYXlYOiJzdGFydCIsb3JpZ2luWToiYm90dG9tIixvdmVybGF5WToidG9wIn0se29mZnNldFk6NSxvcmlnaW5YOiJlbmQiLG92ZXJsYXlYOiJlbmQiLG9yaWdpblk6ImJvdHRvbSIsb3ZlcmxheVk6InRvcCJ9LHtvZmZzZXRZOi0xNSxvcmlnaW5YOiJzdGFydCIsb3ZlcmxheVg6InN0YXJ0IixvcmlnaW5ZOiJ0b3AiLG92ZXJsYXlZOiJib3R0b20ifSx7b2Zmc2V0WTotMTUsb3JpZ2luWDoiZW5kIixvdmVybGF5WDoiZW5kIixvcmlnaW5ZOiJ0b3AiLG92ZXJsYXlZOiJib3R0b20ifSx7b2Zmc2V0WDo1LG9yaWdpblg6ImVuZCIsb3ZlcmxheVg6InN0YXJ0IixvcmlnaW5ZOiJ0b3AiLG92ZXJsYXlZOiJ0b3AifSx7b2Zmc2V0WDotNSxvcmlnaW5YOiJzdGFydCIsb3ZlcmxheVg6ImVuZCIsb3JpZ2luWToidG9wIixvdmVybGF5WToidG9wIn1dLHRoaXMuY3Vyc29yTG9jYXRpb25JbkRhdGFDb29yZD1udWxsLHRoaXMuY3Vyc29yZWREYXRhPVtdLHRoaXMudG9vbHRpcERpc3BsYXlBdHRhY2hlZD0hMSx0aGlzLnNob3dab29tSW5zdHJ1Y3Rpb249ITEsdGhpcy5kcmFnU3RhcnRDb29yZD1udWxsLHRoaXMuaXNDdXJzb3JJbnNpZGU9ITEsdGhpcy5uZ1Vuc3Vic2NyaWJlPW5ldyBJfW5nQWZ0ZXJWaWV3SW5pdCgpe29lKHRoaXMuZG90c0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LCJkYmxjbGljayIse3Bhc3NpdmU6ITB9KS5waXBlKEllKHRoaXMubmdVbnN1YnNjcmliZSkpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLm9uVmlld0V4dGVudFJlc2V0LmVtaXQoKSx0aGlzLnN0YXRlPVZ1dC5OT05FLHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCl9KSksb2Uod2luZG93LCJrZXlkb3duIix7cGFzc2l2ZTohMH0pLnBpcGUoSWUodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKCh0PT57Y29uc3QgZT10aGlzLnNob3VsZFBhbih0KTtlIT09dGhpcy5zcGVjaWFsS2V5UHJlc3NlZCYmKHRoaXMuc3BlY2lhbEtleVByZXNzZWQ9ZSx0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpKX0pKSxvZSh3aW5kb3csImtleXVwIix7cGFzc2l2ZTohMH0pLnBpcGUoSWUodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKCh0PT57Y29uc3QgZT10aGlzLnNob3VsZFBhbih0KTtlIT09dGhpcy5zcGVjaWFsS2V5UHJlc3NlZCYmKHRoaXMuc3BlY2lhbEtleVByZXNzZWQ9ZSx0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpKX0pKSxvZSh0aGlzLmRvdHNDb250YWluZXIubmF0aXZlRWxlbWVudCwibW91c2Vkb3duIix7cGFzc2l2ZTohMH0pLnBpcGUoSWUodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKCh0PT57Y29uc3QgZT10aGlzLnN0YXRlLG49dGhpcy5zaG91bGRQYW4odCk/VnV0LlBBTk5JTkc6VnV0LkRSQUdfWk9PTUlORztlPT09VnV0Lk5PTkUmJm49PT1WdXQuRFJBR19aT09NSU5HJiYodGhpcy5kcmFnU3RhcnRDb29yZD17eDp0Lm9mZnNldFgseTp0Lm9mZnNldFl9LHRoaXMuem9vbUJveEluVWlDb29yZGluYXRlPXt4OnQub2Zmc2V0WCx3aWR0aDowLHk6dC5vZmZzZXRZLGhlaWdodDowfSksZSE9PW4mJih0aGlzLnN0YXRlPW4sdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKSl9KSksb2UodGhpcy5kb3RzQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsIm1vdXNldXAiLHtwYXNzaXZlOiEwfSkucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpKS5zdWJzY3JpYmUoKHQ9Pntjb25zdCBlPSh0LmJ1dHRvbnMmZ1EuTEVGVCk9PT1nUS5MRUZUO3RoaXMuZHJhZ1N0YXJ0Q29vcmQ9bnVsbDtjb25zdCBuPXRoaXMuem9vbUJveEluVWlDb29yZGluYXRlO2lmKCFlJiZ0aGlzLnN0YXRlPT09VnV0LkRSQUdfWk9PTUlORyYmbi53aWR0aD4wJiZuLmhlaWdodD4wKXtjb25zdCB0PXRoaXMuZ2V0RGF0YVgobi54KSxlPXRoaXMuZ2V0RGF0YVgobi54K24ud2lkdGgpLG89dGhpcy5nZXREYXRhWShuLnkrbi5oZWlnaHQpLGk9dGhpcy5nZXREYXRhWShuLnkpO3RoaXMub25WaWV3RXh0ZW50Q2hhbmdlLmVtaXQoe2RhdGFFeHRlbnQ6e3g6W3QsZV0seTpbbyxpXX19KX10aGlzLnN0YXRlIT09VnV0Lk5PTkUmJih0aGlzLnN0YXRlPVZ1dC5OT05FLHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCkpfSkpLG9lKHRoaXMuZG90c0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LCJtb3VzZWVudGVyIix7cGFzc2l2ZTohMH0pLnBpcGUoSWUodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKCh0PT57dGhpcy5pc0N1cnNvckluc2lkZT0hMCx0aGlzLnVwZGF0ZVRvb2x0aXAodCksdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKX0pKSxvZSh0aGlzLmRvdHNDb250YWluZXIubmF0aXZlRWxlbWVudCwibW91c2VsZWF2ZSIse3Bhc3NpdmU6ITB9KS5waXBlKEllKHRoaXMubmdVbnN1YnNjcmliZSkpLnN1YnNjcmliZSgodD0+e3RoaXMuZHJhZ1N0YXJ0Q29vcmQ9bnVsbCx0aGlzLmlzQ3Vyc29ySW5zaWRlPSExLHRoaXMudXBkYXRlVG9vbHRpcCh0KSx0aGlzLnN0YXRlPVZ1dC5OT05FLHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCl9KSksb2UodGhpcy5kb3RzQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsIm1vdXNlbW92ZSIse3Bhc3NpdmU6ITB9KS5waXBlKEllKHRoaXMubmdVbnN1YnNjcmliZSkpLnN1YnNjcmliZSgodD0+e3N3aXRjaCh0aGlzLnN0YXRlKXtjYXNlIFZ1dC5TQ1JPTExfWk9PTUlORzp0aGlzLnN0YXRlPVZ1dC5OT05FLHRoaXMudXBkYXRlVG9vbHRpcCh0KSx0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO2JyZWFrO2Nhc2UgVnV0Lk5PTkU6dGhpcy51cGRhdGVUb29sdGlwKHQpLHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7YnJlYWs7Y2FzZSBWdXQuUEFOTklORzp7Y29uc3QgZT0tdC5tb3ZlbWVudFgsbj0tdC5tb3ZlbWVudFkse3dpZHRoOm8saGVpZ2h0Oml9PXRoaXMuZG9tRGltLGE9dGhpcy5nZXREYXRhWChlKSxyPXRoaXMuZ2V0RGF0YVgobytlKSxzPXRoaXMuZ2V0RGF0YVkoaStuKSxsPXRoaXMuZ2V0RGF0YVkobik7dGhpcy5vblZpZXdFeHRlbnRDaGFuZ2UuZW1pdCh7ZGF0YUV4dGVudDp7eDpbYSxyXSx5OltzLGxdfX0pO2JyZWFrfWNhc2UgVnV0LkRSQUdfWk9PTUlORzp7aWYoIXRoaXMuZHJhZ1N0YXJ0Q29vcmQpYnJlYWs7Y29uc3QgZT1bdGhpcy5kcmFnU3RhcnRDb29yZC54LHQub2Zmc2V0WF0sbj1bdGhpcy5kcmFnU3RhcnRDb29yZC55LHQub2Zmc2V0WV07dGhpcy56b29tQm94SW5VaUNvb3JkaW5hdGU9e3g6TWF0aC5taW4oLi4uZSksd2lkdGg6TWF0aC5tYXgoLi4uZSktTWF0aC5taW4oLi4uZSkseTpNYXRoLm1pbiguLi5uKSxoZWlnaHQ6TWF0aC5tYXgoLi4ubiktTWF0aC5taW4oLi4ubil9fXRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCl9fSkpLG9lKHRoaXMuZG90c0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LCJ3aGVlbCIse3Bhc3NpdmU6ITF9KS5waXBlKEllKHRoaXMubmdVbnN1YnNjcmliZSksemUoKHQ9Pntjb25zdCBlPSF0LmN0cmxLZXkmJiF0LnNoaWZ0S2V5JiZ0LmFsdEtleTtyZXR1cm4gdGhpcy5zaG93Wm9vbUluc3RydWN0aW9uPSFlLHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCksZT8odC5wcmV2ZW50RGVmYXVsdCgpLEV0KHQpKTphZSgzZTMpLnBpcGUoRmUoKCgpPT57dGhpcy5zaG93Wm9vbUluc3RydWN0aW9uPSExLHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCl9KSksSXQoKCgpPT5udWxsKSkpfSkpLGNlKCh0PT5Cb29sZWFuKHQpKSkpLnN1YnNjcmliZSgodD0+e3RoaXMub25WaWV3RXh0ZW50Q2hhbmdlLmVtaXQoe2RhdGFFeHRlbnQ6UnV0KHQsdGhpcy52aWV3RXh0ZW50LHRoaXMuZG9tRGltLC4wMSx0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSl9KSx0aGlzLnN0YXRlIT09VnV0LlNDUk9MTF9aT09NSU5HJiYodGhpcy5zdGF0ZT1WdXQuU0NST0xMX1pPT01JTkcsdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKSl9KSl9bmdPbkNoYW5nZXMoKXt0aGlzLnVwZGF0ZUN1cnNvcmVkRGF0YUFuZFRvb2x0aXBWaXNpYmlsaXR5KCl9bmdPbkRlc3Ryb3koKXt0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpLHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpfXNob3VsZFBhbih0KXtjb25zdCBlPXQuc2hpZnRLZXl8fHQuYWx0S2V5O2lmKHQgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50KXJldHVybiBlO2NvbnN0IG49KHQuYnV0dG9ucyZnUS5MRUZUKT09PWdRLkxFRlQsbz0odC5idXR0b25zJmdRLk1JRERMRSk9PT1nUS5NSURETEU7cmV0dXJuISghbiYmIW8pJiYobyYmIW58fGUpfXRyYWNrQnlTZXJpZXNOYW1lKHQsZSl7cmV0dXJuIGUuaWR9Z2V0RG9tWCh0KXtyZXR1cm4gdGhpcy54U2NhbGUuZm9yd2FyZCh0aGlzLnZpZXdFeHRlbnQueCx3dXQodGhpcy5kb21EaW0sIngiKSx0KX1nZXREYXRhWCh0KXtyZXR1cm4gdGhpcy54U2NhbGUucmV2ZXJzZSh0aGlzLnZpZXdFeHRlbnQueCx3dXQodGhpcy5kb21EaW0sIngiKSx0KX1nZXREb21ZKHQpe3JldHVybiB0aGlzLnlTY2FsZS5mb3J3YXJkKHRoaXMudmlld0V4dGVudC55LHd1dCh0aGlzLmRvbURpbSwieSIpLHQpfWdldERhdGFZKHQpe3JldHVybiB0aGlzLnlTY2FsZS5yZXZlcnNlKHRoaXMudmlld0V4dGVudC55LHd1dCh0aGlzLmRvbURpbSwieSIpLHQpfXNob3VsZFJlbmRlclRvb2x0aXBQb2ludCh0KXtyZXR1cm4gbnVsbCE9PXQmJiFpc05hTih0LngpJiYhaXNOYU4odC55KX11cGRhdGVUb29sdGlwKHQpe3RoaXMuY3Vyc29yTG9jYXRpb25JbkRhdGFDb29yZD17eDp0aGlzLmdldERhdGFYKHQub2Zmc2V0WCkseTp0aGlzLmdldERhdGFZKHQub2Zmc2V0WSl9LHRoaXMudXBkYXRlQ3Vyc29yZWREYXRhQW5kVG9vbHRpcFZpc2liaWxpdHkoKX1vblRvb2x0aXBEaXNwbGF5RGV0YWNoZWQoKXt0aGlzLnRvb2x0aXBEaXNwbGF5QXR0YWNoZWQ9ITF9dXBkYXRlQ3Vyc29yZWREYXRhQW5kVG9vbHRpcFZpc2liaWxpdHkoKXtjb25zdCB0PXRoaXMuY3Vyc29yTG9jYXRpb25JbkRhdGFDb29yZDtpZihudWxsPT09dClyZXR1cm4gdGhpcy5jdXJzb3JlZERhdGE9W10sdm9pZCh0aGlzLnRvb2x0aXBEaXNwbGF5QXR0YWNoZWQ9ITEpO3RoaXMuY3Vyc29yZWREYXRhPXRoaXMuaXNDdXJzb3JJbnNpZGU/dGhpcy5zZXJpZXNEYXRhLm1hcCgodD0+KHtzZXJpZXNEYXR1bTp0LG1ldGFkYXRhOnRoaXMuc2VyaWVzTWV0YWRhdGFNYXBbdC5pZF19KSkpLmZpbHRlcigoKHttZXRhZGF0YTp0fSk9PnQmJnQudmlzaWJsZSYmIUJvb2xlYW4odC5hdXgpKSkubWFwKCgoe3Nlcmllc0RhdHVtOmUsbWV0YWRhdGE6bn0pPT57Y29uc3Qgbz0oZnVuY3Rpb24gaSh0LGUpe2NvbnN0IG49TWF0aC5taW4ocDUodC5tYXAoKCh7eDp0fSk9PnQpKSxlKSx0Lmxlbmd0aC0xKSxvPU1hdGgubWF4KDAsbi0xKTtyZXR1cm4gTWF0aC5hYnModFtvXS54LWUpLU1hdGguYWJzKHRbbl0ueC1lKTw9MD9vOm59KShlLnBvaW50cyx0LngpO3JldHVybntpZDplLmlkLGNsb3Nlc3RQb2ludEluZGV4Om8scG9pbnQ6ZS5wb2ludHNbb10sbWV0YWRhdGE6bn19KSkuZmlsdGVyKCh0PT50KSk6W10sdGhpcy50b29sdGlwRGlzcGxheUF0dGFjaGVkPUJvb2xlYW4odGhpcy5jdXJzb3JlZERhdGEubGVuZ3RoKX19ZnVuY3Rpb24gR3V0KHQsZSxuLG8pe3JldHVybnttYWpvcjpbXSxtaW5vcjp0LnRpY2tzKG8sbikubWFwKCh0PT4oe3ZhbHVlOnQsdGlja0Zvcm1hdHRlZFN0cmluZzplLmZvcm1hdFRpY2sodCl9KSkpfX1VdXQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFV1dCkoU20oVWcpLFNtKExGKSl9LFV1dC7JtWNtcD10byh7dHlwZTpVdXQsc2VsZWN0b3JzOltbImxpbmUtY2hhcnQtaW50ZXJhY3RpdmUtdmlldyJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmKFFoKEF1dCw3LGhnKSxRaChnTCw1KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5kb3RzQ29udGFpbmVyPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLm92ZXJsYXk9dC5maXJzdCl9fSxob3N0VmFyczoyLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZwdSgic2hvdy16b29tLWluc3RydWN0aW9uIixuLnNob3dab29tSW5zdHJ1Y3Rpb24pfSxpbnB1dHM6e3Nlcmllc0RhdGE6InNlcmllc0RhdGEiLHNlcmllc01ldGFkYXRhTWFwOiJzZXJpZXNNZXRhZGF0YU1hcCIsdmlld0V4dGVudDoidmlld0V4dGVudCIseFNjYWxlOiJ4U2NhbGUiLHlTY2FsZToieVNjYWxlIixkb21EaW06ImRvbURpbSIsdG9vbHRpcE9yaWdpbkVsOiJ0b29sdGlwT3JpZ2luRWwiLHRvb2x0aXBUZW1wbGF0ZToidG9vbHRpcFRlbXBsYXRlIn0sb3V0cHV0czp7b25WaWV3RXh0ZW50Q2hhbmdlOiJvblZpZXdFeHRlbnRDaGFuZ2UiLG9uVmlld0V4dGVudFJlc2V0OiJvblZpZXdFeHRlbnRSZXNldCJ9LGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6TEYsdXNlRmFjdG9yeTpqdXQsZGVwczpbcExdfV0pLEJvXSxkZWNsczoxMix2YXJzOjE1LGNvbnN0czpbWzEsImRvdHMiXSxbImRvdHMiLCIiXSxbNCwibmdJZiJdLFsiY2xhc3MiLCJ6b29tLWJveCIsNCwibmdJZiJdLFsxLCJ6b29tLWluc3RydWN0aW9uIl0sWzEsImluc3RydWN0aW9uLWNvbnRlbnQiXSxbImNka092ZXJsYXlPcmlnaW4iLCIiLDEsInRvb2x0aXAtb3JpZ2luIl0sWyJ0b29sdGlwT3JpZ2luIiwiY2RrT3ZlcmxheU9yaWdpbiJdLFsiY2RrQ29ubmVjdGVkT3ZlcmxheSIsIiIsMywiY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbiIsImNka0Nvbm5lY3RlZE92ZXJsYXlPcGVuIiwiY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9ucyIsImNka0Nvbm5lY3RlZE92ZXJsYXlTY3JvbGxTdHJhdGVneSIsImNka0Nvbm5lY3RlZE92ZXJsYXlMb2NrUG9zaXRpb24iLCJjZGtDb25uZWN0ZWRPdmVybGF5RmxleGlibGVEaW1lbnNpb25zIiwiY2RrQ29ubmVjdGVkT3ZlcmxheUdyb3dBZnRlck9wZW4iLCJkZXRhY2giXSxbImRlZmF1bHRUb29sdGlwIiwiIl0sWzQsIm5nRm9yIiwibmdGb3JPZiIsIm5nRm9yVHJhY2tCeSJdLFsiciIsIjQiLDQsIm5nSWYiXSxbInIiLCI0Il0sWzEsInpvb20tYm94Il0sWzEsInRvb2x0aXAtY29udGFpbmVyIl0sWzMsIm5nVGVtcGxhdGVPdXRsZXQiLCJuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dCJdLFsxLCJjaXJjbGUtaGVhZGVyIl0sWzEsInRvb2x0aXAtcm93Il0sWzEsInRvb2x0aXAtcm93LWNpcmNsZSJdLFsxLCJuYW1lIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihxaSgpLFJtKDAsInN2ZyIsMCwxKSxRcCgyLHp1dCwyLDIsIm5nLWNvbnRhaW5lciIsMiksUXAoMyxJdXQsMSw0LCJyZWN0IiwzKSxBbSgpLFppKCksUm0oNCwiZGl2Iiw0KSxSbSg1LCJzcGFuIiw1KSxrdSg2LCJBbHQgKyBTY3JvbGwgdG8gWm9vbSIpLEFtKCksQW0oKSxUbSg3LCJkaXYiLDYsNyksUXAoOSxGdXQsMiw1LCJuZy10ZW1wbGF0ZSIsOCksVm0oImRldGFjaCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblRvb2x0aXBEaXNwbGF5RGV0YWNoZWQoKX0pKSxRcCgxMCxCdXQsMTIsMiwibmctdGVtcGxhdGUiLG51bGwsOSxpYikpLDImZSYmKHB1KCJwYW5uYWJsZSIsbi5zcGVjaWFsS2V5UHJlc3NlZCkoImRyYWdnYWJsZSIsbi5zdGF0ZT09PW4uSW50ZXJhY3Rpb25TdGF0ZS5OT05FfHxuLnN0YXRlPT09bi5JbnRlcmFjdGlvblN0YXRlLkRSQUdfWk9PTUlORykoInBhbm5pbmciLG4uc3RhdGU9PT1uLkludGVyYWN0aW9uU3RhdGUuUEFOTklORykscmMoMiksRG0oIm5nSWYiLG4uc3RhdGU9PT1uLkludGVyYWN0aW9uU3RhdGUuTk9ORSkscmMoMSksRG0oIm5nSWYiLG4uc3RhdGU9PT1uLkludGVyYWN0aW9uU3RhdGUuRFJBR19aT09NSU5HKSxyYyg2KSxEbSgiY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbiIsbi50b29sdGlwT3JpZ2luRWwpKCJjZGtDb25uZWN0ZWRPdmVybGF5T3BlbiIsbi50b29sdGlwRGlzcGxheUF0dGFjaGVkJiZuLnN0YXRlPT09bi5JbnRlcmFjdGlvblN0YXRlLk5PTkUpKCJjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25zIixuLnRvb2x0aXBQb3NpdGlvbnMpKCJjZGtDb25uZWN0ZWRPdmVybGF5U2Nyb2xsU3RyYXRlZ3kiLG4uc2Nyb2xsU3RyYXRlZ3kpKCJjZGtDb25uZWN0ZWRPdmVybGF5TG9ja1Bvc2l0aW9uIiwhMSkoImNka0Nvbm5lY3RlZE92ZXJsYXlGbGV4aWJsZURpbWVuc2lvbnMiLCEwKSgiY2RrQ29ubmVjdGVkT3ZlcmxheUdyb3dBZnRlck9wZW4iLCEwKSl9LGRpcmVjdGl2ZXM6W2RNLGZMLGdMLGxNLE1NXSxzdHlsZXM6WyJbX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjpyZWxhdGl2ZTt1c2VyLXNlbGVjdDpub25lfS5kb3RzW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5kb3RzLmRyYWdnYWJsZVtfbmdjb250ZW50LSVDT01QJV17Y3Vyc29yOmNyb3NzaGFpcn0uZG90cy5wYW5uYWJsZVtfbmdjb250ZW50LSVDT01QJV17Y3Vyc29yOmdyYWJ9LmRvdHMucGFubmluZ1tfbmdjb250ZW50LSVDT01QJV17Y3Vyc29yOmdyYWJiaW5nfS50b29sdGlwLXJvdy1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmlubGluZS1mbGV4O2hlaWdodDoxMnB4O3dpZHRoOjEycHh9LnRvb2x0aXAtcm93LWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0gPiBzcGFuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmFkaXVzOjUwJTtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsLjYpO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDoxMHB4O3dpZHRoOjEwcHh9LnRvb2x0aXAtb3JpZ2luW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MDtsZWZ0OjA7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MH0udG9vbHRpcC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuODUpO2JvcmRlci1yYWRpdXM6NHB4O2NvbG9yOiNmZmY7Y29udGFpbjpwYWludCBzdHlsZSBsYXlvdXQ7Zm9udC1zaXplOi45ZW07b3ZlcmZsb3c6YXV0bztwYWRkaW5nOjVweDtwb2ludGVyLWV2ZW50czpub25lO3dpZHRoOjEwMCV9dGhbX25nY29udGVudC0lQ09NUCVdLCB0ZFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggNXB4O3RleHQtYWxpZ246bGVmdH10aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NTAwO3BhZGRpbmctYm90dG9tOjVweH0uem9vbS1ib3hbX25nY29udGVudC0lQ09NUCVde2ZpbGwtb3BhY2l0eTouMDM7ZmlsbDojMDAwO3N0cm9rZTojY2NjfS56b29tLWluc3RydWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7bGVmdDowO29wYWNpdHk6MDtwb2ludGVyLWV2ZW50czpub25lO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7dG9wOjEwcHg7dHJhbnNpdGlvbjpvcGFjaXR5IC41czt6LWluZGV4OjF9Lmluc3RydWN0aW9uLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuNik7Ym9yZGVyLXJhZGl1czo1cHg7Y29sb3I6I2ZmZjtwYWRkaW5nOjVweCAxMHB4O3VzZXItc2VsZWN0Om5vbmV9LnNob3ctem9vbS1pbnN0cnVjdGlvbltfbmdob3N0LSVDT01QJV0gICAuem9vbS1pbnN0cnVjdGlvbltfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfSJdLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChVdXQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibGluZS1jaGFydC1pbnRlcmFjdGl2ZS12aWV3Iix0ZW1wbGF0ZVVybDoiLi9saW5lX2NoYXJ0X2ludGVyYWN0aXZlX3ZpZXcubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9saW5lX2NoYXJ0X2ludGVyYWN0aXZlX3ZpZXcuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaCxwcm92aWRlcnM6W3twcm92aWRlOkxGLHVzZUZhY3Rvcnk6anV0LGRlcHM6W3BMXX1dfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6VWd9LHt0eXBlOkxGfV19KSx7ZG90c0NvbnRhaW5lcjpbe3R5cGU6WmEsYXJnczpbImRvdHMiLHtzdGF0aWM6ITAscmVhZDpoZ31dfV0sb3ZlcmxheTpbe3R5cGU6WmEsYXJnczpbZ0xdfV0sc2VyaWVzRGF0YTpbe3R5cGU6eHl9XSxzZXJpZXNNZXRhZGF0YU1hcDpbe3R5cGU6eHl9XSx2aWV3RXh0ZW50Olt7dHlwZTp4eX1dLHhTY2FsZTpbe3R5cGU6eHl9XSx5U2NhbGU6W3t0eXBlOnh5fV0sZG9tRGltOlt7dHlwZTp4eX1dLHRvb2x0aXBPcmlnaW5FbDpbe3R5cGU6eHl9XSx0b29sdGlwVGVtcGxhdGU6W3t0eXBlOnh5fV0sb25WaWV3RXh0ZW50Q2hhbmdlOlt7dHlwZTpPeX1dLG9uVmlld0V4dGVudFJlc2V0Olt7dHlwZTpPeX1dLHNob3dab29tSW5zdHJ1Y3Rpb246W3t0eXBlOlB5LGFyZ3M6WyJjbGFzcy5zaG93LXpvb20taW5zdHJ1Y3Rpb24iXX1dfSk7Y29uc3QgV3V0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHQoIjJkIik7ZnVuY3Rpb24gWXV0KHQsZSl7aWYoMSZ0JiYocWkoKSxSbSgwLCJnIiwxNyksUm0oMSwidGV4dCIpLGt1KDIpLEFtKCksUm0oMywidGl0bGUiKSxrdSg0KSxBbSgpLEFtKCkpLDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdCxuPVltKCk7cmMoMSksZHUoImZvbnQiLG4uYXhpc0ZvbnQpLGpwKCJ4IixuLnRleHRYUG9zaXRpb24odC52YWx1ZSkpKCJ5IixuLnRleHRZUG9zaXRpb24odC52YWx1ZSkpLHJjKDEpLER1KCIgIix0LnRpY2tGb3JtYXR0ZWRTdHJpbmcsIiAiKSxyYygyKSxTdShuLmdldEZvcm1hdHRlcigpLmZvcm1hdExvbmcodC52YWx1ZSkpfX1mdW5jdGlvbiBxdXQodCxlKXtpZigxJnQmJihSbSgwLCJzcGFuIiwyMCksUm0oMSwic3BhbiIpLGt1KDIpLEFtKCksQW0oKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49ZS5pbmRleCxvPWUubGFzdCxpPVltKDIpO2R1KCJsZWZ0IixpLmdldE1ham9yWFBvc2l0aW9uKHQpLCJweCIpKCJ3aWR0aCIsaS5nZXRNYWpvcldpZHRoU3RyaW5nKHQsbyxpLm1ham9yVGlja3NbbisxXSkpKCJib3R0b20iLGkuZ2V0TWFqb3JZUG9zaXRpb24odCksInB4IikoImhlaWdodCIsaS5nZXRNYWpvckhlaWdodFN0cmluZyh0LG8saS5tYWpvclRpY2tzW24rMV0pKSgiZm9udCIsaS5heGlzRm9udCkscHUoIm1ham9yLWxhYmVsIiwhMCkoImxhc3QiLG8pLERtKCJ0aXRsZSIsaS5nZXRGb3JtYXR0ZXIoKS5mb3JtYXRMb25nKHQuc3RhcnQpKSxyYygyKSxTdSh0LnRpY2tGb3JtYXR0ZWRTdHJpbmcpfX1mdW5jdGlvbiBadXQodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDE4KSxRcCgxLHF1dCwzLDE2LCJzcGFuIiwxOSksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoMSksRG0oIm5nRm9yT2YiLHQubWFqb3JUaWNrcykoIm5nRm9yVHJhY2tCeSIsdC50cmFja0J5TWFqb3JUaWNrKX19Y2xhc3MgWHV0e2NvbnN0cnVjdG9yKCl7dGhpcy5vblZpZXdFeHRlbnRDaGFuZ2U9bmV3IExoLHRoaXMuZWRpdE1lbnVPcGVuZWQ9ITEsdGhpcy5tYWpvclRpY2tzPVtdLHRoaXMubWlub3JUaWNrcz1bXX1uZ09uQ2hhbmdlcygpe2xldCB0PW51bGw7Y29uc3QgZT1rdXQoIngiPT09dGhpcy5heGlzP3RoaXMuZG9tRGltLndpZHRoOnRoaXMuZG9tRGltLmhlaWdodCx0aGlzLmdyaWRDb3VudCk7dD10aGlzLnNjYWxlIGluc3RhbmNlb2YgdGl0PyhmdW5jdGlvbiBuKHQsZSxvLGkpe2NvbnN0W2Escl09aSxzPU1hdGguYWJzKHItYSk7aWYocz4uMDAxKXJldHVybiBHdXQodCxlLG8saSk7Y29uc3QgbD10LnRpY2tzKFthLHJdLG8pLGM9dC50aWNrcyhbYSxyXSwyKSxkPVtdO2xldCBwPShmdW5jdGlvbiBtKHQpe2NvbnN0IGU9dC50b0V4cG9uZW50aWFsKCkuc3BsaXQoImUtIiwyKTtyZXR1cm4gMj09PWUubGVuZ3RoP051bWJlcihlWzFdKS0xOjB9KShzKTtzPDEmJmMuZXZlcnkoKHQ9Pntjb25zdCBlPU1hdGguYWJzKHQpO3JldHVybiBlPj0wJiZlPDF9KSkmJihwKz0xKTtjb25zdCB1PW5ldyBNYXA7Zm9yKGNvbnN0IHQgb2YgYyl7Y29uc3RbbixvPSIiXT1TdHJpbmcodCkuc3BsaXQoIi4iLDIpLGk9TnVtYmVyKG4rIi4iK28uc2xpY2UoMCxwKSk7dS5zZXQoaSx7c3RhcnQ6aSx0aWNrRm9ybWF0dGVkU3RyaW5nOjA9PT1pPyLigJQiOmUuZm9ybWF0UmVhZGFibGUoaSl9KX1jb25zdCBmPTEwKk1hdGgucG93KDEwLC1wKTtmb3IoY29uc3QgdCBvZiBsKWZvcihjb25zdCBuIG9mWy4uLnUua2V5cygpXS5yZXZlcnNlKCkpe2NvbnN0IG89dC1uO2lmKG8+PTAmJm88Zil7aWYoMD09PW4pZC5wdXNoKHt2YWx1ZTp0LHRpY2tGb3JtYXR0ZWRTdHJpbmc6ZS5mb3JtYXRUaWNrKHQpfSk7ZWxzZXtjb25zdCBlPVN0cmluZyh0KS5zbGljZShTdHJpbmcobikubGVuZ3RoKTtkLnB1c2goe3ZhbHVlOnQsdGlja0Zvcm1hdHRlZFN0cmluZzpg4oCmJHtlfHwiMCJ9YH0pfWJyZWFrfX1yZXR1cm57bWFqb3I6QXJyYXkuZnJvbSh1LnZhbHVlcygpKSxtaW5vcjpkfX0pKHRoaXMuc2NhbGUsdGhpcy5nZXRGb3JtYXR0ZXIoKSxlLHRoaXMuYXhpc0V4dGVudCk6dGhpcy5zY2FsZSBpbnN0YW5jZW9mIG5pdD8oZnVuY3Rpb24gbyh0LGUsbixpKXtjb25zdFthLHJdPWk7bGV0IHM9dC50aWNrcyhpLDIpO2lmKHItYT49ODY0ZTV8fHMubGVuZ3RoPjIpcmV0dXJuIEd1dCh0LGUsbixpKTtjb25zdCBsPXQudGlja3MoaSxuKTtyZXR1cm57bWFqb3I6cy5tYXAoKHQ9Pih7c3RhcnQ6dCx0aWNrRm9ybWF0dGVkU3RyaW5nOmUuZm9ybWF0U2hvcnQodCl9KSkpLG1pbm9yOmwubWFwKCh0PT4oe3ZhbHVlOnQsdGlja0Zvcm1hdHRlZFN0cmluZzplLmZvcm1hdFRpY2sodCl9KSkpfX0pKHRoaXMuc2NhbGUsdGhpcy5nZXRGb3JtYXR0ZXIoKSxlLHRoaXMuYXhpc0V4dGVudCk6R3V0KHRoaXMuc2NhbGUsdGhpcy5nZXRGb3JtYXR0ZXIoKSxlLHRoaXMuYXhpc0V4dGVudCksdGhpcy5tYWpvclRpY2tzPXQubWFqb3IsdGhpcy5taW5vclRpY2tzPShmdW5jdGlvbiBpKHQsZSxuLG8sYT01KXtpZighdC5sZW5ndGh8fCFXdXQpcmV0dXJuIHQ7Y29uc3Qgcj0ieCI9PT1uPzE6LTE7bGV0IHM9bnVsbDtyZXR1cm4gdC5maWx0ZXIoKHQ9Pntjb25zdCBpPWUodCk7V3V0LmZvbnQ9bztjb25zdCBsPVd1dC5tZWFzdXJlVGV4dCh0LnRpY2tGb3JtYXR0ZWRTdHJpbmcpLGM9IngiPT09bj9sLndpZHRoOmwuYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQtbC5hY3R1YWxCb3VuZGluZ0JveERlc2NlbnQ7cmV0dXJuIG51bGw9PT1zPyEoaStyKmM8MHx8KHM9aStyKmMsMCkpOiEocioocytyKmEtaSk+MHx8KHM9aStyKmMsMCkpfSkpfSkodC5taW5vciwodD0+dGhpcy5nZXREb21Qb3ModC52YWx1ZSkpLHRoaXMuYXhpcywiMTFweCBSb2JvdG8sIHNhbnMtc2VyaWYiKX1nZXRGb3JtYXR0ZXIoKXt2YXIgdDtyZXR1cm4gbnVsbCE9PSh0PXRoaXMuY3VzdG9tRm9ybWF0dGVyKSYmdm9pZCAwIT09dD90OnRoaXMuc2NhbGUuZGVmYXVsdEZvcm1hdHRlcn10cmFja0J5TWlub3JUaWNrKHQpe3JldHVybiB0LnZhbHVlfXRyYWNrQnlNYWpvclRpY2sodCl7cmV0dXJuIHQuc3RhcnR9Z2V0RG9tUG9zKHQpe3JldHVybiB0aGlzLnNjYWxlLmZvcndhcmQodGhpcy5heGlzRXh0ZW50LHd1dCh0aGlzLmRvbURpbSx0aGlzLmF4aXMpLHQpfXRleHRYUG9zaXRpb24odCl7cmV0dXJuIngiPT09dGhpcy5heGlzP1N0cmluZyh0aGlzLmdldERvbVBvcyh0KSk6IjEwMCUifXRleHRZUG9zaXRpb24odCl7cmV0dXJuIngiPT09dGhpcy5heGlzPyIiOlN0cmluZyh0aGlzLmdldERvbVBvcyh0KSl9Z2V0TWFqb3JYUG9zaXRpb24odCl7cmV0dXJuInkiPT09dGhpcy5heGlzPzA6TWF0aC5taW4odGhpcy5kb21EaW0ud2lkdGgsTWF0aC5tYXgoMCx0aGlzLmdldERvbVBvcyh0LnN0YXJ0KSkpfWdldE1ham9yV2lkdGhTdHJpbmcodCxlLG4pe3JldHVybiJ5Ij09PXRoaXMuYXhpcz8iIjooZXx8IW4/dGhpcy5kb21EaW0ud2lkdGg6dGhpcy5nZXRNYWpvclhQb3NpdGlvbihuKSktdGhpcy5nZXRNYWpvclhQb3NpdGlvbih0KSsicHgifWdldE1ham9yWVBvc2l0aW9uKHQpe3JldHVybiJ4Ij09PXRoaXMuYXhpcz8wOnRoaXMuZG9tRGltLmhlaWdodC1NYXRoLm1pbih0aGlzLmRvbURpbS5oZWlnaHQsTWF0aC5tYXgoMCx0aGlzLmdldERvbVBvcyh0LnN0YXJ0KSkpfWdldE1ham9ySGVpZ2h0U3RyaW5nKHQsZSxuKXtyZXR1cm4ieCI9PT10aGlzLmF4aXM/IiI6KGV8fCFuP3RoaXMuZG9tRGltLmhlaWdodDp0aGlzLmdldE1ham9yWVBvc2l0aW9uKG4pKS10aGlzLmdldE1ham9yWVBvc2l0aW9uKHQpKyJweCJ9a2V5ZG93blByZXZlbnRDbG9zZSh0KXsiRXNjYXBlIiE9PXQua2V5JiZ0LnN0b3BQcm9wYWdhdGlvbigpfWV4dGVudENoYW5nZWQodCxlKXtsZXQgbj1OdW1iZXIodCksbz1OdW1iZXIoZSk7aWYobzxuKXtjb25zdCB0PW47bj1vLG89dH1OdW1iZXIuaXNGaW5pdGUobikmJk51bWJlci5pc0Zpbml0ZShvKSYmdGhpcy5vblZpZXdFeHRlbnRDaGFuZ2UuZW1pdChbbixvXSl9b25BeGlzVXBkYXRlTWVudU9wZW4odCxlLG4pe3QudmFsdWU9U3RyaW5nKG5bMF0pLGUudmFsdWU9U3RyaW5nKG5bMV0pLHQuZm9jdXMoKX1zZXRFZGl0TWVudU9wZW5lZCh0KXt0aGlzLmVkaXRNZW51T3BlbmVkPXR9fVh1dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WHV0KX0sWHV0Lsm1Y21wPXRvKHt0eXBlOlh1dCxzZWxlY3RvcnM6W1sibGluZS1jaGFydC1heGlzIl1dLGlucHV0czp7YXhpc0V4dGVudDoiYXhpc0V4dGVudCIsYXhpczoiYXhpcyIsc2NhbGU6InNjYWxlIixncmlkQ291bnQ6ImdyaWRDb3VudCIsZG9tRGltOiJkb21EaW0iLGN1c3RvbUZvcm1hdHRlcjoiY3VzdG9tRm9ybWF0dGVyIn0sb3V0cHV0czp7b25WaWV3RXh0ZW50Q2hhbmdlOiJvblZpZXdFeHRlbnRDaGFuZ2UifSxmZWF0dXJlczpbQm9dLGRlY2xzOjI2LHZhcnM6MTMsY29uc3RzOltbMSwibGluZSJdLFsxLCJtaW5vciJdLFsxLCJ0aWNrcyJdLFsiY2xhc3MiLCJtaW5vci10aWNrLWxhYmVsIiw0LCJuZ0ZvciIsIm5nRm9yT2YiLCJuZ0ZvclRyYWNrQnkiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsInRpdGxlIiwiQ2xpY2sgdG8gbWFudWFsbHkgc2V0IG1pbiAmIG1heCB2YWx1ZXMiLDMsIm1hdE1lbnVUcmlnZ2VyRm9yIiwibWVudU9wZW5lZCIsIm1lbnVDbG9zZWQiXSxbIm1hdE1lbnVUcmlnZ2VyIiwibWF0TWVudVRyaWdnZXIiXSxbInN2Z0ljb24iLCJlZGl0XzI0cHgiXSxbImNsYXNzIiwibWFqb3IgdGlja3MiLDQsIm5nSWYiXSxbInhQb3NpdGlvbiIsImJlZm9yZSIsMywieVBvc2l0aW9uIl0sWyJtYW51YWxDb250cm9sIiwibWF0TWVudSJdLFsxLCJleHRlbnQtZWRpdC1pbnB1dCIsMywiY2xpY2siLCJrZXlkb3duIl0sWyJ0eXBlIiwibnVtYmVyIiwzLCJ2YWx1ZSJdLFsibWluSW5wdXQiLCIiXSxbIm1heElucHV0IiwiIl0sWzEsImV4dGVudC1lZGl0LWNvbnRyb2wiLDMsImtleWRvd24iXSxbIm1hdC1yYWlzZWQtYnV0dG9uIiwiIiwiY29sb3IiLCJwcmltYXJ5IiwxLCJleHRlbnQtZWRpdC1jaGFuZ2UiLDMsImNsaWNrIl0sWyJtYXQtc3Ryb2tlZC1idXR0b24iLCIiLDEsImV4dGVudC1lZGl0LWNhbmNlbCIsMywiY2xpY2siXSxbMSwibWlub3ItdGljay1sYWJlbCJdLFsxLCJtYWpvciIsInRpY2tzIl0sWzMsIm1ham9yLWxhYmVsIiwibGFzdCIsImxlZnQiLCJ3aWR0aCIsImJvdHRvbSIsImhlaWdodCIsImZvbnQiLCJ0aXRsZSIsNCwibmdGb3IiLCJuZ0Zvck9mIiwibmdGb3JUcmFja0J5Il0sWzMsInRpdGxlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiKSxUbSgxLCJkaXYiLDApLFJtKDIsImRpdiIsMSkscWkoKSxSbSgzLCJzdmciLDIpLFFwKDQsWXV0LDUsNiwiZyIsMyksQW0oKSxaaSgpLFJtKDUsImJ1dHRvbiIsNCw1KSxWbSgibWVudU9wZW5lZCIsKGZ1bmN0aW9uIGUoKXtoaSh0KTtjb25zdCBvPSRwKDE1KSxpPSRwKDIwKTtyZXR1cm4gbi5vbkF4aXNVcGRhdGVNZW51T3BlbihvLGksbi5heGlzRXh0ZW50KSxuLnNldEVkaXRNZW51T3BlbmVkKCEwKX0pKSgibWVudUNsb3NlZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5zZXRFZGl0TWVudU9wZW5lZCghMSl9KSksVG0oNywibWF0LWljb24iLDYpLEFtKCksQW0oKSxRcCg4LFp1dCwyLDIsImRpdiIsNyksQW0oKSxSbSg5LCJtYXQtbWVudSIsOCw5KSxSbSgxMSwiZGl2IiwxMCksVm0oImNsaWNrIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gZS5zdG9wUHJvcGFnYXRpb24oKX0pKSgia2V5ZG93biIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ua2V5ZG93blByZXZlbnRDbG9zZShlKX0pKSxSbSgxMiwibGFiZWwiKSxrdSgxMywibWluIiksQW0oKSxUbSgxNCwiaW5wdXQiLDExLDEyKSxBbSgpLFJtKDE2LCJkaXYiLDEwKSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KGUpe3JldHVybiBlLnN0b3BQcm9wYWdhdGlvbigpfSkpKCJrZXlkb3duIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5rZXlkb3duUHJldmVudENsb3NlKGUpfSkpLFJtKDE3LCJsYWJlbCIpLGt1KDE4LCJtYXgiKSxBbSgpLFRtKDE5LCJpbnB1dCIsMTEsMTMpLEFtKCksUm0oMjEsImRpdiIsMTQpLFZtKCJrZXlkb3duIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5rZXlkb3duUHJldmVudENsb3NlKGUpfSkpLFJtKDIyLCJidXR0b24iLDE1KSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7aGkodCk7Y29uc3Qgbz0kcCgxNSksaT0kcCgyMCksYT0kcCg2KTtyZXR1cm4gbi5leHRlbnRDaGFuZ2VkKG8udmFsdWUsaS52YWx1ZSksYS5jbG9zZU1lbnUoKX0pKSxrdSgyMywiIENoYW5nZSAiKSxBbSgpLFJtKDI0LCJidXR0b24iLDE2KSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLCRwKDYpLmNsb3NlTWVudSgpfSkpLGt1KDI1LCIgQ2FuY2VsICIpLEFtKCksQW0oKSxBbSgpfWlmKDImZSl7Y29uc3QgdD0kcCgxMCk7ZnUobi5heGlzKyItYXhpcyBheGlzIikscmMoNCksRG0oIm5nRm9yT2YiLG4ubWlub3JUaWNrcykoIm5nRm9yVHJhY2tCeSIsbi50cmFja0J5TWlub3JUaWNrKSxyYygxKSxwdSgiZXh0ZW50LWVkaXQtYnV0dG9uIiwhMCkoImV4dGVudC1lZGl0LW1lbnUtb3BlbmVkIixuLmVkaXRNZW51T3BlbmVkKSxEbSgibWF0TWVudVRyaWdnZXJGb3IiLHQpLHJjKDMpLERtKCJuZ0lmIixuLm1ham9yVGlja3MubGVuZ3RoKSxyYygxKSxEbSgieVBvc2l0aW9uIiwieSI9PT1uLmF4aXM/ImFib3ZlIjoiYmVsb3ciKSxyYyg1KSxEbSgidmFsdWUiLG4uYXhpc0V4dGVudFswXSkscmMoNSksRG0oInZhbHVlIixuLmF4aXNFeHRlbnRbMV0pfX0sZGlyZWN0aXZlczpbbE0sWEgsZVksRFcsZE0sS1ddLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV17Y29udGFpbjpzdHJpY3Q7ZGlzcGxheTpmbGV4O292ZXJmbG93OmhpZGRlbn0ubWFqb3ItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCB0ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOmN1cnJlbnRDb2xvcjtmb250LXNpemU6MTFweDt1c2VyLXNlbGVjdDpub25lfS5heGlzW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0ubWFqb3JbX25nY29udGVudC0lQ09NUCVdLCAubWlub3JbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MSAwO292ZXJmbG93OmhpZGRlbn0ubGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYWFhO2ZsZXg6MCAwIDFweDtqdXN0aWZ5LWNvbnRlbnQ6c3RyZXRjaH0udGlja3NbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlO3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjEwMCV9LngtYXhpc1tfbmdjb250ZW50LSVDT01QJV17ZmxleC1kaXJlY3Rpb246Y29sdW1ufS54LWF4aXNbX25nY29udGVudC0lQ09NUCVdICAgLmxpbmVbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1ib3R0b206M3B4fS54LWF4aXNbX25nY29udGVudC0lQ09NUCVdICAgdGV4dFtfbmdjb250ZW50LSVDT01QJV17ZG9taW5hbnQtYmFzZWxpbmU6dGV4dC1iZWZvcmUtZWRnZTt0ZXh0LWFuY2hvcjptaWRkbGV9LngtYXhpc1tfbmdjb250ZW50LSVDT01QJV0gICAudGlja3NbX25nY29udGVudC0lQ09NUCVdey13ZWJraXQtbWFzay1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICMwMDAwIDAlLCAjMDAwIDEwJSwgIzAwMCA5MCUsICMwMDAwIDEwMCUpO21hc2staW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAjMDAwMCAwJSwgIzAwMCAxMCUsICMwMDAgOTAlLCAjMDAwMCAxMDAlKX0ueS1heGlzW19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4LWRpcmVjdGlvbjpyb3ctcmV2ZXJzZX0ueS1heGlzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDo1cHh9LnktYXhpc1tfbmdjb250ZW50LSVDT01QJV0gICB0ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtkb21pbmFudC1iYXNlbGluZTpjZW50cmFsO3RleHQtYW5jaG9yOmVuZH0ueS1heGlzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC50aWNrc1tfbmdjb250ZW50LSVDT01QJV17LXdlYmtpdC1tYXNrLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICMwMDAwIDAlLCAjMDAwIDEwJSwgIzAwMCA5MCUsICMwMDAwIDEwMCUpO21hc2staW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgIzAwMDAgMCUsICMwMDAgMTAlLCAjMDAwIDkwJSwgIzAwMDAgMTAwJSl9LmV4dGVudC1lZGl0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZWVlO2Rpc3BsYXk6bm9uZTtmb250LXNpemU6MDtoZWlnaHQ6MjRweDtsaW5lLWhlaWdodDoyNHB4O3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjVweDt0b3A6NXB4O3dpZHRoOjI0cHh9LmV4dGVudC1lZGl0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICBtYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjE2cHg7d2lkdGg6MTZweDtsaW5lLWhlaWdodDoxNnB4fS5leHRlbnQtZWRpdC1pbnB1dFtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2NvbHVtbi1nYXA6NXB4O2Rpc3BsYXk6Z3JpZDtmb250LXNpemU6MTJweDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MzBweCBtaW5tYXgoYXV0bywgMTAwcHgpO2hlaWdodDozMHB4O21hcmdpbjoxMHB4IDIwcHh9LmV4dGVudC1lZGl0LWlucHV0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGlucHV0W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOmluaGVyaXQ7Ym9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXN0eWxlOnNvbGlkO2NvbG9yOmluaGVyaXR9LmV4dGVudC1lZGl0LWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93LXJldmVyc2U7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO21hcmdpbjoxMHB4IDIwcHh9LmV4dGVudC1lZGl0LWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdICAgYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtoZWlnaHQ6MzBweDtsaW5lLWhlaWdodDoxLjQ7bWFyZ2luLWxlZnQ6NXB4O3BhZGRpbmc6MCAxMHB4fS5heGlzW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5leHRlbnQtZWRpdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAuZXh0ZW50LWVkaXQtbWVudS1vcGVuZWRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6aW5pdGlhbH0ubWFqb3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlO292ZXJmbG93OmhpZGRlbjtjb250YWluOnN0cmljdH0ubWFqb3JbX25nY29udGVudC0lQ09NUCVdICAgLm1ham9yLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6aW5saW5lLWZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246YWJzb2x1dGU7d2hpdGUtc3BhY2U6bm93cmFwfS5tYWpvcltfbmdjb250ZW50LSVDT01QJV0gICAubWFqb3ItbGFiZWxbX25nY29udGVudC0lQ09NUCVdICAgc3Bhbltfbmdjb250ZW50LSVDT01QJV17bWF4LXdpZHRoOjEwMCV9LngtYXhpc1tfbmdjb250ZW50LSVDT01QJV0gICAubWFqb3ItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjOWU5ZTllO3BhZGRpbmc6MCA1cHh9LngtYXhpc1tfbmdjb250ZW50LSVDT01QJV0gICAubWFqb3ItbGFiZWwubGFzdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjOWU5ZTllfS55LWF4aXNbX25nY29udGVudC0lQ09NUCVdICAgLm1ham9yLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjOWU5ZTllO2hlaWdodDoxMDAlO3BhZGRpbmc6NXB4IDA7d2lkdGg6MTAwJX0ueS1heGlzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYWpvci1sYWJlbC5sYXN0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjFweCBzb2xpZCAjOWU5ZTllfS55LWF4aXNbX25nY29udGVudC0lQ09NUCVdICAgLm1ham9yLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSA+IHNwYW5bX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTpyb3RhdGUoLTkwZGVnKTt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcn0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWHV0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImxpbmUtY2hhcnQtYXhpcyIsdGVtcGxhdGVVcmw6ImxpbmVfY2hhcnRfYXhpc192aWV3Lm5nLmh0bWwiLHN0eWxlVXJsczpbImxpbmVfY2hhcnRfYXhpc192aWV3LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse2F4aXNFeHRlbnQ6W3t0eXBlOnh5fV0sYXhpczpbe3R5cGU6eHl9XSxzY2FsZTpbe3R5cGU6eHl9XSxncmlkQ291bnQ6W3t0eXBlOnh5fV0sZG9tRGltOlt7dHlwZTp4eX1dLGN1c3RvbUZvcm1hdHRlcjpbe3R5cGU6eHl9XSxvblZpZXdFeHRlbnRDaGFuZ2U6W3t0eXBlOk95fV19KTtjb25zdCBLdXQ9WyJzZXJpZXNWaWV3Il0sSnV0PVsieEF4aXMiXSxRdXQ9WyJ5QXhpcyJdLCR1dD1bImNoYXJ0RWwiXTtmdW5jdGlvbiB0ZnQodCxlKXtpZigxJnQmJlRtKDAsImxpbmUtY2hhcnQtZ3JpZC12aWV3IiwxNSksMiZ0KXtjb25zdCB0PVltKCk7RG0oInZpZXdFeHRlbnQiLHQudmlld0JveCkoInhTY2FsZSIsdC54U2NhbGUpKCJ5U2NhbGUiLHQueVNjYWxlKSgieEdyaWRDb3VudCIsdC5YX0dSSURfQ09VTlQpKCJ5R3JpZENvdW50Iix0LllfR1JJRF9DT1VOVCkoImRvbURpbSIsdC5kb21EaW1lbnNpb25zLm1haW4pfX1mdW5jdGlvbiBlZnQodCxlKXsxJnQmJihxaSgpLFRtKDAsInN2ZyIsbnVsbCwxNikpfWZ1bmN0aW9uIG5mdCh0LGUpezEmdCYmVG0oMCwiY2FudmFzIixudWxsLDE2KX1mdW5jdGlvbiBvZnQodCxlKXtpZigxJnQmJihObSgwKSxRcCgxLGVmdCwyLDAsInN2ZyIsNSksUXAoMixuZnQsMiwwLCJjYW52YXMiLDUpLHptKCkpLDImdCl7Y29uc3QgdD1ZbSgpO3JjKDEpLERtKCJuZ0lmIix0LmdldFJlbmRlcmVyVHlwZSgpPT09dC5SZW5kZXJlclR5cGUuU1ZHKSxyYygxKSxEbSgibmdJZiIsdC5nZXRSZW5kZXJlclR5cGUoKT09PXQuUmVuZGVyZXJUeXBlLldFQkdMKX19ZnVuY3Rpb24gaWZ0KHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwibGluZS1jaGFydC1pbnRlcmFjdGl2ZS12aWV3IiwxNyksVm0oIm9uVmlld0V4dGVudENoYW5nZSIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkub25WaWV3Qm94Q2hhbmdlZChuKX0pKSgib25WaWV3RXh0ZW50UmVzZXQiLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLFltKCkudmlld0JveFJlc2V0KCl9KSksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKSxlPSRwKDEpO0RtKCJzZXJpZXNEYXRhIix0LnNlcmllc0RhdGEpKCJzZXJpZXNNZXRhZGF0YU1hcCIsdC5zZXJpZXNNZXRhZGF0YU1hcCkoInZpZXdFeHRlbnQiLHQudmlld0JveCkoInhTY2FsZSIsdC54U2NhbGUpKCJ5U2NhbGUiLHQueVNjYWxlKSgidG9vbHRpcE9yaWdpbkVsIixlKSgiZG9tRGltIix0LmRvbURpbWVuc2lvbnMubWFpbikoInRvb2x0aXBUZW1wbGF0ZSIsdC50b29sdGlwVGVtcGxhdGUpfX1jb25zdCBhZnQ9ZnVuY3Rpb24odCxlLG4sbyl7cmV0dXJue3hTY2FsZTp0LHlTY2FsZTplLGRvbURpbWVuc2lvbjpuLHZpZXdFeHRlbnQ6b319O2Z1bmN0aW9uIHJmdCh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsMTgpLEltKDEsMTkpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpO3JjKDEpLERtKCJuZ1RlbXBsYXRlT3V0bGV0Iix0LmN1c3RvbVZpc1RlbXBsYXRlKSgibmdUZW1wbGF0ZU91dGxldENvbnRleHQiLE9oKDIsYWZ0LHQueFNjYWxlLHQueVNjYWxlLHQuZG9tRGltZW5zaW9ucy5tYWluLHQudmlld0JveCkpfX1mdW5jdGlvbiBzZnQodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJsaW5lLWNoYXJ0LWF4aXMiLDIwKSxWbSgib25WaWV3RXh0ZW50Q2hhbmdlIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oKS5vblZpZXdCb3hDaGFuZ2VkRnJvbUF4aXMobiwieSIpfSkpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKCk7RG0oImF4aXNFeHRlbnQiLHQudmlld0JveC55KSgiY3VzdG9tRm9ybWF0dGVyIix0LmN1c3RvbVlGb3JtYXR0ZXIpKCJkb21EaW0iLHQuZG9tRGltZW5zaW9ucy55QXhpcykoImdyaWRDb3VudCIsdC5ZX0dSSURfQ09VTlQpKCJzY2FsZSIsdC55U2NhbGUpfX1mdW5jdGlvbiBsZnQodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJsaW5lLWNoYXJ0LWF4aXMiLDIxKSxWbSgib25WaWV3RXh0ZW50Q2hhbmdlIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oKS5vblZpZXdCb3hDaGFuZ2VkRnJvbUF4aXMobiwieCIpfSkpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKCk7RG0oImF4aXNFeHRlbnQiLHQudmlld0JveC54KSgiY3VzdG9tRm9ybWF0dGVyIix0LmN1c3RvbVhGb3JtYXR0ZXIpKCJkb21EaW0iLHQuZG9tRGltZW5zaW9ucy54QXhpcykoImdyaWRDb3VudCIsdC5YX0dSSURfQ09VTlQpKCJzY2FsZSIsdC54U2NhbGUpfX1jb25zdCBjZnQ9ZnVuY3Rpb24odCxlLG4sbyxpKXtyZXR1cm57eFNjYWxlOnQseVNjYWxlOmUsZG9tRGltZW5zaW9uOm4sdmlld0V4dGVudDpvLGZvcm1hdHRlcjppfX07ZnVuY3Rpb24gZGZ0KHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2IiwxOCksSW0oMSwxOSksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoMSksRG0oIm5nVGVtcGxhdGVPdXRsZXQiLHQuY3VzdG9tWEF4aXNUZW1wbGF0ZSkoIm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0IixQaCgyLGNmdCx0LnhTY2FsZSx0LnlTY2FsZSx0LmRvbURpbWVuc2lvbnMueEF4aXMsdC52aWV3Qm94LHQuY3VzdG9tWEZvcm1hdHRlcnx8dC54U2NhbGUuZGVmYXVsdEZvcm1hdHRlcikpfX1mdW5jdGlvbiBwZnQodCxlKXsxJnQmJihSbSgwLCJkaXYiLDIyKSxUbSgxLCJzcGFuIiwyMyksQW0oKSl9Y29uc3QgbWZ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJue2NvbnRhaW5lcjohMCwiZGFyay1tb2RlIjp0LCJsaW5lLW9ubHktbW9kZSI6ZX19LHVmdD17eDpbMCwxXSx5OlswLDFdfTtjbGFzcyBmZnR7Y29uc3RydWN0b3IodCl7dGhpcy5jaGFuZ2VEZXRlY3Rvcj10LHRoaXMuUmVuZGVyZXJUeXBlPUsyLHRoaXMudXNlRGFya01vZGU9ITEsdGhpcy5wcmVmZXJyZWRSZW5kZXJlclR5cGU9SzIuV0VCR0wsdGhpcy54U2NhbGVUeXBlPUoyLkxJTkVBUix0aGlzLnlTY2FsZVR5cGU9SjIuTElORUFSLHRoaXMubGluZU9ubHk9ITEsdGhpcy5vblZpZXdCb3hPdmVycmlkZGVuPW5ldyBCKDEpLHRoaXMuaWdub3JlWU91dGxpZXJzPSExLHRoaXMuWV9HUklEX0NPVU5UPTYsdGhpcy5YX0dSSURfQ09VTlQ9MTAsdGhpcy54U2NhbGU9JG90KHRoaXMueFNjYWxlVHlwZSksdGhpcy55U2NhbGU9JG90KHRoaXMueFNjYWxlVHlwZSksdGhpcy52aWV3Qm94PXVmdCx0aGlzLmRvbURpbWVuc2lvbnM9e21haW46e3dpZHRoOjAsaGVpZ2h0OjB9LHhBeGlzOnt3aWR0aDowLGhlaWdodDowfSx5QXhpczp7d2lkdGg6MCxoZWlnaHQ6MH19LHRoaXMuc2hvd0NoYXJ0UmVuZGVyZXJFbGVtZW50PSEwLHRoaXMubGluZUNoYXJ0PW51bGwsdGhpcy5pc0RhdGFVcGRhdGVkPSExLHRoaXMuaXNNZXRhZGF0YVVwZGF0ZWQ9ITEsdGhpcy5pc0ZpeGVkVmlld0JveFVwZGF0ZWQ9ITEsdGhpcy5pc1ZpZXdCb3hPdmVycmlkZGVuPSExLHRoaXMudXNlRGFya01vZGVVcGRhdGVkPSExLHRoaXMuaXNWaWV3Qm94Q2hhbmdlZD0hMCx0aGlzLnNjYWxlVXBkYXRlZD0hMCx0aGlzLmlzUmVuZGVyaW5nQ29udGV4dExvc3Q9ITF9bmdPbkluaXQoKXt0aGlzLm9uVmlld0JveE92ZXJyaWRkZW4ubmV4dCh0aGlzLmlzVmlld0JveE92ZXJyaWRkZW4pfW5nT25DaGFuZ2VzKHQpe3QueFNjYWxlVHlwZSYmKHRoaXMueFNjYWxlPSRvdCh0aGlzLnhTY2FsZVR5cGUpLHRoaXMuc2NhbGVVcGRhdGVkPSEwKSx0LnlTY2FsZVR5cGUmJih0aGlzLnlTY2FsZT0kb3QodGhpcy55U2NhbGVUeXBlKSx0aGlzLnNjYWxlVXBkYXRlZD0hMCksdC5zZXJpZXNEYXRhJiYodGhpcy5pc0RhdGFVcGRhdGVkPSEwKSx0LmZpeGVkVmlld0JveCYmKHRoaXMuaXNGaXhlZFZpZXdCb3hVcGRhdGVkPSEwKSx0LnNlcmllc01ldGFkYXRhTWFwJiYodGhpcy5pc01ldGFkYXRhVXBkYXRlZD0hMCksdC51c2VEYXJrTW9kZSYmKHRoaXMudXNlRGFya01vZGVVcGRhdGVkPSEwKSx0aGlzLnNjYWxlVXBkYXRlZCYmdGhpcy5zZXRJc1ZpZXdCb3hPdmVycmlkZGVuKCExKSx0aGlzLmlzVmlld0JveENoYW5nZWQ9dGhpcy5pc1ZpZXdCb3hDaGFuZ2VkfHx0aGlzLnNjYWxlVXBkYXRlZHx8IXRoaXMuaXNWaWV3Qm94T3ZlcnJpZGRlbiYmdGhpcy5zaG91bGRVcGRhdGVEZWZhdWx0Vmlld0JveCh0KSx0aGlzLnVwZGF0ZUxpbmVDaGFydCgpfW5nQWZ0ZXJWaWV3SW5pdCgpe3RoaXMuaW5pdGlhbGl6ZUNoYXJ0KCksdGhpcy51cGRhdGVMaW5lQ2hhcnQoKSx0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKX1yZWNvdmVyUmVuZGVyZXJJZk5lZWRlZCgpe3RoaXMuaXNSZW5kZXJpbmdDb250ZXh0TG9zdCYmIXRoaXMuZGlzYWJsZVVwZGF0ZSYmKHRoaXMuc2hvd0NoYXJ0UmVuZGVyZXJFbGVtZW50PSExLHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpLHRoaXMuc2hvd0NoYXJ0UmVuZGVyZXJFbGVtZW50PSEwLHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpLHRoaXMuaW5pdGlhbGl6ZUNoYXJ0KCksdGhpcy5zY2FsZVVwZGF0ZWQ9ITAsdGhpcy5pc01ldGFkYXRhVXBkYXRlZD0hMCx0aGlzLmlzRGF0YVVwZGF0ZWQ9ITAsdGhpcy51c2VEYXJrTW9kZVVwZGF0ZWQ9ITAsdGhpcy5pc0ZpeGVkVmlld0JveFVwZGF0ZWQ9ITAsdGhpcy5pc1ZpZXdCb3hDaGFuZ2VkPSEwLHRoaXMuaXNSZW5kZXJpbmdDb250ZXh0TG9zdD0hMSl9b25WaWV3UmVzaXplKCl7dGhpcy5saW5lQ2hhcnQmJih0aGlzLnJlYWRBbmRVcGRhdGVEb21EaW1lbnNpb25zKCksdGhpcy5saW5lQ2hhcnQucmVzaXplKHRoaXMuZG9tRGltZW5zaW9ucy5tYWluKSx0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKSl9c2hvdWxkVXBkYXRlRGVmYXVsdFZpZXdCb3godCl7aWYodC54U2NhbGVUeXBlfHx0LnlTY2FsZVR5cGV8fHQuaWdub3JlWU91dGxpZXJzKXJldHVybiEwO2lmKHQuc2VyaWVzRGF0YSlyZXR1cm4hMDtjb25zdCBlPXQuc2VyaWVzTWV0YWRhdGFNYXA7aWYoZSl7Y29uc3QgdD1lLnByZXZpb3VzVmFsdWU7aWYoT2JqZWN0LmtleXModGhpcy5zZXJpZXNNZXRhZGF0YU1hcCkubGVuZ3RoIT09T2JqZWN0LmtleXMobnVsbCE9dD90Ont9KS5sZW5ndGgpcmV0dXJuITA7Zm9yKGNvbnN0W2Usbl1vZiBPYmplY3QuZW50cmllcyh0aGlzLnNlcmllc01ldGFkYXRhTWFwKSl7Y29uc3Qgbz10JiZ0W2VdO2lmKCFvfHxuLnZpc2libGUhPT1vLnZpc2libGUpcmV0dXJuITB9fXJldHVybiExfW9uQ29udGV4dExvc3QoKXt0aGlzLmlzUmVuZGVyaW5nQ29udGV4dExvc3Q9ITAsdGhpcy5saW5lQ2hhcnQmJih0aGlzLmxpbmVDaGFydC5kaXNwb3NlKCksdGhpcy5saW5lQ2hhcnQ9bnVsbCl9dHJpZ2dlckNvbnRleHRMb3N0Rm9yVGVzdCgpe3RoaXMub25Db250ZXh0TG9zdCgpfWdldExpbmVDaGFydEZvclRlc3QoKXtyZXR1cm4gdGhpcy5saW5lQ2hhcnR9aW5pdGlhbGl6ZUNoYXJ0KCl7dGhpcy5saW5lQ2hhcnQmJnRoaXMubGluZUNoYXJ0LmRpc3Bvc2UoKTtjb25zdCB0PXRoaXMuZ2V0UmVuZGVyZXJUeXBlKCksZT17b25EcmF3RW5kOigpPT57fSxvbkNvbnRleHRMb3N0OnRoaXMub25Db250ZXh0TG9zdC5iaW5kKHRoaXMpfTtsZXQgbj1udWxsO3N3aXRjaCh0aGlzLnJlYWRBbmRVcGRhdGVEb21EaW1lbnNpb25zKCksdCl7Y2FzZSBLMi5TVkc6bj17dHlwZTpLMi5TVkcsY29udGFpbmVyOnRoaXMuY2hhcnRFbC5uYXRpdmVFbGVtZW50LGNhbGxiYWNrczplLGRvbURpbWVuc2lvbjp0aGlzLmRvbURpbWVuc2lvbnMubWFpbix1c2VEYXJrTW9kZTp0aGlzLnVzZURhcmtNb2RlfTticmVhaztjYXNlIEsyLldFQkdMOm49e3R5cGU6SzIuV0VCR0wsY29udGFpbmVyOnRoaXMuY2hhcnRFbC5uYXRpdmVFbGVtZW50LGRldmljZVBpeGVsUmF0aW86d2luZG93LmRldmljZVBpeGVsUmF0aW8sY2FsbGJhY2tzOmUsZG9tRGltZW5zaW9uOnRoaXMuZG9tRGltZW5zaW9ucy5tYWluLHVzZURhcmtNb2RlOnRoaXMudXNlRGFya01vZGV9O2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGA8bGluZS1jaGFydD4gZG9lcyBub3QgeWV0IHN1cHBvcnQgcmVuZGVyZXJUeXBlOiAke3R9YCl9Y29uc3Qgbz10IT09SzIuU1ZHJiZpaXQoKTt0aGlzLmxpbmVDaGFydD1uZXcobz9QdXQ6eHV0KShuKX1uZ09uRGVzdHJveSgpe3RoaXMubGluZUNoYXJ0JiZ0aGlzLmxpbmVDaGFydC5kaXNwb3NlKCl9Z2V0UmVuZGVyZXJUeXBlKCl7cmV0dXJuKGZ1bmN0aW9uIHQoZSl7c3dpdGNoKGUpe2Nhc2UgSzIuU1ZHOnJldHVybiBLMi5TVkc7Y2FzZSBLMi5XRUJHTDpyZXR1cm4oZnVuY3Rpb24gdCgpe3JldHVybiBvaXR9KSgpP0syLldFQkdMOksyLlNWRztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5rbm93biByZW5kZXJlclR5cGU6ICR7ZX1gKX19KSh0aGlzLnByZWZlcnJlZFJlbmRlcmVyVHlwZSl9cmVhZEFuZFVwZGF0ZURvbURpbWVuc2lvbnMoKXt0aGlzLmRvbURpbWVuc2lvbnM9e21haW46e3dpZHRoOnRoaXMuc2VyaWVzVmlldy5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoLGhlaWdodDp0aGlzLnNlcmllc1ZpZXcubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHR9LHhBeGlzOnt3aWR0aDp0aGlzLnhBeGlzLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGgsaGVpZ2h0OnRoaXMueEF4aXMubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHR9LHlBeGlzOnt3aWR0aDp0aGlzLnlBeGlzLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGgsaGVpZ2h0OnRoaXMueUF4aXMubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHR9fX11cGRhdGVMaW5lQ2hhcnQoKXt2YXIgdCxlO2lmKHRoaXMucmVjb3ZlclJlbmRlcmVySWZOZWVkZWQoKSx0aGlzLmxpbmVDaGFydCYmIXRoaXMuZGlzYWJsZVVwZGF0ZSl7aWYodGhpcy5zY2FsZVVwZGF0ZWQmJih0aGlzLnNjYWxlVXBkYXRlZD0hMSx0aGlzLmxpbmVDaGFydC5zZXRYU2NhbGVUeXBlKHRoaXMueFNjYWxlVHlwZSksdGhpcy5saW5lQ2hhcnQuc2V0WVNjYWxlVHlwZSh0aGlzLnlTY2FsZVR5cGUpKSx0aGlzLmlzTWV0YWRhdGFVcGRhdGVkJiYodGhpcy5pc01ldGFkYXRhVXBkYXRlZD0hMSx0aGlzLmxpbmVDaGFydC5zZXRNZXRhZGF0YSh0aGlzLnNlcmllc01ldGFkYXRhTWFwKSksdGhpcy5pc0RhdGFVcGRhdGVkJiYodGhpcy5pc0RhdGFVcGRhdGVkPSExLHRoaXMubGluZUNoYXJ0LnNldERhdGEodGhpcy5zZXJpZXNEYXRhKSksdGhpcy51c2VEYXJrTW9kZVVwZGF0ZWQmJih0aGlzLnVzZURhcmtNb2RlVXBkYXRlZD0hMSx0aGlzLmxpbmVDaGFydC5zZXRVc2VEYXJrTW9kZSh0aGlzLnVzZURhcmtNb2RlKSksIXRoaXMuaXNWaWV3Qm94T3ZlcnJpZGRlbiYmdGhpcy5maXhlZFZpZXdCb3gpdGhpcy52aWV3Qm94PXRoaXMuZml4ZWRWaWV3Qm94O2Vsc2UgaWYoIXRoaXMuaXNWaWV3Qm94T3ZlcnJpZGRlbiYmdGhpcy5pc1ZpZXdCb3hDaGFuZ2VkKXtjb25zdCBuPShmdW5jdGlvbiBvKHQsZSxuLGksYSl7bGV0IHI9bnVsbCxzPW51bGwsbD1bXTtmb3IoY29uc3R7aWQ6bixwb2ludHM6b31vZiB0KXtjb25zdCB0PWVbbl07aWYodCYmIXQuYXV4JiZ0LnZpc2libGUpZm9yKGxldCB0PTA7dDxvLmxlbmd0aDt0Kyspe2NvbnN0e3g6ZSx5Om59PW9bdF07aShlKSYmKHI9bnVsbD09PXJ8fGU8cj9lOnIscz1udWxsPT09c3x8ZT5zP2U6cyksYShuKSYmbC5wdXNoKG4pfX1sLnNvcnQoYzUpO2xldCBjPWxbMF0sZD1sW2wubGVuZ3RoLTFdO3JldHVybiBuJiZsLmxlbmd0aD4yJiYoYz1sW01hdGguY2VpbCguMDUqKGwubGVuZ3RoLTEpKV0sZD1sW01hdGguZmxvb3IoLjk1KihsLmxlbmd0aC0xKSldKSx7eDpudWxsIT09ciYmbnVsbCE9PXM/W3Isc106dm9pZCAwLHk6dm9pZCAwIT09YyYmdm9pZCAwIT09ZD9bYyxkXTp2b2lkIDB9fSkodGhpcy5zZXJpZXNEYXRhLHRoaXMuc2VyaWVzTWV0YWRhdGFNYXAsdGhpcy5pZ25vcmVZT3V0bGllcnMsdGhpcy54U2NhbGUuaXNTYWZlTnVtYmVyLHRoaXMueVNjYWxlLmlzU2FmZU51bWJlcik7dGhpcy52aWV3Qm94PXt4OnRoaXMueFNjYWxlLm5pY2VEb21haW4obnVsbCE9PSh0PW4ueCkmJnZvaWQgMCE9PXQ/dDp1ZnQueCkseTp0aGlzLnlTY2FsZS5uaWNlRG9tYWluKG51bGwhPT0oZT1uLnkpJiZ2b2lkIDAhPT1lP2U6dWZ0LnkpfX0odGhpcy5pc0ZpeGVkVmlld0JveFVwZGF0ZWR8fHRoaXMuaXNWaWV3Qm94Q2hhbmdlZCkmJih0aGlzLmlzRml4ZWRWaWV3Qm94VXBkYXRlZD0hMSx0aGlzLmlzVmlld0JveENoYW5nZWQ9ITEsdGhpcy5saW5lQ2hhcnQuc2V0Vmlld0JveCh0aGlzLnZpZXdCb3gpKX19b25WaWV3Qm94Q2hhbmdlZCh7ZGF0YUV4dGVudDp0fSl7dGhpcy5zZXRJc1ZpZXdCb3hPdmVycmlkZGVuKCEwKSx0aGlzLmlzVmlld0JveENoYW5nZWQ9ITAsdGhpcy52aWV3Qm94PXQsdGhpcy51cGRhdGVMaW5lQ2hhcnQoKX12aWV3Qm94UmVzZXQoKXt0aGlzLnNldElzVmlld0JveE92ZXJyaWRkZW4oITEpLHRoaXMuaXNWaWV3Qm94Q2hhbmdlZD0hMCx0aGlzLnVwZGF0ZUxpbmVDaGFydCgpfXNldElzVmlld0JveE92ZXJyaWRkZW4odCl7Y29uc3QgZT10aGlzLmlzVmlld0JveE92ZXJyaWRkZW47dGhpcy5pc1ZpZXdCb3hPdmVycmlkZGVuPXQsZSE9PXQmJnRoaXMub25WaWV3Qm94T3ZlcnJpZGRlbi5uZXh0KHQpfWdldElzVmlld0JveE92ZXJyaWRkZW4oKXtyZXR1cm4gdGhpcy5vblZpZXdCb3hPdmVycmlkZGVufW9uVmlld0JveENoYW5nZWRGcm9tQXhpcyh0LGUpe2NvbnN0IG49T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHRoaXMudmlld0JveCkse1tlXTp0fSk7dGhpcy5vblZpZXdCb3hDaGFuZ2VkKHtkYXRhRXh0ZW50Om59KX19ZmZ0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxmZnQpKFNtKFVnKSl9LGZmdC7JtWNtcD10byh7dHlwZTpmZnQsc2VsZWN0b3JzOltbImxpbmUtY2hhcnQiXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihRaChLdXQsNyxoZyksUWgoSnV0LDcsaGcpLFFoKFF1dCw3LGhnKSxRaCgkdXQsNSxoZykpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uc2VyaWVzVmlldz10LmZpcnN0KSxKaCh0PXRiKCkpJiYobi54QXhpcz10LmZpcnN0KSxKaCh0PXRiKCkpJiYobi55QXhpcz10LmZpcnN0KSxKaCh0PXRiKCkpJiYobi5jaGFydEVsPXQuZmlyc3QpfX0saW5wdXRzOntjdXN0b21WaXNUZW1wbGF0ZToiY3VzdG9tVmlzVGVtcGxhdGUiLGN1c3RvbVhBeGlzVGVtcGxhdGU6ImN1c3RvbVhBeGlzVGVtcGxhdGUiLHVzZURhcmtNb2RlOiJ1c2VEYXJrTW9kZSIscHJlZmVycmVkUmVuZGVyZXJUeXBlOiJwcmVmZXJyZWRSZW5kZXJlclR5cGUiLHNlcmllc0RhdGE6InNlcmllc0RhdGEiLGZpeGVkVmlld0JveDoiZml4ZWRWaWV3Qm94IixzZXJpZXNNZXRhZGF0YU1hcDoic2VyaWVzTWV0YWRhdGFNYXAiLHhTY2FsZVR5cGU6InhTY2FsZVR5cGUiLHlTY2FsZVR5cGU6InlTY2FsZVR5cGUiLGN1c3RvbVhGb3JtYXR0ZXI6ImN1c3RvbVhGb3JtYXR0ZXIiLGN1c3RvbVlGb3JtYXR0ZXI6ImN1c3RvbVlGb3JtYXR0ZXIiLHRvb2x0aXBUZW1wbGF0ZToidG9vbHRpcFRlbXBsYXRlIixsaW5lT25seToibGluZU9ubHkiLGRpc2FibGVVcGRhdGU6ImRpc2FibGVVcGRhdGUiLGlnbm9yZVlPdXRsaWVyczoiaWdub3JlWU91dGxpZXJzIn0sZmVhdHVyZXM6W0JvXSxkZWNsczoxNix2YXJzOjEzLGNvbnN0czpbWyJkZXRlY3RSZXNpemUiLCIiLCJjZGtPdmVybGF5T3JpZ2luIiwiIiwzLCJuZ0NsYXNzIiwicmVzaXplRXZlbnREZWJvdW5jZVBlcmlvZEluTXMiLCJvblJlc2l6ZSJdLFsib3ZlcmxheVRhcmdldCIsImNka092ZXJsYXlPcmlnaW4iXSxbMSwic2VyaWVzLXZpZXciXSxbInNlcmllc1ZpZXciLCIiXSxbMywidmlld0V4dGVudCIsInhTY2FsZSIsInlTY2FsZSIsInhHcmlkQ291bnQiLCJ5R3JpZENvdW50IiwiZG9tRGltIiw0LCJuZ0lmIl0sWzQsIm5nSWYiXSxbMywic2VyaWVzRGF0YSIsInNlcmllc01ldGFkYXRhTWFwIiwidmlld0V4dGVudCIsInhTY2FsZSIsInlTY2FsZSIsInRvb2x0aXBPcmlnaW5FbCIsImRvbURpbSIsInRvb2x0aXBUZW1wbGF0ZSIsIm9uVmlld0V4dGVudENoYW5nZSIsIm9uVmlld0V4dGVudFJlc2V0Iiw0LCJuZ0lmIl0sWyJjbGFzcyIsImN1c3RvbS12aXMiLDQsIm5nSWYiXSxbMSwieS1heGlzIl0sWyJ5QXhpcyIsIiJdLFsiYXhpcyIsInkiLDMsImF4aXNFeHRlbnQiLCJjdXN0b21Gb3JtYXR0ZXIiLCJkb21EaW0iLCJncmlkQ291bnQiLCJzY2FsZSIsIm9uVmlld0V4dGVudENoYW5nZSIsNCwibmdJZiJdLFsxLCJ4LWF4aXMiXSxbInhBeGlzIiwiIl0sWyJheGlzIiwieCIsMywiYXhpc0V4dGVudCIsImN1c3RvbUZvcm1hdHRlciIsImRvbURpbSIsImdyaWRDb3VudCIsInNjYWxlIiwib25WaWV3RXh0ZW50Q2hhbmdlIiw0LCJuZ0lmIl0sWyJjbGFzcyIsImRvdCIsNCwibmdJZiJdLFszLCJ2aWV3RXh0ZW50IiwieFNjYWxlIiwieVNjYWxlIiwieEdyaWRDb3VudCIsInlHcmlkQ291bnQiLCJkb21EaW0iXSxbImNoYXJ0RWwiLCIiXSxbMywic2VyaWVzRGF0YSIsInNlcmllc01ldGFkYXRhTWFwIiwidmlld0V4dGVudCIsInhTY2FsZSIsInlTY2FsZSIsInRvb2x0aXBPcmlnaW5FbCIsImRvbURpbSIsInRvb2x0aXBUZW1wbGF0ZSIsIm9uVmlld0V4dGVudENoYW5nZSIsIm9uVmlld0V4dGVudFJlc2V0Il0sWzEsImN1c3RvbS12aXMiXSxbMywibmdUZW1wbGF0ZU91dGxldCIsIm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0Il0sWyJheGlzIiwieSIsMywiYXhpc0V4dGVudCIsImN1c3RvbUZvcm1hdHRlciIsImRvbURpbSIsImdyaWRDb3VudCIsInNjYWxlIiwib25WaWV3RXh0ZW50Q2hhbmdlIl0sWyJheGlzIiwieCIsMywiYXhpc0V4dGVudCIsImN1c3RvbUZvcm1hdHRlciIsImRvbURpbSIsImdyaWRDb3VudCIsInNjYWxlIiwib25WaWV3RXh0ZW50Q2hhbmdlIl0sWzEsImRvdCJdLFsxLCJyZWN0Il1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJkaXYiLDAsMSksVm0oIm9uUmVzaXplIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uVmlld1Jlc2l6ZSgpfSkpLFJtKDIsImRpdiIsMiwzKSxRcCg0LHRmdCwxLDYsImxpbmUtY2hhcnQtZ3JpZC12aWV3Iiw0KSxRcCg1LG9mdCwzLDIsIm5nLWNvbnRhaW5lciIsNSksUXAoNixpZnQsMSw4LCJsaW5lLWNoYXJ0LWludGVyYWN0aXZlLXZpZXciLDYpLFFwKDcscmZ0LDIsNywiZGl2Iiw3KSxBbSgpLFJtKDgsImRpdiIsOCw5KSxRcCgxMCxzZnQsMSw1LCJsaW5lLWNoYXJ0LWF4aXMiLDEwKSxBbSgpLFJtKDExLCJkaXYiLDExLDEyKSxRcCgxMyxsZnQsMSw1LCJsaW5lLWNoYXJ0LWF4aXMiLDEzKSxRcCgxNCxkZnQsMiw4LCJkaXYiLDcpLEFtKCksUXAoMTUscGZ0LDIsMCwiZGl2IiwxNCksQW0oKSksMiZlJiYoRG0oIm5nQ2xhc3MiLHZoKDEwLG1mdCxuLnVzZURhcmtNb2RlLG4ubGluZU9ubHkpKSgicmVzaXplRXZlbnREZWJvdW5jZVBlcmlvZEluTXMiLDApLHJjKDQpLERtKCJuZ0lmIiwhbi5saW5lT25seSkscmMoMSksRG0oIm5nSWYiLG4uc2hvd0NoYXJ0UmVuZGVyZXJFbGVtZW50KSxyYygxKSxEbSgibmdJZiIsIW4ubGluZU9ubHkpLHJjKDEpLERtKCJuZ0lmIixuLmN1c3RvbVZpc1RlbXBsYXRlKSxyYygzKSxEbSgibmdJZiIsIW4ubGluZU9ubHkpLHJjKDMpLERtKCJuZ0lmIiwhbi5saW5lT25seSkscmMoMSksRG0oIm5nSWYiLG4uY3VzdG9tWEF4aXNUZW1wbGF0ZSkscmMoMSksRG0oIm5nSWYiLCFuLmxpbmVPbmx5KSl9LGRpcmVjdGl2ZXM6W29KLGZMLGFNLGRNLEV1dCxVdXQsTU0sWHV0XSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2NvbnRhaW46c3RyaWN0O2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6aW5oZXJpdDtkaXNwbGF5OmdyaWQ7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVuO3dpZHRoOjEwMCU7Z3JpZC10ZW1wbGF0ZS1hcmVhczoieWF4aXMgc2VyaWVzIiAiZG90IHhheGlzIjtncmlkLXRlbXBsYXRlLWNvbHVtbnM6NTBweCAxZnI7Z3JpZC1hdXRvLXJvd3M6MWZyIDMwcHh9LmNvbnRhaW5lci5kYXJrLW1vZGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9LmNvbnRhaW5lci5saW5lLW9ubHktbW9kZVtfbmdjb250ZW50LSVDT01QJV17Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjAgMWZyO2dyaWQtYXV0by1yb3dzOjFmciAwfS5zZXJpZXMtdmlld1tfbmdjb250ZW50LSVDT01QJV17Z3JpZC1hcmVhOnNlcmllcztwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzpoaWRkZW59LnNlcmllcy12aWV3W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jdXN0b20tdmlzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLnNlcmllcy12aWV3W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNhbnZhc1tfbmdjb250ZW50LSVDT01QJV0sIC5zZXJpZXMtdmlld1tfbmdjb250ZW50LSVDT01QJV0gICBzdmdbX25nY29udGVudC0lQ09NUCVdLCAuc2VyaWVzLXZpZXdbX25nY29udGVudC0lQ09NUCVdICAgbGluZS1jaGFydC1ncmlkLXZpZXdbX25nY29udGVudC0lQ09NUCVdLCAuc2VyaWVzLXZpZXdbX25nY29udGVudC0lQ09NUCVdICAgbGluZS1jaGFydC1pbnRlcmFjdGl2ZS12aWV3W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTAwJTtsZWZ0OjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7d2lkdGg6MTAwJX0uc2VyaWVzLXZpZXdbX25nY29udGVudC0lQ09NUCVdICAgLmN1c3RvbS12aXNbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmV9LngtYXhpc1tfbmdjb250ZW50LSVDT01QJV0gICAuY3VzdG9tLXZpc1tfbmdjb250ZW50LSVDT01QJV0sIC55LWF4aXNbX25nY29udGVudC0lQ09NUCVdICAgLmN1c3RvbS12aXNbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlO2xlZnQ6MDtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7d2lkdGg6MTAwJTstd2Via2l0LW1hc2staW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAjMDAwMCAwJSwgIzAwMCAxMCUsICMwMDAgOTAlLCAjMDAwMCAxMDAlKTttYXNrLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgIzAwMDAgMCUsICMwMDAgMTAlLCAjMDAwIDkwJSwgIzAwMDAgMTAwJSl9LngtYXhpc1tfbmdjb250ZW50LSVDT01QJV0gICBsaW5lLWNoYXJ0LWF4aXNbX25nY29udGVudC0lQ09NUCVdLCAueS1heGlzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGxpbmUtY2hhcnQtYXhpc1tfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCV9LngtYXhpc1tfbmdjb250ZW50LSVDT01QJV17Z3JpZC1hcmVhOnhheGlzO3Bvc2l0aW9uOnJlbGF0aXZlfS55LWF4aXNbX25nY29udGVudC0lQ09NUCVde2dyaWQtYXJlYTp5YXhpc30uZG90W19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O2Rpc3BsYXk6ZmxleDtncmlkLWFyZWE6ZG90O2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0uZG90W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5yZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MXB4O3dpZHRoOjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNhYWF9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGZmdCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJsaW5lLWNoYXJ0Iix0ZW1wbGF0ZVVybDoibGluZV9jaGFydF9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsibGluZV9jaGFydF9jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlVnfV19KSx7c2VyaWVzVmlldzpbe3R5cGU6WmEsYXJnczpbInNlcmllc1ZpZXciLHtzdGF0aWM6ITAscmVhZDpoZ31dfV0seEF4aXM6W3t0eXBlOlphLGFyZ3M6WyJ4QXhpcyIse3N0YXRpYzohMCxyZWFkOmhnfV19XSx5QXhpczpbe3R5cGU6WmEsYXJnczpbInlBeGlzIix7c3RhdGljOiEwLHJlYWQ6aGd9XX1dLGNoYXJ0RWw6W3t0eXBlOlphLGFyZ3M6WyJjaGFydEVsIix7c3RhdGljOiExLHJlYWQ6aGd9XX1dLGN1c3RvbVZpc1RlbXBsYXRlOlt7dHlwZTp4eX1dLGN1c3RvbVhBeGlzVGVtcGxhdGU6W3t0eXBlOnh5fV0sdXNlRGFya01vZGU6W3t0eXBlOnh5fV0scHJlZmVycmVkUmVuZGVyZXJUeXBlOlt7dHlwZTp4eX1dLHNlcmllc0RhdGE6W3t0eXBlOnh5fV0sZml4ZWRWaWV3Qm94Olt7dHlwZTp4eX1dLHNlcmllc01ldGFkYXRhTWFwOlt7dHlwZTp4eX1dLHhTY2FsZVR5cGU6W3t0eXBlOnh5fV0seVNjYWxlVHlwZTpbe3R5cGU6eHl9XSxjdXN0b21YRm9ybWF0dGVyOlt7dHlwZTp4eX1dLGN1c3RvbVlGb3JtYXR0ZXI6W3t0eXBlOnh5fV0sdG9vbHRpcFRlbXBsYXRlOlt7dHlwZTp4eX1dLGxpbmVPbmx5Olt7dHlwZTp4eX1dLGRpc2FibGVVcGRhdGU6W3t0eXBlOnh5fV0saWdub3JlWU91dGxpZXJzOlt7dHlwZTp4eX1dfSk7Y2xhc3MgZ2Z0e31nZnQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGdmdCl9LGdmdC7JtWNtcD10byh7dHlwZTpnZnQsc2VsZWN0b3JzOltbInZpcy1zZWxlY3RlZC10aW1lLWNsaXBwZWQiXV0saW5wdXRzOntzZWxlY3RlZFRpbWU6InNlbGVjdGVkVGltZSJ9LGRlY2xzOjEsdmFyczowLGNvbnN0czpbWyJzdmdJY29uIiwiaW5mb19vdXRsaW5lXzI0cHgiLCJ0aXRsZSIsIkxpbmtlZCBzdGVwIGlzIG5vdCBmb3VuZCBpbiB0aGlzIHZpc3VhbGl6YXRpb24uIFdlIGhpZ2hsaWdodGVkIHRoZSBjbG9zZXN0IHN0ZXAgZm9yIHlvdS4iXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmVG0oMCwibWF0LWljb24iLDApfSxkaXJlY3RpdmVzOltEV10sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9W19uZ2hvc3QtJUNPTVAlXXtjb2xvcjojZDMyZjJmO2hlaWdodDoxZW07bGluZS1oZWlnaHQ6MDt3aWR0aDoxZW19Ym9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVde2NvbG9yOiNkMzJmMmZ9W19uZ2hvc3QtJUNPTVAlXSAgIG1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChnZnQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoidmlzLXNlbGVjdGVkLXRpbWUtY2xpcHBlZCIsdGVtcGxhdGU6J1xuICAgIDxtYXQtaWNvblxuICAgICAgc3ZnSWNvbj0iaW5mb19vdXRsaW5lXzI0cHgiXG4gICAgICB0aXRsZT0iTGlua2VkIHN0ZXAgaXMgbm90IGZvdW5kIGluIHRoaXMgdmlzdWFsaXphdGlvbi4gV2UgaGlnaGxpZ2h0ZWQgdGhlIGNsb3Nlc3Qgc3RlcCBmb3IgeW91LiJcbiAgICA+PC9tYXQtaWNvbj5cbiAgJyxzdHlsZVVybHM6WyJ2aXNfc2VsZWN0ZWRfdGltZV9jbGlwcGVkX2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSxudWxsLHtzZWxlY3RlZFRpbWU6W3t0eXBlOnh5fV19KTtjbGFzcyBoZnR7fWZ1bmN0aW9uIGJmdCh0LGUpezEmdCYmVG0oMCwidmlzLXNlbGVjdGVkLXRpbWUtY2xpcHBlZCIpfWZ1bmN0aW9uIHlmdCh0LGUpezEmdCYmVG0oMCwibWF0LXNwaW5uZXIiLDIzKX1mdW5jdGlvbiBfZnQodCxlKXsxJnQmJihSbSgwLCJ0aCIpLGt1KDEsIlNtb290aGVkIiksQW0oKSl9ZnVuY3Rpb24gQ2Z0KHQsZSl7aWYoMSZ0JiYoUm0oMCwidGQiKSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKS4kaW1wbGljaXQsZT1ZbSgyKTtyYygxKSxEdSgiICIsZS52YWx1ZUZvcm1hdHRlci5mb3JtYXRTaG9ydCh0LnBvaW50LnkpLCIgIil9fWZ1bmN0aW9uIE1mdCh0LGUpe2lmKDEmdCYmKE5tKDApLFJtKDEsInRyIiwyNyksUm0oMiwidGQiLDI4KSxUbSgzLCJzcGFuIiksQW0oKSxSbSg0LCJ0ZCIsMSksa3UoNSksQW0oKSxRcCg2LENmdCwyLDEsInRkIiwzKSxSbSg3LCJ0ZCIpLGt1KDgpLEFtKCksUm0oOSwidGQiKSxrdSgxMCksQW0oKSxSbSgxMSwidGQiKSxrdSgxMiksQWgoMTMsImRhdGUiKSxBbSgpLFJtKDE0LCJ0ZCIpLGt1KDE1KSxBbSgpLEFtKCksem0oKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oMik7cmMoMSkscHUoImNsb3Nlc3QiLHQubWV0YWRhdGEuY2xvc2VzdCkscmMoMiksZHUoImJhY2tncm91bmQtY29sb3IiLHQubWV0YWRhdGEuY29sb3IpLHJjKDIpLFN1KHQubWV0YWRhdGEuZGlzcGxheU5hbWUpLHJjKDEpLERtKCJuZ0lmIixuLnNtb290aGluZ0VuYWJsZWQpLHJjKDIpLFN1KG4udmFsdWVGb3JtYXR0ZXIuZm9ybWF0U2hvcnQodC5wb2ludC52YWx1ZSkpLHJjKDIpLFN1KG4uc3RlcEZvcm1hdHRlci5mb3JtYXRTaG9ydCh0LnBvaW50LnN0ZXApKSxyYygyKSxTdShOaCgxMywxMCx0LnBvaW50LndhbGxUaW1lLCJzaG9ydCIpKSxyYygzKSxEdSgiICIsbi5yZWxhdGl2ZVhGb3JtYXR0ZXIuZm9ybWF0UmVhZGFibGUodC5wb2ludC5yZWxhdGl2ZVRpbWVJbk1zKSwiICIpfX1mdW5jdGlvbiB2ZnQodCxlKXtpZigxJnQmJihSbSgwLCJ0YWJsZSIsMjQpLFJtKDEsInRoZWFkIiksUm0oMiwidHIiKSxUbSgzLCJ0aCIsMjUpLFJtKDQsInRoIiksa3UoNSwiUnVuIiksQW0oKSxRcCg2LF9mdCwyLDAsInRoIiwzKSxSbSg3LCJ0aCIpLGt1KDgsIlZhbHVlIiksQW0oKSxSbSg5LCJ0aCIpLGt1KDEwLCJTdGVwIiksQW0oKSxSbSgxMSwidGgiKSxrdSgxMiwiVGltZSIpLEFtKCksUm0oMTMsInRoIiksa3UoMTQsIlJlbGF0aXZlIiksQW0oKSxBbSgpLEFtKCksUm0oMTUsInRib2R5IiksUXAoMTYsTWZ0LDE2LDEzLCJuZy1jb250YWluZXIiLDI2KSxBbSgpLEFtKCkpLDImdCl7Y29uc3QgdD1lLmRhdGEsbj1lLmN1cnNvckxvY2F0aW9uSW5EYXRhQ29vcmQsbz1ZbSgpO3JjKDYpLERtKCJuZ0lmIixvLnNtb290aGluZ0VuYWJsZWQpLHJjKDEwKSxEbSgibmdGb3JPZiIsby5nZXRDdXJzb3JBd2FyZVRvb2x0aXBEYXRhKHQsbikpKCJuZ0ZvclRyYWNrQnkiLG8udHJhY2tCeVRvb2x0aXBEYXR1bSl9fWhmdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8aGZ0KX0saGZ0Lsm1Y21wPXRvKHt0eXBlOmhmdCxzZWxlY3RvcnM6W1sibGlua2VkLXRpbWUtZm9iIl1dLGlucHV0czp7c3RlcDoic3RlcCJ9LGRlY2xzOjMsdmFyczozLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJzcGFuIiksa3UoMSksQWgoMiwibnVtYmVyIiksQW0oKSksMiZlJiYocmMoMSksU3UoVGgoMiwxLG4uc3RlcCkpKX0scGlwZXM6W0ZNXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lLWJsb2NrfXNwYW5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtib3JkZXItcmFkaXVzOjI1cHg7Y29sb3I6aW5oZXJpdDtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6MTFweDtwYWRkaW5nOjJweCA1cHh9c3Bhbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIHNwYW5bX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZXtib3JkZXItY29sb3I6IzYxNjE2MX1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICBzcGFuW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgc3Bhbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojNjE2MTYxO2JvcmRlci1jb2xvcjojOGU5OGEzfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIHNwYW5bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICBzcGFuW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgYm9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgc3Bhbltfbmdjb250ZW50LSVDT01QJV06YWN0aXZlLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICBzcGFuW19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmV7Ym9yZGVyLWNvbG9yOiNlZWV9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGhmdCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJsaW5rZWQtdGltZS1mb2IiLHRlbXBsYXRlOiI8c3Bhbj57eyBzdGVwIHwgbnVtYmVyIH19PC9zcGFuPiIsc3R5bGVVcmxzOlsibGlua2VkX3RpbWVfZm9iX2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSxudWxsLHtzdGVwOlt7dHlwZTp4eX1dfSk7Y29uc3QgeGZ0PWZ1bmN0aW9uKHQpe3JldHVyblswLHRdfSxPZnQ9ZnVuY3Rpb24oKXtyZXR1cm57Im91dC1vZi1zZWxlY3RlZC10aW1lIjohMCxlbmQ6ITAscmFuZ2U6ITB9fTtmdW5jdGlvbiBQZnQodCxlKXtpZigxJnQmJlRtKDAsImRpdiIsMjkpLDImdCl7Y29uc3QgdD1ZbSgyKSxlPXQudmlld0V4dGVudCxuPXQuZG9tRGltZW5zaW9uLG89dC54U2NhbGUsaT1ZbSgpO2R1KCJsZWZ0IixvLmZvcndhcmQoZS54LE1oKDMseGZ0LG4ud2lkdGgpLGkuc2VsZWN0ZWRUaW1lLmVuZFN0ZXApKyJweCIpLERtKCJuZ0NsYXNzIixDaCg1LE9mdCkpfX1jb25zdCB3ZnQ9ZnVuY3Rpb24odCl7cmV0dXJuW3QsMF19LGtmdD1mdW5jdGlvbih0KXtyZXR1cm57Im91dC1vZi1zZWxlY3RlZC10aW1lIjohMCxzdGFydDohMCxyYW5nZTp0fX07ZnVuY3Rpb24gU2Z0KHQsZSl7aWYoMSZ0JiYoTm0oMCksVG0oMSwiZGl2IiwyOSksUXAoMixQZnQsMSw2LCJkaXYiLDMwKSx6bSgpKSwyJnQpe2NvbnN0IHQ9WW0oKSxlPXQudmlld0V4dGVudCxuPXQuZG9tRGltZW5zaW9uLG89dC54U2NhbGUsaT1ZbSgpO3JjKDEpLGR1KCJyaWdodCIsby5mb3J3YXJkKGUueCxNaCg0LHdmdCxuLndpZHRoKSxpLnNlbGVjdGVkVGltZS5zdGFydFN0ZXApKyJweCIpLERtKCJuZ0NsYXNzIixNaCg2LGtmdCwhIWkuc2VsZWN0ZWRUaW1lLmVuZFN0ZXApKSxyYygxKSxEbSgibmdJZiIsaS5zZWxlY3RlZFRpbWUuZW5kU3RlcCl9fWZ1bmN0aW9uIERmdCh0LGUpezEmdCYmUXAoMCxTZnQsMyw4LCJuZy1jb250YWluZXIiLDMpLDImdCYmRG0oIm5nSWYiLFltKCkuc2VsZWN0ZWRUaW1lKX1mdW5jdGlvbiBFZnQodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDMxKSxUbSgxLCJsaW5rZWQtdGltZS1mb2IiLDMyKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMiksZT10LnZpZXdFeHRlbnQsbj10LmRvbURpbWVuc2lvbixvPXQueFNjYWxlLGk9WW0oKTtkdSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrby5mb3J3YXJkKGUueCxNaCgzLHhmdCxuLndpZHRoKSxpLnNlbGVjdGVkVGltZS5lbmRTdGVwKSsicHgsIDApIikscmMoMSksRG0oInN0ZXAiLGkuc2VsZWN0ZWRUaW1lLmVuZFN0ZXApfX1mdW5jdGlvbiBSZnQodCxlKXtpZigxJnQmJihObSgwKSxSbSgxLCJkaXYiLDMxKSxUbSgyLCJsaW5rZWQtdGltZS1mb2IiLDMyKSxBbSgpLFFwKDMsRWZ0LDIsNSwiZGl2IiwzMyksem0oKSksMiZ0KXtjb25zdCB0PVltKCksZT10LnZpZXdFeHRlbnQsbj10LmRvbURpbWVuc2lvbixvPXQueFNjYWxlLGk9WW0oKTtyYygxKSxkdSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrby5mb3J3YXJkKGUueCxNaCg0LHhmdCxuLndpZHRoKSxpLnNlbGVjdGVkVGltZS5zdGFydFN0ZXApKyJweCwgMCkiKSxyYygxKSxEbSgic3RlcCIsaS5zZWxlY3RlZFRpbWUuc3RhcnRTdGVwKSxyYygxKSxEbSgibmdJZiIsaS5zZWxlY3RlZFRpbWUuZW5kU3RlcCl9fWZ1bmN0aW9uIEFmdCh0LGUpezEmdCYmUXAoMCxSZnQsNCw2LCJuZy1jb250YWluZXIiLDMpLDImdCYmRG0oIm5nSWYiLFltKCkuc2VsZWN0ZWRUaW1lKX1jbGFzcyBUZnR7Y29uc3RydWN0b3IodCxlKXt0aGlzLnJlZj10LHRoaXMuZGlhbG9nPWUsdGhpcy5EYXRhTG9hZFN0YXRlPXlFLHRoaXMuUmVuZGVyZXJUeXBlPUsyLHRoaXMuU2NhbGVUeXBlPUoyLHRoaXMub25GdWxsU2l6ZVRvZ2dsZT1uZXcgTGgsdGhpcy5vblBpbkNsaWNrZWQ9bmV3IExoLHRoaXMueVNjYWxlVHlwZT1KMi5MSU5FQVIsdGhpcy5pc1ZpZXdCb3hPdmVycmlkZGVuPSExLHRoaXMucmVsYXRpdmVYRm9ybWF0dGVyPVhvdCx0aGlzLnZhbHVlRm9ybWF0dGVyPUlvdCx0aGlzLnN0ZXBGb3JtYXR0ZXI9TG90fXRvZ2dsZVlTY2FsZVR5cGUoKXt0aGlzLnlTY2FsZVR5cGU9dGhpcy55U2NhbGVUeXBlPT09SjIuTElORUFSP0oyLkxPRzEwOkoyLkxJTkVBUn1yZXNldERvbWFpbigpe3RoaXMubGluZUNoYXJ0JiZ0aGlzLmxpbmVDaGFydC52aWV3Qm94UmVzZXQoKX10cmFja0J5VG9vbHRpcERhdHVtKHQsZSl7cmV0dXJuIGUuaWR9Z2V0Q3VzdG9tWEZvcm1hdHRlcigpe3N3aXRjaCh0aGlzLnhBeGlzVHlwZSl7Y2FzZSB5QS5SRUxBVElWRTpyZXR1cm4gWG90O2Nhc2UgeUEuU1RFUDpyZXR1cm4gVW90O2Nhc2UgeUEuV0FMTF9USU1FOmRlZmF1bHQ6cmV0dXJufX1nZXRDdXJzb3JBd2FyZVRvb2x0aXBEYXRhKHQsZSl7Y29uc3Qgbj10Lm1hcCgodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHttZXRhZGF0YTpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5tZXRhZGF0YSkse2Nsb3Nlc3Q6ITEsZGlzdFNxVG9DdXJzb3I6TWF0aC5oeXBvdCh0LnBvaW50LngtZS54LHQucG9pbnQueS1lLnkpfSl9KSkpO2xldCBvPTEvMCxpPTA7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0Kyspbz5uW3RdLm1ldGFkYXRhLmRpc3RTcVRvQ3Vyc29yJiYobz1uW3RdLm1ldGFkYXRhLmRpc3RTcVRvQ3Vyc29yLGk9dCk7c3dpdGNoKG4ubGVuZ3RoJiYobltpXS5tZXRhZGF0YS5jbG9zZXN0PSEwKSx0aGlzLnRvb2x0aXBTb3J0KXtjYXNlIGJBLkRFRkFVTFQ6cmV0dXJuIG47Y2FzZSBiQS5BU0NFTkRJTkc6cmV0dXJuIG4uc29ydCgoKHQsZSk9PnQucG9pbnQueS1lLnBvaW50LnkpKTtjYXNlIGJBLkRFU0NFTkRJTkc6cmV0dXJuIG4uc29ydCgoKHQsZSk9PmUucG9pbnQueS10LnBvaW50LnkpKTtjYXNlIGJBLk5FQVJFU1Q6cmV0dXJuIG4uc29ydCgoKHQsZSk9PnQubWV0YWRhdGEuZGlzdFNxVG9DdXJzb3ItZS5tZXRhZGF0YS5kaXN0U3FUb0N1cnNvcikpfX1vcGVuRGF0YURvd25sb2FkRGlhbG9nKCl7dGhpcy5kaWFsb2cub3Blbih0aGlzLkRhdGFEb3dubG9hZENvbXBvbmVudCx7ZGF0YTp7Y2FyZElkOnRoaXMuY2FyZElkfX0pfX1UZnQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFRmdCkoU20oaGcpLFNtKG9XKSl9LFRmdC7JtWNtcD10byh7dHlwZTpUZnQsc2VsZWN0b3JzOltbInNjYWxhci1jYXJkLWNvbXBvbmVudCJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmUWgoZmZ0LDUpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4ubGluZUNoYXJ0PXQuZmlyc3QpfX0saW5wdXRzOntjYXJkSWQ6ImNhcmRJZCIsY2hhcnRNZXRhZGF0YU1hcDoiY2hhcnRNZXRhZGF0YU1hcCIsRGF0YURvd25sb2FkQ29tcG9uZW50OiJEYXRhRG93bmxvYWRDb21wb25lbnQiLGRhdGFTZXJpZXM6ImRhdGFTZXJpZXMiLGlnbm9yZU91dGxpZXJzOiJpZ25vcmVPdXRsaWVycyIsaXNDYXJkVmlzaWJsZToiaXNDYXJkVmlzaWJsZSIsaXNQaW5uZWQ6ImlzUGlubmVkIixsb2FkU3RhdGU6ImxvYWRTdGF0ZSIsc2hvd0Z1bGxTaXplOiJzaG93RnVsbFNpemUiLHNtb290aGluZ0VuYWJsZWQ6InNtb290aGluZ0VuYWJsZWQiLHRhZzoidGFnIix0aXRsZToidGl0bGUiLHRvb2x0aXBTb3J0OiJ0b29sdGlwU29ydCIseEF4aXNUeXBlOiJ4QXhpc1R5cGUiLHhTY2FsZVR5cGU6InhTY2FsZVR5cGUiLHVzZURhcmtNb2RlOiJ1c2VEYXJrTW9kZSIsc2VsZWN0ZWRUaW1lOiJzZWxlY3RlZFRpbWUifSxvdXRwdXRzOntvbkZ1bGxTaXplVG9nZ2xlOiJvbkZ1bGxTaXplVG9nZ2xlIixvblBpbkNsaWNrZWQ6Im9uUGluQ2xpY2tlZCJ9LGRlY2xzOjM0LHZhcnM6MjYsY29uc3RzOmZ1bmN0aW9uKCl7bGV0IHQsZSxuLG8saTtyZXR1cm4gdD0idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZT9nb29nLmdldE1zZygiRml0IGxpbmUgY2hhcnQgZG9tYWlucyB0byBkYXRhIik6JGxvY2FsaXplYDpBIGJ1dHRvbiB0aGF0IHJlc2V0cyBsaW5lIGNoYXJ0IGRvbWFpbiB0byB0aGUgZGF0YeKQn2U2OGE1NTI5NDFhYjQyN2E5OWU3NDM3ZTA4NDQzZjMwYWM3MWNjZDbikJ8zODMwNjQ2NTIxMDU4MjY4NTU4OkZpdCBsaW5lIGNoYXJ0IGRvbWFpbnMgdG8gZGF0YWAsZT0idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZT9nb29nLmdldE1zZygiUGluIGNhcmQiKTokbG9jYWxpemVgOkEgYnV0dG9uIHRvIHBpbiBhIGNhcmQu4pCfZTY2NWRjNzEyYmQ1ZjE4ZDRkZmEzYTI5ZTEyNWQ1NjVjYzUxZTJmNuKQnzcyODQ2MDY0MjYyMzQzNzUzNDQ6UGluIGNhcmRgLG49InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSYmbmdJMThuQ2xvc3VyZU1vZGU/Z29vZy5nZXRNc2coIlRvZ2dsZSBmdWxsIHNpemUgbW9kZSIpOiRsb2NhbGl6ZWA6QSBidXR0b24gb24gbGluZSBjaGFydCB0aGF0IHRvZ2dsZXMgZnVsbCBzaXplIG1vZGUu4pCfZmM4Zjc2N2QwYjlmOTMwMTg3YTFiYWUzNDQ3N2FkMjg3MzZlY2UzM+KQnzkxNTcyMTU2MzYzODkyNjU5NzpUb2dnbGUgZnVsbCBzaXplIG1vZGVgLG89InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSYmbmdJMThuQ2xvc3VyZU1vZGU/Z29vZy5nZXRNc2coIk1vcmUgbGluZSBjaGFydCBvcHRpb25zIik6JGxvY2FsaXplYDpBbiBvdmVyZmxvdyBtZW51IGJ1dHRvbiB0aGF0IG9wZW5zIG1vcmUgbGluZSBjaGFydCBvcHRpb25z4pCfYjI2MGZhYjk0NmEzMDc3Y2UyMGZkMjhlMzM2OTc5ZjU4NjcyMGU4ZOKQnzg3ODA1Mzc0MDIxMDMzNjQzNTpNb3JlIGxpbmUgY2hhcnQgb3B0aW9uc2AsaT0idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZT9nb29nLmdldE1zZygiVG9nZ2xlIFktYXhpcyBsb2cgc2NhbGUgb24gbGluZSBjaGFydCIpOiRsb2NhbGl6ZWA6QSBidXR0b24gdGhhdCB0b2dnbGVzIGxvZyBzY2FsZSBvbiB5LWF4aXMgb24gYSBsaW5lIGNoYXJ04pCfZmU5MWY5NmFiOWIzYmFjYTVhNDg5MTNmMmIwZmFlODQ0ODNkOTNlM+KQnzMzNzQ2NDU2MjA2Mzg4ODM5MjY6VG9nZ2xlIFktYXhpcyBsb2cgc2NhbGUgb24gbGluZSBjaGFydGAsW1sxLCJoZWFkaW5nIl0sWzEsIm5hbWUiXSxbMSwidGFnIiwzLCJ0aXRsZSIsInZhbHVlIl0sWzQsIm5nSWYiXSxbMSwiY29udHJvbHMiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLHQsMywiZGlzYWJsZWQiLCJ0aXRsZSIsImNsaWNrIl0sWyJzdmdJY29uIiwic2V0dGluZ3Nfb3ZlcnNjYW5fMjRweCJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsZSwxLCJwaW4tYnV0dG9uIiwzLCJjbGljayJdLFszLCJzdmdJY29uIl0sWyJtYXQtaWNvbi1idXR0b24iLCIiLCJhcmlhLWxhYmVsIixuLCJ0aXRsZSIsIlRvZ2dsZSBmdWxsIHNpemUgbW9kZSIsMywiY2xpY2siXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLG8sInRpdGxlIiwiTW9yZSBsaW5lIGNoYXJ0IG9wdGlvbnMiLDMsIm1hdE1lbnVUcmlnZ2VyRm9yIl0sWyJzdmdJY29uIiwibW9yZV92ZXJ0XzI0cHgiXSxbIm1lbnUiLCJtYXRNZW51Il0sWyJtYXQtbWVudS1pdGVtIiwiIiwiYXJpYS1sYWJlbCIsaSwzLCJjbGljayJdLFsic3ZnSWNvbiIsImxpbmVfd2VpZ2h0XzI0cHgiXSxbIm1hdC1tZW51LWl0ZW0iLCIiLCJhcmlhLWxhYmVsIiwiT3BlbiBkaWFsb2cgdG8gZG93bmxvYWQgZGF0YSIsMywiY2xpY2siXSxbInN2Z0ljb24iLCJnZXRfYXBwXzI0cHgiXSxbMSwiY2hhcnQtY29udGFpbmVyIl0sWyJkaWFtZXRlciIsIjE4Iiw0LCJuZ0lmIl0sWzMsImRpc2FibGVVcGRhdGUiLCJwcmVmZXJyZWRSZW5kZXJlclR5cGUiLCJzZXJpZXNEYXRhIiwic2VyaWVzTWV0YWRhdGFNYXAiLCJ4U2NhbGVUeXBlIiwieVNjYWxlVHlwZSIsImN1c3RvbVhGb3JtYXR0ZXIiLCJpZ25vcmVZT3V0bGllcnMiLCJ0b29sdGlwVGVtcGxhdGUiLCJ1c2VEYXJrTW9kZSIsImN1c3RvbVZpc1RlbXBsYXRlIiwiY3VzdG9tWEF4aXNUZW1wbGF0ZSIsIm9uVmlld0JveE92ZXJyaWRkZW4iXSxbInRvb2x0aXAiLCIiXSxbImxpbmVDaGFydEN1c3RvbVZpcyIsIiJdLFsibGluZUNoYXJ0Q3VzdG9tWEF4aXNWaXMiLCIiXSxbImRpYW1ldGVyIiwiMTgiXSxbMSwidG9vbHRpcCJdLFsxLCJjaXJjbGUtaGVhZGVyIl0sWzQsIm5nRm9yIiwibmdGb3JPZiIsIm5nRm9yVHJhY2tCeSJdLFsxLCJ0b29sdGlwLXJvdyJdLFsxLCJ0b29sdGlwLXJvdy1jaXJjbGUiXSxbMywibmdDbGFzcyJdLFszLCJuZ0NsYXNzIiwibGVmdCIsNCwibmdJZiJdLFsxLCJsaW5rZWQtdGltZS1mb2ItY29udGFpbmVyIl0sWzEsInNlbGVjdGVkLXRpbWUtZm9iIiwzLCJzdGVwIl0sWyJjbGFzcyIsImxpbmtlZC10aW1lLWZvYi1jb250YWluZXIiLDMsInRyYW5zZm9ybSIsNCwibmdJZiJdXX0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmKFJtKDAsImRpdiIsMCksUm0oMSwic3BhbiIsMSksVG0oMiwidGItdHJ1bmNhdGVkLXBhdGgiLDIpLFFwKDMsYmZ0LDEsMCwidmlzLXNlbGVjdGVkLXRpbWUtY2xpcHBlZCIsMyksQW0oKSxSbSg0LCJzcGFuIiw0KSxSbSg1LCJidXR0b24iLDUpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5yZXNldERvbWFpbigpfSkpLEFoKDYsImFzeW5jIiksQWgoNywiYXN5bmMiKSxUbSg4LCJtYXQtaWNvbiIsNiksQW0oKSxSbSg5LCJidXR0b24iLDcpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblBpbkNsaWNrZWQuZW1pdCghbi5pc1Bpbm5lZCl9KSksVG0oMTAsIm1hdC1pY29uIiw4KSxBbSgpLFJtKDExLCJidXR0b24iLDkpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkZ1bGxTaXplVG9nZ2xlLmVtaXQoKX0pKSxUbSgxMiwibWF0LWljb24iLDgpLEFtKCksUm0oMTMsImJ1dHRvbiIsMTApLFRtKDE0LCJtYXQtaWNvbiIsMTEpLEFtKCksUm0oMTUsIm1hdC1tZW51IixudWxsLDEyKSxSbSgxNywiYnV0dG9uIiwxMyksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLnRvZ2dsZVlTY2FsZVR5cGUoKX0pKSxUbSgxOCwibWF0LWljb24iLDE0KSxSbSgxOSwic3BhbiIpLGt1KDIwLCJUb2dnbGUgWS1heGlzIGxvZyBzY2FsZSIpLEFtKCksQW0oKSxSbSgyMSwiYnV0dG9uIiwxNSksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9wZW5EYXRhRG93bmxvYWREaWFsb2coKX0pKSxUbSgyMiwibWF0LWljb24iLDE2KSxSbSgyMywic3BhbiIpLGt1KDI0LCJEb3dubG9hZCBkYXRhIiksQW0oKSxBbSgpLEFtKCksQW0oKSxBbSgpLFJtKDI1LCJkaXYiLDE3KSxRcCgyNix5ZnQsMSwwLCJtYXQtc3Bpbm5lciIsMTgpLFJtKDI3LCJsaW5lLWNoYXJ0IiwxOSksVm0oIm9uVmlld0JveE92ZXJyaWRkZW4iLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLmlzVmlld0JveE92ZXJyaWRkZW49ZX0pKSxBbSgpLFFwKDI4LHZmdCwxNywzLCJuZy10ZW1wbGF0ZSIsbnVsbCwyMCxpYiksQW0oKSxRcCgzMCxEZnQsMSwxLCJuZy10ZW1wbGF0ZSIsbnVsbCwyMSxpYiksUXAoMzIsQWZ0LDEsMSwibmctdGVtcGxhdGUiLG51bGwsMjIsaWIpKSwyJmUpe2NvbnN0IHQ9JHAoMTYpLGU9JHAoMjkpLG89JHAoMzEpLGk9JHAoMzMpO3JjKDIpLEttKCJ0aXRsZSIsbi50YWcpLEttKCJ2YWx1ZSIsbi50aXRsZSkscmMoMSksRG0oIm5nSWYiLG4uc2VsZWN0ZWRUaW1lJiZuLnNlbGVjdGVkVGltZS5jbGlwcGVkKSxyYygyKSxEbSgiZGlzYWJsZWQiLCFuLmxpbmVDaGFydHx8IVRoKDYsMjIsbi5saW5lQ2hhcnQuZ2V0SXNWaWV3Qm94T3ZlcnJpZGRlbigpKSkoInRpdGxlIixuLmxpbmVDaGFydCYmVGgoNywyNCxuLmxpbmVDaGFydC5nZXRJc1ZpZXdCb3hPdmVycmlkZGVuKCkpPyJMaW5lIGNoYXJ0IGlzIGFscmVhZHkgZml0dGVkIHRvIGRhdGEuIFdoZW4gZGF0YSB1cGRhdGVzLCB0aGUgbGluZSBjaGFydCB3aWxsIGF1dG8gZml0IHRvIGl0cyBkb21haW4uIjoiRml0IGxpbmUgY2hhcnQgZG9tYWlucyB0byBkYXRhIikscmMoNCksanAoInRpdGxlIixuLmlzUGlubmVkPyJVbnBpbiBjYXJkIjoiUGluIGNhcmQiKSxyYygxKSxEbSgic3ZnSWNvbiIsbi5pc1Bpbm5lZD8ia2VlcF8yNHB4Ijoia2VlcF9vdXRsaW5lXzI0cHgiKSxyYygyKSxEbSgic3ZnSWNvbiIsbi5zaG93RnVsbFNpemU/ImZ1bGxzY3JlZW5fZXhpdF8yNHB4IjoiZnVsbHNjcmVlbl8yNHB4IikscmMoMSksRG0oIm1hdE1lbnVUcmlnZ2VyRm9yIix0KSxyYygxMyksRG0oIm5nSWYiLG4ubG9hZFN0YXRlPT09bi5EYXRhTG9hZFN0YXRlLkxPQURJTkcpLHJjKDEpLERtKCJkaXNhYmxlVXBkYXRlIiwhbi5pc0NhcmRWaXNpYmxlKSgicHJlZmVycmVkUmVuZGVyZXJUeXBlIixuLlJlbmRlcmVyVHlwZS5XRUJHTCkoInNlcmllc0RhdGEiLG4uZGF0YVNlcmllcykoInNlcmllc01ldGFkYXRhTWFwIixuLmNoYXJ0TWV0YWRhdGFNYXApKCJ4U2NhbGVUeXBlIixuLnhTY2FsZVR5cGUpKCJ5U2NhbGVUeXBlIixuLnlTY2FsZVR5cGUpKCJjdXN0b21YRm9ybWF0dGVyIixuLmdldEN1c3RvbVhGb3JtYXR0ZXIoKSkoImlnbm9yZVlPdXRsaWVycyIsbi5pZ25vcmVPdXRsaWVycykoInRvb2x0aXBUZW1wbGF0ZSIsZSkoInVzZURhcmtNb2RlIixuLnVzZURhcmtNb2RlKSgiY3VzdG9tVmlzVGVtcGxhdGUiLG8pKCJjdXN0b21YQXhpc1RlbXBsYXRlIixpKX19LGRpcmVjdGl2ZXM6W3oyLGRNLFhILERXLGVZLEtXLFdXLGZmdCxnZnQsbzEsbE0sYU0saGZ0XSxwaXBlczpbd00sUk1dLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtib3gtc2l6aW5nOmJvcmRlci1ib3g7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6YXV0bztwYWRkaW5nOjE2cHg7cGFkZGluZy10b3A6NHB4fS5oZWFkaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O2ZvbnQtc2l6ZToxNHB4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO21hcmdpbi1ib3R0b206NHB4O3Bvc2l0aW9uOnJlbGF0aXZlfS5oZWFkaW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpncmlkO2dhcDo1cHg7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOmF1dG8gYXV0b30uaGVhZGluZ1tfbmdjb250ZW50LSVDT01QJV0gICB2aXMtc2VsZWN0ZWQtdGltZS1jbGlwcGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MS4yZW07bGluZS1oZWlnaHQ6MH0udGFnW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW59LnBpbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgbWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxOHB4fS5jb250cm9sc1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MTt3aGl0ZS1zcGFjZTpub3dyYXA7ZmxleC1zaHJpbms6MDttYXJnaW4tcmlnaHQ6LTEycHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmNvbnRyb2xzW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmNvbnRyb2xzW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX0uY2hhcnQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZTtmbGV4OjF9LmNoYXJ0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0gICBtYXQtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MTFweDt0b3A6MTFweH0uY2hhcnQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGxpbmUtY2hhcnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjEwMCV9LnRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1zcGFjaW5nOjRweDtmb250LXNpemU6MTNweH0udG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpsZWZ0fS50b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC50b29sdGlwLXJvd1tfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwfS50b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC50b29sdGlwLXJvdy1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmlubGluZS1mbGV4O2hlaWdodDoxMnB4O3dpZHRoOjEycHh9LnRvb2x0aXBbX25nY29udGVudC0lQ09NUCVdICAgLnRvb2x0aXAtcm93LWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0gPiBzcGFuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmFkaXVzOjUwJTtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsLjQpO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDoxMHB4O3dpZHRoOjEwcHh9LnRvb2x0aXBbX25nY29udGVudC0lQ09NUCVdICAgLmNsb3Nlc3RbX25nY29udGVudC0lQ09NUCVdICAgLnRvb2x0aXAtcm93LWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0gPiBzcGFuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZjtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5vdXQtb2Ytc2VsZWN0ZWQtdGltZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjAgZGFzaGVkIGN1cnJlbnRDb2xvcjtoZWlnaHQ6MTAwJTtwb3NpdGlvbjphYnNvbHV0ZX0ub3V0LW9mLXNlbGVjdGVkLXRpbWUuc3RhcnRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodC13aWR0aDoycHg7bWFyZ2luLWxlZnQ6LTFweH0ub3V0LW9mLXNlbGVjdGVkLXRpbWUuc3RhcnQucmFuZ2VbX25nY29udGVudC0lQ09NUCVde2xlZnQ6MH0ub3V0LW9mLXNlbGVjdGVkLXRpbWUuZW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdC13aWR0aDoycHg7bWFyZ2luLXJpZ2h0Oi0xcHg7cmlnaHQ6MH0ub3V0LW9mLXNlbGVjdGVkLXRpbWUucmFuZ2VbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLm91dC1vZi1zZWxlY3RlZC10aW1lLnJhbmdlW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLm91dC1vZi1zZWxlY3RlZC10aW1lLnJhbmdlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQpfS5saW5rZWQtdGltZS1mb2ItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmlubGluZS1ibG9jaztsZWZ0OjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjB9bGlua2VkLXRpbWUtZm9iW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKX0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoVGZ0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InNjYWxhci1jYXJkLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6InNjYWxhcl9jYXJkX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyJzY2FsYXJfY2FyZF9jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTpvV31dfSkse2NhcmRJZDpbe3R5cGU6eHl9XSxjaGFydE1ldGFkYXRhTWFwOlt7dHlwZTp4eX1dLERhdGFEb3dubG9hZENvbXBvbmVudDpbe3R5cGU6eHl9XSxkYXRhU2VyaWVzOlt7dHlwZTp4eX1dLGlnbm9yZU91dGxpZXJzOlt7dHlwZTp4eX1dLGlzQ2FyZFZpc2libGU6W3t0eXBlOnh5fV0saXNQaW5uZWQ6W3t0eXBlOnh5fV0sbG9hZFN0YXRlOlt7dHlwZTp4eX1dLHNob3dGdWxsU2l6ZTpbe3R5cGU6eHl9XSxzbW9vdGhpbmdFbmFibGVkOlt7dHlwZTp4eX1dLHRhZzpbe3R5cGU6eHl9XSx0aXRsZTpbe3R5cGU6eHl9XSx0b29sdGlwU29ydDpbe3R5cGU6eHl9XSx4QXhpc1R5cGU6W3t0eXBlOnh5fV0seFNjYWxlVHlwZTpbe3R5cGU6eHl9XSx1c2VEYXJrTW9kZTpbe3R5cGU6eHl9XSxzZWxlY3RlZFRpbWU6W3t0eXBlOnh5fV0sb25GdWxsU2l6ZVRvZ2dsZTpbe3R5cGU6T3l9XSxvblBpbkNsaWNrZWQ6W3t0eXBlOk95fV0sbGluZUNoYXJ0Olt7dHlwZTpaYSxhcmdzOltmZnRdfV19KTtjbGFzcyBOZnR7Y29uc3RydWN0b3IodCxlKXt0aGlzLnJlZj10LHRoaXMuY2RrU2Nyb2xsYWJsZT1lLHRoaXMub25WaXNpYmlsaXR5Q2hhbmdlPW5ldyBMaCx0aGlzLm5nVW5zdWJzY3JpYmUkPW5ldyBJLHRoaXMub25FdmVudCQ9bmV3IEl9bmdPbkluaXQoKXtjb25zdCB0PW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigodD0+e3RoaXMub25FdmVudCQubmV4dCh0KX0pLHtyb290OnRoaXMuY2RrU2Nyb2xsYWJsZT90aGlzLmNka1Njcm9sbGFibGUuZ2V0RWxlbWVudFJlZigpLm5hdGl2ZUVsZW1lbnQ6bnVsbCxyb290TWFyZ2luOnRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXJNYXJnaW59KTt0Lm9ic2VydmUodGhpcy5yZWYubmF0aXZlRWxlbWVudCksdGhpcy5uZ1Vuc3Vic2NyaWJlJC5zdWJzY3JpYmUoKCgpPT57dC51bm9ic2VydmUodGhpcy5yZWYubmF0aXZlRWxlbWVudCl9KSksdGhpcy5vbkV2ZW50JC5waXBlKEllKHRoaXMubmdVbnN1YnNjcmliZSQpKS5zdWJzY3JpYmUoKHQ9Pntjb25zdCBlPXQuc2xpY2UoLTEpWzBdO3RoaXMub25WaXNpYmlsaXR5Q2hhbmdlLmVtaXQoe3Zpc2libGU6ZS5pc0ludGVyc2VjdGluZ30pfSkpfW5nT25EZXN0cm95KCl7dGhpcy5uZ1Vuc3Vic2NyaWJlJC5uZXh0KCksdGhpcy5uZ1Vuc3Vic2NyaWJlJC5jb21wbGV0ZSgpfXdhaXRGb3JFdmVudEZvclRlc3RPbmx5KCl7cmV0dXJuIG5ldyBQcm9taXNlKCh0PT50aGlzLm9uRXZlbnQkLnBpcGUoYmUoMSkpLnN1YnNjcmliZSgoKCk9Pnt0KCl9KSkpKX19ZnVuY3Rpb24gemZ0KHQsZSl7cmV0dXJuIHQubGVuZ3RoPT09ZS5sZW5ndGgmJnQuZXZlcnkoKCh0LG4pPT57Y29uc3Qgbz1lW25dLGk9dC5wb2ludHMsYT1vLnBvaW50cztyZXR1cm4gdC5ydW5JZD09PW8ucnVuSWQmJmkubGVuZ3RoPT09YS5sZW5ndGgmJmkuZXZlcnkoKCh0LGUpPT57Y29uc3Qgbj1hW2VdO3JldHVybiB0Lng9PT1uLngmJnQueT09PW4ueX0pKX0pKX1OZnQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fE5mdCkoU20oaGcpLFNtKG1GLDgpKX0sTmZ0Lsm1ZGlyPWxvKHt0eXBlOk5mdCxzZWxlY3RvcnM6W1siIiwib2JzZXJ2ZUludGVyc2VjdGlvbiIsIiJdXSxpbnB1dHM6e2ludGVyc2VjdGlvbk9ic2VydmVyTWFyZ2luOiJpbnRlcnNlY3Rpb25PYnNlcnZlck1hcmdpbiJ9LG91dHB1dHM6e29uVmlzaWJpbGl0eUNoYW5nZToib25WaXNpYmlsaXR5Q2hhbmdlIn19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKE5mdCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbb2JzZXJ2ZUludGVyc2VjdGlvbl0ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOm1GLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19XX0pLHtpbnRlcnNlY3Rpb25PYnNlcnZlck1hcmdpbjpbe3R5cGU6eHl9XSxvblZpc2liaWxpdHlDaGFuZ2U6W3t0eXBlOk95fV19KTtjbGFzcyBJZnR7Y29uc3RydWN0b3IodCl7dGhpcy5zdG9yZT10LHRoaXMuRGF0YURvd25sb2FkQ29tcG9uZW50PWw1LHRoaXMuZnVsbFdpZHRoQ2hhbmdlZD1uZXcgTGgsdGhpcy5mdWxsSGVpZ2h0Q2hhbmdlZD1uZXcgTGgsdGhpcy5waW5TdGF0ZUNoYW5nZWQ9bmV3IExoLHRoaXMuaXNWaXNpYmxlPSExLHRoaXMudXNlRGFya01vZGUkPXRoaXMuc3RvcmUuc2VsZWN0KEpEKSx0aGlzLmlnbm9yZU91dGxpZXJzJD10aGlzLnN0b3JlLnNlbGVjdChBVCksdGhpcy50b29sdGlwU29ydCQ9dGhpcy5zdG9yZS5zZWxlY3QoUlQpLHRoaXMueEF4aXNUeXBlJD10aGlzLnN0b3JlLnNlbGVjdChUVCksdGhpcy54U2NhbGVUeXBlJD10aGlzLnN0b3JlLnNlbGVjdChUVCkucGlwZShJdCgodD0+e3N3aXRjaCh0KXtjYXNlIHlBLlNURVA6Y2FzZSB5QS5SRUxBVElWRTpyZXR1cm4gSjIuTElORUFSO2Nhc2UgeUEuV0FMTF9USU1FOnJldHVybiBKMi5USU1FO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHhBeGlzVHlwZSBmb3IgbGluZSBjaGFydC4gJHt0fWApfX0pKSksdGhpcy5zY2FsYXJTbW9vdGhpbmckPXRoaXMuc3RvcmUuc2VsZWN0KHpUKSx0aGlzLnNtb290aGluZ0VuYWJsZWQkPXRoaXMuc3RvcmUuc2VsZWN0KHpUKS5waXBlKEl0KCh0PT50PjApKSksdGhpcy5zaG93RnVsbFNpemU9ITEsdGhpcy5uZ1Vuc3Vic2NyaWJlPW5ldyBJfW9uVmlzaWJpbGl0eUNoYW5nZSh7dmlzaWJsZTp0fSl7dGhpcy5pc1Zpc2libGU9dH1pc1NjYWxhckNhcmRNZXRhZGF0YSh0KXtjb25zdHtwbHVnaW46ZX09dDtyZXR1cm4gZT09PWhBLlNDQUxBUlN9b25GdWxsU2l6ZVRvZ2dsZSgpe3RoaXMuc2hvd0Z1bGxTaXplPSF0aGlzLnNob3dGdWxsU2l6ZSx0aGlzLmZ1bGxXaWR0aENoYW5nZWQuZW1pdCh0aGlzLnNob3dGdWxsU2l6ZSksdGhpcy5mdWxsSGVpZ2h0Q2hhbmdlZC5lbWl0KHRoaXMuc2hvd0Z1bGxTaXplKX1uZ09uSW5pdCgpe2NvbnN0IHQ9dGhpcy5zdG9yZS5zZWxlY3QoeVQsdGhpcy5jYXJkSWQpLnBpcGUoY2UoKHQ9PiEhdCYmdGhpcy5pc1NjYWxhckNhcmRNZXRhZGF0YSh0KSkpLEl0KCh0PT50KSkpO2Z1bmN0aW9uIGUodCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KFsic21vb3RoZWQiLHRdKX1jb25zdCBuPXRoaXMuc3RvcmUuc2VsZWN0KGhULHRoaXMuY2FyZElkKS5waXBlKEllKHRoaXMubmdVbnN1YnNjcmliZSksY2UoKHQ9PkJvb2xlYW4odCkpKSxJdCgodD0+dCkpLEFlKDEpKS5waXBlKGZlKHRoaXMuc3RvcmUuc2VsZWN0KFRUKSksSXQoKChbdCxlXSk9Pk9iamVjdC5rZXlzKHQpLm1hcCgobj0+KHtydW5JZDpuLHBvaW50czp0aGlzLnN0ZXBTZXJpZXNUb0xpbmVTZXJpZXModFtuXSxlKX0pKSkpKSxNZSh6ZnQpKS5waXBlKGZlKHRoaXMuc3RvcmUuc2VsZWN0KElUKSksSWUodGhpcy5uZ1Vuc3Vic2NyaWJlKSxJdCgoKFt0LGVdKT0+ZT8oZnVuY3Rpb24gbih0KXt2YXIgZTtjb25zdCBuPVtdO2Zvcihjb25zdCBvIG9mIHQpe2NvbnN0IHQ9W107bGV0IGk9TnVtYmVyLmlzRmluaXRlKG51bGw9PT0oZT1vLnBvaW50c1swXSl8fHZvaWQgMD09PWU/dm9pZCAwOmUueCk/by5wb2ludHNbMF0ueDotMS8wLGE9W107Zm9yKGNvbnN0IGUgb2Ygby5wb2ludHMpTnVtYmVyLmlzRmluaXRlKGUueCk/KGUueDxpJiYodC5wdXNoKHtzZXJpZXNJZDpKU09OLnN0cmluZ2lmeShbby5ydW5JZCx0Lmxlbmd0aF0pLHJ1bklkOm8ucnVuSWQscG9pbnRzOmF9KSxhPVtdKSxhLnB1c2goZSksaT1lLngpOmEucHVzaChlKTt0LnB1c2goe3Nlcmllc0lkOkpTT04uc3RyaW5naWZ5KFtvLnJ1bklkLHQubGVuZ3RoXSkscnVuSWQ6by5ydW5JZCxwb2ludHM6YX0pO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKW4ucHVzaChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdFtlXSkse3BhcnRpdGlvbkluZGV4OmUscGFydGl0aW9uU2l6ZTp0Lmxlbmd0aH0pKX1yZXR1cm4gbn0pKHQpOnQubWFwKCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3Nlcmllc0lkOnQucnVuSWQscGFydGl0aW9uSW5kZXg6MCxwYXJ0aXRpb25TaXplOjF9KSkpKSksSXQoKHQ9PnQubWFwKCh0PT57dmFyIGU7Y29uc3Qgbj1udWxsPT09KGU9dC5wb2ludHNbMF0pfHx2b2lkIDA9PT1lP3ZvaWQgMDplLndhbGxUaW1lO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3BvaW50czp0LnBvaW50cy5tYXAoKHQ9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7cmVsYXRpdmVUaW1lSW5Nczp0LndhbGxUaW1lLW59KSkpfSl9KSkpKSxmZSh0aGlzLnN0b3JlLnNlbGVjdChUVCkpLEl0KCgoW3QsZV0pPT50Lm1hcCgodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtwb2ludHM6dC5wb2ludHMubWFwKCh0PT57bGV0IG47c3dpdGNoKGUpe2Nhc2UgeUEuUkVMQVRJVkU6bj10LnJlbGF0aXZlVGltZUluTXM7YnJlYWs7Y2FzZSB5QS5XQUxMX1RJTUU6bj10LndhbGxUaW1lO2JyZWFrO2Nhc2UgeUEuU1RFUDpkZWZhdWx0Om49dC5zdGVwfXJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3g6bn0pfSkpfSkpKSkpLEFlKDEpKTt0aGlzLmRhdGFTZXJpZXMkPW4ucGlwZShmZSh0aGlzLnN0b3JlLnNlbGVjdCh6VCkpLHplKCgoW3Qsbl0pPT57Y29uc3Qgbz10Lm1hcCgoKHtzZXJpZXNJZDp0LHBvaW50czplfSk9Pih7aWQ6dCxwb2ludHM6ZX0pKSk7cmV0dXJuIG48PTA/RXQobyk6Q3QoKGZ1bmN0aW9uIGkodCxlKXt2YXIgbjtyZXR1cm4gZ0EodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtOdW1iZXIuaXNGaW5pdGUoZSl8fChlPTApLGU9TWF0aC5tYXgoMCxNYXRoLm1pbihlLDEpKTtjb25zdCBvPVtdO2Zvcihjb25zdCBpIG9mIHQpe2NvbnN0IHQ9bnVsbD09PShuPWkucG9pbnRzWzBdKXx8dm9pZCAwPT09bj92b2lkIDA6bi55O2lmKGkucG9pbnRzLmV2ZXJ5KChlPT5lLnk9PXQpKSl7by5wdXNoKGkpO2NvbnRpbnVlfWxldCBhPWkucG9pbnRzLmxlbmd0aD4wPzA6TmFOLHI9MDtjb25zdCBzPWkucG9pbnRzLm1hcCgodD0+e2NvbnN0IG49dC55O2lmKE51bWJlci5pc0Zpbml0ZShuKSl7YT1hKmUrKDEtZSkqbixyKys7Y29uc3Qgbz0xPT09ZT8xOjEtTWF0aC5wb3coZSxyKTtyZXR1cm57eDp0LngseTphL299fXJldHVybnt4OnQueCx5Om59fSkpO28ucHVzaCh7aWQ6aS5pZCxwb2ludHM6c30pfXJldHVybiBvfSkpfSkobyxuKSkucGlwZShJdCgodD0+e2NvbnN0IG49by5tYXAoKChuLG8pPT4oe2lkOmUobi5pZCkscG9pbnRzOnRbb10ucG9pbnRzLm1hcCgoKHt5OnR9LGUpPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbi5wb2ludHNbZV0pLHt5OnR9KSkpfSkpKTtyZXR1cm5bLi4ubywuLi5uXX0pKSl9KSksTmUoW10pKSx0aGlzLnNlbGVjdGVkVGltZSQ9V3QoW24sdGhpcy5zdG9yZS5zZWxlY3QoWVQpLHRoaXMuc3RvcmUuc2VsZWN0KFRUKV0pLnBpcGUoSXQoKChbdCxlLG5dKT0+e2lmKG4hPT15QS5TVEVQfHwhZSlyZXR1cm4gbnVsbDtsZXQgbz0xLzAsaT0tMS8wO2Zvcihjb25zdHtwb2ludHM6ZX1vZiB0KWZvcihjb25zdCB0IG9mIGUpbz1vPnQueD90Lng6byxpPWk8dC54P3QueDppO3JldHVybiBIMihlLG8saSl9KSkpLHRoaXMuY2hhcnRNZXRhZGF0YU1hcCQ9bi5waXBlKHplKCh0PT5XdCh0Lm1hcCgodD0+dGhpcy5nZXRSdW5EaXNwbGF5TmFtZSh0LnJ1bklkKS5waXBlKEl0KChlPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2Rpc3BsYXlOYW1lOmV9KSkpKSkpKSkpLGZlKHRoaXMuc3RvcmUuc2VsZWN0KE5OKSx0aGlzLnN0b3JlLnNlbGVjdCh6TiksdGhpcy5zdG9yZS5zZWxlY3QoelQpKSxnZSgwKSxJdCgoKFt0LG4sbyxpXSk9Pnt2YXIgYTtjb25zdCByPXt9LHM9aT4wO2Zvcihjb25zdCBlIG9mIHQpe2NvbnN0e3Nlcmllc0lkOnQscnVuSWQ6aSxkaXNwbGF5TmFtZTpzLHBhcnRpdGlvbkluZGV4OmwscGFydGl0aW9uU2l6ZTpjfT1lO3JbdF09e3R5cGU6UTIuT1JJR0lOQUwsaWQ6dCxkaXNwbGF5TmFtZTpjPjE/YCR7c306ICR7bH1gOnMsdmlzaWJsZTpCb29sZWFuKG4mJm4uZ2V0KGkpKSxjb2xvcjpudWxsIT09KGE9b1tpXSkmJnZvaWQgMCE9PWE/YToiI2ZmZiIsYXV4OiExLG9wYWNpdHk6MX19aWYoIXMpcmV0dXJuIHI7Zm9yKGNvbnN0W3Qsbl1vZiBPYmplY3QuZW50cmllcyhyKSl7Y29uc3Qgbz1lKHQpO3Jbb109T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG4pLHtpZDpvLHR5cGU6UTIuREVSSVZFRCxhdXg6ITEsb3JpZ2luYWxTZXJpZXNJZDp0fSksbi5hdXg9ITAsbi5vcGFjaXR5PS4yNX1yZXR1cm4gcn0pKSxOZSh7fSkpLHRoaXMubG9hZFN0YXRlJD10aGlzLnN0b3JlLnNlbGVjdChnVCx0aGlzLmNhcmRJZCksdGhpcy50YWckPXQucGlwZShJdCgodD0+dC50YWcpKSksdGhpcy50aXRsZSQ9dGhpcy50YWckLnBpcGUoSXQoKHQ9PmYyKHQsdGhpcy5ncm91cE5hbWUpKSkpLHRoaXMuaXNQaW5uZWQkPXRoaXMuc3RvcmUuc2VsZWN0KHdULHRoaXMuY2FyZElkKX1uZ09uRGVzdHJveSgpe3RoaXMubmdVbnN1YnNjcmliZS5uZXh0KCksdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCl9Z2V0UnVuRGlzcGxheU5hbWUodCl7cmV0dXJuIFd0KFt0aGlzLnN0b3JlLnNlbGVjdChyTix7cnVuSWQ6dH0pLHRoaXMuc3RvcmUuc2VsZWN0KHpTKSx0aGlzLnN0b3JlLnNlbGVjdChzTix7cnVuSWQ6dH0pXSkucGlwZShJdCgoKFtlLG4sb10pPT5JMih0LG8sZT9uW2VdOm51bGwpKSkpfXN0ZXBTZXJpZXNUb0xpbmVTZXJpZXModCxlKXtjb25zdCBuPWU9PT15QS5TVEVQO3JldHVybiB0Lm1hcCgodD0+e2NvbnN0IGU9MWUzKnQud2FsbFRpbWU7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7eDpuP3Quc3RlcDplLHk6dC52YWx1ZSx3YWxsVGltZTplLHJlbGF0aXZlVGltZUluTXM6MH0pfSkpfX1mdW5jdGlvbiBIZnQodCxlLG4pe2NvbnN0IG89W10se2xlZnQ6aSxyaWdodDphfT1lLHI9KGEtaSkvbjtsZXQgcz0wLGw9MDtmb3IobGV0IGU9MDtlPG47ZSsrKXtjb25zdCBhPWkrZSpyLGM9YStyLGQ9ZT09PW4tMTtsZXQgcD1sO2ZvcihsPTA7czx0Lmxlbmd0aDspe2NvbnN0IGU9dFtzXSxuPUZmdChlLGEsYywhZCk7aWYocCs9bi5jdXJyLGwrPW4ubmV4dCxlLngrZS5keD5jKWJyZWFrO3MrK31vLnB1c2goe3g6YSxkeDpyLHk6cH0pfXJldHVybiBvfWZ1bmN0aW9uIEZmdCh0LGUsbixvKXtjb25zdCBpPXQueCxhPXQueCt0LmR4O2lmKGk+bnx8YTxlKXJldHVybntjdXJyOjAsbmV4dDowfTtpZigwPT09dC5keClyZXR1cm4gbyYmYT09PW4/e2N1cnI6LjUqdC55LG5leHQ6LjUqdC55fTp7Y3Vycjp0LnksbmV4dDowfTtjb25zdCByPU1hdGgubWluKGEsbiktTWF0aC5tYXgoaSxlKTtyZXR1cm57Y3Vycjp0Lnkqci90LmR4LG5leHQ6MH19SWZ0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxJZnQpKFNtKEl3KSl9LElmdC7JtWNtcD10byh7dHlwZTpJZnQsc2VsZWN0b3JzOltbInNjYWxhci1jYXJkIl1dLGlucHV0czp7RGF0YURvd25sb2FkQ29tcG9uZW50OiJEYXRhRG93bmxvYWRDb21wb25lbnQiLGNhcmRJZDoiY2FyZElkIixncm91cE5hbWU6Imdyb3VwTmFtZSJ9LG91dHB1dHM6e2Z1bGxXaWR0aENoYW5nZWQ6ImZ1bGxXaWR0aENoYW5nZWQiLGZ1bGxIZWlnaHRDaGFuZ2VkOiJmdWxsSGVpZ2h0Q2hhbmdlZCIscGluU3RhdGVDaGFuZ2VkOiJwaW5TdGF0ZUNoYW5nZWQifSxkZWNsczoxNCx2YXJzOjQzLGNvbnN0czpbWyJvYnNlcnZlSW50ZXJzZWN0aW9uIiwiIiwzLCJjYXJkSWQiLCJjaGFydE1ldGFkYXRhTWFwIiwiRGF0YURvd25sb2FkQ29tcG9uZW50IiwiZGF0YVNlcmllcyIsImlnbm9yZU91dGxpZXJzIiwiaXNDYXJkVmlzaWJsZSIsImlzUGlubmVkIiwibG9hZFN0YXRlIiwic2hvd0Z1bGxTaXplIiwic21vb3RoaW5nRW5hYmxlZCIsInRhZyIsInRpdGxlIiwidG9vbHRpcFNvcnQiLCJ4QXhpc1R5cGUiLCJ4U2NhbGVUeXBlIiwidXNlRGFya01vZGUiLCJzZWxlY3RlZFRpbWUiLCJvbkZ1bGxTaXplVG9nZ2xlIiwib25QaW5DbGlja2VkIiwib25WaXNpYmlsaXR5Q2hhbmdlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJzY2FsYXItY2FyZC1jb21wb25lbnQiLDApLFZtKCJvbkZ1bGxTaXplVG9nZ2xlIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uRnVsbFNpemVUb2dnbGUoKX0pKSgib25QaW5DbGlja2VkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5waW5TdGF0ZUNoYW5nZWQuZW1pdChlKX0pKSgib25WaXNpYmlsaXR5Q2hhbmdlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblZpc2liaWxpdHlDaGFuZ2UoZSl9KSksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQWgoNCwiYXN5bmMiKSxBaCg1LCJhc3luYyIpLEFoKDYsImFzeW5jIiksQWgoNywiYXN5bmMiKSxBaCg4LCJhc3luYyIpLEFoKDksImFzeW5jIiksQWgoMTAsImFzeW5jIiksQWgoMTEsImFzeW5jIiksQWgoMTIsImFzeW5jIiksQWgoMTMsImFzeW5jIiksQW0oKSksMiZlJiZEbSgiY2FyZElkIixuLmNhcmRJZCkoImNoYXJ0TWV0YWRhdGFNYXAiLFRoKDEsMTcsbi5jaGFydE1ldGFkYXRhTWFwJCkpKCJEYXRhRG93bmxvYWRDb21wb25lbnQiLG4uRGF0YURvd25sb2FkQ29tcG9uZW50KSgiZGF0YVNlcmllcyIsVGgoMiwxOSxuLmRhdGFTZXJpZXMkKSkoImlnbm9yZU91dGxpZXJzIixUaCgzLDIxLG4uaWdub3JlT3V0bGllcnMkKSkoImlzQ2FyZFZpc2libGUiLG4uaXNWaXNpYmxlKSgiaXNQaW5uZWQiLFRoKDQsMjMsbi5pc1Bpbm5lZCQpKSgibG9hZFN0YXRlIixUaCg1LDI1LG4ubG9hZFN0YXRlJCkpKCJzaG93RnVsbFNpemUiLG4uc2hvd0Z1bGxTaXplKSgic21vb3RoaW5nRW5hYmxlZCIsVGgoNiwyNyxuLnNtb290aGluZ0VuYWJsZWQkKSkoInRhZyIsVGgoNywyOSxuLnRhZyQpKSgidGl0bGUiLFRoKDgsMzEsbi50aXRsZSQpKSgidG9vbHRpcFNvcnQiLFRoKDksMzMsbi50b29sdGlwU29ydCQpKSgieEF4aXNUeXBlIixUaCgxMCwzNSxuLnhBeGlzVHlwZSQpKSgieFNjYWxlVHlwZSIsVGgoMTEsMzcsbi54U2NhbGVUeXBlJCkpKCJ1c2VEYXJrTW9kZSIsVGgoMTIsMzksbi51c2VEYXJrTW9kZSQpKSgic2VsZWN0ZWRUaW1lIixUaCgxMyw0MSxuLnNlbGVjdGVkVGltZSQpKX0sZGlyZWN0aXZlczpbVGZ0LE5mdF0scGlwZXM6W3dNXSxzdHlsZXM6WyJbX25naG9zdC0lQ09NUCVdIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIH0iXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoSWZ0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InNjYWxhci1jYXJkIix0ZW1wbGF0ZTonXG4gICAgPHNjYWxhci1jYXJkLWNvbXBvbmVudFxuICAgICAgW2NhcmRJZF09ImNhcmRJZCJcbiAgICAgIFtjaGFydE1ldGFkYXRhTWFwXT0iY2hhcnRNZXRhZGF0YU1hcCQgfCBhc3luYyJcbiAgICAgIFtEYXRhRG93bmxvYWRDb21wb25lbnRdPSJEYXRhRG93bmxvYWRDb21wb25lbnQiXG4gICAgICBbZGF0YVNlcmllc109ImRhdGFTZXJpZXMkIHwgYXN5bmMiXG4gICAgICBbaWdub3JlT3V0bGllcnNdPSJpZ25vcmVPdXRsaWVycyQgfCBhc3luYyJcbiAgICAgIFtpc0NhcmRWaXNpYmxlXT0iaXNWaXNpYmxlIlxuICAgICAgW2lzUGlubmVkXT0iaXNQaW5uZWQkIHwgYXN5bmMiXG4gICAgICBbbG9hZFN0YXRlXT0ibG9hZFN0YXRlJCB8IGFzeW5jIlxuICAgICAgW3Nob3dGdWxsU2l6ZV09InNob3dGdWxsU2l6ZSJcbiAgICAgIFtzbW9vdGhpbmdFbmFibGVkXT0ic21vb3RoaW5nRW5hYmxlZCQgfCBhc3luYyJcbiAgICAgIFt0YWddPSJ0YWckIHwgYXN5bmMiXG4gICAgICBbdGl0bGVdPSJ0aXRsZSQgfCBhc3luYyJcbiAgICAgIFt0b29sdGlwU29ydF09InRvb2x0aXBTb3J0JCB8IGFzeW5jIlxuICAgICAgW3hBeGlzVHlwZV09InhBeGlzVHlwZSQgfCBhc3luYyJcbiAgICAgIFt4U2NhbGVUeXBlXT0ieFNjYWxlVHlwZSQgfCBhc3luYyJcbiAgICAgIFt1c2VEYXJrTW9kZV09InVzZURhcmtNb2RlJCB8IGFzeW5jIlxuICAgICAgW3NlbGVjdGVkVGltZV09InNlbGVjdGVkVGltZSQgfCBhc3luYyJcbiAgICAgIChvbkZ1bGxTaXplVG9nZ2xlKT0ib25GdWxsU2l6ZVRvZ2dsZSgpIlxuICAgICAgKG9uUGluQ2xpY2tlZCk9InBpblN0YXRlQ2hhbmdlZC5lbWl0KCRldmVudCkiXG4gICAgICBvYnNlcnZlSW50ZXJzZWN0aW9uXG4gICAgICAob25WaXNpYmlsaXR5Q2hhbmdlKT0ib25WaXNpYmlsaXR5Q2hhbmdlKCRldmVudCkiXG4gICAgPjwvc2NhbGFyLWNhcmQtY29tcG9uZW50PlxuICAnLHN0eWxlczpbIlxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgfVxuICAgICJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSkse0RhdGFEb3dubG9hZENvbXBvbmVudDpbe3R5cGU6eHl9XSxjYXJkSWQ6W3t0eXBlOnh5fV0sZ3JvdXBOYW1lOlt7dHlwZTp4eX1dLGZ1bGxXaWR0aENoYW5nZWQ6W3t0eXBlOk95fV0sZnVsbEhlaWdodENoYW5nZWQ6W3t0eXBlOk95fV0scGluU3RhdGVDaGFuZ2VkOlt7dHlwZTpPeX1dfSk7Y29uc3QgTGZ0PVsibWFpbiJdLEJmdD1bInhBeGlzIl0sVmZ0PVsieUF4aXMiXSxqZnQ9WyJjb250ZW50Il0sVWZ0PVsiaGlzdG9ncmFtcyJdO2Z1bmN0aW9uIEdmdCh0LGUpe2lmKDEmdCYmKHFpKCksUm0oMCwiZyIpLFJtKDEsInRleHQiKSxrdSgyKSxBbSgpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpO2R1KCJ0cmFuc2Zvcm0iLHQuZ2V0Q3NzVHJhbnNsYXRlUHgodC50b29sdGlwRGF0YS54QXhpcy5wb3NpdGlvbiw5KSkscmMoMiksU3UodC50b29sdGlwRGF0YS54QXhpcy5sYWJlbCl9fWZ1bmN0aW9uIFdmdCh0LGUpe2lmKDEmdCYmKHFpKCksUm0oMCwiZyIpLFJtKDEsInRleHQiKSxrdSgyKSxBbSgpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpO2R1KCJ0cmFuc2Zvcm0iLHQuZ2V0R3JvdXBUcmFuc2Zvcm0odC50b29sdGlwRGF0YS5jbG9zZXN0RGF0dW0pKSxyYygxKSxqcCgieSIsdC50b29sdGlwRGF0YS55QXhpcy5wb3NpdGlvbikscmMoMSksRHUoIiAiLHQudG9vbHRpcERhdGEueUF4aXMubGFiZWwsIiAiKX19ZnVuY3Rpb24gWWZ0KHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2IiwxNiksVG0oMSwibGlua2VkLXRpbWUtZm9iIiwxNyksQW0oKSksMiZ0KXtjb25zdCB0PVltKDIpO2R1KCJ0cmFuc2Zvcm0iLHQuZ2V0Q3NzVHJhbnNsYXRlUHgoMCx0LnNjYWxlcy50ZW1wb3JhbFNjYWxlKHQubGlua2VkVGltZS5lbmRTdGVwKSkpLHJjKDEpLERtKCJzdGVwIix0LmxpbmtlZFRpbWUuZW5kU3RlcCl9fWZ1bmN0aW9uIHFmdCh0LGUpe2lmKDEmdCYmKHFpKCksWmkoKSxObSgwKSxSbSgxLCJkaXYiLDE2KSxUbSgyLCJsaW5rZWQtdGltZS1mb2IiLDE3KSxBbSgpLFFwKDMsWWZ0LDIsMywiZGl2IiwxOCksem0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoMSksZHUoInRyYW5zZm9ybSIsdC5nZXRDc3NUcmFuc2xhdGVQeCgwLHQuc2NhbGVzLnRlbXBvcmFsU2NhbGUodC5saW5rZWRUaW1lLnN0YXJ0U3RlcCkpKSxyYygxKSxEbSgic3RlcCIsdC5saW5rZWRUaW1lLnN0YXJ0U3RlcCkscmMoMSksRG0oIm5nSWYiLHQubGlua2VkVGltZS5lbmRTdGVwKX19ZnVuY3Rpb24gWmZ0KHQsZSl7aWYoMSZ0JiYocWkoKSxSbSgwLCJnIiksVG0oMSwibGluZSIsMTkpLEFtKCkpLDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdDtkdSgidHJhbnNmb3JtIixZbSgpLmdldENzc1RyYW5zbGF0ZVB4KDAsdCkpfX1mdW5jdGlvbiBYZnQodCxlKXsxJnQmJihxaSgpLFRtKDAsImxpbmUiLDIyKSl9ZnVuY3Rpb24gS2Z0KHQsZSl7aWYoMSZ0JiYocWkoKSxUbSgwLCJjaXJjbGUiLDIzKSksMiZ0KXtjb25zdCB0PVltKCkuJGltcGxpY2l0LGU9WW0oKTtkdSgidHJhbnNmb3JtIixlLmdldENzc1RyYW5zbGF0ZVB4KGUuZ2V0VWlDb29yZEZyb21CaW5Gb3JDb250ZW50KGUuZ2V0Q2xvc2VzdEJpbkZyb21CaW5Db29yZGluYXRlKHQsZS50b29sdGlwRGF0YS54UG9zaXRpb25JbkJpbkNvb3JkKSkueCxlLmdldFVpQ29vcmRGcm9tQmluRm9yQ29udGVudChlLmdldENsb3Nlc3RCaW5Gcm9tQmluQ29vcmRpbmF0ZSh0LGUudG9vbHRpcERhdGEueFBvc2l0aW9uSW5CaW5Db29yZCkpLnkpKX19ZnVuY3Rpb24gSmZ0KHQsZSl7aWYoMSZ0JiYocWkoKSxSbSgwLCJnIiksUXAoMSxYZnQsMSwwLCJsaW5lIiwyMCksVG0oMiwicGF0aCIpLFFwKDMsS2Z0LDEsMiwiY2lyY2xlIiwyMSksQW0oKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oKTtkdSgidHJhbnNmb3JtIixuLmdldEdyb3VwVHJhbnNmb3JtKHQpKSgiY29sb3IiLG4uZ2V0SGlzdG9ncmFtRmlsbCh0KSkscHUoImhpc3RvZ3JhbSIsITApKCJuby1jb2xvciIsIW4uaXNEYXR1bUluTGlua2VkVGltZVJhbmdlKHQpKSxyYygxKSxEbSgibmdJZiIsbi5tb2RlPT09bi5IaXN0b2dyYW1Nb2RlLk9GRlNFVCkscmMoMSksanAoImQiLG4uZ2V0SGlzdG9ncmFtUGF0aCh0KSkscmMoMSksRG0oIm5nSWYiLG4udG9vbHRpcERhdGEpfX1mdW5jdGlvbiBRZnQodCxlKXtpZigxJnQmJihxaSgpLFRtKDAsImNpcmNsZSIsMjMpKSwyJnQpe2NvbnN0IHQ9WW0oMik7anAoImN4Iix0LmdldFVpQ29vcmRGcm9tQmluRm9yQ29udGVudCh0LnRvb2x0aXBEYXRhLmNsb3Nlc3RCaW4pLngpKCJjeSIsdC5nZXRVaUNvb3JkRnJvbUJpbkZvckNvbnRlbnQodC50b29sdGlwRGF0YS5jbG9zZXN0QmluKS55KX19ZnVuY3Rpb24gJGZ0KHQsZSl7aWYoMSZ0JiYocWkoKSxSbSgwLCJnIiw0KSxSbSgxLCJnIiksVG0oMiwicGF0aCIpLFFwKDMsUWZ0LDEsMiwiY2lyY2xlIiwyNCksQW0oKSxSbSg0LCJnIiwyNSksUm0oNSwidGV4dCIsMjYpLGt1KDYpLEFtKCksQW0oKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtyYygxKSxkdSgidHJhbnNmb3JtIix0LmdldEdyb3VwVHJhbnNmb3JtKHQudG9vbHRpcERhdGEuY2xvc2VzdERhdHVtKSkscmMoMSksanAoImQiLHQuZ2V0SGlzdG9ncmFtUGF0aCh0LnRvb2x0aXBEYXRhLmNsb3Nlc3REYXR1bSkpLHJjKDEpLERtKCJuZ0lmIix0LnRvb2x0aXBEYXRhLmNsb3Nlc3RCaW4pLHJjKDEpLGR1KCJ0cmFuc2Zvcm0iLHQuZ2V0Q3NzVHJhbnNsYXRlUHgodC50b29sdGlwRGF0YS52YWx1ZS5wb3NpdGlvbi54LHQudG9vbHRpcERhdGEudmFsdWUucG9zaXRpb24ueSkpLHJjKDIpLFN1KHQudG9vbHRpcERhdGEudmFsdWUubGFiZWwpfX1jbGFzcyB0Z3R7Y29uc3RydWN0b3IodCl7dGhpcy5jaGFuZ2VEZXRlY3Rvcj10LHRoaXMubW9kZT1wRS5PRkZTRVQsdGhpcy50aW1lUHJvcGVydHk9ZEUuU1RFUCx0aGlzLmxpbmtlZFRpbWU9bnVsbCx0aGlzLkhpc3RvZ3JhbU1vZGU9cEUsdGhpcy5UaW1lUHJvcGVydHk9ZEUsdGhpcy50b29sdGlwRGF0YT1udWxsLHRoaXMubmdVbnN1YnNjcmliZT1uZXcgSSx0aGlzLmxheW91dD17aGlzdG9ncmFtSGVpZ2h0OjAsY29udGVudENsaWVudFJlY3Q6e2hlaWdodDowLHdpZHRoOjB9fSx0aGlzLnNjYWxlcz1udWxsLHRoaXMuZm9ybWF0dGVycz17YmluTnVtYmVyOkV0dCgiLjN+cyIpLGNvdW50OkV0dCgiLjNuIiksd2FsbFRpbWU6V2V0KCIlbS8lZCAlWCIpLHN0ZXA6RXR0KCIuMGYiKSxyZWxhdGl2ZTp0PT5FdHQoIi4xciIpKHQvMzZlNSkrImgifSx0aGlzLmRvbVZpc2libGU9ITF9bmdPbkNoYW5nZXMoKXt0aGlzLnVwZGF0ZUNoYXJ0SWZWaXNpYmxlKCl9bmdPbkRlc3Ryb3koKXt0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpLHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpfW5nQWZ0ZXJWaWV3SW5pdCgpe29lKHRoaXMubWFpbi5uYXRpdmVFbGVtZW50LCJtb3VzZW1vdmUiLHtwYXNzaXZlOiEwfSkucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpKS5zdWJzY3JpYmUoKHQ9PnRoaXMub25Nb3VzZU1vdmUodCkpKX1nZXRDc3NUcmFuc2xhdGVQeCh0LGUpe3JldHVybmB0cmFuc2xhdGUoJHt0fXB4LCAke2V9cHgpYH1nZXRDbG9zZXN0QmluRnJvbUJpbkNvb3JkaW5hdGUodCxlKXtpZighdC5iaW5zLmxlbmd0aClyZXR1cm57eDowLGR4OjAseTowfTtjb25zdCBuPXQuYmluc1swXSxvPXQuYmlucy5zbGljZSgtMSlbMF07cmV0dXJuIGU8bi54P246ZT49by54K28uZHg/bzp0LmJpbnMuZmluZCgodD0+dC54PD1lJiZlPHQueCt0LmR4KSl9Z2V0VWlDb29yZEZyb21CaW5Gb3JDb250ZW50KHQpe3JldHVybiB0aGlzLnNjYWxlcz97eDp0aGlzLnNjYWxlcy5iaW5TY2FsZShvZ3QodCkpLHk6dGhpcy5zY2FsZXMuY291bnRTY2FsZSh0LnkpfTp7eDowLHk6MH19Z2V0SGlzdG9ncmFtUGF0aCh0KXtpZighdGhpcy5zY2FsZXN8fCF0LmJpbnMubGVuZ3RoKXJldHVybiIiO2NvbnN0IGU9dGhpcy5zY2FsZXMuYmluU2NhbGUsbj10aGlzLnNjYWxlcy5jb3VudFNjYWxlLG89dC5iaW5zWzBdLGk9dC5iaW5zLnNsaWNlKC0xKVswXSxhPVtgTSR7ZShvZ3QobykpfSwke24oMCl9YF07Zm9yKGNvbnN0IG8gb2YgdC5iaW5zKWEucHVzaChgTCR7ZShvZ3QobykpfSwke24oby55KX1gKTtyZXR1cm4gYS5wdXNoKGBMJHtlKG9ndChpKSl9LCR7bigwKX1gKSxhLmpvaW4oIiIpfXRyYWNrQnlXYWxsVGltZSh0KXtyZXR1cm4gdC53YWxsVGltZX1nZXRHcm91cFRyYW5zZm9ybSh0KXtyZXR1cm4gdGhpcy5zY2FsZXMmJnRoaXMubW9kZSE9PXBFLk9WRVJMQVk/dGhpcy5nZXRDc3NUcmFuc2xhdGVQeCgwLHRoaXMuc2NhbGVzLnRlbXBvcmFsU2NhbGUodGhpcy5nZXRUaW1lVmFsdWUodCkpKToiIn1pc0xpbmtlZFRpbWVFbmFibGVkKHQpe3JldHVybiBCb29sZWFuKHRoaXMubW9kZT09PXBFLk9GRlNFVCYmdGhpcy50aW1lUHJvcGVydHk9PT1kRS5TVEVQJiZ0aGlzLnNjYWxlcyYmdCl9aXNEYXR1bUluTGlua2VkVGltZVJhbmdlKHQpe3JldHVybiF0aGlzLmlzTGlua2VkVGltZUVuYWJsZWQodGhpcy5saW5rZWRUaW1lKXx8KG51bGw9PT10aGlzLmxpbmtlZFRpbWUuZW5kU3RlcD90aGlzLmxpbmtlZFRpbWUuc3RhcnRTdGVwPT09dC5zdGVwOnRoaXMubGlua2VkVGltZS5zdGFydFN0ZXA8PXQuc3RlcCYmdGhpcy5saW5rZWRUaW1lLmVuZFN0ZXA+PXQuc3RlcCl9Z2V0SGlzdG9ncmFtRmlsbCh0KXtyZXR1cm4gdGhpcy5zY2FsZXM/dGhpcy5zY2FsZXMuZDNDb2xvclNjYWxlKHRoaXMuZ2V0VGltZVZhbHVlKHQpKToiIn1nZXRHcmlkVGlja1lMb2NzKCl7aWYoIXRoaXMuc2NhbGVzfHx0aGlzLm1vZGU9PT1wRS5PRkZTRVQpcmV0dXJuW107Y29uc3QgdD10aGlzLnNjYWxlcy5jb3VudFNjYWxlO3JldHVybiB0LnRpY2tzKCkubWFwKChlPT50KGUpKSl9b25SZXNpemUoKXt0aGlzLnVwZGF0ZUNsaWVudFJlY3RzKCksdGhpcy51cGRhdGVDaGFydElmVmlzaWJsZSgpfW9uVmlzaWJpbGl0eUNoYW5nZSh7dmlzaWJsZTp0fSl7dGhpcy5kb21WaXNpYmxlPXQsdCYmKHRoaXMudXBkYXRlQ2xpZW50UmVjdHMoKSx0aGlzLnVwZGF0ZUNoYXJ0SWZWaXNpYmxlKCkpfWdldFRpbWVWYWx1ZSh0KXtzd2l0Y2godGhpcy50aW1lUHJvcGVydHkpe2Nhc2UgZEUuV0FMTF9USU1FOnJldHVybiB0LndhbGxUaW1lO2Nhc2UgZEUuU1RFUDpyZXR1cm4gdC5zdGVwO2Nhc2UgZEUuUkVMQVRJVkU6cmV0dXJuIHQud2FsbFRpbWUtdGhpcy5kYXRhWzBdLndhbGxUaW1lfX11cGRhdGVDbGllbnRSZWN0cygpe3RoaXMuY29udGVudCYmKHRoaXMubGF5b3V0LmNvbnRlbnRDbGllbnRSZWN0PXRoaXMuY29udGVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHRoaXMubGF5b3V0Lmhpc3RvZ3JhbUhlaWdodD10aGlzLmxheW91dC5jb250ZW50Q2xpZW50UmVjdC5oZWlnaHQvMi41KX11cGRhdGVDaGFydElmVmlzaWJsZSgpe3RoaXMuZG9tVmlzaWJsZSYmKHRoaXMuc2NhbGVzPXRoaXMuY29tcHV0ZVNjYWxlcyh0aGlzLmRhdGEpLHRoaXMucmVuZGVyWEF4aXMoKSx0aGlzLnJlbmRlcllBeGlzKCksdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCkpfWNvbXB1dGVTY2FsZXModCl7Y29uc3R7d2lkdGg6ZSxoZWlnaHQ6bn09dGhpcy5sYXlvdXQuY29udGVudENsaWVudFJlY3Qse21pbjpvLG1heDppfT1uZ3QodCwodD0+KGZ1bmN0aW9uIGUodCxuKXtyZXR1cm4gdC5yZWR1Y2UoKCh0LGUpPT5NYXRoLm1pbih0LG4oZSkpKSwxLzApfSkodC5iaW5zLCh0PT50LngpKSksKHQ9PmVndCh0LmJpbnMsKCh7eDp0LGR4OmV9KT0+dCtlKSkpKSxhPWVndCh0LCh0PT5lZ3QodC5iaW5zLCgoe3k6dH0pPT50KSkpKSxyPWVldCgpLmRvbWFpbihbbyxpXSkubmljZSgpLHM9dGhpcy5tb2RlIT09cEUuT1ZFUkxBWSYmdGhpcy50aW1lUHJvcGVydHk9PWRFLldBTExfVElNRT9mb3QoKTplZXQoKSxsPXQubWFwKCh0PT50aGlzLmdldFRpbWVWYWx1ZSh0KSkpLHttaW46YyxtYXg6ZH09bmd0KGwsKHQ9PnQpKSxwPVtjLGRdO3MuZG9tYWluKHApO2NvbnN0IG09ZWV0KCk7bS5kb21haW4oWzAsYV0pO2NvbnN0IHU9UzcodGhpcy5jb2xvcnx8IiMwMDAiKSxmPWVldCgpO3JldHVybiBmLmRvbWFpbihwKSxyLnJhbmdlKFswLGVdKSxmLnJhbmdlKFt1LmJyaWdodGVyKCksdS5kYXJrZXIoKV0pLGYuaW50ZXJwb2xhdGUobTgpLHRoaXMubW9kZT09PXBFLk9WRVJMQVk/KHMucmFuZ2UoW24sbl0pLG0ucmFuZ2UoW24sMF0pKToocy5yYW5nZShbbi0odGhpcy5tb2RlPT09cEUuT0ZGU0VUP24tdGhpcy5sYXlvdXQuaGlzdG9ncmFtSGVpZ2h0OjApLG5dKSxtLnJhbmdlKFswLC10aGlzLmxheW91dC5oaXN0b2dyYW1IZWlnaHRdKSkse2JpblNjYWxlOnIsZDNDb2xvclNjYWxlOmYsY291bnRTY2FsZTptLHRlbXBvcmFsU2NhbGU6c319cmVuZGVyWEF4aXMoKXtpZighdGhpcy5zY2FsZXMpcmV0dXJuO2NvbnN0e3dpZHRoOnR9PXRoaXMubGF5b3V0LmNvbnRlbnRDbGllbnRSZWN0LGU9ejUodGhpcy5zY2FsZXMuYmluU2NhbGUpLnRpY2tzKE1hdGgubWF4KDIsdC8yMCkpO2UudGlja0Zvcm1hdCh0aGlzLmZvcm1hdHRlcnMuYmluTnVtYmVyKSxlKEo0KHRoaXMueEF4aXMubmF0aXZlRWxlbWVudCkpfWdldFlBeGlzRm9ybWF0dGVyKCl7aWYodGhpcy5tb2RlPT09cEUuT1ZFUkxBWSlyZXR1cm4gdGhpcy5mb3JtYXR0ZXJzLmNvdW50O3N3aXRjaCh0aGlzLnRpbWVQcm9wZXJ0eSl7Y2FzZSBkRS5XQUxMX1RJTUU6cmV0dXJuIHRoaXMuZm9ybWF0dGVycy53YWxsVGltZTtjYXNlIGRFLlNURVA6cmV0dXJuIHRoaXMuZm9ybWF0dGVycy5zdGVwO2Nhc2UgZEUuUkVMQVRJVkU6cmV0dXJuIHRoaXMuZm9ybWF0dGVycy5yZWxhdGl2ZTtkZWZhdWx0OnRocm93IFJhbmdlRXJyb3IoYFkgYXhpcyBmb3JtYXR0ZXIgZm9yICR7dGhpcy50aW1lUHJvcGVydHl9IG11c3QgYmUgaW1wbGVtZW50ZWRgKX19cmVuZGVyWUF4aXMoKXtpZighdGhpcy5zY2FsZXMpcmV0dXJuO2NvbnN0IHQ9dGhpcy5tb2RlPT09cEUuT1ZFUkxBWT90aGlzLnNjYWxlcy5jb3VudFNjYWxlOnRoaXMuc2NhbGVzLnRlbXBvcmFsU2NhbGUse2hlaWdodDplfT10aGlzLmxheW91dC5jb250ZW50Q2xpZW50UmVjdCxuPU41KHQpLnRpY2tzKE1hdGgubWF4KDIsZS8xNSkpO24udGlja0Zvcm1hdCh0aGlzLmdldFlBeGlzRm9ybWF0dGVyKCkpLG4oSjQodGhpcy55QXhpcy5uYXRpdmVFbGVtZW50KSl9ZmluZENsb3Nlc3REYXR1bUluZGV4KHQpe2xldCBlPXQudGFyZ2V0LG49ZTtmb3IoO2UmJmUhPT10aGlzLmhpc3RvZ3JhbXMubmF0aXZlRWxlbWVudDspbj1lLGU9ZS5wYXJlbnRFbGVtZW50O3JldHVybiBlP0FycmF5LmZyb20oZS5jaGlsZHJlbikuaW5kZXhPZihuKTotMX1vbk1vdXNlTW92ZUZvclRlc3RPbmx5KHQpe3JldHVybiB0aGlzLm9uTW91c2VNb3ZlKHQpfW9uTW91c2VNb3ZlKHQpe2lmKCF0aGlzLnNjYWxlcylyZXR1cm47Y29uc3QgZT10Lm9mZnNldFgsbj10Lm9mZnNldFksbz10aGlzLmZpbmRDbG9zZXN0RGF0dW1JbmRleCh0KTtpZihvPDApcmV0dXJuO2NvbnN0IGk9dGhpcy5zY2FsZXMuYmluU2NhbGUuaW52ZXJ0KGUpLGE9dGhpcy5kYXRhW29dLHI9dGhpcy5nZXRDbG9zZXN0QmluRnJvbUJpbkNvb3JkaW5hdGUoYSxpKTt0aGlzLnRvb2x0aXBEYXRhPXt2YWx1ZTp7cG9zaXRpb246e3g6ZSx5Om59LGxhYmVsOnRoaXMubW9kZT09PXBFLk9GRlNFVD90aGlzLmZvcm1hdHRlcnMuY291bnQoci55KTpgU3RlcDogJHt0aGlzLmZvcm1hdHRlcnMuc3RlcChhLnN0ZXApfWB9LHhBeGlzOntwb3NpdGlvbjp0aGlzLmdldFVpQ29vcmRGcm9tQmluRm9yQ29udGVudChyKS54LGxhYmVsOnRoaXMuZm9ybWF0dGVycy5iaW5OdW1iZXIob2d0KHIpKX0seUF4aXM6e3Bvc2l0aW9uOnRoaXMuc2NhbGVzLmNvdW50U2NhbGUodGhpcy5tb2RlPT09cEUuT0ZGU0VUPzA6ci55KSxsYWJlbDp0aGlzLm1vZGU9PT1wRS5PRkZTRVQ/dGhpcy5nZXRZQXhpc0Zvcm1hdHRlcigpKHRoaXMuZ2V0VGltZVZhbHVlKGEpKTp0aGlzLmZvcm1hdHRlcnMuYmluTnVtYmVyKHIueSl9LHhQb3NpdGlvbkluQmluQ29vcmQ6aSxjbG9zZXN0RGF0dW06YSxjbG9zZXN0QmluOnJ9LHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpfX1mdW5jdGlvbiBlZ3QodCxlKXtyZXR1cm4gdC5yZWR1Y2UoKCh0LG4pPT5NYXRoLm1heCh0LGUobikpKSwtMS8wKX1mdW5jdGlvbiBuZ3QodCxlLG4pe258fChuPWUpO2xldCBvPTEvMCxpPS0xLzA7Zm9yKGNvbnN0IGEgb2YgdClvPU1hdGgubWluKG8sZShhKSksaT1NYXRoLm1heChpLG4oYSkpO3JldHVybnttaW46byxtYXg6aX19ZnVuY3Rpb24gb2d0KHQpe3JldHVybiB0LngrLjUqdC5keH1mdW5jdGlvbiBpZ3QodCxlKXsxJnQmJlRtKDAsInZpcy1zZWxlY3RlZC10aW1lLWNsaXBwZWQiKX1mdW5jdGlvbiBhZ3QodCxlKXsxJnQmJihSbSgwLCJzcGFuIiwxNCksVG0oMSwibWF0LXNwaW5uZXIiLDE1KSxBbSgpKX10Z3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHRndCkoU20oVWcpKX0sdGd0Lsm1Y21wPXRvKHt0eXBlOnRndCxzZWxlY3RvcnM6W1sidGItaGlzdG9ncmFtIl1dLHZpZXdRdWVyeTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoUWgoTGZ0LDUpLFFoKEJmdCw1KSxRaChWZnQsNSksUWgoamZ0LDUpLFFoKFVmdCw1KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5tYWluPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLnhBeGlzPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLnlBeGlzPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLmNvbnRlbnQ9dC5maXJzdCksSmgodD10YigpKSYmKG4uaGlzdG9ncmFtcz10LmZpcnN0KX19LGlucHV0czp7bW9kZToibW9kZSIsdGltZVByb3BlcnR5OiJ0aW1lUHJvcGVydHkiLGNvbG9yOiJjb2xvciIsZGF0YToiZGF0YSIsbGlua2VkVGltZToibGlua2VkVGltZSJ9LGZlYXR1cmVzOltCb10sZGVjbHM6MjIsdmFyczoxNyxjb25zdHM6W1siZGV0ZWN0UmVzaXplIiwiIiwib2JzZXJ2ZUludGVyc2VjdGlvbiIsIiIsMywib25SZXNpemUiLCJvblZpc2liaWxpdHlDaGFuZ2UiXSxbIm1haW4iLCIiXSxbMSwiYXhpcyIsIngtYXhpcyJdLFsieEF4aXMiLCIiXSxbMSwidG9vbHRpcCJdLFszLCJ0cmFuc2Zvcm0iLDQsIm5nSWYiXSxbMSwiYXhpcyIsInktYXhpcyJdLFsieUF4aXMiLCIiXSxbNCwibmdJZiJdLFsxLCJjb250ZW50Il0sWyJjb250ZW50IiwiIl0sWzEsImdyaWQiXSxbMywidHJhbnNmb3JtIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbImhpc3RvZ3JhbXMiLCIiXSxbMywidHJhbnNmb3JtIiwiaGlzdG9ncmFtIiwibm8tY29sb3IiLCJjb2xvciIsNCwibmdGb3IiLCJuZ0Zvck9mIiwibmdGb3JUcmFja0J5Il0sWyJjbGFzcyIsInRvb2x0aXAiLDQsIm5nSWYiXSxbMSwibGlua2VkLXRpbWUiXSxbMSwibGlua2VkLXRpbWUtZm9iIiwzLCJzdGVwIl0sWyJjbGFzcyIsImxpbmtlZC10aW1lIiwzLCJ0cmFuc2Zvcm0iLDQsIm5nSWYiXSxbIngyIiwiMTAwJSIsMSwidGljayJdLFsiY2xhc3MiLCJiYXNlbGluZSIsIngyIiwiMTAwJSIsNCwibmdJZiJdLFsiciIsIjIiLDMsInRyYW5zZm9ybSIsNCwibmdJZiJdLFsieDIiLCIxMDAlIiwxLCJiYXNlbGluZSJdLFsiciIsIjIiXSxbInIiLCIyIiw0LCJuZ0lmIl0sWzEsInZhbHVlLWxhYmVsIl0sWyJ4IiwiMyIsInkiLCItMyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiZGl2IiwwLDEpLFZtKCJvblJlc2l6ZSIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblJlc2l6ZSgpfSkpKCJvblZpc2liaWxpdHlDaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uVmlzaWJpbGl0eUNoYW5nZShlKX0pKSxxaSgpLFJtKDIsInN2ZyIsMiksVG0oMywiZyIsbnVsbCwzKSxSbSg1LCJnIiw0KSxRcCg2LEdmdCwzLDMsImciLDUpLEFtKCksQW0oKSxaaSgpLFJtKDcsImRpdiIsNikscWkoKSxSbSg4LCJzdmciKSxUbSg5LCJnIixudWxsLDcpLFJtKDExLCJnIiw0KSxRcCgxMixXZnQsMyw0LCJnIiw1KSxBbSgpLEFtKCksUXAoMTMscWZ0LDQsNCwibmctY29udGFpbmVyIiw4KSxBbSgpLFJtKDE0LCJzdmciLDksMTApLFJtKDE2LCJnIiwxMSksUXAoMTcsWmZ0LDIsMiwiZyIsMTIpLEFtKCksUm0oMTgsImciLG51bGwsMTMpLFFwKDIwLEpmdCw0LDExLCJnIiwxNCksQW0oKSxRcCgyMSwkZnQsNyw3LCJnIiwxNSksQW0oKSxBbSgpKSwyJmUmJihmdSgibWFpbiAiK24ubW9kZSsiICIrbi50aW1lUHJvcGVydHkpLHJjKDYpLERtKCJuZ0lmIixuLnRvb2x0aXBEYXRhKSxyYyg1KSxkdSgidHJhbnNmb3JtIixuLmdldENzc1RyYW5zbGF0ZVB4KDksMCkpLHJjKDEpLERtKCJuZ0lmIixuLnRvb2x0aXBEYXRhKSxyYygxKSxEbSgibmdJZiIsbi5pc0xpbmtlZFRpbWVFbmFibGVkKG4ubGlua2VkVGltZSkpLHJjKDQpLERtKCJuZ0Zvck9mIixuLmdldEdyaWRUaWNrWUxvY3MoKSkscmMoMSkscHUoImhpc3RvZ3JhbXMiLCEwKSgibGlua2VkLXRpbWUtZW5hYmxlZCIsbi5saW5rZWRUaW1lKSgibGlua2VkLXRpbWUtc2luZ2xlLXN0ZXAiLG4ubGlua2VkVGltZSYmIW4ubGlua2VkVGltZS5lbmRTdGVwKSxyYygyKSxEbSgibmdGb3JPZiIsbi5kYXRhKSgibmdGb3JUcmFja0J5IixuLnRyYWNrQnlXYWxsVGltZSkscmMoMSksRG0oIm5nSWYiLG4udG9vbHRpcERhdGEpKX0sZGlyZWN0aXZlczpbb0osTmZ0LGRNLGxNLGhmdF0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9W19uZ2hvc3QtJUNPTVAlXSwgLm1haW5bX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9W19uZ2hvc3QtJUNPTVAlXXtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzoxMHB4fS5tYWluW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1hcmVhczoiY29udGVudCB5LWF4aXMiICJ4LWF4aXMgLiI7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciA1MHB4O2dyaWQtdGVtcGxhdGUtcm93czoxZnIgMzBweH0ubWFpbi53YWxsX3RpbWVbX25nY29udGVudC0lQ09NUCVde2dyaWQtdGVtcGxhdGUtY29sdW1uczoxZnIgNzVweH0udG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV0sIC5iYXNlbGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzAwMH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAudG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC50b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5iYXNlbGluZVtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5iYXNlbGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubGlua2VkLXRpbWUtZm9iW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRleHRbX25nY29udGVudC0lQ09NUCVdLCAudG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV0gICB0ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpib2xkO2ZvbnQtc2l6ZToxMHB4fS5saW5rZWQtdGltZS1mb2JbX25nY29udGVudC0lQ09NUCVdICAgdGV4dFtfbmdjb250ZW50LSVDT01QJV0sIC5saW5rZWQtdGltZS1mb2JbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLnRvb2x0aXBbX25nY29udGVudC0lQ09NUCVdICAgdGV4dFtfbmdjb250ZW50LSVDT01QJV0sIC50b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17ZmlsbDpjdXJyZW50Q29sb3J9LmxpbmtlZC10aW1lLWZvYltfbmdjb250ZW50LSVDT01QJV0gICAudmFsdWUtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAudG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV0gICAudmFsdWUtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2RvbWluYW50LWJhc2VsaW5lOmlkZW9ncmFwaGljO3RleHQtYW5jaG9yOnN0YXJ0fS5saW5rZWQtdGltZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7bGVmdDo5cHg7dG9wOjA7aGVpZ2h0OjEwMCU7cmlnaHQ6MH0ubGlua2VkLXRpbWVbX25nY29udGVudC0lQ09NUCVdICAgLmxpbmtlZC10aW1lLWZvYltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTppbmxpbmUtYmxvY2s7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSl9LmF4aXNbX25nY29udGVudC0lQ09NUCVdICAgIHtjb2xvcjojNjE2MTYxO3Bvc2l0aW9uOnJlbGF0aXZlO292ZXJmbG93OmhpZGRlbn1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuYXhpc1tfbmdjb250ZW50LSVDT01QJV0gICAgLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuYXhpc1tfbmdjb250ZW50LSVDT01QJV0gICAge2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfS5heGlzW19uZ2NvbnRlbnQtJUNPTVAlXSAgICAgLmRvbWFpbiwgLmF4aXNbX25nY29udGVudC0lQ09NUCVdICAgICAudGljayB0ZXh0e2Rpc3BsYXk6bm9uZX0uYXhpc1tfbmdjb250ZW50LSVDT01QJV0gICAgIC50aWNrOm50aC1jaGlsZCgybisxKSB0ZXh0e2Rpc3BsYXk6aW5pdGlhbH1zdmdbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7cG9pbnRlci1ldmVudHM6dmlzaWJsZVBhaW50ZWR9c3ZnW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGxpbmVbX25nY29udGVudC0lQ09NUCVdLCBzdmdbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgc3ZnW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC50b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lfXN2Z1tfbmdjb250ZW50LSVDT01QJV0gICBnW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWxsLWNoYW5nZTp0cmFuc2Zvcm19LngtYXhpc1tfbmdjb250ZW50LSVDT01QJV17Z3JpZC1hcmVhOngtYXhpc30ueC1heGlzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC50b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtkb21pbmFudC1iYXNlbGluZTpoYW5naW5nO3RleHQtYW5jaG9yOm1pZGRsZX0ueS1heGlzW19uZ2NvbnRlbnQtJUNPTVAlXXtncmlkLWFyZWE6eS1heGlzOy13ZWJraXQtbWFzay1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjMDAwMCAwJSwgIzAwMCAxMCUsICMwMDAgOTAlLCAjMDAwMCAxMDAlKTttYXNrLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICMwMDAwIDAlLCAjMDAwIDEwJSwgIzAwMCA5MCUsICMwMDAwIDEwMCUpfS55LWF4aXNbX25nY29udGVudC0lQ09NUCVdICAgLnRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2RvbWluYW50LWJhc2VsaW5lOm1pZGRsZTt0ZXh0LWFuY2hvcjpzdGFydH0uY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAudGlja1tfbmdjb250ZW50LSVDT01QJV0sIC5heGlzW19uZ2NvbnRlbnQtJUNPTVAlXSAgICAgLnRpY2sgbGluZXtzdHJva2U6I2RkZH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAudGlja1tfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC50aWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6IzU1NX1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuYXhpc1tfbmdjb250ZW50LSVDT01QJV0gICAgIC50aWNrIGxpbmUsIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5heGlzW19uZ2NvbnRlbnQtJUNPTVAlXSAgICAgLnRpY2sgbGluZXtzdHJva2U6IzU1NX0uY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Z3JpZC1hcmVhOmNvbnRlbnR9LmNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLnRpY2tbX25nY29udGVudC0lQ09NUCVde3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWRhc2hhcnJheToyfS5jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBhdGhbX25nY29udGVudC0lQ09NUCVde2ZpbGw6Y3VycmVudENvbG9yO3N0cm9rZS1vcGFjaXR5Oi42O3N0cm9rZS13aWR0aDoxcHh9LmNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWx0ZXI6ZHJvcC1zaGFkb3coMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuNikpO3N0cm9rZTojZmZmO3dpbGwtY2hhbmdlOnRyYW5zZm9ybX0uY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAuYmFzZWxpbmVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZS1vcGFjaXR5Oi4xO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlOmN1cnJlbnRDb2xvcjt3aWR0aDoxMDAlfS5jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC50b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBhdGhbX25nY29udGVudC0lQ09NUCVde3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlOmN1cnJlbnRDb2xvcjtmaWxsOnRyYW5zcGFyZW50fS5jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5uby1jb2xvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyMjEsMjIxLDIyMSwuNCkgIWltcG9ydGFudH0uY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAubm8tY29sb3JbX25nY29udGVudC0lQ09NUCVdICAgcGF0aFtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlLW9wYWNpdHk6LjJ9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm5vLWNvbG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm5vLWNvbG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDUxLDUxLDUxLC40KSAhaW1wb3J0YW50fS5vZmZzZXRbX25nY29udGVudC0lQ09NUCVdICAgLmNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLmhpc3RvZ3JhbXNbX25nY29udGVudC0lQ09NUCVdICAgcGF0aFtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmZmZ9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLm9mZnNldFtfbmdjb250ZW50LSVDT01QJV0gICAuY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAuaGlzdG9ncmFtc1tfbmdjb250ZW50LSVDT01QJV0gICBwYXRoW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLm9mZnNldFtfbmdjb250ZW50LSVDT01QJV0gICAuY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAuaGlzdG9ncmFtc1tfbmdjb250ZW50LSVDT01QJV0gICBwYXRoW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6IzU1NX0ub2Zmc2V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5oaXN0b2dyYW1zLmxpbmtlZC10aW1lLXNpbmdsZS1zdGVwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIFtfbmdjb250ZW50LSVDT01QJV06bm90KC5uby1jb2xvcikgICBwYXRoW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6IzAwMH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAub2Zmc2V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5oaXN0b2dyYW1zLmxpbmtlZC10aW1lLXNpbmdsZS1zdGVwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIFtfbmdjb250ZW50LSVDT01QJV06bm90KC5uby1jb2xvcikgICBwYXRoW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLm9mZnNldFtfbmdjb250ZW50LSVDT01QJV0gICAuY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAuaGlzdG9ncmFtcy5saW5rZWQtdGltZS1zaW5nbGUtc3RlcFtfbmdjb250ZW50LSVDT01QJV0gICBbX25nY29udGVudC0lQ09NUCVdOm5vdCgubm8tY29sb3IpICAgcGF0aFtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmZmZ9Lm92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdICAgLngtYXhpc1tfbmdjb250ZW50LSVDT01QJV0gICAgIC50aWNrIGxpbmV7ZGlzcGxheTpub25lfS5vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBhdGhbX25nY29udGVudC0lQ09NUCVde2ZpbGwtb3BhY2l0eTowO3N0cm9rZTpjdXJyZW50Q29sb3J9LnRvb2x0aXBbX25nY29udGVudC0lQ09NUCVdLCAuY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0ubWFpbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAuY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWFpbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAudG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpibG9ja30nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodGd0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InRiLWhpc3RvZ3JhbSIsdGVtcGxhdGVVcmw6Imhpc3RvZ3JhbV9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiaGlzdG9ncmFtX2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6VWd9XX0pLHttYWluOlt7dHlwZTpaYSxhcmdzOlsibWFpbiJdfV0seEF4aXM6W3t0eXBlOlphLGFyZ3M6WyJ4QXhpcyJdfV0seUF4aXM6W3t0eXBlOlphLGFyZ3M6WyJ5QXhpcyJdfV0sY29udGVudDpbe3R5cGU6WmEsYXJnczpbImNvbnRlbnQiXX1dLGhpc3RvZ3JhbXM6W3t0eXBlOlphLGFyZ3M6WyJoaXN0b2dyYW1zIl19XSxtb2RlOlt7dHlwZTp4eX1dLHRpbWVQcm9wZXJ0eTpbe3R5cGU6eHl9XSxjb2xvcjpbe3R5cGU6eHl9XSxkYXRhOlt7dHlwZTp4eX1dLGxpbmtlZFRpbWU6W3t0eXBlOnh5fV19KTtjb25zdCByZ3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm57c3RhcnRTdGVwOnQsZW5kU3RlcDplfX07ZnVuY3Rpb24gc2d0KHQsZSl7aWYoMSZ0JiZUbSgwLCJ0Yi1oaXN0b2dyYW0iLDE2KSwyJnQpe2NvbnN0IHQ9WW0oKTtEbSgiZGF0YSIsdC5kYXRhKSgibW9kZSIsdC5tb2RlKSgidGltZVByb3BlcnR5Iix0LnRpbWVQcm9wZXJ0eSh0LnhBeGlzVHlwZSkpKCJjb2xvciIsdC5ydW5Db2xvclNjYWxlKHQucnVuSWQpKSgibGlua2VkVGltZSIsdC5zZWxlY3RlZFRpbWU/dmgoNSxyZ3QsdC5zZWxlY3RlZFRpbWUuc3RhcnRTdGVwLHQuc2VsZWN0ZWRUaW1lLmVuZFN0ZXApOm51bGwpfX1mdW5jdGlvbiBsZ3QodCxlKXsxJnQmJihSbSgwLCJkaXYiLDE4KSxrdSgxLCIgRGF0YSBmYWlsZWQgdG8gbG9hZC4gIiksQW0oKSl9ZnVuY3Rpb24gY2d0KHQsZSl7aWYoMSZ0JiZRcCgwLGxndCwyLDAsImRpdiIsMTcpLDImdCl7Y29uc3QgdD1ZbSgpO0RtKCJuZ0lmIix0LmxvYWRTdGF0ZT09PXQuRGF0YUxvYWRTdGF0ZS5GQUlMRUQpfX1jb25zdCBkZ3Q9ZnVuY3Rpb24odCl7cmV0dXJue2JhY2tncm91bmRDb2xvcjp0fX07Y2xhc3MgcGd0e2NvbnN0cnVjdG9yKCl7dGhpcy5EYXRhTG9hZFN0YXRlPXlFLHRoaXMub25GdWxsU2l6ZVRvZ2dsZT1uZXcgTGgsdGhpcy5vblBpbkNsaWNrZWQ9bmV3IExofXRpbWVQcm9wZXJ0eSh0KXtzd2l0Y2godCl7Y2FzZSB5QS5TVEVQOnJldHVybiBkRS5TVEVQO2Nhc2UgeUEuV0FMTF9USU1FOnJldHVybiBkRS5XQUxMX1RJTUU7Y2FzZSB5QS5SRUxBVElWRTpyZXR1cm4gZEUuUkVMQVRJVkU7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgeEF4aXNUeXBlIGZvciBoaXN0b2dyYW0gdGltZSBwcm9wZXJ0eS4iKX19fXBndC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8cGd0KX0scGd0Lsm1Y21wPXRvKHt0eXBlOnBndCxzZWxlY3RvcnM6W1siaGlzdG9ncmFtLWNhcmQtY29tcG9uZW50Il1dLGlucHV0czp7bG9hZFN0YXRlOiJsb2FkU3RhdGUiLHRpdGxlOiJ0aXRsZSIsdGFnOiJ0YWciLHJ1bklkOiJydW5JZCIsZGF0YToiZGF0YSIsbW9kZToibW9kZSIseEF4aXNUeXBlOiJ4QXhpc1R5cGUiLHJ1bkNvbG9yU2NhbGU6InJ1bkNvbG9yU2NhbGUiLHNob3dGdWxsU2l6ZToic2hvd0Z1bGxTaXplIixpc1Bpbm5lZDoiaXNQaW5uZWQiLHNlbGVjdGVkVGltZToic2VsZWN0ZWRUaW1lIn0sb3V0cHV0czp7b25GdWxsU2l6ZVRvZ2dsZToib25GdWxsU2l6ZVRvZ2dsZSIsb25QaW5DbGlja2VkOiJvblBpbkNsaWNrZWQifSxkZWNsczoxNix2YXJzOjEzLGNvbnN0czpmdW5jdGlvbigpe2xldCB0LGU7cmV0dXJuIHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSYmbmdJMThuQ2xvc3VyZU1vZGU/Z29vZy5nZXRNc2coIlBpbiBjYXJkIik6JGxvY2FsaXplYDpBIGJ1dHRvbiB0byBwaW4gYSBjYXJkLuKQn2U2NjVkYzcxMmJkNWYxOGQ0ZGZhM2EyOWUxMjVkNTY1Y2M1MWUyZjbikJ83Mjg0NjA2NDI2MjM0Mzc1MzQ0OlBpbiBjYXJkYCxlPSJ1bmRlZmluZWQiIT10eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUmJm5nSTE4bkNsb3N1cmVNb2RlP2dvb2cuZ2V0TXNnKCJUb2dnbGUgZnVsbCBzaXplIG1vZGUiKTokbG9jYWxpemVgOkEgYnV0dG9uIG9uIGEgaGlzdG9ncmFtIGNhcmQgdGhhdCB0b2dnbGVzIGZ1bGwgc2l6ZSBtb2RlLuKQn2ZjOGY3NjdkMGI5ZjkzMDE4N2ExYmFlMzQ0NzdhZDI4NzM2ZWNlMzPikJ85MTU3MjE1NjM2Mzg5MjY1OTc6VG9nZ2xlIGZ1bGwgc2l6ZSBtb2RlYCxbWzEsImhlYWRpbmciXSxbMSwidGFnIl0sWzMsInRpdGxlIiwidmFsdWUiXSxbNCwibmdJZiJdLFsxLCJydW4iXSxbMSwiZG90IiwzLCJuZ1N0eWxlIl0sWzEsInJ1bi10ZXh0IiwzLCJydW5JZCJdLFsxLCJjb250cm9scyJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsdCwxLCJwaW4tYnV0dG9uIiwzLCJjbGljayJdLFszLCJzdmdJY29uIl0sWyJtYXQtaWNvbi1idXR0b24iLCIiLCJhcmlhLWxhYmVsIixlLCJ0aXRsZSIsIlRvZ2dsZSBmdWxsIHNpemUgbW9kZSIsMywiY2xpY2siXSxbImNsYXNzIiwic3Bpbm5lciIsNCwibmdJZiJdLFszLCJkYXRhIiwibW9kZSIsInRpbWVQcm9wZXJ0eSIsImNvbG9yIiwibGlua2VkVGltZSIsNCwibmdJZiIsIm5nSWZFbHNlIl0sWyJub0RhdGEiLCIiXSxbMSwic3Bpbm5lciJdLFsiZGlhbWV0ZXIiLCIxOCJdLFszLCJkYXRhIiwibW9kZSIsInRpbWVQcm9wZXJ0eSIsImNvbG9yIiwibGlua2VkVGltZSJdLFsiY2xhc3MiLCJlbXB0eS1tZXNzYWdlIiw0LCJuZ0lmIl0sWzEsImVtcHR5LW1lc3NhZ2UiXV19LHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihSbSgwLCJkaXYiLDApLFJtKDEsImRpdiIsMSksVG0oMiwidGItdHJ1bmNhdGVkLXBhdGgiLDIpLFFwKDMsaWd0LDEsMCwidmlzLXNlbGVjdGVkLXRpbWUtY2xpcHBlZCIsMyksQW0oKSxSbSg0LCJkaXYiLDQpLFRtKDUsInNwYW4iLDUpLFRtKDYsImNhcmQtcnVuLW5hbWUiLDYpLEFtKCksUm0oNywic3BhbiIsNyksUm0oOCwiYnV0dG9uIiw4KSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25QaW5DbGlja2VkLmVtaXQoIW4uaXNQaW5uZWQpfSkpLFRtKDksIm1hdC1pY29uIiw5KSxBbSgpLFJtKDEwLCJidXR0b24iLDEwKSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25GdWxsU2l6ZVRvZ2dsZS5lbWl0KCl9KSksVG0oMTEsIm1hdC1pY29uIiw5KSxBbSgpLEFtKCksUXAoMTIsYWd0LDIsMCwic3BhbiIsMTEpLEFtKCksUXAoMTMsc2d0LDEsOCwidGItaGlzdG9ncmFtIiwxMiksUXAoMTQsY2d0LDEsMSwibmctdGVtcGxhdGUiLG51bGwsMTMsaWIpKSwyJmUpe2NvbnN0IHQ9JHAoMTUpO3JjKDIpLERtKCJ0aXRsZSIsbi50YWcpKCJ2YWx1ZSIsbi50aXRsZSkscmMoMSksRG0oIm5nSWYiLG4uc2VsZWN0ZWRUaW1lJiZuLnNlbGVjdGVkVGltZS5jbGlwcGVkKSxyYygyKSxEbSgibmdTdHlsZSIsTWgoMTEsZGd0LG4ucnVuQ29sb3JTY2FsZShuLnJ1bklkKSkpLHJjKDEpLERtKCJydW5JZCIsbi5ydW5JZCkscmMoMiksanAoInRpdGxlIixuLmlzUGlubmVkPyJVbnBpbiBjYXJkIjoiUGluIGNhcmQiKSxyYygxKSxEbSgic3ZnSWNvbiIsbi5pc1Bpbm5lZD8ia2VlcF8yNHB4Ijoia2VlcF9vdXRsaW5lXzI0cHgiKSxyYygyKSxEbSgic3ZnSWNvbiIsbi5zaG93RnVsbFNpemU/ImZ1bGxzY3JlZW5fZXhpdF8yNHB4IjoiZnVsbHNjcmVlbl8yNHB4IikscmMoMSksRG0oIm5nSWYiLG4ubG9hZFN0YXRlPT09bi5EYXRhTG9hZFN0YXRlLkxPQURJTkcpLHJjKDEpLERtKCJuZ0lmIixuLmRhdGEmJm4uZGF0YS5sZW5ndGgpKCJuZ0lmRWxzZSIsdCl9fSxkaXJlY3RpdmVzOlt6MixkTSxDTSxMMixYSCxEVyxnZnQsbzEsdGd0XSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Ym94LXNpemluZzpib3JkZXItYm94O2hlaWdodDoxMDAlO292ZXJmbG93OmF1dG87cGFkZGluZzoxNnB4O3BhZGRpbmctdG9wOjRweH0uaGVhZGluZ1tfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWFyZWFzOiJ0YWcgY29udHJvbHMiICJydW4gc3Bpbm5lciI7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciBhdXRvO2ZvbnQtc2l6ZToxNHB4O21hcmdpbi1ib3R0b206NHB4fS50YWdbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7Z2FwOjVweDtncmlkLWFyZWE6dGFnO292ZXJmbG93OmhpZGRlbn0udGFnW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHZpcy1zZWxlY3RlZC10aW1lLWNsaXBwZWRbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjB9LnBpbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgbWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxOHB4fS5ydW5bX25nY29udGVudC0lQ09NUCVde2dyaWQtYXJlYTpydW47ZGlzcGxheTpmbGV4O3doaXRlLXNwYWNlOm5vd3JhcDtmb250LXNpemU6MTNweH0ucnVuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5kb3RbX25nY29udGVudC0lQ09NUCVde2ZsZXg6bm9uZTtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxM3B4O2hlaWdodDoxM3B4O2JvcmRlci1yYWRpdXM6NTAlO21hcmdpbi1yaWdodDo0cHh9LnJ1bltfbmdjb250ZW50LSVDT01QJV0gICAucnVuLXRleHRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO21heC13aWR0aDoxMjBweH0uY29udHJvbHNbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjE7d2hpdGUtc3BhY2U6bm93cmFwO2dyaWQtYXJlYTpjb250cm9scztqdXN0aWZ5LXNlbGY6ZmxleC1lbmQ7ZmxleC1zaHJpbms6MDttYXJnaW4tcmlnaHQ6LTEycHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmNvbnRyb2xzW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmNvbnRyb2xzW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX0uc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2dyaWQtYXJlYTpzcGlubmVyO2hlaWdodDoxMDAlO2p1c3RpZnktY29udGVudDpjZW50ZXI7cG9zaXRpb246cmVsYXRpdmV9bWF0LXNwaW5uZXJbX25nY29udGVudC0lQ09NUCVde3RvcDowO3JpZ2h0OjA7cG9zaXRpb246YWJzb2x1dGV9dGItaGlzdG9ncmFtW19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4LWdyb3c6MTtvdmVyZmxvdzpoaWRkZW59LmVtcHR5LW1lc3NhZ2VbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6MWVtO2ZvbnQtc2l6ZToxM3B4fSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChwZ3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiaGlzdG9ncmFtLWNhcmQtY29tcG9uZW50Iix0ZW1wbGF0ZVVybDoiaGlzdG9ncmFtX2NhcmRfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbImhpc3RvZ3JhbV9jYXJkX2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSxudWxsLHtsb2FkU3RhdGU6W3t0eXBlOnh5fV0sdGl0bGU6W3t0eXBlOnh5fV0sdGFnOlt7dHlwZTp4eX1dLHJ1bklkOlt7dHlwZTp4eX1dLGRhdGE6W3t0eXBlOnh5fV0sbW9kZTpbe3R5cGU6eHl9XSx4QXhpc1R5cGU6W3t0eXBlOnh5fV0scnVuQ29sb3JTY2FsZTpbe3R5cGU6eHl9XSxzaG93RnVsbFNpemU6W3t0eXBlOnh5fV0saXNQaW5uZWQ6W3t0eXBlOnh5fV0sc2VsZWN0ZWRUaW1lOlt7dHlwZTp4eX1dLG9uRnVsbFNpemVUb2dnbGU6W3t0eXBlOk95fV0sb25QaW5DbGlja2VkOlt7dHlwZTpPeX1dfSk7Y2xhc3MgbWd0e2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLmZ1bGxXaWR0aENoYW5nZWQ9bmV3IExoLHRoaXMuZnVsbEhlaWdodENoYW5nZWQ9bmV3IExoLHRoaXMucGluU3RhdGVDaGFuZ2VkPW5ldyBMaCx0aGlzLm1vZGUkPXRoaXMuc3RvcmUuc2VsZWN0KE5UKSx0aGlzLnhBeGlzVHlwZSQ9dGhpcy5zdG9yZS5zZWxlY3QoVFQpLHRoaXMuc2hvd0Z1bGxTaXplPSExfWlzSGlzdG9ncmFtQ2FyZE1ldGFkYXRhKHQpe2NvbnN0e3BsdWdpbjplfT10O3JldHVybiBlPT09aEEuSElTVE9HUkFNU31vbkZ1bGxTaXplVG9nZ2xlKCl7dGhpcy5zaG93RnVsbFNpemU9IXRoaXMuc2hvd0Z1bGxTaXplLHRoaXMuZnVsbFdpZHRoQ2hhbmdlZC5lbWl0KHRoaXMuc2hvd0Z1bGxTaXplKSx0aGlzLmZ1bGxIZWlnaHRDaGFuZ2VkLmVtaXQodGhpcy5zaG93RnVsbFNpemUpfW5nT25Jbml0KCl7Y29uc3QgdD10aGlzLnN0b3JlLnNlbGVjdCh5VCx0aGlzLmNhcmRJZCkucGlwZShjZSgodD0+ISF0JiZ0aGlzLmlzSGlzdG9ncmFtQ2FyZE1ldGFkYXRhKHQpKSksSXQoKHQ9PnQpKSksZT1XdChbdCx0aGlzLnN0b3JlLnNlbGVjdChoVCx0aGlzLmNhcmRJZCldKTt0aGlzLmRhdGEkPWUucGlwZShJdCgoKFt0LGVdKT0+e2NvbnN0IG49dC5ydW5JZDtyZXR1cm4gZSYmZS5oYXNPd25Qcm9wZXJ0eShuKT8oZnVuY3Rpb24gbyh0LGU9MzApe2lmKCF0Lmxlbmd0aHx8ZTwxKXJldHVybltdO2NvbnN0IG49KGZ1bmN0aW9uIG8odCl7bGV0IGU9bnVsbCxuPW51bGw7Zm9yKGNvbnN0e2JpbnM6b31vZiB0KXtpZighby5sZW5ndGgpY29udGludWU7Y29uc3QgdD1vW28ubGVuZ3RoLTFdLGk9b1swXS54LGE9dC54K3QuZHg7KG51bGw9PT1lfHxpPGUpJiYoZT1pKSwobnVsbD09PW58fGE+bikmJihuPWEpfXJldHVybiBudWxsPT09ZXx8bnVsbD09PW4/bnVsbDp7bGVmdDplLHJpZ2h0Om59fSkodCk7cmV0dXJuIG4mJm4ubGVmdD09PW4ucmlnaHQmJihuLnJpZ2h0PTEuMSpuLnJpZ2h0KzEsbi5sZWZ0PW4ubGVmdC8xLjEtMSksdC5tYXAoKHQ9Pih7c3RlcDp0LnN0ZXAsd2FsbFRpbWU6dC53YWxsVGltZSxiaW5zOm4/SGZ0KHQuYmlucyxuLGUpOltdfSkpKX0pKGVbbl0ubWFwKCh0PT57Y29uc3R7d2FsbFRpbWU6ZSxzdGVwOm59PXQ7cmV0dXJue3dhbGxUaW1lOmUsc3RlcDpuLGJpbnM6dC5iaW5zLm1hcCgodD0+KHt4OnQubWluLGR4OnQubWF4LXQubWluLHk6dC5jb3VudH0pKSl9fSkpKTpbXX0pKSksdGhpcy5zZWxlY3RlZFRpbWUkPXRoaXMuc3RvcmUuc2VsZWN0KFlUKS5waXBlKGZlKHRoaXMuZGF0YSQpLEl0KCgoW3QsZV0pPT57aWYoIXQpcmV0dXJuIG51bGw7bGV0IG49MS8wLG89LTEvMDtmb3IoY29uc3QgdCBvZiBlKW49TWF0aC5taW4odC5zdGVwLG4pLG89TWF0aC5tYXgodC5zdGVwLG8pO3JldHVybiBIMih0LG4sbyl9KSkpLHRoaXMubG9hZFN0YXRlJD10aGlzLnN0b3JlLnNlbGVjdChnVCx0aGlzLmNhcmRJZCksdGhpcy50YWckPXQucGlwZShJdCgodD0+dC50YWcpKSksdGhpcy50aXRsZSQ9dGhpcy50YWckLnBpcGUoSXQoKHQ9PmYyKHQsdGhpcy5ncm91cE5hbWUpKSkpLHRoaXMucnVuSWQkPXQucGlwZShJdCgodD0+dC5ydW5JZCkpKSx0aGlzLmlzUGlubmVkJD10aGlzLnN0b3JlLnNlbGVjdCh3VCx0aGlzLmNhcmRJZCl9fWZ1bmN0aW9uIHVndCh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsImltYWdlLWNhcmQiLDYpLFZtKCJmdWxsV2lkdGhDaGFuZ2VkIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oMikub25GdWxsV2lkdGhDaGFuZ2VkKG4pfSkpKCJwaW5TdGF0ZUNoYW5nZWQiLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLFltKDIpLm9uUGluU3RhdGVDaGFuZ2VkKCl9KSksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oMik7RG0oImNhcmRJZCIsdC5jYXJkSWQpKCJncm91cE5hbWUiLHQuZ3JvdXBOYW1lKSgicnVuQ29sb3JTY2FsZSIsdC5ydW5Db2xvclNjYWxlKX19ZnVuY3Rpb24gZmd0KHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwic2NhbGFyLWNhcmQiLDcpLFZtKCJmdWxsV2lkdGhDaGFuZ2VkIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oMikub25GdWxsV2lkdGhDaGFuZ2VkKG4pfSkpKCJmdWxsSGVpZ2h0Q2hhbmdlZCIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKDIpLm9uRnVsbEhlaWdodENoYW5nZWQobil9KSkoInBpblN0YXRlQ2hhbmdlZCIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oMikub25QaW5TdGF0ZUNoYW5nZWQoKX0pKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgyKTtEbSgiY2FyZElkIix0LmNhcmRJZCkoImdyb3VwTmFtZSIsdC5ncm91cE5hbWUpfX1mdW5jdGlvbiBnZ3QodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJoaXN0b2dyYW0tY2FyZCIsOCksVm0oImZ1bGxXaWR0aENoYW5nZWQiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgyKS5vbkZ1bGxXaWR0aENoYW5nZWQobil9KSkoImZ1bGxIZWlnaHRDaGFuZ2VkIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oMikub25GdWxsSGVpZ2h0Q2hhbmdlZChuKX0pKSgicGluU3RhdGVDaGFuZ2VkIiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgyKS5vblBpblN0YXRlQ2hhbmdlZCgpfSkpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKDIpO0RtKCJjYXJkSWQiLHQuY2FyZElkKSgiZ3JvdXBOYW1lIix0Lmdyb3VwTmFtZSkoInJ1bkNvbG9yU2NhbGUiLHQucnVuQ29sb3JTY2FsZSl9fWZ1bmN0aW9uIGhndCh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgyKTtyYygxKSxEdSgiUGxhY2Vob2xkZXIgZXJyb3IgZm9yOiAiLHQuY2FyZElkLCIiKX19ZnVuY3Rpb24gYmd0KHQsZSl7aWYoMSZ0JiYoTm0oMCwxKSxRcCgxLHVndCwxLDMsImltYWdlLWNhcmQiLDIpLFFwKDIsZmd0LDEsMiwic2NhbGFyLWNhcmQiLDMpLFFwKDMsZ2d0LDEsMywiaGlzdG9ncmFtLWNhcmQiLDQpLFFwKDQsaGd0LDIsMSwiZGl2Iiw1KSx6bSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtEbSgibmdTd2l0Y2giLHQucGx1Z2luVHlwZSkscmMoMSksRG0oIm5nU3dpdGNoQ2FzZSIsdC5QbHVnaW5UeXBlLklNQUdFUykscmMoMSksRG0oIm5nU3dpdGNoQ2FzZSIsdC5QbHVnaW5UeXBlLlNDQUxBUlMpLHJjKDEpLERtKCJuZ1N3aXRjaENhc2UiLHQuUGx1Z2luVHlwZS5ISVNUT0dSQU1TKX19bWd0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxtZ3QpKFNtKEl3KSl9LG1ndC7JtWNtcD10byh7dHlwZTptZ3Qsc2VsZWN0b3JzOltbImhpc3RvZ3JhbS1jYXJkIl1dLGlucHV0czp7Y2FyZElkOiJjYXJkSWQiLGdyb3VwTmFtZToiZ3JvdXBOYW1lIixydW5Db2xvclNjYWxlOiJydW5Db2xvclNjYWxlIn0sb3V0cHV0czp7ZnVsbFdpZHRoQ2hhbmdlZDoiZnVsbFdpZHRoQ2hhbmdlZCIsZnVsbEhlaWdodENoYW5nZWQ6ImZ1bGxIZWlnaHRDaGFuZ2VkIixwaW5TdGF0ZUNoYW5nZWQ6InBpblN0YXRlQ2hhbmdlZCJ9LGRlY2xzOjEwLHZhcnM6MjksY29uc3RzOltbMywibG9hZFN0YXRlIiwidGl0bGUiLCJ0YWciLCJydW5JZCIsImRhdGEiLCJtb2RlIiwieEF4aXNUeXBlIiwicnVuQ29sb3JTY2FsZSIsInNob3dGdWxsU2l6ZSIsImlzUGlubmVkIiwic2VsZWN0ZWRUaW1lIiwib25GdWxsU2l6ZVRvZ2dsZSIsIm9uUGluQ2xpY2tlZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiaGlzdG9ncmFtLWNhcmQtY29tcG9uZW50IiwwKSxWbSgib25GdWxsU2l6ZVRvZ2dsZSIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkZ1bGxTaXplVG9nZ2xlKCl9KSkoIm9uUGluQ2xpY2tlZCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ucGluU3RhdGVDaGFuZ2VkLmVtaXQoZSl9KSksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQWgoNCwiYXN5bmMiKSxBaCg1LCJhc3luYyIpLEFoKDYsImFzeW5jIiksQWgoNywiYXN5bmMiKSxBaCg4LCJhc3luYyIpLEFoKDksImFzeW5jIiksQW0oKSksMiZlJiZEbSgibG9hZFN0YXRlIixUaCgxLDExLG4ubG9hZFN0YXRlJCkpKCJ0aXRsZSIsVGgoMiwxMyxuLnRpdGxlJCkpKCJ0YWciLFRoKDMsMTUsbi50YWckKSkoInJ1bklkIixUaCg0LDE3LG4ucnVuSWQkKSkoImRhdGEiLFRoKDUsMTksbi5kYXRhJCkpKCJtb2RlIixUaCg2LDIxLG4ubW9kZSQpKSgieEF4aXNUeXBlIixUaCg3LDIzLG4ueEF4aXNUeXBlJCkpKCJydW5Db2xvclNjYWxlIixuLnJ1bkNvbG9yU2NhbGUpKCJzaG93RnVsbFNpemUiLG4uc2hvd0Z1bGxTaXplKSgiaXNQaW5uZWQiLFRoKDgsMjUsbi5pc1Bpbm5lZCQpKSgic2VsZWN0ZWRUaW1lIixUaCg5LDI3LG4uc2VsZWN0ZWRUaW1lJCkpfSxkaXJlY3RpdmVzOltwZ3RdLHBpcGVzOlt3TV0sc3R5bGVzOlsiW19uZ2hvc3QtJUNPTVAlXSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICB9Il0sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKG1ndCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJoaXN0b2dyYW0tY2FyZCIsdGVtcGxhdGU6J1xuICAgIDxoaXN0b2dyYW0tY2FyZC1jb21wb25lbnRcbiAgICAgIFtsb2FkU3RhdGVdPSJsb2FkU3RhdGUkIHwgYXN5bmMiXG4gICAgICBbdGl0bGVdPSJ0aXRsZSQgfCBhc3luYyJcbiAgICAgIFt0YWddPSJ0YWckIHwgYXN5bmMiXG4gICAgICBbcnVuSWRdPSJydW5JZCQgfCBhc3luYyJcbiAgICAgIFtkYXRhXT0iZGF0YSQgfCBhc3luYyJcbiAgICAgIFttb2RlXT0ibW9kZSQgfCBhc3luYyJcbiAgICAgIFt4QXhpc1R5cGVdPSJ4QXhpc1R5cGUkIHwgYXN5bmMiXG4gICAgICBbcnVuQ29sb3JTY2FsZV09InJ1bkNvbG9yU2NhbGUiXG4gICAgICBbc2hvd0Z1bGxTaXplXT0ic2hvd0Z1bGxTaXplIlxuICAgICAgW2lzUGlubmVkXT0iaXNQaW5uZWQkIHwgYXN5bmMiXG4gICAgICBbc2VsZWN0ZWRUaW1lXT0ic2VsZWN0ZWRUaW1lJCB8IGFzeW5jIlxuICAgICAgKG9uRnVsbFNpemVUb2dnbGUpPSJvbkZ1bGxTaXplVG9nZ2xlKCkiXG4gICAgICAob25QaW5DbGlja2VkKT0icGluU3RhdGVDaGFuZ2VkLmVtaXQoJGV2ZW50KSJcbiAgICA+PC9oaXN0b2dyYW0tY2FyZC1jb21wb25lbnQ+XG4gICcsc3R5bGVzOlsiXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICB9XG4gICAgIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSx7Y2FyZElkOlt7dHlwZTp4eX1dLGdyb3VwTmFtZTpbe3R5cGU6eHl9XSxydW5Db2xvclNjYWxlOlt7dHlwZTp4eX1dLGZ1bGxXaWR0aENoYW5nZWQ6W3t0eXBlOk95fV0sZnVsbEhlaWdodENoYW5nZWQ6W3t0eXBlOk95fV0scGluU3RhdGVDaGFuZ2VkOlt7dHlwZTpPeX1dfSk7Y2xhc3MgeWd0e2NvbnN0cnVjdG9yKCl7dGhpcy5QbHVnaW5UeXBlPWhBLHRoaXMuZnVsbFdpZHRoQ2hhbmdlZD1uZXcgTGgsdGhpcy5mdWxsSGVpZ2h0Q2hhbmdlZD1uZXcgTGgsdGhpcy5waW5TdGF0ZUNoYW5nZWQ9bmV3IExofW9uRnVsbFdpZHRoQ2hhbmdlZCh0KXt0aGlzLmZ1bGxXaWR0aENoYW5nZWQuZW1pdCh0KX1vbkZ1bGxIZWlnaHRDaGFuZ2VkKHQpe3RoaXMuZnVsbEhlaWdodENoYW5nZWQuZW1pdCh0KX1vblBpblN0YXRlQ2hhbmdlZCgpe3RoaXMucGluU3RhdGVDaGFuZ2VkLmVtaXQoKX19eWd0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx5Z3QpfSx5Z3QuybVjbXA9dG8oe3R5cGU6eWd0LHNlbGVjdG9yczpbWyJjYXJkLXZpZXctY29tcG9uZW50Il1dLGlucHV0czp7aXNFdmVyVmlzaWJsZToiaXNFdmVyVmlzaWJsZSIsY2FyZElkOiJjYXJkSWQiLGdyb3VwTmFtZToiZ3JvdXBOYW1lIixwbHVnaW5UeXBlOiJwbHVnaW5UeXBlIixydW5Db2xvclNjYWxlOiJydW5Db2xvclNjYWxlIn0sb3V0cHV0czp7ZnVsbFdpZHRoQ2hhbmdlZDoiZnVsbFdpZHRoQ2hhbmdlZCIsZnVsbEhlaWdodENoYW5nZWQ6ImZ1bGxIZWlnaHRDaGFuZ2VkIixwaW5TdGF0ZUNoYW5nZWQ6InBpblN0YXRlQ2hhbmdlZCJ9LGRlY2xzOjEsdmFyczoxLGNvbnN0czpbWzMsIm5nU3dpdGNoIiw0LCJuZ0lmIl0sWzMsIm5nU3dpdGNoIl0sWzMsImNhcmRJZCIsImdyb3VwTmFtZSIsInJ1bkNvbG9yU2NhbGUiLCJmdWxsV2lkdGhDaGFuZ2VkIiwicGluU3RhdGVDaGFuZ2VkIiw0LCJuZ1N3aXRjaENhc2UiXSxbMywiY2FyZElkIiwiZ3JvdXBOYW1lIiwiZnVsbFdpZHRoQ2hhbmdlZCIsImZ1bGxIZWlnaHRDaGFuZ2VkIiwicGluU3RhdGVDaGFuZ2VkIiw0LCJuZ1N3aXRjaENhc2UiXSxbMywiY2FyZElkIiwiZ3JvdXBOYW1lIiwicnVuQ29sb3JTY2FsZSIsImZ1bGxXaWR0aENoYW5nZWQiLCJmdWxsSGVpZ2h0Q2hhbmdlZCIsInBpblN0YXRlQ2hhbmdlZCIsNCwibmdTd2l0Y2hDYXNlIl0sWzQsIm5nU3dpdGNoRGVmYXVsdCJdLFszLCJjYXJkSWQiLCJncm91cE5hbWUiLCJydW5Db2xvclNjYWxlIiwiZnVsbFdpZHRoQ2hhbmdlZCIsInBpblN0YXRlQ2hhbmdlZCJdLFszLCJjYXJkSWQiLCJncm91cE5hbWUiLCJmdWxsV2lkdGhDaGFuZ2VkIiwiZnVsbEhlaWdodENoYW5nZWQiLCJwaW5TdGF0ZUNoYW5nZWQiXSxbMywiY2FyZElkIiwiZ3JvdXBOYW1lIiwicnVuQ29sb3JTY2FsZSIsImZ1bGxXaWR0aENoYW5nZWQiLCJmdWxsSGVpZ2h0Q2hhbmdlZCIsInBpblN0YXRlQ2hhbmdlZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiZRcCgwLGJndCw1LDQsIm5nLWNvbnRhaW5lciIsMCksMiZlJiZEbSgibmdJZiIsbi5pc0V2ZXJWaXNpYmxlKX0sZGlyZWN0aXZlczpbZE0sZk0sZ00saE0sWDIsSWZ0LG1ndF0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh5Z3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiY2FyZC12aWV3LWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6ImNhcmRfdmlld19jb21wb25lbnQubmcuaHRtbCIsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7aXNFdmVyVmlzaWJsZTpbe3R5cGU6eHl9XSxjYXJkSWQ6W3t0eXBlOnh5fV0sZ3JvdXBOYW1lOlt7dHlwZTp4eX1dLHBsdWdpblR5cGU6W3t0eXBlOnh5fV0scnVuQ29sb3JTY2FsZTpbe3R5cGU6eHl9XSxmdWxsV2lkdGhDaGFuZ2VkOlt7dHlwZTpPeX1dLGZ1bGxIZWlnaHRDaGFuZ2VkOlt7dHlwZTpPeX1dLHBpblN0YXRlQ2hhbmdlZDpbe3R5cGU6T3l9XX0pO2NsYXNzIF9ndHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5pc0V2ZXJWaXNpYmxlPSExLHRoaXMuc2hvd0Z1bGxXaWR0aD0hMSx0aGlzLnNob3dGdWxsSGVpZ2h0PSExLHRoaXMucnVuQ29sb3JTY2FsZSQ9dGhpcy5zdG9yZS5zZWxlY3Qoek4pLnBpcGUoQmUoMzUwLHZvaWQgMCx7bGVhZGluZzohMCx0cmFpbGluZzohMH0pLEl0KCh0PT5lPT50Lmhhc093blByb3BlcnR5KGUpP3RbZV06IiNmZmYiKSkpfW9uVmlzaWJpbGl0eUNoYW5nZSh7dmlzaWJsZTp0fSl7dGhpcy5pc0V2ZXJWaXNpYmxlPXRoaXMuaXNFdmVyVmlzaWJsZXx8dH1vbkZ1bGxXaWR0aENoYW5nZWQodCl7dGhpcy5zaG93RnVsbFdpZHRoPXR9b25GdWxsSGVpZ2h0Q2hhbmdlZCh0KXt0aGlzLnNob3dGdWxsSGVpZ2h0PXR9b25QaW5TdGF0ZUNoYW5nZWQoKXt0aGlzLnN0b3JlLnNlbGVjdCh3VCx0aGlzLmNhcmRJZCkucGlwZShiZSgxKSxWZSh0aGlzLnN0b3JlLnNlbGVjdChTVCkpKS5zdWJzY3JpYmUoKChbdCxlXSk9Pnt0aGlzLnN0b3JlLmRpc3BhdGNoKG9SKHtjYXJkSWQ6dGhpcy5jYXJkSWQsY2FuQ3JlYXRlTmV3UGluczplLHdhc1Bpbm5lZDp0fSkpfSkpfX1mdW5jdGlvbiBDZ3QodCxlKXsxJnQmJkltKDApfWZ1bmN0aW9uIE1ndCh0LGUpe2lmKDEmdCYmVG0oMCwiY2FyZC12aWV3Iiw0KSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQsbj1ZbSgpO0RtKCJjYXJkSWQiLHQuY2FyZElkKSgiZ3JvdXBOYW1lIixuLmdyb3VwTmFtZSkoInBsdWdpblR5cGUiLHQucGx1Z2luKSgiY2FyZE9ic2VydmVyIixuLmNhcmRPYnNlcnZlcikoImNhcmRMYXp5TG9hZGVyIix0LmNhcmRJZCl9fWZ1bmN0aW9uIHZndCh0LGUpezEmdCYmSW0oMCl9ZnVuY3Rpb24geGd0KHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiYnV0dG9uIiwxMyksVm0oImNsaWNrIiwoZnVuY3Rpb24gZShuKXtoaSh0KTtjb25zdCBvPVltKDMpO3JldHVybiBvLmhhbmRsZVBhZ2VDaGFuZ2Uoby5wYWdlSW5kZXgtMSxuLnRhcmdldCl9KSksa3UoMSwiIFByZXZpb3VzICIpLEFtKCl9MiZ0JiZEbSgiZGlzYWJsZWQiLDA9PT1ZbSgzKS5wYWdlSW5kZXgpfWZ1bmN0aW9uIE9ndCh0LGUpezEmdCYmVG0oMCwibWF0LWljb24iLDE3KX1mdW5jdGlvbiBQZ3QodCxlKXsxJnQmJlRtKDAsIm1hdC1pY29uIiwxOCl9ZnVuY3Rpb24gd2d0KHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiYnV0dG9uIiwxNCksVm0oImNsaWNrIiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgzKS5ncm91cEV4cGFuc2lvblRvZ2dsZWQuZW1pdCgpfSkpLFFwKDEsT2d0LDEsMCwibWF0LWljb24iLDE1KSxRcCgyLFBndCwxLDAsIm5nLXRlbXBsYXRlIixudWxsLDE2LGliKSxBbSgpfWlmKDImdCl7Y29uc3QgdD0kcCgzKSxlPVltKDMpO3JjKDEpLERtKCJuZ0lmIixlLmlzR3JvdXBFeHBhbmRlZCkoIm5nSWZFbHNlIix0KX19ZnVuY3Rpb24ga2d0KHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwic3BhbiIsMjEpLFJtKDEsImlucHV0IiwyMiksVm0oImlucHV0IiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oNCkub25QYWdpbmF0aW9uSW5wdXRDaGFuZ2Uobil9KSkoImNoYW5nZSIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKDQpLm9uUGFnaW5hdGlvbklucHV0Q2hhbmdlKG4pfSkpLEFtKCksa3UoMiksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oNCk7cmMoMSksRG0oInZhbHVlIix0LnBhZ2VJbmRleCsxKSgibWF4Iix0Lm51bVBhZ2VzKSxyYygxKSxEdSgiIG9mICIsdC5udW1QYWdlcywiIil9fWZ1bmN0aW9uIFNndCh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsInNwYW4iKSxRcCgxLGtndCwzLDMsInNwYW4iLDE5KSxSbSgyLCJidXR0b24iLDIwKSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKG4pe2hpKHQpO2NvbnN0IG89WW0oMyk7cmV0dXJuIG8uaGFuZGxlUGFnZUNoYW5nZShvLnBhZ2VJbmRleCsxLG4udGFyZ2V0KX0pKSxrdSgzLCIgTmV4dCAiKSxBbSgpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKDIpLmlzQm90dG9tQ29udHJvbCxlPVltKCk7cmMoMSksRG0oIm5nSWYiLGUuc2hvd1BhZ2luYXRpb25JbnB1dCh0KSkscmMoMSksRG0oImRpc2FibGVkIixlLnBhZ2VJbmRleCsxPj1lLm51bVBhZ2VzKX19ZnVuY3Rpb24gRGd0KHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2Iiw2KSxSbSgxLCJzcGFuIiw3KSxRcCgyLHhndCwyLDEsImJ1dHRvbiIsOCksQW0oKSxSbSgzLCJzcGFuIiw5KSxRcCg0LHdndCw0LDIsImJ1dHRvbiIsMTApLEFtKCksUm0oNSwic3BhbiIsMTEpLFFwKDYsU2d0LDQsMiwic3BhbiIsMTIpLEFtKCksQW0oKSksMiZ0KXtjb25zdCB0PVltKCkuaXNCb3R0b21Db250cm9sLGU9WW0oKTtyYygyKSxEbSgibmdJZiIsZS5zaG93UGFnaW5hdGlvbkNvbnRyb2xzKSxyYygyKSxEbSgibmdJZiIsZS5zaG93RXhwYW5kKHQpKSxyYygyKSxEbSgibmdJZiIsZS5zaG93UGFnaW5hdGlvbkNvbnRyb2xzKX19ZnVuY3Rpb24gRWd0KHQsZSl7aWYoMSZ0JiZRcCgwLERndCw3LDMsImRpdiIsNSksMiZ0KXtjb25zdCB0PWUuaXNCb3R0b21Db250cm9sLG49WW0oKTtEbSgibmdJZiIsbi5zaG93UGFnaW5hdGlvbkNvbnRyb2xzfHxuLnNob3dFeHBhbmQodCkpfX1fZ3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fF9ndCkoU20oSXcpKX0sX2d0Lsm1Y21wPXRvKHt0eXBlOl9ndCxzZWxlY3RvcnM6W1siY2FyZC12aWV3Il1dLGhvc3RWYXJzOjQsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJnB1KCJmdWxsLXdpZHRoIixuLnNob3dGdWxsV2lkdGgpKCJmdWxsLWhlaWdodCIsbi5zaG93RnVsbEhlaWdodCl9LGlucHV0czp7Y2FyZElkOiJjYXJkSWQiLGdyb3VwTmFtZToiZ3JvdXBOYW1lIixwbHVnaW5UeXBlOiJwbHVnaW5UeXBlIn0sZGVjbHM6Mix2YXJzOjcsY29uc3RzOltbIm9ic2VydmVJbnRlcnNlY3Rpb24iLCIiLCJpbnRlcnNlY3Rpb25PYnNlcnZlck1hcmdpbiIsIjIwMHB4IDIwMHB4IDIwMHB4IDIwMHB4IiwzLCJpc0V2ZXJWaXNpYmxlIiwiY2FyZElkIiwiZ3JvdXBOYW1lIiwicGx1Z2luVHlwZSIsInJ1bkNvbG9yU2NhbGUiLCJmdWxsV2lkdGhDaGFuZ2VkIiwiZnVsbEhlaWdodENoYW5nZWQiLCJwaW5TdGF0ZUNoYW5nZWQiLCJvblZpc2liaWxpdHlDaGFuZ2UiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImNhcmQtdmlldy1jb21wb25lbnQiLDApLFZtKCJmdWxsV2lkdGhDaGFuZ2VkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vbkZ1bGxXaWR0aENoYW5nZWQoZSl9KSkoImZ1bGxIZWlnaHRDaGFuZ2VkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vbkZ1bGxIZWlnaHRDaGFuZ2VkKGUpfSkpKCJwaW5TdGF0ZUNoYW5nZWQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25QaW5TdGF0ZUNoYW5nZWQoKX0pKSgib25WaXNpYmlsaXR5Q2hhbmdlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblZpc2liaWxpdHlDaGFuZ2UoZSl9KSksQWgoMSwiYXN5bmMiKSxBbSgpKSwyJmUmJkRtKCJpc0V2ZXJWaXNpYmxlIixuLmlzRXZlclZpc2libGUpKCJjYXJkSWQiLG4uY2FyZElkKSgiZ3JvdXBOYW1lIixuLmdyb3VwTmFtZSkoInBsdWdpblR5cGUiLG4ucGx1Z2luVHlwZSkoInJ1bkNvbG9yU2NhbGUiLFRoKDEsNSxuLnJ1bkNvbG9yU2NhbGUkKSl9LGRpcmVjdGl2ZXM6W3lndCxOZnRdLHBpcGVzOlt3TV0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9W19uZ2hvc3QtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzMwMzAzMH0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoX2d0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImNhcmQtdmlldyIsdGVtcGxhdGU6J1xuICAgIDxjYXJkLXZpZXctY29tcG9uZW50XG4gICAgICBbaXNFdmVyVmlzaWJsZV09ImlzRXZlclZpc2libGUiXG4gICAgICBbY2FyZElkXT0iY2FyZElkIlxuICAgICAgW2dyb3VwTmFtZV09Imdyb3VwTmFtZSJcbiAgICAgIFtwbHVnaW5UeXBlXT0icGx1Z2luVHlwZSJcbiAgICAgIFtydW5Db2xvclNjYWxlXT0icnVuQ29sb3JTY2FsZSQgfCBhc3luYyJcbiAgICAgIChmdWxsV2lkdGhDaGFuZ2VkKT0ib25GdWxsV2lkdGhDaGFuZ2VkKCRldmVudCkiXG4gICAgICAoZnVsbEhlaWdodENoYW5nZWQpPSJvbkZ1bGxIZWlnaHRDaGFuZ2VkKCRldmVudCkiXG4gICAgICAocGluU3RhdGVDaGFuZ2VkKT0ib25QaW5TdGF0ZUNoYW5nZWQoKSJcbiAgICAgIG9ic2VydmVJbnRlcnNlY3Rpb25cbiAgICAgIGludGVyc2VjdGlvbk9ic2VydmVyTWFyZ2luPSIyMDBweCAyMDBweCAyMDBweCAyMDBweCJcbiAgICAgIChvblZpc2liaWxpdHlDaGFuZ2UpPSJvblZpc2liaWxpdHlDaGFuZ2UoJGV2ZW50KSJcbiAgICA+XG4gICAgPC9jYXJkLXZpZXctY29tcG9uZW50PlxuICAnLHN0eWxlVXJsczpbImNhcmRfdmlld19jb250YWluZXIuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSx7Y2FyZElkOlt7dHlwZTp4eX1dLGdyb3VwTmFtZTpbe3R5cGU6eHl9XSxwbHVnaW5UeXBlOlt7dHlwZTp4eX1dLHNob3dGdWxsV2lkdGg6W3t0eXBlOlB5LGFyZ3M6WyJjbGFzcy5mdWxsLXdpZHRoIl19XSxzaG93RnVsbEhlaWdodDpbe3R5cGU6UHksYXJnczpbImNsYXNzLmZ1bGwtaGVpZ2h0Il19XX0pO2NvbnN0IFJndD1mdW5jdGlvbigpe3JldHVybntpc0JvdHRvbUNvbnRyb2w6ITF9fSxBZ3Q9ZnVuY3Rpb24oKXtyZXR1cm57aXNCb3R0b21Db250cm9sOiEwfX07Y2xhc3MgVGd0e2NvbnN0cnVjdG9yKHQpe3RoaXMuY2RrU2Nyb2xsYWJsZT10LHRoaXMuUGx1Z2luVHlwZT1oQSx0aGlzLnBhZ2VJbmRleENoYW5nZWQ9bmV3IExoLHRoaXMuZ3JvdXBFeHBhbnNpb25Ub2dnbGVkPW5ldyBMaH1zaG93RXhwYW5kKHQpe3JldHVybiEhdCYmdGhpcy5pc0dyb3VwRXhwYW5kYWJsZX1zaG93UGFnaW5hdGlvbklucHV0KHQpe3JldHVybiB0fWhhbmRsZVBhZ2VDaGFuZ2UodCxlKXtjb25zdCBuPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO3NldFRpbWVvdXQoKCgpPT57dGhpcy5zY3JvbGxUb0tlZXBUYXJnZXRQb3NpdGlvbihlLG4pfSksMCksdGhpcy5wYWdlSW5kZXhDaGFuZ2VkLmVtaXQodCl9c2Nyb2xsVG9LZWVwVGFyZ2V0UG9zaXRpb24odCxlKXt2YXIgbjtjb25zdCBvPW51bGw9PT0obj10aGlzLmNka1Njcm9sbGFibGUpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmdldEVsZW1lbnRSZWYoKS5uYXRpdmVFbGVtZW50O28mJm8uc2Nyb2xsVG8oMCx0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcC1lK28uc2Nyb2xsVG9wKX10cmFja0J5Q2FyZHModCxlKXtyZXR1cm4gZS5jYXJkSWR9b25QYWdpbmF0aW9uSW5wdXRDaGFuZ2UodCl7Y29uc3QgZT10LnRhcmdldDtpZigiaW5wdXQiPT09dC50eXBlJiYiIj09PWUudmFsdWUpcmV0dXJuO2NvbnN0IG49TnVtYmVyKGUudmFsdWUpLTEsbz1NYXRoLm1pbihNYXRoLm1heCgwLG4pLHRoaXMubnVtUGFnZXMtMSk7ZS52YWx1ZSE9PVN0cmluZyhvKzEpJiYoZS52YWx1ZT1TdHJpbmcobysxKSksdGhpcy5oYW5kbGVQYWdlQ2hhbmdlKG8sZSl9fVRndC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VGd0KShTbShtRiw4KSl9LFRndC7JtWNtcD10byh7dHlwZTpUZ3Qsc2VsZWN0b3JzOltbIm1ldHJpY3MtY2FyZC1ncmlkLWNvbXBvbmVudCJdXSxpbnB1dHM6e2lzR3JvdXBFeHBhbmRhYmxlOiJpc0dyb3VwRXhwYW5kYWJsZSIsaXNHcm91cEV4cGFuZGVkOiJpc0dyb3VwRXhwYW5kZWQiLGdyb3VwTmFtZToiZ3JvdXBOYW1lIixwYWdlSW5kZXg6InBhZ2VJbmRleCIsbnVtUGFnZXM6Im51bVBhZ2VzIixjYXJkSWRzV2l0aE1ldGFkYXRhOiJjYXJkSWRzV2l0aE1ldGFkYXRhIixjYXJkT2JzZXJ2ZXI6ImNhcmRPYnNlcnZlciIsc2hvd1BhZ2luYXRpb25Db250cm9sczoic2hvd1BhZ2luYXRpb25Db250cm9scyJ9LG91dHB1dHM6e3BhZ2VJbmRleENoYW5nZWQ6InBhZ2VJbmRleENoYW5nZWQiLGdyb3VwRXhwYW5zaW9uVG9nZ2xlZDoiZ3JvdXBFeHBhbnNpb25Ub2dnbGVkIn0sZGVjbHM6Nix2YXJzOjgsY29uc3RzOmZ1bmN0aW9uKCl7bGV0IHQsZSxuO3JldHVybiB0PSJ1bmRlZmluZWQiIT10eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUmJm5nSTE4bkNsb3N1cmVNb2RlP2dvb2cuZ2V0TXNnKCJQcmV2aW91cyBwYWdlIik6JGxvY2FsaXplYDpBIGJ1dHRvbiB0aGF0IHNldHMgYSBncm91cCB0byB0aGUgcHJldmlvdXMgcGFnZS7ikJ81NzVlNzgyZmQyN2YyZWU3MGEwMzRhNzc1ZWZlOWFkMTYyNDcyMjUw4pCfMzYyOTk2MDU0NDg3NTM2MDA0NjpQcmV2aW91cyBwYWdlYCxlPSJ1bmRlZmluZWQiIT10eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUmJm5nSTE4bkNsb3N1cmVNb2RlP2dvb2cuZ2V0TXNnKCJFeHBhbmQgZ3JvdXAiKTokbG9jYWxpemVgOkEgYnV0dG9uIHRoYXQgYWxsb3dzIHVzZXIgdG8gZXhwYW5kIGEgdGFnIGdyb3VwLuKQn2ZmYWExMTQ3MWI4NzhhNmRmZmUyZTY4YzZmMzcwNjRhOWUwNzQ4NTPikJ81Mzg2MDU0MzI1Mjc0Nzc5MjU4OkV4cGFuZCBncm91cGAsbj0idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZT9nb29nLmdldE1zZygiTmV4dCBwYWdlIik6JGxvY2FsaXplYDpBIGJ1dHRvbiB0aGF0IHNldHMgYSBncm91cCB0byB0aGUgbmV4dCBwYWdlLuKQn2NlM2NlZmIxY2QwMDk5YWE1MDAzZGRhMTZlYzllYjIxZmQ4YmE3ODnikJ8zMzM3MzAxNjk0MjEwMjg3NTk1Ok5leHQgcGFnZWAsW1s0LCJuZ1RlbXBsYXRlT3V0bGV0IiwibmdUZW1wbGF0ZU91dGxldENvbnRleHQiXSxbMSwiY2FyZC1ncmlkIl0sWzMsImNhcmRJZCIsImdyb3VwTmFtZSIsInBsdWdpblR5cGUiLCJjYXJkT2JzZXJ2ZXIiLCJjYXJkTGF6eUxvYWRlciIsNCwibmdGb3IiLCJuZ0Zvck9mIiwibmdGb3JUcmFja0J5Il0sWyJncm91cENvbnRyb2xzIiwiIl0sWzMsImNhcmRJZCIsImdyb3VwTmFtZSIsInBsdWdpblR5cGUiLCJjYXJkT2JzZXJ2ZXIiLCJjYXJkTGF6eUxvYWRlciJdLFsiY2xhc3MiLCJncm91cC1jb250cm9scyIsNCwibmdJZiJdLFsxLCJncm91cC1jb250cm9scyJdLFsxLCJwcmV2LWNvbnRhaW5lciJdLFsiY2xhc3MiLCJwcmV2IHBhZ2luYXRpb24tYnV0dG9uIiwibWF0LWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLHQsMywiZGlzYWJsZWQiLCJjbGljayIsNCwibmdJZiJdLFsxLCJleHBhbmQtY29udGFpbmVyIl0sWyJjbGFzcyIsImV4cGFuZC1ncm91cC1idXR0b24iLCJtYXQtaWNvbi1idXR0b24iLCIiLCJhcmlhLWxhYmVsIixlLDMsImNsaWNrIiw0LCJuZ0lmIl0sWzEsImlucHV0LWFuZC1uZXh0LWNvbnRhaW5lciJdLFs0LCJuZ0lmIl0sWyJtYXQtYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsdCwxLCJwcmV2IiwicGFnaW5hdGlvbi1idXR0b24iLDMsImRpc2FibGVkIiwiY2xpY2siXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLGUsMSwiZXhwYW5kLWdyb3VwLWJ1dHRvbiIsMywiY2xpY2siXSxbInN2Z0ljb24iLCJleHBhbmRfbGVzc18yNHB4Iiw0LCJuZ0lmIiwibmdJZkVsc2UiXSxbImV4cGFuZE1vcmUiLCIiXSxbInN2Z0ljb24iLCJleHBhbmRfbGVzc18yNHB4Il0sWyJzdmdJY29uIiwiZXhwYW5kX21vcmVfMjRweCJdLFsiY2xhc3MiLCJwYWdpbmF0aW9uLWlucHV0Iiw0LCJuZ0lmIl0sWyJtYXQtYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsbiwxLCJuZXh0IiwicGFnaW5hdGlvbi1idXR0b24iLDMsImRpc2FibGVkIiwiY2xpY2siXSxbMSwicGFnaW5hdGlvbi1pbnB1dCJdLFsidHlwZSIsIm51bWJlciIsIm1pbiIsIjEiLDMsInZhbHVlIiwibWF4IiwiaW5wdXQiLCJjaGFuZ2UiXV19LHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihRcCgwLENndCwxLDAsIm5nLWNvbnRhaW5lciIsMCksUm0oMSwiZGl2IiwxKSxRcCgyLE1ndCwxLDUsImNhcmQtdmlldyIsMiksQW0oKSxRcCgzLHZndCwxLDAsIm5nLWNvbnRhaW5lciIsMCksUXAoNCxFZ3QsMSwxLCJuZy10ZW1wbGF0ZSIsbnVsbCwzLGliKSksMiZlKXtjb25zdCB0PSRwKDUpO0RtKCJuZ1RlbXBsYXRlT3V0bGV0Iix0KSgibmdUZW1wbGF0ZU91dGxldENvbnRleHQiLENoKDYsUmd0KSkscmMoMiksRG0oIm5nRm9yT2YiLG4uY2FyZElkc1dpdGhNZXRhZGF0YSkoIm5nRm9yVHJhY2tCeSIsbi50cmFja0J5Q2FyZHMpLHJjKDEpLERtKCJuZ1RlbXBsYXRlT3V0bGV0Iix0KSgibmdUZW1wbGF0ZU91dGxldENvbnRleHQiLENoKDcsQWd0KSl9fSxkaXJlY3RpdmVzOltNTSxsTSxfZ3QsbTIsZE0sWEgsRFddLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV17Y29udGFpbjpjb250ZW50fS5jYXJkLWdyaWRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KDMzNXB4LCBhdXRvKSk7Z2FwOjE2cHg7cGFkZGluZzoxNnB4fWNhcmQtdmlld1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjFweCBzb2xpZCAjZWJlYmViO2JvcmRlci1yYWRpdXM6NHB4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtjb250YWluOnN0cmljdDtoZWlnaHQ6MTAwJTttaW4taGVpZ2h0OjMyMHB4fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIGNhcmQtdmlld1tfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIGNhcmQtdmlld1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjFweCBzb2xpZCAjNTU1fWNhcmQtdmlldy5mdWxsLXdpZHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtjb250YWluOmxheW91dCBwYWludDtncmlkLWNvbHVtbi1zdGFydDoxO2dyaWQtY29sdW1uLWVuZDotMX1jYXJkLXZpZXcuZnVsbC1oZWlnaHRbX25nY29udGVudC0lQ09NUCVde21pbi1oZWlnaHQ6NDgwcHh9Lmdyb3VwLWNvbnRyb2xzW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxO2Rpc3BsYXk6Z3JpZDthbGlnbi1pdGVtczpjZW50ZXI7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnIgMWZyO2dhcDoxNnB4O3BhZGRpbmc6MCAxNnB4fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cC1jb250cm9sc1tfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cC1jb250cm9sc1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9Lmdyb3VwLWNvbnRyb2xzW19uZ2NvbnRlbnQtJUNPTVAlXTpmaXJzdC1vZi10eXBle3BhZGRpbmctdG9wOjE2cHh9Lmdyb3VwLWNvbnRyb2xzW19uZ2NvbnRlbnQtJUNPTVAlXTpsYXN0LW9mLXR5cGV7cGFkZGluZy1ib3R0b206MTZweH0ucHJldi1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2p1c3RpZnktc2VsZjpmbGV4LXN0YXJ0fS5leHBhbmQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtqdXN0aWZ5LXNlbGY6Y2VudGVyfS5pbnB1dC1hbmQtbmV4dC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2p1c3RpZnktc2VsZjpmbGV4LWVuZH0ucGFnaW5hdGlvbi1pbnB1dFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXJpZ2h0OjE2cHh9LnBhZ2luYXRpb24taW5wdXRbX25nY29udGVudC0lQ09NUCVdICAgaW5wdXRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOjFweCBzb2xpZCBjdXJyZW50Q29sb3I7Y29sb3I6aW5oZXJpdDtmb250OmluaGVyaXR9LmV4cGFuZC1ncm91cC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAucGFnaW5hdGlvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjE7YmFja2dyb3VuZC1jb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5leHBhbmQtZ3JvdXAtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmV4cGFuZC1ncm91cC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5wYWdpbmF0aW9uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5wYWdpbmF0aW9uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9LmV4cGFuZC1ncm91cC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOmRpc2FibGVkLCAucGFnaW5hdGlvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdOmRpc2FibGVke2NvbG9yOiM3NTc1NzV9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmV4cGFuZC1ncm91cC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOmRpc2FibGVkLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuZXhwYW5kLWdyb3VwLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06ZGlzYWJsZWR7Y29sb3I6IzYxNjE2MX1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAucGFnaW5hdGlvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdOmRpc2FibGVkLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAucGFnaW5hdGlvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdOmRpc2FibGVke2NvbG9yOiM2MTYxNjF9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFRndCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtZXRyaWNzLWNhcmQtZ3JpZC1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiIuL2NhcmRfZ3JpZF9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9jYXJkX2dyaWRfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTptRixkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfV19KSx7aXNHcm91cEV4cGFuZGFibGU6W3t0eXBlOnh5fV0saXNHcm91cEV4cGFuZGVkOlt7dHlwZTp4eX1dLGdyb3VwTmFtZTpbe3R5cGU6eHl9XSxwYWdlSW5kZXg6W3t0eXBlOnh5fV0sbnVtUGFnZXM6W3t0eXBlOnh5fV0sY2FyZElkc1dpdGhNZXRhZGF0YTpbe3R5cGU6eHl9XSxjYXJkT2JzZXJ2ZXI6W3t0eXBlOnh5fV0sc2hvd1BhZ2luYXRpb25Db250cm9sczpbe3R5cGU6eHl9XSxwYWdlSW5kZXhDaGFuZ2VkOlt7dHlwZTpPeX1dLGdyb3VwRXhwYW5zaW9uVG9nZ2xlZDpbe3R5cGU6T3l9XX0pO2NsYXNzIE5ndHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5ncm91cE5hbWU9bnVsbCx0aGlzLmdyb3VwTmFtZSQ9bmV3IEYobnVsbCksdGhpcy5wYWdlSW5kZXgkPW5ldyBGKDApLHRoaXMuaXRlbXMkPW5ldyBGKFtdKSx0aGlzLm5nVW5zdWJzY3JpYmU9bmV3IEksdGhpcy5udW1QYWdlcyQ9V3QoW3RoaXMuaXRlbXMkLHRoaXMuc3RvcmUuc2VsZWN0KFJOKV0pLnBpcGUoSXQoKChbdCxlXSk9Pk1hdGguY2VpbCh0Lmxlbmd0aC9lKSkpKSx0aGlzLmlzR3JvdXBFeHBhbmRlZCQ9dGhpcy5ncm91cE5hbWUkLnBpcGUoemUoKHQ9Pm51bGwhPT10P3RoaXMuc3RvcmUuc2VsZWN0KFZULHQpOkV0KCEwKSkpKSx0aGlzLnNob3dQYWdpbmF0aW9uQ29udHJvbHMkPVd0KFt0aGlzLm51bVBhZ2VzJCx0aGlzLnN0b3JlLnNlbGVjdChSTiksdGhpcy5pc0dyb3VwRXhwYW5kZWQkXSkucGlwZShJdCgoKFt0LGUsbl0pPT4hKHQ8PTEpJiYoZTw9M3x8bikpKSksdGhpcy5pc0dyb3VwRXhwYW5kYWJsZSQ9V3QoW3RoaXMuaXRlbXMkLHRoaXMuc3RvcmUuc2VsZWN0KFJOKV0pLnBpcGUoSXQoKChbdCxlXSk9PiEobnVsbD09PXRoaXMuZ3JvdXBOYW1lfHxlPD0zfHx0Lmxlbmd0aDw9MykpKSksdGhpcy5ub3JtYWxpemVkUGFnZUluZGV4JD1XdChbdGhpcy5wYWdlSW5kZXgkLHRoaXMubnVtUGFnZXMkXSkucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpLEZlKCgoW3QsZV0pPT57MCE9PWUmJih0Pj1lP3RoaXMucGFnZUluZGV4JC5uZXh0KGUtMSk6dDwwJiZ0aGlzLnBhZ2VJbmRleCQubmV4dCgwKSl9KSksSXQoKChbdCxlXSk9Pk1hdGgubWluKE1hdGgubWF4KHQsMCksZS0xKSkpLEFlKDEpKSx0aGlzLnBhZ2VkSXRlbXMkPVd0KFt0aGlzLml0ZW1zJCx0aGlzLnN0b3JlLnNlbGVjdChSTiksdGhpcy5ub3JtYWxpemVkUGFnZUluZGV4JCx0aGlzLmlzR3JvdXBFeHBhbmRlZCRdKS5waXBlKEl0KCgoW3QsZSxuLG9dKT0+e2NvbnN0IGk9ZSpuLGE9ZSpuK01hdGgubWluKG8/ZTozLGUpO3JldHVybiB0LnNsaWNlKGksYSl9KSkpfW5nT25DaGFuZ2VzKHQpe3QuY2FyZElkc1dpdGhNZXRhZGF0YSYmdGhpcy5pdGVtcyQubmV4dCh0aGlzLmNhcmRJZHNXaXRoTWV0YWRhdGEpLHQuZ3JvdXBOYW1lJiZ0aGlzLmdyb3VwTmFtZSQubmV4dCh0aGlzLmdyb3VwTmFtZSl9bmdPbkRlc3Ryb3koKXt0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpLHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpfW9uUGFnZUluZGV4Q2hhbmdlZCh0KXt0aGlzLnBhZ2VJbmRleCQubmV4dCh0KX1vbkdyb3VwRXhwYW5zaW9uVG9nZ2xlZCgpe2lmKG51bGw9PT10aGlzLmdyb3VwTmFtZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YXJpYW50IGVycm9yOiBleHBhbnNpb24gY2Fubm90IGJlIHRvZ2dsZWQgd2hlbiBncm91cE5hbWUgaXMgbnVsbCIpO3RoaXMuc3RvcmUuZGlzcGF0Y2goblIoe3RhZ0dyb3VwOnRoaXMuZ3JvdXBOYW1lfSkpfX1mdW5jdGlvbiB6Z3QodCxlKXtpZigxJnQmJihSbSgwLCJzcGFuIiw4KSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtyYygxKSxEdSgiIix0LmNhcmRJZHNXaXRoTWV0YWRhdGEubGVuZ3RoLCIgY2FyZHMiKX19ZnVuY3Rpb24gSWd0KHQsZSl7MSZ0JiYoUm0oMCwic3BhbiIsOSksa3UoMSwiTmV3IGNhcmQgcGlubmVkIiksQW0oKSksMiZ0JiZqcCgiZGF0YS1pZCIsZS4kaW1wbGljaXQpfWZ1bmN0aW9uIEhndCh0LGUpe2lmKDEmdCYmVG0oMCwibWV0cmljcy1jYXJkLWdyaWQiLDEwKSwyJnQpe2NvbnN0IHQ9WW0oKTtEbSgiY2FyZElkc1dpdGhNZXRhZGF0YSIsdC5jYXJkSWRzV2l0aE1ldGFkYXRhKSgiY2FyZE9ic2VydmVyIix0LmNhcmRPYnNlcnZlcil9fWZ1bmN0aW9uIEZndCh0LGUpezEmdCYmKFJtKDAsImRpdiIsMTEpLGt1KDEsIlBpbiBjYXJkcyBmb3IgYSBxdWljayB2aWV3IGFuZCBjb21wYXJpc29uIiksQW0oKSl9Tmd0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxOZ3QpKFNtKEl3KSl9LE5ndC7JtWNtcD10byh7dHlwZTpOZ3Qsc2VsZWN0b3JzOltbIm1ldHJpY3MtY2FyZC1ncmlkIl1dLGlucHV0czp7Z3JvdXBOYW1lOiJncm91cE5hbWUiLGNhcmRJZHNXaXRoTWV0YWRhdGE6ImNhcmRJZHNXaXRoTWV0YWRhdGEiLGNhcmRPYnNlcnZlcjoiY2FyZE9ic2VydmVyIn0sZmVhdHVyZXM6W0JvXSxkZWNsczo3LHZhcnM6MjAsY29uc3RzOltbMywiaXNHcm91cEV4cGFuZGFibGUiLCJpc0dyb3VwRXhwYW5kZWQiLCJncm91cE5hbWUiLCJwYWdlSW5kZXgiLCJudW1QYWdlcyIsInNob3dQYWdpbmF0aW9uQ29udHJvbHMiLCJjYXJkSWRzV2l0aE1ldGFkYXRhIiwiY2FyZE9ic2VydmVyIiwicGFnZUluZGV4Q2hhbmdlZCIsImdyb3VwRXhwYW5zaW9uVG9nZ2xlZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwibWV0cmljcy1jYXJkLWdyaWQtY29tcG9uZW50IiwwKSxWbSgicGFnZUluZGV4Q2hhbmdlZCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25QYWdlSW5kZXhDaGFuZ2VkKGUpfSkpKCJncm91cEV4cGFuc2lvblRvZ2dsZWQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25Hcm91cEV4cGFuc2lvblRvZ2dsZWQoKX0pKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQWgoMywiYXN5bmMiKSxBaCg0LCJhc3luYyIpLEFoKDUsImFzeW5jIiksQWgoNiwiYXN5bmMiKSxBbSgpKSwyJmUmJkRtKCJpc0dyb3VwRXhwYW5kYWJsZSIsVGgoMSw4LG4uaXNHcm91cEV4cGFuZGFibGUkKSkoImlzR3JvdXBFeHBhbmRlZCIsVGgoMiwxMCxuLmlzR3JvdXBFeHBhbmRlZCQpKSgiZ3JvdXBOYW1lIixuLmdyb3VwTmFtZSkoInBhZ2VJbmRleCIsVGgoMywxMixuLm5vcm1hbGl6ZWRQYWdlSW5kZXgkKSkoIm51bVBhZ2VzIixUaCg0LDE0LG4ubnVtUGFnZXMkKSkoInNob3dQYWdpbmF0aW9uQ29udHJvbHMiLFRoKDUsMTYsbi5zaG93UGFnaW5hdGlvbkNvbnRyb2xzJCkpKCJjYXJkSWRzV2l0aE1ldGFkYXRhIixUaCg2LDE4LG4ucGFnZWRJdGVtcyQpKSgiY2FyZE9ic2VydmVyIixuLmNhcmRPYnNlcnZlcil9LGRpcmVjdGl2ZXM6W1RndF0scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKE5ndCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtZXRyaWNzLWNhcmQtZ3JpZCIsdGVtcGxhdGU6J1xuICAgIDxtZXRyaWNzLWNhcmQtZ3JpZC1jb21wb25lbnRcbiAgICAgIFtpc0dyb3VwRXhwYW5kYWJsZV09ImlzR3JvdXBFeHBhbmRhYmxlJCB8IGFzeW5jIlxuICAgICAgW2lzR3JvdXBFeHBhbmRlZF09ImlzR3JvdXBFeHBhbmRlZCQgfCBhc3luYyJcbiAgICAgIFtncm91cE5hbWVdPSJncm91cE5hbWUiXG4gICAgICBbcGFnZUluZGV4XT0ibm9ybWFsaXplZFBhZ2VJbmRleCQgfCBhc3luYyJcbiAgICAgIFtudW1QYWdlc109Im51bVBhZ2VzJCB8IGFzeW5jIlxuICAgICAgW3Nob3dQYWdpbmF0aW9uQ29udHJvbHNdPSJzaG93UGFnaW5hdGlvbkNvbnRyb2xzJCB8IGFzeW5jIlxuICAgICAgW2NhcmRJZHNXaXRoTWV0YWRhdGFdPSJwYWdlZEl0ZW1zJCB8IGFzeW5jIlxuICAgICAgW2NhcmRPYnNlcnZlcl09ImNhcmRPYnNlcnZlciJcbiAgICAgIChwYWdlSW5kZXhDaGFuZ2VkKT0ib25QYWdlSW5kZXhDaGFuZ2VkKCRldmVudCkiXG4gICAgICAoZ3JvdXBFeHBhbnNpb25Ub2dnbGVkKT0ib25Hcm91cEV4cGFuc2lvblRvZ2dsZWQoKSJcbiAgICA+XG4gICAgPC9tZXRyaWNzLWNhcmQtZ3JpZC1jb21wb25lbnQ+XG4gICcsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSx7Z3JvdXBOYW1lOlt7dHlwZTp4eX1dLGNhcmRJZHNXaXRoTWV0YWRhdGE6W3t0eXBlOnh5fV0sY2FyZE9ic2VydmVyOlt7dHlwZTp4eX1dfSk7Y2xhc3MgTGd0e31MZ3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fExndCl9LExndC7JtWNtcD10byh7dHlwZTpMZ3Qsc2VsZWN0b3JzOltbIm1ldHJpY3MtcGlubmVkLXZpZXctY29tcG9uZW50Il1dLGlucHV0czp7Y2FyZE9ic2VydmVyOiJjYXJkT2JzZXJ2ZXIiLGNhcmRJZHNXaXRoTWV0YWRhdGE6ImNhcmRJZHNXaXRoTWV0YWRhdGEiLG5ld0NhcmRQaW5uZWRJZHM6Im5ld0NhcmRQaW5uZWRJZHMifSxkZWNsczoxMCx2YXJzOjQsY29uc3RzOltbMSwiZ3JvdXAtdG9vbGJhciJdLFsic3ZnSWNvbiIsImtlZXBfMjRweCJdLFsxLCJncm91cC10ZXh0Il0sWyJhcmlhLXJvbGUiLCJoZWFkaW5nIiwiYXJpYS1sZXZlbCIsIjMiLDEsImdyb3VwLXRpdGxlIl0sWyJjbGFzcyIsImdyb3VwLWNhcmQtY291bnQiLDQsIm5nSWYiXSxbImNsYXNzIiwibmV3LWNhcmQtcGlubmVkIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbMywiY2FyZElkc1dpdGhNZXRhZGF0YSIsImNhcmRPYnNlcnZlciIsNCwibmdJZiIsIm5nSWZFbHNlIl0sWyJlbXB0eVBpbm5lZFZpZXciLCIiXSxbMSwiZ3JvdXAtY2FyZC1jb3VudCJdLFsxLCJuZXctY2FyZC1waW5uZWQiXSxbMywiY2FyZElkc1dpdGhNZXRhZGF0YSIsImNhcmRPYnNlcnZlciJdLFsxLCJlbXB0eS1tZXNzYWdlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihSbSgwLCJkaXYiLDApLFRtKDEsIm1hdC1pY29uIiwxKSxSbSgyLCJzcGFuIiwyKSxSbSgzLCJzcGFuIiwzKSxrdSg0LCJQaW5uZWQiKSxBbSgpLFFwKDUsemd0LDIsMSwic3BhbiIsNCksUXAoNixJZ3QsMiwxLCJzcGFuIiw1KSxBbSgpLEFtKCksUXAoNyxIZ3QsMSwyLCJtZXRyaWNzLWNhcmQtZ3JpZCIsNiksUXAoOCxGZ3QsMiwwLCJuZy10ZW1wbGF0ZSIsbnVsbCw3LGliKSksMiZlKXtjb25zdCB0PSRwKDkpO3JjKDUpLERtKCJuZ0lmIixuLmNhcmRJZHNXaXRoTWV0YWRhdGEubGVuZ3RoPjEpLHJjKDEpLERtKCJuZ0Zvck9mIixuLm5ld0NhcmRQaW5uZWRJZHMpLHJjKDEpLERtKCJuZ0lmIixuLmNhcmRJZHNXaXRoTWV0YWRhdGEubGVuZ3RoKSgibmdJZkVsc2UiLHQpfX0sZGlyZWN0aXZlczpbRFcsZE0sbE0sTmd0XSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVdICAgLmdyb3VwLXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmViO2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7ZGlzcGxheTpmbGV4O2ZsZXg6bm9uZTtoZWlnaHQ6NDJweDttYXJnaW4tYm90dG9tOi0xcHg7cGFkZGluZzowIDE2cHg7cG9zaXRpb246c3RpY2t5O3RvcDowO3otaW5kZXg6MTtib3gtc2hhZG93OjBweCAycHggNHB4IDBweCByZ2JhKDAsMCwwLC4xNSl9Ym9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmdyb3VwLXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzMwMzAzMH1ib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXAtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzU1NX1ib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXAtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAwcHggcmdiYSgyNTUsMjU1LDI1NSwuMTUpfW1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxO2ZsZXg6bm9uZTttYXJnaW4tcmlnaHQ6NXB4fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIG1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgbWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfS5ncm91cC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6YmFzZWxpbmU7Z2FwOjZweH0uZ3JvdXAtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0uZ3JvdXAtY2FyZC1jb3VudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM2MTYxNjF9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmdyb3VwLWNhcmQtY291bnRbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXAtY2FyZC1jb3VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9LmVtcHR5LW1lc3NhZ2VbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjE7Zm9udC1zaXplOjEzcHg7Zm9udC1zdHlsZTppdGFsaWM7cGFkZGluZzoxNnB4O3RleHQtYWxpZ246Y2VudGVyfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5lbXB0eS1tZXNzYWdlW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmVtcHR5LW1lc3NhZ2VbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfS5uZXctY2FyZC1waW5uZWRbX25nY29udGVudC0lQ09NUCVde2FuaW1hdGlvbjpwaW5uZWQtdmlldy1mYWRlLW91dCAzcyBsaW5lYXI7YmFja2dyb3VuZDojZjQ0MzM2O2JvcmRlci1yYWRpdXM6NXB4O2NvbG9yOiNmZmY7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOjEzcHg7b3BhY2l0eTowO3BhZGRpbmc6M3B4IDVweH1Aa2V5ZnJhbWVzIHBpbm5lZC12aWV3LWZhZGUtb3V0e2Zyb217b3BhY2l0eToxfTY2JXtvcGFjaXR5Oi45OX10b3tvcGFjaXR5OjB9fSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChMZ3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWV0cmljcy1waW5uZWQtdmlldy1jb21wb25lbnQiLHRlbXBsYXRlOidcbiAgICA8ZGl2IGNsYXNzPSJncm91cC10b29sYmFyIj5cbiAgICAgIDxtYXQtaWNvbiBzdmdJY29uPSJrZWVwXzI0cHgiPjwvbWF0LWljb24+XG4gICAgICA8c3BhbiBjbGFzcz0iZ3JvdXAtdGV4dCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPSJncm91cC10aXRsZSIgYXJpYS1yb2xlPSJoZWFkaW5nIiBhcmlhLWxldmVsPSIzIlxuICAgICAgICAgID5QaW5uZWQ8L3NwYW5cbiAgICAgICAgPlxuICAgICAgICA8c3BhbiAqbmdJZj0iY2FyZElkc1dpdGhNZXRhZGF0YS5sZW5ndGggPiAxIiBjbGFzcz0iZ3JvdXAtY2FyZC1jb3VudCJcbiAgICAgICAgICA+e3sgY2FyZElkc1dpdGhNZXRhZGF0YS5sZW5ndGggfX0gY2FyZHM8L3NwYW5cbiAgICAgICAgPlxuICAgICAgICA8c3BhblxuICAgICAgICAgICpuZ0Zvcj0ibGV0IGlkIG9mIG5ld0NhcmRQaW5uZWRJZHMiXG4gICAgICAgICAgW2F0dHIuZGF0YS1pZF09ImlkIlxuICAgICAgICAgIGNsYXNzPSJuZXctY2FyZC1waW5uZWQiXG4gICAgICAgICAgPk5ldyBjYXJkIHBpbm5lZDwvc3BhblxuICAgICAgICA+XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPG1ldHJpY3MtY2FyZC1ncmlkXG4gICAgICAqbmdJZj0iY2FyZElkc1dpdGhNZXRhZGF0YS5sZW5ndGg7IGVsc2UgZW1wdHlQaW5uZWRWaWV3IlxuICAgICAgW2NhcmRJZHNXaXRoTWV0YWRhdGFdPSJjYXJkSWRzV2l0aE1ldGFkYXRhIlxuICAgICAgW2NhcmRPYnNlcnZlcl09ImNhcmRPYnNlcnZlciJcbiAgICA+PC9tZXRyaWNzLWNhcmQtZ3JpZD5cbiAgICA8bmctdGVtcGxhdGUgI2VtcHR5UGlubmVkVmlldz5cbiAgICAgIDxkaXYgY2xhc3M9ImVtcHR5LW1lc3NhZ2UiPlBpbiBjYXJkcyBmb3IgYSBxdWljayB2aWV3IGFuZCBjb21wYXJpc29uPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgJyxzdHlsZVVybHM6WyJwaW5uZWRfdmlld19jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7Y2FyZE9ic2VydmVyOlt7dHlwZTp4eX1dLGNhcmRJZHNXaXRoTWV0YWRhdGE6W3t0eXBlOnh5fV0sbmV3Q2FyZFBpbm5lZElkczpbe3R5cGU6eHl9XX0pO2NsYXNzIEJndHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5jYXJkSWRzV2l0aE1ldGFkYXRhJD10aGlzLnN0b3JlLnNlbGVjdChQVCkucGlwZShOZShbXSkpLHRoaXMubmV3Q2FyZFBpbm5lZElkcyQ9dGhpcy5zdG9yZS5zZWxlY3QoUFQpLnBpcGUoVGUoMSksSXQoKHQ9PnQubWFwKCh0PT50LmNhcmRJZCkpKSksRGUoKSxJdCgoKFt0LGVdKT0+e2NvbnN0IG49bmV3IFNldCh0KSxvPW5ldyBTZXQoZSk7Zm9yKGNvbnN0IHQgb2YgbylpZighbi5oYXModCkpcmV0dXJuIERhdGUubm93KCk7cmV0dXJuIG51bGx9KSksTmUobnVsbCksRGUoKSxJdCgoKFt0LGVdKT0+bnVsbD09PXQmJm51bGw9PT1lP251bGw6bnVsbD09PWU/W3RdOltlXSkpLGNlKCh0PT5udWxsIT09dCkpLEl0KCh0PT5bdFswXV0pKSl9fUJndC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8Qmd0KShTbShJdykpfSxCZ3QuybVjbXA9dG8oe3R5cGU6Qmd0LHNlbGVjdG9yczpbWyJtZXRyaWNzLXBpbm5lZC12aWV3Il1dLGlucHV0czp7Y2FyZE9ic2VydmVyOiJjYXJkT2JzZXJ2ZXIifSxkZWNsczozLHZhcnM6Nyxjb25zdHM6W1szLCJjYXJkSWRzV2l0aE1ldGFkYXRhIiwibmV3Q2FyZFBpbm5lZElkcyIsImNhcmRPYnNlcnZlciJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwibWV0cmljcy1waW5uZWQtdmlldy1jb21wb25lbnQiLDApLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSksMiZlJiZEbSgiY2FyZElkc1dpdGhNZXRhZGF0YSIsVGgoMSwzLG4uY2FyZElkc1dpdGhNZXRhZGF0YSQpKSgibmV3Q2FyZFBpbm5lZElkcyIsVGgoMiw1LG4ubmV3Q2FyZFBpbm5lZElkcyQpKSgiY2FyZE9ic2VydmVyIixuLmNhcmRPYnNlcnZlcil9LGRpcmVjdGl2ZXM6W0xndF0scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEJndCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtZXRyaWNzLXBpbm5lZC12aWV3Iix0ZW1wbGF0ZTonXG4gICAgPG1ldHJpY3MtcGlubmVkLXZpZXctY29tcG9uZW50XG4gICAgICBbY2FyZElkc1dpdGhNZXRhZGF0YV09ImNhcmRJZHNXaXRoTWV0YWRhdGEkIHwgYXN5bmMiXG4gICAgICBbbmV3Q2FyZFBpbm5lZElkc109Im5ld0NhcmRQaW5uZWRJZHMkIHwgYXN5bmMiXG4gICAgICBbY2FyZE9ic2VydmVyXT0iY2FyZE9ic2VydmVyIlxuICAgID48L21ldHJpY3MtcGlubmVkLXZpZXctY29tcG9uZW50PlxuICAnLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSkse2NhcmRPYnNlcnZlcjpbe3R5cGU6eHl9XX0pO2NvbnN0IFZndD1adyhNVCxOTiwoKHQsZSk9PnQuZmlsdGVyKCh0PT4heEEodC5wbHVnaW4pfHxCb29sZWFuKGUmJmUuZ2V0KHQucnVuSWQpKSkpKSksamd0PVp3KFZndCwodD0+dC5zb3J0KCgodCxlKT0+ZzIodC50YWcsZS50YWcpKSkpKTtmdW5jdGlvbiBVZ3QodCxlKXtpZigxJnQmJihSbSgwLCJzcGFuIiw2KSxrdSgxKSxBaCgyLCJudW1iZXIiKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKS4kaW1wbGljaXQ7cmMoMSksRHUoIiIsVGgoMiwxLHQuaXRlbXMubGVuZ3RoKSwiIGNhcmRzIil9fWZ1bmN0aW9uIEdndCh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsMSksUm0oMSwiZGl2IiwyKSxSbSgyLCJzcGFuIiksUm0oMywic3BhbiIsMyksa3UoNCksQW0oKSxRcCg1LFVndCwzLDMsInNwYW4iLDQpLEFtKCksQW0oKSxUbSg2LCJtZXRyaWNzLWNhcmQtZ3JpZCIsNSksQW0oKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oKTtyYygzKSxLbSgidGl0bGUiLHQuZ3JvdXBOYW1lKSxyYygxKSxTdSh0Lmdyb3VwTmFtZSkscmMoMSksRG0oIm5nSWYiLHQuaXRlbXMubGVuZ3RoPjEpLHJjKDEpLERtKCJjYXJkSWRzV2l0aE1ldGFkYXRhIix0Lml0ZW1zKSgiY2FyZE9ic2VydmVyIixuLmNhcmRPYnNlcnZlcikoImdyb3VwTmFtZSIsdC5ncm91cE5hbWUpfX1jbGFzcyBXZ3R7Y29uc3RydWN0b3IoKXt0aGlzLlBsdWdpblR5cGU9aEF9dHJhY2tCeUdyb3VwKHQsZSl7cmV0dXJuIGUuZ3JvdXBOYW1lfX1XZ3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFdndCl9LFdndC7JtWNtcD10byh7dHlwZTpXZ3Qsc2VsZWN0b3JzOltbIm1ldHJpY3MtY2FyZC1ncm91cHMtY29tcG9uZW50Il1dLGlucHV0czp7Y2FyZEdyb3VwczoiY2FyZEdyb3VwcyIsY2FyZE9ic2VydmVyOiJjYXJkT2JzZXJ2ZXIifSxkZWNsczoxLHZhcnM6Mixjb25zdHM6W1siY2xhc3MiLCJjYXJkLWdyb3VwIiw0LCJuZ0ZvciIsIm5nRm9yT2YiLCJuZ0ZvclRyYWNrQnkiXSxbMSwiY2FyZC1ncm91cCJdLFsxLCJncm91cC10b29sYmFyIl0sWyJhcmlhLXJvbGUiLCJoZWFkaW5nIiwiYXJpYS1sZXZlbCIsIjMiLDEsImdyb3VwLXRpdGxlIiwzLCJ0aXRsZSJdLFsiY2xhc3MiLCJncm91cC1jYXJkLWNvdW50Iiw0LCJuZ0lmIl0sWzMsImNhcmRJZHNXaXRoTWV0YWRhdGEiLCJjYXJkT2JzZXJ2ZXIiLCJncm91cE5hbWUiXSxbMSwiZ3JvdXAtY2FyZC1jb3VudCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiZRcCgwLEdndCw3LDYsImRpdiIsMCksMiZlJiZEbSgibmdGb3JPZiIsbi5jYXJkR3JvdXBzKSgibmdGb3JUcmFja0J5IixuLnRyYWNrQnlHcm91cCl9LGRpcmVjdGl2ZXM6W2xNLGRNLE5ndF0scGlwZXM6W0ZNXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVdICAgLmdyb3VwLXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmViO2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7ZGlzcGxheTpmbGV4O2ZsZXg6bm9uZTtoZWlnaHQ6NDJweDttYXJnaW4tYm90dG9tOi0xcHg7cGFkZGluZzowIDE2cHg7cG9zaXRpb246c3RpY2t5O3RvcDowO3otaW5kZXg6MTtib3gtc2hhZG93OjBweCAycHggNHB4IDBweCByZ2JhKDAsMCwwLC4xNSl9Ym9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmdyb3VwLXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzMwMzAzMH1ib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXAtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzU1NX1ib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXAtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAwcHggcmdiYSgyNTUsMjU1LDI1NSwuMTUpfVtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXAtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgI2ViZWJlYjt0b3A6LTFweH1ib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXAtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgIzU1NX0uY2FyZC1ncm91cFtfbmdjb250ZW50LSVDT01QJV06Zmlyc3Qtb2YtdHlwZSAgIC5ncm91cC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOm5vbmV9Lmdyb3VwLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lmdyb3VwLWNhcmQtY291bnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjQwMDtjb2xvcjojNjE2MTYxO21hcmdpbi1sZWZ0OjZweH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXAtY2FyZC1jb3VudFtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cC1jYXJkLWNvdW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoV2d0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1ldHJpY3MtY2FyZC1ncm91cHMtY29tcG9uZW50Iix0ZW1wbGF0ZTonXG4gICAgPGRpdlxuICAgICAgKm5nRm9yPSJsZXQgZ3JvdXAgb2YgY2FyZEdyb3VwczsgdHJhY2tCeTogdHJhY2tCeUdyb3VwIlxuICAgICAgY2xhc3M9ImNhcmQtZ3JvdXAiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz0iZ3JvdXAtdG9vbGJhciI+XG4gICAgICAgIDxzcGFuPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz0iZ3JvdXAtdGl0bGUiXG4gICAgICAgICAgICBhcmlhLXJvbGU9ImhlYWRpbmciXG4gICAgICAgICAgICBhcmlhLWxldmVsPSIzIlxuICAgICAgICAgICAgdGl0bGU9Int7IGdyb3VwLmdyb3VwTmFtZSB9fSJcbiAgICAgICAgICAgID57eyBncm91cC5ncm91cE5hbWUgfX08L3NwYW5cbiAgICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9Imdyb3VwLml0ZW1zLmxlbmd0aCA+IDEiIGNsYXNzPSJncm91cC1jYXJkLWNvdW50IlxuICAgICAgICAgICAgPnt7IGdyb3VwLml0ZW1zLmxlbmd0aCB8IG51bWJlciB9fSBjYXJkczwvc3BhblxuICAgICAgICAgID5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8bWV0cmljcy1jYXJkLWdyaWRcbiAgICAgICAgW2NhcmRJZHNXaXRoTWV0YWRhdGFdPSJncm91cC5pdGVtcyJcbiAgICAgICAgW2NhcmRPYnNlcnZlcl09ImNhcmRPYnNlcnZlciJcbiAgICAgICAgW2dyb3VwTmFtZV09Imdyb3VwLmdyb3VwTmFtZSJcbiAgICAgID48L21ldHJpY3MtY2FyZC1ncmlkPlxuICAgIDwvZGl2PlxuICAnLHN0eWxlVXJsczpbImNhcmRfZ3JvdXBzX2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSxudWxsLHtjYXJkR3JvdXBzOlt7dHlwZTp4eX1dLGNhcmRPYnNlcnZlcjpbe3R5cGU6eHl9XX0pO2NsYXNzIFlndHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5jYXJkR3JvdXBzJD10aGlzLnN0b3JlLnNlbGVjdChqZ3QpLnBpcGUoZmUodGhpcy5zdG9yZS5zZWxlY3QocVQpKSxJdCgoKFt0LGVdKT0+ZS5zaXplP3QuZmlsdGVyKCh0PT5lLmhhcyh0LnBsdWdpbikpKTp0KSksSXQoKHQ9PihmdW5jdGlvbiBlKHQpe2NvbnN0IGU9bmV3IE1hcCxuPXQuc2xpY2UoKS5zb3J0KCgodCxlKT0+ZzIodC50YWcsZS50YWcpKSk7Zm9yKGNvbnN0IHQgb2Ygbil7Y29uc3Qgbj10LnRhZy5zcGxpdCgiLyIsMSlbMF07ZS5oYXMobil8fGUuc2V0KG4se2dyb3VwTmFtZTpuLGl0ZW1zOltdfSksZS5nZXQobikuaXRlbXMucHVzaCh0KX1yZXR1cm5bLi4uZS52YWx1ZXMoKV19KSh0KSkpKX19ZnVuY3Rpb24gcWd0KHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpO3JjKDEpLER1KCIgYW5kICIsdC5nZXRQbHVnaW5UeXBlRmlsdGVyU3RyaW5nKHQucGx1Z2luVHlwZXMpLCIgdmlzdWFsaXphdGlvbiBmaWx0ZXIiKX19WWd0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxZZ3QpKFNtKEl3KSl9LFlndC7JtWNtcD10byh7dHlwZTpZZ3Qsc2VsZWN0b3JzOltbIm1ldHJpY3MtY2FyZC1ncm91cHMiXV0saW5wdXRzOntjYXJkT2JzZXJ2ZXI6ImNhcmRPYnNlcnZlciJ9LGRlY2xzOjIsdmFyczo0LGNvbnN0czpbWzMsImNhcmRHcm91cHMiLCJjYXJkT2JzZXJ2ZXIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFRtKDAsIm1ldHJpY3MtY2FyZC1ncm91cHMtY29tcG9uZW50IiwwKSxBaCgxLCJhc3luYyIpKSwyJmUmJkRtKCJjYXJkR3JvdXBzIixUaCgxLDIsbi5jYXJkR3JvdXBzJCkpKCJjYXJkT2JzZXJ2ZXIiLG4uY2FyZE9ic2VydmVyKX0sZGlyZWN0aXZlczpbV2d0XSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWWd0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1ldHJpY3MtY2FyZC1ncm91cHMiLHRlbXBsYXRlOidcbiAgICA8bWV0cmljcy1jYXJkLWdyb3Vwcy1jb21wb25lbnRcbiAgICAgIFtjYXJkR3JvdXBzXT0iY2FyZEdyb3VwcyQgfCBhc3luYyJcbiAgICAgIFtjYXJkT2JzZXJ2ZXJdPSJjYXJkT2JzZXJ2ZXIiXG4gICAgPjwvbWV0cmljcy1jYXJkLWdyb3Vwcy1jb21wb25lbnQ+XG4gICcsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSx7Y2FyZE9ic2VydmVyOlt7dHlwZTp4eX1dfSk7Y2xhc3MgWmd0e2NvbnN0cnVjdG9yKCl7dGhpcy5QbHVnaW5UeXBlPWhBLHRoaXMubGlzdEZvcm1hdHRlcj1uZXcgSW50bC5MaXN0Rm9ybWF0KHZvaWQgMCx7c3R5bGU6ImxvbmciLHR5cGU6ImRpc2p1bmN0aW9uIn0pfWdldFBsdWdpblR5cGVGaWx0ZXJTdHJpbmcodCl7Y29uc3QgZT1bLi4udF0ubWFwKCh0PT57c3dpdGNoKHQpe2Nhc2UgaEEuU0NBTEFSUzpyZXR1cm4ic2NhbGFyIjtjYXNlIGhBLklNQUdFUzpyZXR1cm4iaW1hZ2UiO2Nhc2UgaEEuSElTVE9HUkFNUzpyZXR1cm4iaGlzdG9ncmFtIjtkZWZhdWx0OnRocm93IG5ldyBSYW5nZUVycm9yKGBQbGVhc2UgaW1wbGVtZW50IGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIHBsdWdpbiB0eXBlOiAke3R9YCl9fSkpO3JldHVybiB0aGlzLmxpc3RGb3JtYXR0ZXIuZm9ybWF0KGUpfX1aZ3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFpndCl9LFpndC7JtWNtcD10byh7dHlwZTpaZ3Qsc2VsZWN0b3JzOltbIm1ldHJpY3MtZW1wdHktdGFnLW1hdGNoLWNvbXBvbmVudCJdXSxpbnB1dHM6e3BsdWdpblR5cGVzOiJwbHVnaW5UeXBlcyIsdGFnRmlsdGVyUmVnZXg6InRhZ0ZpbHRlclJlZ2V4Iix0YWdDb3VudHM6InRhZ0NvdW50cyJ9LGRlY2xzOjYsdmFyczo1LGNvbnN0czpbWzQsIm5nSWYiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKGt1KDAsIk5vIG1hdGNoZXMgZm9yIHRhZyBmaWx0ZXIgIiksUm0oMSwiY29kZSIpLGt1KDIpLEFtKCksUXAoMyxxZ3QsMiwxLCJzcGFuIiwwKSxrdSg0KSxBaCg1LCJudW1iZXIiKSksMiZlJiYocmMoMiksRHUoIi8iLG4udGFnRmlsdGVyUmVnZXgsIi8iKSxyYygxKSxEbSgibmdJZiIsbi5wbHVnaW5UeXBlcy5zaXplKSxyYygxKSxEdSgiIG91dCBvZiAiLFRoKDUsMyxuLnRhZ0NvdW50cyksIiB0YWdzLiIpKX0sZGlyZWN0aXZlczpbZE1dLHBpcGVzOltGTV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChaZ3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWV0cmljcy1lbXB0eS10YWctbWF0Y2gtY29tcG9uZW50Iix0ZW1wbGF0ZTonTm8gbWF0Y2hlcyBmb3IgdGFnIGZpbHRlciA8Y29kZT4ve3sgdGFnRmlsdGVyUmVnZXggfX0vPC9jb2RlXG4gICAgPjxzcGFuICpuZ0lmPSJwbHVnaW5UeXBlcy5zaXplIj5cbiAgICAgIGFuZCB7eyBnZXRQbHVnaW5UeXBlRmlsdGVyU3RyaW5nKHBsdWdpblR5cGVzKSB9fSB2aXN1YWxpemF0aW9uXG4gICAgICBmaWx0ZXI8L3NwYW5cbiAgICA+XG4gICAgb3V0IG9mIHt7IHRhZ0NvdW50cyB8IG51bWJlciB9fSB0YWdzLicsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7cGx1Z2luVHlwZXM6W3t0eXBlOnh5fV0sdGFnRmlsdGVyUmVnZXg6W3t0eXBlOnh5fV0sdGFnQ291bnRzOlt7dHlwZTp4eX1dfSk7Y2xhc3MgWGd0e2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLnBsdWdpblR5cGVzJD10aGlzLnN0b3JlLnNlbGVjdChxVCksdGhpcy50YWdGaWx0ZXJSZWdleCQ9dGhpcy5zdG9yZS5zZWxlY3QoQlQpLHRoaXMudGFnQ291bnRzJD10aGlzLnN0b3JlLnNlbGVjdChqZ3QpLnBpcGUoSXQoKHQ9Pm5ldyBTZXQodC5tYXAoKCh7dGFnOnR9KT0+dCkpKS5zaXplKSkpfX1mdW5jdGlvbiBLZ3QodCxlKXtpZigxJnQmJihSbSgwLCJzcGFuIiw2KSxrdSgxKSxBaCgyLCJudW1iZXIiKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtyYygxKSxEdSgiIixUaCgyLDEsdC5jYXJkSWRzV2l0aE1ldGFkYXRhLmxlbmd0aCksIiBjYXJkcyIpfX1mdW5jdGlvbiBKZ3QodCxlKXsxJnQmJlRtKDAsIm1ldHJpY3MtZW1wdHktdGFnLW1hdGNoIiw3KX1YZ3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFhndCkoU20oSXcpKX0sWGd0Lsm1Y21wPXRvKHt0eXBlOlhndCxzZWxlY3RvcnM6W1sibWV0cmljcy1lbXB0eS10YWctbWF0Y2giXV0sZGVjbHM6NCx2YXJzOjksY29uc3RzOltbMywicGx1Z2luVHlwZXMiLCJ0YWdGaWx0ZXJSZWdleCIsInRhZ0NvdW50cyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwibWV0cmljcy1lbXB0eS10YWctbWF0Y2gtY29tcG9uZW50IiwwKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQWgoMywiYXN5bmMiKSksMiZlJiZEbSgicGx1Z2luVHlwZXMiLFRoKDEsMyxuLnBsdWdpblR5cGVzJCkpKCJ0YWdGaWx0ZXJSZWdleCIsVGgoMiw1LG4udGFnRmlsdGVyUmVnZXgkKSkoInRhZ0NvdW50cyIsVGgoMyw3LG4udGFnQ291bnRzJCkpfSxkaXJlY3RpdmVzOltaZ3RdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChYZ3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWV0cmljcy1lbXB0eS10YWctbWF0Y2giLHRlbXBsYXRlOidcbiAgICA8bWV0cmljcy1lbXB0eS10YWctbWF0Y2gtY29tcG9uZW50XG4gICAgICBbcGx1Z2luVHlwZXNdPSJwbHVnaW5UeXBlcyQgfCBhc3luYyJcbiAgICAgIFt0YWdGaWx0ZXJSZWdleF09InRhZ0ZpbHRlclJlZ2V4JCB8IGFzeW5jIlxuICAgICAgW3RhZ0NvdW50c109InRhZ0NvdW50cyQgfCBhc3luYyJcbiAgICA+PC9tZXRyaWNzLWVtcHR5LXRhZy1tYXRjaC1jb21wb25lbnQ+XG4gICcsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSxudWxsKTtjbGFzcyBRZ3R7fVFndC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8UWd0KX0sUWd0Lsm1Y21wPXRvKHt0eXBlOlFndCxzZWxlY3RvcnM6W1sibWV0cmljcy1maWx0ZXJlZC12aWV3LWNvbXBvbmVudCJdXSxpbnB1dHM6e2lzRW1wdHlNYXRjaDoiaXNFbXB0eU1hdGNoIixjYXJkT2JzZXJ2ZXI6ImNhcmRPYnNlcnZlciIsY2FyZElkc1dpdGhNZXRhZGF0YToiY2FyZElkc1dpdGhNZXRhZGF0YSJ9LGRlY2xzOjcsdmFyczo0LGNvbnN0czpbWzEsImdyb3VwLXRvb2xiYXIiXSxbMSwiZ3JvdXAtdGV4dCJdLFsiYXJpYS1yb2xlIiwiaGVhZGluZyIsImFyaWEtbGV2ZWwiLCIzIiwxLCJncm91cC10aXRsZSJdLFsiY2xhc3MiLCJncm91cC1jYXJkLWNvdW50Iiw0LCJuZ0lmIl0sWyJjbGFzcyIsIndhcm4iLDQsIm5nSWYiXSxbMywiY2FyZElkc1dpdGhNZXRhZGF0YSIsImNhcmRPYnNlcnZlciJdLFsxLCJncm91cC1jYXJkLWNvdW50Il0sWzEsIndhcm4iXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImRpdiIsMCksUm0oMSwic3BhbiIsMSksUm0oMiwic3BhbiIsMiksa3UoMywiVGFncyBtYXRjaGluZyBmaWx0ZXIiKSxBbSgpLFFwKDQsS2d0LDMsMywic3BhbiIsMyksQW0oKSxBbSgpLFFwKDUsSmd0LDEsMCwibWV0cmljcy1lbXB0eS10YWctbWF0Y2giLDQpLFRtKDYsIm1ldHJpY3MtY2FyZC1ncmlkIiw1KSksMiZlJiYocmMoNCksRG0oIm5nSWYiLG4uY2FyZElkc1dpdGhNZXRhZGF0YS5sZW5ndGg+MSkscmMoMSksRG0oIm5nSWYiLG4uaXNFbXB0eU1hdGNoKSxyYygxKSxEbSgiY2FyZElkc1dpdGhNZXRhZGF0YSIsbi5jYXJkSWRzV2l0aE1ldGFkYXRhKSgiY2FyZE9ic2VydmVyIixuLmNhcmRPYnNlcnZlcikpfSxkaXJlY3RpdmVzOltkTSxOZ3QsWGd0XSxwaXBlczpbRk1dLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXAtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWI7YWxpZ24taXRlbXM6Y2VudGVyO2JhY2tncm91bmQtY29sb3I6I2ZmZjtkaXNwbGF5OmZsZXg7ZmxleDpub25lO2hlaWdodDo0MnB4O21hcmdpbi1ib3R0b206LTFweDtwYWRkaW5nOjAgMTZweDtwb3NpdGlvbjpzdGlja3k7dG9wOjA7ei1pbmRleDoxO2JveC1zaGFkb3c6MHB4IDJweCA0cHggMHB4IHJnYmEoMCwwLDAsLjE1KX1ib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXAtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMzAzMDMwfWJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjNTU1fWJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggNHB4IDBweCByZ2JhKDI1NSwyNTUsMjU1LC4xNSl9Lmdyb3VwLXRleHRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpiYXNlbGluZX0uZ3JvdXAtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0uZ3JvdXAtY2FyZC1jb3VudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM2MTYxNjE7bWFyZ2luLWxlZnQ6NnB4fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cC1jYXJkLWNvdW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmdyb3VwLWNhcmQtY291bnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfW1ldHJpY3MtZW1wdHktdGFnLW1hdGNoW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxO2ZvbnQtc2l6ZToxM3B4O2ZvbnQtc3R5bGU6aXRhbGljO3BhZGRpbmc6MTZweDt0ZXh0LWFsaWduOmNlbnRlcjtkaXNwbGF5OmJsb2NrfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIG1ldHJpY3MtZW1wdHktdGFnLW1hdGNoW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgbWV0cmljcy1lbXB0eS10YWctbWF0Y2hbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChRZ3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWV0cmljcy1maWx0ZXJlZC12aWV3LWNvbXBvbmVudCIsdGVtcGxhdGU6J1xuICAgIDxkaXYgY2xhc3M9Imdyb3VwLXRvb2xiYXIiPlxuICAgICAgPHNwYW4gY2xhc3M9Imdyb3VwLXRleHQiPlxuICAgICAgICA8c3BhbiBjbGFzcz0iZ3JvdXAtdGl0bGUiIGFyaWEtcm9sZT0iaGVhZGluZyIgYXJpYS1sZXZlbD0iMyJcbiAgICAgICAgICA+VGFncyBtYXRjaGluZyBmaWx0ZXI8L3NwYW5cbiAgICAgICAgPlxuICAgICAgICA8c3BhbiAqbmdJZj0iY2FyZElkc1dpdGhNZXRhZGF0YS5sZW5ndGggPiAxIiBjbGFzcz0iZ3JvdXAtY2FyZC1jb3VudCJcbiAgICAgICAgICA+e3sgY2FyZElkc1dpdGhNZXRhZGF0YS5sZW5ndGggfCBudW1iZXIgfX0gY2FyZHM8L3NwYW5cbiAgICAgICAgPlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxtZXRyaWNzLWVtcHR5LXRhZy1tYXRjaFxuICAgICAgKm5nSWY9ImlzRW1wdHlNYXRjaCJcbiAgICAgIGNsYXNzPSJ3YXJuIlxuICAgID48L21ldHJpY3MtZW1wdHktdGFnLW1hdGNoPlxuICAgIDxtZXRyaWNzLWNhcmQtZ3JpZFxuICAgICAgW2NhcmRJZHNXaXRoTWV0YWRhdGFdPSJjYXJkSWRzV2l0aE1ldGFkYXRhIlxuICAgICAgW2NhcmRPYnNlcnZlcl09ImNhcmRPYnNlcnZlciJcbiAgICA+PC9tZXRyaWNzLWNhcmQtZ3JpZD5cbiAgJyxzdHlsZVVybHM6WyJmaWx0ZXJlZF92aWV3X2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSxudWxsLHtpc0VtcHR5TWF0Y2g6W3t0eXBlOnh5fV0sY2FyZE9ic2VydmVyOlt7dHlwZTp4eX1dLGNhcmRJZHNXaXRoTWV0YWRhdGE6W3t0eXBlOnh5fV19KTtjbGFzcyAkZ3R7Y29uc3RydWN0b3IodCl7dGhpcy5zdG9yZT10LHRoaXMuY2FyZElkc1dpdGhNZXRhZGF0YSQ9dGhpcy5zdG9yZS5zZWxlY3Qoamd0KS5waXBlKGZlKHRoaXMuc3RvcmUuc2VsZWN0KHFUKSksSXQoKChbdCxlXSk9PmUuc2l6ZT90LmZpbHRlcigodD0+ZS5oYXModC5wbHVnaW4pKSk6dCkpLGZlKHRoaXMuc3RvcmUuc2VsZWN0KEJUKSksZ2UoMjAwKSxJdCgoKFt0LGVdKT0+e3RyeXtyZXR1cm57Y2FyZExpc3Q6dCxyZWdleDpuZXcgUmVnRXhwKGUsImkiKX19Y2F0Y2goZSl7cmV0dXJue2NhcmRMaXN0OnQscmVnZXg6bnVsbH19fSkpLGNlKCgoe3JlZ2V4OnR9KT0+bnVsbCE9PXQpKSxJdCgoKHtjYXJkTGlzdDp0LHJlZ2V4OmV9KT0+dC5maWx0ZXIoKCh7dGFnOnR9KT0+ZS50ZXN0KHQpKSkpKSxNZSgoKHQsZSk9PnQubGVuZ3RoPT09ZS5sZW5ndGgmJnQuZXZlcnkoKCh0LG4pPT50LmNhcmRJZD09PWVbbl0uY2FyZElkKSkpKSxFZSgpLE5lKFtdKSksdGhpcy5pc0VtcHR5TWF0Y2gkPXRoaXMuY2FyZElkc1dpdGhNZXRhZGF0YSQucGlwZShmZSh0aGlzLnN0b3JlLnNlbGVjdChqZ3QpKSxJdCgoKFt0LGVdKT0+Qm9vbGVhbihlLmxlbmd0aCkmJjA9PT10Lmxlbmd0aCkpKX19ZnVuY3Rpb24gdGh0KHQsZSl7aWYoMSZ0JiYoUm0oMCwibWF0LW9wdGlvbiIsMiksa3UoMSksQW0oKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0O0RtKCJ2YWx1ZSIsdC52YWx1ZSkoImRpc2FibGVkIix0LmRpc2FibGVkKSxyYygxKSxEdSgiICIsdC5kaXNwbGF5VGV4dCwiICIpfX0kZ3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fCRndCkoU20oSXcpKX0sJGd0Lsm1Y21wPXRvKHt0eXBlOiRndCxzZWxlY3RvcnM6W1sibWV0cmljcy1maWx0ZXJlZC12aWV3Il1dLGlucHV0czp7Y2FyZE9ic2VydmVyOiJjYXJkT2JzZXJ2ZXIifSxkZWNsczozLHZhcnM6Nyxjb25zdHM6W1szLCJpc0VtcHR5TWF0Y2giLCJjYXJkSWRzV2l0aE1ldGFkYXRhIiwiY2FyZE9ic2VydmVyIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihUbSgwLCJtZXRyaWNzLWZpbHRlcmVkLXZpZXctY29tcG9uZW50IiwwKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIikpLDImZSYmRG0oImlzRW1wdHlNYXRjaCIsVGgoMSwzLG4uaXNFbXB0eU1hdGNoJCkpKCJjYXJkSWRzV2l0aE1ldGFkYXRhIixUaCgyLDUsbi5jYXJkSWRzV2l0aE1ldGFkYXRhJCkpKCJjYXJkT2JzZXJ2ZXIiLG4uY2FyZE9ic2VydmVyKX0sZGlyZWN0aXZlczpbUWd0XSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoJGd0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1ldHJpY3MtZmlsdGVyZWQtdmlldyIsdGVtcGxhdGU6J1xuICAgIDxtZXRyaWNzLWZpbHRlcmVkLXZpZXctY29tcG9uZW50XG4gICAgICBbaXNFbXB0eU1hdGNoXT0iaXNFbXB0eU1hdGNoJCB8IGFzeW5jIlxuICAgICAgW2NhcmRJZHNXaXRoTWV0YWRhdGFdPSJjYXJkSWRzV2l0aE1ldGFkYXRhJCB8IGFzeW5jIlxuICAgICAgW2NhcmRPYnNlcnZlcl09ImNhcmRPYnNlcnZlciJcbiAgICA+PC9tZXRyaWNzLWZpbHRlcmVkLXZpZXctY29tcG9uZW50PlxuICAnLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSkse2NhcmRPYnNlcnZlcjpbe3R5cGU6eHl9XX0pO2NsYXNzIGVodHtjb25zdHJ1Y3Rvcigpe3RoaXMudmFsdWU9IiIsdGhpcy5vcHRpb25zPVtdLHRoaXMuc2VsZWN0aW9uQ2hhbmdlPW5ldyBMaH19ZnVuY3Rpb24gbmh0KHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwibWF0LXNsaWRlciIsMjYpLFZtKCJpbnB1dCIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKDIpLm9uU3RlcFN0YXJ0Q2hhbmdlZChuLnZhbHVlKX0pKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgyKTtEbSgiZGlzYWJsZWQiLCF0LnNlbGVjdFRpbWVFbmFibGVkKSgibWluIix0LnN0ZXBNaW5NYXgubWluKSgibWF4Iix0LnN0ZXBNaW5NYXgubWF4KSgic3RlcCIsMSkoInZhbHVlIixudWxsPT10LnNlbGVjdGVkVGltZT9udWxsOnQuc2VsZWN0ZWRUaW1lLnN0YXJ0LnN0ZXApKCJ0aHVtYkxhYmVsIiwhMCl9fWZ1bmN0aW9uIG9odCh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsInRiLXJhbmdlLWlucHV0IiwyNyksVm0oInZhbHVlIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oMikub25TdGVwUmFuZ2VDaGFuZ2VkKG4pfSkpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKDIpO0RtKCJtaW4iLHQuc3RlcE1pbk1heC5taW4pKCJtYXgiLHQuc3RlcE1pbk1heC5tYXgpKCJsb3dlclZhbHVlIixudWxsPT10LnNlbGVjdGVkVGltZT9udWxsOnQuc2VsZWN0ZWRUaW1lLnN0YXJ0LnN0ZXApKCJ1cHBlclZhbHVlIixudWxsPT10LnNlbGVjdGVkVGltZXx8bnVsbD09dC5zZWxlY3RlZFRpbWUuZW5kP251bGw6dC5zZWxlY3RlZFRpbWUuZW5kLnN0ZXApLGpwKCJkaXNhYmxlZCIsIXQuc2VsZWN0VGltZUVuYWJsZWQpfX1mdW5jdGlvbiBpaHQodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDIxKSxSbSgxLCJsYWJlbCIpLGt1KDIsIkxpbmsgdmlzdWFsaXphdGlvbiBieSBzdGVwIiksQW0oKSxSbSgzLCJkaXYiLDIyKSxSbSg0LCJkaXYiKSxSbSg1LCJtYXQtY2hlY2tib3giLDE1KSxWbSgiY2hhbmdlIiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgpLnNlbGVjdFRpbWVFbmFibGVUb2dnbGVkLmVtaXQoKX0pKSxrdSg2LCJFbmFibGVkIiksQW0oKSxBbSgpLFJtKDcsImRpdiIpLFJtKDgsIm1hdC1jaGVja2JveCIsMTUpLFZtKCJjaGFuZ2UiLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLFltKCkudXNlUmFuZ2VTZWxlY3RUaW1lVG9nZ2xlZC5lbWl0KCl9KSksa3UoOSwiVXNlIHJhbmdlIiksQW0oKSxBbSgpLFJtKDEwLCJkaXYiLDIzKSxRcCgxMSxuaHQsMSw2LCJtYXQtc2xpZGVyIiwyNCksUXAoMTIsb2h0LDEsNSwibmctdGVtcGxhdGUiLG51bGwsMjUsaWIpLEFtKCksQW0oKSxBbSgpfWlmKDImdCl7Y29uc3QgdD0kcCgxMyksZT1ZbSgpO3JjKDUpLERtKCJjaGVja2VkIixlLnNlbGVjdFRpbWVFbmFibGVkKSxyYygzKSxEbSgiY2hlY2tlZCIsZS51c2VSYW5nZVNlbGVjdFRpbWUpLHJjKDMpLERtKCJuZ0lmIiwhZS51c2VSYW5nZVNlbGVjdFRpbWUpKCJuZ0lmRWxzZSIsdCl9fWZ1bmN0aW9uIGFodCh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsInNlY3Rpb24iLDI4KSxSbSgxLCJoMyIsMSksa3UoMiwiSW1hZ2VzIiksQW0oKSxSbSgzLCJkaXYiLDI5KSxSbSg0LCJkaXYiLDMwKSxrdSg1LCJCcmlnaHRuZXNzIiksQW0oKSxSbSg2LCJkaXYiLDkpLFJtKDcsIm1hdC1zbGlkZXIiLDMxKSxWbSgiaW5wdXQiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLmltYWdlQnJpZ2h0bmVzc1NsaWRlckNoYW5nZWQkLmVtaXQobi52YWx1ZSl9KSksQW0oKSxSbSg4LCJidXR0b24iLDMyKSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLFltKCkuaW1hZ2VCcmlnaHRuZXNzUmVzZXQuZW1pdCgpfSkpLFRtKDksIm1hdC1pY29uIiwzMyksQW0oKSxBbSgpLEFtKCksUm0oMTAsImRpdiIsMzQpLFJtKDExLCJkaXYiLDM1KSxrdSgxMiwiQ29udHJhc3QiKSxBbSgpLFJtKDEzLCJkaXYiLDkpLFJtKDE0LCJtYXQtc2xpZGVyIiwzNiksVm0oImlucHV0IiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oKS5pbWFnZUNvbnRyYXN0U2xpZGVyQ2hhbmdlZCQuZW1pdChuLnZhbHVlKX0pKSxBbSgpLFJtKDE1LCJidXR0b24iLDM3KSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLFltKCkuaW1hZ2VDb250cmFzdFJlc2V0LmVtaXQoKX0pKSxUbSgxNiwibWF0LWljb24iLDMzKSxBbSgpLEFtKCksQW0oKSxSbSgxNywiZGl2IiwzOCksUm0oMTgsIm1hdC1jaGVja2JveCIsMTUpLFZtKCJjaGFuZ2UiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLmltYWdlU2hvd0FjdHVhbFNpemVDaGFuZ2VkLmVtaXQobi5jaGVja2VkKX0pKSxrdSgxOSwiU2hvdyBhY3R1YWwgaW1hZ2Ugc2l6ZSIpLEFtKCksQW0oKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgpO3JjKDcpLERtKCJtYXgiLDJlMykoIm1pbiIsMCkoInN0ZXAiLDEwKSgidmFsdWUiLHQuaW1hZ2VCcmlnaHRuZXNzSW5NaWxsaSkoInRodW1iTGFiZWwiLCEwKSgiZGlzcGxheVdpdGgiLHQuZm9ybWF0TWlsbGlUb1plcm90aCkscmMoNyksRG0oIm1heCIsNWUzKSgibWluIiwwKSgic3RlcCIsMTApKCJ2YWx1ZSIsdC5pbWFnZUNvbnRyYXN0SW5NaWxsaSkoInRodW1iTGFiZWwiLCEwKSgiZGlzcGxheVdpdGgiLHQuZm9ybWF0TWlsbGlUb1plcm90aCkscmMoNCksRG0oImNoZWNrZWQiLHQuaW1hZ2VTaG93QWN0dWFsU2l6ZSl9fWVodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8ZWh0KX0sZWh0Lsm1Y21wPXRvKHt0eXBlOmVodCxzZWxlY3RvcnM6W1sidGItZHJvcGRvd24iXV0saW5wdXRzOnt2YWx1ZToidmFsdWUiLG9wdGlvbnM6Im9wdGlvbnMifSxvdXRwdXRzOntzZWxlY3Rpb25DaGFuZ2U6InNlbGVjdGlvbkNoYW5nZSJ9LGRlY2xzOjIsdmFyczoyLGNvbnN0czpbWzMsInZhbHVlIiwic2VsZWN0aW9uQ2hhbmdlIl0sWzMsInZhbHVlIiwiZGlzYWJsZWQiLDQsIm5nRm9yIiwibmdGb3JPZiJdLFszLCJ2YWx1ZSIsImRpc2FibGVkIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJtYXQtc2VsZWN0IiwwKSxWbSgic2VsZWN0aW9uQ2hhbmdlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5zZWxlY3Rpb25DaGFuZ2UuZW1pdChlLnZhbHVlKX0pKSxRcCgxLHRodCwyLDMsIm1hdC1vcHRpb24iLDEpLEFtKCkpLDImZSYmKERtKCJ2YWx1ZSIsbi52YWx1ZSkscmMoMSksRG0oIm5nRm9yT2YiLG4ub3B0aW9ucykpfSxkaXJlY3RpdmVzOltBRyxsTSxCSF0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9bWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjFweCBzb2xpZCAjOGU5OGEzO2JvcmRlci1yYWRpdXM6M3B4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjZweH1tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tvdXRsaW5lLWNvbG9yOi13ZWJraXQtZm9jdXMtcmluZy1jb2xvcjtvdXRsaW5lLXN0eWxlOmF1dG99ICAubWF0LXNlbGVjdC1wYW5lbHttYXgtd2lkdGg6NzB2d30gIG1hdC1vcHRpb24ubWF0LW9wdGlvbntoZWlnaHQ6YXV0b30gIC5tYXQtb3B0aW9uLXRleHR7d2hpdGUtc3BhY2U6bm9ybWFsO3dvcmQtYnJlYWs6YnJlYWstYWxsfSddfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChlaHQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoidGItZHJvcGRvd24iLHRlbXBsYXRlOidcbiAgICA8bWF0LXNlbGVjdFxuICAgICAgW3ZhbHVlXT0idmFsdWUiXG4gICAgICAoc2VsZWN0aW9uQ2hhbmdlKT0ic2VsZWN0aW9uQ2hhbmdlLmVtaXQoJGV2ZW50LnZhbHVlKSJcbiAgICA+XG4gICAgICA8bWF0LW9wdGlvblxuICAgICAgICAqbmdGb3I9ImxldCBvcHRpb24gb2Ygb3B0aW9ucyJcbiAgICAgICAgW3ZhbHVlXT0ib3B0aW9uLnZhbHVlIlxuICAgICAgICBbZGlzYWJsZWRdPSJvcHRpb24uZGlzYWJsZWQiXG4gICAgICA+XG4gICAgICAgIHt7IG9wdGlvbi5kaXNwbGF5VGV4dCB9fVxuICAgICAgPC9tYXQtb3B0aW9uPlxuICAgIDwvbWF0LXNlbGVjdD5cbiAgJyxzdHlsZVVybHM6WyJkcm9wZG93bl9jb21wb25lbnQuY3NzIl19XX1dLG51bGwse3ZhbHVlOlt7dHlwZTp4eX1dLG9wdGlvbnM6W3t0eXBlOnh5fV0sc2VsZWN0aW9uQ2hhbmdlOlt7dHlwZTpPeX1dfSk7Y2xhc3Mgcmh0e2NvbnN0cnVjdG9yKHQpe3RoaXMubG9jYWxlPXQsdGhpcy5zZWxlY3RUaW1lRW5hYmxlVG9nZ2xlZD1uZXcgTGgsdGhpcy51c2VSYW5nZVNlbGVjdFRpbWVUb2dnbGVkPW5ldyBMaCx0aGlzLnNlbGVjdFRpbWVDaGFuZ2VkPW5ldyBMaCx0aGlzLlRvb2x0aXBTb3J0RHJvcGRvd25PcHRpb25zPVt7dmFsdWU6YkEuREVGQVVMVCxkaXNwbGF5VGV4dDoiRGVmYXVsdCJ9LHt2YWx1ZTpiQS5BU0NFTkRJTkcsZGlzcGxheVRleHQ6IkFzY2VuZGluZyJ9LHt2YWx1ZTpiQS5ERVNDRU5ESU5HLGRpc3BsYXlUZXh0OiJEZXNjZW5kaW5nIn0se3ZhbHVlOmJBLk5FQVJFU1QsZGlzcGxheVRleHQ6Ik5lYXJlc3QifV0sdGhpcy50b29sdGlwU29ydENoYW5nZWQ9bmV3IExoLHRoaXMuaWdub3JlT3V0bGllcnNDaGFuZ2VkPW5ldyBMaCx0aGlzLlhBeGlzVHlwZT15QSx0aGlzLlhBeGlzVHlwZURyb3Bkb3duT3B0aW9ucz1be3ZhbHVlOnlBLlNURVAsZGlzcGxheVRleHQ6IlN0ZXAifSx7dmFsdWU6eUEuUkVMQVRJVkUsZGlzcGxheVRleHQ6IlJlbGF0aXZlIn0se3ZhbHVlOnlBLldBTExfVElNRSxkaXNwbGF5VGV4dDoiV2FsbCJ9XSx0aGlzLnhBeGlzVHlwZUNoYW5nZWQ9bmV3IExoLHRoaXMuSGlzdG9ncmFtTW9kZURyb3Bkb3duT3B0aW9ucz1be3ZhbHVlOnBFLk9GRlNFVCxkaXNwbGF5VGV4dDoiT2Zmc2V0In0se3ZhbHVlOnBFLk9WRVJMQVksZGlzcGxheVRleHQ6Ik92ZXJsYXkifV0sdGhpcy5oaXN0b2dyYW1Nb2RlQ2hhbmdlZD1uZXcgTGgsdGhpcy5NQVhfU01PT1RISU5HX1ZBTFVFPS45OTksdGhpcy5NQVhfU01PT1RISU5HX1NMSURFUl9WQUxVRT0uOTksdGhpcy5zY2FsYXJTbW9vdGhpbmdDb250cm9sQ2hhbmdlZCQ9bmV3IExoLHRoaXMuc2NhbGFyU21vb3RoaW5nQ2hhbmdlZD10aGlzLnNjYWxhclNtb290aGluZ0NvbnRyb2xDaGFuZ2VkJC5waXBlKGRlKDI1MCkpLHRoaXMuc2NhbGFyUGFydGl0aW9uWFRvZ2dsZWQ9bmV3IExoLHRoaXMuaW1hZ2VCcmlnaHRuZXNzU2xpZGVyQ2hhbmdlZCQ9bmV3IExoLHRoaXMuaW1hZ2VCcmlnaHRuZXNzSW5NaWxsaUNoYW5nZWQ9dGhpcy5pbWFnZUJyaWdodG5lc3NTbGlkZXJDaGFuZ2VkJC5waXBlKGRlKDI1MCkpLHRoaXMuaW1hZ2VCcmlnaHRuZXNzUmVzZXQ9bmV3IExoLHRoaXMuaW1hZ2VDb250cmFzdFNsaWRlckNoYW5nZWQkPW5ldyBMaCx0aGlzLmltYWdlQ29udHJhc3RJbk1pbGxpQ2hhbmdlZD10aGlzLmltYWdlQ29udHJhc3RTbGlkZXJDaGFuZ2VkJC5waXBlKGRlKDI1MCkpLHRoaXMuaW1hZ2VDb250cmFzdFJlc2V0PW5ldyBMaCx0aGlzLmltYWdlU2hvd0FjdHVhbFNpemVDaGFuZ2VkPW5ldyBMaH1vblNjYWxhclNtb290aGluZ0lucHV0KHQpe2NvbnN0IGU9dC50YXJnZXQ7aWYoIWUudmFsdWUpcmV0dXJuO2NvbnN0IG49TWF0aC5taW4oTWF0aC5tYXgoMCxwYXJzZUZsb2F0KGUudmFsdWUpKSwuOTk5KTtuIT09cGFyc2VGbG9hdChlLnZhbHVlKSYmKGUudmFsdWU9U3RyaW5nKG4pKSx0aGlzLnNjYWxhclNtb290aGluZ0NvbnRyb2xDaGFuZ2VkJC5lbWl0KG4pfWZvcm1hdE1pbGxpVG9aZXJvdGgodCl7cmV0dXJuIFFDKHQvMWUzLHRoaXMubG9jYWxlfHwiZW4tVVMiLCIxLjAtMiIpfW9uU3RlcFN0YXJ0Q2hhbmdlZCh0KXt0aGlzLnNlbGVjdFRpbWVDaGFuZ2VkLmVtaXQoe3N0YXJ0OntzdGVwOnR9LGVuZDpudWxsfSl9b25TdGVwUmFuZ2VDaGFuZ2VkKHtsb3dlclZhbHVlOnQsdXBwZXJWYWx1ZTplfSl7dGhpcy5zZWxlY3RUaW1lQ2hhbmdlZC5lbWl0KHtzdGFydDp7c3RlcDp0fSxlbmQ6e3N0ZXA6ZX19KX19cmh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxyaHQpKFNtKFd5KSl9LHJodC7JtWNtcD10byh7dHlwZTpyaHQsc2VsZWN0b3JzOltbIm1ldHJpY3MtZGFzaGJvYXJkLXNldHRpbmdzLWNvbXBvbmVudCJdXSxpbnB1dHM6e2lzTGlua2VkVGltZUZlYXR1cmVFbmFibGVkOiJpc0xpbmtlZFRpbWVGZWF0dXJlRW5hYmxlZCIsc2VsZWN0VGltZUVuYWJsZWQ6InNlbGVjdFRpbWVFbmFibGVkIix1c2VSYW5nZVNlbGVjdFRpbWU6InVzZVJhbmdlU2VsZWN0VGltZSIsc2VsZWN0ZWRUaW1lOiJzZWxlY3RlZFRpbWUiLHN0ZXBNaW5NYXg6InN0ZXBNaW5NYXgiLGlzSW1hZ2VTdXBwb3J0RW5hYmxlZDoiaXNJbWFnZVN1cHBvcnRFbmFibGVkIix0b29sdGlwU29ydDoidG9vbHRpcFNvcnQiLGlnbm9yZU91dGxpZXJzOiJpZ25vcmVPdXRsaWVycyIseEF4aXNUeXBlOiJ4QXhpc1R5cGUiLGhpc3RvZ3JhbU1vZGU6Imhpc3RvZ3JhbU1vZGUiLHNjYWxhclNtb290aGluZzoic2NhbGFyU21vb3RoaW5nIixzY2FsYXJQYXJ0aXRpb25YOiJzY2FsYXJQYXJ0aXRpb25YIixpbWFnZUJyaWdodG5lc3NJbk1pbGxpOiJpbWFnZUJyaWdodG5lc3NJbk1pbGxpIixpbWFnZUNvbnRyYXN0SW5NaWxsaToiaW1hZ2VDb250cmFzdEluTWlsbGkiLGltYWdlU2hvd0FjdHVhbFNpemU6ImltYWdlU2hvd0FjdHVhbFNpemUifSxvdXRwdXRzOntzZWxlY3RUaW1lRW5hYmxlVG9nZ2xlZDoic2VsZWN0VGltZUVuYWJsZVRvZ2dsZWQiLHVzZVJhbmdlU2VsZWN0VGltZVRvZ2dsZWQ6InVzZVJhbmdlU2VsZWN0VGltZVRvZ2dsZWQiLHNlbGVjdFRpbWVDaGFuZ2VkOiJzZWxlY3RUaW1lQ2hhbmdlZCIsdG9vbHRpcFNvcnRDaGFuZ2VkOiJ0b29sdGlwU29ydENoYW5nZWQiLGlnbm9yZU91dGxpZXJzQ2hhbmdlZDoiaWdub3JlT3V0bGllcnNDaGFuZ2VkIix4QXhpc1R5cGVDaGFuZ2VkOiJ4QXhpc1R5cGVDaGFuZ2VkIixoaXN0b2dyYW1Nb2RlQ2hhbmdlZDoiaGlzdG9ncmFtTW9kZUNoYW5nZWQiLHNjYWxhclNtb290aGluZ0NoYW5nZWQ6InNjYWxhclNtb290aGluZ0NoYW5nZWQiLHNjYWxhclBhcnRpdGlvblhUb2dnbGVkOiJzY2FsYXJQYXJ0aXRpb25YVG9nZ2xlZCIsaW1hZ2VCcmlnaHRuZXNzSW5NaWxsaUNoYW5nZWQ6ImltYWdlQnJpZ2h0bmVzc0luTWlsbGlDaGFuZ2VkIixpbWFnZUJyaWdodG5lc3NSZXNldDoiaW1hZ2VCcmlnaHRuZXNzUmVzZXQiLGltYWdlQ29udHJhc3RJbk1pbGxpQ2hhbmdlZDoiaW1hZ2VDb250cmFzdEluTWlsbGlDaGFuZ2VkIixpbWFnZUNvbnRyYXN0UmVzZXQ6ImltYWdlQ29udHJhc3RSZXNldCIsaW1hZ2VTaG93QWN0dWFsU2l6ZUNoYW5nZWQ6ImltYWdlU2hvd0FjdHVhbFNpemVDaGFuZ2VkIn0sZGVjbHM6MzYsdmFyczoxNyxjb25zdHM6ZnVuY3Rpb24oKXtsZXQgdCxlO3JldHVybiB0PSJ1bmRlZmluZWQiIT10eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUmJm5nSTE4bkNsb3N1cmVNb2RlP2dvb2cuZ2V0TXNnKCJSZXNldCBicmlnaHRuZXNzIik6JGxvY2FsaXplYDpBIGJ1dHRvbiB0byByZXNldCB0aGUgaW1hZ2UgYnJpZ2h0bmVzcyBzZXR0aW5n4pCfYzQ4MmIzYTQ3ZWEwOTc1ZmE4YmUwMWFmYjNmYmVjOWI3NjYyOGJkN+KQnzExODkxNjE4NTcyNDAzNzgzOTU6UmVzZXQgYnJpZ2h0bmVzc2AsZT0idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZT9nb29nLmdldE1zZygiUmVzZXQgY29udHJhc3QiKTokbG9jYWxpemVgOkEgYnV0dG9uIHRvIHJlc2V0IHRoZSBpbWFnZSBjb250cmFzdCBzZXR0aW5n4pCfZWQ3MTJhOGI5MjcwNDFiZTE1MjUyYjI5ZWI1MjFlYmIxMzc0YmFkOOKQnzUzNzA3MDMzNDI5MjM2MTE5NTU6UmVzZXQgY29udHJhc3RgLFtbMSwiZ2VuZXJhbCJdLFsxLCJzZWN0aW9uLXRpdGxlIl0sWzEsImNvbnRyb2wtcm93IiwieC1heGlzLXR5cGUiXSxbImlkIiwieC1heGlzLXR5cGUtbGFiZWwiLDEsImNvbnRyb2wtbmFtZSJdLFszLCJ2YWx1ZSIsIm9wdGlvbnMiLCJzZWxlY3Rpb25DaGFuZ2UiXSxbImNsYXNzIiwiY29udHJvbC1yb3cgbGlua2VkLXRpbWUiLDQsIm5nSWYiXSxbMSwic2NhbGFycyJdLFsxLCJjb250cm9sLXJvdyIsInNjYWxhcnMtc21vb3RoaW5nIl0sWyJpZCIsInNjYWxhcnMtc21vb3RoaW5nLWxhYmVsIiwxLCJjb250cm9sLW5hbWUiXSxbMSwic2xpZGVyLXJvdyJdLFsiYXJpYS1sYWJlbGxlZGJ5Iiwic2NhbGFycy1zbW9vdGhpbmctbGFiZWwiLCJjb2xvciIsInByaW1hcnkiLDMsIm1heCIsIm1pbiIsInN0ZXAiLCJ2YWx1ZSIsInRodW1iTGFiZWwiLCJpbnB1dCJdLFsiYXJpYS1sYWJlbGxlZGJ5Iiwic2NhbGFycy1zbW9vdGhpbmctbGFiZWwiLCJ0eXBlIiwibnVtYmVyIiwibWluIiwiMCIsInN0ZXAiLCIwLjAwMSIsMSwic2xpZGVyLWlucHV0IiwzLCJtYXgiLCJ2YWx1ZSIsImlucHV0Il0sWzEsImNvbnRyb2wtcm93IiwidG9vbHRpcC1zb3J0Il0sWzEsImNvbnRyb2wtbmFtZSJdLFsxLCJjb250cm9sLXJvdyIsInNjYWxhcnMtaWdub3JlLW91dGxpZXJzIl0sWzMsImNoZWNrZWQiLCJjaGFuZ2UiXSxbMSwiY29udHJvbC1yb3ciLCJzY2FsYXJzLXBhcnRpdGlvbi14Il0sWyJzdmdJY29uIiwiaGVscF9vdXRsaW5lXzI0cHgiLCJ0aXRsZSIsIk5vbi1tb25vdG9uaWMgc3RlcHMgY2FuIG9jY3VyIHdoZW4gcmV1c2luZyBhIGxvZ2RpciB3aXRoIG11bHRpcGxlIHN1bW1hcnkgd3JpdGVycyBhbmQgb3ZlcmxhcHBpbmcgc3RlcHMuIExpbmUgY2hhcnRzLCB3aXRob3V0IHRoaXMgb3B0aW9uIGVuYWJsZWQsIGNhbiBhcHBlYXIgemlnIHphZ2dlZC4gVGhpcyBpcyBjb21tb24gd2hlbiByZXN0YXJ0aW5nIGZyb20gYSBjaGVja3BvaW50LlxuXG5XaGVuIGVuYWJsZWQsIGEgbm9uLW1vbm90b25pYyB0aW1lIHNlcmllcyBjb21wb3NlZCBvZiBOIG1vbm90b25pYyBwaWVjZXMgd2lsbCBiZSBzaG93biBhcyBOIG1vbm90b25pYyBsaW5lcy4iLDEsImluZm8iXSxbMSwiSGlzdG9ncmFtcyJdLFsxLCJjb250cm9sLXJvdyIsImhpc3RvZ3JhbS1tb2RlIl0sWyJjbGFzcyIsImltYWdlIiw0LCJuZ0lmIl0sWzEsImNvbnRyb2wtcm93IiwibGlua2VkLXRpbWUiXSxbMSwiY29udHJvbHMiXSxbMSwic3RlcC1zZWxlY3RvciJdLFsiY29sb3IiLCJwcmltYXJ5IiwzLCJkaXNhYmxlZCIsIm1pbiIsIm1heCIsInN0ZXAiLCJ2YWx1ZSIsInRodW1iTGFiZWwiLCJpbnB1dCIsNCwibmdJZiIsIm5nSWZFbHNlIl0sWyJyYW5nZSIsIiJdLFsiY29sb3IiLCJwcmltYXJ5IiwzLCJkaXNhYmxlZCIsIm1pbiIsIm1heCIsInN0ZXAiLCJ2YWx1ZSIsInRodW1iTGFiZWwiLCJpbnB1dCJdLFszLCJtaW4iLCJtYXgiLCJsb3dlclZhbHVlIiwidXBwZXJWYWx1ZSIsInZhbHVlIl0sWzEsImltYWdlIl0sWzEsImNvbnRyb2wtcm93IiwiaW1hZ2UtYnJpZ2h0bmVzcyJdLFsiaWQiLCJpbWFnZS1icmlnaHRuZXNzLWxhYmVsIiwxLCJjb250cm9sLW5hbWUiXSxbImFyaWEtbGFiZWxsZWRieSIsImltYWdlLWJyaWdodG5lc3MtbGFiZWwiLCJjb2xvciIsInByaW1hcnkiLDMsIm1heCIsIm1pbiIsInN0ZXAiLCJ2YWx1ZSIsInRodW1iTGFiZWwiLCJkaXNwbGF5V2l0aCIsImlucHV0Il0sWyJtYXQtaWNvbi1idXR0b24iLCIiLCJhcmlhLWxhYmVsIix0LCJ0aXRsZSIsIlJlc2V0IGJyaWdodG5lc3MiLDEsInJlc2V0LWJ1dHRvbiIsMywiY2xpY2siXSxbInN2Z0ljb24iLCJzZXR0aW5nc19iYWNrdXBfcmVzdG9yZV8yNHB4Il0sWzEsImNvbnRyb2wtcm93IiwiaW1hZ2UtY29udHJhc3QiXSxbImlkIiwiaW1hZ2UtY29uc3RyYXN0LWxhYmVsIiwxLCJjb250cm9sLW5hbWUiXSxbImFyaWEtbGFiZWxsZWRieSIsImltYWdlLWNvbnN0cmFzdC1sYWJlbCIsImNvbG9yIiwicHJpbWFyeSIsMywibWF4IiwibWluIiwic3RlcCIsInZhbHVlIiwidGh1bWJMYWJlbCIsImRpc3BsYXlXaXRoIiwiaW5wdXQiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLGUsInRpdGxlIiwiUmVzZXQgY29udHJhc3QiLDEsInJlc2V0LWJ1dHRvbiIsMywiY2xpY2siXSxbMSwiY29udHJvbC1yb3ciLCJpbWFnZS1zaG93LWFjdHVhbC1zaXplIl1dfSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwic2VjdGlvbiIsMCksUm0oMSwiaDMiLDEpLGt1KDIsIkdlbmVyYWwiKSxBbSgpLFJtKDMsImRpdiIsMiksUm0oNCwiZGl2IiwzKSxrdSg1LCJIb3Jpem9udGFsIEF4aXMiKSxBbSgpLFJtKDYsInRiLWRyb3Bkb3duIiw0KSxWbSgic2VsZWN0aW9uQ2hhbmdlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi54QXhpc1R5cGVDaGFuZ2VkLmVtaXQoZSl9KSksQW0oKSxBbSgpLFFwKDcsaWh0LDE0LDQsImRpdiIsNSksQW0oKSxSbSg4LCJzZWN0aW9uIiw2KSxSbSg5LCJoMyIsMSksa3UoMTAsIlNjYWxhcnMiKSxBbSgpLFJtKDExLCJkaXYiLDcpLFJtKDEyLCJkaXYiLDgpLGt1KDEzLCJTbW9vdGhpbmciKSxBbSgpLFJtKDE0LCJkaXYiLDkpLFJtKDE1LCJtYXQtc2xpZGVyIiwxMCksVm0oImlucHV0IiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5zY2FsYXJTbW9vdGhpbmdDb250cm9sQ2hhbmdlZCQuZW1pdChlLnZhbHVlKX0pKSxBbSgpLFJtKDE2LCJpbnB1dCIsMTEpLFZtKCJpbnB1dCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25TY2FsYXJTbW9vdGhpbmdJbnB1dChlKX0pKSxBbSgpLEFtKCksQW0oKSxSbSgxNywiZGl2IiwxMiksUm0oMTgsImRpdiIsMTMpLGt1KDE5LCJUb29sdGlwIHNvcnRpbmcgbWV0aG9kIiksQW0oKSxSbSgyMCwidGItZHJvcGRvd24iLDQpLFZtKCJzZWxlY3Rpb25DaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLnRvb2x0aXBTb3J0Q2hhbmdlZC5lbWl0KGUpfSkpLEFtKCksQW0oKSxSbSgyMSwiZGl2IiwxNCksUm0oMjIsIm1hdC1jaGVja2JveCIsMTUpLFZtKCJjaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLmlnbm9yZU91dGxpZXJzQ2hhbmdlZC5lbWl0KGUuY2hlY2tlZCl9KSksa3UoMjMsIklnbm9yZSBvdXRsaWVycyBpbiBjaGFydCBzY2FsaW5nIiksQW0oKSxBbSgpLFJtKDI0LCJkaXYiLDE2KSxSbSgyNSwibWF0LWNoZWNrYm94IiwxNSksVm0oImNoYW5nZSIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5zY2FsYXJQYXJ0aXRpb25YVG9nZ2xlZC5lbWl0KCl9KSksa3UoMjYsIlBhcnRpdGlvbiBub24tbW9ub3RvbmljIFggYXhpcyIpLEFtKCksVG0oMjcsIm1hdC1pY29uIiwxNyksQW0oKSxBbSgpLFJtKDI4LCJzZWN0aW9uIiwxOCksUm0oMjksImgzIiwxKSxrdSgzMCwiSGlzdG9ncmFtcyIpLEFtKCksUm0oMzEsImRpdiIsMTkpLFJtKDMyLCJkaXYiLDEzKSxrdSgzMywiTW9kZSIpLEFtKCksUm0oMzQsInRiLWRyb3Bkb3duIiw0KSxWbSgic2VsZWN0aW9uQ2hhbmdlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5oaXN0b2dyYW1Nb2RlQ2hhbmdlZC5lbWl0KGUpfSkpLEFtKCksQW0oKSxBbSgpLFFwKDM1LGFodCwyMCwxMywic2VjdGlvbiIsMjApKSwyJmUmJihyYyg2KSxEbSgidmFsdWUiLG4ueEF4aXNUeXBlKSgib3B0aW9ucyIsbi5YQXhpc1R5cGVEcm9wZG93bk9wdGlvbnMpLHJjKDEpLERtKCJuZ0lmIixuLmlzTGlua2VkVGltZUZlYXR1cmVFbmFibGVkJiZuLnhBeGlzVHlwZT09bi5YQXhpc1R5cGUuU1RFUCkscmMoOCksRG0oIm1heCIsbi5NQVhfU01PT1RISU5HX1NMSURFUl9WQUxVRSkoIm1pbiIsMCkoInN0ZXAiLC4wMSkoInZhbHVlIixuLnNjYWxhclNtb290aGluZykoInRodW1iTGFiZWwiLCEwKSxyYygxKSxEbSgibWF4IixuLk1BWF9TTU9PVEhJTkdfVkFMVUUpKCJ2YWx1ZSIsbi5zY2FsYXJTbW9vdGhpbmcpLHJjKDQpLERtKCJ2YWx1ZSIsbi50b29sdGlwU29ydCkoIm9wdGlvbnMiLG4uVG9vbHRpcFNvcnREcm9wZG93bk9wdGlvbnMpLHJjKDIpLERtKCJjaGVja2VkIixuLmlnbm9yZU91dGxpZXJzKSxyYygzKSxEbSgiY2hlY2tlZCIsbi5zY2FsYXJQYXJ0aXRpb25YKSxyYyg5KSxEbSgidmFsdWUiLG4uaGlzdG9ncmFtTW9kZSkoIm9wdGlvbnMiLG4uSGlzdG9ncmFtTW9kZURyb3Bkb3duT3B0aW9ucykscmMoMSksRG0oIm5nSWYiLG4uaXNJbWFnZVN1cHBvcnRFbmFibGVkKSl9LGRpcmVjdGl2ZXM6W2VodCxkTSxSWCxPWSxEVyxEMSxYSF0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9W19uZ2hvc3QtJUNPTVAlXXtjb2xvcjojNjE2MTYxO2ZvbnQtc2l6ZToxMnB4fWJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1zZWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmViO3BhZGRpbmc6MTZweH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICBzZWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgc2VjdGlvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzU1NX0uc2VjdGlvbi10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Zm9udC13ZWlnaHQ6NTAwO2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0Om5vcm1hbDttYXJnaW46MCAwIDEycHggMH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuc2VjdGlvbi10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5zZWN0aW9uLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVdICAgLmNvbnRyb2wtcm93W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhc3QtY2hpbGQpe21hcmdpbi1ib3R0b206MTJweH0uY29udHJvbC1uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOjhweH0uc2xpZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtoZWlnaHQ6MjhweH0uc2xpZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0gICAucmVzZXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDo2cHh9LnNsaWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdICAgLnNsaWRlci1pbnB1dFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjppbmhlcml0O2JvcmRlcjoxcHggc29saWQgIzhlOThhMztib3JkZXItcmFkaXVzOjJweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7Y29sb3I6aW5oZXJpdDtoZWlnaHQ6MTAwJTttYXJnaW4tbGVmdDoxMnB4O3BhZGRpbmc6MCA0cHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLnNsaWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdICAgLnNsaWRlci1pbnB1dFtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5zbGlkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5zbGlkZXItaW5wdXRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNDI1MDY2fS5zY2FsYXJzLXNtb290aGluZ1tfbmdjb250ZW50LSVDT01QJV0gICAuc2xpZGVyLWlucHV0W19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4Om5vbmU7d2lkdGg6NWVtfS5zY2FsYXJzLXBhcnRpdGlvbi14W19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4fS5zY2FsYXJzLXBhcnRpdGlvbi14W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5pbmZvW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTVweDttYXJnaW4tbGVmdDo1cHg7d2lkdGg6MTVweH1tYXQtc2xpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4OjE7bWFyZ2luLWxlZnQ6LThweDttYXJnaW4tcmlnaHQ6LThweH10Yi1kcm9wZG93bltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpibG9ja30ubGlua2VkLXRpbWVbX25nY29udGVudC0lQ09NUCVdICAgLnN0ZXAtc2VsZWN0b3JbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MCAxMHB4fS5saW5rZWQtdGltZVtfbmdjb250ZW50LSVDT01QJV0gICBtYXQtc2xpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmxpbmtlZC10aW1lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRiLXJhbmdlLWlucHV0W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlfS5saW5rZWQtdGltZVtfbmdjb250ZW50LSVDT01QJV0gICAuY29udHJvbHNbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6NXB4fSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChyaHQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWV0cmljcy1kYXNoYm9hcmQtc2V0dGluZ3MtY29tcG9uZW50Iix0ZW1wbGF0ZVVybDoic2V0dGluZ3Nfdmlld19jb21wb25lbnQubmcuaHRtbCIsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaCxzdHlsZVVybHM6WyJzZXR0aW5nc192aWV3X2NvbXBvbmVudC5jc3MiXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltXeV19XX1dfSkse2lzTGlua2VkVGltZUZlYXR1cmVFbmFibGVkOlt7dHlwZTp4eX1dLHNlbGVjdFRpbWVFbmFibGVkOlt7dHlwZTp4eX1dLHVzZVJhbmdlU2VsZWN0VGltZTpbe3R5cGU6eHl9XSxzZWxlY3RlZFRpbWU6W3t0eXBlOnh5fV0sc3RlcE1pbk1heDpbe3R5cGU6eHl9XSxzZWxlY3RUaW1lRW5hYmxlVG9nZ2xlZDpbe3R5cGU6T3l9XSx1c2VSYW5nZVNlbGVjdFRpbWVUb2dnbGVkOlt7dHlwZTpPeX1dLHNlbGVjdFRpbWVDaGFuZ2VkOlt7dHlwZTpPeX1dLGlzSW1hZ2VTdXBwb3J0RW5hYmxlZDpbe3R5cGU6eHl9XSx0b29sdGlwU29ydDpbe3R5cGU6eHl9XSx0b29sdGlwU29ydENoYW5nZWQ6W3t0eXBlOk95fV0saWdub3JlT3V0bGllcnM6W3t0eXBlOnh5fV0saWdub3JlT3V0bGllcnNDaGFuZ2VkOlt7dHlwZTpPeX1dLHhBeGlzVHlwZTpbe3R5cGU6eHl9XSx4QXhpc1R5cGVDaGFuZ2VkOlt7dHlwZTpPeX1dLGhpc3RvZ3JhbU1vZGU6W3t0eXBlOnh5fV0saGlzdG9ncmFtTW9kZUNoYW5nZWQ6W3t0eXBlOk95fV0sc2NhbGFyU21vb3RoaW5nOlt7dHlwZTp4eX1dLHNjYWxhclNtb290aGluZ0NoYW5nZWQ6W3t0eXBlOk95fV0sc2NhbGFyUGFydGl0aW9uWDpbe3R5cGU6eHl9XSxzY2FsYXJQYXJ0aXRpb25YVG9nZ2xlZDpbe3R5cGU6T3l9XSxpbWFnZUJyaWdodG5lc3NJbk1pbGxpOlt7dHlwZTp4eX1dLGltYWdlQnJpZ2h0bmVzc0luTWlsbGlDaGFuZ2VkOlt7dHlwZTpPeX1dLGltYWdlQnJpZ2h0bmVzc1Jlc2V0Olt7dHlwZTpPeX1dLGltYWdlQ29udHJhc3RJbk1pbGxpOlt7dHlwZTp4eX1dLGltYWdlQ29udHJhc3RJbk1pbGxpQ2hhbmdlZDpbe3R5cGU6T3l9XSxpbWFnZUNvbnRyYXN0UmVzZXQ6W3t0eXBlOk95fV0saW1hZ2VTaG93QWN0dWFsU2l6ZTpbe3R5cGU6eHl9XSxpbWFnZVNob3dBY3R1YWxTaXplQ2hhbmdlZDpbe3R5cGU6T3l9XX0pO2NsYXNzIHNodHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5pc0xpbmtlZFRpbWVGZWF0dXJlRW5hYmxlZCQ9dGhpcy5zdG9yZS5zZWxlY3QoaUUpLHRoaXMuc2VsZWN0VGltZUVuYWJsZWQkPXRoaXMuc3RvcmUuc2VsZWN0KGpUKSx0aGlzLnVzZVJhbmdlU2VsZWN0VGltZSQ9dGhpcy5zdG9yZS5zZWxlY3QoVVQpLHRoaXMuc2VsZWN0ZWRUaW1lJD10aGlzLnN0b3JlLnNlbGVjdChXVCksdGhpcy5zdGVwTWluTWF4JD10aGlzLnN0b3JlLnNlbGVjdChHVCksdGhpcy5pc0ltYWdlU3VwcG9ydEVuYWJsZWQkPXRoaXMuc3RvcmUuc2VsZWN0KHFEKS5waXBlKGNlKEJvb2xlYW4pLGJlKDEpLFZlKHRoaXMuc3RvcmUuc2VsZWN0KG9FKSksSXQoKChbLHRdKT0+dCkpKSx0aGlzLnRvb2x0aXBTb3J0JD10aGlzLnN0b3JlLnNlbGVjdChSVCksdGhpcy5pZ25vcmVPdXRsaWVycyQ9dGhpcy5zdG9yZS5zZWxlY3QoQVQpLHRoaXMueEF4aXNUeXBlJD10aGlzLnN0b3JlLnNlbGVjdChUVCksdGhpcy5oaXN0b2dyYW1Nb2RlJD10aGlzLnN0b3JlLnNlbGVjdChOVCksdGhpcy5zY2FsYXJTbW9vdGhpbmckPXRoaXMuc3RvcmUuc2VsZWN0KHpUKSx0aGlzLnNjYWxhclBhcnRpdGlvblgkPXRoaXMuc3RvcmUuc2VsZWN0KElUKSx0aGlzLmltYWdlQnJpZ2h0bmVzc0luTWlsbGkkPXRoaXMuc3RvcmUuc2VsZWN0KEhUKSx0aGlzLmltYWdlQ29udHJhc3RJbk1pbGxpJD10aGlzLnN0b3JlLnNlbGVjdChGVCksdGhpcy5pbWFnZVNob3dBY3R1YWxTaXplJD10aGlzLnN0b3JlLnNlbGVjdChMVCl9b25Ub29sdGlwU29ydENoYW5nZWQodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChMRSh7c29ydDp0fSkpfW9uSWdub3JlT3V0bGllcnNDaGFuZ2VkKCl7dGhpcy5zdG9yZS5kaXNwYXRjaChCRSgpKX1vblhBeGlzVHlwZUNoYW5nZWQodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChWRSh7eEF4aXNUeXBlOnR9KSl9b25IaXN0b2dyYW1Nb2RlQ2hhbmdlZCh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKFhFKHtoaXN0b2dyYW1Nb2RlOnR9KSl9b25TY2FsYXJTbW9vdGhpbmdDaGFuZ2VkKHQpe3RoaXMuc3RvcmUuZGlzcGF0Y2goakUoe3Ntb290aGluZzp0fSkpfW9uU2NhbGFyUGFydGl0aW9uWFRvZ2dsZWQoKXt0aGlzLnN0b3JlLmRpc3BhdGNoKFVFKCkpfW9uSW1hZ2VCcmlnaHRuZXNzSW5NaWxsaUNoYW5nZWQodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChHRSh7YnJpZ2h0bmVzc0luTWlsbGk6dH0pKX1vbkltYWdlQnJpZ2h0bmVzc1Jlc2V0KCl7dGhpcy5zdG9yZS5kaXNwYXRjaChZRSgpKX1vbkltYWdlQ29udHJhc3RSZXNldCgpe3RoaXMuc3RvcmUuZGlzcGF0Y2gocUUoKSl9b25JbWFnZUNvbnRyYXN0SW5NaWxsaUNoYW5nZWQodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChXRSh7Y29udHJhc3RJbk1pbGxpOnR9KSl9b25JbWFnZVNob3dBY3R1YWxTaXplQ2hhbmdlZCgpe3RoaXMuc3RvcmUuZGlzcGF0Y2goWkUoKSl9b25TZWxlY3RUaW1lRW5hYmxlVG9nZ2xlZCgpe3RoaXMuc3RvcmUuZGlzcGF0Y2gobFIoKSl9b25Vc2VSYW5nZVNlbGVjdFRpbWVUb2dnbGVkKCl7dGhpcy5zdG9yZS5kaXNwYXRjaChjUigpKX1vblNlbGVjdFRpbWVDaGFuZ2VkKHQpe3ZhciBlO3RoaXMuc3RvcmUuZGlzcGF0Y2goclIoe3N0YXJ0U3RlcDp0LnN0YXJ0LnN0ZXAsZW5kU3RlcDpudWxsPT09KGU9dC5lbmQpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnN0ZXB9KSl9fXNodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8c2h0KShTbShJdykpfSxzaHQuybVjbXA9dG8oe3R5cGU6c2h0LHNlbGVjdG9yczpbWyJtZXRyaWNzLWRhc2hib2FyZC1zZXR0aW5ncyJdXSxkZWNsczoxNix2YXJzOjQ1LGNvbnN0czpbWzMsImlzSW1hZ2VTdXBwb3J0RW5hYmxlZCIsInRvb2x0aXBTb3J0IiwiaWdub3JlT3V0bGllcnMiLCJ4QXhpc1R5cGUiLCJoaXN0b2dyYW1Nb2RlIiwic2NhbGFyU21vb3RoaW5nIiwic2NhbGFyUGFydGl0aW9uWCIsImltYWdlQnJpZ2h0bmVzc0luTWlsbGkiLCJpbWFnZUNvbnRyYXN0SW5NaWxsaSIsImltYWdlU2hvd0FjdHVhbFNpemUiLCJpc0xpbmtlZFRpbWVGZWF0dXJlRW5hYmxlZCIsInNlbGVjdFRpbWVFbmFibGVkIiwic2VsZWN0ZWRUaW1lIiwidXNlUmFuZ2VTZWxlY3RUaW1lIiwic3RlcE1pbk1heCIsInRvb2x0aXBTb3J0Q2hhbmdlZCIsImlnbm9yZU91dGxpZXJzQ2hhbmdlZCIsInhBeGlzVHlwZUNoYW5nZWQiLCJoaXN0b2dyYW1Nb2RlQ2hhbmdlZCIsInNjYWxhclNtb290aGluZ0NoYW5nZWQiLCJzY2FsYXJQYXJ0aXRpb25YVG9nZ2xlZCIsImltYWdlQnJpZ2h0bmVzc0luTWlsbGlDaGFuZ2VkIiwiaW1hZ2VCcmlnaHRuZXNzUmVzZXQiLCJpbWFnZUNvbnRyYXN0SW5NaWxsaUNoYW5nZWQiLCJpbWFnZUNvbnRyYXN0UmVzZXQiLCJpbWFnZVNob3dBY3R1YWxTaXplQ2hhbmdlZCIsInNlbGVjdFRpbWVFbmFibGVUb2dnbGVkIiwidXNlUmFuZ2VTZWxlY3RUaW1lVG9nZ2xlZCIsInNlbGVjdFRpbWVDaGFuZ2VkIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJtZXRyaWNzLWRhc2hib2FyZC1zZXR0aW5ncy1jb21wb25lbnQiLDApLFZtKCJ0b29sdGlwU29ydENoYW5nZWQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uVG9vbHRpcFNvcnRDaGFuZ2VkKGUpfSkpKCJpZ25vcmVPdXRsaWVyc0NoYW5nZWQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25JZ25vcmVPdXRsaWVyc0NoYW5nZWQoKX0pKSgieEF4aXNUeXBlQ2hhbmdlZCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25YQXhpc1R5cGVDaGFuZ2VkKGUpfSkpKCJoaXN0b2dyYW1Nb2RlQ2hhbmdlZCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25IaXN0b2dyYW1Nb2RlQ2hhbmdlZChlKX0pKSgic2NhbGFyU21vb3RoaW5nQ2hhbmdlZCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25TY2FsYXJTbW9vdGhpbmdDaGFuZ2VkKGUpfSkpKCJzY2FsYXJQYXJ0aXRpb25YVG9nZ2xlZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblNjYWxhclBhcnRpdGlvblhUb2dnbGVkKCl9KSkoImltYWdlQnJpZ2h0bmVzc0luTWlsbGlDaGFuZ2VkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vbkltYWdlQnJpZ2h0bmVzc0luTWlsbGlDaGFuZ2VkKGUpfSkpKCJpbWFnZUJyaWdodG5lc3NSZXNldCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkltYWdlQnJpZ2h0bmVzc1Jlc2V0KCl9KSkoImltYWdlQ29udHJhc3RJbk1pbGxpQ2hhbmdlZCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25JbWFnZUNvbnRyYXN0SW5NaWxsaUNoYW5nZWQoZSl9KSkoImltYWdlQ29udHJhc3RSZXNldCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkltYWdlQ29udHJhc3RSZXNldCgpfSkpKCJpbWFnZVNob3dBY3R1YWxTaXplQ2hhbmdlZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkltYWdlU2hvd0FjdHVhbFNpemVDaGFuZ2VkKCl9KSkoInNlbGVjdFRpbWVFbmFibGVUb2dnbGVkIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uU2VsZWN0VGltZUVuYWJsZVRvZ2dsZWQoKX0pKSgidXNlUmFuZ2VTZWxlY3RUaW1lVG9nZ2xlZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblVzZVJhbmdlU2VsZWN0VGltZVRvZ2dsZWQoKX0pKSgic2VsZWN0VGltZUNoYW5nZWQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uU2VsZWN0VGltZUNoYW5nZWQoZSl9KSksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQWgoNCwiYXN5bmMiKSxBaCg1LCJhc3luYyIpLEFoKDYsImFzeW5jIiksQWgoNywiYXN5bmMiKSxBaCg4LCJhc3luYyIpLEFoKDksImFzeW5jIiksQWgoMTAsImFzeW5jIiksQWgoMTEsImFzeW5jIiksQWgoMTIsImFzeW5jIiksQWgoMTMsImFzeW5jIiksQWgoMTQsImFzeW5jIiksQWgoMTUsImFzeW5jIiksQW0oKSksMiZlJiZEbSgiaXNJbWFnZVN1cHBvcnRFbmFibGVkIixUaCgxLDE1LG4uaXNJbWFnZVN1cHBvcnRFbmFibGVkJCkpKCJ0b29sdGlwU29ydCIsVGgoMiwxNyxuLnRvb2x0aXBTb3J0JCkpKCJpZ25vcmVPdXRsaWVycyIsVGgoMywxOSxuLmlnbm9yZU91dGxpZXJzJCkpKCJ4QXhpc1R5cGUiLFRoKDQsMjEsbi54QXhpc1R5cGUkKSkoImhpc3RvZ3JhbU1vZGUiLFRoKDUsMjMsbi5oaXN0b2dyYW1Nb2RlJCkpKCJzY2FsYXJTbW9vdGhpbmciLFRoKDYsMjUsbi5zY2FsYXJTbW9vdGhpbmckKSkoInNjYWxhclBhcnRpdGlvblgiLFRoKDcsMjcsbi5zY2FsYXJQYXJ0aXRpb25YJCkpKCJpbWFnZUJyaWdodG5lc3NJbk1pbGxpIixUaCg4LDI5LG4uaW1hZ2VCcmlnaHRuZXNzSW5NaWxsaSQpKSgiaW1hZ2VDb250cmFzdEluTWlsbGkiLFRoKDksMzEsbi5pbWFnZUNvbnRyYXN0SW5NaWxsaSQpKSgiaW1hZ2VTaG93QWN0dWFsU2l6ZSIsVGgoMTAsMzMsbi5pbWFnZVNob3dBY3R1YWxTaXplJCkpKCJpc0xpbmtlZFRpbWVGZWF0dXJlRW5hYmxlZCIsVGgoMTEsMzUsbi5pc0xpbmtlZFRpbWVGZWF0dXJlRW5hYmxlZCQpKSgic2VsZWN0VGltZUVuYWJsZWQiLFRoKDEyLDM3LG4uc2VsZWN0VGltZUVuYWJsZWQkKSkoInNlbGVjdGVkVGltZSIsVGgoMTMsMzksbi5zZWxlY3RlZFRpbWUkKSkoInVzZVJhbmdlU2VsZWN0VGltZSIsVGgoMTQsNDEsbi51c2VSYW5nZVNlbGVjdFRpbWUkKSkoInN0ZXBNaW5NYXgiLFRoKDE1LDQzLG4uc3RlcE1pbk1heCQpKX0sZGlyZWN0aXZlczpbcmh0XSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoc2h0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1ldHJpY3MtZGFzaGJvYXJkLXNldHRpbmdzIix0ZW1wbGF0ZTonXG4gICAgPG1ldHJpY3MtZGFzaGJvYXJkLXNldHRpbmdzLWNvbXBvbmVudFxuICAgICAgW2lzSW1hZ2VTdXBwb3J0RW5hYmxlZF09ImlzSW1hZ2VTdXBwb3J0RW5hYmxlZCQgfCBhc3luYyJcbiAgICAgIFt0b29sdGlwU29ydF09InRvb2x0aXBTb3J0JCB8IGFzeW5jIlxuICAgICAgKHRvb2x0aXBTb3J0Q2hhbmdlZCk9Im9uVG9vbHRpcFNvcnRDaGFuZ2VkKCRldmVudCkiXG4gICAgICBbaWdub3JlT3V0bGllcnNdPSJpZ25vcmVPdXRsaWVycyQgfCBhc3luYyJcbiAgICAgIChpZ25vcmVPdXRsaWVyc0NoYW5nZWQpPSJvbklnbm9yZU91dGxpZXJzQ2hhbmdlZCgpIlxuICAgICAgW3hBeGlzVHlwZV09InhBeGlzVHlwZSQgfCBhc3luYyJcbiAgICAgICh4QXhpc1R5cGVDaGFuZ2VkKT0ib25YQXhpc1R5cGVDaGFuZ2VkKCRldmVudCkiXG4gICAgICBbaGlzdG9ncmFtTW9kZV09Imhpc3RvZ3JhbU1vZGUkIHwgYXN5bmMiXG4gICAgICAoaGlzdG9ncmFtTW9kZUNoYW5nZWQpPSJvbkhpc3RvZ3JhbU1vZGVDaGFuZ2VkKCRldmVudCkiXG4gICAgICBbc2NhbGFyU21vb3RoaW5nXT0ic2NhbGFyU21vb3RoaW5nJCB8IGFzeW5jIlxuICAgICAgKHNjYWxhclNtb290aGluZ0NoYW5nZWQpPSJvblNjYWxhclNtb290aGluZ0NoYW5nZWQoJGV2ZW50KSJcbiAgICAgIFtzY2FsYXJQYXJ0aXRpb25YXT0ic2NhbGFyUGFydGl0aW9uWCQgfCBhc3luYyJcbiAgICAgIChzY2FsYXJQYXJ0aXRpb25YVG9nZ2xlZCk9Im9uU2NhbGFyUGFydGl0aW9uWFRvZ2dsZWQoKSJcbiAgICAgIFtpbWFnZUJyaWdodG5lc3NJbk1pbGxpXT0iaW1hZ2VCcmlnaHRuZXNzSW5NaWxsaSQgfCBhc3luYyJcbiAgICAgIChpbWFnZUJyaWdodG5lc3NJbk1pbGxpQ2hhbmdlZCk9Im9uSW1hZ2VCcmlnaHRuZXNzSW5NaWxsaUNoYW5nZWQoJGV2ZW50KSJcbiAgICAgIChpbWFnZUJyaWdodG5lc3NSZXNldCk9Im9uSW1hZ2VCcmlnaHRuZXNzUmVzZXQoKSJcbiAgICAgIFtpbWFnZUNvbnRyYXN0SW5NaWxsaV09ImltYWdlQ29udHJhc3RJbk1pbGxpJCB8IGFzeW5jIlxuICAgICAgKGltYWdlQ29udHJhc3RJbk1pbGxpQ2hhbmdlZCk9Im9uSW1hZ2VDb250cmFzdEluTWlsbGlDaGFuZ2VkKCRldmVudCkiXG4gICAgICAoaW1hZ2VDb250cmFzdFJlc2V0KT0ib25JbWFnZUNvbnRyYXN0UmVzZXQoKSJcbiAgICAgIFtpbWFnZVNob3dBY3R1YWxTaXplXT0iaW1hZ2VTaG93QWN0dWFsU2l6ZSQgfCBhc3luYyJcbiAgICAgIChpbWFnZVNob3dBY3R1YWxTaXplQ2hhbmdlZCk9Im9uSW1hZ2VTaG93QWN0dWFsU2l6ZUNoYW5nZWQoKSJcbiAgICAgIFtpc0xpbmtlZFRpbWVGZWF0dXJlRW5hYmxlZF09ImlzTGlua2VkVGltZUZlYXR1cmVFbmFibGVkJCB8IGFzeW5jIlxuICAgICAgW3NlbGVjdFRpbWVFbmFibGVkXT0ic2VsZWN0VGltZUVuYWJsZWQkIHwgYXN5bmMiXG4gICAgICBbc2VsZWN0ZWRUaW1lXT0ic2VsZWN0ZWRUaW1lJCB8IGFzeW5jIlxuICAgICAgW3VzZVJhbmdlU2VsZWN0VGltZV09InVzZVJhbmdlU2VsZWN0VGltZSQgfCBhc3luYyJcbiAgICAgIFtzdGVwTWluTWF4XT0ic3RlcE1pbk1heCQgfCBhc3luYyJcbiAgICAgIChzZWxlY3RUaW1lRW5hYmxlVG9nZ2xlZCk9Im9uU2VsZWN0VGltZUVuYWJsZVRvZ2dsZWQoKSJcbiAgICAgICh1c2VSYW5nZVNlbGVjdFRpbWVUb2dnbGVkKT0ib25Vc2VSYW5nZVNlbGVjdFRpbWVUb2dnbGVkKCkiXG4gICAgICAoc2VsZWN0VGltZUNoYW5nZWQpPSJvblNlbGVjdFRpbWVDaGFuZ2VkKCRldmVudCkiXG4gICAgPlxuICAgIDwvbWV0cmljcy1kYXNoYm9hcmQtc2V0dGluZ3MtY29tcG9uZW50PlxuICAnLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y2xhc3MgbGh0e31mdW5jdGlvbiBjaHQodCxlKXsxJnQmJlRtKDAsIm1ldHJpY3MtZmlsdGVyZWQtdmlldyIsOSksMiZ0JiZEbSgiY2FyZE9ic2VydmVyIixZbSgpLmNhcmRPYnNlcnZlcil9ZnVuY3Rpb24gZGh0KHQsZSl7MSZ0JiYoUm0oMCwiZGl2IiwxMiksVG0oMSwibWF0LXNwaW5uZXIiLDEzKSxBbSgpKX1mdW5jdGlvbiBwaHQodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDE0KSxSbSgxLCJkaXYiLDE1KSxSbSgyLCJoMiIsMTYpLGt1KDMsIlNldHRpbmdzIiksQW0oKSxSbSg0LCJidXR0b24iLDE3KSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLFltKCkub25DbG9zZVNpZGVwYW5lQnV0dG9uQ2xpY2tlZC5lbWl0KCl9KSksVG0oNSwibWF0LWljb24iLDE4KSxBbSgpLEFtKCksVG0oNiwibWV0cmljcy1kYXNoYm9hcmQtcmlnaHQtcGFuZSIpLEFtKCl9fWxodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bGh0KX0sbGh0Lsm1Y21wPXRvKHt0eXBlOmxodCxzZWxlY3RvcnM6W1sibWV0cmljcy1kYXNoYm9hcmQtcmlnaHQtcGFuZSJdXSxkZWNsczoxLHZhcnM6MCx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiZUbSgwLCJtZXRyaWNzLWRhc2hib2FyZC1zZXR0aW5ncyIpfSxkaXJlY3RpdmVzOltzaHRdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobGh0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1ldHJpY3MtZGFzaGJvYXJkLXJpZ2h0LXBhbmUiLHRlbXBsYXRlOiI8bWV0cmljcy1kYXNoYm9hcmQtc2V0dGluZ3M+PC9tZXRyaWNzLWRhc2hib2FyZC1zZXR0aW5ncz4iLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwsbnVsbCk7Y29uc3QgbWh0PWZ1bmN0aW9uKHQpe3JldHVybntjaGVja2VkOnQsInNldHRpbmdzLWJ1dHRvbiI6ITB9fTtjbGFzcyB1aHR7Y29uc3RydWN0b3IodCl7dGhpcy5ob3N0PXQsdGhpcy5vblNldHRpbmdzQnV0dG9uQ2xpY2tlZD1uZXcgTGgsdGhpcy5vbkNsb3NlU2lkZXBhbmVCdXR0b25DbGlja2VkPW5ldyBMaCx0aGlzLm9uUGx1Z2luVHlwZVRvZ2dsZWQ9bmV3IExoLHRoaXMub25QbHVnaW5UeXBlQWxsVG9nZ2xlZD1uZXcgTGgsdGhpcy5QbHVnaW5UeXBlPWhBLHRoaXMuY2FyZE9ic2VydmVyPW5ldyBwMih0aGlzLmhvc3QubmF0aXZlRWxlbWVudCwiNjAwcHggMHB4IDYwMHB4IDBweCIpfX11aHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHVodCkoU20oaGcpKX0sdWh0Lsm1Y21wPXRvKHt0eXBlOnVodCxzZWxlY3RvcnM6W1sibWV0cmljcy1tYWluLXZpZXctY29tcG9uZW50Il1dLGlucHV0czp7c2hvd0ZpbHRlcmVkVmlldzoic2hvd0ZpbHRlcmVkVmlldyIsaXNTaWRlcGFuZU9wZW46ImlzU2lkZXBhbmVPcGVuIixmaWx0ZXJlZFBsdWdpblR5cGVzOiJmaWx0ZXJlZFBsdWdpblR5cGVzIixpbml0aWFsVGFnc0xvYWRpbmc6ImluaXRpYWxUYWdzTG9hZGluZyJ9LG91dHB1dHM6e29uU2V0dGluZ3NCdXR0b25DbGlja2VkOiJvblNldHRpbmdzQnV0dG9uQ2xpY2tlZCIsb25DbG9zZVNpZGVwYW5lQnV0dG9uQ2xpY2tlZDoib25DbG9zZVNpZGVwYW5lQnV0dG9uQ2xpY2tlZCIsb25QbHVnaW5UeXBlVG9nZ2xlZDoib25QbHVnaW5UeXBlVG9nZ2xlZCIsb25QbHVnaW5UeXBlQWxsVG9nZ2xlZDoib25QbHVnaW5UeXBlQWxsVG9nZ2xlZCJ9LGRlY2xzOjIyLHZhcnM6MjEsY29uc3RzOmZ1bmN0aW9uKCl7bGV0IHQsZTtyZXR1cm4gdD0idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZT9nb29nLmdldE1zZygiVG9nZ2xlIHNldHRpbmdzIHNpZGUgcGFuZSIpOiRsb2NhbGl6ZWA6TGFiZWwgb24gYSB0b29sYmFyIGJ1dHRvbiB0byB0b2dnbGUgdGhlIHNldHRpbmdzIHNpZGUgcGFuZS7ikJ9kMzUxNmRiNmJiZTY4NjBhNTViZWFiNjZlNDk2OWRhYzYyNWI4ZDcy4pCfNzY1OTI4NTQ0NTU4MDgzODkyNTpUb2dnbGUgc2V0dGluZ3Mgc2lkZSBwYW5lYCxlPSJ1bmRlZmluZWQiIT10eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUmJm5nSTE4bkNsb3N1cmVNb2RlP2dvb2cuZ2V0TXNnKCJDbG9zZSBzaWRlIHBhbmUiKTokbG9jYWxpemVgOkxhYmVsIG9uIGEgYnV0dG9uIHRvIGNsb3NlIHRoZSBzZXR0aW5ncyBzaWRlIHBhbmUu4pCfMDQ1MjFkYzBiNmE2NWNmNWMzODI5NDRjOWE4YjRiODQ0YTNlOTU5OOKQnzgxNTY3NjY5OTc3NDcxNjU4NzE6Q2xvc2Ugc2lkZSBwYW5lYCxbWzEsInRvb2xiYXIiXSxbIm11bHRpcGxlIiwiIiwiYXBwZWFyYW5jZSIsInN0YW5kYXJkIiwxLCJmaWx0ZXItdmlldyJdLFszLCJjaGVja2VkIiwiY2xpY2siXSxbMSwicmlnaHQtaXRlbXMiXSxbIm1hdC1zdHJva2VkLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLHQsMywibmdDbGFzcyIsImNsaWNrIl0sWyJzdmdJY29uIiwic2V0dGluZ3NfMjRweCJdLFsxLCJzcGxpdC1jb250ZW50Il0sWyJjZGtTY3JvbGxhYmxlIiwiIl0sWzMsImNhcmRPYnNlcnZlciIsNCwibmdJZiJdLFszLCJjYXJkT2JzZXJ2ZXIiXSxbImNsYXNzIiwibG9hZGluZy1jb250YWluZXIiLDQsIm5nSWYiXSxbImNsYXNzIiwic2lkZWJhciIsNCwibmdJZiJdLFsxLCJsb2FkaW5nLWNvbnRhaW5lciJdLFsiZGlhbWV0ZXIiLCIzNiJdLFsxLCJzaWRlYmFyIl0sWzEsImhlYWRlciJdLFsxLCJ0aXRsZSJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsZSwzLCJjbGljayJdLFsic3ZnSWNvbiIsImNsb3NlXzI0cHgiXV19LHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJkaXYiLDApLFRtKDEsIm1ldHJpY3MtdGFnLWZpbHRlciIpLFJtKDIsIm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIiwxKSxSbSgzLCJtYXQtYnV0dG9uLXRvZ2dsZSIsMiksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uUGx1Z2luVHlwZUFsbFRvZ2dsZWQuZW1pdCgpfSkpLGt1KDQsIiBBbGwgIiksQW0oKSxSbSg1LCJtYXQtYnV0dG9uLXRvZ2dsZSIsMiksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uUGx1Z2luVHlwZVRvZ2dsZWQuZW1pdChuLlBsdWdpblR5cGUuU0NBTEFSUyl9KSksa3UoNiwiIFNjYWxhcnMgIiksQW0oKSxSbSg3LCJtYXQtYnV0dG9uLXRvZ2dsZSIsMiksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uUGx1Z2luVHlwZVRvZ2dsZWQuZW1pdChuLlBsdWdpblR5cGUuSU1BR0VTKX0pKSxrdSg4LCIgSW1hZ2UgIiksQW0oKSxSbSg5LCJtYXQtYnV0dG9uLXRvZ2dsZSIsMiksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uUGx1Z2luVHlwZVRvZ2dsZWQuZW1pdChuLlBsdWdpblR5cGUuSElTVE9HUkFNUyl9KSksa3UoMTAsIiBIaXN0b2dyYW0gIiksQW0oKSxBbSgpLFJtKDExLCJkaXYiLDMpLFJtKDEyLCJidXR0b24iLDQpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblNldHRpbmdzQnV0dG9uQ2xpY2tlZC5lbWl0KCl9KSksVG0oMTMsIm1hdC1pY29uIiw1KSxrdSgxNCwiIFNldHRpbmdzICIpLEFtKCksQW0oKSxBbSgpLFJtKDE1LCJkaXYiLDYpLFJtKDE2LCJkaXYiLDcpLFFwKDE3LGNodCwxLDEsIm1ldHJpY3MtZmlsdGVyZWQtdmlldyIsOCksVG0oMTgsIm1ldHJpY3MtcGlubmVkLXZpZXciLDkpLFFwKDE5LGRodCwyLDAsImRpdiIsMTApLFRtKDIwLCJtZXRyaWNzLWNhcmQtZ3JvdXBzIiw5KSxBbSgpLFFwKDIxLHBodCw3LDAsImRpdiIsMTEpLEFtKCkpLDImZSYmKHJjKDMpLERtKCJjaGVja2VkIiwwPT09bi5maWx0ZXJlZFBsdWdpblR5cGVzLnNpemUpLHJjKDIpLERtKCJjaGVja2VkIixuLmZpbHRlcmVkUGx1Z2luVHlwZXMuaGFzKG4uUGx1Z2luVHlwZS5TQ0FMQVJTKSkscmMoMiksRG0oImNoZWNrZWQiLG4uZmlsdGVyZWRQbHVnaW5UeXBlcy5oYXMobi5QbHVnaW5UeXBlLklNQUdFUykpLHJjKDIpLERtKCJjaGVja2VkIixuLmZpbHRlcmVkUGx1Z2luVHlwZXMuaGFzKG4uUGx1Z2luVHlwZS5ISVNUT0dSQU1TKSkscmMoMyksRG0oIm5nQ2xhc3MiLE1oKDE5LG1odCxuLmlzU2lkZXBhbmVPcGVuKSksanAoImFyaWEtcHJlc3NlZCIsbi5pc1NpZGVwYW5lT3BlbikscmMoNCkscHUoIm1haW4iLCEwKSgiZmlsdGVyLXZpZXciLG4uc2hvd0ZpbHRlcmVkVmlldykscmMoMSksRG0oIm5nSWYiLG4uc2hvd0ZpbHRlcmVkVmlldykscmMoMSksZHUoImRpc3BsYXkiLG4uc2hvd0ZpbHRlcmVkVmlldz8ibm9uZSI6IiIpLERtKCJjYXJkT2JzZXJ2ZXIiLG4uY2FyZE9ic2VydmVyKSxyYygxKSxEbSgibmdJZiIsbi5pbml0aWFsVGFnc0xvYWRpbmcpLHJjKDEpLGR1KCJkaXNwbGF5IixuLnNob3dGaWx0ZXJlZFZpZXc/Im5vbmUiOiIiKSxEbSgiY2FyZE9ic2VydmVyIixuLmNhcmRPYnNlcnZlcikscmMoMSksRG0oIm5nSWYiLG4uaXNTaWRlcGFuZU9wZW4pKX0sZGlyZWN0aXZlczpbeDIsRTIsQTIsWEgsYU0sRFcsbUYsZE0sQmd0LFlndCwkZ3QsbzEsbGh0XSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47aGVpZ2h0OjEwMCV9LnRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWI7ZmxleDpub25lO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47aGVpZ2h0OjQ4cHg7cGFkZGluZzowIDE2cHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLnRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAudG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzU1NX0udG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBtZXRyaWNzLXRhZy1maWx0ZXJbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MSAxIDEwMHB4fS50b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5yaWdodC1pdGVtc1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNlYmViZWI7bWFyZ2luLWxlZnQ6MTZweDtwYWRkaW5nLWxlZnQ6MTZweH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAudG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAucmlnaHQtaXRlbXNbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAudG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAucmlnaHQtaXRlbXNbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjNTU1fS5maWx0ZXItdmlld1tfbmdjb250ZW50LSVDT01QJV17ZmxleDpub25lO21hcmdpbi1yaWdodDo1cHh9LmZpbHRlci12aWV3W19uZ2NvbnRlbnQtJUNPTVAlXSAgIG1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MjVweDtmb250LXNpemU6MTJweH0uZmlsdGVyLXZpZXdbX25nY29udGVudC0lQ09NUCVdICAgbWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICAgICAubWF0LWJ1dHRvbi10b2dnbGUtbGFiZWwtY29udGVudHtsaW5lLWhlaWdodDoyNXB4fS5zcGxpdC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7b3ZlcmZsb3cteTphdXRvO2ZsZXg6MX0ubWFpbltfbmdjb250ZW50LSVDT01QJV0sIC5zaWRlYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb250YWluOnN0cmljdDtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87d2lsbC1jaGFuZ2U6dHJhbnNmb3JtLHNjcm9sbC1wb3NpdGlvbn0ubWFpbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjVmNmY3O2ZsZXg6MSAxO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW59Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLm1haW5bX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAubWFpbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojM2EzYTNhfS5tYWluW19uZ2NvbnRlbnQtJUNPTVAlXSAgIG1ldHJpY3MtZmlsdGVyZWQtdmlld1tfbmdjb250ZW50LSVDT01QJV0sIC5tYWluW19uZ2NvbnRlbnQtJUNPTVAlXSAgIG1ldHJpY3MtcGlubmVkLXZpZXdbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWJ9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLm1haW5bX25nY29udGVudC0lQ09NUCVdICAgbWV0cmljcy1maWx0ZXJlZC12aWV3W19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLm1haW5bX25nY29udGVudC0lQ09NUCVdICAgbWV0cmljcy1maWx0ZXJlZC12aWV3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjNTU1fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5tYWluW19uZ2NvbnRlbnQtJUNPTVAlXSAgIG1ldHJpY3MtcGlubmVkLXZpZXdbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAubWFpbltfbmdjb250ZW50LSVDT01QJV0gICBtZXRyaWNzLXBpbm5lZC12aWV3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjNTU1fS5tYWluLmZpbHRlci12aWV3W19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW59Lm1haW4uZmlsdGVyLXZpZXdbX25nY29udGVudC0lQ09NUCVdICAgbWV0cmljcy1maWx0ZXJlZC12aWV3W19uZ2NvbnRlbnQtJUNPTVAlXXtjb250YWluOmNvbnRlbnQ7b3ZlcmZsb3c6YXV0bzt3aWxsLWNoYW5nZTp0cmFuc2Zvcm0sc2Nyb2xsLXBvc2l0aW9ufS5sb2FkaW5nLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbjoyMHB4IDB9LnNpZGViYXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjZWJlYmViO2ZsZXg6MCAwIDI1MHB4fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5zaWRlYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLnNpZGViYXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjNTU1fS5zaWRlYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWI7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtoZWlnaHQ6NDJweDtwYWRkaW5nOjAgMTZweH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuc2lkZWJhcltfbmdjb250ZW50LSVDT01QJV0gICAuaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLnNpZGViYXJbX25nY29udGVudC0lQ09NUCVdICAgLmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzU1NX0uc2lkZWJhcltfbmdjb250ZW50LSVDT01QJV0gICAuaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC50aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHg7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0Om5vcm1hbDttYXJnaW46MH1bX25naG9zdC0lQ09NUCVdICAgLnNldHRpbmdzLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MTtkaXNwbGF5OmlubGluZS1mbGV4fWJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5zZXR0aW5ncy1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfVtfbmdob3N0LSVDT01QJV0gICAuc2V0dGluZ3MtYnV0dG9uLmNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtib3JkZXItY29sb3I6I2UwZTBlMH1ib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuc2V0dGluZ3MtYnV0dG9uLmNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzIxMjEyMX1bX25naG9zdC0lQ09NUCVdICAgLnNldHRpbmdzLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAgIC5tYXQtYnV0dG9uLXdyYXBwZXJ7ZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXJ9W19uZ2hvc3QtJUNPTVAlXSAgIC5zZXR0aW5ncy1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgbWF0LWljb25bX25nY29udGVudC0lQ09NUCVde21hcmdpbi1yaWdodDo0cHh9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHVodCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtZXRyaWNzLW1haW4tdmlldy1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiJtYWluX3ZpZXdfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIm1haW5fdmlld19jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfV19KSx7c2hvd0ZpbHRlcmVkVmlldzpbe3R5cGU6eHl9XSxpc1NpZGVwYW5lT3Blbjpbe3R5cGU6eHl9XSxmaWx0ZXJlZFBsdWdpblR5cGVzOlt7dHlwZTp4eX1dLGluaXRpYWxUYWdzTG9hZGluZzpbe3R5cGU6eHl9XSxvblNldHRpbmdzQnV0dG9uQ2xpY2tlZDpbe3R5cGU6T3l9XSxvbkNsb3NlU2lkZXBhbmVCdXR0b25DbGlja2VkOlt7dHlwZTpPeX1dLG9uUGx1Z2luVHlwZVRvZ2dsZWQ6W3t0eXBlOk95fV0sb25QbHVnaW5UeXBlQWxsVG9nZ2xlZDpbe3R5cGU6T3l9XX0pO2NsYXNzIGZodHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5pc1NpZGVwYW5lT3BlbiQ9dGhpcy5zdG9yZS5zZWxlY3QoWFQpLHRoaXMuaW5pdGlhbFRhZ3NMb2FkaW5nJD10aGlzLnN0b3JlLnNlbGVjdCh1VCkucGlwZShIZSgodD0+bnVsbD09PXQubGFzdExvYWRlZFRpbWVJbk1zKSwhMCksSXQoKHQ9PnQuc3RhdGU9PT15RS5MT0FESU5HJiZudWxsPT09dC5sYXN0TG9hZGVkVGltZUluTXMpKSksdGhpcy5zaG93RmlsdGVyZWRWaWV3JD10aGlzLnN0b3JlLnNlbGVjdChCVCkucGlwZShJdCgodD0+dC5sZW5ndGg+MCkpKSx0aGlzLmZpbHRlcmVkUGx1Z2luVHlwZXMkPXRoaXMuc3RvcmUuc2VsZWN0KHFUKX1vblNldHRpbmdzQnV0dG9uQ2xpY2tlZCgpe3RoaXMuc3RvcmUuZGlzcGF0Y2goekUoKSl9b25DbG9zZVNpZGVwYW5lQnV0dG9uQ2xpY2tlZCgpe3RoaXMuc3RvcmUuZGlzcGF0Y2goTkUoKSl9b25QbHVnaW5WaXNpYmlsaXR5VG9nZ2xlZCh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKGlSKHtwbHVnaW46dH0pKX1vblNob3dBbGxQbHVnaW5zKCl7dGhpcy5zdG9yZS5kaXNwYXRjaChhUigpKX19Zmh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxmaHQpKFNtKEl3KSl9LGZodC7JtWNtcD10byh7dHlwZTpmaHQsc2VsZWN0b3JzOltbIm1ldHJpY3MtbWFpbi12aWV3Il1dLGRlY2xzOjUsdmFyczoxMixjb25zdHM6W1szLCJzaG93RmlsdGVyZWRWaWV3IiwiaXNTaWRlcGFuZU9wZW4iLCJpbml0aWFsVGFnc0xvYWRpbmciLCJmaWx0ZXJlZFBsdWdpblR5cGVzIiwib25TZXR0aW5nc0J1dHRvbkNsaWNrZWQiLCJvbkNsb3NlU2lkZXBhbmVCdXR0b25DbGlja2VkIiwib25QbHVnaW5UeXBlVG9nZ2xlZCIsIm9uUGx1Z2luVHlwZUFsbFRvZ2dsZWQiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsIm1ldHJpY3MtbWFpbi12aWV3LWNvbXBvbmVudCIsMCksVm0oIm9uU2V0dGluZ3NCdXR0b25DbGlja2VkIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uU2V0dGluZ3NCdXR0b25DbGlja2VkKCl9KSkoIm9uQ2xvc2VTaWRlcGFuZUJ1dHRvbkNsaWNrZWQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25DbG9zZVNpZGVwYW5lQnV0dG9uQ2xpY2tlZCgpfSkpKCJvblBsdWdpblR5cGVUb2dnbGVkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblBsdWdpblZpc2liaWxpdHlUb2dnbGVkKGUpfSkpKCJvblBsdWdpblR5cGVBbGxUb2dnbGVkIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uU2hvd0FsbFBsdWdpbnMoKX0pKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQWgoMywiYXN5bmMiKSxBaCg0LCJhc3luYyIpLEFtKCkpLDImZSYmRG0oInNob3dGaWx0ZXJlZFZpZXciLFRoKDEsNCxuLnNob3dGaWx0ZXJlZFZpZXckKSkoImlzU2lkZXBhbmVPcGVuIixUaCgyLDYsbi5pc1NpZGVwYW5lT3BlbiQpKSgiaW5pdGlhbFRhZ3NMb2FkaW5nIixUaCgzLDgsbi5pbml0aWFsVGFnc0xvYWRpbmckKSkoImZpbHRlcmVkUGx1Z2luVHlwZXMiLFRoKDQsMTAsbi5maWx0ZXJlZFBsdWdpblR5cGVzJCkpfSxkaXJlY3RpdmVzOlt1aHRdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChmaHQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWV0cmljcy1tYWluLXZpZXciLHRlbXBsYXRlOidcbiAgICA8bWV0cmljcy1tYWluLXZpZXctY29tcG9uZW50XG4gICAgICBbc2hvd0ZpbHRlcmVkVmlld109InNob3dGaWx0ZXJlZFZpZXckIHwgYXN5bmMiXG4gICAgICBbaXNTaWRlcGFuZU9wZW5dPSJpc1NpZGVwYW5lT3BlbiQgfCBhc3luYyJcbiAgICAgIFtpbml0aWFsVGFnc0xvYWRpbmddPSJpbml0aWFsVGFnc0xvYWRpbmckIHwgYXN5bmMiXG4gICAgICBbZmlsdGVyZWRQbHVnaW5UeXBlc109ImZpbHRlcmVkUGx1Z2luVHlwZXMkIHwgYXN5bmMiXG4gICAgICAob25TZXR0aW5nc0J1dHRvbkNsaWNrZWQpPSJvblNldHRpbmdzQnV0dG9uQ2xpY2tlZCgpIlxuICAgICAgKG9uQ2xvc2VTaWRlcGFuZUJ1dHRvbkNsaWNrZWQpPSJvbkNsb3NlU2lkZXBhbmVCdXR0b25DbGlja2VkKCkiXG4gICAgICAob25QbHVnaW5UeXBlVG9nZ2xlZCk9Im9uUGx1Z2luVmlzaWJpbGl0eVRvZ2dsZWQoJGV2ZW50KSJcbiAgICAgIChvblBsdWdpblR5cGVBbGxUb2dnbGVkKT0ib25TaG93QWxsUGx1Z2lucygpIlxuICAgID48L21ldHJpY3MtbWFpbi12aWV3LWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NvbnN0IGdodD1uZXcgR2EoIltNZXRyaWNzXSBNRVRSSUNTX1Byb21vIE1lc3NhZ2UgQ29tcG9uZW50Iik7ZnVuY3Rpb24gaGh0KHQsZSl7MSZ0JiYoTm0oMCksWG0oMSksem0oKSl9Y2xhc3MgYmh0e2NvbnN0cnVjdG9yKHQsZSl7dGhpcy52aWV3Q29udGFpbmVyUmVmPXQsdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI9ZX1uZ09uSW5pdCgpe2lmKHRoaXMuY3VzdG9taXphYmxlQ29tcG9uZW50KXtjb25zdCB0PXRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KHRoaXMuY3VzdG9taXphYmxlQ29tcG9uZW50LmNvbnN0cnVjdG9yKTt0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KHQpfX19Ymh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxiaHQpKFNtKGVoKSxTbSh1ZykpfSxiaHQuybVjbXA9dG8oe3R5cGU6Ymh0LHNlbGVjdG9yczpbWyJ0Yi1jdXN0b21pemF0aW9uIl1dLGlucHV0czp7Y3VzdG9taXphYmxlQ29tcG9uZW50OiJjdXN0b21pemFibGVDb21wb25lbnQifSxuZ0NvbnRlbnRTZWxlY3RvcnM6WyIqIl0sZGVjbHM6MSx2YXJzOjEsY29uc3RzOltbNCwibmdJZiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoWm0oKSxRcCgwLGhodCwyLDAsIm5nLWNvbnRhaW5lciIsMCkpLDImZSYmRG0oIm5nSWYiLCFuLmN1c3RvbWl6YWJsZUNvbXBvbmVudCl9LGRpcmVjdGl2ZXM6W2RNXSxlbmNhcHN1bGF0aW9uOjJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGJodCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJ0Yi1jdXN0b21pemF0aW9uIix0ZW1wbGF0ZTonXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj0iIWN1c3RvbWl6YWJsZUNvbXBvbmVudCI+XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICd9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTplaH0se3R5cGU6dWd9XX0pLHtjdXN0b21pemFibGVDb21wb25lbnQ6W3t0eXBlOnh5fV19KTtjbGFzcyB5aHR7Y29uc3RydWN0b3IodCl7dGhpcy5jdXN0b21Qcm9tb01lc3NhZ2U9dCx0aGlzLm9uRGlzbWlzcz1uZXcgTGgsdGhpcy5vbkdvVG9TY2FsYXJzPW5ldyBMaH19eWh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx5aHQpKFNtKGdodCw4KSl9LHlodC7JtWNtcD10byh7dHlwZTp5aHQsc2VsZWN0b3JzOltbIm1ldHJpY3MtcHJvbW8tbm90aWNlLWNvbXBvbmVudCJdXSxvdXRwdXRzOntvbkRpc21pc3M6Im9uRGlzbWlzcyIsb25Hb1RvU2NhbGFyczoib25Hb1RvU2NhbGFycyJ9LGRlY2xzOjcsdmFyczoxLGNvbnN0czpbWzEsIm1lc3NhZ2UiLDMsImN1c3RvbWl6YWJsZUNvbXBvbmVudCJdLFsxLCJnby10by1zY2FsYXJzIiwzLCJjbGljayJdLFsxLCJkaXNtaXNzIiwzLCJjbGljayJdLFsiaW5saW5lIiwiIiwic3ZnSWNvbiIsImNsb3NlXzI0cHgiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsInRiLWN1c3RvbWl6YXRpb24iLDApLGt1KDEsIiBXZWxjb21lIHRvIG5ldyBkZWZhdWx0IGV4cGVyaWVuY2Ugb2YgVGVuc29yQm9hcmQuIFRpbWUgU2VyaWVzIGxldHMgeW91IHZpZXcgYWxsIHZpc3VhbGl6YXRpb25zIGF0IG9uY2UsIHB1dCB0aGVtIHNpZGUtYnktc2lkZSB3aXRoIHBpbnMsIGFuZCBjdXN0b21pemUgY29sb3JzLiBTY2FsYXJzIGFuZCBvdGhlciBwbHVnaW5zIGFyZSBzdGlsbCBhdmFpbGFibGUuICIpLFJtKDIsImJ1dHRvbiIsMSksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uR29Ub1NjYWxhcnMuZW1pdCgpfSkpLGt1KDMsIiBHbyB0byBTY2FsYXJzIHBsdWdpbiIpLEFtKCksa3UoNCwiLlxuIiksQW0oKSxSbSg1LCJidXR0b24iLDIpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkRpc21pc3MuZW1pdCgpfSkpLFRtKDYsIm1hdC1pY29uIiwzKSxBbSgpKSwyJmUmJkRtKCJjdXN0b21pemFibGVDb21wb25lbnQiLG4uY3VzdG9tUHJvbW9NZXNzYWdlKX0sZGlyZWN0aXZlczpbYmh0LERXXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmb250LXNpemU6MTRweDtnYXA6NXB4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2xpbmUtaGVpZ2h0OjIwcHg7cGFkZGluZzo1cHggMTBweH1idXR0b25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyOjA7Y29sb3I6aW5oZXJpdDtjdXJzb3I6cG9pbnRlcjtmb250OmluaGVyaXQ7cGFkZGluZzowfWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX10Yi1jdXN0b21pemF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzE5NzZkMn0uZGlzbWlzc1tfbmdjb250ZW50LSVDT01QJV17YWxpZ24tc2VsZjpiYXNlbGluZTtmbGV4Om5vbmU7aGVpZ2h0OjIwcHg7d2lkdGg6MjBweH0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoeWh0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1ldHJpY3MtcHJvbW8tbm90aWNlLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Im1ldHJpY3NfcHJvbW9fbm90aWNlX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyJtZXRyaWNzX3Byb21vX25vdGljZV9jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlFhLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltnaHRdfV19XX0pLHtvbkRpc21pc3M6W3t0eXBlOk95fV0sb25Hb1RvU2NhbGFyczpbe3R5cGU6T3l9XX0pO2NsYXNzIF9odHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXR9b25EaXNtaXNzKCl7dGhpcy5zdG9yZS5kaXNwYXRjaChkUigpKX1vbkdvVG9TY2FsYXJzKCl7dGhpcy5zdG9yZS5kaXNwYXRjaChwUigpKX19ZnVuY3Rpb24gQ2h0KHQsZSl7MSZ0JiZUbSgwLCJtZXRyaWNzLXByb21vLW5vdGljZSIsMyl9X2h0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxfaHQpKFNtKEl3KSl9LF9odC7JtWNtcD10byh7dHlwZTpfaHQsc2VsZWN0b3JzOltbIm1ldHJpY3MtcHJvbW8tbm90aWNlIl1dLGRlY2xzOjEsdmFyczowLGNvbnN0czpbWzMsIm9uRGlzbWlzcyIsIm9uR29Ub1NjYWxhcnMiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsIm1ldHJpY3MtcHJvbW8tbm90aWNlLWNvbXBvbmVudCIsMCksVm0oIm9uRGlzbWlzcyIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkRpc21pc3MoKX0pKSgib25Hb1RvU2NhbGFycyIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkdvVG9TY2FsYXJzKCl9KSksQW0oKSl9LGRpcmVjdGl2ZXM6W3lodF0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChfaHQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWV0cmljcy1wcm9tby1ub3RpY2UiLHRlbXBsYXRlOic8bWV0cmljcy1wcm9tby1ub3RpY2UtY29tcG9uZW50XG4gICAgKG9uRGlzbWlzcyk9Im9uRGlzbWlzcygpIlxuICAgIChvbkdvVG9TY2FsYXJzKT0ib25Hb1RvU2NhbGFycygpIlxuICA+PC9tZXRyaWNzLXByb21vLW5vdGljZS1jb21wb25lbnQ+JyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NsYXNzIE1odHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5pc0J1dHRlckJhckVuYWJsZWQkPXRoaXMuc3RvcmUuc2VsZWN0KGFFKS5waXBlKGZlKHRoaXMuc3RvcmUuc2VsZWN0KFpUKSksSXQoKChbdCxlXSk9PnQmJmUpKSl9fU1odC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8TWh0KShTbShJdykpfSxNaHQuybVjbXA9dG8oe3R5cGU6TWh0LHNlbGVjdG9yczpbWyJtZXRyaWNzLWRhc2hib2FyZCJdXSxkZWNsczo1LHZhcnM6Myxjb25zdHM6W1siY2xhc3MiLCJub3RpY2UiLDQsIm5nSWYiXSxbInNpZGViYXIiLCIiXSxbIm1haW4iLCIiXSxbMSwibm90aWNlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihRcCgwLENodCwxLDAsIm1ldHJpY3MtcHJvbW8tbm90aWNlIiwwKSxBaCgxLCJhc3luYyIpLFJtKDIsInRiLWRhc2hib2FyZC1sYXlvdXQiKSxUbSgzLCJydW5zLXNlbGVjdG9yIiwxKSxUbSg0LCJtZXRyaWNzLW1haW4tdmlldyIsMiksQW0oKSksMiZlJiZEbSgibmdJZiIsVGgoMSwxLG4uaXNCdXR0ZXJCYXJFbmFibGVkJCkpfSxkaXJlY3RpdmVzOltkTSxNUSxjMixmaHQsX2h0XSxwaXBlczpbd01dLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtoZWlnaHQ6MTAwJTtqdXN0aWZ5LWNvbnRlbnQ6c3RyZXRjaDtvdmVyZmxvdzpoaWRkZW59Lm5vdGljZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNDUsMTU3LC44NSk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2ZmZWIzYjtjb2xvcjojMjEyMTIxO2Rpc3BsYXk6YmxvY2s7ZmxleDowIDB9dGItZGFzaGJvYXJkLWxheW91dFtfbmdjb250ZW50LSVDT01QJV17ZmxleDoxIDE7b3ZlcmZsb3c6aGlkZGVufW5hdltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci1yaWdodDoxcHggc29saWQgI2ViZWJlYjtmbGV4Om5vbmU7d2lkdGg6MzQwcHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgbmF2W19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgbmF2W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMzMDMwMzA7Ym9yZGVyLXJpZ2h0LWNvbG9yOiM1NTV9bWV0cmljcy1tYWluLXZpZXdbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MSAxfSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChNaHQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWV0cmljcy1kYXNoYm9hcmQiLHRlbXBsYXRlOidcbiAgICA8bWV0cmljcy1wcm9tby1ub3RpY2VcbiAgICAgICpuZ0lmPSJpc0J1dHRlckJhckVuYWJsZWQkIHwgYXN5bmMiXG4gICAgICBjbGFzcz0ibm90aWNlIlxuICAgID48L21ldHJpY3MtcHJvbW8tbm90aWNlPlxuICAgIDx0Yi1kYXNoYm9hcmQtbGF5b3V0PlxuICAgICAgPHJ1bnMtc2VsZWN0b3Igc2lkZWJhcj48L3J1bnMtc2VsZWN0b3I+XG4gICAgICA8bWV0cmljcy1tYWluLXZpZXcgbWFpbj48L21ldHJpY3MtbWFpbi12aWV3PlxuICAgIDwvdGItZGFzaGJvYXJkLWxheW91dD5cbiAgJyxzdHlsZVVybHM6WyJtZXRyaWNzX2NvbnRhaW5lci5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NsYXNzIHZodHt9dmh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx2aHQpfSx2aHQuybVtb2Q9YW8oe3R5cGU6dmh0fSksdmh0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV00sRVcsSkhdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodmh0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltNUV0sZXhwb3J0czpbTVFdLGltcG9ydHM6W1dNLEVXLEpIXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKHZodCx7ZGVjbGFyYXRpb25zOltNUV0saW1wb3J0czpbV00sRVcsSkhdLGV4cG9ydHM6W01RXX0pO2NsYXNzIHhodHt9eGh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx4aHQpfSx4aHQuybVtb2Q9YW8oe3R5cGU6eGh0fSkseGh0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV01dXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoeGh0LFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbV01dLGRlY2xhcmF0aW9uczpbYmh0XSxleHBvcnRzOltiaHRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oeGh0LHtkZWNsYXJhdGlvbnM6W2JodF0saW1wb3J0czpbV01dLGV4cG9ydHM6W2JodF19KTtjbGFzcyBPaHR7fU9odC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8T2h0KX0sT2h0Lsm1bW9kPWFvKHt0eXBlOk9odH0pLE9odC7JtWluaj12bih7aW1wb3J0czpbW1dNLFkwLEVXXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKE9odCxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbcTBdLGV4cG9ydHM6W3EwXSxpbXBvcnRzOltXTSxZMCxFV119XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhPaHQse2RlY2xhcmF0aW9uczpbcTBdLGltcG9ydHM6W1dNLFkwLEVXXSxleHBvcnRzOltxMF19KTtjbGFzcyBQaHR7fVBodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8UGh0KX0sUGh0Lsm1bW9kPWFvKHt0eXBlOlBodH0pLFBodC7JtWluaj12bih7aW1wb3J0czpbW1dNXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFBodCxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W1dNXSxleHBvcnRzOltEMV0sZGVjbGFyYXRpb25zOltEMV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhQaHQse2RlY2xhcmF0aW9uczpbRDFdLGltcG9ydHM6W1dNXSxleHBvcnRzOltEMV19KTtjbGFzcyB3aHR7fXdodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8d2h0KX0sd2h0Lsm1bW9kPWFvKHt0eXBlOndodH0pLHdodC7JtWluaj12bih7aW1wb3J0czpbW3kzLFdNLE9odCxUVixKSCxTWSxkVyxCWSxFVyxvWSxlJCxpMSx1JCx3MCxQaHQsSkxdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgod2h0LFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbeTMsV00sT2h0LFRWLEpILFNZLGRXLEJZLEVXLG9ZLGUkLGkxLHUkLHcwLFBodCxKTF0sZXhwb3J0czpbczJdLGVudHJ5Q29tcG9uZW50czpbaDFdLGRlY2xhcmF0aW9uczpbZzEsaDEsUDEsdzEsbzIsczJdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8od2h0LHtkZWNsYXJhdGlvbnM6W2cxLGgxLFAxLHcxLG8yLHMyXSxpbXBvcnRzOlt5MyxXTSxPaHQsVFYsSkgsU1ksZFcsQlksRVcsb1ksZSQsaTEsdSQsdzAsUGh0LEpMXSxleHBvcnRzOltzMl19KTtjbGFzcyBraHR7fWtodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8a2h0KX0sa2h0Lsm1bW9kPWFvKHt0eXBlOmtodH0pLGtodC7JtWluaj12bih7aW1wb3J0czpbW1dNLHdodF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChraHQsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltXTSx3aHRdLGV4cG9ydHM6W2MyXSxkZWNsYXJhdGlvbnM6W2wyLGMyXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKGtodCx7ZGVjbGFyYXRpb25zOltsMixjMl0saW1wb3J0czpbV00sd2h0XSxleHBvcnRzOltjMl19KTtjbGFzcyBTaHR7fVNodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8U2h0KX0sU2h0Lsm1bW9kPWFvKHt0eXBlOlNodH0pLFNodC7JtWluaj12bih7fSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChTaHQsW3t0eXBlOkF5LGFyZ3M6W3tleHBvcnRzOltOZnRdLGRlY2xhcmF0aW9uczpbTmZ0XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFNodCx7ZGVjbGFyYXRpb25zOltOZnRdLGV4cG9ydHM6W05mdF19KTtjbGFzcyBEaHR7fURodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8RGh0KX0sRGh0Lsm1bW9kPWFvKHt0eXBlOkRodH0pLERodC7JtWluaj12bih7aW1wb3J0czpbW1dNXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKERodCxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbaGZ0XSxleHBvcnRzOltoZnRdLGltcG9ydHM6W1dNXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKERodCx7ZGVjbGFyYXRpb25zOltoZnRdLGltcG9ydHM6W1dNXSxleHBvcnRzOltoZnRdfSk7Y2xhc3MgRWh0e31FaHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEVodCl9LEVodC7JtW1vZD1hbyh7dHlwZTpFaHR9KSxFaHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxWSixTaHQsRGh0XV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEVodCxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbdGd0XSxleHBvcnRzOlt0Z3RdLGltcG9ydHM6W1dNLFZKLFNodCxEaHRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oRWh0LHtkZWNsYXJhdGlvbnM6W3RndF0saW1wb3J0czpbV00sVkosU2h0LERodF0sZXhwb3J0czpbdGd0XX0pO2NsYXNzIFJodHt9Umh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxSaHQpfSxSaHQuybVtb2Q9YW8oe3R5cGU6Umh0fSksUmh0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV01dXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUmh0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOlt6Ml0sZXhwb3J0czpbejJdLGltcG9ydHM6W1dNXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFJodCx7ZGVjbGFyYXRpb25zOlt6Ml0saW1wb3J0czpbV01dLGV4cG9ydHM6W3oyXX0pO2NsYXNzIEFodHt9QWh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxBaHQpfSxBaHQuybVtb2Q9YW8oe3R5cGU6QWh0fSksQWh0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV01dXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQWh0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltMMixGMl0sZXhwb3J0czpbTDJdLGltcG9ydHM6W1dNXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKEFodCx7ZGVjbGFyYXRpb25zOltMMixGMl0saW1wb3J0czpbV01dLGV4cG9ydHM6W0wyXX0pO2NsYXNzIFRodHt9VGh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxUaHQpfSxUaHQuybVtb2Q9YW8oe3R5cGU6VGh0fSksVGh0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV00sRVddXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoVGh0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltnZnRdLGV4cG9ydHM6W2dmdF0saW1wb3J0czpbV00sRVddfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oVGh0LHtkZWNsYXJhdGlvbnM6W2dmdF0saW1wb3J0czpbV00sRVddLGV4cG9ydHM6W2dmdF19KTtjbGFzcyBOaHR7fU5odC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8Tmh0KX0sTmh0Lsm1bW9kPWFvKHt0eXBlOk5odH0pLE5odC7JtWluaj12bih7aW1wb3J0czpbW1dNLEVodCxKSCxFVyxpMSxBaHQsUmh0LFRodF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChOaHQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W21ndCxwZ3RdLGV4cG9ydHM6W21ndF0saW1wb3J0czpbV00sRWh0LEpILEVXLGkxLEFodCxSaHQsVGh0XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKE5odCx7ZGVjbGFyYXRpb25zOlttZ3QscGd0XSxpbXBvcnRzOltXTSxFaHQsSkgsRVcsaTEsQWh0LFJodCxUaHRdLGV4cG9ydHM6W21ndF19KTtjbGFzcyB6aHR7fXpodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8emh0KX0semh0Lsm1bW9kPWFvKHt0eXBlOnpodH0pLHpodC7JtWluaj12bih7aW1wb3J0czpbW1dNLEpILEVXLGkxLHpYLEFodCxSaHRdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoemh0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltYMixaMl0sZXhwb3J0czpbWDJdLGltcG9ydHM6W1dNLEpILEVXLGkxLHpYLEFodCxSaHRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oemh0LHtkZWNsYXJhdGlvbnM6W1gyLFoyXSxpbXBvcnRzOltXTSxKSCxFVyxpMSx6WCxBaHQsUmh0XSxleHBvcnRzOltYMl19KTtjbGFzcyBJaHR7fUlodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SWh0KX0sSWh0Lsm1bW9kPWFvKHt0eXBlOklodH0pLElodC7JtWluaj12bih7aW1wb3J0czpbW1dNLHlMLEpILEVXLEJZLG9ZXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKElodCxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbWHV0LFV1dCxFdXRdLGV4cG9ydHM6W1h1dCxVdXQsRXV0XSxpbXBvcnRzOltXTSx5TCxKSCxFVyxCWSxvWV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhJaHQse2RlY2xhcmF0aW9uczpbWHV0LFV1dCxFdXRdLGltcG9ydHM6W1dNLHlMLEpILEVXLEJZLG9ZXSxleHBvcnRzOltYdXQsVXV0LEV1dF19KTtjbGFzcyBIaHR7fUhodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SGh0KX0sSGh0Lsm1bW9kPWFvKHt0eXBlOkhodH0pLEhodC7JtWluaj12bih7aW1wb3J0czpbW1dNLHlMLElodCxWSl1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChIaHQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W2ZmdF0sZXhwb3J0czpbZmZ0XSxpbXBvcnRzOltXTSx5TCxJaHQsVkpdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oSGh0LHtkZWNsYXJhdGlvbnM6W2ZmdF0saW1wb3J0czpbV00seUwsSWh0LFZKXSxleHBvcnRzOltmZnRdfSk7Y2xhc3MgRmh0e31GaHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEZodCl9LEZodC7JtW1vZD1hbyh7dHlwZTpGaHR9KSxGaHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxjRyxKSCxkVyxCWSxURyxlVF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChGaHQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W2w1LHM1XSxleHBvcnRzOltsNV0saW1wb3J0czpbV00sY0csSkgsZFcsQlksVEcsZVRdLGVudHJ5Q29tcG9uZW50czpbbDVdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oRmh0LHtkZWNsYXJhdGlvbnM6W2w1LHM1XSxpbXBvcnRzOltXTSxjRyxKSCxkVyxCWSxURyxlVF0sZXhwb3J0czpbbDVdfSk7Y2xhc3MgTGh0e31MaHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fExodCl9LExodC7JtW1vZD1hbyh7dHlwZTpMaHR9KSxMaHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxGaHQsU2h0LEhodCxEaHQsSkgsRVcsb1ksaTEsVkosUmh0LFRodF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChMaHQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W0lmdCxUZnRdLGV4cG9ydHM6W0lmdF0saW1wb3J0czpbV00sRmh0LFNodCxIaHQsRGh0LEpILEVXLG9ZLGkxLFZKLFJodCxUaHRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oTGh0LHtkZWNsYXJhdGlvbnM6W0lmdCxUZnRdLGltcG9ydHM6W1dNLEZodCxTaHQsSGh0LERodCxKSCxFVyxvWSxpMSxWSixSaHQsVGh0XSxleHBvcnRzOltJZnRdfSk7Y2xhc3MgQmh0e31CaHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEJodCl9LEJodC7JtW1vZD1hbyh7dHlwZTpCaHR9KSxCaHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSx6aHQsTGh0LE5odCxTaHRdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQmh0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOlttMix5Z3QsX2d0XSxleHBvcnRzOlttMixfZ3RdLGltcG9ydHM6W1dNLHpodCxMaHQsTmh0LFNodF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhCaHQse2RlY2xhcmF0aW9uczpbbTIseWd0LF9ndF0saW1wb3J0czpbV00semh0LExodCxOaHQsU2h0XSxleHBvcnRzOlttMixfZ3RdfSk7Y2xhc3MgVmh0e31WaHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFZodCl9LFZodC7JtW1vZD1hbyh7dHlwZTpWaHR9KSxWaHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxUR11dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChWaHQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W2VodF0sZXhwb3J0czpbZWh0XSxpbXBvcnRzOltXTSxUR119XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhWaHQse2RlY2xhcmF0aW9uczpbZWh0XSxpbXBvcnRzOltXTSxUR10sZXhwb3J0czpbZWh0XX0pO2NsYXNzIGpodHt9amh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxqaHQpfSxqaHQuybVtb2Q9YW8oe3R5cGU6amh0fSksamh0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV00sVmh0LEpILFQyLFNZLEVXLFRHLHpYLHRULFBodF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChqaHQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W2xodCxyaHQsc2h0XSxleHBvcnRzOltsaHRdLGltcG9ydHM6W1dNLFZodCxKSCxUMixTWSxFVyxURyx6WCx0VCxQaHRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oamh0LHtkZWNsYXJhdGlvbnM6W2xodCxyaHQsc2h0XSxpbXBvcnRzOltXTSxWaHQsSkgsVDIsU1ksRVcsVEcselgsdFQsUGh0XSxleHBvcnRzOltsaHRdfSk7Y2xhc3MgVWh0e31VaHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFVodCl9LFVodC7JtW1vZD1hbyh7dHlwZTpVaHR9KSxVaHQuybVpbmo9dm4oe2ltcG9ydHM6W1tCaHQsV00sT2h0LFkwLEpILFQyLEVXLEJZLGkxLGpodCxfRl1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChVaHQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W1RndCxOZ3QsV2d0LFlndCxaZ3QsWGd0LFFndCwkZ3QsdWh0LGZodCx2Mix4MixMZ3QsQmd0XSxleHBvcnRzOltmaHRdLGltcG9ydHM6W0JodCxXTSxPaHQsWTAsSkgsVDIsRVcsQlksaTEsamh0LF9GXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFVodCx7ZGVjbGFyYXRpb25zOltUZ3QsTmd0LFdndCxZZ3QsWmd0LFhndCxRZ3QsJGd0LHVodCxmaHQsdjIseDIsTGd0LEJndF0saW1wb3J0czpbQmh0LFdNLE9odCxZMCxKSCxUMixFVyxCWSxpMSxqaHQsX0ZdLGV4cG9ydHM6W2ZodF19KTtjbGFzcyBHaHR7fWZ1bmN0aW9uIFdodCgpe3JldHVyblt7YWN0aW9uQ3JlYXRvcjpvUixhbGVydEZyb21BY3Rpb246dD0+e2NvbnN0e3dhc1Bpbm5lZDplLGNhbkNyZWF0ZU5ld1BpbnM6bn09dDtyZXR1cm4gZXx8bj9udWxsOntsb2NhbGl6ZWRNZXNzYWdlOiJNYXggcGluIGxpbWl0IGV4Y2VlZGVkLiBSZW1vdmUgZXhpc3RpbmcgcGlucyBiZWZvcmUgYWRkaW5nIG1vcmUuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9pc3N1ZXMvNDI0MiJ9fX1dfWZ1bmN0aW9uIFlodCgpe3JldHVybiBadyh6VCwodD0+KHtzY2FsYXJTbW9vdGhpbmc6dH0pKSl9ZnVuY3Rpb24gcWh0KCl7cmV0dXJuIFp3KEFULCh0PT4oe2lnbm9yZU91dGxpZXJzOnR9KSkpfWZ1bmN0aW9uIFpodCgpe3JldHVybiBadyhSVCwodD0+KHt0b29sdGlwU29ydFN0cmluZzpTdHJpbmcodCl9KSkpfWZ1bmN0aW9uIFhodCgpe3JldHVybiBadyhaVCwodD0+KHt0aW1lU2VyaWVzUHJvbW90aW9uRGlzbWlzc2VkOiF0fSkpKX1mdW5jdGlvbiBLaHQoKXtyZXR1cm4gWncoWFQsKHQ9Pih7dGltZVNlcmllc1NldHRpbmdzUGFuZU9wZW5lZDp0fSkpKX1HaHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEdodCl9LEdodC7JtW1vZD1hbyh7dHlwZTpHaHR9KSxHaHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSx4aHQsdmh0LFVodCxFVyxqaHQsa2h0XV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEdodCxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbTWh0LHlodCxfaHRdLGV4cG9ydHM6W01odF0saW1wb3J0czpbV00seGh0LHZodCxVaHQsRVcsamh0LGtodF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhHaHQse2RlY2xhcmF0aW9uczpbTWh0LHlodCxfaHRdLGltcG9ydHM6W1dNLHhodCx2aHQsVWh0LEVXLGpodCxraHRdLGV4cG9ydHM6W01odF19KTtjbGFzcyBKaHR7fUpodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8Smh0KX0sSmh0Lsm1bW9kPWFvKHt0eXBlOkpodH0pLEpodC7JtWluaj12bih7cHJvdmlkZXJzOlt7cHJvdmlkZTptUSx1c2VGYWN0b3J5OmZRLGRlcHM6W3VRXX0se3Byb3ZpZGU6dVEsdXNlVmFsdWU6cFR9XSxpbXBvcnRzOltbV00sQlMsRVIsd3EuZm9yUGx1Z2luKF9BLE1odCksZVQsR2h0LGRrLmZvckZlYXR1cmUoZFQsclEsbVEpLFdrLmZvckZlYXR1cmUoW3BRXSksQVIucmVnaXN0ZXJBbGVydEFjdGlvbnMoV2h0KSxxUy5kZWZpbmVHbG9iYWxTZXR0aW5nKFlodCkscVMuZGVmaW5lR2xvYmFsU2V0dGluZyhxaHQpLHFTLmRlZmluZUdsb2JhbFNldHRpbmcoWmh0KSxxUy5kZWZpbmVHbG9iYWxTZXR0aW5nKFhodCkscVMuZGVmaW5lR2xvYmFsU2V0dGluZyhLaHQpXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEpodCxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W1dNLEJTLEVSLHdxLmZvclBsdWdpbihfQSxNaHQpLGVULEdodCxkay5mb3JGZWF0dXJlKGRULHJRLG1RKSxXay5mb3JGZWF0dXJlKFtwUV0pLEFSLnJlZ2lzdGVyQWxlcnRBY3Rpb25zKFdodCkscVMuZGVmaW5lR2xvYmFsU2V0dGluZyhZaHQpLHFTLmRlZmluZUdsb2JhbFNldHRpbmcocWh0KSxxUy5kZWZpbmVHbG9iYWxTZXR0aW5nKFpodCkscVMuZGVmaW5lR2xvYmFsU2V0dGluZyhYaHQpLHFTLmRlZmluZUdsb2JhbFNldHRpbmcoS2h0KV0scHJvdmlkZXJzOlt7cHJvdmlkZTptUSx1c2VGYWN0b3J5OmZRLGRlcHM6W3VRXX0se3Byb3ZpZGU6dVEsdXNlVmFsdWU6cFR9XSxlbnRyeUNvbXBvbmVudHM6W01odF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhKaHQse2ltcG9ydHM6W1dNLEJTLEVSLHdxLGVULEdodCxjayxHayxBUixxUyxxUyxxUyxxUyxxU119KTtjb25zdCBRaHQ9Im5wbWkiO3ZhciAkaHQsdGJ0LGVidCxuYnQ7IShmdW5jdGlvbih0KXt0W3QuQU5EPTBdPSJBTkQifSkoJGh0fHwoJGh0PXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5NRVRSSUM9MF09Ik1FVFJJQyIsdFt0Lk9QRVJBVE9SPTFdPSJPUEVSQVRPUiJ9KSh0YnR8fCh0YnQ9e30pKSwoZnVuY3Rpb24odCl7dFt0LkRFRkFVTFQ9MF09IkRFRkFVTFQiLHRbdC5FTUJFRERJTkdTPTFdPSJFTUJFRERJTkdTIn0pKGVidHx8KGVidD17fSkpLChmdW5jdGlvbih0KXt0W3QuREVTQ0VORElORz0wXT0iREVTQ0VORElORyIsdFt0LkFTQ0VORE5HPTFdPSJBU0NFTkRORyIsdFt0LlNJTUlMQVI9Ml09IlNJTUlMQVIiLHRbdC5ESVNTSU1JTEFSPTNdPSJESVNTSU1JTEFSIn0pKG5idHx8KG5idD17fSkpO2NsYXNzIG9idHt9b2J0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxvYnQpfSxvYnQuybVjbXA9dG8oe3R5cGU6b2J0LHNlbGVjdG9yczpbWyJucG1pLWluYWN0aXZlLXZpZXciXV0sZGVjbHM6Nix2YXJzOjAsY29uc3RzOltbMSwiY29udGFpbmVyIl0sWzEsInRpdGxlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJkaXYiKSxSbSgxLCJkaXYiLDApLFJtKDIsImRpdiIsMSksa3UoMywiblBNSSBpcyBpbmFjdGl2ZSBiZWNhdXNlIG5vIGRhdGEgaXMgYXZhaWxhYmxlLiIpLEFtKCksUm0oNCwiZGl2Iiksa3UoNSwiIFRvIHVzZSB0aGUgblBNSSwgY2FsY3VsYXRlIG5QTUkgdmFsdWVzLCBhbmQgbG9nIHRoZW0gdXNpbmcgdGhlIHN1bW1hcnkgd3JpdGVyLiAiKSxBbSgpLEFtKCksQW0oKSl9LHN0eWxlczpbIi5jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBmb250LWZhbWlseTogUm9ib3RvO1xuICBmb250LXNpemU6IDE1cHg7XG4gIHBhZGRpbmc6IDUwcHg7XG59XG5cbi50aXRsZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBmb250LXNpemU6IDEzNSU7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBtYXJnaW4tYm90dG9tOiAyNXB4O1xufSJdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChvYnQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibnBtaS1pbmFjdGl2ZS12aWV3Iix0ZW1wbGF0ZVVybDoiLi9pbmFjdGl2ZV9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9pbmFjdGl2ZV9jb21wb25lbnQuY3NzIl19XX1dLG51bGwsbnVsbCk7Y29uc3QgaWJ0PUt3KFFodCksYWJ0PVp3KGlidCwodD0+dC5wbHVnaW5EYXRhTG9hZGVkLnN0YXRlKSkscmJ0PVp3KGlidCwodD0+dC5hbm5vdGF0aW9uRGF0YSkpLHNidD1adyhpYnQsKHQ9PnQucnVuVG9NZXRyaWNzKSksbGJ0PVp3KGlidCwodD0+dC5lbWJlZGRpbmdEYXRhU2V0KSksY2J0PVp3KGlidCwodD0+dC5zZWxlY3RlZEFubm90YXRpb25zKSksZGJ0PVp3KGlidCwodD0+dC5mbGFnZ2VkQW5ub3RhdGlvbnMpKSxwYnQ9WncoaWJ0LCh0PT50LmhpZGRlbkFubm90YXRpb25zKSksbWJ0PVp3KGlidCwodD0+dC5hbm5vdGF0aW9uc1JlZ2V4KSksdWJ0PVp3KGlidCwodD0+dC5tZXRyaWNzUmVnZXgpKSxmYnQ9WncoaWJ0LCh0PT50Lm1ldHJpY0FyaXRobWV0aWMpKSxnYnQ9WncoaWJ0LCh0PT50Lm1ldHJpY0ZpbHRlcnMpKSxoYnQ9WncoaWJ0LCh0PT50LnNvcnQpKSxiYnQ9WncoaWJ0LCh0PT50LnBjRXhwYW5kZWQpKSx5YnQ9WncoaWJ0LCh0PT50LmFubm90YXRpb25zRXhwYW5kZWQpKSxfYnQ9WncoaWJ0LCh0PT50LnNpZGViYXJFeHBhbmRlZCkpLENidD1adyhpYnQsKHQ9PnQuc2hvd0NvdW50cykpLE1idD1adyhpYnQsKHQ9PnQuc2hvd0hpZGRlbkFubm90YXRpb25zKSksdmJ0PVp3KGlidCwodD0+dC52aWV3QWN0aXZlKSkseGJ0PVp3KGlidCwodD0+dC5zaWRlYmFyV2lkdGgpKSxPYnQ9WncoaWJ0LCh0PT50LmVtYmVkZGluZ3NNZXRyaWMpKSxQYnQ9WncoaWJ0LCh0PT50LmVtYmVkZGluZ3NTaWRlYmFyV2lkdGgpKSx3YnQ9WncoaWJ0LCh0PT50LmVtYmVkZGluZ3NTaWRlYmFyRXhwYW5kZWQpKSxrYnQ9SlAoIltOUE1JXSBuUE1JIExvYWRlZCIpLFNidD1KUCgiW05QTUldIG5QTUkgUGx1Z2luIERhdGEgUmVxdWVzdGVkIiksRGJ0PUpQKCJbTlBNSV0gblBNSSBQbHVnaW4gRGF0YSBMb2FkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxFYnQ9SlAoIltOUE1JXSBuUE1JIFBsdWdpbiBEYXRhIFJlcXVlc3QgRmFpbGVkIiksUmJ0PUpQKCJbTlBNSV0gQWRkaW5nL1JlbW92aW5nIEFubm90YXRpb25zIHRvL2Zyb20gU2VsZWN0ZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxBYnQ9SlAoIltOUE1JXSBBbm5vdGF0aW9ucyBTZXQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxUYnQ9SlAoIltOUE1JXSBDbGVhcmluZyB0aGUgQW5ub3RhdGlvbiBTZWxlY3Rpb24iKSxOYnQ9SlAoIltOUE1JXSBBZGRpbmcvUmVtb3ZpbmcgQW5ub3RhdGlvbnMgdG8vZnJvbSBGbGFnZ2VkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksemJ0PUpQKCJbTlBNSV0gQWRkaW5nL1JlbW92aW5nIEFubm90YXRpb25zIHRvL2Zyb20gSGlkZGVuIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksSWJ0PUpQKCJbTlBNSV0gQW5ub3RhdGlvbnMgUmVnZXggQ2hhbmdlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLEhidD1KUCgiW05QTUldIE1ldHJpY3MgUmVnZXggQ2hhbmdlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLEZidD1KUCgiW05QTUldIE1ldHJpYyBGaWx0ZXIgQWRkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxMYnQ9SlAoIltOUE1JXSBNZXRyaWMgRmlsdGVyIFJlbW92ZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxCYnQ9SlAoIltOUE1JXSBNZXRyaWMgRmlsdGVyIENoYW5nZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxWYnQ9SlAoIltOUE1JXSBBbm5vdGF0aW9uIFNvcnQgQ2hhbmdlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLGpidD1KUCgiW05QTUldIFNpbWlsYXJpdHkgU29ydCBDaGFuZ2VkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksVWJ0PUpQKCJbTlBNSV0gVG9nZ2xlIFBDIEV4cGFuZGVkIiksR2J0PUpQKCJbTlBNSV0gVG9nZ2xlIEFubm90YXRpb25zIEV4cGFuZGVkIiksV2J0PUpQKCJbTlBNSV0gVG9nZ2xlIFNpZGViYXIgRXhwYW5kZWQiKSxZYnQ9SlAoIltOUE1JXSBTaG93IENvdW50cyBUb2dnbGVkIikscWJ0PUpQKCJbTlBNSV0gU2hvdyBIaWRkZW4gQW5ub3RhdGlvbnMgVG9nZ2xlZCIpLFpidD1KUCgiW05QTUldIEVtYmVkZGluZ3MgVmlldyBUb2dnbGVkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksWGJ0PUpQKCJbTlBNSV0gU2lkZWJhciBXaWR0aCBDaGFuZ2VkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksS2J0PUpQKCJbTlBNSV0gRW1iZWRkaW5ncyBTaWRlYmFyIFdpZHRoIENoYW5nZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxKYnQ9SlAoIltOUE1JXSBUb2dnbGUgRW1iZWRkaW5ncyBTaWRlYmFyIEV4cGFuZGVkIiksUWJ0PUpQKCJbTlBNSV0gQ2hhbmdlIEVtYmVkZGluZyBEYXRhU2V0Iix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSk7ZnVuY3Rpb24gJGJ0KHQpe3JldHVybiB0LnN0YXJ0c1dpdGgoImNvdW50QCIpfWZ1bmN0aW9uIHR5dCh0KXtyZXR1cm4gdC5zdGFydHNXaXRoKCJuUE1JQCIpfHx0LnN0YXJ0c1dpdGgoIm5QTUlfZGlmZkAiKX1mdW5jdGlvbiBleXQodCl7cmV0dXJuIHQuc3RhcnRzV2l0aCgiblBNSUAiKX1mdW5jdGlvbiBueXQodCl7cmV0dXJuIHQuc3BsaXQoIkAiLDIpWzFdfWNvbnN0IG95dD15ayh7cGx1Z2luRGF0YUxvYWRlZDp7c3RhdGU6eUUuTk9UX0xPQURFRCxsYXN0TG9hZGVkVGltZUluTXM6bnVsbH0sYW5ub3RhdGlvbkRhdGE6e30scnVuVG9NZXRyaWNzOnt9LHNlbGVjdGVkQW5ub3RhdGlvbnM6W10sZmxhZ2dlZEFubm90YXRpb25zOltdLGhpZGRlbkFubm90YXRpb25zOltdLGFubm90YXRpb25zUmVnZXg6IiIsbWV0cmljc1JlZ2V4OiIiLG1ldHJpY0FyaXRobWV0aWM6W10sbWV0cmljRmlsdGVyczp7fSxzb3J0OnttZXRyaWM6IiIsb3JkZXI6bmJ0LkRFU0NFTkRJTkd9LHBjRXhwYW5kZWQ6ITAsYW5ub3RhdGlvbnNFeHBhbmRlZDohMCxzaWRlYmFyRXhwYW5kZWQ6ITAsc2hvd0NvdW50czohMCxzaG93SGlkZGVuQW5ub3RhdGlvbnM6ITEsc2lkZWJhcldpZHRoOjMwMCx2aWV3QWN0aXZlOmVidC5ERUZBVUxULGVtYmVkZGluZ3NNZXRyaWM6IiIsZW1iZWRkaW5nc1NpZGViYXJXaWR0aDo1MDAsZW1iZWRkaW5nc1NpZGViYXJFeHBhbmRlZDohMH0sYmsoU2J0LCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3BsdWdpbkRhdGFMb2FkZWQ6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQucGx1Z2luRGF0YUxvYWRlZCkse3N0YXRlOnlFLkxPQURJTkd9KX0pKSksYmsoRWJ0LCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3BsdWdpbkRhdGFMb2FkZWQ6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQucGx1Z2luRGF0YUxvYWRlZCkse3N0YXRlOnlFLkZBSUxFRH0pfSkpKSxiayhEYnQsKCh0LHthbm5vdGF0aW9uRGF0YTplLG1ldHJpY3M6bixlbWJlZGRpbmdEYXRhU2V0Om99KT0+e2NvbnN0IGk9e307Zm9yKGNvbnN0IHQgaW4gbil7aVt0XT1bXTtmb3IoY29uc3QgZSBvZiBuW3RdKXR5dChlKSYmaVt0XS5wdXNoKGUpfXJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3J1blRvTWV0cmljczppLGFubm90YXRpb25EYXRhOmUsZW1iZWRkaW5nRGF0YVNldDpvLHBsdWdpbkRhdGFMb2FkZWQ6e3N0YXRlOnlFLkxPQURFRCxsYXN0TG9hZGVkVGltZUluTXM6RGF0ZS5ub3coKX19KX0pKSxiayhSYnQsKCh0LHthbm5vdGF0aW9uczplfSk9Pntjb25zdCBuPW5ldyBTZXQoWy4uLnQuc2VsZWN0ZWRBbm5vdGF0aW9ucywuLi5lXSk7aWYobi5zaXplPT09dC5zZWxlY3RlZEFubm90YXRpb25zLmxlbmd0aClmb3IoY29uc3QgdCBvZiBlKW4uZGVsZXRlKHQpO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NlbGVjdGVkQW5ub3RhdGlvbnM6Wy4uLm5dfSl9KSksYmsoQWJ0LCgodCx7YW5ub3RhdGlvbnM6ZX0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NlbGVjdGVkQW5ub3RhdGlvbnM6ZX0pKSksYmsoVGJ0LCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NlbGVjdGVkQW5ub3RhdGlvbnM6W119KSkpLGJrKE5idCwoKHQse2Fubm90YXRpb25zOmV9KT0+e2NvbnN0IG49bmV3IFNldChbLi4udC5mbGFnZ2VkQW5ub3RhdGlvbnMsLi4uZV0pO2lmKG4uc2l6ZT09PXQuZmxhZ2dlZEFubm90YXRpb25zLmxlbmd0aClmb3IoY29uc3QgdCBvZiBlKW4uZGVsZXRlKHQpO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2ZsYWdnZWRBbm5vdGF0aW9uczpbLi4ubl0sc2VsZWN0ZWRBbm5vdGF0aW9uczpbXX0pfSkpLGJrKHpidCwoKHQse2Fubm90YXRpb25zOmV9KT0+e2NvbnN0IG49bmV3IFNldChbLi4udC5oaWRkZW5Bbm5vdGF0aW9ucywuLi5lXSk7aWYobi5zaXplPT09dC5oaWRkZW5Bbm5vdGF0aW9ucy5sZW5ndGgpZm9yKGNvbnN0IHQgb2YgZSluLmRlbGV0ZSh0KTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtoaWRkZW5Bbm5vdGF0aW9uczpbLi4ubl0sc2VsZWN0ZWRBbm5vdGF0aW9uczpbXX0pfSkpLGJrKElidCwoKHQse3JlZ2V4OmV9KT0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHthbm5vdGF0aW9uc1JlZ2V4OmV9KSkpLGJrKEhidCwoKHQse3JlZ2V4OmV9KT0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHttZXRyaWNzUmVnZXg6ZX0pKSksYmsoRmJ0LCgodCx7bWV0cmljOmV9KT0+e2lmKHQubWV0cmljRmlsdGVyc1tlXSlyZXR1cm4gdDtjb25zdCBuPVtdO3JldHVybiAwIT09dC5tZXRyaWNBcml0aG1ldGljLmxlbmd0aCYmbi5wdXNoKHtraW5kOnRidC5PUEVSQVRPUixvcGVyYXRvcjokaHQuQU5EfSksbi5wdXNoKHtraW5kOnRidC5NRVRSSUMsbWV0cmljOmV9KSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse21ldHJpY0FyaXRobWV0aWM6Wy4uLnQubWV0cmljQXJpdGhtZXRpYywuLi5uXSxtZXRyaWNGaWx0ZXJzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0Lm1ldHJpY0ZpbHRlcnMpLHtbZV06e21heDoxLG1pbjotMSxpbmNsdWRlTmFOOiExfX0pLHNvcnQ6e21ldHJpYzplLG9yZGVyOm5idC5ERVNDRU5ESU5HfX0pfSkpLGJrKExidCwoKHQse21ldHJpYzplfSk9PntpZighdC5tZXRyaWNGaWx0ZXJzW2VdKXJldHVybiB0O2xldCBuPTAsbz0wLGk9Mjtjb25zdCBhPWZBKHQubWV0cmljRmlsdGVycyxbInN5bWJvbCI9PXR5cGVvZiBlP2U6ZSsiIl0pO2Zvcihjb25zdCBvIGluIHQubWV0cmljQXJpdGhtZXRpYyl7Y29uc3QgaT10Lm1ldHJpY0FyaXRobWV0aWNbb107aS5raW5kPT09dGJ0Lk1FVFJJQyYmaS5tZXRyaWM9PT1lJiYobj1wYXJzZUludChvKSl9cmV0dXJuIDAhPT1uJiYobz1uLTEsaT1uKzEpLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7bWV0cmljQXJpdGhtZXRpYzpbLi4udC5tZXRyaWNBcml0aG1ldGljLnNsaWNlKDAsbyksLi4udC5tZXRyaWNBcml0aG1ldGljLnNsaWNlKGkpXSxtZXRyaWNGaWx0ZXJzOmF9KX0pKSxiayhCYnQsKCh0LHttZXRyaWM6ZSxtYXg6bixtaW46byxpbmNsdWRlTmFOOml9KT0+dC5tZXRyaWNGaWx0ZXJzW2VdP09iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7bWV0cmljRmlsdGVyczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5tZXRyaWNGaWx0ZXJzKSx7W2VdOnttYXg6bixtaW46byxpbmNsdWRlTmFOOml9fSl9KTp0KSksYmsoVmJ0LCgodCx7bWV0cmljOmV9KT0+e2NvbnN0IG49e21ldHJpYzplLG9yZGVyOm5idC5ERVNDRU5ESU5HfTtyZXR1cm4gdC5zb3J0Lm1ldHJpYz09PWUmJnQuc29ydC5vcmRlcj09PW5idC5ERVNDRU5ESU5HJiYobi5vcmRlcj1uYnQuQVNDRU5ETkcpLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7c29ydDpufSl9KSksYmsoamJ0LCgodCx7YW5ub3RhdGlvbjplfSk9Pntjb25zdCBuPXttZXRyaWM6ZSxvcmRlcjpuYnQuU0lNSUxBUn07cmV0dXJuIHQuc29ydC5tZXRyaWM9PT1lJiZ0LnNvcnQub3JkZXI9PT1uYnQuU0lNSUxBUiYmKG4ub3JkZXI9bmJ0LkRJU1NJTUlMQVIpLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7c29ydDpufSl9KSksYmsoVWJ0LCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3BjRXhwYW5kZWQ6IXQucGNFeHBhbmRlZH0pKSksYmsoR2J0LCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2Fubm90YXRpb25zRXhwYW5kZWQ6IXQuYW5ub3RhdGlvbnNFeHBhbmRlZH0pKSksYmsoV2J0LCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NpZGViYXJFeHBhbmRlZDohdC5zaWRlYmFyRXhwYW5kZWR9KSkpLGJrKFlidCwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzaG93Q291bnRzOiF0LnNob3dDb3VudHN9KSkpLGJrKHFidCwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzaG93SGlkZGVuQW5ub3RhdGlvbnM6IXQuc2hvd0hpZGRlbkFubm90YXRpb25zfSkpKSxiayhaYnQsKCh0LHttZXRyaWM6ZX0pPT57bGV0IG49ZWJ0LkVNQkVERElOR1Msbz1lO3JldHVybiBlPT09dC5lbWJlZGRpbmdzTWV0cmljJiYobj1lYnQuREVGQVVMVCxvPSIiKSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3ZpZXdBY3RpdmU6bixlbWJlZGRpbmdzTWV0cmljOm99KX0pKSxiayhYYnQsKCh0LHtzaWRlYmFyV2lkdGg6ZX0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NpZGViYXJXaWR0aDplfSkpKSxiayhLYnQsKCh0LHtzaWRlYmFyV2lkdGg6ZX0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2VtYmVkZGluZ3NTaWRlYmFyV2lkdGg6ZX0pKSksYmsoSmJ0LCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2VtYmVkZGluZ3NTaWRlYmFyRXhwYW5kZWQ6IXQuZW1iZWRkaW5nc1NpZGViYXJFeHBhbmRlZH0pKSksYmsoUWJ0LCgodCx7ZGF0YVNldDplfSk9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7ZW1iZWRkaW5nRGF0YVNldDplfSkpKSk7ZnVuY3Rpb24gaXl0KHQsZSl7cmV0dXJuIG95dCh0LGUpfWZ1bmN0aW9uIGF5dCh0LGUpezEmdCYmVG0oMCwibWF0LWljb24iLDcpfWZ1bmN0aW9uIHJ5dCh0LGUpe2lmKDEmdCYmKFJtKDAsIm1hdC1vcHRpb24iLDgpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdDtEbSgidmFsdWUiLHQpLHJjKDEpLFN1KHQpfX1jbGFzcyBzeXR7Y29uc3RydWN0b3IoKXt0aGlzLm9uUmVnZXhGaWx0ZXJWYWx1ZUNoYW5nZT1uZXcgTGgsdGhpcy5vbkFkZEZpbHRlcj1uZXcgTGh9b25PcHRpb25TZWxlY3RlZCh0LGUpe3RoaXMub25BZGRGaWx0ZXIuZW1pdCh0Lm9wdGlvbi52YWx1ZSksZS52YWx1ZT0iIn19c3l0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxzeXQpfSxzeXQuybVjbXA9dG8oe3R5cGU6c3l0LHNlbGVjdG9yczpbWyJtZXRyaWMtc2VhcmNoLWNvbXBvbmVudCJdXSxob3N0VmFyczoyLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZwdSgidmFsaWQiLG4uaXNSZWdleEZpbHRlclZhbGlkKX0saW5wdXRzOntjb21wbGV0aW9uczoiY29tcGxldGlvbnMiLHJlZ2V4RmlsdGVyVmFsdWU6InJlZ2V4RmlsdGVyVmFsdWUiLGlzUmVnZXhGaWx0ZXJWYWxpZDoiaXNSZWdleEZpbHRlclZhbGlkIn0sb3V0cHV0czp7b25SZWdleEZpbHRlclZhbHVlQ2hhbmdlOiJvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UiLG9uQWRkRmlsdGVyOiJvbkFkZEZpbHRlciJ9LGRlY2xzOjcsdmFyczo0LGNvbnN0czpbWyJzdmdJY29uIiwic2VhcmNoXzI0cHgiXSxbIm1hdElucHV0IiwiIiwiYXV0b2NvbXBsZXRlIiwib2ZmIiwicGxhY2Vob2xkZXIiLCJBZGQgTWV0cmljIEZpbHRlciIsMywidmFsdWUiLCJtYXRBdXRvY29tcGxldGUiLCJpbnB1dCJdLFsibWF0SW5wdXQiLCIiXSxbInN2Z0ljb24iLCJlcnJvcl8yNHB4IiwiY2xhc3MiLCJlcnJvci1pY29uIiwibWF0VG9vbHRpcCIsIkludmFsaWQgcmVnZXggZmlsdGVyLiBUaGUgcmVzdWx0IG1heSBiZSBzdGFsZS4iLDQsIm5nSWYiXSxbImF1dG9BY3RpdmVGaXJzdE9wdGlvbiIsIiIsMywib3B0aW9uU2VsZWN0ZWQiXSxbImZpbHRlck1hdGNoZXMiLCJtYXRBdXRvY29tcGxldGUiXSxbMywidmFsdWUiLDQsIm5nRm9yIiwibmdGb3JPZiJdLFsic3ZnSWNvbiIsImVycm9yXzI0cHgiLCJtYXRUb29sdGlwIiwiSW52YWxpZCByZWdleCBmaWx0ZXIuIFRoZSByZXN1bHQgbWF5IGJlIHN0YWxlLiIsMSwiZXJyb3ItaWNvbiJdLFszLCJ2YWx1ZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlKXtjb25zdCB0PUhtKCk7VG0oMCwibWF0LWljb24iLDApLFJtKDEsImlucHV0IiwxLDIpLFZtKCJpbnB1dCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25SZWdleEZpbHRlclZhbHVlQ2hhbmdlLmVtaXQoZS50YXJnZXQudmFsdWUpfSkpLEFtKCksUXAoMyxheXQsMSwwLCJtYXQtaWNvbiIsMyksUm0oNCwibWF0LWF1dG9jb21wbGV0ZSIsNCw1KSxWbSgib3B0aW9uU2VsZWN0ZWQiLChmdW5jdGlvbiBlKG8pe2hpKHQpO2NvbnN0IGk9JHAoMik7cmV0dXJuIG4ub25PcHRpb25TZWxlY3RlZChvLGkpfSkpLFFwKDYscnl0LDIsMiwibWF0LW9wdGlvbiIsNiksQW0oKX1pZigyJmUpe2NvbnN0IHQ9JHAoNSk7cmMoMSksRG0oInZhbHVlIixuLnJlZ2V4RmlsdGVyVmFsdWUpKCJtYXRBdXRvY29tcGxldGUiLHQpLHJjKDIpLERtKCJuZ0lmIiwhbi5pc1JlZ2V4RmlsdGVyVmFsaWQpLHJjKDMpLERtKCJuZ0Zvck9mIixuLmNvbXBsZXRpb25zKX19LGRpcmVjdGl2ZXM6W0RXLExZLFcwLGRNLEgwLGxNLEJIXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17ZmxleDpub25lO21hcmdpbi1yaWdodDo1cHh9W19uZ2hvc3QtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cGFkZGluZzowIDEwcHg7cG9zaXRpb246cmVsYXRpdmU7Zm9udC1zaXplOi45ZW19W19uZ2hvc3QtJUNPTVAlXTpub3QoLnZhbGlkKXtjb2xvcjojYzYyODI4fVtfbmdob3N0LSVDT01QJV06bm90KC52YWxpZCkgICBpbnB1dFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6Y3VycmVudENvbG9yfSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChzeXQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWV0cmljLXNlYXJjaC1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiIuL21ldHJpY19zZWFyY2hfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vbWV0cmljX3NlYXJjaF9jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7Y29tcGxldGlvbnM6W3t0eXBlOnh5fV0scmVnZXhGaWx0ZXJWYWx1ZTpbe3R5cGU6eHl9XSxpc1JlZ2V4RmlsdGVyVmFsaWQ6W3t0eXBlOlB5LGFyZ3M6WyJjbGFzcy52YWxpZCJdfSx7dHlwZTp4eX1dLG9uUmVnZXhGaWx0ZXJWYWx1ZUNoYW5nZTpbe3R5cGU6T3l9XSxvbkFkZEZpbHRlcjpbe3R5cGU6T3l9XX0pO2NsYXNzIGx5dHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5tZXRyaWNzUmVnZXgkPXRoaXMuc3RvcmUuc2VsZWN0KHVidCksdGhpcy5hY3RpdmVSdW5zJD10aGlzLnN0b3JlLnBpcGUoRncoTk4pKS5waXBlKEl0KCh0PT50P0FycmF5LmZyb20odC5lbnRyaWVzKCkpLmZpbHRlcigodD0+dFsxXSkpLm1hcCgodD0+dFswXSkpOltdKSkpLHRoaXMubWV0cmljc0ZvckFjdGl2ZVJ1bnMkPVd0KHRoaXMuYWN0aXZlUnVucyQsdGhpcy5zdG9yZS5zZWxlY3Qoc2J0KSkucGlwZShJdCgoKFt0LGVdKT0+e2NvbnN0IG49bmV3IFNldDtmb3IoY29uc3QgbyBvZiB0KWlmKGVbb10pZm9yKGNvbnN0IHQgb2YgZVtvXSluLmFkZCh0KTtyZXR1cm5bLi4ubl19KSkpLHRoaXMuaXNNZXRyaWNzRmlsdGVyVmFsaWQkPXRoaXMubWV0cmljc1JlZ2V4JC5waXBlKEl0KCh0PT57dHJ5e3JldHVybiBCb29sZWFuKG5ldyBSZWdFeHAodCkpfWNhdGNoKHQpe3JldHVybiExfX0pKSksdGhpcy5tZXRyaWNGaWx0ZXJLZXlzJD10aGlzLnN0b3JlLnBpcGUoRncoZ2J0KSkucGlwZShJdCgodD0+T2JqZWN0LmtleXModCkpKSksdGhpcy5jb21wbGV0aW9ucyQ9V3QodGhpcy5tZXRyaWNzRm9yQWN0aXZlUnVucyQsdGhpcy5tZXRyaWNzUmVnZXgkLHRoaXMubWV0cmljRmlsdGVyS2V5cyQpLnBpcGUoSXQoKChbdCxlLG5dKT0+e2NvbnN0IG89dC5maWx0ZXIoKHQ9PiFuLmluY2x1ZGVzKHQpKSk7dHJ5e2NvbnN0IHQ9bmV3IFJlZ0V4cChlLCJpIik7cmV0dXJuIG8uZmlsdGVyKChlPT50LnRlc3QoZSkpKS5zb3J0KCl9Y2F0Y2godCl7cmV0dXJuW119fSkpKX1vbkZpbHRlckNoYW5nZSh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKEhidCh7cmVnZXg6dH0pKX1vbkFkZEZpbHRlcih0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKEZidCh7bWV0cmljOnR9KSksdGhpcy5zdG9yZS5kaXNwYXRjaChIYnQoe3JlZ2V4OiIifSkpfX1mdW5jdGlvbiBjeXQodCxlLG4pe2NvbnN0IG89W1tlLC4uLm5dXTtpZighbi5sZW5ndGh8fCF0Lmxlbmd0aClyZXR1cm4iZGF0YTp0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04LCIrby5tYXAoKHQ9PnQuam9pbigiLCIpKSkuam9pbigiXG4iKTtjb25zdCBpPW4ubWFwKCh0PT5ueXQodCkpKTtmb3IoY29uc3RbbixhXW9mIHQpe2NvbnN0IHQ9YS5maWx0ZXIoKHQ9PnQucnVuPT09ZSkpO2lmKHQubGVuZ3RoKXtjb25zdCBlPVtuXTtmb3IoY29uc3QgbiBvZiBpKXtjb25zdCBvPXQuZmluZCgodD0+dC5tZXRyaWM9PT1uKSk7ZS5wdXNoKHZvaWQgMD09PW8/Im51bGwiOmAke28ublBNSVZhbHVlfWApfW8ucHVzaChlKX19cmV0dXJuImRhdGE6dGV4dC9jc3Y7Y2hhcnNldD11dGYtOCwiK28ubWFwKCh0PT50LmpvaW4oIiwiKSkpLmpvaW4oIlxuIil9bHl0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxseXQpKFNtKEl3KSl9LGx5dC7JtWNtcD10byh7dHlwZTpseXQsc2VsZWN0b3JzOltbIm5wbWktbWV0cmljLXNlYXJjaCJdXSxkZWNsczo0LHZhcnM6OSxjb25zdHM6W1szLCJyZWdleEZpbHRlclZhbHVlIiwiY29tcGxldGlvbnMiLCJpc1JlZ2V4RmlsdGVyVmFsaWQiLCJvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UiLCJvbkFkZEZpbHRlciJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwibWV0cmljLXNlYXJjaC1jb21wb25lbnQiLDApLFZtKCJvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uRmlsdGVyQ2hhbmdlKGUpfSkpKCJvbkFkZEZpbHRlciIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25BZGRGaWx0ZXIoZSl9KSksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQW0oKSksMiZlJiZEbSgicmVnZXhGaWx0ZXJWYWx1ZSIsVGgoMSwzLG4ubWV0cmljc1JlZ2V4JCkpKCJjb21wbGV0aW9ucyIsVGgoMiw1LG4uY29tcGxldGlvbnMkKSkoImlzUmVnZXhGaWx0ZXJWYWxpZCIsVGgoMyw3LG4uaXNNZXRyaWNzRmlsdGVyVmFsaWQkKSl9LGRpcmVjdGl2ZXM6W3N5dF0scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGx5dCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJucG1pLW1ldHJpYy1zZWFyY2giLHRlbXBsYXRlOidcbiAgICA8bWV0cmljLXNlYXJjaC1jb21wb25lbnRcbiAgICAgIFtyZWdleEZpbHRlclZhbHVlXT0ibWV0cmljc1JlZ2V4JCB8IGFzeW5jIlxuICAgICAgW2NvbXBsZXRpb25zXT0iY29tcGxldGlvbnMkIHwgYXN5bmMiXG4gICAgICBbaXNSZWdleEZpbHRlclZhbGlkXT0iaXNNZXRyaWNzRmlsdGVyVmFsaWQkIHwgYXN5bmMiXG4gICAgICAob25SZWdleEZpbHRlclZhbHVlQ2hhbmdlKT0ib25GaWx0ZXJDaGFuZ2UoJGV2ZW50KSJcbiAgICAgIChvbkFkZEZpbHRlcik9Im9uQWRkRmlsdGVyKCRldmVudCkiXG4gICAgPjwvbWV0cmljLXNlYXJjaC1jb21wb25lbnQ+XG4gICcsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSxudWxsKTtjb25zdCBkeXQ9ZnVuY3Rpb24odCl7cmV0dXJueyJhY3RpdmUtYnV0dG9uIjp0fX07Y2xhc3MgcHl0e2Rvd25sb2FkUmVzdWx0cygpe2Zvcihjb25zdCB0IG9mIHRoaXMucnVucyl7Y29uc3QgZT1jeXQodGhpcy5mbGFnZ2VkRGF0YSx0LHRoaXMubWV0cmljcyksbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7bi5zZXRBdHRyaWJ1dGUoImhyZWYiLGUpLG4uc2V0QXR0cmlidXRlKCJkb3dubG9hZCIsYHJlcG9ydF8ke3R9LmNzdmApLG4uY2xpY2soKX19fXB5dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8cHl0KX0scHl0Lsm1Y21wPXRvKHt0eXBlOnB5dCxzZWxlY3RvcnM6W1sicmVzdWx0cy1kb3dubG9hZC1jb21wb25lbnQiXV0saW5wdXRzOntudW1GbGFnZ2VkQW5ub3RhdGlvbnM6Im51bUZsYWdnZWRBbm5vdGF0aW9ucyIscnVuczoicnVucyIsZmxhZ2dlZERhdGE6ImZsYWdnZWREYXRhIixtZXRyaWNzOiJtZXRyaWNzIn0sZGVjbHM6NCx2YXJzOjUsY29uc3RzOltbIm1hdC1zdHJva2VkLWJ1dHRvbiIsIiIsInRpdGxlIiwiRXhwb3J0IENTViByZXBvcnRzIG9mIGFsbCBmbGFnZ2VkIGFubm90YXRpb25zLiBXaWxsIGdlbmVyYXRlIG9uZSBDU1YgcGVyIGFjdGl2ZSBydW4uIiwzLCJkaXNhYmxlZCIsIm5nQ2xhc3MiLCJjbGljayJdLFsxLCJidXR0b24tY29udGVudHMiXSxbInN2Z0ljb24iLCJnZXRfYXBwXzI0cHgiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImJ1dHRvbiIsMCksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLmRvd25sb2FkUmVzdWx0cygpfSkpLFJtKDEsInNwYW4iLDEpLFRtKDIsIm1hdC1pY29uIiwyKSxrdSgzKSxBbSgpLEFtKCkpLDImZSYmKERtKCJkaXNhYmxlZCIsMD09PW4ubnVtRmxhZ2dlZEFubm90YXRpb25zKSgibmdDbGFzcyIsTWgoMyxkeXQsbi5udW1GbGFnZ2VkQW5ub3RhdGlvbnM+MCkpLHJjKDMpLER1KCIgRmxhZ2dlZCBSb3dzICgiLG4ubnVtRmxhZ2dlZEFubm90YXRpb25zLCIpICIpKX0sZGlyZWN0aXZlczpbWEgsYU0sRFddLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5hY3RpdmUtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Ym9yZGVyOjFweCBzb2xpZCAjZWJlYmViO2NvbG9yOiNmZmZ9LmJ1dHRvbi1jb250ZW50c1tfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9bWF0LWljb25bX25nY29udGVudC0lQ09NUCVde21hcmdpbi1yaWdodDo2cHh9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHB5dCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJyZXN1bHRzLWRvd25sb2FkLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vcmVzdWx0c19kb3dubG9hZF9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9yZXN1bHRzX2Rvd25sb2FkX2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSxudWxsLHtudW1GbGFnZ2VkQW5ub3RhdGlvbnM6W3t0eXBlOnh5fV0scnVuczpbe3R5cGU6eHl9XSxmbGFnZ2VkRGF0YTpbe3R5cGU6eHl9XSxtZXRyaWNzOlt7dHlwZTp4eX1dfSk7Y2xhc3MgbXl0e2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLmZsYWdnZWRBbm5vdGF0aW9ucyQ9dGhpcy5zdG9yZS5zZWxlY3QoZGJ0KSx0aGlzLm51bUZsYWdnZWRBbm5vdGF0aW9ucyQ9dGhpcy5mbGFnZ2VkQW5ub3RhdGlvbnMkLnBpcGUoSXQoKHQ9PnQubGVuZ3RoKSkpLHRoaXMuYWN0aXZlUnVucyQ9dGhpcy5zdG9yZS5zZWxlY3QoTk4pLnBpcGUoSXQoKHQ9PnQ/QXJyYXkuZnJvbSh0LmVudHJpZXMoKSkuZmlsdGVyKCh0PT50WzFdKSkubWFwKCh0PT50WzBdKSk6W10pKSksdGhpcy5mbGFnZ2VkRGF0YSQ9V3QoW3RoaXMuc3RvcmUuc2VsZWN0KHJidCksdGhpcy5mbGFnZ2VkQW5ub3RhdGlvbnMkXSkucGlwZShJdCgoKFt0LGVdKT0+e2NvbnN0IG49bmV3IFNldChlKTtyZXR1cm4gT2JqZWN0LmVudHJpZXModCkuZmlsdGVyKCh0PT5uLmhhcyh0WzBdKSkpfSkpKSx0aGlzLm1ldHJpY3MkPVd0KFt0aGlzLnN0b3JlLnNlbGVjdChzYnQpLHRoaXMuYWN0aXZlUnVucyQsdGhpcy5zdG9yZS5zZWxlY3QoZ2J0KV0pLnBpcGUoSXQoKChbdCxlLG5dKT0+e2xldCBvPU9iamVjdC5rZXlzKG4pO2Zvcihjb25zdCBuIG9mIGUpdFtuXSYmKG89by5jb25jYXQodFtuXS5maWx0ZXIoKHQ9PmV5dCh0KSkpKSk7cmV0dXJuIG89Wy4uLm5ldyBTZXQobyldLG99KSkpfX1teXQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fG15dCkoU20oSXcpKX0sbXl0Lsm1Y21wPXRvKHt0eXBlOm15dCxzZWxlY3RvcnM6W1sibnBtaS1yZXN1bHRzLWRvd25sb2FkIl1dLGRlY2xzOjUsdmFyczoxMixjb25zdHM6W1szLCJudW1GbGFnZ2VkQW5ub3RhdGlvbnMiLCJydW5zIiwiZmxhZ2dlZERhdGEiLCJtZXRyaWNzIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihUbSgwLCJyZXN1bHRzLWRvd25sb2FkLWNvbXBvbmVudCIsMCksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQWgoNCwiYXN5bmMiKSksMiZlJiZEbSgibnVtRmxhZ2dlZEFubm90YXRpb25zIixUaCgxLDQsbi5udW1GbGFnZ2VkQW5ub3RhdGlvbnMkKSkoInJ1bnMiLFRoKDIsNixuLmFjdGl2ZVJ1bnMkKSkoImZsYWdnZWREYXRhIixUaCgzLDgsbi5mbGFnZ2VkRGF0YSQpKSgibWV0cmljcyIsVGgoNCwxMCxuLm1ldHJpY3MkKSl9LGRpcmVjdGl2ZXM6W3B5dF0scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKG15dCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJucG1pLXJlc3VsdHMtZG93bmxvYWQiLHRlbXBsYXRlOidcbiAgICA8cmVzdWx0cy1kb3dubG9hZC1jb21wb25lbnRcbiAgICAgIFtudW1GbGFnZ2VkQW5ub3RhdGlvbnNdPSJudW1GbGFnZ2VkQW5ub3RhdGlvbnMkIHwgYXN5bmMiXG4gICAgICBbcnVuc109ImFjdGl2ZVJ1bnMkIHwgYXN5bmMiXG4gICAgICBbZmxhZ2dlZERhdGFdPSJmbGFnZ2VkRGF0YSQgfCBhc3luYyJcbiAgICAgIFttZXRyaWNzXT0ibWV0cmljcyQgfCBhc3luYyJcbiAgICA+PC9yZXN1bHRzLWRvd25sb2FkLWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NvbnN0IHV5dD1uZXcgR2EoIk1hdENoaXBSZW1vdmUiKSxmeXQ9bmV3IEdhKCJNYXRDaGlwQXZhdGFyIiksZ3l0PW5ldyBHYSgiTWF0Q2hpcFRyYWlsaW5nSWNvbiIpLGh5dD0kSShKSShRSShjbGFzc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl9lbGVtZW50UmVmPXR9fSksInByaW1hcnkiKSwtMSk7Y2xhc3MgYnl0e31ieXQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGJ5dCl9LGJ5dC7JtWRpcj1sbyh7dHlwZTpieXQsc2VsZWN0b3JzOltbIm1hdC1jaGlwLWF2YXRhciJdLFsiIiwibWF0Q2hpcEF2YXRhciIsIiJdXSxob3N0QXR0cnM6WzEsIm1hdC1jaGlwLWF2YXRhciJdLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6Znl0LHVzZUV4aXN0aW5nOmJ5dH1dKV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGJ5dCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJtYXQtY2hpcC1hdmF0YXIsIFttYXRDaGlwQXZhdGFyXSIsaG9zdDp7Y2xhc3M6Im1hdC1jaGlwLWF2YXRhciJ9LHByb3ZpZGVyczpbe3Byb3ZpZGU6Znl0LHVzZUV4aXN0aW5nOmJ5dH1dfV19XSxudWxsLG51bGwpO2NsYXNzIHl5dHt9eXl0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx5eXQpfSx5eXQuybVkaXI9bG8oe3R5cGU6eXl0LHNlbGVjdG9yczpbWyJtYXQtY2hpcC10cmFpbGluZy1pY29uIl0sWyIiLCJtYXRDaGlwVHJhaWxpbmdJY29uIiwiIl1dLGhvc3RBdHRyczpbMSwibWF0LWNoaXAtdHJhaWxpbmctaWNvbiJdLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6Z3l0LHVzZUV4aXN0aW5nOnl5dH1dKV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHl5dCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJtYXQtY2hpcC10cmFpbGluZy1pY29uLCBbbWF0Q2hpcFRyYWlsaW5nSWNvbl0iLGhvc3Q6e2NsYXNzOiJtYXQtY2hpcC10cmFpbGluZy1pY29uIn0scHJvdmlkZXJzOlt7cHJvdmlkZTpneXQsdXNlRXhpc3Rpbmc6eXl0fV19XX1dLG51bGwsbnVsbCk7Y2xhc3MgX3l0IGV4dGVuZHMgaHl0e2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIscyl7c3VwZXIodCksdGhpcy5fbmdab25lPWUsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWY9aSx0aGlzLl9oYXNGb2N1cz0hMSx0aGlzLmNoaXBMaXN0U2VsZWN0YWJsZT0hMCx0aGlzLl9jaGlwTGlzdE11bHRpcGxlPSExLHRoaXMuX2NoaXBMaXN0RGlzYWJsZWQ9ITEsdGhpcy5fc2VsZWN0ZWQ9ITEsdGhpcy5fc2VsZWN0YWJsZT0hMCx0aGlzLl9kaXNhYmxlZD0hMSx0aGlzLl9yZW1vdmFibGU9ITAsdGhpcy5fb25Gb2N1cz1uZXcgSSx0aGlzLl9vbkJsdXI9bmV3IEksdGhpcy5zZWxlY3Rpb25DaGFuZ2U9bmV3IExoLHRoaXMuZGVzdHJveWVkPW5ldyBMaCx0aGlzLnJlbW92ZWQ9bmV3IExoLHRoaXMuX2FkZEhvc3RDbGFzc05hbWUoKSx0aGlzLl9jaGlwUmlwcGxlVGFyZ2V0PWEuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5fY2hpcFJpcHBsZVRhcmdldC5jbGFzc0xpc3QuYWRkKCJtYXQtY2hpcC1yaXBwbGUiKSx0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fY2hpcFJpcHBsZVRhcmdldCksdGhpcy5fY2hpcFJpcHBsZT1uZXcgUEgodGhpcyxlLHRoaXMuX2NoaXBSaXBwbGVUYXJnZXQsbiksdGhpcy5fY2hpcFJpcHBsZS5zZXR1cFRyaWdnZXJFdmVudHModCksdGhpcy5yaXBwbGVDb25maWc9b3x8e30sdGhpcy5fYW5pbWF0aW9uc0Rpc2FibGVkPSJOb29wQW5pbWF0aW9ucyI9PT1yLHRoaXMudGFiSW5kZXg9bnVsbCE9cyYmcGFyc2VJbnQocyl8fC0xfWdldCByaXBwbGVEaXNhYmxlZCgpe3JldHVybiB0aGlzLmRpc2FibGVkfHx0aGlzLmRpc2FibGVSaXBwbGV8fHRoaXMuX2FuaW1hdGlvbnNEaXNhYmxlZHx8ISF0aGlzLnJpcHBsZUNvbmZpZy5kaXNhYmxlZH1nZXQgc2VsZWN0ZWQoKXtyZXR1cm4gdGhpcy5fc2VsZWN0ZWR9c2V0IHNlbGVjdGVkKHQpe2NvbnN0IGU9eXoodCk7ZSE9PXRoaXMuX3NlbGVjdGVkJiYodGhpcy5fc2VsZWN0ZWQ9ZSx0aGlzLl9kaXNwYXRjaFNlbGVjdGlvbkNoYW5nZSgpKX1nZXQgdmFsdWUoKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fdmFsdWU/dGhpcy5fdmFsdWU6dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnRleHRDb250ZW50fXNldCB2YWx1ZSh0KXt0aGlzLl92YWx1ZT10fWdldCBzZWxlY3RhYmxlKCl7cmV0dXJuIHRoaXMuX3NlbGVjdGFibGUmJnRoaXMuY2hpcExpc3RTZWxlY3RhYmxlfXNldCBzZWxlY3RhYmxlKHQpe3RoaXMuX3NlbGVjdGFibGU9eXoodCl9Z2V0IGRpc2FibGVkKCl7cmV0dXJuIHRoaXMuX2NoaXBMaXN0RGlzYWJsZWR8fHRoaXMuX2Rpc2FibGVkfXNldCBkaXNhYmxlZCh0KXt0aGlzLl9kaXNhYmxlZD15eih0KX1nZXQgcmVtb3ZhYmxlKCl7cmV0dXJuIHRoaXMuX3JlbW92YWJsZX1zZXQgcmVtb3ZhYmxlKHQpe3RoaXMuX3JlbW92YWJsZT15eih0KX1nZXQgYXJpYVNlbGVjdGVkKCl7cmV0dXJuIHRoaXMuc2VsZWN0YWJsZSYmKHRoaXMuX2NoaXBMaXN0TXVsdGlwbGV8fHRoaXMuc2VsZWN0ZWQpP3RoaXMuc2VsZWN0ZWQudG9TdHJpbmcoKTpudWxsfV9hZGRIb3N0Q2xhc3NOYW1lKCl7Y29uc3QgdD0ibWF0LWJhc2ljLWNoaXAiLGU9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O2UuaGFzQXR0cmlidXRlKHQpfHxlLnRhZ05hbWUudG9Mb3dlckNhc2UoKT09PXQ/ZS5jbGFzc0xpc3QuYWRkKHQpOmUuY2xhc3NMaXN0LmFkZCgibWF0LXN0YW5kYXJkLWNoaXAiKX1uZ09uRGVzdHJveSgpe3RoaXMuZGVzdHJveWVkLmVtaXQoe2NoaXA6dGhpc30pLHRoaXMuX2NoaXBSaXBwbGUuX3JlbW92ZVRyaWdnZXJFdmVudHMoKX1zZWxlY3QoKXt0aGlzLl9zZWxlY3RlZHx8KHRoaXMuX3NlbGVjdGVkPSEwLHRoaXMuX2Rpc3BhdGNoU2VsZWN0aW9uQ2hhbmdlKCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpfWRlc2VsZWN0KCl7dGhpcy5fc2VsZWN0ZWQmJih0aGlzLl9zZWxlY3RlZD0hMSx0aGlzLl9kaXNwYXRjaFNlbGVjdGlvbkNoYW5nZSgpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKX1zZWxlY3RWaWFJbnRlcmFjdGlvbigpe3RoaXMuX3NlbGVjdGVkfHwodGhpcy5fc2VsZWN0ZWQ9ITAsdGhpcy5fZGlzcGF0Y2hTZWxlY3Rpb25DaGFuZ2UoITApLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKX10b2dnbGVTZWxlY3RlZCh0PSExKXtyZXR1cm4gdGhpcy5fc2VsZWN0ZWQ9IXRoaXMuc2VsZWN0ZWQsdGhpcy5fZGlzcGF0Y2hTZWxlY3Rpb25DaGFuZ2UodCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCksdGhpcy5zZWxlY3RlZH1mb2N1cygpe3RoaXMuX2hhc0ZvY3VzfHwodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCksdGhpcy5fb25Gb2N1cy5uZXh0KHtjaGlwOnRoaXN9KSksdGhpcy5faGFzRm9jdXM9ITB9cmVtb3ZlKCl7dGhpcy5yZW1vdmFibGUmJnRoaXMucmVtb3ZlZC5lbWl0KHtjaGlwOnRoaXN9KX1faGFuZGxlQ2xpY2sodCl7dGhpcy5kaXNhYmxlZD90LnByZXZlbnREZWZhdWx0KCk6dC5zdG9wUHJvcGFnYXRpb24oKX1faGFuZGxlS2V5ZG93bih0KXtpZighdGhpcy5kaXNhYmxlZClzd2l0Y2godC5rZXlDb2RlKXtjYXNlIDQ2OmNhc2UgODp0aGlzLnJlbW92ZSgpLHQucHJldmVudERlZmF1bHQoKTticmVhaztjYXNlIGZ6OnRoaXMuc2VsZWN0YWJsZSYmdGhpcy50b2dnbGVTZWxlY3RlZCghMCksdC5wcmV2ZW50RGVmYXVsdCgpfX1fYmx1cigpe3RoaXMuX25nWm9uZS5vblN0YWJsZS5waXBlKGJlKDEpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fbmdab25lLnJ1bigoKCk9Pnt0aGlzLl9oYXNGb2N1cz0hMSx0aGlzLl9vbkJsdXIubmV4dCh7Y2hpcDp0aGlzfSl9KSl9KSl9X2Rpc3BhdGNoU2VsZWN0aW9uQ2hhbmdlKHQ9ITEpe3RoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoe3NvdXJjZTp0aGlzLGlzVXNlcklucHV0OnQsc2VsZWN0ZWQ6dGhpcy5fc2VsZWN0ZWR9KX19X3l0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxfeXQpKFNtKGhnKSxTbShhXyksU20od3opLFNtKHdILDgpLFNtKFVnKSxTbShaXyksU20oVlAsOCksTmEoInRhYmluZGV4IikpfSxfeXQuybVkaXI9bG8oe3R5cGU6X3l0LHNlbGVjdG9yczpbWyJtYXQtYmFzaWMtY2hpcCJdLFsiIiwibWF0LWJhc2ljLWNoaXAiLCIiXSxbIm1hdC1jaGlwIl0sWyIiLCJtYXQtY2hpcCIsIiJdXSxjb250ZW50UXVlcmllczpmdW5jdGlvbiB0KGUsbixvKXtpZigxJmUmJigkaChvLGZ5dCw1KSwkaChvLGd5dCw1KSwkaChvLHV5dCw1KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5hdmF0YXI9dC5maXJzdCksSmgodD10YigpKSYmKG4udHJhaWxpbmdJY29uPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLnJlbW92ZUljb249dC5maXJzdCl9fSxob3N0QXR0cnM6WyJyb2xlIiwib3B0aW9uIiwxLCJtYXQtY2hpcCIsIm1hdC1mb2N1cy1pbmRpY2F0b3IiXSxob3N0VmFyczoxNCxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezEmZSYmVm0oImNsaWNrIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5faGFuZGxlQ2xpY2soZSl9KSkoImtleWRvd24iLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9oYW5kbGVLZXlkb3duKGUpfSkpKCJmb2N1cyIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5mb2N1cygpfSkpKCJibHVyIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9ibHVyKCl9KSksMiZlJiYoanAoInRhYmluZGV4IixuLmRpc2FibGVkP251bGw6bi50YWJJbmRleCkoImRpc2FibGVkIixuLmRpc2FibGVkfHxudWxsKSgiYXJpYS1kaXNhYmxlZCIsbi5kaXNhYmxlZC50b1N0cmluZygpKSgiYXJpYS1zZWxlY3RlZCIsbi5hcmlhU2VsZWN0ZWQpLHB1KCJtYXQtY2hpcC1zZWxlY3RlZCIsbi5zZWxlY3RlZCkoIm1hdC1jaGlwLXdpdGgtYXZhdGFyIixuLmF2YXRhcikoIm1hdC1jaGlwLXdpdGgtdHJhaWxpbmctaWNvbiIsbi50cmFpbGluZ0ljb258fG4ucmVtb3ZlSWNvbikoIm1hdC1jaGlwLWRpc2FibGVkIixuLmRpc2FibGVkKSgiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLG4uX2FuaW1hdGlvbnNEaXNhYmxlZCkpfSxpbnB1dHM6e2NvbG9yOiJjb2xvciIsZGlzYWJsZVJpcHBsZToiZGlzYWJsZVJpcHBsZSIsdGFiSW5kZXg6InRhYkluZGV4IixzZWxlY3RlZDoic2VsZWN0ZWQiLHZhbHVlOiJ2YWx1ZSIsc2VsZWN0YWJsZToic2VsZWN0YWJsZSIsZGlzYWJsZWQ6ImRpc2FibGVkIixyZW1vdmFibGU6InJlbW92YWJsZSJ9LG91dHB1dHM6e3NlbGVjdGlvbkNoYW5nZToic2VsZWN0aW9uQ2hhbmdlIixkZXN0cm95ZWQ6ImRlc3Ryb3llZCIscmVtb3ZlZDoicmVtb3ZlZCJ9LGV4cG9ydEFzOlsibWF0Q2hpcCJdLGZlYXR1cmVzOlt4cF19KSxfeXQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ30se3R5cGU6YV99LHt0eXBlOnd6fSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3dIXX1dfSx7dHlwZTpVZ30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6amEsYXJnczpbInRhYmluZGV4Il19XX1dLF95dC5wcm9wRGVjb3JhdG9ycz17YXZhdGFyOlt7dHlwZTpxYSxhcmdzOltmeXRdfV0sdHJhaWxpbmdJY29uOlt7dHlwZTpxYSxhcmdzOltneXRdfV0scmVtb3ZlSWNvbjpbe3R5cGU6cWEsYXJnczpbdXl0XX1dLHNlbGVjdGVkOlt7dHlwZTp4eX1dLHZhbHVlOlt7dHlwZTp4eX1dLHNlbGVjdGFibGU6W3t0eXBlOnh5fV0sZGlzYWJsZWQ6W3t0eXBlOnh5fV0scmVtb3ZhYmxlOlt7dHlwZTp4eX1dLHNlbGVjdGlvbkNoYW5nZTpbe3R5cGU6T3l9XSxkZXN0cm95ZWQ6W3t0eXBlOk95fV0scmVtb3ZlZDpbe3R5cGU6T3l9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChfeXQsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoibWF0LWJhc2ljLWNoaXAsIFttYXQtYmFzaWMtY2hpcF0sIG1hdC1jaGlwLCBbbWF0LWNoaXBdIixpbnB1dHM6WyJjb2xvciIsImRpc2FibGVSaXBwbGUiLCJ0YWJJbmRleCJdLGV4cG9ydEFzOiJtYXRDaGlwIixob3N0OntjbGFzczoibWF0LWNoaXAgbWF0LWZvY3VzLWluZGljYXRvciIsIlthdHRyLnRhYmluZGV4XSI6ImRpc2FibGVkID8gbnVsbCA6IHRhYkluZGV4Iixyb2xlOiJvcHRpb24iLCJbY2xhc3MubWF0LWNoaXAtc2VsZWN0ZWRdIjoic2VsZWN0ZWQiLCJbY2xhc3MubWF0LWNoaXAtd2l0aC1hdmF0YXJdIjoiYXZhdGFyIiwiW2NsYXNzLm1hdC1jaGlwLXdpdGgtdHJhaWxpbmctaWNvbl0iOiJ0cmFpbGluZ0ljb24gfHwgcmVtb3ZlSWNvbiIsIltjbGFzcy5tYXQtY2hpcC1kaXNhYmxlZF0iOiJkaXNhYmxlZCIsIltjbGFzcy5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZV0iOiJfYW5pbWF0aW9uc0Rpc2FibGVkIiwiW2F0dHIuZGlzYWJsZWRdIjoiZGlzYWJsZWQgfHwgbnVsbCIsIlthdHRyLmFyaWEtZGlzYWJsZWRdIjoiZGlzYWJsZWQudG9TdHJpbmcoKSIsIlthdHRyLmFyaWEtc2VsZWN0ZWRdIjoiYXJpYVNlbGVjdGVkIiwiKGNsaWNrKSI6Il9oYW5kbGVDbGljaygkZXZlbnQpIiwiKGtleWRvd24pIjoiX2hhbmRsZUtleWRvd24oJGV2ZW50KSIsIihmb2N1cykiOiJmb2N1cygpIiwiKGJsdXIpIjoiX2JsdXIoKSJ9fV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOmFffSx7dHlwZTp3en0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOlt3SF19XX0se3R5cGU6VWd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmphLGFyZ3M6WyJ0YWJpbmRleCJdfV19XX0pLHtzZWxlY3Rpb25DaGFuZ2U6W3t0eXBlOk95fV0sZGVzdHJveWVkOlt7dHlwZTpPeX1dLHJlbW92ZWQ6W3t0eXBlOk95fV0sc2VsZWN0ZWQ6W3t0eXBlOnh5fV0sdmFsdWU6W3t0eXBlOnh5fV0sc2VsZWN0YWJsZTpbe3R5cGU6eHl9XSxkaXNhYmxlZDpbe3R5cGU6eHl9XSxyZW1vdmFibGU6W3t0eXBlOnh5fV0sYXZhdGFyOlt7dHlwZTpxYSxhcmdzOltmeXRdfV0sdHJhaWxpbmdJY29uOlt7dHlwZTpxYSxhcmdzOltneXRdfV0scmVtb3ZlSWNvbjpbe3R5cGU6cWEsYXJnczpbdXl0XX1dfSk7Y2xhc3MgQ3l0e2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fcGFyZW50Q2hpcD10LCJCVVRUT04iPT09ZS5uYXRpdmVFbGVtZW50Lm5vZGVOYW1lJiZlLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0eXBlIiwiYnV0dG9uIil9X2hhbmRsZUNsaWNrKHQpe2NvbnN0IGU9dGhpcy5fcGFyZW50Q2hpcDtlLnJlbW92YWJsZSYmIWUuZGlzYWJsZWQmJmUucmVtb3ZlKCksdC5zdG9wUHJvcGFnYXRpb24oKX19Q3l0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxDeXQpKFNtKF95dCksU20oaGcpKX0sQ3l0Lsm1ZGlyPWxvKHt0eXBlOkN5dCxzZWxlY3RvcnM6W1siIiwibWF0Q2hpcFJlbW92ZSIsIiJdXSxob3N0QXR0cnM6WzEsIm1hdC1jaGlwLXJlbW92ZSIsIm1hdC1jaGlwLXRyYWlsaW5nLWljb24iXSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezEmZSYmVm0oImNsaWNrIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5faGFuZGxlQ2xpY2soZSl9KSl9LGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6dXl0LHVzZUV4aXN0aW5nOkN5dH1dKV19KSxDeXQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpfeXR9LHt0eXBlOmhnfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChDeXQsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW21hdENoaXBSZW1vdmVdIixob3N0OntjbGFzczoibWF0LWNoaXAtcmVtb3ZlIG1hdC1jaGlwLXRyYWlsaW5nLWljb24iLCIoY2xpY2spIjoiX2hhbmRsZUNsaWNrKCRldmVudCkifSxwcm92aWRlcnM6W3twcm92aWRlOnV5dCx1c2VFeGlzdGluZzpDeXR9XX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOl95dH0se3R5cGU6aGd9XX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgTXl0PW5ldyBHYSgibWF0LWNoaXBzLWRlZmF1bHQtb3B0aW9ucyIpLHZ5dD10SChjbGFzc3tjb25zdHJ1Y3Rvcih0LGUsbixvKXt0aGlzLl9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXI9dCx0aGlzLl9wYXJlbnRGb3JtPWUsdGhpcy5fcGFyZW50Rm9ybUdyb3VwPW4sdGhpcy5uZ0NvbnRyb2w9b319KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovbGV0IHh5dD0wO2NsYXNzIE95dHtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuc291cmNlPXQsdGhpcy52YWx1ZT1lfX1jbGFzcyBQeXQgZXh0ZW5kcyB2eXR7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEscil7c3VwZXIoYSxvLGksciksdGhpcy5fZWxlbWVudFJlZj10LHRoaXMuX2NoYW5nZURldGVjdG9yUmVmPWUsdGhpcy5fZGlyPW4sdGhpcy5jb250cm9sVHlwZT0ibWF0LWNoaXAtbGlzdCIsdGhpcy5fbGFzdERlc3Ryb3llZENoaXBJbmRleD1udWxsLHRoaXMuX2Rlc3Ryb3llZD1uZXcgSSx0aGlzLl91aWQ9Im1hdC1jaGlwLWxpc3QtIit4eXQrKyx0aGlzLl90YWJJbmRleD0wLHRoaXMuX3VzZXJUYWJJbmRleD1udWxsLHRoaXMuX29uVG91Y2hlZD0oKT0+e30sdGhpcy5fb25DaGFuZ2U9KCk9Pnt9LHRoaXMuX211bHRpcGxlPSExLHRoaXMuX2NvbXBhcmVXaXRoPSh0LGUpPT50PT09ZSx0aGlzLl9yZXF1aXJlZD0hMSx0aGlzLl9kaXNhYmxlZD0hMSx0aGlzLmFyaWFPcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIsdGhpcy5fc2VsZWN0YWJsZT0hMCx0aGlzLmNoYW5nZT1uZXcgTGgsdGhpcy52YWx1ZUNoYW5nZT1uZXcgTGgsdGhpcy5uZ0NvbnRyb2wmJih0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yPXRoaXMpfWdldCBzZWxlY3RlZCgpe3JldHVybiB0aGlzLm11bHRpcGxlP3RoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkOnRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkWzBdfWdldCByb2xlKCl7cmV0dXJuIHRoaXMuZW1wdHk/bnVsbDoibGlzdGJveCJ9Z2V0IG11bHRpcGxlKCl7cmV0dXJuIHRoaXMuX211bHRpcGxlfXNldCBtdWx0aXBsZSh0KXt0aGlzLl9tdWx0aXBsZT15eih0KSx0aGlzLl9zeW5jQ2hpcHNTdGF0ZSgpfWdldCBjb21wYXJlV2l0aCgpe3JldHVybiB0aGlzLl9jb21wYXJlV2l0aH1zZXQgY29tcGFyZVdpdGgodCl7dGhpcy5fY29tcGFyZVdpdGg9dCx0aGlzLl9zZWxlY3Rpb25Nb2RlbCYmdGhpcy5faW5pdGlhbGl6ZVNlbGVjdGlvbigpfWdldCB2YWx1ZSgpe3JldHVybiB0aGlzLl92YWx1ZX1zZXQgdmFsdWUodCl7dGhpcy53cml0ZVZhbHVlKHQpLHRoaXMuX3ZhbHVlPXR9Z2V0IGlkKCl7cmV0dXJuIHRoaXMuX2NoaXBJbnB1dD90aGlzLl9jaGlwSW5wdXQuaWQ6dGhpcy5fdWlkfWdldCByZXF1aXJlZCgpe3JldHVybiB0aGlzLl9yZXF1aXJlZH1zZXQgcmVxdWlyZWQodCl7dGhpcy5fcmVxdWlyZWQ9eXoodCksdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpfWdldCBwbGFjZWhvbGRlcigpe3JldHVybiB0aGlzLl9jaGlwSW5wdXQ/dGhpcy5fY2hpcElucHV0LnBsYWNlaG9sZGVyOnRoaXMuX3BsYWNlaG9sZGVyfXNldCBwbGFjZWhvbGRlcih0KXt0aGlzLl9wbGFjZWhvbGRlcj10LHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKX1nZXQgZm9jdXNlZCgpe3JldHVybiB0aGlzLl9jaGlwSW5wdXQmJnRoaXMuX2NoaXBJbnB1dC5mb2N1c2VkfHx0aGlzLl9oYXNGb2N1c2VkQ2hpcCgpfWdldCBlbXB0eSgpe3JldHVybighdGhpcy5fY2hpcElucHV0fHx0aGlzLl9jaGlwSW5wdXQuZW1wdHkpJiYoIXRoaXMuY2hpcHN8fDA9PT10aGlzLmNoaXBzLmxlbmd0aCl9Z2V0IHNob3VsZExhYmVsRmxvYXQoKXtyZXR1cm4hdGhpcy5lbXB0eXx8dGhpcy5mb2N1c2VkfWdldCBkaXNhYmxlZCgpe3JldHVybiB0aGlzLm5nQ29udHJvbD8hIXRoaXMubmdDb250cm9sLmRpc2FibGVkOnRoaXMuX2Rpc2FibGVkfXNldCBkaXNhYmxlZCh0KXt0aGlzLl9kaXNhYmxlZD15eih0KSx0aGlzLl9zeW5jQ2hpcHNTdGF0ZSgpfWdldCBzZWxlY3RhYmxlKCl7cmV0dXJuIHRoaXMuX3NlbGVjdGFibGV9c2V0IHNlbGVjdGFibGUodCl7dGhpcy5fc2VsZWN0YWJsZT15eih0KSx0aGlzLmNoaXBzJiZ0aGlzLmNoaXBzLmZvckVhY2goKHQ9PnQuY2hpcExpc3RTZWxlY3RhYmxlPXRoaXMuX3NlbGVjdGFibGUpKX1zZXQgdGFiSW5kZXgodCl7dGhpcy5fdXNlclRhYkluZGV4PXQsdGhpcy5fdGFiSW5kZXg9dH1nZXQgY2hpcFNlbGVjdGlvbkNoYW5nZXMoKXtyZXR1cm4gcmUoLi4udGhpcy5jaGlwcy5tYXAoKHQ9PnQuc2VsZWN0aW9uQ2hhbmdlKSkpfWdldCBjaGlwRm9jdXNDaGFuZ2VzKCl7cmV0dXJuIHJlKC4uLnRoaXMuY2hpcHMubWFwKCh0PT50Ll9vbkZvY3VzKSkpfWdldCBjaGlwQmx1ckNoYW5nZXMoKXtyZXR1cm4gcmUoLi4udGhpcy5jaGlwcy5tYXAoKHQ9PnQuX29uQmx1cikpKX1nZXQgY2hpcFJlbW92ZUNoYW5nZXMoKXtyZXR1cm4gcmUoLi4udGhpcy5jaGlwcy5tYXAoKHQ9PnQuZGVzdHJveWVkKSkpfW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX2tleU1hbmFnZXI9bmV3IGVJKHRoaXMuY2hpcHMpLndpdGhXcmFwKCkud2l0aFZlcnRpY2FsT3JpZW50YXRpb24oKS53aXRoSG9tZUFuZEVuZCgpLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24odGhpcy5fZGlyP3RoaXMuX2Rpci52YWx1ZToibHRyIiksdGhpcy5fZGlyJiZ0aGlzLl9kaXIuY2hhbmdlLnBpcGUoSWUodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCh0PT50aGlzLl9rZXlNYW5hZ2VyLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24odCkpKSx0aGlzLl9rZXlNYW5hZ2VyLnRhYk91dC5waXBlKEllKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLl9hbGxvd0ZvY3VzRXNjYXBlKCl9KSksdGhpcy5jaGlwcy5jaGFuZ2VzLnBpcGUoTmUobnVsbCksSWUodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgoKT0+e3RoaXMuZGlzYWJsZWQmJlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCgpPT57dGhpcy5fc3luY0NoaXBzU3RhdGUoKX0pKSx0aGlzLl9yZXNldENoaXBzKCksdGhpcy5faW5pdGlhbGl6ZVNlbGVjdGlvbigpLHRoaXMuX3VwZGF0ZVRhYkluZGV4KCksdGhpcy5fdXBkYXRlRm9jdXNGb3JEZXN0cm95ZWRDaGlwcygpLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKX0pKX1uZ09uSW5pdCgpe3RoaXMuX3NlbGVjdGlvbk1vZGVsPW5ldyBvRih0aGlzLm11bHRpcGxlLHZvaWQgMCwhMSksdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpfW5nRG9DaGVjaygpe3RoaXMubmdDb250cm9sJiYodGhpcy51cGRhdGVFcnJvclN0YXRlKCksdGhpcy5uZ0NvbnRyb2wuZGlzYWJsZWQhPT10aGlzLl9kaXNhYmxlZCYmKHRoaXMuZGlzYWJsZWQ9ISF0aGlzLm5nQ29udHJvbC5kaXNhYmxlZCkpfW5nT25EZXN0cm95KCl7dGhpcy5fZGVzdHJveWVkLm5leHQoKSx0aGlzLl9kZXN0cm95ZWQuY29tcGxldGUoKSx0aGlzLnN0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpLHRoaXMuX2Ryb3BTdWJzY3JpcHRpb25zKCl9cmVnaXN0ZXJJbnB1dCh0KXt0aGlzLl9jaGlwSW5wdXQ9dCx0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJkYXRhLW1hdC1jaGlwLWlucHV0Iix0LmlkKX1zZXREZXNjcmliZWRCeUlkcyh0KXt0aGlzLl9hcmlhRGVzY3JpYmVkYnk9dC5qb2luKCIgIil9d3JpdGVWYWx1ZSh0KXt0aGlzLmNoaXBzJiZ0aGlzLl9zZXRTZWxlY3Rpb25CeVZhbHVlKHQsITEpfXJlZ2lzdGVyT25DaGFuZ2UodCl7dGhpcy5fb25DaGFuZ2U9dH1yZWdpc3Rlck9uVG91Y2hlZCh0KXt0aGlzLl9vblRvdWNoZWQ9dH1zZXREaXNhYmxlZFN0YXRlKHQpe3RoaXMuZGlzYWJsZWQ9dCx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCl9b25Db250YWluZXJDbGljayh0KXt0aGlzLl9vcmlnaW5hdGVzRnJvbUNoaXAodCl8fHRoaXMuZm9jdXMoKX1mb2N1cyh0KXt0aGlzLmRpc2FibGVkfHx0aGlzLl9jaGlwSW5wdXQmJnRoaXMuX2NoaXBJbnB1dC5mb2N1c2VkfHwodGhpcy5jaGlwcy5sZW5ndGg+MD8odGhpcy5fa2V5TWFuYWdlci5zZXRGaXJzdEl0ZW1BY3RpdmUoKSx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCkpOih0aGlzLl9mb2N1c0lucHV0KHQpLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKSkpfV9mb2N1c0lucHV0KHQpe3RoaXMuX2NoaXBJbnB1dCYmdGhpcy5fY2hpcElucHV0LmZvY3VzKHQpfV9rZXlkb3duKHQpe2NvbnN0IGU9dC50YXJnZXQ7ZSYmZS5jbGFzc0xpc3QuY29udGFpbnMoIm1hdC1jaGlwIikmJih0aGlzLl9rZXlNYW5hZ2VyLm9uS2V5ZG93bih0KSx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCkpfV91cGRhdGVUYWJJbmRleCgpe3RoaXMuX3RhYkluZGV4PXRoaXMuX3VzZXJUYWJJbmRleHx8KDA9PT10aGlzLmNoaXBzLmxlbmd0aD8tMTowKX1fdXBkYXRlRm9jdXNGb3JEZXN0cm95ZWRDaGlwcygpe2lmKG51bGwhPXRoaXMuX2xhc3REZXN0cm95ZWRDaGlwSW5kZXgpaWYodGhpcy5jaGlwcy5sZW5ndGgpe2NvbnN0IHQ9TWF0aC5taW4odGhpcy5fbGFzdERlc3Ryb3llZENoaXBJbmRleCx0aGlzLmNoaXBzLmxlbmd0aC0xKTt0aGlzLl9rZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0odCl9ZWxzZSB0aGlzLmZvY3VzKCk7dGhpcy5fbGFzdERlc3Ryb3llZENoaXBJbmRleD1udWxsfV9pc1ZhbGlkSW5kZXgodCl7cmV0dXJuIHQ+PTAmJnQ8dGhpcy5jaGlwcy5sZW5ndGh9X3NldFNlbGVjdGlvbkJ5VmFsdWUodCxlPSEwKXtpZih0aGlzLl9jbGVhclNlbGVjdGlvbigpLHRoaXMuY2hpcHMuZm9yRWFjaCgodD0+dC5kZXNlbGVjdCgpKSksQXJyYXkuaXNBcnJheSh0KSl0LmZvckVhY2goKHQ9PnRoaXMuX3NlbGVjdFZhbHVlKHQsZSkpKSx0aGlzLl9zb3J0VmFsdWVzKCk7ZWxzZXtjb25zdCBuPXRoaXMuX3NlbGVjdFZhbHVlKHQsZSk7biYmZSYmdGhpcy5fa2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKG4pfX1fc2VsZWN0VmFsdWUodCxlPSEwKXtjb25zdCBuPXRoaXMuY2hpcHMuZmluZCgoZT0+bnVsbCE9ZS52YWx1ZSYmdGhpcy5fY29tcGFyZVdpdGgoZS52YWx1ZSx0KSkpO3JldHVybiBuJiYoZT9uLnNlbGVjdFZpYUludGVyYWN0aW9uKCk6bi5zZWxlY3QoKSx0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3QobikpLG59X2luaXRpYWxpemVTZWxlY3Rpb24oKXtQcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+eyh0aGlzLm5nQ29udHJvbHx8dGhpcy5fdmFsdWUpJiYodGhpcy5fc2V0U2VsZWN0aW9uQnlWYWx1ZSh0aGlzLm5nQ29udHJvbD90aGlzLm5nQ29udHJvbC52YWx1ZTp0aGlzLl92YWx1ZSwhMSksdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpKX0pKX1fY2xlYXJTZWxlY3Rpb24odCl7dGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKSx0aGlzLmNoaXBzLmZvckVhY2goKGU9PntlIT09dCYmZS5kZXNlbGVjdCgpfSkpLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKX1fc29ydFZhbHVlcygpe3RoaXMuX211bHRpcGxlJiYodGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKSx0aGlzLmNoaXBzLmZvckVhY2goKHQ9Pnt0LnNlbGVjdGVkJiZ0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3QodCl9KSksdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpKX1fcHJvcGFnYXRlQ2hhbmdlcyh0KXtsZXQgZT1udWxsO2U9QXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGVkKT90aGlzLnNlbGVjdGVkLm1hcCgodD0+dC52YWx1ZSkpOnRoaXMuc2VsZWN0ZWQ/dGhpcy5zZWxlY3RlZC52YWx1ZTp0LHRoaXMuX3ZhbHVlPWUsdGhpcy5jaGFuZ2UuZW1pdChuZXcgT3l0KHRoaXMsZSkpLHRoaXMudmFsdWVDaGFuZ2UuZW1pdChlKSx0aGlzLl9vbkNoYW5nZShlKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX1fYmx1cigpe3RoaXMuX2hhc0ZvY3VzZWRDaGlwKCl8fHRoaXMuX2tleU1hbmFnZXIuc2V0QWN0aXZlSXRlbSgtMSksdGhpcy5kaXNhYmxlZHx8KHRoaXMuX2NoaXBJbnB1dD9zZXRUaW1lb3V0KCgoKT0+e3RoaXMuZm9jdXNlZHx8dGhpcy5fbWFya0FzVG91Y2hlZCgpfSkpOnRoaXMuX21hcmtBc1RvdWNoZWQoKSl9X21hcmtBc1RvdWNoZWQoKXt0aGlzLl9vblRvdWNoZWQoKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCl9X2FsbG93Rm9jdXNFc2NhcGUoKXstMSE9PXRoaXMuX3RhYkluZGV4JiYodGhpcy5fdGFiSW5kZXg9LTEsc2V0VGltZW91dCgoKCk9Pnt0aGlzLl90YWJJbmRleD10aGlzLl91c2VyVGFiSW5kZXh8fDAsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9KSkpfV9yZXNldENoaXBzKCl7dGhpcy5fZHJvcFN1YnNjcmlwdGlvbnMoKSx0aGlzLl9saXN0ZW5Ub0NoaXBzRm9jdXMoKSx0aGlzLl9saXN0ZW5Ub0NoaXBzU2VsZWN0aW9uKCksdGhpcy5fbGlzdGVuVG9DaGlwc1JlbW92ZWQoKX1fZHJvcFN1YnNjcmlwdGlvbnMoKXt0aGlzLl9jaGlwRm9jdXNTdWJzY3JpcHRpb24mJih0aGlzLl9jaGlwRm9jdXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl9jaGlwRm9jdXNTdWJzY3JpcHRpb249bnVsbCksdGhpcy5fY2hpcEJsdXJTdWJzY3JpcHRpb24mJih0aGlzLl9jaGlwQmx1clN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX2NoaXBCbHVyU3Vic2NyaXB0aW9uPW51bGwpLHRoaXMuX2NoaXBTZWxlY3Rpb25TdWJzY3JpcHRpb24mJih0aGlzLl9jaGlwU2VsZWN0aW9uU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5fY2hpcFNlbGVjdGlvblN1YnNjcmlwdGlvbj1udWxsKSx0aGlzLl9jaGlwUmVtb3ZlU3Vic2NyaXB0aW9uJiYodGhpcy5fY2hpcFJlbW92ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX2NoaXBSZW1vdmVTdWJzY3JpcHRpb249bnVsbCl9X2xpc3RlblRvQ2hpcHNTZWxlY3Rpb24oKXt0aGlzLl9jaGlwU2VsZWN0aW9uU3Vic2NyaXB0aW9uPXRoaXMuY2hpcFNlbGVjdGlvbkNoYW5nZXMuc3Vic2NyaWJlKCh0PT57dC5zb3VyY2Uuc2VsZWN0ZWQ/dGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0KHQuc291cmNlKTp0aGlzLl9zZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdCh0LnNvdXJjZSksdGhpcy5tdWx0aXBsZXx8dGhpcy5jaGlwcy5mb3JFYWNoKCh0PT57IXRoaXMuX3NlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWQodCkmJnQuc2VsZWN0ZWQmJnQuZGVzZWxlY3QoKX0pKSx0LmlzVXNlcklucHV0JiZ0aGlzLl9wcm9wYWdhdGVDaGFuZ2VzKCl9KSl9X2xpc3RlblRvQ2hpcHNGb2N1cygpe3RoaXMuX2NoaXBGb2N1c1N1YnNjcmlwdGlvbj10aGlzLmNoaXBGb2N1c0NoYW5nZXMuc3Vic2NyaWJlKCh0PT57bGV0IGU9dGhpcy5jaGlwcy50b0FycmF5KCkuaW5kZXhPZih0LmNoaXApO3RoaXMuX2lzVmFsaWRJbmRleChlKSYmdGhpcy5fa2V5TWFuYWdlci51cGRhdGVBY3RpdmVJdGVtKGUpLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKX0pKSx0aGlzLl9jaGlwQmx1clN1YnNjcmlwdGlvbj10aGlzLmNoaXBCbHVyQ2hhbmdlcy5zdWJzY3JpYmUoKCgpPT57dGhpcy5fYmx1cigpLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKX0pKX1fbGlzdGVuVG9DaGlwc1JlbW92ZWQoKXt0aGlzLl9jaGlwUmVtb3ZlU3Vic2NyaXB0aW9uPXRoaXMuY2hpcFJlbW92ZUNoYW5nZXMuc3Vic2NyaWJlKCh0PT57Y29uc3QgZT10LmNoaXAsbj10aGlzLmNoaXBzLnRvQXJyYXkoKS5pbmRleE9mKHQuY2hpcCk7dGhpcy5faXNWYWxpZEluZGV4KG4pJiZlLl9oYXNGb2N1cyYmKHRoaXMuX2xhc3REZXN0cm95ZWRDaGlwSW5kZXg9bil9KSl9X29yaWdpbmF0ZXNGcm9tQ2hpcCh0KXtsZXQgZT10LnRhcmdldDtmb3IoO2UmJmUhPT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7KXtpZihlLmNsYXNzTGlzdC5jb250YWlucygibWF0LWNoaXAiKSlyZXR1cm4hMDtlPWUucGFyZW50RWxlbWVudH1yZXR1cm4hMX1faGFzRm9jdXNlZENoaXAoKXtyZXR1cm4gdGhpcy5jaGlwcyYmdGhpcy5jaGlwcy5zb21lKCh0PT50Ll9oYXNGb2N1cykpfV9zeW5jQ2hpcHNTdGF0ZSgpe3RoaXMuY2hpcHMmJnRoaXMuY2hpcHMuZm9yRWFjaCgodD0+e3QuX2NoaXBMaXN0RGlzYWJsZWQ9dGhpcy5fZGlzYWJsZWQsdC5fY2hpcExpc3RNdWx0aXBsZT10aGlzLm11bHRpcGxlfSkpfX1QeXQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFB5dCkoU20oaGcpLFNtKFVnKSxTbShISSw4KSxTbShpVSw4KSxTbShQVSw4KSxTbShiSCksU20oTWosMTApKX0sUHl0Lsm1Y21wPXRvKHt0eXBlOlB5dCxzZWxlY3RvcnM6W1sibWF0LWNoaXAtbGlzdCJdXSxjb250ZW50UXVlcmllczpmdW5jdGlvbiB0KGUsbixvKXtpZigxJmUmJiRoKG8sX3l0LDUpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uY2hpcHM9dCl9fSxob3N0QXR0cnM6WzEsIm1hdC1jaGlwLWxpc3QiXSxob3N0VmFyczoxNSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezEmZSYmVm0oImZvY3VzIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLmZvY3VzKCl9KSkoImJsdXIiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX2JsdXIoKX0pKSgia2V5ZG93biIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX2tleWRvd24oZSl9KSksMiZlJiYoVHUoImlkIixuLl91aWQpLGpwKCJ0YWJpbmRleCIsbi5kaXNhYmxlZD9udWxsOm4uX3RhYkluZGV4KSgiYXJpYS1kZXNjcmliZWRieSIsbi5fYXJpYURlc2NyaWJlZGJ5fHxudWxsKSgiYXJpYS1yZXF1aXJlZCIsbi5yb2xlP24ucmVxdWlyZWQ6bnVsbCkoImFyaWEtZGlzYWJsZWQiLG4uZGlzYWJsZWQudG9TdHJpbmcoKSkoImFyaWEtaW52YWxpZCIsbi5lcnJvclN0YXRlKSgiYXJpYS1tdWx0aXNlbGVjdGFibGUiLG4ubXVsdGlwbGUpKCJyb2xlIixuLnJvbGUpKCJhcmlhLW9yaWVudGF0aW9uIixuLmFyaWFPcmllbnRhdGlvbikscHUoIm1hdC1jaGlwLWxpc3QtZGlzYWJsZWQiLG4uZGlzYWJsZWQpKCJtYXQtY2hpcC1saXN0LWludmFsaWQiLG4uZXJyb3JTdGF0ZSkoIm1hdC1jaGlwLWxpc3QtcmVxdWlyZWQiLG4ucmVxdWlyZWQpKX0saW5wdXRzOnthcmlhT3JpZW50YXRpb246WyJhcmlhLW9yaWVudGF0aW9uIiwiYXJpYU9yaWVudGF0aW9uIl0sbXVsdGlwbGU6Im11bHRpcGxlIixjb21wYXJlV2l0aDoiY29tcGFyZVdpdGgiLHZhbHVlOiJ2YWx1ZSIscmVxdWlyZWQ6InJlcXVpcmVkIixwbGFjZWhvbGRlcjoicGxhY2Vob2xkZXIiLGRpc2FibGVkOiJkaXNhYmxlZCIsc2VsZWN0YWJsZToic2VsZWN0YWJsZSIsdGFiSW5kZXg6InRhYkluZGV4IixlcnJvclN0YXRlTWF0Y2hlcjoiZXJyb3JTdGF0ZU1hdGNoZXIifSxvdXRwdXRzOntjaGFuZ2U6ImNoYW5nZSIsdmFsdWVDaGFuZ2U6InZhbHVlQ2hhbmdlIn0sZXhwb3J0QXM6WyJtYXRDaGlwTGlzdCJdLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6YlYsdXNlRXhpc3Rpbmc6UHl0fV0pLHhwXSxuZ0NvbnRlbnRTZWxlY3RvcnM6WyIqIl0sZGVjbHM6Mix2YXJzOjAsY29uc3RzOltbMSwibWF0LWNoaXAtbGlzdC13cmFwcGVyIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabSgpLFJtKDAsImRpdiIsMCksWG0oMSksQW0oKSl9LHN0eWxlczpbJy5tYXQtY2hpcHtwb3NpdGlvbjpyZWxhdGl2ZTtib3gtc2l6aW5nOmJvcmRlci1ib3g7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApO2JvcmRlcjpub25lOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5tYXQtc3RhbmRhcmQtY2hpcHt0cmFuc2l0aW9uOmJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtkaXNwbGF5OmlubGluZS1mbGV4O3BhZGRpbmc6N3B4IDEycHg7Ym9yZGVyLXJhZGl1czoxNnB4O2FsaWduLWl0ZW1zOmNlbnRlcjtjdXJzb3I6ZGVmYXVsdDttaW4taGVpZ2h0OjMycHg7aGVpZ2h0OjFweH0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXN0YW5kYXJkLWNoaXB7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtc3RhbmRhcmQtY2hpcCAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29ue3dpZHRoOjE4cHg7aGVpZ2h0OjE4cHh9Lm1hdC1zdGFuZGFyZC1jaGlwOjphZnRlcnt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOmluaGVyaXQ7b3BhY2l0eTowO2NvbnRlbnQ6IiI7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgMjAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpfS5tYXQtc3RhbmRhcmQtY2hpcDpob3Zlcjo6YWZ0ZXJ7b3BhY2l0eTouMTJ9Lm1hdC1zdGFuZGFyZC1jaGlwOmZvY3Vze291dGxpbmU6bm9uZX0ubWF0LXN0YW5kYXJkLWNoaXA6Zm9jdXM6OmFmdGVye29wYWNpdHk6LjE2fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zdGFuZGFyZC1jaGlwe291dGxpbmU6c29saWQgMXB4fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zdGFuZGFyZC1jaGlwOmZvY3Vze291dGxpbmU6ZG90dGVkIDJweH0ubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtZGlzYWJsZWQ6OmFmdGVye29wYWNpdHk6MH0ubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtZGlzYWJsZWQgLm1hdC1jaGlwLXJlbW92ZSwubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtZGlzYWJsZWQgLm1hdC1jaGlwLXRyYWlsaW5nLWljb257Y3Vyc29yOmRlZmF1bHR9Lm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXdpdGgtdHJhaWxpbmctaWNvbi5tYXQtY2hpcC13aXRoLWF2YXRhciwubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtd2l0aC1hdmF0YXJ7cGFkZGluZy10b3A6MDtwYWRkaW5nLWJvdHRvbTowfS5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC13aXRoLXRyYWlsaW5nLWljb24ubWF0LWNoaXAtd2l0aC1hdmF0YXJ7cGFkZGluZy1yaWdodDo4cHg7cGFkZGluZy1sZWZ0OjB9W2Rpcj1ydGxdIC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC13aXRoLXRyYWlsaW5nLWljb24ubWF0LWNoaXAtd2l0aC1hdmF0YXJ7cGFkZGluZy1sZWZ0OjhweDtwYWRkaW5nLXJpZ2h0OjB9Lm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXdpdGgtdHJhaWxpbmctaWNvbntwYWRkaW5nLXRvcDo3cHg7cGFkZGluZy1ib3R0b206N3B4O3BhZGRpbmctcmlnaHQ6OHB4O3BhZGRpbmctbGVmdDoxMnB4fVtkaXI9cnRsXSAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtd2l0aC10cmFpbGluZy1pY29ue3BhZGRpbmctbGVmdDo4cHg7cGFkZGluZy1yaWdodDoxMnB4fS5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC13aXRoLWF2YXRhcntwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjEycHh9W2Rpcj1ydGxdIC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC13aXRoLWF2YXRhcntwYWRkaW5nLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjEycHh9Lm1hdC1zdGFuZGFyZC1jaGlwIC5tYXQtY2hpcC1hdmF0YXJ7d2lkdGg6MjRweDtoZWlnaHQ6MjRweDttYXJnaW4tcmlnaHQ6OHB4O21hcmdpbi1sZWZ0OjRweH1bZGlyPXJ0bF0gLm1hdC1zdGFuZGFyZC1jaGlwIC5tYXQtY2hpcC1hdmF0YXJ7bWFyZ2luLWxlZnQ6OHB4O21hcmdpbi1yaWdodDo0cHh9Lm1hdC1zdGFuZGFyZC1jaGlwIC5tYXQtY2hpcC1yZW1vdmUsLm1hdC1zdGFuZGFyZC1jaGlwIC5tYXQtY2hpcC10cmFpbGluZy1pY29ue3dpZHRoOjE4cHg7aGVpZ2h0OjE4cHg7Y3Vyc29yOnBvaW50ZXJ9Lm1hdC1zdGFuZGFyZC1jaGlwIC5tYXQtY2hpcC1yZW1vdmUsLm1hdC1zdGFuZGFyZC1jaGlwIC5tYXQtY2hpcC10cmFpbGluZy1pY29ue21hcmdpbi1sZWZ0OjhweDttYXJnaW4tcmlnaHQ6MH1bZGlyPXJ0bF0gLm1hdC1zdGFuZGFyZC1jaGlwIC5tYXQtY2hpcC1yZW1vdmUsW2Rpcj1ydGxdIC5tYXQtc3RhbmRhcmQtY2hpcCAubWF0LWNoaXAtdHJhaWxpbmctaWNvbnttYXJnaW4tcmlnaHQ6OHB4O21hcmdpbi1sZWZ0OjB9Lm1hdC1jaGlwLXJpcHBsZXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlci1yYWRpdXM6aW5oZXJpdDtvdmVyZmxvdzpoaWRkZW59Lm1hdC1jaGlwLWxpc3Qtd3JhcHBlcntkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW46LTRweH0ubWF0LWNoaXAtbGlzdC13cmFwcGVyIGlucHV0Lm1hdC1pbnB1dC1lbGVtZW50LC5tYXQtY2hpcC1saXN0LXdyYXBwZXIgLm1hdC1zdGFuZGFyZC1jaGlwe21hcmdpbjo0cHh9Lm1hdC1jaGlwLWxpc3Qtc3RhY2tlZCAubWF0LWNoaXAtbGlzdC13cmFwcGVye2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjthbGlnbi1pdGVtczpmbGV4LXN0YXJ0fS5tYXQtY2hpcC1saXN0LXN0YWNrZWQgLm1hdC1jaGlwLWxpc3Qtd3JhcHBlciAubWF0LXN0YW5kYXJkLWNoaXB7d2lkdGg6MTAwJX0ubWF0LWNoaXAtYXZhdGFye2JvcmRlci1yYWRpdXM6NTAlO2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtvdmVyZmxvdzpoaWRkZW47b2JqZWN0LWZpdDpjb3Zlcn1pbnB1dC5tYXQtY2hpcC1pbnB1dHt3aWR0aDoxNTBweDttYXJnaW46NHB4O2ZsZXg6MSAwIDE1MHB4fVxuJ10sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksUHl0LmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOlVnfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTppVSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpQVSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpiSH0se3R5cGU6TWosZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOkRyfV19XSxQeXQucHJvcERlY29yYXRvcnM9e2Vycm9yU3RhdGVNYXRjaGVyOlt7dHlwZTp4eX1dLG11bHRpcGxlOlt7dHlwZTp4eX1dLGNvbXBhcmVXaXRoOlt7dHlwZTp4eX1dLHZhbHVlOlt7dHlwZTp4eX1dLHJlcXVpcmVkOlt7dHlwZTp4eX1dLHBsYWNlaG9sZGVyOlt7dHlwZTp4eX1dLGRpc2FibGVkOlt7dHlwZTp4eX1dLGFyaWFPcmllbnRhdGlvbjpbe3R5cGU6eHksYXJnczpbImFyaWEtb3JpZW50YXRpb24iXX1dLHNlbGVjdGFibGU6W3t0eXBlOnh5fV0sdGFiSW5kZXg6W3t0eXBlOnh5fV0sY2hhbmdlOlt7dHlwZTpPeX1dLHZhbHVlQ2hhbmdlOlt7dHlwZTpPeX1dLGNoaXBzOlt7dHlwZTpZYSxhcmdzOltfeXQse2Rlc2NlbmRhbnRzOiEwfV19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChQeXQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWF0LWNoaXAtbGlzdCIsdGVtcGxhdGU6JzxkaXYgY2xhc3M9Im1hdC1jaGlwLWxpc3Qtd3JhcHBlciI+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PjwvZGl2PicsZXhwb3J0QXM6Im1hdENoaXBMaXN0Iixob3N0OnsiW2F0dHIudGFiaW5kZXhdIjoiZGlzYWJsZWQgPyBudWxsIDogX3RhYkluZGV4IiwiW2F0dHIuYXJpYS1kZXNjcmliZWRieV0iOiJfYXJpYURlc2NyaWJlZGJ5IHx8IG51bGwiLCJbYXR0ci5hcmlhLXJlcXVpcmVkXSI6InJvbGUgPyByZXF1aXJlZCA6IG51bGwiLCJbYXR0ci5hcmlhLWRpc2FibGVkXSI6ImRpc2FibGVkLnRvU3RyaW5nKCkiLCJbYXR0ci5hcmlhLWludmFsaWRdIjoiZXJyb3JTdGF0ZSIsIlthdHRyLmFyaWEtbXVsdGlzZWxlY3RhYmxlXSI6Im11bHRpcGxlIiwiW2F0dHIucm9sZV0iOiJyb2xlIiwiW2NsYXNzLm1hdC1jaGlwLWxpc3QtZGlzYWJsZWRdIjoiZGlzYWJsZWQiLCJbY2xhc3MubWF0LWNoaXAtbGlzdC1pbnZhbGlkXSI6ImVycm9yU3RhdGUiLCJbY2xhc3MubWF0LWNoaXAtbGlzdC1yZXF1aXJlZF0iOiJyZXF1aXJlZCIsIlthdHRyLmFyaWEtb3JpZW50YXRpb25dIjoiYXJpYU9yaWVudGF0aW9uIixjbGFzczoibWF0LWNoaXAtbGlzdCIsIihmb2N1cykiOiJmb2N1cygpIiwiKGJsdXIpIjoiX2JsdXIoKSIsIihrZXlkb3duKSI6Il9rZXlkb3duKCRldmVudCkiLCJbaWRdIjoiX3VpZCJ9LHByb3ZpZGVyczpbe3Byb3ZpZGU6YlYsdXNlRXhpc3Rpbmc6UHl0fV0sZW5jYXBzdWxhdGlvbjpIbi5Ob25lLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2gsc3R5bGVzOlsnLm1hdC1jaGlwe3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Ym9yZGVyLWJveDstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7Ym9yZGVyOm5vbmU7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9Lm1hdC1zdGFuZGFyZC1jaGlwe3RyYW5zaXRpb246Ym94LXNoYWRvdyAyODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO2Rpc3BsYXk6aW5saW5lLWZsZXg7cGFkZGluZzo3cHggMTJweDtib3JkZXItcmFkaXVzOjE2cHg7YWxpZ24taXRlbXM6Y2VudGVyO2N1cnNvcjpkZWZhdWx0O21pbi1oZWlnaHQ6MzJweDtoZWlnaHQ6MXB4fS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtc3RhbmRhcmQtY2hpcHt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC1zdGFuZGFyZC1jaGlwIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb257d2lkdGg6MThweDtoZWlnaHQ6MThweH0ubWF0LXN0YW5kYXJkLWNoaXA6OmFmdGVye3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6aW5oZXJpdDtvcGFjaXR5OjA7Y29udGVudDoiIjtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSAyMDBtcyBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSl9Lm1hdC1zdGFuZGFyZC1jaGlwOmhvdmVyOjphZnRlcntvcGFjaXR5Oi4xMn0ubWF0LXN0YW5kYXJkLWNoaXA6Zm9jdXN7b3V0bGluZTpub25lfS5tYXQtc3RhbmRhcmQtY2hpcDpmb2N1czo6YWZ0ZXJ7b3BhY2l0eTouMTZ9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXN0YW5kYXJkLWNoaXB7b3V0bGluZTpzb2xpZCAxcHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXN0YW5kYXJkLWNoaXA6Zm9jdXN7b3V0bGluZTpkb3R0ZWQgMnB4fS5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZDo6YWZ0ZXJ7b3BhY2l0eTowfS5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZCAubWF0LWNoaXAtcmVtb3ZlLC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZCAubWF0LWNoaXAtdHJhaWxpbmctaWNvbntjdXJzb3I6ZGVmYXVsdH0ubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtd2l0aC10cmFpbGluZy1pY29uLm1hdC1jaGlwLXdpdGgtYXZhdGFyLC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC13aXRoLWF2YXRhcntwYWRkaW5nLXRvcDowO3BhZGRpbmctYm90dG9tOjB9Lm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXdpdGgtdHJhaWxpbmctaWNvbi5tYXQtY2hpcC13aXRoLWF2YXRhcntwYWRkaW5nLXJpZ2h0OjhweDtwYWRkaW5nLWxlZnQ6MH1bZGlyPXJ0bF0gLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXdpdGgtdHJhaWxpbmctaWNvbi5tYXQtY2hpcC13aXRoLWF2YXRhcntwYWRkaW5nLWxlZnQ6OHB4O3BhZGRpbmctcmlnaHQ6MH0ubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtd2l0aC10cmFpbGluZy1pY29ue3BhZGRpbmctdG9wOjdweDtwYWRkaW5nLWJvdHRvbTo3cHg7cGFkZGluZy1yaWdodDo4cHg7cGFkZGluZy1sZWZ0OjEycHh9W2Rpcj1ydGxdIC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC13aXRoLXRyYWlsaW5nLWljb257cGFkZGluZy1sZWZ0OjhweDtwYWRkaW5nLXJpZ2h0OjEycHh9Lm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXdpdGgtYXZhdGFye3BhZGRpbmctbGVmdDowO3BhZGRpbmctcmlnaHQ6MTJweH1bZGlyPXJ0bF0gLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXdpdGgtYXZhdGFye3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MTJweH0ubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLWF2YXRhcnt3aWR0aDoyNHB4O2hlaWdodDoyNHB4O21hcmdpbi1yaWdodDo4cHg7bWFyZ2luLWxlZnQ6NHB4fVtkaXI9cnRsXSAubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLWF2YXRhcnttYXJnaW4tbGVmdDo4cHg7bWFyZ2luLXJpZ2h0OjRweH0ubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLXJlbW92ZSwubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb257d2lkdGg6MThweDtoZWlnaHQ6MThweDtjdXJzb3I6cG9pbnRlcn0ubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLXJlbW92ZSwubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb257bWFyZ2luLWxlZnQ6OHB4O21hcmdpbi1yaWdodDowfVtkaXI9cnRsXSAubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLXJlbW92ZSxbZGlyPXJ0bF0gLm1hdC1zdGFuZGFyZC1jaGlwIC5tYXQtY2hpcC10cmFpbGluZy1pY29ue21hcmdpbi1yaWdodDo4cHg7bWFyZ2luLWxlZnQ6MH0ubWF0LWNoaXAtcmlwcGxle3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOm5vbmU7Ym9yZGVyLXJhZGl1czppbmhlcml0O292ZXJmbG93OmhpZGRlbn0ubWF0LWNoaXAtbGlzdC13cmFwcGVye2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7ZmxleC13cmFwOndyYXA7YWxpZ24taXRlbXM6Y2VudGVyO21hcmdpbjotNHB4fS5tYXQtY2hpcC1saXN0LXdyYXBwZXIgaW5wdXQubWF0LWlucHV0LWVsZW1lbnQsLm1hdC1jaGlwLWxpc3Qtd3JhcHBlciAubWF0LXN0YW5kYXJkLWNoaXB7bWFyZ2luOjRweH0ubWF0LWNoaXAtbGlzdC1zdGFja2VkIC5tYXQtY2hpcC1saXN0LXdyYXBwZXJ7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOmZsZXgtc3RhcnR9Lm1hdC1jaGlwLWxpc3Qtc3RhY2tlZCAubWF0LWNoaXAtbGlzdC13cmFwcGVyIC5tYXQtc3RhbmRhcmQtY2hpcHt3aWR0aDoxMDAlfS5tYXQtY2hpcC1hdmF0YXJ7Ym9yZGVyLXJhZGl1czo1MCU7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O292ZXJmbG93OmhpZGRlbjtvYmplY3QtZml0OmNvdmVyfWlucHV0Lm1hdC1jaGlwLWlucHV0e3dpZHRoOjE1MHB4O21hcmdpbjo0cHg7ZmxleDoxIDAgMTUwcHh9XG4nXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTpVZ30se3R5cGU6SEksZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6aVUsZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6UFUsZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6Ykh9LHt0eXBlOk1qLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn1dfV19KSx7YXJpYU9yaWVudGF0aW9uOlt7dHlwZTp4eSxhcmdzOlsiYXJpYS1vcmllbnRhdGlvbiJdfV0sY2hhbmdlOlt7dHlwZTpPeX1dLHZhbHVlQ2hhbmdlOlt7dHlwZTpPeX1dLG11bHRpcGxlOlt7dHlwZTp4eX1dLGNvbXBhcmVXaXRoOlt7dHlwZTp4eX1dLHZhbHVlOlt7dHlwZTp4eX1dLHJlcXVpcmVkOlt7dHlwZTp4eX1dLHBsYWNlaG9sZGVyOlt7dHlwZTp4eX1dLGRpc2FibGVkOlt7dHlwZTp4eX1dLHNlbGVjdGFibGU6W3t0eXBlOnh5fV0sdGFiSW5kZXg6W3t0eXBlOnh5fV0sZXJyb3JTdGF0ZU1hdGNoZXI6W3t0eXBlOnh5fV0sY2hpcHM6W3t0eXBlOllhLGFyZ3M6W195dCx7ZGVzY2VuZGFudHM6ITB9XX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpsZXQgd3l0PTA7Y2xhc3Mga3l0e2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fZWxlbWVudFJlZj10LHRoaXMuX2RlZmF1bHRPcHRpb25zPWUsdGhpcy5mb2N1c2VkPSExLHRoaXMuX2FkZE9uQmx1cj0hMSx0aGlzLnNlcGFyYXRvcktleUNvZGVzPXRoaXMuX2RlZmF1bHRPcHRpb25zLnNlcGFyYXRvcktleUNvZGVzLHRoaXMuY2hpcEVuZD1uZXcgTGgsdGhpcy5wbGFjZWhvbGRlcj0iIix0aGlzLmlkPSJtYXQtY2hpcC1saXN0LWlucHV0LSIrd3l0KyssdGhpcy5fZGlzYWJsZWQ9ITEsdGhpcy5pbnB1dEVsZW1lbnQ9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50fXNldCBjaGlwTGlzdCh0KXt0JiYodGhpcy5fY2hpcExpc3Q9dCx0aGlzLl9jaGlwTGlzdC5yZWdpc3RlcklucHV0KHRoaXMpKX1nZXQgYWRkT25CbHVyKCl7cmV0dXJuIHRoaXMuX2FkZE9uQmx1cn1zZXQgYWRkT25CbHVyKHQpe3RoaXMuX2FkZE9uQmx1cj15eih0KX1nZXQgZGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5fZGlzYWJsZWR8fHRoaXMuX2NoaXBMaXN0JiZ0aGlzLl9jaGlwTGlzdC5kaXNhYmxlZH1zZXQgZGlzYWJsZWQodCl7dGhpcy5fZGlzYWJsZWQ9eXoodCl9Z2V0IGVtcHR5KCl7cmV0dXJuIXRoaXMuaW5wdXRFbGVtZW50LnZhbHVlfW5nT25DaGFuZ2VzKCl7dGhpcy5fY2hpcExpc3Quc3RhdGVDaGFuZ2VzLm5leHQoKX1uZ09uRGVzdHJveSgpe3RoaXMuY2hpcEVuZC5jb21wbGV0ZSgpfW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX2ZvY3VzTGFzdENoaXBPbkJhY2tzcGFjZT10aGlzLmVtcHR5fV9rZXlkb3duKHQpe2lmKHQpe2lmKDkhPT10LmtleUNvZGV8fGJ6KHQsInNoaWZ0S2V5Iil8fHRoaXMuX2NoaXBMaXN0Ll9hbGxvd0ZvY3VzRXNjYXBlKCksOD09PXQua2V5Q29kZSYmdGhpcy5fZm9jdXNMYXN0Q2hpcE9uQmFja3NwYWNlKXJldHVybiB0aGlzLl9jaGlwTGlzdC5fa2V5TWFuYWdlci5zZXRMYXN0SXRlbUFjdGl2ZSgpLHZvaWQgdC5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2ZvY3VzTGFzdENoaXBPbkJhY2tzcGFjZT0hMX10aGlzLl9lbWl0Q2hpcEVuZCh0KX1fa2V5dXAodCl7IXRoaXMuX2ZvY3VzTGFzdENoaXBPbkJhY2tzcGFjZSYmOD09PXQua2V5Q29kZSYmdGhpcy5lbXB0eSYmKHRoaXMuX2ZvY3VzTGFzdENoaXBPbkJhY2tzcGFjZT0hMCx0LnByZXZlbnREZWZhdWx0KCkpfV9ibHVyKCl7dGhpcy5hZGRPbkJsdXImJnRoaXMuX2VtaXRDaGlwRW5kKCksdGhpcy5mb2N1c2VkPSExLHRoaXMuX2NoaXBMaXN0LmZvY3VzZWR8fHRoaXMuX2NoaXBMaXN0Ll9ibHVyKCksdGhpcy5fY2hpcExpc3Quc3RhdGVDaGFuZ2VzLm5leHQoKX1fZm9jdXMoKXt0aGlzLmZvY3VzZWQ9ITAsdGhpcy5fZm9jdXNMYXN0Q2hpcE9uQmFja3NwYWNlPXRoaXMuZW1wdHksdGhpcy5fY2hpcExpc3Quc3RhdGVDaGFuZ2VzLm5leHQoKX1fZW1pdENoaXBFbmQodCl7IXRoaXMuaW5wdXRFbGVtZW50LnZhbHVlJiZ0JiZ0aGlzLl9jaGlwTGlzdC5fa2V5ZG93bih0KSx0JiYhdGhpcy5faXNTZXBhcmF0b3JLZXkodCl8fCh0aGlzLmNoaXBFbmQuZW1pdCh7aW5wdXQ6dGhpcy5pbnB1dEVsZW1lbnQsdmFsdWU6dGhpcy5pbnB1dEVsZW1lbnQudmFsdWUsY2hpcElucHV0OnRoaXN9KSxudWxsPT10fHx0LnByZXZlbnREZWZhdWx0KCkpfV9vbklucHV0KCl7dGhpcy5fY2hpcExpc3Quc3RhdGVDaGFuZ2VzLm5leHQoKX1mb2N1cyh0KXt0aGlzLmlucHV0RWxlbWVudC5mb2N1cyh0KX1jbGVhcigpe3RoaXMuaW5wdXRFbGVtZW50LnZhbHVlPSIiLHRoaXMuX2ZvY3VzTGFzdENoaXBPbkJhY2tzcGFjZT0hMH1faXNTZXBhcmF0b3JLZXkodCl7cmV0dXJuIWJ6KHQpJiZuZXcgU2V0KHRoaXMuc2VwYXJhdG9yS2V5Q29kZXMpLmhhcyh0LmtleUNvZGUpfX1reXQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGt5dCkoU20oaGcpLFNtKE15dCkpfSxreXQuybVkaXI9bG8oe3R5cGU6a3l0LHNlbGVjdG9yczpbWyJpbnB1dCIsIm1hdENoaXBJbnB1dEZvciIsIiJdXSxob3N0QXR0cnM6WzEsIm1hdC1jaGlwLWlucHV0IiwibWF0LWlucHV0LWVsZW1lbnQiXSxob3N0VmFyczo1LGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgia2V5ZG93biIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX2tleWRvd24oZSl9KSkoImtleXVwIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5fa2V5dXAoZSl9KSkoImJsdXIiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX2JsdXIoKX0pKSgiZm9jdXMiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX2ZvY3VzKCl9KSkoImlucHV0IiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9vbklucHV0KCl9KSksMiZlJiYoVHUoImlkIixuLmlkKSxqcCgiZGlzYWJsZWQiLG4uZGlzYWJsZWR8fG51bGwpKCJwbGFjZWhvbGRlciIsbi5wbGFjZWhvbGRlcnx8bnVsbCkoImFyaWEtaW52YWxpZCIsbi5fY2hpcExpc3QmJm4uX2NoaXBMaXN0Lm5nQ29udHJvbD9uLl9jaGlwTGlzdC5uZ0NvbnRyb2wuaW52YWxpZDpudWxsKSgiYXJpYS1yZXF1aXJlZCIsbi5fY2hpcExpc3QmJm4uX2NoaXBMaXN0LnJlcXVpcmVkfHxudWxsKSl9LGlucHV0czp7c2VwYXJhdG9yS2V5Q29kZXM6WyJtYXRDaGlwSW5wdXRTZXBhcmF0b3JLZXlDb2RlcyIsInNlcGFyYXRvcktleUNvZGVzIl0scGxhY2Vob2xkZXI6InBsYWNlaG9sZGVyIixpZDoiaWQiLGNoaXBMaXN0OlsibWF0Q2hpcElucHV0Rm9yIiwiY2hpcExpc3QiXSxhZGRPbkJsdXI6WyJtYXRDaGlwSW5wdXRBZGRPbkJsdXIiLCJhZGRPbkJsdXIiXSxkaXNhYmxlZDoiZGlzYWJsZWQifSxvdXRwdXRzOntjaGlwRW5kOiJtYXRDaGlwSW5wdXRUb2tlbkVuZCJ9LGV4cG9ydEFzOlsibWF0Q2hpcElucHV0IiwibWF0Q2hpcElucHV0Rm9yIl0sZmVhdHVyZXM6W0JvXX0pLGt5dC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbTXl0XX1dfV0sa3l0LnByb3BEZWNvcmF0b3JzPXtjaGlwTGlzdDpbe3R5cGU6eHksYXJnczpbIm1hdENoaXBJbnB1dEZvciJdfV0sYWRkT25CbHVyOlt7dHlwZTp4eSxhcmdzOlsibWF0Q2hpcElucHV0QWRkT25CbHVyIl19XSxzZXBhcmF0b3JLZXlDb2Rlczpbe3R5cGU6eHksYXJnczpbIm1hdENoaXBJbnB1dFNlcGFyYXRvcktleUNvZGVzIl19XSxjaGlwRW5kOlt7dHlwZTpPeSxhcmdzOlsibWF0Q2hpcElucHV0VG9rZW5FbmQiXX1dLHBsYWNlaG9sZGVyOlt7dHlwZTp4eX1dLGlkOlt7dHlwZTp4eX1dLGRpc2FibGVkOlt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGt5dCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJpbnB1dFttYXRDaGlwSW5wdXRGb3JdIixleHBvcnRBczoibWF0Q2hpcElucHV0LCBtYXRDaGlwSW5wdXRGb3IiLGhvc3Q6e2NsYXNzOiJtYXQtY2hpcC1pbnB1dCBtYXQtaW5wdXQtZWxlbWVudCIsIihrZXlkb3duKSI6Il9rZXlkb3duKCRldmVudCkiLCIoa2V5dXApIjoiX2tleXVwKCRldmVudCkiLCIoYmx1cikiOiJfYmx1cigpIiwiKGZvY3VzKSI6Il9mb2N1cygpIiwiKGlucHV0KSI6Il9vbklucHV0KCkiLCJbaWRdIjoiaWQiLCJbYXR0ci5kaXNhYmxlZF0iOiJkaXNhYmxlZCB8fCBudWxsIiwiW2F0dHIucGxhY2Vob2xkZXJdIjoicGxhY2Vob2xkZXIgfHwgbnVsbCIsIlthdHRyLmFyaWEtaW52YWxpZF0iOiJfY2hpcExpc3QgJiYgX2NoaXBMaXN0Lm5nQ29udHJvbCA/IF9jaGlwTGlzdC5uZ0NvbnRyb2wuaW52YWxpZCA6IG51bGwiLCJbYXR0ci5hcmlhLXJlcXVpcmVkXSI6Il9jaGlwTGlzdCAmJiBfY2hpcExpc3QucmVxdWlyZWQgfHwgbnVsbCJ9fV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltNeXRdfV19XX0pLHtzZXBhcmF0b3JLZXlDb2Rlczpbe3R5cGU6eHksYXJnczpbIm1hdENoaXBJbnB1dFNlcGFyYXRvcktleUNvZGVzIl19XSxjaGlwRW5kOlt7dHlwZTpPeSxhcmdzOlsibWF0Q2hpcElucHV0VG9rZW5FbmQiXX1dLHBsYWNlaG9sZGVyOlt7dHlwZTp4eX1dLGlkOlt7dHlwZTp4eX1dLGNoaXBMaXN0Olt7dHlwZTp4eSxhcmdzOlsibWF0Q2hpcElucHV0Rm9yIl19XSxhZGRPbkJsdXI6W3t0eXBlOnh5LGFyZ3M6WyJtYXRDaGlwSW5wdXRBZGRPbkJsdXIiXX1dLGRpc2FibGVkOlt7dHlwZTp4eX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBTeXQ9W1B5dCxfeXQsa3l0LEN5dCxieXQseXl0XSxEeXQ9e3NlcGFyYXRvcktleUNvZGVzOlttel19O2NsYXNzIEV5dHt9RXl0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxFeXQpfSxFeXQuybVtb2Q9YW8oe3R5cGU6RXl0fSksRXl0Lsm1aW5qPXZuKHtwcm92aWRlcnM6W2JILHtwcm92aWRlOk15dCx1c2VWYWx1ZTpEeXR9XSxpbXBvcnRzOltbWEldXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRXl0LFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbWEldLGV4cG9ydHM6U3l0LGRlY2xhcmF0aW9uczpTeXQscHJvdmlkZXJzOltiSCx7cHJvdmlkZTpNeXQsdXNlVmFsdWU6RHl0fV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhFeXQse2RlY2xhcmF0aW9uczpmdW5jdGlvbigpe3JldHVybltQeXQsX3l0LGt5dCxDeXQsYnl0LHl5dF19LGltcG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bWEldfSxleHBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1B5dCxfeXQsa3l0LEN5dCxieXQseXl0XX19KTtjb25zdCBSeXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm57ImVtYmVkZGluZy1zZWxlY3RlZCI6dCwiZW1iZWRkaW5nLXVuc2VsZWN0ZWQiOmV9fTtmdW5jdGlvbiBBeXQodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJtYXQtaWNvbiIsNSksVm0oImNsaWNrIiwoZnVuY3Rpb24gZSgpe2hpKHQpO2NvbnN0IG49WW0oKTtyZXR1cm4gbi5vblNlbGVjdC5lbWl0KG4ubWV0cmljKX0pKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgpO0RtKCJuZ0NsYXNzIix2aCgxLFJ5dCx0LmVtYmVkZGluZ3NNZXRyaWM9PT10Lm1ldHJpYyx0LmVtYmVkZGluZ3NNZXRyaWMhPT10Lm1ldHJpYykpfX1jb25zdCBUeXQ9ZnVuY3Rpb24odCl7cmV0dXJue3dpZHRoOnR9fSxOeXQ9ZnVuY3Rpb24odCl7cmV0dXJueyJ2YWx1ZS1pbnZhbGlkIjp0fX07Y2xhc3Mgenl0e2NvbnN0cnVjdG9yKCl7dGhpcy5vblJlbW92ZT1uZXcgTGgsdGhpcy5vblNlbGVjdD1uZXcgTGgsdGhpcy5vbkZpbHRlckNoYW5nZT1uZXcgTGgsdGhpcy5mb2N1c01pbj0hMSx0aGlzLmZvY3VzTWF4PSExLHRoaXMubmdVbnN1YnNjcmliZT1uZXcgSX1uZ09uSW5pdCgpe3RoaXMubWluRm9ybUNvbnRyb2w9bmV3ICRqKHRoaXMuZmlsdGVyVmFsdWVzLm1pbixbcVYucmVxdWlyZWQscVYubWluKC0xKSxxVi5tYXgoMSksdGhpcy5taW5WYWx1ZVZhbGlkYXRvci5iaW5kKHRoaXMpXSksdGhpcy5tYXhGb3JtQ29udHJvbD1uZXcgJGoodGhpcy5maWx0ZXJWYWx1ZXMubWF4LFtxVi5yZXF1aXJlZCxxVi5taW4oLTEpLHFWLm1heCgxKSx0aGlzLm1heFZhbHVlVmFsaWRhdG9yLmJpbmQodGhpcyldKSx0aGlzLm1pbkZvcm1Db250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKEllKHRoaXMubmdVbnN1YnNjcmliZSkpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLm1pbkZvcm1Db250cm9sLnZhbGlkJiZ0aGlzLm1heEZvcm1Db250cm9sLnZhbGlkJiZ0aGlzLm9uRmlsdGVyQ2hhbmdlLmVtaXQoe21pbjpwYXJzZUZsb2F0KHRoaXMubWluRm9ybUNvbnRyb2wudmFsdWUpLG1heDpwYXJzZUZsb2F0KHRoaXMubWF4Rm9ybUNvbnRyb2wudmFsdWUpfSl9KSksdGhpcy5tYXhGb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5taW5Gb3JtQ29udHJvbC52YWxpZCYmdGhpcy5tYXhGb3JtQ29udHJvbC52YWxpZCYmdGhpcy5vbkZpbHRlckNoYW5nZS5lbWl0KHttaW46cGFyc2VGbG9hdCh0aGlzLm1pbkZvcm1Db250cm9sLnZhbHVlKSxtYXg6cGFyc2VGbG9hdCh0aGlzLm1heEZvcm1Db250cm9sLnZhbHVlKX0pfSkpfW5nT25DaGFuZ2VzKHQpe3RoaXMubWluRm9ybUNvbnRyb2wmJnRoaXMubWF4Rm9ybUNvbnRyb2wmJih0aGlzLm1pbkZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuZmlsdGVyVmFsdWVzLm1pbix7ZW1pdEV2ZW50OiExfSksdGhpcy5tYXhGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmZpbHRlclZhbHVlcy5tYXgse2VtaXRFdmVudDohMX0pKX1uZ09uRGVzdHJveSgpe3RoaXMubmdVbnN1YnNjcmliZS5uZXh0KCksdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCl9bWluVmFsdWVWYWxpZGF0b3IodCl7cmV0dXJuIHRoaXMubWF4Rm9ybUNvbnRyb2wmJiJOYU4iIT09dC52YWx1ZT9pc05hTihwYXJzZUZsb2F0KHQudmFsdWUpKT97dmFsdWU6InRoZSBzdHJpbmcgeW91IGVudGVyZWQgaXMgbmVpdGhlciBOYU4gbm9yIGEgbnVtYmVyIn06cGFyc2VGbG9hdCh0LnZhbHVlKT5wYXJzZUZsb2F0KHRoaXMubWF4Rm9ybUNvbnRyb2wudmFsdWUpP3t2YWx1ZToidGhlIG51bWJlciB5b3UgZW50ZXJlZCBpcyBsYXJnZXIgdGhhbiB0aGUgbWF4IHZhbHVlIn06bnVsbDpudWxsfW1heFZhbHVlVmFsaWRhdG9yKHQpe3JldHVybiB0aGlzLm1pbkZvcm1Db250cm9sPyJOYU4iPT09dGhpcy5taW5Gb3JtQ29udHJvbC52YWx1ZSYmIk5hTiI9PT10LnZhbHVlP251bGw6aXNOYU4ocGFyc2VGbG9hdCh0LnZhbHVlKSk/e3ZhbHVlOiJ0aGUgc3RyaW5nIHlvdSBlbnRlcmVkIGlzIG5laXRoZXIgTmFOIG5vciBhIG51bWJlciJ9OnQudmFsdWU8dGhpcy5taW5Gb3JtQ29udHJvbC52YWx1ZT97dmFsdWU6InRoZSBudW1iZXIgeW91IGVudGVyZWQgaXMgc21hbGxlciB0aGFuIHRoZSBtaW4gdmFsdWUifTpudWxsOm51bGx9Z2V0RXJyb3JEZXNjcmlwdGlvbih0KXtpZih0KXtjb25zdCBlPU9iamVjdC5rZXlzKHQpWzBdO3JldHVybiJyZXF1aXJlZCI9PT1lPyJ5b3UgZGlkIG5vdCBlbnRlciBhbnl0aGluZyI6Im1pbiI9PT1lPyJ0aGUgbnVtYmVyIG11c3QgYmUgYXQgbGVhc3QgLTEuMCI6Im1heCI9PT1lPyJ0aGUgbnVtYmVyIGlzIGJpZ2dlciB0aGFuIDEuMCI6dFtlXX1yZXR1cm4iIn19enl0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx6eXQpfSx6eXQuybVjbXA9dG8oe3R5cGU6enl0LHNlbGVjdG9yczpbWyJtZXRyaWMtYXJpdGhtZXRpYy1lbGVtZW50LWNvbXBvbmVudCJdXSxpbnB1dHM6e21ldHJpYzoibWV0cmljIixmaWx0ZXJWYWx1ZXM6ImZpbHRlclZhbHVlcyIsaGFzRW1iZWRkaW5nc0RhdGE6Imhhc0VtYmVkZGluZ3NEYXRhIixlbWJlZGRpbmdzTWV0cmljOiJlbWJlZGRpbmdzTWV0cmljIn0sb3V0cHV0czp7b25SZW1vdmU6Im9uUmVtb3ZlIixvblNlbGVjdDoib25TZWxlY3QiLG9uRmlsdGVyQ2hhbmdlOiJvbkZpbHRlckNoYW5nZSJ9LGZlYXR1cmVzOltCb10sZGVjbHM6MTAsdmFyczoyMixjb25zdHM6W1sxLCJmaWx0ZXItY2hpcCIsMywicmVtb3ZlZCJdLFsiY2xhc3MiLCJlbWJlZGRpbmdzLWJ1dHRvbiIsInN2Z0ljb24iLCJncm91cF93b3JrXzI0cHgiLDMsIm5nQ2xhc3MiLCJjbGljayIsNCwibmdJZiJdLFsxLCJtZXRyaWMtYXJpdGhtZXRpYy1lbGVtZW50LXJhbmdlIiwzLCJrZXlkb3duIl0sWyJtYXRJbnB1dCIsIiIsMSwiaW5wdXQtZmllbGQiLDMsInZhbHVlIiwibWF0VG9vbHRpcCIsIm1hdFRvb2x0aXBEaXNhYmxlZCIsIm5nU3R5bGUiLCJuZ0NsYXNzIiwiZm9ybUNvbnRyb2wiLCJmb2N1cyIsImZvY3Vzb3V0Il0sWyJtYXRDaGlwUmVtb3ZlIiwiIiwic3ZnSWNvbiIsImNhbmNlbF8yNHB4Il0sWyJzdmdJY29uIiwiZ3JvdXBfd29ya18yNHB4IiwxLCJlbWJlZGRpbmdzLWJ1dHRvbiIsMywibmdDbGFzcyIsImNsaWNrIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJtYXQtY2hpcCIsMCksVm0oInJlbW92ZWQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25SZW1vdmUuZW1pdChuLm1ldHJpYyl9KSksUXAoMSxBeXQsMSw0LCJtYXQtaWNvbiIsMSksa3UoMiksUm0oMywiZGl2IiwyKSxWbSgia2V5ZG93biIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCl9KSksa3UoNCwiIFsgIiksUm0oNSwiaW5wdXQiLDMpLFZtKCJmb2N1cyIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5mb2N1c01pbj0hMH0pKSgiZm9jdXNvdXQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uZm9jdXNNaW49ITF9KSksQW0oKSxrdSg2LCIgOyAiKSxSbSg3LCJpbnB1dCIsMyksVm0oImZvY3VzIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLmZvY3VzTWF4PSEwfSkpKCJmb2N1c291dCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5mb2N1c01heD0hMX0pKSxBbSgpLGt1KDgsIiBdICIpLEFtKCksVG0oOSwibWF0LWljb24iLDQpLEFtKCkpLDImZSYmKHJjKDEpLERtKCJuZ0lmIixuLmhhc0VtYmVkZGluZ3NEYXRhKSxyYygxKSxEdSgiICIsbi5tZXRyaWMsIiAiKSxyYygzKSxEbSgidmFsdWUiLG4uZmlsdGVyVmFsdWVzLm1pbikoIm1hdFRvb2x0aXAiLG4uZ2V0RXJyb3JEZXNjcmlwdGlvbihuLm1pbkZvcm1Db250cm9sLmVycm9ycykpKCJtYXRUb29sdGlwRGlzYWJsZWQiLCFuLm1pbkZvcm1Db250cm9sLmludmFsaWQpKCJuZ1N0eWxlIixNaCgxNCxUeXQsbi5mb2N1c01pbj8iMTAwcHgiOm4ubWluRm9ybUNvbnRyb2wudmFsdWUudG9TdHJpbmcoKS5sZW5ndGgrImNoIikpKCJuZ0NsYXNzIixNaCgxNixOeXQsIW4ubWluRm9ybUNvbnRyb2wudmFsaWQpKSgiZm9ybUNvbnRyb2wiLG4ubWluRm9ybUNvbnRyb2wpLHJjKDIpLERtKCJ2YWx1ZSIsbi5maWx0ZXJWYWx1ZXMubWF4KSgibWF0VG9vbHRpcCIsbi5nZXRFcnJvckRlc2NyaXB0aW9uKG4ubWF4Rm9ybUNvbnRyb2wuZXJyb3JzKSkoIm1hdFRvb2x0aXBEaXNhYmxlZCIsIW4ubWF4Rm9ybUNvbnRyb2wuaW52YWxpZCkoIm5nU3R5bGUiLE1oKDE4LFR5dCxuLmZvY3VzTWF4PyIxMDBweCI6bi5tYXhGb3JtQ29udHJvbC52YWx1ZS50b1N0cmluZygpLmxlbmd0aCsiY2giKSkoIm5nQ2xhc3MiLE1oKDIwLE55dCwhbi5tYXhGb3JtQ29udHJvbC52YWxpZCkpKCJmb3JtQ29udHJvbCIsbi5tYXhGb3JtQ29udHJvbCkpfSxkaXJlY3RpdmVzOltfeXQsZE0sVlYsRlEsQ00sYU0seGoseFUsRFcsQ3l0XSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0uZmlsdGVyLWNoaXBbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7bWFyZ2luLWxlZnQ6NXB4fS5tZXRyaWMtYXJpdGhtZXRpYy1lbGVtZW50LXJhbmdlW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjojZmZmO2ZvbnQtc2l6ZTouOGVtO2hlaWdodDozMHB4O2p1c3RpZnktY29udGVudDpjZW50ZXI7bGluZS1oZWlnaHQ6MzBweDtwYWRkaW5nOjAgNXB4O21hcmdpbi1sZWZ0OjVweH0uaW5wdXQtZmllbGRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyOm5vbmU7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToxLjFlbTt0cmFuc2l0aW9uOndpZHRoIDFzfS5pbnB1dC1maWVsZFtfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMik7Ym9yZGVyOm5vbmU7b3V0bGluZTpub25lfS52YWx1ZS1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5lbWJlZGRpbmctc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDA7b3BhY2l0eToxfS5lbWJlZGRpbmctdW5zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNH0uZW1iZWRkaW5ncy1idXR0b25bX25nY29udGVudC0lQ09NUCVde3dpZHRoOjE4cHg7aGVpZ2h0OjE4cHg7bWFyZ2luLXJpZ2h0OjhweDtjdXJzb3I6cG9pbnRlcn0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoenl0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1ldHJpYy1hcml0aG1ldGljLWVsZW1lbnQtY29tcG9uZW50Iix0ZW1wbGF0ZVVybDoiLi9tZXRyaWNfYXJpdGhtZXRpY19lbGVtZW50X2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyIuL21ldHJpY19hcml0aG1ldGljX2VsZW1lbnRfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse21ldHJpYzpbe3R5cGU6eHl9XSxmaWx0ZXJWYWx1ZXM6W3t0eXBlOnh5fV0saGFzRW1iZWRkaW5nc0RhdGE6W3t0eXBlOnh5fV0sZW1iZWRkaW5nc01ldHJpYzpbe3R5cGU6eHl9XSxvblJlbW92ZTpbe3R5cGU6T3l9XSxvblNlbGVjdDpbe3R5cGU6T3l9XSxvbkZpbHRlckNoYW5nZTpbe3R5cGU6T3l9XX0pO2NsYXNzIEl5dHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5maWx0ZXJWYWx1ZXMkPXRoaXMuc3RvcmUucGlwZShGdyhnYnQpKS5waXBlKEl0KCh0PT57Y29uc3QgZT10W3RoaXMubWV0cmljXTtyZXR1cm4gZT97bWluOmUuaW5jbHVkZU5hTj8iTmFOIjp0aGlzLnJvdW5kVG9UaHJlZURlY2ltYWxQb2ludHMoZS5taW4pLG1heDplLm1heDxlLm1pbj8iTmFOIjp0aGlzLnJvdW5kVG9UaHJlZURlY2ltYWxQb2ludHMoZS5tYXgpfTp7bWluOi0xLG1heDoxfX0pKSksdGhpcy5oYXNFbWJlZGRpbmdzRGF0YSQ9dGhpcy5zdG9yZS5waXBlKEZ3KGxidCkpLnBpcGUoSXQoKHQ9PnZvaWQgMCE9PXQpKSksdGhpcy5lbWJlZGRpbmdzTWV0cmljJD10aGlzLnN0b3JlLnBpcGUoRncoT2J0KSl9cmVtb3ZlKHQpe3RoaXMuc3RvcmUuZGlzcGF0Y2goTGJ0KHttZXRyaWM6dH0pKX1zZWxlY3QodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChaYnQoe21ldHJpYzp0fSkpfWZpbHRlckNoYW5nZSh0KXtjb25zdCBlPWlzTmFOKHQubWluKT8tMTp0Lm1pbixuPWlzTmFOKHQubWF4KT8tMjp0Lm1heCxvPWlzTmFOKHQubWluKTt0aGlzLnN0b3JlLmRpc3BhdGNoKEJidCh7bWV0cmljOnRoaXMubWV0cmljLG1heDpuLG1pbjplLGluY2x1ZGVOYU46b30pKX1yb3VuZFRvVGhyZWVEZWNpbWFsUG9pbnRzKHQpe3JldHVybiBNYXRoLnJvdW5kKDFlMyoodCtOdW1iZXIuRVBTSUxPTikpLzFlM319SXl0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxJeXQpKFNtKEl3KSl9LEl5dC7JtWNtcD10byh7dHlwZTpJeXQsc2VsZWN0b3JzOltbIm5wbWktbWV0cmljLWFyaXRobWV0aWMtZWxlbWVudCJdXSxpbnB1dHM6e21ldHJpYzoibWV0cmljIn0sZGVjbHM6NCx2YXJzOjEwLGNvbnN0czpbWzMsIm1ldHJpYyIsImZpbHRlclZhbHVlcyIsImhhc0VtYmVkZGluZ3NEYXRhIiwiZW1iZWRkaW5nc01ldHJpYyIsIm9uUmVtb3ZlIiwib25TZWxlY3QiLCJvbkZpbHRlckNoYW5nZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwibWV0cmljLWFyaXRobWV0aWMtZWxlbWVudC1jb21wb25lbnQiLDApLFZtKCJvblJlbW92ZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ucmVtb3ZlKGUpfSkpKCJvblNlbGVjdCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uc2VsZWN0KGUpfSkpKCJvbkZpbHRlckNoYW5nZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uZmlsdGVyQ2hhbmdlKGUpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBaCgzLCJhc3luYyIpLEFtKCkpLDImZSYmRG0oIm1ldHJpYyIsbi5tZXRyaWMpKCJmaWx0ZXJWYWx1ZXMiLFRoKDEsNCxuLmZpbHRlclZhbHVlcyQpKSgiaGFzRW1iZWRkaW5nc0RhdGEiLFRoKDIsNixuLmhhc0VtYmVkZGluZ3NEYXRhJCkpKCJlbWJlZGRpbmdzTWV0cmljIixUaCgzLDgsbi5lbWJlZGRpbmdzTWV0cmljJCkpfSxkaXJlY3RpdmVzOlt6eXRdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChJeXQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibnBtaS1tZXRyaWMtYXJpdGhtZXRpYy1lbGVtZW50Iix0ZW1wbGF0ZTonXG4gICAgPG1ldHJpYy1hcml0aG1ldGljLWVsZW1lbnQtY29tcG9uZW50XG4gICAgICBbbWV0cmljXT0ibWV0cmljIlxuICAgICAgW2ZpbHRlclZhbHVlc109ImZpbHRlclZhbHVlcyQgfCBhc3luYyJcbiAgICAgIFtoYXNFbWJlZGRpbmdzRGF0YV09Imhhc0VtYmVkZGluZ3NEYXRhJCB8IGFzeW5jIlxuICAgICAgW2VtYmVkZGluZ3NNZXRyaWNdPSJlbWJlZGRpbmdzTWV0cmljJCB8IGFzeW5jIlxuICAgICAgKG9uUmVtb3ZlKT0icmVtb3ZlKCRldmVudCkiXG4gICAgICAob25TZWxlY3QpPSJzZWxlY3QoJGV2ZW50KSJcbiAgICAgIChvbkZpbHRlckNoYW5nZSk9ImZpbHRlckNoYW5nZSgkZXZlbnQpIlxuICAgID48L21ldHJpYy1hcml0aG1ldGljLWVsZW1lbnQtY29tcG9uZW50PlxuICAnLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSkse21ldHJpYzpbe3R5cGU6eHl9XX0pO2NsYXNzIEh5dHtjb25zdHJ1Y3Rvcigpe3RoaXMuT3BlcmF0b3I9JGh0fX1mdW5jdGlvbiBGeXQodCxlKXsxJnQmJlRtKDAsIm5wbWktbWV0cmljLWFyaXRobWV0aWMtZWxlbWVudCIsNCksMiZ0JiZEbSgibWV0cmljIixZbSgpLiRpbXBsaWNpdC5tZXRyaWMpfWZ1bmN0aW9uIEx5dCh0LGUpezEmdCYmVG0oMCwibnBtaS1tZXRyaWMtYXJpdGhtZXRpYy1vcGVyYXRvciIsNSksMiZ0JiZEbSgib3BlcmF0b3IiLFltKCkuJGltcGxpY2l0Lm9wZXJhdG9yKX1mdW5jdGlvbiBCeXQodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiKSxRcCgxLEZ5dCwxLDEsIm5wbWktbWV0cmljLWFyaXRobWV0aWMtZWxlbWVudCIsMiksUXAoMixMeXQsMSwxLCJucG1pLW1ldHJpYy1hcml0aG1ldGljLW9wZXJhdG9yIiwzKSxBbSgpKSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQsbj1ZbSgpO3JjKDEpLERtKCJuZ0lmIix0LmtpbmQ9PT1uLkFyaXRobWV0aWNLaW5kLk1FVFJJQykscmMoMSksRG0oIm5nSWYiLHQua2luZD09PW4uQXJpdGhtZXRpY0tpbmQuT1BFUkFUT1IpfX1IeXQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEh5dCl9LEh5dC7JtWNtcD10byh7dHlwZTpIeXQsc2VsZWN0b3JzOltbIm5wbWktbWV0cmljLWFyaXRobWV0aWMtb3BlcmF0b3IiXV0saW5wdXRzOntvcGVyYXRvcjoib3BlcmF0b3IifSxkZWNsczoyLHZhcnM6MSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwibWF0LWNoaXAiKSxrdSgxKSxBbSgpKSwyJmUmJihyYygxKSxEdSgiICIsbi5vcGVyYXRvcj09PW4uT3BlcmF0b3IuQU5EPyImIjoiIiwiICIpKX0sZGlyZWN0aXZlczpbX3l0XSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEh5dCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJucG1pLW1ldHJpYy1hcml0aG1ldGljLW9wZXJhdG9yIix0ZW1wbGF0ZToiXG4gICAgPG1hdC1jaGlwPlxuICAgICAge3sgb3BlcmF0b3IgPT09IE9wZXJhdG9yLkFORCA/ICcmJyA6ICcnIH19XG4gICAgPC9tYXQtY2hpcD5cbiAgIixjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSxudWxsLHtvcGVyYXRvcjpbe3R5cGU6eHl9XX0pO2NsYXNzIFZ5dHtjb25zdHJ1Y3Rvcigpe3RoaXMuQXJpdGhtZXRpY0tpbmQ9dGJ0fX1WeXQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFZ5dCl9LFZ5dC7JtWNtcD10byh7dHlwZTpWeXQsc2VsZWN0b3JzOltbIm1ldHJpYy1hcml0aG1ldGljLWNvbXBvbmVudCJdXSxpbnB1dHM6e21ldHJpY0FyaXRobWV0aWM6Im1ldHJpY0FyaXRobWV0aWMifSxkZWNsczoyLHZhcnM6Mixjb25zdHM6W1szLCJzZWxlY3RhYmxlIl0sWzQsIm5nRm9yIiwibmdGb3JPZiJdLFszLCJtZXRyaWMiLDQsIm5nSWYiXSxbMywib3BlcmF0b3IiLDQsIm5nSWYiXSxbMywibWV0cmljIl0sWzMsIm9wZXJhdG9yIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJtYXQtY2hpcC1saXN0IiwwKSxRcCgxLEJ5dCwzLDIsImRpdiIsMSksQW0oKSksMiZlJiYoRG0oInNlbGVjdGFibGUiLCExKSxyYygxKSxEbSgibmdGb3JPZiIsbi5tZXRyaWNBcml0aG1ldGljKSl9LGRpcmVjdGl2ZXM6W1B5dCxsTSxkTSxJeXQsSHl0XSxzdHlsZXM6WyJbX25naG9zdC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtd3JhcDp3cmFwfSJdLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChWeXQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWV0cmljLWFyaXRobWV0aWMtY29tcG9uZW50Iix0ZW1wbGF0ZVVybDoiLi9tZXRyaWNfYXJpdGhtZXRpY19jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9tZXRyaWNfYXJpdGhtZXRpY19jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7bWV0cmljQXJpdGhtZXRpYzpbe3R5cGU6eHl9XX0pO2NsYXNzIGp5dHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5tZXRyaWNBcml0aG1ldGljJD10aGlzLnN0b3JlLnBpcGUoRncoZmJ0KSl9fWp5dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8anl0KShTbShJdykpfSxqeXQuybVjbXA9dG8oe3R5cGU6anl0LHNlbGVjdG9yczpbWyJucG1pLW1ldHJpYy1hcml0aG1ldGljIl1dLGRlY2xzOjIsdmFyczozLGNvbnN0czpbWzMsIm1ldHJpY0FyaXRobWV0aWMiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFRtKDAsIm1ldHJpYy1hcml0aG1ldGljLWNvbXBvbmVudCIsMCksQWgoMSwiYXN5bmMiKSksMiZlJiZEbSgibWV0cmljQXJpdGhtZXRpYyIsVGgoMSwxLG4ubWV0cmljQXJpdGhtZXRpYyQpKX0sZGlyZWN0aXZlczpbVnl0XSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoanl0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im5wbWktbWV0cmljLWFyaXRobWV0aWMiLHRlbXBsYXRlOidcbiAgICA8bWV0cmljLWFyaXRobWV0aWMtY29tcG9uZW50XG4gICAgICBbbWV0cmljQXJpdGhtZXRpY109Im1ldHJpY0FyaXRobWV0aWMkIHwgYXN5bmMiXG4gICAgPjwvbWV0cmljLWFyaXRobWV0aWMtY29tcG9uZW50PlxuICAnLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y2xhc3MgVXl0e31mdW5jdGlvbiBHeXQodCxlLG4pe2lmKG4pcmV0dXJuIHQ7Y29uc3Qgbz1PYmplY3QuYXNzaWduKHt9LHQpO3JldHVybiBlLmZvckVhY2goKHQ9PmRlbGV0ZSBvW3RdKSksb31VeXQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFV5dCl9LFV5dC7JtWNtcD10byh7dHlwZTpVeXQsc2VsZWN0b3JzOltbIm5wbWktZGF0YS1zZWxlY3Rpb24iXV0sZGVjbHM6NCx2YXJzOjAsY29uc3RzOltbMSwiZGF0YS1zZWxlY3Rpb24iXSxbMSwibWV0cmljcy1zZWxlY3RvciJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiZGl2IiwwKSxUbSgxLCJucG1pLW1ldHJpYy1zZWFyY2giLDEpLFRtKDIsIm5wbWktcmVzdWx0cy1kb3dubG9hZCIpLEFtKCksVG0oMywibnBtaS1tZXRyaWMtYXJpdGhtZXRpYyIpKX0sZGlyZWN0aXZlczpbbHl0LG15dCxqeXRdLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZWJlYmViO3BhZGRpbmc6MTBweCAyMHB4fS5kYXRhLXNlbGVjdGlvbltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcn0ubWV0cmljcy1zZWxlY3Rvcltfbmdjb250ZW50LSVDT01QJV17ZmxleDoxIDF9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFV5dCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJucG1pLWRhdGEtc2VsZWN0aW9uIix0ZW1wbGF0ZVVybDoiLi9kYXRhX3NlbGVjdGlvbl9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9kYXRhX3NlbGVjdGlvbl9jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCxudWxsKTtjb25zdCBXeXQ9WyJjaGFydCJdO2NsYXNzIFl5dHtjb25zdHJ1Y3Rvcigpe3RoaXMub25SZW1vdmU9bmV3IExoLHRoaXMub25VcGRhdGVGaWx0ZXI9bmV3IExoLHRoaXMuaGVpZ2h0PTMwMCx0aGlzLmNoYXJ0V2lkdGg9MCx0aGlzLmNoYXJ0SGVpZ2h0PTAsdGhpcy5kcmF3SGVpZ2h0PTAsdGhpcy5kcmF3V2lkdGg9MCx0aGlzLm1hcmdpbj17dG9wOjIwLHJpZ2h0OjEwLGJvdHRvbToyMCxsZWZ0OjEwfSx0aGlzLmRyYXdNYXJnaW49e3RvcDowLHJpZ2h0OjAsYm90dG9tOjIwLGxlZnQ6MjB9LHRoaXMuYnJ1c2g9KGZ1bmN0aW9uIHQoKXtyZXR1cm4oZnVuY3Rpb24gdChlKXt2YXIgbixvPW90dCxpPW50dCxhPWl0dCxyPSEwLHM9SDUoInN0YXJ0IiwiYnJ1c2giLCJlbmQiKSxsPTY7ZnVuY3Rpb24gYyh0KXt2YXIgbj10LnByb3BlcnR5KCJfX2JydXNoIixoKS5zZWxlY3RBbGwoIi5vdmVybGF5IikuZGF0YShbZXR0KCJvdmVybGF5IildKTtuLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJvdmVybGF5IikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5hdHRyKCJjdXJzb3IiLEs5Lm92ZXJsYXkpLm1lcmdlKG4pLmVhY2goKGZ1bmN0aW9uKCl7dmFyIHQ9YXR0KHRoaXMpLmV4dGVudDtKNCh0aGlzKS5hdHRyKCJ4Iix0WzBdWzBdKS5hdHRyKCJ5Iix0WzBdWzFdKS5hdHRyKCJ3aWR0aCIsdFsxXVswXS10WzBdWzBdKS5hdHRyKCJoZWlnaHQiLHRbMV1bMV0tdFswXVsxXSl9KSksdC5zZWxlY3RBbGwoIi5zZWxlY3Rpb24iKS5kYXRhKFtldHQoInNlbGVjdGlvbiIpXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsInNlbGVjdGlvbiIpLmF0dHIoImN1cnNvciIsSzkuc2VsZWN0aW9uKS5hdHRyKCJmaWxsIiwiIzc3NyIpLmF0dHIoImZpbGwtb3BhY2l0eSIsLjMpLmF0dHIoInN0cm9rZSIsIiNmZmYiKS5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIik7dmFyIG89dC5zZWxlY3RBbGwoIi5oYW5kbGUiKS5kYXRhKGUuaGFuZGxlcywoZnVuY3Rpb24odCl7cmV0dXJuIHQudHlwZX0pKTtvLmV4aXQoKS5yZW1vdmUoKSxvLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLChmdW5jdGlvbih0KXtyZXR1cm4iaGFuZGxlIGhhbmRsZS0tIit0LnR5cGV9KSkuYXR0cigiY3Vyc29yIiwoZnVuY3Rpb24odCl7cmV0dXJuIEs5W3QudHlwZV19KSksdC5lYWNoKGQpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5vbigibW91c2Vkb3duLmJydXNoIix1KS5maWx0ZXIoYSkub24oInRvdWNoc3RhcnQuYnJ1c2giLHUpLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLGYpLm9uKCJ0b3VjaGVuZC5icnVzaCB0b3VjaGNhbmNlbC5icnVzaCIsZykuc3R5bGUoInRvdWNoLWFjdGlvbiIsIm5vbmUiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpfWZ1bmN0aW9uIGQoKXt2YXIgdD1KNCh0aGlzKSxlPWF0dCh0aGlzKS5zZWxlY3Rpb247ZT8odC5zZWxlY3RBbGwoIi5zZWxlY3Rpb24iKS5zdHlsZSgiZGlzcGxheSIsbnVsbCkuYXR0cigieCIsZVswXVswXSkuYXR0cigieSIsZVswXVsxXSkuYXR0cigid2lkdGgiLGVbMV1bMF0tZVswXVswXSkuYXR0cigiaGVpZ2h0IixlWzFdWzFdLWVbMF1bMV0pLHQuc2VsZWN0QWxsKCIuaGFuZGxlIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLChmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGVbdC50eXBlLmxlbmd0aC0xXT9lWzFdWzBdLWwvMjplWzBdWzBdLWwvMn0pKS5hdHRyKCJ5IiwoZnVuY3Rpb24odCl7cmV0dXJuInMiPT09dC50eXBlWzBdP2VbMV1bMV0tbC8yOmVbMF1bMV0tbC8yfSkpLmF0dHIoIndpZHRoIiwoZnVuY3Rpb24odCl7cmV0dXJuIm4iPT09dC50eXBlfHwicyI9PT10LnR5cGU/ZVsxXVswXS1lWzBdWzBdK2w6bH0pKS5hdHRyKCJoZWlnaHQiLChmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGV8fCJ3Ij09PXQudHlwZT9lWzFdWzFdLWVbMF1bMV0rbDpsfSkpKTp0LnNlbGVjdEFsbCgiLnNlbGVjdGlvbiwuaGFuZGxlIikuc3R5bGUoImRpc3BsYXkiLCJub25lIikuYXR0cigieCIsbnVsbCkuYXR0cigieSIsbnVsbCkuYXR0cigid2lkdGgiLG51bGwpLmF0dHIoImhlaWdodCIsbnVsbCl9ZnVuY3Rpb24gcCh0LGUsbil7dmFyIG89dC5fX2JydXNoLmVtaXR0ZXI7cmV0dXJuIW98fG4mJm8uY2xlYW4/bmV3IG0odCxlLG4pOm99ZnVuY3Rpb24gbSh0LGUsbil7dGhpcy50aGF0PXQsdGhpcy5hcmdzPWUsdGhpcy5zdGF0ZT10Ll9fYnJ1c2gsdGhpcy5hY3RpdmU9MCx0aGlzLmNsZWFuPW59ZnVuY3Rpb24gdSgpe2lmKCghbnx8TDQudG91Y2hlcykmJmkuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdCxvLGEscyxsLGMsbSx1LGYsZyxoLGI9dGhpcyx5PUw0LnRhcmdldC5fX2RhdGFfXy50eXBlLF89InNlbGVjdGlvbiI9PT0ociYmTDQubWV0YUtleT95PSJvdmVybGF5Ijp5KT9WOTpyJiZMNC5hbHRLZXk/Rzk6VTksQz1lPT09WDk/bnVsbDokOVt5XSxNPWU9PT1aOT9udWxsOnR0dFt5XSx2PWF0dChiKSx4PXYuZXh0ZW50LE89di5zZWxlY3Rpb24sUD14WzBdWzBdLHc9eFswXVsxXSxrPXhbMV1bMF0sUz14WzFdWzFdLEQ9MCxFPTAsUj1DJiZNJiZyJiZMNC5zaGlmdEtleSxBPUw0LnRvdWNoZXM/cTkoTDQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcik6dDYsVD1BKGIpLE49VCx6PXAoYixhcmd1bWVudHMsITApLmJlZm9yZXN0YXJ0KCk7Im92ZXJsYXkiPT09eT8oTyYmKGY9ITApLHYuc2VsZWN0aW9uPU89W1t0PWU9PT1YOT9QOlRbMF0sYT1lPT09Wjk/dzpUWzFdXSxbbD1lPT09WDk/azp0LG09ZT09PVo5P1M6YV1dKToodD1PWzBdWzBdLGE9T1swXVsxXSxsPU9bMV1bMF0sbT1PWzFdWzFdKSxvPXQscz1hLGM9bCx1PW07dmFyIEk9SjQoYikuYXR0cigicG9pbnRlci1ldmVudHMiLCJub25lIiksSD1JLnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5hdHRyKCJjdXJzb3IiLEs5W3ldKTtpZihMNC50b3VjaGVzKXoubW92ZWQ9TCx6LmVuZGVkPVY7ZWxzZXt2YXIgRj1KNChMNC52aWV3KS5vbigibW91c2Vtb3ZlLmJydXNoIixMLCEwKS5vbigibW91c2V1cC5icnVzaCIsViwhMCk7ciYmRi5vbigia2V5ZG93bi5icnVzaCIsaiwhMCkub24oImtleXVwLmJydXNoIixVLCEwKSxuNihMNC52aWV3KX1IOSgpLEk4KGIpLGQuY2FsbChiKSx6LnN0YXJ0KCl9ZnVuY3Rpb24gTCgpe3ZhciB0PUEoYik7IVJ8fGd8fGh8fChNYXRoLmFicyh0WzBdLU5bMF0pPk1hdGguYWJzKHRbMV0tTlsxXSk/aD0hMDpnPSEwKSxOPXQsZj0hMCxGOSgpLEIoKX1mdW5jdGlvbiBCKCl7dmFyIGU7c3dpdGNoKEQ9TlswXS1UWzBdLEU9TlsxXS1UWzFdLF8pe2Nhc2Ugajk6Y2FzZSBWOTpDJiYoRD1NYXRoLm1heChQLXQsTWF0aC5taW4oay1sLEQpKSxvPXQrRCxjPWwrRCksTSYmKEU9TWF0aC5tYXgody1hLE1hdGgubWluKFMtbSxFKSkscz1hK0UsdT1tK0UpO2JyZWFrO2Nhc2UgVTk6QzwwPyhEPU1hdGgubWF4KFAtdCxNYXRoLm1pbihrLXQsRCkpLG89dCtELGM9bCk6Qz4wJiYoRD1NYXRoLm1heChQLWwsTWF0aC5taW4oay1sLEQpKSxvPXQsYz1sK0QpLE08MD8oRT1NYXRoLm1heCh3LWEsTWF0aC5taW4oUy1hLEUpKSxzPWErRSx1PW0pOk0+MCYmKEU9TWF0aC5tYXgody1tLE1hdGgubWluKFMtbSxFKSkscz1hLHU9bStFKTticmVhaztjYXNlIEc5OkMmJihvPU1hdGgubWF4KFAsTWF0aC5taW4oayx0LUQqQykpLGM9TWF0aC5tYXgoUCxNYXRoLm1pbihrLGwrRCpDKSkpLE0mJihzPU1hdGgubWF4KHcsTWF0aC5taW4oUyxhLUUqTSkpLHU9TWF0aC5tYXgodyxNYXRoLm1pbihTLG0rRSpNKSkpfWM8byYmKEMqPS0xLGU9dCx0PWwsbD1lLGU9byxvPWMsYz1lLHkgaW4gSjkmJkguYXR0cigiY3Vyc29yIixLOVt5PUo5W3ldXSkpLHU8cyYmKE0qPS0xLGU9YSxhPW0sbT1lLGU9cyxzPXUsdT1lLHkgaW4gUTkmJkguYXR0cigiY3Vyc29yIixLOVt5PVE5W3ldXSkpLHYuc2VsZWN0aW9uJiYoTz12LnNlbGVjdGlvbiksZyYmKG89T1swXVswXSxjPU9bMV1bMF0pLGgmJihzPU9bMF1bMV0sdT1PWzFdWzFdKSxPWzBdWzBdPT09byYmT1swXVsxXT09PXMmJk9bMV1bMF09PT1jJiZPWzFdWzFdPT09dXx8KHYuc2VsZWN0aW9uPVtbbyxzXSxbYyx1XV0sZC5jYWxsKGIpLHouYnJ1c2goKSl9ZnVuY3Rpb24gVigpe2lmKEg5KCksTDQudG91Y2hlcyl7aWYoTDQudG91Y2hlcy5sZW5ndGgpcmV0dXJuO24mJmNsZWFyVGltZW91dChuKSxuPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bj1udWxsfSksNTAwKX1lbHNlIG82KEw0LnZpZXcsZiksRi5vbigia2V5ZG93bi5icnVzaCBrZXl1cC5icnVzaCBtb3VzZW1vdmUuYnJ1c2ggbW91c2V1cC5icnVzaCIsbnVsbCk7SS5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLEguYXR0cigiY3Vyc29yIixLOS5vdmVybGF5KSx2LnNlbGVjdGlvbiYmKE89di5zZWxlY3Rpb24pLHJ0dChPKSYmKHYuc2VsZWN0aW9uPW51bGwsZC5jYWxsKGIpKSx6LmVuZCgpfWZ1bmN0aW9uIGooKXtzd2l0Y2goTDQua2V5Q29kZSl7Y2FzZSAxNjpSPUMmJk07YnJlYWs7Y2FzZSAxODpfPT09VTkmJihDJiYobD1jLUQqQyx0PW8rRCpDKSxNJiYobT11LUUqTSxhPXMrRSpNKSxfPUc5LEIoKSk7YnJlYWs7Y2FzZSAzMjpfIT09VTkmJl8hPT1HOXx8KEM8MD9sPWMtRDpDPjAmJih0PW8tRCksTTwwP209dS1FOk0+MCYmKGE9cy1FKSxfPWo5LEguYXR0cigiY3Vyc29yIixLOS5zZWxlY3Rpb24pLEIoKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59RjkoKX1mdW5jdGlvbiBVKCl7c3dpdGNoKEw0LmtleUNvZGUpe2Nhc2UgMTY6UiYmKGc9aD1SPSExLEIoKSk7YnJlYWs7Y2FzZSAxODpfPT09RzkmJihDPDA/bD1jOkM+MCYmKHQ9byksTTwwP209dTpNPjAmJihhPXMpLF89VTksQigpKTticmVhaztjYXNlIDMyOl89PT1qOSYmKEw0LmFsdEtleT8oQyYmKGw9Yy1EKkMsdD1vK0QqQyksTSYmKG09dS1FKk0sYT1zK0UqTSksXz1HOSk6KEM8MD9sPWM6Qz4wJiYodD1vKSxNPDA/bT11Ok0+MCYmKGE9cyksXz1VOSksSC5hdHRyKCJjdXJzb3IiLEs5W3ldKSxCKCkpO2JyZWFrO2RlZmF1bHQ6cmV0dXJufUY5KCl9fWZ1bmN0aW9uIGYoKXtwKHRoaXMsYXJndW1lbnRzKS5tb3ZlZCgpfWZ1bmN0aW9uIGcoKXtwKHRoaXMsYXJndW1lbnRzKS5lbmRlZCgpfWZ1bmN0aW9uIGgoKXt2YXIgdD10aGlzLl9fYnJ1c2h8fHtzZWxlY3Rpb246bnVsbH07cmV0dXJuIHQuZXh0ZW50PVk5KG8uYXBwbHkodGhpcyxhcmd1bWVudHMpKSx0LmRpbT1lLHR9cmV0dXJuIGMubW92ZT1mdW5jdGlvbih0LG4pe3Quc2VsZWN0aW9uP3Qub24oInN0YXJ0LmJydXNoIiwoZnVuY3Rpb24oKXtwKHRoaXMsYXJndW1lbnRzKS5iZWZvcmVzdGFydCgpLnN0YXJ0KCl9KSkub24oImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2giLChmdW5jdGlvbigpe3AodGhpcyxhcmd1bWVudHMpLmVuZCgpfSkpLnR3ZWVuKCJicnVzaCIsKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxvPXQuX19icnVzaCxpPXAodCxhcmd1bWVudHMpLGE9by5zZWxlY3Rpb24scj1lLmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm4sby5leHRlbnQpLHM9WjcoYSxyKTtmdW5jdGlvbiBsKGUpe28uc2VsZWN0aW9uPTE9PT1lJiZudWxsPT09cj9udWxsOnMoZSksZC5jYWxsKHQpLGkuYnJ1c2goKX1yZXR1cm4gbnVsbCE9PWEmJm51bGwhPT1yP2w6bCgxKX0pKTp0LmVhY2goKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxvPWFyZ3VtZW50cyxpPXQuX19icnVzaCxhPWUuaW5wdXQoImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0LG8pOm4saS5leHRlbnQpLHI9cCh0LG8pLmJlZm9yZXN0YXJ0KCk7STgodCksaS5zZWxlY3Rpb249bnVsbD09PWE/bnVsbDphLGQuY2FsbCh0KSxyLnN0YXJ0KCkuYnJ1c2goKS5lbmQoKX0pKX0sYy5jbGVhcj1mdW5jdGlvbih0KXtjLm1vdmUodCxudWxsKX0sbS5wcm90b3R5cGU9e2JlZm9yZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLnN0YXRlLmVtaXR0ZXI9dGhpcyx0aGlzLnN0YXJ0aW5nPSEwKSx0aGlzfSxzdGFydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0aW5nPyh0aGlzLnN0YXJ0aW5nPSExLHRoaXMuZW1pdCgic3RhcnQiKSk6dGhpcy5lbWl0KCJicnVzaCIpLHRoaXN9LGJydXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW1pdCgiYnJ1c2giKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09LS10aGlzLmFjdGl2ZSYmKGRlbGV0ZSB0aGlzLnN0YXRlLmVtaXR0ZXIsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXshKGZ1bmN0aW9uIG4odCxlLG8saSl7dmFyIGE9TDQ7dC5zb3VyY2VFdmVudD1MNCxMND10O3RyeXtlLmFwcGx5KG8saSl9ZmluYWxseXtMND1hfX0pKG5ldyBJOShjLHQsZS5vdXRwdXQodGhpcy5zdGF0ZS5zZWxlY3Rpb24pKSxzLmFwcGx5LHMsW3QsdGhpcy50aGF0LHRoaXMuYXJnc10pfX0sYy5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp6OShZOSh0KSksYyk6b30sYy5maWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp6OSghIXQpLGMpOml9LGMudG91Y2hhYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ejkoISF0KSxjKTphfSxjLmhhbmRsZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9K3QsYyk6bH0sYy5rZXlNb2RpZmllcnM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ISF0LGMpOnJ9LGMub249ZnVuY3Rpb24oKXt2YXIgdD1zLm9uLmFwcGx5KHMsYXJndW1lbnRzKTtyZXR1cm4gdD09PXM/Yzp0fSxjfSkoWDkpfSkoKSx0aGlzLm1heEJpblNpemU9MCx0aGlzLmFyZWE9KGZ1bmN0aW9uIGUoKXt2YXIgdD14b3QsZT1udWxsLG49Q290KDApLG89T290LGk9Q290KCEwKSxhPW51bGwscj12b3Qscz1udWxsO2Z1bmN0aW9uIGwobCl7dmFyIGMsZCxwLG0sdSxmPWwubGVuZ3RoLGc9ITEsaD1uZXcgQXJyYXkoZiksYj1uZXcgQXJyYXkoZik7Zm9yKG51bGw9PWEmJihzPXIodT1tdHQoKSkpLGM9MDtjPD1mOysrYyl7aWYoIShjPGYmJmkobT1sW2NdLGMsbCkpPT09ZylpZihnPSFnKWQ9YyxzLmFyZWFTdGFydCgpLHMubGluZVN0YXJ0KCk7ZWxzZXtmb3Iocy5saW5lRW5kKCkscy5saW5lU3RhcnQoKSxwPWMtMTtwPj1kOy0tcClzLnBvaW50KGhbcF0sYltwXSk7cy5saW5lRW5kKCkscy5hcmVhRW5kKCl9ZyYmKGhbY109K3QobSxjLGwpLGJbY109K24obSxjLGwpLHMucG9pbnQoZT8rZShtLGMsbCk6aFtjXSxvPytvKG0sYyxsKTpiW2NdKSl9aWYodSlyZXR1cm4gcz1udWxsLHUrIiJ8fG51bGx9ZnVuY3Rpb24gYygpe3JldHVybiBQb3QoKS5kZWZpbmVkKGkpLmN1cnZlKHIpLmNvbnRleHQoYSl9cmV0dXJuIGwueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkNvdCgrbiksZT1udWxsLGwpOnR9LGwueDA9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpDb3QoK2UpLGwpOnR9LGwueDE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Q290KCt0KSxsKTplfSxsLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpDb3QoK3QpLG89bnVsbCxsKTpufSxsLnkwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Q290KCt0KSxsKTpufSxsLnkxPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OkNvdCgrdCksbCk6b30sbC5saW5lWDA9bC5saW5lWTA9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLngodCkueShuKX0sbC5saW5lWTE9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLngodCkueShvKX0sbC5saW5lWDE9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLngoZSkueShuKX0sbC5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Q290KCEhdCksbCk6aX0sbC5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG51bGwhPWEmJihzPXIoYSkpLGwpOnJ9LGwuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9hPXM9bnVsbDpzPXIoYT10KSxsKTphfSxsfSkoKS54MChmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54U2NhbGVOdW0oLXQubGVuZ3RoKX0uYmluZCh0aGlzKSkueDEoZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueFNjYWxlTnVtKHQubGVuZ3RoKX0uYmluZCh0aGlzKSkueShmdW5jdGlvbih0KXtyZXR1cm4gdC54MD09PS0xLzA/dGhpcy5jaGFydEhlaWdodC10aGlzLmRyYXdNYXJnaW4udG9wOnRoaXMueVNjYWxlKCh0LngxK3QueDApLzIpfS5iaW5kKHRoaXMpKS5jdXJ2ZShEb3QpfW5nQWZ0ZXJWaWV3SW5pdCgpe3RoaXMudXBkYXRlRGltZW5zaW9ucygpLHRoaXMuc3ZnPUo0KHRoaXMuY2hhcnRDb250YWluZXIubmF0aXZlRWxlbWVudCkuc2VsZWN0KCJzdmciKSx0aGlzLm1haW5Db250YWluZXI9dGhpcy5zdmcuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIixgdHJhbnNsYXRlKCR7dGhpcy5tYXJnaW4ubGVmdH0sICR7dGhpcy5tYXJnaW4udG9wfSlgKSx0aGlzLmRyYXdDb250YWluZXI9dGhpcy5tYWluQ29udGFpbmVyLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsYHRyYW5zbGF0ZSgke3RoaXMuZHJhd01hcmdpbi5sZWZ0fSwgJHt0aGlzLmRyYXdNYXJnaW4udG9wfSlgKSx0aGlzLmRvdHNHcm91cD10aGlzLmRyYXdDb250YWluZXIuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJkb3RzR3JvdXAiKSx0aGlzLnlBeGlzR3JvdXA9dGhpcy5tYWluQ29udGFpbmVyLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwiYXhpcyBheGlzLS15IiksdGhpcy54QXhpc0dyb3VwPXRoaXMubWFpbkNvbnRhaW5lci5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImF4aXMgYXhpcy0teCIpLHRoaXMubWlzY0dyb3VwPXRoaXMuZHJhd0NvbnRhaW5lci5hcHBlbmQoImciKSx0aGlzLnhTY2FsZT1WdHQoKS5wYWRkaW5nKC4wNSksdGhpcy54QXhpcz16NSh0aGlzLnhTY2FsZSksdGhpcy55U2NhbGU9ZWV0KCkucmFuZ2UoW3RoaXMuZHJhd0hlaWdodCwwXSksdGhpcy55QXhpcz0oZnVuY3Rpb24gdChlKXtyZXR1cm4gVDUoNCxlKX0pKHRoaXMueVNjYWxlKSx0aGlzLnhTY2FsZU51bT1lZXQoKSx0aGlzLmluaXRpYWxpemVCcnVzaCgpLHRoaXMuZHJhd01pc2MoKSx0aGlzLnJlZHJhdygpfW5nT25DaGFuZ2VzKHQpe3RoaXMuc3ZnJiZ0aGlzLnJlZHJhdygpfXJlZHJhdygpe3RoaXMudXBkYXRlRGltZW5zaW9ucygpLHRoaXMuc2V0TWF4QmluU2l6ZSgpLHRoaXMudXBkYXRlQXhlcygpLHRoaXMuZHJhdygpfXVwZGF0ZURpbWVuc2lvbnMoKXt0aGlzLmNoYXJ0V2lkdGg9dGhpcy53aWR0aC10aGlzLm1hcmdpbi5sZWZ0LXRoaXMubWFyZ2luLnJpZ2h0LHRoaXMuZHJhd1dpZHRoPXRoaXMuY2hhcnRXaWR0aC10aGlzLmRyYXdNYXJnaW4ubGVmdC10aGlzLmRyYXdNYXJnaW4ucmlnaHQsdGhpcy5jaGFydEhlaWdodD10aGlzLmhlaWdodC10aGlzLm1hcmdpbi50b3AtdGhpcy5tYXJnaW4uYm90dG9tLHRoaXMuZHJhd0hlaWdodD10aGlzLmNoYXJ0SGVpZ2h0LXRoaXMuZHJhd01hcmdpbi50b3AtdGhpcy5kcmF3TWFyZ2luLmJvdHRvbX1zZXRNYXhCaW5TaXplKCl7T2JqZWN0LnZhbHVlcyh0aGlzLmNoYXJ0RGF0YS52aW9saW5EYXRhKS5mb3JFYWNoKCh0PT57Y29uc3QgZT10Lm1hcCgodD0+dC5sZW5ndGgpKSxuPU1hdGgubWF4KC4uLmUpO3RoaXMubWF4QmluU2l6ZT1NYXRoLm1heChuLHRoaXMubWF4QmluU2l6ZSl9KSl9dXBkYXRlQXhlcygpe3RoaXMueFNjYWxlLnJhbmdlKFswLHRoaXMuZHJhd1dpZHRoXSkuZG9tYWluKE9iamVjdC5rZXlzKHRoaXMuY2hhcnREYXRhLnZpb2xpbkRhdGEpKSx0aGlzLnlTY2FsZS5kb21haW4oW3RoaXMuY2hhcnREYXRhLmV4dHJlbWVzLm1pbix0aGlzLmNoYXJ0RGF0YS5leHRyZW1lcy5tYXhdKSx0aGlzLnhTY2FsZU51bS5yYW5nZShbMCx0aGlzLnhTY2FsZS5iYW5kd2lkdGgoKV0pLmRvbWFpbihbLXRoaXMubWF4QmluU2l6ZSx0aGlzLm1heEJpblNpemVdKX1pbml0aWFsaXplQnJ1c2goKXt0aGlzLmJydXNoLm9uKCJlbmQiLHRoaXMuYnJ1c2hNb3ZlZC5iaW5kKHRoaXMpKX1kcmF3KCl7dGhpcy5kcmF3QXhlcygpLHRoaXMuZHJhd1Bsb3QoKSx0aGlzLnJlZnJlc2hNaXNjKCksdGhpcy5yZWZyZXNoQnJ1c2goKX1kcmF3QXhlcygpe3RoaXMueUF4aXNHcm91cC5hdHRyKCJ0cmFuc2Zvcm0iLGB0cmFuc2xhdGUoJHt0aGlzLmRyYXdNYXJnaW4ubGVmdH0sXG4gICAgICAke3RoaXMuZHJhd01hcmdpbi50b3B9KWApLmNhbGwodGhpcy55QXhpcyksdGhpcy54QXhpc0dyb3VwLmF0dHIoInRyYW5zZm9ybSIsYHRyYW5zbGF0ZSgke3RoaXMuZHJhd01hcmdpbi5sZWZ0fSxcbiAgICAgICR7dGhpcy5kcmF3TWFyZ2luLnRvcCt0aGlzLmNoYXJ0SGVpZ2h0fSlgKS5jYWxsKHRoaXMueEF4aXMpfWRyYXdQbG90KCl7Y29uc3QgdD10aGlzLmRvdHNHcm91cC5zZWxlY3RBbGwoIi52aW9saW4tcGxvdCIpLmRhdGEoT2JqZWN0LmVudHJpZXModGhpcy5jaGFydERhdGEudmlvbGluRGF0YSkpO3QuZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5hdHRyKCJjbGFzcyIsInZpb2xpbi1wbG90Iikuc3R5bGUoInN0cm9rZSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29sb3JTY2FsZSh0WzBdKX0uYmluZCh0aGlzKSkuc3R5bGUoImZpbGwiLGZ1bmN0aW9uKHQpe3JldHVybmAke3RoaXMuY29sb3JTY2FsZSh0WzBdKX0zM2B9LmJpbmQodGhpcykpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7cmV0dXJuYHRyYW5zbGF0ZSgke3RoaXMueFNjYWxlKHRbMF0pfSwgMClgfS5iaW5kKHRoaXMpKS5kYXR1bSgoZnVuY3Rpb24odCl7cmV0dXJuIHRbMV19KSkuYXR0cigiZCIsdGhpcy5hcmVhKSx0LmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7cmV0dXJuYHRyYW5zbGF0ZSgke3RoaXMueFNjYWxlKHRbMF0pfSwgMClgfS5iaW5kKHRoaXMpKS5kYXR1bSgoZnVuY3Rpb24odCl7cmV0dXJuIHRbMV19KSkuYXR0cigiZCIsdGhpcy5hcmVhKSx0LmV4aXQoKS5yZW1vdmUoKX1kcmF3TWlzYygpe3RoaXMuemVyb0xpbmU9dGhpcy5taXNjR3JvdXAuYXBwZW5kKCJsaW5lIikuc3R5bGUoInN0cm9rZSIsImJsYWNrIikuYXR0cigieDEiLDApLmF0dHIoInkxIix0aGlzLnlTY2FsZSgwKSkuYXR0cigieDIiLHRoaXMuZHJhd1dpZHRoKS5hdHRyKCJ5MiIsdGhpcy55U2NhbGUoMCkpLHRoaXMubmFuVGV4dD10aGlzLm1pc2NHcm91cC5hcHBlbmQoInRleHQiKS5zdHlsZSgiZmlsbCIsImJsYWNrIikudGV4dCgiTmFOIikuYXR0cigiZm9udC1zaXplIiwiMTBweCIpLmF0dHIoInRleHQtYW5jaG9yIiwiZW5kIikuYXR0cigiYWxpZ25tZW50LWJhc2VsaW5lIiwibWlkZGxlIikuYXR0cigieCIsLTUpLmF0dHIoInkiLHRoaXMuY2hhcnRIZWlnaHQtdGhpcy5kcmF3TWFyZ2luLnRvcCksdGhpcy5uYW5MaW5lPXRoaXMubWlzY0dyb3VwLmFwcGVuZCgibGluZSIpLnN0eWxlKCJzdHJva2UiLCJncmV5Iikuc3R5bGUoInN0cm9rZS1kYXNoYXJyYXkiLCIzLCAzIikuYXR0cigieDEiLDApLmF0dHIoInkxIix0aGlzLmNoYXJ0SGVpZ2h0LXRoaXMuZHJhd01hcmdpbi50b3ApLmF0dHIoIngyIix0aGlzLmRyYXdXaWR0aCkuYXR0cigieTIiLHRoaXMuY2hhcnRIZWlnaHQtdGhpcy5kcmF3TWFyZ2luLnRvcCl9cmVmcmVzaE1pc2MoKXt0aGlzLnplcm9MaW5lLmF0dHIoInkxIix0aGlzLnlTY2FsZSgwKSkuYXR0cigieDIiLHRoaXMuZHJhd1dpZHRoKS5hdHRyKCJ5MiIsdGhpcy55U2NhbGUoMCkpLHRoaXMubmFuVGV4dC5hdHRyKCJ5Iix0aGlzLmNoYXJ0SGVpZ2h0LXRoaXMuZHJhd01hcmdpbi50b3ApLHRoaXMubmFuTGluZS5hdHRyKCJ5MSIsdGhpcy5kcmF3SGVpZ2h0K3RoaXMuZHJhd01hcmdpbi50b3ApLmF0dHIoIngyIix0aGlzLmRyYXdXaWR0aCkuYXR0cigieTIiLHRoaXMuZHJhd0hlaWdodCt0aGlzLmRyYXdNYXJnaW4udG9wKX1yZWZyZXNoQnJ1c2goKXt0aGlzLmJydXNoLmV4dGVudChbWzAsMF0sW3RoaXMuZHJhd1dpZHRoLHRoaXMuZHJhd0hlaWdodCt0aGlzLm1hcmdpbi50b3BdXSk7Y29uc3QgdD1bMCx0aGlzLmRyYXdIZWlnaHQrdGhpcy5tYXJnaW4udG9wXTtpZih0aGlzLmZpbHRlci5tYXg8dGhpcy5maWx0ZXIubWluKXRbMF09dGhpcy5maWx0ZXIuaW5jbHVkZU5hTj90aGlzLnlTY2FsZSh0aGlzLmNoYXJ0RGF0YS5leHRyZW1lcy5taW4pOnRbMV07ZWxzZXtpZighdGhpcy5maWx0ZXIuaW5jbHVkZU5hTil7Y29uc3QgZT1NYXRoLm1heCh0aGlzLmNoYXJ0RGF0YS5leHRyZW1lcy5taW4sdGhpcy5maWx0ZXIubWluKTt0WzFdPXRoaXMueVNjYWxlKGUpfWNvbnN0IGU9TWF0aC5taW4odGhpcy5jaGFydERhdGEuZXh0cmVtZXMubWF4LHRoaXMuZmlsdGVyLm1heCk7dFswXT10aGlzLnlTY2FsZShlKX10aGlzLmRyYXdDb250YWluZXIuY2FsbCh0aGlzLmJydXNoKS5jYWxsKHRoaXMuYnJ1c2gubW92ZSx0KX1icnVzaE1vdmVkKCl7aWYoIUw0KXJldHVybjtpZighTDQuc291cmNlRXZlbnQpcmV0dXJuO2NvbnN0IHQ9TDQuc2VsZWN0aW9uO2lmKHQpe2xldCBlPSExLG49LTIsbz10aGlzLmNoYXJ0RGF0YS5leHRyZW1lcy5taW47dFswXTw9dGhpcy5kcmF3SGVpZ2h0K3RoaXMubWFyZ2luLnRvcCYmdFsxXT49dGhpcy5kcmF3SGVpZ2h0JiYoZT0hMCksdFswXTx0aGlzLmRyYXdIZWlnaHQmJihuPXRoaXMueVNjYWxlLmludmVydCh0WzBdKSksdFsxXTx0aGlzLmRyYXdIZWlnaHQmJihvPXRoaXMueVNjYWxlLmludmVydCh0WzFdKSksdGhpcy5vblVwZGF0ZUZpbHRlci5lbWl0KHttYXg6bixtaW46byxpbmNsdWRlTmFOOmV9KX1lbHNlIHRoaXMub25VcGRhdGVGaWx0ZXIuZW1pdCh7bWF4OjEsbWluOi0xLGluY2x1ZGVOYU46ITB9KX19WXl0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxZeXQpfSxZeXQuybVjbXA9dG8oe3R5cGU6WXl0LHNlbGVjdG9yczpbWyJ2aW9saW4tZmlsdGVyLWNvbXBvbmVudCJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmUWgoV3l0LDcsaGcpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uY2hhcnRDb250YWluZXI9dC5maXJzdCl9fSxpbnB1dHM6e21ldHJpY05hbWU6Im1ldHJpY05hbWUiLGZpbHRlcjoiZmlsdGVyIixjaGFydERhdGE6ImNoYXJ0RGF0YSIsd2lkdGg6IndpZHRoIixjb2xvclNjYWxlOiJjb2xvclNjYWxlIn0sb3V0cHV0czp7b25SZW1vdmU6Im9uUmVtb3ZlIixvblVwZGF0ZUZpbHRlcjoib25VcGRhdGVGaWx0ZXIifSxmZWF0dXJlczpbQm9dLGRlY2xzOjksdmFyczoxLGNvbnN0czpmdW5jdGlvbigpe2xldCB0O3JldHVybiB0PSJ1bmRlZmluZWQiIT10eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUmJm5nSTE4bkNsb3N1cmVNb2RlP2dvb2cuZ2V0TXNnKCJSZW1vdmUgRmlsdGVyIik6JGxvY2FsaXplYDpMYWJlbCBmb3IgYSBidXR0b24gdGhhdCByZW1vdmVzIGEgbWV0cmljIGZpbHRlci7ikJ9hNmJmYWQ1OGJiMzYzZDVjODkxZDBhNTQ3NGIxZDc3ZWY5MGEzNGRh4pCfODQ1NDk2MTc5Nzc2MjkwNzYyNDpSZW1vdmUgRmlsdGVyYCxbWzEsImNoYXJ0LWNvbnRhaW5lciJdLFsidGl0bGUiLCJTaG93cyB0aGUgblBNSSB2YWx1ZSBkaXN0cmlidXRpb24gcGVyIHJ1bi4gUmFuZ2VzIG9mIHNlbGVjdGVkIHZhbHVlcyBjYW4gYmUgbWFuaXB1bGF0ZWQgYnkgbW9kaWZ5aW5nIHRoZSBncmV5IGJveC4iLDEsImNoYXJ0LWhlYWQiXSxbMSwiY2hhcnQtaGVhZGluZyJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsdCwzLCJjbGljayJdLFsic3ZnSWNvbiIsImNsZWFyXzI0cHgiXSxbMSwiY2hhcnQiXSxbImNoYXJ0IiwiIl0sWzEsImRyYXctYXJlYSJdXX0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImRpdiIsMCksUm0oMSwiZGl2IiwxKSxSbSgyLCJkaXYiLDIpLGt1KDMpLEFtKCksUm0oNCwiYnV0dG9uIiwzKSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25SZW1vdmUuZW1pdCgpfSkpLFRtKDUsIm1hdC1pY29uIiw0KSxBbSgpLEFtKCksUm0oNiwiZGl2Iiw1LDYpLHFpKCksVG0oOCwic3ZnIiw3KSxBbSgpLEFtKCkpLDImZSYmKHJjKDMpLFN1KG4ubWV0cmljTmFtZSkpfSxkaXJlY3RpdmVzOltYSCxEV10sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9LmNoYXJ0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWI7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtvdmVyZmxvdzpoaWRkZW59LmNoYXJ0W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MzAwcHg7d2lkdGg6MTAwJX0uY2hhcnQtaGVhZFtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbn0uY2hhcnQtaGVhZGluZ1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHg7cGFkZGluZy1sZWZ0OjEwcHg7cGFkZGluZy10b3A6MTBweH0uZHJhdy1hcmVhW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5zdHJva2VkLWxpbmVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTpyZ2JhKDAsMCwwLC4xMik7c3Ryb2tlLWRhc2hhcnJheTozIDN9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFl5dCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJ2aW9saW4tZmlsdGVyLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vdmlvbGluX2ZpbHRlcl9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi92aW9saW5fZmlsdGVyX2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSxudWxsLHttZXRyaWNOYW1lOlt7dHlwZTp4eX1dLGZpbHRlcjpbe3R5cGU6eHl9XSxjaGFydERhdGE6W3t0eXBlOnh5fV0sd2lkdGg6W3t0eXBlOnh5fV0sY29sb3JTY2FsZTpbe3R5cGU6eHl9XSxvblJlbW92ZTpbe3R5cGU6T3l9XSxvblVwZGF0ZUZpbHRlcjpbe3R5cGU6T3l9XSxjaGFydENvbnRhaW5lcjpbe3R5cGU6WmEsYXJnczpbImNoYXJ0Iix7c3RhdGljOiEwLHJlYWQ6aGd9XX1dfSk7Y2xhc3MgcXl0e2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLmFjdGl2ZVJ1bnMkPXRoaXMuc3RvcmUucGlwZShGdyhOTikpLnBpcGUoSXQoKHQ9PnQ/QXJyYXkuZnJvbSh0LmVudHJpZXMoKSkuZmlsdGVyKCh0PT50WzFdKSkubWFwKCh0PT50WzBdKSk6W10pKSksdGhpcy52aXNpYmxlQW5ub3RhdGlvbnMkPVd0KFt0aGlzLnN0b3JlLnNlbGVjdChyYnQpLHRoaXMuc3RvcmUuc2VsZWN0KHBidCksdGhpcy5zdG9yZS5zZWxlY3QoTWJ0KV0pLnBpcGUoSXQoKChbdCxlLG5dKT0+R3l0KHQsZSxuKSkpKSx0aGlzLmNoYXJ0V2lkdGgkPXRoaXMuc3RvcmUucGlwZShGdyh4YnQpKS5waXBlKEl0KCh0PT5NYXRoLm1heCgxNTAsdCkpKSksdGhpcy5ydW5Db2xvclNjYWxlJD10aGlzLnN0b3JlLnNlbGVjdCh6TikucGlwZShJdCgodD0+ZT0+e2lmKCF0Lmhhc093blByb3BlcnR5KGUpKXRocm93IG5ldyBFcnJvcihgW0NvbG9yIHNjYWxlXSB1bmtub3duIHJ1bklkOiAke2V9LmApO3JldHVybiB0W2VdfSkpKX1uZ09uSW5pdCgpe3RoaXMuY2hhcnREYXRhJD1XdChbdGhpcy52aXNpYmxlQW5ub3RhdGlvbnMkLHRoaXMuYWN0aXZlUnVucyRdKS5waXBlKEl0KCgoW3QsZV0pPT4oZnVuY3Rpb24gbih0LGUsbyl7Y29uc3QgaT17fSxhPXt9LHI9bmV3IFNldChlKSxzPW55dChvKSxsPXttYXg6LTEsbWluOjF9O09iamVjdC52YWx1ZXModCkuZm9yRWFjaCgodD0+e3QuZm9yRWFjaCgodD0+e2NvbnN0IGU9dC5ydW47aWYoci5oYXMoZSkmJnQubWV0cmljPT09cylpZihudWxsPT09dC5uUE1JVmFsdWUpYVtlXT9hW2VdLnB1c2gobnVsbCk6YVtlXT1bbnVsbF07ZWxzZXtjb25zdCBuPXQublBNSVZhbHVlO2wubWF4PWwubWF4PG4/bjpsLm1heCxsLm1pbj1sLm1pbj5uP246bC5taW4saVt0LnJ1bl0/aVtlXS5wdXNoKG4pOmlbZV09W25dfX0pKX0pKTtjb25zdCBjPXt9LGQ9TzUoKS5kb21haW4oW2wubWluLGwubWF4XSkudmFsdWUoKHQ9PnQpKSxwPU81KCkuZG9tYWluKFstMS8wLDEvMF0pLnRocmVzaG9sZHMoMCkudmFsdWUoKHQ9PnQpKTtmb3IoY29uc3QgdCBvZiByKWlmKGNbdF09ZChpW3RdKSxhW3RdKXtjb25zdCBlPXAoYVt0XSk7Y1t0XS51bnNoaWZ0KGVbMF0pfXJldHVybnt2aW9saW5EYXRhOmMsZXh0cmVtZXM6bH19KSh0LGUsdGhpcy5tZXRyaWNOYW1lKSkpKX1yZW1vdmVNZXRyaWMoKXt0aGlzLnN0b3JlLmRpc3BhdGNoKExidCh7bWV0cmljOnRoaXMubWV0cmljTmFtZX0pKX11cGRhdGVGaWx0ZXIodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChCYnQoT2JqZWN0LmFzc2lnbih7bWV0cmljOnRoaXMubWV0cmljTmFtZX0sdCkpKX19ZnVuY3Rpb24gWnl0KHQsZSl7aWYoMSZ0JiZUbSgwLCJucG1pLXZpb2xpbi1maWx0ZXIiLDgpLDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdDtEbSgibWV0cmljTmFtZSIsdFswXSkoImZpbHRlciIsdFsxXSl9fWZ1bmN0aW9uIFh5dCh0LGUpezEmdCYmKFJtKDAsImRpdiIsOSksUm0oMSwic3BhbiIsMTApLGt1KDIsIiBZb3UgY2FuIGFkZCBtb3JlIGZpbHRlcnMgYXQgdGhlIHRvcC4gIiksQW0oKSxBbSgpKX1xeXQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHF5dCkoU20oSXcpKX0scXl0Lsm1Y21wPXRvKHt0eXBlOnF5dCxzZWxlY3RvcnM6W1sibnBtaS12aW9saW4tZmlsdGVyIl1dLGlucHV0czp7bWV0cmljTmFtZToibWV0cmljTmFtZSIsZmlsdGVyOiJmaWx0ZXIifSxkZWNsczo0LHZhcnM6MTEsY29uc3RzOltbMywibWV0cmljTmFtZSIsImZpbHRlciIsImNoYXJ0RGF0YSIsIndpZHRoIiwiY29sb3JTY2FsZSIsIm9uUmVtb3ZlIiwib25VcGRhdGVGaWx0ZXIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsInZpb2xpbi1maWx0ZXItY29tcG9uZW50IiwwKSxWbSgib25SZW1vdmUiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ucmVtb3ZlTWV0cmljKCl9KSkoIm9uVXBkYXRlRmlsdGVyIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi51cGRhdGVGaWx0ZXIoZSl9KSksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQW0oKSksMiZlJiZEbSgibWV0cmljTmFtZSIsbi5tZXRyaWNOYW1lKSgiZmlsdGVyIixuLmZpbHRlcikoImNoYXJ0RGF0YSIsVGgoMSw1LG4uY2hhcnREYXRhJCkpKCJ3aWR0aCIsVGgoMiw3LG4uY2hhcnRXaWR0aCQpKSgiY29sb3JTY2FsZSIsVGgoMyw5LG4ucnVuQ29sb3JTY2FsZSQpKX0sZGlyZWN0aXZlczpbWXl0XSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgocXl0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im5wbWktdmlvbGluLWZpbHRlciIsdGVtcGxhdGU6J1xuICAgIDx2aW9saW4tZmlsdGVyLWNvbXBvbmVudFxuICAgICAgW21ldHJpY05hbWVdPSJtZXRyaWNOYW1lIlxuICAgICAgW2ZpbHRlcl09ImZpbHRlciJcbiAgICAgIFtjaGFydERhdGFdPSJjaGFydERhdGEkIHwgYXN5bmMiXG4gICAgICBbd2lkdGhdPSJjaGFydFdpZHRoJCB8IGFzeW5jIlxuICAgICAgW2NvbG9yU2NhbGVdPSJydW5Db2xvclNjYWxlJCB8IGFzeW5jIlxuICAgICAgKG9uUmVtb3ZlKT0icmVtb3ZlTWV0cmljKCkiXG4gICAgICAob25VcGRhdGVGaWx0ZXIpPSJ1cGRhdGVGaWx0ZXIoJGV2ZW50KSJcbiAgICA+PC92aW9saW4tZmlsdGVyLWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLHttZXRyaWNOYW1lOlt7dHlwZTp4eX1dLGZpbHRlcjpbe3R5cGU6eHl9XX0pO2NsYXNzIEt5dHtjb25zdHJ1Y3Rvcigpe3RoaXMudG9nZ2xlU2lkZWJhckV4cGFuZGVkPW5ldyBMaH19S3l0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxLeXQpfSxLeXQuybVjbXA9dG8oe3R5cGU6S3l0LHNlbGVjdG9yczpbWyJ2aW9saW4tZmlsdGVycy1jb21wb25lbnQiXV0saW5wdXRzOntzaWRlYmFyRXhwYW5kZWQ6InNpZGViYXJFeHBhbmRlZCIsbWV0cmljRmlsdGVyczoibWV0cmljRmlsdGVycyJ9LG91dHB1dHM6e3RvZ2dsZVNpZGViYXJFeHBhbmRlZDoidG9nZ2xlU2lkZWJhckV4cGFuZGVkIn0sZGVjbHM6OSx2YXJzOjIsY29uc3RzOmZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSYmbmdJMThuQ2xvc3VyZU1vZGU/Z29vZy5nZXRNc2coIkV4cGFuZC9IaWRlIFNpZGViYXIiKTokbG9jYWxpemVgOkxhYmVsIGZvciBhIGJ1dHRvbiB0aGF0IGV4cGFuZHMvaGlkZXMgdGhlIHNpZGViYXIu4pCfNDhjMjk5MDNjZTg4MWFiNjEwODhmOGQ0OWQ4MjcyMDM3MTZhYWVkNOKQnzQ2NTg2MDI5OTE5NzAyNjAyMTU6RXhwYW5kL0hpZGUgU2lkZWJhcmAsW1sxLCJmaWx0ZXJzLXRvb2xiYXIiXSxbMSwiZmlsdGVycy10aXRsZSJdLFsxLCJzaWRlLXRvZ2dsZSJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsdCwzLCJjbGljayJdLFsic3ZnSWNvbiIsImNoZXZyb25fbGVmdF8yNHB4Il0sWzEsImZpbHRlcnMiXSxbMywibWV0cmljTmFtZSIsImZpbHRlciIsNCwibmdGb3IiLCJuZ0Zvck9mIl0sWyJjbGFzcyIsImZpbHRlcnMtaGludCIsNCwibmdJZiJdLFszLCJtZXRyaWNOYW1lIiwiZmlsdGVyIl0sWzEsImZpbHRlcnMtaGludCJdLFsxLCJmaWx0ZXJzLWhpbnQtdGV4dCJdXX0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImRpdiIsMCksUm0oMSwiaDMiLDEpLGt1KDIsIkFjdGl2ZSBGaWx0ZXJzIiksQW0oKSxSbSgzLCJkaXYiLDIpLFJtKDQsImJ1dHRvbiIsMyksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLnRvZ2dsZVNpZGViYXJFeHBhbmRlZC5lbWl0KCl9KSksVG0oNSwibWF0LWljb24iLDQpLEFtKCksQW0oKSxBbSgpLFJtKDYsImRpdiIsNSksUXAoNyxaeXQsMSwyLCJucG1pLXZpb2xpbi1maWx0ZXIiLDYpLEFtKCksUXAoOCxYeXQsMywwLCJkaXYiLDcpKSwyJmUmJihyYyg3KSxEbSgibmdGb3JPZiIsbi5tZXRyaWNGaWx0ZXJzKSxyYygxKSxEbSgibmdJZiIsMD09PW4ubWV0cmljRmlsdGVycy5sZW5ndGgpKX0sZGlyZWN0aXZlczpbWEgsRFcsbE0sZE0scXl0XSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47aGVpZ2h0OjEwMCV9LmZpbHRlcnMtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWI7ZGlzcGxheTpmbGV4O2hlaWdodDo0MnB4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO3BhZGRpbmc6MCAxMHB4fS5maWx0ZXJzLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmlubGluZTtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9LnNpZGUtdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci1yYWRpdXM6M3B4O2JvcmRlcjoxcHggc29saWQgI2ViZWJlYjtkaXNwbGF5OmZsZXg7aGVpZ2h0OjMwcHg7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDozMHB4fS5maWx0ZXJzW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdy15OmF1dG99LmZpbHRlcnMtaGludFtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtoZWlnaHQ6NDJweDtwYWRkaW5nOjAgMTZweH0uZmlsdGVycy1oaW50LXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoS3l0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InZpb2xpbi1maWx0ZXJzLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vdmlvbGluX2ZpbHRlcnNfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vdmlvbGluX2ZpbHRlcnNfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse3NpZGViYXJFeHBhbmRlZDpbe3R5cGU6eHl9XSxtZXRyaWNGaWx0ZXJzOlt7dHlwZTp4eX1dLHRvZ2dsZVNpZGViYXJFeHBhbmRlZDpbe3R5cGU6T3l9XX0pO2NsYXNzIEp5dHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5zaWRlYmFyRXhwYW5kZWQkPXRoaXMuc3RvcmUuc2VsZWN0KF9idCksdGhpcy5tZXRyaWNGaWx0ZXJzJD10aGlzLnN0b3JlLnNlbGVjdChnYnQpLnBpcGUoSXQoKHQ9Pk9iamVjdC5lbnRyaWVzKHQpKSkpfW9uVG9nZ2xlU2lkZWJhckV4cGFuZGVkKCl7dGhpcy5zdG9yZS5kaXNwYXRjaChXYnQoKSl9fWZ1bmN0aW9uIFF5dCh0LGUsbil7cmV0dXJuIHQubGVuZ3RoIT1lLmxlbmd0aD9uOmUubWFwKCgoZSxuKT0+ZS10W25dKSkubWFwKCh0PT5NYXRoLnBvdyh0LDIpKSkucmVkdWNlKCgodCxlKT0+dCtlKSwwKX1KeXQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEp5dCkoU20oSXcpKX0sSnl0Lsm1Y21wPXRvKHt0eXBlOkp5dCxzZWxlY3RvcnM6W1sibnBtaS12aW9saW4tZmlsdGVycyJdXSxkZWNsczozLHZhcnM6Nixjb25zdHM6W1szLCJzaWRlYmFyRXhwYW5kZWQiLCJtZXRyaWNGaWx0ZXJzIiwidG9nZ2xlU2lkZWJhckV4cGFuZGVkIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJ2aW9saW4tZmlsdGVycy1jb21wb25lbnQiLDApLFZtKCJ0b2dnbGVTaWRlYmFyRXhwYW5kZWQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25Ub2dnbGVTaWRlYmFyRXhwYW5kZWQoKX0pKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQW0oKSksMiZlJiZEbSgic2lkZWJhckV4cGFuZGVkIixUaCgxLDIsbi5zaWRlYmFyRXhwYW5kZWQkKSkoIm1ldHJpY0ZpbHRlcnMiLFRoKDIsNCxuLm1ldHJpY0ZpbHRlcnMkKSl9LGRpcmVjdGl2ZXM6W0t5dF0scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEp5dCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJucG1pLXZpb2xpbi1maWx0ZXJzIix0ZW1wbGF0ZTonXG4gICAgPHZpb2xpbi1maWx0ZXJzLWNvbXBvbmVudFxuICAgICAgW3NpZGViYXJFeHBhbmRlZF09InNpZGViYXJFeHBhbmRlZCQgfCBhc3luYyJcbiAgICAgIFttZXRyaWNGaWx0ZXJzXT0ibWV0cmljRmlsdGVycyQgfCBhc3luYyJcbiAgICAgICh0b2dnbGVTaWRlYmFyRXhwYW5kZWQpPSJvblRvZ2dsZVNpZGViYXJFeHBhbmRlZCgpIlxuICAgID48L3Zpb2xpbi1maWx0ZXJzLWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NvbnN0ICR5dD1bInRodW1iQ29udGFpbmVyIl0sdF90PVsidG9nZ2xlQmFyIl0sZV90PVsiaW5wdXQiXSxuX3Q9ZnVuY3Rpb24odCl7cmV0dXJue2VudGVyRHVyYXRpb246dH19LG9fdD1uZXcgR2EoIm1hdC1zbGlkZS10b2dnbGUtZGVmYXVsdC1vcHRpb25zIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTooKT0+KHtkaXNhYmxlVG9nZ2xlVmFsdWU6ITF9KX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KbGV0IGlfdD0wO2NvbnN0IGFfdD17cHJvdmlkZTpJVix1c2VFeGlzdGluZzpxZSgoKCk9PmxfdCkpLG11bHRpOiEwfTtjbGFzcyByX3R7Y29uc3RydWN0b3IodCxlKXt0aGlzLnNvdXJjZT10LHRoaXMuY2hlY2tlZD1lfX1jb25zdCBzX3Q9JEkoSkkoUUkoS0koY2xhc3N7Y29uc3RydWN0b3IodCl7dGhpcy5fZWxlbWVudFJlZj10fX0pKSkpO2NsYXNzIGxfdCBleHRlbmRzIHNfdHtjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSl7c3VwZXIodCksdGhpcy5fZm9jdXNNb25pdG9yPWUsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWY9bix0aGlzLmRlZmF1bHRzPWksdGhpcy5fb25DaGFuZ2U9dD0+e30sdGhpcy5fb25Ub3VjaGVkPSgpPT57fSx0aGlzLl91bmlxdWVJZD0ibWF0LXNsaWRlLXRvZ2dsZS0iKyArK2lfdCx0aGlzLl9yZXF1aXJlZD0hMSx0aGlzLl9jaGVja2VkPSExLHRoaXMubmFtZT1udWxsLHRoaXMuaWQ9dGhpcy5fdW5pcXVlSWQsdGhpcy5sYWJlbFBvc2l0aW9uPSJhZnRlciIsdGhpcy5hcmlhTGFiZWw9bnVsbCx0aGlzLmFyaWFMYWJlbGxlZGJ5PW51bGwsdGhpcy5jaGFuZ2U9bmV3IExoLHRoaXMudG9nZ2xlQ2hhbmdlPW5ldyBMaCx0aGlzLnRhYkluZGV4PXBhcnNlSW50KG8pfHwwLHRoaXMuY29sb3I9dGhpcy5kZWZhdWx0Q29sb3I9aS5jb2xvcnx8ImFjY2VudCIsdGhpcy5fbm9vcEFuaW1hdGlvbnM9Ik5vb3BBbmltYXRpb25zIj09PWF9Z2V0IHJlcXVpcmVkKCl7cmV0dXJuIHRoaXMuX3JlcXVpcmVkfXNldCByZXF1aXJlZCh0KXt0aGlzLl9yZXF1aXJlZD15eih0KX1nZXQgY2hlY2tlZCgpe3JldHVybiB0aGlzLl9jaGVja2VkfXNldCBjaGVja2VkKHQpe3RoaXMuX2NoZWNrZWQ9eXoodCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9Z2V0IGlucHV0SWQoKXtyZXR1cm5gJHt0aGlzLmlkfHx0aGlzLl91bmlxdWVJZH0taW5wdXRgfW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHRoaXMuX2VsZW1lbnRSZWYsITApLnN1YnNjcmliZSgodD0+eyJrZXlib2FyZCI9PT10fHwicHJvZ3JhbSI9PT10P3RoaXMuX2lucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk6dHx8UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKCk9PnRoaXMuX29uVG91Y2hlZCgpKSl9KSl9bmdPbkRlc3Ryb3koKXt0aGlzLl9mb2N1c01vbml0b3Iuc3RvcE1vbml0b3JpbmcodGhpcy5fZWxlbWVudFJlZil9X29uQ2hhbmdlRXZlbnQodCl7dC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLnRvZ2dsZUNoYW5nZS5lbWl0KCksdGhpcy5kZWZhdWx0cy5kaXNhYmxlVG9nZ2xlVmFsdWU/dGhpcy5faW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2hlY2tlZD10aGlzLmNoZWNrZWQ6KHRoaXMuY2hlY2tlZD10aGlzLl9pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5jaGVja2VkLHRoaXMuX2VtaXRDaGFuZ2VFdmVudCgpKX1fb25JbnB1dENsaWNrKHQpe3Quc3RvcFByb3BhZ2F0aW9uKCl9d3JpdGVWYWx1ZSh0KXt0aGlzLmNoZWNrZWQ9ISF0fXJlZ2lzdGVyT25DaGFuZ2UodCl7dGhpcy5fb25DaGFuZ2U9dH1yZWdpc3Rlck9uVG91Y2hlZCh0KXt0aGlzLl9vblRvdWNoZWQ9dH1zZXREaXNhYmxlZFN0YXRlKHQpe3RoaXMuZGlzYWJsZWQ9dCx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX1mb2N1cyh0LGUpe2U/dGhpcy5fZm9jdXNNb25pdG9yLmZvY3VzVmlhKHRoaXMuX2lucHV0RWxlbWVudCxlLHQpOnRoaXMuX2lucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKHQpfXRvZ2dsZSgpe3RoaXMuY2hlY2tlZD0hdGhpcy5jaGVja2VkLHRoaXMuX29uQ2hhbmdlKHRoaXMuY2hlY2tlZCl9X2VtaXRDaGFuZ2VFdmVudCgpe3RoaXMuX29uQ2hhbmdlKHRoaXMuY2hlY2tlZCksdGhpcy5jaGFuZ2UuZW1pdChuZXcgcl90KHRoaXMsdGhpcy5jaGVja2VkKSl9X29uTGFiZWxUZXh0Q2hhbmdlKCl7dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpfX1sX3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGxfdCkoU20oaGcpLFNtKFNJKSxTbShVZyksTmEoInRhYmluZGV4IiksU20ob190KSxTbShWUCw4KSl9LGxfdC7JtWNtcD10byh7dHlwZTpsX3Qsc2VsZWN0b3JzOltbIm1hdC1zbGlkZS10b2dnbGUiXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihRaCgkeXQsNSksUWgodF90LDUpLFFoKGVfdCw1KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5fdGh1bWJFbD10LmZpcnN0KSxKaCh0PXRiKCkpJiYobi5fdGh1bWJCYXJFbD10LmZpcnN0KSxKaCh0PXRiKCkpJiYobi5faW5wdXRFbGVtZW50PXQuZmlyc3QpfX0saG9zdEF0dHJzOlsxLCJtYXQtc2xpZGUtdG9nZ2xlIl0saG9zdFZhcnM6MTIsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJihUdSgiaWQiLG4uaWQpLGpwKCJ0YWJpbmRleCIsbi5kaXNhYmxlZD9udWxsOi0xKSgiYXJpYS1sYWJlbCIsbnVsbCkoImFyaWEtbGFiZWxsZWRieSIsbnVsbCkscHUoIm1hdC1jaGVja2VkIixuLmNoZWNrZWQpKCJtYXQtZGlzYWJsZWQiLG4uZGlzYWJsZWQpKCJtYXQtc2xpZGUtdG9nZ2xlLWxhYmVsLWJlZm9yZSIsImJlZm9yZSI9PW4ubGFiZWxQb3NpdGlvbikoIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIixuLl9ub29wQW5pbWF0aW9ucykpfSxpbnB1dHM6e2Rpc2FibGVkOiJkaXNhYmxlZCIsZGlzYWJsZVJpcHBsZToiZGlzYWJsZVJpcHBsZSIsY29sb3I6ImNvbG9yIix0YWJJbmRleDoidGFiSW5kZXgiLG5hbWU6Im5hbWUiLGlkOiJpZCIsbGFiZWxQb3NpdGlvbjoibGFiZWxQb3NpdGlvbiIsYXJpYUxhYmVsOlsiYXJpYS1sYWJlbCIsImFyaWFMYWJlbCJdLGFyaWFMYWJlbGxlZGJ5OlsiYXJpYS1sYWJlbGxlZGJ5IiwiYXJpYUxhYmVsbGVkYnkiXSxyZXF1aXJlZDoicmVxdWlyZWQiLGNoZWNrZWQ6ImNoZWNrZWQiLGFyaWFEZXNjcmliZWRieTpbImFyaWEtZGVzY3JpYmVkYnkiLCJhcmlhRGVzY3JpYmVkYnkiXX0sb3V0cHV0czp7Y2hhbmdlOiJjaGFuZ2UiLHRvZ2dsZUNoYW5nZToidG9nZ2xlQ2hhbmdlIn0sZXhwb3J0QXM6WyJtYXRTbGlkZVRvZ2dsZSJdLGZlYXR1cmVzOltwZyhbYV90XSkseHBdLG5nQ29udGVudFNlbGVjdG9yczpbIioiXSxkZWNsczoxNix2YXJzOjIwLGNvbnN0czpbWzEsIm1hdC1zbGlkZS10b2dnbGUtbGFiZWwiXSxbImxhYmVsIiwiIl0sWzEsIm1hdC1zbGlkZS10b2dnbGUtYmFyIl0sWyJ0b2dnbGVCYXIiLCIiXSxbInR5cGUiLCJjaGVja2JveCIsInJvbGUiLCJzd2l0Y2giLDEsIm1hdC1zbGlkZS10b2dnbGUtaW5wdXQiLCJjZGstdmlzdWFsbHktaGlkZGVuIiwzLCJpZCIsInJlcXVpcmVkIiwidGFiSW5kZXgiLCJjaGVja2VkIiwiZGlzYWJsZWQiLCJjaGFuZ2UiLCJjbGljayJdLFsiaW5wdXQiLCIiXSxbMSwibWF0LXNsaWRlLXRvZ2dsZS10aHVtYi1jb250YWluZXIiXSxbInRodW1iQ29udGFpbmVyIiwiIl0sWzEsIm1hdC1zbGlkZS10b2dnbGUtdGh1bWIiXSxbIm1hdC1yaXBwbGUiLCIiLDEsIm1hdC1zbGlkZS10b2dnbGUtcmlwcGxlIiwibWF0LWZvY3VzLWluZGljYXRvciIsMywibWF0UmlwcGxlVHJpZ2dlciIsIm1hdFJpcHBsZURpc2FibGVkIiwibWF0UmlwcGxlQ2VudGVyZWQiLCJtYXRSaXBwbGVSYWRpdXMiLCJtYXRSaXBwbGVBbmltYXRpb24iXSxbMSwibWF0LXJpcHBsZS1lbGVtZW50IiwibWF0LXNsaWRlLXRvZ2dsZS1wZXJzaXN0ZW50LXJpcHBsZSJdLFsxLCJtYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnQiLDMsImNka09ic2VydmVDb250ZW50Il0sWyJsYWJlbENvbnRlbnQiLCIiXSxbMiwiZGlzcGxheSIsIm5vbmUiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmKFptKCksUm0oMCwibGFiZWwiLDAsMSksUm0oMiwiZGl2IiwyLDMpLFJtKDQsImlucHV0Iiw0LDUpLFZtKCJjaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9vbkNoYW5nZUV2ZW50KGUpfSkpKCJjbGljayIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX29uSW5wdXRDbGljayhlKX0pKSxBbSgpLFJtKDYsImRpdiIsNiw3KSxUbSg4LCJkaXYiLDgpLFJtKDksImRpdiIsOSksVG0oMTAsImRpdiIsMTApLEFtKCksQW0oKSxBbSgpLFJtKDExLCJzcGFuIiwxMSwxMiksVm0oImNka09ic2VydmVDb250ZW50IiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9vbkxhYmVsVGV4dENoYW5nZSgpfSkpLFJtKDEzLCJzcGFuIiwxMyksa3UoMTQsIsKgIiksQW0oKSxYbSgxNSksQW0oKSxBbSgpKSwyJmUpe2NvbnN0IHQ9JHAoMSksZT0kcCgxMik7anAoImZvciIsbi5pbnB1dElkKSxyYygyKSxwdSgibWF0LXNsaWRlLXRvZ2dsZS1iYXItbm8tc2lkZS1tYXJnaW4iLCFlLnRleHRDb250ZW50fHwhZS50ZXh0Q29udGVudC50cmltKCkpLHJjKDIpLERtKCJpZCIsbi5pbnB1dElkKSgicmVxdWlyZWQiLG4ucmVxdWlyZWQpKCJ0YWJJbmRleCIsbi50YWJJbmRleCkoImNoZWNrZWQiLG4uY2hlY2tlZCkoImRpc2FibGVkIixuLmRpc2FibGVkKSxqcCgibmFtZSIsbi5uYW1lKSgiYXJpYS1jaGVja2VkIixuLmNoZWNrZWQudG9TdHJpbmcoKSkoImFyaWEtbGFiZWwiLG4uYXJpYUxhYmVsKSgiYXJpYS1sYWJlbGxlZGJ5IixuLmFyaWFMYWJlbGxlZGJ5KSgiYXJpYS1kZXNjcmliZWRieSIsbi5hcmlhRGVzY3JpYmVkYnkpLHJjKDUpLERtKCJtYXRSaXBwbGVUcmlnZ2VyIix0KSgibWF0UmlwcGxlRGlzYWJsZWQiLG4uZGlzYWJsZVJpcHBsZXx8bi5kaXNhYmxlZCkoIm1hdFJpcHBsZUNlbnRlcmVkIiwhMCkoIm1hdFJpcHBsZVJhZGl1cyIsMjApKCJtYXRSaXBwbGVBbmltYXRpb24iLE1oKDE4LG5fdCxuLl9ub29wQW5pbWF0aW9ucz8wOjE1MCkpfX0sZGlyZWN0aXZlczpba0gsanpdLHN0eWxlczpbIi5tYXQtc2xpZGUtdG9nZ2xle2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDoyNHB4O21heC13aWR0aDoxMDAlO2xpbmUtaGVpZ2h0OjI0cHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWItY29udGFpbmVye3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxNnB4LCAwLCAwKX1bZGlyPXJ0bF0gLm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWItY29udGFpbmVye3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTZweCwgMCwgMCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWRpc2FibGVke29wYWNpdHk6LjM4fS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1kaXNhYmxlZCAubWF0LXNsaWRlLXRvZ2dsZS1sYWJlbCwubWF0LXNsaWRlLXRvZ2dsZS5tYXQtZGlzYWJsZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWItY29udGFpbmVye2N1cnNvcjpkZWZhdWx0fS5tYXQtc2xpZGUtdG9nZ2xlLWxhYmVsey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtkaXNwbGF5OmZsZXg7ZmxleDoxO2ZsZXgtZGlyZWN0aW9uOnJvdzthbGlnbi1pdGVtczpjZW50ZXI7aGVpZ2h0OmluaGVyaXQ7Y3Vyc29yOnBvaW50ZXJ9Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudHt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9Lm1hdC1zbGlkZS10b2dnbGUtbGFiZWwtYmVmb3JlIC5tYXQtc2xpZGUtdG9nZ2xlLWxhYmVse29yZGVyOjF9Lm1hdC1zbGlkZS10b2dnbGUtbGFiZWwtYmVmb3JlIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcntvcmRlcjoyfVtkaXI9cnRsXSAubWF0LXNsaWRlLXRvZ2dsZS1sYWJlbC1iZWZvcmUgLm1hdC1zbGlkZS10b2dnbGUtYmFyLC5tYXQtc2xpZGUtdG9nZ2xlLWJhcnttYXJnaW4tcmlnaHQ6OHB4O21hcmdpbi1sZWZ0OjB9W2Rpcj1ydGxdIC5tYXQtc2xpZGUtdG9nZ2xlLWJhciwubWF0LXNsaWRlLXRvZ2dsZS1sYWJlbC1iZWZvcmUgLm1hdC1zbGlkZS10b2dnbGUtYmFye21hcmdpbi1sZWZ0OjhweDttYXJnaW4tcmlnaHQ6MH0ubWF0LXNsaWRlLXRvZ2dsZS1iYXItbm8tc2lkZS1tYXJnaW57bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MH0ubWF0LXNsaWRlLXRvZ2dsZS10aHVtYi1jb250YWluZXJ7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxO3dpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7dG9wOi0zcHg7bGVmdDowO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLCAwLCAwKTt0cmFuc2l0aW9uOmFsbCA4MG1zIGxpbmVhcjt0cmFuc2l0aW9uLXByb3BlcnR5OnRyYW5zZm9ybX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWItY29udGFpbmVye3RyYW5zaXRpb246bm9uZX1bZGlyPXJ0bF0gLm1hdC1zbGlkZS10b2dnbGUtdGh1bWItY29udGFpbmVye2xlZnQ6YXV0bztyaWdodDowfS5tYXQtc2xpZGUtdG9nZ2xlLXRodW1ie2hlaWdodDoyMHB4O3dpZHRoOjIwcHg7Ym9yZGVyLXJhZGl1czo1MCV9Lm1hdC1zbGlkZS10b2dnbGUtYmFye3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjM2cHg7aGVpZ2h0OjE0cHg7ZmxleC1zaHJpbms6MDtib3JkZXItcmFkaXVzOjhweH0ubWF0LXNsaWRlLXRvZ2dsZS1pbnB1dHtib3R0b206MDtsZWZ0OjEwcHh9W2Rpcj1ydGxdIC5tYXQtc2xpZGUtdG9nZ2xlLWlucHV0e2xlZnQ6YXV0bztyaWdodDoxMHB4fS5tYXQtc2xpZGUtdG9nZ2xlLWJhciwubWF0LXNsaWRlLXRvZ2dsZS10aHVtYnt0cmFuc2l0aW9uOmFsbCA4MG1zIGxpbmVhcjt0cmFuc2l0aW9uLXByb3BlcnR5OmJhY2tncm91bmQtY29sb3I7dHJhbnNpdGlvbi1kZWxheTo1MG1zfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlLXRvZ2dsZS1iYXIsLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1ie3RyYW5zaXRpb246bm9uZX0ubWF0LXNsaWRlLXRvZ2dsZSAubWF0LXNsaWRlLXRvZ2dsZS1yaXBwbGV7cG9zaXRpb246YWJzb2x1dGU7dG9wOmNhbGMoNTAlIC0gMjBweCk7bGVmdDpjYWxjKDUwJSAtIDIwcHgpO2hlaWdodDo0MHB4O3dpZHRoOjQwcHg7ei1pbmRleDoxO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1hdC1zbGlkZS10b2dnbGUgLm1hdC1zbGlkZS10b2dnbGUtcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQ6bm90KC5tYXQtc2xpZGUtdG9nZ2xlLXBlcnNpc3RlbnQtcmlwcGxlKXtvcGFjaXR5Oi4xMn0ubWF0LXNsaWRlLXRvZ2dsZS1wZXJzaXN0ZW50LXJpcHBsZXt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3RyYW5zZm9ybTpub25lfS5tYXQtc2xpZGUtdG9nZ2xlLWJhcjpob3ZlciAubWF0LXNsaWRlLXRvZ2dsZS1wZXJzaXN0ZW50LXJpcHBsZXtvcGFjaXR5Oi4wNH0ubWF0LXNsaWRlLXRvZ2dsZTpub3QoLm1hdC1kaXNhYmxlZCkuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1zbGlkZS10b2dnbGUtcGVyc2lzdGVudC1yaXBwbGV7b3BhY2l0eTouMTJ9Lm1hdC1zbGlkZS10b2dnbGUtcGVyc2lzdGVudC1yaXBwbGUsLm1hdC1zbGlkZS10b2dnbGUubWF0LWRpc2FibGVkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcjpob3ZlciAubWF0LXNsaWRlLXRvZ2dsZS1wZXJzaXN0ZW50LXJpcHBsZXtvcGFjaXR5OjB9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LXNsaWRlLXRvZ2dsZS1iYXI6aG92ZXIgLm1hdC1zbGlkZS10b2dnbGUtcGVyc2lzdGVudC1yaXBwbGV7ZGlzcGxheTpub25lfX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JvcmRlcjoxcHggc29saWR9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNsaWRlLXRvZ2dsZS5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7b3V0bGluZToycHggZG90dGVkO291dGxpbmUtb2Zmc2V0OjVweH1cbiJdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLGxfdC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpTSX0se3R5cGU6VWd9LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpqYSxhcmdzOlsidGFiaW5kZXgiXX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbb190XX1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV0sbF90LnByb3BEZWNvcmF0b3JzPXtfdGh1bWJFbDpbe3R5cGU6WmEsYXJnczpbInRodW1iQ29udGFpbmVyIl19XSxfdGh1bWJCYXJFbDpbe3R5cGU6WmEsYXJnczpbInRvZ2dsZUJhciJdfV0sbmFtZTpbe3R5cGU6eHl9XSxpZDpbe3R5cGU6eHl9XSxsYWJlbFBvc2l0aW9uOlt7dHlwZTp4eX1dLGFyaWFMYWJlbDpbe3R5cGU6eHksYXJnczpbImFyaWEtbGFiZWwiXX1dLGFyaWFMYWJlbGxlZGJ5Olt7dHlwZTp4eSxhcmdzOlsiYXJpYS1sYWJlbGxlZGJ5Il19XSxhcmlhRGVzY3JpYmVkYnk6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWRlc2NyaWJlZGJ5Il19XSxyZXF1aXJlZDpbe3R5cGU6eHl9XSxjaGVja2VkOlt7dHlwZTp4eX1dLGNoYW5nZTpbe3R5cGU6T3l9XSx0b2dnbGVDaGFuZ2U6W3t0eXBlOk95fV0sX2lucHV0RWxlbWVudDpbe3R5cGU6WmEsYXJnczpbImlucHV0Il19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChsX3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWF0LXNsaWRlLXRvZ2dsZSIsZXhwb3J0QXM6Im1hdFNsaWRlVG9nZ2xlIixob3N0OntjbGFzczoibWF0LXNsaWRlLXRvZ2dsZSIsIltpZF0iOiJpZCIsIlthdHRyLnRhYmluZGV4XSI6ImRpc2FibGVkID8gbnVsbCA6IC0xIiwiW2F0dHIuYXJpYS1sYWJlbF0iOiJudWxsIiwiW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XSI6Im51bGwiLCJbY2xhc3MubWF0LWNoZWNrZWRdIjoiY2hlY2tlZCIsIltjbGFzcy5tYXQtZGlzYWJsZWRdIjoiZGlzYWJsZWQiLCJbY2xhc3MubWF0LXNsaWRlLXRvZ2dsZS1sYWJlbC1iZWZvcmVdIjonbGFiZWxQb3NpdGlvbiA9PSAiYmVmb3JlIicsIltjbGFzcy5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZV0iOiJfbm9vcEFuaW1hdGlvbnMifSx0ZW1wbGF0ZTonPGxhYmVsIFthdHRyLmZvcl09ImlucHV0SWQiIGNsYXNzPSJtYXQtc2xpZGUtdG9nZ2xlLWxhYmVsIiAjbGFiZWw+XG4gIDxkaXYgI3RvZ2dsZUJhciBjbGFzcz0ibWF0LXNsaWRlLXRvZ2dsZS1iYXIiXG4gICAgICAgW2NsYXNzLm1hdC1zbGlkZS10b2dnbGUtYmFyLW5vLXNpZGUtbWFyZ2luXT0iIWxhYmVsQ29udGVudC50ZXh0Q29udGVudCB8fCAhbGFiZWxDb250ZW50LnRleHRDb250ZW50LnRyaW0oKSI+XG5cbiAgICA8aW5wdXQgI2lucHV0IGNsYXNzPSJtYXQtc2xpZGUtdG9nZ2xlLWlucHV0IGNkay12aXN1YWxseS1oaWRkZW4iIHR5cGU9ImNoZWNrYm94IlxuICAgICAgICAgICByb2xlPSJzd2l0Y2giXG4gICAgICAgICAgIFtpZF09ImlucHV0SWQiXG4gICAgICAgICAgIFtyZXF1aXJlZF09InJlcXVpcmVkIlxuICAgICAgICAgICBbdGFiSW5kZXhdPSJ0YWJJbmRleCJcbiAgICAgICAgICAgW2NoZWNrZWRdPSJjaGVja2VkIlxuICAgICAgICAgICBbZGlzYWJsZWRdPSJkaXNhYmxlZCJcbiAgICAgICAgICAgW2F0dHIubmFtZV09Im5hbWUiXG4gICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09ImNoZWNrZWQudG9TdHJpbmcoKSJcbiAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09ImFyaWFMYWJlbCJcbiAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT0iYXJpYUxhYmVsbGVkYnkiXG4gICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPSJhcmlhRGVzY3JpYmVkYnkiXG4gICAgICAgICAgIChjaGFuZ2UpPSJfb25DaGFuZ2VFdmVudCgkZXZlbnQpIlxuICAgICAgICAgICAoY2xpY2spPSJfb25JbnB1dENsaWNrKCRldmVudCkiPlxuXG4gICAgPGRpdiBjbGFzcz0ibWF0LXNsaWRlLXRvZ2dsZS10aHVtYi1jb250YWluZXIiICN0aHVtYkNvbnRhaW5lcj5cbiAgICAgIDxkaXYgY2xhc3M9Im1hdC1zbGlkZS10b2dnbGUtdGh1bWIiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz0ibWF0LXNsaWRlLXRvZ2dsZS1yaXBwbGUgbWF0LWZvY3VzLWluZGljYXRvciIgbWF0LXJpcHBsZVxuICAgICAgICAgICBbbWF0UmlwcGxlVHJpZ2dlcl09ImxhYmVsIlxuICAgICAgICAgICBbbWF0UmlwcGxlRGlzYWJsZWRdPSJkaXNhYmxlUmlwcGxlIHx8IGRpc2FibGVkIlxuICAgICAgICAgICBbbWF0UmlwcGxlQ2VudGVyZWRdPSJ0cnVlIlxuICAgICAgICAgICBbbWF0UmlwcGxlUmFkaXVzXT0iMjAiXG4gICAgICAgICAgIFttYXRSaXBwbGVBbmltYXRpb25dPSJ7ZW50ZXJEdXJhdGlvbjogX25vb3BBbmltYXRpb25zID8gMCA6IDE1MH0iPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9Im1hdC1yaXBwbGUtZWxlbWVudCBtYXQtc2xpZGUtdG9nZ2xlLXBlcnNpc3RlbnQtcmlwcGxlIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuXG4gIDxzcGFuIGNsYXNzPSJtYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnQiICNsYWJlbENvbnRlbnQgKGNka09ic2VydmVDb250ZW50KT0iX29uTGFiZWxUZXh0Q2hhbmdlKCkiPlxuICAgIFx4M2MhLS0gQWRkIGFuIGludmlzaWJsZSBzcGFuIHNvIEpBV1MgY2FuIHJlYWQgdGhlIGxhYmVsIC0tXHgzZVxuICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmUiPiZuYnNwOzwvc3Bhbj5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvc3Bhbj5cbjwvbGFiZWw+XG4nLHByb3ZpZGVyczpbYV90XSxpbnB1dHM6WyJkaXNhYmxlZCIsImRpc2FibGVSaXBwbGUiLCJjb2xvciIsInRhYkluZGV4Il0sZW5jYXBzdWxhdGlvbjpIbi5Ob25lLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2gsc3R5bGVzOlsiLm1hdC1zbGlkZS10b2dnbGV7ZGlzcGxheTppbmxpbmUtYmxvY2s7aGVpZ2h0OjI0cHg7bWF4LXdpZHRoOjEwMCU7bGluZS1oZWlnaHQ6MjRweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTpub25lOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYi1jb250YWluZXJ7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDE2cHgsIDAsIDApfVtkaXI9cnRsXSAubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYi1jb250YWluZXJ7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xNnB4LCAwLCAwKX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtZGlzYWJsZWR7b3BhY2l0eTouMzh9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWRpc2FibGVkIC5tYXQtc2xpZGUtdG9nZ2xlLWxhYmVsLC5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1kaXNhYmxlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYi1jb250YWluZXJ7Y3Vyc29yOmRlZmF1bHR9Lm1hdC1zbGlkZS10b2dnbGUtbGFiZWx7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2Rpc3BsYXk6ZmxleDtmbGV4OjE7ZmxleC1kaXJlY3Rpb246cm93O2FsaWduLWl0ZW1zOmNlbnRlcjtoZWlnaHQ6aW5oZXJpdDtjdXJzb3I6cG9pbnRlcn0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50e3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpc30ubWF0LXNsaWRlLXRvZ2dsZS1sYWJlbC1iZWZvcmUgLm1hdC1zbGlkZS10b2dnbGUtbGFiZWx7b3JkZXI6MX0ubWF0LXNsaWRlLXRvZ2dsZS1sYWJlbC1iZWZvcmUgLm1hdC1zbGlkZS10b2dnbGUtYmFye29yZGVyOjJ9W2Rpcj1ydGxdIC5tYXQtc2xpZGUtdG9nZ2xlLWxhYmVsLWJlZm9yZSAubWF0LXNsaWRlLXRvZ2dsZS1iYXIsLm1hdC1zbGlkZS10b2dnbGUtYmFye21hcmdpbi1yaWdodDo4cHg7bWFyZ2luLWxlZnQ6MH1bZGlyPXJ0bF0gLm1hdC1zbGlkZS10b2dnbGUtYmFyLC5tYXQtc2xpZGUtdG9nZ2xlLWxhYmVsLWJlZm9yZSAubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7bWFyZ2luLWxlZnQ6OHB4O21hcmdpbi1yaWdodDowfS5tYXQtc2xpZGUtdG9nZ2xlLWJhci1uby1zaWRlLW1hcmdpbnttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowfS5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iLWNvbnRhaW5lcntwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjE7d2lkdGg6MjBweDtoZWlnaHQ6MjBweDt0b3A6LTNweDtsZWZ0OjA7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApO3RyYW5zaXRpb246YWxsIDgwbXMgbGluZWFyO3RyYW5zaXRpb24tcHJvcGVydHk6dHJhbnNmb3JtfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYi1jb250YWluZXJ7dHJhbnNpdGlvbjpub25lfVtkaXI9cnRsXSAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYi1jb250YWluZXJ7bGVmdDphdXRvO3JpZ2h0OjB9Lm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7aGVpZ2h0OjIwcHg7d2lkdGg6MjBweDtib3JkZXItcmFkaXVzOjUwJX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MzZweDtoZWlnaHQ6MTRweDtmbGV4LXNocmluazowO2JvcmRlci1yYWRpdXM6OHB4fS5tYXQtc2xpZGUtdG9nZ2xlLWlucHV0e2JvdHRvbTowO2xlZnQ6MTBweH1bZGlyPXJ0bF0gLm1hdC1zbGlkZS10b2dnbGUtaW5wdXR7bGVmdDphdXRvO3JpZ2h0OjEwcHh9Lm1hdC1zbGlkZS10b2dnbGUtYmFyLC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1ie3RyYW5zaXRpb246YWxsIDgwbXMgbGluZWFyO3RyYW5zaXRpb24tcHJvcGVydHk6YmFja2dyb3VuZC1jb2xvcjt0cmFuc2l0aW9uLWRlbGF5OjUwbXN9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGUtdG9nZ2xlLWJhciwuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7dHJhbnNpdGlvbjpub25lfS5tYXQtc2xpZGUtdG9nZ2xlIC5tYXQtc2xpZGUtdG9nZ2xlLXJpcHBsZXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6Y2FsYyg1MCUgLSAyMHB4KTtsZWZ0OmNhbGMoNTAlIC0gMjBweCk7aGVpZ2h0OjQwcHg7d2lkdGg6NDBweDt6LWluZGV4OjE7cG9pbnRlci1ldmVudHM6bm9uZX0ubWF0LXNsaWRlLXRvZ2dsZSAubWF0LXNsaWRlLXRvZ2dsZS1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudDpub3QoLm1hdC1zbGlkZS10b2dnbGUtcGVyc2lzdGVudC1yaXBwbGUpe29wYWNpdHk6LjEyfS5tYXQtc2xpZGUtdG9nZ2xlLXBlcnNpc3RlbnQtcmlwcGxle3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7dHJhbnNmb3JtOm5vbmV9Lm1hdC1zbGlkZS10b2dnbGUtYmFyOmhvdmVyIC5tYXQtc2xpZGUtdG9nZ2xlLXBlcnNpc3RlbnQtcmlwcGxle29wYWNpdHk6LjA0fS5tYXQtc2xpZGUtdG9nZ2xlOm5vdCgubWF0LWRpc2FibGVkKS5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LXNsaWRlLXRvZ2dsZS1wZXJzaXN0ZW50LXJpcHBsZXtvcGFjaXR5Oi4xMn0ubWF0LXNsaWRlLXRvZ2dsZS1wZXJzaXN0ZW50LXJpcHBsZSwubWF0LXNsaWRlLXRvZ2dsZS5tYXQtZGlzYWJsZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFyOmhvdmVyIC5tYXQtc2xpZGUtdG9nZ2xlLXBlcnNpc3RlbnQtcmlwcGxle29wYWNpdHk6MH1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtc2xpZGUtdG9nZ2xlLWJhcjpob3ZlciAubWF0LXNsaWRlLXRvZ2dsZS1wZXJzaXN0ZW50LXJpcHBsZXtkaXNwbGF5Om5vbmV9fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWIsLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7Ym9yZGVyOjFweCBzb2xpZH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc2xpZGUtdG9nZ2xlLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcntvdXRsaW5lOjJweCBkb3R0ZWQ7b3V0bGluZS1vZmZzZXQ6NXB4fVxuIl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6U0l9LHt0eXBlOlVnfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6amEsYXJnczpbInRhYmluZGV4Il19XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W29fdF19XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dfSkse25hbWU6W3t0eXBlOnh5fV0saWQ6W3t0eXBlOnh5fV0sbGFiZWxQb3NpdGlvbjpbe3R5cGU6eHl9XSxhcmlhTGFiZWw6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsIl19XSxhcmlhTGFiZWxsZWRieTpbe3R5cGU6eHksYXJnczpbImFyaWEtbGFiZWxsZWRieSJdfV0sY2hhbmdlOlt7dHlwZTpPeX1dLHRvZ2dsZUNoYW5nZTpbe3R5cGU6T3l9XSxyZXF1aXJlZDpbe3R5cGU6eHl9XSxjaGVja2VkOlt7dHlwZTp4eX1dLF90aHVtYkVsOlt7dHlwZTpaYSxhcmdzOlsidGh1bWJDb250YWluZXIiXX1dLF90aHVtYkJhckVsOlt7dHlwZTpaYSxhcmdzOlsidG9nZ2xlQmFyIl19XSxhcmlhRGVzY3JpYmVkYnk6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWRlc2NyaWJlZGJ5Il19XSxfaW5wdXRFbGVtZW50Olt7dHlwZTpaYSxhcmdzOlsiaW5wdXQiXX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBjX3Q9e3Byb3ZpZGU6R1YsdXNlRXhpc3Rpbmc6cWUoKCgpPT5kX3QpKSxtdWx0aTohMH07Y2xhc3MgZF90IGV4dGVuZHMgS1V7fWRfdC7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoZF90KSkpKG58fGRfdCl9fSkoKSxkX3QuybVkaXI9bG8oe3R5cGU6ZF90LHNlbGVjdG9yczpbWyJtYXQtc2xpZGUtdG9nZ2xlIiwicmVxdWlyZWQiLCIiLCJmb3JtQ29udHJvbE5hbWUiLCIiXSxbIm1hdC1zbGlkZS10b2dnbGUiLCJyZXF1aXJlZCIsIiIsImZvcm1Db250cm9sIiwiIl0sWyJtYXQtc2xpZGUtdG9nZ2xlIiwicmVxdWlyZWQiLCIiLCJuZ01vZGVsIiwiIl1dLGZlYXR1cmVzOltwZyhbY190XSkseHBdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChkX3QsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoibWF0LXNsaWRlLXRvZ2dsZVtyZXF1aXJlZF1bZm9ybUNvbnRyb2xOYW1lXSxcbiAgICAgICAgICAgICBtYXQtc2xpZGUtdG9nZ2xlW3JlcXVpcmVkXVtmb3JtQ29udHJvbF0sIG1hdC1zbGlkZS10b2dnbGVbcmVxdWlyZWRdW25nTW9kZWxdIixwcm92aWRlcnM6W2NfdF19XX1dLG51bGwsbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBwX3R7fXBfdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8cF90KX0scF90Lsm1bW9kPWFvKHt0eXBlOnBfdH0pLHBfdC7JtWluaj12bih7fSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChwX3QsW3t0eXBlOkF5LGFyZ3M6W3tleHBvcnRzOltkX3RdLGRlY2xhcmF0aW9uczpbZF90XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKHBfdCx7ZGVjbGFyYXRpb25zOltkX3RdLGV4cG9ydHM6W2RfdF19KTtjbGFzcyBtX3R7fWZ1bmN0aW9uIHVfdCh0LGUpezEmdCYmVG0oMCwibWF0LWljb24iLDMpfW1fdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bV90KX0sbV90Lsm1bW9kPWFvKHt0eXBlOm1fdH0pLG1fdC7JtWluaj12bih7aW1wb3J0czpbW3BfdCxTSCxYSSxVel0scF90LFhJXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobV90LFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbcF90LFNILFhJLFV6XSxleHBvcnRzOltwX3QsbF90LFhJXSxkZWNsYXJhdGlvbnM6W2xfdF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhtX3Qse2RlY2xhcmF0aW9uczpmdW5jdGlvbigpe3JldHVybltsX3RdfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW3BfdCxTSCxYSSxVel19LGV4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bcF90LGxfdCxYSV19fSk7Y2xhc3MgZl90e2NvbnN0cnVjdG9yKCl7dGhpcy5vblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2U9bmV3IExofX1mX3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGZfdCl9LGZfdC7JtWNtcD10byh7dHlwZTpmX3Qsc2VsZWN0b3JzOltbIm5wbWktYW5ub3RhdGlvbnMtc2VhcmNoLWNvbXBvbmVudCJdXSxob3N0VmFyczoyLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZwdSgidmFsaWQiLG4uaXNSZWdleEZpbHRlclZhbGlkKX0saW5wdXRzOntyZWdleEZpbHRlclZhbHVlOiJyZWdleEZpbHRlclZhbHVlIixpc1JlZ2V4RmlsdGVyVmFsaWQ6ImlzUmVnZXhGaWx0ZXJWYWxpZCJ9LG91dHB1dHM6e29uUmVnZXhGaWx0ZXJWYWx1ZUNoYW5nZToib25SZWdleEZpbHRlclZhbHVlQ2hhbmdlIn0sZGVjbHM6Myx2YXJzOjIsY29uc3RzOltbInN2Z0ljb24iLCJzZWFyY2hfMjRweCJdLFsiYXV0b2NvbXBsZXRlIiwib2ZmIiwicGxhY2Vob2xkZXIiLCJGaWx0ZXIgQW5ub3RhdGlvbnMiLDMsInZhbHVlIiwiaW5wdXQiXSxbInN2Z0ljb24iLCJlcnJvcl8yNHB4IiwiY2xhc3MiLCJlcnJvci1pY29uIiwibWF0VG9vbHRpcCIsIkludmFsaWQgcmVnZXggZmlsdGVyLiBUaGUgcmVzdWx0IG1heSBiZSBzdGFsZS4iLDQsIm5nSWYiXSxbInN2Z0ljb24iLCJlcnJvcl8yNHB4IiwibWF0VG9vbHRpcCIsIkludmFsaWQgcmVnZXggZmlsdGVyLiBUaGUgcmVzdWx0IG1heSBiZSBzdGFsZS4iLDEsImVycm9yLWljb24iXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFRtKDAsIm1hdC1pY29uIiwwKSxSbSgxLCJpbnB1dCIsMSksVm0oImlucHV0IiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UuZW1pdChlLnRhcmdldC52YWx1ZSl9KSksQW0oKSxRcCgyLHVfdCwxLDAsIm1hdC1pY29uIiwyKSksMiZlJiYocmMoMSksRG0oInZhbHVlIixuLnJlZ2V4RmlsdGVyVmFsdWUpLHJjKDEpLERtKCJuZ0lmIiwhbi5pc1JlZ2V4RmlsdGVyVmFsaWQpKX0sZGlyZWN0aXZlczpbRFcsZE1dLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV06bm90KC52YWxpZCl7Y29sb3I6I2M2MjgyOH1bX25naG9zdC0lQ09NUCVdOm5vdCgudmFsaWQpICAgaW5wdXRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOmN1cnJlbnRDb2xvcn1bX25naG9zdC0lQ09NUCVdOm5vdCgudmFsaWQpICAgLmVycm9yLWljb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNjNjI4Mjg7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MH0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZl90LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im5wbWktYW5ub3RhdGlvbnMtc2VhcmNoLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vYW5ub3RhdGlvbnNfc2VhcmNoX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyIuL2Fubm90YXRpb25zX3NlYXJjaF9jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7cmVnZXhGaWx0ZXJWYWx1ZTpbe3R5cGU6eHl9XSxvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2U6W3t0eXBlOk95fV0saXNSZWdleEZpbHRlclZhbGlkOlt7dHlwZTpQeSxhcmdzOlsiY2xhc3MudmFsaWQiXX0se3R5cGU6eHl9XX0pO2NsYXNzIGdfdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5hbm5vdGF0aW9uc0ZpbHRlciQ9dGhpcy5zdG9yZS5zZWxlY3QobWJ0KSx0aGlzLmlzQW5ub3RhdGlvbnNGaWx0ZXJWYWxpZCQ9dGhpcy5hbm5vdGF0aW9uc0ZpbHRlciQucGlwZShJdCgodD0+e3RyeXtyZXR1cm4gbmV3IFJlZ0V4cCh0KSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KSkpfWZpbHRlckNoYW5nZSh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKElidCh7cmVnZXg6dH0pKX19ZnVuY3Rpb24gaF90KHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Tm0oMCksUm0oMSwiYnV0dG9uIiw1KSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7aGkodCk7Y29uc3Qgbj1ZbSgpO3JldHVybiBuLm9uRmxhZ0Fubm90YXRpb25zLmVtaXQobi5zZWxlY3RlZEFubm90YXRpb25zKX0pKSxUbSgyLCJtYXQtaWNvbiIsNiksQW0oKSxSbSgzLCJidXR0b24iLDcpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUoKXtoaSh0KTtjb25zdCBuPVltKCk7cmV0dXJuIG4ub25IaWRlQW5ub3RhdGlvbnMuZW1pdChuLnNlbGVjdGVkQW5ub3RhdGlvbnMpfSkpLFRtKDQsIm1hdC1pY29uIiw4KSxBbSgpLHptKCl9aWYoMiZ0KXtjb25zdCB0PVltKCk7cmMoMSksRG0oImRpc2FibGVkIiwwPT09dC5zZWxlY3RlZEFubm90YXRpb25zLmxlbmd0aCkscmMoMiksRG0oImRpc2FibGVkIiwwPT09dC5zZWxlY3RlZEFubm90YXRpb25zLmxlbmd0aCl9fWZ1bmN0aW9uIGJfdCh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO05tKDApLFJtKDEsIm1hdC1zbGlkZS10b2dnbGUiLDkpLFZtKCJjaGFuZ2UiLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLFltKCkub25Ub2dnbGVTaG93Q291bnRzLmVtaXQoKX0pKSxrdSgyLCIgU2FtcGxlIENvdW50ICIpLEFtKCksUm0oMywibWF0LXNsaWRlLXRvZ2dsZSIsMTApLFZtKCJjaGFuZ2UiLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLFltKCkub25Ub2dnbGVTaG93SGlkZGVuLmVtaXQoKX0pKSxrdSg0LCIgU2hvdyBIaWRkZW4gIiksQW0oKSxUbSg1LCJucG1pLWFubm90YXRpb25zLXNlYXJjaCIpLHptKCl9aWYoMiZ0KXtjb25zdCB0PVltKCk7cmMoMSksRG0oImNoZWNrZWQiLHQuc2hvd0NvdW50cykscmMoMiksRG0oImNoZWNrZWQiLHQuc2hvd0hpZGRlbil9fWdfdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8Z190KShTbShJdykpfSxnX3QuybVjbXA9dG8oe3R5cGU6Z190LHNlbGVjdG9yczpbWyJucG1pLWFubm90YXRpb25zLXNlYXJjaCJdXSxkZWNsczozLHZhcnM6Nixjb25zdHM6W1szLCJyZWdleEZpbHRlclZhbHVlIiwiaXNSZWdleEZpbHRlclZhbGlkIiwib25SZWdleEZpbHRlclZhbHVlQ2hhbmdlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJucG1pLWFubm90YXRpb25zLXNlYXJjaC1jb21wb25lbnQiLDApLFZtKCJvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLmZpbHRlckNoYW5nZShlKX0pKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQW0oKSksMiZlJiZEbSgicmVnZXhGaWx0ZXJWYWx1ZSIsVGgoMSwyLG4uYW5ub3RhdGlvbnNGaWx0ZXIkKSkoImlzUmVnZXhGaWx0ZXJWYWxpZCIsVGgoMiw0LG4uaXNBbm5vdGF0aW9uc0ZpbHRlclZhbGlkJCkpfSxkaXJlY3RpdmVzOltmX3RdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChnX3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibnBtaS1hbm5vdGF0aW9ucy1zZWFyY2giLHRlbXBsYXRlOidcbiAgICA8bnBtaS1hbm5vdGF0aW9ucy1zZWFyY2gtY29tcG9uZW50XG4gICAgICBbcmVnZXhGaWx0ZXJWYWx1ZV09ImFubm90YXRpb25zRmlsdGVyJCB8IGFzeW5jIlxuICAgICAgW2lzUmVnZXhGaWx0ZXJWYWxpZF09ImlzQW5ub3RhdGlvbnNGaWx0ZXJWYWxpZCQgfCBhc3luYyJcbiAgICAgIChvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UpPSJmaWx0ZXJDaGFuZ2UoJGV2ZW50KSJcbiAgICA+PC9ucG1pLWFubm90YXRpb25zLXNlYXJjaC1jb21wb25lbnQ+XG4gICcsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSxudWxsKTtjbGFzcyB5X3R7Y29uc3RydWN0b3IoKXt0aGlzLm9uRmxhZ0Fubm90YXRpb25zPW5ldyBMaCx0aGlzLm9uSGlkZUFubm90YXRpb25zPW5ldyBMaCx0aGlzLm9uVG9nZ2xlRXhwYW5kZWQ9bmV3IExoLHRoaXMub25Ub2dnbGVTaG93Q291bnRzPW5ldyBMaCx0aGlzLm9uVG9nZ2xlU2hvd0hpZGRlbj1uZXcgTGh9fXlfdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8eV90KX0seV90Lsm1Y21wPXRvKHt0eXBlOnlfdCxzZWxlY3RvcnM6W1sibnBtaS1hbm5vdGF0aW9ucy1saXN0LXRvb2xiYXItY29tcG9uZW50Il1dLGlucHV0czp7bnVtQW5ub3RhdGlvbnM6Im51bUFubm90YXRpb25zIixleHBhbmRlZDoiZXhwYW5kZWQiLHNlbGVjdGVkQW5ub3RhdGlvbnM6InNlbGVjdGVkQW5ub3RhdGlvbnMiLGFubm90YXRpb25zRXhwYW5kZWQ6ImFubm90YXRpb25zRXhwYW5kZWQiLHNob3dDb3VudHM6InNob3dDb3VudHMiLHNob3dIaWRkZW46InNob3dIaWRkZW4ifSxvdXRwdXRzOntvbkZsYWdBbm5vdGF0aW9uczoib25GbGFnQW5ub3RhdGlvbnMiLG9uSGlkZUFubm90YXRpb25zOiJvbkhpZGVBbm5vdGF0aW9ucyIsb25Ub2dnbGVFeHBhbmRlZDoib25Ub2dnbGVFeHBhbmRlZCIsb25Ub2dnbGVTaG93Q291bnRzOiJvblRvZ2dsZVNob3dDb3VudHMiLG9uVG9nZ2xlU2hvd0hpZGRlbjoib25Ub2dnbGVTaG93SGlkZGVuIn0sZGVjbHM6Nyx2YXJzOjQsY29uc3RzOmZ1bmN0aW9uKCl7bGV0IHQsZSxuO3JldHVybiB0PSJ1bmRlZmluZWQiIT10eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUmJm5nSTE4bkNsb3N1cmVNb2RlP2dvb2cuZ2V0TXNnKCJIaWRlcy9TaG93cyB0aGUgQW5ub3RhdGlvbnMgTGlzdCIpOiRsb2NhbGl6ZWA6TGFiZWwgZm9yIGEgYnV0dG9uIHRoYXQgaGlkZXMvc2hvd3MgdGhlIGFubm90YXRpb25zIGxpc3Qu4pCfYjM2MDNiYTMzZTUzMDhkZDhjNWU4MDVlNTA4YjJmNzIzM2RmODlkNOKQnzczMzYzNzQ0MTMwNTYzNDI0OTI6SGlkZXMvU2hvd3MgdGhlIEFubm90YXRpb25zIExpc3RgLGU9InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSYmbmdJMThuQ2xvc3VyZU1vZGU/Z29vZy5nZXRNc2coIkZsYWcgU2VsZWN0ZWQgQW5ub3RhdGlvbnMiKTokbG9jYWxpemVgOkxhYmVsIGZvciBhIGJ1dHRvbiB0aGF0IGZsYWdzIHNlbGVjdGVkIGFubm90YXRpb25zLuKQnzU2OTJhZDg4MzEwMzhhOTBjNTg2M2ExZTlhZGY5NzQ4Y2FjM2NhZDjikJ8yMjQ0MDk5ODkxMzEzMzM2NTk1OkZsYWcgU2VsZWN0ZWQgQW5ub3RhdGlvbnNgLG49InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSYmbmdJMThuQ2xvc3VyZU1vZGU/Z29vZy5nZXRNc2coIkhpZGUgU2VsZWN0ZWQgQW5ub3RhdGlvbnMiKTokbG9jYWxpemVgOkxhYmVsIGZvciBhIGJ1dHRvbiB0aGF0IGhpZGVzIHNlbGVjdGVkIGFubm90YXRpb25zLuKQnzAzNDJjZGIzMzU4ZmE4ZTNmYTI3MjIwYTgyNThhNzI4NzQzMGI3MGbikJ81NDYyODMyMzkxMDkyMDg3NDg1OkhpZGUgU2VsZWN0ZWQgQW5ub3RhdGlvbnNgLFtbMSwiYW5ub3RhdGlvbnMtdGl0bGUtY29udGFpbmVyIl0sWzEsImFubm90YXRpb25zLXRpdGxlIl0sWzQsIm5nSWYiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLHQsMSwiZXhwYW5kLWJ1dHRvbiIsMywiY2xpY2siXSxbMywic3ZnSWNvbiJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsZSwidGl0bGUiLCJGbGFnZ2luZyBhbm5vdGF0aW9ucyBhZGRzIHRoZW0gdG8geW91ciBpbnZlc3RpZ2F0aW9uIHJlc3VsdHMsIHdoaWNoIGNhbiBsYXRlciBiZSBleHBvcnRlZC4iLDMsImRpc2FibGVkIiwiY2xpY2siXSxbInN2Z0ljb24iLCJmbGFnXzI0cHgiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLG4sInRpdGxlIiwiUmVtb3Zpbmcgbm9uLWNyaXRpY2FsIGFubm90YXRpb25zIHVuY2x1dHRlcnMgdGhlIHZpZXcuIFJlbW92ZWQgYW5ub3RhdGlvbnMgYXJlIHJlbW92ZWQgZnJvbSBhbGwgdmlzdWFsaXphdGlvbnMuIiwzLCJkaXNhYmxlZCIsImNsaWNrIl0sWyJzdmdJY29uIiwidmlzaWJpbGl0eV9vZmZfMjRweCJdLFsidGl0bGUiLCJIaWRlcyBhbmQgc2hvd3MgdGhlIHNhbXBsZSBjb3VudCB3aGVyZSBhcHBsaWNhYmxlIChob3cgbWFueSBzYW1wbGVzIGJlbG9uZyB0byBhIGNhdGVnb3J5KS4iLDEsInNob3ctdG9nZ2xlIiwzLCJjaGVja2VkIiwiY2hhbmdlIl0sWyJ0aXRsZSIsIkhpZGVzIGFuZCBzaG93cyBoaWRkZW4gYW5ub3RhdGlvbnMgaW4gYWxsIHZpc3VhbGl6YXRpb25zLiIsMSwic2hvdy10b2dnbGUiLDMsImNoZWNrZWQiLCJjaGFuZ2UiXV19LHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJkaXYiLDApLFJtKDEsImgzIiwxKSxrdSgyKSxBbSgpLFFwKDMsaF90LDUsMiwibmctY29udGFpbmVyIiwyKSxBbSgpLFFwKDQsYl90LDYsMiwibmctY29udGFpbmVyIiwyKSxSbSg1LCJidXR0b24iLDMpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblRvZ2dsZUV4cGFuZGVkLmVtaXQoKX0pKSxUbSg2LCJtYXQtaWNvbiIsNCksQW0oKSksMiZlJiYocmMoMiksRHUoIkFubm90YXRpb25zICgiLG4ubnVtQW5ub3RhdGlvbnMsIikiKSxyYygxKSxEbSgibmdJZiIsbi5leHBhbmRlZCkscmMoMSksRG0oIm5nSWYiLG4uZXhwYW5kZWQpLHJjKDIpLERtKCJzdmdJY29uIixuLmV4cGFuZGVkPyJleHBhbmRfbGVzc18yNHB4IjoiZXhwYW5kX21vcmVfMjRweCIpKX0sZGlyZWN0aXZlczpbZE0sWEgsRFcsbF90LGdfdF0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9W19uZ2hvc3QtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7cGFkZGluZzowIDE2cHg7d2lkdGg6MTAwJX0uYW5ub3RhdGlvbnMtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lO2ZvbnQtc2l6ZTouOWVtO2ZvbnQtd2VpZ2h0OjUwMDtwYWRkaW5nLXJpZ2h0OjEwcHh9LmFubm90YXRpb25zLXRpdGxlLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6bm93cmFwO2ZsZXg6MSAxO2hlaWdodDo0MnB4fS5zaG93LXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOi45ZW07bWFyZ2luLXJpZ2h0Oi44ZW19J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHlfdCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJucG1pLWFubm90YXRpb25zLWxpc3QtdG9vbGJhci1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiIuL2Fubm90YXRpb25zX2xpc3RfdG9vbGJhcl9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9hbm5vdGF0aW9uc19saXN0X3Rvb2xiYXJfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse251bUFubm90YXRpb25zOlt7dHlwZTp4eX1dLGV4cGFuZGVkOlt7dHlwZTp4eX1dLHNlbGVjdGVkQW5ub3RhdGlvbnM6W3t0eXBlOnh5fV0sYW5ub3RhdGlvbnNFeHBhbmRlZDpbe3R5cGU6eHl9XSxzaG93Q291bnRzOlt7dHlwZTp4eX1dLHNob3dIaWRkZW46W3t0eXBlOnh5fV0sb25GbGFnQW5ub3RhdGlvbnM6W3t0eXBlOk95fV0sb25IaWRlQW5ub3RhdGlvbnM6W3t0eXBlOk95fV0sb25Ub2dnbGVFeHBhbmRlZDpbe3R5cGU6T3l9XSxvblRvZ2dsZVNob3dDb3VudHM6W3t0eXBlOk95fV0sb25Ub2dnbGVTaG93SGlkZGVuOlt7dHlwZTpPeX1dfSk7Y2xhc3MgX190e2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLnNlbGVjdGVkQW5ub3RhdGlvbnMkPXRoaXMuc3RvcmUuc2VsZWN0KGNidCksdGhpcy5hbm5vdGF0aW9uc0V4cGFuZGVkJD10aGlzLnN0b3JlLnNlbGVjdCh5YnQpLHRoaXMuc2hvd0NvdW50cyQ9dGhpcy5zdG9yZS5zZWxlY3QoQ2J0KSx0aGlzLnNob3dIaWRkZW4kPXRoaXMuc3RvcmUuc2VsZWN0KE1idCksdGhpcy5hbm5vdGF0aW9uc0ZpbHRlciQ9dGhpcy5zdG9yZS5zZWxlY3QobWJ0KSx0aGlzLmlzQW5ub3RhdGlvbnNGaWx0ZXJWYWxpZCQ9dGhpcy5hbm5vdGF0aW9uc0ZpbHRlciQucGlwZShJdCgodD0+e3RyeXtyZXR1cm4gQm9vbGVhbihuZXcgUmVnRXhwKHQpKX1jYXRjaCh0KXtyZXR1cm4hMX19KSkpfWZpbHRlckNoYW5nZSh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKElidCh7cmVnZXg6dH0pKX1mbGFnQW5ub3RhdGlvbnModCl7dGhpcy5zdG9yZS5kaXNwYXRjaChOYnQoe2Fubm90YXRpb25zOnR9KSl9aGlkZUFubm90YXRpb25zKHQpe3RoaXMuc3RvcmUuZGlzcGF0Y2goemJ0KHthbm5vdGF0aW9uczp0fSkpfXRvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zdG9yZS5kaXNwYXRjaChHYnQoKSl9dG9nZ2xlU2hvd0NvdW50cygpe3RoaXMuc3RvcmUuZGlzcGF0Y2goWWJ0KCkpfXRvZ2dsZVNob3dIaWRkZW4oKXt0aGlzLnN0b3JlLmRpc3BhdGNoKHFidCgpKX19X190Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxfX3QpKFNtKEl3KSl9LF9fdC7JtWNtcD10byh7dHlwZTpfX3Qsc2VsZWN0b3JzOltbIm5wbWktYW5ub3RhdGlvbnMtbGlzdC10b29sYmFyIl1dLGlucHV0czp7bnVtQW5ub3RhdGlvbnM6Im51bUFubm90YXRpb25zIixleHBhbmRlZDoiZXhwYW5kZWQifSxkZWNsczo1LHZhcnM6MTQsY29uc3RzOltbMywibnVtQW5ub3RhdGlvbnMiLCJleHBhbmRlZCIsInNlbGVjdGVkQW5ub3RhdGlvbnMiLCJhbm5vdGF0aW9uc0V4cGFuZGVkIiwic2hvd0NvdW50cyIsInNob3dIaWRkZW4iLCJvbkZsYWdBbm5vdGF0aW9ucyIsIm9uSGlkZUFubm90YXRpb25zIiwib25Ub2dnbGVFeHBhbmRlZCIsIm9uVG9nZ2xlU2hvd0NvdW50cyIsIm9uVG9nZ2xlU2hvd0hpZGRlbiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwibnBtaS1hbm5vdGF0aW9ucy1saXN0LXRvb2xiYXItY29tcG9uZW50IiwwKSxWbSgib25GbGFnQW5ub3RhdGlvbnMiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLmZsYWdBbm5vdGF0aW9ucyhlKX0pKSgib25IaWRlQW5ub3RhdGlvbnMiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLmhpZGVBbm5vdGF0aW9ucyhlKX0pKSgib25Ub2dnbGVFeHBhbmRlZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi50b2dnbGVFeHBhbmRlZCgpfSkpKCJvblRvZ2dsZVNob3dDb3VudHMiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4udG9nZ2xlU2hvd0NvdW50cygpfSkpKCJvblRvZ2dsZVNob3dIaWRkZW4iLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4udG9nZ2xlU2hvd0hpZGRlbigpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBaCgzLCJhc3luYyIpLEFoKDQsImFzeW5jIiksQW0oKSksMiZlJiZEbSgibnVtQW5ub3RhdGlvbnMiLG4ubnVtQW5ub3RhdGlvbnMpKCJleHBhbmRlZCIsbi5leHBhbmRlZCkoInNlbGVjdGVkQW5ub3RhdGlvbnMiLFRoKDEsNixuLnNlbGVjdGVkQW5ub3RhdGlvbnMkKSkoImFubm90YXRpb25zRXhwYW5kZWQiLFRoKDIsOCxuLmFubm90YXRpb25zRXhwYW5kZWQkKSkoInNob3dDb3VudHMiLFRoKDMsMTAsbi5zaG93Q291bnRzJCkpKCJzaG93SGlkZGVuIixUaCg0LDEyLG4uc2hvd0hpZGRlbiQpKX0sZGlyZWN0aXZlczpbeV90XSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoX190LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im5wbWktYW5ub3RhdGlvbnMtbGlzdC10b29sYmFyIix0ZW1wbGF0ZTonXG4gICAgPG5wbWktYW5ub3RhdGlvbnMtbGlzdC10b29sYmFyLWNvbXBvbmVudFxuICAgICAgW251bUFubm90YXRpb25zXT0ibnVtQW5ub3RhdGlvbnMiXG4gICAgICBbZXhwYW5kZWRdPSJleHBhbmRlZCJcbiAgICAgIFtzZWxlY3RlZEFubm90YXRpb25zXT0ic2VsZWN0ZWRBbm5vdGF0aW9ucyQgfCBhc3luYyJcbiAgICAgIFthbm5vdGF0aW9uc0V4cGFuZGVkXT0iYW5ub3RhdGlvbnNFeHBhbmRlZCQgfCBhc3luYyJcbiAgICAgIFtzaG93Q291bnRzXT0ic2hvd0NvdW50cyQgfCBhc3luYyJcbiAgICAgIFtzaG93SGlkZGVuXT0ic2hvd0hpZGRlbiQgfCBhc3luYyJcbiAgICAgIChvbkZsYWdBbm5vdGF0aW9ucyk9ImZsYWdBbm5vdGF0aW9ucygkZXZlbnQpIlxuICAgICAgKG9uSGlkZUFubm90YXRpb25zKT0iaGlkZUFubm90YXRpb25zKCRldmVudCkiXG4gICAgICAob25Ub2dnbGVFeHBhbmRlZCk9InRvZ2dsZUV4cGFuZGVkKCkiXG4gICAgICAob25Ub2dnbGVTaG93Q291bnRzKT0idG9nZ2xlU2hvd0NvdW50cygpIlxuICAgICAgKG9uVG9nZ2xlU2hvd0hpZGRlbik9InRvZ2dsZVNob3dIaWRkZW4oKSJcbiAgICA+PC9ucG1pLWFubm90YXRpb25zLWxpc3QtdG9vbGJhci1jb21wb25lbnQ+XG4gICcsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSx7bnVtQW5ub3RhdGlvbnM6W3t0eXBlOnh5fV0sZXhwYW5kZWQ6W3t0eXBlOnh5fV19KTtjb25zdCBDX3Q9WyJnbHlwaCJdO2NsYXNzIE1fdHtuZ0FmdGVyVmlld0luaXQoKXt0aGlzLnN2Zz1KNCh0aGlzLmdseXBoU1ZHLm5hdGl2ZUVsZW1lbnQpLHRoaXMubWFpbkNvbnRhaW5lcj10aGlzLnN2Zy5hcHBlbmQoImciKSx0aGlzLmRyYXcoKX1kcmF3KCl7ImNpcmNsZSI9PXRoaXMuc2hhcGU/dGhpcy5tYWluQ29udGFpbmVyLmFwcGVuZCgiY2lyY2xlIikuYXR0cigiZmlsbCIsdGhpcy5jb2xvcikuYXR0cigic3Ryb2tlIiwiYmxhY2siKS5hdHRyKCJjeCIsNSkuYXR0cigiY3kiLDUpLmF0dHIoInIiLDUpOiJiYXIiPT10aGlzLnNoYXBlP3RoaXMubWFpbkNvbnRhaW5lci5hcHBlbmQoInJlY3QiKS5hdHRyKCJmaWxsIix0aGlzLmNvbG9yKS5hdHRyKCJ4IiwwKS5hdHRyKCJ5IiwwKS5hdHRyKCJ3aWR0aCIsMTApLmF0dHIoImhlaWdodCIsMTApOiJydW5JbmRpY2F0b3IiPT10aGlzLnNoYXBlJiZ0aGlzLm1haW5Db250YWluZXIuYXBwZW5kKCJnIikuYXBwZW5kKCJwYXRoIikuYXR0cigiZmlsbCIsdGhpcy5jb2xvcikuYXR0cigic3Ryb2tlIiwiYmxhY2siKS5hdHRyKCJkIiwiTSAyIDAgTCAxMCAwIEwgNyA1IEwgMTAgMTAgTCAyIDEwIFoiKX19TV90Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxNX3QpfSxNX3QuybVjbXA9dG8oe3R5cGU6TV90LHNlbGVjdG9yczpbWyJucG1pLWxlZ2VuZC1lbGVtZW50Il1dLHZpZXdRdWVyeTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiZRaChDX3QsNyxoZyksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5nbHlwaFNWRz10LmZpcnN0KX19LGlucHV0czp7dGV4dDoidGV4dCIsY29sb3I6ImNvbG9yIixzaGFwZToic2hhcGUifSxkZWNsczo0LHZhcnM6MSxjb25zdHM6W1sxLCJnbHlwaCJdLFsiZ2x5cGgiLCIiXSxbMSwibGVnZW5kLWVsZW1lbnQtdGl0bGUiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKHFpKCksVG0oMCwic3ZnIiwwLDEpLFppKCksUm0oMiwiZGl2IiwyKSxrdSgzKSxBbSgpKSwyJmUmJihyYygzKSxTdShuLnRleHQpKX0sc3R5bGVzOlsiW19uZ2hvc3QtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O3BhZGRpbmctcmlnaHQ6MTBweH0ubGVnZW5kLWVsZW1lbnQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTouOGVtO3BhZGRpbmctbGVmdDo1cHh9LmdseXBoW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMHB4O2hlaWdodDoxMHB4fSJdLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChNX3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibnBtaS1sZWdlbmQtZWxlbWVudCIsdGVtcGxhdGVVcmw6Ii4vbGVnZW5kX2VsZW1lbnRfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vbGVnZW5kX2VsZW1lbnRfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse3RleHQ6W3t0eXBlOnh5fV0sY29sb3I6W3t0eXBlOnh5fV0sc2hhcGU6W3t0eXBlOnh5fV0sZ2x5cGhTVkc6W3t0eXBlOlphLGFyZ3M6WyJnbHlwaCIse3N0YXRpYzohMCxyZWFkOmhnfV19XX0pO2NsYXNzIHZfdHt9ZnVuY3Rpb24geF90KHQsZSl7aWYoMSZ0JiZUbSgwLCJtYXQtaWNvbiIsOCksMiZ0KXtjb25zdCB0PVltKDIpO0RtKCJzdmdJY29uIix0LnNvcnQub3JkZXI9PT10LlNvcnRPcmRlci5ERVNDRU5ESU5HPyJhcnJvd19kb3dud2FyZF8yNHB4IjoiYXJyb3dfdXB3YXJkXzI0cHgiKSgibmdDbGFzcyIsdC5zb3J0Lm9yZGVyPT09dC5Tb3J0T3JkZXIuREVTQ0VORElORz8iZG93bi1pY29uIjoidXAtaWNvbiIpfX1mdW5jdGlvbiBPX3QodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDQpLFJtKDEsImRpdiIsNSksUm0oMiwiZGl2Iiw2KSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7Y29uc3Qgbj1oaSh0KS4kaW1wbGljaXQ7cmV0dXJuIFltKCkub25DaGFuZ2VTb3J0LmVtaXQobil9KSksa3UoMyksUXAoNCx4X3QsMSwyLCJtYXQtaWNvbiIsNyksQW0oKSxBbSgpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oKTtyYygzKSxEdSgiICIsbi5zdHJpcE1ldHJpYyh0KSwiICIpLHJjKDEpLERtKCJuZ0lmIix0PT09bi5zb3J0Lm1ldHJpYyl9fXZfdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8dl90KX0sdl90Lsm1Y21wPXRvKHt0eXBlOnZfdCxzZWxlY3RvcnM6W1sibnBtaS1hbm5vdGF0aW9ucy1saXN0LWxlZ2VuZCJdXSxkZWNsczo0LHZhcnM6MCxjb25zdHM6W1sidGV4dCIsInJ1biBpbmRpY2F0b3IiLCJjb2xvciIsInJnYigwLDAsMCkiLCJzaGFwZSIsInJ1bkluZGljYXRvciJdLFsidGV4dCIsInBvc2l0aXZlIGNvcnJlbGF0aW9uIiwiY29sb3IiLCJyZ2IoMTA5LCAxNzQsIDIxMykiLCJzaGFwZSIsImJhciJdLFsidGV4dCIsIm5lZ2F0aXZlIGNvcnJlbGF0aW9uIiwiY29sb3IiLCJyZ2IoMjQ5LCAxMDUsIDc2KSIsInNoYXBlIiwiYmFyIl0sWyJ0ZXh0Iiwic2FtcGxlIGNvdW50IiwiY29sb3IiLCJyZ2IoMTUxLCAxNTEsIDE1MSkiLCJzaGFwZSIsImNpcmNsZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwibnBtaS1sZWdlbmQtZWxlbWVudCIsMCksVG0oMSwibnBtaS1sZWdlbmQtZWxlbWVudCIsMSksVG0oMiwibnBtaS1sZWdlbmQtZWxlbWVudCIsMiksVG0oMywibnBtaS1sZWdlbmQtZWxlbWVudCIsMykpfSxkaXJlY3RpdmVzOltNX3RdLHN0eWxlczpbIltfbmdob3N0LSVDT01QJV17ZGlzcGxheTpmbGV4O3BhZGRpbmc6MCAxNnB4fSJdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh2X3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibnBtaS1hbm5vdGF0aW9ucy1saXN0LWxlZ2VuZCIsdGVtcGxhdGVVcmw6Ii4vbGVnZW5kX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyIuL2xlZ2VuZF9jb21wb25lbnQuY3NzIl19XX1dLG51bGwsbnVsbCk7Y2xhc3MgUF90e2NvbnN0cnVjdG9yKCl7dGhpcy5vbkNoYW5nZVNvcnQ9bmV3IExoLHRoaXMub25BbGxBbm5vdGF0aW9uc1RvZ2dsZWQ9bmV3IExoLHRoaXMuU29ydE9yZGVyPW5idH1zdHJpcE1ldHJpYyh0KXtyZXR1cm4gbnl0KHQpfX1QX3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFBfdCl9LFBfdC7JtWNtcD10byh7dHlwZTpQX3Qsc2VsZWN0b3JzOltbIm5wbWktYW5ub3RhdGlvbnMtbGlzdC1oZWFkZXItY29tcG9uZW50Il1dLGlucHV0czp7bnVtQW5ub3RhdGlvbnM6Im51bUFubm90YXRpb25zIixzZWxlY3RlZEFubm90YXRpb25zOiJzZWxlY3RlZEFubm90YXRpb25zIixhY3RpdmVNZXRyaWNzOiJhY3RpdmVNZXRyaWNzIixzb3J0OiJzb3J0In0sb3V0cHV0czp7b25DaGFuZ2VTb3J0OiJvbkNoYW5nZVNvcnQiLG9uQWxsQW5ub3RhdGlvbnNUb2dnbGVkOiJvbkFsbEFubm90YXRpb25zVG9nZ2xlZCJ9LGRlY2xzOjQsdmFyczoyLGNvbnN0czpbWzEsInRvZ2dsZS1hbGwtY29udGFpbmVyIl0sWzMsImNoZWNrZWQiLCJjaGFuZ2UiXSxbMSwiYW5ub3RhdGlvbnMtaGVhZGVyLWNvbnRhaW5lcnMiXSxbImNsYXNzIiwiaGVhZGVyLWNvbHVtbiIsNCwibmdGb3IiLCJuZ0Zvck9mIl0sWzEsImhlYWRlci1jb2x1bW4iXSxbMSwiaGVhZGVyLWNvbnRhaW5lciJdLFsidGFiaW5kZXgiLCIwIiwicm9sZSIsImJ1dHRvbiIsInRpdGxlIiwiQ2hhbmdlIHRoZSBzb3J0IGJ5IGNsaWNraW5nIGFueSBvZiB0aGUgbWV0cmljcy4iLDEsImhlYWRlci1jbGlja2FibGUiLDMsImNsaWNrIl0sWyJjbGFzcyIsInNvcnQtaWNvbiIsMywic3ZnSWNvbiIsIm5nQ2xhc3MiLDQsIm5nSWYiXSxbMSwic29ydC1pY29uIiwzLCJzdmdJY29uIiwibmdDbGFzcyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiZGl2IiwwKSxSbSgxLCJtYXQtY2hlY2tib3giLDEpLFZtKCJjaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uQWxsQW5ub3RhdGlvbnNUb2dnbGVkLmVtaXQoZS5jaGVja2VkKX0pKSxBbSgpLEFtKCksUm0oMiwiZGl2IiwyKSxRcCgzLE9fdCw1LDIsImRpdiIsMyksQW0oKSksMiZlJiYocmMoMSksRG0oImNoZWNrZWQiLG4uc2VsZWN0ZWRBbm5vdGF0aW9ucy5sZW5ndGg9PT1uLm51bUFubm90YXRpb25zKSxyYygyKSxEbSgibmdGb3JPZiIsbi5hY3RpdmVNZXRyaWNzKSl9LGRpcmVjdGl2ZXM6W09ZLGxNLGRNLERXLGFNXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2JvcmRlci1ib3R0b206MnB4IHNvbGlkICNlYmViZWI7ZGlzcGxheTpmbGV4O2hlaWdodDoyOHB4O2FsaWduLWl0ZW1zOmZsZXgtZW5kO21hcmdpbi10b3A6OHB4fS5hbm5vdGF0aW9ucy1oZWFkZXItY29udGFpbmVyc1tfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZvbnQtc2l6ZTouOWVtO2ZvbnQtd2VpZ2h0OjUwMDtmbGV4LWdyb3c6MX0uaGVhZGVyLWNvbHVtbltfbmdjb250ZW50LSVDT01QJV17ZmxleDoxIDF9LmhlYWRlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5oZWFkZXItY2xpY2thYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmZsZXg7b3V0bGluZTpub25lfS50b2dnbGUtYWxsLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6MTBweDt3aWR0aDo5MHB4fS5zb3J0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxNnB4fSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChQX3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibnBtaS1hbm5vdGF0aW9ucy1saXN0LWhlYWRlci1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiIuL2hlYWRlcl9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9oZWFkZXJfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse251bUFubm90YXRpb25zOlt7dHlwZTp4eX1dLHNlbGVjdGVkQW5ub3RhdGlvbnM6W3t0eXBlOnh5fV0sYWN0aXZlTWV0cmljczpbe3R5cGU6eHl9XSxzb3J0Olt7dHlwZTp4eX1dLG9uQ2hhbmdlU29ydDpbe3R5cGU6T3l9XSxvbkFsbEFubm90YXRpb25zVG9nZ2xlZDpbe3R5cGU6T3l9XX0pO2NsYXNzIHdfdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5zZWxlY3RlZEFubm90YXRpb25zJD10aGlzLnN0b3JlLnNlbGVjdChjYnQpLHRoaXMuYW5ub3RhdGlvblNvcnQkPXRoaXMuc3RvcmUuc2VsZWN0KGhidCl9Y2hhbmdlU29ydCh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKFZidCh7bWV0cmljOnR9KSl9YWxsQW5ub3RhdGlvbnNUb2dnbGVkKHQpe3RoaXMuc3RvcmUuZGlzcGF0Y2goQWJ0KHQ/e2Fubm90YXRpb25zOk9iamVjdC5rZXlzKHRoaXMuYW5ub3RhdGlvbnMpfTp7YW5ub3RhdGlvbnM6W119KSl9fXdfdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8d190KShTbShJdykpfSx3X3QuybVjbXA9dG8oe3R5cGU6d190LHNlbGVjdG9yczpbWyJucG1pLWFubm90YXRpb25zLWxpc3QtaGVhZGVyIl1dLGlucHV0czp7bnVtQW5ub3RhdGlvbnM6Im51bUFubm90YXRpb25zIixhbm5vdGF0aW9uczoiYW5ub3RhdGlvbnMiLGFjdGl2ZU1ldHJpY3M6ImFjdGl2ZU1ldHJpY3MifSxkZWNsczozLHZhcnM6OCxjb25zdHM6W1szLCJudW1Bbm5vdGF0aW9ucyIsInNlbGVjdGVkQW5ub3RhdGlvbnMiLCJzb3J0IiwiYWN0aXZlTWV0cmljcyIsIm9uQ2hhbmdlU29ydCIsIm9uQWxsQW5ub3RhdGlvbnNUb2dnbGVkIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJucG1pLWFubm90YXRpb25zLWxpc3QtaGVhZGVyLWNvbXBvbmVudCIsMCksVm0oIm9uQ2hhbmdlU29ydCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uY2hhbmdlU29ydChlKX0pKSgib25BbGxBbm5vdGF0aW9uc1RvZ2dsZWQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLmFsbEFubm90YXRpb25zVG9nZ2xlZChlKX0pKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQW0oKSksMiZlJiZEbSgibnVtQW5ub3RhdGlvbnMiLG4ubnVtQW5ub3RhdGlvbnMpKCJzZWxlY3RlZEFubm90YXRpb25zIixUaCgxLDQsbi5zZWxlY3RlZEFubm90YXRpb25zJCkpKCJzb3J0IixUaCgyLDYsbi5hbm5vdGF0aW9uU29ydCQpKSgiYWN0aXZlTWV0cmljcyIsbi5hY3RpdmVNZXRyaWNzKX0sZGlyZWN0aXZlczpbUF90XSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgod190LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im5wbWktYW5ub3RhdGlvbnMtbGlzdC1oZWFkZXIiLHRlbXBsYXRlOidcbiAgICA8bnBtaS1hbm5vdGF0aW9ucy1saXN0LWhlYWRlci1jb21wb25lbnRcbiAgICAgIFtudW1Bbm5vdGF0aW9uc109Im51bUFubm90YXRpb25zIlxuICAgICAgW3NlbGVjdGVkQW5ub3RhdGlvbnNdPSJzZWxlY3RlZEFubm90YXRpb25zJCB8IGFzeW5jIlxuICAgICAgW3NvcnRdPSJhbm5vdGF0aW9uU29ydCQgfCBhc3luYyJcbiAgICAgIFthY3RpdmVNZXRyaWNzXT0iYWN0aXZlTWV0cmljcyJcbiAgICAgIChvbkNoYW5nZVNvcnQpPSJjaGFuZ2VTb3J0KCRldmVudCkiXG4gICAgICAob25BbGxBbm5vdGF0aW9uc1RvZ2dsZWQpPSJhbGxBbm5vdGF0aW9uc1RvZ2dsZWQoJGV2ZW50KSJcbiAgICA+PC9ucG1pLWFubm90YXRpb25zLWxpc3QtaGVhZGVyLWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLHtudW1Bbm5vdGF0aW9uczpbe3R5cGU6eHl9XSxhbm5vdGF0aW9uczpbe3R5cGU6eHl9XSxhY3RpdmVNZXRyaWNzOlt7dHlwZTp4eX1dfSk7Y29uc3Qga190PVsiY2hhcnQiXSxTX3Q9WyJoaW50Q2xpcCJdO2Z1bmN0aW9uIERfdCh0LGUpezEmdCYmVG0oMCwibWF0LWljb24iLDEyKX1mdW5jdGlvbiBFX3QodCxlKXsxJnQmJlRtKDAsIm1hdC1pY29uIiwxMyl9ZnVuY3Rpb24gUl90KHQsZSl7aWYoMSZ0JiZUbSgwLCJtYXQtaWNvbiIsMTQpLDImdCl7Y29uc3QgdD1ZbSgpO0RtKCJzdmdJY29uIix0LnNvcnQub3JkZXI9PT10LlNvcnRPcmRlci5TSU1JTEFSPyJhcnJvd19kb3dud2FyZF8yNHB4IjoiYXJyb3dfdXB3YXJkXzI0cHgiKSgibmdDbGFzcyIsdC5zb3J0Lm9yZGVyPT09dC5Tb3J0T3JkZXIuU0lNSUxBUj8iZG93bi1pY29uIjoidXAtaWNvbiIpfX1jbGFzcyBBX3R7Y29uc3RydWN0b3IoKXt0aGlzLnNlbGVjdGVkPSExLHRoaXMub25TaG93U2ltaWxhckFubm90YXRpb25zPW5ldyBMaCx0aGlzLlNvcnRPcmRlcj1uYnQsdGhpcy53aWR0aD0xMCx0aGlzLmNoYXJ0V2lkdGg9MTAsdGhpcy5jaGFydEhlaWdodD0xMCx0aGlzLm1heERvdFJhZGl1cz0xMCx0aGlzLmNvdW50RG90T2Zmc2V0PTcwLHRoaXMuY291bnRUZXh0UGFkZGluZz0yLHRoaXMubWFyZ2luPXt0b3A6MCxyaWdodDowLGJvdHRvbTowLGxlZnQ6MTAwfSx0aGlzLnN0cm9rZUNvbG9yPSIjZmZmIix0aGlzLnRleHRDbGFzcz0iZGVmYXVsdC10ZXh0Iix0aGlzLnJ1bnM9W119b25SZXNpemUodCl7dGhpcy5yZWRyYXcoKX1uZ0FmdGVyVmlld0luaXQoKXt0aGlzLnN2Zz1KNCh0aGlzLmFubm90YXRpb25Db250YWluZXIubmF0aXZlRWxlbWVudCkuc2VsZWN0KCJzdmciKSx0aGlzLnhTY2FsZT1VdHQoKS5wYWRkaW5nKDApLHRoaXMueVNjYWxlPVV0dCgpLnBhZGRpbmcoMCksdGhpcy5zaXplU2NhbGU9ZWV0KCkuZG9tYWluKFswLDFdKSx0aGlzLmNvdW50U2l6ZVNjYWxlPWVldCgpLnJhbmdlKFsyLHRoaXMubWF4RG90UmFkaXVzXSksdGhpcy5tYWluQ29udGFpbmVyPXRoaXMuc3ZnLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsYHRyYW5zbGF0ZSgke3RoaXMubWFyZ2luLmxlZnR9LCAke3RoaXMubWFyZ2luLnRvcH0pYCksdGhpcy5iYXJzR3JvdXA9dGhpcy5tYWluQ29udGFpbmVyLmFwcGVuZCgiZyIpLHRoaXMuY291bnREb3RzR3JvdXA9dGhpcy5tYWluQ29udGFpbmVyLmFwcGVuZCgiZyIpLHRoaXMudGV4dHNHcm91cD10aGlzLm1haW5Db250YWluZXIuYXBwZW5kKCJnIiksdGhpcy5jb3VudFRleHRzR3JvdXA9dGhpcy5tYWluQ29udGFpbmVyLmFwcGVuZCgiZyIpLHRoaXMucnVuSGludEdyb3VwPXRoaXMuc3ZnLmFwcGVuZCgiZyIpLHRoaXMucmVkcmF3KCl9bmdPbkNoYW5nZXModCl7dGhpcy5zdmcmJnRoaXMucmVkcmF3KCl9cmVkcmF3KCl7dGhpcy5zZWxlY3RlZD10aGlzLnNlbGVjdGVkQW5ub3RhdGlvbnMuaW5jbHVkZXModGhpcy5hbm5vdGF0aW9uKSx0aGlzLnVwZGF0ZURpbWVuc2lvbnMoKSx0aGlzLnNldFRleHRDbGFzcygpLHRoaXMudXBkYXRlQXhlcygpLHRoaXMuZHJhdygpfXVwZGF0ZURpbWVuc2lvbnMoKXtjb25zdCB0PW5ldyBTZXQ7dGhpcy5kYXRhLmZvckVhY2goKGU9Pnt0LmFkZChlLnJ1bil9KSksdGhpcy5ydW5zPVsuLi50XSx0aGlzLnN2Zy5zdHlsZSgiaGVpZ2h0Iix0aGlzLm51bUFjdGl2ZVJ1bnMqdGhpcy5ydW5IZWlnaHQrInB4IiksdGhpcy5jaGFydEhlaWdodD10aGlzLnJ1bnMubGVuZ3RoKnRoaXMucnVuSGVpZ2h0LXRoaXMubWFyZ2luLnRvcC10aGlzLm1hcmdpbi5ib3R0b20sdGhpcy53aWR0aD10aGlzLmFubm90YXRpb25Db250YWluZXIubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aHx8MTAsdGhpcy5jaGFydFdpZHRoPXRoaXMud2lkdGgtdGhpcy5tYXJnaW4ubGVmdC10aGlzLm1hcmdpbi5yaWdodH1zZXRUZXh0Q2xhc3MoKXt0aGlzLnRleHRDbGFzcz0iZGVmYXVsdC10ZXh0Iix0aGlzLmZsYWdnZWRBbm5vdGF0aW9ucy5pbmNsdWRlcyh0aGlzLmFubm90YXRpb24pP3RoaXMudGV4dENsYXNzPSJmbGFnLXRleHQiOnRoaXMuaGlkZGVuQW5ub3RhdGlvbnMuaW5jbHVkZXModGhpcy5hbm5vdGF0aW9uKSYmKHRoaXMudGV4dENsYXNzPSJoaWRkZW4tdGV4dCIpfXVwZGF0ZUF4ZXMoKXt0aGlzLnhTY2FsZS5yYW5nZVJvdW5kKFswLHRoaXMuY2hhcnRXaWR0aC10aGlzLmNoYXJ0V2lkdGgvdGhpcy5hY3RpdmVNZXRyaWNzLmxlbmd0aF0pLmRvbWFpbih0aGlzLmFjdGl2ZU1ldHJpY3MubWFwKCh0PT5ueXQodCkpKSksdGhpcy55U2NhbGUucmFuZ2VSb3VuZChbMCx0aGlzLmNoYXJ0SGVpZ2h0LXRoaXMucnVuSGVpZ2h0XSkuZG9tYWluKHRoaXMucnVucyksdGhpcy5zaXplU2NhbGUucmFuZ2UoWzAsdGhpcy5jaGFydFdpZHRoL3RoaXMuYWN0aXZlTWV0cmljcy5sZW5ndGhdKSx0aGlzLmNvdW50U2l6ZVNjYWxlLmRvbWFpbihbMCx0aGlzLm1heENvdW50XSl9ZHJhdygpe3RoaXMuZHJhd1J1bkluZGljYXRvcnMoKSx0aGlzLmRyYXdSdW5IaW50VGV4dHMoKSx0aGlzLmRyYXdCYXJzKCksdGhpcy5kcmF3VGV4dHMoKSx0aGlzLnNob3dDb3VudHM/KHRoaXMuZHJhd0NvdW50RG90cygpLHRoaXMuZHJhd0NvdW50VGV4dHMoKSk6KHRoaXMuY291bnREb3RzR3JvdXAuc2VsZWN0QWxsKCIuY291bnQtZG90IikucmVtb3ZlKCksdGhpcy5jb3VudFRleHRzR3JvdXAuc2VsZWN0QWxsKCIuY291bnQtYmFja2dyb3VuZC10ZXh0IikucmVtb3ZlKCksdGhpcy5jb3VudFRleHRzR3JvdXAuc2VsZWN0QWxsKCIuY291bnQtdGV4dCIpLnJlbW92ZSgpKX1kcmF3UnVuSW5kaWNhdG9ycygpe0o0KHRoaXMuY2xpcFBhdGhFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpLnNlbGVjdCgicmVjdCIpLmF0dHIoIndpZHRoIix0aGlzLm1hcmdpbi5sZWZ0LTMwKS5hdHRyKCJoZWlnaHQiLHRoaXMuY2hhcnRIZWlnaHQpO2NvbnN0IHQ9dGhpcy5ydW5IaW50R3JvdXAuc2VsZWN0QWxsKCIuaGludCIpLmRhdGEodGhpcy5ydW5zKSxlPXQuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImhpbnQiKTtlLmFwcGVuZCgicGF0aCIpLmF0dHIoImQiLCJNIDAgMCBMIDE1IDAgTCAxMCAxMCBMIDE1IDIwIEwgMCAyMCBaIiksZS5tZXJnZSh0KS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybmB0cmFuc2xhdGUoMTAsICR7dGhpcy55U2NhbGUodCkrNX0pYH0uYmluZCh0aGlzKSkuYXR0cigiZmlsbCIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29sb3JTY2FsZSh0KX0uYmluZCh0aGlzKSksdC5leGl0KCkucmVtb3ZlKCl9ZHJhd1J1bkhpbnRUZXh0cygpe2NvbnN0IHQ9dGhpcy5ydW5IaW50R3JvdXAuc2VsZWN0QWxsKCIuaGludC10ZXh0IikuZGF0YSh0aGlzLnJ1bnMpO3QuZW50ZXIoKS5hcHBlbmQoInRleHQiKS5hdHRyKCJ4IiwyNSkuYXR0cigiZm9udC1zaXplIiwiMTBweCIpLmF0dHIoImFsaWdubWVudC1iYXNlbGluZSIsIm1pZGRsZSIpLmF0dHIoImNsaXAtcGF0aCIsInVybCgjaGludC1jbGlwKSIpLm1lcmdlKHQpLmF0dHIoInkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnlTY2FsZSh0KSsxNX0uYmluZCh0aGlzKSkuYXR0cigiY2xhc3MiLGBoaW50LXRleHQgJHt0aGlzLnRleHRDbGFzc31gKS50ZXh0KCh0PT57dmFyIGU7cmV0dXJuKG51bGw9PT0oZT10aGlzLnJ1bklkVG9SdW5zLmdldCh0KSl8fHZvaWQgMD09PWU/dm9pZCAwOmUubmFtZSl8fCIifSkpLHQuZXhpdCgpLnJlbW92ZSgpfWRyYXdCYXJzKCl7Y29uc3QgdD10aGlzLmJhcnNHcm91cC5zZWxlY3RBbGwoIi5iYXIiKS5kYXRhKHRoaXMuZGF0YSk7dC5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwiYmFyIikuYXR0cigiaGVpZ2h0IiwyMCkubWVyZ2UodCkuYXR0cigiZmlsbCIsKHQ9Pm51bGw9PT10Lm5QTUlWYWx1ZT8iIjp0Lm5QTUlWYWx1ZT49MD9ib3QodC5uUE1JVmFsdWUpOl9vdCgtMSp0Lm5QTUlWYWx1ZSkpKS5hdHRyKCJ4IixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54U2NhbGUodC5tZXRyaWMpfS5iaW5kKHRoaXMpKS5hdHRyKCJ5IixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy55U2NhbGUodC5ydW4pKzV9LmJpbmQodGhpcykpLmF0dHIoIndpZHRoIixmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09PXQublBNSVZhbHVlPzA6dGhpcy5zaXplU2NhbGUoTWF0aC5hYnModC5uUE1JVmFsdWUpKX0uYmluZCh0aGlzKSksdC5leGl0KCkucmVtb3ZlKCl9ZHJhd0NvdW50RG90cygpe2NvbnN0IHQ9dGhpcy5jb3VudERvdHNHcm91cC5zZWxlY3RBbGwoIi5jb3VudC1kb3QiKS5kYXRhKHRoaXMuZGF0YSk7dC5lbnRlcigpLmFwcGVuZCgiY2lyY2xlIikuYXR0cigiY2xhc3MiLCJjb3VudC1kb3QiKS5hdHRyKCJzdHJva2UiLCJibGFjayIpLm1lcmdlKHQpLmF0dHIoImZpbGwiLGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dC5jb3VudFZhbHVlPyIiOnlvdCh0LmNvdW50VmFsdWUvdGhpcy5tYXhDb3VudCl9LmJpbmQodGhpcykpLmF0dHIoImN4IixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54U2NhbGUodC5tZXRyaWMpK3RoaXMuY291bnREb3RPZmZzZXR9LmJpbmQodGhpcykpLmF0dHIoImN5IixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy55U2NhbGUodC5ydW4pK3RoaXMucnVuSGVpZ2h0LzJ9LmJpbmQodGhpcykpLmF0dHIoInIiLGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dC5jb3VudFZhbHVlPzA6dGhpcy5jb3VudFNpemVTY2FsZSh0LmNvdW50VmFsdWUpfS5iaW5kKHRoaXMpKSx0LmV4aXQoKS5yZW1vdmUoKX1kcmF3VGV4dHMoKXtjb25zdCB0PXRoaXMudGV4dHNHcm91cC5zZWxlY3RBbGwoIi5ucG1pLWJhY2tncm91bmQtdGV4dCIpLmRhdGEodGhpcy5kYXRhKTt0LmVudGVyKCkuYXBwZW5kKCJ0ZXh0IikuYXR0cigiY2xhc3MiLCJucG1pLWJhY2tncm91bmQtdGV4dCIpLmF0dHIoInN0cm9rZS13aWR0aCIsMykuYXR0cigic3Ryb2tlLWxpbmVqb2luIiwicm91bmQiKS5hdHRyKCJzdHJva2UiLHRoaXMuc3Ryb2tlQ29sb3IpLmF0dHIoImZvbnQtc2l6ZSIsIjEzcHgiKS5hdHRyKCJhbGlnbm1lbnQtYmFzZWxpbmUiLCJtaWRkbGUiKS5tZXJnZSh0KS5hdHRyKCJ4IixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54U2NhbGUodC5tZXRyaWMpKzV9LmJpbmQodGhpcykpLmF0dHIoInkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnlTY2FsZSh0LnJ1bikrdGhpcy5ydW5IZWlnaHQvMn0uYmluZCh0aGlzKSkudGV4dCgodD0+bnVsbD09PXQublBNSVZhbHVlPyJudWxsIjpNYXRoLnJvdW5kKDFlMyoodC5uUE1JVmFsdWUrTnVtYmVyLkVQU0lMT04pKS8xZTMpKSx0LmV4aXQoKS5yZW1vdmUoKTtjb25zdCBlPXRoaXMudGV4dHNHcm91cC5zZWxlY3RBbGwoIi5ucG1pLXRleHQiKS5kYXRhKHRoaXMuZGF0YSk7ZS5lbnRlcigpLmFwcGVuZCgidGV4dCIpLmF0dHIoImNsYXNzIiwibnBtaS10ZXh0IikuYXR0cigiZm9udC1zaXplIiwiMTNweCIpLmF0dHIoImFsaWdubWVudC1iYXNlbGluZSIsIm1pZGRsZSIpLm1lcmdlKGUpLmF0dHIoIngiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnhTY2FsZSh0Lm1ldHJpYykrNX0uYmluZCh0aGlzKSkuYXR0cigieSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueVNjYWxlKHQucnVuKSt0aGlzLnJ1bkhlaWdodC8yfS5iaW5kKHRoaXMpKS50ZXh0KCh0PT5udWxsPT09dC5uUE1JVmFsdWU/Im51bGwiOk1hdGgucm91bmQoMWUzKih0Lm5QTUlWYWx1ZStOdW1iZXIuRVBTSUxPTikpLzFlMykpLGUuZXhpdCgpLnJlbW92ZSgpfWRyYXdDb3VudFRleHRzKCl7Y29uc3QgdD10aGlzLmNvdW50VGV4dHNHcm91cC5zZWxlY3RBbGwoIi5jb3VudC1iYWNrZ3JvdW5kLXRleHQiKS5kYXRhKHRoaXMuZGF0YSk7dC5lbnRlcigpLmFwcGVuZCgidGV4dCIpLmF0dHIoImNsYXNzIiwiY291bnQtYmFja2dyb3VuZC10ZXh0IikuYXR0cigic3Ryb2tlLXdpZHRoIiwzKS5hdHRyKCJzdHJva2UtbGluZWpvaW4iLCJyb3VuZCIpLmF0dHIoInN0cm9rZSIsdGhpcy5zdHJva2VDb2xvcikuYXR0cigiZm9udC1zaXplIiwiMTBweCIpLmF0dHIoImFsaWdubWVudC1iYXNlbGluZSIsIm1pZGRsZSIpLm1lcmdlKHQpLmF0dHIoIngiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnhTY2FsZSh0Lm1ldHJpYykrdGhpcy5jb3VudERvdE9mZnNldCt0aGlzLmNvdW50VGV4dFBhZGRpbmcrdGhpcy5tYXhEb3RSYWRpdXN9LmJpbmQodGhpcykpLmF0dHIoInkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnlTY2FsZSh0LnJ1bikrdGhpcy5ydW5IZWlnaHQvMn0uYmluZCh0aGlzKSkudGV4dCgodD0+bnVsbD09PXQuY291bnRWYWx1ZT8iIjpJbnRsLk51bWJlckZvcm1hdCgpLmZvcm1hdCh0LmNvdW50VmFsdWUpKSksdC5leGl0KCkucmVtb3ZlKCk7Y29uc3QgZT10aGlzLmNvdW50VGV4dHNHcm91cC5zZWxlY3RBbGwoIi5jb3VudC10ZXh0IikuZGF0YSh0aGlzLmRhdGEpO2UuZW50ZXIoKS5hcHBlbmQoInRleHQiKS5hdHRyKCJjbGFzcyIsImNvdW50LXRleHQiKS5hdHRyKCJmb250LXNpemUiLCIxMHB4IikuYXR0cigiYWxpZ25tZW50LWJhc2VsaW5lIiwibWlkZGxlIikubWVyZ2UoZSkuYXR0cigieCIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueFNjYWxlKHQubWV0cmljKSt0aGlzLmNvdW50RG90T2Zmc2V0K3RoaXMuY291bnRUZXh0UGFkZGluZyt0aGlzLm1heERvdFJhZGl1c30uYmluZCh0aGlzKSkuYXR0cigieSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueVNjYWxlKHQucnVuKSt0aGlzLnJ1bkhlaWdodC8yfS5iaW5kKHRoaXMpKS50ZXh0KCh0PT5udWxsPT09dC5jb3VudFZhbHVlPyIiOkludGwuTnVtYmVyRm9ybWF0KCkuZm9ybWF0KHQuY291bnRWYWx1ZSkpKSxlLmV4aXQoKS5yZW1vdmUoKX1zaW1pbGFyaXR5U29ydCh0KXt0aGlzLmhhc0VtYmVkZGluZyYmKHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5vblNob3dTaW1pbGFyQW5ub3RhdGlvbnMuZW1pdCgpKX19QV90Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxBX3QpfSxBX3QuybVjbXA9dG8oe3R5cGU6QV90LHNlbGVjdG9yczpbWyJhbm5vdGF0aW9uLWNvbXBvbmVudCJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmKFFoKGtfdCw3LGhnKSxRaChTX3QsNyxoZykpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uYW5ub3RhdGlvbkNvbnRhaW5lcj10LmZpcnN0KSxKaCh0PXRiKCkpJiYobi5jbGlwUGF0aEVsZW1lbnQ9dC5maXJzdCl9fSxob3N0VmFyczoyLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgicmVzaXplIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uUmVzaXplKCl9KSwhMSxvbCksMiZlJiZwdSgic2VsZWN0ZWQtcm93IixuLnNlbGVjdGVkKX0saW5wdXRzOntkYXRhOiJkYXRhIixtYXhDb3VudDoibWF4Q291bnQiLHNlbGVjdGVkQW5ub3RhdGlvbnM6InNlbGVjdGVkQW5ub3RhdGlvbnMiLGZsYWdnZWRBbm5vdGF0aW9uczoiZmxhZ2dlZEFubm90YXRpb25zIixoaWRkZW5Bbm5vdGF0aW9uczoiaGlkZGVuQW5ub3RhdGlvbnMiLGFjdGl2ZU1ldHJpY3M6ImFjdGl2ZU1ldHJpY3MiLG51bUFjdGl2ZVJ1bnM6Im51bUFjdGl2ZVJ1bnMiLHNob3dDb3VudHM6InNob3dDb3VudHMiLGFubm90YXRpb246ImFubm90YXRpb24iLHJ1bkhlaWdodDoicnVuSGVpZ2h0IixoYXNFbWJlZGRpbmc6Imhhc0VtYmVkZGluZyIsc29ydDoic29ydCIsc2lkZWJhcldpZHRoOiJzaWRlYmFyV2lkdGgiLGNvbG9yU2NhbGU6ImNvbG9yU2NhbGUiLHJ1bklkVG9SdW5zOiJydW5JZFRvUnVucyJ9LG91dHB1dHM6e29uU2hvd1NpbWlsYXJBbm5vdGF0aW9uczoib25TaG93U2ltaWxhckFubm90YXRpb25zIn0sZmVhdHVyZXM6W0JvXSxkZWNsczoxNCx2YXJzOjEwLGNvbnN0czpbWzEsImFubm90YXRpb24tdGl0bGUiXSxbMSwiYW5ub3RhdGlvbi1jaGVja2JveCIsMywiY2hlY2tlZCIsImNsaWNrIl0sWzEsImFubm90YXRpb24tYnV0dG9uIiwzLCJuZ0NsYXNzIiwiY2xpY2siXSxbImNsYXNzIiwiZmxhZ2dlZC1pY29uIiwic3ZnSWNvbiIsImZsYWdfMjRweCIsNCwibmdJZiJdLFsiY2xhc3MiLCJoaWRkZW4taWNvbiIsInN2Z0ljb24iLCJ2aXNpYmlsaXR5X29mZl8yNHB4Iiw0LCJuZ0lmIl0sWyJjbGFzcyIsImFubm90YXRpb24taWNvbiIsMywic3ZnSWNvbiIsIm5nQ2xhc3MiLDQsIm5nSWYiXSxbMSwiY2hhcnQtZGl2Il0sWyJjaGFydCIsIiJdLFsxLCJjaGFydC1zdmciXSxbImlkIiwiaGludC1jbGlwIl0sWyJoaW50Q2xpcCIsIiJdLFsieCIsIjAiLCJ5IiwiMCJdLFsic3ZnSWNvbiIsImZsYWdfMjRweCIsMSwiZmxhZ2dlZC1pY29uIl0sWyJzdmdJY29uIiwidmlzaWJpbGl0eV9vZmZfMjRweCIsMSwiaGlkZGVuLWljb24iXSxbMSwiYW5ub3RhdGlvbi1pY29uIiwzLCJzdmdJY29uIiwibmdDbGFzcyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiZGl2IiwwKSxSbSgxLCJtYXQtY2hlY2tib3giLDEpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIGUucHJldmVudERlZmF1bHQoKX0pKSxBbSgpLFJtKDIsImJ1dHRvbiIsMiksVm0oImNsaWNrIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5zaW1pbGFyaXR5U29ydChlKX0pKSxrdSgzKSxBbSgpLFFwKDQsRF90LDEsMCwibWF0LWljb24iLDMpLFFwKDUsRV90LDEsMCwibWF0LWljb24iLDQpLFFwKDYsUl90LDEsMiwibWF0LWljb24iLDUpLEFtKCksUm0oNywiZGl2Iiw2LDcpLHFpKCksUm0oOSwic3ZnIiw4KSxSbSgxMCwiZGVmcyIpLFJtKDExLCJjbGlwUGF0aCIsOSwxMCksVG0oMTMsInJlY3QiLDExKSxBbSgpLEFtKCksQW0oKSxBbSgpKSwyJmUmJihwdSgiZmxhZ2dlZC1hbm5vdGF0aW9uIixuLmZsYWdnZWRBbm5vdGF0aW9ucy5pbmNsdWRlcyhuLmFubm90YXRpb24pKSgiaGlkZGVuLWFubm90YXRpb24iLG4uaGlkZGVuQW5ub3RhdGlvbnMuaW5jbHVkZXMobi5hbm5vdGF0aW9uKSYmIW4uZmxhZ2dlZEFubm90YXRpb25zLmluY2x1ZGVzKG4uYW5ub3RhdGlvbikpLHJjKDEpLERtKCJjaGVja2VkIixuLnNlbGVjdGVkQW5ub3RhdGlvbnMuaW5jbHVkZXMobi5hbm5vdGF0aW9uKSkscmMoMSksRG0oIm5nQ2xhc3MiLG4uaGFzRW1iZWRkaW5nPyJjbGlja2FibGUtYW5ub3RhdGlvbiI6IiIpLHJjKDEpLER1KCIgIixuLmFubm90YXRpb24sIiAiKSxyYygxKSxEbSgibmdJZiIsbi5mbGFnZ2VkQW5ub3RhdGlvbnMuaW5jbHVkZXMobi5hbm5vdGF0aW9uKSkscmMoMSksRG0oIm5nSWYiLG4uaGlkZGVuQW5ub3RhdGlvbnMuaW5jbHVkZXMobi5hbm5vdGF0aW9uKSkscmMoMSksRG0oIm5nSWYiLG4uYW5ub3RhdGlvbj09PW4uc29ydC5tZXRyaWMpKX0sZGlyZWN0aXZlczpbT1ksYU0sZE0sRFddLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudHtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGwgLm1hdC1iYWRnZS1jb250ZW50e2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZSAubWF0LWJhZGdlLWNvbnRlbnR7Zm9udC1zaXplOjI0cHh9Lm1hdC1oMSwubWF0LWhlYWRsaW5lLC5tYXQtdHlwb2dyYXBoeSBoMXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMiwubWF0LXRpdGxlLC5tYXQtdHlwb2dyYXBoeSBoMntmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMywubWF0LXN1YmhlYWRpbmctMiwubWF0LXR5cG9ncmFwaHkgaDN7Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDQsLm1hdC1zdWJoZWFkaW5nLTEsLm1hdC10eXBvZ3JhcGh5IGg0e2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1LC5tYXQtdHlwb2dyYXBoeSBoNXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNiwubWF0LXR5cG9ncmFwaHkgaDZ7Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmcsLm1hdC1ib2R5LTJ7Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5LC5tYXQtYm9keS0xLC5tYXQtdHlwb2dyYXBoeXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHkgcCwubWF0LWJvZHktMSBwLC5tYXQtdHlwb2dyYXBoeSBwe21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsLC5tYXQtY2FwdGlvbntmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNCwubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTR7Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zLC5tYXQtdHlwb2dyYXBoeSAubWF0LWRpc3BsYXktM3tmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yLC5tYXQtdHlwb2dyYXBoeSAubWF0LWRpc3BsYXktMntmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMSwubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTF7Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcntmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbiwubWF0LXJhaXNlZC1idXR0b24sLm1hdC1pY29uLWJ1dHRvbiwubWF0LXN0cm9rZWQtYnV0dG9uLC5tYXQtZmxhdC1idXR0b24sLm1hdC1mYWIsLm1hdC1taW5pLWZhYntmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJke2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGV7Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXIgLm1hdC1jYXJkLXRpdGxle2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZSwubWF0LWNhcmQtY29udGVudHtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94e2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dCAubWF0LWNoZWNrYm94LWxhYmVse2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwe2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb24sLm1hdC1jaGlwIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb257Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbHtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsLC5tYXQtZm9vdGVyLWNlbGx7Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcntmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5e2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbCwubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b257Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyIHRoe2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50e2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZHtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcntwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb257Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24tYnV0dG9uLC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbntoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbiwubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29ue2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcnt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWx7dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVye2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC13cmFwcGVye3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWluZml4e3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbCsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcnttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbCsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLWluZml4e3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcjpmb2N1cysubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLWluZml4e3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtbGFiZWx7dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcjpmb2N1cysubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlciwubWF0LWdyaWQtdGlsZS1mb290ZXJ7Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyIC5tYXQtbGluZSwubWF0LWdyaWQtdGlsZS1mb290ZXIgLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXIgLm1hdC1saW5lOm50aC1jaGlsZChuKzIpLC5tYXQtZ3JpZC10aWxlLWZvb3RlciAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnR7bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvciwubWF0LXBhZ2luYXRvci1wYWdlLXNpemUgLm1hdC1zZWxlY3QtdHJpZ2dlcntmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b257Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0e2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2Vye2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnR7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWwsLm1hdC1zdGVwcGVyLWhvcml6b250YWx7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbHtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcntmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9ye2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZHtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXB7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLWxpbmt7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXIsLm1hdC10b29sYmFyIGgxLC5tYXQtdG9vbGJhciBoMiwubWF0LXRvb2xiYXIgaDMsLm1hdC10b29sYmFyIGg0LC5tYXQtdG9vbGJhciBoNSwubWF0LXRvb2xiYXIgaDZ7Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwe2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0e2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb257Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1pdGVte2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1vcHRpb257Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpbmV7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlIC5tYXQtc3ViaGVhZGVye2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1pdGVte2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpbmV7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb257Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtc3ViaGVhZGVye2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb257Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWx7Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbntsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGUsLm1hdC1uZXN0ZWQtdHJlZS1ub2Rle2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGU6bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWR7b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50e3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1yaXBwbGUtZWxlbWVudHtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW57Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyLC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcntwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJ7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXI6ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcntkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5le3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ3tvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ3tvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9we2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCwuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ3tvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3h7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja3twb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5ne3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3h7cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7LyohKi99QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7LyohKi99LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZDotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZDpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9ye3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcntwb3NpdGlvbjpyZWxhdGl2ZX06aG9zdHtwYWRkaW5nLXRvcDo1cHh9LmFubm90YXRpb24tdGl0bGV7YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtmb250LXNpemU6MTNweDtoZWlnaHQ6MjBweDtwYWRkaW5nOjAgMTBweDt1c2VyLXNlbGVjdDpub25lfS5zZWxlY3RlZC1yb3d7YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2Rpc3BsYXk6YmxvY2t9LmZsYWdnZWQtYW5ub3RhdGlvbntjb2xvcjojZjU3YzAwfS5oaWRkZW4tYW5ub3RhdGlvbntjb2xvcjojNzU3NTc1fS5hbm5vdGF0aW9uLWNoZWNrYm94e3BhZGRpbmctcmlnaHQ6NXB4fS5mbGFnZ2VkLWljb257dHJhbnNmb3JtOnNjYWxlKDAuNil9LmhpZGRlbi1pY29ue3RyYW5zZm9ybTpzY2FsZSgwLjYpfS5hbm5vdGF0aW9uLWljb257dHJhbnNmb3JtOnNjYWxlKDAuNil9LmNoYXJ0LWRpdntib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmVifS5jaGFydC1zdmd7d2lkdGg6MTAwJTt1c2VyLXNlbGVjdDpub25lfS5kZWZhdWx0LXRleHR7ZmlsbDojMDAwfS5mbGFnLXRleHR7ZmlsbDojZjU3YzAwfS5oaWRkZW4tdGV4dHtmaWxsOiM3NTc1NzV9LmNsaWNrYWJsZS1hbm5vdGF0aW9ue2N1cnNvcjpwb2ludGVyfWJ1dHRvbnthbGw6dW5zZXR9XG4nXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEFfdCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJhbm5vdGF0aW9uLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vYW5ub3RhdGlvbl9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9hbm5vdGF0aW9uX2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLGVuY2Fwc3VsYXRpb246SG4uTm9uZX1dfV0sbnVsbCx7ZGF0YTpbe3R5cGU6eHl9XSxtYXhDb3VudDpbe3R5cGU6eHl9XSxzZWxlY3RlZEFubm90YXRpb25zOlt7dHlwZTp4eX1dLGZsYWdnZWRBbm5vdGF0aW9uczpbe3R5cGU6eHl9XSxoaWRkZW5Bbm5vdGF0aW9uczpbe3R5cGU6eHl9XSxhY3RpdmVNZXRyaWNzOlt7dHlwZTp4eX1dLG51bUFjdGl2ZVJ1bnM6W3t0eXBlOnh5fV0sc2hvd0NvdW50czpbe3R5cGU6eHl9XSxhbm5vdGF0aW9uOlt7dHlwZTp4eX1dLHJ1bkhlaWdodDpbe3R5cGU6eHl9XSxoYXNFbWJlZGRpbmc6W3t0eXBlOnh5fV0sc29ydDpbe3R5cGU6eHl9XSxzaWRlYmFyV2lkdGg6W3t0eXBlOnh5fV0sY29sb3JTY2FsZTpbe3R5cGU6eHl9XSxydW5JZFRvUnVuczpbe3R5cGU6eHl9XSxhbm5vdGF0aW9uQ29udGFpbmVyOlt7dHlwZTpaYSxhcmdzOlsiY2hhcnQiLHtzdGF0aWM6ITAscmVhZDpoZ31dfV0sY2xpcFBhdGhFbGVtZW50Olt7dHlwZTpaYSxhcmdzOlsiaGludENsaXAiLHtzdGF0aWM6ITAscmVhZDpoZ31dfV0sc2VsZWN0ZWQ6W3t0eXBlOlB5LGFyZ3M6WyJjbGFzcy5zZWxlY3RlZC1yb3ciXX1dLG9uUmVzaXplOlt7dHlwZTp3eSxhcmdzOlsid2luZG93OnJlc2l6ZSJdfV0sb25TaG93U2ltaWxhckFubm90YXRpb25zOlt7dHlwZTpPeX1dfSk7Y2xhc3MgVF90e2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLnNvcnQkPXRoaXMuc3RvcmUuc2VsZWN0KGhidCksdGhpcy5mbGFnZ2VkQW5ub3RhdGlvbnMkPXRoaXMuc3RvcmUuc2VsZWN0KGRidCksdGhpcy5oaWRkZW5Bbm5vdGF0aW9ucyQ9dGhpcy5zdG9yZS5zZWxlY3QocGJ0KSx0aGlzLnNlbGVjdGVkQW5ub3RhdGlvbnMkPXRoaXMuc3RvcmUuc2VsZWN0KGNidCksdGhpcy5zaG93Q291bnRzJD10aGlzLnN0b3JlLnNlbGVjdChDYnQpLHRoaXMuc2lkZWJhcldpZHRoJD10aGlzLnN0b3JlLnNlbGVjdCh4YnQpLHRoaXMucnVuQ29sb3JTY2FsZSQ9dGhpcy5zdG9yZS5zZWxlY3Qoek4pLnBpcGUoSXQoKHQ9PmU9PntpZighdC5oYXNPd25Qcm9wZXJ0eShlKSl0aHJvdyBuZXcgRXJyb3IoYFtDb2xvciBzY2FsZV0gdW5rbm93biBydW5JZDogJHtlfS5gKTtyZXR1cm4gdFtlXX0pKSksdGhpcy5ydW5JZFRvUnVucyQ9dGhpcy5zdG9yZS5zZWxlY3QoZE4pfXNob3dTaW1pbGFyQW5ub3RhdGlvbnMoKXt0aGlzLnN0b3JlLmRpc3BhdGNoKGpidCh7YW5ub3RhdGlvbjp0aGlzLmFubm90YXRpb259KSl9fWZ1bmN0aW9uIE5fdCh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsIm5wbWktYW5ub3RhdGlvbiIsNSksVm0oImNsaWNrIiwoZnVuY3Rpb24gZShuKXtjb25zdCBvPWhpKHQpLiRpbXBsaWNpdDtyZXR1cm4gWW0oMikucm93Q2xpY2tlZChuLG8pfSkpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oMik7RG0oImRhdGEiLG4uYW5ub3RhdGlvbnNbdF0pKCJhY3RpdmVNZXRyaWNzIixuLmFjdGl2ZU1ldHJpY3MpKCJudW1BY3RpdmVSdW5zIixuLm51bUFjdGl2ZVJ1bnMpKCJtYXhDb3VudCIsbi5tYXhDb3VudCkoImFubm90YXRpb24iLHQpKCJydW5IZWlnaHQiLG4ucnVuSGVpZ2h0KSgiaGFzRW1iZWRkaW5nIixuLmVtYmVkZGluZ0RhdGEmJnZvaWQgMCE9PW4uZW1iZWRkaW5nRGF0YVt0XSl9fWZ1bmN0aW9uIHpfdCh0LGUpe2lmKDEmdCYmKE5tKDApLFRtKDEsIm5wbWktYW5ub3RhdGlvbnMtbGlzdC1sZWdlbmQiKSxUbSgyLCJucG1pLWFubm90YXRpb25zLWxpc3QtaGVhZGVyIiwyKSxSbSgzLCJjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQiLDMpLFFwKDQsTl90LDEsNywibnBtaS1hbm5vdGF0aW9uIiw0KSxBbSgpLHptKCkpLDImdCl7Y29uc3QgdD1ZbSgpO3JjKDIpLERtKCJhbm5vdGF0aW9ucyIsdC5hbm5vdGF0aW9ucykoIm51bUFubm90YXRpb25zIix0Lm51bUFubm90YXRpb25zKSgiYWN0aXZlTWV0cmljcyIsdC5hY3RpdmVNZXRyaWNzKSxyYygxKSxLbSgiaXRlbVNpemUiLHQubnVtQWN0aXZlUnVucyp0LnJ1bkhlaWdodCsyNSkscmMoMSksRG0oImNka1ZpcnR1YWxGb3JPZiIsdC5zb3J0ZWRBbm5vdGF0aW9ucyl9fVRfdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VF90KShTbShJdykpfSxUX3QuybVjbXA9dG8oe3R5cGU6VF90LHNlbGVjdG9yczpbWyJucG1pLWFubm90YXRpb24iXV0saW5wdXRzOntkYXRhOiJkYXRhIixtYXhDb3VudDoibWF4Q291bnQiLGFjdGl2ZU1ldHJpY3M6ImFjdGl2ZU1ldHJpY3MiLG51bUFjdGl2ZVJ1bnM6Im51bUFjdGl2ZVJ1bnMiLGFubm90YXRpb246ImFubm90YXRpb24iLHJ1bkhlaWdodDoicnVuSGVpZ2h0IixoYXNFbWJlZGRpbmc6Imhhc0VtYmVkZGluZyJ9LGRlY2xzOjksdmFyczozMSxjb25zdHM6W1szLCJkYXRhIiwibWF4Q291bnQiLCJhY3RpdmVNZXRyaWNzIiwibnVtQWN0aXZlUnVucyIsImFubm90YXRpb24iLCJydW5IZWlnaHQiLCJoYXNFbWJlZGRpbmciLCJzb3J0Iiwic2VsZWN0ZWRBbm5vdGF0aW9ucyIsImZsYWdnZWRBbm5vdGF0aW9ucyIsImhpZGRlbkFubm90YXRpb25zIiwic2hvd0NvdW50cyIsInNpZGViYXJXaWR0aCIsImNvbG9yU2NhbGUiLCJydW5JZFRvUnVucyIsIm9uU2hvd1NpbWlsYXJBbm5vdGF0aW9ucyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiYW5ub3RhdGlvbi1jb21wb25lbnQiLDApLFZtKCJvblNob3dTaW1pbGFyQW5ub3RhdGlvbnMiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uc2hvd1NpbWlsYXJBbm5vdGF0aW9ucygpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBaCgzLCJhc3luYyIpLEFoKDQsImFzeW5jIiksQWgoNSwiYXN5bmMiKSxBaCg2LCJhc3luYyIpLEFoKDcsImFzeW5jIiksQWgoOCwiYXN5bmMiKSxBbSgpKSwyJmUmJkRtKCJkYXRhIixuLmRhdGEpKCJtYXhDb3VudCIsbi5tYXhDb3VudCkoImFjdGl2ZU1ldHJpY3MiLG4uYWN0aXZlTWV0cmljcykoIm51bUFjdGl2ZVJ1bnMiLG4ubnVtQWN0aXZlUnVucykoImFubm90YXRpb24iLG4uYW5ub3RhdGlvbikoInJ1bkhlaWdodCIsbi5ydW5IZWlnaHQpKCJoYXNFbWJlZGRpbmciLG4uaGFzRW1iZWRkaW5nKSgic29ydCIsVGgoMSwxNSxuLnNvcnQkKSkoInNlbGVjdGVkQW5ub3RhdGlvbnMiLFRoKDIsMTcsbi5zZWxlY3RlZEFubm90YXRpb25zJCkpKCJmbGFnZ2VkQW5ub3RhdGlvbnMiLFRoKDMsMTksbi5mbGFnZ2VkQW5ub3RhdGlvbnMkKSkoImhpZGRlbkFubm90YXRpb25zIixUaCg0LDIxLG4uaGlkZGVuQW5ub3RhdGlvbnMkKSkoInNob3dDb3VudHMiLFRoKDUsMjMsbi5zaG93Q291bnRzJCkpKCJzaWRlYmFyV2lkdGgiLFRoKDYsMjUsbi5zaWRlYmFyV2lkdGgkKSkoImNvbG9yU2NhbGUiLFRoKDcsMjcsbi5ydW5Db2xvclNjYWxlJCkpKCJydW5JZFRvUnVucyIsVGgoOCwyOSxuLnJ1bklkVG9SdW5zJCkpfSxkaXJlY3RpdmVzOltBX3RdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChUX3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibnBtaS1hbm5vdGF0aW9uIix0ZW1wbGF0ZTonXG4gICAgPGFubm90YXRpb24tY29tcG9uZW50XG4gICAgICBbZGF0YV09ImRhdGEiXG4gICAgICBbbWF4Q291bnRdPSJtYXhDb3VudCJcbiAgICAgIFthY3RpdmVNZXRyaWNzXT0iYWN0aXZlTWV0cmljcyJcbiAgICAgIFtudW1BY3RpdmVSdW5zXT0ibnVtQWN0aXZlUnVucyJcbiAgICAgIFthbm5vdGF0aW9uXT0iYW5ub3RhdGlvbiJcbiAgICAgIFtydW5IZWlnaHRdPSJydW5IZWlnaHQiXG4gICAgICBbaGFzRW1iZWRkaW5nXT0iaGFzRW1iZWRkaW5nIlxuICAgICAgW3NvcnRdPSJzb3J0JCB8IGFzeW5jIlxuICAgICAgW3NlbGVjdGVkQW5ub3RhdGlvbnNdPSJzZWxlY3RlZEFubm90YXRpb25zJCB8IGFzeW5jIlxuICAgICAgW2ZsYWdnZWRBbm5vdGF0aW9uc109ImZsYWdnZWRBbm5vdGF0aW9ucyQgfCBhc3luYyJcbiAgICAgIFtoaWRkZW5Bbm5vdGF0aW9uc109ImhpZGRlbkFubm90YXRpb25zJCB8IGFzeW5jIlxuICAgICAgW3Nob3dDb3VudHNdPSJzaG93Q291bnRzJCB8IGFzeW5jIlxuICAgICAgW3NpZGViYXJXaWR0aF09InNpZGViYXJXaWR0aCQgfCBhc3luYyJcbiAgICAgIFtjb2xvclNjYWxlXT0icnVuQ29sb3JTY2FsZSQgfCBhc3luYyJcbiAgICAgIFtydW5JZFRvUnVuc109InJ1bklkVG9SdW5zJCB8IGFzeW5jIlxuICAgICAgKG9uU2hvd1NpbWlsYXJBbm5vdGF0aW9ucyk9InNob3dTaW1pbGFyQW5ub3RhdGlvbnMoKSJcbiAgICA+PC9hbm5vdGF0aW9uLWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLHtkYXRhOlt7dHlwZTp4eX1dLG1heENvdW50Olt7dHlwZTp4eX1dLGFjdGl2ZU1ldHJpY3M6W3t0eXBlOnh5fV0sbnVtQWN0aXZlUnVuczpbe3R5cGU6eHl9XSxhbm5vdGF0aW9uOlt7dHlwZTp4eX1dLHJ1bkhlaWdodDpbe3R5cGU6eHl9XSxoYXNFbWJlZGRpbmc6W3t0eXBlOnh5fV19KTtjbGFzcyBJX3R7Y29uc3RydWN0b3IoKXt0aGlzLm9uUm93Q2xpY2s9bmV3IExoLHRoaXMucnVuSGVpZ2h0PTMwfXJvd0NsaWNrZWQodCxlKXtpZih0LnNoaWZ0S2V5KXtsZXQgdD10aGlzLnNvcnRlZEFubm90YXRpb25zLmluZGV4T2YoZSk7aWYoMD09PXRoaXMuc2VsZWN0ZWRBbm5vdGF0aW9ucy5sZW5ndGgpdGhpcy5vblJvd0NsaWNrLmVtaXQodGhpcy5zb3J0ZWRBbm5vdGF0aW9ucy5zbGljZSgwLHQrMSkpO2Vsc2V7Y29uc3QgZT10aGlzLnNvcnRlZEFubm90YXRpb25zLmluZGV4T2YodGhpcy5zZWxlY3RlZEFubm90YXRpb25zW3RoaXMuc2VsZWN0ZWRBbm5vdGF0aW9ucy5sZW5ndGgtMV0pO3RoaXMub25Sb3dDbGljay5lbWl0KGU8dD90aGlzLnNvcnRlZEFubm90YXRpb25zLnNsaWNlKGUsdCsxKTp0aGlzLnNvcnRlZEFubm90YXRpb25zLnNsaWNlKHQsZSsxKSl9fWVsc2UgdGhpcy5vblJvd0NsaWNrLmVtaXQoW2VdKX19SV90Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxJX3QpfSxJX3QuybVjbXA9dG8oe3R5cGU6SV90LHNlbGVjdG9yczpbWyJhbm5vdGF0aW9ucy1saXN0LWNvbXBvbmVudCJdXSxpbnB1dHM6e2Fubm90YXRpb25zOiJhbm5vdGF0aW9ucyIsZW1iZWRkaW5nRGF0YToiZW1iZWRkaW5nRGF0YSIsYW5ub3RhdGlvbnNFeHBhbmRlZDoiYW5ub3RhdGlvbnNFeHBhbmRlZCIsbnVtQW5ub3RhdGlvbnM6Im51bUFubm90YXRpb25zIixhbm5vdGF0aW9uU29ydDoiYW5ub3RhdGlvblNvcnQiLGFjdGl2ZU1ldHJpY3M6ImFjdGl2ZU1ldHJpY3MiLG51bUFjdGl2ZVJ1bnM6Im51bUFjdGl2ZVJ1bnMiLHNvcnRlZEFubm90YXRpb25zOiJzb3J0ZWRBbm5vdGF0aW9ucyIsc2VsZWN0ZWRBbm5vdGF0aW9uczoic2VsZWN0ZWRBbm5vdGF0aW9ucyIsbWF4Q291bnQ6Im1heENvdW50In0sb3V0cHV0czp7b25Sb3dDbGljazoib25Sb3dDbGljayJ9LGRlY2xzOjIsdmFyczozLGNvbnN0czpbWzMsIm51bUFubm90YXRpb25zIiwiZXhwYW5kZWQiXSxbNCwibmdJZiJdLFszLCJhbm5vdGF0aW9ucyIsIm51bUFubm90YXRpb25zIiwiYWN0aXZlTWV0cmljcyJdLFsibWluQnVmZmVyUHgiLCIzMDAiLCJtYXhCdWZmZXJQeCIsIjYwMCIsMSwiYW5ub3RhdGlvbi1yb3dzIiwzLCJpdGVtU2l6ZSJdLFszLCJkYXRhIiwiYWN0aXZlTWV0cmljcyIsIm51bUFjdGl2ZVJ1bnMiLCJtYXhDb3VudCIsImFubm90YXRpb24iLCJydW5IZWlnaHQiLCJoYXNFbWJlZGRpbmciLCJjbGljayIsNCwiY2RrVmlydHVhbEZvciIsImNka1ZpcnR1YWxGb3JPZiJdLFszLCJkYXRhIiwiYWN0aXZlTWV0cmljcyIsIm51bUFjdGl2ZVJ1bnMiLCJtYXhDb3VudCIsImFubm90YXRpb24iLCJydW5IZWlnaHQiLCJoYXNFbWJlZGRpbmciLCJjbGljayJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwibnBtaS1hbm5vdGF0aW9ucy1saXN0LXRvb2xiYXIiLDApLFFwKDEsel90LDUsNSwibmctY29udGFpbmVyIiwxKSksMiZlJiYoRG0oIm51bUFubm90YXRpb25zIixuLm51bUFubm90YXRpb25zKSgiZXhwYW5kZWQiLG4uYW5ub3RhdGlvbnNFeHBhbmRlZCkscmMoMSksRG0oIm5nSWYiLG4uYW5ub3RhdGlvbnNFeHBhbmRlZCkpfSxkaXJlY3RpdmVzOltfX3QsZE0sdl90LHdfdCxnRixkRixiRixUX3RdLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlcjoxcHggc29saWQgI2ViZWJlYjtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2hlaWdodDpjYWxjKDEwMCUgLSAycHgpO3dpZHRoOmNhbGMoMTAwJSAtIDJweCl9LmFubm90YXRpb24tcm93c1tfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4OjEgMTtvdmVyZmxvdy15OmF1dG99J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKElfdCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJhbm5vdGF0aW9ucy1saXN0LWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vYW5ub3RhdGlvbnNfbGlzdF9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9hbm5vdGF0aW9uc19saXN0X2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSxudWxsLHthbm5vdGF0aW9uczpbe3R5cGU6eHl9XSxlbWJlZGRpbmdEYXRhOlt7dHlwZTp4eX1dLGFubm90YXRpb25zRXhwYW5kZWQ6W3t0eXBlOnh5fV0sbnVtQW5ub3RhdGlvbnM6W3t0eXBlOnh5fV0sYW5ub3RhdGlvblNvcnQ6W3t0eXBlOnh5fV0sYWN0aXZlTWV0cmljczpbe3R5cGU6eHl9XSxudW1BY3RpdmVSdW5zOlt7dHlwZTp4eX1dLHNvcnRlZEFubm90YXRpb25zOlt7dHlwZTp4eX1dLHNlbGVjdGVkQW5ub3RhdGlvbnM6W3t0eXBlOnh5fV0sbWF4Q291bnQ6W3t0eXBlOnh5fV0sb25Sb3dDbGljazpbe3R5cGU6T3l9XX0pO2NsYXNzIEhfdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5hbm5vdGF0aW9uc0V4cGFuZGVkJD10aGlzLnN0b3JlLnBpcGUoRncoeWJ0KSksdGhpcy5hY3RpdmVSdW5zJD10aGlzLnN0b3JlLnBpcGUoRncoTk4pKS5waXBlKEl0KCh0PT50P0FycmF5LmZyb20odC5lbnRyaWVzKCkpLmZpbHRlcigodD0+dFsxXSkpLm1hcCgodD0+dFswXSkpOltdKSkpLHRoaXMuZW1iZWRkaW5nRGF0YSQ9dGhpcy5zdG9yZS5waXBlKEZ3KGxidCkpLHRoaXMubnVtQWN0aXZlUnVucyQ9dGhpcy5hY3RpdmVSdW5zJC5waXBlKEl0KCh0PT50Lmxlbmd0aCkpKSx0aGlzLmFjdGl2ZU1ldHJpY3MkPVd0KFt0aGlzLnN0b3JlLnNlbGVjdChzYnQpLHRoaXMuYWN0aXZlUnVucyQsdGhpcy5zdG9yZS5zZWxlY3QoZ2J0KV0pLnBpcGUoSXQoKChbdCxlLG5dKT0+e2xldCBvPVtdO2Zvcihjb25zdCBuIG9mIGUpdFtuXSYmKG89by5jb25jYXQodFtuXS5maWx0ZXIoKHQ9PmV5dCh0KSkpKSk7cmV0dXJuIG89Wy4uLm5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKG4pLC4uLm9dKV0sb30pKSksdGhpcy52aXNpYmxlQW5ub3RhdGlvbnMkPVd0KFt0aGlzLnN0b3JlLnNlbGVjdChyYnQpLHRoaXMuc3RvcmUuc2VsZWN0KHBidCksdGhpcy5zdG9yZS5zZWxlY3QoTWJ0KV0pLnBpcGUoSXQoKChbdCxlLG5dKT0+R3l0KHQsZSxuKSkpKSx0aGlzLmZpbHRlcmVkQW5ub3RhdGlvbnMkPVd0KFt0aGlzLnZpc2libGVBbm5vdGF0aW9ucyQsdGhpcy5zdG9yZS5zZWxlY3QoZmJ0KSx0aGlzLnN0b3JlLnNlbGVjdChnYnQpLHRoaXMuYWN0aXZlUnVucyQsdGhpcy5hY3RpdmVNZXRyaWNzJCx0aGlzLnN0b3JlLnNlbGVjdChtYnQpXSkucGlwZShJdCgoKFt0LGUsbixvLGksYV0pPT4oZnVuY3Rpb24gcih0LGUsbixvLGksYSl7Y29uc3Qgcj17fSxzPW5ldyBTZXQoZSksbD1uZXcgU2V0KGkubWFwKCh0PT5ueXQodCkpKSksYz1uZXcgUmVnRXhwKGEsImkiKTtyZXR1cm4gT2JqZWN0LmVudHJpZXModCkuZm9yRWFjaCgodD0+e2lmKCFjLnRlc3QodFswXSkpcmV0dXJuO2xldCBlPXRbMV07ZT1lLmZpbHRlcigodD0+cy5oYXModC5ydW4pJiZsLmhhcyh0Lm1ldHJpYykpKSwoZnVuY3Rpb24gaSh0LGUsbil7cmV0dXJuIHQuZXZlcnkoKHQ9PntpZih0LmtpbmQ9PT10YnQuT1BFUkFUT1IpcmV0dXJuITA7Y29uc3Qgbz1lW3QubWV0cmljXTtyZXR1cm4gdm9pZCAwPT09b3x8bi5zb21lKChlPT5lLm1ldHJpYz09PW55dCh0Lm1ldHJpYykmJihudWxsPT09ZS5uUE1JVmFsdWU/by5pbmNsdWRlTmFOOmUublBNSVZhbHVlPD1vLm1heCYmZS5uUE1JVmFsdWU+PW8ubWluKSkpfSkpfSkobixvLGUpJiYwIT09ZS5sZW5ndGgmJihyW3RbMF1dPWUpfSkpLHJ9KSh0LG8sZSxuLGksYSkpKSkucGlwZShFZSgpKSx0aGlzLm51bUFubm90YXRpb25zJD10aGlzLmZpbHRlcmVkQW5ub3RhdGlvbnMkLnBpcGUoSXQoKHQ9Pk9iamVjdC5rZXlzKHQpLmxlbmd0aCkpKSx0aGlzLnNvcnRlZEFubm90YXRpb25zJD1XdChbdGhpcy5maWx0ZXJlZEFubm90YXRpb25zJCx0aGlzLnN0b3JlLnBpcGUoRncoaGJ0KSksdGhpcy5lbWJlZGRpbmdEYXRhJF0pLnBpcGUoSXQoKChbdCxlLG5dKT0+KGZ1bmN0aW9uIG8odCxlLG4pe2NvbnN0IG89T2JqZWN0LmtleXModCksaT1lLm9yZGVyPT09bmJ0LkRJU1NJTUlMQVJ8fGUub3JkZXI9PT1uYnQuU0lNSUxBUjtyZXR1cm4iIj09PWUubWV0cmljfHwodm9pZCAwPT09bnx8dm9pZCAwPT09bi5wb2ludHNbZS5tZXRyaWNdKSYmaT9vOihmdW5jdGlvbiBzKHQsZSxuKXtyZXR1cm4gdC5zb3J0KG4/KHQsbik9PmVbdF0tZVtuXToodCxuKT0+ZVtuXS1lW3RdKX0pKG8saT8oZnVuY3Rpb24gYSh0LGUsbil7Y29uc3Qgbz17fTtsZXQgaT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksYT1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7bi5vcmRlcj09PW5idC5TSU1JTEFSJiYoaT1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksYT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO2Zvcihjb25zdCByIG9mIHQpb1tyXT1yPT09bi5tZXRyaWM/aTp2b2lkIDA9PT1lLnBvaW50c1tyXT9hOmUucG9pbnRzW3JdLnZlY3Rvcj9ReXQoZS5wb2ludHNbbi5tZXRyaWNdLnZlY3RvcixlLnBvaW50c1tyXS52ZWN0b3IsYSk6YTtyZXR1cm4gb30pKG8sbixlKTooZnVuY3Rpb24gcih0LGUsbil7Y29uc3Qgbz1ueXQobi5tZXRyaWMpLGk9e307aWYobi5vcmRlcj09PW5idC5ERVNDRU5ESU5HKWZvcihjb25zdCBuIG9mIHQpaVtuXT1NYXRoLm1heCguLi5lW25dLmZpbHRlcigodD0+dC5tZXRyaWM9PT1vKSkubWFwKCh0PT5udWxsPT09dC5uUE1JVmFsdWU/LTEvMDp0Lm5QTUlWYWx1ZSkpKTtlbHNlIGZvcihjb25zdCBuIG9mIHQpaVtuXT1NYXRoLm1pbiguLi5lW25dLmZpbHRlcigodD0+dC5tZXRyaWM9PT1vKSkubWFwKCh0PT5udWxsPT09dC5uUE1JVmFsdWU/MS8wOnQublBNSVZhbHVlKSkpO3JldHVybiBpfSkobyx0LGUpLGUub3JkZXI9PT1uYnQuQVNDRU5ETkd8fGUub3JkZXI9PT1uYnQuU0lNSUxBUil9KSh0LGUsbikpKSksdGhpcy5zZWxlY3RlZEFubm90YXRpb25zJD10aGlzLnN0b3JlLnBpcGUoRncoY2J0KSksdGhpcy5tYXhDb3VudCQ9dGhpcy5maWx0ZXJlZEFubm90YXRpb25zJC5waXBlKEl0KCh0PT57bGV0IGU9MDtyZXR1cm4gT2JqZWN0LnZhbHVlcyh0KS5mb3JFYWNoKCh0PT57dC5mb3JFYWNoKCh0PT57dC5jb3VudFZhbHVlJiYoZT1NYXRoLm1heChlLHQuY291bnRWYWx1ZSkpfSkpfSkpLGV9KSkpfXJvd0NsaWNrZWQodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChSYnQoe2Fubm90YXRpb25zOnR9KSl9fUhfdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SF90KShTbShJdykpfSxIX3QuybVjbXA9dG8oe3R5cGU6SF90LHNlbGVjdG9yczpbWyJucG1pLWFubm90YXRpb25zLWxpc3QiXV0sZGVjbHM6MTAsdmFyczoyNyxjb25zdHM6W1szLCJhbm5vdGF0aW9ucyIsImVtYmVkZGluZ0RhdGEiLCJhbm5vdGF0aW9uc0V4cGFuZGVkIiwibnVtQW5ub3RhdGlvbnMiLCJhY3RpdmVNZXRyaWNzIiwibnVtQWN0aXZlUnVucyIsInNvcnRlZEFubm90YXRpb25zIiwic2VsZWN0ZWRBbm5vdGF0aW9ucyIsIm1heENvdW50Iiwib25Sb3dDbGljayJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiYW5ub3RhdGlvbnMtbGlzdC1jb21wb25lbnQiLDApLFZtKCJvblJvd0NsaWNrIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5yb3dDbGlja2VkKGUpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBaCgzLCJhc3luYyIpLEFoKDQsImFzeW5jIiksQWgoNSwiYXN5bmMiKSxBaCg2LCJhc3luYyIpLEFoKDcsImFzeW5jIiksQWgoOCwiYXN5bmMiKSxBaCg5LCJhc3luYyIpLEFtKCkpLDImZSYmRG0oImFubm90YXRpb25zIixUaCgxLDksbi5maWx0ZXJlZEFubm90YXRpb25zJCkpKCJlbWJlZGRpbmdEYXRhIixUaCgyLDExLG4uZW1iZWRkaW5nRGF0YSQpKSgiYW5ub3RhdGlvbnNFeHBhbmRlZCIsVGgoMywxMyxuLmFubm90YXRpb25zRXhwYW5kZWQkKSkoIm51bUFubm90YXRpb25zIixUaCg0LDE1LG4ubnVtQW5ub3RhdGlvbnMkKSkoImFjdGl2ZU1ldHJpY3MiLFRoKDUsMTcsbi5hY3RpdmVNZXRyaWNzJCkpKCJudW1BY3RpdmVSdW5zIixUaCg2LDE5LG4ubnVtQWN0aXZlUnVucyQpKSgic29ydGVkQW5ub3RhdGlvbnMiLFRoKDcsMjEsbi5zb3J0ZWRBbm5vdGF0aW9ucyQpKSgic2VsZWN0ZWRBbm5vdGF0aW9ucyIsVGgoOCwyMyxuLnNlbGVjdGVkQW5ub3RhdGlvbnMkKSkoIm1heENvdW50IixUaCg5LDI1LG4ubWF4Q291bnQkKSl9LGRpcmVjdGl2ZXM6W0lfdF0scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEhfdCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJucG1pLWFubm90YXRpb25zLWxpc3QiLHRlbXBsYXRlOidcbiAgICA8YW5ub3RhdGlvbnMtbGlzdC1jb21wb25lbnRcbiAgICAgIFthbm5vdGF0aW9uc109ImZpbHRlcmVkQW5ub3RhdGlvbnMkIHwgYXN5bmMiXG4gICAgICBbZW1iZWRkaW5nRGF0YV09ImVtYmVkZGluZ0RhdGEkIHwgYXN5bmMiXG4gICAgICBbYW5ub3RhdGlvbnNFeHBhbmRlZF09ImFubm90YXRpb25zRXhwYW5kZWQkIHwgYXN5bmMiXG4gICAgICBbbnVtQW5ub3RhdGlvbnNdPSJudW1Bbm5vdGF0aW9ucyQgfCBhc3luYyJcbiAgICAgIFthY3RpdmVNZXRyaWNzXT0iYWN0aXZlTWV0cmljcyQgfCBhc3luYyJcbiAgICAgIFtudW1BY3RpdmVSdW5zXT0ibnVtQWN0aXZlUnVucyQgfCBhc3luYyJcbiAgICAgIFtzb3J0ZWRBbm5vdGF0aW9uc109InNvcnRlZEFubm90YXRpb25zJCB8IGFzeW5jIlxuICAgICAgW3NlbGVjdGVkQW5ub3RhdGlvbnNdPSJzZWxlY3RlZEFubm90YXRpb25zJCB8IGFzeW5jIlxuICAgICAgW21heENvdW50XT0ibWF4Q291bnQkIHwgYXN5bmMiXG4gICAgICAob25Sb3dDbGljayk9InJvd0NsaWNrZWQoJGV2ZW50KSJcbiAgICA+PC9hbm5vdGF0aW9ucy1saXN0LWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NvbnN0IEZfdD1bImNoYXJ0Il07Y2xhc3MgTF90e2NvbnN0cnVjdG9yKCl7dGhpcy53aWR0aD0wLHRoaXMuY2hhcnRXaWR0aD0wLHRoaXMuaGVpZ2h0PTMwMCx0aGlzLm1hcmdpbj17dG9wOjIwLHJpZ2h0OjQwLGJvdHRvbToyMCxsZWZ0OjQwfSx0aGlzLmNoYXJ0SGVpZ2h0PXRoaXMuaGVpZ2h0LXRoaXMubWFyZ2luLnRvcC10aGlzLm1hcmdpbi5ib3R0b219b25SZXNpemUodCl7dGhpcy5yZWRyYXcoKX1uZ0FmdGVyVmlld0luaXQoKXt0aGlzLnN2Zz1KNCh0aGlzLnN2Z0VsZW1lbnQubmF0aXZlRWxlbWVudCksdGhpcy5tYWluQ29udGFpbmVyPXRoaXMuc3ZnLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsYHRyYW5zbGF0ZSgke3RoaXMubWFyZ2luLmxlZnR9LCAke3RoaXMubWFyZ2luLnRvcH0pYCksdGhpcy5jb29yZGluYXRlc0dyb3VwPXRoaXMubWFpbkNvbnRhaW5lci5hcHBlbmQoImciKSx0aGlzLmxhYmVsc0dyb3VwPXRoaXMubWFpbkNvbnRhaW5lci5hcHBlbmQoImciKSx0aGlzLmF4aXNHcm91cD10aGlzLm1haW5Db250YWluZXIuYXBwZW5kKCJnIiksdGhpcy54U2NhbGU9VXR0KCkucGFkZGluZyguMSksdGhpcy55U2NhbGU9ZWV0KCkucmFuZ2UoW3RoaXMuY2hhcnRIZWlnaHQsMF0pLHRoaXMueUF4aXM9TjUodGhpcy55U2NhbGUpLHRoaXMucmVkcmF3KCl9bmdPbkNoYW5nZXModCl7dGhpcy5zdmcmJnRoaXMucmVkcmF3KCl9cmVkcmF3KCl7dGhpcy51cGRhdGVEaW1lbnNpb25zKCksdGhpcy51cGRhdGVBeGVzKCksdGhpcy5kcmF3KCl9dXBkYXRlRGltZW5zaW9ucygpe3RoaXMud2lkdGg9dGhpcy5zdmdFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGh8fDEwLHRoaXMuY2hhcnRXaWR0aD10aGlzLndpZHRoLXRoaXMubWFyZ2luLmxlZnQtdGhpcy5tYXJnaW4ucmlnaHR9dXBkYXRlQXhlcygpe3RoaXMueFNjYWxlLnJhbmdlUm91bmQoWzAsdGhpcy5jaGFydFdpZHRoXSkuZG9tYWluKHRoaXMuYWN0aXZlTWV0cmljcyksdGhpcy55U2NhbGUuZG9tYWluKFt0aGlzLmNvb3JkaW5hdGVEYXRhLmV4dHJlbWVzLm1pbix0aGlzLmNvb3JkaW5hdGVEYXRhLmV4dHJlbWVzLm1heF0pfWRyYXcoKXt0aGlzLmRyYXdBeGVzKCksdGhpcy5kcmF3QXhpc0xhYmVscygpLHRoaXMuZHJhd0Nvb3JkaW5hdGVzKCksdGhpcy5kcmF3TGFiZWxzKCl9ZHJhd0F4ZXMoKXtjb25zdCB0PXRoaXMuYXhpc0dyb3VwLnNlbGVjdEFsbCgiLmF4aXMteSIpLmRhdGEodGhpcy5hY3RpdmVNZXRyaWNzKTt0LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJheGlzLXkiKS5tZXJnZSh0KS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybmB0cmFuc2xhdGUoJHt0aGlzLnhTY2FsZSh0KX0sIDApYH0uYmluZCh0aGlzKSkuY2FsbCh0aGlzLnlBeGlzKSx0LmV4aXQoKS5yZW1vdmUoKX1kcmF3QXhpc0xhYmVscygpe2NvbnN0IHQ9dGhpcy5heGlzR3JvdXAuc2VsZWN0QWxsKCIuYXhpcy1iZy10ZXh0IikuZGF0YSh0aGlzLmFjdGl2ZU1ldHJpY3MpO3QuZW50ZXIoKS5hcHBlbmQoInRleHQiKS5hdHRyKCJjbGFzcyIsImF4aXMtYmctdGV4dCIpLmF0dHIoImZvbnQtc2l6ZSIsIjEzcHgiKS5hdHRyKCJzdHJva2Utd2lkdGgiLDIpLmF0dHIoInN0cm9rZS1saW5lam9pbiIsInJvdW5kIikuYXR0cigic3Ryb2tlIiwid2hpdGUiKS5tZXJnZSh0KS50ZXh0KCh0PT50KSkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbih0KXtyZXR1cm5gdHJhbnNsYXRlKCR7dGhpcy54U2NhbGUodCktNX0sICR7dGhpcy55U2NhbGUodGhpcy5jb29yZGluYXRlRGF0YS5leHRyZW1lcy5taW4pfSkgcm90YXRlKC05MClgfS5iaW5kKHRoaXMpKSx0LmV4aXQoKS5yZW1vdmUoKTtjb25zdCBlPXRoaXMuYXhpc0dyb3VwLnNlbGVjdEFsbCgiLmF4aXMtdGV4dCIpLmRhdGEodGhpcy5hY3RpdmVNZXRyaWNzKTtlLmVudGVyKCkuYXBwZW5kKCJ0ZXh0IikuYXR0cigiZm9udC1zaXplIiwiMTNweCIpLmF0dHIoImNsYXNzIiwiYXhpcy10ZXh0IikubWVyZ2UoZSkudGV4dCgodD0+dCkpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7cmV0dXJuYHRyYW5zbGF0ZSgke3RoaXMueFNjYWxlKHQpLTV9LCAke3RoaXMueVNjYWxlKHRoaXMuY29vcmRpbmF0ZURhdGEuZXh0cmVtZXMubWluKX0pIHJvdGF0ZSgtOTApYH0uYmluZCh0aGlzKSksZS5leGl0KCkucmVtb3ZlKCl9ZHJhd0Nvb3JkaW5hdGVzKCl7Y29uc3QgdD10aGlzLmNvb3JkaW5hdGVzR3JvdXAuc2VsZWN0QWxsKCIuY29vcmQiKS5kYXRhKHRoaXMuY29vcmRpbmF0ZURhdGEuY29vcmRpbmF0ZXMpO3QuZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5hdHRyKCJjbGFzcyIsImNvb3JkIikuYXR0cigiZmlsbCIsIm5vbmUiKS5tZXJnZSh0KS5hdHRyKCJkIix0aGlzLnBhdGguYmluZCh0aGlzKSkuYXR0cigic3Ryb2tlIixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jb2xvclNjYWxlKHQucnVuSWQpfS5iaW5kKHRoaXMpKSx0LmV4aXQoKS5yZW1vdmUoKTtjb25zdCBlPXRoaXMuY29vcmRpbmF0ZXNHcm91cC5zZWxlY3RBbGwoIi5oaWRkZW5Db29yZCIpLmRhdGEodGhpcy5jb29yZGluYXRlRGF0YS5jb29yZGluYXRlcyk7ZS5lbnRlcigpLmFwcGVuZCgicGF0aCIpLmF0dHIoImNsYXNzIiwiaGlkZGVuQ29vcmQiKS5hdHRyKCJzdHJva2Utd2lkdGgiLCIxMHB4IikuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJzdHJva2UiLCJyZ2JhKDAsIDAsIDAsIDAuMCkiKS5vbigibW91c2VvdmVyIix0aGlzLmhhbmRsZUNvb3JkaW5hdGVNb3VzZU92ZXIuYmluZCh0aGlzKSkub24oIm1vdXNlb3V0Iix0aGlzLmhhbmRsZUNvb3JkaW5hdGVNb3VzZU91dC5iaW5kKHRoaXMpKS5tZXJnZShlKS5hdHRyKCJkIix0aGlzLnBhdGguYmluZCh0aGlzKSksZS5leGl0KCkucmVtb3ZlKCl9cGF0aCh0KXtyZXR1cm4gdC52YWx1ZXMuc29ydCgoKHQsZSk9PnRoaXMuYWN0aXZlTWV0cmljcy5pbmRleE9mKHQubWV0cmljKS10aGlzLmFjdGl2ZU1ldHJpY3MuaW5kZXhPZihlLm1ldHJpYykpKSxQb3QoKSh0LnZhbHVlcy5tYXAoZnVuY3Rpb24odCl7bGV0IGU9dGhpcy55U2NhbGUodC5uUE1JVmFsdWUpO3JldHVyblt0aGlzLnhTY2FsZSh0Lm1ldHJpYyksZV19LmJpbmQodGhpcykpKX1oYW5kbGVDb29yZGluYXRlTW91c2VPdmVyKHQsZSl7dGhpcy5sYWJlbHNHcm91cC5zZWxlY3RBbGwoIi5jb29yZGluYXRlLWxhYmVsIikuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4hKGUuYW5ub3RhdGlvbj09PXQuYW5ub3RhdGlvbil9KSkuc3R5bGUoIm9wYWNpdHkiLC4xKSx0aGlzLmNvb3JkaW5hdGVzR3JvdXAuc2VsZWN0QWxsKCIuY29vcmQiKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiEoZS5hbm5vdGF0aW9uPT09dC5hbm5vdGF0aW9uKX0pKS5zdHlsZSgib3BhY2l0eSIsLjEpfWhhbmRsZUNvb3JkaW5hdGVNb3VzZU91dCgpe3RoaXMubGFiZWxzR3JvdXAuc2VsZWN0QWxsKCIuY29vcmRpbmF0ZS1sYWJlbCIpLnN0eWxlKCJvcGFjaXR5IiwxKSx0aGlzLmNvb3JkaW5hdGVzR3JvdXAuc2VsZWN0QWxsKCIuY29vcmQiKS5zdHlsZSgib3BhY2l0eSIsMSl9ZHJhd0xhYmVscygpe2NvbnN0IHQ9MzAvdGhpcy54U2NhbGUuc3RlcCgpLGU9dGhpcy5jb29yZGluYXRlRGF0YS5jb29yZGluYXRlcy5sZW5ndGg8MzA/dGhpcy5jb29yZGluYXRlRGF0YS5jb29yZGluYXRlczpbXSxuPXRoaXMubGFiZWxzR3JvdXAuc2VsZWN0QWxsKCIuY29vcmRpbmF0ZS1sYWJlbCIpLmRhdGEoZSk7bi5lbnRlcigpLmFwcGVuZCgidGV4dCIpLmF0dHIoImNsYXNzIiwiY29vcmRpbmF0ZS1sYWJlbCIpLmF0dHIoImZvbnQtc2l6ZSIsIjEwcHgiKS5tZXJnZShuKS50ZXh0KChmdW5jdGlvbih0KXtyZXR1cm4gdC5hbm5vdGF0aW9ufSkpLmF0dHIoIngiLHRoaXMueFNjYWxlKHRoaXMuYWN0aXZlTWV0cmljc1swXSkrMzApLmF0dHIoInkiLGZ1bmN0aW9uKGUpe2NvbnN0IG49dGhpcy55U2NhbGUoZS52YWx1ZXNbMF0ublBNSVZhbHVlP2UudmFsdWVzWzBdLm5QTUlWYWx1ZTowKSxvPXRoaXMueVNjYWxlKGUudmFsdWVzWzFdLm5QTUlWYWx1ZT9lLnZhbHVlc1sxXS5uUE1JVmFsdWU6MCk7cmV0dXJuKDEtdCkqbit0Km99LmJpbmQodGhpcykpLG4uZXhpdCgpLnJlbW92ZSgpfX1MX3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fExfdCl9LExfdC7JtWNtcD10byh7dHlwZTpMX3Qsc2VsZWN0b3JzOltbInBhcmFsbGVsLWNvb3JkaW5hdGVzLWNvbXBvbmVudCJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmUWgoRl90LDcsaGcpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uc3ZnRWxlbWVudD10LmZpcnN0KX19LGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgicmVzaXplIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblJlc2l6ZShlKX0pLCExLG9sKX0saW5wdXRzOnthY3RpdmVNZXRyaWNzOiJhY3RpdmVNZXRyaWNzIixjb29yZGluYXRlRGF0YToiY29vcmRpbmF0ZURhdGEiLHNpZGViYXJXaWR0aDoic2lkZWJhcldpZHRoIixjb2xvclNjYWxlOiJjb2xvclNjYWxlIn0sZmVhdHVyZXM6W0JvXSxkZWNsczoyLHZhcnM6MCxjb25zdHM6W1sxLCJwYy1jaGFydCJdLFsiY2hhcnQiLCIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKHFpKCksVG0oMCwic3ZnIiwwLDEpKX0sc3R5bGVzOlsiLnBjLWNoYXJ0W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MzAwcHg7d2lkdGg6MTAwJX0iXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoTF90LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InBhcmFsbGVsLWNvb3JkaW5hdGVzLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vcGFyYWxsZWxfY29vcmRpbmF0ZXNfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vcGFyYWxsZWxfY29vcmRpbmF0ZXNfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse2FjdGl2ZU1ldHJpY3M6W3t0eXBlOnh5fV0sY29vcmRpbmF0ZURhdGE6W3t0eXBlOnh5fV0sc2lkZWJhcldpZHRoOlt7dHlwZTp4eX1dLGNvbG9yU2NhbGU6W3t0eXBlOnh5fV0sc3ZnRWxlbWVudDpbe3R5cGU6WmEsYXJnczpbImNoYXJ0Iix7c3RhdGljOiEwLHJlYWQ6aGd9XX1dLG9uUmVzaXplOlt7dHlwZTp3eSxhcmdzOlsid2luZG93OnJlc2l6ZSIsWyIkZXZlbnQiXV19XX0pO2NsYXNzIEJfdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5hY3RpdmVSdW5zJD10aGlzLnN0b3JlLnBpcGUoRncoTk4pKS5waXBlKEl0KCh0PT50P0FycmF5LmZyb20odC5lbnRyaWVzKCkpLmZpbHRlcigodD0+dFsxXSkpLm1hcCgodD0+dFswXSkpOltdKSkpLHRoaXMuYWN0aXZlTWV0cmljcyQ9V3QodGhpcy5zdG9yZS5zZWxlY3Qoc2J0KSx0aGlzLmFjdGl2ZVJ1bnMkLHRoaXMuc3RvcmUuc2VsZWN0KGdidCkpLnBpcGUoSXQoKChbdCxlLG5dKT0+e2xldCBvPVtdO2Zvcihjb25zdCBuIG9mIGUpdFtuXSYmKG89by5jb25jYXQodFtuXS5maWx0ZXIoKHQ9PmV5dCh0KSkpKSk7cmV0dXJuIG89Wy4uLm5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKG4pLC4uLm9dKV0sby5tYXAoKHQ9Pm55dCh0KSkpfSkpKSx0aGlzLmNvb3JkaW5hdGVEYXRhJD1XdChbdGhpcy5zdG9yZS5zZWxlY3QocmJ0KSx0aGlzLnN0b3JlLnNlbGVjdChjYnQpLHRoaXMuYWN0aXZlUnVucyQsdGhpcy5hY3RpdmVNZXRyaWNzJF0pLnBpcGUoSXQoKChbdCxlLG4sb10pPT4oZnVuY3Rpb24gaSh0LGUsbixvKXtjb25zdCBpPVtdLGE9e21heDotMSxtaW46MX0scj1uZXcgU2V0KG4pLHM9bmV3IFNldChvKTtyZXR1cm4gMD09PXIuc2l6ZXx8MD09PXMuc2l6ZXx8MD09PU9iamVjdC5rZXlzKHQpLmxlbmd0aD97Y29vcmRpbmF0ZXM6W10sZXh0cmVtZXM6e21pbjotMSxtYXg6MX19OihlLmZvckVhY2goKGU9Pntjb25zdCBuPXt9O3RbZV0uZm9yRWFjaCgodD0+e3IuaGFzKHQucnVuKSYmcy5oYXModC5tZXRyaWMpJiYoblt0LnJ1bl0/blt0LnJ1bl0ucHVzaCh0KTpuW3QucnVuXT1bdF0sbnVsbCE9PXQublBNSVZhbHVlPyhhLm1heD1NYXRoLm1heChhLm1heCx0Lm5QTUlWYWx1ZSksYS5taW49TWF0aC5taW4oYS5taW4sdC5uUE1JVmFsdWUpKTooYS5tYXg9TWF0aC5tYXgoYS5tYXgsMCksYS5taW49TWF0aC5taW4oYS5taW4sMCkpKX0pKTtmb3IoY29uc3QgdCBvZiBPYmplY3Qua2V5cyhuKSlpLnB1c2goe2Fubm90YXRpb246ZSxydW5JZDp0LHZhbHVlczpuW3RdfSl9KSksYS5tYXg8YS5taW4mJihhLm1heD0xLGEubWluPS0xKSx7Y29vcmRpbmF0ZXM6aSxleHRyZW1lczphfSl9KSh0LGUsbixvKSkpKSx0aGlzLnNpZGViYXJXaWR0aCQ9dGhpcy5zdG9yZS5zZWxlY3QoeGJ0KSx0aGlzLnJ1bkNvbG9yU2NhbGUkPXRoaXMuc3RvcmUuc2VsZWN0KHpOKS5waXBlKEl0KCh0PT5lPT57aWYoIXQuaGFzT3duUHJvcGVydHkoZSkpdGhyb3cgbmV3IEVycm9yKGBbQ29sb3Igc2NhbGVdIHVua25vd24gcnVuSWQ6ICR7ZX0uYCk7cmV0dXJuIHRbZV19KSkpfX1mdW5jdGlvbiBWX3QodCxlKXsxJnQmJlRtKDAsIm1hdC1pY29uIiw5KX1mdW5jdGlvbiBqX3QodCxlKXsxJnQmJlRtKDAsIm1hdC1pY29uIiwxMCl9ZnVuY3Rpb24gVV90KHQsZSl7MSZ0JiZUbSgwLCJucG1pLXBhcmFsbGVsLWNvb3JkaW5hdGVzIil9Ql90Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxCX3QpKFNtKEl3KSl9LEJfdC7JtWNtcD10byh7dHlwZTpCX3Qsc2VsZWN0b3JzOltbIm5wbWktcGFyYWxsZWwtY29vcmRpbmF0ZXMiXV0sZGVjbHM6NSx2YXJzOjEyLGNvbnN0czpbWzMsImFjdGl2ZU1ldHJpY3MiLCJjb29yZGluYXRlRGF0YSIsInNpZGViYXJXaWR0aCIsImNvbG9yU2NhbGUiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFRtKDAsInBhcmFsbGVsLWNvb3JkaW5hdGVzLWNvbXBvbmVudCIsMCksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQWgoNCwiYXN5bmMiKSksMiZlJiZEbSgiYWN0aXZlTWV0cmljcyIsVGgoMSw0LG4uYWN0aXZlTWV0cmljcyQpKSgiY29vcmRpbmF0ZURhdGEiLFRoKDIsNixuLmNvb3JkaW5hdGVEYXRhJCkpKCJzaWRlYmFyV2lkdGgiLFRoKDMsOCxuLnNpZGViYXJXaWR0aCQpKSgiY29sb3JTY2FsZSIsVGgoNCwxMCxuLnJ1bkNvbG9yU2NhbGUkKSl9LGRpcmVjdGl2ZXM6W0xfdF0scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEJfdCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJucG1pLXBhcmFsbGVsLWNvb3JkaW5hdGVzIix0ZW1wbGF0ZTonXG4gICAgPHBhcmFsbGVsLWNvb3JkaW5hdGVzLWNvbXBvbmVudFxuICAgICAgW2FjdGl2ZU1ldHJpY3NdPSJhY3RpdmVNZXRyaWNzJCB8IGFzeW5jIlxuICAgICAgW2Nvb3JkaW5hdGVEYXRhXT0iY29vcmRpbmF0ZURhdGEkIHwgYXN5bmMiXG4gICAgICBbc2lkZWJhcldpZHRoXT0ic2lkZWJhcldpZHRoJCB8IGFzeW5jIlxuICAgICAgW2NvbG9yU2NhbGVdPSJydW5Db2xvclNjYWxlJCB8IGFzeW5jIlxuICAgID48L3BhcmFsbGVsLWNvb3JkaW5hdGVzLWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NsYXNzIEdfdHtjb25zdHJ1Y3Rvcigpe3RoaXMub25DbGVhclNlbGVjdGVkQW5ub3RhdGlvbnM9bmV3IExoLHRoaXMub25Ub2dnbGVFeHBhbmRlZD1uZXcgTGh9fUdfdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8R190KX0sR190Lsm1Y21wPXRvKHt0eXBlOkdfdCxzZWxlY3RvcnM6W1sic2VsZWN0ZWQtYW5ub3RhdGlvbnMtY29tcG9uZW50Il1dLGlucHV0czp7cGNFeHBhbmRlZDoicGNFeHBhbmRlZCIsc2VsZWN0ZWRBbm5vdGF0aW9uczoic2VsZWN0ZWRBbm5vdGF0aW9ucyJ9LG91dHB1dHM6e29uQ2xlYXJTZWxlY3RlZEFubm90YXRpb25zOiJvbkNsZWFyU2VsZWN0ZWRBbm5vdGF0aW9ucyIsb25Ub2dnbGVFeHBhbmRlZDoib25Ub2dnbGVFeHBhbmRlZCJ9LGRlY2xzOjExLHZhcnM6NCxjb25zdHM6ZnVuY3Rpb24oKXtsZXQgdCxlO3JldHVybiB0PSJ1bmRlZmluZWQiIT10eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUmJm5nSTE4bkNsb3N1cmVNb2RlP2dvb2cuZ2V0TXNnKCJDbGVhciBBbm5vdGF0aW9uIFNlbGVjdGlvbiIpOiRsb2NhbGl6ZWA6TGFiZWwgZm9yIGEgYnV0dG9uIHRoYXQgY2xlYXJzIHRoZSBhbm5vdGF0aW9uIHNlbGVjdGlvbi7ikJ8yYjUyMjg5ZjJjNGI3ZjViMTgyZWQyM2M5MTU0NzIyZWNkNDZhMmQ04pCfMjQ5NDY2MDUyMDM0MTMwODgzMDpDbGVhciBBbm5vdGF0aW9uIFNlbGVjdGlvbmAsZT0idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZT9nb29nLmdldE1zZygiRXhwYW5kL0hpZGUgU2VsZWN0ZWQgQW5ub3RhdGlvbnMiKTokbG9jYWxpemVgOkxhYmVsIGZvciBhIGJ1dHRvbiB0aGF0IGV4cGFuZHMgb3IgaGlkZXMgc2VsZWN0ZWQgYW5ub3RhdGlvbnMu4pCfOGY0YWQzMDVjMTllMzY1NWYzMTg5ZTNlMjY0ZTgzZmI3NmY3YmI5NeKQnzU2NzA3OTc3ODQwNzA5NTIwOTU6RXhwYW5kL0hpZGUgU2VsZWN0ZWQgQW5ub3RhdGlvbnNgLFtbMSwicGMtY29udGFpbmVyIl0sWzEsInBjLXRvb2xiYXIiXSxbMSwicGMtdGl0bGUiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLHQsInRpdGxlIiwiRGVzZWxlY3RzIGFsbCBzZWxlY3RlZCBhbm5vdGF0aW9ucy4iLDEsImNsZWFyLWJ1dHRvbiIsMywiZGlzYWJsZWQiLCJjbGljayJdLFsic3ZnSWNvbiIsImNsZWFyXzI0cHgiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLGUsMSwiZXhwYW5kLWJ1dHRvbiIsMywiY2xpY2siXSxbInN2Z0ljb24iLCJleHBhbmRfbGVzc18yNHB4IiwiY2xhc3MiLCJleHBhbmQtbGVzcy1pY29uIiw0LCJuZ0lmIiwibmdJZkVsc2UiXSxbIm5vdEV4cGFuZGVkIiwiIl0sWzQsIm5nSWYiXSxbInN2Z0ljb24iLCJleHBhbmRfbGVzc18yNHB4IiwxLCJleHBhbmQtbGVzcy1pY29uIl0sWyJzdmdJY29uIiwiZXhwYW5kX21vcmVfMjRweCIsMSwiZXhwYW5kLWljb24iXV19LHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihSbSgwLCJkaXYiLDApLFJtKDEsImRpdiIsMSksUm0oMiwiaDMiLDIpLGt1KDMsIlNlbGVjdGVkIEFubm90YXRpb25zIiksQW0oKSxSbSg0LCJidXR0b24iLDMpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkNsZWFyU2VsZWN0ZWRBbm5vdGF0aW9ucy5lbWl0KCl9KSksVG0oNSwibWF0LWljb24iLDQpLEFtKCksUm0oNiwiYnV0dG9uIiw1KSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25Ub2dnbGVFeHBhbmRlZC5lbWl0KCl9KSksUXAoNyxWX3QsMSwwLCJtYXQtaWNvbiIsNiksUXAoOCxqX3QsMSwwLCJuZy10ZW1wbGF0ZSIsbnVsbCw3LGliKSxBbSgpLEFtKCksUXAoMTAsVV90LDEsMCwibnBtaS1wYXJhbGxlbC1jb29yZGluYXRlcyIsOCksQW0oKSksMiZlKXtjb25zdCB0PSRwKDkpO3JjKDQpLERtKCJkaXNhYmxlZCIsMD09PW4uc2VsZWN0ZWRBbm5vdGF0aW9ucy5sZW5ndGgpLHJjKDMpLERtKCJuZ0lmIixuLnBjRXhwYW5kZWQpKCJuZ0lmRWxzZSIsdCkscmMoMyksRG0oIm5nSWYiLG4ucGNFeHBhbmRlZCl9fSxkaXJlY3RpdmVzOltYSCxEVyxkTSxCX3RdLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5wYy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICNlYmViZWJ9LnBjLXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmViO2Rpc3BsYXk6ZmxleDtoZWlnaHQ6NDJweDtwYWRkaW5nOjAgMTZweH0ucGMtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMDtkaXNwbGF5OmlubGluZTtmbGV4OjEgMX0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoR190LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InNlbGVjdGVkLWFubm90YXRpb25zLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vc2VsZWN0ZWRfYW5ub3RhdGlvbnNfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vc2VsZWN0ZWRfYW5ub3RhdGlvbnNfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse3BjRXhwYW5kZWQ6W3t0eXBlOnh5fV0sc2VsZWN0ZWRBbm5vdGF0aW9uczpbe3R5cGU6eHl9XSxvbkNsZWFyU2VsZWN0ZWRBbm5vdGF0aW9uczpbe3R5cGU6T3l9XSxvblRvZ2dsZUV4cGFuZGVkOlt7dHlwZTpPeX1dfSk7Y2xhc3MgV190e2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLnBjRXhwYW5kZWQkPXRoaXMuc3RvcmUucGlwZShGdyhiYnQpKSx0aGlzLnNlbGVjdGVkQW5ub3RhdGlvbnMkPXRoaXMuc3RvcmUuc2VsZWN0KGNidCl9Y2xlYXJTZWxlY3RlZEFubm90YXRpb25zKCl7dGhpcy5zdG9yZS5kaXNwYXRjaChUYnQoKSl9dG9nZ2xlRXhwYW5kZWQoKXt0aGlzLnN0b3JlLmRpc3BhdGNoKFVidCgpKX19ZnVuY3Rpb24gWV90KHQsZSl7MSZ0JiYoUm0oMCwiZGl2Iiw2KSxSbSgxLCJkaXYiLDcpLFRtKDIsIm5wbWktdmlvbGluLWZpbHRlcnMiLDgpLFJtKDMsImRpdiIsOSksVG0oNCwicnVucy1zZWxlY3RvciIpLEFtKCksQW0oKSxBbSgpKSwyJnQmJmR1KCJ3aWR0aCIsWW0oKS5zaWRlYmFyV2lkdGgsInB4Iil9ZnVuY3Rpb24gcV90KHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2IiwxMCksVm0oIm1vdXNlZG93biIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5yZXNpemVHcmFiYmVkLmVtaXQoKX0pKSxBbSgpfX1mdW5jdGlvbiBaX3QodCxlKXsxJnQmJihSbSgwLCJkaXYiLDExKSxUbSgxLCJucG1pLWFubm90YXRpb25zLWxpc3QiLDEyKSxUbSgyLCJucG1pLXNlbGVjdGVkLWFubm90YXRpb25zIiksQW0oKSl9ZnVuY3Rpb24gWF90KHQsZSl7MSZ0JiYoUm0oMCwiZGl2IiwxMyksa3UoMSwiWW91IG5lZWQgdG8gc2VsZWN0IGF0IGxlYXN0IG9uZSBydW4uIiksQW0oKSl9ZnVuY3Rpb24gS190KHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2IiwxNCksUm0oMSwiYnV0dG9uIiwxNSksVm0oImNsaWNrIiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgpLnRvZ2dsZVNpZGViYXJFeHBhbmRlZC5lbWl0KCl9KSksVG0oMiwibWF0LWljb24iLDE2KSxBbSgpLEFtKCl9fVdfdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8V190KShTbShJdykpfSxXX3QuybVjbXA9dG8oe3R5cGU6V190LHNlbGVjdG9yczpbWyJucG1pLXNlbGVjdGVkLWFubm90YXRpb25zIl1dLGRlY2xzOjMsdmFyczo2LGNvbnN0czpbWzMsInBjRXhwYW5kZWQiLCJzZWxlY3RlZEFubm90YXRpb25zIiwib25DbGVhclNlbGVjdGVkQW5ub3RhdGlvbnMiLCJvblRvZ2dsZUV4cGFuZGVkIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJzZWxlY3RlZC1hbm5vdGF0aW9ucy1jb21wb25lbnQiLDApLFZtKCJvbkNsZWFyU2VsZWN0ZWRBbm5vdGF0aW9ucyIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5jbGVhclNlbGVjdGVkQW5ub3RhdGlvbnMoKX0pKSgib25Ub2dnbGVFeHBhbmRlZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi50b2dnbGVFeHBhbmRlZCgpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBbSgpKSwyJmUmJkRtKCJwY0V4cGFuZGVkIixUaCgxLDIsbi5wY0V4cGFuZGVkJCkpKCJzZWxlY3RlZEFubm90YXRpb25zIixUaCgyLDQsbi5zZWxlY3RlZEFubm90YXRpb25zJCkpfSxkaXJlY3RpdmVzOltHX3RdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChXX3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibnBtaS1zZWxlY3RlZC1hbm5vdGF0aW9ucyIsdGVtcGxhdGU6J1xuICAgIDxzZWxlY3RlZC1hbm5vdGF0aW9ucy1jb21wb25lbnRcbiAgICAgIFtwY0V4cGFuZGVkXT0icGNFeHBhbmRlZCQgfCBhc3luYyJcbiAgICAgIFtzZWxlY3RlZEFubm90YXRpb25zXT0ic2VsZWN0ZWRBbm5vdGF0aW9ucyQgfCBhc3luYyJcbiAgICAgIChvbkNsZWFyU2VsZWN0ZWRBbm5vdGF0aW9ucyk9ImNsZWFyU2VsZWN0ZWRBbm5vdGF0aW9ucygpIlxuICAgICAgKG9uVG9nZ2xlRXhwYW5kZWQpPSJ0b2dnbGVFeHBhbmRlZCgpIlxuICAgID48L3NlbGVjdGVkLWFubm90YXRpb25zLWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NsYXNzIEpfdHtjb25zdHJ1Y3Rvcigpe3RoaXMudG9nZ2xlU2lkZWJhckV4cGFuZGVkPW5ldyBMaCx0aGlzLnJlc2l6ZVRyaWdnZXJlZD1uZXcgTGgsdGhpcy5yZXNpemVHcmFiYmVkPW5ldyBMaCx0aGlzLnJlc2l6ZVJlbGVhc2VkPW5ldyBMaH19Sl90Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxKX3QpfSxKX3QuybVjbXA9dG8oe3R5cGU6Sl90LHNlbGVjdG9yczpbWyJtYWluLWNvbXBvbmVudCJdXSxpbnB1dHM6e3J1bkFjdGl2ZToicnVuQWN0aXZlIixzaWRlYmFyRXhwYW5kZWQ6InNpZGViYXJFeHBhbmRlZCIsc2lkZWJhcldpZHRoOiJzaWRlYmFyV2lkdGgifSxvdXRwdXRzOnt0b2dnbGVTaWRlYmFyRXhwYW5kZWQ6InRvZ2dsZVNpZGViYXJFeHBhbmRlZCIscmVzaXplVHJpZ2dlcmVkOiJyZXNpemVUcmlnZ2VyZWQiLHJlc2l6ZUdyYWJiZWQ6InJlc2l6ZUdyYWJiZWQiLHJlc2l6ZVJlbGVhc2VkOiJyZXNpemVSZWxlYXNlZCJ9LGRlY2xzOjgsdmFyczo1LGNvbnN0czpmdW5jdGlvbigpe2xldCB0O3JldHVybiB0PSJ1bmRlZmluZWQiIT10eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUmJm5nSTE4bkNsb3N1cmVNb2RlP2dvb2cuZ2V0TXNnKCJUb2dnbGUgU2lkZWJhciIpOiRsb2NhbGl6ZWA6TGFiZWwgZm9yIGEgYnV0dG9uIHRoYXQgdG9nZ2xlcyB0aGUgc2lkZWJhci7ikJ9mNjNiNTc5MzJkMTc5Y2NhNjJhYzlmY2FlNjNkZDdmNWU2ZmEzODlm4pCfNDQ4NTAwOTM0NzQ0NDcwNDg3ODpUb2dnbGUgU2lkZWJhcmAsW1sxLCJjb250ZW50IiwzLCJtb3VzZXVwIiwibW91c2Vtb3ZlIl0sWyJjbGFzcyIsInNpZGViYXItY29udGFpbmVyIiwzLCJ3aWR0aCIsNCwibmdJZiJdLFsiY2xhc3MiLCJncmFiYmVyIiwzLCJtb3VzZWRvd24iLDQsIm5nSWYiXSxbImNsYXNzIiwiYW5hbHlzaXMtY29udGFpbmVyIiw0LCJuZ0lmIiwibmdJZkVsc2UiXSxbIm5vUnVuIiwiIl0sWyJjbGFzcyIsInNpZGUtdG9nZ2xlIiw0LCJuZ0lmIl0sWzEsInNpZGViYXItY29udGFpbmVyIl0sWzEsInNpZGViYXItY29udGVudHMiXSxbMSwidmlvbGluLWZpbHRlcnMiXSxbMSwicnVuLXNlbGVjdG9yIl0sWzEsImdyYWJiZXIiLDMsIm1vdXNlZG93biJdLFsxLCJhbmFseXNpcy1jb250YWluZXIiXSxbMSwiYW5ub3RhdGlvbnMtbGlzdCJdLFsxLCJub1J1biJdLFsxLCJzaWRlLXRvZ2dsZSJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsdCwzLCJjbGljayJdLFsic3ZnSWNvbiIsImNoZXZyb25fcmlnaHRfMjRweCJdXX0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmKFRtKDAsIm5wbWktZGF0YS1zZWxlY3Rpb24iKSxSbSgxLCJkaXYiLDApLFZtKCJtb3VzZXVwIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLnJlc2l6ZVJlbGVhc2VkLmVtaXQoKX0pKSgibW91c2Vtb3ZlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5yZXNpemVUcmlnZ2VyZWQuZW1pdChlKX0pKSxRcCgyLFlfdCw1LDIsImRpdiIsMSksUXAoMyxxX3QsMSwwLCJkaXYiLDIpLFFwKDQsWl90LDMsMCwiZGl2IiwzKSxRcCg1LFhfdCwyLDAsIm5nLXRlbXBsYXRlIixudWxsLDQsaWIpLEFtKCksUXAoNyxLX3QsMywwLCJkaXYiLDUpKSwyJmUpe2NvbnN0IHQ9JHAoNik7cmMoMiksRG0oIm5nSWYiLG4uc2lkZWJhckV4cGFuZGVkKSxyYygxKSxEbSgibmdJZiIsbi5zaWRlYmFyRXhwYW5kZWQpLHJjKDEpLERtKCJuZ0lmIiwhMD09PW4ucnVuQWN0aXZlKSgibmdJZkVsc2UiLHQpLHJjKDMpLERtKCJuZ0lmIiwhbi5zaWRlYmFyRXhwYW5kZWQpfX0sZGlyZWN0aXZlczpbVXl0LGRNLEp5dCxjMixIX3QsV190LFhILERXXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47aGVpZ2h0OjEwMCV9LmNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4OjE7bWluLWhlaWdodDowcHg7d2lkdGg6MTAwJX0uc2lkZWJhci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlO292ZXJmbG93OmhpZGRlbn0uc2lkZWJhci1jb250ZW50c1tfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCU7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MTUwcHh9LmFuYWx5c2lzLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtoZWlnaHQ6MTAwJTtmbGV4OjEgMX0ucnVuLXNlbGVjdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXttYXgtaGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0udmlvbGluLWZpbHRlcnNbX25nY29udGVudC0lQ09NUCVde21pbi1oZWlnaHQ6MHB4O3dpZHRoOjEwMCV9LnNpZGUtdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDozMHB4O2hlaWdodDozMHB4O3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MTBweDtib3R0b206MTBweDtib3JkZXI6MXB4IHNvbGlkICNlYmViZWI7Ym9yZGVyLXJhZGl1czozcHg7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5ncmFiYmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb250ZW50OiIiO2N1cnNvcjpldy1yZXNpemU7aGVpZ2h0OjEwMCU7d2lkdGg6M3B4O292ZXJmbG93OmhpZGRlbjtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0uYW5ub3RhdGlvbnMtbGlzdFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJTttaW4taGVpZ2h0OjBweDtmbGV4OjEgMX0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoSl90LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1haW4tY29tcG9uZW50Iix0ZW1wbGF0ZVVybDoiLi9tYWluX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyIuL21haW5fY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse3J1bkFjdGl2ZTpbe3R5cGU6eHl9XSxzaWRlYmFyRXhwYW5kZWQ6W3t0eXBlOnh5fV0sc2lkZWJhcldpZHRoOlt7dHlwZTp4eX1dLHRvZ2dsZVNpZGViYXJFeHBhbmRlZDpbe3R5cGU6T3l9XSxyZXNpemVUcmlnZ2VyZWQ6W3t0eXBlOk95fV0scmVzaXplR3JhYmJlZDpbe3R5cGU6T3l9XSxyZXNpemVSZWxlYXNlZDpbe3R5cGU6T3l9XX0pO2NsYXNzIFFfdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5ydW5BY3RpdmUkPXRoaXMuc3RvcmUucGlwZShGdyhOTikpLnBpcGUoSXQoKHQ9PiEhdCYmWy4uLnQudmFsdWVzKCldLmluY2x1ZGVzKCEwKSkpKSx0aGlzLnNpZGViYXJFeHBhbmRlZCQ9dGhpcy5zdG9yZS5waXBlKEZ3KF9idCkpLHRoaXMuc2lkZWJhcldpZHRoJD10aGlzLnN0b3JlLnBpcGUoRncoeGJ0KSksdGhpcy5yZXNpemluZz0hMX1vblRvZ2dsZVNpZGViYXJFeHBhbmRlZCgpe3RoaXMuc3RvcmUuZGlzcGF0Y2goV2J0KCkpfW9uUmVzaXplVHJpZ2dlcmVkKHQpe3RoaXMucmVzaXppbmcmJnRoaXMuc3RvcmUuZGlzcGF0Y2goWGJ0KHtzaWRlYmFyV2lkdGg6dC5jbGllbnRYfSkpfW9uUmVzaXplR3JhYmJlZCgpe3RoaXMucmVzaXppbmc9ITB9b25SZXNpemVSZWxlYXNlZCgpe3RoaXMucmVzaXppbmc9ITF9fWZ1bmN0aW9uICRfdCh0LGUpezEmdCYmKFJtKDAsImRpdiIsNiksUm0oMSwiZGl2Iiw3KSxSbSgyLCJkaXYiLDgpLFRtKDMsInJ1bnMtc2VsZWN0b3IiKSxBbSgpLEFtKCksQW0oKSksMiZ0JiZkdSgid2lkdGgiLFltKCkuc2lkZWJhcldpZHRoLCJweCIpfWZ1bmN0aW9uIHRDdCh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsImRpdiIsOSksVm0oIm1vdXNlZG93biIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5yZXNpemVHcmFiYmVkLmVtaXQoKX0pKSxBbSgpfX1mdW5jdGlvbiBlQ3QodCxlKXsxJnQmJihSbSgwLCJkaXYiLDEwKSxUbSgxLCJucG1pLWFubm90YXRpb25zLWxpc3QiLDExKSxUbSgyLCJucG1pLXNlbGVjdGVkLWFubm90YXRpb25zIiksQW0oKSl9ZnVuY3Rpb24gbkN0KHQsZSl7MSZ0JiYoUm0oMCwiZGl2IiwxMiksa3UoMSwiWW91IG5lZWQgdG8gc2VsZWN0IGF0IGxlYXN0IG9uZSBydW4uIiksQW0oKSl9ZnVuY3Rpb24gb0N0KHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2IiwxMyksUm0oMSwiYnV0dG9uIiwxNCksVm0oImNsaWNrIiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgpLnRvZ2dsZVNpZGViYXJFeHBhbmRlZC5lbWl0KCl9KSksVG0oMiwibWF0LWljb24iLDE1KSxBbSgpLEFtKCl9fVFfdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8UV90KShTbShJdykpfSxRX3QuybVjbXA9dG8oe3R5cGU6UV90LHNlbGVjdG9yczpbWyJucG1pLW1haW4iXV0sZGVjbHM6NCx2YXJzOjksY29uc3RzOltbMywicnVuQWN0aXZlIiwic2lkZWJhckV4cGFuZGVkIiwic2lkZWJhcldpZHRoIiwidG9nZ2xlU2lkZWJhckV4cGFuZGVkIiwicmVzaXplVHJpZ2dlcmVkIiwicmVzaXplR3JhYmJlZCIsInJlc2l6ZVJlbGVhc2VkIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJtYWluLWNvbXBvbmVudCIsMCksVm0oInRvZ2dsZVNpZGViYXJFeHBhbmRlZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblRvZ2dsZVNpZGViYXJFeHBhbmRlZCgpfSkpKCJyZXNpemVUcmlnZ2VyZWQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uUmVzaXplVHJpZ2dlcmVkKGUpfSkpKCJyZXNpemVHcmFiYmVkIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uUmVzaXplR3JhYmJlZCgpfSkpKCJyZXNpemVSZWxlYXNlZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblJlc2l6ZVJlbGVhc2VkKCl9KSksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQW0oKSksMiZlJiZEbSgicnVuQWN0aXZlIixUaCgxLDMsbi5ydW5BY3RpdmUkKSkoInNpZGViYXJFeHBhbmRlZCIsVGgoMiw1LG4uc2lkZWJhckV4cGFuZGVkJCkpKCJzaWRlYmFyV2lkdGgiLFRoKDMsNyxuLnNpZGViYXJXaWR0aCQpKX0sZGlyZWN0aXZlczpbSl90XSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUV90LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im5wbWktbWFpbiIsdGVtcGxhdGU6J1xuICAgIDxtYWluLWNvbXBvbmVudFxuICAgICAgW3J1bkFjdGl2ZV09InJ1bkFjdGl2ZSQgfCBhc3luYyJcbiAgICAgIFtzaWRlYmFyRXhwYW5kZWRdPSJzaWRlYmFyRXhwYW5kZWQkIHwgYXN5bmMiXG4gICAgICBbc2lkZWJhcldpZHRoXT0ic2lkZWJhcldpZHRoJCB8IGFzeW5jIlxuICAgICAgKHRvZ2dsZVNpZGViYXJFeHBhbmRlZCk9Im9uVG9nZ2xlU2lkZWJhckV4cGFuZGVkKCkiXG4gICAgICAocmVzaXplVHJpZ2dlcmVkKT0ib25SZXNpemVUcmlnZ2VyZWQoJGV2ZW50KSJcbiAgICAgIChyZXNpemVHcmFiYmVkKT0ib25SZXNpemVHcmFiYmVkKCkiXG4gICAgICAocmVzaXplUmVsZWFzZWQpPSJvblJlc2l6ZVJlbGVhc2VkKCkiXG4gICAgPjwvbWFpbi1jb21wb25lbnQ+XG4gICcsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSxudWxsKTtjbGFzcyBpQ3R7Y29uc3RydWN0b3IoKXt0aGlzLnRvZ2dsZVNpZGViYXJFeHBhbmRlZD1uZXcgTGgsdGhpcy5yZXNpemVUcmlnZ2VyZWQ9bmV3IExoLHRoaXMucmVzaXplR3JhYmJlZD1uZXcgTGgsdGhpcy5yZXNpemVSZWxlYXNlZD1uZXcgTGh9fWlDdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8aUN0KX0saUN0Lsm1Y21wPXRvKHt0eXBlOmlDdCxzZWxlY3RvcnM6W1siZW1iZWRkaW5ncy1jb21wb25lbnQiXV0saW5wdXRzOntydW5BY3RpdmU6InJ1bkFjdGl2ZSIsc2lkZWJhckV4cGFuZGVkOiJzaWRlYmFyRXhwYW5kZWQiLHNpZGViYXJXaWR0aDoic2lkZWJhcldpZHRoIn0sb3V0cHV0czp7dG9nZ2xlU2lkZWJhckV4cGFuZGVkOiJ0b2dnbGVTaWRlYmFyRXhwYW5kZWQiLHJlc2l6ZVRyaWdnZXJlZDoicmVzaXplVHJpZ2dlcmVkIixyZXNpemVHcmFiYmVkOiJyZXNpemVHcmFiYmVkIixyZXNpemVSZWxlYXNlZDoicmVzaXplUmVsZWFzZWQifSxkZWNsczo4LHZhcnM6NSxjb25zdHM6ZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gdD0idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZT9nb29nLmdldE1zZygiVG9nZ2xlIFNpZGViYXIiKTokbG9jYWxpemVgOkxhYmVsIGZvciBhIGJ1dHRvbiB0aGF0IHRvZ2dsZXMgdGhlIHNpZGViYXIu4pCfZjYzYjU3OTMyZDE3OWNjYTYyYWM5ZmNhZTYzZGQ3ZjVlNmZhMzg5ZuKQnzQ0ODUwMDkzNDc0NDQ3MDQ4Nzg6VG9nZ2xlIFNpZGViYXJgLFtbMSwiY29udGVudCIsMywibW91c2V1cCIsIm1vdXNlbW92ZSJdLFsiY2xhc3MiLCJzaWRlYmFyLWNvbnRhaW5lciIsMywid2lkdGgiLDQsIm5nSWYiXSxbImNsYXNzIiwiZ3JhYmJlciIsMywibW91c2Vkb3duIiw0LCJuZ0lmIl0sWyJjbGFzcyIsImFuYWx5c2lzLWNvbnRhaW5lciIsNCwibmdJZiIsIm5nSWZFbHNlIl0sWyJub1J1biIsIiJdLFsiY2xhc3MiLCJzaWRlLXRvZ2dsZSIsNCwibmdJZiJdLFsxLCJzaWRlYmFyLWNvbnRhaW5lciJdLFsxLCJzaWRlYmFyLWNvbnRlbnRzIl0sWzEsInJ1bi1zZWxlY3RvciJdLFsxLCJncmFiYmVyIiwzLCJtb3VzZWRvd24iXSxbMSwiYW5hbHlzaXMtY29udGFpbmVyIl0sWzEsImFubm90YXRpb25zLWxpc3QiXSxbMSwibm9SdW4iXSxbMSwic2lkZS10b2dnbGUiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLHQsMywiY2xpY2siXSxbInN2Z0ljb24iLCJjaGV2cm9uX3JpZ2h0XzI0cHgiXV19LHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihUbSgwLCJucG1pLWRhdGEtc2VsZWN0aW9uIiksUm0oMSwiZGl2IiwwKSxWbSgibW91c2V1cCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5yZXNpemVSZWxlYXNlZC5lbWl0KCl9KSkoIm1vdXNlbW92ZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ucmVzaXplVHJpZ2dlcmVkLmVtaXQoZSl9KSksUXAoMiwkX3QsNCwyLCJkaXYiLDEpLFFwKDMsdEN0LDEsMCwiZGl2IiwyKSxRcCg0LGVDdCwzLDAsImRpdiIsMyksUXAoNSxuQ3QsMiwwLCJuZy10ZW1wbGF0ZSIsbnVsbCw0LGliKSxBbSgpLFFwKDcsb0N0LDMsMCwiZGl2Iiw1KSksMiZlKXtjb25zdCB0PSRwKDYpO3JjKDIpLERtKCJuZ0lmIixuLnNpZGViYXJFeHBhbmRlZCkscmMoMSksRG0oIm5nSWYiLG4uc2lkZWJhckV4cGFuZGVkKSxyYygxKSxEbSgibmdJZiIsITA9PT1uLnJ1bkFjdGl2ZSkoIm5nSWZFbHNlIix0KSxyYygzKSxEbSgibmdJZiIsIW4uc2lkZWJhckV4cGFuZGVkKX19LGRpcmVjdGl2ZXM6W1V5dCxkTSxjMixIX3QsV190LFhILERXXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47aGVpZ2h0OjEwMCV9LmNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4OjE7bWluLWhlaWdodDowcHg7d2lkdGg6MTAwJX0uc2lkZWJhci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlO292ZXJmbG93OmhpZGRlbn0uc2lkZWJhci1jb250ZW50c1tfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCU7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MTUwcHh9LmFuYWx5c2lzLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtoZWlnaHQ6MTAwJTtmbGV4OjEgMX0ucnVuLXNlbGVjdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXttYXgtaGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uc2lkZS10b2dnbGVbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjMwcHg7aGVpZ2h0OjMwcHg7cG9zaXRpb246YWJzb2x1dGU7bGVmdDoxMHB4O2JvdHRvbToxMHB4O2JvcmRlcjoxcHggc29saWQgI2ViZWJlYjtib3JkZXItcmFkaXVzOjNweDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXJ9LmdyYWJiZXJbX25nY29udGVudC0lQ09NUCVde2NvbnRlbnQ6IiI7Y3Vyc29yOmV3LXJlc2l6ZTtoZWlnaHQ6MTAwJTt3aWR0aDozcHg7b3ZlcmZsb3c6aGlkZGVuO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5hbm5vdGF0aW9ucy1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlO21pbi1oZWlnaHQ6MHB4O2ZsZXg6MSAxfSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChpQ3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiZW1iZWRkaW5ncy1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiIuL2VtYmVkZGluZ3NfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vZW1iZWRkaW5nc19jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7cnVuQWN0aXZlOlt7dHlwZTp4eX1dLHNpZGViYXJFeHBhbmRlZDpbe3R5cGU6eHl9XSxzaWRlYmFyV2lkdGg6W3t0eXBlOnh5fV0sdG9nZ2xlU2lkZWJhckV4cGFuZGVkOlt7dHlwZTpPeX1dLHJlc2l6ZVRyaWdnZXJlZDpbe3R5cGU6T3l9XSxyZXNpemVHcmFiYmVkOlt7dHlwZTpPeX1dLHJlc2l6ZVJlbGVhc2VkOlt7dHlwZTpPeX1dfSk7Y2xhc3MgYUN0e2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLnJ1bkFjdGl2ZSQ9dGhpcy5zdG9yZS5waXBlKEZ3KE5OKSkucGlwZShJdCgodD0+ISF0JiZbLi4udC52YWx1ZXMoKV0uaW5jbHVkZXMoITApKSkpLHRoaXMuc2lkZWJhckV4cGFuZGVkJD10aGlzLnN0b3JlLnBpcGUoRncod2J0KSksdGhpcy5zaWRlYmFyV2lkdGgkPXRoaXMuc3RvcmUucGlwZShGdyhQYnQpKSx0aGlzLnJlc2l6aW5nPSExfW9uVG9nZ2xlU2lkZWJhckV4cGFuZGVkKCl7dGhpcy5zdG9yZS5kaXNwYXRjaChKYnQoKSl9b25SZXNpemVUcmlnZ2VyZWQodCl7dGhpcy5yZXNpemluZyYmdGhpcy5zdG9yZS5kaXNwYXRjaChLYnQoe3NpZGViYXJXaWR0aDp0LmNsaWVudFh9KSl9b25SZXNpemVHcmFiYmVkKCl7dGhpcy5yZXNpemluZz0hMH1vblJlc2l6ZVJlbGVhc2VkKCl7dGhpcy5yZXNpemluZz0hMX19ZnVuY3Rpb24gckN0KHQsZSl7MSZ0JiZUbSgwLCJucG1pLWluYWN0aXZlLXZpZXciKX1mdW5jdGlvbiBzQ3QodCxlKXsxJnQmJlRtKDAsIm5wbWktbWFpbiIpfWZ1bmN0aW9uIGxDdCh0LGUpezEmdCYmVG0oMCwibnBtaS1lbWJlZGRpbmdzIil9ZnVuY3Rpb24gY0N0KHQsZSl7aWYoMSZ0JiYoUXAoMCxzQ3QsMSwwLCJucG1pLW1haW4iLDMpLFFwKDEsbEN0LDEsMCwibnBtaS1lbWJlZGRpbmdzIiwzKSksMiZ0KXtjb25zdCB0PVltKCk7RG0oIm5nSWYiLHQuYWN0aXZlVmlldz09PXQuVmlld0FjdGl2ZS5ERUZBVUxUKSxyYygxKSxEbSgibmdJZiIsdC5hY3RpdmVWaWV3PT09dC5WaWV3QWN0aXZlLkVNQkVERElOR1MpfX1hQ3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGFDdCkoU20oSXcpKX0sYUN0Lsm1Y21wPXRvKHt0eXBlOmFDdCxzZWxlY3RvcnM6W1sibnBtaS1lbWJlZGRpbmdzIl1dLGRlY2xzOjQsdmFyczo5LGNvbnN0czpbWzMsInJ1bkFjdGl2ZSIsInNpZGViYXJFeHBhbmRlZCIsInNpZGViYXJXaWR0aCIsInRvZ2dsZVNpZGViYXJFeHBhbmRlZCIsInJlc2l6ZVRyaWdnZXJlZCIsInJlc2l6ZUdyYWJiZWQiLCJyZXNpemVSZWxlYXNlZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiZW1iZWRkaW5ncy1jb21wb25lbnQiLDApLFZtKCJ0b2dnbGVTaWRlYmFyRXhwYW5kZWQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25Ub2dnbGVTaWRlYmFyRXhwYW5kZWQoKX0pKSgicmVzaXplVHJpZ2dlcmVkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblJlc2l6ZVRyaWdnZXJlZChlKX0pKSgicmVzaXplR3JhYmJlZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblJlc2l6ZUdyYWJiZWQoKX0pKSgicmVzaXplUmVsZWFzZWQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25SZXNpemVSZWxlYXNlZCgpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBaCgzLCJhc3luYyIpLEFtKCkpLDImZSYmRG0oInJ1bkFjdGl2ZSIsVGgoMSwzLG4ucnVuQWN0aXZlJCkpKCJzaWRlYmFyRXhwYW5kZWQiLFRoKDIsNSxuLnNpZGViYXJFeHBhbmRlZCQpKSgic2lkZWJhcldpZHRoIixUaCgzLDcsbi5zaWRlYmFyV2lkdGgkKSl9LGRpcmVjdGl2ZXM6W2lDdF0scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGFDdCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJucG1pLWVtYmVkZGluZ3MiLHRlbXBsYXRlOidcbiAgICA8ZW1iZWRkaW5ncy1jb21wb25lbnRcbiAgICAgIFtydW5BY3RpdmVdPSJydW5BY3RpdmUkIHwgYXN5bmMiXG4gICAgICBbc2lkZWJhckV4cGFuZGVkXT0ic2lkZWJhckV4cGFuZGVkJCB8IGFzeW5jIlxuICAgICAgW3NpZGViYXJXaWR0aF09InNpZGViYXJXaWR0aCQgfCBhc3luYyJcbiAgICAgICh0b2dnbGVTaWRlYmFyRXhwYW5kZWQpPSJvblRvZ2dsZVNpZGViYXJFeHBhbmRlZCgpIlxuICAgICAgKHJlc2l6ZVRyaWdnZXJlZCk9Im9uUmVzaXplVHJpZ2dlcmVkKCRldmVudCkiXG4gICAgICAocmVzaXplR3JhYmJlZCk9Im9uUmVzaXplR3JhYmJlZCgpIlxuICAgICAgKHJlc2l6ZVJlbGVhc2VkKT0ib25SZXNpemVSZWxlYXNlZCgpIlxuICAgID48L2VtYmVkZGluZ3MtY29tcG9uZW50PlxuICAnLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y2xhc3MgZEN0e2NvbnN0cnVjdG9yKCl7dGhpcy5WaWV3QWN0aXZlPWVidH19ZEN0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxkQ3QpfSxkQ3QuybVjbXA9dG8oe3R5cGU6ZEN0LHNlbGVjdG9yczpbWyJucG1pLWNvbXBvbmVudCJdXSxpbnB1dHM6e3J1bnM6InJ1bnMiLGFjdGl2ZVZpZXc6ImFjdGl2ZVZpZXcifSxkZWNsczo0LHZhcnM6Mixjb25zdHM6W1sxLCJucG1pLWNvbnRhaW5lciJdLFs0LCJuZ0lmIiwibmdJZkVsc2UiXSxbImRhdGFBdmFpbGFibGUiLCIiXSxbNCwibmdJZiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoUm0oMCwiZGl2IiwwKSxRcCgxLHJDdCwxLDAsIm5wbWktaW5hY3RpdmUtdmlldyIsMSksUXAoMixjQ3QsMiwyLCJuZy10ZW1wbGF0ZSIsbnVsbCwyLGliKSxBbSgpKSwyJmUpe2NvbnN0IHQ9JHAoMyk7cmMoMSksRG0oIm5nSWYiLDA9PT1uLnJ1bnMuc2l6ZSkoIm5nSWZFbHNlIix0KX19LGRpcmVjdGl2ZXM6W2RNLG9idCxRX3QsYUN0XSxzdHlsZXM6WyJbX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtoZWlnaHQ6MTAwJX0ubnBtaS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MSAxfSJdLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChkQ3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibnBtaS1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiIuL25wbWlfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vbnBtaV9jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7cnVuczpbe3R5cGU6eHl9XSxhY3RpdmVWaWV3Olt7dHlwZTp4eX1dfSk7Y2xhc3MgcEN0e2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLnJ1bnMkPXRoaXMuc3RvcmUucGlwZShGdyhOTikpLHRoaXMuYWN0aXZlVmlldyQ9dGhpcy5zdG9yZS5waXBlKEZ3KHZidCkpfW5nT25Jbml0KCl7dGhpcy5zdG9yZS5kaXNwYXRjaChrYnQoKSl9fXBDdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8cEN0KShTbShJdykpfSxwQ3QuybVjbXA9dG8oe3R5cGU6cEN0LHNlbGVjdG9yczpbWyJucG1pIl1dLGRlY2xzOjMsdmFyczo2LGNvbnN0czpbWzMsInJ1bnMiLCJhY3RpdmVWaWV3Il1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihUbSgwLCJucG1pLWNvbXBvbmVudCIsMCksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpKSwyJmUmJkRtKCJydW5zIixUaCgxLDIsbi5ydW5zJCkpKCJhY3RpdmVWaWV3IixUaCgyLDQsbi5hY3RpdmVWaWV3JCkpfSxkaXJlY3RpdmVzOltkQ3RdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChwQ3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibnBtaSIsdGVtcGxhdGU6J1xuICAgIDxucG1pLWNvbXBvbmVudFxuICAgICAgW3J1bnNdPSJydW5zJCB8IGFzeW5jIlxuICAgICAgW2FjdGl2ZVZpZXddPSJhY3RpdmVWaWV3JCB8IGFzeW5jIlxuICAgID48L25wbWktY29tcG9uZW50PlxuICAnfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO3ZhciBtQ3Q9e30sdUN0PXt9LGZDdD17fSxnQ3Q9e30saEN0PVF2JiZRdi5fX3ZhbHVlc3x8ZnVuY3Rpb24odCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdLG49MDtyZXR1cm4gZT9lLmNhbGwodCk6e25leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdCYmbj49dC5sZW5ndGgmJih0PXZvaWQgMCkse3ZhbHVlOnQmJnRbbisrXSxkb25lOiF0fX19fTtmdW5jdGlvbiBiQ3QodCxlKXtyZXR1cm4gTWF0aC5mbG9vcihlKCkqdCl9ZnVuY3Rpb24geUN0KHQpe2Zvcih2YXIgZT1bXSxuPTA7bjx0O24rKyllLnB1c2godm9pZCAwKTtyZXR1cm4gZX1mdW5jdGlvbiBfQ3QodCxlKXtyZXR1cm4geUN0KHQpLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm4gZX0pKX1mdW5jdGlvbiBDQ3QodCl7cmV0dXJuIF9DdCh0LDApfWZ1bmN0aW9uIE1DdCh0KXtyZXR1cm4gdC5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZX0pKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZ0N0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxnQ3QudGF1UmFuZEludD1iQ3QsZ0N0LnRhdVJhbmQ9ZnVuY3Rpb24gdkN0KHQpe3JldHVybiB0KCl9LGdDdC5ub3JtPWZ1bmN0aW9uIHhDdCh0KXt2YXIgZSxuLG89MDt0cnl7Zm9yKHZhciBpPWhDdCh0KSxhPWkubmV4dCgpOyFhLmRvbmU7YT1pLm5leHQoKSlvKz1NYXRoLnBvdyhhLnZhbHVlLDIpfWNhdGNoKHQpe2U9e2Vycm9yOnR9fWZpbmFsbHl7dHJ5e2EmJiFhLmRvbmUmJihuPWkucmV0dXJuKSYmbi5jYWxsKGkpfWZpbmFsbHl7aWYoZSl0aHJvdyBlLmVycm9yfX1yZXR1cm4gTWF0aC5zcXJ0KG8pfSxnQ3QuZW1wdHk9eUN0LGdDdC5yYW5nZT1mdW5jdGlvbiBPQ3QodCl7cmV0dXJuIHlDdCh0KS5tYXAoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV9KSl9LGdDdC5maWxsZWQ9X0N0LGdDdC56ZXJvcz1DQ3QsZ0N0Lm9uZXM9ZnVuY3Rpb24gUEN0KHQpe3JldHVybiBfQ3QodCwxKX0sZ0N0LmxpbmVhcj1mdW5jdGlvbiB3Q3QodCxlLG4pe3JldHVybiB5Q3QobikubWFwKChmdW5jdGlvbihvLGkpe3JldHVybiB0K2kqKChlLXQpLyhuLTEpKX0pKX0sZ0N0LnN1bT1NQ3QsZ0N0Lm1lYW49ZnVuY3Rpb24ga0N0KHQpe3JldHVybiBNQ3QodCkvdC5sZW5ndGh9LGdDdC5tYXg9ZnVuY3Rpb24gU0N0KHQpe2Zvcih2YXIgZT0wLG49MDtuPHQubGVuZ3RoO24rKyllPXRbbl0+ZT90W25dOmU7cmV0dXJuIGV9LGdDdC5tYXgyZD1mdW5jdGlvbiBEQ3QodCl7Zm9yKHZhciBlPTAsbj0wO248dC5sZW5ndGg7bisrKWZvcih2YXIgbz0wO288dFtuXS5sZW5ndGg7bysrKWU9dFtuXVtvXT5lP3Rbbl1bb106ZTtyZXR1cm4gZX0sZ0N0LnJlamVjdGlvblNhbXBsZT1mdW5jdGlvbiBFQ3QodCxlLG4pe2Zvcih2YXIgbz1DQ3QodCksaT0wO2k8dDtpKyspZm9yKHZhciBhPSEwO2E7KXtmb3IodmFyIHI9YkN0KGUsbikscz0hMSxsPTA7bDxpO2wrKylpZihyPT09b1tsXSl7cz0hMDticmVha31zfHwoYT0hMSksb1tpXT1yfXJldHVybiBvfSxnQ3QucmVzaGFwZTJkPWZ1bmN0aW9uIFJDdCh0LGUsbil7dmFyIG89W10saT0wO2lmKHQubGVuZ3RoIT09ZSpuKXRocm93IG5ldyBFcnJvcigiQXJyYXkgZGltZW5zaW9ucyBtdXN0IG1hdGNoIGlucHV0IGxlbmd0aC4iKTtmb3IodmFyIGE9MDthPGU7YSsrKXtmb3IodmFyIHI9W10scz0wO3M8bjtzKyspci5wdXNoKHRbaV0pLGkrPTE7by5wdXNoKHIpfXJldHVybiBvfTt2YXIgQUN0PVF2JiZRdi5fX2ltcG9ydFN0YXJ8fGZ1bmN0aW9uKHQpe2lmKHQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgZT17fTtpZihudWxsIT10KWZvcih2YXIgbiBpbiB0KU9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJihlW25dPXRbbl0pO3JldHVybiBlLmRlZmF1bHQ9dCxlfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZkN0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgVEN0PUFDdChnQ3QpO2Z1bmN0aW9uIE5DdCh0LGUpe3ZhciBuPWZ1bmN0aW9uKG4pe3JldHVybiBUQ3QuZW1wdHkodCkubWFwKChmdW5jdGlvbigpe3JldHVybiBUQ3QuZmlsbGVkKGUsbil9KSl9LG89W107cmV0dXJuIG8ucHVzaChuKC0xKSksby5wdXNoKG4oMS8wKSksby5wdXNoKG4oMCkpLG99ZnVuY3Rpb24gekN0KHQsZSxuLG8saSl7ZT1NYXRoLmZsb29yKGUpO3ZhciBhPXRbMF1bZV07aWYobj49dFsxXVtlXVswXSlyZXR1cm4gMDtmb3IodmFyIHI9MDtyPGEubGVuZ3RoO3IrKylpZihvPT09YVtyXSlyZXR1cm4gMDtyZXR1cm4gSUN0KHQsZSxuLG8saSl9ZnVuY3Rpb24gSUN0KHQsZSxuLG8saSl7dmFyIGE9dFswXVtlXSxyPXRbMV1bZV0scz10WzJdW2VdO2lmKG4+PXJbMF0pcmV0dXJuIDA7clswXT1uLGFbMF09byxzWzBdPWk7Zm9yKHZhciBsPTAsYz0wOzspe3ZhciBkPTIqbCsxLHA9ZCsxLG09dFswXVswXS5sZW5ndGg7aWYoZD49bSlicmVhaztpZihwPj1tKXtpZighKHJbZF0+bikpYnJlYWs7Yz1kfWVsc2UgaWYocltkXT49cltwXSl7aWYoIShuPHJbZF0pKWJyZWFrO2M9ZH1lbHNle2lmKCEobjxyW3BdKSlicmVhaztjPXB9cltsXT1yW2NdLGFbbF09YVtjXSxzW2xdPXNbY10sbD1jfXJldHVybiByW2xdPW4sYVtsXT1vLHNbbF09aSwxfWZ1bmN0aW9uIEhDdCh0LGUsbixvKXtmb3IoOzIqbysxPG47KXt2YXIgaT0yKm8rMSxhPWkrMSxyPW87aWYodFtyXTx0W2ldJiYocj1pKSxhPG4mJnRbcl08dFthXSYmKHI9YSkscj09PW8pYnJlYWs7dmFyIHM9dFtvXTt0W29dPXRbcl0sdFtyXT1zO3ZhciBsPWVbb107ZVtvXT1lW3JdLGVbcl09bCxvPXJ9fWZDdC5tYWtlSGVhcD1OQ3QsZkN0LnJlamVjdGlvblNhbXBsZT1mdW5jdGlvbiBGQ3QodCxlLG4pe2Zvcih2YXIgbz1UQ3QuemVyb3ModCksaT0wO2k8dDtpKyspe2Zvcih2YXIgYT0hMCxyPTA7YTspe3I9VEN0LnRhdVJhbmRJbnQoZSxuKTtmb3IodmFyIHM9ITEsbD0wO2w8aTtsKyspaWYocj09PW9bbF0pe3M9ITA7YnJlYWt9c3x8KGE9ITEpfW9baV09cn1yZXR1cm4gb30sZkN0LmhlYXBQdXNoPXpDdCxmQ3QudW5jaGVja2VkSGVhcFB1c2g9SUN0LGZDdC5idWlsZENhbmRpZGF0ZXM9ZnVuY3Rpb24gTEN0KHQsZSxuLG8saSl7Zm9yKHZhciBhPU5DdChlLG8pLHI9MDtyPGU7cisrKWZvcih2YXIgcz0wO3M8bjtzKyspaWYoISh0WzBdW3JdW3NdPDApKXt2YXIgbD10WzBdW3JdW3NdLGM9dFsyXVtyXVtzXSxkPVRDdC50YXVSYW5kKGkpO3pDdChhLHIsZCxsLGMpLHpDdChhLGwsZCxyLGMpLHRbMl1bcl1bc109MH1yZXR1cm4gYX0sZkN0LmRlaGVhcFNvcnQ9ZnVuY3Rpb24gQkN0KHQpe2Zvcih2YXIgZT10WzBdLG49dFsxXSxvPTA7bzxlLmxlbmd0aDtvKyspZm9yKHZhciBpPWVbb10sYT1uW29dLHI9MDtyPGkubGVuZ3RoLTE7cisrKXt2YXIgcz1pLmxlbmd0aC1yLTEsbD1hLmxlbmd0aC1yLTEsYz1pWzBdO2lbMF09aVtzXSxpW3NdPWM7dmFyIGQ9YVswXTthWzBdPWFbbF0sYVtsXT1kLEhDdChhLGksbCwwKX1yZXR1cm57aW5kaWNlczplLHdlaWdodHM6bn19LGZDdC5zbWFsbGVzdEZsYWdnZWQ9ZnVuY3Rpb24gVkN0KHQsZSl7Zm9yKHZhciBuPXRbMF1bZV0sbz10WzFdW2VdLGk9dFsyXVtlXSxhPTEvMCxyPS0xLHM9MDtzPm4ubGVuZ3RoO3MrKykxPT09aVtzXSYmb1tzXTxhJiYoYT1vW3NdLHI9cyk7cmV0dXJuIHI+PTA/KGlbcl09MCxNYXRoLmZsb29yKG5bcl0pKTotMX07dmFyIGpDdCxVQ3Q9e30sR0N0PVF2JiZRdi5fX3JlYWR8fGZ1bmN0aW9uKHQsZSl7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdO2lmKCFuKXJldHVybiB0O3ZhciBvLGksYT1uLmNhbGwodCkscj1bXTt0cnl7Zm9yKDsodm9pZCAwPT09ZXx8ZS0tID4wKSYmIShvPWEubmV4dCgpKS5kb25lOylyLnB1c2goby52YWx1ZSl9Y2F0Y2godCl7aT17ZXJyb3I6dH19ZmluYWxseXt0cnl7byYmIW8uZG9uZSYmKG49YS5yZXR1cm4pJiZuLmNhbGwoYSl9ZmluYWxseXtpZihpKXRocm93IGkuZXJyb3J9fXJldHVybiByfSxXQ3Q9UXYmJlF2Ll9fdmFsdWVzfHxmdW5jdGlvbih0KXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0W1N5bWJvbC5pdGVyYXRvcl0sbj0wO3JldHVybiBlP2UuY2FsbCh0KTp7bmV4dDpmdW5jdGlvbigpe3JldHVybiB0JiZuPj10Lmxlbmd0aCYmKHQ9dm9pZCAwKSx7dmFsdWU6dCYmdFtuKytdLGRvbmU6IXR9fX19LFlDdD1RdiYmUXYuX19pbXBvcnRTdGFyfHxmdW5jdGlvbih0KXtpZih0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIGU9e307aWYobnVsbCE9dClmb3IodmFyIG4gaW4gdClPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pJiYoZVtuXT10W25dKTtyZXR1cm4gZS5kZWZhdWx0PXQsZX07T2JqZWN0LmRlZmluZVByb3BlcnR5KFVDdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHFDdD1ZQ3QoZ0N0KSxaQ3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbixvKXtpZih0aGlzLmVudHJpZXM9bmV3IE1hcCx0aGlzLm5Sb3dzPTAsdGhpcy5uQ29scz0wLHQubGVuZ3RoIT09ZS5sZW5ndGh8fHQubGVuZ3RoIT09bi5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJyb3dzLCBjb2xzIGFuZCB2YWx1ZXMgYXJyYXlzIG11c3QgYWxsIGhhdmUgdGhlIHNhbWUgbGVuZ3RoIik7dGhpcy5uUm93cz1vWzBdLHRoaXMubkNvbHM9b1sxXTtmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKyl7dmFyIGE9dFtpXSxyPWVbaV07dGhpcy5jaGVja0RpbXMoYSxyKTt2YXIgcz10aGlzLm1ha2VLZXkoYSxyKTt0aGlzLmVudHJpZXMuc2V0KHMse3ZhbHVlOm5baV0scm93OmEsY29sOnJ9KX19cmV0dXJuIHQucHJvdG90eXBlLm1ha2VLZXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCsiOiIrZX0sdC5wcm90b3R5cGUuY2hlY2tEaW1zPWZ1bmN0aW9uKHQsZSl7aWYoISh0PHRoaXMublJvd3MmJmU8dGhpcy5uQ29scykpdGhyb3cgbmV3IEVycm9yKCJyb3cgYW5kL29yIGNvbCBzcGVjaWZpZWQgb3V0c2lkZSBvZiBtYXRyaXggZGltZW5zaW9ucyIpfSx0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlLG4pe3RoaXMuY2hlY2tEaW1zKHQsZSk7dmFyIG89dGhpcy5tYWtlS2V5KHQsZSk7dGhpcy5lbnRyaWVzLmhhcyhvKT90aGlzLmVudHJpZXMuZ2V0KG8pLnZhbHVlPW46dGhpcy5lbnRyaWVzLnNldChvLHt2YWx1ZTpuLHJvdzp0LGNvbDplfSl9LHQucHJvdG90eXBlLmdldD1mdW5jdGlvbih0LGUsbil7dm9pZCAwPT09biYmKG49MCksdGhpcy5jaGVja0RpbXModCxlKTt2YXIgbz10aGlzLm1ha2VLZXkodCxlKTtyZXR1cm4gdGhpcy5lbnRyaWVzLmhhcyhvKT90aGlzLmVudHJpZXMuZ2V0KG8pLnZhbHVlOm59LHQucHJvdG90eXBlLmdldEFsbD1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD0hMCk7dmFyIGU9W107cmV0dXJuIHRoaXMuZW50cmllcy5mb3JFYWNoKChmdW5jdGlvbih0KXtlLnB1c2godCl9KSksdCYmZS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiB0LnJvdz09PWUucm93P3QuY29sLWUuY29sOnQucm93LWUucm93fSkpLGV9LHQucHJvdG90eXBlLmdldERpbXM9ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy5uUm93cyx0aGlzLm5Db2xzXX0sdC5wcm90b3R5cGUuZ2V0Um93cz1mdW5jdGlvbigpe3JldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcywoZnVuY3Rpb24odCl7cmV0dXJuIEdDdCh0LDIpWzFdLnJvd30pKX0sdC5wcm90b3R5cGUuZ2V0Q29scz1mdW5jdGlvbigpe3JldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcywoZnVuY3Rpb24odCl7cmV0dXJuIEdDdCh0LDIpWzFdLmNvbH0pKX0sdC5wcm90b3R5cGUuZ2V0VmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLChmdW5jdGlvbih0KXtyZXR1cm4gR0N0KHQsMilbMV0udmFsdWV9KSl9LHQucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCl7dGhpcy5lbnRyaWVzLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JldHVybiB0KGUudmFsdWUsZS5yb3csZS5jb2wpfSkpfSx0LnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24oZSl7dmFyIG49W107dGhpcy5lbnRyaWVzLmZvckVhY2goKGZ1bmN0aW9uKHQpe24ucHVzaChlKHQudmFsdWUsdC5yb3csdC5jb2wpKX0pKTt2YXIgbz1bdGhpcy5uUm93cyx0aGlzLm5Db2xzXTtyZXR1cm4gbmV3IHQodGhpcy5nZXRSb3dzKCksdGhpcy5nZXRDb2xzKCksbixvKX0sdC5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1xQ3QuZW1wdHkodGhpcy5uUm93cykubWFwKChmdW5jdGlvbigpe3JldHVybiBxQ3QuemVyb3ModC5uQ29scyl9KSk7cmV0dXJuIHRoaXMuZW50cmllcy5mb3JFYWNoKChmdW5jdGlvbih0KXtlW3Qucm93XVt0LmNvbF09dC52YWx1ZX0pKSxlfSx0fSkoKTtVQ3QuU3BhcnNlTWF0cml4PVpDdCxVQ3QudHJhbnNwb3NlPWZ1bmN0aW9uIFhDdCh0KXt2YXIgZT1bXSxuPVtdLG89W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxpLGEpe2UucHVzaChpKSxuLnB1c2goYSksby5wdXNoKHQpfSkpLG5ldyBaQ3QobixlLG8sW3QubkNvbHMsdC5uUm93c10pfSxVQ3QuaWRlbnRpdHk9ZnVuY3Rpb24gS0N0KHQpe2Zvcih2YXIgZT1HQ3QodCwxKVswXSxuPW5ldyBaQ3QoW10sW10sW10sdCksbz0wO288ZTtvKyspbi5zZXQobyxvLDEpO3JldHVybiBufSxVQ3QucGFpcndpc2VNdWx0aXBseT1mdW5jdGlvbiBKQ3QodCxlKXtyZXR1cm4gYU10KHQsZSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCplfSkpfSxVQ3QuYWRkPWZ1bmN0aW9uIFFDdCh0LGUpe3JldHVybiBhTXQodCxlLChmdW5jdGlvbih0LGUpe3JldHVybiB0K2V9KSl9LFVDdC5zdWJ0cmFjdD1mdW5jdGlvbiAkQ3QodCxlKXtyZXR1cm4gYU10KHQsZSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC1lfSkpfSxVQ3QubWF4aW11bT1mdW5jdGlvbiB0TXQodCxlKXtyZXR1cm4gYU10KHQsZSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gdD5lP3Q6ZX0pKX0sVUN0Lm11bHRpcGx5U2NhbGFyPWZ1bmN0aW9uIGVNdCh0LGUpe3JldHVybiB0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQqZX0pKX0sVUN0LmVsaW1pbmF0ZVplcm9zPWZ1bmN0aW9uIG5NdCh0KXtmb3IodmFyIGU9bmV3IFNldCxuPXQuZ2V0VmFsdWVzKCksbz10LmdldFJvd3MoKSxpPXQuZ2V0Q29scygpLGE9MDthPG4ubGVuZ3RoO2ErKykwPT09blthXSYmZS5hZGQoYSk7dmFyIHI9ZnVuY3Rpb24odCxuKXtyZXR1cm4hZS5oYXMobil9LHM9bi5maWx0ZXIociksbD1vLmZpbHRlcihyKSxjPWkuZmlsdGVyKHIpO3JldHVybiBuZXcgWkN0KGwsYyxzLHQuZ2V0RGltcygpKX0sVUN0Lm5vcm1hbGl6ZT1mdW5jdGlvbiBvTXQodCxlKXt2YXIgbixvO3ZvaWQgMD09PWUmJihlPSJsMiIpO3ZhciBpPWlNdFtlXSxhPW5ldyBNYXA7dC5mb3JFYWNoKChmdW5jdGlvbih0LGUsbil7dmFyIG89YS5nZXQoZSl8fFtdO28ucHVzaChuKSxhLnNldChlLG8pfSkpO3ZhciByPW5ldyBaQ3QoW10sW10sW10sdC5nZXREaW1zKCkpLHM9ZnVuY3Rpb24oZSl7Zm9yKHZhciBuPWEuZ2V0KGUpLnNvcnQoKSxvPW4ubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gdC5nZXQoZSxuKX0pKSxzPWkobyksbD0wO2w8cy5sZW5ndGg7bCsrKXIuc2V0KGUsbltsXSxzW2xdKX07dHJ5e2Zvcih2YXIgbD1XQ3QoYS5rZXlzKCkpLGM9bC5uZXh0KCk7IWMuZG9uZTtjPWwubmV4dCgpKXMoYy52YWx1ZSl9Y2F0Y2godCl7bj17ZXJyb3I6dH19ZmluYWxseXt0cnl7YyYmIWMuZG9uZSYmKG89bC5yZXR1cm4pJiZvLmNhbGwobCl9ZmluYWxseXtpZihuKXRocm93IG4uZXJyb3J9fXJldHVybiByfTt2YXIgaU10PSgoakN0PXt9KS5tYXg9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPS0xLzAsbj0wO248dC5sZW5ndGg7bisrKWU9dFtuXT5lP3Rbbl06ZTtyZXR1cm4gdC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0L2V9KSl9LGpDdC5sMT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPTA7bjx0Lmxlbmd0aDtuKyspZSs9dFtuXTtyZXR1cm4gdC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0L2V9KSl9LGpDdC5sMj1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPTA7bjx0Lmxlbmd0aDtuKyspZSs9TWF0aC5wb3codFtuXSwyKTtyZXR1cm4gdC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3codCwyKS9lKX0pKX0sakN0KTtmdW5jdGlvbiBhTXQodCxlLG4pe2Zvcih2YXIgbz1uZXcgU2V0LGk9W10sYT1bXSxyPVtdLHM9ZnVuY3Rpb24obyxzKXtpLnB1c2gobyksYS5wdXNoKHMpO3ZhciBsPW4odC5nZXQobyxzKSxlLmdldChvLHMpKTtyLnB1c2gobCl9LGw9dC5nZXRWYWx1ZXMoKSxjPXQuZ2V0Um93cygpLGQ9dC5nZXRDb2xzKCkscD0wO3A8bC5sZW5ndGg7cCsrKW8uYWRkKChnPWNbcF0pKyI6IisoaD1kW3BdKSkscyhnLGgpO3ZhciBtPWUuZ2V0VmFsdWVzKCksdT1lLmdldFJvd3MoKSxmPWUuZ2V0Q29scygpO2ZvcihwPTA7cDxtLmxlbmd0aDtwKyspe3ZhciBnLGg7by5oYXMoKGc9dVtwXSkrIjoiKyhoPWZbcF0pKXx8cyhnLGgpfXJldHVybiBuZXcgWkN0KGksYSxyLFt0Lm5Sb3dzLHQubkNvbHNdKX1VQ3QuZ2V0Q1NSPWZ1bmN0aW9uIHJNdCh0KXt2YXIgZT1bXTt0LmZvckVhY2goKGZ1bmN0aW9uKHQsbixvKXtlLnB1c2goe3ZhbHVlOnQscm93Om4sY29sOm99KX0pKSxlLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQucm93PT09ZS5yb3c/dC5jb2wtZS5jb2w6dC5yb3ctZS5yb3d9KSk7Zm9yKHZhciBuPVtdLG89W10saT1bXSxhPS0xLHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIHM9ZVtyXSxsPXMucm93LGM9cy5jb2wsZD1zLnZhbHVlO2whPT1hJiYoYT1sLGkucHVzaChyKSksbi5wdXNoKGMpLG8ucHVzaChkKX1yZXR1cm57aW5kaWNlczpuLHZhbHVlczpvLGluZHB0cjppfX07dmFyIHNNdD17fSxsTXQ9e30sY010PVF2JiZRdi5fX3JlYWR8fGZ1bmN0aW9uKHQsZSl7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdO2lmKCFuKXJldHVybiB0O3ZhciBvLGksYT1uLmNhbGwodCkscj1bXTt0cnl7Zm9yKDsodm9pZCAwPT09ZXx8ZS0tID4wKSYmIShvPWEubmV4dCgpKS5kb25lOylyLnB1c2goby52YWx1ZSl9Y2F0Y2godCl7aT17ZXJyb3I6dH19ZmluYWxseXt0cnl7byYmIW8uZG9uZSYmKG49YS5yZXR1cm4pJiZuLmNhbGwoYSl9ZmluYWxseXtpZihpKXRocm93IGkuZXJyb3J9fXJldHVybiByfSxkTXQ9UXYmJlF2Ll9fc3ByZWFkfHxmdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0PXQuY29uY2F0KGNNdChhcmd1bWVudHNbZV0pKTtyZXR1cm4gdH0scE10PVF2JiZRdi5fX3ZhbHVlc3x8ZnVuY3Rpb24odCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdLG49MDtyZXR1cm4gZT9lLmNhbGwodCk6e25leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdCYmbj49dC5sZW5ndGgmJih0PXZvaWQgMCkse3ZhbHVlOnQmJnRbbisrXSxkb25lOiF0fX19fSxtTXQ9UXYmJlF2Ll9faW1wb3J0U3Rhcnx8ZnVuY3Rpb24odCl7aWYodCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBlPXt9O2lmKG51bGwhPXQpZm9yKHZhciBuIGluIHQpT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGVbbl09dFtuXSk7cmV0dXJuIGUuZGVmYXVsdD10LGV9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShsTXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB1TXQsZk10PW1NdChnQ3QpO2Z1bmN0aW9uIGdNdCh0LGUsbixvLGkpe2lmKHZvaWQgMD09PW4mJihuPTMwKSxlLmxlbmd0aD5uKXt2YXIgYT0oZnVuY3Rpb24gcih0LGUsbil7Zm9yKHZhciBvPXRbMF0ubGVuZ3RoLGk9Zk10LnRhdVJhbmRJbnQoZS5sZW5ndGgsbiksYT1mTXQudGF1UmFuZEludChlLmxlbmd0aCxuKSxyPWVbaV0scz1lW2E9KGErPWk9PT1hPzE6MCklZS5sZW5ndGhdLGw9MCxjPWZNdC56ZXJvcyhvKSxkPTA7ZDxjLmxlbmd0aDtkKyspY1tkXT10W3JdW2RdLXRbc11bZF0sbC09Y1tkXSoodFtyXVtkXSt0W3NdW2RdKS8yO3ZhciBwPTAsbT0wLHU9Zk10Lnplcm9zKGUubGVuZ3RoKTtmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCsrKXtmb3IodmFyIGY9bCxnPTA7ZzxvO2crKylmKz1jW2ddKnRbZVtkXV1bZ107MD09PWY/KHVbZF09Zk10LnRhdVJhbmRJbnQoMixuKSwwPT09dVtkXT9wKz0xOm0rPTEpOmY+MD8odVtkXT0wLHArPTEpOih1W2RdPTEsbSs9MSl9dmFyIGg9Zk10Lnplcm9zKHApLGI9Zk10Lnplcm9zKG0pO2ZvcihwPTAsbT0wLGQ9MDtkPHUubGVuZ3RoO2QrKykwPT09dVtkXT8oaFtwXT1lW2RdLHArPTEpOihiW21dPWVbZF0sbSs9MSk7cmV0dXJue2luZGljZXNMZWZ0OmgsaW5kaWNlc1JpZ2h0OmIsaHlwZXJwbGFuZTpjLG9mZnNldDpsfX0pKHQsZSxpKSxzPWEuaW5kaWNlc1JpZ2h0LGw9YS5oeXBlcnBsYW5lLGM9YS5vZmZzZXQ7cmV0dXJue2xlZnRDaGlsZDpnTXQodCxhLmluZGljZXNMZWZ0LG4sbysxLGkpLHJpZ2h0Q2hpbGQ6Z010KHQscyxuLG8rMSxpKSxpc0xlYWY6ITEsaHlwZXJwbGFuZTpsLG9mZnNldDpjfX1yZXR1cm57aW5kaWNlczplLGlzTGVhZjohMH19ZnVuY3Rpb24gaE10KHQsZSxuLG8saSxhLHIpe3ZhciBzO2lmKHQuaXNMZWFmKXJldHVybiBvW2FdWzBdPS1yLChzPWlbcl0pLnNwbGljZS5hcHBseShzLGRNdChbMCx0LmluZGljZXMubGVuZ3RoXSx0LmluZGljZXMpKSx7bm9kZU51bTphLGxlYWZOdW06cis9MX07ZVthXT10Lmh5cGVycGxhbmUsblthXT10Lm9mZnNldCxvW2FdWzBdPWErMTt2YXIgbD1hLGM9aE10KHQubGVmdENoaWxkLGUsbixvLGksYSsxLHIpO3JldHVybiByPWMubGVhZk51bSxvW2xdWzFdPShhPWMubm9kZU51bSkrMSx7bm9kZU51bTooYz1oTXQodC5yaWdodENoaWxkLGUsbixvLGksYSsxLHIpKS5ub2RlTnVtLGxlYWZOdW06Yy5sZWFmTnVtfX1mdW5jdGlvbiBiTXQodCl7cmV0dXJuIHQuaXNMZWFmPzE6MStiTXQodC5sZWZ0Q2hpbGQpK2JNdCh0LnJpZ2h0Q2hpbGQpfWZ1bmN0aW9uIHlNdCh0KXtyZXR1cm4gdC5pc0xlYWY/MTp5TXQodC5sZWZ0Q2hpbGQpK3lNdCh0LnJpZ2h0Q2hpbGQpfWZ1bmN0aW9uIF9NdCh0LGUsbixvKXtmb3IodmFyIGk9ZSxhPTA7YTxuLmxlbmd0aDthKyspaSs9dFthXSpuW2FdO3JldHVybiAwPT09aT9mTXQudGF1UmFuZEludCgyLG8pOmk+MD8wOjF9bE10LkZsYXRUcmVlPXVNdD1mdW5jdGlvbiB1TXQodCxlLG4sbyl7dGhpcy5oeXBlcnBsYW5lcz10LHRoaXMub2Zmc2V0cz1lLHRoaXMuY2hpbGRyZW49bix0aGlzLmluZGljZXM9b30sbE10Lm1ha2VGb3Jlc3Q9ZnVuY3Rpb24gQ010KHQsZSxuLG8pe3ZhciBpPU1hdGgubWF4KDEwLGUpO3JldHVybiBmTXQucmFuZ2UobikubWFwKChmdW5jdGlvbihlLG4pe3JldHVybihmdW5jdGlvbiBhKHQsZSxuLG8pe3JldHVybiB2b2lkIDA9PT1lJiYoZT0zMCksZ010KHQsZk10LnJhbmdlKHQubGVuZ3RoKSxlLG4sbyl9KSh0LGksbixvKX0pKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybihmdW5jdGlvbiBlKHQsbil7dmFyIG89Yk10KHQpLGk9eU10KHQpLGE9Zk10LnJhbmdlKG8pLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm4gZk10Lnplcm9zKHQuaHlwZXJwbGFuZT90Lmh5cGVycGxhbmUubGVuZ3RoOjApfSkpLHI9Zk10Lnplcm9zKG8pLHM9Zk10LnJhbmdlKG8pLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm5bLTEsLTFdfSkpLGw9Zk10LnJhbmdlKGkpLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm4gZk10LnJhbmdlKG4pLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm4tMX0pKX0pKTtyZXR1cm4gaE10KHQsYSxyLHMsbCwwLDApLG5ldyB1TXQoYSxyLHMsbCl9KSh0LGkpfSkpfSxsTXQubWFrZUxlYWZBcnJheT1mdW5jdGlvbiBNTXQodCl7dmFyIGUsbjtpZih0Lmxlbmd0aD4wKXt2YXIgbz1bXTt0cnl7Zm9yKHZhciBpPXBNdCh0KSxhPWkubmV4dCgpOyFhLmRvbmU7YT1pLm5leHQoKSlvLnB1c2guYXBwbHkobyxkTXQoYS52YWx1ZS5pbmRpY2VzKSl9Y2F0Y2godCl7ZT17ZXJyb3I6dH19ZmluYWxseXt0cnl7YSYmIWEuZG9uZSYmKG49aS5yZXR1cm4pJiZuLmNhbGwoaSl9ZmluYWxseXtpZihlKXRocm93IGUuZXJyb3J9fXJldHVybiBvfXJldHVybltbLTFdXX0sbE10LnNlYXJjaEZsYXRUcmVlPWZ1bmN0aW9uIHZNdCh0LGUsbil7Zm9yKHZhciBvPTA7ZS5jaGlsZHJlbltvXVswXT4wOylvPTA9PT1fTXQoZS5oeXBlcnBsYW5lc1tvXSxlLm9mZnNldHNbb10sdCxuKT9lLmNoaWxkcmVuW29dWzBdOmUuY2hpbGRyZW5bb11bMV07cmV0dXJuIGUuaW5kaWNlc1stMSplLmNoaWxkcmVuW29dWzBdXX07dmFyIHhNdD1RdiYmUXYuX192YWx1ZXN8fGZ1bmN0aW9uKHQpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnRbU3ltYm9sLml0ZXJhdG9yXSxuPTA7cmV0dXJuIGU/ZS5jYWxsKHQpOntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIHQmJm4+PXQubGVuZ3RoJiYodD12b2lkIDApLHt2YWx1ZTp0JiZ0W24rK10sZG9uZTohdH19fX0sT010PVF2JiZRdi5fX2ltcG9ydFN0YXJ8fGZ1bmN0aW9uKHQpe2lmKHQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgZT17fTtpZihudWxsIT10KWZvcih2YXIgbiBpbiB0KU9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJihlW25dPXRbbl0pO3JldHVybiBlLmRlZmF1bHQ9dCxlfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoc010LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgUE10PU9NdChmQ3QpLHdNdD1PTXQoVUN0KSxrTXQ9T010KGxNdCksU010PU9NdChnQ3QpO3NNdC5tYWtlTk5EZXNjZW50PWZ1bmN0aW9uIERNdCh0LGUpe3JldHVybiBmdW5jdGlvbiBuKG8saSxhLHIscyxsLGMsZCl7dm9pZCAwPT09ciYmKHI9MTApLHZvaWQgMD09PXMmJihzPTUwKSx2b2lkIDA9PT1sJiYobD0uMDAxKSx2b2lkIDA9PT1jJiYoYz0uNSksdm9pZCAwPT09ZCYmKGQ9ITApO2Zvcih2YXIgcD1vLmxlbmd0aCxtPVBNdC5tYWtlSGVhcChvLmxlbmd0aCxhKSx1PTA7dTxvLmxlbmd0aDt1KyspZm9yKHZhciBmPVBNdC5yZWplY3Rpb25TYW1wbGUoYSxvLmxlbmd0aCxlKSxnPTA7ZzxmLmxlbmd0aDtnKyspe3ZhciBoPXQob1t1XSxvW2ZbZ11dKTtQTXQuaGVhcFB1c2gobSx1LGgsZltnXSwxKSxQTXQuaGVhcFB1c2gobSxmW2ddLGgsdSwxKX1pZihkKWZvcih2YXIgYj0wO2I8aS5sZW5ndGg7YisrKWZvcih1PTA7dTxpW2JdLmxlbmd0aCYmIShpW2JdW3VdPDApO3UrKylmb3IoZz11KzE7ZzxpW2JdLmxlbmd0aCYmIShpW2JdW2ddPDApO2crKyloPXQob1tpW2JdW3VdXSxvW2lbYl1bZ11dKSxQTXQuaGVhcFB1c2gobSxpW2JdW3VdLGgsaVtiXVtnXSwxKSxQTXQuaGVhcFB1c2gobSxpW2JdW2ddLGgsaVtiXVt1XSwxKTtmb3IoYj0wO2I8cjtiKyspe3ZhciB5PVBNdC5idWlsZENhbmRpZGF0ZXMobSxwLGEscyxlKSxfPTA7Zm9yKHU9MDt1PHA7dSsrKWZvcihnPTA7ZzxzO2crKyl7dmFyIEM9TWF0aC5mbG9vcih5WzBdW3VdW2ddKTtpZighKEM8MHx8U010LnRhdVJhbmQoZSk8YykpZm9yKHZhciBNPTA7TTxzO00rKyl7dmFyIHY9TWF0aC5mbG9vcih5WzBdW3VdW01dKTt2PDB8fCF5WzJdW3VdW2ddJiYheVsyXVt1XVtNXXx8KGg9dChvW0NdLG9bdl0pLF8rPVBNdC5oZWFwUHVzaChtLEMsaCx2LDEpLF8rPVBNdC5oZWFwUHVzaChtLHYsaCxDLDEpKX19aWYoXzw9bCphKm8ubGVuZ3RoKWJyZWFrfXJldHVybiBQTXQuZGVoZWFwU29ydChtKX19LHNNdC5tYWtlSW5pdGlhbGl6YXRpb25zPWZ1bmN0aW9uIEVNdCh0KXtyZXR1cm57aW5pdEZyb21SYW5kb206ZnVuY3Rpb24gZShuLG8saSxhLHIpe2Zvcih2YXIgcz0wO3M8aS5sZW5ndGg7cysrKWZvcih2YXIgbD1TTXQucmVqZWN0aW9uU2FtcGxlKG4sby5sZW5ndGgsciksYz0wO2M8bC5sZW5ndGg7YysrKWlmKCEobFtjXTwwKSl7dmFyIGQ9dChvW2xbY11dLGlbc10pO1BNdC5oZWFwUHVzaChhLHMsZCxsW2NdLDEpfX0saW5pdEZyb21UcmVlOmZ1bmN0aW9uIG4oZSxvLGksYSxyKXtmb3IodmFyIHM9MDtzPGkubGVuZ3RoO3MrKylmb3IodmFyIGw9a010LnNlYXJjaEZsYXRUcmVlKGlbc10sZSxyKSxjPTA7YzxsLmxlbmd0aDtjKyspe2lmKGxbY108MClyZXR1cm47dmFyIGQ9dChvW2xbY11dLGlbc10pO1BNdC5oZWFwUHVzaChhLHMsZCxsW2NdLDEpfX19fSxzTXQubWFrZUluaXRpYWxpemVkTk5TZWFyY2g9ZnVuY3Rpb24gUk10KHQpe3JldHVybiBmdW5jdGlvbiBlKG4sbyxpLGEpe2Zvcih2YXIgcixzLGw9d010LmdldENTUihvKSxjPWwuaW5kaWNlcyxkPWwuaW5kcHRyLHA9MDtwPGEubGVuZ3RoO3ArKylmb3IodmFyIG09bmV3IFNldChpWzBdW3BdKTs7KXt2YXIgdT1QTXQuc21hbGxlc3RGbGFnZ2VkKGkscCk7aWYoLTE9PT11KWJyZWFrO3ZhciBmPWMuc2xpY2UoZFt1XSxkW3UrMV0pO3RyeXtmb3IodmFyIGc9eE10KGYpLGg9Zy5uZXh0KCk7IWguZG9uZTtoPWcubmV4dCgpKXt2YXIgYj1oLnZhbHVlO2lmKGIhPT11JiYtMSE9PWImJiFtLmhhcyhiKSl7dmFyIHk9dChuW2JdLGFbcF0pO1BNdC51bmNoZWNrZWRIZWFwUHVzaChpLHAseSxiLDEpLG0uYWRkKGIpfX19Y2F0Y2godCl7cj17ZXJyb3I6dH19ZmluYWxseXt0cnl7aCYmIWguZG9uZSYmKHM9Zy5yZXR1cm4pJiZzLmNhbGwoZyl9ZmluYWxseXtpZihyKXRocm93IHIuZXJyb3J9fX1yZXR1cm4gaX19LHNNdC5pbml0aWFsaXplU2VhcmNoPWZ1bmN0aW9uIEFNdCh0LGUsbixvLGksYSxyKXt2YXIgcyxsLGM9UE10Lm1ha2VIZWFwKG4ubGVuZ3RoLG8pO2lmKGkobyxlLG4sYyxyKSx0KXRyeXtmb3IodmFyIGQ9eE10KHQpLHA9ZC5uZXh0KCk7IXAuZG9uZTtwPWQubmV4dCgpKWEocC52YWx1ZSxlLG4sYyxyKX1jYXRjaCh0KXtzPXtlcnJvcjp0fX1maW5hbGx5e3RyeXtwJiYhcC5kb25lJiYobD1kLnJldHVybikmJmwuY2FsbChkKX1maW5hbGx5e2lmKHMpdGhyb3cgcy5lcnJvcn19cmV0dXJuIGN9O2NvbnN0IFRNdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIE5NdCh0KXtyZXR1cm4gVE10LmNhbGwodCkuZW5kc1dpdGgoIkFycmF5XSIpfWZ1bmN0aW9uIHpNdCh0LGUsbil7bGV0IG89MDtjb25zdCBpPW4oZSk7Zm9yKGxldCBlPTA7ZTx0LngubGVuZ3RoO2UrKylvKz1NYXRoLmFicyh0LnlbZV0taSh0LnhbZV0pKTtyZXR1cm4gb31jb25zdCBJTXQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBITXQodCl7cmV0dXJuIElNdC5jYWxsKHQpLmVuZHNXaXRoKCJBcnJheV0iKX1mdW5jdGlvbiBGTXQodCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCFITXQodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBiZSBhbiBhcnJheSIpO2lmKDA9PT10Lmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IG5vdCBiZSBlbXB0eSIpO3ZhciBuPWUuZnJvbUluZGV4LG89dm9pZCAwPT09bj8wOm4saT1lLnRvSW5kZXgsYT12b2lkIDA9PT1pP3QubGVuZ3RoOmk7aWYobzwwfHxvPj10Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIobykpdGhyb3cgbmV3IEVycm9yKCJmcm9tSW5kZXggbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc21hbGxlciB0aGFuIGxlbmd0aCIpO2lmKGE8PW98fGE+dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKGEpKXRocm93IG5ldyBFcnJvcigidG9JbmRleCBtdXN0IGJlIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIGZyb21JbmRleCBhbmQgYXQgbW9zdCBlcXVhbCB0byBsZW5ndGgiKTtmb3IodmFyIHI9dFtvXSxzPW8rMTtzPGE7cysrKXRbc10+ciYmKHI9dFtzXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gTE10KHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZighSE10KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTt2YXIgbj1lLmZyb21JbmRleCxvPXZvaWQgMD09PW4/MDpuLGk9ZS50b0luZGV4LGE9dm9pZCAwPT09aT90Lmxlbmd0aDppO2lmKG88MHx8bz49dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKG8pKXRocm93IG5ldyBFcnJvcigiZnJvbUluZGV4IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHNtYWxsZXIgdGhhbiBsZW5ndGgiKTtpZihhPD1vfHxhPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihhKSl0aHJvdyBuZXcgRXJyb3IoInRvSW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBmcm9tSW5kZXggYW5kIGF0IG1vc3QgZXF1YWwgdG8gbGVuZ3RoIik7Zm9yKHZhciByPXRbb10scz1vKzE7czxhO3MrKyl0W3NdPHImJihyPXRbc10pO3JldHVybiByfWZ1bmN0aW9uIEJNdCh0KXt2YXIgZSxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZighSE10KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTtpZih2b2lkIDAhPT1uLm91dHB1dCl7aWYoIUhNdChuLm91dHB1dCkpdGhyb3cgbmV3IFR5cGVFcnJvcigib3V0cHV0IG9wdGlvbiBtdXN0IGJlIGFuIGFycmF5IGlmIHNwZWNpZmllZCIpO2U9bi5vdXRwdXR9ZWxzZSBlPW5ldyBBcnJheSh0Lmxlbmd0aCk7dmFyIG89TE10KHQpLGk9Rk10KHQpO2lmKG89PT1pKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW5pbXVtIGFuZCBtYXhpbXVtIGlucHV0IHZhbHVlcyBhcmUgZXF1YWwuIENhbm5vdCByZXNjYWxlIGEgY29uc3RhbnQgYXJyYXkiKTt2YXIgYT1uLm1pbixyPXZvaWQgMD09PWE/bi5hdXRvTWluTWF4P286MDphLHM9bi5tYXgsbD12b2lkIDA9PT1zP24uYXV0b01pbk1heD9pOjE6cztpZihyPj1sKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gb3B0aW9uIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCBvcHRpb24iKTtmb3IodmFyIGM9KGwtcikvKGktbyksZD0wO2Q8dC5sZW5ndGg7ZCsrKWVbZF09KHRbZF0tbykqYytyO3JldHVybiBlfWNvbnN0IFZNdD0iICIucmVwZWF0KDIpLGpNdD0iICIucmVwZWF0KDQpO2Z1bmN0aW9uIFVNdCh0LGU9e30pe2NvbnN0e21heFJvd3M6bj0xNSxtYXhDb2x1bW5zOm89MTAsbWF4TnVtU2l6ZTppPTh9PWU7cmV0dXJuYCR7dC5jb25zdHJ1Y3Rvci5uYW1lfSB7XG4ke1ZNdH1bXG4ke2pNdH0keyhmdW5jdGlvbiBhKHQsZSxuLG8pe2NvbnN0e3Jvd3M6aSxjb2x1bW5zOmF9PXQscj1NYXRoLm1pbihpLGUpLHM9TWF0aC5taW4oYSxuKSxsPVtdO2ZvcihsZXQgZT0wO2U8cjtlKyspe2xldCBuPVtdO2ZvcihsZXQgaT0wO2k8cztpKyspbi5wdXNoKEdNdCh0LmdldChlLGkpLG8pKTtsLnB1c2goYCR7bi5qb2luKCIgIil9YCl9cmV0dXJuIHMhPT1hJiYobFtsLmxlbmd0aC0xXSs9YCAuLi4gJHthLW59IG1vcmUgY29sdW1uc2ApLHIhPT1pJiZsLnB1c2goYC4uLiAke2ktZX0gbW9yZSByb3dzYCksbC5qb2luKGBcbiR7ak10fWApfSkodCxuLG8saSl9XG4ke1ZNdH1dXG4ke1ZNdH1yb3dzOiAke3Qucm93c31cbiR7Vk10fWNvbHVtbnM6ICR7dC5jb2x1bW5zfVxufWB9ZnVuY3Rpb24gR010KHQsZSl7Y29uc3Qgbj1TdHJpbmcodCk7aWYobi5sZW5ndGg8PWUpcmV0dXJuIG4ucGFkRW5kKGUsIiAiKTtjb25zdCBvPXQudG9QcmVjaXNpb24oZS0yKTtpZihvLmxlbmd0aDw9ZSlyZXR1cm4gbztjb25zdCBpPXQudG9FeHBvbmVudGlhbChlLTIpLGE9aS5pbmRleE9mKCJlIikscj1pLnNsaWNlKGEpO3JldHVybiBpLnNsaWNlKDAsZS1yLmxlbmd0aCkrcn1mdW5jdGlvbiBXTXQodCxlLG4pe2lmKGU8MHx8ZT4obj90LnJvd3M6dC5yb3dzLTEpKXRocm93IG5ldyBSYW5nZUVycm9yKCJSb3cgaW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gWU10KHQsZSxuKXtpZihlPDB8fGU+KG4/dC5jb2x1bW5zOnQuY29sdW1ucy0xKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQ29sdW1uIGluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIHFNdCh0LGUpe2lmKGUudG8xREFycmF5JiYoZT1lLnRvMURBcnJheSgpKSxlLmxlbmd0aCE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9yIHNpemUgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMiKTtyZXR1cm4gZX1mdW5jdGlvbiBaTXQodCxlKXtpZihlLnRvMURBcnJheSYmKGU9ZS50bzFEQXJyYXkoKSksZS5sZW5ndGghPT10LnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvciBzaXplIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiByb3dzIik7cmV0dXJuIGV9ZnVuY3Rpb24gWE10KHQsZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoInVuZXhwZWN0ZWQgdHlwZSBmb3Igcm93IGluZGljZXMiKTtpZihlLnNvbWUoKGU9PmU8MHx8ZT49dC5yb3dzKSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInJvdyBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKTtyZXR1cm4gQXJyYXkuaXNBcnJheShlKXx8KGU9QXJyYXkuZnJvbShlKSksZX1mdW5jdGlvbiBLTXQodCxlKXtpZigib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigidW5leHBlY3RlZCB0eXBlIGZvciBjb2x1bW4gaW5kaWNlcyIpO2lmKGUuc29tZSgoZT0+ZTwwfHxlPj10LmNvbHVtbnMpKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiY29sdW1uIGluZGljZXMgYXJlIG91dCBvZiByYW5nZSIpO3JldHVybiBBcnJheS5pc0FycmF5KGUpfHwoZT1BcnJheS5mcm9tKGUpKSxlfWZ1bmN0aW9uIEpNdCh0LGUsbixvLGkpe2lmKDUhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJleHBlY3RlZCA0IGFyZ3VtZW50cyIpO2lmKCRNdCgic3RhcnRSb3ciLGUpLCRNdCgiZW5kUm93IixuKSwkTXQoInN0YXJ0Q29sdW1uIixvKSwkTXQoImVuZENvbHVtbiIsaSksZT5ufHxvPml8fGU8MHx8ZT49dC5yb3dzfHxuPDB8fG4+PXQucm93c3x8bzwwfHxvPj10LmNvbHVtbnN8fGk8MHx8aT49dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJTdWJtYXRyaXggaW5kaWNlcyBhcmUgb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gUU10KHQsZT0wKXtsZXQgbj1bXTtmb3IobGV0IG89MDtvPHQ7bysrKW4ucHVzaChlKTtyZXR1cm4gbn1mdW5jdGlvbiAkTXQodCxlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0fSBtdXN0IGJlIGEgbnVtYmVyYCl9ZnVuY3Rpb24gdHZ0KHQpe2lmKHQuaXNFbXB0eSgpKXRocm93IG5ldyBFcnJvcigiRW1wdHkgbWF0cml4IGhhcyBubyBlbGVtZW50cyB0byBpbmRleCIpfWNsYXNzIGV2dHtzdGF0aWMgZnJvbTFEQXJyYXkodCxlLG4pe2lmKHQqZSE9PW4ubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJkYXRhIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBnaXZlbiBkaW1lbnNpb25zIik7bGV0IG89bmV3IGl2dCh0LGUpO2ZvcihsZXQgaT0wO2k8dDtpKyspZm9yKGxldCB0PTA7dDxlO3QrKylvLnNldChpLHQsbltpKmUrdF0pO3JldHVybiBvfXN0YXRpYyByb3dWZWN0b3IodCl7bGV0IGU9bmV3IGl2dCgxLHQubGVuZ3RoKTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyllLnNldCgwLG4sdFtuXSk7cmV0dXJuIGV9c3RhdGljIGNvbHVtblZlY3Rvcih0KXtsZXQgZT1uZXcgaXZ0KHQubGVuZ3RoLDEpO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKWUuc2V0KG4sMCx0W25dKTtyZXR1cm4gZX1zdGF0aWMgemVyb3ModCxlKXtyZXR1cm4gbmV3IGl2dCh0LGUpfXN0YXRpYyBvbmVzKHQsZSl7cmV0dXJuIG5ldyBpdnQodCxlKS5maWxsKDEpfXN0YXRpYyByYW5kKHQsZSxuPXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3JhbmRvbTpvPU1hdGgucmFuZG9tfT1uO2xldCBpPW5ldyBpdnQodCxlKTtmb3IobGV0IG49MDtuPHQ7bisrKWZvcihsZXQgdD0wO3Q8ZTt0KyspaS5zZXQobix0LG8oKSk7cmV0dXJuIGl9c3RhdGljIHJhbmRJbnQodCxlLG49e30pe2lmKCJvYmplY3QiIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7bWluOm89MCxtYXg6aT0xZTMscmFuZG9tOmE9TWF0aC5yYW5kb219PW47aWYoIU51bWJlci5pc0ludGVnZXIobykpdGhyb3cgbmV3IFR5cGVFcnJvcigibWluIG11c3QgYmUgYW4gaW50ZWdlciIpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGkpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1heCBtdXN0IGJlIGFuIGludGVnZXIiKTtpZihvPj1pKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IHI9aS1vLHM9bmV3IGl2dCh0LGUpO2ZvcihsZXQgbj0wO248dDtuKyspZm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9bytNYXRoLnJvdW5kKGEoKSpyKTtzLnNldChuLHQsZSl9cmV0dXJuIHN9c3RhdGljIGV5ZSh0LGUsbil7dm9pZCAwPT09ZSYmKGU9dCksdm9pZCAwPT09biYmKG49MSk7bGV0IG89TWF0aC5taW4odCxlKSxpPXRoaXMuemVyb3ModCxlKTtmb3IobGV0IHQ9MDt0PG87dCsrKWkuc2V0KHQsdCxuKTtyZXR1cm4gaX1zdGF0aWMgZGlhZyh0LGUsbil7bGV0IG89dC5sZW5ndGg7dm9pZCAwPT09ZSYmKGU9byksdm9pZCAwPT09biYmKG49ZSk7bGV0IGk9TWF0aC5taW4obyxlLG4pLGE9dGhpcy56ZXJvcyhlLG4pO2ZvcihsZXQgZT0wO2U8aTtlKyspYS5zZXQoZSxlLHRbZV0pO3JldHVybiBhfXN0YXRpYyBtaW4odCxlKXt0PXRoaXMuY2hlY2tNYXRyaXgodCksZT10aGlzLmNoZWNrTWF0cml4KGUpO2xldCBuPXQucm93cyxvPXQuY29sdW1ucyxpPW5ldyBpdnQobixvKTtmb3IobGV0IGE9MDthPG47YSsrKWZvcihsZXQgbj0wO248bztuKyspaS5zZXQoYSxuLE1hdGgubWluKHQuZ2V0KGEsbiksZS5nZXQoYSxuKSkpO3JldHVybiBpfXN0YXRpYyBtYXgodCxlKXt0PXRoaXMuY2hlY2tNYXRyaXgodCksZT10aGlzLmNoZWNrTWF0cml4KGUpO2xldCBuPXQucm93cyxvPXQuY29sdW1ucyxpPW5ldyB0aGlzKG4sbyk7Zm9yKGxldCBhPTA7YTxuO2ErKylmb3IobGV0IG49MDtuPG87bisrKWkuc2V0KGEsbixNYXRoLm1heCh0LmdldChhLG4pLGUuZ2V0KGEsbikpKTtyZXR1cm4gaX1zdGF0aWMgY2hlY2tNYXRyaXgodCl7cmV0dXJuIGV2dC5pc01hdHJpeCh0KT90Om5ldyBpdnQodCl9c3RhdGljIGlzTWF0cml4KHQpe3JldHVybiBudWxsIT10JiYiTWF0cml4Ij09PXQua2xhc3N9Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy5yb3dzKnRoaXMuY29sdW1uc31hcHBseSh0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24iKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXQuY2FsbCh0aGlzLGUsbik7cmV0dXJuIHRoaXN9dG8xREFycmF5KCl7bGV0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0LnB1c2godGhpcy5nZXQoZSxuKSk7cmV0dXJuIHR9dG8yREFycmF5KCl7bGV0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKXt0LnB1c2goW10pO2ZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0W2VdLnB1c2godGhpcy5nZXQoZSxuKSl9cmV0dXJuIHR9dG9KU09OKCl7cmV0dXJuIHRoaXMudG8yREFycmF5KCl9aXNSb3dWZWN0b3IoKXtyZXR1cm4gMT09PXRoaXMucm93c31pc0NvbHVtblZlY3Rvcigpe3JldHVybiAxPT09dGhpcy5jb2x1bW5zfWlzVmVjdG9yKCl7cmV0dXJuIDE9PT10aGlzLnJvd3N8fDE9PT10aGlzLmNvbHVtbnN9aXNTcXVhcmUoKXtyZXR1cm4gdGhpcy5yb3dzPT09dGhpcy5jb2x1bW5zfWlzRW1wdHkoKXtyZXR1cm4gMD09PXRoaXMucm93c3x8MD09PXRoaXMuY29sdW1uc31pc1N5bW1ldHJpYygpe2lmKHRoaXMuaXNTcXVhcmUoKSl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8PXQ7ZSsrKWlmKHRoaXMuZ2V0KHQsZSkhPT10aGlzLmdldChlLHQpKXJldHVybiExO3JldHVybiEwfXJldHVybiExfWlzRWNoZWxvbkZvcm0oKXtsZXQgdD0wLGU9MCxuPS0xLG89ITAsaT0hMTtmb3IoO3Q8dGhpcy5yb3dzJiZvOyl7Zm9yKGU9MCxpPSExO2U8dGhpcy5jb2x1bW5zJiYhMT09PWk7KTA9PT10aGlzLmdldCh0LGUpP2UrKzoxPT09dGhpcy5nZXQodCxlKSYmZT5uPyhpPSEwLG49ZSk6KG89ITEsaT0hMCk7dCsrfXJldHVybiBvfWlzUmVkdWNlZEVjaGVsb25Gb3JtKCl7bGV0IHQ9MCxlPTAsbj0tMSxvPSEwLGk9ITE7Zm9yKDt0PHRoaXMucm93cyYmbzspe2ZvcihlPTAsaT0hMTtlPHRoaXMuY29sdW1ucyYmITE9PT1pOykwPT09dGhpcy5nZXQodCxlKT9lKys6MT09PXRoaXMuZ2V0KHQsZSkmJmU+bj8oaT0hMCxuPWUpOihvPSExLGk9ITApO2ZvcihsZXQgbj1lKzE7bjx0aGlzLnJvd3M7bisrKTAhPT10aGlzLmdldCh0LG4pJiYobz0hMSk7dCsrfXJldHVybiBvfWVjaGVsb25Gb3JtKCl7bGV0IHQ9dGhpcy5jbG9uZSgpLGU9MCxuPTA7Zm9yKDtlPHQucm93cyYmbjx0LmNvbHVtbnM7KXtsZXQgbz1lO2ZvcihsZXQgaT1lO2k8dC5yb3dzO2krKyl0LmdldChpLG4pPnQuZ2V0KG8sbikmJihvPWkpO2lmKDA9PT10LmdldChvLG4pKW4rKztlbHNle3Quc3dhcFJvd3MoZSxvKTtsZXQgaT10LmdldChlLG4pO2ZvcihsZXQgbz1uO288dC5jb2x1bW5zO28rKyl0LnNldChlLG8sdC5nZXQoZSxvKS9pKTtmb3IobGV0IG89ZSsxO288dC5yb3dzO28rKyl7bGV0IGk9dC5nZXQobyxuKS90LmdldChlLG4pO3Quc2V0KG8sbiwwKTtmb3IobGV0IGE9bisxO2E8dC5jb2x1bW5zO2ErKyl0LnNldChvLGEsdC5nZXQobyxhKS10LmdldChlLGEpKmkpfWUrKyxuKyt9fXJldHVybiB0fXJlZHVjZWRFY2hlbG9uRm9ybSgpe2xldCB0PXRoaXMuZWNoZWxvbkZvcm0oKSxlPXQuY29sdW1ucyxuPXQucm93cyxvPW4tMTtmb3IoO28+PTA7KWlmKDA9PT10Lm1heFJvdyhvKSlvLS07ZWxzZXtsZXQgaT0wLGE9ITE7Zm9yKDtpPG4mJiExPT09YTspMT09PXQuZ2V0KG8saSk/YT0hMDppKys7Zm9yKGxldCBuPTA7bjxvO24rKyl7bGV0IGE9dC5nZXQobixpKTtmb3IobGV0IHI9aTtyPGU7cisrKXtsZXQgZT10LmdldChuLHIpLWEqdC5nZXQobyxyKTt0LnNldChuLHIsZSl9fW8tLX1yZXR1cm4gdH1zZXQoKXt0aHJvdyBuZXcgRXJyb3IoInNldCBtZXRob2QgaXMgdW5pbXBsZW1lbnRlZCIpfWdldCgpe3Rocm93IG5ldyBFcnJvcigiZ2V0IG1ldGhvZCBpcyB1bmltcGxlbWVudGVkIil9cmVwZWF0KHQ9e30pe2lmKCJvYmplY3QiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7cm93czplPTEsY29sdW1uczpuPTF9PXQ7aWYoIU51bWJlci5pc0ludGVnZXIoZSl8fGU8PTApdGhyb3cgbmV3IFR5cGVFcnJvcigicm93cyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG4pfHxuPD0wKXRocm93IG5ldyBUeXBlRXJyb3IoImNvbHVtbnMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiKTtsZXQgbz1uZXcgaXZ0KHRoaXMucm93cyplLHRoaXMuY29sdW1ucypuKTtmb3IobGV0IHQ9MDt0PGU7dCsrKWZvcihsZXQgZT0wO2U8bjtlKyspby5zZXRTdWJNYXRyaXgodGhpcyx0aGlzLnJvd3MqdCx0aGlzLmNvbHVtbnMqZSk7cmV0dXJuIG99ZmlsbCh0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KGUsbix0KTtyZXR1cm4gdGhpc31uZWcoKXtyZXR1cm4gdGhpcy5tdWxTKC0xKX1nZXRSb3codCl7V010KHRoaXMsdCk7bGV0IGU9W107Zm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKWUucHVzaCh0aGlzLmdldCh0LG4pKTtyZXR1cm4gZX1nZXRSb3dWZWN0b3IodCl7cmV0dXJuIGl2dC5yb3dWZWN0b3IodGhpcy5nZXRSb3codCkpfXNldFJvdyh0LGUpe1dNdCh0aGlzLHQpLGU9cU10KHRoaXMsZSk7Zm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KHQsbixlW25dKTtyZXR1cm4gdGhpc31zd2FwUm93cyh0LGUpe1dNdCh0aGlzLHQpLFdNdCh0aGlzLGUpO2ZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl7bGV0IG89dGhpcy5nZXQodCxuKTt0aGlzLnNldCh0LG4sdGhpcy5nZXQoZSxuKSksdGhpcy5zZXQoZSxuLG8pfXJldHVybiB0aGlzfWdldENvbHVtbih0KXtZTXQodGhpcyx0KTtsZXQgZT1bXTtmb3IobGV0IG49MDtuPHRoaXMucm93cztuKyspZS5wdXNoKHRoaXMuZ2V0KG4sdCkpO3JldHVybiBlfWdldENvbHVtblZlY3Rvcih0KXtyZXR1cm4gaXZ0LmNvbHVtblZlY3Rvcih0aGlzLmdldENvbHVtbih0KSl9c2V0Q29sdW1uKHQsZSl7WU10KHRoaXMsdCksZT1aTXQodGhpcyxlKTtmb3IobGV0IG49MDtuPHRoaXMucm93cztuKyspdGhpcy5zZXQobix0LGVbbl0pO3JldHVybiB0aGlzfXN3YXBDb2x1bW5zKHQsZSl7WU10KHRoaXMsdCksWU10KHRoaXMsZSk7Zm9yKGxldCBuPTA7bjx0aGlzLnJvd3M7bisrKXtsZXQgbz10aGlzLmdldChuLHQpO3RoaXMuc2V0KG4sdCx0aGlzLmdldChuLGUpKSx0aGlzLnNldChuLGUsbyl9cmV0dXJuIHRoaXN9YWRkUm93VmVjdG9yKHQpe3Q9cU10KHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldChlLG4sdGhpcy5nZXQoZSxuKSt0W25dKTtyZXR1cm4gdGhpc31zdWJSb3dWZWN0b3IodCl7dD1xTXQodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KGUsbix0aGlzLmdldChlLG4pLXRbbl0pO3JldHVybiB0aGlzfW11bFJvd1ZlY3Rvcih0KXt0PXFNdCh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQoZSxuLHRoaXMuZ2V0KGUsbikqdFtuXSk7cmV0dXJuIHRoaXN9ZGl2Um93VmVjdG9yKHQpe3Q9cU10KHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldChlLG4sdGhpcy5nZXQoZSxuKS90W25dKTtyZXR1cm4gdGhpc31hZGRDb2x1bW5WZWN0b3IodCl7dD1aTXQodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KGUsbix0aGlzLmdldChlLG4pK3RbZV0pO3JldHVybiB0aGlzfXN1YkNvbHVtblZlY3Rvcih0KXt0PVpNdCh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQoZSxuLHRoaXMuZ2V0KGUsbiktdFtlXSk7cmV0dXJuIHRoaXN9bXVsQ29sdW1uVmVjdG9yKHQpe3Q9Wk10KHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldChlLG4sdGhpcy5nZXQoZSxuKSp0W2VdKTtyZXR1cm4gdGhpc31kaXZDb2x1bW5WZWN0b3IodCl7dD1aTXQodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KGUsbix0aGlzLmdldChlLG4pL3RbZV0pO3JldHVybiB0aGlzfW11bFJvdyh0LGUpe1dNdCh0aGlzLHQpO2ZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldCh0LG4sdGhpcy5nZXQodCxuKSplKTtyZXR1cm4gdGhpc31tdWxDb2x1bW4odCxlKXtZTXQodGhpcyx0KTtmb3IobGV0IG49MDtuPHRoaXMucm93cztuKyspdGhpcy5zZXQobix0LHRoaXMuZ2V0KG4sdCkqZSk7cmV0dXJuIHRoaXN9bWF4KCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgdD10aGlzLmdldCgwLDApO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5nZXQoZSxuKT50JiYodD10aGlzLmdldChlLG4pKTtyZXR1cm4gdH1tYXhJbmRleCgpe3R2dCh0aGlzKTtsZXQgdD10aGlzLmdldCgwLDApLGU9WzAsMF07Zm9yKGxldCBuPTA7bjx0aGlzLnJvd3M7bisrKWZvcihsZXQgbz0wO288dGhpcy5jb2x1bW5zO28rKyl0aGlzLmdldChuLG8pPnQmJih0PXRoaXMuZ2V0KG4sbyksZVswXT1uLGVbMV09byk7cmV0dXJuIGV9bWluKCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgdD10aGlzLmdldCgwLDApO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5nZXQoZSxuKTx0JiYodD10aGlzLmdldChlLG4pKTtyZXR1cm4gdH1taW5JbmRleCgpe3R2dCh0aGlzKTtsZXQgdD10aGlzLmdldCgwLDApLGU9WzAsMF07Zm9yKGxldCBuPTA7bjx0aGlzLnJvd3M7bisrKWZvcihsZXQgbz0wO288dGhpcy5jb2x1bW5zO28rKyl0aGlzLmdldChuLG8pPHQmJih0PXRoaXMuZ2V0KG4sbyksZVswXT1uLGVbMV09byk7cmV0dXJuIGV9bWF4Um93KHQpe2lmKFdNdCh0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQodCwwKTtmb3IobGV0IG49MTtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5nZXQodCxuKT5lJiYoZT10aGlzLmdldCh0LG4pKTtyZXR1cm4gZX1tYXhSb3dJbmRleCh0KXtXTXQodGhpcyx0KSx0dnQodGhpcyk7bGV0IGU9dGhpcy5nZXQodCwwKSxuPVt0LDBdO2ZvcihsZXQgbz0xO288dGhpcy5jb2x1bW5zO28rKyl0aGlzLmdldCh0LG8pPmUmJihlPXRoaXMuZ2V0KHQsbyksblsxXT1vKTtyZXR1cm4gbn1taW5Sb3codCl7aWYoV010KHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCh0LDApO2ZvcihsZXQgbj0xO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLmdldCh0LG4pPGUmJihlPXRoaXMuZ2V0KHQsbikpO3JldHVybiBlfW1pblJvd0luZGV4KHQpe1dNdCh0aGlzLHQpLHR2dCh0aGlzKTtsZXQgZT10aGlzLmdldCh0LDApLG49W3QsMF07Zm9yKGxldCBvPTE7bzx0aGlzLmNvbHVtbnM7bysrKXRoaXMuZ2V0KHQsbyk8ZSYmKGU9dGhpcy5nZXQodCxvKSxuWzFdPW8pO3JldHVybiBufW1heENvbHVtbih0KXtpZihZTXQodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KDAsdCk7Zm9yKGxldCBuPTE7bjx0aGlzLnJvd3M7bisrKXRoaXMuZ2V0KG4sdCk+ZSYmKGU9dGhpcy5nZXQobix0KSk7cmV0dXJuIGV9bWF4Q29sdW1uSW5kZXgodCl7WU10KHRoaXMsdCksdHZ0KHRoaXMpO2xldCBlPXRoaXMuZ2V0KDAsdCksbj1bMCx0XTtmb3IobGV0IG89MTtvPHRoaXMucm93cztvKyspdGhpcy5nZXQobyx0KT5lJiYoZT10aGlzLmdldChvLHQpLG5bMF09byk7cmV0dXJuIG59bWluQ29sdW1uKHQpe2lmKFlNdCh0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQoMCx0KTtmb3IobGV0IG49MTtuPHRoaXMucm93cztuKyspdGhpcy5nZXQobix0KTxlJiYoZT10aGlzLmdldChuLHQpKTtyZXR1cm4gZX1taW5Db2x1bW5JbmRleCh0KXtZTXQodGhpcyx0KSx0dnQodGhpcyk7bGV0IGU9dGhpcy5nZXQoMCx0KSxuPVswLHRdO2ZvcihsZXQgbz0xO288dGhpcy5yb3dzO28rKyl0aGlzLmdldChvLHQpPGUmJihlPXRoaXMuZ2V0KG8sdCksblswXT1vKTtyZXR1cm4gbn1kaWFnKCl7bGV0IHQ9TWF0aC5taW4odGhpcy5yb3dzLHRoaXMuY29sdW1ucyksZT1bXTtmb3IobGV0IG49MDtuPHQ7bisrKWUucHVzaCh0aGlzLmdldChuLG4pKTtyZXR1cm4gZX1ub3JtKHQ9ImZyb2Jlbml1cyIpe2xldCBlPTA7aWYoIm1heCI9PT10KXJldHVybiB0aGlzLm1heCgpO2lmKCJmcm9iZW5pdXMiPT09dCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyllKz10aGlzLmdldCh0LG4pKnRoaXMuZ2V0KHQsbik7cmV0dXJuIE1hdGguc3FydChlKX10aHJvdyBuZXcgUmFuZ2VFcnJvcihgdW5rbm93biBub3JtIHR5cGU6ICR7dH1gKX1jdW11bGF0aXZlU3VtKCl7bGV0IHQ9MDtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXQrPXRoaXMuZ2V0KGUsbiksdGhpcy5zZXQoZSxuLHQpO3JldHVybiB0aGlzfWRvdCh0KXtldnQuaXNNYXRyaXgodCkmJih0PXQudG8xREFycmF5KCkpO2xldCBlPXRoaXMudG8xREFycmF5KCk7aWYoZS5sZW5ndGghPT10Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9ycyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBzaXplIik7bGV0IG49MDtmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rKyluKz1lW29dKnRbb107cmV0dXJuIG59bW11bCh0KXt0PWl2dC5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLnJvd3Msbj10aGlzLmNvbHVtbnMsbz10LmNvbHVtbnMsaT1uZXcgaXZ0KGUsbyksYT1uZXcgRmxvYXQ2NEFycmF5KG4pO2ZvcihsZXQgcj0wO3I8bztyKyspe2ZvcihsZXQgZT0wO2U8bjtlKyspYVtlXT10LmdldChlLHIpO2ZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPTA7Zm9yKGxldCBvPTA7bzxuO28rKyllKz10aGlzLmdldCh0LG8pKmFbb107aS5zZXQodCxyLGUpfX1yZXR1cm4gaX1zdHJhc3NlbjJ4Mih0KXt0PWl2dC5jaGVja01hdHJpeCh0KTtsZXQgZT1uZXcgaXZ0KDIsMik7Y29uc3Qgbj10aGlzLmdldCgwLDApLG89dC5nZXQoMCwwKSxpPXRoaXMuZ2V0KDAsMSksYT10LmdldCgwLDEpLHI9dGhpcy5nZXQoMSwwKSxzPXQuZ2V0KDEsMCksbD10aGlzLmdldCgxLDEpLGM9dC5nZXQoMSwxKSxkPShuK2wpKihvK2MpLHA9KHIrbCkqbyxtPW4qKGEtYyksdT1sKihzLW8pLGY9KG4raSkqYyxnPW0rZixoPXArdSxiPWQtcCttKyhyLW4pKihvK2EpO3JldHVybiBlLnNldCgwLDAsZCt1LWYrKGktbCkqKHMrYykpLGUuc2V0KDAsMSxnKSxlLnNldCgxLDAsaCksZS5zZXQoMSwxLGIpLGV9c3RyYXNzZW4zeDModCl7dD1pdnQuY2hlY2tNYXRyaXgodCk7bGV0IGU9bmV3IGl2dCgzLDMpO2NvbnN0IG49dGhpcy5nZXQoMCwwKSxvPXRoaXMuZ2V0KDAsMSksaT10aGlzLmdldCgwLDIpLGE9dGhpcy5nZXQoMSwwKSxyPXRoaXMuZ2V0KDEsMSkscz10aGlzLmdldCgxLDIpLGw9dGhpcy5nZXQoMiwwKSxjPXRoaXMuZ2V0KDIsMSksZD10aGlzLmdldCgyLDIpLHA9dC5nZXQoMCwwKSxtPXQuZ2V0KDAsMSksdT10LmdldCgwLDIpLGY9dC5nZXQoMSwwKSxnPXQuZ2V0KDEsMSksaD10LmdldCgxLDIpLGI9dC5nZXQoMiwwKSx5PXQuZ2V0KDIsMSksXz10LmdldCgyLDIpLEM9KG4tYSkqKC1tK2cpLE09KC1uK2ErcikqKHAtbStnKSx2PShhK3IpKigtcCttKSx4PW4qcCxPPSgtbitsK2MpKihwLXUraCksUD0oLW4rbCkqKHUtaCksdz0obCtjKSooLXArdSksaz0oLWkrYytkKSooZytiLXkpLFM9KGktZCkqKGcteSksRD1pKmIsRT0oYytkKSooLWIreSksUj0oLWkrcitzKSooaCtiLV8pLEE9KGktcykqKGgtXyksVD0ocitzKSooLWIrXyksTj0obitvK2ktYS1yLWMtZCkqZytNK3YreCtrK0QrRSx6PXgrTyt3KyhuK28raS1yLXMtbC1jKSpoK0QrUitULEk9QytyKigtcCttK2YtZy1oLWIrXykrTSt4K0QrUitBLEg9QytNK3YreCtzKnksRj1EK1IrQStUK2EqdSxMPXgrTytQK2MqKC1wK3UrZi1nLWgtYit5KStrK1MrRCxCPWsrUytEK0UrbCptLFY9eCtPK1ArdytkKl87cmV0dXJuIGUuc2V0KDAsMCx4K0QrbypmKSxlLnNldCgwLDEsTiksZS5zZXQoMCwyLHopLGUuc2V0KDEsMCxJKSxlLnNldCgxLDEsSCksZS5zZXQoMSwyLEYpLGUuc2V0KDIsMCxMKSxlLnNldCgyLDEsQiksZS5zZXQoMiwyLFYpLGV9bW11bFN0cmFzc2VuKHQpe3Q9aXZ0LmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMuY2xvbmUoKSxuPWUucm93cyxvPWUuY29sdW1ucyxpPXQucm93cyxhPXQuY29sdW1ucztmdW5jdGlvbiByKHQsZSxuKXtpZih0LnJvd3M9PT1lJiZ0LmNvbHVtbnM9PT1uKXJldHVybiB0O3tsZXQgbz1ldnQuemVyb3MoZSxuKTtyZXR1cm4gbz1vLnNldFN1Yk1hdHJpeCh0LDAsMCksb319byE9PWkmJmNvbnNvbGUud2FybihgTXVsdGlwbHlpbmcgJHtufSB4ICR7b30gYW5kICR7aX0geCAke2F9IG1hdHJpeDogZGltZW5zaW9ucyBkbyBub3QgbWF0Y2guYCk7bGV0IHM9TWF0aC5tYXgobixpKSxsPU1hdGgubWF4KG8sYSk7cmV0dXJuIGU9cihlLHMsbCksKGZ1bmN0aW9uIHQoZSxuLG8saSl7aWYobzw9NTEyfHxpPD01MTIpcmV0dXJuIGUubW11bChuKTtvJTI9PTEmJmklMj09MT8oZT1yKGUsbysxLGkrMSksbj1yKG4sbysxLGkrMSkpOm8lMj09MT8oZT1yKGUsbysxLGkpLG49cihuLG8rMSxpKSk6aSUyPT0xJiYoZT1yKGUsbyxpKzEpLG49cihuLG8saSsxKSk7bGV0IGE9cGFyc2VJbnQoZS5yb3dzLzIsMTApLHM9cGFyc2VJbnQoZS5jb2x1bW5zLzIsMTApLGw9ZS5zdWJNYXRyaXgoMCxhLTEsMCxzLTEpLGM9bi5zdWJNYXRyaXgoMCxhLTEsMCxzLTEpLGQ9ZS5zdWJNYXRyaXgoMCxhLTEscyxlLmNvbHVtbnMtMSkscD1uLnN1Yk1hdHJpeCgwLGEtMSxzLG4uY29sdW1ucy0xKSxtPWUuc3ViTWF0cml4KGEsZS5yb3dzLTEsMCxzLTEpLHU9bi5zdWJNYXRyaXgoYSxuLnJvd3MtMSwwLHMtMSksZj1lLnN1Yk1hdHJpeChhLGUucm93cy0xLHMsZS5jb2x1bW5zLTEpLGc9bi5zdWJNYXRyaXgoYSxuLnJvd3MtMSxzLG4uY29sdW1ucy0xKSxoPXQoZXZ0LmFkZChsLGYpLGV2dC5hZGQoYyxnKSxhLHMpLGI9dChldnQuYWRkKG0sZiksYyxhLHMpLHk9dChsLGV2dC5zdWIocCxnKSxhLHMpLF89dChmLGV2dC5zdWIodSxjKSxhLHMpLEM9dChldnQuYWRkKGwsZCksZyxhLHMpLE09dChldnQuc3ViKG0sbCksZXZ0LmFkZChjLHApLGEscyksdj10KGV2dC5zdWIoZCxmKSxldnQuYWRkKHUsZyksYSxzKSx4PWV2dC5hZGQoaCxfKTt4LnN1YihDKSx4LmFkZCh2KTtsZXQgTz1ldnQuYWRkKHksQyksUD1ldnQuYWRkKGIsXyksdz1ldnQuc3ViKGgsYik7dy5hZGQoeSksdy5hZGQoTSk7bGV0IGs9ZXZ0Lnplcm9zKDIqeC5yb3dzLDIqeC5jb2x1bW5zKTtyZXR1cm4gaz1rLnNldFN1Yk1hdHJpeCh4LDAsMCksaz1rLnNldFN1Yk1hdHJpeChPLHgucm93cywwKSxrPWsuc2V0U3ViTWF0cml4KFAsMCx4LmNvbHVtbnMpLGs9ay5zZXRTdWJNYXRyaXgodyx4LnJvd3MseC5jb2x1bW5zKSxrLnN1Yk1hdHJpeCgwLG8tMSwwLGktMSl9KShlLHQ9cih0LHMsbCkscyxsKX1zY2FsZVJvd3ModD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46ZT0wLG1heDpuPTF9PXQ7aWYoIU51bWJlci5pc0Zpbml0ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhIG51bWJlciIpO2lmKCFOdW1iZXIuaXNGaW5pdGUobikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYSBudW1iZXIiKTtpZihlPj1uKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IG89bmV3IGl2dCh0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKTtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0Kyspe2NvbnN0IGk9dGhpcy5nZXRSb3codCk7aS5sZW5ndGg+MCYmQk10KGkse21pbjplLG1heDpuLG91dHB1dDppfSksby5zZXRSb3codCxpKX1yZXR1cm4gb31zY2FsZUNvbHVtbnModD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46ZT0wLG1heDpuPTF9PXQ7aWYoIU51bWJlci5pc0Zpbml0ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhIG51bWJlciIpO2lmKCFOdW1iZXIuaXNGaW5pdGUobikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYSBudW1iZXIiKTtpZihlPj1uKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IG89bmV3IGl2dCh0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKTtmb3IobGV0IHQ9MDt0PHRoaXMuY29sdW1uczt0Kyspe2NvbnN0IGk9dGhpcy5nZXRDb2x1bW4odCk7aS5sZW5ndGgmJkJNdChpLHttaW46ZSxtYXg6bixvdXRwdXQ6aX0pLG8uc2V0Q29sdW1uKHQsaSl9cmV0dXJuIG99ZmxpcFJvd3MoKXtjb25zdCB0PU1hdGguY2VpbCh0aGlzLmNvbHVtbnMvMik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgbj0wO248dDtuKyspe2xldCB0PXRoaXMuZ2V0KGUsbiksbz10aGlzLmdldChlLHRoaXMuY29sdW1ucy0xLW4pO3RoaXMuc2V0KGUsbixvKSx0aGlzLnNldChlLHRoaXMuY29sdW1ucy0xLW4sdCl9cmV0dXJuIHRoaXN9ZmxpcENvbHVtbnMoKXtjb25zdCB0PU1hdGguY2VpbCh0aGlzLnJvd3MvMik7Zm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKWZvcihsZXQgbj0wO248dDtuKyspe2xldCB0PXRoaXMuZ2V0KG4sZSksbz10aGlzLmdldCh0aGlzLnJvd3MtMS1uLGUpO3RoaXMuc2V0KG4sZSxvKSx0aGlzLnNldCh0aGlzLnJvd3MtMS1uLGUsdCl9cmV0dXJuIHRoaXN9a3JvbmVja2VyUHJvZHVjdCh0KXt0PWl2dC5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLnJvd3Msbj10aGlzLmNvbHVtbnMsbz10LnJvd3MsaT10LmNvbHVtbnMsYT1uZXcgaXZ0KGUqbyxuKmkpO2ZvcihsZXQgcj0wO3I8ZTtyKyspZm9yKGxldCBlPTA7ZTxuO2UrKylmb3IobGV0IG49MDtuPG87bisrKWZvcihsZXQgcz0wO3M8aTtzKyspYS5zZXQobypyK24saSplK3MsdGhpcy5nZXQocixlKSp0LmdldChuLHMpKTtyZXR1cm4gYX1rcm9uZWNrZXJTdW0odCl7aWYodD1pdnQuY2hlY2tNYXRyaXgodCksIXRoaXMuaXNTcXVhcmUoKXx8IXQuaXNTcXVhcmUoKSl0aHJvdyBuZXcgRXJyb3IoIktyb25lY2tlciBTdW0gbmVlZHMgdHdvIFNxdWFyZSBNYXRyaWNlcyIpO2xldCBlPXRoaXMucm93cyxuPXQucm93cyxvPXRoaXMua3JvbmVja2VyUHJvZHVjdChpdnQuZXllKG4sbikpLGk9aXZ0LmV5ZShlLGUpLmtyb25lY2tlclByb2R1Y3QodCk7cmV0dXJuIG8uYWRkKGkpfXRyYW5zcG9zZSgpe2xldCB0PW5ldyBpdnQodGhpcy5jb2x1bW5zLHRoaXMucm93cyk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0LnNldChuLGUsdGhpcy5nZXQoZSxuKSk7cmV0dXJuIHR9c29ydFJvd3ModD1udnQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl0aGlzLnNldFJvdyhlLHRoaXMuZ2V0Um93KGUpLnNvcnQodCkpO3JldHVybiB0aGlzfXNvcnRDb2x1bW5zKHQ9bnZ0KXtmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXRDb2x1bW4oZSx0aGlzLmdldENvbHVtbihlKS5zb3J0KHQpKTtyZXR1cm4gdGhpc31zdWJNYXRyaXgodCxlLG4sbyl7Sk10KHRoaXMsdCxlLG4sbyk7bGV0IGk9bmV3IGl2dChlLXQrMSxvLW4rMSk7Zm9yKGxldCBhPXQ7YTw9ZTthKyspZm9yKGxldCBlPW47ZTw9bztlKyspaS5zZXQoYS10LGUtbix0aGlzLmdldChhLGUpKTtyZXR1cm4gaX1zdWJNYXRyaXhSb3codCxlLG4pe2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PW4mJihuPXRoaXMuY29sdW1ucy0xKSxlPm58fGU8MHx8ZT49dGhpcy5jb2x1bW5zfHxuPDB8fG4+PXRoaXMuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXJndW1lbnQgb3V0IG9mIHJhbmdlIik7bGV0IG89bmV3IGl2dCh0Lmxlbmd0aCxuLWUrMSk7Zm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspZm9yKGxldCBhPWU7YTw9bjthKyspe2lmKHRbaV08MHx8dFtpXT49dGhpcy5yb3dzKXRocm93IG5ldyBSYW5nZUVycm9yKGBSb3cgaW5kZXggb3V0IG9mIHJhbmdlOiAke3RbaV19YCk7by5zZXQoaSxhLWUsdGhpcy5nZXQodFtpXSxhKSl9cmV0dXJuIG99c3ViTWF0cml4Q29sdW1uKHQsZSxuKXtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1uJiYobj10aGlzLnJvd3MtMSksZT5ufHxlPDB8fGU+PXRoaXMucm93c3x8bjwwfHxuPj10aGlzLnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkFyZ3VtZW50IG91dCBvZiByYW5nZSIpO2xldCBvPW5ldyBpdnQobi1lKzEsdC5sZW5ndGgpO2ZvcihsZXQgaT0wO2k8dC5sZW5ndGg7aSsrKWZvcihsZXQgYT1lO2E8PW47YSsrKXtpZih0W2ldPDB8fHRbaV0+PXRoaXMuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQ29sdW1uIGluZGV4IG91dCBvZiByYW5nZTogJHt0W2ldfWApO28uc2V0KGEtZSxpLHRoaXMuZ2V0KGEsdFtpXSkpfXJldHVybiBvfXNldFN1Yk1hdHJpeCh0LGUsbil7aWYoKHQ9aXZ0LmNoZWNrTWF0cml4KHQpKS5pc0VtcHR5KCkpcmV0dXJuIHRoaXM7Sk10KHRoaXMsZSxlK3Qucm93cy0xLG4sbit0LmNvbHVtbnMtMSk7Zm9yKGxldCBvPTA7bzx0LnJvd3M7bysrKWZvcihsZXQgaT0wO2k8dC5jb2x1bW5zO2krKyl0aGlzLnNldChlK28sbitpLHQuZ2V0KG8saSkpO3JldHVybiB0aGlzfXNlbGVjdGlvbih0LGUpe2xldCBuPShmdW5jdGlvbiBvKHQsZSxuKXtyZXR1cm57cm93OlhNdCh0LGUpLGNvbHVtbjpLTXQodCxuKX19KSh0aGlzLHQsZSksaT1uZXcgaXZ0KHQubGVuZ3RoLGUubGVuZ3RoKTtmb3IobGV0IHQ9MDt0PG4ucm93Lmxlbmd0aDt0Kyspe2xldCBlPW4ucm93W3RdO2ZvcihsZXQgbz0wO288bi5jb2x1bW4ubGVuZ3RoO28rKylpLnNldCh0LG8sdGhpcy5nZXQoZSxuLmNvbHVtbltvXSkpfXJldHVybiBpfXRyYWNlKCl7bGV0IHQ9TWF0aC5taW4odGhpcy5yb3dzLHRoaXMuY29sdW1ucyksZT0wO2ZvcihsZXQgbj0wO248dDtuKyspZSs9dGhpcy5nZXQobixuKTtyZXR1cm4gZX1jbG9uZSgpe2xldCB0PW5ldyBpdnQodGhpcy5yb3dzLHRoaXMuY29sdW1ucyk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0LnNldChlLG4sdGhpcy5nZXQoZSxuKSk7cmV0dXJuIHR9c3VtKHQpe3N3aXRjaCh0KXtjYXNlInJvdyI6cmV0dXJuKGZ1bmN0aW9uIGUodCl7bGV0IGU9UU10KHQucm93cyk7Zm9yKGxldCBuPTA7bjx0LnJvd3M7KytuKWZvcihsZXQgbz0wO288dC5jb2x1bW5zOysrbyllW25dKz10LmdldChuLG8pO3JldHVybiBlfSkodGhpcyk7Y2FzZSJjb2x1bW4iOnJldHVybihmdW5jdGlvbiBuKHQpe2xldCBlPVFNdCh0LmNvbHVtbnMpO2ZvcihsZXQgbj0wO248dC5yb3dzOysrbilmb3IobGV0IG89MDtvPHQuY29sdW1uczsrK28pZVtvXSs9dC5nZXQobixvKTtyZXR1cm4gZX0pKHRoaXMpO2Nhc2Ugdm9pZCAwOnJldHVybihmdW5jdGlvbiBvKHQpe2xldCBlPTA7Zm9yKGxldCBuPTA7bjx0LnJvd3M7bisrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyllKz10LmdldChuLG8pO3JldHVybiBlfSkodGhpcyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXByb2R1Y3QodCl7c3dpdGNoKHQpe2Nhc2Uicm93IjpyZXR1cm4oZnVuY3Rpb24gZSh0KXtsZXQgZT1RTXQodC5yb3dzLDEpO2ZvcihsZXQgbj0wO248dC5yb3dzOysrbilmb3IobGV0IG89MDtvPHQuY29sdW1uczsrK28pZVtuXSo9dC5nZXQobixvKTtyZXR1cm4gZX0pKHRoaXMpO2Nhc2UiY29sdW1uIjpyZXR1cm4oZnVuY3Rpb24gbih0KXtsZXQgZT1RTXQodC5jb2x1bW5zLDEpO2ZvcihsZXQgbj0wO248dC5yb3dzOysrbilmb3IobGV0IG89MDtvPHQuY29sdW1uczsrK28pZVtvXSo9dC5nZXQobixvKTtyZXR1cm4gZX0pKHRoaXMpO2Nhc2Ugdm9pZCAwOnJldHVybihmdW5jdGlvbiBvKHQpe2xldCBlPTE7Zm9yKGxldCBuPTA7bjx0LnJvd3M7bisrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyllKj10LmdldChuLG8pO3JldHVybiBlfSkodGhpcyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fW1lYW4odCl7Y29uc3QgZT10aGlzLnN1bSh0KTtzd2l0Y2godCl7Y2FzZSJyb3ciOmZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKyllW3RdLz10aGlzLmNvbHVtbnM7cmV0dXJuIGU7Y2FzZSJjb2x1bW4iOmZvcihsZXQgdD0wO3Q8dGhpcy5jb2x1bW5zO3QrKyllW3RdLz10aGlzLnJvd3M7cmV0dXJuIGU7Y2FzZSB2b2lkIDA6cmV0dXJuIGUvdGhpcy5zaXplO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX12YXJpYW5jZSh0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHt1bmJpYXNlZDpuPSEwLG1lYW46bz10aGlzLm1lYW4odCl9PWU7aWYoImJvb2xlYW4iIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJ1bmJpYXNlZCBtdXN0IGJlIGEgYm9vbGVhbiIpO3N3aXRjaCh0KXtjYXNlInJvdyI6aWYoIUFycmF5LmlzQXJyYXkobykpdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuKGZ1bmN0aW9uIGUodCxuLG8pe2NvbnN0IGk9dC5yb3dzLGE9dC5jb2x1bW5zLHI9W107Zm9yKGxldCBlPTA7ZTxpO2UrKyl7bGV0IGk9MCxzPTAsbD0wO2ZvcihsZXQgbj0wO248YTtuKyspbD10LmdldChlLG4pLW9bZV0saSs9bCxzKz1sKmw7ci5wdXNoKG4/KHMtaSppL2EpLyhhLTEpOihzLWkqaS9hKS9hKX1yZXR1cm4gcn0pKHRoaXMsbixvKTtjYXNlImNvbHVtbiI6aWYoIUFycmF5LmlzQXJyYXkobykpdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuKGZ1bmN0aW9uIGkodCxlLG4pe2NvbnN0IG89dC5yb3dzLGk9dC5jb2x1bW5zLGE9W107Zm9yKGxldCByPTA7cjxpO3IrKyl7bGV0IGk9MCxzPTAsbD0wO2ZvcihsZXQgZT0wO2U8bztlKyspbD10LmdldChlLHIpLW5bcl0saSs9bCxzKz1sKmw7YS5wdXNoKGU/KHMtaSppL28pLyhvLTEpOihzLWkqaS9vKS9vKX1yZXR1cm4gYX0pKHRoaXMsbixvKTtjYXNlIHZvaWQgMDppZigibnVtYmVyIiE9dHlwZW9mIG8pdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuKGZ1bmN0aW9uIGEodCxlLG4pe2NvbnN0IG89dC5yb3dzLGk9dC5jb2x1bW5zLGE9byppO2xldCByPTAscz0wLGw9MDtmb3IobGV0IGU9MDtlPG87ZSsrKWZvcihsZXQgbz0wO288aTtvKyspbD10LmdldChlLG8pLW4scis9bCxzKz1sKmw7cmV0dXJuIGU/KHMtcipyL2EpLyhhLTEpOihzLXIqci9hKS9hfSkodGhpcyxuLG8pO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1zdGFuZGFyZERldmlhdGlvbih0LGUpeyJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCk7Y29uc3Qgbj10aGlzLnZhcmlhbmNlKHQsZSk7aWYodm9pZCAwPT09dClyZXR1cm4gTWF0aC5zcXJ0KG4pO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKW5bdF09TWF0aC5zcXJ0KG5bdF0pO3JldHVybiBufWNlbnRlcih0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHtjZW50ZXI6bj10aGlzLm1lYW4odCl9PWU7c3dpdGNoKHQpe2Nhc2Uicm93IjppZighQXJyYXkuaXNBcnJheShuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybihmdW5jdGlvbiBlKHQsbil7Zm9yKGxldCBlPTA7ZTx0LnJvd3M7ZSsrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyl0LnNldChlLG8sdC5nZXQoZSxvKS1uW2VdKX0pKHRoaXMsbiksdGhpcztjYXNlImNvbHVtbiI6aWYoIUFycmF5LmlzQXJyYXkobikpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2VudGVyIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4oZnVuY3Rpb24gbyh0LGUpe2ZvcihsZXQgbj0wO248dC5yb3dzO24rKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspdC5zZXQobixvLHQuZ2V0KG4sbyktZVtvXSl9KSh0aGlzLG4pLHRoaXM7Y2FzZSB2b2lkIDA6aWYoIm51bWJlciIhPXR5cGVvZiBuKXRocm93IG5ldyBUeXBlRXJyb3IoImNlbnRlciBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuKGZ1bmN0aW9uIGkodCxlKXtmb3IobGV0IG49MDtuPHQucm93cztuKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKXQuc2V0KG4sbyx0LmdldChuLG8pLWUpfSkodGhpcyxuKSx0aGlzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1zY2FsZSh0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtsZXQgbj1lLnNjYWxlO3N3aXRjaCh0KXtjYXNlInJvdyI6aWYodm9pZCAwPT09biluPShmdW5jdGlvbiBlKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjx0LnJvd3M7bisrKXtsZXQgbz0wO2ZvcihsZXQgZT0wO2U8dC5jb2x1bW5zO2UrKylvKz1NYXRoLnBvdyh0LmdldChuLGUpLDIpLyh0LmNvbHVtbnMtMSk7ZS5wdXNoKE1hdGguc3FydChvKSl9cmV0dXJuIGV9KSh0aGlzKTtlbHNlIGlmKCFBcnJheS5pc0FycmF5KG4pKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4oZnVuY3Rpb24gbyh0LGUpe2ZvcihsZXQgbj0wO248dC5yb3dzO24rKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspdC5zZXQobixvLHQuZ2V0KG4sbykvZVtuXSl9KSh0aGlzLG4pLHRoaXM7Y2FzZSJjb2x1bW4iOmlmKHZvaWQgMD09PW4pbj0oZnVuY3Rpb24gaSh0KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyl7bGV0IG89MDtmb3IobGV0IGU9MDtlPHQucm93cztlKyspbys9TWF0aC5wb3codC5nZXQoZSxuKSwyKS8odC5yb3dzLTEpO2UucHVzaChNYXRoLnNxcnQobykpfXJldHVybiBlfSkodGhpcyk7ZWxzZSBpZighQXJyYXkuaXNBcnJheShuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzY2FsZSBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuKGZ1bmN0aW9uIGEodCxlKXtmb3IobGV0IG49MDtuPHQucm93cztuKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKXQuc2V0KG4sbyx0LmdldChuLG8pL2Vbb10pfSkodGhpcyxuKSx0aGlzO2Nhc2Ugdm9pZCAwOmlmKHZvaWQgMD09PW4pbj0oZnVuY3Rpb24gcih0KXtjb25zdCBlPXQuc2l6ZS0xO2xldCBuPTA7Zm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKWZvcihsZXQgaT0wO2k8dC5yb3dzO2krKyluKz1NYXRoLnBvdyh0LmdldChpLG8pLDIpL2U7cmV0dXJuIE1hdGguc3FydChuKX0pKHRoaXMpO2Vsc2UgaWYoIm51bWJlciIhPXR5cGVvZiBuKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4oZnVuY3Rpb24gcyh0LGUpe2ZvcihsZXQgbj0wO248dC5yb3dzO24rKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspdC5zZXQobixvLHQuZ2V0KG4sbykvZSl9KSh0aGlzLG4pLHRoaXM7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXRvU3RyaW5nKHQpe3JldHVybiBVTXQodGhpcyx0KX19ZnVuY3Rpb24gbnZ0KHQsZSl7cmV0dXJuIHQtZX1ldnQucHJvdG90eXBlLmtsYXNzPSJNYXRyaXgiLCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiYoZXZ0LnByb3RvdHlwZVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXT1mdW5jdGlvbiBvdnQoKXtyZXR1cm4gVU10KHRoaXMpfSksZXZ0LnJhbmRvbT1ldnQucmFuZCxldnQucmFuZG9tSW50PWV2dC5yYW5kSW50LGV2dC5kaWFnb25hbD1ldnQuZGlhZyxldnQucHJvdG90eXBlLmRpYWdvbmFsPWV2dC5wcm90b3R5cGUuZGlhZyxldnQuaWRlbnRpdHk9ZXZ0LmV5ZSxldnQucHJvdG90eXBlLm5lZ2F0ZT1ldnQucHJvdG90eXBlLm5lZyxldnQucHJvdG90eXBlLnRlbnNvclByb2R1Y3Q9ZXZ0LnByb3RvdHlwZS5rcm9uZWNrZXJQcm9kdWN0O2NsYXNzIGl2dCBleHRlbmRzIGV2dHtjb25zdHJ1Y3Rvcih0LGUpe2lmKHN1cGVyKCksaXZ0LmlzTWF0cml4KHQpKXJldHVybiB0LmNsb25lKCk7aWYoTnVtYmVyLmlzSW50ZWdlcih0KSYmdD49MCl7aWYodGhpcy5kYXRhPVtdLCEoTnVtYmVyLmlzSW50ZWdlcihlKSYmZT49MCkpdGhyb3cgbmV3IFR5cGVFcnJvcigibkNvbHVtbnMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiKTtmb3IobGV0IG49MDtuPHQ7bisrKXRoaXMuZGF0YS5wdXNoKG5ldyBGbG9hdDY0QXJyYXkoZSkpfWVsc2V7aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBvciBhbiBhcnJheSIpO3tjb25zdCBuPXQ7aWYoIm51bWJlciIhPXR5cGVvZihlPSh0PW4ubGVuZ3RoKT9uWzBdLmxlbmd0aDowKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJEYXRhIG11c3QgYmUgYSAyRCBhcnJheSB3aXRoIGF0IGxlYXN0IG9uZSBlbGVtZW50Iik7dGhpcy5kYXRhPVtdO2ZvcihsZXQgbz0wO288dDtvKyspe2lmKG5bb10ubGVuZ3RoIT09ZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5jb25zaXN0ZW50IGFycmF5IGRpbWVuc2lvbnMiKTt0aGlzLmRhdGEucHVzaChGbG9hdDY0QXJyYXkuZnJvbShuW29dKSl9fX10aGlzLnJvd3M9dCx0aGlzLmNvbHVtbnM9ZX1zZXQodCxlLG4pe3JldHVybiB0aGlzLmRhdGFbdF1bZV09bix0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLmRhdGFbdF1bZV19cmVtb3ZlUm93KHQpe3JldHVybiBXTXQodGhpcyx0KSx0aGlzLmRhdGEuc3BsaWNlKHQsMSksdGhpcy5yb3dzLT0xLHRoaXN9YWRkUm93KHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXQsdD10aGlzLnJvd3MpLFdNdCh0aGlzLHQsITApLGU9RmxvYXQ2NEFycmF5LmZyb20ocU10KHRoaXMsZSkpLHRoaXMuZGF0YS5zcGxpY2UodCwwLGUpLHRoaXMucm93cys9MSx0aGlzfXJlbW92ZUNvbHVtbih0KXtZTXQodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspe2NvbnN0IG49bmV3IEZsb2F0NjRBcnJheSh0aGlzLmNvbHVtbnMtMSk7Zm9yKGxldCBvPTA7bzx0O28rKyluW29dPXRoaXMuZGF0YVtlXVtvXTtmb3IobGV0IG89dCsxO288dGhpcy5jb2x1bW5zO28rKyluW28tMV09dGhpcy5kYXRhW2VdW29dO3RoaXMuZGF0YVtlXT1ufXJldHVybiB0aGlzLmNvbHVtbnMtPTEsdGhpc31hZGRDb2x1bW4odCxlKXt2b2lkIDA9PT1lJiYoZT10LHQ9dGhpcy5jb2x1bW5zKSxZTXQodGhpcyx0LCEwKSxlPVpNdCh0aGlzLGUpO2ZvcihsZXQgbj0wO248dGhpcy5yb3dzO24rKyl7Y29uc3Qgbz1uZXcgRmxvYXQ2NEFycmF5KHRoaXMuY29sdW1ucysxKTtsZXQgaT0wO2Zvcig7aTx0O2krKylvW2ldPXRoaXMuZGF0YVtuXVtpXTtmb3Iob1tpKytdPWVbbl07aTx0aGlzLmNvbHVtbnMrMTtpKyspb1tpXT10aGlzLmRhdGFbbl1baS0xXTt0aGlzLmRhdGFbbl09b31yZXR1cm4gdGhpcy5jb2x1bW5zKz0xLHRoaXN9fSEoZnVuY3Rpb24gYXZ0KHQsZSl7dC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlP3RoaXMuYWRkUyhlKTp0aGlzLmFkZE0oZSl9LHQucHJvdG90eXBlLmFkZFM9ZnVuY3Rpb24gdChlKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KHQsbix0aGlzLmdldCh0LG4pK2UpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5hZGRNPWZ1bmN0aW9uIHQobil7aWYobj1lLmNoZWNrTWF0cml4KG4pLHRoaXMucm93cyE9PW4ucm93c3x8dGhpcy5jb2x1bW5zIT09bi5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSx0aGlzLmdldCh0LGUpK24uZ2V0KHQsZSkpO3JldHVybiB0aGlzfSx0LmFkZD1mdW5jdGlvbiB0KG4sbyl7cmV0dXJuIG5ldyBlKG4pLmFkZChvKX0sdC5wcm90b3R5cGUuc3ViPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlP3RoaXMuc3ViUyhlKTp0aGlzLnN1Yk0oZSl9LHQucHJvdG90eXBlLnN1YlM9ZnVuY3Rpb24gdChlKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KHQsbix0aGlzLmdldCh0LG4pLWUpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5zdWJNPWZ1bmN0aW9uIHQobil7aWYobj1lLmNoZWNrTWF0cml4KG4pLHRoaXMucm93cyE9PW4ucm93c3x8dGhpcy5jb2x1bW5zIT09bi5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSx0aGlzLmdldCh0LGUpLW4uZ2V0KHQsZSkpO3JldHVybiB0aGlzfSx0LnN1Yj1mdW5jdGlvbiB0KG4sbyl7cmV0dXJuIG5ldyBlKG4pLnN1YihvKX0sdC5wcm90b3R5cGUuc3VidHJhY3Q9dC5wcm90b3R5cGUuc3ViLHQucHJvdG90eXBlLnN1YnRyYWN0Uz10LnByb3RvdHlwZS5zdWJTLHQucHJvdG90eXBlLnN1YnRyYWN0TT10LnByb3RvdHlwZS5zdWJNLHQuc3VidHJhY3Q9dC5zdWIsdC5wcm90b3R5cGUubXVsPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlP3RoaXMubXVsUyhlKTp0aGlzLm11bE0oZSl9LHQucHJvdG90eXBlLm11bFM9ZnVuY3Rpb24gdChlKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KHQsbix0aGlzLmdldCh0LG4pKmUpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5tdWxNPWZ1bmN0aW9uIHQobil7aWYobj1lLmNoZWNrTWF0cml4KG4pLHRoaXMucm93cyE9PW4ucm93c3x8dGhpcy5jb2x1bW5zIT09bi5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSx0aGlzLmdldCh0LGUpKm4uZ2V0KHQsZSkpO3JldHVybiB0aGlzfSx0Lm11bD1mdW5jdGlvbiB0KG4sbyl7cmV0dXJuIG5ldyBlKG4pLm11bChvKX0sdC5wcm90b3R5cGUubXVsdGlwbHk9dC5wcm90b3R5cGUubXVsLHQucHJvdG90eXBlLm11bHRpcGx5Uz10LnByb3RvdHlwZS5tdWxTLHQucHJvdG90eXBlLm11bHRpcGx5TT10LnByb3RvdHlwZS5tdWxNLHQubXVsdGlwbHk9dC5tdWwsdC5wcm90b3R5cGUuZGl2PWZ1bmN0aW9uIHQoZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlP3RoaXMuZGl2UyhlKTp0aGlzLmRpdk0oZSl9LHQucHJvdG90eXBlLmRpdlM9ZnVuY3Rpb24gdChlKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KHQsbix0aGlzLmdldCh0LG4pL2UpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5kaXZNPWZ1bmN0aW9uIHQobil7aWYobj1lLmNoZWNrTWF0cml4KG4pLHRoaXMucm93cyE9PW4ucm93c3x8dGhpcy5jb2x1bW5zIT09bi5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSx0aGlzLmdldCh0LGUpL24uZ2V0KHQsZSkpO3JldHVybiB0aGlzfSx0LmRpdj1mdW5jdGlvbiB0KG4sbyl7cmV0dXJuIG5ldyBlKG4pLmRpdihvKX0sdC5wcm90b3R5cGUuZGl2aWRlPXQucHJvdG90eXBlLmRpdix0LnByb3RvdHlwZS5kaXZpZGVTPXQucHJvdG90eXBlLmRpdlMsdC5wcm90b3R5cGUuZGl2aWRlTT10LnByb3RvdHlwZS5kaXZNLHQuZGl2aWRlPXQuZGl2LHQucHJvdG90eXBlLm1vZD1mdW5jdGlvbiB0KGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZT90aGlzLm1vZFMoZSk6dGhpcy5tb2RNKGUpfSx0LnByb3RvdHlwZS5tb2RTPWZ1bmN0aW9uIHQoZSl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldCh0LG4sdGhpcy5nZXQodCxuKSVlKTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUubW9kTT1mdW5jdGlvbiB0KG4pe2lmKG49ZS5jaGVja01hdHJpeChuKSx0aGlzLnJvd3MhPT1uLnJvd3N8fHRoaXMuY29sdW1ucyE9PW4uY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsdGhpcy5nZXQodCxlKSVuLmdldCh0LGUpKTtyZXR1cm4gdGhpc30sdC5tb2Q9ZnVuY3Rpb24gdChuLG8pe3JldHVybiBuZXcgZShuKS5tb2Qobyl9LHQucHJvdG90eXBlLm1vZHVsdXM9dC5wcm90b3R5cGUubW9kLHQucHJvdG90eXBlLm1vZHVsdXNTPXQucHJvdG90eXBlLm1vZFMsdC5wcm90b3R5cGUubW9kdWx1c009dC5wcm90b3R5cGUubW9kTSx0Lm1vZHVsdXM9dC5tb2QsdC5wcm90b3R5cGUuYW5kPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlP3RoaXMuYW5kUyhlKTp0aGlzLmFuZE0oZSl9LHQucHJvdG90eXBlLmFuZFM9ZnVuY3Rpb24gdChlKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KHQsbix0aGlzLmdldCh0LG4pJmUpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5hbmRNPWZ1bmN0aW9uIHQobil7aWYobj1lLmNoZWNrTWF0cml4KG4pLHRoaXMucm93cyE9PW4ucm93c3x8dGhpcy5jb2x1bW5zIT09bi5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSx0aGlzLmdldCh0LGUpJm4uZ2V0KHQsZSkpO3JldHVybiB0aGlzfSx0LmFuZD1mdW5jdGlvbiB0KG4sbyl7cmV0dXJuIG5ldyBlKG4pLmFuZChvKX0sdC5wcm90b3R5cGUub3I9ZnVuY3Rpb24gdChlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/dGhpcy5vclMoZSk6dGhpcy5vck0oZSl9LHQucHJvdG90eXBlLm9yUz1mdW5jdGlvbiB0KGUpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQodCxuLHRoaXMuZ2V0KHQsbil8ZSk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLm9yTT1mdW5jdGlvbiB0KG4pe2lmKG49ZS5jaGVja01hdHJpeChuKSx0aGlzLnJvd3MhPT1uLnJvd3N8fHRoaXMuY29sdW1ucyE9PW4uY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsdGhpcy5nZXQodCxlKXxuLmdldCh0LGUpKTtyZXR1cm4gdGhpc30sdC5vcj1mdW5jdGlvbiB0KG4sbyl7cmV0dXJuIG5ldyBlKG4pLm9yKG8pfSx0LnByb3RvdHlwZS54b3I9ZnVuY3Rpb24gdChlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/dGhpcy54b3JTKGUpOnRoaXMueG9yTShlKX0sdC5wcm90b3R5cGUueG9yUz1mdW5jdGlvbiB0KGUpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQodCxuLHRoaXMuZ2V0KHQsbileZSk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnhvck09ZnVuY3Rpb24gdChuKXtpZihuPWUuY2hlY2tNYXRyaXgobiksdGhpcy5yb3dzIT09bi5yb3dzfHx0aGlzLmNvbHVtbnMhPT1uLmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLHRoaXMuZ2V0KHQsZSlebi5nZXQodCxlKSk7cmV0dXJuIHRoaXN9LHQueG9yPWZ1bmN0aW9uIHQobixvKXtyZXR1cm4gbmV3IGUobikueG9yKG8pfSx0LnByb3RvdHlwZS5sZWZ0U2hpZnQ9ZnVuY3Rpb24gdChlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/dGhpcy5sZWZ0U2hpZnRTKGUpOnRoaXMubGVmdFNoaWZ0TShlKX0sdC5wcm90b3R5cGUubGVmdFNoaWZ0Uz1mdW5jdGlvbiB0KGUpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQodCxuLHRoaXMuZ2V0KHQsbik8PGUpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5sZWZ0U2hpZnRNPWZ1bmN0aW9uIHQobil7aWYobj1lLmNoZWNrTWF0cml4KG4pLHRoaXMucm93cyE9PW4ucm93c3x8dGhpcy5jb2x1bW5zIT09bi5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSx0aGlzLmdldCh0LGUpPDxuLmdldCh0LGUpKTtyZXR1cm4gdGhpc30sdC5sZWZ0U2hpZnQ9ZnVuY3Rpb24gdChuLG8pe3JldHVybiBuZXcgZShuKS5sZWZ0U2hpZnQobyl9LHQucHJvdG90eXBlLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQ9ZnVuY3Rpb24gdChlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/dGhpcy5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0UyhlKTp0aGlzLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRNKGUpfSx0LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0Uz1mdW5jdGlvbiB0KGUpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQodCxuLHRoaXMuZ2V0KHQsbik+PmUpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0TT1mdW5jdGlvbiB0KG4pe2lmKG49ZS5jaGVja01hdHJpeChuKSx0aGlzLnJvd3MhPT1uLnJvd3N8fHRoaXMuY29sdW1ucyE9PW4uY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsdGhpcy5nZXQodCxlKT4+bi5nZXQodCxlKSk7cmV0dXJuIHRoaXN9LHQuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdD1mdW5jdGlvbiB0KG4sbyl7cmV0dXJuIG5ldyBlKG4pLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQobyl9LHQucHJvdG90eXBlLnJpZ2h0U2hpZnQ9ZnVuY3Rpb24gdChlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/dGhpcy5yaWdodFNoaWZ0UyhlKTp0aGlzLnJpZ2h0U2hpZnRNKGUpfSx0LnByb3RvdHlwZS5yaWdodFNoaWZ0Uz1mdW5jdGlvbiB0KGUpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQodCxuLHRoaXMuZ2V0KHQsbik+Pj5lKTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUucmlnaHRTaGlmdE09ZnVuY3Rpb24gdChuKXtpZihuPWUuY2hlY2tNYXRyaXgobiksdGhpcy5yb3dzIT09bi5yb3dzfHx0aGlzLmNvbHVtbnMhPT1uLmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLHRoaXMuZ2V0KHQsZSk+Pj5uLmdldCh0LGUpKTtyZXR1cm4gdGhpc30sdC5yaWdodFNoaWZ0PWZ1bmN0aW9uIHQobixvKXtyZXR1cm4gbmV3IGUobikucmlnaHRTaGlmdChvKX0sdC5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0PXQucHJvdG90eXBlLnJpZ2h0U2hpZnQsdC5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0Uz10LnByb3RvdHlwZS5yaWdodFNoaWZ0Uyx0LnByb3RvdHlwZS56ZXJvRmlsbFJpZ2h0U2hpZnRNPXQucHJvdG90eXBlLnJpZ2h0U2hpZnRNLHQuemVyb0ZpbGxSaWdodFNoaWZ0PXQucmlnaHRTaGlmdCx0LnByb3RvdHlwZS5ub3Q9ZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLH50aGlzLmdldCh0LGUpKTtyZXR1cm4gdGhpc30sdC5ub3Q9ZnVuY3Rpb24gdChuKXtyZXR1cm4gbmV3IGUobikubm90KCl9LHQucHJvdG90eXBlLmFicz1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hYnModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFicz1mdW5jdGlvbiB0KG4pe3JldHVybiBuZXcgZShuKS5hYnMoKX0sdC5wcm90b3R5cGUuYWNvcz1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hY29zKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hY29zPWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLmFjb3MoKX0sdC5wcm90b3R5cGUuYWNvc2g9ZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYWNvc2godGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFjb3NoPWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLmFjb3NoKCl9LHQucHJvdG90eXBlLmFzaW49ZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXNpbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXNpbj1mdW5jdGlvbiB0KG4pe3JldHVybiBuZXcgZShuKS5hc2luKCl9LHQucHJvdG90eXBlLmFzaW5oPWZ1bmN0aW9uIHQoKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFzaW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hc2luaD1mdW5jdGlvbiB0KG4pe3JldHVybiBuZXcgZShuKS5hc2luaCgpfSx0LnByb3RvdHlwZS5hdGFuPWZ1bmN0aW9uIHQoKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmF0YW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmF0YW49ZnVuY3Rpb24gdChuKXtyZXR1cm4gbmV3IGUobikuYXRhbigpfSx0LnByb3RvdHlwZS5hdGFuaD1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hdGFuaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXRhbmg9ZnVuY3Rpb24gdChuKXtyZXR1cm4gbmV3IGUobikuYXRhbmgoKX0sdC5wcm90b3R5cGUuY2JydD1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jYnJ0KHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jYnJ0PWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLmNicnQoKX0sdC5wcm90b3R5cGUuY2VpbD1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jZWlsKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jZWlsPWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLmNlaWwoKX0sdC5wcm90b3R5cGUuY2x6MzI9ZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY2x6MzIodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNsejMyPWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLmNsejMyKCl9LHQucHJvdG90eXBlLmNvcz1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jb3ModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNvcz1mdW5jdGlvbiB0KG4pe3JldHVybiBuZXcgZShuKS5jb3MoKX0sdC5wcm90b3R5cGUuY29zaD1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jb3NoKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jb3NoPWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLmNvc2goKX0sdC5wcm90b3R5cGUuZXhwPWZ1bmN0aW9uIHQoKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmV4cCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZXhwPWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLmV4cCgpfSx0LnByb3RvdHlwZS5leHBtMT1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5leHBtMSh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZXhwbTE9ZnVuY3Rpb24gdChuKXtyZXR1cm4gbmV3IGUobikuZXhwbTEoKX0sdC5wcm90b3R5cGUuZmxvb3I9ZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZmxvb3IodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmZsb29yPWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLmZsb29yKCl9LHQucHJvdG90eXBlLmZyb3VuZD1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5mcm91bmQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmZyb3VuZD1mdW5jdGlvbiB0KG4pe3JldHVybiBuZXcgZShuKS5mcm91bmQoKX0sdC5wcm90b3R5cGUubG9nPWZ1bmN0aW9uIHQoKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nPWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLmxvZygpfSx0LnByb3RvdHlwZS5sb2cxcD1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2cxcCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nMXA9ZnVuY3Rpb24gdChuKXtyZXR1cm4gbmV3IGUobikubG9nMXAoKX0sdC5wcm90b3R5cGUubG9nMTA9ZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nMTAodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZzEwPWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLmxvZzEwKCl9LHQucHJvdG90eXBlLmxvZzI9ZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nMih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nMj1mdW5jdGlvbiB0KG4pe3JldHVybiBuZXcgZShuKS5sb2cyKCl9LHQucHJvdG90eXBlLnJvdW5kPWZ1bmN0aW9uIHQoKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnJvdW5kKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5yb3VuZD1mdW5jdGlvbiB0KG4pe3JldHVybiBuZXcgZShuKS5yb3VuZCgpfSx0LnByb3RvdHlwZS5zaWduPWZ1bmN0aW9uIHQoKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNpZ24odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNpZ249ZnVuY3Rpb24gdChuKXtyZXR1cm4gbmV3IGUobikuc2lnbigpfSx0LnByb3RvdHlwZS5zaW49ZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2luKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zaW49ZnVuY3Rpb24gdChuKXtyZXR1cm4gbmV3IGUobikuc2luKCl9LHQucHJvdG90eXBlLnNpbmg9ZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2luaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc2luaD1mdW5jdGlvbiB0KG4pe3JldHVybiBuZXcgZShuKS5zaW5oKCl9LHQucHJvdG90eXBlLnNxcnQ9ZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc3FydCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc3FydD1mdW5jdGlvbiB0KG4pe3JldHVybiBuZXcgZShuKS5zcXJ0KCl9LHQucHJvdG90eXBlLnRhbj1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50YW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnRhbj1mdW5jdGlvbiB0KG4pe3JldHVybiBuZXcgZShuKS50YW4oKX0sdC5wcm90b3R5cGUudGFuaD1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50YW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC50YW5oPWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLnRhbmgoKX0sdC5wcm90b3R5cGUudHJ1bmM9ZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgudHJ1bmModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnRydW5jPWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLnRydW5jKCl9LHQucG93PWZ1bmN0aW9uIHQobixvKXtyZXR1cm4gbmV3IGUobikucG93KG8pfSx0LnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24gdChlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/dGhpcy5wb3dTKGUpOnRoaXMucG93TShlKX0sdC5wcm90b3R5cGUucG93Uz1mdW5jdGlvbiB0KGUpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQodCxuLE1hdGgucG93KHRoaXMuZ2V0KHQsbiksZSkpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5wb3dNPWZ1bmN0aW9uIHQobil7aWYobj1lLmNoZWNrTWF0cml4KG4pLHRoaXMucm93cyE9PW4ucm93c3x8dGhpcy5jb2x1bW5zIT09bi5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnBvdyh0aGlzLmdldCh0LGUpLG4uZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc319KShldnQsaXZ0KTtjbGFzcyBydnQgZXh0ZW5kcyBldnR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmRhdGE9dCx0aGlzLnJvd3M9dC5sZW5ndGgsdGhpcy5jb2x1bW5zPXRbMF0ubGVuZ3RofXNldCh0LGUsbil7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXT1uLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXX19Y2xhc3Mgc3Z0e2NvbnN0cnVjdG9yKHQpe2xldCBlLG4sbyxpLGEscixzLGwsYyxkPSh0PXJ2dC5jaGVja01hdHJpeCh0KSkuY2xvbmUoKSxwPWQucm93cyxtPWQuY29sdW1ucyx1PW5ldyBGbG9hdDY0QXJyYXkocCksZj0xO2ZvcihlPTA7ZTxwO2UrKyl1W2VdPWU7Zm9yKGw9bmV3IEZsb2F0NjRBcnJheShwKSxuPTA7bjxtO24rKyl7Zm9yKGU9MDtlPHA7ZSsrKWxbZV09ZC5nZXQoZSxuKTtmb3IoZT0wO2U8cDtlKyspe2ZvcihjPU1hdGgubWluKGUsbiksYT0wLG89MDtvPGM7bysrKWErPWQuZ2V0KGUsbykqbFtvXTtsW2VdLT1hLGQuc2V0KGUsbixsW2VdKX1mb3IoaT1uLGU9bisxO2U8cDtlKyspTWF0aC5hYnMobFtlXSk+TWF0aC5hYnMobFtpXSkmJihpPWUpO2lmKGkhPT1uKXtmb3Iobz0wO288bTtvKyspcj1kLmdldChpLG8pLGQuc2V0KGksbyxkLmdldChuLG8pKSxkLnNldChuLG8scik7cz11W2ldLHVbaV09dVtuXSx1W25dPXMsZj0tZn1pZihuPHAmJjAhPT1kLmdldChuLG4pKWZvcihlPW4rMTtlPHA7ZSsrKWQuc2V0KGUsbixkLmdldChlLG4pL2QuZ2V0KG4sbikpfXRoaXMuTFU9ZCx0aGlzLnBpdm90VmVjdG9yPXUsdGhpcy5waXZvdFNpZ249Zn1pc1Npbmd1bGFyKCl7bGV0IHQ9dGhpcy5MVSxlPXQuY29sdW1ucztmb3IobGV0IG49MDtuPGU7bisrKWlmKDA9PT10LmdldChuLG4pKXJldHVybiEwO3JldHVybiExfXNvbHZlKHQpe3Q9aXZ0LmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMuTFU7aWYoZS5yb3dzIT09dC5yb3dzKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBtYXRyaXggZGltZW5zaW9ucyIpO2lmKHRoaXMuaXNTaW5ndWxhcigpKXRocm93IG5ldyBFcnJvcigiTFUgbWF0cml4IGlzIHNpbmd1bGFyIik7bGV0IG4sbyxpLGE9dC5jb2x1bW5zLHI9dC5zdWJNYXRyaXhSb3codGhpcy5waXZvdFZlY3RvciwwLGEtMSkscz1lLmNvbHVtbnM7Zm9yKGk9MDtpPHM7aSsrKWZvcihuPWkrMTtuPHM7bisrKWZvcihvPTA7bzxhO28rKylyLnNldChuLG8sci5nZXQobixvKS1yLmdldChpLG8pKmUuZ2V0KG4saSkpO2ZvcihpPXMtMTtpPj0wO2ktLSl7Zm9yKG89MDtvPGE7bysrKXIuc2V0KGksbyxyLmdldChpLG8pL2UuZ2V0KGksaSkpO2ZvcihuPTA7bjxpO24rKylmb3Iobz0wO288YTtvKyspci5zZXQobixvLHIuZ2V0KG4sbyktci5nZXQoaSxvKSplLmdldChuLGkpKX1yZXR1cm4gcn1nZXQgZGV0ZXJtaW5hbnQoKXtsZXQgdD10aGlzLkxVO2lmKCF0LmlzU3F1YXJlKCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggbXVzdCBiZSBzcXVhcmUiKTtsZXQgZT10aGlzLnBpdm90U2lnbixuPXQuY29sdW1ucztmb3IobGV0IG89MDtvPG47bysrKWUqPXQuZ2V0KG8sbyk7cmV0dXJuIGV9Z2V0IGxvd2VyVHJpYW5ndWxhck1hdHJpeCgpe2xldCB0PXRoaXMuTFUsZT10LnJvd3Msbj10LmNvbHVtbnMsbz1uZXcgaXZ0KGUsbik7Zm9yKGxldCBpPTA7aTxlO2krKylmb3IobGV0IGU9MDtlPG47ZSsrKW8uc2V0KGksZSxpPmU/dC5nZXQoaSxlKTppPT09ZT8xOjApO3JldHVybiBvfWdldCB1cHBlclRyaWFuZ3VsYXJNYXRyaXgoKXtsZXQgdD10aGlzLkxVLGU9dC5yb3dzLG49dC5jb2x1bW5zLG89bmV3IGl2dChlLG4pO2ZvcihsZXQgaT0wO2k8ZTtpKyspZm9yKGxldCBlPTA7ZTxuO2UrKylvLnNldChpLGUsaTw9ZT90LmdldChpLGUpOjApO3JldHVybiBvfWdldCBwaXZvdFBlcm11dGF0aW9uVmVjdG9yKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5waXZvdFZlY3Rvcil9fWZ1bmN0aW9uIGx2dCh0LGUpe2xldCBuPTA7cmV0dXJuIE1hdGguYWJzKHQpPk1hdGguYWJzKGUpPyhuPWUvdCxNYXRoLmFicyh0KSpNYXRoLnNxcnQoMStuKm4pKTowIT09ZT8obj10L2UsTWF0aC5hYnMoZSkqTWF0aC5zcXJ0KDErbipuKSk6MH1jbGFzcyBjdnR7Y29uc3RydWN0b3IodCl7bGV0IGUsbixvLGksYT0odD1ydnQuY2hlY2tNYXRyaXgodCkpLmNsb25lKCkscj10LnJvd3Mscz10LmNvbHVtbnMsbD1uZXcgRmxvYXQ2NEFycmF5KHMpO2ZvcihvPTA7bzxzO28rKyl7bGV0IHQ9MDtmb3IoZT1vO2U8cjtlKyspdD1sdnQodCxhLmdldChlLG8pKTtpZigwIT09dCl7Zm9yKGEuZ2V0KG8sbyk8MCYmKHQ9LXQpLGU9bztlPHI7ZSsrKWEuc2V0KGUsbyxhLmdldChlLG8pL3QpO2ZvcihhLnNldChvLG8sYS5nZXQobyxvKSsxKSxuPW8rMTtuPHM7bisrKXtmb3IoaT0wLGU9bztlPHI7ZSsrKWkrPWEuZ2V0KGUsbykqYS5nZXQoZSxuKTtmb3IoaT0taS9hLmdldChvLG8pLGU9bztlPHI7ZSsrKWEuc2V0KGUsbixhLmdldChlLG4pK2kqYS5nZXQoZSxvKSl9fWxbb109LXR9dGhpcy5RUj1hLHRoaXMuUmRpYWc9bH1zb2x2ZSh0KXt0PWl2dC5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLlFSLG49ZS5yb3dzO2lmKHQucm93cyE9PW4pdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggcm93IGRpbWVuc2lvbnMgbXVzdCBhZ3JlZSIpO2lmKCF0aGlzLmlzRnVsbFJhbmsoKSl0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCBpcyByYW5rIGRlZmljaWVudCIpO2xldCBvLGksYSxyLHM9dC5jb2x1bW5zLGw9dC5jbG9uZSgpLGM9ZS5jb2x1bW5zO2ZvcihhPTA7YTxjO2ErKylmb3IoaT0wO2k8cztpKyspe2ZvcihyPTAsbz1hO288bjtvKyspcis9ZS5nZXQobyxhKSpsLmdldChvLGkpO2ZvcihyPS1yL2UuZ2V0KGEsYSksbz1hO288bjtvKyspbC5zZXQobyxpLGwuZ2V0KG8saSkrciplLmdldChvLGEpKX1mb3IoYT1jLTE7YT49MDthLS0pe2ZvcihpPTA7aTxzO2krKylsLnNldChhLGksbC5nZXQoYSxpKS90aGlzLlJkaWFnW2FdKTtmb3Iobz0wO288YTtvKyspZm9yKGk9MDtpPHM7aSsrKWwuc2V0KG8saSxsLmdldChvLGkpLWwuZ2V0KGEsaSkqZS5nZXQobyxhKSl9cmV0dXJuIGwuc3ViTWF0cml4KDAsYy0xLDAscy0xKX1pc0Z1bGxSYW5rKCl7bGV0IHQ9dGhpcy5RUi5jb2x1bW5zO2ZvcihsZXQgZT0wO2U8dDtlKyspaWYoMD09PXRoaXMuUmRpYWdbZV0pcmV0dXJuITE7cmV0dXJuITB9Z2V0IHVwcGVyVHJpYW5ndWxhck1hdHJpeCgpe2xldCB0LGUsbj10aGlzLlFSLG89bi5jb2x1bW5zLGk9bmV3IGl2dChvLG8pO2Zvcih0PTA7dDxvO3QrKylmb3IoZT0wO2U8bztlKyspaS5zZXQodCxlLHQ8ZT9uLmdldCh0LGUpOnQ9PT1lP3RoaXMuUmRpYWdbdF06MCk7cmV0dXJuIGl9Z2V0IG9ydGhvZ29uYWxNYXRyaXgoKXtsZXQgdCxlLG4sbyxpPXRoaXMuUVIsYT1pLnJvd3Mscj1pLmNvbHVtbnMscz1uZXcgaXZ0KGEscik7Zm9yKG49ci0xO24+PTA7bi0tKXtmb3IodD0wO3Q8YTt0Kyspcy5zZXQodCxuLDApO2ZvcihzLnNldChuLG4sMSksZT1uO2U8cjtlKyspaWYoMCE9PWkuZ2V0KG4sbikpe2ZvcihvPTAsdD1uO3Q8YTt0Kyspbys9aS5nZXQodCxuKSpzLmdldCh0LGUpO2ZvcihvPS1vL2kuZ2V0KG4sbiksdD1uO3Q8YTt0Kyspcy5zZXQodCxlLHMuZ2V0KHQsZSkrbyppLmdldCh0LG4pKX19cmV0dXJuIHN9fWNsYXNzIGR2dHtjb25zdHJ1Y3Rvcih0LGU9e30pe2lmKCh0PXJ2dC5jaGVja01hdHJpeCh0KSkuaXNFbXB0eSgpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IG11c3QgYmUgbm9uLWVtcHR5Iik7bGV0IG49dC5yb3dzLG89dC5jb2x1bW5zO2NvbnN0e2NvbXB1dGVMZWZ0U2luZ3VsYXJWZWN0b3JzOmk9ITAsY29tcHV0ZVJpZ2h0U2luZ3VsYXJWZWN0b3JzOmE9ITAsYXV0b1RyYW5zcG9zZTpyPSExfT1lO2xldCBzLGw9Qm9vbGVhbihpKSxjPUJvb2xlYW4oYSksZD0hMTtpZihuPG8paWYocil7cz10LnRyYW5zcG9zZSgpLG49cy5yb3dzLG89cy5jb2x1bW5zLGQ9ITA7bGV0IGU9bDtsPWMsYz1lfWVsc2Ugcz10LmNsb25lKCksY29uc29sZS53YXJuKCJDb21wdXRpbmcgU1ZEIG9uIGEgbWF0cml4IHdpdGggbW9yZSBjb2x1bW5zIHRoYW4gcm93cy4gQ29uc2lkZXIgZW5hYmxpbmcgYXV0b1RyYW5zcG9zZSIpO2Vsc2Ugcz10LmNsb25lKCk7bGV0IHA9TWF0aC5taW4obixvKSxtPU1hdGgubWluKG4rMSxvKSx1PW5ldyBGbG9hdDY0QXJyYXkobSksZj1uZXcgaXZ0KG4scCksZz1uZXcgaXZ0KG8sbyksaD1uZXcgRmxvYXQ2NEFycmF5KG8pLGI9bmV3IEZsb2F0NjRBcnJheShuKSx5PW5ldyBGbG9hdDY0QXJyYXkobSk7Zm9yKGxldCB0PTA7dDxtO3QrKyl5W3RdPXQ7bGV0IF89TWF0aC5taW4obi0xLG8pLEM9TWF0aC5tYXgoMCxNYXRoLm1pbihvLTIsbikpLE09TWF0aC5tYXgoXyxDKTtmb3IobGV0IHQ9MDt0PE07dCsrKXtpZih0PF8pe3VbdF09MDtmb3IobGV0IGU9dDtlPG47ZSsrKXVbdF09bHZ0KHVbdF0scy5nZXQoZSx0KSk7aWYoMCE9PXVbdF0pe3MuZ2V0KHQsdCk8MCYmKHVbdF09LXVbdF0pO2ZvcihsZXQgZT10O2U8bjtlKyspcy5zZXQoZSx0LHMuZ2V0KGUsdCkvdVt0XSk7cy5zZXQodCx0LHMuZ2V0KHQsdCkrMSl9dVt0XT0tdVt0XX1mb3IobGV0IGU9dCsxO2U8bztlKyspe2lmKHQ8XyYmMCE9PXVbdF0pe2xldCBvPTA7Zm9yKGxldCBpPXQ7aTxuO2krKylvKz1zLmdldChpLHQpKnMuZ2V0KGksZSk7bz0tby9zLmdldCh0LHQpO2ZvcihsZXQgaT10O2k8bjtpKyspcy5zZXQoaSxlLHMuZ2V0KGksZSkrbypzLmdldChpLHQpKX1oW2VdPXMuZ2V0KHQsZSl9aWYobCYmdDxfKWZvcihsZXQgZT10O2U8bjtlKyspZi5zZXQoZSx0LHMuZ2V0KGUsdCkpO2lmKHQ8Qyl7aFt0XT0wO2ZvcihsZXQgZT10KzE7ZTxvO2UrKyloW3RdPWx2dChoW3RdLGhbZV0pO2lmKDAhPT1oW3RdKXtoW3QrMV08MCYmKGhbdF09MC1oW3RdKTtmb3IobGV0IGU9dCsxO2U8bztlKyspaFtlXS89aFt0XTtoW3QrMV0rPTF9aWYoaFt0XT0taFt0XSx0KzE8biYmMCE9PWhbdF0pe2ZvcihsZXQgZT10KzE7ZTxuO2UrKyliW2VdPTA7Zm9yKGxldCBlPXQrMTtlPG47ZSsrKWZvcihsZXQgbj10KzE7bjxvO24rKyliW2VdKz1oW25dKnMuZ2V0KGUsbik7Zm9yKGxldCBlPXQrMTtlPG87ZSsrKXtsZXQgbz0taFtlXS9oW3QrMV07Zm9yKGxldCBpPXQrMTtpPG47aSsrKXMuc2V0KGksZSxzLmdldChpLGUpK28qYltpXSl9fWlmKGMpZm9yKGxldCBlPXQrMTtlPG87ZSsrKWcuc2V0KGUsdCxoW2VdKX19bGV0IHY9TWF0aC5taW4obyxuKzEpO2lmKF88byYmKHVbX109cy5nZXQoXyxfKSksbjx2JiYodVt2LTFdPTApLEMrMTx2JiYoaFtDXT1zLmdldChDLHYtMSkpLGhbdi0xXT0wLGwpe2ZvcihsZXQgdD1fO3Q8cDt0Kyspe2ZvcihsZXQgZT0wO2U8bjtlKyspZi5zZXQoZSx0LDApO2Yuc2V0KHQsdCwxKX1mb3IobGV0IHQ9Xy0xO3Q+PTA7dC0tKWlmKDAhPT11W3RdKXtmb3IobGV0IGU9dCsxO2U8cDtlKyspe2xldCBvPTA7Zm9yKGxldCBpPXQ7aTxuO2krKylvKz1mLmdldChpLHQpKmYuZ2V0KGksZSk7bz0tby9mLmdldCh0LHQpO2ZvcihsZXQgaT10O2k8bjtpKyspZi5zZXQoaSxlLGYuZ2V0KGksZSkrbypmLmdldChpLHQpKX1mb3IobGV0IGU9dDtlPG47ZSsrKWYuc2V0KGUsdCwtZi5nZXQoZSx0KSk7Zi5zZXQodCx0LDErZi5nZXQodCx0KSk7Zm9yKGxldCBlPTA7ZTx0LTE7ZSsrKWYuc2V0KGUsdCwwKX1lbHNle2ZvcihsZXQgZT0wO2U8bjtlKyspZi5zZXQoZSx0LDApO2Yuc2V0KHQsdCwxKX19aWYoYylmb3IobGV0IHQ9by0xO3Q+PTA7dC0tKXtpZih0PEMmJjAhPT1oW3RdKWZvcihsZXQgZT10KzE7ZTxvO2UrKyl7bGV0IG49MDtmb3IobGV0IGk9dCsxO2k8bztpKyspbis9Zy5nZXQoaSx0KSpnLmdldChpLGUpO249LW4vZy5nZXQodCsxLHQpO2ZvcihsZXQgaT10KzE7aTxvO2krKylnLnNldChpLGUsZy5nZXQoaSxlKStuKmcuZ2V0KGksdCkpfWZvcihsZXQgZT0wO2U8bztlKyspZy5zZXQoZSx0LDApO2cuc2V0KHQsdCwxKX1sZXQgeD12LTEsTz1OdW1iZXIuRVBTSUxPTjtmb3IoO3Y+MDspe2xldCB0LGU7Zm9yKHQ9di0yO3Q+PS0xJiYtMSE9PXQ7dC0tKXtjb25zdCBlPU51bWJlci5NSU5fVkFMVUUrTypNYXRoLmFicyh1W3RdK01hdGguYWJzKHVbdCsxXSkpO2lmKE1hdGguYWJzKGhbdF0pPD1lfHxOdW1iZXIuaXNOYU4oaFt0XSkpe2hbdF09MDticmVha319aWYodD09PXYtMillPTQ7ZWxzZXtsZXQgbjtmb3Iobj12LTE7bj49dCYmbiE9PXQ7bi0tKXtsZXQgZT0obiE9PXY/TWF0aC5hYnMoaFtuXSk6MCkrKG4hPT10KzE/TWF0aC5hYnMoaFtuLTFdKTowKTtpZihNYXRoLmFicyh1W25dKTw9TyplKXt1W25dPTA7YnJlYWt9fW49PT10P2U9MzpuPT09di0xP2U9MTooZT0yLHQ9bil9c3dpdGNoKHQrKyxlKXtjYXNlIDE6e2xldCBlPWhbdi0yXTtoW3YtMl09MDtmb3IobGV0IG49di0yO24+PXQ7bi0tKXtsZXQgaT1sdnQodVtuXSxlKSxhPXVbbl0vaSxyPWUvaTtpZih1W25dPWksbiE9PXQmJihlPS1yKmhbbi0xXSxoW24tMV09YSpoW24tMV0pLGMpZm9yKGxldCB0PTA7dDxvO3QrKylpPWEqZy5nZXQodCxuKStyKmcuZ2V0KHQsdi0xKSxnLnNldCh0LHYtMSwtcipnLmdldCh0LG4pK2EqZy5nZXQodCx2LTEpKSxnLnNldCh0LG4saSl9YnJlYWt9Y2FzZSAyOntsZXQgZT1oW3QtMV07aFt0LTFdPTA7Zm9yKGxldCBvPXQ7bzx2O28rKyl7bGV0IGk9bHZ0KHVbb10sZSksYT11W29dL2kscj1lL2k7aWYodVtvXT1pLGU9LXIqaFtvXSxoW29dPWEqaFtvXSxsKWZvcihsZXQgZT0wO2U8bjtlKyspaT1hKmYuZ2V0KGUsbykrcipmLmdldChlLHQtMSksZi5zZXQoZSx0LTEsLXIqZi5nZXQoZSxvKSthKmYuZ2V0KGUsdC0xKSksZi5zZXQoZSxvLGkpfWJyZWFrfWNhc2UgMzp7Y29uc3QgZT1NYXRoLm1heChNYXRoLmFicyh1W3YtMV0pLE1hdGguYWJzKHVbdi0yXSksTWF0aC5hYnMoaFt2LTJdKSxNYXRoLmFicyh1W3RdKSxNYXRoLmFicyhoW3RdKSksaT11W3YtMV0vZSxhPXVbdi0yXS9lLHI9aFt2LTJdL2Uscz11W3RdL2UsZD1oW3RdL2UscD0oKGEraSkqKGEtaSkrcipyKS8yLG09aSpyKihpKnIpO2xldCBiPTA7MD09PXAmJjA9PT1tfHwoYj1wPDA/MC1NYXRoLnNxcnQocCpwK20pOk1hdGguc3FydChwKnArbSksYj1tLyhwK2IpKTtsZXQgeT0ocytpKSoocy1pKStiLF89cypkO2ZvcihsZXQgZT10O2U8di0xO2UrKyl7bGV0IGk9bHZ0KHksXyk7MD09PWkmJihpPU51bWJlci5NSU5fVkFMVUUpO2xldCBhPXkvaSxyPV8vaTtpZihlIT09dCYmKGhbZS0xXT1pKSx5PWEqdVtlXStyKmhbZV0saFtlXT1hKmhbZV0tcip1W2VdLF89cip1W2UrMV0sdVtlKzFdPWEqdVtlKzFdLGMpZm9yKGxldCB0PTA7dDxvO3QrKylpPWEqZy5nZXQodCxlKStyKmcuZ2V0KHQsZSsxKSxnLnNldCh0LGUrMSwtcipnLmdldCh0LGUpK2EqZy5nZXQodCxlKzEpKSxnLnNldCh0LGUsaSk7aWYoaT1sdnQoeSxfKSwwPT09aSYmKGk9TnVtYmVyLk1JTl9WQUxVRSksYT15L2kscj1fL2ksdVtlXT1pLHk9YSpoW2VdK3IqdVtlKzFdLHVbZSsxXT0tcipoW2VdK2EqdVtlKzFdLF89cipoW2UrMV0saFtlKzFdPWEqaFtlKzFdLGwmJmU8bi0xKWZvcihsZXQgdD0wO3Q8bjt0KyspaT1hKmYuZ2V0KHQsZSkrcipmLmdldCh0LGUrMSksZi5zZXQodCxlKzEsLXIqZi5nZXQodCxlKSthKmYuZ2V0KHQsZSsxKSksZi5zZXQodCxlLGkpfWhbdi0yXT15O2JyZWFrfWNhc2UgNDppZih1W3RdPD0wJiYodVt0XT11W3RdPDA/LXVbdF06MCxjKSlmb3IobGV0IGU9MDtlPD14O2UrKylnLnNldChlLHQsLWcuZ2V0KGUsdCkpO2Zvcig7dDx4JiYhKHVbdF0+PXVbdCsxXSk7KXtsZXQgZT11W3RdO2lmKHVbdF09dVt0KzFdLHVbdCsxXT1lLGMmJnQ8by0xKWZvcihsZXQgbj0wO248bztuKyspZT1nLmdldChuLHQrMSksZy5zZXQobix0KzEsZy5nZXQobix0KSksZy5zZXQobix0LGUpO2lmKGwmJnQ8bi0xKWZvcihsZXQgbz0wO288bjtvKyspZT1mLmdldChvLHQrMSksZi5zZXQobyx0KzEsZi5nZXQobyx0KSksZi5zZXQobyx0LGUpO3QrK312LS19fWlmKGQpe2xldCB0PWc7Zz1mLGY9dH10aGlzLm09bix0aGlzLm49byx0aGlzLnM9dSx0aGlzLlU9Zix0aGlzLlY9Z31zb2x2ZSh0KXtsZXQgZT10LG49dGhpcy50aHJlc2hvbGQsbz10aGlzLnMubGVuZ3RoLGk9aXZ0Lnplcm9zKG8sbyk7Zm9yKGxldCB0PTA7dDxvO3QrKylNYXRoLmFicyh0aGlzLnNbdF0pPD1uP2kuc2V0KHQsdCwwKTppLnNldCh0LHQsMS90aGlzLnNbdF0pO2xldCBhPXRoaXMuVSxyPXRoaXMucmlnaHRTaW5ndWxhclZlY3RvcnMscz1yLm1tdWwoaSksbD1yLnJvd3MsYz1hLnJvd3MsZD1pdnQuemVyb3MobCxjKTtmb3IobGV0IHQ9MDt0PGw7dCsrKWZvcihsZXQgZT0wO2U8YztlKyspe2xldCBuPTA7Zm9yKGxldCBpPTA7aTxvO2krKyluKz1zLmdldCh0LGkpKmEuZ2V0KGUsaSk7ZC5zZXQodCxlLG4pfXJldHVybiBkLm1tdWwoZSl9c29sdmVGb3JEaWFnb25hbCh0KXtyZXR1cm4gdGhpcy5zb2x2ZShpdnQuZGlhZyh0KSl9aW52ZXJzZSgpe2xldCB0PXRoaXMuVixlPXRoaXMudGhyZXNob2xkLG49dC5yb3dzLG89dC5jb2x1bW5zLGk9bmV3IGl2dChuLHRoaXMucy5sZW5ndGgpO2ZvcihsZXQgYT0wO2E8bjthKyspZm9yKGxldCBuPTA7bjxvO24rKylNYXRoLmFicyh0aGlzLnNbbl0pPmUmJmkuc2V0KGEsbix0LmdldChhLG4pL3RoaXMuc1tuXSk7bGV0IGE9dGhpcy5VLHI9YS5yb3dzLHM9YS5jb2x1bW5zLGw9bmV3IGl2dChuLHIpO2ZvcihsZXQgdD0wO3Q8bjt0KyspZm9yKGxldCBlPTA7ZTxyO2UrKyl7bGV0IG49MDtmb3IobGV0IG89MDtvPHM7bysrKW4rPWkuZ2V0KHQsbykqYS5nZXQoZSxvKTtsLnNldCh0LGUsbil9cmV0dXJuIGx9Z2V0IGNvbmRpdGlvbigpe3JldHVybiB0aGlzLnNbMF0vdGhpcy5zW01hdGgubWluKHRoaXMubSx0aGlzLm4pLTFdfWdldCBub3JtMigpe3JldHVybiB0aGlzLnNbMF19Z2V0IHJhbmsoKXtsZXQgdD1NYXRoLm1heCh0aGlzLm0sdGhpcy5uKSp0aGlzLnNbMF0qTnVtYmVyLkVQU0lMT04sZT0wLG49dGhpcy5zO2ZvcihsZXQgbz0wLGk9bi5sZW5ndGg7bzxpO28rKyluW29dPnQmJmUrKztyZXR1cm4gZX1nZXQgZGlhZ29uYWwoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnMpfWdldCB0aHJlc2hvbGQoKXtyZXR1cm4gTnVtYmVyLkVQU0lMT04vMipNYXRoLm1heCh0aGlzLm0sdGhpcy5uKSp0aGlzLnNbMF19Z2V0IGxlZnRTaW5ndWxhclZlY3RvcnMoKXtyZXR1cm4gdGhpcy5VfWdldCByaWdodFNpbmd1bGFyVmVjdG9ycygpe3JldHVybiB0aGlzLlZ9Z2V0IGRpYWdvbmFsTWF0cml4KCl7cmV0dXJuIGl2dC5kaWFnKHRoaXMucyl9fWZ1bmN0aW9uIHB2dCh0LGUsbixvLGkpe2xldCBhPWl2dC5leWUoZS5sZW5ndGgsZS5sZW5ndGgsbipvKm8pO2NvbnN0IHI9aShlKTtsZXQgcz1uZXcgRmxvYXQ2NEFycmF5KHQueC5sZW5ndGgpO2ZvcihsZXQgZT0wO2U8dC54Lmxlbmd0aDtlKyspc1tlXT1yKHQueFtlXSk7bGV0IGw9KGZ1bmN0aW9uIGModCxlLG4sbyxpKXtjb25zdCBhPW4ubGVuZ3RoLHI9dC54Lmxlbmd0aDtsZXQgcz1uZXcgQXJyYXkoYSk7Zm9yKGxldCBsPTA7bDxhO2wrKyl7c1tsXT1uZXcgQXJyYXkocik7bGV0IGE9bi5zbGljZSgpO2FbbF0rPW87bGV0IGM9aShhKTtmb3IobGV0IG49MDtuPHI7bisrKXNbbF1bbl09ZVtuXS1jKHQueFtuXSl9cmV0dXJuIG5ldyBpdnQocyl9KSh0LHMsZSxvLGkpLGQ9KGZ1bmN0aW9uIHAodCxlKXtjb25zdCBuPXQueC5sZW5ndGg7bGV0IG89bmV3IEFycmF5KG4pO2ZvcihsZXQgaT0wO2k8bjtpKyspb1tpXT1bdC55W2ldLWVbaV1dO3JldHVybiBuZXcgaXZ0KG8pfSkodCxzKSxtPShmdW5jdGlvbiB1KHQsZT0hMSl7cmV0dXJuIHQ9cnZ0LmNoZWNrTWF0cml4KHQpLGU/bmV3IGR2dCh0KS5pbnZlcnNlKCk6KGZ1bmN0aW9uIG4odCxlLG89ITEpe3JldHVybiB0PXJ2dC5jaGVja01hdHJpeCh0KSxlPXJ2dC5jaGVja01hdHJpeChlKSxvP25ldyBkdnQodCkuc29sdmUoZSk6dC5pc1NxdWFyZSgpP25ldyBzdnQodCkuc29sdmUoZSk6bmV3IGN2dCh0KS5zb2x2ZShlKX0pKHQsaXZ0LmV5ZSh0LnJvd3MpKX0pKGEuYWRkKGwubW11bChsLnRyYW5zcG9zZSgpKSkpO3JldHVybihlPShlPW5ldyBpdnQoW2VdKSkuc3ViKG0ubW11bChsKS5tbXVsKGQpLm11bChvKS50cmFuc3Bvc2UoKSkpLnRvMURBcnJheSgpfXZhciBtdnQ9JHYoT2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZGVmYXVsdDpmdW5jdGlvbiB1dnQodCxlLG49e30pe2xldHttYXhJdGVyYXRpb25zOm89MTAwLGdyYWRpZW50RGlmZmVyZW5jZTppPS4xLGRhbXBpbmc6YT0wLGVycm9yVG9sZXJhbmNlOnI9LjAxLG1pblZhbHVlczpzLG1heFZhbHVlczpsLGluaXRpYWxWYWx1ZXM6Y309bjtpZihhPD0wKXRocm93IG5ldyBFcnJvcigiVGhlIGRhbXBpbmcgb3B0aW9uIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiKTtpZighdC54fHwhdC55KXRocm93IG5ldyBFcnJvcigiVGhlIGRhdGEgcGFyYW1ldGVyIG11c3QgaGF2ZSB4IGFuZCB5IGVsZW1lbnRzIik7aWYoIU5NdCh0LngpfHx0LngubGVuZ3RoPDJ8fCFOTXQodC55KXx8dC55Lmxlbmd0aDwyKXRocm93IG5ldyBFcnJvcigiVGhlIGRhdGEgcGFyYW1ldGVyIGVsZW1lbnRzIG11c3QgYmUgYW4gYXJyYXkgd2l0aCBtb3JlIHRoYW4gMiBwb2ludHMiKTtpZih0LngubGVuZ3RoIT09dC55Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlRoZSBkYXRhIHBhcmFtZXRlciBlbGVtZW50cyBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSIpO2xldCBkPWN8fG5ldyBBcnJheShlLmxlbmd0aCkuZmlsbCgxKSxwPWQubGVuZ3RoO2lmKGw9bHx8bmV3IEFycmF5KHApLmZpbGwoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLHM9c3x8bmV3IEFycmF5KHApLmZpbGwoTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIpLGwubGVuZ3RoIT09cy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJtaW5WYWx1ZXMgYW5kIG1heFZhbHVlcyBtdXN0IGJlIHRoZSBzYW1lIHNpemUiKTtpZighTk10KGQpKXRocm93IG5ldyBFcnJvcigiaW5pdGlhbFZhbHVlcyBtdXN0IGJlIGFuIGFycmF5Iik7bGV0IG0sdT16TXQodCxkLGUpLGY9dTw9cjtmb3IobT0wO208byYmIWY7bSsrKXtkPXB2dCh0LGQsYSxpLGUpO2ZvcihsZXQgdD0wO3Q8cDt0KyspZFt0XT1NYXRoLm1pbihNYXRoLm1heChzW3RdLGRbdF0pLGxbdF0pO2lmKHU9ek10KHQsZCxlKSxpc05hTih1KSlicmVhaztmPXU8PXJ9cmV0dXJue3BhcmFtZXRlclZhbHVlczpkLHBhcmFtZXRlckVycm9yOnUsaXRlcmF0aW9uczptfX19KSksZnZ0PVF2JiZRdi5fX2F3YWl0ZXJ8fGZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiBuZXcobnx8KG49UHJvbWlzZSkpKChmdW5jdGlvbihpLGEpe2Z1bmN0aW9uIHIodCl7dHJ5e2woby5uZXh0KHQpKX1jYXRjaCh0KXthKHQpfX1mdW5jdGlvbiBzKHQpe3RyeXtsKG8udGhyb3codCkpfWNhdGNoKHQpe2EodCl9fWZ1bmN0aW9uIGwodCl7dC5kb25lP2kodC52YWx1ZSk6bmV3IG4oKGZ1bmN0aW9uKGUpe2UodC52YWx1ZSl9KSkudGhlbihyLHMpfWwoKG89by5hcHBseSh0LGV8fFtdKSkubmV4dCgpKX0pKX0sZ3Z0PVF2JiZRdi5fX2dlbmVyYXRvcnx8ZnVuY3Rpb24odCxlKXt2YXIgbixvLGksYSxyPXtsYWJlbDowLHNlbnQ6ZnVuY3Rpb24oKXtpZigxJmlbMF0pdGhyb3cgaVsxXTtyZXR1cm4gaVsxXX0sdHJ5czpbXSxvcHM6W119O3JldHVybiBhPXtuZXh0OnMoMCksdGhyb3c6cygxKSxyZXR1cm46cygyKX0sImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKGFbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSksYTtmdW5jdGlvbiBzKGEpe3JldHVybiBmdW5jdGlvbihzKXtyZXR1cm4oZnVuY3Rpb24gbChhKXtpZihuKXRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4iKTtmb3IoO3I7KXRyeXtpZihuPTEsbyYmKGk9MiZhWzBdP28ucmV0dXJuOmFbMF0/by50aHJvd3x8KChpPW8ucmV0dXJuKSYmaS5jYWxsKG8pLDApOm8ubmV4dCkmJiEoaT1pLmNhbGwobyxhWzFdKSkuZG9uZSlyZXR1cm4gaTtzd2l0Y2gobz0wLGkmJihhPVsyJmFbMF0saS52YWx1ZV0pLGFbMF0pe2Nhc2UgMDpjYXNlIDE6aT1hO2JyZWFrO2Nhc2UgNDpyZXR1cm4gci5sYWJlbCsrLHt2YWx1ZTphWzFdLGRvbmU6ITF9O2Nhc2UgNTpyLmxhYmVsKyssbz1hWzFdLGE9WzBdO2NvbnRpbnVlO2Nhc2UgNzphPXIub3BzLnBvcCgpLHIudHJ5cy5wb3AoKTtjb250aW51ZTtkZWZhdWx0OmlmKCEoKGk9KGk9ci50cnlzKS5sZW5ndGg+MCYmaVtpLmxlbmd0aC0xXSl8fDYhPT1hWzBdJiYyIT09YVswXSkpe3I9MDtjb250aW51ZX1pZigzPT09YVswXSYmKCFpfHxhWzFdPmlbMF0mJmFbMV08aVszXSkpe3IubGFiZWw9YVsxXTticmVha31pZig2PT09YVswXSYmci5sYWJlbDxpWzFdKXtyLmxhYmVsPWlbMV0saT1hO2JyZWFrfWlmKGkmJnIubGFiZWw8aVsyXSl7ci5sYWJlbD1pWzJdLHIub3BzLnB1c2goYSk7YnJlYWt9aVsyXSYmci5vcHMucG9wKCksci50cnlzLnBvcCgpO2NvbnRpbnVlfWE9ZS5jYWxsKHQscil9Y2F0Y2godCl7YT1bNix0XSxvPTB9ZmluYWxseXtuPWk9MH1pZig1JmFbMF0pdGhyb3cgYVsxXTtyZXR1cm57dmFsdWU6YVswXT9hWzFdOnZvaWQgMCxkb25lOiEwfX0pKFthLHNdKX19fSxodnQ9UXYmJlF2Ll9fcmVhZHx8ZnVuY3Rpb24odCxlKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0W1N5bWJvbC5pdGVyYXRvcl07aWYoIW4pcmV0dXJuIHQ7dmFyIG8saSxhPW4uY2FsbCh0KSxyPVtdO3RyeXtmb3IoOyh2b2lkIDA9PT1lfHxlLS0gPjApJiYhKG89YS5uZXh0KCkpLmRvbmU7KXIucHVzaChvLnZhbHVlKX1jYXRjaCh0KXtpPXtlcnJvcjp0fX1maW5hbGx5e3RyeXtvJiYhby5kb25lJiYobj1hLnJldHVybikmJm4uY2FsbChhKX1maW5hbGx5e2lmKGkpdGhyb3cgaS5lcnJvcn19cmV0dXJuIHJ9LGJ2dD1RdiYmUXYuX19zcHJlYWR8fGZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXQ9dC5jb25jYXQoaHZ0KGFyZ3VtZW50c1tlXSkpO3JldHVybiB0fSx5dnQ9UXYmJlF2Ll9faW1wb3J0U3Rhcnx8ZnVuY3Rpb24odCl7aWYodCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBlPXt9O2lmKG51bGwhPXQpZm9yKHZhciBuIGluIHQpT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGVbbl09dFtuXSk7cmV0dXJuIGUuZGVmYXVsdD10LGV9LF92dD1RdiYmUXYuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh1Q3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBDdnQ9eXZ0KGZDdCksTXZ0PXl2dChVQ3QpLHZ2dD15dnQoc010KSx4dnQ9eXZ0KGxNdCksT3Z0PXl2dChnQ3QpLFB2dD1fdnQobXZ0KSx3dnQ9MWUtNSxrdnQ9LjAwMSxTdnQ9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2b2lkIDA9PT10JiYodD17fSk7dmFyIGU9dGhpczt0aGlzLmxlYXJuaW5nUmF0ZT0xLHRoaXMubG9jYWxDb25uZWN0aXZpdHk9MSx0aGlzLm1pbkRpc3Q9LjEsdGhpcy5uQ29tcG9uZW50cz0yLHRoaXMubkVwb2Nocz0wLHRoaXMubk5laWdoYm9ycz0xNSx0aGlzLm5lZ2F0aXZlU2FtcGxlUmF0ZT01LHRoaXMucmFuZG9tPU1hdGgucmFuZG9tLHRoaXMucmVwdWxzaW9uU3RyZW5ndGg9MSx0aGlzLnNldE9wTWl4UmF0aW89MSx0aGlzLnNwcmVhZD0xLHRoaXMudHJhbnNmb3JtUXVldWVTaXplPTQsdGhpcy50YXJnZXRNZXRyaWM9ImNhdGVnb3JpY2FsIix0aGlzLnRhcmdldFdlaWdodD0uNSx0aGlzLnRhcmdldE5OZWlnaGJvcnM9dGhpcy5uTmVpZ2hib3JzLHRoaXMuZGlzdGFuY2VGbj1EdnQsdGhpcy5pc0luaXRpYWxpemVkPSExLHRoaXMucnBGb3Jlc3Q9W10sdGhpcy5lbWJlZGRpbmc9W10sdGhpcy5vcHRpbWl6YXRpb25TdGF0ZT1uZXcgUnZ0O3ZhciBuPWZ1bmN0aW9uKG4pe3ZvaWQgMCE9PXRbbl0mJihlW25dPXRbbl0pfTtuKCJkaXN0YW5jZUZuIiksbigibGVhcm5pbmdSYXRlIiksbigibG9jYWxDb25uZWN0aXZpdHkiKSxuKCJtaW5EaXN0IiksbigibkNvbXBvbmVudHMiKSxuKCJuRXBvY2hzIiksbigibk5laWdoYm9ycyIpLG4oIm5lZ2F0aXZlU2FtcGxlUmF0ZSIpLG4oInJhbmRvbSIpLG4oInJlcHVsc2lvblN0cmVuZ3RoIiksbigic2V0T3BNaXhSYXRpbyIpLG4oInNwcmVhZCIpLG4oInRyYW5zZm9ybVF1ZXVlU2l6ZSIpfXJldHVybiB0LnByb3RvdHlwZS5maXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW5pdGlhbGl6ZUZpdCh0KSx0aGlzLm9wdGltaXplTGF5b3V0KCksdGhpcy5lbWJlZGRpbmd9LHQucHJvdG90eXBlLmZpdEFzeW5jPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPWZ1bmN0aW9uKCl7cmV0dXJuITB9KSxmdnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbigpe3JldHVybiBndnQodGhpcywoZnVuY3Rpb24obil7c3dpdGNoKG4ubGFiZWwpe2Nhc2UgMDpyZXR1cm4gdGhpcy5pbml0aWFsaXplRml0KHQpLFs0LHRoaXMub3B0aW1pemVMYXlvdXRBc3luYyhlKV07Y2FzZSAxOnJldHVybiBuLnNlbnQoKSxbMix0aGlzLmVtYmVkZGluZ119fSkpfSkpfSx0LnByb3RvdHlwZS5zZXRTdXBlcnZpc2VkUHJvamVjdGlvbj1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPXt9KSx0aGlzLlk9dCx0aGlzLnRhcmdldE1ldHJpYz1lLnRhcmdldE1ldHJpY3x8dGhpcy50YXJnZXRNZXRyaWMsdGhpcy50YXJnZXRXZWlnaHQ9ZS50YXJnZXRXZWlnaHR8fHRoaXMudGFyZ2V0V2VpZ2h0LHRoaXMudGFyZ2V0Tk5laWdoYm9ycz1lLnRhcmdldE5OZWlnaGJvcnN8fHRoaXMudGFyZ2V0Tk5laWdoYm9yc30sdC5wcm90b3R5cGUuc2V0UHJlY29tcHV0ZWRLTk49ZnVuY3Rpb24odCxlKXt0aGlzLmtubkluZGljZXM9dCx0aGlzLmtubkRpc3RhbmNlcz1lfSx0LnByb3RvdHlwZS5pbml0aWFsaXplRml0PWZ1bmN0aW9uKHQpe2lmKHQubGVuZ3RoPD10aGlzLm5OZWlnaGJvcnMpdGhyb3cgbmV3IEVycm9yKCJOb3QgZW5vdWdoIGRhdGEgcG9pbnRzICgiK3QubGVuZ3RoKyIpIHRvIGNyZWF0ZSBuTmVpZ2hib3JzOiAiK3RoaXMubk5laWdoYm9ycysiLiAgQWRkIG1vcmUgZGF0YSBwb2ludHMgb3IgYWRqdXN0IHRoZSBjb25maWd1cmF0aW9uLiIpO2lmKHRoaXMuWD09PXQmJnRoaXMuaXNJbml0aWFsaXplZClyZXR1cm4gdGhpcy5nZXRORXBvY2hzKCk7aWYodGhpcy5YPXQsIXRoaXMua25uSW5kaWNlcyYmIXRoaXMua25uRGlzdGFuY2VzKXt2YXIgZT10aGlzLm5lYXJlc3ROZWlnaGJvcnModCk7dGhpcy5rbm5JbmRpY2VzPWUua25uSW5kaWNlcyx0aGlzLmtubkRpc3RhbmNlcz1lLmtubkRpc3RhbmNlc310aGlzLmdyYXBoPXRoaXMuZnV6enlTaW1wbGljaWFsU2V0KHQsdGhpcy5uTmVpZ2hib3JzLHRoaXMuc2V0T3BNaXhSYXRpbyksdGhpcy5tYWtlU2VhcmNoRm5zKCksdGhpcy5zZWFyY2hHcmFwaD10aGlzLm1ha2VTZWFyY2hHcmFwaCh0KSx0aGlzLnByb2Nlc3NHcmFwaEZvclN1cGVydmlzZWRQcm9qZWN0aW9uKCk7dmFyIG49dGhpcy5pbml0aWFsaXplU2ltcGxpY2lhbFNldEVtYmVkZGluZygpLG89bi50YWlsLGk9bi5lcG9jaHNQZXJTYW1wbGU7cmV0dXJuIHRoaXMub3B0aW1pemF0aW9uU3RhdGUuaGVhZD1uLmhlYWQsdGhpcy5vcHRpbWl6YXRpb25TdGF0ZS50YWlsPW8sdGhpcy5vcHRpbWl6YXRpb25TdGF0ZS5lcG9jaHNQZXJTYW1wbGU9aSx0aGlzLmluaXRpYWxpemVPcHRpbWl6YXRpb24oKSx0aGlzLnByZXBhcmVGb3JPcHRpbWl6YXRpb25Mb29wKCksdGhpcy5pc0luaXRpYWxpemVkPSEwLHRoaXMuZ2V0TkVwb2NocygpfSx0LnByb3RvdHlwZS5tYWtlU2VhcmNoRm5zPWZ1bmN0aW9uKCl7dmFyIHQ9dnZ0Lm1ha2VJbml0aWFsaXphdGlvbnModGhpcy5kaXN0YW5jZUZuKSxlPXQuaW5pdEZyb21SYW5kb207dGhpcy5pbml0RnJvbVRyZWU9dC5pbml0RnJvbVRyZWUsdGhpcy5pbml0RnJvbVJhbmRvbT1lLHRoaXMuc2VhcmNoPXZ2dC5tYWtlSW5pdGlhbGl6ZWROTlNlYXJjaCh0aGlzLmRpc3RhbmNlRm4pfSx0LnByb3RvdHlwZS5tYWtlU2VhcmNoR3JhcGg9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMua25uSW5kaWNlcyxuPXRoaXMua25uRGlzdGFuY2VzLG89bmV3IE12dC5TcGFyc2VNYXRyaXgoW10sW10sW10sW3QubGVuZ3RoLHQubGVuZ3RoXSksaT0wO2k8ZS5sZW5ndGg7aSsrKWZvcih2YXIgYT1lW2ldLHI9bltpXSxzPTA7czxhLmxlbmd0aDtzKyspe3ZhciBsPXJbc107bD4wJiZvLnNldChpLGFbc10sbCl9dmFyIGM9TXZ0LnRyYW5zcG9zZShvKTtyZXR1cm4gTXZ0Lm1heGltdW0obyxjKX0sdC5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLlg7aWYodm9pZCAwPT09bnx8MD09PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiTm8gZGF0YSBoYXMgYmVlbiBmaXQuIik7dmFyIG89TWF0aC5mbG9vcih0aGlzLm5OZWlnaGJvcnMqdGhpcy50cmFuc2Zvcm1RdWV1ZVNpemUpO289TWF0aC5taW4obi5sZW5ndGgsbyk7dmFyIGk9dnZ0LmluaXRpYWxpemVTZWFyY2godGhpcy5ycEZvcmVzdCxuLHQsbyx0aGlzLmluaXRGcm9tUmFuZG9tLHRoaXMuaW5pdEZyb21UcmVlLHRoaXMucmFuZG9tKSxhPXRoaXMuc2VhcmNoKG4sdGhpcy5zZWFyY2hHcmFwaCxpLHQpLHI9Q3Z0LmRlaGVhcFNvcnQoYSkscz1yLmluZGljZXMsbD1yLndlaWdodHM7cz1zLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuc2xpY2UoMCxlLm5OZWlnaGJvcnMpfSkpLGw9bC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnNsaWNlKDAsZS5uTmVpZ2hib3JzKX0pKTt2YXIgYz1NYXRoLm1heCgwLHRoaXMubG9jYWxDb25uZWN0aXZpdHktMSksZD10aGlzLnNtb290aEtOTkRpc3RhbmNlKGwsdGhpcy5uTmVpZ2hib3JzLGMpLHA9dGhpcy5jb21wdXRlTWVtYmVyc2hpcFN0cmVuZ3RocyhzLGwsZC5zaWdtYXMsZC5yaG9zKSxtPW5ldyBNdnQuU3BhcnNlTWF0cml4KHAucm93cyxwLmNvbHMscC52YWxzLFt0Lmxlbmd0aCxuLmxlbmd0aF0pLHU9TXZ0Lm5vcm1hbGl6ZShtLCJsMSIpLGY9TXZ0LmdldENTUih1KSxnPXQubGVuZ3RoLGg9SHZ0KE92dC5yZXNoYXBlMmQoZi5pbmRpY2VzLGcsdGhpcy5uTmVpZ2hib3JzKSxPdnQucmVzaGFwZTJkKGYudmFsdWVzLGcsdGhpcy5uTmVpZ2hib3JzKSx0aGlzLmVtYmVkZGluZyksYj10aGlzLm5FcG9jaHM/dGhpcy5uRXBvY2hzLzM6bS5uUm93czw9MWU0PzEwMDozMCx5PW0uZ2V0VmFsdWVzKCkucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBlPnQ/ZTp0fSksMCk7bT1tLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQ8eS9iPzA6dH0pKSxtPU12dC5lbGltaW5hdGVaZXJvcyhtKTt2YXIgXz10aGlzLm1ha2VFcG9jaHNQZXJTYW1wbGUobS5nZXRWYWx1ZXMoKSxiKSxDPW0uZ2V0Um93cygpLE09bS5nZXRDb2xzKCk7cmV0dXJuIHRoaXMuYXNzaWduT3B0aW1pemF0aW9uU3RhdGVQYXJhbWV0ZXJzKHtoZWFkRW1iZWRkaW5nOmgsdGFpbEVtYmVkZGluZzp0aGlzLmVtYmVkZGluZyxoZWFkOkMsdGFpbDpNLGN1cnJlbnRFcG9jaDowLG5FcG9jaHM6YixuVmVydGljZXM6bS5nZXREaW1zKClbMV0sZXBvY2hzUGVyU2FtcGxlOl99KSx0aGlzLnByZXBhcmVGb3JPcHRpbWl6YXRpb25Mb29wKCksdGhpcy5vcHRpbWl6ZUxheW91dCgpfSx0LnByb3RvdHlwZS5wcm9jZXNzR3JhcGhGb3JTdXBlcnZpc2VkUHJvamVjdGlvbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuWTtpZih0KXtpZih0Lmxlbmd0aCE9PXRoaXMuWC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJMZW5ndGggb2YgWCBhbmQgeSBtdXN0IGJlIGVxdWFsIik7ImNhdGVnb3JpY2FsIj09PXRoaXMudGFyZ2V0TWV0cmljJiYodGhpcy5ncmFwaD10aGlzLmNhdGVnb3JpY2FsU2ltcGxpY2lhbFNldEludGVyc2VjdGlvbih0aGlzLmdyYXBoLHQsdGhpcy50YXJnZXRXZWlnaHQ8MT8xLygxLXRoaXMudGFyZ2V0V2VpZ2h0KSoyLjU6MWUxMikpfX0sdC5wcm90b3R5cGUuc3RlcD1mdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW1pemF0aW9uU3RhdGUuY3VycmVudEVwb2NoO3JldHVybiB0PHRoaXMuZ2V0TkVwb2NocygpJiZ0aGlzLm9wdGltaXplTGF5b3V0U3RlcCh0KSx0aGlzLm9wdGltaXphdGlvblN0YXRlLmN1cnJlbnRFcG9jaH0sdC5wcm90b3R5cGUuZ2V0RW1iZWRkaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW1iZWRkaW5nfSx0LnByb3RvdHlwZS5uZWFyZXN0TmVpZ2hib3JzPWZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy5uTmVpZ2hib3JzLG89dnZ0Lm1ha2VOTkRlc2NlbnQodGhpcy5kaXN0YW5jZUZuLHRoaXMucmFuZG9tKSxpPTUrTWF0aC5mbG9vciguNT09KGU9TWF0aC5wb3codC5sZW5ndGgsLjUpLzIwKT8wOk1hdGgucm91bmQoZSkpLGE9TWF0aC5tYXgoNSxNYXRoLmZsb29yKE1hdGgucm91bmQoKGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmxvZyh0KS9NYXRoLmxvZygyKX0pKHQubGVuZ3RoKSkpKTt0aGlzLnJwRm9yZXN0PXh2dC5tYWtlRm9yZXN0KHQsbixpLHRoaXMucmFuZG9tKTt2YXIgcj1vKHQseHZ0Lm1ha2VMZWFmQXJyYXkodGhpcy5ycEZvcmVzdCksbixhKTtyZXR1cm57a25uSW5kaWNlczpyLmluZGljZXMsa25uRGlzdGFuY2VzOnIud2VpZ2h0c319LHQucHJvdG90eXBlLmZ1enp5U2ltcGxpY2lhbFNldD1mdW5jdGlvbih0LGUsbil7dm9pZCAwPT09biYmKG49MSk7dmFyIG89dGhpcyxpPW8ua25uSW5kaWNlcyxhPXZvaWQgMD09PWk/W106aSxyPW8ua25uRGlzdGFuY2VzLHM9dm9pZCAwPT09cj9bXTpyLGw9dGhpcy5zbW9vdGhLTk5EaXN0YW5jZShzLGUsby5sb2NhbENvbm5lY3Rpdml0eSksYz10aGlzLmNvbXB1dGVNZW1iZXJzaGlwU3RyZW5ndGhzKGEscyxsLnNpZ21hcyxsLnJob3MpLGQ9bmV3IE12dC5TcGFyc2VNYXRyaXgoYy5yb3dzLGMuY29scyxjLnZhbHMsW3QubGVuZ3RoLHQubGVuZ3RoXSkscD1NdnQudHJhbnNwb3NlKGQpLG09TXZ0LnBhaXJ3aXNlTXVsdGlwbHkoZCxwKSx1PU12dC5zdWJ0cmFjdChNdnQuYWRkKGQscCksbSksZj1NdnQubXVsdGlwbHlTY2FsYXIodSxuKSxnPU12dC5tdWx0aXBseVNjYWxhcihtLDEtbik7cmV0dXJuIE12dC5hZGQoZixnKX0sdC5wcm90b3R5cGUuY2F0ZWdvcmljYWxTaW1wbGljaWFsU2V0SW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLG8pe3ZvaWQgMD09PW8mJihvPTEpO3ZhciBpPXp2dCh0LGUsbyxuKTtyZXR1cm4gSXZ0KGk9TXZ0LmVsaW1pbmF0ZVplcm9zKGkpKX0sdC5wcm90b3R5cGUuc21vb3RoS05ORGlzdGFuY2U9ZnVuY3Rpb24odCxlLG4sbyxpKXt2b2lkIDA9PT1uJiYobj0xKSx2b2lkIDA9PT1vJiYobz02NCksdm9pZCAwPT09aSYmKGk9MSk7Zm9yKHZhciBhPU1hdGgubG9nKGUpL01hdGgubG9nKDIpKmkscj1PdnQuemVyb3ModC5sZW5ndGgpLHM9T3Z0Lnplcm9zKHQubGVuZ3RoKSxsPTA7bDx0Lmxlbmd0aDtsKyspe3ZhciBjPTAsZD0xLzAscD0xLG09dFtsXSx1PW0uZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdD4wfSkpO2lmKHUubGVuZ3RoPj1uKXt2YXIgZj1NYXRoLmZsb29yKG4pLGc9bi1mO2Y+MD8ocltsXT11W2YtMV0sZz53dnQmJihyW2xdKz1nKih1W2ZdLXVbZi0xXSkpKTpyW2xdPWcqdVswXX1lbHNlIHUubGVuZ3RoPjAmJihyW2xdPU92dC5tYXgodSkpO2Zvcih2YXIgaD0wO2g8bztoKyspe2Zvcih2YXIgYj0wLHk9MTt5PHRbbF0ubGVuZ3RoO3krKyl7dmFyIF89dFtsXVt5XS1yW2xdO2IrPV8+MD9NYXRoLmV4cCgtXy9wKToxfWlmKE1hdGguYWJzKGItYSk8d3Z0KWJyZWFrO2I+YT9wPShjKyhkPXApKS8yOihjPXAsZD09PTEvMD9wKj0yOnA9KGMrZCkvMil9aWYoc1tsXT1wLHJbbF0+MCl7dmFyIEM9T3Z0Lm1lYW4obSk7c1tsXTxrdnQqQyYmKHNbbF09a3Z0KkMpfWVsc2V7dmFyIE09T3Z0Lm1lYW4odC5tYXAoT3Z0Lm1lYW4pKTtzW2xdPGt2dCpNJiYoc1tsXT1rdnQqTSl9fXJldHVybntzaWdtYXM6cyxyaG9zOnJ9fSx0LnByb3RvdHlwZS5jb21wdXRlTWVtYmVyc2hpcFN0cmVuZ3Rocz1mdW5jdGlvbih0LGUsbixvKXtmb3IodmFyIGk9dC5sZW5ndGgsYT10WzBdLmxlbmd0aCxyPU92dC56ZXJvcyhpKmEpLHM9T3Z0Lnplcm9zKGkqYSksbD1PdnQuemVyb3MoaSphKSxjPTA7YzxpO2MrKylmb3IodmFyIGQ9MDtkPGE7ZCsrKXt2YXIgcD0wOy0xIT09dFtjXVtkXSYmKHA9dFtjXVtkXT09PWM/MDplW2NdW2RdLW9bY108PTA/MTpNYXRoLmV4cCgtKGVbY11bZF0tb1tjXSkvbltjXSkscltjKmErZF09YyxzW2MqYStkXT10W2NdW2RdLGxbYyphK2RdPXApfXJldHVybntyb3dzOnIsY29sczpzLHZhbHM6bH19LHQucHJvdG90eXBlLmluaXRpYWxpemVTaW1wbGljaWFsU2V0RW1iZWRkaW5nPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMsZT10aGlzLmdldE5FcG9jaHMoKSxuPXRoaXMubkNvbXBvbmVudHMsbz10aGlzLmdyYXBoLmdldFZhbHVlcygpLGk9MCxhPTA7YTxvLmxlbmd0aDthKyspaTxvW2FdJiYoaT1vW2FdKTt2YXIgcj10aGlzLmdyYXBoLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQ8aS9lPzA6dH0pKTt0aGlzLmVtYmVkZGluZz1PdnQuemVyb3Moci5uUm93cykubWFwKChmdW5jdGlvbigpe3JldHVybiBPdnQuemVyb3MobikubWFwKChmdW5jdGlvbigpe3JldHVybiAyMCpPdnQudGF1UmFuZCh0LnJhbmRvbSktMTB9KSl9KSk7dmFyIHM9W10sbD1bXSxjPVtdLGQ9ci5nZXRBbGwoKTtmb3IoYT0wO2E8ZC5sZW5ndGg7YSsrKXt2YXIgcD1kW2FdO3AudmFsdWUmJihzLnB1c2gocC52YWx1ZSksYy5wdXNoKHAucm93KSxsLnB1c2gocC5jb2wpKX1yZXR1cm57aGVhZDpsLHRhaWw6YyxlcG9jaHNQZXJTYW1wbGU6dGhpcy5tYWtlRXBvY2hzUGVyU2FtcGxlKHMsZSl9fSx0LnByb3RvdHlwZS5tYWtlRXBvY2hzUGVyU2FtcGxlPWZ1bmN0aW9uKHQsZSl7dmFyIG49T3Z0LmZpbGxlZCh0Lmxlbmd0aCwtMSksbz1PdnQubWF4KHQpLGk9dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0L28qZX0pKTtyZXR1cm4gaS5mb3JFYWNoKChmdW5jdGlvbih0LG8pe3Q+MCYmKG5bb109ZS9pW29dKX0pKSxufSx0LnByb3RvdHlwZS5hc3NpZ25PcHRpbWl6YXRpb25TdGF0ZVBhcmFtZXRlcnM9ZnVuY3Rpb24odCl7T2JqZWN0LmFzc2lnbih0aGlzLm9wdGltaXphdGlvblN0YXRlLHQpfSx0LnByb3RvdHlwZS5wcmVwYXJlRm9yT3B0aW1pemF0aW9uTG9vcD1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10LnJlcHVsc2lvblN0cmVuZ3RoLG49dC5sZWFybmluZ1JhdGUsbz10Lm5lZ2F0aXZlU2FtcGxlUmF0ZSxpPXRoaXMub3B0aW1pemF0aW9uU3RhdGUsYT1pLmVwb2Noc1BlclNhbXBsZSxyPWkuaGVhZEVtYmVkZGluZyxzPXJbMF0ubGVuZ3RoLGw9ci5sZW5ndGg9PT1pLnRhaWxFbWJlZGRpbmcubGVuZ3RoLGM9YS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0L299KSksZD1idnQoYykscD1idnQoYSk7dGhpcy5hc3NpZ25PcHRpbWl6YXRpb25TdGF0ZVBhcmFtZXRlcnMoe2Vwb2NoT2ZOZXh0U2FtcGxlOnAsZXBvY2hPZk5leHROZWdhdGl2ZVNhbXBsZTpkLGVwb2Noc1Blck5lZ2F0aXZlU2FtcGxlOmMsbW92ZU90aGVyOmwsaW5pdGlhbEFscGhhOm4sYWxwaGE6bixnYW1tYTplLGRpbTpzfSl9LHQucHJvdG90eXBlLmluaXRpYWxpemVPcHRpbWl6YXRpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVtYmVkZGluZyxlPXRoaXMuZW1iZWRkaW5nLG49dGhpcy5vcHRpbWl6YXRpb25TdGF0ZSxvPW4uaGVhZCxpPW4udGFpbCxhPW4uZXBvY2hzUGVyU2FtcGxlLHI9dGhpcy5nZXRORXBvY2hzKCkscz10aGlzLmdyYXBoLm5Db2xzLGw9TnZ0KHRoaXMuc3ByZWFkLHRoaXMubWluRGlzdCk7dGhpcy5hc3NpZ25PcHRpbWl6YXRpb25TdGF0ZVBhcmFtZXRlcnMoe2hlYWRFbWJlZGRpbmc6dCx0YWlsRW1iZWRkaW5nOmUsaGVhZDpvLHRhaWw6aSxlcG9jaHNQZXJTYW1wbGU6YSxhOmwuYSxiOmwuYixuRXBvY2hzOnIsblZlcnRpY2VzOnN9KX0sdC5wcm90b3R5cGUub3B0aW1pemVMYXlvdXRTdGVwPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLm9wdGltaXphdGlvblN0YXRlLG49ZS5oZWFkLG89ZS50YWlsLGk9ZS5oZWFkRW1iZWRkaW5nLGE9ZS50YWlsRW1iZWRkaW5nLHI9ZS5lcG9jaHNQZXJTYW1wbGUscz1lLmVwb2NoT2ZOZXh0U2FtcGxlLGw9ZS5lcG9jaE9mTmV4dE5lZ2F0aXZlU2FtcGxlLGM9ZS5lcG9jaHNQZXJOZWdhdGl2ZVNhbXBsZSxkPWUubW92ZU90aGVyLHA9ZS5pbml0aWFsQWxwaGEsbT1lLmFscGhhLHU9ZS5nYW1tYSxmPWUuYSxnPWUuYixoPWUuZGltLGI9ZS5uRXBvY2hzLHk9ZS5uVmVydGljZXMsXz0wO188ci5sZW5ndGg7XysrKWlmKCEoc1tfXT50KSl7dmFyIEM9bltfXSxNPWlbQ10sdj1hW29bX11dLHg9VHZ0KE0sdiksTz0wO3g+MCYmKE89LTIqZipnKk1hdGgucG93KHgsZy0xKSxPLz1mKk1hdGgucG93KHgsZykrMSk7Zm9yKHZhciBQPTA7UDxoO1ArKyl7dmFyIHc9QXZ0KE8qKE1bUF0tdltQXSksNCk7TVtQXSs9dyptLGQmJih2W1BdKz0tdyptKX1zW19dKz1yW19dO2Zvcih2YXIgaz1NYXRoLmZsb29yKCh0LWxbX10pL2NbX10pLFM9MDtTPGs7UysrKXt2YXIgRD1PdnQudGF1UmFuZEludCh5LHRoaXMucmFuZG9tKSxFPWFbRF0sUj1UdnQoTSxFKSxBPTA7aWYoUj4wKUE9Mip1KmcsQS89KC4wMDErUikqKGYqTWF0aC5wb3coUixnKSsxKTtlbHNlIGlmKEM9PT1EKWNvbnRpbnVlO2ZvcihQPTA7UDxoO1ArKyl3PTQsQT4wJiYodz1BdnQoQSooTVtQXS1FW1BdKSw0KSksTVtQXSs9dyptfWxbX10rPWsqY1tfXX1yZXR1cm4gZS5hbHBoYT1wKigxLXQvYiksZS5jdXJyZW50RXBvY2grPTEsaX0sdC5wcm90b3R5cGUub3B0aW1pemVMYXlvdXRBc3luYz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiB2b2lkIDA9PT10JiYodD1mdW5jdGlvbigpe3JldHVybiEwfSksbmV3IFByb21pc2UoKGZ1bmN0aW9uKG4sbyl7dmFyIGk9ZnVuY3Rpb24oKXtyZXR1cm4gZnZ0KGUsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24oKXt2YXIgZSxhLHIscyxsO3JldHVybiBndnQodGhpcywoZnVuY3Rpb24oYyl7dHJ5e2lmKGE9KGU9dGhpcy5vcHRpbWl6YXRpb25TdGF0ZSkubkVwb2Nocyx0aGlzLmVtYmVkZGluZz10aGlzLm9wdGltaXplTGF5b3V0U3RlcChlLmN1cnJlbnRFcG9jaCkscz0hMT09PXQocj10aGlzLm9wdGltaXphdGlvblN0YXRlLmN1cnJlbnRFcG9jaCksbD1yPT09YSxzfHxsKXJldHVyblsyLG4obCldO3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cmV0dXJuIGkoKX0pLDApfWNhdGNoKHQpe28odCl9cmV0dXJuWzJdfSkpfSkpfTtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3JldHVybiBpKCl9KSwwKX0pKX0sdC5wcm90b3R5cGUub3B0aW1pemVMYXlvdXQ9ZnVuY3Rpb24odCl7dm9pZCAwPT09dCYmKHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH0pO2Zvcih2YXIgZT0hMSxuPVtdOyFlOyl7dmFyIG89dGhpcy5vcHRpbWl6YXRpb25TdGF0ZSxpPW8ubkVwb2NocztuPXRoaXMub3B0aW1pemVMYXlvdXRTdGVwKG8uY3VycmVudEVwb2NoKTt2YXIgYT10aGlzLm9wdGltaXphdGlvblN0YXRlLmN1cnJlbnRFcG9jaCxyPSExPT09dChhKTtlPWE9PT1pfHxyfXJldHVybiBufSx0LnByb3RvdHlwZS5nZXRORXBvY2hzPWZ1bmN0aW9uKCl7aWYodGhpcy5uRXBvY2hzPjApcmV0dXJuIHRoaXMubkVwb2Noczt2YXIgdD10aGlzLmdyYXBoLm5Sb3dzO3JldHVybiB0PD0yNTAwPzUwMDp0PD01ZTM/NDAwOnQ8PTc1MDA/MzAwOjIwMH0sdH0pKCk7ZnVuY3Rpb24gRHZ0KHQsZSl7Zm9yKHZhciBuPTAsbz0wO288dC5sZW5ndGg7bysrKW4rPU1hdGgucG93KHRbb10tZVtvXSwyKTtyZXR1cm4gTWF0aC5zcXJ0KG4pfXVDdC5VTUFQPVN2dCx1Q3QuZXVjbGlkZWFuPUR2dCx1Q3QuY29zaW5lPWZ1bmN0aW9uIEV2dCh0LGUpe2Zvcih2YXIgbj0wLG89MCxpPTAsYT0wO2E8dC5sZW5ndGg7YSsrKW4rPXRbYV0qZVthXSxvKz1NYXRoLnBvdyh0W2FdLDIpLGkrPU1hdGgucG93KGVbYV0sMik7cmV0dXJuIDA9PT1vJiYwPT09aT8wOjA9PT1vfHwwPT09aT8xOjEtbi9NYXRoLnNxcnQobyppKX07dmFyIFJ2dD1mdW5jdGlvbiBSdnQoKXt0aGlzLmN1cnJlbnRFcG9jaD0wLHRoaXMuaGVhZEVtYmVkZGluZz1bXSx0aGlzLnRhaWxFbWJlZGRpbmc9W10sdGhpcy5oZWFkPVtdLHRoaXMudGFpbD1bXSx0aGlzLmVwb2Noc1BlclNhbXBsZT1bXSx0aGlzLmVwb2NoT2ZOZXh0U2FtcGxlPVtdLHRoaXMuZXBvY2hPZk5leHROZWdhdGl2ZVNhbXBsZT1bXSx0aGlzLmVwb2Noc1Blck5lZ2F0aXZlU2FtcGxlPVtdLHRoaXMubW92ZU90aGVyPSEwLHRoaXMuaW5pdGlhbEFscGhhPTEsdGhpcy5hbHBoYT0xLHRoaXMuZ2FtbWE9MSx0aGlzLmE9MS41NzY5NDM0NjAzMTEzMDc3LHRoaXMuYj0uODk1MDYwODc3OTEwOTczMyx0aGlzLmRpbT0yLHRoaXMubkVwb2Nocz01MDAsdGhpcy5uVmVydGljZXM9MH07ZnVuY3Rpb24gQXZ0KHQsZSl7cmV0dXJuIHQ+ZT9lOnQ8LWU/LWU6dH1mdW5jdGlvbiBUdnQodCxlKXtmb3IodmFyIG49MCxvPTA7bzx0Lmxlbmd0aDtvKyspbis9TWF0aC5wb3codFtvXS1lW29dLDIpO3JldHVybiBufWZ1bmN0aW9uIE52dCh0LGUpe3ZhciBuPU92dC5saW5lYXIoMCwzKnQsMzAwKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0PGU/MTp0fSkpLG89T3Z0Lnplcm9zKG4ubGVuZ3RoKS5tYXAoKGZ1bmN0aW9uKG8saSl7cmV0dXJuIG5baV0+PWU/TWF0aC5leHAoLShuW2ldLWUpL3QpOm99KSksaT1QdnQuZGVmYXVsdCh7eDpuLHk6b30sKGZ1bmN0aW9uKHQpe3ZhciBlPWh2dCh0LDIpLG49ZVswXSxvPWVbMV07cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiAxLygxK24qTWF0aC5wb3codCwyKm8pKX19KSx7ZGFtcGluZzoxLjUsaW5pdGlhbFZhbHVlczpbLjUsLjVdLGdyYWRpZW50RGlmZmVyZW5jZTouMSxtYXhJdGVyYXRpb25zOjEwMCxlcnJvclRvbGVyYW5jZTouMDF9KS5wYXJhbWV0ZXJWYWx1ZXMsYT1odnQoaSwyKTtyZXR1cm57YTphWzBdLGI6YVsxXX19ZnVuY3Rpb24genZ0KHQsZSxuLG8pe3JldHVybiB2b2lkIDA9PT1uJiYobj0xKSx2b2lkIDA9PT1vJiYobz01KSx0Lm1hcCgoZnVuY3Rpb24odCxpLGEpe3JldHVybi0xPT09ZVtpXXx8LTE9PT1lW2FdP3QqTWF0aC5leHAoLW4pOmVbaV0hPT1lW2FdP3QqTWF0aC5leHAoLW8pOnR9KSl9ZnVuY3Rpb24gSXZ0KHQpe3Q9TXZ0Lm5vcm1hbGl6ZSh0LCJtYXgiKTt2YXIgZT1NdnQudHJhbnNwb3NlKHQpLG49TXZ0LnBhaXJ3aXNlTXVsdGlwbHkoZSx0KTtyZXR1cm4gdD1NdnQuYWRkKHQsTXZ0LnN1YnRyYWN0KGUsbikpLE12dC5lbGltaW5hdGVaZXJvcyh0KX1mdW5jdGlvbiBIdnQodCxlLG4pe2Zvcih2YXIgbz1PdnQuemVyb3ModC5sZW5ndGgpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIE92dC56ZXJvcyhuWzBdLmxlbmd0aCl9KSksaT0wO2k8dC5sZW5ndGg7aSsrKWZvcih2YXIgYT0wO2E8dFswXS5sZW5ndGg7YSsrKWZvcih2YXIgcj0wO3I8blswXS5sZW5ndGg7cisrKW9baV1bcl0rPWVbaV1bYV0qblt0W2ldW2FdXVtyXTtyZXR1cm4gb31mdW5jdGlvbiBGdnQodCl7bGV0IGUsbixvPXQubGVuZ3RoO2Zvcig7bzspbj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqby0tKSxlPXRbb10sdFtvXT10W25dLHRbbl09ZTtyZXR1cm4gdH1mdW5jdGlvbiBMdnQodCxlKXtyZXR1cm5gJHtlfS8ke3R9YH11Q3QuZmluZEFCUGFyYW1zPU52dCx1Q3QuZmFzdEludGVyc2VjdGlvbj16dnQsdUN0LnJlc2V0TG9jYWxDb25uZWN0aXZpdHk9SXZ0LHVDdC5pbml0VHJhbnNmb3JtPUh2dCxPYmplY3QuZGVmaW5lUHJvcGVydHkobUN0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxtQ3QuVU1BUD11Q3QuVU1BUDtjbGFzcyBCdnR7Y29uc3RydWN0b3IodCl7dGhpcy5odHRwPXQsdGhpcy5odHRwUGF0aFByZWZpeD0iZGF0YS9wbHVnaW4vbnBtaSJ9ZmV0Y2hEYXRhKHQpe3JldHVybiAkdCh0aGlzLmZldGNoQW5ub3RhdGlvbnModCksdGhpcy5mZXRjaE1ldHJpY3ModCksdGhpcy5mZXRjaFZhbHVlcyh0KSx0aGlzLmZldGNoRW1iZWRkaW5ncyh0KSkucGlwZShJdCgoKFt0LGUsbixvXSk9Pntjb25zdCBpPXt9LGE9e307bGV0IHIscz0wO2Zvcihjb25zdCByIG9mIE9iamVjdC5rZXlzKHQpKWZvcihjb25zdCBsIGluIHRbcl0pe2NvbnN0IGM9dFtyXVtsXTtPYmplY3Qua2V5cyhvKS5sZW5ndGgmJiFhW2NdJiZvW3JdW2xdJiZvW3JdW2xdLnNvbWUoKHQ9PjAhPT10KSkmJihhW2NdPXt2ZWN0b3I6b1tyXVtsXSxpbmRleDpzLG5hbWU6Y30scys9MSk7Y29uc3QgZD1uZXcgTWFwO2Zvcihjb25zdCB0IGluIGVbcl0pe2NvbnN0IG89ZVtyXVt0XSxpPW55dChvKTtsZXQgYT1kLmdldChpKTthfHwoYT17blBNSVZhbHVlOm51bGwsY291bnRWYWx1ZTpudWxsLGFubm90YXRpb246YyxtZXRyaWM6aSxydW46cn0sZC5zZXQoaSxhKSksJGJ0KG8pP2EuY291bnRWYWx1ZT1uW3JdW2xdW3RdOnR5dChvKSYmKGEublBNSVZhbHVlPW5bcl1bbF1bdF0pfWlbY109Wy4uLmlbY10/aVtjXTpbXSwuLi5kLnZhbHVlcygpXX1yZXR1cm4gT2JqZWN0LmtleXMoYSkubGVuZ3RoJiYocj0oZnVuY3Rpb24gbCh0KXtjb25zdCBlPU9iamVjdC5rZXlzKHQpO3JldHVybntwb2ludHM6dCxwb2ludEtleXM6ZSxzaHVmZmxlZERhdGFJbmRpY2VzOkZ2dCgobj1lLmxlbmd0aCxbLi4ubmV3IEFycmF5KG4pXS5tYXAoKCh0LGUpPT5lKSkpKSxoYXNVbWFwUnVuOiExfTt2YXIgbn0pKGEpKSx7YW5ub3RhdGlvbkRhdGE6aSxtZXRyaWNzOmUsZW1iZWRkaW5nRGF0YVNldDpyfX0pKSxwZSgodD0+dCBpbnN0YW5jZW9mIHhEJiY0MDA8PXQuc3RhdHVzJiZ0LnN0YXR1czw1MDA/RXQoe2Fubm90YXRpb25EYXRhOnt9LG1ldHJpY3M6e30sZW1iZWRkaW5nRGF0YVNldDp2b2lkIDB9KTpSdCh0KSkpKX1mZXRjaEFubm90YXRpb25zKHQpe3JldHVybiAkdCh0Lm1hcCgodD0+dGhpcy5odHRwLmdldChgL2V4cGVyaW1lbnQvJHt0fS8ke3RoaXMuaHR0cFBhdGhQcmVmaXh9L2Fubm90YXRpb25zYCkucGlwZShJdCgoZT0+KGZ1bmN0aW9uIG4odCxlKXtyZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHQpLm1hcCgoKFt0LG5dKT0+W0x2dCh0LGUpLG5dKSkpfSkoZSx0KSkpKSkpKS5waXBlKEl0KCh0PT57bGV0IGU9e307Zm9yKGNvbnN0IG4gb2YgdCllPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSxuKTtyZXR1cm4gZX0pKSl9ZmV0Y2hNZXRyaWNzKHQpe3JldHVybiAkdCh0Lm1hcCgodD0+dGhpcy5odHRwLmdldChgL2V4cGVyaW1lbnQvJHt0fS8ke3RoaXMuaHR0cFBhdGhQcmVmaXh9L21ldHJpY3NgKS5waXBlKEl0KChlPT4oZnVuY3Rpb24gbih0LGUpe3JldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModCkubWFwKCgoW3Qsbl0pPT5bTHZ0KHQsZSksbl0pKSl9KShlLHQpKSkpKSkpLnBpcGUoSXQoKHQ9PntsZXQgZT17fTtmb3IoY29uc3QgbiBvZiB0KWU9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLG4pO3JldHVybiBlfSkpKX1mZXRjaFZhbHVlcyh0KXtyZXR1cm4gJHQodC5tYXAoKHQ9PnRoaXMuaHR0cC5nZXQoYC9leHBlcmltZW50LyR7dH0vJHt0aGlzLmh0dHBQYXRoUHJlZml4fS92YWx1ZXNgKS5waXBlKEl0KChlPT4oZnVuY3Rpb24gbih0LGUpe3JldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModCkubWFwKCgoW3Qsbl0pPT5bTHZ0KHQsZSksbl0pKSl9KShlLHQpKSkpKSkpLnBpcGUoSXQoKHQ9PntsZXQgZT17fTtmb3IoY29uc3QgbiBvZiB0KWU9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLG4pO3JldHVybiBlfSkpKX1mZXRjaEVtYmVkZGluZ3ModCl7cmV0dXJuICR0KHQubWFwKCh0PT50aGlzLmh0dHAuZ2V0KGAvZXhwZXJpbWVudC8ke3R9LyR7dGhpcy5odHRwUGF0aFByZWZpeH0vZW1iZWRkaW5nc2ApLnBpcGUoSXQoKGU9PihmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0KS5tYXAoKChbdCxuXSk9PltMdnQodCxlKSxuXSkpKX0pKGUsdCkpKSkpKSkucGlwZShJdCgodD0+e2xldCBlPXt9O2Zvcihjb25zdCBuIG9mIHQpZT1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSksbik7cmV0dXJuIGV9KSkpfX1CdnQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEJ2dCkodnIobEUpKX0sQnZ0Lsm1cHJvdj1Nbih7dG9rZW46QnZ0LGZhY3Rvcnk6QnZ0Lsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChCdnQsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmxFfV19KSxudWxsKTtjbGFzcyBWdnR7fVZ2dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VnZ0KX0sVnZ0Lsm1bW9kPWFvKHt0eXBlOlZ2dH0pLFZ2dC7JtWluaj12bih7cHJvdmlkZXJzOltCdnRdLGltcG9ydHM6W1tjRV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChWdnQsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltjRV0scHJvdmlkZXJzOltCdnRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oVnZ0LHtpbXBvcnRzOltjRV19KTtjbGFzcyBqdnR7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuYWN0aW9ucyQ9dCx0aGlzLnN0b3JlPWUsdGhpcy5kYXRhU291cmNlPW4sdGhpcy5sb2FkRGF0YSQ9TWsoKCgpPT5yZSh0aGlzLmxvYWRQbHVnaW5EYXRhKCkpLnBpcGUoSXQoKCgpPT4oe30pKSkpKSx7ZGlzcGF0Y2g6ITF9KX1sb2FkUGx1Z2luRGF0YSgpe3JldHVybiB0aGlzLmFjdGlvbnMkLnBpcGUoRGsoa2J0KSxWZSh0aGlzLnN0b3JlLnNlbGVjdChhYnQpLHRoaXMuc3RvcmUuc2VsZWN0KFRTKSksY2UoKChbLHQsZV0pPT50IT09eUUuTE9BRElORyYmbnVsbCE9PWUpKSxGZSgoKCk9PnRoaXMuc3RvcmUuZGlzcGF0Y2goU2J0KCkpKSksWnQoKChbLCx0XSk9PnRoaXMuZGF0YVNvdXJjZS5mZXRjaERhdGEodCkucGlwZShGZSgodD0+e3RoaXMuc3RvcmUuZGlzcGF0Y2goRGJ0KHQpKX0pKSxJdCgoKCk9Pnt9KSkscGUoKCgpPT4odGhpcy5zdG9yZS5kaXNwYXRjaChFYnQoKSkscnQpKSkpKSkpfX1qdnQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGp2dCkodnIoU2spLHZyKEl3KSx2cihCdnQpKX0sanZ0Lsm1cHJvdj1Nbih7dG9rZW46anZ0LGZhY3Rvcnk6anZ0Lsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChqdnQsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlNrfSx7dHlwZTpJd30se3R5cGU6QnZ0fV19KSxudWxsKTtjbGFzcyBVdnR7fVV2dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VXZ0KX0sVXZ0Lsm1bW9kPWFvKHt0eXBlOlV2dH0pLFV2dC7JtWluaj12bih7fSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChVdnQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W29idF0sZXhwb3J0czpbb2J0XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFV2dCx7ZGVjbGFyYXRpb25zOltvYnRdLGV4cG9ydHM6W29idF19KTtjbGFzcyBHdnR7fUd2dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8R3Z0KX0sR3Z0Lsm1bW9kPWFvKHt0eXBlOkd2dH0pLEd2dC7JtWluaj12bih7aW1wb3J0czpbW1dNLEVXLEJZLFkwXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEd2dCxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbc3l0LGx5dF0saW1wb3J0czpbV00sRVcsQlksWTBdLGV4cG9ydHM6W2x5dF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhHdnQse2RlY2xhcmF0aW9uczpbc3l0LGx5dF0saW1wb3J0czpbV00sRVcsQlksWTBdLGV4cG9ydHM6W2x5dF19KTtjbGFzcyBXdnR7fVd2dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8V3Z0KX0sV3Z0Lsm1bW9kPWFvKHt0eXBlOld2dH0pLFd2dC7JtWluaj12bih7aW1wb3J0czpbW1dNLGNHLGRHLEVXLEV5dCxWUV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChXdnQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W3p5dCxJeXRdLGltcG9ydHM6W1dNLGNHLGRHLEVXLEV5dCxWUV0sZXhwb3J0czpbSXl0XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFd2dCx7ZGVjbGFyYXRpb25zOlt6eXQsSXl0XSxpbXBvcnRzOltXTSxjRyxkRyxFVyxFeXQsVlFdLGV4cG9ydHM6W0l5dF19KTtjbGFzcyBZdnR7fVl2dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WXZ0KX0sWXZ0Lsm1bW9kPWFvKHt0eXBlOll2dH0pLFl2dC7JtWluaj12bih7aW1wb3J0czpbW1dNLEV5dF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChZdnQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W0h5dF0saW1wb3J0czpbV00sRXl0XSxleHBvcnRzOltIeXRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oWXZ0LHtkZWNsYXJhdGlvbnM6W0h5dF0saW1wb3J0czpbV00sRXl0XSxleHBvcnRzOltIeXRdfSk7Y2xhc3MgcXZ0e31xdnQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHF2dCl9LHF2dC7JtW1vZD1hbyh7dHlwZTpxdnR9KSxxdnQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxFeXQsV3Z0LFl2dF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChxdnQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W1Z5dCxqeXRdLGltcG9ydHM6W1dNLEV5dCxXdnQsWXZ0XSxleHBvcnRzOltqeXRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8ocXZ0LHtkZWNsYXJhdGlvbnM6W1Z5dCxqeXRdLGltcG9ydHM6W1dNLEV5dCxXdnQsWXZ0XSxleHBvcnRzOltqeXRdfSk7Y2xhc3MgWnZ0e31adnQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFp2dCl9LFp2dC7JtW1vZD1hbyh7dHlwZTpadnR9KSxadnQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxFVyxKSF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChadnQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W3B5dCxteXRdLGltcG9ydHM6W1dNLEVXLEpIXSxleHBvcnRzOltteXRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oWnZ0LHtkZWNsYXJhdGlvbnM6W3B5dCxteXRdLGltcG9ydHM6W1dNLEVXLEpIXSxleHBvcnRzOltteXRdfSk7Y2xhc3MgWHZ0e31YdnQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFh2dCl9LFh2dC7JtW1vZD1hbyh7dHlwZTpYdnR9KSxYdnQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxHdnQscXZ0LFp2dF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChYdnQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W1V5dF0saW1wb3J0czpbV00sR3Z0LHF2dCxadnRdLGV4cG9ydHM6W1V5dF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhYdnQse2RlY2xhcmF0aW9uczpbVXl0XSxpbXBvcnRzOltXTSxHdnQscXZ0LFp2dF0sZXhwb3J0czpbVXl0XX0pO2NsYXNzIEt2dHt9S3Z0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxLdnQpfSxLdnQuybVtb2Q9YW8oe3R5cGU6S3Z0fSksS3Z0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV00sY0csSkgsRVddXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoS3Z0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltZeXQscXl0XSxpbXBvcnRzOltXTSxjRyxKSCxFV10sZXhwb3J0czpbcXl0XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKEt2dCx7ZGVjbGFyYXRpb25zOltZeXQscXl0XSxpbXBvcnRzOltXTSxjRyxKSCxFV10sZXhwb3J0czpbcXl0XX0pO2NsYXNzIEp2dHt9SnZ0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxKdnQpfSxKdnQuybVtb2Q9YW8oe3R5cGU6SnZ0fSksSnZ0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV00sY0csRVcsSkgsS3Z0XV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEp2dCxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbS3l0LEp5dF0saW1wb3J0czpbV00sY0csRVcsSkgsS3Z0XSxleHBvcnRzOltKeXRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oSnZ0LHtkZWNsYXJhdGlvbnM6W0t5dCxKeXRdLGltcG9ydHM6W1dNLGNHLEVXLEpILEt2dF0sZXhwb3J0czpbSnl0XX0pO2NsYXNzIFF2dHt9UXZ0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxRdnQpfSxRdnQuybVtb2Q9YW8oe3R5cGU6UXZ0fSksUXZ0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV00sY0csRVcsQlldXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUXZ0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltmX3QsZ190XSxpbXBvcnRzOltXTSxjRyxFVyxCWV0sZXhwb3J0czpbZ190XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFF2dCx7ZGVjbGFyYXRpb25zOltmX3QsZ190XSxpbXBvcnRzOltXTSxjRyxFVyxCWV0sZXhwb3J0czpbZ190XX0pO2NsYXNzICR2dHt9JHZ0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHwkdnQpfSwkdnQuybVtb2Q9YW8oe3R5cGU6JHZ0fSksJHZ0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV00sY0csRVcsSkgsbV90LFF2dF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCgkdnQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W3lfdCxfX3RdLGltcG9ydHM6W1dNLGNHLEVXLEpILG1fdCxRdnRdLGV4cG9ydHM6W19fdF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybygkdnQse2RlY2xhcmF0aW9uczpbeV90LF9fdF0saW1wb3J0czpbV00sY0csRVcsSkgsbV90LFF2dF0sZXhwb3J0czpbX190XX0pO2NsYXNzIHR4dHt9dHh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx0eHQpfSx0eHQuybVtb2Q9YW8oe3R5cGU6dHh0fSksdHh0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV00sY0csU1ksRVddXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodHh0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltQX3Qsd190XSxpbXBvcnRzOltXTSxjRyxTWSxFV10sZXhwb3J0czpbd190XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKHR4dCx7ZGVjbGFyYXRpb25zOltQX3Qsd190XSxpbXBvcnRzOltXTSxjRyxTWSxFV10sZXhwb3J0czpbd190XX0pO2NsYXNzIGV4dHt9ZXh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxleHQpfSxleHQuybVtb2Q9YW8oe3R5cGU6ZXh0fSksZXh0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV01dXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZXh0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltNX3RdLGltcG9ydHM6W1dNXSxleHBvcnRzOltNX3RdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oZXh0LHtkZWNsYXJhdGlvbnM6W01fdF0saW1wb3J0czpbV01dLGV4cG9ydHM6W01fdF19KTtjbGFzcyBueHR7fW54dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bnh0KX0sbnh0Lsm1bW9kPWFvKHt0eXBlOm54dH0pLG54dC7JtWluaj12bih7aW1wb3J0czpbW2V4dF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChueHQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W3ZfdF0saW1wb3J0czpbZXh0XSxleHBvcnRzOlt2X3RdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8obnh0LHtkZWNsYXJhdGlvbnM6W3ZfdF0saW1wb3J0czpbZXh0XSxleHBvcnRzOlt2X3RdfSk7Y2xhc3Mgb3h0e31veHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fG94dCl9LG94dC7JtW1vZD1hbyh7dHlwZTpveHR9KSxveHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxjRyxTWSxFVyxKSF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChveHQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W1RfdCxBX3RdLGltcG9ydHM6W1dNLGNHLFNZLEVXLEpIXSxleHBvcnRzOltUX3RdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8ob3h0LHtkZWNsYXJhdGlvbnM6W1RfdCxBX3RdLGltcG9ydHM6W1dNLGNHLFNZLEVXLEpIXSxleHBvcnRzOltUX3RdfSk7Y2xhc3MgaXh0e31peHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGl4dCl9LGl4dC7JtW1vZD1hbyh7dHlwZTppeHR9KSxpeHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSwkdnQsdHh0LG54dCxfRixveHRdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoaXh0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltJX3QsSF90XSxpbXBvcnRzOltXTSwkdnQsdHh0LG54dCxfRixveHRdLGV4cG9ydHM6W0hfdF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhpeHQse2RlY2xhcmF0aW9uczpbSV90LEhfdF0saW1wb3J0czpbV00sJHZ0LHR4dCxueHQsX0Ysb3h0XSxleHBvcnRzOltIX3RdfSk7Y2xhc3MgYXh0e31heHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGF4dCl9LGF4dC7JtW1vZD1hbyh7dHlwZTpheHR9KSxheHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChheHQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W0xfdCxCX3RdLGltcG9ydHM6W1dNXSxleHBvcnRzOltCX3RdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oYXh0LHtkZWNsYXJhdGlvbnM6W0xfdCxCX3RdLGltcG9ydHM6W1dNXSxleHBvcnRzOltCX3RdfSk7Y2xhc3Mgcnh0e31yeHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHJ4dCl9LHJ4dC7JtW1vZD1hbyh7dHlwZTpyeHR9KSxyeHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxFVyxKSCxheHRdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgocnh0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltHX3QsV190XSxpbXBvcnRzOltXTSxFVyxKSCxheHRdLGV4cG9ydHM6W1dfdF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhyeHQse2RlY2xhcmF0aW9uczpbR190LFdfdF0saW1wb3J0czpbV00sRVcsSkgsYXh0XSxleHBvcnRzOltXX3RdfSk7Y2xhc3Mgc3h0e31zeHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHN4dCl9LHN4dC7JtW1vZD1hbyh7dHlwZTpzeHR9KSxzeHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxjRyxTWSxFVyxraHQsWHZ0LEpILEp2dCxpeHQscnh0XV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHN4dCxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbSl90LFFfdF0saW1wb3J0czpbV00sY0csU1ksRVcsa2h0LFh2dCxKSCxKdnQsaXh0LHJ4dF0sZXhwb3J0czpbUV90XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKHN4dCx7ZGVjbGFyYXRpb25zOltKX3QsUV90XSxpbXBvcnRzOltXTSxjRyxTWSxFVyxraHQsWHZ0LEpILEp2dCxpeHQscnh0XSxleHBvcnRzOltRX3RdfSk7Y2xhc3MgbHh0e31seHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGx4dCl9LGx4dC7JtW1vZD1hbyh7dHlwZTpseHR9KSxseHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxjRyxTWSxFVyxraHQsWHZ0LEpILGl4dCxyeHRdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobHh0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltpQ3QsYUN0XSxpbXBvcnRzOltXTSxjRyxTWSxFVyxraHQsWHZ0LEpILGl4dCxyeHRdLGV4cG9ydHM6W2FDdF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhseHQse2RlY2xhcmF0aW9uczpbaUN0LGFDdF0saW1wb3J0czpbV00sY0csU1ksRVcsa2h0LFh2dCxKSCxpeHQscnh0XSxleHBvcnRzOlthQ3RdfSk7Y2xhc3MgY3h0e31jeHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGN4dCl9LGN4dC7JtW1vZD1hbyh7dHlwZTpjeHR9KSxjeHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxVdnQsc3h0LGx4dCxWdnQsZGsuZm9yRmVhdHVyZShRaHQsaXl0KSxXay5mb3JGZWF0dXJlKFtqdnRdKSx3cS5mb3JQbHVnaW4oIm5wbWkiLHBDdCldXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoY3h0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltkQ3QscEN0XSxpbXBvcnRzOltXTSxVdnQsc3h0LGx4dCxWdnQsZGsuZm9yRmVhdHVyZShRaHQsaXl0KSxXay5mb3JGZWF0dXJlKFtqdnRdKSx3cS5mb3JQbHVnaW4oIm5wbWkiLHBDdCldLGV4cG9ydHM6W3BDdF0sZW50cnlDb21wb25lbnRzOltwQ3RdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oY3h0LHtkZWNsYXJhdGlvbnM6W2RDdCxwQ3RdLGltcG9ydHM6W1dNLFV2dCxzeHQsbHh0LFZ2dCxjayxHayx3cV0sZXhwb3J0czpbcEN0XX0pO2NsYXNzIGR4dHt9ZHh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxkeHQpfSxkeHQuybVjbXA9dG8oe3R5cGU6ZHh0LHNlbGVjdG9yczpbWyJ0ZXh0LWRhc2hib2FyZCJdXSxkZWNsczoxLHZhcnM6MCx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiZrdSgwLCIgVGhpcyBpcyB0aGUgdGV4dCBkYXNoYm9hcmQgIil9LGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZHh0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InRleHQtZGFzaGJvYXJkIix0ZW1wbGF0ZToiIFRoaXMgaXMgdGhlIHRleHQgZGFzaGJvYXJkICIsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCxudWxsKTtjbGFzcyBweHR7fXB4dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8cHh0KX0scHh0Lsm1bW9kPWFvKHt0eXBlOnB4dH0pLHB4dC7JtWluaj12bih7fSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChweHQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W2R4dF0sZXhwb3J0czpbZHh0XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKHB4dCx7ZGVjbGFyYXRpb25zOltkeHRdLGV4cG9ydHM6W2R4dF19KTtjbGFzcyBteHR7fW14dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bXh0KX0sbXh0Lsm1cHJvdj1Nbih7dG9rZW46bXh0LGZhY3Rvcnk6bXh0Lsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChteHQsW3t0eXBlOmltfV0sbnVsbCxudWxsKTtjbGFzcyB1eHR7Y29uc3RydWN0b3IodCl7dGhpcy5odHRwPXQsdGhpcy5odHRwUGF0aFByZWZpeD0iZGF0YS9wbHVnaW4vdGV4dF92MiJ9ZmV0Y2hSdW5Ub1RhZygpe3JldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaHR0cFBhdGhQcmVmaXgrIi90YWdzIikucGlwZShJdCgodD0+e2NvbnN0IGU9bmV3IE1hcDtyZXR1cm4gT2JqZWN0LmVudHJpZXModCkuZm9yRWFjaCgoKFt0LG5dKT0+e2Uuc2V0KHQsbil9KSksZX0pKSl9ZmV0Y2hUZXh0RGF0YSh0LGUpe2NvbnN0IG49bmV3IFVSTFNlYXJjaFBhcmFtcyh7cnVuOnQsdGFnOmV9KTtyZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmh0dHBQYXRoUHJlZml4K2AvdGV4dD8ke24udG9TdHJpbmcoKX1gKS5waXBlKEl0KCh0PT50Lm1hcCgodD0+KHtvcmlnaW5hbFNoYXBlOnQub3JpZ2luYWxfc2hhcGUsc3RlcDp0LnN0ZXAsc3RyaW5nQXJyYXk6dC5zdHJpbmdfYXJyYXksd2FsbFRpbWVJbk1zOjFlMyp0LndhbGxfdGltZSx0cnVuY2F0ZWQ6dC50cnVuY2F0ZWR9KSkpKSkpfX11eHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHV4dCkodnIobEUpKX0sdXh0Lsm1cHJvdj1Nbih7dG9rZW46dXh0LGZhY3Rvcnk6dXh0Lsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh1eHQsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmxFfV19KSxudWxsKTtjbGFzcyBmeHR7fWZ4dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8Znh0KX0sZnh0Lsm1bW9kPWFvKHt0eXBlOmZ4dH0pLGZ4dC7JtWluaj12bih7cHJvdmlkZXJzOlt1eHQse3Byb3ZpZGU6bXh0LHVzZUV4aXN0aW5nOnV4dH1dLGltcG9ydHM6W1tjRV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChmeHQsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltjRV0scHJvdmlkZXJzOlt1eHQse3Byb3ZpZGU6bXh0LHVzZUV4aXN0aW5nOnV4dH1dfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oZnh0LHtpbXBvcnRzOltjRV19KTtjb25zdCBneHQ9SlAoIltUZXh0XSBUZXh0IFBsdWdpbiBMb2FkZWQiKSxoeHQ9SlAoIltUZXh0XSBSdW5zIFRvIFRhZyBMb2FkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxieHQ9SlAoIltUZXh0XSBUYWcgR3JvdXAgVmlzaWJpbGl0eSBDaGFuZ2VkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSkseXh0PUpQKCJbVGV4dF0gVGV4dCBEYXRhIExvYWRlZCBMb2FkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxfeHQ9InRleHQiLEN4dD1LdyhfeHQpO1p3KEN4dCwodD0+dC5ydW5Ub1RhZ3MpKTtjb25zdCBNeHQ9WncoQ3h0LCh0PT57Y29uc3QgZT1uZXcgU2V0LG49bmV3IFNldDtmb3IoY29uc3QgbyBvZiB0LnZpc2libGVSdW5UYWdzLnZhbHVlcygpKWZvcihjb25zdCB0IG9mIG8pe2NvbnN0IG89SlNPTi5zdHJpbmdpZnkodCk7ZS5oYXMobyl8fChlLmFkZChvKSxuLmFkZCh0KSl9cmV0dXJuWy4uLm5dfSkpLHZ4dD1adyhDeHQsKCh0LGUpPT57Y29uc3Qgbj10LmRhdGEuZ2V0KGUucnVuKTtyZXR1cm4gbiYmbi5nZXQoZS50YWcpfHxudWxsfSkpO2NsYXNzIHh4dHtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5hY3Rpb25zJD10LHRoaXMuc3RvcmU9ZSx0aGlzLmRhdGFTb3VyY2U9bix0aGlzLmxvYWRSdW5Ub1RhZ3MkPU1rKCgoKT0+dGhpcy5hY3Rpb25zJC5waXBlKERrKGd4dCksemUoKCgpPT50aGlzLmRhdGFTb3VyY2UuZmV0Y2hSdW5Ub1RhZygpLnBpcGUoRmUoKHQ9Pnt0aGlzLnN0b3JlLmRpc3BhdGNoKGh4dCh7cnVuVG9UYWdzOnR9KSl9KSksSXQoKCgpPT57fSkpKSkpKSkse2Rpc3BhdGNoOiExfSksdGhpcy5sb2FkRGF0YSQ9TWsoKCgpPT5yZSh0aGlzLmFjdGlvbnMkLnBpcGUoRGsoYnh0KSx6ZSgoKHt2aXNpYmxlVGV4dENhcmRzOnR9KT0+JHQodC5tYXAoKCh7cnVuOnQsdGFnOmV9KT0+dGhpcy5zdG9yZS5zZWxlY3Qodnh0LHtydW46dCx0YWc6ZX0pLnBpcGUoKGZ1bmN0aW9uIG4odCxlKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPj0yO3JldHVybiBmdW5jdGlvbihvKXtyZXR1cm4gby5waXBlKHQ/Y2UoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQoZSxuLG8pfSkpOncsU2UoMSksbj9oZShlKTp4ZSgoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHp0fSkpKX19KSgpLEl0KChuPT4oe3J1bjp0LHRhZzplLHRleHREYXRhOm59KSkpKSkpKS5waXBlKEl0KCh0PT50LmZpbHRlcigoKHt0ZXh0RGF0YTp0fSk9Pm51bGw9PT10KSkubWFwKCgoe3J1bjp0LHRhZzplfSk9Pih7cnVuOnQsdGFnOmV9KSkpKSkpKSkpLHRoaXMuYWN0aW9ucyQucGlwZShEayh2RSx4RSksVmUodGhpcy5zdG9yZS5zZWxlY3QoTXh0KSksSXQoKChbLHRdKT0+dCkpKSkucGlwZShadCgodD0+JHQodC5tYXAoKHQ9PnRoaXMuZmV0Y2hUZXh0RGF0YSh0KSkpKSkpKSkse2Rpc3BhdGNoOiExfSl9ZmV0Y2hUZXh0RGF0YSh0KXtjb25zdHtydW46ZSx0YWc6bn09dDtyZXR1cm4gdGhpcy5kYXRhU291cmNlLmZldGNoVGV4dERhdGEoZSxuKS5waXBlKEZlKCh0PT57dGhpcy5zdG9yZS5kaXNwYXRjaCh5eHQoe3J1bjplLHRhZzpuLHN0ZXBEYXRhOnR9KSl9KSksSXQoKCgpPT57fSkpKX19eHh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx4eHQpKHZyKFNrKSx2cihJdyksdnIobXh0KSl9LHh4dC7JtXByb3Y9TW4oe3Rva2VuOnh4dCxmYWN0b3J5Onh4dC7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoeHh0LFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpTa30se3R5cGU6SXd9LHt0eXBlOm14dH1dfSksbnVsbCk7Y29uc3QgT3h0PXlrKHtydW5Ub1RhZ3M6bmV3IE1hcChbWyJydW4xIixbImEvYiIsImEvYyJdXSxbInJ1bjIiLFsiYS9iIiwiYS9kIl1dLFsicnVuMyIsWyJjIiwiYS9iIl1dXSksZGF0YTpuZXcgTWFwKFtbInJ1bjEiLG5ldyBNYXAoW1siYS9iIixbe29yaWdpbmFsU2hhcGU6WzNdLHN0ZXA6MCxzdHJpbmdBcnJheTpbWyJmb28iLCJiYXIiLCJiYXoiXV0sd2FsbFRpbWVJbk1zOjE1Nzc4NjU2ZTUsdHJ1bmNhdGVkOiExfSx7b3JpZ2luYWxTaGFwZTpbM10sc3RlcDoxLHN0cmluZ0FycmF5OltbImZvbyIsImJheiJdXSx3YWxsVGltZUluTXM6MTU3Nzg2NTYwMWUzLHRydW5jYXRlZDohMX1dXSxbImEvYyIsW3tvcmlnaW5hbFNoYXBlOlszXSxzdGVwOjAsc3RyaW5nQXJyYXk6W1siV2UgY29uZHVjdGVkIGFuIGV4cGVyaW1lbnQgYW5kIGZvdW5kIHRoZSBmb2xsb3dpbmcgZGF0YTpcblxuUG91bmRzIG9mIGNob2NvbGF0ZSB8IEhhcHBpbmVzc1xuLS0tfC0tLVxuMCB8IDFcbjEgfCA0XG4yIHwgOVxuMyB8IDE2XG40IHwgMjVcbjUgfCAzNlxuNiB8IDQ5XG43IHwgNjRcbjggfCA4MVxuOSB8IDEwMFxuMTAgfCAxMjEiXV0sd2FsbFRpbWVJbk1zOjE1Nzc4NjU2ZTUsdHJ1bmNhdGVkOiExfSx7b3JpZ2luYWxTaGFwZTpbM10sc3RlcDoxLHN0cmluZ0FycmF5OltbIsOXIiwiKiowKioiLCIqKjEqKiIsIioqMioqIiwiKiozKioiLCIqKjQqKiIsIioqNSoqIl0sWyIqKjAqKiIsIjAiLCIwIiwiMCIsIjAiLCIwIiwiMCJdLFsiKioxKioiLCIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiXSxbIioqMioqIiwiMCIsIjIiLCI0IiwiNiIsIjgiLCIxMCJdLFsiKiozKioiLCIwIiwiMyIsIjYiLCI5IiwiMTIiLCIxNSJdLFsiKio0KioiLCIwIiwiNCIsIjgiLCIxMiIsIjE2IiwiMjAiXSxbIioqNSoqIiwiMCIsIjUiLCIxMCIsIjE1IiwiMjAiLCIyNSJdXSx3YWxsVGltZUluTXM6MTU3Nzg2NTYwMWUzLHRydW5jYXRlZDohMX1dXV0pXV0pLHZpc2libGVSdW5UYWdzOm5ldyBNYXB9KTtmdW5jdGlvbiBQeHQodCxlKXtyZXR1cm4gT3h0KHQsZSl9Y2xhc3Mgd3h0e313eHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHd4dCl9LHd4dC7JtW1vZD1hbyh7dHlwZTp3eHR9KSx3eHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxweHQsd3EuZm9yUGx1Z2luKCJ0ZXh0X3YyIixkeHQpLGZ4dCxkay5mb3JGZWF0dXJlKF94dCxQeHQpLFdrLmZvckZlYXR1cmUoW3h4dF0pXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHd4dCxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W1dNLHB4dCx3cS5mb3JQbHVnaW4oInRleHRfdjIiLGR4dCksZnh0LGRrLmZvckZlYXR1cmUoX3h0LFB4dCksV2suZm9yRmVhdHVyZShbeHh0XSldLGVudHJ5Q29tcG9uZW50czpbZHh0XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKHd4dCx7aW1wb3J0czpbV00scHh0LHdxLGZ4dCxjayxHa119KTtjbGFzcyBreHR7fXZhciBTeHQ7a3h0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxreHQpfSxreHQuybVtb2Q9YW8oe3R5cGU6a3h0fSksa3h0Lsm1aW5qPXZuKHtpbXBvcnRzOltbS0osSmh0LGN4dCx3eHRdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoa3h0LFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbS0osSmh0LGN4dCx3eHRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oa3h0LHtpbXBvcnRzOltLSixKaHQsY3h0LHd4dF19KSwoZnVuY3Rpb24odCl7dC5DVVNUT01fRUxFTUVOVD0iQ1VTVE9NX0VMRU1FTlQiLHQuSUZSQU1FPSJJRlJBTUUiLHQuTkdfQ09NUE9ORU5UPSJOR19DT01QT05FTlQiLHQuTk9ORT0iTk9ORSJ9KShTeHR8fChTeHQ9e30pKTtjb25zdCBEeHQ9WyJwbHVnaW5Db250YWluZXIiXSxFeHQ9WyJuZ1BsdWdpbkNvbnRhaW5lciJdO2Z1bmN0aW9uIFJ4dCh0LGUpezEmdCYmSW0oMCl9ZnVuY3Rpb24gQXh0KHQsZSl7aWYoMSZ0JiYoTm0oMCksUXAoMSxSeHQsMSwwLCJuZy1jb250YWluZXIiLDkpLHptKCkpLDImdCl7Y29uc3QgdD1ZbSgyKSxlPSRwKDYpO3JjKDEpLERtKCJuZ1RlbXBsYXRlT3V0bGV0Iix0LmVudmlyb25tZW50RmFpbHVyZU5vdEZvdW5kVGVtcGxhdGU/dC5lbnZpcm9ubWVudEZhaWx1cmVOb3RGb3VuZFRlbXBsYXRlOmUpfX1mdW5jdGlvbiBUeHQodCxlKXsxJnQmJkltKDApfWZ1bmN0aW9uIE54dCh0LGUpe2lmKDEmdCYmKE5tKDApLFFwKDEsVHh0LDEsMCwibmctY29udGFpbmVyIiw5KSx6bSgpKSwyJnQpe2NvbnN0IHQ9WW0oMiksZT0kcCg2KTtyYygxKSxEbSgibmdUZW1wbGF0ZU91dGxldCIsdC5lbnZpcm9ubWVudEZhaWx1cmVVbmtub3duVGVtcGxhdGU/dC5lbnZpcm9ubWVudEZhaWx1cmVVbmtub3duVGVtcGxhdGU6ZSl9fWZ1bmN0aW9uIHp4dCh0LGUpe2lmKDEmdCYmKE5tKDApLFJtKDEsImgzIiwxMCksa3UoMiwiIFRoZXJl4oCZcyBubyBkYXNoYm9hcmQgYnkgdGhlIG5hbWUgb2Yg4oCcIiksUm0oMywiY29kZSIpLGt1KDQpLEFtKCksa3UoNSwi4oCdLiAiKSxBbSgpLFJtKDYsInAiKSxrdSg3LCJZb3UgY2FuIHNlbGVjdCBhIGRhc2hib2FyZCBmcm9tIHRoZSBsaXN0IGFib3ZlLiIpLEFtKCksUm0oOCwicCIpLEltKDksMTEpLEFtKCksem0oKSksMiZ0KXtjb25zdCB0PVltKDIpLGU9JHAoOCk7cmMoNCksU3UodC5hY3RpdmVQbHVnaW5JZCkscmMoNSksRG0oIm5nVGVtcGxhdGVPdXRsZXQiLGUpfX1mdW5jdGlvbiBJeHQodCxlKXtpZigxJnQmJihObSgwKSxSbSgxLCJoMyIsMTIpLGt1KDIsIiBObyBkYXNoYm9hcmRzIGFyZSBhY3RpdmUgZm9yIHRoZSBjdXJyZW50IGRhdGEgc2V0LiAiKSxBbSgpLFJtKDMsInAiKSxrdSg0LCJQcm9iYWJsZSBjYXVzZXM6IiksQW0oKSxSbSg1LCJ1bCIpLFJtKDYsImxpIiksa3UoNywiWW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuIiksQW0oKSxSbSg4LCJsaSIpLGt1KDksIlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLiIpLEFtKCksQW0oKSxrdSgxMCwiIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZSAiKSxSbSgxMSwiYSIsMTMpLGt1KDEyLCJSRUFETUUiKSxBbSgpLGt1KDEzLCIgYW5kIHBlcmhhcHMgdGhlICIpLFJtKDE0LCJhIiwxNCksa3UoMTUsIlRlbnNvckJvYXJkIHR1dG9yaWFsIiksQW0oKSxrdSgxNiwiLiAiKSxSbSgxNywicCIpLGt1KDE4LCIgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUgIiksUm0oMTksImEiLDE1KSxrdSgyMCwidGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtcyIpLEFtKCksa3UoMjEsIiBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4gIiksQW0oKSxSbSgyMiwicCIpLEltKDIzLDExKSxBbSgpLHptKCkpLDImdCl7WW0oMik7Y29uc3QgdD0kcCg4KTtyYygyMyksRG0oIm5nVGVtcGxhdGVPdXRsZXQiLHQpfX1mdW5jdGlvbiBIeHQodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDYpLFJtKDEsImRpdiIsNyksUXAoMixBeHQsMiwxLCJuZy1jb250YWluZXIiLDgpLFFwKDMsTnh0LDIsMSwibmctY29udGFpbmVyIiw4KSxRcCg0LHp4dCwxMCwyLCJuZy1jb250YWluZXIiLDgpLFFwKDUsSXh0LDI0LDEsIm5nLWNvbnRhaW5lciIsOCksQW0oKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtEbSgibmdTd2l0Y2giLHQucGx1Z2luTG9hZFN0YXRlKSxyYygyKSxEbSgibmdTd2l0Y2hDYXNlIix0LlBsdWdpbkxvYWRTdGF0ZS5FTlZJUk9OTUVOVF9GQUlMVVJFX05PVF9GT1VORCkscmMoMSksRG0oIm5nU3dpdGNoQ2FzZSIsdC5QbHVnaW5Mb2FkU3RhdGUuRU5WSVJPTk1FTlRfRkFJTFVSRV9VTktOT1dOKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIix0LlBsdWdpbkxvYWRTdGF0ZS5VTktOT1dOX1BMVUdJTl9JRCkscmMoMSksRG0oIm5nU3dpdGNoQ2FzZSIsdC5QbHVnaW5Mb2FkU3RhdGUuTk9fRU5BQkxFRF9QTFVHSU5TKX19ZnVuY3Rpb24gRnh0KHQsZSl7aWYoMSZ0JiYoUm0oMCwiaDMiLDE2KSxrdSgxLCJEYXRhIGNvdWxkIG5vdCBiZSBsb2FkZWQuIiksQW0oKSxSbSgyLCJwIiksa3UoMywiVGhlIFRlbnNvckJvYXJkIHNlcnZlciBtYXkgYmUgZG93biBvciBpbmFjY2Vzc2libGUuIiksQW0oKSxSbSg0LCJwIiksSW0oNSwxMSksQW0oKSksMiZ0KXtZbSgpO2NvbnN0IHQ9JHAoOCk7cmMoNSksRG0oIm5nVGVtcGxhdGVPdXRsZXQiLHQpfX1mdW5jdGlvbiBMeHQodCxlKXtpZigxJnQmJihSbSgwLCJwIiwxOSksUm0oMSwiaSIpLGt1KDIsIkxvZyBkaXJlY3Rvcnk6ICIpLFJtKDMsInNwYW4iKSxrdSg0KSxBbSgpLEFtKCksQW0oKSksMiZ0KXtjb25zdCB0PVltKDIpO3JjKDQpLFN1KHQuZGF0YUxvY2F0aW9uKX19ZnVuY3Rpb24gQnh0KHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIsMTcpLGt1KDEpLEFoKDIsImRhdGUiKSxBbSgpLFFwKDMsTHh0LDUsMSwicCIsMTgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtyYygxKSxEdSgiTGFzdCByZWxvYWQ6ICIsTmgoMiwyLHQubGFzdFVwZGF0ZWQsIm1lZGl1bSIpLCIiKSxyYygyKSxEbSgibmdJZiIsdC5kYXRhTG9jYXRpb24pfX1jb25zdCBWeHQ9ZnVuY3Rpb24odCl7cmV0dXJue3BsdWdpbnM6ITAsImlzLWZpcnN0LXBhcnR5LXBsdWdpbiI6dH19O3ZhciBqeHQ7IShmdW5jdGlvbih0KXt0W3QuRU5WSVJPTk1FTlRfRkFJTFVSRV9OT1RfRk9VTkQ9MF09IkVOVklST05NRU5UX0ZBSUxVUkVfTk9UX0ZPVU5EIix0W3QuRU5WSVJPTk1FTlRfRkFJTFVSRV9VTktOT1dOPTFdPSJFTlZJUk9OTUVOVF9GQUlMVVJFX1VOS05PV04iLHRbdC5OT19FTkFCTEVEX1BMVUdJTlM9Ml09Ik5PX0VOQUJMRURfUExVR0lOUyIsdFt0LlVOS05PV05fUExVR0lOX0lEPTNdPSJVTktOT1dOX1BMVUdJTl9JRCIsdFt0LkxPQURFRD00XT0iTE9BREVEIix0W3QuTE9BRElORz01XT0iTE9BRElORyJ9KShqeHR8fChqeHQ9e30pKTtjbGFzcyBVeHR7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyPXQsdGhpcy5wbHVnaW5SZWdpc3RyeT1lLHRoaXMucGx1Z2luQXBpSG9zdD1uLHRoaXMuUGx1Z2luTG9hZFN0YXRlPWp4dCx0aGlzLkxvYWRpbmdNZWNoYW5pc21UeXBlPVN4dCx0aGlzLnBsdWdpbkluc3RhbmNlcz1uZXcgTWFwfW5nT25DaGFuZ2VzKHQpe3ZhciBlO2lmKCF0aGlzLmlzRmVhdHVyZUZsYWdzTG9hZGVkfHwhdGhpcy5hY3RpdmVLbm93blBsdWdpbnx8dGhpcy5zZXR0aW5nc0xvYWRTdGF0ZT09PXlFLk5PVF9MT0FERUR8fHRoaXMuc2V0dGluZ3NMb2FkU3RhdGU9PT15RS5MT0FESU5HKXJldHVybjtjb25zdCBuPUJvb2xlYW4odGhpcy5hY3RpdmVLbm93blBsdWdpbiYmIXRoaXMucGx1Z2luSW5zdGFuY2VzLmhhcyh0aGlzLmFjdGl2ZUtub3duUGx1Z2luLmlkKSk7aWYodC5hY3RpdmVLbm93blBsdWdpbnx8dC5pc0ZlYXR1cmVGbGFnc0xvYWRlZHx8dC5zZXR0aW5nc0xvYWRTdGF0ZSl7Y29uc3Qgbz1udWxsPT09KGU9dC5hY3RpdmVLbm93blBsdWdpbil8fHZvaWQgMD09PWU/dm9pZCAwOmUucHJldmlvdXNWYWx1ZTtpZihvJiZvLmlkIT09dGhpcy5hY3RpdmVLbm93blBsdWdpbi5pZCYmdGhpcy5oaWRlUGx1Z2luKG8pLG4pe2NvbnN0IHQ9dGhpcy5jcmVhdGVQbHVnaW4odGhpcy5hY3RpdmVLbm93blBsdWdpbik7dCYmdGhpcy5wbHVnaW5JbnN0YW5jZXMuc2V0KHRoaXMuYWN0aXZlS25vd25QbHVnaW4uaWQsdCl9ZWxzZSB0aGlzLnNob3dQbHVnaW4odGhpcy5hY3RpdmVLbm93blBsdWdpbil9KG58fHQubGFzdFVwZGF0ZWQpJiZ0aGlzLnJlbG9hZCh0aGlzLmFjdGl2ZUtub3duUGx1Z2luLG4pfWhpZGVQbHVnaW4odCl7aWYoIXRoaXMucGx1Z2luSW5zdGFuY2VzLmhhcyh0LmlkKSlyZXR1cm47Y29uc3QgZT10aGlzLnBsdWdpbkluc3RhbmNlcy5nZXQodC5pZCk7T2JqZWN0LmFzc2lnbihlLnN0eWxlLHttYXhIZWlnaHQ6MCxvdmVyZmxvdzoiaGlkZGVuIix2aXNpYmlsaXR5OiJoaWRkZW4iLHBvc2l0aW9uOiJhYnNvbHV0ZSJ9KX1zaG93UGx1Z2luKHQpe2lmKCF0aGlzLnBsdWdpbkluc3RhbmNlcy5oYXModC5pZCkpcmV0dXJuO2NvbnN0IGU9dGhpcy5wbHVnaW5JbnN0YW5jZXMuZ2V0KHQuaWQpO09iamVjdC5hc3NpZ24oZS5zdHlsZSx7bWF4SGVpZ2h0Om51bGwsb3ZlcmZsb3c6bnVsbCx2aXNpYmlsaXR5Om51bGwscG9zaXRpb246bnVsbH0pfWNyZWF0ZVBsdWdpbih0KXtsZXQgZT1udWxsO3N3aXRjaCh0LmxvYWRpbmdfbWVjaGFuaXNtLnR5cGUpe2Nhc2UgU3h0LkNVU1RPTV9FTEVNRU5UOmU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0LmxvYWRpbmdfbWVjaGFuaXNtLmVsZW1lbnRfbmFtZSksZS5yZWxvYWRPblJlYWR5PSExLGUuZmVhdHVyZUZsYWdzPXRoaXMuZmVhdHVyZUZsYWdzLHRoaXMucGx1Z2luc0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKGUpO2JyZWFrO2Nhc2UgU3h0LklGUkFNRTppZighdGhpcy5wbHVnaW5BcGlIb3N0KXRocm93IEVycm9yKGBJRlJBTUUtYmFzZWQgcGx1Z2lucyBub3Qgc3VwcG9ydGVkOiAke3QuaWR9YCk7ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKSxlLnNldEF0dHJpYnV0ZSgic3JjIixgZGF0YS9wbHVnaW5fZW50cnkuaHRtbD9uYW1lPSR7dC5pZH1gKSx0aGlzLnBsdWdpbkFwaUhvc3QucmVnaXN0ZXJQbHVnaW5JZnJhbWUoZSx0LmlkKSx0aGlzLnBsdWdpbnNDb250YWluZXIubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChlKTticmVhaztjYXNlIFN4dC5OR19DT01QT05FTlQ6Y29uc3Qgbj10aGlzLnBsdWdpblJlZ2lzdHJ5LmdldENvbXBvbmVudCh0LmlkKTtpZihuKXtjb25zdCB0PXRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KG4pO2U9dGhpcy5uZ1BsdWdpbkNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQodCkubG9jYXRpb24ubmF0aXZlRWxlbWVudH1lbHNlIGNvbnNvbGUuZXJyb3IoYE5vIHJlZ2lzdGVyZWQgQW5ndWxhciBjb21wb25lbnQgZm9yIHBsdWdpbjogJHt0LmlkfWApO2JyZWFrO2Nhc2UgU3h0Lk5PTkU6YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmVycm9yKCJVbmV4cGVjdGVkIHBsdWdpbiIpfXJldHVybiBlfXJlbG9hZCh0LGUpe2lmKCFlJiZ0LmRpc2FibGVfcmVsb2FkKXJldHVybjtjb25zdCBuPXRoaXMucGx1Z2luSW5zdGFuY2VzLmdldCh0LmlkKTtuJiZuLnJlbG9hZCYmbi5yZWxvYWQoKX19VXh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxVeHQpKFNtKHVnKSxTbSh3cSksU20oc3osOCkpfSxVeHQuybVjbXA9dG8oe3R5cGU6VXh0LHNlbGVjdG9yczpbWyJwbHVnaW5zLWNvbXBvbmVudCJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmKFFoKER4dCw3LGhnKSxRaChFeHQsNyxlaCkpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4ucGx1Z2luc0NvbnRhaW5lcj10LmZpcnN0KSxKaCh0PXRiKCkpJiYobi5uZ1BsdWdpbkNvbnRhaW5lcj10LmZpcnN0KX19LGlucHV0czp7YWN0aXZlUGx1Z2luSWQ6ImFjdGl2ZVBsdWdpbklkIixhY3RpdmVLbm93blBsdWdpbjoiYWN0aXZlS25vd25QbHVnaW4iLHBsdWdpbkxvYWRTdGF0ZToicGx1Z2luTG9hZFN0YXRlIixkYXRhTG9jYXRpb246ImRhdGFMb2NhdGlvbiIsaXNGZWF0dXJlRmxhZ3NMb2FkZWQ6ImlzRmVhdHVyZUZsYWdzTG9hZGVkIixzZXR0aW5nc0xvYWRTdGF0ZToic2V0dGluZ3NMb2FkU3RhdGUiLGZlYXR1cmVGbGFnczoiZmVhdHVyZUZsYWdzIixsYXN0VXBkYXRlZDoibGFzdFVwZGF0ZWQiLGVudmlyb25tZW50RmFpbHVyZU5vdEZvdW5kVGVtcGxhdGU6ImVudmlyb25tZW50RmFpbHVyZU5vdEZvdW5kVGVtcGxhdGUiLGVudmlyb25tZW50RmFpbHVyZVVua25vd25UZW1wbGF0ZToiZW52aXJvbm1lbnRGYWlsdXJlVW5rbm93blRlbXBsYXRlIn0sZmVhdHVyZXM6W0JvXSxkZWNsczo5LHZhcnM6NCxjb25zdHM6W1szLCJuZ0NsYXNzIl0sWyJwbHVnaW5Db250YWluZXIiLCIiXSxbIm5nUGx1Z2luQ29udGFpbmVyIiwiIl0sWyJjbGFzcyIsIndhcm5pbmciLDMsIm5nU3dpdGNoIiw0LCJuZ0lmIl0sWyJlbnZpcm9ubWVudEZhaWx1cmVEZWZhdWx0VGVtcGxhdGUiLCIiXSxbImRhdGVBbmREYXRhTG9jYXRpb24iLCIiXSxbMSwid2FybmluZyIsMywibmdTd2l0Y2giXSxbMSwid2FybmluZy1tZXNzYWdlIl0sWzQsIm5nU3dpdGNoQ2FzZSJdLFs0LCJuZ1RlbXBsYXRlT3V0bGV0Il0sWzEsInVua25vd24tcGx1Z2luIl0sWzMsIm5nVGVtcGxhdGVPdXRsZXQiXSxbMSwibm8tYWN0aXZlLXBsdWdpbiJdLFsiaHJlZiIsImh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCJdLFsiaHJlZiIsImh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiXSxbImhyZWYiLCJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIl0sWzEsImVudmlyb25tZW50LW5vdC1sb2FkZWQiXSxbMSwibGFzdC1yZWxvYWQtdGltZSJdLFsiY2xhc3MiLCJkYXRhLWxvY2F0aW9uIiw0LCJuZ0lmIl0sWzEsImRhdGEtbG9jYXRpb24iXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImRpdiIsMCwxKSxJbSgyLG51bGwsMiksQW0oKSxRcCg0LEh4dCw2LDUsImRpdiIsMyksUXAoNSxGeHQsNiwxLCJuZy10ZW1wbGF0ZSIsbnVsbCw0LGliKSxRcCg3LEJ4dCw0LDUsIm5nLXRlbXBsYXRlIixudWxsLDUsaWIpKSwyJmUmJihEbSgibmdDbGFzcyIsTWgoMixWeHQsKG51bGw9PW4uYWN0aXZlS25vd25QbHVnaW4/bnVsbDpuLmFjdGl2ZUtub3duUGx1Z2luLmxvYWRpbmdfbWVjaGFuaXNtLnR5cGUpIT09bi5Mb2FkaW5nTWVjaGFuaXNtVHlwZS5JRlJBTUUpKSxyYyg0KSxEbSgibmdJZiIsbi5wbHVnaW5Mb2FkU3RhdGUhPT1uLlBsdWdpbkxvYWRTdGF0ZS5MT0FERUQmJm4ucGx1Z2luTG9hZFN0YXRlIT09bi5QbHVnaW5Mb2FkU3RhdGUuTE9BRElORykpfSxkaXJlY3RpdmVzOlthTSxkTSxmTSxnTSxNTV0scGlwZXM6W1JNXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxO2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246cmVsYXRpdmV9Ym9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLnBsdWdpbnMuaXMtZmlyc3QtcGFydHktcGx1Z2luW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMzMDMwMzA7Y29sb3I6I2ZmZn0ucGx1Z2luc1tfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCU7cG9zaXRpb246cmVsYXRpdmV9Lndhcm5pbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtib3R0b206MDtsZWZ0OjA7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MDt0b3A6MH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAud2FybmluZ1tfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC53YXJuaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiMzMDMwMzB9Lndhcm5pbmctbWVzc2FnZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTttYXJnaW46ODBweCBhdXRvIDA7bWF4LXdpZHRoOjU0MHB4fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC53YXJuaW5nLW1lc3NhZ2VbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAud2FybmluZy1tZXNzYWdlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5sYXN0LXJlbG9hZC10aW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXN0eWxlOml0YWxpY30ucGx1Z2luc1tfbmdjb250ZW50LSVDT01QJV0gICAgIGlmcmFtZXtib3JkZXI6MDtkaXNwbGF5OmJsb2NrO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFV4dCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJwbHVnaW5zLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vcGx1Z2luc19jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsicGx1Z2luc19jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnVnfSx7dHlwZTp3cX0se3R5cGU6c3osZGVjb3JhdG9yczpbe3R5cGU6U3J9XX1dfSkse3BsdWdpbnNDb250YWluZXI6W3t0eXBlOlphLGFyZ3M6WyJwbHVnaW5Db250YWluZXIiLHtzdGF0aWM6ITAscmVhZDpoZ31dfV0sbmdQbHVnaW5Db250YWluZXI6W3t0eXBlOlphLGFyZ3M6WyJuZ1BsdWdpbkNvbnRhaW5lciIse3N0YXRpYzohMCxyZWFkOmVofV19XSxhY3RpdmVQbHVnaW5JZDpbe3R5cGU6eHl9XSxhY3RpdmVLbm93blBsdWdpbjpbe3R5cGU6eHl9XSxwbHVnaW5Mb2FkU3RhdGU6W3t0eXBlOnh5fV0sZGF0YUxvY2F0aW9uOlt7dHlwZTp4eX1dLGlzRmVhdHVyZUZsYWdzTG9hZGVkOlt7dHlwZTp4eX1dLHNldHRpbmdzTG9hZFN0YXRlOlt7dHlwZTp4eX1dLGZlYXR1cmVGbGFnczpbe3R5cGU6eHl9XSxsYXN0VXBkYXRlZDpbe3R5cGU6eHl9XSxlbnZpcm9ubWVudEZhaWx1cmVOb3RGb3VuZFRlbXBsYXRlOlt7dHlwZTp4eX1dLGVudmlyb25tZW50RmFpbHVyZVVua25vd25UZW1wbGF0ZTpbe3R5cGU6eHl9XX0pO2NvbnN0IEd4dD1adyh2UixNUiwoKHQsZSk9PmUmJnRbZV0/T2JqZWN0LmFzc2lnbih7aWQ6ZX0sdFtlXSk6bnVsbCkpO2NsYXNzIFd4dHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5hY3RpdmVLbm93blBsdWdpbiQ9dGhpcy5zdG9yZS5zZWxlY3QoR3h0KSx0aGlzLmFjdGl2ZVBsdWdpbklkJD10aGlzLnN0b3JlLnNlbGVjdChNUiksdGhpcy5wbHVnaW5Mb2FkU3RhdGUkPVd0KHRoaXMuYWN0aXZlS25vd25QbHVnaW4kLHRoaXMuYWN0aXZlUGx1Z2luSWQkLHRoaXMuc3RvcmUuc2VsZWN0KGJSKSkucGlwZShJdCgoKFt0LGUsbl0pPT5udWxsIT09bi5mYWlsdXJlQ29kZT9uLmZhaWx1cmVDb2RlPT09bUUuTk9UX0ZPVU5EP2p4dC5FTlZJUk9OTUVOVF9GQUlMVVJFX05PVF9GT1VORDpqeHQuRU5WSVJPTk1FTlRfRkFJTFVSRV9VTktOT1dOOm51bGwhPT10P2p4dC5MT0FERUQ6bnVsbD09PW4ubGFzdExvYWRlZFRpbWVJbk1zJiZuLnN0YXRlPT09eUUuTE9BRElORz9qeHQuTE9BRElORzplP2p4dC5VTktOT1dOX1BMVUdJTl9JRDpqeHQuTk9fRU5BQkxFRF9QTFVHSU5TKSkpLHRoaXMubGFzdExvYWRlZFRpbWVJbk1zJD10aGlzLnN0b3JlLnNlbGVjdChDUiksdGhpcy5kYXRhTG9jYXRpb24kPXRoaXMuc3RvcmUuc2VsZWN0KHhSKS5waXBlKEl0KCh0PT50LmRhdGFfbG9jYXRpb24pKSksdGhpcy5pc0ZlYXR1cmVGbGFnc0xvYWRlZCQ9dGhpcy5zdG9yZS5zZWxlY3QocUQpLHRoaXMuZmVhdHVyZUZsYWdzJD10aGlzLnN0b3JlLnNlbGVjdChaRCksdGhpcy5zZXR0aW5nc0xvYWRTdGF0ZSQ9dGhpcy5zdG9yZS5zZWxlY3QoU04pfX1XeHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFd4dCkoU20oSXcpKX0sV3h0Lsm1Y21wPXRvKHt0eXBlOld4dCxzZWxlY3RvcnM6W1sicGx1Z2lucyJdXSxpbnB1dHM6e2Vudmlyb25tZW50RmFpbHVyZU5vdEZvdW5kVGVtcGxhdGU6ImVudmlyb25tZW50RmFpbHVyZU5vdEZvdW5kVGVtcGxhdGUiLGVudmlyb25tZW50RmFpbHVyZVVua25vd25UZW1wbGF0ZToiZW52aXJvbm1lbnRGYWlsdXJlVW5rbm93blRlbXBsYXRlIn0sZGVjbHM6OSx2YXJzOjI2LGNvbnN0czpbWzMsImFjdGl2ZUtub3duUGx1Z2luIiwiYWN0aXZlUGx1Z2luSWQiLCJkYXRhTG9jYXRpb24iLCJsYXN0VXBkYXRlZCIsInBsdWdpbkxvYWRTdGF0ZSIsImlzRmVhdHVyZUZsYWdzTG9hZGVkIiwic2V0dGluZ3NMb2FkU3RhdGUiLCJmZWF0dXJlRmxhZ3MiLCJlbnZpcm9ubWVudEZhaWx1cmVOb3RGb3VuZFRlbXBsYXRlIiwiZW52aXJvbm1lbnRGYWlsdXJlVW5rbm93blRlbXBsYXRlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihUbSgwLCJwbHVnaW5zLWNvbXBvbmVudCIsMCksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQWgoNCwiYXN5bmMiKSxBaCg1LCJhc3luYyIpLEFoKDYsImFzeW5jIiksQWgoNywiYXN5bmMiKSxBaCg4LCJhc3luYyIpKSwyJmUmJkRtKCJhY3RpdmVLbm93blBsdWdpbiIsVGgoMSwxMCxuLmFjdGl2ZUtub3duUGx1Z2luJCkpKCJhY3RpdmVQbHVnaW5JZCIsVGgoMiwxMixuLmFjdGl2ZVBsdWdpbklkJCkpKCJkYXRhTG9jYXRpb24iLFRoKDMsMTQsbi5kYXRhTG9jYXRpb24kKSkoImxhc3RVcGRhdGVkIixUaCg0LDE2LG4ubGFzdExvYWRlZFRpbWVJbk1zJCkpKCJwbHVnaW5Mb2FkU3RhdGUiLFRoKDUsMTgsbi5wbHVnaW5Mb2FkU3RhdGUkKSkoImlzRmVhdHVyZUZsYWdzTG9hZGVkIixUaCg2LDIwLG4uaXNGZWF0dXJlRmxhZ3NMb2FkZWQkKSkoInNldHRpbmdzTG9hZFN0YXRlIixUaCg3LDIyLG4uc2V0dGluZ3NMb2FkU3RhdGUkKSkoImZlYXR1cmVGbGFncyIsVGgoOCwyNCxuLmZlYXR1cmVGbGFncyQpKSgiZW52aXJvbm1lbnRGYWlsdXJlTm90Rm91bmRUZW1wbGF0ZSIsbi5lbnZpcm9ubWVudEZhaWx1cmVOb3RGb3VuZFRlbXBsYXRlKSgiZW52aXJvbm1lbnRGYWlsdXJlVW5rbm93blRlbXBsYXRlIixuLmVudmlyb25tZW50RmFpbHVyZVVua25vd25UZW1wbGF0ZSl9LHN0eWxlczpbInBsdWdpbnMtY29tcG9uZW50W19uZ2NvbnRlbnQtJUNPTVAlXSB7IGhlaWdodDogMTAwJTsgfSJdLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChXeHQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoicGx1Z2lucyIsdGVtcGxhdGU6J1xuICAgIDxwbHVnaW5zLWNvbXBvbmVudFxuICAgICAgW2FjdGl2ZUtub3duUGx1Z2luXT0iYWN0aXZlS25vd25QbHVnaW4kIHwgYXN5bmMiXG4gICAgICBbYWN0aXZlUGx1Z2luSWRdPSJhY3RpdmVQbHVnaW5JZCQgfCBhc3luYyJcbiAgICAgIFtkYXRhTG9jYXRpb25dPSJkYXRhTG9jYXRpb24kIHwgYXN5bmMiXG4gICAgICBbbGFzdFVwZGF0ZWRdPSJsYXN0TG9hZGVkVGltZUluTXMkIHwgYXN5bmMiXG4gICAgICBbcGx1Z2luTG9hZFN0YXRlXT0icGx1Z2luTG9hZFN0YXRlJCB8IGFzeW5jIlxuICAgICAgW2lzRmVhdHVyZUZsYWdzTG9hZGVkXT0iaXNGZWF0dXJlRmxhZ3NMb2FkZWQkIHwgYXN5bmMiXG4gICAgICBbc2V0dGluZ3NMb2FkU3RhdGVdPSJzZXR0aW5nc0xvYWRTdGF0ZSQgfCBhc3luYyJcbiAgICAgIFtmZWF0dXJlRmxhZ3NdPSJmZWF0dXJlRmxhZ3MkIHwgYXN5bmMiXG4gICAgICBbZW52aXJvbm1lbnRGYWlsdXJlTm90Rm91bmRUZW1wbGF0ZV09ImVudmlyb25tZW50RmFpbHVyZU5vdEZvdW5kVGVtcGxhdGUiXG4gICAgICBbZW52aXJvbm1lbnRGYWlsdXJlVW5rbm93blRlbXBsYXRlXT0iZW52aXJvbm1lbnRGYWlsdXJlVW5rbm93blRlbXBsYXRlIlxuICAgID48L3BsdWdpbnMtY29tcG9uZW50PlxuICAnLHN0eWxlczpbInBsdWdpbnMtY29tcG9uZW50IHsgaGVpZ2h0OiAxMDAlOyB9Il0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSx7ZW52aXJvbm1lbnRGYWlsdXJlTm90Rm91bmRUZW1wbGF0ZTpbe3R5cGU6eHl9XSxlbnZpcm9ubWVudEZhaWx1cmVVbmtub3duVGVtcGxhdGU6W3t0eXBlOnh5fV19KTtjbGFzcyBZeHR7fVl4dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WXh0KX0sWXh0Lsm1bW9kPWFvKHt0eXBlOll4dH0pLFl4dC7JtWluaj12bih7aW1wb3J0czpbW0VSLFdNLHdxXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFl4dCxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbV3h0LFV4dF0sZXhwb3J0czpbV3h0XSxpbXBvcnRzOltFUixXTSx3cV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhZeHQse2RlY2xhcmF0aW9uczpbV3h0LFV4dF0saW1wb3J0czpbRVIsV00sd3FdLGV4cG9ydHM6W1d4dF19KSxlbyhXeHQsW1V4dF0sW3dNXSk7Y2xhc3MgcXh0e2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5zdG9yZT10LHRoaXMuZG9jdW1lbnQ9ZSx0aGlzLm9uVmlzaWJpbGl0eUNoYW5nZT10aGlzLm9uVmlzaWJpbGl0eUNoYW5nZUltcGwuYmluZCh0aGlzKSx0aGlzLnJlbG9hZEVuYWJsZWQkPXRoaXMuc3RvcmUucGlwZShGdyhETikpLHRoaXMucmVsb2FkUGVyaW9kSW5NcyQ9dGhpcy5zdG9yZS5waXBlKEZ3KEVOKSksdGhpcy5yZWxvYWRUaW1lcklkPW51bGwsdGhpcy5taXNzZWRBdXRvUmVsb2FkPSExfW5nT25Jbml0KCl7dGhpcy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLm9uVmlzaWJpbGl0eUNoYW5nZSksV3QodGhpcy5yZWxvYWRFbmFibGVkJC5waXBlKE1lKCkpLHRoaXMucmVsb2FkUGVyaW9kSW5NcyQucGlwZShNZSgpKSkuc3Vic2NyaWJlKCgoW3QsZV0pPT57dGhpcy5jYW5jZWxMb2FkKCksdCYmdGhpcy5sb2FkKGUpfSkpfW9uVmlzaWJpbGl0eUNoYW5nZUltcGwoKXsidmlzaWJsZSI9PT10aGlzLmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSYmdGhpcy5taXNzZWRBdXRvUmVsb2FkJiYodGhpcy5taXNzZWRBdXRvUmVsb2FkPSExLHRoaXMuc3RvcmUuZGlzcGF0Y2goeEUoKSkpfWxvYWQodCl7dGhpcy5yZWxvYWRUaW1lcklkPXNldFRpbWVvdXQoKCgpPT57InZpc2libGUiPT09dGhpcy5kb2N1bWVudC52aXNpYmlsaXR5U3RhdGU/dGhpcy5zdG9yZS5kaXNwYXRjaCh4RSgpKTp0aGlzLm1pc3NlZEF1dG9SZWxvYWQ9ITAsdGhpcy5sb2FkKHQpfSksdCl9Y2FuY2VsTG9hZCgpe251bGwhPT10aGlzLnJlbG9hZFRpbWVySWQmJmNsZWFyVGltZW91dCh0aGlzLnJlbG9hZFRpbWVySWQpLHRoaXMucmVsb2FkVGltZXJJZD1udWxsfW5nT25EZXN0cm95KCl7dGhpcy5jYW5jZWxMb2FkKCksdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLm9uVmlzaWJpbGl0eUNoYW5nZSl9fXF4dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8cXh0KShTbShJdyksU20oWl8pKX0scXh0Lsm1Y21wPXRvKHt0eXBlOnF4dCxzZWxlY3RvcnM6W1sicmVsb2FkZXIiXV0sZGVjbHM6MCx2YXJzOjAsdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pe30sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChxeHQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoicmVsb2FkZXIiLHRlbXBsYXRlOiIiLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd30se3R5cGU6RG9jdW1lbnQsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XX0pLG51bGwpO2NsYXNzIFp4dHt9Wnh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxaeHQpfSxaeHQuybVjbXA9dG8oe3R5cGU6Wnh0LHNlbGVjdG9yczpbWyJ0ZW5zb3Jib2FyZC13cmFwcGVyLWNvbXBvbmVudCJdXSxkZWNsczoyLHZhcnM6MCxjb25zdHM6W1sxLCJwbHVnaW5zIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihUbSgwLCJwbHVnaW5zIiwwKSxUbSgxLCJyZWxvYWRlciIpKX0sZGlyZWN0aXZlczpbV3h0LHF4dF0sc3R5bGVzOlsiW19uZ2hvc3QtJUNPTVAlXSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIH1cblxuICAgICAgLnBsdWdpbnNbX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgZmxleDogMSAxO1xuICAgICAgICBvdmVyZmxvdzogYXV0bztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfSJdLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChaeHQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoidGVuc29yYm9hcmQtd3JhcHBlci1jb21wb25lbnQiLHRlbXBsYXRlOidcbiAgICA8cGx1Z2lucyBjbGFzcz0icGx1Z2lucyI+PC9wbHVnaW5zPlxuICAgIDxyZWxvYWRlcj48L3JlbG9hZGVyPlxuICAnLHN0eWxlczpbIlxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICB9XG5cbiAgICAgIC5wbHVnaW5zIHtcbiAgICAgICAgZmxleDogMSAxO1xuICAgICAgICBvdmVyZmxvdzogYXV0bztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgICJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwsbnVsbCk7Y2xhc3MgWHh0e31YeHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFh4dCl9LFh4dC7JtXByb3Y9TW4oe3Rva2VuOlh4dCxmYWN0b3J5Olh4dC7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWHh0LFt7dHlwZTppbX1dLG51bGwsbnVsbCk7Y29uc3QgS3h0PSJzbW9vdGhpbmciLEp4dD0icnVuQ29sb3JHcm91cCIsUXh0PSJ0YWdGaWx0ZXIiLCR4dD0icmVnZXg6IjtsZXQgdE90PWNsYXNzIGV4dGVuZHMgWHh0e2dldE1ldHJpY3NQaW5uZWRDYXJkcyh0KXtyZXR1cm4gV3QoW3Quc2VsZWN0KFBUKSx0LnNlbGVjdChrVCldKS5waXBlKEl0KCgoW3QsZV0pPT57aWYoIXQubGVuZ3RoJiYhZS5sZW5ndGgpcmV0dXJuW107Y29uc3Qgbj1bLi4udC5tYXAoKCh7cGx1Z2luOnQsdGFnOmUsc2FtcGxlOm4scnVuSWQ6b30pPT57Y29uc3QgaT17cGx1Z2luOnQsdGFnOmV9O3JldHVybiB4QSh0KSYmKGkucnVuSWQ9byksTUEodCkmJihpLnNhbXBsZT1uKSxpfSkpLC4uLmVdO3JldHVyblt7a2V5OiJwaW5uZWRDYXJkcyIsdmFsdWU6SlNPTi5zdHJpbmdpZnkobil9XX0pKSl9Z2V0RmVhdHVyZUZsYWdTdGF0ZXModCl7cmV0dXJuIFd0KFt0LnNlbGVjdCgkRCksdC5zZWxlY3QoWEQpXSkucGlwZShJdCgoKFt0LGVdKT0+e2NvbnN0IG49dC5tYXAoKHQ9Pih7a2V5Ok5BLHZhbHVlOnR9KSkpO3JldHVybiJib29sZWFuIj09dHlwZW9mIGUuZW5hYmxlZENvbG9yR3JvdXAmJm4ucHVzaCh7a2V5OklBLHZhbHVlOlN0cmluZyhlLmVuYWJsZWRDb2xvckdyb3VwKX0pLCJib29sZWFuIj09dHlwZW9mIGUuZW5hYmxlZENvbG9yR3JvdXBCeVJlZ2V4JiZuLnB1c2goe2tleTpIQSx2YWx1ZTpTdHJpbmcoZS5lbmFibGVkQ29sb3JHcm91cEJ5UmVnZXgpfSksbn0pKSl9c2VyaWFsaXplU3RhdGVUb1F1ZXJ5UGFyYW1zKHQpe3JldHVybiBXdChbdGhpcy5nZXRNZXRyaWNzUGlubmVkQ2FyZHModCksdC5zZWxlY3QoQlQpLnBpcGUoSXQoKHQ9PnQ/W3trZXk6UXh0LHZhbHVlOnR9XTpbXSkpKSx0aGlzLmdldEZlYXR1cmVGbGFnU3RhdGVzKHQpLHQuc2VsZWN0KEVUKS5waXBlKEl0KCh0PT5OdW1iZXIuaXNGaW5pdGUodC5zY2FsYXJTbW9vdGhpbmcpP1t7a2V5Okt4dCx2YWx1ZTpTdHJpbmcodC5zY2FsYXJTbW9vdGhpbmcpfV06W10pKSksdC5zZWxlY3QodU4pLnBpcGUoSXQoKHQ9PntpZighdClyZXR1cm5bXTtsZXQgZTtzd2l0Y2godC5rZXkpe2Nhc2UgdE4uRVhQRVJJTUVOVDplPSJleHBlcmltZW50IjticmVhaztjYXNlIHROLlJVTjplPSJydW4iO2JyZWFrO2Nhc2UgdE4uUkVHRVg6ZT1gcmVnZXg6JHt0LnJlZ2V4U3RyaW5nfWA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgUmFuZ2VFcnJvcigiU2VyaWFsaXphdGlvbiBub3QgaW1wbGVtZW50ZWQiKX1yZXR1cm5be2tleTpKeHQsdmFsdWU6ZX1dfSkpKV0pLnBpcGUoSXQoKHQ9PnQuZmxhdCgpKSkpfWRlc2VyaWFsaXplUXVlcnlQYXJhbXModCl7bGV0IGU9bnVsbCxuPW51bGwsbz1udWxsLGk9bnVsbDtmb3IoY29uc3R7a2V5OmEsdmFsdWU6cn1vZiB0KXN3aXRjaChhKXtjYXNlInBpbm5lZENhcmRzIjplPWVPdChyKTticmVhaztjYXNlIEt4dDpuPU51bWJlcihyKTticmVhaztjYXNlIEp4dDpzd2l0Y2gocil7Y2FzZSJleHBlcmltZW50IjppPXtrZXk6dE4uRVhQRVJJTUVOVH07YnJlYWs7Y2FzZSJydW4iOmk9e2tleTp0Ti5SVU59fWlmKHIuc3RhcnRzV2l0aCgkeHQpKXtjb25zdCB0PXIuc2xpY2UoJHh0Lmxlbmd0aCk7aT17a2V5OnROLlJFR0VYLHJlZ2V4U3RyaW5nOnR9fWJyZWFrO2Nhc2UgUXh0Om89cn1yZXR1cm57bWV0cmljczp7cGlubmVkQ2FyZHM6ZXx8W10sc21vb3RoaW5nOm4sdGFnRmlsdGVyOm99LHJ1bnM6e2dyb3VwQnk6aX19fX07ZnVuY3Rpb24gZU90KHQpe2xldCBlO3RyeXtlPUpTT04ucGFyc2UodCl9Y2F0Y2godCl7cmV0dXJuIG51bGx9aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIG51bGw7Y29uc3Qgbj1bXTtmb3IoY29uc3QgdCBvZiBlKXtjb25zdCBlPSJzdHJpbmciPT10eXBlb2YgdC5ydW5JZCxpPSJudW1iZXIiPT10eXBlb2YgdC5zYW1wbGUsYT0ic3RyaW5nIj09dHlwZW9mIHQudGFnLHI9ZXx8dm9pZCAwPT09dC5ydW5JZCxzPWl8fHZvaWQgMD09PXQuc2FtcGxlO2lmKCEoInN0cmluZyI9PXR5cGVvZiB0LnBsdWdpbiYmYSYmciYmcykpY29udGludWU7aWYoKG89dC5wbHVnaW4pIT09aEEuU0NBTEFSUyYmbyE9PWhBLkhJU1RPR1JBTVMmJm8hPT1oQS5JTUFHRVMpY29udGludWU7aWYoIXQudGFnKWNvbnRpbnVlO2lmKHhBKHQucGx1Z2luKSl7aWYoIXQucnVuSWQpY29udGludWV9ZWxzZSBpZih0LnJ1bklkKWNvbnRpbnVlO2lmKGkpe2lmKCFNQSh0LnBsdWdpbikpY29udGludWU7aWYoIU51bWJlci5pc0ludGVnZXIodC5zYW1wbGUpfHx0LnNhbXBsZTwwKWNvbnRpbnVlfWNvbnN0IGw9e3BsdWdpbjp0LnBsdWdpbix0YWc6dC50YWd9O2UmJihsLnJ1bklkPXQucnVuSWQpLGkmJihsLnNhbXBsZT10LnNhbXBsZSksbi5wdXNoKGwpfXZhciBvO3JldHVybiBufWZ1bmN0aW9uIG5PdCgpe3JldHVyblt7cm91dGVLaW5kOlprLkVYUEVSSU1FTlQscGF0aDoiLyIsbmdDb21wb25lbnQ6Wnh0LGRlZmF1bHRSb3V0ZTohMCxkZWVwTGlua1Byb3ZpZGVyOm5ldyB0T3R9XX1mdW5jdGlvbiBvT3QodCl7cmV0dXJuKGUsbik9Pntjb25zdCBvPXQoZSxuKTtyZXR1cm4gY29uc29sZS5ncm91cENvbGxhcHNlZChuLnR5cGUpLGNvbnNvbGUubG9nKCJwcmV2IHN0YXRlIixlKSxjb25zb2xlLmxvZygiYWN0aW9uIixuKSxjb25zb2xlLmxvZygibmV4dCBzdGF0ZSIsbyksY29uc29sZS5ncm91cEVuZCgpLG99fWZ1bmN0aW9uIGlPdCgpe3JldHVybiB5XygpP29PdDp0PT4oZSxuKT0+dChlLG4pfXRPdD0oZnVuY3Rpb24gYU90KHQsZSxuLG8pe3ZhciBpLGE9YXJndW1lbnRzLmxlbmd0aCxyPWE8Mz9lOm51bGw9PT1vP289T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLG4pOm87aWYoIm9iamVjdCI9PXR5cGVvZiBSZWZsZWN0JiYiZnVuY3Rpb24iPT10eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSlyPVJlZmxlY3QuZGVjb3JhdGUodCxlLG4sbyk7ZWxzZSBmb3IodmFyIHM9dC5sZW5ndGgtMTtzPj0wO3MtLSkoaT10W3NdKSYmKHI9KGE8Mz9pKHIpOmE+Mz9pKGUsbixyKTppKGUsbikpfHxyKTtyZXR1cm4gYT4zJiZyJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLHIpLHJ9KShbaW0oKV0sdE90KTtjb25zdCByT3Q9bmV3IEdhKCJSb290IHJlZHVjZXJzIHRva2VuIix7ZmFjdG9yeTooKT0+KHt9KX0pO2NsYXNzIHNPdHt9c090Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxzT3QpfSxzT3QuybVtb2Q9YW8oe3R5cGU6c090fSksc090Lsm1aW5qPXZuKHtwcm92aWRlcnM6W3twcm92aWRlOmJ3LHVzZUZhY3Rvcnk6aU90LG11bHRpOiEwfV0saW1wb3J0czpbW2RrLmZvclJvb3Qock90LHtydW50aW1lQ2hlY2tzOntzdHJpY3RTdGF0ZUltbXV0YWJpbGl0eTohMCxzdHJpY3RBY3Rpb25JbW11dGFiaWxpdHk6ITAsc3RyaWN0QWN0aW9uU2VyaWFsaXphYmlsaXR5OiExLHN0cmljdFN0YXRlU2VyaWFsaXphYmlsaXR5OiExfX0pLFdrLmZvclJvb3QoW10pXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHNPdCxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W2RrLmZvclJvb3Qock90LHtydW50aW1lQ2hlY2tzOntzdHJpY3RTdGF0ZUltbXV0YWJpbGl0eTohMCxzdHJpY3RBY3Rpb25JbW11dGFiaWxpdHk6ITAsc3RyaWN0QWN0aW9uU2VyaWFsaXphYmlsaXR5OiExLHN0cmljdFN0YXRlU2VyaWFsaXphYmlsaXR5OiExfX0pLFdrLmZvclJvb3QoW10pXSxwcm92aWRlcnM6W3twcm92aWRlOmJ3LHVzZUZhY3Rvcnk6aU90LG11bHRpOiEwfV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhzT3Qse2ltcG9ydHM6W2xrLFVrXX0pO2NsYXNzIGxPdHt9bE90Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxsT3QpfSxsT3QuybVtb2Q9YW8oe3R5cGU6bE90fSksbE90Lsm1aW5qPXZuKHt9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGxPdCxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbcXh0XSxleHBvcnRzOltxeHRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8obE90LHtkZWNsYXJhdGlvbnM6W3F4dF0sZXhwb3J0czpbcXh0XX0pO2NsYXNzIGNPdHt9Y090Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxjT3QpfSxjT3QuybVtb2Q9YW8oe3R5cGU6Y090fSksY090Lsm1aW5qPXZuKHtpbXBvcnRzOltbV00sWXh0LGxPdF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChjT3QsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W1p4dF0saW1wb3J0czpbV00sWXh0LGxPdF0sZXhwb3J0czpbWnh0XSxlbnRyeUNvbXBvbmVudHM6W1p4dF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhjT3Qse2RlY2xhcmF0aW9uczpbWnh0XSxpbXBvcnRzOltXTSxZeHQsbE90XSxleHBvcnRzOltaeHRdfSk7Y2xhc3MgZE90e31kT3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGRPdCl9LGRPdC7JtW1vZD1hbyh7dHlwZTpkT3QsYm9vdHN0cmFwOlthcV19KSxkT3QuybVpbmo9dm4oe2ltcG9ydHM6W1t0VCxVdixaUCxCUyxzcSxQUy5yZWdpc3RlclJvdXRlcyhuT3QpLEpMLEtMLGxxLGNPdCxFUixncSxkcSx2cSxhQSx4cSxwcSxyRCxzeixZeHQsS04sQ3Esc090LGt4dF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChkT3QsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W2FxXSxpbXBvcnRzOlt0VCxVdixaUCxCUyxzcSxQUy5yZWdpc3RlclJvdXRlcyhuT3QpLEpMLEtMLGxxLGNPdCxFUixncSxkcSx2cSxhQSx4cSxwcSxyRCxzeixZeHQsS04sQ3Esc090LGt4dF0sYm9vdHN0cmFwOlthcV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhkT3Qse2RlY2xhcmF0aW9uczpbYXFdLGltcG9ydHM6W3RULFV2LFpQLEJTLHNxLFBTLEpMLEtMLGxxLGNPdCxFUixncSxkcSx2cSxhQSx4cSxwcSxyRCxzeixZeHQsS04sQ3Esc090LGt4dF19KSwibG9hZGluZyIhPT1kb2N1bWVudC5yZWFkeVN0YXRlP0Z2KCkuYm9vdHN0cmFwTW9kdWxlKGRPdCk6d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCgoKT0+e0Z2KCkuYm9vdHN0cmFwTW9kdWxlKGRPdCl9KSksKGZ1bmN0aW9uIHBPdCgpe2lmKGJfKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGVuYWJsZSBwcm9kIG1vZGUgYWZ0ZXIgcGxhdGZvcm0gc2V0dXAuIik7KHZvaWQgMD09PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJihqbi5uZ0Rldk1vZGU9ITEpLGhfPSExfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8pKCl9KSgpOwo=", + "headers": [ + [ + "content-type", + "application/javascript; charset=utf-8" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "id": "PW2NAam_7irv", + "outputId": "38b8995a-c139-441c-e393-56c11f214655" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Reusing TensorBoard on port 6006 (pid 639), started 0:12:12 ago. (Use '!kill 639' to kill it.)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": "\n (async () => {\n const url = new URL(await google.colab.kernel.proxyPort(6006, {'cache': true}));\n url.searchParams.set('tensorboardColab', 'true');\n const iframe = document.createElement('iframe');\n iframe.src = url;\n iframe.setAttribute('width', '100%');\n iframe.setAttribute('height', '800');\n iframe.setAttribute('frameborder', 0);\n document.body.appendChild(iframe);\n })();\n ", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# load tensorboard in colab\n", + "%load_ext tensorboard\n", + "\n", + "# see curves in tensorboard\n", + "%tensorboard --logdir ./tutorial_exps" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MfQ-yspZLuuI" + }, + "source": [ + "## Test the Trained Detector\n", + "\n", + "After finetuning the detector, let's visualize the prediction results!" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 854 + }, + "id": "_MuZurfGLq0p", + "outputId": "5df4dc5f-5b90-46c3-9aeb-a4d0ac13564a" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/content/mmdetection/mmdet/datasets/utils.py:69: UserWarning: \"ImageToTensor\" pipeline is replaced by \"DefaultFormatBundle\" for batch inference. It is recommended to manually replace it in the test data pipeline in your config file.\n", + " 'data pipeline in your config file.', UserWarning)\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "img = mmcv.imread('balloon/train/7178882742_f090f3ce56_k.jpg')\n", + "\n", + "model.cfg = cfg\n", + "result = inference_detector(model, img)\n", + "show_result_pyplot(model, img, result)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6rzruCwFgPXm" + }, + "source": [ + "## What to Do Next?\n", + "\n", + "So far, we have learnt how to test and train Mask R-CNN. To further explore the segmentation task, you could do several other things as shown below:\n", + "\n", + "- Try cascade methods, e.g., [Cascade Mask R-CNN](https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn) and [HTC](https://github.com/open-mmlab/mmdetection/tree/master/configs/htc) in [MMDetection model zoo](https://github.com/open-mmlab/mmdetection/blob/master/docs/en/model_zoo.md). They are powerful detectors that are ranked high in many benchmarks, e.g., COCO dataset.\n", + "- Try single-stage methods, e.g., [K-Net](https://github.com/ZwwWayne/K-Net) and [Dense-RepPoints](https://github.com/justimyhxu/Dense-RepPoints). These two algorithms are based on MMDetection. Box-free instance segmentation is a new trend in the instance segmentation community.\n", + "- Try semantic segmentation. Semantic segmentation is also a popular task with wide applications. You can explore [MMSegmentation](https://github.com/open-mmlab/mmsegmentation/); we also provide a [colab tutorial](https://github.com/open-mmlab/mmsegmentation/blob/master/demo/MMSegmentation_Tutorial.ipynb) for semantic segmentation using MMSegmentation.\n" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "collapsed_sections": [], + "name": "tutorial_03_image_segmentation_final.ipynb", + "provenance": [], + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/demo/MMDet_Tutorial.ipynb b/demo/MMDet_Tutorial.ipynb new file mode 100644 index 0000000..c6c19c2 --- /dev/null +++ b/demo/MMDet_Tutorial.ipynb @@ -0,0 +1,2067 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "aGYwt_UjIrqp" + }, + "source": [ + "# Object Detection\n", + "\n", + "In this tutorial, you will learn:\n", + "- the basic structure of Faster R-CNN.\n", + "- to perform inference with a MMDetection detector.\n", + "- to train a new detector with a new dataset.\n", + "\n", + "Let's start!\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "tJxJHruNLb7Y" + }, + "source": [ + "## Install MMDetection" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Wi4LPmsR66sy", + "outputId": "a5005e9d-afb9-4d06-d51c-2c3fa19687b8" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "nvcc: NVIDIA (R) Cuda compiler driver\n", + "Copyright (c) 2005-2020 NVIDIA Corporation\n", + "Built on Mon_Oct_12_20:09:46_PDT_2020\n", + "Cuda compilation tools, release 11.1, V11.1.105\n", + "Build cuda_11.1.TC455_06.29190527_0\n", + "gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0\n", + "Copyright (C) 2017 Free Software Foundation, Inc.\n", + "This is free software; see the source for copying conditions. There is NO\n", + "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n", + "\n" + ] + } + ], + "source": [ + "# Check nvcc version\n", + "!nvcc -V\n", + "# Check GCC version\n", + "!gcc --version" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "gkGnB9WyHSXB", + "outputId": "6af7be0b-a75f-4e52-b54b-8d92212f7722" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Looking in links: https://download.pytorch.org/whl/torch_stable.html\n", + "Collecting torch==1.9.0+cu111\n", + " Downloading https://download.pytorch.org/whl/cu111/torch-1.9.0%2Bcu111-cp37-cp37m-linux_x86_64.whl (2041.3 MB)\n", + "\u001b[K |█████████████ | 834.1 MB 1.5 MB/s eta 0:13:16tcmalloc: large alloc 1147494400 bytes == 0x55a4587ba000 @ 0x7f26db5db615 0x55a41edd03bc 0x55a41eeb118a 0x55a41edd31cd 0x55a41eec5b3d 0x55a41ee47458 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee472c0 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee43cd4 0x55a41eec6986 0x55a41ee43350 0x55a41eec6986 0x55a41ee43350 0x55a41eec6986 0x55a41ee43350 0x55a41edd4f19 0x55a41ee18a79 0x55a41edd3b32 0x55a41ee471dd 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee43cd4 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee42eae 0x55a41edd49da 0x55a41ee43108 0x55a41ee4202f\n", + "\u001b[K |████████████████▌ | 1055.7 MB 1.4 MB/s eta 0:11:52tcmalloc: large alloc 1434370048 bytes == 0x55a49ce10000 @ 0x7f26db5db615 0x55a41edd03bc 0x55a41eeb118a 0x55a41edd31cd 0x55a41eec5b3d 0x55a41ee47458 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee472c0 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee43cd4 0x55a41eec6986 0x55a41ee43350 0x55a41eec6986 0x55a41ee43350 0x55a41eec6986 0x55a41ee43350 0x55a41edd4f19 0x55a41ee18a79 0x55a41edd3b32 0x55a41ee471dd 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee43cd4 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee42eae 0x55a41edd49da 0x55a41ee43108 0x55a41ee4202f\n", + "\u001b[K |█████████████████████ | 1336.2 MB 1.3 MB/s eta 0:09:01tcmalloc: large alloc 1792966656 bytes == 0x55a421c42000 @ 0x7f26db5db615 0x55a41edd03bc 0x55a41eeb118a 0x55a41edd31cd 0x55a41eec5b3d 0x55a41ee47458 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee472c0 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee43cd4 0x55a41eec6986 0x55a41ee43350 0x55a41eec6986 0x55a41ee43350 0x55a41eec6986 0x55a41ee43350 0x55a41edd4f19 0x55a41ee18a79 0x55a41edd3b32 0x55a41ee471dd 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee43cd4 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee42eae 0x55a41edd49da 0x55a41ee43108 0x55a41ee4202f\n", + "\u001b[K |██████████████████████████▌ | 1691.1 MB 1.3 MB/s eta 0:04:36tcmalloc: large alloc 2241208320 bytes == 0x55a48ca2a000 @ 0x7f26db5db615 0x55a41edd03bc 0x55a41eeb118a 0x55a41edd31cd 0x55a41eec5b3d 0x55a41ee47458 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee472c0 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee43cd4 0x55a41eec6986 0x55a41ee43350 0x55a41eec6986 0x55a41ee43350 0x55a41eec6986 0x55a41ee43350 0x55a41edd4f19 0x55a41ee18a79 0x55a41edd3b32 0x55a41ee471dd 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee43cd4 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee42eae 0x55a41edd49da 0x55a41ee43108 0x55a41ee4202f\n", + "\u001b[K |████████████████████████████████| 2041.3 MB 1.1 MB/s eta 0:00:01tcmalloc: large alloc 2041348096 bytes == 0x55a51238c000 @ 0x7f26db5da1e7 0x55a41ee065d7 0x55a41edd03bc 0x55a41eeb118a 0x55a41edd31cd 0x55a41eec5b3d 0x55a41ee47458 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee43108 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee43108 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee43108 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee43108 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee43108 0x55a41edd49da 0x55a41ee43108 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee43cd4 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee43cd4 0x55a41ee4202f\n", + "tcmalloc: large alloc 2551685120 bytes == 0x55a600300000 @ 0x7f26db5db615 0x55a41edd03bc 0x55a41eeb118a 0x55a41edd31cd 0x55a41eec5b3d 0x55a41ee47458 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee43108 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee43108 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee43108 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee43108 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee43108 0x55a41edd49da 0x55a41ee43108 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee43cd4 0x55a41ee4202f 0x55a41edd4aba 0x55a41ee43cd4 0x55a41ee4202f 0x55a41edd5151\n", + "\u001b[K |████████████████████████████████| 2041.3 MB 7.2 kB/s \n", + "\u001b[?25hCollecting torchvision==0.10.0+cu111\n", + " Downloading https://download.pytorch.org/whl/cu111/torchvision-0.10.0%2Bcu111-cp37-cp37m-linux_x86_64.whl (23.2 MB)\n", + "\u001b[K |████████████████████████████████| 23.2 MB 13.8 MB/s \n", + "\u001b[?25hRequirement already satisfied: typing-extensions in /usr/local/lib/python3.7/dist-packages (from torch==1.9.0+cu111) (3.10.0.2)\n", + "Requirement already satisfied: pillow>=5.3.0 in /usr/local/lib/python3.7/dist-packages (from torchvision==0.10.0+cu111) (7.1.2)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from torchvision==0.10.0+cu111) (1.19.5)\n", + "Installing collected packages: torch, torchvision\n", + " Attempting uninstall: torch\n", + " Found existing installation: torch 1.10.0+cu111\n", + " Uninstalling torch-1.10.0+cu111:\n", + " Successfully uninstalled torch-1.10.0+cu111\n", + " Attempting uninstall: torchvision\n", + " Found existing installation: torchvision 0.11.1+cu111\n", + " Uninstalling torchvision-0.11.1+cu111:\n", + " Successfully uninstalled torchvision-0.11.1+cu111\n", + "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", + "torchtext 0.11.0 requires torch==1.10.0, but you have torch 1.9.0+cu111 which is incompatible.\n", + "torchaudio 0.10.0+cu111 requires torch==1.10.0, but you have torch 1.9.0+cu111 which is incompatible.\u001b[0m\n", + "Successfully installed torch-1.9.0+cu111 torchvision-0.10.0+cu111\n", + "Looking in links: https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html\n", + "Collecting mmcv-full\n", + " Downloading https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/mmcv_full-1.4.4-cp37-cp37m-manylinux1_x86_64.whl (67.3 MB)\n", + "\u001b[K |████████████████████████████████| 67.3 MB 1.3 MB/s \n", + "\u001b[?25hRequirement already satisfied: packaging in /usr/local/lib/python3.7/dist-packages (from mmcv-full) (21.3)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmcv-full) (1.19.5)\n", + "Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from mmcv-full) (3.13)\n", + "Collecting addict\n", + " Downloading addict-2.4.0-py3-none-any.whl (3.8 kB)\n", + "Requirement already satisfied: opencv-python>=3 in /usr/local/lib/python3.7/dist-packages (from mmcv-full) (4.1.2.30)\n", + "Collecting yapf\n", + " Downloading yapf-0.32.0-py2.py3-none-any.whl (190 kB)\n", + "\u001b[K |████████████████████████████████| 190 kB 5.1 MB/s \n", + "\u001b[?25hRequirement already satisfied: Pillow in /usr/local/lib/python3.7/dist-packages (from mmcv-full) (7.1.2)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /usr/local/lib/python3.7/dist-packages (from packaging->mmcv-full) (3.0.7)\n", + "Installing collected packages: yapf, addict, mmcv-full\n", + "Successfully installed addict-2.4.0 mmcv-full-1.4.4 yapf-0.32.0\n", + "Cloning into 'mmdetection'...\n", + "remote: Enumerating objects: 22983, done.\u001b[K\n", + "remote: Counting objects: 100% (25/25), done.\u001b[K\n", + "remote: Compressing objects: 100% (23/23), done.\u001b[K\n", + "remote: Total 22983 (delta 4), reused 17 (delta 2), pack-reused 22958\u001b[K\n", + "Receiving objects: 100% (22983/22983), 25.79 MiB | 34.48 MiB/s, done.\n", + "Resolving deltas: 100% (16102/16102), done.\n", + "/content/mmdetection\n", + "Obtaining file:///content/mmdetection\n", + "Requirement already satisfied: matplotlib in /usr/local/lib/python3.7/dist-packages (from mmdet==2.21.0) (3.2.2)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from mmdet==2.21.0) (1.19.5)\n", + "Requirement already satisfied: pycocotools in /usr/local/lib/python3.7/dist-packages (from mmdet==2.21.0) (2.0.4)\n", + "Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from mmdet==2.21.0) (1.15.0)\n", + "Collecting terminaltables\n", + " Downloading terminaltables-3.1.10-py2.py3-none-any.whl (15 kB)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mmdet==2.21.0) (1.3.2)\n", + "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mmdet==2.21.0) (3.0.7)\n", + "Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mmdet==2.21.0) (0.11.0)\n", + "Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->mmdet==2.21.0) (2.8.2)\n", + "Installing collected packages: terminaltables, mmdet\n", + " Running setup.py develop for mmdet\n", + "Successfully installed mmdet-2.21.0 terminaltables-3.1.10\n" + ] + } + ], + "source": [ + "# install dependencies: (use cu111 because colab has CUDA 11.1)\n", + "!pip install torch==1.9.0+cu111 torchvision==0.10.0+cu111 -f https://download.pytorch.org/whl/torch_stable.html\n", + "\n", + "# install mmcv-full thus we could use CUDA operators\n", + "!pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html\n", + "\n", + "# Install mmdetection\n", + "!rm -rf mmdetection\n", + "!git clone https://github.com/open-mmlab/mmdetection.git\n", + "%cd mmdetection\n", + "\n", + "!pip install -e ." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "_YeUiqAoCaoV", + "outputId": "7f894255-c0a0-4ca7-9083-2cf0e2c0646e" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'CUDA available': True,\n", + " 'CUDA_HOME': '/usr/local/cuda',\n", + " 'GCC': 'gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0',\n", + " 'GPU 0': 'Tesla T4',\n", + " 'MMCV': '1.4.4',\n", + " 'MMCV CUDA Compiler': '11.1',\n", + " 'MMCV Compiler': 'GCC 7.3',\n", + " 'NVCC': 'Build cuda_11.1.TC455_06.29190527_0',\n", + " 'OpenCV': '4.1.2',\n", + " 'PyTorch': '1.9.0+cu111',\n", + " 'PyTorch compiling details': 'PyTorch built with:\\n - GCC 7.3\\n - C++ Version: 201402\\n - Intel(R) Math Kernel Library Version 2020.0.0 Product Build 20191122 for Intel(R) 64 architecture applications\\n - Intel(R) MKL-DNN v2.1.2 (Git Hash 98be7e8afa711dc9b66c8ff3504129cb82013cdb)\\n - OpenMP 201511 (a.k.a. OpenMP 4.5)\\n - NNPACK is enabled\\n - CPU capability usage: AVX2\\n - CUDA Runtime 11.1\\n - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80;-gencode;arch=compute_86,code=sm_86\\n - CuDNN 8.0.5\\n - Magma 2.5.2\\n - Build settings: BLAS_INFO=mkl, BUILD_TYPE=Release, CUDA_VERSION=11.1, CUDNN_VERSION=8.0.5, CXX_COMPILER=/opt/rh/devtoolset-7/root/usr/bin/c++, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_KINETO -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -DSYMBOLICATE_MOBILE_DEBUG_HANDLE -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, LAPACK_INFO=mkl, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, TORCH_VERSION=1.9.0, USE_CUDA=ON, USE_CUDNN=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, \\n',\n", + " 'Python': '3.7.12 (default, Jan 15 2022, 18:48:18) [GCC 7.5.0]',\n", + " 'TorchVision': '0.10.0+cu111',\n", + " 'sys.platform': 'linux'}" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from mmcv import collect_env\n", + "collect_env()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "6hD0mmMixT0p", + "outputId": "ac4aaaeb-6b18-4500-c95c-6f781cda76fc" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.9.0+cu111 True\n", + "2.21.0\n", + "11.1\n", + "GCC 7.3\n" + ] + } + ], + "source": [ + "# Check Pytorch installation\n", + "import torch, torchvision\n", + "print(torch.__version__, torch.cuda.is_available())\n", + "\n", + "# Check MMDetection installation\n", + "import mmdet\n", + "print(mmdet.__version__)\n", + "\n", + "# Check mmcv installation\n", + "from mmcv.ops import get_compiling_cuda_version, get_compiler_version\n", + "print(get_compiling_cuda_version())\n", + "print(get_compiler_version())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gi9zw03oM4CH" + }, + "source": [ + "## Perform Inference with An MMDet detector\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "s99mDGBG1S1z" + }, + "source": [ + "### A two-stage detector\n", + "\n", + "In this tutorial, we use Faster R-CNN, a simple two-stage detector as an example.\n", + "\n", + "The high-level architecture of Faster R-CNN is shown in the following picture. More details can be found in the [paper](https://arxiv.org/abs/1506.01497).\n", + "\n", + "![faster rcnn](https://pic1.zhimg.com/80/v2-c0172be282021a1029f7b72b51079ffe_1440w.jpg)\n", + "\n", + "![mmdet](https://pic2.zhimg.com/v2-e49ebcf931b5cf424ed311338f9ff35d_b.jpg)\n", + "\n", + "Briefly, it uses a convolutional neural network (CNN) as backbone to extract features from an image. Then, it uses a region proposal network (RPN) to predict proposals, i.e., potential objects. After that, it uses a feature extractor to crop features for the region of interests (RoI), and uses a RoI Head to perform classification and bounding box prediction.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "j4doHX4exvS1", + "outputId": "b42719be-cb70-47a1-867a-56649a794c44" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2022-02-08 11:29:13-- https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210526_095054-1f77628b.pth\n", + "Resolving download.openmmlab.com (download.openmmlab.com)... 47.252.96.28\n", + "Connecting to download.openmmlab.com (download.openmmlab.com)|47.252.96.28|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 167291982 (160M) [application/octet-stream]\n", + "Saving to: ‘checkpoints/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210526_095054-1f77628b.pth’\n", + "\n", + "checkpoints/faster_ 100%[===================>] 159.54M 7.92MB/s in 22s \n", + "\n", + "2022-02-08 11:29:37 (7.28 MB/s) - ‘checkpoints/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210526_095054-1f77628b.pth’ saved [167291982/167291982]\n", + "\n" + ] + } + ], + "source": [ + "# We download the pre-trained checkpoints for inference and finetuning.\n", + "!mkdir checkpoints\n", + "!wget -c https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210526_095054-1f77628b.pth \\\n", + " -O checkpoints/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210526_095054-1f77628b.pth" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8M5KUnX7Np3h", + "outputId": "a061bced-262e-404f-94c5-6400a75078b3" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "load checkpoint from local path: checkpoints/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210526_095054-1f77628b.pth\n" + ] + }, + { + "data": { + "text/plain": [ + "FasterRCNN(\n", + " (backbone): ResNet(\n", + " (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)\n", + " (layer1): ResLayer(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(64, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (layer2): ResLayer(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(256, 128, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (3): Bottleneck(\n", + " (conv1): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(128, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (layer3): ResLayer(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(512, 256, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(512, 1024, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (1): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (3): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (4): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (5): Bottleneck(\n", + " (conv1): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(256, 1024, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " (layer4): ResLayer(\n", + " (0): Bottleneck(\n", + " (conv1): Conv2d(1024, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " (downsample): Sequential(\n", + " (0): Conv2d(1024, 2048, kernel_size=(1, 1), stride=(2, 2), bias=False)\n", + " (1): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " )\n", + " )\n", + " (1): Bottleneck(\n", + " (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " (2): Bottleneck(\n", + " (conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)\n", + " (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)\n", + " (bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " )\n", + " )\n", + " init_cfg={'type': 'Pretrained', 'checkpoint': 'open-mmlab://detectron2/resnet50_caffe'}\n", + " (neck): FPN(\n", + " (lateral_convs): ModuleList(\n", + " (0): ConvModule(\n", + " (conv): Conv2d(256, 256, kernel_size=(1, 1), stride=(1, 1))\n", + " )\n", + " (1): ConvModule(\n", + " (conv): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1))\n", + " )\n", + " (2): ConvModule(\n", + " (conv): Conv2d(1024, 256, kernel_size=(1, 1), stride=(1, 1))\n", + " )\n", + " (3): ConvModule(\n", + " (conv): Conv2d(2048, 256, kernel_size=(1, 1), stride=(1, 1))\n", + " )\n", + " )\n", + " (fpn_convs): ModuleList(\n", + " (0): ConvModule(\n", + " (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", + " )\n", + " (1): ConvModule(\n", + " (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", + " )\n", + " (2): ConvModule(\n", + " (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", + " )\n", + " (3): ConvModule(\n", + " (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", + " )\n", + " )\n", + " )\n", + " init_cfg={'type': 'Xavier', 'layer': 'Conv2d', 'distribution': 'uniform'}\n", + " (rpn_head): RPNHead(\n", + " (loss_cls): CrossEntropyLoss()\n", + " (loss_bbox): L1Loss()\n", + " (rpn_conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", + " (rpn_cls): Conv2d(256, 3, kernel_size=(1, 1), stride=(1, 1))\n", + " (rpn_reg): Conv2d(256, 12, kernel_size=(1, 1), stride=(1, 1))\n", + " )\n", + " init_cfg={'type': 'Normal', 'layer': 'Conv2d', 'std': 0.01}\n", + " (roi_head): StandardRoIHead(\n", + " (bbox_roi_extractor): SingleRoIExtractor(\n", + " (roi_layers): ModuleList(\n", + " (0): RoIAlign(output_size=(7, 7), spatial_scale=0.25, sampling_ratio=0, pool_mode=avg, aligned=True, use_torchvision=False)\n", + " (1): RoIAlign(output_size=(7, 7), spatial_scale=0.125, sampling_ratio=0, pool_mode=avg, aligned=True, use_torchvision=False)\n", + " (2): RoIAlign(output_size=(7, 7), spatial_scale=0.0625, sampling_ratio=0, pool_mode=avg, aligned=True, use_torchvision=False)\n", + " (3): RoIAlign(output_size=(7, 7), spatial_scale=0.03125, sampling_ratio=0, pool_mode=avg, aligned=True, use_torchvision=False)\n", + " )\n", + " )\n", + " (bbox_head): Shared2FCBBoxHead(\n", + " (loss_cls): CrossEntropyLoss()\n", + " (loss_bbox): L1Loss()\n", + " (fc_cls): Linear(in_features=1024, out_features=81, bias=True)\n", + " (fc_reg): Linear(in_features=1024, out_features=320, bias=True)\n", + " (shared_convs): ModuleList()\n", + " (shared_fcs): ModuleList(\n", + " (0): Linear(in_features=12544, out_features=1024, bias=True)\n", + " (1): Linear(in_features=1024, out_features=1024, bias=True)\n", + " )\n", + " (cls_convs): ModuleList()\n", + " (cls_fcs): ModuleList()\n", + " (reg_convs): ModuleList()\n", + " (reg_fcs): ModuleList()\n", + " (relu): ReLU(inplace=True)\n", + " )\n", + " init_cfg=[{'type': 'Normal', 'std': 0.01, 'override': {'name': 'fc_cls'}}, {'type': 'Normal', 'std': 0.001, 'override': {'name': 'fc_reg'}}, {'type': 'Xavier', 'distribution': 'uniform', 'override': [{'name': 'shared_fcs'}, {'name': 'cls_fcs'}, {'name': 'reg_fcs'}]}]\n", + " )\n", + ")" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import mmcv\n", + "from mmcv.runner import load_checkpoint\n", + "\n", + "from mmdet.apis import inference_detector, show_result_pyplot\n", + "from mmdet.models import build_detector\n", + "\n", + "# Choose to use a config and initialize the detector\n", + "config = 'configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco.py'\n", + "# Setup a checkpoint file to load\n", + "checkpoint = 'checkpoints/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210526_095054-1f77628b.pth'\n", + "\n", + "# Set the device to be used for evaluation\n", + "device='cuda:0'\n", + "\n", + "# Load the config\n", + "config = mmcv.Config.fromfile(config)\n", + "# Set pretrained to be None since we do not need pretrained model here\n", + "config.model.pretrained = None\n", + "\n", + "# Initialize the detector\n", + "model = build_detector(config.model)\n", + "\n", + "# Load checkpoint\n", + "checkpoint = load_checkpoint(model, checkpoint, map_location=device)\n", + "\n", + "# Set the classes of models for inference\n", + "model.CLASSES = checkpoint['meta']['CLASSES']\n", + "\n", + "# We need to set the model's cfg for inference\n", + "model.cfg = config\n", + "\n", + "# Convert the model to GPU\n", + "model.to(device)\n", + "# Convert the model into evaluation mode\n", + "model.eval()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fLgFRMtP91ue" + }, + "source": [ + "From the printed model, we will find that the model does consist of the components that we described earlier. It uses ResNet as its CNN backbone, and has a RPN head and RoI Head. In addition, the model has a neural network module, named neck, directly after the CNN backbone. It is a [feature pyramid network (FPN)](https://arxiv.org/abs/1612.03144) for enhancing the multi-scale features.\n", + "\n", + "\n", + "### Inference the detector\n", + "\n", + "Since the model is successfully created and loaded, let's see how good it is. We use the high-level API `inference_detector` implemented in the MMDetection. This API is created to ease the inference process. The details of the codes can be found [here](https://github.com/open-mmlab/mmdetection/blob/master/mmdet/apis/inference.py#L15)." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Wi6DRpsQPEmV", + "outputId": "a0e1e23c-d78c-4381-9f4c-5603c81a0f87" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/content/mmdetection/mmdet/datasets/utils.py:69: UserWarning: \"ImageToTensor\" pipeline is replaced by \"DefaultFormatBundle\" for batch inference. It is recommended to manually replace it in the test data pipeline in your config file.\n", + " 'data pipeline in your config file.', UserWarning)\n", + "/usr/local/lib/python3.7/dist-packages/torch/nn/functional.py:718: UserWarning: Named tensors and all their associated APIs are an experimental feature and subject to change. Please do not use them for anything important until they are released as stable. (Triggered internally at /pytorch/c10/core/TensorImpl.h:1156.)\n", + " return torch.max_pool2d(input, kernel_size, stride, padding, dilation, ceil_mode)\n" + ] + } + ], + "source": [ + "# Use the detector to do inference\n", + "img = 'demo/demo.jpg'\n", + "result = inference_detector(model, img)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 474 + }, + "id": "UsJU5D-QPX8L", + "outputId": "b70aceab-d264-4f5e-cdbe-5db1389eeb29" + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Let's plot the result\n", + "show_result_pyplot(model, img, result, score_thr=0.3)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7GrWIJywLV-V" + }, + "source": [ + "## Train A Detector on A Customized Dataset\n", + "\n", + "To train a new detector, there are usually three things to do:\n", + "1. Support a new dataset\n", + "2. Modify the config\n", + "3. Train a new detector\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "E73y5Lru-wBx" + }, + "source": [ + "### Support a new dataset\n", + "\n", + "There are three ways to support a new dataset in MMDetection: \n", + " 1. Reorganize the dataset into a COCO format.\n", + " 2. Reorganize the dataset into a middle format.\n", + " 3. Implement a new dataset.\n", + "\n", + "We recommend the first two methods, as they are usually easier than the third one.\n", + "\n", + "In this tutorial, we give an example that converts the data into the formats of existing datasets, e.g. COCO, VOC, etc. Other methods and more advanced usages can be found in the [doc](https://mmdetection.readthedocs.io/en/latest/tutorials/customize_dataset.html#).\n", + "\n", + "First, let's download a tiny dataset obtained from [KITTI](http://www.cvlibs.net/datasets/kitti/eval_object.php?obj_benchmark=3d). We select the first 75 images and their annotations from the 3D object detection dataset (it is the same dataset as the 2D object detection dataset but with 3D annotations). We convert the original images from PNG to JPEG format with 80% quality to reduce the size of the dataset." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "rHnw5Q_nARXq", + "outputId": "089f8810-be3a-4627-e3d7-945b3c5cf29e" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--2022-02-08 11:33:06-- https://download.openmmlab.com/mmdetection/data/kitti_tiny.zip\n", + "Resolving download.openmmlab.com (download.openmmlab.com)... 47.245.16.66\n", + "Connecting to download.openmmlab.com (download.openmmlab.com)|47.245.16.66|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 6918271 (6.6M) [application/zip]\n", + "Saving to: ‘kitti_tiny.zip’\n", + "\n", + "kitti_tiny.zip 100%[===================>] 6.60M 4.69MB/s in 1.4s \n", + "\n", + "2022-02-08 11:33:09 (4.69 MB/s) - ‘kitti_tiny.zip’ saved [6918271/6918271]\n", + "\n" + ] + } + ], + "source": [ + "# download, decompress the data\n", + "!wget https://download.openmmlab.com/mmdetection/data/kitti_tiny.zip\n", + "!unzip kitti_tiny.zip > /dev/null" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Wuwxw1oZRtVZ", + "outputId": "c1cb0332-a381-4685-c692-ea7a6279d65d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading package lists...\n", + "Building dependency tree...\n", + "Reading state information...\n", + "The following packages were automatically installed and are no longer required:\n", + " cuda-command-line-tools-10-0 cuda-command-line-tools-10-1\n", + " cuda-command-line-tools-11-0 cuda-compiler-10-0 cuda-compiler-10-1\n", + " cuda-compiler-11-0 cuda-cuobjdump-10-0 cuda-cuobjdump-10-1\n", + " cuda-cuobjdump-11-0 cuda-cupti-10-0 cuda-cupti-10-1 cuda-cupti-11-0\n", + " cuda-cupti-dev-11-0 cuda-documentation-10-0 cuda-documentation-10-1\n", + " cuda-documentation-11-0 cuda-documentation-11-1 cuda-gdb-10-0 cuda-gdb-10-1\n", + " cuda-gdb-11-0 cuda-gpu-library-advisor-10-0 cuda-gpu-library-advisor-10-1\n", + " cuda-libraries-10-0 cuda-libraries-10-1 cuda-libraries-11-0\n", + " cuda-memcheck-10-0 cuda-memcheck-10-1 cuda-memcheck-11-0 cuda-nsight-10-0\n", + " cuda-nsight-10-1 cuda-nsight-11-0 cuda-nsight-11-1 cuda-nsight-compute-10-0\n", + " cuda-nsight-compute-10-1 cuda-nsight-compute-11-0 cuda-nsight-compute-11-1\n", + " cuda-nsight-systems-10-1 cuda-nsight-systems-11-0 cuda-nsight-systems-11-1\n", + " cuda-nvcc-10-0 cuda-nvcc-10-1 cuda-nvcc-11-0 cuda-nvdisasm-10-0\n", + " cuda-nvdisasm-10-1 cuda-nvdisasm-11-0 cuda-nvml-dev-10-0 cuda-nvml-dev-10-1\n", + " cuda-nvml-dev-11-0 cuda-nvprof-10-0 cuda-nvprof-10-1 cuda-nvprof-11-0\n", + " cuda-nvprune-10-0 cuda-nvprune-10-1 cuda-nvprune-11-0 cuda-nvtx-10-0\n", + " cuda-nvtx-10-1 cuda-nvtx-11-0 cuda-nvvp-10-0 cuda-nvvp-10-1 cuda-nvvp-11-0\n", + " cuda-nvvp-11-1 cuda-samples-10-0 cuda-samples-10-1 cuda-samples-11-0\n", + " cuda-samples-11-1 cuda-sanitizer-11-0 cuda-sanitizer-api-10-1\n", + " cuda-toolkit-10-0 cuda-toolkit-10-1 cuda-toolkit-11-0 cuda-toolkit-11-1\n", + " cuda-tools-10-0 cuda-tools-10-1 cuda-tools-11-0 cuda-tools-11-1\n", + " cuda-visual-tools-10-0 cuda-visual-tools-10-1 cuda-visual-tools-11-0\n", + " cuda-visual-tools-11-1 default-jre dkms freeglut3 freeglut3-dev\n", + " keyboard-configuration libargon2-0 libcap2 libcryptsetup12\n", + " libdevmapper1.02.1 libfontenc1 libidn11 libip4tc0 libjansson4\n", + " libnvidia-cfg1-510 libnvidia-common-460 libnvidia-common-510\n", + " libnvidia-extra-510 libnvidia-fbc1-510 libnvidia-gl-510 libpam-systemd\n", + " libpolkit-agent-1-0 libpolkit-backend-1-0 libpolkit-gobject-1-0 libxfont2\n", + " libxi-dev libxkbfile1 libxmu-dev libxmu-headers libxnvctrl0 libxtst6\n", + " nsight-compute-2020.2.1 nsight-compute-2022.1.0 nsight-systems-2020.3.2\n", + " nsight-systems-2020.3.4 nsight-systems-2021.5.2 nvidia-dkms-510\n", + " nvidia-kernel-common-510 nvidia-kernel-source-510 nvidia-modprobe\n", + " nvidia-settings openjdk-11-jre policykit-1 policykit-1-gnome python3-xkit\n", + " screen-resolution-extra systemd systemd-sysv udev x11-xkb-utils\n", + " xserver-common xserver-xorg-core-hwe-18.04 xserver-xorg-video-nvidia-510\n", + "Use 'apt autoremove' to remove them.\n", + "The following NEW packages will be installed:\n", + " tree\n", + "0 upgraded, 1 newly installed, 0 to remove and 39 not upgraded.\n", + "Need to get 40.7 kB of archives.\n", + "After this operation, 105 kB of additional disk space will be used.\n", + "Get:1 http://archive.ubuntu.com/ubuntu bionic/universe amd64 tree amd64 1.7.0-5 [40.7 kB]\n", + "Fetched 40.7 kB in 0s (146 kB/s)\n", + "Selecting previously unselected package tree.\n", + "(Reading database ... 155113 files and directories currently installed.)\n", + "Preparing to unpack .../tree_1.7.0-5_amd64.deb ...\n", + "Unpacking tree (1.7.0-5) ...\n", + "Setting up tree (1.7.0-5) ...\n", + "Processing triggers for man-db (2.8.3-2ubuntu0.1) ...\n", + "kitti_tiny\n", + "├── training\n", + "│   ├── image_2\n", + "│   │   ├── 000000.jpeg\n", + "│   │   ├── 000001.jpeg\n", + "│   │   ├── 000002.jpeg\n", + "│   │   ├── 000003.jpeg\n", + "│   │   ├── 000004.jpeg\n", + "│   │   ├── 000005.jpeg\n", + "│   │   ├── 000006.jpeg\n", + "│   │   ├── 000007.jpeg\n", + "│   │   ├── 000008.jpeg\n", + "│   │   ├── 000009.jpeg\n", + "│   │   ├── 000010.jpeg\n", + "│   │   ├── 000011.jpeg\n", + "│   │   ├── 000012.jpeg\n", + "│   │   ├── 000013.jpeg\n", + "│   │   ├── 000014.jpeg\n", + "│   │   ├── 000015.jpeg\n", + "│   │   ├── 000016.jpeg\n", + "│   │   ├── 000017.jpeg\n", + "│   │   ├── 000018.jpeg\n", + "│   │   ├── 000019.jpeg\n", + "│   │   ├── 000020.jpeg\n", + "│   │   ├── 000021.jpeg\n", + "│   │   ├── 000022.jpeg\n", + "│   │   ├── 000023.jpeg\n", + "│   │   ├── 000024.jpeg\n", + "│   │   ├── 000025.jpeg\n", + "│   │   ├── 000026.jpeg\n", + "│   │   ├── 000027.jpeg\n", + "│   │   ├── 000028.jpeg\n", + "│   │   ├── 000029.jpeg\n", + "│   │   ├── 000030.jpeg\n", + "│   │   ├── 000031.jpeg\n", + "│   │   ├── 000032.jpeg\n", + "│   │   ├── 000033.jpeg\n", + "│   │   ├── 000034.jpeg\n", + "│   │   ├── 000035.jpeg\n", + "│   │   ├── 000036.jpeg\n", + "│   │   ├── 000037.jpeg\n", + "│   │   ├── 000038.jpeg\n", + "│   │   ├── 000039.jpeg\n", + "│   │   ├── 000040.jpeg\n", + "│   │   ├── 000041.jpeg\n", + "│   │   ├── 000042.jpeg\n", + "│   │   ├── 000043.jpeg\n", + "│   │   ├── 000044.jpeg\n", + "│   │   ├── 000045.jpeg\n", + "│   │   ├── 000046.jpeg\n", + "│   │   ├── 000047.jpeg\n", + "│   │   ├── 000048.jpeg\n", + "│   │   ├── 000049.jpeg\n", + "│   │   ├── 000050.jpeg\n", + "│   │   ├── 000051.jpeg\n", + "│   │   ├── 000052.jpeg\n", + "│   │   ├── 000053.jpeg\n", + "│   │   ├── 000054.jpeg\n", + "│   │   ├── 000055.jpeg\n", + "│   │   ├── 000056.jpeg\n", + "│   │   ├── 000057.jpeg\n", + "│   │   ├── 000058.jpeg\n", + "│   │   ├── 000059.jpeg\n", + "│   │   ├── 000060.jpeg\n", + "│   │   ├── 000061.jpeg\n", + "│   │   ├── 000062.jpeg\n", + "│   │   ├── 000063.jpeg\n", + "│   │   ├── 000064.jpeg\n", + "│   │   ├── 000065.jpeg\n", + "│   │   ├── 000066.jpeg\n", + "│   │   ├── 000067.jpeg\n", + "│   │   ├── 000068.jpeg\n", + "│   │   ├── 000069.jpeg\n", + "│   │   ├── 000070.jpeg\n", + "│   │   ├── 000071.jpeg\n", + "│   │   ├── 000072.jpeg\n", + "│   │   ├── 000073.jpeg\n", + "│   │   └── 000074.jpeg\n", + "│   └── label_2\n", + "│   ├── 000000.txt\n", + "│   ├── 000001.txt\n", + "│   ├── 000002.txt\n", + "│   ├── 000003.txt\n", + "│   ├── 000004.txt\n", + "│   ├── 000005.txt\n", + "│   ├── 000006.txt\n", + "│   ├── 000007.txt\n", + "│   ├── 000008.txt\n", + "│   ├── 000009.txt\n", + "│   ├── 000010.txt\n", + "│   ├── 000011.txt\n", + "│   ├── 000012.txt\n", + "│   ├── 000013.txt\n", + "│   ├── 000014.txt\n", + "│   ├── 000015.txt\n", + "│   ├── 000016.txt\n", + "│   ├── 000017.txt\n", + "│   ├── 000018.txt\n", + "│   ├── 000019.txt\n", + "│   ├── 000020.txt\n", + "│   ├── 000021.txt\n", + "│   ├── 000022.txt\n", + "│   ├── 000023.txt\n", + "│   ├── 000024.txt\n", + "│   ├── 000025.txt\n", + "│   ├── 000026.txt\n", + "│   ├── 000027.txt\n", + "│   ├── 000028.txt\n", + "│   ├── 000029.txt\n", + "│   ├── 000030.txt\n", + "│   ├── 000031.txt\n", + "│   ├── 000032.txt\n", + "│   ├── 000033.txt\n", + "│   ├── 000034.txt\n", + "│   ├── 000035.txt\n", + "│   ├── 000036.txt\n", + "│   ├── 000037.txt\n", + "│   ├── 000038.txt\n", + "│   ├── 000039.txt\n", + "│   ├── 000040.txt\n", + "│   ├── 000041.txt\n", + "│   ├── 000042.txt\n", + "│   ├── 000043.txt\n", + "│   ├── 000044.txt\n", + "│   ├── 000045.txt\n", + "│   ├── 000046.txt\n", + "│   ├── 000047.txt\n", + "│   ├── 000048.txt\n", + "│   ├── 000049.txt\n", + "│   ├── 000050.txt\n", + "│   ├── 000051.txt\n", + "│   ├── 000052.txt\n", + "│   ├── 000053.txt\n", + "│   ├── 000054.txt\n", + "│   ├── 000055.txt\n", + "│   ├── 000056.txt\n", + "│   ├── 000057.txt\n", + "│   ├── 000058.txt\n", + "│   ├── 000059.txt\n", + "│   ├── 000060.txt\n", + "│   ├── 000061.txt\n", + "│   ├── 000062.txt\n", + "│   ├── 000063.txt\n", + "│   ├── 000064.txt\n", + "│   ├── 000065.txt\n", + "│   ├── 000066.txt\n", + "│   ├── 000067.txt\n", + "│   ├── 000068.txt\n", + "│   ├── 000069.txt\n", + "│   ├── 000070.txt\n", + "│   ├── 000071.txt\n", + "│   ├── 000072.txt\n", + "│   ├── 000073.txt\n", + "│   └── 000074.txt\n", + "├── train.txt\n", + "└── val.txt\n", + "\n", + "3 directories, 152 files\n" + ] + } + ], + "source": [ + "# Check the directory structure of the tiny data\n", + "\n", + "# Install tree first\n", + "!apt-get -q install tree\n", + "!tree kitti_tiny" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 304 + }, + "id": "YnQQqzOWzE91", + "outputId": "baf6a89b-dbb2-4212-9e34-7055a9e2574c" + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Let's take a look at the dataset image\n", + "import mmcv\n", + "import matplotlib.pyplot as plt\n", + "\n", + "img = mmcv.imread('kitti_tiny/training/image_2/000073.jpeg')\n", + "plt.figure(figsize=(15, 10))\n", + "plt.imshow(mmcv.bgr2rgb(img))\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PMZvtSIl71qi" + }, + "source": [ + "After downloading the data, we need to implement a function to convert the KITTI annotation format into the middle format. In this tutorial, we choose to convert them in **`load_annotations`** function in a newly implemented **`KittiTinyDataset`**.\n", + "\n", + "Let's take a look at the annotation txt file.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "n7rwalnPd6e1", + "outputId": "54bfbfa4-463b-45a0-f77c-a80557c1bd69" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Pedestrian 0.00 0 -0.20 712.40 143.00 810.73 307.92 1.89 0.48 1.20 1.84 1.47 8.41 0.01\n" + ] + } + ], + "source": [ + "# Check the label of a single image\n", + "!cat kitti_tiny/training/label_2/000000.txt" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "QA1pFg-FeO3l" + }, + "source": [ + "According to the KITTI's documentation, the first column indicates the class of the object, and the 5th to 8th columns indicate the bboxes. We need to read annotations of each image and convert them into middle format that MMDetection can accept, as follows:\n", + "\n", + "```python\n", + "[\n", + " {\n", + " 'filename': 'a.jpg',\n", + " 'width': 1280,\n", + " 'height': 720,\n", + " 'ann': {\n", + " 'bboxes': (n, 4) in (x1, y1, x2, y2) order,\n", + " 'labels': (n, ),\n", + " 'bboxes_ignore': (k, 4), (optional field)\n", + " 'labels_ignore': (k, 4) (optional field)\n", + " }\n", + " },\n", + " ...\n", + "]\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "id": "GdSaB2ad0EdX" + }, + "outputs": [], + "source": [ + "import copy\n", + "import os.path as osp\n", + "\n", + "import mmcv\n", + "import numpy as np\n", + "\n", + "from mmdet.datasets.builder import DATASETS\n", + "from mmdet.datasets.custom import CustomDataset\n", + "\n", + "@DATASETS.register_module()\n", + "class KittiTinyDataset(CustomDataset):\n", + "\n", + " CLASSES = ('Car', 'Pedestrian', 'Cyclist')\n", + "\n", + " def load_annotations(self, ann_file):\n", + " cat2label = {k: i for i, k in enumerate(self.CLASSES)}\n", + " # load image list from file\n", + " image_list = mmcv.list_from_file(self.ann_file)\n", + " \n", + " data_infos = []\n", + " # convert annotations to middle format\n", + " for image_id in image_list:\n", + " filename = f'{self.img_prefix}/{image_id}.jpeg'\n", + " image = mmcv.imread(filename)\n", + " height, width = image.shape[:2]\n", + " \n", + " data_info = dict(filename=f'{image_id}.jpeg', width=width, height=height)\n", + " \n", + " # load annotations\n", + " label_prefix = self.img_prefix.replace('image_2', 'label_2')\n", + " lines = mmcv.list_from_file(osp.join(label_prefix, f'{image_id}.txt'))\n", + " \n", + " content = [line.strip().split(' ') for line in lines]\n", + " bbox_names = [x[0] for x in content]\n", + " bboxes = [[float(info) for info in x[4:8]] for x in content]\n", + " \n", + " gt_bboxes = []\n", + " gt_labels = []\n", + " gt_bboxes_ignore = []\n", + " gt_labels_ignore = []\n", + " \n", + " # filter 'DontCare'\n", + " for bbox_name, bbox in zip(bbox_names, bboxes):\n", + " if bbox_name in cat2label:\n", + " gt_labels.append(cat2label[bbox_name])\n", + " gt_bboxes.append(bbox)\n", + " else:\n", + " gt_labels_ignore.append(-1)\n", + " gt_bboxes_ignore.append(bbox)\n", + "\n", + " data_anno = dict(\n", + " bboxes=np.array(gt_bboxes, dtype=np.float32).reshape(-1, 4),\n", + " labels=np.array(gt_labels, dtype=np.long),\n", + " bboxes_ignore=np.array(gt_bboxes_ignore,\n", + " dtype=np.float32).reshape(-1, 4),\n", + " labels_ignore=np.array(gt_labels_ignore, dtype=np.long))\n", + "\n", + " data_info.update(ann=data_anno)\n", + " data_infos.append(data_info)\n", + "\n", + " return data_infos" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PwqJOpBe-bMj" + }, + "source": [ + "### Modify the config\n", + "\n", + "In the next step, we need to modify the config for the training.\n", + "To accelerate the process, we finetune a detector using a pre-trained detector." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "id": "hamZrlnH-YDD" + }, + "outputs": [], + "source": [ + "from mmcv import Config\n", + "cfg = Config.fromfile('./configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HntziLGq-92Z" + }, + "source": [ + "Given a config that trains a Faster R-CNN on COCO dataset, we need to modify some values to use it for training Faster R-CNN on KITTI dataset. We modify the config of datasets, learning rate schedules, and runtime settings." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "pUbwD8uV0PR8", + "outputId": "76e68abb-6b42-488f-cbca-6da39e094943" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Config:\n", + "model = dict(\n", + " type='FasterRCNN',\n", + " backbone=dict(\n", + " type='ResNet',\n", + " depth=50,\n", + " num_stages=4,\n", + " out_indices=(0, 1, 2, 3),\n", + " frozen_stages=1,\n", + " norm_cfg=dict(type='BN', requires_grad=False),\n", + " norm_eval=True,\n", + " style='caffe',\n", + " init_cfg=dict(\n", + " type='Pretrained',\n", + " checkpoint='open-mmlab://detectron2/resnet50_caffe')),\n", + " neck=dict(\n", + " type='FPN',\n", + " in_channels=[256, 512, 1024, 2048],\n", + " out_channels=256,\n", + " num_outs=5),\n", + " rpn_head=dict(\n", + " type='RPNHead',\n", + " in_channels=256,\n", + " feat_channels=256,\n", + " anchor_generator=dict(\n", + " type='AnchorGenerator',\n", + " scales=[8],\n", + " ratios=[0.5, 1.0, 2.0],\n", + " strides=[4, 8, 16, 32, 64]),\n", + " bbox_coder=dict(\n", + " type='DeltaXYWHBBoxCoder',\n", + " target_means=[0.0, 0.0, 0.0, 0.0],\n", + " target_stds=[1.0, 1.0, 1.0, 1.0]),\n", + " loss_cls=dict(\n", + " type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0),\n", + " loss_bbox=dict(type='L1Loss', loss_weight=1.0)),\n", + " roi_head=dict(\n", + " type='StandardRoIHead',\n", + " bbox_roi_extractor=dict(\n", + " type='SingleRoIExtractor',\n", + " roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0),\n", + " out_channels=256,\n", + " featmap_strides=[4, 8, 16, 32]),\n", + " bbox_head=dict(\n", + " type='Shared2FCBBoxHead',\n", + " in_channels=256,\n", + " fc_out_channels=1024,\n", + " roi_feat_size=7,\n", + " num_classes=3,\n", + " bbox_coder=dict(\n", + " type='DeltaXYWHBBoxCoder',\n", + " target_means=[0.0, 0.0, 0.0, 0.0],\n", + " target_stds=[0.1, 0.1, 0.2, 0.2]),\n", + " reg_class_agnostic=False,\n", + " loss_cls=dict(\n", + " type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0),\n", + " loss_bbox=dict(type='L1Loss', loss_weight=1.0))),\n", + " train_cfg=dict(\n", + " rpn=dict(\n", + " assigner=dict(\n", + " type='MaxIoUAssigner',\n", + " pos_iou_thr=0.7,\n", + " neg_iou_thr=0.3,\n", + " min_pos_iou=0.3,\n", + " match_low_quality=True,\n", + " ignore_iof_thr=-1),\n", + " sampler=dict(\n", + " type='RandomSampler',\n", + " num=256,\n", + " pos_fraction=0.5,\n", + " neg_pos_ub=-1,\n", + " add_gt_as_proposals=False),\n", + " allowed_border=-1,\n", + " pos_weight=-1,\n", + " debug=False),\n", + " rpn_proposal=dict(\n", + " nms_pre=2000,\n", + " max_per_img=1000,\n", + " nms=dict(type='nms', iou_threshold=0.7),\n", + " min_bbox_size=0),\n", + " rcnn=dict(\n", + " assigner=dict(\n", + " type='MaxIoUAssigner',\n", + " pos_iou_thr=0.5,\n", + " neg_iou_thr=0.5,\n", + " min_pos_iou=0.5,\n", + " match_low_quality=False,\n", + " ignore_iof_thr=-1),\n", + " sampler=dict(\n", + " type='RandomSampler',\n", + " num=512,\n", + " pos_fraction=0.25,\n", + " neg_pos_ub=-1,\n", + " add_gt_as_proposals=True),\n", + " pos_weight=-1,\n", + " debug=False)),\n", + " test_cfg=dict(\n", + " rpn=dict(\n", + " nms_pre=1000,\n", + " max_per_img=1000,\n", + " nms=dict(type='nms', iou_threshold=0.7),\n", + " min_bbox_size=0),\n", + " rcnn=dict(\n", + " score_thr=0.05,\n", + " nms=dict(type='nms', iou_threshold=0.5),\n", + " max_per_img=100)))\n", + "dataset_type = 'KittiTinyDataset'\n", + "data_root = 'kitti_tiny/'\n", + "img_norm_cfg = dict(\n", + " mean=[103.53, 116.28, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False)\n", + "train_pipeline = [\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='LoadAnnotations', with_bbox=True),\n", + " dict(\n", + " type='Resize',\n", + " img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736),\n", + " (1333, 768), (1333, 800)],\n", + " multiscale_mode='value',\n", + " keep_ratio=True),\n", + " dict(type='RandomFlip', flip_ratio=0.5),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[103.53, 116.28, 123.675],\n", + " std=[1.0, 1.0, 1.0],\n", + " to_rgb=False),\n", + " dict(type='Pad', size_divisor=32),\n", + " dict(type='DefaultFormatBundle'),\n", + " dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels'])\n", + "]\n", + "test_pipeline = [\n", + " dict(type='LoadImageFromFile'),\n", + " dict(\n", + " type='MultiScaleFlipAug',\n", + " img_scale=(1333, 800),\n", + " flip=False,\n", + " transforms=[\n", + " dict(type='Resize', keep_ratio=True),\n", + " dict(type='RandomFlip'),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[103.53, 116.28, 123.675],\n", + " std=[1.0, 1.0, 1.0],\n", + " to_rgb=False),\n", + " dict(type='Pad', size_divisor=32),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='Collect', keys=['img'])\n", + " ])\n", + "]\n", + "data = dict(\n", + " samples_per_gpu=2,\n", + " workers_per_gpu=2,\n", + " train=dict(\n", + " type='KittiTinyDataset',\n", + " ann_file='train.txt',\n", + " img_prefix='training/image_2',\n", + " pipeline=[\n", + " dict(type='LoadImageFromFile'),\n", + " dict(type='LoadAnnotations', with_bbox=True),\n", + " dict(\n", + " type='Resize',\n", + " img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736),\n", + " (1333, 768), (1333, 800)],\n", + " multiscale_mode='value',\n", + " keep_ratio=True),\n", + " dict(type='RandomFlip', flip_ratio=0.5),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[103.53, 116.28, 123.675],\n", + " std=[1.0, 1.0, 1.0],\n", + " to_rgb=False),\n", + " dict(type='Pad', size_divisor=32),\n", + " dict(type='DefaultFormatBundle'),\n", + " dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels'])\n", + " ],\n", + " data_root='kitti_tiny/'),\n", + " val=dict(\n", + " type='KittiTinyDataset',\n", + " ann_file='val.txt',\n", + " img_prefix='training/image_2',\n", + " pipeline=[\n", + " dict(type='LoadImageFromFile'),\n", + " dict(\n", + " type='MultiScaleFlipAug',\n", + " img_scale=(1333, 800),\n", + " flip=False,\n", + " transforms=[\n", + " dict(type='Resize', keep_ratio=True),\n", + " dict(type='RandomFlip'),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[103.53, 116.28, 123.675],\n", + " std=[1.0, 1.0, 1.0],\n", + " to_rgb=False),\n", + " dict(type='Pad', size_divisor=32),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='Collect', keys=['img'])\n", + " ])\n", + " ],\n", + " data_root='kitti_tiny/'),\n", + " test=dict(\n", + " type='KittiTinyDataset',\n", + " ann_file='train.txt',\n", + " img_prefix='training/image_2',\n", + " pipeline=[\n", + " dict(type='LoadImageFromFile'),\n", + " dict(\n", + " type='MultiScaleFlipAug',\n", + " img_scale=(1333, 800),\n", + " flip=False,\n", + " transforms=[\n", + " dict(type='Resize', keep_ratio=True),\n", + " dict(type='RandomFlip'),\n", + " dict(\n", + " type='Normalize',\n", + " mean=[103.53, 116.28, 123.675],\n", + " std=[1.0, 1.0, 1.0],\n", + " to_rgb=False),\n", + " dict(type='Pad', size_divisor=32),\n", + " dict(type='ImageToTensor', keys=['img']),\n", + " dict(type='Collect', keys=['img'])\n", + " ])\n", + " ],\n", + " data_root='kitti_tiny/'))\n", + "evaluation = dict(interval=12, metric='mAP')\n", + "optimizer = dict(type='SGD', lr=0.0025, momentum=0.9, weight_decay=0.0001)\n", + "optimizer_config = dict(grad_clip=None)\n", + "lr_config = dict(\n", + " policy='step',\n", + " warmup=None,\n", + " warmup_iters=500,\n", + " warmup_ratio=0.001,\n", + " step=[8, 11])\n", + "runner = dict(type='EpochBasedRunner', max_epochs=12)\n", + "checkpoint_config = dict(interval=12)\n", + "log_config = dict(\n", + " interval=10,\n", + " hooks=[dict(type='TextLoggerHook'),\n", + " dict(type='TensorboardLoggerHook')])\n", + "custom_hooks = [dict(type='NumClassCheckHook')]\n", + "dist_params = dict(backend='nccl')\n", + "log_level = 'INFO'\n", + "load_from = 'checkpoints/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210526_095054-1f77628b.pth'\n", + "resume_from = None\n", + "workflow = [('train', 1)]\n", + "opencv_num_threads = 0\n", + "mp_start_method = 'fork'\n", + "work_dir = './tutorial_exps'\n", + "seed = 0\n", + "gpu_ids = range(0, 1)\n", + "\n" + ] + } + ], + "source": [ + "from mmdet.apis import set_random_seed\n", + "\n", + "# Modify dataset type and path\n", + "cfg.dataset_type = 'KittiTinyDataset'\n", + "cfg.data_root = 'kitti_tiny/'\n", + "\n", + "cfg.data.test.type = 'KittiTinyDataset'\n", + "cfg.data.test.data_root = 'kitti_tiny/'\n", + "cfg.data.test.ann_file = 'train.txt'\n", + "cfg.data.test.img_prefix = 'training/image_2'\n", + "\n", + "cfg.data.train.type = 'KittiTinyDataset'\n", + "cfg.data.train.data_root = 'kitti_tiny/'\n", + "cfg.data.train.ann_file = 'train.txt'\n", + "cfg.data.train.img_prefix = 'training/image_2'\n", + "\n", + "cfg.data.val.type = 'KittiTinyDataset'\n", + "cfg.data.val.data_root = 'kitti_tiny/'\n", + "cfg.data.val.ann_file = 'val.txt'\n", + "cfg.data.val.img_prefix = 'training/image_2'\n", + "\n", + "# modify num classes of the model in box head\n", + "cfg.model.roi_head.bbox_head.num_classes = 3\n", + "# If we need to finetune a model based on a pre-trained detector, we need to\n", + "# use load_from to set the path of checkpoints.\n", + "cfg.load_from = 'checkpoints/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210526_095054-1f77628b.pth'\n", + "\n", + "# Set up working dir to save files and logs.\n", + "cfg.work_dir = './tutorial_exps'\n", + "\n", + "# The original learning rate (LR) is set for 8-GPU training.\n", + "# We divide it by 8 since we only use one GPU.\n", + "cfg.optimizer.lr = 0.02 / 8\n", + "cfg.lr_config.warmup = None\n", + "cfg.log_config.interval = 10\n", + "\n", + "# Change the evaluation metric since we use customized dataset.\n", + "cfg.evaluation.metric = 'mAP'\n", + "# We can set the evaluation interval to reduce the evaluation times\n", + "cfg.evaluation.interval = 12\n", + "# We can set the checkpoint saving interval to reduce the storage cost\n", + "cfg.checkpoint_config.interval = 12\n", + "\n", + "# Set seed thus the results are more reproducible\n", + "cfg.seed = 0\n", + "set_random_seed(0, deterministic=False)\n", + "cfg.device = 'cuda'\n", + "cfg.gpu_ids = range(1)\n", + "\n", + "# We can also use tensorboard to log the training process\n", + "cfg.log_config.hooks = [\n", + " dict(type='TextLoggerHook'),\n", + " dict(type='TensorboardLoggerHook')]\n", + "\n", + "\n", + "# We can initialize the logger for training and have a look\n", + "# at the final config used for training\n", + "print(f'Config:\\n{cfg.pretty_text}')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "111W_oZV_3wa" + }, + "source": [ + "### Train a new detector\n", + "\n", + "Finally, lets initialize the dataset and detector, then train a new detector! We use the high-level API `train_detector` implemented by MMDetection. This is also used in our training scripts. For details of the implementation, please see [here](https://github.com/open-mmlab/mmdetection/blob/master/mmdet/apis/train.py)." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "7WBWHu010PN3", + "outputId": "a7646284-f909-46d6-a360-22160daeb1cc" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/content/mmdetection/mmdet/datasets/custom.py:180: UserWarning: CustomDataset does not support filtering empty gt images.\n", + " 'CustomDataset does not support filtering empty gt images.')\n", + "2022-02-08 11:38:22,273 - mmdet - INFO - load checkpoint from local path: checkpoints/faster_rcnn_r50_caffe_fpn_mstrain_3x_coco_20210526_095054-1f77628b.pth\n", + "2022-02-08 11:38:22,406 - mmdet - WARNING - The model and loaded state dict do not match exactly\n", + "\n", + "size mismatch for roi_head.bbox_head.fc_cls.weight: copying a param with shape torch.Size([81, 1024]) from checkpoint, the shape in current model is torch.Size([4, 1024]).\n", + "size mismatch for roi_head.bbox_head.fc_cls.bias: copying a param with shape torch.Size([81]) from checkpoint, the shape in current model is torch.Size([4]).\n", + "size mismatch for roi_head.bbox_head.fc_reg.weight: copying a param with shape torch.Size([320, 1024]) from checkpoint, the shape in current model is torch.Size([12, 1024]).\n", + "size mismatch for roi_head.bbox_head.fc_reg.bias: copying a param with shape torch.Size([320]) from checkpoint, the shape in current model is torch.Size([12]).\n", + "2022-02-08 11:38:22,410 - mmdet - INFO - Start running, host: root@503df4019aac, work_dir: /content/mmdetection/tutorial_exps\n", + "2022-02-08 11:38:22,412 - mmdet - INFO - Hooks will be executed in the following order:\n", + "before_run:\n", + "(VERY_HIGH ) StepLrUpdaterHook \n", + "(NORMAL ) CheckpointHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + "(VERY_LOW ) TensorboardLoggerHook \n", + " -------------------- \n", + "before_train_epoch:\n", + "(VERY_HIGH ) StepLrUpdaterHook \n", + "(NORMAL ) NumClassCheckHook \n", + "(LOW ) IterTimerHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + "(VERY_LOW ) TensorboardLoggerHook \n", + " -------------------- \n", + "before_train_iter:\n", + "(VERY_HIGH ) StepLrUpdaterHook \n", + "(LOW ) IterTimerHook \n", + "(LOW ) EvalHook \n", + " -------------------- \n", + "after_train_iter:\n", + "(ABOVE_NORMAL) OptimizerHook \n", + "(NORMAL ) CheckpointHook \n", + "(LOW ) IterTimerHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + "(VERY_LOW ) TensorboardLoggerHook \n", + " -------------------- \n", + "after_train_epoch:\n", + "(NORMAL ) CheckpointHook \n", + "(LOW ) EvalHook \n", + "(VERY_LOW ) TextLoggerHook \n", + "(VERY_LOW ) TensorboardLoggerHook \n", + " -------------------- \n", + "before_val_epoch:\n", + "(NORMAL ) NumClassCheckHook \n", + "(LOW ) IterTimerHook \n", + "(VERY_LOW ) TextLoggerHook \n", + "(VERY_LOW ) TensorboardLoggerHook \n", + " -------------------- \n", + "before_val_iter:\n", + "(LOW ) IterTimerHook \n", + " -------------------- \n", + "after_val_iter:\n", + "(LOW ) IterTimerHook \n", + " -------------------- \n", + "after_val_epoch:\n", + "(VERY_LOW ) TextLoggerHook \n", + "(VERY_LOW ) TensorboardLoggerHook \n", + " -------------------- \n", + "after_run:\n", + "(VERY_LOW ) TextLoggerHook \n", + "(VERY_LOW ) TensorboardLoggerHook \n", + " -------------------- \n", + "2022-02-08 11:38:22,414 - mmdet - INFO - workflow: [('train', 1)], max: 12 epochs\n", + "2022-02-08 11:38:22,417 - mmdet - INFO - Checkpoints will be saved to /content/mmdetection/tutorial_exps by HardDiskBackend.\n", + "2022-02-08 11:38:35,245 - mmdet - INFO - Epoch [1][10/25]\tlr: 2.500e-03, eta: 0:03:51, time: 0.799, data_time: 0.231, memory: 2455, loss_rpn_cls: 0.0254, loss_rpn_bbox: 0.0173, loss_cls: 0.5374, acc: 81.6309, loss_bbox: 0.3946, loss: 0.9746\n", + "2022-02-08 11:38:38,778 - mmdet - INFO - Epoch [1][20/25]\tlr: 2.500e-03, eta: 0:02:41, time: 0.353, data_time: 0.024, memory: 2455, loss_rpn_cls: 0.0158, loss_rpn_bbox: 0.0119, loss_cls: 0.1778, acc: 93.3789, loss_bbox: 0.3290, loss: 0.5344\n", + "2022-02-08 11:38:46,422 - mmdet - INFO - Epoch [2][10/25]\tlr: 2.500e-03, eta: 0:02:10, time: 0.576, data_time: 0.230, memory: 2456, loss_rpn_cls: 0.0203, loss_rpn_bbox: 0.0139, loss_cls: 0.1573, acc: 94.4824, loss_bbox: 0.2689, loss: 0.4603\n", + "2022-02-08 11:38:50,015 - mmdet - INFO - Epoch [2][20/25]\tlr: 2.500e-03, eta: 0:01:58, time: 0.360, data_time: 0.023, memory: 2456, loss_rpn_cls: 0.0127, loss_rpn_bbox: 0.0127, loss_cls: 0.1446, acc: 94.6777, loss_bbox: 0.2154, loss: 0.3854\n", + "2022-02-08 11:38:57,686 - mmdet - INFO - Epoch [3][10/25]\tlr: 2.500e-03, eta: 0:01:46, time: 0.575, data_time: 0.226, memory: 2456, loss_rpn_cls: 0.0064, loss_rpn_bbox: 0.0104, loss_cls: 0.0943, acc: 96.5039, loss_bbox: 0.1586, loss: 0.2697\n", + "2022-02-08 11:39:01,390 - mmdet - INFO - Epoch [3][20/25]\tlr: 2.500e-03, eta: 0:01:39, time: 0.370, data_time: 0.024, memory: 2456, loss_rpn_cls: 0.0072, loss_rpn_bbox: 0.0132, loss_cls: 0.1439, acc: 94.6191, loss_bbox: 0.2597, loss: 0.4242\n", + "2022-02-08 11:39:09,266 - mmdet - INFO - Epoch [4][10/25]\tlr: 2.500e-03, eta: 0:01:31, time: 0.590, data_time: 0.228, memory: 2456, loss_rpn_cls: 0.0057, loss_rpn_bbox: 0.0134, loss_cls: 0.1181, acc: 95.4199, loss_bbox: 0.2243, loss: 0.3616\n", + "2022-02-08 11:39:13,065 - mmdet - INFO - Epoch [4][20/25]\tlr: 2.500e-03, eta: 0:01:26, time: 0.379, data_time: 0.024, memory: 2456, loss_rpn_cls: 0.0050, loss_rpn_bbox: 0.0117, loss_cls: 0.1196, acc: 95.4004, loss_bbox: 0.2120, loss: 0.3484\n", + "2022-02-08 11:39:20,854 - mmdet - INFO - Epoch [5][10/25]\tlr: 2.500e-03, eta: 0:01:19, time: 0.582, data_time: 0.228, memory: 2456, loss_rpn_cls: 0.0028, loss_rpn_bbox: 0.0091, loss_cls: 0.1021, acc: 96.1719, loss_bbox: 0.2075, loss: 0.3216\n", + "2022-02-08 11:39:24,557 - mmdet - INFO - Epoch [5][20/25]\tlr: 2.500e-03, eta: 0:01:14, time: 0.369, data_time: 0.023, memory: 2456, loss_rpn_cls: 0.0030, loss_rpn_bbox: 0.0106, loss_cls: 0.0942, acc: 96.6309, loss_bbox: 0.1926, loss: 0.3003\n", + "2022-02-08 11:39:32,255 - mmdet - INFO - Epoch [6][10/25]\tlr: 2.500e-03, eta: 0:01:07, time: 0.576, data_time: 0.226, memory: 2456, loss_rpn_cls: 0.0025, loss_rpn_bbox: 0.0081, loss_cls: 0.0787, acc: 97.2363, loss_bbox: 0.1827, loss: 0.2721\n", + "2022-02-08 11:39:35,900 - mmdet - INFO - Epoch [6][20/25]\tlr: 2.500e-03, eta: 0:01:02, time: 0.364, data_time: 0.023, memory: 2456, loss_rpn_cls: 0.0035, loss_rpn_bbox: 0.0100, loss_cls: 0.0901, acc: 96.5332, loss_bbox: 0.1857, loss: 0.2893\n", + "2022-02-08 11:39:43,555 - mmdet - INFO - Epoch [7][10/25]\tlr: 2.500e-03, eta: 0:00:56, time: 0.576, data_time: 0.228, memory: 2456, loss_rpn_cls: 0.0023, loss_rpn_bbox: 0.0093, loss_cls: 0.0877, acc: 96.7383, loss_bbox: 0.1736, loss: 0.2730\n", + "2022-02-08 11:39:47,186 - mmdet - INFO - Epoch [7][20/25]\tlr: 2.500e-03, eta: 0:00:52, time: 0.362, data_time: 0.024, memory: 2456, loss_rpn_cls: 0.0040, loss_rpn_bbox: 0.0112, loss_cls: 0.0889, acc: 96.6699, loss_bbox: 0.1800, loss: 0.2840\n", + "2022-02-08 11:39:54,874 - mmdet - INFO - Epoch [8][10/25]\tlr: 2.500e-03, eta: 0:00:46, time: 0.575, data_time: 0.227, memory: 2456, loss_rpn_cls: 0.0020, loss_rpn_bbox: 0.0094, loss_cls: 0.0748, acc: 97.0801, loss_bbox: 0.1381, loss: 0.2243\n", + "2022-02-08 11:39:58,511 - mmdet - INFO - Epoch [8][20/25]\tlr: 2.500e-03, eta: 0:00:41, time: 0.364, data_time: 0.025, memory: 2456, loss_rpn_cls: 0.0031, loss_rpn_bbox: 0.0081, loss_cls: 0.0743, acc: 97.0801, loss_bbox: 0.1635, loss: 0.2489\n", + "2022-02-08 11:40:06,228 - mmdet - INFO - Epoch [9][10/25]\tlr: 2.500e-04, eta: 0:00:35, time: 0.577, data_time: 0.227, memory: 2456, loss_rpn_cls: 0.0024, loss_rpn_bbox: 0.0085, loss_cls: 0.0649, acc: 97.5781, loss_bbox: 0.1307, loss: 0.2065\n", + "2022-02-08 11:40:09,873 - mmdet - INFO - Epoch [9][20/25]\tlr: 2.500e-04, eta: 0:00:31, time: 0.365, data_time: 0.025, memory: 2456, loss_rpn_cls: 0.0010, loss_rpn_bbox: 0.0066, loss_cls: 0.0530, acc: 97.9199, loss_bbox: 0.1090, loss: 0.1695\n", + "2022-02-08 11:40:17,597 - mmdet - INFO - Epoch [10][10/25]\tlr: 2.500e-04, eta: 0:00:25, time: 0.579, data_time: 0.227, memory: 2456, loss_rpn_cls: 0.0041, loss_rpn_bbox: 0.0084, loss_cls: 0.0676, acc: 97.3633, loss_bbox: 0.1367, loss: 0.2168\n", + "2022-02-08 11:40:21,269 - mmdet - INFO - Epoch [10][20/25]\tlr: 2.500e-04, eta: 0:00:21, time: 0.367, data_time: 0.025, memory: 2456, loss_rpn_cls: 0.0008, loss_rpn_bbox: 0.0055, loss_cls: 0.0593, acc: 97.7246, loss_bbox: 0.1277, loss: 0.1934\n", + "2022-02-08 11:40:29,010 - mmdet - INFO - Epoch [11][10/25]\tlr: 2.500e-04, eta: 0:00:15, time: 0.579, data_time: 0.228, memory: 2456, loss_rpn_cls: 0.0007, loss_rpn_bbox: 0.0072, loss_cls: 0.0618, acc: 97.5977, loss_bbox: 0.1196, loss: 0.1892\n", + "2022-02-08 11:40:32,714 - mmdet - INFO - Epoch [11][20/25]\tlr: 2.500e-04, eta: 0:00:11, time: 0.370, data_time: 0.024, memory: 2456, loss_rpn_cls: 0.0011, loss_rpn_bbox: 0.0074, loss_cls: 0.0552, acc: 97.9297, loss_bbox: 0.1246, loss: 0.1883\n", + "2022-02-08 11:40:40,497 - mmdet - INFO - Epoch [12][10/25]\tlr: 2.500e-05, eta: 0:00:05, time: 0.583, data_time: 0.227, memory: 2456, loss_rpn_cls: 0.0010, loss_rpn_bbox: 0.0060, loss_cls: 0.0563, acc: 97.7637, loss_bbox: 0.1237, loss: 0.1871\n", + "2022-02-08 11:40:44,191 - mmdet - INFO - Epoch [12][20/25]\tlr: 2.500e-05, eta: 0:00:01, time: 0.369, data_time: 0.024, memory: 2456, loss_rpn_cls: 0.0013, loss_rpn_bbox: 0.0049, loss_cls: 0.0487, acc: 98.0273, loss_bbox: 0.0890, loss: 0.1439\n", + "2022-02-08 11:40:45,980 - mmdet - INFO - Saving checkpoint at 12 epochs\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 25/25, 9.7 task/s, elapsed: 3s, ETA: 0s\n", + "---------------iou_thr: 0.5---------------\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2022-02-08 11:40:51,306 - mmdet - INFO - \n", + "+------------+-----+------+--------+-------+\n", + "| class | gts | dets | recall | ap |\n", + "+------------+-----+------+--------+-------+\n", + "| Car | 62 | 129 | 0.968 | 0.869 |\n", + "| Pedestrian | 13 | 38 | 0.846 | 0.752 |\n", + "| Cyclist | 7 | 51 | 0.571 | 0.123 |\n", + "+------------+-----+------+--------+-------+\n", + "| mAP | | | | 0.581 |\n", + "+------------+-----+------+--------+-------+\n", + "2022-02-08 11:40:51,309 - mmdet - INFO - Epoch(val) [12][25]\tAP50: 0.5810, mAP: 0.5813\n" + ] + } + ], + "source": [ + "from mmdet.datasets import build_dataset\n", + "from mmdet.models import build_detector\n", + "from mmdet.apis import train_detector\n", + "\n", + "\n", + "# Build dataset\n", + "datasets = [build_dataset(cfg.data.train)]\n", + "\n", + "# Build the detector\n", + "model = build_detector(cfg.model)\n", + "# Add an attribute for visualization convenience\n", + "model.CLASSES = datasets[0].CLASSES\n", + "\n", + "# Create work_dir\n", + "mmcv.mkdir_or_exist(osp.abspath(cfg.work_dir))\n", + "train_detector(model, datasets, cfg, distributed=False, validate=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_vYQF5K2NqqI" + }, + "source": [ + "### Understand the log\n", + "From the log, we can have a basic understanding on the training process and know how well the detector is trained.\n", + "\n", + "First, since the dataset we are using is small, we loaded a pre-trained Faster R-CNN model and fine-tune it for detection. \n", + "The original Faster R-CNN is trained on COCO dataset that contains 80 classes but KITTI Tiny dataset only have 3 classes. Therefore, the last FC layers of the pre-trained Faster R-CNN for classification and regression have different weight shape and are not used.\n", + "\n", + "Second, after training, the detector is evaluated by the default VOC-style evaluation. The results show that the detector achieves 58.1 mAP on the val dataset, not bad!\n", + "\n", + "We can also check the tensorboard to see the curves." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 821, + "resources": { + "https://localhost:6006/?tensorboardColab=true": { + "data": "PCFkb2N0eXBlIGh0bWw+PG1ldGEgbmFtZT0idGItcmVsYXRpdmUtcm9vdCIgY29udGVudD0iLi8iPjwhZG9jdHlwZSBodG1sPjwhLS0KQGxpY2Vuc2UKQ29weXJpZ2h0IDIwMTkgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0+PGh0bWw+PGhlYWQ+PG1ldGEgY2hhcnNldD0idXRmLTgiPgo8dGl0bGU+VGVuc29yQm9hcmQ8L3RpdGxlPgo8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBTVFBQUFERUNBWUFBQURBcG81ckFBQUFCSE5DU1ZRSUNBZ0lmQWhraUFBQUFBbHdTRmx6QUFCYWJnQUFXbTRCeFdzak9BQUFBQmwwUlZoMFUyOW1kSGRoY21VQWQzZDNMbWx1YTNOallYQmxMbTl5WjV2dVBCb0FBQmwwU1VSQlZIaWM3WjE1ZUZUVjNjYy92NXNGQ1ZSeHFWdHB0VlcyVmx4ZjYxcXRpcTBMOUdsOU5YVUJGRXBGUlRJaGhCQURDVGRBTUFFa0NZc0s3cUI5K2tENzJxZkJXaXZxVzdWYTY3NGlyZTlyYXhYMWJaVldaVEhML040LzVnNEdTR0R1ekwxejc1MDVuMzg0ek13NTU4dk0vWEsyM3prSERJR2ppemhQRjNGZTBEb01JRUVMeUdkMFBvT3dhQUF1Y1Y1YWgwVzVWUEI2a0xyeUdXT0lBRkNiL3ZTakVxZ0crdXp3S3dnZHdDMTBVQ2ZWL0RzWWhmbUxNVVFXVVJ1TEVrWUQ4eEVPMnY3R2pvWndQc3hIV014aElFdWxsSzVzNnN4bmpDR3loQzdnSkpSVzRDU2daeFAwbkg0Smk1aVU4N2pmR2czR0VMNmpUUXdFNWdHamtXN2ZkK3FHU0xLV0lzcGtNbS83SU5QZ1lBemhFMnBUUWgrcXNLZ0MrZ0x1VGJCcmVpdXdtSFlhWkRxZmVpcllBQmhEZUk0cVFpTVhBd3NRRHZQQUJEMmxOeUxVczRuYnhTYWV1V3BERW1NSUQ5RWJPUUZvUlRodCs0ditHQ0w1NTdOQXVjUjRLaTNCaGwwd2h2QUFiZUFRTEd4Z0FtRDVhb0x1NmNTZml2QUxsRXFKOFk1TDZZYWRNSWJJQUxVcHBvaHJFV1lqN0wzOWpld2FJcG5lakxLUXZXbVVjV3hMNlI5ZzJBVmppRFRSdVl6Q29nWDRCcEE5RTNSUDkveiszNEdaVXNiS1hxUWJkb014aEV1MGdhTVJtbEhPOXZBQi82T1RPdGtEUXlUU3lpTW81UkxqdFo3K0hZYWVzWUlXRUJYVVpqK2RTeXZ3UE1yWkhoVzdFV0VpbjNFYVV6a1ZvUlQ0bXljbEMrZGc4Ykl1WmFYZXdvR2VsSmtIbUJaaUQ2aE5JVVdNUjJrQUR2Q29WZGlLc0pqNHJ1c0p1cHdTUHFNS3FFS2M5WXZleWttOXprMUFFd2ZTTEtXMFkrZ1ZZNGpkb1BXY2cwVUx3bEhiWDh6Y0VHc1J5bVRhN2xlY3RZbUJGRGtyM095d3hwMk9JWkxwRFFoVDVUb2UyRjNkK1l3eFJBL29IQVpCdDdCc2IxcUZGeW1nWENyZHhTVHBJczRFV2hDTzNhWE05TFdzbzRDWVhNTWJiclRrQThZUTNWQ2IvZ2lWeUU1aDJaa1o0aU9FT1J5ZWZ0U3EybGdNWURUS2ZPQWdqM1Ixb054Q0lYVXkwWVNaSnpHR3dIbmdMT2VCNnlrc083MEhML0hBaVhmN0duUVovV252d2JEcGF3U2NNUFA5VEpnNUdFT2dzMU1JeTNiL3NLMGpUa3hxL09tU2FDdURVQnFRN1R2dHZPald2WWhRTHRma2Q1aDUzaHBDYlJkaDJhay9WQnRRS3FTRzMzZ3F0aGUwbFhPQUZ1QW9EOWRFMWxKQW1mdzBQOFBNODg0UWFsTUN6clJtcW1IWmUzNlFOaUUwOFRuTlltZDNXbE50Q3RtWDhZZ3pMZHk3UmpmcFJKaDVFUTN5ay93S004OGJReWdJZFZ5TXhRTFVaVmgyNys5M290eUpNRk5xK0lmWG10MmdpOWlQUW1ZQjF5RVVibjhqTTNPOGgxTERSRmFKb0o0S0RpbDVZUWl0NVFRa2c3RHNubDk3Rkl0eXFlWlZUOFZtaUM1aEtFb3o0aHhyNDAxWDZsbVVtRnpEMHg1S0RTVTViUWl0NFJDS3NORU13N0ozZk8wdGxCcVp5UnFQNVhxS0xtWVVRZ3ZpQkI5Q3B1WlE0RjQ2cUpKSmZPQ3AyQkNSazRaUW0ySTZQUXpMVHZ5WkNLL2VoeHVsak04OWx1d0xhbFBNL3M3M0FIdDcxRnBzUmxoSVlXNkdtZWVjSVhTRzUySFpjWVQ3RUtiSkRENzBWbTEyME9VY1FnYzI0clNVNE1YMzhoWkNqVXdJZDB2cGxwd3hoTjdBVUFwb0JzN3pjQXJ5R1pTWTFQR01oMUlEUTI5MnRyZ3FwM24ySFZrOFNwd3A4bE5lOFZCcVlFVGVFR3F6SHgzTVFyZ09uTm1Wekgvc2Q0RVoxT2JlN0lvcXdpM09JUWh3R09ERjk5V0pPTE50NDRPZGJjdVV5QnBDYlFycFlEeDRHcGE5QlZqQWwyaVNDclo2S0RkMDZISks2S1FLU1NITVBOVzB4U2JpTkxGM2RNUE1JMmtJclhGV2FMMEx5MWJnRnhRd1RXWjZ0RUVuSXVqaUZNTE0zYVlUWWVZVk1pNDdLL1plRWlsRDZFd0dFZmM4TFBzNUxNcWxqajk0cHpSNjZNMmM2VXhHN0JwbTdqYjl4V3ZyS0tSTXhyTGVPNlgrRWdsRHFPMUVlU3JWQ0gyMnY1R1pJVFlDOVdBTyswcWlOaFlITzRjeGR3OHpoMHpXYlJKUnZ4M1JDRE1QdFNIVXhtSXJvN0djSHdpOGFCWGFnVnNwWWFZNURySm5kQm45c2FqRWNzTE1JUk5ESkVtRW1mY05kNWg1YUEyaE4zUUx5L1p1R25VdFFreHMvdGREcVRtTDNzb2d4T21pWm02SVpQb0ZsSElaeHhOZWF2V0swQmxDcXhpSTFXMlFCMTYwQ2kraGxNc2NmdStwMkR4QlZ6RENpWTlLVEdKa1pvaGtlaTF4SnNzNC91cWwxa3dKalNIVXBvUXR6alFnOVBXb1ZVaHMzMXpQVWxrVDNtWTZDcWhOSVY5eFRoOFJKOHdjTWpFRUpLYTVsOUNYdVZMS1o5NHFUby9BRGFFZ1RPTml4RmtvY3YrbDlwUk9YRXZWVHAwMGhYOGdGeVgwZHZaRG1RVk1BZ295TkVReS9SNUNEYU9EWHdnTjFCQTZsUk93ZWduTFR0OFE2eERLWlk2NXVOQlA5RGFHQVl1UWJyZW5adjdiL1FtTG1JemVmcEpoMWduRUVGcnVoR1h2N3JSczkxL3FCdUpNbFhubXpLRnNvcmN6Q3B4Z1NtOWFkMFdjTVBOeDJROHp6Nm9obk83Uk5KUmFoUDQ5cW5EL3BYNE0xRlBFeldMVDZhMWlReXJvWGV4Rm5BcmdCcUMvUitPL1Q3Q1lReEdMc3hrR2t2VVdRaXM0emprTjc0d2VWYVJ1aUVSWWRoR1ZZdk4vZm1nMXVFT1hjd2lGUG9XWlg1R2RNUFBBeGhCYXlTaUVWdURycmcyaFBJb3dSZWJsUnNoeHJxRjNjd0pkenRqUXV6V2tSMUhLWmJTL1czYURIVlRiRkxPWmF4SG1BRi9hUVZIUFg4eGJXTlJJUTI1dFNzbEZWQkh1OWlITUhPNmtpSmxTNmsrWWVlRFRyZ0JheGFIQUxHQUMwbU5UbTlpMldFeWoyTG0zYlRHWDBlV1VVSnppYWVhcHB6ZWgxSE1veStRc2I4ZU5vVEJFRXEzaVA1eHUxS21Pc3NURzlpNnFaRUh1Ym16UEIvUTJCbExNUE5URE1ITjRFNHNLdVpRSHZkSVpLa09BTXhNMW5URUlGMk5oeXp4ZUNGcVR3VHYwTHI3cmhKa2ZzLzNGek0xeFAzRXE1WXJNWTlSQ1p3aEQ3cU0yRm9jN1llYVNRWmo1anVrT0xHNmhnMW9aelNmcGFqT0dNQVNHcnFZL1c3dWRaZzZadHhiQyt5ZzJGbmVrRTJadURHRUlITDJQUVhTbEVXYSt1elE4ajBXNWxQS2tHeTNHRUliUW9QZHdQc0lpaEtGQXBvYUF4S1gyRStUSDNKbXFCdGUza0dvNUU3U2NIN3JOWnpEc0NibVNCOW5LMGNCRTRKOWVGQWtjNmlhRCsydDVsU05SN3RjWTYvUjZ4OGtHZzBmSVJEcGtEQ3Zvd3hCZ01XUjNIMHM2aGloeVV1ZFF3Q3NhbzFXdjZ4YW9aekI0Z0pUeXNZd21ScHpod0crelZhOTdRMWpiRFFGUUJKUlJ4SHFOTWRZelZRYURnNHhsdll6bWZJUWZnUDk3NFROcElib3pFTGhIeTNqWWRLTU1maUNYMDBZUnc0QnlTSCtkWVUrNE53UTlHaUtCTUlJQ1h0WXBOS3JOWHVuTE1oaDJSVXBwbHl0b1JSZ0cvcHlsNWEwaEVoU2pUT2Rmdks0eFJxWWp5bURZSFhJWkc4R2Z2ZGQrR0NMSk54RGFkQXB0V3NuWDA2akhZTWc2WG8waGRzZEl1bmhkSzdCTk44b1FkaktkWlVxVnZpaXorSVRYdEpJTDA4aHZNR1NGYkxRUTNUbUNPR3UxZ2pZdDUvQU15akVZZk1IUE1jVHVHRWtCYjJpbDZVWVp3a1ZRaG9Ca04rcFRYdFZwWE9CUm1RWkRSZ1JwaUNSSG9qeWdVMm5UYXRPTk1nUkx0c2NRdlNPTXBKUFh0UXBiSjNlN0ZNVmd5Q0x1RFNFK0dTSkJDY29zK3ZDYVR1dDJacWpCa0NYQzBHWGFGZUZJNEVHdG9rMm5PbWY2R0F4WklKeUcrSUxFYkpUcFJobXlSTmdOQVZBQ3pLS0VWM1U2Mzg5eTNZWThJd3FHU0RJSStLMVcwNmJUK1ZwQUdndzVUcFFNa1VBWmliQmVxN0hWcGpoUUxZYWNJM3FHU0pEb1JtM2pWYTNtZTBHTE1lUU9VVFZFa3NFSUQra050T2tNdmhxMEdFUDBpYm9oa293a3pucXRNZDBvUTJia2lpRUErZ0d6YU9jVnJlSGNvTVVZb29rclEyamk0S2RDbjdSNHhSRGdkenJEZEtNTTduSFhRbHdkZWpOMFp5U3dYbWVhYmxSZUUzZDNHSUhiTGxOWXUwdTkwUTlsRmwyOHJETVpFYlFZUTFiWmpGTFBOaGE1eWVUT0VQdEd6aEFKbEtIQTczUW1LN1dHZzRLV1kvQVZCVmJSd1NDNURGdkd1YnVDelowaE9pTnFpQVFDaktHQURUcVRtTnFSNnY0WlVrSDVFeGFueWFXTWxURzhuMDRSN2d6UkZXbERKTmtIb1lVdW50TmFUZ3Rhak1FVDNrVzRra3M1V1VwNU9wT0MzQm5DcjgxQndYQU13aE5hWjdwUmtVWFpBdFJUd0dDNWxKVWltUjllNXM0UThad3lCQ1M3VVlXOHFYWEU5QklLZ2haa1NCRmhGVVVNbHN1d3BaU3QzaFhyQXIyZW9SU3czbFdwMFVxL2hEQkpiSjdDa0plNGF5R0tjcTZGMkpsamdTZlZacVhhSEJpMEdFUDJ5ZWN4Uk0rbzA0MkNEVnBQVEZlYmJsUStZUXpST3dOUVdsalBzenFiVTRJV1k4Z091YjVTN1FYSG9meEI2MW1wOC9oeTBHSU0vbUphaU5SSWRLTTYyYUJ6VERjcWwzRm5DTW43SUxsOVVWcll3SjkwTGljSExjYmdQYWJMbEE3SzhTaFA2UnpUamNvMVRKY3BmUkxkcUM3VGpjb2xUQXVST2ZzaXRQQVhudEhabkJTMEdFTm11RE5FZXJjSDVRZktDVmc4cFhOWnFUWUhCQzNIa0I2bWhmQVdDMkVNUld6UUJtSnFwN1ZuUFZSb013T0MxcEFKdXBxRDNYemU3USsyNXowRXJxS2pjcGI5Z0JhS2VWSWJPU1pvTWVtZ1N6aFVsN0tjWXVZRXJTVWRkQlZEOUdjOFFBZFQzZVJ6TzZoMk4rMXF6SEVLU2xuUUl0eWdOc1c2aEJnV2J5SmNUWG9uc3dTRzNzZStlaCtOV0x3QzdtK21jcmRyVENsSyt5SGZNZDltNERHZ2pTNmVvSWpIMEJ6ZGt4Q25QV2dKcWFMTEdJWFNDdEc3VjF4dExJNWdOTEFBMGcvTWRMdU5NcE14eE5zb0R3TnIyWWVIeFA3aVFkRktLb0Q3TWlnN3ZBZ2RRVXZZRTdxTVk0blRnbkptMEZyU1FlL2pMT0swSUJ5ZGFWbnVER0ZSNUdKUFVoZUovUVZyRWRya0pwN3Y3WU95a0o5cEpaZEREdDVoTGVGdElYUXArd04xeEprRTBWdEgwWlY4RFl1NUtHTzg2cDY3N3pMdG5zMkkweFVxNU5leWdBOWNLTG1lTHI1TDRnUyszRUhEMTBMb2NvcG81enJpMUNQc0U3UWV0K2hLK2lGTUE2YWo3T1hsV05XTEx0UGJDQThqdTNhRjNDQ04vRldyYUVDWmwzZ2huVkpDU01nTW9Zc1p3ZWUwQU44S1dvdGJWQkh1WlF4S0U3aWJUazJWZEF6eFJWY29UcHNzN3IwcjVKb1NGckNaVWhJNzEzSURLeHlHMEtVTXBvdEZLQmRHOFQ4YnZZc1RXVVVyK0xzM3haMGh1cmliSXVaTE14LzdJVVpzT3JXUzZ4Q2VwUHQwWDIvN29LTkJvR01JYldZQVFqVmRUSUhvUlN2clBYd0Z1QkVZVFJaK2ZWZUdrS1c4NlplUTdYVXM1R21keG5MZ1dyL3J5Z29CZFpuVXhtSkE1dE9RUWFHcjZjdFd5b0Fad0pleVZXODRGMTIyVVkzdzNoNC9GNFhXSW9CWkpyMkpzOWlIRjRCN2lLSVo3bUlVVzNnRHBaRXNtZ0ZDYWdoWndpZEFoYnRNL21qSm1DeTJFSG9UWDlWbVZtTHhLRVF2WkVUdjVIaTlpOGNSZmcwY0hvU0cwSjV2S2syczFtbU1SaGpsUHJNUGd0SWxDNGJRQmZURFlockNkR0F2dit2ekdyMkgvZW1pRGdsK1BTUzBoZ0RBNG5xVXM0RCthWmNSdkRsODZ6S3BJaXppWW9TRkVMMnJpblU1UlJSekhWM2hXUThKWlpjcGlUVHhEa0s5ZHdWNlZsTHErRFR0cWdzNWtVVThDYXdtaW1hNGt4RVU4UkpLQzRURERKQmxRNmhOb2JwOUxQdlNBcnpvdVpqc21HTVR5cXRlRnFoTkhLb0xXWTd3UitCVUw4dk9Cbm9IUS9SMkhuRGkycjRadEo2ZDhkMFFPcGsrT29VUldrRXJuL0F1VTdqS1RYNng2VVM1bXNTQ29ELzRZUTdsQXl6T2tocmU4S3pJaFZ4RUFYK0c2SVZsQStqdGpBZGVROXlIWldjTFg3NVVuVUpmbmNJb25jSktDdmtRZUJnb0F3NUNhTllxQnJvcFQrYnpISEN6SDFwM3JjeVRVdDZtZ085SU5TOTdVdG9YSEVPMFk3MkdFZkp4cTJmaXRKd0JLT2NpakVMNUVkQy9sNGRySDdxNEJWek9IaWt6RUg0RTdzeVVFZW1aNHpVSytiNU1aNlBIYWd4WklLTVdRaWV4djhZWXF6SGFVRDRrTWNBYnc1NW5oVVpxQlQ5MlU1Zk01MU1rOUx2UEhxZUEwNDBab290clEraGtCbW9aVjJ1TU5ncDVuOFJxNkVqY3hza0lTN1hTM1NxcU5ISS95cTljMWVNVmUyNHQxbExDZVZMTnY3T2d4dUFUN2k1dUwrY2lMTjVCV0U3Q0JKbnNvRHVBT00ydWN5bVRJT0NIYm1kektQZnlaUzZTQ3U5dXNqRUVnOXNydGZyaDVaeU1jTGxPNVlldXNzeG5JOG9zenpSa2lzVVN1cmhTSm9ZanpOdVFHY0ZQM1FrM2F6WDd1c3JUbHlYQUgvMFJsRElLMU1zTXlzUW1IckFXZzBjRWJ3ZzRoRTZhM0dRUW16Z1dFeUd3LzVXN1VLNlJXdXlBNmpmNFJCZ01BVEJCcC9FOU54bGtIcThBUzN6U3N6dmFFUzZUT2xZRVVMZkJaOEppQ0NIT2NyVmRCdkgxb1JaNDJ4OUpQYklaWVpUTVpFMFc2elJra2JBWUFvVEQyY3hjVjFsc3RqZ2h3OW5nWXl4R1NDMi95MUo5aGdBSWp5RVNUTmJwbk80bWc4empRZUFYUHVsSjhnN0NxVEl6OElHOHdXZkNaZ2lMT0xlcjdYS1RTeWVUZ1gvNUk0bjFGSEM2MUxMQnAvSU5JU0pzaGdBWXdtWnEzV1J3RGtTYjZZT1c1eWppVEpuSjM5TXRRQnM0eWt0QkJuOEpveUVBcXJTYUUxemxLT1lXNENrUE5UekdYcHd0TmZ3ajNRTDBScVlqVkhxb3llQXpZVFZFSVhIdTBLdFREdzBSbXpnRlhJTTNheE8vQWk2UTZYeWFiZ0hhd0d6bjFBaERoQWlySVFDT1lRQlZiakxJSEY1RjBvaVAycEc3Z1V2RVpsczZtVlVSYmFBRmNkZnRNNFNETUJzQ29GYW51enlEZEFzMjhEOXAxU1kwaWMwNHNlbE1KN3V1cG9CNTNBN0UwcXJmRURoaE4wUWY0QTY5SlBXalNhU1pyVTVFYk9vSWlsSXBOdFZ1QlNiUjFSVHdaKzRDeHFkYmhpRjR3bTRJVUU3aTYweDJrMFhtOFJEQ3oxUDhlQmN3UVdaemszdHhDZFNtbUQrekJtRk11bVVZd2tINERRRWdOR2cxUjdyS0U2Y2MyTFNIVDMxT1lyeHdaN3JTMUthRVF0cUFINlZiaGlFOFJNTVFVSUp5bTVzamJHUWVIOEp1dTBEL3dtS0V6T2IrZEVYcEF2bzVabkFWbUdnSUwxRXhCTUIzcWVhbnJuSTBjQnZ3WkEvdkpJNklzWHQ4THlYVVpnRGJXQWVjblc0Wmh2QVJKVU9Bc2tCbjhOVlVQeTZKVFR3VFNIU05raVNPaUxGNUtXMFpOZ2RTd0g4REo2ZGJoaUdjUk1zUXNEZGQzT29tZzh4bEE3RFErZXZyeFBtTzJMeVZyZ0MxT1pnQ0hpR0NwMnNiOWt6VURBRndnVlp6aGFzY2hjeEZ1WnNDVHBlR0ZPNmQ2QVdkeTJGWVBBRW1QaWxYQ2ZVcGFydWhWV3RZNXd5Yzk0aXo2and1a3dyVlpqQngxa0hxWFRaRDlJaGlDd0d3UDhyaWJGV21jeGlHeFdNWU0rUThVVFVFS0tWNkF4ZjVYbzNOOGNSNUhEalU3N29Nd1JOZFF5UllwamI3K1ZXNHp1WkVoSWVCQS95cXd4QXVvbTZJZzltV2ZzakY3dERabklueUNQaG5PRVA0aUxvaFFMaEtxem5QeXlLMW52T0o4eUJadmdIVEVEelJOd1NBc0Z5cnZIbDQxZVlIS1BjRGZiMG96eEF0Y3NNUThEVUt1VEhUUXJTT3k0QmZrZ2c3TitRaHVXSUlnR3QxQm1la20xbHRya2E0bCtpdXpSZzhJSmNNWWFIY3BsUGNkM1cwamtuQXJlVFc5MkZJZzF4N0FBWlQ0dTRBWXExak9zSlNOQVEzV2hzQ0o5Y01BY3BVcmVYRWxENDZpM293SjJQa01HK2cvTkpOQm5lRzZPSnhKUFJubXhZUTV3NjFlNy9pUzBGMEZxMG9kZGtVWnNnYW00QnFDamxPUnJzN2Z0VFZBRktXOFRmZyt6cUZFY1JwQVpjblltU1A0YlJ6QTFDLzh4dHFZOUhKQ3BTZkJLREw0Qzl4NEQ2S21DcWw2UjB3bDFhWFNacFp4MWFPUXlrbjZQdmVla09vMFZxR2QzOUpMNkdBVHU1RWpCbHlEdUZSTEk2VEt4aWJyaGtnZ3pHRXJLQkRGdE5LSjBjQWkwbWNYaEVtaW9semo5cUpWbEJ0aWhuS2FvUXJneFptOEpTM0VFcmxDczZSeTNrbDA4SXlIbFRMTWo2U1ZtSUl3NEdITWkzUFk0NmpnM0tkVEI4NldRUCtSOGNhc3NabW9KNU9oc3NWM2wxZzQ5a2lsTFN3SGpoUFkxeUNNQjg0M0t1eU0wS1l6VDVjQkp3U3RCU0RKeWh3TDUxVXlUZys4THB3ejZkZHBaVTFER0FJUWpud2lkZmxwMEZmakJseWhXZFJUcE94alBYRERPRFRPb1RZdEVzenJSUXhERmdCNXRwYVEwYThoM0lsWXpoSnJ1UnBQeXZ5ZFdGTzVyTlJtcGtJbkFUOHdjKzZERG5KVnFDSnZneVZxMWdwZ3ZwZFlWWUMyYVNaNXhTK1F3VVhBd3VBdzdKUnJ5SFNyRVdaTEZmeDEyeFdtclhRRFFHVlJhemhNNzZKVUUvQy9RYkR6cnlBY29aY3hTZ1psMTB6UUFDeFRMS0NMYklRbXdJR0E2dkEvMmJRRUFrK0FzcnB4N2RsSEU4RUpTS3c0RDZaejd0eUUyT0JVeEJ6M1cwZTB3RXNwcDBqWkJ5dFVocnNBbS9nMGE2eWtHZm94Mm5PQ25KS0I0OFpjb1oxd0xFeW5waE1ERWNJVU9DR2dNU0ZpYktBbFNoSE9PT0x6L2VZeVJCbE5tQnhvWXpuWEJuUEcwR0w2VTRvREpGRUZySlo1bU5Ud0ZHSWQ4dnhodER3TWNway9zNVJNbzdmQkMybUowSzVmMWdhZVFzbzFXck9kc0xNaCs4cGp5SDh5SVRNRDRMd20xQzFFRHNqalR4S0NjY2pUSVQwUTNvTmhsUUp0U0VBeEtaVEdsbUJNQVNsQ1dnUFdwTWhkd205SVpKSUk1dGtQdFhFT1JyQzJmODBSSi9JR0NLSnpHZUROSEloY0M2RWE0YkNFSDBpWjRnazBzZzZQdUpZSjh3OEZIUFlodWdUV1VPQXM0MTFIcTNBRWM0RkttSGJ4bXFJR0pFMlJCSzVrWS9rUm1MRU9SRjRQR2c5aHVpU0U0WklJbzI4S1BNNEUvZ0I4SGJRZWd6Ukk2Y01rVVFhYUdNTDMwS3BCajROV284aE91U2tJUUNrbWEweWp5WUtHWXFhYmF5RzFNaFpReVFSbTQzU3dFU1VreENlQ2xwUHhQZ3Y0dHN2dmM4TGN0NFFTYVNCNTVqTjZRaWx3RHRCNndrNWJ3TG55eVQrVXlibjExZ3Nid3dCempiVzJheWhnR0Vrem4zZEZyU21rUEV4U2puL1pMaE00cmRCaXdtQ3ZESkVFckhaSXJPeHNSZ0VyQ0lMcHptRW5FNWdCVVVNa2NtMGlrMW4wSUtDSWk4TmtVUnMzcFhaaktXTHM0Q1hndFlUQ01vanhEbE9Kak5SSnZMUG9PVUVUVjRiSW9uTTRmY0lKK1RaTnRhL0lKUktHU01reG10Qml3a0x4aEFPWWhNWG01WEFrWkRUMjFnL1E2a0hoc3Rrc3l0eFo0d2hka0pzUGhNYm13S0dRMDQ5TUhGZ0ZjcVJFc09Xc3B3MWZFYUVjZ3RwR0pCYS9nS1VhajNuQU0xRWV4dnJNeWd4S2VlWm9JV0VIZE5DN0FHWnhTTW94ME1rdDdHK0MxeEpqRk9NR1ZMREdDSUZ4S1pUNmxoQm5LRWtia3NLKzdUa0ZxQ2VPSU9sUER1SEJPY0t4aEF1RUp1UHBZNFlCUXhIZVRCb1BUMmd3QnE2K0taTXdaWUtjMzZ1Vzh3WUlnMmtoamVCQzNRT0kwaTBHTU1DbGdUQzgwQk1wcGhyQnpMQnRCQVpJTFdzNDhzY0UvQnRyTzhqVE9UZmZOdVlJWE9NSVRKRUp0SWh0YlJpY1FTUzFXMnM3Y0JpaWhncVUxZ2h0Z2x2OXdKakNJK1FHajZTR21MQXQ4SDM0OXpYWWpGTXBoS1RzbERjNDVjem1ER0V4OGdNWGdETzBMbU13cUxWNCtMZlJEaGJwdktZeCtVYURQNmpOaVhheUJsQjZ6Q2t6djhEUWQ3UXJNYkxSMUFBQUFBQVNVVk9SSzVDWUlJPSI+CjxsaW5rIHJlbD0iYXBwbGUtdG91Y2gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNUUFBQURFQ0FZQUFBREFwbzVyQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUJhYmdBQVdtNEJ4V3NqT0FBQUFCbDBSVmgwVTI5bWRIZGhjbVVBZDNkM0xtbHVhM05qWVhCbExtOXlaNXZ1UEJvQUFCbDBTVVJCVkhpYzdaMTVlRlRWM2NjL3Y1c0ZDVlJ4cVZ0cHRWVzJWbHhmNjFxdGlxMEw5R2w5TlhVQkZFcEZSVEloaEJBRENUZEFNQUVrQ1lzSzdxQjkra0Q3MnFmQldpdnFXN1ZhNjc0aXJlOXJheFgxYlpWV1pUSEwvTjQvNWc0R1NHRHV6TDF6NzUwNW4zODR6TXc1NTh2TS9YSzIzemtIRElHaml6aFBGM0ZlMERvTUlFRUx5R2QwUG9Pd2FBQXVjVjVhaDBXNVZQQjZrTHJ5R1dPSUFGQ2IvdlNqRXFnRyt1endLd2dkd0MxMFVDZlYvRHNZaGZtTE1VUVdVUnVMRWtZRDh4RU8ydjdHam9ad1BzeEhXTXhoSUV1bGxLNXM2c3huakNHeWhDN2dKSlJXNENTZ1p4UDBuSDRKaTVpVTg3amZHZzNHRUw2alRRd0U1Z0dqa1c3ZmQrcUdTTEtXSXNwa01tLzdJTlBnWUF6aEUycFRRaCtxc0tnQytnTHVUYkJyZWl1d21IWWFaRHFmZWlyWUFCaERlSTRxUWlNWEF3c1FEdlBBQkQybE55TFVzNG5ieFNhZXVXcERFbU1JRDlFYk9RRm9SVGh0KzR2K0dDTDU1N05BdWNSNEtpM0JobDB3aHZBQWJlQVFMR3hnQW1ENWFvTHU2Y1NmaXZBTGxFcUo4WTVMNllhZE1JYklBTFVwcG9ockVXWWo3TDM5amV3YUlwbmVqTEtRdldtVWNXeEw2UjlnMkFWamlEVFJ1WXpDb2dYNEJwQTlFM1JQOS96KzM0R1pVc2JLWHFRYmRvTXhoRXUwZ2FNUm1sSE85dkFCLzZPVE90a0RReVRTeWlNbzVSTGp0WjcrSFlhZXNZSVdFQlhVWmorZFN5dndQTXJaSGhXN0VXRWluM0VhVXprVm9SVDRteWNsQytkZzhiSXVaYVhld29HZWxKa0htQlppRDZoTklVV01SMmtBRHZDb1ZkaUtzSmo0cnVzSnVwd1NQcU1LcUVLYzlZdmV5a205emsxQUV3ZlNMS1cwWStnVlk0amRvUFdjZzBVTHdsSGJYOHpjRUdzUnltVGE3bGVjdFltQkZEa3IzT3l3eHAyT0laTHBEUWhUNVRvZTJGM2QrWXd4UkEvb0hBWkJ0N0JzYjFxRkZ5bWdYQ3JkeFNUcElzNEVXaENPM2FYTTlMV3NvNENZWE1NYmJyVGtBOFlRM1ZDYi9naVZ5RTVoMlprWjRpT0VPUnllZnRTcTJsZ01ZRFRLZk9BZ2ozUjFvTnhDSVhVeTBZU1pKekdHd0huZ0xPZUI2eWtzTzcwSEwvSEFpWGY3R25RWi9XbnZ3YkRwYXdTY01QUDlUSmc1R0VPZ3MxTUl5M2Ivc0swalRreHEvT21TYUN1RFVCcVE3VHZ0dk9qV3ZZaFFMdGZrZDVoNTNocENiUmRoMmFrL1ZCdFFLcVNHMzNncXRoZTBsWE9BRnVBb0Q5ZEUxbEpBbWZ3MFA4UE04ODRRYWxNQ3pyUm1xbUhaZTM2UU5pRTA4VG5OWW1kM1dsTnRDdG1YOFlnekxkeTdSamZwUkpoNUVRM3lrL3dLTTg4YlF5Z0lkVnlNeFFMVVpWaDI3Kzkzb3R5Sk1GTnErSWZYbXQyZ2k5aVBRbVlCMXlFVWJuOGpNM084aDFMRFJGYUpvSjRLRGlsNVlRaXQ1UVFrZzdEc25sOTdGSXR5cWVaVlQ4Vm1pQzVoS0VvejRoeHI0MDFYNmxtVW1GekQweDVLRFNVNWJRaXQ0UkNLc05FTXc3SjNmTzB0bEJxWnlScVA1WHFLTG1ZVVFndmlCQjlDcHVaUTRGNDZxSkpKZk9DcDJCQ1JrNFpRbTJJNlBRekxUdnlaQ0svZWh4dWxqTTg5bHV3TGFsUE0vczczQUh0NzFGcHNSbGhJWVc2R21lZWNJWFNHNTJIWmNZVDdFS2JKREQ3MFZtMTIwT1VjUWdjMjRyU1U0TVgzOGhaQ2pVd0lkMHZwbHB3eGhON0FVQXBvQnM3emNBcnlHWlNZMVBHTWgxSURRMjkydHJncXAzbjJIVms4U3B3cDhsTmU4VkJxWUVUZUVHcXpIeDNNUXJnT25ObVZ6SC9zZDRFWjFPYmU3SW9xd2kzT0lRaHdHT0RGOTlXSk9MTnQ0NE9kYmN1VXlCcENiUXJwWUR4NEdwYTlCVmpBbDJpU0NyWjZLRGQwNkhKSzZLUUtTU0hNUE5XMHhTYmlOTEYzZE1QTUkya0lyWEZXYUwwTHkxYmdGeFF3VFdaNnRFRW5JdWppRk1MTTNhWVRZZVlWTWk0N0svWmVFaWxENkV3R0VmYzhMUHM1TE1xbGpqOTRwelI2Nk0yYzZVeEc3QnBtN2piOXhXdnJLS1JNeHJMZU82WCtFZ2xEcU8xRWVTclZDSDIydjVHWklUWUM5V0FPKzBxaU5oWUhPNGN4ZHc4emgweldiUkpSdngzUkNETVB0U0hVeG1Jcm83R2NId2k4YUJYYWdWc3BZYVk1RHJKbmRCbjlzYWpFY3NMTUlSTkRKRW1FbWZjTmQ1aDVhQTJoTjNRTHkvWnVHblV0UWt4cy90ZERxVG1MM3NvZ3hPbWlabTZJWlBvRmxISVp4eE5lYXZXSzBCbENxeGlJMVcyUUIxNjBDaStobE1zY2Z1K3AyRHhCVnpEQ2lZOUtUR0prWm9oa2VpMXhKc3M0L3VxbDFrd0pqU0hVcG9RdHpqUWc5UFdvVlVoczMxelBVbGtUM21ZNkNxaE5JVjl4VGg4Uko4d2NNakVFSkthNWw5Q1h1VkxLWjk0cVRvL0FEYUVnVE9OaXhGa29jditsOXBST1hFdlZUcDAwaFg4Z0Z5WDBkdlpEbVFWTUFnb3lORVF5L1I1Q0RhT0RYd2dOMUJBNmxST3dlZ25MVHQ4UTZ4REtaWTY1dU5CUDlEYUdBWXVRYnJlblp2N2IvUW1MbUl6ZWZwSmgxZ25FRUZydWhHWHY3clJzOTEvcUJ1Sk1sWG5tektGc29yY3pDcHhnU205YWQwV2NNUE54MlE4eno2b2huTzdSTkpSYWhQNDlxbkQvcFg0TTFGUEV6V0xUNmExaVF5cm9YZXhGbkFyZ0JxQy9SK08vVDdDWVF4R0xzeGtHa3ZVV1FpczR6amtONzR3ZVZhUnVpRVJZZGhHVll2Ti9mbWcxdUVPWGN3aUZQb1daWDVHZE1QUEF4aEJheVNpRVZ1RHJyZzJoUElvd1JlYmxSc2h4cnFGM2N3SmR6dGpRdXpXa1IxSEtaYlMvVzNhREhWVGJGTE9aYXhIbUFGL2FRVkhQWDh4YldOUklRMjV0U3NsRlZCSHU5aUhNSE82a2lKbFM2aytZZWVEVHJnQmF4YUhBTEdBQzBtTlRtOWkyV0V5ajJMbTNiVEdYMGVXVVVKemlhZWFwcHplaDFITW95K1FzYjhlTm9UQkVFcTNpUDV4dTFLbU9zc1RHOWk2cVpFSHVibXpQQi9RMkJsTE1QTlRETUhONEU0c0t1WlFIdmRJWktrT0FNeE0xblRFSUYyTmh5enhlQ0ZxVHdUdjBMcjdyaEprZnMvM0Z6TTF4UDNFcTVZck1ZOVJDWndoRDdxTTJGb2M3WWVhU1FaajVqdWtPTEc2aGcxb1p6U2ZwYWpPR01BU0dycVkvVzd1ZFpnNlp0eGJDK3lnMkZuZWtFMlp1REdFSUhMMlBRWFNsRVdhK3V6UThqMFc1bFBLa0d5M0dFSWJRb1Bkd1BzSWloS0ZBcG9hQXhLWDJFK1RIM0ptcUJ0ZTNrR281RTdTY0g3ck5aekRzQ2JtU0I5bkswY0JFNEo5ZUZBa2M2aWFEKzJ0NWxTTlI3dGNZNi9SNng4a0dnMGZJUkRwa0RDdm93eEJnTVdSM0gwczZoaWh5VXVkUXdDc2FvMVd2Nnhhb1p6QjRnSlR5c1l3bVJwemh3Ryt6VmE5N1ExamJEUUZRQkpSUnhIcU5NZFl6VlFhRGc0eGx2WXptZklRZmdQOTc0VE5wSWJvekVMaEh5M2pZZEtNTWZpQ1gwMFlSdzRCeVNIK2RZVSs0TndROUdpS0JNSUlDWHRZcE5Lck5YdW5MTWhoMlJVcHBseXRvUlJnRy9weWw1YTBoRWhTalRPZGZ2SzR4UnFZanltRFlIWElaRzhHZnZkZCtHQ0xKTnhEYWRBcHRXc25YMDZqSFlNZzZYbzBoZHNkSXVuaGRLN0JOTjhvUWRqS2RaVXFWdmlpeitJVFh0SklMMDhodk1HU0ZiTFFRM1RtQ09HdTFnall0NS9BTXlqRVlmTUhQTWNUdUdFa0JiMmlsNlVZWndrVlFob0JrTitwVFh0VnBYT0JSbVFaRFJnUnBpQ1JIb2p5Z1UyblRhdE9OTWdSTHRzY1F2U09NcEpQWHRRcGJKM2U3Rk1WZ3lDTHVEU0UrR1NKQkNjb3MrdkNhVHV0MlpxakJrQ1hDMEdYYUZlRkk0RUd0b2sybk9tZjZHQXhaSUp5RytJTEViSlRwUmhteVJOZ05BVkFDektLRVYzVTYzODl5M1lZOEl3cUdTRElJK0sxVzA2YlQrVnBBR2d3NVRwUU1rVUFaaWJCZXE3SFZwamhRTFlhY0kzcUdTSkRvUm0zalZhM21lMEdMTWVRT1VUVkVrc0VJRCtrTnRPa012aHEwR0VQMGlib2hrb3drem5xdE1kMG9RMmJraWlFQStnR3phT2NWcmVIY29NVVlvb2tyUTJqaTRLZENuN1I0eFJEZ2R6ckRkS01NN25IWFFsd2Rlak4wWnlTd1htZWFibFJlRTNkM0dJSGJMbE5ZdTB1OTBROWxGbDI4ckRNWkViUVlRMWJaakZMUE5oYTV5ZVRPRVB0R3poQUpsS0hBNzNRbUs3V0dnNEtXWS9BVkJWYlJ3U0M1REZ2R3VidUN6WjBoT2lOcWlBUUNqS0dBRFRxVG1OcVI2djRaVWtINUV4YW55YVdNbFRHOG4wNFI3Z3pSRldsREpOa0hvWVV1bnROYVRndGFqTUVUM2tXNGtrczVXVXA1T3BPQzNCbkNyODFCd1hBTXdoTmFaN3BSa1VYWkF0UlR3R0M1bEpVaW1SOWU1czRROFp3eUJDUzdVWVc4cVhYRTlCSUtnaFprU0JGaEZVVU1sc3V3cFpTdDNoWHJBcjJlb1JTdzNsV3AwVXEvaERCSmJKN0NrSmU0YXlHS2NxNkYySmxqZ1NmVlpxWGFIQmkwR0VQMnllY3hSTStvMDQyQ0RWcFBURmViYmxRK1lRelJPd05RV2xqUHN6cWJVNElXWThnT3ViNVM3UVhIb2Z4QjYxbXA4L2h5MEdJTS9tSmFpTlJJZEtNNjJhQnpURGNxbDNGbkNNbjdJTGw5VVZyWXdKOTBMaWNITGNiZ1BhYkxsQTdLOFNoUDZSelRqY28xVEpjcGZSTGRxQzdUamNvbFRBdVJPZnNpdFBBWG50SFpuQlMwR0VObXVETkVlcmNINVFmS0NWZzhwWE5acVRZSEJDM0hrQjZtaGZBV0MyRU1SV3pRQm1KcXA3Vm5QVlJvTXdPQzFwQUp1cHFEM1h6ZTdRKzI1ejBFcnFLamNwYjlnQmFLZVZJYk9TWm9NZW1nU3poVWw3S2NZdVlFclNVZGRCVkQ5R2M4UUFkVDNlUnpPNmgyTisxcXpIRUtTbG5RSXR5Z05zVzZoQmdXYnlKY1RYb25zd1NHM3NlK2VoK05XTHdDN20rbWNyZHJUQ2xLK3lIZk1kOW00REdnalM2ZW9JakgwQnpka3hDblBXZ0pxYUxMR0lYU0N0RzdWMXh0TEk1Z05MQUEwZy9NZEx1Tk1wTXh4TnNvRHdOcjJZZUh4UDdpUWRGS0tvRDdNaWc3dkFnZFFVdllFN3FNWTRuVGduSm0wRnJTUWUvakxPSzBJQnlkYVZudURHRlI1R0pQVWhlSi9RVnJFZHJrSnA3djdZT3lrSjlwSlpkRER0NWhMZUZ0SVhRcCt3TjF4SmtFMFZ0SDBaVjhEWXU1S0dPODZwNjc3ekx0bnMySTB4VXE1TmV5Z0E5Y0tMbWVMcjVMNGdTKzNFSEQxMExvY29wbzV6cmkxQ1BzRTdRZXQraEsraUZNQTZhajdPWGxXTldMTHRQYkNBOGp1M2FGM0NDTi9GV3JhRUNabDNnaG5WSkNTTWdNb1lzWndlZTBBTjhLV290YlZCSHVaUXhLRTdpYlRrMlZkQXp4UlZjb1Rwc3M3cjByNUpvU0ZyQ1pVaEk3MTNJREt4eUcwS1VNcG90RktCZEc4VDhidllzVFdVVXIrTHMzeFowaHVyaWJJdVpMTXgvN0lVWnNPcldTNnhDZXBQdDBYMi83b0tOQm9HTUliV1lBUWpWZFRJSG9SU3ZyUFh3RnVCRVlUUlorZlZlR2tLVzg2WmVRN1hVczVHbWR4bkxnV3Ivcnlnb0JkWm5VeG1KQTV0T1FRYUdyNmN0V3lvQVp3SmV5Vlc4NEYxMjJVWTN3M2g0L0Y0WFdJb0JaSnIySnM5aUhGNEI3aUtJWjdtSVVXM2dEcFpFc21nRkNhZ2had2lkQWhidE0vbWpKbUN5MkVIb1RYOVZtVm1MeEtFUXZaRVR2NUhpOWk4Y1JmZzBjSG9TRzBKNXZLazJzMW1tTVJoamxQck1QZ3RJbEM0YlFCZlREWWhyQ2RHQXZ2K3Z6R3IySC9lbWlEZ2wrUFNTMGhnREE0bnFVczREK2FaY1J2RGw4NnpLcElpemlZb1NGRUwycmluVTVSUlJ6SFYzaFdROEpaWmNwaVRUeERrSzlkd1Y2VmxMcStEVHRxZ3M1a1VVOENhd21pbWE0a3hFVThSSktDNFREREpCbFE2aE5vYnA5TFB2U0Fyem91WmpzbUdNVHlxdGVGcWhOSEtvTFdZN3dSK0JVTDh2T0Jub0hRL1IySG5EaTJyNFp0SjZkOGQwUU9waytPb1VSV2tFcm4vQXVVN2pLVFg2eDZVUzVtc1NDb0QvNFlRN2xBeXpPa2hyZThLekloVnhFQVgrRzZJVmxBK2p0akFkZVE5eUhaV2NMWDc1VW5VSmZuY0lvbmNKS0N2a1FlQmdvQXc1Q2FOWXFCcm9wVCtiekhIQ3pIMXAzcmN5VFV0Nm1nTzlJTlM5N1V0b1hIRU8wWTcyR0VmSnhxMmZpdEp3QktPY2lqRUw1RWRDL2w0ZHJIN3E0QlZ6T0hpa3pFSDRFN3N5VUVlbVo0elVLK2I1TVo2UEhhZ3haSUtNV1FpZXh2OFlZcXpIYVVENGtNY0FidzU1bmhVWnFCVDkyVTVmTTUxTWs5THZQSHFlQTA0MFpvb3RyUStoa0Jtb1pWMnVNTmdwNW44UnE2RWpjeHNrSVM3WFMzU3FxTkhJL3lxOWMxZU1WZTI0dDFsTENlVkxOdjdPZ3h1QVQ3aTV1TCtjaUxONUJXRTdDQkpuc29EdUFPTTJ1Y3ltVElPQ0hibWR6S1BmeVpTNlNDdTl1c2pFRWc5c3J0ZnJoNVp5TWNMbE81WWV1c3N4bkk4b3N6elJraXNVU3VyaFNKb1lqek51UUdjRlAzUWszYXpYN3VzclRseVhBSC8wUmxESUsxTXNNeXNRbUhyQVdnMGNFYndnNGhFNmEzR1FRbXpnV0V5R3cvNVc3VUs2Uld1eUE2amY0UkJnTUFUQkJwL0U5Tnhsa0hxOEFTM3pTc3p2YUVTNlRPbFlFVUxmQlo4SmlDQ0hPY3JWZEJ2SDFvUlo0Mng5SlBiSVpZWlRNWkUwVzZ6UmtrYkFZQW9URDJjeGNWMWxzdGpnaHc5bmdZeXhHU0MyL3kxSjloZ0FJanlFU1ROYnBuTzRtZzh6alFlQVhQdWxKOGc3Q3FUSXo4SUc4d1dmQ1pnaUxPTGVyN1hLVFN5ZVRnWC81STRuMUZIQzYxTExCcC9JTklTSnNoZ0FZd21acTNXUndEa1NiNllPVzV5amlUSm5KMzlNdFFCczR5a3RCQm44Sm95RUFxclNhRTF6bEtPWVc0Q2tQTlR6R1hwd3ROZndqM1FMMFJxWWpWSHFveWVBellUVkVJWEh1MEt0VER3MFJtemdGWElNM2F4Ty9BaTZRNlh5YWJnSGF3R3puMUFoRGhBaXJJUUNPWVFCVmJqTElIRjVGMG9pUDJwRzdnVXZFWmxzNm1WVVJiYUFGY2RmdE00U0RNQnNDb0ZhbnV6eURkQXMyOEQ5cDFTWTBpYzA0c2VsTUo3dXVwb0I1M0E3RTBxcmZFRGhoTjBRZjRBNjlKUFdqU2FTWnJVNUViT29JaWxJcE50VnVCU2JSMVJUd1orNEN4cWRiaGlGNHdtNElVRTdpNjB4MmswWG04UkRDejFQOGVCY3dRV1p6azN0eENkU21tRCt6Qm1GTXVtVVl3a0g0RFFFZ05HZzFSN3JLRTZjYzJMU0hUMzFPWXJ4d1o3clMxS2FFUXRxQUg2VmJoaUU4Uk1NUVVJSnltNXNqYkdRZUg4SnV1MEQvd21LRXpPYitkRVhwQXZvNVpuQVZtR2dJTDFFeEJNQjNxZWFucm5JMGNCdndaQS92Skk2SXNYdDhMeVhVWmdEYldBZWNuVzRaaHZBUkpVT0Fza0JuOE5WVVB5NkpUVHdUU0hTTmtpU09pTEY1S1cwWk5nZFN3SDhESjZkYmhpR2NSTXNRc0RkZDNPb21nOHhsQTdEUStldnJ4UG1PMkx5VnJnQzFPWmdDSGlHQ3Ayc2I5a3pVREFGd2dWWnpoYXNjaGN4RnVac0NUcGVHRk82ZDZBV2R5MkZZUEFFbVBpbFhDZlVwYXJ1aFZXdFk1d3ljOTRpejZqd3Vrd3JWWmpCeDFrSHFYVFpEOUloaUN3R3dQOHJpYkZXbWN4aUd4V01ZTStROFVUVUVLS1Y2QXhmNVhvM044Y1I1SERqVTc3b013Uk5kUXlSWXBqYjcrVlc0enVaRWhJZUJBL3lxd3hBdW9tNklnOW1XZnNqRjd0RFpuSW55Q1Bobk9FUDRpTG9oUUxoS3F6blB5eUsxbnZPSjh5Qlp2Z0hURUR6Uk53U0FzRnlydkhsNDFlWUhLUGNEZmIwb3p4QXRjc01ROERVS3VUSFRRclNPeTRCZmtnZzdOK1FodVdJSWdHdDFCbWVrbTFsdHJrYTRsK2l1elJnOElKY01ZYUhjcGxQY2QzVzBqa25BcmVUVzkyRklnMXg3QUFaVDR1NEFZcTFqT3NKU05BUTNXaHNDSjljTUFjcFVyZVhFbEQ0Nmkzb3dKMlBrTUcrZy9OSk5CbmVHNk9KeEpQUm5teFlRNXc2MWU3L2lTMEYwRnEwb2Rka1Vac2dhbTRCcUNqbE9ScnM3ZnRUVkFGS1c4VGZnK3pxRkVjUnBBWmNuWW1TUDRiUnpBMUMvOHh0cVk5SEpDcFNmQktETDRDOXg0RDZLbUNxbDZSMHdsMWFYU1pwWngxYU9ReWtuNlB2ZWVrT28wVnFHZDM5Skw2R0FUdTVFakJseUR1RlJMSTZUS3hpYnJoa2dnekdFcktCREZ0TktKMGNBaTBtY1hoRW1pb2x6ajlxSlZsQnRpaG5LYW9Rcmd4Wm04SlMzRUVybENzNlJ5M2tsMDhJeUhsVExNajZTVm1JSXc0R0hNaTNQWTQ2amczS2RUQjg2V1FQK1I4Y2Fzc1ptb0o1T2hzc1YzbDFnNDlraWxMU3dIamhQWTF5Q01CODQzS3V5TTBLWXpUNWNCSndTdEJTREp5aHdMNTFVeVRnKzhMcHd6NmRkcFpVMURHQUlRam53aWRmbHAwRmZqQmx5aFdkUlRwT3hqUFhERE9EVE9vVFl0RXN6clJReERGZ0I1dHBhUTBhOGgzSWxZemhKcnVScFB5dnlkV0ZPNXJOUm1wa0luQVQ4d2MrNkREbkpWcUNKdmd5VnExZ3BndnBkWVZZQzJhU1o1eFMrUXdVWEF3dUF3N0pScnlIU3JFV1pMRmZ4MTJ4V21yWFFEUUdWUmF6aE03NkpVRS9DL1FiRHpyeUFjb1pjeFNnWmwxMHpRQUN4VExLQ0xiSVFtd0lHQTZ2QS8yYlFFQWsrQXNycHg3ZGxIRThFSlNLdzRENlp6N3R5RTJPQlV4QnozVzBlMHdFc3BwMGpaQnl0VWhyc0FtL2cwYTZ5a0dmb3gybk9DbkpLQjQ4WmNvWjF3TEV5bnBoTURFY0lVT0NHZ01TRmliS0FsU2hIT09PTHovZVl5UkJsTm1CeG9Zem5YQm5QRzBHTDZVNG9ESkZFRnJKWjVtTlR3RkdJZDh2eGh0RHdNY3BrL3M1Uk1vN2ZCQzJtSjBLNWYxZ2FlUXNvMVdyT2RzTE1oKzhwanlIOHlJVE1ENEx3bTFDMUVEc2pqVHhLQ2NjalRJVDBRM29OaGxRSnRTRUF4S1pUR2xtQk1BU2xDV2dQV3BNaGR3bTlJWkpJSTV0a1B0WEVPUnJDMmY4MFJKL0lHQ0tKekdlRE5ISWhjQzZFYTRiQ0VIMGlaNGdrMHNnNlB1SllKOHc4RkhQWWh1Z1RXVU9BczQxMUhxM0FFYzRGS21IYnhtcUlHSkUyUkJLNWtZL2tSbUxFT1JGNFBHZzlodWlTRTRaSUlvMjhLUE00RS9nQjhIYlFlZ3pSSTZjTWtVUWFhR01MMzBLcEJqNE5XbzhoT3VTa0lRQ2ttYTB5anlZS0dZcWFiYXlHMU1oWlF5UVJtNDNTd0VTVWt4Q2VDbHBQeFBndjR0c3Z2YzhMY3Q0UVNhU0I1NWpONlFpbHdEdEI2d2s1YndMbnl5VCtVeWJuMTFnc2J3d0J6amJXMmF5aGdHRWt6bjNkRnJTbWtQRXhTam4vWkxoTTRyZEJpd21DdkRKRUVySFpJck94c1JnRXJDSUxwem1FbkU1Z0JVVU1rY20waWsxbjBJS0NJaThOa1VSczNwWFpqS1dMczRDWGd0WVRDTW9qeERsT0pqTlJKdkxQb09VRVRWNGJJb25NNGZjSUorVFpOdGEvSUpSS0dTTWt4bXRCaXdrTHhoQU9ZaE1YbTVYQWtaRFQyMWcvUTZrSGhzdGtzeXR4WjR3aGRrSnNQaE1ibXdLR1EwNDlNSEZnRmNxUkVzT1dzcHcxZkVhRWNndHBHSkJhL2dLVWFqM25BTTFFZXh2ck15Z3hLZWVab0lXRUhkTkM3QUdaeFNNb3gwTWt0N0crQzF4SmpGT01HVkxER0NJRnhLWlQ2bGhCbktFa2Jrc0srN1RrRnFDZU9JT2xQRHVIQk9jS3hoQXVFSnVQcFk0WUJReEhlVEJvUFQyZ3dCcTYrS1pNd1pZS2MzNnVXOHdZSWcya2hqZUJDM1FPSTBpMEdNTUNsZ1RDODBCTXBwaHJCekxCdEJBWklMV3M0OHNjRS9CdHJPOGpUT1RmZk51WUlYT01JVEpFSnRJaHRiUmljUVNTMVcyczdjQmlpaGdxVTFnaHRnbHY5d0pqQ0krUUdqNlNHbUxBdDhIMzQ5elhZakZNcGhLVHNsRGM0NWN6bURHRXg4Z01YZ0RPMExtTXdxTFY0K0xmUkRoYnB2S1l4K1VhRFA2ak5pWGF5QmxCNnpDa3p2OERRZDdRck1iTFIxQUFBQUFBU1VWT1JLNUNZSUk9Ij4KCjxzdHlsZT4KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by91WUVDTUtvSGNPOXgxd2RtYnlISW0zLV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vc1RkYUE2ajBQc2I5MjBWanYtbXJ6SC1fa2Y2QnlZTzZDTFlkQjRIUUUtWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL19WWUZ4LXM4MjRrWHFfVWwyQkhxWUgtX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL3RuajRTQjZETmJkYVFuc004Q0ZxQlgtX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL29NTWdmWk1RdGhPcnlRbzluMjJkY3V2dkRpbjFwSzhhS3RlTHBlWjVjMEEud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL0tzX2NWeGlDaXdVV1ZzRldGQTNCam4tX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vTko0dnhsZ1d3V2JFc3YxOGRBaHFubi1fa2Y2QnlZTzZDTFlkQjRIUUUtWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9pc1otd2JDWE5LQWJuam82X1R3SFRvWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by83N0ZYRmpSYkd6TjRhQ3JTRmhsaDNvWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9qU04yQ0dWRGJjVnlDbmZKZmpTZGZJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL1VYNmk0SnhRRG0zZlZUYzFDUHV3cW9YMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vZC02SVlwbE9Gb2NDYWNLenh3WFNPSkJ3MXhVMXJLcHRKal8wamFuczkyMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by85N3VhaHhpcVpSb25jQmFDRUkzYVc0WDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vUHdaYy1ZYklMNDE0d0I5ckIxSUFQWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDMTRzWVlkSmc1ZFUycXpKRVZTdXRhMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQ19acmFSMlRnOHcybHptN2tMTkwwLXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0N3dF9SbTY5MUxUZWJLZlkyWmtLU21JLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0MxQlcyNlF4cFNqLV9aS21feFQ0aFd3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0M0Z3A5UThnYllyaHFHbFJhdl9JWGZrLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0M2RThrTTR4V1IxXzFiWVVSUm9qUkdjLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQzlEaU5zUjVhLTlPZV9JdnB1OFhXbFkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09wWFVxVG8wVWdRUWhHal9TRmRMV0JrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9XeHJYSmEwQzNLZHRDN2xNYWZHNGRSa0F6NHJZbjQ3WnkycnZpZ1dRZjZ3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vY0RLaFJhWG5RVE9WYmFveHdkT3I5eGtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vMWhaZjAyUE9BTmgzMmsyVmtnRW9VQmtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdlBjeW5TTDBxSHFfNmRYN2xLVkJ5WFloamJTcHZjNDdlZTZ4Ul84MEhudy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdlN6dWxmS1NLMExMampmZWF4Y1JFaGtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9LMjNjeFdWVHJJRkQ2REpzRVZpMDdSa0F6NHJZbjQ3WnkycnZpZ1dRZjZ3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vRmw0eTBRZE94eXlUSEVHTVhYOGtjWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by8wZUM2ZmwwNmx1WEVZV3BCU0p2WENJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL0kzUzF3c2dTZzlZQ3VyVjZQVWtUT1lYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by8tTDE0SmswNm02cFVIQi01bVhRUW5ZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vSGdvMTNrLXRmU3BuMHFpMVNGZFVmWkJ3MXhVMXJLcHRKal8wamFuczkyMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL1BydTMzcWpTaHBaU21HM3o2Vll3bllYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL05ZRFdCZEQ0Z0lxMjZHNVhZYkhzRklYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0MTRzWVlkSmc1ZFUycXpKRVZTdXRhMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0X1pyYVIyVGc4dzJsem03a0xOTDAtdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0d3RfUm02OTFMVGViS2ZZMlprS1NtSS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQxQlcyNlF4cFNqLV9aS21feFQ0aFd3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDRncDlROGdiWXJocUdsUmF2X0lYZmsud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0NkU4a000eFdSMV8xYllVUlJvalJHYy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDlEaU5zUjVhLTlPZV9JdnB1OFhXbFkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL29IaTMwa3dRV3ZwQ1dxQWh6SGNDU0lYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9aTHFLZWVsWWJBVEc2MEVwWkJTRHk0WDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vbXg5VWNrNnVCNjNWSUtGWW5FTVhyWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vckd2SGRKbnIybDc1cWIwWU5EOU55SVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vUnhaSmRuemVvM1I1elNleGdlOFVVWkJ3MXhVMXJLcHRKal8wamFuczkyMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vb09lRndaTmxyVGVmekxZbWxWVjFVSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9tYm1ocHJNSDY5Wmk2ZUVQQllWRmhZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwVjRzWVlkSmc1ZFUycXpKRVZTdXRhMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBmWnJhUjJUZzh3Mmx6bTdrTE5MMC13LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMFF0X1JtNjkxTFRlYktmWTJaa0tTbUkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBWQlcyNlF4cFNqLV9aS21feFQ0aFd3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwWWdwOVE4Z2JZcmhxR2xSYXZfSVhmay53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMGFFOGtNNHhXUjFfMWJZVVJSb2pSR2Mud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMGREaU5zUjVhLTlPZV9JdnB1OFhXbFkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZMTRzWVlkSmc1ZFUycXpKRVZTdXRhMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZX1pyYVIyVGc4dzJsem03a0xOTDAtdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZd3RfUm02OTFMVGViS2ZZMlprS1NtSS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFkxQlcyNlF4cFNqLV9aS21feFQ0aFd3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTRncDlROGdiWXJocUdsUmF2X0lYZmsud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZNkU4a000eFdSMV8xYllVUlJvalJHYy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTlEaU5zUjVhLTlPZV9JdnB1OFhXbFkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5RnoxeC1NMUkxdzVPTWlxblZGOHhCTGhVLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGendYYUFYdXA1bVpsZks2eFJMcmhzY28ud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6d242V3F4by14d3hpbERYUFU4Y2hWVS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGejFUN2FKTEs2bktwbjM2SU13VGNNTWMud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5RnpfNzlfWnVVeENpZ00yRGVzcFRuRmF3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6NGdkOU9FUFVDTjNBZFlXMGU4dGF0NC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6OGJJUVNZWm5XTGFXQzlRTkNwVEtfVS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9Cjwvc3R5bGU+CgoKCjxzdHlsZT4ubWF0LWJhZGdlLWNvbnRlbnR7Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsIC5tYXQtYmFkZ2UtY29udGVudHtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2UgLm1hdC1iYWRnZS1jb250ZW50e2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDEsLm1hdC1oZWFkbGluZSwubWF0LXR5cG9ncmFwaHkgaDF7Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDIsLm1hdC10aXRsZSwubWF0LXR5cG9ncmFwaHkgaDJ7Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDMsLm1hdC1zdWJoZWFkaW5nLTIsLm1hdC10eXBvZ3JhcGh5IGgze2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0LC5tYXQtc3ViaGVhZGluZy0xLC5tYXQtdHlwb2dyYXBoeSBoNHtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNSwubWF0LXR5cG9ncmFwaHkgaDV7Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDYsLm1hdC10eXBvZ3JhcGh5IGg2e2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nLC5tYXQtYm9keS0ye2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keSwubWF0LWJvZHktMSwubWF0LXR5cG9ncmFwaHl7Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5IHAsLm1hdC1ib2R5LTEgcCwubWF0LXR5cG9ncmFwaHkgcHttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbCwubWF0LWNhcHRpb257Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTQsLm1hdC10eXBvZ3JhcGh5IC5tYXQtZGlzcGxheS00e2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktMywubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTN7Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMiwubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTJ7Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTEsLm1hdC10eXBvZ3JhcGh5IC5tYXQtZGlzcGxheS0xe2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJ7Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b24sLm1hdC1yYWlzZWQtYnV0dG9uLC5tYXQtaWNvbi1idXR0b24sLm1hdC1zdHJva2VkLWJ1dHRvbiwubWF0LWZsYXQtYnV0dG9uLC5tYXQtZmFiLC5tYXQtbWluaS1mYWJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGV7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxle2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyIC5tYXQtY2FyZC10aXRsZXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGUsLm1hdC1jYXJkLWNvbnRlbnR7Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXQgLm1hdC1jaGVja2JveC1sYWJlbHtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcHtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uLC5tYXQtY2hpcCAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29ue2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGV7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGx7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbCwubWF0LWZvb3Rlci1jZWxse2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWwsLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9ue2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlciB0aHtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGV7Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVye2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudHtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGR7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJ7cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29ue2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiwubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbi1idXR0b257aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbntoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXh7cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcjpmb2N1cysubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJ7dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVse3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcntmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtd3JhcHBlcntwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcjpmb2N1cysubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtbGFiZWx7dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXIsLm1hdC1ncmlkLXRpbGUtZm9vdGVye2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlciAubWF0LWxpbmUsLm1hdC1ncmlkLXRpbGUtZm9vdGVyIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyIC5tYXQtbGluZTpudGgtY2hpbGQobisyKSwubWF0LWdyaWQtdGlsZS1mb290ZXIgLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50e21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVte2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3IsLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplIC5tYXQtc2VsZWN0LXRyaWdnZXJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9ue2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcntoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50e2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLC5tYXQtc3RlcHBlci1ob3Jpem9udGFse2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWx7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3J7Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcntmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWR7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3Vwe2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1saW5re2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyLC5tYXQtdG9vbGJhciBoMSwubWF0LXRvb2xiYXIgaDIsLm1hdC10b29sYmFyIGgzLC5tYXQtdG9vbGJhciBoNCwubWF0LXRvb2xiYXIgaDUsLm1hdC10b29sYmFyIGg2e2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldHtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVte2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3QtaXRlbXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3QtaXRlbSAubWF0LWxpbmV7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGluZTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZSAubWF0LXN1YmhlYWRlcntmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3QtaXRlbXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LXN1YmhlYWRlcntmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9ue2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVse2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFye2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb257bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWV7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlLC5tYXQtbmVzdGVkLXRyZWUtbm9kZXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGV7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVke292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudHtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtcmlwcGxlLWVsZW1lbnR7ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVue2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lciwuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJ7cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVye3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJ7ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3B7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmd7b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmd7b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcHtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AsLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmd7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94e3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2t7cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemV7cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ3twYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94e3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0ey8qISovfUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5key8qISovfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWQ6LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWQ6bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcntwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3J7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpfS5tYXQtb3B0aW9ue2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb246aG92ZXI6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSwubWF0LW9wdGlvbjpmb2N1czpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LWFjdGl2ZXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KTtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uLm1hdC1vcHRpb24tZGlzYWJsZWR7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHJpbWFyeSAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjU3YzAwfS5tYXQtYWNjZW50IC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmZjk4MDB9Lm1hdC13YXJuIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNDQzMzZ9Lm1hdC1vcHRncm91cC1sYWJlbHtjb2xvcjojNjE2MTYxfS5tYXQtb3B0Z3JvdXAtZGlzYWJsZWQgLm1hdC1vcHRncm91cC1sYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wc2V1ZG8tY2hlY2tib3h7Y29sb3I6IzYxNjE2MX0ubWF0LXBzZXVkby1jaGVja2JveDo6YWZ0ZXJ7Y29sb3I6I2ZmZn0ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZHtjb2xvcjojYjBiMGIwfS5tYXQtcHJpbWFyeSAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLC5tYXQtcHJpbWFyeSAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRle2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUsLm1hdC1hY2NlbnQgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCwubWF0LWFjY2VudCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRle2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LXdhcm4gLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCwubWF0LXdhcm4gLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZC5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkLC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZHtiYWNrZ3JvdW5kOiNiMGIwYjB9Lm1hdC1hcHAtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWVsZXZhdGlvbi16MHtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejF7Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Mntib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoze2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejR7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejV7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejZ7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo3e2JveC1zaGFkb3c6MHB4IDRweCA1cHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDdweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAycHggMTZweCAxcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OHtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejl7Ym94LXNoYWRvdzowcHggNXB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOXB4IDEycHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMHtib3gtc2hhZG93OjBweCA2cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMHB4IDE0cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAxOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMXtib3gtc2hhZG93OjBweCA2cHggN3B4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMXB4IDE1cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAyMHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMntib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxM3tib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxM3B4IDE5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNHB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNHtib3gtc2hhZG93OjBweCA3cHggOXB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNHB4IDIxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNXtib3gtc2hhZG93OjBweCA4cHggOXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNXB4IDIycHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAyOHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNntib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTd7Ym94LXNoYWRvdzowcHggOHB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE3cHggMjZweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMycHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE4e2JveC1zaGFkb3c6MHB4IDlweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOHB4IDI4cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOXtib3gtc2hhZG93OjBweCA5cHggMTJweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTlweCAyOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzZweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjB7Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMHB4IDMxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCAzOHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIxcHggMzNweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQwcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIye2JveC1zaGFkb3c6MHB4IDEwcHggMTRweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjJweCAzNXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDJweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjN7Ym94LXNoYWRvdzowcHggMTFweCAxNHB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyM3B4IDM2cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyNHtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC10aGVtZS1sb2FkZWQtbWFya2Vye2Rpc3BsYXk6bm9uZX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbHtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbCAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcik6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojMjEyMTIxfS5tYXQtYmFkZ2V7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1iYWRnZS1oaWRkZW4gLm1hdC1iYWRnZS1jb250ZW50e2Rpc3BsYXk6bm9uZX0ubWF0LWJhZGdlLWNvbnRlbnR7cG9zaXRpb246YWJzb2x1dGU7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gMjAwbXMgZWFzZS1pbi1vdXQ7dHJhbnNmb3JtOnNjYWxlKDAuNik7b3ZlcmZsb3c6aGlkZGVuO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm5nLWFuaW1hdGUtZGlzYWJsZWQgLm1hdC1iYWRnZS1jb250ZW50LC5tYXQtYmFkZ2UtY29udGVudC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1iYWRnZS1jb250ZW50Lm1hdC1iYWRnZS1hY3RpdmV7dHJhbnNmb3JtOm5vbmV9Lm1hdC1iYWRnZS1zbWFsbCAubWF0LWJhZGdlLWNvbnRlbnR7d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtsaW5lLWhlaWdodDoxNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFib3ZlIC5tYXQtYmFkZ2UtY29udGVudHt0b3A6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWxvdyAubWF0LWJhZGdlLWNvbnRlbnR7Ym90dG9tOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0xNnB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6LTE2cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi04cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0Oi04cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LThweH0ubWF0LWJhZGdlLW1lZGl1bSAubWF0LWJhZGdlLWNvbnRlbnR7d2lkdGg6MjJweDtoZWlnaHQ6MjJweDtsaW5lLWhlaWdodDoyMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnR7dG9wOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWxvdyAubWF0LWJhZGdlLWNvbnRlbnR7Ym90dG9tOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6LTIycHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0Oi0yMnB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0OmF1dG87bGVmdDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0xMXB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0OmF1dG87cmlnaHQ6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMTFweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTExcHh9Lm1hdC1iYWRnZS1sYXJnZSAubWF0LWJhZGdlLWNvbnRlbnR7d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtsaW5lLWhlaWdodDoyOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFib3ZlIC5tYXQtYmFkZ2UtY29udGVudHt0b3A6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVsb3cgLm1hdC1iYWRnZS1jb250ZW50e2JvdHRvbTotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6LTI4cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMjhweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0OmF1dG87bGVmdDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6LTE0cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMTRweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0OmF1dG87bGVmdDotMTRweH0ubWF0LWJhZGdlLWNvbnRlbnR7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNTdjMDB9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJhZGdlLWNvbnRlbnR7b3V0bGluZTpzb2xpZCAxcHg7Ym9yZGVyLXJhZGl1czowfS5tYXQtYmFkZ2UtYWNjZW50IC5tYXQtYmFkZ2UtY29udGVudHtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWJhZGdlLXdhcm4gLm1hdC1iYWRnZS1jb250ZW50e2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtYmFkZ2UtZGlzYWJsZWQgLm1hdC1iYWRnZS1jb250ZW50e2JhY2tncm91bmQ6I2JkYmRiZDtjb2xvcjojNzU3NTc1fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcntib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbiwubWF0LWljb24tYnV0dG9uLC5tYXQtc3Ryb2tlZC1idXR0b257Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5LC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnksLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeXtjb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnQsLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudHtjb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuLC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm4sLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2Fybntjb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1idXR0b24ubWF0LWFjY2VudC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtYnV0dG9uLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWljb24tYnV0dG9uLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1pY29uLWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm4ubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1idXR0b24tZGlzYWJsZWQubWF0LWJ1dHRvbi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm4gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b24gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWljb24tYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1zdHJva2VkLWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50e29wYWNpdHk6LjE7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1zdHJva2VkLWJ1dHRvbjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbiwubWF0LXJhaXNlZC1idXR0b24sLm1hdC1mYWIsLm1hdC1taW5pLWZhYntjb2xvcjojMjEyMTIxO2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5LC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeSwubWF0LWZhYi5tYXQtcHJpbWFyeSwubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5e2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtZmFiLm1hdC1hY2NlbnQsLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50e2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybiwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4sLm1hdC1mYWIubWF0LXdhcm4sLm1hdC1taW5pLWZhYi5tYXQtd2Fybntjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4ubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LXJhaXNlZC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtZmFiLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1mYWIubWF0LWFjY2VudC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtZmFiLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1mYWIubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LW1pbmktZmFiLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LW1pbmktZmFiLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1taW5pLWZhYi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWR7Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnksLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5LC5tYXQtZmFiLm1hdC1wcmltYXJ5LC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnl7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudCwubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudCwubWF0LWZhYi5tYXQtYWNjZW50LC5tYXQtbWluaS1mYWIubWF0LWFjY2VudHtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybiwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4sLm1hdC1mYWIubWF0LXdhcm4sLm1hdC1taW5pLWZhYi5tYXQtd2FybntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4ubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWZsYXQtYnV0dG9uLm1hdC1idXR0b24tZGlzYWJsZWQubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybi5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1mYWIubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWZhYi5tYXQtYWNjZW50Lm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1mYWIubWF0LXdhcm4ubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWZhYi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeS5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtbWluaS1mYWIubWF0LWFjY2VudC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtbWluaS1mYWIubWF0LXdhcm4ubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LW1pbmktZmFiLm1hdC1idXR0b24tZGlzYWJsZWQubWF0LWJ1dHRvbi1kaXNhYmxlZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1mYWIubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtZmFiLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LW1pbmktZmFiLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWZhYi5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtbWluaS1mYWIubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtc3Ryb2tlZC1idXR0b246bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1mbGF0LWJ1dHRvbjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uOm5vdCgubWF0LWJ1dHRvbi1kaXNhYmxlZCk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWI6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1taW5pLWZhYjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWI6bm90KC5tYXQtYnV0dG9uLWRpc2FibGVkKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1taW5pLWZhYjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiLm1hdC1idXR0b24tZGlzYWJsZWQ6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1taW5pLWZhYi5tYXQtYnV0dG9uLWRpc2FibGVkOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZSwubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXB7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJke2JveC1zaGFkb3c6bm9uZX0ubWF0LWJ1dHRvbi10b2dnbGV7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtYnV0dG9uLXRvZ2dsZSAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZHtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlKy5tYXQtYnV0dG9uLXRvZ2dsZXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfVtkaXI9cnRsXSAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUrLm1hdC1idXR0b24tdG9nZ2xle2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWwgLm1hdC1idXR0b24tdG9nZ2xlKy5tYXQtYnV0dG9uLXRvZ2dsZXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZHtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzYxNjE2MX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJke2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVke2NvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmR7YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2Vke2JhY2tncm91bmQtY29sb3I6I2JkYmRiZH0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJke2JvcmRlcjpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtYnV0dG9uLXRvZ2dsZS1sYWJlbC1jb250ZW50e2xpbmUtaGVpZ2h0OjQ4cHh9Lm1hdC1jYXJke2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtY2FyZDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC5tYXQtY2FyZC1mbGF0Om5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQtc3VidGl0bGV7Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWZyYW1le2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJre2ZpbGw6I2ZmZn0ubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoe3N0cm9rZTojZmZmICFpbXBvcnRhbnR9Lm1hdC1jaGVja2JveC1taXhlZG1hcmt7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHJpbWFyeSAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1wcmltYXJ5IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1hY2NlbnQgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtYWNjZW50IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC13YXJuIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCwubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXdhcm4gLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1jaGVja2VkIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCwubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZDpub3QoLm1hdC1jaGVja2JveC1jaGVja2VkKSAubWF0LWNoZWNrYm94LWZyYW1le2JvcmRlci1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWQgLm1hdC1jaGVja2JveC1sYWJlbHtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3ggLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtY2hlY2tib3g6YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWQ6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWNoZWNrYm94OmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWQ6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1jaGVja2JveDphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcHtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzIxMjEyMX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLXJlbW92ZXtjb2xvcjojMjEyMTIxO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpOmFjdGl2ZXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcDpub3QoLm1hdC1jaGlwLWRpc2FibGVkKSAubWF0LWNoaXAtcmVtb3ZlOmhvdmVye29wYWNpdHk6LjU0fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZHtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcDo6YWZ0ZXJ7YmFja2dyb3VuZDojMDAwfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnkgLm1hdC1jaGlwLXJlbW92ZXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm57YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuIC5tYXQtY2hpcC1yZW1vdmV7Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnQgLm1hdC1jaGlwLXJlbW92ZXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtdGFibGV7YmFja2dyb3VuZDojZmZmfS5tYXQtdGFibGUgdGhlYWQsLm1hdC10YWJsZSB0Ym9keSwubWF0LXRhYmxlIHRmb290LG1hdC1oZWFkZXItcm93LG1hdC1yb3csbWF0LWZvb3Rlci1yb3csW21hdC1oZWFkZXItcm93XSxbbWF0LXJvd10sW21hdC1mb290ZXItcm93XSwubWF0LXRhYmxlLXN0aWNreXtiYWNrZ3JvdW5kOmluaGVyaXR9bWF0LXJvdyxtYXQtaGVhZGVyLXJvdyxtYXQtZm9vdGVyLXJvdyx0aC5tYXQtaGVhZGVyLWNlbGwsdGQubWF0LWNlbGwsdGQubWF0LWZvb3Rlci1jZWxse2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaGVhZGVyLWNlbGx7Y29sb3I6IzYxNjE2MX0ubWF0LWNlbGwsLm1hdC1mb290ZXItY2VsbHtjb2xvcjojMjEyMTIxfS5tYXQtY2FsZW5kYXItYXJyb3d7ZmlsbDpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZSwubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWNhbGVuZGFyLW5leHQtYnV0dG9uLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50IC5tYXQtY2FsZW5kYXItcHJldmlvdXMtYnV0dG9ue2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcntjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXItZGl2aWRlcjo6YWZ0ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVse2NvbG9yOiM2MTYxNjF9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudCwubWF0LWRhdGUtcmFuZ2UtaW5wdXQtc2VwYXJhdG9ye2NvbG9yOiMyMTIxMjE7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpe2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZGF0ZS1yYW5nZS1pbnB1dC1zZXBhcmF0b3J7Y29sb3I6Izc1NzU3NX0ubWF0LWNhbGVuZGFyLWJvZHktaW4tcHJldmlld3tjb2xvcjpyZ2JhKDAsMCwwLC4yNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS10b2RheTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTgpfS5tYXQtY2FsZW5kYXItYm9keS1pbi1yYW5nZTo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgyNDUsMTI0LDAsLjIpfS5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCwubWF0LWNhbGVuZGFyLWJvZHktaW4tY29tcGFyaXNvbi1yYW5nZTo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgyNDksMTcxLDAsLjIpfS5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1zdGFydDo6YmVmb3JlLFtkaXI9cnRsXSAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2UtZW5kOjpiZWZvcmV7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMjQ1LCAxMjQsIDAsIDAuMikgNTAlLCByZ2JhKDI0OSwgMTcxLCAwLCAwLjIpIDUwJSl9Lm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3JlLFtkaXI9cnRsXSAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2Utc3RhcnQ6OmJlZm9yZXtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byBsZWZ0LCByZ2JhKDI0NSwgMTI0LCAwLCAwLjIpIDUwJSwgcmdiYSgyNDksIDE3MSwgMCwgMC4yKSA1MCUpfS5tYXQtY2FsZW5kYXItYm9keS1pbi1yYW5nZT4ubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwsLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2UubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U6OmFmdGVye2JhY2tncm91bmQ6I2E4ZGFiNX0ubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQsLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2U+Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQ6IzQ2YTM1ZX0ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC40KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3Zlcj4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpLC5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlPi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCksLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZT4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjMpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50e2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWluLXJhbmdlOjpiZWZvcmV7YmFja2dyb3VuZDpyZ2JhKDI1NSwxNTIsMCwuMil9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwsLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktaW4tY29tcGFyaXNvbi1yYW5nZTo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgyNDksMTcxLDAsLjIpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLXN0YXJ0OjpiZWZvcmUsLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCBbZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDI1NSwgMTUyLCAwLCAwLjIpIDUwJSwgcmdiYSgyNDksIDE3MSwgMCwgMC4yKSA1MCUpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3JlLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgW2Rpcj1ydGxdIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1zdGFydDo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIGxlZnQsIHJnYmEoMjU1LCAxNTIsIDAsIDAuMikgNTAlLCByZ2JhKDI0OSwgMTcxLCAwLCAwLjIpIDUwJSl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U+Lm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2UubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U6OmFmdGVye2JhY2tncm91bmQ6I2E4ZGFiNX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCwubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kOiM0NmEzNWV9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQ+Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktY2VsbDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3Zlcj4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKSwubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U6OmJlZm9yZXtiYWNrZ3JvdW5kOnJnYmEoMjQ0LDY3LDU0LC4yKX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwsLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2U6OmJlZm9yZXtiYWNrZ3JvdW5kOnJnYmEoMjQ5LDE3MSwwLC4yKX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2Utc3RhcnQ6OmJlZm9yZSwubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiBbZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDI0NCwgNjcsIDU0LCAwLjIpIDUwJSwgcmdiYSgyNDksIDE3MSwgMCwgMC4yKSA1MCUpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1lbmQ6OmJlZm9yZSwubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiBbZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLXN0YXJ0OjpiZWZvcmV7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gbGVmdCwgcmdiYSgyNDQsIDY3LCA1NCwgMC4yKSA1MCUsIHJnYmEoMjQ5LCAxNzEsIDAsIDAuMikgNTAlKX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U+Lm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlLm1hdC1jYWxlbmRhci1ib2R5LWluLXJhbmdlOjphZnRlcntiYWNrZ3JvdW5kOiNhOGRhYjV9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kOiM0NmEzNWV9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGw6bm90KC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCk6aG92ZXI+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKSwubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZT4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC4zKX0ubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaHtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmV7Y29sb3I6I2Y1N2MwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtYWNjZW50e2NvbG9yOiNmZjk4MDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LXdhcm57Y29sb3I6I2Y0NDMzNn0ubWF0LWRhdGUtcmFuZ2UtaW5wdXQtaW5uZXJbZGlzYWJsZWRde2NvbG9yOiM3NTc1NzV9Lm1hdC1kaWFsb2ctY29udGFpbmVye2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRpdmlkZXJ7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1kaXZpZGVyLXZlcnRpY2Fse2JvcmRlci1yaWdodC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWx7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFjdGlvbi1yb3d7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksLm1hdC1leHBhbnNpb24tcGFuZWwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoLm1hdC1leHBhbmRlZCkgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyOmhvdmVyOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoLm1hdC1leHBhbmRlZCk6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI6aG92ZXJ7YmFja2dyb3VuZDojZmZmfX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGV7Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb24sLm1hdC1leHBhbnNpb24taW5kaWNhdG9yOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGUsLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0gLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9ue2NvbG9yOmluaGVyaXR9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVye2hlaWdodDo0OHB4fS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5tYXQtZXhwYW5kZWR7aGVpZ2h0OjY0cHh9Lm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtaGludHtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50e2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtd2Fybntjb2xvcjojZjQ0MzM2fS5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2Vye2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudHtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LXdhcm57YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LWFjY2VudCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWQ6bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtd2FybiAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnQsLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1lcnJvcntjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1oaW50e2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtZmxleHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1mbGV4e2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5le2NvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtYWNjZW50IC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtd2FybiAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtaW52YWxpZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5le2NvbG9yOnJnYmEoMCwwLDAsLjA2KX0ubWF0LWljb24ubWF0LXByaW1hcnl7Y29sb3I6I2Y1N2MwMH0ubWF0LWljb24ubWF0LWFjY2VudHtjb2xvcjojZmY5ODAwfS5tYXQtaWNvbi5tYXQtd2Fybntjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0IC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWlucHV0LWVsZW1lbnQ6ZGlzYWJsZWQsLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojNzU3NTc1fS5tYXQtaW5wdXQtZWxlbWVudHtjYXJldC1jb2xvcjojZjU3YzAwfS5tYXQtaW5wdXQtZWxlbWVudDo6cGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudDo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnQ6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWZvcm0tZmllbGQubWF0LWFjY2VudCAubWF0LWlucHV0LWVsZW1lbnR7Y2FyZXQtY29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LXdhcm4gLm1hdC1pbnB1dC1lbGVtZW50LC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtaW5wdXQtZWxlbWVudHtjYXJldC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1pdGVte2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LW9wdGlvbntjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlIC5tYXQtc3ViaGVhZGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1saXN0LWl0ZW0tZGlzYWJsZWR7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtbGlzdC1vcHRpb246aG92ZXIsLm1hdC1saXN0LW9wdGlvbjpmb2N1cywubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1pdGVtOmhvdmVyLC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LWl0ZW06Zm9jdXMsLm1hdC1hY3Rpb24tbGlzdCAubWF0LWxpc3QtaXRlbTpob3ZlciwubWF0LWFjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uLC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uOmhvdmVyLC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtbWVudS1wYW5lbHtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1tZW51LXBhbmVsOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtbWVudS1pdGVte2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6IzIxMjEyMX0ubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF0sLm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdIC5tYXQtbWVudS1zdWJtZW51LWljb24sLm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdIC5tYXQtaWNvbi1uby1jb2xvcntjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1tZW51LWl0ZW0gLm1hdC1pY29uLW5vLWNvbG9yLC5tYXQtbWVudS1zdWJtZW51LWljb257Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtbWVudS1pdGVtOmhvdmVyOm5vdChbZGlzYWJsZWRdKSwubWF0LW1lbnUtaXRlbS5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdChbZGlzYWJsZWRdKSwubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoW2Rpc2FibGVkXSksLm1hdC1tZW51LWl0ZW0taGlnaGxpZ2h0ZWQ6bm90KFtkaXNhYmxlZF0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtcGFnaW5hdG9ye2JhY2tncm91bmQ6I2ZmZn0ubWF0LXBhZ2luYXRvciwubWF0LXBhZ2luYXRvci1wYWdlLXNpemUgLm1hdC1zZWxlY3QtdHJpZ2dlcntjb2xvcjojNjE2MTYxfS5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudCwubWF0LXBhZ2luYXRvci1pbmNyZW1lbnR7Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpO2JvcmRlci1yaWdodDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtcGFnaW5hdG9yLWZpcnN0LC5tYXQtcGFnaW5hdG9yLWxhc3R7Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudCwubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnQsLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItZmlyc3QsLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItbGFzdHtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcGFnaW5hdG9yLWNvbnRhaW5lcnttaW4taGVpZ2h0OjU2cHh9Lm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZHtmaWxsOiNmZGRlYmZ9Lm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6I2ZkZGViZn0ubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudCAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5ke2ZpbGw6I2ZmZTViZn0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmU1YmZ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudCAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm4gLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZHtmaWxsOiNmY2QwY2R9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm4gLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6I2ZjZDBjZH0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1wcm9ncmVzcy1zcGlubmVyIGNpcmNsZSwubWF0LXNwaW5uZXIgY2lyY2xle3N0cm9rZTojZjU3YzAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50IGNpcmNsZSwubWF0LXNwaW5uZXIubWF0LWFjY2VudCBjaXJjbGV7c3Ryb2tlOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC13YXJuIGNpcmNsZSwubWF0LXNwaW5uZXIubWF0LXdhcm4gY2lyY2xle3N0cm9rZTojZjQ0MzM2fS5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmFkaW8taW5uZXItY2lyY2xlLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQ6bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnk6YWN0aXZlIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudCAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQ6bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50OmFjdGl2ZSAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZXtib3JkZXItY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2FybiAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2FybiAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuOmFjdGl2ZSAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8taW5uZXItY2lyY2xle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZCAubWF0LXJhZGlvLWxhYmVsLWNvbnRlbnR7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2VsZWN0LXZhbHVle2NvbG9yOiMyMTIxMjF9Lm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtc2VsZWN0LWRpc2FibGVkIC5tYXQtc2VsZWN0LXZhbHVle2NvbG9yOiM3NTc1NzV9Lm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6IzYxNjE2MX0ubWF0LXNlbGVjdC1wYW5lbHtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1zZWxlY3QtcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zZWxlY3QtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1wcmltYXJ5IC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm4gLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1pbnZhbGlkIC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZGlzYWJsZWQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6Izc1NzU3NX0ubWF0LWRyYXdlci1jb250YWluZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1wdXNoe2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWRyYXdlcjpub3QoLm1hdC1kcmF3ZXItc2lkZSl7Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kcmF3ZXItc2lkZXtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5ke2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdIC5tYXQtZHJhd2VyLXNpZGV7Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF0gLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZHtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLWJhY2tkcm9wLm1hdC1kcmF3ZXItc2hvd257YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC42KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZTpub3QoLm1hdC1jaGVja2VkKSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1wcmltYXJ5IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHtjb2xvcjojZmZmfS5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci1mb2N1cy1yaW5ne2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjIpfS5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7Y29sb3I6I2ZmZn0ubWF0LWFjY2VudCAubWF0LXNsaWRlci1mb2N1cy1yaW5ne2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjIpfS5tYXQtd2FybiAubWF0LXNsaWRlci10cmFjay1maWxsLC5tYXQtd2FybiAubWF0LXNsaWRlci10aHVtYiwubWF0LXdhcm4gLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtd2FybiAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e2NvbG9yOiNmZmZ9Lm1hdC13YXJuIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuMil9Lm1hdC1zbGlkZXI6aG92ZXIgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCwubWF0LXNsaWRlci5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmQsLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1kaXNhYmxlZDpob3ZlciAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZSAubWF0LXNsaWRlci1mb2N1cy1yaW5ne2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKSAubWF0LXNsaWRlci10aHVtYntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3ZlciAubWF0LXNsaWRlci10aHVtYiwubWF0LXNsaWRlci1taW4tdmFsdWU6bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1ie2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3Zlci5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWhhcy10aWNrcyAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlcntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuNyl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aWNrc3tiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6LW1vei1yZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KDAuMDAwMWRlZywgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdGlja3N7YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zdGVwLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZCwubWF0LXN0ZXAtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWQsLm1hdC1zdGVwLWhlYWRlcjpob3Zlcjpub3QoW2FyaWEtZGlzYWJsZWRdKSwubWF0LXN0ZXAtaGVhZGVyOmhvdmVyW2FyaWEtZGlzYWJsZWQ9ZmFsc2Vde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtc3RlcC1oZWFkZXI6aG92ZXJbYXJpYS1kaXNhYmxlZD10cnVlXXtjdXJzb3I6ZGVmYXVsdH1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtc3RlcC1oZWFkZXI6aG92ZXJ7YmFja2dyb3VuZDpub25lfX0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbCwubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1vcHRpb25hbHtjb2xvcjojNjE2MTYxfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb257YmFja2dyb3VuZC1jb2xvcjojNjE2MTYxO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZCwubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1pY29uLXN0YXRlLWRvbmUsLm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lZGl0e2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXIubWF0LWFjY2VudCAubWF0LXN0ZXAtaWNvbntjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXIubWF0LWFjY2VudCAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZCwubWF0LXN0ZXAtaGVhZGVyLm1hdC1hY2NlbnQgLm1hdC1zdGVwLWljb24tc3RhdGUtZG9uZSwubWF0LXN0ZXAtaGVhZGVyLm1hdC1hY2NlbnQgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdHtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyLm1hdC13YXJuIC5tYXQtc3RlcC1pY29ue2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlci5tYXQtd2FybiAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZCwubWF0LXN0ZXAtaGVhZGVyLm1hdC13YXJuIC5tYXQtc3RlcC1pY29uLXN0YXRlLWRvbmUsLm1hdC1zdGVwLWhlYWRlci5tYXQtd2FybiAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lZGl0e2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc3RhdGUtZXJyb3J7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWFjdGl2ZXtjb2xvcjojMjEyMTIxfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWVycm9ye2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwcGVyLWhvcml6b250YWwsLm1hdC1zdGVwcGVyLXZlcnRpY2Fse2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXN0ZXBwZXItdmVydGljYWwtbGluZTo6YmVmb3Jle2JvcmRlci1sZWZ0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXI6OmJlZm9yZSwubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXI6OmFmdGVyLC5tYXQtc3RlcHBlci1ob3Jpem9udGFsLWxpbmV7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVye2hlaWdodDo3MnB4fS5tYXQtc3RlcHBlci1sYWJlbC1wb3NpdGlvbi1ib3R0b20gLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyLC5tYXQtdmVydGljYWwtc3RlcHBlci1oZWFkZXJ7cGFkZGluZzoyNHB4IDI0cHh9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLWxpbmU6OmJlZm9yZXt0b3A6LTE2cHg7Ym90dG9tOi0xNnB4fS5tYXQtc3RlcHBlci1sYWJlbC1wb3NpdGlvbi1ib3R0b20gLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyOjphZnRlciwubWF0LXN0ZXBwZXItbGFiZWwtcG9zaXRpb24tYm90dG9tIC5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcjo6YmVmb3Jle3RvcDozNnB4fS5tYXQtc3RlcHBlci1sYWJlbC1wb3NpdGlvbi1ib3R0b20gLm1hdC1zdGVwcGVyLWhvcml6b250YWwtbGluZXt0b3A6MzZweH0ubWF0LXNvcnQtaGVhZGVyLWFycm93e2NvbG9yOiM2MTYxNjF9Lm1hdC10YWItbmF2LWJhciwubWF0LXRhYi1oZWFkZXJ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpfS5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlciAubWF0LXRhYi1uYXYtYmFyLC5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlciAubWF0LXRhYi1oZWFkZXJ7Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1ib3R0b206bm9uZX0ubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1saW5re2NvbG9yOiMyMTIxMjF9Lm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7Y29sb3I6Izc1NzU3NX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjojMjEyMTIxfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOiM3NTc1NzV9Lm1hdC10YWItZ3JvdXBbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV0gLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLW5hdi1iYXJbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV17Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci10b3A6bm9uZX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNjcsMzgsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5IC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC1pbmstYmFyLC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMjQsMTc4LC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC1pbmstYmFye2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC1pbmstYmFyLC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LWluay1iYXIsLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC1pbmstYmFyLC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNjcsMzgsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItbGluay1jb250YWluZXIsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGluaywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXRhYi1saW5re2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlciAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3Jle2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIyNCwxNzgsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmssLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmt7Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3JlLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmV7Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGluaywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXRhYi1saW5re2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3Jle2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRvb2xiYXJ7YmFja2dyb3VuZDojZjU3YzAwO2NvbG9yOiMyMTIxMjF9Lm1hdC10b29sYmFyLm1hdC1wcmltYXJ5e2JhY2tncm91bmQ6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtYWNjZW50e2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtd2FybntiYWNrZ3JvdW5kOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSwubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSwubWF0LXRvb2xiYXIgLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LXRvb2xiYXIgLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LXRvb2xiYXIgLm1hdC1zZWxlY3QtdmFsdWUsLm1hdC10b29sYmFyIC5tYXQtc2VsZWN0LWFycm93LC5tYXQtdG9vbGJhciAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6aW5oZXJpdH0ubWF0LXRvb2xiYXIgLm1hdC1pbnB1dC1lbGVtZW50e2NhcmV0LWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2xiYXItbXVsdGlwbGUtcm93c3ttaW4taGVpZ2h0OjY0cHh9Lm1hdC10b29sYmFyLXJvdywubWF0LXRvb2xiYXItc2luZ2xlLXJvd3toZWlnaHQ6NjRweH1AbWVkaWEobWF4LXdpZHRoOiA1OTlweCl7Lm1hdC10b29sYmFyLW11bHRpcGxlLXJvd3N7bWluLWhlaWdodDo1NnB4fS5tYXQtdG9vbGJhci1yb3csLm1hdC10b29sYmFyLXNpbmdsZS1yb3d7aGVpZ2h0OjU2cHh9fS5tYXQtdG9vbHRpcHtiYWNrZ3JvdW5kOnJnYmEoOTcsOTcsOTcsLjkpfS5tYXQtdHJlZXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10cmVlLW5vZGUsLm1hdC1uZXN0ZWQtdHJlZS1ub2Rle2NvbG9yOiMyMTIxMjF9Lm1hdC10cmVlLW5vZGV7bWluLWhlaWdodDo0OHB4fS5tYXQtc25hY2stYmFyLWNvbnRhaW5lcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KTtiYWNrZ3JvdW5kOiMzMjMyMzI7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbntjb2xvcjojZmY5ODAwfWJvZHl7b3ZlcmZsb3c6aGlkZGVufS5jZGstb3ZlcmxheS1jb250YWluZXJ7Y29udGFpbjpzdHJpY3R9YTpub3QoLm1hdC1idXR0b24sLm1hdC1pY29uLWJ1dHRvbil7Y29sb3I6IzE5NzZkMn1hOm5vdCgubWF0LWJ1dHRvbiwubWF0LWljb24tYnV0dG9uKTp2aXNpdGVke2NvbG9yOiM3YjFmYTJ9Ym9keS5kYXJrLW1vZGV7YmFja2dyb3VuZC1jb2xvcjojMzAzMDMwfWJvZHkuZGFyay1tb2RlIGE6bm90KC5tYXQtYnV0dG9uLC5tYXQtaWNvbi1idXR0b24pe2NvbG9yOiM0MmE1ZjV9Ym9keS5kYXJrLW1vZGUgYTpub3QoLm1hdC1idXR0b24sLm1hdC1pY29uLWJ1dHRvbik6dmlzaXRlZHtjb2xvcjojYmE2OGM4fWJvZHkuZGFyay1tb2RlIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX1ib2R5LmRhcmstbW9kZSAubWF0LW9wdGlvbntjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtb3B0aW9uOmhvdmVyOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC1vcHRpb246Zm9jdXM6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjA0KX1ib2R5LmRhcmstbW9kZSAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMDQpfWJvZHkuZGFyay1tb2RlIC5tYXQtb3B0aW9uLm1hdC1hY3RpdmV7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wNCk7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LW9wdGlvbi5tYXQtb3B0aW9uLWRpc2FibGVke2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjUpfWJvZHkuZGFyay1tb2RlIC5tYXQtcHJpbWFyeSAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtYWNjZW50IC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC13YXJuIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1vcHRncm91cC1sYWJlbHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LW9wdGdyb3VwLWRpc2FibGVkIC5tYXQtb3B0Z3JvdXAtbGFiZWx7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1wc2V1ZG8tY2hlY2tib3h7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1wc2V1ZG8tY2hlY2tib3g6OmFmdGVye2NvbG9yOiMzMDMwMzB9Ym9keS5kYXJrLW1vZGUgLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWR7Y29sb3I6IzY4Njg2OH1ib2R5LmRhcmstbW9kZSAubWF0LXByaW1hcnkgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCxib2R5LmRhcmstbW9kZSAubWF0LXByaW1hcnkgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZXtiYWNrZ3JvdW5kOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCxib2R5LmRhcmstbW9kZSAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLGJvZHkuZGFyay1tb2RlIC5tYXQtYWNjZW50IC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1hY2NlbnQgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZXtiYWNrZ3JvdW5kOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC13YXJuIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsYm9keS5kYXJrLW1vZGUgLm1hdC13YXJuIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGV7YmFja2dyb3VuZDojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWR7YmFja2dyb3VuZDojNjg2ODY4fWJvZHkuZGFyay1tb2RlIC5tYXQtYXBwLWJhY2tncm91bmQsYm9keS5kYXJrLW1vZGUubWF0LWFwcC1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6IzMwMzAzMDtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtZWxldmF0aW9uLXowe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWVsZXZhdGlvbi16MXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZWxldmF0aW9uLXoye2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejN7Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWVsZXZhdGlvbi16NHtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWVsZXZhdGlvbi16NXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA1cHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWVsZXZhdGlvbi16Nntib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejd7Ym94LXNoYWRvdzowcHggNHB4IDVweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggN3B4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDJweCAxNnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZWxldmF0aW9uLXo4e2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWVsZXZhdGlvbi16OXtib3gtc2hhZG93OjBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA5cHggMTJweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejEwe2JveC1zaGFkb3c6MHB4IDZweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEwcHggMTRweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDE4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejExe2JveC1zaGFkb3c6MHB4IDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDExcHggMTVweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDIwcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejEye2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejEze2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEzcHggMTlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI0cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejE0e2JveC1zaGFkb3c6MHB4IDdweCA5cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE0cHggMjFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI2cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejE1e2JveC1zaGFkb3c6MHB4IDhweCA5cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE1cHggMjJweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDI4cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejE2e2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZWxldmF0aW9uLXoxN3tib3gtc2hhZG93OjBweCA4cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTdweCAyNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWVsZXZhdGlvbi16MTh7Ym94LXNoYWRvdzowcHggOXB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE4cHggMjhweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejE5e2JveC1zaGFkb3c6MHB4IDlweCAxMnB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOXB4IDI5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZWxldmF0aW9uLXoyMHtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIwcHggMzFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDM4cHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejIxe2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjFweCAzM3B4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDBweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWVsZXZhdGlvbi16MjJ7Ym94LXNoYWRvdzowcHggMTBweCAxNHB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMnB4IDM1cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MnB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZWxldmF0aW9uLXoyM3tib3gtc2hhZG93OjBweCAxMXB4IDE0cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIzcHggMzZweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejI0e2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXRoZW1lLWxvYWRlZC1tYXJrZXJ7ZGlzcGxheTpub25lfWJvZHkuZGFyay1tb2RlIC5tYXQtYXV0b2NvbXBsZXRlLXBhbmVse2JhY2tncm91bmQ6IzQyNDI0Mjtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpe2JhY2tncm91bmQ6IzQyNDI0Mn1ib2R5LmRhcmstbW9kZSAubWF0LWF1dG9jb21wbGV0ZS1wYW5lbCAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1iYWRnZS1jb250ZW50e2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZWY2YzAwfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgYm9keS5kYXJrLW1vZGUgLm1hdC1iYWRnZS1jb250ZW50e291dGxpbmU6c29saWQgMXB4O2JvcmRlci1yYWRpdXM6MH1ib2R5LmRhcmstbW9kZSAubWF0LWJhZGdlLWFjY2VudCAubWF0LWJhZGdlLWNvbnRlbnR7YmFja2dyb3VuZDojZWY2YzAwO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1iYWRnZS13YXJuIC5tYXQtYmFkZ2UtY29udGVudHtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWJhZGdlLWRpc2FibGVkIC5tYXQtYmFkZ2UtY29udGVudHtiYWNrZ3JvdW5kOiM2ZTZlNmU7Y29sb3I6IzYxNjE2MX1ib2R5LmRhcmstbW9kZSAubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJ7Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojNDI0MjQyO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24sYm9keS5kYXJrLW1vZGUgLm1hdC1pY29uLWJ1dHRvbixib2R5LmRhcmstbW9kZSAubWF0LXN0cm9rZWQtYnV0dG9ue2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDp0cmFuc3BhcmVudH1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeSxib2R5LmRhcmstbW9kZSAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5LGJvZHkuZGFyay1tb2RlIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnl7Y29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi5tYXQtYWNjZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudCxib2R5LmRhcmstbW9kZSAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnR7Y29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi5tYXQtd2Fybixib2R5LmRhcmstbW9kZSAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuLGJvZHkuZGFyay1tb2RlIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm57Y29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi5tYXQtd2Fybi5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLm1hdC1idXR0b24tZGlzYWJsZWQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybi5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtaWNvbi1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSxib2R5LmRhcmstbW9kZSAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksYm9keS5kYXJrLW1vZGUgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksYm9keS5kYXJrLW1vZGUgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksYm9keS5kYXJrLW1vZGUgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLm1hdC13YXJuIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksYm9keS5kYXJrLW1vZGUgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LGJvZHkuZGFyay1tb2RlIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm4gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LGJvZHkuZGFyay1tb2RlIC5tYXQtaWNvbi1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LGJvZHkuZGFyay1tb2RlIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24gLm1hdC1yaXBwbGUtZWxlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LWljb24tYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1zdHJva2VkLWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50e29wYWNpdHk6LjE7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1zdHJva2VkLWJ1dHRvbjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbixib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b24sYm9keS5kYXJrLW1vZGUgLm1hdC1mYWIsYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzQyNDI0Mn1ib2R5LmRhcmstbW9kZSAubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5LGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeSxib2R5LmRhcmstbW9kZSAubWF0LWZhYi5tYXQtcHJpbWFyeSxib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5e2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtZmFiLm1hdC1hY2NlbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50e2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybixib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4sYm9keS5kYXJrLW1vZGUgLm1hdC1mYWIubWF0LXdhcm4sYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtd2Fybntjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4ubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtZmFiLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1mYWIubWF0LWFjY2VudC5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtZmFiLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1mYWIubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeSxib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnksYm9keS5kYXJrLW1vZGUgLm1hdC1mYWIubWF0LXByaW1hcnksYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtZmFiLm1hdC1hY2NlbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50e2JhY2tncm91bmQtY29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuLGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybixib2R5LmRhcmstbW9kZSAubWF0LWZhYi5tYXQtd2Fybixib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiLm1hdC13YXJue2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybi5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtZmxhdC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1idXR0b24tZGlzYWJsZWQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LWZhYi5tYXQtcHJpbWFyeS5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtZmFiLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LWZhYi5tYXQtd2Fybi5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtZmFiLm1hdC1idXR0b24tZGlzYWJsZWQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtd2Fybi5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtbWluaS1mYWIubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVke2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LWZhYi5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfWJvZHkuZGFyay1tb2RlIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1mYWIubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtZmFiLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zdHJva2VkLWJ1dHRvbjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSxib2R5LmRhcmstbW9kZSAubWF0LWZsYXQtYnV0dG9uOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b246bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b246bm90KC5tYXQtYnV0dG9uLWRpc2FibGVkKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWZhYjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSxib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWZhYjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSxib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiOm5vdCgubWF0LWJ1dHRvbi1kaXNhYmxlZCk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1mYWIubWF0LWJ1dHRvbi1kaXNhYmxlZDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSxib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiLm1hdC1idXR0b24tZGlzYWJsZWQ6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLGJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cHtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQsYm9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmR7Ym94LXNoYWRvdzpub25lfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC41KX1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi10b2dnbGUgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmR7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiM0MjQyNDJ9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtYnV0dG9uLXRvZ2dsZSsubWF0LWJ1dHRvbi10b2dnbGV7Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjEyKX1ib2R5LmRhcmstbW9kZSBbZGlyPXJ0bF0gLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlKy5tYXQtYnV0dG9uLXRvZ2dsZXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgyNTUsMjU1LDI1NSwuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1idXR0b24tdG9nZ2xlLXZlcnRpY2FsIC5tYXQtYnV0dG9uLXRvZ2dsZSsubWF0LWJ1dHRvbi10b2dnbGV7Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6bm9uZTtib3JkZXItdG9wOnNvbGlkIDFweCByZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWR7YmFja2dyb3VuZC1jb2xvcjojMjEyMTIxO2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmR7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMyk7YmFja2dyb3VuZC1jb2xvcjojMDAwfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJke2JhY2tncm91bmQ6IzQyNDI0Mn1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZHtiYWNrZ3JvdW5kLWNvbG9yOiM0MjQyNDJ9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCxib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZHtib3JkZXI6c29saWQgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWNhcmR7YmFja2dyb3VuZDojNDI0MjQyO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1jYXJkOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1jYXJkLm1hdC1jYXJkLWZsYXQ6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FyZC1zdWJ0aXRsZXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWNoZWNrYm94LWZyYW1le2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWNoZWNrYm94LWNoZWNrbWFya3tmaWxsOiMzMDMwMzB9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHtzdHJva2U6IzMwMzAzMCAhaW1wb3J0YW50fWJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3gtbWl4ZWRtYXJre2JhY2tncm91bmQtY29sb3I6IzMwMzAzMH1ib2R5LmRhcmstbW9kZSAubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXByaW1hcnkgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLGJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtcHJpbWFyeSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtYWNjZW50IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCxib2R5LmRhcmstbW9kZSAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudCAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtd2FybiAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsYm9keS5kYXJrLW1vZGUgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC13YXJuIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtY2hlY2tlZCAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsYm9keS5kYXJrLW1vZGUgLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojNjg2ODY4fWJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3gtZGlzYWJsZWQ6bm90KC5tYXQtY2hlY2tib3gtY2hlY2tlZCkgLm1hdC1jaGVja2JveC1mcmFtZXtib3JkZXItY29sb3I6IzY4Njg2OH1ib2R5LmRhcmstbW9kZSAubWF0LWNoZWNrYm94LWRpc2FibGVkIC5tYXQtY2hlY2tib3gtbGFiZWx7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGVja2JveCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWNoZWNrYm94LWNoZWNrZWQ6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1jaGVja2JveDphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZDojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3gtY2hlY2tlZDpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3g6YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZDojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3gtY2hlY2tlZDpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LWNoZWNrYm94OmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwe2JhY2tncm91bmQtY29sb3I6IzYxNjE2MTtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcCAubWF0LWNoaXAtcmVtb3Zle2NvbG9yOiNmZmY7b3BhY2l0eTouNH1ib2R5LmRhcmstbW9kZSAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXA6bm90KC5tYXQtY2hpcC1kaXNhYmxlZCk6YWN0aXZle2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpIC5tYXQtY2hpcC1yZW1vdmU6aG92ZXJ7b3BhY2l0eTouNTR9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLWRpc2FibGVke29wYWNpdHk6LjR9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwOjphZnRlcntiYWNrZ3JvdW5kOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5e2JhY2tncm91bmQtY29sb3I6I2VmNmMwMDtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeSAubWF0LWNoaXAtcmVtb3Zle2NvbG9yOiNmZmY7b3BhY2l0eTouNH1ib2R5LmRhcmstbW9kZSAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2FybntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm4gLm1hdC1jaGlwLXJlbW92ZXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX1ib2R5LmRhcmstbW9kZSAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudHtiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDA7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudCAubWF0LWNoaXAtcmVtb3Zle2NvbG9yOiNmZmY7b3BhY2l0eTouNH1ib2R5LmRhcmstbW9kZSAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWJsZXtiYWNrZ3JvdW5kOiM0MjQyNDJ9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWJsZSB0aGVhZCxib2R5LmRhcmstbW9kZSAubWF0LXRhYmxlIHRib2R5LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFibGUgdGZvb3QsYm9keS5kYXJrLW1vZGUgbWF0LWhlYWRlci1yb3csYm9keS5kYXJrLW1vZGUgbWF0LXJvdyxib2R5LmRhcmstbW9kZSBtYXQtZm9vdGVyLXJvdyxib2R5LmRhcmstbW9kZSBbbWF0LWhlYWRlci1yb3ddLGJvZHkuZGFyay1tb2RlIFttYXQtcm93XSxib2R5LmRhcmstbW9kZSBbbWF0LWZvb3Rlci1yb3ddLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFibGUtc3RpY2t5e2JhY2tncm91bmQ6aW5oZXJpdH1ib2R5LmRhcmstbW9kZSBtYXQtcm93LGJvZHkuZGFyay1tb2RlIG1hdC1oZWFkZXItcm93LGJvZHkuZGFyay1tb2RlIG1hdC1mb290ZXItcm93LGJvZHkuZGFyay1tb2RlIHRoLm1hdC1oZWFkZXItY2VsbCxib2R5LmRhcmstbW9kZSB0ZC5tYXQtY2VsbCxib2R5LmRhcmstbW9kZSB0ZC5tYXQtZm9vdGVyLWNlbGx7Ym9yZGVyLWJvdHRvbS1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1oZWFkZXItY2VsbHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWNlbGwsYm9keS5kYXJrLW1vZGUgLm1hdC1mb290ZXItY2VsbHtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYXJyb3d7ZmlsbDojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci10b2dnbGUsYm9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQgLm1hdC1jYWxlbmRhci1uZXh0LWJ1dHRvbixib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbntjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjUpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyLWRpdmlkZXI6OmFmdGVye2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYm9keS1sYWJlbHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZS1yYW5nZS1pbnB1dC1zZXBhcmF0b3J7Y29sb3I6I2ZmZjtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9Ym9keS5kYXJrLW1vZGUgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCl7Y29sb3I6IzYxNjE2MX1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1kYXRlLXJhbmdlLWlucHV0LXNlcGFyYXRvcntjb2xvcjojNjE2MTYxfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYm9keS1pbi1wcmV2aWV3e2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjI0KX1ib2R5LmRhcmstbW9kZSAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCl7Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjUpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCl7Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjMpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYm9keS1pbi1yYW5nZTo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgyMzksMTA4LDAsLjIpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCxib2R5LmRhcmstbW9kZSAubWF0LWNhbGVuZGFyLWJvZHktaW4tY29tcGFyaXNvbi1yYW5nZTo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgyNDksMTcxLDAsLjIpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1zdGFydDo6YmVmb3JlLGJvZHkuZGFyay1tb2RlIFtkaXI9cnRsXSAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2UtZW5kOjpiZWZvcmV7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMjM5LCAxMDgsIDAsIDAuMikgNTAlLCByZ2JhKDI0OSwgMTcxLCAwLCAwLjIpIDUwJSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3JlLGJvZHkuZGFyay1tb2RlIFtkaXI9cnRsXSAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2Utc3RhcnQ6OmJlZm9yZXtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byBsZWZ0LCByZ2JhKDIzOSwgMTA4LCAwLCAwLjIpIDUwJSwgcmdiYSgyNDksIDE3MSwgMCwgMC4yKSA1MCUpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYm9keS1pbi1yYW5nZT4ubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwsYm9keS5kYXJrLW1vZGUgLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2UubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U6OmFmdGVye2JhY2tncm91bmQ6I2E4ZGFiNX1ib2R5LmRhcmstbW9kZSAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2U+Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQ6IzQ2YTM1ZX1ib2R5LmRhcmstbW9kZSAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjM5LDEwOCwwLC40KX1ib2R5LmRhcmstbW9kZSAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWNhbGVuZGFyLWJvZHktY2VsbDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3Zlcj4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpLGJvZHkuZGFyay1tb2RlIC5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlPi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCksYm9keS5kYXJrLW1vZGUgLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZT4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyMzksMTA4LDAsLjMpfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50e2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6IzQyNDI0Mjtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWluLXJhbmdlOjpiZWZvcmV7YmFja2dyb3VuZDpyZ2JhKDIzOSwxMDgsMCwuMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwsYm9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktaW4tY29tcGFyaXNvbi1yYW5nZTo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgyNDksMTcxLDAsLjIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLXN0YXJ0OjpiZWZvcmUsYm9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCBbZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDIzOSwgMTA4LCAwLCAwLjIpIDUwJSwgcmdiYSgyNDksIDE3MSwgMCwgMC4yKSA1MCUpfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3JlLGJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgW2Rpcj1ydGxdIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1zdGFydDo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIGxlZnQsIHJnYmEoMjM5LCAxMDgsIDAsIDAuMikgNTAlLCByZ2JhKDI0OSwgMTcxLCAwLCAwLjIpIDUwJSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U+Lm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsLGJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2UubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U6OmFmdGVye2JhY2tncm91bmQ6I2E4ZGFiNX1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCxib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kOiM0NmEzNWV9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQ+Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6cmdiYSgyMzksMTA4LDAsLjQpfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktY2VsbDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3Zlcj4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpLGJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKSxib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjM5LDEwOCwwLC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U6OmJlZm9yZXtiYWNrZ3JvdW5kOnJnYmEoMjQ0LDY3LDU0LC4yKX1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwsYm9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2U6OmJlZm9yZXtiYWNrZ3JvdW5kOnJnYmEoMjQ5LDE3MSwwLC4yKX1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2Utc3RhcnQ6OmJlZm9yZSxib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiBbZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDI0NCwgNjcsIDU0LCAwLjIpIDUwJSwgcmdiYSgyNDksIDE3MSwgMCwgMC4yKSA1MCUpfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1lbmQ6OmJlZm9yZSxib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiBbZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLXN0YXJ0OjpiZWZvcmV7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gbGVmdCwgcmdiYSgyNDQsIDY3LCA1NCwgMC4yKSA1MCUsIHJnYmEoMjQ5LCAxNzEsIDAsIDAuMikgNTAlKX1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U+Lm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsLGJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlLm1hdC1jYWxlbmRhci1ib2R5LWluLXJhbmdlOjphZnRlcntiYWNrZ3JvdW5kOiNhOGRhYjV9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kOiM0NmEzNWV9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGw6bm90KC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCk6aG92ZXI+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKSxib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZT4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpLGJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaHtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmV7Y29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtYWNjZW50e2NvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LXdhcm57Y29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGUtcmFuZ2UtaW5wdXQtaW5uZXJbZGlzYWJsZWRde2NvbG9yOiM2MTYxNjF9Ym9keS5kYXJrLW1vZGUgLm1hdC1kaWFsb2ctY29udGFpbmVye2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiM0MjQyNDI7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWRpdmlkZXJ7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1kaXZpZGVyLXZlcnRpY2Fse2JvcmRlci1yaWdodC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1leHBhbnNpb24tcGFuZWx7YmFja2dyb3VuZDojNDI0MjQyO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1leHBhbnNpb24tcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWFjdGlvbi1yb3d7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1leHBhbnNpb24tcGFuZWwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksYm9keS5kYXJrLW1vZGUgLm1hdC1leHBhbnNpb24tcGFuZWwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSxib2R5LmRhcmstbW9kZSAubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoLm1hdC1leHBhbmRlZCkgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyOmhvdmVyOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSl7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXtib2R5LmRhcmstbW9kZSAubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoLm1hdC1leHBhbmRlZCk6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI6aG92ZXJ7YmFja2dyb3VuZDojNDI0MjQyfX1ib2R5LmRhcmstbW9kZSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGV7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb24sYm9keS5kYXJrLW1vZGUgLm1hdC1leHBhbnNpb24taW5kaWNhdG9yOjphZnRlcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGUsYm9keS5kYXJrLW1vZGUgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0gLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9ue2NvbG9yOmluaGVyaXR9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfWJvZHkuZGFyay1tb2RlIC5tYXQtaGludHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50e2NvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtd2Fybntjb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2Vye2NvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC13YXJue2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZDpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZDpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC1hY2NlbnQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LXdhcm4gLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1sYWJlbCAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2Vye2NvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSxib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtZXJyb3J7Y29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWhpbnR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpIDAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNykgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNykgMCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtZmxleHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWZsZXh7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4wNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC41KX1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjojNjE2MTYxfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LWFjY2VudCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LXdhcm4gLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7Y29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOiM2MTYxNjF9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1pY29uLm1hdC1wcmltYXJ5e2NvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1pY29uLm1hdC1hY2NlbnR7Y29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LWljb24ubWF0LXdhcm57Y29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfWJvZHkuZGFyay1tb2RlIC5tYXQtaW5wdXQtZWxlbWVudDpkaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOiM2MTYxNjF9Ym9keS5kYXJrLW1vZGUgLm1hdC1pbnB1dC1lbGVtZW50e2NhcmV0LWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1pbnB1dC1lbGVtZW50OjpwbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC41KX1ib2R5LmRhcmstbW9kZSAubWF0LWlucHV0LWVsZW1lbnQ6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjUpfWJvZHkuZGFyay1tb2RlIC5tYXQtaW5wdXQtZWxlbWVudDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1pbnB1dC1lbGVtZW50IG9wdGlvbntjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1pbnB1dC1lbGVtZW50IG9wdGlvbjpkaXNhYmxlZHtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLm1hdC1hY2NlbnQgLm1hdC1pbnB1dC1lbGVtZW50e2NhcmV0LWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLm1hdC13YXJuIC5tYXQtaW5wdXQtZWxlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWlucHV0LWVsZW1lbnR7Y2FyZXQtY29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWxpc3QtYmFzZSAubWF0LWxpc3QtaXRlbXtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1vcHRpb257Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWxpc3QtYmFzZSAubWF0LXN1YmhlYWRlcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWxpc3QtaXRlbS1kaXNhYmxlZHtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1saXN0LW9wdGlvbjpob3Zlcixib2R5LmRhcmstbW9kZSAubWF0LWxpc3Qtb3B0aW9uOmZvY3VzLGJvZHkuZGFyay1tb2RlIC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LWl0ZW06aG92ZXIsYm9keS5kYXJrLW1vZGUgLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbTpmb2N1cyxib2R5LmRhcmstbW9kZSAubWF0LWFjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtOmhvdmVyLGJvZHkuZGFyay1tb2RlIC5tYXQtYWN0aW9uLWxpc3QgLm1hdC1saXN0LWl0ZW06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wNCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb24sYm9keS5kYXJrLW1vZGUgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb246aG92ZXIsYm9keS5kYXJrLW1vZGUgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb246Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1tZW51LXBhbmVse2JhY2tncm91bmQ6IzQyNDI0Mn1ib2R5LmRhcmstbW9kZSAubWF0LW1lbnUtcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1tZW51LWl0ZW17YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXSxib2R5LmRhcmstbW9kZSAubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF0gLm1hdC1tZW51LXN1Ym1lbnUtaWNvbixib2R5LmRhcmstbW9kZSAubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF0gLm1hdC1pY29uLW5vLWNvbG9ye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjUpfWJvZHkuZGFyay1tb2RlIC5tYXQtbWVudS1pdGVtIC5tYXQtaWNvbi1uby1jb2xvcixib2R5LmRhcmstbW9kZSAubWF0LW1lbnUtc3VibWVudS1pY29ue2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1tZW51LWl0ZW06aG92ZXI6bm90KFtkaXNhYmxlZF0pLGJvZHkuZGFyay1tb2RlIC5tYXQtbWVudS1pdGVtLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KFtkaXNhYmxlZF0pLGJvZHkuZGFyay1tb2RlIC5tYXQtbWVudS1pdGVtLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdChbZGlzYWJsZWRdKSxib2R5LmRhcmstbW9kZSAubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZDpub3QoW2Rpc2FibGVkXSl7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wNCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1wYWdpbmF0b3J7YmFja2dyb3VuZDojNDI0MjQyfWJvZHkuZGFyay1tb2RlIC5tYXQtcGFnaW5hdG9yLGJvZHkuZGFyay1tb2RlIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSAubWF0LXNlbGVjdC10cmlnZ2Vye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfWJvZHkuZGFyay1tb2RlIC5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnR7Ym9yZGVyLXRvcDoycHggc29saWQgI2ZmZjtib3JkZXItcmlnaHQ6MnB4IHNvbGlkICNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1wYWdpbmF0b3ItZmlyc3QsYm9keS5kYXJrLW1vZGUgLm1hdC1wYWdpbmF0b3ItbGFzdHtib3JkZXItdG9wOjJweCBzb2xpZCAjZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItZmlyc3QsYm9keS5kYXJrLW1vZGUgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItbGFzdHtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZHtmaWxsOiM2MDNmMjR9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6IzYwM2YyNH1ib2R5LmRhcmstbW9kZSAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudCAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5ke2ZpbGw6IzYwM2YyNH1ib2R5LmRhcmstbW9kZSAubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcntiYWNrZ3JvdW5kLWNvbG9yOiM2MDNmMjR9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudCAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm4gLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZHtmaWxsOiM2MTM1MzJ9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm4gLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6IzYxMzUzMn1ib2R5LmRhcmstbW9kZSAubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1zcGlubmVyIGNpcmNsZSxib2R5LmRhcmstbW9kZSAubWF0LXNwaW5uZXIgY2lyY2xle3N0cm9rZTojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50IGNpcmNsZSxib2R5LmRhcmstbW9kZSAubWF0LXNwaW5uZXIubWF0LWFjY2VudCBjaXJjbGV7c3Ryb2tlOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC13YXJuIGNpcmNsZSxib2R5LmRhcmstbW9kZSAubWF0LXNwaW5uZXIubWF0LXdhcm4gY2lyY2xle3N0cm9rZTojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZXtib3JkZXItY29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSxib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSxib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlLGJvZHkuZGFyay1tb2RlIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5OmFjdGl2ZSAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1yYWRpby1pbm5lci1jaXJjbGUsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudCAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSxib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudDphY3RpdmUgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4gLm1hdC1yYWRpby1pbm5lci1jaXJjbGUsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4gLm1hdC1yYWRpby1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudDpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksYm9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSxib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2FybjphY3RpdmUgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkLm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlLGJvZHkuZGFyay1tb2RlIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8taW5uZXItY2lyY2xle2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tbGFiZWwtY29udGVudHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC41KX1ib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXNlbGVjdC12YWx1ZXtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtc2VsZWN0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjUpfWJvZHkuZGFyay1tb2RlIC5tYXQtc2VsZWN0LWRpc2FibGVkIC5tYXQtc2VsZWN0LXZhbHVle2NvbG9yOiM2MTYxNjF9Ym9keS5kYXJrLW1vZGUgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zZWxlY3QtcGFuZWx7YmFja2dyb3VuZDojNDI0MjQyfWJvZHkuZGFyay1tb2RlIC5tYXQtc2VsZWN0LXBhbmVsOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtc2VsZWN0LXBhbmVsIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpe2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtcHJpbWFyeSAubWF0LXNlbGVjdC1hcnJvd3tjb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtYWNjZW50IC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC13YXJuIC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtaW52YWxpZCAubWF0LXNlbGVjdC1hcnJvd3tjb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZCAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWRpc2FibGVkIC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiM2MTYxNjF9Ym9keS5kYXJrLW1vZGUgLm1hdC1kcmF3ZXItY29udGFpbmVye2JhY2tncm91bmQtY29sb3I6IzMwMzAzMDtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtZHJhd2Vye2JhY2tncm91bmQtY29sb3I6IzQyNDI0Mjtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtZHJhd2VyLm1hdC1kcmF3ZXItcHVzaHtiYWNrZ3JvdW5kLWNvbG9yOiM0MjQyNDJ9Ym9keS5kYXJrLW1vZGUgLm1hdC1kcmF3ZXI6bm90KC5tYXQtZHJhd2VyLXNpZGUpe2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZHJhd2VyLXNpZGV7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZHtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgyNTUsMjU1LDI1NSwuMTIpO2JvcmRlci1yaWdodDpub25lfWJvZHkuZGFyay1tb2RlIFtkaXI9cnRsXSAubWF0LWRyYXdlci1zaWRle2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDI1NSwyNTUsMjU1LC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9Ym9keS5kYXJrLW1vZGUgW2Rpcj1ydGxdIC5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmR7Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWRyYXdlci1iYWNrZHJvcC5tYXQtZHJhd2VyLXNob3due2JhY2tncm91bmQtY29sb3I6cmdiYSgxODksMTg5LDE4OSwuNil9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjM5LDEwOCwwLC41NCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjM5LDEwOCwwLC41NCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC41NCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGU6bm90KC5tYXQtY2hlY2tlZCkgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNiZGJkYmR9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjMpfWJvZHkuZGFyay1tb2RlIC5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci10cmFjay1maWxsLGJvZHkuZGFyay1tb2RlIC5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci10aHVtYixib2R5LmRhcmstbW9kZSAubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcmltYXJ5IC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDIzOSwxMDgsMCwuMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdHJhY2stZmlsbCxib2R5LmRhcmstbW9kZSAubWF0LWFjY2VudCAubWF0LXNsaWRlci10aHVtYixib2R5LmRhcmstbW9kZSAubWF0LWFjY2VudCAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDIzOSwxMDgsMCwuMil9Ym9keS5kYXJrLW1vZGUgLm1hdC13YXJuIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsYm9keS5kYXJrLW1vZGUgLm1hdC13YXJuIC5tYXQtc2xpZGVyLXRodW1iLGJvZHkuZGFyay1tb2RlIC5tYXQtd2FybiAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC13YXJuIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXdhcm4gLm1hdC1zbGlkZXItZm9jdXMtcmluZ3tiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC4yKX1ib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlcjpob3ZlciAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kLGJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGVyLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kLGJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsYm9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlci1kaXNhYmxlZDpob3ZlciAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZXItbWluLXZhbHVlIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyAubWF0LXNsaWRlci10aHVtYixib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JhY2tncm91bmQtY29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLGJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlci1taW4tdmFsdWU6bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpIC5tYXQtc2xpZGVyLXRodW1ie2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4zKTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fWJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIgLm1hdC1zbGlkZXItdGh1bWIsYm9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3Zlci5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRodW1iLGJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZXItaGFzLXRpY2tzIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVye2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRpY2tze2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotbW96LXJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQoMC4wMDAxZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX1ib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aWNrc3tiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX1ib2R5LmRhcmstbW9kZSAubWF0LXN0ZXAtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkLGJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZCxib2R5LmRhcmstbW9kZSAubWF0LXN0ZXAtaGVhZGVyOmhvdmVyOm5vdChbYXJpYS1kaXNhYmxlZF0pLGJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXI6aG92ZXJbYXJpYS1kaXNhYmxlZD1mYWxzZV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4wNCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zdGVwLWhlYWRlcjpob3ZlclthcmlhLWRpc2FibGVkPXRydWVde2N1cnNvcjpkZWZhdWx0fUBtZWRpYShob3Zlcjogbm9uZSl7Ym9keS5kYXJrLW1vZGUgLm1hdC1zdGVwLWhlYWRlcjpob3ZlcntiYWNrZ3JvdW5kOm5vbmV9fWJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWxhYmVsLGJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLW9wdGlvbmFse2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfWJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb257YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KTtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc2VsZWN0ZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lLGJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdHtiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDA7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXN0ZXAtaGVhZGVyLm1hdC1hY2NlbnQgLm1hdC1zdGVwLWljb257Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXN0ZXAtaGVhZGVyLm1hdC1hY2NlbnQgLm1hdC1zdGVwLWljb24tc2VsZWN0ZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1zdGVwLWhlYWRlci5tYXQtYWNjZW50IC5tYXQtc3RlcC1pY29uLXN0YXRlLWRvbmUsYm9keS5kYXJrLW1vZGUgLm1hdC1zdGVwLWhlYWRlci5tYXQtYWNjZW50IC5tYXQtc3RlcC1pY29uLXN0YXRlLWVkaXR7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1zdGVwLWhlYWRlci5tYXQtd2FybiAubWF0LXN0ZXAtaWNvbntjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIubWF0LXdhcm4gLm1hdC1zdGVwLWljb24tc2VsZWN0ZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1zdGVwLWhlYWRlci5tYXQtd2FybiAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lLGJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIubWF0LXdhcm4gLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9ye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1hY3RpdmV7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1lcnJvcntjb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsLGJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcHBlci12ZXJ0aWNhbHtiYWNrZ3JvdW5kLWNvbG9yOiM0MjQyNDJ9Ym9keS5kYXJrLW1vZGUgLm1hdC1zdGVwcGVyLXZlcnRpY2FsLWxpbmU6OmJlZm9yZXtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyOjpiZWZvcmUsYm9keS5kYXJrLW1vZGUgLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyOjphZnRlcixib2R5LmRhcmstbW9kZSAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbC1saW5le2JvcmRlci10b3AtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtc29ydC1oZWFkZXItYXJyb3d7Y29sb3I6I2M2YzZjNn1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWhlYWRlcntib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tYXQtdGFiLW5hdi1iYXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tYXQtdGFiLWhlYWRlcntib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4xMik7Ym9yZGVyLWJvdHRvbTpub25lfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWxhYmVsLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWxpbmt7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjojNjE2MTYxfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6IzYxNjE2MX1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cFtjbGFzcyo9bWF0LWJhY2tncm91bmQtXSAubWF0LXRhYi1oZWFkZXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhcltjbGFzcyo9bWF0LWJhY2tncm91bmQtXXtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLXRvcDpub25lfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjUxLDE0MCwwLC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LWluay1iYXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtaW5rLWJhcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtaW5rLWJhcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtaW5rLWJhcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1pbmstYmFye2JhY2tncm91bmQtY29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTEsMTQwLDAsLjMpfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC1pbmstYmFyLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LWluay1iYXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1pbmstYmFyLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyIC5tYXQtaW5rLWJhcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC1pbmstYmFyLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC1pbmstYmFye2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LWluay1iYXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LWluay1iYXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LWluay1iYXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjUxLDE0MCwwLC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItbGluay1jb250YWluZXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9ue2JhY2tncm91bmQtY29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbCxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmssYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbCxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGlua3tjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3JlLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3JlLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZXtib3JkZXItY29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC1yaXBwbGUtZWxlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1MSwxNDAsMCwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1saW5rLWNvbnRhaW5lcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbntiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbCxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGluayxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGlua3tjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3JlLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZXtib3JkZXItY29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1saW5rLWNvbnRhaW5lcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXRhYi1saW5rLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmt7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVke2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3JlLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmV7Ym9yZGVyLWNvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1yaXBwbGUtZWxlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbGJhcntiYWNrZ3JvdW5kOiNlZjZjMDA7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXRvb2xiYXIubWF0LXByaW1hcnl7YmFja2dyb3VuZDojZWY2YzAwO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC10b29sYmFyLm1hdC1hY2NlbnR7YmFja2dyb3VuZDojZWY2YzAwO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC10b29sYmFyLm1hdC13YXJue2JhY2tncm91bmQ6I2Y0NDMzNjtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbGJhciAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lLGJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbGJhciAubWF0LWZvcm0tZmllbGQtcmlwcGxlLGJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbGJhciAubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn1ib2R5LmRhcmstbW9kZSAubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLGJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbGJhciAubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLGJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbGJhciAubWF0LXNlbGVjdC12YWx1ZSxib2R5LmRhcmstbW9kZSAubWF0LXRvb2xiYXIgLm1hdC1zZWxlY3QtYXJyb3csYm9keS5kYXJrLW1vZGUgLm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LXNlbGVjdC1hcnJvd3tjb2xvcjppbmhlcml0fWJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbGJhciAubWF0LWlucHV0LWVsZW1lbnR7Y2FyZXQtY29sb3I6Y3VycmVudENvbG9yfWJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbHRpcHtiYWNrZ3JvdW5kOnJnYmEoOTcsOTcsOTcsLjkpfWJvZHkuZGFyay1tb2RlIC5tYXQtdHJlZXtiYWNrZ3JvdW5kOiM0MjQyNDJ9Ym9keS5kYXJrLW1vZGUgLm1hdC10cmVlLW5vZGUsYm9keS5kYXJrLW1vZGUgLm1hdC1uZXN0ZWQtdHJlZS1ub2Rle2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbmFjay1iYXItY29udGFpbmVye2NvbG9yOnJnYmEoMCwwLDAsLjg3KTtiYWNrZ3JvdW5kOiNmYWZhZmE7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbntjb2xvcjppbmhlcml0fQo8L3N0eWxlPgoKPHN0eWxlPgogIGh0bWwsCiAgYm9keSB7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAwOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZm9udC1mYW1pbHk6IFJvYm90bywgc2Fucy1zZXJpZjsKICAgIGNvbG9yOiB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpOwoKICAgIC8qIExlZ2FjeSBtZWNoYW5pc20gdG8gYXZvaWQgaXNzdWVzIHdpdGggc3VicGl4ZWwgYW50aS1hbGlhc2luZyBvbiBtYWNPUy4KICAgICAqCiAgICAgKiBJbiB0aGUgcGFzdCBbMV0sIG1hY09TIHN1YnBpeGVsIEFBIGNhdXNlZCBleGNlc3NpdmUgYm9sZGluZyBmb3IgbGlnaHQtb24tZGFyayB0ZXh0OyB0aGlzIHJ1bGUKICAgICAqIGF2b2lkcyB0aGF0IGJ5IHJlcXVlc3Rpbmcgbm9uLXN1YnBpeGVsIEFBIGFsd2F5cywgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQgYmVoYXZpb3IsIHdoaWNoIGlzCiAgICAgKiB0byB1c2Ugc3VicGl4ZWwgQUEgd2hlbiBhdmFpbGFibGUuIFRoZSBvcmlnaW5hbCBpc3N1ZSB3YXMgImZpeGVkIiBieSByZW1vdmluZyBzdWJwaXhlbCBBQSBpbgogICAgICogbWFjT1MgMTQgKE1vamF2ZSksIGJ1dCBmb3IgbGVnYWN5IHJlYXNvbnMgdGhleSBwcmVzZXJ2ZWQgdGhlIGJvbGRpbmcgZWZmZWN0IGFzIGFuIG9wdGlvbi4KICAgICAqIENocm9tZSB0aGVuIGluIHR1cm4gdXBkYXRlZCBpdHMgZm9udCByZW5kZXJpbmcgdG8gYXBwbHkgdGhhdCBib2xkaW5nIGVmZmVjdCBbMl0sIHdoaWNoIG1lYW5zCiAgICAgKiB0aGF0IGV2ZW4gdGhvdWdoIHRoZSBgLXdlYmtpdC1mb250LXNtb290aGluZ2AgZG9jcyBbM10gc3VnZ2VzdCB0aGF0IHNldHRpbmcgYGFudGlhbGlhc2VkYAogICAgICogd291bGQgaGF2ZSBubyBlZmZlY3QgZm9yIHJlY2VudCB2ZXJzaW9ucyBvZiBtYWNPUywgaXQgc3RpbGwgaXMgbmVlZGVkIHRvIGF2b2lkIHRoZSBib2xkaW5nLgogICAgICoKICAgICAqIFsxXTogaHR0cDovL3d3dy5saWdodGVycmEuY29tL2FydGljbGVzL21hY29zeHRleHRhYWJ1Zy8KICAgICAqIFsyXTogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9ODU4ODYxCiAgICAgKiBbM106IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9mb250LXNtb290aAogICAgICoKICAgICAqLwoKICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogIH0KICBub3NjcmlwdCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG1hcmdpbjogMCBhdXRvOwogICAgbWF4LXdpZHRoOiA2MDBweDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgfQo8L3N0eWxlPgoKPC9oZWFkPjxib2R5Pjxub3NjcmlwdD4KICAgIDxoMT5UZW5zb3JCb2FyZCByZXF1aXJlcyBKYXZhU2NyaXB0PC9oMT4KICAgIDxwPlBsZWFzZSBlbmFibGUgSmF2YVNjcmlwdCBhbmQgcmVsb2FkIHRoaXMgcGFnZS48L3A+CiAgPC9ub3NjcmlwdD48dGItd2ViYXBwPjwvdGItd2ViYXBwPjxzY3JpcHQgc3JjPSJpbmRleC5qcz9fZmlsZV9oYXNoPTI5YTdkMDNhIj48L3NjcmlwdD48L2JvZHk+PC9odG1sPg==", + "headers": [ + [ + "content-type", + "text/html; charset=utf-8" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/environment": { + "data": "eyJ2ZXJzaW9uIjogIjIuNy4wIiwgImRhdGFfbG9jYXRpb24iOiAiLi90dXRvcmlhbF9leHBzIiwgIndpbmRvd190aXRsZSI6ICIiLCAiZXhwZXJpbWVudF9uYW1lIjogIiIsICJleHBlcmltZW50X2Rlc2NyaXB0aW9uIjogIiIsICJjcmVhdGlvbl90aW1lIjogMC4wLCAiZGVidWciOiB7ImRhdGFfcHJvdmlkZXIiOiAiR3JwY0RhdGFQcm92aWRlcihhZGRyPSdsb2NhbGhvc3Q6NDQ1ODknKSIsICJmbGFncyI6IHsibG9nZGlyIjogIi4vdHV0b3JpYWxfZXhwcyIsICJsb2dkaXJfc3BlYyI6ICIiLCAiaG9zdCI6IG51bGwsICJiaW5kX2FsbCI6IGZhbHNlLCAicG9ydCI6IG51bGwsICJyZXVzZV9wb3J0IjogZmFsc2UsICJsb2FkX2Zhc3QiOiAiYXV0byIsICJleHRyYV9kYXRhX3NlcnZlcl9mbGFncyI6ICIiLCAiZ3JwY19jcmVkc190eXBlIjogImxvY2FsIiwgImdycGNfZGF0YV9wcm92aWRlciI6ICIiLCAicHVyZ2Vfb3JwaGFuZWRfZGF0YSI6IHRydWUsICJkYiI6ICIiLCAiZGJfaW1wb3J0IjogZmFsc2UsICJpbnNwZWN0IjogZmFsc2UsICJ2ZXJzaW9uX3RiIjogZmFsc2UsICJ0YWciOiAiIiwgImV2ZW50X2ZpbGUiOiAiIiwgInBhdGhfcHJlZml4IjogIiIsICJ3aW5kb3dfdGl0bGUiOiAiIiwgIm1heF9yZWxvYWRfdGhyZWFkcyI6IDEsICJyZWxvYWRfaW50ZXJ2YWwiOiA1LjAsICJyZWxvYWRfdGFzayI6ICJhdXRvIiwgInJlbG9hZF9tdWx0aWZpbGUiOiBudWxsLCAicmVsb2FkX211bHRpZmlsZV9pbmFjdGl2ZV9zZWNzIjogODY0MDAsICJnZW5lcmljX2RhdGEiOiAiYXV0byIsICJzYW1wbGVzX3Blcl9wbHVnaW4iOiB7fSwgImN1c3RvbV9wcmVkaWN0X2ZuIjogIiIsICJ3aXRfZGF0YV9kaXIiOiAiIiwgIl9fdGVuc29yYm9hcmRfc3ViY29tbWFuZCI6ICJzZXJ2ZSJ9fX0=", + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?run=tf_logs&tag=learning_rate": { + "data": "W1sxNjQ0MzIwMzE1LjI1MDE2OCwgMTAsIDAuMDAyNDk5OTk5OTQ0MTIwNjQ1NV0sIFsxNjQ0MzIwMzE4Ljc4MTA0NDIsIDIwLCAwLjAwMjQ5OTk5OTk0NDEyMDY0NTVdLCBbMTY0NDMyMDMyNi40MjY0MzE3LCAzNSwgMC4wMDI0OTk5OTk5NDQxMjA2NDU1XSwgWzE2NDQzMjAzMzAuMDE3NzMyLCA0NSwgMC4wMDI0OTk5OTk5NDQxMjA2NDU1XSwgWzE2NDQzMjAzMzcuNjkwNDMxLCA2MCwgMC4wMDI0OTk5OTk5NDQxMjA2NDU1XSwgWzE2NDQzMjAzNDEuMzkzMTUxLCA3MCwgMC4wMDI0OTk5OTk5NDQxMjA2NDU1XSwgWzE2NDQzMjAzNDkuMjcxNzQ3NiwgODUsIDAuMDAyNDk5OTk5OTQ0MTIwNjQ1NV0sIFsxNjQ0MzIwMzUzLjA2Nzk3OTgsIDk1LCAwLjAwMjQ5OTk5OTk0NDEyMDY0NTVdLCBbMTY0NDMyMDM2MC44NTgzMTE0LCAxMTAsIDAuMDAyNDk5OTk5OTQ0MTIwNjQ1NV0sIFsxNjQ0MzIwMzY0LjU1OTk1NDYsIDEyMCwgMC4wMDI0OTk5OTk5NDQxMjA2NDU1XSwgWzE2NDQzMjAzNzIuMjYwMzEzLCAxMzUsIDAuMDAyNDk5OTk5OTQ0MTIwNjQ1NV0sIFsxNjQ0MzIwMzc1LjkwMzAzMSwgMTQ1LCAwLjAwMjQ5OTk5OTk0NDEyMDY0NTVdLCBbMTY0NDMyMDM4My41NTk2MjY4LCAxNjAsIDAuMDAyNDk5OTk5OTQ0MTIwNjQ1NV0sIFsxNjQ0MzIwMzg3LjE4OTYxNywgMTcwLCAwLjAwMjQ5OTk5OTk0NDEyMDY0NTVdLCBbMTY0NDMyMDM5NC44Nzg4Njk1LCAxODUsIDAuMDAyNDk5OTk5OTQ0MTIwNjQ1NV0sIFsxNjQ0MzIwMzk4LjUxNDQ4NjYsIDE5NSwgMC4wMDI0OTk5OTk5NDQxMjA2NDU1XSwgWzE2NDQzMjA0MDYuMjMyNTMzNSwgMjEwLCAwLjAwMDI1MDAwMDAxMTg3NDM2MjhdLCBbMTY0NDMyMDQwOS44Nzc1MTM2LCAyMjAsIDAuMDAwMjUwMDAwMDExODc0MzYyOF0sIFsxNjQ0MzIwNDE3LjYwMzAyNjIsIDIzNSwgMC4wMDAyNTAwMDAwMTE4NzQzNjI4XSwgWzE2NDQzMjA0MjEuMjcyMTIwNywgMjQ1LCAwLjAwMDI1MDAwMDAxMTg3NDM2MjhdLCBbMTY0NDMyMDQyOS4wMTQzNDU2LCAyNjAsIDAuMDAwMjUwMDAwMDExODc0MzYyOF0sIFsxNjQ0MzIwNDMyLjcxNzUzNTcsIDI3MCwgMC4wMDAyNTAwMDAwMTE4NzQzNjI4XSwgWzE2NDQzMjA0NDAuNTAyNjQyNiwgMjg1LCAyLjQ5OTk5OTkzNjg0NDY4OGUtMDVdLCBbMTY0NDMyMDQ0NC4xOTQ4ODI5LCAyOTUsIDIuNDk5OTk5OTM2ODQ0Njg4ZS0wNV0sIFsxNjQ0MzIwNDUxLjMxNTQwNDcsIDMwMSwgMi40OTk5OTk5MzY4NDQ2ODhlLTA1XV0=", + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?run=tf_logs&tag=momentum": { + "data": "W1sxNjQ0MzIwMzE1LjI1MDIyOSwgMTAsIDAuODk5OTk5OTc2MTU4MTQyMV0sIFsxNjQ0MzIwMzE4Ljc4MTA3NzQsIDIwLCAwLjg5OTk5OTk3NjE1ODE0MjFdLCBbMTY0NDMyMDMyNi40MjY0NzI0LCAzNSwgMC44OTk5OTk5NzYxNTgxNDIxXSwgWzE2NDQzMjAzMzAuMDE3NzY1LCA0NSwgMC44OTk5OTk5NzYxNTgxNDIxXSwgWzE2NDQzMjAzMzcuNjkwNDgxMiwgNjAsIDAuODk5OTk5OTc2MTU4MTQyMV0sIFsxNjQ0MzIwMzQxLjM5MzE4NjMsIDcwLCAwLjg5OTk5OTk3NjE1ODE0MjFdLCBbMTY0NDMyMDM0OS4yNzE3OTU1LCA4NSwgMC44OTk5OTk5NzYxNTgxNDIxXSwgWzE2NDQzMjAzNTMuMDY4MDE0OSwgOTUsIDAuODk5OTk5OTc2MTU4MTQyMV0sIFsxNjQ0MzIwMzYwLjg1ODM1NjUsIDExMCwgMC44OTk5OTk5NzYxNTgxNDIxXSwgWzE2NDQzMjAzNjQuNTU5OTkwMiwgMTIwLCAwLjg5OTk5OTk3NjE1ODE0MjFdLCBbMTY0NDMyMDM3Mi4yNjAzNjU1LCAxMzUsIDAuODk5OTk5OTc2MTU4MTQyMV0sIFsxNjQ0MzIwMzc1LjkwMzA2NjYsIDE0NSwgMC44OTk5OTk5NzYxNTgxNDIxXSwgWzE2NDQzMjAzODMuNTU5NjY3MywgMTYwLCAwLjg5OTk5OTk3NjE1ODE0MjFdLCBbMTY0NDMyMDM4Ny4xODk2NDk2LCAxNzAsIDAuODk5OTk5OTc2MTU4MTQyMV0sIFsxNjQ0MzIwMzk0Ljg3ODk1NywgMTg1LCAwLjg5OTk5OTk3NjE1ODE0MjFdLCBbMTY0NDMyMDM5OC41MTQ1MjQ1LCAxOTUsIDAuODk5OTk5OTc2MTU4MTQyMV0sIFsxNjQ0MzIwNDA2LjIzMjU3OSwgMjEwLCAwLjg5OTk5OTk3NjE1ODE0MjFdLCBbMTY0NDMyMDQwOS44Nzc1NDgyLCAyMjAsIDAuODk5OTk5OTc2MTU4MTQyMV0sIFsxNjQ0MzIwNDE3LjYwMzA3MTUsIDIzNSwgMC44OTk5OTk5NzYxNTgxNDIxXSwgWzE2NDQzMjA0MjEuMjcyMTU2NSwgMjQ1LCAwLjg5OTk5OTk3NjE1ODE0MjFdLCBbMTY0NDMyMDQyOS4wMTQ0MDEsIDI2MCwgMC44OTk5OTk5NzYxNTgxNDIxXSwgWzE2NDQzMjA0MzIuNzE3NTczNCwgMjcwLCAwLjg5OTk5OTk3NjE1ODE0MjFdLCBbMTY0NDMyMDQ0MC41MDI2ODQsIDI4NSwgMC44OTk5OTk5NzYxNTgxNDIxXSwgWzE2NDQzMjA0NDQuMTk0OTIzLCAyOTUsIDAuODk5OTk5OTc2MTU4MTQyMV0sIFsxNjQ0MzIwNDUxLjMxNTQ2NDUsIDMwMSwgMC44OTk5OTk5NzYxNTgxNDIxXV0=", + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?run=tf_logs&tag=train%2Facc": { + "data": "W1sxNjQ0MzIwMzE1LjI1MDA0OCwgMTAsIDgxLjYzMDg1OTM3NV0sIFsxNjQ0MzIwMzE4Ljc4MDkyODYsIDIwLCA5My4zNzg5MDYyNV0sIFsxNjQ0MzIwMzI2LjQyNjMwOCwgMzUsIDk0LjQ4MjQyMTg3NV0sIFsxNjQ0MzIwMzMwLjAxNzYxNjMsIDQ1LCA5NC42Nzc3MzQzNzVdLCBbMTY0NDMyMDMzNy42OTAyODc2LCA2MCwgOTYuNTAzOTA2MjVdLCBbMTY0NDMyMDM0MS4zOTMwMzY0LCA3MCwgOTQuNjE5MTQwNjI1XSwgWzE2NDQzMjAzNDkuMjcxNTkxMiwgODUsIDk1LjQxOTkyMTg3NV0sIFsxNjQ0MzIwMzUzLjA2Nzg3ODIsIDk1LCA5NS40MDAzOTA2MjVdLCBbMTY0NDMyMDM2MC44NTgxNTY3LCAxMTAsIDk2LjE3MTg3NV0sIFsxNjQ0MzIwMzY0LjU1OTgyNSwgMTIwLCA5Ni42MzA4NTkzNzVdLCBbMTY0NDMyMDM3Mi4yNjAxMzczLCAxMzUsIDk3LjIzNjMyODEyNV0sIFsxNjQ0MzIwMzc1LjkwMjkxNiwgMTQ1LCA5Ni41MzMyMDMxMjVdLCBbMTY0NDMyMDM4My41NTk1LCAxNjAsIDk2LjczODI4MTI1XSwgWzE2NDQzMjAzODcuMTg5NDk4NywgMTcwLCA5Ni42Njk5MjE4NzVdLCBbMTY0NDMyMDM5NC44NzgyNjI1LCAxODUsIDk3LjA4MDA3ODEyNV0sIFsxNjQ0MzIwMzk4LjUxNDM3MiwgMTk1LCA5Ny4wODAwNzgxMjVdLCBbMTY0NDMyMDQwNi4yMzI0MDM4LCAyMTAsIDk3LjU3ODEyNV0sIFsxNjQ0MzIwNDA5Ljg3NzM5MjUsIDIyMCwgOTcuOTE5OTIxODc1XSwgWzE2NDQzMjA0MTcuNjAyODk5OCwgMjM1LCA5Ny4zNjMyODEyNV0sIFsxNjQ0MzIwNDIxLjI3MjAxMDMsIDI0NSwgOTcuNzI0NjA5Mzc1XSwgWzE2NDQzMjA0MjkuMDE0MTU0LCAyNjAsIDk3LjU5NzY1NjI1XSwgWzE2NDQzMjA0MzIuNzE3NDEsIDI3MCwgOTcuOTI5Njg3NV0sIFsxNjQ0MzIwNDQwLjUwMjUxOTEsIDI4NSwgOTcuNzYzNjcxODc1XSwgWzE2NDQzMjA0NDQuMTk0MTc3NCwgMjk1LCA5OC4wMjczNDM3NV1d", + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?run=tf_logs&tag=train%2Floss": { + "data": "W1sxNjQ0MzIwMzE1LjI1MDExMDEsIDEwLCAwLjk3NDY0NzU4MTU3NzMwMV0sIFsxNjQ0MzIwMzE4Ljc4MTAwNjgsIDIwLCAwLjUzNDQ0NTk0MTQ0ODIxMTddLCBbMTY0NDMyMDMyNi40MjYzNzczLCAzNSwgMC40NjAyNjc5NjEwMjUyMzgwNF0sIFsxNjQ0MzIwMzMwLjAxNzY5NDUsIDQ1LCAwLjM4NTM2NDY4MTQ4MjMxNTA2XSwgWzE2NDQzMjAzMzcuNjkwMzYyNSwgNjAsIDAuMjY5NzI0MjQ5ODM5NzgyN10sIFsxNjQ0MzIwMzQxLjM5MzExMjQsIDcwLCAwLjQyNDE2MDc0ODcyMDE2OTA3XSwgWzE2NDQzMjAzNDkuMjcxNjg3LCA4NSwgMC4zNjE2MTU0Nzg5OTI0NjIxNl0sIFsxNjQ0MzIwMzUzLjA2Nzk0NSwgOTUsIDAuMzQ4MzUyNzAwNDcxODc4MDVdLCBbMTY0NDMyMDM2MC44NTgyNDksIDExMCwgMC4zMjE1NjMwMDU0NDczODc3XSwgWzE2NDQzMjAzNjQuNTU5OTAyLCAxMjAsIDAuMzAwMzQ3ODY0NjI3ODM4MTNdLCBbMTY0NDMyMDM3Mi4yNjAyNDQxLCAxMzUsIDAuMjcyMTA4MTk3MjEyMjE5MjRdLCBbMTY0NDMyMDM3NS45MDI5OTEzLCAxNDUsIDAuMjg5MzEzODgyNTg5MzQwMl0sIFsxNjQ0MzIwMzgzLjU1OTU2ODQsIDE2MCwgMC4yNzI5Nzk4ODUzMzk3MzY5NF0sIFsxNjQ0MzIwMzg3LjE4OTU4MjYsIDE3MCwgMC4yODQwMTA0OTk3MTU4MDUwNV0sIFsxNjQ0MzIwMzk0Ljg3ODMyODMsIDE4NSwgMC4yMjQyNzY3MjE0Nzc1MDg1NF0sIFsxNjQ0MzIwMzk4LjUxNDQ0NzcsIDE5NSwgMC4yNDg5NDc3MDk3OTg4MTI4N10sIFsxNjQ0MzIwNDA2LjIzMjQ3MzYsIDIxMCwgMC4yMDY1MTExMzk4Njk2ODk5NF0sIFsxNjQ0MzIwNDA5Ljg3NzQ3ODQsIDIyMCwgMC4xNjk0OTEyNDYzNDI2NTldLCBbMTY0NDMyMDQxNy42MDI5NzE4LCAyMzUsIDAuMjE2ODM1OTE2MDQyMzI3ODhdLCBbMTY0NDMyMDQyMS4yNzIwODIzLCAyNDUsIDAuMTkzMzczNDU2NTk3MzI4MTldLCBbMTY0NDMyMDQyOS4wMTQyNzk4LCAyNjAsIDAuMTg5MjM4NjIyNzg0NjE0NTZdLCBbMTY0NDMyMDQzMi43MTc0OTY2LCAyNzAsIDAuMTg4MjYzNzU5MDE2OTkwNjZdLCBbMTY0NDMyMDQ0MC41MDI1ODU2LCAyODUsIDAuMTg3MDg2MzI4ODY0MDk3Nl0sIFsxNjQ0MzIwNDQ0LjE5NDg0MSwgMjk1LCAwLjE0Mzg1ODY0MTM4NjAzMjFdXQ==", + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?run=tf_logs&tag=train%2Floss_bbox": { + "data": "W1sxNjQ0MzIwMzE1LjI1MDA3OTIsIDEwLCAwLjM5NDU1Mjg1NjY4MzczMTFdLCBbMTY0NDMyMDMxOC43ODA5NjgyLCAyMCwgMC4zMjg5NTAzNzUzMTg1MjcyXSwgWzE2NDQzMjAzMjYuNDI2MzQzNywgMzUsIDAuMjY4ODc0MDQ5MTg2NzA2NTRdLCBbMTY0NDMyMDMzMC4wMTc2NTYzLCA0NSwgMC4yMTUzNTYxMTE1MjY0ODkyNl0sIFsxNjQ0MzIwMzM3LjY5MDMyNTcsIDYwLCAwLjE1ODYwNDc3MDg5ODgxODk3XSwgWzE2NDQzMjAzNDEuMzkzMDc1LCA3MCwgMC4yNTk3MzQ4OTg4MDU2MTgzXSwgWzE2NDQzMjAzNDkuMjcxNjQzNCwgODUsIDAuMjI0MzQ1NDYwNTM0MDk1NzZdLCBbMTY0NDMyMDM1My4wNjc5MTE2LCA5NSwgMC4yMTE5OTQ1Mjg3NzA0NDY3OF0sIFsxNjQ0MzIwMzYwLjg1ODE5NDYsIDExMCwgMC4yMDc0NTU1MTU4NjE1MTEyM10sIFsxNjQ0MzIwMzY0LjU1OTg2NDUsIDEyMCwgMC4xOTI1NzU4NDIxNDIxMDUxXSwgWzE2NDQzMjAzNzIuMjYwMTgzMywgMTM1LCAwLjE4Mjc0MTcwMTYwMjkzNThdLCBbMTY0NDMyMDM3NS45MDI5NTQ4LCAxNDUsIDAuMTg1NjgxMTY0MjY0Njc4OTZdLCBbMTY0NDMyMDM4My41NTk1MzY3LCAxNjAsIDAuMTczNjMxNzU3NDk3Nzg3NDhdLCBbMTY0NDMyMDM4Ny4xODk1NDg3LCAxNzAsIDAuMTc5OTUyOTc5MDg3ODI5Nl0sIFsxNjQ0MzIwMzk0Ljg3ODI5NTcsIDE4NSwgMC4xMzgxNDIwMzQ0MTE0MzAzNl0sIFsxNjQ0MzIwMzk4LjUxNDQxMDcsIDE5NSwgMC4xNjM0NzIzMDk3MDg1OTUyOF0sIFsxNjQ0MzIwNDA2LjIzMjQ0MDUsIDIxMCwgMC4xMzA3MDIyMjczNTQwNDk2OF0sIFsxNjQ0MzIwNDA5Ljg3NzQ0MjYsIDIyMCwgMC4xMDkwMTMyMzcwNTkxMTYzNl0sIFsxNjQ0MzIwNDE3LjYwMjkzNiwgMjM1LCAwLjEzNjc0MDIwNzY3MjExOTE0XSwgWzE2NDQzMjA0MjEuMjcyMDQ2MywgMjQ1LCAwLjEyNzc0NzQ0NjI5ODU5OTI0XSwgWzE2NDQzMjA0MjkuMDE0MjMzNCwgMjYwLCAwLjExOTU3MTkwOTMwODQzMzUzXSwgWzE2NDQzMjA0MzIuNzE3NDU5LCAyNzAsIDAuMTI0NTcxMDcwMDc1MDM1MV0sIFsxNjQ0MzIwNDQwLjUwMjU1NDQsIDI4NSwgMC4xMjM2OTEzNTAyMjE2MzM5MV0sIFsxNjQ0MzIwNDQ0LjE5NDc0ODksIDI5NSwgMC4wODg5ODMyODk4OTc0NDE4Nl1d", + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?run=tf_logs&tag=train%2Floss_cls": { + "data": "W1sxNjQ0MzIwMzE1LjI1MDAxNDMsIDEwLCAwLjUzNzM1MzI3NzIwNjQyMDldLCBbMTY0NDMyMDMxOC43ODA4NzY2LCAyMCwgMC4xNzc3NzM2MjQ2NTg1ODQ2XSwgWzE2NDQzMjAzMjYuNDI2MjY2NCwgMzUsIDAuMTU3Mjc3NTg0MDc1OTI3NzNdLCBbMTY0NDMyMDMzMC4wMTc1NzQ1LCA0NSwgMC4xNDQ1NjYyMzc5MjY0ODMxNV0sIFsxNjQ0MzIwMzM3LjY5MDI0MzUsIDYwLCAwLjA5NDM0NTcwMzcyMTA0NjQ1XSwgWzE2NDQzMjAzNDEuMzkyOTk2LCA3MCwgMC4xNDM5MzkzMTYyNzI3MzU2XSwgWzE2NDQzMjAzNDkuMjcxNDkzNywgODUsIDAuMTE4MTM2MzkxMDQzNjYzMDJdLCBbMTY0NDMyMDM1My4wNjc4NDEsIDk1LCAwLjExOTU5MzQ0ODkzNjkzOTI0XSwgWzE2NDQzMjAzNjAuODU4MTE4LCAxMTAsIDAuMTAyMTQyNDMwODQxOTIyNzZdLCBbMTY0NDMyMDM2NC41NTk3ODYsIDEyMCwgMC4wOTQyMDg1NzU3ODUxNjAwNl0sIFsxNjQ0MzIwMzcyLjI2MDA2OCwgMTM1LCAwLjA3ODc0OTUzMDAxNzM3NTk1XSwgWzE2NDQzMjAzNzUuOTAyODc0NSwgMTQ1LCAwLjA5MDEzMjcyMDc2ODQ1MTY5XSwgWzE2NDQzMjAzODMuNTU5NDYwMiwgMTYwLCAwLjA4Nzc0MjM1MDk5NTU0MDYyXSwgWzE2NDQzMjAzODcuMTg5NDU3NCwgMTcwLCAwLjA4ODg3ODQ4MjU4MDE4NDk0XSwgWzE2NDQzMjAzOTQuODc4MjE0MSwgMTg1LCAwLjA3NDgxMDEyNDkzMzcxOTY0XSwgWzE2NDQzMjAzOTguNTE0MzMwNiwgMTk1LCAwLjA3NDMxNzE4NzA3MDg0NjU2XSwgWzE2NDQzMjA0MDYuMjMyMzU1NCwgMjEwLCAwLjA2NDg4NzM3NDYzOTUxMTExXSwgWzE2NDQzMjA0MDkuODc3MzUyMiwgMjIwLCAwLjA1Mjk1NDY5MjM5MzU0MTMzNl0sIFsxNjQ0MzIwNDE3LjYwMjg2MiwgMjM1LCAwLjA2NzU5ODU3Mzg2MzUwNjMyXSwgWzE2NDQzMjA0MjEuMjcxOTcyNywgMjQ1LCAwLjA1OTI4NDc5ODgwMDk0NTI4XSwgWzE2NDQzMjA0MjkuMDE0MDA2NCwgMjYwLCAwLjA2MTc3NzE0ODM5NTc3Njc1XSwgWzE2NDQzMjA0MzIuNzE3MzY5MywgMjcwLCAwLjA1NTIzNzQwODcyNzQwNzQ1NV0sIFsxNjQ0MzIwNDQwLjUwMjQ3OSwgMjg1LCAwLjA1NjMyNjE4NDQyMTc3NzcyNV0sIFsxNjQ0MzIwNDQ0LjE5NDEzODUsIDI5NSwgMC4wNDg2Njc0MzgzMjgyNjYxNDRdXQ==", + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?run=tf_logs&tag=train%2Floss_rpn_bbox": { + "data": "W1sxNjQ0MzIwMzE1LjI0OTk2MjYsIDEwLCAwLjAxNzI5NTM3MzYwMzcwMTU5XSwgWzE2NDQzMjAzMTguNzgwODI5NywgMjAsIDAuMDExOTM2NjMwMTIyMzYzNTY3XSwgWzE2NDQzMjAzMjYuNDI2MTg3LCAzNSwgMC4wMTM4NTU5NTY0OTQ4MDgxOTddLCBbMTY0NDMyMDMzMC4wMTc1MjQ3LCA0NSwgMC4wMTI3MDM3OTU5MTczMzIxNzJdLCBbMTY0NDMyMDMzNy42OTAxNjkzLCA2MCwgMC4wMTAzODk3MTcyOTU3NjU4NzddLCBbMTY0NDMyMDM0MS4zOTI5NDI3LCA3MCwgMC4wMTMyMzY2MDA5MDU2NTY4MTVdLCBbMTY0NDMyMDM0OS4yNzA0Mjg0LCA4NSwgMC4wMTM0MTcxNTE3NTY1ODQ2NDRdLCBbMTY0NDMyMDM1My4wNjc3OTMxLCA5NSwgMC4wMTE3NDY5MzM2ODM3NTMwMTRdLCBbMTY0NDMyMDM2MC44NTgwNjY4LCAxMTAsIDAuMDA5MTM3NjU2NTM5Njc4NTc0XSwgWzE2NDQzMjAzNjQuNTU5NzM4NiwgMTIwLCAwLjAxMDU5MDI4MjI2ODgyMjE5M10sIFsxNjQ0MzIwMzcyLjI1OTYxNDUsIDEzNSwgMC4wMDgxMzc2NzY4NjQ4NjI0NDJdLCBbMTY0NDMyMDM3NS45MDI4MjI3LCAxNDUsIDAuMDEwMDA2NDY0MDg2NDcyOTg4XSwgWzE2NDQzMjAzODMuNTU5Mzg2NywgMTYwLCAwLjAwOTM0NDg2MzcwNTMzNzA0OF0sIFsxNjQ0MzIwMzg3LjE4OTM5MjYsIDE3MCwgMC4wMTEyMjc3NjMyNTc5MjA3NDJdLCBbMTY0NDMyMDM5NC44NzgxNDE0LCAxODUsIDAuMDA5MzYxMDM5ODQ3MTM1NTQ0XSwgWzE2NDQzMjAzOTguNTE0MjgxLCAxOTUsIDAuMDA4MDg0NDMwMzU5MzAzOTUxXSwgWzE2NDQzMjA0MDYuMjMyMjg4NCwgMjEwLCAwLjAwODUzMzAxMDI1OTI3MDY2OF0sIFsxNjQ0MzIwNDA5Ljg3NzMwMjYsIDIyMCwgMC4wMDY1NTUxMjc5MTEyNjk2NjVdLCBbMTY0NDMyMDQxNy42MDI4MDgsIDIzNSwgMC4wMDg0MTQ2NTk2NDkxMzM2ODJdLCBbMTY0NDMyMDQyMS4yNzE5Mjc4LCAyNDUsIDAuMDA1NTI1NDMwNjY0NDIwMTI4XSwgWzE2NDQzMjA0MjkuMDEzOTQ5NCwgMjYwLCAwLjAwNzE4OTA4NDc3NTc0NTg2OV0sIFsxNjQ0MzIwNDMyLjcxNzMxOTMsIDI3MCwgMC4wMDczNTk3NjU5MzU2ODkyMTFdLCBbMTY0NDMyMDQ0MC41MDI0MDk3LCAyODUsIDAuMDA2MDM4NTM5NTc3Mjc1NTE1XSwgWzE2NDQzMjA0NDQuMTk0MDk0NCwgMjk1LCAwLjAwNDg5MDcyNTQ4MjI1NTIyXV0=", + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?run=tf_logs&tag=train%2Floss_rpn_cls": { + "data": "W1sxNjQ0MzIwMzE1LjI0OTc1NzgsIDEwLCAwLjAyNTQ0NjA1NzMxOTY0MTExM10sIFsxNjQ0MzIwMzE4Ljc4MDcyNiwgMjAsIDAuMDE1Nzg1MzI1MzE4NTc0OTA1XSwgWzE2NDQzMjAzMjYuNDI1OTY4LCAzNSwgMC4wMjAyNjAzNDMzMjgxMTgzMjRdLCBbMTY0NDMyMDMzMC4wMTc0MDQ2LCA0NSwgMC4wMTI3Mzg1MzQyNDkzNjUzM10sIFsxNjQ0MzIwMzM3LjY4OTk2NDUsIDYwLCAwLjAwNjM4NDAzNzQzNTA1NDc3OV0sIFsxNjQ0MzIwMzQxLjM5MjgxNTgsIDcwLCAwLjAwNzI0OTkyOTk0MjE5MDY0N10sIFsxNjQ0MzIwMzQ5LjI3MDE3NjQsIDg1LCAwLjAwNTcxNjQ3OTM4MzQwOTAyM10sIFsxNjQ0MzIwMzUzLjA2NzY4NzMsIDk1LCAwLjAwNTAxNzgwMzUxNjIzODkyOF0sIFsxNjQ0MzIwMzYwLjg1Nzg1LCAxMTAsIDAuMDAyODI3NDAxMjcyOTUyNTU2Nl0sIFsxNjQ0MzIwMzY0LjU1OTYzOSwgMTIwLCAwLjAwMjk3MzE0NTU3MjQ2ODYzODRdLCBbMTY0NDMyMDM3Mi4yNTkzNjEsIDEzNSwgMC4wMDI0NzkzMDQ3OTIzNTk0NzEzXSwgWzE2NDQzMjAzNzUuOTAyNzA1NywgMTQ1LCAwLjAwMzQ5MzUyODU4MDI5MzA1OTNdLCBbMTY0NDMyMDM4My41NTkxMjY5LCAxNjAsIDAuMDAyMjYwODkxNzIwNjUyNTgwM10sIFsxNjQ0MzIwMzg3LjE4OTI4OTgsIDE3MCwgMC4wMDM5NTEyOTY2NzU5NTAyODldLCBbMTY0NDMyMDM5NC44Nzc5MTU5LCAxODUsIDAuMDAxOTYzNTE0ODM0NjQyNDEwM10sIFsxNjQ0MzIwMzk4LjUxNDE0NDQsIDE5NSwgMC4wMDMwNzM3NjMzMzUxMjM2NThdLCBbMTY0NDMyMDQwNi4yMzE5ODksIDIxMCwgMC4wMDIzODg1MzI1MDYzMDE5OTldLCBbMTY0NDMyMDQwOS44NzcxNjYzLCAyMjAsIDAuMDAwOTY4MTg2NTM0MDA5ODczOV0sIFsxNjQ0MzIwNDE3LjYwMjU3ODYsIDIzNSwgMC4wMDQwODI0ODEzNzY4MjY3NjNdLCBbMTY0NDMyMDQyMS4yNzE4MjY1LCAyNDUsIDAuMDAwODE1Nzg4NjMzMTkwMDk1NF0sIFsxNjQ0MzIwNDI5LjAxMzc2NzcsIDI2MCwgMC4wMDA3MDA0ODU2MDE1NTU1NTYxXSwgWzE2NDQzMjA0MzIuNzE3MTY4NiwgMjcwLCAwLjAwMTA5NTUwOTUwNTgzMDcwNTJdLCBbMTY0NDMyMDQ0MC41MDIxNzU2LCAyODUsIDAuMDAxMDMwMjQ5NDA0NzIwOTYyXSwgWzE2NDQzMjA0NDQuMTkzOTgxMiwgMjk1LCAwLjAwMTMxNzE4NDQxODQzOTg2NTFdXQ==", + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/tags": { + "data": "eyJ0Zl9sb2dzIjogeyJ0cmFpbi9sb3NzX2NscyI6IHsiZGlzcGxheU5hbWUiOiAiIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAidmFsL21BUCI6IHsiZGlzcGxheU5hbWUiOiAiIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAidHJhaW4vbG9zc19iYm94IjogeyJkaXNwbGF5TmFtZSI6ICIiLCAiZGVzY3JpcHRpb24iOiAiIn0sICJ0cmFpbi9hY2MiOiB7ImRpc3BsYXlOYW1lIjogIiIsICJkZXNjcmlwdGlvbiI6ICIifSwgInZhbC9BUDUwIjogeyJkaXNwbGF5TmFtZSI6ICIiLCAiZGVzY3JpcHRpb24iOiAiIn0sICJtb21lbnR1bSI6IHsiZGlzcGxheU5hbWUiOiAiIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAidHJhaW4vbG9zcyI6IHsiZGlzcGxheU5hbWUiOiAiIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAidHJhaW4vbG9zc19ycG5fY2xzIjogeyJkaXNwbGF5TmFtZSI6ICIiLCAiZGVzY3JpcHRpb24iOiAiIn0sICJsZWFybmluZ19yYXRlIjogeyJkaXNwbGF5TmFtZSI6ICIiLCAiZGVzY3JpcHRpb24iOiAiIn0sICJ0cmFpbi9sb3NzX3Jwbl9iYm94IjogeyJkaXNwbGF5TmFtZSI6ICIiLCAiZGVzY3JpcHRpb24iOiAiIn19fQ==", + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugins_listing": { + "data": "eyJzY2FsYXJzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IHRydWUsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJzY2FsYXJzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1zY2FsYXItZGFzaGJvYXJkIn19LCAiY3VzdG9tX3NjYWxhcnMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJDdXN0b20gU2NhbGFycyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQifX0sICJpbWFnZXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJpbWFnZXMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWltYWdlLWRhc2hib2FyZCJ9fSwgImF1ZGlvIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiYXVkaW8iLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWF1ZGlvLWRhc2hib2FyZCJ9fSwgImRlYnVnZ2VyLXYyIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiRGVidWdnZXIgVjIiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiTkdfQ09NUE9ORU5UIn19LCAiZ3JhcGhzIjogeyJkaXNhYmxlX3JlbG9hZCI6IHRydWUsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJncmFwaHMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWdyYXBoLWRhc2hib2FyZCJ9fSwgImRpc3RyaWJ1dGlvbnMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJkaXN0cmlidXRpb25zIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1kaXN0cmlidXRpb24tZGFzaGJvYXJkIn19LCAiaGlzdG9ncmFtcyI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogImhpc3RvZ3JhbXMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWhpc3RvZ3JhbS1kYXNoYm9hcmQifX0sICJ0ZXh0IjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAidGV4dCIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtdGV4dC1kYXNoYm9hcmQifX0sICJwcl9jdXJ2ZXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJQUiBDdXJ2ZXMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLXByLWN1cnZlLWRhc2hib2FyZCJ9fSwgInByb2ZpbGVfcmVkaXJlY3QiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJQcm9maWxlIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1wcm9maWxlLXJlZGlyZWN0LWRhc2hib2FyZCJ9fSwgImhwYXJhbXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJocGFyYW1zIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1ocGFyYW1zLWRhc2hib2FyZCJ9fSwgIm1lc2giOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJtZXNoIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJtZXNoLWRhc2hib2FyZCJ9fSwgInRpbWVzZXJpZXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogdHJ1ZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogIlRpbWUgU2VyaWVzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIk5HX0NPTVBPTkVOVCJ9fSwgInByb2plY3RvciI6IHsiZGlzYWJsZV9yZWxvYWQiOiB0cnVlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAicHJvamVjdG9yIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIklGUkFNRSIsICJtb2R1bGVfcGF0aCI6ICIvZGF0YS9wbHVnaW4vcHJvamVjdG9yL2luZGV4LmpzIn19LCAid2hhdGlmIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiV2hhdC1JZiBUb29sIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIklGUkFNRSIsICJtb2R1bGVfcGF0aCI6ICIvZGF0YS9wbHVnaW4vd2hhdGlmL2luZGV4LmpzIn19fQ==", + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/runs": { + "data": "WyJ0Zl9sb2dzIl0=", + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/font-roboto/Hgo13k-tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2": { + "data": "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", + "headers": [ + [ + "content-type", + "font/woff2" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/font-roboto/RxZJdnzeo3R5zSexge8UUZBw1xU1rKptJj_0jans920.woff2": { + "data": "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", + "headers": [ + [ + "content-type", + "font/woff2" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/font-roboto/d-6IYplOFocCacKzxwXSOJBw1xU1rKptJj_0jans920.woff2": { + "data": "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", + "headers": [ + [ + "content-type", + "font/woff2" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/font-roboto/oMMgfZMQthOryQo9n22dcuvvDin1pK8aKteLpeZ5c0A.woff2": { + "data": "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", + "headers": [ + [ + "content-type", + "font/woff2" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/icon_bundle.svg": { + "data": "PD94bWwgdmVyc2lvbj0iMS4wIiA/Pjxzdmc+PGRlZnM+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0iYXJyb3dfZG93bndhcmRfMjRweCI+PHBhdGggZmlsbD0iIzAxMDEwMSIgZD0iTTIwIDEybC0xLjQxLTEuNDFMMTMgMTYuMTdWNGgtMnYxMi4xN2wtNS41OC01LjU5TDQgMTJsOCA4IDgtOHoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGlkPSJhcnJvd191cHdhcmRfMjRweCI+PHBhdGggZD0iTTQgMTJsMS40MSAxLjQxTDExIDcuODNWMjBoMlY3LjgzbDUuNTggNS41OUwyMCAxMmwtOC04LTggOHoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIGlkPSJicmlnaHRuZXNzXzZfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0yMCAxNS4zMUwyMy4zMSAxMiAyMCA4LjY5VjRoLTQuNjlMMTIgLjY5IDguNjkgNEg0djQuNjlMLjY5IDEyIDQgMTUuMzFWMjBoNC42OUwxMiAyMy4zMSAxNS4zMSAyMEgyMHYtNC42OXpNMTIgMThWNmMzLjMxIDAgNiAyLjY5IDYgNnMtMi42OSA2LTYgNnoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIGlkPSJidWdfcmVwb3J0XzI0cHgiPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNMjAgOGgtMi44MWMtLjQ1LS43OC0xLjA3LTEuNDUtMS44Mi0xLjk2TDE3IDQuNDEgMTUuNTkgM2wtMi4xNyAyLjE3QzEyLjk2IDUuMDYgMTIuNDkgNSAxMiA1Yy0uNDkgMC0uOTYuMDYtMS40MS4xN0w4LjQxIDMgNyA0LjQxbDEuNjIgMS42M0M3Ljg4IDYuNTUgNy4yNiA3LjIyIDYuODEgOEg0djJoMi4wOWMtLjA1LjMzLS4wOS42Ni0uMDkgMXYxSDR2MmgydjFjMCAuMzQuMDQuNjcuMDkgMUg0djJoMi44MWMxLjA0IDEuNzkgMi45NyAzIDUuMTkgM3M0LjE1LTEuMjEgNS4xOS0zSDIwdi0yaC0yLjA5Yy4wNS0uMzMuMDktLjY2LjA5LTF2LTFoMnYtMmgtMnYtMWMwLS4zNC0uMDQtLjY3LS4wOS0xSDIwVjh6bS02IDhoLTR2LTJoNHYyem0wLTRoLTR2LTJoNHYyeiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgaWQ9ImNhbmNlbF8yNHB4Ij48cGF0aCBkPSJNMTIgMkM2LjQ3IDIgMiA2LjQ3IDIgMTJzNC40NyAxMCAxMCAxMCAxMC00LjQ3IDEwLTEwUzE3LjUzIDIgMTIgMnptNSAxMy41OUwxNS41OSAxNyAxMiAxMy40MSA4LjQxIDE3IDcgMTUuNTkgMTAuNTkgMTIgNyA4LjQxIDguNDEgNyAxMiAxMC41OSAxNS41OSA3IDE3IDguNDEgMTMuNDEgMTIgMTcgMTUuNTl6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0iY2hldnJvbl9sZWZ0XzI0cHgiPjxwYXRoIGQ9Ik0xNS40MSA3LjQxTDE0IDZsLTYgNiA2IDYgMS40MS0xLjQxTDEwLjgzIDEyeiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgaWQ9ImNoZXZyb25fcmlnaHRfMjRweCI+PHBhdGggZD0iTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02eiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgaWQ9ImNsZWFyXzI0cHgiPjxwYXRoIGQ9Ik0xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0iY2xvc2VfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0iY29udGVudF9jb3B5XzI0cHgiPjxwYXRoIGQ9Ik0xNiAxSDRjLTEuMSAwLTIgLjktMiAydjE0aDJWM2gxMlYxem0zIDRIOGMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxMWMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yem0wIDE2SDhWN2gxMXYxNHoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMjQgMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0iZGFya19tb2RlXzI0cHgiPjxyZWN0IGZpbGw9Im5vbmUiIGhlaWdodD0iMjQiIHdpZHRoPSIyNCIvPjxwYXRoIGQ9Ik0xMiwzYy00Ljk3LDAtOSw0LjAzLTksOXM0LjAzLDksOSw5czktNC4wMyw5LTljMC0wLjQ2LTAuMDQtMC45Mi0wLjEtMS4zNmMtMC45OCwxLjM3LTIuNTgsMi4yNi00LjQsMi4yNiBjLTIuOTgsMC01LjQtMi40Mi01LjQtNS40YzAtMS44MSwwLjg5LTMuNDIsMi4yNi00LjRDMTIuOTIsMy4wNCwxMi40NiwzLDEyLDNMMTIsM3oiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGlkPSJkb25lXzI0cHgiPjxwYXRoIGQ9Ik05IDE2LjJMNC44IDEybC0xLjQgMS40TDkgMTkgMjEgN2wtMS40LTEuNEw5IDE2LjJ6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0iZHJhZ19pbmRpY2F0b3JfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTExIDE4YzAgMS4xLS45IDItMiAycy0yLS45LTItMiAuOS0yIDItMiAyIC45IDIgMnptLTItOGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAtNmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTYgNGMxLjEgMCAyLS45IDItMnMtLjktMi0yLTItMiAuOS0yIDIgLjkgMiAyIDJ6bTAgMmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAgNmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0iZWRpdF8yNHB4Ij48cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC0yLjM0LTIuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0xLjgzIDEuODMgMy43NSAzLjc1IDEuODMtMS44M3oiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGlkPSJlcnJvcl8yNHB4Ij48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMSAxNWgtMnYtMmgydjJ6bTAtNGgtMlY3aDJ2NnoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGlkPSJleHBhbmRfbGVzc18yNHB4Ij48cGF0aCBkPSJNMTIgOGwtNiA2IDEuNDEgMS40MUwxMiAxMC44M2w0LjU5IDQuNThMMTggMTR6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0iZXhwYW5kX21vcmVfMjRweCI+PHBhdGggZD0iTTE2LjU5IDguNTlMMTIgMTMuMTcgNy40MSA4LjU5IDYgMTBsNiA2IDYtNnoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMjQgMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0iZmlsdGVyX2FsdF8yNHB4Ij48Zz48cGF0aCBkPSJNMCwwaDI0IE0yNCwyNEgwIiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTQuMjUsNS42MUM2LjI3LDguMiwxMCwxMywxMCwxM3Y2YzAsMC41NSwwLjQ1LDEsMSwxaDJjMC41NSwwLDEtMC40NSwxLTF2LTZjMCwwLDMuNzItNC44LDUuNzQtNy4zOSBDMjAuMjUsNC45NSwxOS43OCw0LDE4Ljk1LDRINS4wNEM0LjIxLDQsMy43NCw0Ljk1LDQuMjUsNS42MXoiLz48cGF0aCBkPSJNMCwwaDI0djI0SDBWMHoiIGZpbGw9Im5vbmUiLz48L2c+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0iZmxhZ18yNHB4Ij48cGF0aCBkPSJNMTQuNCA2TDE0IDRINXYxN2gydi03aDUuNmwuNCAyaDdWNnoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIGlkPSJmdWxsc2NyZWVuXzI0cHgiPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNNyAxNEg1djVoNXYtMkg3di0zem0tMi00aDJWN2gzVjVINXY1em0xMiA3aC0zdjJoNXYtNWgtMnYzek0xNCA1djJoM3YzaDJWNWgtNXoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIGlkPSJmdWxsc2NyZWVuX2V4aXRfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik01IDE2aDN2M2gydi01SDV2MnptMy04SDV2Mmg1VjVIOHYzem02IDExaDJ2LTNoM3YtMmgtNXY1em0yLTExVjVoLTJ2NWg1VjhoLTN6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0iZ2V0X2FwcF8yNHB4Ij48cGF0aCBkPSJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1eiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgaWQ9Imdyb3VwX3dvcmtfMjRweCI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6TTggMTcuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6TTkuNSA4YzAtMS4zOCAxLjEyLTIuNSAyLjUtMi41czIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNVM5LjUgOS4zOCA5LjUgOHptNi41IDkuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0iaGVscF9vdXRsaW5lXzI0cHgiPjxwYXRoIGQ9Ik0xMSAxOGgydi0yaC0ydjJ6bTEtMTZDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4em0wLTE0Yy0yLjIxIDAtNCAxLjc5LTQgNGgyYzAtMS4xLjktMiAyLTJzMiAuOSAyIDJjMCAyLTMgMS43NS0zIDVoMmMwLTIuMjUgMy0yLjUgMy01IDAtMi4yMS0xLjc5LTQtNC00eiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgaWQ9ImltYWdlX3NlYXJjaF8yNHB4Ij48cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE4IDEzdjdINFY2aDUuMDJjLjA1LS43MS4yMi0xLjM4LjQ4LTJINGMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnYtNWwtMi0yem0tMS41IDVoLTExbDIuNzUtMy41MyAxLjk2IDIuMzYgMi43NS0zLjU0em0yLjgtOS4xMWMuNDQtLjcuNy0xLjUxLjctMi4zOUMyMCA0LjAxIDE3Ljk5IDIgMTUuNSAyUzExIDQuMDEgMTEgNi41czIuMDEgNC41IDQuNDkgNC41Yy44OCAwIDEuNy0uMjYgMi4zOS0uN0wyMSAxMy40MiAyMi40MiAxMiAxOS4zIDguODl6TTE1LjUgOUMxNC4xMiA5IDEzIDcuODggMTMgNi41UzE0LjEyIDQgMTUuNSA0IDE4IDUuMTIgMTggNi41IDE2Ljg4IDkgMTUuNSA5eiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgaWQ9ImluZm9fb3V0bGluZV8yNHB4Ij48cGF0aCBkPSJNMTEgMTdoMnYtNmgtMnY2em0xLTE1QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHpNMTEgOWgyVjdoLTJ2MnoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMjQgMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0ia2VlcF8yNHB4Ij48Zz48cmVjdCBmaWxsPSJub25lIiBoZWlnaHQ9IjI0IiB3aWR0aD0iMjQiLz48L2c+PGc+PHBhdGggZD0iTTE2LDlWNGwxLDBjMC41NSwwLDEtMC40NSwxLTF2MGMwLTAuNTUtMC40NS0xLTEtMUg3QzYuNDUsMiw2LDIuNDUsNiwzdjAgYzAsMC41NSwwLjQ1LDEsMSwxbDEsMHY1YzAsMS42Ni0xLjM0LDMtMywzaDB2Mmg1Ljk3djdsMSwxbDEtMXYtN0gxOXYtMmgwQzE3LjM0LDEyLDE2LDEwLjY2LDE2LDl6IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48L2c+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgaWQ9ImtlZXBfb3V0bGluZV8yNHB4Ij48Zz48cmVjdCBmaWxsPSJub25lIiBoZWlnaHQ9IjI0IiB3aWR0aD0iMjQiLz48L2c+PGc+PHBhdGggZD0iTTE0LDR2NWMwLDEuMTIsMC4zNywyLjE2LDEsM0g5YzAuNjUtMC44NiwxLTEuOSwxLTNWNEgxNCBNMTcsMkg3QzYuNDUsMiw2LDIuNDUsNiwzYzAsMC41NSwwLjQ1LDEsMSwxYzAsMCwwLDAsMCwwbDEsMHY1IGMwLDEuNjYtMS4zNCwzLTMsM3YyaDUuOTd2N2wxLDFsMS0xdi03SDE5di0yYzAsMCwwLDAsMCwwYy0xLjY2LDAtMy0xLjM0LTMtM1Y0bDEsMGMwLDAsMCwwLDAsMGMwLjU1LDAsMS0wLjQ1LDEtMSBDMTgsMi40NSwxNy41NSwyLDE3LDJMMTcsMnoiLz48L2c+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgaWQ9ImxpZ2h0X21vZGVfMjRweCI+PHJlY3QgZmlsbD0ibm9uZSIgaGVpZ2h0PSIyNCIgd2lkdGg9IjI0Ii8+PHBhdGggZD0iTTEyLDdjLTIuNzYsMC01LDIuMjQtNSw1czIuMjQsNSw1LDVzNS0yLjI0LDUtNVMxNC43Niw3LDEyLDdMMTIsN3ogTTIsMTNsMiwwYzAuNTUsMCwxLTAuNDUsMS0xcy0wLjQ1LTEtMS0xbC0yLDAgYy0wLjU1LDAtMSwwLjQ1LTEsMVMxLjQ1LDEzLDIsMTN6IE0yMCwxM2wyLDBjMC41NSwwLDEtMC40NSwxLTFzLTAuNDUtMS0xLTFsLTIsMGMtMC41NSwwLTEsMC40NS0xLDFTMTkuNDUsMTMsMjAsMTN6IE0xMSwydjIgYzAsMC41NSwwLjQ1LDEsMSwxczEtMC40NSwxLTFWMmMwLTAuNTUtMC40NS0xLTEtMVMxMSwxLjQ1LDExLDJ6IE0xMSwyMHYyYzAsMC41NSwwLjQ1LDEsMSwxczEtMC40NSwxLTF2LTJjMC0wLjU1LTAuNDUtMS0xLTEgQzExLjQ1LDE5LDExLDE5LjQ1LDExLDIweiBNNS45OSw0LjU4Yy0wLjM5LTAuMzktMS4wMy0wLjM5LTEuNDEsMGMtMC4zOSwwLjM5LTAuMzksMS4wMywwLDEuNDFsMS4wNiwxLjA2IGMwLjM5LDAuMzksMS4wMywwLjM5LDEuNDEsMHMwLjM5LTEuMDMsMC0xLjQxTDUuOTksNC41OHogTTE4LjM2LDE2Ljk1Yy0wLjM5LTAuMzktMS4wMy0wLjM5LTEuNDEsMGMtMC4zOSwwLjM5LTAuMzksMS4wMywwLDEuNDEgbDEuMDYsMS4wNmMwLjM5LDAuMzksMS4wMywwLjM5LDEuNDEsMGMwLjM5LTAuMzksMC4zOS0xLjAzLDAtMS40MUwxOC4zNiwxNi45NXogTTE5LjQyLDUuOTljMC4zOS0wLjM5LDAuMzktMS4wMywwLTEuNDEgYy0wLjM5LTAuMzktMS4wMy0wLjM5LTEuNDEsMGwtMS4wNiwxLjA2Yy0wLjM5LDAuMzktMC4zOSwxLjAzLDAsMS40MXMxLjAzLDAuMzksMS40MSwwTDE5LjQyLDUuOTl6IE03LjA1LDE4LjM2IGMwLjM5LTAuMzksMC4zOS0xLjAzLDAtMS40MWMtMC4zOS0wLjM5LTEuMDMtMC4zOS0xLjQxLDBsLTEuMDYsMS4wNmMtMC4zOSwwLjM5LTAuMzksMS4wMywwLDEuNDFzMS4wMywwLjM5LDEuNDEsMEw3LjA1LDE4LjM2eiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNCAyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIGlkPSJsaW5lX3dlaWdodF8yNHB4Ij48Zz48cmVjdCBmaWxsPSJub25lIiBoZWlnaHQ9IjI0IiB3aWR0aD0iMjQiIHg9IjAiLz48L2c+PGc+PGc+PGc+PHBhdGggZD0iTTMsMTdoMTh2LTJIM1YxN3ogTTMsMjBoMTh2LTFIM1YyMHogTTMsMTNoMTh2LTNIM1YxM3ogTTMsNHY0aDE4VjRIM3oiLz48L2c+PC9nPjwvZz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIGlkPSJtb3JlX3ZlcnRfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xMiA4YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptMCAyYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptMCA2Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIGlkPSJub3RpZmljYXRpb25zX25vbmVfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xMiAyMmMxLjEgMCAyLS45IDItMmgtNGMwIDEuMS45IDIgMiAyem02LTZ2LTVjMC0zLjA3LTEuNjMtNS42NC00LjUtNi4zMlY0YzAtLjgzLS42Ny0xLjUtMS41LTEuNXMtMS41LjY3LTEuNSAxLjV2LjY4QzcuNjQgNS4zNiA2IDcuOTIgNiAxMXY1bC0yIDJ2MWgxNnYtMWwtMi0yem0tMiAxSDh2LTZjMC0yLjQ4IDEuNTEtNC41IDQtNC41czQgMi4wMiA0IDQuNXY2eiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgaWQ9InBhbGV0dGVfMjRweCI+PHBhdGggZD0iTTEyIDNjLTQuOTcgMC05IDQuMDMtOSA5czQuMDMgOSA5IDljLjgzIDAgMS41LS42NyAxLjUtMS41IDAtLjM5LS4xNS0uNzQtLjM5LTEuMDEtLjIzLS4yNi0uMzgtLjYxLS4zOC0uOTkgMC0uODMuNjctMS41IDEuNS0xLjVIMTZjMi43NiAwIDUtMi4yNCA1LTUgMC00LjQyLTQuMDMtOC05LTh6bS01LjUgOWMtLjgzIDAtMS41LS42Ny0xLjUtMS41UzUuNjcgOSA2LjUgOSA4IDkuNjcgOCAxMC41IDcuMzMgMTIgNi41IDEyem0zLTRDOC42NyA4IDggNy4zMyA4IDYuNVM4LjY3IDUgOS41IDVzMS41LjY3IDEuNSAxLjVTMTAuMzMgOCA5LjUgOHptNSAwYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVTMTMuNjcgNSAxNC41IDVzMS41LjY3IDEuNSAxLjVTMTUuMzMgOCAxNC41IDh6bTMgNGMtLjgzIDAtMS41LS42Ny0xLjUtMS41UzE2LjY3IDkgMTcuNSA5czEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGlkPSJyZWZyZXNoXzI0cHgiPjxwYXRoIGQ9Ik0xNy42NSA2LjM1QzE2LjIgNC45IDE0LjIxIDQgMTIgNGMtNC40MiAwLTcuOTkgMy41OC03Ljk5IDhzMy41NyA4IDcuOTkgOGMzLjczIDAgNi44NC0yLjU1IDcuNzMtNmgtMi4wOGMtLjgyIDIuMzMtMy4wNCA0LTUuNjUgNC0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02YzEuNjYgMCAzLjE0LjY5IDQuMjIgMS43OEwxMyAxMWg3VjRsLTIuMzUgMi4zNXoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGlkPSJzZWFyY2hfMjRweCI+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0ic2V0dGluZ3NfMjRweCI+PHBhdGggZD0iTTE5LjQzIDEyLjk4Yy4wNC0uMzIuMDctLjY0LjA3LS45OHMtLjAzLS42Ni0uMDctLjk4bDIuMTEtMS42NWMuMTktLjE1LjI0LS40Mi4xMi0uNjRsLTItMy40NmMtLjEyLS4yMi0uMzktLjMtLjYxLS4yMmwtMi40OSAxYy0uNTItLjQtMS4wOC0uNzMtMS42OS0uOThsLS4zOC0yLjY1QzE0LjQ2IDIuMTggMTQuMjUgMiAxNCAyaC00Yy0uMjUgMC0uNDYuMTgtLjQ5LjQybC0uMzggMi42NWMtLjYxLjI1LTEuMTcuNTktMS42OS45OGwtMi40OS0xYy0uMjMtLjA5LS40OSAwLS42MS4yMmwtMiAzLjQ2Yy0uMTMuMjItLjA3LjQ5LjEyLjY0bDIuMTEgMS42NWMtLjA0LjMyLS4wNy42NS0uMDcuOThzLjAzLjY2LjA3Ljk4bC0yLjExIDEuNjVjLS4xOS4xNS0uMjQuNDItLjEyLjY0bDIgMy40NmMuMTIuMjIuMzkuMy42MS4yMmwyLjQ5LTFjLjUyLjQgMS4wOC43MyAxLjY5Ljk4bC4zOCAyLjY1Yy4wMy4yNC4yNC40Mi40OS40Mmg0Yy4yNSAwIC40Ni0uMTguNDktLjQybC4zOC0yLjY1Yy42MS0uMjUgMS4xNy0uNTkgMS42OS0uOThsMi40OSAxYy4yMy4wOS40OSAwIC42MS0uMjJsMi0zLjQ2Yy4xMi0uMjIuMDctLjQ5LS4xMi0uNjRsLTIuMTEtMS42NXpNMTIgMTUuNWMtMS45MyAwLTMuNS0xLjU3LTMuNS0zLjVzMS41Ny0zLjUgMy41LTMuNSAzLjUgMS41NyAzLjUgMy41LTEuNTcgMy41LTMuNSAzLjV6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0ic2V0dGluZ3NfYmFja3VwX3Jlc3RvcmVfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xNCAxMmMwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDIgLjkgMiAyIDIgMi0uOSAyLTJ6bS0yLTljLTQuOTcgMC05IDQuMDMtOSA5SDBsNCA0IDQtNEg1YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS41MSAwLTIuOTEtLjQ5LTQuMDYtMS4zbC0xLjQyIDEuNDRDOC4wNCAyMC4zIDkuOTQgMjEgMTIgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0ic2V0dGluZ3Nfb3ZlcnNjYW5fMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xMi4wMSA1LjVMMTAgOGg0bC0xLjk5LTIuNXpNMTggMTB2NGwyLjUtMS45OUwxOCAxMHpNNiAxMGwtMi41IDIuMDFMNiAxNHYtNHptOCA2aC00bDIuMDEgMi41TDE0IDE2em03LTEzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOTloMTh2MTQuMDJ6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0idmlzaWJpbGl0eV9vZmZfMjRweCI+PHBhdGggZD0iTTEyIDdjMi43NiAwIDUgMi4yNCA1IDUgMCAuNjUtLjEzIDEuMjYtLjM2IDEuODNsMi45MiAyLjkyYzEuNTEtMS4yNiAyLjctMi44OSAzLjQzLTQuNzUtMS43My00LjM5LTYtNy41LTExLTcuNS0xLjQgMC0yLjc0LjI1LTMuOTguN2wyLjE2IDIuMTZDMTAuNzQgNy4xMyAxMS4zNSA3IDEyIDd6TTIgNC4yN2wyLjI4IDIuMjguNDYuNDZDMy4wOCA4LjMgMS43OCAxMC4wMiAxIDEyYzEuNzMgNC4zOSA2IDcuNSAxMSA3LjUgMS41NSAwIDMuMDMtLjMgNC4zOC0uODRsLjQyLjQyTDE5LjczIDIyIDIxIDIwLjczIDMuMjcgMyAyIDQuMjd6TTcuNTMgOS44bDEuNTUgMS41NWMtLjA1LjIxLS4wOC40My0uMDguNjUgMCAxLjY2IDEuMzQgMyAzIDMgLjIyIDAgLjQ0LS4wMy42NS0uMDhsMS41NSAxLjU1Yy0uNjcuMzMtMS40MS41My0yLjIuNTMtMi43NiAwLTUtMi4yNC01LTUgMC0uNzkuMi0xLjUzLjUzLTIuMnptNC4zMS0uNzhsMy4xNSAzLjE1LjAyLS4xNmMwLTEuNjYtMS4zNC0zLTMtM2wtLjE3LjAxeiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgaWQ9Indhcm5pbmdfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xIDIxaDIyTDEyIDIgMSAyMXptMTItM2gtMnYtMmgydjJ6bTAtNGgtMnYtNGgydjR6Ii8+PC9zdmc+PC9kZWZzPjwvc3ZnPgo=", + "headers": [ + [ + "content-type", + "image/svg+xml; charset=utf-8" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + }, + "https://localhost:6006/index.js?_file_hash=29a7d03a": { + "data": "dmFyIENMT1NVUkVfTk9fREVQUyA9IHRydWU7CndpbmRvdy5wb2x5bWVyU2tpcExvYWRpbmdGb250Um9ib3RvID0gdHJ1ZTsKLyoqIHZpbTogZXQ6dHM9NDpzdz00OnN0cz00CiAqIEBsaWNlbnNlIFJlcXVpcmVKUyAyLjMuNiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycy4KICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UsIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXF1aXJlanMvcmVxdWlyZWpzL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKICovCi8vTm90IHVzaW5nIHN0cmljdDogdW5ldmVuIHN0cmljdCBzdXBwb3J0IGluIGJyb3dzZXJzLCAjMzkyLCBhbmQgY2F1c2VzCi8vcHJvYmxlbXMgd2l0aCByZXF1aXJlanMuZXhlYygpL3RyYW5zcGlsZXIgcGx1Z2lucyB0aGF0IG1heSBub3QgYmUgc3RyaWN0LgovKmpzbGludCByZWdleHA6IHRydWUsIG5vbWVuOiB0cnVlLCBzbG9wcHk6IHRydWUgKi8KLypnbG9iYWwgd2luZG93LCBuYXZpZ2F0b3IsIGRvY3VtZW50LCBpbXBvcnRTY3JpcHRzLCBzZXRUaW1lb3V0LCBvcGVyYSAqLwoKdmFyIHJlcXVpcmVqcywgcmVxdWlyZSwgZGVmaW5lOwooZnVuY3Rpb24gKGdsb2JhbCwgc2V0VGltZW91dCkgewogICAgdmFyIHJlcSwgcywgaGVhZCwgYmFzZUVsZW1lbnQsIGRhdGFNYWluLCBzcmMsCiAgICAgICAgaW50ZXJhY3RpdmVTY3JpcHQsIGN1cnJlbnRseUFkZGluZ1NjcmlwdCwgbWFpblNjcmlwdCwgc3ViUGF0aCwKICAgICAgICB2ZXJzaW9uID0gJzIuMy42JywKICAgICAgICBjb21tZW50UmVnRXhwID0gL1wvXCpbXHNcU10qP1wqXC98KFteOiInPV18XilcL1wvLiokL21nLAogICAgICAgIGNqc1JlcXVpcmVSZWdFeHAgPSAvW14uXVxzKnJlcXVpcmVccypcKFxzKlsiJ10oW14nIlxzXSspWyInXVxzKlwpL2csCiAgICAgICAganNTdWZmaXhSZWdFeHAgPSAvXC5qcyQvLAogICAgICAgIGN1cnJEaXJSZWdFeHAgPSAvXlwuXC8vLAogICAgICAgIG9wID0gT2JqZWN0LnByb3RvdHlwZSwKICAgICAgICBvc3RyaW5nID0gb3AudG9TdHJpbmcsCiAgICAgICAgaGFzT3duID0gb3AuaGFzT3duUHJvcGVydHksCiAgICAgICAgaXNCcm93c2VyID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50KSwKICAgICAgICBpc1dlYldvcmtlciA9ICFpc0Jyb3dzZXIgJiYgdHlwZW9mIGltcG9ydFNjcmlwdHMgIT09ICd1bmRlZmluZWQnLAogICAgICAgIC8vUFMzIGluZGljYXRlcyBsb2FkZWQgYW5kIGNvbXBsZXRlLCBidXQgbmVlZCB0byB3YWl0IGZvciBjb21wbGV0ZQogICAgICAgIC8vc3BlY2lmaWNhbGx5LiBTZXF1ZW5jZSBpcyAnbG9hZGluZycsICdsb2FkZWQnLCBleGVjdXRpb24sCiAgICAgICAgLy8gdGhlbiAnY29tcGxldGUnLiBUaGUgVUEgY2hlY2sgaXMgdW5mb3J0dW5hdGUsIGJ1dCBub3Qgc3VyZSBob3cKICAgICAgICAvL3RvIGZlYXR1cmUgdGVzdCB3L28gY2F1c2luZyBwZXJmIGlzc3Vlcy4KICAgICAgICByZWFkeVJlZ0V4cCA9IGlzQnJvd3NlciAmJiBuYXZpZ2F0b3IucGxhdGZvcm0gPT09ICdQTEFZU1RBVElPTiAzJyA/CiAgICAgICAgICAgICAgICAgICAgICAvXmNvbXBsZXRlJC8gOiAvXihjb21wbGV0ZXxsb2FkZWQpJC8sCiAgICAgICAgZGVmQ29udGV4dE5hbWUgPSAnXycsCiAgICAgICAgLy9PaCB0aGUgdHJhZ2VkeSwgZGV0ZWN0aW5nIG9wZXJhLiBTZWUgdGhlIHVzYWdlIG9mIGlzT3BlcmEgZm9yIHJlYXNvbi4KICAgICAgICBpc09wZXJhID0gdHlwZW9mIG9wZXJhICE9PSAndW5kZWZpbmVkJyAmJiBvcGVyYS50b1N0cmluZygpID09PSAnW29iamVjdCBPcGVyYV0nLAogICAgICAgIGNvbnRleHRzID0ge30sCiAgICAgICAgY2ZnID0ge30sCiAgICAgICAgZ2xvYmFsRGVmUXVldWUgPSBbXSwKICAgICAgICB1c2VJbnRlcmFjdGl2ZSA9IGZhbHNlOwoKICAgIC8vQ291bGQgbWF0Y2ggc29tZXRoaW5nIGxpa2UgJykvL2NvbW1lbnQnLCBkbyBub3QgbG9zZSB0aGUgcHJlZml4IHRvIGNvbW1lbnQuCiAgICBmdW5jdGlvbiBjb21tZW50UmVwbGFjZShtYXRjaCwgc2luZ2xlUHJlZml4KSB7CiAgICAgICAgcmV0dXJuIHNpbmdsZVByZWZpeCB8fCAnJzsKICAgIH0KCiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uKGl0KSB7CiAgICAgICAgcmV0dXJuIG9zdHJpbmcuY2FsbChpdCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7CiAgICB9CgogICAgZnVuY3Rpb24gaXNBcnJheShpdCkgewogICAgICAgIHJldHVybiBvc3RyaW5nLmNhbGwoaXQpID09PSAnW29iamVjdCBBcnJheV0nOwogICAgfQoKICAgIC8qKgogICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciBpdGVyYXRpbmcgb3ZlciBhbiBhcnJheS4gSWYgdGhlIGZ1bmMgcmV0dXJucwogICAgICogYSB0cnVlIHZhbHVlLCBpdCB3aWxsIGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KICAgICAqLwogICAgZnVuY3Rpb24gZWFjaChhcnksIGZ1bmMpIHsKICAgICAgICBpZiAoYXJ5KSB7CiAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJ5Lmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICBpZiAoYXJ5W2ldICYmIGZ1bmMoYXJ5W2ldLCBpLCBhcnkpKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGl0ZXJhdGluZyBvdmVyIGFuIGFycmF5IGJhY2t3YXJkcy4gSWYgdGhlIGZ1bmMKICAgICAqIHJldHVybnMgYSB0cnVlIHZhbHVlLCBpdCB3aWxsIGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KICAgICAqLwogICAgZnVuY3Rpb24gZWFjaFJldmVyc2UoYXJ5LCBmdW5jKSB7CiAgICAgICAgaWYgKGFyeSkgewogICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgZm9yIChpID0gYXJ5Lmxlbmd0aCAtIDE7IGkgPiAtMTsgaSAtPSAxKSB7CiAgICAgICAgICAgICAgICBpZiAoYXJ5W2ldICYmIGZ1bmMoYXJ5W2ldLCBpLCBhcnkpKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaGFzUHJvcChvYmosIHByb3ApIHsKICAgICAgICByZXR1cm4gaGFzT3duLmNhbGwob2JqLCBwcm9wKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRPd24ob2JqLCBwcm9wKSB7CiAgICAgICAgcmV0dXJuIGhhc1Byb3Aob2JqLCBwcm9wKSAmJiBvYmpbcHJvcF07CiAgICB9CgogICAgLyoqCiAgICAgKiBDeWNsZXMgb3ZlciBwcm9wZXJ0aWVzIGluIGFuIG9iamVjdCBhbmQgY2FsbHMgYSBmdW5jdGlvbiBmb3IgZWFjaAogICAgICogcHJvcGVydHkgdmFsdWUuIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgdHJ1dGh5IHZhbHVlLCB0aGVuIHRoZQogICAgICogaXRlcmF0aW9uIGlzIHN0b3BwZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVhY2hQcm9wKG9iaiwgZnVuYykgewogICAgICAgIHZhciBwcm9wOwogICAgICAgIGZvciAocHJvcCBpbiBvYmopIHsKICAgICAgICAgICAgaWYgKGhhc1Byb3Aob2JqLCBwcm9wKSkgewogICAgICAgICAgICAgICAgaWYgKGZ1bmMob2JqW3Byb3BdLCBwcm9wKSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU2ltcGxlIGZ1bmN0aW9uIHRvIG1peCBpbiBwcm9wZXJ0aWVzIGZyb20gc291cmNlIGludG8gdGFyZ2V0LAogICAgICogYnV0IG9ubHkgaWYgdGFyZ2V0IGRvZXMgbm90IGFscmVhZHkgaGF2ZSBhIHByb3BlcnR5IG9mIHRoZSBzYW1lIG5hbWUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1peGluKHRhcmdldCwgc291cmNlLCBmb3JjZSwgZGVlcFN0cmluZ01peGluKSB7CiAgICAgICAgaWYgKHNvdXJjZSkgewogICAgICAgICAgICBlYWNoUHJvcChzb3VyY2UsIGZ1bmN0aW9uICh2YWx1ZSwgcHJvcCkgewogICAgICAgICAgICAgICAgaWYgKGZvcmNlIHx8ICFoYXNQcm9wKHRhcmdldCwgcHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGVlcFN0cmluZ01peGluICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIWlzQXJyYXkodmFsdWUpICYmICFpc0Z1bmN0aW9uKHZhbHVlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXRbcHJvcF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG1peGluKHRhcmdldFtwcm9wXSwgdmFsdWUsIGZvcmNlLCBkZWVwU3RyaW5nTWl4aW4pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CgogICAgLy9TaW1pbGFyIHRvIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLCBidXQgdGhlICd0aGlzJyBvYmplY3QgaXMgc3BlY2lmaWVkCiAgICAvL2ZpcnN0LCBzaW5jZSBpdCBpcyBlYXNpZXIgdG8gcmVhZC9maWd1cmUgb3V0IHdoYXQgJ3RoaXMnIHdpbGwgYmUuCiAgICBmdW5jdGlvbiBiaW5kKG9iaiwgZm4pIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkob2JqLCBhcmd1bWVudHMpOwogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2NyaXB0cygpIHsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRPbkVycm9yKGVycikgewogICAgICAgIHRocm93IGVycjsKICAgIH0KCiAgICAvL0FsbG93IGdldHRpbmcgYSBnbG9iYWwgdGhhdCBpcyBleHByZXNzZWQgaW4KICAgIC8vZG90IG5vdGF0aW9uLCBsaWtlICdhLmIuYycuCiAgICBmdW5jdGlvbiBnZXRHbG9iYWwodmFsdWUpIHsKICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgdmFyIGcgPSBnbG9iYWw7CiAgICAgICAgZWFjaCh2YWx1ZS5zcGxpdCgnLicpLCBmdW5jdGlvbiAocGFydCkgewogICAgICAgICAgICBnID0gZ1twYXJ0XTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZzsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN0cnVjdHMgYW4gZXJyb3Igd2l0aCBhIHBvaW50ZXIgdG8gYW4gVVJMIHdpdGggbW9yZSBpbmZvcm1hdGlvbi4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCB0aGUgZXJyb3IgSUQgdGhhdCBtYXBzIHRvIGFuIElEIG9uIGEgd2ViIHBhZ2UuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBodW1hbiByZWFkYWJsZSBlcnJvci4KICAgICAqIEBwYXJhbSB7RXJyb3J9IFtlcnJdIHRoZSBvcmlnaW5hbCBlcnJvciwgaWYgdGhlcmUgaXMgb25lLgogICAgICoKICAgICAqIEByZXR1cm5zIHtFcnJvcn0KICAgICAqLwogICAgZnVuY3Rpb24gbWFrZUVycm9yKGlkLCBtc2csIGVyciwgcmVxdWlyZU1vZHVsZXMpIHsKICAgICAgICB2YXIgZSA9IG5ldyBFcnJvcihtc2cgKyAnXG5odHRwczovL3JlcXVpcmVqcy5vcmcvZG9jcy9lcnJvcnMuaHRtbCMnICsgaWQpOwogICAgICAgIGUucmVxdWlyZVR5cGUgPSBpZDsKICAgICAgICBlLnJlcXVpcmVNb2R1bGVzID0gcmVxdWlyZU1vZHVsZXM7CiAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICBlLm9yaWdpbmFsRXJyb3IgPSBlcnI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBlOwogICAgfQoKICAgIGlmICh0eXBlb2YgZGVmaW5lICE9PSAndW5kZWZpbmVkJykgewogICAgICAgIC8vSWYgYSBkZWZpbmUgaXMgYWxyZWFkeSBpbiBwbGF5IHZpYSBhbm90aGVyIEFNRCBsb2FkZXIsCiAgICAgICAgLy9kbyBub3Qgb3ZlcndyaXRlLgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAodHlwZW9mIHJlcXVpcmVqcyAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICBpZiAoaXNGdW5jdGlvbihyZXF1aXJlanMpKSB7CiAgICAgICAgICAgIC8vRG8gbm90IG92ZXJ3cml0ZSBhbiBleGlzdGluZyByZXF1aXJlanMgaW5zdGFuY2UuCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY2ZnID0gcmVxdWlyZWpzOwogICAgICAgIHJlcXVpcmVqcyA9IHVuZGVmaW5lZDsKICAgIH0KCiAgICAvL0FsbG93IGZvciBhIHJlcXVpcmUgY29uZmlnIG9iamVjdAogICAgaWYgKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJyAmJiAhaXNGdW5jdGlvbihyZXF1aXJlKSkgewogICAgICAgIC8vYXNzdW1lIGl0IGlzIGEgY29uZmlnIG9iamVjdC4KICAgICAgICBjZmcgPSByZXF1aXJlOwogICAgICAgIHJlcXVpcmUgPSB1bmRlZmluZWQ7CiAgICB9CgogICAgZnVuY3Rpb24gbmV3Q29udGV4dChjb250ZXh0TmFtZSkgewogICAgICAgIHZhciBpbkNoZWNrTG9hZGVkLCBNb2R1bGUsIGNvbnRleHQsIGhhbmRsZXJzLAogICAgICAgICAgICBjaGVja0xvYWRlZFRpbWVvdXRJZCwKICAgICAgICAgICAgY29uZmlnID0gewogICAgICAgICAgICAgICAgLy9EZWZhdWx0cy4gRG8gbm90IHNldCBhIGRlZmF1bHQgZm9yIG1hcAogICAgICAgICAgICAgICAgLy9jb25maWcgdG8gc3BlZWQgdXAgbm9ybWFsaXplKCksIHdoaWNoCiAgICAgICAgICAgICAgICAvL3dpbGwgcnVuIGZhc3RlciBpZiB0aGVyZSBpcyBubyBkZWZhdWx0LgogICAgICAgICAgICAgICAgd2FpdFNlY29uZHM6IDcsCiAgICAgICAgICAgICAgICBiYXNlVXJsOiAnLi8nLAogICAgICAgICAgICAgICAgcGF0aHM6IHt9LAogICAgICAgICAgICAgICAgYnVuZGxlczoge30sCiAgICAgICAgICAgICAgICBwa2dzOiB7fSwKICAgICAgICAgICAgICAgIHNoaW06IHt9LAogICAgICAgICAgICAgICAgY29uZmlnOiB7fQogICAgICAgICAgICB9LAogICAgICAgICAgICByZWdpc3RyeSA9IHt9LAogICAgICAgICAgICAvL3JlZ2lzdHJ5IG9mIGp1c3QgZW5hYmxlZCBtb2R1bGVzLCB0byBzcGVlZAogICAgICAgICAgICAvL2N5Y2xlIGJyZWFraW5nIGNvZGUgd2hlbiBsb3RzIG9mIG1vZHVsZXMKICAgICAgICAgICAgLy9hcmUgcmVnaXN0ZXJlZCwgYnV0IG5vdCBhY3RpdmF0ZWQuCiAgICAgICAgICAgIGVuYWJsZWRSZWdpc3RyeSA9IHt9LAogICAgICAgICAgICB1bmRlZkV2ZW50cyA9IHt9LAogICAgICAgICAgICBkZWZRdWV1ZSA9IFtdLAogICAgICAgICAgICBkZWZpbmVkID0ge30sCiAgICAgICAgICAgIHVybEZldGNoZWQgPSB7fSwKICAgICAgICAgICAgYnVuZGxlc01hcCA9IHt9LAogICAgICAgICAgICByZXF1aXJlQ291bnRlciA9IDEsCiAgICAgICAgICAgIHVubm9ybWFsaXplZENvdW50ZXIgPSAxOwoKICAgICAgICAvKioKICAgICAgICAgKiBUcmltcyB0aGUgLiBhbmQgLi4gZnJvbSBhbiBhcnJheSBvZiBwYXRoIHNlZ21lbnRzLgogICAgICAgICAqIEl0IHdpbGwga2VlcCBhIGxlYWRpbmcgcGF0aCBzZWdtZW50IGlmIGEgLi4gd2lsbCBiZWNvbWUKICAgICAgICAgKiB0aGUgZmlyc3QgcGF0aCBzZWdtZW50LCB0byBoZWxwIHdpdGggbW9kdWxlIG5hbWUgbG9va3VwcywKICAgICAgICAgKiB3aGljaCBhY3QgbGlrZSBwYXRocywgYnV0IGNhbiBiZSByZW1hcHBlZC4gQnV0IHRoZSBlbmQgcmVzdWx0LAogICAgICAgICAqIGFsbCBwYXRocyB0aGF0IHVzZSB0aGlzIGZ1bmN0aW9uIHNob3VsZCBsb29rIG5vcm1hbGl6ZWQuCiAgICAgICAgICogTk9URTogdGhpcyBtZXRob2QgTU9ESUZJRVMgdGhlIGlucHV0IGFycmF5LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyeSB0aGUgYXJyYXkgb2YgcGF0aCBzZWdtZW50cy4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB0cmltRG90cyhhcnkpIHsKICAgICAgICAgICAgdmFyIGksIHBhcnQ7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcnkubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHBhcnQgPSBhcnlbaV07CiAgICAgICAgICAgICAgICBpZiAocGFydCA9PT0gJy4nKSB7CiAgICAgICAgICAgICAgICAgICAgYXJ5LnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgICBpIC09IDE7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQgPT09ICcuLicpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiBhdCB0aGUgc3RhcnQsIG9yIHByZXZpb3VzIHZhbHVlIGlzIHN0aWxsIC4uLAogICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgdGhlbSBzbyB0aGF0IHdoZW4gY29udmVydGVkIHRvIGEgcGF0aCBpdCBtYXkKICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCB3b3JrIHdoZW4gY29udmVydGVkIHRvIGEgcGF0aCwgZXZlbiB0aG91Z2gKICAgICAgICAgICAgICAgICAgICAvLyBhcyBhbiBJRCBpdCBpcyBsZXNzIHRoYW4gaWRlYWwuIEluIGxhcmdlciBwb2ludAogICAgICAgICAgICAgICAgICAgIC8vIHJlbGVhc2VzLCBtYXkgYmUgYmV0dGVyIHRvIGp1c3Qga2ljayBvdXQgYW4gZXJyb3IuCiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDAgfHwgKGkgPT09IDEgJiYgYXJ5WzJdID09PSAnLi4nKSB8fCBhcnlbaSAtIDFdID09PSAnLi4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXJ5LnNwbGljZShpIC0gMSwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgLT0gMjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEdpdmVuIGEgcmVsYXRpdmUgbW9kdWxlIG5hbWUsIGxpa2UgLi9zb21ldGhpbmcsIG5vcm1hbGl6ZSBpdCB0bwogICAgICAgICAqIGEgcmVhbCBuYW1lIHRoYXQgY2FuIGJlIG1hcHBlZCB0byBhIHBhdGguCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIHJlbGF0aXZlIG5hbWUKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmFzZU5hbWUgYSByZWFsIG5hbWUgdGhhdCB0aGUgbmFtZSBhcmcgaXMgcmVsYXRpdmUKICAgICAgICAgKiB0by4KICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFwcGx5TWFwIGFwcGx5IHRoZSBtYXAgY29uZmlnIHRvIHRoZSB2YWx1ZS4gU2hvdWxkCiAgICAgICAgICogb25seSBiZSBkb25lIGlmIHRoaXMgbm9ybWFsaXphdGlvbiBpcyBmb3IgYSBkZXBlbmRlbmN5IElELgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IG5vcm1hbGl6ZWQgbmFtZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZShuYW1lLCBiYXNlTmFtZSwgYXBwbHlNYXApIHsKICAgICAgICAgICAgdmFyIHBrZ01haW4sIG1hcFZhbHVlLCBuYW1lUGFydHMsIGksIGosIG5hbWVTZWdtZW50LCBsYXN0SW5kZXgsCiAgICAgICAgICAgICAgICBmb3VuZE1hcCwgZm91bmRJLCBmb3VuZFN0YXJNYXAsIHN0YXJJLCBub3JtYWxpemVkQmFzZVBhcnRzLAogICAgICAgICAgICAgICAgYmFzZVBhcnRzID0gKGJhc2VOYW1lICYmIGJhc2VOYW1lLnNwbGl0KCcvJykpLAogICAgICAgICAgICAgICAgbWFwID0gY29uZmlnLm1hcCwKICAgICAgICAgICAgICAgIHN0YXJNYXAgPSBtYXAgJiYgbWFwWycqJ107CgogICAgICAgICAgICAvL0FkanVzdCBhbnkgcmVsYXRpdmUgcGF0aHMuCiAgICAgICAgICAgIGlmIChuYW1lKSB7CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zcGxpdCgnLycpOwogICAgICAgICAgICAgICAgbGFzdEluZGV4ID0gbmFtZS5sZW5ndGggLSAxOwoKICAgICAgICAgICAgICAgIC8vIElmIHdhbnRpbmcgbm9kZSBJRCBjb21wYXRpYmlsaXR5LCBzdHJpcCAuanMgZnJvbSBlbmQKICAgICAgICAgICAgICAgIC8vIG9mIElEcy4gSGF2ZSB0byBkbyB0aGlzIGhlcmUsIGFuZCBub3QgaW4gbmFtZVRvVXJsCiAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIG5vZGUgYWxsb3dzIGVpdGhlciAuanMgb3Igbm9uIC5qcyB0byBtYXAKICAgICAgICAgICAgICAgIC8vIHRvIHNhbWUgZmlsZS4KICAgICAgICAgICAgICAgIGlmIChjb25maWcubm9kZUlkQ29tcGF0ICYmIGpzU3VmZml4UmVnRXhwLnRlc3QobmFtZVtsYXN0SW5kZXhdKSkgewogICAgICAgICAgICAgICAgICAgIG5hbWVbbGFzdEluZGV4XSA9IG5hbWVbbGFzdEluZGV4XS5yZXBsYWNlKGpzU3VmZml4UmVnRXhwLCAnJyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gU3RhcnRzIHdpdGggYSAnLicgc28gbmVlZCB0aGUgYmFzZU5hbWUKICAgICAgICAgICAgICAgIGlmIChuYW1lWzBdLmNoYXJBdCgwKSA9PT0gJy4nICYmIGJhc2VQYXJ0cykgewogICAgICAgICAgICAgICAgICAgIC8vQ29udmVydCBiYXNlTmFtZSB0byBhcnJheSwgYW5kIGxvcCBvZmYgdGhlIGxhc3QgcGFydCwKICAgICAgICAgICAgICAgICAgICAvL3NvIHRoYXQgLiBtYXRjaGVzIHRoYXQgJ2RpcmVjdG9yeScgYW5kIG5vdCBuYW1lIG9mIHRoZSBiYXNlTmFtZSdzCiAgICAgICAgICAgICAgICAgICAgLy9tb2R1bGUuIEZvciBpbnN0YW5jZSwgYmFzZU5hbWUgb2YgJ29uZS90d28vdGhyZWUnLCBtYXBzIHRvCiAgICAgICAgICAgICAgICAgICAgLy8nb25lL3R3by90aHJlZS5qcycsIGJ1dCB3ZSB3YW50IHRoZSBkaXJlY3RvcnksICdvbmUvdHdvJyBmb3IKICAgICAgICAgICAgICAgICAgICAvL3RoaXMgbm9ybWFsaXphdGlvbi4KICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkQmFzZVBhcnRzID0gYmFzZVBhcnRzLnNsaWNlKDAsIGJhc2VQYXJ0cy5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgICAgICBuYW1lID0gbm9ybWFsaXplZEJhc2VQYXJ0cy5jb25jYXQobmFtZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdHJpbURvdHMobmFtZSk7CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5qb2luKCcvJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vQXBwbHkgbWFwIGNvbmZpZyBpZiBhdmFpbGFibGUuCiAgICAgICAgICAgIGlmIChhcHBseU1hcCAmJiBtYXAgJiYgKGJhc2VQYXJ0cyB8fCBzdGFyTWFwKSkgewogICAgICAgICAgICAgICAgbmFtZVBhcnRzID0gbmFtZS5zcGxpdCgnLycpOwoKICAgICAgICAgICAgICAgIG91dGVyTG9vcDogZm9yIChpID0gbmFtZVBhcnRzLmxlbmd0aDsgaSA+IDA7IGkgLT0gMSkgewogICAgICAgICAgICAgICAgICAgIG5hbWVTZWdtZW50ID0gbmFtZVBhcnRzLnNsaWNlKDAsIGkpLmpvaW4oJy8nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VQYXJ0cykgewogICAgICAgICAgICAgICAgICAgICAgICAvL0ZpbmQgdGhlIGxvbmdlc3QgYmFzZU5hbWUgc2VnbWVudCBtYXRjaCBpbiB0aGUgY29uZmlnLgogICAgICAgICAgICAgICAgICAgICAgICAvL1NvLCBkbyBqb2lucyBvbiB0aGUgYmlnZ2VzdCB0byBzbWFsbGVzdCBsZW5ndGhzIG9mIGJhc2VQYXJ0cy4KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gYmFzZVBhcnRzLmxlbmd0aDsgaiA+IDA7IGogLT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwVmFsdWUgPSBnZXRPd24obWFwLCBiYXNlUGFydHMuc2xpY2UoMCwgaikuam9pbignLycpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Jhc2VOYW1lIHNlZ21lbnQgaGFzIGNvbmZpZywgZmluZCBpZiBpdCBoYXMgb25lIGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIG5hbWUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBWYWx1ZSA9IGdldE93bihtYXBWYWx1ZSwgbmFtZVNlZ21lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01hdGNoLCB1cGRhdGUgbmFtZSB0byB0aGUgbmV3IHZhbHVlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZE1hcCA9IG1hcFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEkgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlckxvb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvL0NoZWNrIGZvciBhIHN0YXIgbWFwIG1hdGNoLCBidXQganVzdCBob2xkIG9uIHRvIGl0LAogICAgICAgICAgICAgICAgICAgIC8vaWYgdGhlcmUgaXMgYSBzaG9ydGVyIHNlZ21lbnQgbWF0Y2ggbGF0ZXIgaW4gYSBtYXRjaGluZwogICAgICAgICAgICAgICAgICAgIC8vY29uZmlnLCB0aGVuIGZhdm9yIG92ZXIgdGhpcyBzdGFyIG1hcC4KICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kU3Rhck1hcCAmJiBzdGFyTWFwICYmIGdldE93bihzdGFyTWFwLCBuYW1lU2VnbWVudCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRTdGFyTWFwID0gZ2V0T3duKHN0YXJNYXAsIG5hbWVTZWdtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhckkgPSBpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kTWFwICYmIGZvdW5kU3Rhck1hcCkgewogICAgICAgICAgICAgICAgICAgIGZvdW5kTWFwID0gZm91bmRTdGFyTWFwOwogICAgICAgICAgICAgICAgICAgIGZvdW5kSSA9IHN0YXJJOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChmb3VuZE1hcCkgewogICAgICAgICAgICAgICAgICAgIG5hbWVQYXJ0cy5zcGxpY2UoMCwgZm91bmRJLCBmb3VuZE1hcCk7CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWVQYXJ0cy5qb2luKCcvJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElmIHRoZSBuYW1lIHBvaW50cyB0byBhIHBhY2thZ2UncyBuYW1lLCB1c2UKICAgICAgICAgICAgLy8gdGhlIHBhY2thZ2UgbWFpbiBpbnN0ZWFkLgogICAgICAgICAgICBwa2dNYWluID0gZ2V0T3duKGNvbmZpZy5wa2dzLCBuYW1lKTsKCiAgICAgICAgICAgIHJldHVybiBwa2dNYWluID8gcGtnTWFpbiA6IG5hbWU7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByZW1vdmVTY3JpcHQobmFtZSkgewogICAgICAgICAgICBpZiAoaXNCcm93c2VyKSB7CiAgICAgICAgICAgICAgICBlYWNoKHNjcmlwdHMoKSwgZnVuY3Rpb24gKHNjcmlwdE5vZGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2NyaXB0Tm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVxdWlyZW1vZHVsZScpID09PSBuYW1lICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHROb2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlY29udGV4dCcpID09PSBjb250ZXh0LmNvbnRleHROYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JpcHROb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGhhc1BhdGhGYWxsYmFjayhpZCkgewogICAgICAgICAgICB2YXIgcGF0aENvbmZpZyA9IGdldE93bihjb25maWcucGF0aHMsIGlkKTsKICAgICAgICAgICAgaWYgKHBhdGhDb25maWcgJiYgaXNBcnJheShwYXRoQ29uZmlnKSAmJiBwYXRoQ29uZmlnLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgIC8vUG9wIG9mZiB0aGUgZmlyc3QgYXJyYXkgdmFsdWUsIHNpbmNlIGl0IGZhaWxlZCwgYW5kCiAgICAgICAgICAgICAgICAvL3JldHJ5CiAgICAgICAgICAgICAgICBwYXRoQ29uZmlnLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBjb250ZXh0LnJlcXVpcmUudW5kZWYoaWQpOwoKICAgICAgICAgICAgICAgIC8vQ3VzdG9tIHJlcXVpcmUgdGhhdCBkb2VzIG5vdCBkbyBtYXAgdHJhbnNsYXRpb24sIHNpbmNlCiAgICAgICAgICAgICAgICAvL0lEIGlzICJhYnNvbHV0ZSIsIGFscmVhZHkgbWFwcGVkL3Jlc29sdmVkLgogICAgICAgICAgICAgICAgY29udGV4dC5tYWtlUmVxdWlyZShudWxsLCB7CiAgICAgICAgICAgICAgICAgICAgc2tpcE1hcDogdHJ1ZQogICAgICAgICAgICAgICAgfSkoW2lkXSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vVHVybnMgYSBwbHVnaW4hcmVzb3VyY2UgdG8gW3BsdWdpbiwgcmVzb3VyY2VdCiAgICAgICAgLy93aXRoIHRoZSBwbHVnaW4gYmVpbmcgdW5kZWZpbmVkIGlmIHRoZSBuYW1lCiAgICAgICAgLy9kaWQgbm90IGhhdmUgYSBwbHVnaW4gcHJlZml4LgogICAgICAgIGZ1bmN0aW9uIHNwbGl0UHJlZml4KG5hbWUpIHsKICAgICAgICAgICAgdmFyIHByZWZpeCwKICAgICAgICAgICAgICAgIGluZGV4ID0gbmFtZSA/IG5hbWUuaW5kZXhPZignIScpIDogLTE7CiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7CiAgICAgICAgICAgICAgICBwcmVmaXggPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxLCBuYW1lLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtwcmVmaXgsIG5hbWVdOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIG1vZHVsZSBtYXBwaW5nIHRoYXQgaW5jbHVkZXMgcGx1Z2luIHByZWZpeCwgbW9kdWxlCiAgICAgICAgICogbmFtZSwgYW5kIHBhdGguIElmIHBhcmVudE1vZHVsZU1hcCBpcyBwcm92aWRlZCBpdCB3aWxsCiAgICAgICAgICogYWxzbyBub3JtYWxpemUgdGhlIG5hbWUgdmlhIHJlcXVpcmUubm9ybWFsaXplKCkKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBtb2R1bGUgbmFtZQogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyZW50TW9kdWxlTWFwXSBwYXJlbnQgbW9kdWxlIG1hcAogICAgICAgICAqIGZvciB0aGUgbW9kdWxlIG5hbWUsIHVzZWQgdG8gcmVzb2x2ZSByZWxhdGl2ZSBuYW1lcy4KICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzTm9ybWFsaXplZDogaXMgdGhlIElEIGFscmVhZHkgbm9ybWFsaXplZC4KICAgICAgICAgKiBUaGlzIGlzIHRydWUgaWYgdGhpcyBjYWxsIGlzIGRvbmUgZm9yIGEgZGVmaW5lKCkgbW9kdWxlIElELgogICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXBwbHlNYXA6IGFwcGx5IHRoZSBtYXAgY29uZmlnIHRvIHRoZSBJRC4KICAgICAgICAgKiBTaG91bGQgb25seSBiZSB0cnVlIGlmIHRoaXMgbWFwIGlzIGZvciBhIGRlcGVuZGVuY3kuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIG1ha2VNb2R1bGVNYXAobmFtZSwgcGFyZW50TW9kdWxlTWFwLCBpc05vcm1hbGl6ZWQsIGFwcGx5TWFwKSB7CiAgICAgICAgICAgIHZhciB1cmwsIHBsdWdpbk1vZHVsZSwgc3VmZml4LCBuYW1lUGFydHMsCiAgICAgICAgICAgICAgICBwcmVmaXggPSBudWxsLAogICAgICAgICAgICAgICAgcGFyZW50TmFtZSA9IHBhcmVudE1vZHVsZU1hcCA/IHBhcmVudE1vZHVsZU1hcC5uYW1lIDogbnVsbCwKICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZSA9IG5hbWUsCiAgICAgICAgICAgICAgICBpc0RlZmluZSA9IHRydWUsCiAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9ICcnOwoKICAgICAgICAgICAgLy9JZiBubyBuYW1lLCB0aGVuIGl0IG1lYW5zIGl0IGlzIGEgcmVxdWlyZSBjYWxsLCBnZW5lcmF0ZSBhbgogICAgICAgICAgICAvL2ludGVybmFsIG5hbWUuCiAgICAgICAgICAgIGlmICghbmFtZSkgewogICAgICAgICAgICAgICAgaXNEZWZpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIG5hbWUgPSAnX0ByJyArIChyZXF1aXJlQ291bnRlciArPSAxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmFtZVBhcnRzID0gc3BsaXRQcmVmaXgobmFtZSk7CiAgICAgICAgICAgIHByZWZpeCA9IG5hbWVQYXJ0c1swXTsKICAgICAgICAgICAgbmFtZSA9IG5hbWVQYXJ0c1sxXTsKCiAgICAgICAgICAgIGlmIChwcmVmaXgpIHsKICAgICAgICAgICAgICAgIHByZWZpeCA9IG5vcm1hbGl6ZShwcmVmaXgsIHBhcmVudE5hbWUsIGFwcGx5TWFwKTsKICAgICAgICAgICAgICAgIHBsdWdpbk1vZHVsZSA9IGdldE93bihkZWZpbmVkLCBwcmVmaXgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL0FjY291bnQgZm9yIHJlbGF0aXZlIHBhdGhzIGlmIHRoZXJlIGlzIGEgYmFzZSBuYW1lLgogICAgICAgICAgICBpZiAobmFtZSkgewogICAgICAgICAgICAgICAgaWYgKHByZWZpeCkgewogICAgICAgICAgICAgICAgICAgIGlmIChpc05vcm1hbGl6ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZE5hbWUgPSBuYW1lOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGx1Z2luTW9kdWxlICYmIHBsdWdpbk1vZHVsZS5ub3JtYWxpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9QbHVnaW4gaXMgbG9hZGVkLCB1c2UgaXRzIG5vcm1hbGl6ZSBtZXRob2QuCiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lID0gcGx1Z2luTW9kdWxlLm5vcm1hbGl6ZShuYW1lLCBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShuYW1lLCBwYXJlbnROYW1lLCBhcHBseU1hcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5lc3RlZCBwbHVnaW4gcmVmZXJlbmNlcywgdGhlbiBkbyBub3QgdHJ5IHRvCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSwgYXMgaXQgd2lsbCBub3Qgbm9ybWFsaXplIGNvcnJlY3RseS4gVGhpcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBwbGFjZXMgYSByZXN0cmljdGlvbiBvbiByZXNvdXJjZUlkcywgYW5kIHRoZSBsb25nZXIKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybSBzb2x1dGlvbiBpcyBub3QgdG8gbm9ybWFsaXplIHVudGlsIHBsdWdpbnMgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWRlZCBhbmQgYWxsIG5vcm1hbGl6YXRpb25zIHRvIGFsbG93IGZvciBhc3luYwogICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkaW5nIG9mIGEgbG9hZGVyIHBsdWdpbi4gQnV0IGZvciBub3csIGZpeGVzIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21tb24gdXNlcy4gRGV0YWlscyBpbiAjMTEzMQogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9IG5hbWUuaW5kZXhPZignIScpID09PSAtMSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplKG5hbWUsIHBhcmVudE5hbWUsIGFwcGx5TWFwKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vQSByZWd1bGFyIG1vZHVsZS4KICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZShuYW1lLCBwYXJlbnROYW1lLCBhcHBseU1hcCk7CgogICAgICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplZCBuYW1lIG1heSBiZSBhIHBsdWdpbiBJRCBkdWUgdG8gbWFwIGNvbmZpZwogICAgICAgICAgICAgICAgICAgIC8vYXBwbGljYXRpb24gaW4gbm9ybWFsaXplLiBUaGUgbWFwIGNvbmZpZyB2YWx1ZXMgbXVzdAogICAgICAgICAgICAgICAgICAgIC8vYWxyZWFkeSBiZSBub3JtYWxpemVkLCBzbyBkbyBub3QgbmVlZCB0byByZWRvIHRoYXQgcGFydC4KICAgICAgICAgICAgICAgICAgICBuYW1lUGFydHMgPSBzcGxpdFByZWZpeChub3JtYWxpemVkTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gbmFtZVBhcnRzWzBdOwogICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lID0gbmFtZVBhcnRzWzFdOwogICAgICAgICAgICAgICAgICAgIGlzTm9ybWFsaXplZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIHVybCA9IGNvbnRleHQubmFtZVRvVXJsKG5vcm1hbGl6ZWROYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9JZiB0aGUgaWQgaXMgYSBwbHVnaW4gaWQgdGhhdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBpZiBpdCBuZWVkcwogICAgICAgICAgICAvL25vcm1hbGl6YXRpb24sIHN0YW1wIGl0IHdpdGggYSB1bmlxdWUgSUQgc28gdHdvIG1hdGNoaW5nIHJlbGF0aXZlCiAgICAgICAgICAgIC8vaWRzIHRoYXQgbWF5IGNvbmZsaWN0IGNhbiBiZSBzZXBhcmF0ZS4KICAgICAgICAgICAgc3VmZml4ID0gcHJlZml4ICYmICFwbHVnaW5Nb2R1bGUgJiYgIWlzTm9ybWFsaXplZCA/CiAgICAgICAgICAgICAgICAgICAgICdfdW5ub3JtYWxpemVkJyArICh1bm5vcm1hbGl6ZWRDb3VudGVyICs9IDEpIDoKICAgICAgICAgICAgICAgICAgICAgJyc7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcHJlZml4OiBwcmVmaXgsCiAgICAgICAgICAgICAgICBuYW1lOiBub3JtYWxpemVkTmFtZSwKICAgICAgICAgICAgICAgIHBhcmVudE1hcDogcGFyZW50TW9kdWxlTWFwLAogICAgICAgICAgICAgICAgdW5ub3JtYWxpemVkOiAhIXN1ZmZpeCwKICAgICAgICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiBvcmlnaW5hbE5hbWUsCiAgICAgICAgICAgICAgICBpc0RlZmluZTogaXNEZWZpbmUsCiAgICAgICAgICAgICAgICBpZDogKHByZWZpeCA/CiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArICchJyArIG5vcm1hbGl6ZWROYW1lIDoKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZE5hbWUpICsgc3VmZml4CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBnZXRNb2R1bGUoZGVwTWFwKSB7CiAgICAgICAgICAgIHZhciBpZCA9IGRlcE1hcC5pZCwKICAgICAgICAgICAgICAgIG1vZCA9IGdldE93bihyZWdpc3RyeSwgaWQpOwoKICAgICAgICAgICAgaWYgKCFtb2QpIHsKICAgICAgICAgICAgICAgIG1vZCA9IHJlZ2lzdHJ5W2lkXSA9IG5ldyBjb250ZXh0Lk1vZHVsZShkZXBNYXApOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbW9kOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gb24oZGVwTWFwLCBuYW1lLCBmbikgewogICAgICAgICAgICB2YXIgaWQgPSBkZXBNYXAuaWQsCiAgICAgICAgICAgICAgICBtb2QgPSBnZXRPd24ocmVnaXN0cnksIGlkKTsKCiAgICAgICAgICAgIGlmIChoYXNQcm9wKGRlZmluZWQsIGlkKSAmJgogICAgICAgICAgICAgICAgICAgICghbW9kIHx8IG1vZC5kZWZpbmVFbWl0Q29tcGxldGUpKSB7CiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2RlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgZm4oZGVmaW5lZFtpZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbW9kID0gZ2V0TW9kdWxlKGRlcE1hcCk7CiAgICAgICAgICAgICAgICBpZiAobW9kLmVycm9yICYmIG5hbWUgPT09ICdlcnJvcicpIHsKICAgICAgICAgICAgICAgICAgICBmbihtb2QuZXJyb3IpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtb2Qub24obmFtZSwgZm4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBvbkVycm9yKGVyciwgZXJyYmFjaykgewogICAgICAgICAgICB2YXIgaWRzID0gZXJyLnJlcXVpcmVNb2R1bGVzLAogICAgICAgICAgICAgICAgbm90aWZpZWQgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmIChlcnJiYWNrKSB7CiAgICAgICAgICAgICAgICBlcnJiYWNrKGVycik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlYWNoKGlkcywgZnVuY3Rpb24gKGlkKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZCA9IGdldE93bihyZWdpc3RyeSwgaWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChtb2QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9TZXQgZXJyb3Igb24gbW9kdWxlLCBzbyBpdCBza2lwcyB0aW1lb3V0IGNoZWNrcy4KICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmVycm9yID0gZXJyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kLmV2ZW50cy5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGlmICghbm90aWZpZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXEub25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gdHJhbnNmZXIgZ2xvYmFsUXVldWUgaXRlbXMgdG8gdGhpcyBjb250ZXh0J3MKICAgICAgICAgKiBkZWZRdWV1ZS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB0YWtlR2xvYmFsUXVldWUoKSB7CiAgICAgICAgICAgIC8vUHVzaCBhbGwgdGhlIGdsb2JhbERlZlF1ZXVlIGl0ZW1zIGludG8gdGhlIGNvbnRleHQncyBkZWZRdWV1ZQogICAgICAgICAgICBpZiAoZ2xvYmFsRGVmUXVldWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBlYWNoKGdsb2JhbERlZlF1ZXVlLCBmdW5jdGlvbihxdWV1ZUl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBxdWV1ZUl0ZW1bMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5kZWZRdWV1ZU1hcFtpZF0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZWZRdWV1ZS5wdXNoKHF1ZXVlSXRlbSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGdsb2JhbERlZlF1ZXVlID0gW107CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGhhbmRsZXJzID0gewogICAgICAgICAgICAncmVxdWlyZSc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIGlmIChtb2QucmVxdWlyZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2QucmVxdWlyZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtb2QucmVxdWlyZSA9IGNvbnRleHQubWFrZVJlcXVpcmUobW9kLm1hcCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAnZXhwb3J0cyc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIG1vZC51c2luZ0V4cG9ydHMgPSB0cnVlOwogICAgICAgICAgICAgICAgaWYgKG1vZC5tYXAuaXNEZWZpbmUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kLmV4cG9ydHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkZWZpbmVkW21vZC5tYXAuaWRdID0gbW9kLmV4cG9ydHMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAobW9kLmV4cG9ydHMgPSBkZWZpbmVkW21vZC5tYXAuaWRdID0ge30pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ21vZHVsZSc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIGlmIChtb2QubW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZC5tb2R1bGU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAobW9kLm1vZHVsZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IG1vZC5tYXAuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHVyaTogbW9kLm1hcC51cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldE93bihjb25maWcuY29uZmlnLCBtb2QubWFwLmlkKSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogbW9kLmV4cG9ydHMgfHwgKG1vZC5leHBvcnRzID0ge30pCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBjbGVhblJlZ2lzdHJ5KGlkKSB7CiAgICAgICAgICAgIC8vQ2xlYW4gdXAgbWFjaGluZXJ5IHVzZWQgZm9yIHdhaXRpbmcgbW9kdWxlcy4KICAgICAgICAgICAgZGVsZXRlIHJlZ2lzdHJ5W2lkXTsKICAgICAgICAgICAgZGVsZXRlIGVuYWJsZWRSZWdpc3RyeVtpZF07CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBicmVha0N5Y2xlKG1vZCwgdHJhY2VkLCBwcm9jZXNzZWQpIHsKICAgICAgICAgICAgdmFyIGlkID0gbW9kLm1hcC5pZDsKCiAgICAgICAgICAgIGlmIChtb2QuZXJyb3IpIHsKICAgICAgICAgICAgICAgIG1vZC5lbWl0KCdlcnJvcicsIG1vZC5lcnJvcik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0cmFjZWRbaWRdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGVhY2gobW9kLmRlcE1hcHMsIGZ1bmN0aW9uIChkZXBNYXAsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVwSWQgPSBkZXBNYXAuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcCA9IGdldE93bihyZWdpc3RyeSwgZGVwSWQpOwoKICAgICAgICAgICAgICAgICAgICAvL09ubHkgZm9yY2UgdGhpbmdzIHRoYXQgaGF2ZSBub3QgY29tcGxldGVkCiAgICAgICAgICAgICAgICAgICAgLy9iZWluZyBkZWZpbmVkLCBzbyBzdGlsbCBpbiB0aGUgcmVnaXN0cnksCiAgICAgICAgICAgICAgICAgICAgLy9hbmQgb25seSBpZiBpdCBoYXMgbm90IGJlZW4gbWF0Y2hlZCB1cAogICAgICAgICAgICAgICAgICAgIC8vaW4gdGhlIG1vZHVsZSBhbHJlYWR5LgogICAgICAgICAgICAgICAgICAgIGlmIChkZXAgJiYgIW1vZC5kZXBNYXRjaGVkW2ldICYmICFwcm9jZXNzZWRbZGVwSWRdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRPd24odHJhY2VkLCBkZXBJZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZC5kZWZpbmVEZXAoaSwgZGVmaW5lZFtkZXBJZF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmNoZWNrKCk7IC8vcGFzcyBmYWxzZT8KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrQ3ljbGUoZGVwLCB0cmFjZWQsIHByb2Nlc3NlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHByb2Nlc3NlZFtpZF0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjaGVja0xvYWRlZCgpIHsKICAgICAgICAgICAgdmFyIGVyciwgdXNpbmdQYXRoRmFsbGJhY2ssCiAgICAgICAgICAgICAgICB3YWl0SW50ZXJ2YWwgPSBjb25maWcud2FpdFNlY29uZHMgKiAxMDAwLAogICAgICAgICAgICAgICAgLy9JdCBpcyBwb3NzaWJsZSB0byBkaXNhYmxlIHRoZSB3YWl0IGludGVydmFsIGJ5IHVzaW5nIHdhaXRTZWNvbmRzIG9mIDAuCiAgICAgICAgICAgICAgICBleHBpcmVkID0gd2FpdEludGVydmFsICYmIChjb250ZXh0LnN0YXJ0VGltZSArIHdhaXRJbnRlcnZhbCkgPCBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKICAgICAgICAgICAgICAgIG5vTG9hZHMgPSBbXSwKICAgICAgICAgICAgICAgIHJlcUNhbGxzID0gW10sCiAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSBmYWxzZSwKICAgICAgICAgICAgICAgIG5lZWRDeWNsZUNoZWNrID0gdHJ1ZTsKCiAgICAgICAgICAgIC8vRG8gbm90IGJvdGhlciBpZiB0aGlzIGNhbGwgd2FzIGEgcmVzdWx0IG9mIGEgY3ljbGUgYnJlYWsuCiAgICAgICAgICAgIGlmIChpbkNoZWNrTG9hZGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGluQ2hlY2tMb2FkZWQgPSB0cnVlOwoKICAgICAgICAgICAgLy9GaWd1cmUgb3V0IHRoZSBzdGF0ZSBvZiBhbGwgdGhlIG1vZHVsZXMuCiAgICAgICAgICAgIGVhY2hQcm9wKGVuYWJsZWRSZWdpc3RyeSwgZnVuY3Rpb24gKG1vZCkgewogICAgICAgICAgICAgICAgdmFyIG1hcCA9IG1vZC5tYXAsCiAgICAgICAgICAgICAgICAgICAgbW9kSWQgPSBtYXAuaWQ7CgogICAgICAgICAgICAgICAgLy9Ta2lwIHRoaW5ncyB0aGF0IGFyZSBub3QgZW5hYmxlZCBvciBpbiBlcnJvciBzdGF0ZS4KICAgICAgICAgICAgICAgIGlmICghbW9kLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFtYXAuaXNEZWZpbmUpIHsKICAgICAgICAgICAgICAgICAgICByZXFDYWxscy5wdXNoKG1vZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFtb2QuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBtb2R1bGUgc2hvdWxkIGJlIGV4ZWN1dGVkLCBhbmQgaXQgaGFzIG5vdAogICAgICAgICAgICAgICAgICAgIC8vYmVlbiBpbml0ZWQgYW5kIHRpbWUgaXMgdXAsIHJlbWVtYmVyIGl0LgogICAgICAgICAgICAgICAgICAgIGlmICghbW9kLmluaXRlZCAmJiBleHBpcmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNQYXRoRmFsbGJhY2sobW9kSWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ1BhdGhGYWxsYmFjayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Mb2Fkcy5wdXNoKG1vZElkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVNjcmlwdChtb2RJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtb2QuaW5pdGVkICYmIG1vZC5mZXRjaGVkICYmIG1hcC5pc0RlZmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1hcC5wcmVmaXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTm8gcmVhc29uIHRvIGtlZXAgbG9va2luZyBmb3IgdW5maW5pc2hlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sb2FkaW5nLiBJZiB0aGUgb25seSBzdGlsbExvYWRpbmcgaXMgYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wbHVnaW4gcmVzb3VyY2UgdGhvdWdoLCBrZWVwIGdvaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9iZWNhdXNlIGl0IG1heSBiZSB0aGF0IGEgcGx1Z2luIHJlc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lzIHdhaXRpbmcgb24gYSBub24tcGx1Z2luIGN5Y2xlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZWVkQ3ljbGVDaGVjayA9IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoZXhwaXJlZCAmJiBub0xvYWRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgLy9JZiB3YWl0IHRpbWUgZXhwaXJlZCwgdGhyb3cgZXJyb3Igb2YgdW5sb2FkZWQgbW9kdWxlcy4KICAgICAgICAgICAgICAgIGVyciA9IG1ha2VFcnJvcigndGltZW91dCcsICdMb2FkIHRpbWVvdXQgZm9yIG1vZHVsZXM6ICcgKyBub0xvYWRzLCBudWxsLCBub0xvYWRzKTsKICAgICAgICAgICAgICAgIGVyci5jb250ZXh0TmFtZSA9IGNvbnRleHQuY29udGV4dE5hbWU7CiAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihlcnIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL05vdCBleHBpcmVkLCBjaGVjayBmb3IgYSBjeWNsZS4KICAgICAgICAgICAgaWYgKG5lZWRDeWNsZUNoZWNrKSB7CiAgICAgICAgICAgICAgICBlYWNoKHJlcUNhbGxzLCBmdW5jdGlvbiAobW9kKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWtDeWNsZShtb2QsIHt9LCB7fSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9JZiBzdGlsbCB3YWl0aW5nIG9uIGxvYWRzLCBhbmQgdGhlIHdhaXRpbmcgbG9hZCBpcyBzb21ldGhpbmcKICAgICAgICAgICAgLy9vdGhlciB0aGFuIGEgcGx1Z2luIHJlc291cmNlLCBvciB0aGVyZSBhcmUgc3RpbGwgb3V0c3RhbmRpbmcKICAgICAgICAgICAgLy9zY3JpcHRzLCB0aGVuIGp1c3QgdHJ5IGJhY2sgbGF0ZXIuCiAgICAgICAgICAgIGlmICgoIWV4cGlyZWQgfHwgdXNpbmdQYXRoRmFsbGJhY2spICYmIHN0aWxsTG9hZGluZykgewogICAgICAgICAgICAgICAgLy9Tb21ldGhpbmcgaXMgc3RpbGwgd2FpdGluZyB0byBsb2FkLiBXYWl0IGZvciBpdCwgYnV0IG9ubHkKICAgICAgICAgICAgICAgIC8vaWYgYSB0aW1lb3V0IGlzIG5vdCBhbHJlYWR5IGluIGVmZmVjdC4KICAgICAgICAgICAgICAgIGlmICgoaXNCcm93c2VyIHx8IGlzV2ViV29ya2VyKSAmJiAhY2hlY2tMb2FkZWRUaW1lb3V0SWQpIHsKICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWRlZFRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWRlZFRpbWVvdXRJZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrTG9hZGVkKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgNTApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpbkNoZWNrTG9hZGVkID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBNb2R1bGUgPSBmdW5jdGlvbiAobWFwKSB7CiAgICAgICAgICAgIHRoaXMuZXZlbnRzID0gZ2V0T3duKHVuZGVmRXZlbnRzLCBtYXAuaWQpIHx8IHt9OwogICAgICAgICAgICB0aGlzLm1hcCA9IG1hcDsKICAgICAgICAgICAgdGhpcy5zaGltID0gZ2V0T3duKGNvbmZpZy5zaGltLCBtYXAuaWQpOwogICAgICAgICAgICB0aGlzLmRlcEV4cG9ydHMgPSBbXTsKICAgICAgICAgICAgdGhpcy5kZXBNYXBzID0gW107CiAgICAgICAgICAgIHRoaXMuZGVwTWF0Y2hlZCA9IFtdOwogICAgICAgICAgICB0aGlzLnBsdWdpbk1hcHMgPSB7fTsKICAgICAgICAgICAgdGhpcy5kZXBDb3VudCA9IDA7CgogICAgICAgICAgICAvKiB0aGlzLmV4cG9ydHMgdGhpcy5mYWN0b3J5CiAgICAgICAgICAgICAgIHRoaXMuZGVwTWFwcyA9IFtdLAogICAgICAgICAgICAgICB0aGlzLmVuYWJsZWQsIHRoaXMuZmV0Y2hlZAogICAgICAgICAgICAqLwogICAgICAgIH07CgogICAgICAgIE1vZHVsZS5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChkZXBNYXBzLCBmYWN0b3J5LCBlcnJiYWNrLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCiAgICAgICAgICAgICAgICAvL0RvIG5vdCBkbyBtb3JlIGluaXRzIGlmIGFscmVhZHkgZG9uZS4gQ2FuIGhhcHBlbiBpZiB0aGVyZQogICAgICAgICAgICAgICAgLy9hcmUgbXVsdGlwbGUgZGVmaW5lIGNhbGxzIGZvciB0aGUgc2FtZSBtb2R1bGUuIFRoYXQgaXMgbm90CiAgICAgICAgICAgICAgICAvL2Egbm9ybWFsLCBjb21tb24gY2FzZSwgYnV0IGl0IGlzIGFsc28gbm90IHVuZXhwZWN0ZWQuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbml0ZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKCiAgICAgICAgICAgICAgICBpZiAoZXJyYmFjaykgewogICAgICAgICAgICAgICAgICAgIC8vUmVnaXN0ZXIgZm9yIGVycm9ycyBvbiB0aGlzIG1vZHVsZS4KICAgICAgICAgICAgICAgICAgICB0aGlzLm9uKCdlcnJvcicsIGVycmJhY2spOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmV2ZW50cy5lcnJvcikgewogICAgICAgICAgICAgICAgICAgIC8vSWYgbm8gZXJyYmFjayBhbHJlYWR5LCBidXQgdGhlcmUgYXJlIGVycm9yIGxpc3RlbmVycwogICAgICAgICAgICAgICAgICAgIC8vb24gdGhpcyBtb2R1bGUsIHNldCB1cCBhbiBlcnJiYWNrIHRvIHBhc3MgdG8gdGhlIGRlcHMuCiAgICAgICAgICAgICAgICAgICAgZXJyYmFjayA9IGJpbmQodGhpcywgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL0RvIGEgY29weSBvZiB0aGUgZGVwZW5kZW5jeSBhcnJheSwgc28gdGhhdAogICAgICAgICAgICAgICAgLy9zb3VyY2UgaW5wdXRzIGFyZSBub3QgbW9kaWZpZWQuIEZvciBleGFtcGxlCiAgICAgICAgICAgICAgICAvLyJzaGltIiBkZXBzIGFyZSBwYXNzZWQgaW4gaGVyZSBkaXJlY3RseSwgYW5kCiAgICAgICAgICAgICAgICAvL2RvaW5nIGEgZGlyZWN0IG1vZGlmaWNhdGlvbiBvZiB0aGUgZGVwTWFwcyBhcnJheQogICAgICAgICAgICAgICAgLy93b3VsZCBhZmZlY3QgdGhhdCBjb25maWcuCiAgICAgICAgICAgICAgICB0aGlzLmRlcE1hcHMgPSBkZXBNYXBzICYmIGRlcE1hcHMuc2xpY2UoMCk7CgogICAgICAgICAgICAgICAgdGhpcy5lcnJiYWNrID0gZXJyYmFjazsKCiAgICAgICAgICAgICAgICAvL0luZGljYXRlIHRoaXMgbW9kdWxlIGhhcyBiZSBpbml0aWFsaXplZAogICAgICAgICAgICAgICAgdGhpcy5pbml0ZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIHRoaXMuaWdub3JlID0gb3B0aW9ucy5pZ25vcmU7CgogICAgICAgICAgICAgICAgLy9Db3VsZCBoYXZlIG9wdGlvbiB0byBpbml0IHRoaXMgbW9kdWxlIGluIGVuYWJsZWQgbW9kZSwKICAgICAgICAgICAgICAgIC8vb3IgY291bGQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgbWFya2VkIGFzIGVuYWJsZWQuIEhvd2V2ZXIsCiAgICAgICAgICAgICAgICAvL3RoZSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBrbm93biB1bnRpbCBpbml0IGlzIGNhbGxlZC4gU28KICAgICAgICAgICAgICAgIC8vaWYgZW5hYmxlZCBwcmV2aW91c2x5LCBub3cgdHJpZ2dlciBkZXBlbmRlbmNpZXMgYXMgZW5hYmxlZC4KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmVuYWJsZWQgfHwgdGhpcy5lbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgLy9FbmFibGUgdGhpcyBtb2R1bGUgYW5kIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgICAgICAgICAvL1dpbGwgY2FsbCB0aGlzLmNoZWNrKCkKICAgICAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBkZWZpbmVEZXA6IGZ1bmN0aW9uIChpLCBkZXBFeHBvcnRzKSB7CiAgICAgICAgICAgICAgICAvL0JlY2F1c2Ugb2YgY3ljbGVzLCBkZWZpbmVkIGNhbGxiYWNrIGZvciBhIGdpdmVuCiAgICAgICAgICAgICAgICAvL2V4cG9ydCBjYW4gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRlcE1hdGNoZWRbaV0pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcE1hdGNoZWRbaV0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVwQ291bnQgLT0gMTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcEV4cG9ydHNbaV0gPSBkZXBFeHBvcnRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZmV0Y2g6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZldGNoZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmZldGNoZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIGNvbnRleHQuc3RhcnRUaW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKCiAgICAgICAgICAgICAgICB2YXIgbWFwID0gdGhpcy5tYXA7CgogICAgICAgICAgICAgICAgLy9JZiB0aGUgbWFuYWdlciBpcyBmb3IgYSBwbHVnaW4gbWFuYWdlZCByZXNvdXJjZSwKICAgICAgICAgICAgICAgIC8vYXNrIHRoZSBwbHVnaW4gdG8gbG9hZCBpdCBub3cuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaGltKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5tYWtlUmVxdWlyZSh0aGlzLm1hcCwgewogICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVCdWlsZENhbGxiYWNrOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSkodGhpcy5zaGltLmRlcHMgfHwgW10sIGJpbmQodGhpcywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwLnByZWZpeCA/IHRoaXMuY2FsbFBsdWdpbigpIDogdGhpcy5sb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL1JlZ3VsYXIgZGVwZW5kZW5jeS4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwLnByZWZpeCA/IHRoaXMuY2FsbFBsdWdpbigpIDogdGhpcy5sb2FkKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBsb2FkOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgdXJsID0gdGhpcy5tYXAudXJsOwoKICAgICAgICAgICAgICAgIC8vUmVndWxhciBkZXBlbmRlbmN5LgogICAgICAgICAgICAgICAgaWYgKCF1cmxGZXRjaGVkW3VybF0pIHsKICAgICAgICAgICAgICAgICAgICB1cmxGZXRjaGVkW3VybF0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnRleHQubG9hZCh0aGlzLm1hcC5pZCwgdXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDaGVja3MgaWYgdGhlIG1vZHVsZSBpcyByZWFkeSB0byBkZWZpbmUgaXRzZWxmLCBhbmQgaWYgc28sCiAgICAgICAgICAgICAqIGRlZmluZSBpdC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNoZWNrOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZW5hYmxlZCB8fCB0aGlzLmVuYWJsaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBlcnIsIGNqc01vZHVsZSwKICAgICAgICAgICAgICAgICAgICBpZCA9IHRoaXMubWFwLmlkLAogICAgICAgICAgICAgICAgICAgIGRlcEV4cG9ydHMgPSB0aGlzLmRlcEV4cG9ydHMsCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IHRoaXMuZXhwb3J0cywKICAgICAgICAgICAgICAgICAgICBmYWN0b3J5ID0gdGhpcy5mYWN0b3J5OwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbml0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGZldGNoIGlmIG5vdCBhbHJlYWR5IGluIHRoZSBkZWZRdWV1ZS4KICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AoY29udGV4dC5kZWZRdWV1ZU1hcCwgaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2goKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcy5lcnJvcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmRlZmluaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgLy9UaGUgZmFjdG9yeSBjb3VsZCB0cmlnZ2VyIGFub3RoZXIgcmVxdWlyZSBjYWxsCiAgICAgICAgICAgICAgICAgICAgLy90aGF0IHdvdWxkIHJlc3VsdCBpbiBjaGVja2luZyB0aGlzIG1vZHVsZSB0bwogICAgICAgICAgICAgICAgICAgIC8vZGVmaW5lIGl0c2VsZiBhZ2Fpbi4gSWYgYWxyZWFkeSBpbiB0aGUgcHJvY2VzcwogICAgICAgICAgICAgICAgICAgIC8vb2YgZG9pbmcgdGhhdCwgc2tpcCB0aGlzIHdvcmsuCiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZpbmluZyA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlcENvdW50IDwgMSAmJiAhdGhpcy5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGZhY3RvcnkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZXJlIGlzIGFuIGVycm9yIGxpc3RlbmVyLCBmYXZvciBwYXNzaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RvIHRoYXQgaW5zdGVhZCBvZiB0aHJvd2luZyBhbiBlcnJvci4gSG93ZXZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vb25seSBkbyBpdCBmb3IgZGVmaW5lKCknZCAgbW9kdWxlcy4gcmVxdWlyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lcnJiYWNrcyBzaG91bGQgbm90IGJlIGNhbGxlZCBmb3IgZmFpbHVyZXMgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhlaXIgY2FsbGJhY2tzICgjNjk5KS4gSG93ZXZlciBpZiBhIGdsb2JhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9vbkVycm9yIGlzIHNldCwgdXNlIHRoYXQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMuZXZlbnRzLmVycm9yICYmIHRoaXMubWFwLmlzRGVmaW5lKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5vbkVycm9yICE9PSBkZWZhdWx0T25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSBjb250ZXh0LmV4ZWNDYihpZCwgZmFjdG9yeSwgZGVwRXhwb3J0cywgZXhwb3J0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IGNvbnRleHQuZXhlY0NiKGlkLCBmYWN0b3J5LCBkZXBFeHBvcnRzLCBleHBvcnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYXZvciByZXR1cm4gdmFsdWUgb3ZlciBleHBvcnRzLiBJZiBub2RlL2NqcyBpbiBwbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiB3aWxsIG5vdCBoYXZlIGEgcmV0dXJuIHZhbHVlIGFueXdheS4gRmF2b3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZHVsZS5leHBvcnRzIGFzc2lnbm1lbnQgb3ZlciBleHBvcnRzIG9iamVjdC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcC5pc0RlZmluZSAmJiBleHBvcnRzID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjanNNb2R1bGUgPSB0aGlzLm1vZHVsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2pzTW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSBjanNNb2R1bGUuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudXNpbmdFeHBvcnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZXhwb3J0cyBhbHJlYWR5IHNldCB0aGUgZGVmaW5lZCB2YWx1ZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IHRoaXMuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5yZXF1aXJlTWFwID0gdGhpcy5tYXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnJlcXVpcmVNb2R1bGVzID0gdGhpcy5tYXAuaXNEZWZpbmUgPyBbdGhpcy5tYXAuaWRdIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIucmVxdWlyZVR5cGUgPSB0aGlzLm1hcC5pc0RlZmluZSA/ICdkZWZpbmUnIDogJ3JlcXVpcmUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbkVycm9yKCh0aGlzLmVycm9yID0gZXJyKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9KdXN0IGEgbGl0ZXJhbCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IGZhY3Rvcnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwb3J0cyA9IGV4cG9ydHM7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXAuaXNEZWZpbmUgJiYgIXRoaXMuaWdub3JlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkW2lkXSA9IGV4cG9ydHM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS5vblJlc291cmNlTG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNMb2FkTWFwcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2godGhpcy5kZXBNYXBzLCBmdW5jdGlvbiAoZGVwTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0xvYWRNYXBzLnB1c2goZGVwTWFwLm5vcm1hbGl6ZWRNYXAgfHwgZGVwTWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEub25SZXNvdXJjZUxvYWQoY29udGV4dCwgdGhpcy5tYXAsIHJlc0xvYWRNYXBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9DbGVhbiB1cAogICAgICAgICAgICAgICAgICAgICAgICBjbGVhblJlZ2lzdHJ5KGlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvL0ZpbmlzaGVkIHRoZSBkZWZpbmUgc3RhZ2UuIEFsbG93IGNhbGxpbmcgY2hlY2sgYWdhaW4KICAgICAgICAgICAgICAgICAgICAvL3RvIGFsbG93IGRlZmluZSBub3RpZmljYXRpb25zIGJlbG93IGluIHRoZSBjYXNlIG9mIGEKICAgICAgICAgICAgICAgICAgICAvL2N5Y2xlLgogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5pbmcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmaW5lZCAmJiAhdGhpcy5kZWZpbmVFbWl0dGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lRW1pdHRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZGVmaW5lZCcsIHRoaXMuZXhwb3J0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lRW1pdENvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgY2FsbFBsdWdpbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMubWFwLAogICAgICAgICAgICAgICAgICAgIGlkID0gbWFwLmlkLAogICAgICAgICAgICAgICAgICAgIC8vTWFwIGFscmVhZHkgbm9ybWFsaXplZCB0aGUgcHJlZml4LgogICAgICAgICAgICAgICAgICAgIHBsdWdpbk1hcCA9IG1ha2VNb2R1bGVNYXAobWFwLnByZWZpeCk7CgogICAgICAgICAgICAgICAgLy9NYXJrIHRoaXMgYXMgYSBkZXBlbmRlbmN5IGZvciB0aGlzIHBsdWdpbiwgc28gaXQKICAgICAgICAgICAgICAgIC8vY2FuIGJlIHRyYWNlZCBmb3IgY3ljbGVzLgogICAgICAgICAgICAgICAgdGhpcy5kZXBNYXBzLnB1c2gocGx1Z2luTWFwKTsKCiAgICAgICAgICAgICAgICBvbihwbHVnaW5NYXAsICdkZWZpbmVkJywgYmluZCh0aGlzLCBmdW5jdGlvbiAocGx1Z2luKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWQsIG5vcm1hbGl6ZWRNYXAsIG5vcm1hbGl6ZWRNb2QsCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZUlkID0gZ2V0T3duKGJ1bmRsZXNNYXAsIHRoaXMubWFwLmlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHRoaXMubWFwLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5hbWUgPSB0aGlzLm1hcC5wYXJlbnRNYXAgPyB0aGlzLm1hcC5wYXJlbnRNYXAubmFtZSA6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsUmVxdWlyZSA9IGNvbnRleHQubWFrZVJlcXVpcmUobWFwLnBhcmVudE1hcCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlQnVpbGRDYWxsYmFjazogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy9JZiBjdXJyZW50IG1hcCBpcyBub3Qgbm9ybWFsaXplZCwgd2FpdCBmb3IgdGhhdAogICAgICAgICAgICAgICAgICAgIC8vbm9ybWFsaXplZCBuYW1lIHRvIGxvYWQgaW5zdGVhZCBvZiBjb250aW51aW5nLgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcC51bm5vcm1hbGl6ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9Ob3JtYWxpemUgdGhlIElEIGlmIHRoZSBwbHVnaW4gYWxsb3dzIGl0LgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGx1Z2luLm5vcm1hbGl6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBsdWdpbi5ub3JtYWxpemUobmFtZSwgZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplKG5hbWUsIHBhcmVudE5hbWUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJlZml4IGFuZCBuYW1lIHNob3VsZCBhbHJlYWR5IGJlIG5vcm1hbGl6ZWQsIG5vIG5lZWQKICAgICAgICAgICAgICAgICAgICAgICAgLy9mb3IgYXBwbHlpbmcgbWFwIGNvbmZpZyBhZ2FpbiBlaXRoZXIuCiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRNYXAgPSBtYWtlTW9kdWxlTWFwKG1hcC5wcmVmaXggKyAnIScgKyBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcC5wYXJlbnRNYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBvbihub3JtYWxpemVkTWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmluZWQnLCBiaW5kKHRoaXMsIGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwLm5vcm1hbGl6ZWRNYXAgPSBub3JtYWxpemVkTWFwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdChbXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsdWU7IH0sIG51bGwsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CgogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTW9kID0gZ2V0T3duKHJlZ2lzdHJ5LCBub3JtYWxpemVkTWFwLmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRNb2QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTWFyayB0aGlzIGFzIGEgZGVwZW5kZW5jeSBmb3IgdGhpcyBwbHVnaW4sIHNvIGl0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NhbiBiZSB0cmFjZWQgZm9yIGN5Y2xlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVwTWFwcy5wdXNoKG5vcm1hbGl6ZWRNYXApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmV2ZW50cy5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRNb2Qub24oJ2Vycm9yJywgYmluZCh0aGlzLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRNb2QuZW5hYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vSWYgYSBwYXRocyBjb25maWcsIHRoZW4ganVzdCBsb2FkIHRoYXQgZmlsZSBpbnN0ZWFkIHRvCiAgICAgICAgICAgICAgICAgICAgLy9yZXNvbHZlIHRoZSBwbHVnaW4sIGFzIGl0IGlzIGJ1aWx0IGludG8gdGhhdCBwYXRocyBsYXllci4KICAgICAgICAgICAgICAgICAgICBpZiAoYnVuZGxlSWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAudXJsID0gY29udGV4dC5uYW1lVG9VcmwoYnVuZGxlSWQpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbG9hZCA9IGJpbmQodGhpcywgZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdChbXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsdWU7IH0sIG51bGwsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIGxvYWQuZXJyb3IgPSBiaW5kKHRoaXMsIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gZXJyOwogICAgICAgICAgICAgICAgICAgICAgICBlcnIucmVxdWlyZU1vZHVsZXMgPSBbaWRdOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9SZW1vdmUgdGVtcCB1bm5vcm1hbGl6ZWQgbW9kdWxlcyBmb3IgdGhpcyBtb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2luY2UgdGhleSB3aWxsIG5ldmVyIGJlIHJlc29sdmVkIG90aGVyd2lzZSBub3cuCiAgICAgICAgICAgICAgICAgICAgICAgIGVhY2hQcm9wKHJlZ2lzdHJ5LCBmdW5jdGlvbiAobW9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kLm1hcC5pZC5pbmRleE9mKGlkICsgJ191bm5vcm1hbGl6ZWQnKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFuUmVnaXN0cnkobW9kLm1hcC5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvL0FsbG93IHBsdWdpbnMgdG8gbG9hZCBvdGhlciBjb2RlIHdpdGhvdXQgaGF2aW5nIHRvIGtub3cgdGhlCiAgICAgICAgICAgICAgICAgICAgLy9jb250ZXh0IG9yIGhvdyB0byAnY29tcGxldGUnIHRoZSBsb2FkLgogICAgICAgICAgICAgICAgICAgIGxvYWQuZnJvbVRleHQgPSBiaW5kKHRoaXMsIGZ1bmN0aW9uICh0ZXh0LCB0ZXh0QWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qanNsaW50IGV2aWw6IHRydWUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZHVsZU5hbWUgPSBtYXAubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZU1hcCA9IG1ha2VNb2R1bGVNYXAobW9kdWxlTmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNJbnRlcmFjdGl2ZSA9IHVzZUludGVyYWN0aXZlOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9BcyBvZiAyLjEuMCwgc3VwcG9ydCBqdXN0IHBhc3NpbmcgdGhlIHRleHQsIHRvIHJlaW5mb3JjZQogICAgICAgICAgICAgICAgICAgICAgICAvL2Zyb21UZXh0IG9ubHkgYmVpbmcgY2FsbGVkIG9uY2UgcGVyIHJlc291cmNlLiBTdGlsbAogICAgICAgICAgICAgICAgICAgICAgICAvL3N1cHBvcnQgb2xkIHN0eWxlIG9mIHBhc3NpbmcgbW9kdWxlTmFtZSBidXQgZGlzY2FyZAogICAgICAgICAgICAgICAgICAgICAgICAvL3RoYXQgbW9kdWxlTmFtZSBpbiBmYXZvciBvZiB0aGUgaW50ZXJuYWwgcmVmLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dEFsdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHRBbHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vVHVybiBvZmYgaW50ZXJhY3RpdmUgc2NyaXB0IG1hdGNoaW5nIGZvciBJRSBmb3IgYW55IGRlZmluZQogICAgICAgICAgICAgICAgICAgICAgICAvL2NhbGxzIGluIHRoZSB0ZXh0LCB0aGVuIHR1cm4gaXQgYmFjayBvbiBhdCB0aGUgZW5kLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzSW50ZXJhY3RpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUludGVyYWN0aXZlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJpbWUgdGhlIHN5c3RlbSBieSBjcmVhdGluZyBhIG1vZHVsZSBpbnN0YW5jZSBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgLy9pdC4KICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TW9kdWxlKG1vZHVsZU1hcCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvL1RyYW5zZmVyIGFueSBjb25maWcgdG8gdGhpcyBvdGhlciBtb2R1bGUuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNQcm9wKGNvbmZpZy5jb25maWcsIGlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNvbmZpZ1ttb2R1bGVOYW1lXSA9IGNvbmZpZy5jb25maWdbaWRdOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmV4ZWModGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbkVycm9yKG1ha2VFcnJvcignZnJvbXRleHRldmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb21UZXh0IGV2YWwgZm9yICcgKyBpZCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBmYWlsZWQ6ICcgKyBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNJbnRlcmFjdGl2ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlSW50ZXJhY3RpdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL01hcmsgdGhpcyBhcyBhIGRlcGVuZGVuY3kgZm9yIHRoZSBwbHVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXNvdXJjZQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcE1hcHMucHVzaChtb2R1bGVNYXApOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9TdXBwb3J0IGFub255bW91cyBtb2R1bGVzLgogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmNvbXBsZXRlTG9hZChtb2R1bGVOYW1lKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vQmluZCB0aGUgdmFsdWUgb2YgdGhhdCBtb2R1bGUgdG8gdGhlIHZhbHVlIGZvciB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVzb3VyY2UgSUQuCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsUmVxdWlyZShbbW9kdWxlTmFtZV0sIGxvYWQpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvL1VzZSBwYXJlbnROYW1lIGhlcmUgc2luY2UgdGhlIHBsdWdpbidzIG5hbWUgaXMgbm90IHJlbGlhYmxlLAogICAgICAgICAgICAgICAgICAgIC8vY291bGQgYmUgc29tZSB3ZWlyZCBzdHJpbmcgd2l0aCBubyBwYXRoIHRoYXQgYWN0dWFsbHkgd2FudHMgdG8KICAgICAgICAgICAgICAgICAgICAvL3JlZmVyZW5jZSB0aGUgcGFyZW50TmFtZSdzIHBhdGguCiAgICAgICAgICAgICAgICAgICAgcGx1Z2luLmxvYWQobWFwLm5hbWUsIGxvY2FsUmVxdWlyZSwgbG9hZCwgY29uZmlnKTsKICAgICAgICAgICAgICAgIH0pKTsKCiAgICAgICAgICAgICAgICBjb250ZXh0LmVuYWJsZShwbHVnaW5NYXAsIHRoaXMpOwogICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5NYXBzW3BsdWdpbk1hcC5pZF0gPSBwbHVnaW5NYXA7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGVuYWJsZWRSZWdpc3RyeVt0aGlzLm1hcC5pZF0gPSB0aGlzOwogICAgICAgICAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvL1NldCBmbGFnIG1lbnRpb25pbmcgdGhhdCB0aGUgbW9kdWxlIGlzIGVuYWJsaW5nLAogICAgICAgICAgICAgICAgLy9zbyB0aGF0IGltbWVkaWF0ZSBjYWxscyB0byB0aGUgZGVmaW5lZCBjYWxsYmFja3MKICAgICAgICAgICAgICAgIC8vZm9yIGRlcGVuZGVuY2llcyBkbyBub3QgdHJpZ2dlciBpbmFkdmVydGVudCBsb2FkCiAgICAgICAgICAgICAgICAvL3dpdGggdGhlIGRlcENvdW50IHN0aWxsIGJlaW5nIHplcm8uCiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsaW5nID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvL0VuYWJsZSBlYWNoIGRlcGVuZGVuY3kKICAgICAgICAgICAgICAgIGVhY2godGhpcy5kZXBNYXBzLCBiaW5kKHRoaXMsIGZ1bmN0aW9uIChkZXBNYXAsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWQsIG1vZCwgaGFuZGxlcjsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXBNYXAgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vRGVwZW5kZW5jeSBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBkZXBNYXAKICAgICAgICAgICAgICAgICAgICAgICAgLy9hbmQgd2lyZWQgdXAgdG8gdGhpcyBtb2R1bGUuCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcE1hcCA9IG1ha2VNb2R1bGVNYXAoZGVwTWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLm1hcC5pc0RlZmluZSA/IHRoaXMubWFwIDogdGhpcy5tYXAucGFyZW50TWFwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5za2lwTWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBNYXBzW2ldID0gZGVwTWFwOwoKICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IGdldE93bihoYW5kbGVycywgZGVwTWFwLmlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcEV4cG9ydHNbaV0gPSBoYW5kbGVyKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcENvdW50ICs9IDE7CgogICAgICAgICAgICAgICAgICAgICAgICBvbihkZXBNYXAsICdkZWZpbmVkJywgYmluZCh0aGlzLCBmdW5jdGlvbiAoZGVwRXhwb3J0cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudW5kZWZlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lRGVwKGksIGRlcEV4cG9ydHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVjaygpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lcnJiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbihkZXBNYXAsICdlcnJvcicsIGJpbmQodGhpcywgdGhpcy5lcnJiYWNrKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ldmVudHMuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGRpcmVjdCBlcnJiYWNrIG9uIHRoaXMgbW9kdWxlLCBidXQgc29tZXRoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIGlzIGxpc3RlbmluZyBmb3IgZXJyb3JzLCBzbyBiZSBzdXJlIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9wYWdhdGUgdGhlIGVycm9yIGNvcnJlY3RseS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uKGRlcE1hcCwgJ2Vycm9yJywgYmluZCh0aGlzLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWQgPSBkZXBNYXAuaWQ7CiAgICAgICAgICAgICAgICAgICAgbW9kID0gcmVnaXN0cnlbaWRdOwoKICAgICAgICAgICAgICAgICAgICAvL1NraXAgc3BlY2lhbCBtb2R1bGVzIGxpa2UgJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnCiAgICAgICAgICAgICAgICAgICAgLy9BbHNvLCBkb24ndCBjYWxsIGVuYWJsZSBpZiBpdCBpcyBhbHJlYWR5IGVuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgLy9pbXBvcnRhbnQgaW4gY2lyY3VsYXIgZGVwZW5kZW5jeSBjYXNlcy4KICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AoaGFuZGxlcnMsIGlkKSAmJiBtb2QgJiYgIW1vZC5lbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZW5hYmxlKGRlcE1hcCwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwoKICAgICAgICAgICAgICAgIC8vRW5hYmxlIGVhY2ggcGx1Z2luIHRoYXQgaXMgdXNlZCBpbgogICAgICAgICAgICAgICAgLy9hIGRlcGVuZGVuY3kKICAgICAgICAgICAgICAgIGVhY2hQcm9wKHRoaXMucGx1Z2luTWFwcywgYmluZCh0aGlzLCBmdW5jdGlvbiAocGx1Z2luTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZCA9IGdldE93bihyZWdpc3RyeSwgcGx1Z2luTWFwLmlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kICYmICFtb2QuZW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVuYWJsZShwbHVnaW5NYXAsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKCiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsaW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgdGhpcy5jaGVjaygpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgb246IGZ1bmN0aW9uIChuYW1lLCBjYikgewogICAgICAgICAgICAgICAgdmFyIGNicyA9IHRoaXMuZXZlbnRzW25hbWVdOwogICAgICAgICAgICAgICAgaWYgKCFjYnMpIHsKICAgICAgICAgICAgICAgICAgICBjYnMgPSB0aGlzLmV2ZW50c1tuYW1lXSA9IFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2JzLnB1c2goY2IpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZW1pdDogZnVuY3Rpb24gKG5hbWUsIGV2dCkgewogICAgICAgICAgICAgICAgZWFjaCh0aGlzLmV2ZW50c1tuYW1lXSwgZnVuY3Rpb24gKGNiKSB7CiAgICAgICAgICAgICAgICAgICAgY2IoZXZ0KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdlcnJvcicpIHsKICAgICAgICAgICAgICAgICAgICAvL05vdyB0aGF0IHRoZSBlcnJvciBoYW5kbGVyIHdhcyB0cmlnZ2VyZWQsIHJlbW92ZQogICAgICAgICAgICAgICAgICAgIC8vdGhlIGxpc3RlbmVycywgc2luY2UgdGhpcyBicm9rZW4gTW9kdWxlIGluc3RhbmNlCiAgICAgICAgICAgICAgICAgICAgLy9jYW4gc3RheSBhcm91bmQgZm9yIGEgd2hpbGUgaW4gdGhlIHJlZ2lzdHJ5LgogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmV2ZW50c1tuYW1lXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIGNhbGxHZXRNb2R1bGUoYXJncykgewogICAgICAgICAgICAvL1NraXAgbW9kdWxlcyBhbHJlYWR5IGRlZmluZWQuCiAgICAgICAgICAgIGlmICghaGFzUHJvcChkZWZpbmVkLCBhcmdzWzBdKSkgewogICAgICAgICAgICAgICAgZ2V0TW9kdWxlKG1ha2VNb2R1bGVNYXAoYXJnc1swXSwgbnVsbCwgdHJ1ZSkpLmluaXQoYXJnc1sxXSwgYXJnc1syXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKG5vZGUsIGZ1bmMsIG5hbWUsIGllTmFtZSkgewogICAgICAgICAgICAvL0Zhdm9yIGRldGFjaEV2ZW50IGJlY2F1c2Ugb2YgSUU5CiAgICAgICAgICAgIC8vaXNzdWUsIHNlZSBhdHRhY2hFdmVudC9hZGRFdmVudExpc3RlbmVyIGNvbW1lbnQgZWxzZXdoZXJlCiAgICAgICAgICAgIC8vaW4gdGhpcyBmaWxlLgogICAgICAgICAgICBpZiAobm9kZS5kZXRhY2hFdmVudCAmJiAhaXNPcGVyYSkgewogICAgICAgICAgICAgICAgLy9Qcm9iYWJseSBJRS4gSWYgbm90IGl0IHdpbGwgdGhyb3cgYW4gZXJyb3IsIHdoaWNoIHdpbGwgYmUKICAgICAgICAgICAgICAgIC8vdXNlZnVsIHRvIGtub3cuCiAgICAgICAgICAgICAgICBpZiAoaWVOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgbm9kZS5kZXRhY2hFdmVudChpZU5hbWUsIGZ1bmMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGZ1bmMsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogR2l2ZW4gYW4gZXZlbnQgZnJvbSBhIHNjcmlwdCBub2RlLCBnZXQgdGhlIHJlcXVpcmVqcyBpbmZvIGZyb20gaXQsCiAgICAgICAgICogYW5kIHRoZW4gcmVtb3ZlcyB0aGUgZXZlbnQgbGlzdGVuZXJzIG9uIHRoZSBub2RlLgogICAgICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2dAogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0U2NyaXB0RGF0YShldnQpIHsKICAgICAgICAgICAgLy9Vc2luZyBjdXJyZW50VGFyZ2V0IGluc3RlYWQgb2YgdGFyZ2V0IGZvciBGaXJlZm94IDIuMCdzIHNha2UuIE5vdAogICAgICAgICAgICAvL2FsbCBvbGQgYnJvd3NlcnMgd2lsbCBiZSBzdXBwb3J0ZWQsIGJ1dCB0aGlzIG9uZSB3YXMgZWFzeSBlbm91Z2gKICAgICAgICAgICAgLy90byBzdXBwb3J0IGFuZCBzdGlsbCBtYWtlcyBzZW5zZS4KICAgICAgICAgICAgdmFyIG5vZGUgPSBldnQuY3VycmVudFRhcmdldCB8fCBldnQuc3JjRWxlbWVudDsKCiAgICAgICAgICAgIC8vUmVtb3ZlIHRoZSBsaXN0ZW5lcnMgb25jZSBoZXJlLgogICAgICAgICAgICByZW1vdmVMaXN0ZW5lcihub2RlLCBjb250ZXh0Lm9uU2NyaXB0TG9hZCwgJ2xvYWQnLCAnb25yZWFkeXN0YXRlY2hhbmdlJyk7CiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKG5vZGUsIGNvbnRleHQub25TY3JpcHRFcnJvciwgJ2Vycm9yJyk7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbm9kZTogbm9kZSwKICAgICAgICAgICAgICAgIGlkOiBub2RlICYmIG5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXJlcXVpcmVtb2R1bGUnKQogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaW50YWtlRGVmaW5lcygpIHsKICAgICAgICAgICAgdmFyIGFyZ3M7CgogICAgICAgICAgICAvL0FueSBkZWZpbmVkIG1vZHVsZXMgaW4gdGhlIGdsb2JhbCBxdWV1ZSwgaW50YWtlIHRoZW0gbm93LgogICAgICAgICAgICB0YWtlR2xvYmFsUXVldWUoKTsKCiAgICAgICAgICAgIC8vTWFrZSBzdXJlIGFueSByZW1haW5pbmcgZGVmUXVldWUgaXRlbXMgZ2V0IHByb3Blcmx5IHByb2Nlc3NlZC4KICAgICAgICAgICAgd2hpbGUgKGRlZlF1ZXVlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgYXJncyA9IGRlZlF1ZXVlLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBpZiAoYXJnc1swXSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvbkVycm9yKG1ha2VFcnJvcignbWlzbWF0Y2gnLCAnTWlzbWF0Y2hlZCBhbm9ueW1vdXMgZGVmaW5lKCkgbW9kdWxlOiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1thcmdzLmxlbmd0aCAtIDFdKSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vYXJncyBhcmUgaWQsIGRlcHMsIGZhY3RvcnkuIFNob3VsZCBiZSBub3JtYWxpemVkIGJ5IHRoZQogICAgICAgICAgICAgICAgICAgIC8vZGVmaW5lKCkgZnVuY3Rpb24uCiAgICAgICAgICAgICAgICAgICAgY2FsbEdldE1vZHVsZShhcmdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjb250ZXh0LmRlZlF1ZXVlTWFwID0ge307CiAgICAgICAgfQoKICAgICAgICBjb250ZXh0ID0gewogICAgICAgICAgICBjb25maWc6IGNvbmZpZywKICAgICAgICAgICAgY29udGV4dE5hbWU6IGNvbnRleHROYW1lLAogICAgICAgICAgICByZWdpc3RyeTogcmVnaXN0cnksCiAgICAgICAgICAgIGRlZmluZWQ6IGRlZmluZWQsCiAgICAgICAgICAgIHVybEZldGNoZWQ6IHVybEZldGNoZWQsCiAgICAgICAgICAgIGRlZlF1ZXVlOiBkZWZRdWV1ZSwKICAgICAgICAgICAgZGVmUXVldWVNYXA6IHt9LAogICAgICAgICAgICBNb2R1bGU6IE1vZHVsZSwKICAgICAgICAgICAgbWFrZU1vZHVsZU1hcDogbWFrZU1vZHVsZU1hcCwKICAgICAgICAgICAgbmV4dFRpY2s6IHJlcS5uZXh0VGljaywKICAgICAgICAgICAgb25FcnJvcjogb25FcnJvciwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTZXQgYSBjb25maWd1cmF0aW9uIGZvciB0aGUgY29udGV4dC4KICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyBjb25maWcgb2JqZWN0IHRvIGludGVncmF0ZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNvbmZpZ3VyZTogZnVuY3Rpb24gKGNmZykgewogICAgICAgICAgICAgICAgLy9NYWtlIHN1cmUgdGhlIGJhc2VVcmwgZW5kcyBpbiBhIHNsYXNoLgogICAgICAgICAgICAgICAgaWYgKGNmZy5iYXNlVXJsKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNmZy5iYXNlVXJsLmNoYXJBdChjZmcuYmFzZVVybC5sZW5ndGggLSAxKSAhPT0gJy8nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNmZy5iYXNlVXJsICs9ICcvJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gQ29udmVydCBvbGQgc3R5bGUgdXJsQXJncyBzdHJpbmcgdG8gYSBmdW5jdGlvbi4KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2ZnLnVybEFyZ3MgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVybEFyZ3MgPSBjZmcudXJsQXJnczsKICAgICAgICAgICAgICAgICAgICBjZmcudXJsQXJncyA9IGZ1bmN0aW9uKGlkLCB1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyB1cmxBcmdzOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9TYXZlIG9mZiB0aGUgcGF0aHMgc2luY2UgdGhleSByZXF1aXJlIHNwZWNpYWwgcHJvY2Vzc2luZywKICAgICAgICAgICAgICAgIC8vdGhleSBhcmUgYWRkaXRpdmUuCiAgICAgICAgICAgICAgICB2YXIgc2hpbSA9IGNvbmZpZy5zaGltLAogICAgICAgICAgICAgICAgICAgIG9ianMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVzOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcDogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgZWFjaFByb3AoY2ZnLCBmdW5jdGlvbiAodmFsdWUsIHByb3ApIHsKICAgICAgICAgICAgICAgICAgICBpZiAob2Jqc1twcm9wXSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ1twcm9wXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnW3Byb3BdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbWl4aW4oY29uZmlnW3Byb3BdLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnW3Byb3BdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy9SZXZlcnNlIG1hcCB0aGUgYnVuZGxlcwogICAgICAgICAgICAgICAgaWYgKGNmZy5idW5kbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZWFjaFByb3AoY2ZnLmJ1bmRsZXMsIGZ1bmN0aW9uICh2YWx1ZSwgcHJvcCkgewogICAgICAgICAgICAgICAgICAgICAgICBlYWNoKHZhbHVlLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgIT09IHByb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVzTWFwW3ZdID0gcHJvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9NZXJnZSBzaGltCiAgICAgICAgICAgICAgICBpZiAoY2ZnLnNoaW0pIHsKICAgICAgICAgICAgICAgICAgICBlYWNoUHJvcChjZmcuc2hpbSwgZnVuY3Rpb24gKHZhbHVlLCBpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAvL05vcm1hbGl6ZSB0aGUgc3RydWN0dXJlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwczogdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2YWx1ZS5leHBvcnRzIHx8IHZhbHVlLmluaXQpICYmICF2YWx1ZS5leHBvcnRzRm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmV4cG9ydHNGbiA9IGNvbnRleHQubWFrZVNoaW1FeHBvcnRzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzaGltW2lkXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zaGltID0gc2hpbTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL0FkanVzdCBwYWNrYWdlcyBpZiBuZWNlc3NhcnkuCiAgICAgICAgICAgICAgICBpZiAoY2ZnLnBhY2thZ2VzKSB7CiAgICAgICAgICAgICAgICAgICAgZWFjaChjZmcucGFja2FnZXMsIGZ1bmN0aW9uIChwa2dPYmopIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uLCBuYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgcGtnT2JqID0gdHlwZW9mIHBrZ09iaiA9PT0gJ3N0cmluZycgPyB7bmFtZTogcGtnT2JqfSA6IHBrZ09iajsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwa2dPYmoubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gPSBwa2dPYmoubG9jYXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnBhdGhzW25hbWVdID0gcGtnT2JqLmxvY2F0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL1NhdmUgcG9pbnRlciB0byBtYWluIG1vZHVsZSBJRCBmb3IgcGtnIG5hbWUuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVtb3ZlIGxlYWRpbmcgZG90IGluIG1haW4sIHNvIG1haW4gcGF0aHMgYXJlIG5vcm1hbGl6ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vYW5kIHJlbW92ZSBhbnkgdHJhaWxpbmcgLmpzLCBzaW5jZSBkaWZmZXJlbnQgcGFja2FnZQogICAgICAgICAgICAgICAgICAgICAgICAvL2VudnMgaGF2ZSBkaWZmZXJlbnQgY29udmVudGlvbnM6IHNvbWUgdXNlIGEgbW9kdWxlIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vc29tZSB1c2UgYSBmaWxlIG5hbWUuCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5wa2dzW25hbWVdID0gcGtnT2JqLm5hbWUgKyAnLycgKyAocGtnT2JqLm1haW4gfHwgJ21haW4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoY3VyckRpclJlZ0V4cCwgJycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShqc1N1ZmZpeFJlZ0V4cCwgJycpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vSWYgdGhlcmUgYXJlIGFueSAid2FpdGluZyB0byBleGVjdXRlIiBtb2R1bGVzIGluIHRoZSByZWdpc3RyeSwKICAgICAgICAgICAgICAgIC8vdXBkYXRlIHRoZSBtYXBzIGZvciB0aGVtLCBzaW5jZSB0aGVpciBpbmZvLCBsaWtlIFVSTHMgdG8gbG9hZCwKICAgICAgICAgICAgICAgIC8vbWF5IGhhdmUgY2hhbmdlZC4KICAgICAgICAgICAgICAgIGVhY2hQcm9wKHJlZ2lzdHJ5LCBmdW5jdGlvbiAobW9kLCBpZCkgewogICAgICAgICAgICAgICAgICAgIC8vSWYgbW9kdWxlIGFscmVhZHkgaGFzIGluaXQgY2FsbGVkLCBzaW5jZSBpdCBpcyB0b28KICAgICAgICAgICAgICAgICAgICAvL2xhdGUgdG8gbW9kaWZ5IHRoZW0sIGFuZCBpZ25vcmUgdW5ub3JtYWxpemVkIG9uZXMKICAgICAgICAgICAgICAgICAgICAvL3NpbmNlIHRoZXkgYXJlIHRyYW5zaWVudC4KICAgICAgICAgICAgICAgICAgICBpZiAoIW1vZC5pbml0ZWQgJiYgIW1vZC5tYXAudW5ub3JtYWxpemVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZC5tYXAgPSBtYWtlTW9kdWxlTWFwKGlkLCBudWxsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvL0lmIGEgZGVwcyBhcnJheSBvciBhIGNvbmZpZyBjYWxsYmFjayBpcyBzcGVjaWZpZWQsIHRoZW4gY2FsbAogICAgICAgICAgICAgICAgLy9yZXF1aXJlIHdpdGggdGhvc2UgYXJncy4gVGhpcyBpcyB1c2VmdWwgd2hlbiByZXF1aXJlIGlzIGRlZmluZWQgYXMgYQogICAgICAgICAgICAgICAgLy9jb25maWcgb2JqZWN0IGJlZm9yZSByZXF1aXJlLmpzIGlzIGxvYWRlZC4KICAgICAgICAgICAgICAgIGlmIChjZmcuZGVwcyB8fCBjZmcuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlcXVpcmUoY2ZnLmRlcHMgfHwgW10sIGNmZy5jYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBtYWtlU2hpbUV4cG9ydHM6IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgZnVuY3Rpb24gZm4oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldDsKICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5pdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB2YWx1ZS5pbml0LmFwcGx5KGdsb2JhbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldCB8fCAodmFsdWUuZXhwb3J0cyAmJiBnZXRHbG9iYWwodmFsdWUuZXhwb3J0cykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZuOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgbWFrZVJlcXVpcmU6IGZ1bmN0aW9uIChyZWxNYXAsIG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxvY2FsUmVxdWlyZShkZXBzLCBjYWxsYmFjaywgZXJyYmFjaykgewogICAgICAgICAgICAgICAgICAgIHZhciBpZCwgbWFwLCByZXF1aXJlTW9kOwoKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5lbmFibGVCdWlsZENhbGxiYWNrICYmIGNhbGxiYWNrICYmIGlzRnVuY3Rpb24oY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLl9fcmVxdWlyZUpzQnVpbGQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXBzID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihjYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSW52YWxpZCBjYWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ3JlcXVpcmVhcmdzJywgJ0ludmFsaWQgcmVxdWlyZSBjYWxsJyksIGVycmJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHJlcXVpcmV8ZXhwb3J0c3xtb2R1bGUgYXJlIHJlcXVlc3RlZCwgZ2V0IHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvL3ZhbHVlIGZvciB0aGVtIGZyb20gdGhlIHNwZWNpYWwgaGFuZGxlcnMuIENhdmVhdDoKICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIG9ubHkgd29ya3Mgd2hpbGUgbW9kdWxlIGlzIGJlaW5nIGRlZmluZWQuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxNYXAgJiYgaGFzUHJvcChoYW5kbGVycywgZGVwcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyc1tkZXBzXShyZWdpc3RyeVtyZWxNYXAuaWRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9TeW5jaHJvbm91cyBhY2Nlc3MgdG8gb25lIG1vZHVsZS4gSWYgcmVxdWlyZS5nZXQgaXMKICAgICAgICAgICAgICAgICAgICAgICAgLy9hdmFpbGFibGUgKGFzIGluIHRoZSBOb2RlIGFkYXB0ZXIpLCBwcmVmZXIgdGhhdC4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS5nZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXEuZ2V0KGNvbnRleHQsIGRlcHMsIHJlbE1hcCwgbG9jYWxSZXF1aXJlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9Ob3JtYWxpemUgbW9kdWxlIG5hbWUsIGlmIGl0IGNvbnRhaW5zIC4gb3IgLi4KICAgICAgICAgICAgICAgICAgICAgICAgbWFwID0gbWFrZU1vZHVsZU1hcChkZXBzLCByZWxNYXAsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSBtYXAuaWQ7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AoZGVmaW5lZCwgaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ25vdGxvYWRlZCcsICdNb2R1bGUgbmFtZSAiJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIiBoYXMgbm90IGJlZW4gbG9hZGVkIHlldCBmb3IgY29udGV4dDogJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0TmFtZSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVsTWFwID8gJycgOiAnLiBVc2UgcmVxdWlyZShbXSknKSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbmVkW2lkXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vR3JhYiBkZWZpbmVzIHdhaXRpbmcgaW4gdGhlIGdsb2JhbCBxdWV1ZS4KICAgICAgICAgICAgICAgICAgICBpbnRha2VEZWZpbmVzKCk7CgogICAgICAgICAgICAgICAgICAgIC8vTWFyayBhbGwgdGhlIGRlcGVuZGVuY2llcyBhcyBuZWVkaW5nIHRvIGJlIGxvYWRlZC4KICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lm5leHRUaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9Tb21lIGRlZmluZXMgY291bGQgaGF2ZSBiZWVuIGFkZGVkIHNpbmNlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvL3JlcXVpcmUgY2FsbCwgY29sbGVjdCB0aGVtLgogICAgICAgICAgICAgICAgICAgICAgICBpbnRha2VEZWZpbmVzKCk7CgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlTW9kID0gZ2V0TW9kdWxlKG1ha2VNb2R1bGVNYXAobnVsbCwgcmVsTWFwKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvL1N0b3JlIGlmIG1hcCBjb25maWcgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhpcyByZXF1aXJlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vY2FsbCBmb3IgZGVwZW5kZW5jaWVzLgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlTW9kLnNraXBNYXAgPSBvcHRpb25zLnNraXBNYXA7CgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlTW9kLmluaXQoZGVwcywgY2FsbGJhY2ssIGVycmJhY2ssIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWRlZCgpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxSZXF1aXJlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG1peGluKGxvY2FsUmVxdWlyZSwgewogICAgICAgICAgICAgICAgICAgIGlzQnJvd3NlcjogaXNCcm93c2VyLAoKICAgICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAgICAgKiBDb252ZXJ0cyBhIG1vZHVsZSBuYW1lICsgLmV4dGVuc2lvbiBpbnRvIGFuIFVSTCBwYXRoLgogICAgICAgICAgICAgICAgICAgICAqICpSZXF1aXJlcyogdGhlIHVzZSBvZiBhIG1vZHVsZSBuYW1lLiBJdCBkb2VzIG5vdCBzdXBwb3J0IHVzaW5nCiAgICAgICAgICAgICAgICAgICAgICogcGxhaW4gVVJMcyBsaWtlIG5hbWVUb1VybC4KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICB0b1VybDogZnVuY3Rpb24gKG1vZHVsZU5hbWVQbHVzRXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IG1vZHVsZU5hbWVQbHVzRXh0Lmxhc3RJbmRleE9mKCcuJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50ID0gbW9kdWxlTmFtZVBsdXNFeHQuc3BsaXQoJy8nKVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVsYXRpdmUgPSBzZWdtZW50ID09PSAnLicgfHwgc2VnbWVudCA9PT0gJy4uJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vSGF2ZSBhIGZpbGUgZXh0ZW5zaW9uIGFsaWFzLCBhbmQgaXQgaXMgbm90IHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvL2RvdHMgZnJvbSBhIHJlbGF0aXZlIHBhdGguCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEgJiYgKCFpc1JlbGF0aXZlIHx8IGluZGV4ID4gMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dCA9IG1vZHVsZU5hbWVQbHVzRXh0LnN1YnN0cmluZyhpbmRleCwgbW9kdWxlTmFtZVBsdXNFeHQubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZU5hbWVQbHVzRXh0ID0gbW9kdWxlTmFtZVBsdXNFeHQuc3Vic3RyaW5nKDAsIGluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQubmFtZVRvVXJsKG5vcm1hbGl6ZShtb2R1bGVOYW1lUGx1c0V4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsTWFwICYmIHJlbE1hcC5pZCwgdHJ1ZSksIGV4dCwgIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgIGRlZmluZWQ6IGZ1bmN0aW9uIChpZCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJvcChkZWZpbmVkLCBtYWtlTW9kdWxlTWFwKGlkLCByZWxNYXAsIGZhbHNlLCB0cnVlKS5pZCk7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkOiBmdW5jdGlvbiAoaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSBtYWtlTW9kdWxlTWFwKGlkLCByZWxNYXAsIGZhbHNlLCB0cnVlKS5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc1Byb3AoZGVmaW5lZCwgaWQpIHx8IGhhc1Byb3AocmVnaXN0cnksIGlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvL09ubHkgYWxsb3cgdW5kZWYgb24gdG9wIGxldmVsIHJlcXVpcmUgY2FsbHMKICAgICAgICAgICAgICAgIGlmICghcmVsTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYWxSZXF1aXJlLnVuZGVmID0gZnVuY3Rpb24gKGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vQmluZCBhbnkgd2FpdGluZyBkZWZpbmUoKSBjYWxscyB0byB0aGlzIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZml4IGZvciAjNDA4CiAgICAgICAgICAgICAgICAgICAgICAgIHRha2VHbG9iYWxRdWV1ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcCA9IG1ha2VNb2R1bGVNYXAoaWQsIHJlbE1hcCwgdHJ1ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2QgPSBnZXRPd24ocmVnaXN0cnksIGlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZC51bmRlZmVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlU2NyaXB0KGlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkZWZpbmVkW2lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHVybEZldGNoZWRbbWFwLnVybF07CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB1bmRlZkV2ZW50c1tpZF07CgogICAgICAgICAgICAgICAgICAgICAgICAvL0NsZWFuIHF1ZXVlZCBkZWZpbmVzIHRvby4gR28gYmFja3dhcmRzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vaW4gYXJyYXkgc28gdGhhdCB0aGUgc3BsaWNlcyBkbyBub3QKICAgICAgICAgICAgICAgICAgICAgICAgLy9tZXNzIHVwIHRoZSBpdGVyYXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgIGVhY2hSZXZlcnNlKGRlZlF1ZXVlLCBmdW5jdGlvbihhcmdzLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1swXSA9PT0gaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZRdWV1ZS5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgY29udGV4dC5kZWZRdWV1ZU1hcFtpZF07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0hvbGQgb24gdG8gbGlzdGVuZXJzIGluIGNhc2UgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21vZHVsZSB3aWxsIGJlIGF0dGVtcHRlZCB0byBiZSByZWxvYWRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91c2luZyBhIGRpZmZlcmVudCBjb25maWcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kLmV2ZW50cy5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZFdmVudHNbaWRdID0gbW9kLmV2ZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhblJlZ2lzdHJ5KGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsUmVxdWlyZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgdG8gZW5hYmxlIGEgbW9kdWxlIGlmIGl0IGlzIHN0aWxsIGluIHRoZSByZWdpc3RyeQogICAgICAgICAgICAgKiBhd2FpdGluZyBlbmFibGVtZW50LiBBIHNlY29uZCBhcmcsIHBhcmVudCwgdGhlIHBhcmVudCBtb2R1bGUsCiAgICAgICAgICAgICAqIGlzIHBhc3NlZCBpbiBmb3IgY29udGV4dCwgd2hlbiB0aGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5CiAgICAgICAgICAgICAqIHRoZSBvcHRpbWl6ZXIuIE5vdCBzaG93biBoZXJlIHRvIGtlZXAgY29kZSBjb21wYWN0LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZW5hYmxlOiBmdW5jdGlvbiAoZGVwTWFwKSB7CiAgICAgICAgICAgICAgICB2YXIgbW9kID0gZ2V0T3duKHJlZ2lzdHJ5LCBkZXBNYXAuaWQpOwogICAgICAgICAgICAgICAgaWYgKG1vZCkgewogICAgICAgICAgICAgICAgICAgIGdldE1vZHVsZShkZXBNYXApLmVuYWJsZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEludGVybmFsIG1ldGhvZCB1c2VkIGJ5IGVudmlyb25tZW50IGFkYXB0ZXJzIHRvIGNvbXBsZXRlIGEgbG9hZCBldmVudC4KICAgICAgICAgICAgICogQSBsb2FkIGV2ZW50IGNvdWxkIGJlIGEgc2NyaXB0IGxvYWQgb3IganVzdCBhIGxvYWQgcGFzcyBmcm9tIGEgc3luY2hyb25vdXMKICAgICAgICAgICAgICogbG9hZCBjYWxsLgogICAgICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIHBvdGVudGlhbGx5IGNvbXBsZXRlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY29tcGxldGVMb2FkOiBmdW5jdGlvbiAobW9kdWxlTmFtZSkgewogICAgICAgICAgICAgICAgdmFyIGZvdW5kLCBhcmdzLCBtb2QsCiAgICAgICAgICAgICAgICAgICAgc2hpbSA9IGdldE93bihjb25maWcuc2hpbSwgbW9kdWxlTmFtZSkgfHwge30sCiAgICAgICAgICAgICAgICAgICAgc2hFeHBvcnRzID0gc2hpbS5leHBvcnRzOwoKICAgICAgICAgICAgICAgIHRha2VHbG9iYWxRdWV1ZSgpOwoKICAgICAgICAgICAgICAgIHdoaWxlIChkZWZRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBhcmdzID0gZGVmUXVldWUuc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1swXSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzBdID0gbW9kdWxlTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiBhbHJlYWR5IGZvdW5kIGFuIGFub255bW91cyBtb2R1bGUgYW5kIGJvdW5kIGl0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdG8gdGhpcyBuYW1lLCB0aGVuIHRoaXMgaXMgc29tZSBvdGhlciBhbm9uIG1vZHVsZQogICAgICAgICAgICAgICAgICAgICAgICAvL3dhaXRpbmcgZm9yIGl0cyBjb21wbGV0ZUxvYWQgdG8gZmlyZS4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzWzBdID09PSBtb2R1bGVOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vRm91bmQgbWF0Y2hpbmcgZGVmaW5lIGNhbGwgZm9yIHRoaXMgc2NyaXB0IQogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjYWxsR2V0TW9kdWxlKGFyZ3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGV4dC5kZWZRdWV1ZU1hcCA9IHt9OwoKICAgICAgICAgICAgICAgIC8vRG8gdGhpcyBhZnRlciB0aGUgY3ljbGUgb2YgY2FsbEdldE1vZHVsZSBpbiBjYXNlIHRoZSByZXN1bHQKICAgICAgICAgICAgICAgIC8vb2YgdGhvc2UgY2FsbHMvaW5pdCBjYWxscyBjaGFuZ2VzIHRoZSByZWdpc3RyeS4KICAgICAgICAgICAgICAgIG1vZCA9IGdldE93bihyZWdpc3RyeSwgbW9kdWxlTmFtZSk7CgogICAgICAgICAgICAgICAgaWYgKCFmb3VuZCAmJiAhaGFzUHJvcChkZWZpbmVkLCBtb2R1bGVOYW1lKSAmJiBtb2QgJiYgIW1vZC5pbml0ZWQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmVuZm9yY2VEZWZpbmUgJiYgKCFzaEV4cG9ydHMgfHwgIWdldEdsb2JhbChzaEV4cG9ydHMpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUGF0aEZhbGxiYWNrKG1vZHVsZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ25vZGVmaW5lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vIGRlZmluZSBjYWxsIGZvciAnICsgbW9kdWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZHVsZU5hbWVdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvL0Egc2NyaXB0IHRoYXQgZG9lcyBub3QgY2FsbCBkZWZpbmUoKSwgc28ganVzdCBzaW11bGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAvL3RoZSBjYWxsIGZvciBpdC4KICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEdldE1vZHVsZShbbW9kdWxlTmFtZSwgKHNoaW0uZGVwcyB8fCBbXSksIHNoaW0uZXhwb3J0c0ZuXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNoZWNrTG9hZGVkKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ29udmVydHMgYSBtb2R1bGUgbmFtZSB0byBhIGZpbGUgcGF0aC4gU3VwcG9ydHMgY2FzZXMgd2hlcmUKICAgICAgICAgICAgICogbW9kdWxlTmFtZSBtYXkgYWN0dWFsbHkgYmUganVzdCBhbiBVUkwuCiAgICAgICAgICAgICAqIE5vdGUgdGhhdCBpdCAqKmRvZXMgbm90KiogY2FsbCBub3JtYWxpemUgb24gdGhlIG1vZHVsZU5hbWUsCiAgICAgICAgICAgICAqIGl0IGlzIGFzc3VtZWQgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gbm9ybWFsaXplZC4gVGhpcyBpcyBhbgogICAgICAgICAgICAgKiBpbnRlcm5hbCBBUEksIG5vdCBhIHB1YmxpYyBvbmUuIFVzZSB0b1VybCBmb3IgdGhlIHB1YmxpYyBBUEkuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBuYW1lVG9Vcmw6IGZ1bmN0aW9uIChtb2R1bGVOYW1lLCBleHQsIHNraXBFeHQpIHsKICAgICAgICAgICAgICAgIHZhciBwYXRocywgc3ltcywgaSwgcGFyZW50TW9kdWxlLCB1cmwsCiAgICAgICAgICAgICAgICAgICAgcGFyZW50UGF0aCwgYnVuZGxlSWQsCiAgICAgICAgICAgICAgICAgICAgcGtnTWFpbiA9IGdldE93bihjb25maWcucGtncywgbW9kdWxlTmFtZSk7CgogICAgICAgICAgICAgICAgaWYgKHBrZ01haW4pIHsKICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lID0gcGtnTWFpbjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBidW5kbGVJZCA9IGdldE93bihidW5kbGVzTWFwLCBtb2R1bGVOYW1lKTsKCiAgICAgICAgICAgICAgICBpZiAoYnVuZGxlSWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5uYW1lVG9VcmwoYnVuZGxlSWQsIGV4dCwgc2tpcEV4dCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9JZiBhIGNvbG9uIGlzIGluIHRoZSBVUkwsIGl0IGluZGljYXRlcyBhIHByb3RvY29sIGlzIHVzZWQgYW5kIGl0IGlzIGp1c3QKICAgICAgICAgICAgICAgIC8vYW4gVVJMIHRvIGEgZmlsZSwgb3IgaWYgaXQgc3RhcnRzIHdpdGggYSBzbGFzaCwgY29udGFpbnMgYSBxdWVyeSBhcmcgKGkuZS4gPykKICAgICAgICAgICAgICAgIC8vb3IgZW5kcyB3aXRoIC5qcywgdGhlbiBhc3N1bWUgdGhlIHVzZXIgbWVhbnQgdG8gdXNlIGFuIHVybCBhbmQgbm90IGEgbW9kdWxlIGlkLgogICAgICAgICAgICAgICAgLy9UaGUgc2xhc2ggaXMgaW1wb3J0YW50IGZvciBwcm90b2NvbC1sZXNzIFVSTHMgYXMgd2VsbCBhcyBmdWxsIHBhdGhzLgogICAgICAgICAgICAgICAgaWYgKHJlcS5qc0V4dFJlZ0V4cC50ZXN0KG1vZHVsZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgLy9KdXN0IGEgcGxhaW4gcGF0aCwgbm90IG1vZHVsZSBuYW1lIGxvb2t1cCwgc28ganVzdCByZXR1cm4gaXQuCiAgICAgICAgICAgICAgICAgICAgLy9BZGQgZXh0ZW5zaW9uIGlmIGl0IGlzIGluY2x1ZGVkLiBUaGlzIGlzIGEgYml0IHdvbmt5LCBvbmx5IG5vbi0uanMgdGhpbmdzIHBhc3MKICAgICAgICAgICAgICAgICAgICAvL2FuIGV4dGVuc2lvbiwgdGhpcyBtZXRob2QgcHJvYmFibHkgbmVlZHMgdG8gYmUgcmV3b3JrZWQuCiAgICAgICAgICAgICAgICAgICAgdXJsID0gbW9kdWxlTmFtZSArIChleHQgfHwgJycpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL0EgbW9kdWxlIHRoYXQgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIGEgcGF0aC4KICAgICAgICAgICAgICAgICAgICBwYXRocyA9IGNvbmZpZy5wYXRoczsKCiAgICAgICAgICAgICAgICAgICAgc3ltcyA9IG1vZHVsZU5hbWUuc3BsaXQoJy8nKTsKICAgICAgICAgICAgICAgICAgICAvL0ZvciBlYWNoIG1vZHVsZSBuYW1lIHNlZ21lbnQsIHNlZSBpZiB0aGVyZSBpcyBhIHBhdGgKICAgICAgICAgICAgICAgICAgICAvL3JlZ2lzdGVyZWQgZm9yIGl0LiBTdGFydCB3aXRoIG1vc3Qgc3BlY2lmaWMgbmFtZQogICAgICAgICAgICAgICAgICAgIC8vYW5kIHdvcmsgdXAgZnJvbSBpdC4KICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBzeW1zLmxlbmd0aDsgaSA+IDA7IGkgLT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRNb2R1bGUgPSBzeW1zLnNsaWNlKDAsIGkpLmpvaW4oJy8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFBhdGggPSBnZXRPd24ocGF0aHMsIHBhcmVudE1vZHVsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRQYXRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lmIGFuIGFycmF5LCBpdCBtZWFucyB0aGVyZSBhcmUgYSBmZXcgY2hvaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2hvb3NlIHRoZSBvbmUgdGhhdCBpcyBkZXNpcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShwYXJlbnRQYXRoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFBhdGggPSBwYXJlbnRQYXRoWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltcy5zcGxpY2UoMCwgaSwgcGFyZW50UGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy9Kb2luIHRoZSBwYXRoIHBhcnRzIHRvZ2V0aGVyLCB0aGVuIGZpZ3VyZSBvdXQgaWYgYmFzZVVybCBpcyBuZWVkZWQuCiAgICAgICAgICAgICAgICAgICAgdXJsID0gc3ltcy5qb2luKCcvJyk7CiAgICAgICAgICAgICAgICAgICAgdXJsICs9IChleHQgfHwgKC9eZGF0YVw6fF5ibG9iXDp8XD8vLnRlc3QodXJsKSB8fCBza2lwRXh0ID8gJycgOiAnLmpzJykpOwogICAgICAgICAgICAgICAgICAgIHVybCA9ICh1cmwuY2hhckF0KDApID09PSAnLycgfHwgdXJsLm1hdGNoKC9eW1x3XCtcLlwtXSs6LykgPyAnJyA6IGNvbmZpZy5iYXNlVXJsKSArIHVybDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnLnVybEFyZ3MgJiYgIS9eYmxvYlw6Ly50ZXN0KHVybCkgPwogICAgICAgICAgICAgICAgICAgICAgIHVybCArIGNvbmZpZy51cmxBcmdzKG1vZHVsZU5hbWUsIHVybCkgOiB1cmw7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvL0RlbGVnYXRlcyB0byByZXEubG9hZC4gQnJva2VuIG91dCBhcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvCiAgICAgICAgICAgIC8vYWxsb3cgb3ZlcnJpZGluZyBpbiB0aGUgb3B0aW1pemVyLgogICAgICAgICAgICBsb2FkOiBmdW5jdGlvbiAoaWQsIHVybCkgewogICAgICAgICAgICAgICAgcmVxLmxvYWQoY29udGV4dCwgaWQsIHVybCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXhlY3V0ZXMgYSBtb2R1bGUgY2FsbGJhY2sgZnVuY3Rpb24uIEJyb2tlbiBvdXQgYXMgYSBzZXBhcmF0ZSBmdW5jdGlvbgogICAgICAgICAgICAgKiBzb2xlbHkgdG8gYWxsb3cgdGhlIGJ1aWxkIHN5c3RlbSB0byBzZXF1ZW5jZSB0aGUgZmlsZXMgaW4gdGhlIGJ1aWx0CiAgICAgICAgICAgICAqIGxheWVyIGluIHRoZSByaWdodCBzZXF1ZW5jZS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGV4ZWNDYjogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrLCBhcmdzLCBleHBvcnRzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkoZXhwb3J0cywgYXJncyk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogY2FsbGJhY2sgZm9yIHNjcmlwdCBsb2FkcywgdXNlZCB0byBjaGVjayBzdGF0dXMgb2YgbG9hZGluZy4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtFdmVudH0gZXZ0IHRoZSBldmVudCBmcm9tIHRoZSBicm93c2VyIGZvciB0aGUgc2NyaXB0CiAgICAgICAgICAgICAqIHRoYXQgd2FzIGxvYWRlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uU2NyaXB0TG9hZDogZnVuY3Rpb24gKGV2dCkgewogICAgICAgICAgICAgICAgLy9Vc2luZyBjdXJyZW50VGFyZ2V0IGluc3RlYWQgb2YgdGFyZ2V0IGZvciBGaXJlZm94IDIuMCdzIHNha2UuIE5vdAogICAgICAgICAgICAgICAgLy9hbGwgb2xkIGJyb3dzZXJzIHdpbGwgYmUgc3VwcG9ydGVkLCBidXQgdGhpcyBvbmUgd2FzIGVhc3kgZW5vdWdoCiAgICAgICAgICAgICAgICAvL3RvIHN1cHBvcnQgYW5kIHN0aWxsIG1ha2VzIHNlbnNlLgogICAgICAgICAgICAgICAgaWYgKGV2dC50eXBlID09PSAnbG9hZCcgfHwKICAgICAgICAgICAgICAgICAgICAgICAgKHJlYWR5UmVnRXhwLnRlc3QoKGV2dC5jdXJyZW50VGFyZ2V0IHx8IGV2dC5zcmNFbGVtZW50KS5yZWFkeVN0YXRlKSkpIHsKICAgICAgICAgICAgICAgICAgICAvL1Jlc2V0IGludGVyYWN0aXZlIHNjcmlwdCBzbyBhIHNjcmlwdCBub2RlIGlzIG5vdCBoZWxkIG9udG8gZm9yCiAgICAgICAgICAgICAgICAgICAgLy90byBsb25nLgogICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlU2NyaXB0ID0gbnVsbDsKCiAgICAgICAgICAgICAgICAgICAgLy9QdWxsIG91dCB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIGFuZCB0aGUgY29udGV4dC4KICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGdldFNjcmlwdERhdGEoZXZ0KTsKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmNvbXBsZXRlTG9hZChkYXRhLmlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsYmFjayBmb3Igc2NyaXB0IGVycm9ycy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uU2NyaXB0RXJyb3I6IGZ1bmN0aW9uIChldnQpIHsKICAgICAgICAgICAgICAgIHZhciBkYXRhID0gZ2V0U2NyaXB0RGF0YShldnQpOwogICAgICAgICAgICAgICAgaWYgKCFoYXNQYXRoRmFsbGJhY2soZGF0YS5pZCkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGVhY2hQcm9wKHJlZ2lzdHJ5LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZignX0ByJykgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2godmFsdWUuZGVwTWFwcywgZnVuY3Rpb24oZGVwTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlcE1hcC5pZCA9PT0gZGF0YS5pZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRzLnB1c2goa2V5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ3NjcmlwdGVycm9yJywgJ1NjcmlwdCBlcnJvciBmb3IgIicgKyBkYXRhLmlkICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmVudHMubGVuZ3RoID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyIsIG5lZWRlZCBieTogJyArIHBhcmVudHMuam9pbignLCAnKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICciJyksIGV2dCwgW2RhdGEuaWRdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBjb250ZXh0LnJlcXVpcmUgPSBjb250ZXh0Lm1ha2VSZXF1aXJlKCk7CiAgICAgICAgcmV0dXJuIGNvbnRleHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBNYWluIGVudHJ5IHBvaW50LgogICAgICoKICAgICAqIElmIHRoZSBvbmx5IGFyZ3VtZW50IHRvIHJlcXVpcmUgaXMgYSBzdHJpbmcsIHRoZW4gdGhlIG1vZHVsZSB0aGF0CiAgICAgKiBpcyByZXByZXNlbnRlZCBieSB0aGF0IHN0cmluZyBpcyBmZXRjaGVkIGZvciB0aGUgYXBwcm9wcmlhdGUgY29udGV4dC4KICAgICAqCiAgICAgKiBJZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYW4gYXJyYXksIHRoZW4gaXQgd2lsbCBiZSB0cmVhdGVkIGFzIGFuIGFycmF5CiAgICAgKiBvZiBkZXBlbmRlbmN5IHN0cmluZyBuYW1lcyB0byBmZXRjaC4gQW4gb3B0aW9uYWwgZnVuY3Rpb24gY2FsbGJhY2sgY2FuCiAgICAgKiBiZSBzcGVjaWZpZWQgdG8gZXhlY3V0ZSB3aGVuIGFsbCBvZiB0aG9zZSBkZXBlbmRlbmNpZXMgYXJlIGF2YWlsYWJsZS4KICAgICAqCiAgICAgKiBNYWtlIGEgbG9jYWwgcmVxIHZhcmlhYmxlIHRvIGhlbHAgQ2FqYSBjb21wbGlhbmNlIChpdCBhc3N1bWVzIHRoaW5ncwogICAgICogb24gYSByZXF1aXJlIHRoYXQgYXJlIG5vdCBzdGFuZGFyZGl6ZWQpLCBhbmQgdG8gZ2l2ZSBhIHNob3J0CiAgICAgKiBuYW1lIGZvciBtaW5pZmljYXRpb24vbG9jYWwgc2NvcGUgdXNlLgogICAgICovCiAgICByZXEgPSByZXF1aXJlanMgPSBmdW5jdGlvbiAoZGVwcywgY2FsbGJhY2ssIGVycmJhY2ssIG9wdGlvbmFsKSB7CgogICAgICAgIC8vRmluZCB0aGUgcmlnaHQgY29udGV4dCwgdXNlIGRlZmF1bHQKICAgICAgICB2YXIgY29udGV4dCwgY29uZmlnLAogICAgICAgICAgICBjb250ZXh0TmFtZSA9IGRlZkNvbnRleHROYW1lOwoKICAgICAgICAvLyBEZXRlcm1pbmUgaWYgaGF2ZSBjb25maWcgb2JqZWN0IGluIHRoZSBjYWxsLgogICAgICAgIGlmICghaXNBcnJheShkZXBzKSAmJiB0eXBlb2YgZGVwcyAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgLy8gZGVwcyBpcyBhIGNvbmZpZyBvYmplY3QKICAgICAgICAgICAgY29uZmlnID0gZGVwczsKICAgICAgICAgICAgaWYgKGlzQXJyYXkoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAvLyBBZGp1c3QgYXJncyBpZiB0aGVyZSBhcmUgZGVwZW5kZW5jaWVzCiAgICAgICAgICAgICAgICBkZXBzID0gY2FsbGJhY2s7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGVycmJhY2s7CiAgICAgICAgICAgICAgICBlcnJiYWNrID0gb3B0aW9uYWw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZXBzID0gW107CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLmNvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dE5hbWUgPSBjb25maWcuY29udGV4dDsKICAgICAgICB9CgogICAgICAgIGNvbnRleHQgPSBnZXRPd24oY29udGV4dHMsIGNvbnRleHROYW1lKTsKICAgICAgICBpZiAoIWNvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHRzW2NvbnRleHROYW1lXSA9IHJlcS5zLm5ld0NvbnRleHQoY29udGV4dE5hbWUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbmZpZykgewogICAgICAgICAgICBjb250ZXh0LmNvbmZpZ3VyZShjb25maWcpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGNvbnRleHQucmVxdWlyZShkZXBzLCBjYWxsYmFjaywgZXJyYmFjayk7CiAgICB9OwoKICAgIC8qKgogICAgICogU3VwcG9ydCByZXF1aXJlLmNvbmZpZygpIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGNvb3BlcmF0ZSB3aXRoIG90aGVyCiAgICAgKiBBTUQgbG9hZGVycyBvbiBnbG9iYWxseSBhZ3JlZWQgbmFtZXMuCiAgICAgKi8KICAgIHJlcS5jb25maWcgPSBmdW5jdGlvbiAoY29uZmlnKSB7CiAgICAgICAgcmV0dXJuIHJlcShjb25maWcpOwogICAgfTsKCiAgICAvKioKICAgICAqIEV4ZWN1dGUgc29tZXRoaW5nIGFmdGVyIHRoZSBjdXJyZW50IHRpY2sKICAgICAqIG9mIHRoZSBldmVudCBsb29wLiBPdmVycmlkZSBmb3Igb3RoZXIgZW52cwogICAgICogdGhhdCBoYXZlIGEgYmV0dGVyIHNvbHV0aW9uIHRoYW4gc2V0VGltZW91dC4KICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmbiBmdW5jdGlvbiB0byBleGVjdXRlIGxhdGVyLgogICAgICovCiAgICByZXEubmV4dFRpY2sgPSB0eXBlb2Ygc2V0VGltZW91dCAhPT0gJ3VuZGVmaW5lZCcgPyBmdW5jdGlvbiAoZm4pIHsKICAgICAgICBzZXRUaW1lb3V0KGZuLCA0KTsKICAgIH0gOiBmdW5jdGlvbiAoZm4pIHsgZm4oKTsgfTsKCiAgICAvKioKICAgICAqIEV4cG9ydCByZXF1aXJlIGFzIGEgZ2xvYmFsLCBidXQgb25seSBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgogICAgICovCiAgICBpZiAoIXJlcXVpcmUpIHsKICAgICAgICByZXF1aXJlID0gcmVxOwogICAgfQoKICAgIHJlcS52ZXJzaW9uID0gdmVyc2lvbjsKCiAgICAvL1VzZWQgdG8gZmlsdGVyIG91dCBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgYWxyZWFkeSBwYXRocy4KICAgIHJlcS5qc0V4dFJlZ0V4cCA9IC9eXC98OnxcP3xcLmpzJC87CiAgICByZXEuaXNCcm93c2VyID0gaXNCcm93c2VyOwogICAgcyA9IHJlcS5zID0gewogICAgICAgIGNvbnRleHRzOiBjb250ZXh0cywKICAgICAgICBuZXdDb250ZXh0OiBuZXdDb250ZXh0CiAgICB9OwoKICAgIC8vQ3JlYXRlIGRlZmF1bHQgY29udGV4dC4KICAgIHJlcSh7fSk7CgogICAgLy9FeHBvcnRzIHNvbWUgY29udGV4dC1zZW5zaXRpdmUgbWV0aG9kcyBvbiBnbG9iYWwgcmVxdWlyZS4KICAgIGVhY2goWwogICAgICAgICd0b1VybCcsCiAgICAgICAgJ3VuZGVmJywKICAgICAgICAnZGVmaW5lZCcsCiAgICAgICAgJ3NwZWNpZmllZCcKICAgIF0sIGZ1bmN0aW9uIChwcm9wKSB7CiAgICAgICAgLy9SZWZlcmVuY2UgZnJvbSBjb250ZXh0cyBpbnN0ZWFkIG9mIGVhcmx5IGJpbmRpbmcgdG8gZGVmYXVsdCBjb250ZXh0LAogICAgICAgIC8vc28gdGhhdCBkdXJpbmcgYnVpbGRzLCB0aGUgbGF0ZXN0IGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IGNvbnRleHQKICAgICAgICAvL3dpdGggaXRzIGNvbmZpZyBnZXRzIHVzZWQuCiAgICAgICAgcmVxW3Byb3BdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgY3R4ID0gY29udGV4dHNbZGVmQ29udGV4dE5hbWVdOwogICAgICAgICAgICByZXR1cm4gY3R4LnJlcXVpcmVbcHJvcF0uYXBwbHkoY3R4LCBhcmd1bWVudHMpOwogICAgICAgIH07CiAgICB9KTsKCiAgICBpZiAoaXNCcm93c2VyKSB7CiAgICAgICAgaGVhZCA9IHMuaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07CiAgICAgICAgLy9JZiBCQVNFIHRhZyBpcyBpbiBwbGF5LCB1c2luZyBhcHBlbmRDaGlsZCBpcyBhIHByb2JsZW0gZm9yIElFNi4KICAgICAgICAvL1doZW4gdGhhdCBicm93c2VyIGRpZXMsIHRoaXMgY2FuIGJlIHJlbW92ZWQuIERldGFpbHMgaW4gdGhpcyBqUXVlcnkgYnVnOgogICAgICAgIC8vaHR0cDovL2Rldi5qcXVlcnkuY29tL3RpY2tldC8yNzA5CiAgICAgICAgYmFzZUVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYmFzZScpWzBdOwogICAgICAgIGlmIChiYXNlRWxlbWVudCkgewogICAgICAgICAgICBoZWFkID0gcy5oZWFkID0gYmFzZUVsZW1lbnQucGFyZW50Tm9kZTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBBbnkgZXJyb3JzIHRoYXQgcmVxdWlyZSBleHBsaWNpdGx5IGdlbmVyYXRlcyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzCiAgICAgKiBmdW5jdGlvbi4gSW50ZXJjZXB0L292ZXJyaWRlIGl0IGlmIHlvdSB3YW50IGN1c3RvbSBlcnJvciBoYW5kbGluZy4KICAgICAqIEBwYXJhbSB7RXJyb3J9IGVyciB0aGUgZXJyb3Igb2JqZWN0LgogICAgICovCiAgICByZXEub25FcnJvciA9IGRlZmF1bHRPbkVycm9yOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyB0aGUgbm9kZSBmb3IgdGhlIGxvYWQgY29tbWFuZC4gT25seSB1c2VkIGluIGJyb3dzZXIgZW52cy4KICAgICAqLwogICAgcmVxLmNyZWF0ZU5vZGUgPSBmdW5jdGlvbiAoY29uZmlnLCBtb2R1bGVOYW1lLCB1cmwpIHsKICAgICAgICB2YXIgbm9kZSA9IGNvbmZpZy54aHRtbCA/CiAgICAgICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnaHRtbDpzY3JpcHQnKSA6CiAgICAgICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICBub2RlLnR5cGUgPSBjb25maWcuc2NyaXB0VHlwZSB8fCAndGV4dC9qYXZhc2NyaXB0JzsKICAgICAgICBub2RlLmNoYXJzZXQgPSAndXRmLTgnOwogICAgICAgIG5vZGUuYXN5bmMgPSB0cnVlOwogICAgICAgIHJldHVybiBub2RlOwogICAgfTsKCiAgICAvKioKICAgICAqIERvZXMgdGhlIHJlcXVlc3QgdG8gbG9hZCBhIG1vZHVsZSBmb3IgdGhlIGJyb3dzZXIgY2FzZS4KICAgICAqIE1ha2UgdGhpcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGFsbG93IG90aGVyIGVudmlyb25tZW50cwogICAgICogdG8gb3ZlcnJpZGUgaXQuCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgdGhlIHJlcXVpcmUgY29udGV4dCB0byBmaW5kIHN0YXRlLgogICAgICogQHBhcmFtIHtTdHJpbmd9IG1vZHVsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSB1cmwgdGhlIFVSTCB0byB0aGUgbW9kdWxlLgogICAgICovCiAgICByZXEubG9hZCA9IGZ1bmN0aW9uIChjb250ZXh0LCBtb2R1bGVOYW1lLCB1cmwpIHsKICAgICAgICB2YXIgY29uZmlnID0gKGNvbnRleHQgJiYgY29udGV4dC5jb25maWcpIHx8IHt9LAogICAgICAgICAgICBub2RlOwogICAgICAgIGlmIChpc0Jyb3dzZXIpIHsKICAgICAgICAgICAgLy9JbiB0aGUgYnJvd3NlciBzbyB1c2UgYSBzY3JpcHQgdGFnCiAgICAgICAgICAgIG5vZGUgPSByZXEuY3JlYXRlTm9kZShjb25maWcsIG1vZHVsZU5hbWUsIHVybCk7CgogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlY29udGV4dCcsIGNvbnRleHQuY29udGV4dE5hbWUpOwogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlbW9kdWxlJywgbW9kdWxlTmFtZSk7CgogICAgICAgICAgICAvL1NldCB1cCBsb2FkIGxpc3RlbmVyLiBUZXN0IGF0dGFjaEV2ZW50IGZpcnN0IGJlY2F1c2UgSUU5IGhhcwogICAgICAgICAgICAvL2Egc3VidGxlIGlzc3VlIGluIGl0cyBhZGRFdmVudExpc3RlbmVyIGFuZCBzY3JpcHQgb25sb2FkIGZpcmluZ3MKICAgICAgICAgICAgLy90aGF0IGRvIG5vdCBtYXRjaCB0aGUgYmVoYXZpb3Igb2YgYWxsIG90aGVyIGJyb3dzZXJzIHdpdGgKICAgICAgICAgICAgLy9hZGRFdmVudExpc3RlbmVyIHN1cHBvcnQsIHdoaWNoIGZpcmUgdGhlIG9ubG9hZCBldmVudCBmb3IgYQogICAgICAgICAgICAvL3NjcmlwdCByaWdodCBhZnRlciB0aGUgc2NyaXB0IGV4ZWN1dGlvbi4gU2VlOgogICAgICAgICAgICAvL2h0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvNjQ4MDU3L3NjcmlwdC1vbmxvYWQtZXZlbnQtaXMtbm90LWZpcmVkLWltbWVkaWF0ZWx5LWFmdGVyLXNjcmlwdC1leGVjdXRpb24KICAgICAgICAgICAgLy9VTkZPUlRVTkFURUxZIE9wZXJhIGltcGxlbWVudHMgYXR0YWNoRXZlbnQgYnV0IGRvZXMgbm90IGZvbGxvdyB0aGUgc2NyaXB0CiAgICAgICAgICAgIC8vc2NyaXB0IGV4ZWN1dGlvbiBtb2RlLgogICAgICAgICAgICBpZiAobm9kZS5hdHRhY2hFdmVudCAmJgogICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgaWYgbm9kZS5hdHRhY2hFdmVudCBpcyBhcnRpZmljaWFsbHkgYWRkZWQgYnkgY3VzdG9tIHNjcmlwdCBvcgogICAgICAgICAgICAgICAgICAgIC8vbmF0aXZlbHkgc3VwcG9ydGVkIGJ5IGJyb3dzZXIKICAgICAgICAgICAgICAgICAgICAvL3JlYWQgaHR0cHM6Ly9naXRodWIuY29tL3JlcXVpcmVqcy9yZXF1aXJlanMvaXNzdWVzLzE4NwogICAgICAgICAgICAgICAgICAgIC8vaWYgd2UgY2FuIE5PVCBmaW5kIFtuYXRpdmUgY29kZV0gdGhlbiBpdCBtdXN0IE5PVCBuYXRpdmVseSBzdXBwb3J0ZWQuCiAgICAgICAgICAgICAgICAgICAgLy9pbiBJRTgsIG5vZGUuYXR0YWNoRXZlbnQgZG9lcyBub3QgaGF2ZSB0b1N0cmluZygpCiAgICAgICAgICAgICAgICAgICAgLy9Ob3RlIHRoZSB0ZXN0IGZvciAiW25hdGl2ZSBjb2RlIiB3aXRoIG5vIGNsb3NpbmcgYnJhY2UsIHNlZToKICAgICAgICAgICAgICAgICAgICAvL2h0dHBzOi8vZ2l0aHViLmNvbS9yZXF1aXJlanMvcmVxdWlyZWpzL2lzc3Vlcy8yNzMKICAgICAgICAgICAgICAgICAgICAhKG5vZGUuYXR0YWNoRXZlbnQudG9TdHJpbmcgJiYgbm9kZS5hdHRhY2hFdmVudC50b1N0cmluZygpLmluZGV4T2YoJ1tuYXRpdmUgY29kZScpIDwgMCkgJiYKICAgICAgICAgICAgICAgICAgICAhaXNPcGVyYSkgewogICAgICAgICAgICAgICAgLy9Qcm9iYWJseSBJRS4gSUUgKGF0IGxlYXN0IDYtOCkgZG8gbm90IGZpcmUKICAgICAgICAgICAgICAgIC8vc2NyaXB0IG9ubG9hZCByaWdodCBhZnRlciBleGVjdXRpbmcgdGhlIHNjcmlwdCwgc28KICAgICAgICAgICAgICAgIC8vd2UgY2Fubm90IHRpZSB0aGUgYW5vbnltb3VzIGRlZmluZSBjYWxsIHRvIGEgbmFtZS4KICAgICAgICAgICAgICAgIC8vSG93ZXZlciwgSUUgcmVwb3J0cyB0aGUgc2NyaXB0IGFzIGJlaW5nIGluICdpbnRlcmFjdGl2ZScKICAgICAgICAgICAgICAgIC8vcmVhZHlTdGF0ZSBhdCB0aGUgdGltZSBvZiB0aGUgZGVmaW5lIGNhbGwuCiAgICAgICAgICAgICAgICB1c2VJbnRlcmFjdGl2ZSA9IHRydWU7CgogICAgICAgICAgICAgICAgbm9kZS5hdHRhY2hFdmVudCgnb25yZWFkeXN0YXRlY2hhbmdlJywgY29udGV4dC5vblNjcmlwdExvYWQpOwogICAgICAgICAgICAgICAgLy9JdCB3b3VsZCBiZSBncmVhdCB0byBhZGQgYW4gZXJyb3IgaGFuZGxlciBoZXJlIHRvIGNhdGNoCiAgICAgICAgICAgICAgICAvLzQwNHMgaW4gSUU5Ky4gSG93ZXZlciwgb25yZWFkeXN0YXRlY2hhbmdlIHdpbGwgZmlyZSBiZWZvcmUKICAgICAgICAgICAgICAgIC8vdGhlIGVycm9yIGhhbmRsZXIsIHNvIHRoYXQgZG9lcyBub3QgaGVscC4gSWYgYWRkRXZlbnRMaXN0ZW5lcgogICAgICAgICAgICAgICAgLy9pcyB1c2VkLCB0aGVuIElFIHdpbGwgZmlyZSBlcnJvciBiZWZvcmUgbG9hZCwgYnV0IHdlIGNhbm5vdAogICAgICAgICAgICAgICAgLy91c2UgdGhhdCBwYXRod2F5IGdpdmVuIHRoZSBjb25uZWN0Lm1pY3Jvc29mdC5jb20gaXNzdWUKICAgICAgICAgICAgICAgIC8vbWVudGlvbmVkIGFib3ZlIGFib3V0IG5vdCBkb2luZyB0aGUgJ3NjcmlwdCBleGVjdXRlLAogICAgICAgICAgICAgICAgLy90aGVuIGZpcmUgdGhlIHNjcmlwdCBsb2FkIGV2ZW50IGxpc3RlbmVyIGJlZm9yZSBleGVjdXRlCiAgICAgICAgICAgICAgICAvL25leHQgc2NyaXB0JyB0aGF0IG90aGVyIGJyb3dzZXJzIGRvLgogICAgICAgICAgICAgICAgLy9CZXN0IGhvcGU6IElFMTAgZml4ZXMgdGhlIGlzc3VlcywKICAgICAgICAgICAgICAgIC8vYW5kIHRoZW4gZGVzdHJveXMgYWxsIGluc3RhbGxzIG9mIElFIDYtOS4KICAgICAgICAgICAgICAgIC8vbm9kZS5hdHRhY2hFdmVudCgnb25lcnJvcicsIGNvbnRleHQub25TY3JpcHRFcnJvcik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBjb250ZXh0Lm9uU2NyaXB0TG9hZCwgZmFsc2UpOwogICAgICAgICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGNvbnRleHQub25TY3JpcHRFcnJvciwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5vZGUuc3JjID0gdXJsOwoKICAgICAgICAgICAgLy9DYWxsaW5nIG9uTm9kZUNyZWF0ZWQgYWZ0ZXIgYWxsIHByb3BlcnRpZXMgb24gdGhlIG5vZGUgaGF2ZSBiZWVuCiAgICAgICAgICAgIC8vc2V0LCBidXQgYmVmb3JlIGl0IGlzIHBsYWNlZCBpbiB0aGUgRE9NLgogICAgICAgICAgICBpZiAoY29uZmlnLm9uTm9kZUNyZWF0ZWQpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5vbk5vZGVDcmVhdGVkKG5vZGUsIGNvbmZpZywgbW9kdWxlTmFtZSwgdXJsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9Gb3Igc29tZSBjYWNoZSBjYXNlcyBpbiBJRSA2LTgsIHRoZSBzY3JpcHQgZXhlY3V0ZXMgYmVmb3JlIHRoZSBlbmQKICAgICAgICAgICAgLy9vZiB0aGUgYXBwZW5kQ2hpbGQgZXhlY3V0aW9uLCBzbyB0byB0aWUgYW4gYW5vbnltb3VzIGRlZmluZQogICAgICAgICAgICAvL2NhbGwgdG8gdGhlIG1vZHVsZSBuYW1lICh3aGljaCBpcyBzdG9yZWQgb24gdGhlIG5vZGUpLCBob2xkIG9uCiAgICAgICAgICAgIC8vdG8gYSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLCBidXQgY2xlYXIgYWZ0ZXIgdGhlIERPTSBpbnNlcnRpb24uCiAgICAgICAgICAgIGN1cnJlbnRseUFkZGluZ1NjcmlwdCA9IG5vZGU7CiAgICAgICAgICAgIGlmIChiYXNlRWxlbWVudCkgewogICAgICAgICAgICAgICAgaGVhZC5pbnNlcnRCZWZvcmUobm9kZSwgYmFzZUVsZW1lbnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChub2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdXJyZW50bHlBZGRpbmdTY3JpcHQgPSBudWxsOwoKICAgICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgfSBlbHNlIGlmIChpc1dlYldvcmtlcikgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgLy9JbiBhIHdlYiB3b3JrZXIsIHVzZSBpbXBvcnRTY3JpcHRzLiBUaGlzIGlzIG5vdCBhIHZlcnkKICAgICAgICAgICAgICAgIC8vZWZmaWNpZW50IHVzZSBvZiBpbXBvcnRTY3JpcHRzLCBpbXBvcnRTY3JpcHRzIHdpbGwgYmxvY2sgdW50aWwKICAgICAgICAgICAgICAgIC8vaXRzIHNjcmlwdCBpcyBkb3dubG9hZGVkIGFuZCBldmFsdWF0ZWQuIEhvd2V2ZXIsIGlmIHdlYiB3b3JrZXJzCiAgICAgICAgICAgICAgICAvL2FyZSBpbiBwbGF5LCB0aGUgZXhwZWN0YXRpb24gaXMgdGhhdCBhIGJ1aWxkIGhhcyBiZWVuIGRvbmUgc28KICAgICAgICAgICAgICAgIC8vdGhhdCBvbmx5IG9uZSBzY3JpcHQgbmVlZHMgdG8gYmUgbG9hZGVkIGFueXdheS4gVGhpcyBtYXkgbmVlZAogICAgICAgICAgICAgICAgLy90byBiZSByZWV2YWx1YXRlZCBpZiBvdGhlciB1c2UgY2FzZXMgYmVjb21lIGNvbW1vbi4KCiAgICAgICAgICAgICAgICAvLyBQb3N0IGEgdGFzayB0byB0aGUgZXZlbnQgbG9vcCB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBXZWJLaXQKICAgICAgICAgICAgICAgIC8vIHdoZXJlIHRoZSB3b3JrZXIgZ2V0cyBnYXJiYWdlLWNvbGxlY3RlZCBhZnRlciBjYWxsaW5nCiAgICAgICAgICAgICAgICAvLyBpbXBvcnRTY3JpcHRzKCk6IGh0dHBzOi8vd2Via2l0Lm9yZy9iLzE1MzMxNwogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHt9LCAwKTsKICAgICAgICAgICAgICAgIGltcG9ydFNjcmlwdHModXJsKTsKCiAgICAgICAgICAgICAgICAvL0FjY291bnQgZm9yIGFub255bW91cyBtb2R1bGVzCiAgICAgICAgICAgICAgICBjb250ZXh0LmNvbXBsZXRlTG9hZChtb2R1bGVOYW1lKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgY29udGV4dC5vbkVycm9yKG1ha2VFcnJvcignaW1wb3J0c2NyaXB0cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydFNjcmlwdHMgZmFpbGVkIGZvciAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZSArICcgYXQgJyArIHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2R1bGVOYW1lXSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBnZXRJbnRlcmFjdGl2ZVNjcmlwdCgpIHsKICAgICAgICBpZiAoaW50ZXJhY3RpdmVTY3JpcHQgJiYgaW50ZXJhY3RpdmVTY3JpcHQucmVhZHlTdGF0ZSA9PT0gJ2ludGVyYWN0aXZlJykgewogICAgICAgICAgICByZXR1cm4gaW50ZXJhY3RpdmVTY3JpcHQ7CiAgICAgICAgfQoKICAgICAgICBlYWNoUmV2ZXJzZShzY3JpcHRzKCksIGZ1bmN0aW9uIChzY3JpcHQpIHsKICAgICAgICAgICAgaWYgKHNjcmlwdC5yZWFkeVN0YXRlID09PSAnaW50ZXJhY3RpdmUnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGludGVyYWN0aXZlU2NyaXB0ID0gc2NyaXB0KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBpbnRlcmFjdGl2ZVNjcmlwdDsKICAgIH0KCiAgICAvL0xvb2sgZm9yIGEgZGF0YS1tYWluIHNjcmlwdCBhdHRyaWJ1dGUsIHdoaWNoIGNvdWxkIGFsc28gYWRqdXN0IHRoZSBiYXNlVXJsLgogICAgaWYgKGlzQnJvd3NlciAmJiAhY2ZnLnNraXBEYXRhTWFpbikgewogICAgICAgIC8vRmlndXJlIG91dCBiYXNlVXJsLiBHZXQgaXQgZnJvbSB0aGUgc2NyaXB0IHRhZyB3aXRoIHJlcXVpcmUuanMgaW4gaXQuCiAgICAgICAgZWFjaFJldmVyc2Uoc2NyaXB0cygpLCBmdW5jdGlvbiAoc2NyaXB0KSB7CiAgICAgICAgICAgIC8vU2V0IHRoZSAnaGVhZCcgd2hlcmUgd2UgY2FuIGFwcGVuZCBjaGlsZHJlbiBieQogICAgICAgICAgICAvL3VzaW5nIHRoZSBzY3JpcHQncyBwYXJlbnQuCiAgICAgICAgICAgIGlmICghaGVhZCkgewogICAgICAgICAgICAgICAgaGVhZCA9IHNjcmlwdC5wYXJlbnROb2RlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL0xvb2sgZm9yIGEgZGF0YS1tYWluIGF0dHJpYnV0ZSB0byBzZXQgbWFpbiBzY3JpcHQgZm9yIHRoZSBwYWdlCiAgICAgICAgICAgIC8vdG8gbG9hZC4gSWYgaXQgaXMgdGhlcmUsIHRoZSBwYXRoIHRvIGRhdGEgbWFpbiBiZWNvbWVzIHRoZQogICAgICAgICAgICAvL2Jhc2VVcmwsIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHNldC4KICAgICAgICAgICAgZGF0YU1haW4gPSBzY3JpcHQuZ2V0QXR0cmlidXRlKCdkYXRhLW1haW4nKTsKICAgICAgICAgICAgaWYgKGRhdGFNYWluKSB7CiAgICAgICAgICAgICAgICAvL1ByZXNlcnZlIGRhdGFNYWluIGluIGNhc2UgaXQgaXMgYSBwYXRoIChpLmUuIGNvbnRhaW5zICc/JykKICAgICAgICAgICAgICAgIG1haW5TY3JpcHQgPSBkYXRhTWFpbjsKCiAgICAgICAgICAgICAgICAvL1NldCBmaW5hbCBiYXNlVXJsIGlmIHRoZXJlIGlzIG5vdCBhbHJlYWR5IGFuIGV4cGxpY2l0IG9uZSwKICAgICAgICAgICAgICAgIC8vYnV0IG9ubHkgZG8gc28gaWYgdGhlIGRhdGEtbWFpbiB2YWx1ZSBpcyBub3QgYSBsb2FkZXIgcGx1Z2luCiAgICAgICAgICAgICAgICAvL21vZHVsZSBJRC4KICAgICAgICAgICAgICAgIGlmICghY2ZnLmJhc2VVcmwgJiYgbWFpblNjcmlwdC5pbmRleE9mKCchJykgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgLy9QdWxsIG9mZiB0aGUgZGlyZWN0b3J5IG9mIGRhdGEtbWFpbiBmb3IgdXNlIGFzIHRoZQogICAgICAgICAgICAgICAgICAgIC8vYmFzZVVybC4KICAgICAgICAgICAgICAgICAgICBzcmMgPSBtYWluU2NyaXB0LnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICAgICAgbWFpblNjcmlwdCA9IHNyYy5wb3AoKTsKICAgICAgICAgICAgICAgICAgICBzdWJQYXRoID0gc3JjLmxlbmd0aCA/IHNyYy5qb2luKCcvJykgICsgJy8nIDogJy4vJzsKCiAgICAgICAgICAgICAgICAgICAgY2ZnLmJhc2VVcmwgPSBzdWJQYXRoOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vU3RyaXAgb2ZmIGFueSB0cmFpbGluZyAuanMgc2luY2UgbWFpblNjcmlwdCBpcyBub3cKICAgICAgICAgICAgICAgIC8vbGlrZSBhIG1vZHVsZSBuYW1lLgogICAgICAgICAgICAgICAgbWFpblNjcmlwdCA9IG1haW5TY3JpcHQucmVwbGFjZShqc1N1ZmZpeFJlZ0V4cCwgJycpOwoKICAgICAgICAgICAgICAgIC8vSWYgbWFpblNjcmlwdCBpcyBzdGlsbCBhIHBhdGgsIGZhbGwgYmFjayB0byBkYXRhTWFpbgogICAgICAgICAgICAgICAgaWYgKHJlcS5qc0V4dFJlZ0V4cC50ZXN0KG1haW5TY3JpcHQpKSB7CiAgICAgICAgICAgICAgICAgICAgbWFpblNjcmlwdCA9IGRhdGFNYWluOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vUHV0IHRoZSBkYXRhLW1haW4gc2NyaXB0IGluIHRoZSBmaWxlcyB0byBsb2FkLgogICAgICAgICAgICAgICAgY2ZnLmRlcHMgPSBjZmcuZGVwcyA/IGNmZy5kZXBzLmNvbmNhdChtYWluU2NyaXB0KSA6IFttYWluU2NyaXB0XTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyBkZWZpbml0aW9ucyBvZiBtb2R1bGVzLiBEaWZmZXJzIGZyb20KICAgICAqIHJlcXVpcmUoKSBpbiB0aGF0IGEgc3RyaW5nIGZvciB0aGUgbW9kdWxlIHNob3VsZCBiZSB0aGUgZmlyc3QgYXJndW1lbnQsCiAgICAgKiBhbmQgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYWZ0ZXIgZGVwZW5kZW5jaWVzIGFyZSBsb2FkZWQgc2hvdWxkCiAgICAgKiByZXR1cm4gYSB2YWx1ZSB0byBkZWZpbmUgdGhlIG1vZHVsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaXJzdCBhcmd1bWVudCdzCiAgICAgKiBuYW1lLgogICAgICovCiAgICBkZWZpbmUgPSBmdW5jdGlvbiAobmFtZSwgZGVwcywgY2FsbGJhY2spIHsKICAgICAgICB2YXIgbm9kZSwgY29udGV4dDsKCiAgICAgICAgLy9BbGxvdyBmb3IgYW5vbnltb3VzIG1vZHVsZXMKICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIC8vQWRqdXN0IGFyZ3MgYXBwcm9wcmlhdGVseQogICAgICAgICAgICBjYWxsYmFjayA9IGRlcHM7CiAgICAgICAgICAgIGRlcHMgPSBuYW1lOwogICAgICAgICAgICBuYW1lID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vVGhpcyBtb2R1bGUgbWF5IG5vdCBoYXZlIGRlcGVuZGVuY2llcwogICAgICAgIGlmICghaXNBcnJheShkZXBzKSkgewogICAgICAgICAgICBjYWxsYmFjayA9IGRlcHM7CiAgICAgICAgICAgIGRlcHMgPSBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy9JZiBubyBuYW1lLCBhbmQgY2FsbGJhY2sgaXMgYSBmdW5jdGlvbiwgdGhlbiBmaWd1cmUgb3V0IGlmIGl0IGEKICAgICAgICAvL0NvbW1vbkpTIHRoaW5nIHdpdGggZGVwZW5kZW5jaWVzLgogICAgICAgIGlmICghZGVwcyAmJiBpc0Z1bmN0aW9uKGNhbGxiYWNrKSkgewogICAgICAgICAgICBkZXBzID0gW107CiAgICAgICAgICAgIC8vUmVtb3ZlIGNvbW1lbnRzIGZyb20gdGhlIGNhbGxiYWNrIHN0cmluZywKICAgICAgICAgICAgLy9sb29rIGZvciByZXF1aXJlIGNhbGxzLCBhbmQgcHVsbCB0aGVtIGludG8gdGhlIGRlcGVuZGVuY2llcywKICAgICAgICAgICAgLy9idXQgb25seSBpZiB0aGVyZSBhcmUgZnVuY3Rpb24gYXJncy4KICAgICAgICAgICAgaWYgKGNhbGxiYWNrLmxlbmd0aCkgewogICAgICAgICAgICAgICAgY2FsbGJhY2sKICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKQogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKGNvbW1lbnRSZWdFeHAsIGNvbW1lbnRSZXBsYWNlKQogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKGNqc1JlcXVpcmVSZWdFeHAsIGZ1bmN0aW9uIChtYXRjaCwgZGVwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMucHVzaChkZXApOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vTWF5IGJlIGEgQ29tbW9uSlMgdGhpbmcgZXZlbiB3aXRob3V0IHJlcXVpcmUgY2FsbHMsIGJ1dCBzdGlsbAogICAgICAgICAgICAgICAgLy9jb3VsZCB1c2UgZXhwb3J0cywgYW5kIG1vZHVsZS4gQXZvaWQgZG9pbmcgZXhwb3J0cyBhbmQgbW9kdWxlCiAgICAgICAgICAgICAgICAvL3dvcmsgdGhvdWdoIGlmIGl0IGp1c3QgbmVlZHMgcmVxdWlyZS4KICAgICAgICAgICAgICAgIC8vUkVRVUlSRVMgdGhlIGZ1bmN0aW9uIHRvIGV4cGVjdCB0aGUgQ29tbW9uSlMgdmFyaWFibGVzIGluIHRoZQogICAgICAgICAgICAgICAgLy9vcmRlciBsaXN0ZWQgYmVsb3cuCiAgICAgICAgICAgICAgICBkZXBzID0gKGNhbGxiYWNrLmxlbmd0aCA9PT0gMSA/IFsncmVxdWlyZSddIDogWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJ10pLmNvbmNhdChkZXBzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy9JZiBpbiBJRSA2LTggYW5kIGhpdCBhbiBhbm9ueW1vdXMgZGVmaW5lKCkgY2FsbCwgZG8gdGhlIGludGVyYWN0aXZlCiAgICAgICAgLy93b3JrLgogICAgICAgIGlmICh1c2VJbnRlcmFjdGl2ZSkgewogICAgICAgICAgICBub2RlID0gY3VycmVudGx5QWRkaW5nU2NyaXB0IHx8IGdldEludGVyYWN0aXZlU2NyaXB0KCk7CiAgICAgICAgICAgIGlmIChub2RlKSB7CiAgICAgICAgICAgICAgICBpZiAoIW5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBuYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVxdWlyZW1vZHVsZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHRzW25vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXJlcXVpcmVjb250ZXh0JyldOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvL0Fsd2F5cyBzYXZlIG9mZiBldmFsdWF0aW5nIHRoZSBkZWYgY2FsbCB1bnRpbCB0aGUgc2NyaXB0IG9ubG9hZCBoYW5kbGVyLgogICAgICAgIC8vVGhpcyBhbGxvd3MgbXVsdGlwbGUgbW9kdWxlcyB0byBiZSBpbiBhIGZpbGUgd2l0aG91dCBwcmVtYXR1cmVseQogICAgICAgIC8vdHJhY2luZyBkZXBlbmRlbmNpZXMsIGFuZCBhbGxvd3MgZm9yIGFub255bW91cyBtb2R1bGUgc3VwcG9ydCwKICAgICAgICAvL3doZXJlIHRoZSBtb2R1bGUgbmFtZSBpcyBub3Qga25vd24gdW50aWwgdGhlIHNjcmlwdCBvbmxvYWQgZXZlbnQKICAgICAgICAvL29jY3Vycy4gSWYgbm8gY29udGV4dCwgdXNlIHRoZSBnbG9iYWwgcXVldWUsIGFuZCBnZXQgaXQgcHJvY2Vzc2VkCiAgICAgICAgLy9pbiB0aGUgb25zY3JpcHQgbG9hZCBjYWxsYmFjay4KICAgICAgICBpZiAoY29udGV4dCkgewogICAgICAgICAgICBjb250ZXh0LmRlZlF1ZXVlLnB1c2goW25hbWUsIGRlcHMsIGNhbGxiYWNrXSk7CiAgICAgICAgICAgIGNvbnRleHQuZGVmUXVldWVNYXBbbmFtZV0gPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdsb2JhbERlZlF1ZXVlLnB1c2goW25hbWUsIGRlcHMsIGNhbGxiYWNrXSk7CiAgICAgICAgfQogICAgfTsKCiAgICBkZWZpbmUuYW1kID0gewogICAgICAgIGpRdWVyeTogdHJ1ZQogICAgfTsKCiAgICAvKioKICAgICAqIEV4ZWN1dGVzIHRoZSB0ZXh0LiBOb3JtYWxseSBqdXN0IHVzZXMgZXZhbCwgYnV0IGNhbiBiZSBtb2RpZmllZAogICAgICogdG8gdXNlIGEgYmV0dGVyLCBlbnZpcm9ubWVudC1zcGVjaWZpYyBjYWxsLiBPbmx5IHVzZWQgZm9yIHRyYW5zcGlsaW5nCiAgICAgKiBsb2FkZXIgcGx1Z2lucywgbm90IGZvciBwbGFpbiBKUyBtb2R1bGVzLgogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgdGhlIHRleHQgdG8gZXhlY3V0ZS9ldmFsdWF0ZS4KICAgICAqLwogICAgcmVxLmV4ZWMgPSBmdW5jdGlvbiAodGV4dCkgewogICAgICAgIC8qanNsaW50IGV2aWw6IHRydWUgKi8KICAgICAgICByZXR1cm4gZXZhbCh0ZXh0KTsKICAgIH07CgogICAgLy9TZXQgdXAgd2l0aCBjb25maWcgaW5mby4KICAgIHJlcShjZmcpOwp9KHRoaXMsICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBzZXRUaW1lb3V0KSkpOwoKLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8KLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLy8gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAovLwovLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgohZnVuY3Rpb24oKXt2YXIgYT17fSxiPXt9LGM9e307IWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtpZigibnVtYmVyIj09dHlwZW9mIGEpcmV0dXJuIGE7dmFyIGI9e307Zm9yKHZhciBjIGluIGEpYltjXT1hW2NdO3JldHVybiBifWZ1bmN0aW9uIGQoKXt0aGlzLl9kZWxheT0wLHRoaXMuX2VuZERlbGF5PTAsdGhpcy5fZmlsbD0ibm9uZSIsdGhpcy5faXRlcmF0aW9uU3RhcnQ9MCx0aGlzLl9pdGVyYXRpb25zPTEsdGhpcy5fZHVyYXRpb249MCx0aGlzLl9wbGF5YmFja1JhdGU9MSx0aGlzLl9kaXJlY3Rpb249Im5vcm1hbCIsdGhpcy5fZWFzaW5nPSJsaW5lYXIiLHRoaXMuX2Vhc2luZ0Z1bmN0aW9uPXh9ZnVuY3Rpb24gZSgpe3JldHVybiBhLmlzRGVwcmVjYXRlZCgiSW52YWxpZCB0aW1pbmcgaW5wdXRzIiwiMjAxNi0wMy0wMiIsIlR5cGVFcnJvciBleGNlcHRpb25zIHdpbGwgYmUgdGhyb3duIGluc3RlYWQuIiwhMCl9ZnVuY3Rpb24gZihiLGMsZSl7dmFyIGY9bmV3IGQ7cmV0dXJuIGMmJihmLmZpbGw9ImJvdGgiLGYuZHVyYXRpb249ImF1dG8iKSwibnVtYmVyIiE9dHlwZW9mIGJ8fGlzTmFOKGIpP3ZvaWQgMCE9PWImJk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGIpLmZvckVhY2goZnVuY3Rpb24oYyl7aWYoImF1dG8iIT1iW2NdKXtpZigoIm51bWJlciI9PXR5cGVvZiBmW2NdfHwiZHVyYXRpb24iPT1jKSYmKCJudW1iZXIiIT10eXBlb2YgYltjXXx8aXNOYU4oYltjXSkpKXJldHVybjtpZigiZmlsbCI9PWMmJi0xPT12LmluZGV4T2YoYltjXSkpcmV0dXJuO2lmKCJkaXJlY3Rpb24iPT1jJiYtMT09dy5pbmRleE9mKGJbY10pKXJldHVybjtpZigicGxheWJhY2tSYXRlIj09YyYmMSE9PWJbY10mJmEuaXNEZXByZWNhdGVkKCJBbmltYXRpb25FZmZlY3RUaW1pbmcucGxheWJhY2tSYXRlIiwiMjAxNC0xMS0yOCIsIlVzZSBBbmltYXRpb24ucGxheWJhY2tSYXRlIGluc3RlYWQuIikpcmV0dXJuO2ZbY109YltjXX19KTpmLmR1cmF0aW9uPWIsZn1mdW5jdGlvbiBnKGEpe3JldHVybiJudW1iZXIiPT10eXBlb2YgYSYmKGE9aXNOYU4oYSk/e2R1cmF0aW9uOjB9OntkdXJhdGlvbjphfSksYX1mdW5jdGlvbiBoKGIsYyl7cmV0dXJuIGI9YS5udW1lcmljVGltaW5nVG9PYmplY3QoYiksZihiLGMpfWZ1bmN0aW9uIGkoYSxiLGMsZCl7cmV0dXJuIGE8MHx8YT4xfHxjPDB8fGM+MT94OmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGYoYSxiLGMpe3JldHVybiAzKmEqKDEtYykqKDEtYykqYyszKmIqKDEtYykqYypjK2MqYypjfWlmKGU8PTApe3ZhciBnPTA7cmV0dXJuIGE+MD9nPWIvYTohYiYmYz4wJiYoZz1kL2MpLGcqZX1pZihlPj0xKXt2YXIgaD0wO3JldHVybiBjPDE/aD0oZC0xKS8oYy0xKToxPT1jJiZhPDEmJihoPShiLTEpLyhhLTEpKSwxK2gqKGUtMSl9Zm9yKHZhciBpPTAsaj0xO2k8ajspe3ZhciBrPShpK2opLzIsbD1mKGEsYyxrKTtpZihNYXRoLmFicyhlLWwpPDFlLTUpcmV0dXJuIGYoYixkLGspO2w8ZT9pPWs6aj1rfXJldHVybiBmKGIsZCxrKX19ZnVuY3Rpb24gaihhLGIpe3JldHVybiBmdW5jdGlvbihjKXtpZihjPj0xKXJldHVybiAxO3ZhciBkPTEvYTtyZXR1cm4oYys9YipkKS1jJWR9fWZ1bmN0aW9uIGsoYSl7Q3x8KEM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUpLEMuYW5pbWF0aW9uVGltaW5nRnVuY3Rpb249IiIsQy5hbmltYXRpb25UaW1pbmdGdW5jdGlvbj1hO3ZhciBiPUMuYW5pbWF0aW9uVGltaW5nRnVuY3Rpb247aWYoIiI9PWImJmUoKSl0aHJvdyBuZXcgVHlwZUVycm9yKGErIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgZWFzaW5nIik7cmV0dXJuIGJ9ZnVuY3Rpb24gbChhKXtpZigibGluZWFyIj09YSlyZXR1cm4geDt2YXIgYj1FLmV4ZWMoYSk7aWYoYilyZXR1cm4gaS5hcHBseSh0aGlzLGIuc2xpY2UoMSkubWFwKE51bWJlcikpO3ZhciBjPUYuZXhlYyhhKTtpZihjKXJldHVybiBqKE51bWJlcihjWzFdKSxBKTt2YXIgZD1HLmV4ZWMoYSk7cmV0dXJuIGQ/aihOdW1iZXIoZFsxXSkse3N0YXJ0OnksbWlkZGxlOnosZW5kOkF9W2RbMl1dKTpCW2FdfHx4fWZ1bmN0aW9uIG0oYSl7cmV0dXJuIE1hdGguYWJzKG4oYSkvYS5wbGF5YmFja1JhdGUpfWZ1bmN0aW9uIG4oYSl7cmV0dXJuIDA9PT1hLmR1cmF0aW9ufHwwPT09YS5pdGVyYXRpb25zPzA6YS5kdXJhdGlvbiphLml0ZXJhdGlvbnN9ZnVuY3Rpb24gbyhhLGIsYyl7aWYobnVsbD09YilyZXR1cm4gSDt2YXIgZD1jLmRlbGF5K2ErYy5lbmREZWxheTtyZXR1cm4gYjxNYXRoLm1pbihjLmRlbGF5LGQpP0k6Yj49TWF0aC5taW4oYy5kZWxheSthLGQpP0o6S31mdW5jdGlvbiBwKGEsYixjLGQsZSl7c3dpdGNoKGQpe2Nhc2UgSTpyZXR1cm4iYmFja3dhcmRzIj09Ynx8ImJvdGgiPT1iPzA6bnVsbDtjYXNlIEs6cmV0dXJuIGMtZTtjYXNlIEo6cmV0dXJuImZvcndhcmRzIj09Ynx8ImJvdGgiPT1iP2E6bnVsbDtjYXNlIEg6cmV0dXJuIG51bGx9fWZ1bmN0aW9uIHEoYSxiLGMsZCxlKXt2YXIgZj1lO3JldHVybiAwPT09YT9iIT09SSYmKGYrPWMpOmYrPWQvYSxmfWZ1bmN0aW9uIHIoYSxiLGMsZCxlLGYpe3ZhciBnPWE9PT0xLzA/YiUxOmElMTtyZXR1cm4gMCE9PWd8fGMhPT1KfHwwPT09ZHx8MD09PWUmJjAhPT1mfHwoZz0xKSxnfWZ1bmN0aW9uIHMoYSxiLGMsZCl7cmV0dXJuIGE9PT1KJiZiPT09MS8wPzEvMDoxPT09Yz9NYXRoLmZsb29yKGQpLTE6TWF0aC5mbG9vcihkKX1mdW5jdGlvbiB0KGEsYixjKXt2YXIgZD1hO2lmKCJub3JtYWwiIT09YSYmInJldmVyc2UiIT09YSl7dmFyIGU9YjsiYWx0ZXJuYXRlLXJldmVyc2UiPT09YSYmKGUrPTEpLGQ9Im5vcm1hbCIsZSE9PTEvMCYmZSUyIT0wJiYoZD0icmV2ZXJzZSIpfXJldHVybiJub3JtYWwiPT09ZD9jOjEtY31mdW5jdGlvbiB1KGEsYixjKXt2YXIgZD1vKGEsYixjKSxlPXAoYSxjLmZpbGwsYixkLGMuZGVsYXkpO2lmKG51bGw9PT1lKXJldHVybiBudWxsO3ZhciBmPXEoYy5kdXJhdGlvbixkLGMuaXRlcmF0aW9ucyxlLGMuaXRlcmF0aW9uU3RhcnQpLGc9cihmLGMuaXRlcmF0aW9uU3RhcnQsZCxjLml0ZXJhdGlvbnMsZSxjLmR1cmF0aW9uKSxoPXMoZCxjLml0ZXJhdGlvbnMsZyxmKSxpPXQoYy5kaXJlY3Rpb24saCxnKTtyZXR1cm4gYy5fZWFzaW5nRnVuY3Rpb24oaSl9dmFyIHY9ImJhY2t3YXJkc3xmb3J3YXJkc3xib3RofG5vbmUiLnNwbGl0KCJ8Iiksdz0icmV2ZXJzZXxhbHRlcm5hdGV8YWx0ZXJuYXRlLXJldmVyc2UiLnNwbGl0KCJ8IikseD1mdW5jdGlvbihhKXtyZXR1cm4gYX07ZC5wcm90b3R5cGU9e19zZXRNZW1iZXI6ZnVuY3Rpb24oYixjKXt0aGlzWyJfIitiXT1jLHRoaXMuX2VmZmVjdCYmKHRoaXMuX2VmZmVjdC5fdGltaW5nSW5wdXRbYl09Yyx0aGlzLl9lZmZlY3QuX3RpbWluZz1hLm5vcm1hbGl6ZVRpbWluZ0lucHV0KHRoaXMuX2VmZmVjdC5fdGltaW5nSW5wdXQpLHRoaXMuX2VmZmVjdC5hY3RpdmVEdXJhdGlvbj1hLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKHRoaXMuX2VmZmVjdC5fdGltaW5nKSx0aGlzLl9lZmZlY3QuX2FuaW1hdGlvbiYmdGhpcy5fZWZmZWN0Ll9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCkpfSxnZXQgcGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMuX3BsYXliYWNrUmF0ZX0sc2V0IGRlbGF5KGEpe3RoaXMuX3NldE1lbWJlcigiZGVsYXkiLGEpfSxnZXQgZGVsYXkoKXtyZXR1cm4gdGhpcy5fZGVsYXl9LHNldCBlbmREZWxheShhKXt0aGlzLl9zZXRNZW1iZXIoImVuZERlbGF5IixhKX0sZ2V0IGVuZERlbGF5KCl7cmV0dXJuIHRoaXMuX2VuZERlbGF5fSxzZXQgZmlsbChhKXt0aGlzLl9zZXRNZW1iZXIoImZpbGwiLGEpfSxnZXQgZmlsbCgpe3JldHVybiB0aGlzLl9maWxsfSxzZXQgaXRlcmF0aW9uU3RhcnQoYSl7aWYoKGlzTmFOKGEpfHxhPDApJiZlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaXRlcmF0aW9uU3RhcnQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIsIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiaXRlcmF0aW9uU3RhcnQiLGEpfSxnZXQgaXRlcmF0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy5faXRlcmF0aW9uU3RhcnR9LHNldCBkdXJhdGlvbihhKXtpZigiYXV0byIhPWEmJihpc05hTihhKXx8YTwwKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoImR1cmF0aW9uIG11c3QgYmUgbm9uLW5lZ2F0aXZlIG9yIGF1dG8sIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiZHVyYXRpb24iLGEpfSxnZXQgZHVyYXRpb24oKXtyZXR1cm4gdGhpcy5fZHVyYXRpb259LHNldCBkaXJlY3Rpb24oYSl7dGhpcy5fc2V0TWVtYmVyKCJkaXJlY3Rpb24iLGEpfSxnZXQgZGlyZWN0aW9uKCl7cmV0dXJuIHRoaXMuX2RpcmVjdGlvbn0sc2V0IGVhc2luZyhhKXt0aGlzLl9lYXNpbmdGdW5jdGlvbj1sKGsoYSkpLHRoaXMuX3NldE1lbWJlcigiZWFzaW5nIixhKX0sZ2V0IGVhc2luZygpe3JldHVybiB0aGlzLl9lYXNpbmd9LHNldCBpdGVyYXRpb25zKGEpe2lmKChpc05hTihhKXx8YTwwKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIml0ZXJhdGlvbnMgbXVzdCBiZSBub24tbmVnYXRpdmUsIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiaXRlcmF0aW9ucyIsYSl9LGdldCBpdGVyYXRpb25zKCl7cmV0dXJuIHRoaXMuX2l0ZXJhdGlvbnN9fTt2YXIgeT0xLHo9LjUsQT0wLEI9e2Vhc2U6aSguMjUsLjEsLjI1LDEpLCJlYXNlLWluIjppKC40MiwwLDEsMSksImVhc2Utb3V0IjppKDAsMCwuNTgsMSksImVhc2UtaW4tb3V0IjppKC40MiwwLC41OCwxKSwic3RlcC1zdGFydCI6aigxLHkpLCJzdGVwLW1pZGRsZSI6aigxLHopLCJzdGVwLWVuZCI6aigxLEEpfSxDPW51bGwsRD0iXFxzKigtP1xcZCtcXC4/XFxkKnwtP1xcLlxcZCspXFxzKiIsRT1uZXcgUmVnRXhwKCJjdWJpYy1iZXppZXJcXCgiK0QrIiwiK0QrIiwiK0QrIiwiK0QrIlxcKSIpLEY9L3N0ZXBzXChccyooXGQrKVxzKlwpLyxHPS9zdGVwc1woXHMqKFxkKylccyosXHMqKHN0YXJ0fG1pZGRsZXxlbmQpXHMqXCkvLEg9MCxJPTEsSj0yLEs9MzthLmNsb25lVGltaW5nSW5wdXQ9YyxhLm1ha2VUaW1pbmc9ZixhLm51bWVyaWNUaW1pbmdUb09iamVjdD1nLGEubm9ybWFsaXplVGltaW5nSW5wdXQ9aCxhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uPW0sYS5jYWxjdWxhdGVJdGVyYXRpb25Qcm9ncmVzcz11LGEuY2FsY3VsYXRlUGhhc2U9byxhLm5vcm1hbGl6ZUVhc2luZz1rLGEucGFyc2VFYXNpbmdGdW5jdGlvbj1sfShhKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYSBpbiBrP2tbYV1bYl18fGI6Yn1mdW5jdGlvbiBkKGEpe3JldHVybiJkaXNwbGF5Ij09PWF8fDA9PT1hLmxhc3RJbmRleE9mKCJhbmltYXRpb24iLDApfHwwPT09YS5sYXN0SW5kZXhPZigidHJhbnNpdGlvbiIsMCl9ZnVuY3Rpb24gZShhLGIsZSl7aWYoIWQoYSkpe3ZhciBmPWhbYV07aWYoZil7aS5zdHlsZVthXT1iO2Zvcih2YXIgZyBpbiBmKXt2YXIgaj1mW2ddLGs9aS5zdHlsZVtqXTtlW2pdPWMoaixrKX19ZWxzZSBlW2FdPWMoYSxiKX19ZnVuY3Rpb24gZihhKXt2YXIgYj1bXTtmb3IodmFyIGMgaW4gYSlpZighKGMgaW5bImVhc2luZyIsIm9mZnNldCIsImNvbXBvc2l0ZSJdKSl7dmFyIGQ9YVtjXTtBcnJheS5pc0FycmF5KGQpfHwoZD1bZF0pO2Zvcih2YXIgZSxmPWQubGVuZ3RoLGc9MDtnPGY7ZysrKWU9e30sZS5vZmZzZXQ9Im9mZnNldCJpbiBhP2Eub2Zmc2V0OjE9PWY/MTpnLyhmLTEpLCJlYXNpbmciaW4gYSYmKGUuZWFzaW5nPWEuZWFzaW5nKSwiY29tcG9zaXRlImluIGEmJihlLmNvbXBvc2l0ZT1hLmNvbXBvc2l0ZSksZVtjXT1kW2ddLGIucHVzaChlKX1yZXR1cm4gYi5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEub2Zmc2V0LWIub2Zmc2V0fSksYn1mdW5jdGlvbiBnKGIpe2Z1bmN0aW9uIGMoKXt2YXIgYT1kLmxlbmd0aDtudWxsPT1kW2EtMV0ub2Zmc2V0JiYoZFthLTFdLm9mZnNldD0xKSxhPjEmJm51bGw9PWRbMF0ub2Zmc2V0JiYoZFswXS5vZmZzZXQ9MCk7Zm9yKHZhciBiPTAsYz1kWzBdLm9mZnNldCxlPTE7ZTxhO2UrKyl7dmFyIGY9ZFtlXS5vZmZzZXQ7aWYobnVsbCE9Zil7Zm9yKHZhciBnPTE7ZzxlLWI7ZysrKWRbYitnXS5vZmZzZXQ9YysoZi1jKSpnLyhlLWIpO2I9ZSxjPWZ9fX1pZihudWxsPT1iKXJldHVybltdO3dpbmRvdy5TeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmQXJyYXkucHJvdG90eXBlLmZyb20mJmJbU3ltYm9sLml0ZXJhdG9yXSYmKGI9QXJyYXkuZnJvbShiKSksQXJyYXkuaXNBcnJheShiKXx8KGI9ZihiKSk7Zm9yKHZhciBkPWIubWFwKGZ1bmN0aW9uKGIpe3ZhciBjPXt9O2Zvcih2YXIgZCBpbiBiKXt2YXIgZj1iW2RdO2lmKCJvZmZzZXQiPT1kKXtpZihudWxsIT1mKXtpZihmPU51bWJlcihmKSwhaXNGaW5pdGUoZikpdGhyb3cgbmV3IFR5cGVFcnJvcigiS2V5ZnJhbWUgb2Zmc2V0cyBtdXN0IGJlIG51bWJlcnMuIik7aWYoZjwwfHxmPjEpdGhyb3cgbmV3IFR5cGVFcnJvcigiS2V5ZnJhbWUgb2Zmc2V0cyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMS4iKX19ZWxzZSBpZigiY29tcG9zaXRlIj09ZCl7aWYoImFkZCI9PWZ8fCJhY2N1bXVsYXRlIj09Zil0aHJvd3t0eXBlOkRPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUixuYW1lOiJOb3RTdXBwb3J0ZWRFcnJvciIsbWVzc2FnZToiYWRkIGNvbXBvc2l0aW5nIGlzIG5vdCBzdXBwb3J0ZWQifTtpZigicmVwbGFjZSIhPWYpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBjb21wb3NpdGUgbW9kZSAiK2YrIi4iKX1lbHNlIGY9ImVhc2luZyI9PWQ/YS5ub3JtYWxpemVFYXNpbmcoZik6IiIrZjtlKGQsZixjKX1yZXR1cm4gdm9pZCAwPT1jLm9mZnNldCYmKGMub2Zmc2V0PW51bGwpLHZvaWQgMD09Yy5lYXNpbmcmJihjLmVhc2luZz0ibGluZWFyIiksY30pLGc9ITAsaD0tMS8wLGk9MDtpPGQubGVuZ3RoO2krKyl7dmFyIGo9ZFtpXS5vZmZzZXQ7aWYobnVsbCE9ail7aWYoajxoKXRocm93IG5ldyBUeXBlRXJyb3IoIktleWZyYW1lcyBhcmUgbm90IGxvb3NlbHkgc29ydGVkIGJ5IG9mZnNldC4gU29ydCBvciBzcGVjaWZ5IG9mZnNldHMuIik7aD1qfWVsc2UgZz0hMX1yZXR1cm4gZD1kLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXQ+PTAmJmEub2Zmc2V0PD0xfSksZ3x8YygpLGR9dmFyIGg9e2JhY2tncm91bmQ6WyJiYWNrZ3JvdW5kSW1hZ2UiLCJiYWNrZ3JvdW5kUG9zaXRpb24iLCJiYWNrZ3JvdW5kU2l6ZSIsImJhY2tncm91bmRSZXBlYXQiLCJiYWNrZ3JvdW5kQXR0YWNobWVudCIsImJhY2tncm91bmRPcmlnaW4iLCJiYWNrZ3JvdW5kQ2xpcCIsImJhY2tncm91bmRDb2xvciJdLGJvcmRlcjpbImJvcmRlclRvcENvbG9yIiwiYm9yZGVyVG9wU3R5bGUiLCJib3JkZXJUb3BXaWR0aCIsImJvcmRlclJpZ2h0Q29sb3IiLCJib3JkZXJSaWdodFN0eWxlIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbUNvbG9yIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21XaWR0aCIsImJvcmRlckxlZnRDb2xvciIsImJvcmRlckxlZnRTdHlsZSIsImJvcmRlckxlZnRXaWR0aCJdLGJvcmRlckJvdHRvbTpbImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21Db2xvciJdLGJvcmRlckNvbG9yOlsiYm9yZGVyVG9wQ29sb3IiLCJib3JkZXJSaWdodENvbG9yIiwiYm9yZGVyQm90dG9tQ29sb3IiLCJib3JkZXJMZWZ0Q29sb3IiXSxib3JkZXJMZWZ0OlsiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyTGVmdFN0eWxlIiwiYm9yZGVyTGVmdENvbG9yIl0sYm9yZGVyUmFkaXVzOlsiYm9yZGVyVG9wTGVmdFJhZGl1cyIsImJvcmRlclRvcFJpZ2h0UmFkaXVzIiwiYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMiLCJib3JkZXJCb3R0b21MZWZ0UmFkaXVzIl0sYm9yZGVyUmlnaHQ6WyJib3JkZXJSaWdodFdpZHRoIiwiYm9yZGVyUmlnaHRTdHlsZSIsImJvcmRlclJpZ2h0Q29sb3IiXSxib3JkZXJUb3A6WyJib3JkZXJUb3BXaWR0aCIsImJvcmRlclRvcFN0eWxlIiwiYm9yZGVyVG9wQ29sb3IiXSxib3JkZXJXaWR0aDpbImJvcmRlclRvcFdpZHRoIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyTGVmdFdpZHRoIl0sZmxleDpbImZsZXhHcm93IiwiZmxleFNocmluayIsImZsZXhCYXNpcyJdLGZvbnQ6WyJmb250RmFtaWx5IiwiZm9udFNpemUiLCJmb250U3R5bGUiLCJmb250VmFyaWFudCIsImZvbnRXZWlnaHQiLCJsaW5lSGVpZ2h0Il0sbWFyZ2luOlsibWFyZ2luVG9wIiwibWFyZ2luUmlnaHQiLCJtYXJnaW5Cb3R0b20iLCJtYXJnaW5MZWZ0Il0sb3V0bGluZTpbIm91dGxpbmVDb2xvciIsIm91dGxpbmVTdHlsZSIsIm91dGxpbmVXaWR0aCJdLHBhZGRpbmc6WyJwYWRkaW5nVG9wIiwicGFkZGluZ1JpZ2h0IiwicGFkZGluZ0JvdHRvbSIsInBhZGRpbmdMZWZ0Il19LGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiZGl2Iiksaj17dGhpbjoiMXB4IixtZWRpdW06IjNweCIsdGhpY2s6IjVweCJ9LGs9e2JvcmRlckJvdHRvbVdpZHRoOmosYm9yZGVyTGVmdFdpZHRoOmosYm9yZGVyUmlnaHRXaWR0aDpqLGJvcmRlclRvcFdpZHRoOmosZm9udFNpemU6eyJ4eC1zbWFsbCI6IjYwJSIsIngtc21hbGwiOiI3NSUiLHNtYWxsOiI4OSUiLG1lZGl1bToiMTAwJSIsbGFyZ2U6IjEyMCUiLCJ4LWxhcmdlIjoiMTUwJSIsInh4LWxhcmdlIjoiMjAwJSJ9LGZvbnRXZWlnaHQ6e25vcm1hbDoiNDAwIixib2xkOiI3MDAifSxvdXRsaW5lV2lkdGg6aix0ZXh0U2hhZG93Ontub25lOiIwcHggMHB4IDBweCB0cmFuc3BhcmVudCJ9LGJveFNoYWRvdzp7bm9uZToiMHB4IDBweCAwcHggMHB4IHRyYW5zcGFyZW50In19O2EuY29udmVydFRvQXJyYXlGb3JtPWYsYS5ub3JtYWxpemVLZXlmcmFtZXM9Z30oYSksZnVuY3Rpb24oYSl7dmFyIGI9e307YS5pc0RlcHJlY2F0ZWQ9ZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGY9ZT8iYXJlIjoiaXMiLGc9bmV3IERhdGUsaD1uZXcgRGF0ZShjKTtyZXR1cm4gaC5zZXRNb250aChoLmdldE1vbnRoKCkrMyksIShnPGgmJihhIGluIGJ8fGNvbnNvbGUud2FybigiV2ViIEFuaW1hdGlvbnM6ICIrYSsiICIrZisiIGRlcHJlY2F0ZWQgYW5kIHdpbGwgc3RvcCB3b3JraW5nIG9uICIraC50b0RhdGVTdHJpbmcoKSsiLiAiK2QpLGJbYV09ITAsMSkpfSxhLmRlcHJlY2F0ZWQ9ZnVuY3Rpb24oYixjLGQsZSl7dmFyIGY9ZT8iYXJlIjoiaXMiO2lmKGEuaXNEZXByZWNhdGVkKGIsYyxkLGUpKXRocm93IG5ldyBFcnJvcihiKyIgIitmKyIgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gIitkKX19KGEpLGZ1bmN0aW9uKCl7aWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFuaW1hdGUpe3ZhciBjPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hbmltYXRlKFtdLDApLGQ9ITA7aWYoYyYmKGQ9ITEsInBsYXl8Y3VycmVudFRpbWV8cGF1c2V8cmV2ZXJzZXxwbGF5YmFja1JhdGV8Y2FuY2VsfGZpbmlzaHxzdGFydFRpbWV8cGxheVN0YXRlIi5zcGxpdCgifCIpLmZvckVhY2goZnVuY3Rpb24oYSl7dm9pZCAwPT09Y1thXSYmKGQ9ITApfSkpLCFkKXJldHVybn0hZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7Zm9yKHZhciBiPXt9LGM9MDtjPGEubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYVtjXSlpZigib2Zmc2V0IiE9ZCYmImVhc2luZyIhPWQmJiJjb21wb3NpdGUiIT1kKXt2YXIgZT17b2Zmc2V0OmFbY10ub2Zmc2V0LGVhc2luZzphW2NdLmVhc2luZyx2YWx1ZTphW2NdW2RdfTtiW2RdPWJbZF18fFtdLGJbZF0ucHVzaChlKX1mb3IodmFyIGYgaW4gYil7dmFyIGc9YltmXTtpZigwIT1nWzBdLm9mZnNldHx8MSE9Z1tnLmxlbmd0aC0xXS5vZmZzZXQpdGhyb3d7dHlwZTpET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsbmFtZToiTm90U3VwcG9ydGVkRXJyb3IiLG1lc3NhZ2U6IlBhcnRpYWwga2V5ZnJhbWVzIGFyZSBub3Qgc3VwcG9ydGVkIn19cmV0dXJuIGJ9ZnVuY3Rpb24gZShjKXt2YXIgZD1bXTtmb3IodmFyIGUgaW4gYylmb3IodmFyIGY9Y1tlXSxnPTA7ZzxmLmxlbmd0aC0xO2crKyl7dmFyIGg9ZyxpPWcrMSxqPWZbaF0ub2Zmc2V0LGs9ZltpXS5vZmZzZXQsbD1qLG09azswPT1nJiYobD0tMS8wLDA9PWsmJihpPWgpKSxnPT1mLmxlbmd0aC0yJiYobT0xLzAsMT09aiYmKGg9aSkpLGQucHVzaCh7YXBwbHlGcm9tOmwsYXBwbHlUbzptLHN0YXJ0T2Zmc2V0OmZbaF0ub2Zmc2V0LGVuZE9mZnNldDpmW2ldLm9mZnNldCxlYXNpbmdGdW5jdGlvbjphLnBhcnNlRWFzaW5nRnVuY3Rpb24oZltoXS5lYXNpbmcpLHByb3BlcnR5OmUsaW50ZXJwb2xhdGlvbjpiLnByb3BlcnR5SW50ZXJwb2xhdGlvbihlLGZbaF0udmFsdWUsZltpXS52YWx1ZSl9KX1yZXR1cm4gZC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3RhcnRPZmZzZXQtYi5zdGFydE9mZnNldH0pLGR9Yi5jb252ZXJ0RWZmZWN0SW5wdXQ9ZnVuY3Rpb24oYyl7dmFyIGY9YS5ub3JtYWxpemVLZXlmcmFtZXMoYyksZz1kKGYpLGg9ZShnKTtyZXR1cm4gZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWguZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBjPj1hLmFwcGx5RnJvbSYmYzxhLmFwcGx5VG99KS5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPWMtZC5zdGFydE9mZnNldCxmPWQuZW5kT2Zmc2V0LWQuc3RhcnRPZmZzZXQsZz0wPT1mPzA6ZC5lYXNpbmdGdW5jdGlvbihlL2YpO2IuYXBwbHkoYSxkLnByb3BlcnR5LGQuaW50ZXJwb2xhdGlvbihnKSl9KTtlbHNlIGZvcih2YXIgZCBpbiBnKSJvZmZzZXQiIT1kJiYiZWFzaW5nIiE9ZCYmImNvbXBvc2l0ZSIhPWQmJmIuY2xlYXIoYSxkKX19fShhLGIpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3JldHVybiBhLnJlcGxhY2UoLy0oLikvZyxmdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9KX1mdW5jdGlvbiBlKGEsYixjKXtoW2NdPWhbY118fFtdLGhbY10ucHVzaChbYSxiXSl9ZnVuY3Rpb24gZihhLGIsYyl7Zm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspe2UoYSxiLGQoY1tmXSkpfX1mdW5jdGlvbiBnKGMsZSxmKXt2YXIgZz1jOy8tLy50ZXN0KGMpJiYhYS5pc0RlcHJlY2F0ZWQoIkh5cGhlbmF0ZWQgcHJvcGVydHkgbmFtZXMiLCIyMDE2LTAzLTIyIiwiVXNlIGNhbWVsQ2FzZSBpbnN0ZWFkLiIsITApJiYoZz1kKGMpKSwiaW5pdGlhbCIhPWUmJiJpbml0aWFsIiE9Znx8KCJpbml0aWFsIj09ZSYmKGU9aVtnXSksImluaXRpYWwiPT1mJiYoZj1pW2ddKSk7Zm9yKHZhciBqPWU9PWY/W106aFtnXSxrPTA7aiYmazxqLmxlbmd0aDtrKyspe3ZhciBsPWpba11bMF0oZSksbT1qW2tdWzBdKGYpO2lmKHZvaWQgMCE9PWwmJnZvaWQgMCE9PW0pe3ZhciBuPWpba11bMV0obCxtKTtpZihuKXt2YXIgbz1iLkludGVycG9sYXRpb24uYXBwbHkobnVsbCxuKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIDA9PWE/ZToxPT1hP2Y6byhhKX19fX1yZXR1cm4gYi5JbnRlcnBvbGF0aW9uKCExLCEwLGZ1bmN0aW9uKGEpe3JldHVybiBhP2Y6ZX0pfXZhciBoPXt9O2IuYWRkUHJvcGVydGllc0hhbmRsZXI9Zjt2YXIgaT17YmFja2dyb3VuZENvbG9yOiJ0cmFuc3BhcmVudCIsYmFja2dyb3VuZFBvc2l0aW9uOiIwJSAwJSIsYm9yZGVyQm90dG9tQ29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyQm90dG9tTGVmdFJhZGl1czoiMHB4Iixib3JkZXJCb3R0b21SaWdodFJhZGl1czoiMHB4Iixib3JkZXJCb3R0b21XaWR0aDoiM3B4Iixib3JkZXJMZWZ0Q29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyTGVmdFdpZHRoOiIzcHgiLGJvcmRlclJpZ2h0Q29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyUmlnaHRXaWR0aDoiM3B4Iixib3JkZXJTcGFjaW5nOiIycHgiLGJvcmRlclRvcENvbG9yOiJjdXJyZW50Q29sb3IiLGJvcmRlclRvcExlZnRSYWRpdXM6IjBweCIsYm9yZGVyVG9wUmlnaHRSYWRpdXM6IjBweCIsYm9yZGVyVG9wV2lkdGg6IjNweCIsYm90dG9tOiJhdXRvIixjbGlwOiJyZWN0KDBweCwgMHB4LCAwcHgsIDBweCkiLGNvbG9yOiJibGFjayIsZm9udFNpemU6IjEwMCUiLGZvbnRXZWlnaHQ6IjQwMCIsaGVpZ2h0OiJhdXRvIixsZWZ0OiJhdXRvIixsZXR0ZXJTcGFjaW5nOiJub3JtYWwiLGxpbmVIZWlnaHQ6IjEyMCUiLG1hcmdpbkJvdHRvbToiMHB4IixtYXJnaW5MZWZ0OiIwcHgiLG1hcmdpblJpZ2h0OiIwcHgiLG1hcmdpblRvcDoiMHB4IixtYXhIZWlnaHQ6Im5vbmUiLG1heFdpZHRoOiJub25lIixtaW5IZWlnaHQ6IjBweCIsbWluV2lkdGg6IjBweCIsb3BhY2l0eToiMS4wIixvdXRsaW5lQ29sb3I6ImludmVydCIsb3V0bGluZU9mZnNldDoiMHB4IixvdXRsaW5lV2lkdGg6IjNweCIscGFkZGluZ0JvdHRvbToiMHB4IixwYWRkaW5nTGVmdDoiMHB4IixwYWRkaW5nUmlnaHQ6IjBweCIscGFkZGluZ1RvcDoiMHB4IixyaWdodDoiYXV0byIsc3Ryb2tlRGFzaGFycmF5OiJub25lIixzdHJva2VEYXNob2Zmc2V0OiIwcHgiLHRleHRJbmRlbnQ6IjBweCIsdGV4dFNoYWRvdzoiMHB4IDBweCAwcHggdHJhbnNwYXJlbnQiLHRvcDoiYXV0byIsdHJhbnNmb3JtOiIiLHZlcnRpY2FsQWxpZ246IjBweCIsdmlzaWJpbGl0eToidmlzaWJsZSIsd2lkdGg6ImF1dG8iLHdvcmRTcGFjaW5nOiJub3JtYWwiLHpJbmRleDoiYXV0byJ9O2IucHJvcGVydHlJbnRlcnBvbGF0aW9uPWd9KGEsYiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYil7dmFyIGM9YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihiKSxkPWZ1bmN0aW9uKGQpe3JldHVybiBhLmNhbGN1bGF0ZUl0ZXJhdGlvblByb2dyZXNzKGMsZCxiKX07cmV0dXJuIGQuX3RvdGFsRHVyYXRpb249Yi5kZWxheStjK2IuZW5kRGVsYXksZH1iLktleWZyYW1lRWZmZWN0PWZ1bmN0aW9uKGMsZSxmLGcpe3ZhciBoLGk9ZChhLm5vcm1hbGl6ZVRpbWluZ0lucHV0KGYpKSxqPWIuY29udmVydEVmZmVjdElucHV0KGUpLGs9ZnVuY3Rpb24oKXtqKGMsaCl9O3JldHVybiBrLl91cGRhdGU9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPT0oaD1pKGEpKX0say5fY2xlYXI9ZnVuY3Rpb24oKXtqKGMsbnVsbCl9LGsuX2hhc1NhbWVUYXJnZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGM9PT1hfSxrLl90YXJnZXQ9YyxrLl90b3RhbER1cmF0aW9uPWkuX3RvdGFsRHVyYXRpb24say5faWQ9ZyxrfX0oYSxiKSxmdW5jdGlvbihhLGIpe2EuYXBwbHk9ZnVuY3Rpb24oYixjLGQpe2Iuc3R5bGVbYS5wcm9wZXJ0eU5hbWUoYyldPWR9LGEuY2xlYXI9ZnVuY3Rpb24oYixjKXtiLnN0eWxlW2EucHJvcGVydHlOYW1lKGMpXT0iIn19KGIpLGZ1bmN0aW9uKGEpe3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9IiI7cmV0dXJuIGMmJmMuaWQmJihkPWMuaWQpLGEudGltZWxpbmUuX3BsYXkoYS5LZXlmcmFtZUVmZmVjdCh0aGlzLGIsYyxkKSl9fShiKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiLGQpe2lmKCJudW1iZXIiPT10eXBlb2YgYSYmIm51bWJlciI9PXR5cGVvZiBiKXJldHVybiBhKigxLWQpK2IqZDtpZigiYm9vbGVhbiI9PXR5cGVvZiBhJiYiYm9vbGVhbiI9PXR5cGVvZiBiKXJldHVybiBkPC41P2E6YjtpZihhLmxlbmd0aD09Yi5sZW5ndGgpe2Zvcih2YXIgZT1bXSxmPTA7ZjxhLmxlbmd0aDtmKyspZS5wdXNoKGMoYVtmXSxiW2ZdLGQpKTtyZXR1cm4gZX10aHJvdyJNaXNtYXRjaGVkIGludGVycG9sYXRpb24gYXJndW1lbnRzICIrYSsiOiIrYn1hLkludGVycG9sYXRpb249ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZChjKGEsYixlKSl9fX0oYiksZnVuY3Rpb24oYSxiLGMpe2Euc2VxdWVuY2VOdW1iZXI9MDt2YXIgZD1mdW5jdGlvbihhLGIsYyl7dGhpcy50YXJnZXQ9YSx0aGlzLmN1cnJlbnRUaW1lPWIsdGhpcy50aW1lbGluZVRpbWU9Yyx0aGlzLnR5cGU9ImZpbmlzaCIsdGhpcy5idWJibGVzPSExLHRoaXMuY2FuY2VsYWJsZT0hMSx0aGlzLmN1cnJlbnRUYXJnZXQ9YSx0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITEsdGhpcy5ldmVudFBoYXNlPUV2ZW50LkFUX1RBUkdFVCx0aGlzLnRpbWVTdGFtcD1EYXRlLm5vdygpfTtiLkFuaW1hdGlvbj1mdW5jdGlvbihiKXt0aGlzLmlkPSIiLGImJmIuX2lkJiYodGhpcy5pZD1iLl9pZCksdGhpcy5fc2VxdWVuY2VOdW1iZXI9YS5zZXF1ZW5jZU51bWJlcisrLHRoaXMuX2N1cnJlbnRUaW1lPTAsdGhpcy5fc3RhcnRUaW1lPW51bGwsdGhpcy5fcGF1c2VkPSExLHRoaXMuX3BsYXliYWNrUmF0ZT0xLHRoaXMuX2luVGltZWxpbmU9ITAsdGhpcy5fZmluaXNoZWRGbGFnPSEwLHRoaXMub25maW5pc2g9bnVsbCx0aGlzLl9maW5pc2hIYW5kbGVycz1bXSx0aGlzLl9lZmZlY3Q9Yix0aGlzLl9pbkVmZmVjdD10aGlzLl9lZmZlY3QuX3VwZGF0ZSgwKSx0aGlzLl9pZGxlPSEwLHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz0hMX0sYi5BbmltYXRpb24ucHJvdG90eXBlPXtfZW5zdXJlQWxpdmU6ZnVuY3Rpb24oKXt0aGlzLnBsYXliYWNrUmF0ZTwwJiYwPT09dGhpcy5jdXJyZW50VGltZT90aGlzLl9pbkVmZmVjdD10aGlzLl9lZmZlY3QuX3VwZGF0ZSgtMSk6dGhpcy5faW5FZmZlY3Q9dGhpcy5fZWZmZWN0Ll91cGRhdGUodGhpcy5jdXJyZW50VGltZSksdGhpcy5faW5UaW1lbGluZXx8IXRoaXMuX2luRWZmZWN0JiZ0aGlzLl9maW5pc2hlZEZsYWd8fCh0aGlzLl9pblRpbWVsaW5lPSEwLGIudGltZWxpbmUuX2FuaW1hdGlvbnMucHVzaCh0aGlzKSl9LF90aWNrQ3VycmVudFRpbWU6ZnVuY3Rpb24oYSxiKXthIT10aGlzLl9jdXJyZW50VGltZSYmKHRoaXMuX2N1cnJlbnRUaW1lPWEsdGhpcy5faXNGaW5pc2hlZCYmIWImJih0aGlzLl9jdXJyZW50VGltZT10aGlzLl9wbGF5YmFja1JhdGU+MD90aGlzLl90b3RhbER1cmF0aW9uOjApLHRoaXMuX2Vuc3VyZUFsaXZlKCkpfSxnZXQgY3VycmVudFRpbWUoKXtyZXR1cm4gdGhpcy5faWRsZXx8dGhpcy5fY3VycmVudFRpbWVQZW5kaW5nP251bGw6dGhpcy5fY3VycmVudFRpbWV9LHNldCBjdXJyZW50VGltZShhKXthPSthLGlzTmFOKGEpfHwoYi5yZXN0YXJ0KCksdGhpcy5fcGF1c2VkfHxudWxsPT10aGlzLl9zdGFydFRpbWV8fCh0aGlzLl9zdGFydFRpbWU9dGhpcy5fdGltZWxpbmUuY3VycmVudFRpbWUtYS90aGlzLl9wbGF5YmFja1JhdGUpLHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz0hMSx0aGlzLl9jdXJyZW50VGltZSE9YSYmKHRoaXMuX2lkbGUmJih0aGlzLl9pZGxlPSExLHRoaXMuX3BhdXNlZD0hMCksdGhpcy5fdGlja0N1cnJlbnRUaW1lKGEsITApLGIuYXBwbHlEaXJ0aWVkQW5pbWF0aW9uKHRoaXMpKSl9LGdldCBzdGFydFRpbWUoKXtyZXR1cm4gdGhpcy5fc3RhcnRUaW1lfSxzZXQgc3RhcnRUaW1lKGEpe2E9K2EsaXNOYU4oYSl8fHRoaXMuX3BhdXNlZHx8dGhpcy5faWRsZXx8KHRoaXMuX3N0YXJ0VGltZT1hLHRoaXMuX3RpY2tDdXJyZW50VGltZSgodGhpcy5fdGltZWxpbmUuY3VycmVudFRpbWUtdGhpcy5fc3RhcnRUaW1lKSp0aGlzLnBsYXliYWNrUmF0ZSksYi5hcHBseURpcnRpZWRBbmltYXRpb24odGhpcykpfSxnZXQgcGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMuX3BsYXliYWNrUmF0ZX0sc2V0IHBsYXliYWNrUmF0ZShhKXtpZihhIT10aGlzLl9wbGF5YmFja1JhdGUpe3ZhciBjPXRoaXMuY3VycmVudFRpbWU7dGhpcy5fcGxheWJhY2tSYXRlPWEsdGhpcy5fc3RhcnRUaW1lPW51bGwsInBhdXNlZCIhPXRoaXMucGxheVN0YXRlJiYiaWRsZSIhPXRoaXMucGxheVN0YXRlJiYodGhpcy5fZmluaXNoZWRGbGFnPSExLHRoaXMuX2lkbGU9ITEsdGhpcy5fZW5zdXJlQWxpdmUoKSxiLmFwcGx5RGlydGllZEFuaW1hdGlvbih0aGlzKSksbnVsbCE9YyYmKHRoaXMuY3VycmVudFRpbWU9Yyl9fSxnZXQgX2lzRmluaXNoZWQoKXtyZXR1cm4hdGhpcy5faWRsZSYmKHRoaXMuX3BsYXliYWNrUmF0ZT4wJiZ0aGlzLl9jdXJyZW50VGltZT49dGhpcy5fdG90YWxEdXJhdGlvbnx8dGhpcy5fcGxheWJhY2tSYXRlPDAmJnRoaXMuX2N1cnJlbnRUaW1lPD0wKX0sZ2V0IF90b3RhbER1cmF0aW9uKCl7cmV0dXJuIHRoaXMuX2VmZmVjdC5fdG90YWxEdXJhdGlvbn0sZ2V0IHBsYXlTdGF0ZSgpe3JldHVybiB0aGlzLl9pZGxlPyJpZGxlIjpudWxsPT10aGlzLl9zdGFydFRpbWUmJiF0aGlzLl9wYXVzZWQmJjAhPXRoaXMucGxheWJhY2tSYXRlfHx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc/InBlbmRpbmciOnRoaXMuX3BhdXNlZD8icGF1c2VkIjp0aGlzLl9pc0ZpbmlzaGVkPyJmaW5pc2hlZCI6InJ1bm5pbmcifSxfcmV3aW5kOmZ1bmN0aW9uKCl7aWYodGhpcy5fcGxheWJhY2tSYXRlPj0wKXRoaXMuX2N1cnJlbnRUaW1lPTA7ZWxzZXtpZighKHRoaXMuX3RvdGFsRHVyYXRpb248MS8wKSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJVbmFibGUgdG8gcmV3aW5kIG5lZ2F0aXZlIHBsYXliYWNrIHJhdGUgYW5pbWF0aW9uIHdpdGggaW5maW5pdGUgZHVyYXRpb24iLCJJbnZhbGlkU3RhdGVFcnJvciIpO3RoaXMuX2N1cnJlbnRUaW1lPXRoaXMuX3RvdGFsRHVyYXRpb259fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5fcGF1c2VkPSExLCh0aGlzLl9pc0ZpbmlzaGVkfHx0aGlzLl9pZGxlKSYmKHRoaXMuX3Jld2luZCgpLHRoaXMuX3N0YXJ0VGltZT1udWxsKSx0aGlzLl9maW5pc2hlZEZsYWc9ITEsdGhpcy5faWRsZT0hMSx0aGlzLl9lbnN1cmVBbGl2ZSgpLGIuYXBwbHlEaXJ0aWVkQW5pbWF0aW9uKHRoaXMpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuX2lzRmluaXNoZWR8fHRoaXMuX3BhdXNlZHx8dGhpcy5faWRsZT90aGlzLl9pZGxlJiYodGhpcy5fcmV3aW5kKCksdGhpcy5faWRsZT0hMSk6dGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSEwLHRoaXMuX3N0YXJ0VGltZT1udWxsLHRoaXMuX3BhdXNlZD0hMH0sZmluaXNoOmZ1bmN0aW9uKCl7dGhpcy5faWRsZXx8KHRoaXMuY3VycmVudFRpbWU9dGhpcy5fcGxheWJhY2tSYXRlPjA/dGhpcy5fdG90YWxEdXJhdGlvbjowLHRoaXMuX3N0YXJ0VGltZT10aGlzLl90b3RhbER1cmF0aW9uLXRoaXMuY3VycmVudFRpbWUsdGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSExLGIuYXBwbHlEaXJ0aWVkQW5pbWF0aW9uKHRoaXMpKX0sY2FuY2VsOmZ1bmN0aW9uKCl7dGhpcy5faW5FZmZlY3QmJih0aGlzLl9pbkVmZmVjdD0hMSx0aGlzLl9pZGxlPSEwLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9maW5pc2hlZEZsYWc9ITAsdGhpcy5fY3VycmVudFRpbWU9MCx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLl9lZmZlY3QuX3VwZGF0ZShudWxsKSxiLmFwcGx5RGlydGllZEFuaW1hdGlvbih0aGlzKSl9LHJldmVyc2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXliYWNrUmF0ZSo9LTEsdGhpcy5wbGF5KCl9LGFkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXsiZnVuY3Rpb24iPT10eXBlb2YgYiYmImZpbmlzaCI9PWEmJnRoaXMuX2ZpbmlzaEhhbmRsZXJzLnB1c2goYil9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXtpZigiZmluaXNoIj09YSl7dmFyIGM9dGhpcy5fZmluaXNoSGFuZGxlcnMuaW5kZXhPZihiKTtjPj0wJiZ0aGlzLl9maW5pc2hIYW5kbGVycy5zcGxpY2UoYywxKX19LF9maXJlRXZlbnRzOmZ1bmN0aW9uKGEpe2lmKHRoaXMuX2lzRmluaXNoZWQpe2lmKCF0aGlzLl9maW5pc2hlZEZsYWcpe3ZhciBiPW5ldyBkKHRoaXMsdGhpcy5fY3VycmVudFRpbWUsYSksYz10aGlzLl9maW5pc2hIYW5kbGVycy5jb25jYXQodGhpcy5vbmZpbmlzaD9bdGhpcy5vbmZpbmlzaF06W10pO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtjLmZvckVhY2goZnVuY3Rpb24oYSl7YS5jYWxsKGIudGFyZ2V0LGIpfSl9LDApLHRoaXMuX2ZpbmlzaGVkRmxhZz0hMH19ZWxzZSB0aGlzLl9maW5pc2hlZEZsYWc9ITF9LF90aWNrOmZ1bmN0aW9uKGEsYil7dGhpcy5faWRsZXx8dGhpcy5fcGF1c2VkfHwobnVsbD09dGhpcy5fc3RhcnRUaW1lP2ImJih0aGlzLnN0YXJ0VGltZT1hLXRoaXMuX2N1cnJlbnRUaW1lL3RoaXMucGxheWJhY2tSYXRlKTp0aGlzLl9pc0ZpbmlzaGVkfHx0aGlzLl90aWNrQ3VycmVudFRpbWUoKGEtdGhpcy5fc3RhcnRUaW1lKSp0aGlzLnBsYXliYWNrUmF0ZSkpLGImJih0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITEsdGhpcy5fZmlyZUV2ZW50cyhhKSl9LGdldCBfbmVlZHNUaWNrKCl7cmV0dXJuIHRoaXMucGxheVN0YXRlIGlue3BlbmRpbmc6MSxydW5uaW5nOjF9fHwhdGhpcy5fZmluaXNoZWRGbGFnfSxfdGFyZ2V0QW5pbWF0aW9uczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2VmZmVjdC5fdGFyZ2V0O3JldHVybiBhLl9hY3RpdmVBbmltYXRpb25zfHwoYS5fYWN0aXZlQW5pbWF0aW9ucz1bXSksYS5fYWN0aXZlQW5pbWF0aW9uc30sX21hcmtUYXJnZXQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl90YXJnZXRBbmltYXRpb25zKCk7LTE9PT1hLmluZGV4T2YodGhpcykmJmEucHVzaCh0aGlzKX0sX3VubWFya1RhcmdldDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX3RhcmdldEFuaW1hdGlvbnMoKSxiPWEuaW5kZXhPZih0aGlzKTstMSE9PWImJmEuc3BsaWNlKGIsMSl9fX0oYSxiKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXt2YXIgYj1qO2o9W10sYTxxLmN1cnJlbnRUaW1lJiYoYT1xLmN1cnJlbnRUaW1lKSxxLl9hbmltYXRpb25zLnNvcnQoZSkscS5fYW5pbWF0aW9ucz1oKGEsITAscS5fYW5pbWF0aW9ucylbMF0sYi5mb3JFYWNoKGZ1bmN0aW9uKGIpe2JbMV0oYSl9KSxnKCksbD12b2lkIDB9ZnVuY3Rpb24gZShhLGIpe3JldHVybiBhLl9zZXF1ZW5jZU51bWJlci1iLl9zZXF1ZW5jZU51bWJlcn1mdW5jdGlvbiBmKCl7dGhpcy5fYW5pbWF0aW9ucz1bXSx0aGlzLmN1cnJlbnRUaW1lPXdpbmRvdy5wZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlLm5vdygpOjB9ZnVuY3Rpb24gZygpe28uZm9yRWFjaChmdW5jdGlvbihhKXthKCl9KSxvLmxlbmd0aD0wfWZ1bmN0aW9uIGgoYSxjLGQpe3A9ITAsbj0hMSxiLnRpbWVsaW5lLmN1cnJlbnRUaW1lPWEsbT0hMTt2YXIgZT1bXSxmPVtdLGc9W10saD1bXTtyZXR1cm4gZC5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IuX3RpY2soYSxjKSxiLl9pbkVmZmVjdD8oZi5wdXNoKGIuX2VmZmVjdCksYi5fbWFya1RhcmdldCgpKTooZS5wdXNoKGIuX2VmZmVjdCksYi5fdW5tYXJrVGFyZ2V0KCkpLGIuX25lZWRzVGljayYmKG09ITApO3ZhciBkPWIuX2luRWZmZWN0fHxiLl9uZWVkc1RpY2s7Yi5faW5UaW1lbGluZT1kLGQ/Zy5wdXNoKGIpOmgucHVzaChiKX0pLG8ucHVzaC5hcHBseShvLGUpLG8ucHVzaC5hcHBseShvLGYpLG0mJnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe30pLHA9ITEsW2csaF19dmFyIGk9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSxqPVtdLGs9MDt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKGEpe3ZhciBiPWsrKztyZXR1cm4gMD09ai5sZW5ndGgmJmkoZCksai5wdXNoKFtiLGFdKSxifSx3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7ai5mb3JFYWNoKGZ1bmN0aW9uKGIpe2JbMF09PWEmJihiWzFdPWZ1bmN0aW9uKCl7fSl9KX0sZi5wcm90b3R5cGU9e19wbGF5OmZ1bmN0aW9uKGMpe2MuX3RpbWluZz1hLm5vcm1hbGl6ZVRpbWluZ0lucHV0KGMudGltaW5nKTt2YXIgZD1uZXcgYi5BbmltYXRpb24oYyk7cmV0dXJuIGQuX2lkbGU9ITEsZC5fdGltZWxpbmU9dGhpcyx0aGlzLl9hbmltYXRpb25zLnB1c2goZCksYi5yZXN0YXJ0KCksYi5hcHBseURpcnRpZWRBbmltYXRpb24oZCksZH19O3ZhciBsPXZvaWQgMCxtPSExLG49ITE7Yi5yZXN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIG18fChtPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe30pLG49ITApLG59LGIuYXBwbHlEaXJ0aWVkQW5pbWF0aW9uPWZ1bmN0aW9uKGEpe2lmKCFwKXthLl9tYXJrVGFyZ2V0KCk7dmFyIGM9YS5fdGFyZ2V0QW5pbWF0aW9ucygpO2Muc29ydChlKSxoKGIudGltZWxpbmUuY3VycmVudFRpbWUsITEsYy5zbGljZSgpKVsxXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPXEuX2FuaW1hdGlvbnMuaW5kZXhPZihhKTstMSE9PWImJnEuX2FuaW1hdGlvbnMuc3BsaWNlKGIsMSl9KSxnKCl9fTt2YXIgbz1bXSxwPSExLHE9bmV3IGY7Yi50aW1lbGluZT1xfShhLGIpLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz1hLmV4ZWMoYik7aWYoYylyZXR1cm4gYz1hLmlnbm9yZUNhc2U/Y1swXS50b0xvd2VyQ2FzZSgpOmNbMF0sW2MsYi5zdWJzdHIoYy5sZW5ndGgpXX1mdW5jdGlvbiBjKGEsYil7Yj1iLnJlcGxhY2UoL15ccyovLCIiKTt2YXIgYz1hKGIpO2lmKGMpcmV0dXJuW2NbMF0sY1sxXS5yZXBsYWNlKC9eXHMqLywiIildfWZ1bmN0aW9uIGQoYSxkLGUpe2E9Yy5iaW5kKG51bGwsYSk7Zm9yKHZhciBmPVtdOzspe3ZhciBnPWEoZSk7aWYoIWcpcmV0dXJuW2YsZV07aWYoZi5wdXNoKGdbMF0pLGU9Z1sxXSwhKGc9YihkLGUpKXx8IiI9PWdbMV0pcmV0dXJuW2YsZV07ZT1nWzFdfX1mdW5jdGlvbiBlKGEsYil7Zm9yKHZhciBjPTAsZD0wO2Q8Yi5sZW5ndGgmJighL1xzfCwvLnRlc3QoYltkXSl8fDAhPWMpO2QrKylpZigiKCI9PWJbZF0pYysrO2Vsc2UgaWYoIikiPT1iW2RdJiYoYy0tLDA9PWMmJmQrKyxjPD0wKSlicmVhazt2YXIgZT1hKGIuc3Vic3RyKDAsZCkpO3JldHVybiB2b2lkIDA9PWU/dm9pZCAwOltlLGIuc3Vic3RyKGQpXX1mdW5jdGlvbiBmKGEsYil7Zm9yKHZhciBjPWEsZD1iO2MmJmQ7KWM+ZD9jJT1kOmQlPWM7cmV0dXJuIGM9YSpiLyhjK2QpfWZ1bmN0aW9uIGcoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWEoYik7cmV0dXJuIGMmJihjWzBdPXZvaWQgMCksY319ZnVuY3Rpb24gaChhLGIpe3JldHVybiBmdW5jdGlvbihjKXtyZXR1cm4gYShjKXx8W2IsY119fWZ1bmN0aW9uIGkoYixjKXtmb3IodmFyIGQ9W10sZT0wO2U8Yi5sZW5ndGg7ZSsrKXt2YXIgZj1hLmNvbnN1bWVUcmltbWVkKGJbZV0sYyk7aWYoIWZ8fCIiPT1mWzBdKXJldHVybjt2b2lkIDAhPT1mWzBdJiZkLnB1c2goZlswXSksYz1mWzFdfWlmKCIiPT1jKXJldHVybiBkfWZ1bmN0aW9uIGooYSxiLGMsZCxlKXtmb3IodmFyIGc9W10saD1bXSxpPVtdLGo9ZihkLmxlbmd0aCxlLmxlbmd0aCksaz0wO2s8ajtrKyspe3ZhciBsPWIoZFtrJWQubGVuZ3RoXSxlW2slZS5sZW5ndGhdKTtpZighbClyZXR1cm47Zy5wdXNoKGxbMF0pLGgucHVzaChsWzFdKSxpLnB1c2gobFsyXSl9cmV0dXJuW2csaCxmdW5jdGlvbihiKXt2YXIgZD1iLm1hcChmdW5jdGlvbihhLGIpe3JldHVybiBpW2JdKGEpfSkuam9pbihjKTtyZXR1cm4gYT9hKGQpOmR9XX1mdW5jdGlvbiBrKGEsYixjKXtmb3IodmFyIGQ9W10sZT1bXSxmPVtdLGc9MCxoPTA7aDxjLmxlbmd0aDtoKyspaWYoImZ1bmN0aW9uIj09dHlwZW9mIGNbaF0pe3ZhciBpPWNbaF0oYVtnXSxiW2crK10pO2QucHVzaChpWzBdKSxlLnB1c2goaVsxXSksZi5wdXNoKGlbMl0pfWVsc2UhZnVuY3Rpb24oYSl7ZC5wdXNoKCExKSxlLnB1c2goITEpLGYucHVzaChmdW5jdGlvbigpe3JldHVybiBjW2FdfSl9KGgpO3JldHVybltkLGUsZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKyliKz1mW2NdKGFbY10pO3JldHVybiBifV19YS5jb25zdW1lVG9rZW49YixhLmNvbnN1bWVUcmltbWVkPWMsYS5jb25zdW1lUmVwZWF0ZWQ9ZCxhLmNvbnN1bWVQYXJlbnRoZXNpc2VkPWUsYS5pZ25vcmU9ZyxhLm9wdGlvbmFsPWgsYS5jb25zdW1lTGlzdD1pLGEubWVyZ2VOZXN0ZWRSZXBlYXRlZD1qLmJpbmQobnVsbCxudWxsKSxhLm1lcmdlV3JhcHBlZE5lc3RlZFJlcGVhdGVkPWosYS5tZXJnZUxpc3Q9a30oYiksZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiKXtmdW5jdGlvbiBjKGIpe3ZhciBjPWEuY29uc3VtZVRva2VuKC9eaW5zZXQvaSxiKTtyZXR1cm4gYz8oZC5pbnNldD0hMCxjKTooYz1hLmNvbnN1bWVMZW5ndGhPclBlcmNlbnQoYikpPyhkLmxlbmd0aHMucHVzaChjWzBdKSxjKTooYz1hLmNvbnN1bWVDb2xvcihiKSxjPyhkLmNvbG9yPWNbMF0sYyk6dm9pZCAwKX12YXIgZD17aW5zZXQ6ITEsbGVuZ3RoczpbXSxjb2xvcjpudWxsfSxlPWEuY29uc3VtZVJlcGVhdGVkKGMsL14vLGIpO2lmKGUmJmVbMF0ubGVuZ3RoKXJldHVybltkLGVbMV1dfWZ1bmN0aW9uIGMoYyl7dmFyIGQ9YS5jb25zdW1lUmVwZWF0ZWQoYiwvXiwvLGMpO2lmKGQmJiIiPT1kWzFdKXJldHVybiBkWzBdfWZ1bmN0aW9uIGQoYixjKXtmb3IoO2IubGVuZ3Rocy5sZW5ndGg8TWF0aC5tYXgoYi5sZW5ndGhzLmxlbmd0aCxjLmxlbmd0aHMubGVuZ3RoKTspYi5sZW5ndGhzLnB1c2goe3B4OjB9KTtmb3IoO2MubGVuZ3Rocy5sZW5ndGg8TWF0aC5tYXgoYi5sZW5ndGhzLmxlbmd0aCxjLmxlbmd0aHMubGVuZ3RoKTspYy5sZW5ndGhzLnB1c2goe3B4OjB9KTtpZihiLmluc2V0PT1jLmluc2V0JiYhIWIuY29sb3I9PSEhYy5jb2xvcil7Zm9yKHZhciBkLGU9W10sZj1bW10sMF0sZz1bW10sMF0saD0wO2g8Yi5sZW5ndGhzLmxlbmd0aDtoKyspe3ZhciBpPWEubWVyZ2VEaW1lbnNpb25zKGIubGVuZ3Roc1toXSxjLmxlbmd0aHNbaF0sMj09aCk7ZlswXS5wdXNoKGlbMF0pLGdbMF0ucHVzaChpWzFdKSxlLnB1c2goaVsyXSl9aWYoYi5jb2xvciYmYy5jb2xvcil7dmFyIGo9YS5tZXJnZUNvbG9ycyhiLmNvbG9yLGMuY29sb3IpO2ZbMV09alswXSxnWzFdPWpbMV0sZD1qWzJdfXJldHVybltmLGcsZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWIuaW5zZXQ/Imluc2V0ICI6IiAiLGY9MDtmPGUubGVuZ3RoO2YrKyljKz1lW2ZdKGFbMF1bZl0pKyIgIjtyZXR1cm4gZCYmKGMrPWQoYVsxXSkpLGN9XX19ZnVuY3Rpb24gZShiLGMsZCxlKXtmdW5jdGlvbiBmKGEpe3JldHVybntpbnNldDphLGNvbG9yOlswLDAsMCwwXSxsZW5ndGhzOlt7cHg6MH0se3B4OjB9LHtweDowfSx7cHg6MH1dfX1mb3IodmFyIGc9W10saD1bXSxpPTA7aTxkLmxlbmd0aHx8aTxlLmxlbmd0aDtpKyspe3ZhciBqPWRbaV18fGYoZVtpXS5pbnNldCksaz1lW2ldfHxmKGRbaV0uaW5zZXQpO2cucHVzaChqKSxoLnB1c2goayl9cmV0dXJuIGEubWVyZ2VOZXN0ZWRSZXBlYXRlZChiLGMsZyxoKX12YXIgZj1lLmJpbmQobnVsbCxkLCIsICIpO2EuYWRkUHJvcGVydGllc0hhbmRsZXIoYyxmLFsiYm94LXNoYWRvdyIsInRleHQtc2hhZG93Il0pfShiKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIGEudG9GaXhlZCgzKS5yZXBsYWNlKC8wKyQvLCIiKS5yZXBsYWNlKC9cLiQvLCIiKX1mdW5jdGlvbiBkKGEsYixjKXtyZXR1cm4gTWF0aC5taW4oYixNYXRoLm1heChhLGMpKX1mdW5jdGlvbiBlKGEpe2lmKC9eXHMqWy0rXT8oXGQqXC4pP1xkK1xzKiQvLnRlc3QoYSkpcmV0dXJuIE51bWJlcihhKX1mdW5jdGlvbiBmKGEsYil7cmV0dXJuW2EsYixjXX1mdW5jdGlvbiBnKGEsYil7aWYoMCE9YSlyZXR1cm4gaSgwLDEvMCkoYSxiKX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuW2EsYixmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChkKDEsMS8wLGEpKX1dfWZ1bmN0aW9uIGkoYSxiKXtyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm5bZSxmLGZ1bmN0aW9uKGUpe3JldHVybiBjKGQoYSxiLGUpKX1dfX1mdW5jdGlvbiBqKGEpe3ZhciBiPWEudHJpbSgpLnNwbGl0KC9ccypbXHMsXVxzKi8pO2lmKDAhPT1iLmxlbmd0aCl7Zm9yKHZhciBjPVtdLGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGY9ZShiW2RdKTtpZih2b2lkIDA9PT1mKXJldHVybjtjLnB1c2goZil9cmV0dXJuIGN9fWZ1bmN0aW9uIGsoYSxiKXtpZihhLmxlbmd0aD09Yi5sZW5ndGgpcmV0dXJuW2EsYixmdW5jdGlvbihhKXtyZXR1cm4gYS5tYXAoYykuam9pbigiICIpfV19ZnVuY3Rpb24gbChhLGIpe3JldHVyblthLGIsTWF0aC5yb3VuZF19YS5jbGFtcD1kLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoaixrLFsic3Ryb2tlLWRhc2hhcnJheSJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsaSgwLDEvMCksWyJib3JkZXItaW1hZ2Utd2lkdGgiLCJsaW5lLWhlaWdodCJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsaSgwLDEpLFsib3BhY2l0eSIsInNoYXBlLWltYWdlLXRocmVzaG9sZCJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsZyxbImZsZXgtZ3JvdyIsImZsZXgtc2hyaW5rIl0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoZSxoLFsib3JwaGFucyIsIndpZG93cyJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsbCxbInotaW5kZXgiXSksYS5wYXJzZU51bWJlcj1lLGEucGFyc2VOdW1iZXJMaXN0PWosYS5tZXJnZU51bWJlcnM9ZixhLm51bWJlclRvU3RyaW5nPWN9KGIpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKCJ2aXNpYmxlIj09YXx8InZpc2libGUiPT1iKXJldHVyblswLDEsZnVuY3Rpb24oYyl7cmV0dXJuIGM8PTA/YTpjPj0xP2I6InZpc2libGUifV19YS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihTdHJpbmcsYyxbInZpc2liaWxpdHkiXSl9KGIpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXthPWEudHJpbSgpLGYuZmlsbFN0eWxlPSIjMDAwIixmLmZpbGxTdHlsZT1hO3ZhciBiPWYuZmlsbFN0eWxlO2lmKGYuZmlsbFN0eWxlPSIjZmZmIixmLmZpbGxTdHlsZT1hLGI9PWYuZmlsbFN0eWxlKXtmLmZpbGxSZWN0KDAsMCwxLDEpO3ZhciBjPWYuZ2V0SW1hZ2VEYXRhKDAsMCwxLDEpLmRhdGE7Zi5jbGVhclJlY3QoMCwwLDEsMSk7dmFyIGQ9Y1szXS8yNTU7cmV0dXJuW2NbMF0qZCxjWzFdKmQsY1syXSpkLGRdfX1mdW5jdGlvbiBkKGIsYyl7cmV0dXJuW2IsYyxmdW5jdGlvbihiKXtmdW5jdGlvbiBjKGEpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDI1NSxhKSl9aWYoYlszXSlmb3IodmFyIGQ9MDtkPDM7ZCsrKWJbZF09TWF0aC5yb3VuZChjKGJbZF0vYlszXSkpO3JldHVybiBiWzNdPWEubnVtYmVyVG9TdHJpbmcoYS5jbGFtcCgwLDEsYlszXSkpLCJyZ2JhKCIrYi5qb2luKCIsIikrIikifV19dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiY2FudmFzIik7ZS53aWR0aD1lLmhlaWdodD0xO3ZhciBmPWUuZ2V0Q29udGV4dCgiMmQiKTthLmFkZFByb3BlcnRpZXNIYW5kbGVyKGMsZCxbImJhY2tncm91bmQtY29sb3IiLCJib3JkZXItYm90dG9tLWNvbG9yIiwiYm9yZGVyLWxlZnQtY29sb3IiLCJib3JkZXItcmlnaHQtY29sb3IiLCJib3JkZXItdG9wLWNvbG9yIiwiY29sb3IiLCJmaWxsIiwiZmxvb2QtY29sb3IiLCJsaWdodGluZy1jb2xvciIsIm91dGxpbmUtY29sb3IiLCJzdG9wLWNvbG9yIiwic3Ryb2tlIiwidGV4dC1kZWNvcmF0aW9uLWNvbG9yIl0pLGEuY29uc3VtZUNvbG9yPWEuY29uc3VtZVBhcmVudGhlc2lzZWQuYmluZChudWxsLGMpLGEubWVyZ2VDb2xvcnM9ZH0oYiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe2Z1bmN0aW9uIGIoKXt2YXIgYj1oLmV4ZWMoYSk7Zz1iP2JbMF06dm9pZCAwfWZ1bmN0aW9uIGMoKXt2YXIgYT1OdW1iZXIoZyk7cmV0dXJuIGIoKSxhfWZ1bmN0aW9uIGQoKXtpZigiKCIhPT1nKXJldHVybiBjKCk7YigpO3ZhciBhPWYoKTtyZXR1cm4iKSIhPT1nP05hTjooYigpLGEpfWZ1bmN0aW9uIGUoKXtmb3IodmFyIGE9ZCgpOyIqIj09PWd8fCIvIj09PWc7KXt2YXIgYz1nO2IoKTt2YXIgZT1kKCk7IioiPT09Yz9hKj1lOmEvPWV9cmV0dXJuIGF9ZnVuY3Rpb24gZigpe2Zvcih2YXIgYT1lKCk7IisiPT09Z3x8Ii0iPT09Zzspe3ZhciBjPWc7YigpO3ZhciBkPWUoKTsiKyI9PT1jP2ErPWQ6YS09ZH1yZXR1cm4gYX12YXIgZyxoPS8oW1wrXC1cd1wuXSt8W1woXClcKlwvXSkvZztyZXR1cm4gYigpLGYoKX1mdW5jdGlvbiBkKGEsYil7aWYoIjAiPT0oYj1iLnRyaW0oKS50b0xvd2VyQ2FzZSgpKSYmInB4Ii5zZWFyY2goYSk+PTApcmV0dXJue3B4OjB9O2lmKC9eW14oXSokfF5jYWxjLy50ZXN0KGIpKXtiPWIucmVwbGFjZSgvY2FsY1woL2csIigiKTt2YXIgZD17fTtiPWIucmVwbGFjZShhLGZ1bmN0aW9uKGEpe3JldHVybiBkW2FdPW51bGwsIlUiK2F9KTtmb3IodmFyIGU9IlUoIithLnNvdXJjZSsiKSIsZj1iLnJlcGxhY2UoL1stK10/KFxkKlwuKT9cZCsoW0VlXVstK10/XGQrKT8vZywiTiIpLnJlcGxhY2UobmV3IFJlZ0V4cCgiTiIrZSwiZyIpLCJEIikucmVwbGFjZSgvXHNbKy1dXHMvZywiTyIpLnJlcGxhY2UoL1xzL2csIiIpLGc9Wy9OXCooRCkvZywvKE58RClbKlwvXU4vZywvKE58RClPXDEvZywvXCgoTnxEKVwpL2ddLGg9MDtoPGcubGVuZ3RoOylnW2hdLnRlc3QoZik/KGY9Zi5yZXBsYWNlKGdbaF0sIiQxIiksaD0wKTpoKys7aWYoIkQiPT1mKXtmb3IodmFyIGkgaW4gZCl7dmFyIGo9YyhiLnJlcGxhY2UobmV3IFJlZ0V4cCgiVSIraSwiZyIpLCIiKS5yZXBsYWNlKG5ldyBSZWdFeHAoZSwiZyIpLCIqMCIpKTtpZighaXNGaW5pdGUoaikpcmV0dXJuO2RbaV09an1yZXR1cm4gZH19fWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gZihhLGIsITApfWZ1bmN0aW9uIGYoYixjLGQpe3ZhciBlLGY9W107Zm9yKGUgaW4gYilmLnB1c2goZSk7Zm9yKGUgaW4gYylmLmluZGV4T2YoZSk8MCYmZi5wdXNoKGUpO3JldHVybiBiPWYubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBiW2FdfHwwfSksYz1mLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gY1thXXx8MH0pLFtiLGMsZnVuY3Rpb24oYil7dmFyIGM9Yi5tYXAoZnVuY3Rpb24oYyxlKXtyZXR1cm4gMT09Yi5sZW5ndGgmJmQmJihjPU1hdGgubWF4KGMsMCkpLGEubnVtYmVyVG9TdHJpbmcoYykrZltlXX0pLmpvaW4oIiArICIpO3JldHVybiBiLmxlbmd0aD4xPyJjYWxjKCIrYysiKSI6Y31dfXZhciBnPSJweHxlbXxleHxjaHxyZW18dnd8dmh8dm1pbnx2bWF4fGNtfG1tfGlufHB0fHBjIixoPWQuYmluZChudWxsLG5ldyBSZWdFeHAoZywiZyIpKSxpPWQuYmluZChudWxsLG5ldyBSZWdFeHAoZysifCUiLCJnIikpLGo9ZC5iaW5kKG51bGwsL2RlZ3xyYWR8Z3JhZHx0dXJuL2cpO2EucGFyc2VMZW5ndGg9aCxhLnBhcnNlTGVuZ3RoT3JQZXJjZW50PWksYS5jb25zdW1lTGVuZ3RoT3JQZXJjZW50PWEuY29uc3VtZVBhcmVudGhlc2lzZWQuYmluZChudWxsLGkpLGEucGFyc2VBbmdsZT1qLGEubWVyZ2VEaW1lbnNpb25zPWY7dmFyIGs9YS5jb25zdW1lUGFyZW50aGVzaXNlZC5iaW5kKG51bGwsaCksbD1hLmNvbnN1bWVSZXBlYXRlZC5iaW5kKHZvaWQgMCxrLC9eLyksbT1hLmNvbnN1bWVSZXBlYXRlZC5iaW5kKHZvaWQgMCxsLC9eLC8pO2EuY29uc3VtZVNpemVQYWlyTGlzdD1tO3ZhciBuPWZ1bmN0aW9uKGEpe3ZhciBiPW0oYSk7aWYoYiYmIiI9PWJbMV0pcmV0dXJuIGJbMF19LG89YS5tZXJnZU5lc3RlZFJlcGVhdGVkLmJpbmQodm9pZCAwLGUsIiAiKSxwPWEubWVyZ2VOZXN0ZWRSZXBlYXRlZC5iaW5kKHZvaWQgMCxvLCIsIik7YS5tZXJnZU5vbk5lZ2F0aXZlU2l6ZVBhaXI9byxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKG4scCxbImJhY2tncm91bmQtc2l6ZSJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGksZSxbImJvcmRlci1ib3R0b20td2lkdGgiLCJib3JkZXItaW1hZ2Utd2lkdGgiLCJib3JkZXItbGVmdC13aWR0aCIsImJvcmRlci1yaWdodC13aWR0aCIsImJvcmRlci10b3Atd2lkdGgiLCJmbGV4LWJhc2lzIiwiZm9udC1zaXplIiwiaGVpZ2h0IiwibGluZS1oZWlnaHQiLCJtYXgtaGVpZ2h0IiwibWF4LXdpZHRoIiwib3V0bGluZS13aWR0aCIsIndpZHRoIl0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoaSxmLFsiYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cyIsImJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzIiwiYm9yZGVyLXRvcC1sZWZ0LXJhZGl1cyIsImJvcmRlci10b3AtcmlnaHQtcmFkaXVzIiwiYm90dG9tIiwibGVmdCIsImxldHRlci1zcGFjaW5nIiwibWFyZ2luLWJvdHRvbSIsIm1hcmdpbi1sZWZ0IiwibWFyZ2luLXJpZ2h0IiwibWFyZ2luLXRvcCIsIm1pbi1oZWlnaHQiLCJtaW4td2lkdGgiLCJvdXRsaW5lLW9mZnNldCIsInBhZGRpbmctYm90dG9tIiwicGFkZGluZy1sZWZ0IiwicGFkZGluZy1yaWdodCIsInBhZGRpbmctdG9wIiwicGVyc3BlY3RpdmUiLCJyaWdodCIsInNoYXBlLW1hcmdpbiIsInN0cm9rZS1kYXNob2Zmc2V0IiwidGV4dC1pbmRlbnQiLCJ0b3AiLCJ2ZXJ0aWNhbC1hbGlnbiIsIndvcmQtc3BhY2luZyJdKX0oYiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGIpe3JldHVybiBhLmNvbnN1bWVMZW5ndGhPclBlcmNlbnQoYil8fGEuY29uc3VtZVRva2VuKC9eYXV0by8sYil9ZnVuY3Rpb24gZChiKXt2YXIgZD1hLmNvbnN1bWVMaXN0KFthLmlnbm9yZShhLmNvbnN1bWVUb2tlbi5iaW5kKG51bGwsL15yZWN0LykpLGEuaWdub3JlKGEuY29uc3VtZVRva2VuLmJpbmQobnVsbCwvXlwoLykpLGEuY29uc3VtZVJlcGVhdGVkLmJpbmQobnVsbCxjLC9eLC8pLGEuaWdub3JlKGEuY29uc3VtZVRva2VuLmJpbmQobnVsbCwvXlwpLykpXSxiKTtpZihkJiY0PT1kWzBdLmxlbmd0aClyZXR1cm4gZFswXX1mdW5jdGlvbiBlKGIsYyl7cmV0dXJuImF1dG8iPT1ifHwiYXV0byI9PWM/WyEwLCExLGZ1bmN0aW9uKGQpe3ZhciBlPWQ/YjpjO2lmKCJhdXRvIj09ZSlyZXR1cm4iYXV0byI7dmFyIGY9YS5tZXJnZURpbWVuc2lvbnMoZSxlKTtyZXR1cm4gZlsyXShmWzBdKX1dOmEubWVyZ2VEaW1lbnNpb25zKGIsYyl9ZnVuY3Rpb24gZihhKXtyZXR1cm4icmVjdCgiK2ErIikifXZhciBnPWEubWVyZ2VXcmFwcGVkTmVzdGVkUmVwZWF0ZWQuYmluZChudWxsLGYsZSwiLCAiKTthLnBhcnNlQm94PWQsYS5tZXJnZUJveGVzPWcsYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihkLGcsWyJjbGlwIl0pfShiKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPTA7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhPT09az9iW2MrK106YX0pfX1mdW5jdGlvbiBkKGEpe3JldHVybiBhfWZ1bmN0aW9uIGUoYil7aWYoIm5vbmUiPT0oYj1iLnRvTG93ZXJDYXNlKCkudHJpbSgpKSlyZXR1cm5bXTtmb3IodmFyIGMsZD0vXHMqKFx3KylcKChbXildKilcKS9nLGU9W10sZj0wO2M9ZC5leGVjKGIpOyl7aWYoYy5pbmRleCE9ZilyZXR1cm47Zj1jLmluZGV4K2NbMF0ubGVuZ3RoO3ZhciBnPWNbMV0saD1uW2ddO2lmKCFoKXJldHVybjt2YXIgaT1jWzJdLnNwbGl0KCIsIiksaj1oWzBdO2lmKGoubGVuZ3RoPGkubGVuZ3RoKXJldHVybjtmb3IodmFyIGs9W10sbz0wO288ai5sZW5ndGg7bysrKXt2YXIgcCxxPWlbb10scj1qW29dO2lmKHZvaWQgMD09PShwPXE/e0E6ZnVuY3Rpb24oYil7cmV0dXJuIjAiPT1iLnRyaW0oKT9tOmEucGFyc2VBbmdsZShiKX0sTjphLnBhcnNlTnVtYmVyLFQ6YS5wYXJzZUxlbmd0aE9yUGVyY2VudCxMOmEucGFyc2VMZW5ndGh9W3IudG9VcHBlckNhc2UoKV0ocSk6e2E6bSxuOmtbMF0sdDpsfVtyXSkpcmV0dXJuO2sucHVzaChwKX1pZihlLnB1c2goe3Q6ZyxkOmt9KSxkLmxhc3RJbmRleD09Yi5sZW5ndGgpcmV0dXJuIGV9fWZ1bmN0aW9uIGYoYSl7cmV0dXJuIGEudG9GaXhlZCg2KS5yZXBsYWNlKCIuMDAwMDAwIiwiIil9ZnVuY3Rpb24gZyhiLGMpe2lmKGIuZGVjb21wb3NpdGlvblBhaXIhPT1jKXtiLmRlY29tcG9zaXRpb25QYWlyPWM7dmFyIGQ9YS5tYWtlTWF0cml4RGVjb21wb3NpdGlvbihiKX1pZihjLmRlY29tcG9zaXRpb25QYWlyIT09Yil7Yy5kZWNvbXBvc2l0aW9uUGFpcj1iO3ZhciBlPWEubWFrZU1hdHJpeERlY29tcG9zaXRpb24oYyl9cmV0dXJuIG51bGw9PWRbMF18fG51bGw9PWVbMF0/W1shMV0sWyEwXSxmdW5jdGlvbihhKXtyZXR1cm4gYT9jWzBdLmQ6YlswXS5kfV06KGRbMF0ucHVzaCgwKSxlWzBdLnB1c2goMSksW2QsZSxmdW5jdGlvbihiKXt2YXIgYz1hLnF1YXQoZFswXVszXSxlWzBdWzNdLGJbNV0pO3JldHVybiBhLmNvbXBvc2VNYXRyaXgoYlswXSxiWzFdLGJbMl0sYyxiWzRdKS5tYXAoZikuam9pbigiLCIpfV0pfWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGEucmVwbGFjZSgvW3h5XS8sIiIpfWZ1bmN0aW9uIGkoYSl7cmV0dXJuIGEucmVwbGFjZSgvKHh8eXx6fDNkKT8kLywiM2QiKX1mdW5jdGlvbiBqKGIsYyl7dmFyIGQ9YS5tYWtlTWF0cml4RGVjb21wb3NpdGlvbiYmITAsZT0hMTtpZighYi5sZW5ndGh8fCFjLmxlbmd0aCl7Yi5sZW5ndGh8fChlPSEwLGI9YyxjPVtdKTtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl7dmFyIGo9YltmXS50LGs9YltmXS5kLGw9InNjYWxlIj09ai5zdWJzdHIoMCw1KT8xOjA7Yy5wdXNoKHt0OmosZDprLm1hcChmdW5jdGlvbihhKXtpZigibnVtYmVyIj09dHlwZW9mIGEpcmV0dXJuIGw7dmFyIGI9e307Zm9yKHZhciBjIGluIGEpYltjXT1sO3JldHVybiBifSl9KX19dmFyIG09ZnVuY3Rpb24oYSxiKXtyZXR1cm4icGVyc3BlY3RpdmUiPT1hJiYicGVyc3BlY3RpdmUiPT1ifHwoIm1hdHJpeCI9PWF8fCJtYXRyaXgzZCI9PWEpJiYoIm1hdHJpeCI9PWJ8fCJtYXRyaXgzZCI9PWIpfSxvPVtdLHA9W10scT1bXTtpZihiLmxlbmd0aCE9Yy5sZW5ndGgpe2lmKCFkKXJldHVybjt2YXIgcj1nKGIsYyk7bz1bclswXV0scD1bclsxXV0scT1bWyJtYXRyaXgiLFtyWzJdXV1dfWVsc2UgZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspe3ZhciBqLHM9YltmXS50LHQ9Y1tmXS50LHU9YltmXS5kLHY9Y1tmXS5kLHc9bltzXSx4PW5bdF07aWYobShzLHQpKXtpZighZClyZXR1cm47dmFyIHI9ZyhbYltmXV0sW2NbZl1dKTtvLnB1c2goclswXSkscC5wdXNoKHJbMV0pLHEucHVzaChbIm1hdHJpeCIsW3JbMl1dXSl9ZWxzZXtpZihzPT10KWo9cztlbHNlIGlmKHdbMl0mJnhbMl0mJmgocyk9PWgodCkpaj1oKHMpLHU9d1syXSh1KSx2PXhbMl0odik7ZWxzZXtpZighd1sxXXx8IXhbMV18fGkocykhPWkodCkpe2lmKCFkKXJldHVybjt2YXIgcj1nKGIsYyk7bz1bclswXV0scD1bclsxXV0scT1bWyJtYXRyaXgiLFtyWzJdXV1dO2JyZWFrfWo9aShzKSx1PXdbMV0odSksdj14WzFdKHYpfWZvcih2YXIgeT1bXSx6PVtdLEE9W10sQj0wO0I8dS5sZW5ndGg7QisrKXt2YXIgQz0ibnVtYmVyIj09dHlwZW9mIHVbQl0/YS5tZXJnZU51bWJlcnM6YS5tZXJnZURpbWVuc2lvbnMscj1DKHVbQl0sdltCXSk7eVtCXT1yWzBdLHpbQl09clsxXSxBLnB1c2goclsyXSl9by5wdXNoKHkpLHAucHVzaCh6KSxxLnB1c2goW2osQV0pfX1pZihlKXt2YXIgRD1vO289cCxwPUR9cmV0dXJuW28scCxmdW5jdGlvbihhKXtyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1hLm1hcChmdW5jdGlvbihhLGMpe3JldHVybiBxW2JdWzFdW2NdKGEpfSkuam9pbigiLCIpO3JldHVybiJtYXRyaXgiPT1xW2JdWzBdJiYxNj09Yy5zcGxpdCgiLCIpLmxlbmd0aCYmKHFbYl1bMF09Im1hdHJpeDNkIikscVtiXVswXSsiKCIrYysiKSJ9KS5qb2luKCIgIil9XX12YXIgaz1udWxsLGw9e3B4OjB9LG09e2RlZzowfSxuPXttYXRyaXg6WyJOTk5OTk4iLFtrLGssMCwwLGssaywwLDAsMCwwLDEsMCxrLGssMCwxXSxkXSxtYXRyaXgzZDpbIk5OTk5OTk5OTk5OTk5OTk4iLGRdLHJvdGF0ZTpbIkEiXSxyb3RhdGV4OlsiQSJdLHJvdGF0ZXk6WyJBIl0scm90YXRlejpbIkEiXSxyb3RhdGUzZDpbIk5OTkEiXSxwZXJzcGVjdGl2ZTpbIkwiXSxzY2FsZTpbIk5uIixjKFtrLGssMV0pLGRdLHNjYWxleDpbIk4iLGMoW2ssMSwxXSksYyhbaywxXSldLHNjYWxleTpbIk4iLGMoWzEsaywxXSksYyhbMSxrXSldLHNjYWxlejpbIk4iLGMoWzEsMSxrXSldLHNjYWxlM2Q6WyJOTk4iLGRdLHNrZXc6WyJBYSIsbnVsbCxkXSxza2V3eDpbIkEiLG51bGwsYyhbayxtXSldLHNrZXd5OlsiQSIsbnVsbCxjKFttLGtdKV0sdHJhbnNsYXRlOlsiVHQiLGMoW2ssayxsXSksZF0sdHJhbnNsYXRleDpbIlQiLGMoW2ssbCxsXSksYyhbayxsXSldLHRyYW5zbGF0ZXk6WyJUIixjKFtsLGssbF0pLGMoW2wsa10pXSx0cmFuc2xhdGV6OlsiTCIsYyhbbCxsLGtdKV0sdHJhbnNsYXRlM2Q6WyJUVEwiLGRdfTthLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsaixbInRyYW5zZm9ybSJdKSxhLnRyYW5zZm9ybVRvU3ZnTWF0cml4PWZ1bmN0aW9uKGIpe3ZhciBjPWEudHJhbnNmb3JtTGlzdFRvTWF0cml4KGUoYikpO3JldHVybiJtYXRyaXgoIitmKGNbMF0pKyIgIitmKGNbMV0pKyIgIitmKGNbNF0pKyIgIitmKGNbNV0pKyIgIitmKGNbMTJdKSsiICIrZihjWzEzXSkrIikifX0oYiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7Yi5jb25jYXQoW2FdKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlJiYoZFthXT1iKSxlW2JdPWF9KX12YXIgZD17fSxlPXt9O2MoInRyYW5zZm9ybSIsWyJ3ZWJraXRUcmFuc2Zvcm0iLCJtc1RyYW5zZm9ybSJdKSxjKCJ0cmFuc2Zvcm1PcmlnaW4iLFsid2Via2l0VHJhbnNmb3JtT3JpZ2luIl0pLGMoInBlcnNwZWN0aXZlIixbIndlYmtpdFBlcnNwZWN0aXZlIl0pLGMoInBlcnNwZWN0aXZlT3JpZ2luIixbIndlYmtpdFBlcnNwZWN0aXZlT3JpZ2luIl0pLGEucHJvcGVydHlOYW1lPWZ1bmN0aW9uKGEpe3JldHVybiBkW2FdfHxhfSxhLnVucHJlZml4ZWRQcm9wZXJ0eU5hbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIGVbYV18fGF9fShiKX0oKSxmdW5jdGlvbigpe2lmKHZvaWQgMD09PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLmFuaW1hdGUoW10pLm9uY2FuY2VsKXt2YXIgYTtpZih3aW5kb3cucGVyZm9ybWFuY2UmJnBlcmZvcm1hbmNlLm5vdyl2YXIgYT1mdW5jdGlvbigpe3JldHVybiBwZXJmb3JtYW5jZS5ub3coKX07ZWxzZSB2YXIgYT1mdW5jdGlvbigpe3JldHVybiBEYXRlLm5vdygpfTt2YXIgYj1mdW5jdGlvbihhLGIsYyl7dGhpcy50YXJnZXQ9YSx0aGlzLmN1cnJlbnRUaW1lPWIsdGhpcy50aW1lbGluZVRpbWU9Yyx0aGlzLnR5cGU9ImNhbmNlbCIsdGhpcy5idWJibGVzPSExLHRoaXMuY2FuY2VsYWJsZT0hMSx0aGlzLmN1cnJlbnRUYXJnZXQ9YSx0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITEsdGhpcy5ldmVudFBoYXNlPUV2ZW50LkFUX1RBUkdFVCx0aGlzLnRpbWVTdGFtcD1EYXRlLm5vdygpfSxjPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlO3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGQsZSl7dmFyIGY9Yy5jYWxsKHRoaXMsZCxlKTtmLl9jYW5jZWxIYW5kbGVycz1bXSxmLm9uY2FuY2VsPW51bGw7dmFyIGc9Zi5jYW5jZWw7Zi5jYW5jZWw9ZnVuY3Rpb24oKXtnLmNhbGwodGhpcyk7dmFyIGM9bmV3IGIodGhpcyxudWxsLGEoKSksZD10aGlzLl9jYW5jZWxIYW5kbGVycy5jb25jYXQodGhpcy5vbmNhbmNlbD9bdGhpcy5vbmNhbmNlbF06W10pO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtkLmZvckVhY2goZnVuY3Rpb24oYSl7YS5jYWxsKGMudGFyZ2V0LGMpfSl9LDApfTt2YXIgaD1mLmFkZEV2ZW50TGlzdGVuZXI7Zi5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYil7ImZ1bmN0aW9uIj09dHlwZW9mIGImJiJjYW5jZWwiPT1hP3RoaXMuX2NhbmNlbEhhbmRsZXJzLnB1c2goYik6aC5jYWxsKHRoaXMsYSxiKX07dmFyIGk9Zi5yZW1vdmVFdmVudExpc3RlbmVyO3JldHVybiBmLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiKXtpZigiY2FuY2VsIj09YSl7dmFyIGM9dGhpcy5fY2FuY2VsSGFuZGxlcnMuaW5kZXhPZihiKTtjPj0wJiZ0aGlzLl9jYW5jZWxIYW5kbGVycy5zcGxpY2UoYywxKX1lbHNlIGkuY2FsbCh0aGlzLGEsYil9LGZ9fX0oKSxmdW5jdGlvbihhKXt2YXIgYj1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsYz1udWxsLGQ9ITE7dHJ5e3ZhciBlPWdldENvbXB1dGVkU3R5bGUoYikuZ2V0UHJvcGVydHlWYWx1ZSgib3BhY2l0eSIpLGY9IjAiPT1lPyIxIjoiMCI7Yz1iLmFuaW1hdGUoe29wYWNpdHk6W2YsZl19LHtkdXJhdGlvbjoxfSksYy5jdXJyZW50VGltZT0wLGQ9Z2V0Q29tcHV0ZWRTdHlsZShiKS5nZXRQcm9wZXJ0eVZhbHVlKCJvcGFjaXR5Iik9PWZ9Y2F0Y2goYSl7fWZpbmFsbHl7YyYmYy5jYW5jZWwoKX1pZighZCl7dmFyIGc9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFuaW1hdGU7d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24oYixjKXtyZXR1cm4gd2luZG93LlN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yJiZBcnJheS5wcm90b3R5cGUuZnJvbSYmYltTeW1ib2wuaXRlcmF0b3JdJiYoYj1BcnJheS5mcm9tKGIpKSxBcnJheS5pc0FycmF5KGIpfHxudWxsPT09Ynx8KGI9YS5jb252ZXJ0VG9BcnJheUZvcm0oYikpLGcuY2FsbCh0aGlzLGIsYyl9fX0oYSksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7dmFyIGM9Yi50aW1lbGluZTtjLmN1cnJlbnRUaW1lPWEsYy5fZGlzY2FyZEFuaW1hdGlvbnMoKSwwPT1jLl9hbmltYXRpb25zLmxlbmd0aD9mPSExOnJlcXVlc3RBbmltYXRpb25GcmFtZShkKX12YXIgZT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIGUoZnVuY3Rpb24oYyl7Yi50aW1lbGluZS5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCksYShjKSxiLnRpbWVsaW5lLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKX0pfSxiLkFuaW1hdGlvblRpbWVsaW5lPWZ1bmN0aW9uKCl7dGhpcy5fYW5pbWF0aW9ucz1bXSx0aGlzLmN1cnJlbnRUaW1lPXZvaWQgMH0sYi5BbmltYXRpb25UaW1lbGluZS5wcm90b3R5cGU9e2dldEFuaW1hdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzY2FyZEFuaW1hdGlvbnMoKSx0aGlzLl9hbmltYXRpb25zLnNsaWNlKCl9LF91cGRhdGVBbmltYXRpb25zUHJvbWlzZXM6ZnVuY3Rpb24oKXtiLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXM9Yi5hbmltYXRpb25zV2l0aFByb21pc2VzLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS5fdXBkYXRlUHJvbWlzZXMoKX0pfSxfZGlzY2FyZEFuaW1hdGlvbnM6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKSx0aGlzLl9hbmltYXRpb25zPXRoaXMuX2FuaW1hdGlvbnMuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJmaW5pc2hlZCIhPWEucGxheVN0YXRlJiYiaWRsZSIhPWEucGxheVN0YXRlfSl9LF9wbGF5OmZ1bmN0aW9uKGEpe3ZhciBjPW5ldyBiLkFuaW1hdGlvbihhLHRoaXMpO3JldHVybiB0aGlzLl9hbmltYXRpb25zLnB1c2goYyksYi5yZXN0YXJ0V2ViQW5pbWF0aW9uc05leHRUaWNrKCksYy5fdXBkYXRlUHJvbWlzZXMoKSxjLl9hbmltYXRpb24ucGxheSgpLGMuX3VwZGF0ZVByb21pc2VzKCksY30scGxheTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5yZW1vdmUoKSx0aGlzLl9wbGF5KGEpfX07dmFyIGY9ITE7Yi5yZXN0YXJ0V2ViQW5pbWF0aW9uc05leHRUaWNrPWZ1bmN0aW9uKCl7Znx8KGY9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGQpKX07dmFyIGc9bmV3IGIuQW5pbWF0aW9uVGltZWxpbmU7Yi50aW1lbGluZT1nO3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LmRvY3VtZW50LCJ0aW1lbGluZSIse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZ319KX1jYXRjaChhKXt9dHJ5e3dpbmRvdy5kb2N1bWVudC50aW1lbGluZT1nfWNhdGNoKGEpe319KDAsYyksZnVuY3Rpb24oYSxiLGMpe2IuYW5pbWF0aW9uc1dpdGhQcm9taXNlcz1bXSxiLkFuaW1hdGlvbj1mdW5jdGlvbihiLGMpe2lmKHRoaXMuaWQ9IiIsYiYmYi5faWQmJih0aGlzLmlkPWIuX2lkKSx0aGlzLmVmZmVjdD1iLGImJihiLl9hbmltYXRpb249dGhpcyksIWMpdGhyb3cgbmV3IEVycm9yKCJBbmltYXRpb24gd2l0aCBudWxsIHRpbWVsaW5lIGlzIG5vdCBzdXBwb3J0ZWQiKTt0aGlzLl90aW1lbGluZT1jLHRoaXMuX3NlcXVlbmNlTnVtYmVyPWEuc2VxdWVuY2VOdW1iZXIrKyx0aGlzLl9ob2xkVGltZT0wLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9pc0dyb3VwPSExLHRoaXMuX2FuaW1hdGlvbj1udWxsLHRoaXMuX2NoaWxkQW5pbWF0aW9ucz1bXSx0aGlzLl9jYWxsYmFjaz1udWxsLHRoaXMuX29sZFBsYXlTdGF0ZT0iaWRsZSIsdGhpcy5fcmVidWlsZFVuZGVybHlpbmdBbmltYXRpb24oKSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sYi5BbmltYXRpb24ucHJvdG90eXBlPXtfdXBkYXRlUHJvbWlzZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9vbGRQbGF5U3RhdGUsYj10aGlzLnBsYXlTdGF0ZTtyZXR1cm4gdGhpcy5fcmVhZHlQcm9taXNlJiZiIT09YSYmKCJpZGxlIj09Yj8odGhpcy5fcmVqZWN0UmVhZHlQcm9taXNlKCksdGhpcy5fcmVhZHlQcm9taXNlPXZvaWQgMCk6InBlbmRpbmciPT1hP3RoaXMuX3Jlc29sdmVSZWFkeVByb21pc2UoKToicGVuZGluZyI9PWImJih0aGlzLl9yZWFkeVByb21pc2U9dm9pZCAwKSksdGhpcy5fZmluaXNoZWRQcm9taXNlJiZiIT09YSYmKCJpZGxlIj09Yj8odGhpcy5fcmVqZWN0RmluaXNoZWRQcm9taXNlKCksdGhpcy5fZmluaXNoZWRQcm9taXNlPXZvaWQgMCk6ImZpbmlzaGVkIj09Yj90aGlzLl9yZXNvbHZlRmluaXNoZWRQcm9taXNlKCk6ImZpbmlzaGVkIj09YSYmKHRoaXMuX2ZpbmlzaGVkUHJvbWlzZT12b2lkIDApKSx0aGlzLl9vbGRQbGF5U3RhdGU9dGhpcy5wbGF5U3RhdGUsdGhpcy5fcmVhZHlQcm9taXNlfHx0aGlzLl9maW5pc2hlZFByb21pc2V9LF9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbjpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGEsYyxkLGUsZj0hIXRoaXMuX2FuaW1hdGlvbjtmJiYoYT10aGlzLnBsYXliYWNrUmF0ZSxjPXRoaXMuX3BhdXNlZCxkPXRoaXMuc3RhcnRUaW1lLGU9dGhpcy5jdXJyZW50VGltZSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fYW5pbWF0aW9uLl93cmFwcGVyPW51bGwsdGhpcy5fYW5pbWF0aW9uPW51bGwpLCghdGhpcy5lZmZlY3R8fHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LktleWZyYW1lRWZmZWN0KSYmKHRoaXMuX2FuaW1hdGlvbj1iLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdCh0aGlzLmVmZmVjdCksYi5iaW5kQW5pbWF0aW9uRm9yS2V5ZnJhbWVFZmZlY3QodGhpcykpLCh0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdHx8dGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuR3JvdXBFZmZlY3QpJiYodGhpcy5fYW5pbWF0aW9uPWIubmV3VW5kZXJseWluZ0FuaW1hdGlvbkZvckdyb3VwKHRoaXMuZWZmZWN0KSxiLmJpbmRBbmltYXRpb25Gb3JHcm91cCh0aGlzKSksdGhpcy5lZmZlY3QmJnRoaXMuZWZmZWN0Ll9vbnNhbXBsZSYmYi5iaW5kQW5pbWF0aW9uRm9yQ3VzdG9tRWZmZWN0KHRoaXMpLGYmJigxIT1hJiYodGhpcy5wbGF5YmFja1JhdGU9YSksbnVsbCE9PWQ/dGhpcy5zdGFydFRpbWU9ZDpudWxsIT09ZT90aGlzLmN1cnJlbnRUaW1lPWU6bnVsbCE9PXRoaXMuX2hvbGRUaW1lJiYodGhpcy5jdXJyZW50VGltZT10aGlzLl9ob2xkVGltZSksYyYmdGhpcy5wYXVzZSgpKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxfdXBkYXRlQ2hpbGRyZW46ZnVuY3Rpb24oKXtpZih0aGlzLmVmZmVjdCYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSl7dmFyIGE9dGhpcy5lZmZlY3QuX3RpbWluZy5kZWxheTt0aGlzLl9jaGlsZEFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbihjKXt0aGlzLl9hcnJhbmdlQ2hpbGRyZW4oYyxhKSx0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdCYmKGErPWIuZ3JvdXBDaGlsZER1cmF0aW9uKGMuZWZmZWN0KSl9LmJpbmQodGhpcykpfX0sX3NldEV4dGVybmFsQW5pbWF0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuZWZmZWN0JiZ0aGlzLl9pc0dyb3VwKWZvcih2YXIgYj0wO2I8dGhpcy5lZmZlY3QuY2hpbGRyZW4ubGVuZ3RoO2IrKyl0aGlzLmVmZmVjdC5jaGlsZHJlbltiXS5fYW5pbWF0aW9uPWEsdGhpcy5fY2hpbGRBbmltYXRpb25zW2JdLl9zZXRFeHRlcm5hbEFuaW1hdGlvbihhKX0sX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9uczpmdW5jdGlvbigpe2lmKHRoaXMuZWZmZWN0JiZ0aGlzLl9pc0dyb3VwKXt2YXIgYT10aGlzLmVmZmVjdC5fdGltaW5nLmRlbGF5O3RoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpLHRoaXMuZWZmZWN0LmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9Yi50aW1lbGluZS5fcGxheShjKTt0aGlzLl9jaGlsZEFuaW1hdGlvbnMucHVzaChkKSxkLnBsYXliYWNrUmF0ZT10aGlzLnBsYXliYWNrUmF0ZSx0aGlzLl9wYXVzZWQmJmQucGF1c2UoKSxjLl9hbmltYXRpb249dGhpcy5lZmZlY3QuX2FuaW1hdGlvbix0aGlzLl9hcnJhbmdlQ2hpbGRyZW4oZCxhKSx0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdCYmKGErPWIuZ3JvdXBDaGlsZER1cmF0aW9uKGMpKX0uYmluZCh0aGlzKSl9fSxfYXJyYW5nZUNoaWxkcmVuOmZ1bmN0aW9uKGEsYil7bnVsbD09PXRoaXMuc3RhcnRUaW1lP2EuY3VycmVudFRpbWU9dGhpcy5jdXJyZW50VGltZS1iL3RoaXMucGxheWJhY2tSYXRlOmEuc3RhcnRUaW1lIT09dGhpcy5zdGFydFRpbWUrYi90aGlzLnBsYXliYWNrUmF0ZSYmKGEuc3RhcnRUaW1lPXRoaXMuc3RhcnRUaW1lK2IvdGhpcy5wbGF5YmFja1JhdGUpfSxnZXQgdGltZWxpbmUoKXtyZXR1cm4gdGhpcy5fdGltZWxpbmV9LGdldCBwbGF5U3RhdGUoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uP3RoaXMuX2FuaW1hdGlvbi5wbGF5U3RhdGU6ImlkbGUifSxnZXQgZmluaXNoZWQoKXtyZXR1cm4gd2luZG93LlByb21pc2U/KHRoaXMuX2ZpbmlzaGVkUHJvbWlzZXx8KC0xPT1iLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMuaW5kZXhPZih0aGlzKSYmYi5hbmltYXRpb25zV2l0aFByb21pc2VzLnB1c2godGhpcyksdGhpcy5fZmluaXNoZWRQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYil7dGhpcy5fcmVzb2x2ZUZpbmlzaGVkUHJvbWlzZT1mdW5jdGlvbigpe2EodGhpcyl9LHRoaXMuX3JlamVjdEZpbmlzaGVkUHJvbWlzZT1mdW5jdGlvbigpe2Ioe3R5cGU6RE9NRXhjZXB0aW9uLkFCT1JUX0VSUixuYW1lOiJBYm9ydEVycm9yIn0pfX0uYmluZCh0aGlzKSksImZpbmlzaGVkIj09dGhpcy5wbGF5U3RhdGUmJnRoaXMuX3Jlc29sdmVGaW5pc2hlZFByb21pc2UoKSksdGhpcy5fZmluaXNoZWRQcm9taXNlKTooY29uc29sZS53YXJuKCJBbmltYXRpb24gUHJvbWlzZXMgcmVxdWlyZSBKYXZhU2NyaXB0IFByb21pc2UgY29uc3RydWN0b3IiKSxudWxsKX0sZ2V0IHJlYWR5KCl7cmV0dXJuIHdpbmRvdy5Qcm9taXNlPyh0aGlzLl9yZWFkeVByb21pc2V8fCgtMT09Yi5hbmltYXRpb25zV2l0aFByb21pc2VzLmluZGV4T2YodGhpcykmJmIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5wdXNoKHRoaXMpLHRoaXMuX3JlYWR5UHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihhLGIpe3RoaXMuX3Jlc29sdmVSZWFkeVByb21pc2U9ZnVuY3Rpb24oKXthKHRoaXMpfSx0aGlzLl9yZWplY3RSZWFkeVByb21pc2U9ZnVuY3Rpb24oKXtiKHt0eXBlOkRPTUV4Y2VwdGlvbi5BQk9SVF9FUlIsbmFtZToiQWJvcnRFcnJvciJ9KX19LmJpbmQodGhpcykpLCJwZW5kaW5nIiE9PXRoaXMucGxheVN0YXRlJiZ0aGlzLl9yZXNvbHZlUmVhZHlQcm9taXNlKCkpLHRoaXMuX3JlYWR5UHJvbWlzZSk6KGNvbnNvbGUud2FybigiQW5pbWF0aW9uIFByb21pc2VzIHJlcXVpcmUgSmF2YVNjcmlwdCBQcm9taXNlIGNvbnN0cnVjdG9yIiksbnVsbCl9LGdldCBvbmZpbmlzaCgpe3JldHVybiB0aGlzLl9hbmltYXRpb24ub25maW5pc2h9LHNldCBvbmZpbmlzaChhKXt0aGlzLl9hbmltYXRpb24ub25maW5pc2g9ImZ1bmN0aW9uIj09dHlwZW9mIGE/ZnVuY3Rpb24oYil7Yi50YXJnZXQ9dGhpcyxhLmNhbGwodGhpcyxiKX0uYmluZCh0aGlzKTphfSxnZXQgb25jYW5jZWwoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsfSxzZXQgb25jYW5jZWwoYSl7dGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsPSJmdW5jdGlvbiI9PXR5cGVvZiBhP2Z1bmN0aW9uKGIpe2IudGFyZ2V0PXRoaXMsYS5jYWxsKHRoaXMsYil9LmJpbmQodGhpcyk6YX0sZ2V0IGN1cnJlbnRUaW1lKCl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKTt2YXIgYT10aGlzLl9hbmltYXRpb24uY3VycmVudFRpbWU7cmV0dXJuIHRoaXMuX3VwZGF0ZVByb21pc2VzKCksYX0sc2V0IGN1cnJlbnRUaW1lKGEpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5fYW5pbWF0aW9uLmN1cnJlbnRUaW1lPWlzRmluaXRlKGEpP2E6TWF0aC5zaWduKGEpKk51bWJlci5NQVhfVkFMVUUsdGhpcy5fcmVnaXN0ZXIoKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYixjKXtiLmN1cnJlbnRUaW1lPWEtY30pLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGdldCBzdGFydFRpbWUoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uLnN0YXJ0VGltZX0sc2V0IHN0YXJ0VGltZShhKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5zdGFydFRpbWU9aXNGaW5pdGUoYSk/YTpNYXRoLnNpZ24oYSkqTnVtYmVyLk1BWF9WQUxVRSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihiLGMpe2Iuc3RhcnRUaW1lPWErY30pLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGdldCBwbGF5YmFja1JhdGUoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uLnBsYXliYWNrUmF0ZX0sc2V0IHBsYXliYWNrUmF0ZShhKXt0aGlzLl91cGRhdGVQcm9taXNlcygpO3ZhciBiPXRoaXMuY3VycmVudFRpbWU7dGhpcy5fYW5pbWF0aW9uLnBsYXliYWNrUmF0ZT1hLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihiKXtiLnBsYXliYWNrUmF0ZT1hfSksbnVsbCE9PWImJih0aGlzLmN1cnJlbnRUaW1lPWIpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9hbmltYXRpb24ucGxheSgpLC0xPT10aGlzLl90aW1lbGluZS5fYW5pbWF0aW9ucy5pbmRleE9mKHRoaXMpJiZ0aGlzLl90aW1lbGluZS5fYW5pbWF0aW9ucy5wdXNoKHRoaXMpLHRoaXMuX3JlZ2lzdGVyKCksYi5hd2FpdFN0YXJ0VGltZSh0aGlzKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYSl7dmFyIGI9YS5jdXJyZW50VGltZTthLnBsYXkoKSxhLmN1cnJlbnRUaW1lPWJ9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5jdXJyZW50VGltZSYmKHRoaXMuX2hvbGRUaW1lPXRoaXMuY3VycmVudFRpbWUpLHRoaXMuX2FuaW1hdGlvbi5wYXVzZSgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pLHRoaXMuX3BhdXNlZD0hMCx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxmaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5maW5pc2goKSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGNhbmNlbDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5fYW5pbWF0aW9uLmNhbmNlbCgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0scmV2ZXJzZTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGE9dGhpcy5jdXJyZW50VGltZTt0aGlzLl9hbmltYXRpb24ucmV2ZXJzZSgpLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihhKXthLnJldmVyc2UoKX0pLG51bGwhPT1hJiYodGhpcy5jdXJyZW50VGltZT1hKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YjsiZnVuY3Rpb24iPT10eXBlb2YgYiYmKGM9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9dGhpcyxiLmNhbGwodGhpcyxhKX0uYmluZCh0aGlzKSxiLl93cmFwcGVyPWMpLHRoaXMuX2FuaW1hdGlvbi5hZGRFdmVudExpc3RlbmVyKGEsYyl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXt0aGlzLl9hbmltYXRpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGImJmIuX3dyYXBwZXJ8fGIpfSxfcmVtb3ZlQ2hpbGRBbmltYXRpb25zOmZ1bmN0aW9uKCl7Zm9yKDt0aGlzLl9jaGlsZEFuaW1hdGlvbnMubGVuZ3RoOyl0aGlzLl9jaGlsZEFuaW1hdGlvbnMucG9wKCkuY2FuY2VsKCl9LF9mb3JFYWNoQ2hpbGQ6ZnVuY3Rpb24oYil7dmFyIGM9MDtpZih0aGlzLmVmZmVjdC5jaGlsZHJlbiYmdGhpcy5fY2hpbGRBbmltYXRpb25zLmxlbmd0aDx0aGlzLmVmZmVjdC5jaGlsZHJlbi5sZW5ndGgmJnRoaXMuX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9ucygpLHRoaXMuX2NoaWxkQW5pbWF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2IuY2FsbCh0aGlzLGEsYyksdGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuU2VxdWVuY2VFZmZlY3QmJihjKz1hLmVmZmVjdC5hY3RpdmVEdXJhdGlvbil9LmJpbmQodGhpcykpLCJwZW5kaW5nIiE9dGhpcy5wbGF5U3RhdGUpe3ZhciBkPXRoaXMuZWZmZWN0Ll90aW1pbmcsZT10aGlzLmN1cnJlbnRUaW1lO251bGwhPT1lJiYoZT1hLmNhbGN1bGF0ZUl0ZXJhdGlvblByb2dyZXNzKGEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb24oZCksZSxkKSksKG51bGw9PWV8fGlzTmFOKGUpKSYmdGhpcy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCl9fX0sd2luZG93LkFuaW1hdGlvbj1iLkFuaW1hdGlvbn0oYSxjKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChiKXt0aGlzLl9mcmFtZXM9YS5ub3JtYWxpemVLZXlmcmFtZXMoYil9ZnVuY3Rpb24gZSgpe2Zvcih2YXIgYT0hMTtpLmxlbmd0aDspaS5zaGlmdCgpLl91cGRhdGVDaGlsZHJlbigpLGE9ITA7cmV0dXJuIGF9dmFyIGY9ZnVuY3Rpb24oYSl7aWYoYS5fYW5pbWF0aW9uPXZvaWQgMCxhIGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0fHxhIGluc3RhbmNlb2Ygd2luZG93Lkdyb3VwRWZmZWN0KWZvcih2YXIgYj0wO2I8YS5jaGlsZHJlbi5sZW5ndGg7YisrKWYoYS5jaGlsZHJlbltiXSl9O2IucmVtb3ZlTXVsdGk9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtkLl9wYXJlbnQ/KC0xPT1iLmluZGV4T2YoZC5fcGFyZW50KSYmYi5wdXNoKGQuX3BhcmVudCksZC5fcGFyZW50LmNoaWxkcmVuLnNwbGljZShkLl9wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihkKSwxKSxkLl9wYXJlbnQ9bnVsbCxmKGQpKTpkLl9hbmltYXRpb24mJmQuX2FuaW1hdGlvbi5lZmZlY3Q9PWQmJihkLl9hbmltYXRpb24uY2FuY2VsKCksZC5fYW5pbWF0aW9uLmVmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QobnVsbCxbXSksZC5fYW5pbWF0aW9uLl9jYWxsYmFjayYmKGQuX2FuaW1hdGlvbi5fY2FsbGJhY2suX2FuaW1hdGlvbj1udWxsKSxkLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCksZihkKSl9Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLl9yZWJ1aWxkKCl9LGIuS2V5ZnJhbWVFZmZlY3Q9ZnVuY3Rpb24oYixjLGUsZil7cmV0dXJuIHRoaXMudGFyZ2V0PWIsdGhpcy5fcGFyZW50PW51bGwsZT1hLm51bWVyaWNUaW1pbmdUb09iamVjdChlKSx0aGlzLl90aW1pbmdJbnB1dD1hLmNsb25lVGltaW5nSW5wdXQoZSksdGhpcy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoZSksdGhpcy50aW1pbmc9YS5tYWtlVGltaW5nKGUsITEsdGhpcyksdGhpcy50aW1pbmcuX2VmZmVjdD10aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBjPyhhLmRlcHJlY2F0ZWQoIkN1c3RvbSBLZXlmcmFtZUVmZmVjdCIsIjIwMTUtMDYtMjIiLCJVc2UgS2V5ZnJhbWVFZmZlY3Qub25zYW1wbGUgaW5zdGVhZC4iKSx0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzPWMpOnRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM9bmV3IGQoYyksdGhpcy5fa2V5ZnJhbWVzPWMsdGhpcy5hY3RpdmVEdXJhdGlvbj1hLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKHRoaXMuX3RpbWluZyksdGhpcy5faWQ9Zix0aGlzfSxiLktleWZyYW1lRWZmZWN0LnByb3RvdHlwZT17Z2V0RnJhbWVzOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM/dGhpcy5fbm9ybWFsaXplZEtleWZyYW1lczp0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzLl9mcmFtZXN9LHNldCBvbnNhbXBsZShhKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5nZXRGcmFtZXMoKSl0aHJvdyBuZXcgRXJyb3IoIlNldHRpbmcgb25zYW1wbGUgb24gY3VzdG9tIGVmZmVjdCBLZXlmcmFtZUVmZmVjdCBpcyBub3Qgc3VwcG9ydGVkLiIpO3RoaXMuX29uc2FtcGxlPWEsdGhpcy5fYW5pbWF0aW9uJiZ0aGlzLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCl9LGdldCBwYXJlbnQoKXtyZXR1cm4gdGhpcy5fcGFyZW50fSxjbG9uZTpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmdldEZyYW1lcygpKXRocm93IG5ldyBFcnJvcigiQ2xvbmluZyBjdXN0b20gZWZmZWN0cyBpcyBub3Qgc3VwcG9ydGVkLiIpO3ZhciBiPW5ldyBLZXlmcmFtZUVmZmVjdCh0aGlzLnRhcmdldCxbXSxhLmNsb25lVGltaW5nSW5wdXQodGhpcy5fdGltaW5nSW5wdXQpLHRoaXMuX2lkKTtyZXR1cm4gYi5fbm9ybWFsaXplZEtleWZyYW1lcz10aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzLGIuX2tleWZyYW1lcz10aGlzLl9rZXlmcmFtZXMsYn0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVNdWx0aShbdGhpc10pfX07dmFyIGc9RWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZTtFbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9IiI7cmV0dXJuIGMmJmMuaWQmJihkPWMuaWQpLGIudGltZWxpbmUuX3BsYXkobmV3IGIuS2V5ZnJhbWVFZmZlY3QodGhpcyxhLGMsZCkpfTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKTtiLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihhKXtpZihhKXt2YXIgYj1hLnRhcmdldHx8aCxjPWEuX2tleWZyYW1lczsiZnVuY3Rpb24iPT10eXBlb2YgYyYmKGM9W10pO3ZhciBkPWEuX3RpbWluZ0lucHV0O2QuaWQ9YS5faWR9ZWxzZSB2YXIgYj1oLGM9W10sZD0wO3JldHVybiBnLmFwcGx5KGIsW2MsZF0pfSxiLmJpbmRBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihhKXthLmVmZmVjdCYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZWZmZWN0Ll9ub3JtYWxpemVkS2V5ZnJhbWVzJiZiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3QoYSl9O3ZhciBpPVtdO2IuYXdhaXRTdGFydFRpbWU9ZnVuY3Rpb24oYSl7bnVsbD09PWEuc3RhcnRUaW1lJiZhLl9pc0dyb3VwJiYoMD09aS5sZW5ndGgmJnJlcXVlc3RBbmltYXRpb25GcmFtZShlKSxpLnB1c2goYSkpfTt2YXIgaj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZTtPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCJnZXRDb21wdXRlZFN0eWxlIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXtiLnRpbWVsaW5lLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKTt2YXIgYT1qLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZSgpJiYoYT1qLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksYi50aW1lbGluZS5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCksYX19KSx3aW5kb3cuS2V5ZnJhbWVFZmZlY3Q9Yi5LZXlmcmFtZUVmZmVjdCx3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuZ2V0QW5pbWF0aW9ucz1mdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC50aW1lbGluZS5nZXRBbmltYXRpb25zKCkuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT09YS5lZmZlY3QmJmEuZWZmZWN0LnRhcmdldD09dGhpc30uYmluZCh0aGlzKSl9fShhLGMpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe2EuX3JlZ2lzdGVyZWR8fChhLl9yZWdpc3RlcmVkPSEwLGcucHVzaChhKSxofHwoaD0hMCxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZSkpKX1mdW5jdGlvbiBlKGEpe3ZhciBiPWc7Zz1bXSxiLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5fc2VxdWVuY2VOdW1iZXItYi5fc2VxdWVuY2VOdW1iZXJ9KSxiPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe2EoKTt2YXIgYj1hLl9hbmltYXRpb24/YS5fYW5pbWF0aW9uLnBsYXlTdGF0ZToiaWRsZSI7cmV0dXJuInJ1bm5pbmciIT1iJiYicGVuZGluZyIhPWImJihhLl9yZWdpc3RlcmVkPSExKSxhLl9yZWdpc3RlcmVkfSksZy5wdXNoLmFwcGx5KGcsYiksZy5sZW5ndGg/KGg9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpKTpoPSExfXZhciBmPShkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKSwwKTtiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3Q9ZnVuY3Rpb24oYil7dmFyIGMsZT1iLmVmZmVjdC50YXJnZXQsZz0iZnVuY3Rpb24iPT10eXBlb2YgYi5lZmZlY3QuZ2V0RnJhbWVzKCk7Yz1nP2IuZWZmZWN0LmdldEZyYW1lcygpOmIuZWZmZWN0Ll9vbnNhbXBsZTt2YXIgaD1iLmVmZmVjdC50aW1pbmcsaT1udWxsO2g9YS5ub3JtYWxpemVUaW1pbmdJbnB1dChoKTt2YXIgaj1mdW5jdGlvbigpe3ZhciBkPWouX2FuaW1hdGlvbj9qLl9hbmltYXRpb24uY3VycmVudFRpbWU6bnVsbDtudWxsIT09ZCYmKGQ9YS5jYWxjdWxhdGVJdGVyYXRpb25Qcm9ncmVzcyhhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGgpLGQsaCksaXNOYU4oZCkmJihkPW51bGwpKSxkIT09aSYmKGc/YyhkLGUsYi5lZmZlY3QpOmMoZCxiLmVmZmVjdCxiLmVmZmVjdC5fYW5pbWF0aW9uKSksaT1kfTtqLl9hbmltYXRpb249YixqLl9yZWdpc3RlcmVkPSExLGouX3NlcXVlbmNlTnVtYmVyPWYrKyxiLl9jYWxsYmFjaz1qLGQoail9O3ZhciBnPVtdLGg9ITE7Yi5BbmltYXRpb24ucHJvdG90eXBlLl9yZWdpc3Rlcj1mdW5jdGlvbigpe3RoaXMuX2NhbGxiYWNrJiZkKHRoaXMuX2NhbGxiYWNrKX19KGEsYyksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7cmV0dXJuIGEuX3RpbWluZy5kZWxheSthLmFjdGl2ZUR1cmF0aW9uK2EuX3RpbWluZy5lbmREZWxheX1mdW5jdGlvbiBlKGIsYyxkKXt0aGlzLl9pZD1kLHRoaXMuX3BhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49Ynx8W10sdGhpcy5fcmVwYXJlbnQodGhpcy5jaGlsZHJlbiksYz1hLm51bWVyaWNUaW1pbmdUb09iamVjdChjKSx0aGlzLl90aW1pbmdJbnB1dD1hLmNsb25lVGltaW5nSW5wdXQoYyksdGhpcy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYywhMCksdGhpcy50aW1pbmc9YS5tYWtlVGltaW5nKGMsITAsdGhpcyksdGhpcy50aW1pbmcuX2VmZmVjdD10aGlzLCJhdXRvIj09PXRoaXMuX3RpbWluZy5kdXJhdGlvbiYmKHRoaXMuX3RpbWluZy5kdXJhdGlvbj10aGlzLmFjdGl2ZUR1cmF0aW9uKX13aW5kb3cuU2VxdWVuY2VFZmZlY3Q9ZnVuY3Rpb24oKXtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sd2luZG93Lkdyb3VwRWZmZWN0PWZ1bmN0aW9uKCl7ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlPXtfaXNBbmNlc3RvcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcztudWxsIT09Yjspe2lmKGI9PWEpcmV0dXJuITA7Yj1iLl9wYXJlbnR9cmV0dXJuITF9LF9yZWJ1aWxkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXM7YTspImF1dG8iPT09YS50aW1pbmcuZHVyYXRpb24mJihhLl90aW1pbmcuZHVyYXRpb249YS5hY3RpdmVEdXJhdGlvbiksYT1hLl9wYXJlbnQ7dGhpcy5fYW5pbWF0aW9uJiZ0aGlzLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCl9LF9yZXBhcmVudDpmdW5jdGlvbihhKXtiLnJlbW92ZU11bHRpKGEpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWFbY10uX3BhcmVudD10aGlzfSxfcHV0Q2hpbGQ6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9Yj8iQ2Fubm90IGFwcGVuZCBhbiBhbmNlc3RvciBvciBzZWxmIjoiQ2Fubm90IHByZXBlbmQgYW4gYW5jZXN0b3Igb3Igc2VsZiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWlmKHRoaXMuX2lzQW5jZXN0b3IoYVtkXSkpdGhyb3d7dHlwZTpET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLG5hbWU6IkhpZXJhcmNoeVJlcXVlc3RFcnJvciIsbWVzc2FnZTpjfTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyliP3RoaXMuY2hpbGRyZW4ucHVzaChhW2RdKTp0aGlzLmNoaWxkcmVuLnVuc2hpZnQoYVtkXSk7dGhpcy5fcmVwYXJlbnQoYSksdGhpcy5fcmVidWlsZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXt0aGlzLl9wdXRDaGlsZChhcmd1bWVudHMsITApfSxwcmVwZW5kOmZ1bmN0aW9uKCl7dGhpcy5fcHV0Q2hpbGQoYXJndW1lbnRzLCExKX0sZ2V0IHBhcmVudCgpe3JldHVybiB0aGlzLl9wYXJlbnR9LGdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoP3RoaXMuY2hpbGRyZW5bMF06bnVsbH0sZ2V0IGxhc3RDaGlsZCgpe3JldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aD90aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoLTFdOm51bGx9LGNsb25lOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPWEuY2xvbmVUaW1pbmdJbnB1dCh0aGlzLl90aW1pbmdJbnB1dCksYz1bXSxkPTA7ZDx0aGlzLmNoaWxkcmVuLmxlbmd0aDtkKyspYy5wdXNoKHRoaXMuY2hpbGRyZW5bZF0uY2xvbmUoKSk7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBHcm91cEVmZmVjdD9uZXcgR3JvdXBFZmZlY3QoYyxiKTpuZXcgU2VxdWVuY2VFZmZlY3QoYyxiKX0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVNdWx0aShbdGhpc10pfX0sd2luZG93LlNlcXVlbmNlRWZmZWN0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LlNlcXVlbmNlRWZmZWN0LnByb3RvdHlwZSwiYWN0aXZlRHVyYXRpb24iLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYil7YSs9ZChiKX0pLE1hdGgubWF4KGEsMCl9fSksd2luZG93Lkdyb3VwRWZmZWN0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93Lkdyb3VwRWZmZWN0LnByb3RvdHlwZSwiYWN0aXZlRHVyYXRpb24iLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYil7YT1NYXRoLm1heChhLGQoYikpfSksYX19KSxiLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JHcm91cD1mdW5jdGlvbihjKXt2YXIgZCxlPW51bGwsZj1mdW5jdGlvbihiKXt2YXIgYz1kLl93cmFwcGVyO2lmKGMmJiJwZW5kaW5nIiE9Yy5wbGF5U3RhdGUmJmMuZWZmZWN0KXJldHVybiBudWxsPT1iP3ZvaWQgYy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCk6MD09YiYmYy5wbGF5YmFja1JhdGU8MCYmKGV8fChlPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYy5lZmZlY3QudGltaW5nKSksYj1hLmNhbGN1bGF0ZUl0ZXJhdGlvblByb2dyZXNzKGEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb24oZSksLTEsZSksaXNOYU4oYil8fG51bGw9PWIpPyhjLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYSl7YS5jdXJyZW50VGltZT0tMX0pLHZvaWQgYy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCkpOnZvaWQgMH0sZz1uZXcgS2V5ZnJhbWVFZmZlY3QobnVsbCxbXSxjLl90aW1pbmcsYy5faWQpO3JldHVybiBnLm9uc2FtcGxlPWYsZD1iLnRpbWVsaW5lLl9wbGF5KGcpfSxiLmJpbmRBbmltYXRpb25Gb3JHcm91cD1mdW5jdGlvbihhKXthLl9hbmltYXRpb24uX3dyYXBwZXI9YSxhLl9pc0dyb3VwPSEwLGIuYXdhaXRTdGFydFRpbWUoYSksYS5fY29uc3RydWN0Q2hpbGRBbmltYXRpb25zKCksYS5fc2V0RXh0ZXJuYWxBbmltYXRpb24oYSl9LGIuZ3JvdXBDaGlsZER1cmF0aW9uPWR9KGEsYyl9KCk7CgohKGZ1bmN0aW9uKCl7Ci8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uCgogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiAgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuCgogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgKICAgIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQogICAgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULAogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NCiAgICBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgogICAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCmZ1bmN0aW9uIHQodCxlLG4saSl7dmFyIHIsbz1hcmd1bWVudHMubGVuZ3RoLGE9bzwzP2U6bnVsbD09PWk/aT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsbik6aTtpZigib2JqZWN0Ij09dHlwZW9mIFJlZmxlY3QmJiJmdW5jdGlvbiI9PXR5cGVvZiBSZWZsZWN0LmRlY29yYXRlKWE9UmVmbGVjdC5kZWNvcmF0ZSh0LGUsbixpKTtlbHNlIGZvcih2YXIgcz10Lmxlbmd0aC0xO3M+PTA7cy0tKShyPXRbc10pJiYoYT0obzwzP3IoYSk6bz4zP3IoZSxuLGEpOnIoZSxuKSl8fGEpO3JldHVybiBvPjMmJmEmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4sYSksYX1mdW5jdGlvbiBlKHQsZSl7aWYoIm9iamVjdCI9PXR5cGVvZiBSZWZsZWN0JiYiZnVuY3Rpb24iPT10eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSlyZXR1cm4gUmVmbGVjdC5tZXRhZGF0YSh0LGUpfWZ1bmN0aW9uIG4odCxlLG4saSl7cmV0dXJuIG5ldyhufHwobj1Qcm9taXNlKSkoKGZ1bmN0aW9uKHIsbyl7ZnVuY3Rpb24gYSh0KXt0cnl7bChpLm5leHQodCkpfWNhdGNoKHQpe28odCl9fWZ1bmN0aW9uIHModCl7dHJ5e2woaS50aHJvdyh0KSl9Y2F0Y2godCl7byh0KX19ZnVuY3Rpb24gbCh0KXt0LmRvbmU/cih0LnZhbHVlKTooZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIG4/dDpuZXcgbigoZnVuY3Rpb24oZSl7ZSh0KX0pKX0pKHQudmFsdWUpLnRoZW4oYSxzKX1sKChpPWkuYXBwbHkodCxlfHxbXSkpLm5leHQoKSl9KSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAxNiBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kCiAgICAgKiBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5CiAgICAgKiBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5CiAgICAgKiBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQCiAgICAgKiByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAgKi9mdW5jdGlvbiBpKHQpe3JldHVybiBlPT57aWYodClpZihlLmhhc093blByb3BlcnR5KCJpcyIpKXtpZih0IT09ZS5pcyl0aHJvdyBuZXcgRXJyb3IoYGN1c3RvbSBlbGVtZW50IHRhZyBuYW1lcyBkbyBub3QgbWF0Y2g6ICgke3R9ICE9PSAke2UuaXN9KWApfWVsc2UgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImlzIix7dmFsdWU6dH0pO3dpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoZS5pcyxlKX19ZnVuY3Rpb24gcih0LGUsbil7dC5jb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eSgicHJvcGVydGllcyIpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5jb25zdHJ1Y3RvciwicHJvcGVydGllcyIse3ZhbHVlOnt9fSksdC5jb25zdHJ1Y3Rvci5wcm9wZXJ0aWVzW2VdPU9iamVjdC5hc3NpZ24oe30sdC5jb25zdHJ1Y3Rvci5wcm9wZXJ0aWVzW2VdLG4pfWZ1bmN0aW9uIG8odCl7cmV0dXJuKGUsbik9PntyKGUsbix0KX19ZnVuY3Rpb24gYSguLi50KXtyZXR1cm4oZSxuKT0+e2UuY29uc3RydWN0b3IuaGFzT3duUHJvcGVydHkoIm9ic2VydmVycyIpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5jb25zdHJ1Y3Rvciwib2JzZXJ2ZXJzIix7dmFsdWU6W119KSxlLmNvbnN0cnVjdG9yLm9ic2VydmVycy5wdXNoKGAke259KCR7dC5qb2luKCIsIil9KWApfX1mdW5jdGlvbiBzKHQsLi4uZSl7cmV0dXJuKG4saSxvKT0+e2NvbnN0IGE9YF9fY29tcHV0ZSR7aX1gO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLGEse3ZhbHVlOm8uZ2V0fSksby5nZXQ9dm9pZCAwLHIobixpLHtjb21wdXRlZDpgJHthfSgke1t0LC4uLmVdLmpvaW4oIiwiKX0pYH0pfX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi93aW5kb3cuSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eT1mdW5jdGlvbih0LGUpe3JldHVybiB0fTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KbGV0IGwsYyx1PS8odXJsXCgpKFteKV0qKShcKSkvZyxoPS8oXlwvW15cL10pfCheIyl8KF5bXHctXGRdKjopLztmdW5jdGlvbiBkKHQsZSl7aWYodCYmaC50ZXN0KHQpKXJldHVybiB0O2lmKCIvLyI9PT10KXJldHVybiB0O2lmKHZvaWQgMD09PWwpe2w9ITE7dHJ5e2NvbnN0IHQ9bmV3IFVSTCgiYiIsImh0dHA6Ly9hIik7dC5wYXRobmFtZT0iYyUyMGQiLGw9Imh0dHA6Ly9hL2MlMjBkIj09PXQuaHJlZn1jYXRjaCh0KXt9fWlmKGV8fChlPWRvY3VtZW50LmJhc2VVUkl8fHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxsKXRyeXtyZXR1cm4gbmV3IFVSTCh0LGUpLmhyZWZ9Y2F0Y2goZSl7cmV0dXJuIHR9cmV0dXJuIGN8fChjPWRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgidGVtcCIpLGMuYmFzZT1jLmNyZWF0ZUVsZW1lbnQoImJhc2UiKSxjLmhlYWQuYXBwZW5kQ2hpbGQoYy5iYXNlKSxjLmFuY2hvcj1jLmNyZWF0ZUVsZW1lbnQoImEiKSxjLmJvZHkuYXBwZW5kQ2hpbGQoYy5hbmNob3IpKSxjLmJhc2UuaHJlZj1lLGMuYW5jaG9yLmhyZWY9dCxjLmFuY2hvci5ocmVmfHx0fWZ1bmN0aW9uIHAodCxlKXtyZXR1cm4gdC5yZXBsYWNlKHUsKGZ1bmN0aW9uKHQsbixpLHIpe3JldHVybiBuKyInIitkKGkucmVwbGFjZSgvWyInXS9nLCIiKSxlKSsiJyIrcn0pKX1mdW5jdGlvbiBmKHQpe3JldHVybiB0LnN1YnN0cmluZygwLHQubGFzdEluZGV4T2YoIi8iKSsxKX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9jb25zdCBtPSF3aW5kb3cuU2hhZHlET018fCF3aW5kb3cuU2hhZHlET00uaW5Vc2U7Qm9vbGVhbighd2luZG93LlNoYWR5Q1NTfHx3aW5kb3cuU2hhZHlDU1MubmF0aXZlQ3NzKTtjb25zdCBnPW0mJiJhZG9wdGVkU3R5bGVTaGVldHMiaW4gRG9jdW1lbnQucHJvdG90eXBlJiYicmVwbGFjZVN5bmMiaW4gQ1NTU3R5bGVTaGVldC5wcm90b3R5cGUmJigoKT0+e3RyeXtjb25zdCB0PW5ldyBDU1NTdHlsZVNoZWV0O3QucmVwbGFjZVN5bmMoIiIpO2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIGUuYXR0YWNoU2hhZG93KHttb2RlOiJvcGVuIn0pLGUuc2hhZG93Um9vdC5hZG9wdGVkU3R5bGVTaGVldHM9W3RdLGUuc2hhZG93Um9vdC5hZG9wdGVkU3R5bGVTaGVldHNbMF09PT10fWNhdGNoKHQpe3JldHVybiExfX0pKCk7bGV0IF89d2luZG93LlBvbHltZXImJndpbmRvdy5Qb2x5bWVyLnJvb3RQYXRofHxmKGRvY3VtZW50LmJhc2VVUkl8fHdpbmRvdy5sb2NhdGlvbi5ocmVmKSx5PXdpbmRvdy5Qb2x5bWVyJiZ3aW5kb3cuUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlfHx2b2lkIDAsdj13aW5kb3cuUG9seW1lciYmd2luZG93LlBvbHltZXIuc2V0UGFzc2l2ZVRvdWNoR2VzdHVyZXN8fCExLGI9d2luZG93LlBvbHltZXImJndpbmRvdy5Qb2x5bWVyLnN0cmljdFRlbXBsYXRlUG9saWN5fHwhMSx4PXdpbmRvdy5Qb2x5bWVyJiZ3aW5kb3cuUG9seW1lci5hbGxvd1RlbXBsYXRlRnJvbURvbU1vZHVsZXx8ITEsdz13aW5kb3cuUG9seW1lciYmd2luZG93LlBvbHltZXIubGVnYWN5T3B0aW1pemF0aW9uc3x8ITEsUz13aW5kb3cuUG9seW1lciYmd2luZG93LlBvbHltZXIubGVnYWN5V2FybmluZ3N8fCExLE09d2luZG93LlBvbHltZXImJndpbmRvdy5Qb2x5bWVyLnN5bmNJbml0aWFsUmVuZGVyfHwhMSxFPXdpbmRvdy5Qb2x5bWVyJiZ3aW5kb3cuUG9seW1lci5sZWdhY3lVbmRlZmluZWR8fCExLFQ9d2luZG93LlBvbHltZXImJndpbmRvdy5Qb2x5bWVyLm9yZGVyZWRDb21wdXRlZHx8ITEsQz13aW5kb3cuUG9seW1lciYmd2luZG93LlBvbHltZXIucmVtb3ZlTmVzdGVkVGVtcGxhdGVzfHwhMSxBPXdpbmRvdy5Qb2x5bWVyJiZ3aW5kb3cuUG9seW1lci5mYXN0RG9tSWZ8fCExLGs9d2luZG93LlBvbHltZXImJndpbmRvdy5Qb2x5bWVyLnN1cHByZXNzVGVtcGxhdGVOb3RpZmljYXRpb25zfHwhMSxMPXdpbmRvdy5Qb2x5bWVyJiZ3aW5kb3cuUG9seW1lci5sZWdhY3lOb09ic2VydmVkQXR0cmlidXRlc3x8ITEsUD13aW5kb3cuUG9seW1lciYmd2luZG93LlBvbHltZXIudXNlQWRvcHRlZFN0eWxlU2hlZXRzV2l0aEJ1aWx0Q1NTfHwhMSxOPTA7Y29uc3QgST1mdW5jdGlvbih0KXtsZXQgZT10Ll9fbWl4aW5BcHBsaWNhdGlvbnM7ZXx8KGU9bmV3IFdlYWtNYXAsdC5fX21peGluQXBwbGljYXRpb25zPWUpO2xldCBuPU4rKztyZXR1cm4gZnVuY3Rpb24gaShyKXtsZXQgbz1yLl9fbWl4aW5TZXQ7aWYobyYmb1tuXSlyZXR1cm4gcjtsZXQgYT1lLHM9YS5nZXQocik7aWYoIXMpe3M9dChyKSxhLnNldChyLHMpO2xldCBlPU9iamVjdC5jcmVhdGUocy5fX21peGluU2V0fHxvfHxudWxsKTtlW25dPSEwLHMuX19taXhpblNldD1lfXJldHVybiBzfX07Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovbGV0IFI9e30sTz17fTtmdW5jdGlvbiB6KHQsZSl7Ult0XT1PW3QudG9Mb3dlckNhc2UoKV09ZX1mdW5jdGlvbiBEKHQpe3JldHVybiBSW3RdfHxPW3QudG9Mb3dlckNhc2UoKV19Y2xhc3MgQiBleHRlbmRzIEhUTUxFbGVtZW50e3N0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCl7cmV0dXJuWyJpZCJdfXN0YXRpYyBpbXBvcnQodCxlKXtpZih0KXtsZXQgbj1EKHQpO3JldHVybiBuJiZlP24ucXVlcnlTZWxlY3RvcihlKTpufXJldHVybiBudWxsfWF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0LGUsbixpKXtlIT09biYmdGhpcy5yZWdpc3RlcigpfWdldCBhc3NldHBhdGgoKXtpZighdGhpcy5fX2Fzc2V0cGF0aCl7Y29uc3QgdD13aW5kb3cuSFRNTEltcG9ydHMmJkhUTUxJbXBvcnRzLmltcG9ydEZvckVsZW1lbnQ/SFRNTEltcG9ydHMuaW1wb3J0Rm9yRWxlbWVudCh0aGlzKXx8ZG9jdW1lbnQ6dGhpcy5vd25lckRvY3VtZW50LGU9ZCh0aGlzLmdldEF0dHJpYnV0ZSgiYXNzZXRwYXRoIil8fCIiLHQuYmFzZVVSSSk7dGhpcy5fX2Fzc2V0cGF0aD1mKGUpfXJldHVybiB0aGlzLl9fYXNzZXRwYXRofXJlZ2lzdGVyKHQpe2lmKHQ9dHx8dGhpcy5pZCl7aWYoYiYmdm9pZCAwIT09RCh0KSl0aHJvdyB6KHQsbnVsbCksbmV3IEVycm9yKGBzdHJpY3RUZW1wbGF0ZVBvbGljeTogZG9tLW1vZHVsZSAke3R9IHJlLXJlZ2lzdGVyZWRgKTt0aGlzLmlkPXQseih0LHRoaXMpLChmdW5jdGlvbiBlKHQpe3QucXVlcnlTZWxlY3Rvcigic3R5bGUiKSYmY29uc29sZS53YXJuKCJkb20tbW9kdWxlICVzIGhhcyBzdHlsZSBvdXRzaWRlIHRlbXBsYXRlIix0LmlkKX0pKHRoaXMpfX19Qi5wcm90b3R5cGUubW9kdWxlcz1SLGN1c3RvbUVsZW1lbnRzLmRlZmluZSgiZG9tLW1vZHVsZSIsQik7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IEg9InNoYWR5LXVuc2NvcGVkIjtmdW5jdGlvbiBGKHQpe3JldHVybiBCLmltcG9ydCh0KX1mdW5jdGlvbiBWKHQpe2NvbnN0IGU9cCgodC5ib2R5P3QuYm9keTp0KS50ZXh0Q29udGVudCx0LmJhc2VVUkkpLG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtyZXR1cm4gbi50ZXh0Q29udGVudD1lLG59ZnVuY3Rpb24gVSh0KXtjb25zdCBlPXQudHJpbSgpLnNwbGl0KC9ccysvKSxuPVtdO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKW4ucHVzaCguLi5qKGVbdF0pKTtyZXR1cm4gbn1mdW5jdGlvbiBqKHQpe2NvbnN0IGU9Rih0KTtpZighZSlyZXR1cm4gY29uc29sZS53YXJuKCJDb3VsZCBub3QgZmluZCBzdHlsZSBkYXRhIGluIG1vZHVsZSBuYW1lZCIsdCksW107aWYodm9pZCAwPT09ZS5fc3R5bGVzKXtjb25zdCB0PVtdO3QucHVzaCguLi5XKGUpKTtjb25zdCBuPWUucXVlcnlTZWxlY3RvcigidGVtcGxhdGUiKTtuJiZ0LnB1c2goLi4uRyhuLGUuYXNzZXRwYXRoKSksZS5fc3R5bGVzPXR9cmV0dXJuIGUuX3N0eWxlc31mdW5jdGlvbiBHKHQsZSl7aWYoIXQuX3N0eWxlcyl7Y29uc3Qgbj1bXSxpPXQuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCJzdHlsZSIpO2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7dCsrKXtsZXQgcj1pW3RdLG89ci5nZXRBdHRyaWJ1dGUoImluY2x1ZGUiKTtvJiZuLnB1c2goLi4uVShvKS5maWx0ZXIoKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbi5pbmRleE9mKHQpPT09ZX0pKSksZSYmKHIudGV4dENvbnRlbnQ9cChyLnRleHRDb250ZW50LGUpKSxuLnB1c2gocil9dC5fc3R5bGVzPW59cmV0dXJuIHQuX3N0eWxlc31mdW5jdGlvbiBXKHQpe2NvbnN0IGU9W10sbj10LnF1ZXJ5U2VsZWN0b3JBbGwoImxpbmtbcmVsPWltcG9ydF1bdHlwZX49Y3NzXSIpO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKXtsZXQgaT1uW3RdO2lmKGkuaW1wb3J0KXtjb25zdCB0PWkuaW1wb3J0LG49aS5oYXNBdHRyaWJ1dGUoSCk7aWYobiYmIXQuX3Vuc2NvcGVkU3R5bGUpe2NvbnN0IGU9Vih0KTtlLnNldEF0dHJpYnV0ZShILCIiKSx0Ll91bnNjb3BlZFN0eWxlPWV9ZWxzZSB0Ll9zdHlsZXx8KHQuX3N0eWxlPVYodCkpO2UucHVzaChuP3QuX3Vuc2NvcGVkU3R5bGU6dC5fc3R5bGUpfX1yZXR1cm4gZX1mdW5jdGlvbiBxKHQpe2xldCBlPUYodCk7aWYoZSYmdm9pZCAwPT09ZS5fY3NzVGV4dCl7bGV0IHQ9KGZ1bmN0aW9uIG4odCl7bGV0IGU9IiIsbj1XKHQpO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKWUrPW5bdF0udGV4dENvbnRlbnQ7cmV0dXJuIGV9Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovKShlKSxuPWUucXVlcnlTZWxlY3RvcigidGVtcGxhdGUiKTtuJiYodCs9KGZ1bmN0aW9uIGkodCxlKXtsZXQgbj0iIjtjb25zdCBpPUcodCxlKTtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrKyl7bGV0IGU9aVt0XTtlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSxuKz1lLnRleHRDb250ZW50fXJldHVybiBufSkobixlLmFzc2V0cGF0aCkpLGUuX2Nzc1RleHQ9dHx8bnVsbH1yZXR1cm4gZXx8Y29uc29sZS53YXJuKCJDb3VsZCBub3QgZmluZCBzdHlsZSBkYXRhIGluIG1vZHVsZSBuYW1lZCIsdCksZSYmZS5fY3NzVGV4dHx8IiJ9Y29uc3QgWT13aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS5ub1BhdGNoJiZ3aW5kb3cuU2hhZHlET00ud3JhcD93aW5kb3cuU2hhZHlET00ud3JhcDp3aW5kb3cuU2hhZHlET00/dD0+U2hhZHlET00ucGF0Y2godCk6dD0+dDsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9mdW5jdGlvbiBYKHQpe3JldHVybiB0LmluZGV4T2YoIi4iKT49MH1mdW5jdGlvbiAkKHQpe2xldCBlPXQuaW5kZXhPZigiLiIpO3JldHVybi0xPT09ZT90OnQuc2xpY2UoMCxlKX1mdW5jdGlvbiBLKHQsZSl7cmV0dXJuIDA9PT10LmluZGV4T2YoZSsiLiIpfWZ1bmN0aW9uIFoodCxlKXtyZXR1cm4gMD09PWUuaW5kZXhPZih0KyIuIil9ZnVuY3Rpb24gSih0LGUsbil7cmV0dXJuIGUrbi5zbGljZSh0Lmxlbmd0aCl9ZnVuY3Rpb24gUSh0LGUpe3JldHVybiB0PT09ZXx8Syh0LGUpfHxaKHQsZSl9ZnVuY3Rpb24gdHQodCl7aWYoQXJyYXkuaXNBcnJheSh0KSl7bGV0IGU9W107Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2xldCBpPXRbbl0udG9TdHJpbmcoKS5zcGxpdCgiLiIpO2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7dCsrKWUucHVzaChpW3RdKX1yZXR1cm4gZS5qb2luKCIuIil9cmV0dXJuIHR9ZnVuY3Rpb24gZXQodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dHQodCkuc3BsaXQoIi4iKTp0LnRvU3RyaW5nKCkuc3BsaXQoIi4iKX1mdW5jdGlvbiBudCh0LGUsbil7bGV0IGk9dCxyPWV0KGUpO2ZvcihsZXQgdD0wO3Q8ci5sZW5ndGg7dCsrKXtpZighaSlyZXR1cm47aT1pW3JbdF1dfXJldHVybiBuJiYobi5wYXRoPXIuam9pbigiLiIpKSxpfWZ1bmN0aW9uIGl0KHQsZSxuKXtsZXQgaT10LHI9ZXQoZSksbz1yW3IubGVuZ3RoLTFdO2lmKHIubGVuZ3RoPjEpe2ZvcihsZXQgdD0wO3Q8ci5sZW5ndGgtMTt0KyspaWYoaT1pW3JbdF1dLCFpKXJldHVybjtpW29dPW59ZWxzZSBpW2VdPW47cmV0dXJuIHIuam9pbigiLiIpfQovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL2NvbnN0IHJ0PXt9LG90PS8tW2Etel0vZyxhdD0vKFtBLVpdKS9nO2Z1bmN0aW9uIHN0KHQpe3JldHVybiBydFt0XXx8KHJ0W3RdPXQuaW5kZXhPZigiLSIpPDA/dDp0LnJlcGxhY2Uob3QsKHQ9PnRbMV0udG9VcHBlckNhc2UoKSkpKX1mdW5jdGlvbiBsdCh0KXtyZXR1cm4gcnRbdF18fChydFt0XT10LnJlcGxhY2UoYXQsIi0kMSIpLnRvTG93ZXJDYXNlKCkpfQovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL2xldCBjdD0wLHV0PTAsaHQ9W10sZHQ9MCxwdD0hMSxmdD1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIik7bmV3IHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyKChmdW5jdGlvbiBtdCgpe3B0PSExO2NvbnN0IHQ9aHQubGVuZ3RoO2ZvcihsZXQgZT0wO2U8dDtlKyspe2xldCB0PWh0W2VdO2lmKHQpdHJ5e3QoKX1jYXRjaCh0KXtzZXRUaW1lb3V0KCgoKT0+e3Rocm93IHR9KSl9fWh0LnNwbGljZSgwLHQpLHV0Kz10fSkpLm9ic2VydmUoZnQse2NoYXJhY3RlckRhdGE6ITB9KTtjb25zdCBndD17YWZ0ZXI6dD0+KHtydW46ZT0+d2luZG93LnNldFRpbWVvdXQoZSx0KSxjYW5jZWwodCl7d2luZG93LmNsZWFyVGltZW91dCh0KX19KSxydW46KHQsZSk9PndpbmRvdy5zZXRUaW1lb3V0KHQsZSksY2FuY2VsKHQpe3dpbmRvdy5jbGVhclRpbWVvdXQodCl9fSxfdD17cnVuOnQ9PndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodCksY2FuY2VsKHQpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0KX19LHl0PXtydW46dD0+d2luZG93LnJlcXVlc3RJZGxlQ2FsbGJhY2s/d2luZG93LnJlcXVlc3RJZGxlQ2FsbGJhY2sodCk6d2luZG93LnNldFRpbWVvdXQodCwxNiksY2FuY2VsKHQpe3dpbmRvdy5jYW5jZWxJZGxlQ2FsbGJhY2s/d2luZG93LmNhbmNlbElkbGVDYWxsYmFjayh0KTp3aW5kb3cuY2xlYXJUaW1lb3V0KHQpfX0sdnQ9e3J1bjp0PT4ocHR8fChwdD0hMCxmdC50ZXh0Q29udGVudD1kdCsrKSxodC5wdXNoKHQpLGN0KyspLGNhbmNlbCh0KXtjb25zdCBlPXQtdXQ7aWYoZT49MCl7aWYoIWh0W2VdKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBhc3luYyBoYW5kbGU6ICIrdCk7aHRbZV09bnVsbH19fSxidD12dCx4dD1JKCh0PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGNyZWF0ZVByb3BlcnRpZXModCl7Y29uc3QgZT10aGlzLnByb3RvdHlwZTtmb3IobGV0IG4gaW4gdCluIGluIGV8fGUuX2NyZWF0ZVByb3BlcnR5QWNjZXNzb3Iobil9c3RhdGljIGF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eSh0KXtyZXR1cm4gdC50b0xvd2VyQ2FzZSgpfXN0YXRpYyB0eXBlRm9yUHJvcGVydHkodCl7fV9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKHQsZSl7dGhpcy5fYWRkUHJvcGVydHlUb0F0dHJpYnV0ZU1hcCh0KSx0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl9fZGF0YUhhc0FjY2Vzc29yIix0aGlzKSl8fCh0aGlzLl9fZGF0YUhhc0FjY2Vzc29yPU9iamVjdC5hc3NpZ24oe30sdGhpcy5fX2RhdGFIYXNBY2Nlc3NvcikpLHRoaXMuX19kYXRhSGFzQWNjZXNzb3JbdF18fCh0aGlzLl9fZGF0YUhhc0FjY2Vzc29yW3RdPSEwLHRoaXMuX2RlZmluZVByb3BlcnR5QWNjZXNzb3IodCxlKSl9X2FkZFByb3BlcnR5VG9BdHRyaWJ1dGVNYXAodCl7dGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJfX2RhdGFBdHRyaWJ1dGVzIix0aGlzKSl8fCh0aGlzLl9fZGF0YUF0dHJpYnV0ZXM9T2JqZWN0LmFzc2lnbih7fSx0aGlzLl9fZGF0YUF0dHJpYnV0ZXMpKTtsZXQgZT10aGlzLl9fZGF0YUF0dHJpYnV0ZXNbdF07cmV0dXJuIGV8fChlPXRoaXMuY29uc3RydWN0b3IuYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHQpLHRoaXMuX19kYXRhQXR0cmlidXRlc1tlXT10KSxlfV9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHQsZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsdCx7Z2V0KCl7cmV0dXJuIHRoaXMuX19kYXRhW3RdfSxzZXQ6ZT9mdW5jdGlvbigpe306ZnVuY3Rpb24oZSl7dGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5KHQsZSwhMCkmJnRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCl9fSl9Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX19kYXRhRW5hYmxlZD0hMSx0aGlzLl9fZGF0YVJlYWR5PSExLHRoaXMuX19kYXRhSW52YWxpZD0hMSx0aGlzLl9fZGF0YT17fSx0aGlzLl9fZGF0YVBlbmRpbmc9bnVsbCx0aGlzLl9fZGF0YU9sZD1udWxsLHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcz1udWxsLHRoaXMuX19kYXRhQ291bnRlcj0wLHRoaXMuX19zZXJpYWxpemluZz0hMSx0aGlzLl9pbml0aWFsaXplUHJvcGVydGllcygpfXJlYWR5KCl7dGhpcy5fX2RhdGFSZWFkeT0hMCx0aGlzLl9mbHVzaFByb3BlcnRpZXMoKX1faW5pdGlhbGl6ZVByb3BlcnRpZXMoKXtmb3IobGV0IHQgaW4gdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcil0aGlzLmhhc093blByb3BlcnR5KHQpJiYodGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzPXRoaXMuX19kYXRhSW5zdGFuY2VQcm9wc3x8e30sdGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzW3RdPXRoaXNbdF0sZGVsZXRlIHRoaXNbdF0pfV9pbml0aWFsaXplSW5zdGFuY2VQcm9wZXJ0aWVzKHQpe09iamVjdC5hc3NpZ24odGhpcyx0KX1fc2V0UHJvcGVydHkodCxlKXt0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkodCxlKSYmdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKX1fZ2V0UHJvcGVydHkodCl7cmV0dXJuIHRoaXMuX19kYXRhW3RdfV9zZXRQZW5kaW5nUHJvcGVydHkodCxlLG4pe2xldCBpPXRoaXMuX19kYXRhW3RdLHI9dGhpcy5fc2hvdWxkUHJvcGVydHlDaGFuZ2UodCxlLGkpO3JldHVybiByJiYodGhpcy5fX2RhdGFQZW5kaW5nfHwodGhpcy5fX2RhdGFQZW5kaW5nPXt9LHRoaXMuX19kYXRhT2xkPXt9KSx0aGlzLl9fZGF0YU9sZCYmISh0IGluIHRoaXMuX19kYXRhT2xkKSYmKHRoaXMuX19kYXRhT2xkW3RdPWkpLHRoaXMuX19kYXRhW3RdPWUsdGhpcy5fX2RhdGFQZW5kaW5nW3RdPWUpLHJ9X2lzUHJvcGVydHlQZW5kaW5nKHQpe3JldHVybiEoIXRoaXMuX19kYXRhUGVuZGluZ3x8IXRoaXMuX19kYXRhUGVuZGluZy5oYXNPd25Qcm9wZXJ0eSh0KSl9X2ludmFsaWRhdGVQcm9wZXJ0aWVzKCl7IXRoaXMuX19kYXRhSW52YWxpZCYmdGhpcy5fX2RhdGFSZWFkeSYmKHRoaXMuX19kYXRhSW52YWxpZD0hMCxidC5ydW4oKCgpPT57dGhpcy5fX2RhdGFJbnZhbGlkJiYodGhpcy5fX2RhdGFJbnZhbGlkPSExLHRoaXMuX2ZsdXNoUHJvcGVydGllcygpKX0pKSl9X2VuYWJsZVByb3BlcnRpZXMoKXt0aGlzLl9fZGF0YUVuYWJsZWR8fCh0aGlzLl9fZGF0YUVuYWJsZWQ9ITAsdGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzJiYodGhpcy5faW5pdGlhbGl6ZUluc3RhbmNlUHJvcGVydGllcyh0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMpLHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcz1udWxsKSx0aGlzLnJlYWR5KCkpfV9mbHVzaFByb3BlcnRpZXMoKXt0aGlzLl9fZGF0YUNvdW50ZXIrKztjb25zdCB0PXRoaXMuX19kYXRhLGU9dGhpcy5fX2RhdGFQZW5kaW5nLG49dGhpcy5fX2RhdGFPbGQ7dGhpcy5fc2hvdWxkUHJvcGVydGllc0NoYW5nZSh0LGUsbikmJih0aGlzLl9fZGF0YVBlbmRpbmc9bnVsbCx0aGlzLl9fZGF0YU9sZD1udWxsLHRoaXMuX3Byb3BlcnRpZXNDaGFuZ2VkKHQsZSxuKSksdGhpcy5fX2RhdGFDb3VudGVyLS19X3Nob3VsZFByb3BlcnRpZXNDaGFuZ2UodCxlLG4pe3JldHVybiBCb29sZWFuKGUpfV9wcm9wZXJ0aWVzQ2hhbmdlZCh0LGUsbil7fV9zaG91bGRQcm9wZXJ0eUNoYW5nZSh0LGUsbil7cmV0dXJuIG4hPT1lJiYobj09bnx8ZT09ZSl9YXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHQsZSxuLGkpe2UhPT1uJiZ0aGlzLl9hdHRyaWJ1dGVUb1Byb3BlcnR5KHQsbiksc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrJiZzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodCxlLG4saSl9X2F0dHJpYnV0ZVRvUHJvcGVydHkodCxlLG4pe2lmKCF0aGlzLl9fc2VyaWFsaXppbmcpe2NvbnN0IGk9dGhpcy5fX2RhdGFBdHRyaWJ1dGVzLHI9aSYmaVt0XXx8dDt0aGlzW3JdPXRoaXMuX2Rlc2VyaWFsaXplVmFsdWUoZSxufHx0aGlzLmNvbnN0cnVjdG9yLnR5cGVGb3JQcm9wZXJ0eShyKSl9fV9wcm9wZXJ0eVRvQXR0cmlidXRlKHQsZSxuKXt0aGlzLl9fc2VyaWFsaXppbmc9ITAsdGhpcy5fdmFsdWVUb05vZGVBdHRyaWJ1dGUodGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg8Mz90aGlzW3RdOm4sZXx8dGhpcy5jb25zdHJ1Y3Rvci5hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkodCkpLHRoaXMuX19zZXJpYWxpemluZz0hMX1fdmFsdWVUb05vZGVBdHRyaWJ1dGUodCxlLG4pe2NvbnN0IGk9dGhpcy5fc2VyaWFsaXplVmFsdWUoZSk7ImNsYXNzIiE9PW4mJiJuYW1lIiE9PW4mJiJzbG90IiE9PW58fCh0PVkodCkpLHZvaWQgMD09PWk/dC5yZW1vdmVBdHRyaWJ1dGUobik6dC5zZXRBdHRyaWJ1dGUobixpKX1fc2VyaWFsaXplVmFsdWUodCl7c3dpdGNoKHR5cGVvZiB0KXtjYXNlImJvb2xlYW4iOnJldHVybiB0PyIiOnZvaWQgMDtkZWZhdWx0OnJldHVybiBudWxsIT10P3QudG9TdHJpbmcoKTp2b2lkIDB9fV9kZXNlcmlhbGl6ZVZhbHVlKHQsZSl7c3dpdGNoKGUpe2Nhc2UgQm9vbGVhbjpyZXR1cm4gbnVsbCE9PXQ7Y2FzZSBOdW1iZXI6cmV0dXJuIE51bWJlcih0KTtkZWZhdWx0OnJldHVybiB0fX19KSksd3Q9e307bGV0IFN0PUhUTUxFbGVtZW50LnByb3RvdHlwZTtmb3IoO1N0Oyl7bGV0IHQ9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoU3QpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXd0W3RbZV1dPSEwO1N0PU9iamVjdC5nZXRQcm90b3R5cGVPZihTdCl9Y29uc3QgTXQ9SSgodD0+e2NvbnN0IGU9eHQodCk7cmV0dXJuIGNsYXNzIGV4dGVuZHMgZXtzdGF0aWMgY3JlYXRlUHJvcGVydGllc0ZvckF0dHJpYnV0ZXMoKXtsZXQgdD10aGlzLm9ic2VydmVkQXR0cmlidXRlcztmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl0aGlzLnByb3RvdHlwZS5fY3JlYXRlUHJvcGVydHlBY2Nlc3NvcihzdCh0W2VdKSl9c3RhdGljIGF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eSh0KXtyZXR1cm4gbHQodCl9X2luaXRpYWxpemVQcm9wZXJ0aWVzKCl7dGhpcy5fX2RhdGFQcm90byYmKHRoaXMuX2luaXRpYWxpemVQcm90b1Byb3BlcnRpZXModGhpcy5fX2RhdGFQcm90byksdGhpcy5fX2RhdGFQcm90bz1udWxsKSxzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKX1faW5pdGlhbGl6ZVByb3RvUHJvcGVydGllcyh0KXtmb3IobGV0IGUgaW4gdCl0aGlzLl9zZXRQcm9wZXJ0eShlLHRbZV0pfV9lbnN1cmVBdHRyaWJ1dGUodCxlKXt0aGlzLmhhc0F0dHJpYnV0ZSh0KXx8dGhpcy5fdmFsdWVUb05vZGVBdHRyaWJ1dGUodGhpcyxlLHQpfV9zZXJpYWxpemVWYWx1ZSh0KXtzd2l0Y2godHlwZW9mIHQpe2Nhc2Uib2JqZWN0IjppZih0IGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gdC50b1N0cmluZygpO2lmKHQpdHJ5e3JldHVybiBKU09OLnN0cmluZ2lmeSh0KX1jYXRjaCh0KXtyZXR1cm4iIn1kZWZhdWx0OnJldHVybiBzdXBlci5fc2VyaWFsaXplVmFsdWUodCl9fV9kZXNlcmlhbGl6ZVZhbHVlKHQsZSl7bGV0IG47c3dpdGNoKGUpe2Nhc2UgT2JqZWN0OnRyeXtuPUpTT04ucGFyc2UodCl9Y2F0Y2goZSl7bj10fWJyZWFrO2Nhc2UgQXJyYXk6dHJ5e249SlNPTi5wYXJzZSh0KX1jYXRjaChlKXtuPW51bGwsY29uc29sZS53YXJuKGBQb2x5bWVyOjpBdHRyaWJ1dGVzOiBjb3VsZG4ndCBkZWNvZGUgQXJyYXkgYXMgSlNPTjogJHt0fWApfWJyZWFrO2Nhc2UgRGF0ZTpuPWlzTmFOKHQpP1N0cmluZyh0KTpOdW1iZXIodCksbj1uZXcgRGF0ZShuKTticmVhaztkZWZhdWx0Om49c3VwZXIuX2Rlc2VyaWFsaXplVmFsdWUodCxlKX1yZXR1cm4gbn1fZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcih0LGUpeyEoZnVuY3Rpb24gbih0LGUpe2lmKCF3dFtlXSl7bGV0IG49dFtlXTt2b2lkIDAhPT1uJiYodC5fX2RhdGE/dC5fc2V0UGVuZGluZ1Byb3BlcnR5KGUsbik6KHQuX19kYXRhUHJvdG8/dC5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJfX2RhdGFQcm90byIsdCkpfHwodC5fX2RhdGFQcm90bz1PYmplY3QuY3JlYXRlKHQuX19kYXRhUHJvdG8pKTp0Ll9fZGF0YVByb3RvPXt9LHQuX19kYXRhUHJvdG9bZV09bikpfX0pKHRoaXMsdCksc3VwZXIuX2RlZmluZVByb3BlcnR5QWNjZXNzb3IodCxlKX1faGFzQWNjZXNzb3IodCl7cmV0dXJuIHRoaXMuX19kYXRhSGFzQWNjZXNzb3ImJnRoaXMuX19kYXRhSGFzQWNjZXNzb3JbdF19X2lzUHJvcGVydHlQZW5kaW5nKHQpe3JldHVybiBCb29sZWFuKHRoaXMuX19kYXRhUGVuZGluZyYmdCBpbiB0aGlzLl9fZGF0YVBlbmRpbmcpfX19KSksRXQ9eyJkb20taWYiOiEwLCJkb20tcmVwZWF0IjohMH07Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovbGV0IFR0PSExLEN0PSExO2Z1bmN0aW9uIEF0KHQpe2xldCBlPXQuZ2V0QXR0cmlidXRlKCJpcyIpO2lmKGUmJkV0W2VdKXtsZXQgbj10O2ZvcihuLnJlbW92ZUF0dHJpYnV0ZSgiaXMiKSx0PW4ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpLG4ucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodCxuKSx0LmFwcGVuZENoaWxkKG4pO24uYXR0cmlidXRlcy5sZW5ndGg7KXQuc2V0QXR0cmlidXRlKG4uYXR0cmlidXRlc1swXS5uYW1lLG4uYXR0cmlidXRlc1swXS52YWx1ZSksbi5yZW1vdmVBdHRyaWJ1dGUobi5hdHRyaWJ1dGVzWzBdLm5hbWUpfXJldHVybiB0fWZ1bmN0aW9uIGt0KHQsZSl7bGV0IG49ZS5wYXJlbnRJbmZvJiZrdCh0LGUucGFyZW50SW5mbyk7aWYoIW4pcmV0dXJuIHQ7Zm9yKGxldCB0PW4uZmlyc3RDaGlsZCxpPTA7dDt0PXQubmV4dFNpYmxpbmcpaWYoZS5wYXJlbnRJbmRleD09PWkrKylyZXR1cm4gdH1mdW5jdGlvbiBMdCh0LGUsbixpKXtpLmlkJiYoZVtpLmlkXT1uKX1mdW5jdGlvbiBQdCh0LGUsbil7aWYobi5ldmVudHMmJm4uZXZlbnRzLmxlbmd0aClmb3IobGV0IGkscj0wLG89bi5ldmVudHM7cjxvLmxlbmd0aCYmKGk9b1tyXSk7cisrKXQuX2FkZE1ldGhvZEV2ZW50TGlzdGVuZXJUb05vZGUoZSxpLm5hbWUsaS52YWx1ZSx0KX1mdW5jdGlvbiBOdCh0LGUsbixpKXtuLnRlbXBsYXRlSW5mbyYmKGUuX3RlbXBsYXRlSW5mbz1uLnRlbXBsYXRlSW5mbyxlLl9wYXJlbnRUZW1wbGF0ZUluZm89aSl9Y29uc3QgSXQ9SSgodD0+Y2xhc3MgZXh0ZW5kcyB0e3N0YXRpYyBfcGFyc2VUZW1wbGF0ZSh0LGUpe2lmKCF0Ll90ZW1wbGF0ZUluZm8pe2xldCBuPXQuX3RlbXBsYXRlSW5mbz17fTtuLm5vZGVJbmZvTGlzdD1bXSxuLm5lc3RlZFRlbXBsYXRlPUJvb2xlYW4oZSksbi5zdHJpcFdoaXRlU3BhY2U9ZSYmZS5zdHJpcFdoaXRlU3BhY2V8fHQuaGFzQXR0cmlidXRlKCJzdHJpcC13aGl0ZXNwYWNlIiksdGhpcy5fcGFyc2VUZW1wbGF0ZUNvbnRlbnQodCxuLHtwYXJlbnQ6bnVsbH0pfXJldHVybiB0Ll90ZW1wbGF0ZUluZm99c3RhdGljIF9wYXJzZVRlbXBsYXRlQ29udGVudCh0LGUsbil7cmV0dXJuIHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlKHQuY29udGVudCxlLG4pfXN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGUodCxlLG4pe2xldCBpPSExLHI9dDtyZXR1cm4idGVtcGxhdGUiIT1yLmxvY2FsTmFtZXx8ci5oYXNBdHRyaWJ1dGUoInByZXNlcnZlLWNvbnRlbnQiKT8ic2xvdCI9PT1yLmxvY2FsTmFtZSYmKGUuaGFzSW5zZXJ0aW9uUG9pbnQ9ITApOmk9dGhpcy5fcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKHIsZSxuKXx8aSwoZnVuY3Rpb24gbyh0KXsoZnVuY3Rpb24gZSgpe2lmKCFUdCl7VHQ9ITA7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpO3QucGxhY2Vob2xkZXI9ImEiLEN0PXQucGxhY2Vob2xkZXI9PT10LnRleHRDb250ZW50fXJldHVybiBDdH0pKCkmJiJ0ZXh0YXJlYSI9PT10LmxvY2FsTmFtZSYmdC5wbGFjZWhvbGRlciYmdC5wbGFjZWhvbGRlcj09PXQudGV4dENvbnRlbnQmJih0LnRleHRDb250ZW50PW51bGwpfSkociksci5maXJzdENoaWxkJiZ0aGlzLl9wYXJzZVRlbXBsYXRlQ2hpbGROb2RlcyhyLGUsbiksci5oYXNBdHRyaWJ1dGVzJiZyLmhhc0F0dHJpYnV0ZXMoKSYmKGk9dGhpcy5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGVzKHIsZSxuKXx8aSksaXx8bi5ub3RlZH1zdGF0aWMgX3BhcnNlVGVtcGxhdGVDaGlsZE5vZGVzKHQsZSxuKXtpZigic2NyaXB0IiE9PXQubG9jYWxOYW1lJiYic3R5bGUiIT09dC5sb2NhbE5hbWUpZm9yKGxldCBpLHI9dC5maXJzdENoaWxkLG89MDtyO3I9aSl7aWYoInRlbXBsYXRlIj09ci5sb2NhbE5hbWUmJihyPUF0KHIpKSxpPXIubmV4dFNpYmxpbmcsci5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFKXtsZXQgbj1pO2Zvcig7biYmbi5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFOylyLnRleHRDb250ZW50Kz1uLnRleHRDb250ZW50LGk9bi5uZXh0U2libGluZyx0LnJlbW92ZUNoaWxkKG4pLG49aTtpZihlLnN0cmlwV2hpdGVTcGFjZSYmIXIudGV4dENvbnRlbnQudHJpbSgpKXt0LnJlbW92ZUNoaWxkKHIpO2NvbnRpbnVlfX1sZXQgYT17cGFyZW50SW5kZXg6byxwYXJlbnRJbmZvOm59O3RoaXMuX3BhcnNlVGVtcGxhdGVOb2RlKHIsZSxhKSYmKGEuaW5mb0luZGV4PWUubm9kZUluZm9MaXN0LnB1c2goYSktMSksci5wYXJlbnROb2RlJiZvKyt9fXN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKHQsZSxuKXtsZXQgaT10LHI9dGhpcy5fcGFyc2VUZW1wbGF0ZShpLGUpO3JldHVybihyLmNvbnRlbnQ9aS5jb250ZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKS5hcHBlbmRDaGlsZChpLmNvbnRlbnQpLG4udGVtcGxhdGVJbmZvPXIsITB9c3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZUF0dHJpYnV0ZXModCxlLG4pe2xldCBpPSExLHI9QXJyYXkuZnJvbSh0LmF0dHJpYnV0ZXMpO2ZvcihsZXQgbyxhPXIubGVuZ3RoLTE7bz1yW2FdO2EtLSlpPXRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlKHQsZSxuLG8ubmFtZSxvLnZhbHVlKXx8aTtyZXR1cm4gaX1zdGF0aWMgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlKHQsZSxuLGkscil7cmV0dXJuIm9uLSI9PT1pLnNsaWNlKDAsMyk/KHQucmVtb3ZlQXR0cmlidXRlKGkpLG4uZXZlbnRzPW4uZXZlbnRzfHxbXSxuLmV2ZW50cy5wdXNoKHtuYW1lOmkuc2xpY2UoMyksdmFsdWU6cn0pLCEwKToiaWQiPT09aSYmKG4uaWQ9ciwhMCl9c3RhdGljIF9jb250ZW50Rm9yVGVtcGxhdGUodCl7bGV0IGU9dC5fdGVtcGxhdGVJbmZvO3JldHVybiBlJiZlLmNvbnRlbnR8fHQuY29udGVudH1fc3RhbXBUZW1wbGF0ZSh0LGUpe3QmJiF0LmNvbnRlbnQmJndpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50JiZIVE1MVGVtcGxhdGVFbGVtZW50LmRlY29yYXRlJiZIVE1MVGVtcGxhdGVFbGVtZW50LmRlY29yYXRlKHQpO2xldCBuPShlPWV8fHRoaXMuY29uc3RydWN0b3IuX3BhcnNlVGVtcGxhdGUodCkpLm5vZGVJbmZvTGlzdCxpPWRvY3VtZW50LmltcG9ydE5vZGUoZS5jb250ZW50fHx0LmNvbnRlbnQsITApO2kuX19ub0luc2VydGlvblBvaW50PSFlLmhhc0luc2VydGlvblBvaW50O2xldCByPWkubm9kZUxpc3Q9bmV3IEFycmF5KG4ubGVuZ3RoKTtpLiQ9e307Zm9yKGxldCB0LG89MCxhPW4ubGVuZ3RoO288YSYmKHQ9bltvXSk7bysrKXtsZXQgbj1yW29dPWt0KGksdCk7THQoMCxpLiQsbix0KSxOdCgwLG4sdCxlKSxQdCh0aGlzLG4sdCl9cmV0dXJuIGk9aSxpfV9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKHQsZSxuLGkpe2xldCByPShmdW5jdGlvbiBvKHQsZSxuKXtyZXR1cm4gdD10Ll9tZXRob2RIb3N0fHx0LGZ1bmN0aW9uKGUpe3Rbbl0/dFtuXShlLGUuZGV0YWlsKTpjb25zb2xlLndhcm4oImxpc3RlbmVyIG1ldGhvZCBgIituKyJgIG5vdCBkZWZpbmVkIil9fSkoaT1pfHx0LDAsbik7cmV0dXJuIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUodCxlLHIpLHJ9X2FkZEV2ZW50TGlzdGVuZXJUb05vZGUodCxlLG4pe3QuYWRkRXZlbnRMaXN0ZW5lcihlLG4pfV9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUodCxlLG4pe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLG4pfX0pKTsKLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3CiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrUHJvdG90eXBhbFR5cGVzfQogICAgICogQGxpY2Vuc2UgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQKICAgICAqIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkKICAgICAqIGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkKICAgICAqIEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAKICAgICAqIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICAqL2xldCBSdD0wO2NvbnN0IE90PVtdLHp0PXtDT01QVVRFOiJfX2NvbXB1dGVFZmZlY3RzIixSRUZMRUNUOiJfX3JlZmxlY3RFZmZlY3RzIixOT1RJRlk6Il9fbm90aWZ5RWZmZWN0cyIsUFJPUEFHQVRFOiJfX3Byb3BhZ2F0ZUVmZmVjdHMiLE9CU0VSVkU6Il9fb2JzZXJ2ZUVmZmVjdHMiLFJFQURfT05MWToiX19yZWFkT25seSJ9LER0PS9bQS1aXS87ZnVuY3Rpb24gQnQodCxlLG4pe2xldCBpPXRbZV07aWYoaSl7aWYoIXQuaGFzT3duUHJvcGVydHkoZSkmJihpPXRbZV09T2JqZWN0LmNyZWF0ZSh0W2VdKSxuKSlmb3IobGV0IHQgaW4gaSl7bGV0IGU9aVt0XSxuPWlbdF09QXJyYXkoZS5sZW5ndGgpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKW5bdF09ZVt0XX19ZWxzZSBpPXRbZV09e307cmV0dXJuIGl9ZnVuY3Rpb24gSHQodCxlLG4saSxyLG8pe2lmKGUpe2xldCBhPSExO2NvbnN0IHM9UnQrKztmb3IobGV0IGwgaW4gbil7bGV0IGM9ZVtyPyQobCk6bF07aWYoYylmb3IobGV0IGUsdT0wLGg9Yy5sZW5ndGg7dTxoJiYoZT1jW3VdKTt1KyspZS5pbmZvJiZlLmluZm8ubGFzdFJ1bj09PXN8fHImJiFWdChsLGUudHJpZ2dlcil8fChlLmluZm8mJihlLmluZm8ubGFzdFJ1bj1zKSxlLmZuKHQsbCxuLGksZS5pbmZvLHIsbyksYT0hMCl9cmV0dXJuIGF9cmV0dXJuITF9ZnVuY3Rpb24gRnQodCxlLG4saSxyLG8sYSxzKXtsZXQgbD0hMSxjPWVbYT8kKGkpOmldO2lmKGMpZm9yKGxldCBlLHU9MCxoPWMubGVuZ3RoO3U8aCYmKGU9Y1t1XSk7dSsrKWUuaW5mbyYmZS5pbmZvLmxhc3RSdW49PT1ufHxhJiYhVnQoaSxlLnRyaWdnZXIpfHwoZS5pbmZvJiYoZS5pbmZvLmxhc3RSdW49biksZS5mbih0LGkscixvLGUuaW5mbyxhLHMpLGw9ITApO3JldHVybiBsfWZ1bmN0aW9uIFZ0KHQsZSl7aWYoZSl7bGV0IG49ZS5uYW1lO3JldHVybiBuPT10fHwhKCFlLnN0cnVjdHVyZWR8fCFLKG4sdCkpfHwhKCFlLndpbGRjYXJkfHwhWihuLHQpKX1yZXR1cm4hMH1mdW5jdGlvbiBVdCh0LGUsbixpLHIpe2xldCBvPSJzdHJpbmciPT10eXBlb2Ygci5tZXRob2Q/dFtyLm1ldGhvZF06ci5tZXRob2QsYT1yLnByb3BlcnR5O28/by5jYWxsKHQsdC5fX2RhdGFbYV0saVthXSk6ci5keW5hbWljRm58fGNvbnNvbGUud2Fybigib2JzZXJ2ZXIgbWV0aG9kIGAiK3IubWV0aG9kKyJgIG5vdCBkZWZpbmVkIil9ZnVuY3Rpb24ganQodCxlLG4pe2xldCBpPSQoZSk7cmV0dXJuIGkhPT1lJiYoR3QodCxsdChpKSsiLWNoYW5nZWQiLG5bZV0sZSksITApfWZ1bmN0aW9uIEd0KHQsZSxuLGkpe2xldCByPXt2YWx1ZTpuLHF1ZXVlUHJvcGVydHk6ITB9O2kmJihyLnBhdGg9aSksWSh0KS5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChlLHtkZXRhaWw6cn0pKX1mdW5jdGlvbiBXdCh0LGUsbixpLHIsbyl7bGV0IGE9KG8/JChlKTplKSE9ZT9lOm51bGwscz1hP250KHQsYSk6dC5fX2RhdGFbZV07YSYmdm9pZCAwPT09cyYmKHM9bltlXSksR3QodCxyLmV2ZW50TmFtZSxzLGEpfWZ1bmN0aW9uIHF0KHQsZSxuLGkscil7bGV0IG89dC5fX2RhdGFbZV07eSYmKG89eShvLHIuYXR0ck5hbWUsImF0dHJpYnV0ZSIsdCkpLHQuX3Byb3BlcnR5VG9BdHRyaWJ1dGUoZSxyLmF0dHJOYW1lLG8pfWNvbnN0IFl0PSh0LGUsbik9PntsZXQgaT0wLHI9ZS5sZW5ndGgtMSxvPS0xO2Zvcig7aTw9cjspe2NvbnN0IGE9aStyPj4xLHM9bi5nZXQoZVthXS5tZXRob2RJbmZvKS1uLmdldCh0Lm1ldGhvZEluZm8pO2lmKHM8MClpPWErMTtlbHNle2lmKCEocz4wKSl7bz1hO2JyZWFrfXI9YS0xfX1vPDAmJihvPXIrMSksZS5zcGxpY2UobywwLHQpfSxYdD0odCxlLG4saSxyKT0+e2NvbnN0IG89ZVtyPyQodCk6dF07aWYobylmb3IobGV0IGU9MDtlPG8ubGVuZ3RoO2UrKyl7Y29uc3QgYT1vW2VdO2EuaW5mby5sYXN0UnVuPT09UnR8fHImJiFWdCh0LGEudHJpZ2dlcil8fChhLmluZm8ubGFzdFJ1bj1SdCxZdChhLmluZm8sbixpKSl9fTtmdW5jdGlvbiAkdCh0LGUsbixpLHIpe2xldCBvPW5lKHQsZSxuLDAscik7aWYobz09PU90KXJldHVybiExO2xldCBhPXIubWV0aG9kSW5mbztyZXR1cm4gdC5fX2RhdGFIYXNBY2Nlc3NvciYmdC5fX2RhdGFIYXNBY2Nlc3NvclthXT90Ll9zZXRQZW5kaW5nUHJvcGVydHkoYSxvLCEwKToodFthXT1vLCExKX1mdW5jdGlvbiBLdCh0LGUsbixpLHIsbyxhKXtuLmJpbmRpbmdzPW4uYmluZGluZ3N8fFtdO2xldCBzPXtraW5kOmksdGFyZ2V0OnIscGFydHM6byxsaXRlcmFsOmEsaXNDb21wb3VuZDoxIT09by5sZW5ndGh9O2lmKG4uYmluZGluZ3MucHVzaChzKSwoZnVuY3Rpb24gbCh0KXtyZXR1cm4gQm9vbGVhbih0LnRhcmdldCkmJiJhdHRyaWJ1dGUiIT10LmtpbmQmJiJ0ZXh0IiE9dC5raW5kJiYhdC5pc0NvbXBvdW5kJiYieyI9PT10LnBhcnRzWzBdLm1vZGV9KShzKSl7bGV0e2V2ZW50OnQsbmVnYXRlOmV9PXMucGFydHNbMF07cy5saXN0ZW5lckV2ZW50PXR8fGx0KHIpKyItY2hhbmdlZCIscy5saXN0ZW5lck5lZ2F0ZT1lfWxldCBjPWUubm9kZUluZm9MaXN0Lmxlbmd0aDtmb3IobGV0IG49MDtuPHMucGFydHMubGVuZ3RoO24rKyl7bGV0IGk9cy5wYXJ0c1tuXTtpLmNvbXBvdW5kSW5kZXg9bixadCh0LGUscyxpLGMpfX1mdW5jdGlvbiBadCh0LGUsbixpLHIpe2lmKCFpLmxpdGVyYWwpaWYoImF0dHJpYnV0ZSI9PT1uLmtpbmQmJiItIj09PW4udGFyZ2V0WzBdKWNvbnNvbGUud2FybigiQ2Fubm90IHNldCBhdHRyaWJ1dGUgIituLnRhcmdldCsnIGJlY2F1c2UgIi0iIGlzIG5vdCBhIHZhbGlkIGF0dHJpYnV0ZSBzdGFydGluZyBjaGFyYWN0ZXInKTtlbHNle2xldCBvPWkuZGVwZW5kZW5jaWVzLGE9e2luZGV4OnIsYmluZGluZzpuLHBhcnQ6aSxldmFsdWF0b3I6dH07Zm9yKGxldCBuPTA7bjxvLmxlbmd0aDtuKyspe2xldCBpPW9bbl07InN0cmluZyI9PXR5cGVvZiBpJiYoaT1zZShpKSxpLndpbGRjYXJkPSEwKSx0Ll9hZGRUZW1wbGF0ZVByb3BlcnR5RWZmZWN0KGUsaS5yb290UHJvcGVydHkse2ZuOkp0LGluZm86YSx0cmlnZ2VyOml9KX19fWZ1bmN0aW9uIEp0KHQsZSxuLGkscixvLGEpe2xldCBzPWFbci5pbmRleF0sbD1yLmJpbmRpbmcsYz1yLnBhcnQ7aWYobyYmYy5zb3VyY2UmJmUubGVuZ3RoPmMuc291cmNlLmxlbmd0aCYmInByb3BlcnR5Ij09bC5raW5kJiYhbC5pc0NvbXBvdW5kJiZzLl9faXNQcm9wZXJ0eUVmZmVjdHNDbGllbnQmJnMuX19kYXRhSGFzQWNjZXNzb3ImJnMuX19kYXRhSGFzQWNjZXNzb3JbbC50YXJnZXRdKXtsZXQgaT1uW2VdO2U9SihjLnNvdXJjZSxsLnRhcmdldCxlKSxzLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoZSxpLCExLCEwKSYmdC5fZW5xdWV1ZUNsaWVudChzKX1lbHNle2xldCBhPXIuZXZhbHVhdG9yLl9ldmFsdWF0ZUJpbmRpbmcodCxjLGUsbixpLG8pO2EhPT1PdCYmKGZ1bmN0aW9uIHUodCxlLG4saSxyKXtpZihyPShmdW5jdGlvbiBvKHQsZSxuLGkpe2lmKG4uaXNDb21wb3VuZCl7bGV0IHI9dC5fX2RhdGFDb21wb3VuZFN0b3JhZ2Vbbi50YXJnZXRdO3JbaS5jb21wb3VuZEluZGV4XT1lLGU9ci5qb2luKCIiKX1yZXR1cm4iYXR0cmlidXRlIiE9PW4ua2luZCYmKCJ0ZXh0Q29udGVudCIhPT1uLnRhcmdldCYmKCJ2YWx1ZSIhPT1uLnRhcmdldHx8ImlucHV0IiE9PXQubG9jYWxOYW1lJiYidGV4dGFyZWEiIT09dC5sb2NhbE5hbWUpfHwoZT1udWxsPT1lPyIiOmUpKSxlfSkoZSxyLG4saSkseSYmKHI9eShyLG4udGFyZ2V0LG4ua2luZCxlKSksImF0dHJpYnV0ZSI9PW4ua2luZCl0Ll92YWx1ZVRvTm9kZUF0dHJpYnV0ZShlLHIsbi50YXJnZXQpO2Vsc2V7bGV0IGk9bi50YXJnZXQ7ZS5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50JiZlLl9fZGF0YUhhc0FjY2Vzc29yJiZlLl9fZGF0YUhhc0FjY2Vzc29yW2ldP2VbenQuUkVBRF9PTkxZXSYmZVt6dC5SRUFEX09OTFldW2ldfHxlLl9zZXRQZW5kaW5nUHJvcGVydHkoaSxyKSYmdC5fZW5xdWV1ZUNsaWVudChlKTp0Ll9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZShlLGkscil9fSkodCxzLGwsYyxhKX19ZnVuY3Rpb24gUXQodCxlKXtpZihlLmlzQ29tcG91bmQpe2xldCBuPXQuX19kYXRhQ29tcG91bmRTdG9yYWdlfHwodC5fX2RhdGFDb21wb3VuZFN0b3JhZ2U9e30pLGk9ZS5wYXJ0cyxyPW5ldyBBcnJheShpLmxlbmd0aCk7Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0Kyspclt0XT1pW3RdLmxpdGVyYWw7bGV0IG89ZS50YXJnZXQ7bltvXT1yLGUubGl0ZXJhbCYmInByb3BlcnR5Ij09ZS5raW5kJiYoImNsYXNzTmFtZSI9PT1vJiYodD1ZKHQpKSx0W29dPWUubGl0ZXJhbCl9fWZ1bmN0aW9uIHRlKHQsZSxuKXtpZihuLmxpc3RlbmVyRXZlbnQpe2xldCBpPW4ucGFydHNbMF07dC5hZGRFdmVudExpc3RlbmVyKG4ubGlzdGVuZXJFdmVudCwoZnVuY3Rpb24odCl7IShmdW5jdGlvbiByKHQsZSxuLGksbyl7bGV0IGEscz10LmRldGFpbCxsPXMmJnMucGF0aDtsPyhpPUoobixpLGwpLGE9cyYmcy52YWx1ZSk6YT10LmN1cnJlbnRUYXJnZXRbbl0sYT1vPyFhOmEsZVt6dC5SRUFEX09OTFldJiZlW3p0LlJFQURfT05MWV1baV18fCFlLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoaSxhLCEwLEJvb2xlYW4obCkpfHxzJiZzLnF1ZXVlUHJvcGVydHl8fGUuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCl9KSh0LGUsbi50YXJnZXQsaS5zb3VyY2UsaS5uZWdhdGUpfSkpfX1mdW5jdGlvbiBlZSh0LGUsbixpLHIsbyl7bGV0IGE9e21ldGhvZE5hbWU6ZS5tZXRob2ROYW1lLGFyZ3M6ZS5hcmdzLG1ldGhvZEluZm86cixkeW5hbWljRm46bz1lLnN0YXRpY3x8byYmKCJvYmplY3QiIT10eXBlb2Ygb3x8b1tlLm1ldGhvZE5hbWVdKX07Zm9yKGxldCByLG89MDtvPGUuYXJncy5sZW5ndGgmJihyPWUuYXJnc1tvXSk7bysrKXIubGl0ZXJhbHx8dC5fYWRkUHJvcGVydHlFZmZlY3Qoci5yb290UHJvcGVydHksbix7Zm46aSxpbmZvOmEsdHJpZ2dlcjpyfSk7cmV0dXJuIG8mJnQuX2FkZFByb3BlcnR5RWZmZWN0KGUubWV0aG9kTmFtZSxuLHtmbjppLGluZm86YX0pLGF9ZnVuY3Rpb24gbmUodCxlLG4saSxyKXtsZXQgbz10Ll9tZXRob2RIb3N0fHx0LGE9b1tyLm1ldGhvZE5hbWVdO2lmKGEpe2xldCBpPXQuX21hcnNoYWxBcmdzKHIuYXJncyxlLG4pO3JldHVybiBpPT09T3Q/T3Q6YS5hcHBseShvLGkpfXIuZHluYW1pY0ZufHxjb25zb2xlLndhcm4oIm1ldGhvZCBgIityLm1ldGhvZE5hbWUrImAgbm90IGRlZmluZWQiKX1jb25zdCBpZT1bXSxyZT1uZXcgUmVnRXhwKCIoXFxbXFxbfHt7KVxccyooPzooISlcXHMqKT8oKD86W2EtekEtWl8kXVtcXHcuOiRcXC0qXSopXFxzKig/OlxcKFxccyooPzooPzooPzooKD86W2EtekEtWl8kXVtcXHcuOiRcXC0qXSopfCg/OlstK10/WzAtOV0qXFwuP1swLTldKyg/OltlRV1bLStdP1swLTldKyk/KXwoPzooPzonKD86W14nXFxcXF18XFxcXC4pKicpfCg/OlwiKD86W15cIlxcXFxdfFxcXFwuKSpcIikpKVxccyopKD86LFxccyooPzooKD86W2EtekEtWl8kXVtcXHcuOiRcXC0qXSopfCg/OlstK10/WzAtOV0qXFwuP1swLTldKyg/OltlRV1bLStdP1swLTldKyk/KXwoPzooPzonKD86W14nXFxcXF18XFxcXC4pKicpfCg/OlwiKD86W15cIlxcXFxdfFxcXFwuKSpcIikpKVxccyopKSopPylcXClcXHMqKT8pKD86XV18fX0pIiwiZyIpO2Z1bmN0aW9uIG9lKHQpe2xldCBlPSIiO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKWUrPXRbbl0ubGl0ZXJhbHx8IiI7cmV0dXJuIGV9ZnVuY3Rpb24gYWUodCl7bGV0IGU9dC5tYXRjaCgvKFteXHNdKz8pXCgoW1xzXFNdKilcKS8pO2lmKGUpe2xldCB0PXttZXRob2ROYW1lOmVbMV0sc3RhdGljOiEwLGFyZ3M6aWV9O3JldHVybiBlWzJdLnRyaW0oKT8oZnVuY3Rpb24gbih0LGUpe3JldHVybiBlLmFyZ3M9dC5tYXAoKGZ1bmN0aW9uKHQpe2xldCBuPXNlKHQpO3JldHVybiBuLmxpdGVyYWx8fChlLnN0YXRpYz0hMSksbn0pLHRoaXMpLGV9KShlWzJdLnJlcGxhY2UoL1xcLC9nLCImY29tbWE7Iikuc3BsaXQoIiwiKSx0KTp0fXJldHVybiBudWxsfWZ1bmN0aW9uIHNlKHQpe2xldCBlPXQudHJpbSgpLnJlcGxhY2UoLyZjb21tYTsvZywiLCIpLnJlcGxhY2UoL1xcKC4pL2csIiQxIiksbj17bmFtZTplLHZhbHVlOiIiLGxpdGVyYWw6ITF9LGk9ZVswXTtzd2l0Y2goIi0iPT09aSYmKGk9ZVsxXSksaT49IjAiJiZpPD0iOSImJihpPSIjIiksaSl7Y2FzZSInIjpjYXNlJyInOm4udmFsdWU9ZS5zbGljZSgxLC0xKSxuLmxpdGVyYWw9ITA7YnJlYWs7Y2FzZSIjIjpuLnZhbHVlPU51bWJlcihlKSxuLmxpdGVyYWw9ITB9cmV0dXJuIG4ubGl0ZXJhbHx8KG4ucm9vdFByb3BlcnR5PSQoZSksbi5zdHJ1Y3R1cmVkPVgoZSksbi5zdHJ1Y3R1cmVkJiYobi53aWxkY2FyZD0iLioiPT1lLnNsaWNlKC0yKSxuLndpbGRjYXJkJiYobi5uYW1lPWUuc2xpY2UoMCwtMikpKSksbn1mdW5jdGlvbiBsZSh0LGUsbil7bGV0IGk9bnQodCxuKTtyZXR1cm4gdm9pZCAwPT09aSYmKGk9ZVtuXSksaX1mdW5jdGlvbiBjZSh0LGUsbixpKXtjb25zdCByPXtpbmRleFNwbGljZXM6aX07RSYmIXQuX292ZXJyaWRlTGVnYWN5VW5kZWZpbmVkJiYoZS5zcGxpY2VzPXIpLHQubm90aWZ5UGF0aChuKyIuc3BsaWNlcyIsciksdC5ub3RpZnlQYXRoKG4rIi5sZW5ndGgiLGUubGVuZ3RoKSxFJiYhdC5fb3ZlcnJpZGVMZWdhY3lVbmRlZmluZWQmJihyLmluZGV4U3BsaWNlcz1bXSl9ZnVuY3Rpb24gdWUodCxlLG4saSxyLG8pe2NlKHQsZSxuLFt7aW5kZXg6aSxhZGRlZENvdW50OnIscmVtb3ZlZDpvLG9iamVjdDplLHR5cGU6InNwbGljZSJ9XSl9Y29uc3QgaGU9SSgodD0+e2NvbnN0IGU9SXQoTXQodCkpO3JldHVybiBjbGFzcyBleHRlbmRzIGV7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX19pc1Byb3BlcnR5RWZmZWN0c0NsaWVudD0hMH1nZXQgUFJPUEVSVFlfRUZGRUNUX1RZUEVTKCl7cmV0dXJuIHp0fV9pbml0aWFsaXplUHJvcGVydGllcygpe3N1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpLHRoaXMuX3JlZ2lzdGVySG9zdCgpLHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5PSExLHRoaXMuX19kYXRhUGVuZGluZ0NsaWVudHM9bnVsbCx0aGlzLl9fZGF0YVRvTm90aWZ5PW51bGwsdGhpcy5fX2RhdGFMaW5rZWRQYXRocz1udWxsLHRoaXMuX19kYXRhSGFzUGF0aHM9ITEsdGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2U9dGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2V8fG51bGwsdGhpcy5fX2RhdGFIb3N0PXRoaXMuX19kYXRhSG9zdHx8bnVsbCx0aGlzLl9fZGF0YVRlbXA9e30sdGhpcy5fX2RhdGFDbGllbnRzSW5pdGlhbGl6ZWQ9ITF9X3JlZ2lzdGVySG9zdCgpe2lmKGRlLmxlbmd0aCl7bGV0IHQ9ZGVbZGUubGVuZ3RoLTFdO3QuX2VucXVldWVDbGllbnQodGhpcyksdGhpcy5fX2RhdGFIb3N0PXR9fV9pbml0aWFsaXplUHJvdG9Qcm9wZXJ0aWVzKHQpe3RoaXMuX19kYXRhPU9iamVjdC5jcmVhdGUodCksdGhpcy5fX2RhdGFQZW5kaW5nPU9iamVjdC5jcmVhdGUodCksdGhpcy5fX2RhdGFPbGQ9e319X2luaXRpYWxpemVJbnN0YW5jZVByb3BlcnRpZXModCl7bGV0IGU9dGhpc1t6dC5SRUFEX09OTFldO2ZvcihsZXQgbiBpbiB0KWUmJmVbbl18fCh0aGlzLl9fZGF0YVBlbmRpbmc9dGhpcy5fX2RhdGFQZW5kaW5nfHx7fSx0aGlzLl9fZGF0YU9sZD10aGlzLl9fZGF0YU9sZHx8e30sdGhpcy5fX2RhdGFbbl09dGhpcy5fX2RhdGFQZW5kaW5nW25dPXRbbl0pfV9hZGRQcm9wZXJ0eUVmZmVjdCh0LGUsbil7dGhpcy5fY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcih0LGU9PXp0LlJFQURfT05MWSk7bGV0IGk9QnQodGhpcyxlLCEwKVt0XTtpfHwoaT10aGlzW2VdW3RdPVtdKSxpLnB1c2gobil9X3JlbW92ZVByb3BlcnR5RWZmZWN0KHQsZSxuKXtsZXQgaT1CdCh0aGlzLGUsITApW3RdLHI9aS5pbmRleE9mKG4pO3I+PTAmJmkuc3BsaWNlKHIsMSl9X2hhc1Byb3BlcnR5RWZmZWN0KHQsZSl7bGV0IG49dGhpc1tlXTtyZXR1cm4gQm9vbGVhbihuJiZuW3RdKX1faGFzUmVhZE9ubHlFZmZlY3QodCl7cmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHQsenQuUkVBRF9PTkxZKX1faGFzTm90aWZ5RWZmZWN0KHQpe3JldHVybiB0aGlzLl9oYXNQcm9wZXJ0eUVmZmVjdCh0LHp0Lk5PVElGWSl9X2hhc1JlZmxlY3RFZmZlY3QodCl7cmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHQsenQuUkVGTEVDVCl9X2hhc0NvbXB1dGVkRWZmZWN0KHQpe3JldHVybiB0aGlzLl9oYXNQcm9wZXJ0eUVmZmVjdCh0LHp0LkNPTVBVVEUpfV9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgodCxlLG4saSl7aWYoaXx8JChBcnJheS5pc0FycmF5KHQpP3RbMF06dCkhPT10KXtpZighaSl7bGV0IG49bnQodGhpcyx0KTtpZighKHQ9aXQodGhpcyx0LGUpKXx8IXN1cGVyLl9zaG91bGRQcm9wZXJ0eUNoYW5nZSh0LGUsbikpcmV0dXJuITF9aWYodGhpcy5fX2RhdGFIYXNQYXRocz0hMCx0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkodCxlLG4pKXJldHVybihmdW5jdGlvbiByKHQsZSxuKXtsZXQgaT10Ll9fZGF0YUxpbmtlZFBhdGhzO2lmKGkpe2xldCByO2ZvcihsZXQgbyBpbiBpKXtsZXQgYT1pW29dO1oobyxlKT8ocj1KKG8sYSxlKSx0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocixuLCEwLCEwKSk6WihhLGUpJiYocj1KKGEsbyxlKSx0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocixuLCEwLCEwKSl9fX0pKHRoaXMsdCxlKSwhMH1lbHNle2lmKHRoaXMuX19kYXRhSGFzQWNjZXNzb3ImJnRoaXMuX19kYXRhSGFzQWNjZXNzb3JbdF0pcmV0dXJuIHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eSh0LGUsbik7dGhpc1t0XT1lfXJldHVybiExfV9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZSh0LGUsbil7bj09PXRbZV0mJiJvYmplY3QiIT10eXBlb2Ygbnx8KCJjbGFzc05hbWUiPT09ZSYmKHQ9WSh0KSksdFtlXT1uKX1fc2V0UGVuZGluZ1Byb3BlcnR5KHQsZSxuKXtsZXQgaT10aGlzLl9fZGF0YUhhc1BhdGhzJiZYKHQpO3JldHVybiEhdGhpcy5fc2hvdWxkUHJvcGVydHlDaGFuZ2UodCxlLChpP3RoaXMuX19kYXRhVGVtcDp0aGlzLl9fZGF0YSlbdF0pJiYodGhpcy5fX2RhdGFQZW5kaW5nfHwodGhpcy5fX2RhdGFQZW5kaW5nPXt9LHRoaXMuX19kYXRhT2xkPXt9KSx0IGluIHRoaXMuX19kYXRhT2xkfHwodGhpcy5fX2RhdGFPbGRbdF09dGhpcy5fX2RhdGFbdF0pLGk/dGhpcy5fX2RhdGFUZW1wW3RdPWU6dGhpcy5fX2RhdGFbdF09ZSx0aGlzLl9fZGF0YVBlbmRpbmdbdF09ZSwoaXx8dGhpc1t6dC5OT1RJRlldJiZ0aGlzW3p0Lk5PVElGWV1bdF0pJiYodGhpcy5fX2RhdGFUb05vdGlmeT10aGlzLl9fZGF0YVRvTm90aWZ5fHx7fSx0aGlzLl9fZGF0YVRvTm90aWZ5W3RdPW4pLCEwKX1fc2V0UHJvcGVydHkodCxlKXt0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkodCxlLCEwKSYmdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKX1faW52YWxpZGF0ZVByb3BlcnRpZXMoKXt0aGlzLl9fZGF0YVJlYWR5JiZ0aGlzLl9mbHVzaFByb3BlcnRpZXMoKX1fZW5xdWV1ZUNsaWVudCh0KXt0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzPXRoaXMuX19kYXRhUGVuZGluZ0NsaWVudHN8fFtdLHQhPT10aGlzJiZ0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzLnB1c2godCl9X2ZsdXNoQ2xpZW50cygpe3RoaXMuX19kYXRhQ2xpZW50c1JlYWR5P3RoaXMuX19lbmFibGVPckZsdXNoQ2xpZW50cygpOih0aGlzLl9fZGF0YUNsaWVudHNSZWFkeT0hMCx0aGlzLl9yZWFkeUNsaWVudHMoKSx0aGlzLl9fZGF0YVJlYWR5PSEwKX1fX2VuYWJsZU9yRmx1c2hDbGllbnRzKCl7bGV0IHQ9dGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cztpZih0KXt0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzPW51bGw7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2xldCBuPXRbZV07bi5fX2RhdGFFbmFibGVkP24uX19kYXRhUGVuZGluZyYmbi5fZmx1c2hQcm9wZXJ0aWVzKCk6bi5fZW5hYmxlUHJvcGVydGllcygpfX19X3JlYWR5Q2xpZW50cygpe3RoaXMuX19lbmFibGVPckZsdXNoQ2xpZW50cygpfXNldFByb3BlcnRpZXModCxlKXtmb3IobGV0IG4gaW4gdCkhZSYmdGhpc1t6dC5SRUFEX09OTFldJiZ0aGlzW3p0LlJFQURfT05MWV1bbl18fHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChuLHRbbl0sITApO3RoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCl9cmVhZHkoKXt0aGlzLl9mbHVzaFByb3BlcnRpZXMoKSx0aGlzLl9fZGF0YUNsaWVudHNSZWFkeXx8dGhpcy5fZmx1c2hDbGllbnRzKCksdGhpcy5fX2RhdGFQZW5kaW5nJiZ0aGlzLl9mbHVzaFByb3BlcnRpZXMoKX1fcHJvcGVydGllc0NoYW5nZWQodCxlLG4pe2xldCBpLHI9dGhpcy5fX2RhdGFIYXNQYXRoczt0aGlzLl9fZGF0YUhhc1BhdGhzPSExLChmdW5jdGlvbiBvKHQsZSxuLGkpe2xldCByPXRbenQuQ09NUFVURV07aWYocilpZihUKXtSdCsrO2NvbnN0IG89KGZ1bmN0aW9uIGEodCl7bGV0IGU9dC5jb25zdHJ1Y3Rvci5fX29yZGVyZWRDb21wdXRlZERlcHM7aWYoIWUpe2U9bmV3IE1hcDtjb25zdCBuPXRbenQuQ09NUFVURV07bGV0IGkse2NvdW50czpyLHJlYWR5Om8sdG90YWw6YX09KGZ1bmN0aW9uIHModCl7Y29uc3QgZT10Ll9fY29tcHV0ZUluZm8sbj17fSxpPXRbenQuQ09NUFVURV0scj1bXTtsZXQgbz0wO2ZvcihsZXQgdCBpbiBlKXtjb25zdCBpPWVbdF07bys9blt0XT1pLmFyZ3MuZmlsdGVyKCh0PT4hdC5saXRlcmFsKSkubGVuZ3RoKyhpLmR5bmFtaWNGbj8xOjApfWZvcihsZXQgdCBpbiBpKWVbdF18fHIucHVzaCh0KTtyZXR1cm57Y291bnRzOm4scmVhZHk6cix0b3RhbDpvfX0pKHQpO2Zvcig7aT1vLnNoaWZ0KCk7KXtlLnNldChpLGUuc2l6ZSk7Y29uc3QgdD1uW2ldO3QmJnQuZm9yRWFjaCgodD0+e2NvbnN0IGU9dC5pbmZvLm1ldGhvZEluZm87LS1hLDA9PS0tcltlXSYmby5wdXNoKGUpfSkpfTAhPT1hJiZjb25zb2xlLndhcm4oYENvbXB1dGVkIGdyYXBoIGZvciAke3QubG9jYWxOYW1lfSBpbmNvbXBsZXRlOyBjaXJjdWxhcj9gKSx0LmNvbnN0cnVjdG9yLl9fb3JkZXJlZENvbXB1dGVkRGVwcz1lfXJldHVybiBlfSkodCkscz1bXTtmb3IobGV0IHQgaW4gZSlYdCh0LHIscyxvLGkpO2xldCBsO2Zvcig7bD1zLnNoaWZ0KCk7KSR0KHQsIiIsZSwwLGwpJiZYdChsLm1ldGhvZEluZm8scixzLG8saSk7T2JqZWN0LmFzc2lnbihuLHQuX19kYXRhT2xkKSxPYmplY3QuYXNzaWduKGUsdC5fX2RhdGFQZW5kaW5nKSx0Ll9fZGF0YVBlbmRpbmc9bnVsbH1lbHNle2xldCBvPWU7Zm9yKDtIdCh0LHIsbyxuLGkpOylPYmplY3QuYXNzaWduKG4sdC5fX2RhdGFPbGQpLE9iamVjdC5hc3NpZ24oZSx0Ll9fZGF0YVBlbmRpbmcpLG89dC5fX2RhdGFQZW5kaW5nLHQuX19kYXRhUGVuZGluZz1udWxsfX0pKHRoaXMsZSxuLHIpLGk9dGhpcy5fX2RhdGFUb05vdGlmeSx0aGlzLl9fZGF0YVRvTm90aWZ5PW51bGwsdGhpcy5fcHJvcGFnYXRlUHJvcGVydHlDaGFuZ2VzKGUsbixyKSx0aGlzLl9mbHVzaENsaWVudHMoKSxIdCh0aGlzLHRoaXNbenQuUkVGTEVDVF0sZSxuLHIpLEh0KHRoaXMsdGhpc1t6dC5PQlNFUlZFXSxlLG4sciksaSYmKGZ1bmN0aW9uIGEodCxlLG4saSxyKXtsZXQgbyxhLHM9dFt6dC5OT1RJRlldLGw9UnQrKztmb3IobGV0IGEgaW4gZSllW2FdJiYocyYmRnQodCxzLGwsYSxuLGkscil8fHImJmp0KHQsYSxuKSkmJihvPSEwKTtvJiYoYT10Ll9fZGF0YUhvc3QpJiZhLl9pbnZhbGlkYXRlUHJvcGVydGllcyYmYS5faW52YWxpZGF0ZVByb3BlcnRpZXMoKX0pKHRoaXMsaSxlLG4sciksMT09dGhpcy5fX2RhdGFDb3VudGVyJiYodGhpcy5fX2RhdGFUZW1wPXt9KX1fcHJvcGFnYXRlUHJvcGVydHlDaGFuZ2VzKHQsZSxuKXt0aGlzW3p0LlBST1BBR0FURV0mJkh0KHRoaXMsdGhpc1t6dC5QUk9QQUdBVEVdLHQsZSxuKSx0aGlzLl9fdGVtcGxhdGVJbmZvJiZ0aGlzLl9ydW5FZmZlY3RzRm9yVGVtcGxhdGUodGhpcy5fX3RlbXBsYXRlSW5mbyx0LGUsbil9X3J1bkVmZmVjdHNGb3JUZW1wbGF0ZSh0LGUsbixpKXtjb25zdCByPShlLGkpPT57SHQodGhpcyx0LnByb3BlcnR5RWZmZWN0cyxlLG4saSx0Lm5vZGVMaXN0KTtmb3IobGV0IHI9dC5maXJzdENoaWxkO3I7cj1yLm5leHRTaWJsaW5nKXRoaXMuX3J1bkVmZmVjdHNGb3JUZW1wbGF0ZShyLGUsbixpKX07dC5ydW5FZmZlY3RzP3QucnVuRWZmZWN0cyhyLGUsaSk6cihlLGkpfWxpbmtQYXRocyh0LGUpe3Q9dHQodCksZT10dChlKSx0aGlzLl9fZGF0YUxpbmtlZFBhdGhzPXRoaXMuX19kYXRhTGlua2VkUGF0aHN8fHt9LHRoaXMuX19kYXRhTGlua2VkUGF0aHNbdF09ZX11bmxpbmtQYXRocyh0KXt0PXR0KHQpLHRoaXMuX19kYXRhTGlua2VkUGF0aHMmJmRlbGV0ZSB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzW3RdfW5vdGlmeVNwbGljZXModCxlKXtsZXQgbj17cGF0aDoiIn07Y2UodGhpcyxudCh0aGlzLHQsbiksbi5wYXRoLGUpfWdldCh0LGUpe3JldHVybiBudChlfHx0aGlzLHQpfXNldCh0LGUsbil7bj9pdChuLHQsZSk6dGhpc1t6dC5SRUFEX09OTFldJiZ0aGlzW3p0LlJFQURfT05MWV1bdF18fHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aCh0LGUsITApJiZ0aGlzLl9pbnZhbGlkYXRlUHJvcGVydGllcygpfXB1c2godCwuLi5lKXtsZXQgbj17cGF0aDoiIn0saT1udCh0aGlzLHQsbikscj1pLmxlbmd0aCxvPWkucHVzaCguLi5lKTtyZXR1cm4gZS5sZW5ndGgmJnVlKHRoaXMsaSxuLnBhdGgscixlLmxlbmd0aCxbXSksb31wb3AodCl7bGV0IGU9e3BhdGg6IiJ9LG49bnQodGhpcyx0LGUpLGk9Qm9vbGVhbihuLmxlbmd0aCkscj1uLnBvcCgpO3JldHVybiBpJiZ1ZSh0aGlzLG4sZS5wYXRoLG4ubGVuZ3RoLDAsW3JdKSxyfXNwbGljZSh0LGUsbiwuLi5pKXtsZXQgcixvPXtwYXRoOiIifSxhPW50KHRoaXMsdCxvKTtyZXR1cm4gZTwwP2U9YS5sZW5ndGgtTWF0aC5mbG9vcigtZSk6ZSYmKGU9TWF0aC5mbG9vcihlKSkscj0yPT09YXJndW1lbnRzLmxlbmd0aD9hLnNwbGljZShlKTphLnNwbGljZShlLG4sLi4uaSksKGkubGVuZ3RofHxyLmxlbmd0aCkmJnVlKHRoaXMsYSxvLnBhdGgsZSxpLmxlbmd0aCxyKSxyfXNoaWZ0KHQpe2xldCBlPXtwYXRoOiIifSxuPW50KHRoaXMsdCxlKSxpPUJvb2xlYW4obi5sZW5ndGgpLHI9bi5zaGlmdCgpO3JldHVybiBpJiZ1ZSh0aGlzLG4sZS5wYXRoLDAsMCxbcl0pLHJ9dW5zaGlmdCh0LC4uLmUpe2xldCBuPXtwYXRoOiIifSxpPW50KHRoaXMsdCxuKSxyPWkudW5zaGlmdCguLi5lKTtyZXR1cm4gZS5sZW5ndGgmJnVlKHRoaXMsaSxuLnBhdGgsMCxlLmxlbmd0aCxbXSkscn1ub3RpZnlQYXRoKHQsZSl7bGV0IG47aWYoMT09YXJndW1lbnRzLmxlbmd0aCl7bGV0IGk9e3BhdGg6IiJ9O2U9bnQodGhpcyx0LGkpLG49aS5wYXRofWVsc2Ugbj1BcnJheS5pc0FycmF5KHQpP3R0KHQpOnQ7dGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKG4sZSwhMCwhMCkmJnRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCl9X2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkodCxlKXt0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdCh0LHp0LlJFQURfT05MWSksZSYmKHRoaXNbIl9zZXQiKyhmdW5jdGlvbiBuKHQpe3JldHVybiB0WzBdLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHJpbmcoMSl9KSh0KV09ZnVuY3Rpb24oZSl7dGhpcy5fc2V0UHJvcGVydHkodCxlKX0pfV9jcmVhdGVQcm9wZXJ0eU9ic2VydmVyKHQsZSxuKXtsZXQgaT17cHJvcGVydHk6dCxtZXRob2Q6ZSxkeW5hbWljRm46Qm9vbGVhbihuKX07dGhpcy5fYWRkUHJvcGVydHlFZmZlY3QodCx6dC5PQlNFUlZFLHtmbjpVdCxpbmZvOmksdHJpZ2dlcjp7bmFtZTp0fX0pLG4mJnRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KGUsenQuT0JTRVJWRSx7Zm46VXQsaW5mbzppLHRyaWdnZXI6e25hbWU6ZX19KX1fY3JlYXRlTWV0aG9kT2JzZXJ2ZXIodCxlKXtsZXQgbj1hZSh0KTtpZighbil0aHJvdyBuZXcgRXJyb3IoIk1hbGZvcm1lZCBvYnNlcnZlciBleHByZXNzaW9uICciK3QrIiciKTtlZSh0aGlzLG4senQuT0JTRVJWRSxuZSxudWxsLGUpfV9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eSh0KXt0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdCh0LHp0Lk5PVElGWSx7Zm46V3QsaW5mbzp7ZXZlbnROYW1lOmx0KHQpKyItY2hhbmdlZCIscHJvcGVydHk6dH19KX1fY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkodCl7bGV0IGU9dGhpcy5jb25zdHJ1Y3Rvci5hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkodCk7Ii0iPT09ZVswXT9jb25zb2xlLndhcm4oIlByb3BlcnR5ICIrdCsiIGNhbm5vdCBiZSByZWZsZWN0ZWQgdG8gYXR0cmlidXRlICIrZSsnIGJlY2F1c2UgIi0iIGlzIG5vdCBhIHZhbGlkIHN0YXJ0aW5nIGF0dHJpYnV0ZSBuYW1lLiBVc2UgYSBsb3dlcmNhc2UgZmlyc3QgbGV0dGVyIGZvciB0aGUgcHJvcGVydHkgaW5zdGVhZC4nKTp0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdCh0LHp0LlJFRkxFQ1Qse2ZuOnF0LGluZm86e2F0dHJOYW1lOmV9fSl9X2NyZWF0ZUNvbXB1dGVkUHJvcGVydHkodCxlLG4pe2xldCBpPWFlKGUpO2lmKCFpKXRocm93IG5ldyBFcnJvcigiTWFsZm9ybWVkIGNvbXB1dGVkIGV4cHJlc3Npb24gJyIrZSsiJyIpO2NvbnN0IHI9ZWUodGhpcyxpLHp0LkNPTVBVVEUsJHQsdCxuKTtCdCh0aGlzLCJfX2NvbXB1dGVJbmZvIilbdF09cn1fbWFyc2hhbEFyZ3ModCxlLG4pe2NvbnN0IGk9dGhpcy5fX2RhdGEscj1bXTtmb3IobGV0IG89MCxhPXQubGVuZ3RoO288YTtvKyspe2xldHtuYW1lOmEsc3RydWN0dXJlZDpzLHdpbGRjYXJkOmwsdmFsdWU6YyxsaXRlcmFsOnV9PXRbb107aWYoIXUpaWYobCl7Y29uc3QgdD1aKGEsZSkscj1sZShpLG4sdD9lOmEpO2M9e3BhdGg6dD9lOmEsdmFsdWU6cixiYXNlOnQ/bnQoaSxhKTpyfX1lbHNlIGM9cz9sZShpLG4sYSk6aVthXTtpZihFJiYhdGhpcy5fb3ZlcnJpZGVMZWdhY3lVbmRlZmluZWQmJnZvaWQgMD09PWMmJnQubGVuZ3RoPjEpcmV0dXJuIE90O3Jbb109Y31yZXR1cm4gcn1zdGF0aWMgYWRkUHJvcGVydHlFZmZlY3QodCxlLG4pe3RoaXMucHJvdG90eXBlLl9hZGRQcm9wZXJ0eUVmZmVjdCh0LGUsbil9c3RhdGljIGNyZWF0ZVByb3BlcnR5T2JzZXJ2ZXIodCxlLG4pe3RoaXMucHJvdG90eXBlLl9jcmVhdGVQcm9wZXJ0eU9ic2VydmVyKHQsZSxuKX1zdGF0aWMgY3JlYXRlTWV0aG9kT2JzZXJ2ZXIodCxlKXt0aGlzLnByb3RvdHlwZS5fY3JlYXRlTWV0aG9kT2JzZXJ2ZXIodCxlKX1zdGF0aWMgY3JlYXRlTm90aWZ5aW5nUHJvcGVydHkodCl7dGhpcy5wcm90b3R5cGUuX2NyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5KHQpfXN0YXRpYyBjcmVhdGVSZWFkT25seVByb3BlcnR5KHQsZSl7dGhpcy5wcm90b3R5cGUuX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkodCxlKX1zdGF0aWMgY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkodCl7dGhpcy5wcm90b3R5cGUuX2NyZWF0ZVJlZmxlY3RlZFByb3BlcnR5KHQpfXN0YXRpYyBjcmVhdGVDb21wdXRlZFByb3BlcnR5KHQsZSxuKXt0aGlzLnByb3RvdHlwZS5fY3JlYXRlQ29tcHV0ZWRQcm9wZXJ0eSh0LGUsbil9c3RhdGljIGJpbmRUZW1wbGF0ZSh0KXtyZXR1cm4gdGhpcy5wcm90b3R5cGUuX2JpbmRUZW1wbGF0ZSh0KX1fYmluZFRlbXBsYXRlKHQsZSl7bGV0IG49dGhpcy5jb25zdHJ1Y3Rvci5fcGFyc2VUZW1wbGF0ZSh0KSxpPXRoaXMuX19wcmVCb3VuZFRlbXBsYXRlSW5mbz09bjtpZighaSlmb3IobGV0IHQgaW4gbi5wcm9wZXJ0eUVmZmVjdHMpdGhpcy5fY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcih0KTtpZihlKWlmKG49T2JqZWN0LmNyZWF0ZShuKSxuLndhc1ByZUJvdW5kPWksdGhpcy5fX3RlbXBsYXRlSW5mbyl7Y29uc3QgZT10Ll9wYXJlbnRUZW1wbGF0ZUluZm98fHRoaXMuX190ZW1wbGF0ZUluZm8saT1lLmxhc3RDaGlsZDtuLnBhcmVudD1lLGUubGFzdENoaWxkPW4sbi5wcmV2aW91c1NpYmxpbmc9aSxpP2kubmV4dFNpYmxpbmc9bjplLmZpcnN0Q2hpbGQ9bn1lbHNlIHRoaXMuX190ZW1wbGF0ZUluZm89bjtlbHNlIHRoaXMuX19wcmVCb3VuZFRlbXBsYXRlSW5mbz1uO3JldHVybiBufXN0YXRpYyBfYWRkVGVtcGxhdGVQcm9wZXJ0eUVmZmVjdCh0LGUsbil7KHQuaG9zdFByb3BzPXQuaG9zdFByb3BzfHx7fSlbZV09ITA7bGV0IGk9dC5wcm9wZXJ0eUVmZmVjdHM9dC5wcm9wZXJ0eUVmZmVjdHN8fHt9OyhpW2VdPWlbZV18fFtdKS5wdXNoKG4pfV9zdGFtcFRlbXBsYXRlKHQsZSl7ZT1lfHx0aGlzLl9iaW5kVGVtcGxhdGUodCwhMCksZGUucHVzaCh0aGlzKTtsZXQgbj1zdXBlci5fc3RhbXBUZW1wbGF0ZSh0LGUpO2lmKGRlLnBvcCgpLGUubm9kZUxpc3Q9bi5ub2RlTGlzdCwhZS53YXNQcmVCb3VuZCl7bGV0IHQ9ZS5jaGlsZE5vZGVzPVtdO2ZvcihsZXQgZT1uLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpdC5wdXNoKGUpfXJldHVybiBuLnRlbXBsYXRlSW5mbz1lLChmdW5jdGlvbiBpKHQsZSl7bGV0e25vZGVMaXN0Om4sbm9kZUluZm9MaXN0Oml9PWU7aWYoaS5sZW5ndGgpZm9yKGxldCBlPTA7ZTxpLmxlbmd0aDtlKyspe2xldCByPW5bZV0sbz1pW2VdLmJpbmRpbmdzO2lmKG8pZm9yKGxldCBlPTA7ZTxvLmxlbmd0aDtlKyspe2xldCBuPW9bZV07UXQocixuKSx0ZShyLHQsbil9ci5fX2RhdGFIb3N0PXR9fSkodGhpcyxlKSx0aGlzLl9fZGF0YUNsaWVudHNSZWFkeSYmKHRoaXMuX3J1bkVmZmVjdHNGb3JUZW1wbGF0ZShlLHRoaXMuX19kYXRhLG51bGwsITEpLHRoaXMuX2ZsdXNoQ2xpZW50cygpKSxufV9yZW1vdmVCb3VuZERvbSh0KXtjb25zdCBlPXQudGVtcGxhdGVJbmZvLHtwcmV2aW91c1NpYmxpbmc6bixuZXh0U2libGluZzppLHBhcmVudDpyfT1lO24/bi5uZXh0U2libGluZz1pOnImJihyLmZpcnN0Q2hpbGQ9aSksaT9pLnByZXZpb3VzU2libGluZz1uOnImJihyLmxhc3RDaGlsZD1uKSxlLm5leHRTaWJsaW5nPWUucHJldmlvdXNTaWJsaW5nPW51bGw7bGV0IG89ZS5jaGlsZE5vZGVzO2ZvcihsZXQgdD0wO3Q8by5sZW5ndGg7dCsrKXtsZXQgZT1vW3RdO1koWShlKS5wYXJlbnROb2RlKS5yZW1vdmVDaGlsZChlKX19c3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZSh0LG4saSl7bGV0IHI9ZS5fcGFyc2VUZW1wbGF0ZU5vZGUuY2FsbCh0aGlzLHQsbixpKTtpZih0Lm5vZGVUeXBlPT09Tm9kZS5URVhUX05PREUpe2xldCBlPXRoaXMuX3BhcnNlQmluZGluZ3ModC50ZXh0Q29udGVudCxuKTtlJiYodC50ZXh0Q29udGVudD1vZShlKXx8IiAiLEt0KHRoaXMsbixpLCJ0ZXh0IiwidGV4dENvbnRlbnQiLGUpLHI9ITApfXJldHVybiByfXN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUodCxuLGkscixvKXtsZXQgYT10aGlzLl9wYXJzZUJpbmRpbmdzKG8sbik7aWYoYSl7bGV0IGU9cixvPSJwcm9wZXJ0eSI7RHQudGVzdChyKT9vPSJhdHRyaWJ1dGUiOiIkIj09cltyLmxlbmd0aC0xXSYmKHI9ci5zbGljZSgwLC0xKSxvPSJhdHRyaWJ1dGUiKTtsZXQgcz1vZShhKTtyZXR1cm4gcyYmImF0dHJpYnV0ZSI9PW8mJigiY2xhc3MiPT1yJiZ0Lmhhc0F0dHJpYnV0ZSgiY2xhc3MiKSYmKHMrPSIgIit0LmdldEF0dHJpYnV0ZShyKSksdC5zZXRBdHRyaWJ1dGUocixzKSksImF0dHJpYnV0ZSI9PW8mJiJkaXNhYmxlLXVwZ3JhZGUkIj09ZSYmdC5zZXRBdHRyaWJ1dGUociwiIiksImlucHV0Ij09PXQubG9jYWxOYW1lJiYidmFsdWUiPT09ZSYmdC5zZXRBdHRyaWJ1dGUoZSwiIiksdC5yZW1vdmVBdHRyaWJ1dGUoZSksInByb3BlcnR5Ij09PW8mJihyPXN0KHIpKSxLdCh0aGlzLG4saSxvLHIsYSxzKSwhMH1yZXR1cm4gZS5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUuY2FsbCh0aGlzLHQsbixpLHIsbyl9c3RhdGljIF9wYXJzZVRlbXBsYXRlTmVzdGVkVGVtcGxhdGUodCxuLGkpe2xldCByPWUuX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZS5jYWxsKHRoaXMsdCxuLGkpO2NvbnN0IG89dC5wYXJlbnROb2RlLGE9aS50ZW1wbGF0ZUluZm8scz0iZG9tLWlmIj09PW8ubG9jYWxOYW1lO0MmJihzfHwiZG9tLXJlcGVhdCI9PT1vLmxvY2FsTmFtZSkmJihvLnJlbW92ZUNoaWxkKHQpLChpPWkucGFyZW50SW5mbykudGVtcGxhdGVJbmZvPWEsaS5ub3RlZD0hMCxyPSExKTtsZXQgbD1hLmhvc3RQcm9wcztpZihBJiZzKWwmJihuLmhvc3RQcm9wcz1PYmplY3QuYXNzaWduKG4uaG9zdFByb3BzfHx7fSxsKSxDfHwoaS5wYXJlbnRJbmZvLm5vdGVkPSEwKSk7ZWxzZXtsZXQgdD0ieyI7Zm9yKGxldCBlIGluIGwpS3QodGhpcyxuLGksInByb3BlcnR5IiwiX2hvc3RfIitlLFt7bW9kZTp0LHNvdXJjZTplLGRlcGVuZGVuY2llczpbZV0saG9zdFByb3A6ITB9XSl9cmV0dXJuIHJ9c3RhdGljIF9wYXJzZUJpbmRpbmdzKHQsZSl7bGV0IG4saT1bXSxyPTA7Zm9yKDtudWxsIT09KG49cmUuZXhlYyh0KSk7KXtuLmluZGV4PnImJmkucHVzaCh7bGl0ZXJhbDp0LnNsaWNlKHIsbi5pbmRleCl9KTtsZXQgbz1uWzFdWzBdLGE9Qm9vbGVhbihuWzJdKSxzPW5bM10udHJpbSgpLGw9ITEsYz0iIix1PS0xOyJ7Ij09byYmKHU9cy5pbmRleE9mKCI6OiIpKT4wJiYoYz1zLnN1YnN0cmluZyh1KzIpLHM9cy5zdWJzdHJpbmcoMCx1KSxsPSEwKTtsZXQgaD1hZShzKSxkPVtdO2lmKGgpe2xldHthcmdzOnQsbWV0aG9kTmFtZTpufT1oO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtsZXQgbj10W2VdO24ubGl0ZXJhbHx8ZC5wdXNoKG4pfWxldCBpPWUuZHluYW1pY0ZuczsoaSYmaVtuXXx8aC5zdGF0aWMpJiYoZC5wdXNoKG4pLGguZHluYW1pY0ZuPSEwKX1lbHNlIGQucHVzaChzKTtpLnB1c2goe3NvdXJjZTpzLG1vZGU6byxuZWdhdGU6YSxjdXN0b21FdmVudDpsLHNpZ25hdHVyZTpoLGRlcGVuZGVuY2llczpkLGV2ZW50OmN9KSxyPXJlLmxhc3RJbmRleH1pZihyJiZyPHQubGVuZ3RoKXtsZXQgZT10LnN1YnN0cmluZyhyKTtlJiZpLnB1c2goe2xpdGVyYWw6ZX0pfXJldHVybiBpLmxlbmd0aD9pOm51bGx9c3RhdGljIF9ldmFsdWF0ZUJpbmRpbmcodCxlLG4saSxyLG8pe2xldCBhO3JldHVybiBhPWUuc2lnbmF0dXJlP25lKHQsbixpLDAsZS5zaWduYXR1cmUpOm4hPWUuc291cmNlP250KHQsZS5zb3VyY2UpOm8mJlgobik/bnQodCxuKTp0Ll9fZGF0YVtuXSxlLm5lZ2F0ZSYmKGE9IWEpLGF9fX0pKSxkZT1bXSxwZT1JKCh0PT57Y29uc3QgZT14dCh0KTtmdW5jdGlvbiBuKHQpe2NvbnN0IGU9T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpO3JldHVybiBlLnByb3RvdHlwZSBpbnN0YW5jZW9mIHI/ZTpudWxsfWZ1bmN0aW9uIGkodCl7aWYoIXQuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiX19vd25Qcm9wZXJ0aWVzIix0KSkpe2xldCBlPW51bGw7aWYodC5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJwcm9wZXJ0aWVzIix0KSkpe2NvbnN0IG49dC5wcm9wZXJ0aWVzO24mJihlPSgKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KZnVuY3Rpb24gZSh0KXtjb25zdCBlPXt9O2ZvcihsZXQgbiBpbiB0KXtjb25zdCBpPXRbbl07ZVtuXT0iZnVuY3Rpb24iPT10eXBlb2YgaT97dHlwZTppfTppfXJldHVybiBlfSkobikpfXQuX19vd25Qcm9wZXJ0aWVzPWV9cmV0dXJuIHQuX19vd25Qcm9wZXJ0aWVzfWNsYXNzIHIgZXh0ZW5kcyBle3N0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCl7aWYoIXRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiX19vYnNlcnZlZEF0dHJpYnV0ZXMiLHRoaXMpKSl7Y29uc3QgdD10aGlzLl9wcm9wZXJ0aWVzO3RoaXMuX19vYnNlcnZlZEF0dHJpYnV0ZXM9dD9PYmplY3Qua2V5cyh0KS5tYXAoKHQ9PnRoaXMucHJvdG90eXBlLl9hZGRQcm9wZXJ0eVRvQXR0cmlidXRlTWFwKHQpKSk6W119cmV0dXJuIHRoaXMuX19vYnNlcnZlZEF0dHJpYnV0ZXN9c3RhdGljIGZpbmFsaXplKCl7aWYoIXRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiX19maW5hbGl6ZWQiLHRoaXMpKSl7Y29uc3QgdD1uKHRoaXMpO3QmJnQuZmluYWxpemUoKSx0aGlzLl9fZmluYWxpemVkPSEwLHRoaXMuX2ZpbmFsaXplQ2xhc3MoKX19c3RhdGljIF9maW5hbGl6ZUNsYXNzKCl7Y29uc3QgdD1pKHRoaXMpO3QmJnRoaXMuY3JlYXRlUHJvcGVydGllcyh0KX1zdGF0aWMgZ2V0IF9wcm9wZXJ0aWVzKCl7aWYoIXRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiX19wcm9wZXJ0aWVzIix0aGlzKSkpe2NvbnN0IHQ9bih0aGlzKTt0aGlzLl9fcHJvcGVydGllcz1PYmplY3QuYXNzaWduKHt9LHQmJnQuX3Byb3BlcnRpZXMsaSh0aGlzKSl9cmV0dXJuIHRoaXMuX19wcm9wZXJ0aWVzfXN0YXRpYyB0eXBlRm9yUHJvcGVydHkodCl7Y29uc3QgZT10aGlzLl9wcm9wZXJ0aWVzW3RdO3JldHVybiBlJiZlLnR5cGV9X2luaXRpYWxpemVQcm9wZXJ0aWVzKCl7dGhpcy5jb25zdHJ1Y3Rvci5maW5hbGl6ZSgpLHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpfWNvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2smJnN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCksdGhpcy5fZW5hYmxlUHJvcGVydGllcygpfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2smJnN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCl9fXJldHVybiByfSkpLGZlPXdpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkLG1lPUkoKHQ9Pntjb25zdCBlPXBlKGhlKHQpKTtmdW5jdGlvbiBuKHQsZSxuLGkpe24uY29tcHV0ZWQmJihuLnJlYWRPbmx5PSEwKSxuLmNvbXB1dGVkJiYodC5faGFzUmVhZE9ubHlFZmZlY3QoZSk/Y29uc29sZS53YXJuKGBDYW5ub3QgcmVkZWZpbmUgY29tcHV0ZWQgcHJvcGVydHkgJyR7ZX0nLmApOnQuX2NyZWF0ZUNvbXB1dGVkUHJvcGVydHkoZSxuLmNvbXB1dGVkLGkpKSxuLnJlYWRPbmx5JiYhdC5faGFzUmVhZE9ubHlFZmZlY3QoZSk/dC5fY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eShlLCFuLmNvbXB1dGVkKTohMT09PW4ucmVhZE9ubHkmJnQuX2hhc1JlYWRPbmx5RWZmZWN0KGUpJiZjb25zb2xlLndhcm4oYENhbm5vdCBtYWtlIHJlYWRPbmx5IHByb3BlcnR5ICcke2V9JyBub24tcmVhZE9ubHkuYCksbi5yZWZsZWN0VG9BdHRyaWJ1dGUmJiF0Ll9oYXNSZWZsZWN0RWZmZWN0KGUpP3QuX2NyZWF0ZVJlZmxlY3RlZFByb3BlcnR5KGUpOiExPT09bi5yZWZsZWN0VG9BdHRyaWJ1dGUmJnQuX2hhc1JlZmxlY3RFZmZlY3QoZSkmJmNvbnNvbGUud2FybihgQ2Fubm90IG1ha2UgcmVmbGVjdGVkIHByb3BlcnR5ICcke2V9JyBub24tcmVmbGVjdGVkLmApLG4ubm90aWZ5JiYhdC5faGFzTm90aWZ5RWZmZWN0KGUpP3QuX2NyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5KGUpOiExPT09bi5ub3RpZnkmJnQuX2hhc05vdGlmeUVmZmVjdChlKSYmY29uc29sZS53YXJuKGBDYW5ub3QgbWFrZSBub3RpZnkgcHJvcGVydHkgJyR7ZX0nIG5vbi1ub3RpZnkuYCksbi5vYnNlcnZlciYmdC5fY3JlYXRlUHJvcGVydHlPYnNlcnZlcihlLG4ub2JzZXJ2ZXIsaVtuLm9ic2VydmVyXSksdC5fYWRkUHJvcGVydHlUb0F0dHJpYnV0ZU1hcChlKX1yZXR1cm4gY2xhc3MgZXh0ZW5kcyBle3N0YXRpYyBnZXQgcG9seW1lckVsZW1lbnRWZXJzaW9uKCl7cmV0dXJuIjMuNC4xIn1zdGF0aWMgX2ZpbmFsaXplQ2xhc3MoKXtlLl9maW5hbGl6ZUNsYXNzLmNhbGwodGhpcyk7Y29uc3QgdD0oZnVuY3Rpb24gbih0KXtyZXR1cm4gdC5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJfX293bk9ic2VydmVycyIsdCkpfHwodC5fX293bk9ic2VydmVycz10Lmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIm9ic2VydmVycyIsdCkpP3Qub2JzZXJ2ZXJzOm51bGwpLHQuX19vd25PYnNlcnZlcnN9KSh0aGlzKTt0JiZ0aGlzLmNyZWF0ZU9ic2VydmVycyh0LHRoaXMuX3Byb3BlcnRpZXMpLHRoaXMuX3ByZXBhcmVUZW1wbGF0ZSgpfXN0YXRpYyBfcHJlcGFyZVRlbXBsYXRlKCl7bGV0IHQ9dGhpcy50ZW1wbGF0ZTt0JiYoInN0cmluZyI9PXR5cGVvZiB0Pyhjb25zb2xlLmVycm9yKCJ0ZW1wbGF0ZSBnZXR0ZXIgbXVzdCByZXR1cm4gSFRNTFRlbXBsYXRlRWxlbWVudCIpLHQ9bnVsbCk6d3x8KHQ9dC5jbG9uZU5vZGUoITApKSksdGhpcy5wcm90b3R5cGUuX3RlbXBsYXRlPXR9c3RhdGljIGNyZWF0ZVByb3BlcnRpZXModCl7Zm9yKGxldCBlIGluIHQpbih0aGlzLnByb3RvdHlwZSxlLHRbZV0sdCl9c3RhdGljIGNyZWF0ZU9ic2VydmVycyh0LGUpe2NvbnN0IG49dGhpcy5wcm90b3R5cGU7Zm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspbi5fY3JlYXRlTWV0aG9kT2JzZXJ2ZXIodFtpXSxlKX1zdGF0aWMgZ2V0IHRlbXBsYXRlKCl7aWYoIXRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiX3RlbXBsYXRlIix0aGlzKSkpe2NvbnN0IHQ9dGhpcy5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiX3RlbXBsYXRlIix0aGlzLnByb3RvdHlwZSkpP3RoaXMucHJvdG90eXBlLl90ZW1wbGF0ZTp2b2lkIDA7dGhpcy5fdGVtcGxhdGU9dm9pZCAwIT09dD90OnRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiaXMiLHRoaXMpKSYmKGZ1bmN0aW9uIGUodCl7bGV0IGU9bnVsbDtpZih0JiYoIWJ8fHgpJiYoZT1CLmltcG9ydCh0LCJ0ZW1wbGF0ZSIpLGImJiFlKSl0aHJvdyBuZXcgRXJyb3IoYHN0cmljdFRlbXBsYXRlUG9saWN5OiBleHBlY3RpbmcgZG9tLW1vZHVsZSBvciBudWxsIHRlbXBsYXRlIGZvciAke3R9YCk7cmV0dXJuIGV9KSh0aGlzLmlzKXx8T2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMucHJvdG90eXBlKS5jb25zdHJ1Y3Rvci50ZW1wbGF0ZX1yZXR1cm4gdGhpcy5fdGVtcGxhdGV9c3RhdGljIHNldCB0ZW1wbGF0ZSh0KXt0aGlzLl90ZW1wbGF0ZT10fXN0YXRpYyBnZXQgaW1wb3J0UGF0aCgpe2lmKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl9pbXBvcnRQYXRoIix0aGlzKSkpe2NvbnN0IHQ9dGhpcy5pbXBvcnRNZXRhO2lmKHQpdGhpcy5faW1wb3J0UGF0aD1mKHQudXJsKTtlbHNle2NvbnN0IHQ9Qi5pbXBvcnQodGhpcy5pcyk7dGhpcy5faW1wb3J0UGF0aD10JiZ0LmFzc2V0cGF0aHx8T2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMucHJvdG90eXBlKS5jb25zdHJ1Y3Rvci5pbXBvcnRQYXRofX1yZXR1cm4gdGhpcy5faW1wb3J0UGF0aH1jb25zdHJ1Y3Rvcigpe3N1cGVyKCl9X2luaXRpYWxpemVQcm9wZXJ0aWVzKCl7dGhpcy5jb25zdHJ1Y3Rvci5maW5hbGl6ZSgpLHRoaXMuY29uc3RydWN0b3IuX2ZpbmFsaXplVGVtcGxhdGUodGhpcy5sb2NhbE5hbWUpLHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpLHRoaXMucm9vdFBhdGg9Xyx0aGlzLmltcG9ydFBhdGg9dGhpcy5jb25zdHJ1Y3Rvci5pbXBvcnRQYXRoO2xldCB0PShmdW5jdGlvbiBlKHQpe2lmKCF0Lmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl9fcHJvcGVydHlEZWZhdWx0cyIsdCkpKXt0Ll9fcHJvcGVydHlEZWZhdWx0cz1udWxsO2xldCBlPXQuX3Byb3BlcnRpZXM7Zm9yKGxldCBuIGluIGUpe2xldCBpPWVbbl07InZhbHVlImluIGkmJih0Ll9fcHJvcGVydHlEZWZhdWx0cz10Ll9fcHJvcGVydHlEZWZhdWx0c3x8e30sdC5fX3Byb3BlcnR5RGVmYXVsdHNbbl09aSl9fXJldHVybiB0Ll9fcHJvcGVydHlEZWZhdWx0c30pKHRoaXMuY29uc3RydWN0b3IpO2lmKHQpZm9yKGxldCBlIGluIHQpe2xldCBuPXRbZV07aWYodGhpcy5fY2FuQXBwbHlQcm9wZXJ0eURlZmF1bHQoZSkpe2xldCB0PSJmdW5jdGlvbiI9PXR5cGVvZiBuLnZhbHVlP24udmFsdWUuY2FsbCh0aGlzKTpuLnZhbHVlO3RoaXMuX2hhc0FjY2Vzc29yKGUpP3RoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShlLHQsITApOnRoaXNbZV09dH19fV9jYW5BcHBseVByb3BlcnR5RGVmYXVsdCh0KXtyZXR1cm4hdGhpcy5oYXNPd25Qcm9wZXJ0eSh0KX1zdGF0aWMgX3Byb2Nlc3NTdHlsZVRleHQodCxlKXtyZXR1cm4gcCh0LGUpfXN0YXRpYyBfZmluYWxpemVUZW1wbGF0ZSh0KXtjb25zdCBlPXRoaXMucHJvdG90eXBlLl90ZW1wbGF0ZTtpZihlJiYhZS5fX3BvbHltZXJGaW5hbGl6ZWQpe2UuX19wb2x5bWVyRmluYWxpemVkPSEwO2NvbnN0IG49dGhpcy5pbXBvcnRQYXRoOyhmdW5jdGlvbiBpKHQsZSxuLHIpe2lmKCFmZSl7Y29uc3QgaT1lLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgic3R5bGUiKSxvPUcoZSksYT0oZnVuY3Rpb24gcyh0KXtsZXQgZT1GKHQpO3JldHVybiBlP1coZSk6W119KShuKSxsPWUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtmb3IobGV0IG49MDtuPGEubGVuZ3RoO24rKyl7bGV0IGk9YVtuXTtpLnRleHRDb250ZW50PXQuX3Byb2Nlc3NTdHlsZVRleHQoaS50ZXh0Q29udGVudCxyKSxlLmNvbnRlbnQuaW5zZXJ0QmVmb3JlKGksbCl9bGV0IGM9MDtmb3IobGV0IGU9MDtlPG8ubGVuZ3RoO2UrKyl7bGV0IG49b1tlXSxhPWlbY107YSE9PW4/KG49bi5jbG9uZU5vZGUoITApLGEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobixhKSk6YysrLG4udGV4dENvbnRlbnQ9dC5fcHJvY2Vzc1N0eWxlVGV4dChuLnRleHRDb250ZW50LHIpfX1pZih3aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGUoZSxuKSxQJiZmZSYmZyl7Y29uc3Qgbj1lLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgic3R5bGUiKTtpZihuKXtsZXQgZT0iIjtBcnJheS5mcm9tKG4pLmZvckVhY2goKHQ9PntlKz10LnRleHRDb250ZW50LHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KX0pKSx0Ll9zdHlsZVNoZWV0PW5ldyBDU1NTdHlsZVNoZWV0LHQuX3N0eWxlU2hlZXQucmVwbGFjZVN5bmMoZSl9fX0pKHRoaXMsZSx0LG4/ZChuKToiIiksdGhpcy5wcm90b3R5cGUuX2JpbmRUZW1wbGF0ZShlKX19Y29ubmVjdGVkQ2FsbGJhY2soKXt3aW5kb3cuU2hhZHlDU1MmJnRoaXMuX3RlbXBsYXRlJiZ3aW5kb3cuU2hhZHlDU1Muc3R5bGVFbGVtZW50KHRoaXMpLHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCl9cmVhZHkoKXt0aGlzLl90ZW1wbGF0ZSYmKHRoaXMucm9vdD10aGlzLl9zdGFtcFRlbXBsYXRlKHRoaXMuX3RlbXBsYXRlKSx0aGlzLiQ9dGhpcy5yb290LiQpLHN1cGVyLnJlYWR5KCl9X3JlYWR5Q2xpZW50cygpe3RoaXMuX3RlbXBsYXRlJiYodGhpcy5yb290PXRoaXMuX2F0dGFjaERvbSh0aGlzLnJvb3QpKSxzdXBlci5fcmVhZHlDbGllbnRzKCl9X2F0dGFjaERvbSh0KXtjb25zdCBlPVkodGhpcyk7aWYoZS5hdHRhY2hTaGFkb3cpcmV0dXJuIHQ/KGUuc2hhZG93Um9vdHx8KGUuYXR0YWNoU2hhZG93KHttb2RlOiJvcGVuIixzaGFkeVVwZ3JhZGVGcmFnbWVudDp0fSksZS5zaGFkb3dSb290LmFwcGVuZENoaWxkKHQpLHRoaXMuY29uc3RydWN0b3IuX3N0eWxlU2hlZXQmJihlLnNoYWRvd1Jvb3QuYWRvcHRlZFN0eWxlU2hlZXRzPVt0aGlzLmNvbnN0cnVjdG9yLl9zdHlsZVNoZWV0XSkpLE0mJndpbmRvdy5TaGFkeURPTSYmd2luZG93LlNoYWR5RE9NLmZsdXNoSW5pdGlhbChlLnNoYWRvd1Jvb3QpLGUuc2hhZG93Um9vdCk6bnVsbDt0aHJvdyBuZXcgRXJyb3IoIlNoYWRvd0RPTSBub3QgYXZhaWxhYmxlLiBQb2x5bWVyRWxlbWVudCBjYW4gY3JlYXRlIGRvbSBhcyBjaGlsZHJlbiBpbnN0ZWFkIG9mIGluIFNoYWRvd0RPTSBieSBzZXR0aW5nIGB0aGlzLnJvb3QgPSB0aGlzO2AgYmVmb3JlIGByZWFkeWAuIil9dXBkYXRlU3R5bGVzKHQpe3dpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLnN0eWxlU3VidHJlZSh0aGlzLHQpfXJlc29sdmVVcmwodCxlKXtyZXR1cm4hZSYmdGhpcy5pbXBvcnRQYXRoJiYoZT1kKHRoaXMuaW1wb3J0UGF0aCkpLGQodCxlKX1zdGF0aWMgX3BhcnNlVGVtcGxhdGVDb250ZW50KHQsbixpKXtyZXR1cm4gbi5keW5hbWljRm5zPW4uZHluYW1pY0Zuc3x8dGhpcy5fcHJvcGVydGllcyxlLl9wYXJzZVRlbXBsYXRlQ29udGVudC5jYWxsKHRoaXMsdCxuLGkpfXN0YXRpYyBfYWRkVGVtcGxhdGVQcm9wZXJ0eUVmZmVjdCh0LG4saSl7cmV0dXJuIVN8fG4gaW4gdGhpcy5fcHJvcGVydGllc3x8aS5pbmZvLnBhcnQuc2lnbmF0dXJlJiZpLmluZm8ucGFydC5zaWduYXR1cmUuc3RhdGljfHxpLmluZm8ucGFydC5ob3N0UHJvcHx8dC5uZXN0ZWRUZW1wbGF0ZXx8Y29uc29sZS53YXJuKGBQcm9wZXJ0eSAnJHtufScgdXNlZCBpbiB0ZW1wbGF0ZSBidXQgbm90IGRlY2xhcmVkIGluICdwcm9wZXJ0aWVzJzsgYXR0cmlidXRlIHdpbGwgbm90IGJlIG9ic2VydmVkLmApLGUuX2FkZFRlbXBsYXRlUHJvcGVydHlFZmZlY3QuY2FsbCh0aGlzLHQsbixpKX19fSkpOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjbGFzcyBnZXtjb25zdHJ1Y3Rvcih0KXt0aGlzLnZhbHVlPXQudG9TdHJpbmcoKX10b1N0cmluZygpe3JldHVybiB0aGlzLnZhbHVlfX1jb25zdCBfZT1mdW5jdGlvbiB0KGUsLi4ubil7Y29uc3QgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpO3JldHVybiBpLmlubmVySFRNTD1uLnJlZHVjZSgoKHQsbixpKT0+dCsoZnVuY3Rpb24gcih0KXtpZih0IGluc3RhbmNlb2YgSFRNTFRlbXBsYXRlRWxlbWVudClyZXR1cm4gdC5pbm5lckhUTUw7aWYodCBpbnN0YW5jZW9mIGdlKXJldHVybihmdW5jdGlvbiBlKHQpe2lmKHQgaW5zdGFuY2VvZiBnZSlyZXR1cm4gdC52YWx1ZTt0aHJvdyBuZXcgRXJyb3IoYG5vbi1saXRlcmFsIHZhbHVlIHBhc3NlZCB0byBQb2x5bWVyJ3MgaHRtbExpdGVyYWwgZnVuY3Rpb246ICR7dH1gKX0pKHQpO3Rocm93IG5ldyBFcnJvcihgbm9uLXRlbXBsYXRlIHZhbHVlIHBhc3NlZCB0byBQb2x5bWVyJ3MgaHRtbCBmdW5jdGlvbjogJHt0fWApfSkobikrZVtpKzFdKSxlWzBdKSxpfSx5ZT1tZShIVE1MRWxlbWVudCk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovdmFyIHZlPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gYmUodCl7aWYodC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBlPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLGkuZ2V0P2k6e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbbl19fSl9KSksZX12YXIgeGUsd2UsU2U9e2V4cG9ydHM6e319OwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBMb2Rhc2ggPGh0dHBzOi8vbG9kYXNoLmNvbS8+CiAgICAgKiBDb3B5cmlnaHQgT3BlbkpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9vcGVuanNmLm9yZy8+CiAgICAgKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+CiAgICAgKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPgogICAgICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzCiAgICAgKi94ZT1TZSx3ZT1TZS5leHBvcnRzLGZ1bmN0aW9uKCl7dmFyIHQsZT0iRXhwZWN0ZWQgYSBmdW5jdGlvbiIsbj0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyIsaT0iX19sb2Rhc2hfcGxhY2Vob2xkZXJfXyIscj0zMixvPTEyOCxhPTEvMCxzPTkwMDcxOTkyNTQ3NDA5OTEsbD1OYU4sYz00Mjk0OTY3Mjk1LHU9W1siYXJ5IixvXSxbImJpbmQiLDFdLFsiYmluZEtleSIsMl0sWyJjdXJyeSIsOF0sWyJjdXJyeVJpZ2h0IiwxNl0sWyJmbGlwIiw1MTJdLFsicGFydGlhbCIscl0sWyJwYXJ0aWFsUmlnaHQiLDY0XSxbInJlYXJnIiwyNTZdXSxoPSJbb2JqZWN0IEFyZ3VtZW50c10iLGQ9IltvYmplY3QgQXJyYXldIixwPSJbb2JqZWN0IEJvb2xlYW5dIixmPSJbb2JqZWN0IERhdGVdIixtPSJbb2JqZWN0IEVycm9yXSIsZz0iW29iamVjdCBGdW5jdGlvbl0iLF89IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIix5PSJbb2JqZWN0IE1hcF0iLHY9IltvYmplY3QgTnVtYmVyXSIsYj0iW29iamVjdCBPYmplY3RdIix4PSJbb2JqZWN0IFByb21pc2VdIix3PSJbb2JqZWN0IFJlZ0V4cF0iLFM9IltvYmplY3QgU2V0XSIsTT0iW29iamVjdCBTdHJpbmddIixFPSJbb2JqZWN0IFN5bWJvbF0iLFQ9IltvYmplY3QgV2Vha01hcF0iLEM9IltvYmplY3QgQXJyYXlCdWZmZXJdIixBPSJbb2JqZWN0IERhdGFWaWV3XSIsaz0iW29iamVjdCBGbG9hdDMyQXJyYXldIixMPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLFA9IltvYmplY3QgSW50OEFycmF5XSIsTj0iW29iamVjdCBJbnQxNkFycmF5XSIsST0iW29iamVjdCBJbnQzMkFycmF5XSIsUj0iW29iamVjdCBVaW50OEFycmF5XSIsTz0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLHo9IltvYmplY3QgVWludDE2QXJyYXldIixEPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsQj0vXGJfX3AgXCs9ICcnOy9nLEg9L1xiKF9fcCBcKz0pICcnIFwrL2csRj0vKF9fZVwoLio/XCl8XGJfX3RcKSkgXCtcbicnOy9nLFY9LyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLFU9L1smPD4iJ10vZyxqPVJlZ0V4cChWLnNvdXJjZSksRz1SZWdFeHAoVS5zb3VyY2UpLFc9LzwlLShbXHNcU10rPyklPi9nLHE9LzwlKFtcc1xTXSs/KSU+L2csWT0vPCU9KFtcc1xTXSs/KSU+L2csWD0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLywkPS9eXHcqJC8sSz0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxaPS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxKPVJlZ0V4cChaLnNvdXJjZSksUT0vXlxzKy8sdHQ9L1xzLyxldD0vXHsoPzpcblwvXCogXFt3cmFwcGVkIHdpdGggLitcXSBcKlwvKT9cbj8vLG50PS9ce1xuXC9cKiBcW3dyYXBwZWQgd2l0aCAoLispXF0gXCovLGl0PS8sPyAmIC8scnQ9L1teXHgwMC1ceDJmXHgzYS1ceDQwXHg1Yi1ceDYwXHg3Yi1ceDdmXSsvZyxvdD0vWygpPSx7fVxbXF1cL1xzXS8sYXQ9L1xcKFxcKT8vZyxzdD0vXCRceyhbXlxcfV0qKD86XFwuW15cXH1dKikqKVx9L2csbHQ9L1x3KiQvLGN0PS9eWy0rXTB4WzAtOWEtZl0rJC9pLHV0PS9eMGJbMDFdKyQvaSxodD0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyxkdD0vXjBvWzAtN10rJC9pLHB0PS9eKD86MHxbMS05XVxkKikkLyxmdD0vW1x4YzAtXHhkNlx4ZDgtXHhmNlx4ZjgtXHhmZlx1MDEwMC1cdTAxN2ZdL2csbXQ9LygkXikvLGd0PS9bJ1xuXHJcdTIwMjhcdTIwMjlcXF0vZyxfdD0iXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmIix5dD0iYS16XFx4ZGYtXFx4ZjZcXHhmOC1cXHhmZiIsdnQ9IkEtWlxceGMwLVxceGQ2XFx4ZDgtXFx4ZGUiLGJ0PSJcXHhhY1xceGIxXFx4ZDdcXHhmN1xceDAwLVxceDJmXFx4M2EtXFx4NDBcXHg1Yi1cXHg2MFxceDdiLVxceGJmXFx1MjAwMC1cXHUyMDZmIFxcdFxceDBiXFxmXFx4YTBcXHVmZWZmXFxuXFxyXFx1MjAyOFxcdTIwMjlcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwIix4dD0iWyIrYnQrIl0iLHd0PSJbIitfdCsiXSIsU3Q9IlxcZCsiLE10PSJbIit5dCsiXSIsRXQ9IlteXFx1ZDgwMC1cXHVkZmZmIitidCtTdCsiXFx1MjcwMC1cXHUyN2JmIit5dCt2dCsiXSIsVHQ9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIsQ3Q9IlteXFx1ZDgwMC1cXHVkZmZmXSIsQXQ9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLGt0PSJbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdIixMdD0iWyIrdnQrIl0iLFB0PSIoPzoiK010KyJ8IitFdCsiKSIsTnQ9Iig/OiIrTHQrInwiK0V0KyIpIixJdD0iKD86WyfigJldKD86ZHxsbHxtfHJlfHN8dHx2ZSkpPyIsUnQ9Iig/Olsn4oCZXSg/OkR8TEx8TXxSRXxTfFR8VkUpKT8iLE90PSIoPzoiK3d0KyJ8IitUdCsiKT8iLHp0PSJbXFx1ZmUwZVxcdWZlMGZdPyIsRHQ9enQrT3QrIig/OlxcdTIwMGQoPzoiK1tDdCxBdCxrdF0uam9pbigifCIpKyIpIit6dCtPdCsiKSoiLEJ0PSIoPzoiK1siW1xcdTI3MDAtXFx1MjdiZl0iLEF0LGt0XS5qb2luKCJ8IikrIikiK0R0LEh0PSIoPzoiK1tDdCt3dCsiPyIsd3QsQXQsa3QsIltcXHVkODAwLVxcdWRmZmZdIl0uam9pbigifCIpKyIpIixGdD1SZWdFeHAoIlsn4oCZXSIsImciKSxWdD1SZWdFeHAod3QsImciKSxVdD1SZWdFeHAoVHQrIig/PSIrVHQrIil8IitIdCtEdCwiZyIpLGp0PVJlZ0V4cChbTHQrIj8iK010KyIrIitJdCsiKD89IitbeHQsTHQsIiQiXS5qb2luKCJ8IikrIikiLE50KyIrIitSdCsiKD89IitbeHQsTHQrUHQsIiQiXS5qb2luKCJ8IikrIikiLEx0KyI/IitQdCsiKyIrSXQsTHQrIisiK1J0LCJcXGQqKD86MVNUfDJORHwzUkR8KD8hWzEyM10pXFxkVEgpKD89XFxifFthLXpfXSkiLCJcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxkdGgpKD89XFxifFtBLVpfXSkiLFN0LEJ0XS5qb2luKCJ8IiksImciKSxHdD1SZWdFeHAoIltcXHUyMDBkXFx1ZDgwMC1cXHVkZmZmIitfdCsiXFx1ZmUwZVxcdWZlMGZdIiksV3Q9L1thLXpdW0EtWl18W0EtWl17Mn1bYS16XXxbMC05XVthLXpBLVpdfFthLXpBLVpdWzAtOV18W15hLXpBLVowLTkgXS8scXQ9WyJBcnJheSIsIkJ1ZmZlciIsIkRhdGFWaWV3IiwiRGF0ZSIsIkVycm9yIiwiRmxvYXQzMkFycmF5IiwiRmxvYXQ2NEFycmF5IiwiRnVuY3Rpb24iLCJJbnQ4QXJyYXkiLCJJbnQxNkFycmF5IiwiSW50MzJBcnJheSIsIk1hcCIsIk1hdGgiLCJPYmplY3QiLCJQcm9taXNlIiwiUmVnRXhwIiwiU2V0IiwiU3RyaW5nIiwiU3ltYm9sIiwiVHlwZUVycm9yIiwiVWludDhBcnJheSIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiVWludDE2QXJyYXkiLCJVaW50MzJBcnJheSIsIldlYWtNYXAiLCJfIiwiY2xlYXJUaW1lb3V0IiwiaXNGaW5pdGUiLCJwYXJzZUludCIsInNldFRpbWVvdXQiXSxZdD0tMSxYdD17fTtYdFtrXT1YdFtMXT1YdFtQXT1YdFtOXT1YdFtJXT1YdFtSXT1YdFtPXT1YdFt6XT1YdFtEXT0hMCxYdFtoXT1YdFtkXT1YdFtDXT1YdFtwXT1YdFtBXT1YdFtmXT1YdFttXT1YdFtnXT1YdFt5XT1YdFt2XT1YdFtiXT1YdFt3XT1YdFtTXT1YdFtNXT1YdFtUXT0hMTt2YXIgJHQ9e307JHRbaF09JHRbZF09JHRbQ109JHRbQV09JHRbcF09JHRbZl09JHRba109JHRbTF09JHRbUF09JHRbTl09JHRbSV09JHRbeV09JHRbdl09JHRbYl09JHRbd109JHRbU109JHRbTV09JHRbRV09JHRbUl09JHRbT109JHRbel09JHRbRF09ITAsJHRbbV09JHRbZ109JHRbVF09ITE7dmFyIEt0PXsiXFwiOiJcXCIsIiciOiInIiwiXG4iOiJuIiwiXHIiOiJyIiwiXHUyMDI4IjoidTIwMjgiLCJcdTIwMjkiOiJ1MjAyOSJ9LFp0PXBhcnNlRmxvYXQsSnQ9cGFyc2VJbnQsUXQ9Im9iamVjdCI9PXR5cGVvZiB2ZSYmdmUmJnZlLk9iamVjdD09PU9iamVjdCYmdmUsdGU9Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixlZT1RdHx8dGV8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCksbmU9d2UmJiF3ZS5ub2RlVHlwZSYmd2UsaWU9bmUmJnhlJiYheGUubm9kZVR5cGUmJnhlLHJlPWllJiZpZS5leHBvcnRzPT09bmUsb2U9cmUmJlF0LnByb2Nlc3MsYWU9KGZ1bmN0aW9uKCl7dHJ5e3JldHVybiBpZSYmaWUucmVxdWlyZSYmaWUucmVxdWlyZSgidXRpbCIpLnR5cGVzfHxvZSYmb2UuYmluZGluZyYmb2UuYmluZGluZygidXRpbCIpfWNhdGNoKHQpe319KSgpLHNlPWFlJiZhZS5pc0FycmF5QnVmZmVyLGxlPWFlJiZhZS5pc0RhdGUsY2U9YWUmJmFlLmlzTWFwLHVlPWFlJiZhZS5pc1JlZ0V4cCxoZT1hZSYmYWUuaXNTZXQsZGU9YWUmJmFlLmlzVHlwZWRBcnJheTtmdW5jdGlvbiBwZSh0LGUsbil7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHQuY2FsbChlKTtjYXNlIDE6cmV0dXJuIHQuY2FsbChlLG5bMF0pO2Nhc2UgMjpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSxuWzJdKX1yZXR1cm4gdC5hcHBseShlLG4pfWZ1bmN0aW9uIGZlKHQsZSxuLGkpe2Zvcih2YXIgcj0tMSxvPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK3I8bzspe3ZhciBhPXRbcl07ZShpLGEsbihhKSx0KX1yZXR1cm4gaX1mdW5jdGlvbiBtZSh0LGUpe2Zvcih2YXIgbj0tMSxpPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK248aSYmITEhPT1lKHRbbl0sbix0KTspO3JldHVybiB0fWZ1bmN0aW9uIGdlKHQsZSl7Zm9yKHZhciBuPW51bGw9PXQ/MDp0Lmxlbmd0aDtuLS0mJiExIT09ZSh0W25dLG4sdCk7KTtyZXR1cm4gdH1mdW5jdGlvbiBfZSh0LGUpe2Zvcih2YXIgbj0tMSxpPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK248aTspaWYoIWUodFtuXSxuLHQpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIHllKHQsZSl7Zm9yKHZhciBuPS0xLGk9bnVsbD09dD8wOnQubGVuZ3RoLHI9MCxvPVtdOysrbjxpOyl7dmFyIGE9dFtuXTtlKGEsbix0KSYmKG9bcisrXT1hKX1yZXR1cm4gb31mdW5jdGlvbiBiZSh0LGUpe3JldHVybiEobnVsbD09dHx8IXQubGVuZ3RoKSYmTmUodCxlLDApPi0xfWZ1bmN0aW9uIFNlKHQsZSxuKXtmb3IodmFyIGk9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7KytpPHI7KWlmKG4oZSx0W2ldKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBNZSh0LGUpe2Zvcih2YXIgbj0tMSxpPW51bGw9PXQ/MDp0Lmxlbmd0aCxyPUFycmF5KGkpOysrbjxpOylyW25dPWUodFtuXSxuLHQpO3JldHVybiByfWZ1bmN0aW9uIEVlKHQsZSl7Zm9yKHZhciBuPS0xLGk9ZS5sZW5ndGgscj10Lmxlbmd0aDsrK248aTspdFtyK25dPWVbbl07cmV0dXJuIHR9ZnVuY3Rpb24gVGUodCxlLG4saSl7dmFyIHI9LTEsbz1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKGkmJm8mJihuPXRbKytyXSk7KytyPG87KW49ZShuLHRbcl0scix0KTtyZXR1cm4gbn1mdW5jdGlvbiBDZSh0LGUsbixpKXt2YXIgcj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKGkmJnImJihuPXRbLS1yXSk7ci0tOyluPWUobix0W3JdLHIsdCk7cmV0dXJuIG59ZnVuY3Rpb24gQWUodCxlKXtmb3IodmFyIG49LTEsaT1udWxsPT10PzA6dC5sZW5ndGg7KytuPGk7KWlmKGUodFtuXSxuLHQpKXJldHVybiEwO3JldHVybiExfXZhciBrZT16ZSgibGVuZ3RoIik7ZnVuY3Rpb24gTGUodCxlLG4pe3ZhciBpO3JldHVybiBuKHQsKGZ1bmN0aW9uKHQsbixyKXtpZihlKHQsbixyKSlyZXR1cm4gaT1uLCExfSkpLGl9ZnVuY3Rpb24gUGUodCxlLG4saSl7Zm9yKHZhciByPXQubGVuZ3RoLG89bisoaT8xOi0xKTtpP28tLTorK288cjspaWYoZSh0W29dLG8sdCkpcmV0dXJuIG87cmV0dXJuLTF9ZnVuY3Rpb24gTmUodCxlLG4pe3JldHVybiBlPT1lPyhmdW5jdGlvbiBpKHQsZSxuKXtmb3IodmFyIGk9bi0xLHI9dC5sZW5ndGg7KytpPHI7KWlmKHRbaV09PT1lKXJldHVybiBpO3JldHVybi0xfSkodCxlLG4pOlBlKHQsUmUsbil9ZnVuY3Rpb24gSWUodCxlLG4saSl7Zm9yKHZhciByPW4tMSxvPXQubGVuZ3RoOysrcjxvOylpZihpKHRbcl0sZSkpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gUmUodCl7cmV0dXJuIHQhPXR9ZnVuY3Rpb24gT2UodCxlKXt2YXIgbj1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIG4/SGUodCxlKS9uOmx9ZnVuY3Rpb24gemUoZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBudWxsPT1uP3Q6bltlXX19ZnVuY3Rpb24gRGUoZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBudWxsPT1lP3Q6ZVtuXX19ZnVuY3Rpb24gQmUodCxlLG4saSxyKXtyZXR1cm4gcih0LChmdW5jdGlvbih0LHIsbyl7bj1pPyhpPSExLHQpOmUobix0LHIsbyl9KSksbn1mdW5jdGlvbiBIZShlLG4pe2Zvcih2YXIgaSxyPS0xLG89ZS5sZW5ndGg7KytyPG87KXt2YXIgYT1uKGVbcl0pO2EhPT10JiYoaT1pPT09dD9hOmkrYSl9cmV0dXJuIGl9ZnVuY3Rpb24gRmUodCxlKXtmb3IodmFyIG49LTEsaT1BcnJheSh0KTsrK248dDspaVtuXT1lKG4pO3JldHVybiBpfWZ1bmN0aW9uIFZlKHQpe3JldHVybiB0P3Quc2xpY2UoMCxhbih0KSsxKS5yZXBsYWNlKFEsIiIpOnR9ZnVuY3Rpb24gVWUodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX1mdW5jdGlvbiBqZSh0LGUpe3JldHVybiBNZShlLChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pKX1mdW5jdGlvbiBHZSh0LGUpe3JldHVybiB0LmhhcyhlKX1mdW5jdGlvbiBXZSh0LGUpe2Zvcih2YXIgbj0tMSxpPXQubGVuZ3RoOysrbjxpJiZOZShlLHRbbl0sMCk+LTE7KTtyZXR1cm4gbn1mdW5jdGlvbiBxZSh0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS0mJk5lKGUsdFtuXSwwKT4tMTspO3JldHVybiBufWZ1bmN0aW9uIFllKHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoLGk9MDtuLS07KXRbbl09PT1lJiYrK2k7cmV0dXJuIGl9dmFyIFhlPURlKHsiw4AiOiJBIiwiw4EiOiJBIiwiw4IiOiJBIiwiw4MiOiJBIiwiw4QiOiJBIiwiw4UiOiJBIiwiw6AiOiJhIiwiw6EiOiJhIiwiw6IiOiJhIiwiw6MiOiJhIiwiw6QiOiJhIiwiw6UiOiJhIiwiw4ciOiJDIiwiw6ciOiJjIiwiw5AiOiJEIiwiw7AiOiJkIiwiw4giOiJFIiwiw4kiOiJFIiwiw4oiOiJFIiwiw4siOiJFIiwiw6giOiJlIiwiw6kiOiJlIiwiw6oiOiJlIiwiw6siOiJlIiwiw4wiOiJJIiwiw40iOiJJIiwiw44iOiJJIiwiw48iOiJJIiwiw6wiOiJpIiwiw60iOiJpIiwiw64iOiJpIiwiw68iOiJpIiwiw5EiOiJOIiwiw7EiOiJuIiwiw5IiOiJPIiwiw5MiOiJPIiwiw5QiOiJPIiwiw5UiOiJPIiwiw5YiOiJPIiwiw5giOiJPIiwiw7IiOiJvIiwiw7MiOiJvIiwiw7QiOiJvIiwiw7UiOiJvIiwiw7YiOiJvIiwiw7giOiJvIiwiw5kiOiJVIiwiw5oiOiJVIiwiw5siOiJVIiwiw5wiOiJVIiwiw7kiOiJ1Iiwiw7oiOiJ1Iiwiw7siOiJ1Iiwiw7wiOiJ1Iiwiw50iOiJZIiwiw70iOiJ5Iiwiw78iOiJ5Iiwiw4YiOiJBZSIsIsOmIjoiYWUiLCLDniI6IlRoIiwiw74iOiJ0aCIsIsOfIjoic3MiLCLEgCI6IkEiLCLEgiI6IkEiLCLEhCI6IkEiLCLEgSI6ImEiLCLEgyI6ImEiLCLEhSI6ImEiLCLEhiI6IkMiLCLEiCI6IkMiLCLEiiI6IkMiLCLEjCI6IkMiLCLEhyI6ImMiLCLEiSI6ImMiLCLEiyI6ImMiLCLEjSI6ImMiLCLEjiI6IkQiLCLEkCI6IkQiLCLEjyI6ImQiLCLEkSI6ImQiLCLEkiI6IkUiLCLElCI6IkUiLCLEliI6IkUiLCLEmCI6IkUiLCLEmiI6IkUiLCLEkyI6ImUiLCLElSI6ImUiLCLElyI6ImUiLCLEmSI6ImUiLCLEmyI6ImUiLCLEnCI6IkciLCLEniI6IkciLCLEoCI6IkciLCLEoiI6IkciLCLEnSI6ImciLCLEnyI6ImciLCLEoSI6ImciLCLEoyI6ImciLCLEpCI6IkgiLCLEpiI6IkgiLCLEpSI6ImgiLCLEpyI6ImgiLCLEqCI6IkkiLCLEqiI6IkkiLCLErCI6IkkiLCLEriI6IkkiLCLEsCI6IkkiLCLEqSI6ImkiLCLEqyI6ImkiLCLErSI6ImkiLCLEryI6ImkiLCLEsSI6ImkiLCLEtCI6IkoiLCLEtSI6ImoiLCLEtiI6IksiLCLEtyI6ImsiLCLEuCI6ImsiLCLEuSI6IkwiLCLEuyI6IkwiLCLEvSI6IkwiLCLEvyI6IkwiLCLFgSI6IkwiLCLEuiI6ImwiLCLEvCI6ImwiLCLEviI6ImwiLCLFgCI6ImwiLCLFgiI6ImwiLCLFgyI6Ik4iLCLFhSI6Ik4iLCLFhyI6Ik4iLCLFiiI6Ik4iLCLFhCI6Im4iLCLFhiI6Im4iLCLFiCI6Im4iLCLFiyI6Im4iLCLFjCI6Ik8iLCLFjiI6Ik8iLCLFkCI6Ik8iLCLFjSI6Im8iLCLFjyI6Im8iLCLFkSI6Im8iLCLFlCI6IlIiLCLFliI6IlIiLCLFmCI6IlIiLCLFlSI6InIiLCLFlyI6InIiLCLFmSI6InIiLCLFmiI6IlMiLCLFnCI6IlMiLCLFniI6IlMiLCLFoCI6IlMiLCLFmyI6InMiLCLFnSI6InMiLCLFnyI6InMiLCLFoSI6InMiLCLFoiI6IlQiLCLFpCI6IlQiLCLFpiI6IlQiLCLFoyI6InQiLCLFpSI6InQiLCLFpyI6InQiLCLFqCI6IlUiLCLFqiI6IlUiLCLFrCI6IlUiLCLFriI6IlUiLCLFsCI6IlUiLCLFsiI6IlUiLCLFqSI6InUiLCLFqyI6InUiLCLFrSI6InUiLCLFryI6InUiLCLFsSI6InUiLCLFsyI6InUiLCLFtCI6IlciLCLFtSI6InciLCLFtiI6IlkiLCLFtyI6InkiLCLFuCI6IlkiLCLFuSI6IloiLCLFuyI6IloiLCLFvSI6IloiLCLFuiI6InoiLCLFvCI6InoiLCLFviI6InoiLCLEsiI6IklKIiwixLMiOiJpaiIsIsWSIjoiT2UiLCLFkyI6Im9lIiwixYkiOiInbiIsIsW/IjoicyJ9KSwkZT1EZSh7IiYiOiImYW1wOyIsIjwiOiImbHQ7IiwiPiI6IiZndDsiLCciJzoiJnF1b3Q7IiwiJyI6IiYjMzk7In0pO2Z1bmN0aW9uIEtlKHQpe3JldHVybiJcXCIrS3RbdF19ZnVuY3Rpb24gWmUodCl7cmV0dXJuIEd0LnRlc3QodCl9ZnVuY3Rpb24gSmUodCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQsaSl7blsrK2VdPVtpLHRdfSkpLG59ZnVuY3Rpb24gUWUodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQoZShuKSl9fWZ1bmN0aW9uIHRuKHQsZSl7Zm9yKHZhciBuPS0xLHI9dC5sZW5ndGgsbz0wLGE9W107KytuPHI7KXt2YXIgcz10W25dO3MhPT1lJiZzIT09aXx8KHRbbl09aSxhW28rK109bil9cmV0dXJuIGF9ZnVuY3Rpb24gZW4odCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe25bKytlXT10fSkpLG59ZnVuY3Rpb24gbm4odCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe25bKytlXT1bdCx0XX0pKSxufWZ1bmN0aW9uIHJuKHQpe3JldHVybiBaZSh0KT8oZnVuY3Rpb24gZSh0KXtmb3IodmFyIGU9VXQubGFzdEluZGV4PTA7VXQudGVzdCh0KTspKytlO3JldHVybiBlfSkodCk6a2UodCl9ZnVuY3Rpb24gb24odCl7cmV0dXJuIFplKHQpPyhmdW5jdGlvbiBlKHQpe3JldHVybiB0Lm1hdGNoKFV0KXx8W119KSh0KTooZnVuY3Rpb24gbih0KXtyZXR1cm4gdC5zcGxpdCgiIil9KSh0KX1mdW5jdGlvbiBhbih0KXtmb3IodmFyIGU9dC5sZW5ndGg7ZS0tJiZ0dC50ZXN0KHQuY2hhckF0KGUpKTspO3JldHVybiBlfXZhciBzbj1EZSh7IiZhbXA7IjoiJiIsIiZsdDsiOiI8IiwiJmd0OyI6Ij4iLCImcXVvdDsiOiciJywiJiMzOTsiOiInIn0pLGxuPShmdW5jdGlvbiB0dChfdCl7dmFyIHl0LHZ0PShfdD1udWxsPT1fdD9lZTpsbi5kZWZhdWx0cyhlZS5PYmplY3QoKSxfdCxsbi5waWNrKGVlLHF0KSkpLkFycmF5LGJ0PV90LkRhdGUseHQ9X3QuRXJyb3Isd3Q9X3QuRnVuY3Rpb24sU3Q9X3QuTWF0aCxNdD1fdC5PYmplY3QsRXQ9X3QuUmVnRXhwLFR0PV90LlN0cmluZyxDdD1fdC5UeXBlRXJyb3IsQXQ9dnQucHJvdG90eXBlLGt0PU10LnByb3RvdHlwZSxMdD1fdFsiX19jb3JlLWpzX3NoYXJlZF9fIl0sUHQ9d3QucHJvdG90eXBlLnRvU3RyaW5nLE50PWt0Lmhhc093blByb3BlcnR5LEl0PTAsUnQ9KHl0PS9bXi5dKyQvLmV4ZWMoTHQmJkx0LmtleXMmJkx0LmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIit5dDoiIixPdD1rdC50b1N0cmluZyx6dD1QdC5jYWxsKE10KSxEdD1lZS5fLEJ0PUV0KCJeIitQdC5jYWxsKE50KS5yZXBsYWNlKFosIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIiksSHQ9cmU/X3QuQnVmZmVyOnQsVXQ9X3QuU3ltYm9sLEd0PV90LlVpbnQ4QXJyYXksS3Q9SHQ/SHQuYWxsb2NVbnNhZmU6dCxRdD1RZShNdC5nZXRQcm90b3R5cGVPZixNdCksdGU9TXQuY3JlYXRlLG5lPWt0LnByb3BlcnR5SXNFbnVtZXJhYmxlLGllPUF0LnNwbGljZSxvZT1VdD9VdC5pc0NvbmNhdFNwcmVhZGFibGU6dCxhZT1VdD9VdC5pdGVyYXRvcjp0LHZlPVV0P1V0LnRvU3RyaW5nVGFnOnQseGU9KGZ1bmN0aW9uKCl7dHJ5e3ZhciB0PVBvKE10LCJkZWZpbmVQcm9wZXJ0eSIpO3JldHVybiB0KHt9LCIiLHt9KSx0fWNhdGNoKHQpe319KSgpLHdlPV90LmNsZWFyVGltZW91dCE9PWVlLmNsZWFyVGltZW91dCYmX3QuY2xlYXJUaW1lb3V0LGtlPWJ0JiZidC5ub3chPT1lZS5EYXRlLm5vdyYmYnQubm93LERlPV90LnNldFRpbWVvdXQhPT1lZS5zZXRUaW1lb3V0JiZfdC5zZXRUaW1lb3V0LGNuPVN0LmNlaWwsdW49U3QuZmxvb3IsaG49TXQuZ2V0T3duUHJvcGVydHlTeW1ib2xzLGRuPUh0P0h0LmlzQnVmZmVyOnQscG49X3QuaXNGaW5pdGUsZm49QXQuam9pbixtbj1RZShNdC5rZXlzLE10KSxnbj1TdC5tYXgsX249U3QubWluLHluPWJ0Lm5vdyx2bj1fdC5wYXJzZUludCxibj1TdC5yYW5kb20seG49QXQucmV2ZXJzZSx3bj1QbyhfdCwiRGF0YVZpZXciKSxTbj1QbyhfdCwiTWFwIiksTW49UG8oX3QsIlByb21pc2UiKSxFbj1QbyhfdCwiU2V0IiksVG49UG8oX3QsIldlYWtNYXAiKSxDbj1QbyhNdCwiY3JlYXRlIiksQW49VG4mJm5ldyBUbixrbj17fSxMbj1vYSh3biksUG49b2EoU24pLE5uPW9hKE1uKSxJbj1vYShFbiksUm49b2EoVG4pLE9uPVV0P1V0LnByb3RvdHlwZTp0LHpuPU9uP09uLnZhbHVlT2Y6dCxEbj1Pbj9Pbi50b1N0cmluZzp0O2Z1bmN0aW9uIEJuKHQpe2lmKE1zKHQpJiYhaHModCkmJiEodCBpbnN0YW5jZW9mIFVuKSl7aWYodCBpbnN0YW5jZW9mIFZuKXJldHVybiB0O2lmKE50LmNhbGwodCwiX193cmFwcGVkX18iKSlyZXR1cm4gYWEodCl9cmV0dXJuIG5ldyBWbih0KX12YXIgSG49KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe31yZXR1cm4gZnVuY3Rpb24obil7aWYoIVNzKG4pKXJldHVybnt9O2lmKHRlKXJldHVybiB0ZShuKTtlLnByb3RvdHlwZT1uO3ZhciBpPW5ldyBlO3JldHVybiBlLnByb3RvdHlwZT10LGl9fSkoKTtmdW5jdGlvbiBGbigpe31mdW5jdGlvbiBWbihlLG4pe3RoaXMuX193cmFwcGVkX189ZSx0aGlzLl9fYWN0aW9uc19fPVtdLHRoaXMuX19jaGFpbl9fPSEhbix0aGlzLl9faW5kZXhfXz0wLHRoaXMuX192YWx1ZXNfXz10fWZ1bmN0aW9uIFVuKHQpe3RoaXMuX193cmFwcGVkX189dCx0aGlzLl9fYWN0aW9uc19fPVtdLHRoaXMuX19kaXJfXz0xLHRoaXMuX19maWx0ZXJlZF9fPSExLHRoaXMuX19pdGVyYXRlZXNfXz1bXSx0aGlzLl9fdGFrZUNvdW50X189Yyx0aGlzLl9fdmlld3NfXz1bXX1mdW5jdGlvbiBqbih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIGk9dFtlXTt0aGlzLnNldChpWzBdLGlbMV0pfX1mdW5jdGlvbiBHbih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIGk9dFtlXTt0aGlzLnNldChpWzBdLGlbMV0pfX1mdW5jdGlvbiBXbih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIGk9dFtlXTt0aGlzLnNldChpWzBdLGlbMV0pfX1mdW5jdGlvbiBxbih0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgV247KytlPG47KXRoaXMuYWRkKHRbZV0pfWZ1bmN0aW9uIFluKHQpe3ZhciBlPXRoaXMuX19kYXRhX189bmV3IEduKHQpO3RoaXMuc2l6ZT1lLnNpemV9ZnVuY3Rpb24gWG4odCxlKXt2YXIgbj1ocyh0KSxpPSFuJiZ1cyh0KSxyPSFuJiYhaSYmZ3ModCksbz0hbiYmIWkmJiFyJiZPcyh0KSxhPW58fGl8fHJ8fG8scz1hP0ZlKHQubGVuZ3RoLFR0KTpbXSxsPXMubGVuZ3RoO2Zvcih2YXIgYyBpbiB0KSFlJiYhTnQuY2FsbCh0LGMpfHxhJiYoImxlbmd0aCI9PWN8fHImJigib2Zmc2V0Ij09Y3x8InBhcmVudCI9PWMpfHxvJiYoImJ1ZmZlciI9PWN8fCJieXRlTGVuZ3RoIj09Y3x8ImJ5dGVPZmZzZXQiPT1jKXx8Qm8oYyxsKSl8fHMucHVzaChjKTtyZXR1cm4gc31mdW5jdGlvbiAkbihlKXt2YXIgbj1lLmxlbmd0aDtyZXR1cm4gbj9lW3ByKDAsbi0xKV06dH1mdW5jdGlvbiBLbih0LGUpe3JldHVybiBlYShYcih0KSxvaShlLDAsdC5sZW5ndGgpKX1mdW5jdGlvbiBabih0KXtyZXR1cm4gZWEoWHIodCkpfWZ1bmN0aW9uIEpuKGUsbixpKXsoaSE9PXQmJiFzcyhlW25dLGkpfHxpPT09dCYmIShuIGluIGUpKSYmaWkoZSxuLGkpfWZ1bmN0aW9uIFFuKGUsbixpKXt2YXIgcj1lW25dO050LmNhbGwoZSxuKSYmc3MocixpKSYmKGkhPT10fHxuIGluIGUpfHxpaShlLG4saSl9ZnVuY3Rpb24gdGkodCxlKXtmb3IodmFyIG49dC5sZW5ndGg7bi0tOylpZihzcyh0W25dWzBdLGUpKXJldHVybiBuO3JldHVybi0xfWZ1bmN0aW9uIGVpKHQsZSxuLGkpe3JldHVybiBOaSh0LChmdW5jdGlvbih0LHIsbyl7ZShpLHQsbih0KSxvKX0pKSxpfWZ1bmN0aW9uIG5pKHQsZSl7cmV0dXJuIHQmJiRyKGUscmwoZSksdCl9ZnVuY3Rpb24gaWkodCxlLG4peyJfX3Byb3RvX18iPT1lJiZ4ZT94ZSh0LGUse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm4sd3JpdGFibGU6ITB9KTp0W2VdPW59ZnVuY3Rpb24gcmkoZSxuKXtmb3IodmFyIGk9LTEscj1uLmxlbmd0aCxvPXZ0KHIpLGE9bnVsbD09ZTsrK2k8cjspb1tpXT1hP3Q6UXMoZSxuW2ldKTtyZXR1cm4gb31mdW5jdGlvbiBvaShlLG4saSl7cmV0dXJuIGU9PWUmJihpIT09dCYmKGU9ZTw9aT9lOmkpLG4hPT10JiYoZT1lPj1uP2U6bikpLGV9ZnVuY3Rpb24gYWkoZSxuLGkscixvLGEpe3ZhciBzLGw9MSZuLGM9MiZuLHU9NCZuO2lmKGkmJihzPW8/aShlLHIsbyxhKTppKGUpKSxzIT09dClyZXR1cm4gcztpZighU3MoZSkpcmV0dXJuIGU7dmFyIGQ9aHMoZSk7aWYoZCl7aWYocz0oZnVuY3Rpb24gbSh0KXt2YXIgZT10Lmxlbmd0aCxuPW5ldyB0LmNvbnN0cnVjdG9yKGUpO3JldHVybiBlJiYic3RyaW5nIj09dHlwZW9mIHRbMF0mJk50LmNhbGwodCwiaW5kZXgiKSYmKG4uaW5kZXg9dC5pbmRleCxuLmlucHV0PXQuaW5wdXQpLG59KShlKSwhbClyZXR1cm4gWHIoZSxzKX1lbHNle3ZhciB4PVJvKGUpLFQ9eD09Z3x8eD09XztpZihncyhlKSlyZXR1cm4gVXIoZSxsKTtpZih4PT1ifHx4PT1ofHxUJiYhbyl7aWYocz1jfHxUP3t9OnpvKGUpLCFsKXJldHVybiBjPyhmdW5jdGlvbiBIKHQsZSl7cmV0dXJuICRyKHQsSW8odCksZSl9KShlLChmdW5jdGlvbiBCKHQsZSl7cmV0dXJuIHQmJiRyKGUsb2woZSksdCl9KShzLGUpKTooZnVuY3Rpb24gRih0LGUpe3JldHVybiAkcih0LE5vKHQpLGUpfSkoZSxuaShzLGUpKX1lbHNle2lmKCEkdFt4XSlyZXR1cm4gbz9lOnt9O3M9KGZ1bmN0aW9uIFYodCxlLG4pe3ZhciBpPXQuY29uc3RydWN0b3I7c3dpdGNoKGUpe2Nhc2UgQzpyZXR1cm4ganIodCk7Y2FzZSBwOmNhc2UgZjpyZXR1cm4gbmV3IGkoK3QpO2Nhc2UgQTpyZXR1cm4oZnVuY3Rpb24gcih0LGUpe3ZhciBuPWU/anIodC5idWZmZXIpOnQuYnVmZmVyO3JldHVybiBuZXcgdC5jb25zdHJ1Y3RvcihuLHQuYnl0ZU9mZnNldCx0LmJ5dGVMZW5ndGgpfSkodCxuKTtjYXNlIGs6Y2FzZSBMOmNhc2UgUDpjYXNlIE46Y2FzZSBJOmNhc2UgUjpjYXNlIE86Y2FzZSB6OmNhc2UgRDpyZXR1cm4gR3IodCxuKTtjYXNlIHk6cmV0dXJuIG5ldyBpO2Nhc2UgdjpjYXNlIE06cmV0dXJuIG5ldyBpKHQpO2Nhc2UgdzpyZXR1cm4oZnVuY3Rpb24gbyh0KXt2YXIgZT1uZXcgdC5jb25zdHJ1Y3Rvcih0LnNvdXJjZSxsdC5leGVjKHQpKTtyZXR1cm4gZS5sYXN0SW5kZXg9dC5sYXN0SW5kZXgsZX0pKHQpO2Nhc2UgUzpyZXR1cm4gbmV3IGk7Y2FzZSBFOnJldHVybihmdW5jdGlvbiBhKHQpe3JldHVybiB6bj9NdCh6bi5jYWxsKHQpKTp7fX0pKHQpfX0pKGUseCxsKX19YXx8KGE9bmV3IFluKTt2YXIgVT1hLmdldChlKTtpZihVKXJldHVybiBVO2Euc2V0KGUscyksUHMoZSk/ZS5mb3JFYWNoKChmdW5jdGlvbih0KXtzLmFkZChhaSh0LG4saSx0LGUsYSkpfSkpOkVzKGUpJiZlLmZvckVhY2goKGZ1bmN0aW9uKHQscil7cy5zZXQocixhaSh0LG4saSxyLGUsYSkpfSkpO3ZhciBqPWQ/dDoodT9jP01vOlNvOmM/b2w6cmwpKGUpO3JldHVybiBtZShqfHxlLChmdW5jdGlvbih0LHIpe2omJih0PWVbcj10XSksUW4ocyxyLGFpKHQsbixpLHIsZSxhKSl9KSksc31mdW5jdGlvbiBzaShlLG4saSl7dmFyIHI9aS5sZW5ndGg7aWYobnVsbD09ZSlyZXR1cm4hcjtmb3IoZT1NdChlKTtyLS07KXt2YXIgbz1pW3JdLGE9ZVtvXTtpZihhPT09dCYmIShvIGluIGUpfHwhKDAsbltvXSkoYSkpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gbGkobixpLHIpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBDdChlKTtyZXR1cm4gWm8oKGZ1bmN0aW9uKCl7bi5hcHBseSh0LHIpfSksaSl9ZnVuY3Rpb24gY2kodCxlLG4saSl7dmFyIHI9LTEsbz1iZSxhPSEwLHM9dC5sZW5ndGgsbD1bXSxjPWUubGVuZ3RoO2lmKCFzKXJldHVybiBsO24mJihlPU1lKGUsVWUobikpKSxpPyhvPVNlLGE9ITEpOmUubGVuZ3RoPj0yMDAmJihvPUdlLGE9ITEsZT1uZXcgcW4oZSkpO3Q6Zm9yKDsrK3I8czspe3ZhciB1PXRbcl0saD1udWxsPT1uP3U6bih1KTtpZih1PWl8fDAhPT11P3U6MCxhJiZoPT1oKXtmb3IodmFyIGQ9YztkLS07KWlmKGVbZF09PT1oKWNvbnRpbnVlIHQ7bC5wdXNoKHUpfWVsc2UgbyhlLGgsaSl8fGwucHVzaCh1KX1yZXR1cm4gbH1Cbi50ZW1wbGF0ZVNldHRpbmdzPXtlc2NhcGU6VyxldmFsdWF0ZTpxLGludGVycG9sYXRlOlksdmFyaWFibGU6IiIsaW1wb3J0czp7XzpCbn19LChCbi5wcm90b3R5cGU9Rm4ucHJvdG90eXBlKS5jb25zdHJ1Y3Rvcj1CbiwoVm4ucHJvdG90eXBlPUhuKEZuLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPVZuLChVbi5wcm90b3R5cGU9SG4oRm4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9VW4sam4ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uIHVpKCl7dGhpcy5fX2RhdGFfXz1Dbj9DbihudWxsKTp7fSx0aGlzLnNpemU9MH0sam4ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbiBoaSh0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX0sam4ucHJvdG90eXBlLmdldD1mdW5jdGlvbiBkaShlKXt2YXIgaT10aGlzLl9fZGF0YV9fO2lmKENuKXt2YXIgcj1pW2VdO3JldHVybiByPT09bj90OnJ9cmV0dXJuIE50LmNhbGwoaSxlKT9pW2VdOnR9LGpuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24gcGkoZSl7dmFyIG49dGhpcy5fX2RhdGFfXztyZXR1cm4gQ24/bltlXSE9PXQ6TnQuY2FsbChuLGUpfSxqbi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uIGZpKGUsaSl7dmFyIHI9dGhpcy5fX2RhdGFfXztyZXR1cm4gdGhpcy5zaXplKz10aGlzLmhhcyhlKT8wOjEscltlXT1DbiYmaT09PXQ/bjppLHRoaXN9LEduLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbiBtaSgpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9LEduLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24gZ2kodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPXRpKGUsdCk7cmV0dXJuIShuPDB8fChuPT1lLmxlbmd0aC0xP2UucG9wKCk6aWUuY2FsbChlLG4sMSksLS10aGlzLnNpemUsMCkpfSxHbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uIF9pKGUpe3ZhciBuPXRoaXMuX19kYXRhX18saT10aShuLGUpO3JldHVybiBpPDA/dDpuW2ldWzFdfSxHbi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uIHlpKHQpe3JldHVybiB0aSh0aGlzLl9fZGF0YV9fLHQpPi0xfSxHbi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uIHZpKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxpPXRpKG4sdCk7cmV0dXJuIGk8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltpXVsxXT1lLHRoaXN9LFduLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbiBiaSgpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IGpuLG1hcDpuZXcoU258fEduKSxzdHJpbmc6bmV3IGpufX0sV24ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbiB4aSh0KXt2YXIgZT1rbyh0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxXbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uIHdpKHQpe3JldHVybiBrbyh0aGlzLHQpLmdldCh0KX0sV24ucHJvdG90eXBlLmhhcz1mdW5jdGlvbiBTaSh0KXtyZXR1cm4ga28odGhpcyx0KS5oYXModCl9LFduLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24gTWkodCxlKXt2YXIgbj1rbyh0aGlzLHQpLGk9bi5zaXplO3JldHVybiBuLnNldCh0LGUpLHRoaXMuc2l6ZSs9bi5zaXplPT1pPzA6MSx0aGlzfSxxbi5wcm90b3R5cGUuYWRkPXFuLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uIEVpKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLnNldCh0LG4pLHRoaXN9LHFuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24gVGkodCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfSxZbi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24gQ2koKXt0aGlzLl9fZGF0YV9fPW5ldyBHbix0aGlzLnNpemU9MH0sWW4ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbiBBaSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49ZS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1lLnNpemUsbn0sWW4ucHJvdG90eXBlLmdldD1mdW5jdGlvbiBraSh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9LFluLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24gTGkodCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfSxZbi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uIFBpKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXztpZihuIGluc3RhbmNlb2YgR24pe3ZhciBpPW4uX19kYXRhX187aWYoIVNufHxpLmxlbmd0aDwxOTkpcmV0dXJuIGkucHVzaChbdCxlXSksdGhpcy5zaXplPSsrbi5zaXplLHRoaXM7bj10aGlzLl9fZGF0YV9fPW5ldyBXbihpKX1yZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemU9bi5zaXplLHRoaXN9O3ZhciBOaT1KcihGaSksSWk9SnIoVmksITApO2Z1bmN0aW9uIFJpKHQsZSl7dmFyIG49ITA7cmV0dXJuIE5pKHQsKGZ1bmN0aW9uKHQsaSxyKXtyZXR1cm4gbj0hIWUodCxpLHIpfSkpLG59ZnVuY3Rpb24gT2koZSxuLGkpe2Zvcih2YXIgcj0tMSxvPWUubGVuZ3RoOysrcjxvOyl7dmFyIGE9ZVtyXSxzPW4oYSk7aWYobnVsbCE9cyYmKGw9PT10P3M9PXMmJiFScyhzKTppKHMsbCkpKXZhciBsPXMsYz1hfXJldHVybiBjfWZ1bmN0aW9uIHppKHQsZSl7dmFyIG49W107cmV0dXJuIE5pKHQsKGZ1bmN0aW9uKHQsaSxyKXtlKHQsaSxyKSYmbi5wdXNoKHQpfSkpLG59ZnVuY3Rpb24gRGkodCxlLG4saSxyKXt2YXIgbz0tMSxhPXQubGVuZ3RoO2ZvcihufHwobj1Ebykscnx8KHI9W10pOysrbzxhOyl7dmFyIHM9dFtvXTtlPjAmJm4ocyk/ZT4xP0RpKHMsZS0xLG4saSxyKTpFZShyLHMpOml8fChyW3IubGVuZ3RoXT1zKX1yZXR1cm4gcn12YXIgQmk9UXIoKSxIaT1RcighMCk7ZnVuY3Rpb24gRmkodCxlKXtyZXR1cm4gdCYmQmkodCxlLHJsKX1mdW5jdGlvbiBWaSh0LGUpe3JldHVybiB0JiZIaSh0LGUscmwpfWZ1bmN0aW9uIFVpKHQsZSl7cmV0dXJuIHllKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBicyh0W2VdKX0pKX1mdW5jdGlvbiBqaShlLG4pe2Zvcih2YXIgaT0wLHI9KG49QnIobixlKSkubGVuZ3RoO251bGwhPWUmJmk8cjspZT1lW3JhKG5baSsrXSldO3JldHVybiBpJiZpPT1yP2U6dH1mdW5jdGlvbiBHaSh0LGUsbil7dmFyIGk9ZSh0KTtyZXR1cm4gaHModCk/aTpFZShpLG4odCkpfWZ1bmN0aW9uIFdpKGUpe3JldHVybiBudWxsPT1lP2U9PT10PyJbb2JqZWN0IFVuZGVmaW5lZF0iOiJbb2JqZWN0IE51bGxdIjp2ZSYmdmUgaW4gTXQoZSk/KGZ1bmN0aW9uIG4oZSl7dmFyIG49TnQuY2FsbChlLHZlKSxpPWVbdmVdO3RyeXtlW3ZlXT10O3ZhciByPSEwfWNhdGNoKHQpe312YXIgbz1PdC5jYWxsKGUpO3JldHVybiByJiYobj9lW3ZlXT1pOmRlbGV0ZSBlW3ZlXSksb30pKGUpOihmdW5jdGlvbiBpKHQpe3JldHVybiBPdC5jYWxsKHQpfSkoZSl9ZnVuY3Rpb24gcWkodCxlKXtyZXR1cm4gdD5lfWZ1bmN0aW9uIFlpKHQsZSl7cmV0dXJuIG51bGwhPXQmJk50LmNhbGwodCxlKX1mdW5jdGlvbiBYaSh0LGUpe3JldHVybiBudWxsIT10JiZlIGluIE10KHQpfWZ1bmN0aW9uICRpKGUsbixpKXtmb3IodmFyIHI9aT9TZTpiZSxvPWVbMF0ubGVuZ3RoLGE9ZS5sZW5ndGgscz1hLGw9dnQoYSksYz0xLzAsdT1bXTtzLS07KXt2YXIgaD1lW3NdO3MmJm4mJihoPU1lKGgsVWUobikpKSxjPV9uKGgubGVuZ3RoLGMpLGxbc109IWkmJihufHxvPj0xMjAmJmgubGVuZ3RoPj0xMjApP25ldyBxbihzJiZoKTp0fWg9ZVswXTt2YXIgZD0tMSxwPWxbMF07dDpmb3IoOysrZDxvJiZ1Lmxlbmd0aDxjOyl7dmFyIGY9aFtkXSxtPW4/bihmKTpmO2lmKGY9aXx8MCE9PWY/ZjowLCEocD9HZShwLG0pOnIodSxtLGkpKSl7Zm9yKHM9YTstLXM7KXt2YXIgZz1sW3NdO2lmKCEoZz9HZShnLG0pOnIoZVtzXSxtLGkpKSljb250aW51ZSB0fXAmJnAucHVzaChtKSx1LnB1c2goZil9fXJldHVybiB1fWZ1bmN0aW9uIEtpKGUsbixpKXt2YXIgcj1udWxsPT0oZT1ZbyhlLG49QnIobixlKSkpP2U6ZVtyYShfYShuKSldO3JldHVybiBudWxsPT1yP3Q6cGUocixlLGkpfWZ1bmN0aW9uIFppKHQpe3JldHVybiBNcyh0KSYmV2kodCk9PWh9ZnVuY3Rpb24gSmkoZSxuLGkscixvKXtyZXR1cm4gZT09PW58fChudWxsPT1lfHxudWxsPT1ufHwhTXMoZSkmJiFNcyhuKT9lIT1lJiZuIT1uOihmdW5jdGlvbiBhKGUsbixpLHIsbyxzKXt2YXIgbD1ocyhlKSxjPWhzKG4pLHU9bD9kOlJvKGUpLGc9Yz9kOlJvKG4pLF89KHU9dT09aD9iOnUpPT1iLHg9KGc9Zz09aD9iOmcpPT1iLFQ9dT09ZztpZihUJiZncyhlKSl7aWYoIWdzKG4pKXJldHVybiExO2w9ITAsXz0hMX1pZihUJiYhXylyZXR1cm4gc3x8KHM9bmV3IFluKSxsfHxPcyhlKT94byhlLG4saSxyLG8scyk6KGZ1bmN0aW9uIGsodCxlLG4saSxyLG8sYSl7c3dpdGNoKG4pe2Nhc2UgQTppZih0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8dC5ieXRlT2Zmc2V0IT1lLmJ5dGVPZmZzZXQpcmV0dXJuITE7dD10LmJ1ZmZlcixlPWUuYnVmZmVyO2Nhc2UgQzpyZXR1cm4hKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHwhbyhuZXcgR3QodCksbmV3IEd0KGUpKSk7Y2FzZSBwOmNhc2UgZjpjYXNlIHY6cmV0dXJuIHNzKCt0LCtlKTtjYXNlIG06cmV0dXJuIHQubmFtZT09ZS5uYW1lJiZ0Lm1lc3NhZ2U9PWUubWVzc2FnZTtjYXNlIHc6Y2FzZSBNOnJldHVybiB0PT1lKyIiO2Nhc2UgeTp2YXIgcz1KZTtjYXNlIFM6aWYoc3x8KHM9ZW4pLHQuc2l6ZSE9ZS5zaXplJiYhKDEmaSkpcmV0dXJuITE7dmFyIGw9YS5nZXQodCk7aWYobClyZXR1cm4gbD09ZTtpfD0yLGEuc2V0KHQsZSk7dmFyIGM9eG8ocyh0KSxzKGUpLGkscixvLGEpO3JldHVybiBhLmRlbGV0ZSh0KSxjO2Nhc2UgRTppZih6bilyZXR1cm4gem4uY2FsbCh0KT09em4uY2FsbChlKX1yZXR1cm4hMX0pKGUsbix1LGkscixvLHMpO2lmKCEoMSZpKSl7dmFyIEw9XyYmTnQuY2FsbChlLCJfX3dyYXBwZWRfXyIpLFA9eCYmTnQuY2FsbChuLCJfX3dyYXBwZWRfXyIpO2lmKEx8fFApe3ZhciBOPUw/ZS52YWx1ZSgpOmUsST1QP24udmFsdWUoKTpuO3JldHVybiBzfHwocz1uZXcgWW4pLG8oTixJLGkscixzKX19cmV0dXJuISFUJiYoc3x8KHM9bmV3IFluKSwoZnVuY3Rpb24gUihlLG4saSxyLG8sYSl7dmFyIHM9MSZpLGw9U28oZSksYz1sLmxlbmd0aDtpZihjIT1TbyhuKS5sZW5ndGgmJiFzKXJldHVybiExO2Zvcih2YXIgdT1jO3UtLTspe3ZhciBoPWxbdV07aWYoIShzP2ggaW4gbjpOdC5jYWxsKG4saCkpKXJldHVybiExfXZhciBkPWEuZ2V0KGUpLHA9YS5nZXQobik7aWYoZCYmcClyZXR1cm4gZD09biYmcD09ZTt2YXIgZj0hMDthLnNldChlLG4pLGEuc2V0KG4sZSk7Zm9yKHZhciBtPXM7Kyt1PGM7KXt2YXIgZz1lW2g9bFt1XV0sXz1uW2hdO2lmKHIpdmFyIHk9cz9yKF8sZyxoLG4sZSxhKTpyKGcsXyxoLGUsbixhKTtpZighKHk9PT10P2c9PT1ffHxvKGcsXyxpLHIsYSk6eSkpe2Y9ITE7YnJlYWt9bXx8KG09ImNvbnN0cnVjdG9yIj09aCl9aWYoZiYmIW0pe3ZhciB2PWUuY29uc3RydWN0b3IsYj1uLmNvbnN0cnVjdG9yO3Y9PWJ8fCEoImNvbnN0cnVjdG9yImluIGUpfHwhKCJjb25zdHJ1Y3RvciJpbiBuKXx8ImZ1bmN0aW9uIj09dHlwZW9mIHYmJnYgaW5zdGFuY2VvZiB2JiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYiBpbnN0YW5jZW9mIGJ8fChmPSExKX1yZXR1cm4gYS5kZWxldGUoZSksYS5kZWxldGUobiksZn0pKGUsbixpLHIsbyxzKSl9KShlLG4saSxyLEppLG8pKX1mdW5jdGlvbiBRaShlLG4saSxyKXt2YXIgbz1pLmxlbmd0aCxhPW8scz0hcjtpZihudWxsPT1lKXJldHVybiFhO2ZvcihlPU10KGUpO28tLTspe3ZhciBsPWlbb107aWYocyYmbFsyXT9sWzFdIT09ZVtsWzBdXTohKGxbMF1pbiBlKSlyZXR1cm4hMX1mb3IoOysrbzxhOyl7dmFyIGM9KGw9aVtvXSlbMF0sdT1lW2NdLGg9bFsxXTtpZihzJiZsWzJdKXtpZih1PT09dCYmIShjIGluIGUpKXJldHVybiExfWVsc2V7dmFyIGQ9bmV3IFluO2lmKHIpdmFyIHA9cih1LGgsYyxlLG4sZCk7aWYoIShwPT09dD9KaShoLHUsMyxyLGQpOnApKXJldHVybiExfX1yZXR1cm4hMH1mdW5jdGlvbiB0cih0KXtyZXR1cm4hKCFTcyh0KXx8KGZ1bmN0aW9uIGUodCl7cmV0dXJuISFSdCYmUnQgaW4gdH0pKHQpKSYmKGJzKHQpP0J0Omh0KS50ZXN0KG9hKHQpKX1mdW5jdGlvbiBlcih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90Om51bGw9PXQ/TGw6Im9iamVjdCI9PXR5cGVvZiB0P2hzKHQpP2FyKHRbMF0sdFsxXSk6b3IodCk6SGwodCl9ZnVuY3Rpb24gbnIodCl7aWYoIWpvKHQpKXJldHVybiBtbih0KTt2YXIgZT1bXTtmb3IodmFyIG4gaW4gTXQodCkpTnQuY2FsbCh0LG4pJiYiY29uc3RydWN0b3IiIT1uJiZlLnB1c2gobik7cmV0dXJuIGV9ZnVuY3Rpb24gaXIodCxlKXtyZXR1cm4gdDxlfWZ1bmN0aW9uIHJyKHQsZSl7dmFyIG49LTEsaT1mcyh0KT92dCh0Lmxlbmd0aCk6W107cmV0dXJuIE5pKHQsKGZ1bmN0aW9uKHQscixvKXtpWysrbl09ZSh0LHIsbyl9KSksaX1mdW5jdGlvbiBvcih0KXt2YXIgZT1Mbyh0KTtyZXR1cm4gMT09ZS5sZW5ndGgmJmVbMF1bMl0/V28oZVswXVswXSxlWzBdWzFdKTpmdW5jdGlvbihuKXtyZXR1cm4gbj09PXR8fFFpKG4sdCxlKX19ZnVuY3Rpb24gYXIoZSxuKXtyZXR1cm4gRm8oZSkmJkdvKG4pP1dvKHJhKGUpLG4pOmZ1bmN0aW9uKGkpe3ZhciByPVFzKGksZSk7cmV0dXJuIHI9PT10JiZyPT09bj90bChpLGUpOkppKG4sciwzKX19ZnVuY3Rpb24gc3IoZSxuLGkscixvKXtlIT09biYmQmkobiwoZnVuY3Rpb24oYSxzKXtpZihvfHwobz1uZXcgWW4pLFNzKGEpKSEoZnVuY3Rpb24gbChlLG4saSxyLG8sYSxzKXt2YXIgbD0kbyhlLGkpLGM9JG8obixpKSx1PXMuZ2V0KGMpO2lmKHUpSm4oZSxpLHUpO2Vsc2V7dmFyIGg9YT9hKGwsYyxpKyIiLGUsbixzKTp0LGQ9aD09PXQ7aWYoZCl7dmFyIHA9aHMoYyksZj0hcCYmZ3MoYyksbT0hcCYmIWYmJk9zKGMpO2g9YyxwfHxmfHxtP2hzKGwpP2g9bDptcyhsKT9oPVhyKGwpOmY/KGQ9ITEsaD1VcihjLCEwKSk6bT8oZD0hMSxoPUdyKGMsITApKTpoPVtdOkFzKGMpfHx1cyhjKT8oaD1sLHVzKGwpP2g9R3MobCk6U3MobCkmJiFicyhsKXx8KGg9em8oYykpKTpkPSExfWQmJihzLnNldChjLGgpLG8oaCxjLHIsYSxzKSxzLmRlbGV0ZShjKSksSm4oZSxpLGgpfX0pKGUsbixzLGksc3IscixvKTtlbHNle3ZhciBjPXI/cigkbyhlLHMpLGEscysiIixlLG4sbyk6dDtjPT09dCYmKGM9YSksSm4oZSxzLGMpfX0pLG9sKX1mdW5jdGlvbiBscihlLG4pe3ZhciBpPWUubGVuZ3RoO2lmKGkpcmV0dXJuIEJvKG4rPW48MD9pOjAsaSk/ZVtuXTp0fWZ1bmN0aW9uIGNyKHQsZSxuKXtlPWUubGVuZ3RoP01lKGUsKGZ1bmN0aW9uKHQpe3JldHVybiBocyh0KT9mdW5jdGlvbihlKXtyZXR1cm4gamkoZSwxPT09dC5sZW5ndGg/dFswXTp0KX06dH0pKTpbTGxdO3ZhciBpPS0xO3JldHVybiBlPU1lKGUsVWUoQW8oKSkpLChmdW5jdGlvbiByKHQsZSl7dmFyIG49dC5sZW5ndGg7Zm9yKHQuc29ydChlKTtuLS07KXRbbl09dFtuXS52YWx1ZTtyZXR1cm4gdH0pKHJyKHQsKGZ1bmN0aW9uKHQsbixyKXtyZXR1cm57Y3JpdGVyaWE6TWUoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUodCl9KSksaW5kZXg6KytpLHZhbHVlOnR9fSkpLChmdW5jdGlvbih0LGUpe3JldHVybihmdW5jdGlvbiBpKHQsZSxuKXtmb3IodmFyIGk9LTEscj10LmNyaXRlcmlhLG89ZS5jcml0ZXJpYSxhPXIubGVuZ3RoLHM9bi5sZW5ndGg7KytpPGE7KXt2YXIgbD1XcihyW2ldLG9baV0pO2lmKGwpcmV0dXJuIGk+PXM/bDpsKigiZGVzYyI9PW5baV0/LTE6MSl9cmV0dXJuIHQuaW5kZXgtZS5pbmRleH0pKHQsZSxuKX0pKX1mdW5jdGlvbiB1cih0LGUsbil7Zm9yKHZhciBpPS0xLHI9ZS5sZW5ndGgsbz17fTsrK2k8cjspe3ZhciBhPWVbaV0scz1qaSh0LGEpO24ocyxhKSYmeXIobyxCcihhLHQpLHMpfXJldHVybiBvfWZ1bmN0aW9uIGhyKHQsZSxuLGkpe3ZhciByPWk/SWU6TmUsbz0tMSxhPWUubGVuZ3RoLHM9dDtmb3IodD09PWUmJihlPVhyKGUpKSxuJiYocz1NZSh0LFVlKG4pKSk7KytvPGE7KWZvcih2YXIgbD0wLGM9ZVtvXSx1PW4/bihjKTpjOyhsPXIocyx1LGwsaSkpPi0xOylzIT09dCYmaWUuY2FsbChzLGwsMSksaWUuY2FsbCh0LGwsMSk7cmV0dXJuIHR9ZnVuY3Rpb24gZHIodCxlKXtmb3IodmFyIG49dD9lLmxlbmd0aDowLGk9bi0xO24tLTspe3ZhciByPWVbbl07aWYobj09aXx8ciE9PW8pe3ZhciBvPXI7Qm8ocik/aWUuY2FsbCh0LHIsMSk6THIodCxyKX19cmV0dXJuIHR9ZnVuY3Rpb24gcHIodCxlKXtyZXR1cm4gdCt1bihibigpKihlLXQrMSkpfWZ1bmN0aW9uIGZyKHQsZSl7dmFyIG49IiI7aWYoIXR8fGU8MXx8ZT5zKXJldHVybiBuO2Rve2UlMiYmKG4rPXQpLChlPXVuKGUvMikpJiYodCs9dCl9d2hpbGUoZSk7cmV0dXJuIG59ZnVuY3Rpb24gbXIodCxlKXtyZXR1cm4gSm8ocW8odCxlLExsKSx0KyIiKX1mdW5jdGlvbiBncih0KXtyZXR1cm4gJG4ocGwodCkpfWZ1bmN0aW9uIF9yKHQsZSl7dmFyIG49cGwodCk7cmV0dXJuIGVhKG4sb2koZSwwLG4ubGVuZ3RoKSl9ZnVuY3Rpb24geXIoZSxuLGkscil7aWYoIVNzKGUpKXJldHVybiBlO2Zvcih2YXIgbz0tMSxhPShuPUJyKG4sZSkpLmxlbmd0aCxzPWEtMSxsPWU7bnVsbCE9bCYmKytvPGE7KXt2YXIgYz1yYShuW29dKSx1PWk7aWYoIl9fcHJvdG9fXyI9PT1jfHwiY29uc3RydWN0b3IiPT09Y3x8InByb3RvdHlwZSI9PT1jKXJldHVybiBlO2lmKG8hPXMpe3ZhciBoPWxbY107KHU9cj9yKGgsYyxsKTp0KT09PXQmJih1PVNzKGgpP2g6Qm8obltvKzFdKT9bXTp7fSl9UW4obCxjLHUpLGw9bFtjXX1yZXR1cm4gZX12YXIgdnI9QW4/ZnVuY3Rpb24odCxlKXtyZXR1cm4gQW4uc2V0KHQsZSksdH06TGwsYnI9eGU/ZnVuY3Rpb24odCxlKXtyZXR1cm4geGUodCwidG9TdHJpbmciLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTpDbChlKSx3cml0YWJsZTohMH0pfTpMbDtmdW5jdGlvbiB4cih0KXtyZXR1cm4gZWEocGwodCkpfWZ1bmN0aW9uIHdyKHQsZSxuKXt2YXIgaT0tMSxyPXQubGVuZ3RoO2U8MCYmKGU9LWU+cj8wOnIrZSksKG49bj5yP3I6bik8MCYmKG4rPXIpLHI9ZT5uPzA6bi1lPj4+MCxlPj4+PTA7Zm9yKHZhciBvPXZ0KHIpOysraTxyOylvW2ldPXRbaStlXTtyZXR1cm4gb31mdW5jdGlvbiBTcih0LGUpe3ZhciBuO3JldHVybiBOaSh0LChmdW5jdGlvbih0LGkscil7cmV0dXJuIShuPWUodCxpLHIpKX0pKSwhIW59ZnVuY3Rpb24gTXIodCxlLG4pe3ZhciBpPTAscj1udWxsPT10P2k6dC5sZW5ndGg7aWYoIm51bWJlciI9PXR5cGVvZiBlJiZlPT1lJiZyPD0yMTQ3NDgzNjQ3KXtmb3IoO2k8cjspe3ZhciBvPWkrcj4+PjEsYT10W29dO251bGwhPT1hJiYhUnMoYSkmJihuP2E8PWU6YTxlKT9pPW8rMTpyPW99cmV0dXJuIHJ9cmV0dXJuIEVyKHQsZSxMbCxuKX1mdW5jdGlvbiBFcihlLG4saSxyKXt2YXIgbz0wLGE9bnVsbD09ZT8wOmUubGVuZ3RoO2lmKDA9PT1hKXJldHVybiAwO2Zvcih2YXIgcz0obj1pKG4pKSE9bixsPW51bGw9PT1uLGM9UnMobiksdT1uPT09dDtvPGE7KXt2YXIgaD11bigobythKS8yKSxkPWkoZVtoXSkscD1kIT09dCxmPW51bGw9PT1kLG09ZD09ZCxnPVJzKGQpO2lmKHMpdmFyIF89cnx8bTtlbHNlIF89dT9tJiYocnx8cCk6bD9tJiZwJiYocnx8IWYpOmM/bSYmcCYmIWYmJihyfHwhZyk6IWYmJiFnJiYocj9kPD1uOmQ8bik7Xz9vPWgrMTphPWh9cmV0dXJuIF9uKGEsNDI5NDk2NzI5NCl9ZnVuY3Rpb24gVHIodCxlKXtmb3IodmFyIG49LTEsaT10Lmxlbmd0aCxyPTAsbz1bXTsrK248aTspe3ZhciBhPXRbbl0scz1lP2UoYSk6YTtpZighbnx8IXNzKHMsbCkpe3ZhciBsPXM7b1tyKytdPTA9PT1hPzA6YX19cmV0dXJuIG99ZnVuY3Rpb24gQ3IodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3Q6UnModCk/bDordH1mdW5jdGlvbiBBcih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYoaHModCkpcmV0dXJuIE1lKHQsQXIpKyIiO2lmKFJzKHQpKXJldHVybiBEbj9Ebi5jYWxsKHQpOiIiO3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS0xLzA/Ii0wIjplfWZ1bmN0aW9uIGtyKHQsZSxuKXt2YXIgaT0tMSxyPWJlLG89dC5sZW5ndGgsYT0hMCxzPVtdLGw9cztpZihuKWE9ITEscj1TZTtlbHNlIGlmKG8+PTIwMCl7dmFyIGM9ZT9udWxsOm1vKHQpO2lmKGMpcmV0dXJuIGVuKGMpO2E9ITEscj1HZSxsPW5ldyBxbn1lbHNlIGw9ZT9bXTpzO3Q6Zm9yKDsrK2k8bzspe3ZhciB1PXRbaV0saD1lP2UodSk6dTtpZih1PW58fDAhPT11P3U6MCxhJiZoPT1oKXtmb3IodmFyIGQ9bC5sZW5ndGg7ZC0tOylpZihsW2RdPT09aCljb250aW51ZSB0O2UmJmwucHVzaChoKSxzLnB1c2godSl9ZWxzZSByKGwsaCxuKXx8KGwhPT1zJiZsLnB1c2goaCkscy5wdXNoKHUpKX1yZXR1cm4gc31mdW5jdGlvbiBMcih0LGUpe3JldHVybiBudWxsPT0odD1Zbyh0LGU9QnIoZSx0KSkpfHxkZWxldGUgdFtyYShfYShlKSldfWZ1bmN0aW9uIFByKHQsZSxuLGkpe3JldHVybiB5cih0LGUsbihqaSh0LGUpKSxpKX1mdW5jdGlvbiBOcih0LGUsbixpKXtmb3IodmFyIHI9dC5sZW5ndGgsbz1pP3I6LTE7KGk/by0tOisrbzxyKSYmZSh0W29dLG8sdCk7KTtyZXR1cm4gbj93cih0LGk/MDpvLGk/bysxOnIpOndyKHQsaT9vKzE6MCxpP3I6byl9ZnVuY3Rpb24gSXIodCxlKXt2YXIgbj10O3JldHVybiBuIGluc3RhbmNlb2YgVW4mJihuPW4udmFsdWUoKSksVGUoZSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5mdW5jLmFwcGx5KGUudGhpc0FyZyxFZShbdF0sZS5hcmdzKSl9KSxuKX1mdW5jdGlvbiBScih0LGUsbil7dmFyIGk9dC5sZW5ndGg7aWYoaTwyKXJldHVybiBpP2tyKHRbMF0pOltdO2Zvcih2YXIgcj0tMSxvPXZ0KGkpOysrcjxpOylmb3IodmFyIGE9dFtyXSxzPS0xOysrczxpOylzIT1yJiYob1tyXT1jaShvW3JdfHxhLHRbc10sZSxuKSk7cmV0dXJuIGtyKERpKG8sMSksZSxuKX1mdW5jdGlvbiBPcihlLG4saSl7Zm9yKHZhciByPS0xLG89ZS5sZW5ndGgsYT1uLmxlbmd0aCxzPXt9OysrcjxvOylpKHMsZVtyXSxyPGE/bltyXTp0KTtyZXR1cm4gc31mdW5jdGlvbiB6cih0KXtyZXR1cm4gbXModCk/dDpbXX1mdW5jdGlvbiBEcih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OkxsfWZ1bmN0aW9uIEJyKHQsZSl7cmV0dXJuIGhzKHQpP3Q6Rm8odCxlKT9bdF06bmEoV3ModCkpfXZhciBIcj1tcjtmdW5jdGlvbiBGcihlLG4saSl7dmFyIHI9ZS5sZW5ndGg7cmV0dXJuIGk9aT09PXQ/cjppLCFuJiZpPj1yP2U6d3IoZSxuLGkpfXZhciBWcj13ZXx8ZnVuY3Rpb24odCl7cmV0dXJuIGVlLmNsZWFyVGltZW91dCh0KX07ZnVuY3Rpb24gVXIodCxlKXtpZihlKXJldHVybiB0LnNsaWNlKCk7dmFyIG49dC5sZW5ndGgsaT1LdD9LdChuKTpuZXcgdC5jb25zdHJ1Y3RvcihuKTtyZXR1cm4gdC5jb3B5KGkpLGl9ZnVuY3Rpb24ganIodCl7dmFyIGU9bmV3IHQuY29uc3RydWN0b3IodC5ieXRlTGVuZ3RoKTtyZXR1cm4gbmV3IEd0KGUpLnNldChuZXcgR3QodCkpLGV9ZnVuY3Rpb24gR3IodCxlKXt2YXIgbj1lP2pyKHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3Iobix0LmJ5dGVPZmZzZXQsdC5sZW5ndGgpfWZ1bmN0aW9uIFdyKGUsbil7aWYoZSE9PW4pe3ZhciBpPWUhPT10LHI9bnVsbD09PWUsbz1lPT1lLGE9UnMoZSkscz1uIT09dCxsPW51bGw9PT1uLGM9bj09bix1PVJzKG4pO2lmKCFsJiYhdSYmIWEmJmU+bnx8YSYmcyYmYyYmIWwmJiF1fHxyJiZzJiZjfHwhaSYmY3x8IW8pcmV0dXJuIDE7aWYoIXImJiFhJiYhdSYmZTxufHx1JiZpJiZvJiYhciYmIWF8fGwmJmkmJm98fCFzJiZvfHwhYylyZXR1cm4tMX1yZXR1cm4gMH1mdW5jdGlvbiBxcih0LGUsbixpKXtmb3IodmFyIHI9LTEsbz10Lmxlbmd0aCxhPW4ubGVuZ3RoLHM9LTEsbD1lLmxlbmd0aCxjPWduKG8tYSwwKSx1PXZ0KGwrYyksaD0haTsrK3M8bDspdVtzXT1lW3NdO2Zvcig7KytyPGE7KShofHxyPG8pJiYodVtuW3JdXT10W3JdKTtmb3IoO2MtLTspdVtzKytdPXRbcisrXTtyZXR1cm4gdX1mdW5jdGlvbiBZcih0LGUsbixpKXtmb3IodmFyIHI9LTEsbz10Lmxlbmd0aCxhPS0xLHM9bi5sZW5ndGgsbD0tMSxjPWUubGVuZ3RoLHU9Z24oby1zLDApLGg9dnQodStjKSxkPSFpOysrcjx1OyloW3JdPXRbcl07Zm9yKHZhciBwPXI7KytsPGM7KWhbcCtsXT1lW2xdO2Zvcig7KythPHM7KShkfHxyPG8pJiYoaFtwK25bYV1dPXRbcisrXSk7cmV0dXJuIGh9ZnVuY3Rpb24gWHIodCxlKXt2YXIgbj0tMSxpPXQubGVuZ3RoO2ZvcihlfHwoZT12dChpKSk7KytuPGk7KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiAkcihlLG4saSxyKXt2YXIgbz0haTtpfHwoaT17fSk7Zm9yKHZhciBhPS0xLHM9bi5sZW5ndGg7KythPHM7KXt2YXIgbD1uW2FdLGM9cj9yKGlbbF0sZVtsXSxsLGksZSk6dDtjPT09dCYmKGM9ZVtsXSksbz9paShpLGwsYyk6UW4oaSxsLGMpfXJldHVybiBpfWZ1bmN0aW9uIEtyKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSl7dmFyIHI9aHMobik/ZmU6ZWksbz1lP2UoKTp7fTtyZXR1cm4gcihuLHQsQW8oaSwyKSxvKX19ZnVuY3Rpb24gWnIoZSl7cmV0dXJuIG1yKChmdW5jdGlvbihuLGkpe3ZhciByPS0xLG89aS5sZW5ndGgsYT1vPjE/aVtvLTFdOnQscz1vPjI/aVsyXTp0O2ZvcihhPWUubGVuZ3RoPjMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhPyhvLS0sYSk6dCxzJiZIbyhpWzBdLGlbMV0scykmJihhPW88Mz90OmEsbz0xKSxuPU10KG4pOysrcjxvOyl7dmFyIGw9aVtyXTtsJiZlKG4sbCxyLGEpfXJldHVybiBufSkpfWZ1bmN0aW9uIEpyKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSl7aWYobnVsbD09bilyZXR1cm4gbjtpZighZnMobikpcmV0dXJuIHQobixpKTtmb3IodmFyIHI9bi5sZW5ndGgsbz1lP3I6LTEsYT1NdChuKTsoZT9vLS06KytvPHIpJiYhMSE9PWkoYVtvXSxvLGEpOyk7cmV0dXJuIG59fWZ1bmN0aW9uIFFyKHQpe3JldHVybiBmdW5jdGlvbihlLG4saSl7Zm9yKHZhciByPS0xLG89TXQoZSksYT1pKGUpLHM9YS5sZW5ndGg7cy0tOyl7dmFyIGw9YVt0P3M6KytyXTtpZighMT09PW4ob1tsXSxsLG8pKWJyZWFrfXJldHVybiBlfX1mdW5jdGlvbiB0byhlKXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGk9WmUobj1XcyhuKSk/b24obik6dCxyPWk/aVswXTpuLmNoYXJBdCgwKSxvPWk/RnIoaSwxKS5qb2luKCIiKTpuLnNsaWNlKDEpO3JldHVybiByW2VdKCkrb319ZnVuY3Rpb24gZW8odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBUZShNbChnbChlKS5yZXBsYWNlKEZ0LCIiKSksdCwiIil9fWZ1bmN0aW9uIG5vKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlWzBdKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSk7Y2FzZSAzOnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSk7Y2FzZSA0OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdKTtjYXNlIDU6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSk7Y2FzZSA2OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XSk7Y2FzZSA3OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XSxlWzZdKX12YXIgbj1Ibih0LnByb3RvdHlwZSksaT10LmFwcGx5KG4sZSk7cmV0dXJuIFNzKGkpP2k6bn19ZnVuY3Rpb24gaW8oZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSxyKXt2YXIgbz1NdChuKTtpZighZnMobikpe3ZhciBhPUFvKGksMyk7bj1ybChuKSxpPWZ1bmN0aW9uKHQpe3JldHVybiBhKG9bdF0sdCxvKX19dmFyIHM9ZShuLGkscik7cmV0dXJuIHM+LTE/b1thP25bc106c106dH19ZnVuY3Rpb24gcm8obil7cmV0dXJuIHdvKChmdW5jdGlvbihpKXt2YXIgcj1pLmxlbmd0aCxvPXIsYT1Wbi5wcm90b3R5cGUudGhydTtmb3IobiYmaS5yZXZlcnNlKCk7by0tOyl7dmFyIHM9aVtvXTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygcyl0aHJvdyBuZXcgQ3QoZSk7aWYoYSYmIWwmJiJ3cmFwcGVyIj09VG8ocykpdmFyIGw9bmV3IFZuKFtdLCEwKX1mb3Iobz1sP286cjsrK288cjspe3ZhciBjPVRvKHM9aVtvXSksdT0id3JhcHBlciI9PWM/RW8ocyk6dDtsPXUmJlZvKHVbMF0pJiY0MjQ9PXVbMV0mJiF1WzRdLmxlbmd0aCYmMT09dVs5XT9sW1RvKHVbMF0pXS5hcHBseShsLHVbM10pOjE9PXMubGVuZ3RoJiZWbyhzKT9sW2NdKCk6bC50aHJ1KHMpfXJldHVybiBmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cyxlPXRbMF07aWYobCYmMT09dC5sZW5ndGgmJmhzKGUpKXJldHVybiBsLnBsYW50KGUpLnZhbHVlKCk7Zm9yKHZhciBuPTAsbz1yP2lbbl0uYXBwbHkodGhpcyx0KTplOysrbjxyOylvPWlbbl0uY2FsbCh0aGlzLG8pO3JldHVybiBvfX0pKX1mdW5jdGlvbiBvbyhlLG4saSxyLGEscyxsLGMsdSxoKXt2YXIgZD1uJm8scD0xJm4sZj0yJm4sbT0yNCZuLGc9NTEyJm4sXz1mP3Q6bm8oZSk7cmV0dXJuIGZ1bmN0aW9uIHQoKXtmb3IodmFyIG89YXJndW1lbnRzLmxlbmd0aCx5PXZ0KG8pLHY9bzt2LS07KXlbdl09YXJndW1lbnRzW3ZdO2lmKG0pdmFyIGI9Q28odCkseD1ZZSh5LGIpO2lmKHImJih5PXFyKHkscixhLG0pKSxzJiYoeT1Zcih5LHMsbCxtKSksby09eCxtJiZvPGgpe3ZhciB3PXRuKHksYik7cmV0dXJuIHBvKGUsbixvbyx0LnBsYWNlaG9sZGVyLGkseSx3LGMsdSxoLW8pfXZhciBTPXA/aTp0aGlzLE09Zj9TW2VdOmU7cmV0dXJuIG89eS5sZW5ndGgsYz95PVhvKHksYyk6ZyYmbz4xJiZ5LnJldmVyc2UoKSxkJiZ1PG8mJih5Lmxlbmd0aD11KSx0aGlzJiZ0aGlzIT09ZWUmJnRoaXMgaW5zdGFuY2VvZiB0JiYoTT1ffHxubyhNKSksTS5hcHBseShTLHkpfX1mdW5jdGlvbiBhbyh0LGUpe3JldHVybiBmdW5jdGlvbihuLGkpe3JldHVybihmdW5jdGlvbiByKHQsZSxuLGkpe3JldHVybiBGaSh0LChmdW5jdGlvbih0LHIsbyl7ZShpLG4odCkscixvKX0pKSxpfSkobix0LGUoaSkse30pfX1mdW5jdGlvbiBzbyhlLG4pe3JldHVybiBmdW5jdGlvbihpLHIpe3ZhciBvO2lmKGk9PT10JiZyPT09dClyZXR1cm4gbjtpZihpIT09dCYmKG89aSksciE9PXQpe2lmKG89PT10KXJldHVybiByOyJzdHJpbmciPT10eXBlb2YgaXx8InN0cmluZyI9PXR5cGVvZiByPyhpPUFyKGkpLHI9QXIocikpOihpPUNyKGkpLHI9Q3IocikpLG89ZShpLHIpfXJldHVybiBvfX1mdW5jdGlvbiBsbyh0KXtyZXR1cm4gd28oKGZ1bmN0aW9uKGUpe3JldHVybiBlPU1lKGUsVWUoQW8oKSkpLG1yKChmdW5jdGlvbihuKXt2YXIgaT10aGlzO3JldHVybiB0KGUsKGZ1bmN0aW9uKHQpe3JldHVybiBwZSh0LGksbil9KSl9KSl9KSl9ZnVuY3Rpb24gY28oZSxuKXt2YXIgaT0obj1uPT09dD8iICI6QXIobikpLmxlbmd0aDtpZihpPDIpcmV0dXJuIGk/ZnIobixlKTpuO3ZhciByPWZyKG4sY24oZS9ybihuKSkpO3JldHVybiBaZShuKT9GcihvbihyKSwwLGUpLmpvaW4oIiIpOnIuc2xpY2UoMCxlKX1mdW5jdGlvbiB1byhlKXtyZXR1cm4gZnVuY3Rpb24obixpLHIpe3JldHVybiByJiYibnVtYmVyIiE9dHlwZW9mIHImJkhvKG4saSxyKSYmKGk9cj10KSxuPUZzKG4pLGk9PT10PyhpPW4sbj0wKTppPUZzKGkpLChmdW5jdGlvbiBvKHQsZSxuLGkpe2Zvcih2YXIgcj0tMSxvPWduKGNuKChlLXQpLyhufHwxKSksMCksYT12dChvKTtvLS07KWFbaT9vOisrcl09dCx0Kz1uO3JldHVybiBhfSkobixpLHI9cj09PXQ/bjxpPzE6LTE6RnMociksZSl9fWZ1bmN0aW9uIGhvKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmInN0cmluZyI9PXR5cGVvZiBufHwoZT1qcyhlKSxuPWpzKG4pKSx0KGUsbil9fWZ1bmN0aW9uIHBvKGUsbixpLG8sYSxzLGwsYyx1LGgpe3ZhciBkPTgmbjtufD1kP3I6NjQsNCYobiY9fihkPzY0OnIpKXx8KG4mPS00KTt2YXIgcD1bZSxuLGEsZD9zOnQsZD9sOnQsZD90OnMsZD90OmwsYyx1LGhdLGY9aS5hcHBseSh0LHApO3JldHVybiBWbyhlKSYmS28oZixwKSxmLnBsYWNlaG9sZGVyPW8sUW8oZixlLG4pfWZ1bmN0aW9uIGZvKHQpe3ZhciBlPVN0W3RdO3JldHVybiBmdW5jdGlvbih0LG4pe2lmKHQ9anModCksKG49bnVsbD09bj8wOl9uKFZzKG4pLDI5MikpJiZwbih0KSl7dmFyIGk9KFdzKHQpKyJlIikuc3BsaXQoImUiKTtyZXR1cm4rKChpPShXcyhlKGlbMF0rImUiKygraVsxXStuKSkpKyJlIikuc3BsaXQoImUiKSlbMF0rImUiKygraVsxXS1uKSl9cmV0dXJuIGUodCl9fXZhciBtbz1FbiYmMS9lbihuZXcgRW4oWywtMF0pKVsxXT09YT9mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEVuKHQpfTpPbDtmdW5jdGlvbiBnbyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49Um8oZSk7cmV0dXJuIG49PXk/SmUoZSk6bj09Uz9ubihlKTooZnVuY3Rpb24gaSh0LGUpe3JldHVybiBNZShlLChmdW5jdGlvbihlKXtyZXR1cm5bZSx0W2VdXX0pKX0pKGUsdChlKSl9fWZ1bmN0aW9uIF9vKG4sYSxzLGwsYyx1LGgsZCl7dmFyIHA9MiZhO2lmKCFwJiYiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgQ3QoZSk7dmFyIGY9bD9sLmxlbmd0aDowO2lmKGZ8fChhJj0tOTcsbD1jPXQpLGg9aD09PXQ/aDpnbihWcyhoKSwwKSxkPWQ9PT10P2Q6VnMoZCksZi09Yz9jLmxlbmd0aDowLDY0JmEpe3ZhciBtPWwsZz1jO2w9Yz10fXZhciBfPXA/dDpFbyhuKSx5PVtuLGEscyxsLGMsbSxnLHUsaCxkXTtpZihfJiYoZnVuY3Rpb24gdih0LGUpe3ZhciBuPXRbMV0scj1lWzFdLGE9bnxyO2lmKCEoYTwxMzF8fHI9PW8mJjg9PW58fHI9PW8mJjI1Nj09biYmdFs3XS5sZW5ndGg8PWVbOF18fDM4ND09ciYmZVs3XS5sZW5ndGg8PWVbOF0mJjg9PW4pKXJldHVybiB0OzEmciYmKHRbMl09ZVsyXSxhfD0xJm4/MDo0KTt2YXIgcz1lWzNdO2lmKHMpe3ZhciBsPXRbM107dFszXT1sP3FyKGwscyxlWzRdKTpzLHRbNF09bD90bih0WzNdLGkpOmVbNF19KHM9ZVs1XSkmJih0WzVdPShsPXRbNV0pP1lyKGwscyxlWzZdKTpzLHRbNl09bD90bih0WzVdLGkpOmVbNl0pLChzPWVbN10pJiYodFs3XT1zKSxyJm8mJih0WzhdPW51bGw9PXRbOF0/ZVs4XTpfbih0WzhdLGVbOF0pKSxudWxsPT10WzldJiYodFs5XT1lWzldKSx0WzBdPWVbMF0sdFsxXT1hfSkoeSxfKSxuPXlbMF0sYT15WzFdLHM9eVsyXSxsPXlbM10sYz15WzRdLCEoZD15WzldPXlbOV09PT10P3A/MDpuLmxlbmd0aDpnbih5WzldLWYsMCkpJiYyNCZhJiYoYSY9LTI1KSxhJiYxIT1hKXc9OD09YXx8MTY9PWE/KGZ1bmN0aW9uIGIoZSxuLGkpe3ZhciByPW5vKGUpO3JldHVybiBmdW5jdGlvbiBvKCl7Zm9yKHZhciBhPWFyZ3VtZW50cy5sZW5ndGgscz12dChhKSxsPWEsYz1DbyhvKTtsLS07KXNbbF09YXJndW1lbnRzW2xdO3ZhciB1PWE8MyYmc1swXSE9PWMmJnNbYS0xXSE9PWM/W106dG4ocyxjKTtyZXR1cm4oYS09dS5sZW5ndGgpPGk/cG8oZSxuLG9vLG8ucGxhY2Vob2xkZXIsdCxzLHUsdCx0LGktYSk6cGUodGhpcyYmdGhpcyE9PWVlJiZ0aGlzIGluc3RhbmNlb2Ygbz9yOmUsdGhpcyxzKX19KShuLGEsZCk6YSE9ciYmMzMhPWF8fGMubGVuZ3RoP29vLmFwcGx5KHQseSk6KGZ1bmN0aW9uIHgodCxlLG4saSl7dmFyIHI9MSZlLG89bm8odCk7cmV0dXJuIGZ1bmN0aW9uIGUoKXtmb3IodmFyIGE9LTEscz1hcmd1bWVudHMubGVuZ3RoLGw9LTEsYz1pLmxlbmd0aCx1PXZ0KGMrcyksaD10aGlzJiZ0aGlzIT09ZWUmJnRoaXMgaW5zdGFuY2VvZiBlP286dDsrK2w8YzspdVtsXT1pW2xdO2Zvcig7cy0tOyl1W2wrK109YXJndW1lbnRzWysrYV07cmV0dXJuIHBlKGgscj9uOnRoaXMsdSl9fSkobixhLHMsbCk7ZWxzZSB2YXIgdz0oZnVuY3Rpb24gUyh0LGUsbil7dmFyIGk9MSZlLHI9bm8odCk7cmV0dXJuIGZ1bmN0aW9uIGUoKXtyZXR1cm4odGhpcyYmdGhpcyE9PWVlJiZ0aGlzIGluc3RhbmNlb2YgZT9yOnQpLmFwcGx5KGk/bjp0aGlzLGFyZ3VtZW50cyl9fSkobixhLHMpO3JldHVybiBRbygoXz92cjpLbykodyx5KSxuLGEpfWZ1bmN0aW9uIHlvKGUsbixpLHIpe3JldHVybiBlPT09dHx8c3MoZSxrdFtpXSkmJiFOdC5jYWxsKHIsaSk/bjplfWZ1bmN0aW9uIHZvKGUsbixpLHIsbyxhKXtyZXR1cm4gU3MoZSkmJlNzKG4pJiYoYS5zZXQobixlKSxzcihlLG4sdCx2byxhKSxhLmRlbGV0ZShuKSksZX1mdW5jdGlvbiBibyhlKXtyZXR1cm4gQXMoZSk/dDplfWZ1bmN0aW9uIHhvKGUsbixpLHIsbyxhKXt2YXIgcz0xJmksbD1lLmxlbmd0aCxjPW4ubGVuZ3RoO2lmKGwhPWMmJiEocyYmYz5sKSlyZXR1cm4hMTt2YXIgdT1hLmdldChlKSxoPWEuZ2V0KG4pO2lmKHUmJmgpcmV0dXJuIHU9PW4mJmg9PWU7dmFyIGQ9LTEscD0hMCxmPTImaT9uZXcgcW46dDtmb3IoYS5zZXQoZSxuKSxhLnNldChuLGUpOysrZDxsOyl7dmFyIG09ZVtkXSxnPW5bZF07aWYocil2YXIgXz1zP3IoZyxtLGQsbixlLGEpOnIobSxnLGQsZSxuLGEpO2lmKF8hPT10KXtpZihfKWNvbnRpbnVlO3A9ITE7YnJlYWt9aWYoZil7aWYoIUFlKG4sKGZ1bmN0aW9uKHQsZSl7aWYoIUdlKGYsZSkmJihtPT09dHx8byhtLHQsaSxyLGEpKSlyZXR1cm4gZi5wdXNoKGUpfSkpKXtwPSExO2JyZWFrfX1lbHNlIGlmKG0hPT1nJiYhbyhtLGcsaSxyLGEpKXtwPSExO2JyZWFrfX1yZXR1cm4gYS5kZWxldGUoZSksYS5kZWxldGUobikscH1mdW5jdGlvbiB3byhlKXtyZXR1cm4gSm8ocW8oZSx0LGRhKSxlKyIiKX1mdW5jdGlvbiBTbyh0KXtyZXR1cm4gR2kodCxybCxObyl9ZnVuY3Rpb24gTW8odCl7cmV0dXJuIEdpKHQsb2wsSW8pfXZhciBFbz1Bbj9mdW5jdGlvbih0KXtyZXR1cm4gQW4uZ2V0KHQpfTpPbDtmdW5jdGlvbiBUbyh0KXtmb3IodmFyIGU9dC5uYW1lKyIiLG49a25bZV0saT1OdC5jYWxsKGtuLGUpP24ubGVuZ3RoOjA7aS0tOyl7dmFyIHI9bltpXSxvPXIuZnVuYztpZihudWxsPT1vfHxvPT10KXJldHVybiByLm5hbWV9cmV0dXJuIGV9ZnVuY3Rpb24gQ28odCl7cmV0dXJuKE50LmNhbGwoQm4sInBsYWNlaG9sZGVyIik/Qm46dCkucGxhY2Vob2xkZXJ9ZnVuY3Rpb24gQW8oKXt2YXIgdD1Cbi5pdGVyYXRlZXx8UGw7cmV0dXJuIHQ9dD09PVBsP2VyOnQsYXJndW1lbnRzLmxlbmd0aD90KGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pOnR9ZnVuY3Rpb24ga28odCxlKXt2YXIgbj10Ll9fZGF0YV9fO3JldHVybihmdW5jdGlvbiBpKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiJzdHJpbmciPT1lfHwibnVtYmVyIj09ZXx8InN5bWJvbCI9PWV8fCJib29sZWFuIj09ZT8iX19wcm90b19fIiE9PXQ6bnVsbD09PXR9KShlKT9uWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOm4ubWFwfWZ1bmN0aW9uIExvKHQpe2Zvcih2YXIgZT1ybCh0KSxuPWUubGVuZ3RoO24tLTspe3ZhciBpPWVbbl0scj10W2ldO2Vbbl09W2kscixHbyhyKV19cmV0dXJuIGV9ZnVuY3Rpb24gUG8oZSxuKXt2YXIgaT0oZnVuY3Rpb24gcihlLG4pe3JldHVybiBudWxsPT1lP3Q6ZVtuXX0pKGUsbik7cmV0dXJuIHRyKGkpP2k6dH12YXIgTm89aG4/ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106KHQ9TXQodCkseWUoaG4odCksKGZ1bmN0aW9uKGUpe3JldHVybiBuZS5jYWxsKHQsZSl9KSkpfTpVbCxJbz1obj9mdW5jdGlvbih0KXtmb3IodmFyIGU9W107dDspRWUoZSxObyh0KSksdD1RdCh0KTtyZXR1cm4gZX06VWwsUm89V2k7ZnVuY3Rpb24gT28odCxlLG4pe2Zvcih2YXIgaT0tMSxyPShlPUJyKGUsdCkpLmxlbmd0aCxvPSExOysraTxyOyl7dmFyIGE9cmEoZVtpXSk7aWYoIShvPW51bGwhPXQmJm4odCxhKSkpYnJlYWs7dD10W2FdfXJldHVybiBvfHwrK2khPXI/bzohIShyPW51bGw9PXQ/MDp0Lmxlbmd0aCkmJndzKHIpJiZCbyhhLHIpJiYoaHModCl8fHVzKHQpKX1mdW5jdGlvbiB6byh0KXtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdC5jb25zdHJ1Y3Rvcnx8am8odCk/e306SG4oUXQodCkpfWZ1bmN0aW9uIERvKHQpe3JldHVybiBocyh0KXx8dXModCl8fCEhKG9lJiZ0JiZ0W29lXSl9ZnVuY3Rpb24gQm8odCxlKXt2YXIgbj10eXBlb2YgdDtyZXR1cm4hIShlPW51bGw9PWU/czplKSYmKCJudW1iZXIiPT1ufHwic3ltYm9sIiE9biYmcHQudGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxlfWZ1bmN0aW9uIEhvKHQsZSxuKXtpZighU3MobikpcmV0dXJuITE7dmFyIGk9dHlwZW9mIGU7cmV0dXJuISEoIm51bWJlciI9PWk/ZnMobikmJkJvKGUsbi5sZW5ndGgpOiJzdHJpbmciPT1pJiZlIGluIG4pJiZzcyhuW2VdLHQpfWZ1bmN0aW9uIEZvKHQsZSl7aWYoaHModCkpcmV0dXJuITE7dmFyIG49dHlwZW9mIHQ7cmV0dXJuISgibnVtYmVyIiE9biYmInN5bWJvbCIhPW4mJiJib29sZWFuIiE9biYmbnVsbCE9dCYmIVJzKHQpKXx8JC50ZXN0KHQpfHwhWC50ZXN0KHQpfHxudWxsIT1lJiZ0IGluIE10KGUpfWZ1bmN0aW9uIFZvKHQpe3ZhciBlPVRvKHQpLG49Qm5bZV07aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG58fCEoZSBpbiBVbi5wcm90b3R5cGUpKXJldHVybiExO2lmKHQ9PT1uKXJldHVybiEwO3ZhciBpPUVvKG4pO3JldHVybiEhaSYmdD09PWlbMF19KHduJiZSbyhuZXcgd24obmV3IEFycmF5QnVmZmVyKDEpKSkhPUF8fFNuJiZSbyhuZXcgU24pIT15fHxNbiYmUm8oTW4ucmVzb2x2ZSgpKSE9eHx8RW4mJlJvKG5ldyBFbikhPVN8fFRuJiZSbyhuZXcgVG4pIT1UKSYmKFJvPWZ1bmN0aW9uKGUpe3ZhciBuPVdpKGUpLGk9bj09Yj9lLmNvbnN0cnVjdG9yOnQscj1pP29hKGkpOiIiO2lmKHIpc3dpdGNoKHIpe2Nhc2UgTG46cmV0dXJuIEE7Y2FzZSBQbjpyZXR1cm4geTtjYXNlIE5uOnJldHVybiB4O2Nhc2UgSW46cmV0dXJuIFM7Y2FzZSBSbjpyZXR1cm4gVH1yZXR1cm4gbn0pO3ZhciBVbz1MdD9iczpqbDtmdW5jdGlvbiBqbyh0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yO3JldHVybiB0PT09KCJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLnByb3RvdHlwZXx8a3QpfWZ1bmN0aW9uIEdvKHQpe3JldHVybiB0PT10JiYhU3ModCl9ZnVuY3Rpb24gV28oZSxuKXtyZXR1cm4gZnVuY3Rpb24oaSl7cmV0dXJuIG51bGwhPWkmJmlbZV09PT1uJiYobiE9PXR8fGUgaW4gTXQoaSkpfX1mdW5jdGlvbiBxbyhlLG4saSl7cmV0dXJuIG49Z24obj09PXQ/ZS5sZW5ndGgtMTpuLDApLGZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cyxyPS0xLG89Z24odC5sZW5ndGgtbiwwKSxhPXZ0KG8pOysrcjxvOylhW3JdPXRbbityXTtyPS0xO2Zvcih2YXIgcz12dChuKzEpOysrcjxuOylzW3JdPXRbcl07cmV0dXJuIHNbbl09aShhKSxwZShlLHRoaXMscyl9fWZ1bmN0aW9uIFlvKHQsZSl7cmV0dXJuIGUubGVuZ3RoPDI/dDpqaSh0LHdyKGUsMCwtMSkpfWZ1bmN0aW9uIFhvKGUsbil7Zm9yKHZhciBpPWUubGVuZ3RoLHI9X24obi5sZW5ndGgsaSksbz1YcihlKTtyLS07KXt2YXIgYT1uW3JdO2Vbcl09Qm8oYSxpKT9vW2FdOnR9cmV0dXJuIGV9ZnVuY3Rpb24gJG8odCxlKXtpZigoImNvbnN0cnVjdG9yIiE9PWV8fCJmdW5jdGlvbiIhPXR5cGVvZiB0W2VdKSYmIl9fcHJvdG9fXyIhPWUpcmV0dXJuIHRbZV19dmFyIEtvPXRhKHZyKSxabz1EZXx8ZnVuY3Rpb24odCxlKXtyZXR1cm4gZWUuc2V0VGltZW91dCh0LGUpfSxKbz10YShicik7ZnVuY3Rpb24gUW8odCxlLG4pe3ZhciBpPWUrIiI7cmV0dXJuIEpvKHQsKGZ1bmN0aW9uIGEodCxlKXt2YXIgbj1lLmxlbmd0aDtpZighbilyZXR1cm4gdDt2YXIgaT1uLTE7cmV0dXJuIGVbaV09KG4+MT8iJiAiOiIiKStlW2ldLGU9ZS5qb2luKG4+Mj8iLCAiOiIgIiksdC5yZXBsYWNlKGV0LCJ7XG4vKiBbd3JhcHBlZCB3aXRoICIrZSsiXSAqL1xuIil9KShpLChmdW5jdGlvbiBvKHQsZSl7cmV0dXJuIG1lKHUsKGZ1bmN0aW9uKG4pe3ZhciBpPSJfLiIrblswXTtlJm5bMV0mJiFiZSh0LGkpJiZ0LnB1c2goaSl9KSksdC5zb3J0KCl9KSgoZnVuY3Rpb24gcih0KXt2YXIgZT10Lm1hdGNoKG50KTtyZXR1cm4gZT9lWzFdLnNwbGl0KGl0KTpbXX0pKGkpLG4pKSl9ZnVuY3Rpb24gdGEoZSl7dmFyIG49MCxpPTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9eW4oKSxvPTE2LShyLWkpO2lmKGk9cixvPjApe2lmKCsrbj49ODAwKXJldHVybiBhcmd1bWVudHNbMF19ZWxzZSBuPTA7cmV0dXJuIGUuYXBwbHkodCxhcmd1bWVudHMpfX1mdW5jdGlvbiBlYShlLG4pe3ZhciBpPS0xLHI9ZS5sZW5ndGgsbz1yLTE7Zm9yKG49bj09PXQ/cjpuOysraTxuOyl7dmFyIGE9cHIoaSxvKSxzPWVbYV07ZVthXT1lW2ldLGVbaV09c31yZXR1cm4gZS5sZW5ndGg9bixlfXZhciBuYT0oZnVuY3Rpb24gaWEodCl7dmFyIGU9ZXModCwoZnVuY3Rpb24odCl7cmV0dXJuIDUwMD09PW4uc2l6ZSYmbi5jbGVhcigpLHR9KSksbj1lLmNhY2hlO3JldHVybiBlfSkoKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKCIiKSx0LnJlcGxhY2UoSywoZnVuY3Rpb24odCxuLGkscil7ZS5wdXNoKGk/ci5yZXBsYWNlKGF0LCIkMSIpOm58fHQpfSkpLGV9KSk7ZnVuY3Rpb24gcmEodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHxScyh0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0tMS8wPyItMCI6ZX1mdW5jdGlvbiBvYSh0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIFB0LmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifWZ1bmN0aW9uIGFhKHQpe2lmKHQgaW5zdGFuY2VvZiBVbilyZXR1cm4gdC5jbG9uZSgpO3ZhciBlPW5ldyBWbih0Ll9fd3JhcHBlZF9fLHQuX19jaGFpbl9fKTtyZXR1cm4gZS5fX2FjdGlvbnNfXz1Ycih0Ll9fYWN0aW9uc19fKSxlLl9faW5kZXhfXz10Ll9faW5kZXhfXyxlLl9fdmFsdWVzX189dC5fX3ZhbHVlc19fLGV9dmFyIHNhPW1yKChmdW5jdGlvbih0LGUpe3JldHVybiBtcyh0KT9jaSh0LERpKGUsMSxtcywhMCkpOltdfSkpLGxhPW1yKChmdW5jdGlvbihlLG4pe3ZhciBpPV9hKG4pO3JldHVybiBtcyhpKSYmKGk9dCksbXMoZSk/Y2koZSxEaShuLDEsbXMsITApLEFvKGksMikpOltdfSkpLGNhPW1yKChmdW5jdGlvbihlLG4pe3ZhciBpPV9hKG4pO3JldHVybiBtcyhpKSYmKGk9dCksbXMoZSk/Y2koZSxEaShuLDEsbXMsITApLHQsaSk6W119KSk7ZnVuY3Rpb24gdWEodCxlLG4pe3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZighaSlyZXR1cm4tMTt2YXIgcj1udWxsPT1uPzA6VnMobik7cmV0dXJuIHI8MCYmKHI9Z24oaStyLDApKSxQZSh0LEFvKGUsMykscil9ZnVuY3Rpb24gaGEoZSxuLGkpe3ZhciByPW51bGw9PWU/MDplLmxlbmd0aDtpZighcilyZXR1cm4tMTt2YXIgbz1yLTE7cmV0dXJuIGkhPT10JiYobz1WcyhpKSxvPWk8MD9nbihyK28sMCk6X24obyxyLTEpKSxQZShlLEFvKG4sMyksbywhMCl9ZnVuY3Rpb24gZGEodCl7cmV0dXJuIG51bGwhPXQmJnQubGVuZ3RoP0RpKHQsMSk6W119ZnVuY3Rpb24gcGEoZSl7cmV0dXJuIGUmJmUubGVuZ3RoP2VbMF06dH12YXIgZmE9bXIoKGZ1bmN0aW9uKHQpe3ZhciBlPU1lKHQsenIpO3JldHVybiBlLmxlbmd0aCYmZVswXT09PXRbMF0/JGkoZSk6W119KSksbWE9bXIoKGZ1bmN0aW9uKGUpe3ZhciBuPV9hKGUpLGk9TWUoZSx6cik7cmV0dXJuIG49PT1fYShpKT9uPXQ6aS5wb3AoKSxpLmxlbmd0aCYmaVswXT09PWVbMF0/JGkoaSxBbyhuLDIpKTpbXX0pKSxnYT1tcigoZnVuY3Rpb24oZSl7dmFyIG49X2EoZSksaT1NZShlLHpyKTtyZXR1cm4obj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnQpJiZpLnBvcCgpLGkubGVuZ3RoJiZpWzBdPT09ZVswXT8kaShpLHQsbik6W119KSk7ZnVuY3Rpb24gX2EoZSl7dmFyIG49bnVsbD09ZT8wOmUubGVuZ3RoO3JldHVybiBuP2Vbbi0xXTp0fXZhciB5YT1tcih2YSk7ZnVuY3Rpb24gdmEodCxlKXtyZXR1cm4gdCYmdC5sZW5ndGgmJmUmJmUubGVuZ3RoP2hyKHQsZSk6dH12YXIgYmE9d28oKGZ1bmN0aW9uKHQsZSl7dmFyIG49bnVsbD09dD8wOnQubGVuZ3RoLGk9cmkodCxlKTtyZXR1cm4gZHIodCxNZShlLChmdW5jdGlvbih0KXtyZXR1cm4gQm8odCxuKT8rdDp0fSkpLnNvcnQoV3IpKSxpfSkpO2Z1bmN0aW9uIHhhKHQpe3JldHVybiBudWxsPT10P3Q6eG4uY2FsbCh0KX12YXIgd2E9bXIoKGZ1bmN0aW9uKHQpe3JldHVybiBrcihEaSh0LDEsbXMsITApKX0pKSxTYT1tcigoZnVuY3Rpb24oZSl7dmFyIG49X2EoZSk7cmV0dXJuIG1zKG4pJiYobj10KSxrcihEaShlLDEsbXMsITApLEFvKG4sMikpfSkpLE1hPW1yKChmdW5jdGlvbihlKXt2YXIgbj1fYShlKTtyZXR1cm4gbj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnQsa3IoRGkoZSwxLG1zLCEwKSx0LG4pfSkpO2Z1bmN0aW9uIEVhKHQpe2lmKCF0fHwhdC5sZW5ndGgpcmV0dXJuW107dmFyIGU9MDtyZXR1cm4gdD15ZSh0LChmdW5jdGlvbih0KXtpZihtcyh0KSlyZXR1cm4gZT1nbih0Lmxlbmd0aCxlKSwhMH0pKSxGZShlLChmdW5jdGlvbihlKXtyZXR1cm4gTWUodCx6ZShlKSl9KSl9ZnVuY3Rpb24gVGEoZSxuKXtpZighZXx8IWUubGVuZ3RoKXJldHVybltdO3ZhciBpPUVhKGUpO3JldHVybiBudWxsPT1uP2k6TWUoaSwoZnVuY3Rpb24oZSl7cmV0dXJuIHBlKG4sdCxlKX0pKX12YXIgQ2E9bXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG1zKHQpP2NpKHQsZSk6W119KSksQWE9bXIoKGZ1bmN0aW9uKHQpe3JldHVybiBScih5ZSh0LG1zKSl9KSksa2E9bXIoKGZ1bmN0aW9uKGUpe3ZhciBuPV9hKGUpO3JldHVybiBtcyhuKSYmKG49dCksUnIoeWUoZSxtcyksQW8obiwyKSl9KSksTGE9bXIoKGZ1bmN0aW9uKGUpe3ZhciBuPV9hKGUpO3JldHVybiBuPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246dCxScih5ZShlLG1zKSx0LG4pfSkpLFBhPW1yKEVhKSxOYT1tcigoZnVuY3Rpb24oZSl7dmFyIG49ZS5sZW5ndGgsaT1uPjE/ZVtuLTFdOnQ7cmV0dXJuIGk9ImZ1bmN0aW9uIj09dHlwZW9mIGk/KGUucG9wKCksaSk6dCxUYShlLGkpfSkpO2Z1bmN0aW9uIElhKHQpe3ZhciBlPUJuKHQpO3JldHVybiBlLl9fY2hhaW5fXz0hMCxlfWZ1bmN0aW9uIFJhKHQsZSl7cmV0dXJuIGUodCl9dmFyIE9hPXdvKChmdW5jdGlvbihlKXt2YXIgbj1lLmxlbmd0aCxpPW4/ZVswXTowLHI9dGhpcy5fX3dyYXBwZWRfXyxvPWZ1bmN0aW9uKHQpe3JldHVybiByaSh0LGUpfTtyZXR1cm4hKG4+MXx8dGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgpJiZyIGluc3RhbmNlb2YgVW4mJkJvKGkpPygocj1yLnNsaWNlKGksK2krKG4/MTowKSkpLl9fYWN0aW9uc19fLnB1c2goe2Z1bmM6UmEsYXJnczpbb10sdGhpc0FyZzp0fSksbmV3IFZuKHIsdGhpcy5fX2NoYWluX18pLnRocnUoKGZ1bmN0aW9uKGUpe3JldHVybiBuJiYhZS5sZW5ndGgmJmUucHVzaCh0KSxlfSkpKTp0aGlzLnRocnUobyl9KSksemE9S3IoKGZ1bmN0aW9uKHQsZSxuKXtOdC5jYWxsKHQsbik/Kyt0W25dOmlpKHQsbiwxKX0pKSxEYT1pbyh1YSksQmE9aW8oaGEpO2Z1bmN0aW9uIEhhKHQsZSl7cmV0dXJuKGhzKHQpP21lOk5pKSh0LEFvKGUsMykpfWZ1bmN0aW9uIEZhKHQsZSl7cmV0dXJuKGhzKHQpP2dlOklpKSh0LEFvKGUsMykpfXZhciBWYT1LcigoZnVuY3Rpb24odCxlLG4pe050LmNhbGwodCxuKT90W25dLnB1c2goZSk6aWkodCxuLFtlXSl9KSksVWE9bXIoKGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT0tMSxyPSJmdW5jdGlvbiI9PXR5cGVvZiBlLG89ZnModCk/dnQodC5sZW5ndGgpOltdO3JldHVybiBOaSh0LChmdW5jdGlvbih0KXtvWysraV09cj9wZShlLHQsbik6S2kodCxlLG4pfSkpLG99KSksamE9S3IoKGZ1bmN0aW9uKHQsZSxuKXtpaSh0LG4sZSl9KSk7ZnVuY3Rpb24gR2EodCxlKXtyZXR1cm4oaHModCk/TWU6cnIpKHQsQW8oZSwzKSl9dmFyIFdhPUtyKChmdW5jdGlvbih0LGUsbil7dFtuPzA6MV0ucHVzaChlKX0pLChmdW5jdGlvbigpe3JldHVybltbXSxbXV19KSkscWE9bXIoKGZ1bmN0aW9uKHQsZSl7aWYobnVsbD09dClyZXR1cm5bXTt2YXIgbj1lLmxlbmd0aDtyZXR1cm4gbj4xJiZIbyh0LGVbMF0sZVsxXSk/ZT1bXTpuPjImJkhvKGVbMF0sZVsxXSxlWzJdKSYmKGU9W2VbMF1dKSxjcih0LERpKGUsMSksW10pfSkpLFlhPWtlfHxmdW5jdGlvbigpe3JldHVybiBlZS5EYXRlLm5vdygpfTtmdW5jdGlvbiBYYShlLG4saSl7cmV0dXJuIG49aT90Om4sX28oZSxvLHQsdCx0LHQsbj1lJiZudWxsPT1uP2UubGVuZ3RoOm4pfWZ1bmN0aW9uICRhKG4saSl7dmFyIHI7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGkpdGhyb3cgbmV3IEN0KGUpO3JldHVybiBuPVZzKG4pLGZ1bmN0aW9uKCl7cmV0dXJuLS1uPjAmJihyPWkuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxuPD0xJiYoaT10KSxyfX12YXIgS2E9bXIoKGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT0xO2lmKG4ubGVuZ3RoKXt2YXIgbz10bihuLENvKEthKSk7aXw9cn1yZXR1cm4gX28odCxpLGUsbixvKX0pKSxaYT1tcigoZnVuY3Rpb24odCxlLG4pe3ZhciBpPTM7aWYobi5sZW5ndGgpe3ZhciBvPXRuKG4sQ28oWmEpKTtpfD1yfXJldHVybiBfbyhlLGksdCxuLG8pfSkpO2Z1bmN0aW9uIEphKG4saSxyKXt2YXIgbyxhLHMsbCxjLHUsaD0wLGQ9ITEscD0hMSxmPSEwO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBDdChlKTtmdW5jdGlvbiBtKGUpe3ZhciBpPW8scj1hO3JldHVybiBvPWE9dCxoPWUsbD1uLmFwcGx5KHIsaSl9ZnVuY3Rpb24gZyh0KXtyZXR1cm4gaD10LGM9Wm8oeSxpKSxkP20odCk6bH1mdW5jdGlvbiBfKGUpe3ZhciBuPWUtdTtyZXR1cm4gdT09PXR8fG4+PWl8fG48MHx8cCYmZS1oPj1zfWZ1bmN0aW9uIHkoKXt2YXIgdD1ZYSgpO2lmKF8odCkpcmV0dXJuIHYodCk7Yz1abyh5LChmdW5jdGlvbiBlKHQpe3ZhciBlPWktKHQtdSk7cmV0dXJuIHA/X24oZSxzLSh0LWgpKTplfSkodCkpfWZ1bmN0aW9uIHYoZSl7cmV0dXJuIGM9dCxmJiZvP20oZSk6KG89YT10LGwpfWZ1bmN0aW9uIGIoKXt2YXIgZT1ZYSgpLG49XyhlKTtpZihvPWFyZ3VtZW50cyxhPXRoaXMsdT1lLG4pe2lmKGM9PT10KXJldHVybiBnKHUpO2lmKHApcmV0dXJuIFZyKGMpLGM9Wm8oeSxpKSxtKHUpfXJldHVybiBjPT09dCYmKGM9Wm8oeSxpKSksbH1yZXR1cm4gaT1qcyhpKXx8MCxTcyhyKSYmKGQ9ISFyLmxlYWRpbmcscz0ocD0ibWF4V2FpdCJpbiByKT9nbihqcyhyLm1heFdhaXQpfHwwLGkpOnMsZj0idHJhaWxpbmciaW4gcj8hIXIudHJhaWxpbmc6ZiksYi5jYW5jZWw9ZnVuY3Rpb24geCgpe2MhPT10JiZWcihjKSxoPTAsbz11PWE9Yz10fSxiLmZsdXNoPWZ1bmN0aW9uIHcoKXtyZXR1cm4gYz09PXQ/bDp2KFlhKCkpfSxifXZhciBRYT1tcigoZnVuY3Rpb24odCxlKXtyZXR1cm4gbGkodCwxLGUpfSkpLHRzPW1yKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIGxpKHQsanMoZSl8fDAsbil9KSk7ZnVuY3Rpb24gZXModCxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8bnVsbCE9biYmImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEN0KGUpO3ZhciBpPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLHI9bj9uLmFwcGx5KHRoaXMsZSk6ZVswXSxvPWkuY2FjaGU7aWYoby5oYXMocikpcmV0dXJuIG8uZ2V0KHIpO3ZhciBhPXQuYXBwbHkodGhpcyxlKTtyZXR1cm4gaS5jYWNoZT1vLnNldChyLGEpfHxvLGF9O3JldHVybiBpLmNhY2hlPW5ldyhlcy5DYWNoZXx8V24pLGl9ZnVuY3Rpb24gbnModCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEN0KGUpO3JldHVybiBmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4hdC5jYWxsKHRoaXMpO2Nhc2UgMTpyZXR1cm4hdC5jYWxsKHRoaXMsZVswXSk7Y2FzZSAyOnJldHVybiF0LmNhbGwodGhpcyxlWzBdLGVbMV0pO2Nhc2UgMzpyZXR1cm4hdC5jYWxsKHRoaXMsZVswXSxlWzFdLGVbMl0pfXJldHVybiF0LmFwcGx5KHRoaXMsZSl9fWVzLkNhY2hlPVduO3ZhciBpcz1IcigoZnVuY3Rpb24odCxlKXt2YXIgbj0oZT0xPT1lLmxlbmd0aCYmaHMoZVswXSk/TWUoZVswXSxVZShBbygpKSk6TWUoRGkoZSwxKSxVZShBbygpKSkpLmxlbmd0aDtyZXR1cm4gbXIoKGZ1bmN0aW9uKGkpe2Zvcih2YXIgcj0tMSxvPV9uKGkubGVuZ3RoLG4pOysrcjxvOylpW3JdPWVbcl0uY2FsbCh0aGlzLGlbcl0pO3JldHVybiBwZSh0LHRoaXMsaSl9KSl9KSkscnM9bXIoKGZ1bmN0aW9uKGUsbil7dmFyIGk9dG4obixDbyhycykpO3JldHVybiBfbyhlLHIsdCxuLGkpfSkpLG9zPW1yKChmdW5jdGlvbihlLG4pe3ZhciBpPXRuKG4sQ28ob3MpKTtyZXR1cm4gX28oZSw2NCx0LG4saSl9KSksYXM9d28oKGZ1bmN0aW9uKGUsbil7cmV0dXJuIF9vKGUsMjU2LHQsdCx0LG4pfSkpO2Z1bmN0aW9uIHNzKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfXZhciBscz1obyhxaSksY3M9aG8oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+PWV9KSksdXM9WmkoKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30pKCkpP1ppOmZ1bmN0aW9uKHQpe3JldHVybiBNcyh0KSYmTnQuY2FsbCh0LCJjYWxsZWUiKSYmIW5lLmNhbGwodCwiY2FsbGVlIil9LGhzPXZ0LmlzQXJyYXksZHM9c2U/VWUoc2UpOmZ1bmN0aW9uIHBzKHQpe3JldHVybiBNcyh0KSYmV2kodCk9PUN9O2Z1bmN0aW9uIGZzKHQpe3JldHVybiBudWxsIT10JiZ3cyh0Lmxlbmd0aCkmJiFicyh0KX1mdW5jdGlvbiBtcyh0KXtyZXR1cm4gTXModCkmJmZzKHQpfXZhciBncz1kbnx8amwsX3M9bGU/VWUobGUpOmZ1bmN0aW9uIHlzKHQpe3JldHVybiBNcyh0KSYmV2kodCk9PWZ9O2Z1bmN0aW9uIHZzKHQpe2lmKCFNcyh0KSlyZXR1cm4hMTt2YXIgZT1XaSh0KTtyZXR1cm4gZT09bXx8IltvYmplY3QgRE9NRXhjZXB0aW9uXSI9PWV8fCJzdHJpbmciPT10eXBlb2YgdC5tZXNzYWdlJiYic3RyaW5nIj09dHlwZW9mIHQubmFtZSYmIUFzKHQpfWZ1bmN0aW9uIGJzKHQpe2lmKCFTcyh0KSlyZXR1cm4hMTt2YXIgZT1XaSh0KTtyZXR1cm4gZT09Z3x8ZT09X3x8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBQcm94eV0iPT1lfWZ1bmN0aW9uIHhzKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmdD09VnModCl9ZnVuY3Rpb24gd3ModCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0Pi0xJiZ0JTE9PTAmJnQ8PXN9ZnVuY3Rpb24gU3ModCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9ZnVuY3Rpb24gTXModCl7cmV0dXJuIG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdH12YXIgRXM9Y2U/VWUoY2UpOmZ1bmN0aW9uIFRzKHQpe3JldHVybiBNcyh0KSYmUm8odCk9PXl9O2Z1bmN0aW9uIENzKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdHx8TXModCkmJldpKHQpPT12fWZ1bmN0aW9uIEFzKHQpe2lmKCFNcyh0KXx8V2kodCkhPWIpcmV0dXJuITE7dmFyIGU9UXQodCk7aWYobnVsbD09PWUpcmV0dXJuITA7dmFyIG49TnQuY2FsbChlLCJjb25zdHJ1Y3RvciIpJiZlLmNvbnN0cnVjdG9yO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuJiZuIGluc3RhbmNlb2YgbiYmUHQuY2FsbChuKT09enR9dmFyIGtzPXVlP1VlKHVlKTpmdW5jdGlvbiBMcyh0KXtyZXR1cm4gTXModCkmJldpKHQpPT13fSxQcz1oZT9VZShoZSk6ZnVuY3Rpb24gTnModCl7cmV0dXJuIE1zKHQpJiZSbyh0KT09U307ZnVuY3Rpb24gSXModCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHwhaHModCkmJk1zKHQpJiZXaSh0KT09TX1mdW5jdGlvbiBScyh0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR8fE1zKHQpJiZXaSh0KT09RX12YXIgT3M9ZGU/VWUoZGUpOmZ1bmN0aW9uIHpzKHQpe3JldHVybiBNcyh0KSYmd3ModC5sZW5ndGgpJiYhIVh0W1dpKHQpXX0sRHM9aG8oaXIpLEJzPWhvKChmdW5jdGlvbih0LGUpe3JldHVybiB0PD1lfSkpO2Z1bmN0aW9uIEhzKHQpe2lmKCF0KXJldHVybltdO2lmKGZzKHQpKXJldHVybiBJcyh0KT9vbih0KTpYcih0KTtpZihhZSYmdFthZV0pcmV0dXJuKGZ1bmN0aW9uIGUodCl7Zm9yKHZhciBlLG49W107IShlPXQubmV4dCgpKS5kb25lOyluLnB1c2goZS52YWx1ZSk7cmV0dXJuIG59KSh0W2FlXSgpKTt2YXIgbj1Sbyh0KTtyZXR1cm4obj09eT9KZTpuPT1TP2VuOnBsKSh0KX1mdW5jdGlvbiBGcyh0KXtyZXR1cm4gdD8odD1qcyh0KSk9PT1hfHx0PT09LTEvMD8xNzk3NjkzMTM0ODYyMzE1N2UyOTIqKHQ8MD8tMToxKTp0PT10P3Q6MDowPT09dD90OjB9ZnVuY3Rpb24gVnModCl7dmFyIGU9RnModCksbj1lJTE7cmV0dXJuIGU9PWU/bj9lLW46ZTowfWZ1bmN0aW9uIFVzKHQpe3JldHVybiB0P29pKFZzKHQpLDAsYyk6MH1mdW5jdGlvbiBqcyh0KXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYoUnModCkpcmV0dXJuIGw7aWYoU3ModCkpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2Y/dC52YWx1ZU9mKCk6dDt0PVNzKGUpP2UrIiI6ZX1pZigic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIDA9PT10P3Q6K3Q7dD1WZSh0KTt2YXIgbj11dC50ZXN0KHQpO3JldHVybiBufHxkdC50ZXN0KHQpP0p0KHQuc2xpY2UoMiksbj8yOjgpOmN0LnRlc3QodCk/bDordH1mdW5jdGlvbiBHcyh0KXtyZXR1cm4gJHIodCxvbCh0KSl9ZnVuY3Rpb24gV3ModCl7cmV0dXJuIG51bGw9PXQ/IiI6QXIodCl9dmFyIHFzPVpyKChmdW5jdGlvbih0LGUpe2lmKGpvKGUpfHxmcyhlKSkkcihlLHJsKGUpLHQpO2Vsc2UgZm9yKHZhciBuIGluIGUpTnQuY2FsbChlLG4pJiZRbih0LG4sZVtuXSl9KSksWXM9WnIoKGZ1bmN0aW9uKHQsZSl7JHIoZSxvbChlKSx0KX0pKSxYcz1acigoZnVuY3Rpb24odCxlLG4saSl7JHIoZSxvbChlKSx0LGkpfSkpLCRzPVpyKChmdW5jdGlvbih0LGUsbixpKXskcihlLHJsKGUpLHQsaSl9KSksS3M9d28ocmkpLFpzPW1yKChmdW5jdGlvbihlLG4pe2U9TXQoZSk7dmFyIGk9LTEscj1uLmxlbmd0aCxvPXI+Mj9uWzJdOnQ7Zm9yKG8mJkhvKG5bMF0sblsxXSxvKSYmKHI9MSk7KytpPHI7KWZvcih2YXIgYT1uW2ldLHM9b2woYSksbD0tMSxjPXMubGVuZ3RoOysrbDxjOyl7dmFyIHU9c1tsXSxoPWVbdV07KGg9PT10fHxzcyhoLGt0W3VdKSYmIU50LmNhbGwoZSx1KSkmJihlW3VdPWFbdV0pfXJldHVybiBlfSkpLEpzPW1yKChmdW5jdGlvbihlKXtyZXR1cm4gZS5wdXNoKHQsdm8pLHBlKHNsLHQsZSl9KSk7ZnVuY3Rpb24gUXMoZSxuLGkpe3ZhciByPW51bGw9PWU/dDpqaShlLG4pO3JldHVybiByPT09dD9pOnJ9ZnVuY3Rpb24gdGwodCxlKXtyZXR1cm4gbnVsbCE9dCYmT28odCxlLFhpKX12YXIgZWw9YW8oKGZ1bmN0aW9uKHQsZSxuKXtudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZS50b1N0cmluZyYmKGU9T3QuY2FsbChlKSksdFtlXT1ufSksQ2woTGwpKSxubD1hbygoZnVuY3Rpb24odCxlLG4pe251bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlLnRvU3RyaW5nJiYoZT1PdC5jYWxsKGUpKSxOdC5jYWxsKHQsZSk/dFtlXS5wdXNoKG4pOnRbZV09W25dfSksQW8pLGlsPW1yKEtpKTtmdW5jdGlvbiBybCh0KXtyZXR1cm4gZnModCk/WG4odCk6bnIodCl9ZnVuY3Rpb24gb2wodCl7cmV0dXJuIGZzKHQpP1huKHQsITApOihmdW5jdGlvbiBlKHQpe2lmKCFTcyh0KSlyZXR1cm4oZnVuY3Rpb24gZSh0KXt2YXIgZT1bXTtpZihudWxsIT10KWZvcih2YXIgbiBpbiBNdCh0KSllLnB1c2gobik7cmV0dXJuIGV9KSh0KTt2YXIgbj1qbyh0KSxpPVtdO2Zvcih2YXIgciBpbiB0KSgiY29uc3RydWN0b3IiIT1yfHwhbiYmTnQuY2FsbCh0LHIpKSYmaS5wdXNoKHIpO3JldHVybiBpfSkodCl9dmFyIGFsPVpyKChmdW5jdGlvbih0LGUsbil7c3IodCxlLG4pfSkpLHNsPVpyKChmdW5jdGlvbih0LGUsbixpKXtzcih0LGUsbixpKX0pKSxsbD13bygoZnVuY3Rpb24odCxlKXt2YXIgbj17fTtpZihudWxsPT10KXJldHVybiBuO3ZhciBpPSExO2U9TWUoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGU9QnIoZSx0KSxpfHwoaT1lLmxlbmd0aD4xKSxlfSkpLCRyKHQsTW8odCksbiksaSYmKG49YWkobiw3LGJvKSk7Zm9yKHZhciByPWUubGVuZ3RoO3ItLTspTHIobixlW3JdKTtyZXR1cm4gbn0pKSxjbD13bygoZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD97fTooZnVuY3Rpb24gbih0LGUpe3JldHVybiB1cih0LGUsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIHRsKHQsbil9KSl9KSh0LGUpfSkpO2Z1bmN0aW9uIHVsKHQsZSl7aWYobnVsbD09dClyZXR1cm57fTt2YXIgbj1NZShNbyh0KSwoZnVuY3Rpb24odCl7cmV0dXJuW3RdfSkpO3JldHVybiBlPUFvKGUpLHVyKHQsbiwoZnVuY3Rpb24odCxuKXtyZXR1cm4gZSh0LG5bMF0pfSkpfXZhciBobD1nbyhybCksZGw9Z28ob2wpO2Z1bmN0aW9uIHBsKHQpe3JldHVybiBudWxsPT10P1tdOmplKHQscmwodCkpfXZhciBmbD1lbygoZnVuY3Rpb24odCxlLG4pe3JldHVybiBlPWUudG9Mb3dlckNhc2UoKSx0KyhuP21sKGUpOmUpfSkpO2Z1bmN0aW9uIG1sKHQpe3JldHVybiBTbChXcyh0KS50b0xvd2VyQ2FzZSgpKX1mdW5jdGlvbiBnbCh0KXtyZXR1cm4odD1Xcyh0KSkmJnQucmVwbGFjZShmdCxYZSkucmVwbGFjZShWdCwiIil9dmFyIF9sPWVvKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQrKG4/Ii0iOiIiKStlLnRvTG93ZXJDYXNlKCl9KSkseWw9ZW8oKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdCsobj8iICI6IiIpK2UudG9Mb3dlckNhc2UoKX0pKSx2bD10bygidG9Mb3dlckNhc2UiKSxibD1lbygoZnVuY3Rpb24odCxlLG4pe3JldHVybiB0KyhuPyJfIjoiIikrZS50b0xvd2VyQ2FzZSgpfSkpLHhsPWVvKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQrKG4/IiAiOiIiKStTbChlKX0pKSx3bD1lbygoZnVuY3Rpb24odCxlLG4pe3JldHVybiB0KyhuPyIgIjoiIikrZS50b1VwcGVyQ2FzZSgpfSkpLFNsPXRvKCJ0b1VwcGVyQ2FzZSIpO2Z1bmN0aW9uIE1sKGUsbixpKXtyZXR1cm4gZT1XcyhlKSwobj1pP3Q6bik9PT10PyhmdW5jdGlvbiByKHQpe3JldHVybiBXdC50ZXN0KHQpfSkoZSk/KGZ1bmN0aW9uIG8odCl7cmV0dXJuIHQubWF0Y2goanQpfHxbXX0pKGUpOihmdW5jdGlvbiBhKHQpe3JldHVybiB0Lm1hdGNoKHJ0KXx8W119KShlKTplLm1hdGNoKG4pfHxbXX12YXIgRWw9bXIoKGZ1bmN0aW9uKGUsbil7dHJ5e3JldHVybiBwZShlLHQsbil9Y2F0Y2godCl7cmV0dXJuIHZzKHQpP3Q6bmV3IHh0KHQpfX0pKSxUbD13bygoZnVuY3Rpb24odCxlKXtyZXR1cm4gbWUoZSwoZnVuY3Rpb24oZSl7ZT1yYShlKSxpaSh0LGUsS2EodFtlXSx0KSl9KSksdH0pKTtmdW5jdGlvbiBDbCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19dmFyIEFsPXJvKCksa2w9cm8oITApO2Z1bmN0aW9uIExsKHQpe3JldHVybiB0fWZ1bmN0aW9uIFBsKHQpe3JldHVybiBlcigiZnVuY3Rpb24iPT10eXBlb2YgdD90OmFpKHQsMSkpfXZhciBObD1tcigoZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIEtpKG4sdCxlKX19KSksSWw9bXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBLaSh0LG4sZSl9fSkpO2Z1bmN0aW9uIFJsKHQsZSxuKXt2YXIgaT1ybChlKSxyPVVpKGUsaSk7bnVsbCE9bnx8U3MoZSkmJihyLmxlbmd0aHx8IWkubGVuZ3RoKXx8KG49ZSxlPXQsdD10aGlzLHI9VWkoZSxybChlKSkpO3ZhciBvPSEoU3MobikmJiJjaGFpbiJpbiBuJiYhbi5jaGFpbiksYT1icyh0KTtyZXR1cm4gbWUociwoZnVuY3Rpb24obil7dmFyIGk9ZVtuXTt0W25dPWksYSYmKHQucHJvdG90eXBlW25dPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fX2NoYWluX187aWYob3x8ZSl7dmFyIG49dCh0aGlzLl9fd3JhcHBlZF9fKSxyPW4uX19hY3Rpb25zX189WHIodGhpcy5fX2FjdGlvbnNfXyk7cmV0dXJuIHIucHVzaCh7ZnVuYzppLGFyZ3M6YXJndW1lbnRzLHRoaXNBcmc6dH0pLG4uX19jaGFpbl9fPWUsbn1yZXR1cm4gaS5hcHBseSh0LEVlKFt0aGlzLnZhbHVlKCldLGFyZ3VtZW50cykpfSl9KSksdH1mdW5jdGlvbiBPbCgpe312YXIgemw9bG8oTWUpLERsPWxvKF9lKSxCbD1sbyhBZSk7ZnVuY3Rpb24gSGwodCl7cmV0dXJuIEZvKHQpP3plKHJhKHQpKTooZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGppKGUsdCl9fSkodCl9dmFyIEZsPXVvKCksVmw9dW8oITApO2Z1bmN0aW9uIFVsKCl7cmV0dXJuW119ZnVuY3Rpb24gamwoKXtyZXR1cm4hMX12YXIgR2wsV2w9c28oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZX0pLDApLHFsPWZvKCJjZWlsIiksWWw9c28oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQvZX0pLDEpLFhsPWZvKCJmbG9vciIpLCRsPXNvKChmdW5jdGlvbih0LGUpe3JldHVybiB0KmV9KSwxKSxLbD1mbygicm91bmQiKSxabD1zbygoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC1lfSksMCk7cmV0dXJuIEJuLmFmdGVyPWZ1bmN0aW9uIEpsKHQsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEN0KGUpO3JldHVybiB0PVZzKHQpLGZ1bmN0aW9uKCl7aWYoLS10PDEpcmV0dXJuIG4uYXBwbHkodGhpcyxhcmd1bWVudHMpfX0sQm4uYXJ5PVhhLEJuLmFzc2lnbj1xcyxCbi5hc3NpZ25Jbj1ZcyxCbi5hc3NpZ25JbldpdGg9WHMsQm4uYXNzaWduV2l0aD0kcyxCbi5hdD1LcyxCbi5iZWZvcmU9JGEsQm4uYmluZD1LYSxCbi5iaW5kQWxsPVRsLEJuLmJpbmRLZXk9WmEsQm4uY2FzdEFycmF5PWZ1bmN0aW9uIFFsKCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW107dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBocyh0KT90Olt0XX0sQm4uY2hhaW49SWEsQm4uY2h1bms9ZnVuY3Rpb24gdGMoZSxuLGkpe249KGk/SG8oZSxuLGkpOm49PT10KT8xOmduKFZzKG4pLDApO3ZhciByPW51bGw9PWU/MDplLmxlbmd0aDtpZighcnx8bjwxKXJldHVybltdO2Zvcih2YXIgbz0wLGE9MCxzPXZ0KGNuKHIvbikpO288cjspc1thKytdPXdyKGUsbyxvKz1uKTtyZXR1cm4gc30sQm4uY29tcGFjdD1mdW5jdGlvbiBlYyh0KXtmb3IodmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGgsaT0wLHI9W107KytlPG47KXt2YXIgbz10W2VdO28mJihyW2krK109byl9cmV0dXJuIHJ9LEJuLmNvbmNhdD1mdW5jdGlvbiBuYygpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg7aWYoIXQpcmV0dXJuW107Zm9yKHZhciBlPXZ0KHQtMSksbj1hcmd1bWVudHNbMF0saT10O2ktLTspZVtpLTFdPWFyZ3VtZW50c1tpXTtyZXR1cm4gRWUoaHMobik/WHIobik6W25dLERpKGUsMSkpfSxCbi5jb25kPWZ1bmN0aW9uIGljKHQpe3ZhciBuPW51bGw9PXQ/MDp0Lmxlbmd0aCxpPUFvKCk7cmV0dXJuIHQ9bj9NZSh0LChmdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdFsxXSl0aHJvdyBuZXcgQ3QoZSk7cmV0dXJuW2kodFswXSksdFsxXV19KSk6W10sbXIoKGZ1bmN0aW9uKGUpe2Zvcih2YXIgaT0tMTsrK2k8bjspe3ZhciByPXRbaV07aWYocGUoclswXSx0aGlzLGUpKXJldHVybiBwZShyWzFdLHRoaXMsZSl9fSkpfSxCbi5jb25mb3Jtcz1mdW5jdGlvbiByYyh0KXtyZXR1cm4oZnVuY3Rpb24gZSh0KXt2YXIgZT1ybCh0KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHNpKG4sdCxlKX19KShhaSh0LDEpKX0sQm4uY29uc3RhbnQ9Q2wsQm4uY291bnRCeT16YSxCbi5jcmVhdGU9ZnVuY3Rpb24gb2ModCxlKXt2YXIgbj1Ibih0KTtyZXR1cm4gbnVsbD09ZT9uOm5pKG4sZSl9LEJuLmN1cnJ5PWZ1bmN0aW9uIGUobixpLHIpe3ZhciBvPV9vKG4sOCx0LHQsdCx0LHQsaT1yP3Q6aSk7cmV0dXJuIG8ucGxhY2Vob2xkZXI9ZS5wbGFjZWhvbGRlcixvfSxCbi5jdXJyeVJpZ2h0PWZ1bmN0aW9uIGUobixpLHIpe3ZhciBvPV9vKG4sMTYsdCx0LHQsdCx0LGk9cj90OmkpO3JldHVybiBvLnBsYWNlaG9sZGVyPWUucGxhY2Vob2xkZXIsb30sQm4uZGVib3VuY2U9SmEsQm4uZGVmYXVsdHM9WnMsQm4uZGVmYXVsdHNEZWVwPUpzLEJuLmRlZmVyPVFhLEJuLmRlbGF5PXRzLEJuLmRpZmZlcmVuY2U9c2EsQm4uZGlmZmVyZW5jZUJ5PWxhLEJuLmRpZmZlcmVuY2VXaXRoPWNhLEJuLmRyb3A9ZnVuY3Rpb24gYWMoZSxuLGkpe3ZhciByPW51bGw9PWU/MDplLmxlbmd0aDtyZXR1cm4gcj93cihlLChuPWl8fG49PT10PzE6VnMobikpPDA/MDpuLHIpOltdfSxCbi5kcm9wUmlnaHQ9ZnVuY3Rpb24gc2MoZSxuLGkpe3ZhciByPW51bGw9PWU/MDplLmxlbmd0aDtyZXR1cm4gcj93cihlLDAsKG49ci0obj1pfHxuPT09dD8xOlZzKG4pKSk8MD8wOm4pOltdfSxCbi5kcm9wUmlnaHRXaGlsZT1mdW5jdGlvbiBsYyh0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9Ocih0LEFvKGUsMyksITAsITApOltdfSxCbi5kcm9wV2hpbGU9ZnVuY3Rpb24gY2ModCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/TnIodCxBbyhlLDMpLCEwKTpbXX0sQm4uZmlsbD1mdW5jdGlvbiB1YyhlLG4saSxyKXt2YXIgbz1udWxsPT1lPzA6ZS5sZW5ndGg7cmV0dXJuIG8/KGkmJiJudW1iZXIiIT10eXBlb2YgaSYmSG8oZSxuLGkpJiYoaT0wLHI9byksKGZ1bmN0aW9uIGEoZSxuLGkscil7dmFyIG89ZS5sZW5ndGg7Zm9yKChpPVZzKGkpKTwwJiYoaT0taT5vPzA6bytpKSwocj1yPT09dHx8cj5vP286VnMocikpPDAmJihyKz1vKSxyPWk+cj8wOlVzKHIpO2k8cjspZVtpKytdPW47cmV0dXJuIGV9KShlLG4saSxyKSk6W119LEJuLmZpbHRlcj1mdW5jdGlvbiBoYyh0LGUpe3JldHVybihocyh0KT95ZTp6aSkodCxBbyhlLDMpKX0sQm4uZmxhdE1hcD1mdW5jdGlvbiBkYyh0LGUpe3JldHVybiBEaShHYSh0LGUpLDEpfSxCbi5mbGF0TWFwRGVlcD1mdW5jdGlvbiBwYyh0LGUpe3JldHVybiBEaShHYSh0LGUpLGEpfSxCbi5mbGF0TWFwRGVwdGg9ZnVuY3Rpb24gZmMoZSxuLGkpe3JldHVybiBpPWk9PT10PzE6VnMoaSksRGkoR2EoZSxuKSxpKX0sQm4uZmxhdHRlbj1kYSxCbi5mbGF0dGVuRGVlcD1mdW5jdGlvbiBtYyh0KXtyZXR1cm4gbnVsbCE9dCYmdC5sZW5ndGg/RGkodCxhKTpbXX0sQm4uZmxhdHRlbkRlcHRoPWZ1bmN0aW9uIGdjKGUsbil7cmV0dXJuIG51bGwhPWUmJmUubGVuZ3RoP0RpKGUsbj1uPT09dD8xOlZzKG4pKTpbXX0sQm4uZmxpcD1mdW5jdGlvbiBfYyh0KXtyZXR1cm4gX28odCw1MTIpfSxCbi5mbG93PUFsLEJuLmZsb3dSaWdodD1rbCxCbi5mcm9tUGFpcnM9ZnVuY3Rpb24geWModCl7Zm9yKHZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoLGk9e307KytlPG47KXt2YXIgcj10W2VdO2lbclswXV09clsxXX1yZXR1cm4gaX0sQm4uZnVuY3Rpb25zPWZ1bmN0aW9uIHZjKHQpe3JldHVybiBudWxsPT10P1tdOlVpKHQscmwodCkpfSxCbi5mdW5jdGlvbnNJbj1mdW5jdGlvbiBiYyh0KXtyZXR1cm4gbnVsbD09dD9bXTpVaSh0LG9sKHQpKX0sQm4uZ3JvdXBCeT1WYSxCbi5pbml0aWFsPWZ1bmN0aW9uIHhjKHQpe3JldHVybiBudWxsIT10JiZ0Lmxlbmd0aD93cih0LDAsLTEpOltdfSxCbi5pbnRlcnNlY3Rpb249ZmEsQm4uaW50ZXJzZWN0aW9uQnk9bWEsQm4uaW50ZXJzZWN0aW9uV2l0aD1nYSxCbi5pbnZlcnQ9ZWwsQm4uaW52ZXJ0Qnk9bmwsQm4uaW52b2tlTWFwPVVhLEJuLml0ZXJhdGVlPVBsLEJuLmtleUJ5PWphLEJuLmtleXM9cmwsQm4ua2V5c0luPW9sLEJuLm1hcD1HYSxCbi5tYXBLZXlzPWZ1bmN0aW9uIHdjKHQsZSl7dmFyIG49e307cmV0dXJuIGU9QW8oZSwzKSxGaSh0LChmdW5jdGlvbih0LGkscil7aWkobixlKHQsaSxyKSx0KX0pKSxufSxCbi5tYXBWYWx1ZXM9ZnVuY3Rpb24gU2ModCxlKXt2YXIgbj17fTtyZXR1cm4gZT1BbyhlLDMpLEZpKHQsKGZ1bmN0aW9uKHQsaSxyKXtpaShuLGksZSh0LGkscikpfSkpLG59LEJuLm1hdGNoZXM9ZnVuY3Rpb24gTWModCl7cmV0dXJuIG9yKGFpKHQsMSkpfSxCbi5tYXRjaGVzUHJvcGVydHk9ZnVuY3Rpb24gRWModCxlKXtyZXR1cm4gYXIodCxhaShlLDEpKX0sQm4ubWVtb2l6ZT1lcyxCbi5tZXJnZT1hbCxCbi5tZXJnZVdpdGg9c2wsQm4ubWV0aG9kPU5sLEJuLm1ldGhvZE9mPUlsLEJuLm1peGluPVJsLEJuLm5lZ2F0ZT1ucyxCbi5udGhBcmc9ZnVuY3Rpb24gVGModCl7cmV0dXJuIHQ9VnModCksbXIoKGZ1bmN0aW9uKGUpe3JldHVybiBscihlLHQpfSkpfSxCbi5vbWl0PWxsLEJuLm9taXRCeT1mdW5jdGlvbiBDYyh0LGUpe3JldHVybiB1bCh0LG5zKEFvKGUpKSl9LEJuLm9uY2U9ZnVuY3Rpb24gQWModCl7cmV0dXJuICRhKDIsdCl9LEJuLm9yZGVyQnk9ZnVuY3Rpb24ga2MoZSxuLGkscil7cmV0dXJuIG51bGw9PWU/W106KGhzKG4pfHwobj1udWxsPT1uP1tdOltuXSksaHMoaT1yP3Q6aSl8fChpPW51bGw9PWk/W106W2ldKSxjcihlLG4saSkpfSxCbi5vdmVyPXpsLEJuLm92ZXJBcmdzPWlzLEJuLm92ZXJFdmVyeT1EbCxCbi5vdmVyU29tZT1CbCxCbi5wYXJ0aWFsPXJzLEJuLnBhcnRpYWxSaWdodD1vcyxCbi5wYXJ0aXRpb249V2EsQm4ucGljaz1jbCxCbi5waWNrQnk9dWwsQm4ucHJvcGVydHk9SGwsQm4ucHJvcGVydHlPZj1mdW5jdGlvbiBMYyhlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG51bGw9PWU/dDpqaShlLG4pfX0sQm4ucHVsbD15YSxCbi5wdWxsQWxsPXZhLEJuLnB1bGxBbGxCeT1mdW5jdGlvbiBQYyh0LGUsbil7cmV0dXJuIHQmJnQubGVuZ3RoJiZlJiZlLmxlbmd0aD9ocih0LGUsQW8obiwyKSk6dH0sQm4ucHVsbEFsbFdpdGg9ZnVuY3Rpb24gTmMoZSxuLGkpe3JldHVybiBlJiZlLmxlbmd0aCYmbiYmbi5sZW5ndGg/aHIoZSxuLHQsaSk6ZX0sQm4ucHVsbEF0PWJhLEJuLnJhbmdlPUZsLEJuLnJhbmdlUmlnaHQ9VmwsQm4ucmVhcmc9YXMsQm4ucmVqZWN0PWZ1bmN0aW9uIEljKHQsZSl7cmV0dXJuKGhzKHQpP3llOnppKSh0LG5zKEFvKGUsMykpKX0sQm4ucmVtb3ZlPWZ1bmN0aW9uIFJjKHQsZSl7dmFyIG49W107aWYoIXR8fCF0Lmxlbmd0aClyZXR1cm4gbjt2YXIgaT0tMSxyPVtdLG89dC5sZW5ndGg7Zm9yKGU9QW8oZSwzKTsrK2k8bzspe3ZhciBhPXRbaV07ZShhLGksdCkmJihuLnB1c2goYSksci5wdXNoKGkpKX1yZXR1cm4gZHIodCxyKSxufSxCbi5yZXN0PWZ1bmN0aW9uIE9jKG4saSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEN0KGUpO3JldHVybiBtcihuLGk9aT09PXQ/aTpWcyhpKSl9LEJuLnJldmVyc2U9eGEsQm4uc2FtcGxlU2l6ZT1mdW5jdGlvbiB6YyhlLG4saSl7cmV0dXJuIG49KGk/SG8oZSxuLGkpOm49PT10KT8xOlZzKG4pLChocyhlKT9LbjpfcikoZSxuKX0sQm4uc2V0PWZ1bmN0aW9uIERjKHQsZSxuKXtyZXR1cm4gbnVsbD09dD90OnlyKHQsZSxuKX0sQm4uc2V0V2l0aD1mdW5jdGlvbiBCYyhlLG4saSxyKXtyZXR1cm4gcj0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yOnQsbnVsbD09ZT9lOnlyKGUsbixpLHIpfSxCbi5zaHVmZmxlPWZ1bmN0aW9uIEhjKHQpe3JldHVybihocyh0KT9abjp4cikodCl9LEJuLnNsaWNlPWZ1bmN0aW9uIEZjKGUsbixpKXt2YXIgcj1udWxsPT1lPzA6ZS5sZW5ndGg7cmV0dXJuIHI/KGkmJiJudW1iZXIiIT10eXBlb2YgaSYmSG8oZSxuLGkpPyhuPTAsaT1yKToobj1udWxsPT1uPzA6VnMobiksaT1pPT09dD9yOlZzKGkpKSx3cihlLG4saSkpOltdfSxCbi5zb3J0Qnk9cWEsQm4uc29ydGVkVW5pcT1mdW5jdGlvbiBWYyh0KXtyZXR1cm4gdCYmdC5sZW5ndGg/VHIodCk6W119LEJuLnNvcnRlZFVuaXFCeT1mdW5jdGlvbiBVYyh0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9Ucih0LEFvKGUsMikpOltdfSxCbi5zcGxpdD1mdW5jdGlvbiBqYyhlLG4saSl7cmV0dXJuIGkmJiJudW1iZXIiIT10eXBlb2YgaSYmSG8oZSxuLGkpJiYobj1pPXQpLChpPWk9PT10P2M6aT4+PjApPyhlPVdzKGUpKSYmKCJzdHJpbmciPT10eXBlb2Ygbnx8bnVsbCE9biYmIWtzKG4pKSYmIShuPUFyKG4pKSYmWmUoZSk/RnIob24oZSksMCxpKTplLnNwbGl0KG4saSk6W119LEJuLnNwcmVhZD1mdW5jdGlvbiBHYyh0LG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBDdChlKTtyZXR1cm4gbj1udWxsPT1uPzA6Z24oVnMobiksMCksbXIoKGZ1bmN0aW9uKGUpe3ZhciBpPWVbbl0scj1GcihlLDAsbik7cmV0dXJuIGkmJkVlKHIsaSkscGUodCx0aGlzLHIpfSkpfSxCbi50YWlsPWZ1bmN0aW9uIFdjKHQpe3ZhciBlPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gZT93cih0LDEsZSk6W119LEJuLnRha2U9ZnVuY3Rpb24gcWMoZSxuLGkpe3JldHVybiBlJiZlLmxlbmd0aD93cihlLDAsKG49aXx8bj09PXQ/MTpWcyhuKSk8MD8wOm4pOltdfSxCbi50YWtlUmlnaHQ9ZnVuY3Rpb24gWWMoZSxuLGkpe3ZhciByPW51bGw9PWU/MDplLmxlbmd0aDtyZXR1cm4gcj93cihlLChuPXItKG49aXx8bj09PXQ/MTpWcyhuKSkpPDA/MDpuLHIpOltdfSxCbi50YWtlUmlnaHRXaGlsZT1mdW5jdGlvbiBYYyh0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9Ocih0LEFvKGUsMyksITEsITApOltdfSxCbi50YWtlV2hpbGU9ZnVuY3Rpb24gJGModCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/TnIodCxBbyhlLDMpKTpbXX0sQm4udGFwPWZ1bmN0aW9uIEtjKHQsZSl7cmV0dXJuIGUodCksdH0sQm4udGhyb3R0bGU9ZnVuY3Rpb24gWmModCxuLGkpe3ZhciByPSEwLG89ITA7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEN0KGUpO3JldHVybiBTcyhpKSYmKHI9ImxlYWRpbmciaW4gaT8hIWkubGVhZGluZzpyLG89InRyYWlsaW5nImluIGk/ISFpLnRyYWlsaW5nOm8pLEphKHQsbix7bGVhZGluZzpyLG1heFdhaXQ6bix0cmFpbGluZzpvfSl9LEJuLnRocnU9UmEsQm4udG9BcnJheT1IcyxCbi50b1BhaXJzPWhsLEJuLnRvUGFpcnNJbj1kbCxCbi50b1BhdGg9ZnVuY3Rpb24gSmModCl7cmV0dXJuIGhzKHQpP01lKHQscmEpOlJzKHQpP1t0XTpYcihuYShXcyh0KSkpfSxCbi50b1BsYWluT2JqZWN0PUdzLEJuLnRyYW5zZm9ybT1mdW5jdGlvbiBRYyh0LGUsbil7dmFyIGk9aHModCkscj1pfHxncyh0KXx8T3ModCk7aWYoZT1BbyhlLDQpLG51bGw9PW4pe3ZhciBvPXQmJnQuY29uc3RydWN0b3I7bj1yP2k/bmV3IG86W106U3ModCkmJmJzKG8pP0huKFF0KHQpKTp7fX1yZXR1cm4ocj9tZTpGaSkodCwoZnVuY3Rpb24odCxpLHIpe3JldHVybiBlKG4sdCxpLHIpfSkpLG59LEJuLnVuYXJ5PWZ1bmN0aW9uIHR1KHQpe3JldHVybiBYYSh0LDEpfSxCbi51bmlvbj13YSxCbi51bmlvbkJ5PVNhLEJuLnVuaW9uV2l0aD1NYSxCbi51bmlxPWZ1bmN0aW9uIGV1KHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9rcih0KTpbXX0sQm4udW5pcUJ5PWZ1bmN0aW9uIG51KHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP2tyKHQsQW8oZSwyKSk6W119LEJuLnVuaXFXaXRoPWZ1bmN0aW9uIGl1KGUsbil7cmV0dXJuIG49ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp0LGUmJmUubGVuZ3RoP2tyKGUsdCxuKTpbXX0sQm4udW5zZXQ9ZnVuY3Rpb24gcnUodCxlKXtyZXR1cm4gbnVsbD09dHx8THIodCxlKX0sQm4udW56aXA9RWEsQm4udW56aXBXaXRoPVRhLEJuLnVwZGF0ZT1mdW5jdGlvbiBvdSh0LGUsbil7cmV0dXJuIG51bGw9PXQ/dDpQcih0LGUsRHIobikpfSxCbi51cGRhdGVXaXRoPWZ1bmN0aW9uIGF1KGUsbixpLHIpe3JldHVybiByPSJmdW5jdGlvbiI9PXR5cGVvZiByP3I6dCxudWxsPT1lP2U6UHIoZSxuLERyKGkpLHIpfSxCbi52YWx1ZXM9cGwsQm4udmFsdWVzSW49ZnVuY3Rpb24gc3UodCl7cmV0dXJuIG51bGw9PXQ/W106amUodCxvbCh0KSl9LEJuLndpdGhvdXQ9Q2EsQm4ud29yZHM9TWwsQm4ud3JhcD1mdW5jdGlvbiBsdSh0LGUpe3JldHVybiBycyhEcihlKSx0KX0sQm4ueG9yPUFhLEJuLnhvckJ5PWthLEJuLnhvcldpdGg9TGEsQm4uemlwPVBhLEJuLnppcE9iamVjdD1mdW5jdGlvbiBjdSh0LGUpe3JldHVybiBPcih0fHxbXSxlfHxbXSxRbil9LEJuLnppcE9iamVjdERlZXA9ZnVuY3Rpb24gdXUodCxlKXtyZXR1cm4gT3IodHx8W10sZXx8W10seXIpfSxCbi56aXBXaXRoPU5hLEJuLmVudHJpZXM9aGwsQm4uZW50cmllc0luPWRsLEJuLmV4dGVuZD1ZcyxCbi5leHRlbmRXaXRoPVhzLFJsKEJuLEJuKSxCbi5hZGQ9V2wsQm4uYXR0ZW1wdD1FbCxCbi5jYW1lbENhc2U9ZmwsQm4uY2FwaXRhbGl6ZT1tbCxCbi5jZWlsPXFsLEJuLmNsYW1wPWZ1bmN0aW9uIGh1KGUsbixpKXtyZXR1cm4gaT09PXQmJihpPW4sbj10KSxpIT09dCYmKGk9KGk9anMoaSkpPT1pP2k6MCksbiE9PXQmJihuPShuPWpzKG4pKT09bj9uOjApLG9pKGpzKGUpLG4saSl9LEJuLmNsb25lPWZ1bmN0aW9uIGR1KHQpe3JldHVybiBhaSh0LDQpfSxCbi5jbG9uZURlZXA9ZnVuY3Rpb24gcHUodCl7cmV0dXJuIGFpKHQsNSl9LEJuLmNsb25lRGVlcFdpdGg9ZnVuY3Rpb24gZnUoZSxuKXtyZXR1cm4gYWkoZSw1LG49ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp0KX0sQm4uY2xvbmVXaXRoPWZ1bmN0aW9uIG11KGUsbil7cmV0dXJuIGFpKGUsNCxuPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246dCl9LEJuLmNvbmZvcm1zVG89ZnVuY3Rpb24gZ3UodCxlKXtyZXR1cm4gbnVsbD09ZXx8c2kodCxlLHJsKGUpKX0sQm4uZGVidXJyPWdsLEJuLmRlZmF1bHRUbz1mdW5jdGlvbiBfdSh0LGUpe3JldHVybiBudWxsPT10fHx0IT10P2U6dH0sQm4uZGl2aWRlPVlsLEJuLmVuZHNXaXRoPWZ1bmN0aW9uIHl1KGUsbixpKXtlPVdzKGUpLG49QXIobik7dmFyIHI9ZS5sZW5ndGgsbz1pPWk9PT10P3I6b2koVnMoaSksMCxyKTtyZXR1cm4oaS09bi5sZW5ndGgpPj0wJiZlLnNsaWNlKGksbyk9PW59LEJuLmVxPXNzLEJuLmVzY2FwZT1mdW5jdGlvbiB2dSh0KXtyZXR1cm4odD1Xcyh0KSkmJkcudGVzdCh0KT90LnJlcGxhY2UoVSwkZSk6dH0sQm4uZXNjYXBlUmVnRXhwPWZ1bmN0aW9uIGJ1KHQpe3JldHVybih0PVdzKHQpKSYmSi50ZXN0KHQpP3QucmVwbGFjZShaLCJcXCQmIik6dH0sQm4uZXZlcnk9ZnVuY3Rpb24geHUoZSxuLGkpe3ZhciByPWhzKGUpP19lOlJpO3JldHVybiBpJiZIbyhlLG4saSkmJihuPXQpLHIoZSxBbyhuLDMpKX0sQm4uZmluZD1EYSxCbi5maW5kSW5kZXg9dWEsQm4uZmluZEtleT1mdW5jdGlvbiB3dSh0LGUpe3JldHVybiBMZSh0LEFvKGUsMyksRmkpfSxCbi5maW5kTGFzdD1CYSxCbi5maW5kTGFzdEluZGV4PWhhLEJuLmZpbmRMYXN0S2V5PWZ1bmN0aW9uIFN1KHQsZSl7cmV0dXJuIExlKHQsQW8oZSwzKSxWaSl9LEJuLmZsb29yPVhsLEJuLmZvckVhY2g9SGEsQm4uZm9yRWFjaFJpZ2h0PUZhLEJuLmZvckluPWZ1bmN0aW9uIE11KHQsZSl7cmV0dXJuIG51bGw9PXQ/dDpCaSh0LEFvKGUsMyksb2wpfSxCbi5mb3JJblJpZ2h0PWZ1bmN0aW9uIEV1KHQsZSl7cmV0dXJuIG51bGw9PXQ/dDpIaSh0LEFvKGUsMyksb2wpfSxCbi5mb3JPd249ZnVuY3Rpb24gVHUodCxlKXtyZXR1cm4gdCYmRmkodCxBbyhlLDMpKX0sQm4uZm9yT3duUmlnaHQ9ZnVuY3Rpb24gQ3UodCxlKXtyZXR1cm4gdCYmVmkodCxBbyhlLDMpKX0sQm4uZ2V0PVFzLEJuLmd0PWxzLEJuLmd0ZT1jcyxCbi5oYXM9ZnVuY3Rpb24gQXUodCxlKXtyZXR1cm4gbnVsbCE9dCYmT28odCxlLFlpKX0sQm4uaGFzSW49dGwsQm4uaGVhZD1wYSxCbi5pZGVudGl0eT1MbCxCbi5pbmNsdWRlcz1mdW5jdGlvbiBrdSh0LGUsbixpKXt0PWZzKHQpP3Q6cGwodCksbj1uJiYhaT9WcyhuKTowO3ZhciByPXQubGVuZ3RoO3JldHVybiBuPDAmJihuPWduKHIrbiwwKSksSXModCk/bjw9ciYmdC5pbmRleE9mKGUsbik+LTE6ISFyJiZOZSh0LGUsbik+LTF9LEJuLmluZGV4T2Y9ZnVuY3Rpb24gTHUodCxlLG4pe3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZighaSlyZXR1cm4tMTt2YXIgcj1udWxsPT1uPzA6VnMobik7cmV0dXJuIHI8MCYmKHI9Z24oaStyLDApKSxOZSh0LGUscil9LEJuLmluUmFuZ2U9ZnVuY3Rpb24gUHUoZSxuLGkpe3JldHVybiBuPUZzKG4pLGk9PT10PyhpPW4sbj0wKTppPUZzKGkpLChmdW5jdGlvbiByKHQsZSxuKXtyZXR1cm4gdD49X24oZSxuKSYmdDxnbihlLG4pfSkoZT1qcyhlKSxuLGkpfSxCbi5pbnZva2U9aWwsQm4uaXNBcmd1bWVudHM9dXMsQm4uaXNBcnJheT1ocyxCbi5pc0FycmF5QnVmZmVyPWRzLEJuLmlzQXJyYXlMaWtlPWZzLEJuLmlzQXJyYXlMaWtlT2JqZWN0PW1zLEJuLmlzQm9vbGVhbj1mdW5jdGlvbiBOdSh0KXtyZXR1cm4hMD09PXR8fCExPT09dHx8TXModCkmJldpKHQpPT1wfSxCbi5pc0J1ZmZlcj1ncyxCbi5pc0RhdGU9X3MsQm4uaXNFbGVtZW50PWZ1bmN0aW9uIEl1KHQpe3JldHVybiBNcyh0KSYmMT09PXQubm9kZVR5cGUmJiFBcyh0KX0sQm4uaXNFbXB0eT1mdW5jdGlvbiBSdSh0KXtpZihudWxsPT10KXJldHVybiEwO2lmKGZzKHQpJiYoaHModCl8fCJzdHJpbmciPT10eXBlb2YgdHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQuc3BsaWNlfHxncyh0KXx8T3ModCl8fHVzKHQpKSlyZXR1cm4hdC5sZW5ndGg7dmFyIGU9Um8odCk7aWYoZT09eXx8ZT09UylyZXR1cm4hdC5zaXplO2lmKGpvKHQpKXJldHVybiFucih0KS5sZW5ndGg7Zm9yKHZhciBuIGluIHQpaWYoTnQuY2FsbCh0LG4pKXJldHVybiExO3JldHVybiEwfSxCbi5pc0VxdWFsPWZ1bmN0aW9uIE91KHQsZSl7cmV0dXJuIEppKHQsZSl9LEJuLmlzRXF1YWxXaXRoPWZ1bmN0aW9uIHp1KGUsbixpKXt2YXIgcj0oaT0iZnVuY3Rpb24iPT10eXBlb2YgaT9pOnQpP2koZSxuKTp0O3JldHVybiByPT09dD9KaShlLG4sdCxpKTohIXJ9LEJuLmlzRXJyb3I9dnMsQm4uaXNGaW5pdGU9ZnVuY3Rpb24gRHUodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZwbih0KX0sQm4uaXNGdW5jdGlvbj1icyxCbi5pc0ludGVnZXI9eHMsQm4uaXNMZW5ndGg9d3MsQm4uaXNNYXA9RXMsQm4uaXNNYXRjaD1mdW5jdGlvbiBCdSh0LGUpe3JldHVybiB0PT09ZXx8UWkodCxlLExvKGUpKX0sQm4uaXNNYXRjaFdpdGg9ZnVuY3Rpb24gSHUoZSxuLGkpe3JldHVybiBpPSJmdW5jdGlvbiI9PXR5cGVvZiBpP2k6dCxRaShlLG4sTG8obiksaSl9LEJuLmlzTmFOPWZ1bmN0aW9uIEZ1KHQpe3JldHVybiBDcyh0KSYmdCE9K3R9LEJuLmlzTmF0aXZlPWZ1bmN0aW9uIFZ1KHQpe2lmKFVvKHQpKXRocm93IG5ldyB4dCgiVW5zdXBwb3J0ZWQgY29yZS1qcyB1c2UuIFRyeSBodHRwczovL25wbXMuaW8vc2VhcmNoP3E9cG9ueWZpbGwuIik7cmV0dXJuIHRyKHQpfSxCbi5pc05pbD1mdW5jdGlvbiBVdSh0KXtyZXR1cm4gbnVsbD09dH0sQm4uaXNOdWxsPWZ1bmN0aW9uIGp1KHQpe3JldHVybiBudWxsPT09dH0sQm4uaXNOdW1iZXI9Q3MsQm4uaXNPYmplY3Q9U3MsQm4uaXNPYmplY3RMaWtlPU1zLEJuLmlzUGxhaW5PYmplY3Q9QXMsQm4uaXNSZWdFeHA9a3MsQm4uaXNTYWZlSW50ZWdlcj1mdW5jdGlvbiBHdSh0KXtyZXR1cm4geHModCkmJnQ+PS05MDA3MTk5MjU0NzQwOTkxJiZ0PD1zfSxCbi5pc1NldD1QcyxCbi5pc1N0cmluZz1JcyxCbi5pc1N5bWJvbD1ScyxCbi5pc1R5cGVkQXJyYXk9T3MsQm4uaXNVbmRlZmluZWQ9ZnVuY3Rpb24gV3UoZSl7cmV0dXJuIGU9PT10fSxCbi5pc1dlYWtNYXA9ZnVuY3Rpb24gcXUodCl7cmV0dXJuIE1zKHQpJiZSbyh0KT09VH0sQm4uaXNXZWFrU2V0PWZ1bmN0aW9uIFl1KHQpe3JldHVybiBNcyh0KSYmIltvYmplY3QgV2Vha1NldF0iPT1XaSh0KX0sQm4uam9pbj1mdW5jdGlvbiBYdSh0LGUpe3JldHVybiBudWxsPT10PyIiOmZuLmNhbGwodCxlKX0sQm4ua2ViYWJDYXNlPV9sLEJuLmxhc3Q9X2EsQm4ubGFzdEluZGV4T2Y9ZnVuY3Rpb24gJHUoZSxuLGkpe3ZhciByPW51bGw9PWU/MDplLmxlbmd0aDtpZighcilyZXR1cm4tMTt2YXIgbz1yO3JldHVybiBpIT09dCYmKG89KG89VnMoaSkpPDA/Z24ocitvLDApOl9uKG8sci0xKSksbj09bj8oZnVuY3Rpb24gYSh0LGUsbil7Zm9yKHZhciBpPW4rMTtpLS07KWlmKHRbaV09PT1lKXJldHVybiBpO3JldHVybiBpfSkoZSxuLG8pOlBlKGUsUmUsbywhMCl9LEJuLmxvd2VyQ2FzZT15bCxCbi5sb3dlckZpcnN0PXZsLEJuLmx0PURzLEJuLmx0ZT1CcyxCbi5tYXg9ZnVuY3Rpb24gS3UoZSl7cmV0dXJuIGUmJmUubGVuZ3RoP09pKGUsTGwscWkpOnR9LEJuLm1heEJ5PWZ1bmN0aW9uIFp1KGUsbil7cmV0dXJuIGUmJmUubGVuZ3RoP09pKGUsQW8obiwyKSxxaSk6dH0sQm4ubWVhbj1mdW5jdGlvbiBKdSh0KXtyZXR1cm4gT2UodCxMbCl9LEJuLm1lYW5CeT1mdW5jdGlvbiBRdSh0LGUpe3JldHVybiBPZSh0LEFvKGUsMikpfSxCbi5taW49ZnVuY3Rpb24gdGgoZSl7cmV0dXJuIGUmJmUubGVuZ3RoP09pKGUsTGwsaXIpOnR9LEJuLm1pbkJ5PWZ1bmN0aW9uIGVoKGUsbil7cmV0dXJuIGUmJmUubGVuZ3RoP09pKGUsQW8obiwyKSxpcik6dH0sQm4uc3R1YkFycmF5PVVsLEJuLnN0dWJGYWxzZT1qbCxCbi5zdHViT2JqZWN0PWZ1bmN0aW9uIG5oKCl7cmV0dXJue319LEJuLnN0dWJTdHJpbmc9ZnVuY3Rpb24gaWgoKXtyZXR1cm4iIn0sQm4uc3R1YlRydWU9ZnVuY3Rpb24gcmgoKXtyZXR1cm4hMH0sQm4ubXVsdGlwbHk9JGwsQm4ubnRoPWZ1bmN0aW9uIG9oKGUsbil7cmV0dXJuIGUmJmUubGVuZ3RoP2xyKGUsVnMobikpOnR9LEJuLm5vQ29uZmxpY3Q9ZnVuY3Rpb24gYWgoKXtyZXR1cm4gZWUuXz09PXRoaXMmJihlZS5fPUR0KSx0aGlzfSxCbi5ub29wPU9sLEJuLm5vdz1ZYSxCbi5wYWQ9ZnVuY3Rpb24gc2godCxlLG4pe3Q9V3ModCk7dmFyIGk9KGU9VnMoZSkpP3JuKHQpOjA7aWYoIWV8fGk+PWUpcmV0dXJuIHQ7dmFyIHI9KGUtaSkvMjtyZXR1cm4gY28odW4ociksbikrdCtjbyhjbihyKSxuKX0sQm4ucGFkRW5kPWZ1bmN0aW9uIGxoKHQsZSxuKXt0PVdzKHQpO3ZhciBpPShlPVZzKGUpKT9ybih0KTowO3JldHVybiBlJiZpPGU/dCtjbyhlLWksbik6dH0sQm4ucGFkU3RhcnQ9ZnVuY3Rpb24gY2godCxlLG4pe3Q9V3ModCk7dmFyIGk9KGU9VnMoZSkpP3JuKHQpOjA7cmV0dXJuIGUmJmk8ZT9jbyhlLWksbikrdDp0fSxCbi5wYXJzZUludD1mdW5jdGlvbiB1aCh0LGUsbil7cmV0dXJuIG58fG51bGw9PWU/ZT0wOmUmJihlPStlKSx2bihXcyh0KS5yZXBsYWNlKFEsIiIpLGV8fDApfSxCbi5yYW5kb209ZnVuY3Rpb24gaGgoZSxuLGkpe2lmKGkmJiJib29sZWFuIiE9dHlwZW9mIGkmJkhvKGUsbixpKSYmKG49aT10KSxpPT09dCYmKCJib29sZWFuIj09dHlwZW9mIG4/KGk9bixuPXQpOiJib29sZWFuIj09dHlwZW9mIGUmJihpPWUsZT10KSksZT09PXQmJm49PT10PyhlPTAsbj0xKTooZT1GcyhlKSxuPT09dD8obj1lLGU9MCk6bj1GcyhuKSksZT5uKXt2YXIgcj1lO2U9bixuPXJ9aWYoaXx8ZSUxfHxuJTEpe3ZhciBvPWJuKCk7cmV0dXJuIF9uKGUrbyoobi1lK1p0KCIxZS0iKygobysiIikubGVuZ3RoLTEpKSksbil9cmV0dXJuIHByKGUsbil9LEJuLnJlZHVjZT1mdW5jdGlvbiBkaCh0LGUsbil7dmFyIGk9aHModCk/VGU6QmUscj1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIGkodCxBbyhlLDQpLG4scixOaSl9LEJuLnJlZHVjZVJpZ2h0PWZ1bmN0aW9uIHBoKHQsZSxuKXt2YXIgaT1ocyh0KT9DZTpCZSxyPWFyZ3VtZW50cy5sZW5ndGg8MztyZXR1cm4gaSh0LEFvKGUsNCksbixyLElpKX0sQm4ucmVwZWF0PWZ1bmN0aW9uIGZoKGUsbixpKXtyZXR1cm4gbj0oaT9IbyhlLG4saSk6bj09PXQpPzE6VnMobiksZnIoV3MoZSksbil9LEJuLnJlcGxhY2U9ZnVuY3Rpb24gbWgoKXt2YXIgdD1hcmd1bWVudHMsZT1Xcyh0WzBdKTtyZXR1cm4gdC5sZW5ndGg8Mz9lOmUucmVwbGFjZSh0WzFdLHRbMl0pfSxCbi5yZXN1bHQ9ZnVuY3Rpb24gZ2goZSxuLGkpe3ZhciByPS0xLG89KG49QnIobixlKSkubGVuZ3RoO2ZvcihvfHwobz0xLGU9dCk7KytyPG87KXt2YXIgYT1udWxsPT1lP3Q6ZVtyYShuW3JdKV07YT09PXQmJihyPW8sYT1pKSxlPWJzKGEpP2EuY2FsbChlKTphfXJldHVybiBlfSxCbi5yb3VuZD1LbCxCbi5ydW5JbkNvbnRleHQ9dHQsQm4uc2FtcGxlPWZ1bmN0aW9uIF9oKHQpe3JldHVybihocyh0KT8kbjpncikodCl9LEJuLnNpemU9ZnVuY3Rpb24geWgodCl7aWYobnVsbD09dClyZXR1cm4gMDtpZihmcyh0KSlyZXR1cm4gSXModCk/cm4odCk6dC5sZW5ndGg7dmFyIGU9Um8odCk7cmV0dXJuIGU9PXl8fGU9PVM/dC5zaXplOm5yKHQpLmxlbmd0aH0sQm4uc25ha2VDYXNlPWJsLEJuLnNvbWU9ZnVuY3Rpb24gdmgoZSxuLGkpe3ZhciByPWhzKGUpP0FlOlNyO3JldHVybiBpJiZIbyhlLG4saSkmJihuPXQpLHIoZSxBbyhuLDMpKX0sQm4uc29ydGVkSW5kZXg9ZnVuY3Rpb24gYmgodCxlKXtyZXR1cm4gTXIodCxlKX0sQm4uc29ydGVkSW5kZXhCeT1mdW5jdGlvbiB4aCh0LGUsbil7cmV0dXJuIEVyKHQsZSxBbyhuLDIpKX0sQm4uc29ydGVkSW5kZXhPZj1mdW5jdGlvbiB3aCh0LGUpe3ZhciBuPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZihuKXt2YXIgaT1Ncih0LGUpO2lmKGk8biYmc3ModFtpXSxlKSlyZXR1cm4gaX1yZXR1cm4tMX0sQm4uc29ydGVkTGFzdEluZGV4PWZ1bmN0aW9uIFNoKHQsZSl7cmV0dXJuIE1yKHQsZSwhMCl9LEJuLnNvcnRlZExhc3RJbmRleEJ5PWZ1bmN0aW9uIE1oKHQsZSxuKXtyZXR1cm4gRXIodCxlLEFvKG4sMiksITApfSxCbi5zb3J0ZWRMYXN0SW5kZXhPZj1mdW5jdGlvbiBFaCh0LGUpe2lmKG51bGwhPXQmJnQubGVuZ3RoKXt2YXIgbj1Ncih0LGUsITApLTE7aWYoc3ModFtuXSxlKSlyZXR1cm4gbn1yZXR1cm4tMX0sQm4uc3RhcnRDYXNlPXhsLEJuLnN0YXJ0c1dpdGg9ZnVuY3Rpb24gVGgodCxlLG4pe3JldHVybiB0PVdzKHQpLG49bnVsbD09bj8wOm9pKFZzKG4pLDAsdC5sZW5ndGgpLGU9QXIoZSksdC5zbGljZShuLG4rZS5sZW5ndGgpPT1lfSxCbi5zdWJ0cmFjdD1abCxCbi5zdW09ZnVuY3Rpb24gQ2godCl7cmV0dXJuIHQmJnQubGVuZ3RoP0hlKHQsTGwpOjB9LEJuLnN1bUJ5PWZ1bmN0aW9uIEFoKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP0hlKHQsQW8oZSwyKSk6MH0sQm4udGVtcGxhdGU9ZnVuY3Rpb24ga2goZSxuLGkpe3ZhciByPUJuLnRlbXBsYXRlU2V0dGluZ3M7aSYmSG8oZSxuLGkpJiYobj10KSxlPVdzKGUpLG49WHMoe30sbixyLHlvKTt2YXIgbyxhLHM9WHMoe30sbi5pbXBvcnRzLHIuaW1wb3J0cyx5byksbD1ybChzKSxjPWplKHMsbCksdT0wLGg9bi5pbnRlcnBvbGF0ZXx8bXQsZD0iX19wICs9ICciLHA9RXQoKG4uZXNjYXBlfHxtdCkuc291cmNlKyJ8IitoLnNvdXJjZSsifCIrKGg9PT1ZP3N0Om10KS5zb3VyY2UrInwiKyhuLmV2YWx1YXRlfHxtdCkuc291cmNlKyJ8JCIsImciKSxmPSIvLyMgc291cmNlVVJMPSIrKE50LmNhbGwobiwic291cmNlVVJMIik/KG4uc291cmNlVVJMKyIiKS5yZXBsYWNlKC9ccy9nLCIgIik6ImxvZGFzaC50ZW1wbGF0ZVNvdXJjZXNbIisgKytZdCsiXSIpKyJcbiI7ZS5yZXBsYWNlKHAsKGZ1bmN0aW9uKHQsbixpLHIscyxsKXtyZXR1cm4gaXx8KGk9ciksZCs9ZS5zbGljZSh1LGwpLnJlcGxhY2UoZ3QsS2UpLG4mJihvPSEwLGQrPSInICtcbl9fZSgiK24rIikgK1xuJyIpLHMmJihhPSEwLGQrPSInO1xuIitzKyI7XG5fX3AgKz0gJyIpLGkmJihkKz0iJyArXG4oKF9fdCA9ICgiK2krIikpID09IG51bGwgPyAnJyA6IF9fdCkgK1xuJyIpLHU9bCt0Lmxlbmd0aCx0fSkpLGQrPSInO1xuIjt2YXIgbT1OdC5jYWxsKG4sInZhcmlhYmxlIikmJm4udmFyaWFibGU7aWYobSl7aWYob3QudGVzdChtKSl0aHJvdyBuZXcgeHQoIkludmFsaWQgYHZhcmlhYmxlYCBvcHRpb24gcGFzc2VkIGludG8gYF8udGVtcGxhdGVgIil9ZWxzZSBkPSJ3aXRoIChvYmopIHtcbiIrZCsiXG59XG4iO2Q9KGE/ZC5yZXBsYWNlKEIsIiIpOmQpLnJlcGxhY2UoSCwiJDEiKS5yZXBsYWNlKEYsIiQxOyIpLGQ9ImZ1bmN0aW9uKCIrKG18fCJvYmoiKSsiKSB7XG4iKyhtPyIiOiJvYmogfHwgKG9iaiA9IHt9KTtcbiIpKyJ2YXIgX190LCBfX3AgPSAnJyIrKG8/IiwgX19lID0gXy5lc2NhcGUiOiIiKSsoYT8iLCBfX2ogPSBBcnJheS5wcm90b3R5cGUuam9pbjtcbmZ1bmN0aW9uIHByaW50KCkgeyBfX3AgKz0gX19qLmNhbGwoYXJndW1lbnRzLCAnJykgfVxuIjoiO1xuIikrZCsicmV0dXJuIF9fcFxufSI7dmFyIGc9RWwoKGZ1bmN0aW9uKCl7cmV0dXJuIHd0KGwsZisicmV0dXJuICIrZCkuYXBwbHkodCxjKX0pKTtpZihnLnNvdXJjZT1kLHZzKGcpKXRocm93IGc7cmV0dXJuIGd9LEJuLnRpbWVzPWZ1bmN0aW9uIExoKHQsZSl7aWYoKHQ9VnModCkpPDF8fHQ+cylyZXR1cm5bXTt2YXIgbj1jLGk9X24odCxjKTtlPUFvKGUpLHQtPWM7Zm9yKHZhciByPUZlKGksZSk7KytuPHQ7KWUobik7cmV0dXJuIHJ9LEJuLnRvRmluaXRlPUZzLEJuLnRvSW50ZWdlcj1WcyxCbi50b0xlbmd0aD1VcyxCbi50b0xvd2VyPWZ1bmN0aW9uIFBoKHQpe3JldHVybiBXcyh0KS50b0xvd2VyQ2FzZSgpfSxCbi50b051bWJlcj1qcyxCbi50b1NhZmVJbnRlZ2VyPWZ1bmN0aW9uIE5oKHQpe3JldHVybiB0P29pKFZzKHQpLC05MDA3MTk5MjU0NzQwOTkxLHMpOjA9PT10P3Q6MH0sQm4udG9TdHJpbmc9V3MsQm4udG9VcHBlcj1mdW5jdGlvbiBJaCh0KXtyZXR1cm4gV3ModCkudG9VcHBlckNhc2UoKX0sQm4udHJpbT1mdW5jdGlvbiBSaChlLG4saSl7aWYoKGU9V3MoZSkpJiYoaXx8bj09PXQpKXJldHVybiBWZShlKTtpZighZXx8IShuPUFyKG4pKSlyZXR1cm4gZTt2YXIgcj1vbihlKSxvPW9uKG4pO3JldHVybiBGcihyLFdlKHIsbykscWUocixvKSsxKS5qb2luKCIiKX0sQm4udHJpbUVuZD1mdW5jdGlvbiBPaChlLG4saSl7aWYoKGU9V3MoZSkpJiYoaXx8bj09PXQpKXJldHVybiBlLnNsaWNlKDAsYW4oZSkrMSk7aWYoIWV8fCEobj1BcihuKSkpcmV0dXJuIGU7dmFyIHI9b24oZSk7cmV0dXJuIEZyKHIsMCxxZShyLG9uKG4pKSsxKS5qb2luKCIiKX0sQm4udHJpbVN0YXJ0PWZ1bmN0aW9uIHpoKGUsbixpKXtpZigoZT1XcyhlKSkmJihpfHxuPT09dCkpcmV0dXJuIGUucmVwbGFjZShRLCIiKTtpZighZXx8IShuPUFyKG4pKSlyZXR1cm4gZTt2YXIgcj1vbihlKTtyZXR1cm4gRnIocixXZShyLG9uKG4pKSkuam9pbigiIil9LEJuLnRydW5jYXRlPWZ1bmN0aW9uIERoKGUsbil7dmFyIGk9MzAscj0iLi4uIjtpZihTcyhuKSl7dmFyIG89InNlcGFyYXRvciJpbiBuP24uc2VwYXJhdG9yOm87aT0ibGVuZ3RoImluIG4/VnMobi5sZW5ndGgpOmkscj0ib21pc3Npb24iaW4gbj9BcihuLm9taXNzaW9uKTpyfXZhciBhPShlPVdzKGUpKS5sZW5ndGg7aWYoWmUoZSkpe3ZhciBzPW9uKGUpO2E9cy5sZW5ndGh9aWYoaT49YSlyZXR1cm4gZTt2YXIgbD1pLXJuKHIpO2lmKGw8MSlyZXR1cm4gcjt2YXIgYz1zP0ZyKHMsMCxsKS5qb2luKCIiKTplLnNsaWNlKDAsbCk7aWYobz09PXQpcmV0dXJuIGMrcjtpZihzJiYobCs9Yy5sZW5ndGgtbCksa3Mobykpe2lmKGUuc2xpY2UobCkuc2VhcmNoKG8pKXt2YXIgdSxoPWM7Zm9yKG8uZ2xvYmFsfHwobz1FdChvLnNvdXJjZSxXcyhsdC5leGVjKG8pKSsiZyIpKSxvLmxhc3RJbmRleD0wO3U9by5leGVjKGgpOyl2YXIgZD11LmluZGV4O2M9Yy5zbGljZSgwLGQ9PT10P2w6ZCl9fWVsc2UgaWYoZS5pbmRleE9mKEFyKG8pLGwpIT1sKXt2YXIgcD1jLmxhc3RJbmRleE9mKG8pO3A+LTEmJihjPWMuc2xpY2UoMCxwKSl9cmV0dXJuIGMrcn0sQm4udW5lc2NhcGU9ZnVuY3Rpb24gQmgodCl7cmV0dXJuKHQ9V3ModCkpJiZqLnRlc3QodCk/dC5yZXBsYWNlKFYsc24pOnR9LEJuLnVuaXF1ZUlkPWZ1bmN0aW9uIEhoKHQpe3ZhciBlPSsrSXQ7cmV0dXJuIFdzKHQpK2V9LEJuLnVwcGVyQ2FzZT13bCxCbi51cHBlckZpcnN0PVNsLEJuLmVhY2g9SGEsQm4uZWFjaFJpZ2h0PUZhLEJuLmZpcnN0PXBhLFJsKEJuLChHbD17fSxGaShCbiwoZnVuY3Rpb24odCxlKXtOdC5jYWxsKEJuLnByb3RvdHlwZSxlKXx8KEdsW2VdPXQpfSkpLEdsKSx7Y2hhaW46ITF9KSxCbi5WRVJTSU9OPSI0LjE3LjIxIixtZShbImJpbmQiLCJiaW5kS2V5IiwiY3VycnkiLCJjdXJyeVJpZ2h0IiwicGFydGlhbCIsInBhcnRpYWxSaWdodCJdLChmdW5jdGlvbih0KXtCblt0XS5wbGFjZWhvbGRlcj1Cbn0pKSxtZShbImRyb3AiLCJ0YWtlIl0sKGZ1bmN0aW9uKGUsbil7VW4ucHJvdG90eXBlW2VdPWZ1bmN0aW9uKGkpe2k9aT09PXQ/MTpnbihWcyhpKSwwKTt2YXIgcj10aGlzLl9fZmlsdGVyZWRfXyYmIW4/bmV3IFVuKHRoaXMpOnRoaXMuY2xvbmUoKTtyZXR1cm4gci5fX2ZpbHRlcmVkX18/ci5fX3Rha2VDb3VudF9fPV9uKGksci5fX3Rha2VDb3VudF9fKTpyLl9fdmlld3NfXy5wdXNoKHtzaXplOl9uKGksYyksdHlwZTplKyhyLl9fZGlyX188MD8iUmlnaHQiOiIiKX0pLHJ9LFVuLnByb3RvdHlwZVtlKyJSaWdodCJdPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJldmVyc2UoKVtlXSh0KS5yZXZlcnNlKCl9fSkpLG1lKFsiZmlsdGVyIiwibWFwIiwidGFrZVdoaWxlIl0sKGZ1bmN0aW9uKHQsZSl7dmFyIG49ZSsxLGk9MT09bnx8Mz09bjtVbi5wcm90b3R5cGVbdF09ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jbG9uZSgpO3JldHVybiBlLl9faXRlcmF0ZWVzX18ucHVzaCh7aXRlcmF0ZWU6QW8odCwzKSx0eXBlOm59KSxlLl9fZmlsdGVyZWRfXz1lLl9fZmlsdGVyZWRfX3x8aSxlfX0pKSxtZShbImhlYWQiLCJsYXN0Il0sKGZ1bmN0aW9uKHQsZSl7dmFyIG49InRha2UiKyhlPyJSaWdodCI6IiIpO1VuLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3JldHVybiB0aGlzW25dKDEpLnZhbHVlKClbMF19fSkpLG1lKFsiaW5pdGlhbCIsInRhaWwiXSwoZnVuY3Rpb24odCxlKXt2YXIgbj0iZHJvcCIrKGU/IiI6IlJpZ2h0Iik7VW4ucHJvdG90eXBlW3RdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19maWx0ZXJlZF9fP25ldyBVbih0aGlzKTp0aGlzW25dKDEpfX0pKSxVbi5wcm90b3R5cGUuY29tcGFjdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbHRlcihMbCl9LFVuLnByb3RvdHlwZS5maW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZpbHRlcih0KS5oZWFkKCl9LFVuLnByb3RvdHlwZS5maW5kTGFzdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkuZmluZCh0KX0sVW4ucHJvdG90eXBlLmludm9rZU1hcD1tcigoZnVuY3Rpb24odCxlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD9uZXcgVW4odGhpcyk6dGhpcy5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiBLaShuLHQsZSl9KSl9KSksVW4ucHJvdG90eXBlLnJlamVjdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5maWx0ZXIobnMoQW8odCkpKX0sVW4ucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKGUsbil7ZT1WcyhlKTt2YXIgaT10aGlzO3JldHVybiBpLl9fZmlsdGVyZWRfXyYmKGU+MHx8bjwwKT9uZXcgVW4oaSk6KGU8MD9pPWkudGFrZVJpZ2h0KC1lKTplJiYoaT1pLmRyb3AoZSkpLG4hPT10JiYoaT0obj1WcyhuKSk8MD9pLmRyb3BSaWdodCgtbik6aS50YWtlKG4tZSkpLGkpfSxVbi5wcm90b3R5cGUudGFrZVJpZ2h0V2hpbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmV2ZXJzZSgpLnRha2VXaGlsZSh0KS5yZXZlcnNlKCl9LFVuLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFrZShjKX0sRmkoVW4ucHJvdG90eXBlLChmdW5jdGlvbihlLG4pe3ZhciBpPS9eKD86ZmlsdGVyfGZpbmR8bWFwfHJlamVjdCl8V2hpbGUkLy50ZXN0KG4pLHI9L14oPzpoZWFkfGxhc3QpJC8udGVzdChuKSxvPUJuW3I/InRha2UiKygibGFzdCI9PW4/IlJpZ2h0IjoiIik6bl0sYT1yfHwvXmZpbmQvLnRlc3Qobik7byYmKEJuLnByb3RvdHlwZVtuXT1mdW5jdGlvbigpe3ZhciBuPXRoaXMuX193cmFwcGVkX18scz1yP1sxXTphcmd1bWVudHMsbD1uIGluc3RhbmNlb2YgVW4sYz1zWzBdLHU9bHx8aHMobiksaD1mdW5jdGlvbih0KXt2YXIgZT1vLmFwcGx5KEJuLEVlKFt0XSxzKSk7cmV0dXJuIHImJmQ/ZVswXTplfTt1JiZpJiYiZnVuY3Rpb24iPT10eXBlb2YgYyYmMSE9Yy5sZW5ndGgmJihsPXU9ITEpO3ZhciBkPXRoaXMuX19jaGFpbl9fLHA9ISF0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCxmPWEmJiFkLG09bCYmIXA7aWYoIWEmJnUpe249bT9uOm5ldyBVbih0aGlzKTt2YXIgZz1lLmFwcGx5KG4scyk7cmV0dXJuIGcuX19hY3Rpb25zX18ucHVzaCh7ZnVuYzpSYSxhcmdzOltoXSx0aGlzQXJnOnR9KSxuZXcgVm4oZyxkKX1yZXR1cm4gZiYmbT9lLmFwcGx5KHRoaXMscyk6KGc9dGhpcy50aHJ1KGgpLGY/cj9nLnZhbHVlKClbMF06Zy52YWx1ZSgpOmcpfSl9KSksbWUoWyJwb3AiLCJwdXNoIiwic2hpZnQiLCJzb3J0Iiwic3BsaWNlIiwidW5zaGlmdCJdLChmdW5jdGlvbih0KXt2YXIgZT1BdFt0XSxuPS9eKD86cHVzaHxzb3J0fHVuc2hpZnQpJC8udGVzdCh0KT8idGFwIjoidGhydSIsaT0vXig/OnBvcHxzaGlmdCkkLy50ZXN0KHQpO0JuLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cztpZihpJiYhdGhpcy5fX2NoYWluX18pe3ZhciByPXRoaXMudmFsdWUoKTtyZXR1cm4gZS5hcHBseShocyhyKT9yOltdLHQpfXJldHVybiB0aGlzW25dKChmdW5jdGlvbihuKXtyZXR1cm4gZS5hcHBseShocyhuKT9uOltdLHQpfSkpfX0pKSxGaShVbi5wcm90b3R5cGUsKGZ1bmN0aW9uKHQsZSl7dmFyIG49Qm5bZV07aWYobil7dmFyIGk9bi5uYW1lKyIiO050LmNhbGwoa24saSl8fChrbltpXT1bXSksa25baV0ucHVzaCh7bmFtZTplLGZ1bmM6bn0pfX0pKSxrbltvbyh0LDIpLm5hbWVdPVt7bmFtZToid3JhcHBlciIsZnVuYzp0fV0sVW4ucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uIEZoKCl7dmFyIHQ9bmV3IFVuKHRoaXMuX193cmFwcGVkX18pO3JldHVybiB0Ll9fYWN0aW9uc19fPVhyKHRoaXMuX19hY3Rpb25zX18pLHQuX19kaXJfXz10aGlzLl9fZGlyX18sdC5fX2ZpbHRlcmVkX189dGhpcy5fX2ZpbHRlcmVkX18sdC5fX2l0ZXJhdGVlc19fPVhyKHRoaXMuX19pdGVyYXRlZXNfXyksdC5fX3Rha2VDb3VudF9fPXRoaXMuX190YWtlQ291bnRfXyx0Ll9fdmlld3NfXz1Ycih0aGlzLl9fdmlld3NfXyksdH0sVW4ucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24gVmgoKXtpZih0aGlzLl9fZmlsdGVyZWRfXyl7dmFyIHQ9bmV3IFVuKHRoaXMpO3QuX19kaXJfXz0tMSx0Ll9fZmlsdGVyZWRfXz0hMH1lbHNlKHQ9dGhpcy5jbG9uZSgpKS5fX2Rpcl9fKj0tMTtyZXR1cm4gdH0sVW4ucHJvdG90eXBlLnZhbHVlPWZ1bmN0aW9uIFVoKCl7dmFyIHQ9dGhpcy5fX3dyYXBwZWRfXy52YWx1ZSgpLGU9dGhpcy5fX2Rpcl9fLG49aHModCksaT1lPDAscj1uP3QubGVuZ3RoOjAsbz0oZnVuY3Rpb24gYSh0LGUsbil7Zm9yKHZhciBpPS0xLHI9bi5sZW5ndGg7KytpPHI7KXt2YXIgbz1uW2ldLGE9by5zaXplO3N3aXRjaChvLnR5cGUpe2Nhc2UiZHJvcCI6dCs9YTticmVhaztjYXNlImRyb3BSaWdodCI6ZS09YTticmVhaztjYXNlInRha2UiOmU9X24oZSx0K2EpO2JyZWFrO2Nhc2UidGFrZVJpZ2h0Ijp0PWduKHQsZS1hKX19cmV0dXJue3N0YXJ0OnQsZW5kOmV9fSkoMCxyLHRoaXMuX192aWV3c19fKSxzPW8uc3RhcnQsbD1vLmVuZCxjPWwtcyx1PWk/bDpzLTEsaD10aGlzLl9faXRlcmF0ZWVzX18sZD1oLmxlbmd0aCxwPTAsZj1fbihjLHRoaXMuX190YWtlQ291bnRfXyk7aWYoIW58fCFpJiZyPT1jJiZmPT1jKXJldHVybiBJcih0LHRoaXMuX19hY3Rpb25zX18pO3ZhciBtPVtdO3Q6Zm9yKDtjLS0mJnA8Zjspe2Zvcih2YXIgZz0tMSxfPXRbdSs9ZV07KytnPGQ7KXt2YXIgeT1oW2ddLHY9eS50eXBlLGI9KDAseS5pdGVyYXRlZSkoXyk7aWYoMj09dilfPWI7ZWxzZSBpZighYil7aWYoMT09diljb250aW51ZSB0O2JyZWFrIHR9fW1bcCsrXT1ffXJldHVybiBtfSxCbi5wcm90b3R5cGUuYXQ9T2EsQm4ucHJvdG90eXBlLmNoYWluPWZ1bmN0aW9uIGpoKCl7cmV0dXJuIElhKHRoaXMpfSxCbi5wcm90b3R5cGUuY29tbWl0PWZ1bmN0aW9uIEdoKCl7cmV0dXJuIG5ldyBWbih0aGlzLnZhbHVlKCksdGhpcy5fX2NoYWluX18pfSxCbi5wcm90b3R5cGUubmV4dD1mdW5jdGlvbiBXaCgpe3RoaXMuX192YWx1ZXNfXz09PXQmJih0aGlzLl9fdmFsdWVzX189SHModGhpcy52YWx1ZSgpKSk7dmFyIGU9dGhpcy5fX2luZGV4X18+PXRoaXMuX192YWx1ZXNfXy5sZW5ndGg7cmV0dXJue2RvbmU6ZSx2YWx1ZTplP3Q6dGhpcy5fX3ZhbHVlc19fW3RoaXMuX19pbmRleF9fKytdfX0sQm4ucHJvdG90eXBlLnBsYW50PWZ1bmN0aW9uIHFoKGUpe2Zvcih2YXIgbixpPXRoaXM7aSBpbnN0YW5jZW9mIEZuOyl7dmFyIHI9YWEoaSk7ci5fX2luZGV4X189MCxyLl9fdmFsdWVzX189dCxuP28uX193cmFwcGVkX189cjpuPXI7dmFyIG89cjtpPWkuX193cmFwcGVkX199cmV0dXJuIG8uX193cmFwcGVkX189ZSxufSxCbi5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbiBZaCgpe3ZhciBlPXRoaXMuX193cmFwcGVkX187aWYoZSBpbnN0YW5jZW9mIFVuKXt2YXIgbj1lO3JldHVybiB0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCYmKG49bmV3IFVuKHRoaXMpKSwobj1uLnJldmVyc2UoKSkuX19hY3Rpb25zX18ucHVzaCh7ZnVuYzpSYSxhcmdzOlt4YV0sdGhpc0FyZzp0fSksbmV3IFZuKG4sdGhpcy5fX2NoYWluX18pfXJldHVybiB0aGlzLnRocnUoeGEpfSxCbi5wcm90b3R5cGUudG9KU09OPUJuLnByb3RvdHlwZS52YWx1ZU9mPUJuLnByb3RvdHlwZS52YWx1ZT1mdW5jdGlvbiBYaCgpe3JldHVybiBJcih0aGlzLl9fd3JhcHBlZF9fLHRoaXMuX19hY3Rpb25zX18pfSxCbi5wcm90b3R5cGUuZmlyc3Q9Qm4ucHJvdG90eXBlLmhlYWQsYWUmJihCbi5wcm90b3R5cGVbYWVdPWZ1bmN0aW9uICRoKCl7cmV0dXJuIHRoaXN9KSxCbn0pKCk7aWU/KChpZS5leHBvcnRzPWxuKS5fPWxuLG5lLl89bG4pOmVlLl89bG59LmNhbGwodmUpOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBNZT0hKHdpbmRvdy5TaGFkeURPTSYmd2luZG93LlNoYWR5RE9NLmluVXNlKTtsZXQgRWUsVGU7ZnVuY3Rpb24gQ2UodCl7RWU9KCF0fHwhdC5zaGltY3NzcHJvcGVydGllcykmJihNZXx8Qm9vbGVhbighbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQXBwbGVXZWJLaXRcLzYwMXxFZGdlXC8xNS8pJiZ3aW5kb3cuQ1NTJiZDU1Muc3VwcG9ydHMmJkNTUy5zdXBwb3J0cygiYm94LXNoYWRvdyIsIjAgMCAwIHZhcigtLWZvbykiKSkpfXdpbmRvdy5TaGFkeUNTUyYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkJiYoVGU9d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkKTtjb25zdCBBZT1Cb29sZWFuKHdpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLmRpc2FibGVSdW50aW1lKTt3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M/RWU9d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzczp3aW5kb3cuU2hhZHlDU1M/KENlKHdpbmRvdy5TaGFkeUNTUyksd2luZG93LlNoYWR5Q1NTPXZvaWQgMCk6Q2Uod2luZG93LldlYkNvbXBvbmVudHMmJndpbmRvdy5XZWJDb21wb25lbnRzLmZsYWdzKTtjb25zdCBrZT1FZTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9jbGFzcyBMZXtjb25zdHJ1Y3Rvcigpe3RoaXMuc3RhcnQ9MCx0aGlzLmVuZD0wLHRoaXMucHJldmlvdXM9bnVsbCx0aGlzLnBhcmVudD1udWxsLHRoaXMucnVsZXM9bnVsbCx0aGlzLnBhcnNlZENzc1RleHQ9IiIsdGhpcy5jc3NUZXh0PSIiLHRoaXMuYXRSdWxlPSExLHRoaXMudHlwZT0wLHRoaXMua2V5ZnJhbWVzTmFtZT0iIix0aGlzLnNlbGVjdG9yPSIiLHRoaXMucGFyc2VkU2VsZWN0b3I9IiJ9fWZ1bmN0aW9uIFBlKHQpe3JldHVybiBOZSgoZnVuY3Rpb24gbih0KXtsZXQgZT1uZXcgTGU7ZS5zdGFydD0wLGUuZW5kPXQubGVuZ3RoO2xldCBuPWU7Zm9yKGxldCBpPTAscj10Lmxlbmd0aDtpPHI7aSsrKWlmKHRbaV09PT1PZSl7bi5ydWxlc3x8KG4ucnVsZXM9W10pO2xldCB0PW4sZT10LnJ1bGVzW3QucnVsZXMubGVuZ3RoLTFdfHxudWxsO249bmV3IExlLG4uc3RhcnQ9aSsxLG4ucGFyZW50PXQsbi5wcmV2aW91cz1lLHQucnVsZXMucHVzaChuKX1lbHNlIHRbaV09PT16ZSYmKG4uZW5kPWkrMSxuPW4ucGFyZW50fHxlKTtyZXR1cm4gZX0pKHQ9KGZ1bmN0aW9uIGUodCl7cmV0dXJuIHQucmVwbGFjZShEZS5jb21tZW50cywiIikucmVwbGFjZShEZS5wb3J0LCIiKX0pKHQpKSx0KX1mdW5jdGlvbiBOZSh0LGUpe2xldCBuPWUuc3Vic3RyaW5nKHQuc3RhcnQsdC5lbmQtMSk7aWYodC5wYXJzZWRDc3NUZXh0PXQuY3NzVGV4dD1uLnRyaW0oKSx0LnBhcmVudCl7bj1lLnN1YnN0cmluZyh0LnByZXZpb3VzP3QucHJldmlvdXMuZW5kOnQucGFyZW50LnN0YXJ0LHQuc3RhcnQtMSksbj0oZnVuY3Rpb24gaSh0KXtyZXR1cm4gdC5yZXBsYWNlKC9cXChbMC05YS1mXXsxLDZ9KVxzL2dpLChmdW5jdGlvbigpe2xldCB0PWFyZ3VtZW50c1sxXSxlPTYtdC5sZW5ndGg7Zm9yKDtlLS07KXQ9IjAiK3Q7cmV0dXJuIlxcIit0fSkpfSkobiksbj1uLnJlcGxhY2UoRGUubXVsdGlwbGVTcGFjZXMsIiAiKSxuPW4uc3Vic3RyaW5nKG4ubGFzdEluZGV4T2YoIjsiKSsxKTtsZXQgaT10LnBhcnNlZFNlbGVjdG9yPXQuc2VsZWN0b3I9bi50cmltKCk7dC5hdFJ1bGU9MD09PWkuaW5kZXhPZihGZSksdC5hdFJ1bGU/MD09PWkuaW5kZXhPZihIZSk/dC50eXBlPVJlLk1FRElBX1JVTEU6aS5tYXRjaChEZS5rZXlmcmFtZXNSdWxlKSYmKHQudHlwZT1SZS5LRVlGUkFNRVNfUlVMRSx0LmtleWZyYW1lc05hbWU9dC5zZWxlY3Rvci5zcGxpdChEZS5tdWx0aXBsZVNwYWNlcykucG9wKCkpOnQudHlwZT0wPT09aS5pbmRleE9mKEJlKT9SZS5NSVhJTl9SVUxFOlJlLlNUWUxFX1JVTEV9bGV0IHI9dC5ydWxlcztpZihyKWZvcihsZXQgdCxuPTAsaT1yLmxlbmd0aDtuPGkmJih0PXJbbl0pO24rKylOZSh0LGUpO3JldHVybiB0fWZ1bmN0aW9uIEllKHQsZSxuPSIiKXtsZXQgaT0iIjtpZih0LmNzc1RleHR8fHQucnVsZXMpe2xldCBuPXQucnVsZXM7aWYobiYmIShmdW5jdGlvbiByKHQpe2xldCBlPXRbMF07cmV0dXJuIEJvb2xlYW4oZSkmJkJvb2xlYW4oZS5zZWxlY3RvcikmJjA9PT1lLnNlbGVjdG9yLmluZGV4T2YoQmUpfSkobikpZm9yKGxldCB0LHI9MCxvPW4ubGVuZ3RoO3I8byYmKHQ9bltyXSk7cisrKWk9SWUodCxlLGkpO2Vsc2UgaT1lP3QuY3NzVGV4dDooZnVuY3Rpb24gbyh0KXtyZXR1cm4oZnVuY3Rpb24gbih0KXtyZXR1cm4gdC5yZXBsYWNlKERlLm1peGluQXBwbHksIiIpLnJlcGxhY2UoRGUudmFyQXBwbHksIiIpfSkodD0oZnVuY3Rpb24gZSh0KXtyZXR1cm4gdC5yZXBsYWNlKERlLmN1c3RvbVByb3AsIiIpLnJlcGxhY2UoRGUubWl4aW5Qcm9wLCIiKX0pKHQpKX0pKHQuY3NzVGV4dCksaT1pLnRyaW0oKSxpJiYoaT0iICAiK2krIlxuIil9cmV0dXJuIGkmJih0LnNlbGVjdG9yJiYobis9dC5zZWxlY3RvcisiICIrT2UrIlxuIiksbis9aSx0LnNlbGVjdG9yJiYobis9emUrIlxuXG4iKSksbn1jb25zdCBSZT17U1RZTEVfUlVMRToxLEtFWUZSQU1FU19SVUxFOjcsTUVESUFfUlVMRTo0LE1JWElOX1JVTEU6MWUzfSxPZT0ieyIsemU9In0iLERlPXtjb21tZW50czovXC9cKlteKl0qXCorKFteLypdW14qXSpcKispKlwvL2dpbSxwb3J0Oi9AaW1wb3J0W147XSo7L2dpbSxjdXN0b21Qcm9wOi8oPzpeW147XC1cc31dKyk/LS1bXjt7fV0qPzpbXnt9O10qPyg/Ols7XG5dfCQpL2dpbSxtaXhpblByb3A6Lyg/Ol5bXjtcLVxzfV0rKT8tLVteO3t9XSo/Oltee307XSo/e1tefV0qP30oPzpbO1xuXXwkKT8vZ2ltLG1peGluQXBwbHk6L0BhcHBseVxzKlwoP1teKTtdKlwpP1xzKig/Ols7XG5dfCQpPy9naW0sdmFyQXBwbHk6L1teOzpdKj86W147XSo/dmFyXChbXjtdKlwpKD86Wztcbl18JCk/L2dpbSxrZXlmcmFtZXNSdWxlOi9eQFteXHNdKmtleWZyYW1lcy8sbXVsdGlwbGVTcGFjZXM6L1xzKy9nfSxCZT0iLS0iLEhlPSJAbWVkaWEiLEZlPSJAIixWZT0vKD86XnxbO1xze11ccyopKC0tW1x3LV0qPylccyo6XHMqKD86KCg/OicoPzpcXCd8LikqPyd8Iig/OlxcInwuKSo/InxcKFteKV0qP1wpfFtefTt7XSkrKXxceyhbXn1dKilcfSg/Oig/PVs7XHN9XSl8JCkpL2dpLFVlPS8oPzpefFxXKylAYXBwbHlccypcKD8oW14pO1xuXSopXCk/L2dpLGplPS9AbWVkaWFccyguKikvLEdlPW5ldyBTZXQ7ZnVuY3Rpb24gV2UodCl7Y29uc3QgZT10LnRleHRDb250ZW50O2lmKCFHZS5oYXMoZSkpe0dlLmFkZChlKTtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7dC5zZXRBdHRyaWJ1dGUoInNoYWR5LXVuc2NvcGVkIiwiIiksdC50ZXh0Q29udGVudD1lLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodCl9fWZ1bmN0aW9uIHFlKHQpe3JldHVybiB0Lmhhc0F0dHJpYnV0ZSgic2hhZHktdW5zY29wZWQiKX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9mdW5jdGlvbiBZZSh0LGUpe3JldHVybiB0Pygic3RyaW5nIj09dHlwZW9mIHQmJih0PVBlKHQpKSxlJiYkZSh0LGUpLEllKHQsa2UpKToiIn1mdW5jdGlvbiBYZSh0KXtyZXR1cm4hdC5fX2Nzc1J1bGVzJiZ0LnRleHRDb250ZW50JiYodC5fX2Nzc1J1bGVzPVBlKHQudGV4dENvbnRlbnQpKSx0Ll9fY3NzUnVsZXN8fG51bGx9ZnVuY3Rpb24gJGUodCxlLG4saSl7aWYoIXQpcmV0dXJuO2xldCByPSExLG89dC50eXBlO2lmKGkmJm89PT1SZS5NRURJQV9SVUxFKXtsZXQgZT10LnNlbGVjdG9yLm1hdGNoKGplKTtlJiYod2luZG93Lm1hdGNoTWVkaWEoZVsxXSkubWF0Y2hlc3x8KHI9ITApKX1vPT09UmUuU1RZTEVfUlVMRT9lKHQpOm4mJm89PT1SZS5LRVlGUkFNRVNfUlVMRT9uKHQpOm89PT1SZS5NSVhJTl9SVUxFJiYocj0hMCk7bGV0IGE9dC5ydWxlcztpZihhJiYhcilmb3IobGV0IHQscj0wLG89YS5sZW5ndGg7cjxvJiYodD1hW3JdKTtyKyspJGUodCxlLG4saSl9ZnVuY3Rpb24gS2UodCxlKXtsZXQgbj10LmluZGV4T2YoInZhcigiKTtpZigtMT09PW4pcmV0dXJuIGUodCwiIiwiIiwiIik7bGV0IGk9KGZ1bmN0aW9uIHIodCxlKXtsZXQgbj0wO2ZvcihsZXQgaT1lLHI9dC5sZW5ndGg7aTxyO2krKylpZigiKCI9PT10W2ldKW4rKztlbHNlIGlmKCIpIj09PXRbaV0mJjA9PS0tbilyZXR1cm4gaTtyZXR1cm4tMX0pKHQsbiszKSxvPXQuc3Vic3RyaW5nKG4rNCxpKSxhPXQuc3Vic3RyaW5nKDAsbikscz1LZSh0LnN1YnN0cmluZyhpKzEpLGUpLGw9by5pbmRleE9mKCIsIik7cmV0dXJuLTE9PT1sP2UoYSxvLnRyaW0oKSwiIixzKTplKGEsby5zdWJzdHJpbmcoMCxsKS50cmltKCksby5zdWJzdHJpbmcobCsxKS50cmltKCkscyl9d2luZG93LlNoYWR5RE9NJiZ3aW5kb3c7Y29uc3QgWmU9ImNzcy1idWlsZCI7ZnVuY3Rpb24gSmUodCl7cmV0dXJuIiIhPT0oZnVuY3Rpb24gZSh0KXtpZih2b2lkIDAhPT1UZSlyZXR1cm4gVGU7aWYodm9pZCAwPT09dC5fX2Nzc0J1aWxkKXtjb25zdCBlPXQuZ2V0QXR0cmlidXRlKFplKTtpZihlKXQuX19jc3NCdWlsZD1lO2Vsc2V7Y29uc3QgZT0oZnVuY3Rpb24gZSh0KXtjb25zdCBlPSJ0ZW1wbGF0ZSI9PT10LmxvY2FsTmFtZT90LmNvbnRlbnQuZmlyc3RDaGlsZDp0LmZpcnN0Q2hpbGQ7aWYoZSBpbnN0YW5jZW9mIENvbW1lbnQpe2NvbnN0IHQ9ZS50ZXh0Q29udGVudC50cmltKCkuc3BsaXQoIjoiKTtpZih0WzBdPT09WmUpcmV0dXJuIHRbMV19cmV0dXJuIiJ9KSh0KTsiIiE9PWUmJihmdW5jdGlvbiBuKHQpe2NvbnN0IGU9InRlbXBsYXRlIj09PXQubG9jYWxOYW1lP3QuY29udGVudC5maXJzdENoaWxkOnQuZmlyc3RDaGlsZDtlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSl9Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovKSh0KSx0Ll9fY3NzQnVpbGQ9ZX19cmV0dXJuIHQuX19jc3NCdWlsZHx8IiJ9KSh0KX1mdW5jdGlvbiBRZSh0LGUpe2ZvcihsZXQgbiBpbiBlKW51bGw9PT1uP3Quc3R5bGUucmVtb3ZlUHJvcGVydHkobik6dC5zdHlsZS5zZXRQcm9wZXJ0eShuLGVbbl0pfWZ1bmN0aW9uIHRuKHQsZSl7Y29uc3Qgbj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS5nZXRQcm9wZXJ0eVZhbHVlKGUpO3JldHVybiBuP24udHJpbSgpOiIifQovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBlbj0vO1xzKi9tLG5uPS9eXHMqKGluaXRpYWwpfChpbmhlcml0KVxzKiQvLHJuPS9ccyohaW1wb3J0YW50LztjbGFzcyBvbntjb25zdHJ1Y3Rvcigpe3RoaXMuX21hcD17fX1zZXQodCxlKXt0PXQudHJpbSgpLHRoaXMuX21hcFt0XT17cHJvcGVydGllczplLGRlcGVuZGFudHM6e319fWdldCh0KXtyZXR1cm4gdD10LnRyaW0oKSx0aGlzLl9tYXBbdF18fG51bGx9fWxldCBhbj1udWxsO2NsYXNzIHNue2NvbnN0cnVjdG9yKCl7dGhpcy5fY3VycmVudEVsZW1lbnQ9bnVsbCx0aGlzLl9tZWFzdXJlRWxlbWVudD1udWxsLHRoaXMuX21hcD1uZXcgb259ZGV0ZWN0TWl4aW4odCl7cmV0dXJuKGZ1bmN0aW9uIGUodCl7Y29uc3QgZT1VZS50ZXN0KHQpfHxWZS50ZXN0KHQpO3JldHVybiBVZS5sYXN0SW5kZXg9MCxWZS5sYXN0SW5kZXg9MCxlfSkodCl9Z2F0aGVyU3R5bGVzKHQpe2NvbnN0IGU9KGZ1bmN0aW9uIG4odCl7Y29uc3QgZT1bXSxuPXQucXVlcnlTZWxlY3RvckFsbCgic3R5bGUiKTtmb3IobGV0IHQ9MDt0PG4ubGVuZ3RoO3QrKyl7Y29uc3QgaT1uW3RdO3FlKGkpP01lfHwoV2UoaSksaS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGkpKTooZS5wdXNoKGkudGV4dENvbnRlbnQpLGkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChpKSl9cmV0dXJuIGUuam9pbigiIikudHJpbSgpfSkodC5jb250ZW50KTtpZihlKXtjb25zdCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7cmV0dXJuIG4udGV4dENvbnRlbnQ9ZSx0LmNvbnRlbnQuaW5zZXJ0QmVmb3JlKG4sdC5jb250ZW50LmZpcnN0Q2hpbGQpLG59cmV0dXJuIG51bGx9dHJhbnNmb3JtVGVtcGxhdGUodCxlKXt2b2lkIDA9PT10Ll9nYXRoZXJlZFN0eWxlJiYodC5fZ2F0aGVyZWRTdHlsZT10aGlzLmdhdGhlclN0eWxlcyh0KSk7Y29uc3Qgbj10Ll9nYXRoZXJlZFN0eWxlO3JldHVybiBuP3RoaXMudHJhbnNmb3JtU3R5bGUobixlKTpudWxsfXRyYW5zZm9ybVN0eWxlKHQsZT0iIil7bGV0IG49WGUodCk7cmV0dXJuIHRoaXMudHJhbnNmb3JtUnVsZXMobixlKSx0LnRleHRDb250ZW50PVllKG4pLG59dHJhbnNmb3JtQ3VzdG9tU3R5bGUodCl7bGV0IGU9WGUodCk7cmV0dXJuICRlKGUsKHQ9PnsiOnJvb3QiPT09dC5zZWxlY3RvciYmKHQuc2VsZWN0b3I9Imh0bWwiKSx0aGlzLnRyYW5zZm9ybVJ1bGUodCl9KSksdC50ZXh0Q29udGVudD1ZZShlKSxlfXRyYW5zZm9ybVJ1bGVzKHQsZSl7dGhpcy5fY3VycmVudEVsZW1lbnQ9ZSwkZSh0LCh0PT57dGhpcy50cmFuc2Zvcm1SdWxlKHQpfSkpLHRoaXMuX2N1cnJlbnRFbGVtZW50PW51bGx9dHJhbnNmb3JtUnVsZSh0KXt0LmNzc1RleHQ9dGhpcy50cmFuc2Zvcm1Dc3NUZXh0KHQucGFyc2VkQ3NzVGV4dCx0KSwiOnJvb3QiPT09dC5zZWxlY3RvciYmKHQuc2VsZWN0b3I9Ijpob3N0ID4gKiIpfXRyYW5zZm9ybUNzc1RleHQodCxlKXtyZXR1cm4gdD10LnJlcGxhY2UoVmUsKCh0LG4saSxyKT0+dGhpcy5fcHJvZHVjZUNzc1Byb3BlcnRpZXModCxuLGkscixlKSkpLHRoaXMuX2NvbnN1bWVDc3NQcm9wZXJ0aWVzKHQsZSl9X2dldEluaXRpYWxWYWx1ZUZvclByb3BlcnR5KHQpe3JldHVybiB0aGlzLl9tZWFzdXJlRWxlbWVudHx8KHRoaXMuX21lYXN1cmVFbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm1ldGEiKSx0aGlzLl9tZWFzdXJlRWxlbWVudC5zZXRBdHRyaWJ1dGUoImFwcGx5LXNoaW0tbWVhc3VyZSIsIiIpLHRoaXMuX21lYXN1cmVFbGVtZW50LnN0eWxlLmFsbD0iaW5pdGlhbCIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0aGlzLl9tZWFzdXJlRWxlbWVudCkpLHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuX21lYXN1cmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKHQpfV9mYWxsYmFja3NGcm9tUHJldmlvdXNSdWxlcyh0KXtsZXQgZT10O2Zvcig7ZS5wYXJlbnQ7KWU9ZS5wYXJlbnQ7Y29uc3Qgbj17fTtsZXQgaT0hMTtyZXR1cm4gJGUoZSwoZT0+e2k9aXx8ZT09PXQsaXx8ZS5zZWxlY3Rvcj09PXQuc2VsZWN0b3ImJk9iamVjdC5hc3NpZ24obix0aGlzLl9jc3NUZXh0VG9NYXAoZS5wYXJzZWRDc3NUZXh0KSl9KSksbn1fY29uc3VtZUNzc1Byb3BlcnRpZXModCxlKXtsZXQgbj1udWxsO2Zvcig7bj1VZS5leGVjKHQpOyl7bGV0IGk9blswXSxyPW5bMV0sbz1uLmluZGV4LGE9bytpLmluZGV4T2YoIkBhcHBseSIpLHM9bytpLmxlbmd0aCxsPXQuc2xpY2UoMCxhKSxjPXQuc2xpY2UocyksdT1lP3RoaXMuX2ZhbGxiYWNrc0Zyb21QcmV2aW91c1J1bGVzKGUpOnt9O09iamVjdC5hc3NpZ24odSx0aGlzLl9jc3NUZXh0VG9NYXAobCkpO2xldCBoPXRoaXMuX2F0QXBwbHlUb0Nzc1Byb3BlcnRpZXMocix1KTt0PWAke2x9JHtofSR7Y31gLFVlLmxhc3RJbmRleD1vK2gubGVuZ3RofXJldHVybiB0fV9hdEFwcGx5VG9Dc3NQcm9wZXJ0aWVzKHQsZSl7dD10LnJlcGxhY2UoZW4sIiIpO2xldCBuPVtdLGk9dGhpcy5fbWFwLmdldCh0KTtpZihpfHwodGhpcy5fbWFwLnNldCh0LHt9KSxpPXRoaXMuX21hcC5nZXQodCkpLGkpe2xldCByLG8sYTt0aGlzLl9jdXJyZW50RWxlbWVudCYmKGkuZGVwZW5kYW50c1t0aGlzLl9jdXJyZW50RWxlbWVudF09ITApO2NvbnN0IHM9aS5wcm9wZXJ0aWVzO2ZvcihyIGluIHMpYT1lJiZlW3JdLG89W3IsIjogdmFyKCIsdCwiXy1fIixyXSxhJiZvLnB1c2goIiwiLGEucmVwbGFjZShybiwiIikpLG8ucHVzaCgiKSIpLHJuLnRlc3Qoc1tyXSkmJm8ucHVzaCgiICFpbXBvcnRhbnQiKSxuLnB1c2goby5qb2luKCIiKSl9cmV0dXJuIG4uam9pbigiOyAiKX1fcmVwbGFjZUluaXRpYWxPckluaGVyaXQodCxlKXtsZXQgbj1ubi5leGVjKGUpO3JldHVybiBuJiYoZT1uWzFdP3RoaXMuX2dldEluaXRpYWxWYWx1ZUZvclByb3BlcnR5KHQpOiJhcHBseS1zaGltLWluaGVyaXQiKSxlfV9jc3NUZXh0VG9NYXAodCxlPSExKXtsZXQgbixpLHI9dC5zcGxpdCgiOyIpLG89e307Zm9yKGxldCB0LGEscz0wO3M8ci5sZW5ndGg7cysrKXQ9cltzXSx0JiYoYT10LnNwbGl0KCI6IiksYS5sZW5ndGg+MSYmKG49YVswXS50cmltKCksaT1hLnNsaWNlKDEpLmpvaW4oIjoiKSxlJiYoaT10aGlzLl9yZXBsYWNlSW5pdGlhbE9ySW5oZXJpdChuLGkpKSxvW25dPWkpKTtyZXR1cm4gb31faW52YWxpZGF0ZU1peGluRW50cnkodCl7aWYoYW4pZm9yKGxldCBlIGluIHQuZGVwZW5kYW50cyllIT09dGhpcy5fY3VycmVudEVsZW1lbnQmJmFuKGUpfV9wcm9kdWNlQ3NzUHJvcGVydGllcyh0LGUsbixpLHIpe2lmKG4mJktlKG4sKCh0LGUpPT57ZSYmdGhpcy5fbWFwLmdldChlKSYmKGk9YEBhcHBseSAke2V9O2ApfSkpLCFpKXJldHVybiB0O2xldCBvPXRoaXMuX2NvbnN1bWVDc3NQcm9wZXJ0aWVzKCIiK2ksciksYT10LnNsaWNlKDAsdC5pbmRleE9mKCItLSIpKSxzPXRoaXMuX2Nzc1RleHRUb01hcChvLCEwKSxsPXMsYz10aGlzLl9tYXAuZ2V0KGUpLHU9YyYmYy5wcm9wZXJ0aWVzO3U/bD1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUodSkscyk6dGhpcy5fbWFwLnNldChlLGwpO2xldCBoLGQscD1bXSxmPSExO2ZvcihoIGluIGwpZD1zW2hdLHZvaWQgMD09PWQmJihkPSJpbml0aWFsIiksdSYmIShoIGluIHUpJiYoZj0hMCkscC5wdXNoKGAke2V9Xy1fJHtofTogJHtkfWApO3JldHVybiBmJiZ0aGlzLl9pbnZhbGlkYXRlTWl4aW5FbnRyeShjKSxjJiYoYy5wcm9wZXJ0aWVzPWwpLG4mJihhPWAke3R9OyR7YX1gKSxgJHthfSR7cC5qb2luKCI7ICIpfTtgfX1zbi5wcm90b3R5cGUuZGV0ZWN0TWl4aW49c24ucHJvdG90eXBlLmRldGVjdE1peGluLHNuLnByb3RvdHlwZS50cmFuc2Zvcm1TdHlsZT1zbi5wcm90b3R5cGUudHJhbnNmb3JtU3R5bGUsc24ucHJvdG90eXBlLnRyYW5zZm9ybUN1c3RvbVN0eWxlPXNuLnByb3RvdHlwZS50cmFuc2Zvcm1DdXN0b21TdHlsZSxzbi5wcm90b3R5cGUudHJhbnNmb3JtUnVsZXM9c24ucHJvdG90eXBlLnRyYW5zZm9ybVJ1bGVzLHNuLnByb3RvdHlwZS50cmFuc2Zvcm1SdWxlPXNuLnByb3RvdHlwZS50cmFuc2Zvcm1SdWxlLHNuLnByb3RvdHlwZS50cmFuc2Zvcm1UZW1wbGF0ZT1zbi5wcm90b3R5cGUudHJhbnNmb3JtVGVtcGxhdGUsc24ucHJvdG90eXBlLl9zZXBhcmF0b3I9Il8tXyIsT2JqZWN0LmRlZmluZVByb3BlcnR5KHNuLnByb3RvdHlwZSwiaW52YWxpZENhbGxiYWNrIix7Z2V0OigpPT5hbixzZXQodCl7YW49dH19KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgbG49e30sY249Il9hcHBseVNoaW1DdXJyZW50VmVyc2lvbiIsdW49Il9hcHBseVNoaW1OZXh0VmVyc2lvbiIsaG49Il9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbiIsZG49UHJvbWlzZS5yZXNvbHZlKCk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovZnVuY3Rpb24gcG4odCl7bGV0IGU9bG5bdF07ZSYmKGZ1bmN0aW9uIG4odCl7dFtjbl09dFtjbl18fDAsdFtobl09dFtobl18fDAsdFt1bl09KHRbdW5dfHwwKSsxfSkoZSl9ZnVuY3Rpb24gZm4odCl7cmV0dXJuIHRbY25dPT09dFt1bl19Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmxldCBtbixnbj1udWxsLF9uPXdpbmRvdy5IVE1MSW1wb3J0cyYmd2luZG93LkhUTUxJbXBvcnRzLndoZW5SZWFkeXx8bnVsbDtmdW5jdGlvbiB5bih0KXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uKCl7X24/X24odCk6KGdufHwoZ249bmV3IFByb21pc2UoKHQ9Pnttbj10fSkpLCJjb21wbGV0ZSI9PT1kb2N1bWVudC5yZWFkeVN0YXRlP21uKCk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsKCgpPT57ImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGUmJm1uKCl9KSkpLGduLnRoZW4oKGZ1bmN0aW9uKCl7dCYmdCgpfSkpKX0pKX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9jb25zdCB2bj0iX19zZWVuQnlTaGFkeUNTUyIsYm49Il9fc2hhZHlDU1NDYWNoZWRTdHlsZSI7bGV0IHhuPW51bGwsd249bnVsbDtjbGFzcyBTbntjb25zdHJ1Y3Rvcigpe3RoaXMuY3VzdG9tU3R5bGVzPVtdLHRoaXMuZW5xdWV1ZWQ9ITEseW4oKCgpPT57d2luZG93LlNoYWR5Q1NTLmZsdXNoQ3VzdG9tU3R5bGVzJiZ3aW5kb3cuU2hhZHlDU1MuZmx1c2hDdXN0b21TdHlsZXMoKX0pKX1lbnF1ZXVlRG9jdW1lbnRWYWxpZGF0aW9uKCl7IXRoaXMuZW5xdWV1ZWQmJnduJiYodGhpcy5lbnF1ZXVlZD0hMCx5bih3bikpfWFkZEN1c3RvbVN0eWxlKHQpe3Rbdm5dfHwodFt2bl09ITAsdGhpcy5jdXN0b21TdHlsZXMucHVzaCh0KSx0aGlzLmVucXVldWVEb2N1bWVudFZhbGlkYXRpb24oKSl9Z2V0U3R5bGVGb3JDdXN0b21TdHlsZSh0KXtpZih0W2JuXSlyZXR1cm4gdFtibl07bGV0IGU7cmV0dXJuIGU9dC5nZXRTdHlsZT90LmdldFN0eWxlKCk6dCxlfXByb2Nlc3NTdHlsZXMoKXtjb25zdCB0PXRoaXMuY3VzdG9tU3R5bGVzO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtjb25zdCBuPXRbZV07aWYobltibl0pY29udGludWU7Y29uc3QgaT10aGlzLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUobik7aWYoaSl7Y29uc3QgdD1pLl9fYXBwbGllZEVsZW1lbnR8fGk7eG4mJnhuKHQpLG5bYm5dPXR9fXJldHVybiB0fX1Tbi5wcm90b3R5cGUuYWRkQ3VzdG9tU3R5bGU9U24ucHJvdG90eXBlLmFkZEN1c3RvbVN0eWxlLFNuLnByb3RvdHlwZS5nZXRTdHlsZUZvckN1c3RvbVN0eWxlPVNuLnByb3RvdHlwZS5nZXRTdHlsZUZvckN1c3RvbVN0eWxlLFNuLnByb3RvdHlwZS5wcm9jZXNzU3R5bGVzPVNuLnByb3RvdHlwZS5wcm9jZXNzU3R5bGVzLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFNuLnByb3RvdHlwZSx7dHJhbnNmb3JtQ2FsbGJhY2s6e2dldDooKT0+eG4sc2V0KHQpe3huPXR9fSx2YWxpZGF0ZUNhbGxiYWNrOntnZXQ6KCk9PnduLHNldCh0KXtsZXQgZT0hMTt3bnx8KGU9ITApLHduPXQsZSYmdGhpcy5lbnF1ZXVlRG9jdW1lbnRWYWxpZGF0aW9uKCl9fX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBNbj1uZXcgc247Y2xhc3MgRW57Y29uc3RydWN0b3IoKXt0aGlzLmN1c3RvbVN0eWxlSW50ZXJmYWNlPW51bGwsTW4uaW52YWxpZENhbGxiYWNrPXBufWVuc3VyZSgpe3RoaXMuY3VzdG9tU3R5bGVJbnRlcmZhY2V8fHdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSYmKHRoaXMuY3VzdG9tU3R5bGVJbnRlcmZhY2U9d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlLHRoaXMuY3VzdG9tU3R5bGVJbnRlcmZhY2UudHJhbnNmb3JtQ2FsbGJhY2s9dD0+e01uLnRyYW5zZm9ybUN1c3RvbVN0eWxlKHQpfSx0aGlzLmN1c3RvbVN0eWxlSW50ZXJmYWNlLnZhbGlkYXRlQ2FsbGJhY2s9KCk9PntyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT57dGhpcy5jdXN0b21TdHlsZUludGVyZmFjZS5lbnF1ZXVlZCYmdGhpcy5mbHVzaEN1c3RvbVN0eWxlcygpfSkpfSl9cHJlcGFyZVRlbXBsYXRlKHQsZSl7aWYodGhpcy5lbnN1cmUoKSxKZSh0KSlyZXR1cm47bG5bZV09dDtsZXQgbj1Nbi50cmFuc2Zvcm1UZW1wbGF0ZSh0LGUpO3QuX3N0eWxlQXN0PW59Zmx1c2hDdXN0b21TdHlsZXMoKXtpZih0aGlzLmVuc3VyZSgpLCF0aGlzLmN1c3RvbVN0eWxlSW50ZXJmYWNlKXJldHVybjtsZXQgdD10aGlzLmN1c3RvbVN0eWxlSW50ZXJmYWNlLnByb2Nlc3NTdHlsZXMoKTtpZih0aGlzLmN1c3RvbVN0eWxlSW50ZXJmYWNlLmVucXVldWVkKXtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl7bGV0IG49dGhpcy5jdXN0b21TdHlsZUludGVyZmFjZS5nZXRTdHlsZUZvckN1c3RvbVN0eWxlKHRbZV0pO24mJk1uLnRyYW5zZm9ybUN1c3RvbVN0eWxlKG4pfXRoaXMuY3VzdG9tU3R5bGVJbnRlcmZhY2UuZW5xdWV1ZWQ9ITF9fXN0eWxlU3VidHJlZSh0LGUpe2lmKHRoaXMuZW5zdXJlKCksZSYmUWUodCxlKSx0LnNoYWRvd1Jvb3Qpe3RoaXMuc3R5bGVFbGVtZW50KHQpO2xldCBlPXQuc2hhZG93Um9vdC5jaGlsZHJlbnx8dC5zaGFkb3dSb290LmNoaWxkTm9kZXM7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspdGhpcy5zdHlsZVN1YnRyZWUoZVt0XSl9ZWxzZXtsZXQgZT10LmNoaWxkcmVufHx0LmNoaWxkTm9kZXM7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspdGhpcy5zdHlsZVN1YnRyZWUoZVt0XSl9fXN0eWxlRWxlbWVudCh0KXt0aGlzLmVuc3VyZSgpO2xldHtpczplfT0oZnVuY3Rpb24gbih0KXtsZXQgZT10LmxvY2FsTmFtZSxuPSIiLGk9IiI7cmV0dXJuIGU/ZS5pbmRleE9mKCItIik+LTE/bj1lOihpPWUsbj10LmdldEF0dHJpYnV0ZSYmdC5nZXRBdHRyaWJ1dGUoImlzIil8fCIiKToobj10LmlzLGk9dC5leHRlbmRzKSx7aXM6bix0eXBlRXh0ZW5zaW9uOml9fSkodCksaT1sbltlXTtpZigoIWl8fCFKZShpKSkmJmkmJiFmbihpKSl7KGZ1bmN0aW9uIG4odCl7cmV0dXJuIWZuKHQpJiZ0W2huXT09PXRbdW5dfSkoaSl8fCh0aGlzLnByZXBhcmVUZW1wbGF0ZShpLGUpLChmdW5jdGlvbiByKHQpe3RbaG5dPXRbdW5dLHQuX3ZhbGlkYXRpbmd8fCh0Ll92YWxpZGF0aW5nPSEwLGRuLnRoZW4oKGZ1bmN0aW9uKCl7dFtjbl09dFt1bl0sdC5fdmFsaWRhdGluZz0hMX0pKSl9KShpKSk7bGV0IG89dC5zaGFkb3dSb290O2lmKG8pe2xldCB0PW8ucXVlcnlTZWxlY3Rvcigic3R5bGUiKTt0JiYodC5fX2Nzc1J1bGVzPWkuX3N0eWxlQXN0LHQudGV4dENvbnRlbnQ9WWUoaS5fc3R5bGVBc3QpKX19fXN0eWxlRG9jdW1lbnQodCl7dGhpcy5lbnN1cmUoKSx0aGlzLnN0eWxlU3VidHJlZShkb2N1bWVudC5ib2R5LHQpfX1pZighd2luZG93LlNoYWR5Q1NTfHwhd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltKXtjb25zdCB0PW5ldyBFbjtsZXQgZT13aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZTt3aW5kb3cuU2hhZHlDU1M9e3ByZXBhcmVUZW1wbGF0ZShlLG4saSl7dC5mbHVzaEN1c3RvbVN0eWxlcygpLHQucHJlcGFyZVRlbXBsYXRlKGUsbil9LHByZXBhcmVUZW1wbGF0ZVN0eWxlcyh0LGUsbil7d2luZG93LlNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZSh0LGUsbil9LHByZXBhcmVUZW1wbGF0ZURvbSh0LGUpe30sc3R5bGVTdWJ0cmVlKGUsbil7dC5mbHVzaEN1c3RvbVN0eWxlcygpLHQuc3R5bGVTdWJ0cmVlKGUsbil9LHN0eWxlRWxlbWVudChlKXt0LmZsdXNoQ3VzdG9tU3R5bGVzKCksdC5zdHlsZUVsZW1lbnQoZSl9LHN0eWxlRG9jdW1lbnQoZSl7dC5mbHVzaEN1c3RvbVN0eWxlcygpLHQuc3R5bGVEb2N1bWVudChlKX0sZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlOih0LGUpPT50bih0LGUpLGZsdXNoQ3VzdG9tU3R5bGVzKCl7dC5mbHVzaEN1c3RvbVN0eWxlcygpfSxuYXRpdmVDc3M6a2UsbmF0aXZlU2hhZG93Ok1lLGNzc0J1aWxkOlRlLGRpc2FibGVSdW50aW1lOkFlfSxlJiYod2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlPWUpfXdpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW09TW47Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNsYXNzIFRue2NvbnN0cnVjdG9yKCl7dGhpcy5fYXN5bmNNb2R1bGU9bnVsbCx0aGlzLl9jYWxsYmFjaz1udWxsLHRoaXMuX3RpbWVyPW51bGx9c2V0Q29uZmlnKHQsZSl7dGhpcy5fYXN5bmNNb2R1bGU9dCx0aGlzLl9jYWxsYmFjaz1lLHRoaXMuX3RpbWVyPXRoaXMuX2FzeW5jTW9kdWxlLnJ1bigoKCk9Pnt0aGlzLl90aW1lcj1udWxsLENuLmRlbGV0ZSh0aGlzKSx0aGlzLl9jYWxsYmFjaygpfSkpfWNhbmNlbCgpe3RoaXMuaXNBY3RpdmUoKSYmKHRoaXMuX2NhbmNlbEFzeW5jKCksQ24uZGVsZXRlKHRoaXMpKX1fY2FuY2VsQXN5bmMoKXt0aGlzLmlzQWN0aXZlKCkmJih0aGlzLl9hc3luY01vZHVsZS5jYW5jZWwodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPW51bGwpfWZsdXNoKCl7dGhpcy5pc0FjdGl2ZSgpJiYodGhpcy5jYW5jZWwoKSx0aGlzLl9jYWxsYmFjaygpKX1pc0FjdGl2ZSgpe3JldHVybiBudWxsIT10aGlzLl90aW1lcn1zdGF0aWMgZGVib3VuY2UodCxlLG4pe3JldHVybiB0IGluc3RhbmNlb2YgVG4/dC5fY2FuY2VsQXN5bmMoKTp0PW5ldyBUbix0LnNldENvbmZpZyhlLG4pLHR9fWxldCBDbj1uZXcgU2V0O2NvbnN0IEFuPWZ1bmN0aW9uKHQpe0NuLmFkZCh0KX0sa249ZnVuY3Rpb24oKXtjb25zdCB0PUJvb2xlYW4oQ24uc2l6ZSk7cmV0dXJuIENuLmZvckVhY2goKHQ9Pnt0cnl7dC5mbHVzaCgpfWNhdGNoKHQpe3NldFRpbWVvdXQoKCgpPT57dGhyb3cgdH0pKX19KSksdH07Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmxldCBMbj0ic3RyaW5nIj09dHlwZW9mIGRvY3VtZW50LmhlYWQuc3R5bGUudG91Y2hBY3Rpb24sUG49Il9fcG9seW1lckdlc3R1cmVzIixObj0iX19wb2x5bWVyR2VzdHVyZXNIYW5kbGVkIixJbj0iX19wb2x5bWVyR2VzdHVyZXNUb3VjaEFjdGlvbiIsUm49WyJtb3VzZWRvd24iLCJtb3VzZW1vdmUiLCJtb3VzZXVwIiwiY2xpY2siXSxPbj1bMCwxLDQsMl0sem49KGZ1bmN0aW9uKCl7dHJ5e3JldHVybiAxPT09bmV3IE1vdXNlRXZlbnQoInRlc3QiLHtidXR0b25zOjF9KS5idXR0b25zfWNhdGNoKHQpe3JldHVybiExfX0pKCk7ZnVuY3Rpb24gRG4odCl7cmV0dXJuIFJuLmluZGV4T2YodCk+LTF9bGV0IEJuPSExO2Z1bmN0aW9uIEhuKHQpe2lmKCFEbih0KSYmInRvdWNoZW5kIiE9PXQpcmV0dXJuIExuJiZCbiYmdj97cGFzc2l2ZTohMH06dm9pZCAwfSEoZnVuY3Rpb24oKXt0cnl7bGV0IHQ9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJwYXNzaXZlIix7Z2V0KCl7Qm49ITB9fSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLG51bGwsdCksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRlc3QiLG51bGwsdCl9Y2F0Y2godCl7fX0pKCk7bGV0IEZuPW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQKD86W29hXWR8aG9uZSl8QW5kcm9pZC8pO2NvbnN0IFZuPVtdLFVuPXtidXR0b246ITAsaW5wdXQ6ITAsa2V5Z2VuOiEwLG1ldGVyOiEwLG91dHB1dDohMCx0ZXh0YXJlYTohMCxwcm9ncmVzczohMCxzZWxlY3Q6ITB9LGpuPXtidXR0b246ITAsY29tbWFuZDohMCxmaWVsZHNldDohMCxpbnB1dDohMCxrZXlnZW46ITAsb3B0Z3JvdXA6ITAsb3B0aW9uOiEwLHNlbGVjdDohMCx0ZXh0YXJlYTohMH07ZnVuY3Rpb24gR24odCl7bGV0IGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodC5sYWJlbHN8fFtdKTtpZighZS5sZW5ndGgpe2U9W107bGV0IG49dC5nZXRSb290Tm9kZSgpO2lmKHQuaWQpe2xldCBpPW4ucXVlcnlTZWxlY3RvckFsbChgbGFiZWxbZm9yID0gJHt0LmlkfV1gKTtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrKyllLnB1c2goaVt0XSl9fXJldHVybiBlfWxldCBXbj1mdW5jdGlvbih0KXtsZXQgZT10LnNvdXJjZUNhcGFiaWxpdGllcztpZigoIWV8fGUuZmlyZXNUb3VjaEV2ZW50cykmJih0W05uXT17c2tpcDohMH0sImNsaWNrIj09PXQudHlwZSkpe2xldCBlPSExLG49Sm4odCk7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0Kyspe2lmKG5bdF0ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSlpZigibGFiZWwiPT09blt0XS5sb2NhbE5hbWUpVm4ucHVzaChuW3RdKTtlbHNlIGlmKFVuW25bdF0ubG9jYWxOYW1lXSl7bGV0IGk9R24oblt0XSk7Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0KyspZT1lfHxWbi5pbmRleE9mKGlbdF0pPi0xfWlmKG5bdF09PT1Ybi5tb3VzZS50YXJnZXQpcmV0dXJufWlmKGUpcmV0dXJuO3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpfX07ZnVuY3Rpb24gcW4odCl7bGV0IGU9Rm4/WyJjbGljayJdOlJuO2ZvcihsZXQgbixpPTA7aTxlLmxlbmd0aDtpKyspbj1lW2ldLHQ/KFZuLmxlbmd0aD0wLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIobixXbiwhMCkpOmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIobixXbiwhMCl9ZnVuY3Rpb24gWW4odCl7bGV0IGU9dC50eXBlO2lmKCFEbihlKSlyZXR1cm4hMTtpZigibW91c2Vtb3ZlIj09PWUpe2xldCBlPXZvaWQgMD09PXQuYnV0dG9ucz8xOnQuYnV0dG9ucztyZXR1cm4gdCBpbnN0YW5jZW9mIHdpbmRvdy5Nb3VzZUV2ZW50JiYhem4mJihlPU9uW3Qud2hpY2hdfHwwKSxCb29sZWFuKDEmZSl9cmV0dXJuIDA9PT0odm9pZCAwPT09dC5idXR0b24/MDp0LmJ1dHRvbil9bGV0IFhuPXttb3VzZTp7dGFyZ2V0Om51bGwsbW91c2VJZ25vcmVKb2I6bnVsbH0sdG91Y2g6e3g6MCx5OjAsaWQ6LTEsc2Nyb2xsRGVjaWRlZDohMX19O2Z1bmN0aW9uICRuKHQsZSxuKXt0Lm1vdmVmbj1lLHQudXBmbj1uLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsZSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsbil9ZnVuY3Rpb24gS24odCl7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0Lm1vdmVmbiksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsdC51cGZuKSx0Lm1vdmVmbj1udWxsLHQudXBmbj1udWxsfWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwoZnVuY3Rpb24gWm4odCl7WG4ubW91c2UubW91c2VJZ25vcmVKb2J8fHFuKCEwKSxYbi5tb3VzZS50YXJnZXQ9Sm4odClbMF0sWG4ubW91c2UubW91c2VJZ25vcmVKb2I9VG4uZGVib3VuY2UoWG4ubW91c2UubW91c2VJZ25vcmVKb2IsZ3QuYWZ0ZXIoMjUwMCksKGZ1bmN0aW9uKCl7cW4oKSxYbi5tb3VzZS50YXJnZXQ9bnVsbCxYbi5tb3VzZS5tb3VzZUlnbm9yZUpvYj1udWxsfSkpfSksISFCbiYme3Bhc3NpdmU6ITB9KTtjb25zdCBKbj13aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS5ub1BhdGNoP3dpbmRvdy5TaGFkeURPTS5jb21wb3NlZFBhdGg6dD0+dC5jb21wb3NlZFBhdGgmJnQuY29tcG9zZWRQYXRoKCl8fFtdLFFuPXt9LHRpPVtdO2Z1bmN0aW9uIGVpKHQpe2NvbnN0IGU9Sm4odCk7cmV0dXJuIGUubGVuZ3RoPjA/ZVswXTp0LnRhcmdldH1mdW5jdGlvbiBuaSh0KXtsZXQgZSxuPXQudHlwZSxpPXQuY3VycmVudFRhcmdldFtQbl07aWYoIWkpcmV0dXJuO2xldCByPWlbbl07aWYocil7aWYoIXRbTm5dJiYodFtObl09e30sInRvdWNoIj09PW4uc2xpY2UoMCw1KSkpe2xldCBlPSh0PXQpLmNoYW5nZWRUb3VjaGVzWzBdO2lmKCJ0b3VjaHN0YXJ0Ij09PW4mJjE9PT10LnRvdWNoZXMubGVuZ3RoJiYoWG4udG91Y2guaWQ9ZS5pZGVudGlmaWVyKSxYbi50b3VjaC5pZCE9PWUuaWRlbnRpZmllcilyZXR1cm47TG58fCJ0b3VjaHN0YXJ0IiE9PW4mJiJ0b3VjaG1vdmUiIT09bnx8KGZ1bmN0aW9uIG8odCl7bGV0IGU9dC5jaGFuZ2VkVG91Y2hlc1swXSxuPXQudHlwZTtpZigidG91Y2hzdGFydCI9PT1uKVhuLnRvdWNoLng9ZS5jbGllbnRYLFhuLnRvdWNoLnk9ZS5jbGllbnRZLFhuLnRvdWNoLnNjcm9sbERlY2lkZWQ9ITE7ZWxzZSBpZigidG91Y2htb3ZlIj09PW4pe2lmKFhuLnRvdWNoLnNjcm9sbERlY2lkZWQpcmV0dXJuO1huLnRvdWNoLnNjcm9sbERlY2lkZWQ9ITA7bGV0IG49KGZ1bmN0aW9uIGkodCl7bGV0IGU9ImF1dG8iLG49Sm4odCk7Zm9yKGxldCB0LGk9MDtpPG4ubGVuZ3RoO2krKylpZih0PW5baV0sdFtJbl0pe2U9dFtJbl07YnJlYWt9cmV0dXJuIGV9KSh0KSxpPSExLHI9TWF0aC5hYnMoWG4udG91Y2gueC1lLmNsaWVudFgpLG89TWF0aC5hYnMoWG4udG91Y2gueS1lLmNsaWVudFkpO3QuY2FuY2VsYWJsZSYmKCJub25lIj09PW4/aT0hMDoicGFuLXgiPT09bj9pPW8+cjoicGFuLXkiPT09biYmKGk9cj5vKSksaT90LnByZXZlbnREZWZhdWx0KCk6c2koInRyYWNrIil9fSkodCl9aWYoZT10W05uXSwhZS5za2lwKXtmb3IobGV0IG4saT0wO2k8dGkubGVuZ3RoO2krKyluPXRpW2ldLHJbbi5uYW1lXSYmIWVbbi5uYW1lXSYmbi5mbG93JiZuLmZsb3cuc3RhcnQuaW5kZXhPZih0LnR5cGUpPi0xJiZuLnJlc2V0JiZuLnJlc2V0KCk7Zm9yKGxldCBpLG89MDtvPHRpLmxlbmd0aDtvKyspaT10aVtvXSxyW2kubmFtZV0mJiFlW2kubmFtZV0mJihlW2kubmFtZV09ITAsaVtuXSh0KSl9fX1mdW5jdGlvbiBpaSh0LGUsbil7cmV0dXJuISFRbltlXSYmKChmdW5jdGlvbiBpKHQsZSxuKXtsZXQgaT1RbltlXSxyPWkuZGVwcyxvPWkubmFtZSxhPXRbUG5dO2F8fCh0W1BuXT1hPXt9KTtmb3IobGV0IGUsbixpPTA7aTxyLmxlbmd0aDtpKyspZT1yW2ldLEZuJiZEbihlKSYmImNsaWNrIiE9PWV8fChuPWFbZV0sbnx8KGFbZV09bj17X2NvdW50OjB9KSwwPT09bi5fY291bnQmJnQuYWRkRXZlbnRMaXN0ZW5lcihlLG5pLEhuKGUpKSxuW29dPShuW29dfHwwKSsxLG4uX2NvdW50PShuLl9jb3VudHx8MCkrMSk7dC5hZGRFdmVudExpc3RlbmVyKGUsbiksaS50b3VjaEFjdGlvbiYmb2kodCxpLnRvdWNoQWN0aW9uKX0pKHQsZSxuKSwhMCl9ZnVuY3Rpb24gcmkodCl7dGkucHVzaCh0KTtmb3IobGV0IGU9MDtlPHQuZW1pdHMubGVuZ3RoO2UrKylRblt0LmVtaXRzW2VdXT10fWZ1bmN0aW9uIG9pKHQsZSl7TG4mJnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmdnQucnVuKCgoKT0+e3Quc3R5bGUudG91Y2hBY3Rpb249ZX0pKSx0W0luXT1lfWZ1bmN0aW9uIGFpKHQsZSxuKXtsZXQgaT1uZXcgRXZlbnQoZSx7YnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNvbXBvc2VkOiEwfSk7aWYoaS5kZXRhaWw9bixZKHQpLmRpc3BhdGNoRXZlbnQoaSksaS5kZWZhdWx0UHJldmVudGVkKXtsZXQgdD1uLnByZXZlbnRlcnx8bi5zb3VyY2VFdmVudDt0JiZ0LnByZXZlbnREZWZhdWx0JiZ0LnByZXZlbnREZWZhdWx0KCl9fWZ1bmN0aW9uIHNpKHQpe2xldCBlPShmdW5jdGlvbiBuKHQpe2ZvcihsZXQgZSxuPTA7bjx0aS5sZW5ndGg7bisrKXtlPXRpW25dO2ZvcihsZXQgbixpPTA7aTxlLmVtaXRzLmxlbmd0aDtpKyspaWYobj1lLmVtaXRzW2ldLG49PT10KXJldHVybiBlfXJldHVybiBudWxsfSkodCk7ZS5pbmZvJiYoZS5pbmZvLnByZXZlbnQ9ITApfWZ1bmN0aW9uIGxpKHQsZSxuLGkpe2UmJmFpKGUsdCx7eDpuLmNsaWVudFgseTpuLmNsaWVudFksc291cmNlRXZlbnQ6bixwcmV2ZW50ZXI6aSxwcmV2ZW50OmZ1bmN0aW9uKHQpe3JldHVybiBzaSh0KX19KX1mdW5jdGlvbiBjaSh0LGUsbil7aWYodC5wcmV2ZW50KXJldHVybiExO2lmKHQuc3RhcnRlZClyZXR1cm4hMDtsZXQgaT1NYXRoLmFicyh0LngtZSkscj1NYXRoLmFicyh0Lnktbik7cmV0dXJuIGk+PTV8fHI+PTV9ZnVuY3Rpb24gdWkodCxlLG4pe2lmKCFlKXJldHVybjtsZXQgaSxyPXQubW92ZXNbdC5tb3Zlcy5sZW5ndGgtMl0sbz10Lm1vdmVzW3QubW92ZXMubGVuZ3RoLTFdLGE9MDtyJiYoaT1vLngtci54LGE9by55LXIueSksYWkoZSwidHJhY2siLHtzdGF0ZTp0LnN0YXRlLHg6bi5jbGllbnRYLHk6bi5jbGllbnRZLGR4Om8ueC10LngsZHk6by55LXQueSxkZHg6aSxkZHk6YSxzb3VyY2VFdmVudDpuLGhvdmVyOmZ1bmN0aW9uKCl7cmV0dXJuKGZ1bmN0aW9uIHQoZSxuKXtsZXQgaT1kb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGUsbikscj1pO2Zvcig7ciYmci5zaGFkb3dSb290JiYhd2luZG93LlNoYWR5RE9NOyl7bGV0IHQ9cjtpZihyPXIuc2hhZG93Um9vdC5lbGVtZW50RnJvbVBvaW50KGUsbiksdD09PXIpYnJlYWs7ciYmKGk9cil9cmV0dXJuIGl9KShuLmNsaWVudFgsbi5jbGllbnRZKX19KX1mdW5jdGlvbiBoaSh0LGUsbil7bGV0IGk9TWF0aC5hYnMoZS5jbGllbnRYLXQueCkscj1NYXRoLmFicyhlLmNsaWVudFktdC55KSxvPWVpKG58fGUpOyFvfHxqbltvLmxvY2FsTmFtZV0mJm8uaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpfHwoaXNOYU4oaSl8fGlzTmFOKHIpfHxpPD0yNSYmcjw9MjV8fChmdW5jdGlvbiBhKHQpe2lmKCJjbGljayI9PT10LnR5cGUpe2lmKDA9PT10LmRldGFpbClyZXR1cm4hMDtsZXQgZT1laSh0KTtpZighZS5ub2RlVHlwZXx8ZS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFKXJldHVybiEwO2xldCBuPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksaT10LnBhZ2VYLHI9dC5wYWdlWTtyZXR1cm4hKGk+PW4ubGVmdCYmaTw9bi5yaWdodCYmcj49bi50b3AmJnI8PW4uYm90dG9tKX1yZXR1cm4hMX0pKGUpKSYmKHQucHJldmVudHx8YWkobywidGFwIix7eDplLmNsaWVudFgseTplLmNsaWVudFksc291cmNlRXZlbnQ6ZSxwcmV2ZW50ZXI6bn0pKX1yaSh7bmFtZToiZG93bnVwIixkZXBzOlsibW91c2Vkb3duIiwidG91Y2hzdGFydCIsInRvdWNoZW5kIl0sZmxvdzp7c3RhcnQ6WyJtb3VzZWRvd24iLCJ0b3VjaHN0YXJ0Il0sZW5kOlsibW91c2V1cCIsInRvdWNoZW5kIl19LGVtaXRzOlsiZG93biIsInVwIl0saW5mbzp7bW92ZWZuOm51bGwsdXBmbjpudWxsfSxyZXNldDpmdW5jdGlvbigpe0tuKHRoaXMuaW5mbyl9LG1vdXNlZG93bjpmdW5jdGlvbih0KXtpZighWW4odCkpcmV0dXJuO2xldCBlPWVpKHQpLG49dGhpczskbih0aGlzLmluZm8sKGZ1bmN0aW9uIHQoaSl7WW4oaSl8fChsaSgidXAiLGUsaSksS24obi5pbmZvKSl9KSwoZnVuY3Rpb24gdChpKXtZbihpKSYmbGkoInVwIixlLGkpLEtuKG4uaW5mbyl9KSksbGkoImRvd24iLGUsdCl9LHRvdWNoc3RhcnQ6ZnVuY3Rpb24odCl7bGkoImRvd24iLGVpKHQpLHQuY2hhbmdlZFRvdWNoZXNbMF0sdCl9LHRvdWNoZW5kOmZ1bmN0aW9uKHQpe2xpKCJ1cCIsZWkodCksdC5jaGFuZ2VkVG91Y2hlc1swXSx0KX19KSxyaSh7bmFtZToidHJhY2siLHRvdWNoQWN0aW9uOiJub25lIixkZXBzOlsibW91c2Vkb3duIiwidG91Y2hzdGFydCIsInRvdWNobW92ZSIsInRvdWNoZW5kIl0sZmxvdzp7c3RhcnQ6WyJtb3VzZWRvd24iLCJ0b3VjaHN0YXJ0Il0sZW5kOlsibW91c2V1cCIsInRvdWNoZW5kIl19LGVtaXRzOlsidHJhY2siXSxpbmZvOnt4OjAseTowLHN0YXRlOiJzdGFydCIsc3RhcnRlZDohMSxtb3ZlczpbXSxhZGRNb3ZlOmZ1bmN0aW9uKHQpe3RoaXMubW92ZXMubGVuZ3RoPjImJnRoaXMubW92ZXMuc2hpZnQoKSx0aGlzLm1vdmVzLnB1c2godCl9LG1vdmVmbjpudWxsLHVwZm46bnVsbCxwcmV2ZW50OiExfSxyZXNldDpmdW5jdGlvbigpe3RoaXMuaW5mby5zdGF0ZT0ic3RhcnQiLHRoaXMuaW5mby5zdGFydGVkPSExLHRoaXMuaW5mby5tb3Zlcz1bXSx0aGlzLmluZm8ueD0wLHRoaXMuaW5mby55PTAsdGhpcy5pbmZvLnByZXZlbnQ9ITEsS24odGhpcy5pbmZvKX0sbW91c2Vkb3duOmZ1bmN0aW9uKHQpe2lmKCFZbih0KSlyZXR1cm47bGV0IGU9ZWkodCksbj10aGlzLGk9ZnVuY3Rpb24gdChpKXtsZXQgcj1pLmNsaWVudFgsbz1pLmNsaWVudFk7Y2kobi5pbmZvLHIsbykmJihuLmluZm8uc3RhdGU9bi5pbmZvLnN0YXJ0ZWQ/Im1vdXNldXAiPT09aS50eXBlPyJlbmQiOiJ0cmFjayI6InN0YXJ0Iiwic3RhcnQiPT09bi5pbmZvLnN0YXRlJiZzaSgidGFwIiksbi5pbmZvLmFkZE1vdmUoe3g6cix5Om99KSxZbihpKXx8KG4uaW5mby5zdGF0ZT0iZW5kIixLbihuLmluZm8pKSxlJiZ1aShuLmluZm8sZSxpKSxuLmluZm8uc3RhcnRlZD0hMCl9OyRuKHRoaXMuaW5mbyxpLChmdW5jdGlvbiB0KGUpe24uaW5mby5zdGFydGVkJiZpKGUpLEtuKG4uaW5mbyl9KSksdGhpcy5pbmZvLng9dC5jbGllbnRYLHRoaXMuaW5mby55PXQuY2xpZW50WX0sdG91Y2hzdGFydDpmdW5jdGlvbih0KXtsZXQgZT10LmNoYW5nZWRUb3VjaGVzWzBdO3RoaXMuaW5mby54PWUuY2xpZW50WCx0aGlzLmluZm8ueT1lLmNsaWVudFl9LHRvdWNobW92ZTpmdW5jdGlvbih0KXtsZXQgZT1laSh0KSxuPXQuY2hhbmdlZFRvdWNoZXNbMF0saT1uLmNsaWVudFgscj1uLmNsaWVudFk7Y2kodGhpcy5pbmZvLGkscikmJigic3RhcnQiPT09dGhpcy5pbmZvLnN0YXRlJiZzaSgidGFwIiksdGhpcy5pbmZvLmFkZE1vdmUoe3g6aSx5OnJ9KSx1aSh0aGlzLmluZm8sZSxuKSx0aGlzLmluZm8uc3RhdGU9InRyYWNrIix0aGlzLmluZm8uc3RhcnRlZD0hMCl9LHRvdWNoZW5kOmZ1bmN0aW9uKHQpe2xldCBlPWVpKHQpLG49dC5jaGFuZ2VkVG91Y2hlc1swXTt0aGlzLmluZm8uc3RhcnRlZCYmKHRoaXMuaW5mby5zdGF0ZT0iZW5kIix0aGlzLmluZm8uYWRkTW92ZSh7eDpuLmNsaWVudFgseTpuLmNsaWVudFl9KSx1aSh0aGlzLmluZm8sZSxuKSl9fSkscmkoe25hbWU6InRhcCIsZGVwczpbIm1vdXNlZG93biIsImNsaWNrIiwidG91Y2hzdGFydCIsInRvdWNoZW5kIl0sZmxvdzp7c3RhcnQ6WyJtb3VzZWRvd24iLCJ0b3VjaHN0YXJ0Il0sZW5kOlsiY2xpY2siLCJ0b3VjaGVuZCJdfSxlbWl0czpbInRhcCJdLGluZm86e3g6TmFOLHk6TmFOLHByZXZlbnQ6ITF9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5pbmZvLng9TmFOLHRoaXMuaW5mby55PU5hTix0aGlzLmluZm8ucHJldmVudD0hMX0sbW91c2Vkb3duOmZ1bmN0aW9uKHQpe1luKHQpJiYodGhpcy5pbmZvLng9dC5jbGllbnRYLHRoaXMuaW5mby55PXQuY2xpZW50WSl9LGNsaWNrOmZ1bmN0aW9uKHQpe1luKHQpJiZoaSh0aGlzLmluZm8sdCl9LHRvdWNoc3RhcnQ6ZnVuY3Rpb24odCl7Y29uc3QgZT10LmNoYW5nZWRUb3VjaGVzWzBdO3RoaXMuaW5mby54PWUuY2xpZW50WCx0aGlzLmluZm8ueT1lLmNsaWVudFl9LHRvdWNoZW5kOmZ1bmN0aW9uKHQpe2hpKHRoaXMuaW5mbyx0LmNoYW5nZWRUb3VjaGVzWzBdLHQpfX0pO2NvbnN0IGRpPWVpLHBpPUkoKHQ9PmNsYXNzIGV4dGVuZHMgdHtfYWRkRXZlbnRMaXN0ZW5lclRvTm9kZSh0LGUsbil7aWkodCxlLG4pfHxzdXBlci5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZSh0LGUsbil9X3JlbW92ZUV2ZW50TGlzdGVuZXJGcm9tTm9kZSh0LGUsbil7KGZ1bmN0aW9uIGkodCxlLG4pe3JldHVybiEhUW5bZV0mJigoZnVuY3Rpb24gaSh0LGUsbil7bGV0IGk9UW5bZV0scj1pLmRlcHMsbz1pLm5hbWUsYT10W1BuXTtpZihhKWZvcihsZXQgZSxuLGk9MDtpPHIubGVuZ3RoO2krKyllPXJbaV0sbj1hW2VdLG4mJm5bb10mJihuW29dPShuW29dfHwxKS0xLG4uX2NvdW50PShuLl9jb3VudHx8MSktMSwwPT09bi5fY291bnQmJnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLG5pLEhuKGUpKSk7dC5yZW1vdmVFdmVudExpc3RlbmVyKGUsbil9KSh0LGUsbiksITApfSkodCxlLG4pfHxzdXBlci5fcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21Ob2RlKHQsZSxuKX19KSksZmk9Lzpob3N0XCg6ZGlyXCgobHRyfHJ0bClcKVwpL2csbWk9LyhbXHNcdy0jXC5cW1xdXCpdKik6ZGlyXCgobHRyfHJ0bClcKS9nLGdpPS86ZGlyXCgoPzpsdHJ8cnRsKVwpLyxfaT1Cb29sZWFuKHdpbmRvdy5TaGFkeURPTSYmd2luZG93LlNoYWR5RE9NLmluVXNlKSx5aT1bXTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9sZXQgdmk9bnVsbCxiaT0iIjtmdW5jdGlvbiB4aSgpe2JpPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoImRpciIpfWZ1bmN0aW9uIHdpKHQpe3QuX19hdXRvRGlyT3B0T3V0fHx0LnNldEF0dHJpYnV0ZSgiZGlyIixiaSl9ZnVuY3Rpb24gU2koKXt4aSgpLGJpPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoImRpciIpO2ZvcihsZXQgdD0wO3Q8eWkubGVuZ3RoO3QrKyl3aSh5aVt0XSl9Y29uc3QgTWk9SSgodD0+e19pfHx2aXx8KHhpKCksdmk9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoU2kpLHZpLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHthdHRyaWJ1dGVzOiEwLGF0dHJpYnV0ZUZpbHRlcjpbImRpciJdfSkpO2NvbnN0IGU9TXQodCk7Y2xhc3MgbiBleHRlbmRzIGV7c3RhdGljIF9wcm9jZXNzU3R5bGVUZXh0KHQsbil7cmV0dXJuIHQ9ZS5fcHJvY2Vzc1N0eWxlVGV4dC5jYWxsKHRoaXMsdCxuKSwhX2kmJmdpLnRlc3QodCkmJih0PXRoaXMuX3JlcGxhY2VEaXJJbkNzc1RleHQodCksdGhpcy5fX2FjdGl2YXRlRGlyPSEwKSx0fXN0YXRpYyBfcmVwbGFjZURpckluQ3NzVGV4dCh0KXtsZXQgZT10O3JldHVybiBlPWUucmVwbGFjZShmaSwnOmhvc3QoW2Rpcj0iJDEiXSknKSxlPWUucmVwbGFjZShtaSwnOmhvc3QoW2Rpcj0iJDIiXSkgJDEnKSxlfWNvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9fYXV0b0Rpck9wdE91dD0hMX1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5fX2F1dG9EaXJPcHRPdXQ9dGhpcy5oYXNBdHRyaWJ1dGUoImRpciIpfWNvbm5lY3RlZENhbGxiYWNrKCl7ZS5wcm90b3R5cGUuY29ubmVjdGVkQ2FsbGJhY2smJnN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCksdGhpcy5jb25zdHJ1Y3Rvci5fX2FjdGl2YXRlRGlyJiYoKGZ1bmN0aW9uIHQoKXt2aSYmdmkudGFrZVJlY29yZHMoKS5sZW5ndGgmJlNpKCl9KSgpLHlpLnB1c2godGhpcyksd2kodGhpcykpfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7aWYoZS5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2smJnN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCksdGhpcy5jb25zdHJ1Y3Rvci5fX2FjdGl2YXRlRGlyKXtjb25zdCB0PXlpLmluZGV4T2YodGhpcyk7dD4tMSYmeWkuc3BsaWNlKHQsMSl9fX1yZXR1cm4gbi5fX2FjdGl2YXRlRGlyPSExLG59KSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovbGV0IEVpPSExLFRpPVtdLENpPVtdO2Z1bmN0aW9uIEFpKCl7RWk9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKChmdW5jdGlvbigpe0VpPSExLChmdW5jdGlvbiB0KGUpe2Zvcig7ZS5sZW5ndGg7KWtpKGUuc2hpZnQoKSl9KShUaSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXshKGZ1bmN0aW9uIHQoZSl7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aDt0PG47dCsrKWtpKGUuc2hpZnQoKSl9KShDaSl9KSl9KSl9ZnVuY3Rpb24ga2kodCl7Y29uc3QgZT10WzBdLG49dFsxXSxpPXRbMl07dHJ5e24uYXBwbHkoZSxpKX1jYXRjaCh0KXtzZXRUaW1lb3V0KCgoKT0+e3Rocm93IHR9KSl9fWZ1bmN0aW9uIExpKHQsZSxuKXtFaXx8QWkoKSxDaS5wdXNoKFt0LGUsbl0pfQovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL2Z1bmN0aW9uIFBpKCl7ZG9jdW1lbnQuYm9keS5yZW1vdmVBdHRyaWJ1dGUoInVucmVzb2x2ZWQiKX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KZnVuY3Rpb24gTmkodCxlLG4pe3JldHVybntpbmRleDp0LHJlbW92ZWQ6ZSxhZGRlZENvdW50Om59fWZ1bmN0aW9uIElpKHQsZSl7cmV0dXJuKGZ1bmN0aW9uIG4odCxlLGkscixvLGEpe2xldCBzLGw9MCxjPTAsdT1NYXRoLm1pbihpLWUsYS1vKTtpZigwPT1lJiYwPT1vJiYobD0oZnVuY3Rpb24gaCh0LGUsbil7Zm9yKGxldCBpPTA7aTxuO2krKylpZighUmkodFtpXSxlW2ldKSlyZXR1cm4gaTtyZXR1cm4gbn0pKHQscix1KSksaT09dC5sZW5ndGgmJmE9PXIubGVuZ3RoJiYoYz0oZnVuY3Rpb24gZCh0LGUsbil7bGV0IGk9dC5sZW5ndGgscj1lLmxlbmd0aCxvPTA7Zm9yKDtvPG4mJlJpKHRbLS1pXSxlWy0tcl0pOylvKys7cmV0dXJuIG99KSh0LHIsdS1sKSksbys9bCxhLT1jLChpLT1jKS0oZSs9bCk9PTAmJmEtbz09MClyZXR1cm5bXTtpZihlPT1pKXtmb3Iocz1OaShlLFtdLDApO288YTspcy5yZW1vdmVkLnB1c2gocltvKytdKTtyZXR1cm5bc119aWYobz09YSlyZXR1cm5bTmkoZSxbXSxpLWUpXTtsZXQgcD0oZnVuY3Rpb24gbSh0KXtsZXQgZT10Lmxlbmd0aC0xLG49dFswXS5sZW5ndGgtMSxpPXRbZV1bbl0scj1bXTtmb3IoO2U+MHx8bj4wOyl7aWYoMD09ZSl7ci5wdXNoKDIpLG4tLTtjb250aW51ZX1pZigwPT1uKXtyLnB1c2goMyksZS0tO2NvbnRpbnVlfWxldCBvLGE9dFtlLTFdW24tMV0scz10W2UtMV1bbl0sbD10W2VdW24tMV07bz1zPGw/czxhP3M6YTpsPGE/bDphLG89PWE/KGE9PWk/ci5wdXNoKDApOihyLnB1c2goMSksaT1hKSxlLS0sbi0tKTpvPT1zPyhyLnB1c2goMyksZS0tLGk9cyk6KHIucHVzaCgyKSxuLS0saT1sKX1yZXR1cm4gci5yZXZlcnNlKCkscn0pKChmdW5jdGlvbiBmKHQsZSxuLGkscixvKXtsZXQgYT1vLXIrMSxzPW4tZSsxLGw9bmV3IEFycmF5KGEpO2ZvcihsZXQgdD0wO3Q8YTt0KyspbFt0XT1uZXcgQXJyYXkocyksbFt0XVswXT10O2ZvcihsZXQgdD0wO3Q8czt0KyspbFswXVt0XT10O2ZvcihsZXQgbj0xO248YTtuKyspZm9yKGxldCBvPTE7bzxzO28rKylpZihSaSh0W2Urby0xXSxpW3Irbi0xXSkpbFtuXVtvXT1sW24tMV1bby0xXTtlbHNle2xldCB0PWxbbi0xXVtvXSsxLGU9bFtuXVtvLTFdKzE7bFtuXVtvXT10PGU/dDplfXJldHVybiBsfSkodCxlLGkscixvLGEpKTtzPXZvaWQgMDtsZXQgZz1bXSxfPWUseT1vO2ZvcihsZXQgdD0wO3Q8cC5sZW5ndGg7dCsrKXN3aXRjaChwW3RdKXtjYXNlIDA6cyYmKGcucHVzaChzKSxzPXZvaWQgMCksXysrLHkrKzticmVhaztjYXNlIDE6c3x8KHM9TmkoXyxbXSwwKSkscy5hZGRlZENvdW50KyssXysrLHMucmVtb3ZlZC5wdXNoKHJbeV0pLHkrKzticmVhaztjYXNlIDI6c3x8KHM9TmkoXyxbXSwwKSkscy5hZGRlZENvdW50KyssXysrO2JyZWFrO2Nhc2UgMzpzfHwocz1OaShfLFtdLDApKSxzLnJlbW92ZWQucHVzaChyW3ldKSx5Kyt9cmV0dXJuIHMmJmcucHVzaChzKSxnfSkodCwwLHQubGVuZ3RoLGUsMCxlLmxlbmd0aCl9ZnVuY3Rpb24gUmkodCxlKXtyZXR1cm4gdD09PWV9Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovZnVuY3Rpb24gT2kodCl7cmV0dXJuInNsb3QiPT09dC5sb2NhbE5hbWV9ImludGVyYWN0aXZlIj09PWRvY3VtZW50LnJlYWR5U3RhdGV8fCJjb21wbGV0ZSI9PT1kb2N1bWVudC5yZWFkeVN0YXRlP1BpKCk6d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLFBpKTtsZXQgemk9Y2xhc3N7c3RhdGljIGdldEZsYXR0ZW5lZE5vZGVzKHQpe2NvbnN0IGU9WSh0KTtyZXR1cm4gT2kodCk/KHQ9dCxlLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46ITB9KSk6QXJyYXkuZnJvbShlLmNoaWxkTm9kZXMpLm1hcCgodD0+T2kodCk/WSh0PXQpLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46ITB9KTpbdF0pKS5yZWR1Y2UoKCh0LGUpPT50LmNvbmNhdChlKSksW10pfWNvbnN0cnVjdG9yKHQsZSl7dGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyPW51bGwsdGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlcj1udWxsLHRoaXMuX2Nvbm5lY3RlZD0hMSx0aGlzLl90YXJnZXQ9dCx0aGlzLmNhbGxiYWNrPWUsdGhpcy5fZWZmZWN0aXZlTm9kZXM9W10sdGhpcy5fb2JzZXJ2ZXI9bnVsbCx0aGlzLl9zY2hlZHVsZWQ9ITEsdGhpcy5fYm91bmRTY2hlZHVsZT0oKT0+e3RoaXMuX3NjaGVkdWxlKCl9LHRoaXMuY29ubmVjdCgpLHRoaXMuX3NjaGVkdWxlKCl9Y29ubmVjdCgpe09pKHRoaXMuX3RhcmdldCk/dGhpcy5fbGlzdGVuU2xvdHMoW3RoaXMuX3RhcmdldF0pOlkodGhpcy5fdGFyZ2V0KS5jaGlsZHJlbiYmKHRoaXMuX2xpc3RlblNsb3RzKFkodGhpcy5fdGFyZ2V0KS5jaGlsZHJlbiksd2luZG93LlNoYWR5RE9NP3RoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlcj13aW5kb3cuU2hhZHlET00ub2JzZXJ2ZUNoaWxkcmVuKHRoaXMuX3RhcmdldCwodD0+e3RoaXMuX3Byb2Nlc3NNdXRhdGlvbnModCl9KSk6KHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXI9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoKHQ9Pnt0aGlzLl9wcm9jZXNzTXV0YXRpb25zKHQpfSkpLHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl90YXJnZXQse2NoaWxkTGlzdDohMH0pKSksdGhpcy5fY29ubmVjdGVkPSEwfWRpc2Nvbm5lY3QoKXtPaSh0aGlzLl90YXJnZXQpP3RoaXMuX3VubGlzdGVuU2xvdHMoW3RoaXMuX3RhcmdldF0pOlkodGhpcy5fdGFyZ2V0KS5jaGlsZHJlbiYmKHRoaXMuX3VubGlzdGVuU2xvdHMoWSh0aGlzLl90YXJnZXQpLmNoaWxkcmVuKSx3aW5kb3cuU2hhZHlET00mJnRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlcj8od2luZG93LlNoYWR5RE9NLnVub2JzZXJ2ZUNoaWxkcmVuKHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlciksdGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyPW51bGwpOnRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXImJih0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyLmRpc2Nvbm5lY3QoKSx0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyPW51bGwpKSx0aGlzLl9jb25uZWN0ZWQ9ITF9X3NjaGVkdWxlKCl7dGhpcy5fc2NoZWR1bGVkfHwodGhpcy5fc2NoZWR1bGVkPSEwLHZ0LnJ1bigoKCk9PnRoaXMuZmx1c2goKSkpKX1fcHJvY2Vzc011dGF0aW9ucyh0KXt0aGlzLl9wcm9jZXNzU2xvdE11dGF0aW9ucyh0KSx0aGlzLmZsdXNoKCl9X3Byb2Nlc3NTbG90TXV0YXRpb25zKHQpe2lmKHQpZm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2xldCBuPXRbZV07bi5hZGRlZE5vZGVzJiZ0aGlzLl9saXN0ZW5TbG90cyhuLmFkZGVkTm9kZXMpLG4ucmVtb3ZlZE5vZGVzJiZ0aGlzLl91bmxpc3RlblNsb3RzKG4ucmVtb3ZlZE5vZGVzKX19Zmx1c2goKXtpZighdGhpcy5fY29ubmVjdGVkKXJldHVybiExO3dpbmRvdy5TaGFkeURPTSYmU2hhZHlET00uZmx1c2goKSx0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyP3RoaXMuX3Byb2Nlc3NTbG90TXV0YXRpb25zKHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIudGFrZVJlY29yZHMoKSk6dGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyJiZ0aGlzLl9wcm9jZXNzU2xvdE11dGF0aW9ucyh0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIudGFrZVJlY29yZHMoKSksdGhpcy5fc2NoZWR1bGVkPSExO2xldCB0PXt0YXJnZXQ6dGhpcy5fdGFyZ2V0LGFkZGVkTm9kZXM6W10scmVtb3ZlZE5vZGVzOltdfSxlPXRoaXMuY29uc3RydWN0b3IuZ2V0RmxhdHRlbmVkTm9kZXModGhpcy5fdGFyZ2V0KSxuPUlpKGUsdGhpcy5fZWZmZWN0aXZlTm9kZXMpO2ZvcihsZXQgZSxpPTA7aTxuLmxlbmd0aCYmKGU9bltpXSk7aSsrKWZvcihsZXQgbixpPTA7aTxlLnJlbW92ZWQubGVuZ3RoJiYobj1lLnJlbW92ZWRbaV0pO2krKyl0LnJlbW92ZWROb2Rlcy5wdXNoKG4pO2ZvcihsZXQgaSxyPTA7cjxuLmxlbmd0aCYmKGk9bltyXSk7cisrKWZvcihsZXQgbj1pLmluZGV4O248aS5pbmRleCtpLmFkZGVkQ291bnQ7bisrKXQuYWRkZWROb2Rlcy5wdXNoKGVbbl0pO3RoaXMuX2VmZmVjdGl2ZU5vZGVzPWU7bGV0IGk9ITE7cmV0dXJuKHQuYWRkZWROb2Rlcy5sZW5ndGh8fHQucmVtb3ZlZE5vZGVzLmxlbmd0aCkmJihpPSEwLHRoaXMuY2FsbGJhY2suY2FsbCh0aGlzLl90YXJnZXQsdCkpLGl9X2xpc3RlblNsb3RzKHQpe2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtsZXQgbj10W2VdO09pKG4pJiZuLmFkZEV2ZW50TGlzdGVuZXIoInNsb3RjaGFuZ2UiLHRoaXMuX2JvdW5kU2NoZWR1bGUpfX1fdW5saXN0ZW5TbG90cyh0KXtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl7bGV0IG49dFtlXTtPaShuKSYmbi5yZW1vdmVFdmVudExpc3RlbmVyKCJzbG90Y2hhbmdlIix0aGlzLl9ib3VuZFNjaGVkdWxlKX19fTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9jb25zdCBEaT1mdW5jdGlvbigpe2xldCB0LGU7ZG97dD13aW5kb3cuU2hhZHlET00mJlNoYWR5RE9NLmZsdXNoKCksd2luZG93LlNoYWR5Q1NTJiZ3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0mJndpbmRvdy5TaGFkeUNTUy5TY29waW5nU2hpbS5mbHVzaCgpLGU9a24oKX13aGlsZSh0fHxlKX0sQmk9RWxlbWVudC5wcm90b3R5cGUsSGk9QmkubWF0Y2hlc3x8QmkubWF0Y2hlc1NlbGVjdG9yfHxCaS5tb3pNYXRjaGVzU2VsZWN0b3J8fEJpLm1zTWF0Y2hlc1NlbGVjdG9yfHxCaS5vTWF0Y2hlc1NlbGVjdG9yfHxCaS53ZWJraXRNYXRjaGVzU2VsZWN0b3IsRmk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gSGkuY2FsbCh0LGUpfTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9jbGFzcyBWaXtjb25zdHJ1Y3Rvcih0KXt3aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS5pblVzZSYmd2luZG93LlNoYWR5RE9NLnBhdGNoKHQpLHRoaXMubm9kZT10fW9ic2VydmVOb2Rlcyh0KXtyZXR1cm4gbmV3IHppKHRoaXMubm9kZSx0KX11bm9ic2VydmVOb2Rlcyh0KXt0LmRpc2Nvbm5lY3QoKX1ub3RpZnlPYnNlcnZlcigpe31kZWVwQ29udGFpbnModCl7aWYoWSh0aGlzLm5vZGUpLmNvbnRhaW5zKHQpKXJldHVybiEwO2xldCBlPXQsbj10Lm93bmVyRG9jdW1lbnQ7Zm9yKDtlJiZlIT09biYmZSE9PXRoaXMubm9kZTspZT1ZKGUpLnBhcmVudE5vZGV8fFkoZSkuaG9zdDtyZXR1cm4gZT09PXRoaXMubm9kZX1nZXRPd25lclJvb3QoKXtyZXR1cm4gWSh0aGlzLm5vZGUpLmdldFJvb3ROb2RlKCl9Z2V0RGlzdHJpYnV0ZWROb2Rlcygpe3JldHVybiJzbG90Ij09PXRoaXMubm9kZS5sb2NhbE5hbWU/WSh0aGlzLm5vZGUpLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46ITB9KTpbXX1nZXREZXN0aW5hdGlvbkluc2VydGlvblBvaW50cygpe2xldCB0PVtdLGU9WSh0aGlzLm5vZGUpLmFzc2lnbmVkU2xvdDtmb3IoO2U7KXQucHVzaChlKSxlPVkoZSkuYXNzaWduZWRTbG90O3JldHVybiB0fWltcG9ydE5vZGUodCxlKXtsZXQgbj10aGlzLm5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudD90aGlzLm5vZGU6dGhpcy5ub2RlLm93bmVyRG9jdW1lbnQ7cmV0dXJuIFkobikuaW1wb3J0Tm9kZSh0LGUpfWdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKXtyZXR1cm4gemkuZ2V0RmxhdHRlbmVkTm9kZXModGhpcy5ub2RlKX1xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHModCl7bGV0IGU9dGhpcy5nZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCksbj1bXTtmb3IobGV0IGkscj0wLG89ZS5sZW5ndGg7cjxvJiYoaT1lW3JdKTtyKyspaS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZGaShpLHQpJiZuLnB1c2goaSk7cmV0dXJuIG59Z2V0IGFjdGl2ZUVsZW1lbnQoKXtsZXQgdD10aGlzLm5vZGU7cmV0dXJuIHZvaWQgMCE9PXQuX2FjdGl2ZUVsZW1lbnQ/dC5fYWN0aXZlRWxlbWVudDp0LmFjdGl2ZUVsZW1lbnR9fWZ1bmN0aW9uIFVpKHQsZSl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2xldCBpPWVbbl07T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaSx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZVtpXX0sY29uZmlndXJhYmxlOiEwfSl9fWNsYXNzIGppe2NvbnN0cnVjdG9yKHQpe3RoaXMuZXZlbnQ9dH1nZXQgcm9vdFRhcmdldCgpe3JldHVybiB0aGlzLnBhdGhbMF19Z2V0IGxvY2FsVGFyZ2V0KCl7cmV0dXJuIHRoaXMuZXZlbnQudGFyZ2V0fWdldCBwYXRoKCl7cmV0dXJuIHRoaXMuZXZlbnQuY29tcG9zZWRQYXRoKCl9fWxldCBHaT1WaTtpZih3aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS5pblVzZSYmd2luZG93LlNoYWR5RE9NLm5vUGF0Y2gmJndpbmRvdy5TaGFkeURPTS5XcmFwcGVyKXtjbGFzcyB0IGV4dGVuZHMgd2luZG93LlNoYWR5RE9NLldyYXBwZXJ7fU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFZpLnByb3RvdHlwZSkuZm9yRWFjaCgoZT0+eyJhY3RpdmVFbGVtZW50IiE9ZSYmKHQucHJvdG90eXBlW2VdPVZpLnByb3RvdHlwZVtlXSl9KSksVWkodC5wcm90b3R5cGUsWyJjbGFzc0xpc3QiXSksR2k9dCxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhqaS5wcm90b3R5cGUse2xvY2FsVGFyZ2V0OntnZXQoKXtjb25zdCB0PXRoaXMuZXZlbnQuY3VycmVudFRhcmdldCxlPXQmJllpKHQpLmdldE93bmVyUm9vdCgpLG49dGhpcy5wYXRoO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKXtjb25zdCBpPW5bdF07aWYoWWkoaSkuZ2V0T3duZXJSb290KCk9PT1lKXJldHVybiBpfX0sY29uZmlndXJhYmxlOiEwfSxwYXRoOntnZXQoKXtyZXR1cm4gd2luZG93LlNoYWR5RE9NLmNvbXBvc2VkUGF0aCh0aGlzLmV2ZW50KX0sY29uZmlndXJhYmxlOiEwfX0pfWVsc2UhKGZ1bmN0aW9uIFdpKHQsZSl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2xldCBpPWVbbl07dFtpXT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGVbaV0uYXBwbHkodGhpcy5ub2RlLGFyZ3VtZW50cyl9fX0pKFZpLnByb3RvdHlwZSxbImNsb25lTm9kZSIsImFwcGVuZENoaWxkIiwiaW5zZXJ0QmVmb3JlIiwicmVtb3ZlQ2hpbGQiLCJyZXBsYWNlQ2hpbGQiLCJzZXRBdHRyaWJ1dGUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJxdWVyeVNlbGVjdG9yIiwicXVlcnlTZWxlY3RvckFsbCJdKSxVaShWaS5wcm90b3R5cGUsWyJwYXJlbnROb2RlIiwiZmlyc3RDaGlsZCIsImxhc3RDaGlsZCIsIm5leHRTaWJsaW5nIiwicHJldmlvdXNTaWJsaW5nIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJsYXN0RWxlbWVudENoaWxkIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwicHJldmlvdXNFbGVtZW50U2libGluZyIsImNoaWxkTm9kZXMiLCJjaGlsZHJlbiIsImNsYXNzTGlzdCJdKSwoZnVuY3Rpb24gcWkodCxlKXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7bGV0IGk9ZVtuXTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlW2ldfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5ub2RlW2ldPXR9LGNvbmZpZ3VyYWJsZTohMH0pfX0pKFZpLnByb3RvdHlwZSxbInRleHRDb250ZW50IiwiaW5uZXJIVE1MIiwiY2xhc3NOYW1lIl0pO2NvbnN0IFlpPWZ1bmN0aW9uKHQpe2lmKCh0PXR8fGRvY3VtZW50KWluc3RhbmNlb2YgR2kpcmV0dXJuIHQ7aWYodCBpbnN0YW5jZW9mIGppKXJldHVybiB0O2xldCBlPXQuX19kb21BcGk7cmV0dXJuIGV8fChlPXQgaW5zdGFuY2VvZiBFdmVudD9uZXcgamkodCk6bmV3IEdpKHQpLHQuX19kb21BcGk9ZSksZX0sWGk9d2luZG93LlNoYWR5RE9NLCRpPXdpbmRvdy5TaGFkeUNTUzsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE5IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9mdW5jdGlvbiBLaSh0LGUpe3JldHVybiBZKHQpLmdldFJvb3ROb2RlKCk9PT1lfQovKioKICAgICAqIEBmaWxlb3ZlcnZpZXcKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tQcm90b3R5cGFsVHlwZXN9CiAgICAgKiBAbGljZW5zZSBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZAogICAgICogYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heQogICAgICogYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieQogICAgICogR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUAogICAgICogcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgICovCmNvbnN0IFppPSJkaXNhYmxlLXVwZ3JhZGUiLEppPXQ9Pntmb3IoO3Q7KXtjb25zdCBlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwib2JzZXJ2ZWRBdHRyaWJ1dGVzIik7aWYoZSlyZXR1cm4gZS5nZXQ7dD1PYmplY3QuZ2V0UHJvdG90eXBlT2YodC5wcm90b3R5cGUpLmNvbnN0cnVjdG9yfXJldHVybigpPT5bXX07SSgodD0+e2NvbnN0IGU9bWUodCk7bGV0IG49SmkoZSk7cmV0dXJuIGNsYXNzIGV4dGVuZHMgZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCl9c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKXtyZXR1cm4gbi5jYWxsKHRoaXMpLmNvbmNhdChaaSl9X2luaXRpYWxpemVQcm9wZXJ0aWVzKCl7dGhpcy5oYXNBdHRyaWJ1dGUoWmkpP3RoaXMuX19pc1VwZ3JhZGVEaXNhYmxlZD0hMDpzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKX1fZW5hYmxlUHJvcGVydGllcygpe3RoaXMuX19pc1VwZ3JhZGVEaXNhYmxlZHx8c3VwZXIuX2VuYWJsZVByb3BlcnRpZXMoKX1fY2FuQXBwbHlQcm9wZXJ0eURlZmF1bHQodCl7cmV0dXJuIHN1cGVyLl9jYW5BcHBseVByb3BlcnR5RGVmYXVsdCh0KSYmISh0aGlzLl9faXNVcGdyYWRlRGlzYWJsZWQmJnRoaXMuX2lzUHJvcGVydHlQZW5kaW5nKHQpKX1hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodCxlLG4saSl7dD09Wmk/dGhpcy5fX2lzVXBncmFkZURpc2FibGVkJiZudWxsPT1uJiYoc3VwZXIuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCksdGhpcy5fX2lzVXBncmFkZURpc2FibGVkPSExLFkodGhpcykuaXNDb25uZWN0ZWQmJnN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCkpOnN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0LGUsbixpKX1jb25uZWN0ZWRDYWxsYmFjaygpe3RoaXMuX19pc1VwZ3JhZGVEaXNhYmxlZHx8c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKX1kaXNjb25uZWN0ZWRDYWxsYmFjaygpe3RoaXMuX19pc1VwZ3JhZGVEaXNhYmxlZHx8c3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKX19fSkpOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBRaT0iZGlzYWJsZS11cGdyYWRlIjtsZXQgdHI9d2luZG93LlNoYWR5Q1NTO2NvbnN0IGVyPUkoKHQ9Pntjb25zdCBlPXBpKG1lKHQpKSxuPWZlP2U6TWkoZSksaT1KaShuKSxyPXt4OiJwYW4teCIseToicGFuLXkiLG5vbmU6Im5vbmUiLGFsbDoiYXV0byJ9O2NsYXNzIG8gZXh0ZW5kcyBue2NvbnN0cnVjdG9yKCl7c3VwZXIoKX1zdGF0aWMgZ2V0IGltcG9ydE1ldGEoKXtyZXR1cm4gdGhpcy5wcm90b3R5cGUuaW1wb3J0TWV0YX1jcmVhdGVkKCl7fV9fYXR0cmlidXRlUmVhY3Rpb24odCxlLG4peyh0aGlzLl9fZGF0YUF0dHJpYnV0ZXMmJnRoaXMuX19kYXRhQXR0cmlidXRlc1t0XXx8dD09PVFpKSYmdGhpcy5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodCxlLG4sbnVsbCl9c2V0QXR0cmlidXRlKHQsZSl7aWYoTCYmIXRoaXMuX2xlZ2FjeUZvcmNlT2JzZXJ2ZWRBdHRyaWJ1dGVzKXtjb25zdCBuPXRoaXMuZ2V0QXR0cmlidXRlKHQpO3N1cGVyLnNldEF0dHJpYnV0ZSh0LGUpLHRoaXMuX19hdHRyaWJ1dGVSZWFjdGlvbih0LG4sU3RyaW5nKGUpKX1lbHNlIHN1cGVyLnNldEF0dHJpYnV0ZSh0LGUpfXJlbW92ZUF0dHJpYnV0ZSh0KXtpZihMJiYhdGhpcy5fbGVnYWN5Rm9yY2VPYnNlcnZlZEF0dHJpYnV0ZXMpe2NvbnN0IGU9dGhpcy5nZXRBdHRyaWJ1dGUodCk7c3VwZXIucmVtb3ZlQXR0cmlidXRlKHQpLHRoaXMuX19hdHRyaWJ1dGVSZWFjdGlvbih0LGUsbnVsbCl9ZWxzZSBzdXBlci5yZW1vdmVBdHRyaWJ1dGUodCl9c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKXtyZXR1cm4gTCYmIXRoaXMucHJvdG90eXBlLl9sZWdhY3lGb3JjZU9ic2VydmVkQXR0cmlidXRlcz8odGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJfX29ic2VydmVkQXR0cmlidXRlcyIsdGhpcykpfHwodGhpcy5fX29ic2VydmVkQXR0cmlidXRlcz1bXSksdGhpcy5fX29ic2VydmVkQXR0cmlidXRlcyk6aS5jYWxsKHRoaXMpLmNvbmNhdChRaSl9X2VuYWJsZVByb3BlcnRpZXMoKXt0aGlzLl9faXNVcGdyYWRlRGlzYWJsZWR8fHN1cGVyLl9lbmFibGVQcm9wZXJ0aWVzKCl9X2NhbkFwcGx5UHJvcGVydHlEZWZhdWx0KHQpe3JldHVybiBzdXBlci5fY2FuQXBwbHlQcm9wZXJ0eURlZmF1bHQodCkmJiEodGhpcy5fX2lzVXBncmFkZURpc2FibGVkJiZ0aGlzLl9pc1Byb3BlcnR5UGVuZGluZyh0KSl9Y29ubmVjdGVkQ2FsbGJhY2soKXt0aGlzLl9fbmVlZHNBdHRyaWJ1dGVzQXRDb25uZWN0ZWQmJnRoaXMuX3Rha2VBdHRyaWJ1dGVzKCksdGhpcy5fX2lzVXBncmFkZURpc2FibGVkfHwoc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLmlzQXR0YWNoZWQ9ITAsdGhpcy5hdHRhY2hlZCgpKX1hdHRhY2hlZCgpe31kaXNjb25uZWN0ZWRDYWxsYmFjaygpe3RoaXMuX19pc1VwZ3JhZGVEaXNhYmxlZHx8KHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCksdGhpcy5pc0F0dGFjaGVkPSExLHRoaXMuZGV0YWNoZWQoKSl9ZGV0YWNoZWQoKXt9YXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHQsZSxuLGkpe2UhPT1uJiYodD09UWk/dGhpcy5fX2lzVXBncmFkZURpc2FibGVkJiZudWxsPT1uJiYodGhpcy5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKSx0aGlzLl9faXNVcGdyYWRlRGlzYWJsZWQ9ITEsWSh0aGlzKS5pc0Nvbm5lY3RlZCYmdGhpcy5jb25uZWN0ZWRDYWxsYmFjaygpKTooc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHQsZSxuLGkpLHRoaXMuYXR0cmlidXRlQ2hhbmdlZCh0LGUsbikpKX1hdHRyaWJ1dGVDaGFuZ2VkKHQsZSxuKXt9X2luaXRpYWxpemVQcm9wZXJ0aWVzKCl7aWYodyYmdGhpcy5oYXNBdHRyaWJ1dGUoUWkpKXRoaXMuX19pc1VwZ3JhZGVEaXNhYmxlZD0hMDtlbHNle2xldCB0PU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTt0Lmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl9faGFzUmVnaXN0ZXJGaW5pc2hlZCIsdCkpfHwodGhpcy5fcmVnaXN0ZXJlZCgpLHQuX19oYXNSZWdpc3RlckZpbmlzaGVkPSEwKSxzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKSx0aGlzLnJvb3Q9dGhpcyx0aGlzLmNyZWF0ZWQoKSxMJiYhdGhpcy5fbGVnYWN5Rm9yY2VPYnNlcnZlZEF0dHJpYnV0ZXMmJih0aGlzLmhhc0F0dHJpYnV0ZXMoKT90aGlzLl90YWtlQXR0cmlidXRlcygpOnRoaXMucGFyZW50Tm9kZXx8KHRoaXMuX19uZWVkc0F0dHJpYnV0ZXNBdENvbm5lY3RlZD0hMCkpLHRoaXMuX2FwcGx5TGlzdGVuZXJzKCl9fV90YWtlQXR0cmlidXRlcygpe2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgbj10W2VdO3RoaXMuX19hdHRyaWJ1dGVSZWFjdGlvbihuLm5hbWUsbnVsbCxuLnZhbHVlKX19X3JlZ2lzdGVyZWQoKXt9cmVhZHkoKXt0aGlzLl9lbnN1cmVBdHRyaWJ1dGVzKCksc3VwZXIucmVhZHkoKX1fZW5zdXJlQXR0cmlidXRlcygpe31fYXBwbHlMaXN0ZW5lcnMoKXt9c2VyaWFsaXplKHQpe3JldHVybiB0aGlzLl9zZXJpYWxpemVWYWx1ZSh0KX1kZXNlcmlhbGl6ZSh0LGUpe3JldHVybiB0aGlzLl9kZXNlcmlhbGl6ZVZhbHVlKHQsZSl9cmVmbGVjdFByb3BlcnR5VG9BdHRyaWJ1dGUodCxlLG4pe3RoaXMuX3Byb3BlcnR5VG9BdHRyaWJ1dGUodCxlLG4pfXNlcmlhbGl6ZVZhbHVlVG9BdHRyaWJ1dGUodCxlLG4pe3RoaXMuX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKG58fHRoaXMsdCxlKX1leHRlbmQodCxlKXtpZighdHx8IWUpcmV0dXJuIHR8fGU7bGV0IG49T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSk7Zm9yKGxldCBpLHI9MDtyPG4ubGVuZ3RoJiYoaT1uW3JdKTtyKyspe2xldCBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxpKTtuJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLG4pfXJldHVybiB0fW1peGluKHQsZSl7Zm9yKGxldCBuIGluIGUpdFtuXT1lW25dO3JldHVybiB0fWNoYWluT2JqZWN0KHQsZSl7cmV0dXJuIHQmJmUmJnQhPT1lJiYodC5fX3Byb3RvX189ZSksdH1pbnN0YW5jZVRlbXBsYXRlKHQpe2xldCBlPXRoaXMuY29uc3RydWN0b3IuX2NvbnRlbnRGb3JUZW1wbGF0ZSh0KTtyZXR1cm4gZG9jdW1lbnQuaW1wb3J0Tm9kZShlLCEwKX1maXJlKHQsZSxuKXtuPW58fHt9LGU9bnVsbD09ZT97fTplO2xldCBpPW5ldyBFdmVudCh0LHtidWJibGVzOnZvaWQgMD09PW4uYnViYmxlc3x8bi5idWJibGVzLGNhbmNlbGFibGU6Qm9vbGVhbihuLmNhbmNlbGFibGUpLGNvbXBvc2VkOnZvaWQgMD09PW4uY29tcG9zZWR8fG4uY29tcG9zZWR9KTtyZXR1cm4gaS5kZXRhaWw9ZSxZKG4ubm9kZXx8dGhpcykuZGlzcGF0Y2hFdmVudChpKSxpfWxpc3Rlbih0LGUsbil7dD10fHx0aGlzO2xldCBpPXRoaXMuX19ib3VuZExpc3RlbmVyc3x8KHRoaXMuX19ib3VuZExpc3RlbmVycz1uZXcgV2Vha01hcCkscj1pLmdldCh0KTtyfHwocj17fSxpLnNldCh0LHIpKTtsZXQgbz1lK247cltvXXx8KHJbb109dGhpcy5fYWRkTWV0aG9kRXZlbnRMaXN0ZW5lclRvTm9kZSh0LGUsbix0aGlzKSl9dW5saXN0ZW4odCxlLG4pe3Q9dHx8dGhpcztsZXQgaT10aGlzLl9fYm91bmRMaXN0ZW5lcnMmJnRoaXMuX19ib3VuZExpc3RlbmVycy5nZXQodCkscj1lK24sbz1pJiZpW3JdO28mJih0aGlzLl9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUodCxlLG8pLGlbcl09bnVsbCl9c2V0U2Nyb2xsRGlyZWN0aW9uKHQsZSl7b2koZXx8dGhpcyxyW3RdfHwiYXV0byIpfSQkKHQpe3JldHVybiB0aGlzLnJvb3QucXVlcnlTZWxlY3Rvcih0KX1nZXQgZG9tSG9zdCgpe2xldCB0PVkodGhpcykuZ2V0Um9vdE5vZGUoKTtyZXR1cm4gdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQ/dC5ob3N0OnR9ZGlzdHJpYnV0ZUNvbnRlbnQoKXtjb25zdCB0PVlpKHRoaXMpO3dpbmRvdy5TaGFkeURPTSYmdC5zaGFkb3dSb290JiZTaGFkeURPTS5mbHVzaCgpfWdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKXtyZXR1cm4gWWkodGhpcykuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpfXF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyh0KXtyZXR1cm4gWWkodGhpcykucXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHQpfWdldEVmZmVjdGl2ZUNoaWxkcmVuKCl7cmV0dXJuIHRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERX0pKX1nZXRFZmZlY3RpdmVUZXh0Q29udGVudCgpe2xldCB0PXRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpLGU9W107Zm9yKGxldCBuLGk9MDtuPXRbaV07aSsrKW4ubm9kZVR5cGUhPT1Ob2RlLkNPTU1FTlRfTk9ERSYmZS5wdXNoKG4udGV4dENvbnRlbnQpO3JldHVybiBlLmpvaW4oIiIpfXF1ZXJ5RWZmZWN0aXZlQ2hpbGRyZW4odCl7bGV0IGU9dGhpcy5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHModCk7cmV0dXJuIGUmJmVbMF19cXVlcnlBbGxFZmZlY3RpdmVDaGlsZHJlbih0KXtyZXR1cm4gdGhpcy5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHModCl9Z2V0Q29udGVudENoaWxkTm9kZXModCl7bGV0IGU9dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IodHx8InNsb3QiKTtyZXR1cm4gZT9ZaShlKS5nZXREaXN0cmlidXRlZE5vZGVzKCk6W119Z2V0Q29udGVudENoaWxkcmVuKHQpe3JldHVybiB0aGlzLmdldENvbnRlbnRDaGlsZE5vZGVzKHQpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERX0pKX1pc0xpZ2h0RGVzY2VuZGFudCh0KXtjb25zdCBlPXRoaXM7cmV0dXJuIGUhPT10JiZZKGUpLmNvbnRhaW5zKHQpJiZZKGUpLmdldFJvb3ROb2RlKCk9PT1ZKHQpLmdldFJvb3ROb2RlKCl9aXNMb2NhbERlc2NlbmRhbnQodCl7cmV0dXJuIHRoaXMucm9vdD09PVkodCkuZ2V0Um9vdE5vZGUoKX1zY29wZVN1YnRyZWUodCxlPSExKXtyZXR1cm4oZnVuY3Rpb24gbih0LGU9ITEpe2lmKCFYaXx8ISRpKXJldHVybiBudWxsO2lmKCFYaS5oYW5kbGVzRHluYW1pY1Njb3BpbmcpcmV0dXJuIG51bGw7Y29uc3Qgbj0kaS5TY29waW5nU2hpbTtpZighbilyZXR1cm4gbnVsbDtjb25zdCBpPW4uc2NvcGVGb3JOb2RlKHQpLHI9WSh0KS5nZXRSb290Tm9kZSgpLG89dD0+e2lmKCFLaSh0LHIpKXJldHVybjtjb25zdCBlPUFycmF5LmZyb20oWGkubmF0aXZlTWV0aG9kcy5xdWVyeVNlbGVjdG9yQWxsLmNhbGwodCwiKiIpKTtlLnB1c2godCk7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2NvbnN0IG89ZVt0XTtpZighS2kobyxyKSljb250aW51ZTtjb25zdCBhPW4uY3VycmVudFNjb3BlRm9yTm9kZShvKTthIT09aSYmKCIiIT09YSYmbi51bnNjb3BlTm9kZShvLGEpLG4uc2NvcGVOb2RlKG8saSkpfX07aWYobyh0KSxlKXtjb25zdCBlPW5ldyBNdXRhdGlvbk9ic2VydmVyKCh0PT57Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2NvbnN0IG49dFtlXTtmb3IobGV0IHQ9MDt0PG4uYWRkZWROb2Rlcy5sZW5ndGg7dCsrKXtjb25zdCBlPW4uYWRkZWROb2Rlc1t0XTtlLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJm8oZSl9fX0pKTtyZXR1cm4gZS5vYnNlcnZlKHQse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSksZX1yZXR1cm4gbnVsbH0pKHQsZSl9Z2V0Q29tcHV0ZWRTdHlsZVZhbHVlKHQpe3JldHVybiB0ci5nZXRDb21wdXRlZFN0eWxlVmFsdWUodGhpcyx0KX1kZWJvdW5jZSh0LGUsbil7cmV0dXJuIHRoaXMuX2RlYm91bmNlcnM9dGhpcy5fZGVib3VuY2Vyc3x8e30sdGhpcy5fZGVib3VuY2Vyc1t0XT1Ubi5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZXJzW3RdLG4+MD9ndC5hZnRlcihuKTp2dCxlLmJpbmQodGhpcykpfWlzRGVib3VuY2VyQWN0aXZlKHQpe3RoaXMuX2RlYm91bmNlcnM9dGhpcy5fZGVib3VuY2Vyc3x8e307bGV0IGU9dGhpcy5fZGVib3VuY2Vyc1t0XTtyZXR1cm4hKCFlfHwhZS5pc0FjdGl2ZSgpKX1mbHVzaERlYm91bmNlcih0KXt0aGlzLl9kZWJvdW5jZXJzPXRoaXMuX2RlYm91bmNlcnN8fHt9O2xldCBlPXRoaXMuX2RlYm91bmNlcnNbdF07ZSYmZS5mbHVzaCgpfWNhbmNlbERlYm91bmNlcih0KXt0aGlzLl9kZWJvdW5jZXJzPXRoaXMuX2RlYm91bmNlcnN8fHt9O2xldCBlPXRoaXMuX2RlYm91bmNlcnNbdF07ZSYmZS5jYW5jZWwoKX1hc3luYyh0LGUpe3JldHVybiBlPjA/Z3QucnVuKHQuYmluZCh0aGlzKSxlKTp+dnQucnVuKHQuYmluZCh0aGlzKSl9Y2FuY2VsQXN5bmModCl7dDwwP3Z0LmNhbmNlbCh+dCk6Z3QuY2FuY2VsKHQpfWNyZWF0ZSh0LGUpe2xldCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodCk7aWYoZSlpZihuLnNldFByb3BlcnRpZXMpbi5zZXRQcm9wZXJ0aWVzKGUpO2Vsc2UgZm9yKGxldCB0IGluIGUpblt0XT1lW3RdO3JldHVybiBufWVsZW1lbnRNYXRjaGVzKHQsZSl7cmV0dXJuIEZpKGV8fHRoaXMsdCl9dG9nZ2xlQXR0cmlidXRlKHQsZSl7bGV0IG49dGhpcztyZXR1cm4gMz09PWFyZ3VtZW50cy5sZW5ndGgmJihuPWFyZ3VtZW50c1syXSksMT09YXJndW1lbnRzLmxlbmd0aCYmKGU9IW4uaGFzQXR0cmlidXRlKHQpKSxlPyhZKG4pLnNldEF0dHJpYnV0ZSh0LCIiKSwhMCk6KFkobikucmVtb3ZlQXR0cmlidXRlKHQpLCExKX10b2dnbGVDbGFzcyh0LGUsbil7bj1ufHx0aGlzLDE9PWFyZ3VtZW50cy5sZW5ndGgmJihlPSFuLmNsYXNzTGlzdC5jb250YWlucyh0KSksZT9uLmNsYXNzTGlzdC5hZGQodCk6bi5jbGFzc0xpc3QucmVtb3ZlKHQpfXRyYW5zZm9ybSh0LGUpeyhlPWV8fHRoaXMpLnN0eWxlLndlYmtpdFRyYW5zZm9ybT10LGUuc3R5bGUudHJhbnNmb3JtPXR9dHJhbnNsYXRlM2QodCxlLG4saSl7dGhpcy50cmFuc2Zvcm0oInRyYW5zbGF0ZTNkKCIrdCsiLCIrZSsiLCIrbisiKSIsaT1pfHx0aGlzKX1hcnJheURlbGV0ZSh0LGUpe2xldCBuO2lmKEFycmF5LmlzQXJyYXkodCkpe2lmKG49dC5pbmRleE9mKGUpLG4+PTApcmV0dXJuIHQuc3BsaWNlKG4sMSl9ZWxzZSBpZihuPW50KHRoaXMsdCkuaW5kZXhPZihlKSxuPj0wKXJldHVybiB0aGlzLnNwbGljZSh0LG4sMSk7cmV0dXJuIG51bGx9X2xvZ2dlcih0LGUpe3N3aXRjaChBcnJheS5pc0FycmF5KGUpJiYxPT09ZS5sZW5ndGgmJkFycmF5LmlzQXJyYXkoZVswXSkmJihlPWVbMF0pLHQpe2Nhc2UibG9nIjpjYXNlIndhcm4iOmNhc2UiZXJyb3IiOmNvbnNvbGVbdF0oLi4uZSl9fV9sb2coLi4udCl7dGhpcy5fbG9nZ2VyKCJsb2ciLHQpfV93YXJuKC4uLnQpe3RoaXMuX2xvZ2dlcigid2FybiIsdCl9X2Vycm9yKC4uLnQpe3RoaXMuX2xvZ2dlcigiZXJyb3IiLHQpfV9sb2dmKHQsLi4uZSl7cmV0dXJuWyJbJXM6OiVzXSIsdGhpcy5pcyx0LC4uLmVdfX1yZXR1cm4gby5wcm90b3R5cGUuaXM9IiIsb30pKTtmdW5jdGlvbiBucih0LGUpe2xldCBuPTAsaT0wO2Zvcig7Oyl7aWYobj09PXQubGVuZ3RoKXJldHVybiBpPT09ZS5sZW5ndGg/MDotMTtpZihpPT09ZS5sZW5ndGgpcmV0dXJuIDE7aWYocnIodFtuXSkmJnJyKGVbaV0pKXtjb25zdCByPW4sbz1pO249aXIodCxuKzEpLGk9aXIoZSxpKzEpO2NvbnN0IGE9cGFyc2VGbG9hdCh0LnNsaWNlKHIsbikpLHM9cGFyc2VGbG9hdChlLnNsaWNlKG8saSkpO2lmKGE8cylyZXR1cm4tMTtpZihhPnMpcmV0dXJuIDF9ZWxzZXtpZihvcih0W25dKSl7aWYoIW9yKGVbaV0pKXJldHVybi0xfWVsc2V7aWYob3IoZVtpXSkpcmV0dXJuIDE7aWYodFtuXTxlW2ldKXJldHVybi0xO2lmKHRbbl0+ZVtpXSlyZXR1cm4gMX1uKyssaSsrfX19ZnVuY3Rpb24gaXIodCxlKXtsZXQgbjshKGZ1bmN0aW9uKHQpe3RbdC5OQVRVUkFMPTBdPSJOQVRVUkFMIix0W3QuUkVBTD0xXT0iUkVBTCIsdFt0LkVYUE9ORU5UX1NJR049Ml09IkVYUE9ORU5UX1NJR04iLHRbdC5FWFBPTkVOVD0zXT0iRVhQT05FTlQifSkobnx8KG49e30pKTtsZXQgaT1uLk5BVFVSQUw7Zm9yKDtlPHQubGVuZ3RoO2UrKylpZihpPT09bi5OQVRVUkFMKXtpZigiLiI9PT10W2VdKWk9bi5SRUFMO2Vsc2UgaWYoImUiPT09dFtlXXx8IkUiPT09dFtlXSlpPW4uRVhQT05FTlRfU0lHTjtlbHNlIGlmKCFycih0W2VdKSlicmVha31lbHNlIGlmKGk9PT1uLlJFQUwpe2lmKCJlIj09PXRbZV18fCJFIj09PXRbZV0paT1uLkVYUE9ORU5UX1NJR047ZWxzZSBpZighcnIodFtlXSkpYnJlYWt9ZWxzZSBpZihpPT09bi5FWFBPTkVOVF9TSUdOKXtpZighcnIodFtlXSkmJiIrIiE9PXRbZV0mJiItIiE9PXRbZV0pYnJlYWs7aT1uLkVYUE9ORU5UfWVsc2UgaWYoaT09PW4uRVhQT05FTlQmJiFycih0W2VdKSlicmVhaztyZXR1cm4gZX1mdW5jdGlvbiBycih0KXtyZXR1cm4iMCI8PXQmJnQ8PSI5In1mdW5jdGlvbiBvcih0KXtyZXR1cm4iLyI9PT10fHwiXyI9PT10fHxycih0KX1mdW5jdGlvbiBhcih0KXtyZXR1cm4gU2UuZXhwb3J0cy51bmlvbi5hcHBseShudWxsLFNlLmV4cG9ydHMudmFsdWVzKHQpKS5zb3J0KG5yKX1jbGFzcyBzciBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLm5hbWU9IlJlcXVlc3RDYW5jZWxsYXRpb25FcnJvciJ9fWNsYXNzIGxyIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5uYW1lPSJJbnZhbGlkUmVxdWVzdE9wdGlvbnNFcnJvciIsT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsbHIucHJvdG90eXBlKX19Y2xhc3MgY3IgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5tZXNzYWdlPWBSZXF1ZXN0TmV0d29ya0Vycm9yOiAke3Quc3RhdHVzfSBhdCAke2V9YCx0aGlzLm5hbWU9IlJlcXVlc3ROZXR3b3JrRXJyb3IiLHRoaXMucmVxPXQsdGhpcy51cmw9ZX19dmFyIHVyOyEoZnVuY3Rpb24odCl7dC5HRVQ9IkdFVCIsdC5QT1NUPSJQT1NUIn0pKHVyfHwodXI9e30pKTtjbGFzcyBocnt2YWxpZGF0ZSgpe2lmKHRoaXMubWV0aG9kVHlwZT09PXVyLkdFVCYmdGhpcy5ib2R5KXRocm93IG5ldyBscigiYm9keSBtdXN0IGJlIG1pc3NpbmcgZm9yIGEgR0VUIHJlcXVlc3QuIil9fWNsYXNzIGRye2NvbnN0cnVjdG9yKHQ9MWUzLGU9Myl7dGhpcy5fcXVldWU9W10sdGhpcy5fbkFjdGl2ZVJlcXVlc3RzPTAsdGhpcy5fblNpbXVsdGFuZW91c1JlcXVlc3RzPXQsdGhpcy5fbWF4UmV0cmllcz1lfXJlcXVlc3QodCxlKXtjb25zdCBuPShmdW5jdGlvbiBpKHQpe2NvbnN0IGU9bmV3IGhyO3JldHVybiB0PyhlLm1ldGhvZFR5cGU9dXIuUE9TVCxlLmJvZHk9KGZ1bmN0aW9uIG4odCl7Y29uc3QgZT1uZXcgRm9ybURhdGE7Zm9yKGNvbnN0W24saV1vZiBPYmplY3QuZW50cmllcyh0KSl7Y29uc3QgdD1BcnJheS5pc0FycmF5KGkpP2k6W2ldO2Zvcihjb25zdCBpIG9mIHQpZS5hcHBlbmQobixpKX1yZXR1cm4gZX0pKHQpLGUpOihlLm1ldGhvZFR5cGU9dXIuR0VULGUpfSkoZSk7cmV0dXJuIHRoaXMucmVxdWVzdFdpdGhPcHRpb25zKHQsbil9cmVxdWVzdFdpdGhPcHRpb25zKHQsZSl7cmV0dXJuIGUudmFsaWRhdGUoKSxuZXcgUHJvbWlzZSgoKHQsZSk9Pnt0aGlzLl9xdWV1ZS5wdXNoKHtyZXNvbHZlOnQscmVqZWN0OmV9KSx0aGlzLmxhdW5jaFJlcXVlc3RzKCl9KSkudGhlbigoKCk9PnRoaXMucHJvbWlzZVdpdGhSZXRyaWVzKHQsdGhpcy5fbWF4UmV0cmllcyxlKSkpLnRoZW4oKHQ9Pih0aGlzLl9uQWN0aXZlUmVxdWVzdHMtLSx0aGlzLmxhdW5jaFJlcXVlc3RzKCksdCkpLCh0PT4oIlJlcXVlc3ROZXR3b3JrRXJyb3IiPT09dC5uYW1lJiYodGhpcy5fbkFjdGl2ZVJlcXVlc3RzLS0sdGhpcy5sYXVuY2hSZXF1ZXN0cygpKSxQcm9taXNlLnJlamVjdCh0KSkpKX1mZXRjaCh0LGUpe3JldHVybiBuZXcgUHJvbWlzZSgoKHQsZSk9Pnt0aGlzLl9xdWV1ZS5wdXNoKHtyZXNvbHZlOnQscmVqZWN0OmV9KSx0aGlzLmxhdW5jaFJlcXVlc3RzKCl9KSkudGhlbigoKCk9PntsZXQgbj0xO3JldHVybiBuZXcgUHJvbWlzZSgoaT0+e2NvbnN0IHI9KCk9PntmZXRjaCh0LGUpLnRoZW4oKHQ9PntpZighdC5vayYmdGhpcy5fbWF4UmV0cmllcz5uKXJldHVybiBuKyssdm9pZCByKCk7aSh0KSx0aGlzLl9uQWN0aXZlUmVxdWVzdHMtLSx0aGlzLmxhdW5jaFJlcXVlc3RzKCl9KSl9O3IoKX0pKX0pKX1jbGVhclF1ZXVlKCl7Zm9yKDt0aGlzLl9xdWV1ZS5sZW5ndGg+MDspdGhpcy5fcXVldWUucG9wKCkucmVqZWN0KG5ldyBzcigiUmVxdWVzdCBjYW5jZWxsZWQgYnkgY2xlYXJRdWV1ZSIpKX1hY3RpdmVSZXF1ZXN0cygpe3JldHVybiB0aGlzLl9uQWN0aXZlUmVxdWVzdHN9b3V0c3RhbmRpbmdSZXF1ZXN0cygpe3JldHVybiB0aGlzLl9uQWN0aXZlUmVxdWVzdHMrdGhpcy5fcXVldWUubGVuZ3RofWxhdW5jaFJlcXVlc3RzKCl7Zm9yKDt0aGlzLl9uQWN0aXZlUmVxdWVzdHM8dGhpcy5fblNpbXVsdGFuZW91c1JlcXVlc3RzJiZ0aGlzLl9xdWV1ZS5sZW5ndGg+MDspdGhpcy5fbkFjdGl2ZVJlcXVlc3RzKyssdGhpcy5fcXVldWUucG9wKCkucmVzb2x2ZSh2b2lkIDApfXByb21pc2VXaXRoUmV0cmllcyh0LGUsbil7cmV0dXJuIHRoaXMuX3Byb21pc2VGcm9tVXJsKHQsbikudGhlbigodD0+dCksKGk9PmU+MD90aGlzLnByb21pc2VXaXRoUmV0cmllcyh0LGUtMSxuKTpQcm9taXNlLnJlamVjdChpKSkpfV9wcm9taXNlRnJvbVVybCh0LGUpe3JldHVybiBuZXcgUHJvbWlzZSgoKG4saSk9Pntjb25zdCByPShmdW5jdGlvbiBvKHQsZSxuLGkpe2NvbnN0IHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3JldHVybiByLm9wZW4odCxlKSxuJiYoci53aXRoQ3JlZGVudGlhbHM9biksaSYmci5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGkpLHJ9KShlLm1ldGhvZFR5cGUsdCxlLndpdGhDcmVkZW50aWFscyxlLmNvbnRlbnRUeXBlKTtyLm9ubG9hZD1mdW5jdGlvbigpezIwMD09PXIuc3RhdHVzP24oSlNPTi5wYXJzZShyLnJlc3BvbnNlVGV4dCkpOmkobmV3IGNyKHIsdCkpfSxyLm9uZXJyb3I9ZnVuY3Rpb24oKXtpKG5ldyBjcihyLHQpKX0sZS5ib2R5P3Iuc2VuZChlLmJvZHkpOnIuc2VuZCgpfSkpfX1jb25zdCBwcj0iZXhwZXJpbWVudGFsUGx1Z2luIixmcj1uZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO2xldCBtcj1ncigpO2Z1bmN0aW9uIGdyKHQ9ImRhdGEiLGU9ZnIpe3JldHVybiIvIj09PXRbdC5sZW5ndGgtMV0mJih0PXQuc2xpY2UoMCx0Lmxlbmd0aC0xKSkse2Vudmlyb25tZW50OigpPT55cih0LCIvZW52aXJvbm1lbnQiKSxleHBlcmltZW50czooKT0+eXIodCwiL2V4cGVyaW1lbnRzIikscGx1Z2luUm91dGU6KGUsbixpKT0+eXIodCsiL3BsdWdpbiIsYC8ke2V9JHtufWAsaSkscGx1Z2luc0xpc3Rpbmc6KCk9PnlyKHQsIi9wbHVnaW5zX2xpc3RpbmciLHZyKHtbcHJdOmUuZ2V0QWxsKHByKX0pKSxydW5zOigpPT55cih0LCIvcnVucyIpLHJ1bnNGb3JFeHBlcmltZW50OmU9PnlyKHQsIi9leHBlcmltZW50X3J1bnMiLHZyKHtleHBlcmltZW50OlN0cmluZyhlKX0pKX19ZnVuY3Rpb24gX3IoKXtyZXR1cm4gbXJ9ZnVuY3Rpb24geXIodCxlLG49bmV3IFVSTFNlYXJjaFBhcmFtcyl7bGV0IGk9dCtlO3JldHVybiBTdHJpbmcobikmJihpKz0oZS5pbmNsdWRlcygiPyIpPyImIjoiPyIpK1N0cmluZyhuKSksaX1mdW5jdGlvbiB2cih0PXt9KXtjb25zdCBlPU9iamVjdC5rZXlzKHQpLnNvcnQoKS5maWx0ZXIoKGU9PnRbZV0pKSxuPW5ldyBVUkxTZWFyY2hQYXJhbXM7cmV0dXJuIGUuZm9yRWFjaCgoZT0+e2NvbnN0IGk9dFtlXTsoQXJyYXkuaXNBcnJheShpKT9pOltpXSkuZm9yRWFjaCgodD0+bi5hcHBlbmQoZSx0KSkpfSkpLG59dmFyIGJyO2Z1bmN0aW9uIHhyKHQsZSl7Y29uc3Qgbj0oKCk9Pnt0cnl7cmV0dXJuIG5ldyBSZWdFeHAoZSl9Y2F0Y2godCl7cmV0dXJuIG51bGx9fSkoKTtyZXR1cm57bmFtZTplLG1ldGFkYXRhOnt0eXBlOmJyLlNFQVJDSF9SRVNVTFRTLHZhbGlkUmVnZXg6ISFuLHVuaXZlcnNhbFJlZ2V4OiIuKiI9PT1lfSxpdGVtczpuP3QuZmlsdGVyKCh0PT50Lm1hdGNoKG4pKSk6W119fWZ1bmN0aW9uIHdyKHQsZSxuKXtjb25zdCBpPShmdW5jdGlvbiByKHQsZT0iIil7Y29uc3Qgbj1beHIodCxlKV0saT0oZnVuY3Rpb24gcih0LGU9Ii8iKXtjb25zdCBuPVtdLGk9e307cmV0dXJuIHQuZm9yRWFjaCgodD0+e2NvbnN0IHI9dC5pbmRleE9mKGUpLG89cj49MD90LnNsaWNlKDAscik6dDtpZighaVtvXSl7Y29uc3QgdD17bmFtZTpvLG1ldGFkYXRhOnt0eXBlOmJyLlBSRUZJWF9HUk9VUH0saXRlbXM6W119O2lbb109dCxuLnB1c2godCl9aVtvXS5pdGVtcy5wdXNoKHQpfSkpLG59KSh0KTtyZXR1cm5bXS5jb25jYXQobixpKX0pKGFyKHQpLG4pLG89KGZ1bmN0aW9uIGEodCl7Y29uc3QgZT1uZXcgTWFwO3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChuPT57dFtuXS5mb3JFYWNoKCh0PT57Y29uc3QgaT1lLmdldCh0KXx8W107aS5wdXNoKG4pLGUuc2V0KHQsaSl9KSl9KSksZX0pKFNlLmV4cG9ydHMucGljayh0LGUpKTtyZXR1cm4gaS5tYXAoKCh7bmFtZTp0LG1ldGFkYXRhOmUsaXRlbXM6bn0pPT4oe25hbWU6dCxtZXRhZGF0YTplLGl0ZW1zOm4ubWFwKCh0PT4oe3RhZzp0LHJ1bnM6KG8uZ2V0KHQpfHxbXSkuc2xpY2UoKX0pKSl9KSkpfWZ1bmN0aW9uIFNyKHQsZSl7Y29uc3Qgbj1ucih0LnRhZyxlLnRhZyk7cmV0dXJuIDAhPW4/bjpucih0LnJ1bixlLnJ1bil9ZnVuY3Rpb24gTXIodCxlLG4pe3JldHVybiB3cih0LGUsbikubWFwKChmdW5jdGlvbiBpKHQpe2NvbnN0IGU9U2UuZXhwb3J0cy5mbGF0dGVuKHQuaXRlbXMubWFwKCgoe3RhZzp0LHJ1bnM6ZX0pPT5lLm1hcCgoZT0+KHt0YWc6dCxydW46ZX0pKSkpKSk7cmV0dXJuIGUuc29ydChTcikse25hbWU6dC5uYW1lLG1ldGFkYXRhOnQubWV0YWRhdGEsaXRlbXM6ZX19KSl9Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovIShmdW5jdGlvbih0KXt0W3QuU0VBUkNIX1JFU1VMVFM9MF09IlNFQVJDSF9SRVNVTFRTIix0W3QuUFJFRklYX0dST1VQPTFdPSJQUkVGSVhfR1JPVVAifSkoYnJ8fChicj17fSkpO2NvbnN0IEVyPXthdHRhY2hlZDohMCxkZXRhY2hlZDohMCxyZWFkeTohMCxjcmVhdGVkOiEwLGJlZm9yZVJlZ2lzdGVyOiEwLHJlZ2lzdGVyZWQ6ITAsYXR0cmlidXRlQ2hhbmdlZDohMCxsaXN0ZW5lcnM6ITAsaG9zdEF0dHJpYnV0ZXM6ITB9LFRyPXthdHRhY2hlZDohMCxkZXRhY2hlZDohMCxyZWFkeTohMCxjcmVhdGVkOiEwLGJlZm9yZVJlZ2lzdGVyOiEwLHJlZ2lzdGVyZWQ6ITAsYXR0cmlidXRlQ2hhbmdlZDohMCxiZWhhdmlvcnM6ITAsX25vQWNjZXNzb3JzOiEwfSxDcj1PYmplY3QuYXNzaWduKHtsaXN0ZW5lcnM6ITAsaG9zdEF0dHJpYnV0ZXM6ITAscHJvcGVydGllczohMCxvYnNlcnZlcnM6ITB9LFRyKTtmdW5jdGlvbiBBcih0LGUsbixpKXshKGZ1bmN0aW9uIHIodCxlLG4pe2NvbnN0IGk9dC5fbm9BY2Nlc3NvcnMscj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KTtmb3IobGV0IG89MDtvPHIubGVuZ3RoO28rKyl7bGV0IGE9cltvXTtpZighKGEgaW4gbikpaWYoaSllW2FdPXRbYV07ZWxzZXtsZXQgbj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsYSk7biYmKG4uY29uZmlndXJhYmxlPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLGEsbikpfX19KShlLHQsaSk7Zm9yKGxldCB0IGluIEVyKWVbdF0mJihuW3RdPW5bdF18fFtdLG5bdF0ucHVzaChlW3RdKSl9ZnVuY3Rpb24ga3IodCxlLG4pe2U9ZXx8W107Zm9yKGxldCBpPXQubGVuZ3RoLTE7aT49MDtpLS0pe2xldCByPXRbaV07cj9BcnJheS5pc0FycmF5KHIpP2tyKHIsZSk6ZS5pbmRleE9mKHIpPDAmJighbnx8bi5pbmRleE9mKHIpPDApJiZlLnVuc2hpZnQocik6Y29uc29sZS53YXJuKCJiZWhhdmlvciBpcyBudWxsLCBjaGVjayBmb3IgbWlzc2luZyBvciA0MDQgaW1wb3J0Iil9cmV0dXJuIGV9ZnVuY3Rpb24gTHIodCxlKXtmb3IoY29uc3QgbiBpbiBlKXtjb25zdCBpPXRbbl0scj1lW25dO3Rbbl09ISgidmFsdWUiaW4gcikmJmkmJiJ2YWx1ZSJpbiBpP09iamVjdC5hc3NpZ24oe3ZhbHVlOmkudmFsdWV9LHIpOnJ9fWNvbnN0IFByPWVyKEhUTUxFbGVtZW50KTtmdW5jdGlvbiBOcih0LGUsbil7bGV0IGk7Y29uc3Qgcj17fTtjbGFzcyBvIGV4dGVuZHMgZXtzdGF0aWMgX2ZpbmFsaXplQ2xhc3MoKXtpZih0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoImdlbmVyYXRlZEZyb20iLHRoaXMpKSl7aWYoaSlmb3IobGV0IHQsZT0wO2U8aS5sZW5ndGg7ZSsrKXQ9aVtlXSx0LnByb3BlcnRpZXMmJnRoaXMuY3JlYXRlUHJvcGVydGllcyh0LnByb3BlcnRpZXMpLHQub2JzZXJ2ZXJzJiZ0aGlzLmNyZWF0ZU9ic2VydmVycyh0Lm9ic2VydmVycyx0LnByb3BlcnRpZXMpO3QucHJvcGVydGllcyYmdGhpcy5jcmVhdGVQcm9wZXJ0aWVzKHQucHJvcGVydGllcyksdC5vYnNlcnZlcnMmJnRoaXMuY3JlYXRlT2JzZXJ2ZXJzKHQub2JzZXJ2ZXJzLHQucHJvcGVydGllcyksdGhpcy5fcHJlcGFyZVRlbXBsYXRlKCl9ZWxzZSBlLl9maW5hbGl6ZUNsYXNzLmNhbGwodGhpcyl9c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7Y29uc3QgZT17fTtpZihpKWZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7dCsrKUxyKGUsaVt0XS5wcm9wZXJ0aWVzKTtyZXR1cm4gTHIoZSx0LnByb3BlcnRpZXMpLGV9c3RhdGljIGdldCBvYnNlcnZlcnMoKXtsZXQgZT1bXTtpZihpKWZvcihsZXQgdCxuPTA7bjxpLmxlbmd0aDtuKyspdD1pW25dLHQub2JzZXJ2ZXJzJiYoZT1lLmNvbmNhdCh0Lm9ic2VydmVycykpO3JldHVybiB0Lm9ic2VydmVycyYmKGU9ZS5jb25jYXQodC5vYnNlcnZlcnMpKSxlfWNyZWF0ZWQoKXtzdXBlci5jcmVhdGVkKCk7Y29uc3QgdD1yLmNyZWF0ZWQ7aWYodClmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdLmNhbGwodGhpcyl9X3JlZ2lzdGVyZWQoKXtjb25zdCB0PW8ucHJvdG90eXBlO2lmKCF0Lmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl9faGFzUmVnaXN0ZXJGaW5pc2hlZCIsdCkpKXt0Ll9faGFzUmVnaXN0ZXJGaW5pc2hlZD0hMCxzdXBlci5fcmVnaXN0ZXJlZCgpLHcmJmEodCk7Y29uc3QgZT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7bGV0IG49ci5iZWZvcmVSZWdpc3RlcjtpZihuKWZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKW5bdF0uY2FsbChlKTtpZihuPXIucmVnaXN0ZXJlZCxuKWZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKW5bdF0uY2FsbChlKX19X2FwcGx5TGlzdGVuZXJzKCl7c3VwZXIuX2FwcGx5TGlzdGVuZXJzKCk7Y29uc3QgdD1yLmxpc3RlbmVycztpZih0KWZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtjb25zdCBuPXRbZV07aWYobilmb3IobGV0IHQgaW4gbil0aGlzLl9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKHRoaXMsdCxuW3RdKX19X2Vuc3VyZUF0dHJpYnV0ZXMoKXtjb25zdCB0PXIuaG9zdEF0dHJpYnV0ZXM7aWYodClmb3IobGV0IGU9dC5sZW5ndGgtMTtlPj0wO2UtLSl7Y29uc3Qgbj10W2VdO2ZvcihsZXQgdCBpbiBuKXRoaXMuX2Vuc3VyZUF0dHJpYnV0ZSh0LG5bdF0pfXN1cGVyLl9lbnN1cmVBdHRyaWJ1dGVzKCl9cmVhZHkoKXtzdXBlci5yZWFkeSgpO2xldCB0PXIucmVhZHk7aWYodClmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdLmNhbGwodGhpcyl9YXR0YWNoZWQoKXtzdXBlci5hdHRhY2hlZCgpO2xldCB0PXIuYXR0YWNoZWQ7aWYodClmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdLmNhbGwodGhpcyl9ZGV0YWNoZWQoKXtzdXBlci5kZXRhY2hlZCgpO2xldCB0PXIuZGV0YWNoZWQ7aWYodClmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdLmNhbGwodGhpcyl9YXR0cmlidXRlQ2hhbmdlZCh0LGUsbil7c3VwZXIuYXR0cmlidXRlQ2hhbmdlZCgpO2xldCBpPXIuYXR0cmlidXRlQ2hhbmdlZDtpZihpKWZvcihsZXQgcj0wO3I8aS5sZW5ndGg7cisrKWlbcl0uY2FsbCh0aGlzLHQsZSxuKX19aWYobil7QXJyYXkuaXNBcnJheShuKXx8KG49W25dKTtsZXQgdD1lLnByb3RvdHlwZS5iZWhhdmlvcnM7aT1rcihuLG51bGwsdCksby5wcm90b3R5cGUuYmVoYXZpb3JzPXQ/dC5jb25jYXQobik6aX1jb25zdCBhPWU9PntpJiYoZnVuY3Rpb24gbih0LGUsaSl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspQXIodCxlW25dLGksQ3IpfSkoZSxpLHIpLEFyKGUsdCxyLFRyKX07cmV0dXJuIHd8fGEoby5wcm90b3R5cGUpLG8uZ2VuZXJhdGVkRnJvbT10LG99Y29uc3QgSXI9ZnVuY3Rpb24odCxlKXt0fHxjb25zb2xlLndhcm4oIlBvbHltZXIuQ2xhc3MgcmVxdWlyZXMgYGluZm9gIGFyZ3VtZW50Iik7bGV0IG49ZT9lKFByKTpQcjtyZXR1cm4gbj1Ocih0LG4sdC5iZWhhdmlvcnMpLG4uaXM9bi5wcm90b3R5cGUuaXM9dC5pcyxufSxScj1mdW5jdGlvbih0KXtsZXQgZTtyZXR1cm4gZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJyLkNsYXNzKHQpLHQuX2xlZ2FjeUZvcmNlT2JzZXJ2ZWRBdHRyaWJ1dGVzJiYoZS5wcm90b3R5cGUuX2xlZ2FjeUZvcmNlT2JzZXJ2ZWRBdHRyaWJ1dGVzPXQuX2xlZ2FjeUZvcmNlT2JzZXJ2ZWRBdHRyaWJ1dGVzKSxjdXN0b21FbGVtZW50cy5kZWZpbmUoZS5pcyxlKSxlfTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KZnVuY3Rpb24gT3IodCxlLG4saSxyKXtsZXQgbztyJiYobz0ib2JqZWN0Ij09dHlwZW9mIG4mJm51bGwhPT1uLG8mJihpPXQuX19kYXRhVGVtcFtlXSkpO2xldCBhPWkhPT1uJiYoaT09aXx8bj09bik7cmV0dXJuIG8mJmEmJih0Ll9fZGF0YVRlbXBbZV09biksYX1Sci5DbGFzcz1Jcjtjb25zdCB6cj1JKCh0PT5jbGFzcyBleHRlbmRzIHR7X3Nob3VsZFByb3BlcnR5Q2hhbmdlKHQsZSxuKXtyZXR1cm4gT3IodGhpcyx0LGUsbiwhMCl9fSkpLERyPUkoKHQ9PmNsYXNzIGV4dGVuZHMgdHtzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKXtyZXR1cm57bXV0YWJsZURhdGE6Qm9vbGVhbn19X3Nob3VsZFByb3BlcnR5Q2hhbmdlKHQsZSxuKXtyZXR1cm4gT3IodGhpcyx0LGUsbix0aGlzLm11dGFibGVEYXRhKX19KSk7enIuX211dGFibGVQcm9wZXJ0eUNoYW5nZT1PcjsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KbGV0IEJyPW51bGw7ZnVuY3Rpb24gSHIoKXtyZXR1cm4gQnJ9SHIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSFRNTFRlbXBsYXRlRWxlbWVudC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpIcix3cml0YWJsZTohMH19KTtjb25zdCBGcj1oZShIciksVnI9enIoRnIpLFVyPWhlKGNsYXNze30pO2Z1bmN0aW9uIGpyKHQsZSl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2xldCBpPWVbbl07aWYoQm9vbGVhbih0KSE9Qm9vbGVhbihpLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXykpaWYoaS5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFKXQ/KGkuX19wb2x5bWVyVGV4dENvbnRlbnRfXz1pLnRleHRDb250ZW50LGkudGV4dENvbnRlbnQ9IiIpOmkudGV4dENvbnRlbnQ9aS5fX3BvbHltZXJUZXh0Q29udGVudF9fO2Vsc2UgaWYoInNsb3QiPT09aS5sb2NhbE5hbWUpaWYodClpLl9fcG9seW1lclJlcGxhY2VkX189ZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgiaGlkZGVuLXNsb3QiKSxZKFkoaSkucGFyZW50Tm9kZSkucmVwbGFjZUNoaWxkKGkuX19wb2x5bWVyUmVwbGFjZWRfXyxpKTtlbHNle2NvbnN0IHQ9aS5fX3BvbHltZXJSZXBsYWNlZF9fO3QmJlkoWSh0KS5wYXJlbnROb2RlKS5yZXBsYWNlQ2hpbGQoaSx0KX1lbHNlIGkuc3R5bGUmJih0PyhpLl9fcG9seW1lckRpc3BsYXlfXz1pLnN0eWxlLmRpc3BsYXksaS5zdHlsZS5kaXNwbGF5PSJub25lIik6aS5zdHlsZS5kaXNwbGF5PWkuX19wb2x5bWVyRGlzcGxheV9fKTtpLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXz10LGkuX3Nob3dIaWRlQ2hpbGRyZW4mJmkuX3Nob3dIaWRlQ2hpbGRyZW4odCl9fWNsYXNzIEdyIGV4dGVuZHMgVXJ7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLl9jb25maWd1cmVQcm9wZXJ0aWVzKHQpLHRoaXMucm9vdD10aGlzLl9zdGFtcFRlbXBsYXRlKHRoaXMuX19kYXRhSG9zdCk7bGV0IGU9W107dGhpcy5jaGlsZHJlbj1lO2ZvcihsZXQgdD10aGlzLnJvb3QuZmlyc3RDaGlsZDt0O3Q9dC5uZXh0U2libGluZyllLnB1c2godCksdC5fX3RlbXBsYXRpemVJbnN0YW5jZT10aGlzO3RoaXMuX190ZW1wbGF0aXplT3duZXImJnRoaXMuX190ZW1wbGF0aXplT3duZXIuX19oaWRlVGVtcGxhdGVDaGlsZHJlbl9fJiZ0aGlzLl9zaG93SGlkZUNoaWxkcmVuKCEwKTtsZXQgbj10aGlzLl9fdGVtcGxhdGl6ZU9wdGlvbnM7KHQmJm4uaW5zdGFuY2VQcm9wc3x8IW4uaW5zdGFuY2VQcm9wcykmJnRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKX1fY29uZmlndXJlUHJvcGVydGllcyh0KXtpZih0aGlzLl9fdGVtcGxhdGl6ZU9wdGlvbnMuZm9yd2FyZEhvc3RQcm9wKWZvcihsZXQgdCBpbiB0aGlzLl9faG9zdFByb3BzKXRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eSh0LHRoaXMuX19kYXRhSG9zdFsiX2hvc3RfIit0XSk7Zm9yKGxldCBlIGluIHQpdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5KGUsdFtlXSl9Zm9yd2FyZEhvc3RQcm9wKHQsZSl7dGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHQsZSwhMSwhMCkmJnRoaXMuX19kYXRhSG9zdC5fZW5xdWV1ZUNsaWVudCh0aGlzKX1fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZSh0LGUsbil7aWYodGhpcy5fbWV0aG9kSG9zdCYmdGhpcy5fX3RlbXBsYXRpemVPcHRpb25zLnBhcmVudE1vZGVsKXRoaXMuX21ldGhvZEhvc3QuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUodCxlLCh0PT57dC5tb2RlbD10aGlzLG4odCl9KSk7ZWxzZXtsZXQgaT10aGlzLl9fZGF0YUhvc3QuX19kYXRhSG9zdDtpJiZpLl9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKHQsZSxuKX19X3Nob3dIaWRlQ2hpbGRyZW4odCl7anIodCx0aGlzLmNoaWxkcmVuKX1fc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUodCxlLG4pe3QuX19oaWRlVGVtcGxhdGVDaGlsZHJlbl9fJiZ0Lm5vZGVUeXBlPT1Ob2RlLlRFWFRfTk9ERSYmInRleHRDb250ZW50Ij09ZT90Ll9fcG9seW1lclRleHRDb250ZW50X189bjpzdXBlci5fc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUodCxlLG4pfWdldCBwYXJlbnRNb2RlbCgpe2xldCB0PXRoaXMuX19wYXJlbnRNb2RlbDtpZighdCl7bGV0IGU7dD10aGlzO2Rve3Q9dC5fX2RhdGFIb3N0Ll9fZGF0YUhvc3R9d2hpbGUoKGU9dC5fX3RlbXBsYXRpemVPcHRpb25zKSYmIWUucGFyZW50TW9kZWwpO3RoaXMuX19wYXJlbnRNb2RlbD10fXJldHVybiB0fWRpc3BhdGNoRXZlbnQodCl7cmV0dXJuITB9fWNvbnN0IFdyPXpyKEdyKTtmdW5jdGlvbiBxcih0KXtsZXQgZT10Ll9fZGF0YUhvc3Q7cmV0dXJuIGUmJmUuX21ldGhvZEhvc3R8fGV9ZnVuY3Rpb24gWXIodCxlKXtyZXR1cm4gZnVuY3Rpb24gdChuLGkscil7ZS5jYWxsKG4uX190ZW1wbGF0aXplT3duZXIsaS5zdWJzdHJpbmcoIl9ob3N0XyIubGVuZ3RoKSxyW2ldKX19ZnVuY3Rpb24gWHIodCxlKXtyZXR1cm4gZnVuY3Rpb24gdChuLGkscil7ZS5jYWxsKG4uX190ZW1wbGF0aXplT3duZXIsbixpLHJbaV0pfX1mdW5jdGlvbiAkcih0LGUsbil7aWYoYiYmIXFyKHQpKXRocm93IG5ldyBFcnJvcigic3RyaWN0VGVtcGxhdGVQb2xpY3k6IHRlbXBsYXRlIG93bmVyIG5vdCB0cnVzdGVkIik7aWYobj1ufHx7fSx0Ll9fdGVtcGxhdGl6ZU93bmVyKXRocm93IG5ldyBFcnJvcigiQSA8dGVtcGxhdGU+IGNhbiBvbmx5IGJlIHRlbXBsYXRpemVkIG9uY2UiKTt0Ll9fdGVtcGxhdGl6ZU93bmVyPWU7bGV0IGk9KGU/ZS5jb25zdHJ1Y3RvcjpHcikuX3BhcnNlVGVtcGxhdGUodCkscj1pLnRlbXBsYXRpemVJbnN0YW5jZUNsYXNzO3J8fChyPShmdW5jdGlvbiBvKHQsZSxuKXtsZXQgaT1uLm11dGFibGVEYXRhP1dyOkdyOyRyLm1peGluJiYoaT0kci5taXhpbihpKSk7bGV0IHI9Y2xhc3MgZXh0ZW5kcyBpe307cmV0dXJuIHIucHJvdG90eXBlLl9fdGVtcGxhdGl6ZU9wdGlvbnM9bixyLnByb3RvdHlwZS5fYmluZFRlbXBsYXRlKHQpLChmdW5jdGlvbiBvKHQsZSxuLGkpe2xldCByPW4uaG9zdFByb3BzfHx7fTtmb3IobGV0IGUgaW4gaS5pbnN0YW5jZVByb3BzKXtkZWxldGUgcltlXTtsZXQgbj1pLm5vdGlmeUluc3RhbmNlUHJvcDtuJiZ0LnByb3RvdHlwZS5fYWRkUHJvcGVydHlFZmZlY3QoZSx0LnByb3RvdHlwZS5QUk9QRVJUWV9FRkZFQ1RfVFlQRVMuTk9USUZZLHtmbjpYcigwLG4pfSl9aWYoaS5mb3J3YXJkSG9zdFByb3AmJmUuX19kYXRhSG9zdClmb3IobGV0IGUgaW4gciluLmhhc0hvc3RQcm9wc3x8KG4uaGFzSG9zdFByb3BzPSEwKSx0LnByb3RvdHlwZS5fYWRkUHJvcGVydHlFZmZlY3QoZSx0LnByb3RvdHlwZS5QUk9QRVJUWV9FRkZFQ1RfVFlQRVMuTk9USUZZLHtmbjpmdW5jdGlvbiB0KGUsbixpKXtlLl9fZGF0YUhvc3QuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aCgiX2hvc3RfIituLGlbbl0sITAsITApfX0pfSkocix0LGUsbikscn0pKHQsaSxuKSxpLnRlbXBsYXRpemVJbnN0YW5jZUNsYXNzPXIpO2NvbnN0IGE9cXIodCk7IShmdW5jdGlvbiBzKHQsZSxuLGkpe2xldCByPW4uZm9yd2FyZEhvc3RQcm9wO2lmKHImJmUuaGFzSG9zdFByb3BzKXtjb25zdCBvPSJ0ZW1wbGF0ZSI9PXQubG9jYWxOYW1lO2xldCBhPWUudGVtcGxhdGl6ZVRlbXBsYXRlQ2xhc3M7aWYoIWEpe2lmKG8pe2xldCB0PW4ubXV0YWJsZURhdGE/VnI6RnI7Y2xhc3MgaSBleHRlbmRzIHR7fWE9ZS50ZW1wbGF0aXplVGVtcGxhdGVDbGFzcz1pfWVsc2V7Y29uc3Qgbj10LmNvbnN0cnVjdG9yO2NsYXNzIGkgZXh0ZW5kcyBue31hPWUudGVtcGxhdGl6ZVRlbXBsYXRlQ2xhc3M9aX1sZXQgcz1lLmhvc3RQcm9wcztmb3IobGV0IHQgaW4gcylhLnByb3RvdHlwZS5fYWRkUHJvcGVydHlFZmZlY3QoIl9ob3N0XyIrdCxhLnByb3RvdHlwZS5QUk9QRVJUWV9FRkZFQ1RfVFlQRVMuUFJPUEFHQVRFLHtmbjpZcigwLHIpfSksYS5wcm90b3R5cGUuX2NyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5KCJfaG9zdF8iK3QpO1MmJmkmJihmdW5jdGlvbiBvKHQsZSxuKXtjb25zdCBpPW4uY29uc3RydWN0b3IuX3Byb3BlcnRpZXMse3Byb3BlcnR5RWZmZWN0czpyfT10LHtpbnN0YW5jZVByb3BzOm99PWU7Zm9yKGxldCB0IGluIHIpaWYoIShpW3RdfHxvJiZvW3RdKSl7Y29uc3QgZT1yW3RdO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtjb25zdHtwYXJ0Oml9PWVbbl0uaW5mbztpZighaS5zaWduYXR1cmV8fCFpLnNpZ25hdHVyZS5zdGF0aWMpe2NvbnNvbGUud2FybihgUHJvcGVydHkgJyR7dH0nIHVzZWQgaW4gdGVtcGxhdGUgYnV0IG5vdCBkZWNsYXJlZCBpbiAncHJvcGVydGllcyc7IGF0dHJpYnV0ZSB3aWxsIG5vdCBiZSBvYnNlcnZlZC5gKTticmVha319fX0pKGUsbixpKX1pZih0Ll9fZGF0YVByb3RvJiZPYmplY3QuYXNzaWduKHQuX19kYXRhLHQuX19kYXRhUHJvdG8pLG8pIShmdW5jdGlvbiBhKHQsZSl7QnI9dCxPYmplY3Quc2V0UHJvdG90eXBlT2YodCxlLnByb3RvdHlwZSksbmV3IGUsQnI9bnVsbH0pKHQsYSksdC5fX2RhdGFUZW1wPXt9LHQuX19kYXRhUGVuZGluZz1udWxsLHQuX19kYXRhT2xkPW51bGwsdC5fZW5hYmxlUHJvcGVydGllcygpO2Vsc2V7T2JqZWN0LnNldFByb3RvdHlwZU9mKHQsYS5wcm90b3R5cGUpO2NvbnN0IG49ZS5ob3N0UHJvcHM7Zm9yKGxldCBlIGluIG4paWYoZT0iX2hvc3RfIitlLGUgaW4gdCl7Y29uc3Qgbj10W2VdO2RlbGV0ZSB0W2VdLHQuX19kYXRhW2VdPW59fX19KSh0LGksbixhKTtsZXQgbD1jbGFzcyBleHRlbmRzIHJ7fTtyZXR1cm4gbC5wcm90b3R5cGUuX21ldGhvZEhvc3Q9YSxsLnByb3RvdHlwZS5fX2RhdGFIb3N0PXQsbC5wcm90b3R5cGUuX190ZW1wbGF0aXplT3duZXI9ZSxsLnByb3RvdHlwZS5fX2hvc3RQcm9wcz1pLmhvc3RQcm9wcyxsPWwsbH1mdW5jdGlvbiBLcih0LGUpe2xldCBuO2Zvcig7ZTspaWYobj1lLl9fZGF0YUhvc3Q/ZTplLl9fdGVtcGxhdGl6ZUluc3RhbmNlKXtpZihuLl9fZGF0YUhvc3Q9PXQpcmV0dXJuIG47ZT1uLl9fZGF0YUhvc3R9ZWxzZSBlPVkoZSkucGFyZW50Tm9kZTtyZXR1cm4gbnVsbH0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9jb25zdCBacj17dGVtcGxhdGl6ZSh0LGUpe3RoaXMuX3RlbXBsYXRpemVyVGVtcGxhdGU9dCx0aGlzLmN0b3I9JHIodCx0aGlzLHttdXRhYmxlRGF0YTpCb29sZWFuKGUpLHBhcmVudE1vZGVsOnRoaXMuX3BhcmVudE1vZGVsLGluc3RhbmNlUHJvcHM6dGhpcy5faW5zdGFuY2VQcm9wcyxmb3J3YXJkSG9zdFByb3A6dGhpcy5fZm9yd2FyZEhvc3RQcm9wVjIsbm90aWZ5SW5zdGFuY2VQcm9wOnRoaXMuX25vdGlmeUluc3RhbmNlUHJvcFYyfSl9LHN0YW1wKHQpe3JldHVybiBuZXcgdGhpcy5jdG9yKHQpfSxtb2RlbEZvckVsZW1lbnQodCl7cmV0dXJuIEtyKHRoaXMuX3RlbXBsYXRpemVyVGVtcGxhdGUsdCl9fTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9sZXQgSnI9ITE7ZnVuY3Rpb24gUXIoKXtpZih3JiYhbSl7aWYoIUpyKXtKcj0hMDtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7dC50ZXh0Q29udGVudD0iZG9tLWJpbmQsZG9tLWlmLGRvbS1yZXBlYXR7ZGlzcGxheTpub25lO30iLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodCl9cmV0dXJuITB9cmV0dXJuITF9Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovY29uc3QgdG89cGkoRHIoaGUoSFRNTEVsZW1lbnQpKSk7Y3VzdG9tRWxlbWVudHMuZGVmaW5lKCJkb20tYmluZCIsY2xhc3MgZXh0ZW5kcyB0b3tzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpe3JldHVyblsibXV0YWJsZS1kYXRhIl19Y29uc3RydWN0b3IoKXtpZihzdXBlcigpLGIpdGhyb3cgbmV3IEVycm9yKCJzdHJpY3RUZW1wbGF0ZVBvbGljeTogZG9tLWJpbmQgbm90IGFsbG93ZWQiKTt0aGlzLnJvb3Q9bnVsbCx0aGlzLiQ9bnVsbCx0aGlzLl9fY2hpbGRyZW49bnVsbH1hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodCxlLG4saSl7dGhpcy5tdXRhYmxlRGF0YT0hMH1jb25uZWN0ZWRDYWxsYmFjaygpe1FyKCl8fCh0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSx0aGlzLnJlbmRlcigpfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7dGhpcy5fX3JlbW92ZUNoaWxkcmVuKCl9X19pbnNlcnRDaGlsZHJlbigpe1koWSh0aGlzKS5wYXJlbnROb2RlKS5pbnNlcnRCZWZvcmUodGhpcy5yb290LHRoaXMpfV9fcmVtb3ZlQ2hpbGRyZW4oKXtpZih0aGlzLl9fY2hpbGRyZW4pZm9yKGxldCB0PTA7dDx0aGlzLl9fY2hpbGRyZW4ubGVuZ3RoO3QrKyl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5fX2NoaWxkcmVuW3RdKX1yZW5kZXIoKXtsZXQgdDtpZighdGhpcy5fX2NoaWxkcmVuKXtpZih0PXR8fHRoaXMucXVlcnlTZWxlY3RvcigidGVtcGxhdGUiKSwhdCl7bGV0IGU9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCgpPT57aWYodD10aGlzLnF1ZXJ5U2VsZWN0b3IoInRlbXBsYXRlIiksIXQpdGhyb3cgbmV3IEVycm9yKCJkb20tYmluZCByZXF1aXJlcyBhIDx0ZW1wbGF0ZT4gY2hpbGQiKTtlLmRpc2Nvbm5lY3QoKSx0aGlzLnJlbmRlcigpfSkpO3JldHVybiB2b2lkIGUub2JzZXJ2ZSh0aGlzLHtjaGlsZExpc3Q6ITB9KX10aGlzLnJvb3Q9dGhpcy5fc3RhbXBUZW1wbGF0ZSh0KSx0aGlzLiQ9dGhpcy5yb290LiQsdGhpcy5fX2NoaWxkcmVuPVtdO2ZvcihsZXQgdD10aGlzLnJvb3QuZmlyc3RDaGlsZDt0O3Q9dC5uZXh0U2libGluZyl0aGlzLl9fY2hpbGRyZW5bdGhpcy5fX2NoaWxkcmVuLmxlbmd0aF09dDt0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCl9dGhpcy5fX2luc2VydENoaWxkcmVuKCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiZG9tLWNoYW5nZSIse2J1YmJsZXM6ITAsY29tcG9zZWQ6ITB9KSl9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IGVvPURyKHllKTtjbGFzcyBubyBleHRlbmRzIGVve3N0YXRpYyBnZXQgaXMoKXtyZXR1cm4iZG9tLXJlcGVhdCJ9c3RhdGljIGdldCB0ZW1wbGF0ZSgpe3JldHVybiBudWxsfXN0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntpdGVtczp7dHlwZTpBcnJheX0sYXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpdGVtIn0saW5kZXhBczp7dHlwZTpTdHJpbmcsdmFsdWU6ImluZGV4In0saXRlbXNJbmRleEFzOnt0eXBlOlN0cmluZyx2YWx1ZToiaXRlbXNJbmRleCJ9LHNvcnQ6e3R5cGU6RnVuY3Rpb24sb2JzZXJ2ZXI6Il9fc29ydENoYW5nZWQifSxmaWx0ZXI6e3R5cGU6RnVuY3Rpb24sb2JzZXJ2ZXI6Il9fZmlsdGVyQ2hhbmdlZCJ9LG9ic2VydmU6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfX29ic2VydmVDaGFuZ2VkIn0sZGVsYXk6TnVtYmVyLHJlbmRlcmVkSXRlbUNvdW50Ont0eXBlOk51bWJlcixub3RpZnk6IWsscmVhZE9ubHk6ITB9LGluaXRpYWxDb3VudDp7dHlwZTpOdW1iZXJ9LHRhcmdldEZyYW1lcmF0ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MjB9LF90YXJnZXRGcmFtZVRpbWU6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfX2NvbXB1dGVGcmFtZVRpbWUodGFyZ2V0RnJhbWVyYXRlKSJ9LG5vdGlmeURvbUNoYW5nZTp7dHlwZTpCb29sZWFufSxyZXVzZUNodW5rZWRJbnN0YW5jZXM6e3R5cGU6Qm9vbGVhbn19fXN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCl7cmV0dXJuWyJfX2l0ZW1zQ2hhbmdlZChpdGVtcy4qKSJdfWNvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9faW5zdGFuY2VzPVtdLHRoaXMuX19yZW5kZXJEZWJvdW5jZXI9bnVsbCx0aGlzLl9faXRlbXNJZHhUb0luc3RJZHg9e30sdGhpcy5fX2NodW5rQ291bnQ9bnVsbCx0aGlzLl9fcmVuZGVyU3RhcnRUaW1lPW51bGwsdGhpcy5fX2l0ZW1zQXJyYXlDaGFuZ2VkPSExLHRoaXMuX19zaG91bGRNZWFzdXJlQ2h1bms9ITEsdGhpcy5fX3Nob3VsZENvbnRpbnVlQ2h1bmtpbmc9ITEsdGhpcy5fX2NodW5raW5nSWQ9MCx0aGlzLl9fc29ydEZuPW51bGwsdGhpcy5fX2ZpbHRlckZuPW51bGwsdGhpcy5fX29ic2VydmVQYXRocz1udWxsLHRoaXMuX19jdG9yPW51bGwsdGhpcy5fX2lzRGV0YWNoZWQ9ITAsdGhpcy50ZW1wbGF0ZT1udWxsfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLl9faXNEZXRhY2hlZD0hMDtmb3IobGV0IHQ9MDt0PHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoO3QrKyl0aGlzLl9fZGV0YWNoSW5zdGFuY2UodCl9Y29ubmVjdGVkQ2FsbGJhY2soKXtpZihzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLFFyKCl8fCh0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSx0aGlzLl9faXNEZXRhY2hlZCl7dGhpcy5fX2lzRGV0YWNoZWQ9ITE7bGV0IHQ9WShZKHRoaXMpLnBhcmVudE5vZGUpO2ZvcihsZXQgZT0wO2U8dGhpcy5fX2luc3RhbmNlcy5sZW5ndGg7ZSsrKXRoaXMuX19hdHRhY2hJbnN0YW5jZShlLHQpfX1fX2Vuc3VyZVRlbXBsYXRpemVkKCl7aWYoIXRoaXMuX19jdG9yKXtjb25zdCB0PXRoaXM7bGV0IGU9dGhpcy50ZW1wbGF0ZT10Ll90ZW1wbGF0ZUluZm8/dDp0aGlzLnF1ZXJ5U2VsZWN0b3IoInRlbXBsYXRlIik7aWYoIWUpe2xldCB0PW5ldyBNdXRhdGlvbk9ic2VydmVyKCgoKT0+e2lmKCF0aGlzLnF1ZXJ5U2VsZWN0b3IoInRlbXBsYXRlIikpdGhyb3cgbmV3IEVycm9yKCJkb20tcmVwZWF0IHJlcXVpcmVzIGEgPHRlbXBsYXRlPiBjaGlsZCIpO3QuZGlzY29ubmVjdCgpLHRoaXMuX19yZW5kZXIoKX0pKTtyZXR1cm4gdC5vYnNlcnZlKHRoaXMse2NoaWxkTGlzdDohMH0pLCExfWxldCBuPXt9O25bdGhpcy5hc109ITAsblt0aGlzLmluZGV4QXNdPSEwLG5bdGhpcy5pdGVtc0luZGV4QXNdPSEwLHRoaXMuX19jdG9yPSRyKGUsdGhpcyx7bXV0YWJsZURhdGE6dGhpcy5tdXRhYmxlRGF0YSxwYXJlbnRNb2RlbDohMCxpbnN0YW5jZVByb3BzOm4sZm9yd2FyZEhvc3RQcm9wOmZ1bmN0aW9uKHQsZSl7bGV0IG49dGhpcy5fX2luc3RhbmNlcztmb3IobGV0IGkscj0wO3I8bi5sZW5ndGgmJihpPW5bcl0pO3IrKylpLmZvcndhcmRIb3N0UHJvcCh0LGUpfSxub3RpZnlJbnN0YW5jZVByb3A6ZnVuY3Rpb24odCxlLG4pe2lmKFEodGhpcy5hcyxlKSl7bGV0IGk9dFt0aGlzLml0ZW1zSW5kZXhBc107ZT09dGhpcy5hcyYmKHRoaXMuaXRlbXNbaV09bik7bGV0IHI9Sih0aGlzLmFzLGAke0pTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIml0ZW1zIix0aGlzKX0uJHtpfWAsZSk7dGhpcy5ub3RpZnlQYXRoKHIsbil9fX0pfXJldHVybiEwfV9fZ2V0TWV0aG9kSG9zdCgpe3JldHVybiB0aGlzLl9fZGF0YUhvc3QuX21ldGhvZEhvc3R8fHRoaXMuX19kYXRhSG9zdH1fX2Z1bmN0aW9uRnJvbVByb3BlcnR5VmFsdWUodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtsZXQgZT10LG49dGhpcy5fX2dldE1ldGhvZEhvc3QoKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbltlXS5hcHBseShuLGFyZ3VtZW50cyl9fXJldHVybiB0fV9fc29ydENoYW5nZWQodCl7dGhpcy5fX3NvcnRGbj10aGlzLl9fZnVuY3Rpb25Gcm9tUHJvcGVydHlWYWx1ZSh0KSx0aGlzLml0ZW1zJiZ0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcil9X19maWx0ZXJDaGFuZ2VkKHQpe3RoaXMuX19maWx0ZXJGbj10aGlzLl9fZnVuY3Rpb25Gcm9tUHJvcGVydHlWYWx1ZSh0KSx0aGlzLml0ZW1zJiZ0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcil9X19jb21wdXRlRnJhbWVUaW1lKHQpe3JldHVybiBNYXRoLmNlaWwoMWUzL3QpfV9fb2JzZXJ2ZUNoYW5nZWQoKXt0aGlzLl9fb2JzZXJ2ZVBhdGhzPXRoaXMub2JzZXJ2ZSYmdGhpcy5vYnNlcnZlLnJlcGxhY2UoIi4qIiwiLiIpLnNwbGl0KCIgIil9X19oYW5kbGVPYnNlcnZlZFBhdGhzKHQpe2lmKHRoaXMuX19zb3J0Rm58fHRoaXMuX19maWx0ZXJGbilpZih0KXtpZih0aGlzLl9fb2JzZXJ2ZVBhdGhzKXtsZXQgZT10aGlzLl9fb2JzZXJ2ZVBhdGhzO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKTA9PT10LmluZGV4T2YoZVtuXSkmJnRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyLHRoaXMuZGVsYXkpfX1lbHNlIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyLHRoaXMuZGVsYXkpfV9faXRlbXNDaGFuZ2VkKHQpe3RoaXMuaXRlbXMmJiFBcnJheS5pc0FycmF5KHRoaXMuaXRlbXMpJiZjb25zb2xlLndhcm4oImRvbS1yZXBlYXQgZXhwZWN0ZWQgYXJyYXkgZm9yIGBpdGVtc2AsIGZvdW5kIix0aGlzLml0ZW1zKSx0aGlzLl9faGFuZGxlSXRlbVBhdGgodC5wYXRoLHQudmFsdWUpfHwoIml0ZW1zIj09PXQucGF0aCYmKHRoaXMuX19pdGVtc0FycmF5Q2hhbmdlZD0hMCksdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIpKX1fX2RlYm91bmNlUmVuZGVyKHQsZT0wKXt0aGlzLl9fcmVuZGVyRGVib3VuY2VyPVRuLmRlYm91bmNlKHRoaXMuX19yZW5kZXJEZWJvdW5jZXIsZT4wP2d0LmFmdGVyKGUpOnZ0LHQuYmluZCh0aGlzKSksQW4odGhpcy5fX3JlbmRlckRlYm91bmNlcil9cmVuZGVyKCl7dGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIpLERpKCl9X19yZW5kZXIoKXtpZighdGhpcy5fX2Vuc3VyZVRlbXBsYXRpemVkKCkpcmV0dXJuO2xldCB0PXRoaXMuaXRlbXN8fFtdO2NvbnN0IGU9dGhpcy5fX3NvcnRBbmRGaWx0ZXJJdGVtcyh0KSxuPXRoaXMuX19jYWxjdWxhdGVMaW1pdChlLmxlbmd0aCk7dGhpcy5fX3VwZGF0ZUluc3RhbmNlcyh0LG4sZSksdGhpcy5pbml0aWFsQ291bnQmJih0aGlzLl9fc2hvdWxkTWVhc3VyZUNodW5rfHx0aGlzLl9fc2hvdWxkQ29udGludWVDaHVua2luZykmJihjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fY2h1bmtpbmdJZCksdGhpcy5fX2NodW5raW5nSWQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+dGhpcy5fX2NvbnRpbnVlQ2h1bmtpbmcoKSkpKSx0aGlzLl9zZXRSZW5kZXJlZEl0ZW1Db3VudCh0aGlzLl9faW5zdGFuY2VzLmxlbmd0aCksayYmIXRoaXMubm90aWZ5RG9tQ2hhbmdlfHx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJkb20tY2hhbmdlIix7YnViYmxlczohMCxjb21wb3NlZDohMH0pKX1fX3NvcnRBbmRGaWx0ZXJJdGVtcyh0KXtsZXQgZT1uZXcgQXJyYXkodC5sZW5ndGgpO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKWVbbl09bjtyZXR1cm4gdGhpcy5fX2ZpbHRlckZuJiYoZT1lLmZpbHRlcigoKGUsbixpKT0+dGhpcy5fX2ZpbHRlckZuKHRbZV0sbixpKSkpKSx0aGlzLl9fc29ydEZuJiZlLnNvcnQoKChlLG4pPT50aGlzLl9fc29ydEZuKHRbZV0sdFtuXSkpKSxlfV9fY2FsY3VsYXRlTGltaXQodCl7bGV0IGU9dDtjb25zdCBuPXRoaXMuX19pbnN0YW5jZXMubGVuZ3RoO2lmKHRoaXMuaW5pdGlhbENvdW50KXtsZXQgaTshdGhpcy5fX2NodW5rQ291bnR8fHRoaXMuX19pdGVtc0FycmF5Q2hhbmdlZCYmIXRoaXMucmV1c2VDaHVua2VkSW5zdGFuY2VzPyhlPU1hdGgubWluKHQsdGhpcy5pbml0aWFsQ291bnQpLGk9TWF0aC5tYXgoZS1uLDApLHRoaXMuX19jaHVua0NvdW50PWl8fDEpOihpPU1hdGgubWluKE1hdGgubWF4KHQtbiwwKSx0aGlzLl9fY2h1bmtDb3VudCksZT1NYXRoLm1pbihuK2ksdCkpLHRoaXMuX19zaG91bGRNZWFzdXJlQ2h1bms9aT09PXRoaXMuX19jaHVua0NvdW50LHRoaXMuX19zaG91bGRDb250aW51ZUNodW5raW5nPWU8dCx0aGlzLl9fcmVuZGVyU3RhcnRUaW1lPXBlcmZvcm1hbmNlLm5vdygpfXJldHVybiB0aGlzLl9faXRlbXNBcnJheUNoYW5nZWQ9ITEsZX1fX2NvbnRpbnVlQ2h1bmtpbmcoKXtpZih0aGlzLl9fc2hvdWxkTWVhc3VyZUNodW5rKXtjb25zdCB0PXBlcmZvcm1hbmNlLm5vdygpLXRoaXMuX19yZW5kZXJTdGFydFRpbWU7dGhpcy5fX2NodW5rQ291bnQ9TWF0aC5yb3VuZCh0aGlzLl9fY2h1bmtDb3VudCoodGhpcy5fdGFyZ2V0RnJhbWVUaW1lL3QpKXx8MX10aGlzLl9fc2hvdWxkQ29udGludWVDaHVua2luZyYmdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIpfV9fdXBkYXRlSW5zdGFuY2VzKHQsZSxuKXtjb25zdCBpPXRoaXMuX19pdGVtc0lkeFRvSW5zdElkeD17fTtsZXQgcjtmb3Iocj0wO3I8ZTtyKyspe2xldCBlPXRoaXMuX19pbnN0YW5jZXNbcl0sbz1uW3JdLGE9dFtvXTtpW29dPXIsZT8oZS5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuYXMsYSksZS5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaW5kZXhBcyxyKSxlLl9zZXRQZW5kaW5nUHJvcGVydHkodGhpcy5pdGVtc0luZGV4QXMsbyksZS5fZmx1c2hQcm9wZXJ0aWVzKCkpOnRoaXMuX19pbnNlcnRJbnN0YW5jZShhLHIsbyl9Zm9yKGxldCB0PXRoaXMuX19pbnN0YW5jZXMubGVuZ3RoLTE7dD49cjt0LS0pdGhpcy5fX2RldGFjaEFuZFJlbW92ZUluc3RhbmNlKHQpfV9fZGV0YWNoSW5zdGFuY2UodCl7bGV0IGU9dGhpcy5fX2luc3RhbmNlc1t0XTtjb25zdCBuPVkoZS5yb290KTtmb3IobGV0IHQ9MDt0PGUuY2hpbGRyZW4ubGVuZ3RoO3QrKyluLmFwcGVuZENoaWxkKGUuY2hpbGRyZW5bdF0pO3JldHVybiBlfV9fYXR0YWNoSW5zdGFuY2UodCxlKXtlLmluc2VydEJlZm9yZSh0aGlzLl9faW5zdGFuY2VzW3RdLnJvb3QsdGhpcyl9X19kZXRhY2hBbmRSZW1vdmVJbnN0YW5jZSh0KXt0aGlzLl9fZGV0YWNoSW5zdGFuY2UodCksdGhpcy5fX2luc3RhbmNlcy5zcGxpY2UodCwxKX1fX3N0YW1wSW5zdGFuY2UodCxlLG4pe2xldCBpPXt9O3JldHVybiBpW3RoaXMuYXNdPXQsaVt0aGlzLmluZGV4QXNdPWUsaVt0aGlzLml0ZW1zSW5kZXhBc109bixuZXcgdGhpcy5fX2N0b3IoaSl9X19pbnNlcnRJbnN0YW5jZSh0LGUsbil7Y29uc3QgaT10aGlzLl9fc3RhbXBJbnN0YW5jZSh0LGUsbik7bGV0IHI9dGhpcy5fX2luc3RhbmNlc1tlKzFdLG89cj9yLmNoaWxkcmVuWzBdOnRoaXM7cmV0dXJuIFkoWSh0aGlzKS5wYXJlbnROb2RlKS5pbnNlcnRCZWZvcmUoaS5yb290LG8pLHRoaXMuX19pbnN0YW5jZXNbZV09aSxpfV9zaG93SGlkZUNoaWxkcmVuKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5fX2luc3RhbmNlcy5sZW5ndGg7ZSsrKXRoaXMuX19pbnN0YW5jZXNbZV0uX3Nob3dIaWRlQ2hpbGRyZW4odCl9X19oYW5kbGVJdGVtUGF0aCh0LGUpe2xldCBuPXQuc2xpY2UoNiksaT1uLmluZGV4T2YoIi4iKSxyPWk8MD9uOm4uc3Vic3RyaW5nKDAsaSk7aWYocj09cGFyc2VJbnQociwxMCkpe2xldCB0PWk8MD8iIjpuLnN1YnN0cmluZyhpKzEpO3RoaXMuX19oYW5kbGVPYnNlcnZlZFBhdGhzKHQpO2xldCBvPXRoaXMuX19pbnN0YW5jZXNbdGhpcy5fX2l0ZW1zSWR4VG9JbnN0SWR4W3JdXTtyZXR1cm4gbyYmKG8uX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aCh0aGlzLmFzKyh0PyIuIit0OiIiKSxlLCExLCEwKSxvLl9mbHVzaFByb3BlcnRpZXMoKSksITB9fWl0ZW1Gb3JFbGVtZW50KHQpe2xldCBlPXRoaXMubW9kZWxGb3JFbGVtZW50KHQpO3JldHVybiBlJiZlW3RoaXMuYXNdfWluZGV4Rm9yRWxlbWVudCh0KXtsZXQgZT10aGlzLm1vZGVsRm9yRWxlbWVudCh0KTtyZXR1cm4gZSYmZVt0aGlzLmluZGV4QXNdfW1vZGVsRm9yRWxlbWVudCh0KXtyZXR1cm4gS3IodGhpcy50ZW1wbGF0ZSx0KX19Y3VzdG9tRWxlbWVudHMuZGVmaW5lKG5vLmlzLG5vKTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY2xhc3MgaW8gZXh0ZW5kcyB5ZXtzdGF0aWMgZ2V0IGlzKCl7cmV0dXJuImRvbS1pZiJ9c3RhdGljIGdldCB0ZW1wbGF0ZSgpe3JldHVybiBudWxsfXN0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntpZjp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfX2RlYm91bmNlUmVuZGVyIn0scmVzdGFtcDp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfX2RlYm91bmNlUmVuZGVyIn0sbm90aWZ5RG9tQ2hhbmdlOnt0eXBlOkJvb2xlYW59fX1jb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5fX3JlbmRlckRlYm91bmNlcj1udWxsLHRoaXMuX2xhc3RJZj0hMSx0aGlzLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXz0hMX1fX2RlYm91bmNlUmVuZGVyKCl7dGhpcy5fX3JlbmRlckRlYm91bmNlcj1Ubi5kZWJvdW5jZSh0aGlzLl9fcmVuZGVyRGVib3VuY2VyLHZ0LCgoKT0+dGhpcy5fX3JlbmRlcigpKSksQW4odGhpcy5fX3JlbmRlckRlYm91bmNlcil9ZGlzY29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO2NvbnN0IHQ9WSh0aGlzKS5wYXJlbnROb2RlO3QmJih0Lm5vZGVUeXBlIT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREV8fFkodCkuaG9zdCl8fHRoaXMuX190ZWFyZG93bkluc3RhbmNlKCl9Y29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLFFyKCl8fCh0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSx0aGlzLmlmJiZ0aGlzLl9fZGVib3VuY2VSZW5kZXIoKX1fX2Vuc3VyZVRlbXBsYXRlKCl7aWYoIXRoaXMuX190ZW1wbGF0ZSl7Y29uc3QgdD10aGlzO2xldCBlPXQuX3RlbXBsYXRlSW5mbz90OlkodCkucXVlcnlTZWxlY3RvcigidGVtcGxhdGUiKTtpZighZSl7bGV0IHQ9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCgpPT57aWYoIVkodGhpcykucXVlcnlTZWxlY3RvcigidGVtcGxhdGUiKSl0aHJvdyBuZXcgRXJyb3IoImRvbS1pZiByZXF1aXJlcyBhIDx0ZW1wbGF0ZT4gY2hpbGQiKTt0LmRpc2Nvbm5lY3QoKSx0aGlzLl9fcmVuZGVyKCl9KSk7cmV0dXJuIHQub2JzZXJ2ZSh0aGlzLHtjaGlsZExpc3Q6ITB9KSwhMX10aGlzLl9fdGVtcGxhdGU9ZX1yZXR1cm4hMH1fX2Vuc3VyZUluc3RhbmNlKCl7bGV0IHQ9WSh0aGlzKS5wYXJlbnROb2RlO2lmKHRoaXMuX19oYXNJbnN0YW5jZSgpKXtsZXQgZT10aGlzLl9fZ2V0SW5zdGFuY2VOb2RlcygpO2lmKGUmJmUubGVuZ3RoJiZZKHRoaXMpLnByZXZpb3VzU2libGluZyE9PWVbZS5sZW5ndGgtMV0pZm9yKGxldCBuLGk9MDtpPGUubGVuZ3RoJiYobj1lW2ldKTtpKyspWSh0KS5pbnNlcnRCZWZvcmUobix0aGlzKX1lbHNle2lmKCF0KXJldHVybiExO2lmKCF0aGlzLl9fZW5zdXJlVGVtcGxhdGUoKSlyZXR1cm4hMTt0aGlzLl9fY3JlYXRlQW5kSW5zZXJ0SW5zdGFuY2UodCl9cmV0dXJuITB9cmVuZGVyKCl7RGkoKX1fX3JlbmRlcigpe2lmKHRoaXMuaWYpe2lmKCF0aGlzLl9fZW5zdXJlSW5zdGFuY2UoKSlyZXR1cm59ZWxzZSB0aGlzLnJlc3RhbXAmJnRoaXMuX190ZWFyZG93bkluc3RhbmNlKCk7dGhpcy5fc2hvd0hpZGVDaGlsZHJlbigpLGsmJiF0aGlzLm5vdGlmeURvbUNoYW5nZXx8dGhpcy5pZj09dGhpcy5fbGFzdElmfHwodGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiZG9tLWNoYW5nZSIse2J1YmJsZXM6ITAsY29tcG9zZWQ6ITB9KSksdGhpcy5fbGFzdElmPXRoaXMuaWYpfV9faGFzSW5zdGFuY2UoKXt9X19nZXRJbnN0YW5jZU5vZGVzKCl7fV9fY3JlYXRlQW5kSW5zZXJ0SW5zdGFuY2UodCl7fV9fdGVhcmRvd25JbnN0YW5jZSgpe31fc2hvd0hpZGVDaGlsZHJlbigpe319Y29uc3Qgcm89QT9jbGFzcyBleHRlbmRzIGlve2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9faW5zdGFuY2U9bnVsbCx0aGlzLl9fc3luY0luZm89bnVsbH1fX2hhc0luc3RhbmNlKCl7cmV0dXJuIEJvb2xlYW4odGhpcy5fX2luc3RhbmNlKX1fX2dldEluc3RhbmNlTm9kZXMoKXtyZXR1cm4gdGhpcy5fX2luc3RhbmNlLnRlbXBsYXRlSW5mby5jaGlsZE5vZGVzfV9fY3JlYXRlQW5kSW5zZXJ0SW5zdGFuY2UodCl7Y29uc3QgZT10aGlzLl9fZGF0YUhvc3R8fHRoaXM7aWYoYiYmIXRoaXMuX19kYXRhSG9zdCl0aHJvdyBuZXcgRXJyb3IoInN0cmljdFRlbXBsYXRlUG9saWN5OiB0ZW1wbGF0ZSBvd25lciBub3QgdHJ1c3RlZCIpO2NvbnN0IG49ZS5fYmluZFRlbXBsYXRlKHRoaXMuX190ZW1wbGF0ZSwhMCk7bi5ydW5FZmZlY3RzPSh0LGUsbik9PntsZXQgaT10aGlzLl9fc3luY0luZm87aWYodGhpcy5pZilpJiYodGhpcy5fX3N5bmNJbmZvPW51bGwsdGhpcy5fc2hvd0hpZGVDaGlsZHJlbigpLGU9T2JqZWN0LmFzc2lnbihpLmNoYW5nZWRQcm9wcyxlKSksdChlLG4pO2Vsc2UgaWYodGhpcy5fX2luc3RhbmNlKWlmKGl8fChpPXRoaXMuX19zeW5jSW5mbz17cnVuRWZmZWN0czp0LGNoYW5nZWRQcm9wczp7fX0pLG4pZm9yKGNvbnN0IHQgaW4gZSl7Y29uc3QgZT0kKHQpO2kuY2hhbmdlZFByb3BzW2VdPXRoaXMuX19kYXRhSG9zdFtlXX1lbHNlIE9iamVjdC5hc3NpZ24oaS5jaGFuZ2VkUHJvcHMsZSl9LHRoaXMuX19pbnN0YW5jZT1lLl9zdGFtcFRlbXBsYXRlKHRoaXMuX190ZW1wbGF0ZSxuKSxZKHQpLmluc2VydEJlZm9yZSh0aGlzLl9faW5zdGFuY2UsdGhpcyl9X19zeW5jSG9zdFByb3BlcnRpZXMoKXtjb25zdCB0PXRoaXMuX19zeW5jSW5mbzt0JiYodGhpcy5fX3N5bmNJbmZvPW51bGwsdC5ydW5FZmZlY3RzKHQuY2hhbmdlZFByb3BzLCExKSl9X190ZWFyZG93bkluc3RhbmNlKCl7dGhpcy5fX2luc3RhbmNlJiYoKHRoaXMuX19kYXRhSG9zdHx8dGhpcykuX3JlbW92ZUJvdW5kRG9tKHRoaXMuX19pbnN0YW5jZSksdGhpcy5fX2luc3RhbmNlPW51bGwsdGhpcy5fX3N5bmNJbmZvPW51bGwpfV9zaG93SGlkZUNoaWxkcmVuKCl7Y29uc3QgdD10aGlzLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fX3x8IXRoaXMuaWY7dGhpcy5fX2luc3RhbmNlJiZCb29sZWFuKHRoaXMuX19pbnN0YW5jZS5fX2hpZGRlbikhPT10JiYodGhpcy5fX2luc3RhbmNlLl9faGlkZGVuPXQsanIodCx0aGlzLl9faW5zdGFuY2UudGVtcGxhdGVJbmZvLmNoaWxkTm9kZXMpKSx0fHx0aGlzLl9fc3luY0hvc3RQcm9wZXJ0aWVzKCl9fTpjbGFzcyBleHRlbmRzIGlve2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9fY3Rvcj1udWxsLHRoaXMuX19pbnN0YW5jZT1udWxsLHRoaXMuX19pbnZhbGlkUHJvcHM9bnVsbH1fX2hhc0luc3RhbmNlKCl7cmV0dXJuIEJvb2xlYW4odGhpcy5fX2luc3RhbmNlKX1fX2dldEluc3RhbmNlTm9kZXMoKXtyZXR1cm4gdGhpcy5fX2luc3RhbmNlLmNoaWxkcmVufV9fY3JlYXRlQW5kSW5zZXJ0SW5zdGFuY2UodCl7dGhpcy5fX2N0b3J8fCh0aGlzLl9fY3Rvcj0kcih0aGlzLl9fdGVtcGxhdGUsdGhpcyx7bXV0YWJsZURhdGE6ITAsZm9yd2FyZEhvc3RQcm9wOmZ1bmN0aW9uKHQsZSl7dGhpcy5fX2luc3RhbmNlJiYodGhpcy5pZj90aGlzLl9faW5zdGFuY2UuZm9yd2FyZEhvc3RQcm9wKHQsZSk6KHRoaXMuX19pbnZhbGlkUHJvcHM9dGhpcy5fX2ludmFsaWRQcm9wc3x8T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9faW52YWxpZFByb3BzWyQodCldPSEwKSl9fSkpLHRoaXMuX19pbnN0YW5jZT1uZXcgdGhpcy5fX2N0b3IsWSh0KS5pbnNlcnRCZWZvcmUodGhpcy5fX2luc3RhbmNlLnJvb3QsdGhpcyl9X190ZWFyZG93bkluc3RhbmNlKCl7aWYodGhpcy5fX2luc3RhbmNlKXtsZXQgdD10aGlzLl9faW5zdGFuY2UuY2hpbGRyZW47aWYodCYmdC5sZW5ndGgpe2xldCBlPVkodFswXSkucGFyZW50Tm9kZTtpZihlKXtlPVkoZSk7Zm9yKGxldCBuLGk9MDtpPHQubGVuZ3RoJiYobj10W2ldKTtpKyspZS5yZW1vdmVDaGlsZChuKX19dGhpcy5fX2ludmFsaWRQcm9wcz1udWxsLHRoaXMuX19pbnN0YW5jZT1udWxsfX1fX3N5bmNIb3N0UHJvcGVydGllcygpe2xldCB0PXRoaXMuX19pbnZhbGlkUHJvcHM7aWYodCl7dGhpcy5fX2ludmFsaWRQcm9wcz1udWxsO2ZvcihsZXQgZSBpbiB0KXRoaXMuX19pbnN0YW5jZS5fc2V0UGVuZGluZ1Byb3BlcnR5KGUsdGhpcy5fX2RhdGFIb3N0W2VdKTt0aGlzLl9faW5zdGFuY2UuX2ZsdXNoUHJvcGVydGllcygpfX1fc2hvd0hpZGVDaGlsZHJlbigpe2NvbnN0IHQ9dGhpcy5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX198fCF0aGlzLmlmO3RoaXMuX19pbnN0YW5jZSYmQm9vbGVhbih0aGlzLl9faW5zdGFuY2UuX19oaWRkZW4pIT09dCYmKHRoaXMuX19pbnN0YW5jZS5fX2hpZGRlbj10LHRoaXMuX19pbnN0YW5jZS5fc2hvd0hpZGVDaGlsZHJlbih0KSksdHx8dGhpcy5fX3N5bmNIb3N0UHJvcGVydGllcygpfX07Y3VzdG9tRWxlbWVudHMuZGVmaW5lKHJvLmlzLHJvKTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KbGV0IG9vPUkoKHQ9PntsZXQgZT1tZSh0KTtyZXR1cm4gY2xhc3MgZXh0ZW5kcyBle3N0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntpdGVtczp7dHlwZTpBcnJheX0sbXVsdGk6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sc2VsZWN0ZWQ6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sc2VsZWN0ZWRJdGVtOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LHRvZ2dsZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX19c3RhdGljIGdldCBvYnNlcnZlcnMoKXtyZXR1cm5bIl9fdXBkYXRlU2VsZWN0aW9uKG11bHRpLCBpdGVtcy4qKSJdfWNvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9fbGFzdEl0ZW1zPW51bGwsdGhpcy5fX2xhc3RNdWx0aT1udWxsLHRoaXMuX19zZWxlY3RlZE1hcD1udWxsfV9fdXBkYXRlU2VsZWN0aW9uKHQsZSl7bGV0IG49ZS5wYXRoO2lmKG49PUpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIml0ZW1zIix0aGlzKSl7bGV0IG49ZS5iYXNlfHxbXSxpPXRoaXMuX19sYXN0SXRlbXM7aWYodCE9PXRoaXMuX19sYXN0TXVsdGkmJnRoaXMuY2xlYXJTZWxlY3Rpb24oKSxpKXtsZXQgdD1JaShuLGkpO3RoaXMuX19hcHBseVNwbGljZXModCl9dGhpcy5fX2xhc3RJdGVtcz1uLHRoaXMuX19sYXN0TXVsdGk9dH1lbHNlIGlmKGUucGF0aD09YCR7SlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiaXRlbXMiLHRoaXMpfS5zcGxpY2VzYCl0aGlzLl9fYXBwbHlTcGxpY2VzKGUudmFsdWUuaW5kZXhTcGxpY2VzKTtlbHNle2xldCB0PW4uc2xpY2UoYCR7SlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiaXRlbXMiLHRoaXMpfS5gLmxlbmd0aCksZT1wYXJzZUludCh0LDEwKTt0LmluZGV4T2YoIi4iKTwwJiZ0PT1lJiZ0aGlzLl9fZGVzZWxlY3RDaGFuZ2VkSWR4KGUpfX1fX2FwcGx5U3BsaWNlcyh0KXtsZXQgZT10aGlzLl9fc2VsZWN0ZWRNYXA7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2xldCBpPXRbbl07ZS5mb3JFYWNoKCgodCxuKT0+e3Q8aS5pbmRleHx8ZS5zZXQobix0Pj1pLmluZGV4K2kucmVtb3ZlZC5sZW5ndGg/dCtpLmFkZGVkQ291bnQtaS5yZW1vdmVkLmxlbmd0aDotMSl9KSk7Zm9yKGxldCB0PTA7dDxpLmFkZGVkQ291bnQ7dCsrKXtsZXQgbj1pLmluZGV4K3Q7ZS5oYXModGhpcy5pdGVtc1tuXSkmJmUuc2V0KHRoaXMuaXRlbXNbbl0sbil9fXRoaXMuX191cGRhdGVMaW5rcygpO2xldCBuPTA7ZS5mb3JFYWNoKCgodCxpKT0+e3Q8MD8odGhpcy5tdWx0aT90aGlzLnNwbGljZShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJzZWxlY3RlZCIsdGhpcyksbiwxKTp0aGlzLnNlbGVjdGVkPXRoaXMuc2VsZWN0ZWRJdGVtPW51bGwsZS5kZWxldGUoaSkpOm4rK30pKX1fX3VwZGF0ZUxpbmtzKCl7aWYodGhpcy5fX2RhdGFMaW5rZWRQYXRocz17fSx0aGlzLm11bHRpKXtsZXQgdD0wO3RoaXMuX19zZWxlY3RlZE1hcC5mb3JFYWNoKChlPT57ZT49MCYmdGhpcy5saW5rUGF0aHMoYCR7SlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiaXRlbXMiLHRoaXMpfS4ke2V9YCxgJHtKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJzZWxlY3RlZCIsdGhpcyl9LiR7dCsrfWApfSkpfWVsc2UgdGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goKHQ9Pnt0aGlzLmxpbmtQYXRocyhKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJzZWxlY3RlZCIsdGhpcyksYCR7SlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiaXRlbXMiLHRoaXMpfS4ke3R9YCksdGhpcy5saW5rUGF0aHMoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgic2VsZWN0ZWRJdGVtIix0aGlzKSxgJHtKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJpdGVtcyIsdGhpcyl9LiR7dH1gKX0pKX1jbGVhclNlbGVjdGlvbigpe3RoaXMuX19kYXRhTGlua2VkUGF0aHM9e30sdGhpcy5fX3NlbGVjdGVkTWFwPW5ldyBNYXAsdGhpcy5zZWxlY3RlZD10aGlzLm11bHRpP1tdOm51bGwsdGhpcy5zZWxlY3RlZEl0ZW09bnVsbH1pc1NlbGVjdGVkKHQpe3JldHVybiB0aGlzLl9fc2VsZWN0ZWRNYXAuaGFzKHQpfWlzSW5kZXhTZWxlY3RlZCh0KXtyZXR1cm4gdGhpcy5pc1NlbGVjdGVkKHRoaXMuaXRlbXNbdF0pfV9fZGVzZWxlY3RDaGFuZ2VkSWR4KHQpe2xldCBlPXRoaXMuX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KHQpO2lmKGU+PTApe2xldCB0PTA7dGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goKChuLGkpPT57ZT09dCsrJiZ0aGlzLmRlc2VsZWN0KGkpfSkpfX1fX3NlbGVjdGVkSW5kZXhGb3JJdGVtSW5kZXgodCl7bGV0IGU9dGhpcy5fX2RhdGFMaW5rZWRQYXRoc1tgJHtKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJpdGVtcyIsdGhpcyl9LiR7dH1gXTtpZihlKXJldHVybiBwYXJzZUludChlLnNsaWNlKGAke0pTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoInNlbGVjdGVkIix0aGlzKX0uYC5sZW5ndGgpLDEwKX1kZXNlbGVjdCh0KXtsZXQgZT10aGlzLl9fc2VsZWN0ZWRNYXAuZ2V0KHQpO2lmKGU+PTApe2xldCBuO3RoaXMuX19zZWxlY3RlZE1hcC5kZWxldGUodCksdGhpcy5tdWx0aSYmKG49dGhpcy5fX3NlbGVjdGVkSW5kZXhGb3JJdGVtSW5kZXgoZSkpLHRoaXMuX191cGRhdGVMaW5rcygpLHRoaXMubXVsdGk/dGhpcy5zcGxpY2UoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgic2VsZWN0ZWQiLHRoaXMpLG4sMSk6dGhpcy5zZWxlY3RlZD10aGlzLnNlbGVjdGVkSXRlbT1udWxsfX1kZXNlbGVjdEluZGV4KHQpe3RoaXMuZGVzZWxlY3QodGhpcy5pdGVtc1t0XSl9c2VsZWN0KHQpe3RoaXMuc2VsZWN0SW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKHQpKX1zZWxlY3RJbmRleCh0KXtsZXQgZT10aGlzLml0ZW1zW3RdO3RoaXMuaXNTZWxlY3RlZChlKT90aGlzLnRvZ2dsZSYmdGhpcy5kZXNlbGVjdEluZGV4KHQpOih0aGlzLm11bHRpfHx0aGlzLl9fc2VsZWN0ZWRNYXAuY2xlYXIoKSx0aGlzLl9fc2VsZWN0ZWRNYXAuc2V0KGUsdCksdGhpcy5fX3VwZGF0ZUxpbmtzKCksdGhpcy5tdWx0aT90aGlzLnB1c2goSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgic2VsZWN0ZWQiLHRoaXMpLGUpOnRoaXMuc2VsZWN0ZWQ9dGhpcy5zZWxlY3RlZEl0ZW09ZSl9fX0pKSh5ZSk7Y2xhc3MgYW8gZXh0ZW5kcyBvb3tzdGF0aWMgZ2V0IGlzKCl7cmV0dXJuImFycmF5LXNlbGVjdG9yIn1zdGF0aWMgZ2V0IHRlbXBsYXRlKCl7cmV0dXJuIG51bGx9fWN1c3RvbUVsZW1lbnRzLmRlZmluZShhby5pcyxhbyk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IHNvPW5ldyBTbjt3aW5kb3cuU2hhZHlDU1N8fCh3aW5kb3cuU2hhZHlDU1M9e3ByZXBhcmVUZW1wbGF0ZSh0LGUsbil7fSxwcmVwYXJlVGVtcGxhdGVEb20odCxlKXt9LHByZXBhcmVUZW1wbGF0ZVN0eWxlcyh0LGUsbil7fSxzdHlsZVN1YnRyZWUodCxlKXtzby5wcm9jZXNzU3R5bGVzKCksUWUodCxlKX0sc3R5bGVFbGVtZW50KHQpe3NvLnByb2Nlc3NTdHlsZXMoKX0sc3R5bGVEb2N1bWVudCh0KXtzby5wcm9jZXNzU3R5bGVzKCksUWUoZG9jdW1lbnQuYm9keSx0KX0sZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlOih0LGUpPT50bih0LGUpLGZsdXNoQ3VzdG9tU3R5bGVzKCl7fSxuYXRpdmVDc3M6a2UsbmF0aXZlU2hhZG93Ok1lLGNzc0J1aWxkOlRlLGRpc2FibGVSdW50aW1lOkFlfSksd2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlPXNvOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBsbz0iaW5jbHVkZSIsY289d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlO2NsYXNzIHVvIGV4dGVuZHMgSFRNTEVsZW1lbnR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX3N0eWxlPW51bGwsY28uYWRkQ3VzdG9tU3R5bGUodGhpcyl9Z2V0U3R5bGUoKXtpZih0aGlzLl9zdHlsZSlyZXR1cm4gdGhpcy5fc3R5bGU7Y29uc3QgdD10aGlzLnF1ZXJ5U2VsZWN0b3IoInN0eWxlIik7aWYoIXQpcmV0dXJuIG51bGw7dGhpcy5fc3R5bGU9dDtjb25zdCBlPXQuZ2V0QXR0cmlidXRlKGxvKTtyZXR1cm4gZSYmKHQucmVtb3ZlQXR0cmlidXRlKGxvKSx0LnRleHRDb250ZW50PShmdW5jdGlvbiBuKHQpe2xldCBlPXQudHJpbSgpLnNwbGl0KC9ccysvKSxuPSIiO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKW4rPXEoZVt0XSk7cmV0dXJuIG59KShlKSt0LnRleHRDb250ZW50KSx0aGlzLm93bmVyRG9jdW1lbnQhPT13aW5kb3cuZG9jdW1lbnQmJndpbmRvdy5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRoaXMpLHRoaXMuX3N0eWxlfX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KbGV0IGhvO3dpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoImN1c3RvbS1zdHlsZSIsdW8pLGhvPXpyLl9tdXRhYmxlUHJvcGVydHlDaGFuZ2U7Y29uc3QgcG89e3Byb3BlcnRpZXM6e211dGFibGVEYXRhOkJvb2xlYW59LF9zaG91bGRQcm9wZXJ0eUNoYW5nZSh0LGUsbil7cmV0dXJuIGhvKHRoaXMsdCxlLG4sdGhpcy5tdXRhYmxlRGF0YSl9fSxmbz1lcihIVE1MRWxlbWVudCkucHJvdG90eXBlOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KdmFyIG1vPW5ldyBTZXQ7Y29uc3QgZ289e3Byb3BlcnRpZXM6e19wYXJlbnRSZXNpemFibGU6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfcGFyZW50UmVzaXphYmxlQ2hhbmdlZCJ9LF9ub3RpZnlpbmdEZXNjZW5kYW50Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxsaXN0ZW5lcnM6eyJpcm9uLXJlcXVlc3QtcmVzaXplLW5vdGlmaWNhdGlvbnMiOiJfb25Jcm9uUmVxdWVzdFJlc2l6ZU5vdGlmaWNhdGlvbnMifSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5faW50ZXJlc3RlZFJlc2l6YWJsZXM9W10sdGhpcy5fYm91bmROb3RpZnlSZXNpemU9dGhpcy5ub3RpZnlSZXNpemUuYmluZCh0aGlzKSx0aGlzLl9ib3VuZE9uRGVzY2VuZGFudElyb25SZXNpemU9dGhpcy5fb25EZXNjZW5kYW50SXJvblJlc2l6ZS5iaW5kKHRoaXMpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zKCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcGFyZW50UmVzaXphYmxlP3RoaXMuX3BhcmVudFJlc2l6YWJsZS5zdG9wUmVzaXplTm90aWZpY2F0aW9uc0Zvcih0aGlzKToobW8uZGVsZXRlKHRoaXMpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLHRoaXMuX2JvdW5kTm90aWZ5UmVzaXplKSksdGhpcy5fcGFyZW50UmVzaXphYmxlPW51bGx9LG5vdGlmeVJlc2l6ZTpmdW5jdGlvbigpe3RoaXMuaXNBdHRhY2hlZCYmKHRoaXMuX2ludGVyZXN0ZWRSZXNpemFibGVzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3RoaXMucmVzaXplclNob3VsZE5vdGlmeSh0KSYmdGhpcy5fbm90aWZ5RGVzY2VuZGFudCh0KX0pLHRoaXMpLHRoaXMuX2ZpcmVSZXNpemUoKSl9LGFzc2lnblBhcmVudFJlc2l6YWJsZTpmdW5jdGlvbih0KXt0aGlzLl9wYXJlbnRSZXNpemFibGUmJnRoaXMuX3BhcmVudFJlc2l6YWJsZS5zdG9wUmVzaXplTm90aWZpY2F0aW9uc0Zvcih0aGlzKSx0aGlzLl9wYXJlbnRSZXNpemFibGU9dCx0JiYtMT09PXQuX2ludGVyZXN0ZWRSZXNpemFibGVzLmluZGV4T2YodGhpcykmJih0Ll9pbnRlcmVzdGVkUmVzaXphYmxlcy5wdXNoKHRoaXMpLHQuX3N1YnNjcmliZUlyb25SZXNpemUodGhpcykpfSxzdG9wUmVzaXplTm90aWZpY2F0aW9uc0ZvcjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5pbmRleE9mKHQpO2U+LTEmJih0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5zcGxpY2UoZSwxKSx0aGlzLl91bnN1YnNjcmliZUlyb25SZXNpemUodCkpfSxfc3Vic2NyaWJlSXJvblJlc2l6ZTpmdW5jdGlvbih0KXt0LmFkZEV2ZW50TGlzdGVuZXIoImlyb24tcmVzaXplIix0aGlzLl9ib3VuZE9uRGVzY2VuZGFudElyb25SZXNpemUpfSxfdW5zdWJzY3JpYmVJcm9uUmVzaXplOmZ1bmN0aW9uKHQpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiaXJvbi1yZXNpemUiLHRoaXMuX2JvdW5kT25EZXNjZW5kYW50SXJvblJlc2l6ZSl9LHJlc2l6ZXJTaG91bGROb3RpZnk6ZnVuY3Rpb24odCl7cmV0dXJuITB9LF9vbkRlc2NlbmRhbnRJcm9uUmVzaXplOmZ1bmN0aW9uKHQpe3RoaXMuX25vdGlmeWluZ0Rlc2NlbmRhbnQ/dC5zdG9wUHJvcGFnYXRpb24oKTptfHx0aGlzLl9maXJlUmVzaXplKCl9LF9maXJlUmVzaXplOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJpcm9uLXJlc2l6ZSIsbnVsbCx7bm9kZTp0aGlzLGJ1YmJsZXM6ITF9KX0sX29uSXJvblJlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zOmZ1bmN0aW9uKHQpe3ZhciBlPVlpKHQpLnJvb3RUYXJnZXQ7ZSE9PXRoaXMmJihlLmFzc2lnblBhcmVudFJlc2l6YWJsZSh0aGlzKSx0aGlzLl9ub3RpZnlEZXNjZW5kYW50KGUpLHQuc3RvcFByb3BhZ2F0aW9uKCkpfSxfcGFyZW50UmVzaXphYmxlQ2hhbmdlZDpmdW5jdGlvbih0KXt0JiZ3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIix0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZSl9LF9ub3RpZnlEZXNjZW5kYW50OmZ1bmN0aW9uKHQpe3RoaXMuaXNBdHRhY2hlZCYmKHRoaXMuX25vdGlmeWluZ0Rlc2NlbmRhbnQ9ITAsdC5ub3RpZnlSZXNpemUoKSx0aGlzLl9ub3RpZnlpbmdEZXNjZW5kYW50PSExKX0sX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0F0dGFjaGVkKWlmKCJsb2FkaW5nIj09PWRvY3VtZW50LnJlYWR5U3RhdGUpe3ZhciB0PXRoaXMuX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zLmJpbmQodGhpcyk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsKGZ1bmN0aW9uIGUoKXtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIixlKSx0KCl9KSl9ZWxzZSB0aGlzLl9maW5kUGFyZW50KCksdGhpcy5fcGFyZW50UmVzaXphYmxlP3RoaXMuX3BhcmVudFJlc2l6YWJsZS5faW50ZXJlc3RlZFJlc2l6YWJsZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dCE9PXRoaXMmJnQuX2ZpbmRQYXJlbnQoKX0pLHRoaXMpOihtby5mb3JFYWNoKChmdW5jdGlvbih0KXt0IT09dGhpcyYmdC5fZmluZFBhcmVudCgpfSksdGhpcyksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdGhpcy5fYm91bmROb3RpZnlSZXNpemUpLHRoaXMubm90aWZ5UmVzaXplKCkpfSxfZmluZFBhcmVudDpmdW5jdGlvbigpe3RoaXMuYXNzaWduUGFyZW50UmVzaXphYmxlKG51bGwpLHRoaXMuZmlyZSgiaXJvbi1yZXF1ZXN0LXJlc2l6ZS1ub3RpZmljYXRpb25zIixudWxsLHtub2RlOnRoaXMsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwfSksdGhpcy5fcGFyZW50UmVzaXphYmxlP21vLmRlbGV0ZSh0aGlzKTptby5hZGQodGhpcyl9fTt2YXIgX289T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsSXJvblJlc2l6YWJsZUJlaGF2aW9yOmdvfSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL1JyKHtfdGVtcGxhdGU6X2VgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1pcm9uLWNvbGxhcHNlLXRyYW5zaXRpb24tZHVyYXRpb24sIDMwMG1zKTsKICAgICAgICAvKiBTYWZhcmkgMTAgbmVlZHMgdGhpcyBwcm9wZXJ0eSBwcmVmaXhlZCB0byBjb3JyZWN0bHkgYXBwbHkgdGhlIGN1c3RvbSBwcm9wZXJ0eSAqLwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogdmFyKC0taXJvbi1jb2xsYXBzZS10cmFuc2l0aW9uLWR1cmF0aW9uLCAzMDBtcyk7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgIH0KCiAgICAgIDpob3N0KC5pcm9uLWNvbGxhcHNlLWNsb3NlZCkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KDpub3QoLmlyb24tY29sbGFwc2Utb3BlbmVkKSkgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgpgLGlzOiJpcm9uLWNvbGxhcHNlIixiZWhhdmlvcnM6W2dvXSxwcm9wZXJ0aWVzOntob3Jpem9udGFsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9ob3Jpem9udGFsQ2hhbmdlZCJ9LG9wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifSx0cmFuc2l0aW9uaW5nOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSxub0FuaW1hdGlvbjp7dHlwZTpCb29sZWFufSxfZGVzaXJlZFNpemU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sZ2V0IGRpbWVuc2lvbigpe3JldHVybiB0aGlzLmhvcml6b250YWw/IndpZHRoIjoiaGVpZ2h0In0sZ2V0IF9kaW1lbnNpb25NYXgoKXtyZXR1cm4gdGhpcy5ob3Jpem9udGFsPyJtYXhXaWR0aCI6Im1heEhlaWdodCJ9LGdldCBfZGltZW5zaW9uTWF4Q3NzKCl7cmV0dXJuIHRoaXMuaG9yaXpvbnRhbD8ibWF4LXdpZHRoIjoibWF4LWhlaWdodCJ9LGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJncm91cCIsImFyaWEtaGlkZGVuIjoidHJ1ZSJ9LGxpc3RlbmVyczp7dHJhbnNpdGlvbmVuZDoiX29uVHJhbnNpdGlvbkVuZCJ9LHRvZ2dsZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkPSF0aGlzLm9wZW5lZH0sc2hvdzpmdW5jdGlvbigpe3RoaXMub3BlbmVkPSEwfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ9ITF9LHVwZGF0ZVNpemU6ZnVuY3Rpb24odCxlKXt0PSJhdXRvIj09PXQ/IiI6dDt2YXIgbj1lJiYhdGhpcy5ub0FuaW1hdGlvbiYmdGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9kZXNpcmVkU2l6ZSE9PXQ7aWYodGhpcy5fZGVzaXJlZFNpemU9dCx0aGlzLl91cGRhdGVUcmFuc2l0aW9uKCExKSxuKXt2YXIgaT10aGlzLl9jYWxjU2l6ZSgpOyIiPT09dCYmKHRoaXMuc3R5bGVbdGhpcy5fZGltZW5zaW9uTWF4XT0iIix0PXRoaXMuX2NhbGNTaXplKCkpLHRoaXMuc3R5bGVbdGhpcy5fZGltZW5zaW9uTWF4XT1pLHRoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wLHRoaXMuX3VwZGF0ZVRyYW5zaXRpb24oITApLG49dCE9PWl9dGhpcy5zdHlsZVt0aGlzLl9kaW1lbnNpb25NYXhdPXQsbnx8dGhpcy5fdHJhbnNpdGlvbkVuZCgpfSxlbmFibGVUcmFuc2l0aW9uOmZ1bmN0aW9uKHQpe2ZvLl93YXJuKCJgZW5hYmxlVHJhbnNpdGlvbigpYCBpcyBkZXByZWNhdGVkLCB1c2UgYG5vQW5pbWF0aW9uYCBpbnN0ZWFkLiIpLHRoaXMubm9BbmltYXRpb249IXR9LF91cGRhdGVUcmFuc2l0aW9uOmZ1bmN0aW9uKHQpe3RoaXMuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPXQmJiF0aGlzLm5vQW5pbWF0aW9uPyIiOiIwcyJ9LF9ob3Jpem9udGFsQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuc3R5bGUudHJhbnNpdGlvblByb3BlcnR5PXRoaXMuX2RpbWVuc2lvbk1heENzcyx0aGlzLnN0eWxlWyJtYXhXaWR0aCI9PT10aGlzLl9kaW1lbnNpb25NYXg/Im1heEhlaWdodCI6Im1heFdpZHRoIl09IiIsdGhpcy51cGRhdGVTaXplKHRoaXMub3BlbmVkPyJhdXRvIjoiMHB4IiwhMSl9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwhdGhpcy5vcGVuZWQpLHRoaXMuX3NldFRyYW5zaXRpb25pbmcoITApLHRoaXMudG9nZ2xlQ2xhc3MoImlyb24tY29sbGFwc2UtY2xvc2VkIiwhMSksdGhpcy50b2dnbGVDbGFzcygiaXJvbi1jb2xsYXBzZS1vcGVuZWQiLCExKSx0aGlzLnVwZGF0ZVNpemUodGhpcy5vcGVuZWQ/ImF1dG8iOiIwcHgiLCEwKSx0aGlzLm9wZW5lZCYmdGhpcy5mb2N1cygpfSxfdHJhbnNpdGlvbkVuZDpmdW5jdGlvbigpe3RoaXMuc3R5bGVbdGhpcy5fZGltZW5zaW9uTWF4XT10aGlzLl9kZXNpcmVkU2l6ZSx0aGlzLnRvZ2dsZUNsYXNzKCJpcm9uLWNvbGxhcHNlLWNsb3NlZCIsIXRoaXMub3BlbmVkKSx0aGlzLnRvZ2dsZUNsYXNzKCJpcm9uLWNvbGxhcHNlLW9wZW5lZCIsdGhpcy5vcGVuZWQpLHRoaXMuX3VwZGF0ZVRyYW5zaXRpb24oITEpLHRoaXMubm90aWZ5UmVzaXplKCksdGhpcy5fc2V0VHJhbnNpdGlvbmluZyghMSl9LF9vblRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24odCl7WWkodCkucm9vdFRhcmdldD09PXRoaXMmJnRoaXMuX3RyYW5zaXRpb25FbmQoKX0sX2NhbGNTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbdGhpcy5kaW1lbnNpb25dKyJweCJ9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCB5bz1fZWAKLyogTW9zdCBjb21tb24gdXNlZCBmbGV4IHN0eWxlcyovCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmxheW91dC5ob3Jpem9udGFsLAogICAgICAubGF5b3V0LnZlcnRpY2FsIHsKICAgICAgICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmxheW91dC5pbmxpbmUgewogICAgICAgIGRpc3BsYXk6IC1tcy1pbmxpbmUtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWlubGluZS1mbGV4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICB9CgogICAgICAubGF5b3V0Lmhvcml6b250YWwgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CgogICAgICAubGF5b3V0LnZlcnRpY2FsIHsKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgLmxheW91dC53cmFwIHsKICAgICAgICAtbXMtZmxleC13cmFwOiB3cmFwOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwOwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfQoKICAgICAgLmxheW91dC5uby13cmFwIHsKICAgICAgICAtbXMtZmxleC13cmFwOiBub3dyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXIsCiAgICAgIC5sYXlvdXQuY2VudGVyLWNlbnRlciB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItanVzdGlmaWVkLAogICAgICAubGF5b3V0LmNlbnRlci1jZW50ZXIgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAuZmxleCB7CiAgICAgICAgLW1zLWZsZXg6IDEgMSAwLjAwMDAwMDAwMXB4OwogICAgICAgIC13ZWJraXQtZmxleDogMTsKICAgICAgICBmbGV4OiAxOwogICAgICAgIC13ZWJraXQtZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgICBmbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICB9CgogICAgICAuZmxleC1hdXRvIHsKICAgICAgICAtbXMtZmxleDogMSAxIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDEgYXV0bzsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfQoKICAgICAgLmZsZXgtbm9uZSB7CiAgICAgICAgLW1zLWZsZXg6IG5vbmU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiBub25lOwogICAgICAgIGZsZXg6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgovKiBCYXNpYyBmbGV4Ym94IHJldmVyc2Ugc3R5bGVzICovCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgtcmV2ZXJzZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAubGF5b3V0Lmhvcml6b250YWwtcmV2ZXJzZSwKICAgICAgLmxheW91dC52ZXJ0aWNhbC1yZXZlcnNlIHsKICAgICAgICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmxheW91dC5ob3Jpem9udGFsLXJldmVyc2UgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICB9CgogICAgICAubGF5b3V0LnZlcnRpY2FsLXJldmVyc2UgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICB9CgogICAgICAubGF5b3V0LndyYXAtcmV2ZXJzZSB7CiAgICAgICAgLW1zLWZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgovKiBGbGV4Ym94IGFsaWdubWVudCAqLwo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1mbGV4LWFsaWdubWVudCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAvKioKICAgICAgICogQWxpZ25tZW50IGluIGNyb3NzIGF4aXMuCiAgICAgICAqLwogICAgICAubGF5b3V0LnN0YXJ0IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXIsCiAgICAgIC5sYXlvdXQuY2VudGVyLWNlbnRlciB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmxheW91dC5lbmQgewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBlbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgICB9CgogICAgICAubGF5b3V0LmJhc2VsaW5lIHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogYmFzZWxpbmU7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQWxpZ25tZW50IGluIG1haW4gYXhpcy4KICAgICAgICovCiAgICAgIC5sYXlvdXQuc3RhcnQtanVzdGlmaWVkIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBzdGFydDsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuY2VudGVyLWp1c3RpZmllZCwKICAgICAgLmxheW91dC5jZW50ZXItY2VudGVyIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmxheW91dC5lbmQtanVzdGlmaWVkIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBlbmQ7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYXJvdW5kLWp1c3RpZmllZCB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogZGlzdHJpYnV0ZTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICB9CgogICAgICAubGF5b3V0Lmp1c3RpZmllZCB7CiAgICAgICAgLW1zLWZsZXgtcGFjazoganVzdGlmeTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTZWxmIGFsaWdubWVudC4KICAgICAgICovCiAgICAgIC5zZWxmLXN0YXJ0IHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgICAgfQoKICAgICAgLnNlbGYtY2VudGVyIHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogY2VudGVyOwogICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLnNlbGYtZW5kIHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLnNlbGYtc3RyZXRjaCB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICAgIGFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgIH0KCiAgICAgIC5zZWxmLWJhc2VsaW5lIHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogYmFzZWxpbmU7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICBhbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIG11bHRpLWxpbmUgYWxpZ25tZW50IGluIG1haW4gYXhpcy4KICAgICAgICovCiAgICAgIC5sYXlvdXQuc3RhcnQtYWxpZ25lZCB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBzdGFydDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgfQoKICAgICAgLmxheW91dC5lbmQtYWxpZ25lZCB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBlbmQ7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuY2VudGVyLWFsaWduZWQgewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogY2VudGVyOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmJldHdlZW4tYWxpZ25lZCB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBqdXN0aWZ5OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9CgogICAgICAubGF5b3V0LmFyb3VuZC1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGRpc3RyaWJ1dGU7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgovKiBOb24tZmxleGJveCBwb3NpdGlvbmluZyBoZWxwZXIgc3R5bGVzICovCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgtZmFjdG9ycyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuZmxleCwKICAgICAgLmZsZXgtMSB7CiAgICAgICAgLW1zLWZsZXg6IDEgMSAwLjAwMDAwMDAwMXB4OwogICAgICAgIC13ZWJraXQtZmxleDogMTsKICAgICAgICBmbGV4OiAxOwogICAgICAgIC13ZWJraXQtZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgICBmbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICB9CgogICAgICAuZmxleC0yIHsKICAgICAgICAtbXMtZmxleDogMjsKICAgICAgICAtd2Via2l0LWZsZXg6IDI7CiAgICAgICAgZmxleDogMjsKICAgICAgfQoKICAgICAgLmZsZXgtMyB7CiAgICAgICAgLW1zLWZsZXg6IDM7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAzOwogICAgICAgIGZsZXg6IDM7CiAgICAgIH0KCiAgICAgIC5mbGV4LTQgewogICAgICAgIC1tcy1mbGV4OiA0OwogICAgICAgIC13ZWJraXQtZmxleDogNDsKICAgICAgICBmbGV4OiA0OwogICAgICB9CgogICAgICAuZmxleC01IHsKICAgICAgICAtbXMtZmxleDogNTsKICAgICAgICAtd2Via2l0LWZsZXg6IDU7CiAgICAgICAgZmxleDogNTsKICAgICAgfQoKICAgICAgLmZsZXgtNiB7CiAgICAgICAgLW1zLWZsZXg6IDY7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA2OwogICAgICAgIGZsZXg6IDY7CiAgICAgIH0KCiAgICAgIC5mbGV4LTcgewogICAgICAgIC1tcy1mbGV4OiA3OwogICAgICAgIC13ZWJraXQtZmxleDogNzsKICAgICAgICBmbGV4OiA3OwogICAgICB9CgogICAgICAuZmxleC04IHsKICAgICAgICAtbXMtZmxleDogODsKICAgICAgICAtd2Via2l0LWZsZXg6IDg7CiAgICAgICAgZmxleDogODsKICAgICAgfQoKICAgICAgLmZsZXgtOSB7CiAgICAgICAgLW1zLWZsZXg6IDk7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA5OwogICAgICAgIGZsZXg6IDk7CiAgICAgIH0KCiAgICAgIC5mbGV4LTEwIHsKICAgICAgICAtbXMtZmxleDogMTA7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxMDsKICAgICAgICBmbGV4OiAxMDsKICAgICAgfQoKICAgICAgLmZsZXgtMTEgewogICAgICAgIC1tcy1mbGV4OiAxMTsKICAgICAgICAtd2Via2l0LWZsZXg6IDExOwogICAgICAgIGZsZXg6IDExOwogICAgICB9CgogICAgICAuZmxleC0xMiB7CiAgICAgICAgLW1zLWZsZXg6IDEyOwogICAgICAgIC13ZWJraXQtZmxleDogMTI7CiAgICAgICAgZmxleDogMTI7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1wb3NpdGlvbmluZyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuYmxvY2sgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaW52aXNpYmxlIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLnJlbGF0aXZlIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIGJvZHkuZnVsbGJsZWVkIHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgfQoKICAgICAgLnNjcm9sbCB7CiAgICAgICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAvKiBmaXhlZCBwb3NpdGlvbiAqLwogICAgICAuZml4ZWQtYm90dG9tLAogICAgICAuZml4ZWQtbGVmdCwKICAgICAgLmZpeGVkLXJpZ2h0LAogICAgICAuZml4ZWQtdG9wIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KCiAgICAgIC5maXhlZC10b3AgewogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtcmlnaHQgewogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgIH0KCiAgICAgIC5maXhlZC1ib3R0b20gewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtbGVmdCB7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KYDt5by5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZGlzcGxheTogbm9uZTsiKSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHlvLmNvbnRlbnQpOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3Qgdm89X2VgCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgW2hpZGRlbl0gewogICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICB9CiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+CjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CgogICAgICAtLWxheW91dDogewogICAgICAgIGRpc3BsYXk6IC1tcy1mbGV4Ym94OwogICAgICAgIGRpc3BsYXk6IC13ZWJraXQtZmxleDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaW5saW5lOiB7CiAgICAgICAgZGlzcGxheTogLW1zLWlubGluZS1mbGV4Ym94OwogICAgICAgIGRpc3BsYXk6IC13ZWJraXQtaW5saW5lLWZsZXg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgIH07CgogICAgICAtLWxheW91dC1ob3Jpem9udGFsOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWhvcml6b250YWwtcmV2ZXJzZTogewogICAgICAgIEBhcHBseSAtLWxheW91dDsKCiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgIH07CgogICAgICAtLWxheW91dC12ZXJ0aWNhbDogewogICAgICAgIEBhcHBseSAtLWxheW91dDsKCiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIH07CgogICAgICAtLWxheW91dC12ZXJ0aWNhbC1yZXZlcnNlOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXdyYXA6IHsKICAgICAgICAtbXMtZmxleC13cmFwOiB3cmFwOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwOwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXdyYXAtcmV2ZXJzZTogewogICAgICAgIC1tcy1mbGV4LXdyYXA6IHdyYXAtcmV2ZXJzZTsKICAgICAgICAtd2Via2l0LWZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICAgIGZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC1hdXRvOiB7CiAgICAgICAgLW1zLWZsZXg6IDEgMSBhdXRvOwogICAgICAgIC13ZWJraXQtZmxleDogMSAxIGF1dG87CiAgICAgICAgZmxleDogMSAxIGF1dG87CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LW5vbmU6IHsKICAgICAgICAtbXMtZmxleDogbm9uZTsKICAgICAgICAtd2Via2l0LWZsZXg6IG5vbmU7CiAgICAgICAgZmxleDogbm9uZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXg6IHsKICAgICAgICAtbXMtZmxleDogMSAxIDAuMDAwMDAwMDAxcHg7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxOwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgLXdlYmtpdC1mbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICAgIGZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTI6IHsKICAgICAgICAtbXMtZmxleDogMjsKICAgICAgICAtd2Via2l0LWZsZXg6IDI7CiAgICAgICAgZmxleDogMjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtMzogewogICAgICAgIC1tcy1mbGV4OiAzOwogICAgICAgIC13ZWJraXQtZmxleDogMzsKICAgICAgICBmbGV4OiAzOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC00OiB7CiAgICAgICAgLW1zLWZsZXg6IDQ7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA0OwogICAgICAgIGZsZXg6IDQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTU6IHsKICAgICAgICAtbXMtZmxleDogNTsKICAgICAgICAtd2Via2l0LWZsZXg6IDU7CiAgICAgICAgZmxleDogNTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtNjogewogICAgICAgIC1tcy1mbGV4OiA2OwogICAgICAgIC13ZWJraXQtZmxleDogNjsKICAgICAgICBmbGV4OiA2OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC03OiB7CiAgICAgICAgLW1zLWZsZXg6IDc7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA3OwogICAgICAgIGZsZXg6IDc7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTg6IHsKICAgICAgICAtbXMtZmxleDogODsKICAgICAgICAtd2Via2l0LWZsZXg6IDg7CiAgICAgICAgZmxleDogODsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtOTogewogICAgICAgIC1tcy1mbGV4OiA5OwogICAgICAgIC13ZWJraXQtZmxleDogOTsKICAgICAgICBmbGV4OiA5OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC0xMDogewogICAgICAgIC1tcy1mbGV4OiAxMDsKICAgICAgICAtd2Via2l0LWZsZXg6IDEwOwogICAgICAgIGZsZXg6IDEwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC0xMTogewogICAgICAgIC1tcy1mbGV4OiAxMTsKICAgICAgICAtd2Via2l0LWZsZXg6IDExOwogICAgICAgIGZsZXg6IDExOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC0xMjogewogICAgICAgIC1tcy1mbGV4OiAxMjsKICAgICAgICAtd2Via2l0LWZsZXg6IDEyOwogICAgICAgIGZsZXg6IDEyOwogICAgICB9OwoKICAgICAgLyogYWxpZ25tZW50IGluIGNyb3NzIGF4aXMgKi8KCiAgICAgIC0tbGF5b3V0LXN0YXJ0OiB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IHN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXI6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZW5kOiB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1iYXNlbGluZTogewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICAgIH07CgogICAgICAvKiBhbGlnbm1lbnQgaW4gbWFpbiBheGlzICovCgogICAgICAtLWxheW91dC1zdGFydC1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBzdGFydDsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXItanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogY2VudGVyOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH07CgogICAgICAtLWxheW91dC1lbmQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogZW5kOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYXJvdW5kLWp1c3RpZmllZDogewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGRpc3RyaWJ1dGU7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWp1c3RpZmllZDogewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGp1c3RpZnk7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjogewogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlci1qdXN0aWZpZWQ7CiAgICAgIH07CgogICAgICAvKiBzZWxmIGFsaWdubWVudCAqLwoKICAgICAgLS1sYXlvdXQtc2VsZi1zdGFydDogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1jZW50ZXI6IHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogY2VudGVyOwogICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXNlbGYtZW5kOiB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zZWxmLXN0cmV0Y2g6IHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgICAgYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXNlbGYtYmFzZWxpbmU6IHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogYmFzZWxpbmU7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICBhbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgfTsKCiAgICAgIC8qIG11bHRpLWxpbmUgYWxpZ25tZW50IGluIG1haW4gYXhpcyAqLwoKICAgICAgLS1sYXlvdXQtc3RhcnQtYWxpZ25lZDogewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogc3RhcnQ7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1lbmQtYWxpZ25lZDogewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogZW5kOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtY2VudGVyLWFsaWduZWQ6IHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGNlbnRlcjsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWJldHdlZW4tYWxpZ25lZDogewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazoganVzdGlmeTsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWFyb3VuZC1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBkaXN0cmlidXRlOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgICAgYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICB9OwoKICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICAgIE90aGVyIExheW91dAogICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgICAgLS1sYXlvdXQtYmxvY2s6IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWludmlzaWJsZTogewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtcmVsYXRpdmU6IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH07CgogICAgICAtLWxheW91dC1maXQ6IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2Nyb2xsOiB7CiAgICAgICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZnVsbGJsZWVkOiB7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGhlaWdodDogMTAwdmg7CiAgICAgIH07CgogICAgICAvKiBmaXhlZCBwb3NpdGlvbiAqLwoKICAgICAgLS1sYXlvdXQtZml4ZWQtdG9wOiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml4ZWQtcmlnaHQ6IHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZpeGVkLWJvdHRvbTogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZpeGVkLWxlZnQ6IHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9OwoKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT5gO3ZvLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJkaXNwbGF5OiBub25lOyIpLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodm8uY29udGVudCk7dmFyIGJvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7Ym8udGV4dENvbnRlbnQ9IltoaWRkZW5dIHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9Iixkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGJvKTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNsYXNzIHhve2NvbnN0cnVjdG9yKHQpe3hvWyIgIl0odCksdGhpcy50eXBlPXQmJnQudHlwZXx8ImRlZmF1bHQiLHRoaXMua2V5PXQmJnQua2V5LHQmJiJ2YWx1ZSJpbiB0JiYodGhpcy52YWx1ZT10LnZhbHVlKX1nZXQgdmFsdWUoKXt2YXIgdD10aGlzLnR5cGUsZT10aGlzLmtleTtpZih0JiZlKXJldHVybiB4by50eXBlc1t0XSYmeG8udHlwZXNbdF1bZV19c2V0IHZhbHVlKHQpe3ZhciBlPXRoaXMudHlwZSxuPXRoaXMua2V5O2UmJm4mJihlPXhvLnR5cGVzW2VdPXhvLnR5cGVzW2VdfHx7fSxudWxsPT10P2RlbGV0ZSBlW25dOmVbbl09dCl9Z2V0IGxpc3QoKXtpZih0aGlzLnR5cGUpe3ZhciB0PXhvLnR5cGVzW3RoaXMudHlwZV07cmV0dXJuIHQ/T2JqZWN0LmtleXModCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gd29bdGhpcy50eXBlXVt0XX0pLHRoaXMpOltdfX1ieUtleSh0KXtyZXR1cm4gdGhpcy5rZXk9dCx0aGlzLnZhbHVlfX14b1siICJdPWZ1bmN0aW9uKCl7fSx4by50eXBlcz17fTt2YXIgd289eG8udHlwZXM7UnIoe2lzOiJpcm9uLW1ldGEiLHByb3BlcnRpZXM6e3R5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJkZWZhdWx0In0sa2V5Ont0eXBlOlN0cmluZ30sdmFsdWU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sc2VsZjp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfc2VsZkNoYW5nZWQifSxfX21ldGE6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX19jb21wdXRlTWV0YSh0eXBlLCBrZXksIHZhbHVlKSJ9fSxob3N0QXR0cmlidXRlczp7aGlkZGVuOiEwfSxfX2NvbXB1dGVNZXRhOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uZXcgeG8oe3R5cGU6dCxrZXk6ZX0pO3JldHVybiB2b2lkIDAhPT1uJiZuIT09aS52YWx1ZT9pLnZhbHVlPW46dGhpcy52YWx1ZSE9PWkudmFsdWUmJih0aGlzLnZhbHVlPWkudmFsdWUpLGl9LGdldCBsaXN0KCl7cmV0dXJuIHRoaXMuX19tZXRhJiZ0aGlzLl9fbWV0YS5saXN0fSxfc2VsZkNoYW5nZWQ6ZnVuY3Rpb24odCl7dCYmKHRoaXMudmFsdWU9dGhpcyl9LGJ5S2V5OmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgeG8oe3R5cGU6dGhpcy50eXBlLGtleTp0fSkudmFsdWV9fSksCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpScih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWlubGluZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CgogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgogICAgICAgIGZpbGw6IHZhcigtLWlyb24taWNvbi1maWxsLWNvbG9yLCBjdXJyZW50Y29sb3IpOwogICAgICAgIHN0cm9rZTogdmFyKC0taXJvbi1pY29uLXN0cm9rZS1jb2xvciwgbm9uZSk7CgogICAgICAgIHdpZHRoOiB2YXIoLS1pcm9uLWljb24td2lkdGgsIDI0cHgpOwogICAgICAgIGhlaWdodDogdmFyKC0taXJvbi1pY29uLWhlaWdodCwgMjRweCk7CiAgICAgICAgQGFwcGx5IC0taXJvbi1pY29uOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CmAsaXM6Imlyb24taWNvbiIscHJvcGVydGllczp7aWNvbjp7dHlwZTpTdHJpbmd9LHRoZW1lOnt0eXBlOlN0cmluZ30sc3JjOnt0eXBlOlN0cmluZ30sX21ldGE6e3ZhbHVlOmZvLmNyZWF0ZSgiaXJvbi1tZXRhIix7dHlwZToiaWNvbnNldCJ9KX19LG9ic2VydmVyczpbIl91cGRhdGVJY29uKF9tZXRhLCBpc0F0dGFjaGVkKSIsIl91cGRhdGVJY29uKHRoZW1lLCBpc0F0dGFjaGVkKSIsIl9zcmNDaGFuZ2VkKHNyYywgaXNBdHRhY2hlZCkiLCJfaWNvbkNoYW5nZWQoaWNvbiwgaXNBdHRhY2hlZCkiXSxfREVGQVVMVF9JQ09OU0VUOiJpY29ucyIsX2ljb25DaGFuZ2VkOmZ1bmN0aW9uKHQpe3ZhciBlPSh0fHwiIikuc3BsaXQoIjoiKTt0aGlzLl9pY29uTmFtZT1lLnBvcCgpLHRoaXMuX2ljb25zZXROYW1lPWUucG9wKCl8fHRoaXMuX0RFRkFVTFRfSUNPTlNFVCx0aGlzLl91cGRhdGVJY29uKCl9LF9zcmNDaGFuZ2VkOmZ1bmN0aW9uKHQpe3RoaXMuX3VwZGF0ZUljb24oKX0sX3VzZXNJY29uc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWNvbnx8IXRoaXMuc3JjfSxfdXBkYXRlSWNvbjpmdW5jdGlvbigpe3RoaXMuX3VzZXNJY29uc2V0KCk/KHRoaXMuX2ltZyYmdGhpcy5faW1nLnBhcmVudE5vZGUmJllpKHRoaXMucm9vdCkucmVtb3ZlQ2hpbGQodGhpcy5faW1nKSwiIj09PXRoaXMuX2ljb25OYW1lP3RoaXMuX2ljb25zZXQmJnRoaXMuX2ljb25zZXQucmVtb3ZlSWNvbih0aGlzKTp0aGlzLl9pY29uc2V0TmFtZSYmdGhpcy5fbWV0YSYmKHRoaXMuX2ljb25zZXQ9dGhpcy5fbWV0YS5ieUtleSh0aGlzLl9pY29uc2V0TmFtZSksdGhpcy5faWNvbnNldD8odGhpcy5faWNvbnNldC5hcHBseUljb24odGhpcyx0aGlzLl9pY29uTmFtZSx0aGlzLnRoZW1lKSx0aGlzLnVubGlzdGVuKHdpbmRvdywiaXJvbi1pY29uc2V0LWFkZGVkIiwiX3VwZGF0ZUljb24iKSk6dGhpcy5saXN0ZW4od2luZG93LCJpcm9uLWljb25zZXQtYWRkZWQiLCJfdXBkYXRlSWNvbiIpKSk6KHRoaXMuX2ljb25zZXQmJnRoaXMuX2ljb25zZXQucmVtb3ZlSWNvbih0aGlzKSx0aGlzLl9pbWd8fCh0aGlzLl9pbWc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksdGhpcy5faW1nLnN0eWxlLndpZHRoPSIxMDAlIix0aGlzLl9pbWcuc3R5bGUuaGVpZ2h0PSIxMDAlIix0aGlzLl9pbWcuZHJhZ2dhYmxlPSExKSx0aGlzLl9pbWcuc3JjPXRoaXMuc3JjLFlpKHRoaXMucm9vdCkuYXBwZW5kQ2hpbGQodGhpcy5faW1nKSl9fSksCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpScih7aXM6Imlyb24taWNvbnNldC1zdmciLHByb3BlcnRpZXM6e25hbWU6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfbmFtZUNoYW5nZWQifSxzaXplOnt0eXBlOk51bWJlcix2YWx1ZToyNH0scnRsTWlycm9yaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHVzZUdsb2JhbFJ0bEF0dHJpYnV0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX21ldGE9bmV3IHhvKHt0eXBlOiJpY29uc2V0IixrZXk6bnVsbCx2YWx1ZTpudWxsfSl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZ2V0SWNvbk5hbWVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ljb25zPXRoaXMuX2NyZWF0ZUljb25NYXAoKSxPYmplY3Qua2V5cyh0aGlzLl9pY29ucykubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5uYW1lKyI6Iit0fSksdGhpcyl9LGFwcGx5SWNvbjpmdW5jdGlvbih0LGUpe3RoaXMucmVtb3ZlSWNvbih0KTt2YXIgbj10aGlzLl9jbG9uZUljb24oZSx0aGlzLnJ0bE1pcnJvcmluZyYmdGhpcy5fdGFyZ2V0SXNSVEwodCkpO2lmKG4pe3ZhciBpPVlpKHQucm9vdHx8dCk7cmV0dXJuIGkuaW5zZXJ0QmVmb3JlKG4saS5jaGlsZE5vZGVzWzBdKSx0Ll9zdmdJY29uPW59cmV0dXJuIG51bGx9LHJlbW92ZUljb246ZnVuY3Rpb24odCl7dC5fc3ZnSWNvbiYmKFlpKHQucm9vdHx8dCkucmVtb3ZlQ2hpbGQodC5fc3ZnSWNvbiksdC5fc3ZnSWNvbj1udWxsKX0sX3RhcmdldElzUlRMOmZ1bmN0aW9uKHQpe2lmKG51bGw9PXRoaXMuX190YXJnZXRJc1JUTClpZih0aGlzLnVzZUdsb2JhbFJ0bEF0dHJpYnV0ZSl7dmFyIGU9ZG9jdW1lbnQuYm9keSYmZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoImRpciIpP2RvY3VtZW50LmJvZHk6ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O3RoaXMuX190YXJnZXRJc1JUTD0icnRsIj09PWUuZ2V0QXR0cmlidXRlKCJkaXIiKX1lbHNlIHQmJnQubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSYmKHQ9dC5ob3N0KSx0aGlzLl9fdGFyZ2V0SXNSVEw9dCYmInJ0bCI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS5kaXJlY3Rpb247cmV0dXJuIHRoaXMuX190YXJnZXRJc1JUTH0sX25hbWVDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fbWV0YS52YWx1ZT1udWxsLHRoaXMuX21ldGEua2V5PXRoaXMubmFtZSx0aGlzLl9tZXRhLnZhbHVlPXRoaXMsdGhpcy5hc3luYygoZnVuY3Rpb24oKXt0aGlzLmZpcmUoImlyb24taWNvbnNldC1hZGRlZCIsdGhpcyx7bm9kZTp3aW5kb3d9KX0pKX0sX2NyZWF0ZUljb25NYXA6ZnVuY3Rpb24oKXt2YXIgdD1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBZaSh0aGlzKS5xdWVyeVNlbGVjdG9yQWxsKCJbaWRdIikuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dFtlLmlkXT1lfSkpLHR9LF9jbG9uZUljb246ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5faWNvbnM9dGhpcy5faWNvbnN8fHRoaXMuX2NyZWF0ZUljb25NYXAoKSx0aGlzLl9wcmVwYXJlU3ZnQ2xvbmUodGhpcy5faWNvbnNbdF0sdGhpcy5zaXplLGUpfSxfcHJlcGFyZVN2Z0Nsb25lOmZ1bmN0aW9uKHQsZSxuKXtpZih0KXt2YXIgaT10LmNsb25lTm9kZSghMCkscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwic3ZnIiksbz1pLmdldEF0dHJpYnV0ZSgidmlld0JveCIpfHwiMCAwICIrZSsiICIrZSxhPSJwb2ludGVyLWV2ZW50czogbm9uZTsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IjtyZXR1cm4gbiYmaS5oYXNBdHRyaWJ1dGUoIm1pcnJvci1pbi1ydGwiKSYmKGErPSItd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgtMSwxKTt0cmFuc2Zvcm06c2NhbGUoLTEsMSk7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7Iiksci5zZXRBdHRyaWJ1dGUoInZpZXdCb3giLG8pLHIuc2V0QXR0cmlidXRlKCJwcmVzZXJ2ZUFzcGVjdFJhdGlvIiwieE1pZFlNaWQgbWVldCIpLHIuc2V0QXR0cmlidXRlKCJmb2N1c2FibGUiLCJmYWxzZSIpLHIuc3R5bGUuY3NzVGV4dD1hLHIuYXBwZW5kQ2hpbGQoaSkucmVtb3ZlQXR0cmlidXRlKCJpZCIpLHJ9cmV0dXJuIG51bGx9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBTbz1fZWA8aXJvbi1pY29uc2V0LXN2ZyBuYW1lPSJpbWFnZSIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iYWRkLWEtcGhvdG8iPjxwYXRoIGQ9Ik0zIDRWMWgydjNoM3YySDV2M0gzVjZIMFY0aDN6bTMgNlY3aDNWNGg3bDEuODMgMkgyMWMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg1Yy0xLjEgMC0yLS45LTItMlYxMGgzem03IDljMi43NiAwIDUtMi4yNCA1LTVzLTIuMjQtNS01LTUtNSAyLjI0LTUgNSAyLjI0IDUgNSA1em0tMy4yLTVjMCAxLjc3IDEuNDMgMy4yIDMuMiAzLjJzMy4yLTEuNDMgMy4yLTMuMi0xLjQzLTMuMi0zLjItMy4yLTMuMiAxLjQzLTMuMiAzLjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYWRkLXRvLXBob3RvcyI+PHBhdGggZD0iTTQgNkgydjE0YzAgMS4xLjkgMiAyIDJoMTR2LTJINFY2em0xNi00SDhjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTEgOWgtNHY0aC0ydi00SDlWOWg0VjVoMnY0aDR2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJhZGp1c3QiPjxwYXRoIGQ9Ik0xMiAyQzYuNDkgMiAyIDYuNDkgMiAxMnM0LjQ5IDEwIDEwIDEwIDEwLTQuNDkgMTAtMTBTMTcuNTEgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHptMy04YzAgMS42Ni0xLjM0IDMtMyAzcy0zLTEuMzQtMy0zIDEuMzQtMyAzLTMgMyAxLjM0IDMgM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJhc3Npc3RhbnQiPjxwYXRoIGQ9Ik0xOSAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoNGwzIDMgMy0zaDRjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTUuMTIgMTAuODhMMTIgMTdsLTEuODgtNC4xMkw2IDExbDQuMTItMS44OEwxMiA1bDEuODggNC4xMkwxOCAxMWwtNC4xMiAxLjg4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFzc2lzdGFudC1waG90byI+PHBhdGggZD0iTTE0LjQgNkwxNCA0SDV2MTdoMnYtN2g1LjZsLjQgMmg3VjZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXVkaW90cmFjayI+PHBhdGggZD0iTTEyIDN2OS4yOGMtLjQ3LS4xNy0uOTctLjI4LTEuNS0uMjhDOC4wMSAxMiA2IDE0LjAxIDYgMTYuNVM4LjAxIDIxIDEwLjUgMjFjMi4zMSAwIDQuMi0xLjc1IDQuNDUtNEgxNVY2aDRWM2gtN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJibHVyLWNpcmN1bGFyIj48cGF0aCBkPSJNMTAgOWMtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTEtLjQ1LTEtMS0xem0wIDRjLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xLS40NS0xLTEtMXpNNyA5LjVjLS4yOCAwLS41LjIyLS41LjVzLjIyLjUuNS41LjUtLjIyLjUtLjUtLjIyLS41LS41LS41em0zIDdjLS4yOCAwLS41LjIyLS41LjVzLjIyLjUuNS41LjUtLjIyLjUtLjUtLjIyLS41LS41LS41em0tMy0zYy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXptMy02Yy4yOCAwIC41LS4yMi41LS41cy0uMjItLjUtLjUtLjUtLjUuMjItLjUuNS4yMi41LjUuNXpNMTQgOWMtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTEtLjQ1LTEtMS0xem0wLTEuNWMuMjggMCAuNS0uMjIuNS0uNXMtLjIyLS41LS41LS41LS41LjIyLS41LjUuMjIuNS41LjV6bTMgNmMtLjI4IDAtLjUuMjItLjUuNXMuMjIuNS41LjUuNS0uMjIuNS0uNS0uMjItLjUtLjUtLjV6bTAtNGMtLjI4IDAtLjUuMjItLjUuNXMuMjIuNS41LjUuNS0uMjIuNS0uNS0uMjItLjUtLjUtLjV6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4em0yLTMuNWMtLjI4IDAtLjUuMjItLjUuNXMuMjIuNS41LjUuNS0uMjIuNS0uNS0uMjItLjUtLjUtLjV6bTAtMy41Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYmx1ci1saW5lYXIiPjxwYXRoIGQ9Ik01IDE3LjVjLjgzIDAgMS41LS42NyAxLjUtMS41cy0uNjctMS41LTEuNS0xLjUtMS41LjY3LTEuNSAxLjUuNjcgMS41IDEuNSAxLjV6TTkgMTNjLjU1IDAgMS0uNDUgMS0xcy0uNDUtMS0xLTEtMSAuNDUtMSAxIC40NSAxIDEgMXptMC00Yy41NSAwIDEtLjQ1IDEtMXMtLjQ1LTEtMS0xLTEgLjQ1LTEgMSAuNDUgMSAxIDF6TTMgMjFoMTh2LTJIM3Yyek01IDkuNWMuODMgMCAxLjUtLjY3IDEuNS0xLjVTNS44MyA2LjUgNSA2LjUgMy41IDcuMTcgMy41IDggNC4xNyA5LjUgNSA5LjV6bTAgNGMuODMgMCAxLjUtLjY3IDEuNS0xLjVzLS42Ny0xLjUtMS41LTEuNS0xLjUuNjctMS41IDEuNS42NyAxLjUgMS41IDEuNXpNOSAxN2MuNTUgMCAxLS40NSAxLTFzLS40NS0xLTEtMS0xIC40NS0xIDEgLjQ1IDEgMSAxem04LS41Yy4yOCAwIC41LS4yMi41LS41cy0uMjItLjUtLjUtLjUtLjUuMjItLjUuNS4yMi41LjUuNXpNMyAzdjJoMThWM0gzem0xNCA1LjVjLjI4IDAgLjUtLjIyLjUtLjVzLS4yMi0uNS0uNS0uNS0uNS4yMi0uNS41LjIyLjUuNS41em0wIDRjLjI4IDAgLjUtLjIyLjUtLjVzLS4yMi0uNS0uNS0uNS0uNS4yMi0uNS41LjIyLjUuNS41ek0xMyA5Yy41NSAwIDEtLjQ1IDEtMXMtLjQ1LTEtMS0xLTEgLjQ1LTEgMSAuNDUgMSAxIDF6bTAgNGMuNTUgMCAxLS40NSAxLTFzLS40NS0xLTEtMS0xIC40NS0xIDEgLjQ1IDEgMSAxem0wIDRjLjU1IDAgMS0uNDUgMS0xcy0uNDUtMS0xLTEtMSAuNDUtMSAxIC40NSAxIDEgMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJibHVyLW9mZiI+PHBhdGggZD0iTTE0IDdjLjU1IDAgMS0uNDUgMS0xcy0uNDUtMS0xLTEtMSAuNDUtMSAxIC40NSAxIDEgMXptLS4yIDQuNDhsLjIuMDJjLjgzIDAgMS41LS42NyAxLjUtMS41cy0uNjctMS41LTEuNS0xLjUtMS41LjY3LTEuNSAxLjVsLjAyLjJjLjA5LjY3LjYxIDEuMTkgMS4yOCAxLjI4ek0xNCAzLjVjLjI4IDAgLjUtLjIyLjUtLjVzLS4yMi0uNS0uNS0uNS0uNS4yMi0uNS41LjIyLjUuNS41em0tNCAwYy4yOCAwIC41LS4yMi41LS41cy0uMjItLjUtLjUtLjUtLjUuMjItLjUuNS4yMi41LjUuNXptMTEgN2MuMjggMCAuNS0uMjIuNS0uNXMtLjIyLS41LS41LS41LS41LjIyLS41LjUuMjIuNS41LjV6TTEwIDdjLjU1IDAgMS0uNDUgMS0xcy0uNDUtMS0xLTEtMSAuNDUtMSAxIC40NSAxIDEgMXptOCA4Yy41NSAwIDEtLjQ1IDEtMXMtLjQ1LTEtMS0xLTEgLjQ1LTEgMSAuNDUgMSAxIDF6bTAtNGMuNTUgMCAxLS40NSAxLTFzLS40NS0xLTEtMS0xIC40NS0xIDEgLjQ1IDEgMSAxem0wLTRjLjU1IDAgMS0uNDUgMS0xcy0uNDUtMS0xLTEtMSAuNDUtMSAxIC40NSAxIDEgMXptLTQgMTMuNWMtLjI4IDAtLjUuMjItLjUuNXMuMjIuNS41LjUuNS0uMjIuNS0uNS0uMjItLjUtLjUtLjV6TTIuNSA1LjI3bDMuNzggMy43OEw2IDljLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xYzAtLjEtLjAzLS4xOS0uMDYtLjI4bDIuODEgMi44MWMtLjcxLjExLTEuMjUuNzMtMS4yNSAxLjQ3IDAgLjgzLjY3IDEuNSAxLjUgMS41Ljc0IDAgMS4zNi0uNTQgMS40Ny0xLjI1bDIuODEgMi44MWMtLjA5LS4wMy0uMTgtLjA2LS4yOC0uMDYtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTFjMC0uMS0uMDMtLjE5LS4wNi0uMjhsMy43OCAzLjc4TDIwIDIwLjIzIDMuNzcgNCAyLjUgNS4yN3pNMTAgMTdjLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xLS40NS0xLTEtMXptMTEtMy41Yy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXpNNiAxM2MtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTEtLjQ1LTEtMS0xek0zIDkuNWMtLjI4IDAtLjUuMjItLjUuNXMuMjIuNS41LjUuNS0uMjIuNS0uNS0uMjItLjUtLjUtLjV6bTcgMTFjLS4yOCAwLS41LjIyLS41LjVzLjIyLjUuNS41LjUtLjIyLjUtLjUtLjIyLS41LS41LS41ek02IDE3Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6bS0zLTMuNWMtLjI4IDAtLjUuMjItLjUuNXMuMjIuNS41LjUuNS0uMjIuNS0uNS0uMjItLjUtLjUtLjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYmx1ci1vbiI+PHBhdGggZD0iTTYgMTNjLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xLS40NS0xLTEtMXptMCA0Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6bTAtOGMtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTEtLjQ1LTEtMS0xem0tMyAuNWMtLjI4IDAtLjUuMjItLjUuNXMuMjIuNS41LjUuNS0uMjIuNS0uNS0uMjItLjUtLjUtLjV6TTYgNWMtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTEtLjQ1LTEtMS0xem0xNSA1LjVjLjI4IDAgLjUtLjIyLjUtLjVzLS4yMi0uNS0uNS0uNS0uNS4yMi0uNS41LjIyLjUuNS41ek0xNCA3Yy41NSAwIDEtLjQ1IDEtMXMtLjQ1LTEtMS0xLTEgLjQ1LTEgMSAuNDUgMSAxIDF6bTAtMy41Yy4yOCAwIC41LS4yMi41LS41cy0uMjItLjUtLjUtLjUtLjUuMjItLjUuNS4yMi41LjUuNXptLTExIDEwYy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXptNyA3Yy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXptMC0xN2MuMjggMCAuNS0uMjIuNS0uNXMtLjIyLS41LS41LS41LS41LjIyLS41LjUuMjIuNS41LjV6TTEwIDdjLjU1IDAgMS0uNDUgMS0xcy0uNDUtMS0xLTEtMSAuNDUtMSAxIC40NSAxIDEgMXptMCA1LjVjLS44MyAwLTEuNS42Ny0xLjUgMS41cy42NyAxLjUgMS41IDEuNSAxLjUtLjY3IDEuNS0xLjUtLjY3LTEuNS0xLjUtMS41em04IC41Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6bTAgNGMtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTEtLjQ1LTEtMS0xem0wLThjLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xLS40NS0xLTEtMXptMC00Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6bTMgOC41Yy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXpNMTQgMTdjLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xLS40NS0xLTEtMXptMCAzLjVjLS4yOCAwLS41LjIyLS41LjVzLjIyLjUuNS41LjUtLjIyLjUtLjUtLjIyLS41LS41LS41em0tNC0xMmMtLjgzIDAtMS41LjY3LTEuNSAxLjVzLjY3IDEuNSAxLjUgMS41IDEuNS0uNjcgMS41LTEuNS0uNjctMS41LTEuNS0xLjV6bTAgOC41Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6bTQtNC41Yy0uODMgMC0xLjUuNjctMS41IDEuNXMuNjcgMS41IDEuNSAxLjUgMS41LS42NyAxLjUtMS41LS42Ny0xLjUtMS41LTEuNXptMC00Yy0uODMgMC0xLjUuNjctMS41IDEuNXMuNjcgMS41IDEuNSAxLjUgMS41LS42NyAxLjUtMS41LS42Ny0xLjUtMS41LTEuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJicmlnaHRuZXNzLTEiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEwIj48L2NpcmNsZT48L2c+CjxnIGlkPSJicmlnaHRuZXNzLTIiPjxwYXRoIGQ9Ik0xMCAyYy0xLjgyIDAtMy41My41LTUgMS4zNUM3Ljk5IDUuMDggMTAgOC4zIDEwIDEycy0yLjAxIDYuOTItNSA4LjY1QzYuNDcgMjEuNSA4LjE4IDIyIDEwIDIyYzUuNTIgMCAxMC00LjQ4IDEwLTEwUzE1LjUyIDIgMTAgMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJicmlnaHRuZXNzLTMiPjxwYXRoIGQ9Ik05IDJjLTEuMDUgMC0yLjA1LjE2LTMgLjQ2IDQuMDYgMS4yNyA3IDUuMDYgNyA5LjU0IDAgNC40OC0yLjk0IDguMjctNyA5LjU0Ljk1LjMgMS45NS40NiAzIC40NiA1LjUyIDAgMTAtNC40OCAxMC0xMFMxNC41MiAyIDkgMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJicmlnaHRuZXNzLTQiPjxwYXRoIGQ9Ik0yMCA4LjY5VjRoLTQuNjlMMTIgLjY5IDguNjkgNEg0djQuNjlMLjY5IDEyIDQgMTUuMzFWMjBoNC42OUwxMiAyMy4zMSAxNS4zMSAyMEgyMHYtNC42OUwyMy4zMSAxMiAyMCA4LjY5ek0xMiAxOGMtLjg5IDAtMS43NC0uMi0yLjUtLjU1QzExLjU2IDE2LjUgMTMgMTQuNDIgMTMgMTJzLTEuNDQtNC41LTMuNS01LjQ1QzEwLjI2IDYuMiAxMS4xMSA2IDEyIDZjMy4zMSAwIDYgMi42OSA2IDZzLTIuNjkgNi02IDZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYnJpZ2h0bmVzcy01Ij48cGF0aCBkPSJNMjAgMTUuMzFMMjMuMzEgMTIgMjAgOC42OVY0aC00LjY5TDEyIC42OSA4LjY5IDRINHY0LjY5TC42OSAxMiA0IDE1LjMxVjIwaDQuNjlMMTIgMjMuMzEgMTUuMzEgMjBIMjB2LTQuNjl6TTEyIDE4Yy0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02IDYgMi42OSA2IDYtMi42OSA2LTYgNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJicmlnaHRuZXNzLTYiPjxwYXRoIGQ9Ik0yMCAxNS4zMUwyMy4zMSAxMiAyMCA4LjY5VjRoLTQuNjlMMTIgLjY5IDguNjkgNEg0djQuNjlMLjY5IDEyIDQgMTUuMzFWMjBoNC42OUwxMiAyMy4zMSAxNS4zMSAyMEgyMHYtNC42OXpNMTIgMThWNmMzLjMxIDAgNiAyLjY5IDYgNnMtMi42OSA2LTYgNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJicmlnaHRuZXNzLTciPjxwYXRoIGQ9Ik0yMCA4LjY5VjRoLTQuNjlMMTIgLjY5IDguNjkgNEg0djQuNjlMLjY5IDEyIDQgMTUuMzFWMjBoNC42OUwxMiAyMy4zMSAxNS4zMSAyMEgyMHYtNC42OUwyMy4zMSAxMiAyMCA4LjY5ek0xMiAxOGMtMy4zMSAwLTYtMi42OS02LTZzMi42OS02IDYtNiA2IDIuNjkgNiA2LTIuNjkgNi02IDZ6bTAtMTBjLTIuMjEgMC00IDEuNzktNCA0czEuNzkgNCA0IDQgNC0xLjc5IDQtNC0xLjc5LTQtNC00eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJyb2tlbi1pbWFnZSI+PHBhdGggZD0iTTIxIDV2Ni41OWwtMy0zLjAxLTQgNC4wMS00LTQtNCA0LTMtMy4wMVY1YzAtMS4xLjktMiAyLTJoMTRjMS4xIDAgMiAuOSAyIDJ6bS0zIDYuNDJsMyAzLjAxVjE5YzAgMS4xLS45IDItMiAySDVjLTEuMSAwLTItLjktMi0ydi02LjU4bDMgMi45OSA0LTQgNCA0IDQtMy45OXoiPjwvcGF0aD48L2c+CjxnIGlkPSJicnVzaCI+PHBhdGggZD0iTTcgMTRjLTEuNjYgMC0zIDEuMzQtMyAzIDAgMS4zMS0xLjE2IDItMiAyIC45MiAxLjIyIDIuNDkgMiA0IDIgMi4yMSAwIDQtMS43OSA0LTQgMC0xLjY2LTEuMzQtMy0zLTN6bTEzLjcxLTkuMzdsLTEuMzQtMS4zNGMtLjM5LS4zOS0xLjAyLS4zOS0xLjQxIDBMOSAxMi4yNSAxMS43NSAxNWw4Ljk2LTguOTZjLjM5LS4zOS4zOS0xLjAyIDAtMS40MXoiPjwvcGF0aD48L2c+CjxnIGlkPSJidXJzdC1tb2RlIj48cGF0aCBkPSJNMSA1aDJ2MTRIMXptNCAwaDJ2MTRINXptMTcgMEgxMGMtLjU1IDAtMSAuNDUtMSAxdjEyYzAgLjU1LjQ1IDEgMSAxaDEyYy41NSAwIDEtLjQ1IDEtMVY2YzAtLjU1LS40NS0xLTEtMXpNMTEgMTdsMi41LTMuMTVMMTUuMjkgMTZsMi41LTMuMjJMMjEgMTdIMTF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2FtZXJhIj48cGF0aCBkPSJNOS40IDEwLjVsNC43Ny04LjI2QzEzLjQ3IDIuMDkgMTIuNzUgMiAxMiAyYy0yLjQgMC00LjYuODUtNi4zMiAyLjI1bDMuNjYgNi4zNS4wNi0uMXpNMjEuNTQgOWMtLjkyLTIuOTItMy4xNS01LjI2LTYtNi4zNEwxMS44OCA5aDkuNjZ6bS4yNiAxaC03LjQ5bC4yOS41IDQuNzYgOC4yNUMyMSAxNi45NyAyMiAxNC42MSAyMiAxMmMwLS42OS0uMDctMS4zNS0uMi0yek04LjU0IDEybC0zLjktNi43NUMzLjAxIDcuMDMgMiA5LjM5IDIgMTJjMCAuNjkuMDcgMS4zNS4yIDJoNy40OWwtMS4xNS0yem0tNi4wOCAzYy45MiAyLjkyIDMuMTUgNS4yNiA2IDYuMzRMMTIuMTIgMTVIMi40NnptMTEuMjcgMGwtMy45IDYuNzZjLjcuMTUgMS40Mi4yNCAyLjE3LjI0IDIuNCAwIDQuNi0uODUgNi4zMi0yLjI1bC0zLjY2LTYuMzUtLjkzIDEuNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjYW1lcmEtYWx0Ij48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIzLjIiPjwvY2lyY2xlPjxwYXRoIGQ9Ik05IDJMNy4xNyA0SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMmgtMy4xN0wxNSAySDl6bTMgMTVjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNhbWVyYS1mcm9udCI+PHBhdGggZD0iTTEwIDIwSDV2Mmg1djJsMy0zLTMtM3Yyem00IDB2Mmg1di0yaC01ek0xMiA4YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0xLjk5LjktMS45OSAyUzEwLjkgOCAxMiA4em01LThIN0M1LjkgMCA1IC45IDUgMnYxNGMwIDEuMS45IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjJjMC0xLjEtLjktMi0yLTJ6TTcgMmgxMHYxMC41YzAtMS42Ny0zLjMzLTIuNS01LTIuNXMtNSAuODMtNSAyLjVWMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjYW1lcmEtcmVhciI+PHBhdGggZD0iTTEwIDIwSDV2Mmg1djJsMy0zLTMtM3Yyem00IDB2Mmg1di0yaC01em0zLTIwSDdDNS45IDAgNSAuOSA1IDJ2MTRjMCAxLjEuOSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlYyYzAtMS4xLS45LTItMi0yem0tNSA2Yy0xLjExIDAtMi0uOS0yLTJzLjg5LTIgMS45OS0yIDIgLjkgMiAyQzE0IDUuMSAxMy4xIDYgMTIgNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjYW1lcmEtcm9sbCI+PHBhdGggZD0iTTE0IDVjMC0xLjEtLjktMi0yLTJoLTFWMmMwLS41NS0uNDUtMS0xLTFINmMtLjU1IDAtMSAuNDUtMSAxdjFINGMtMS4xIDAtMiAuOS0yIDJ2MTVjMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yaDhWNWgtOHptLTIgMTNoLTJ2LTJoMnYyem0wLTloLTJWN2gydjJ6bTQgOWgtMnYtMmgydjJ6bTAtOWgtMlY3aDJ2MnptNCA5aC0ydi0yaDJ2MnptMC05aC0yVjdoMnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNlbnRlci1mb2N1cy1zdHJvbmciPjxwYXRoIGQ9Ik0xMiA4Yy0yLjIxIDAtNCAxLjc5LTQgNHMxLjc5IDQgNCA0IDQtMS43OSA0LTQtMS43OS00LTQtNHptLTcgN0gzdjRjMCAxLjEuOSAyIDIgMmg0di0ySDV2LTR6TTUgNWg0VjNINWMtMS4xIDAtMiAuOS0yIDJ2NGgyVjV6bTE0LTJoLTR2Mmg0djRoMlY1YzAtMS4xLS45LTItMi0yem0wIDE2aC00djJoNGMxLjEgMCAyLS45IDItMnYtNGgtMnY0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNlbnRlci1mb2N1cy13ZWFrIj48cGF0aCBkPSJNNSAxNUgzdjRjMCAxLjEuOSAyIDIgMmg0di0ySDV2LTR6TTUgNWg0VjNINWMtMS4xIDAtMiAuOS0yIDJ2NGgyVjV6bTE0LTJoLTR2Mmg0djRoMlY1YzAtMS4xLS45LTItMi0yem0wIDE2aC00djJoNGMxLjEgMCAyLS45IDItMnYtNGgtMnY0ek0xMiA4Yy0yLjIxIDAtNCAxLjc5LTQgNHMxLjc5IDQgNCA0IDQtMS43OSA0LTQtMS43OS00LTQtNHptMCA2Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjb2xsZWN0aW9ucyI+PHBhdGggZD0iTTIyIDE2VjRjMC0xLjEtLjktMi0yLTJIOGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMnptLTExLTRsMi4wMyAyLjcxTDE2IDExbDQgNUg4bDMtNHpNMiA2djE0YzAgMS4xLjkgMiAyIDJoMTR2LTJINFY2SDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY29sbGVjdGlvbnMtYm9va21hcmsiPjxwYXRoIGQ9Ik00IDZIMnYxNGMwIDEuMS45IDIgMiAyaDE0di0ySDRWNnptMTYtNEg4Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bTAgMTBsLTIuNS0xLjVMMTUgMTJWNGg1djh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY29sb3ItbGVucyI+PHBhdGggZD0iTTEyIDNjLTQuOTcgMC05IDQuMDMtOSA5czQuMDMgOSA5IDljLjgzIDAgMS41LS42NyAxLjUtMS41IDAtLjM5LS4xNS0uNzQtLjM5LTEuMDEtLjIzLS4yNi0uMzgtLjYxLS4zOC0uOTkgMC0uODMuNjctMS41IDEuNS0xLjVIMTZjMi43NiAwIDUtMi4yNCA1LTUgMC00LjQyLTQuMDMtOC05LTh6bS01LjUgOWMtLjgzIDAtMS41LS42Ny0xLjUtMS41UzUuNjcgOSA2LjUgOSA4IDkuNjcgOCAxMC41IDcuMzMgMTIgNi41IDEyem0zLTRDOC42NyA4IDggNy4zMyA4IDYuNVM4LjY3IDUgOS41IDVzMS41LjY3IDEuNSAxLjVTMTAuMzMgOCA5LjUgOHptNSAwYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVTMTMuNjcgNSAxNC41IDVzMS41LjY3IDEuNSAxLjVTMTUuMzMgOCAxNC41IDh6bTMgNGMtLjgzIDAtMS41LS42Ny0xLjUtMS41UzE2LjY3IDkgMTcuNSA5czEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJjb2xvcml6ZSI+PHBhdGggZD0iTTIwLjcxIDUuNjNsLTIuMzQtMi4zNGMtLjM5LS4zOS0xLjAyLS4zOS0xLjQxIDBsLTMuMTIgMy4xMi0xLjkzLTEuOTEtMS40MSAxLjQxIDEuNDIgMS40MkwzIDE2LjI1VjIxaDQuNzVsOC45Mi04LjkyIDEuNDIgMS40MiAxLjQxLTEuNDEtMS45Mi0xLjkyIDMuMTItMy4xMmMuNC0uNC40LTEuMDMuMDEtMS40MnpNNi45MiAxOUw1IDE3LjA4bDguMDYtOC4wNiAxLjkyIDEuOTJMNi45MiAxOXoiPjwvcGF0aD48L2c+CjxnIGlkPSJjb21wYXJlIj48cGF0aCBkPSJNMTAgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDV2MmgyVjFoLTJ2MnptMCAxNUg1bDUtNnY2em05LTE1aC01djJoNXYxM2wtNS02djloNWMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNvbnRyb2wtcG9pbnQiPjxwYXRoIGQ9Ik0xMyA3aC0ydjRIN3YyaDR2NGgydi00aDR2LTJoLTRWN3ptLTEtNUM2LjQ5IDIgMiA2LjQ5IDIgMTJzNC40OSAxMCAxMCAxMCAxMC00LjQ5IDEwLTEwUzE3LjUxIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY29udHJvbC1wb2ludC1kdXBsaWNhdGUiPjxwYXRoIGQ9Ik0xNiA4aC0ydjNoLTN2MmgzdjNoMnYtM2gzdi0yaC0zek0yIDEyYzAtMi43OSAxLjY0LTUuMiA0LjAxLTYuMzJWMy41MkMyLjUyIDQuNzYgMCA4LjA5IDAgMTJzMi41MiA3LjI0IDYuMDEgOC40OHYtMi4xNkMzLjY0IDE3LjIgMiAxNC43OSAyIDEyem0xMy05Yy00Ljk2IDAtOSA0LjA0LTkgOXM0LjA0IDkgOSA5IDktNC4wNCA5LTktNC4wNC05LTktOXptMCAxNmMtMy44NiAwLTctMy4xNC03LTdzMy4xNC03IDctNyA3IDMuMTQgNyA3LTMuMTQgNy03IDd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY3JvcCI+PHBhdGggZD0iTTE3IDE1aDJWN2MwLTEuMS0uOS0yLTItMkg5djJoOHY4ek03IDE3VjFINXY0SDF2Mmg0djEwYzAgMS4xLjkgMiAyIDJoMTB2NGgydi00aDR2LTJIN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJjcm9wLTE2LTkiPjxwYXRoIGQ9Ik0xOSA2SDVjLTEuMSAwLTIgLjktMiAydjhjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yem0wIDEwSDVWOGgxNHY4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyb3AtMy0yIj48cGF0aCBkPSJNMTkgNEg1Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgMTRINVY2aDE0djEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyb3AtNS00Ij48cGF0aCBkPSJNMTkgNUg1Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6bTAgMTJINVY3aDE0djEweiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyb3AtNy01Ij48cGF0aCBkPSJNMTkgN0g1Yy0xLjEgMC0yIC45LTIgMnY2YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWOWMwLTEuMS0uOS0yLTItMnptMCA4SDVWOWgxNHY2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyb3AtZGluIj48cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTZINVY1aDE0djE0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyb3AtZnJlZSI+PHBhdGggZD0iTTMgNXY0aDJWNWg0VjNINWMtMS4xIDAtMiAuOS0yIDJ6bTIgMTBIM3Y0YzAgMS4xLjkgMiAyIDJoNHYtMkg1di00em0xNCA0aC00djJoNGMxLjEgMCAyLS45IDItMnYtNGgtMnY0em0wLTE2aC00djJoNHY0aDJWNWMwLTEuMS0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjcm9wLWxhbmRzY2FwZSI+PHBhdGggZD0iTTE5IDVINWMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yem0wIDEySDVWN2gxNHYxMHoiPjwvcGF0aD48L2c+CjxnIGlkPSJjcm9wLW9yaWdpbmFsIj48cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTZINVY1aDE0djE0em0tNS4wNC02LjcxbC0yLjc1IDMuNTQtMS45Ni0yLjM2TDYuNSAxN2gxMWwtMy41NC00LjcxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyb3AtcG9ydHJhaXQiPjxwYXRoIGQ9Ik0xNyAzSDdjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTBjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkg3VjVoMTB2MTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY3JvcC1yb3RhdGUiPjxwYXRoIGQ9Ik03LjQ3IDIxLjQ5QzQuMiAxOS45MyAxLjg2IDE2Ljc2IDEuNSAxM0gwYy41MSA2LjE2IDUuNjYgMTEgMTEuOTUgMTEgLjIzIDAgLjQ0LS4wMi42Ni0uMDNMOC44IDIwLjE1bC0xLjMzIDEuMzR6TTEyLjA1IDBjLS4yMyAwLS40NC4wMi0uNjYuMDRsMy44MSAzLjgxIDEuMzMtMS4zM0MxOS44IDQuMDcgMjIuMTQgNy4yNCAyMi41IDExSDI0Yy0uNTEtNi4xNi01LjY2LTExLTExLjk1LTExek0xNiAxNGgyVjhjMC0xLjExLS45LTItMi0yaC02djJoNnY2em0tOCAyVjRINnYySDR2MmgydjhjMCAxLjEuODkgMiAyIDJoOHYyaDJ2LTJoMnYtMkg4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyb3Atc3F1YXJlIj48cGF0aCBkPSJNMTggNEg2Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgMTRINlY2aDEydjEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImRlaGF6ZSI+PHBhdGggZD0iTTIgMTUuNXYyaDIwdi0ySDJ6bTAtNXYyaDIwdi0ySDJ6bTAtNXYyaDIwdi0ySDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZGV0YWlscyI+PHBhdGggZD0iTTMgNGw5IDE2IDktMTZIM3ptMy4zOCAyaDExLjI1TDEyIDE2IDYuMzggNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJlZGl0Ij48cGF0aCBkPSJNMyAxNy4yNVYyMWgzLjc1TDE3LjgxIDkuOTRsLTMuNzUtMy43NUwzIDE3LjI1ek0yMC43MSA3LjA0Yy4zOS0uMzkuMzktMS4wMiAwLTEuNDFsLTIuMzQtMi4zNGMtLjM5LS4zOS0xLjAyLS4zOS0xLjQxIDBsLTEuODMgMS44MyAzLjc1IDMuNzUgMS44My0xLjgzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImV4cG9zdXJlIj48cGF0aCBkPSJNMTUgMTd2Mmgydi0yaDJ2LTJoLTJ2LTJoLTJ2MmgtMnYyaDJ6bTUtMTVINGMtMS4xIDAtMiAuOS0yIDJ2MTZjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek01IDVoNnYySDVWNXptMTUgMTVINEwyMCA0djE2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImV4cG9zdXJlLW5lZy0xIj48cGF0aCBkPSJNNCAxMXYyaDh2LTJINHptMTUgN2gtMlY3LjM4TDE0IDguNFY2LjdMMTguNyA1aC4zdjEzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImV4cG9zdXJlLW5lZy0yIj48cGF0aCBkPSJNMTUuMDUgMTYuMjlsMi44Ni0zLjA3Yy4zOC0uMzkuNzItLjc5IDEuMDQtMS4xOC4zMi0uMzkuNTktLjc4LjgyLTEuMTcuMjMtLjM5LjQxLS43OC41NC0xLjE3cy4xOS0uNzkuMTktMS4xOGMwLS41My0uMDktMS4wMi0uMjctMS40Ni0uMTgtLjQ0LS40NC0uODEtLjc4LTEuMTEtLjM0LS4zMS0uNzctLjU0LTEuMjYtLjcxLS41MS0uMTYtMS4wOC0uMjQtMS43Mi0uMjQtLjY5IDAtMS4zMS4xMS0xLjg1LjMyLS41NC4yMS0xIC41MS0xLjM2Ljg4LS4zNy4zNy0uNjUuOC0uODQgMS4zLS4xOC40Ny0uMjcuOTctLjI4IDEuNWgyLjE0Yy4wMS0uMzEuMDUtLjYuMTMtLjg3LjA5LS4yOS4yMy0uNTQuNC0uNzUuMTgtLjIxLjQxLS4zNy42OC0uNDkuMjctLjEyLjYtLjE4Ljk2LS4xOC4zMSAwIC41OC4wNS44MS4xNS4yMy4xLjQzLjI1LjU5LjQzLjE2LjE4LjI4LjQuMzcuNjUuMDguMjUuMTMuNTIuMTMuODEgMCAuMjItLjAzLjQzLS4wOC42NS0uMDYuMjItLjE1LjQ1LS4yOS43LS4xNC4yNS0uMzIuNTMtLjU2LjgzLS4yMy4zLS41Mi42NS0uODggMS4wM2wtNC4xNyA0LjU1VjE4SDIxdi0xLjcxaC01Ljk1ek0yIDExdjJoOHYtMkgyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImV4cG9zdXJlLXBsdXMtMSI+PHBhdGggZD0iTTEwIDdIOHY0SDR2Mmg0djRoMnYtNGg0di0yaC00Vjd6bTEwIDExaC0yVjcuMzhMMTUgOC40VjYuN0wxOS43IDVoLjN2MTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXhwb3N1cmUtcGx1cy0yIj48cGF0aCBkPSJNMTYuMDUgMTYuMjlsMi44Ni0zLjA3Yy4zOC0uMzkuNzItLjc5IDEuMDQtMS4xOC4zMi0uMzkuNTktLjc4LjgyLTEuMTcuMjMtLjM5LjQxLS43OC41NC0xLjE3LjEzLS4zOS4xOS0uNzkuMTktMS4xOCAwLS41My0uMDktMS4wMi0uMjctMS40Ni0uMTgtLjQ0LS40NC0uODEtLjc4LTEuMTEtLjM0LS4zMS0uNzctLjU0LTEuMjYtLjcxLS41MS0uMTYtMS4wOC0uMjQtMS43Mi0uMjQtLjY5IDAtMS4zMS4xMS0xLjg1LjMyLS41NC4yMS0xIC41MS0xLjM2Ljg4LS4zNy4zNy0uNjUuOC0uODQgMS4zLS4xOC40Ny0uMjcuOTctLjI4IDEuNWgyLjE0Yy4wMS0uMzEuMDUtLjYuMTMtLjg3LjA5LS4yOS4yMy0uNTQuNC0uNzUuMTgtLjIxLjQxLS4zNy42OC0uNDkuMjctLjEyLjYtLjE4Ljk2LS4xOC4zMSAwIC41OC4wNS44MS4xNS4yMy4xLjQzLjI1LjU5LjQzLjE2LjE4LjI4LjQuMzcuNjUuMDguMjUuMTMuNTIuMTMuODEgMCAuMjItLjAzLjQzLS4wOC42NS0uMDYuMjItLjE1LjQ1LS4yOS43LS4xNC4yNS0uMzIuNTMtLjU2LjgzLS4yMy4zLS41Mi42NS0uODggMS4wM2wtNC4xNyA0LjU1VjE4SDIydi0xLjcxaC01Ljk1ek04IDdINnY0SDJ2Mmg0djRoMnYtNGg0di0ySDhWN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJleHBvc3VyZS16ZXJvIj48cGF0aCBkPSJNMTYuMTQgMTIuNWMwIDEtLjEgMS44NS0uMyAyLjU1LS4yLjctLjQ4IDEuMjctLjgzIDEuNy0uMzYuNDQtLjc5Ljc1LTEuMy45NS0uNTEuMi0xLjA3LjMtMS43LjMtLjYyIDAtMS4xOC0uMS0xLjY5LS4zLS41MS0uMi0uOTUtLjUxLTEuMzEtLjk1LS4zNi0uNDQtLjY1LTEuMDEtLjg1LTEuNy0uMi0uNy0uMy0xLjU1LS4zLTIuNTV2LTIuMDRjMC0xIC4xLTEuODUuMy0yLjU1LjItLjcuNDgtMS4yNi44NC0xLjY5LjM2LS40My44LS43NCAxLjMxLS45M0MxMC44MSA1LjEgMTEuMzggNSAxMiA1Yy42MyAwIDEuMTkuMSAxLjcuMjkuNTEuMTkuOTUuNSAxLjMxLjkzLjM2LjQzLjY0Ljk5Ljg0IDEuNjkuMi43LjMgMS41NC4zIDIuNTV2Mi4wNHptLTIuMTEtMi4zNmMwLS42NC0uMDUtMS4xOC0uMTMtMS42Mi0uMDktLjQ0LS4yMi0uNzktLjQtMS4wNi0uMTctLjI3LS4zOS0uNDYtLjY0LS41OC0uMjUtLjEzLS41NC0uMTktLjg2LS4xOS0uMzIgMC0uNjEuMDYtLjg2LjE4cy0uNDcuMzEtLjY0LjU4Yy0uMTcuMjctLjMxLjYyLS40IDEuMDZzLS4xMy45OC0uMTMgMS42MnYyLjY3YzAgLjY0LjA1IDEuMTguMTQgMS42Mi4wOS40NS4yMy44MS40IDEuMDlzLjM5LjQ4LjY0LjYxLjU0LjE5Ljg3LjE5Yy4zMyAwIC42Mi0uMDYuODctLjE5cy40Ni0uMzMuNjMtLjYxYy4xNy0uMjguMy0uNjQuMzktMS4wOS4wOS0uNDUuMTMtLjk5LjEzLTEuNjJ2LTIuNjZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyIj48cGF0aCBkPSJNMTUuOTYgMTAuMjlsLTIuNzUgMy41NC0xLjk2LTIuMzZMOC41IDE1aDExbC0zLjU0LTQuNzF6TTMgNUgxdjE2YzAgMS4xLjkgMiAyIDJoMTZ2LTJIM1Y1em0xOC00SDdjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0yLTItMnptMCAxNkg3VjNoMTR2MTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLTEiPjxwYXRoIGQ9Ik0zIDVIMXYxNmMwIDEuMS45IDIgMiAyaDE2di0ySDNWNXptMTEgMTBoMlY1aC00djJoMnY4em03LTE0SDdjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0yLTItMnptMCAxNkg3VjNoMTR2MTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLTIiPjxwYXRoIGQ9Ik0zIDVIMXYxNmMwIDEuMS45IDIgMiAyaDE2di0ySDNWNXptMTgtNEg3Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgMTZIN1YzaDE0djE0em0tNC00aC00di0yaDJjMS4xIDAgMi0uODkgMi0yVjdjMC0xLjExLS45LTItMi0yaC00djJoNHYyaC0yYy0xLjEgMC0yIC44OS0yIDJ2NGg2di0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbHRlci0zIj48cGF0aCBkPSJNMjEgMUg3Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgMTZIN1YzaDE0djE0ek0zIDVIMXYxNmMwIDEuMS45IDIgMiAyaDE2di0ySDNWNXptMTQgOHYtMS41YzAtLjgzLS42Ny0xLjUtMS41LTEuNS44MyAwIDEuNS0uNjcgMS41LTEuNVY3YzAtMS4xMS0uOS0yLTItMmgtNHYyaDR2MmgtMnYyaDJ2MmgtNHYyaDRjMS4xIDAgMi0uODkgMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbHRlci00Ij48cGF0aCBkPSJNMyA1SDF2MTZjMCAxLjEuOSAyIDIgMmgxNnYtMkgzVjV6bTEyIDEwaDJWNWgtMnY0aC0yVjVoLTJ2Nmg0djR6bTYtMTRIN2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTItMi0yem0wIDE2SDdWM2gxNHYxNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXItNSI+PHBhdGggZD0iTTIxIDFIN2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTItMi0yem0wIDE2SDdWM2gxNHYxNHpNMyA1SDF2MTZjMCAxLjEuOSAyIDIgMmgxNnYtMkgzVjV6bTE0IDh2LTJjMC0xLjExLS45LTItMi0yaC0yVjdoNFY1aC02djZoNHYyaC00djJoNGMxLjEgMCAyLS44OSAyLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLTYiPjxwYXRoIGQ9Ik0zIDVIMXYxNmMwIDEuMS45IDIgMiAyaDE2di0ySDNWNXptMTgtNEg3Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgMTZIN1YzaDE0djE0em0tOC0yaDJjMS4xIDAgMi0uODkgMi0ydi0yYzAtMS4xMS0uOS0yLTItMmgtMlY3aDRWNWgtNGMtMS4xIDAtMiAuODktMiAydjZjMCAxLjExLjkgMiAyIDJ6bTAtNGgydjJoLTJ2LTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLTciPjxwYXRoIGQ9Ik0zIDVIMXYxNmMwIDEuMS45IDIgMiAyaDE2di0ySDNWNXptMTgtNEg3Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgMTZIN1YzaDE0djE0em0tOC0ybDQtOFY1aC02djJoNGwtNCA4aDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLTgiPjxwYXRoIGQ9Ik0zIDVIMXYxNmMwIDEuMS45IDIgMiAyaDE2di0ySDNWNXptMTgtNEg3Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgMTZIN1YzaDE0djE0em0tOC0yaDJjMS4xIDAgMi0uODkgMi0ydi0xLjVjMC0uODMtLjY3LTEuNS0xLjUtMS41LjgzIDAgMS41LS42NyAxLjUtMS41VjdjMC0xLjExLS45LTItMi0yaC0yYy0xLjEgMC0yIC44OS0yIDJ2MS41YzAgLjgzLjY3IDEuNSAxLjUgMS41LS44MyAwLTEuNS42Ny0xLjUgMS41VjEzYzAgMS4xMS45IDIgMiAyem0wLThoMnYyaC0yVjd6bTAgNGgydjJoLTJ2LTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLTkiPjxwYXRoIGQ9Ik0zIDVIMXYxNmMwIDEuMS45IDIgMiAyaDE2di0ySDNWNXptMTgtNEg3Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgMTZIN1YzaDE0djE0ek0xNSA1aC0yYy0xLjEgMC0yIC44OS0yIDJ2MmMwIDEuMTEuOSAyIDIgMmgydjJoLTR2Mmg0YzEuMSAwIDItLjg5IDItMlY3YzAtMS4xMS0uOS0yLTItMnptMCA0aC0yVjdoMnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbHRlci05LXBsdXMiPjxwYXRoIGQ9Ik0zIDVIMXYxNmMwIDEuMS45IDIgMiAyaDE2di0ySDNWNXptMTEgN1Y4YzAtMS4xMS0uOS0yLTItMmgtMWMtMS4xIDAtMiAuODktMiAydjFjMCAxLjExLjkgMiAyIDJoMXYxSDl2MmgzYzEuMSAwIDItLjg5IDItMnptLTMtM1Y4aDF2MWgtMXptMTAtOEg3Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgOGgtMlY3aC0ydjJoLTJ2MmgydjJoMnYtMmgydjZIN1YzaDE0djZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLWItYW5kLXciPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNmwtNy04djhINWw3LThWNWg3djE0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbHRlci1jZW50ZXItZm9jdXMiPjxwYXRoIGQ9Ik01IDE1SDN2NGMwIDEuMS45IDIgMiAyaDR2LTJINXYtNHpNNSA1aDRWM0g1Yy0xLjEgMC0yIC45LTIgMnY0aDJWNXptMTQtMmgtNHYyaDR2NGgyVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTZoLTR2Mmg0YzEuMSAwIDItLjkgMi0ydi00aC0ydjR6TTEyIDljLTEuNjYgMC0zIDEuMzQtMyAzczEuMzQgMyAzIDMgMy0xLjM0IDMtMy0xLjM0LTMtMy0zeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbHRlci1kcmFtYSI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYxIDUuNjQgNS4zNiA4LjA0IDIuMzUgOC4zNiAwIDEwLjkgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTkgMThINmMtMi4yMSAwLTQtMS43OS00LTRzMS43OS00IDQtNCA0IDEuNzkgNCA0aDJjMC0yLjc2LTEuODYtNS4wOC00LjQtNS43OEM4LjYxIDYuODggMTAuMiA2IDEyIDZjMy4wMyAwIDUuNSAyLjQ3IDUuNSA1LjV2LjVIMTljMS42NSAwIDMgMS4zNSAzIDNzLTEuMzUgMy0zIDN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLWZyYW1lcyI+PHBhdGggZD0iTTIwIDRoLTRsLTQtNC00IDRINGMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDE2SDRWNmg0LjUybDMuNTItMy41TDE1LjUyIDZIMjB2MTR6TTE4IDhINnYxMGgxMiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbHRlci1oZHIiPjxwYXRoIGQ9Ik0xNCA2bC0zLjc1IDUgMi44NSAzLjgtMS42IDEuMkM5LjgxIDEzLjc1IDcgMTAgNyAxMGwtNiA4aDIyTDE0IDZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLW5vbmUiPjxwYXRoIGQ9Ik0zIDVIMXYxNmMwIDEuMS45IDIgMiAyaDE2di0ySDNWNXptMTgtNEg3Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgMTZIN1YzaDE0djE0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbHRlci10aWx0LXNoaWZ0Ij48cGF0aCBkPSJNMTEgNC4wN1YyLjA1Yy0yLjAxLjItMy44NCAxLTUuMzIgMi4yMUw3LjEgNS42OWMxLjExLS44NiAyLjQ0LTEuNDQgMy45LTEuNjJ6bTcuMzIuMTlDMTYuODQgMy4wNSAxNS4wMSAyLjI1IDEzIDIuMDV2Mi4wMmMxLjQ2LjE4IDIuNzkuNzYgMy45IDEuNjJsMS40Mi0xLjQzek0xOS45MyAxMWgyLjAyYy0uMi0yLjAxLTEtMy44NC0yLjIxLTUuMzJMMTguMzEgNy4xYy44NiAxLjExIDEuNDQgMi40NCAxLjYyIDMuOXpNNS42OSA3LjFMNC4yNiA1LjY4QzMuMDUgNy4xNiAyLjI1IDguOTkgMi4wNSAxMWgyLjAyYy4xOC0xLjQ2Ljc2LTIuNzkgMS42Mi0zLjl6TTQuMDcgMTNIMi4wNWMuMiAyLjAxIDEgMy44NCAyLjIxIDUuMzJsMS40My0xLjQzYy0uODYtMS4xLTEuNDQtMi40My0xLjYyLTMuODl6TTE1IDEyYzAtMS42Ni0xLjM0LTMtMy0zcy0zIDEuMzQtMyAzIDEuMzQgMyAzIDMgMy0xLjM0IDMtM3ptMy4zMSA0LjlsMS40MyAxLjQzYzEuMjEtMS40OCAyLjAxLTMuMzIgMi4yMS01LjMyaC0yLjAyYy0uMTggMS40NS0uNzYgMi43OC0xLjYyIDMuODl6TTEzIDE5LjkzdjIuMDJjMi4wMS0uMiAzLjg0LTEgNS4zMi0yLjIxbC0xLjQzLTEuNDNjLTEuMS44Ni0yLjQzIDEuNDQtMy44OSAxLjYyem0tNy4zMi0uMTlDNy4xNiAyMC45NSA5IDIxLjc1IDExIDIxLjk1di0yLjAyYy0xLjQ2LS4xOC0yLjc5LS43Ni0zLjktMS42MmwtMS40MiAxLjQzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbHRlci12aW50YWdlIj48cGF0aCBkPSJNMTguNyAxMi40Yy0uMjgtLjE2LS41Ny0uMjktLjg2LS40LjI5LS4xMS41OC0uMjQuODYtLjQgMS45Mi0xLjExIDIuOTktMy4xMiAzLTUuMTktMS43OS0xLjAzLTQuMDctMS4xMS02IDAtLjI4LjE2LS41NC4zNS0uNzguNTQuMDUtLjMxLjA4LS42My4wOC0uOTUgMC0yLjIyLTEuMjEtNC4xNS0zLTUuMTlDMTAuMjEgMS44NSA5IDMuNzggOSA2YzAgLjMyLjAzLjY0LjA4Ljk1LS4yNC0uMi0uNS0uMzktLjc4LS41NS0xLjkyLTEuMTEtNC4yLTEuMDMtNiAwIDAgMi4wNyAxLjA3IDQuMDggMyA1LjE5LjI4LjE2LjU3LjI5Ljg2LjQtLjI5LjExLS41OC4yNC0uODYuNC0xLjkyIDEuMTEtMi45OSAzLjEyLTMgNS4xOSAxLjc5IDEuMDMgNC4wNyAxLjExIDYgMCAuMjgtLjE2LjU0LS4zNS43OC0uNTQtLjA1LjMyLS4wOC42NC0uMDguOTYgMCAyLjIyIDEuMjEgNC4xNSAzIDUuMTkgMS43OS0xLjA0IDMtMi45NyAzLTUuMTkgMC0uMzItLjAzLS42NC0uMDgtLjk1LjI0LjIuNS4zOC43OC41NCAxLjkyIDEuMTEgNC4yIDEuMDMgNiAwLS4wMS0yLjA3LTEuMDgtNC4wOC0zLTUuMTl6TTEyIDE2Yy0yLjIxIDAtNC0xLjc5LTQtNHMxLjc5LTQgNC00IDQgMS43OSA0IDQtMS43OSA0LTQgNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJmbGFyZSI+PHBhdGggZD0iTTcgMTFIMXYyaDZ2LTJ6bTIuMTctMy4yNEw3LjA1IDUuNjQgNS42NCA3LjA1bDIuMTIgMi4xMiAxLjQxLTEuNDF6TTEzIDFoLTJ2NmgyVjF6bTUuMzYgNi4wNWwtMS40MS0xLjQxLTIuMTIgMi4xMiAxLjQxIDEuNDEgMi4xMi0yLjEyek0xNyAxMXYyaDZ2LTJoLTZ6bS01LTJjLTEuNjYgMC0zIDEuMzQtMyAzczEuMzQgMyAzIDMgMy0xLjM0IDMtMy0xLjM0LTMtMy0zem0yLjgzIDcuMjRsMi4xMiAyLjEyIDEuNDEtMS40MS0yLjEyLTIuMTItMS40MSAxLjQxem0tOS4xOS43MWwxLjQxIDEuNDEgMi4xMi0yLjEyLTEuNDEtMS40MS0yLjEyIDIuMTJ6TTExIDIzaDJ2LTZoLTJ2NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmbGFzaC1hdXRvIj48cGF0aCBkPSJNMyAydjEyaDN2OWw3LTEySDlsNC05SDN6bTE2IDBoLTJsLTMuMiA5aDEuOWwuNy0yaDMuMmwuNyAyaDEuOUwxOSAyem0tMi4xNSA1LjY1TDE4IDRsMS4xNSAzLjY1aC0yLjN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmxhc2gtb2ZmIj48cGF0aCBkPSJNMy4yNyAzTDIgNC4yN2w1IDVWMTNoM3Y5bDMuNTgtNi4xNEwxNy43MyAyMCAxOSAxOC43MyAzLjI3IDN6TTE3IDEwaC00bDQtOEg3djIuMThsOC40NiA4LjQ2TDE3IDEweiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZsYXNoLW9uIj48cGF0aCBkPSJNNyAydjExaDN2OWw3LTEyaC00bDQtOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJmbGlwIj48cGF0aCBkPSJNMTUgMjFoMnYtMmgtMnYyem00LTEyaDJWN2gtMnYyek0zIDV2MTRjMCAxLjEuOSAyIDIgMmg0di0ySDVWNWg0VjNINWMtMS4xIDAtMiAuOS0yIDJ6bTE2LTJ2MmgyYzAtMS4xLS45LTItMi0yem0tOCAyMGgyVjFoLTJ2MjJ6bTgtNmgydi0yaC0ydjJ6TTE1IDVoMlYzaC0ydjJ6bTQgOGgydi0yaC0ydjJ6bTAgOGMxLjEgMCAyLS45IDItMmgtMnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImdyYWRpZW50Ij48cGF0aCBkPSJNMTEgOWgydjJoLTJ6bS0yIDJoMnYySDl6bTQgMGgydjJoLTJ6bTItMmgydjJoLTJ6TTcgOWgydjJIN3ptMTItNkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6TTkgMThIN3YtMmgydjJ6bTQgMGgtMnYtMmgydjJ6bTQgMGgtMnYtMmgydjJ6bTItN2gtMnYyaDJ2MmgtMnYtMmgtMnYyaC0ydi0yaC0ydjJIOXYtMkg3djJINXYtMmgydi0ySDVWNWgxNHY2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImdyYWluIj48cGF0aCBkPSJNMTAgMTJjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yek02IDhjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0wIDhjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0xMi04YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptLTQgOGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTQtNGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bS00LTRjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0tNC00Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJncmlkLW9mZiI+PHBhdGggZD0iTTggNHYxLjQ1bDIgMlY0aDR2NGgtMy40NWwyIDJIMTR2MS40NWwyIDJWMTBoNHY0aC0zLjQ1bDIgMkgyMHYxLjQ1bDIgMlY0YzAtMS4xLS45LTItMi0ySDQuNTVsMiAySDh6bTggMGg0djRoLTRWNHpNMS4yNyAxLjI3TDAgMi41NWwyIDJWMjBjMCAxLjEuOSAyIDIgMmgxNS40NmwyIDIgMS4yNy0xLjI3TDEuMjcgMS4yN3pNMTAgMTIuNTVMMTEuNDUgMTRIMTB2LTEuNDV6bS02LTZMNS40NSA4SDRWNi41NXpNOCAyMEg0di00aDR2NHptMC02SDR2LTRoMy40NWwuNTUuNTVWMTR6bTYgNmgtNHYtNGgzLjQ1bC41NS41NFYyMHptMiAwdi0xLjQ2TDE3LjQ2IDIwSDE2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImdyaWQtb24iPjxwYXRoIGQ9Ik0yMCAySDRjLTEuMSAwLTIgLjktMiAydjE2YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnpNOCAyMEg0di00aDR2NHptMC02SDR2LTRoNHY0em0wLTZINFY0aDR2NHptNiAxMmgtNHYtNGg0djR6bTAtNmgtNHYtNGg0djR6bTAtNmgtNFY0aDR2NHptNiAxMmgtNHYtNGg0djR6bTAtNmgtNHYtNGg0djR6bTAtNmgtNFY0aDR2NHoiPjwvcGF0aD48L2c+CjxnIGlkPSJoZHItb2ZmIj48cGF0aCBkPSJNMTcuNSAxNXYtMmgxLjFsLjkgMkgyMWwtLjktMi4xYy41LS4yLjktLjguOS0xLjR2LTFjMC0uOC0uNy0xLjUtMS41LTEuNUgxNnY0LjlsMS4xIDEuMWguNHptMC00LjVoMnYxaC0ydi0xem0tNC41IDB2LjRsMS41IDEuNXYtMS45YzAtLjgtLjctMS41LTEuNS0xLjVoLTEuOWwxLjUgMS41aC40em0tMy41LTFsLTctNy0xLjEgMUw2LjkgOWgtLjR2MmgtMlY5SDN2NmgxLjV2LTIuNWgyVjE1SDh2LTQuOWwxLjUgMS41VjE1aDMuNGw3LjYgNy42IDEuMS0xLjEtMTIuMS0xMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJoZHItb24iPjxwYXRoIGQ9Ik0yMSAxMS41di0xYzAtLjgtLjctMS41LTEuNS0xLjVIMTZ2NmgxLjV2LTJoMS4xbC45IDJIMjFsLS45LTIuMWMuNS0uMy45LS44LjktMS40em0tMS41IDBoLTJ2LTFoMnYxem0tMTMtLjVoLTJWOUgzdjZoMS41di0yLjVoMlYxNUg4VjlINi41djJ6TTEzIDlIOS41djZIMTNjLjggMCAxLjUtLjcgMS41LTEuNXYtM2MwLS44LS43LTEuNS0xLjUtMS41em0wIDQuNWgtMnYtM2gydjN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaGRyLXN0cm9uZyI+PHBhdGggZD0iTTE3IDZjLTMuMzEgMC02IDIuNjktNiA2czIuNjkgNiA2IDYgNi0yLjY5IDYtNi0yLjY5LTYtNi02ek01IDhjLTIuMjEgMC00IDEuNzktNCA0czEuNzkgNCA0IDQgNC0xLjc5IDQtNC0xLjc5LTQtNC00em0wIDZjLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imhkci13ZWFrIj48cGF0aCBkPSJNNSA4Yy0yLjIxIDAtNCAxLjc5LTQgNHMxLjc5IDQgNCA0IDQtMS43OSA0LTQtMS43OS00LTQtNHptMTItMmMtMy4zMSAwLTYgMi42OS02IDZzMi42OSA2IDYgNiA2LTIuNjkgNi02LTIuNjktNi02LTZ6bTAgMTBjLTIuMjEgMC00LTEuNzktNC00czEuNzktNCA0LTQgNCAxLjc5IDQgNC0xLjc5IDQtNCA0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImhlYWxpbmciPjxwYXRoIGQ9Ik0xNy43MyAxMi4wMmwzLjk4LTMuOThjLjM5LS4zOS4zOS0xLjAyIDAtMS40MWwtNC4zNC00LjM0Yy0uMzktLjM5LTEuMDItLjM5LTEuNDEgMGwtMy45OCAzLjk4TDggMi4yOUM3LjggMi4xIDcuNTUgMiA3LjI5IDJjLS4yNSAwLS41MS4xLS43LjI5TDIuMjUgNi42M2MtLjM5LjM5LS4zOSAxLjAyIDAgMS40MWwzLjk4IDMuOThMMi4yNSAxNmMtLjM5LjM5LS4zOSAxLjAyIDAgMS40MWw0LjM0IDQuMzRjLjM5LjM5IDEuMDIuMzkgMS40MSAwbDMuOTgtMy45OCAzLjk4IDMuOThjLjIuMi40NS4yOS43MS4yOS4yNiAwIC41MS0uMS43MS0uMjlsNC4zNC00LjM0Yy4zOS0uMzkuMzktMS4wMiAwLTEuNDFsLTMuOTktMy45OHpNMTIgOWMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0tNC43MSAxLjk2TDMuNjYgNy4zNGwzLjYzLTMuNjMgMy42MiAzLjYyLTMuNjIgMy42M3pNMTAgMTNjLS41NSAwLTEtLjQ1LTEtMXMuNDUtMSAxLTEgMSAuNDUgMSAxLS40NSAxLTEgMXptMiAyYy0uNTUgMC0xLS40NS0xLTFzLjQ1LTEgMS0xIDEgLjQ1IDEgMS0uNDUgMS0xIDF6bTItNGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0yLjY2IDkuMzRsLTMuNjMtMy42MiAzLjYzLTMuNjMgMy42MiAzLjYyLTMuNjIgMy42M3oiPjwvcGF0aD48L2c+CjxnIGlkPSJpbWFnZSI+PHBhdGggZD0iTTIxIDE5VjVjMC0xLjEtLjktMi0yLTJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnpNOC41IDEzLjVsMi41IDMuMDFMMTQuNSAxMmw0LjUgNkg1bDMuNS00LjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaW1hZ2UtYXNwZWN0LXJhdGlvIj48cGF0aCBkPSJNMTYgMTBoLTJ2Mmgydi0yem0wIDRoLTJ2Mmgydi0yem0tOC00SDZ2Mmgydi0yem00IDBoLTJ2Mmgydi0yem04LTZINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDE0SDRWNmgxNnYxMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJpc28iPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNNS41IDcuNWgydi0ySDl2MmgyVjlIOXYySDcuNVY5aC0yVjcuNXpNMTkgMTlINUwxOSA1djE0em0tMi0ydi0xLjVoLTVWMTdoNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJsYW5kc2NhcGUiPjxwYXRoIGQ9Ik0xNCA2bC0zLjc1IDUgMi44NSAzLjgtMS42IDEuMkM5LjgxIDEzLjc1IDcgMTAgNyAxMGwtNiA4aDIyTDE0IDZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibGVhay1hZGQiPjxwYXRoIGQ9Ik02IDNIM3YzYzEuNjYgMCAzLTEuMzQgMy0zem04IDBoLTJjMCA0Ljk3LTQuMDMgOS05IDl2MmM2LjA4IDAgMTEtNC45MyAxMS0xMXptLTQgMEg4YzAgMi43Ni0yLjI0IDUtNSA1djJjMy44NyAwIDctMy4xMyA3LTd6bTAgMThoMmMwLTQuOTcgNC4wMy05IDktOXYtMmMtNi4wNyAwLTExIDQuOTMtMTEgMTF6bTggMGgzdi0zYy0xLjY2IDAtMyAxLjM0LTMgM3ptLTQgMGgyYzAtMi43NiAyLjI0LTUgNS01di0yYy0zLjg3IDAtNyAzLjEzLTcgN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJsZWFrLXJlbW92ZSI+PHBhdGggZD0iTTEwIDNIOGMwIC4zNy0uMDQuNzItLjEyIDEuMDZsMS41OSAxLjU5QzkuODEgNC44NCAxMCAzLjk0IDEwIDN6TTMgNC4yN2wyLjg0IDIuODRDNS4wMyA3LjY3IDQuMDYgOCAzIDh2MmMxLjYxIDAgMy4wOS0uNTUgNC4yNy0xLjQ2TDguNyA5Ljk3QzcuMTQgMTEuMjQgNS4xNiAxMiAzIDEydjJjMi43MSAwIDUuMTktLjk5IDcuMTEtMi42MmwyLjUgMi41QzEwLjk5IDE1LjgxIDEwIDE4LjI5IDEwIDIxaDJjMC0yLjE2Ljc2LTQuMTQgMi4wMy01LjY5bDEuNDMgMS40M0MxNC41NSAxNy45MSAxNCAxOS4zOSAxNCAyMWgyYzAtMS4wNi4zMy0yLjAzLjg5LTIuODRMMTkuNzMgMjEgMjEgMTkuNzMgNC4yNyAzIDMgNC4yN3pNMTQgM2gtMmMwIDEuNS0uMzcgMi45MS0xLjAyIDQuMTZsMS40NiAxLjQ2QzEzLjQyIDYuOTggMTQgNS4wNiAxNCAzem01Ljk0IDEzLjEyYy4zNC0uMDguNjktLjEyIDEuMDYtLjEydi0yYy0uOTQgMC0xLjg0LjE5LTIuNjYuNTJsMS42IDEuNnptLTQuNTYtNC41NmwxLjQ2IDEuNDZDMTguMDkgMTIuMzcgMTkuNSAxMiAyMSAxMnYtMmMtMi4wNiAwLTMuOTguNTgtNS42MiAxLjU2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImxlbnMiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImxpbmtlZC1jYW1lcmEiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTQiIHI9IjMuMiI+PC9jaXJjbGU+PHBhdGggZD0iTTE2IDMuMzNjMi41OCAwIDQuNjcgMi4wOSA0LjY3IDQuNjdIMjJjMC0zLjMxLTIuNjktNi02LTZ2MS4zM00xNiA2YzEuMTEgMCAyIC44OSAyIDJoMS4zM2MwLTEuODQtMS40OS0zLjMzLTMuMzMtMy4zM1Y2Ij48L3BhdGg+PHBhdGggZD0iTTE3IDljMC0xLjExLS44OS0yLTItMlY0SDlMNy4xNyA2SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWOWgtNXptLTUgMTBjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imxvb2tzIj48cGF0aCBkPSJNMTIgMTBjLTMuODYgMC03IDMuMTQtNyA3aDJjMC0yLjc2IDIuMjQtNSA1LTVzNSAyLjI0IDUgNWgyYzAtMy44Ni0zLjE0LTctNy03em0wLTRDNS45MyA2IDEgMTAuOTMgMSAxN2gyYzAtNC45NiA0LjA0LTkgOS05czkgNC4wNCA5IDloMmMwLTYuMDctNC45My0xMS0xMS0xMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJsb29rcy0zIj48cGF0aCBkPSJNMTkuMDEgM2gtMTRjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTQgNy41YzAgLjgzLS42NyAxLjUtMS41IDEuNS44MyAwIDEuNS42NyAxLjUgMS41VjE1YzAgMS4xMS0uOSAyLTIgMmgtNHYtMmg0di0yaC0ydi0yaDJWOWgtNFY3aDRjMS4xIDAgMiAuODkgMiAydjEuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJsb29rcy00Ij48cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS00IDE0aC0ydi00SDlWN2gydjRoMlY3aDJ2MTB6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibG9va3MtNSI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNCA2aC00djJoMmMxLjEgMCAyIC44OSAyIDJ2MmMwIDEuMTEtLjkgMi0yIDJIOXYtMmg0di0ySDlWN2g2djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibG9va3MtNiI+PHBhdGggZD0iTTExIDE1aDJ2LTJoLTJ2MnptOC0xMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS00IDZoLTR2MmgyYzEuMSAwIDIgLjg5IDIgMnYyYzAgMS4xMS0uOSAyLTIgMmgtMmMtMS4xIDAtMi0uODktMi0yVjljMC0xLjExLjktMiAyLTJoNHYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imxvb2tzLW9uZSI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNSAxNGgtMlY5aC0yVjdoNHYxMHoiPjwvcGF0aD48L2c+CjxnIGlkPSJsb29rcy10d28iPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTQgOGMwIDEuMTEtLjkgMi0yIDJoLTJ2Mmg0djJIOXYtNGMwLTEuMTEuOS0yIDItMmgyVjlIOVY3aDRjMS4xIDAgMiAuODkgMiAydjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibG91cGUiPjxwYXRoIGQ9Ik0xMyA3aC0ydjRIN3YyaDR2NGgydi00aDR2LTJoLTRWN3ptLTEtNUM2LjQ5IDIgMiA2LjQ5IDIgMTJzNC40OSAxMCAxMCAxMGg4YzEuMSAwIDItLjkgMi0ydi04YzAtNS41MS00LjQ5LTEwLTEwLTEwem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJtb25vY2hyb21lLXBob3RvcyI+PHBhdGggZD0iTTIwIDVoLTMuMkwxNSAzSDlMNy4yIDVINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yem0wIDE0aC04di0xYy0yLjggMC01LTIuMi01LTVzMi4yLTUgNS01VjdoOHYxMnptLTMtNmMwLTIuOC0yLjItNS01LTV2MS44YzEuOCAwIDMuMiAxLjQgMy4yIDMuMnMtMS40IDMuMi0zLjIgMy4yVjE4YzIuOCAwIDUtMi4yIDUtNXptLTguMiAwYzAgMS44IDEuNCAzLjIgMy4yIDMuMlY5LjhjLTEuOCAwLTMuMiAxLjQtMy4yIDMuMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJtb3ZpZS1jcmVhdGlvbiI+PHBhdGggZD0iTTE4IDRsMiA0aC0zbC0yLTRoLTJsMiA0aC0zbC0yLTRIOGwyIDRIN0w1IDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNGgtNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJtb3ZpZS1maWx0ZXIiPjxwYXRoIGQ9Ik0xOCA0bDIgM2gtM2wtMi0zaC0ybDIgM2gtM2wtMi0zSDhsMiAzSDdMNSA0SDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjRoLTR6bS02Ljc1IDExLjI1TDEwIDE4bC0xLjI1LTIuNzVMNiAxNGwyLjc1LTEuMjVMMTAgMTBsMS4yNSAyLjc1TDE0IDE0bC0yLjc1IDEuMjV6bTUuNjktMy4zMUwxNiAxNGwtLjk0LTIuMDZMMTMgMTFsMi4wNi0uOTRMMTYgOGwuOTQgMi4wNkwxOSAxMWwtMi4wNi45NHoiPjwvcGF0aD48L2c+CjxnIGlkPSJtdXNpYy1ub3RlIj48cGF0aCBkPSJNMTIgM3YxMC41NWMtLjU5LS4zNC0xLjI3LS41NS0yLS41NS0yLjIxIDAtNCAxLjc5LTQgNHMxLjc5IDQgNCA0IDQtMS43OSA0LTRWN2g0VjNoLTZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibmF0dXJlIj48cGF0aCBkPSJNMTMgMTYuMTJjMy40Ny0uNDEgNi4xNy0zLjM2IDYuMTctNi45NSAwLTMuODctMy4xMy03LTctN3MtNyAzLjEzLTcgN2MwIDMuNDcgMi41MiA2LjM0IDUuODMgNi44OVYyMEg1djJoMTR2LTJoLTZ2LTMuODh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibmF0dXJlLXBlb3BsZSI+PHBhdGggZD0iTTIyLjE3IDkuMTdjMC0zLjg3LTMuMTMtNy03LTdzLTcgMy4xMy03IDdjMCAzLjQ3IDIuNTIgNi4zNCA1LjgzIDYuODlWMjBINnYtM2gxdi00YzAtLjU1LS40NS0xLTEtMUgzYy0uNTUgMC0xIC40NS0xIDF2NGgxdjVoMTZ2LTJoLTN2LTMuODhjMy40Ny0uNDEgNi4xNy0zLjM2IDYuMTctNi45NXpNNC41IDExYy44MyAwIDEuNS0uNjcgMS41LTEuNVM1LjMzIDggNC41IDggMyA4LjY3IDMgOS41IDMuNjcgMTEgNC41IDExeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im5hdmlnYXRlLWJlZm9yZSI+PHBhdGggZD0iTTE1LjQxIDcuNDFMMTQgNmwtNiA2IDYgNiAxLjQxLTEuNDFMMTAuODMgMTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibmF2aWdhdGUtbmV4dCI+PHBhdGggZD0iTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBhbGV0dGUiPjxwYXRoIGQ9Ik0xMiAzYy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAzIDkgOSA5Yy44MyAwIDEuNS0uNjcgMS41LTEuNSAwLS4zOS0uMTUtLjc0LS4zOS0xLjAxLS4yMy0uMjYtLjM4LS42MS0uMzgtLjk5IDAtLjgzLjY3LTEuNSAxLjUtMS41SDE2YzIuNzYgMCA1LTIuMjQgNS01IDAtNC40Mi00LjAzLTgtOS04em0tNS41IDljLS44MyAwLTEuNS0uNjctMS41LTEuNVM1LjY3IDkgNi41IDkgOCA5LjY3IDggMTAuNSA3LjMzIDEyIDYuNSAxMnptMy00QzguNjcgOCA4IDcuMzMgOCA2LjVTOC42NyA1IDkuNSA1czEuNS42NyAxLjUgMS41UzEwLjMzIDggOS41IDh6bTUgMGMtLjgzIDAtMS41LS42Ny0xLjUtMS41UzEzLjY3IDUgMTQuNSA1czEuNS42NyAxLjUgMS41UzE1LjMzIDggMTQuNSA4em0zIDRjLS44MyAwLTEuNS0uNjctMS41LTEuNVMxNi42NyA5IDE3LjUgOXMxLjUuNjcgMS41IDEuNS0uNjcgMS41LTEuNSAxLjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGFub3JhbWEiPjxwYXRoIGQ9Ik0yMyAxOFY2YzAtMS4xLS45LTItMi0ySDNjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJ6TTguNSAxMi41bDIuNSAzLjAxTDE0LjUgMTFsNC41IDZINWwzLjUtNC41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBhbm9yYW1hLWZpc2gtZXllIj48cGF0aCBkPSJNMTIgMkM2LjQ3IDIgMiA2LjQ3IDIgMTJzNC40NyAxMCAxMCAxMCAxMC00LjQ3IDEwLTEwUzE3LjUzIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGFub3JhbWEtaG9yaXpvbnRhbCI+PHBhdGggZD0iTTIwIDYuNTR2MTAuOTFjLTIuNi0uNzctNS4yOC0xLjE2LTgtMS4xNi0yLjcyIDAtNS40LjM5LTggMS4xNlY2LjU0YzIuNi43NyA1LjI4IDEuMTYgOCAxLjE2IDIuNzIuMDEgNS40LS4zOCA4LTEuMTZNMjEuNDMgNGMtLjEgMC0uMi4wMi0uMzEuMDZDMTguMTggNS4xNiAxNS4wOSA1LjcgMTIgNS43Yy0zLjA5IDAtNi4xOC0uNTUtOS4xMi0xLjY0LS4xMS0uMDQtLjIyLS4wNi0uMzEtLjA2LS4zNCAwLS41Ny4yMy0uNTcuNjN2MTQuNzVjMCAuMzkuMjMuNjIuNTcuNjIuMSAwIC4yLS4wMi4zMS0uMDYgMi45NC0xLjEgNi4wMy0xLjY0IDkuMTItMS42NCAzLjA5IDAgNi4xOC41NSA5LjEyIDEuNjQuMTEuMDQuMjEuMDYuMzEuMDYuMzMgMCAuNTctLjIzLjU3LS42M1Y0LjYzYzAtLjQtLjI0LS42My0uNTctLjYzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBhbm9yYW1hLXZlcnRpY2FsIj48cGF0aCBkPSJNMTkuOTQgMjEuMTJjLTEuMS0yLjk0LTEuNjQtNi4wMy0xLjY0LTkuMTIgMC0zLjA5LjU1LTYuMTggMS42NC05LjEyLjA0LS4xMS4wNi0uMjIuMDYtLjMxIDAtLjM0LS4yMy0uNTctLjYzLS41N0g0LjYzYy0uNCAwLS42My4yMy0uNjMuNTcgMCAuMS4wMi4yLjA2LjMxQzUuMTYgNS44MiA1LjcxIDguOTEgNS43MSAxMmMwIDMuMDktLjU1IDYuMTgtMS42NCA5LjEyLS4wNS4xMS0uMDcuMjItLjA3LjMxIDAgLjMzLjIzLjU3LjYzLjU3aDE0Ljc1Yy4zOSAwIC42My0uMjQuNjMtLjU3LS4wMS0uMS0uMDMtLjItLjA3LS4zMXpNNi41NCAyMGMuNzctMi42IDEuMTYtNS4yOCAxLjE2LTggMC0yLjcyLS4zOS01LjQtMS4xNi04aDEwLjkxYy0uNzcgMi42LTEuMTYgNS4yOC0xLjE2IDggMCAyLjcyLjM5IDUuNCAxLjE2IDhINi41NHoiPjwvcGF0aD48L2c+CjxnIGlkPSJwYW5vcmFtYS13aWRlLWFuZ2xlIj48cGF0aCBkPSJNMTIgNmMyLjQ1IDAgNC43MS4yIDcuMjkuNjQuNDcgMS43OC43MSAzLjU4LjcxIDUuMzYgMCAxLjc4LS4yNCAzLjU4LS43MSA1LjM2LTIuNTguNDQtNC44NC42NC03LjI5LjY0cy00LjcxLS4yLTcuMjktLjY0QzQuMjQgMTUuNTggNCAxMy43OCA0IDEyYzAtMS43OC4yNC0zLjU4LjcxLTUuMzZDNy4yOSA2LjIgOS41NSA2IDEyIDZtMC0yYy0yLjczIDAtNS4yMi4yNC03Ljk1LjcybC0uOTMuMTYtLjI1LjlDMi4yOSA3Ljg1IDIgOS45MyAyIDEycy4yOSA0LjE1Ljg3IDYuMjJsLjI1Ljg5LjkzLjE2YzIuNzMuNDkgNS4yMi43MyA3Ljk1LjczczUuMjItLjI0IDcuOTUtLjcybC45My0uMTYuMjUtLjg5Yy41OC0yLjA4Ljg3LTQuMTYuODctNi4yM3MtLjI5LTQuMTUtLjg3LTYuMjJsLS4yNS0uODktLjkzLS4xNkMxNy4yMiA0LjI0IDE0LjczIDQgMTIgNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJwaG90byI+PHBhdGggZD0iTTIxIDE5VjVjMC0xLjEtLjktMi0yLTJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnpNOC41IDEzLjVsMi41IDMuMDFMMTQuNSAxMmw0LjUgNkg1bDMuNS00LjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGhvdG8tYWxidW0iPjxwYXRoIGQ9Ik0xOCAySDZjLTEuMSAwLTIgLjktMiAydjE2YzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnpNNiA0aDV2OGwtMi41LTEuNUw2IDEyVjR6bTAgMTVsMy0zLjg2IDIuMTQgMi41OCAzLTMuODZMMTggMTlINnoiPjwvcGF0aD48L2c+CjxnIGlkPSJwaG90by1jYW1lcmEiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjMuMiI+PC9jaXJjbGU+PHBhdGggZD0iTTkgMkw3LjE3IDRINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yaC0zLjE3TDE1IDJIOXptMyAxNWMtMi43NiAwLTUtMi4yNC01LTVzMi4yNC01IDUtNSA1IDIuMjQgNSA1LTIuMjQgNS01IDV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGhvdG8tZmlsdGVyIj48cGF0aCBkPSJNMTkuMDIgMTB2OUg1VjVoOVYzSDUuMDJjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJ2LTloLTJ6TTE3IDEwbC45NC0yLjA2TDIwIDdsLTIuMDYtLjk0TDE3IDRsLS45NCAyLjA2TDE0IDdsMi4wNi45NHptLTMuNzUuNzVMMTIgOGwtMS4yNSAyLjc1TDggMTJsMi43NSAxLjI1TDEyIDE2bDEuMjUtMi43NUwxNiAxMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJwaG90by1saWJyYXJ5Ij48cGF0aCBkPSJNMjIgMTZWNGMwLTEuMS0uOS0yLTItMkg4Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yem0tMTEtNGwyLjAzIDIuNzFMMTYgMTFsNCA1SDhsMy00ek0yIDZ2MTRjMCAxLjEuOSAyIDIgMmgxNHYtMkg0VjZIMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJwaG90by1zaXplLXNlbGVjdC1hY3R1YWwiPjxwYXRoIGQ9Ik0yMSAzSDNDMiAzIDEgNCAxIDV2MTRjMCAxLjEuOSAyIDIgMmgxOGMxIDAgMi0xIDItMlY1YzAtMS0xLTItMi0yek01IDE3bDMuNS00LjUgMi41IDMuMDFMMTQuNSAxMWw0LjUgNkg1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBob3RvLXNpemUtc2VsZWN0LWxhcmdlIj48cGF0aCBkPSJNMjEgMTVoMnYyaC0ydi0yem0wLTRoMnYyaC0ydi0yem0yIDhoLTJ2MmMxIDAgMi0xIDItMnpNMTMgM2gydjJoLTJWM3ptOCA0aDJ2MmgtMlY3em0wLTR2MmgyYzAtMS0xLTItMi0yek0xIDdoMnYySDFWN3ptMTYtNGgydjJoLTJWM3ptMCAxNmgydjJoLTJ2LTJ6TTMgM0MyIDMgMSA0IDEgNWgyVjN6bTYgMGgydjJIOVYzek01IDNoMnYySDVWM3ptLTQgOHY4YzAgMS4xLjkgMiAyIDJoMTJWMTFIMXptMiA4bDIuNS0zLjIxIDEuNzkgMi4xNSAyLjUtMy4yMkwxMyAxOUgzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBob3RvLXNpemUtc2VsZWN0LXNtYWxsIj48cGF0aCBkPSJNMjMgMTVoLTJ2Mmgydi0yem0wLTRoLTJ2Mmgydi0yem0wIDhoLTJ2MmMxIDAgMi0xIDItMnpNMTUgM2gtMnYyaDJWM3ptOCA0aC0ydjJoMlY3em0tMi00djJoMmMwLTEtMS0yLTItMnpNMyAyMWg4di02SDF2NGMwIDEuMS45IDIgMiAyek0zIDdIMXYyaDJWN3ptMTIgMTJoLTJ2Mmgydi0yem00LTE2aC0ydjJoMlYzem0wIDE2aC0ydjJoMnYtMnpNMyAzQzIgMyAxIDQgMSA1aDJWM3ptMCA4SDF2Mmgydi0yem04LThIOXYyaDJWM3pNNyAzSDV2MmgyVjN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGljdHVyZS1hcy1wZGYiPjxwYXRoIGQ9Ik0yMCAySDhjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTguNSA3LjVjMCAuODMtLjY3IDEuNS0xLjUgMS41SDl2Mkg3LjVWN0gxMGMuODMgMCAxLjUuNjcgMS41IDEuNXYxem01IDJjMCAuODMtLjY3IDEuNS0xLjUgMS41aC0yLjVWN0gxNWMuODMgMCAxLjUuNjcgMS41IDEuNXYzem00LTNIMTl2MWgxLjVWMTFIMTl2MmgtMS41VjdoM3YxLjV6TTkgOS41aDF2LTFIOXYxek00IDZIMnYxNGMwIDEuMS45IDIgMiAyaDE0di0ySDRWNnptMTAgNS41aDF2LTNoLTF2M3oiPjwvcGF0aD48L2c+CjxnIGlkPSJwb3J0cmFpdCI+PHBhdGggZD0iTTEyIDEyLjI1YzEuMjQgMCAyLjI1LTEuMDEgMi4yNS0yLjI1UzEzLjI0IDcuNzUgMTIgNy43NSA5Ljc1IDguNzYgOS43NSAxMHMxLjAxIDIuMjUgMi4yNSAyLjI1em00LjUgNGMwLTEuNS0zLTIuMjUtNC41LTIuMjVzLTQuNS43NS00LjUgMi4yNVYxN2g5di0uNzV6TTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDVWNWgxNHYxNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZW1vdmUtcmVkLWV5ZSI+PHBhdGggZD0iTTEyIDQuNUM3IDQuNSAyLjczIDcuNjEgMSAxMmMxLjczIDQuMzkgNiA3LjUgMTEgNy41czkuMjctMy4xMSAxMS03LjVjLTEuNzMtNC4zOS02LTcuNS0xMS03LjV6TTEyIDE3Yy0yLjc2IDAtNS0yLjI0LTUtNXMyLjI0LTUgNS01IDUgMi4yNCA1IDUtMi4yNCA1LTUgNXptMC04Yy0xLjY2IDAtMyAxLjM0LTMgM3MxLjM0IDMgMyAzIDMtMS4zNCAzLTMtMS4zNC0zLTMtM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJyb3RhdGUtOTAtZGVncmVlcy1jY3ciPjxwYXRoIGQ9Ik03LjM0IDYuNDFMLjg2IDEyLjlsNi40OSA2LjQ4IDYuNDktNi40OC02LjUtNi40OXpNMy42OSAxMi45bDMuNjYtMy42NkwxMSAxMi45bC0zLjY2IDMuNjYtMy42NS0zLjY2em0xNS42Ny02LjI2QzE3LjYxIDQuODggMTUuMyA0IDEzIDRWLjc2TDguNzYgNSAxMyA5LjI0VjZjMS43OSAwIDMuNTguNjggNC45NSAyLjA1IDIuNzMgMi43MyAyLjczIDcuMTcgMCA5LjlDMTYuNTggMTkuMzIgMTQuNzkgMjAgMTMgMjBjLS45NyAwLTEuOTQtLjIxLTIuODQtLjYxbC0xLjQ5IDEuNDlDMTAuMDIgMjEuNjIgMTEuNTEgMjIgMTMgMjJjMi4zIDAgNC42MS0uODggNi4zNi0yLjY0IDMuNTItMy41MSAzLjUyLTkuMjEgMC0xMi43MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJyb3RhdGUtbGVmdCI+PHBhdGggZD0iTTcuMTEgOC41M0w1LjcgNy4xMUM0LjggOC4yNyA0LjI0IDkuNjEgNC4wNyAxMWgyLjAyYy4xNC0uODcuNDktMS43MiAxLjAyLTIuNDd6TTYuMDkgMTNINC4wN2MuMTcgMS4zOS43MiAyLjczIDEuNjIgMy44OWwxLjQxLTEuNDJjLS41Mi0uNzUtLjg3LTEuNTktMS4wMS0yLjQ3em0xLjAxIDUuMzJjMS4xNi45IDIuNTEgMS40NCAzLjkgMS42MVYxNy45Yy0uODctLjE1LTEuNzEtLjQ5LTIuNDYtMS4wM0w3LjEgMTguMzJ6TTEzIDQuMDdWMUw4LjQ1IDUuNTUgMTMgMTBWNi4wOWMyLjg0LjQ4IDUgMi45NCA1IDUuOTFzLTIuMTYgNS40My01IDUuOTF2Mi4wMmMzLjk1LS40OSA3LTMuODUgNy03Ljkzcy0zLjA1LTcuNDQtNy03LjkzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJvdGF0ZS1yaWdodCI+PHBhdGggZD0iTTE1LjU1IDUuNTVMMTEgMXYzLjA3QzcuMDYgNC41NiA0IDcuOTIgNCAxMnMzLjA1IDcuNDQgNyA3Ljkzdi0yLjAyYy0yLjg0LS40OC01LTIuOTQtNS01LjkxczIuMTYtNS40MyA1LTUuOTFWMTBsNC41NS00LjQ1ek0xOS45MyAxMWMtLjE3LTEuMzktLjcyLTIuNzMtMS42Mi0zLjg5bC0xLjQyIDEuNDJjLjU0Ljc1Ljg4IDEuNiAxLjAyIDIuNDdoMi4wMnpNMTMgMTcuOXYyLjAyYzEuMzktLjE3IDIuNzQtLjcxIDMuOS0xLjYxbC0xLjQ0LTEuNDRjLS43NS41NC0xLjU5Ljg5LTIuNDYgMS4wM3ptMy44OS0yLjQybDEuNDIgMS40MWMuOS0xLjE2IDEuNDUtMi41IDEuNjItMy44OWgtMi4wMmMtLjE0Ljg3LS40OCAxLjcyLTEuMDIgMi40OHoiPjwvcGF0aD48L2c+CjxnIGlkPSJzbGlkZXNob3ciPjxwYXRoIGQ9Ik0xMCA4djhsNS00LTUtNHptOS01SDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkg1VjVoMTR2MTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3RyYWlnaHRlbiI+PHBhdGggZD0iTTIxIDZIM2MtMS4xIDAtMiAuOS0yIDJ2OGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bTAgMTBIM1Y4aDJ2NGgyVjhoMnY0aDJWOGgydjRoMlY4aDJ2NGgyVjhoMnY4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InN0eWxlIj48cGF0aCBkPSJNMi41MyAxOS42NWwxLjM0LjU2di05LjAzbC0yLjQzIDUuODZjLS40MSAxLjAyLjA4IDIuMTkgMS4wOSAyLjYxem0xOS41LTMuN0wxNy4wNyAzLjk4Yy0uMzEtLjc1LTEuMDQtMS4yMS0xLjgxLTEuMjMtLjI2IDAtLjUzLjA0LS43OS4xNUw3LjEgNS45NWMtLjc1LjMxLTEuMjEgMS4wMy0xLjIzIDEuOC0uMDEuMjcuMDQuNTQuMTUuOGw0Ljk2IDExLjk3Yy4zMS43NiAxLjA1IDEuMjIgMS44MyAxLjIzLjI2IDAgLjUyLS4wNS43Ny0uMTVsNy4zNi0zLjA1YzEuMDItLjQyIDEuNTEtMS41OSAxLjA5LTIuNnpNNy44OCA4Ljc1Yy0uNTUgMC0xLS40NS0xLTFzLjQ1LTEgMS0xIDEgLjQ1IDEgMS0uNDUgMS0xIDF6bS0yIDExYzAgMS4xLjkgMiAyIDJoMS40NWwtMy40NS04LjM0djYuMzR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3dpdGNoLWNhbWVyYSI+PHBhdGggZD0iTTIwIDRoLTMuMTdMMTUgMkg5TDcuMTcgNEg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bS01IDExLjVWMTNIOXYyLjVMNS41IDEyIDkgOC41VjExaDZWOC41bDMuNSAzLjUtMy41IDMuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJzd2l0Y2gtdmlkZW8iPjxwYXRoIGQ9Ik0xOCA5LjVWNmMwLS41NS0uNDUtMS0xLTFIM2MtLjU1IDAtMSAuNDUtMSAxdjEyYzAgLjU1LjQ1IDEgMSAxaDE0Yy41NSAwIDEtLjQ1IDEtMXYtMy41bDQgNHYtMTNsLTQgNHptLTUgNlYxM0g3djIuNUwzLjUgMTIgNyA4LjVWMTFoNlY4LjVsMy41IDMuNS0zLjUgMy41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRhZy1mYWNlcyI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6TTEyIDIwYy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHptMy41LTljLjgzIDAgMS41LS42NyAxLjUtMS41UzE2LjMzIDggMTUuNSA4IDE0IDguNjcgMTQgOS41cy42NyAxLjUgMS41IDEuNXptLTcgMGMuODMgMCAxLjUtLjY3IDEuNS0xLjVTOS4zMyA4IDguNSA4IDcgOC42NyA3IDkuNSA3LjY3IDExIDguNSAxMXptMy41IDYuNWMyLjMzIDAgNC4zMS0xLjQ2IDUuMTEtMy41SDYuODljLjggMi4wNCAyLjc4IDMuNSA1LjExIDMuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0ZXh0dXJlIj48cGF0aCBkPSJNMTkuNTEgMy4wOEwzLjA4IDE5LjUxYy4wOS4zNC4yNy42NS41MS45LjI1LjI0LjU2LjQyLjkuNTFMMjAuOTMgNC40OWMtLjE5LS42OS0uNzMtMS4yMy0xLjQyLTEuNDF6TTExLjg4IDNMMyAxMS44OHYyLjgzTDE0LjcxIDNoLTIuODN6TTUgM2MtMS4xIDAtMiAuOS0yIDJ2Mmw0LTRINXptMTQgMThjLjU1IDAgMS4wNS0uMjIgMS40MS0uNTkuMzctLjM2LjU5LS44Ni41OS0xLjQxdi0ybC00IDRoMnptLTkuNzEgMGgyLjgzTDIxIDEyLjEyVjkuMjlMOS4yOSAyMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0aW1lbGFwc2UiPjxwYXRoIGQ9Ik0xNi4yNCA3Ljc2QzE1LjA3IDYuNTkgMTMuNTQgNiAxMiA2djZsLTQuMjQgNC4yNGMyLjM0IDIuMzQgNi4xNCAyLjM0IDguNDkgMCAyLjM0LTIuMzQgMi4zNC02LjE0LS4wMS04LjQ4ek0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0aW1lciI+PHBhdGggZD0iTTE1IDFIOXYyaDZWMXptLTQgMTNoMlY4aC0ydjZ6bTguMDMtNi42MWwxLjQyLTEuNDJjLS40My0uNTEtLjktLjk5LTEuNDEtMS40MWwtMS40MiAxLjQyQzE2LjA3IDQuNzQgMTQuMTIgNCAxMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5IDktNC4wMyA5LTljMC0yLjEyLS43NC00LjA3LTEuOTctNS42MXpNMTIgMjBjLTMuODcgMC03LTMuMTMtNy03czMuMTMtNyA3LTcgNyAzLjEzIDcgNy0zLjEzIDctNyA3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRpbWVyLTEwIj48cGF0aCBkPSJNMCA3LjcyVjkuNGwzLTFWMThoMlY2aC0uMjVMMCA3Ljcyem0yMy43OCA2LjY1Yy0uMTQtLjI4LS4zNS0uNTMtLjYzLS43NC0uMjgtLjIxLS42MS0uMzktMS4wMS0uNTNzLS44NS0uMjctMS4zNS0uMzhjLS4zNS0uMDctLjY0LS4xNS0uODctLjIzLS4yMy0uMDgtLjQxLS4xNi0uNTUtLjI1LS4xNC0uMDktLjIzLS4xOS0uMjgtLjMtLjA1LS4xMS0uMDgtLjI0LS4wOC0uMzkgMC0uMTQuMDMtLjI4LjA5LS40MS4wNi0uMTMuMTUtLjI1LjI3LS4zNC4xMi0uMS4yNy0uMTguNDUtLjI0cy40LS4wOS42NC0uMDljLjI1IDAgLjQ3LjA0LjY2LjExLjE5LjA3LjM1LjE3LjQ4LjI5LjEzLjEyLjIyLjI2LjI5LjQyLjA2LjE2LjEuMzIuMS40OWgxLjk1YzAtLjM5LS4wOC0uNzUtLjI0LTEuMDktLjE2LS4zNC0uMzktLjYzLS42OS0uODgtLjMtLjI1LS42Ni0uNDQtMS4wOS0uNTlDMjEuNDkgOS4wNyAyMSA5IDIwLjQ2IDljLS41MSAwLS45OC4wNy0xLjM5LjIxLS40MS4xNC0uNzcuMzMtMS4wNi41Ny0uMjkuMjQtLjUxLjUyLS42Ny44NC0uMTYuMzItLjIzLjY1LS4yMyAxLjAxcy4wOC42OS4yMy45NmMuMTUuMjguMzYuNTIuNjQuNzMuMjcuMjEuNi4zOC45OC41My4zOC4xNC44MS4yNiAxLjI3LjM2LjM5LjA4LjcxLjE3Ljk1LjI2cy40My4xOS41Ny4yOWMuMTMuMS4yMi4yMi4yNy4zNC4wNS4xMi4wNy4yNS4wNy4zOSAwIC4zMi0uMTMuNTctLjQuNzctLjI3LjItLjY2LjI5LTEuMTcuMjktLjIyIDAtLjQzLS4wMi0uNjQtLjA4LS4yMS0uMDUtLjQtLjEzLS41Ni0uMjQtLjE3LS4xMS0uMy0uMjYtLjQxLS40NC0uMTEtLjE4LS4xNy0uNDEtLjE4LS42N2gtMS44OWMwIC4zNi4wOC43MS4yNCAxLjA1LjE2LjM0LjM5LjY1LjcuOTMuMzEuMjcuNjkuNDkgMS4xNS42Ni40Ni4xNy45OC4yNSAxLjU4LjI1LjUzIDAgMS4wMS0uMDYgMS40NC0uMTkuNDMtLjEzLjgtLjMxIDEuMTEtLjU0LjMxLS4yMy41NC0uNTEuNzEtLjgzLjE3LS4zMi4yNS0uNjcuMjUtMS4wNi0uMDItLjQtLjA5LS43NC0uMjQtMS4wMnptLTkuOTYtNy4zMmMtLjM0LS40LS43NS0uNy0xLjIzLS44OC0uNDctLjE4LTEuMDEtLjI3LTEuNTktLjI3LS41OCAwLTEuMTEuMDktMS41OS4yNy0uNDguMTgtLjg5LjQ3LTEuMjMuODgtLjM0LjQxLS42LjkzLS43OSAxLjU5LS4xOC42NS0uMjggMS40NS0uMjggMi4zOXYxLjkyYzAgLjk0LjA5IDEuNzQuMjggMi4zOS4xOS42Ni40NSAxLjE5LjggMS42LjM0LjQxLjc1LjcxIDEuMjMuODkuNDguMTggMS4wMS4yOCAxLjU5LjI4LjU5IDAgMS4xMi0uMDkgMS41OS0uMjguNDgtLjE4Ljg4LS40OCAxLjIyLS44OS4zNC0uNDEuNi0uOTQuNzgtMS42LjE4LS42NS4yOC0xLjQ1LjI4LTIuMzl2LTEuOTJjMC0uOTQtLjA5LTEuNzQtLjI4LTIuMzktLjE4LS42Ni0uNDQtMS4xOS0uNzgtMS41OXptLS45MiA2LjE3YzAgLjYtLjA0IDEuMTEtLjEyIDEuNTMtLjA4LjQyLS4yLjc2LS4zNiAxLjAyLS4xNi4yNi0uMzYuNDUtLjU5LjU3LS4yMy4xMi0uNTEuMTgtLjgyLjE4LS4zIDAtLjU4LS4wNi0uODItLjE4cy0uNDQtLjMxLS42LS41N2MtLjE2LS4yNi0uMjktLjYtLjM4LTEuMDItLjA5LS40Mi0uMTMtLjkzLS4xMy0xLjUzdi0yLjVjMC0uNi4wNC0xLjExLjEzLTEuNTIuMDktLjQxLjIxLS43NC4zOC0xIC4xNi0uMjUuMzYtLjQzLjYtLjU1LjI0LS4xMS41MS0uMTcuODEtLjE3LjMxIDAgLjU4LjA2LjgxLjE3LjI0LjExLjQ0LjI5LjYuNTUuMTYuMjUuMjkuNTguMzcuOTkuMDguNDEuMTMuOTIuMTMgMS41MnYyLjUxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRpbWVyLTMiPjxwYXRoIGQ9Ik0xMS42MSAxMi45N2MtLjE2LS4yNC0uMzYtLjQ2LS42Mi0uNjUtLjI1LS4xOS0uNTYtLjM1LS45My0uNDguMy0uMTQuNTctLjMuOC0uNS4yMy0uMi40Mi0uNDEuNTctLjY0LjE1LS4yMy4yNy0uNDYuMzQtLjcxLjA4LS4yNC4xMS0uNDkuMTEtLjczIDAtLjU1LS4wOS0xLjA0LS4yOC0xLjQ2LS4xOC0uNDItLjQ0LS43Ny0uNzgtMS4wNi0uMzMtLjI4LS43My0uNS0xLjItLjY0LS40NS0uMTMtLjk3LS4yLTEuNTMtLjItLjU1IDAtMS4wNi4wOC0xLjUyLjI0LS40Ny4xNy0uODcuNC0xLjIuNjktLjMzLjI5LS42LjYzLS43OCAxLjAzLS4yLjM5LS4yOS44My0uMjkgMS4yOWgxLjk4YzAtLjI2LjA1LS40OS4xNC0uNjkuMDktLjIuMjItLjM4LjM4LS41Mi4xNy0uMTQuMzYtLjI1LjU4LS4zMy4yMi0uMDguNDYtLjEyLjczLS4xMi42MSAwIDEuMDYuMTYgMS4zNi40Ny4zLjMxLjQ0Ljc1LjQ0IDEuMzIgMCAuMjctLjA0LjUyLS4xMi43NC0uMDguMjItLjIxLjQxLS4zOC41Ny0uMTcuMTYtLjM4LjI4LS42My4zNy0uMjUuMDktLjU1LjEzLS44OS4xM0g2LjcydjEuNTdINy45Yy4zNCAwIC42NC4wNC45MS4xMS4yNy4wOC41LjE5LjY5LjM1LjE5LjE2LjM0LjM2LjQ0LjYxLjEuMjQuMTYuNTQuMTYuODcgMCAuNjItLjE4IDEuMDktLjUzIDEuNDItLjM1LjMzLS44NC40OS0xLjQ1LjQ5LS4yOSAwLS41Ni0uMDQtLjgtLjEzLS4yNC0uMDgtLjQ0LS4yLS42MS0uMzYtLjE3LS4xNi0uMy0uMzQtLjM5LS41Ni0uMDktLjIyLS4xNC0uNDYtLjE0LS43Mkg0LjE5YzAgLjU1LjExIDEuMDMuMzIgMS40NS4yMS40Mi41Ljc3Ljg2IDEuMDVzLjc3LjQ5IDEuMjQuNjMuOTYuMjEgMS40OC4yMWMuNTcgMCAxLjA5LS4wOCAxLjU4LS4yMy40OS0uMTUuOTEtLjM4IDEuMjYtLjY4LjM2LS4zLjY0LS42Ni44NC0xLjEuMi0uNDMuMy0uOTMuMy0xLjQ4IDAtLjI5LS4wNC0uNTgtLjExLS44Ni0uMDgtLjI1LS4xOS0uNTEtLjM1LS43NnptOS4yNiAxLjRjLS4xNC0uMjgtLjM1LS41My0uNjMtLjc0LS4yOC0uMjEtLjYxLS4zOS0xLjAxLS41M3MtLjg1LS4yNy0xLjM1LS4zOGMtLjM1LS4wNy0uNjQtLjE1LS44Ny0uMjMtLjIzLS4wOC0uNDEtLjE2LS41NS0uMjUtLjE0LS4wOS0uMjMtLjE5LS4yOC0uMy0uMDUtLjExLS4wOC0uMjQtLjA4LS4zOXMuMDMtLjI4LjA5LS40MWMuMDYtLjEzLjE1LS4yNS4yNy0uMzQuMTItLjEuMjctLjE4LjQ1LS4yNHMuNC0uMDkuNjQtLjA5Yy4yNSAwIC40Ny4wNC42Ni4xMS4xOS4wNy4zNS4xNy40OC4yOS4xMy4xMi4yMi4yNi4yOS40Mi4wNi4xNi4xLjMyLjEuNDloMS45NWMwLS4zOS0uMDgtLjc1LS4yNC0xLjA5LS4xNi0uMzQtLjM5LS42My0uNjktLjg4LS4zLS4yNS0uNjYtLjQ0LTEuMDktLjU5LS40My0uMTUtLjkyLS4yMi0xLjQ2LS4yMi0uNTEgMC0uOTguMDctMS4zOS4yMS0uNDEuMTQtLjc3LjMzLTEuMDYuNTctLjI5LjI0LS41MS41Mi0uNjcuODQtLjE2LjMyLS4yMy42NS0uMjMgMS4wMXMuMDguNjguMjMuOTZjLjE1LjI4LjM3LjUyLjY0LjczLjI3LjIxLjYuMzguOTguNTMuMzguMTQuODEuMjYgMS4yNy4zNi4zOS4wOC43MS4xNy45NS4yNnMuNDMuMTkuNTcuMjljLjEzLjEuMjIuMjIuMjcuMzQuMDUuMTIuMDcuMjUuMDcuMzkgMCAuMzItLjEzLjU3LS40Ljc3LS4yNy4yLS42Ni4yOS0xLjE3LjI5LS4yMiAwLS40My0uMDItLjY0LS4wOC0uMjEtLjA1LS40LS4xMy0uNTYtLjI0LS4xNy0uMTEtLjMtLjI2LS40MS0uNDQtLjExLS4xOC0uMTctLjQxLS4xOC0uNjdoLTEuODljMCAuMzYuMDguNzEuMjQgMS4wNS4xNi4zNC4zOS42NS43LjkzLjMxLjI3LjY5LjQ5IDEuMTUuNjYuNDYuMTcuOTguMjUgMS41OC4yNS41MyAwIDEuMDEtLjA2IDEuNDQtLjE5LjQzLS4xMy44LS4zMSAxLjExLS41NC4zMS0uMjMuNTQtLjUxLjcxLS44My4xNy0uMzIuMjUtLjY3LjI1LTEuMDYtLjAyLS40LS4wOS0uNzQtLjI0LTEuMDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idGltZXItb2ZmIj48cGF0aCBkPSJNMTkuMDQgNC41NWwtMS40MiAxLjQyQzE2LjA3IDQuNzQgMTQuMTIgNCAxMiA0Yy0xLjgzIDAtMy41My41NS00Ljk1IDEuNDhsMS40NiAxLjQ2QzkuNTMgNi4zNSAxMC43MyA2IDEyIDZjMy44NyAwIDcgMy4xMyA3IDcgMCAxLjI3LS4zNSAyLjQ3LS45NCAzLjQ5bDEuNDUgMS40NUMyMC40NSAxNi41MyAyMSAxNC44MyAyMSAxM2MwLTIuMTItLjc0LTQuMDctMS45Ny01LjYxbDEuNDItMS40Mi0xLjQxLTEuNDJ6TTE1IDFIOXYyaDZWMXptLTQgOC40NGwyIDJWOGgtMnYxLjQ0ek0zLjAyIDRMMS43NSA1LjI3IDQuNSA4LjAzQzMuNTUgOS40NSAzIDExLjE2IDMgMTNjMCA0Ljk3IDQuMDIgOSA5IDkgMS44NCAwIDMuNTUtLjU1IDQuOTgtMS41bDIuNSAyLjUgMS4yNy0xLjI3LTcuNzEtNy43MUwzLjAyIDR6TTEyIDIwYy0zLjg3IDAtNy0zLjEzLTctNyAwLTEuMjguMzUtMi40OC45NS0zLjUybDkuNTYgOS41NmMtMS4wMy42MS0yLjIzLjk2LTMuNTEuOTZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idG9uYWxpdHkiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0tMSAxNy45M2MtMy45NC0uNDktNy0zLjg1LTctNy45M3MzLjA1LTcuNDQgNy03LjkzdjE1Ljg2em0yLTE1Ljg2YzEuMDMuMTMgMiAuNDUgMi44Ny45M0gxM3YtLjkzek0xMyA3aDUuMjRjLjI1LjMxLjQ4LjY1LjY4IDFIMTNWN3ptMCAzaDYuNzRjLjA4LjMzLjE1LjY2LjE5IDFIMTN2LTF6bTAgOS45M1YxOWgyLjg3Yy0uODcuNDgtMS44NC44LTIuODcuOTN6TTE4LjI0IDE3SDEzdi0xaDUuOTJjLS4yLjM1LS40My42OS0uNjggMXptMS41LTNIMTN2LTFoNi45M2MtLjA0LjM0LS4xMS42Ny0uMTkgMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0cmFuc2Zvcm0iPjxwYXRoIGQ9Ik0yMiAxOHYtMkg4VjRoMkw3IDEgNCA0aDJ2MkgydjJoNHY4YzAgMS4xLjkgMiAyIDJoOHYyaC0ybDMgMyAzLTNoLTJ2LTJoNHpNMTAgOGg2djZoMlY4YzAtMS4xLS45LTItMi0yaC02djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idHVuZSI+PHBhdGggZD0iTTMgMTd2Mmg2di0ySDN6TTMgNXYyaDEwVjVIM3ptMTAgMTZ2LTJoOHYtMmgtOHYtMmgtMnY2aDJ6TTcgOXYySDN2Mmg0djJoMlY5SDd6bTE0IDR2LTJIMTF2MmgxMHptLTYtNGgyVjdoNFY1aC00VjNoLTJ2NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aWV3LWNvbWZ5Ij48cGF0aCBkPSJNMyA5aDRWNUgzdjR6bTAgNWg0di00SDN2NHptNSAwaDR2LTRIOHY0em01IDBoNHYtNGgtNHY0ek04IDloNFY1SDh2NHptNS00djRoNFY1aC00em01IDloNHYtNGgtNHY0ek0zIDE5aDR2LTRIM3Y0em01IDBoNHYtNEg4djR6bTUgMGg0di00aC00djR6bTUgMGg0di00aC00djR6bTAtMTR2NGg0VjVoLTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idmlldy1jb21wYWN0Ij48cGF0aCBkPSJNMyAxOWg2di03SDN2N3ptNyAwaDEydi03SDEwdjd6TTMgNXY2aDE5VjVIM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aWduZXR0ZSI+PHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tOSAxNWMtNC40MiAwLTgtMi42OS04LTZzMy41OC02IDgtNiA4IDIuNjkgOCA2LTMuNTggNi04IDZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0id2ItYXV0byI+PHBhdGggZD0iTTYuODUgMTIuNjVoMi4zTDggOWwtMS4xNSAzLjY1ek0yMiA3bC0xLjIgNi4yOUwxOS4zIDdoLTEuNmwtMS40OSA2LjI5TDE1IDdoLS43NkMxMi43NyA1LjE3IDEwLjUzIDQgOCA0Yy00LjQyIDAtOCAzLjU4LTggOHMzLjU4IDggOCA4YzMuMTMgMCA1Ljg0LTEuODEgNy4xNS00LjQzbC4xLjQzSDE3bDEuNS02LjFMMjAgMTZoMS43NWwyLjA1LTlIMjJ6bS0xMS43IDlsLS43LTJINi40bC0uNyAySDMuOEw3IDdoMmwzLjIgOWgtMS45eiI+PC9wYXRoPjwvZz4KPGcgaWQ9IndiLWNsb3VkeSI+PHBhdGggZD0iTTE5LjM2IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjQtNC45NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ3Yi1pbmNhbmRlc2NlbnQiPjxwYXRoIGQ9Ik0zLjU1IDE4LjU0bDEuNDEgMS40MSAxLjc5LTEuOC0xLjQxLTEuNDEtMS43OSAxLjh6TTExIDIyLjQ1aDJWMTkuNWgtMnYyLjk1ek00IDEwLjVIMXYyaDN2LTJ6bTExLTQuMTlWMS41SDl2NC44MUM3LjIxIDcuMzUgNiA5LjI4IDYgMTEuNWMwIDMuMzEgMi42OSA2IDYgNnM2LTIuNjkgNi02YzAtMi4yMi0xLjIxLTQuMTUtMy01LjE5em01IDQuMTl2Mmgzdi0yaC0zem0tMi43NiA3LjY2bDEuNzkgMS44IDEuNDEtMS40MS0xLjgtMS43OS0xLjQgMS40eiI+PC9wYXRoPjwvZz4KPGcgaWQ9IndiLWlyaWRlc2NlbnQiPjxwYXRoIGQ9Ik01IDE0LjVoMTR2LTZINXY2ek0xMSAuNTVWMy41aDJWLjU1aC0yem04LjA0IDIuNWwtMS43OSAxLjc5IDEuNDEgMS40MSAxLjgtMS43OS0xLjQyLTEuNDF6TTEzIDIyLjQ1VjE5LjVoLTJ2Mi45NWgyem03LjQ1LTMuOTFsLTEuOC0xLjc5LTEuNDEgMS40MSAxLjc5IDEuOCAxLjQyLTEuNDJ6TTMuNTUgNC40NmwxLjc5IDEuNzkgMS40MS0xLjQxLTEuNzktMS43OS0xLjQxIDEuNDF6bTEuNDEgMTUuNDlsMS43OS0xLjgtMS40MS0xLjQxLTEuNzkgMS43OSAxLjQxIDEuNDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0id2Itc3VubnkiPjxwYXRoIGQ9Ik02Ljc2IDQuODRsLTEuOC0xLjc5LTEuNDEgMS40MSAxLjc5IDEuNzkgMS40Mi0xLjQxek00IDEwLjVIMXYyaDN2LTJ6bTktOS45NWgtMlYzLjVoMlYuNTV6bTcuNDUgMy45MWwtMS40MS0xLjQxLTEuNzkgMS43OSAxLjQxIDEuNDEgMS43OS0xLjc5em0tMy4yMSAxMy43bDEuNzkgMS44IDEuNDEtMS40MS0xLjgtMS43OS0xLjQgMS40ek0yMCAxMC41djJoM3YtMmgtM3ptLTgtNWMtMy4zMSAwLTYgMi42OS02IDZzMi42OSA2IDYgNiA2LTIuNjkgNi02LTIuNjktNi02LTZ6bS0xIDE2Ljk1aDJWMTkuNWgtMnYyLjk1em0tNy40NS0zLjkxbDEuNDEgMS40MSAxLjc5LTEuOC0xLjQxLTEuNDEtMS43OSAxLjh6Ij48L3BhdGg+PC9nPgo8L2RlZnM+PC9zdmc+CjwvaXJvbi1pY29uc2V0LXN2Zz5gO2RvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoU28uY29udGVudCk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBNbz1fZWA8aXJvbi1pY29uc2V0LXN2ZyBuYW1lPSJpY29ucyIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iM2Qtcm90YXRpb24iPjxwYXRoIGQ9Ik03LjUyIDIxLjQ4QzQuMjUgMTkuOTQgMS45MSAxNi43NiAxLjU1IDEzSC4wNUMuNTYgMTkuMTYgNS43MSAyNCAxMiAyNGwuNjYtLjAzLTMuODEtMy44MS0xLjMzIDEuMzJ6bS44OS02LjUyYy0uMTkgMC0uMzctLjAzLS41Mi0uMDgtLjE2LS4wNi0uMjktLjEzLS40LS4yNC0uMTEtLjEtLjItLjIyLS4yNi0uMzctLjA2LS4xNC0uMDktLjMtLjA5LS40N2gtMS4zYzAgLjM2LjA3LjY4LjIxLjk1LjE0LjI3LjMzLjUuNTYuNjkuMjQuMTguNTEuMzIuODIuNDEuMy4xLjYyLjE1Ljk2LjE1LjM3IDAgLjcyLS4wNSAxLjAzLS4xNS4zMi0uMS42LS4yNS44My0uNDRzLjQyLS40My41NS0uNzJjLjEzLS4yOS4yLS42MS4yLS45NyAwLS4xOS0uMDItLjM4LS4wNy0uNTYtLjA1LS4xOC0uMTItLjM1LS4yMy0uNTEtLjEtLjE2LS4yNC0uMy0uNC0uNDMtLjE3LS4xMy0uMzctLjIzLS42MS0uMzEuMi0uMDkuMzctLjIuNTItLjMzLjE1LS4xMy4yNy0uMjcuMzctLjQyLjEtLjE1LjE3LS4zLjIyLS40Ni4wNS0uMTYuMDctLjMyLjA3LS40OCAwLS4zNi0uMDYtLjY4LS4xOC0uOTYtLjEyLS4yOC0uMjktLjUxLS41MS0uNjktLjItLjE5LS40Ny0uMzMtLjc3LS40M0M5LjEgOC4wNSA4Ljc2IDggOC4zOSA4Yy0uMzYgMC0uNjkuMDUtMSAuMTYtLjMuMTEtLjU3LjI2LS43OS40NS0uMjEuMTktLjM4LjQxLS41MS42Ny0uMTIuMjYtLjE4LjU0LS4xOC44NWgxLjNjMC0uMTcuMDMtLjMyLjA5LS40NXMuMTQtLjI1LjI1LS4zNGMuMTEtLjA5LjIzLS4xNy4zOC0uMjIuMTUtLjA1LjMtLjA4LjQ4LS4wOC40IDAgLjcuMS44OS4zMS4xOS4yLjI5LjQ5LjI5Ljg2IDAgLjE4LS4wMy4zNC0uMDguNDktLjA1LjE1LS4xNC4yNy0uMjUuMzctLjExLjEtLjI1LjE4LS40MS4yNC0uMTYuMDYtLjM2LjA5LS41OC4wOUg3LjV2MS4wM2guNzdjLjIyIDAgLjQyLjAyLjYuMDdzLjMzLjEzLjQ1LjIzYy4xMi4xMS4yMi4yNC4yOS40LjA3LjE2LjEuMzUuMS41NyAwIC40MS0uMTIuNzItLjM1LjkzLS4yMy4yMy0uNTUuMzMtLjk1LjMzem04LjU1LTUuOTJjLS4zMi0uMzMtLjctLjU5LTEuMTQtLjc3LS40My0uMTgtLjkyLS4yNy0xLjQ2LS4yN0gxMnY4aDIuM2MuNTUgMCAxLjA2LS4wOSAxLjUxLS4yNy40NS0uMTguODQtLjQzIDEuMTYtLjc2LjMyLS4zMy41Ny0uNzMuNzQtMS4xOS4xNy0uNDcuMjYtLjk5LjI2LTEuNTd2LS40YzAtLjU4LS4wOS0xLjEtLjI2LTEuNTctLjE4LS40Ny0uNDMtLjg3LS43NS0xLjJ6bS0uMzkgMy4xNmMwIC40Mi0uMDUuNzktLjE0IDEuMTMtLjEuMzMtLjI0LjYyLS40My44NS0uMTkuMjMtLjQzLjQxLS43MS41My0uMjkuMTItLjYyLjE4LS45OS4xOGgtLjkxVjkuMTJoLjk3Yy43MiAwIDEuMjcuMjMgMS42NC42OS4zOC40Ni41NyAxLjEyLjU3IDEuOTl2LjR6TTEyIDBsLS42Ni4wMyAzLjgxIDMuODEgMS4zMy0xLjMzYzMuMjcgMS41NSA1LjYxIDQuNzIgNS45NiA4LjQ4aDEuNUMyMy40NCA0Ljg0IDE4LjI5IDAgMTIgMHoiPjwvcGF0aD48L2c+CjxnIGlkPSJhY2Nlc3NpYmlsaXR5Ij48cGF0aCBkPSJNMTIgMmMxLjEgMCAyIC45IDIgMnMtLjkgMi0yIDItMi0uOS0yLTIgLjktMiAyLTJ6bTkgN2gtNnYxM2gtMnYtNmgtMnY2SDlWOUgzVjdoMTh2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJhY2Nlc3NpYmxlIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjQiIHI9IjIiPjwvY2lyY2xlPjxwYXRoIGQ9Ik0xOSAxM3YtMmMtMS41NC4wMi0zLjA5LS43NS00LjA3LTEuODNsLTEuMjktMS40M2MtLjE3LS4xOS0uMzgtLjM0LS42MS0uNDUtLjAxIDAtLjAxLS4wMS0uMDItLjAxSDEzYy0uMzUtLjItLjc1LS4zLTEuMTktLjI2QzEwLjc2IDcuMTEgMTAgOC4wNCAxMCA5LjA5VjE1YzAgMS4xLjkgMiAyIDJoNXY1aDJ2LTUuNWMwLTEuMS0uOS0yLTItMmgtM3YtMy40NWMxLjI5IDEuMDcgMy4yNSAxLjk0IDUgMS45NXptLTYuMTcgNWMtLjQxIDEuMTYtMS41MiAyLTIuODMgMi0xLjY2IDAtMy0xLjM0LTMtMyAwLTEuMzEuODQtMi40MSAyLTIuODNWMTIuMWMtMi4yOC40Ni00IDIuNDgtNCA0LjkgMCAyLjc2IDIuMjQgNSA1IDUgMi40MiAwIDQuNDQtMS43MiA0LjktNGgtMi4wN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJhY2NvdW50LWJhbGFuY2UiPjxwYXRoIGQ9Ik00IDEwdjdoM3YtN0g0em02IDB2N2gzdi03aC0zek0yIDIyaDE5di0zSDJ2M3ptMTQtMTJ2N2gzdi03aC0zem0tNC41LTlMMiA2djJoMTlWNmwtOS41LTV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYWNjb3VudC1iYWxhbmNlLXdhbGxldCI+PHBhdGggZD0iTTIxIDE4djFjMCAxLjEtLjkgMi0yIDJINWMtMS4xMSAwLTItLjktMi0yVjVjMC0xLjEuODktMiAyLTJoMTRjMS4xIDAgMiAuOSAyIDJ2MWgtOWMtMS4xMSAwLTIgLjktMiAydjhjMCAxLjEuODkgMiAyIDJoOXptLTktMmgxMFY4SDEydjh6bTQtMi41Yy0uODMgMC0xLjUtLjY3LTEuNS0xLjVzLjY3LTEuNSAxLjUtMS41IDEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJhY2NvdW50LWJveCI+PHBhdGggZD0iTTMgNXYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0ySDVjLTEuMTEgMC0yIC45LTIgMnptMTIgNGMwIDEuNjYtMS4zNCAzLTMgM3MtMy0xLjM0LTMtMyAxLjM0LTMgMy0zIDMgMS4zNCAzIDN6bS05IDhjMC0yIDQtMy4xIDYtMy4xczYgMS4xIDYgMy4xdjFINnYtMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJhY2NvdW50LWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgM2MxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgMy0zLTEuMzQtMy0zIDEuMzQtMyAzLTN6bTAgMTQuMmMtMi41IDAtNC43MS0xLjI4LTYtMy4yMi4wMy0xLjk5IDQtMy4wOCA2LTMuMDggMS45OSAwIDUuOTcgMS4wOSA2IDMuMDgtMS4yOSAxLjk0LTMuNSAzLjIyLTYgMy4yMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJhZGQiPjxwYXRoIGQ9Ik0xOSAxM2gtNnY2aC0ydi02SDV2LTJoNlY1aDJ2Nmg2djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYWRkLWFsZXJ0Ij48cGF0aCBkPSJNMTAuMDEgMjEuMDFjMCAxLjEuODkgMS45OSAxLjk5IDEuOTlzMS45OS0uODkgMS45OS0xLjk5aC0zLjk4em04Ljg3LTQuMTlWMTFjMC0zLjI1LTIuMjUtNS45Ny01LjI5LTYuNjl2LS43MkMxMy41OSAyLjcxIDEyLjg4IDIgMTIgMnMtMS41OS43MS0xLjU5IDEuNTl2LjcyQzcuMzcgNS4wMyA1LjEyIDcuNzUgNS4xMiAxMXY1LjgyTDMgMTguOTRWMjBoMTh2LTEuMDZsLTIuMTItMi4xMnpNMTYgMTMuMDFoLTN2M2gtMnYtM0g4VjExaDNWOGgydjNoM3YyLjAxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFkZC1ib3giPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tMiAxMGgtNHY0aC0ydi00SDd2LTJoNFY3aDJ2NGg0djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYWRkLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTUgMTFoLTR2NGgtMnYtNEg3di0yaDRWN2gydjRoNHYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFkZC1jaXJjbGUtb3V0bGluZSI+PHBhdGggZD0iTTEzIDdoLTJ2NEg3djJoNHY0aDJ2LTRoNHYtMmgtNFY3em0tMS01QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJhZGQtc2hvcHBpbmctY2FydCI+PHBhdGggZD0iTTExIDloMlY2aDNWNGgtM1YxaC0ydjNIOHYyaDN2M3ptLTQgOWMtMS4xIDAtMS45OS45LTEuOTkgMlM1LjkgMjIgNyAyMnMyLS45IDItMi0uOS0yLTItMnptMTAgMGMtMS4xIDAtMS45OS45LTEuOTkgMnMuODkgMiAxLjk5IDIgMi0uOSAyLTItLjktMi0yLTJ6bS05LjgzLTMuMjVsLjAzLS4xMi45LTEuNjNoNy40NWMuNzUgMCAxLjQxLS40MSAxLjc1LTEuMDNsMy44Ni03LjAxTDE5LjQyIDRoLS4wMWwtMS4xIDItMi43NiA1SDguNTNsLS4xMy0uMjdMNi4xNiA2bC0uOTUtMi0uOTQtMkgxdjJoMmwzLjYgNy41OS0xLjM1IDIuNDVjLS4xNi4yOC0uMjUuNjEtLjI1Ljk2IDAgMS4xLjkgMiAyIDJoMTJ2LTJINy40MmMtLjEzIDAtLjI1LS4xMS0uMjUtLjI1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFsYXJtIj48cGF0aCBkPSJNMjIgNS43MmwtNC42LTMuODYtMS4yOSAxLjUzIDQuNiAzLjg2TDIyIDUuNzJ6TTcuODggMy4zOUw2LjYgMS44NiAyIDUuNzFsMS4yOSAxLjUzIDQuNTktMy44NXpNMTIuNSA4SDExdjZsNC43NSAyLjg1Ljc1LTEuMjMtNC0yLjM3Vjh6TTEyIDRjLTQuOTcgMC05IDQuMDMtOSA5czQuMDIgOSA5IDljNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bTAgMTZjLTMuODcgMC03LTMuMTMtNy03czMuMTMtNyA3LTcgNyAzLjEzIDcgNy0zLjEzIDctNyA3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFsYXJtLWFkZCI+PHBhdGggZD0iTTcuODggMy4zOUw2LjYgMS44NiAyIDUuNzFsMS4yOSAxLjUzIDQuNTktMy44NXpNMjIgNS43MmwtNC42LTMuODYtMS4yOSAxLjUzIDQuNiAzLjg2TDIyIDUuNzJ6TTEyIDRjLTQuOTcgMC05IDQuMDMtOSA5czQuMDIgOSA5IDljNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bTAgMTZjLTMuODcgMC03LTMuMTMtNy03czMuMTMtNyA3LTcgNyAzLjEzIDcgNy0zLjEzIDctNyA3em0xLTExaC0ydjNIOHYyaDN2M2gydi0zaDN2LTJoLTNWOXoiPjwvcGF0aD48L2c+CjxnIGlkPSJhbGFybS1vZmYiPjxwYXRoIGQ9Ik0xMiA2YzMuODcgMCA3IDMuMTMgNyA3IDAgLjg0LS4xNiAxLjY1LS40MyAyLjRsMS41MiAxLjUyYy41OC0xLjE5LjkxLTIuNTEuOTEtMy45MiAwLTQuOTctNC4wMy05LTktOS0xLjQxIDAtMi43My4zMy0zLjkyLjkxTDkuNiA2LjQzQzEwLjM1IDYuMTYgMTEuMTYgNiAxMiA2em0xMC0uMjhsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek0yLjkyIDIuMjlMMS42NSAzLjU3IDIuOTggNC45bC0xLjExLjkzIDEuNDIgMS40MiAxLjExLS45NC44LjhDMy44MyA4LjY5IDMgMTAuNzUgMyAxM2MwIDQuOTcgNC4wMiA5IDkgOSAyLjI1IDAgNC4zMS0uODMgNS44OS0yLjJsMi4yIDIuMiAxLjI3LTEuMjdMMy44OSAzLjI3bC0uOTctLjk4em0xMy41NSAxNi4xQzE1LjI2IDE5LjM5IDEzLjcgMjAgMTIgMjBjLTMuODcgMC03LTMuMTMtNy03IDAtMS43LjYxLTMuMjYgMS42MS00LjQ3bDkuODYgOS44NnpNOC4wMiAzLjI4TDYuNiAxLjg2bC0uODYuNzEgMS40MiAxLjQyLjg2LS43MXoiPjwvcGF0aD48L2c+CjxnIGlkPSJhbGFybS1vbiI+PHBhdGggZD0iTTIyIDUuNzJsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek03Ljg4IDMuMzlMNi42IDEuODYgMiA1LjcxbDEuMjkgMS41MyA0LjU5LTMuODV6TTEyIDRjLTQuOTcgMC05IDQuMDMtOSA5czQuMDIgOSA5IDljNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bTAgMTZjLTMuODcgMC03LTMuMTMtNy03czMuMTMtNyA3LTcgNyAzLjEzIDcgNy0zLjEzIDctNyA3em0tMS40Ni01LjQ3TDguNDEgMTIuNGwtMS4wNiAxLjA2IDMuMTggMy4xOCA2LTYtMS4wNi0xLjA2LTQuOTMgNC45NXoiPjwvcGF0aD48L2c+CjxnIGlkPSJhbGwtb3V0Ij48cGF0aCBkPSJNMTYuMjEgNC4xNmw0IDR2LTR6bTQgMTJsLTQgNGg0em0tMTIgNGwtNC00djR6bS00LTEybDQtNGgtNHptMTIuOTUtLjk1Yy0yLjczLTIuNzMtNy4xNy0yLjczLTkuOSAwcy0yLjczIDcuMTcgMCA5LjkgNy4xNyAyLjczIDkuOSAwIDIuNzMtNy4xNiAwLTkuOXptLTEuMSA4LjhjLTIuMTMgMi4xMy01LjU3IDIuMTMtNy43IDBzLTIuMTMtNS41NyAwLTcuNyA1LjU3LTIuMTMgNy43IDAgMi4xMyA1LjU3IDAgNy43eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFuZHJvaWQiPjxwYXRoIGQ9Ik02IDE4YzAgLjU1LjQ1IDEgMSAxaDF2My41YzAgLjgzLjY3IDEuNSAxLjUgMS41czEuNS0uNjcgMS41LTEuNVYxOWgydjMuNWMwIC44My42NyAxLjUgMS41IDEuNXMxLjUtLjY3IDEuNS0xLjVWMTloMWMuNTUgMCAxLS40NSAxLTFWOEg2djEwek0zLjUgOEMyLjY3IDggMiA4LjY3IDIgOS41djdjMCAuODMuNjcgMS41IDEuNSAxLjVTNSAxNy4zMyA1IDE2LjV2LTdDNSA4LjY3IDQuMzMgOCAzLjUgOHptMTcgMGMtLjgzIDAtMS41LjY3LTEuNSAxLjV2N2MwIC44My42NyAxLjUgMS41IDEuNXMxLjUtLjY3IDEuNS0xLjV2LTdjMC0uODMtLjY3LTEuNS0xLjUtMS41em0tNC45Ny01Ljg0bDEuMy0xLjNjLjItLjIuMi0uNTEgMC0uNzEtLjItLjItLjUxLS4yLS43MSAwbC0xLjQ4IDEuNDhDMTMuODUgMS4yMyAxMi45NSAxIDEyIDFjLS45NiAwLTEuODYuMjMtMi42Ni42M0w3Ljg1LjE1Yy0uMi0uMi0uNTEtLjItLjcxIDAtLjIuMi0uMi41MSAwIC43MWwxLjMxIDEuMzFDNi45NyAzLjI2IDYgNS4wMSA2IDdoMTJjMC0xLjk5LS45Ny0zLjc1LTIuNDctNC44NHpNMTAgNUg5VjRoMXYxem01IDBoLTFWNGgxdjF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYW5ub3VuY2VtZW50Ij48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDloLTJWNWgydjZ6bTAgNGgtMnYtMmgydjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXBwcyI+PHBhdGggZD0iTTQgOGg0VjRINHY0em02IDEyaDR2LTRoLTR2NHptLTYgMGg0di00SDR2NHptMC02aDR2LTRINHY0em02IDBoNHYtNGgtNHY0em02LTEwdjRoNFY0aC00em0tNiA0aDRWNGgtNHY0em02IDZoNHYtNGgtNHY0em0wIDZoNHYtNGgtNHY0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFyY2hpdmUiPjxwYXRoIGQ9Ik0yMC41NCA1LjIzbC0xLjM5LTEuNjhDMTguODggMy4yMSAxOC40NyAzIDE4IDNINmMtLjQ3IDAtLjg4LjIxLTEuMTYuNTVMMy40NiA1LjIzQzMuMTcgNS41NyAzIDYuMDIgMyA2LjVWMTljMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2LjVjMC0uNDgtLjE3LS45My0uNDYtMS4yN3pNMTIgMTcuNUw2LjUgMTJIMTB2LTJoNHYyaDMuNUwxMiAxNy41ek01LjEyIDVsLjgxLTFoMTJsLjk0IDFINS4xMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJhcnJvdy1iYWNrIj48cGF0aCBkPSJNMjAgMTFINy44M2w1LjU5LTUuNTlMMTIgNGwtOCA4IDggOCAxLjQxLTEuNDFMNy44MyAxM0gyMHYtMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJhcnJvdy1kb3dud2FyZCI+PHBhdGggZD0iTTIwIDEybC0xLjQxLTEuNDFMMTMgMTYuMTdWNGgtMnYxMi4xN2wtNS41OC01LjU5TDQgMTJsOCA4IDgtOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJhcnJvdy1kcm9wLWRvd24iPjxwYXRoIGQ9Ik03IDEwbDUgNSA1LTV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXJyb3ctZHJvcC1kb3duLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMTJsLTQtNGg4bC00IDR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXJyb3ctZHJvcC11cCI+PHBhdGggZD0iTTcgMTRsNS01IDUgNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJhcnJvdy1mb3J3YXJkIj48cGF0aCBkPSJNMTIgNGwtMS40MSAxLjQxTDE2LjE3IDExSDR2MmgxMi4xN2wtNS41OCA1LjU5TDEyIDIwbDgtOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJhcnJvdy11cHdhcmQiPjxwYXRoIGQ9Ik00IDEybDEuNDEgMS40MUwxMSA3LjgzVjIwaDJWNy44M2w1LjU4IDUuNTlMMjAgMTJsLTgtOC04IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXNwZWN0LXJhdGlvIj48cGF0aCBkPSJNMTkgMTJoLTJ2M2gtM3YyaDV2LTV6TTcgOWgzVjdINXY1aDJWOXptMTQtNkgzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTYuMDFIM1Y0Ljk5aDE4djE0LjAyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFzc2Vzc21lbnQiPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNOSAxN0g3di03aDJ2N3ptNCAwaC0yVjdoMnYxMHptNCAwaC0ydi00aDJ2NHoiPjwvcGF0aD48L2c+CjxnIGlkPSJhc3NpZ25tZW50Ij48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTIgMTRIN3YtMmg3djJ6bTMtNEg3di0yaDEwdjJ6bTAtNEg3VjdoMTB2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJhc3NpZ25tZW50LWluZCI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0wIDRjMS42NiAwIDMgMS4zNCAzIDNzLTEuMzQgMy0zIDMtMy0xLjM0LTMtMyAxLjM0LTMgMy0zem02IDEySDZ2LTEuNGMwLTIgNC0zLjEgNi0zLjFzNiAxLjEgNiAzLjFWMTl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXNzaWdubWVudC1sYXRlIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNiAxNWgtMnYtMmgydjJ6bTAtNGgtMlY4aDJ2NnptLTEtOWMtLjU1IDAtMS0uNDUtMS0xcy40NS0xIDEtMSAxIC40NSAxIDEtLjQ1IDEtMSAxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtcmV0dXJuIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTQgMTJoLTR2M2wtNS01IDUtNXYzaDR2NHoiPjwvcGF0aD48L2c+CjxnIGlkPSJhc3NpZ25tZW50LXJldHVybmVkIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTAgMTVsLTUtNWgzVjloNHY0aDNsLTUgNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJhc3NpZ25tZW50LXR1cm5lZC1pbiI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0tMiAxNGwtNC00IDEuNDEtMS40MUwxMCAxNC4xN2w2LjU5LTYuNTlMMTggOWwtOCA4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImF0dGFjaG1lbnQiPjxwYXRoIGQ9Ik0yIDEyLjVDMiA5LjQ2IDQuNDYgNyA3LjUgN0gxOGMyLjIxIDAgNCAxLjc5IDQgNHMtMS43OSA0LTQgNEg5LjVDOC4xMiAxNSA3IDEzLjg4IDcgMTIuNVM4LjEyIDEwIDkuNSAxMEgxN3YySDkuNDFjLS41NSAwLS41NSAxIDAgMUgxOGMxLjEgMCAyLS45IDItMnMtLjktMi0yLTJINy41QzUuNTcgOSA0IDEwLjU3IDQgMTIuNVM1LjU3IDE2IDcuNSAxNkgxN3YySDcuNUM0LjQ2IDE4IDIgMTUuNTQgMiAxMi41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImF1dG9yZW5ldyI+PHBhdGggZD0iTTEyIDZ2M2w0LTQtNC00djNjLTQuNDIgMC04IDMuNTgtOCA4IDAgMS41Ny40NiAzLjAzIDEuMjQgNC4yNkw2LjcgMTQuOGMtLjQ1LS44My0uNy0xLjc5LS43LTIuOCAwLTMuMzEgMi42OS02IDYtNnptNi43NiAxLjc0TDE3LjMgOS4yYy40NC44NC43IDEuNzkuNyAyLjggMCAzLjMxLTIuNjkgNi02IDZ2LTNsLTQgNCA0IDR2LTNjNC40MiAwIDgtMy41OCA4LTggMC0xLjU3LS40Ni0zLjAzLTEuMjQtNC4yNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJiYWNrc3BhY2UiPjxwYXRoIGQ9Ik0yMiAzSDdjLS42OSAwLTEuMjMuMzUtMS41OS44OEwwIDEybDUuNDEgOC4xMWMuMzYuNTMuOS44OSAxLjU5Ljg5aDE1YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS0zIDEyLjU5TDE3LjU5IDE3IDE0IDEzLjQxIDEwLjQxIDE3IDkgMTUuNTkgMTIuNTkgMTIgOSA4LjQxIDEwLjQxIDcgMTQgMTAuNTkgMTcuNTkgNyAxOSA4LjQxIDE1LjQxIDEyIDE5IDE1LjU5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJhY2t1cCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTQgMTN2NGgtNHYtNEg3bDUtNSA1IDVoLTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYmxvY2siPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyek00IDEyYzAtNC40MiAzLjU4LTggOC04IDEuODUgMCAzLjU1LjYzIDQuOSAxLjY5TDUuNjkgMTYuOUM0LjYzIDE1LjU1IDQgMTMuODUgNCAxMnptOCA4Yy0xLjg1IDAtMy41NS0uNjMtNC45LTEuNjlMMTguMzEgNy4xQzE5LjM3IDguNDUgMjAgMTAuMTUgMjAgMTJjMCA0LjQyLTMuNTggOC04IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYm9vayI+PHBhdGggZD0iTTE4IDJINmMtMS4xIDAtMiAuOS0yIDJ2MTZjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek02IDRoNXY4bC0yLjUtMS41TDYgMTJWNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJib29rbWFyayI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJib29rbWFyay1ib3JkZXIiPjxwYXRoIGQ9Ik0xNyAzSDdjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNSAyMWw3LTMgNyAzVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTVsLTUtMi4xOEw3IDE4VjVoMTB2MTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYnVnLXJlcG9ydCI+PHBhdGggZD0iTTIwIDhoLTIuODFjLS40NS0uNzgtMS4wNy0xLjQ1LTEuODItMS45NkwxNyA0LjQxIDE1LjU5IDNsLTIuMTcgMi4xN0MxMi45NiA1LjA2IDEyLjQ5IDUgMTIgNWMtLjQ5IDAtLjk2LjA2LTEuNDEuMTdMOC40MSAzIDcgNC40MWwxLjYyIDEuNjNDNy44OCA2LjU1IDcuMjYgNy4yMiA2LjgxIDhINHYyaDIuMDljLS4wNS4zMy0uMDkuNjYtLjA5IDF2MUg0djJoMnYxYzAgLjM0LjA0LjY3LjA5IDFINHYyaDIuODFjMS4wNCAxLjc5IDIuOTcgMyA1LjE5IDNzNC4xNS0xLjIxIDUuMTktM0gyMHYtMmgtMi4wOWMuMDUtLjMzLjA5LS42Ni4wOS0xdi0xaDJ2LTJoLTJ2LTFjMC0uMzQtLjA0LS42Ny0uMDktMUgyMFY4em0tNiA4aC00di0yaDR2MnptMC00aC00di0yaDR2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJidWlsZCI+PHBhdGggZD0iTTIyLjcgMTlsLTkuMS05LjFjLjktMi4zLjQtNS0xLjUtNi45LTItMi01LTIuNC03LjQtMS4zTDkgNiA2IDkgMS42IDQuN0MuNCA3LjEuOSAxMC4xIDIuOSAxMi4xYzEuOSAxLjkgNC42IDIuNCA2LjkgMS41bDkuMSA5LjFjLjQuNCAxIC40IDEuNCAwbDIuMy0yLjNjLjUtLjQuNS0xLjEuMS0xLjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2FjaGVkIj48cGF0aCBkPSJNMTkgOGwtNCA0aDNjMCAzLjMxLTIuNjkgNi02IDYtMS4wMSAwLTEuOTctLjI1LTIuOC0uN2wtMS40NiAxLjQ2QzguOTcgMTkuNTQgMTAuNDMgMjAgMTIgMjBjNC40MiAwIDgtMy41OCA4LThoM2wtNC00ek02IDEyYzAtMy4zMSAyLjY5LTYgNi02IDEuMDEgMCAxLjk3LjI1IDIuOC43bDEuNDYtMS40NkMxNS4wMyA0LjQ2IDEzLjU3IDQgMTIgNGMtNC40MiAwLTggMy41OC04IDhIMWw0IDQgNC00SDZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2FtZXJhLWVuaGFuY2UiPjxwYXRoIGQ9Ik05IDNMNy4xNyA1SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMmgtMy4xN0wxNSAzSDl6bTMgMTVjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1em0wLTFsMS4yNS0yLjc1TDE2IDEzbC0yLjc1LTEuMjVMMTIgOWwtMS4yNSAyLjc1TDggMTNsMi43NSAxLjI1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNhbmNlbCI+PHBhdGggZD0iTTEyIDJDNi40NyAyIDIgNi40NyAyIDEyczQuNDcgMTAgMTAgMTAgMTAtNC40NyAxMC0xMFMxNy41MyAyIDEyIDJ6bTUgMTMuNTlMMTUuNTkgMTcgMTIgMTMuNDEgOC40MSAxNyA3IDE1LjU5IDEwLjU5IDEyIDcgOC40MSA4LjQxIDcgMTIgMTAuNTkgMTUuNTkgNyAxNyA4LjQxIDEzLjQxIDEyIDE3IDE1LjU5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNhcmQtZ2lmdGNhcmQiPjxwYXRoIGQ9Ik0yMCA2aC0yLjE4Yy4xMS0uMzEuMTgtLjY1LjE4LTEgMC0xLjY2LTEuMzQtMy0zLTMtMS4wNSAwLTEuOTYuNTQtMi41IDEuMzVsLS41LjY3LS41LS42OEMxMC45NiAyLjU0IDEwLjA1IDIgOSAyIDcuMzQgMiA2IDMuMzQgNiA1YzAgLjM1LjA3LjY5LjE4IDFINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMTljMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWOGMwLTEuMTEtLjg5LTItMi0yem0tNS0yYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6TTkgNGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0xMSAxNUg0di0yaDE2djJ6bTAtNUg0VjhoNS4wOEw3IDEwLjgzIDguNjIgMTIgMTEgOC43NmwxLTEuMzYgMSAxLjM2TDE1LjM4IDEyIDE3IDEwLjgzIDE0LjkyIDhIMjB2NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjYXJkLW1lbWJlcnNoaXAiPjxwYXRoIGQ9Ik0yMCAySDRjLTEuMTEgMC0yIC44OS0yIDJ2MTFjMCAxLjExLjg5IDIgMiAyaDR2NWw0LTIgNCAydi01aDRjMS4xMSAwIDItLjg5IDItMlY0YzAtMS4xMS0uODktMi0yLTJ6bTAgMTNINHYtMmgxNnYyem0wLTVINFY0aDE2djZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2FyZC10cmF2ZWwiPjxwYXRoIGQ9Ik0yMCA2aC0zVjRjMC0xLjExLS44OS0yLTItMkg5Yy0xLjExIDAtMiAuODktMiAydjJINGMtMS4xMSAwLTIgLjg5LTIgMnYxMWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6TTkgNGg2djJIOVY0em0xMSAxNUg0di0yaDE2djJ6bTAtNUg0VjhoM3YyaDJWOGg2djJoMlY4aDN2NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjaGFuZ2UtaGlzdG9yeSI+PHBhdGggZD0iTTEyIDcuNzdMMTguMzkgMThINS42MUwxMiA3Ljc3TTEyIDRMMiAyMGgyMEwxMiA0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNoZWNrIj48cGF0aCBkPSJNOSAxNi4xN0w0LjgzIDEybC0xLjQyIDEuNDFMOSAxOSAyMSA3bC0xLjQxLTEuNDF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2hlY2stYm94Ij48cGF0aCBkPSJNMTkgM0g1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xMSAwIDItLjkgMi0yVjVjMC0xLjEtLjg5LTItMi0yem0tOSAxNGwtNS01IDEuNDEtMS40MUwxMCAxNC4xN2w3LjU5LTcuNTlMMTkgOGwtOSA5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNoZWNrLWJveC1vdXRsaW5lLWJsYW5rIj48cGF0aCBkPSJNMTkgNXYxNEg1VjVoMTRtMC0ySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjaGVjay1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0tMiAxNWwtNS01IDEuNDEtMS40MUwxMCAxNC4xN2w3LjU5LTcuNTlMMTkgOGwtOSA5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNoZXZyb24tbGVmdCI+PHBhdGggZD0iTTE1LjQxIDcuNDFMMTQgNmwtNiA2IDYgNiAxLjQxLTEuNDFMMTAuODMgMTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2hldnJvbi1yaWdodCI+PHBhdGggZD0iTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNocm9tZS1yZWFkZXItbW9kZSI+PHBhdGggZD0iTTEzIDEyaDd2MS41aC03em0wLTIuNWg3VjExaC03em0wIDVoN1YxNmgtN3pNMjEgNEgzYy0xLjEgMC0yIC45LTIgMnYxM2MwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgMTVoLTlWNmg5djEzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNsYXNzIj48cGF0aCBkPSJNMTggMkg2Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTYgNGg1djhsLTIuNS0xLjVMNiAxMlY0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNsZWFyIj48cGF0aCBkPSJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNsb3NlIj48cGF0aCBkPSJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNsb3VkIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNsb3VkLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTQuNSAxNEg4Yy0xLjY2IDAtMy0xLjM0LTMtM3MxLjM0LTMgMy0zbC4xNC4wMUM4LjU4IDguMjggMTAuMTMgNyAxMiA3YzIuMjEgMCA0IDEuNzkgNCA0aC41YzEuMzggMCAyLjUgMS4xMiAyLjUgMi41UzE3Ljg4IDE2IDE2LjUgMTZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2xvdWQtZG9uZSI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTAgMTdsLTMuNS0zLjUgMS40MS0xLjQxTDEwIDE0LjE3IDE1LjE4IDlsMS40MSAxLjQxTDEwIDE3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNsb3VkLWRvd25sb2FkIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xNyAxM2wtNSA1LTUtNWgzVjloNHY0aDN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2xvdWQtb2ZmIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDRjLTEuNDggMC0yLjg1LjQzLTQuMDEgMS4xN2wxLjQ2IDEuNDZDMTAuMjEgNi4yMyAxMS4wOCA2IDEyIDZjMy4wNCAwIDUuNSAyLjQ2IDUuNSA1LjV2LjVIMTljMS42NiAwIDMgMS4zNCAzIDMgMCAxLjEzLS42NCAyLjExLTEuNTYgMi42MmwxLjQ1IDEuNDVDMjMuMTYgMTguMTYgMjQgMTYuNjggMjQgMTVjMC0yLjY0LTIuMDUtNC43OC00LjY1LTQuOTZ6TTMgNS4yN2wyLjc1IDIuNzRDMi41NiA4LjE1IDAgMTAuNzcgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxMS43M2wyIDJMMjEgMjAuNzMgNC4yNyA0IDMgNS4yN3pNNy43MyAxMGw4IDhINmMtMi4yMSAwLTQtMS43OS00LTRzMS43OS00IDQtNGgxLjczeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNsb3VkLXF1ZXVlIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xOSAxOEg2Yy0yLjIxIDAtNC0xLjc5LTQtNHMxLjc5LTQgNC00aC43MUM3LjM3IDcuNjkgOS40OCA2IDEyIDZjMy4wNCAwIDUuNSAyLjQ2IDUuNSA1LjV2LjVIMTljMS42NiAwIDMgMS4zNCAzIDNzLTEuMzQgMy0zIDN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2xvdWQtdXBsb2FkIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xNCAxM3Y0aC00di00SDdsNS01IDUgNWgtM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJjb2RlIj48cGF0aCBkPSJNOS40IDE2LjZMNC44IDEybDQuNi00LjZMOCA2bC02IDYgNiA2IDEuNC0xLjR6bTUuMiAwbDQuNi00LjYtNC42LTQuNkwxNiA2bDYgNi02IDYtMS40LTEuNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJjb21wYXJlLWFycm93cyI+PHBhdGggZD0iTTkuMDEgMTRIMnYyaDcuMDF2M0wxMyAxNWwtMy45OS00djN6bTUuOTgtMXYtM0gyMlY4aC03LjAxVjVMMTEgOWwzLjk5IDR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY29udGVudC1jb3B5Ij48cGF0aCBkPSJNMTYgMUg0Yy0xLjEgMC0yIC45LTIgMnYxNGgyVjNoMTJWMXptMyA0SDhjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTFjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnptMCAxNkg4VjdoMTF2MTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY29udGVudC1jdXQiPjxwYXRoIGQ9Ik05LjY0IDcuNjRjLjIzLS41LjM2LTEuMDUuMzYtMS42NCAwLTIuMjEtMS43OS00LTQtNFMyIDMuNzkgMiA2czEuNzkgNCA0IDRjLjU5IDAgMS4xNC0uMTMgMS42NC0uMzZMMTAgMTJsLTIuMzYgMi4zNkM3LjE0IDE0LjEzIDYuNTkgMTQgNiAxNGMtMi4yMSAwLTQgMS43OS00IDRzMS43OSA0IDQgNCA0LTEuNzkgNC00YzAtLjU5LS4xMy0xLjE0LS4zNi0xLjY0TDEyIDE0bDcgN2gzdi0xTDkuNjQgNy42NHpNNiA4Yy0xLjEgMC0yLS44OS0yLTJzLjktMiAyLTIgMiAuODkgMiAyLS45IDItMiAyem0wIDEyYy0xLjEgMC0yLS44OS0yLTJzLjktMiAyLTIgMiAuODkgMiAyLS45IDItMiAyem02LTcuNWMtLjI4IDAtLjUtLjIyLS41LS41cy4yMi0uNS41LS41LjUuMjIuNS41LS4yMi41LS41LjV6TTE5IDNsLTYgNiAyIDIgNy03VjN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY29udGVudC1wYXN0ZSI+PHBhdGggZD0iTTE5IDJoLTQuMThDMTQuNC44NCAxMy4zIDAgMTIgMGMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptNyAxOEg1VjRoMnYzaDEwVjRoMnYxNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjb3B5cmlnaHQiPjxwYXRoIGQ9Ik0xMC4wOCAxMC44NmMuMDUtLjMzLjE2LS42Mi4zLS44N3MuMzQtLjQ2LjU5LS42MmMuMjQtLjE1LjU0LS4yMi45MS0uMjMuMjMuMDEuNDQuMDUuNjMuMTMuMi4wOS4zOC4yMS41Mi4zNnMuMjUuMzMuMzQuNTMuMTMuNDIuMTQuNjRoMS43OWMtLjAyLS40Ny0uMTEtLjktLjI4LTEuMjlzLS40LS43My0uNy0xLjAxLS42Ni0uNS0xLjA4LS42Ni0uODgtLjIzLTEuMzktLjIzYy0uNjUgMC0xLjIyLjExLTEuNy4zNHMtLjg4LjUzLTEuMi45Mi0uNTYuODQtLjcxIDEuMzZTOCAxMS4yOSA4IDExLjg3di4yN2MwIC41OC4wOCAxLjEyLjIzIDEuNjRzLjM5Ljk3LjcxIDEuMzUuNzIuNjkgMS4yLjkxIDEuMDUuMzQgMS43LjM0Yy40NyAwIC45MS0uMDggMS4zMi0uMjNzLjc3LS4zNiAxLjA4LS42My41Ni0uNTguNzQtLjk0LjI5LS43NC4zLTEuMTVoLTEuNzljLS4wMS4yMS0uMDYuNC0uMTUuNThzLS4yMS4zMy0uMzYuNDYtLjMyLjIzLS41Mi4zYy0uMTkuMDctLjM5LjA5LS42LjEtLjM2LS4wMS0uNjYtLjA4LS44OS0uMjMtLjI1LS4xNi0uNDUtLjM3LS41OS0uNjJzLS4yNS0uNTUtLjMtLjg4LS4wOC0uNjctLjA4LTF2LS4yN2MwLS4zNS4wMy0uNjguMDgtMS4wMXpNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY3JlYXRlIj48cGF0aCBkPSJNMyAxNy4yNVYyMWgzLjc1TDE3LjgxIDkuOTRsLTMuNzUtMy43NUwzIDE3LjI1ek0yMC43MSA3LjA0Yy4zOS0uMzkuMzktMS4wMiAwLTEuNDFsLTIuMzQtMi4zNGMtLjM5LS4zOS0xLjAyLS4zOS0xLjQxIDBsLTEuODMgMS44MyAzLjc1IDMuNzUgMS44My0xLjgzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyZWF0ZS1uZXctZm9sZGVyIj48cGF0aCBkPSJNMjAgNmgtOGwtMi0ySDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE4YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjhjMC0xLjExLS44OS0yLTItMnptLTEgOGgtM3YzaC0ydi0zaC0zdi0yaDNWOWgydjNoM3YyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyZWRpdC1jYXJkIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY2YzAtMS4xMS0uODktMi0yLTJ6bTAgMTRINHYtNmgxNnY2em0wLTEwSDRWNmgxNnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImRhc2hib2FyZCI+PHBhdGggZD0iTTMgMTNoOFYzSDN2MTB6bTAgOGg4di02SDN2NnptMTAgMGg4VjExaC04djEwem0wLTE4djZoOFYzaC04eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImRhdGUtcmFuZ2UiPjxwYXRoIGQ9Ik05IDExSDd2Mmgydi0yem00IDBoLTJ2Mmgydi0yem00IDBoLTJ2Mmgydi0yem0yLTdoLTFWMmgtMnYySDhWMkg2djJINWMtMS4xMSAwLTEuOTkuOS0xLjk5IDJMMyAyMGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDE2SDVWOWgxNHYxMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJkZWxldGUiPjxwYXRoIGQ9Ik02IDE5YzAgMS4xLjkgMiAyIDJoOGMxLjEgMCAyLS45IDItMlY3SDZ2MTJ6TTE5IDRoLTMuNWwtMS0xaC01bC0xIDFINXYyaDE0VjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZGVsZXRlLWZvcmV2ZXIiPjxwYXRoIGQ9Ik02IDE5YzAgMS4xLjkgMiAyIDJoOGMxLjEgMCAyLS45IDItMlY3SDZ2MTJ6bTIuNDYtNy4xMmwxLjQxLTEuNDFMMTIgMTIuNTlsMi4xMi0yLjEyIDEuNDEgMS40MUwxMy40MSAxNGwyLjEyIDIuMTItMS40MSAxLjQxTDEyIDE1LjQxbC0yLjEyIDIuMTItMS40MS0xLjQxTDEwLjU5IDE0bC0yLjEzLTIuMTJ6TTE1LjUgNGwtMS0xaC01bC0xIDFINXYyaDE0VjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZGVsZXRlLXN3ZWVwIj48cGF0aCBkPSJNMTUgMTZoNHYyaC00em0wLThoN3YyaC03em0wIDRoNnYyaC02ek0zIDE4YzAgMS4xLjkgMiAyIDJoNmMxLjEgMCAyLS45IDItMlY4SDN2MTB6TTE0IDVoLTNsLTEtMUg2TDUgNUgydjJoMTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZGVzY3JpcHRpb24iPjxwYXRoIGQ9Ik0xNCAySDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAyMGMwIDEuMS44OSAyIDEuOTkgMkgxOGMxLjEgMCAyLS45IDItMlY4bC02LTZ6bTIgMTZIOHYtMmg4djJ6bTAtNEg4di0yaDh2MnptLTMtNVYzLjVMMTguNSA5SDEzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImRucyI+PHBhdGggZD0iTTIwIDEzSDRjLS41NSAwLTEgLjQ1LTEgMXY2YzAgLjU1LjQ1IDEgMSAxaDE2Yy41NSAwIDEtLjQ1IDEtMXYtNmMwLS41NS0uNDUtMS0xLTF6TTcgMTljLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyek0yMCAzSDRjLS41NSAwLTEgLjQ1LTEgMXY2YzAgLjU1LjQ1IDEgMSAxaDE2Yy41NSAwIDEtLjQ1IDEtMVY0YzAtLjU1LS40NS0xLTEtMXpNNyA5Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJkb25lIj48cGF0aCBkPSJNOSAxNi4yTDQuOCAxMmwtMS40IDEuNEw5IDE5IDIxIDdsLTEuNC0xLjRMOSAxNi4yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImRvbmUtYWxsIj48cGF0aCBkPSJNMTggN2wtMS40MS0xLjQxLTYuMzQgNi4zNCAxLjQxIDEuNDFMMTggN3ptNC4yNC0xLjQxTDExLjY2IDE2LjE3IDcuNDggMTJsLTEuNDEgMS40MUwxMS42NiAxOWwxMi0xMi0xLjQyLTEuNDF6TS40MSAxMy40MUw2IDE5bDEuNDEtMS40MUwxLjgzIDEyIC40MSAxMy40MXoiPjwvcGF0aD48L2c+CjxnIGlkPSJkb251dC1sYXJnZSI+PHBhdGggZD0iTTExIDUuMDhWMmMtNSAuNS05IDQuODEtOSAxMHM0IDkuNSA5IDEwdi0zLjA4Yy0zLS40OC02LTMuNC02LTYuOTJzMy02LjQ0IDYtNi45MnpNMTguOTcgMTFIMjJjLS40Ny01LTQtOC41My05LTl2My4wOEMxNiA1LjUxIDE4LjU0IDggMTguOTcgMTF6TTEzIDE4LjkyVjIyYzUtLjQ3IDguNTMtNCA5LTloLTMuMDNjLS40MyAzLTIuOTcgNS40OS01Ljk3IDUuOTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZG9udXQtc21hbGwiPjxwYXRoIGQ9Ik0xMSA5LjE2VjJjLTUgLjUtOSA0Ljc5LTkgMTBzNCA5LjUgOSAxMHYtNy4xNmMtMS0uNDEtMi0xLjUyLTItMi44NHMxLTIuNDMgMi0yLjg0ek0xNC44NiAxMUgyMmMtLjQ4LTQuNzUtNC04LjUzLTktOXY3LjE2YzEgLjMgMS41Mi45OCAxLjg2IDEuODR6TTEzIDE0Ljg0VjIyYzUtLjQ3IDguNTItNC4yNSA5LTloLTcuMTRjLS4zNC44Ni0uODYgMS41NC0xLjg2IDEuODR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZHJhZnRzIj48cGF0aCBkPSJNMjEuOTkgOGMwLS43Mi0uMzctMS4zNS0uOTQtMS43TDEyIDEgMi45NSA2LjNDMi4zOCA2LjY1IDIgNy4yOCAyIDh2MTBjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMmwtLjAxLTEwek0xMiAxM0wzLjc0IDcuODQgMTIgM2w4LjI2IDQuODRMMTIgMTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZWplY3QiPjxwYXRoIGQ9Ik01IDE3aDE0djJINXptNy0xMkw1LjMzIDE1aDEzLjM0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImVycm9yIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMSAxNWgtMnYtMmgydjJ6bTAtNGgtMlY3aDJ2NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJlcnJvci1vdXRsaW5lIj48cGF0aCBkPSJNMTEgMTVoMnYyaC0yem0wLThoMnY2aC0yem0uOTktNUM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnpNMTIgMjBjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImV1cm8tc3ltYm9sIj48cGF0aCBkPSJNMTUgMTguNWMtMi41MSAwLTQuNjgtMS40Mi01Ljc2LTMuNUgxNXYtMkg4LjU4Yy0uMDUtLjMzLS4wOC0uNjYtLjA4LTFzLjAzLS42Ny4wOC0xSDE1VjlIOS4yNEMxMC4zMiA2LjkyIDEyLjUgNS41IDE1IDUuNWMxLjYxIDAgMy4wOS41OSA0LjIzIDEuNTdMMjEgNS4zQzE5LjQxIDMuODcgMTcuMyAzIDE1IDNjLTMuOTIgMC03LjI0IDIuNTEtOC40OCA2SDN2MmgzLjA2Yy0uMDQuMzMtLjA2LjY2LS4wNiAxIDAgLjM0LjAyLjY3LjA2IDFIM3YyaDMuNTJjMS4yNCAzLjQ5IDQuNTYgNiA4LjQ4IDYgMi4zMSAwIDQuNDEtLjg3IDYtMi4zbC0xLjc4LTEuNzdjLTEuMTMuOTgtMi42IDEuNTctNC4yMiAxLjU3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImV2ZW50Ij48cGF0aCBkPSJNMTcgMTJoLTV2NWg1di01ek0xNiAxdjJIOFYxSDZ2Mkg1Yy0xLjExIDAtMS45OS45LTEuOTkgMkwzIDE5YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJoLTFWMWgtMnptMyAxOEg1VjhoMTR2MTF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXZlbnQtc2VhdCI+PHBhdGggZD0iTTQgMTh2M2gzdi0zaDEwdjNoM3YtNkg0em0xNS04aDN2M2gtM3pNMiAxMGgzdjNIMnptMTUgM0g3VjVjMC0xLjEuOS0yIDItMmg2YzEuMSAwIDIgLjkgMiAydjh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXhpdC10by1hcHAiPjxwYXRoIGQ9Ik0xMC4wOSAxNS41OUwxMS41IDE3bDUtNS01LTUtMS40MSAxLjQxTDEyLjY3IDExSDN2Mmg5LjY3bC0yLjU4IDIuNTl6TTE5IDNINWMtMS4xMSAwLTIgLjktMiAydjRoMlY1aDE0djE0SDV2LTRIM3Y0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXhwYW5kLWxlc3MiPjxwYXRoIGQ9Ik0xMiA4bC02IDYgMS40MSAxLjQxTDEyIDEwLjgzbDQuNTkgNC41OEwxOCAxNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJleHBhbmQtbW9yZSI+PHBhdGggZD0iTTE2LjU5IDguNTlMMTIgMTMuMTcgNy40MSA4LjU5IDYgMTBsNiA2IDYtNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJleHBsb3JlIj48cGF0aCBkPSJNMTIgMTAuOWMtLjYxIDAtMS4xLjQ5LTEuMSAxLjFzLjQ5IDEuMSAxLjEgMS4xYy42MSAwIDEuMS0uNDkgMS4xLTEuMXMtLjQ5LTEuMS0xLjEtMS4xek0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0yLjE5IDEyLjE5TDYgMThsMy44MS04LjE5TDE4IDZsLTMuODEgOC4xOXoiPjwvcGF0aD48L2c+CjxnIGlkPSJleHRlbnNpb24iPjxwYXRoIGQ9Ik0yMC41IDExSDE5VjdjMC0xLjEtLjktMi0yLTJoLTRWMy41QzEzIDIuMTIgMTEuODggMSAxMC41IDFTOCAyLjEyIDggMy41VjVINGMtMS4xIDAtMS45OS45LTEuOTkgMnYzLjhIMy41YzEuNDkgMCAyLjcgMS4yMSAyLjcgMi43cy0xLjIxIDIuNy0yLjcgMi43SDJWMjBjMCAxLjEuOSAyIDIgMmgzLjh2LTEuNWMwLTEuNDkgMS4yMS0yLjcgMi43LTIuNyAxLjQ5IDAgMi43IDEuMjEgMi43IDIuN1YyMkgxN2MxLjEgMCAyLS45IDItMnYtNGgxLjVjMS4zOCAwIDIuNS0xLjEyIDIuNS0yLjVTMjEuODggMTEgMjAuNSAxMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJmYWNlIj48cGF0aCBkPSJNOSAxMS43NWMtLjY5IDAtMS4yNS41Ni0xLjI1IDEuMjVzLjU2IDEuMjUgMS4yNSAxLjI1IDEuMjUtLjU2IDEuMjUtMS4yNS0uNTYtMS4yNS0xLjI1LTEuMjV6bTYgMGMtLjY5IDAtMS4yNS41Ni0xLjI1IDEuMjVzLjU2IDEuMjUgMS4yNSAxLjI1IDEuMjUtLjU2IDEuMjUtMS4yNS0uNTYtMS4yNS0xLjI1LTEuMjV6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04IDAtLjI5LjAyLS41OC4wNS0uODYgMi4zNi0xLjA1IDQuMjMtMi45OCA1LjIxLTUuMzdDMTEuMDcgOC4zMyAxNC4wNSAxMCAxNy40MiAxMGMuNzggMCAxLjUzLS4wOSAyLjI1LS4yNi4yMS43MS4zMyAxLjQ3LjMzIDIuMjYgMCA0LjQxLTMuNTkgOC04IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmF2b3JpdGUiPjxwYXRoIGQ9Ik0xMiAyMS4zNWwtMS40NS0xLjMyQzUuNCAxNS4zNiAyIDEyLjI4IDIgOC41IDIgNS40MiA0LjQyIDMgNy41IDNjMS43NCAwIDMuNDEuODEgNC41IDIuMDlDMTMuMDkgMy44MSAxNC43NiAzIDE2LjUgMyAxOS41OCAzIDIyIDUuNDIgMjIgOC41YzAgMy43OC0zLjQgNi44Ni04LjU1IDExLjU0TDEyIDIxLjM1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZhdm9yaXRlLWJvcmRlciI+PHBhdGggZD0iTTE2LjUgM2MtMS43NCAwLTMuNDEuODEtNC41IDIuMDlDMTAuOTEgMy44MSA5LjI0IDMgNy41IDMgNC40MiAzIDIgNS40MiAyIDguNWMwIDMuNzggMy40IDYuODYgOC41NSAxMS41NEwxMiAyMS4zNWwxLjQ1LTEuMzJDMTguNiAxNS4zNiAyMiAxMi4yOCAyMiA4LjUgMjIgNS40MiAxOS41OCAzIDE2LjUgM3ptLTQuNCAxNS41NWwtLjEuMS0uMS0uMUM3LjE0IDE0LjI0IDQgMTEuMzkgNCA4LjUgNCA2LjUgNS41IDUgNy41IDVjMS41NCAwIDMuMDQuOTkgMy41NyAyLjM2aDEuODdDMTMuNDYgNS45OSAxNC45NiA1IDE2LjUgNWMyIDAgMy41IDEuNSAzLjUgMy41IDAgMi44OS0zLjE0IDUuNzQtNy45IDEwLjA1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZlZWRiYWNrIj48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDEyaC0ydi0yaDJ2MnptMC00aC0yVjZoMnY0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbGUtZG93bmxvYWQiPjxwYXRoIGQ9Ik0xOSA5aC00VjNIOXY2SDVsNyA3IDctN3pNNSAxOHYyaDE0di0ySDV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsZS11cGxvYWQiPjxwYXRoIGQ9Ik05IDE2aDZ2LTZoNGwtNy03LTcgN2g0em0tNCAyaDE0djJINXoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXItbGlzdCI+PHBhdGggZD0iTTEwIDE4aDR2LTJoLTR2MnpNMyA2djJoMThWNkgzem0zIDdoMTJ2LTJINnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbmQtaW4tcGFnZSI+PHBhdGggZD0iTTIwIDE5LjU5VjhsLTYtNkg2Yy0xLjEgMC0xLjk5LjktMS45OSAyTDQgMjBjMCAxLjEuODkgMiAxLjk5IDJIMThjLjQ1IDAgLjg1LS4xNSAxLjE5LS40bC00LjQzLTQuNDNjLS44LjUyLTEuNzQuODMtMi43Ni44My0yLjc2IDAtNS0yLjI0LTUtNXMyLjI0LTUgNS01IDUgMi4yNCA1IDVjMCAxLjAyLS4zMSAxLjk2LS44MyAyLjc1TDIwIDE5LjU5ek05IDEzYzAgMS42NiAxLjM0IDMgMyAzczMtMS4zNCAzLTMtMS4zNC0zLTMtMy0zIDEuMzQtMyAzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbmQtcmVwbGFjZSI+PHBhdGggZD0iTTExIDZjMS4zOCAwIDIuNjMuNTYgMy41NCAxLjQ2TDEyIDEwaDZWNGwtMi4wNSAyLjA1QzE0LjY4IDQuNzggMTIuOTMgNCAxMSA0Yy0zLjUzIDAtNi40MyAyLjYxLTYuOTIgNkg2LjFjLjQ2LTIuMjggMi40OC00IDQuOS00em01LjY0IDkuMTRjLjY2LS45IDEuMTItMS45NyAxLjI4LTMuMTRIMTUuOWMtLjQ2IDIuMjgtMi40OCA0LTQuOSA0LTEuMzggMC0yLjYzLS41Ni0zLjU0LTEuNDZMMTAgMTJINHY2bDIuMDUtMi4wNUM3LjMyIDE3LjIyIDkuMDcgMTggMTEgMThjMS41NSAwIDIuOTgtLjUxIDQuMTQtMS4zNkwyMCAyMS40OSAyMS40OSAyMGwtNC44NS00Ljg2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbmdlcnByaW50Ij48cGF0aCBkPSJNMTcuODEgNC40N2MtLjA4IDAtLjE2LS4wMi0uMjMtLjA2QzE1LjY2IDMuNDIgMTQgMyAxMi4wMSAzYy0xLjk4IDAtMy44Ni40Ny01LjU3IDEuNDEtLjI0LjEzLS41NC4wNC0uNjgtLjItLjEzLS4yNC0uMDQtLjU1LjItLjY4QzcuODIgMi41MiA5Ljg2IDIgMTIuMDEgMmMyLjEzIDAgMy45OS40NyA2LjAzIDEuNTIuMjUuMTMuMzQuNDMuMjEuNjctLjA5LjE4LS4yNi4yOC0uNDQuMjh6TTMuNSA5LjcyYy0uMSAwLS4yLS4wMy0uMjktLjA5LS4yMy0uMTYtLjI4LS40Ny0uMTItLjcuOTktMS40IDIuMjUtMi41IDMuNzUtMy4yN0M5Ljk4IDQuMDQgMTQgNC4wMyAxNy4xNSA1LjY1YzEuNS43NyAyLjc2IDEuODYgMy43NSAzLjI1LjE2LjIyLjExLjU0LS4xMi43LS4yMy4xNi0uNTQuMTEtLjctLjEyLS45LTEuMjYtMi4wNC0yLjI1LTMuMzktMi45NC0yLjg3LTEuNDctNi41NC0xLjQ3LTkuNC4wMS0xLjM2LjctMi41IDEuNy0zLjQgMi45Ni0uMDguMTQtLjIzLjIxLS4zOS4yMXptNi4yNSAxMi4wN2MtLjEzIDAtLjI2LS4wNS0uMzUtLjE1LS44Ny0uODctMS4zNC0xLjQzLTIuMDEtMi42NC0uNjktMS4yMy0xLjA1LTIuNzMtMS4wNS00LjM0IDAtMi45NyAyLjU0LTUuMzkgNS42Ni01LjM5czUuNjYgMi40MiA1LjY2IDUuMzljMCAuMjgtLjIyLjUtLjUuNXMtLjUtLjIyLS41LS41YzAtMi40Mi0yLjA5LTQuMzktNC42Ni00LjM5LTIuNTcgMC00LjY2IDEuOTctNC42NiA0LjM5IDAgMS40NC4zMiAyLjc3LjkzIDMuODUuNjQgMS4xNSAxLjA4IDEuNjQgMS44NSAyLjQyLjE5LjIuMTkuNTEgMCAuNzEtLjExLjEtLjI0LjE1LS4zNy4xNXptNy4xNy0xLjg1Yy0xLjE5IDAtMi4yNC0uMy0zLjEtLjg5LTEuNDktMS4wMS0yLjM4LTIuNjUtMi4zOC00LjM5IDAtLjI4LjIyLS41LjUtLjVzLjUuMjIuNS41YzAgMS40MS43MiAyLjc0IDEuOTQgMy41Ni43MS40OCAxLjU0LjcxIDIuNTQuNzEuMjQgMCAuNjQtLjAzIDEuMDQtLjEuMjctLjA1LjUzLjEzLjU4LjQxLjA1LjI3LS4xMy41My0uNDEuNTgtLjU3LjExLTEuMDcuMTItMS4yMS4xMnpNMTQuOTEgMjJjLS4wNCAwLS4wOS0uMDEtLjEzLS4wMi0xLjU5LS40NC0yLjYzLTEuMDMtMy43Mi0yLjEtMS40LTEuMzktMi4xNy0zLjI0LTIuMTctNS4yMiAwLTEuNjIgMS4zOC0yLjk0IDMuMDgtMi45NCAxLjcgMCAzLjA4IDEuMzIgMy4wOCAyLjk0IDAgMS4wNy45MyAxLjk0IDIuMDggMS45NHMyLjA4LS44NyAyLjA4LTEuOTRjMC0zLjc3LTMuMjUtNi44My03LjI1LTYuODMtMi44NCAwLTUuNDQgMS41OC02LjYxIDQuMDMtLjM5LjgxLS41OSAxLjc2LS41OSAyLjggMCAuNzguMDcgMi4wMS42NyAzLjYxLjEuMjYtLjAzLjU1LS4yOS42NC0uMjYuMS0uNTUtLjA0LS42NC0uMjktLjQ5LTEuMzEtLjczLTIuNjEtLjczLTMuOTYgMC0xLjIuMjMtMi4yOS42OC0zLjI0IDEuMzMtMi43OSA0LjI4LTQuNiA3LjUxLTQuNiA0LjU1IDAgOC4yNSAzLjUxIDguMjUgNy44MyAwIDEuNjItMS4zOCAyLjk0LTMuMDggMi45NHMtMy4wOC0xLjMyLTMuMDgtMi45NGMwLTEuMDctLjkzLTEuOTQtMi4wOC0xLjk0cy0yLjA4Ljg3LTIuMDggMS45NGMwIDEuNzEuNjYgMy4zMSAxLjg3IDQuNTEuOTUuOTQgMS44NiAxLjQ2IDMuMjcgMS44NS4yNy4wNy40Mi4zNS4zNS42MS0uMDUuMjMtLjI2LjM4LS40Ny4zOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaXJzdC1wYWdlIj48cGF0aCBkPSJNMTguNDEgMTYuNTlMMTMuODIgMTJsNC41OS00LjU5TDE3IDZsLTYgNiA2IDZ6TTYgNmgydjEySDZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmxhZyI+PHBhdGggZD0iTTE0LjQgNkwxNCA0SDV2MTdoMnYtN2g1LjZsLjQgMmg3VjZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmxpZ2h0LWxhbmQiPjxwYXRoIGQ9Ik0yLjUgMTloMTl2MmgtMTl6bTcuMTgtNS43M2w0LjM1IDEuMTYgNS4zMSAxLjQyYy44LjIxIDEuNjItLjI2IDEuODQtMS4wNi4yMS0uOC0uMjYtMS42Mi0xLjA2LTEuODRsLTUuMzEtMS40Mi0yLjc2LTkuMDJMMTAuMTIgMnY4LjI4TDUuMTUgOC45NWwtLjkzLTIuMzItMS40NS0uMzl2NS4xN2wxLjYuNDMgNS4zMSAxLjQzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZsaWdodC10YWtlb2ZmIj48cGF0aCBkPSJNMi41IDE5aDE5djJoLTE5em0xOS41Ny05LjM2Yy0uMjEtLjgtMS4wNC0xLjI4LTEuODQtMS4wNkwxNC45MiAxMGwtNi45LTYuNDMtMS45My41MSA0LjE0IDcuMTctNC45NyAxLjMzLTEuOTctMS41NC0xLjQ1LjM5IDEuODIgMy4xNi43NyAxLjMzIDEuNi0uNDMgNS4zMS0xLjQyIDQuMzUtMS4xNkwyMSAxMS40OWMuODEtLjIzIDEuMjgtMS4wNSAxLjA3LTEuODV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmxpcC10by1iYWNrIj48cGF0aCBkPSJNOSA3SDd2MmgyVjd6bTAgNEg3djJoMnYtMnptMC04Yy0xLjExIDAtMiAuOS0yIDJoMlYzem00IDEyaC0ydjJoMnYtMnptNi0xMnYyaDJjMC0xLjEtLjktMi0yLTJ6bS02IDBoLTJ2MmgyVjN6TTkgMTd2LTJIN2MwIDEuMS44OSAyIDIgMnptMTAtNGgydi0yaC0ydjJ6bTAtNGgyVjdoLTJ2MnptMCA4YzEuMSAwIDItLjkgMi0yaC0ydjJ6TTUgN0gzdjEyYzAgMS4xLjg5IDIgMiAyaDEydi0ySDVWN3ptMTAtMmgyVjNoLTJ2MnptMCAxMmgydi0yaC0ydjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmxpcC10by1mcm9udCI+PHBhdGggZD0iTTMgMTNoMnYtMkgzdjJ6bTAgNGgydi0ySDN2MnptMiA0di0ySDNjMCAxLjEuODkgMiAyIDJ6TTMgOWgyVjdIM3Yyem0xMiAxMmgydi0yaC0ydjJ6bTQtMThIOWMtMS4xMSAwLTIgLjktMiAydjEwYzAgMS4xLjg5IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTJIOVY1aDEwdjEwem0tOCA2aDJ2LTJoLTJ2MnptLTQgMGgydi0ySDd2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmb2xkZXIiPjxwYXRoIGQ9Ik0xMCA0SDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJoLThsLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmb2xkZXItb3BlbiI+PHBhdGggZD0iTTIwIDZoLThsLTItMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yem0wIDEySDRWOGgxNnYxMHoiPjwvcGF0aD48L2c+CjxnIGlkPSJmb2xkZXItc2hhcmVkIj48cGF0aCBkPSJNMjAgNmgtOGwtMi0ySDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bS01IDNjMS4xIDAgMiAuOSAyIDJzLS45IDItMiAyLTItLjktMi0yIC45LTIgMi0yem00IDhoLTh2LTFjMC0xLjMzIDIuNjctMiA0LTJzNCAuNjcgNCAydjF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZm9udC1kb3dubG9hZCI+PHBhdGggZD0iTTkuOTMgMTMuNWg0LjE0TDEyIDcuOTh6TTIwIDJINGMtMS4xIDAtMiAuOS0yIDJ2MTZjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tNC4wNSAxNi41bC0xLjE0LTNIOS4xN2wtMS4xMiAzSDUuOTZsNS4xMS0xM2gxLjg2bDUuMTEgMTNoLTIuMDl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZm9yd2FyZCI+PHBhdGggZD0iTTEyIDhWNGw4IDgtOCA4di00SDRWOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJmdWxsc2NyZWVuIj48cGF0aCBkPSJNNyAxNEg1djVoNXYtMkg3di0zem0tMi00aDJWN2gzVjVINXY1em0xMiA3aC0zdjJoNXYtNWgtMnYzek0xNCA1djJoM3YzaDJWNWgtNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJmdWxsc2NyZWVuLWV4aXQiPjxwYXRoIGQ9Ik01IDE2aDN2M2gydi01SDV2MnptMy04SDV2Mmg1VjVIOHYzem02IDExaDJ2LTNoM3YtMmgtNXY1em0yLTExVjVoLTJ2NWg1VjhoLTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZy10cmFuc2xhdGUiPjxwYXRoIGQ9Ik0yMCA1aC05LjEyTDEwIDJINGMtMS4xIDAtMiAuOS0yIDJ2MTNjMCAxLjEuOSAyIDIgMmg3bDEgM2g4YzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6TTcuMTcgMTQuNTljLTIuMjUgMC00LjA5LTEuODMtNC4wOS00LjA5czEuODMtNC4wOSA0LjA5LTQuMDljMS4wNCAwIDEuOTkuMzcgMi43NCAxLjA3bC4wNy4wNi0xLjIzIDEuMTgtLjA2LS4wNWMtLjI5LS4yNy0uNzgtLjU5LTEuNTItLjU5LTEuMzEgMC0yLjM4IDEuMDktMi4zOCAyLjQyczEuMDcgMi40MiAyLjM4IDIuNDJjMS4zNyAwIDEuOTYtLjg3IDIuMTItMS40Nkg3LjA4VjkuOTFoMy45NWwuMDEuMDdjLjA0LjIxLjA1LjQuMDUuNjEgMCAyLjM1LTEuNjEgNC0zLjkyIDR6bTYuMDMtMS43MWMuMzMuNi43NCAxLjE4IDEuMTkgMS43bC0uNTQuNTMtLjY1LTIuMjN6bS43Ny0uNzZoLS45OWwtLjMxLTEuMDRoMy45OXMtLjM0IDEuMzEtMS41NiAyLjc0Yy0uNTItLjYyLS44OS0xLjIzLTEuMTMtMS43ek0yMSAyMGMwIC41NS0uNDUgMS0xIDFoLTdsMi0yLS44MS0yLjc3LjkyLS45MkwxNy43OSAxOGwuNzMtLjczLTIuNzEtMi42OGMuOS0xLjAzIDEuNi0yLjI1IDEuOTItMy41MUgxOXYtMS4wNGgtMy42NFY5aC0xLjA0djEuMDRoLTEuOTZMMTEuMTggNkgyMGMuNTUgMCAxIC40NSAxIDF2MTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZ2F2ZWwiPjxwYXRoIGQ9Ik0xIDIxaDEydjJIMXpNNS4yNDUgOC4wN2wyLjgzLTIuODI3IDE0LjE0IDE0LjE0Mi0yLjgyOCAyLjgyOHpNMTIuMzE3IDFsNS42NTcgNS42NTYtMi44MyAyLjgzLTUuNjU0LTUuNjZ6TTMuODI1IDkuNDg1bDUuNjU3IDUuNjU3LTIuODI4IDIuODI4LTUuNjU3LTUuNjU3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imdlc3R1cmUiPjxwYXRoIGQ9Ik00LjU5IDYuODljLjctLjcxIDEuNC0xLjM1IDEuNzEtMS4yMi41LjIgMCAxLjAzLS4zIDEuNTItLjI1LjQyLTIuODYgMy44OS0yLjg2IDYuMzEgMCAxLjI4LjQ4IDIuMzQgMS4zNCAyLjk4Ljc1LjU2IDEuNzQuNzMgMi42NC40NiAxLjA3LS4zMSAxLjk1LTEuNCAzLjA2LTIuNzcgMS4yMS0xLjQ5IDIuODMtMy40NCA0LjA4LTMuNDQgMS42MyAwIDEuNjUgMS4wMSAxLjc2IDEuNzktMy43OC42NC01LjM4IDMuNjctNS4zOCA1LjM3IDAgMS43IDEuNDQgMy4wOSAzLjIxIDMuMDkgMS42MyAwIDQuMjktMS4zMyA0LjY5LTYuMUgyMXYtMi41aC0yLjQ3Yy0uMTUtMS42NS0xLjA5LTQuMi00LjAzLTQuMi0yLjI1IDAtNC4xOCAxLjkxLTQuOTQgMi44NC0uNTguNzMtMi4wNiAyLjQ4LTIuMjkgMi43Mi0uMjUuMy0uNjguODQtMS4xMS44NC0uNDUgMC0uNzItLjgzLS4zNi0xLjkyLjM1LTEuMDkgMS40LTIuODYgMS44NS0zLjUyLjc4LTEuMTQgMS4zLTEuOTIgMS4zLTMuMjhDOC45NSAzLjY5IDcuMzEgMyA2LjQ0IDMgNS4xMiAzIDMuOTcgNCAzLjcyIDQuMjVjLS4zNi4zNi0uNjYuNjYtLjg4LjkzbDEuNzUgMS43MXptOS4yOSAxMS42NmMtLjMxIDAtLjc0LS4yNi0uNzQtLjcyIDAtLjYuNzMtMi4yIDIuODctMi43Ni0uMyAyLjY5LTEuNDMgMy40OC0yLjEzIDMuNDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZ2V0LWFwcCI+PHBhdGggZD0iTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXoiPjwvcGF0aD48L2c+CjxnIGlkPSJnaWYiPjxwYXRoIGQ9Ik0xMS41IDlIMTN2NmgtMS41ek05IDlINmMtLjYgMC0xIC41LTEgMXY0YzAgLjUuNCAxIDEgMWgzYy42IDAgMS0uNSAxLTF2LTJIOC41djEuNWgtMnYtM0gxMFYxMGMwLS41LS40LTEtMS0xem0xMCAxLjVWOWgtNC41djZIMTZ2LTJoMnYtMS41aC0ydi0xeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImdyYWRlIj48cGF0aCBkPSJNMTIgMTcuMjdMMTguMTggMjFsLTEuNjQtNy4wM0wyMiA5LjI0bC03LjE5LS42MUwxMiAyIDkuMTkgOC42MyAyIDkuMjRsNS40NiA0LjczTDUuODIgMjF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZ3JvdXAtd29yayI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6TTggMTcuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6TTkuNSA4YzAtMS4zOCAxLjEyLTIuNSAyLjUtMi41czIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNVM5LjUgOS4zOCA5LjUgOHptNi41IDkuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaGVscCI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTEgMTdoLTJ2LTJoMnYyem0yLjA3LTcuNzVsLS45LjkyQzEzLjQ1IDEyLjkgMTMgMTMuNSAxMyAxNWgtMnYtLjVjMC0xLjEuNDUtMi4xIDEuMTctMi44M2wxLjI0LTEuMjZjLjM3LS4zNi41OS0uODYuNTktMS40MSAwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDJIOGMwLTIuMjEgMS43OS00IDQtNHM0IDEuNzkgNCA0YzAgLjg4LS4zNiAxLjY4LS45MyAyLjI1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImhlbHAtb3V0bGluZSI+PHBhdGggZD0iTTExIDE4aDJ2LTJoLTJ2MnptMS0xNkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6bTAtMTRjLTIuMjEgMC00IDEuNzktNCA0aDJjMC0xLjEuOS0yIDItMnMyIC45IDIgMmMwIDItMyAxLjc1LTMgNWgyYzAtMi4yNSAzLTIuNSAzLTUgMC0yLjIxLTEuNzktNC00LTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaGlnaGxpZ2h0LW9mZiI+PHBhdGggZD0iTTE0LjU5IDhMMTIgMTAuNTkgOS40MSA4IDggOS40MSAxMC41OSAxMiA4IDE0LjU5IDkuNDEgMTYgMTIgMTMuNDEgMTQuNTkgMTYgMTYgMTQuNTkgMTMuNDEgMTIgMTYgOS40MSAxNC41OSA4ek0xMiAyQzYuNDcgMiAyIDYuNDcgMiAxMnM0LjQ3IDEwIDEwIDEwIDEwLTQuNDcgMTAtMTBTMTcuNTMgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJoaXN0b3J5Ij48cGF0aCBkPSJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImhvbWUiPjxwYXRoIGQ9Ik0xMCAyMHYtNmg0djZoNXYtOGgzTDEyIDMgMiAxMmgzdjh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaG91cmdsYXNzLWVtcHR5Ij48cGF0aCBkPSJNNiAydjZoLjAxTDYgOC4wMSAxMCAxMmwtNCA0IC4wMS4wMUg2VjIyaDEydi01Ljk5aC0uMDFMMTggMTZsLTQtNCA0LTMuOTktLjAxLS4wMUgxOFYySDZ6bTEwIDE0LjVWMjBIOHYtMy41bDQtNCA0IDR6bS00LTVsLTQtNFY0aDh2My41bC00IDR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaG91cmdsYXNzLWZ1bGwiPjxwYXRoIGQ9Ik02IDJ2NmguMDFMNiA4LjAxIDEwIDEybC00IDQgLjAxLjAxSDZWMjJoMTJ2LTUuOTloLS4wMUwxOCAxNmwtNC00IDQtMy45OS0uMDEtLjAxSDE4VjJINnoiPjwvcGF0aD48L2c+CjxnIGlkPSJodHRwIj48cGF0aCBkPSJNNC41IDExaC0yVjlIMXY2aDEuNXYtMi41aDJWMTVINlY5SDQuNXYyem0yLjUtLjVoMS41VjE1SDEwdi00LjVoMS41VjlIN3YxLjV6bTUuNSAwSDE0VjE1aDEuNXYtNC41SDE3VjloLTQuNXYxLjV6bTktMS41SDE4djZoMS41di0yaDJjLjggMCAxLjUtLjcgMS41LTEuNXYtMWMwLS44LS43LTEuNS0xLjUtMS41em0wIDIuNWgtMnYtMWgydjF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaHR0cHMiPjxwYXRoIGQ9Ik0xOCA4aC0xVjZjMC0yLjc2LTIuMjQtNS01LTVTNyAzLjI0IDcgNnYySDZjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWMTBjMC0xLjEtLjktMi0yLTJ6bS02IDljLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyem0zLjEtOUg4LjlWNmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMSAxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImltcG9ydGFudC1kZXZpY2VzIj48cGF0aCBkPSJNMjMgMTEuMDFMMTggMTFjLS41NSAwLTEgLjQ1LTEgMXY5YzAgLjU1LjQ1IDEgMSAxaDVjLjU1IDAgMS0uNDUgMS0xdi05YzAtLjU1LS40NS0uOTktMS0uOTl6TTIzIDIwaC01di03aDV2N3pNMjAgMkgyQy44OSAyIDAgMi44OSAwIDR2MTJjMCAxLjEuODkgMiAyIDJoN3YySDd2Mmg4di0yaC0ydi0yaDJ2LTJIMlY0aDE4djVoMlY0YzAtMS4xMS0uOS0yLTItMnptLTguMDMgN0wxMSA2bC0uOTcgM0g3bDIuNDcgMS43Ni0uOTQgMi45MSAyLjQ3LTEuOCAyLjQ3IDEuOC0uOTQtMi45MUwxNSA5aC0zLjAzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImluYm94Ij48cGF0aCBkPSJNMTkgM0g0Ljk5Yy0xLjExIDAtMS45OC44OS0xLjk4IDJMMyAxOWMwIDEuMS44OCAyIDEuOTkgMkgxOWMxLjEgMCAyLS45IDItMlY1YzAtMS4xMS0uOS0yLTItMnptMCAxMmgtNGMwIDEuNjYtMS4zNSAzLTMgM3MtMy0xLjM0LTMtM0g0Ljk5VjVIMTl2MTB6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaW5kZXRlcm1pbmF0ZS1jaGVjay1ib3giPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTIgMTBIN3YtMmgxMHYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImluZm8iPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE1aC0ydi02aDJ2NnptMC04aC0yVjdoMnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImluZm8tb3V0bGluZSI+PHBhdGggZD0iTTExIDE3aDJ2LTZoLTJ2NnptMS0xNUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6TTExIDloMlY3aC0ydjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaW5wdXQiPjxwYXRoIGQ9Ik0yMSAzLjAxSDNjLTEuMSAwLTIgLjktMiAyVjloMlY0Ljk5aDE4djE0LjAzSDNWMTVIMXY0LjAxYzAgMS4xLjkgMS45OCAyIDEuOThoMThjMS4xIDAgMi0uODggMi0xLjk4di0xNGMwLTEuMTEtLjktMi0yLTJ6TTExIDE2bDQtNC00LTR2M0gxdjJoMTB2M3oiPjwvcGF0aD48L2c+CjxnIGlkPSJpbnZlcnQtY29sb3JzIj48cGF0aCBkPSJNMTcuNjYgNy45M0wxMiAyLjI3IDYuMzQgNy45M2MtMy4xMiAzLjEyLTMuMTIgOC4xOSAwIDExLjMxQzcuOSAyMC44IDkuOTUgMjEuNTggMTIgMjEuNThjMi4wNSAwIDQuMS0uNzggNS42Ni0yLjM0IDMuMTItMy4xMiAzLjEyLTguMTkgMC0xMS4zMXpNMTIgMTkuNTljLTEuNiAwLTMuMTEtLjYyLTQuMjQtMS43NkM2LjYyIDE2LjY5IDYgMTUuMTkgNiAxMy41OXMuNjItMy4xMSAxLjc2LTQuMjRMMTIgNS4xdjE0LjQ5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImxhYmVsIj48cGF0aCBkPSJNMTcuNjMgNS44NEMxNy4yNyA1LjMzIDE2LjY3IDUgMTYgNUw1IDUuMDFDMy45IDUuMDEgMyA1LjkgMyA3djEwYzAgMS4xLjkgMS45OSAyIDEuOTlMMTYgMTljLjY3IDAgMS4yNy0uMzMgMS42My0uODRMMjIgMTJsLTQuMzctNi4xNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJsYWJlbC1vdXRsaW5lIj48cGF0aCBkPSJNMTcuNjMgNS44NEMxNy4yNyA1LjMzIDE2LjY3IDUgMTYgNUw1IDUuMDFDMy45IDUuMDEgMyA1LjkgMyA3djEwYzAgMS4xLjkgMS45OSAyIDEuOTlMMTYgMTljLjY3IDAgMS4yNy0uMzMgMS42My0uODRMMjIgMTJsLTQuMzctNi4xNnpNMTYgMTdINVY3aDExbDMuNTUgNUwxNiAxN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJsYW5ndWFnZSI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6bTYuOTMgNmgtMi45NWMtLjMyLTEuMjUtLjc4LTIuNDUtMS4zOC0zLjU2IDEuODQuNjMgMy4zNyAxLjkxIDQuMzMgMy41NnpNMTIgNC4wNGMuODMgMS4yIDEuNDggMi41MyAxLjkxIDMuOTZoLTMuODJjLjQzLTEuNDMgMS4wOC0yLjc2IDEuOTEtMy45NnpNNC4yNiAxNEM0LjEgMTMuMzYgNCAxMi42OSA0IDEycy4xLTEuMzYuMjYtMmgzLjM4Yy0uMDguNjYtLjE0IDEuMzItLjE0IDIgMCAuNjguMDYgMS4zNC4xNCAySDQuMjZ6bS44MiAyaDIuOTVjLjMyIDEuMjUuNzggMi40NSAxLjM4IDMuNTYtMS44NC0uNjMtMy4zNy0xLjktNC4zMy0zLjU2em0yLjk1LThINS4wOGMuOTYtMS42NiAyLjQ5LTIuOTMgNC4zMy0zLjU2QzguODEgNS41NSA4LjM1IDYuNzUgOC4wMyA4ek0xMiAxOS45NmMtLjgzLTEuMi0xLjQ4LTIuNTMtMS45MS0zLjk2aDMuODJjLS40MyAxLjQzLTEuMDggMi43Ni0xLjkxIDMuOTZ6TTE0LjM0IDE0SDkuNjZjLS4wOS0uNjYtLjE2LTEuMzItLjE2LTIgMC0uNjguMDctMS4zNS4xNi0yaDQuNjhjLjA5LjY1LjE2IDEuMzIuMTYgMiAwIC42OC0uMDcgMS4zNC0uMTYgMnptLjI1IDUuNTZjLjYtMS4xMSAxLjA2LTIuMzEgMS4zOC0zLjU2aDIuOTVjLS45NiAxLjY1LTIuNDkgMi45My00LjMzIDMuNTZ6TTE2LjM2IDE0Yy4wOC0uNjYuMTQtMS4zMi4xNC0yIDAtLjY4LS4wNi0xLjM0LS4xNC0yaDMuMzhjLjE2LjY0LjI2IDEuMzEuMjYgMnMtLjEgMS4zNi0uMjYgMmgtMy4zOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJsYXN0LXBhZ2UiPjxwYXRoIGQ9Ik01LjU5IDcuNDFMMTAuMTggMTJsLTQuNTkgNC41OUw3IDE4bDYtNi02LTZ6TTE2IDZoMnYxMmgtMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJsYXVuY2giPjxwYXRoIGQ9Ik0xOSAxOUg1VjVoN1YzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnYtN2gtMnY3ek0xNCAzdjJoMy41OWwtOS44MyA5LjgzIDEuNDEgMS40MUwxOSA2LjQxVjEwaDJWM2gtN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJsaWdodGJ1bGItb3V0bGluZSI+PHBhdGggZD0iTTkgMjFjMCAuNTUuNDUgMSAxIDFoNGMuNTUgMCAxLS40NSAxLTF2LTFIOXYxem0zLTE5QzguMTQgMiA1IDUuMTQgNSA5YzAgMi4zOCAxLjE5IDQuNDcgMyA1Ljc0VjE3YzAgLjU1LjQ1IDEgMSAxaDZjLjU1IDAgMS0uNDUgMS0xdi0yLjI2YzEuODEtMS4yNyAzLTMuMzYgMy01Ljc0IDAtMy44Ni0zLjE0LTctNy03em0yLjg1IDExLjFsLS44NS42VjE2aC00di0yLjNsLS44NS0uNkM3LjggMTIuMTYgNyAxMC42MyA3IDljMC0yLjc2IDIuMjQtNSA1LTVzNSAyLjI0IDUgNWMwIDEuNjMtLjggMy4xNi0yLjE1IDQuMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJsaW5lLXN0eWxlIj48cGF0aCBkPSJNMyAxNmg1di0ySDN2MnptNi41IDBoNXYtMmgtNXYyem02LjUgMGg1di0yaC01djJ6TTMgMjBoMnYtMkgzdjJ6bTQgMGgydi0ySDd2MnptNCAwaDJ2LTJoLTJ2MnptNCAwaDJ2LTJoLTJ2MnptNCAwaDJ2LTJoLTJ2MnpNMyAxMmg4di0ySDN2MnptMTAgMGg4di0yaC04djJ6TTMgNHY0aDE4VjRIM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJsaW5lLXdlaWdodCI+PHBhdGggZD0iTTMgMTdoMTh2LTJIM3Yyem0wIDNoMTh2LTFIM3Yxem0wLTdoMTh2LTNIM3Yzem0wLTl2NGgxOFY0SDN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibGluayI+PHBhdGggZD0iTTMuOSAxMmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMWg0VjdIN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNWg0di0xLjlIN2MtMS43MSAwLTMuMS0xLjM5LTMuMS0zLjF6TTggMTNoOHYtMkg4djJ6bTktNmgtNHYxLjloNGMxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXMtMS4zOSAzLjEtMy4xIDMuMWgtNFYxN2g0YzIuNzYgMCA1LTIuMjQgNS01cy0yLjI0LTUtNS01eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imxpc3QiPjxwYXRoIGQ9Ik0zIDEzaDJ2LTJIM3Yyem0wIDRoMnYtMkgzdjJ6bTAtOGgyVjdIM3Yyem00IDRoMTR2LTJIN3Yyem0wIDRoMTR2LTJIN3Yyek03IDd2MmgxNFY3SDd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibG9jayI+PHBhdGggZD0iTTE4IDhoLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2djJINmMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlYxMGMwLTEuMS0uOS0yLTItMnptLTYgOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6bTMuMS05SDguOVY2YzAtMS43MSAxLjM5LTMuMSAzLjEtMy4xIDEuNzEgMCAzLjEgMS4zOSAzLjEgMy4xdjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibG9jay1vcGVuIj48cGF0aCBkPSJNMTIgMTdjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0yLTIgLjktMiAyIC45IDIgMiAyem02LTloLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2aDEuOWMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMSAxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXYySDZjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWMTBjMC0xLjEtLjktMi0yLTJ6bTAgMTJINlYxMGgxMnYxMHoiPjwvcGF0aD48L2c+CjxnIGlkPSJsb2NrLW91dGxpbmUiPjxwYXRoIGQ9Ik0xMiAxN2MxLjEgMCAyLS45IDItMnMtLjktMi0yLTItMiAuOS0yIDIgLjkgMiAyIDJ6bTYtOWgtMVY2YzAtMi43Ni0yLjI0LTUtNS01UzcgMy4yNCA3IDZ2Mkg2Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjEwYzAtMS4xLS45LTItMi0yek04LjkgNmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMXMzLjEgMS4zOSAzLjEgMy4xdjJIOC45VjZ6TTE4IDIwSDZWMTBoMTJ2MTB6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibG93LXByaW9yaXR5Ij48cGF0aCBkPSJNMTQgNWg4djJoLTh6bTAgNS41aDh2MmgtOHptMCA1LjVoOHYyaC04ek0yIDExLjVDMiAxNS4wOCA0LjkyIDE4IDguNSAxOEg5djJsMy0zLTMtM3YyaC0uNUM2LjAyIDE2IDQgMTMuOTggNCAxMS41UzYuMDIgNyA4LjUgN0gxMlY1SDguNUM0LjkyIDUgMiA3LjkyIDIgMTEuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJsb3lhbHR5Ij48cGF0aCBkPSJNMjEuNDEgMTEuNThsLTktOUMxMi4wNSAyLjIyIDExLjU1IDIgMTEgMkg0Yy0xLjEgMC0yIC45LTIgMnY3YzAgLjU1LjIyIDEuMDUuNTkgMS40Mmw5IDljLjM2LjM2Ljg2LjU4IDEuNDEuNTguNTUgMCAxLjA1LS4yMiAxLjQxLS41OWw3LTdjLjM3LS4zNi41OS0uODYuNTktMS40MSAwLS41NS0uMjMtMS4wNi0uNTktMS40MnpNNS41IDdDNC42NyA3IDQgNi4zMyA0IDUuNVM0LjY3IDQgNS41IDQgNyA0LjY3IDcgNS41IDYuMzMgNyA1LjUgN3ptMTEuNzcgOC4yN0wxMyAxOS41NGwtNC4yNy00LjI3QzguMjggMTQuODEgOCAxNC4xOSA4IDEzLjVjMC0xLjM4IDEuMTItMi41IDIuNS0yLjUuNjkgMCAxLjMyLjI4IDEuNzcuNzRsLjczLjcyLjczLS43M2MuNDUtLjQ1IDEuMDgtLjczIDEuNzctLjczIDEuMzggMCAyLjUgMS4xMiAyLjUgMi41IDAgLjY5LS4yOCAxLjMyLS43MyAxLjc3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im1haWwiPjxwYXRoIGQ9Ik0yMCA0SDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgNGwtOCA1LTgtNVY2bDggNSA4LTV2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJtYXJrdW5yZWFkIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDRsLTggNS04LTVWNmw4IDUgOC01djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibWFya3VucmVhZC1tYWlsYm94Ij48cGF0aCBkPSJNMjAgNkgxMHY2SDhWNGg2VjBINnY2SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWOGMwLTEuMS0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJtZW51Ij48cGF0aCBkPSJNMyAxOGgxOHYtMkgzdjJ6bTAtNWgxOHYtMkgzdjJ6bTAtN3YyaDE4VjZIM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJtb3JlLWhvcml6Ij48cGF0aCBkPSJNNiAxMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTEyIDBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0tNiAwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJtb3JlLXZlcnQiPjxwYXRoIGQ9Ik0xMiA4YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptMCAyYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptMCA2Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJtb3RvcmN5Y2xlIj48cGF0aCBkPSJNMTkuNDQgOS4wM0wxNS40MSA1SDExdjJoMy41OWwyIDJINWMtMi44IDAtNSAyLjItNSA1czIuMiA1IDUgNWMyLjQ2IDAgNC40NS0xLjY5IDQuOS00aDEuNjVsMi43Ny0yLjc3Yy0uMjEuNTQtLjMyIDEuMTQtLjMyIDEuNzcgMCAyLjggMi4yIDUgNSA1czUtMi4yIDUtNWMwLTIuNjUtMS45Ny00Ljc3LTQuNTYtNC45N3pNNy44MiAxNUM3LjQgMTYuMTUgNi4yOCAxNyA1IDE3Yy0xLjYzIDAtMy0xLjM3LTMtM3MxLjM3LTMgMy0zYzEuMjggMCAyLjQuODUgMi44MiAySDV2MmgyLjgyek0xOSAxN2MtMS42NiAwLTMtMS4zNC0zLTNzMS4zNC0zIDMtMyAzIDEuMzQgMyAzLTEuMzQgMy0zIDN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibW92ZS10by1pbmJveCI+PHBhdGggZD0iTTE5IDNINC45OWMtMS4xMSAwLTEuOTguOS0xLjk4IDJMMyAxOWMwIDEuMS44OCAyIDEuOTkgMkgxOWMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDEyaC00YzAgMS42Ni0xLjM1IDMtMyAzcy0zLTEuMzQtMy0zSDQuOTlWNUgxOXYxMHptLTMtNWgtMlY3aC00djNIOGw0IDQgNC00eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im5leHQtd2VlayI+PHBhdGggZD0iTTIwIDdoLTRWNWMwLS41NS0uMjItMS4wNS0uNTktMS40MUMxNS4wNSAzLjIyIDE0LjU1IDMgMTQgM2gtNGMtMS4xIDAtMiAuOS0yIDJ2Mkg0Yy0xLjEgMC0yIC45LTIgMnYxMWMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjljMC0xLjEtLjktMi0yLTJ6TTEwIDVoNHYyaC00VjV6bTEgMTMuNWwtMS0xIDMtMy0zLTMgMS0xIDQgNC00IDR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibm90ZS1hZGQiPjxwYXRoIGQ9Ik0xNCAySDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAyMGMwIDEuMS44OSAyIDEuOTkgMkgxOGMxLjEgMCAyLS45IDItMlY4bC02LTZ6bTIgMTRoLTN2M2gtMnYtM0g4di0yaDN2LTNoMnYzaDN2MnptLTMtN1YzLjVMMTguNSA5SDEzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im9mZmxpbmUtcGluIj48cGF0aCBkPSJNMTIgMkM2LjUgMiAyIDYuNSAyIDEyczQuNSAxMCAxMCAxMCAxMC00LjUgMTAtMTBTMTcuNSAyIDEyIDJ6bTUgMTZIN3YtMmgxMHYyem0tNi43LTRMNyAxMC43bDEuNC0xLjQgMS45IDEuOSA1LjMtNS4zTDE3IDcuMyAxMC4zIDE0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im9wYWNpdHkiPjxwYXRoIGQ9Ik0xNy42NiA4TDEyIDIuMzUgNi4zNCA4QzQuNzggOS41NiA0IDExLjY0IDQgMTMuNjRzLjc4IDQuMTEgMi4zNCA1LjY3IDMuNjEgMi4zNSA1LjY2IDIuMzUgNC4xLS43OSA1LjY2LTIuMzVTMjAgMTUuNjQgMjAgMTMuNjQgMTkuMjIgOS41NiAxNy42NiA4ek02IDE0Yy4wMS0yIC42Mi0zLjI3IDEuNzYtNC40TDEyIDUuMjdsNC4yNCA0LjM4QzE3LjM4IDEwLjc3IDE3Ljk5IDEyIDE4IDE0SDZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ib3Blbi1pbi1icm93c2VyIj48cGF0aCBkPSJNMTkgNEg1Yy0xLjExIDAtMiAuOS0yIDJ2MTJjMCAxLjEuODkgMiAyIDJoNHYtMkg1VjhoMTR2MTBoLTR2Mmg0YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjg5LTItMi0yem0tNyA2bC00IDRoM3Y2aDJ2LTZoM2wtNC00eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im9wZW4taW4tbmV3Ij48cGF0aCBkPSJNMTkgMTlINVY1aDdWM0g1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJ2LTdoLTJ2N3pNMTQgM3YyaDMuNTlsLTkuODMgOS44MyAxLjQxIDEuNDFMMTkgNi40MVYxMGgyVjNoLTd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ib3Blbi13aXRoIj48cGF0aCBkPSJNMTAgOWg0VjZoM2wtNS01LTUgNWgzdjN6bS0xIDFINlY3bC01IDUgNSA1di0zaDN2LTR6bTE0IDJsLTUtNXYzaC0zdjRoM3YzbDUtNXptLTkgM2gtNHYzSDdsNSA1IDUtNWgtM3YtM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJwYWdldmlldyI+PHBhdGggZD0iTTExLjUgOUMxMC4xMiA5IDkgMTAuMTIgOSAxMS41czEuMTIgMi41IDIuNSAyLjUgMi41LTEuMTIgMi41LTIuNVMxMi44OCA5IDExLjUgOXpNMjAgNEg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bS0zLjIxIDE0LjIxbC0yLjkxLTIuOTFjLS42OS40NC0xLjUxLjctMi4zOS43QzkuMDEgMTYgNyAxMy45OSA3IDExLjVTOS4wMSA3IDExLjUgNyAxNiA5LjAxIDE2IDExLjVjMCAuODgtLjI2IDEuNjktLjcgMi4zOWwyLjkxIDIuOS0xLjQyIDEuNDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGFuLXRvb2wiPjxwYXRoIGQ9Ik0yMyA1LjVWMjBjMCAyLjItMS44IDQtNCA0aC03LjNjLTEuMDggMC0yLjEtLjQzLTIuODUtMS4xOUwxIDE0LjgzczEuMjYtMS4yMyAxLjMtMS4yNWMuMjItLjE5LjQ5LS4yOS43OS0uMjkuMjIgMCAuNDIuMDYuNi4xNi4wNC4wMSA0LjMxIDIuNDYgNC4zMSAyLjQ2VjRjMC0uODMuNjctMS41IDEuNS0xLjVTMTEgMy4xNyAxMSA0djdoMVYxLjVjMC0uODMuNjctMS41IDEuNS0xLjVTMTUgLjY3IDE1IDEuNVYxMWgxVjIuNWMwLS44My42Ny0xLjUgMS41LTEuNXMxLjUuNjcgMS41IDEuNVYxMWgxVjUuNWMwLS44My42Ny0xLjUgMS41LTEuNXMxLjUuNjcgMS41IDEuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJwYXltZW50Ij48cGF0aCBkPSJNMjAgNEg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY2YzAtMS4xMS0uODktMi0yLTJ6bTAgMTRINHYtNmgxNnY2em0wLTEwSDRWNmgxNnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBlcm0tY2FtZXJhLW1pYyI+PHBhdGggZD0iTTIwIDVoLTMuMTdMMTUgM0g5TDcuMTcgNUg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDd2LTIuMDljLTIuODMtLjQ4LTUtMi45NC01LTUuOTFoMmMwIDIuMjEgMS43OSA0IDQgNHM0LTEuNzkgNC00aDJjMCAyLjk3LTIuMTcgNS40My01IDUuOTFWMjFoN2MxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yem0tNiA4YzAgMS4xLS45IDItMiAycy0yLS45LTItMlY5YzAtMS4xLjktMiAyLTJzMiAuOSAyIDJ2NHoiPjwvcGF0aD48L2c+CjxnIGlkPSJwZXJtLWNvbnRhY3QtY2FsZW5kYXIiPjxwYXRoIGQ9Ik0xOSAzaC0xVjFoLTJ2Mkg4VjFINnYySDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAzYzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptNiAxMkg2di0xYzAtMiA0LTMuMSA2LTMuMXM2IDEuMSA2IDMuMXYxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBlcm0tZGF0YS1zZXR0aW5nIj48cGF0aCBkPSJNMTguOTkgMTEuNWMuMzQgMCAuNjcuMDMgMSAuMDdMMjAgMCAwIDIwaDExLjU2Yy0uMDQtLjMzLS4wNy0uNjYtLjA3LTEgMC00LjE0IDMuMzYtNy41IDcuNS03LjV6bTMuNzEgNy45OWMuMDItLjE2LjA0LS4zMi4wNC0uNDkgMC0uMTctLjAxLS4zMy0uMDQtLjQ5bDEuMDYtLjgzYy4wOS0uMDguMTItLjIxLjA2LS4zMmwtMS0xLjczYy0uMDYtLjExLS4xOS0uMTUtLjMxLS4xMWwtMS4yNC41Yy0uMjYtLjItLjU0LS4zNy0uODUtLjQ5bC0uMTktMS4zMmMtLjAxLS4xMi0uMTItLjIxLS4yNC0uMjFoLTJjLS4xMiAwLS4yMy4wOS0uMjUuMjFsLS4xOSAxLjMyYy0uMy4xMy0uNTkuMjktLjg1LjQ5bC0xLjI0LS41Yy0uMTEtLjA0LS4yNCAwLS4zMS4xMWwtMSAxLjczYy0uMDYuMTEtLjA0LjI0LjA2LjMybDEuMDYuODNjLS4wMi4xNi0uMDMuMzItLjAzLjQ5IDAgLjE3LjAxLjMzLjAzLjQ5bC0xLjA2LjgzYy0uMDkuMDgtLjEyLjIxLS4wNi4zMmwxIDEuNzNjLjA2LjExLjE5LjE1LjMxLjExbDEuMjQtLjVjLjI2LjIuNTQuMzcuODUuNDlsLjE5IDEuMzJjLjAyLjEyLjEyLjIxLjI1LjIxaDJjLjEyIDAgLjIzLS4wOS4yNS0uMjFsLjE5LTEuMzJjLjMtLjEzLjU5LS4yOS44NC0uNDlsMS4yNS41Yy4xMS4wNC4yNCAwIC4zMS0uMTFsMS0xLjczYy4wNi0uMTEuMDMtLjI0LS4wNi0uMzJsLTEuMDctLjgzem0tMy43MSAxLjAxYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVzLjY3LTEuNSAxLjUtMS41IDEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJwZXJtLWRldmljZS1pbmZvcm1hdGlvbiI+PHBhdGggZD0iTTEzIDdoLTJ2MmgyVjd6bTAgNGgtMnY2aDJ2LTZ6bTQtOS45OUw3IDFjLTEuMSAwLTIgLjktMiAydjE4YzAgMS4xLjkgMiAyIDJoMTBjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0xLjk5LTItMS45OXpNMTcgMTlIN1Y1aDEwdjE0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBlcm0taWRlbnRpdHkiPjxwYXRoIGQ9Ik0xMiA1LjljMS4xNiAwIDIuMS45NCAyLjEgMi4xcy0uOTQgMi4xLTIuMSAyLjFTOS45IDkuMTYgOS45IDhzLjk0LTIuMSAyLjEtMi4xbTAgOWMyLjk3IDAgNi4xIDEuNDYgNi4xIDIuMXYxLjFINS45VjE3YzAtLjY0IDMuMTMtMi4xIDYuMS0yLjFNMTIgNEM5Ljc5IDQgOCA1Ljc5IDggOHMxLjc5IDQgNCA0IDQtMS43OSA0LTQtMS43OS00LTQtNHptMCA5Yy0yLjY3IDAtOCAxLjM0LTggNHYzaDE2di0zYzAtMi42Ni01LjMzLTQtOC00eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBlcm0tbWVkaWEiPjxwYXRoIGQ9Ik0yIDZIMHY1aC4wMUwwIDIwYzAgMS4xLjkgMiAyIDJoMTh2LTJIMlY2em0yMC0yaC04bC0yLTJINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDE2YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnpNNyAxNWw0LjUtNiAzLjUgNC41MSAyLjUtMy4wMUwyMSAxNUg3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBlcm0tcGhvbmUtbXNnIj48cGF0aCBkPSJNMjAgMTUuNWMtMS4yNSAwLTIuNDUtLjItMy41Ny0uNTctLjM1LS4xMS0uNzQtLjAzLTEuMDIuMjRsLTIuMiAyLjJjLTIuODMtMS40NC01LjE1LTMuNzUtNi41OS02LjU4bDIuMi0yLjIxYy4yOC0uMjcuMzYtLjY2LjI1LTEuMDFDOC43IDYuNDUgOC41IDUuMjUgOC41IDRjMC0uNTUtLjQ1LTEtMS0xSDRjLS41NSAwLTEgLjQ1LTEgMSAwIDkuMzkgNy42MSAxNyAxNyAxNyAuNTUgMCAxLS40NSAxLTF2LTMuNWMwLS41NS0uNDUtMS0xLTF6TTEyIDN2MTBsMy0zaDZWM2gtOXoiPjwvcGF0aD48L2c+CjxnIGlkPSJwZXJtLXNjYW4td2lmaSI+PHBhdGggZD0iTTEyIDNDNi45NSAzIDMuMTUgNC44NSAwIDcuMjNMMTIgMjIgMjQgNy4yNUMyMC44NSA0Ljg3IDE3LjA1IDMgMTIgM3ptMSAxM2gtMnYtNmgydjZ6bS0yLThWNmgydjJoLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGV0cyI+PGNpcmNsZSBjeD0iNC41IiBjeT0iOS41IiByPSIyLjUiPjwvY2lyY2xlPjxjaXJjbGUgY3g9IjkiIGN5PSI1LjUiIHI9IjIuNSI+PC9jaXJjbGU+PGNpcmNsZSBjeD0iMTUiIGN5PSI1LjUiIHI9IjIuNSI+PC9jaXJjbGU+PGNpcmNsZSBjeD0iMTkuNSIgY3k9IjkuNSIgcj0iMi41Ij48L2NpcmNsZT48cGF0aCBkPSJNMTcuMzQgMTQuODZjLS44Ny0xLjAyLTEuNi0xLjg5LTIuNDgtMi45MS0uNDYtLjU0LTEuMDUtMS4wOC0xLjc1LTEuMzItLjExLS4wNC0uMjItLjA3LS4zMy0uMDktLjI1LS4wNC0uNTItLjA0LS43OC0uMDRzLS41MyAwLS43OS4wNWMtLjExLjAyLS4yMi4wNS0uMzMuMDktLjcuMjQtMS4yOC43OC0xLjc1IDEuMzItLjg3IDEuMDItMS42IDEuODktMi40OCAyLjkxLTEuMzEgMS4zMS0yLjkyIDIuNzYtMi42MiA0Ljc5LjI5IDEuMDIgMS4wMiAyLjAzIDIuMzMgMi4zMi43My4xNSAzLjA2LS40NCA1LjU0LS40NGguMThjMi40OCAwIDQuODEuNTggNS41NC40NCAxLjMxLS4yOSAyLjA0LTEuMzEgMi4zMy0yLjMyLjMxLTIuMDQtMS4zLTMuNDktMi42MS00Ljh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGljdHVyZS1pbi1waWN0dXJlIj48cGF0aCBkPSJNMTkgN2gtOHY2aDhWN3ptMi00SDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMS45OCAyIDEuOThoMThjMS4xIDAgMi0uODggMi0xLjk4VjVjMC0xLjEtLjktMi0yLTJ6bTAgMTYuMDFIM1Y0Ljk4aDE4djE0LjAzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBpY3R1cmUtaW4tcGljdHVyZS1hbHQiPjxwYXRoIGQ9Ik0xOSAxMWgtOHY2aDh2LTZ6bTQgOFY0Ljk4QzIzIDMuODggMjIuMSAzIDIxIDNIM2MtMS4xIDAtMiAuODgtMiAxLjk4VjE5YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJ6bS0yIC4wMkgzVjQuOTdoMTh2MTQuMDV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGxheS1mb3Itd29yayI+PHBhdGggZD0iTTExIDV2NS41OUg3LjVsNC41IDQuNSA0LjUtNC41SDEzVjVoLTJ6bS01IDljMCAzLjMxIDIuNjkgNiA2IDZzNi0yLjY5IDYtNmgtMmMwIDIuMjEtMS43OSA0LTQgNHMtNC0xLjc5LTQtNEg2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBvbHltZXIiPjxwYXRoIGQ9Ik0xOSA0aC00TDcuMTEgMTYuNjMgNC41IDEyIDkgNEg1TC41IDEyIDUgMjBoNGw3Ljg5LTEyLjYzTDE5LjUgMTIgMTUgMjBoNGw0LjUtOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJwb3dlci1zZXR0aW5ncy1uZXciPjxwYXRoIGQ9Ik0xMyAzaC0ydjEwaDJWM3ptNC44MyAyLjE3bC0xLjQyIDEuNDJDMTcuOTkgNy44NiAxOSA5LjgxIDE5IDEyYzAgMy44Ny0zLjEzIDctNyA3cy03LTMuMTMtNy03YzAtMi4xOSAxLjAxLTQuMTQgMi41OC01LjQyTDYuMTcgNS4xN0M0LjIzIDYuODIgMyA5LjI2IDMgMTJjMCA0Ljk3IDQuMDMgOSA5IDlzOS00LjAzIDktOWMwLTIuNzQtMS4yMy01LjE4LTMuMTctNi44M3oiPjwvcGF0aD48L2c+CjxnIGlkPSJwcmVnbmFudC13b21hbiI+PHBhdGggZD0iTTkgNGMwLTEuMTEuODktMiAyLTJzMiAuODkgMiAyLS44OSAyLTIgMi0yLS44OS0yLTJ6bTcgOWMtLjAxLTEuMzQtLjgzLTIuNTEtMi0zIDAtMS42Ni0xLjM0LTMtMy0zcy0zIDEuMzQtMyAzdjdoMnY1aDN2LTVoM3YtNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJwcmludCI+PHBhdGggZD0iTTE5IDhINWMtMS42NiAwLTMgMS4zNC0zIDN2Nmg0djRoMTJ2LTRoNHYtNmMwLTEuNjYtMS4zNC0zLTMtM3ptLTMgMTFIOHYtNWg4djV6bTMtN2MtLjU1IDAtMS0uNDUtMS0xcy40NS0xIDEtMSAxIC40NSAxIDEtLjQ1IDEtMSAxem0tMS05SDZ2NGgxMlYzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InF1ZXJ5LWJ1aWxkZXIiPjxwYXRoIGQ9Ik0xMS45OSAyQzYuNDcgMiAyIDYuNDggMiAxMnM0LjQ3IDEwIDkuOTkgMTBDMTcuNTIgMjIgMjIgMTcuNTIgMjIgMTJTMTcuNTIgMiAxMS45OSAyek0xMiAyMGMtNC40MiAwLTgtMy41OC04LThzMy41OC04IDgtOCA4IDMuNTggOCA4LTMuNTggOC04IDh6bS41LTEzSDExdjZsNS4yNSAzLjE1Ljc1LTEuMjMtNC41LTIuNjd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icXVlc3Rpb24tYW5zd2VyIj48cGF0aCBkPSJNMjEgNmgtMnY5SDZ2MmMwIC41NS40NSAxIDEgMWgxMWw0IDRWN2MwLS41NS0uNDUtMS0xLTF6bS00IDZWM2MwLS41NS0uNDUtMS0xLTFIM2MtLjU1IDAtMSAuNDUtMSAxdjE0bDQtNGgxMGMuNTUgMCAxLS40NSAxLTF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmFkaW8tYnV0dG9uLWNoZWNrZWQiPjxwYXRoIGQ9Ik0xMiA3Yy0yLjc2IDAtNSAyLjI0LTUgNXMyLjI0IDUgNSA1IDUtMi4yNCA1LTUtMi4yNC01LTUtNXptMC01QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJyYWRpby1idXR0b24tdW5jaGVja2VkIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MiAwLTgtMy41OC04LThzMy41OC04IDgtOCA4IDMuNTggOCA4LTMuNTggOC04IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmVjZWlwdCI+PHBhdGggZD0iTTE4IDE3SDZ2LTJoMTJ2MnptMC00SDZ2LTJoMTJ2MnptMC00SDZWN2gxMnYyek0zIDIybDEuNS0xLjVMNiAyMmwxLjUtMS41TDkgMjJsMS41LTEuNUwxMiAyMmwxLjUtMS41TDE1IDIybDEuNS0xLjVMMTggMjJsMS41LTEuNUwyMSAyMlYybC0xLjUgMS41TDE4IDJsLTEuNSAxLjVMMTUgMmwtMS41IDEuNUwxMiAybC0xLjUgMS41TDkgMiA3LjUgMy41IDYgMiA0LjUgMy41IDMgMnYyMHoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZWNvcmQtdm9pY2Utb3ZlciI+PGNpcmNsZSBjeD0iOSIgY3k9IjkiIHI9IjQiPjwvY2lyY2xlPjxwYXRoIGQ9Ik05IDE1Yy0yLjY3IDAtOCAxLjM0LTggNHYyaDE2di0yYzAtMi42Ni01LjMzLTQtOC00em03Ljc2LTkuNjRsLTEuNjggMS42OWMuODQgMS4xOC44NCAyLjcxIDAgMy44OWwxLjY4IDEuNjljMi4wMi0yLjAyIDIuMDItNS4wNyAwLTcuMjd6TTIwLjA3IDJsLTEuNjMgMS42M2MyLjc3IDMuMDIgMi43NyA3LjU2IDAgMTAuNzRMMjAuMDcgMTZjMy45LTMuODkgMy45MS05Ljk1IDAtMTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmVkZWVtIj48cGF0aCBkPSJNMjAgNmgtMi4xOGMuMTEtLjMxLjE4LS42NS4xOC0xIDAtMS42Ni0xLjM0LTMtMy0zLTEuMDUgMC0xLjk2LjU0LTIuNSAxLjM1bC0uNS42Ny0uNS0uNjhDMTAuOTYgMi41NCAxMC4wNSAyIDkgMiA3LjM0IDIgNiAzLjM0IDYgNWMwIC4zNS4wNy42OS4xOCAxSDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE5YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjhjMC0xLjExLS44OS0yLTItMnptLTUtMmMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xek05IDRjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMTEgMTVINHYtMmgxNnYyem0wLTVINFY4aDUuMDhMNyAxMC44MyA4LjYyIDEyIDExIDguNzZsMS0xLjM2IDEgMS4zNkwxNS4zOCAxMiAxNyAxMC44MyAxNC45MiA4SDIwdjZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmVkbyI+PHBhdGggZD0iTTE4LjQgMTAuNkMxNi41NSA4Ljk5IDE0LjE1IDggMTEuNSA4Yy00LjY1IDAtOC41OCAzLjAzLTkuOTYgNy4yMkwzLjkgMTZjMS4wNS0zLjE5IDQuMDUtNS41IDcuNi01LjUgMS45NSAwIDMuNzMuNzIgNS4xMiAxLjg4TDEzIDE2aDlWN2wtMy42IDMuNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZWZyZXNoIj48cGF0aCBkPSJNMTcuNjUgNi4zNUMxNi4yIDQuOSAxNC4yMSA0IDEyIDRjLTQuNDIgMC03Ljk5IDMuNTgtNy45OSA4czMuNTcgOCA3Ljk5IDhjMy43MyAwIDYuODQtMi41NSA3LjczLTZoLTIuMDhjLS44MiAyLjMzLTMuMDQgNC01LjY1IDQtMy4zMSAwLTYtMi42OS02LTZzMi42OS02IDYtNmMxLjY2IDAgMy4xNC42OSA0LjIyIDEuNzhMMTMgMTFoN1Y0bC0yLjM1IDIuMzV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmVtb3ZlIj48cGF0aCBkPSJNMTkgMTNINXYtMmgxNHYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJlbW92ZS1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem01IDExSDd2LTJoMTB2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZW1vdmUtY2lyY2xlLW91dGxpbmUiPjxwYXRoIGQ9Ik03IDExdjJoMTB2LTJIN3ptNS05QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZW1vdmUtc2hvcHBpbmctY2FydCI+PHBhdGggZD0iTTIyLjczIDIyLjczTDIuNzcgMi43NyAyIDJsLS43My0uNzNMMCAyLjU0bDQuMzkgNC4zOSAyLjIxIDQuNjYtMS4zNSAyLjQ1Yy0uMTYuMjgtLjI1LjYxLS4yNS45NiAwIDEuMS45IDIgMiAyaDcuNDZsMS4zOCAxLjM4Yy0uNS4zNi0uODMuOTUtLjgzIDEuNjIgMCAxLjEuODkgMiAxLjk5IDIgLjY3IDAgMS4yNi0uMzMgMS42Mi0uODRMMjEuNDYgMjRsMS4yNy0xLjI3ek03LjQyIDE1Yy0uMTQgMC0uMjUtLjExLS4yNS0uMjVsLjAzLS4xMi45LTEuNjNoMi4zNmwyIDJINy40MnptOC4xMy0yYy43NSAwIDEuNDEtLjQxIDEuNzUtMS4wM2wzLjU4LTYuNDljLjA4LS4xNC4xMi0uMzEuMTItLjQ4IDAtLjU1LS40NS0xLTEtMUg2LjU0bDkuMDEgOXpNNyAxOGMtMS4xIDAtMS45OS45LTEuOTkgMlM1LjkgMjIgNyAyMnMyLS45IDItMi0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZW9yZGVyIj48cGF0aCBkPSJNMyAxNWgxOHYtMkgzdjJ6bTAgNGgxOHYtMkgzdjJ6bTAtOGgxOFY5SDN2MnptMC02djJoMThWNUgzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJlcGx5Ij48cGF0aCBkPSJNMTAgOVY1bC03IDcgNyA3di00LjFjNSAwIDguNSAxLjYgMTEgNS4xLTEtNS00LTEwLTExLTExeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJlcGx5LWFsbCI+PHBhdGggZD0iTTcgOFY1bC03IDcgNyA3di0zbC00LTQgNC00em02IDFWNWwtNyA3IDcgN3YtNC4xYzUgMCA4LjUgMS42IDExIDUuMS0xLTUtNC0xMC0xMS0xMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZXBvcnQiPjxwYXRoIGQ9Ik0xNS43MyAzSDguMjdMMyA4LjI3djcuNDZMOC4yNyAyMWg3LjQ2TDIxIDE1LjczVjguMjdMMTUuNzMgM3pNMTIgMTcuM2MtLjcyIDAtMS4zLS41OC0xLjMtMS4zIDAtLjcyLjU4LTEuMyAxLjMtMS4zLjcyIDAgMS4zLjU4IDEuMyAxLjMgMCAuNzItLjU4IDEuMy0xLjMgMS4zem0xLTQuM2gtMlY3aDJ2NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZXBvcnQtcHJvYmxlbSI+PHBhdGggZD0iTTEgMjFoMjJMMTIgMiAxIDIxem0xMi0zaC0ydi0yaDJ2MnptMC00aC0ydi00aDJ2NHoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZXN0b3JlIj48cGF0aCBkPSJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJlc3RvcmUtcGFnZSI+PHBhdGggZD0iTTE0IDJINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDIwYzAgMS4xLjg5IDIgMS45OSAySDE4YzEuMSAwIDItLjkgMi0yVjhsLTYtNnptLTIgMTZjLTIuMDUgMC0zLjgxLTEuMjQtNC41OC0zaDEuNzFjLjYzLjkgMS42OCAxLjUgMi44NyAxLjUgMS45MyAwIDMuNS0xLjU3IDMuNS0zLjVTMTMuOTMgOS41IDEyIDkuNWMtMS4zNSAwLTIuNTIuNzgtMy4xIDEuOWwxLjYgMS42aC00VjlsMS4zIDEuM0M4LjY5IDguOTIgMTAuMjMgOCAxMiA4YzIuNzYgMCA1IDIuMjQgNSA1cy0yLjI0IDUtNSA1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJvb20iPjxwYXRoIGQ9Ik0xMiAyQzguMTMgMiA1IDUuMTMgNSA5YzAgNS4yNSA3IDEzIDcgMTNzNy03Ljc1IDctMTNjMC0zLjg3LTMuMTMtNy03LTd6bTAgOS41Yy0xLjM4IDAtMi41LTEuMTItMi41LTIuNXMxLjEyLTIuNSAyLjUtMi41IDIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJyb3VuZGVkLWNvcm5lciI+PHBhdGggZD0iTTE5IDE5aDJ2MmgtMnYtMnptMC0yaDJ2LTJoLTJ2MnpNMyAxM2gydi0ySDN2MnptMCA0aDJ2LTJIM3Yyem0wLThoMlY3SDN2MnptMC00aDJWM0gzdjJ6bTQgMGgyVjNIN3Yyem04IDE2aDJ2LTJoLTJ2MnptLTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6bS04IDBoMnYtMkg3djJ6bS00IDBoMnYtMkgzdjJ6TTIxIDhjMC0yLjc2LTIuMjQtNS01LTVoLTV2Mmg1YzEuNjUgMCAzIDEuMzUgMyAzdjVoMlY4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJvd2luZyI+PHBhdGggZD0iTTguNSAxNC41TDQgMTlsMS41IDEuNUw5IDE3aDJsLTIuNS0yLjV6TTE1IDFjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem02IDIwLjAxTDE4IDI0bC0yLjk5LTMuMDFWMTkuNWwtNy4xLTcuMDljLS4zMS4wNS0uNjEuMDctLjkxLjA3di0yLjE2YzEuNjYuMDMgMy42MS0uODcgNC42Ny0yLjA0bDEuNC0xLjU1Yy4xOS0uMjEuNDMtLjM4LjY5LS41LjI5LS4xNC42Mi0uMjMuOTYtLjIzaC4wM0MxNS45OSA2LjAxIDE3IDcuMDIgMTcgOC4yNnY1Ljc1YzAgLjg0LS4zNSAxLjYxLS45MiAyLjE2bC0zLjU4LTMuNTh2LTIuMjdjLS42My41Mi0xLjQzIDEuMDItMi4yOSAxLjM5TDE2LjUgMThIMThsMyAzLjAxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNhdmUiPjxwYXRoIGQ9Ik0xNyAzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY3bC00LTR6bS01IDE2Yy0xLjY2IDAtMy0xLjM0LTMtM3MxLjM0LTMgMy0zIDMgMS4zNCAzIDMtMS4zNCAzLTMgM3ptMy0xMEg1VjVoMTB2NHoiPjwvcGF0aD48L2c+CjxnIGlkPSJzY2hlZHVsZSI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6TTEyIDIwYy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHptLjUtMTNIMTF2Nmw1LjI1IDMuMTUuNzUtMS4yMy00LjUtMi42N3oiPjwvcGF0aD48L2c+CjxnIGlkPSJzZWFyY2giPjxwYXRoIGQ9Ik0xNS41IDE0aC0uNzlsLS4yOC0uMjdDMTUuNDEgMTIuNTkgMTYgMTEuMTEgMTYgOS41IDE2IDUuOTEgMTMuMDkgMyA5LjUgM1MzIDUuOTEgMyA5LjUgNS45MSAxNiA5LjUgMTZjMS42MSAwIDMuMDktLjU5IDQuMjMtMS41N2wuMjcuMjh2Ljc5bDUgNC45OUwyMC40OSAxOWwtNC45OS01em0tNiAwQzcuMDEgMTQgNSAxMS45OSA1IDkuNVM3LjAxIDUgOS41IDUgMTQgNy4wMSAxNCA5LjUgMTEuOTkgMTQgOS41IDE0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNlbGVjdC1hbGwiPjxwYXRoIGQ9Ik0zIDVoMlYzYy0xLjEgMC0yIC45LTIgMnptMCA4aDJ2LTJIM3Yyem00IDhoMnYtMkg3djJ6TTMgOWgyVjdIM3Yyem0xMC02aC0ydjJoMlYzem02IDB2MmgyYzAtMS4xLS45LTItMi0yek01IDIxdi0ySDNjMCAxLjEuOSAyIDIgMnptLTItNGgydi0ySDN2MnpNOSAzSDd2MmgyVjN6bTIgMThoMnYtMmgtMnYyem04LThoMnYtMmgtMnYyem0wIDhjMS4xIDAgMi0uOSAyLTJoLTJ2MnptMC0xMmgyVjdoLTJ2MnptMCA4aDJ2LTJoLTJ2MnptLTQgNGgydi0yaC0ydjJ6bTAtMTZoMlYzaC0ydjJ6TTcgMTdoMTBWN0g3djEwem0yLThoNnY2SDlWOXoiPjwvcGF0aD48L2c+CjxnIGlkPSJzZW5kIj48cGF0aCBkPSJNMi4wMSAyMUwyMyAxMiAyLjAxIDMgMiAxMGwxNSAyLTE1IDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3MiPjxwYXRoIGQ9Ik0xOS40MyAxMi45OGMuMDQtLjMyLjA3LS42NC4wNy0uOThzLS4wMy0uNjYtLjA3LS45OGwyLjExLTEuNjVjLjE5LS4xNS4yNC0uNDIuMTItLjY0bC0yLTMuNDZjLS4xMi0uMjItLjM5LS4zLS42MS0uMjJsLTIuNDkgMWMtLjUyLS40LTEuMDgtLjczLTEuNjktLjk4bC0uMzgtMi42NUMxNC40NiAyLjE4IDE0LjI1IDIgMTQgMmgtNGMtLjI1IDAtLjQ2LjE4LS40OS40MmwtLjM4IDIuNjVjLS42MS4yNS0xLjE3LjU5LTEuNjkuOThsLTIuNDktMWMtLjIzLS4wOS0uNDkgMC0uNjEuMjJsLTIgMy40NmMtLjEzLjIyLS4wNy40OS4xMi42NGwyLjExIDEuNjVjLS4wNC4zMi0uMDcuNjUtLjA3Ljk4cy4wMy42Ni4wNy45OGwtMi4xMSAxLjY1Yy0uMTkuMTUtLjI0LjQyLS4xMi42NGwyIDMuNDZjLjEyLjIyLjM5LjMuNjEuMjJsMi40OS0xYy41Mi40IDEuMDguNzMgMS42OS45OGwuMzggMi42NWMuMDMuMjQuMjQuNDIuNDkuNDJoNGMuMjUgMCAuNDYtLjE4LjQ5LS40MmwuMzgtMi42NWMuNjEtLjI1IDEuMTctLjU5IDEuNjktLjk4bDIuNDkgMWMuMjMuMDkuNDkgMCAuNjEtLjIybDItMy40NmMuMTItLjIyLjA3LS40OS0uMTItLjY0bC0yLjExLTEuNjV6TTEyIDE1LjVjLTEuOTMgMC0zLjUtMS41Ny0zLjUtMy41czEuNTctMy41IDMuNS0zLjUgMy41IDEuNTcgMy41IDMuNS0xLjU3IDMuNS0zLjUgMy41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLWFwcGxpY2F0aW9ucyI+PHBhdGggZD0iTTEyIDEwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptNy03SDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uOSAyLTJWNWMwLTEuMS0uODktMi0yLTJ6bS0xLjc1IDljMCAuMjMtLjAyLjQ2LS4wNS42OGwxLjQ4IDEuMTZjLjEzLjExLjE3LjMuMDguNDVsLTEuNCAyLjQyYy0uMDkuMTUtLjI3LjIxLS40My4xNWwtMS43NC0uN2MtLjM2LjI4LS43Ni41MS0xLjE4LjY5bC0uMjYgMS44NWMtLjAzLjE3LS4xOC4zLS4zNS4zaC0yLjhjLS4xNyAwLS4zMi0uMTMtLjM1LS4yOWwtLjI2LTEuODVjLS40My0uMTgtLjgyLS40MS0xLjE4LS42OWwtMS43NC43Yy0uMTYuMDYtLjM0IDAtLjQzLS4xNWwtMS40LTIuNDJjLS4wOS0uMTUtLjA1LS4zNC4wOC0uNDVsMS40OC0xLjE2Yy0uMDMtLjIzLS4wNS0uNDYtLjA1LS42OSAwLS4yMy4wMi0uNDYuMDUtLjY4bC0xLjQ4LTEuMTZjLS4xMy0uMTEtLjE3LS4zLS4wOC0uNDVsMS40LTIuNDJjLjA5LS4xNS4yNy0uMjEuNDMtLjE1bDEuNzQuN2MuMzYtLjI4Ljc2LS41MSAxLjE4LS42OWwuMjYtMS44NWMuMDMtLjE3LjE4LS4zLjM1LS4zaDIuOGMuMTcgMCAuMzIuMTMuMzUuMjlsLjI2IDEuODVjLjQzLjE4LjgyLjQxIDEuMTguNjlsMS43NC0uN2MuMTYtLjA2LjM0IDAgLjQzLjE1bDEuNCAyLjQyYy4wOS4xNS4wNS4zNC0uMDguNDVsLTEuNDggMS4xNmMuMDMuMjMuMDUuNDYuMDUuNjl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtYmFja3VwLXJlc3RvcmUiPjxwYXRoIGQ9Ik0xNCAxMmMwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDIgLjkgMiAyIDIgMi0uOSAyLTJ6bS0yLTljLTQuOTcgMC05IDQuMDMtOSA5SDBsNCA0IDQtNEg1YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS41MSAwLTIuOTEtLjQ5LTQuMDYtMS4zbC0xLjQyIDEuNDRDOC4wNCAyMC4zIDkuOTQgMjEgMTIgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtYmx1ZXRvb3RoIj48cGF0aCBkPSJNMTEgMjRoMnYtMmgtMnYyem0tNCAwaDJ2LTJIN3Yyem04IDBoMnYtMmgtMnYyem0yLjcxLTE4LjI5TDEyIDBoLTF2Ny41OUw2LjQxIDMgNSA0LjQxIDEwLjU5IDEwIDUgMTUuNTkgNi40MSAxNyAxMSAxMi40MVYyMGgxbDUuNzEtNS43MS00LjMtNC4yOSA0LjMtNC4yOXpNMTMgMy44M2wxLjg4IDEuODhMMTMgNy41OVYzLjgzem0xLjg4IDEwLjQ2TDEzIDE2LjE3di0zLjc2bDEuODggMS44OHoiPjwvcGF0aD48L2c+CjxnIGlkPSJzZXR0aW5ncy1icmlnaHRuZXNzIj48cGF0aCBkPSJNMjEgM0gzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTYuMDFIM1Y0Ljk5aDE4djE0LjAyek04IDE2aDIuNWwxLjUgMS41IDEuNS0xLjVIMTZ2LTIuNWwxLjUtMS41LTEuNS0xLjVWOGgtMi41TDEyIDYuNSAxMC41IDhIOHYyLjVMNi41IDEyIDggMTMuNVYxNnptNC03YzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzVjl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtY2VsbCI+PHBhdGggZD0iTTcgMjRoMnYtMkg3djJ6bTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6TTE2IC4wMUw4IDBDNi45IDAgNiAuOSA2IDJ2MTZjMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjJjMC0xLjEtLjktMS45OS0yLTEuOTl6TTE2IDE2SDhWNGg4djEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLWV0aGVybmV0Ij48cGF0aCBkPSJNNy43NyA2Ljc2TDYuMjMgNS40OC44MiAxMmw1LjQxIDYuNTIgMS41NC0xLjI4TDMuNDIgMTJsNC4zNS01LjI0ek03IDEzaDJ2LTJIN3Yyem0xMC0yaC0ydjJoMnYtMnptLTYgMmgydi0yaC0ydjJ6bTYuNzctNy41MmwtMS41NCAxLjI4TDIwLjU4IDEybC00LjM1IDUuMjQgMS41NCAxLjI4TDIzLjE4IDEybC01LjQxLTYuNTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtaW5wdXQtYW50ZW5uYSI+PHBhdGggZD0iTTEyIDVjLTMuODcgMC03IDMuMTMtNyA3aDJjMC0yLjc2IDIuMjQtNSA1LTVzNSAyLjI0IDUgNWgyYzAtMy44Ny0zLjEzLTctNy03em0xIDkuMjljLjg4LS4zOSAxLjUtMS4yNiAxLjUtMi4yOSAwLTEuMzgtMS4xMi0yLjUtMi41LTIuNVM5LjUgMTAuNjIgOS41IDEyYzAgMS4wMi42MiAxLjkgMS41IDIuMjl2My4zTDcuNTkgMjEgOSAyMi40MWwzLTMgMyAzTDE2LjQxIDIxIDEzIDE3LjU5di0zLjN6TTEyIDFDNS45MyAxIDEgNS45MyAxIDEyaDJjMC00Ljk3IDQuMDMtOSA5LTlzOSA0LjAzIDkgOWgyYzAtNi4wNy00LjkzLTExLTExLTExeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLWlucHV0LWNvbXBvbmVudCI+PHBhdGggZD0iTTUgMmMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0SDF2Nmg2VjZINVYyem00IDE0YzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOGMxLjE2LS40MSAyLTEuNTEgMi0yLjgydi0ySDl2MnptLTggMGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThDNi4xNiAxOC40IDcgMTcuMyA3IDE2di0ySDF2MnpNMjEgNlYyYzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRoLTJ2Nmg2VjZoLTJ6bS04LTRjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NEg5djZoNlY2aC0yVjJ6bTQgMTRjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4YzEuMTYtLjQxIDItMS41MSAyLTIuODJ2LTJoLTZ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1jb21wb3NpdGUiPjxwYXRoIGQ9Ik01IDJjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NEgxdjZoNlY2SDVWMnptNCAxNGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThjMS4xNi0uNDEgMi0xLjUxIDItMi44MnYtMkg5djJ6bS04IDBjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4QzYuMTYgMTguNCA3IDE3LjMgNyAxNnYtMkgxdjJ6TTIxIDZWMmMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0aC0ydjZoNlY2aC0yem0tOC00YzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRIOXY2aDZWNmgtMlYyem00IDE0YzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOGMxLjE2LS40MSAyLTEuNTEgMi0yLjgydi0yaC02djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtaW5wdXQtaGRtaSI+PHBhdGggZD0iTTE4IDdWNGMwLTEuMS0uOS0yLTItMkg4Yy0xLjEgMC0yIC45LTIgMnYzSDV2NmwzIDZ2M2g4di0zbDMtNlY3aC0xek04IDRoOHYzaC0yVjVoLTF2MmgtMlY1aC0xdjJIOFY0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLWlucHV0LXN2aWRlbyI+PHBhdGggZD0iTTggMTEuNWMwLS44My0uNjctMS41LTEuNS0xLjVTNSAxMC42NyA1IDExLjUgNS42NyAxMyA2LjUgMTMgOCAxMi4zMyA4IDExLjV6bTctNWMwLS44My0uNjctMS41LTEuNS0xLjVoLTNDOS42NyA1IDkgNS42NyA5IDYuNVM5LjY3IDggMTAuNSA4aDNjLjgzIDAgMS41LS42NyAxLjUtMS41ek04LjUgMTVjLS44MyAwLTEuNS42Ny0xLjUgMS41UzcuNjcgMTggOC41IDE4czEuNS0uNjcgMS41LTEuNVM5LjMzIDE1IDguNSAxNXpNMTIgMUM1LjkzIDEgMSA1LjkzIDEgMTJzNC45MyAxMSAxMSAxMSAxMS00LjkzIDExLTExUzE4LjA3IDEgMTIgMXptMCAyMGMtNC45NiAwLTktNC4wNC05LTlzNC4wNC05IDktOSA5IDQuMDQgOSA5LTQuMDQgOS05IDl6bTUuNS0xMWMtLjgzIDAtMS41LjY3LTEuNSAxLjVzLjY3IDEuNSAxLjUgMS41IDEuNS0uNjcgMS41LTEuNS0uNjctMS41LTEuNS0xLjV6bS0yIDVjLS44MyAwLTEuNS42Ny0xLjUgMS41cy42NyAxLjUgMS41IDEuNSAxLjUtLjY3IDEuNS0xLjUtLjY3LTEuNS0xLjUtMS41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLW92ZXJzY2FuIj48cGF0aCBkPSJNMTIuMDEgNS41TDEwIDhoNGwtMS45OS0yLjV6TTE4IDEwdjRsMi41LTEuOTlMMTggMTB6TTYgMTBsLTIuNSAyLjAxTDYgMTR2LTR6bTggNmgtNGwyLjAxIDIuNUwxNCAxNnptNy0xM0gzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTYuMDFIM1Y0Ljk5aDE4djE0LjAyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLXBob25lIj48cGF0aCBkPSJNMTMgOWgtMnYyaDJWOXptNCAwaC0ydjJoMlY5em0zIDYuNWMtMS4yNSAwLTIuNDUtLjItMy41Ny0uNTctLjM1LS4xMS0uNzQtLjAzLTEuMDIuMjRsLTIuMiAyLjJjLTIuODMtMS40NC01LjE1LTMuNzUtNi41OS02LjU4bDIuMi0yLjIxYy4yOC0uMjcuMzYtLjY2LjI1LTEuMDFDOC43IDYuNDUgOC41IDUuMjUgOC41IDRjMC0uNTUtLjQ1LTEtMS0xSDRjLS41NSAwLTEgLjQ1LTEgMSAwIDkuMzkgNy42MSAxNyAxNyAxNyAuNTUgMCAxLS40NSAxLTF2LTMuNWMwLS41NS0uNDUtMS0xLTF6TTE5IDl2MmgyVjloLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtcG93ZXIiPjxwYXRoIGQ9Ik03IDI0aDJ2LTJIN3Yyem00IDBoMnYtMmgtMnYyem0yLTIyaC0ydjEwaDJWMnptMy41NiAyLjQ0bC0xLjQ1IDEuNDVDMTYuODQgNi45NCAxOCA4LjgzIDE4IDExYzAgMy4zMS0yLjY5IDYtNiA2cy02LTIuNjktNi02YzAtMi4xNyAxLjE2LTQuMDYgMi44OC01LjEyTDcuNDQgNC40NEM1LjM2IDUuODggNCA4LjI4IDQgMTFjMCA0LjQyIDMuNTggOCA4IDhzOC0zLjU4IDgtOGMwLTIuNzItMS4zNi01LjEyLTMuNDQtNi41NnpNMTUgMjRoMnYtMmgtMnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLXJlbW90ZSI+PHBhdGggZD0iTTE1IDlIOWMtLjU1IDAtMSAuNDUtMSAxdjEyYzAgLjU1LjQ1IDEgMSAxaDZjLjU1IDAgMS0uNDUgMS0xVjEwYzAtLjU1LS40NS0xLTEtMXptLTMgNmMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6TTcuMDUgNi4wNWwxLjQxIDEuNDFDOS4zNyA2LjU2IDEwLjYyIDYgMTIgNnMyLjYzLjU2IDMuNTQgMS40NmwxLjQxLTEuNDFDMTUuNjggNC43OCAxMy45MyA0IDEyIDRzLTMuNjguNzgtNC45NSAyLjA1ek0xMiAwQzguOTYgMCA2LjIxIDEuMjMgNC4yMiAzLjIybDEuNDEgMS40MUM3LjI2IDMuMDEgOS41MSAyIDEyIDJzNC43NCAxLjAxIDYuMzYgMi42NGwxLjQxLTEuNDFDMTcuNzkgMS4yMyAxNS4wNCAwIDEyIDB6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3Mtdm9pY2UiPjxwYXRoIGQ9Ik03IDI0aDJ2LTJIN3Yyem01LTExYzEuNjYgMCAyLjk5LTEuMzQgMi45OS0zTDE1IDRjMC0xLjY2LTEuMzQtMy0zLTNTOSAyLjM0IDkgNHY2YzAgMS42NiAxLjM0IDMgMyAzem0tMSAxMWgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6bTQtMTRoLTEuN2MwIDMtMi41NCA1LjEtNS4zIDUuMVM2LjcgMTMgNi43IDEwSDVjMCAzLjQxIDIuNzIgNi4yMyA2IDYuNzJWMjBoMnYtMy4yOGMzLjI4LS40OSA2LTMuMzEgNi02LjcyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNob3AiPjxwYXRoIGQ9Ik0xNiA2VjRjMC0xLjExLS44OS0yLTItMmgtNGMtMS4xMSAwLTIgLjg5LTIgMnYySDJ2MTNjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWNmgtNnptLTYtMmg0djJoLTRWNHpNOSAxOFY5bDcuNSA0TDkgMTh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2hvcC10d28iPjxwYXRoIGQ9Ik0zIDlIMXYxMWMwIDEuMTEuODkgMiAyIDJoMTRjMS4xMSAwIDItLjg5IDItMkgzVjl6bTE1LTRWM2MwLTEuMTEtLjg5LTItMi0yaC00Yy0xLjExIDAtMiAuODktMiAydjJINXYxMWMwIDEuMTEuODkgMiAyIDJoMTRjMS4xMSAwIDItLjg5IDItMlY1aC01em0tNi0yaDR2MmgtNFYzem0wIDEyVjhsNS41IDMtNS41IDR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2hvcHBpbmctYmFza2V0Ij48cGF0aCBkPSJNMTcuMjEgOWwtNC4zOC02LjU2Yy0uMTktLjI4LS41MS0uNDItLjgzLS40Mi0uMzIgMC0uNjQuMTQtLjgzLjQzTDYuNzkgOUgyYy0uNTUgMC0xIC40NS0xIDEgMCAuMDkuMDEuMTguMDQuMjdsMi41NCA5LjI3Yy4yMy44NCAxIDEuNDYgMS45MiAxLjQ2aDEzYy45MiAwIDEuNjktLjYyIDEuOTMtMS40NmwyLjU0LTkuMjdMMjMgMTBjMC0uNTUtLjQ1LTEtMS0xaC00Ljc5ek05IDlsMy00LjRMMTUgOUg5em0zIDhjLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNob3BwaW5nLWNhcnQiPjxwYXRoIGQ9Ik03IDE4Yy0xLjEgMC0xLjk5LjktMS45OSAyUzUuOSAyMiA3IDIyczItLjkgMi0yLS45LTItMi0yek0xIDJ2MmgybDMuNiA3LjU5LTEuMzUgMi40NWMtLjE2LjI4LS4yNS42MS0uMjUuOTYgMCAxLjEuOSAyIDIgMmgxMnYtMkg3LjQyYy0uMTQgMC0uMjUtLjExLS4yNS0uMjVsLjAzLS4xMi45LTEuNjNoNy40NWMuNzUgMCAxLjQxLS40MSAxLjc1LTEuMDNsMy41OC02LjQ5Yy4wOC0uMTQuMTItLjMxLjEyLS40OCAwLS41NS0uNDUtMS0xLTFINS4yMWwtLjk0LTJIMXptMTYgMTZjLTEuMSAwLTEuOTkuOS0xLjk5IDJzLjg5IDIgMS45OSAyIDItLjkgMi0yLS45LTItMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNvcnQiPjxwYXRoIGQ9Ik0zIDE4aDZ2LTJIM3Yyek0zIDZ2MmgxOFY2SDN6bTAgN2gxMnYtMkgzdjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3BlYWtlci1ub3RlcyI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek04IDE0SDZ2LTJoMnYyem0wLTNINlY5aDJ2MnptMC0zSDZWNmgydjJ6bTcgNmgtNXYtMmg1djJ6bTMtM2gtOFY5aDh2MnptMC0zaC04VjZoOHYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNwZWFrZXItbm90ZXMtb2ZmIj48cGF0aCBkPSJNMTAuNTQgMTFsLS41NC0uNTRMNy41NCA4IDYgNi40NiAyLjM4IDIuODQgMS4yNyAxLjczIDAgM2wyLjAxIDIuMDFMMiAyMmw0LTRoOWw1LjczIDUuNzNMMjIgMjIuNDYgMTcuNTQgMThsLTctN3pNOCAxNEg2di0yaDJ2MnptLTItM1Y5bDIgMkg2em0xNC05SDQuMDhMMTAgNy45MlY2aDh2MmgtNy45MmwxIDFIMTh2MmgtNC45Mmw2Ljk5IDYuOTlDMjEuMTQgMTcuOTUgMjIgMTcuMDggMjIgMTZWNGMwLTEuMS0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJzcGVsbGNoZWNrIj48cGF0aCBkPSJNMTIuNDUgMTZoMi4wOUw5LjQzIDNINy41N0wyLjQ2IDE2aDIuMDlsMS4xMi0zaDUuNjRsMS4xNCAzem0tNi4wMi01TDguNSA1LjQ4IDEwLjU3IDExSDYuNDN6bTE1LjE2LjU5bC04LjA5IDguMDlMOS44MyAxNmwtMS40MSAxLjQxIDUuMDkgNS4wOUwyMyAxM2wtMS40MS0xLjQxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InN0YXIiPjxwYXRoIGQ9Ik0xMiAxNy4yN0wxOC4xOCAyMWwtMS42NC03LjAzTDIyIDkuMjRsLTcuMTktLjYxTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJzdGFyLWJvcmRlciI+PHBhdGggZD0iTTIyIDkuMjRsLTcuMTktLjYyTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMSAxMiAxNy4yNyAxOC4xOCAyMWwtMS42My03LjAzTDIyIDkuMjR6TTEyIDE1LjRsLTMuNzYgMi4yNyAxLTQuMjgtMy4zMi0yLjg4IDQuMzgtLjM4TDEyIDYuMWwxLjcxIDQuMDQgNC4zOC4zOC0zLjMyIDIuODggMSA0LjI4TDEyIDE1LjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3Rhci1oYWxmIj48cGF0aCBkPSJNMjIgOS4yNGwtNy4xOS0uNjJMMTIgMiA5LjE5IDguNjMgMiA5LjI0bDUuNDYgNC43M0w1LjgyIDIxIDEyIDE3LjI3IDE4LjE4IDIxbC0xLjYzLTcuMDNMMjIgOS4yNHpNMTIgMTUuNFY2LjFsMS43MSA0LjA0IDQuMzguMzgtMy4zMiAyLjg4IDEgNC4yOEwxMiAxNS40eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InN0YXJzIj48cGF0aCBkPSJNMTEuOTkgMkM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnptNC4yNCAxNkwxMiAxNS40NSA3Ljc3IDE4bDEuMTItNC44MS0zLjczLTMuMjMgNC45Mi0uNDJMMTIgNWwxLjkyIDQuNTMgNC45Mi40Mi0zLjczIDMuMjNMMTYuMjMgMTh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3RvcmUiPjxwYXRoIGQ9Ik0yMCA0SDR2MmgxNlY0em0xIDEwdi0ybC0xLTVINGwtMSA1djJoMXY2aDEwdi02aDR2Nmgydi02aDF6bS05IDRINnYtNGg2djR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3ViZGlyZWN0b3J5LWFycm93LWxlZnQiPjxwYXRoIGQ9Ik0xMSA5bDEuNDIgMS40Mkw4LjgzIDE0SDE4VjRoMnYxMkg4LjgzbDMuNTkgMy41OEwxMSAyMWwtNi02IDYtNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJzdWJkaXJlY3RvcnktYXJyb3ctcmlnaHQiPjxwYXRoIGQ9Ik0xOSAxNWwtNiA2LTEuNDItMS40MkwxNS4xNyAxNkg0VjRoMnYxMGg5LjE3bC0zLjU5LTMuNThMMTMgOWw2IDZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3ViamVjdCI+PHBhdGggZD0iTTE0IDE3SDR2MmgxMHYtMnptNi04SDR2MmgxNlY5ek00IDE1aDE2di0ySDR2MnpNNCA1djJoMTZWNUg0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InN1cGVydmlzb3ItYWNjb3VudCI+PHBhdGggZD0iTTE2LjUgMTJjMS4zOCAwIDIuNDktMS4xMiAyLjQ5LTIuNVMxNy44OCA3IDE2LjUgN0MxNS4xMiA3IDE0IDguMTIgMTQgOS41czEuMTIgMi41IDIuNSAyLjV6TTkgMTFjMS42NiAwIDIuOTktMS4zNCAyLjk5LTNTMTAuNjYgNSA5IDVDNy4zNCA1IDYgNi4zNCA2IDhzMS4zNCAzIDMgM3ptNy41IDNjLTEuODMgMC01LjUuOTItNS41IDIuNzVWMTloMTF2LTIuMjVjMC0xLjgzLTMuNjctMi43NS01LjUtMi43NXpNOSAxM2MtMi4zMyAwLTcgMS4xNy03IDMuNVYxOWg3di0yLjI1YzAtLjg1LjMzLTIuMzQgMi4zNy0zLjQ3QzEwLjUgMTMuMSA5LjY2IDEzIDkgMTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3dhcC1ob3JpeiI+PHBhdGggZD0iTTYuOTkgMTFMMyAxNWwzLjk5IDR2LTNIMTR2LTJINi45OXYtM3pNMjEgOWwtMy45OS00djNIMTB2Mmg3LjAxdjNMMjEgOXoiPjwvcGF0aD48L2c+CjxnIGlkPSJzd2FwLXZlcnQiPjxwYXRoIGQ9Ik0xNiAxNy4wMVYxMGgtMnY3LjAxaC0zTDE1IDIxbDQtMy45OWgtM3pNOSAzTDUgNi45OWgzVjE0aDJWNi45OWgzTDkgM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJzd2FwLXZlcnRpY2FsLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6TTYuNSA5TDEwIDUuNSAxMy41IDlIMTF2NEg5VjlINi41em0xMSA2TDE0IDE4LjUgMTAuNSAxNUgxM3YtNGgydjRoMi41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InN5c3RlbS11cGRhdGUtYWx0Ij48cGF0aCBkPSJNMTIgMTYuNWw0LTRoLTN2LTloLTJ2OUg4bDQgNHptOS0xM2gtNnYxLjk5aDZ2MTQuMDNIM1Y1LjQ5aDZWMy41SDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJ2LTE0YzAtMS4xLS45LTItMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRhYiI+PHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDNWNWgxMHY0aDh2MTB6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idGFiLXVuc2VsZWN0ZWQiPjxwYXRoIGQ9Ik0xIDloMlY3SDF2MnptMCA0aDJ2LTJIMXYyem0wLThoMlYzYy0xLjEgMC0yIC45LTIgMnptOCAxNmgydi0ySDl2MnptLTgtNGgydi0ySDF2MnptMiA0di0ySDFjMCAxLjEuOSAyIDIgMnpNMjEgM2gtOHY2aDEwVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTRoMnYtMmgtMnYyek05IDVoMlYzSDl2MnpNNSAyMWgydi0ySDV2MnpNNSA1aDJWM0g1djJ6bTE2IDE2YzEuMSAwIDItLjkgMi0yaC0ydjJ6bTAtOGgydi0yaC0ydjJ6bS04IDhoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRleHQtZm9ybWF0Ij48cGF0aCBkPSJNNSAxN3YyaDE0di0ySDV6bTQuNS00LjJoNWwuOSAyLjJoMi4xTDEyLjc1IDRoLTEuNUw2LjUgMTVoMi4xbC45LTIuMnpNMTIgNS45OEwxMy44NyAxMWgtMy43NEwxMiA1Ljk4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRoZWF0ZXJzIj48cGF0aCBkPSJNMTggM3YyaC0yVjNIOHYySDZWM0g0djE4aDJ2LTJoMnYyaDh2LTJoMnYyaDJWM2gtMnpNOCAxN0g2di0yaDJ2MnptMC00SDZ2LTJoMnYyem0wLTRINlY3aDJ2MnptMTAgOGgtMnYtMmgydjJ6bTAtNGgtMnYtMmgydjJ6bTAtNGgtMlY3aDJ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0aHVtYi1kb3duIj48cGF0aCBkPSJNMTUgM0g2Yy0uODMgMC0xLjU0LjUtMS44NCAxLjIybC0zLjAyIDcuMDVjLS4wOS4yMy0uMTQuNDctLjE0LjczdjEuOTFsLjAxLjAxTDEgMTRjMCAxLjEuOSAyIDIgMmg2LjMxbC0uOTUgNC41Ny0uMDMuMzJjMCAuNDEuMTcuNzkuNDQgMS4wNkw5LjgzIDIzbDYuNTktNi41OWMuMzYtLjM2LjU4LS44Ni41OC0xLjQxVjVjMC0xLjEtLjktMi0yLTJ6bTQgMHYxMmg0VjNoLTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idGh1bWItdXAiPjxwYXRoIGQ9Ik0xIDIxaDRWOUgxdjEyem0yMi0xMWMwLTEuMS0uOS0yLTItMmgtNi4zMWwuOTUtNC41Ny4wMy0uMzJjMC0uNDEtLjE3LS43OS0uNDQtMS4wNkwxNC4xNyAxIDcuNTkgNy41OUM3LjIyIDcuOTUgNyA4LjQ1IDcgOXYxMGMwIDEuMS45IDIgMiAyaDljLjgzIDAgMS41NC0uNSAxLjg0LTEuMjJsMy4wMi03LjA1Yy4wOS0uMjMuMTQtLjQ3LjE0LS43M3YtMS45MWwtLjAxLS4wMUwyMyAxMHoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0aHVtYnMtdXAtZG93biI+PHBhdGggZD0iTTEyIDZjMC0uNTUtLjQ1LTEtMS0xSDUuODJsLjY2LTMuMTguMDItLjIzYzAtLjMxLS4xMy0uNTktLjMzLS44TDUuMzggMCAuNDQgNC45NEMuMTcgNS4yMSAwIDUuNTkgMCA2djYuNWMwIC44My42NyAxLjUgMS41IDEuNWg2Ljc1Yy42MiAwIDEuMTUtLjM4IDEuMzgtLjkxbDIuMjYtNS4yOWMuMDctLjE3LjExLS4zNi4xMS0uNTVWNnptMTAuNSA0aC02Ljc1Yy0uNjIgMC0xLjE1LjM4LTEuMzguOTFsLTIuMjYgNS4yOWMtLjA3LjE3LS4xMS4zNi0uMTEuNTVWMThjMCAuNTUuNDUgMSAxIDFoNS4xOGwtLjY2IDMuMTgtLjAyLjI0YzAgLjMxLjEzLjU5LjMzLjhsLjc5Ljc4IDQuOTQtNC45NGMuMjctLjI3LjQ0LS42NS40NC0xLjA2di02LjVjMC0uODMtLjY3LTEuNS0xLjUtMS41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRpbWVsaW5lIj48cGF0aCBkPSJNMjMgOGMwIDEuMS0uOSAyLTIgMi0uMTggMC0uMzUtLjAyLS41MS0uMDdsLTMuNTYgMy41NWMuMDUuMTYuMDcuMzQuMDcuNTIgMCAxLjEtLjkgMi0yIDJzLTItLjktMi0yYzAtLjE4LjAyLS4zNi4wNy0uNTJsLTIuNTUtMi41NWMtLjE2LjA1LS4zNC4wNy0uNTIuMDdzLS4zNi0uMDItLjUyLS4wN2wtNC41NSA0LjU2Yy4wNS4xNi4wNy4zMy4wNy41MSAwIDEuMS0uOSAyLTIgMnMtMi0uOS0yLTIgLjktMiAyLTJjLjE4IDAgLjM1LjAyLjUxLjA3bDQuNTYtNC41NUM4LjAyIDkuMzYgOCA5LjE4IDggOWMwLTEuMS45LTIgMi0yczIgLjkgMiAyYzAgLjE4LS4wMi4zNi0uMDcuNTJsMi41NSAyLjU1Yy4xNi0uMDUuMzQtLjA3LjUyLS4wN3MuMzYuMDIuNTIuMDdsMy41NS0zLjU2QzE5LjAyIDguMzUgMTkgOC4xOCAxOSA4YzAtMS4xLjktMiAyLTJzMiAuOSAyIDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idG9jIj48cGF0aCBkPSJNMyA5aDE0VjdIM3Yyem0wIDRoMTR2LTJIM3Yyem0wIDRoMTR2LTJIM3Yyem0xNiAwaDJ2LTJoLTJ2MnptMC0xMHYyaDJWN2gtMnptMCA2aDJ2LTJoLTJ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0b2RheSI+PHBhdGggZD0iTTE5IDNoLTFWMWgtMnYySDhWMUg2djJINWMtMS4xMSAwLTEuOTkuOS0xLjk5IDJMMyAxOWMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDVWOGgxNHYxMXpNNyAxMGg1djVIN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJ0b2xsIj48cGF0aCBkPSJNMTUgNGMtNC40MiAwLTggMy41OC04IDhzMy41OCA4IDggOCA4LTMuNTggOC04LTMuNTgtOC04LTh6bTAgMTRjLTMuMzEgMC02LTIuNjktNi02czIuNjktNiA2LTYgNiAyLjY5IDYgNi0yLjY5IDYtNiA2ek0zIDEyYzAtMi42MSAxLjY3LTQuODMgNC01LjY1VjQuMjZDMy41NSA1LjE1IDEgOC4yNyAxIDEyczIuNTUgNi44NSA2IDcuNzR2LTIuMDljLTIuMzMtLjgyLTQtMy4wNC00LTUuNjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idG91Y2gtYXBwIj48cGF0aCBkPSJNOSAxMS4yNFY3LjVDOSA2LjEyIDEwLjEyIDUgMTEuNSA1UzE0IDYuMTIgMTQgNy41djMuNzRjMS4yMS0uODEgMi0yLjE4IDItMy43NEMxNiA1LjAxIDEzLjk5IDMgMTEuNSAzUzcgNS4wMSA3IDcuNWMwIDEuNTYuNzkgMi45MyAyIDMuNzR6bTkuODQgNC42M2wtNC41NC0yLjI2Yy0uMTctLjA3LS4zNS0uMTEtLjU0LS4xMUgxM3YtNmMwLS44My0uNjctMS41LTEuNS0xLjVTMTAgNi42NyAxMCA3LjV2MTAuNzRsLTMuNDMtLjcyYy0uMDgtLjAxLS4xNS0uMDMtLjI0LS4wMy0uMzEgMC0uNTkuMTMtLjc5LjMzbC0uNzkuOCA0Ljk0IDQuOTRjLjI3LjI3LjY1LjQ0IDEuMDYuNDRoNi43OWMuNzUgMCAxLjMzLS41NSAxLjQ0LTEuMjhsLjc1LTUuMjdjLjAxLS4wNy4wMi0uMTQuMDItLjIgMC0uNjItLjM4LTEuMTYtLjkxLTEuMzh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idHJhY2stY2hhbmdlcyI+PHBhdGggZD0iTTE5LjA3IDQuOTNsLTEuNDEgMS40MUMxOS4xIDcuNzkgMjAgOS43OSAyMCAxMmMwIDQuNDItMy41OCA4LTggOHMtOC0zLjU4LTgtOGMwLTQuMDggMy4wNS03LjQ0IDctNy45M3YyLjAyQzguMTYgNi41NyA2IDkuMDMgNiAxMmMwIDMuMzEgMi42OSA2IDYgNnM2LTIuNjkgNi02YzAtMS42Ni0uNjctMy4xNi0xLjc2LTQuMjRsLTEuNDEgMS40MUMxNS41NSA5LjkgMTYgMTAuOSAxNiAxMmMwIDIuMjEtMS43OSA0LTQgNHMtNC0xLjc5LTQtNGMwLTEuODYgMS4yOC0zLjQxIDMtMy44NnYyLjE0Yy0uNi4zNS0xIC45OC0xIDEuNzIgMCAxLjEuOSAyIDIgMnMyLS45IDItMmMwLS43NC0uNC0xLjM4LTEtMS43MlYyaC0xQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBjMC0yLjc2LTEuMTItNS4yNi0yLjkzLTcuMDd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idHJhbnNsYXRlIj48cGF0aCBkPSJNMTIuODcgMTUuMDdsLTIuNTQtMi41MS4wMy0uMDNjMS43NC0xLjk0IDIuOTgtNC4xNyAzLjcxLTYuNTNIMTdWNGgtN1YySDh2MkgxdjEuOTloMTEuMTdDMTEuNSA3LjkyIDEwLjQ0IDkuNzUgOSAxMS4zNSA4LjA3IDEwLjMyIDcuMyA5LjE5IDYuNjkgOGgtMmMuNzMgMS42MyAxLjczIDMuMTcgMi45OCA0LjU2bC01LjA5IDUuMDJMNCAxOWw1LTUgMy4xMSAzLjExLjc2LTIuMDR6TTE4LjUgMTBoLTJMMTIgMjJoMmwxLjEyLTNoNC43NUwyMSAyMmgybC00LjUtMTJ6bS0yLjYyIDdsMS42Mi00LjMzTDE5LjEyIDE3aC0zLjI0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRyZW5kaW5nLWRvd24iPjxwYXRoIGQ9Ik0xNiAxOGwyLjI5LTIuMjktNC44OC00Ljg4LTQgNEwyIDcuNDEgMy40MSA2bDYgNiA0LTQgNi4zIDYuMjlMMjIgMTJ2NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0cmVuZGluZy1mbGF0Ij48cGF0aCBkPSJNMjIgMTJsLTQtNHYzSDN2MmgxNXYzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRyZW5kaW5nLXVwIj48cGF0aCBkPSJNMTYgNmwyLjI5IDIuMjktNC44OCA0Ljg4LTQtNEwyIDE2LjU5IDMuNDEgMThsNi02IDQgNCA2LjMtNi4yOUwyMiAxMlY2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InR1cm5lZC1pbiI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0dXJuZWQtaW4tbm90Ij48cGF0aCBkPSJNMTcgM0g3Yy0xLjEgMC0xLjk5LjktMS45OSAyTDUgMjFsNy0zIDcgM1Y1YzAtMS4xLS45LTItMi0yem0wIDE1bC01LTIuMThMNyAxOFY1aDEwdjEzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InVuYXJjaGl2ZSI+PHBhdGggZD0iTTIwLjU1IDUuMjJsLTEuMzktMS42OEMxOC44OCAzLjIxIDE4LjQ3IDMgMTggM0g2Yy0uNDcgMC0uODguMjEtMS4xNS41NUwzLjQ2IDUuMjJDMy4xNyA1LjU3IDMgNi4wMSAzIDYuNVYxOWMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2LjVjMC0uNDktLjE3LS45My0uNDUtMS4yOHpNMTIgOS41bDUuNSA1LjVIMTR2MmgtNHYtMkg2LjVMMTIgOS41ek01LjEyIDVsLjgyLTFoMTJsLjkzIDFINS4xMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ1bmRvIj48cGF0aCBkPSJNMTIuNSA4Yy0yLjY1IDAtNS4wNS45OS02LjkgMi42TDIgN3Y5aDlsLTMuNjItMy42MmMxLjM5LTEuMTYgMy4xNi0xLjg4IDUuMTItMS44OCAzLjU0IDAgNi41NSAyLjMxIDcuNiA1LjVsMi4zNy0uNzhDMjEuMDggMTEuMDMgMTcuMTUgOCAxMi41IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idW5mb2xkLWxlc3MiPjxwYXRoIGQ9Ik03LjQxIDE4LjU5TDguODMgMjAgMTIgMTYuODMgMTUuMTcgMjBsMS40MS0xLjQxTDEyIDE0bC00LjU5IDQuNTl6bTkuMTgtMTMuMThMMTUuMTcgNCAxMiA3LjE3IDguODMgNCA3LjQxIDUuNDEgMTIgMTBsNC41OS00LjU5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InVuZm9sZC1tb3JlIj48cGF0aCBkPSJNMTIgNS44M0wxNS4xNyA5bDEuNDEtMS40MUwxMiAzIDcuNDEgNy41OSA4LjgzIDkgMTIgNS44M3ptMCAxMi4zNEw4LjgzIDE1bC0xLjQxIDEuNDFMMTIgMjFsNC41OS00LjU5TDE1LjE3IDE1IDEyIDE4LjE3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InVwZGF0ZSI+PHBhdGggZD0iTTIxIDEwLjEyaC02Ljc4bDIuNzQtMi44MmMtMi43My0yLjctNy4xNS0yLjgtOS44OC0uMS0yLjczIDIuNzEtMi43MyA3LjA4IDAgOS43OSAyLjczIDIuNzEgNy4xNSAyLjcxIDkuODggMEMxOC4zMiAxNS42NSAxOSAxNC4wOCAxOSAxMi4xaDJjMCAxLjk4LS44OCA0LjU1LTIuNjQgNi4yOS0zLjUxIDMuNDgtOS4yMSAzLjQ4LTEyLjcyIDAtMy41LTMuNDctMy41My05LjExLS4wMi0xMi41OCAzLjUxLTMuNDcgOS4xNC0zLjQ3IDEyLjY1IDBMMjEgM3Y3LjEyek0xMi41IDh2NC4yNWwzLjUgMi4wOC0uNzIgMS4yMUwxMSAxM1Y4aDEuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2ZXJpZmllZC11c2VyIj48cGF0aCBkPSJNMTIgMUwzIDV2NmMwIDUuNTUgMy44NCAxMC43NCA5IDEyIDUuMTYtMS4yNiA5LTYuNDUgOS0xMlY1bC05LTR6bS0yIDE2bC00LTQgMS40MS0xLjQxTDEwIDE0LjE3bDYuNTktNi41OUwxOCA5bC04IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idmlldy1hZ2VuZGEiPjxwYXRoIGQ9Ik0yMCAxM0gzYy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxN2MuNTUgMCAxLS40NSAxLTF2LTZjMC0uNTUtLjQ1LTEtMS0xem0wLTEwSDNjLS41NSAwLTEgLjQ1LTEgMXY2YzAgLjU1LjQ1IDEgMSAxaDE3Yy41NSAwIDEtLjQ1IDEtMVY0YzAtLjU1LS40NS0xLTEtMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aWV3LWFycmF5Ij48cGF0aCBkPSJNNCAxOGgzVjVINHYxM3pNMTggNXYxM2gzVjVoLTN6TTggMThoOVY1SDh2MTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idmlldy1jYXJvdXNlbCI+PHBhdGggZD0iTTcgMTloMTBWNEg3djE1em0tNS0yaDRWNkgydjExek0xOCA2djExaDRWNmgtNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aWV3LWNvbHVtbiI+PHBhdGggZD0iTTEwIDE4aDVWNWgtNXYxM3ptLTYgMGg1VjVINHYxM3pNMTYgNXYxM2g1VjVoLTV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idmlldy1kYXkiPjxwYXRoIGQ9Ik0yIDIxaDE5di0zSDJ2M3pNMjAgOEgzYy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxN2MuNTUgMCAxLS40NSAxLTFWOWMwLS41NS0uNDUtMS0xLTF6TTIgM3YzaDE5VjNIMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aWV3LWhlYWRsaW5lIj48cGF0aCBkPSJNNCAxNWgxNnYtMkg0djJ6bTAgNGgxNnYtMkg0djJ6bTAtOGgxNlY5SDR2MnptMC02djJoMTZWNUg0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InZpZXctbGlzdCI+PHBhdGggZD0iTTQgMTRoNHYtNEg0djR6bTAgNWg0di00SDR2NHpNNCA5aDRWNUg0djR6bTUgNWgxMnYtNEg5djR6bTAgNWgxMnYtNEg5djR6TTkgNXY0aDEyVjVIOXoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aWV3LW1vZHVsZSI+PHBhdGggZD0iTTQgMTFoNVY1SDR2NnptMCA3aDV2LTZINHY2em02IDBoNXYtNmgtNXY2em02IDBoNXYtNmgtNXY2em0tNi03aDVWNWgtNXY2em02LTZ2Nmg1VjVoLTV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idmlldy1xdWlsdCI+PHBhdGggZD0iTTEwIDE4aDV2LTZoLTV2NnptLTYgMGg1VjVINHYxM3ptMTIgMGg1di02aC01djZ6TTEwIDV2NmgxMVY1SDEweiI+PC9wYXRoPjwvZz4KPGcgaWQ9InZpZXctc3RyZWFtIj48cGF0aCBkPSJNNCAxOGgxN3YtNkg0djZ6TTQgNXY2aDE3VjVINHoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aWV3LXdlZWsiPjxwYXRoIGQ9Ik02IDVIM2MtLjU1IDAtMSAuNDUtMSAxdjEyYzAgLjU1LjQ1IDEgMSAxaDNjLjU1IDAgMS0uNDUgMS0xVjZjMC0uNTUtLjQ1LTEtMS0xem0xNCAwaC0zYy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoM2MuNTUgMCAxLS40NSAxLTFWNmMwLS41NS0uNDUtMS0xLTF6bS03IDBoLTNjLS41NSAwLTEgLjQ1LTEgMXYxMmMwIC41NS40NSAxIDEgMWgzYy41NSAwIDEtLjQ1IDEtMVY2YzAtLjU1LS40NS0xLTEtMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aXNpYmlsaXR5Ij48cGF0aCBkPSJNMTIgNC41QzcgNC41IDIuNzMgNy42MSAxIDEyYzEuNzMgNC4zOSA2IDcuNSAxMSA3LjVzOS4yNy0zLjExIDExLTcuNWMtMS43My00LjM5LTYtNy41LTExLTcuNXpNMTIgMTdjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1em0wLThjLTEuNjYgMC0zIDEuMzQtMyAzczEuMzQgMyAzIDMgMy0xLjM0IDMtMy0xLjM0LTMtMy0zeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InZpc2liaWxpdHktb2ZmIj48cGF0aCBkPSJNMTIgN2MyLjc2IDAgNSAyLjI0IDUgNSAwIC42NS0uMTMgMS4yNi0uMzYgMS44M2wyLjkyIDIuOTJjMS41MS0xLjI2IDIuNy0yLjg5IDMuNDMtNC43NS0xLjczLTQuMzktNi03LjUtMTEtNy41LTEuNCAwLTIuNzQuMjUtMy45OC43bDIuMTYgMi4xNkMxMC43NCA3LjEzIDExLjM1IDcgMTIgN3pNMiA0LjI3bDIuMjggMi4yOC40Ni40NkMzLjA4IDguMyAxLjc4IDEwLjAyIDEgMTJjMS43MyA0LjM5IDYgNy41IDExIDcuNSAxLjU1IDAgMy4wMy0uMyA0LjM4LS44NGwuNDIuNDJMMTkuNzMgMjIgMjEgMjAuNzMgMy4yNyAzIDIgNC4yN3pNNy41MyA5LjhsMS41NSAxLjU1Yy0uMDUuMjEtLjA4LjQzLS4wOC42NSAwIDEuNjYgMS4zNCAzIDMgMyAuMjIgMCAuNDQtLjAzLjY1LS4wOGwxLjU1IDEuNTVjLS42Ny4zMy0xLjQxLjUzLTIuMi41My0yLjc2IDAtNS0yLjI0LTUtNSAwLS43OS4yLTEuNTMuNTMtMi4yem00LjMxLS43OGwzLjE1IDMuMTUuMDItLjE2YzAtMS42Ni0xLjM0LTMtMy0zbC0uMTcuMDF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0id2FybmluZyI+PHBhdGggZD0iTTEgMjFoMjJMMTIgMiAxIDIxem0xMi0zaC0ydi0yaDJ2MnptMC00aC0ydi00aDJ2NHoiPjwvcGF0aD48L2c+CjxnIGlkPSJ3YXRjaC1sYXRlciI+PHBhdGggZD0iTTEyIDJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyem00LjIgMTQuMkwxMSAxM1Y3aDEuNXY1LjJsNC41IDIuNy0uOCAxLjN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0id2Vla2VuZCI+PHBhdGggZD0iTTIxIDEwYy0xLjEgMC0yIC45LTIgMnYzSDV2LTNjMC0xLjEtLjktMi0yLTJzLTIgLjktMiAydjVjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMnYtNWMwLTEuMS0uOS0yLTItMnptLTMtNUg2Yy0xLjEgMC0yIC45LTIgMnYyLjE1YzEuMTYuNDEgMiAxLjUxIDIgMi44MlYxNGgxMnYtMi4wM2MwLTEuMy44NC0yLjQgMi0yLjgyVjdjMC0xLjEtLjktMi0yLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0id29yayI+PHBhdGggZD0iTTIwIDZoLTRWNGMwLTEuMTEtLjg5LTItMi0yaC00Yy0xLjExIDAtMiAuODktMiAydjJINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMTljMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWOGMwLTEuMTEtLjg5LTItMi0yem0tNiAwaC00VjRoNHYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InlvdXR1YmUtc2VhcmNoZWQtZm9yIj48cGF0aCBkPSJNMTcuMDEgMTRoLS44bC0uMjctLjI3Yy45OC0xLjE0IDEuNTctMi42MSAxLjU3LTQuMjMgMC0zLjU5LTIuOTEtNi41LTYuNS02LjVzLTYuNSAzLTYuNSA2LjVIMmwzLjg0IDQgNC4xNi00SDYuNTFDNi41MSA3IDguNTMgNSAxMS4wMSA1czQuNSAyLjAxIDQuNSA0LjVjMCAyLjQ4LTIuMDIgNC41LTQuNSA0LjUtLjY1IDAtMS4yNi0uMTQtMS44Mi0uMzhMNy43MSAxNS4xYy45Ny41NyAyLjA5LjkgMy4zLjkgMS42MSAwIDMuMDgtLjU5IDQuMjItMS41N2wuMjcuMjd2Ljc5bDUuMDEgNC45OUwyMiAxOWwtNC45OS01eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Inpvb20taW4iPjxwYXRoIGQ9Ik0xNS41IDE0aC0uNzlsLS4yOC0uMjdDMTUuNDEgMTIuNTkgMTYgMTEuMTEgMTYgOS41IDE2IDUuOTEgMTMuMDkgMyA5LjUgM1MzIDUuOTEgMyA5LjUgNS45MSAxNiA5LjUgMTZjMS42MSAwIDMuMDktLjU5IDQuMjMtMS41N2wuMjcuMjh2Ljc5bDUgNC45OUwyMC40OSAxOWwtNC45OS01em0tNiAwQzcuMDEgMTQgNSAxMS45OSA1IDkuNVM3LjAxIDUgOS41IDUgMTQgNy4wMSAxNCA5LjUgMTEuOTkgMTQgOS41IDE0em0yLjUtNGgtMnYySDl2LTJIN1Y5aDJWN2gxdjJoMnYxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Inpvb20tb3V0Ij48cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHpNNyA5aDV2MUg3eiI+PC9wYXRoPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+YDtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKE1vLmNvbnRlbnQpOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KdmFyIEVvPXsiVSswMDA4IjoiYmFja3NwYWNlIiwiVSswMDA5IjoidGFiIiwiVSswMDFCIjoiZXNjIiwiVSswMDIwIjoic3BhY2UiLCJVKzAwN0YiOiJkZWwifSxUbz17ODoiYmFja3NwYWNlIiw5OiJ0YWIiLDEzOiJlbnRlciIsMjc6ImVzYyIsMzM6InBhZ2V1cCIsMzQ6InBhZ2Vkb3duIiwzNToiZW5kIiwzNjoiaG9tZSIsMzI6InNwYWNlIiwzNzoibGVmdCIsMzg6InVwIiwzOToicmlnaHQiLDQwOiJkb3duIiw0NjoiZGVsIiwxMDY6IioifSxDbz17c2hpZnQ6InNoaWZ0S2V5IixjdHJsOiJjdHJsS2V5IixhbHQ6ImFsdEtleSIsbWV0YToibWV0YUtleSJ9LEFvPS9bYS16MC05Kl0vLGtvPS9VXCsvLExvPS9eYXJyb3cvLFBvPS9ec3BhY2UoYmFyKT8vLE5vPS9eZXNjYXBlJC87ZnVuY3Rpb24gSW8odCxlKXt2YXIgbj0iIjtpZih0KXt2YXIgaT10LnRvTG93ZXJDYXNlKCk7IiAiPT09aXx8UG8udGVzdChpKT9uPSJzcGFjZSI6Tm8udGVzdChpKT9uPSJlc2MiOjE9PWkubGVuZ3RoP2UmJiFBby50ZXN0KGkpfHwobj1pKTpuPUxvLnRlc3QoaSk/aS5yZXBsYWNlKCJhcnJvdyIsIiIpOiJtdWx0aXBseSI9PWk/IioiOml9cmV0dXJuIG59ZnVuY3Rpb24gUm8odCxlKXtyZXR1cm4oZnVuY3Rpb24gbih0LGUpe3JldHVybiB0LmtleT9Jbyh0LmtleSxlKTp0LmRldGFpbCYmdC5kZXRhaWwua2V5P0lvKHQuZGV0YWlsLmtleSxlKTooZnVuY3Rpb24gbih0KXt2YXIgZT0iIjtyZXR1cm4gdCYmKHQgaW4gRW8/ZT1Fb1t0XTprby50ZXN0KHQpPyh0PXBhcnNlSW50KHQucmVwbGFjZSgiVSsiLCIweCIpLDE2KSxlPVN0cmluZy5mcm9tQ2hhckNvZGUodCkudG9Mb3dlckNhc2UoKSk6ZT10LnRvTG93ZXJDYXNlKCkpLGV9KSh0LmtleUlkZW50aWZpZXIpfHwoZnVuY3Rpb24gaSh0KXt2YXIgZT0iIjtyZXR1cm4gTnVtYmVyKHQpJiYoZT10Pj02NSYmdDw9OTA/U3RyaW5nLmZyb21DaGFyQ29kZSgzMit0KTp0Pj0xMTImJnQ8PTEyMz8iZiIrKHQtMTEyKzEpOnQ+PTQ4JiZ0PD01Nz9TdHJpbmcodC00OCk6dD49OTYmJnQ8PTEwNT9TdHJpbmcodC05Nik6VG9bdF0pLGV9KSh0LmtleUNvZGUpfHwiIn0pKGUsdC5oYXNNb2RpZmllcnMpPT09dC5rZXkmJighdC5oYXNNb2RpZmllcnN8fCEhZS5zaGlmdEtleT09ISF0LnNoaWZ0S2V5JiYhIWUuY3RybEtleT09ISF0LmN0cmxLZXkmJiEhZS5hbHRLZXk9PSEhdC5hbHRLZXkmJiEhZS5tZXRhS2V5PT0hIXQubWV0YUtleSl9ZnVuY3Rpb24gT28odCl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KCIgIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4oZnVuY3Rpb24gZSh0KXtyZXR1cm4gMT09PXQubGVuZ3RoP3tjb21ibzp0LGtleTp0LGV2ZW50OiJrZXlkb3duIn06dC5zcGxpdCgiKyIpLnJlZHVjZSgoZnVuY3Rpb24odCxlKXt2YXIgbj1lLnNwbGl0KCI6IiksaT1uWzBdLHI9blsxXTtyZXR1cm4gaSBpbiBDbz8odFtDb1tpXV09ITAsdC5oYXNNb2RpZmllcnM9ITApOih0LmtleT1pLHQuZXZlbnQ9cnx8ImtleWRvd24iKSx0fSkse2NvbWJvOnQuc3BsaXQoIjoiKS5zaGlmdCgpfSl9KSh0KX0pKX1jb25zdCB6bz17cHJvcGVydGllczp7a2V5RXZlbnRUYXJnZXQ6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSxzdG9wS2V5Ym9hcmRFdmVudFByb3BhZ2F0aW9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9ib3VuZEtleUhhbmRsZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxfaW1wZXJhdGl2ZUtleUJpbmRpbmdzOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX19LG9ic2VydmVyczpbIl9yZXNldEtleUV2ZW50TGlzdGVuZXJzKGtleUV2ZW50VGFyZ2V0LCBfYm91bmRLZXlIYW5kbGVycykiXSxrZXlCaW5kaW5nczp7fSxyZWdpc3RlcmVkOmZ1bmN0aW9uKCl7dGhpcy5fcHJlcEtleUJpbmRpbmdzKCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fbGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl91bmxpc3RlbktleUV2ZW50TGlzdGVuZXJzKCl9LGFkZE93bktleUJpbmRpbmc6ZnVuY3Rpb24odCxlKXt0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3NbdF09ZSx0aGlzLl9wcmVwS2V5QmluZGluZ3MoKSx0aGlzLl9yZXNldEtleUV2ZW50TGlzdGVuZXJzKCl9LHJlbW92ZU93bktleUJpbmRpbmdzOmZ1bmN0aW9uKCl7dGhpcy5faW1wZXJhdGl2ZUtleUJpbmRpbmdzPXt9LHRoaXMuX3ByZXBLZXlCaW5kaW5ncygpLHRoaXMuX3Jlc2V0S2V5RXZlbnRMaXN0ZW5lcnMoKX0sa2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPU9vKGUpLGk9MDtpPG4ubGVuZ3RoOysraSlpZihSbyhuW2ldLHQpKXJldHVybiEwO3JldHVybiExfSxfY29sbGVjdEtleUJpbmRpbmdzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5iZWhhdmlvcnMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5rZXlCaW5kaW5nc30pKTtyZXR1cm4tMT09PXQuaW5kZXhPZih0aGlzLmtleUJpbmRpbmdzKSYmdC5wdXNoKHRoaXMua2V5QmluZGluZ3MpLHR9LF9wcmVwS2V5QmluZGluZ3M6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5fa2V5QmluZGluZ3M9e30sdGhpcy5fY29sbGVjdEtleUJpbmRpbmdzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHQpdGhpcy5fYWRkS2V5QmluZGluZyhlLHRbZV0pfSksdGhpcyksdGhpcy5faW1wZXJhdGl2ZUtleUJpbmRpbmdzKXRoaXMuX2FkZEtleUJpbmRpbmcodCx0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3NbdF0pO2Zvcih2YXIgZSBpbiB0aGlzLl9rZXlCaW5kaW5ncyl0aGlzLl9rZXlCaW5kaW5nc1tlXS5zb3J0KChmdW5jdGlvbih0LGUpe3ZhciBuPXRbMF0uaGFzTW9kaWZpZXJzO3JldHVybiBuPT09ZVswXS5oYXNNb2RpZmllcnM/MDpuPy0xOjF9KSl9LF9hZGRLZXlCaW5kaW5nOmZ1bmN0aW9uKHQsZSl7T28odCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dGhpcy5fa2V5QmluZGluZ3NbdC5ldmVudF09dGhpcy5fa2V5QmluZGluZ3NbdC5ldmVudF18fFtdLHRoaXMuX2tleUJpbmRpbmdzW3QuZXZlbnRdLnB1c2goW3QsZV0pfSksdGhpcyl9LF9yZXNldEtleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fdW5saXN0ZW5LZXlFdmVudExpc3RlbmVycygpLHRoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKX0sX2xpc3RlbktleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5rZXlFdmVudFRhcmdldCYmT2JqZWN0LmtleXModGhpcy5fa2V5QmluZGluZ3MpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX29uS2V5QmluZGluZ0V2ZW50LmJpbmQodGhpcyx0aGlzLl9rZXlCaW5kaW5nc1t0XSk7dGhpcy5fYm91bmRLZXlIYW5kbGVycy5wdXNoKFt0aGlzLmtleUV2ZW50VGFyZ2V0LHQsZV0pLHRoaXMua2V5RXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0LGUpfSksdGhpcyl9LF91bmxpc3RlbktleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7Zm9yKHZhciB0O3RoaXMuX2JvdW5kS2V5SGFuZGxlcnMubGVuZ3RoOykodD10aGlzLl9ib3VuZEtleUhhbmRsZXJzLnBvcCgpKVswXS5yZW1vdmVFdmVudExpc3RlbmVyKHRbMV0sdFsyXSl9LF9vbktleUJpbmRpbmdFdmVudDpmdW5jdGlvbih0LGUpe2lmKHRoaXMuc3RvcEtleWJvYXJkRXZlbnRQcm9wYWdhdGlvbiYmZS5zdG9wUHJvcGFnYXRpb24oKSwhZS5kZWZhdWx0UHJldmVudGVkKWZvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgaT10W25dWzBdLHI9dFtuXVsxXTtpZihSbyhpLGUpJiYodGhpcy5fdHJpZ2dlcktleUhhbmRsZXIoaSxyLGUpLGUuZGVmYXVsdFByZXZlbnRlZCkpcmV0dXJufX0sX3RyaWdnZXJLZXlIYW5kbGVyOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1PYmplY3QuY3JlYXRlKHQpO2kua2V5Ym9hcmRFdmVudD1uO3ZhciByPW5ldyBDdXN0b21FdmVudCh0LmV2ZW50LHtkZXRhaWw6aSxjYW5jZWxhYmxlOiEwfSk7dGhpc1tlXS5jYWxsKHRoaXMsciksci5kZWZhdWx0UHJldmVudGVkJiZuLnByZXZlbnREZWZhdWx0KCl9fSxEbz17cHJvcGVydGllczp7c2Nyb2xsVGFyZ2V0Ont0eXBlOkhUTUxFbGVtZW50LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlZmF1bHRTY3JvbGxUYXJnZXR9fX0sb2JzZXJ2ZXJzOlsiX3Njcm9sbFRhcmdldENoYW5nZWQoc2Nyb2xsVGFyZ2V0LCBpc0F0dGFjaGVkKSJdLF9zaG91bGRIYXZlTGlzdGVuZXI6ITAsX3Njcm9sbFRhcmdldENoYW5nZWQ6ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9vbGRTY3JvbGxUYXJnZXQmJih0aGlzLl90b2dnbGVTY3JvbGxMaXN0ZW5lcighMSx0aGlzLl9vbGRTY3JvbGxUYXJnZXQpLHRoaXMuX29sZFNjcm9sbFRhcmdldD1udWxsKSxlKWlmKCJkb2N1bWVudCI9PT10KXRoaXMuc2Nyb2xsVGFyZ2V0PXRoaXMuX2RvYztlbHNlIGlmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIG49dGhpcy5kb21Ib3N0O3RoaXMuc2Nyb2xsVGFyZ2V0PW4mJm4uJD9uLiRbdF06WWkodGhpcy5vd25lckRvY3VtZW50KS5xdWVyeVNlbGVjdG9yKCIjIit0KX1lbHNlIHRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuX29sZFNjcm9sbFRhcmdldD10LHRoaXMuX3RvZ2dsZVNjcm9sbExpc3RlbmVyKHRoaXMuX3Nob3VsZEhhdmVMaXN0ZW5lcix0KSl9LF9zY3JvbGxIYW5kbGVyOmZ1bmN0aW9uIHQoKXt9LGdldCBfZGVmYXVsdFNjcm9sbFRhcmdldCgpe3JldHVybiB0aGlzLl9kb2N9LGdldCBfZG9jKCl7cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnR9LGdldCBfc2Nyb2xsVG9wKCl7cmV0dXJuIHRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKT90aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cucGFnZVlPZmZzZXQ6dGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsVG9wOjB9LGdldCBfc2Nyb2xsTGVmdCgpe3JldHVybiB0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCk/dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LnBhZ2VYT2Zmc2V0OnRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ6MH0sc2V0IF9zY3JvbGxUb3AodCl7dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LnNjcm9sbFRvKHdpbmRvdy5wYWdlWE9mZnNldCx0KTp0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCkmJih0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A9dCl9LHNldCBfc2Nyb2xsTGVmdCh0KXt0aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cuc2Nyb2xsVG8odCx3aW5kb3cucGFnZVlPZmZzZXQpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ9dCl9LHNjcm9sbDpmdW5jdGlvbih0LGUpe3ZhciBuOyJvYmplY3QiPT10eXBlb2YgdD8obj10LmxlZnQsZT10LnRvcCk6bj10LG49bnx8MCxlPWV8fDAsdGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LnNjcm9sbFRvKG4sZSk6dGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpJiYodGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsTGVmdD1uLHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcD1lKX0sZ2V0IF9zY3JvbGxUYXJnZXRXaWR0aCgpe3JldHVybiB0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCk/dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LmlubmVyV2lkdGg6dGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0V2lkdGg6MH0sZ2V0IF9zY3JvbGxUYXJnZXRIZWlnaHQoKXtyZXR1cm4gdGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpP3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5pbm5lckhlaWdodDp0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRIZWlnaHQ6MH0sX2lzVmFsaWRTY3JvbGxUYXJnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zY3JvbGxUYXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudH0sX3RvZ2dsZVNjcm9sbExpc3RlbmVyOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZT09PXRoaXMuX2RvYz93aW5kb3c6ZTt0P3RoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcnx8KHRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcj10aGlzLl9zY3JvbGxIYW5kbGVyLmJpbmQodGhpcyksbi5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcikpOnRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlciYmKG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXIpLHRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcj1udWxsKX0sdG9nZ2xlU2Nyb2xsTGlzdGVuZXI6ZnVuY3Rpb24odCl7dGhpcy5fc2hvdWxkSGF2ZUxpc3RlbmVyPXQsdGhpcy5fdG9nZ2xlU2Nyb2xsTGlzdGVuZXIodCx0aGlzLnNjcm9sbFRhcmdldCl9fTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNiBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwp2YXIgQm89bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpob25lfGFkOyg/OiBVOyk/IENQVSkgT1MgKFxkKykvKSxIbz1CbyYmQm9bMV0+PTgsRm89Ii0xMDAwMHB4IixWbz0tMTAwO1JyKHtfdGVtcGxhdGU6X2VgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1tYXgtZGV2aWNlLXBpeGVsLXJhdGlvOiAxKSB7CiAgICAgICAgOmhvc3QgewogICAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNpdGVtcyB7CiAgICAgICAgQGFwcGx5IC0taXJvbi1saXN0LWl0ZW1zLWNvbnRhaW5lcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIDpob3N0KDpub3QoW2dyaWRdKSkgI2l0ZW1zID4gOjpzbG90dGVkKCopIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2l0ZW1zID4gOjpzbG90dGVkKCopIHsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGFycmF5LXNlbGVjdG9yIGlkPSJzZWxlY3RvciIgaXRlbXM9Int7aXRlbXN9fSIgc2VsZWN0ZWQ9Int7c2VsZWN0ZWRJdGVtc319IiBzZWxlY3RlZC1pdGVtPSJ7e3NlbGVjdGVkSXRlbX19Ij48L2FycmF5LXNlbGVjdG9yPgoKICAgIDxkaXYgaWQ9Iml0ZW1zIj4KICAgICAgPHNsb3Q+PC9zbG90PgogICAgPC9kaXY+CmAsaXM6Imlyb24tbGlzdCIscHJvcGVydGllczp7aXRlbXM6e3R5cGU6QXJyYXl9LGFzOnt0eXBlOlN0cmluZyx2YWx1ZToiaXRlbSJ9LGluZGV4QXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpbmRleCJ9LHNlbGVjdGVkQXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJzZWxlY3RlZCJ9LGdyaWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsb2JzZXJ2ZXI6Il9ncmlkQ2hhbmdlZCJ9LHNlbGVjdGlvbkVuYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sc2VsZWN0ZWRJdGVtOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LHNlbGVjdGVkSXRlbXM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sbXVsdGlTZWxlY3Rpb246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sc2Nyb2xsT2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZTowfX0sb2JzZXJ2ZXJzOlsiX2l0ZW1zQ2hhbmdlZChpdGVtcy4qKSIsIl9zZWxlY3Rpb25FbmFibGVkQ2hhbmdlZChzZWxlY3Rpb25FbmFibGVkKSIsIl9tdWx0aVNlbGVjdGlvbkNoYW5nZWQobXVsdGlTZWxlY3Rpb24pIiwiX3NldE92ZXJmbG93KHNjcm9sbFRhcmdldCwgc2Nyb2xsT2Zmc2V0KSJdLGJlaGF2aW9yczpbWnIsZ28sRG8scG9dLF9yYXRpbzouNSxfc2Nyb2xsZXJQYWRkaW5nVG9wOjAsX3Njcm9sbFBvc2l0aW9uOjAsX3BoeXNpY2FsU2l6ZTowLF9waHlzaWNhbEF2ZXJhZ2U6MCxfcGh5c2ljYWxBdmVyYWdlQ291bnQ6MCxfcGh5c2ljYWxUb3A6MCxfdmlydHVhbENvdW50OjAsX2VzdFNjcm9sbEhlaWdodDowLF9zY3JvbGxIZWlnaHQ6MCxfdmlld3BvcnRIZWlnaHQ6MCxfdmlld3BvcnRXaWR0aDowLF9waHlzaWNhbEl0ZW1zOm51bGwsX3BoeXNpY2FsU2l6ZXM6bnVsbCxfZmlyc3RWaXNpYmxlSW5kZXhWYWw6bnVsbCxfbGFzdFZpc2libGVJbmRleFZhbDpudWxsLF9tYXhQYWdlczoyLF9mb2N1c2VkSXRlbTpudWxsLF9mb2N1c2VkVmlydHVhbEluZGV4Oi0xLF9mb2N1c2VkUGh5c2ljYWxJbmRleDotMSxfb2Zmc2NyZWVuRm9jdXNlZEl0ZW06bnVsbCxfZm9jdXNCYWNrZmlsbEl0ZW06bnVsbCxfaXRlbXNQZXJSb3c6MSxfaXRlbVdpZHRoOjAsX3Jvd0hlaWdodDowLF90ZW1wbGF0ZUNvc3Q6MCxfcGFyZW50TW9kZWw6ITAsZ2V0IF9waHlzaWNhbEJvdHRvbSgpe3JldHVybiB0aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9waHlzaWNhbFNpemV9LGdldCBfc2Nyb2xsQm90dG9tKCl7cmV0dXJuIHRoaXMuX3Njcm9sbFBvc2l0aW9uK3RoaXMuX3ZpZXdwb3J0SGVpZ2h0fSxnZXQgX3ZpcnR1YWxFbmQoKXtyZXR1cm4gdGhpcy5fdmlydHVhbFN0YXJ0K3RoaXMuX3BoeXNpY2FsQ291bnQtMX0sZ2V0IF9oaWRkZW5Db250ZW50U2l6ZSgpe3JldHVybih0aGlzLmdyaWQ/dGhpcy5fcGh5c2ljYWxSb3dzKnRoaXMuX3Jvd0hlaWdodDp0aGlzLl9waHlzaWNhbFNpemUpLXRoaXMuX3ZpZXdwb3J0SGVpZ2h0fSxnZXQgX2l0ZW1zUGFyZW50KCl7cmV0dXJuIFlpKFlpKHRoaXMuX3VzZXJUZW1wbGF0ZSkucGFyZW50Tm9kZSl9LGdldCBfbWF4U2Nyb2xsVG9wKCl7cmV0dXJuIHRoaXMuX2VzdFNjcm9sbEhlaWdodC10aGlzLl92aWV3cG9ydEhlaWdodCt0aGlzLl9zY3JvbGxPZmZzZXR9LGdldCBfbWF4VmlydHVhbFN0YXJ0KCl7dmFyIHQ9dGhpcy5fY29udmVydEluZGV4VG9Db21wbGV0ZVJvdyh0aGlzLl92aXJ0dWFsQ291bnQpO3JldHVybiBNYXRoLm1heCgwLHQtdGhpcy5fcGh5c2ljYWxDb3VudCl9LHNldCBfdmlydHVhbFN0YXJ0KHQpe3Q9dGhpcy5fY2xhbXAodCwwLHRoaXMuX21heFZpcnR1YWxTdGFydCksdGhpcy5ncmlkJiYodC09dCV0aGlzLl9pdGVtc1BlclJvdyksdGhpcy5fdmlydHVhbFN0YXJ0VmFsPXR9LGdldCBfdmlydHVhbFN0YXJ0KCl7cmV0dXJuIHRoaXMuX3ZpcnR1YWxTdGFydFZhbHx8MH0sc2V0IF9waHlzaWNhbFN0YXJ0KHQpeyh0JT10aGlzLl9waHlzaWNhbENvdW50KTwwJiYodD10aGlzLl9waHlzaWNhbENvdW50K3QpLHRoaXMuZ3JpZCYmKHQtPXQldGhpcy5faXRlbXNQZXJSb3cpLHRoaXMuX3BoeXNpY2FsU3RhcnRWYWw9dH0sZ2V0IF9waHlzaWNhbFN0YXJ0KCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsU3RhcnRWYWx8fDB9LGdldCBfcGh5c2ljYWxFbmQoKXtyZXR1cm4odGhpcy5fcGh5c2ljYWxTdGFydCt0aGlzLl9waHlzaWNhbENvdW50LTEpJXRoaXMuX3BoeXNpY2FsQ291bnR9LHNldCBfcGh5c2ljYWxDb3VudCh0KXt0aGlzLl9waHlzaWNhbENvdW50VmFsPXR9LGdldCBfcGh5c2ljYWxDb3VudCgpe3JldHVybiB0aGlzLl9waHlzaWNhbENvdW50VmFsfHwwfSxnZXQgX29wdFBoeXNpY2FsU2l6ZSgpe3JldHVybiAwPT09dGhpcy5fdmlld3BvcnRIZWlnaHQ/MS8wOnRoaXMuX3ZpZXdwb3J0SGVpZ2h0KnRoaXMuX21heFBhZ2VzfSxnZXQgX2lzVmlzaWJsZSgpe3JldHVybiBCb29sZWFuKHRoaXMub2Zmc2V0V2lkdGh8fHRoaXMub2Zmc2V0SGVpZ2h0KX0sZ2V0IGZpcnN0VmlzaWJsZUluZGV4KCl7dmFyIHQ9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw7aWYobnVsbD09dCl7dmFyIGU9dGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0O3Q9dGhpcy5faXRlcmF0ZUl0ZW1zKChmdW5jdGlvbih0LG4pe3JldHVybihlKz10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQodCkpPnRoaXMuX3Njcm9sbFBvc2l0aW9uP3RoaXMuZ3JpZD9uLW4ldGhpcy5faXRlbXNQZXJSb3c6bjp0aGlzLmdyaWQmJnRoaXMuX3ZpcnR1YWxDb3VudC0xPT09bj9uLW4ldGhpcy5faXRlbXNQZXJSb3c6dm9pZCAwfSkpfHwwLHRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPXR9cmV0dXJuIHR9LGdldCBsYXN0VmlzaWJsZUluZGV4KCl7dmFyIHQ9dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbDtpZihudWxsPT10KXtpZih0aGlzLmdyaWQpdD1NYXRoLm1pbih0aGlzLl92aXJ0dWFsQ291bnQsdGhpcy5maXJzdFZpc2libGVJbmRleCt0aGlzLl9lc3RSb3dzSW5WaWV3KnRoaXMuX2l0ZW1zUGVyUm93LTEpO2Vsc2V7dmFyIGU9dGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0O3RoaXMuX2l0ZXJhdGVJdGVtcygoZnVuY3Rpb24obixpKXtlPHRoaXMuX3Njcm9sbEJvdHRvbSYmKHQ9aSksZSs9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KG4pfSkpfXRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dH1yZXR1cm4gdH0sZ2V0IF9kZWZhdWx0U2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXN9LGdldCBfdmlydHVhbFJvd0NvdW50KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl92aXJ0dWFsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpfSxnZXQgX2VzdFJvd3NJblZpZXcoKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuX3ZpZXdwb3J0SGVpZ2h0L3RoaXMuX3Jvd0hlaWdodCl9LGdldCBfcGh5c2ljYWxSb3dzKCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl9waHlzaWNhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KX0sZ2V0IF9zY3JvbGxPZmZzZXQoKXtyZXR1cm4gdGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wK3RoaXMuc2Nyb2xsT2Zmc2V0fSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2RpZEZvY3VzLmJpbmQodGhpcyksITApfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2RlYm91bmNlKCJfcmVuZGVyIix0aGlzLl9yZW5kZXIsX3QpLHRoaXMubGlzdGVuKHRoaXMsImlyb24tcmVzaXplIiwiX3Jlc2l6ZUhhbmRsZXIiKSx0aGlzLmxpc3Rlbih0aGlzLCJrZXlkb3duIiwiX2tleWRvd25IYW5kbGVyIil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy51bmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsIl9yZXNpemVIYW5kbGVyIiksdGhpcy51bmxpc3Rlbih0aGlzLCJrZXlkb3duIiwiX2tleWRvd25IYW5kbGVyIil9LF9zZXRPdmVyZmxvdzpmdW5jdGlvbih0KXt0aGlzLnN0eWxlLndlYmtpdE92ZXJmbG93U2Nyb2xsaW5nPXQ9PT10aGlzPyJ0b3VjaCI6IiIsdGhpcy5zdHlsZS5vdmVyZmxvd1k9dD09PXRoaXM/ImF1dG8iOiIiLHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9bnVsbCx0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsLHRoaXMuX2RlYm91bmNlKCJfcmVuZGVyIix0aGlzLl9yZW5kZXIsX3QpfSx1cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXM6ZnVuY3Rpb24oKXt2YXIgdD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKTt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3A9dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzPzA6cGFyc2VJbnQodFsicGFkZGluZy10b3AiXSwxMCksdGhpcy5faXNSVEw9Qm9vbGVhbigicnRsIj09PXQuZGlyZWN0aW9uKSx0aGlzLl92aWV3cG9ydFdpZHRoPXRoaXMuJC5pdGVtcy5vZmZzZXRXaWR0aCx0aGlzLl92aWV3cG9ydEhlaWdodD10aGlzLl9zY3JvbGxUYXJnZXRIZWlnaHQsdGhpcy5ncmlkJiZ0aGlzLl91cGRhdGVHcmlkTWV0cmljcygpfSxfc2Nyb2xsSGFuZGxlcjpmdW5jdGlvbigpe3ZhciB0PU1hdGgubWF4KDAsTWF0aC5taW4odGhpcy5fbWF4U2Nyb2xsVG9wLHRoaXMuX3Njcm9sbFRvcCkpLGU9dC10aGlzLl9zY3JvbGxQb3NpdGlvbixuPWU+PTA7aWYodGhpcy5fc2Nyb2xsUG9zaXRpb249dCx0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsLHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9bnVsbCxNYXRoLmFicyhlKT50aGlzLl9waHlzaWNhbFNpemUmJnRoaXMuX3BoeXNpY2FsU2l6ZT4wKXtlLT10aGlzLl9zY3JvbGxPZmZzZXQ7dmFyIGk9TWF0aC5yb3VuZChlL3RoaXMuX3BoeXNpY2FsQXZlcmFnZSkqdGhpcy5faXRlbXNQZXJSb3c7dGhpcy5fdmlydHVhbFN0YXJ0PXRoaXMuX3ZpcnR1YWxTdGFydCtpLHRoaXMuX3BoeXNpY2FsU3RhcnQ9dGhpcy5fcGh5c2ljYWxTdGFydCtpLHRoaXMuX3BoeXNpY2FsVG9wPU1hdGgubWluKE1hdGguZmxvb3IodGhpcy5fdmlydHVhbFN0YXJ0L3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2UsdGhpcy5fc2Nyb2xsUG9zaXRpb24pLHRoaXMuX3VwZGF0ZSgpfWVsc2UgaWYodGhpcy5fcGh5c2ljYWxDb3VudD4wKXt2YXIgcj10aGlzLl9nZXRSZXVzYWJsZXMobik7bj8odGhpcy5fcGh5c2ljYWxUb3A9ci5waHlzaWNhbFRvcCx0aGlzLl92aXJ0dWFsU3RhcnQ9dGhpcy5fdmlydHVhbFN0YXJ0K3IuaW5kZXhlcy5sZW5ndGgsdGhpcy5fcGh5c2ljYWxTdGFydD10aGlzLl9waHlzaWNhbFN0YXJ0K3IuaW5kZXhlcy5sZW5ndGgpOih0aGlzLl92aXJ0dWFsU3RhcnQ9dGhpcy5fdmlydHVhbFN0YXJ0LXIuaW5kZXhlcy5sZW5ndGgsdGhpcy5fcGh5c2ljYWxTdGFydD10aGlzLl9waHlzaWNhbFN0YXJ0LXIuaW5kZXhlcy5sZW5ndGgpLHRoaXMuX3VwZGF0ZShyLmluZGV4ZXMsbj9udWxsOnIuaW5kZXhlcyksdGhpcy5fZGVib3VuY2UoIl9pbmNyZWFzZVBvb2xJZk5lZWRlZCIsdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQuYmluZCh0aGlzLDApLHZ0KX19LF9nZXRSZXVzYWJsZXM6ZnVuY3Rpb24odCl7dmFyIGUsbixpLHI9W10sbz10aGlzLl9oaWRkZW5Db250ZW50U2l6ZSp0aGlzLl9yYXRpbyxhPXRoaXMuX3ZpcnR1YWxTdGFydCxzPXRoaXMuX3ZpcnR1YWxFbmQsbD10aGlzLl9waHlzaWNhbENvdW50LGM9dGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0LHU9dGhpcy5fc2Nyb2xsUG9zaXRpb24saD10aGlzLl9zY3JvbGxCb3R0b207Zm9yKHQ/KGU9dGhpcy5fcGh5c2ljYWxTdGFydCxuPXUtYyk6KGU9dGhpcy5fcGh5c2ljYWxFbmQsbj10aGlzLl9waHlzaWNhbEJvdHRvbSt0aGlzLl9zY3JvbGxPZmZzZXQtaCk7bi09aT10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQoZSksIShyLmxlbmd0aD49bHx8bjw9byk7KWlmKHQpe2lmKHMrci5sZW5ndGgrMT49dGhpcy5fdmlydHVhbENvdW50KWJyZWFrO2lmKGMraT49dS10aGlzLl9zY3JvbGxPZmZzZXQpYnJlYWs7ci5wdXNoKGUpLGMrPWksZT0oZSsxKSVsfWVsc2V7aWYoYS1yLmxlbmd0aDw9MClicmVhaztpZihjK3RoaXMuX3BoeXNpY2FsU2l6ZS1pPD1oKWJyZWFrO3IucHVzaChlKSxjLT1pLGU9MD09PWU/bC0xOmUtMX1yZXR1cm57aW5kZXhlczpyLHBoeXNpY2FsVG9wOmMtdGhpcy5fc2Nyb2xsT2Zmc2V0fX0sX3VwZGF0ZTpmdW5jdGlvbih0LGUpe2lmKCEodCYmMD09PXQubGVuZ3RofHwwPT09dGhpcy5fcGh5c2ljYWxDb3VudCkpe2lmKHRoaXMuX21hbmFnZUZvY3VzKCksdGhpcy5fYXNzaWduTW9kZWxzKHQpLHRoaXMuX3VwZGF0ZU1ldHJpY3ModCksZSlmb3IoO2UubGVuZ3RoOyl7dmFyIG49ZS5wb3AoKTt0aGlzLl9waHlzaWNhbFRvcC09dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KG4pfXRoaXMuX3Bvc2l0aW9uSXRlbXMoKSx0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoKX19LF9jcmVhdGVQb29sOmZ1bmN0aW9uKHQpe3ZhciBlLG47dGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKTt2YXIgaT1uZXcgQXJyYXkodCk7Zm9yKGU9MDtlPHQ7ZSsrKW49dGhpcy5zdGFtcChudWxsKSxpW2VdPW4ucm9vdC5xdWVyeVNlbGVjdG9yKCIqIiksdGhpcy5faXRlbXNQYXJlbnQuYXBwZW5kQ2hpbGQobi5yb290KTtyZXR1cm4gaX0sX2lzQ2xpZW50RnVsbDpmdW5jdGlvbigpe3JldHVybiAwIT10aGlzLl9zY3JvbGxCb3R0b20mJnRoaXMuX3BoeXNpY2FsQm90dG9tLTE+PXRoaXMuX3Njcm9sbEJvdHRvbSYmdGhpcy5fcGh5c2ljYWxUb3A8PXRoaXMuX3Njcm9sbFBvc2l0aW9ufSxfaW5jcmVhc2VQb29sSWZOZWVkZWQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fY2xhbXAodGhpcy5fcGh5c2ljYWxDb3VudCt0LDMsdGhpcy5fdmlydHVhbENvdW50LXRoaXMuX3ZpcnR1YWxTdGFydCk7aWYoZT10aGlzLl9jb252ZXJ0SW5kZXhUb0NvbXBsZXRlUm93KGUpLHRoaXMuZ3JpZCl7dmFyIG49ZSV0aGlzLl9pdGVtc1BlclJvdztuJiZlLW48PXRoaXMuX3BoeXNpY2FsQ291bnQmJihlKz10aGlzLl9pdGVtc1BlclJvdyksZS09bn12YXIgaT1lLXRoaXMuX3BoeXNpY2FsQ291bnQscj1NYXRoLnJvdW5kKC41KnRoaXMuX3BoeXNpY2FsQ291bnQpO2lmKCEoaTwwKSl7aWYoaT4wKXt2YXIgbz13aW5kb3cucGVyZm9ybWFuY2Uubm93KCk7W10ucHVzaC5hcHBseSh0aGlzLl9waHlzaWNhbEl0ZW1zLHRoaXMuX2NyZWF0ZVBvb2woaSkpO2Zvcih2YXIgYT0wO2E8aTthKyspdGhpcy5fcGh5c2ljYWxTaXplcy5wdXNoKDApO3RoaXMuX3BoeXNpY2FsQ291bnQ9dGhpcy5fcGh5c2ljYWxDb3VudCtpLHRoaXMuX3BoeXNpY2FsU3RhcnQ+dGhpcy5fcGh5c2ljYWxFbmQmJnRoaXMuX2lzSW5kZXhSZW5kZXJlZCh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KSYmdGhpcy5fZ2V0UGh5c2ljYWxJbmRleCh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KTx0aGlzLl9waHlzaWNhbEVuZCYmKHRoaXMuX3BoeXNpY2FsU3RhcnQ9dGhpcy5fcGh5c2ljYWxTdGFydCtpKSx0aGlzLl91cGRhdGUoKSx0aGlzLl90ZW1wbGF0ZUNvc3Q9KHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKS1vKS9pLHI9TWF0aC5yb3VuZCguNSp0aGlzLl9waHlzaWNhbENvdW50KX10aGlzLl92aXJ0dWFsRW5kPj10aGlzLl92aXJ0dWFsQ291bnQtMXx8MD09PXJ8fCh0aGlzLl9pc0NsaWVudEZ1bGwoKT90aGlzLl9waHlzaWNhbFNpemU8dGhpcy5fb3B0UGh5c2ljYWxTaXplJiZ0aGlzLl9kZWJvdW5jZSgiX2luY3JlYXNlUG9vbElmTmVlZGVkIix0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZC5iaW5kKHRoaXMsdGhpcy5fY2xhbXAoTWF0aC5yb3VuZCg1MC90aGlzLl90ZW1wbGF0ZUNvc3QpLDEscikpLHl0KTp0aGlzLl9kZWJvdW5jZSgiX2luY3JlYXNlUG9vbElmTmVlZGVkIix0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZC5iaW5kKHRoaXMsciksdnQpKX19LF9yZW5kZXI6ZnVuY3Rpb24oKXtpZih0aGlzLmlzQXR0YWNoZWQmJnRoaXMuX2lzVmlzaWJsZSlpZigwIT09dGhpcy5fcGh5c2ljYWxDb3VudCl7dmFyIHQ9dGhpcy5fZ2V0UmV1c2FibGVzKCEwKTt0aGlzLl9waHlzaWNhbFRvcD10LnBoeXNpY2FsVG9wLHRoaXMuX3ZpcnR1YWxTdGFydD10aGlzLl92aXJ0dWFsU3RhcnQrdC5pbmRleGVzLmxlbmd0aCx0aGlzLl9waHlzaWNhbFN0YXJ0PXRoaXMuX3BoeXNpY2FsU3RhcnQrdC5pbmRleGVzLmxlbmd0aCx0aGlzLl91cGRhdGUodC5pbmRleGVzKSx0aGlzLl91cGRhdGUoKSx0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgwKX1lbHNlIHRoaXMuX3ZpcnR1YWxDb3VudD4wJiYodGhpcy51cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXMoKSx0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgzKSl9LF9lbnN1cmVUZW1wbGF0aXplZDpmdW5jdGlvbigpe2lmKCF0aGlzLmN0b3Ipe3RoaXMuX3VzZXJUZW1wbGF0ZT10aGlzLnF1ZXJ5RWZmZWN0aXZlQ2hpbGRyZW4oInRlbXBsYXRlIiksdGhpcy5fdXNlclRlbXBsYXRlfHxjb25zb2xlLndhcm4oImlyb24tbGlzdCByZXF1aXJlcyBhIHRlbXBsYXRlIHRvIGJlIHByb3ZpZGVkIGluIGxpZ2h0LWRvbSIpO3ZhciB0PXtfX2tleV9fOiEwfTt0W3RoaXMuYXNdPSEwLHRbdGhpcy5pbmRleEFzXT0hMCx0W3RoaXMuc2VsZWN0ZWRBc109ITAsdC50YWJJbmRleD0hMCx0aGlzLl9pbnN0YW5jZVByb3BzPXQsdGhpcy50ZW1wbGF0aXplKHRoaXMuX3VzZXJUZW1wbGF0ZSx0aGlzLm11dGFibGVEYXRhKX19LF9ncmlkQ2hhbmdlZDpmdW5jdGlvbih0LGUpe3ZvaWQgMCE9PWUmJih0aGlzLm5vdGlmeVJlc2l6ZSgpLERpKCksdCYmdGhpcy5fdXBkYXRlR3JpZE1ldHJpY3MoKSl9LF9pdGVtc0NoYW5nZWQ6ZnVuY3Rpb24odCl7aWYoIml0ZW1zIj09PXQucGF0aCl0aGlzLl92aXJ0dWFsU3RhcnQ9MCx0aGlzLl9waHlzaWNhbFRvcD0wLHRoaXMuX3ZpcnR1YWxDb3VudD10aGlzLml0ZW1zP3RoaXMuaXRlbXMubGVuZ3RoOjAsdGhpcy5fcGh5c2ljYWxJbmRleEZvcktleT17fSx0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsLHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9bnVsbCx0aGlzLl9waHlzaWNhbENvdW50PXRoaXMuX3BoeXNpY2FsQ291bnR8fDAsdGhpcy5fcGh5c2ljYWxJdGVtcz10aGlzLl9waHlzaWNhbEl0ZW1zfHxbXSx0aGlzLl9waHlzaWNhbFNpemVzPXRoaXMuX3BoeXNpY2FsU2l6ZXN8fFtdLHRoaXMuX3BoeXNpY2FsU3RhcnQ9MCx0aGlzLl9zY3JvbGxUb3A+dGhpcy5fc2Nyb2xsT2Zmc2V0JiZ0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKDApLHRoaXMuX3JlbW92ZUZvY3VzZWRJdGVtKCksdGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLHRoaXMuX3JlbmRlcixfdCk7ZWxzZSBpZigiaXRlbXMuc3BsaWNlcyI9PT10LnBhdGgpe2lmKHRoaXMuX2FkanVzdFZpcnR1YWxJbmRleCh0LnZhbHVlLmluZGV4U3BsaWNlcyksdGhpcy5fdmlydHVhbENvdW50PXRoaXMuaXRlbXM/dGhpcy5pdGVtcy5sZW5ndGg6MCx0LnZhbHVlLmluZGV4U3BsaWNlcy5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gdC5hZGRlZENvdW50PjB8fHQucmVtb3ZlZC5sZW5ndGg+MH0pKSl7dmFyIGU9dGhpcy5fZ2V0QWN0aXZlRWxlbWVudCgpO3RoaXMuY29udGFpbnMoZSkmJmUuYmx1cigpfXZhciBuPXQudmFsdWUuaW5kZXhTcGxpY2VzLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmluZGV4K3QuYWRkZWRDb3VudD49dGhpcy5fdmlydHVhbFN0YXJ0JiZ0LmluZGV4PD10aGlzLl92aXJ0dWFsRW5kfSksdGhpcyk7dGhpcy5faXNDbGllbnRGdWxsKCkmJiFufHx0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLF90KX1lbHNlIml0ZW1zLmxlbmd0aCIhPT10LnBhdGgmJnRoaXMuX2ZvcndhcmRJdGVtUGF0aCh0LnBhdGgsdC52YWx1ZSl9LF9mb3J3YXJkSXRlbVBhdGg6ZnVuY3Rpb24odCxlKXt2YXIgbixpLHIsbz0odD10LnNsaWNlKDYpKS5pbmRleE9mKCIuIik7LTE9PT1vJiYobz10Lmxlbmd0aCk7dmFyIGE9dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pLHM9cGFyc2VJbnQodC5zdWJzdHJpbmcoMCxvKSwxMCk7KG49dGhpcy5faXNJbmRleFJlbmRlcmVkKHMpKT8oaT10aGlzLl9nZXRQaHlzaWNhbEluZGV4KHMpLHI9dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1tpXSkpOmEmJihyPWEpLHImJnJbdGhpcy5pbmRleEFzXT09PXMmJih0PXQuc3Vic3RyaW5nKG8rMSksci5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHQ9dGhpcy5hcysodD8iLiIrdDoiIiksZSwhMSwhMCksci5fZmx1c2hQcm9wZXJ0aWVzJiZyLl9mbHVzaFByb3BlcnRpZXMoKSxuJiYodGhpcy5fdXBkYXRlTWV0cmljcyhbaV0pLHRoaXMuX3Bvc2l0aW9uSXRlbXMoKSx0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoKSkpfSxfYWRqdXN0VmlydHVhbEluZGV4OmZ1bmN0aW9uKHQpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYodC5yZW1vdmVkLmZvckVhY2godGhpcy5fcmVtb3ZlSXRlbSx0aGlzKSx0LmluZGV4PHRoaXMuX3ZpcnR1YWxTdGFydCl7dmFyIGU9TWF0aC5tYXgodC5hZGRlZENvdW50LXQucmVtb3ZlZC5sZW5ndGgsdC5pbmRleC10aGlzLl92aXJ0dWFsU3RhcnQpO3RoaXMuX3ZpcnR1YWxTdGFydD10aGlzLl92aXJ0dWFsU3RhcnQrZSx0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4Pj0wJiYodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleD10aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4K2UpfX0pLHRoaXMpfSxfcmVtb3ZlSXRlbTpmdW5jdGlvbih0KXt0aGlzLiQuc2VsZWN0b3IuZGVzZWxlY3QodCksdGhpcy5fZm9jdXNlZEl0ZW0mJnRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX2ZvY3VzZWRJdGVtKVt0aGlzLmFzXT09PXQmJnRoaXMuX3JlbW92ZUZvY3VzZWRJdGVtKCl9LF9pdGVyYXRlSXRlbXM6ZnVuY3Rpb24odCxlKXt2YXIgbixpLHIsbztpZigyPT09YXJndW1lbnRzLmxlbmd0aCYmZSl7Zm9yKG89MDtvPGUubGVuZ3RoO28rKylpZihpPXRoaXMuX2NvbXB1dGVWaWR4KG49ZVtvXSksbnVsbCE9KHI9dC5jYWxsKHRoaXMsbixpKSkpcmV0dXJuIHJ9ZWxzZXtmb3Iobj10aGlzLl9waHlzaWNhbFN0YXJ0LGk9dGhpcy5fdmlydHVhbFN0YXJ0O248dGhpcy5fcGh5c2ljYWxDb3VudDtuKyssaSsrKWlmKG51bGwhPShyPXQuY2FsbCh0aGlzLG4saSkpKXJldHVybiByO2ZvcihuPTA7bjx0aGlzLl9waHlzaWNhbFN0YXJ0O24rKyxpKyspaWYobnVsbCE9KHI9dC5jYWxsKHRoaXMsbixpKSkpcmV0dXJuIHJ9fSxfY29tcHV0ZVZpZHg6ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PXRoaXMuX3BoeXNpY2FsU3RhcnQ/dGhpcy5fdmlydHVhbFN0YXJ0Kyh0LXRoaXMuX3BoeXNpY2FsU3RhcnQpOnRoaXMuX3ZpcnR1YWxTdGFydCsodGhpcy5fcGh5c2ljYWxDb3VudC10aGlzLl9waHlzaWNhbFN0YXJ0KSt0fSxfYXNzaWduTW9kZWxzOmZ1bmN0aW9uKHQpe3RoaXMuX2l0ZXJhdGVJdGVtcygoZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9waHlzaWNhbEl0ZW1zW3RdLGk9dGhpcy5pdGVtcyYmdGhpcy5pdGVtc1tlXTtpZihudWxsIT1pKXt2YXIgcj10aGlzLm1vZGVsRm9yRWxlbWVudChuKTtyLl9fa2V5X189bnVsbCx0aGlzLl9mb3J3YXJkUHJvcGVydHkocix0aGlzLmFzLGkpLHRoaXMuX2ZvcndhcmRQcm9wZXJ0eShyLHRoaXMuc2VsZWN0ZWRBcyx0aGlzLiQuc2VsZWN0b3IuaXNTZWxlY3RlZChpKSksdGhpcy5fZm9yd2FyZFByb3BlcnR5KHIsdGhpcy5pbmRleEFzLGUpLHRoaXMuX2ZvcndhcmRQcm9wZXJ0eShyLCJ0YWJJbmRleCIsdGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleD09PWU/MDotMSksdGhpcy5fcGh5c2ljYWxJbmRleEZvcktleVtyLl9fa2V5X19dPXQsci5fZmx1c2hQcm9wZXJ0aWVzJiZyLl9mbHVzaFByb3BlcnRpZXMoITApLG4ucmVtb3ZlQXR0cmlidXRlKCJoaWRkZW4iKX1lbHNlIG4uc2V0QXR0cmlidXRlKCJoaWRkZW4iLCIiKX0pLHQpfSxfdXBkYXRlTWV0cmljczpmdW5jdGlvbih0KXtEaSgpO3ZhciBlPTAsbj0wLGk9dGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQscj10aGlzLl9waHlzaWNhbEF2ZXJhZ2U7dGhpcy5faXRlcmF0ZUl0ZW1zKChmdW5jdGlvbih0LGkpe24rPXRoaXMuX3BoeXNpY2FsU2l6ZXNbdF0sdGhpcy5fcGh5c2ljYWxTaXplc1t0XT10aGlzLl9waHlzaWNhbEl0ZW1zW3RdLm9mZnNldEhlaWdodCxlKz10aGlzLl9waHlzaWNhbFNpemVzW3RdLHRoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50Kz10aGlzLl9waHlzaWNhbFNpemVzW3RdPzE6MH0pLHQpLHRoaXMuZ3JpZD8odGhpcy5fdXBkYXRlR3JpZE1ldHJpY3MoKSx0aGlzLl9waHlzaWNhbFNpemU9TWF0aC5jZWlsKHRoaXMuX3BoeXNpY2FsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3Jvd0hlaWdodCk6KG49MT09PXRoaXMuX2l0ZW1zUGVyUm93P246TWF0aC5jZWlsKHRoaXMuX3BoeXNpY2FsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3Jvd0hlaWdodCx0aGlzLl9waHlzaWNhbFNpemU9dGhpcy5fcGh5c2ljYWxTaXplK2Utbix0aGlzLl9pdGVtc1BlclJvdz0xKSx0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCE9PWkmJih0aGlzLl9waHlzaWNhbEF2ZXJhZ2U9TWF0aC5yb3VuZCgocippK2UpL3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50KSl9LF91cGRhdGVHcmlkTWV0cmljczpmdW5jdGlvbigpe3RoaXMuX2l0ZW1XaWR0aD10aGlzLl9waHlzaWNhbENvdW50PjA/dGhpcy5fcGh5c2ljYWxJdGVtc1swXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDoyMDAsdGhpcy5fcm93SGVpZ2h0PXRoaXMuX3BoeXNpY2FsQ291bnQ+MD90aGlzLl9waHlzaWNhbEl0ZW1zWzBdLm9mZnNldEhlaWdodDoyMDAsdGhpcy5faXRlbXNQZXJSb3c9dGhpcy5faXRlbVdpZHRoP01hdGguZmxvb3IodGhpcy5fdmlld3BvcnRXaWR0aC90aGlzLl9pdGVtV2lkdGgpOnRoaXMuX2l0ZW1zUGVyUm93fSxfcG9zaXRpb25JdGVtczpmdW5jdGlvbigpe3RoaXMuX2FkanVzdFNjcm9sbFBvc2l0aW9uKCk7dmFyIHQ9dGhpcy5fcGh5c2ljYWxUb3A7aWYodGhpcy5ncmlkKXt2YXIgZT0odGhpcy5fdmlld3BvcnRXaWR0aC10aGlzLl9pdGVtc1BlclJvdyp0aGlzLl9pdGVtV2lkdGgpLzI7dGhpcy5faXRlcmF0ZUl0ZW1zKChmdW5jdGlvbihuLGkpe3ZhciByPU1hdGguZmxvb3IoaSV0aGlzLl9pdGVtc1BlclJvdyp0aGlzLl9pdGVtV2lkdGgrZSk7dGhpcy5faXNSVEwmJihyKj0tMSksdGhpcy50cmFuc2xhdGUzZChyKyJweCIsdCsicHgiLDAsdGhpcy5fcGh5c2ljYWxJdGVtc1tuXSksdGhpcy5fc2hvdWxkUmVuZGVyTmV4dFJvdyhpKSYmKHQrPXRoaXMuX3Jvd0hlaWdodCl9KSl9ZWxzZXtjb25zdCBlPVtdO3RoaXMuX2l0ZXJhdGVJdGVtcygoZnVuY3Rpb24obixpKXtjb25zdCByPXRoaXMuX3BoeXNpY2FsSXRlbXNbbl07dGhpcy50cmFuc2xhdGUzZCgwLHQrInB4IiwwLHIpLHQrPXRoaXMuX3BoeXNpY2FsU2l6ZXNbbl07Y29uc3Qgbz1yLmlkO28mJmUucHVzaChvKX0pKSxlLmxlbmd0aCYmdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtb3ducyIsZS5qb2luKCIgIikpfX0sX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5ncmlkP3RoaXMuX2NvbXB1dGVWaWR4KHQpJXRoaXMuX2l0ZW1zUGVyUm93IT10aGlzLl9pdGVtc1BlclJvdy0xPzA6dGhpcy5fcm93SGVpZ2h0OnRoaXMuX3BoeXNpY2FsU2l6ZXNbdF19LF9zaG91bGRSZW5kZXJOZXh0Um93OmZ1bmN0aW9uKHQpe3JldHVybiB0JXRoaXMuX2l0ZW1zUGVyUm93PT10aGlzLl9pdGVtc1BlclJvdy0xfSxfYWRqdXN0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgdD0wPT09dGhpcy5fdmlydHVhbFN0YXJ0P3RoaXMuX3BoeXNpY2FsVG9wOk1hdGgubWluKHRoaXMuX3Njcm9sbFBvc2l0aW9uK3RoaXMuX3BoeXNpY2FsVG9wLDApO2lmKDAhPT10KXt0aGlzLl9waHlzaWNhbFRvcD10aGlzLl9waHlzaWNhbFRvcC10O3ZhciBlPXRoaXMuX3Njcm9sbFBvc2l0aW9uOyFIbyYmZT4wJiZ0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKGUtdCl9fSxfcmVzZXRTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbih0KXt0aGlzLnNjcm9sbFRhcmdldCYmdD49MCYmKHRoaXMuX3Njcm9sbFRvcD10LHRoaXMuX3Njcm9sbFBvc2l0aW9uPXRoaXMuX3Njcm9sbFRvcCl9LF91cGRhdGVTY3JvbGxlclNpemU6ZnVuY3Rpb24odCl7dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0PXRoaXMuZ3JpZD90aGlzLl92aXJ0dWFsUm93Q291bnQqdGhpcy5fcm93SGVpZ2h0OnRoaXMuX3BoeXNpY2FsQm90dG9tK01hdGgubWF4KHRoaXMuX3ZpcnR1YWxDb3VudC10aGlzLl9waHlzaWNhbENvdW50LXRoaXMuX3ZpcnR1YWxTdGFydCwwKSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2UsKCh0PSh0PSh0PXR8fDA9PT10aGlzLl9zY3JvbGxIZWlnaHQpfHx0aGlzLl9zY3JvbGxQb3NpdGlvbj49dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3BoeXNpY2FsU2l6ZSl8fHRoaXMuZ3JpZCYmdGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodDx0aGlzLl9lc3RTY3JvbGxIZWlnaHQpfHxNYXRoLmFicyh0aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fc2Nyb2xsSGVpZ2h0KT49dGhpcy5fdmlld3BvcnRIZWlnaHQpJiYodGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodD10aGlzLl9lc3RTY3JvbGxIZWlnaHQrInB4Iix0aGlzLl9zY3JvbGxIZWlnaHQ9dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0KX0sc2Nyb2xsVG9JdGVtOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKHQpKX0sc2Nyb2xsVG9JbmRleDpmdW5jdGlvbih0KXtpZighKCJudW1iZXIiIT10eXBlb2YgdHx8dDwwfHx0PnRoaXMuaXRlbXMubGVuZ3RoLTEpJiYoRGkoKSwwIT09dGhpcy5fcGh5c2ljYWxDb3VudCkpe3Q9dGhpcy5fY2xhbXAodCwwLHRoaXMuX3ZpcnR1YWxDb3VudC0xKSwoIXRoaXMuX2lzSW5kZXhSZW5kZXJlZCh0KXx8dD49dGhpcy5fbWF4VmlydHVhbFN0YXJ0KSYmKHRoaXMuX3ZpcnR1YWxTdGFydD10aGlzLmdyaWQ/dC0yKnRoaXMuX2l0ZW1zUGVyUm93OnQtMSksdGhpcy5fbWFuYWdlRm9jdXMoKSx0aGlzLl9hc3NpZ25Nb2RlbHMoKSx0aGlzLl91cGRhdGVNZXRyaWNzKCksdGhpcy5fcGh5c2ljYWxUb3A9TWF0aC5mbG9vcih0aGlzLl92aXJ0dWFsU3RhcnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3BoeXNpY2FsQXZlcmFnZTtmb3IodmFyIGU9dGhpcy5fcGh5c2ljYWxTdGFydCxuPXRoaXMuX3ZpcnR1YWxTdGFydCxpPTAscj10aGlzLl9oaWRkZW5Db250ZW50U2l6ZTtuPHQmJmk8PXI7KWkrPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChlKSxlPShlKzEpJXRoaXMuX3BoeXNpY2FsQ291bnQsbisrO3RoaXMuX3VwZGF0ZVNjcm9sbGVyU2l6ZSghMCksdGhpcy5fcG9zaXRpb25JdGVtcygpLHRoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24odGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0K2kpLHRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDApLHRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPW51bGwsdGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1udWxsfX0sX3Jlc2V0QXZlcmFnZTpmdW5jdGlvbigpe3RoaXMuX3BoeXNpY2FsQXZlcmFnZT0wLHRoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50PTB9LF9yZXNpemVIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLChmdW5jdGlvbigpe3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPW51bGwsdGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1udWxsLHRoaXMuX2lzVmlzaWJsZT8odGhpcy51cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXMoKSx0aGlzLnRvZ2dsZVNjcm9sbExpc3RlbmVyKCEwKSx0aGlzLl9yZXNldEF2ZXJhZ2UoKSx0aGlzLl9yZW5kZXIoKSk6dGhpcy50b2dnbGVTY3JvbGxMaXN0ZW5lcighMSl9KSxfdCl9LHNlbGVjdEl0ZW06ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc2VsZWN0SW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKHQpKX0sc2VsZWN0SW5kZXg6ZnVuY3Rpb24odCl7aWYoISh0PDB8fHQ+PXRoaXMuX3ZpcnR1YWxDb3VudCkpe2lmKCF0aGlzLm11bHRpU2VsZWN0aW9uJiZ0aGlzLnNlbGVjdGVkSXRlbSYmdGhpcy5jbGVhclNlbGVjdGlvbigpLHRoaXMuX2lzSW5kZXhSZW5kZXJlZCh0KSl7dmFyIGU9dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9nZXRQaHlzaWNhbEluZGV4KHQpXSk7ZSYmKGVbdGhpcy5zZWxlY3RlZEFzXT0hMCksdGhpcy51cGRhdGVTaXplRm9ySW5kZXgodCl9dGhpcy4kLnNlbGVjdG9yLnNlbGVjdEluZGV4KHQpfX0sZGVzZWxlY3RJdGVtOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRlc2VsZWN0SW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKHQpKX0sZGVzZWxlY3RJbmRleDpmdW5jdGlvbih0KXt0PDB8fHQ+PXRoaXMuX3ZpcnR1YWxDb3VudHx8KHRoaXMuX2lzSW5kZXhSZW5kZXJlZCh0KSYmKHRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZ2V0UGh5c2ljYWxJbmRleCh0KV0pW3RoaXMuc2VsZWN0ZWRBc109ITEsdGhpcy51cGRhdGVTaXplRm9ySW5kZXgodCkpLHRoaXMuJC5zZWxlY3Rvci5kZXNlbGVjdEluZGV4KHQpKX0sdG9nZ2xlU2VsZWN0aW9uRm9ySXRlbTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50b2dnbGVTZWxlY3Rpb25Gb3JJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YodCkpfSx0b2dnbGVTZWxlY3Rpb25Gb3JJbmRleDpmdW5jdGlvbih0KXsodGhpcy4kLnNlbGVjdG9yLmlzSW5kZXhTZWxlY3RlZD90aGlzLiQuc2VsZWN0b3IuaXNJbmRleFNlbGVjdGVkKHQpOnRoaXMuJC5zZWxlY3Rvci5pc1NlbGVjdGVkKHRoaXMuaXRlbXNbdF0pKT90aGlzLmRlc2VsZWN0SW5kZXgodCk6dGhpcy5zZWxlY3RJbmRleCh0KX0sY2xlYXJTZWxlY3Rpb246ZnVuY3Rpb24oKXt0aGlzLl9pdGVyYXRlSXRlbXMoKGZ1bmN0aW9uKHQsZSl7dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1t0XSlbdGhpcy5zZWxlY3RlZEFzXT0hMX0pKSx0aGlzLiQuc2VsZWN0b3IuY2xlYXJTZWxlY3Rpb24oKX0sX3NlbGVjdGlvbkVuYWJsZWRDaGFuZ2VkOmZ1bmN0aW9uKHQpeyh0P3RoaXMubGlzdGVuOnRoaXMudW5saXN0ZW4pLmNhbGwodGhpcyx0aGlzLCJ0YXAiLCJfc2VsZWN0aW9uSGFuZGxlciIpfSxfc2VsZWN0aW9uSGFuZGxlcjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm1vZGVsRm9yRWxlbWVudCh0LnRhcmdldCk7aWYoZSl7dmFyIG4saSxyPVlpKHQpLnBhdGhbMF0sbz10aGlzLl9nZXRBY3RpdmVFbGVtZW50KCksYT10aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgoZVt0aGlzLmluZGV4QXNdKV07ImlucHV0IiE9PXIubG9jYWxOYW1lJiYiYnV0dG9uIiE9PXIubG9jYWxOYW1lJiYic2VsZWN0IiE9PXIubG9jYWxOYW1lJiYobj1lLnRhYkluZGV4LGUudGFiSW5kZXg9Vm8saT1vP28udGFiSW5kZXg6LTEsZS50YWJJbmRleD1uLG8mJmEhPT1vJiZhLmNvbnRhaW5zKG8pJiZpIT09Vm98fHRoaXMudG9nZ2xlU2VsZWN0aW9uRm9ySXRlbShlW3RoaXMuYXNdKSl9fSxfbXVsdGlTZWxlY3Rpb25DaGFuZ2VkOmZ1bmN0aW9uKHQpe3RoaXMuY2xlYXJTZWxlY3Rpb24oKSx0aGlzLiQuc2VsZWN0b3IubXVsdGk9dH0sdXBkYXRlU2l6ZUZvckl0ZW06ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudXBkYXRlU2l6ZUZvckluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZih0KSl9LHVwZGF0ZVNpemVGb3JJbmRleDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faXNJbmRleFJlbmRlcmVkKHQpPyh0aGlzLl91cGRhdGVNZXRyaWNzKFt0aGlzLl9nZXRQaHlzaWNhbEluZGV4KHQpXSksdGhpcy5fcG9zaXRpb25JdGVtcygpLG51bGwpOm51bGx9LF9tYW5hZ2VGb2N1czpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg7dD49MCYmdDx0aGlzLl92aXJ0dWFsQ291bnQ/dGhpcy5faXNJbmRleFJlbmRlcmVkKHQpP3RoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpOnRoaXMuX2NyZWF0ZUZvY3VzQmFja2ZpbGxJdGVtKCk6dGhpcy5fdmlydHVhbENvdW50PjAmJnRoaXMuX3BoeXNpY2FsQ291bnQ+MCYmKHRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX3BoeXNpY2FsU3RhcnQsdGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleD10aGlzLl92aXJ0dWFsU3RhcnQsdGhpcy5fZm9jdXNlZEl0ZW09dGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9waHlzaWNhbFN0YXJ0XSl9LF9jb252ZXJ0SW5kZXhUb0NvbXBsZXRlUm93OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pdGVtc1BlclJvdz10aGlzLl9pdGVtc1BlclJvd3x8MSx0aGlzLmdyaWQ/TWF0aC5jZWlsKHQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX2l0ZW1zUGVyUm93OnR9LF9pc0luZGV4UmVuZGVyZWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PXRoaXMuX3ZpcnR1YWxTdGFydCYmdDw9dGhpcy5fdmlydHVhbEVuZH0sX2lzSW5kZXhWaXNpYmxlOmZ1bmN0aW9uKHQpe3JldHVybiB0Pj10aGlzLmZpcnN0VmlzaWJsZUluZGV4JiZ0PD10aGlzLmxhc3RWaXNpYmxlSW5kZXh9LF9nZXRQaHlzaWNhbEluZGV4OmZ1bmN0aW9uKHQpe3JldHVybih0aGlzLl9waHlzaWNhbFN0YXJ0Kyh0LXRoaXMuX3ZpcnR1YWxTdGFydCkpJXRoaXMuX3BoeXNpY2FsQ291bnR9LGZvY3VzSXRlbTpmdW5jdGlvbih0KXt0aGlzLl9mb2N1c1BoeXNpY2FsSXRlbSh0KX0sX2ZvY3VzUGh5c2ljYWxJdGVtOmZ1bmN0aW9uKHQpe2lmKCEodDwwfHx0Pj10aGlzLl92aXJ0dWFsQ291bnQpKXt0aGlzLl9yZXN0b3JlRm9jdXNlZEl0ZW0oKSx0aGlzLl9pc0luZGV4UmVuZGVyZWQodCl8fHRoaXMuc2Nyb2xsVG9JbmRleCh0KTt2YXIgZSxuPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZ2V0UGh5c2ljYWxJbmRleCh0KV0saT10aGlzLm1vZGVsRm9yRWxlbWVudChuKTtpLnRhYkluZGV4PVZvLG4udGFiSW5kZXg9PT1WbyYmKGU9biksZXx8KGU9WWkobikucXVlcnlTZWxlY3RvcignW3RhYmluZGV4PSItMTAwIl0nKSksaS50YWJJbmRleD0wLHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9dCxlJiZlLmZvY3VzKCl9fSxfcmVtb3ZlRm9jdXNlZEl0ZW06ZnVuY3Rpb24oKXt0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSYmdGhpcy5faXRlbXNQYXJlbnQucmVtb3ZlQ2hpbGQodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pLHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtPW51bGwsdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW09bnVsbCx0aGlzLl9mb2N1c2VkSXRlbT1udWxsLHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9LTEsdGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXg9LTF9LF9jcmVhdGVGb2N1c0JhY2tmaWxsSXRlbTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4O2lmKCEodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW18fHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg8MCkpe2lmKCF0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSl7dmFyIGU9dGhpcy5zdGFtcChudWxsKTt0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT1lLnJvb3QucXVlcnlTZWxlY3RvcigiKiIpLHRoaXMuX2l0ZW1zUGFyZW50LmFwcGVuZENoaWxkKGUucm9vdCl9dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW09dGhpcy5fcGh5c2ljYWxJdGVtc1t0XSx0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSkudGFiSW5kZXg9MCx0aGlzLl9waHlzaWNhbEl0ZW1zW3RdPXRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtLHRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXQsdGhpcy50cmFuc2xhdGUzZCgwLEZvLDAsdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pfX0sX3Jlc3RvcmVGb2N1c2VkSXRlbTpmdW5jdGlvbigpe2lmKHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtJiYhKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg8MCkpe3RoaXMuX2Fzc2lnbk1vZGVscygpO3ZhciB0PXRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX2dldFBoeXNpY2FsSW5kZXgodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCksZT10aGlzLl9waHlzaWNhbEl0ZW1zW3RdO2lmKGUpe3ZhciBuPXRoaXMubW9kZWxGb3JFbGVtZW50KGUpLGk9dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pO25bdGhpcy5hc109PT1pW3RoaXMuYXNdPyh0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT1lLG4udGFiSW5kZXg9LTEsdGhpcy5fcGh5c2ljYWxJdGVtc1t0XT10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSx0aGlzLnRyYW5zbGF0ZTNkKDAsRm8sMCx0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSkpOih0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpLHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtPW51bGwpLHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtPW51bGx9fX0sX2RpZEZvY3VzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubW9kZWxGb3JFbGVtZW50KHQudGFyZ2V0KSxuPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX2ZvY3VzZWRJdGVtKSxpPW51bGwhPT10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSxyPXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg7ZSYmKG49PT1lP3RoaXMuX2lzSW5kZXhWaXNpYmxlKHIpfHx0aGlzLnNjcm9sbFRvSW5kZXgocik6KHRoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpLG4mJihuLnRhYkluZGV4PS0xKSxlLnRhYkluZGV4PTAsdGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleD1yPWVbdGhpcy5pbmRleEFzXSx0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleD10aGlzLl9nZXRQaHlzaWNhbEluZGV4KHIpLHRoaXMuX2ZvY3VzZWRJdGVtPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXhdLGkmJiF0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSYmdGhpcy5fdXBkYXRlKCkpKX0sX2tleWRvd25IYW5kbGVyOmZ1bmN0aW9uKHQpe3N3aXRjaCh0LmtleUNvZGUpe2Nhc2UgNDA6dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleDx0aGlzLl92aXJ0dWFsQ291bnQtMSYmdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgrKHRoaXMuZ3JpZD90aGlzLl9pdGVtc1BlclJvdzoxKSk7YnJlYWs7Y2FzZSAzOTp0aGlzLmdyaWQmJnRoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgrKHRoaXMuX2lzUlRMPy0xOjEpKTticmVhaztjYXNlIDM4OnRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg+MCYmdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgtKHRoaXMuZ3JpZD90aGlzLl9pdGVtc1BlclJvdzoxKSk7YnJlYWs7Y2FzZSAzNzp0aGlzLmdyaWQmJnRoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgrKHRoaXMuX2lzUlRMPzE6LTEpKTticmVhaztjYXNlIDEzOnRoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgpLHRoaXMuc2VsZWN0aW9uRW5hYmxlZCYmdGhpcy5fc2VsZWN0aW9uSGFuZGxlcih0KX19LF9jbGFtcDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIE1hdGgubWluKG4sTWF0aC5tYXgoZSx0KSl9LF9kZWJvdW5jZTpmdW5jdGlvbih0LGUsbil7dGhpcy5fZGVib3VuY2Vycz10aGlzLl9kZWJvdW5jZXJzfHx7fSx0aGlzLl9kZWJvdW5jZXJzW3RdPVRuLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlcnNbdF0sbixlLmJpbmQodGhpcykpLEFuKHRoaXMuX2RlYm91bmNlcnNbdF0pfSxfZm9yd2FyZFByb3BlcnR5OmZ1bmN0aW9uKHQsZSxuKXt0Ll9zZXRQZW5kaW5nUHJvcGVydHkoZSxuKX0sX2ZvcndhcmRIb3N0UHJvcFYyOmZ1bmN0aW9uKHQsZSl7KHRoaXMuX3BoeXNpY2FsSXRlbXN8fFtdKS5jb25jYXQoW3RoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtLHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtXSkuZm9yRWFjaCgoZnVuY3Rpb24obil7biYmdGhpcy5tb2RlbEZvckVsZW1lbnQobikuZm9yd2FyZEhvc3RQcm9wKHQsZSl9KSx0aGlzKX0sX25vdGlmeUluc3RhbmNlUHJvcFYyOmZ1bmN0aW9uKHQsZSxuKXtpZihRKHRoaXMuYXMsZSkpe3ZhciBpPXRbdGhpcy5pbmRleEFzXTtlPT10aGlzLmFzJiYodGhpcy5pdGVtc1tpXT1uKSx0aGlzLm5vdGlmeVBhdGgoSih0aGlzLmFzLCJpdGVtcy4iK2ksZSksbil9fSxfZ2V0U3RhbXBlZENoaWxkcmVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsSXRlbXN9LF9mb3J3YXJkSW5zdGFuY2VQYXRoOmZ1bmN0aW9uKHQsZSxuKXswPT09ZS5pbmRleE9mKHRoaXMuYXMrIi4iKSYmdGhpcy5ub3RpZnlQYXRoKCJpdGVtcy4iK3QuX19rZXlfXysiLiIrZS5zbGljZSh0aGlzLmFzLmxlbmd0aCsxKSxuKX0sX2ZvcndhcmRQYXJlbnRQYXRoOmZ1bmN0aW9uKHQsZSl7KHRoaXMuX3BoeXNpY2FsSXRlbXN8fFtdKS5jb25jYXQoW3RoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtLHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtXSkuZm9yRWFjaCgoZnVuY3Rpb24obil7biYmdGhpcy5tb2RlbEZvckVsZW1lbnQobikubm90aWZ5UGF0aCh0LGUpfSksdGhpcyl9LF9mb3J3YXJkUGFyZW50UHJvcDpmdW5jdGlvbih0LGUpeyh0aGlzLl9waHlzaWNhbEl0ZW1zfHxbXSkuY29uY2F0KFt0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSx0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbV0pLmZvckVhY2goKGZ1bmN0aW9uKG4pe24mJih0aGlzLm1vZGVsRm9yRWxlbWVudChuKVt0XT1lKX0pLHRoaXMpfSxfZ2V0QWN0aXZlRWxlbWVudDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2l0ZW1zUGFyZW50Lm5vZGUuZG9tSG9zdDtyZXR1cm4gWWkodD90LnJvb3Q6ZG9jdW1lbnQpLmFjdGl2ZUVsZW1lbnR9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjbGFzcyBVb3tjb25zdHJ1Y3Rvcih0KXt0aGlzLnNlbGVjdGlvbj1bXSx0aGlzLnNlbGVjdENhbGxiYWNrPXR9Z2V0KCl7cmV0dXJuIHRoaXMubXVsdGk/dGhpcy5zZWxlY3Rpb24uc2xpY2UoKTp0aGlzLnNlbGVjdGlvblswXX1jbGVhcih0KXt0aGlzLnNlbGVjdGlvbi5zbGljZSgpLmZvckVhY2goKGZ1bmN0aW9uKGUpeyghdHx8dC5pbmRleE9mKGUpPDApJiZ0aGlzLnNldEl0ZW1TZWxlY3RlZChlLCExKX0pLHRoaXMpfWlzU2VsZWN0ZWQodCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uLmluZGV4T2YodCk+PTB9c2V0SXRlbVNlbGVjdGVkKHQsZSl7aWYobnVsbCE9dCYmZSE9PXRoaXMuaXNTZWxlY3RlZCh0KSl7aWYoZSl0aGlzLnNlbGVjdGlvbi5wdXNoKHQpO2Vsc2V7dmFyIG49dGhpcy5zZWxlY3Rpb24uaW5kZXhPZih0KTtuPj0wJiZ0aGlzLnNlbGVjdGlvbi5zcGxpY2UobiwxKX10aGlzLnNlbGVjdENhbGxiYWNrJiZ0aGlzLnNlbGVjdENhbGxiYWNrKHQsZSl9fXNlbGVjdCh0KXt0aGlzLm11bHRpP3RoaXMudG9nZ2xlKHQpOnRoaXMuZ2V0KCkhPT10JiYodGhpcy5zZXRJdGVtU2VsZWN0ZWQodGhpcy5nZXQoKSwhMSksdGhpcy5zZXRJdGVtU2VsZWN0ZWQodCwhMCkpfXRvZ2dsZSh0KXt0aGlzLnNldEl0ZW1TZWxlY3RlZCh0LCF0aGlzLmlzU2VsZWN0ZWQodCkpfX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovY29uc3Qgam89e3Byb3BlcnRpZXM6e2F0dHJGb3JTZWxlY3RlZDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sc2VsZWN0ZWQ6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sc2VsZWN0ZWRJdGVtOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9LGFjdGl2YXRlRXZlbnQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJ0YXAiLG9ic2VydmVyOiJfYWN0aXZhdGVFdmVudENoYW5nZWQifSxzZWxlY3RhYmxlOlN0cmluZyxzZWxlY3RlZENsYXNzOnt0eXBlOlN0cmluZyx2YWx1ZToiaXJvbi1zZWxlY3RlZCJ9LHNlbGVjdGVkQXR0cmlidXRlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxmYWxsYmFja1NlbGVjdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0saXRlbXM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxfZXhjbHVkZWRMb2NhbE5hbWVzOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt0ZW1wbGF0ZToxLCJkb20tYmluZCI6MSwiZG9tLWlmIjoxLCJkb20tcmVwZWF0IjoxfX19fSxvYnNlcnZlcnM6WyJfdXBkYXRlQXR0ckZvclNlbGVjdGVkKGF0dHJGb3JTZWxlY3RlZCkiLCJfdXBkYXRlU2VsZWN0ZWQoc2VsZWN0ZWQpIiwiX2NoZWNrRmFsbGJhY2soZmFsbGJhY2tTZWxlY3Rpb24pIl0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX2JpbmRGaWx0ZXJJdGVtPXRoaXMuX2ZpbHRlckl0ZW0uYmluZCh0aGlzKSx0aGlzLl9zZWxlY3Rpb249bmV3IFVvKHRoaXMuX2FwcGx5U2VsZWN0aW9uLmJpbmQodGhpcykpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPXRoaXMuX29ic2VydmVJdGVtcyh0aGlzKSx0aGlzLl9hZGRMaXN0ZW5lcih0aGlzLmFjdGl2YXRlRXZlbnQpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiZZaSh0aGlzKS51bm9ic2VydmVOb2Rlcyh0aGlzLl9vYnNlcnZlciksdGhpcy5fcmVtb3ZlTGlzdGVuZXIodGhpcy5hY3RpdmF0ZUV2ZW50KX0saW5kZXhPZjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVtcz90aGlzLml0ZW1zLmluZGV4T2YodCk6LTF9LHNlbGVjdDpmdW5jdGlvbih0KXt0aGlzLnNlbGVjdGVkPXR9LHNlbGVjdFByZXZpb3VzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5pdGVtcy5sZW5ndGgsZT10LTE7dm9pZCAwIT09dGhpcy5zZWxlY3RlZCYmKGU9KE51bWJlcih0aGlzLl92YWx1ZVRvSW5kZXgodGhpcy5zZWxlY3RlZCkpLTErdCkldCksdGhpcy5zZWxlY3RlZD10aGlzLl9pbmRleFRvVmFsdWUoZSl9LHNlbGVjdE5leHQ6ZnVuY3Rpb24oKXt2YXIgdD0wO3ZvaWQgMCE9PXRoaXMuc2VsZWN0ZWQmJih0PShOdW1iZXIodGhpcy5fdmFsdWVUb0luZGV4KHRoaXMuc2VsZWN0ZWQpKSsxKSV0aGlzLml0ZW1zLmxlbmd0aCksdGhpcy5zZWxlY3RlZD10aGlzLl9pbmRleFRvVmFsdWUodCl9LHNlbGVjdEluZGV4OmZ1bmN0aW9uKHQpe3RoaXMuc2VsZWN0KHRoaXMuX2luZGV4VG9WYWx1ZSh0KSl9LGZvcmNlU3luY2hyb25vdXNJdGVtVXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLl9vYnNlcnZlci5mbHVzaD90aGlzLl9vYnNlcnZlci5mbHVzaCgpOnRoaXMuX3VwZGF0ZUl0ZW1zKCl9LGdldCBfc2hvdWxkVXBkYXRlU2VsZWN0aW9uKCl7cmV0dXJuIG51bGwhPXRoaXMuc2VsZWN0ZWR9LF9jaGVja0ZhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlU2VsZWN0ZWQoKX0sX2FkZExpc3RlbmVyOmZ1bmN0aW9uKHQpe3RoaXMubGlzdGVuKHRoaXMsdCwiX2FjdGl2YXRlSGFuZGxlciIpfSxfcmVtb3ZlTGlzdGVuZXI6ZnVuY3Rpb24odCl7dGhpcy51bmxpc3Rlbih0aGlzLHQsIl9hY3RpdmF0ZUhhbmRsZXIiKX0sX2FjdGl2YXRlRXZlbnRDaGFuZ2VkOmZ1bmN0aW9uKHQsZSl7dGhpcy5fcmVtb3ZlTGlzdGVuZXIoZSksdGhpcy5fYWRkTGlzdGVuZXIodCl9LF91cGRhdGVJdGVtczpmdW5jdGlvbigpe3ZhciB0PVlpKHRoaXMpLnF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyh0aGlzLnNlbGVjdGFibGV8fCIqIik7dD1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwodCx0aGlzLl9iaW5kRmlsdGVySXRlbSksdGhpcy5fc2V0SXRlbXModCl9LF91cGRhdGVBdHRyRm9yU2VsZWN0ZWQ6ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkSXRlbSYmKHRoaXMuc2VsZWN0ZWQ9dGhpcy5fdmFsdWVGb3JJdGVtKHRoaXMuc2VsZWN0ZWRJdGVtKSl9LF91cGRhdGVTZWxlY3RlZDpmdW5jdGlvbigpe3RoaXMuX3NlbGVjdFNlbGVjdGVkKHRoaXMuc2VsZWN0ZWQpfSxfc2VsZWN0U2VsZWN0ZWQ6ZnVuY3Rpb24odCl7aWYodGhpcy5pdGVtcyl7dmFyIGU9dGhpcy5fdmFsdWVUb0l0ZW0odGhpcy5zZWxlY3RlZCk7ZT90aGlzLl9zZWxlY3Rpb24uc2VsZWN0KGUpOnRoaXMuX3NlbGVjdGlvbi5jbGVhcigpLHRoaXMuZmFsbGJhY2tTZWxlY3Rpb24mJnRoaXMuaXRlbXMubGVuZ3RoJiZ2b2lkIDA9PT10aGlzLl9zZWxlY3Rpb24uZ2V0KCkmJih0aGlzLnNlbGVjdGVkPXRoaXMuZmFsbGJhY2tTZWxlY3Rpb24pfX0sX2ZpbHRlckl0ZW06ZnVuY3Rpb24odCl7cmV0dXJuIXRoaXMuX2V4Y2x1ZGVkTG9jYWxOYW1lc1t0LmxvY2FsTmFtZV19LF92YWx1ZVRvSXRlbTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9udWxsOnRoaXMuaXRlbXNbdGhpcy5fdmFsdWVUb0luZGV4KHQpXX0sX3ZhbHVlVG9JbmRleDpmdW5jdGlvbih0KXtpZighdGhpcy5hdHRyRm9yU2VsZWN0ZWQpcmV0dXJuIE51bWJlcih0KTtmb3IodmFyIGUsbj0wO2U9dGhpcy5pdGVtc1tuXTtuKyspaWYodGhpcy5fdmFsdWVGb3JJdGVtKGUpPT10KXJldHVybiBufSxfaW5kZXhUb1ZhbHVlOmZ1bmN0aW9uKHQpe2lmKCF0aGlzLmF0dHJGb3JTZWxlY3RlZClyZXR1cm4gdDt2YXIgZT10aGlzLml0ZW1zW3RdO3JldHVybiBlP3RoaXMuX3ZhbHVlRm9ySXRlbShlKTp2b2lkIDB9LF92YWx1ZUZvckl0ZW06ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIG51bGw7aWYoIXRoaXMuYXR0ckZvclNlbGVjdGVkKXt2YXIgZT10aGlzLmluZGV4T2YodCk7cmV0dXJuLTE9PT1lP251bGw6ZX12YXIgbj10W3N0KHRoaXMuYXR0ckZvclNlbGVjdGVkKV07cmV0dXJuIG51bGwhPW4/bjp0LmdldEF0dHJpYnV0ZSh0aGlzLmF0dHJGb3JTZWxlY3RlZCl9LF9hcHBseVNlbGVjdGlvbjpmdW5jdGlvbih0LGUpe3RoaXMuc2VsZWN0ZWRDbGFzcyYmdGhpcy50b2dnbGVDbGFzcyh0aGlzLnNlbGVjdGVkQ2xhc3MsZSx0KSx0aGlzLnNlbGVjdGVkQXR0cmlidXRlJiZ0aGlzLnRvZ2dsZUF0dHJpYnV0ZSh0aGlzLnNlbGVjdGVkQXR0cmlidXRlLGUsdCksdGhpcy5fc2VsZWN0aW9uQ2hhbmdlKCksdGhpcy5maXJlKCJpcm9uLSIrKGU/InNlbGVjdCI6ImRlc2VsZWN0Iikse2l0ZW06dH0pfSxfc2VsZWN0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtKHRoaXMuX3NlbGVjdGlvbi5nZXQoKSl9LF9vYnNlcnZlSXRlbXM6ZnVuY3Rpb24odCl7cmV0dXJuIFlpKHQpLm9ic2VydmVOb2RlcygoZnVuY3Rpb24odCl7dGhpcy5fdXBkYXRlSXRlbXMoKSx0aGlzLl91cGRhdGVTZWxlY3RlZCgpLHRoaXMuZmlyZSgiaXJvbi1pdGVtcy1jaGFuZ2VkIix0LHtidWJibGVzOiExLGNhbmNlbGFibGU6ITF9KX0pKX0sX2FjdGl2YXRlSGFuZGxlcjpmdW5jdGlvbih0KXtmb3IodmFyIGU9dC50YXJnZXQsbj10aGlzLml0ZW1zO2UmJmUhPXRoaXM7KXt2YXIgaT1uLmluZGV4T2YoZSk7aWYoaT49MCl7dmFyIHI9dGhpcy5faW5kZXhUb1ZhbHVlKGkpO3JldHVybiB2b2lkIHRoaXMuX2l0ZW1BY3RpdmF0ZShyLGUpfWU9ZS5wYXJlbnROb2RlfX0sX2l0ZW1BY3RpdmF0ZTpmdW5jdGlvbih0LGUpe3RoaXMuZmlyZSgiaXJvbi1hY3RpdmF0ZSIse3NlbGVjdGVkOnQsaXRlbTplfSx7Y2FuY2VsYWJsZTohMH0pLmRlZmF1bHRQcmV2ZW50ZWR8fHRoaXMuc2VsZWN0KHQpfX07Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL1JyKHtfdGVtcGxhdGU6X2VgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoOm5vdChzbG90KTpub3QoLmlyb24tc2VsZWN0ZWQpKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KYCxpczoiaXJvbi1wYWdlcyIsYmVoYXZpb3JzOltnbyxqb10scHJvcGVydGllczp7YWN0aXZhdGVFdmVudDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9zZWxlY3RlZFBhZ2VDaGFuZ2VkKHNlbGVjdGVkKSJdLF9zZWxlY3RlZFBhZ2VDaGFuZ2VkOmZ1bmN0aW9uKHQsZSl7dGhpcy5hc3luYyh0aGlzLm5vdGlmeVJlc2l6ZSl9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBHbz1fZWAKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKCiAgICAgIC0tc2hhZG93LXRyYW5zaXRpb246IHsKICAgICAgICB0cmFuc2l0aW9uOiBib3gtc2hhZG93IDAuMjhzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1ub25lOiB7CiAgICAgICAgYm94LXNoYWRvdzogbm9uZTsKICAgICAgfTsKCiAgICAgIC8qIGZyb20gaHR0cDovL2NvZGVwZW4uaW8vc2h5bmRtYW4vcGVuL2M1Mzk0ZGRmMmU4YjJhNWM5MTg1OTA0YjU3NDIxY2RiICovCgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tMmRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAycHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi0zZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDNweCA0cHggMCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgMXB4IDhweCAwIHJnYmEoMCwgMCwgMCwgMC4xMiksCiAgICAgICAgICAgICAgICAgICAgMCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTRkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCAxcHggMTBweCAwIHJnYmEoMCwgMCwgMCwgMC4xMiksCiAgICAgICAgICAgICAgICAgICAgMCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTZkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgNnB4IDEwcHggMCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgMXB4IDE4cHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi04ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMiksCiAgICAgICAgICAgICAgICAgICAgMCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTEyZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDEycHggMTZweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDRweCAyMnB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgNnB4IDdweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi0xNmRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCAgNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMiksCiAgICAgICAgICAgICAgICAgICAgMCAgOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tMjRkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMiksCiAgICAgICAgICAgICAgICAgICAgMCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CiAgICB9CiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+YDtHby5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZGlzcGxheTogbm9uZTsiKSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKEdvLmNvbnRlbnQpOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgV289X2VgCjxkb20tbW9kdWxlIGlkPSJwYXBlci1tYXRlcmlhbC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgaHRtbCB7CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbDogewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0xOiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTI6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tNGRwOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi02ZHA7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi00OiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLThkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTU6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDsKICAgICAgICB9OwogICAgICB9CiAgICAgIC5wYXBlci1tYXRlcmlhbCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWw7CiAgICAgIH0KICAgICAgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMSJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTsKICAgICAgfQogICAgICAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIyIl0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOwogICAgICB9CiAgICAgIC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjMiXSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTM7CiAgICAgIH0KICAgICAgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iNCJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDsKICAgICAgfQogICAgICAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI1Il0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OwogICAgICB9CgogICAgICAvKiBEdXBsaWNhdGUgdGhlIHN0eWxlcyBiZWNhdXNlIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJjb21wb25lbnRzL3NoYWR5Y3NzL2lzc3Vlcy8xOTMgKi8KICAgICAgOmhvc3QgewogICAgICAgIC0tcGFwZXItbWF0ZXJpYWw6IHsKICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTRkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTM6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tNmRwOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi04ZHA7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTE2ZHA7CiAgICAgICAgfTsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWwpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbDsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIxIl0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIyIl0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMjsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIzIl0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI0Il0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI1Il0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+YDtXby5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZGlzcGxheTogbm9uZTsiKSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKFdvLmNvbnRlbnQpOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgcW89e3Byb3BlcnRpZXM6e2ZvY3VzZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITAscmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxvYnNlcnZlcjoiX2Rpc2FibGVkQ2hhbmdlZCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfb2xkVGFiSW5kZXg6e3R5cGU6U3RyaW5nfSxfYm91bmRGb2N1c0JsdXJIYW5kbGVyOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZvY3VzQmx1ckhhbmRsZXIuYmluZCh0aGlzKX19fSxvYnNlcnZlcnM6WyJfY2hhbmdlZENvbnRyb2xTdGF0ZShmb2N1c2VkLCBkaXNhYmxlZCkiXSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2JvdW5kRm9jdXNCbHVySGFuZGxlciwhMCksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9ib3VuZEZvY3VzQmx1ckhhbmRsZXIsITApfSxfZm9jdXNCbHVySGFuZGxlcjpmdW5jdGlvbih0KXt0aGlzLl9zZXRGb2N1c2VkKCJmb2N1cyI9PT10LnR5cGUpfSxfZGlzYWJsZWRDaGFuZ2VkOmZ1bmN0aW9uKHQsZSl7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiLHQ/InRydWUiOiJmYWxzZSIpLHRoaXMuc3R5bGUucG9pbnRlckV2ZW50cz10PyJub25lIjoiIix0Pyh0aGlzLl9vbGRUYWJJbmRleD10aGlzLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSx0aGlzLl9zZXRGb2N1c2VkKCExKSx0aGlzLnRhYkluZGV4PS0xLHRoaXMuYmx1cigpKTp2b2lkIDAhPT10aGlzLl9vbGRUYWJJbmRleCYmKG51bGw9PT10aGlzLl9vbGRUYWJJbmRleD90aGlzLnJlbW92ZUF0dHJpYnV0ZSgidGFiaW5kZXgiKTp0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLHRoaXMuX29sZFRhYkluZGV4KSl9LF9jaGFuZ2VkQ29udHJvbFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCYmdGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCgpfX0sWW89e3Byb3BlcnRpZXM6e3ByZXNzZWQ6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMCx2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsb2JzZXJ2ZXI6Il9wcmVzc2VkQ2hhbmdlZCJ9LHRvZ2dsZXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHBvaW50ZXJEb3duOnt0eXBlOkJvb2xlYW4scmVhZE9ubHk6ITAsdmFsdWU6ITF9LHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQ6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMH0sYXJpYUFjdGl2ZUF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImFyaWEtcHJlc3NlZCIsb2JzZXJ2ZXI6Il9hcmlhQWN0aXZlQXR0cmlidXRlQ2hhbmdlZCJ9fSxsaXN0ZW5lcnM6e2Rvd246Il9kb3duSGFuZGxlciIsdXA6Il91cEhhbmRsZXIiLHRhcDoiX3RhcEhhbmRsZXIifSxvYnNlcnZlcnM6WyJfZm9jdXNDaGFuZ2VkKGZvY3VzZWQpIiwiX2FjdGl2ZUNoYW5nZWQoYWN0aXZlLCBhcmlhQWN0aXZlQXR0cmlidXRlKSJdLGtleUJpbmRpbmdzOnsiZW50ZXI6a2V5ZG93biI6Il9hc3luY0NsaWNrIiwic3BhY2U6a2V5ZG93biI6Il9zcGFjZUtleURvd25IYW5kbGVyIiwic3BhY2U6a2V5dXAiOiJfc3BhY2VLZXlVcEhhbmRsZXIifSxfbW91c2VFdmVudFJlOi9ebW91c2UvLF90YXBIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy50b2dnbGVzP3RoaXMuX3VzZXJBY3RpdmF0ZSghdGhpcy5hY3RpdmUpOnRoaXMuYWN0aXZlPSExfSxfZm9jdXNDaGFuZ2VkOmZ1bmN0aW9uKHQpe3RoaXMuX2RldGVjdEtleWJvYXJkRm9jdXModCksdHx8dGhpcy5fc2V0UHJlc3NlZCghMSl9LF9kZXRlY3RLZXlib2FyZEZvY3VzOmZ1bmN0aW9uKHQpe3RoaXMuX3NldFJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQoIXRoaXMucG9pbnRlckRvd24mJnQpfSxfdXNlckFjdGl2YXRlOmZ1bmN0aW9uKHQpe3RoaXMuYWN0aXZlIT09dCYmKHRoaXMuYWN0aXZlPXQsdGhpcy5maXJlKCJjaGFuZ2UiKSl9LF9kb3duSGFuZGxlcjpmdW5jdGlvbih0KXt0aGlzLl9zZXRQb2ludGVyRG93bighMCksdGhpcy5fc2V0UHJlc3NlZCghMCksdGhpcy5fc2V0UmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCghMSl9LF91cEhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLl9zZXRQb2ludGVyRG93bighMSksdGhpcy5fc2V0UHJlc3NlZCghMSl9LF9zcGFjZUtleURvd25IYW5kbGVyOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZGV0YWlsLmtleWJvYXJkRXZlbnQsbj1ZaShlKS5sb2NhbFRhcmdldDt0aGlzLmlzTGlnaHREZXNjZW5kYW50KG4pfHwoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5fc2V0UHJlc3NlZCghMCkpfSxfc3BhY2VLZXlVcEhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGU9WWkodC5kZXRhaWwua2V5Ym9hcmRFdmVudCkubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChlKXx8KHRoaXMucHJlc3NlZCYmdGhpcy5fYXN5bmNDbGljaygpLHRoaXMuX3NldFByZXNzZWQoITEpKX0sX2FzeW5jQ2xpY2s6ZnVuY3Rpb24oKXt0aGlzLmFzeW5jKChmdW5jdGlvbigpe3RoaXMuY2xpY2soKX0pLDEpfSxfcHJlc3NlZENoYW5nZWQ6ZnVuY3Rpb24odCl7dGhpcy5fY2hhbmdlZEJ1dHRvblN0YXRlKCl9LF9hcmlhQWN0aXZlQXR0cmlidXRlQ2hhbmdlZDpmdW5jdGlvbih0LGUpe2UmJmUhPXQmJnRoaXMuaGFzQXR0cmlidXRlKGUpJiZ0aGlzLnJlbW92ZUF0dHJpYnV0ZShlKX0sX2FjdGl2ZUNoYW5nZWQ6ZnVuY3Rpb24odCxlKXt0aGlzLnRvZ2dsZXM/dGhpcy5zZXRBdHRyaWJ1dGUodGhpcy5hcmlhQWN0aXZlQXR0cmlidXRlLHQ/InRydWUiOiJmYWxzZSIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKHRoaXMuYXJpYUFjdGl2ZUF0dHJpYnV0ZSksdGhpcy5fY2hhbmdlZEJ1dHRvblN0YXRlKCl9LF9jb250cm9sU3RhdGVDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlZD90aGlzLl9zZXRQcmVzc2VkKCExKTp0aGlzLl9jaGFuZ2VkQnV0dG9uU3RhdGUoKX0sX2NoYW5nZWRCdXR0b25TdGF0ZTpmdW5jdGlvbigpe3RoaXMuX2J1dHRvblN0YXRlQ2hhbmdlZCYmdGhpcy5fYnV0dG9uU3RhdGVDaGFuZ2VkKCl9fSxYbz1bem8sWW9dOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCnZhciAkbz17ZGlzdGFuY2U6ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dC1uLG89ZS1pO3JldHVybiBNYXRoLnNxcnQocipyK28qbyl9LG5vdzp3aW5kb3cucGVyZm9ybWFuY2UmJndpbmRvdy5wZXJmb3JtYW5jZS5ub3c/d2luZG93LnBlcmZvcm1hbmNlLm5vdy5iaW5kKHdpbmRvdy5wZXJmb3JtYW5jZSk6RGF0ZS5ub3d9O2Z1bmN0aW9uIEtvKHQpe3RoaXMuZWxlbWVudD10LHRoaXMud2lkdGg9dGhpcy5ib3VuZGluZ1JlY3Qud2lkdGgsdGhpcy5oZWlnaHQ9dGhpcy5ib3VuZGluZ1JlY3QuaGVpZ2h0LHRoaXMuc2l6ZT1NYXRoLm1heCh0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KX1mdW5jdGlvbiBabyh0KXt0aGlzLmVsZW1lbnQ9dCx0aGlzLmNvbG9yPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLmNvbG9yLHRoaXMud2F2ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLndhdmVDb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy53YXZlLnN0eWxlLmJhY2tncm91bmRDb2xvcj10aGlzLmNvbG9yLHRoaXMud2F2ZS5jbGFzc0xpc3QuYWRkKCJ3YXZlIiksdGhpcy53YXZlQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoIndhdmUtY29udGFpbmVyIiksWWkodGhpcy53YXZlQ29udGFpbmVyKS5hcHBlbmRDaGlsZCh0aGlzLndhdmUpLHRoaXMucmVzZXRJbnRlcmFjdGlvblN0YXRlKCl9S28ucHJvdG90eXBlPXtnZXQgYm91bmRpbmdSZWN0KCl7cmV0dXJuIHRoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0sZnVydGhlc3RDb3JuZXJEaXN0YW5jZUZyb206ZnVuY3Rpb24odCxlKXt2YXIgbj0kby5kaXN0YW5jZSh0LGUsMCwwKSxpPSRvLmRpc3RhbmNlKHQsZSx0aGlzLndpZHRoLDApLHI9JG8uZGlzdGFuY2UodCxlLDAsdGhpcy5oZWlnaHQpLG89JG8uZGlzdGFuY2UodCxlLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpO3JldHVybiBNYXRoLm1heChuLGkscixvKX19LFpvLk1BWF9SQURJVVM9MzAwLFpvLnByb3RvdHlwZT17Z2V0IHJlY2VudGVycygpe3JldHVybiB0aGlzLmVsZW1lbnQucmVjZW50ZXJzfSxnZXQgY2VudGVyKCl7cmV0dXJuIHRoaXMuZWxlbWVudC5jZW50ZXJ9LGdldCBtb3VzZURvd25FbGFwc2VkKCl7dmFyIHQ7cmV0dXJuIHRoaXMubW91c2VEb3duU3RhcnQ/KHQ9JG8ubm93KCktdGhpcy5tb3VzZURvd25TdGFydCx0aGlzLm1vdXNlVXBTdGFydCYmKHQtPXRoaXMubW91c2VVcEVsYXBzZWQpLHQpOjB9LGdldCBtb3VzZVVwRWxhcHNlZCgpe3JldHVybiB0aGlzLm1vdXNlVXBTdGFydD8kby5ub3coKS10aGlzLm1vdXNlVXBTdGFydDowfSxnZXQgbW91c2VEb3duRWxhcHNlZFNlY29uZHMoKXtyZXR1cm4gdGhpcy5tb3VzZURvd25FbGFwc2VkLzFlM30sZ2V0IG1vdXNlVXBFbGFwc2VkU2Vjb25kcygpe3JldHVybiB0aGlzLm1vdXNlVXBFbGFwc2VkLzFlM30sZ2V0IG1vdXNlSW50ZXJhY3Rpb25TZWNvbmRzKCl7cmV0dXJuIHRoaXMubW91c2VEb3duRWxhcHNlZFNlY29uZHMrdGhpcy5tb3VzZVVwRWxhcHNlZFNlY29uZHN9LGdldCBpbml0aWFsT3BhY2l0eSgpe3JldHVybiB0aGlzLmVsZW1lbnQuaW5pdGlhbE9wYWNpdHl9LGdldCBvcGFjaXR5RGVjYXlWZWxvY2l0eSgpe3JldHVybiB0aGlzLmVsZW1lbnQub3BhY2l0eURlY2F5VmVsb2NpdHl9LGdldCByYWRpdXMoKXt2YXIgdD0xLjEqTWF0aC5taW4oTWF0aC5zcXJ0KHRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aCp0aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgrdGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodCp0aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0KSxaby5NQVhfUkFESVVTKSs1LGU9dCooMS1NYXRoLnBvdyg4MCwtdGhpcy5tb3VzZUludGVyYWN0aW9uU2Vjb25kcy8oMS4xLXQvWm8uTUFYX1JBRElVUyouMikpKTtyZXR1cm4gTWF0aC5hYnMoZSl9LGdldCBvcGFjaXR5KCl7cmV0dXJuIHRoaXMubW91c2VVcFN0YXJ0P01hdGgubWF4KDAsdGhpcy5pbml0aWFsT3BhY2l0eS10aGlzLm1vdXNlVXBFbGFwc2VkU2Vjb25kcyp0aGlzLm9wYWNpdHlEZWNheVZlbG9jaXR5KTp0aGlzLmluaXRpYWxPcGFjaXR5fSxnZXQgb3V0ZXJPcGFjaXR5KCl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oLjMqdGhpcy5tb3VzZVVwRWxhcHNlZFNlY29uZHMsdGhpcy5vcGFjaXR5KSl9LGdldCBpc09wYWNpdHlGdWxseURlY2F5ZWQoKXtyZXR1cm4gdGhpcy5vcGFjaXR5PC4wMSYmdGhpcy5yYWRpdXM+PU1hdGgubWluKHRoaXMubWF4UmFkaXVzLFpvLk1BWF9SQURJVVMpfSxnZXQgaXNSZXN0aW5nQXRNYXhSYWRpdXMoKXtyZXR1cm4gdGhpcy5vcGFjaXR5Pj10aGlzLmluaXRpYWxPcGFjaXR5JiZ0aGlzLnJhZGl1cz49TWF0aC5taW4odGhpcy5tYXhSYWRpdXMsWm8uTUFYX1JBRElVUyl9LGdldCBpc0FuaW1hdGlvbkNvbXBsZXRlKCl7cmV0dXJuIHRoaXMubW91c2VVcFN0YXJ0P3RoaXMuaXNPcGFjaXR5RnVsbHlEZWNheWVkOnRoaXMuaXNSZXN0aW5nQXRNYXhSYWRpdXN9LGdldCB0cmFuc2xhdGlvbkZyYWN0aW9uKCl7cmV0dXJuIE1hdGgubWluKDEsdGhpcy5yYWRpdXMvdGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUqMi9NYXRoLnNxcnQoMikpfSxnZXQgeE5vdygpe3JldHVybiB0aGlzLnhFbmQ/dGhpcy54U3RhcnQrdGhpcy50cmFuc2xhdGlvbkZyYWN0aW9uKih0aGlzLnhFbmQtdGhpcy54U3RhcnQpOnRoaXMueFN0YXJ0fSxnZXQgeU5vdygpe3JldHVybiB0aGlzLnlFbmQ/dGhpcy55U3RhcnQrdGhpcy50cmFuc2xhdGlvbkZyYWN0aW9uKih0aGlzLnlFbmQtdGhpcy55U3RhcnQpOnRoaXMueVN0YXJ0fSxnZXQgaXNNb3VzZURvd24oKXtyZXR1cm4gdGhpcy5tb3VzZURvd25TdGFydCYmIXRoaXMubW91c2VVcFN0YXJ0fSxyZXNldEludGVyYWN0aW9uU3RhdGU6ZnVuY3Rpb24oKXt0aGlzLm1heFJhZGl1cz0wLHRoaXMubW91c2VEb3duU3RhcnQ9MCx0aGlzLm1vdXNlVXBTdGFydD0wLHRoaXMueFN0YXJ0PTAsdGhpcy55U3RhcnQ9MCx0aGlzLnhFbmQ9MCx0aGlzLnlFbmQ9MCx0aGlzLnNsaWRlRGlzdGFuY2U9MCx0aGlzLmNvbnRhaW5lck1ldHJpY3M9bmV3IEtvKHRoaXMuZWxlbWVudCl9LGRyYXc6ZnVuY3Rpb24oKXt2YXIgdCxlLG47dGhpcy53YXZlLnN0eWxlLm9wYWNpdHk9dGhpcy5vcGFjaXR5LHQ9dGhpcy5yYWRpdXMvKHRoaXMuY29udGFpbmVyTWV0cmljcy5zaXplLzIpLHRoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS53ZWJraXRUcmFuc2Zvcm09InRyYW5zbGF0ZSgiKyhlPXRoaXMueE5vdy10aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgvMikrInB4LCAiKyhuPXRoaXMueU5vdy10aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0LzIpKyJweCkiLHRoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKCIrZSsicHgsICIrbisicHgsIDApIix0aGlzLndhdmUuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJzY2FsZSgiK3QrIiwiK3QrIikiLHRoaXMud2F2ZS5zdHlsZS50cmFuc2Zvcm09InNjYWxlM2QoIit0KyIsIit0KyIsMSkifSxkb3duQWN0aW9uOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aC8yLG49dGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodC8yO3RoaXMucmVzZXRJbnRlcmFjdGlvblN0YXRlKCksdGhpcy5tb3VzZURvd25TdGFydD0kby5ub3coKSx0aGlzLmNlbnRlcj8odGhpcy54U3RhcnQ9ZSx0aGlzLnlTdGFydD1uLHRoaXMuc2xpZGVEaXN0YW5jZT0kby5kaXN0YW5jZSh0aGlzLnhTdGFydCx0aGlzLnlTdGFydCx0aGlzLnhFbmQsdGhpcy55RW5kKSk6KHRoaXMueFN0YXJ0PXQ/dC5kZXRhaWwueC10aGlzLmNvbnRhaW5lck1ldHJpY3MuYm91bmRpbmdSZWN0LmxlZnQ6dGhpcy5jb250YWluZXJNZXRyaWNzLndpZHRoLzIsdGhpcy55U3RhcnQ9dD90LmRldGFpbC55LXRoaXMuY29udGFpbmVyTWV0cmljcy5ib3VuZGluZ1JlY3QudG9wOnRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQvMiksdGhpcy5yZWNlbnRlcnMmJih0aGlzLnhFbmQ9ZSx0aGlzLnlFbmQ9bix0aGlzLnNsaWRlRGlzdGFuY2U9JG8uZGlzdGFuY2UodGhpcy54U3RhcnQsdGhpcy55U3RhcnQsdGhpcy54RW5kLHRoaXMueUVuZCkpLHRoaXMubWF4UmFkaXVzPXRoaXMuY29udGFpbmVyTWV0cmljcy5mdXJ0aGVzdENvcm5lckRpc3RhbmNlRnJvbSh0aGlzLnhTdGFydCx0aGlzLnlTdGFydCksdGhpcy53YXZlQ29udGFpbmVyLnN0eWxlLnRvcD0odGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodC10aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSkvMisicHgiLHRoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS5sZWZ0PSh0aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgtdGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUpLzIrInB4Iix0aGlzLndhdmVDb250YWluZXIuc3R5bGUud2lkdGg9dGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUrInB4Iix0aGlzLndhdmVDb250YWluZXIuc3R5bGUuaGVpZ2h0PXRoaXMuY29udGFpbmVyTWV0cmljcy5zaXplKyJweCJ9LHVwQWN0aW9uOmZ1bmN0aW9uKHQpe3RoaXMuaXNNb3VzZURvd24mJih0aGlzLm1vdXNlVXBTdGFydD0kby5ub3coKSl9LHJlbW92ZTpmdW5jdGlvbigpe1lpKFlpKHRoaXMud2F2ZUNvbnRhaW5lcikucGFyZW50Tm9kZSkucmVtb3ZlQ2hpbGQodGhpcy53YXZlQ29udGFpbmVyKX19LFJyKHtfdGVtcGxhdGU6X2VgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKCiAgICAgICAgLyogU2VlIFBvbHltZXJFbGVtZW50cy9wYXBlci1iZWhhdmlvcnMvaXNzdWVzLzM0LiBPbiBub24tQ2hyb21lIGJyb3dzZXJzLAogICAgICAgICAqIGNyZWF0aW5nIGEgbm9kZSAod2l0aCBhIHBvc2l0aW9uOmFic29sdXRlKSBpbiB0aGUgbWlkZGxlIG9mIGFuIGV2ZW50CiAgICAgICAgICogaGFuZGxlciAiaW50ZXJydXB0cyIgdGhhdCBldmVudCBoYW5kbGVyICh3aGljaCBoYXBwZW5zIHdoZW4gdGhlCiAgICAgICAgICogcmlwcGxlIGlzIGNyZWF0ZWQgb24gZGVtYW5kKSAqLwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICA6aG9zdChbYW5pbWF0aW5nXSkgewogICAgICAgIC8qIFRoaXMgcmVzb2x2ZXMgYSByZW5kZXJpbmcgaXNzdWUgaW4gQ2hyb21lIChhcyBvZiA0MCkgd2hlcmUgdGhlCiAgICAgICAgICAgcmlwcGxlIGlzIG5vdCBwcm9wZXJseSBjbGlwcGVkIGJ5IGl0cyBwYXJlbnQgKHdoaWNoIG1heSBoYXZlCiAgICAgICAgICAgcm91bmRlZCBjb3JuZXJzKS4gU2VlOiBodHRwOi8vanNiaW4uY29tL3RlbWV4YS80CgogICAgICAgICAgIE5vdGU6IFdlIG9ubHkgYXBwbHkgdGhpcyBzdHlsZSBjb25kaXRpb25hbGx5LiBPdGhlcndpc2UsIHRoZSBicm93c2VyCiAgICAgICAgICAgd2lsbCBjcmVhdGUgYSBuZXcgY29tcG9zaXRpbmcgbGF5ZXIgZm9yIGV2ZXJ5IHJpcHBsZSBlbGVtZW50IG9uIHRoZQogICAgICAgICAgIHBhZ2UsIGFuZCB0aGF0IHdvdWxkIGJlIGJhZC4gKi8KICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7CiAgICAgIH0KCiAgICAgICNiYWNrZ3JvdW5kLAogICAgICAjd2F2ZXMsCiAgICAgIC53YXZlLWNvbnRhaW5lciwKICAgICAgLndhdmUgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgICNiYWNrZ3JvdW5kLAogICAgICAud2F2ZSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgI3dhdmVzLAogICAgICAud2F2ZSB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLndhdmUtY29udGFpbmVyLAogICAgICAud2F2ZSB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICB9CgogICAgICA6aG9zdCguY2lyY2xlKSAjYmFja2dyb3VuZCwKICAgICAgOmhvc3QoLmNpcmNsZSkgI3dhdmVzIHsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgIH0KCiAgICAgIDpob3N0KC5jaXJjbGUpIC53YXZlLWNvbnRhaW5lciB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJiYWNrZ3JvdW5kIj48L2Rpdj4KICAgIDxkaXYgaWQ9IndhdmVzIj48L2Rpdj4KYCxpczoicGFwZXItcmlwcGxlIixiZWhhdmlvcnM6W3pvXSxwcm9wZXJ0aWVzOntpbml0aWFsT3BhY2l0eTp7dHlwZTpOdW1iZXIsdmFsdWU6LjI1fSxvcGFjaXR5RGVjYXlWZWxvY2l0eTp7dHlwZTpOdW1iZXIsdmFsdWU6Ljh9LHJlY2VudGVyczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxjZW50ZXI6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0scmlwcGxlczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sYW5pbWF0aW5nOnt0eXBlOkJvb2xlYW4scmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExfSxob2xkRG93bjp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfaG9sZERvd25DaGFuZ2VkIn0sbm9pbms6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2FuaW1hdGluZzp7dHlwZTpCb29sZWFufSxfYm91bmRBbmltYXRlOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYW5pbWF0ZS5iaW5kKHRoaXMpfX19LGdldCB0YXJnZXQoKXtyZXR1cm4gdGhpcy5rZXlFdmVudFRhcmdldH0sa2V5QmluZGluZ3M6eyJlbnRlcjprZXlkb3duIjoiX29uRW50ZXJLZXlkb3duIiwic3BhY2U6a2V5ZG93biI6Il9vblNwYWNlS2V5ZG93biIsInNwYWNlOmtleXVwIjoiX29uU3BhY2VLZXl1cCJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5rZXlFdmVudFRhcmdldD0xMT09WWkodGhpcykucGFyZW50Tm9kZS5ub2RlVHlwZT9ZaSh0aGlzKS5nZXRPd25lclJvb3QoKS5ob3N0OllpKHRoaXMpLnBhcmVudE5vZGU7dmFyIHQ9dGhpcy5rZXlFdmVudFRhcmdldDt0aGlzLmxpc3Rlbih0LCJ1cCIsInVpVXBBY3Rpb24iKSx0aGlzLmxpc3Rlbih0LCJkb3duIiwidWlEb3duQWN0aW9uIil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy51bmxpc3Rlbih0aGlzLmtleUV2ZW50VGFyZ2V0LCJ1cCIsInVpVXBBY3Rpb24iKSx0aGlzLnVubGlzdGVuKHRoaXMua2V5RXZlbnRUYXJnZXQsImRvd24iLCJ1aURvd25BY3Rpb24iKSx0aGlzLmtleUV2ZW50VGFyZ2V0PW51bGx9LGdldCBzaG91bGRLZWVwQW5pbWF0aW5nKCl7Zm9yKHZhciB0PTA7dDx0aGlzLnJpcHBsZXMubGVuZ3RoOysrdClpZighdGhpcy5yaXBwbGVzW3RdLmlzQW5pbWF0aW9uQ29tcGxldGUpcmV0dXJuITA7cmV0dXJuITF9LHNpbXVsYXRlZFJpcHBsZTpmdW5jdGlvbigpe3RoaXMuZG93bkFjdGlvbihudWxsKSx0aGlzLmFzeW5jKChmdW5jdGlvbigpe3RoaXMudXBBY3Rpb24oKX0pLDEpfSx1aURvd25BY3Rpb246ZnVuY3Rpb24odCl7dGhpcy5ub2lua3x8dGhpcy5kb3duQWN0aW9uKHQpfSxkb3duQWN0aW9uOmZ1bmN0aW9uKHQpe3RoaXMuaG9sZERvd24mJnRoaXMucmlwcGxlcy5sZW5ndGg+MHx8KHRoaXMuYWRkUmlwcGxlKCkuZG93bkFjdGlvbih0KSx0aGlzLl9hbmltYXRpbmd8fCh0aGlzLl9hbmltYXRpbmc9ITAsdGhpcy5hbmltYXRlKCkpKX0sdWlVcEFjdGlvbjpmdW5jdGlvbih0KXt0aGlzLm5vaW5rfHx0aGlzLnVwQWN0aW9uKHQpfSx1cEFjdGlvbjpmdW5jdGlvbih0KXt0aGlzLmhvbGREb3dufHwodGhpcy5yaXBwbGVzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UudXBBY3Rpb24odCl9KSksdGhpcy5fYW5pbWF0aW5nPSEwLHRoaXMuYW5pbWF0ZSgpKX0sb25BbmltYXRpb25Db21wbGV0ZTpmdW5jdGlvbigpe3RoaXMuX2FuaW1hdGluZz0hMSx0aGlzLiQuYmFja2dyb3VuZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiIsdGhpcy5maXJlKCJ0cmFuc2l0aW9uZW5kIil9LGFkZFJpcHBsZTpmdW5jdGlvbigpe3ZhciB0PW5ldyBabyh0aGlzKTtyZXR1cm4gWWkodGhpcy4kLndhdmVzKS5hcHBlbmRDaGlsZCh0LndhdmVDb250YWluZXIpLHRoaXMuJC5iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmRDb2xvcj10LmNvbG9yLHRoaXMucmlwcGxlcy5wdXNoKHQpLHRoaXMuX3NldEFuaW1hdGluZyghMCksdH0scmVtb3ZlUmlwcGxlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucmlwcGxlcy5pbmRleE9mKHQpO2U8MHx8KHRoaXMucmlwcGxlcy5zcGxpY2UoZSwxKSx0LnJlbW92ZSgpLHRoaXMucmlwcGxlcy5sZW5ndGh8fHRoaXMuX3NldEFuaW1hdGluZyghMSkpfSxhbmltYXRlOmZ1bmN0aW9uKCl7aWYodGhpcy5fYW5pbWF0aW5nKXt2YXIgdCxlO2Zvcih0PTA7dDx0aGlzLnJpcHBsZXMubGVuZ3RoOysrdCkoZT10aGlzLnJpcHBsZXNbdF0pLmRyYXcoKSx0aGlzLiQuYmFja2dyb3VuZC5zdHlsZS5vcGFjaXR5PWUub3V0ZXJPcGFjaXR5LGUuaXNPcGFjaXR5RnVsbHlEZWNheWVkJiYhZS5pc1Jlc3RpbmdBdE1heFJhZGl1cyYmdGhpcy5yZW1vdmVSaXBwbGUoZSk7dGhpcy5zaG91bGRLZWVwQW5pbWF0aW5nfHwwIT09dGhpcy5yaXBwbGVzLmxlbmd0aD93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuX2JvdW5kQW5pbWF0ZSk6dGhpcy5vbkFuaW1hdGlvbkNvbXBsZXRlKCl9fSxhbmltYXRlUmlwcGxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYW5pbWF0ZSgpfSxfb25FbnRlcktleWRvd246ZnVuY3Rpb24oKXt0aGlzLnVpRG93bkFjdGlvbigpLHRoaXMuYXN5bmModGhpcy51aVVwQWN0aW9uLDEpfSxfb25TcGFjZUtleWRvd246ZnVuY3Rpb24oKXt0aGlzLnVpRG93bkFjdGlvbigpfSxfb25TcGFjZUtleXVwOmZ1bmN0aW9uKCl7dGhpcy51aVVwQWN0aW9uKCl9LF9ob2xkRG93bkNoYW5nZWQ6ZnVuY3Rpb24odCxlKXt2b2lkIDAhPT1lJiYodD90aGlzLmRvd25BY3Rpb24oKTp0aGlzLnVwQWN0aW9uKCkpfX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgSm89e3Byb3BlcnRpZXM6e25vaW5rOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9ub2lua0NoYW5nZWQifSxfcmlwcGxlQ29udGFpbmVyOnt0eXBlOk9iamVjdH19LF9idXR0b25TdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmZvY3VzZWQmJnRoaXMuZW5zdXJlUmlwcGxlKCl9LF9kb3duSGFuZGxlcjpmdW5jdGlvbih0KXtZby5fZG93bkhhbmRsZXIuY2FsbCh0aGlzLHQpLHRoaXMucHJlc3NlZCYmdGhpcy5lbnN1cmVSaXBwbGUodCl9LGVuc3VyZVJpcHBsZTpmdW5jdGlvbih0KXtpZighdGhpcy5oYXNSaXBwbGUoKSl7dGhpcy5fcmlwcGxlPXRoaXMuX2NyZWF0ZVJpcHBsZSgpLHRoaXMuX3JpcHBsZS5ub2luaz10aGlzLm5vaW5rO3ZhciBlPXRoaXMuX3JpcHBsZUNvbnRhaW5lcnx8dGhpcy5yb290O2lmKGUmJllpKGUpLmFwcGVuZENoaWxkKHRoaXMuX3JpcHBsZSksdCl7dmFyIG49WWkodGhpcy5fcmlwcGxlQ29udGFpbmVyfHx0aGlzKSxpPVlpKHQpLnJvb3RUYXJnZXQ7bi5kZWVwQ29udGFpbnMoaSkmJnRoaXMuX3JpcHBsZS51aURvd25BY3Rpb24odCl9fX0sZ2V0UmlwcGxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5zdXJlUmlwcGxlKCksdGhpcy5fcmlwcGxlfSxoYXNSaXBwbGU6ZnVuY3Rpb24oKXtyZXR1cm4gQm9vbGVhbih0aGlzLl9yaXBwbGUpfSxfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLXJpcHBsZSIpfSxfbm9pbmtDaGFuZ2VkOmZ1bmN0aW9uKHQpe3RoaXMuaGFzUmlwcGxlKCkmJih0aGlzLl9yaXBwbGUubm9pbms9dCl9fSxRbz17cHJvcGVydGllczp7ZWxldmF0aW9uOnt0eXBlOk51bWJlcixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAscmVhZE9ubHk6ITB9fSxvYnNlcnZlcnM6WyJfY2FsY3VsYXRlRWxldmF0aW9uKGZvY3VzZWQsIGRpc2FibGVkLCBhY3RpdmUsIHByZXNzZWQsIHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQpIiwiX2NvbXB1dGVLZXlib2FyZENsYXNzKHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQpIl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImJ1dHRvbiIsdGFiaW5kZXg6IjAiLGFuaW1hdGVkOiEwfSxfY2FsY3VsYXRlRWxldmF0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9MTt0aGlzLmRpc2FibGVkP3Q9MDp0aGlzLmFjdGl2ZXx8dGhpcy5wcmVzc2VkP3Q9NDp0aGlzLnJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQmJih0PTMpLHRoaXMuX3NldEVsZXZhdGlvbih0KX0sX2NvbXB1dGVLZXlib2FyZENsYXNzOmZ1bmN0aW9uKHQpe3RoaXMudG9nZ2xlQ2xhc3MoImtleWJvYXJkLWZvY3VzIix0KX0sX3NwYWNlS2V5RG93bkhhbmRsZXI6ZnVuY3Rpb24odCl7WW8uX3NwYWNlS2V5RG93bkhhbmRsZXIuY2FsbCh0aGlzLHQpLHRoaXMuaGFzUmlwcGxlKCkmJnRoaXMuZ2V0UmlwcGxlKCkucmlwcGxlcy5sZW5ndGg8MSYmdGhpcy5fcmlwcGxlLnVpRG93bkFjdGlvbigpfSxfc3BhY2VLZXlVcEhhbmRsZXI6ZnVuY3Rpb24odCl7WW8uX3NwYWNlS2V5VXBIYW5kbGVyLmNhbGwodGhpcyx0KSx0aGlzLmhhc1JpcHBsZSgpJiZ0aGlzLl9yaXBwbGUudWlVcEFjdGlvbigpfX0sdGE9W1hvLHFvLEpvLFFvXSxlYT1fZWAKICA8c3R5bGUgaW5jbHVkZT0icGFwZXItbWF0ZXJpYWwtc3R5bGVzIj4KICAgIC8qIE5lZWQgdG8gc3BlY2lmeSB0aGUgc2FtZSBzcGVjaWZpY2l0eSBhcyB0aGUgc3R5bGVzIGltcG9ydGVkIGZyb20gcGFwZXItbWF0ZXJpYWwuICovCiAgICA6aG9zdCB7CiAgICAgIEBhcHBseSAtLWxheW91dC1pbmxpbmU7CiAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItY2VudGVyOwogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIG1pbi13aWR0aDogNS4xNGVtOwogICAgICBtYXJnaW46IDAgMC4yOWVtOwogICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgICBmb250OiBpbmhlcml0OwogICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICBvdXRsaW5lLXdpZHRoOiAwOwogICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgei1pbmRleDogMDsKICAgICAgcGFkZGluZzogMC43ZW0gMC41N2VtOwoKICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgQGFwcGx5IC0tcGFwZXItYnV0dG9uOwogICAgfQoKICAgIDpob3N0KFtlbGV2YXRpb249IjEiXSkgewogICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTsKICAgIH0KCiAgICA6aG9zdChbZWxldmF0aW9uPSIyIl0pIHsKICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTI7CiAgICB9CgogICAgOmhvc3QoW2VsZXZhdGlvbj0iMyJdKSB7CiAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0zOwogICAgfQoKICAgIDpob3N0KFtlbGV2YXRpb249IjQiXSkgewogICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDsKICAgIH0KCiAgICA6aG9zdChbZWxldmF0aW9uPSI1Il0pIHsKICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTU7CiAgICB9CgogICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgfQoKICAgIDpob3N0KFtyYWlzZWRdLmtleWJvYXJkLWZvY3VzKSB7CiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICBAYXBwbHkgLS1wYXBlci1idXR0b24tcmFpc2VkLWtleWJvYXJkLWZvY3VzOwogICAgfQoKICAgIDpob3N0KDpub3QoW3JhaXNlZF0pLmtleWJvYXJkLWZvY3VzKSB7CiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICBAYXBwbHkgLS1wYXBlci1idXR0b24tZmxhdC1rZXlib2FyZC1mb2N1czsKICAgIH0KCiAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICAgIGNvbG9yOiAjYThhOGE4OwogICAgICBjdXJzb3I6IGF1dG87CiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwoKICAgICAgQGFwcGx5IC0tcGFwZXItYnV0dG9uLWRpc2FibGVkOwogICAgfQoKICAgIDpob3N0KFtkaXNhYmxlZF1bcmFpc2VkXSkgewogICAgICBiYWNrZ3JvdW5kOiAjZWFlYWVhOwogICAgfQoKCiAgICA6aG9zdChbYW5pbWF0ZWRdKSB7CiAgICAgIEBhcHBseSAtLXNoYWRvdy10cmFuc2l0aW9uOwogICAgfQoKICAgIHBhcGVyLXJpcHBsZSB7CiAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1idXR0b24taW5rLWNvbG9yKTsKICAgIH0KICA8L3N0eWxlPgoKICA8c2xvdD48L3Nsb3Q+YDsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovZWEuc2V0QXR0cmlidXRlKCJzdHJpcC13aGl0ZXNwYWNlIiwiIiksUnIoe190ZW1wbGF0ZTplYSxpczoicGFwZXItYnV0dG9uIixiZWhhdmlvcnM6W3RhXSxwcm9wZXJ0aWVzOntyYWlzZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITEsb2JzZXJ2ZXI6Il9jYWxjdWxhdGVFbGV2YXRpb24ifX0sX2NhbGN1bGF0ZUVsZXZhdGlvbjpmdW5jdGlvbigpe3RoaXMucmFpc2VkP1FvLl9jYWxjdWxhdGVFbGV2YXRpb24uYXBwbHkodGhpcyk6dGhpcy5fc2V0RWxldmF0aW9uKDApfX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgbmE9X2VgCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CgogICAgICAvKiBNYXRlcmlhbCBEZXNpZ24gY29sb3IgcGFsZXR0ZSBmb3IgR29vZ2xlIHByb2R1Y3RzICovCgogICAgICAtLWdvb2dsZS1yZWQtMTAwOiAjZjRjN2MzOwogICAgICAtLWdvb2dsZS1yZWQtMzAwOiAjZTY3YzczOwogICAgICAtLWdvb2dsZS1yZWQtNTAwOiAjZGI0NDM3OwogICAgICAtLWdvb2dsZS1yZWQtNzAwOiAjYzUzOTI5OwoKICAgICAgLS1nb29nbGUtYmx1ZS0xMDA6ICNjNmRhZmM7CiAgICAgIC0tZ29vZ2xlLWJsdWUtMzAwOiAjN2JhYWY3OwogICAgICAtLWdvb2dsZS1ibHVlLTUwMDogIzQyODVmNDsKICAgICAgLS1nb29nbGUtYmx1ZS03MDA6ICMzMzY3ZDY7CgogICAgICAtLWdvb2dsZS1ncmVlbi0xMDA6ICNiN2UxY2Q7CiAgICAgIC0tZ29vZ2xlLWdyZWVuLTMwMDogIzU3YmI4YTsKICAgICAgLS1nb29nbGUtZ3JlZW4tNTAwOiAjMGY5ZDU4OwogICAgICAtLWdvb2dsZS1ncmVlbi03MDA6ICMwYjgwNDM7CgogICAgICAtLWdvb2dsZS15ZWxsb3ctMTAwOiAjZmNlOGIyOwogICAgICAtLWdvb2dsZS15ZWxsb3ctMzAwOiAjZjdjYjRkOwogICAgICAtLWdvb2dsZS15ZWxsb3ctNTAwOiAjZjRiNDAwOwogICAgICAtLWdvb2dsZS15ZWxsb3ctNzAwOiAjZjA5MzAwOwoKICAgICAgLS1nb29nbGUtZ3JleS0xMDA6ICNmNWY1ZjU7CiAgICAgIC0tZ29vZ2xlLWdyZXktMzAwOiAjZTBlMGUwOwogICAgICAtLWdvb2dsZS1ncmV5LTUwMDogIzllOWU5ZTsKICAgICAgLS1nb29nbGUtZ3JleS03MDA6ICM2MTYxNjE7CgogICAgICAvKiBNYXRlcmlhbCBEZXNpZ24gY29sb3IgcGFsZXR0ZSBmcm9tIG9ubGluZSBzcGVjIGRvY3VtZW50ICovCgogICAgICAtLXBhcGVyLXJlZC01MDogI2ZmZWJlZTsKICAgICAgLS1wYXBlci1yZWQtMTAwOiAjZmZjZGQyOwogICAgICAtLXBhcGVyLXJlZC0yMDA6ICNlZjlhOWE7CiAgICAgIC0tcGFwZXItcmVkLTMwMDogI2U1NzM3MzsKICAgICAgLS1wYXBlci1yZWQtNDAwOiAjZWY1MzUwOwogICAgICAtLXBhcGVyLXJlZC01MDA6ICNmNDQzMzY7CiAgICAgIC0tcGFwZXItcmVkLTYwMDogI2U1MzkzNTsKICAgICAgLS1wYXBlci1yZWQtNzAwOiAjZDMyZjJmOwogICAgICAtLXBhcGVyLXJlZC04MDA6ICNjNjI4Mjg7CiAgICAgIC0tcGFwZXItcmVkLTkwMDogI2I3MWMxYzsKICAgICAgLS1wYXBlci1yZWQtYTEwMDogI2ZmOGE4MDsKICAgICAgLS1wYXBlci1yZWQtYTIwMDogI2ZmNTI1MjsKICAgICAgLS1wYXBlci1yZWQtYTQwMDogI2ZmMTc0NDsKICAgICAgLS1wYXBlci1yZWQtYTcwMDogI2Q1MDAwMDsKCiAgICAgIC0tcGFwZXItcGluay01MDogI2ZjZTRlYzsKICAgICAgLS1wYXBlci1waW5rLTEwMDogI2Y4YmJkMDsKICAgICAgLS1wYXBlci1waW5rLTIwMDogI2Y0OGZiMTsKICAgICAgLS1wYXBlci1waW5rLTMwMDogI2YwNjI5MjsKICAgICAgLS1wYXBlci1waW5rLTQwMDogI2VjNDA3YTsKICAgICAgLS1wYXBlci1waW5rLTUwMDogI2U5MWU2MzsKICAgICAgLS1wYXBlci1waW5rLTYwMDogI2Q4MWI2MDsKICAgICAgLS1wYXBlci1waW5rLTcwMDogI2MyMTg1YjsKICAgICAgLS1wYXBlci1waW5rLTgwMDogI2FkMTQ1NzsKICAgICAgLS1wYXBlci1waW5rLTkwMDogIzg4MGU0ZjsKICAgICAgLS1wYXBlci1waW5rLWExMDA6ICNmZjgwYWI7CiAgICAgIC0tcGFwZXItcGluay1hMjAwOiAjZmY0MDgxOwogICAgICAtLXBhcGVyLXBpbmstYTQwMDogI2Y1MDA1NzsKICAgICAgLS1wYXBlci1waW5rLWE3MDA6ICNjNTExNjI7CgogICAgICAtLXBhcGVyLXB1cnBsZS01MDogI2YzZTVmNTsKICAgICAgLS1wYXBlci1wdXJwbGUtMTAwOiAjZTFiZWU3OwogICAgICAtLXBhcGVyLXB1cnBsZS0yMDA6ICNjZTkzZDg7CiAgICAgIC0tcGFwZXItcHVycGxlLTMwMDogI2JhNjhjODsKICAgICAgLS1wYXBlci1wdXJwbGUtNDAwOiAjYWI0N2JjOwogICAgICAtLXBhcGVyLXB1cnBsZS01MDA6ICM5YzI3YjA7CiAgICAgIC0tcGFwZXItcHVycGxlLTYwMDogIzhlMjRhYTsKICAgICAgLS1wYXBlci1wdXJwbGUtNzAwOiAjN2IxZmEyOwogICAgICAtLXBhcGVyLXB1cnBsZS04MDA6ICM2YTFiOWE7CiAgICAgIC0tcGFwZXItcHVycGxlLTkwMDogIzRhMTQ4YzsKICAgICAgLS1wYXBlci1wdXJwbGUtYTEwMDogI2VhODBmYzsKICAgICAgLS1wYXBlci1wdXJwbGUtYTIwMDogI2UwNDBmYjsKICAgICAgLS1wYXBlci1wdXJwbGUtYTQwMDogI2Q1MDBmOTsKICAgICAgLS1wYXBlci1wdXJwbGUtYTcwMDogI2FhMDBmZjsKCiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtNTA6ICNlZGU3ZjY7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtMTAwOiAjZDFjNGU5OwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTIwMDogI2IzOWRkYjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS0zMDA6ICM5NTc1Y2Q7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtNDAwOiAjN2U1N2MyOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTUwMDogIzY3M2FiNzsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS02MDA6ICM1ZTM1YjE7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtNzAwOiAjNTEyZGE4OwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTgwMDogIzQ1MjdhMDsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS05MDA6ICMzMTFiOTI7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtYTEwMDogI2IzODhmZjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS1hMjAwOiAjN2M0ZGZmOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWE0MDA6ICM2NTFmZmY7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtYTcwMDogIzYyMDBlYTsKCiAgICAgIC0tcGFwZXItaW5kaWdvLTUwOiAjZThlYWY2OwogICAgICAtLXBhcGVyLWluZGlnby0xMDA6ICNjNWNhZTk7CiAgICAgIC0tcGFwZXItaW5kaWdvLTIwMDogIzlmYThkYTsKICAgICAgLS1wYXBlci1pbmRpZ28tMzAwOiAjNzk4NmNiOwogICAgICAtLXBhcGVyLWluZGlnby00MDA6ICM1YzZiYzA7CiAgICAgIC0tcGFwZXItaW5kaWdvLTUwMDogIzNmNTFiNTsKICAgICAgLS1wYXBlci1pbmRpZ28tNjAwOiAjMzk0OWFiOwogICAgICAtLXBhcGVyLWluZGlnby03MDA6ICMzMDNmOWY7CiAgICAgIC0tcGFwZXItaW5kaWdvLTgwMDogIzI4MzU5MzsKICAgICAgLS1wYXBlci1pbmRpZ28tOTAwOiAjMWEyMzdlOwogICAgICAtLXBhcGVyLWluZGlnby1hMTAwOiAjOGM5ZWZmOwogICAgICAtLXBhcGVyLWluZGlnby1hMjAwOiAjNTM2ZGZlOwogICAgICAtLXBhcGVyLWluZGlnby1hNDAwOiAjM2Q1YWZlOwogICAgICAtLXBhcGVyLWluZGlnby1hNzAwOiAjMzA0ZmZlOwoKICAgICAgLS1wYXBlci1ibHVlLTUwOiAjZTNmMmZkOwogICAgICAtLXBhcGVyLWJsdWUtMTAwOiAjYmJkZWZiOwogICAgICAtLXBhcGVyLWJsdWUtMjAwOiAjOTBjYWY5OwogICAgICAtLXBhcGVyLWJsdWUtMzAwOiAjNjRiNWY2OwogICAgICAtLXBhcGVyLWJsdWUtNDAwOiAjNDJhNWY1OwogICAgICAtLXBhcGVyLWJsdWUtNTAwOiAjMjE5NmYzOwogICAgICAtLXBhcGVyLWJsdWUtNjAwOiAjMWU4OGU1OwogICAgICAtLXBhcGVyLWJsdWUtNzAwOiAjMTk3NmQyOwogICAgICAtLXBhcGVyLWJsdWUtODAwOiAjMTU2NWMwOwogICAgICAtLXBhcGVyLWJsdWUtOTAwOiAjMGQ0N2ExOwogICAgICAtLXBhcGVyLWJsdWUtYTEwMDogIzgyYjFmZjsKICAgICAgLS1wYXBlci1ibHVlLWEyMDA6ICM0NDhhZmY7CiAgICAgIC0tcGFwZXItYmx1ZS1hNDAwOiAjMjk3OWZmOwogICAgICAtLXBhcGVyLWJsdWUtYTcwMDogIzI5NjJmZjsKCiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS01MDogI2UxZjVmZTsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTEwMDogI2IzZTVmYzsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTIwMDogIzgxZDRmYTsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTMwMDogIzRmYzNmNzsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTQwMDogIzI5YjZmNjsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTUwMDogIzAzYTlmNDsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTYwMDogIzAzOWJlNTsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTcwMDogIzAyODhkMTsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTgwMDogIzAyNzdiZDsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTkwMDogIzAxNTc5YjsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLWExMDA6ICM4MGQ4ZmY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hMjAwOiAjNDBjNGZmOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtYTQwMDogIzAwYjBmZjsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLWE3MDA6ICMwMDkxZWE7CgogICAgICAtLXBhcGVyLWN5YW4tNTA6ICNlMGY3ZmE7CiAgICAgIC0tcGFwZXItY3lhbi0xMDA6ICNiMmViZjI7CiAgICAgIC0tcGFwZXItY3lhbi0yMDA6ICM4MGRlZWE7CiAgICAgIC0tcGFwZXItY3lhbi0zMDA6ICM0ZGQwZTE7CiAgICAgIC0tcGFwZXItY3lhbi00MDA6ICMyNmM2ZGE7CiAgICAgIC0tcGFwZXItY3lhbi01MDA6ICMwMGJjZDQ7CiAgICAgIC0tcGFwZXItY3lhbi02MDA6ICMwMGFjYzE7CiAgICAgIC0tcGFwZXItY3lhbi03MDA6ICMwMDk3YTc7CiAgICAgIC0tcGFwZXItY3lhbi04MDA6ICMwMDgzOGY7CiAgICAgIC0tcGFwZXItY3lhbi05MDA6ICMwMDYwNjQ7CiAgICAgIC0tcGFwZXItY3lhbi1hMTAwOiAjODRmZmZmOwogICAgICAtLXBhcGVyLWN5YW4tYTIwMDogIzE4ZmZmZjsKICAgICAgLS1wYXBlci1jeWFuLWE0MDA6ICMwMGU1ZmY7CiAgICAgIC0tcGFwZXItY3lhbi1hNzAwOiAjMDBiOGQ0OwoKICAgICAgLS1wYXBlci10ZWFsLTUwOiAjZTBmMmYxOwogICAgICAtLXBhcGVyLXRlYWwtMTAwOiAjYjJkZmRiOwogICAgICAtLXBhcGVyLXRlYWwtMjAwOiAjODBjYmM0OwogICAgICAtLXBhcGVyLXRlYWwtMzAwOiAjNGRiNmFjOwogICAgICAtLXBhcGVyLXRlYWwtNDAwOiAjMjZhNjlhOwogICAgICAtLXBhcGVyLXRlYWwtNTAwOiAjMDA5Njg4OwogICAgICAtLXBhcGVyLXRlYWwtNjAwOiAjMDA4OTdiOwogICAgICAtLXBhcGVyLXRlYWwtNzAwOiAjMDA3OTZiOwogICAgICAtLXBhcGVyLXRlYWwtODAwOiAjMDA2OTVjOwogICAgICAtLXBhcGVyLXRlYWwtOTAwOiAjMDA0ZDQwOwogICAgICAtLXBhcGVyLXRlYWwtYTEwMDogI2E3ZmZlYjsKICAgICAgLS1wYXBlci10ZWFsLWEyMDA6ICM2NGZmZGE7CiAgICAgIC0tcGFwZXItdGVhbC1hNDAwOiAjMWRlOWI2OwogICAgICAtLXBhcGVyLXRlYWwtYTcwMDogIzAwYmZhNTsKCiAgICAgIC0tcGFwZXItZ3JlZW4tNTA6ICNlOGY1ZTk7CiAgICAgIC0tcGFwZXItZ3JlZW4tMTAwOiAjYzhlNmM5OwogICAgICAtLXBhcGVyLWdyZWVuLTIwMDogI2E1ZDZhNzsKICAgICAgLS1wYXBlci1ncmVlbi0zMDA6ICM4MWM3ODQ7CiAgICAgIC0tcGFwZXItZ3JlZW4tNDAwOiAjNjZiYjZhOwogICAgICAtLXBhcGVyLWdyZWVuLTUwMDogIzRjYWY1MDsKICAgICAgLS1wYXBlci1ncmVlbi02MDA6ICM0M2EwNDc7CiAgICAgIC0tcGFwZXItZ3JlZW4tNzAwOiAjMzg4ZTNjOwogICAgICAtLXBhcGVyLWdyZWVuLTgwMDogIzJlN2QzMjsKICAgICAgLS1wYXBlci1ncmVlbi05MDA6ICMxYjVlMjA7CiAgICAgIC0tcGFwZXItZ3JlZW4tYTEwMDogI2I5ZjZjYTsKICAgICAgLS1wYXBlci1ncmVlbi1hMjAwOiAjNjlmMGFlOwogICAgICAtLXBhcGVyLWdyZWVuLWE0MDA6ICMwMGU2NzY7CiAgICAgIC0tcGFwZXItZ3JlZW4tYTcwMDogIzAwYzg1MzsKCiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tNTA6ICNmMWY4ZTk7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tMTAwOiAjZGNlZGM4OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTIwMDogI2M1ZTFhNTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi0zMDA6ICNhZWQ1ODE7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tNDAwOiAjOWNjYzY1OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTUwMDogIzhiYzM0YTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi02MDA6ICM3Y2IzNDI7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tNzAwOiAjNjg5ZjM4OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTgwMDogIzU1OGIyZjsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi05MDA6ICMzMzY5MWU7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tYTEwMDogI2NjZmY5MDsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi1hMjAwOiAjYjJmZjU5OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWE0MDA6ICM3NmZmMDM7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tYTcwMDogIzY0ZGQxNzsKCiAgICAgIC0tcGFwZXItbGltZS01MDogI2Y5ZmJlNzsKICAgICAgLS1wYXBlci1saW1lLTEwMDogI2YwZjRjMzsKICAgICAgLS1wYXBlci1saW1lLTIwMDogI2U2ZWU5YzsKICAgICAgLS1wYXBlci1saW1lLTMwMDogI2RjZTc3NTsKICAgICAgLS1wYXBlci1saW1lLTQwMDogI2Q0ZTE1NzsKICAgICAgLS1wYXBlci1saW1lLTUwMDogI2NkZGMzOTsKICAgICAgLS1wYXBlci1saW1lLTYwMDogI2MwY2EzMzsKICAgICAgLS1wYXBlci1saW1lLTcwMDogI2FmYjQyYjsKICAgICAgLS1wYXBlci1saW1lLTgwMDogIzllOWQyNDsKICAgICAgLS1wYXBlci1saW1lLTkwMDogIzgyNzcxNzsKICAgICAgLS1wYXBlci1saW1lLWExMDA6ICNmNGZmODE7CiAgICAgIC0tcGFwZXItbGltZS1hMjAwOiAjZWVmZjQxOwogICAgICAtLXBhcGVyLWxpbWUtYTQwMDogI2M2ZmYwMDsKICAgICAgLS1wYXBlci1saW1lLWE3MDA6ICNhZWVhMDA7CgogICAgICAtLXBhcGVyLXllbGxvdy01MDogI2ZmZmRlNzsKICAgICAgLS1wYXBlci15ZWxsb3ctMTAwOiAjZmZmOWM0OwogICAgICAtLXBhcGVyLXllbGxvdy0yMDA6ICNmZmY1OWQ7CiAgICAgIC0tcGFwZXIteWVsbG93LTMwMDogI2ZmZjE3NjsKICAgICAgLS1wYXBlci15ZWxsb3ctNDAwOiAjZmZlZTU4OwogICAgICAtLXBhcGVyLXllbGxvdy01MDA6ICNmZmViM2I7CiAgICAgIC0tcGFwZXIteWVsbG93LTYwMDogI2ZkZDgzNTsKICAgICAgLS1wYXBlci15ZWxsb3ctNzAwOiAjZmJjMDJkOwogICAgICAtLXBhcGVyLXllbGxvdy04MDA6ICNmOWE4MjU7CiAgICAgIC0tcGFwZXIteWVsbG93LTkwMDogI2Y1N2YxNzsKICAgICAgLS1wYXBlci15ZWxsb3ctYTEwMDogI2ZmZmY4ZDsKICAgICAgLS1wYXBlci15ZWxsb3ctYTIwMDogI2ZmZmYwMDsKICAgICAgLS1wYXBlci15ZWxsb3ctYTQwMDogI2ZmZWEwMDsKICAgICAgLS1wYXBlci15ZWxsb3ctYTcwMDogI2ZmZDYwMDsKCiAgICAgIC0tcGFwZXItYW1iZXItNTA6ICNmZmY4ZTE7CiAgICAgIC0tcGFwZXItYW1iZXItMTAwOiAjZmZlY2IzOwogICAgICAtLXBhcGVyLWFtYmVyLTIwMDogI2ZmZTA4MjsKICAgICAgLS1wYXBlci1hbWJlci0zMDA6ICNmZmQ1NGY7CiAgICAgIC0tcGFwZXItYW1iZXItNDAwOiAjZmZjYTI4OwogICAgICAtLXBhcGVyLWFtYmVyLTUwMDogI2ZmYzEwNzsKICAgICAgLS1wYXBlci1hbWJlci02MDA6ICNmZmIzMDA7CiAgICAgIC0tcGFwZXItYW1iZXItNzAwOiAjZmZhMDAwOwogICAgICAtLXBhcGVyLWFtYmVyLTgwMDogI2ZmOGYwMDsKICAgICAgLS1wYXBlci1hbWJlci05MDA6ICNmZjZmMDA7CiAgICAgIC0tcGFwZXItYW1iZXItYTEwMDogI2ZmZTU3ZjsKICAgICAgLS1wYXBlci1hbWJlci1hMjAwOiAjZmZkNzQwOwogICAgICAtLXBhcGVyLWFtYmVyLWE0MDA6ICNmZmM0MDA7CiAgICAgIC0tcGFwZXItYW1iZXItYTcwMDogI2ZmYWIwMDsKCiAgICAgIC0tcGFwZXItb3JhbmdlLTUwOiAjZmZmM2UwOwogICAgICAtLXBhcGVyLW9yYW5nZS0xMDA6ICNmZmUwYjI7CiAgICAgIC0tcGFwZXItb3JhbmdlLTIwMDogI2ZmY2M4MDsKICAgICAgLS1wYXBlci1vcmFuZ2UtMzAwOiAjZmZiNzRkOwogICAgICAtLXBhcGVyLW9yYW5nZS00MDA6ICNmZmE3MjY7CiAgICAgIC0tcGFwZXItb3JhbmdlLTUwMDogI2ZmOTgwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtNjAwOiAjZmI4YzAwOwogICAgICAtLXBhcGVyLW9yYW5nZS03MDA6ICNmNTdjMDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTgwMDogI2VmNmMwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtOTAwOiAjZTY1MTAwOwogICAgICAtLXBhcGVyLW9yYW5nZS1hMTAwOiAjZmZkMTgwOwogICAgICAtLXBhcGVyLW9yYW5nZS1hMjAwOiAjZmZhYjQwOwogICAgICAtLXBhcGVyLW9yYW5nZS1hNDAwOiAjZmY5MTAwOwogICAgICAtLXBhcGVyLW9yYW5nZS1hNzAwOiAjZmY2NTAwOwoKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS01MDogI2ZiZTllNzsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS0xMDA6ICNmZmNjYmM7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtMjAwOiAjZmZhYjkxOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTMwMDogI2ZmOGE2NTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS00MDA6ICNmZjcwNDM7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNTAwOiAjZmY1NzIyOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTYwMDogI2Y0NTExZTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS03MDA6ICNlNjRhMTk7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtODAwOiAjZDg0MzE1OwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTkwMDogI2JmMzYwYzsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS1hMTAwOiAjZmY5ZTgwOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLWEyMDA6ICNmZjZlNDA7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTQwMDogI2ZmM2QwMDsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS1hNzAwOiAjZGQyYzAwOwoKICAgICAgLS1wYXBlci1icm93bi01MDogI2VmZWJlOTsKICAgICAgLS1wYXBlci1icm93bi0xMDA6ICNkN2NjYzg7CiAgICAgIC0tcGFwZXItYnJvd24tMjAwOiAjYmNhYWE0OwogICAgICAtLXBhcGVyLWJyb3duLTMwMDogI2ExODg3ZjsKICAgICAgLS1wYXBlci1icm93bi00MDA6ICM4ZDZlNjM7CiAgICAgIC0tcGFwZXItYnJvd24tNTAwOiAjNzk1NTQ4OwogICAgICAtLXBhcGVyLWJyb3duLTYwMDogIzZkNGM0MTsKICAgICAgLS1wYXBlci1icm93bi03MDA6ICM1ZDQwMzc7CiAgICAgIC0tcGFwZXItYnJvd24tODAwOiAjNGUzNDJlOwogICAgICAtLXBhcGVyLWJyb3duLTkwMDogIzNlMjcyMzsKCiAgICAgIC0tcGFwZXItZ3JleS01MDogI2ZhZmFmYTsKICAgICAgLS1wYXBlci1ncmV5LTEwMDogI2Y1ZjVmNTsKICAgICAgLS1wYXBlci1ncmV5LTIwMDogI2VlZWVlZTsKICAgICAgLS1wYXBlci1ncmV5LTMwMDogI2UwZTBlMDsKICAgICAgLS1wYXBlci1ncmV5LTQwMDogI2JkYmRiZDsKICAgICAgLS1wYXBlci1ncmV5LTUwMDogIzllOWU5ZTsKICAgICAgLS1wYXBlci1ncmV5LTYwMDogIzc1NzU3NTsKICAgICAgLS1wYXBlci1ncmV5LTcwMDogIzYxNjE2MTsKICAgICAgLS1wYXBlci1ncmV5LTgwMDogIzQyNDI0MjsKICAgICAgLS1wYXBlci1ncmV5LTkwMDogIzIxMjEyMTsKCiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTUwOiAjZWNlZmYxOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS0xMDA6ICNjZmQ4ZGM7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTIwMDogI2IwYmVjNTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktMzAwOiAjOTBhNGFlOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS00MDA6ICM3ODkwOWM7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTUwMDogIzYwN2Q4YjsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNjAwOiAjNTQ2ZTdhOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS03MDA6ICM0NTVhNjQ7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTgwMDogIzM3NDc0ZjsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktOTAwOiAjMjYzMjM4OwoKICAgICAgLyogb3BhY2l0eSBmb3IgZGFyayB0ZXh0IG9uIGEgbGlnaHQgYmFja2dyb3VuZCAqLwogICAgICAtLWRhcmstZGl2aWRlci1vcGFjaXR5OiAwLjEyOwogICAgICAtLWRhcmstZGlzYWJsZWQtb3BhY2l0eTogMC4zODsgLyogb3IgaGludCB0ZXh0IG9yIGljb24gKi8KICAgICAgLS1kYXJrLXNlY29uZGFyeS1vcGFjaXR5OiAwLjU0OwogICAgICAtLWRhcmstcHJpbWFyeS1vcGFjaXR5OiAwLjg3OwoKICAgICAgLyogb3BhY2l0eSBmb3IgbGlnaHQgdGV4dCBvbiBhIGRhcmsgYmFja2dyb3VuZCAqLwogICAgICAtLWxpZ2h0LWRpdmlkZXItb3BhY2l0eTogMC4xMjsKICAgICAgLS1saWdodC1kaXNhYmxlZC1vcGFjaXR5OiAwLjM7IC8qIG9yIGhpbnQgdGV4dCBvciBpY29uICovCiAgICAgIC0tbGlnaHQtc2Vjb25kYXJ5LW9wYWNpdHk6IDAuNzsKICAgICAgLS1saWdodC1wcmltYXJ5LW9wYWNpdHk6IDEuMDsKCiAgICB9CgogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgpgO25hLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJkaXNwbGF5OiBub25lOyIpLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobmEuY29udGVudCk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBpYT1fZWAKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKICAgICAgLyoKICAgICAgICogWW91IGNhbiB1c2UgdGhlc2UgZ2VuZXJpYyB2YXJpYWJsZXMgaW4geW91ciBlbGVtZW50cyBmb3IgZWFzeSB0aGVtaW5nLgogICAgICAgKiBGb3IgZXhhbXBsZSwgaWYgYWxsIHlvdXIgZWxlbWVudHMgdXNlIFxgLS1wcmltYXJ5LXRleHQtY29sb3JcYCBhcyBpdHMgbWFpbgogICAgICAgKiBjb2xvciwgdGhlbiBzd2l0Y2hpbmcgZnJvbSBhIGxpZ2h0IHRvIGEgZGFyayB0aGVtZSBpcyBqdXN0IGEgbWF0dGVyIG9mCiAgICAgICAqIGNoYW5naW5nIHRoZSB2YWx1ZSBvZiBcYC0tcHJpbWFyeS10ZXh0LWNvbG9yXGAgaW4geW91ciBhcHBsaWNhdGlvbi4KICAgICAgICovCiAgICAgIC0tcHJpbWFyeS10ZXh0LWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS10ZXh0LWNvbG9yKTsKICAgICAgLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLWJhY2tncm91bmQtY29sb3IpOwogICAgICAtLXNlY29uZGFyeS10ZXh0LWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS1zZWNvbmRhcnktY29sb3IpOwogICAgICAtLWRpc2FibGVkLXRleHQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLWRpc2FibGVkLWNvbG9yKTsKICAgICAgLS1kaXZpZGVyLWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS1kaXZpZGVyLWNvbG9yKTsKICAgICAgLS1lcnJvci1jb2xvcjogdmFyKC0tcGFwZXItZGVlcC1vcmFuZ2UtYTcwMCk7CgogICAgICAvKgogICAgICAgKiBQcmltYXJ5IGFuZCBhY2NlbnQgY29sb3JzLiBBbHNvIHNlZSBjb2xvci5qcyBmb3IgbW9yZSBjb2xvcnMuCiAgICAgICAqLwogICAgICAtLXByaW1hcnktY29sb3I6IHZhcigtLXBhcGVyLWluZGlnby01MDApOwogICAgICAtLWxpZ2h0LXByaW1hcnktY29sb3I6IHZhcigtLXBhcGVyLWluZGlnby0xMDApOwogICAgICAtLWRhcmstcHJpbWFyeS1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTcwMCk7CgogICAgICAtLWFjY2VudC1jb2xvcjogdmFyKC0tcGFwZXItcGluay1hMjAwKTsKICAgICAgLS1saWdodC1hY2NlbnQtY29sb3I6IHZhcigtLXBhcGVyLXBpbmstYTEwMCk7CiAgICAgIC0tZGFyay1hY2NlbnQtY29sb3I6IHZhcigtLXBhcGVyLXBpbmstYTQwMCk7CgoKICAgICAgLyoKICAgICAgICogTWF0ZXJpYWwgRGVzaWduIExpZ2h0IGJhY2tncm91bmQgdGhlbWUKICAgICAgICovCiAgICAgIC0tbGlnaHQtdGhlbWUtYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKICAgICAgLS1saWdodC10aGVtZS1iYXNlLWNvbG9yOiAjMDAwMDAwOwogICAgICAtLWxpZ2h0LXRoZW1lLXRleHQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktOTAwKTsKICAgICAgLS1saWdodC10aGVtZS1zZWNvbmRhcnktY29sb3I6ICM3MzczNzM7ICAvKiBmb3Igc2Vjb25kYXJ5IHRleHQgYW5kIGljb25zICovCiAgICAgIC0tbGlnaHQtdGhlbWUtZGlzYWJsZWQtY29sb3I6ICM5YjliOWI7ICAvKiBkaXNhYmxlZC9oaW50IHRleHQgKi8KICAgICAgLS1saWdodC10aGVtZS1kaXZpZGVyLWNvbG9yOiAjZGJkYmRiOwoKICAgICAgLyoKICAgICAgICogTWF0ZXJpYWwgRGVzaWduIERhcmsgYmFja2dyb3VuZCB0aGVtZQogICAgICAgKi8KICAgICAgLS1kYXJrLXRoZW1lLWJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktOTAwKTsKICAgICAgLS1kYXJrLXRoZW1lLWJhc2UtY29sb3I6ICNmZmZmZmY7CiAgICAgIC0tZGFyay10aGVtZS10ZXh0LWNvbG9yOiAjZmZmZmZmOwogICAgICAtLWRhcmstdGhlbWUtc2Vjb25kYXJ5LWNvbG9yOiAjYmNiY2JjOyAgLyogZm9yIHNlY29uZGFyeSB0ZXh0IGFuZCBpY29ucyAqLwogICAgICAtLWRhcmstdGhlbWUtZGlzYWJsZWQtY29sb3I6ICM2NDY0NjQ7ICAvKiBkaXNhYmxlZC9oaW50IHRleHQgKi8KICAgICAgLS1kYXJrLXRoZW1lLWRpdmlkZXItY29sb3I6ICMzYzNjM2M7CgogICAgICAvKgogICAgICAgKiBEZXByZWNhdGVkIHZhbHVlcyBiZWNhdXNlIG9mIHRoZWlyIGNvbmZ1c2luZyBuYW1lcy4KICAgICAgICovCiAgICAgIC0tdGV4dC1wcmltYXJ5LWNvbG9yOiB2YXIoLS1kYXJrLXRoZW1lLXRleHQtY29sb3IpOwogICAgICAtLWRlZmF1bHQtcHJpbWFyeS1jb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcik7CiAgICB9CiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+YDtpYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZGlzcGxheTogbm9uZTsiKSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGlhLmNvbnRlbnQpOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgcmE9e3Byb3BlcnRpZXM6e25hbWU6e3R5cGU6U3RyaW5nfSx2YWx1ZTp7bm90aWZ5OiEwLHR5cGU6U3RyaW5nfSxyZXF1aXJlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt9LGRldGFjaGVkOmZ1bmN0aW9uKCl7fX07Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL2xldCBvYT1udWxsO2NvbnN0IGFhPXtwcm9wZXJ0aWVzOnt2YWxpZGF0b3I6e3R5cGU6U3RyaW5nfSxpbnZhbGlkOntub3RpZnk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2ludmFsaWRDaGFuZ2VkIn19LHJlZ2lzdGVyZWQ6ZnVuY3Rpb24oKXtvYT1uZXcgeG8oe3R5cGU6InZhbGlkYXRvciJ9KX0sX2ludmFsaWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5pbnZhbGlkP3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWludmFsaWQiLCJ0cnVlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtaW52YWxpZCIpfSxnZXQgX3ZhbGlkYXRvcigpe3JldHVybiBvYSYmb2EuYnlLZXkodGhpcy52YWxpZGF0b3IpfSxoYXNWYWxpZGF0b3I6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9dGhpcy5fdmFsaWRhdG9yfSx2YWxpZGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbnZhbGlkPXZvaWQgMD09PXQmJnZvaWQgMCE9PXRoaXMudmFsdWU/IXRoaXMuX2dldFZhbGlkaXR5KHRoaXMudmFsdWUpOiF0aGlzLl9nZXRWYWxpZGl0eSh0KSwhdGhpcy5pbnZhbGlkfSxfZ2V0VmFsaWRpdHk6ZnVuY3Rpb24odCl7cmV0dXJuIXRoaXMuaGFzVmFsaWRhdG9yKCl8fHRoaXMuX3ZhbGlkYXRvci52YWxpZGF0ZSh0KX19LHNhPXtwcm9wZXJ0aWVzOntjaGVja2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLG5vdGlmeTohMCxvYnNlcnZlcjoiX2NoZWNrZWRDaGFuZ2VkIn0sdG9nZ2xlczp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sdmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiJvbiIsb2JzZXJ2ZXI6Il92YWx1ZUNoYW5nZWQifX0sb2JzZXJ2ZXJzOlsiX3JlcXVpcmVkQ2hhbmdlZChyZXF1aXJlZCkiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5faGFzSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3I9ITB9LF9nZXRWYWxpZGl0eTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kaXNhYmxlZHx8IXRoaXMucmVxdWlyZWR8fHRoaXMuY2hlY2tlZH0sX3JlcXVpcmVkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMucmVxdWlyZWQ/dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtcmVxdWlyZWQiLCJ0cnVlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtcmVxdWlyZWQiKX0sX2NoZWNrZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5hY3RpdmU9dGhpcy5jaGVja2VkLHRoaXMuZmlyZSgiaXJvbi1jaGFuZ2UiKX0sX3ZhbHVlQ2hhbmdlZDpmdW5jdGlvbigpe251bGw9PXRoaXMudmFsdWUmJih0aGlzLnZhbHVlPSJvbiIpfX0sbGE9e29ic2VydmVyczpbIl9mb2N1c2VkQ2hhbmdlZChyZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKSJdLF9mb2N1c2VkQ2hhbmdlZDpmdW5jdGlvbih0KXt0JiZ0aGlzLmVuc3VyZVJpcHBsZSgpLHRoaXMuaGFzUmlwcGxlKCkmJih0aGlzLl9yaXBwbGUuaG9sZERvd249dCl9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXt2YXIgdD1Kby5fY3JlYXRlUmlwcGxlKCk7cmV0dXJuIHQuaWQ9ImluayIsdC5zZXRBdHRyaWJ1dGUoImNlbnRlciIsIiIpLHQuY2xhc3NMaXN0LmFkZCgiY2lyY2xlIiksdH19LGNhPVtYbyxxbyxKbyxsYV0sdWE9W2NhLFtyYSxhYSxzYV0se19jaGVja2VkQ2hhbmdlZDpmdW5jdGlvbigpe3NhLl9jaGVja2VkQ2hhbmdlZC5jYWxsKHRoaXMpLHRoaXMuaGFzUmlwcGxlKCkmJih0aGlzLmNoZWNrZWQ/dGhpcy5fcmlwcGxlLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsIiIpOnRoaXMuX3JpcHBsZS5yZW1vdmVBdHRyaWJ1dGUoImNoZWNrZWQiKSl9LF9idXR0b25TdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oKXtKby5fYnV0dG9uU3RhdGVDaGFuZ2VkLmNhbGwodGhpcyksdGhpcy5kaXNhYmxlZHx8dGhpcy5pc0F0dGFjaGVkJiYodGhpcy5jaGVja2VkPXRoaXMuYWN0aXZlKX19XSxoYT1fZWA8c3R5bGU+CiAgOmhvc3QgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplOiB2YXIoLS1wYXBlci1jaGVja2JveC1zaXplLCAxOHB4KTsKICAgIC8qIC0xcHggaXMgYSBzZW50aW5lbCBmb3IgdGhlIGRlZmF1bHQgYW5kIGlzIHJlcGxhY2VkIGluIFxgYXR0YWNoZWRcYC4gKi8KICAgIC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZTogdmFyKC0tcGFwZXItY2hlY2tib3gtaW5rLXNpemUsIC0xcHgpOwogICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgIGxpbmUtaGVpZ2h0OiAwOwogICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICB9CgogIDpob3N0KFtoaWRkZW5dKSB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgfQoKICA6aG9zdCg6Zm9jdXMpIHsKICAgIG91dGxpbmU6IG5vbmU7CiAgfQoKICAuaGlkZGVuIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQoKICAjY2hlY2tib3hDb250YWluZXIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSk7CiAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSk7CiAgICBtaW4td2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSk7CiAgICBtYXJnaW46IHZhcigtLXBhcGVyLWNoZWNrYm94LW1hcmdpbiwgaW5pdGlhbCk7CiAgICB2ZXJ0aWNhbC1hbGlnbjogdmFyKC0tcGFwZXItY2hlY2tib3gtdmVydGljYWwtYWxpZ24sIG1pZGRsZSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtYmFja2dyb3VuZC1jb2xvciwgdHJhbnNwYXJlbnQpOwogIH0KCiAgI2luayB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CgogICAgLyogQ2VudGVyIHRoZSByaXBwbGUgaW4gdGhlIGNoZWNrYm94IGJ5IG5lZ2F0aXZlIG9mZnNldHRpbmcgaXQgYnkKICAgICAqIChpbmtXaWR0aCAtIHJpcHBsZVdpZHRoKSAvIDIgKi8KICAgIHRvcDogY2FsYygwcHggLSAodmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSkgLSB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpKSAvIDIpOwogICAgbGVmdDogY2FsYygwcHggLSAodmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSkgLSB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpKSAvIDIpOwogICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpOwogICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplKTsKICAgIGNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgIG9wYWNpdHk6IDAuNjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogIH0KCiAgI2luazpkaXIocnRsKSB7CiAgICByaWdodDogY2FsYygwcHggLSAodmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSkgLSB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpKSAvIDIpOwogICAgbGVmdDogYXV0bzsKICB9CgogICNpbmtbY2hlY2tlZF0gewogICAgY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgfQoKICAjY2hlY2tib3ggewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIGhlaWdodDogMTAwJTsKICAgIGJvcmRlcjogc29saWQgMnB4OwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAtd2Via2l0LXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMTQwbXMsIGJvcmRlci1jb2xvciAxNDBtczsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMTQwbXMsIGJvcmRlci1jb2xvciAxNDBtczsKCiAgICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLWNoZWNrYm94LWFuaW1hdGlvbi1kdXJhdGlvbiwgMTQwbXMpOwogICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItY2hlY2tib3gtYW5pbWF0aW9uLWR1cmF0aW9uLCAxNDBtcyk7CiAgfQoKICAvKiBjaGVja2JveCBjaGVja2VkIGFuaW1hdGlvbnMgKi8KICAjY2hlY2tib3guY2hlY2tlZCAjY2hlY2ttYXJrIHsKICAgIC13ZWJraXQtYW5pbWF0aW9uOiBjaGVja21hcmstZXhwYW5kIDE0MG1zIGVhc2Utb3V0IGZvcndhcmRzOwogICAgYW5pbWF0aW9uOiBjaGVja21hcmstZXhwYW5kIDE0MG1zIGVhc2Utb3V0IGZvcndhcmRzOwoKICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci1jaGVja2JveC1hbmltYXRpb24tZHVyYXRpb24sIDE0MG1zKTsKICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItY2hlY2tib3gtYW5pbWF0aW9uLWR1cmF0aW9uLCAxNDBtcyk7CiAgfQoKICBALXdlYmtpdC1rZXlmcmFtZXMgY2hlY2ttYXJrLWV4cGFuZCB7CiAgICAwJSB7CiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLCAwKSByb3RhdGUoNDVkZWcpOwogICAgfQogICAgMTAwJSB7CiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLCAxKSByb3RhdGUoNDVkZWcpOwogICAgfQogIH0KCiAgQGtleWZyYW1lcyBjaGVja21hcmstZXhwYW5kIHsKICAgIDAlIHsKICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLCAwKSByb3RhdGUoNDVkZWcpOwogICAgfQogICAgMTAwJSB7CiAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSkgcm90YXRlKDQ1ZGVnKTsKICAgIH0KICB9CgogICNjaGVja2JveC5jaGVja2VkIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogIH0KCiAgI2NoZWNrbWFyayB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB3aWR0aDogMzYlOwogICAgaGVpZ2h0OiA3MCU7CiAgICBib3JkZXItc3R5bGU6IHNvbGlkOwogICAgYm9yZGVyLXRvcDogbm9uZTsKICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgYm9yZGVyLXJpZ2h0LXdpZHRoOiBjYWxjKDIvMTUgKiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpKTsKICAgIGJvcmRlci1ib3R0b20td2lkdGg6IGNhbGMoMi8xNSAqIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1jaGVja21hcmstY29sb3IsIHdoaXRlKTsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogOTclIDg2JTsKICAgIHRyYW5zZm9ybS1vcmlnaW46IDk3JSA4NiU7CiAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDsgLyogcHJvdGVjdCBhZ2FpbnN0IHBhZ2UtbGV2ZWwgYm94LXNpemluZyAqLwogIH0KCiAgI2NoZWNrbWFyazpkaXIocnRsKSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IDUwJSAxNCU7CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiA1MCUgMTQlOwogIH0KCiAgLyogbGFiZWwgKi8KICAjY2hlY2tib3hMYWJlbCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1wYXBlci1jaGVja2JveC1sYWJlbC1zcGFjaW5nLCA4cHgpOwogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7CiAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgQGFwcGx5IC0tcGFwZXItY2hlY2tib3gtbGFiZWw7CiAgfQoKICA6aG9zdChbY2hlY2tlZF0pICNjaGVja2JveExhYmVsIHsKICAgIGNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1sYWJlbC1jaGVja2VkLWNvbG9yLCB2YXIoLS1wYXBlci1jaGVja2JveC1sYWJlbC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSkpOwogICAgQGFwcGx5IC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY2hlY2tlZDsKICB9CgogICNjaGVja2JveExhYmVsOmRpcihydGwpIHsKICAgIHBhZGRpbmctcmlnaHQ6IHZhcigtLXBhcGVyLWNoZWNrYm94LWxhYmVsLXNwYWNpbmcsIDhweCk7CiAgICBwYWRkaW5nLWxlZnQ6IDA7CiAgfQoKICAjY2hlY2tib3hMYWJlbFtoaWRkZW5dIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQoKICAvKiBkaXNhYmxlZCBzdGF0ZSAqLwoKICA6aG9zdChbZGlzYWJsZWRdKSAjY2hlY2tib3ggewogICAgb3BhY2l0eTogMC41OwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogIH0KCiAgOmhvc3QoW2Rpc2FibGVkXVtjaGVja2VkXSkgI2NoZWNrYm94IHsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICBvcGFjaXR5OiAwLjU7CiAgfQoKICA6aG9zdChbZGlzYWJsZWRdKSAjY2hlY2tib3hMYWJlbCAgewogICAgb3BhY2l0eTogMC42NTsKICB9CgogIC8qIGludmFsaWQgc3RhdGUgKi8KICAjY2hlY2tib3guaW52YWxpZDpub3QoLmNoZWNrZWQpIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtZXJyb3ItY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgfQo8L3N0eWxlPgoKPGRpdiBpZD0iY2hlY2tib3hDb250YWluZXIiPgogIDxkaXYgaWQ9ImNoZWNrYm94IiBjbGFzcyQ9IltbX2NvbXB1dGVDaGVja2JveENsYXNzKGNoZWNrZWQsIGludmFsaWQpXV0iPgogICAgPGRpdiBpZD0iY2hlY2ttYXJrIiBjbGFzcyQ9IltbX2NvbXB1dGVDaGVja21hcmtDbGFzcyhjaGVja2VkKV1dIj48L2Rpdj4KICA8L2Rpdj4KPC9kaXY+Cgo8ZGl2IGlkPSJjaGVja2JveExhYmVsIj48c2xvdD48L3Nsb3Q+PC9kaXY+YDsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpsZXQgZGE7aGEuc2V0QXR0cmlidXRlKCJzdHJpcC13aGl0ZXNwYWNlIiwiIiksUnIoe190ZW1wbGF0ZTpoYSxpczoicGFwZXItY2hlY2tib3giLGJlaGF2aW9yczpbdWFdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJjaGVja2JveCIsImFyaWEtY2hlY2tlZCI6ITEsdGFiaW5kZXg6MH0scHJvcGVydGllczp7YXJpYUFjdGl2ZUF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImFyaWEtY2hlY2tlZCJ9fSxhdHRhY2hlZDpmdW5jdGlvbigpe0xpKHRoaXMsKGZ1bmN0aW9uKCl7aWYoIi0xcHgiPT09dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSIpLnRyaW0oKSl7dmFyIHQ9dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplIikudHJpbSgpLGU9InB4IixuPXQubWF0Y2goL1tBLVphLXpdKyQvKTtudWxsIT09biYmKGU9blswXSk7dmFyIGk9cGFyc2VGbG9hdCh0KSxyPTgvMyppOyJweCI9PT1lJiYocj1NYXRoLmZsb29yKHIpKSUyIT1pJTImJnIrKyx0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItY2hlY2tib3gtaW5rLXNpemUiOnIrZX0pfX0pKX0sX2NvbXB1dGVDaGVja2JveENsYXNzOmZ1bmN0aW9uKHQsZSl7dmFyIG49IiI7cmV0dXJuIHQmJihuKz0iY2hlY2tlZCAiKSxlJiYobis9ImludmFsaWQiKSxufSxfY29tcHV0ZUNoZWNrbWFya0NsYXNzOmZ1bmN0aW9uKHQpe3JldHVybiB0PyIiOiJoaWRkZW4ifSxfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JpcHBsZUNvbnRhaW5lcj10aGlzLiQuY2hlY2tib3hDb250YWluZXIsbGEuX2NyZWF0ZVJpcHBsZS5jYWxsKHRoaXMpfX0pO2NvbnN0IHBhPXtwcm9wZXJ0aWVzOntzaXppbmdUYXJnZXQ6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSxmaXRJbnRvOnt0eXBlOk9iamVjdCx2YWx1ZTp3aW5kb3d9LG5vT3ZlcmxhcDp7dHlwZTpCb29sZWFufSxwb3NpdGlvblRhcmdldDp7dHlwZTpFbGVtZW50fSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nfSx2ZXJ0aWNhbEFsaWduOnt0eXBlOlN0cmluZ30sZHluYW1pY0FsaWduOnt0eXBlOkJvb2xlYW59LGhvcml6b250YWxPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSx2ZXJ0aWNhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LGF1dG9GaXRPbkF0dGFjaDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxleHBhbmRTaXppbmdUYXJnZXRGb3JTY3JvbGxiYXJzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9maXRJbmZvOnt0eXBlOk9iamVjdH19LGdldCBfZml0V2lkdGgoKXtyZXR1cm4gdGhpcy5maXRJbnRvPT09d2luZG93P3RoaXMuZml0SW50by5pbm5lcldpZHRoOnRoaXMuZml0SW50by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aH0sZ2V0IF9maXRIZWlnaHQoKXtyZXR1cm4gdGhpcy5maXRJbnRvPT09d2luZG93P3RoaXMuZml0SW50by5pbm5lckhlaWdodDp0aGlzLmZpdEludG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0fSxnZXQgX2ZpdExlZnQoKXtyZXR1cm4gdGhpcy5maXRJbnRvPT09d2luZG93PzA6dGhpcy5maXRJbnRvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnR9LGdldCBfZml0VG9wKCl7cmV0dXJuIHRoaXMuZml0SW50bz09PXdpbmRvdz8wOnRoaXMuZml0SW50by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3B9LGdldCBfZGVmYXVsdFBvc2l0aW9uVGFyZ2V0KCl7dmFyIHQ9WWkodGhpcykucGFyZW50Tm9kZTtyZXR1cm4gdCYmdC5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSYmKHQ9dC5ob3N0KSx0fSxnZXQgX2xvY2FsZUhvcml6b250YWxBbGlnbigpe2lmKHRoaXMuX2lzUlRMKXtpZigicmlnaHQiPT09dGhpcy5ob3Jpem9udGFsQWxpZ24pcmV0dXJuImxlZnQiO2lmKCJsZWZ0Ij09PXRoaXMuaG9yaXpvbnRhbEFsaWduKXJldHVybiJyaWdodCJ9cmV0dXJuIHRoaXMuaG9yaXpvbnRhbEFsaWdufSxnZXQgX19zaG91bGRQb3NpdGlvbigpe3JldHVybih0aGlzLmhvcml6b250YWxBbGlnbnx8dGhpcy52ZXJ0aWNhbEFsaWduKSYmdGhpcy5wb3NpdGlvblRhcmdldH0sZ2V0IF9pc1JUTCgpe3JldHVybiB2b2lkIDA9PT10aGlzLl9tZW1vaXplZElzUlRMJiYodGhpcy5fbWVtb2l6ZWRJc1JUTD0icnRsIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcykuZGlyZWN0aW9uKSx0aGlzLl9tZW1vaXplZElzUlRMfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMucG9zaXRpb25UYXJnZXQ9dGhpcy5wb3NpdGlvblRhcmdldHx8dGhpcy5fZGVmYXVsdFBvc2l0aW9uVGFyZ2V0LHRoaXMuYXV0b0ZpdE9uQXR0YWNoJiYoIm5vbmUiPT09d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcykuZGlzcGxheT9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5maXQoKX0uYmluZCh0aGlzKSk6KHdpbmRvdy5TaGFkeURPTSYmU2hhZHlET00uZmx1c2goKSx0aGlzLmZpdCgpKSl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fX2RlZmVycmVkRml0JiYoY2xlYXJUaW1lb3V0KHRoaXMuX19kZWZlcnJlZEZpdCksdGhpcy5fX2RlZmVycmVkRml0PW51bGwpfSxmaXQ6ZnVuY3Rpb24oKXt0aGlzLnBvc2l0aW9uKCksdGhpcy5jb25zdHJhaW4oKSx0aGlzLmNlbnRlcigpfSxfZGlzY292ZXJJbmZvOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2ZpdEluZm8pe3ZhciB0PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5zaXppbmdUYXJnZXQpO3RoaXMuX2ZpdEluZm89e2lubGluZVN0eWxlOnt0b3A6dGhpcy5zdHlsZS50b3B8fCIiLGxlZnQ6dGhpcy5zdHlsZS5sZWZ0fHwiIixwb3NpdGlvbjp0aGlzLnN0eWxlLnBvc2l0aW9ufHwiIn0sc2l6ZXJJbmxpbmVTdHlsZTp7bWF4V2lkdGg6dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUubWF4V2lkdGh8fCIiLG1heEhlaWdodDp0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5tYXhIZWlnaHR8fCIiLGJveFNpemluZzp0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5ib3hTaXppbmd8fCIifSxwb3NpdGlvbmVkQnk6e3ZlcnRpY2FsbHk6ImF1dG8iIT09dC50b3A/InRvcCI6ImF1dG8iIT09dC5ib3R0b20/ImJvdHRvbSI6bnVsbCxob3Jpem9udGFsbHk6ImF1dG8iIT09dC5sZWZ0PyJsZWZ0IjoiYXV0byIhPT10LnJpZ2h0PyJyaWdodCI6bnVsbH0sc2l6ZWRCeTp7aGVpZ2h0OiJub25lIiE9PWUubWF4SGVpZ2h0LHdpZHRoOiJub25lIiE9PWUubWF4V2lkdGgsbWluV2lkdGg6cGFyc2VJbnQoZS5taW5XaWR0aCwxMCl8fDAsbWluSGVpZ2h0OnBhcnNlSW50KGUubWluSGVpZ2h0LDEwKXx8MH0sbWFyZ2luOnt0b3A6cGFyc2VJbnQodC5tYXJnaW5Ub3AsMTApfHwwLHJpZ2h0OnBhcnNlSW50KHQubWFyZ2luUmlnaHQsMTApfHwwLGJvdHRvbTpwYXJzZUludCh0Lm1hcmdpbkJvdHRvbSwxMCl8fDAsbGVmdDpwYXJzZUludCh0Lm1hcmdpbkxlZnQsMTApfHwwfX19fSxyZXNldEZpdDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2ZpdEluZm98fHt9O2Zvcih2YXIgZSBpbiB0LnNpemVySW5saW5lU3R5bGUpdGhpcy5zaXppbmdUYXJnZXQuc3R5bGVbZV09dC5zaXplcklubGluZVN0eWxlW2VdO2Zvcih2YXIgZSBpbiB0LmlubGluZVN0eWxlKXRoaXMuc3R5bGVbZV09dC5pbmxpbmVTdHlsZVtlXTt0aGlzLl9maXRJbmZvPW51bGx9LHJlZml0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsTGVmdCxlPXRoaXMuc2l6aW5nVGFyZ2V0LnNjcm9sbFRvcDt0aGlzLnJlc2V0Rml0KCksdGhpcy5maXQoKSx0aGlzLnNpemluZ1RhcmdldC5zY3JvbGxMZWZ0PXQsdGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsVG9wPWV9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19zaG91bGRQb3NpdGlvbilyZXR1cm47dGhpcy5fZGlzY292ZXJJbmZvKCksd2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uZmx1c2goKSx0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsdGhpcy5zaXppbmdUYXJnZXQuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iix0aGlzLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5zdHlsZS50b3A9IjBweCI7dmFyIHQ9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxlPXRoaXMuX19nZXROb3JtYWxpemVkUmVjdCh0aGlzLnBvc2l0aW9uVGFyZ2V0KSxuPXRoaXMuX19nZXROb3JtYWxpemVkUmVjdCh0aGlzLmZpdEludG8pO2xldCBpLHIsbyxhO3RoaXMuZXhwYW5kU2l6aW5nVGFyZ2V0Rm9yU2Nyb2xsYmFycyYmKGk9dGhpcy5zaXppbmdUYXJnZXQub2Zmc2V0V2lkdGgscj10aGlzLnNpemluZ1RhcmdldC5vZmZzZXRIZWlnaHQsbz10aGlzLnNpemluZ1RhcmdldC5jbGllbnRXaWR0aCxhPXRoaXMuc2l6aW5nVGFyZ2V0LmNsaWVudEhlaWdodCk7dmFyIHM9dGhpcy5fZml0SW5mby5tYXJnaW4sbD10aGlzLl9fZ2V0UG9zaXRpb24odGhpcy5fbG9jYWxlSG9yaXpvbnRhbEFsaWduLHRoaXMudmVydGljYWxBbGlnbix7d2lkdGg6dC53aWR0aCtzLmxlZnQrcy5yaWdodCxoZWlnaHQ6dC5oZWlnaHQrcy50b3Arcy5ib3R0b219LHQsZSxuKSxjPWwubGVmdCtzLmxlZnQsdT1sLnRvcCtzLnRvcCxoPU1hdGgubWluKG4ucmlnaHQtcy5yaWdodCxjK3Qud2lkdGgpLGQ9TWF0aC5taW4obi5ib3R0b20tcy5ib3R0b20sdSt0LmhlaWdodCk7Yz1NYXRoLm1heChuLmxlZnQrcy5sZWZ0LE1hdGgubWluKGMsaC10aGlzLl9maXRJbmZvLnNpemVkQnkubWluV2lkdGgpKSx1PU1hdGgubWF4KG4udG9wK3MudG9wLE1hdGgubWluKHUsZC10aGlzLl9maXRJbmZvLnNpemVkQnkubWluSGVpZ2h0KSk7Y29uc3QgcD1NYXRoLm1heChoLWMsdGhpcy5fZml0SW5mby5zaXplZEJ5Lm1pbldpZHRoKSxmPU1hdGgubWF4KGQtdSx0aGlzLl9maXRJbmZvLnNpemVkQnkubWluSGVpZ2h0KTt0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5tYXhXaWR0aD1wKyJweCIsdGhpcy5zaXppbmdUYXJnZXQuc3R5bGUubWF4SGVpZ2h0PWYrInB4Ijtjb25zdCBtPWMtdC5sZWZ0LGc9dS10LnRvcDtpZih0aGlzLnN0eWxlLmxlZnQ9YCR7bX1weGAsdGhpcy5zdHlsZS50b3A9YCR7Z31weGAsdGhpcy5leHBhbmRTaXppbmdUYXJnZXRGb3JTY3JvbGxiYXJzKXtjb25zdCB0PXRoaXMuc2l6aW5nVGFyZ2V0Lm9mZnNldEhlaWdodCxlPXQtdGhpcy5zaXppbmdUYXJnZXQuY2xpZW50SGVpZ2h0LShyLWEpO2lmKGU+MCl7Y29uc3QgaT1NYXRoLm1pbihuLmhlaWdodC1zLnRvcC1zLmJvdHRvbSxmK2UpO3RoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLm1heEhlaWdodD1gJHtpfXB4YDtjb25zdCByPXRoaXMuc2l6aW5nVGFyZ2V0Lm9mZnNldEhlaWdodCxvPXItdDtsZXQgYTsidG9wIj09PWwudmVydGljYWxBbGlnbj9hPWc6Im1pZGRsZSI9PT1sLnZlcnRpY2FsQWxpZ24/YT1nLW8vMjoiYm90dG9tIj09PWwudmVydGljYWxBbGlnbiYmKGE9Zy1vKSxhPU1hdGgubWF4KG4udG9wK3MudG9wLE1hdGgubWluKGEsbi5ib3R0b20tcy5ib3R0b20tcikpLHRoaXMuc3R5bGUudG9wPWAke2F9cHhgfWNvbnN0IGM9dGhpcy5zaXppbmdUYXJnZXQub2Zmc2V0V2lkdGgsdT1jLXRoaXMuc2l6aW5nVGFyZ2V0LmNsaWVudFdpZHRoLShpLW8pO2lmKHU+MCl7Y29uc3QgdD0oKCk9PntpZih2b2lkIDAhPT1kYSlyZXR1cm4gZGE7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtPYmplY3QuYXNzaWduKHQuc3R5bGUse292ZXJmbG93OiJhdXRvIixwb3NpdGlvbjoiZml4ZWQiLGxlZnQ6IjBweCIsdG9wOiIwcHgiLG1heFdpZHRoOiIxMDBweCIsbWF4SGVpZ2h0OiIxMDBweCJ9KTtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiBlLnN0eWxlLndpZHRoPSIyMDBweCIsZS5zdHlsZS5oZWlnaHQ9IjIwMHB4Iix0LmFwcGVuZENoaWxkKGUpLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodCksZGE9TWF0aC5hYnModC5vZmZzZXRXaWR0aC0xMDApPjE/dC5vZmZzZXRXaWR0aC10LmNsaWVudFdpZHRoOjAsZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0KSxkYX0pKCksZT1NYXRoLm1pbihuLndpZHRoLXMubGVmdC1zLnJpZ2h0LHArdS10KTt0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5tYXhXaWR0aD1gJHtlfXB4YDtjb25zdCBpPXRoaXMuc2l6aW5nVGFyZ2V0Lm9mZnNldFdpZHRoK3Qscj1pLWM7bGV0IG87ImxlZnQiPT09bC5ob3Jpem9udGFsQWxpZ24/bz1tOiJjZW50ZXIiPT09bC5ob3Jpem9udGFsQWxpZ24/bz1tLXIvMjoicmlnaHQiPT09bC5ob3Jpem9udGFsQWxpZ24mJihvPW0tciksbz1NYXRoLm1heChuLmxlZnQrcy5sZWZ0LE1hdGgubWluKG8sbi5yaWdodC1zLnJpZ2h0LWkpKSx0aGlzLnN0eWxlLmxlZnQ9YCR7b31weGB9fX0sY29uc3RyYWluOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19zaG91bGRQb3NpdGlvbil7dGhpcy5fZGlzY292ZXJJbmZvKCk7dmFyIHQ9dGhpcy5fZml0SW5mbzt0LnBvc2l0aW9uZWRCeS52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLHRoaXMuc3R5bGUudG9wPSIwcHgiKSx0LnBvc2l0aW9uZWRCeS5ob3Jpem9udGFsbHl8fCh0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsdGhpcy5zdHlsZS5sZWZ0PSIwcHgiKSx0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giO3ZhciBlPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dC5zaXplZEJ5LmhlaWdodHx8dGhpcy5fX3NpemVEaW1lbnNpb24oZSx0LnBvc2l0aW9uZWRCeS52ZXJ0aWNhbGx5LCJ0b3AiLCJib3R0b20iLCJIZWlnaHQiKSx0LnNpemVkQnkud2lkdGh8fHRoaXMuX19zaXplRGltZW5zaW9uKGUsdC5wb3NpdGlvbmVkQnkuaG9yaXpvbnRhbGx5LCJsZWZ0IiwicmlnaHQiLCJXaWR0aCIpfX0sX3NpemVEaW1lbnNpb246ZnVuY3Rpb24odCxlLG4saSxyKXt0aGlzLl9fc2l6ZURpbWVuc2lvbih0LGUsbixpLHIpfSxfX3NpemVEaW1lbnNpb246ZnVuY3Rpb24odCxlLG4saSxyKXt2YXIgbz10aGlzLl9maXRJbmZvLGE9dGhpcy5fX2dldE5vcm1hbGl6ZWRSZWN0KHRoaXMuZml0SW50bykscz0iV2lkdGgiPT09cj9hLndpZHRoOmEuaGVpZ2h0LGw9ZT09PWksYz0ib2Zmc2V0IityO3RoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlWyJtYXgiK3JdPXMtby5tYXJnaW5bbD9uOmldLShsP3MtdFtpXTp0W25dKS0odGhpc1tjXS10aGlzLnNpemluZ1RhcmdldFtjXSkrInB4In0sY2VudGVyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19zaG91bGRQb3NpdGlvbil7dGhpcy5fZGlzY292ZXJJbmZvKCk7dmFyIHQ9dGhpcy5fZml0SW5mby5wb3NpdGlvbmVkQnk7aWYoIXQudmVydGljYWxseXx8IXQuaG9yaXpvbnRhbGx5KXt0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsdC52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS50b3A9IjBweCIpLHQuaG9yaXpvbnRhbGx5fHwodGhpcy5zdHlsZS5sZWZ0PSIwcHgiKTt2YXIgZT10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49dGhpcy5fX2dldE5vcm1hbGl6ZWRSZWN0KHRoaXMuZml0SW50byk7dC52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS50b3A9bi50b3AtZS50b3ArKG4uaGVpZ2h0LWUuaGVpZ2h0KS8yKyJweCIpLHQuaG9yaXpvbnRhbGx5fHwodGhpcy5zdHlsZS5sZWZ0PW4ubGVmdC1lLmxlZnQrKG4ud2lkdGgtZS53aWR0aCkvMisicHgiKX19fSxfX2dldE5vcm1hbGl6ZWRSZWN0OmZ1bmN0aW9uKHQpe3JldHVybiB0PT09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx0PT09d2luZG93P3t0b3A6MCxsZWZ0OjAsd2lkdGg6d2luZG93LmlubmVyV2lkdGgsaGVpZ2h0OndpbmRvdy5pbm5lckhlaWdodCxyaWdodDp3aW5kb3cuaW5uZXJXaWR0aCxib3R0b206d2luZG93LmlubmVySGVpZ2h0fTp0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfSxfX2dldE9mZnNjcmVlbkFyZWE6ZnVuY3Rpb24odCxlLG4pe3ZhciBpPU1hdGgubWluKDAsdC50b3ApK01hdGgubWluKDAsbi5ib3R0b20tKHQudG9wK2UuaGVpZ2h0KSkscj1NYXRoLm1pbigwLHQubGVmdCkrTWF0aC5taW4oMCxuLnJpZ2h0LSh0LmxlZnQrZS53aWR0aCkpO3JldHVybiBNYXRoLmFicyhpKSplLndpZHRoK01hdGguYWJzKHIpKmUuaGVpZ2h0fSxfX2dldFBvc2l0aW9uOmZ1bmN0aW9uKHQsZSxuLGkscixvKXt2YXIgYSxzPVt7dmVydGljYWxBbGlnbjoidG9wIixob3Jpem9udGFsQWxpZ246ImxlZnQiLHRvcDpyLnRvcCt0aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ci5sZWZ0K3RoaXMuaG9yaXpvbnRhbE9mZnNldH0se3ZlcnRpY2FsQWxpZ246InRvcCIsaG9yaXpvbnRhbEFsaWduOiJyaWdodCIsdG9wOnIudG9wK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDpyLnJpZ2h0LW4ud2lkdGgtdGhpcy5ob3Jpem9udGFsT2Zmc2V0fSx7dmVydGljYWxBbGlnbjoiYm90dG9tIixob3Jpem9udGFsQWxpZ246ImxlZnQiLHRvcDpyLmJvdHRvbS1uLmhlaWdodC10aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ci5sZWZ0K3RoaXMuaG9yaXpvbnRhbE9mZnNldH0se3ZlcnRpY2FsQWxpZ246ImJvdHRvbSIsaG9yaXpvbnRhbEFsaWduOiJyaWdodCIsdG9wOnIuYm90dG9tLW4uaGVpZ2h0LXRoaXMudmVydGljYWxPZmZzZXQsbGVmdDpyLnJpZ2h0LW4ud2lkdGgtdGhpcy5ob3Jpem9udGFsT2Zmc2V0fV07aWYodGhpcy5ub092ZXJsYXApe2Zvcih2YXIgbD0wLGM9cy5sZW5ndGg7bDxjO2wrKyl7dmFyIHU9e307Zm9yKHZhciBoIGluIHNbbF0pdVtoXT1zW2xdW2hdO3MucHVzaCh1KX1zWzBdLnRvcD1zWzFdLnRvcCs9ci5oZWlnaHQsc1syXS50b3A9c1szXS50b3AtPXIuaGVpZ2h0LHNbNF0ubGVmdD1zWzZdLmxlZnQrPXIud2lkdGgsc1s1XS5sZWZ0PXNbN10ubGVmdC09ci53aWR0aH1mb3IoZT0iYXV0byI9PT1lP251bGw6ZSwodD0iYXV0byI9PT10P251bGw6dCkmJiJjZW50ZXIiIT09dHx8KHMucHVzaCh7dmVydGljYWxBbGlnbjoidG9wIixob3Jpem9udGFsQWxpZ246ImNlbnRlciIsdG9wOnIudG9wK3RoaXMudmVydGljYWxPZmZzZXQrKHRoaXMubm9PdmVybGFwP3IuaGVpZ2h0OjApLGxlZnQ6ci5sZWZ0LWkud2lkdGgvMityLndpZHRoLzIrdGhpcy5ob3Jpem9udGFsT2Zmc2V0fSkscy5wdXNoKHt2ZXJ0aWNhbEFsaWduOiJib3R0b20iLGhvcml6b250YWxBbGlnbjoiY2VudGVyIix0b3A6ci5ib3R0b20tbi5oZWlnaHQtdGhpcy52ZXJ0aWNhbE9mZnNldC0odGhpcy5ub092ZXJsYXA/ci5oZWlnaHQ6MCksbGVmdDpyLmxlZnQtaS53aWR0aC8yK3Iud2lkdGgvMit0aGlzLmhvcml6b250YWxPZmZzZXR9KSksZSYmIm1pZGRsZSIhPT1lfHwocy5wdXNoKHt2ZXJ0aWNhbEFsaWduOiJtaWRkbGUiLGhvcml6b250YWxBbGlnbjoibGVmdCIsdG9wOnIudG9wLWkuaGVpZ2h0LzIrci5oZWlnaHQvMit0aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ci5sZWZ0K3RoaXMuaG9yaXpvbnRhbE9mZnNldCsodGhpcy5ub092ZXJsYXA/ci53aWR0aDowKX0pLHMucHVzaCh7dmVydGljYWxBbGlnbjoibWlkZGxlIixob3Jpem9udGFsQWxpZ246InJpZ2h0Iix0b3A6ci50b3AtaS5oZWlnaHQvMityLmhlaWdodC8yK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDpyLnJpZ2h0LW4ud2lkdGgtdGhpcy5ob3Jpem9udGFsT2Zmc2V0LSh0aGlzLm5vT3ZlcmxhcD9yLndpZHRoOjApfSkpLCJtaWRkbGUiPT09ZSYmImNlbnRlciI9PT10JiZzLnB1c2goe3ZlcnRpY2FsQWxpZ246Im1pZGRsZSIsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLHRvcDpyLnRvcC1pLmhlaWdodC8yK3IuaGVpZ2h0LzIrdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OnIubGVmdC1pLndpZHRoLzIrci53aWR0aC8yK3RoaXMuaG9yaXpvbnRhbE9mZnNldH0pLGw9MDtsPHMubGVuZ3RoO2wrKyl7dmFyIGQ9c1tsXSxwPWQudmVydGljYWxBbGlnbj09PWUsZj1kLmhvcml6b250YWxBbGlnbj09PXQ7aWYoIXRoaXMuZHluYW1pY0FsaWduJiYhdGhpcy5ub092ZXJsYXAmJnAmJmYpe2E9ZDticmVha312YXIgbT0oIWV8fHApJiYoIXR8fGYpO2lmKHRoaXMuZHluYW1pY0FsaWdufHxtKXtpZihkLm9mZnNjcmVlbkFyZWE9dGhpcy5fX2dldE9mZnNjcmVlbkFyZWEoZCxuLG8pLDA9PT1kLm9mZnNjcmVlbkFyZWEmJm0pe2E9ZDticmVha312YXIgZz1kLm9mZnNjcmVlbkFyZWEtKGE9YXx8ZCkub2Zmc2NyZWVuQXJlYTsoZzwwfHwwPT09ZyYmKHB8fGYpKSYmKGE9ZCl9fXJldHVybiBhfX07Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNiBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwp2YXIgZmE9RWxlbWVudC5wcm90b3R5cGUsbWE9ZmEubWF0Y2hlc3x8ZmEubWF0Y2hlc1NlbGVjdG9yfHxmYS5tb3pNYXRjaGVzU2VsZWN0b3J8fGZhLm1zTWF0Y2hlc1NlbGVjdG9yfHxmYS5vTWF0Y2hlc1NlbGVjdG9yfHxmYS53ZWJraXRNYXRjaGVzU2VsZWN0b3I7Y29uc3QgZ2E9bmV3IGNsYXNze2dldFRhYmJhYmxlTm9kZXModCl7dmFyIGU9W107cmV0dXJuIHRoaXMuX2NvbGxlY3RUYWJiYWJsZU5vZGVzKHQsZSk/dGhpcy5fc29ydEJ5VGFiSW5kZXgoZSk6ZX1pc0ZvY3VzYWJsZSh0KXtyZXR1cm4gbWEuY2FsbCh0LCJpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYnV0dG9uLCBvYmplY3QiKT9tYS5jYWxsKHQsIjpub3QoW2Rpc2FibGVkXSkiKTptYS5jYWxsKHQsImFbaHJlZl0sIGFyZWFbaHJlZl0sIGlmcmFtZSwgW3RhYmluZGV4XSwgW2NvbnRlbnRFZGl0YWJsZV0iKX1pc1RhYmJhYmxlKHQpe3JldHVybiB0aGlzLmlzRm9jdXNhYmxlKHQpJiZtYS5jYWxsKHQsJzpub3QoW3RhYmluZGV4PSItMSJdKScpJiZ0aGlzLl9pc1Zpc2libGUodCl9X25vcm1hbGl6ZWRUYWJJbmRleCh0KXtpZih0aGlzLmlzRm9jdXNhYmxlKHQpKXt2YXIgZT10LmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKXx8MDtyZXR1cm4gTnVtYmVyKGUpfXJldHVybi0xfV9jb2xsZWN0VGFiYmFibGVOb2Rlcyh0LGUpe2lmKHQubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4hMTt2YXIgbj10O2lmKCF0aGlzLl9pc1Zpc2libGUobikpcmV0dXJuITE7dmFyIGkscj10aGlzLl9ub3JtYWxpemVkVGFiSW5kZXgobiksbz1yPjA7cj49MCYmZS5wdXNoKG4pLGk9ImNvbnRlbnQiPT09bi5sb2NhbE5hbWV8fCJzbG90Ij09PW4ubG9jYWxOYW1lP1lpKG4pLmdldERpc3RyaWJ1dGVkTm9kZXMoKTpZaShuLnJvb3R8fG4pLmNoaWxkcmVuO2Zvcih2YXIgYT0wO2E8aS5sZW5ndGg7YSsrKW89dGhpcy5fY29sbGVjdFRhYmJhYmxlTm9kZXMoaVthXSxlKXx8bztyZXR1cm4gb31faXNWaXNpYmxlKHQpe3ZhciBlPXQuc3R5bGU7cmV0dXJuImhpZGRlbiIhPT1lLnZpc2liaWxpdHkmJiJub25lIiE9PWUuZGlzcGxheSYmImhpZGRlbiIhPT0oZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KSkudmlzaWJpbGl0eSYmIm5vbmUiIT09ZS5kaXNwbGF5fV9zb3J0QnlUYWJJbmRleCh0KXt2YXIgZT10Lmxlbmd0aDtpZihlPDIpcmV0dXJuIHQ7dmFyIG49TWF0aC5jZWlsKGUvMiksaT10aGlzLl9zb3J0QnlUYWJJbmRleCh0LnNsaWNlKDAsbikpLHI9dGhpcy5fc29ydEJ5VGFiSW5kZXgodC5zbGljZShuKSk7cmV0dXJuIHRoaXMuX21lcmdlU29ydEJ5VGFiSW5kZXgoaSxyKX1fbWVyZ2VTb3J0QnlUYWJJbmRleCh0LGUpe2Zvcih2YXIgbj1bXTt0Lmxlbmd0aD4wJiZlLmxlbmd0aD4wOyl0aGlzLl9oYXNMb3dlclRhYk9yZGVyKHRbMF0sZVswXSk/bi5wdXNoKGUuc2hpZnQoKSk6bi5wdXNoKHQuc2hpZnQoKSk7cmV0dXJuIG4uY29uY2F0KHQsZSl9X2hhc0xvd2VyVGFiT3JkZXIodCxlKXt2YXIgbj1NYXRoLm1heCh0LnRhYkluZGV4LDApLGk9TWF0aC5tYXgoZS50YWJJbmRleCwwKTtyZXR1cm4gMD09PW58fDA9PT1pP2k+bjpuPml9fTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovUnIoe190ZW1wbGF0ZTpfZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLWJhY2tncm91bmQtY29sb3IsICMwMDApOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIEBhcHBseSAtLWlyb24tb3ZlcmxheS1iYWNrZHJvcDsKICAgICAgfQoKICAgICAgOmhvc3QoLm9wZW5lZCkgewogICAgICAgIG9wYWNpdHk6IHZhcigtLWlyb24tb3ZlcmxheS1iYWNrZHJvcC1vcGFjaXR5LCAwLjYpOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICAgIEBhcHBseSAtLWlyb24tb3ZlcmxheS1iYWNrZHJvcC1vcGVuZWQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgpgLGlzOiJpcm9uLW92ZXJsYXktYmFja2Ryb3AiLHByb3BlcnRpZXM6e29wZW5lZDp7cmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifX0sbGlzdGVuZXJzOnt0cmFuc2l0aW9uZW5kOiJfb25UcmFuc2l0aW9uZW5kIn0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX19vcGVuZWRSYWY9bnVsbH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5fb3BlbmVkQ2hhbmdlZCh0aGlzLm9wZW5lZCl9LHByZXBhcmU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmIXRoaXMucGFyZW50Tm9kZSYmWWkoZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQodGhpcyl9LG9wZW46ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMH0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMX0sY29tcGxldGU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZHx8dGhpcy5wYXJlbnROb2RlIT09ZG9jdW1lbnQuYm9keXx8WWkodGhpcy5wYXJlbnROb2RlKS5yZW1vdmVDaGlsZCh0aGlzKX0sX29uVHJhbnNpdGlvbmVuZDpmdW5jdGlvbih0KXt0JiZ0LnRhcmdldD09PXRoaXMmJnRoaXMuY29tcGxldGUoKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24odCl7aWYodCl0aGlzLnByZXBhcmUoKTtlbHNle3ZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpOyIwcyIhPT1lLnRyYW5zaXRpb25EdXJhdGlvbiYmMCE9ZS5vcGFjaXR5fHx0aGlzLmNvbXBsZXRlKCl9dGhpcy5pc0F0dGFjaGVkJiYodGhpcy5fX29wZW5lZFJhZiYmKHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fb3BlbmVkUmFmKSx0aGlzLl9fb3BlbmVkUmFmPW51bGwpLHRoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wLHRoaXMuX19vcGVuZWRSYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3RoaXMuX19vcGVuZWRSYWY9bnVsbCx0aGlzLnRvZ2dsZUNsYXNzKCJvcGVuZWQiLHRoaXMub3BlbmVkKX0uYmluZCh0aGlzKSkpfX0pO2NvbnN0IF9hPW5ldwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9vdmVybGF5cz1bXSx0aGlzLl9taW5pbXVtWj0xMDEsdGhpcy5fYmFja2Ryb3BFbGVtZW50PW51bGwsaWkoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCJ0YXAiLChmdW5jdGlvbigpe30pKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLHRoaXMuX29uQ2FwdHVyZUNsaWNrLmJpbmQodGhpcyksITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9vbkNhcHR1cmVGb2N1cy5iaW5kKHRoaXMpLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLl9vbkNhcHR1cmVLZXlEb3duLmJpbmQodGhpcyksITApfWdldCBiYWNrZHJvcEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fYmFja2Ryb3BFbGVtZW50fHwodGhpcy5fYmFja2Ryb3BFbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlyb24tb3ZlcmxheS1iYWNrZHJvcCIpKSx0aGlzLl9iYWNrZHJvcEVsZW1lbnR9Z2V0IGRlZXBBY3RpdmVFbGVtZW50KCl7dmFyIHQ9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtmb3IodCYmdCBpbnN0YW5jZW9mIEVsZW1lbnQhPTB8fCh0PWRvY3VtZW50LmJvZHkpO3Qucm9vdCYmWWkodC5yb290KS5hY3RpdmVFbGVtZW50Oyl0PVlpKHQucm9vdCkuYWN0aXZlRWxlbWVudDtyZXR1cm4gdH1fYnJpbmdPdmVybGF5QXRJbmRleFRvRnJvbnQodCl7dmFyIGU9dGhpcy5fb3ZlcmxheXNbdF07aWYoZSl7dmFyIG49dGhpcy5fb3ZlcmxheXMubGVuZ3RoLTEsaT10aGlzLl9vdmVybGF5c1tuXTtpZihpJiZ0aGlzLl9zaG91bGRCZUJlaGluZE92ZXJsYXkoZSxpKSYmbi0tLCEodD49bikpe3ZhciByPU1hdGgubWF4KHRoaXMuY3VycmVudE92ZXJsYXlaKCksdGhpcy5fbWluaW11bVopO2Zvcih0aGlzLl9nZXRaKGUpPD1yJiZ0aGlzLl9hcHBseU92ZXJsYXlaKGUscik7dDxuOyl0aGlzLl9vdmVybGF5c1t0XT10aGlzLl9vdmVybGF5c1t0KzFdLHQrKzt0aGlzLl9vdmVybGF5c1tuXT1lfX19YWRkT3JSZW1vdmVPdmVybGF5KHQpe3Qub3BlbmVkP3RoaXMuYWRkT3ZlcmxheSh0KTp0aGlzLnJlbW92ZU92ZXJsYXkodCl9YWRkT3ZlcmxheSh0KXt2YXIgZT10aGlzLl9vdmVybGF5cy5pbmRleE9mKHQpO2lmKGU+PTApcmV0dXJuIHRoaXMuX2JyaW5nT3ZlcmxheUF0SW5kZXhUb0Zyb250KGUpLHZvaWQgdGhpcy50cmFja0JhY2tkcm9wKCk7dmFyIG49dGhpcy5fb3ZlcmxheXMubGVuZ3RoLGk9dGhpcy5fb3ZlcmxheXNbbi0xXSxyPU1hdGgubWF4KHRoaXMuX2dldFooaSksdGhpcy5fbWluaW11bVopLG89dGhpcy5fZ2V0Wih0KTtpJiZ0aGlzLl9zaG91bGRCZUJlaGluZE92ZXJsYXkodCxpKSYmKHRoaXMuX2FwcGx5T3ZlcmxheVooaSxyKSxuLS0scj1NYXRoLm1heCh0aGlzLl9nZXRaKHRoaXMuX292ZXJsYXlzW24tMV0pLHRoaXMuX21pbmltdW1aKSksbzw9ciYmdGhpcy5fYXBwbHlPdmVybGF5Wih0LHIpLHRoaXMuX292ZXJsYXlzLnNwbGljZShuLDAsdCksdGhpcy50cmFja0JhY2tkcm9wKCl9cmVtb3ZlT3ZlcmxheSh0KXt2YXIgZT10aGlzLl9vdmVybGF5cy5pbmRleE9mKHQpOy0xIT09ZSYmKHRoaXMuX292ZXJsYXlzLnNwbGljZShlLDEpLHRoaXMudHJhY2tCYWNrZHJvcCgpKX1jdXJyZW50T3ZlcmxheSgpe3JldHVybiB0aGlzLl9vdmVybGF5c1t0aGlzLl9vdmVybGF5cy5sZW5ndGgtMV19Y3VycmVudE92ZXJsYXlaKCl7cmV0dXJuIHRoaXMuX2dldFoodGhpcy5jdXJyZW50T3ZlcmxheSgpKX1lbnN1cmVNaW5pbXVtWih0KXt0aGlzLl9taW5pbXVtWj1NYXRoLm1heCh0aGlzLl9taW5pbXVtWix0KX1mb2N1c092ZXJsYXkoKXt2YXIgdD10aGlzLmN1cnJlbnRPdmVybGF5KCk7dCYmdC5fYXBwbHlGb2N1cygpfXRyYWNrQmFja2Ryb3AoKXt2YXIgdD10aGlzLl9vdmVybGF5V2l0aEJhY2tkcm9wKCk7KHR8fHRoaXMuX2JhY2tkcm9wRWxlbWVudCkmJih0aGlzLmJhY2tkcm9wRWxlbWVudC5zdHlsZS56SW5kZXg9dGhpcy5fZ2V0Wih0KS0xLHRoaXMuYmFja2Ryb3BFbGVtZW50Lm9wZW5lZD0hIXQsdGhpcy5iYWNrZHJvcEVsZW1lbnQucHJlcGFyZSgpKX1nZXRCYWNrZHJvcHMoKXtmb3IodmFyIHQ9W10sZT0wO2U8dGhpcy5fb3ZlcmxheXMubGVuZ3RoO2UrKyl0aGlzLl9vdmVybGF5c1tlXS53aXRoQmFja2Ryb3AmJnQucHVzaCh0aGlzLl9vdmVybGF5c1tlXSk7cmV0dXJuIHR9YmFja2Ryb3BaKCl7cmV0dXJuIHRoaXMuX2dldFoodGhpcy5fb3ZlcmxheVdpdGhCYWNrZHJvcCgpKS0xfV9vdmVybGF5V2l0aEJhY2tkcm9wKCl7Zm9yKHZhciB0PXRoaXMuX292ZXJsYXlzLmxlbmd0aC0xO3Q+PTA7dC0tKWlmKHRoaXMuX292ZXJsYXlzW3RdLndpdGhCYWNrZHJvcClyZXR1cm4gdGhpcy5fb3ZlcmxheXNbdF19X2dldFoodCl7dmFyIGU9dGhpcy5fbWluaW11bVo7aWYodCl7dmFyIG49TnVtYmVyKHQuc3R5bGUuekluZGV4fHx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS56SW5kZXgpO249PW4mJihlPW4pfXJldHVybiBlfV9zZXRaKHQsZSl7dC5zdHlsZS56SW5kZXg9ZX1fYXBwbHlPdmVybGF5Wih0LGUpe3RoaXMuX3NldFoodCxlKzIpfV9vdmVybGF5SW5QYXRoKHQpe3Q9dHx8W107Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspaWYodFtlXS5fbWFuYWdlcj09PXRoaXMpcmV0dXJuIHRbZV19X29uQ2FwdHVyZUNsaWNrKHQpe3ZhciBlPXRoaXMuX292ZXJsYXlzLmxlbmd0aC0xO2lmKC0xIT09ZSlmb3IodmFyIG4saT1ZaSh0KS5wYXRoOyhuPXRoaXMuX292ZXJsYXlzW2VdKSYmdGhpcy5fb3ZlcmxheUluUGF0aChpKSE9PW4mJihuLl9vbkNhcHR1cmVDbGljayh0KSxuLmFsbG93Q2xpY2tUaHJvdWdoKTspZS0tfV9vbkNhcHR1cmVGb2N1cyh0KXt2YXIgZT10aGlzLmN1cnJlbnRPdmVybGF5KCk7ZSYmZS5fb25DYXB0dXJlRm9jdXModCl9X29uQ2FwdHVyZUtleURvd24odCl7dmFyIGU9dGhpcy5jdXJyZW50T3ZlcmxheSgpO2UmJih6by5rZXlib2FyZEV2ZW50TWF0Y2hlc0tleXModCwiZXNjIik/ZS5fb25DYXB0dXJlRXNjKHQpOnpvLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyh0LCJ0YWIiKSYmZS5fb25DYXB0dXJlVGFiKHQpKX1fc2hvdWxkQmVCZWhpbmRPdmVybGF5KHQsZSl7cmV0dXJuIXQuYWx3YXlzT25Ub3AmJmUuYWx3YXlzT25Ub3B9fTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovdmFyIHlhLHZhLGJhPXtwYWdlWDowLHBhZ2VZOjB9LHhhPW51bGwsd2E9W10sU2E9WyJ3aGVlbCIsIm1vdXNld2hlZWwiLCJET01Nb3VzZVNjcm9sbCIsInRvdWNoc3RhcnQiLCJ0b3VjaG1vdmUiXTtmdW5jdGlvbiBNYSh0KXtFYS5pbmRleE9mKHQpPj0wfHwoMD09PUVhLmxlbmd0aCYmKGZ1bmN0aW9uIGUoKXt5YT15YXx8VGEuYmluZCh2b2lkIDApO2Zvcih2YXIgdD0wLGU9U2EubGVuZ3RoO3Q8ZTt0KyspZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihTYVt0XSx5YSx7Y2FwdHVyZTohMCxwYXNzaXZlOiExfSl9KSgpLEVhLnB1c2godCksdmE9RWFbRWEubGVuZ3RoLTFdKX1jb25zdCBFYT1bXTtmdW5jdGlvbiBUYSh0KXtpZih0LmNhbmNlbGFibGUmJihmdW5jdGlvbiBlKHQpe3ZhciBlPVlpKHQpLnJvb3RUYXJnZXQ7aWYoInRvdWNobW92ZSIhPT10LnR5cGUmJnhhIT09ZSYmKHhhPWUsd2E9KGZ1bmN0aW9uIG4odCl7Zm9yKHZhciBlPVtdLG49dC5pbmRleE9mKHZhKSxpPTA7aTw9bjtpKyspaWYodFtpXS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKXt2YXIgcj10W2ldLG89ci5zdHlsZTsic2Nyb2xsIiE9PW8ub3ZlcmZsb3cmJiJhdXRvIiE9PW8ub3ZlcmZsb3cmJihvPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHIpKSwic2Nyb2xsIiE9PW8ub3ZlcmZsb3cmJiJhdXRvIiE9PW8ub3ZlcmZsb3d8fGUucHVzaChyKX1yZXR1cm4gZX0pKFlpKHQpLnBhdGgpKSwhd2EubGVuZ3RoKXJldHVybiEwO2lmKCJ0b3VjaHN0YXJ0Ij09PXQudHlwZSlyZXR1cm4hMTt2YXIgaT0oZnVuY3Rpb24gcih0KXt2YXIgZT17ZGVsdGFYOnQuZGVsdGFYLGRlbHRhWTp0LmRlbHRhWX07aWYoImRlbHRhWCJpbiB0KTtlbHNlIGlmKCJ3aGVlbERlbHRhWCJpbiB0JiYid2hlZWxEZWx0YVkiaW4gdCllLmRlbHRhWD0tdC53aGVlbERlbHRhWCxlLmRlbHRhWT0tdC53aGVlbERlbHRhWTtlbHNlIGlmKCJ3aGVlbERlbHRhImluIHQpZS5kZWx0YVg9MCxlLmRlbHRhWT0tdC53aGVlbERlbHRhO2Vsc2UgaWYoImF4aXMiaW4gdCllLmRlbHRhWD0xPT09dC5heGlzP3QuZGV0YWlsOjAsZS5kZWx0YVk9Mj09PXQuYXhpcz90LmRldGFpbDowO2Vsc2UgaWYodC50YXJnZXRUb3VjaGVzKXt2YXIgbj10LnRhcmdldFRvdWNoZXNbMF07ZS5kZWx0YVg9YmEucGFnZVgtbi5wYWdlWCxlLmRlbHRhWT1iYS5wYWdlWS1uLnBhZ2VZfXJldHVybiBlfQovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8pKHQpO3JldHVybiEoZnVuY3Rpb24gbyh0LGUsbil7aWYoZXx8bilmb3IodmFyIGk9TWF0aC5hYnMobik+PU1hdGguYWJzKGUpLHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG89dFtyXTtpZihpP248MD9vLnNjcm9sbFRvcD4wOm8uc2Nyb2xsVG9wPG8uc2Nyb2xsSGVpZ2h0LW8uY2xpZW50SGVpZ2h0OmU8MD9vLnNjcm9sbExlZnQ+MDpvLnNjcm9sbExlZnQ8by5zY3JvbGxXaWR0aC1vLmNsaWVudFdpZHRoKXJldHVybiBvfX0pKHdhLGkuZGVsdGFYLGkuZGVsdGFZKX0pKHQpJiZ0LnByZXZlbnREZWZhdWx0KCksdC50YXJnZXRUb3VjaGVzKXt2YXIgbj10LnRhcmdldFRvdWNoZXNbMF07YmEucGFnZVg9bi5wYWdlWCxiYS5wYWdlWT1uLnBhZ2VZfX1jb25zdCBDYT17cHJvcGVydGllczp7b3BlbmVkOntvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQiLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LGNhbmNlbGVkOntvYnNlcnZlcjoiX2NhbmNlbGVkQ2hhbmdlZCIscmVhZE9ubHk6ITAsdHlwZTpCb29sZWFuLHZhbHVlOiExfSx3aXRoQmFja2Ryb3A6e29ic2VydmVyOiJfd2l0aEJhY2tkcm9wQ2hhbmdlZCIsdHlwZTpCb29sZWFufSxub0F1dG9Gb2N1czp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0NhbmNlbE9uRXNjS2V5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sY2xvc2luZ1JlYXNvbjp7dHlwZTpPYmplY3R9LHJlc3RvcmVGb2N1c09uQ2xvc2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYWxsb3dDbGlja1Rocm91Z2g6e3R5cGU6Qm9vbGVhbn0sYWx3YXlzT25Ub3A6e3R5cGU6Qm9vbGVhbn0sc2Nyb2xsQWN0aW9uOnt0eXBlOlN0cmluZ30sX21hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOl9hfSxfZm9jdXNlZENoaWxkOnt0eXBlOk9iamVjdH19LGxpc3RlbmVyczp7Imlyb24tcmVzaXplIjoiX29uSXJvblJlc2l6ZSJ9LG9ic2VydmVyczpbIl9fdXBkYXRlU2Nyb2xsT2JzZXJ2ZXJzKGlzQXR0YWNoZWQsIG9wZW5lZCwgc2Nyb2xsQWN0aW9uKSJdLGdldCBiYWNrZHJvcEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fbWFuYWdlci5iYWNrZHJvcEVsZW1lbnR9LGdldCBfZm9jdXNOb2RlKCl7cmV0dXJuIHRoaXMuX2ZvY3VzZWRDaGlsZHx8WWkodGhpcykucXVlcnlTZWxlY3RvcigiW2F1dG9mb2N1c10iKXx8dGhpc30sZ2V0IF9mb2N1c2FibGVOb2Rlcygpe3JldHVybiBnYS5nZXRUYWJiYWJsZU5vZGVzKHRoaXMpfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX19pc0FuaW1hdGluZz0hMSx0aGlzLl9fc2hvdWxkUmVtb3ZlVGFiSW5kZXg9ITEsdGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZT10aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGU9bnVsbCx0aGlzLl9fcmFmcz17fSx0aGlzLl9fcmVzdG9yZUZvY3VzTm9kZT1udWxsLHRoaXMuX19zY3JvbGxUb3A9dGhpcy5fX3Njcm9sbExlZnQ9bnVsbCx0aGlzLl9fb25DYXB0dXJlU2Nyb2xsPXRoaXMuX19vbkNhcHR1cmVTY3JvbGwuYmluZCh0aGlzKSx0aGlzLl9fcm9vdE5vZGVzPW51bGwsdGhpcy5fZW5zdXJlU2V0dXAoKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5fb3BlbmVkQ2hhbmdlZCh0aGlzLm9wZW5lZCksdGhpcy5fb2JzZXJ2ZXI9WWkodGhpcykub2JzZXJ2ZU5vZGVzKHRoaXMuX29uTm9kZXNDaGFuZ2UpfSxkZXRhY2hlZDpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLl9vYnNlcnZlciYmWWkodGhpcykudW5vYnNlcnZlTm9kZXModGhpcy5fb2JzZXJ2ZXIpLHRoaXMuX29ic2VydmVyPW51bGwsdGhpcy5fX3JhZnMpbnVsbCE9PXRoaXMuX19yYWZzW3RdJiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fcmFmc1t0XSk7dGhpcy5fX3JhZnM9e30sdGhpcy5fbWFuYWdlci5yZW1vdmVPdmVybGF5KHRoaXMpLHRoaXMuX19pc0FuaW1hdGluZyYmKHRoaXMub3BlbmVkP3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOih0aGlzLl9hcHBseUZvY3VzKCksdGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCkpKX0sdG9nZ2xlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Q2FuY2VsZWQoITEpLHRoaXMub3BlbmVkPSF0aGlzLm9wZW5lZH0sb3BlbjpmdW5jdGlvbigpe3RoaXMuX3NldENhbmNlbGVkKCExKSx0aGlzLm9wZW5lZD0hMH0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLl9zZXRDYW5jZWxlZCghMSksdGhpcy5vcGVuZWQ9ITF9LGNhbmNlbDpmdW5jdGlvbih0KXt0aGlzLmZpcmUoImlyb24tb3ZlcmxheS1jYW5jZWxlZCIsdCx7Y2FuY2VsYWJsZTohMH0pLmRlZmF1bHRQcmV2ZW50ZWR8fCh0aGlzLl9zZXRDYW5jZWxlZCghMCksdGhpcy5vcGVuZWQ9ITEpfSxpbnZhbGlkYXRlVGFiYmFibGVzOmZ1bmN0aW9uKCl7dGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZT10aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGU9bnVsbH0sX2Vuc3VyZVNldHVwOmZ1bmN0aW9uKCl7dGhpcy5fb3ZlcmxheVNldHVwfHwodGhpcy5fb3ZlcmxheVNldHVwPSEwLHRoaXMuc3R5bGUub3V0bGluZT0ibm9uZSIsdGhpcy5zdHlsZS5kaXNwbGF5PSJub25lIil9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKHQpe3Q/dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIik6dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpLHRoaXMuaXNBdHRhY2hlZCYmKHRoaXMuX19pc0FuaW1hdGluZz0hMCx0aGlzLl9fZGVyYWYoIl9fb3BlbmVkQ2hhbmdlZCIsdGhpcy5fX29wZW5lZENoYW5nZWQpKX0sX2NhbmNlbGVkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuY2xvc2luZ1JlYXNvbj10aGlzLmNsb3NpbmdSZWFzb258fHt9LHRoaXMuY2xvc2luZ1JlYXNvbi5jYW5jZWxlZD10aGlzLmNhbmNlbGVkfSxfd2l0aEJhY2tkcm9wQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMud2l0aEJhY2tkcm9wJiYhdGhpcy5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iik/KHRoaXMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIi0xIiksdGhpcy5fX3Nob3VsZFJlbW92ZVRhYkluZGV4PSEwKTp0aGlzLl9fc2hvdWxkUmVtb3ZlVGFiSW5kZXgmJih0aGlzLnJlbW92ZUF0dHJpYnV0ZSgidGFiaW5kZXgiKSx0aGlzLl9fc2hvdWxkUmVtb3ZlVGFiSW5kZXg9ITEpLHRoaXMub3BlbmVkJiZ0aGlzLmlzQXR0YWNoZWQmJnRoaXMuX21hbmFnZXIudHJhY2tCYWNrZHJvcCgpfSxfcHJlcGFyZVJlbmRlck9wZW5lZDpmdW5jdGlvbigpe3RoaXMuX19yZXN0b3JlRm9jdXNOb2RlPXRoaXMuX21hbmFnZXIuZGVlcEFjdGl2ZUVsZW1lbnQsdGhpcy5fcHJlcGFyZVBvc2l0aW9uaW5nKCksdGhpcy5yZWZpdCgpLHRoaXMuX2ZpbmlzaFBvc2l0aW9uaW5nKCksdGhpcy5ub0F1dG9Gb2N1cyYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PXRoaXMuX2ZvY3VzTm9kZSYmKHRoaXMuX2ZvY3VzTm9kZS5ibHVyKCksdGhpcy5fX3Jlc3RvcmVGb2N1c05vZGUuZm9jdXMoKSl9LF9yZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLl9maW5pc2hSZW5kZXJPcGVuZWQoKX0sX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpe3RoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpfSxfZmluaXNoUmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5ub3RpZnlSZXNpemUoKSx0aGlzLl9faXNBbmltYXRpbmc9ITEsdGhpcy5maXJlKCJpcm9uLW92ZXJsYXktb3BlbmVkIil9LF9maW5pc2hSZW5kZXJDbG9zZWQ6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuc3R5bGUuekluZGV4PSIiLHRoaXMubm90aWZ5UmVzaXplKCksdGhpcy5fX2lzQW5pbWF0aW5nPSExLHRoaXMuZmlyZSgiaXJvbi1vdmVybGF5LWNsb3NlZCIsdGhpcy5jbG9zaW5nUmVhc29uKX0sX3ByZXBhcmVQb3NpdGlvbmluZzpmdW5jdGlvbigpe3RoaXMuc3R5bGUudHJhbnNpdGlvbj10aGlzLnN0eWxlLndlYmtpdFRyYW5zaXRpb249Im5vbmUiLHRoaXMuc3R5bGUudHJhbnNmb3JtPXRoaXMuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJub25lIix0aGlzLnN0eWxlLmRpc3BsYXk9IiJ9LF9maW5pc2hQb3NpdGlvbmluZzpmdW5jdGlvbigpe3RoaXMuc3R5bGUuZGlzcGxheT0ibm9uZSIsdGhpcy5zY3JvbGxUb3A9dGhpcy5zY3JvbGxUb3AsdGhpcy5zdHlsZS50cmFuc2l0aW9uPXRoaXMuc3R5bGUud2Via2l0VHJhbnNpdGlvbj0iIix0aGlzLnN0eWxlLnRyYW5zZm9ybT10aGlzLnN0eWxlLndlYmtpdFRyYW5zZm9ybT0iIix0aGlzLnN0eWxlLmRpc3BsYXk9IiIsdGhpcy5zY3JvbGxUb3A9dGhpcy5zY3JvbGxUb3B9LF9hcHBseUZvY3VzOmZ1bmN0aW9uKCl7aWYodGhpcy5vcGVuZWQpdGhpcy5ub0F1dG9Gb2N1c3x8dGhpcy5fZm9jdXNOb2RlLmZvY3VzKCk7ZWxzZXtpZih0aGlzLnJlc3RvcmVGb2N1c09uQ2xvc2UmJnRoaXMuX19yZXN0b3JlRm9jdXNOb2RlKXt2YXIgdD10aGlzLl9tYW5hZ2VyLmRlZXBBY3RpdmVFbGVtZW50Oyh0PT09ZG9jdW1lbnQuYm9keXx8QWEodGhpcyx0KSkmJnRoaXMuX19yZXN0b3JlRm9jdXNOb2RlLmZvY3VzKCl9dGhpcy5fX3Jlc3RvcmVGb2N1c05vZGU9bnVsbCx0aGlzLl9mb2N1c05vZGUuYmx1cigpLHRoaXMuX2ZvY3VzZWRDaGlsZD1udWxsfX0sX29uQ2FwdHVyZUNsaWNrOmZ1bmN0aW9uKHQpe3RoaXMubm9DYW5jZWxPbk91dHNpZGVDbGlja3x8dGhpcy5jYW5jZWwodCl9LF9vbkNhcHR1cmVGb2N1czpmdW5jdGlvbih0KXtpZih0aGlzLndpdGhCYWNrZHJvcCl7dmFyIGU9WWkodCkucGF0aDstMT09PWUuaW5kZXhPZih0aGlzKT8odC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLl9hcHBseUZvY3VzKCkpOnRoaXMuX2ZvY3VzZWRDaGlsZD1lWzBdfX0sX29uQ2FwdHVyZUVzYzpmdW5jdGlvbih0KXt0aGlzLm5vQ2FuY2VsT25Fc2NLZXl8fHRoaXMuY2FuY2VsKHQpfSxfb25DYXB0dXJlVGFiOmZ1bmN0aW9uKHQpe2lmKHRoaXMud2l0aEJhY2tkcm9wKXt0aGlzLl9fZW5zdXJlRmlyc3RMYXN0Rm9jdXNhYmxlcygpO3ZhciBlPXQuc2hpZnRLZXksbj1lP3RoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU6dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlLGk9ZT90aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGU6dGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZSxyPSExO2lmKG49PT1pKXI9ITA7ZWxzZXt2YXIgbz10aGlzLl9tYW5hZ2VyLmRlZXBBY3RpdmVFbGVtZW50O3I9bz09PW58fG89PT10aGlzfXImJih0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fZm9jdXNlZENoaWxkPWksdGhpcy5fYXBwbHlGb2N1cygpKX19LF9vbklyb25SZXNpemU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmIXRoaXMuX19pc0FuaW1hdGluZyYmdGhpcy5fX2RlcmFmKCJyZWZpdCIsdGhpcy5yZWZpdCl9LF9vbk5vZGVzQ2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQmJiF0aGlzLl9faXNBbmltYXRpbmcmJih0aGlzLmludmFsaWRhdGVUYWJiYWJsZXMoKSx0aGlzLm5vdGlmeVJlc2l6ZSgpKX0sX19lbnN1cmVGaXJzdExhc3RGb2N1c2FibGVzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZm9jdXNhYmxlTm9kZXM7dGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZT10WzBdLHRoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZT10W3QubGVuZ3RoLTFdfSxfX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD8odGhpcy5fcHJlcGFyZVJlbmRlck9wZW5lZCgpLHRoaXMuX21hbmFnZXIuYWRkT3ZlcmxheSh0aGlzKSx0aGlzLl9hcHBseUZvY3VzKCksdGhpcy5fcmVuZGVyT3BlbmVkKCkpOih0aGlzLl9tYW5hZ2VyLnJlbW92ZU92ZXJsYXkodGhpcyksdGhpcy5fYXBwbHlGb2N1cygpLHRoaXMuX3JlbmRlckNsb3NlZCgpKX0sX19kZXJhZjpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX19yYWZzO251bGwhPT1uW3RdJiZjYW5jZWxBbmltYXRpb25GcmFtZShuW3RdKSxuW3RdPXJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiBpKCl7blt0XT1udWxsLGUuY2FsbCh0aGlzKX0uYmluZCh0aGlzKSl9LF9fdXBkYXRlU2Nyb2xsT2JzZXJ2ZXJzOmZ1bmN0aW9uKHQsZSxuKXt0JiZlJiZ0aGlzLl9faXNWYWxpZFNjcm9sbEFjdGlvbihuKT8oImxvY2siPT09biYmKHRoaXMuX19zYXZlU2Nyb2xsUG9zaXRpb24oKSxNYSh0aGlzKSksdGhpcy5fX2FkZFNjcm9sbExpc3RlbmVycygpKTooKGZ1bmN0aW9uIGkodCl7dmFyIGU9RWEuaW5kZXhPZih0KTstMSE9PWUmJihFYS5zcGxpY2UoZSwxKSx2YT1FYVtFYS5sZW5ndGgtMV0sMD09PUVhLmxlbmd0aCYmKGZ1bmN0aW9uIG4oKXtmb3IodmFyIHQ9MCxlPVNhLmxlbmd0aDt0PGU7dCsrKWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoU2FbdF0seWEse2NhcHR1cmU6ITAscGFzc2l2ZTohMX0pfSkoKSl9KSh0aGlzKSx0aGlzLl9fcmVtb3ZlU2Nyb2xsTGlzdGVuZXJzKCkpfSxfX2FkZFNjcm9sbExpc3RlbmVyczpmdW5jdGlvbigpe2lmKCF0aGlzLl9fcm9vdE5vZGVzKXtpZih0aGlzLl9fcm9vdE5vZGVzPVtdLG0pZm9yKHZhciB0PXRoaXM7dDspdC5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSYmdC5ob3N0JiZ0aGlzLl9fcm9vdE5vZGVzLnB1c2godCksdD10Lmhvc3R8fHQuYXNzaWduZWRTbG90fHx0LnBhcmVudE5vZGU7dGhpcy5fX3Jvb3ROb2Rlcy5wdXNoKGRvY3VtZW50KX10aGlzLl9fcm9vdE5vZGVzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9fb25DYXB0dXJlU2Nyb2xsLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITB9KX0pLHRoaXMpfSxfX3JlbW92ZVNjcm9sbExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuX19yb290Tm9kZXMmJnRoaXMuX19yb290Tm9kZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuX19vbkNhcHR1cmVTY3JvbGwse2NhcHR1cmU6ITAscGFzc2l2ZTohMH0pfSksdGhpcyksdGhpcy5pc0F0dGFjaGVkfHwodGhpcy5fX3Jvb3ROb2Rlcz1udWxsKX0sX19pc1ZhbGlkU2Nyb2xsQWN0aW9uOmZ1bmN0aW9uKHQpe3JldHVybiJsb2NrIj09PXR8fCJyZWZpdCI9PT10fHwiY2FuY2VsIj09PXR9LF9fb25DYXB0dXJlU2Nyb2xsOmZ1bmN0aW9uKHQpe2lmKCEodGhpcy5fX2lzQW5pbWF0aW5nfHxZaSh0KS5wYXRoLmluZGV4T2YodGhpcyk+PTApKXN3aXRjaCh0aGlzLnNjcm9sbEFjdGlvbil7Y2FzZSJsb2NrIjp0aGlzLl9fcmVzdG9yZVNjcm9sbFBvc2l0aW9uKCk7YnJlYWs7Y2FzZSJyZWZpdCI6dGhpcy5fX2RlcmFmKCJyZWZpdCIsdGhpcy5yZWZpdCk7YnJlYWs7Y2FzZSJjYW5jZWwiOnRoaXMuY2FuY2VsKHQpfX0sX19zYXZlU2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXtkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50Pyh0aGlzLl9fc2Nyb2xsVG9wPWRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsVG9wLHRoaXMuX19zY3JvbGxMZWZ0PWRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsTGVmdCk6KHRoaXMuX19zY3JvbGxUb3A9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCxkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCksdGhpcy5fX3Njcm9sbExlZnQ9TWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0KSl9LF9fcmVzdG9yZVNjcm9sbFBvc2l0aW9uOmZ1bmN0aW9uKCl7ZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudD8oZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudC5zY3JvbGxUb3A9dGhpcy5fX3Njcm9sbFRvcCxkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbExlZnQ9dGhpcy5fX3Njcm9sbExlZnQpOihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wPWRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wPXRoaXMuX19zY3JvbGxUb3AsZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ9ZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0PXRoaXMuX19zY3JvbGxMZWZ0KX19LEFhPSh0LGUpPT57Zm9yKGxldCBpPWU7aTtpPShuPWkpLmFzc2lnbmVkU2xvdHx8bi5wYXJlbnROb2RlfHxuLmhvc3QpaWYoaT09PXQpcmV0dXJuITA7dmFyIG47cmV0dXJuITF9LGthPVtwYSxnbyxDYV0sTGE9e2hvc3RBdHRyaWJ1dGVzOntyb2xlOiJkaWFsb2ciLHRhYmluZGV4OiItMSJ9LHByb3BlcnRpZXM6e21vZGFsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9fcmVhZGllZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sb2JzZXJ2ZXJzOlsiX21vZGFsQ2hhbmdlZChtb2RhbCwgX19yZWFkaWVkKSJdLGxpc3RlbmVyczp7dGFwOiJfb25EaWFsb2dDbGljayJ9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fX3ByZXZOb0NhbmNlbE9uT3V0c2lkZUNsaWNrPXRoaXMubm9DYW5jZWxPbk91dHNpZGVDbGljayx0aGlzLl9fcHJldk5vQ2FuY2VsT25Fc2NLZXk9dGhpcy5ub0NhbmNlbE9uRXNjS2V5LHRoaXMuX19wcmV2V2l0aEJhY2tkcm9wPXRoaXMud2l0aEJhY2tkcm9wLHRoaXMuX19yZWFkaWVkPSEwfSxfbW9kYWxDaGFuZ2VkOmZ1bmN0aW9uKHQsZSl7ZSYmKHQ/KHRoaXMuX19wcmV2Tm9DYW5jZWxPbk91dHNpZGVDbGljaz10aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2ssdGhpcy5fX3ByZXZOb0NhbmNlbE9uRXNjS2V5PXRoaXMubm9DYW5jZWxPbkVzY0tleSx0aGlzLl9fcHJldldpdGhCYWNrZHJvcD10aGlzLndpdGhCYWNrZHJvcCx0aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s9ITAsdGhpcy5ub0NhbmNlbE9uRXNjS2V5PSEwLHRoaXMud2l0aEJhY2tkcm9wPSEwKToodGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrPXRoaXMubm9DYW5jZWxPbk91dHNpZGVDbGljayYmdGhpcy5fX3ByZXZOb0NhbmNlbE9uT3V0c2lkZUNsaWNrLHRoaXMubm9DYW5jZWxPbkVzY0tleT10aGlzLm5vQ2FuY2VsT25Fc2NLZXkmJnRoaXMuX19wcmV2Tm9DYW5jZWxPbkVzY0tleSx0aGlzLndpdGhCYWNrZHJvcD10aGlzLndpdGhCYWNrZHJvcCYmdGhpcy5fX3ByZXZXaXRoQmFja2Ryb3ApKX0sX3VwZGF0ZUNsb3NpbmdSZWFzb25Db25maXJtZWQ6ZnVuY3Rpb24odCl7dGhpcy5jbG9zaW5nUmVhc29uPXRoaXMuY2xvc2luZ1JlYXNvbnx8e30sdGhpcy5jbG9zaW5nUmVhc29uLmNvbmZpcm1lZD10fSxfb25EaWFsb2dDbGljazpmdW5jdGlvbih0KXtmb3IodmFyIGU9WWkodCkucGF0aCxuPTAsaT1lLmluZGV4T2YodGhpcyk7bjxpO24rKyl7dmFyIHI9ZVtuXTtpZihyLmhhc0F0dHJpYnV0ZSYmKHIuaGFzQXR0cmlidXRlKCJkaWFsb2ctZGlzbWlzcyIpfHxyLmhhc0F0dHJpYnV0ZSgiZGlhbG9nLWNvbmZpcm0iKSkpe3RoaXMuX3VwZGF0ZUNsb3NpbmdSZWFzb25Db25maXJtZWQoci5oYXNBdHRyaWJ1dGUoImRpYWxvZy1jb25maXJtIikpLHRoaXMuY2xvc2UoKSx0LnN0b3BQcm9wYWdhdGlvbigpO2JyZWFrfX19fSxQYT1ba2EsTGFdOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KaWYoCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpScih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlPgoKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIEBhcHBseSAtLWxheW91dC1yZWxhdGl2ZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmlzLXNjcm9sbGVkOm5vdCg6Zmlyc3QtY2hpbGQpKTo6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgaGVpZ2h0OiAxcHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGl2aWRlci1jb2xvcik7CiAgICAgIH0KCiAgICAgIDpob3N0KC5jYW4tc2Nyb2xsOm5vdCguc2Nyb2xsZWQtdG8tYm90dG9tKTpub3QoOmxhc3QtY2hpbGQpKTo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBoZWlnaHQ6IDFweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1kaXZpZGVyLWNvbG9yKTsKICAgICAgfQoKICAgICAgLnNjcm9sbGFibGUgewogICAgICAgIHBhZGRpbmc6IDAgMjRweDsKCiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXNjcm9sbDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kaWFsb2ctc2Nyb2xsYWJsZTsKICAgICAgfQoKICAgICAgLmZpdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZpdDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJzY3JvbGxhYmxlIiBjbGFzcz0ic2Nyb2xsYWJsZSIgb24tc2Nyb2xsPSJ1cGRhdGVTY3JvbGxTdGF0ZSI+CiAgICAgIDxzbG90Pjwvc2xvdD4KICAgIDwvZGl2PgpgLGlzOiJwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZSIscHJvcGVydGllczp7ZGlhbG9nRWxlbWVudDp7dHlwZTpPYmplY3R9fSxnZXQgc2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXMuJC5zY3JvbGxhYmxlfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX2Vuc3VyZVRhcmdldCgpLHRoaXMuY2xhc3NMaXN0LmFkZCgibm8tcGFkZGluZyIpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2Vuc3VyZVRhcmdldCgpLHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnVwZGF0ZVNjcm9sbFN0YXRlLmJpbmQodGhpcykpfSx1cGRhdGVTY3JvbGxTdGF0ZTpmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ2xhc3MoImlzLXNjcm9sbGVkIix0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A+MCksdGhpcy50b2dnbGVDbGFzcygiY2FuLXNjcm9sbCIsdGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0SGVpZ2h0PHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbEhlaWdodCksdGhpcy50b2dnbGVDbGFzcygic2Nyb2xsZWQtdG8tYm90dG9tIix0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3ArdGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0SGVpZ2h0Pj10aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxIZWlnaHQpfSxfZW5zdXJlVGFyZ2V0OmZ1bmN0aW9uKCl7dGhpcy5kaWFsb2dFbGVtZW50PXRoaXMuZGlhbG9nRWxlbWVudHx8dGhpcy5wYXJlbnRFbGVtZW50LHRoaXMuZGlhbG9nRWxlbWVudCYmdGhpcy5kaWFsb2dFbGVtZW50LmJlaGF2aW9ycyYmdGhpcy5kaWFsb2dFbGVtZW50LmJlaGF2aW9ycy5pbmRleE9mKExhKT49MD8odGhpcy5kaWFsb2dFbGVtZW50LnNpemluZ1RhcmdldD10aGlzLnNjcm9sbFRhcmdldCx0aGlzLnNjcm9sbFRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCJmaXQiKSk6dGhpcy5kaWFsb2dFbGVtZW50JiZ0aGlzLnNjcm9sbFRhcmdldC5jbGFzc0xpc3QuYWRkKCJmaXQiKX19KSwhd2luZG93LnBvbHltZXJTa2lwTG9hZGluZ0ZvbnRSb2JvdG8pe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpO3QucmVsPSJzdHlsZXNoZWV0Iix0LnR5cGU9InRleHQvY3NzIix0LmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiLHQuaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bytNb25vOjQwMCw3MDB8Um9ib3RvOjQwMCwzMDAsMzAwaXRhbGljLDQwMGl0YWxpYyw1MDAsNTAwaXRhbGljLDcwMCw3MDBpdGFsaWMiLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodCl9Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL2NvbnN0IE5hPV9lYDxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CgogICAgICAvKiBTaGFyZWQgU3R5bGVzICovCiAgICAgIC0tcGFwZXItZm9udC1jb21tb24tYmFzZTogewogICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvJywgJ05vdG8nLCBzYW5zLXNlcmlmOwogICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWNvbW1vbi1jb2RlOiB7CiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubycsICdDb25zb2xhcycsICdNZW5sbycsIG1vbm9zcGFjZTsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb21tb24tZXhwZW5zaXZlLWtlcm5pbmc6IHsKICAgICAgICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA6IHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH07CgogICAgICAvKiBNYXRlcmlhbCBGb250IFN0eWxlcyAqLwoKICAgICAgLS1wYXBlci1mb250LWRpc3BsYXk0OiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMTEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDMwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLS4wNDRlbTsKICAgICAgICBsaW5lLWhlaWdodDogMTIwcHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtZGlzcGxheTM6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiA1NnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDI2ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDYwcHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtZGlzcGxheTI6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDQ1cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLS4wMThlbTsKICAgICAgICBsaW5lLWhlaWdodDogNDhweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1kaXNwbGF5MTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogMzRweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtLjAxZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDQwcHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtaGVhZGxpbmU6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDI0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLS4wMTJlbTsKICAgICAgICBsaW5lLWhlaWdodDogMzJweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC10aXRsZTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDIwcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjhweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1zdWJoZWFkOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtYm9keTI6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjRweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1ib2R5MTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWNhcHRpb246IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDExZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtbWVudTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjRweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1idXR0b246IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDE4ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb2RlMjogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWNvZGU7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNzAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWNvZGUxOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tY29kZTsKCiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgIH07CgogICAgfQoKICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT5gO05hLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJkaXNwbGF5OiBub25lOyIpLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoTmEuY29udGVudCk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBJYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpO0lhLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJkaXNwbGF5OiBub25lOyIpLElhLmlubmVySFRNTD0nPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWRpYWxvZy1zaGFyZWQtc3R5bGVzIj5cbiAgPHRlbXBsYXRlPlxuICAgIDxzdHlsZT5cbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIG1hcmdpbjogMjRweCA0MHB4O1xuXG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLWRpYWxvZy1iYWNrZ3JvdW5kLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3IpKTtcbiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWRpYWxvZy1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7XG5cbiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1ib2R5MTtcbiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0xNmRwO1xuICAgICAgICBAYXBwbHkgLS1wYXBlci1kaWFsb2c7XG4gICAgICB9XG5cbiAgICAgIDpob3N0ID4gOjpzbG90dGVkKCopIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMjBweDtcbiAgICAgICAgcGFkZGluZzogMCAyNHB4O1xuICAgICAgfVxuXG4gICAgICA6aG9zdCA+IDo6c2xvdHRlZCgubm8tcGFkZGluZykge1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgfVxuXG4gICAgICBcbiAgICAgIDpob3N0ID4gOjpzbG90dGVkKCo6Zmlyc3QtY2hpbGQpIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMjRweDtcbiAgICAgIH1cblxuICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKjpsYXN0LWNoaWxkKSB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7XG4gICAgICB9XG5cbiAgICAgIC8qIEluIDEueCwgdGhpcyBzZWxlY3RvciB3YXMgYDpob3N0ID4gOjpjb250ZW50IGgyYC4gSW4gMi54IDxzbG90PiBhbGxvd3NcbiAgICAgIHRvIHNlbGVjdCBkaXJlY3QgY2hpbGRyZW4gb25seSwgd2hpY2ggaW5jcmVhc2VzIHRoZSB3ZWlnaHQgb2YgdGhpc1xuICAgICAgc2VsZWN0b3IsIHNvIHdlIGhhdmUgdG8gcmUtZGVmaW5lIGZpcnN0LWNoaWxkL2xhc3QtY2hpbGQgbWFyZ2lucyBiZWxvdy4gKi9cbiAgICAgIDpob3N0ID4gOjpzbG90dGVkKGgyKSB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgbWFyZ2luOiAwO1xuXG4gICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtdGl0bGU7XG4gICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy10aXRsZTtcbiAgICAgIH1cblxuICAgICAgLyogQXBwbHkgbWl4aW4gYWdhaW4sIGluIGNhc2UgaXQgc2V0cyBtYXJnaW4tdG9wLiAqL1xuICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoaDI6Zmlyc3QtY2hpbGQpIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMjRweDtcbiAgICAgICAgQGFwcGx5IC0tcGFwZXItZGlhbG9nLXRpdGxlO1xuICAgICAgfVxuXG4gICAgICAvKiBBcHBseSBtaXhpbiBhZ2FpbiwgaW4gY2FzZSBpdCBzZXRzIG1hcmdpbi1ib3R0b20uICovXG4gICAgICA6aG9zdCA+IDo6c2xvdHRlZChoMjpsYXN0LWNoaWxkKSB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7XG4gICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy10aXRsZTtcbiAgICAgIH1cblxuICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoLnBhcGVyLWRpYWxvZy1idXR0b25zKSxcbiAgICAgIDpob3N0ID4gOjpzbG90dGVkKC5idXR0b25zKSB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgcGFkZGluZzogOHB4IDhweCA4cHggMjRweDtcbiAgICAgICAgbWFyZ2luOiAwO1xuXG4gICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1kaWFsb2ctYnV0dG9uLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7XG5cbiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7XG4gICAgICAgIEBhcHBseSAtLWxheW91dC1lbmQtanVzdGlmaWVkO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gIDwvdGVtcGxhdGU+XG48L2RvbS1tb2R1bGU+Jyxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKElhLmNvbnRlbnQpOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgUmE9W3twcm9wZXJ0aWVzOnthbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0fSxlbnRyeUFuaW1hdGlvbjp7b2JzZXJ2ZXI6Il9lbnRyeUFuaW1hdGlvbkNoYW5nZWQiLHR5cGU6U3RyaW5nfSxleGl0QW5pbWF0aW9uOntvYnNlcnZlcjoiX2V4aXRBbmltYXRpb25DaGFuZ2VkIix0eXBlOlN0cmluZ319LF9lbnRyeUFuaW1hdGlvbkNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmFuaW1hdGlvbkNvbmZpZz10aGlzLmFuaW1hdGlvbkNvbmZpZ3x8e30sdGhpcy5hbmltYXRpb25Db25maWcuZW50cnk9W3tuYW1lOnRoaXMuZW50cnlBbmltYXRpb24sbm9kZTp0aGlzfV19LF9leGl0QW5pbWF0aW9uQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuYW5pbWF0aW9uQ29uZmlnPXRoaXMuYW5pbWF0aW9uQ29uZmlnfHx7fSx0aGlzLmFuaW1hdGlvbkNvbmZpZy5leGl0PVt7bmFtZTp0aGlzLmV4aXRBbmltYXRpb24sbm9kZTp0aGlzfV19LF9jb3B5UHJvcGVydGllczpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKXRbbl09ZVtuXX0sX2Nsb25lQ29uZmlnOmZ1bmN0aW9uKHQpe3ZhciBlPXtpc0Nsb25lOiEwfTtyZXR1cm4gdGhpcy5fY29weVByb3BlcnRpZXMoZSx0KSxlfSxfZ2V0QW5pbWF0aW9uQ29uZmlnUmVjdXJzaXZlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaTtpZih0aGlzLmFuaW1hdGlvbkNvbmZpZylpZih0aGlzLmFuaW1hdGlvbkNvbmZpZy52YWx1ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuYW5pbWF0aW9uQ29uZmlnLnZhbHVlKXRoaXMuX3dhcm4odGhpcy5fbG9nZigicGxheUFuaW1hdGlvbiIsIlBsZWFzZSBwdXQgJ2FuaW1hdGlvbkNvbmZpZycgaW5zaWRlIG9mIHlvdXIgY29tcG9uZW50cyAncHJvcGVydGllcycgb2JqZWN0IGluc3RlYWQgb2Ygb3V0c2lkZSBvZiBpdC4iKSk7ZWxzZSBpZihpPXQ/dGhpcy5hbmltYXRpb25Db25maWdbdF06dGhpcy5hbmltYXRpb25Db25maWcsQXJyYXkuaXNBcnJheShpKXx8KGk9W2ldKSxpKWZvcih2YXIgcixvPTA7cj1pW29dO28rKylpZihyLmFuaW1hdGFibGUpci5hbmltYXRhYmxlLl9nZXRBbmltYXRpb25Db25maWdSZWN1cnNpdmUoci50eXBlfHx0LGUsbik7ZWxzZSBpZihyLmlkKXt2YXIgYT1lW3IuaWRdO2E/KGEuaXNDbG9uZXx8KGVbci5pZF09dGhpcy5fY2xvbmVDb25maWcoYSksYT1lW3IuaWRdKSx0aGlzLl9jb3B5UHJvcGVydGllcyhhLHIpKTplW3IuaWRdPXJ9ZWxzZSBuLnB1c2gocil9LGdldEFuaW1hdGlvbkNvbmZpZzpmdW5jdGlvbih0KXt2YXIgZT17fSxuPVtdO2Zvcih2YXIgaSBpbiB0aGlzLl9nZXRBbmltYXRpb25Db25maWdSZWN1cnNpdmUodCxlLG4pLGUpbi5wdXNoKGVbaV0pO3JldHVybiBufX0se19jb25maWd1cmVBbmltYXRpb25zOmZ1bmN0aW9uKHQpe3ZhciBlPVtdLG49W107aWYodC5sZW5ndGg+MClmb3IobGV0IGUsaT0wO2U9dFtpXTtpKyspe2xldCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZS5uYW1lKTtpZih0LmlzTmVvbkFuaW1hdGlvbil7bGV0IGk9bnVsbDt0LmNvbmZpZ3VyZXx8KHQuY29uZmlndXJlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsfSksaT10LmNvbmZpZ3VyZShlKSxuLnB1c2goe3Jlc3VsdDppLGNvbmZpZzplLG5lb25BbmltYXRpb246dH0pfWVsc2UgY29uc29sZS53YXJuKHRoaXMuaXMrIjoiLGUubmFtZSwibm90IGZvdW5kISIpfWZvcih2YXIgaT0wO2k8bi5sZW5ndGg7aSsrKXtsZXQgdD1uW2ldLnJlc3VsdCxyPW5baV0uY29uZmlnLG89bltpXS5uZW9uQW5pbWF0aW9uO3RyeXsiZnVuY3Rpb24iIT10eXBlb2YgdC5jYW5jZWwmJih0PWRvY3VtZW50LnRpbWVsaW5lLnBsYXkodCkpfWNhdGNoKGUpe3Q9bnVsbCxjb25zb2xlLndhcm4oIkNvdWxkbnQgcGxheSIsIigiLHIubmFtZSwiKS4iLGUpfXQmJmUucHVzaCh7bmVvbkFuaW1hdGlvbjpvLGNvbmZpZzpyLGFuaW1hdGlvbjp0fSl9cmV0dXJuIGV9LF9zaG91bGRDb21wbGV0ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9ITAsbj0wO248dC5sZW5ndGg7bisrKWlmKCJmaW5pc2hlZCIhPXRbbl0uYW5pbWF0aW9uLnBsYXlTdGF0ZSl7ZT0hMTticmVha31yZXR1cm4gZX0sX2NvbXBsZXRlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKXRbZV0ubmVvbkFuaW1hdGlvbi5jb21wbGV0ZSh0W2VdLmNvbmZpZyk7Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdLmFuaW1hdGlvbi5jYW5jZWwoKX0scGxheUFuaW1hdGlvbjpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0QW5pbWF0aW9uQ29uZmlnKHQpO2lmKG4pe3RoaXMuX2FjdGl2ZT10aGlzLl9hY3RpdmV8fHt9LHRoaXMuX2FjdGl2ZVt0XSYmKHRoaXMuX2NvbXBsZXRlKHRoaXMuX2FjdGl2ZVt0XSksZGVsZXRlIHRoaXMuX2FjdGl2ZVt0XSk7dmFyIGk9dGhpcy5fY29uZmlndXJlQW5pbWF0aW9ucyhuKTtpZigwIT1pLmxlbmd0aCl7dGhpcy5fYWN0aXZlW3RdPWk7Zm9yKHZhciByPTA7cjxpLmxlbmd0aDtyKyspaVtyXS5hbmltYXRpb24ub25maW5pc2g9ZnVuY3Rpb24oKXt0aGlzLl9zaG91bGRDb21wbGV0ZShpKSYmKHRoaXMuX2NvbXBsZXRlKGkpLGRlbGV0ZSB0aGlzLl9hY3RpdmVbdF0sdGhpcy5maXJlKCJuZW9uLWFuaW1hdGlvbi1maW5pc2giLGUse2J1YmJsZXM6ITF9KSl9LmJpbmQodGhpcyl9ZWxzZSB0aGlzLmZpcmUoIm5lb24tYW5pbWF0aW9uLWZpbmlzaCIsZSx7YnViYmxlczohMX0pfX0sY2FuY2VsQW5pbWF0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuX2FjdGl2ZSl7dmFyIGU9dGhpcy5fYWN0aXZlW3RdO2Zvcih2YXIgbiBpbiBlKWVbbl0uYW5pbWF0aW9uLmNhbmNlbCgpfXRoaXMuX2FjdGl2ZT17fX19XTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpScih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLWRpYWxvZy1zaGFyZWQtc3R5bGVzIj48L3N0eWxlPgogICAgPHNsb3Q+PC9zbG90PgpgLGlzOiJwYXBlci1kaWFsb2ciLGJlaGF2aW9yczpbUGEsUmFdLGxpc3RlbmVyczp7Im5lb24tYW5pbWF0aW9uLWZpbmlzaCI6Il9vbk5lb25BbmltYXRpb25GaW5pc2gifSxfcmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxBbmltYXRpb24oKSx0aGlzLnBsYXlBbmltYXRpb24oImVudHJ5Iil9LF9yZW5kZXJDbG9zZWQ6ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbEFuaW1hdGlvbigpLHRoaXMucGxheUFuaW1hdGlvbigiZXhpdCIpfSxfb25OZW9uQW5pbWF0aW9uRmluaXNoOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ/dGhpcy5fZmluaXNoUmVuZGVyT3BlbmVkKCk6dGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCl9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBPYT1Scih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBjbGlwOiByZWN0KDBweCwwcHgsMHB4LDBweCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGFyaWEtbGl2ZSQ9IltbbW9kZV1dIj5bW190ZXh0XV08L2Rpdj4KYCxpczoiaXJvbi1hMTF5LWFubm91bmNlciIscHJvcGVydGllczp7bW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6InBvbGl0ZSJ9LHRpbWVvdXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjE1MH0sX3RleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sY3JlYXRlZDpmdW5jdGlvbigpe09hLmluc3RhbmNlfHwoT2EuaW5zdGFuY2U9dGhpcyksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiaXJvbi1hbm5vdW5jZSIsdGhpcy5fb25Jcm9uQW5ub3VuY2UuYmluZCh0aGlzKSl9LGFubm91bmNlOmZ1bmN0aW9uKHQpe3RoaXMuX3RleHQ9IiIsdGhpcy5hc3luYygoZnVuY3Rpb24oKXt0aGlzLl90ZXh0PXR9KSx0aGlzLnRpbWVvdXQpfSxfb25Jcm9uQW5ub3VuY2U6ZnVuY3Rpb24odCl7dC5kZXRhaWwmJnQuZGV0YWlsLnRleHQmJnRoaXMuYW5ub3VuY2UodC5kZXRhaWwudGV4dCl9fSk7T2EuaW5zdGFuY2U9bnVsbCxPYS5yZXF1ZXN0QXZhaWxhYmlsaXR5PWZ1bmN0aW9uKCl7T2EuaW5zdGFuY2V8fChPYS5pbnN0YW5jZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpcm9uLWExMXktYW5ub3VuY2VyIikpLGRvY3VtZW50LmJvZHk/ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChPYS5pbnN0YW5jZSk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChPYS5pbnN0YW5jZSl9KSl9LAovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KUnIoe190ZW1wbGF0ZTpfZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzbG90IGlkPSJjb250ZW50Ij48L3Nsb3Q+CmAsaXM6Imlyb24taW5wdXQiLGJlaGF2aW9yczpbYWFdLHByb3BlcnRpZXM6e2JpbmRWYWx1ZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LHZhbHVlOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVWYWx1ZShiaW5kVmFsdWUpIn0sYWxsb3dlZFBhdHRlcm46e3R5cGU6U3RyaW5nfSxhdXRvVmFsaWRhdGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2lucHV0RWxlbWVudDpPYmplY3R9LG9ic2VydmVyczpbIl9iaW5kVmFsdWVDaGFuZ2VkKGJpbmRWYWx1ZSwgX2lucHV0RWxlbWVudCkiXSxsaXN0ZW5lcnM6e2lucHV0OiJfb25JbnB1dCIsa2V5cHJlc3M6Il9vbktleXByZXNzIn0sY3JlYXRlZDpmdW5jdGlvbigpe09hLnJlcXVlc3RBdmFpbGFiaWxpdHkoKSx0aGlzLl9wcmV2aW91c1ZhbGlkSW5wdXQ9IiIsdGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkPSExfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPVlpKHRoaXMpLm9ic2VydmVOb2RlcyhmdW5jdGlvbih0KXt0aGlzLl9pbml0U2xvdHRlZElucHV0KCl9LmJpbmQodGhpcykpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiYoWWkodGhpcykudW5vYnNlcnZlTm9kZXModGhpcy5fb2JzZXJ2ZXIpLHRoaXMuX29ic2VydmVyPW51bGwpfSxnZXQgaW5wdXRFbGVtZW50KCl7cmV0dXJuIHRoaXMuX2lucHV0RWxlbWVudH0sX2luaXRTbG90dGVkSW5wdXQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dEVsZW1lbnQ9dGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpWzBdLHRoaXMuaW5wdXRFbGVtZW50JiZ0aGlzLmlucHV0RWxlbWVudC52YWx1ZSYmKHRoaXMuYmluZFZhbHVlPXRoaXMuaW5wdXRFbGVtZW50LnZhbHVlKSx0aGlzLmZpcmUoImlyb24taW5wdXQtcmVhZHkiKX0sZ2V0IF9wYXR0ZXJuUmVnRXhwKCl7dmFyIHQ7aWYodGhpcy5hbGxvd2VkUGF0dGVybil0PW5ldyBSZWdFeHAodGhpcy5hbGxvd2VkUGF0dGVybik7ZWxzZSBzd2l0Y2godGhpcy5pbnB1dEVsZW1lbnQudHlwZSl7Y2FzZSJudW1iZXIiOnQ9L1swLTkuLGUtXS99cmV0dXJuIHR9LF9iaW5kVmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKHQsZSl7ZSYmKHZvaWQgMD09PXQ/ZS52YWx1ZT1udWxsOnQhPT1lLnZhbHVlJiYodGhpcy5pbnB1dEVsZW1lbnQudmFsdWU9dCksdGhpcy5hdXRvVmFsaWRhdGUmJnRoaXMudmFsaWRhdGUoKSx0aGlzLmZpcmUoImJpbmQtdmFsdWUtY2hhbmdlZCIse3ZhbHVlOnR9KSl9LF9vbklucHV0OmZ1bmN0aW9uKCl7dGhpcy5hbGxvd2VkUGF0dGVybiYmIXRoaXMuX3BhdHRlcm5BbHJlYWR5Q2hlY2tlZCYmKHRoaXMuX2NoZWNrUGF0dGVyblZhbGlkaXR5KCl8fCh0aGlzLl9hbm5vdW5jZUludmFsaWRDaGFyYWN0ZXIoIkludmFsaWQgc3RyaW5nIG9mIGNoYXJhY3RlcnMgbm90IGVudGVyZWQuIiksdGhpcy5pbnB1dEVsZW1lbnQudmFsdWU9dGhpcy5fcHJldmlvdXNWYWxpZElucHV0KSksdGhpcy5iaW5kVmFsdWU9dGhpcy5fcHJldmlvdXNWYWxpZElucHV0PXRoaXMuaW5wdXRFbGVtZW50LnZhbHVlLHRoaXMuX3BhdHRlcm5BbHJlYWR5Q2hlY2tlZD0hMX0sX2lzUHJpbnRhYmxlOmZ1bmN0aW9uKHQpe3JldHVybiEoOD09dC5rZXlDb2RlfHw5PT10LmtleUNvZGV8fDEzPT10LmtleUNvZGV8fDI3PT10LmtleUNvZGV8fDA9PXQuY2hhckNvZGUmJigxOT09dC5rZXlDb2RlfHwyMD09dC5rZXlDb2RlfHw0NT09dC5rZXlDb2RlfHw0Nj09dC5rZXlDb2RlfHwxNDQ9PXQua2V5Q29kZXx8MTQ1PT10LmtleUNvZGV8fHQua2V5Q29kZT4zMiYmdC5rZXlDb2RlPDQxfHx0LmtleUNvZGU+MTExJiZ0LmtleUNvZGU8MTI0KSl9LF9vbktleXByZXNzOmZ1bmN0aW9uKHQpe2lmKHRoaXMuYWxsb3dlZFBhdHRlcm58fCJudW1iZXIiPT09dGhpcy5pbnB1dEVsZW1lbnQudHlwZSl7dmFyIGU9dGhpcy5fcGF0dGVyblJlZ0V4cDtpZihlJiYhKHQubWV0YUtleXx8dC5jdHJsS2V5fHx0LmFsdEtleSkpe3RoaXMuX3BhdHRlcm5BbHJlYWR5Q2hlY2tlZD0hMDt2YXIgbj1TdHJpbmcuZnJvbUNoYXJDb2RlKHQuY2hhckNvZGUpO3RoaXMuX2lzUHJpbnRhYmxlKHQpJiYhZS50ZXN0KG4pJiYodC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2Fubm91bmNlSW52YWxpZENoYXJhY3RlcigiSW52YWxpZCBjaGFyYWN0ZXIgIituKyIgbm90IGVudGVyZWQuIikpfX19LF9jaGVja1BhdHRlcm5WYWxpZGl0eTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3BhdHRlcm5SZWdFeHA7aWYoIXQpcmV0dXJuITA7Zm9yKHZhciBlPTA7ZTx0aGlzLmlucHV0RWxlbWVudC52YWx1ZS5sZW5ndGg7ZSsrKWlmKCF0LnRlc3QodGhpcy5pbnB1dEVsZW1lbnQudmFsdWVbZV0pKXJldHVybiExO3JldHVybiEwfSx2YWxpZGF0ZTpmdW5jdGlvbigpe2lmKCF0aGlzLmlucHV0RWxlbWVudClyZXR1cm4gdGhpcy5pbnZhbGlkPSExLCEwO3ZhciB0PXRoaXMuaW5wdXRFbGVtZW50LmNoZWNrVmFsaWRpdHkoKTtyZXR1cm4gdCYmKHRoaXMucmVxdWlyZWQmJiIiPT09dGhpcy5iaW5kVmFsdWU/dD0hMTp0aGlzLmhhc1ZhbGlkYXRvcigpJiYodD1hYS52YWxpZGF0ZS5jYWxsKHRoaXMsdGhpcy5iaW5kVmFsdWUpKSksdGhpcy5pbnZhbGlkPSF0LHRoaXMuZmlyZSgiaXJvbi1pbnB1dC12YWxpZGF0ZSIpLHR9LF9hbm5vdW5jZUludmFsaWRDaGFyYWN0ZXI6ZnVuY3Rpb24odCl7dGhpcy5maXJlKCJpcm9uLWFubm91bmNlIix7dGV4dDp0fSl9LF9jb21wdXRlVmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHR9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCB6YT17YXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoImFkZG9uLWF0dGFjaGVkIil9LHVwZGF0ZTpmdW5jdGlvbih0KXt9fTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovUnIoe190ZW1wbGF0ZTpfZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmbG9hdDogcmlnaHQ7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY2FwdGlvbjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jaGFyLWNvdW50ZXI7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c3Bhbj5bW19jaGFyQ291bnRlclN0cl1dPC9zcGFuPgpgLGlzOiJwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIiLGJlaGF2aW9yczpbemFdLHByb3BlcnRpZXM6e19jaGFyQ291bnRlclN0cjp7dHlwZTpTdHJpbmcsdmFsdWU6IjAifX0sdXBkYXRlOmZ1bmN0aW9uKHQpe2lmKHQuaW5wdXRFbGVtZW50KXt0LnZhbHVlPXQudmFsdWV8fCIiO3ZhciBlPXQudmFsdWUudG9TdHJpbmcoKS5sZW5ndGgudG9TdHJpbmcoKTt0LmlucHV0RWxlbWVudC5oYXNBdHRyaWJ1dGUoIm1heGxlbmd0aCIpJiYoZSs9Ii8iK3QuaW5wdXRFbGVtZW50LmdldEF0dHJpYnV0ZSgibWF4bGVuZ3RoIikpLHRoaXMuX2NoYXJDb3VudGVyU3RyPWV9fX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgRGE9X2VgCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CiAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXNoYXJlZC1pbnB1dC1zdHlsZTogewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogdG8gbWFrZSBhIHN0YWNraW5nIGNvbnRleHQgKi8KICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgdGV4dC1hbGlnbjogaW5oZXJpdDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LWFsaWduLCBib3R0b20pOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgIH07CiAgICB9CiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+CmA7RGEuc2V0QXR0cmlidXRlKCJzdHlsZSIsImRpc3BsYXk6IG5vbmU7IiksZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChEYS5jb250ZW50KSxScih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogOHB4IDA7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyOwogICAgICB9CgogICAgICA6aG9zdChbaW5saW5lXSkgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIG9wYWNpdHk6IDAuMzM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5mbG9hdGVkLWxhYmVsLXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNhcHRpb247CiAgICAgIH0KCiAgICAgIC51bmRlcmxpbmUgewogICAgICAgIGhlaWdodDogMnB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLmZvY3VzZWQtbGluZSB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZpdDsKICAgICAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CgogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKDAsMSwxKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlM2QoMCwxLDEpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItdW5kZXJsaW5lLWZvY3VzOwogICAgICB9CgogICAgICAudW5kZXJsaW5lLmlzLWhpZ2hsaWdodGVkIC5mb2N1c2VkLWxpbmUgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBub25lOwogICAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuMjVzOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjI1czsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdHJhbnNpdGlvbi1lYXNpbmc7CiAgICAgIH0KCiAgICAgIC51bmRlcmxpbmUuaXMtaW52YWxpZCAuZm9jdXNlZC1saW5lIHsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBub25lOwogICAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuMjVzOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjI1czsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdHJhbnNpdGlvbi1lYXNpbmc7CiAgICAgIH0KCiAgICAgIC51bmZvY3VzZWQtbGluZSB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZpdDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci11bmRlcmxpbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIC51bmZvY3VzZWQtbGluZSB7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IGRhc2hlZDsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItdW5kZXJsaW5lLWRpc2FibGVkOwogICAgICB9CgogICAgICAuaW5wdXQtd3JhcHBlciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwogICAgICAgIEBhcHBseSAtLWxheW91dC1yZWxhdGl2ZTsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChsYWJlbCksCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZCgucGFwZXItaW5wdXQtbGFiZWwpIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZm9udDogaW5oZXJpdDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcikpOwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMC4yNXMsIHdpZHRoIDAuMjVzOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjI1cywgd2lkdGggMC4yNXM7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IHRvcDsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IHRvcDsKICAgICAgICAvKiBGaXggZm9yIHNhZmFyaSBub3QgZm9jdXNpbmcgMC1oZWlnaHQgZGF0ZS90aW1lIGlucHV0cyB3aXRoIC13ZWJraXQtYXBwZXJhbmNlOiBub25lOyAqLwogICAgICAgIG1pbi1oZWlnaHQ6IDFweDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdHJhbnNpdGlvbi1lYXNpbmc7CiAgICAgIH0KCgogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQobGFiZWwpOmJlZm9yZSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1sYWJlbCk6YmVmb3JlIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWwtYmVmb3JlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQobGFiZWwpOmFmdGVyLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKTphZnRlciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsLWFmdGVyOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTc1JSkgc2NhbGUoMC43NSk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC03NSUpIHNjYWxlKDAuNzUpOwoKICAgICAgICAvKiBTaW5jZSB3ZSBzY2FsZSB0byA3NS8xMDAgb2YgdGhlIHNpemUsIHdlIGFjdHVhbGx5IGhhdmUgMTAwLzc1IG9mIHRoZQogICAgICAgIG9yaWdpbmFsIHNwYWNlIG5vdyBhdmFpbGFibGUgKi8KICAgICAgICB3aWR0aDogMTMzJTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsLWZsb2F0aW5nOwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIC5pbnB1dC1jb250ZW50LmxhYmVsLWlzLWZsb2F0aW5nIDo6c2xvdHRlZChsYWJlbCksCiAgICAgIDpob3N0KDpkaXIocnRsKSkgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtZmxvYXRpbmcgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1sYWJlbCkgewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGxlZnQ6IGF1dG87CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWwtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWRkZW4gOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtaGlkZGVuIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtbGFiZWwpIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpcm9uLWlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWlucHV0KSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXNoYXJlZC1pbnB1dC1zdHlsZTsKICAgICAgICAvKiBUaGUgYXBwbHkgc2hpbSBkb2Vzbid0IGFwcGx5IHRoZSBuZXN0ZWQgY29sb3IgY3VzdG9tIHByb3BlcnR5LAogICAgICAgICAgc28gd2UgaGF2ZSB0byByZS1hcHBseSBpdCBoZXJlLiAqLwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24taW5wdXQpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCh0ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtaW5wdXQpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1pbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1pbnB1dCkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1pbnZhbGlkOwogICAgICB9CgogICAgICAucHJlZml4IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1ub25lOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LXByZWZpeDsKICAgICAgfQoKICAgICAgLnN1ZmZpeCA6OnNsb3R0ZWQoKikgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtbm9uZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtc3VmZml4OwogICAgICB9CgogICAgICAvKiBGaXJlZm94IHNldHMgYSBtaW4td2lkdGggb24gdGhlIGlucHV0LCB3aGljaCBjYW4gY2F1c2UgbGF5b3V0IGlzc3VlcyAqLwogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoaW5wdXQpIHsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZCh0ZXh0YXJlYSkgewogICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgfQoKICAgICAgLmFkZC1vbi1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5hZGQtb24tY29udGVudC5pcy1pbnZhbGlkIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuYWRkLW9uLWNvbnRlbnQuaXMtaGlnaGxpZ2h0ZWQgOjpzbG90dGVkKCopIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciIgYXJpYS1oaWRkZW49InRydWUiIGhpZGRlbj0iW1tub0xhYmVsRmxvYXRdXSI+Jm5ic3A7PC9kaXY+CgogICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgIDxzcGFuIGNsYXNzPSJwcmVmaXgiPjxzbG90IG5hbWU9InByZWZpeCI+PC9zbG90Pjwvc3Bhbj4KCiAgICAgIDxkaXYgY2xhc3MkPSJbW19jb21wdXRlSW5wdXRDb250ZW50Q2xhc3Mobm9MYWJlbEZsb2F0LGFsd2F5c0Zsb2F0TGFiZWwsZm9jdXNlZCxpbnZhbGlkLF9pbnB1dEhhc0NvbnRlbnQpXV0iIGlkPSJsYWJlbEFuZElucHV0Q29udGFpbmVyIj4KICAgICAgICA8c2xvdCBuYW1lPSJsYWJlbCI+PC9zbG90PgogICAgICAgIDxzbG90IG5hbWU9ImlucHV0Ij48L3Nsb3Q+CiAgICAgIDwvZGl2PgoKICAgICAgPHNwYW4gY2xhc3M9InN1ZmZpeCI+PHNsb3QgbmFtZT0ic3VmZml4Ij48L3Nsb3Q+PC9zcGFuPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcyQ9IltbX2NvbXB1dGVVbmRlcmxpbmVDbGFzcyhmb2N1c2VkLGludmFsaWQpXV0iPgogICAgICA8ZGl2IGNsYXNzPSJ1bmZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzJD0iW1tfY29tcHV0ZUFkZE9uQ29udGVudENsYXNzKGZvY3VzZWQsaW52YWxpZCldXSI+CiAgICAgIDxzbG90IG5hbWU9ImFkZC1vbiI+PC9zbG90PgogICAgPC9kaXY+CmAsaXM6InBhcGVyLWlucHV0LWNvbnRhaW5lciIscHJvcGVydGllczp7bm9MYWJlbEZsb2F0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGFsd2F5c0Zsb2F0TGFiZWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYXR0ckZvclZhbHVlOnt0eXBlOlN0cmluZyx2YWx1ZToiYmluZC12YWx1ZSJ9LGF1dG9WYWxpZGF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbnZhbGlkOntvYnNlcnZlcjoiX2ludmFsaWRDaGFuZ2VkIix0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZvY3VzZWQ6e3JlYWRPbmx5OiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LF9hZGRvbnM6e3R5cGU6QXJyYXl9LF9pbnB1dEhhc0NvbnRlbnQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2lucHV0U2VsZWN0b3I6e3R5cGU6U3RyaW5nLHZhbHVlOiJpbnB1dCxpcm9uLWlucHV0LHRleHRhcmVhLC5wYXBlci1pbnB1dC1pbnB1dCJ9LF9ib3VuZE9uRm9jdXM6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25Gb2N1cy5iaW5kKHRoaXMpfX0sX2JvdW5kT25CbHVyOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uQmx1ci5iaW5kKHRoaXMpfX0sX2JvdW5kT25JbnB1dDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbklucHV0LmJpbmQodGhpcyl9fSxfYm91bmRWYWx1ZUNoYW5nZWQ6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25WYWx1ZUNoYW5nZWQuYmluZCh0aGlzKX19fSxsaXN0ZW5lcnM6eyJhZGRvbi1hdHRhY2hlZCI6Il9vbkFkZG9uQXR0YWNoZWQiLCJpcm9uLWlucHV0LXZhbGlkYXRlIjoiX29uSXJvbklucHV0VmFsaWRhdGUifSxnZXQgX3ZhbHVlQ2hhbmdlZEV2ZW50KCl7cmV0dXJuIHRoaXMuYXR0ckZvclZhbHVlKyItY2hhbmdlZCJ9LGdldCBfcHJvcGVydHlGb3JWYWx1ZSgpe3JldHVybiBzdCh0aGlzLmF0dHJGb3JWYWx1ZSl9LGdldCBfaW5wdXRFbGVtZW50KCl7cmV0dXJuIFlpKHRoaXMpLnF1ZXJ5U2VsZWN0b3IodGhpcy5faW5wdXRTZWxlY3Rvcil9LGdldCBfaW5wdXRFbGVtZW50VmFsdWUoKXtyZXR1cm4gdGhpcy5faW5wdXRFbGVtZW50W3RoaXMuX3Byb3BlcnR5Rm9yVmFsdWVdfHx0aGlzLl9pbnB1dEVsZW1lbnQudmFsdWV9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fX2lzRmlyc3RWYWx1ZVVwZGF0ZT0hMCx0aGlzLl9hZGRvbnN8fCh0aGlzLl9hZGRvbnM9W10pLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2JvdW5kT25Gb2N1cywhMCksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9ib3VuZE9uQmx1ciwhMCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5hdHRyRm9yVmFsdWU/dGhpcy5faW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5fdmFsdWVDaGFuZ2VkRXZlbnQsdGhpcy5fYm91bmRWYWx1ZUNoYW5nZWQpOnRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLHRoaXMuX29uSW5wdXQpLHRoaXMuX2lucHV0RWxlbWVudFZhbHVlJiYiIiE9dGhpcy5faW5wdXRFbGVtZW50VmFsdWU/dGhpcy5faGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGUodGhpcy5faW5wdXRFbGVtZW50KTp0aGlzLl9oYW5kbGVWYWx1ZSh0aGlzLl9pbnB1dEVsZW1lbnQpfSxfb25BZGRvbkF0dGFjaGVkOmZ1bmN0aW9uKHQpe3RoaXMuX2FkZG9uc3x8KHRoaXMuX2FkZG9ucz1bXSk7dmFyIGU9dC50YXJnZXQ7LTE9PT10aGlzLl9hZGRvbnMuaW5kZXhPZihlKSYmKHRoaXMuX2FkZG9ucy5wdXNoKGUpLHRoaXMuaXNBdHRhY2hlZCYmdGhpcy5faGFuZGxlVmFsdWUodGhpcy5faW5wdXRFbGVtZW50KSl9LF9vbkZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Rm9jdXNlZCghMCl9LF9vbkJsdXI6ZnVuY3Rpb24oKXt0aGlzLl9zZXRGb2N1c2VkKCExKSx0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZSh0aGlzLl9pbnB1dEVsZW1lbnQpfSxfb25JbnB1dDpmdW5jdGlvbih0KXt0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZSh0LnRhcmdldCl9LF9vblZhbHVlQ2hhbmdlZDpmdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldDt0aGlzLl9faXNGaXJzdFZhbHVlVXBkYXRlJiYodGhpcy5fX2lzRmlyc3RWYWx1ZVVwZGF0ZT0hMSx2b2lkIDA9PT1lLnZhbHVlfHwiIj09PWUudmFsdWUpfHx0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZSh0LnRhcmdldCl9LF9oYW5kbGVWYWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9pbnB1dEVsZW1lbnRWYWx1ZTt0aGlzLl9pbnB1dEhhc0NvbnRlbnQ9ISghZSYmMCE9PWUmJigibnVtYmVyIiE9PXQudHlwZXx8dC5jaGVja1ZhbGlkaXR5KCkpKSx0aGlzLnVwZGF0ZUFkZG9ucyh7aW5wdXRFbGVtZW50OnQsdmFsdWU6ZSxpbnZhbGlkOnRoaXMuaW52YWxpZH0pfSxfaGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGU6ZnVuY3Rpb24odCl7dmFyIGU7dGhpcy5hdXRvVmFsaWRhdGUmJnQmJihlPXQudmFsaWRhdGU/dC52YWxpZGF0ZSh0aGlzLl9pbnB1dEVsZW1lbnRWYWx1ZSk6dC5jaGVja1ZhbGlkaXR5KCksdGhpcy5pbnZhbGlkPSFlKSx0aGlzLl9oYW5kbGVWYWx1ZSh0KX0sX29uSXJvbklucHV0VmFsaWRhdGU6ZnVuY3Rpb24odCl7dGhpcy5pbnZhbGlkPXRoaXMuX2lucHV0RWxlbWVudC5pbnZhbGlkfSxfaW52YWxpZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hZGRvbnMmJnRoaXMudXBkYXRlQWRkb25zKHtpbnZhbGlkOnRoaXMuaW52YWxpZH0pfSx1cGRhdGVBZGRvbnM6ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MDtlPXRoaXMuX2FkZG9uc1tuXTtuKyspZS51cGRhdGUodCl9LF9jb21wdXRlSW5wdXRDb250ZW50Q2xhc3M6ZnVuY3Rpb24odCxlLG4saSxyKXt2YXIgbz0iaW5wdXQtY29udGVudCI7aWYodClyJiYobys9IiBsYWJlbC1pcy1oaWRkZW4iKSxpJiYobys9IiBpcy1pbnZhbGlkIik7ZWxzZXt2YXIgYT10aGlzLnF1ZXJ5U2VsZWN0b3IoImxhYmVsIik7ZXx8cj8obys9IiBsYWJlbC1pcy1mbG9hdGluZyIsdGhpcy4kLmxhYmVsQW5kSW5wdXRDb250YWluZXIuc3R5bGUucG9zaXRpb249InN0YXRpYyIsaT9vKz0iIGlzLWludmFsaWQiOm4mJihvKz0iIGxhYmVsLWlzLWhpZ2hsaWdodGVkIikpOihhJiYodGhpcy4kLmxhYmVsQW5kSW5wdXRDb250YWluZXIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksaSYmKG8rPSIgaXMtaW52YWxpZCIpKX1yZXR1cm4gbiYmKG8rPSIgZm9jdXNlZCIpLG99LF9jb21wdXRlVW5kZXJsaW5lQ2xhc3M6ZnVuY3Rpb24odCxlKXt2YXIgbj0idW5kZXJsaW5lIjtyZXR1cm4gZT9uKz0iIGlzLWludmFsaWQiOnQmJihuKz0iIGlzLWhpZ2hsaWdodGVkIiksbn0sX2NvbXB1dGVBZGRPbkNvbnRlbnRDbGFzczpmdW5jdGlvbih0LGUpe3ZhciBuPSJhZGQtb24tY29udGVudCI7cmV0dXJuIGU/bis9IiBpcy1pbnZhbGlkIjp0JiYobis9IiBpcy1oaWdobGlnaHRlZCIpLG59fSksCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpScih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKCiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNhcHRpb247CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtZXJyb3I7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6MDsKICAgICAgICByaWdodDowOwogICAgICB9CgogICAgICA6aG9zdChbaW52YWxpZF0pIHsKICAgICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOwogICAgICB9CgogICAgICAjYTExeVdyYXBwZXIgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgOmhvc3QoW2ludmFsaWRdKSAjYTExeVdyYXBwZXIgewogICAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPCEtLQogICAgSWYgdGhlIHBhcGVyLWlucHV0LWVycm9yIGVsZW1lbnQgaXMgZGlyZWN0bHkgcmVmZXJlbmNlZCBieSBhbgogICAgXGBhcmlhLWRlc2NyaWJlZGJ5XGAgYXR0cmlidXRlLCBzdWNoIGFzIHdoZW4gdXNlZCBhcyBhIHBhcGVyLWlucHV0IGFkZC1vbiwKICAgIHRoZW4gYXBwbHlpbmcgXGB2aXNpYmlsaXR5OiBoaWRkZW47XGAgdG8gdGhlIHBhcGVyLWlucHV0LWVycm9yIGVsZW1lbnQgaXRzZWxmCiAgICBkb2VzIG5vdCBoaWRlIHRoZSBlcnJvci4KCiAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlOgogICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL2FjY25hbWUtMS4xLyNtYXBwaW5nX2FkZGl0aW9uYWxfbmRfZGVzY3JpcHRpb24KICAgIC0tPgogICAgPGRpdiBpZD0iYTExeVdyYXBwZXIiPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KYCxpczoicGFwZXItaW5wdXQtZXJyb3IiLGJlaGF2aW9yczpbemFdLHByb3BlcnRpZXM6e2ludmFsaWQ6e3JlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx0eXBlOkJvb2xlYW59fSx1cGRhdGU6ZnVuY3Rpb24odCl7dGhpcy5fc2V0SW52YWxpZCh0LmludmFsaWQpfX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgQmE9e05leHRMYWJlbElEOjEsTmV4dEFkZG9uSUQ6MSxOZXh0SW5wdXRJRDoxfSxIYT17cHJvcGVydGllczp7bGFiZWw6e3R5cGU6U3RyaW5nfSx2YWx1ZTp7bm90aWZ5OiEwLHR5cGU6U3RyaW5nfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbnZhbGlkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxhbGxvd2VkUGF0dGVybjp7dHlwZTpTdHJpbmd9LHR5cGU6e3R5cGU6U3RyaW5nfSxsaXN0Ont0eXBlOlN0cmluZ30scGF0dGVybjp7dHlwZTpTdHJpbmd9LHJlcXVpcmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGVycm9yTWVzc2FnZTp7dHlwZTpTdHJpbmd9LGNoYXJDb3VudGVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vTGFiZWxGbG9hdDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbHdheXNGbG9hdExhYmVsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGF1dG9WYWxpZGF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx2YWxpZGF0b3I6e3R5cGU6U3RyaW5nfSxhdXRvY29tcGxldGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJvZmYifSxhdXRvZm9jdXM6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2F1dG9mb2N1c0NoYW5nZWQifSxpbnB1dG1vZGU6e3R5cGU6U3RyaW5nfSxtaW5sZW5ndGg6e3R5cGU6TnVtYmVyfSxtYXhsZW5ndGg6e3R5cGU6TnVtYmVyfSxtaW46e3R5cGU6U3RyaW5nfSxtYXg6e3R5cGU6U3RyaW5nfSxzdGVwOnt0eXBlOlN0cmluZ30sbmFtZTp7dHlwZTpTdHJpbmd9LHBsYWNlaG9sZGVyOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0scmVhZG9ubHk6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sc2l6ZTp7dHlwZTpOdW1iZXJ9LGF1dG9jYXBpdGFsaXplOnt0eXBlOlN0cmluZyx2YWx1ZToibm9uZSJ9LGF1dG9jb3JyZWN0Ont0eXBlOlN0cmluZyx2YWx1ZToib2ZmIn0sYXV0b3NhdmU6e3R5cGU6U3RyaW5nfSxyZXN1bHRzOnt0eXBlOk51bWJlcn0sYWNjZXB0Ont0eXBlOlN0cmluZ30sbXVsdGlwbGU6e3R5cGU6Qm9vbGVhbn0sX2FyaWFEZXNjcmliZWRCeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9hcmlhTGFiZWxsZWRCeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9pbnB1dElkOnt0eXBlOlN0cmluZyx2YWx1ZToiIn19LGxpc3RlbmVyczp7ImFkZG9uLWF0dGFjaGVkIjoiX29uQWRkb25BdHRhY2hlZCJ9LGtleUJpbmRpbmdzOnsic2hpZnQrdGFiOmtleWRvd24iOiJfb25TaGlmdFRhYkRvd24ifSxob3N0QXR0cmlidXRlczp7dGFiaW5kZXg6MH0sZ2V0IGlucHV0RWxlbWVudCgpe3JldHVybiB0aGlzLiR8fCh0aGlzLiQ9e30pLHRoaXMuJC5pbnB1dHx8KHRoaXMuX2dlbmVyYXRlSW5wdXRJZCgpLHRoaXMuJC5pbnB1dD10aGlzLiQkKCIjIit0aGlzLl9pbnB1dElkKSksdGhpcy4kLmlucHV0fSxnZXQgX2ZvY3VzYWJsZUVsZW1lbnQoKXtyZXR1cm4gdGhpcy5pbnB1dEVsZW1lbnR9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl90eXBlc1RoYXRIYXZlVGV4dD1bImRhdGUiLCJkYXRldGltZSIsImRhdGV0aW1lLWxvY2FsIiwibW9udGgiLCJ0aW1lIiwid2VlayIsImZpbGUiXX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVBcmlhTGFiZWxsZWRCeSgpLCF5ZSYmdGhpcy5pbnB1dEVsZW1lbnQmJi0xIT09dGhpcy5fdHlwZXNUaGF0SGF2ZVRleHQuaW5kZXhPZih0aGlzLmlucHV0RWxlbWVudC50eXBlKSYmKHRoaXMuYWx3YXlzRmxvYXRMYWJlbD0hMCl9LF9hcHBlbmRTdHJpbmdXaXRoU3BhY2U6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD90KyIgIitlOmV9LF9vbkFkZG9uQXR0YWNoZWQ6ZnVuY3Rpb24odCl7dmFyIGU9WWkodCkucm9vdFRhcmdldDtpZihlLmlkKXRoaXMuX2FyaWFEZXNjcmliZWRCeT10aGlzLl9hcHBlbmRTdHJpbmdXaXRoU3BhY2UodGhpcy5fYXJpYURlc2NyaWJlZEJ5LGUuaWQpO2Vsc2V7dmFyIG49InBhcGVyLWlucHV0LWFkZC1vbi0iK0JhLk5leHRBZGRvbklEKys7ZS5pZD1uLHRoaXMuX2FyaWFEZXNjcmliZWRCeT10aGlzLl9hcHBlbmRTdHJpbmdXaXRoU3BhY2UodGhpcy5fYXJpYURlc2NyaWJlZEJ5LG4pfX0sdmFsaWRhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnB1dEVsZW1lbnQudmFsaWRhdGUoKX0sX2ZvY3VzQmx1ckhhbmRsZXI6ZnVuY3Rpb24odCl7cW8uX2ZvY3VzQmx1ckhhbmRsZXIuY2FsbCh0aGlzLHQpLHRoaXMuZm9jdXNlZCYmIXRoaXMuX3NoaWZ0VGFiUHJlc3NlZCYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudCYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudC5mb2N1cygpfSxfb25TaGlmdFRhYkRvd246ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRBdHRyaWJ1dGUoInRhYmluZGV4Iik7dGhpcy5fc2hpZnRUYWJQcmVzc2VkPSEwLHRoaXMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIi0xIiksdGhpcy5hc3luYygoZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLGUpLHRoaXMuX3NoaWZ0VGFiUHJlc3NlZD0hMX0pLDEpfSxfaGFuZGxlQXV0b1ZhbGlkYXRlOmZ1bmN0aW9uKCl7dGhpcy5hdXRvVmFsaWRhdGUmJnRoaXMudmFsaWRhdGUoKX0sdXBkYXRlVmFsdWVBbmRQcmVzZXJ2ZUNhcmV0OmZ1bmN0aW9uKHQpe3RyeXt2YXIgZT10aGlzLmlucHV0RWxlbWVudC5zZWxlY3Rpb25TdGFydDt0aGlzLnZhbHVlPXQsdGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uU3RhcnQ9ZSx0aGlzLmlucHV0RWxlbWVudC5zZWxlY3Rpb25FbmQ9ZX1jYXRjaChlKXt0aGlzLnZhbHVlPXR9fSxfY29tcHV0ZUFsd2F5c0Zsb2F0TGFiZWw6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8dH0sX3VwZGF0ZUFyaWFMYWJlbGxlZEJ5OmZ1bmN0aW9uKCl7dmFyIHQsZT1ZaSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3IoImxhYmVsIik7ZT8oZS5pZD90PWUuaWQ6KHQ9InBhcGVyLWlucHV0LWxhYmVsLSIrQmEuTmV4dExhYmVsSUQrKyxlLmlkPXQpLHRoaXMuX2FyaWFMYWJlbGxlZEJ5PXQpOnRoaXMuX2FyaWFMYWJlbGxlZEJ5PSIifSxfZ2VuZXJhdGVJbnB1dElkOmZ1bmN0aW9uKCl7dGhpcy5faW5wdXRJZCYmIiIhPT10aGlzLl9pbnB1dElkfHwodGhpcy5faW5wdXRJZD0iaW5wdXQtIitCYS5OZXh0SW5wdXRJRCsrKX0sX29uQ2hhbmdlOmZ1bmN0aW9uKHQpe3RoaXMuc2hhZG93Um9vdCYmdGhpcy5maXJlKHQudHlwZSx7c291cmNlRXZlbnQ6dH0se25vZGU6dGhpcyxidWJibGVzOnQuYnViYmxlcyxjYW5jZWxhYmxlOnQuY2FuY2VsYWJsZX0pfSxfYXV0b2ZvY3VzQ2hhbmdlZDpmdW5jdGlvbigpe2lmKHRoaXMuYXV0b2ZvY3VzJiZ0aGlzLl9mb2N1c2FibGVFbGVtZW50KXt2YXIgdD1kb2N1bWVudC5hY3RpdmVFbGVtZW50O3QgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmdCE9PWRvY3VtZW50LmJvZHkmJnQhPT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fHRoaXMuX2ZvY3VzYWJsZUVsZW1lbnQuZm9jdXMoKX19fSxGYT1bcW8sem8sSGFdOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KUnIoe2lzOiJwYXBlci1pbnB1dCIsX3RlbXBsYXRlOl9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtmb2N1c2VkXSkgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBpbnB1dCB7CiAgICAgICAgLyogRmlyZWZveCBzZXRzIGEgbWluLXdpZHRoIG9uIHRoZSBpbnB1dCwgd2hpY2ggY2FuIGNhdXNlIGxheW91dCBpc3N1ZXMgKi8KICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC8qIEluIDEueCwgdGhlIDxpbnB1dD4gaXMgZGlzdHJpYnV0ZWQgdG8gcGFwZXItaW5wdXQtY29udGFpbmVyLCB3aGljaCBzdHlsZXMgaXQuCiAgICAgIEluIDIueCB0aGUgPGlyb24taW5wdXQ+IGlzIGRpc3RyaWJ1dGVkIHRvIHBhcGVyLWlucHV0LWNvbnRhaW5lciwgd2hpY2ggc3R5bGVzCiAgICAgIGl0LCBidXQgaW4gb3JkZXIgZm9yIHRoaXMgdG8gd29yayBjb3JyZWN0bHksIHdlIG5lZWQgdG8gcmVzZXQgc29tZQogICAgICBvZiB0aGUgbmF0aXZlIGlucHV0J3MgcHJvcGVydGllcyB0byBpbmhlcml0IChmcm9tIHRoZSBpcm9uLWlucHV0KSAqLwogICAgICBpcm9uLWlucHV0ID4gaW5wdXQgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1zaGFyZWQtaW5wdXQtc3R5bGU7CiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7CiAgICAgICAgZm9udC1zaXplOiBpbmhlcml0OwogICAgICAgIGxldHRlci1zcGFjaW5nOiBpbmhlcml0OwogICAgICAgIHdvcmQtc3BhY2luZzogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LXNoYWRvdzogaW5oZXJpdDsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICBjdXJzb3I6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIGlucHV0OmRpc2FibGVkIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLAogICAgICBpbnB1dDo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICBpbnB1dDo6LXdlYmtpdC1jbGVhci1idXR0b24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3IgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvcjsKICAgICAgfQoKICAgICAgaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0Oi1tb3otcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICBpbnB1dDo6LW1zLWNsZWFyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbXMtcmV2ZWFsIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtcmV2ZWFsOwogICAgICB9CgogICAgICBpbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGxhYmVsIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaW5wdXQtY29udGFpbmVyIGlkPSJjb250YWluZXIiIG5vLWxhYmVsLWZsb2F0PSJbW25vTGFiZWxGbG9hdF1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsKGFsd2F5c0Zsb2F0TGFiZWwscGxhY2Vob2xkZXIpXV0iIGF1dG8tdmFsaWRhdGUkPSJbW2F1dG9WYWxpZGF0ZV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaW52YWxpZD0iW1tpbnZhbGlkXV0iPgoKICAgICAgPHNsb3QgbmFtZT0icHJlZml4IiBzbG90PSJwcmVmaXgiPjwvc2xvdD4KCiAgICAgIDxsYWJlbCBoaWRkZW4kPSJbWyFsYWJlbF1dIiBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9yJD0iW1tfaW5wdXRJZF1dIiBzbG90PSJsYWJlbCI+W1tsYWJlbF1dPC9sYWJlbD4KCiAgICAgIDwhLS0gTmVlZCB0byBiaW5kIG1heGxlbmd0aCBzbyB0aGF0IHRoZSBwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgd29ya3MgY29ycmVjdGx5IC0tPgogICAgICA8aXJvbi1pbnB1dCBiaW5kLXZhbHVlPSJ7e3ZhbHVlfX0iIHNsb3Q9ImlucHV0IiBjbGFzcz0iaW5wdXQtZWxlbWVudCIgaWQkPSJbW19pbnB1dElkXV0iIG1heGxlbmd0aCQ9IltbbWF4bGVuZ3RoXV0iIGFsbG93ZWQtcGF0dGVybj0iW1thbGxvd2VkUGF0dGVybl1dIiBpbnZhbGlkPSJ7e2ludmFsaWR9fSIgdmFsaWRhdG9yPSJbW3ZhbGlkYXRvcl1dIj4KICAgICAgICA8aW5wdXQgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdGl0bGUkPSJbW3RpdGxlXV0iIHR5cGUkPSJbW3R5cGVdXSIgcGF0dGVybiQ9IltbcGF0dGVybl1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgbWluJD0iW1ttaW5dXSIgbWF4JD0iW1ttYXhdXSIgc3RlcCQ9Iltbc3RlcF1dIiBuYW1lJD0iW1tuYW1lXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgbGlzdCQ9IltbbGlzdF1dIiBzaXplJD0iW1tzaXplXV0iIGF1dG9jYXBpdGFsaXplJD0iW1thdXRvY2FwaXRhbGl6ZV1dIiBhdXRvY29ycmVjdCQ9IltbYXV0b2NvcnJlY3RdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiIHRhYmluZGV4JD0iW1t0YWJJbmRleF1dIiBhdXRvc2F2ZSQ9IltbYXV0b3NhdmVdXSIgcmVzdWx0cyQ9IltbcmVzdWx0c11dIiBhY2NlcHQkPSJbW2FjY2VwdF1dIiBtdWx0aXBsZSQ9IltbbXVsdGlwbGVdXSIgcm9sZSQ9IltbaW5wdXRSb2xlXV0iIGFyaWEtaGFzcG9wdXAkPSJbW2lucHV0QXJpYUhhc3BvcHVwXV0iPgogICAgICA8L2lyb24taW5wdXQ+CgogICAgICA8c2xvdCBuYW1lPSJzdWZmaXgiIHNsb3Q9InN1ZmZpeCI+PC9zbG90PgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2Vycm9yTWVzc2FnZV1dIj4KICAgICAgICA8cGFwZXItaW5wdXQtZXJyb3IgYXJpYS1saXZlPSJhc3NlcnRpdmUiIHNsb3Q9ImFkZC1vbiI+W1tlcnJvck1lc3NhZ2VdXTwvcGFwZXItaW5wdXQtZXJyb3I+CiAgICAgIDwvdGVtcGxhdGU+CgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbY2hhckNvdW50ZXJdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWNoYXItY291bnRlciBzbG90PSJhZGQtb24iPjwvcGFwZXItaW5wdXQtY2hhci1jb3VudGVyPgogICAgICA8L3RlbXBsYXRlPgoKICAgIDwvcGFwZXItaW5wdXQtY29udGFpbmVyPgogIGAsYmVoYXZpb3JzOltGYSxyYV0scHJvcGVydGllczp7dmFsdWU6e3R5cGU6U3RyaW5nfSxpbnB1dFJvbGU6e3R5cGU6U3RyaW5nLHZhbHVlOnZvaWQgMH0saW5wdXRBcmlhSGFzcG9wdXA6e3R5cGU6U3RyaW5nLHZhbHVlOnZvaWQgMH19LGdldCBfZm9jdXNhYmxlRWxlbWVudCgpe3JldHVybiB0aGlzLmlucHV0RWxlbWVudC5faW5wdXRFbGVtZW50fSxsaXN0ZW5lcnM6eyJpcm9uLWlucHV0LXJlYWR5IjoiX29uSXJvbklucHV0UmVhZHkifSxfb25Jcm9uSW5wdXRSZWFkeTpmdW5jdGlvbigpe3RoaXMuJC5uYXRpdmVJbnB1dHx8KHRoaXMuJC5uYXRpdmVJbnB1dD10aGlzLiQkKCJpbnB1dCIpKSx0aGlzLmlucHV0RWxlbWVudCYmLTEhPT10aGlzLl90eXBlc1RoYXRIYXZlVGV4dC5pbmRleE9mKHRoaXMuJC5uYXRpdmVJbnB1dC50eXBlKSYmKHRoaXMuYWx3YXlzRmxvYXRMYWJlbD0hMCksdGhpcy5pbnB1dEVsZW1lbnQuYmluZFZhbHVlJiZ0aGlzLiQuY29udGFpbmVyLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZSh0aGlzLmlucHV0RWxlbWVudCl9fSksCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpScih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CgogICAgICAjY29udGVudFdyYXBwZXIgOjpzbG90dGVkKCopIHsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQoKICAgICAgI2NvbnRlbnRXcmFwcGVyLmFuaW1hdGluZyA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iY29udGVudFdyYXBwZXIiPgogICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgPC9kaXY+CmAsaXM6Imlyb24tZHJvcGRvd24iLGJlaGF2aW9yczpbcW8sem8sa2EsUmFdLHByb3BlcnRpZXM6e2hvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sdmVydGljYWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6InRvcCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxvcGVuQW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdH0sY2xvc2VBbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0fSxmb2N1c1RhcmdldDp7dHlwZTpPYmplY3R9LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbGxvd091dHNpZGVTY3JvbGw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2FsbG93T3V0c2lkZVNjcm9sbENoYW5nZWQifX0sbGlzdGVuZXJzOnsibmVvbi1hbmltYXRpb24tZmluaXNoIjoiX29uTmVvbkFuaW1hdGlvbkZpbmlzaCJ9LG9ic2VydmVyczpbIl91cGRhdGVPdmVybGF5UG9zaXRpb24ocG9zaXRpb25UYXJnZXQsIHZlcnRpY2FsQWxpZ24sIGhvcml6b250YWxBbGlnbiwgdmVydGljYWxPZmZzZXQsIGhvcml6b250YWxPZmZzZXQpIl0sZ2V0IGNvbnRhaW5lZEVsZW1lbnQoKXtmb3IodmFyIHQ9WWkodGhpcy4kLmNvbnRlbnQpLmdldERpc3RyaWJ1dGVkTm9kZXMoKSxlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKWlmKHRbZV0ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4gdFtlXX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbEFjdGlvbnx8KHRoaXMuc2Nyb2xsQWN0aW9uPXRoaXMuYWxsb3dPdXRzaWRlU2Nyb2xsPyJyZWZpdCI6ImxvY2siKSx0aGlzLl9yZWFkaWVkPSEwfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2l6aW5nVGFyZ2V0JiZ0aGlzLnNpemluZ1RhcmdldCE9PXRoaXN8fCh0aGlzLnNpemluZ1RhcmdldD10aGlzLmNvbnRhaW5lZEVsZW1lbnR8fHRoaXMpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuY2FuY2VsQW5pbWF0aW9uKCl9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQmJnRoaXMuZGlzYWJsZWQ/dGhpcy5jYW5jZWwoKToodGhpcy5jYW5jZWxBbmltYXRpb24oKSx0aGlzLl91cGRhdGVBbmltYXRpb25Db25maWcoKSxDYS5fb3BlbmVkQ2hhbmdlZC5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxfcmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7IXRoaXMubm9BbmltYXRpb25zJiZ0aGlzLmFuaW1hdGlvbkNvbmZpZy5vcGVuPyh0aGlzLiQuY29udGVudFdyYXBwZXIuY2xhc3NMaXN0LmFkZCgiYW5pbWF0aW5nIiksdGhpcy5wbGF5QW5pbWF0aW9uKCJvcGVuIikpOkNhLl9yZW5kZXJPcGVuZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfcmVuZGVyQ2xvc2VkOmZ1bmN0aW9uKCl7IXRoaXMubm9BbmltYXRpb25zJiZ0aGlzLmFuaW1hdGlvbkNvbmZpZy5jbG9zZT8odGhpcy4kLmNvbnRlbnRXcmFwcGVyLmNsYXNzTGlzdC5hZGQoImFuaW1hdGluZyIpLHRoaXMucGxheUFuaW1hdGlvbigiY2xvc2UiKSk6Q2EuX3JlbmRlckNsb3NlZC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9vbk5lb25BbmltYXRpb25GaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLiQuY29udGVudFdyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSgiYW5pbWF0aW5nIiksdGhpcy5vcGVuZWQ/dGhpcy5fZmluaXNoUmVuZGVyT3BlbmVkKCk6dGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCl9LF91cGRhdGVBbmltYXRpb25Db25maWc6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5jb250YWluZWRFbGVtZW50LGU9W10uY29uY2F0KHRoaXMub3BlbkFuaW1hdGlvbkNvbmZpZ3x8W10pLmNvbmNhdCh0aGlzLmNsb3NlQW5pbWF0aW9uQ29uZmlnfHxbXSksbj0wO248ZS5sZW5ndGg7bisrKWVbbl0ubm9kZT10O3RoaXMuYW5pbWF0aW9uQ29uZmlnPXtvcGVuOnRoaXMub3BlbkFuaW1hdGlvbkNvbmZpZyxjbG9zZTp0aGlzLmNsb3NlQW5pbWF0aW9uQ29uZmlnfX0sX3VwZGF0ZU92ZXJsYXlQb3NpdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5ub3RpZnlSZXNpemUoKX0sX2FsbG93T3V0c2lkZVNjcm9sbENoYW5nZWQ6ZnVuY3Rpb24odCl7dGhpcy5fcmVhZGllZCYmKHQ/dGhpcy5zY3JvbGxBY3Rpb24mJiJsb2NrIiE9PXRoaXMuc2Nyb2xsQWN0aW9ufHwodGhpcy5zY3JvbGxBY3Rpb249InJlZml0Iik6dGhpcy5zY3JvbGxBY3Rpb249ImxvY2siKX0sX2FwcGx5Rm9jdXM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmZvY3VzVGFyZ2V0fHx0aGlzLmNvbnRhaW5lZEVsZW1lbnQ7dCYmdGhpcy5vcGVuZWQmJiF0aGlzLm5vQXV0b0ZvY3VzP3QuZm9jdXMoKTpDYS5fYXBwbHlGb2N1cy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBWYT17cHJvcGVydGllczp7YW5pbWF0aW9uVGltaW5nOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybntkdXJhdGlvbjo1MDAsZWFzaW5nOiJjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpIixmaWxsOiJib3RoIn19fX0saXNOZW9uQW5pbWF0aW9uOiEwLGNyZWF0ZWQ6ZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LmFuaW1hdGV8fGNvbnNvbGUud2FybigiTm8gd2ViIGFuaW1hdGlvbnMgZGV0ZWN0ZWQuIFRoaXMgZWxlbWVudCB3aWxsIG5vdCBmdW5jdGlvbiB3aXRob3V0IGEgd2ViIGFuaW1hdGlvbnMgcG9seWZpbGwuIil9LHRpbWluZ0Zyb21Db25maWc6ZnVuY3Rpb24odCl7aWYodC50aW1pbmcpZm9yKHZhciBlIGluIHQudGltaW5nKXRoaXMuYW5pbWF0aW9uVGltaW5nW2VdPXQudGltaW5nW2VdO3JldHVybiB0aGlzLmFuaW1hdGlvblRpbWluZ30sc2V0UHJlZml4ZWRQcm9wZXJ0eTpmdW5jdGlvbih0LGUsbil7Zm9yKHZhciBpLHI9e3RyYW5zZm9ybTpbIndlYmtpdFRyYW5zZm9ybSJdLHRyYW5zZm9ybU9yaWdpbjpbIm1velRyYW5zZm9ybU9yaWdpbiIsIndlYmtpdFRyYW5zZm9ybU9yaWdpbiJdfVtlXSxvPTA7aT1yW29dO28rKyl0LnN0eWxlW2ldPW47dC5zdHlsZVtlXT1ufSxjb21wbGV0ZTpmdW5jdGlvbih0KXt9fTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovUnIoe2lzOiJmYWRlLWluLWFuaW1hdGlvbiIsYmVoYXZpb3JzOltWYV0sY29uZmlndXJlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KHQubm9kZSxbe29wYWNpdHk6IjAifSx7b3BhY2l0eToiMSJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcodCkpLHRoaXMuX2VmZmVjdH19KSwKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovClJyKHtpczoiZmFkZS1vdXQtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1ZhXSxjb25maWd1cmU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2VmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QodC5ub2RlLFt7b3BhY2l0eToiMSJ9LHtvcGFjaXR5OiIwIn1dLHRoaXMudGltaW5nRnJvbUNvbmZpZyh0KSksdGhpcy5fZWZmZWN0fX0pLAovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KUnIoe2lzOiJwYXBlci1tZW51LWdyb3ctaGVpZ2h0LWFuaW1hdGlvbiIsX3RlbXBsYXRlOm51bGwsYmVoYXZpb3JzOltWYV0sY29uZmlndXJlOmZ1bmN0aW9uKHQpe3ZhciBlPXQubm9kZSxuPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O3JldHVybiB0aGlzLl9lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KGUsW3toZWlnaHQ6bi8yKyJweCJ9LHtoZWlnaHQ6bisicHgifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKHQpKSx0aGlzLl9lZmZlY3R9fSksUnIoe2lzOiJwYXBlci1tZW51LWdyb3ctd2lkdGgtYW5pbWF0aW9uIixfdGVtcGxhdGU6bnVsbCxiZWhhdmlvcnM6W1ZhXSxjb25maWd1cmU6ZnVuY3Rpb24odCl7dmFyIGU9dC5ub2RlLG49ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChlLFt7d2lkdGg6bi8yKyJweCJ9LHt3aWR0aDpuKyJweCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcodCkpLHRoaXMuX2VmZmVjdH19KSxScih7aXM6InBhcGVyLW1lbnUtc2hyaW5rLXdpZHRoLWFuaW1hdGlvbiIsX3RlbXBsYXRlOm51bGwsYmVoYXZpb3JzOltWYV0sY29uZmlndXJlOmZ1bmN0aW9uKHQpe3ZhciBlPXQubm9kZSxuPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7cmV0dXJuIHRoaXMuX2VmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QoZSxbe3dpZHRoOm4rInB4In0se3dpZHRoOm4tbi8yMCsicHgifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKHQpKSx0aGlzLl9lZmZlY3R9fSksUnIoe2lzOiJwYXBlci1tZW51LXNocmluay1oZWlnaHQtYW5pbWF0aW9uIixfdGVtcGxhdGU6bnVsbCxiZWhhdmlvcnM6W1ZhXSxjb25maWd1cmU6ZnVuY3Rpb24odCl7dmFyIGU9dC5ub2RlLG49ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7cmV0dXJuIHRoaXMuc2V0UHJlZml4ZWRQcm9wZXJ0eShlLCJ0cmFuc2Zvcm1PcmlnaW4iLCIwIDAiKSx0aGlzLl9lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KGUsW3toZWlnaHQ6bisicHgiLHRyYW5zZm9ybToidHJhbnNsYXRlWSgwKSJ9LHtoZWlnaHQ6bi8yKyJweCIsdHJhbnNmb3JtOiJ0cmFuc2xhdGVZKC0yMHB4KSJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcodCkpLHRoaXMuX2VmZmVjdH19KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCnZhciBVYT17QU5JTUFUSU9OX0NVQklDX0JFWklFUjoiY3ViaWMtYmV6aWVyKC4zLC45NSwuNSwxKSIsTUFYX0FOSU1BVElPTl9USU1FX01TOjQwMH07Y29uc3QgamE9UnIoe190ZW1wbGF0ZTpfZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgY3Vyc29yOiBhdXRvOwogICAgICAgIGNvbG9yOiB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWVudS1idXR0b24tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlyb24tZHJvcGRvd24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWRyb3Bkb3duOwogICAgICB9CgogICAgICAuZHJvcGRvd24tY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CgogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItbWVudS1idXR0b24tZHJvcGRvd24tYmFja2dyb3VuZCwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWNvbnRlbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbC1hbGlnbj0idG9wIl0pIC5kcm9wZG93bi1jb250ZW50IHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICAgIG1hcmdpbi10b3A6IC0xMHB4OwogICAgICAgIHRvcDogMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZlcnRpY2FsLWFsaWduPSJib3R0b20iXSkgLmRyb3Bkb3duLWNvbnRlbnQgewogICAgICAgIGJvdHRvbTogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAtMTBweDsKICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICB9CgogICAgICAjdHJpZ2dlciB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InRyaWdnZXIiIG9uLXRhcD0idG9nZ2xlIj4KICAgICAgPHNsb3QgbmFtZT0iZHJvcGRvd24tdHJpZ2dlciI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGlyb24tZHJvcGRvd24gaWQ9ImRyb3Bkb3duIiBvcGVuZWQ9Int7b3BlbmVkfX0iIGhvcml6b250YWwtYWxpZ249IltbaG9yaXpvbnRhbEFsaWduXV0iIHZlcnRpY2FsLWFsaWduPSJbW3ZlcnRpY2FsQWxpZ25dXSIgZHluYW1pYy1hbGlnbj0iW1tkeW5hbWljQWxpZ25dXSIgaG9yaXpvbnRhbC1vZmZzZXQ9IltbaG9yaXpvbnRhbE9mZnNldF1dIiB2ZXJ0aWNhbC1vZmZzZXQ9IltbdmVydGljYWxPZmZzZXRdXSIgbm8tb3ZlcmxhcD0iW1tub092ZXJsYXBdXSIgb3Blbi1hbmltYXRpb24tY29uZmlnPSJbW29wZW5BbmltYXRpb25Db25maWddXSIgY2xvc2UtYW5pbWF0aW9uLWNvbmZpZz0iW1tjbG9zZUFuaW1hdGlvbkNvbmZpZ11dIiBuby1hbmltYXRpb25zPSJbW25vQW5pbWF0aW9uc11dIiBmb2N1cy10YXJnZXQ9IltbX2Ryb3Bkb3duQ29udGVudF1dIiBhbGxvdy1vdXRzaWRlLXNjcm9sbD0iW1thbGxvd091dHNpZGVTY3JvbGxdXSIgcmVzdG9yZS1mb2N1cy1vbi1jbG9zZT0iW1tyZXN0b3JlRm9jdXNPbkNsb3NlXV0iIG9uLWlyb24tb3ZlcmxheS1jYW5jZWxlZD0iX19vbklyb25PdmVybGF5Q2FuY2VsZWQiIGV4cGFuZC1zaXppbmctdGFyZ2V0LWZvci1zY3JvbGxiYXJzPSJbW2V4cGFuZFNpemluZ1RhcmdldEZvclNjcm9sbGJhcnNdXSI+CiAgICAgIDxkaXYgc2xvdD0iZHJvcGRvd24tY29udGVudCIgY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgIDxzbG90IGlkPSJjb250ZW50IiBuYW1lPSJkcm9wZG93bi1jb250ZW50Ij48L3Nsb3Q+CiAgICAgIDwvZGl2PgogICAgPC9pcm9uLWRyb3Bkb3duPgpgLGlzOiJwYXBlci1tZW51LWJ1dHRvbiIsYmVoYXZpb3JzOlt6byxxb10scHJvcGVydGllczp7b3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwLG9ic2VydmVyOiJfb3BlbmVkQ2hhbmdlZCJ9LGhvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sdmVydGljYWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6InRvcCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxkeW5hbWljQWxpZ246e3R5cGU6Qm9vbGVhbn0saG9yaXpvbnRhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LHZlcnRpY2FsT2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sbm9PdmVybGFwOnt0eXBlOkJvb2xlYW59LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpZ25vcmVTZWxlY3Q6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sY2xvc2VPbkFjdGl2YXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG9wZW5BbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW3tuYW1lOiJmYWRlLWluLWFuaW1hdGlvbiIsdGltaW5nOntkZWxheToxMDAsZHVyYXRpb246MjAwfX0se25hbWU6InBhcGVyLW1lbnUtZ3Jvdy13aWR0aC1hbmltYXRpb24iLHRpbWluZzp7ZGVsYXk6MTAwLGR1cmF0aW9uOjE1MCxlYXNpbmc6VWEuQU5JTUFUSU9OX0NVQklDX0JFWklFUn19LHtuYW1lOiJwYXBlci1tZW51LWdyb3ctaGVpZ2h0LWFuaW1hdGlvbiIsdGltaW5nOntkZWxheToxMDAsZHVyYXRpb246Mjc1LGVhc2luZzpVYS5BTklNQVRJT05fQ1VCSUNfQkVaSUVSfX1dfX0sY2xvc2VBbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW3tuYW1lOiJmYWRlLW91dC1hbmltYXRpb24iLHRpbWluZzp7ZHVyYXRpb246MTUwfX0se25hbWU6InBhcGVyLW1lbnUtc2hyaW5rLXdpZHRoLWFuaW1hdGlvbiIsdGltaW5nOntkZWxheToxMDAsZHVyYXRpb246NTAsZWFzaW5nOlVhLkFOSU1BVElPTl9DVUJJQ19CRVpJRVJ9fSx7bmFtZToicGFwZXItbWVudS1zaHJpbmstaGVpZ2h0LWFuaW1hdGlvbiIsdGltaW5nOntkdXJhdGlvbjoyMDAsZWFzaW5nOiJlYXNlLWluIn19XX19LGFsbG93T3V0c2lkZVNjcm9sbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxyZXN0b3JlRm9jdXNPbkNsb3NlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LGV4cGFuZFNpemluZ1RhcmdldEZvclNjcm9sbGJhcnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2Ryb3Bkb3duQ29udGVudDp7dHlwZTpPYmplY3R9fSxob3N0QXR0cmlidXRlczp7cm9sZToiZ3JvdXAiLCJhcmlhLWhhc3BvcHVwIjoidHJ1ZSJ9LGxpc3RlbmVyczp7Imlyb24tYWN0aXZhdGUiOiJfb25Jcm9uQWN0aXZhdGUiLCJpcm9uLXNlbGVjdCI6Il9vbklyb25TZWxlY3QifSxnZXQgY29udGVudEVsZW1lbnQoKXtmb3IodmFyIHQ9WWkodGhpcy4kLmNvbnRlbnQpLmdldERpc3RyaWJ1dGVkTm9kZXMoKSxlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKWlmKHRbZV0ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4gdFtlXX0sdG9nZ2xlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ/dGhpcy5jbG9zZSgpOnRoaXMub3BlbigpfSxvcGVuOmZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlZHx8dGhpcy4kLmRyb3Bkb3duLm9wZW4oKX0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLiQuZHJvcGRvd24uY2xvc2UoKX0sX29uSXJvblNlbGVjdDpmdW5jdGlvbih0KXt0aGlzLmlnbm9yZVNlbGVjdHx8dGhpcy5jbG9zZSgpfSxfb25Jcm9uQWN0aXZhdGU6ZnVuY3Rpb24odCl7dGhpcy5jbG9zZU9uQWN0aXZhdGUmJnRoaXMuY2xvc2UoKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24odCxlKXt0Pyh0aGlzLl9kcm9wZG93bkNvbnRlbnQ9dGhpcy5jb250ZW50RWxlbWVudCx0aGlzLmZpcmUoInBhcGVyLWRyb3Bkb3duLW9wZW4iKSk6bnVsbCE9ZSYmdGhpcy5maXJlKCJwYXBlci1kcm9wZG93bi1jbG9zZSIpfSxfZGlzYWJsZWRDaGFuZ2VkOmZ1bmN0aW9uKHQpe3FvLl9kaXNhYmxlZENoYW5nZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQmJnRoaXMub3BlbmVkJiZ0aGlzLmNsb3NlKCl9LF9fb25Jcm9uT3ZlcmxheUNhbmNlbGVkOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuJC50cmlnZ2VyO1lpKHQuZGV0YWlsKS5wYXRoLmluZGV4T2YoZSk+LTEmJnQucHJldmVudERlZmF1bHQoKX19KTtPYmplY3Qua2V5cyhVYSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7amFbdF09VWFbdF19KSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNiBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBHYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpO0dhLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJkaXNwbGF5OiBub25lOyIpLEdhLmlubmVySFRNTD0nPGlyb24taWNvbnNldC1zdmcgbmFtZT0icGFwZXItZHJvcGRvd24tbWVudSIgc2l6ZT0iMjQiPlxuPHN2Zz48ZGVmcz5cbjxnIGlkPSJhcnJvdy1kcm9wLWRvd24iPjxwYXRoIGQ9Ik03IDEwbDUgNSA1LTV6Ij48L3BhdGg+PC9nPlxuPC9kZWZzPjwvc3ZnPlxuPC9pcm9uLWljb25zZXQtc3ZnPicsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChHYS5jb250ZW50KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IFdhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7V2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsImRpc3BsYXk6IG5vbmU7IiksV2EuaW5uZXJIVE1MPSc8ZG9tLW1vZHVsZSBpZD0icGFwZXItZHJvcGRvd24tbWVudS1zaGFyZWQtc3R5bGVzIj5cbiAgPHRlbXBsYXRlPlxuICAgIDxzdHlsZT5cbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG5cbiAgICAgICAgLyogTk9URShjZGF0YSk6IEJvdGggdmFsdWVzIGFyZSBuZWVkZWQsIHNpbmNlIHNvbWUgcGhvbmVzIHJlcXVpcmUgdGhlXG4gICAgICAgICAqIHZhbHVlIHRvIGJlIGB0cmFuc3BhcmVudGAuXG4gICAgICAgICAqL1xuICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwwLDAsMCk7XG4gICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7XG5cbiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHtcbiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB9O1xuXG4gICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnU7XG4gICAgICB9XG5cbiAgICAgIC8qIHBhcGVyLWRyb3Bkb3duLW1lbnUgYW5kIHBhcGVyLWRyb3Bkb3duLW1lbnUtbGlnaHQgYm90aCBkZWxlZ2F0ZSBmb2N1c1xuICAgICAgICogdG8gb3RoZXIgaW50ZXJuYWwgZWxlbWVudHMgd2hpY2ggbWFuYWdlIGZvY3VzIHN0eWxpbmcuICovXG4gICAgICA6aG9zdCg6Zm9jdXMpIHtcbiAgICAgICAgb3V0bGluZTogbm9uZTtcbiAgICAgIH1cblxuICAgICAgOmhvc3QoOmRpcihydGwpKSB7XG4gICAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuXG4gICAgICAgIEBhcHBseSgtLXBhcGVyLWRyb3Bkb3duLW1lbnUpO1xuICAgICAgfVxuXG4gICAgICA6aG9zdChbZGlzYWJsZWRdKSB7XG4gICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtZGlzYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgIDpob3N0KFtub2lua10pIHBhcGVyLXJpcHBsZSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG5cbiAgICAgIDpob3N0KFtuby1sYWJlbC1mbG9hdF0pIHBhcGVyLXJpcHBsZSB7XG4gICAgICAgIHRvcDogOHB4O1xuICAgICAgfVxuXG4gICAgICBwYXBlci1yaXBwbGUge1xuICAgICAgICB0b3A6IDEycHg7XG4gICAgICAgIGxlZnQ6IDBweDtcbiAgICAgICAgYm90dG9tOiA4cHg7XG4gICAgICAgIHJpZ2h0OiAwcHg7XG5cbiAgICAgICAgQGFwcGx5IC0tcGFwZXItZHJvcGRvd24tbWVudS1yaXBwbGU7XG4gICAgICB9XG5cbiAgICAgIHBhcGVyLW1lbnUtYnV0dG9uIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBhZGRpbmc6IDA7XG5cbiAgICAgICAgQGFwcGx5IC0tcGFwZXItZHJvcGRvd24tbWVudS1idXR0b247XG4gICAgICB9XG5cbiAgICAgIHBhcGVyLWlucHV0IHtcbiAgICAgICAgQGFwcGx5IC0tcGFwZXItZHJvcGRvd24tbWVudS1pbnB1dDtcbiAgICAgIH1cblxuICAgICAgaXJvbi1pY29uIHtcbiAgICAgICAgY29sb3I6IHZhcigtLWRpc2FibGVkLXRleHQtY29sb3IpO1xuXG4gICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtaWNvbjtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICA8L3RlbXBsYXRlPlxuPC9kb20tbW9kdWxlPicsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChXYS5jb250ZW50KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IHFhPWVyKEhUTUxFbGVtZW50KTtScih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLWRyb3Bkb3duLW1lbnUtc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KCiAgICA8cGFwZXItbWVudS1idXR0b24gaWQ9Im1lbnVCdXR0b24iIHZlcnRpY2FsLWFsaWduPSJbW3ZlcnRpY2FsQWxpZ25dXSIgaG9yaXpvbnRhbC1hbGlnbj0iW1tob3Jpem9udGFsQWxpZ25dXSIgZHluYW1pYy1hbGlnbj0iW1tkeW5hbWljQWxpZ25dXSIgdmVydGljYWwtb2Zmc2V0PSJbW19jb21wdXRlTWVudVZlcnRpY2FsT2Zmc2V0KG5vTGFiZWxGbG9hdCwgdmVydGljYWxPZmZzZXQpXV0iIGRpc2FibGVkPSJbW2Rpc2FibGVkXV0iIG5vLWFuaW1hdGlvbnM9Iltbbm9BbmltYXRpb25zXV0iIG9uLWlyb24tc2VsZWN0PSJfb25Jcm9uU2VsZWN0IiBvbi1pcm9uLWRlc2VsZWN0PSJfb25Jcm9uRGVzZWxlY3QiIG9wZW5lZD0ie3tvcGVuZWR9fSIgY2xvc2Utb24tYWN0aXZhdGUgYWxsb3ctb3V0c2lkZS1zY3JvbGw9IltbYWxsb3dPdXRzaWRlU2Nyb2xsXV0iIHJlc3RvcmUtZm9jdXMtb24tY2xvc2U9IltbcmVzdG9yZUZvY3VzT25DbG9zZV1dIiBleHBhbmQtc2l6aW5nLXRhcmdldC1mb3Itc2Nyb2xsYmFycz0iW1tleHBhbmRTaXppbmdUYXJnZXRGb3JTY3JvbGxiYXJzXV0iPgogICAgICA8IS0tIHN1cHBvcnQgaHlicmlkIG1vZGU6IHVzZXIgbWlnaHQgYmUgdXNpbmcgcGFwZXItbWVudS1idXR0b24gMS54IHdoaWNoIGRpc3RyaWJ1dGVzIHZpYSA8Y29udGVudD4gLS0+CiAgICAgIDxkaXYgY2xhc3M9ImRyb3Bkb3duLXRyaWdnZXIiIHNsb3Q9ImRyb3Bkb3duLXRyaWdnZXIiPgogICAgICAgIDxwYXBlci1yaXBwbGU+PC9wYXBlci1yaXBwbGU+CiAgICAgICAgPCEtLSBwYXBlci1pbnB1dCBoYXMgdHlwZT0idGV4dCIgZm9yIGExMXksIGRvIG5vdCByZW1vdmUgLS0+CiAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJpbnB1dCIgdHlwZT0idGV4dCIgaW52YWxpZD0iW1tpbnZhbGlkXV0iIHJlYWRvbmx5IGRpc2FibGVkPSJbW2Rpc2FibGVkXV0iIHZhbHVlPSJbW3ZhbHVlXV0iIHBsYWNlaG9sZGVyPSJbW3BsYWNlaG9sZGVyXV0iIGVycm9yLW1lc3NhZ2U9IltbZXJyb3JNZXNzYWdlXV0iIGFsd2F5cy1mbG9hdC1sYWJlbD0iW1thbHdheXNGbG9hdExhYmVsXV0iIG5vLWxhYmVsLWZsb2F0PSJbW25vTGFiZWxGbG9hdF1dIiBsYWJlbD0iW1tsYWJlbF1dIiBpbnB1dC1yb2xlPSJidXR0b24iIGlucHV0LWFyaWEtaGFzcG9wdXA9Imxpc3Rib3giIGF1dG9jb21wbGV0ZT0ib2ZmIj4KICAgICAgICAgIDwhLS0gc3VwcG9ydCBoeWJyaWQgbW9kZTogdXNlciBtaWdodCBiZSB1c2luZyBwYXBlci1pbnB1dCAxLnggd2hpY2ggZGlzdHJpYnV0ZXMgdmlhIDxjb250ZW50PiAtLT4KICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0icGFwZXItZHJvcGRvd24tbWVudTphcnJvdy1kcm9wLWRvd24iIHN1ZmZpeCBzbG90PSJzdWZmaXgiPjwvaXJvbi1pY29uPgogICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgIDwvZGl2PgogICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgPC9wYXBlci1tZW51LWJ1dHRvbj4KYCxpczoicGFwZXItZHJvcGRvd24tbWVudSIsYmVoYXZpb3JzOltYbyxxbyxyYSxhYV0scHJvcGVydGllczp7c2VsZWN0ZWRJdGVtTGFiZWw6e3R5cGU6U3RyaW5nLG5vdGlmeTohMCxyZWFkT25seTohMH0sc2VsZWN0ZWRJdGVtOnt0eXBlOk9iamVjdCxub3RpZnk6ITAscmVhZE9ubHk6ITB9LHZhbHVlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LGxhYmVsOnt0eXBlOlN0cmluZ30scGxhY2Vob2xkZXI6e3R5cGU6U3RyaW5nfSxlcnJvck1lc3NhZ2U6e3R5cGU6U3RyaW5nfSxvcGVuZWQ6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAsdmFsdWU6ITEsb2JzZXJ2ZXI6Il9vcGVuZWRDaGFuZ2VkIn0sYWxsb3dPdXRzaWRlU2Nyb2xsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vTGFiZWxGbG9hdDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sYWx3YXlzRmxvYXRMYWJlbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0FuaW1hdGlvbnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0saG9yaXpvbnRhbEFsaWduOnt0eXBlOlN0cmluZyx2YWx1ZToicmlnaHQifSx2ZXJ0aWNhbEFsaWduOnt0eXBlOlN0cmluZyx2YWx1ZToidG9wIn0sdmVydGljYWxPZmZzZXQ6TnVtYmVyLGR5bmFtaWNBbGlnbjp7dHlwZTpCb29sZWFufSxyZXN0b3JlRm9jdXNPbkNsb3NlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LGV4cGFuZFNpemluZ1RhcmdldEZvclNjcm9sbGJhcnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LGxpc3RlbmVyczp7dGFwOiJfb25UYXAifSxrZXlCaW5kaW5nczp7InVwIGRvd24iOiJvcGVuIixlc2M6ImNsb3NlIn0sb2JzZXJ2ZXJzOlsiX3NlbGVjdGVkSXRlbUNoYW5nZWQoc2VsZWN0ZWRJdGVtKSJdLF9hdHRhY2hEb20odCl7Y29uc3QgZT1ZKHRoaXMpO3JldHVybiBlLmF0dGFjaFNoYWRvdyh7bW9kZToib3BlbiIsZGVsZWdhdGVzRm9jdXM6ITAsc2hhZHlVcGdyYWRlRnJhZ21lbnQ6dH0pLGUuc2hhZG93Um9vdC5hcHBlbmRDaGlsZCh0KSxxYS5wcm90b3R5cGUuX2F0dGFjaERvbS5jYWxsKHRoaXMsdCl9LGZvY3VzKCl7dGhpcy4kLmlucHV0Ll9mb2N1c2FibGVFbGVtZW50LmZvY3VzKCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZW50RWxlbWVudDt0JiZ0LnNlbGVjdGVkSXRlbSYmdGhpcy5fc2V0U2VsZWN0ZWRJdGVtKHQuc2VsZWN0ZWRJdGVtKX0sZ2V0IGNvbnRlbnRFbGVtZW50KCl7Zm9yKHZhciB0PVlpKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCksZT0wLG49dC5sZW5ndGg7ZTxuO2UrKylpZih0W2VdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIHRbZV19LG9wZW46ZnVuY3Rpb24oKXt0aGlzLiQubWVudUJ1dHRvbi5vcGVuKCl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy4kLm1lbnVCdXR0b24uY2xvc2UoKX0sX29uSXJvblNlbGVjdDpmdW5jdGlvbih0KXt0aGlzLl9zZXRTZWxlY3RlZEl0ZW0odC5kZXRhaWwuaXRlbSl9LF9vbklyb25EZXNlbGVjdDpmdW5jdGlvbih0KXt0aGlzLl9zZXRTZWxlY3RlZEl0ZW0obnVsbCl9LF9vblRhcDpmdW5jdGlvbih0KXtkaSh0KT09PXRoaXMmJnRoaXMub3BlbigpfSxfc2VsZWN0ZWRJdGVtQ2hhbmdlZDpmdW5jdGlvbih0KXt2YXIgZTtlPXQ/dC5sYWJlbHx8dC5nZXRBdHRyaWJ1dGUoImxhYmVsIil8fHQudGV4dENvbnRlbnQudHJpbSgpOiIiLHRoaXMudmFsdWU9ZSx0aGlzLl9zZXRTZWxlY3RlZEl0ZW1MYWJlbChlKX0sX2NvbXB1dGVNZW51VmVydGljYWxPZmZzZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8KHQ/LTQ6OCl9LF9nZXRWYWxpZGl0eTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kaXNhYmxlZHx8IXRoaXMucmVxdWlyZWR8fHRoaXMucmVxdWlyZWQmJiEhdGhpcy52YWx1ZX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnRlbnRFbGVtZW50O3QmJnQuc2V0QXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIix0aGlzLm9wZW5lZD8idHJ1ZSI6ImZhbHNlIil9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwp2YXIgWWE9e291dGVyU2Nyb2xsOntzY3JvbGw6ITB9LHNoYWRvd01vZGU6e3N0YW5kYXJkOjIsd2F0ZXJmYWxsOjEsIndhdGVyZmFsbC10YWxsIjoxfSx0YWxsTW9kZTp7IndhdGVyZmFsbC10YWxsIjohMH19O1JyKHtfdGVtcGxhdGU6X2VgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtdmVydGljYWw7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWw7CiAgICAgIH0KCiAgICAgICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgICB9CgogICAgICAjbWFpblBhbmVsIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtdmVydGljYWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLWJvZHk7CiAgICAgIH0KCiAgICAgICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtY29udGFpbmVyOwogICAgICB9CgogICAgICAvKgogICAgICAgKiBtb2RlOiBzY3JvbGwKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPXNjcm9sbF0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtc2Nyb2xsLWNvbnRhaW5lcjsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgOmhvc3QoW21vZGU9c2Nyb2xsXSkgewogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogY292ZXIKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPWNvdmVyXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1jb3Zlci1jb250YWluZXI7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQoKICAgICAgOmhvc3QoW21vZGU9Y292ZXJdKSAjbWFpblBhbmVsIHsKICAgICAgICBwb3NpdGlvbjogc3RhdGljOwogICAgICB9CgogICAgICAvKgogICAgICAgKiBtb2RlOiBzdGFuZGFyZAogICAgICAgKi8KICAgICAgOmhvc3QoW21vZGU9c3RhbmRhcmRdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXN0YW5kYXJkLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogc2VhbWVkCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1zZWFtZWRdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXNlYW1lZC1jb250YWluZXI7CiAgICAgIH0KCgogICAgICAvKgogICAgICAgKiBtb2RlOiB3YXRlcmZhbGwKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPXdhdGVyZmFsbF0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtd2F0ZXJmYWxsLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogd2F0ZXJmYWxsLXRhbGwKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPXdhdGVyZmFsbC10YWxsXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC13YXRlcmZhbGwtdGFsbC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgICNkcm9wU2hhZG93IHsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuNXM7CiAgICAgICAgaGVpZ2h0OiA2cHg7CiAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMHB4IDVweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXNoYWRvdzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI2Ryb3BTaGFkb3cuaGFzLXNoYWRvdyB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgI21haW5Db250YWluZXIgPiA6OnNsb3R0ZWQoLmZpdCkgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KCiAgICA8L3N0eWxlPgoKICAgIDxzbG90IGlkPSJoZWFkZXJTbG90IiBuYW1lPSJoZWFkZXIiPjwvc2xvdD4KCiAgICA8ZGl2IGlkPSJtYWluUGFuZWwiPgogICAgICA8ZGl2IGlkPSJtYWluQ29udGFpbmVyIiBjbGFzc1wkPSJbW19jb21wdXRlTWFpbkNvbnRhaW5lckNsYXNzKG1vZGUpXV0iPgogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImRyb3BTaGFkb3ciPjwvZGl2PgogICAgPC9kaXY+CmAsaXM6InBhcGVyLWhlYWRlci1wYW5lbCIscHJvcGVydGllczp7bW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0YW5kYXJkIixvYnNlcnZlcjoiX21vZGVDaGFuZ2VkIixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHNoYWRvdzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx0YWxsQ2xhc3M6e3R5cGU6U3RyaW5nLHZhbHVlOiJ0YWxsIn0sYXRUb3A6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxub3RpZnk6ITAscmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfX0sb2JzZXJ2ZXJzOlsiX2NvbXB1dGVEcm9wU2hhZG93SGlkZGVuKGF0VG9wLCBtb2RlLCBzaGFkb3cpIl0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hZGRMaXN0ZW5lcigpLHRoaXMuX2tlZXBTY3JvbGxpbmdTdGF0ZSgpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3JlbW92ZUxpc3RlbmVyKCl9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxIYW5kbGVyPXRoaXMuX3Njcm9sbC5iaW5kKHRoaXMpLGNvbnNvbGUud2Fybih0aGlzLmlzLCJpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGFwcC1sYXlvdXQgaW5zdGVhZCEiKX0sZ2V0IGhlYWRlcigpe3JldHVybiBZaSh0aGlzLiQuaGVhZGVyU2xvdCkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpWzBdfSxnZXQgc2Nyb2xsZXIoKXtyZXR1cm4gdGhpcy5fZ2V0U2Nyb2xsZXJGb3JNb2RlKHRoaXMubW9kZSl9LGdldCB2aXNpYmxlU2hhZG93KCl7cmV0dXJuIHRoaXMuJC5kcm9wU2hhZG93LmNsYXNzTGlzdC5jb250YWlucygiaGFzLXNoYWRvdyIpfSxfY29tcHV0ZURyb3BTaGFkb3dIaWRkZW46ZnVuY3Rpb24odCxlLG4pe3ZhciBpPVlhLnNoYWRvd01vZGVbZV07dGhpcy50b2dnbGVDbGFzcygiaGFzLXNoYWRvdyIsISF0aGlzLnNoYWRvd3x8Mj09PWl8fDE9PT1pJiYhdCx0aGlzLiQuZHJvcFNoYWRvdyl9LF9jb21wdXRlTWFpbkNvbnRhaW5lckNsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlPXt9O3JldHVybiBlLmZsZXg9ImNvdmVyIiE9PXQsT2JqZWN0LmtleXMoZSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0pKS5qb2luKCIgIil9LF9hZGRMaXN0ZW5lcjpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLnNjcm9sbEhhbmRsZXIpfSxfcmVtb3ZlTGlzdGVuZXI6ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdGhpcy5zY3JvbGxIYW5kbGVyKX0sX21vZGVDaGFuZ2VkOmZ1bmN0aW9uKHQsZSl7dmFyIG49WWEsaT10aGlzLmhlYWRlcjtpJiYobi50YWxsTW9kZVtlXSYmIW4udGFsbE1vZGVbdF0/KGkuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLnRhbGxDbGFzcyksdGhpcy5hc3luYygoZnVuY3Rpb24oKXtpLmNsYXNzTGlzdC5yZW1vdmUoImFuaW1hdGUiKX0pLDIwMCkpOnRoaXMudG9nZ2xlQ2xhc3MoImFuaW1hdGUiLG4udGFsbE1vZGVbdF0saSkpLHRoaXMuX2tlZXBTY3JvbGxpbmdTdGF0ZSgpfSxfa2VlcFNjcm9sbGluZ1N0YXRlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zY3JvbGxlcixlPXRoaXMuaGVhZGVyO3RoaXMuX3NldEF0VG9wKDA9PT10LnNjcm9sbFRvcCksZSYmdGhpcy50YWxsQ2xhc3MmJllhLnRhbGxNb2RlW3RoaXMubW9kZV0mJnRoaXMudG9nZ2xlQ2xhc3ModGhpcy50YWxsQ2xhc3MsdGhpcy5hdFRvcHx8ZS5jbGFzc0xpc3QuY29udGFpbnModGhpcy50YWxsQ2xhc3MpJiZ0LnNjcm9sbEhlaWdodDx0aGlzLm9mZnNldEhlaWdodCxlKX0sX3Njcm9sbDpmdW5jdGlvbigpe3RoaXMuX2tlZXBTY3JvbGxpbmdTdGF0ZSgpLHRoaXMuZmlyZSgiY29udGVudC1zY3JvbGwiLHt0YXJnZXQ6dGhpcy5zY3JvbGxlcn0se2J1YmJsZXM6ITF9KX0sX2dldFNjcm9sbGVyRm9yTW9kZTpmdW5jdGlvbih0KXtyZXR1cm4gWWEub3V0ZXJTY3JvbGxbdF0/dGhpczp0aGlzLiQubWFpbkNvbnRhaW5lcn19KSwKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovClJyKHtpczoicGFwZXItaWNvbi1idXR0b24iLF90ZW1wbGF0ZTpfZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgei1pbmRleDogMDsKICAgICAgICBsaW5lLWhlaWdodDogMTsKCiAgICAgICAgd2lkdGg6IDQwcHg7CiAgICAgICAgaGVpZ2h0OiA0MHB4OwoKICAgICAgICAvKgogICAgICAgICAgTk9URTogQm90aCB2YWx1ZXMgYXJlIG5lZWRlZCwgc2luY2Ugc29tZSBwaG9uZXMgcmVxdWlyZSB0aGUgdmFsdWUgdG8KICAgICAgICAgIGJlIFxgdHJhbnNwYXJlbnRcYC4KICAgICAgICAqLwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTsKICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwoKICAgICAgICAvKiBCZWNhdXNlIG9mIHBvbHltZXIvMjU1OCwgdGhpcyBzdHlsZSBoYXMgbG93ZXIgc3BlY2lmaWNpdHkgdGhhbiAqICovCiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pY29uLWJ1dHRvbjsKICAgICAgfQoKICAgICAgOmhvc3QgI2luayB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWljb24tYnV0dG9uLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgb3BhY2l0eTogMC42OwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWljb24tYnV0dG9uLWRpc2FibGVkLXRleHQsIHZhcigtLWRpc2FibGVkLXRleHQtY29sb3IpKTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBjdXJzb3I6IGF1dG87CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWljb24tYnV0dG9uLWRpc2FibGVkOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgOmhvc3QoOmhvdmVyKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaWNvbi1idXR0b24taG92ZXI7CiAgICAgIH0KCiAgICAgIGlyb24taWNvbiB7CiAgICAgICAgLS1pcm9uLWljb24td2lkdGg6IDEwMCU7CiAgICAgICAgLS1pcm9uLWljb24taGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxpcm9uLWljb24gaWQ9Imljb24iIHNyYz0iW1tzcmNdXSIgaWNvbj0iW1tpY29uXV0iCiAgICAgICAgICAgICAgIGFsdCQ9IltbYWx0XV0iPjwvaXJvbi1pY29uPgogIGAsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImJ1dHRvbiIsdGFiaW5kZXg6IjAifSxiZWhhdmlvcnM6W2NhXSxyZWdpc3RlcmVkOmZ1bmN0aW9uKCl7dGhpcy5fdGVtcGxhdGUuc2V0QXR0cmlidXRlKCJzdHJpcC13aGl0ZXNwYWNlIiwiIil9LHByb3BlcnRpZXM6e3NyYzp7dHlwZTpTdHJpbmd9LGljb246e3R5cGU6U3RyaW5nfSxhbHQ6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfYWx0Q2hhbmdlZCJ9fSxfYWx0Q2hhbmdlZDpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIik7biYmZSE9bnx8dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLHQpfX0pLAovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KUnIoe190ZW1wbGF0ZTpfZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkOwogICAgICAgIHBhZGRpbmc6IDJweDsKICAgICAgICAtbW96LWFwcGVhcmFuY2U6IHRleHRhcmVhOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogdGV4dGFyZWE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLm1pcnJvci10ZXh0IHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgcmVzaXplOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgLyogc2VlIGNvbW1lbnRzIGluIHRlbXBsYXRlICovCiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdDsKICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0OwogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTo6LW1vei1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0taXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYS1wbGFjZWhvbGRlcjsKICAgICAgfQoKICAgICAgdGV4dGFyZWE6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDwhLS0gdGhlIG1pcnJvciBzaXplcyB0aGUgaW5wdXQvdGV4dGFyZWEgc28gaXQgZ3Jvd3Mgd2l0aCB0eXBpbmcgLS0+CiAgICA8IS0tIHVzZSAmIzE2MDsgaW5zdGVhZCAmbmJzcDsgb2YgdG8gYWxsb3cgdGhpcyBlbGVtZW50IHRvIGJlIHVzZWQgaW4gWEhUTUwgLS0+CiAgICA8ZGl2IGlkPSJtaXJyb3IiIGNsYXNzPSJtaXJyb3ItdGV4dCIgYXJpYS1oaWRkZW49InRydWUiPiZuYnNwOzwvZGl2PgoKICAgIDwhLS0gc2l6ZSB0aGUgaW5wdXQvdGV4dGFyZWEgd2l0aCBhIGRpdiwgYmVjYXVzZSB0aGUgdGV4dGFyZWEgaGFzIGludHJpbnNpYyBzaXplIGluIGZmIC0tPgogICAgPGRpdiBjbGFzcz0idGV4dGFyZWEtY29udGFpbmVyIGZpdCI+CiAgICAgIDx0ZXh0YXJlYSBpZD0idGV4dGFyZWEiIG5hbWUkPSJbW25hbWVdXSIgYXJpYS1sYWJlbCQ9IltbbGFiZWxdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgYXV0b2NhcGl0YWxpemUkPSJbW2F1dG9jYXBpdGFsaXplXV0iIGlucHV0bW9kZSQ9IltbaW5wdXRtb2RlXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgcmVxdWlyZWQkPSJbW3JlcXVpcmVkXV0iIGRpc2FibGVkJD0iW1tkaXNhYmxlZF1dIiByb3dzJD0iW1tyb3dzXV0iIG1pbmxlbmd0aCQ9IltbbWlubGVuZ3RoXV0iIG1heGxlbmd0aCQ9IltbbWF4bGVuZ3RoXV0iPjwvdGV4dGFyZWE+CiAgICA8L2Rpdj4KYCxpczoiaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSIsYmVoYXZpb3JzOlthYSxxb10scHJvcGVydGllczp7dmFsdWU6e29ic2VydmVyOiJfdmFsdWVDaGFuZ2VkIix0eXBlOlN0cmluZyxub3RpZnk6ITB9LGJpbmRWYWx1ZTp7b2JzZXJ2ZXI6Il9iaW5kVmFsdWVDaGFuZ2VkIix0eXBlOlN0cmluZyxub3RpZnk6ITB9LHJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjEsb2JzZXJ2ZXI6Il91cGRhdGVDYWNoZWQifSxtYXhSb3dzOnt0eXBlOk51bWJlcix2YWx1ZTowLG9ic2VydmVyOiJfdXBkYXRlQ2FjaGVkIn0sYXV0b2NvbXBsZXRlOnt0eXBlOlN0cmluZyx2YWx1ZToib2ZmIn0sYXV0b2ZvY3VzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGF1dG9jYXBpdGFsaXplOnt0eXBlOlN0cmluZyx2YWx1ZToibm9uZSJ9LGlucHV0bW9kZTp7dHlwZTpTdHJpbmd9LHBsYWNlaG9sZGVyOnt0eXBlOlN0cmluZ30scmVhZG9ubHk6e3R5cGU6U3RyaW5nfSxyZXF1aXJlZDp7dHlwZTpCb29sZWFufSxtaW5sZW5ndGg6e3R5cGU6TnVtYmVyfSxtYXhsZW5ndGg6e3R5cGU6TnVtYmVyfSxsYWJlbDp7dHlwZTpTdHJpbmd9fSxsaXN0ZW5lcnM6e2lucHV0OiJfb25JbnB1dCJ9LGdldCB0ZXh0YXJlYSgpe3JldHVybiB0aGlzLiQudGV4dGFyZWF9LGdldCBzZWxlY3Rpb25TdGFydCgpe3JldHVybiB0aGlzLiQudGV4dGFyZWEuc2VsZWN0aW9uU3RhcnR9LGdldCBzZWxlY3Rpb25FbmQoKXtyZXR1cm4gdGhpcy4kLnRleHRhcmVhLnNlbGVjdGlvbkVuZH0sc2V0IHNlbGVjdGlvblN0YXJ0KHQpe3RoaXMuJC50ZXh0YXJlYS5zZWxlY3Rpb25TdGFydD10fSxzZXQgc2VsZWN0aW9uRW5kKHQpe3RoaXMuJC50ZXh0YXJlYS5zZWxlY3Rpb25FbmQ9dH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXtuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OltvYV1kfGhvbmUpLykmJiFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PUyAxWzM0NTY3ODldLykmJih0aGlzLiQudGV4dGFyZWEuc3R5bGUubWFyZ2luTGVmdD0iLTNweCIpfSx2YWxpZGF0ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuJC50ZXh0YXJlYS52YWxpZGl0eS52YWxpZDtyZXR1cm4gdCYmKHRoaXMucmVxdWlyZWQmJiIiPT09dGhpcy52YWx1ZT90PSExOnRoaXMuaGFzVmFsaWRhdG9yKCkmJih0PWFhLnZhbGlkYXRlLmNhbGwodGhpcyx0aGlzLnZhbHVlKSkpLHRoaXMuaW52YWxpZD0hdCx0aGlzLmZpcmUoImlyb24taW5wdXQtdmFsaWRhdGUiKSx0fSxfYmluZFZhbHVlQ2hhbmdlZDpmdW5jdGlvbih0KXt0aGlzLnZhbHVlPXR9LF92YWx1ZUNoYW5nZWQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy50ZXh0YXJlYTtlJiYoZS52YWx1ZSE9PXQmJihlLnZhbHVlPXR8fDA9PT10P3Q6IiIpLHRoaXMuYmluZFZhbHVlPXQsdGhpcy4kLm1pcnJvci5pbm5lckhUTUw9dGhpcy5fdmFsdWVGb3JNaXJyb3IoKSx0aGlzLmZpcmUoImJpbmQtdmFsdWUtY2hhbmdlZCIse3ZhbHVlOnRoaXMuYmluZFZhbHVlfSkpfSxfb25JbnB1dDpmdW5jdGlvbih0KXt2YXIgZT1ZaSh0KS5wYXRoO3RoaXMudmFsdWU9ZT9lWzBdLnZhbHVlOnQudGFyZ2V0LnZhbHVlfSxfY29uc3RyYWluOmZ1bmN0aW9uKHQpe3ZhciBlO2Zvcih0PXR8fFsiIl0sZT10aGlzLm1heFJvd3M+MCYmdC5sZW5ndGg+dGhpcy5tYXhSb3dzP3Quc2xpY2UoMCx0aGlzLm1heFJvd3MpOnQuc2xpY2UoMCk7dGhpcy5yb3dzPjAmJmUubGVuZ3RoPHRoaXMucm93czspZS5wdXNoKCIiKTtyZXR1cm4gZS5qb2luKCI8YnIvPiIpKyImIzE2MDsifSxfdmFsdWVGb3JNaXJyb3I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnRleHRhcmVhO2lmKHQpcmV0dXJuIHRoaXMudG9rZW5zPXQmJnQudmFsdWU/dC52YWx1ZS5yZXBsYWNlKC8mL2dtLCImYW1wOyIpLnJlcGxhY2UoLyIvZ20sIiZxdW90OyIpLnJlcGxhY2UoLycvZ20sIiYjMzk7IikucmVwbGFjZSgvPC9nbSwiJmx0OyIpLnJlcGxhY2UoLz4vZ20sIiZndDsiKS5zcGxpdCgiXG4iKTpbIiJdLHRoaXMuX2NvbnN0cmFpbih0aGlzLnRva2Vucyl9LF91cGRhdGVDYWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLiQubWlycm9yLmlubmVySFRNTD10aGlzLl9jb25zdHJhaW4odGhpcy50b2tlbnMpfX0pLAovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KUnIoe190ZW1wbGF0ZTpfZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgbGFiZWwgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pbnB1dC1jb250YWluZXIgbm8tbGFiZWwtZmxvYXQkPSJbW25vTGFiZWxGbG9hdF1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsKGFsd2F5c0Zsb2F0TGFiZWwscGxhY2Vob2xkZXIpXV0iIGF1dG8tdmFsaWRhdGUkPSJbW2F1dG9WYWxpZGF0ZV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaW52YWxpZD0iW1tpbnZhbGlkXV0iPgoKICAgICAgPGxhYmVsIGhpZGRlbiQ9IltbIWxhYmVsXV0iIGFyaWEtaGlkZGVuPSJ0cnVlIiBmb3IkPSJbW19pbnB1dElkXV0iIHNsb3Q9ImxhYmVsIj5bW2xhYmVsXV08L2xhYmVsPgoKICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3M9InBhcGVyLWlucHV0LWlucHV0IiBzbG90PSJpbnB1dCIgaWQkPSJbW19pbnB1dElkXV0iIGFyaWEtbGFiZWxsZWRieSQ9IltbX2FyaWFMYWJlbGxlZEJ5XV0iIGFyaWEtZGVzY3JpYmVkYnkkPSJbW19hcmlhRGVzY3JpYmVkQnldXSIgYmluZC12YWx1ZT0ie3t2YWx1ZX19IiBpbnZhbGlkPSJ7e2ludmFsaWR9fSIgdmFsaWRhdG9yJD0iW1t2YWxpZGF0b3JdXSIgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIGF1dG9jb21wbGV0ZSQ9IltbYXV0b2NvbXBsZXRlXV0iIGF1dG9mb2N1cyQ9IltbYXV0b2ZvY3VzXV0iIGlucHV0bW9kZSQ9IltbaW5wdXRtb2RlXV0iIG5hbWUkPSJbW25hbWVdXSIgcGxhY2Vob2xkZXIkPSJbW3BsYWNlaG9sZGVyXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgYXV0b2NhcGl0YWxpemUkPSJbW2F1dG9jYXBpdGFsaXplXV0iIHJvd3MkPSJbW3Jvd3NdXSIgbWF4LXJvd3MkPSJbW21heFJvd3NdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiPjwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlcnJvck1lc3NhZ2VdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWVycm9yIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIiBzbG90PSJhZGQtb24iPltbZXJyb3JNZXNzYWdlXV08L3BhcGVyLWlucHV0LWVycm9yPgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJDb3VudGVyXV0iPgogICAgICAgIDxwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgc2xvdD0iYWRkLW9uIj48L3BhcGVyLWlucHV0LWNoYXItY291bnRlcj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KYCxpczoicGFwZXItdGV4dGFyZWEiLGJlaGF2aW9yczpbRmEscmFdLHByb3BlcnRpZXM6e19hcmlhTGFiZWxsZWRCeTp7b2JzZXJ2ZXI6Il9hcmlhTGFiZWxsZWRCeUNoYW5nZWQiLHR5cGU6U3RyaW5nfSxfYXJpYURlc2NyaWJlZEJ5OntvYnNlcnZlcjoiX2FyaWFEZXNjcmliZWRCeUNoYW5nZWQiLHR5cGU6U3RyaW5nfSx2YWx1ZTp7dHlwZTpTdHJpbmd9LHJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LG1heFJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjB9fSxnZXQgc2VsZWN0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0fSxzZXQgc2VsZWN0aW9uU3RhcnQodCl7dGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0PXR9LGdldCBzZWxlY3Rpb25FbmQoKXtyZXR1cm4gdGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvbkVuZH0sc2V0IHNlbGVjdGlvbkVuZCh0KXt0aGlzLiQuaW5wdXQudGV4dGFyZWEuc2VsZWN0aW9uRW5kPXR9LF9hcmlhTGFiZWxsZWRCeUNoYW5nZWQ6ZnVuY3Rpb24odCl7dGhpcy5fZm9jdXNhYmxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsdCl9LF9hcmlhRGVzY3JpYmVkQnlDaGFuZ2VkOmZ1bmN0aW9uKHQpe3RoaXMuX2ZvY3VzYWJsZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5Iix0KX0sZ2V0IF9mb2N1c2FibGVFbGVtZW50KCl7cmV0dXJuIHRoaXMuaW5wdXRFbGVtZW50LnRleHRhcmVhfX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgWGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtYYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZGlzcGxheTogbm9uZTsiKSxYYS5pbm5lckhUTUw9Ijxkb20tbW9kdWxlIGlkPVwicGFwZXItaXRlbS1zaGFyZWQtc3R5bGVzXCI+XG4gIDx0ZW1wbGF0ZT5cbiAgICA8c3R5bGU+XG4gICAgICA6aG9zdCwgLnBhcGVyLWl0ZW0ge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBtaW4taGVpZ2h0OiB2YXIoLS1wYXBlci1pdGVtLW1pbi1oZWlnaHQsIDQ4cHgpO1xuICAgICAgICBwYWRkaW5nOiAwcHggMTZweDtcbiAgICAgIH1cblxuICAgICAgLnBhcGVyLWl0ZW0ge1xuICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7XG4gICAgICAgIGJvcmRlcjpub25lO1xuICAgICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgICB9XG5cbiAgICAgIDpob3N0KFtoaWRkZW5dKSwgLnBhcGVyLWl0ZW1baGlkZGVuXSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgIH1cblxuICAgICAgOmhvc3QoLmlyb24tc2VsZWN0ZWQpLCAucGFwZXItaXRlbS5pcm9uLXNlbGVjdGVkIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IHZhcigtLXBhcGVyLWl0ZW0tc2VsZWN0ZWQtd2VpZ2h0LCBib2xkKTtcblxuICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLXNlbGVjdGVkO1xuICAgICAgfVxuXG4gICAgICA6aG9zdChbZGlzYWJsZWRdKSwgLnBhcGVyLWl0ZW1bZGlzYWJsZWRdIHtcbiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWl0ZW0tZGlzYWJsZWQtY29sb3IsIHZhcigtLWRpc2FibGVkLXRleHQtY29sb3IpKTtcblxuICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLWRpc2FibGVkO1xuICAgICAgfVxuXG4gICAgICA6aG9zdCg6Zm9jdXMpLCAucGFwZXItaXRlbTpmb2N1cyB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgb3V0bGluZTogMDtcblxuICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLWZvY3VzZWQ7XG4gICAgICB9XG5cbiAgICAgIDpob3N0KDpmb2N1cyk6YmVmb3JlLCAucGFwZXItaXRlbTpmb2N1czpiZWZvcmUge1xuICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0O1xuXG4gICAgICAgIGJhY2tncm91bmQ6IGN1cnJlbnRDb2xvcjtcbiAgICAgICAgY29udGVudDogJyc7XG4gICAgICAgIG9wYWNpdHk6IHZhcigtLWRhcmstZGl2aWRlci1vcGFjaXR5KTtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG5cbiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1mb2N1c2VkLWJlZm9yZTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICA8L3RlbXBsYXRlPlxuPC9kb20tbW9kdWxlPiIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChYYS5jb250ZW50KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0ICRhPVtYbyxxbyx7aG9zdEF0dHJpYnV0ZXM6e3JvbGU6Im9wdGlvbiIsdGFiaW5kZXg6IjAifX1dOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KUnIoe190ZW1wbGF0ZTpfZWAKICAgIDxzdHlsZSBpbmNsdWRlPSJwYXBlci1pdGVtLXNoYXJlZC1zdHlsZXMiPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8c2xvdD48L3Nsb3Q+CmAsaXM6InBhcGVyLWl0ZW0iLGJlaGF2aW9yczpbJGFdfSksCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpScih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsgLyogbmVlZGVkIGZvciB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcyB0byB3b3JrIG9uIGZmICovCiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItanVzdGlmaWVkOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgICB9CgogICAgICA6aG9zdChbdHdvLWxpbmVdKSB7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXR3by1saW5lLW1pbi1oZWlnaHQsIDcycHgpOwogICAgICB9CgogICAgICA6aG9zdChbdGhyZWUtbGluZV0pIHsKICAgICAgICBtaW4taGVpZ2h0OiB2YXIoLS1wYXBlci1pdGVtLWJvZHktdGhyZWUtbGluZS1taW4taGVpZ2h0LCA4OHB4KTsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoW3NlY29uZGFyeV0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWJvZHkxOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXNlY29uZGFyeS1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1ib2R5LXNlY29uZGFyeTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CmAsaXM6InBhcGVyLWl0ZW0tYm9keSJ9KSwKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovClJyKHtfdGVtcGxhdGU6X2VgCiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItaXRlbS1zaGFyZWQtc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW07CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaWNvbi1pdGVtOwogICAgICB9CgogICAgICAuY29udGVudC1pY29uIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwoKICAgICAgICB3aWR0aDogdmFyKC0tcGFwZXItaXRlbS1pY29uLXdpZHRoLCA1NnB4KTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLWljb247CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iY29udGVudEljb24iIGNsYXNzPSJjb250ZW50LWljb24iPgogICAgICA8c2xvdCBuYW1lPSJpdGVtLWljb24iPjwvc2xvdD4KICAgIDwvZGl2PgogICAgPHNsb3Q+PC9zbG90PgpgLGlzOiJwYXBlci1pY29uLWl0ZW0iLGJlaGF2aW9yczpbJGFdfSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBLYT17cHJvcGVydGllczp7bXVsdGk6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoibXVsdGlDaGFuZ2VkIn0sc2VsZWN0ZWRWYWx1ZXM6e3R5cGU6QXJyYXksbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxzZWxlY3RlZEl0ZW1zOnt0eXBlOkFycmF5LHJlYWRPbmx5OiEwLG5vdGlmeTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LG9ic2VydmVyczpbIl91cGRhdGVTZWxlY3RlZChzZWxlY3RlZFZhbHVlcy5zcGxpY2VzKSJdLHNlbGVjdDpmdW5jdGlvbih0KXt0aGlzLm11bHRpP3RoaXMuX3RvZ2dsZVNlbGVjdGVkKHQpOnRoaXMuc2VsZWN0ZWQ9dH0sbXVsdGlDaGFuZ2VkOmZ1bmN0aW9uKHQpe3RoaXMuX3NlbGVjdGlvbi5tdWx0aT10LHRoaXMuX3VwZGF0ZVNlbGVjdGVkKCl9LGdldCBfc2hvdWxkVXBkYXRlU2VsZWN0aW9uKCl7cmV0dXJuIG51bGwhPXRoaXMuc2VsZWN0ZWR8fG51bGwhPXRoaXMuc2VsZWN0ZWRWYWx1ZXMmJnRoaXMuc2VsZWN0ZWRWYWx1ZXMubGVuZ3RofSxfdXBkYXRlQXR0ckZvclNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5tdWx0aT90aGlzLnNlbGVjdGVkSXRlbXMmJnRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGg+MCYmKHRoaXMuc2VsZWN0ZWRWYWx1ZXM9dGhpcy5zZWxlY3RlZEl0ZW1zLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2luZGV4VG9WYWx1ZSh0aGlzLmluZGV4T2YodCkpfSksdGhpcykuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dH0pLHRoaXMpKTpqby5fdXBkYXRlQXR0ckZvclNlbGVjdGVkLmFwcGx5KHRoaXMpfSxfdXBkYXRlU2VsZWN0ZWQ6ZnVuY3Rpb24oKXt0aGlzLm11bHRpP3RoaXMuX3NlbGVjdE11bHRpKHRoaXMuc2VsZWN0ZWRWYWx1ZXMpOnRoaXMuX3NlbGVjdFNlbGVjdGVkKHRoaXMuc2VsZWN0ZWQpfSxfc2VsZWN0TXVsdGk6ZnVuY3Rpb24odCl7dmFyIGU9KHRoaXMuX3ZhbHVlc1RvSXRlbXModD10fHxbXSl8fFtdKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10fSkpO3RoaXMuX3NlbGVjdGlvbi5jbGVhcihlKTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0aGlzLl9zZWxlY3Rpb24uc2V0SXRlbVNlbGVjdGVkKGVbbl0sITApO3RoaXMuZmFsbGJhY2tTZWxlY3Rpb24mJiF0aGlzLl9zZWxlY3Rpb24uZ2V0KCkubGVuZ3RoJiZ0aGlzLl92YWx1ZVRvSXRlbSh0aGlzLmZhbGxiYWNrU2VsZWN0aW9uKSYmdGhpcy5zZWxlY3QodGhpcy5mYWxsYmFja1NlbGVjdGlvbil9LF9zZWxlY3Rpb25DaGFuZ2U6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zZWxlY3Rpb24uZ2V0KCk7dGhpcy5tdWx0aT8odGhpcy5fc2V0U2VsZWN0ZWRJdGVtcyh0KSx0aGlzLl9zZXRTZWxlY3RlZEl0ZW0odC5sZW5ndGg/dFswXTpudWxsKSk6bnVsbCE9dD8odGhpcy5fc2V0U2VsZWN0ZWRJdGVtcyhbdF0pLHRoaXMuX3NldFNlbGVjdGVkSXRlbSh0KSk6KHRoaXMuX3NldFNlbGVjdGVkSXRlbXMoW10pLHRoaXMuX3NldFNlbGVjdGVkSXRlbShudWxsKSl9LF90b2dnbGVTZWxlY3RlZDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnNlbGVjdGVkVmFsdWVzLmluZGV4T2YodCk7ZTwwP3RoaXMucHVzaCgic2VsZWN0ZWRWYWx1ZXMiLHQpOnRoaXMuc3BsaWNlKCJzZWxlY3RlZFZhbHVlcyIsZSwxKX0sX3ZhbHVlc1RvSXRlbXM6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/bnVsbDp0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3ZhbHVlVG9JdGVtKHQpfSksdGhpcyl9fSxaYT17cHJvcGVydGllczp7Zm9jdXNlZEl0ZW06e29ic2VydmVyOiJfZm9jdXNlZEl0ZW1DaGFuZ2VkIixyZWFkT25seTohMCx0eXBlOk9iamVjdH0sYXR0ckZvckl0ZW1UaXRsZTp7dHlwZTpTdHJpbmd9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9kaXNhYmxlZENoYW5nZWQifX0sX01PRElGSUVSX0tFWVM6WyJBbHQiLCJBbHRHcmFwaCIsIkNhcHNMb2NrIiwiQ29udHJvbCIsIkZuIiwiRm5Mb2NrIiwiSHlwZXIiLCJNZXRhIiwiTnVtTG9jayIsIk9TIiwiU2Nyb2xsTG9jayIsIlNoaWZ0IiwiU3VwZXIiLCJTeW1ib2wiLCJTeW1ib2xMb2NrIl0sX1NFQVJDSF9SRVNFVF9USU1FT1VUX01TOjFlMyxfcHJldmlvdXNUYWJJbmRleDowLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJtZW51In0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZU11bHRpc2VsZWN0YWJsZShtdWx0aSkiXSxsaXN0ZW5lcnM6e2ZvY3VzOiJfb25Gb2N1cyIsa2V5ZG93bjoiX29uS2V5ZG93biIsImlyb24taXRlbXMtY2hhbmdlZCI6Il9vbklyb25JdGVtc0NoYW5nZWQifSxrZXlCaW5kaW5nczp7dXA6Il9vblVwS2V5Iixkb3duOiJfb25Eb3duS2V5Iixlc2M6Il9vbkVzY0tleSIsInNoaWZ0K3RhYjprZXlkb3duIjoiX29uU2hpZnRUYWJEb3duIn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9yZXNldFRhYmluZGljZXMoKX0sc2VsZWN0OmZ1bmN0aW9uKHQpe3RoaXMuX2RlZmF1bHRGb2N1c0FzeW5jJiYodGhpcy5jYW5jZWxBc3luYyh0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYyksdGhpcy5fZGVmYXVsdEZvY3VzQXN5bmM9bnVsbCk7dmFyIGU9dGhpcy5fdmFsdWVUb0l0ZW0odCk7ZSYmZS5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIil8fCh0aGlzLl9zZXRGb2N1c2VkSXRlbShlKSxLYS5zZWxlY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sX3Jlc2V0VGFiaW5kaWNlczpmdW5jdGlvbigpe3ZhciB0PXRoaXMubXVsdGk/dGhpcy5zZWxlY3RlZEl0ZW1zJiZ0aGlzLnNlbGVjdGVkSXRlbXNbMF06dGhpcy5zZWxlY3RlZEl0ZW07dGhpcy5pdGVtcy5mb3JFYWNoKChmdW5jdGlvbihlKXtlLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLGU9PT10PyIwIjoiLTEiKSxlLnNldEF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIsdGhpcy5fc2VsZWN0aW9uLmlzU2VsZWN0ZWQoZSkpfSksdGhpcyl9LF91cGRhdGVNdWx0aXNlbGVjdGFibGU6ZnVuY3Rpb24odCl7dD90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1tdWx0aXNlbGVjdGFibGUiLCJ0cnVlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtbXVsdGlzZWxlY3RhYmxlIil9LF9mb2N1c1dpdGhLZXlib2FyZEV2ZW50OmZ1bmN0aW9uKHQpe2lmKC0xPT09dGhpcy5fTU9ESUZJRVJfS0VZUy5pbmRleE9mKHQua2V5KSl7dGhpcy5jYW5jZWxEZWJvdW5jZXIoIl9jbGVhclNlYXJjaFRleHQiKTtmb3IodmFyIGUsbj10aGlzLl9zZWFyY2hUZXh0fHwiIixpPShuKz0odC5rZXkmJjE9PXQua2V5Lmxlbmd0aD90LmtleTpTdHJpbmcuZnJvbUNoYXJDb2RlKHQua2V5Q29kZSkpLnRvTG9jYWxlTG93ZXJDYXNlKCkpLmxlbmd0aCxyPTA7ZT10aGlzLml0ZW1zW3JdO3IrKylpZighZS5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIikpe3ZhciBvPXRoaXMuYXR0ckZvckl0ZW1UaXRsZXx8InRleHRDb250ZW50IixhPShlW29dfHxlLmdldEF0dHJpYnV0ZShvKXx8IiIpLnRyaW0oKTtpZighKGEubGVuZ3RoPGkpJiZhLnNsaWNlKDAsaSkudG9Mb2NhbGVMb3dlckNhc2UoKT09bil7dGhpcy5fc2V0Rm9jdXNlZEl0ZW0oZSk7YnJlYWt9fXRoaXMuX3NlYXJjaFRleHQ9bix0aGlzLmRlYm91bmNlKCJfY2xlYXJTZWFyY2hUZXh0Iix0aGlzLl9jbGVhclNlYXJjaFRleHQsdGhpcy5fU0VBUkNIX1JFU0VUX1RJTUVPVVRfTVMpfX0sX2NsZWFyU2VhcmNoVGV4dDpmdW5jdGlvbigpe3RoaXMuX3NlYXJjaFRleHQ9IiJ9LF9mb2N1c1ByZXZpb3VzOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuaXRlbXMubGVuZ3RoLGU9TnVtYmVyKHRoaXMuaW5kZXhPZih0aGlzLmZvY3VzZWRJdGVtKSksbj0xO248dCsxO24rKyl7dmFyIGk9dGhpcy5pdGVtc1soZS1uK3QpJXRdO2lmKCFpLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIHI9WWkoaSkuZ2V0T3duZXJSb290KCl8fGRvY3VtZW50O2lmKHRoaXMuX3NldEZvY3VzZWRJdGVtKGkpLFlpKHIpLmFjdGl2ZUVsZW1lbnQ9PWkpcmV0dXJufX19LF9mb2N1c05leHQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5pdGVtcy5sZW5ndGgsZT1OdW1iZXIodGhpcy5pbmRleE9mKHRoaXMuZm9jdXNlZEl0ZW0pKSxuPTE7bjx0KzE7bisrKXt2YXIgaT10aGlzLml0ZW1zWyhlK24pJXRdO2lmKCFpLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIHI9WWkoaSkuZ2V0T3duZXJSb290KCl8fGRvY3VtZW50O2lmKHRoaXMuX3NldEZvY3VzZWRJdGVtKGkpLFlpKHIpLmFjdGl2ZUVsZW1lbnQ9PWkpcmV0dXJufX19LF9hcHBseVNlbGVjdGlvbjpmdW5jdGlvbih0LGUpe3Quc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIixlPyJ0cnVlIjoiZmFsc2UiKSxqby5fYXBwbHlTZWxlY3Rpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfZm9jdXNlZEl0ZW1DaGFuZ2VkOmZ1bmN0aW9uKHQsZSl7ZSYmZS5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKSwhdHx8dC5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIil8fHRoaXMuZGlzYWJsZWR8fCh0LnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCIwIiksdC5mb2N1cygpKX0sX29uSXJvbkl0ZW1zQ2hhbmdlZDpmdW5jdGlvbih0KXt0LmRldGFpbC5hZGRlZE5vZGVzLmxlbmd0aCYmdGhpcy5fcmVzZXRUYWJpbmRpY2VzKCl9LF9vblNoaWZ0VGFiRG93bjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKTtaYS5fc2hpZnRUYWJQcmVzc2VkPSEwLHRoaXMuX3NldEZvY3VzZWRJdGVtKG51bGwpLHRoaXMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIi0xIiksdGhpcy5hc3luYygoZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLGUpLFphLl9zaGlmdFRhYlByZXNzZWQ9ITF9KSwxKX0sX29uRm9jdXM6ZnVuY3Rpb24odCl7aWYoIVphLl9zaGlmdFRhYlByZXNzZWQpe3ZhciBlPVlpKHQpLnJvb3RUYXJnZXQ7KGU9PT10aGlzfHx2b2lkIDA9PT1lLnRhYkluZGV4fHx0aGlzLmlzTGlnaHREZXNjZW5kYW50KGUpKSYmKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jPXRoaXMuYXN5bmMoKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5tdWx0aT90aGlzLnNlbGVjdGVkSXRlbXMmJnRoaXMuc2VsZWN0ZWRJdGVtc1swXTp0aGlzLnNlbGVjdGVkSXRlbTt0aGlzLl9zZXRGb2N1c2VkSXRlbShudWxsKSx0P3RoaXMuX3NldEZvY3VzZWRJdGVtKHQpOnRoaXMuaXRlbXNbMF0mJnRoaXMuX2ZvY3VzTmV4dCgpfSkpKX19LF9vblVwS2V5OmZ1bmN0aW9uKHQpe3RoaXMuX2ZvY3VzUHJldmlvdXMoKSx0LmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LF9vbkRvd25LZXk6ZnVuY3Rpb24odCl7dGhpcy5fZm9jdXNOZXh0KCksdC5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25Fc2NLZXk6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5mb2N1c2VkSXRlbTtlJiZlLmJsdXIoKX0sX29uS2V5ZG93bjpmdW5jdGlvbih0KXt0aGlzLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyh0LCJ1cCBkb3duIGVzYyIpfHx0aGlzLl9mb2N1c1dpdGhLZXlib2FyZEV2ZW50KHQpLHQuc3RvcFByb3BhZ2F0aW9uKCl9LF9hY3RpdmF0ZUhhbmRsZXI6ZnVuY3Rpb24odCl7am8uX2FjdGl2YXRlSGFuZGxlci5jYWxsKHRoaXMsdCksdC5zdG9wUHJvcGFnYXRpb24oKX0sX2Rpc2FibGVkQ2hhbmdlZDpmdW5jdGlvbih0KXt0Pyh0aGlzLl9wcmV2aW91c1RhYkluZGV4PXRoaXMuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpP3RoaXMudGFiSW5kZXg6MCx0aGlzLnJlbW92ZUF0dHJpYnV0ZSgidGFiaW5kZXgiKSk6dGhpcy5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iil8fHRoaXMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsdGhpcy5fcHJldmlvdXNUYWJJbmRleCl9LF9zaGlmdFRhYlByZXNzZWQ6ITF9LEphPVtbam8sS2FdLHpvLFphXTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovClJyKHtfdGVtcGxhdGU6X2VgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiA4cHggMDsKCiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItbGlzdGJveC1iYWNrZ3JvdW5kLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3IpKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItbGlzdGJveC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWxpc3Rib3g7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgpgLGlzOiJwYXBlci1saXN0Ym94IixiZWhhdmlvcnM6W0phXSxob3N0QXR0cmlidXRlczp7cm9sZToibGlzdGJveCJ9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBRYT1fZWAKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLW1hdGVyaWFsLXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMSJdKSB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjIiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tNGRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIzIl0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTZkcDsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iNCJdKSB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi04ZHA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjUiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CmA7UWEuc2V0QXR0cmlidXRlKCJzdHlsZSIsImRpc3BsYXk6IG5vbmU7IiksZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChRYS5jb250ZW50KSwKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovClJyKHtfdGVtcGxhdGU6X2VgCiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItbWF0ZXJpYWwtc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoW2FuaW1hdGVkXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy10cmFuc2l0aW9uOwogICAgICB9CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CmAsaXM6InBhcGVyLW1hdGVyaWFsIixwcm9wZXJ0aWVzOntlbGV2YXRpb246e3R5cGU6TnVtYmVyLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZToxfSxhbmltYXRlZDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMX19fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCB0cz17cHJvcGVydGllczp7dmFsdWU6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sbWluOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sbWF4Ont0eXBlOk51bWJlcix2YWx1ZToxMDAsbm90aWZ5OiEwfSxzdGVwOnt0eXBlOk51bWJlcix2YWx1ZToxLG5vdGlmeTohMH0scmF0aW86e3R5cGU6TnVtYmVyLHZhbHVlOjAscmVhZE9ubHk6ITAsbm90aWZ5OiEwfX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZSh2YWx1ZSwgbWluLCBtYXgsIHN0ZXApIl0sX2NhbGNSYXRpbzpmdW5jdGlvbih0KXtyZXR1cm4odGhpcy5fY2xhbXBWYWx1ZSh0KS10aGlzLm1pbikvKHRoaXMubWF4LXRoaXMubWluKX0sX2NsYW1wVmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgubWluKHRoaXMubWF4LE1hdGgubWF4KHRoaXMubWluLHRoaXMuX2NhbGNTdGVwKHQpKSl9LF9jYWxjU3RlcDpmdW5jdGlvbih0KXtpZih0PXBhcnNlRmxvYXQodCksIXRoaXMuc3RlcClyZXR1cm4gdDt2YXIgZT1NYXRoLnJvdW5kKCh0LXRoaXMubWluKS90aGlzLnN0ZXApO3JldHVybiB0aGlzLnN0ZXA8MT9lLygxL3RoaXMuc3RlcCkrdGhpcy5taW46ZSp0aGlzLnN0ZXArdGhpcy5taW59LF92YWxpZGF0ZVZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnZhbHVlKTtyZXR1cm4gdGhpcy52YWx1ZT10aGlzLm9sZFZhbHVlPWlzTmFOKHQpP3RoaXMub2xkVmFsdWU6dCx0aGlzLnZhbHVlIT09dH0sX3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX3ZhbGlkYXRlVmFsdWUoKSx0aGlzLl9zZXRSYXRpbygxMDAqdGhpcy5fY2FsY1JhdGlvKHRoaXMudmFsdWUpKX19OwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9Scih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDIwMHB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSksIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgICNwcm9ncmVzc0NvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItcHJvZ3Jlc3MtY29udGFpbmVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzQ29udGFpbmVyLAogICAgICAvKiB0aGUgc3RyaXBlIGZvciB0aGUgaW5kZXRlcm1pbmF0ZSBhbmltYXRpb24qLwogICAgICAuaW5kZXRlcm1pbmF0ZTo6YWZ0ZXIgewogICAgICAgIGhlaWdodDogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtaGVpZ2h0LCA0cHgpOwogICAgICB9CgogICAgICAjcHJpbWFyeVByb2dyZXNzLAogICAgICAjc2Vjb25kYXJ5UHJvZ3Jlc3MsCiAgICAgIC5pbmRldGVybWluYXRlOjphZnRlciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZpdDsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzQ29udGFpbmVyLAogICAgICAuaW5kZXRlcm1pbmF0ZTo6YWZ0ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWNvbnRhaW5lci1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZXktMzAwKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KC50cmFuc2l0aW5nKSAjcHJpbWFyeVByb2dyZXNzLAogICAgICA6aG9zdCgudHJhbnNpdGluZykgI3NlY29uZGFyeVByb2dyZXNzIHsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IC13ZWJraXQtdHJhbnNmb3JtOwogICAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybTsKCiAgICAgICAgLyogRHVyYXRpb24gKi8KICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tZHVyYXRpb24sIDAuMDhzKTsKICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLWR1cmF0aW9uLCAwLjA4cyk7CgogICAgICAgIC8qIFRpbWluZyBmdW5jdGlvbiAqLwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uLCBlYXNlKTsKICAgICAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24sIGVhc2UpOwoKICAgICAgICAvKiBEZWxheSAqLwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1kZWxheTogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi1kZWxheSwgMHMpOwogICAgICAgIHRyYW5zaXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tZGVsYXksIDBzKTsKICAgICAgfQoKICAgICAgI3ByaW1hcnlQcm9ncmVzcywKICAgICAgI3NlY29uZGFyeVByb2dyZXNzIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgwKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgwKTsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAjcHJpbWFyeVByb2dyZXNzIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1wcm9ncmVzcy1hY3RpdmUtY29sb3IsIHZhcigtLWdvb2dsZS1ncmVlbi01MDApKTsKICAgICAgfQoKICAgICAgI3NlY29uZGFyeVByb2dyZXNzIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1wcm9ncmVzcy1zZWNvbmRhcnktY29sb3IsIHZhcigtLWdvb2dsZS1ncmVlbi0xMDApKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgI3ByaW1hcnlQcm9ncmVzcyB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtZGlzYWJsZWQtYWN0aXZlLWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JleS01MDApKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgI3NlY29uZGFyeVByb2dyZXNzIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1wcm9ncmVzcy1kaXNhYmxlZC1zZWNvbmRhcnktY29sb3IsIHZhcigtLWdvb2dsZS1ncmV5LTMwMCkpOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtkaXNhYmxlZF0pKSAjcHJpbWFyeVByb2dyZXNzLmluZGV0ZXJtaW5hdGUgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgY2VudGVyOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogaW5kZXRlcm1pbmF0ZS1iYXIgdmFyKC0tcGFwZXItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZS1jeWNsZS1kdXJhdGlvbiwgMnMpIGxpbmVhciBpbmZpbml0ZTsKICAgICAgICBhbmltYXRpb246IGluZGV0ZXJtaW5hdGUtYmFyIHZhcigtLXBhcGVyLXByb2dyZXNzLWluZGV0ZXJtaW5hdGUtY3ljbGUtZHVyYXRpb24sIDJzKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIDpob3N0KDpub3QoW2Rpc2FibGVkXSkpICNwcmltYXJ5UHJvZ3Jlc3MuaW5kZXRlcm1pbmF0ZTo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOwoKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogaW5kZXRlcm1pbmF0ZS1zcGxpdHRlciB2YXIoLS1wYXBlci1wcm9ncmVzcy1pbmRldGVybWluYXRlLWN5Y2xlLWR1cmF0aW9uLCAycykgbGluZWFyIGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbjogaW5kZXRlcm1pbmF0ZS1zcGxpdHRlciB2YXIoLS1wYXBlci1wcm9ncmVzcy1pbmRldGVybWluYXRlLWN5Y2xlLWR1cmF0aW9uLCAycykgbGluZWFyIGluZmluaXRlOwogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgaW5kZXRlcm1pbmF0ZS1iYXIgewogICAgICAgIDAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgtMTAwJSk7CiAgICAgICAgfQogICAgICAgIDUwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgIH0KICAgICAgICA3NSUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKC4yOCwuNjIsLjM3LC45MSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgwKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBpbmRldGVybWluYXRlLXNwbGl0dGVyIHsKICAgICAgICAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgtMTI1JSk7CiAgICAgICAgfQogICAgICAgIDMwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgtMTI1JSk7CiAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllciguNDIsMCwuNiwuOCk7CiAgICAgICAgfQogICAgICAgIDkwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgxMjUlKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgxMjUlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgaW5kZXRlcm1pbmF0ZS1iYXIgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoLTEwMCUpOwogICAgICAgIH0KICAgICAgICA1MCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgfQogICAgICAgIDc1JSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllciguMjgsLjYyLC4zNywuOTEpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDApIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBpbmRldGVybWluYXRlLXNwbGl0dGVyIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoLTEyNSUpOwogICAgICAgIH0KICAgICAgICAzMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKC0xMjUlKTsKICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllciguNDIsMCwuNiwuOCk7CiAgICAgICAgfQogICAgICAgIDkwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoMTI1JSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKDEyNSUpOwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJwcm9ncmVzc0NvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9InNlY29uZGFyeVByb2dyZXNzIiBoaWRkZW5cJD0iW1tfaGlkZVNlY29uZGFyeVByb2dyZXNzKHNlY29uZGFyeVJhdGlvKV1dIj48L2Rpdj4KICAgICAgPGRpdiBpZD0icHJpbWFyeVByb2dyZXNzIj48L2Rpdj4KICAgIDwvZGl2PgpgLGlzOiJwYXBlci1wcm9ncmVzcyIsYmVoYXZpb3JzOlt0c10scHJvcGVydGllczp7c2Vjb25kYXJ5UHJvZ3Jlc3M6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LHNlY29uZGFyeVJhdGlvOnt0eXBlOk51bWJlcix2YWx1ZTowLHJlYWRPbmx5OiEwfSxpbmRldGVybWluYXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il90b2dnbGVJbmRldGVybWluYXRlIn0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsb2JzZXJ2ZXI6Il9kaXNhYmxlZENoYW5nZWQifX0sb2JzZXJ2ZXJzOlsiX3Byb2dyZXNzQ2hhbmdlZChzZWNvbmRhcnlQcm9ncmVzcywgdmFsdWUsIG1pbiwgbWF4LCBpbmRldGVybWluYXRlKSJdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJwcm9ncmVzc2JhciJ9LF90b2dnbGVJbmRldGVybWluYXRlOmZ1bmN0aW9uKHQpe3RoaXMudG9nZ2xlQ2xhc3MoImluZGV0ZXJtaW5hdGUiLHQsdGhpcy4kLnByaW1hcnlQcm9ncmVzcyl9LF90cmFuc2Zvcm1Qcm9ncmVzczpmdW5jdGlvbih0LGUpe3Quc3R5bGUudHJhbnNmb3JtPXQuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJzY2FsZVgoIitlLzEwMCsiKSJ9LF9tYWluUmF0aW9DaGFuZ2VkOmZ1bmN0aW9uKHQpe3RoaXMuX3RyYW5zZm9ybVByb2dyZXNzKHRoaXMuJC5wcmltYXJ5UHJvZ3Jlc3MsdCl9LF9wcm9ncmVzc0NoYW5nZWQ6ZnVuY3Rpb24odCxlLG4saSxyKXt0PXRoaXMuX2NsYW1wVmFsdWUodCksZT10aGlzLl9jbGFtcFZhbHVlKGUpO3ZhciBvPTEwMCp0aGlzLl9jYWxjUmF0aW8odCksYT0xMDAqdGhpcy5fY2FsY1JhdGlvKGUpO3RoaXMuX3NldFNlY29uZGFyeVJhdGlvKG8pLHRoaXMuX3RyYW5zZm9ybVByb2dyZXNzKHRoaXMuJC5zZWNvbmRhcnlQcm9ncmVzcyxvKSx0aGlzLl90cmFuc2Zvcm1Qcm9ncmVzcyh0aGlzLiQucHJpbWFyeVByb2dyZXNzLGEpLHRoaXMuc2Vjb25kYXJ5UHJvZ3Jlc3M9dCxyP3RoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLXZhbHVlbm93Iik6dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVub3ciLGUpLHRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbWluIixuKSx0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW1heCIsaSl9LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24odCl7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiLHQ/InRydWUiOiJmYWxzZSIpfSxfaGlkZVNlY29uZGFyeVByb2dyZXNzOmZ1bmN0aW9uKHQpe3JldHVybiAwPT09dH19KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgZXM9X2VgCjxzdHlsZT4KICA6aG9zdCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBsaW5lLWhlaWdodDogMDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1zaXplOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tc2l6ZSwgMTZweCk7CiAgICAvKiAtMXB4IGlzIGEgc2VudGluZWwgZm9yIHRoZSBkZWZhdWx0IGFuZCBpcyByZXBsYWNlIGluIFxgYXR0YWNoZWRcYC4gKi8KICAgIC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemU6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZSwgLTFweCk7CiAgfQoKICA6aG9zdCg6Zm9jdXMpIHsKICAgIG91dGxpbmU6IG5vbmU7CiAgfQoKICAjcmFkaW9Db250YWluZXIgewogICAgQGFwcGx5IC0tbGF5b3V0LWlubGluZTsKICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItY2VudGVyOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemUpOwogICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1zaXplKTsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgogICAgQGFwcGx5IC0tcGFwZXItcmFkaW8tYnV0dG9uLXJhZGlvLWNvbnRhaW5lcjsKICB9CgogICNpbmsgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA1MCU7CiAgICBsZWZ0OiA1MCU7CiAgICByaWdodDogYXV0bzsKICAgIHdpZHRoOiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZSk7CiAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplKTsKICAgIGNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICBvcGFjaXR5OiAwLjY7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICB9CgogICNpbmtbY2hlY2tlZF0gewogICAgY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogIH0KCiAgI29mZlJhZGlvLCAjb25SYWRpbyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgdG9wOiAwOwogICAgbGVmdDogMDsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogIH0KCiAgI29mZlJhZGlvIHsKICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLXVuY2hlY2tlZC1iYWNrZ3JvdW5kLWNvbG9yLCB0cmFuc3BhcmVudCk7CiAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4yOHM7CiAgfQoKICAjb25SYWRpbyB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApOwogICAgdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIGVhc2UgMC4yOHM7CiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gZWFzZSAwLjI4czsKICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgfQoKICA6aG9zdChbY2hlY2tlZF0pICNvZmZSYWRpbyB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgfQoKICA6aG9zdChbY2hlY2tlZF0pICNvblJhZGlvIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLjUpOwogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjUpOwogIH0KCiAgI3JhZGlvTGFiZWwgewogICAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICBtYXJnaW4tbGVmdDogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWxhYmVsLXNwYWNpbmcsIDEwcHgpOwogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgIGNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwoKICAgIEBhcHBseSAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbDsKICB9CgogIDpob3N0KFtjaGVja2VkXSkgI3JhZGlvTGFiZWwgewogICAgQGFwcGx5IC0tcGFwZXItcmFkaW8tYnV0dG9uLWxhYmVsLWNoZWNrZWQ7CiAgfQoKICAjcmFkaW9MYWJlbDpkaXIocnRsKSB7CiAgICBtYXJnaW4tbGVmdDogMDsKICAgIG1hcmdpbi1yaWdodDogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWxhYmVsLXNwYWNpbmcsIDEwcHgpOwogIH0KCiAgI3JhZGlvTGFiZWxbaGlkZGVuXSB7CiAgICBkaXNwbGF5OiBub25lOwogIH0KCiAgLyogZGlzYWJsZWQgc3RhdGUgKi8KCiAgOmhvc3QoW2Rpc2FibGVkXSkgI29mZlJhZGlvIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICBvcGFjaXR5OiAwLjU7CiAgfQoKICA6aG9zdChbZGlzYWJsZWRdW2NoZWNrZWRdKSAjb25SYWRpbyB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgIG9wYWNpdHk6IDAuNTsKICB9CgogIDpob3N0KFtkaXNhYmxlZF0pICNyYWRpb0xhYmVsIHsKICAgIC8qIHNsaWdodGx5IGRhcmtlciB0aGFuIHRoZSBidXR0b24sIHNvIHRoYXQgaXQncyByZWFkYWJsZSAqLwogICAgb3BhY2l0eTogMC42NTsKICB9Cjwvc3R5bGU+Cgo8ZGl2IGlkPSJyYWRpb0NvbnRhaW5lciI+CiAgPGRpdiBpZD0ib2ZmUmFkaW8iPjwvZGl2PgogIDxkaXYgaWQ9Im9uUmFkaW8iPjwvZGl2Pgo8L2Rpdj4KCjxkaXYgaWQ9InJhZGlvTGFiZWwiPjxzbG90Pjwvc2xvdD48L2Rpdj5gO2VzLnNldEF0dHJpYnV0ZSgic3RyaXAtd2hpdGVzcGFjZSIsIiIpLFJyKHtfdGVtcGxhdGU6ZXMsaXM6InBhcGVyLXJhZGlvLWJ1dHRvbiIsYmVoYXZpb3JzOlt1YV0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InJhZGlvIiwiYXJpYS1jaGVja2VkIjohMSx0YWJpbmRleDowfSxwcm9wZXJ0aWVzOnthcmlhQWN0aXZlQXR0cmlidXRlOnt0eXBlOlN0cmluZyx2YWx1ZToiYXJpYS1jaGVja2VkIn19LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fcmlwcGxlQ29udGFpbmVyPXRoaXMuJC5yYWRpb0NvbnRhaW5lcn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXtMaSh0aGlzLChmdW5jdGlvbigpe2lmKCItMXB4Ij09PXRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCItLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplIikudHJpbSgpKXt2YXIgdD1wYXJzZUZsb2F0KHRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCItLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemUiKS50cmltKCkpLGU9TWF0aC5mbG9vcigzKnQpO2UlMiE9dCUyJiZlKyssdGhpcy51cGRhdGVTdHlsZXMoeyItLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZSI6ZSsicHgifSl9fSkpfX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgbnM9e2hvc3RBdHRyaWJ1dGVzOntyb2xlOiJtZW51YmFyIn0sa2V5QmluZGluZ3M6e2xlZnQ6Il9vbkxlZnRLZXkiLHJpZ2h0OiJfb25SaWdodEtleSJ9LF9vblVwS2V5OmZ1bmN0aW9uKHQpe3RoaXMuZm9jdXNlZEl0ZW0uY2xpY2soKSx0LmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LF9vbkRvd25LZXk6ZnVuY3Rpb24odCl7dGhpcy5mb2N1c2VkSXRlbS5jbGljaygpLHQuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sZ2V0IF9pc1JUTCgpe3JldHVybiJydGwiPT09d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcykuZGlyZWN0aW9ufSxfb25MZWZ0S2V5OmZ1bmN0aW9uKHQpe3RoaXMuX2lzUlRMP3RoaXMuX2ZvY3VzTmV4dCgpOnRoaXMuX2ZvY3VzUHJldmlvdXMoKSx0LmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LF9vblJpZ2h0S2V5OmZ1bmN0aW9uKHQpe3RoaXMuX2lzUlRMP3RoaXMuX2ZvY3VzUHJldmlvdXMoKTp0aGlzLl9mb2N1c05leHQoKSx0LmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LF9vbktleWRvd246ZnVuY3Rpb24odCl7dGhpcy5rZXlib2FyZEV2ZW50TWF0Y2hlc0tleXModCwidXAgZG93biBsZWZ0IHJpZ2h0IGVzYyIpfHx0aGlzLl9mb2N1c1dpdGhLZXlib2FyZEV2ZW50KHQpfX0saXM9W0phLG5zXTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovClJyKHtfdGVtcGxhdGU6X2VgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgcGFkZGluZzogdmFyKC0tcGFwZXItcmFkaW8tZ3JvdXAtaXRlbS1wYWRkaW5nLCAxMnB4KTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CmAsaXM6InBhcGVyLXJhZGlvLWdyb3VwIixiZWhhdmlvcnM6W2lzXSxob3N0QXR0cmlidXRlczp7cm9sZToicmFkaW9ncm91cCJ9LHByb3BlcnRpZXM6e2F0dHJGb3JTZWxlY3RlZDp7dHlwZTpTdHJpbmcsdmFsdWU6Im5hbWUifSxzZWxlY3RlZEF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImNoZWNrZWQifSxzZWxlY3RhYmxlOnt0eXBlOlN0cmluZyx2YWx1ZToicGFwZXItcmFkaW8tYnV0dG9uIn0sYWxsb3dFbXB0eVNlbGVjdGlvbjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sc2VsZWN0OmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3ZhbHVlVG9JdGVtKHQpO2lmKCFlfHwhZS5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIikpe2lmKHRoaXMuc2VsZWN0ZWQpe3ZhciBuPXRoaXMuX3ZhbHVlVG9JdGVtKHRoaXMuc2VsZWN0ZWQpO2lmKHRoaXMuc2VsZWN0ZWQ9PXQpe2lmKCF0aGlzLmFsbG93RW1wdHlTZWxlY3Rpb24pcmV0dXJuIHZvaWQobiYmKG4uY2hlY2tlZD0hMCkpO3Q9IiJ9biYmKG4uY2hlY2tlZD0hMSl9am8uc2VsZWN0LmFwcGx5KHRoaXMsW3RdKSx0aGlzLmZpcmUoInBhcGVyLXJhZGlvLWdyb3VwLWNoYW5nZWQiKX19LF9hY3RpdmF0ZUZvY3VzZWRJdGVtOmZ1bmN0aW9uKCl7dGhpcy5faXRlbUFjdGl2YXRlKHRoaXMuX3ZhbHVlRm9ySXRlbSh0aGlzLmZvY3VzZWRJdGVtKSx0aGlzLmZvY3VzZWRJdGVtKX0sX29uVXBLZXk6ZnVuY3Rpb24odCl7dGhpcy5fZm9jdXNQcmV2aW91cygpLHQucHJldmVudERlZmF1bHQoKSx0aGlzLl9hY3RpdmF0ZUZvY3VzZWRJdGVtKCl9LF9vbkRvd25LZXk6ZnVuY3Rpb24odCl7dGhpcy5fZm9jdXNOZXh0KCksdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX0sX29uTGVmdEtleTpmdW5jdGlvbih0KXtucy5fb25MZWZ0S2V5LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9hY3RpdmF0ZUZvY3VzZWRJdGVtKCl9LF9vblJpZ2h0S2V5OmZ1bmN0aW9uKHQpe25zLl9vblJpZ2h0S2V5LmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9hY3RpdmF0ZUZvY3VzZWRJdGVtKCl9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBycz1fZWAKICA8c3R5bGU+CiAgICA6aG9zdCB7CiAgICAgIEBhcHBseSAtLWxheW91dDsKICAgICAgQGFwcGx5IC0tbGF5b3V0LWp1c3RpZmllZDsKICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgd2lkdGg6IDIwMHB4OwogICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTsKICAgICAgLS1wYXBlci1wcm9ncmVzcy1hY3RpdmUtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgICAtLXBhcGVyLXByb2dyZXNzLXNlY29uZGFyeS1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtMzAwKSk7CiAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtZGlzYWJsZWQtYWN0aXZlLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItZGlzYWJsZWQtYWN0aXZlLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICAtLXBhcGVyLXByb2dyZXNzLWRpc2FibGVkLXNlY29uZGFyeS1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWRpc2FibGVkLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQ6IHZhcigtLXBhcGVyLXNsaWRlci1oZWlnaHQsIDJweCk7CiAgICB9CgogICAgLyogZm9jdXMgc2hvd3MgdGhlIHJpcHBsZSAqLwogICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgIG91dGxpbmU6IG5vbmU7CiAgICB9CgogICAgLyoqCiAgICAgICogTk9URShrZWFudWxlZSk6IFRob3VnaCA6aG9zdC1jb250ZXh0IGlzIG5vdCB1bml2ZXJzYWxseSBzdXBwb3J0ZWQsIHNvbWUgcGFnZXMKICAgICAgKiBzdGlsbCByZWx5IG9uIHBhcGVyLXNsaWRlciBiZWluZyBmbGlwcGVkIHdoZW4gZGlyPSJydGwiIGlzIHNldCBvbiBib2R5LiBGb3IgZnVsbAogICAgICAqIGNvbXBhdGliaWxpdHksIGRpcj0icnRsIiBtdXN0IGJlIGV4cGxpY2l0bHkgc2V0IG9uIHBhcGVyLXNsaWRlci4KICAgICAgKi8KICAgIDpkaXIocnRsKSAjc2xpZGVyQ29udGFpbmVyIHsKICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgtMSk7CiAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC0xKTsKICAgIH0KCiAgICAvKioKICAgICAgKiBOT1RFKGtlYW51bGVlKTogVGhpcyBpcyBzZXBhcmF0ZSBmcm9tIHRoZSBydWxlIGFib3ZlIGJlY2F1c2UgOmhvc3QtY29udGV4dCBtYXkKICAgICAgKiBub3QgYmUgcmVjb2duaXplZC4KICAgICAgKi8KICAgIDpob3N0KFtkaXI9InJ0bCJdKSAjc2xpZGVyQ29udGFpbmVyIHsKICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgtMSk7CiAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC0xKTsKICAgIH0KCiAgICAvKioKICAgICAgKiBOT1RFKGtlYW51bGVlKTogTmVlZGVkIHRvIG92ZXJyaWRlIHRoZSA6aG9zdC1jb250ZXh0IHJ1bGUgKHdoZXJlIHN1cHBvcnRlZCkKICAgICAgKiB0byBzdXBwb3J0IExUUiBzbGlkZXJzIGluIFJUTCBwYWdlcy4KICAgICAgKi8KICAgIDpob3N0KFtkaXI9Imx0ciJdKSAjc2xpZGVyQ29udGFpbmVyIHsKICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgxKTsKICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSk7CiAgICB9CgogICAgI3NsaWRlckNvbnRhaW5lciB7CiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIGhlaWdodDogY2FsYygzMHB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KSk7CiAgICAgIG1hcmdpbi1sZWZ0OiBjYWxjKDE1cHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgICBtYXJnaW4tcmlnaHQ6IGNhbGMoMTVweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICB9CgogICAgI3NsaWRlckNvbnRhaW5lcjpmb2N1cyB7CiAgICAgIG91dGxpbmU6IDA7CiAgICB9CgogICAgI3NsaWRlckNvbnRhaW5lci5lZGl0YWJsZSB7CiAgICAgIG1hcmdpbi10b3A6IDEycHg7CiAgICAgIG1hcmdpbi1ib3R0b206IDEycHg7CiAgICB9CgogICAgLmJhci1jb250YWluZXIgewogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHRvcDogMDsKICAgICAgYm90dG9tOiAwOwogICAgICBsZWZ0OiAwOwogICAgICByaWdodDogMDsKICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIH0KCiAgICAucmluZyA+IC5iYXItY29udGFpbmVyIHsKICAgICAgbGVmdDogY2FsYyg1cHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgICB0cmFuc2l0aW9uOiBsZWZ0IDAuMThzIGVhc2U7CiAgICB9CgogICAgLnJpbmcuZXhwYW5kLmRyYWdnaW5nID4gLmJhci1jb250YWluZXIgewogICAgICB0cmFuc2l0aW9uOiBub25lOwogICAgfQoKICAgIC5yaW5nLmV4cGFuZDpub3QoLnBpbikgPiAuYmFyLWNvbnRhaW5lciB7CiAgICAgIGxlZnQ6IGNhbGMoOHB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgIH0KCiAgICAjc2xpZGVyQmFyIHsKICAgICAgcGFkZGluZzogMTVweCAwOwogICAgICB3aWR0aDogMTAwJTsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWJhci1jb2xvciwgdHJhbnNwYXJlbnQpOwogICAgICAtLXBhcGVyLXByb2dyZXNzLWNvbnRhaW5lci1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWNvbnRhaW5lci1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgLS1wYXBlci1wcm9ncmVzcy1oZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCk7CiAgICB9CgogICAgLnNsaWRlci1tYXJrZXJzIHsKICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAvKiBzbGlkZXIta25vYiBpcyAzMHB4ICsgdGhlIHNsaWRlci1oZWlnaHQgc28gdGhhdCB0aGUgbWFya2VycyBzaG91bGQgc3RhcnQgYXQgYSBvZmZzZXQgb2YgMTVweCovCiAgICAgIHRvcDogMTVweDsKICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpOwogICAgICBsZWZ0OiAwOwogICAgICByaWdodDogLTFweDsKICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgfQoKICAgIC5zbGlkZXItbWFya2VyIHsKICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICB9CiAgICAuc2xpZGVyLW1hcmtlcnM6OmFmdGVyLAogICAgLnNsaWRlci1tYXJrZXI6OmFmdGVyIHsKICAgICAgY29udGVudDogIiI7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICBtYXJnaW4tbGVmdDogLTFweDsKICAgICAgd2lkdGg6IDJweDsKICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpOwogICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1tYXJrZXJzLWNvbG9yLCAjMDAwKTsKICAgIH0KCiAgICAuc2xpZGVyLWtub2IgewogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIGxlZnQ6IDA7CiAgICAgIHRvcDogMDsKICAgICAgbWFyZ2luLWxlZnQ6IGNhbGMoLTE1cHggLSB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgICB3aWR0aDogY2FsYygzMHB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KSk7CiAgICAgIGhlaWdodDogY2FsYygzMHB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KSk7CiAgICB9CgogICAgLnRyYW5zaXRpbmcgPiAuc2xpZGVyLWtub2IgewogICAgICB0cmFuc2l0aW9uOiBsZWZ0IDAuMDhzIGVhc2U7CiAgICB9CgogICAgLnNsaWRlci1rbm9iOmZvY3VzIHsKICAgICAgb3V0bGluZTogbm9uZTsKICAgIH0KCiAgICAuc2xpZGVyLWtub2IuZHJhZ2dpbmcgewogICAgICB0cmFuc2l0aW9uOiBub25lOwogICAgfQoKICAgIC5zbmFwcyA+IC5zbGlkZXIta25vYi5kcmFnZ2luZyB7CiAgICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuMDhzIGVhc2U7CiAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjA4cyBlYXNlOwogICAgfQoKICAgIC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgIG1hcmdpbjogMTBweDsKICAgICAgd2lkdGg6IGNhbGMoMTAwJSAtIDIwcHgpOwogICAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDIwcHgpOwogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNzAwKSk7CiAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwoKICAgICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwoKICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm0sIGJhY2tncm91bmQtY29sb3IsIGJvcmRlcjsKICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXI7CiAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMThzOwogICAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsKICAgIH0KCiAgICAuZXhwYW5kOm5vdCgucGluKSA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLjUpOwogICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuNSk7CiAgICB9CgogICAgLnJpbmcgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXIgewogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvciwgdHJhbnNwYXJlbnQpOwogICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICB9CgogICAgLnNsaWRlci1rbm9iLWlubmVyOjpiZWZvcmUgewogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItcGluLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgIH0KCiAgICAucGluID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjpiZWZvcmUgewogICAgICBjb250ZW50OiAiIjsKICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB0b3A6IDA7CiAgICAgIGxlZnQ6IDUwJTsKICAgICAgbWFyZ2luLWxlZnQ6IC0xM3B4OwogICAgICB3aWR0aDogMjZweDsKICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICBib3JkZXItcmFkaXVzOiA1MCUgNTAlIDUwJSAwOwoKICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpIHNjYWxlKDApIHRyYW5zbGF0ZSgwKTsKICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICB9CgogICAgLnNsaWRlci1rbm9iLWlubmVyOjpiZWZvcmUsCiAgICAuc2xpZGVyLWtub2ItaW5uZXI6OmFmdGVyIHsKICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gLjE4cyBlYXNlLCBiYWNrZ3JvdW5kLWNvbG9yIC4xOHMgZWFzZTsKICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIC4xOHMgZWFzZSwgYmFja2dyb3VuZC1jb2xvciAuMThzIGVhc2U7CiAgICB9CgogICAgLnBpbi5yaW5nID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjpiZWZvcmUgewogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgfQoKICAgIC5waW4uZXhwYW5kID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjpiZWZvcmUgewogICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC00NWRlZykgc2NhbGUoMSkgdHJhbnNsYXRlKDE3cHgsIC0xN3B4KTsKICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgxKSB0cmFuc2xhdGUoMTdweCwgLTE3cHgpOwogICAgfQoKICAgIC5waW4gPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmFmdGVyIHsKICAgICAgY29udGVudDogYXR0cih2YWx1ZSk7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgdG9wOiAwOwogICAgICBsZWZ0OiA1MCU7CiAgICAgIG1hcmdpbi1sZWZ0OiAtMTZweDsKICAgICAgd2lkdGg6IDMycHg7CiAgICAgIGhlaWdodDogMjZweDsKICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICBjb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWZvbnQtY29sb3IsICNmZmYpOwogICAgICBmb250LXNpemU6IDEwcHg7CgogICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCkgdHJhbnNsYXRlKDApOwogICAgICB0cmFuc2Zvcm06IHNjYWxlKDApIHRyYW5zbGF0ZSgwKTsKICAgIH0KCiAgICAucGluLmV4cGFuZCA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lcjo6YWZ0ZXIgewogICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSkgdHJhbnNsYXRlKDAsIC0xN3B4KTsKICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKSB0cmFuc2xhdGUoMCwgLTE3cHgpOwogICAgfQoKICAgIC8qIHBhcGVyLWlucHV0ICovCiAgICAuc2xpZGVyLWlucHV0IHsKICAgICAgd2lkdGg6IDUwcHg7CiAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXNsaWRlci1pbnB1dC1jb250YWluZXItaW5wdXQ7CiAgICAgIH07CiAgICAgIEBhcHBseSAtLXBhcGVyLXNsaWRlci1pbnB1dDsKICAgIH0KCiAgICAvKiBkaXNhYmxlZCBzdGF0ZSAqLwogICAgI3NsaWRlckNvbnRhaW5lci5kaXNhYmxlZCB7CiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgfQoKICAgIC5kaXNhYmxlZCA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1kaXNhYmxlZC1rbm9iLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1zbGlkZXItZGlzYWJsZWQta25vYi1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoMC43NSwgMC43NSwgMSk7CiAgICAgIHRyYW5zZm9ybTogc2NhbGUzZCgwLjc1LCAwLjc1LCAxKTsKICAgIH0KCiAgICAuZGlzYWJsZWQucmluZyA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yLCB0cmFuc3BhcmVudCk7CiAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgIH0KCiAgICBwYXBlci1yaXBwbGUgewogICAgICBjb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgfQogIDwvc3R5bGU+CgogIDxkaXYgaWQ9InNsaWRlckNvbnRhaW5lciIgY2xhc3NcJD0iW1tfZ2V0Q2xhc3NOYW1lcyhkaXNhYmxlZCwgcGluLCBzbmFwcywgaW1tZWRpYXRlVmFsdWUsIG1pbiwgZXhwYW5kLCBkcmFnZ2luZywgdHJhbnNpdGluZywgZWRpdGFibGUpXV0iPgogICAgPGRpdiBjbGFzcz0iYmFyLWNvbnRhaW5lciI+CiAgICAgIDxwYXBlci1wcm9ncmVzcyBkaXNhYmxlZFwkPSJbW2Rpc2FibGVkXV0iIGlkPSJzbGlkZXJCYXIiIGFyaWEtaGlkZGVuPSJ0cnVlIiBtaW49IltbbWluXV0iIG1heD0iW1ttYXhdXSIgc3RlcD0iW1tzdGVwXV0iIHZhbHVlPSJbW2ltbWVkaWF0ZVZhbHVlXV0iIHNlY29uZGFyeS1wcm9ncmVzcz0iW1tzZWNvbmRhcnlQcm9ncmVzc11dIiBvbi1kb3duPSJfYmFyZG93biIgb24tdXA9Il9yZXNldEtub2IiIG9uLXRyYWNrPSJfYmFydHJhY2siIG9uLXRhcD0iX2JhcmNsaWNrIj4KICAgICAgPC9wYXBlci1wcm9ncmVzcz4KICAgIDwvZGl2PgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzbmFwc11dIj4KICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLW1hcmtlcnMiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbbWFya2Vyc11dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1tYXJrZXIiPjwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KCiAgICA8ZGl2IGlkPSJzbGlkZXJLbm9iIiBjbGFzcz0ic2xpZGVyLWtub2IiIG9uLWRvd249Il9rbm9iZG93biIgb24tdXA9Il9yZXNldEtub2IiIG9uLXRyYWNrPSJfb25UcmFjayIgb24tdHJhbnNpdGlvbmVuZD0iX2tub2JUcmFuc2l0aW9uRW5kIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXIta25vYi1pbm5lciIgdmFsdWVcJD0iW1tpbW1lZGlhdGVWYWx1ZV1dIj48L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2PgoKICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbZWRpdGFibGVdXSI+CiAgICA8cGFwZXItaW5wdXQgaWQ9ImlucHV0IiB0eXBlPSJudW1iZXIiIHN0ZXA9Iltbc3RlcF1dIiBtaW49IltbbWluXV0iIG1heD0iW1ttYXhdXSIgY2xhc3M9InNsaWRlci1pbnB1dCIgZGlzYWJsZWRcJD0iW1tkaXNhYmxlZF1dIiB2YWx1ZT0iW1tpbW1lZGlhdGVWYWx1ZV1dIiBvbi1jaGFuZ2U9Il9jaGFuZ2VWYWx1ZSIgb24ta2V5ZG93bj0iX2lucHV0S2V5RG93biIgbm8tbGFiZWwtZmxvYXQ+CiAgICA8L3BhcGVyLWlucHV0PgogIDwvdGVtcGxhdGU+CmA7cnMuc2V0QXR0cmlidXRlKCJzdHJpcC13aGl0ZXNwYWNlIiwiIiksUnIoe190ZW1wbGF0ZTpycyxpczoicGFwZXItc2xpZGVyIixiZWhhdmlvcnM6W3pvLHJhLGNhLHRzXSxwcm9wZXJ0aWVzOnt2YWx1ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sc25hcHM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LHBpbjp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sc2Vjb25kYXJ5UHJvZ3Jlc3M6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwLG9ic2VydmVyOiJfc2Vjb25kYXJ5UHJvZ3Jlc3NDaGFuZ2VkIn0sZWRpdGFibGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0saW1tZWRpYXRlVmFsdWU6e3R5cGU6TnVtYmVyLHZhbHVlOjAscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxtYXhNYXJrZXJzOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sZXhwYW5kOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVhZE9ubHk6ITB9LGlnbm9yZUJhclRvdWNoOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGRyYWdnaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSx0cmFuc2l0aW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVhZE9ubHk6ITB9LG1hcmtlcnM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19fSxvYnNlcnZlcnM6WyJfdXBkYXRlS25vYih2YWx1ZSwgbWluLCBtYXgsIHNuYXBzLCBzdGVwKSIsIl92YWx1ZUNoYW5nZWQodmFsdWUpIiwiX2ltbWVkaWF0ZVZhbHVlQ2hhbmdlZChpbW1lZGlhdGVWYWx1ZSkiLCJfdXBkYXRlTWFya2VycyhtYXhNYXJrZXJzLCBtaW4sIG1heCwgc25hcHMpIl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InNsaWRlciIsdGFiaW5kZXg6MH0sa2V5QmluZGluZ3M6e2xlZnQ6Il9sZWZ0S2V5IixyaWdodDoiX3JpZ2h0S2V5IiwiZG93biBwYWdlZG93biBob21lIjoiX2RlY3JlbWVudEtleSIsInVwIHBhZ2V1cCBlbmQiOiJfaW5jcmVtZW50S2V5In0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmlnbm9yZUJhclRvdWNoJiZvaSh0aGlzLiQuc2xpZGVyQmFyLCJhdXRvIil9LGluY3JlbWVudDpmdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnZhbHVlK3RoaXMuc3RlcCl9LGRlY3JlbWVudDpmdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnZhbHVlLXRoaXMuc3RlcCl9LF91cGRhdGVLbm9iOmZ1bmN0aW9uKHQsZSxuLGkscil7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVtaW4iLGUpLHRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbWF4IixuKSx0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW5vdyIsdCksdGhpcy5fcG9zaXRpb25Lbm9iKDEwMCp0aGlzLl9jYWxjUmF0aW8odCkpfSxfdmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJ2YWx1ZS1jaGFuZ2UiLHtjb21wb3NlZDohMH0pfSxfaW1tZWRpYXRlVmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kcmFnZ2luZz90aGlzLmZpcmUoImltbWVkaWF0ZS12YWx1ZS1jaGFuZ2UiLHtjb21wb3NlZDohMH0pOnRoaXMudmFsdWU9dGhpcy5pbW1lZGlhdGVWYWx1ZX0sX3NlY29uZGFyeVByb2dyZXNzQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuc2Vjb25kYXJ5UHJvZ3Jlc3M9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnNlY29uZGFyeVByb2dyZXNzKX0sX2V4cGFuZEtub2I6ZnVuY3Rpb24oKXt0aGlzLl9zZXRFeHBhbmQoITApfSxfcmVzZXRLbm9iOmZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxEZWJvdW5jZXIoImV4cGFuZEtub2IiKSx0aGlzLl9zZXRFeHBhbmQoITEpfSxfcG9zaXRpb25Lbm9iOmZ1bmN0aW9uKHQpe3RoaXMuX3NldEltbWVkaWF0ZVZhbHVlKHRoaXMuX2NhbGNTdGVwKHRoaXMuX2NhbGNLbm9iUG9zaXRpb24odCkpKSx0aGlzLl9zZXRSYXRpbygxMDAqdGhpcy5fY2FsY1JhdGlvKHRoaXMuaW1tZWRpYXRlVmFsdWUpKSx0aGlzLiQuc2xpZGVyS25vYi5zdHlsZS5sZWZ0PXRoaXMucmF0aW8rIiUiLHRoaXMuZHJhZ2dpbmcmJih0aGlzLl9rbm9ic3RhcnR4PXRoaXMucmF0aW8qdGhpcy5fdy8xMDAsdGhpcy50cmFuc2xhdGUzZCgwLDAsMCx0aGlzLiQuc2xpZGVyS25vYikpfSxfY2FsY0tub2JQb3NpdGlvbjpmdW5jdGlvbih0KXtyZXR1cm4odGhpcy5tYXgtdGhpcy5taW4pKnQvMTAwK3RoaXMubWlufSxfb25UcmFjazpmdW5jdGlvbih0KXtzd2l0Y2godC5zdG9wUHJvcGFnYXRpb24oKSx0LmRldGFpbC5zdGF0ZSl7Y2FzZSJzdGFydCI6dGhpcy5fdHJhY2tTdGFydCh0KTticmVhaztjYXNlInRyYWNrIjp0aGlzLl90cmFja1godCk7YnJlYWs7Y2FzZSJlbmQiOnRoaXMuX3RyYWNrRW5kKCl9fSxfdHJhY2tTdGFydDpmdW5jdGlvbih0KXt0aGlzLl9zZXRUcmFuc2l0aW5nKCExKSx0aGlzLl93PXRoaXMuJC5zbGlkZXJCYXIub2Zmc2V0V2lkdGgsdGhpcy5feD10aGlzLnJhdGlvKnRoaXMuX3cvMTAwLHRoaXMuX3N0YXJ0eD10aGlzLl94LHRoaXMuX2tub2JzdGFydHg9dGhpcy5fc3RhcnR4LHRoaXMuX21pbng9LXRoaXMuX3N0YXJ0eCx0aGlzLl9tYXh4PXRoaXMuX3ctdGhpcy5fc3RhcnR4LHRoaXMuJC5zbGlkZXJLbm9iLmNsYXNzTGlzdC5hZGQoImRyYWdnaW5nIiksdGhpcy5fc2V0RHJhZ2dpbmcoITApfSxfdHJhY2tYOmZ1bmN0aW9uKHQpe3RoaXMuZHJhZ2dpbmd8fHRoaXMuX3RyYWNrU3RhcnQodCk7dmFyIGU9TWF0aC5taW4odGhpcy5fbWF4eCxNYXRoLm1heCh0aGlzLl9taW54LHQuZGV0YWlsLmR4Kih0aGlzLl9pc1JUTD8tMToxKSkpO3RoaXMuX3g9dGhpcy5fc3RhcnR4K2U7dmFyIG49dGhpcy5fY2FsY1N0ZXAodGhpcy5fY2FsY0tub2JQb3NpdGlvbih0aGlzLl94L3RoaXMuX3cqMTAwKSk7dGhpcy5fc2V0SW1tZWRpYXRlVmFsdWUobik7dmFyIGk9dGhpcy5fY2FsY1JhdGlvKHRoaXMuaW1tZWRpYXRlVmFsdWUpKnRoaXMuX3ctdGhpcy5fa25vYnN0YXJ0eDt0aGlzLnRyYW5zbGF0ZTNkKGkrInB4IiwwLDAsdGhpcy4kLnNsaWRlcktub2IpfSxfdHJhY2tFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLiQuc2xpZGVyS25vYi5zdHlsZTt0aGlzLiQuc2xpZGVyS25vYi5jbGFzc0xpc3QucmVtb3ZlKCJkcmFnZ2luZyIpLHRoaXMuX3NldERyYWdnaW5nKCExKSx0aGlzLl9yZXNldEtub2IoKSx0aGlzLnZhbHVlPXRoaXMuaW1tZWRpYXRlVmFsdWUsdC50cmFuc2Zvcm09dC53ZWJraXRUcmFuc2Zvcm09IiIsdGhpcy5maXJlKCJjaGFuZ2UiLHtjb21wb3NlZDohMH0pfSxfa25vYmRvd246ZnVuY3Rpb24odCl7dGhpcy5fZXhwYW5kS25vYigpLHQucHJldmVudERlZmF1bHQoKSx0aGlzLmZvY3VzKCl9LF9iYXJ0cmFjazpmdW5jdGlvbih0KXt0aGlzLl9hbGxvd0JhckV2ZW50KHQpJiZ0aGlzLl9vblRyYWNrKHQpfSxfYmFyY2xpY2s6ZnVuY3Rpb24odCl7dGhpcy5fdz10aGlzLiQuc2xpZGVyQmFyLm9mZnNldFdpZHRoO3ZhciBlPXRoaXMuJC5zbGlkZXJCYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj0odC5kZXRhaWwueC1lLmxlZnQpL3RoaXMuX3cqMTAwO3RoaXMuX2lzUlRMJiYobj0xMDAtbik7dmFyIGk9dGhpcy5yYXRpbzt0aGlzLl9zZXRUcmFuc2l0aW5nKCEwKSx0aGlzLl9wb3NpdGlvbktub2IobiksaT09PXRoaXMucmF0aW8mJnRoaXMuX3NldFRyYW5zaXRpbmcoITEpLHRoaXMuYXN5bmMoKGZ1bmN0aW9uKCl7dGhpcy5maXJlKCJjaGFuZ2UiLHtjb21wb3NlZDohMH0pfSkpLHQucHJldmVudERlZmF1bHQoKSx0aGlzLmZvY3VzKCl9LF9iYXJkb3duOmZ1bmN0aW9uKHQpe3RoaXMuX2FsbG93QmFyRXZlbnQodCkmJih0aGlzLmRlYm91bmNlKCJleHBhbmRLbm9iIix0aGlzLl9leHBhbmRLbm9iLDYwKSx0aGlzLl9iYXJjbGljayh0KSl9LF9rbm9iVHJhbnNpdGlvbkVuZDpmdW5jdGlvbih0KXt0LnRhcmdldD09PXRoaXMuJC5zbGlkZXJLbm9iJiZ0aGlzLl9zZXRUcmFuc2l0aW5nKCExKX0sX3VwZGF0ZU1hcmtlcnM6ZnVuY3Rpb24odCxlLG4saSl7aXx8dGhpcy5fc2V0TWFya2VycyhbXSk7dmFyIHI9TWF0aC5yb3VuZCgobi1lKS90aGlzLnN0ZXApO3I+dCYmKHI9dCksKHI8MHx8IWlzRmluaXRlKHIpKSYmKHI9MCksdGhpcy5fc2V0TWFya2VycyhuZXcgQXJyYXkocikpfSxfbWVyZ2VDbGFzc2VzOmZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qua2V5cyh0KS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSkpLmpvaW4oIiAiKX0sX2dldENsYXNzTmFtZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWVyZ2VDbGFzc2VzKHtkaXNhYmxlZDp0aGlzLmRpc2FibGVkLHBpbjp0aGlzLnBpbixzbmFwczp0aGlzLnNuYXBzLHJpbmc6dGhpcy5pbW1lZGlhdGVWYWx1ZTw9dGhpcy5taW4sZXhwYW5kOnRoaXMuZXhwYW5kLGRyYWdnaW5nOnRoaXMuZHJhZ2dpbmcsdHJhbnNpdGluZzp0aGlzLnRyYW5zaXRpbmcsZWRpdGFibGU6dGhpcy5lZGl0YWJsZX0pfSxfYWxsb3dCYXJFdmVudDpmdW5jdGlvbih0KXtyZXR1cm4hdGhpcy5pZ25vcmVCYXJUb3VjaHx8dC5kZXRhaWwuc291cmNlRXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50fSxnZXQgX2lzUlRMKCl7cmV0dXJuIHZvaWQgMD09PXRoaXMuX19pc1JUTCYmKHRoaXMuX19pc1JUTD0icnRsIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLmRpcmVjdGlvbiksdGhpcy5fX2lzUlRMfSxfbGVmdEtleTpmdW5jdGlvbih0KXt0aGlzLl9pc1JUTD90aGlzLl9pbmNyZW1lbnRLZXkodCk6dGhpcy5fZGVjcmVtZW50S2V5KHQpfSxfcmlnaHRLZXk6ZnVuY3Rpb24odCl7dGhpcy5faXNSVEw/dGhpcy5fZGVjcmVtZW50S2V5KHQpOnRoaXMuX2luY3JlbWVudEtleSh0KX0sX2luY3JlbWVudEtleTpmdW5jdGlvbih0KXt0aGlzLmRpc2FibGVkfHwoImVuZCI9PT10LmRldGFpbC5rZXk/dGhpcy52YWx1ZT10aGlzLm1heDp0aGlzLmluY3JlbWVudCgpLHRoaXMuZmlyZSgiY2hhbmdlIiksdC5wcmV2ZW50RGVmYXVsdCgpKX0sX2RlY3JlbWVudEtleTpmdW5jdGlvbih0KXt0aGlzLmRpc2FibGVkfHwoImhvbWUiPT09dC5kZXRhaWwua2V5P3RoaXMudmFsdWU9dGhpcy5taW46dGhpcy5kZWNyZW1lbnQoKSx0aGlzLmZpcmUoImNoYW5nZSIpLHQucHJldmVudERlZmF1bHQoKSl9LF9jaGFuZ2VWYWx1ZTpmdW5jdGlvbih0KXt0aGlzLnZhbHVlPXQudGFyZ2V0LnZhbHVlLHRoaXMuZmlyZSgiY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0sX2lucHV0S2V5RG93bjpmdW5jdGlvbih0KXt0LnN0b3BQcm9wYWdhdGlvbigpfSxfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JpcHBsZUNvbnRhaW5lcj10aGlzLiQuc2xpZGVyS25vYixsYS5fY3JlYXRlUmlwcGxlLmNhbGwodGhpcyl9LF9mb2N1c2VkQ2hhbmdlZDpmdW5jdGlvbih0KXt0JiZ0aGlzLmVuc3VyZVJpcHBsZSgpLHRoaXMuaGFzUmlwcGxlKCkmJih0aGlzLl9yaXBwbGUuc3R5bGUuZGlzcGxheT10PyIiOiJub25lIix0aGlzLl9yaXBwbGUuaG9sZERvd249dCl9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBvcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpO29zLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJkaXNwbGF5OiBub25lOyIpLG9zLmlubmVySFRNTD0iPGRvbS1tb2R1bGUgaWQ9XCJwYXBlci1zcGlubmVyLXN0eWxlc1wiPlxuICA8dGVtcGxhdGU+XG4gICAgPHN0eWxlPlxuICAgICAgLypcbiAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICAgIC8qIFNUWUxFUyBGT1IgVEhFIFNQSU5ORVIgKi9cbiAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgICAgLypcbiAgICAgICAqIENvbnN0YW50czpcbiAgICAgICAqICAgICAgQVJDU0laRSAgICAgPSAyNzAgZGVncmVlcyAoYW1vdW50IG9mIGNpcmNsZSB0aGUgYXJjIHRha2VzIHVwKVxuICAgICAgICogICAgICBBUkNUSU1FICAgICA9IDEzMzNtcyAodGltZSBpdCB0YWtlcyB0byBleHBhbmQgYW5kIGNvbnRyYWN0IGFyYylcbiAgICAgICAqICAgICAgQVJDU1RBUlRST1QgPSAyMTYgZGVncmVlcyAoaG93IG11Y2ggdGhlIHN0YXJ0IGxvY2F0aW9uIG9mIHRoZSBhcmNcbiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgcm90YXRlIGVhY2ggdGltZSwgMjE2IGdpdmVzIHVzIGFcbiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1IHBvaW50ZWQgc3RhciBzaGFwZSAoaXQncyAzNjAvNSAqIDMpLlxuICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBhIDcgcG9pbnRlZCBzdGFyLCB3ZSBtaWdodCBkb1xuICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2MC83ICogMyA9IDE1NC4yODYpXG4gICAgICAgKiAgICAgIFNIUklOS19USU1FID0gNDAwbXNcbiAgICAgICAqL1xuXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB3aWR0aDogMjhweDtcbiAgICAgICAgaGVpZ2h0OiAyOHB4O1xuXG4gICAgICAgIC8qIDM2MCAqIEFSQ1RJTUUgLyAoQVJDU1RBUlRST1QgKyAoMzYwLUFSQ1NJWkUpKSAqL1xuICAgICAgICAtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uOiAxNTY4bXM7XG5cbiAgICAgICAgLyogQVJDVElNRSAqL1xuICAgICAgICAtLXBhcGVyLXNwaW5uZXItZXhwYW5kLWNvbnRyYWN0LWR1cmF0aW9uOiAxMzMzbXM7XG5cbiAgICAgICAgLyogNCAqIEFSQ1RJTUUgKi9cbiAgICAgICAgLS1wYXBlci1zcGlubmVyLWZ1bGwtY3ljbGUtZHVyYXRpb246IDUzMzJtcztcblxuICAgICAgICAvKiBTSFJJTktfVElNRSAqL1xuICAgICAgICAtLXBhcGVyLXNwaW5uZXItY29vbGRvd24tZHVyYXRpb246IDQwMG1zO1xuICAgICAgfVxuXG4gICAgICAjc3Bpbm5lckNvbnRhaW5lciB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG5cbiAgICAgICAgLyogVGhlIHNwaW5uZXIgZG9lcyBub3QgaGF2ZSBhbnkgY29udGVudHMgdGhhdCB3b3VsZCBoYXZlIHRvIGJlXG4gICAgICAgICAqIGZsaXBwZWQgaWYgdGhlIGRpcmVjdGlvbiBjaGFuZ2VzLiBBbHdheXMgdXNlIGx0ciBzbyB0aGF0IHRoZVxuICAgICAgICAgKiBzdHlsZSB3b3JrcyBvdXQgY29ycmVjdGx5IGluIGJvdGggY2FzZXMuICovXG4gICAgICAgIGRpcmVjdGlvbjogbHRyO1xuICAgICAgfVxuXG4gICAgICAjc3Bpbm5lckNvbnRhaW5lci5hY3RpdmUge1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogY29udGFpbmVyLXJvdGF0ZSB2YXIoLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbikgbGluZWFyIGluZmluaXRlO1xuICAgICAgICBhbmltYXRpb246IGNvbnRhaW5lci1yb3RhdGUgdmFyKC0tcGFwZXItc3Bpbm5lci1jb250YWluZXItcm90YXRpb24tZHVyYXRpb24pIGxpbmVhciBpbmZpbml0ZTtcbiAgICAgIH1cblxuICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGNvbnRhaW5lci1yb3RhdGUge1xuICAgICAgICB0byB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKSB9XG4gICAgICB9XG5cbiAgICAgIEBrZXlmcmFtZXMgY29udGFpbmVyLXJvdGF0ZSB7XG4gICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKSB9XG4gICAgICB9XG5cbiAgICAgIC5zcGlubmVyLWxheWVyIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNTAwKSk7XG4gICAgICB9XG5cbiAgICAgIC5sYXllci0xIHtcbiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNwaW5uZXItbGF5ZXItMS1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNTAwKSk7XG4gICAgICB9XG5cbiAgICAgIC5sYXllci0yIHtcbiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNwaW5uZXItbGF5ZXItMi1jb2xvciwgdmFyKC0tZ29vZ2xlLXJlZC01MDApKTtcbiAgICAgIH1cblxuICAgICAgLmxheWVyLTMge1xuICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1sYXllci0zLWNvbG9yLCB2YXIoLS1nb29nbGUteWVsbG93LTUwMCkpO1xuICAgICAgfVxuXG4gICAgICAubGF5ZXItNCB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWxheWVyLTQtY29sb3IsIHZhcigtLWdvb2dsZS1ncmVlbi01MDApKTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBJTVBPUlRBTlQgTk9URSBBQk9VVCBDU1MgQU5JTUFUSU9OIFBST1BFUlRJRVMgKGtlYW51bGVlKTpcbiAgICAgICAqXG4gICAgICAgKiBpT1MgU2FmYXJpICh0ZXN0ZWQgb24gaU9TIDguMSkgZG9lcyBub3QgaGFuZGxlIGFuaW1hdGlvbi1kZWxheSB2ZXJ5IHdlbGwgLSBpdCBkb2Vzbid0XG4gICAgICAgKiBndWFyYW50ZWUgdGhhdCB0aGUgYW5pbWF0aW9uIHdpbGwgc3RhcnQgX2V4YWN0bHlfIGFmdGVyIHRoYXQgdmFsdWUuIFNvIHdlIGF2b2lkIHVzaW5nXG4gICAgICAgKiBhbmltYXRpb24tZGVsYXkgYW5kIGluc3RlYWQgc2V0IGN1c3RvbSBrZXlmcmFtZXMgZm9yIGVhY2ggY29sb3IgKGFzIGxheWVyLTJ1bmRhbnQgYXMgaXRcbiAgICAgICAqIHNlZW1zKS5cbiAgICAgICAqL1xuICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllciB7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZTtcbiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZnVsbC1jeWNsZS1kdXJhdGlvbik7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpO1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xuICAgICAgICBhbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlO1xuICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZnVsbC1jeWNsZS1kdXJhdGlvbik7XG4gICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTtcbiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICB9XG5cbiAgICAgIC5hY3RpdmUgLnNwaW5uZXItbGF5ZXIubGF5ZXItMSB7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMS1mYWRlLWluLW91dDtcbiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMS1mYWRlLWluLW91dDtcbiAgICAgIH1cblxuICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0yIHtcbiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlLCBsYXllci0yLWZhZGUtaW4tb3V0O1xuICAgICAgICBhbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlLCBsYXllci0yLWZhZGUtaW4tb3V0O1xuICAgICAgfVxuXG4gICAgICAuYWN0aXZlIC5zcGlubmVyLWxheWVyLmxheWVyLTMge1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTMtZmFkZS1pbi1vdXQ7XG4gICAgICAgIGFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTMtZmFkZS1pbi1vdXQ7XG4gICAgICB9XG5cbiAgICAgIC5hY3RpdmUgLnNwaW5uZXItbGF5ZXIubGF5ZXItNCB7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItNC1mYWRlLWluLW91dDtcbiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItNC1mYWRlLWluLW91dDtcbiAgICAgIH1cblxuICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGZpbGwtdW5maWxsLXJvdGF0ZSB7XG4gICAgICAgIDEyLjUlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpIH0gLyogMC41ICogQVJDU0laRSAqL1xuICAgICAgICAyNSUgICB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKSB9IC8qIDEgICAqIEFSQ1NJWkUgKi9cbiAgICAgICAgMzcuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDQwNWRlZykgfSAvKiAxLjUgKiBBUkNTSVpFICovXG4gICAgICAgIDUwJSAgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg1NDBkZWcpIH0gLyogMiAgICogQVJDU0laRSAqL1xuICAgICAgICA2Mi41JSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoNjc1ZGVnKSB9IC8qIDIuNSAqIEFSQ1NJWkUgKi9cbiAgICAgICAgNzUlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDgxMGRlZykgfSAvKiAzICAgKiBBUkNTSVpFICovXG4gICAgICAgIDg3LjUlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg5NDVkZWcpIH0gLyogMy41ICogQVJDU0laRSAqL1xuICAgICAgICB0byAgICB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTA4MGRlZykgfSAvKiA0ICAgKiBBUkNTSVpFICovXG4gICAgICB9XG5cbiAgICAgIEBrZXlmcmFtZXMgZmlsbC11bmZpbGwtcm90YXRlIHtcbiAgICAgICAgMTIuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpIH0gLyogMC41ICogQVJDU0laRSAqL1xuICAgICAgICAyNSUgICB7IHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZykgfSAvKiAxICAgKiBBUkNTSVpFICovXG4gICAgICAgIDM3LjUlIHsgdHJhbnNmb3JtOiByb3RhdGUoNDA1ZGVnKSB9IC8qIDEuNSAqIEFSQ1NJWkUgKi9cbiAgICAgICAgNTAlICAgeyB0cmFuc2Zvcm06IHJvdGF0ZSg1NDBkZWcpIH0gLyogMiAgICogQVJDU0laRSAqL1xuICAgICAgICA2Mi41JSB7IHRyYW5zZm9ybTogcm90YXRlKDY3NWRlZykgfSAvKiAyLjUgKiBBUkNTSVpFICovXG4gICAgICAgIDc1JSAgIHsgdHJhbnNmb3JtOiByb3RhdGUoODEwZGVnKSB9IC8qIDMgICAqIEFSQ1NJWkUgKi9cbiAgICAgICAgODcuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSg5NDVkZWcpIH0gLyogMy41ICogQVJDU0laRSAqL1xuICAgICAgICB0byAgICB7IHRyYW5zZm9ybTogcm90YXRlKDEwODBkZWcpIH0gLyogNCAgICogQVJDU0laRSAqL1xuICAgICAgfVxuXG4gICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbGF5ZXItMS1mYWRlLWluLW91dCB7XG4gICAgICAgIDAlIHsgb3BhY2l0eTogMSB9XG4gICAgICAgIDI1JSB7IG9wYWNpdHk6IDEgfVxuICAgICAgICAyNiUgeyBvcGFjaXR5OiAwIH1cbiAgICAgICAgODklIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIDkwJSB7IG9wYWNpdHk6IDEgfVxuICAgICAgICB0byB7IG9wYWNpdHk6IDEgfVxuICAgICAgfVxuXG4gICAgICBAa2V5ZnJhbWVzIGxheWVyLTEtZmFkZS1pbi1vdXQge1xuICAgICAgICAwJSB7IG9wYWNpdHk6IDEgfVxuICAgICAgICAyNSUgeyBvcGFjaXR5OiAxIH1cbiAgICAgICAgMjYlIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIDg5JSB7IG9wYWNpdHk6IDAgfVxuICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH1cbiAgICAgICAgdG8geyBvcGFjaXR5OiAxIH1cbiAgICAgIH1cblxuICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGxheWVyLTItZmFkZS1pbi1vdXQge1xuICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfVxuICAgICAgICAxNSUgeyBvcGFjaXR5OiAwIH1cbiAgICAgICAgMjUlIHsgb3BhY2l0eTogMSB9XG4gICAgICAgIDUwJSB7IG9wYWNpdHk6IDEgfVxuICAgICAgICA1MSUgeyBvcGFjaXR5OiAwIH1cbiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH1cbiAgICAgIH1cblxuICAgICAgQGtleWZyYW1lcyBsYXllci0yLWZhZGUtaW4tb3V0IHtcbiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH1cbiAgICAgICAgMTUlIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIDI1JSB7IG9wYWNpdHk6IDEgfVxuICAgICAgICA1MCUgeyBvcGFjaXR5OiAxIH1cbiAgICAgICAgNTElIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIHRvIHsgb3BhY2l0eTogMCB9XG4gICAgICB9XG5cbiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci0zLWZhZGUtaW4tb3V0IHtcbiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH1cbiAgICAgICAgNDAlIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIDUwJSB7IG9wYWNpdHk6IDEgfVxuICAgICAgICA3NSUgeyBvcGFjaXR5OiAxIH1cbiAgICAgICAgNzYlIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIHRvIHsgb3BhY2l0eTogMCB9XG4gICAgICB9XG5cbiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItMy1mYWRlLWluLW91dCB7XG4gICAgICAgIDAlIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIDQwJSB7IG9wYWNpdHk6IDAgfVxuICAgICAgICA1MCUgeyBvcGFjaXR5OiAxIH1cbiAgICAgICAgNzUlIHsgb3BhY2l0eTogMSB9XG4gICAgICAgIDc2JSB7IG9wYWNpdHk6IDAgfVxuICAgICAgICB0byB7IG9wYWNpdHk6IDAgfVxuICAgICAgfVxuXG4gICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbGF5ZXItNC1mYWRlLWluLW91dCB7XG4gICAgICAgIDAlIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIDY1JSB7IG9wYWNpdHk6IDAgfVxuICAgICAgICA3NSUgeyBvcGFjaXR5OiAxIH1cbiAgICAgICAgOTAlIHsgb3BhY2l0eTogMSB9XG4gICAgICAgIHRvIHsgb3BhY2l0eTogMCB9XG4gICAgICB9XG5cbiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItNC1mYWRlLWluLW91dCB7XG4gICAgICAgIDAlIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIDY1JSB7IG9wYWNpdHk6IDAgfVxuICAgICAgICA3NSUgeyBvcGFjaXR5OiAxIH1cbiAgICAgICAgOTAlIHsgb3BhY2l0eTogMSB9XG4gICAgICAgIHRvIHsgb3BhY2l0eTogMCB9XG4gICAgICB9XG5cbiAgICAgIC5jaXJjbGUtY2xpcHBlciB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB3aWR0aDogNTAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogUGF0Y2ggdGhlIGdhcCB0aGF0IGFwcGVhciBiZXR3ZWVuIHRoZSB0d28gYWRqYWNlbnQgZGl2LmNpcmNsZS1jbGlwcGVyIHdoaWxlIHRoZVxuICAgICAgICogc3Bpbm5lciBpcyByb3RhdGluZyAoYXBwZWFycyBvbiBDaHJvbWUgNTAsIFNhZmFyaSA5LjEuMSwgYW5kIEVkZ2UpLlxuICAgICAgICovXG4gICAgICAuc3Bpbm5lci1sYXllcjo6YWZ0ZXIge1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgbGVmdDogNDUlO1xuICAgICAgICB3aWR0aDogMTAlO1xuICAgICAgICBib3JkZXItdG9wLXN0eWxlOiBzb2xpZDtcbiAgICAgIH1cblxuICAgICAgLnNwaW5uZXItbGF5ZXI6OmFmdGVyLFxuICAgICAgLmNpcmNsZS1jbGlwcGVyIC5jaXJjbGUge1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgYm9yZGVyLXdpZHRoOiB2YXIoLS1wYXBlci1zcGlubmVyLXN0cm9rZS13aWR0aCwgM3B4KTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgfVxuXG4gICAgICAuY2lyY2xlLWNsaXBwZXIgLmNpcmNsZSB7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgd2lkdGg6IDIwMCU7XG4gICAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7XG4gICAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG4gICAgICB9XG5cbiAgICAgIC5jaXJjbGUtY2xpcHBlci5sZWZ0IC5jaXJjbGUge1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTI5ZGVnKTtcbiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTI5ZGVnKTtcbiAgICAgIH1cblxuICAgICAgLmNpcmNsZS1jbGlwcGVyLnJpZ2h0IC5jaXJjbGUge1xuICAgICAgICBsZWZ0OiAtMTAwJTtcbiAgICAgICAgYm9yZGVyLWxlZnQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTEyOWRlZyk7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC0xMjlkZWcpO1xuICAgICAgfVxuXG4gICAgICAuYWN0aXZlIC5nYXAtcGF0Y2g6OmFmdGVyLFxuICAgICAgLmFjdGl2ZSAuY2lyY2xlLWNsaXBwZXIgLmNpcmNsZSB7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci1zcGlubmVyLWV4cGFuZC1jb250cmFjdC1kdXJhdGlvbik7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpO1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xuICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZXhwYW5kLWNvbnRyYWN0LWR1cmF0aW9uKTtcbiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpO1xuICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTtcbiAgICAgIH1cblxuICAgICAgLmFjdGl2ZSAuY2lyY2xlLWNsaXBwZXIubGVmdCAuY2lyY2xlIHtcbiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogbGVmdC1zcGluO1xuICAgICAgICBhbmltYXRpb24tbmFtZTogbGVmdC1zcGluO1xuICAgICAgfVxuXG4gICAgICAuYWN0aXZlIC5jaXJjbGUtY2xpcHBlci5yaWdodCAuY2lyY2xlIHtcbiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogcmlnaHQtc3BpbjtcbiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IHJpZ2h0LXNwaW47XG4gICAgICB9XG5cbiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsZWZ0LXNwaW4ge1xuICAgICAgICAwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTMwZGVnKSB9XG4gICAgICAgIDUwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTVkZWcpIH1cbiAgICAgICAgdG8geyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzMGRlZykgfVxuICAgICAgfVxuXG4gICAgICBAa2V5ZnJhbWVzIGxlZnQtc3BpbiB7XG4gICAgICAgIDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMTMwZGVnKSB9XG4gICAgICAgIDUwJSB7IHRyYW5zZm9ybTogcm90YXRlKC01ZGVnKSB9XG4gICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMTMwZGVnKSB9XG4gICAgICB9XG5cbiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyByaWdodC1zcGluIHtcbiAgICAgICAgMCUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC0xMzBkZWcpIH1cbiAgICAgICAgNTAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg1ZGVnKSB9XG4gICAgICAgIHRvIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKSB9XG4gICAgICB9XG5cbiAgICAgIEBrZXlmcmFtZXMgcmlnaHQtc3BpbiB7XG4gICAgICAgIDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfVxuICAgICAgICA1MCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSg1ZGVnKSB9XG4gICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfVxuICAgICAgfVxuXG4gICAgICAjc3Bpbm5lckNvbnRhaW5lci5jb29sZG93biB7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGUsIGZhZGUtb3V0IHZhcigtLXBhcGVyLXNwaW5uZXItY29vbGRvd24tZHVyYXRpb24pIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTtcbiAgICAgICAgYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGUsIGZhZGUtb3V0IHZhcigtLXBhcGVyLXNwaW5uZXItY29vbGRvd24tZHVyYXRpb24pIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTtcbiAgICAgIH1cblxuICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGZhZGUtb3V0IHtcbiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH1cbiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH1cbiAgICAgIH1cblxuICAgICAgQGtleWZyYW1lcyBmYWRlLW91dCB7XG4gICAgICAgIDAlIHsgb3BhY2l0eTogMSB9XG4gICAgICAgIHRvIHsgb3BhY2l0eTogMCB9XG4gICAgICB9XG4gICAgPC9zdHlsZT5cbiAgPC90ZW1wbGF0ZT5cbjwvZG9tLW1vZHVsZT4iLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQob3MuY29udGVudCk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBhcz17cHJvcGVydGllczp7YWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLG9ic2VydmVyOiJfX2FjdGl2ZUNoYW5nZWQifSxhbHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJsb2FkaW5nIixvYnNlcnZlcjoiX19hbHRDaGFuZ2VkIn0sX19jb29saW5nRG93bjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sX19jb21wdXRlQ29udGFpbmVyQ2xhc3NlczpmdW5jdGlvbih0LGUpe3JldHVyblt0fHxlPyJhY3RpdmUiOiIiLGU/ImNvb2xkb3duIjoiIl0uam9pbigiICIpfSxfX2FjdGl2ZUNoYW5nZWQ6ZnVuY3Rpb24odCxlKXt0aGlzLl9fc2V0QXJpYUhpZGRlbighdCksdGhpcy5fX2Nvb2xpbmdEb3duPSF0JiZlfSxfX2FsdENoYW5nZWQ6ZnVuY3Rpb24odCl7ImxvYWRpbmciPT09dD90aGlzLmFsdD10aGlzLmdldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpfHx0Oih0aGlzLl9fc2V0QXJpYUhpZGRlbigiIj09PXQpLHRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIix0KSl9LF9fc2V0QXJpYUhpZGRlbjpmdW5jdGlvbih0KXt2YXIgZT0iYXJpYS1oaWRkZW4iO3Q/dGhpcy5zZXRBdHRyaWJ1dGUoZSwidHJ1ZSIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKGUpfSxfX3Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5hY3RpdmU9ITEsdGhpcy5fX2Nvb2xpbmdEb3duPSExfX0sc3M9X2VgCiAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLXNwaW5uZXItc3R5bGVzIj48L3N0eWxlPgoKICA8ZGl2IGlkPSJzcGlubmVyQ29udGFpbmVyIiBjbGFzcy1uYW1lPSJbW19fY29tcHV0ZUNvbnRhaW5lckNsYXNzZXMoYWN0aXZlLCBfX2Nvb2xpbmdEb3duKV1dIiBvbi1hbmltYXRpb25lbmQ9Il9fcmVzZXQiIG9uLXdlYmtpdC1hbmltYXRpb24tZW5kPSJfX3Jlc2V0Ij4KICAgIDxkaXYgY2xhc3M9InNwaW5uZXItbGF5ZXIiPgogICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciBsZWZ0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUiPjwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgcmlnaHQiPgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC9kaXY+CmA7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL3NzLnNldEF0dHJpYnV0ZSgic3RyaXAtd2hpdGVzcGFjZSIsIiIpLFJyKHtfdGVtcGxhdGU6c3MsaXM6InBhcGVyLXNwaW5uZXItbGl0ZSIsYmVoYXZpb3JzOlthc119KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IGxzPV9lYAogIDxzdHlsZSBpbmNsdWRlPSJwYXBlci1zcGlubmVyLXN0eWxlcyI+PC9zdHlsZT4KCiAgPGRpdiBpZD0ic3Bpbm5lckNvbnRhaW5lciIgY2xhc3MtbmFtZT0iW1tfX2NvbXB1dGVDb250YWluZXJDbGFzc2VzKGFjdGl2ZSwgX19jb29saW5nRG93bildXSIgb24tYW5pbWF0aW9uZW5kPSJfX3Jlc2V0IiBvbi13ZWJraXQtYW5pbWF0aW9uLWVuZD0iX19yZXNldCI+CiAgICA8ZGl2IGNsYXNzPSJzcGlubmVyLWxheWVyIGxheWVyLTEiPgogICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciBsZWZ0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUiPjwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgcmlnaHQiPgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0ic3Bpbm5lci1sYXllciBsYXllci0yIj4KICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgbGVmdCI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIHJpZ2h0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUiPjwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9InNwaW5uZXItbGF5ZXIgbGF5ZXItMyI+CiAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIGxlZnQiPgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciByaWdodCI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJzcGlubmVyLWxheWVyIGxheWVyLTQiPgogICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciBsZWZ0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUiPjwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgcmlnaHQiPgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC9kaXY+CmA7bHMuc2V0QXR0cmlidXRlKCJzdHJpcC13aGl0ZXNwYWNlIiwiIiksUnIoe190ZW1wbGF0ZTpscyxpczoicGFwZXItc3Bpbm5lciIsYmVoYXZpb3JzOlthc119KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgY3M9X2VgPGlyb24taWNvbnNldC1zdmcgbmFtZT0icGFwZXItdGFicyIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iY2hldnJvbi1sZWZ0Ij48cGF0aCBkPSJNMTUuNDEgNy40MUwxNCA2bC02IDYgNiA2IDEuNDEtMS40MUwxMC44MyAxMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjaGV2cm9uLXJpZ2h0Ij48cGF0aCBkPSJNMTAgNkw4LjU5IDcuNDEgMTMuMTcgMTJsLTQuNTggNC41OUwxMCAxOGw2LTZ6Ij48L3BhdGg+PC9nPgo8L2RlZnM+PC9zdmc+CjwvaXJvbi1pY29uc2V0LXN2Zz5gO2RvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoY3MuY29udGVudCksCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovClJyKHtfdGVtcGxhdGU6X2VgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlci1qdXN0aWZpZWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKCiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHBhZGRpbmc6IDAgMTJweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYjsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2xpbmtdKSB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLnRhYi1jb250ZW50IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApOwogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjFzIGN1YmljLWJlemllcigwLjQsIDAuMCwgMSwgMSk7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlci1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWItY29udGVudDsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdCguaXJvbi1zZWxlY3RlZCkpID4gLnRhYi1jb250ZW50IHsKICAgICAgICBvcGFjaXR5OiAwLjg7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYi1jb250ZW50LXVuc2VsZWN0ZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgLnRhYi1jb250ZW50IHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYi1jb250ZW50LWZvY3VzZWQ7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRhYi1pbmssIHZhcigtLXBhcGVyLXllbGxvdy1hMTAwKSk7CiAgICAgIH0KCiAgICAgIC50YWItY29udGVudCA+IDo6c2xvdHRlZChhKSB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKCiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9InRhYi1jb250ZW50Ij4KICAgICAgPHNsb3Q+PC9zbG90PgogICAgPC9kaXY+CmAsaXM6InBhcGVyLXRhYiIsYmVoYXZpb3JzOltxbyxYbyxKb10scHJvcGVydGllczp7bGluazp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJ0YWIifSxsaXN0ZW5lcnM6e2Rvd246Il91cGRhdGVOb2luayIsdGFwOiJfb25UYXAifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZU5vaW5rKCl9LGdldCBfcGFyZW50Tm9pbmsoKXt2YXIgdD1ZaSh0aGlzKS5wYXJlbnROb2RlO3JldHVybiEhdCYmISF0Lm5vaW5rfSxfdXBkYXRlTm9pbms6ZnVuY3Rpb24oKXt0aGlzLm5vaW5rPSEhdGhpcy5ub2lua3x8ISF0aGlzLl9wYXJlbnROb2lua30sX29uVGFwOmZ1bmN0aW9uKHQpe2lmKHRoaXMubGluayl7dmFyIGU9dGhpcy5xdWVyeUVmZmVjdGl2ZUNoaWxkcmVuKCJhIik7aWYoIWUpcmV0dXJuO2lmKHQudGFyZ2V0PT09ZSlyZXR1cm47ZS5jbGljaygpfX19KSwKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KUnIoe190ZW1wbGF0ZTpfZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwoKICAgICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwoKICAgICAgICAvKiBOT1RFOiBCb3RoIHZhbHVlcyBhcmUgbmVlZGVkLCBzaW5jZSBzb21lIHBob25lcyByZXF1aXJlIHRoZSB2YWx1ZSB0byBiZSBcYHRyYW5zcGFyZW50XGAuICovCiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYnM7CiAgICAgIH0KCiAgICAgIDpob3N0KDpkaXIocnRsKSkgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsLXJldmVyc2U7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYnMtY29udGFpbmVyOwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAtbW96LWZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgLW1zLWZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWJzLWNvbnRlbnQ7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudC5zY3JvbGxhYmxlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50Om5vdCguc2Nyb2xsYWJsZSksCiAgICAgICN0YWJzQ29udGVudC5zY3JvbGxhYmxlLmZpdC1jb250YWluZXIgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQuc2Nyb2xsYWJsZS5maXQtY29udGFpbmVyIHsKICAgICAgICBtaW4td2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudC5zY3JvbGxhYmxlLmZpdC1jb250YWluZXIgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIC8qIElFIC0gcHJldmVudCB0YWJzIGZyb20gY29tcHJlc3Npbmcgd2hlbiB0aGV5IHNob3VsZCBzY3JvbGwuICovCiAgICAgICAgLW1zLWZsZXg6IDEgMCBhdXRvOwogICAgICAgIC13ZWJraXQtZmxleDogMSAwIGF1dG87CiAgICAgICAgZmxleDogMSAwIGF1dG87CiAgICAgIH0KCiAgICAgIC5oaWRkZW4gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5ub3QtdmlzaWJsZSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICB3aWR0aDogNDhweDsKICAgICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICBtYXJnaW46IDAgNHB4OwogICAgICB9CgogICAgICAjc2VsZWN0aW9uQmFyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgaGVpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB2YXIoLS1wYXBlci10YWJzLXNlbGVjdGlvbi1iYXItY29sb3IsIHZhcigtLXBhcGVyLXllbGxvdy1hMTAwKSk7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBjZW50ZXI7CiAgICAgICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybTsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm07CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYnMtc2VsZWN0aW9uLWJhcjsKICAgICAgfQoKICAgICAgI3NlbGVjdGlvbkJhci5hbGlnbi1ib3R0b20gewogICAgICAgIHRvcDogMDsKICAgICAgICBib3R0b206IGF1dG87CiAgICAgIH0KCiAgICAgICNzZWxlY3Rpb25CYXIuZXhwYW5kIHsKICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjE1czsKICAgICAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAxLCAxKTsKICAgICAgfQoKICAgICAgI3NlbGVjdGlvbkJhci5jb250cmFjdCB7CiAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4xOHM7CiAgICAgICAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjAsIDAuMCwgMC4yLCAxKTsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50ID4gOjpzbG90dGVkKDpub3QoI3NlbGVjdGlvbkJhcikpIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InBhcGVyLXRhYnM6Y2hldnJvbi1sZWZ0IiBjbGFzcyQ9IltbX2NvbXB1dGVTY3JvbGxCdXR0b25DbGFzcyhfbGVmdEhpZGRlbiwgc2Nyb2xsYWJsZSwgaGlkZVNjcm9sbEJ1dHRvbnMpXV0iIG9uLXVwPSJfb25TY3JvbGxCdXR0b25VcCIgb24tZG93bj0iX29uTGVmdFNjcm9sbEJ1dHRvbkRvd24iIHRhYmluZGV4PSItMSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KCiAgICA8ZGl2IGlkPSJ0YWJzQ29udGFpbmVyIiBvbi10cmFjaz0iX3Njcm9sbCIgb24tZG93bj0iX2Rvd24iPgogICAgICA8ZGl2IGlkPSJ0YWJzQ29udGVudCIgY2xhc3MkPSJbW19jb21wdXRlVGFic0NvbnRlbnRDbGFzcyhzY3JvbGxhYmxlLCBmaXRDb250YWluZXIpXV0iPgogICAgICAgIDxkaXYgaWQ9InNlbGVjdGlvbkJhciIgY2xhc3MkPSJbW19jb21wdXRlU2VsZWN0aW9uQmFyQ2xhc3Mobm9CYXIsIGFsaWduQm90dG9tKV1dIiBvbi10cmFuc2l0aW9uZW5kPSJfb25CYXJUcmFuc2l0aW9uRW5kIj48L2Rpdj4KICAgICAgICA8c2xvdD48L3Nsb3Q+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InBhcGVyLXRhYnM6Y2hldnJvbi1yaWdodCIgY2xhc3MkPSJbW19jb21wdXRlU2Nyb2xsQnV0dG9uQ2xhc3MoX3JpZ2h0SGlkZGVuLCBzY3JvbGxhYmxlLCBoaWRlU2Nyb2xsQnV0dG9ucyldXSIgb24tdXA9Il9vblNjcm9sbEJ1dHRvblVwIiBvbi1kb3duPSJfb25SaWdodFNjcm9sbEJ1dHRvbkRvd24iIHRhYmluZGV4PSItMSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KYCxpczoicGFwZXItdGFicyIsYmVoYXZpb3JzOltnbyxpc10scHJvcGVydGllczp7bm9pbms6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX25vaW5rQ2hhbmdlZCJ9LG5vQmFyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vU2xpZGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sc2Nyb2xsYWJsZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxmaXRDb250YWluZXI6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZGlzYWJsZURyYWc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0saGlkZVNjcm9sbEJ1dHRvbnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYWxpZ25Cb3R0b206e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sc2VsZWN0YWJsZTp7dHlwZTpTdHJpbmcsdmFsdWU6InBhcGVyLXRhYiJ9LGF1dG9zZWxlY3Q6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYXV0b3NlbGVjdERlbGF5Ont0eXBlOk51bWJlcix2YWx1ZTowfSxfc3RlcDp7dHlwZTpOdW1iZXIsdmFsdWU6MTB9LF9ob2xkRGVsYXk6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LF9sZWZ0SGlkZGVuOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9yaWdodEhpZGRlbjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfcHJldmlvdXNUYWI6e3R5cGU6T2JqZWN0fX0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InRhYmxpc3QifSxsaXN0ZW5lcnM6eyJpcm9uLXJlc2l6ZSI6Il9vblRhYlNpemluZ0NoYW5nZWQiLCJpcm9uLWl0ZW1zLWNoYW5nZWQiOiJfb25UYWJTaXppbmdDaGFuZ2VkIiwiaXJvbi1zZWxlY3QiOiJfb25Jcm9uU2VsZWN0IiwiaXJvbi1kZXNlbGVjdCI6Il9vbklyb25EZXNlbGVjdCJ9LGtleUJpbmRpbmdzOnsibGVmdDprZXl1cCByaWdodDprZXl1cCI6Il9vbkFycm93S2V5dXAifSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5faG9sZEpvYj1udWxsLHRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT12b2lkIDAsdGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXZvaWQgMCx0aGlzLl9iaW5kRGVsYXllZEFjdGl2YXRpb25IYW5kbGVyPXRoaXMuX2RlbGF5ZWRBY3RpdmF0aW9uSGFuZGxlci5iaW5kKHRoaXMpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsdGhpcy5fb25CbHVyQ2FwdHVyZS5iaW5kKHRoaXMpLCEwKX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLnNldFNjcm9sbERpcmVjdGlvbigieSIsdGhpcy4kLnRhYnNDb250YWluZXIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2NhbmNlbFBlbmRpbmdBY3RpdmF0aW9uKCl9LF9ub2lua0NoYW5nZWQ6ZnVuY3Rpb24odCl7WWkodGhpcykucXVlcnlTZWxlY3RvckFsbCgicGFwZXItdGFiIikuZm9yRWFjaCh0P3RoaXMuX3NldE5vaW5rQXR0cmlidXRlOnRoaXMuX3JlbW92ZU5vaW5rQXR0cmlidXRlKX0sX3NldE5vaW5rQXR0cmlidXRlOmZ1bmN0aW9uKHQpe3Quc2V0QXR0cmlidXRlKCJub2luayIsIiIpfSxfcmVtb3ZlTm9pbmtBdHRyaWJ1dGU6ZnVuY3Rpb24odCl7dC5yZW1vdmVBdHRyaWJ1dGUoIm5vaW5rIil9LF9jb21wdXRlU2Nyb2xsQnV0dG9uQ2xhc3M6ZnVuY3Rpb24odCxlLG4pe3JldHVybiFlfHxuPyJoaWRkZW4iOnQ/Im5vdC12aXNpYmxlIjoiIn0sX2NvbXB1dGVUYWJzQ29udGVudENsYXNzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ/InNjcm9sbGFibGUiKyhlPyIgZml0LWNvbnRhaW5lciI6IiIpOiIgZml0LWNvbnRhaW5lciJ9LF9jb21wdXRlU2VsZWN0aW9uQmFyQ2xhc3M6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD8iaGlkZGVuIjplPyJhbGlnbi1ib3R0b20iOiIifSxfb25UYWJTaXppbmdDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kZWJvdW5jZSgiX29uVGFiU2l6aW5nQ2hhbmdlZCIsKGZ1bmN0aW9uKCl7dGhpcy5fc2Nyb2xsKCksdGhpcy5fdGFiQ2hhbmdlZCh0aGlzLnNlbGVjdGVkSXRlbSl9KSwxMCl9LF9vbklyb25TZWxlY3Q6ZnVuY3Rpb24odCl7dGhpcy5fdGFiQ2hhbmdlZCh0LmRldGFpbC5pdGVtLHRoaXMuX3ByZXZpb3VzVGFiKSx0aGlzLl9wcmV2aW91c1RhYj10LmRldGFpbC5pdGVtLHRoaXMuY2FuY2VsRGVib3VuY2VyKCJ0YWItY2hhbmdlZCIpfSxfb25Jcm9uRGVzZWxlY3Q6ZnVuY3Rpb24odCl7dGhpcy5kZWJvdW5jZSgidGFiLWNoYW5nZWQiLChmdW5jdGlvbigpe3RoaXMuX3RhYkNoYW5nZWQobnVsbCx0aGlzLl9wcmV2aW91c1RhYiksdGhpcy5fcHJldmlvdXNUYWI9bnVsbH0pLDEpfSxfYWN0aXZhdGVIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fY2FuY2VsUGVuZGluZ0FjdGl2YXRpb24oKSxaYS5fYWN0aXZhdGVIYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sX3NjaGVkdWxlQWN0aXZhdGlvbjpmdW5jdGlvbih0LGUpe3RoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT10LHRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uVGltZW91dD10aGlzLmFzeW5jKHRoaXMuX2JpbmREZWxheWVkQWN0aXZhdGlvbkhhbmRsZXIsZSl9LF9kZWxheWVkQWN0aXZhdGlvbkhhbmRsZXI6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9wZW5kaW5nQWN0aXZhdGlvbkl0ZW07dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtPXZvaWQgMCx0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQ9dm9pZCAwLHQuZmlyZSh0aGlzLmFjdGl2YXRlRXZlbnQsbnVsbCx7YnViYmxlczohMCxjYW5jZWxhYmxlOiEwfSl9LF9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbjpmdW5jdGlvbigpe3ZvaWQgMCE9PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uVGltZW91dCYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0KSx0aGlzLl9wZW5kaW5nQWN0aXZhdGlvbkl0ZW09dm9pZCAwLHRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uVGltZW91dD12b2lkIDApfSxfb25BcnJvd0tleXVwOmZ1bmN0aW9uKHQpe3RoaXMuYXV0b3NlbGVjdCYmdGhpcy5fc2NoZWR1bGVBY3RpdmF0aW9uKHRoaXMuZm9jdXNlZEl0ZW0sdGhpcy5hdXRvc2VsZWN0RGVsYXkpfSxfb25CbHVyQ2FwdHVyZTpmdW5jdGlvbih0KXt0LnRhcmdldD09PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbSYmdGhpcy5fY2FuY2VsUGVuZGluZ0FjdGl2YXRpb24oKX0sZ2V0IF90YWJDb250YWluZXJTY3JvbGxTaXplKCl7cmV0dXJuIE1hdGgubWF4KDAsdGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsV2lkdGgtdGhpcy4kLnRhYnNDb250YWluZXIub2Zmc2V0V2lkdGgpfSxfc2Nyb2xsOmZ1bmN0aW9uKHQsZSl7dGhpcy5zY3JvbGxhYmxlJiZ0aGlzLl9hZmZlY3RTY3JvbGwoZSYmLWUuZGR4fHwwKX0sX2Rvd246ZnVuY3Rpb24odCl7dGhpcy5hc3luYygoZnVuY3Rpb24oKXt0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYyYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fZGVmYXVsdEZvY3VzQXN5bmMpLHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jPW51bGwpfSksMSl9LF9hZmZlY3RTY3JvbGw6ZnVuY3Rpb24odCl7dGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdCs9dDt2YXIgZT10aGlzLiQudGFic0NvbnRhaW5lci5zY3JvbGxMZWZ0O3RoaXMuX2xlZnRIaWRkZW49MD09PWUsdGhpcy5fcmlnaHRIaWRkZW49ZT09PXRoaXMuX3RhYkNvbnRhaW5lclNjcm9sbFNpemV9LF9vbkxlZnRTY3JvbGxCdXR0b25Eb3duOmZ1bmN0aW9uKCl7dGhpcy5fc2Nyb2xsVG9MZWZ0KCksdGhpcy5faG9sZEpvYj1zZXRJbnRlcnZhbCh0aGlzLl9zY3JvbGxUb0xlZnQuYmluZCh0aGlzKSx0aGlzLl9ob2xkRGVsYXkpfSxfb25SaWdodFNjcm9sbEJ1dHRvbkRvd246ZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGxUb1JpZ2h0KCksdGhpcy5faG9sZEpvYj1zZXRJbnRlcnZhbCh0aGlzLl9zY3JvbGxUb1JpZ2h0LmJpbmQodGhpcyksdGhpcy5faG9sZERlbGF5KX0sX29uU2Nyb2xsQnV0dG9uVXA6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKHRoaXMuX2hvbGRKb2IpLHRoaXMuX2hvbGRKb2I9bnVsbH0sX3Njcm9sbFRvTGVmdDpmdW5jdGlvbigpe3RoaXMuX2FmZmVjdFNjcm9sbCgtdGhpcy5fc3RlcCl9LF9zY3JvbGxUb1JpZ2h0OmZ1bmN0aW9uKCl7dGhpcy5fYWZmZWN0U2Nyb2xsKHRoaXMuX3N0ZXApfSxfdGFiQ2hhbmdlZDpmdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybiB0aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdC5yZW1vdmUoImV4cGFuZCIpLHRoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LnJlbW92ZSgiY29udHJhY3QiKSx2b2lkIHRoaXMuX3Bvc2l0aW9uQmFyKDAsMCk7dmFyIG49dGhpcy4kLnRhYnNDb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGk9bi53aWR0aCxyPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbz1yLmxlZnQtbi5sZWZ0O2lmKHRoaXMuX3Bvcz17d2lkdGg6dGhpcy5fY2FsY1BlcmNlbnQoci53aWR0aCxpKSxsZWZ0OnRoaXMuX2NhbGNQZXJjZW50KG8saSl9LHRoaXMubm9TbGlkZXx8bnVsbD09ZSlyZXR1cm4gdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCJleHBhbmQiKSx0aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdC5yZW1vdmUoImNvbnRyYWN0Iiksdm9pZCB0aGlzLl9wb3NpdGlvbkJhcih0aGlzLl9wb3Mud2lkdGgsdGhpcy5fcG9zLmxlZnQpO3ZhciBhPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscz10aGlzLml0ZW1zLmluZGV4T2YoZSksbD10aGlzLml0ZW1zLmluZGV4T2YodCk7dGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QuYWRkKCJleHBhbmQiKTt2YXIgYz1zPGw7dGhpcy5faXNSVEwmJihjPSFjKSxjP3RoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX2NhbGNQZXJjZW50KHIubGVmdCtyLndpZHRoLWEubGVmdCxpKS01LHRoaXMuX2xlZnQpOnRoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX2NhbGNQZXJjZW50KGEubGVmdCthLndpZHRoLXIubGVmdCxpKS01LHRoaXMuX2NhbGNQZXJjZW50KG8saSkrNSksdGhpcy5zY3JvbGxhYmxlJiZ0aGlzLl9zY3JvbGxUb1NlbGVjdGVkSWZOZWVkZWQoci53aWR0aCxvKX0sX3Njcm9sbFRvU2VsZWN0ZWRJZk5lZWRlZDpmdW5jdGlvbih0LGUpe3ZhciBuPWUtdGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdDsobjwwfHwobis9dC10aGlzLiQudGFic0NvbnRhaW5lci5vZmZzZXRXaWR0aCk+MCkmJih0aGlzLiQudGFic0NvbnRhaW5lci5zY3JvbGxMZWZ0Kz1uKX0sX2NhbGNQZXJjZW50OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIDEwMCp0L2V9LF9wb3NpdGlvbkJhcjpmdW5jdGlvbih0LGUpe2U9ZXx8MCx0aGlzLl93aWR0aD10PXR8fDAsdGhpcy5fbGVmdD1lLHRoaXMudHJhbnNmb3JtKCJ0cmFuc2xhdGVYKCIrZSsiJSkgc2NhbGVYKCIrdC8xMDArIikiLHRoaXMuJC5zZWxlY3Rpb25CYXIpfSxfb25CYXJUcmFuc2l0aW9uRW5kOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0O2UuY29udGFpbnMoImV4cGFuZCIpPyhlLnJlbW92ZSgiZXhwYW5kIiksZS5hZGQoImNvbnRyYWN0IiksdGhpcy5fcG9zaXRpb25CYXIodGhpcy5fcG9zLndpZHRoLHRoaXMuX3Bvcy5sZWZ0KSk6ZS5jb250YWlucygiY29udHJhY3QiKSYmZS5yZW1vdmUoImNvbnRyYWN0Iil9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwp2YXIgdXM9bnVsbDtScih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvYXN0LWJhY2tncm91bmQtY29sb3IsICMzMjMyMzIpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b2FzdC1jb2xvciwgI2YxZjFmMSk7CiAgICAgICAgbWluLWhlaWdodDogNDhweDsKICAgICAgICBtaW4td2lkdGg6IDI4OHB4OwogICAgICAgIHBhZGRpbmc6IDE2cHggMjRweDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC4yNik7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIG1hcmdpbjogMTJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMC4zcywgb3BhY2l0eSAwLjNzOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzLCBvcGFjaXR5IDAuM3M7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDBweCk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDEwMHB4KTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICB9CgogICAgICA6aG9zdCguY2Fwc3VsZSkgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDI0cHg7CiAgICAgIH0KCiAgICAgIDpob3N0KC5maXQtYm90dG9tKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDA7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICA6aG9zdCgucGFwZXItdG9hc3Qtb3BlbikgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMHB4KTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMHB4KTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c3BhbiBpZD0ibGFiZWwiPnt7dGV4dH19PC9zcGFuPgogICAgPHNsb3Q+PC9zbG90PgpgLGlzOiJwYXBlci10b2FzdCIsYmVoYXZpb3JzOltrYV0scHJvcGVydGllczp7Zml0SW50bzp7dHlwZTpPYmplY3QsdmFsdWU6d2luZG93LG9ic2VydmVyOiJfb25GaXRJbnRvQ2hhbmdlZCJ9LGhvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQifSx2ZXJ0aWNhbEFsaWduOnt0eXBlOlN0cmluZyx2YWx1ZToiYm90dG9tIn0sZHVyYXRpb246e3R5cGU6TnVtYmVyLHZhbHVlOjNlM30sdGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LG5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sbm9BdXRvRm9jdXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LGxpc3RlbmVyczp7dHJhbnNpdGlvbmVuZDoiX19vblRyYW5zaXRpb25FbmQifSxnZXQgdmlzaWJsZSgpe3JldHVybiBmby5fd2FybigiYHZpc2libGVgIGlzIGRlcHJlY2F0ZWQsIHVzZSBgb3BlbmVkYCBpbnN0ZWFkIiksdGhpcy5vcGVuZWR9LGdldCBfY2FuQXV0b0Nsb3NlKCl7cmV0dXJuIHRoaXMuZHVyYXRpb24+MCYmdGhpcy5kdXJhdGlvbiE9PTEvMH0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX2F1dG9DbG9zZT1udWxsLE9hLnJlcXVlc3RBdmFpbGFiaWxpdHkoKX0sc2hvdzpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4ic3RyaW5nIj09dHlwZW9mIHQmJih0PXt0ZXh0OnR9KSx0KTA9PT1lLmluZGV4T2YoIl8iKT9mby5fd2FybignVGhlIHByb3BlcnR5ICInK2UrJyIgaXMgcHJpdmF0ZSBhbmQgd2FzIG5vdCBzZXQuJyk6ZSBpbiB0aGlzP3RoaXNbZV09dFtlXTpmby5fd2FybignVGhlIHByb3BlcnR5ICInK2UrJyIgaXMgbm90IHZhbGlkLicpO3RoaXMub3BlbigpfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5jbG9zZSgpfSxfX29uVHJhbnNpdGlvbkVuZDpmdW5jdGlvbih0KXt0JiZ0LnRhcmdldD09PXRoaXMmJiJvcGFjaXR5Ij09PXQucHJvcGVydHlOYW1lJiYodGhpcy5vcGVuZWQ/dGhpcy5fZmluaXNoUmVuZGVyT3BlbmVkKCk6dGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCkpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe251bGwhPT10aGlzLl9hdXRvQ2xvc2UmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2F1dG9DbG9zZSksdGhpcy5fYXV0b0Nsb3NlPW51bGwpLHRoaXMub3BlbmVkPyh1cyYmdXMhPT10aGlzJiZ1cy5jbG9zZSgpLHVzPXRoaXMsdGhpcy5maXJlKCJpcm9uLWFubm91bmNlIix7dGV4dDp0aGlzLnRleHR9KSx0aGlzLl9jYW5BdXRvQ2xvc2UmJih0aGlzLl9hdXRvQ2xvc2U9dGhpcy5hc3luYyh0aGlzLmNsb3NlLHRoaXMuZHVyYXRpb24pKSk6dXM9PT10aGlzJiYodXM9bnVsbCksQ2EuX29wZW5lZENoYW5nZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfcmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5jbGFzc0xpc3QuYWRkKCJwYXBlci10b2FzdC1vcGVuIil9LF9yZW5kZXJDbG9zZWQ6ZnVuY3Rpb24oKXt0aGlzLmNsYXNzTGlzdC5yZW1vdmUoInBhcGVyLXRvYXN0LW9wZW4iKX0sX29uRml0SW50b0NoYW5nZWQ6ZnVuY3Rpb24odCl7dGhpcy5wb3NpdGlvblRhcmdldD10fX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBocz1fZWAKCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6bm9uZTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1iYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIG9wYWNpdHk6IDAuNDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIGxpbmVhciAuMDhzOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhci1jb2xvciwgIzAwMDAwMCk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhcjsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1idXR0b24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IC0zcHg7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC42KTsKICAgICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSBsaW5lYXIgLjA4cywgYmFja2dyb3VuZC1jb2xvciBsaW5lYXIgLjA4czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gbGluZWFyIC4wOHMsIGJhY2tncm91bmQtY29sb3IgbGluZWFyIC4wOHM7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLXVuY2hlY2tlZC1idXR0b24tY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNTApKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi11bmNoZWNrZWQtYnV0dG9uOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbi5kcmFnZ2luZyB7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBub25lOwogICAgICAgIHRyYW5zaXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjaGVja2VkXTpub3QoW2Rpc2FibGVkXSkpIC50b2dnbGUtYmFyIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJhci1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYmFyOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudG9nZ2xlLWJhciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKICAgICAgICBvcGFjaXR5OiAwLjEyOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDE2cHgsIDApOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDE2cHgsIDApOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF06bm90KFtkaXNhYmxlZF0pKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJ1dHRvbi1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2JkYmRiZDsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAudG9nZ2xlLWluayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogLTE0cHg7CiAgICAgICAgbGVmdDogLTE0cHg7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgYm90dG9tOiBhdXRvOwogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluazsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAudG9nZ2xlLWluayB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWluazsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDM2cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICAgIC8qIFRoZSB0b2dnbGUgYnV0dG9uIGhhcyBhbiBhYnNvbHV0ZSBwb3NpdGlvbiBvZiAtM3B4OyBUaGUgZXh0cmEgMXB4CiAgICAgICAgLyogYWNjb3VudHMgZm9yIHRoZSB0b2dnbGUgYnV0dG9uIHNoYWRvdyBib3guICovCiAgICAgICAgbWFyZ2luOiA0cHggMXB4OwogICAgICB9CgogICAgICAudG9nZ2xlLWxhYmVsIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWxhYmVsLXNwYWNpbmcsIDhweCk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICAvKiBpbnZhbGlkIHN0YXRlICovCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1iYXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1iYXItY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1idXR0b24gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1idXR0b24tY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1pbmsgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWludmFsaWQtaW5rLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJ0b2dnbGVCYXIiIGNsYXNzPSJ0b2dnbGUtYmFyIj48L2Rpdj4KICAgICAgPGRpdiBpZD0idG9nZ2xlQnV0dG9uIiBjbGFzcz0idG9nZ2xlLWJ1dHRvbiI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJ0b2dnbGUtbGFiZWwiPjxzbG90Pjwvc2xvdD48L2Rpdj4KCiAgYDtocy5zZXRBdHRyaWJ1dGUoInN0cmlwLXdoaXRlc3BhY2UiLCIiKSxScih7X3RlbXBsYXRlOmhzLGlzOiJwYXBlci10b2dnbGUtYnV0dG9uIixiZWhhdmlvcnM6W3VhXSxob3N0QXR0cmlidXRlczp7cm9sZToiYnV0dG9uIiwiYXJpYS1wcmVzc2VkIjoiZmFsc2UiLHRhYmluZGV4OjB9LHByb3BlcnRpZXM6e30sbGlzdGVuZXJzOnt0cmFjazoiX29udHJhY2sifSxhdHRhY2hlZDpmdW5jdGlvbigpe0xpKHRoaXMsKGZ1bmN0aW9uKCl7b2kodGhpcywicGFuLXkiKX0pKX0sX29udHJhY2s6ZnVuY3Rpb24odCl7dmFyIGU9dC5kZXRhaWw7InN0YXJ0Ij09PWUuc3RhdGU/dGhpcy5fdHJhY2tTdGFydChlKToidHJhY2siPT09ZS5zdGF0ZT90aGlzLl90cmFja01vdmUoZSk6ImVuZCI9PT1lLnN0YXRlJiZ0aGlzLl90cmFja0VuZChlKX0sX3RyYWNrU3RhcnQ6ZnVuY3Rpb24odCl7dGhpcy5fd2lkdGg9dGhpcy4kLnRvZ2dsZUJhci5vZmZzZXRXaWR0aC8yLHRoaXMuX3RyYWNrQ2hlY2tlZD10aGlzLmNoZWNrZWQsdGhpcy4kLnRvZ2dsZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCJkcmFnZ2luZyIpfSxfdHJhY2tNb3ZlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZHg7dGhpcy5feD1NYXRoLm1pbih0aGlzLl93aWR0aCxNYXRoLm1heCgwLHRoaXMuX3RyYWNrQ2hlY2tlZD90aGlzLl93aWR0aCtlOmUpKSx0aGlzLnRyYW5zbGF0ZTNkKHRoaXMuX3grInB4IiwwLDAsdGhpcy4kLnRvZ2dsZUJ1dHRvbiksdGhpcy5fdXNlckFjdGl2YXRlKHRoaXMuX3g+dGhpcy5fd2lkdGgvMil9LF90cmFja0VuZDpmdW5jdGlvbih0KXt0aGlzLiQudG9nZ2xlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoImRyYWdnaW5nIiksdGhpcy50cmFuc2Zvcm0oIiIsdGhpcy4kLnRvZ2dsZUJ1dHRvbil9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXt0aGlzLl9yaXBwbGVDb250YWluZXI9dGhpcy4kLnRvZ2dsZUJ1dHRvbjt2YXIgdD1Kby5fY3JlYXRlUmlwcGxlKCk7cmV0dXJuIHQuaWQ9ImluayIsdC5zZXRBdHRyaWJ1dGUoInJlY2VudGVycyIsIiIpLHQuY2xhc3NMaXN0LmFkZCgiY2lyY2xlIiwidG9nZ2xlLWluayIpLHR9fSksCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpScih7X3RlbXBsYXRlOl9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItaGVpZ2h0OiB2YXIoLS1wYXBlci10b29sYmFyLWhlaWdodCwgNjRweCk7CiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0OiB2YXIoLS1wYXBlci10b29sYmFyLXNtLWhlaWdodCwgNTZweCk7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLWhlaWdodCk7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItdG9vbGJhci1iYWNrZ3JvdW5kLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvb2xiYXItY29sb3IsIHZhcigtLWRhcmstdGhlbWUtdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2xiYXI7CiAgICAgIH0KCiAgICAgIDpob3N0KC5hbmltYXRlKSB7CiAgICAgICAgdHJhbnNpdGlvbjogdmFyKC0tcGFwZXItdG9vbGJhci10cmFuc2l0aW9uLCBoZWlnaHQgMC4xOHMgZWFzZS1pbik7CiAgICAgIH0KCiAgICAgIDpob3N0KC5tZWRpdW0tdGFsbCkgewogICAgICAgIGhlaWdodDogY2FsYyh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItaGVpZ2h0KSAqIDIpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2xiYXItbWVkaXVtOwogICAgICB9CgogICAgICA6aG9zdCgudGFsbCkgewogICAgICAgIGhlaWdodDogY2FsYyh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItaGVpZ2h0KSAqIDMpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2xiYXItdGFsbDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQpOwogICAgICAgIHBhZGRpbmc6IDAgMTZweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2xiYXItY29udGVudDsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogVE9ETzogV2hlcmUgc2hvdWxkIG1lZGlhIHF1ZXJ5IGJyZWFrcG9pbnRzIGxpdmUgc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gZWxlbWVudHM/CiAgICAgICAqLwoKICAgICAgQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KSB7CiAgICAgICAgOmhvc3QgewogICAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0KTsKICAgICAgICB9CgogICAgICAgIDpob3N0KC5tZWRpdW0tdGFsbCkgewogICAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQpICogMik7CiAgICAgICAgfQoKICAgICAgICA6aG9zdCgudGFsbCkgewogICAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQpICogMyk7CiAgICAgICAgfQoKICAgICAgICAudG9vbGJhci10b29scyB7CiAgICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgI3RvcEJhciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAvKiBtaWRkbGUgYmFyICovCiAgICAgICNtaWRkbGVCYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQoKICAgICAgOmhvc3QoLnRhbGwpICNtaWRkbGVCYXIsCiAgICAgIDpob3N0KC5tZWRpdW0tdGFsbCkgI21pZGRsZUJhciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwJSk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDEwMCUpOwogICAgICB9CgogICAgICAvKiBib3R0b20gYmFyICovCiAgICAgICNib3R0b21CYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbWFrZSBlbGVtZW50cyAoZS5nLiBidXR0b25zKSByZXNwb25kIHRvIG1vdXNlL3RvdWNoIGV2ZW50cwogICAgICAgKgogICAgICAgKiBcYC50b29sYmFyLXRvb2xzXGAgZGlzYWJsZXMgdG91Y2ggZXZlbnRzIHNvIG11bHRpcGxlIHRvb2xiYXJzIGNhbiBzdGFjayBhbmQgbm90CiAgICAgICAqIGFic29yYiBldmVudHMuIEFsbCBjaGlsZHJlbiBtdXN0IGhhdmUgcG9pbnRlciBldmVudHMgcmUtZW5hYmxlZCB0byB3b3JrIGFzCiAgICAgICAqIGV4cGVjdGVkLgogICAgICAgKi8KICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoKjpub3QoW2Rpc2FibGVkXSkpIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLXRvb2xzID4gOjpzbG90dGVkKC50aXRsZSkgewogICAgICAgIG1hcmdpbi1sZWZ0OiA1NnB4OwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZChwYXBlci1pY29uLWJ1dHRvbiArIC50aXRsZSkgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVGhlIC0tcGFwZXItdG9vbGJhci10aXRsZSBtaXhpbiBpcyBhcHBsaWVkIGhlcmUgaW5zdGVhZCBvZiBhYm92ZSB0bwogICAgICAgKiBmaXggdGhlIGlzc3VlIHdpdGggbWFyZ2luLWxlZnQgYmVpbmcgaWdub3JlZCBkdWUgdG8gY3NzIG9yZGVyaW5nLgogICAgICAgKi8KICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci10aXRsZTsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQocGFwZXItaWNvbi1idXR0b25baWNvbj1tZW51XSkgewogICAgICAgIG1hcmdpbi1yaWdodDogMjRweDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLmZpdCkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IGF1dG87CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAvKiBUT0RPKG5vbXMpOiBVbnRpbCB3ZSBoYXZlIGEgYmV0dGVyIHNvbHV0aW9uIGZvciBjbGFzc2VzIHRoYXQgZG9uJ3QgdXNlCiAgICAgICAqIC9kZWVwLyBjcmVhdGUgb3VyIG93bi4KICAgICAgICovCiAgICAgIC5zdGFydC1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1zdGFydC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5jZW50ZXItanVzdGlmaWVkIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgfQoKICAgICAgLmVuZC1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1lbmQtanVzdGlmaWVkOwogICAgICB9CgogICAgICAuYXJvdW5kLWp1c3RpZmllZCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWFyb3VuZC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1qdXN0aWZpZWQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0idG9wQmFyIiBjbGFzc1wkPSJ0b29sYmFyLXRvb2xzIFtbX2NvbXB1dGVCYXJFeHRyYUNsYXNzZXMoanVzdGlmeSldXSI+CiAgICAgIDxzbG90IG5hbWU9InRvcCI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGRpdiBpZD0ibWlkZGxlQmFyIiBjbGFzc1wkPSJ0b29sYmFyLXRvb2xzIFtbX2NvbXB1dGVCYXJFeHRyYUNsYXNzZXMobWlkZGxlSnVzdGlmeSldXSI+CiAgICAgIDxzbG90IG5hbWU9Im1pZGRsZSI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGRpdiBpZD0iYm90dG9tQmFyIiBjbGFzc1wkPSJ0b29sYmFyLXRvb2xzIFtbX2NvbXB1dGVCYXJFeHRyYUNsYXNzZXMoYm90dG9tSnVzdGlmeSldXSI+CiAgICAgIDxzbG90IG5hbWU9ImJvdHRvbSI+PC9zbG90PgogICAgPC9kaXY+CmAsaXM6InBhcGVyLXRvb2xiYXIiLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJ0b29sYmFyIn0scHJvcGVydGllczp7Ym90dG9tSnVzdGlmeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LGp1c3RpZnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxtaWRkbGVKdXN0aWZ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn19LHJlYWR5OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKHRoaXMuaXMsImlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgYXBwLWxheW91dCBpbnN0ZWFkISIpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPXRoaXMuX29ic2VydmUodGhpcyksdGhpcy5fdXBkYXRlQXJpYUxhYmVsbGVkQnkoKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlciYmdGhpcy5fb2JzZXJ2ZXIuZGlzY29ubmVjdCgpfSxfb2JzZXJ2ZTpmdW5jdGlvbih0KXt2YXIgZT1uZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUFyaWFMYWJlbGxlZEJ5KCl9LmJpbmQodGhpcykpO3JldHVybiBlLm9ic2VydmUodCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxlfSxfdXBkYXRlQXJpYUxhYmVsbGVkQnk6ZnVuY3Rpb24oKXtEaSgpO2Zvcih2YXIgdCxlPVtdLG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoWWkodGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJzbG90IikpLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChZaSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3JBbGwoImNvbnRlbnQiKSkpLGk9MDt0PW5baV07aSsrKWZvcih2YXIgcixvPVlpKHQpLmdldERpc3RyaWJ1dGVkTm9kZXMoKSxhPTA7cj1vW2FdO2ErKylpZihyLmNsYXNzTGlzdCYmci5jbGFzc0xpc3QuY29udGFpbnMoInRpdGxlIikpaWYoci5pZCllLnB1c2goci5pZCk7ZWxzZXt2YXIgcz0icGFwZXItdG9vbGJhci1sYWJlbC0iK01hdGguZmxvb3IoMWU0Kk1hdGgucmFuZG9tKCkpO3IuaWQ9cyxlLnB1c2gocyl9ZS5sZW5ndGg+MCYmdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsZS5qb2luKCIgIikpfSxfY29tcHV0ZUJhckV4dHJhQ2xhc3NlczpmdW5jdGlvbih0KXtyZXR1cm4gdD90KygianVzdGlmaWVkIj09PXQ/IiI6Ii1qdXN0aWZpZWQiKToiIn19KSwKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovClJyKHtfdGVtcGxhdGU6X2VgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICB6LWluZGV4OiAxMDAyOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CgogICAgICAjdG9vbHRpcCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b29sdGlwLWJhY2tncm91bmQsICM2MTYxNjEpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b29sdGlwLXRleHQtY29sb3IsIHdoaXRlKTsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXA7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVTY2FsZVVwIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuMCk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZVNjYWxlRG93biB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjApOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC4wKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVGYWRlSW5PcGFjaXR5IHsKICAgICAgICAwJSB7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVGYWRlT3V0T3BhY2l0eSB7CiAgICAgICAgMCUgewogICAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lU2xpZGVEb3duSW4gewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjAwMHB4KTsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgfQogICAgICAgIDEwJSB7CiAgICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZVNsaWRlRG93bk91dCB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIH0KICAgICAgICAxMCUgewogICAgICAgICAgb3BhY2l0eTogMC4yOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjAwMHB4KTsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgfQogICAgICB9CgogICAgICAuZmFkZS1pbi1hbmltYXRpb24gewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LWluLCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lRmFkZUluT3BhY2l0eTsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLWluLCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5mYWRlLW91dC1hbmltYXRpb24gewogICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0LCAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZUZhZGVPdXRPcGFjaXR5OwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24tb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5zY2FsZS11cC1hbmltYXRpb24gewogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1pbiwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZVNjYWxlVXA7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1pbiwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuc2NhbGUtZG93bi1hbmltYXRpb24gewogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVTY2FsZURvd247CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLnNsaWRlLWRvd24tYW5pbWF0aW9uIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTIwMDBweCk7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lU2xpZGVEb3duSW47CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wLCAwLjAsIDAuMiwgMSk7CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuc2xpZGUtZG93bi1hbmltYXRpb24tb3V0IHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVTbGlkZURvd25PdXQ7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDEsIDEpOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLmNhbmNlbC1hbmltYXRpb24gewogICAgICAgIGFuaW1hdGlvbi1kZWxheTogLTMwcyAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAvKiBUaGFua3MgSUUgMTAuICovCgogICAgICAuaGlkZGVuIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0idG9vbHRpcCIgY2xhc3M9ImhpZGRlbiI+CiAgICAgIDxzbG90Pjwvc2xvdD4KICAgIDwvZGl2PgpgLGlzOiJwYXBlci10b29sdGlwIixob3N0QXR0cmlidXRlczp7cm9sZToidG9vbHRpcCIsdGFiaW5kZXg6LTF9LHByb3BlcnRpZXM6e2Zvcjp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9maW5kVGFyZ2V0In0sbWFudWFsTW9kZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfbWFudWFsTW9kZUNoYW5nZWQifSxwb3NpdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImJvdHRvbSJ9LGZpdFRvVmlzaWJsZUJvdW5kczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxvZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjE0fSxtYXJnaW5Ub3A6e3R5cGU6TnVtYmVyLHZhbHVlOjE0fSxhbmltYXRpb25EZWxheTp7dHlwZTpOdW1iZXIsdmFsdWU6NTAwLG9ic2VydmVyOiJfZGVsYXlDaGFuZ2UifSxhbmltYXRpb25FbnRyeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LGFuaW1hdGlvbkV4aXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxhbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue2VudHJ5Olt7bmFtZToiZmFkZS1pbi1hbmltYXRpb24iLG5vZGU6dGhpcyx0aW1pbmc6e2RlbGF5OjB9fV0sZXhpdDpbe25hbWU6ImZhZGUtb3V0LWFuaW1hdGlvbiIsbm9kZTp0aGlzfV19fX0sX3Nob3dpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LGxpc3RlbmVyczp7d2Via2l0QW5pbWF0aW9uRW5kOiJfb25BbmltYXRpb25FbmQifSxnZXQgdGFyZ2V0KCl7dmFyIHQ9WWkodGhpcykucGFyZW50Tm9kZSxlPVlpKHRoaXMpLmdldE93bmVyUm9vdCgpO3JldHVybiB0aGlzLmZvcj9ZaShlKS5xdWVyeVNlbGVjdG9yKCIjIit0aGlzLmZvcik6dC5ub2RlVHlwZT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFP2UuaG9zdDp0fSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2ZpbmRUYXJnZXQoKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLm1hbnVhbE1vZGV8fHRoaXMuX3JlbW92ZUxpc3RlbmVycygpfSxwbGF5QW5pbWF0aW9uOmZ1bmN0aW9uKHQpeyJlbnRyeSI9PT10P3RoaXMuc2hvdygpOiJleGl0Ij09PXQmJnRoaXMuaGlkZSgpfSxjYW5jZWxBbmltYXRpb246ZnVuY3Rpb24oKXt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QuYWRkKCJjYW5jZWwtYW5pbWF0aW9uIil9LHNob3c6ZnVuY3Rpb24oKXtpZighdGhpcy5fc2hvd2luZyl7aWYoIiI9PT1ZaSh0aGlzKS50ZXh0Q29udGVudC50cmltKCkpe2Zvcih2YXIgdD0hMCxlPVlpKHRoaXMpLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKSxuPTA7bjxlLmxlbmd0aDtuKyspaWYoIiIhPT1lW25dLnRleHRDb250ZW50LnRyaW0oKSl7dD0hMTticmVha31pZih0KXJldHVybn10aGlzLl9zaG93aW5nPSEwLHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlbiIpLHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImNhbmNlbC1hbmltYXRpb24iKSx0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImV4aXQiKSksdGhpcy51cGRhdGVQb3NpdGlvbigpLHRoaXMuX2FuaW1hdGlvblBsYXlpbmc9ITAsdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJlbnRyeSIpKX19LGhpZGU6ZnVuY3Rpb24oKXtpZih0aGlzLl9zaG93aW5nKXtpZih0aGlzLl9hbmltYXRpb25QbGF5aW5nKXJldHVybiB0aGlzLl9zaG93aW5nPSExLHZvaWQgdGhpcy5fY2FuY2VsQW5pbWF0aW9uKCk7dGhpcy5fb25BbmltYXRpb25GaW5pc2goKSx0aGlzLl9zaG93aW5nPSExLHRoaXMuX2FuaW1hdGlvblBsYXlpbmc9ITB9fSx1cGRhdGVQb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXMuX3RhcmdldCYmdGhpcy5vZmZzZXRQYXJlbnQpe3ZhciB0PXRoaXMub2Zmc2V0OzE0IT10aGlzLm1hcmdpblRvcCYmMTQ9PXRoaXMub2Zmc2V0JiYodD10aGlzLm1hcmdpblRvcCk7dmFyIGUsbixpPXRoaXMub2Zmc2V0UGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHI9dGhpcy5fdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG89dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxhPShyLndpZHRoLW8ud2lkdGgpLzIscz0oci5oZWlnaHQtby5oZWlnaHQpLzIsbD1yLmxlZnQtaS5sZWZ0LGM9ci50b3AtaS50b3A7c3dpdGNoKHRoaXMucG9zaXRpb24pe2Nhc2UidG9wIjplPWwrYSxuPWMtby5oZWlnaHQtdDticmVhaztjYXNlImJvdHRvbSI6ZT1sK2Esbj1jK3IuaGVpZ2h0K3Q7YnJlYWs7Y2FzZSJsZWZ0IjplPWwtby53aWR0aC10LG49YytzO2JyZWFrO2Nhc2UicmlnaHQiOmU9bCtyLndpZHRoK3Qsbj1jK3N9dGhpcy5maXRUb1Zpc2libGVCb3VuZHM/KGkubGVmdCtlK28ud2lkdGg+d2luZG93LmlubmVyV2lkdGg/KHRoaXMuc3R5bGUucmlnaHQ9IjBweCIsdGhpcy5zdHlsZS5sZWZ0PSJhdXRvIik6KHRoaXMuc3R5bGUubGVmdD1NYXRoLm1heCgwLGUpKyJweCIsdGhpcy5zdHlsZS5yaWdodD0iYXV0byIpLGkudG9wK24rby5oZWlnaHQ+d2luZG93LmlubmVySGVpZ2h0Pyh0aGlzLnN0eWxlLmJvdHRvbT1pLmhlaWdodC1jK3QrInB4Iix0aGlzLnN0eWxlLnRvcD0iYXV0byIpOih0aGlzLnN0eWxlLnRvcD1NYXRoLm1heCgtaS50b3AsbikrInB4Iix0aGlzLnN0eWxlLmJvdHRvbT0iYXV0byIpKToodGhpcy5zdHlsZS5sZWZ0PWUrInB4Iix0aGlzLnN0eWxlLnRvcD1uKyJweCIpfX0sX2FkZExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuX3RhcmdldCYmKHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwibW91c2VlbnRlciIsInNob3ciKSx0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsImZvY3VzIiwic2hvdyIpLHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwibW91c2VsZWF2ZSIsImhpZGUiKSx0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsImJsdXIiLCJoaWRlIiksdGhpcy5saXN0ZW4odGhpcy5fdGFyZ2V0LCJ0YXAiLCJoaWRlIikpLHRoaXMubGlzdGVuKHRoaXMuJC50b29sdGlwLCJhbmltYXRpb25lbmQiLCJfb25BbmltYXRpb25FbmQiKSx0aGlzLmxpc3Rlbih0aGlzLCJtb3VzZWVudGVyIiwiaGlkZSIpfSxfZmluZFRhcmdldDpmdW5jdGlvbigpe3RoaXMubWFudWFsTW9kZXx8dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCksdGhpcy5fdGFyZ2V0PXRoaXMudGFyZ2V0LHRoaXMubWFudWFsTW9kZXx8dGhpcy5fYWRkTGlzdGVuZXJzKCl9LF9kZWxheUNoYW5nZTpmdW5jdGlvbih0KXs1MDAhPT10JiZ0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItdG9vbHRpcC1kZWxheS1pbiI6dCsibXMifSl9LF9tYW51YWxNb2RlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMubWFudWFsTW9kZT90aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKTp0aGlzLl9hZGRMaXN0ZW5lcnMoKX0sX2NhbmNlbEFuaW1hdGlvbjpmdW5jdGlvbigpe3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZW50cnkiKSksdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJleGl0IikpLHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImNhbmNlbC1hbmltYXRpb24iKSx0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QuYWRkKCJoaWRkZW4iKX0sX29uQW5pbWF0aW9uRmluaXNoOmZ1bmN0aW9uKCl7dGhpcy5fc2hvd2luZyYmKHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZW50cnkiKSksdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSgiY2FuY2VsLWFuaW1hdGlvbiIpLHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZXhpdCIpKSl9LF9vbkFuaW1hdGlvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2FuaW1hdGlvblBsYXlpbmc9ITEsdGhpcy5fc2hvd2luZ3x8KHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZXhpdCIpKSx0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QuYWRkKCJoaWRkZW4iKSl9LF9nZXRBbmltYXRpb25UeXBlOmZ1bmN0aW9uKHQpe2lmKCJlbnRyeSI9PT10JiYiIiE9PXRoaXMuYW5pbWF0aW9uRW50cnkpcmV0dXJuIHRoaXMuYW5pbWF0aW9uRW50cnk7aWYoImV4aXQiPT09dCYmIiIhPT10aGlzLmFuaW1hdGlvbkV4aXQpcmV0dXJuIHRoaXMuYW5pbWF0aW9uRXhpdDtpZih0aGlzLmFuaW1hdGlvbkNvbmZpZ1t0XSYmInN0cmluZyI9PXR5cGVvZiB0aGlzLmFuaW1hdGlvbkNvbmZpZ1t0XVswXS5uYW1lKXtpZih0aGlzLmFuaW1hdGlvbkNvbmZpZ1t0XVswXS50aW1pbmcmJnRoaXMuYW5pbWF0aW9uQ29uZmlnW3RdWzBdLnRpbWluZy5kZWxheSYmMCE9PXRoaXMuYW5pbWF0aW9uQ29uZmlnW3RdWzBdLnRpbWluZy5kZWxheSl7dmFyIGU9dGhpcy5hbmltYXRpb25Db25maWdbdF1bMF0udGltaW5nLmRlbGF5OyJlbnRyeSI9PT10P3RoaXMudXBkYXRlU3R5bGVzKHsiLS1wYXBlci10b29sdGlwLWRlbGF5LWluIjplKyJtcyJ9KToiZXhpdCI9PT10JiZ0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQiOmUrIm1zIn0pfXJldHVybiB0aGlzLmFuaW1hdGlvbkNvbmZpZ1t0XVswXS5uYW1lfX0sX3JlbW92ZUxpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuX3RhcmdldCYmKHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJtb3VzZWVudGVyIiwic2hvdyIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJmb2N1cyIsInNob3ciKSx0aGlzLnVubGlzdGVuKHRoaXMuX3RhcmdldCwibW91c2VsZWF2ZSIsImhpZGUiKSx0aGlzLnVubGlzdGVuKHRoaXMuX3RhcmdldCwiYmx1ciIsImhpZGUiKSx0aGlzLnVubGlzdGVuKHRoaXMuX3RhcmdldCwidGFwIiwiaGlkZSIpKSx0aGlzLnVubGlzdGVuKHRoaXMuJC50b29sdGlwLCJhbmltYXRpb25lbmQiLCJfb25BbmltYXRpb25FbmQiKSx0aGlzLnVubGlzdGVuKHRoaXMsIm1vdXNlZW50ZXIiLCJoaWRlIil9fSk7Y2xhc3MgZHN7Y29uc3RydWN0b3IodCl7dGhpcy5saXN0ZW5lcj10fX1jb25zdCBwcz1uZXcgU2V0LGZzPW5ldyBTZXQ7ZnVuY3Rpb24gbXModCl7Y29uc3QgZT1uZXcgZHModCk7cmV0dXJuIHBzLmFkZChlKSxlfWZ1bmN0aW9uIGdzKHQpe2NvbnN0IGU9bmV3IGRzKHQpO3JldHVybiBmcy5hZGQoZSksZX1mdW5jdGlvbiBfcygpe2ZzLmZvckVhY2goKHQ9PnQubGlzdGVuZXIoKSkpfWZ1bmN0aW9uIHlzKHQpe3BzLmRlbGV0ZSh0KX1mdW5jdGlvbiB2cyh0KXtmcy5kZWxldGUodCl9d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhhc2hjaGFuZ2UiLCgoKT0+e3BzLmZvckVhY2goKHQ9PnQubGlzdGVuZXIoKSkpfSkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzdG9yYWdlIiwoKCk9Pntmcy5mb3JFYWNoKCh0PT50Lmxpc3RlbmVyKCkpKX0pKTtsZXQgYnM9ITE7ZnVuY3Rpb24geHMoKXtyZXR1cm4gYnN9bGV0IHdzPSIiO2Z1bmN0aW9uIFNzKHQpe3dzPXR9ZnVuY3Rpb24gTXMoKXtyZXR1cm4gd3N9dmFyIEVzPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHNldFVzZUhhc2g6ZnVuY3Rpb24gVHModCl7YnM9dH0sdXNlSGFzaDp4cyxzZXRGYWtlSGFzaDpTcyxnZXRGYWtlSGFzaDpNc30pO2xldCBDcz17fTtmdW5jdGlvbiBBcygpe3JldHVybiB4cygpP3dpbmRvdy5sb2NhdGlvbi5oYXNoLnNsaWNlKDEpOk1zKCl9ZnVuY3Rpb24ga3ModCl7Y29uc3QgZT17fTtyZXR1cm4gdC5zcGxpdCgiJiIpLmZvckVhY2goKHQ9Pntjb25zdCBuPXQuc3BsaXQoIj0iKTsxPT09bi5sZW5ndGg/ZS5fX3RhYl9fPW5bMF06Mj09PW4ubGVuZ3RoJiYoZVtkZWNvZGVVUklDb21wb25lbnQoblswXSldPWRlY29kZVVSSUNvbXBvbmVudChuWzFdKSl9KSksZX1mdW5jdGlvbiBMcyh0LGU9ITEpe2lmKHhzKCkpaWYoZSl7Y29uc3QgZT1uZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtlLmhhc2g9dCx3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwiIixlLnRvU3RyaW5nKCkpfWVsc2Ugd2luZG93LmxvY2F0aW9uLmhhc2g9dDtlbHNlIFNzKHQpfWZ1bmN0aW9uIFBzKHQpe2xldCBlPSIiO3ZvaWQgMCE9PXQuX190YWJfXyYmKGUrPXQuX190YWJfXyk7Y29uc3Qgbj1PYmplY3Qua2V5cyh0KS5tYXAoKGU9PltlLHRbZV1dKSkuZmlsdGVyKCh0PT4iX190YWJfXyIhPT10WzBdKSkubWFwKCh0PT5lbmNvZGVVUklDb21wb25lbnQodFswXSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0WzFdKSkpLmpvaW4oIiYiKTtyZXR1cm4gbi5sZW5ndGg+MD9lKyImIituOmV9bXMoKCgpPT57Q3M9a3MoQXMoKSl9KSk7Y29uc3R7Z2V0Ok5zLHNldDpJcyxnZXRJbml0aWFsaXplcjpScyxnZXRPYnNlcnZlcjpPcyxkaXNwb3NlQmluZGluZzp6c309SnMoKHQ9PnQpLCh0PT50KSkse2dldDpEcyxzZXQ6QnMsZ2V0SW5pdGlhbGl6ZXI6SHMsZ2V0T2JzZXJ2ZXI6RnMsZGlzcG9zZUJpbmRpbmc6VnN9PUpzKCh0PT4idHJ1ZSI9PT10fHwiZmFsc2UiIT09dCYmdm9pZCAwKSwodD0+dC50b1N0cmluZygpKSkse2dldDpVcyxzZXQ6anMsZ2V0SW5pdGlhbGl6ZXI6R3MsZ2V0T2JzZXJ2ZXI6V3MsZGlzcG9zZUJpbmRpbmc6cXN9PUpzKCh0PT4rdCksKHQ9PnQudG9TdHJpbmcoKSkpLHtnZXQ6WXMsc2V0OlhzLGdldEluaXRpYWxpemVyOiRzLGdldE9ic2VydmVyOktzLGRpc3Bvc2VCaW5kaW5nOlpzfT1KcygodD0+SlNPTi5wYXJzZShhdG9iKHQpKSksKHQ9PmJ0b2EoSlNPTi5zdHJpbmdpZnkodCkpKSk7ZnVuY3Rpb24gSnModCxlKXtjb25zdCBuPVtdLGk9W107ZnVuY3Rpb24gcihlLG49e30pe2NvbnN0e2RlZmF1bHRWYWx1ZTppLHVzZUxvY2FsU3RvcmFnZTpyPSExfT1uLG89cj93aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oZSk6a3MoQXMoKSlbZV07cmV0dXJuIG51bGw9PW8/U2UuZXhwb3J0cy5jbG9uZURlZXAoaSk6dChvKX1mdW5jdGlvbiBvKHQsbixpPXt9KXtjb25zdHtkZWZhdWx0VmFsdWU6byx1c2VMb2NhbFN0b3JhZ2U6YT0hMSx1c2VMb2NhdGlvblJlcGxhY2U6cz0hMX09aSxsPWUobik7aWYoYSl3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0odCxsKSxfcygpO2Vsc2UgaWYoIVNlLmV4cG9ydHMuaXNFcXVhbChuLHIodCx7dXNlTG9jYWxTdG9yYWdlOmF9KSkpaWYoU2UuZXhwb3J0cy5pc0VxdWFsKG4sbykpIShmdW5jdGlvbiBjKHQpe2NvbnN0IGU9a3MoQXMoKSk7ZGVsZXRlIGVbdF0sTHMoUHMoZSkpfSkodCk7ZWxzZXtjb25zdCBlPWtzKEFzKCkpO2VbdF09bCxMcyhQcyhlKSxzKX19cmV0dXJue2dldDpyLHNldDpvLGdldEluaXRpYWxpemVyOmZ1bmN0aW9uIGEodCxlKXtjb25zdCBvPU9iamVjdC5hc3NpZ24oe2RlZmF1bHRWYWx1ZTplLmRlZmF1bHRWYWx1ZSxwb2x5bWVyUHJvcGVydHk6dCx1c2VMb2NhbFN0b3JhZ2U6ITF9LGUpO3JldHVybiBmdW5jdGlvbigpe2NvbnN0IGU9UXModGhpcyx0KSxhPSgpPT57Y29uc3QgdD1yKGUsbyk7U2UuZXhwb3J0cy5pc0VxdWFsKHQsdGhpc1tvLnBvbHltZXJQcm9wZXJ0eV0pfHwodGhpc1tvLnBvbHltZXJQcm9wZXJ0eV09dCl9LHM9KG8udXNlTG9jYWxTdG9yYWdlP2dzOm1zKSgoKCk9PmEoKSkpO3JldHVybiBvLnVzZUxvY2FsU3RvcmFnZT9pLnB1c2gocyk6bi5wdXNoKHMpLGEoKSx0aGlzW28ucG9seW1lclByb3BlcnR5XX19LGdldE9ic2VydmVyOmZ1bmN0aW9uIHModCxlKXtjb25zdCBuPU9iamVjdC5hc3NpZ24oe2RlZmF1bHRWYWx1ZTplLmRlZmF1bHRWYWx1ZSxwb2x5bWVyUHJvcGVydHk6dCx1c2VMb2NhbFN0b3JhZ2U6ITF9LGUpO3JldHVybiBmdW5jdGlvbigpe28oUXModGhpcyx0KSx0aGlzW24ucG9seW1lclByb3BlcnR5XSxuKX19LGRpc3Bvc2VCaW5kaW5nOmZ1bmN0aW9uIGwoKXtuLmZvckVhY2goKHQ9PnlzKHQpKSksaS5mb3JFYWNoKCh0PT52cyh0KSkpfX19ZnVuY3Rpb24gUXModCxlKXtjb25zdCBuPXQuZGlzYW1iaWd1YXRvcjtyZXR1cm4obnVsbD09bj9bZV06W24sZV0pLmpvaW4oIi4iKX1sZXQgdGw9Y2xhc3MgZXh0ZW5kcyB5ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fdGFnRmlsdGVyPVJzKCJ0YWdGaWx0ZXIiLHtkZWZhdWx0VmFsdWU6IiIsdXNlTG9jYWxTdG9yYWdlOiExLHBvbHltZXJQcm9wZXJ0eToiX3RhZ0ZpbHRlciJ9KS5jYWxsKHRoaXMpLHRoaXMuX3RhZ0ZpbHRlck9ic2VydmVyPU9zKCJ0YWdGaWx0ZXIiLHtkZWZhdWx0VmFsdWU6IiIsdXNlTG9jYWxTdG9yYWdlOiExLHBvbHltZXJQcm9wZXJ0eToiX3RhZ0ZpbHRlciJ9KX1fY29tcHV0ZVRhZ0ZpbHRlcigpe3JldHVybiB0aGlzLl90YWdGaWx0ZXJ9fTtmdW5jdGlvbiBlbCh0KXtjb25zdHttb2R1bGVOYW1lOmUsc3R5bGVDb250ZW50Om59PXQsaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkb20tbW9kdWxlIikscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpLG89W107dC5zdHlsZURlcGVuZGVuY2llcyYmdC5zdHlsZURlcGVuZGVuY2llcy5mb3JFYWNoKCh0PT57Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2Uuc2V0QXR0cmlidXRlKCJpbmNsdWRlIix0KSxvLnB1c2goZSl9KSk7Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO09iamVjdC5hc3NpZ24oYSx7dGV4dENvbnRlbnQ6bn0pLG8uZm9yRWFjaCgodD0+e3IuY29udGVudC5hcHBlbmRDaGlsZCh0KX0pKSxyLmNvbnRlbnQuYXBwZW5kQ2hpbGQoYSksaS5hcHBlbmRDaGlsZChyKSxpLnJlZ2lzdGVyKGUpfXRsLnRlbXBsYXRlPV9lYAogICAgPHBhcGVyLWlucHV0CiAgICAgIG5vLWxhYmVsLWZsb2F0PSIiCiAgICAgIGxhYmVsPSJGaWx0ZXIgdGFncyAocmVndWxhciBleHByZXNzaW9ucyBzdXBwb3J0ZWQpIgogICAgICB2YWx1ZT0ie3tfdGFnRmlsdGVyfX0iCiAgICAgIGNsYXNzPSJzZWFyY2gtaW5wdXQiCiAgICA+CiAgICAgIDxpcm9uLWljb24gcHJlZml4PSIiIGljb249InNlYXJjaCIgc2xvdD0icHJlZml4Ij48L2lyb24taWNvbj4KICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDEwcHggNXB4IDEwcHggMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nLG5vdGlmeTohMCxjb21wdXRlZDoiX2NvbXB1dGVUYWdGaWx0ZXIoX3RhZ0ZpbHRlcikifSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHRsLnByb3RvdHlwZSwidGFnRmlsdGVyIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfdGFnRmlsdGVyT2JzZXJ2ZXIifSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHRsLnByb3RvdHlwZSwiX3RhZ0ZpbHRlciIsdm9pZCAwKSx0bD10KFtpKCJ0Zi10YWctZmlsdGVyZXIiKV0sdGwpLGVsKHttb2R1bGVOYW1lOiJkYXNoYm9hcmQtc3R5bGUiLHN0eWxlRGVwZW5kZW5jaWVzOlsiaXJvbi1mbGV4Il0sc3R5bGVDb250ZW50OiJcbiAgICAgIDpob3N0IHtcbiAgICAgICAgLS1zaWRlYmFyLXZlcnRpY2FsLXBhZGRpbmc6IDE1cHg7XG4gICAgICAgIC0tc2lkZWJhci1sZWZ0LXBhZGRpbmc6IDMwcHg7XG4gICAgICB9XG5cbiAgICAgIFtzbG90PSdzaWRlYmFyJ10ge1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICAgICAgICBwYWRkaW5nOiA1cHggMDtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICB9XG5cbiAgICAgIC5zZXR0aW5ncyB7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDUwcHg7XG4gICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTtcbiAgICAgIH1cblxuICAgICAgLnJ1bnMtc2VsZWN0b3Ige1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWdyb3c6IDE7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDIwMHB4O1xuICAgICAgfVxuXG4gICAgICB0Zi1ydW5zLXNlbGVjdG9yIHtcbiAgICAgICAgZmxleC1ncm93OiAxO1xuICAgICAgICBmbGV4LXNocmluazogMTtcbiAgICAgICAgbGVmdDogdmFyKC0tc2lkZWJhci1sZWZ0LXBhZGRpbmcpO1xuICAgICAgICBtYXgtaGVpZ2h0OiBjYWxjKDEwMCUgLSB2YXIoLS1zaWRlYmFyLXZlcnRpY2FsLXBhZGRpbmcpICogMik7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICB9XG5cbiAgICAgIC5zZWFyY2gtaW5wdXQge1xuICAgICAgICBtYXJnaW46IDEwcHggNXB4IDAgMTBweDtcbiAgICAgIH1cblxuICAgICAgLnNpZGViYXItc2VjdGlvbiB7XG4gICAgICAgIGJvcmRlci10b3A6IHNvbGlkIDFweCB2YXIoLS10Yi11aS1ib3JkZXIpO1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gICAgICAgIHBhZGRpbmc6IHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgMFxuICAgICAgICAgIHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgdmFyKC0tc2lkZWJhci1sZWZ0LXBhZGRpbmcpO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB9XG5cbiAgICAgIC5zaWRlYmFyLXNlY3Rpb246Zmlyc3Qtb2YtdHlwZSB7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIH1cblxuICAgICAgLnNpZGViYXItc2VjdGlvbiBwYXBlci1idXR0b24ge1xuICAgICAgICBtYXJnaW46IDVweDtcbiAgICAgIH1cblxuICAgICAgLnNpZGViYXItc2VjdGlvbiBwYXBlci1idXR0b246Zmlyc3Qtb2YtdHlwZSB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAwICFpbXBvcnRhbnQ7XG4gICAgICB9XG5cbiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmxhc3Qtb2YtdHlwZSB7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMCAhaW1wb3J0YW50O1xuICAgICAgfVxuXG4gICAgICAuc2lkZWJhci1zZWN0aW9uID4gOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICAgICAgcGFkZGluZy10b3A6IDA7XG4gICAgICB9XG5cbiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6bGFzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiAwO1xuICAgICAgfVxuXG4gICAgICAuc2lkZWJhci1zZWN0aW9uIGgzIHtcbiAgICAgICAgY29sb3I6IHZhcigtLXRiLXNlY29uZGFyeS10ZXh0LWNvbG9yKTtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICAgICAgbWFyZ2luOiAxMHB4IDAgNXB4O1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIH1cblxuICAgICAgcGFwZXItY2hlY2tib3gge1xuICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTtcbiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTtcbiAgICAgICAgZm9udC1zaXplOiAxNXB4O1xuICAgICAgICBtYXJnaW4tdG9wOiA1cHg7XG4gICAgICB9XG5cbiAgICAgIGEge1xuICAgICAgICBjb2xvcjogdmFyKC0tdGItbGluayk7XG4gICAgICB9XG5cbiAgICAgIGE6dmlzaXRlZCB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS10Yi1saW5rLXZpc2l0ZWQpO1xuICAgICAgfVxuICAifSk7Y29uc3Qgbmw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtmdW5jdGlvbiBpbCh0KXtyZXR1cm4gY2xhc3MgZXh0ZW5kcyB0e2Nvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLl9tYXliZVNldERhcmtNb2RlKCksdGhpcy5vYnNlcnZlcj1uZXcgTXV0YXRpb25PYnNlcnZlcigodD0+e3Quc29tZSgodD0+ImNsYXNzIj09PXQuYXR0cmlidXRlTmFtZSkpJiZ0aGlzLl9tYXliZVNldERhcmtNb2RlKCl9KSksdGhpcy5vYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHkse2F0dHJpYnV0ZXM6ITB9KX1kaXNjb25uZWN0ZWRDYWxsYmFjaygpe3ZhciB0O3N1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCksbnVsbD09PSh0PXRoaXMub2JzZXJ2ZXIpfHx2b2lkIDA9PT10fHx0LmRpc2Nvbm5lY3QoKX1fbWF5YmVTZXREYXJrTW9kZSgpe3RoaXMuY2xhc3NMaXN0LnRvZ2dsZSgiZGFyay1tb2RlIixkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucygiZGFyay1tb2RlIikpfX19bmwuc2V0QXR0cmlidXRlKCJpcyIsImN1c3RvbS1zdHlsZSIpLG5sLnRleHRDb250ZW50PSJcbiAgOnJvb3Qge1xuICAgIC0tdGItb3JhbmdlLXdlYWs6ICNmZmE3MjY7XG4gICAgLS10Yi1vcmFuZ2Utc3Ryb25nOiAjZjU3YzAwO1xuICAgIC0tdGItb3JhbmdlLWRhcms6ICNkYzczMjA7XG4gICAgLS10Yi1ncmV5LWRhcmtlcjogI2UyZTJlMjtcbiAgICAtLXRiLWdyZXktbGlnaHRlcjogI2YzZjNmMztcbiAgICAtLXRiLXVpLWRhcmstYWNjZW50OiAjNzU3NTc1O1xuICAgIC0tdGItdWktbGlnaHQtYWNjZW50OiAjZTBlMGUwO1xuICAgIC0tdGItdWktYm9yZGVyOiB2YXIoLS1wYXBlci1ncmV5LTMwMCk7XG4gICAgLS10Yi1ncmFwaC1mYWRlZDogI2UwZDRiMztcbiAgICAtLXRiLXNlY29uZGFyeS10ZXh0LWNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTgwMCk7XG4gICAgLS10Yi1yYWlzZWQtYnV0dG9uLXNoYWRvdy1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjIpO1xuICAgIC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIC0tc2Vjb25kYXJ5LWJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7XG4gICAgLS10Yi1sYXlvdXQtYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcbiAgICAtLXRiLWxpbms6ICMxOTc2ZDI7IC8qIG1hdGVyaWFsIGJsdWUgNzAwLiAqL1xuICAgIC0tdGItbGluay12aXNpdGVkOiAjN2IxZmEyOyAvKiBtYXRlcmlhbCBwdXJwbGUgNzAwLiAqL1xuICB9XG5cbiAgOnJvb3QgLmRhcmstbW9kZSB7XG4gICAgLS10Yi11aS1ib3JkZXI6IHZhcigtLXBhcGVyLWdyZXktNzAwKTtcbiAgICAtLXRiLXVpLWRhcmstYWNjZW50OiB2YXIoLS1wYXBlci1ncmV5LTQwMCk7XG4gICAgLS10Yi11aS1saWdodC1hY2NlbnQ6IHZhcigtLXBhcGVyLWdyZXktNjAwKTtcbiAgICAtLXRiLXNlY29uZGFyeS10ZXh0LWNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTQwMCk7XG4gICAgLS10Yi1yYWlzZWQtYnV0dG9uLXNoYWRvdy1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpO1xuICAgIC0tcHJpbWFyeS10ZXh0LWNvbG9yOiAjZmZmO1xuICAgIC0tc2Vjb25kYXJ5LXRleHQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNDAwKTtcbiAgICAtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvcjogIzMwMzAzMDsgIC8qIG1hdGVyaWFsIGdyZXkgQTQwMC4gKi9cbiAgICAtLXNlY29uZGFyeS1iYWNrZ3JvdW5kLWNvbG9yOiAjM2EzYTNhO1xuICAgIC0tdGItbGF5b3V0LWJhY2tncm91bmQtY29sb3I6ICMzYTNhM2E7XG4gICAgLS10Yi1saW5rOiAjNDJhNWY1OyAvKiBtYXRlcmlhbCBibHVlIDQwMC4gKi9cbiAgICAtLXRiLWxpbmstdmlzaXRlZDogI2JhNjhjODsgLyogbWF0ZXJpYWwgcHVycGxlIDMwMC4gKi9cbiAgICAvKiBPdmVycmlkZXMgcGFwZXItbWF0ZXJpYWwgKi9cbiAgICAtLXNoYWRvdy1lbGV2YXRpb24tMmRwXy1fYm94LXNoYWRvdzogMCAycHggMnB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE0KSxcbiAgICAgIDAgMXB4IDVweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMiksXG4gICAgICAwIDNweCAxcHggLTJweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7XG4gIH1cbiIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChubCksZWwoe21vZHVsZU5hbWU6InNjcm9sbGJhci1zdHlsZSIsc3R5bGVDb250ZW50OiJcbiAgICAuc2Nyb2xsYmFyOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG4gICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgfVxuXG4gICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICAgICAgd2lkdGg6IDEwcHg7XG4gICAgfVxuXG4gICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xuICAgICAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgICAgIC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAwIDJweCByZ2JhKDAsIDAsIDAsIDAuMyk7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTUwMCk7XG4gICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApO1xuICAgIH1cbiAgICAuc2Nyb2xsYmFyIHtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuICAifSk7bGV0IHJsPWNsYXNzIGV4dGVuZHMoaWwoeWUpKXt9O3JsLnRlbXBsYXRlPV9lYAogICAgPGRpdiBpZD0ic2lkZWJhciI+CiAgICAgIDxzbG90IG5hbWU9InNpZGViYXIiPjwvc2xvdD4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9ImNlbnRlciI+CiAgICAgIDxzbG90IG5hbWU9ImNlbnRlciIgY2xhc3M9InNjb2xsYmFyIj48L3Nsb3Q+CiAgICA8L2Rpdj4KICAgIDxzdHlsZSBpbmNsdWRlPSJzY3JvbGxiYXItc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIDpob3N0KC5kYXJrLW1vZGUpIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zZWNvbmRhcnktYmFja2dyb3VuZC1jb2xvcik7CiAgICAgIH0KCiAgICAgICNzaWRlYmFyIHsKICAgICAgICBmbGV4OiAwIDAgdmFyKC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLWJhc2lzLCAyNSUpOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBtYXgtd2lkdGg6IHZhcigtLXRmLWRhc2hib2FyZC1sYXlvdXQtc2lkZWJhci1tYXgtd2lkdGgsIDM1MHB4KTsKICAgICAgICBtaW4td2lkdGg6IHZhcigtLXRmLWRhc2hib2FyZC1sYXlvdXQtc2lkZWJhci1taW4td2lkdGgsIDI3MHB4KTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CgogICAgICAjY2VudGVyIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIDo6c2xvdHRlZChbc2xvdD0nY2VudGVyJ10pIHsKICAgICAgICBjb250YWluOiBzdHJpY3Q7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KCiAgICAgIC50Zi1ncmFwaC1kYXNoYm9hcmQgI2NlbnRlciB7CiAgICAgICAgYmFja2dyb3VuZDogI2ZmZjsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHJsPXQoW2koInRmLWRhc2hib2FyZC1sYXlvdXQiKV0scmwpO2NvbnN0IG9sPSJURi5UZW5zb3JCb2FyZC5QYWdpbmF0ZWRWaWV3LmxpbWl0IjtsZXQgYWw9bnVsbDtjb25zdCBzbD1uZXcgU2V0O2Z1bmN0aW9uIGxsKHQpe3NsLmFkZCh0KX1mdW5jdGlvbiBjbCh0KXtzbC5kZWxldGUodCl9ZnVuY3Rpb24gdWwoKXtyZXR1cm4gbnVsbD09YWwmJihhbD1VcyhvbCx7dXNlTG9jYWxTdG9yYWdlOiEwfSksKG51bGw9PWFsfHwhaXNGaW5pdGUoYWwpfHxhbDw9MCkmJihhbD0xMikpLGFsfWNsYXNzIGhsIGV4dGVuZHMgeWV7dXBkYXRlQXJyYXlQcm9wKHQsZSxuKXtsZXQgaT10aGlzLmdldCh0KTtjb25zdCByPWU7aWYoIUFycmF5LmlzQXJyYXkocikpdGhyb3cgUmFuZ2VFcnJvcihgRXhwZWN0ZWQgbmV3IHZhbHVlIHRvICcke3R9JyB0byBiZSBhbiBhcnJheS5gKTtBcnJheS5pc0FycmF5KGkpfHwoaT1bXSx0aGlzLnNldCh0LGkpKTtjb25zdCBvPW5ldyBTZXQoci5tYXAoKCh0LGUpPT5uKHQsZSkpKSk7bGV0IGE9MCxzPTA7Zm9yKDthPGkubGVuZ3RoJiZzPHIubGVuZ3RoOylvLmhhcyhuKGlbYV0sYSkpPyhuKGlbYV0sYSk9PW4ocltzXSxzKT90aGlzLnNldChgJHt0fS4ke2F9YCxyW3NdKTp0aGlzLnNwbGljZSh0LGEsMCxyW3NdKSxzKyssYSsrKTp0aGlzLnNwbGljZSh0LGEsMSk7YTxpLmxlbmd0aCYmdGhpcy5zcGxpY2UodCxhKSxzPHIubGVuZ3RoJiZ0aGlzLnB1c2godCwuLi5yLnNsaWNlKHMpKX19Y2xhc3MgZGwgZXh0ZW5kcyBobHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5hcz0iaXRlbSIsdGhpcy5fY29udGVudEFjdGl2ZT0hMCx0aGlzLl9kb21Cb290c3RyYXBwZWQ9ITEsdGhpcy5fY3Rvcj1udWxsLHRoaXMuX3JlbmRlcmVkSXRlbXM9W10sdGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3Q9bmV3IE1hcCx0aGlzLl9scnVDYWNoZWRJdGVtcz1uZXcgTWFwLHRoaXMuX2NhY2hlU2l6ZT0xMCx0aGlzLl9nZXRJdGVtS2V5PXQ9PkpTT04uc3RyaW5naWZ5KHQpLHRoaXMuX2lzQ29ubmVjdGVkPSExfWNvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLl9pc0Nvbm5lY3RlZD0hMH1zZXRDYWNoZVNpemUodCl7dGhpcy5fY2FjaGVTaXplPXR9c2V0R2V0SXRlbUtleSh0KXt0aGlzLl9nZXRJdGVtS2V5PXR9dXBkYXRlRG9tKHQpe3RoaXMudXBkYXRlQXJyYXlQcm9wKCJfcmVuZGVyZWRJdGVtcyIsdCx0aGlzLl9nZXRJdGVtS2V5KX1fZW5zdXJlVGVtcGxhdGl6ZWQoKXtpZighdGhpcy5pc0Nvbm5lY3RlZClyZXR1cm4hMTtpZighdGhpcy5fY3Rvcil7Y29uc3QgdD10aGlzLnF1ZXJ5U2VsZWN0b3IoInRlbXBsYXRlIik7dGhpcy5fY3Rvcj0kcih0LHRoaXMse3BhcmVudE1vZGVsOiEwLGluc3RhbmNlUHJvcHM6e1t0aGlzLmFzXTohMCxhY3RpdmU6dGhpcy5fY29udGVudEFjdGl2ZX0sZm9yd2FyZEhvc3RQcm9wOmZ1bmN0aW9uKHQsZSl7dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZm9yRWFjaCgobj0+e24uZm9yd2FyZEhvc3RQcm9wKHQsZSl9KSl9fSl9cmV0dXJuITB9X2Jvb3RzdHJhcERvbSgpe3RoaXMuX2Vuc3VyZVRlbXBsYXRpemVkKCkmJiF0aGlzLl9kb21Cb290c3RyYXBwZWQmJihuZXcgTXV0YXRpb25PYnNlcnZlcigodD0+e2Zvcihjb25zdCBlIG9mIHQpaWYoImNoaWxkTGlzdCI9PT1lLnR5cGUpZm9yKGNvbnN0IHQgb2YgQXJyYXkuZnJvbShlLmFkZGVkTm9kZXMpKXQgaW5zdGFuY2VvZiBFbGVtZW50JiZ0LnNldEF0dHJpYnV0ZSgic2xvdCIsIml0ZW1zIil9KSkub2JzZXJ2ZSh0aGlzLHtjaGlsZExpc3Q6ITB9KSxBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pLmZvckVhY2goKHQ9Pnt0aGlzLnJlbW92ZUNoaWxkKHQpfSkpLHRoaXMuX2xydUNhY2hlZEl0ZW1zLmNsZWFyKCksdGhpcy5fcmVuZGVyZWRJdGVtcy5mb3JFYWNoKCgodCxlKT0+dGhpcy5faW5zZXJ0SXRlbSh0LGUpKSksdGhpcy5fZG9tQm9vdHN0cmFwcGVkPSEwKX1fdXBkYXRlQWN0aXZlKCl7dGhpcy5fZG9tQm9vdHN0cmFwcGVkJiZBcnJheS5mcm9tKHRoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LnZhbHVlcygpKS5mb3JFYWNoKCh0PT57dC5ub3RpZnlQYXRoKCJhY3RpdmUiLHRoaXMuX2NvbnRlbnRBY3RpdmUpfSkpfV91cGRhdGVEb20odCl7aWYodGhpcy5fZG9tQm9vdHN0cmFwcGVkJiYiX3JlbmRlcmVkSXRlbXMiIT10LnBhdGgmJiJfcmVuZGVyZWRJdGVtcy5sZW5ndGgiIT10LnBhdGgpaWYoIl9yZW5kZXJlZEl0ZW1zLnNwbGljZXMiPT09dC5wYXRoKXQudmFsdWUuaW5kZXhTcGxpY2VzLmZvckVhY2goKHQ9Pntjb25zdHtpbmRleDplLGFkZGVkQ291bnQ6bixvYmplY3Q6aSxyZW1vdmVkOnJ9PXQ7ci5mb3JFYWNoKCh0PT57dGhpcy5fcmVtb3ZlSXRlbSh0LHRoaXMuY2hpbGRyZW5bZV0pfSkpLGkuc2xpY2UoZSxlK24pLmZvckVhY2goKCh0LG4pPT50aGlzLl9pbnNlcnRJdGVtKHQsZStuKSkpLHRoaXMuX3RyaW1DYWNoZSgpfSkpO2Vsc2V7Y29uc3QgZT10aGlzLl9nZXRJdGVtS2V5KHQudmFsdWUpO3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmhhcyhlKT90aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5nZXQoZSkubm90aWZ5UGF0aCh0aGlzLmFzLHQudmFsdWUpOmNvbnNvbGUud2FybihgRXhwZWN0ZWQgJyR7ZX0nIHRvIGV4aXN0IGluIHRoZSBET00gYnV0IGNvdWxkIG5vdCBmaW5kIG9uZS5gKX19X2luc2VydEl0ZW0odCxlKXtpZighdGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKSl0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIHRlbXBsYXRpemVkIGJlZm9yZSBpbnNlcnRpbmcgYW4gaXRlbSIpO2xldCBuO2NvbnN0IGk9dGhpcy5fZ2V0SXRlbUtleSh0KTtpZih0aGlzLl9scnVDYWNoZWRJdGVtcy5oYXMoaSkpbj10aGlzLl9scnVDYWNoZWRJdGVtcy5nZXQoaSksdGhpcy5fbHJ1Q2FjaGVkSXRlbXMuZGVsZXRlKGkpLHRoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmdldChpKS5ub3RpZnlQYXRoKCJhY3RpdmUiLHRoaXMuX2NvbnRlbnRBY3RpdmUpO2Vsc2V7Y29uc3QgZT1uZXcgdGhpcy5fY3Rvcih7W3RoaXMuYXNdOnQsYWN0aXZlOnRoaXMuX2NvbnRlbnRBY3RpdmV9KTtuPWUucm9vdCx0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5zZXQoaSxlKX10aGlzLmNoaWxkcmVuW2VdP3RoaXMuaW5zZXJ0QmVmb3JlKG4sdGhpcy5jaGlsZHJlbltlXSk6KChuLm5vZGVUeXBlPT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU/QXJyYXkuZnJvbShuLmNoaWxkcmVuKTpbbl0pLmZvckVhY2goKHQ9PnQuc2V0QXR0cmlidXRlKCJzbG90IiwiaXRlbXMiKSkpLHRoaXMuYXBwZW5kQ2hpbGQobikpfV9yZW1vdmVJdGVtKHQsZSl7ZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7Y29uc3Qgbj10aGlzLl9nZXRJdGVtS2V5KHQpO3RoaXMuX2xydUNhY2hlZEl0ZW1zLnNldChuLGUpLHRoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmdldChuKS5ub3RpZnlQYXRoKCJhY3RpdmUiLCExKX1fdHJpbUNhY2hlKCl7Zm9yKDt0aGlzLl9scnVDYWNoZWRJdGVtcy5zaXplPnRoaXMuX2NhY2hlU2l6ZTspe2NvbnN0W3RdPXRoaXMuX2xydUNhY2hlZEl0ZW1zLmtleXMoKTt0aGlzLl9scnVDYWNoZWRJdGVtcy5kZWxldGUodCksdGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZGVsZXRlKHQpfX19dChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sZGwucHJvdG90eXBlLCJhcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sZGwucHJvdG90eXBlLCJpdGVtcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGRsLnByb3RvdHlwZSwiX2NvbnRlbnRBY3RpdmUiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGRsLnByb3RvdHlwZSwiX2RvbUJvb3RzdHJhcHBlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxkbC5wcm90b3R5cGUsIl9jdG9yIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxkbC5wcm90b3R5cGUsIl9yZW5kZXJlZEl0ZW1zIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGRsLnByb3RvdHlwZSwiX3JlbmRlcmVkVGVtcGxhdGVJbnN0Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGRsLnByb3RvdHlwZSwiX2xydUNhY2hlZEl0ZW1zIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGRsLnByb3RvdHlwZSwiX2NhY2hlU2l6ZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxkbC5wcm90b3R5cGUsIl9nZXRJdGVtS2V5Iix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxkbC5wcm90b3R5cGUsIl9pc0Nvbm5lY3RlZCIsdm9pZCAwKSx0KFthKCJfaXNDb25uZWN0ZWQiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGRsLnByb3RvdHlwZSwiX2Jvb3RzdHJhcERvbSIsbnVsbCksdChbYSgiX2NvbnRlbnRBY3RpdmUiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGRsLnByb3RvdHlwZSwiX3VwZGF0ZUFjdGl2ZSIsbnVsbCksdChbYSgiX3JlbmRlcmVkSXRlbXMuKiIsIl9kb21Cb290c3RyYXBwZWQiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbT2JqZWN0XSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGRsLnByb3RvdHlwZSwiX3VwZGF0ZURvbSIsbnVsbCksdChbYSgiX2NhY2hlU2l6ZSIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sZGwucHJvdG90eXBlLCJfdHJpbUNhY2hlIixudWxsKTtsZXQgcGw9Y2xhc3MgZXh0ZW5kcyBkbHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5kaXNhYmxlUGFnaW5hdGlvbj0hMSx0aGlzLmdldENhdGVnb3J5SXRlbUtleT10PT5KU09OLnN0cmluZ2lmeSh0KSx0aGlzLl9saW1pdD0xMix0aGlzLl9hY3RpdmVJbmRleD0wLHRoaXMuX3BhZ2VJbnB1dFJhd1ZhbHVlPSIiLHRoaXMuX3BhZ2VJbnB1dEZvY3VzZWQ9ITF9X2NvbXB1dGVDb3VudCgpe3JldHVybiB0aGlzLmNhdGVnb3J5Lml0ZW1zLmxlbmd0aH1nZXQgX2hhc011bHRpcGxlKCl7cmV0dXJuIHRoaXMuX2NvdW50PjF9X3RvZ2dsZVBhbmUoKXt0aGlzLm9wZW5lZD0hdGhpcy5vcGVuZWR9X2NoYW5nZUNvbnRlbnRBY3RpdmUodCl7dGhpcy5fY29udGVudEFjdGl2ZT10fV9vblBhbmVSZW5kZXJlZENoYW5nZWQodCxlKXt0JiZ0IT09ZSYmdGhpcy4kLmlmUmVuZGVyZWQucmVuZGVyKCl9X2NvbXB1dGVQYW5lUmVuZGVyZWQodCl7cmV0dXJuISh0Lm1ldGFkYXRhLnR5cGU9PT1ici5TRUFSQ0hfUkVTVUxUUyYmIiI9PT10Lm5hbWUpfWdldCBfaXRlbXNSZW5kZXJlZCgpe3JldHVybiB0aGlzLl9wYW5lUmVuZGVyZWQmJnRoaXMub3BlbmVkfV9jb21wdXRlSXNTZWFyY2hSZXN1bHRzKHQpe3JldHVybiB0PT09YnIuU0VBUkNIX1JFU1VMVFN9X2NvbXB1dGVJc0ludmFsaWRTZWFyY2hSZXN1bHRzKHQpe3JldHVybiB0LnR5cGU9PT1ici5TRUFSQ0hfUkVTVUxUUyYmIXQudmFsaWRSZWdleH1fY29tcHV0ZUlzVW5pdmVyc2FsU2VhcmNoUXVlcnkodCl7cmV0dXJuIHQudHlwZT09PWJyLlNFQVJDSF9SRVNVTFRTJiZ0LnVuaXZlcnNhbFJlZ2V4fV9pc0NvbXBvc2l0ZVNlYXJjaCgpe2NvbnN0e3R5cGU6dCxjb21wb3NpdGVTZWFyY2g6ZX09dGhpcy5jYXRlZ29yeS5tZXRhZGF0YTtyZXR1cm4gZSYmdD09PWJyLlNFQVJDSF9SRVNVTFRTfXJlYWR5KCl7c3VwZXIucmVhZHkoKSx0aGlzLm9wZW5lZD1udWxsPT10aGlzLmluaXRpYWxPcGVuZWR8fHRoaXMuaW5pdGlhbE9wZW5lZCx0aGlzLl9saW1pdExpc3RlbmVyPSgpPT57dGhpcy5zZXQoIl9saW1pdCIsdWwoKSl9LGxsKHRoaXMuX2xpbWl0TGlzdGVuZXIpLHRoaXMuX2xpbWl0TGlzdGVuZXIoKX1kZXRhY2hlZCgpe2NsKHRoaXMuX2xpbWl0TGlzdGVuZXIpfV91cGRhdGVSZW5kZXJlZEl0ZW1zKCl7dmFyIHQ9dGhpcy5fbGltaXQsZT10aGlzLmRpc2FibGVQYWdpbmF0aW9uO2lmKCF0aGlzLl9pdGVtc1JlbmRlcmVkKXJldHVybjtjb25zdCBuPU1hdGguZmxvb3IodGhpcy5fYWN0aXZlSW5kZXgvdCksaT10aGlzLmNhdGVnb3J5Lml0ZW1zfHxbXSxyPWU/aTppLnNsaWNlKG4qdCwobisxKSp0KTt0aGlzLnVwZGF0ZURvbShyKX1fbGltaXRDaGFuZ2VkKHQpe3RoaXMuc2V0Q2FjaGVTaXplKDIqdCl9X2dldENhdGVnb3J5SXRlbUtleUNoYW5nZWQoKXt0aGlzLnNldEdldEl0ZW1LZXkodGhpcy5nZXRDYXRlZ29yeUl0ZW1LZXkpfWdldCBfY3VycmVudFBhZ2UoKXtyZXR1cm4gTWF0aC5mbG9vcih0aGlzLl9hY3RpdmVJbmRleC90aGlzLl9saW1pdCkrMX1fY29tcHV0ZVBhZ2VDb3VudCh0LGUpe3JldHVybiB0aGlzLmNhdGVnb3J5P01hdGguY2VpbCh0aGlzLmNhdGVnb3J5Lml0ZW1zLmxlbmd0aC9lKTowfWdldCBfbXVsdGlwbGVQYWdlc0V4aXN0KCl7cmV0dXJuIXRoaXMuZGlzYWJsZVBhZ2luYXRpb24mJnRoaXMuX3BhZ2VDb3VudD4xfWdldCBfaGFzUHJldmlvdXNQYWdlKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnRQYWdlPjF9Z2V0IF9oYXNOZXh0UGFnZSgpe3JldHVybiB0aGlzLl9jdXJyZW50UGFnZTx0aGlzLl9wYWdlQ291bnR9X2NvbXB1dGVJbnB1dFdpZHRoKHQpe3JldHVybmBjYWxjKCR7dC50b1N0cmluZygpLmxlbmd0aH1lbSArIDIwcHgpYH1fc2V0QWN0aXZlSW5kZXgodCl7Y29uc3QgZT0odGhpcy5jYXRlZ29yeS5pdGVtc3x8W10pLmxlbmd0aC0xO3Q+ZSYmKHQ9ZSksdDwwJiYodD0wKSx0aGlzLnNldCgiX2FjdGl2ZUluZGV4Iix0KX1fY2xhbXBBY3RpdmVJbmRleCgpe3RoaXMuX3NldEFjdGl2ZUluZGV4KHRoaXMuX2FjdGl2ZUluZGV4KX1fcGVyZm9ybVByZXZpb3VzUGFnZSgpe3RoaXMuX3NldEFjdGl2ZUluZGV4KHRoaXMuX2FjdGl2ZUluZGV4LXRoaXMuX2xpbWl0KX1fcGVyZm9ybU5leHRQYWdlKCl7dGhpcy5fc2V0QWN0aXZlSW5kZXgodGhpcy5fYWN0aXZlSW5kZXgrdGhpcy5fbGltaXQpfV9jb21wdXRlUGFnZUlucHV0VmFsdWUodCxlLG4pe3JldHVybiB0P2U6bi50b1N0cmluZygpfV9oYW5kbGVQYWdlSW5wdXRFdmVudCh0KXt0aGlzLnNldCgiX3BhZ2VJbnB1dFJhd1ZhbHVlIix0LnRhcmdldC52YWx1ZSk7Y29uc3QgZT1OdW1iZXIodC50YXJnZXQudmFsdWV8fE5hTik7aWYoaXNOYU4oZSkpcmV0dXJuO2NvbnN0IG49TWF0aC5tYXgoMSxNYXRoLm1pbihlLHRoaXMuX3BhZ2VDb3VudCkpLTE7dGhpcy5fc2V0QWN0aXZlSW5kZXgodGhpcy5fbGltaXQqbil9X2hhbmRsZVBhZ2VDaGFuZ2VFdmVudCgpe3RoaXMuc2V0KCJfcGFnZUlucHV0UmF3VmFsdWUiLHRoaXMuX2N1cnJlbnRQYWdlLnRvU3RyaW5nKCkpfV9oYW5kbGVQYWdlRm9jdXNFdmVudCgpe3RoaXMuc2V0KCJfcGFnZUlucHV0UmF3VmFsdWUiLHRoaXMuX3BhZ2VJbnB1dFZhbHVlKSx0aGlzLnNldCgiX3BhZ2VJbnB1dEZvY3VzZWQiLCEwKX1faGFuZGxlUGFnZUJsdXJFdmVudCgpe3RoaXMuc2V0KCJfcGFnZUlucHV0Rm9jdXNlZCIsITEpfV91cGRhdGVQYWdlSW5wdXRWYWx1ZSh0KXtjb25zdCBlPXRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCIjcGFnZS1pbnB1dCBpbnB1dCIpO2UmJihlLnZhbHVlPXQpfV91cGRhdGVJbnB1dFdpZHRoKCl7dGhpcy51cGRhdGVTdHlsZXMoeyItLXRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3LXBhZ2UtaW5wdXQtd2lkdGgiOnRoaXMuX2lucHV0V2lkdGh9KX19O3BsLnRlbXBsYXRlPV9lYAogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19wYW5lUmVuZGVyZWRdXSIgaWQ9ImlmUmVuZGVyZWQiPgogICAgICA8YnV0dG9uIGNsYXNzPSJoZWFkaW5nIiBvbi10YXA9Il90b2dnbGVQYW5lIiBvcGVuLWJ1dHRvbiQ9Iltbb3BlbmVkXV0iPgogICAgICAgIDxzcGFuIGNsYXNzPSJuYW1lIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNTZWFyY2hSZXN1bHRzXV0iPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzQ29tcG9zaXRlU2VhcmNoKGNhdGVnb3J5KV1dIj4KICAgICAgICAgICAgICA8c3Bhbj5UYWdzIG1hdGNoaW5nIG11bHRpcGxlIGV4cGVyaW1lbnRzPC9zcGFuPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNJbnZhbGlkU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgICAgIDxzcGFuCiAgICAgICAgICAgICAgICAgID4mbmJzcDs8c3Ryb25nPihtYWxmb3JtZWQgcmVndWxhciBleHByZXNzaW9uKTwvc3Ryb25nPjwvc3BhbgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzQ29tcG9zaXRlU2VhcmNoKGNhdGVnb3J5KV1dIj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGlnaHQiPlRhZ3MgbWF0Y2hpbmcgLzwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY2F0ZWdvcnktbmFtZSIgdGl0bGUkPSJbW2NhdGVnb3J5Lm5hbWVdXSIKICAgICAgICAgICAgICAgID5bW2NhdGVnb3J5Lm5hbWVdXTwvc3BhbgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGlnaHQiPi88L3NwYW4+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5XV0iPgogICAgICAgICAgICAgICAgPHNwYW4+IChhbGwgdGFncyk8L3NwYW4+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzSW52YWxpZFNlYXJjaFJlc3VsdHNdXSI+CiAgICAgICAgICAgICAgICA8c3Bhbj4gPHN0cm9uZz4obWFsZm9ybWVkIHJlZ3VsYXIgZXhwcmVzc2lvbik8L3N0cm9uZz48L3NwYW4+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9pc1NlYXJjaFJlc3VsdHNdXSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS1uYW1lIiB0aXRsZSQ9IltbY2F0ZWdvcnkubmFtZV1dIgogICAgICAgICAgICAgID5bW2NhdGVnb3J5Lm5hbWVdXTwvc3BhbgogICAgICAgICAgICA+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iY291bnQiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZV1dIj4KICAgICAgICAgICAgPHNwYW4+W1tfY291bnRdXTwvc3Bhbj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249ImV4cGFuZC1tb3JlIiBjbGFzcz0iZXhwYW5kLWFycm93Ij48L2lyb24taWNvbj4KICAgICAgICA8L3NwYW4+CiAgICAgIDwvYnV0dG9uPgogICAgICA8IS0tIFRPRE8oc3RlcGhhbndsZWUpOiBpbnZlc3RpZ2F0ZSBmdXJ0aGVyLiBGb3Igc29tZSByZWFzb24sCiAgICAgICAgdHJhbnNpdGlvbmVuZCB0aGF0IHRoZSBpcm9uLWNvbGxhcHNlIHJlbGllcyBvbiBzb21ldGltZXMgZG9lcyBub3QKICAgICAgICB0cmlnZ2VyIHdoZW4gcmVuZGVyaW5nIGEgY2hhcnQgd2l0aCBhIHNwaW5uZXIuIEEgdG95IGV4YW1wbGUgY2Fubm90CiAgICAgICAgcmVwcm9kdWNlIHRoaXMgYnVnLiAtLT4KICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW29wZW5lZF1dIiBuby1hbmltYXRpb249IiI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+CiAgICAgICAgICA8c3BhbiBpZD0idG9wLW9mLWNvbnRhaW5lciI+PC9zcGFuPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19tdWx0aXBsZVBhZ2VzRXhpc3RdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJpZy1wYWdlLWJ1dHRvbnMiIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAxMHB4OyI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbgogICAgICAgICAgICAgICAgb24tdGFwPSJfcGVyZm9ybVByZXZpb3VzUGFnZSIKICAgICAgICAgICAgICAgIGRpc2FibGVkJD0iW1shX2hhc1ByZXZpb3VzUGFnZV1dIgogICAgICAgICAgICAgICAgPlByZXZpb3VzIHBhZ2U8L3BhcGVyLWJ1dHRvbgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgICBvbi10YXA9Il9wZXJmb3JtTmV4dFBhZ2UiCiAgICAgICAgICAgICAgICBkaXNhYmxlZCQ9IltbIV9oYXNOZXh0UGFnZV1dIgogICAgICAgICAgICAgICAgPk5leHQgcGFnZTwvcGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgICAgPGRpdiBpZD0iaXRlbXMiPgogICAgICAgICAgICA8c2xvdCBuYW1lPSJpdGVtcyI+PC9zbG90PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX211bHRpcGxlUGFnZXNFeGlzdF1dIj4KICAgICAgICAgICAgPGRpdiBpZD0iY29udHJvbHMtY29udGFpbmVyIj4KICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmc6IDAgNXB4Ij4KICAgICAgICAgICAgICAgIFBhZ2UKICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dAogICAgICAgICAgICAgICAgICBpZD0icGFnZS1pbnB1dCIKICAgICAgICAgICAgICAgICAgdHlwZT0ibnVtYmVyIgogICAgICAgICAgICAgICAgICBuby1sYWJlbC1mbG9hdD0iIgogICAgICAgICAgICAgICAgICBtaW49IjEiCiAgICAgICAgICAgICAgICAgIG1heD0iW1tfcGFnZUNvdW50XV0iCiAgICAgICAgICAgICAgICAgIHZhbHVlPSJbW19wYWdlSW5wdXRWYWx1ZV1dIgogICAgICAgICAgICAgICAgICBvbi1pbnB1dD0iX2hhbmRsZVBhZ2VJbnB1dEV2ZW50IgogICAgICAgICAgICAgICAgICBvbi1jaGFuZ2U9Il9oYW5kbGVQYWdlQ2hhbmdlRXZlbnQiCiAgICAgICAgICAgICAgICAgIG9uLWZvY3VzPSJfaGFuZGxlUGFnZUZvY3VzRXZlbnQiCiAgICAgICAgICAgICAgICAgIG9uLWJsdXI9Il9oYW5kbGVQYWdlQmx1ckV2ZW50IgogICAgICAgICAgICAgICAgPjwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICBvZiBbW19wYWdlQ291bnRdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJpZy1wYWdlLWJ1dHRvbnMiIHN0eWxlPSJtYXJnaW4tdG9wOiAxMHB4OyI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbgogICAgICAgICAgICAgICAgb24tdGFwPSJfcGVyZm9ybVByZXZpb3VzUGFnZSIKICAgICAgICAgICAgICAgIGRpc2FibGVkJD0iW1shX2hhc1ByZXZpb3VzUGFnZV1dIgogICAgICAgICAgICAgICAgPlByZXZpb3VzIHBhZ2U8L3BhcGVyLWJ1dHRvbgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgICBvbi10YXA9Il9wZXJmb3JtTmV4dFBhZ2UiCiAgICAgICAgICAgICAgICBkaXNhYmxlZCQ9IltbIV9oYXNOZXh0UGFnZV1dIgogICAgICAgICAgICAgICAgPk5leHQgcGFnZTwvcGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgIDwvdGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDAgNXB4IDFweCAxMHB4OwogICAgICB9CgogICAgICA6aG9zdCg6Zmlyc3Qtb2YtdHlwZSkgewogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgIH0KCiAgICAgIDpob3N0KDpsYXN0LW9mLXR5cGUpIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICB9CgogICAgICAuaGVhZGluZyB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZvbnQtc2l6ZTogMTVweDsKICAgICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgICBib3gtc2hhZG93OiAwIDFweCA1cHggdmFyKC0tdGItcmFpc2VkLWJ1dHRvbi1zaGFkb3ctY29sb3IpOwogICAgICAgIHBhZGRpbmc6IDEwcHggMTVweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9CgogICAgICAuaGVhZGluZzo6LW1vei1mb2N1cy1pbm5lciB7CiAgICAgICAgcGFkZGluZzogMTBweCAxNXB4OwogICAgICB9CgogICAgICBbb3Blbi1idXR0b25dIHsKICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDAgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgW29wZW4tYnV0dG9uXSAuZXhwYW5kLWFycm93IHsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZVooMTgwZGVnKTsKICAgICAgfQoKICAgICAgLm5hbWUgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5saWdodCB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgfQoKICAgICAgLmNhdGVnb3J5LW5hbWUgewogICAgICAgIHdoaXRlLXNwYWNlOiBwcmU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBwYWRkaW5nOiAycHggMDsKICAgICAgfQoKICAgICAgLmNvdW50IHsKICAgICAgICBtYXJnaW46IDAgNXB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS01MDApOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBmbGV4OiBub25lOwogICAgICB9CgogICAgICAuaGVhZGluZzo6LW1vei1mb2N1cy1pbm5lciB7CiAgICAgICAgcGFkZGluZzogMTBweCAxNXB4OwogICAgICB9CgogICAgICAuY29udGVudCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvcik7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMnB4OwogICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAycHg7CiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGVkZWRlOwogICAgICAgIHBhZGRpbmc6IDE1cHg7CiAgICAgIH0KCiAgICAgIC5saWdodCB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgfQoKICAgICAgI2NvbnRyb2xzLWNvbnRhaW5lciB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2NvbnRyb2xzLWNvbnRhaW5lciBwYXBlci1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmJpZy1wYWdlLWJ1dHRvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIC5iaWctcGFnZS1idXR0b25zIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmbGV4LWJhc2lzOiAwOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KCiAgICAgIC5iaWctcGFnZS1idXR0b25zIHBhcGVyLWJ1dHRvbltkaXNhYmxlZF0gewogICAgICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICAgIH0KCiAgICAgIHNsb3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KCiAgICAgIDo6c2xvdHRlZChbc2xvdD0naXRlbXMnXSkgewogICAgICAgIC8qIFRvb2x0aXAgZm9yIGRlc2NyaXB0aW9ucyBhbmQgb3RoZXJzIGJyZWFrIHdpdGggbW9yZSBzdHJpY3Qgb25lcy4gKi8KICAgICAgICBjb250YWluOiBzdHlsZTsKICAgICAgfQoKICAgICAgI3BhZ2UtaW5wdXQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogdmFyKC0tdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXctcGFnZS1pbnB1dC13aWR0aCwgMTAwJSk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxwbC5wcm90b3R5cGUsImNhdGVnb3J5Iix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0scGwucHJvdG90eXBlLCJpbml0aWFsT3BlbmVkIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLHBsLnByb3RvdHlwZSwib3BlbmVkIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0scGwucHJvdG90eXBlLCJkaXNhYmxlUGFnaW5hdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVDb3VudChjYXRlZ29yeS5pdGVtcy4qKSJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0scGwucHJvdG90eXBlLCJfY291bnQiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZVBhbmVSZW5kZXJlZChjYXRlZ29yeSkiLG9ic2VydmVyOiJfb25QYW5lUmVuZGVyZWRDaGFuZ2VkIn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0scGwucHJvdG90eXBlLCJfcGFuZVJlbmRlcmVkIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVJc1NlYXJjaFJlc3VsdHMoY2F0ZWdvcnkubWV0YWRhdGEudHlwZSkifSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxwbC5wcm90b3R5cGUsIl9pc1NlYXJjaFJlc3VsdHMiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUlzSW52YWxpZFNlYXJjaFJlc3VsdHMoY2F0ZWdvcnkubWV0YWRhdGEpIn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0scGwucHJvdG90eXBlLCJfaXNJbnZhbGlkU2VhcmNoUmVzdWx0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSXNVbml2ZXJzYWxTZWFyY2hRdWVyeShjYXRlZ29yeS5tZXRhZGF0YSkifSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxwbC5wcm90b3R5cGUsIl9pc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfZ2V0Q2F0ZWdvcnlJdGVtS2V5Q2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0scGwucHJvdG90eXBlLCJnZXRDYXRlZ29yeUl0ZW1LZXkiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXIsb2JzZXJ2ZXI6Il9saW1pdENoYW5nZWQifSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLHBsLnByb3RvdHlwZSwiX2xpbWl0Iix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLHBsLnByb3RvdHlwZSwiX2FjdGl2ZUluZGV4Iix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZVBhZ2VDb3VudChjYXRlZ29yeS5pdGVtcy4qLCBfbGltaXQpIn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxwbC5wcm90b3R5cGUsIl9wYWdlQ291bnQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlSW5wdXRXaWR0aChfcGFnZUNvdW50KSIsb2JzZXJ2ZXI6Il91cGRhdGVJbnB1dFdpZHRoIn0pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxwbC5wcm90b3R5cGUsIl9pbnB1dFdpZHRoIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVBhZ2VJbnB1dFZhbHVlKF9wYWdlSW5wdXRGb2N1c2VkLCBfcGFnZUlucHV0UmF3VmFsdWUsIF9jdXJyZW50UGFnZSkiLG9ic2VydmVyOiJfdXBkYXRlUGFnZUlucHV0VmFsdWUifSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHBsLnByb3RvdHlwZSwiX3BhZ2VJbnB1dFZhbHVlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHBsLnByb3RvdHlwZSwiX3BhZ2VJbnB1dFJhd1ZhbHVlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0scGwucHJvdG90eXBlLCJfcGFnZUlucHV0Rm9jdXNlZCIsdm9pZCAwKSx0KFtzKCJfY291bnQiKSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0scGwucHJvdG90eXBlLCJfaGFzTXVsdGlwbGUiLG51bGwpLHQoW2EoIm9wZW5lZCIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtCb29sZWFuXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLHBsLnByb3RvdHlwZSwiX2NoYW5nZUNvbnRlbnRBY3RpdmUiLG51bGwpLHQoW3MoIm9wZW5lZCIsIl9wYW5lUmVuZGVyZWQiKSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0scGwucHJvdG90eXBlLCJfaXRlbXNSZW5kZXJlZCIsbnVsbCksdChbYSgiX2l0ZW1zUmVuZGVyZWQiLCJjYXRlZ29yeS5pdGVtcy4qIiwiX2xpbWl0IiwiX2FjdGl2ZUluZGV4IiwiX3BhZ2VDb3VudCIsImRpc2FibGVQYWdpbmF0aW9uIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxwbC5wcm90b3R5cGUsIl91cGRhdGVSZW5kZXJlZEl0ZW1zIixudWxsKSx0KFtzKCJfbGltaXQiLCJfYWN0aXZlSW5kZXgiKSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxwbC5wcm90b3R5cGUsIl9jdXJyZW50UGFnZSIsbnVsbCksdChbcygiX3BhZ2VDb3VudCIsImRpc2FibGVQYWdpbmF0aW9uIiksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLHBsLnByb3RvdHlwZSwiX211bHRpcGxlUGFnZXNFeGlzdCIsbnVsbCksdChbcygiX2N1cnJlbnRQYWdlIiksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLHBsLnByb3RvdHlwZSwiX2hhc1ByZXZpb3VzUGFnZSIsbnVsbCksdChbcygiX2N1cnJlbnRQYWdlIiwiX3BhZ2VDb3VudCIpLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxwbC5wcm90b3R5cGUsIl9oYXNOZXh0UGFnZSIsbnVsbCksdChbYSgiY2F0ZWdvcnkuaXRlbXMuKiIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0scGwucHJvdG90eXBlLCJfY2xhbXBBY3RpdmVJbmRleCIsbnVsbCkscGw9dChbaSgidGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXciKV0scGwpO2NsYXNzIGZse2NvbnN0cnVjdG9yKHQpe3RoaXMubGlzdGVuZXI9dH19Y2xhc3MgbWx7Y29uc3RydWN0b3IoKXt0aGlzLnJlcXVlc3RNYW5hZ2VyPW5ldyBkcigxKSx0aGlzLl9saXN0ZW5lcnM9bmV3IFNldCx0aGlzLmluaXRpYWxpemVkPSExfXJlZnJlc2goKXtyZXR1cm4gdGhpcy5sb2FkKCkudGhlbigoKCk9Pnt0aGlzLmluaXRpYWxpemVkPSEwfSkpfWFkZExpc3RlbmVyKHQpe2NvbnN0IGU9bmV3IGZsKHQpO3JldHVybiB0aGlzLl9saXN0ZW5lcnMuYWRkKGUpLGV9cmVtb3ZlTGlzdGVuZXJCeUtleSh0KXt0aGlzLl9saXN0ZW5lcnMuZGVsZXRlKHQpfWVtaXRDaGFuZ2UoKXt0aGlzLl9saXN0ZW5lcnMuZm9yRWFjaCgodD0+e3RyeXt0Lmxpc3RlbmVyKCl9Y2F0Y2godCl7fX0pKX19Y2xhc3MgZ2wgZXh0ZW5kcyBtbHtsb2FkKCl7Y29uc3QgdD1fcigpLmVudmlyb25tZW50KCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0KS50aGVuKCh0PT57Y29uc3QgZT17ZGF0YUxvY2F0aW9uOnQuZGF0YV9sb2NhdGlvbix3aW5kb3dUaXRsZTp0LndpbmRvd190aXRsZX07dm9pZCAwIT09dC5leHBlcmltZW50X25hbWUmJihlLmV4cGVyaW1lbnROYW1lPXQuZXhwZXJpbWVudF9uYW1lKSx2b2lkIDAhPT10LmV4cGVyaW1lbnRfZGVzY3JpcHRpb24mJihlLmV4cGVyaW1lbnREZXNjcmlwdGlvbj10LmV4cGVyaW1lbnRfZGVzY3JpcHRpb24pLHZvaWQgMCE9PXQuY3JlYXRpb25fdGltZSYmKGUuY3JlYXRpb25UaW1lPXQuY3JlYXRpb25fdGltZSksU2UuZXhwb3J0cy5pc0VxdWFsKHRoaXMuZW52aXJvbm1lbnQsZSl8fCh0aGlzLmVudmlyb25tZW50PWUsdGhpcy5lbWl0Q2hhbmdlKCkpfSkpfWdldERhdGFMb2NhdGlvbigpe3JldHVybiB0aGlzLmVudmlyb25tZW50P3RoaXMuZW52aXJvbm1lbnQuZGF0YUxvY2F0aW9uOiIifWdldFdpbmRvd1RpdGxlKCl7cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQ/dGhpcy5lbnZpcm9ubWVudC53aW5kb3dUaXRsZToiIn1nZXRFeHBlcmltZW50TmFtZSgpe3JldHVybiB0aGlzLmVudmlyb25tZW50P3RoaXMuZW52aXJvbm1lbnQuZXhwZXJpbWVudE5hbWU6IiJ9Z2V0RXhwZXJpbWVudERlc2NyaXB0aW9uKCl7cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQ/dGhpcy5lbnZpcm9ubWVudC5leHBlcmltZW50RGVzY3JpcHRpb246IiJ9Z2V0Q3JlYXRpb25UaW1lKCl7cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQ/dGhpcy5lbnZpcm9ubWVudC5jcmVhdGlvblRpbWU6bnVsbH19Y29uc3QgX2w9bmV3IGdsO2NsYXNzIHlsIGV4dGVuZHMgbWx7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX3J1bnM9W119bG9hZCgpe2NvbnN0IHQ9X3IoKS5ydW5zKCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0KS50aGVuKCh0PT57U2UuZXhwb3J0cy5pc0VxdWFsKHRoaXMuX3J1bnMsdCl8fCh0aGlzLl9ydW5zPXQsdGhpcy5lbWl0Q2hhbmdlKCkpfSkpfWdldFJ1bnMoKXtyZXR1cm4gdGhpcy5fcnVucy5zbGljZSgpfX1jb25zdCB2bD1uZXcgeWw7ZnVuY3Rpb24gYmwodCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOnQ+PWU/MDpOYU59ZnVuY3Rpb24geGwodCl7cmV0dXJuIDE9PT10Lmxlbmd0aCYmKHQ9KGZ1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuIGJsKHQoZSksbil9fSkodCkpLHtsZWZ0OmZ1bmN0aW9uKGUsbixpLHIpe2ZvcihudWxsPT1pJiYoaT0wKSxudWxsPT1yJiYocj1lLmxlbmd0aCk7aTxyOyl7dmFyIG89aStyPj4+MTt0KGVbb10sbik8MD9pPW8rMTpyPW99cmV0dXJuIGl9LHJpZ2h0OmZ1bmN0aW9uKGUsbixpLHIpe2ZvcihudWxsPT1pJiYoaT0wKSxudWxsPT1yJiYocj1lLmxlbmd0aCk7aTxyOyl7dmFyIG89aStyPj4+MTt0KGVbb10sbik+MD9yPW86aT1vKzF9cmV0dXJuIGl9fX12YXIgd2w9eGwoYmwpLFNsPXdsLnJpZ2h0LE1sPXdsLmxlZnQ7ZnVuY3Rpb24gRWwodCxlKXtyZXR1cm5bdCxlXX1mdW5jdGlvbiBUbCh0LGUsbil7dmFyIGkscixvLGEscz10Lmxlbmd0aCxsPWUubGVuZ3RoLGM9bmV3IEFycmF5KHMqbCk7Zm9yKG51bGw9PW4mJihuPUVsKSxpPW89MDtpPHM7KytpKWZvcihhPXRbaV0scj0wO3I8bDsrK3IsKytvKWNbb109bihhLGVbcl0pO3JldHVybiBjfWZ1bmN0aW9uIENsKHQpe3JldHVybiBudWxsPT09dD9OYU46K3R9ZnVuY3Rpb24gQWwodCxlKXt2YXIgbixpLHI9dC5sZW5ndGgsbz0wLGE9LTEscz0wLGw9MDtpZihudWxsPT1lKWZvcig7KythPHI7KWlzTmFOKG49Q2wodFthXSkpfHwobCs9KGk9bi1zKSoobi0ocys9aS8rK28pKSk7ZWxzZSBmb3IoOysrYTxyOylpc05hTihuPUNsKGUodFthXSxhLHQpKSl8fChsKz0oaT1uLXMpKihuLShzKz1pLysrbykpKTtpZihvPjEpcmV0dXJuIGwvKG8tMSl9ZnVuY3Rpb24ga2wodCxlKXt2YXIgbj1BbCh0LGUpO3JldHVybiBuP01hdGguc3FydChuKTpufWZ1bmN0aW9uIExsKHQsZSl7dmFyIG4saSxyLG89dC5sZW5ndGgsYT0tMTtpZihudWxsPT1lKXtmb3IoOysrYTxvOylpZihudWxsIT0obj10W2FdKSYmbj49bilmb3IoaT1yPW47KythPG87KW51bGwhPShuPXRbYV0pJiYoaT5uJiYoaT1uKSxyPG4mJihyPW4pKX1lbHNlIGZvcig7KythPG87KWlmKG51bGwhPShuPWUodFthXSxhLHQpKSYmbj49bilmb3IoaT1yPW47KythPG87KW51bGwhPShuPWUodFthXSxhLHQpKSYmKGk+biYmKGk9bikscjxuJiYocj1uKSk7cmV0dXJuW2kscl19dmFyIFBsPUFycmF5LnByb3RvdHlwZSxObD1QbC5zbGljZSxJbD1QbC5tYXA7ZnVuY3Rpb24gUmwodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIE9sKHQpe3JldHVybiB0fWZ1bmN0aW9uIHpsKHQsZSxuKXt0PSt0LGU9K2Usbj0ocj1hcmd1bWVudHMubGVuZ3RoKTwyPyhlPXQsdD0wLDEpOnI8Mz8xOituO2Zvcih2YXIgaT0tMSxyPTB8TWF0aC5tYXgoMCxNYXRoLmNlaWwoKGUtdCkvbikpLG89bmV3IEFycmF5KHIpOysraTxyOylvW2ldPXQraSpuO3JldHVybiBvfXZhciBEbD1NYXRoLnNxcnQoNTApLEJsPU1hdGguc3FydCgxMCksSGw9TWF0aC5zcXJ0KDIpO2Z1bmN0aW9uIEZsKHQsZSxuKXt2YXIgaSxyLG8sYSxzPS0xO2lmKG49K24sKHQ9K3QpPT0oZT0rZSkmJm4+MClyZXR1cm5bdF07aWYoKGk9ZTx0KSYmKHI9dCx0PWUsZT1yKSwwPT09KGE9VmwodCxlLG4pKXx8IWlzRmluaXRlKGEpKXJldHVybltdO2lmKGE+MClmb3IodD1NYXRoLmNlaWwodC9hKSxlPU1hdGguZmxvb3IoZS9hKSxvPW5ldyBBcnJheShyPU1hdGguY2VpbChlLXQrMSkpOysrczxyOylvW3NdPSh0K3MpKmE7ZWxzZSBmb3IodD1NYXRoLmZsb29yKHQqYSksZT1NYXRoLmNlaWwoZSphKSxvPW5ldyBBcnJheShyPU1hdGguY2VpbCh0LWUrMSkpOysrczxyOylvW3NdPSh0LXMpL2E7cmV0dXJuIGkmJm8ucmV2ZXJzZSgpLG99ZnVuY3Rpb24gVmwodCxlLG4pe3ZhciBpPShlLXQpL01hdGgubWF4KDAsbikscj1NYXRoLmZsb29yKE1hdGgubG9nKGkpL01hdGguTE4xMCksbz1pL01hdGgucG93KDEwLHIpO3JldHVybiByPj0wPyhvPj1EbD8xMDpvPj1CbD81Om8+PUhsPzI6MSkqTWF0aC5wb3coMTAscik6LU1hdGgucG93KDEwLC1yKS8obz49RGw/MTA6bz49Qmw/NTpvPj1IbD8yOjEpfWZ1bmN0aW9uIFVsKHQsZSxuKXt2YXIgaT1NYXRoLmFicyhlLXQpL01hdGgubWF4KDAsbikscj1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKGkpL01hdGguTE4xMCkpLG89aS9yO3JldHVybiBvPj1EbD9yKj0xMDpvPj1CbD9yKj01Om8+PUhsJiYocio9MiksZTx0Py1yOnJ9ZnVuY3Rpb24gamwodCl7cmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZyh0Lmxlbmd0aCkvTWF0aC5MTjIpKzF9ZnVuY3Rpb24gR2wodCxlLG4pe2lmKG51bGw9PW4mJihuPUNsKSxpPXQubGVuZ3RoKXtpZigoZT0rZSk8PTB8fGk8MilyZXR1cm4rbih0WzBdLDAsdCk7aWYoZT49MSlyZXR1cm4rbih0W2ktMV0saS0xLHQpO3ZhciBpLHI9KGktMSkqZSxvPU1hdGguZmxvb3IociksYT0rbih0W29dLG8sdCk7cmV0dXJuIGErKCtuKHRbbysxXSxvKzEsdCktYSkqKHItbyl9fWZ1bmN0aW9uIFdsKHQsZSl7dmFyIG4saSxyPXQubGVuZ3RoLG89LTE7aWYobnVsbD09ZSl7Zm9yKDsrK288cjspaWYobnVsbCE9KG49dFtvXSkmJm4+PW4pZm9yKGk9bjsrK288cjspbnVsbCE9KG49dFtvXSkmJm4+aSYmKGk9bil9ZWxzZSBmb3IoOysrbzxyOylpZihudWxsIT0obj1lKHRbb10sbyx0KSkmJm4+PW4pZm9yKGk9bjsrK288cjspbnVsbCE9KG49ZSh0W29dLG8sdCkpJiZuPmkmJihpPW4pO3JldHVybiBpfWZ1bmN0aW9uIHFsKHQpe2Zvcih2YXIgZSxuLGkscj10Lmxlbmd0aCxvPS0xLGE9MDsrK288cjspYSs9dFtvXS5sZW5ndGg7Zm9yKG49bmV3IEFycmF5KGEpOy0tcj49MDspZm9yKGU9KGk9dFtyXSkubGVuZ3RoOy0tZT49MDspblstLWFdPWlbZV07cmV0dXJuIG59ZnVuY3Rpb24gWWwodCxlKXt2YXIgbixpLHI9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1lKXtmb3IoOysrbzxyOylpZihudWxsIT0obj10W29dKSYmbj49bilmb3IoaT1uOysrbzxyOyludWxsIT0obj10W29dKSYmaT5uJiYoaT1uKX1lbHNlIGZvcig7KytvPHI7KWlmKG51bGwhPShuPWUodFtvXSxvLHQpKSYmbj49bilmb3IoaT1uOysrbzxyOyludWxsIT0obj1lKHRbb10sbyx0KSkmJmk+biYmKGk9bik7cmV0dXJuIGl9ZnVuY3Rpb24gWGwodCl7aWYoIShyPXQubGVuZ3RoKSlyZXR1cm5bXTtmb3IodmFyIGU9LTEsbj1ZbCh0LCRsKSxpPW5ldyBBcnJheShuKTsrK2U8bjspZm9yKHZhciByLG89LTEsYT1pW2VdPW5ldyBBcnJheShyKTsrK288cjspYVtvXT10W29dW2VdO3JldHVybiBpfWZ1bmN0aW9uICRsKHQpe3JldHVybiB0Lmxlbmd0aH12YXIgS2w9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIFpsKHQpe3JldHVybiB0fXZhciBKbD0xZS02O2Z1bmN0aW9uIFFsKHQpe3JldHVybiJ0cmFuc2xhdGUoIisodCsuNSkrIiwwKSJ9ZnVuY3Rpb24gdGModCl7cmV0dXJuInRyYW5zbGF0ZSgwLCIrKHQrLjUpKyIpIn1mdW5jdGlvbiBlYyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuK3QoZSl9fWZ1bmN0aW9uIG5jKHQpe3ZhciBlPU1hdGgubWF4KDAsdC5iYW5kd2lkdGgoKS0xKS8yO3JldHVybiB0LnJvdW5kKCkmJihlPU1hdGgucm91bmQoZSkpLGZ1bmN0aW9uKG4pe3JldHVybit0KG4pK2V9fWZ1bmN0aW9uIGljKCl7cmV0dXJuIXRoaXMuX19heGlzfWZ1bmN0aW9uIHJjKHQsZSl7dmFyIG49W10saT1udWxsLHI9bnVsbCxvPTYsYT02LHM9MyxsPTE9PT10fHw0PT09dD8tMToxLGM9ND09PXR8fDI9PT10PyJ4IjoieSIsdT0xPT09dHx8Mz09PXQ/UWw6dGM7ZnVuY3Rpb24gaChoKXt2YXIgZD1udWxsPT1pP2UudGlja3M/ZS50aWNrcy5hcHBseShlLG4pOmUuZG9tYWluKCk6aSxwPW51bGw9PXI/ZS50aWNrRm9ybWF0P2UudGlja0Zvcm1hdC5hcHBseShlLG4pOlpsOnIsZj1NYXRoLm1heChvLDApK3MsbT1lLnJhbmdlKCksZz0rbVswXSsuNSxfPSttW20ubGVuZ3RoLTFdKy41LHk9KGUuYmFuZHdpZHRoP25jOmVjKShlLmNvcHkoKSksdj1oLnNlbGVjdGlvbj9oLnNlbGVjdGlvbigpOmgsYj12LnNlbGVjdEFsbCgiLmRvbWFpbiIpLmRhdGEoW251bGxdKSx4PXYuc2VsZWN0QWxsKCIudGljayIpLmRhdGEoZCxlKS5vcmRlcigpLHc9eC5leGl0KCksUz14LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJ0aWNrIiksTT14LnNlbGVjdCgibGluZSIpLEU9eC5zZWxlY3QoInRleHQiKTtiPWIubWVyZ2UoYi5lbnRlcigpLmluc2VydCgicGF0aCIsIi50aWNrIikuYXR0cigiY2xhc3MiLCJkb21haW4iKS5hdHRyKCJzdHJva2UiLCJjdXJyZW50Q29sb3IiKSkseD14Lm1lcmdlKFMpLE09TS5tZXJnZShTLmFwcGVuZCgibGluZSIpLmF0dHIoInN0cm9rZSIsImN1cnJlbnRDb2xvciIpLmF0dHIoYysiMiIsbCpvKSksRT1FLm1lcmdlKFMuYXBwZW5kKCJ0ZXh0IikuYXR0cigiZmlsbCIsImN1cnJlbnRDb2xvciIpLmF0dHIoYyxsKmYpLmF0dHIoImR5IiwxPT09dD8iMGVtIjozPT09dD8iMC43MWVtIjoiMC4zMmVtIikpLGghPT12JiYoYj1iLnRyYW5zaXRpb24oaCkseD14LnRyYW5zaXRpb24oaCksTT1NLnRyYW5zaXRpb24oaCksRT1FLnRyYW5zaXRpb24oaCksdz13LnRyYW5zaXRpb24oaCkuYXR0cigib3BhY2l0eSIsSmwpLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PXkodCkpP3UodCk6dGhpcy5nZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIpfSkpLFMuYXR0cigib3BhY2l0eSIsSmwpLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucGFyZW50Tm9kZS5fX2F4aXM7cmV0dXJuIHUoZSYmaXNGaW5pdGUoZT1lKHQpKT9lOnkodCkpfSkpKSx3LnJlbW92ZSgpLGIuYXR0cigiZCIsND09PXR8fDI9PXQ/YT8iTSIrbCphKyIsIitnKyJIMC41ViIrXysiSCIrbCphOiJNMC41LCIrZysiViIrXzphPyJNIitnKyIsIitsKmErIlYwLjVIIitfKyJWIitsKmE6Ik0iK2crIiwwLjVIIitfKSx4LmF0dHIoIm9wYWNpdHkiLDEpLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3JldHVybiB1KHkodCkpfSkpLE0uYXR0cihjKyIyIixsKm8pLEUuYXR0cihjLGwqZikudGV4dChwKSx2LmZpbHRlcihpYykuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJmb250LXNpemUiLDEwKS5hdHRyKCJmb250LWZhbWlseSIsInNhbnMtc2VyaWYiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsMj09PXQ/InN0YXJ0Ijo0PT09dD8iZW5kIjoibWlkZGxlIiksdi5lYWNoKChmdW5jdGlvbigpe3RoaXMuX19heGlzPXl9KSl9cmV0dXJuIGguc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxoKTplfSxoLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIG49S2wuY2FsbChhcmd1bWVudHMpLGh9LGgudGlja0FyZ3VtZW50cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P1tdOktsLmNhbGwodCksaCk6bi5zbGljZSgpfSxoLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09dD9udWxsOktsLmNhbGwodCksaCk6aSYmaS5zbGljZSgpfSxoLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxoKTpyfSxoLnRpY2tTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWE9K3QsaCk6b30saC50aWNrU2l6ZUlubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSt0LGgpOm99LGgudGlja1NpemVPdXRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rdCxoKTphfSxoLnRpY2tQYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0LGgpOnN9LGh9ZnVuY3Rpb24gb2ModCl7cmV0dXJuIHJjKDMsdCl9ZnVuY3Rpb24gYWModCl7cmV0dXJuIHJjKDQsdCl9dmFyIHNjPXt2YWx1ZTpmdW5jdGlvbigpe319O2Z1bmN0aW9uIGxjKCl7Zm9yKHZhciB0LGU9MCxuPWFyZ3VtZW50cy5sZW5ndGgsaT17fTtlPG47KytlKXtpZighKHQ9YXJndW1lbnRzW2VdKyIiKXx8dCBpbiBpfHwvW1xzLl0vLnRlc3QodCkpdGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIHR5cGU6ICIrdCk7aVt0XT1bXX1yZXR1cm4gbmV3IGNjKGkpfWZ1bmN0aW9uIGNjKHQpe3RoaXMuXz10fWZ1bmN0aW9uIHVjKHQsZSl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcCgoZnVuY3Rpb24odCl7dmFyIG49IiIsaT10LmluZGV4T2YoIi4iKTtpZihpPj0wJiYobj10LnNsaWNlKGkrMSksdD10LnNsaWNlKDAsaSkpLHQmJiFlLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO3JldHVybnt0eXBlOnQsbmFtZTpufX0pKX1mdW5jdGlvbiBoYyh0LGUpe2Zvcih2YXIgbixpPTAscj10Lmxlbmd0aDtpPHI7KytpKWlmKChuPXRbaV0pLm5hbWU9PT1lKXJldHVybiBuLnZhbHVlfWZ1bmN0aW9uIGRjKHQsZSxuKXtmb3IodmFyIGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpaWYodFtpXS5uYW1lPT09ZSl7dFtpXT1zYyx0PXQuc2xpY2UoMCxpKS5jb25jYXQodC5zbGljZShpKzEpKTticmVha31yZXR1cm4gbnVsbCE9biYmdC5wdXNoKHtuYW1lOmUsdmFsdWU6bn0pLHR9Y2MucHJvdG90eXBlPWxjLnByb3RvdHlwZT17Y29uc3RydWN0b3I6Y2Msb246ZnVuY3Rpb24odCxlKXt2YXIgbixpPXRoaXMuXyxyPXVjKHQrIiIsaSksbz0tMSxhPXIubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7aWYobnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK2UpO2Zvcig7KytvPGE7KWlmKG49KHQ9cltvXSkudHlwZSlpW25dPWRjKGlbbl0sdC5uYW1lLGUpO2Vsc2UgaWYobnVsbD09ZSlmb3IobiBpbiBpKWlbbl09ZGMoaVtuXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK288YTspaWYoKG49KHQ9cltvXSkudHlwZSkmJihuPWhjKGlbbl0sdC5uYW1lKSkpcmV0dXJuIG59LGNvcHk6ZnVuY3Rpb24oKXt2YXIgdD17fSxlPXRoaXMuXztmb3IodmFyIG4gaW4gZSl0W25dPWVbbl0uc2xpY2UoKTtyZXR1cm4gbmV3IGNjKHQpfSxjYWxsOmZ1bmN0aW9uKHQsZSl7aWYoKG49YXJndW1lbnRzLmxlbmd0aC0yKT4wKWZvcih2YXIgbixpLHI9bmV3IEFycmF5KG4pLG89MDtvPG47KytvKXJbb109YXJndW1lbnRzW28rMl07aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3Iobz0wLG49KGk9dGhpcy5fW3RdKS5sZW5ndGg7bzxuOysrbylpW29dLnZhbHVlLmFwcGx5KGUscil9LGFwcGx5OmZ1bmN0aW9uKHQsZSxuKXtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2Zvcih2YXIgaT10aGlzLl9bdF0scj0wLG89aS5sZW5ndGg7cjxvOysrcilpW3JdLnZhbHVlLmFwcGx5KGUsbil9fTt2YXIgcGM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLGZjPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDpwYyx4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyJ9O2Z1bmN0aW9uIG1jKHQpe3ZhciBlPXQrPSIiLG49ZS5pbmRleE9mKCI6Iik7cmV0dXJuIG4+PTAmJiJ4bWxucyIhPT0oZT10LnNsaWNlKDAsbikpJiYodD10LnNsaWNlKG4rMSkpLGZjLmhhc093blByb3BlcnR5KGUpP3tzcGFjZTpmY1tlXSxsb2NhbDp0fTp0fWZ1bmN0aW9uIGdjKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMub3duZXJEb2N1bWVudCxuPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBuPT09cGMmJmUuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PXBjP2UuY3JlYXRlRWxlbWVudCh0KTplLmNyZWF0ZUVsZW1lbnROUyhuLHQpfX1mdW5jdGlvbiBfYyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiB5Yyh0KXt2YXIgZT1tYyh0KTtyZXR1cm4oZS5sb2NhbD9fYzpnYykoZSl9ZnVuY3Rpb24gdmMoKXt9ZnVuY3Rpb24gYmModCl7cmV0dXJuIG51bGw9PXQ/dmM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpfX1mdW5jdGlvbiB4Yygpe3JldHVybltdfWZ1bmN0aW9uIHdjKHQpe3JldHVybiBudWxsPT10P3hjOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbCh0KX19ZnVuY3Rpb24gU2ModCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2hlcyh0KX19ZnVuY3Rpb24gTWModCl7cmV0dXJuIG5ldyBBcnJheSh0Lmxlbmd0aCl9ZnVuY3Rpb24gRWModCxlKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPWV9ZnVuY3Rpb24gVGModCxlLG4saSxyLG8pe2Zvcih2YXIgYSxzPTAsbD1lLmxlbmd0aCxjPW8ubGVuZ3RoO3M8YzsrK3MpKGE9ZVtzXSk/KGEuX19kYXRhX189b1tzXSxpW3NdPWEpOm5bc109bmV3IEVjKHQsb1tzXSk7Zm9yKDtzPGw7KytzKShhPWVbc10pJiYocltzXT1hKX1mdW5jdGlvbiBDYyh0LGUsbixpLHIsbyxhKXt2YXIgcyxsLGMsdT17fSxoPWUubGVuZ3RoLGQ9by5sZW5ndGgscD1uZXcgQXJyYXkoaCk7Zm9yKHM9MDtzPGg7KytzKShsPWVbc10pJiYocFtzXT1jPSIkIithLmNhbGwobCxsLl9fZGF0YV9fLHMsZSksYyBpbiB1P3Jbc109bDp1W2NdPWwpO2ZvcihzPTA7czxkOysrcykobD11W2M9IiQiK2EuY2FsbCh0LG9bc10scyxvKV0pPyhpW3NdPWwsbC5fX2RhdGFfXz1vW3NdLHVbY109bnVsbCk6bltzXT1uZXcgRWModCxvW3NdKTtmb3Iocz0wO3M8aDsrK3MpKGw9ZVtzXSkmJnVbcFtzXV09PT1sJiYocltzXT1sKX1mdW5jdGlvbiBBYyh0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6dD49ZT8wOk5hTn1mdW5jdGlvbiBrYyh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19ZnVuY3Rpb24gTGModCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBQYyh0LGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKHQsZSl9fWZ1bmN0aW9uIE5jKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsZSl9fWZ1bmN0aW9uIEljKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj90aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KTp0aGlzLnNldEF0dHJpYnV0ZSh0LG4pfX1mdW5jdGlvbiBSYyh0LGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PW4/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLG4pfX1mdW5jdGlvbiBPYyh0KXtyZXR1cm4gdC5vd25lckRvY3VtZW50JiZ0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHQuZG9jdW1lbnQmJnR8fHQuZGVmYXVsdFZpZXd9ZnVuY3Rpb24gemModCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KX19ZnVuY3Rpb24gRGModCxlLG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxlLG4pfX1mdW5jdGlvbiBCYyh0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09aT90aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpOnRoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxpLG4pfX1mdW5jdGlvbiBIYyh0LGUpe3JldHVybiB0LnN0eWxlLmdldFByb3BlcnR5VmFsdWUoZSl8fE9jKHQpLmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKGUpfWZ1bmN0aW9uIEZjKHQpe3JldHVybiBmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW3RdfX1mdW5jdGlvbiBWYyh0LGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXNbdF09ZX19ZnVuY3Rpb24gVWModCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP2RlbGV0ZSB0aGlzW3RdOnRoaXNbdF09bn19ZnVuY3Rpb24gamModCl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uIEdjKHQpe3JldHVybiB0LmNsYXNzTGlzdHx8bmV3IFdjKHQpfWZ1bmN0aW9uIFdjKHQpe3RoaXMuX25vZGU9dCx0aGlzLl9uYW1lcz1qYyh0LmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfWZ1bmN0aW9uIHFjKHQsZSl7Zm9yKHZhciBuPUdjKHQpLGk9LTEscj1lLmxlbmd0aDsrK2k8cjspbi5hZGQoZVtpXSl9ZnVuY3Rpb24gWWModCxlKXtmb3IodmFyIG49R2ModCksaT0tMSxyPWUubGVuZ3RoOysraTxyOyluLnJlbW92ZShlW2ldKX1mdW5jdGlvbiBYYyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtxYyh0aGlzLHQpfX1mdW5jdGlvbiAkYyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtZYyh0aGlzLHQpfX1mdW5jdGlvbiBLYyh0LGUpe3JldHVybiBmdW5jdGlvbigpeyhlLmFwcGx5KHRoaXMsYXJndW1lbnRzKT9xYzpZYykodGhpcyx0KX19ZnVuY3Rpb24gWmMoKXt0aGlzLnRleHRDb250ZW50PSIifWZ1bmN0aW9uIEpjKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19ZnVuY3Rpb24gUWModCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT1lPyIiOmV9fWZ1bmN0aW9uIHR1KCl7dGhpcy5pbm5lckhUTUw9IiJ9ZnVuY3Rpb24gZXUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9dH19ZnVuY3Rpb24gbnUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pbm5lckhUTUw9bnVsbD09ZT8iIjplfX1mdW5jdGlvbiBpdSgpe3RoaXMubmV4dFNpYmxpbmcmJnRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKX1mdW5jdGlvbiBydSgpe3RoaXMucHJldmlvdXNTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIG91KCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gYXUoKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7dCYmdC5yZW1vdmVDaGlsZCh0aGlzKX1mdW5jdGlvbiBzdSgpe3ZhciB0PXRoaXMuY2xvbmVOb2RlKCExKSxlPXRoaXMucGFyZW50Tm9kZTtyZXR1cm4gZT9lLmluc2VydEJlZm9yZSh0LHRoaXMubmV4dFNpYmxpbmcpOnR9ZnVuY3Rpb24gbHUoKXt2YXIgdD10aGlzLmNsb25lTm9kZSghMCksZT10aGlzLnBhcmVudE5vZGU7cmV0dXJuIGU/ZS5pbnNlcnRCZWZvcmUodCx0aGlzLm5leHRTaWJsaW5nKTp0fUVjLnByb3RvdHlwZT17Y29uc3RydWN0b3I6RWMsYXBwZW5kQ2hpbGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUodCx0aGlzLl9uZXh0KX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUodCxlKX0scXVlcnlTZWxlY3RvcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3IodCl9LHF1ZXJ5U2VsZWN0b3JBbGw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHQpfX0sV2MucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtlPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKGUsMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgY3U9e30sdXU9bnVsbDtmdW5jdGlvbiBodSh0LGUsbil7cmV0dXJuIHQ9ZHUodCxlLG4pLGZ1bmN0aW9uKGUpe3ZhciBuPWUucmVsYXRlZFRhcmdldDtuJiYobj09PXRoaXN8fDgmbi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzKSl8fHQuY2FsbCh0aGlzLGUpfX1mdW5jdGlvbiBkdSh0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKGkpe3ZhciByPXV1O3V1PWk7dHJ5e3QuY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZSxuKX1maW5hbGx5e3V1PXJ9fX1mdW5jdGlvbiBwdSh0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKChmdW5jdGlvbih0KXt2YXIgZT0iIixuPXQuaW5kZXhPZigiLiIpO3JldHVybiBuPj0wJiYoZT10LnNsaWNlKG4rMSksdD10LnNsaWNlKDAsbikpLHt0eXBlOnQsbmFtZTplfX0pKX1mdW5jdGlvbiBmdSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9fb247aWYoZSl7Zm9yKHZhciBuLGk9MCxyPS0xLG89ZS5sZW5ndGg7aTxvOysraSluPWVbaV0sdC50eXBlJiZuLnR5cGUhPT10LnR5cGV8fG4ubmFtZSE9PXQubmFtZT9lWysrcl09bjp0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobi50eXBlLG4ubGlzdGVuZXIsbi5jYXB0dXJlKTsrK3I/ZS5sZW5ndGg9cjpkZWxldGUgdGhpcy5fX29ufX19ZnVuY3Rpb24gbXUodCxlLG4pe3ZhciBpPWN1Lmhhc093blByb3BlcnR5KHQudHlwZSk/aHU6ZHU7cmV0dXJuIGZ1bmN0aW9uKHIsbyxhKXt2YXIgcyxsPXRoaXMuX19vbixjPWkoZSxvLGEpO2lmKGwpZm9yKHZhciB1PTAsaD1sLmxlbmd0aDt1PGg7Kyt1KWlmKChzPWxbdV0pLnR5cGU9PT10LnR5cGUmJnMubmFtZT09PXQubmFtZSlyZXR1cm4gdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHMudHlwZSxzLmxpc3RlbmVyLHMuY2FwdHVyZSksdGhpcy5hZGRFdmVudExpc3RlbmVyKHMudHlwZSxzLmxpc3RlbmVyPWMscy5jYXB0dXJlPW4pLHZvaWQocy52YWx1ZT1lKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIodC50eXBlLGMsbikscz17dHlwZTp0LnR5cGUsbmFtZTp0Lm5hbWUsdmFsdWU6ZSxsaXN0ZW5lcjpjLGNhcHR1cmU6bn0sbD9sLnB1c2gocyk6dGhpcy5fX29uPVtzXX19ZnVuY3Rpb24gZ3UodCxlLG4saSl7dmFyIHI9dXU7dC5zb3VyY2VFdmVudD11dSx1dT10O3RyeXtyZXR1cm4gZS5hcHBseShuLGkpfWZpbmFsbHl7dXU9cn19ZnVuY3Rpb24gX3UodCxlLG4pe3ZhciBpPU9jKHQpLHI9aS5DdXN0b21FdmVudDsiZnVuY3Rpb24iPT10eXBlb2Ygcj9yPW5ldyByKGUsbik6KHI9aS5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxuPyhyLmluaXRFdmVudChlLG4uYnViYmxlcyxuLmNhbmNlbGFibGUpLHIuZGV0YWlsPW4uZGV0YWlsKTpyLmluaXRFdmVudChlLCExLCExKSksdC5kaXNwYXRjaEV2ZW50KHIpfWZ1bmN0aW9uIHl1KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIF91KHRoaXMsdCxlKX19ZnVuY3Rpb24gdnUodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gX3UodGhpcyx0LGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX19InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmKCJvbm1vdXNlZW50ZXIiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHwoY3U9e21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSkpO3ZhciBidT1bbnVsbF07ZnVuY3Rpb24geHUodCxlKXt0aGlzLl9ncm91cHM9dCx0aGlzLl9wYXJlbnRzPWV9ZnVuY3Rpb24gd3UoKXtyZXR1cm4gbmV3IHh1KFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sYnUpfWZ1bmN0aW9uIFN1KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9uZXcgeHUoW1tkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQpXV0sW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pOm5ldyB4dShbW3RdXSxidSl9eHUucHJvdG90eXBlPXd1LnByb3RvdHlwZT17Y29uc3RydWN0b3I6eHUsc2VsZWN0OmZ1bmN0aW9uIE11KHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1iYyh0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWZvcih2YXIgbyxhLHM9ZVtyXSxsPXMubGVuZ3RoLGM9aVtyXT1uZXcgQXJyYXkobCksdT0wO3U8bDsrK3UpKG89c1t1XSkmJihhPXQuY2FsbChvLG8uX19kYXRhX18sdSxzKSkmJigiX19kYXRhX18iaW4gbyYmKGEuX19kYXRhX189by5fX2RhdGFfXyksY1t1XT1hKTtyZXR1cm4gbmV3IHh1KGksdGhpcy5fcGFyZW50cyl9LHNlbGVjdEFsbDpmdW5jdGlvbiBFdSh0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9d2ModCkpO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj1lLmxlbmd0aCxpPVtdLHI9W10sbz0wO288bjsrK28pZm9yKHZhciBhLHM9ZVtvXSxsPXMubGVuZ3RoLGM9MDtjPGw7KytjKShhPXNbY10pJiYoaS5wdXNoKHQuY2FsbChhLGEuX19kYXRhX18sYyxzKSksci5wdXNoKGEpKTtyZXR1cm4gbmV3IHh1KGkscil9LGZpbHRlcjpmdW5jdGlvbiBUdSh0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9U2ModCkpO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj1lLmxlbmd0aCxpPW5ldyBBcnJheShuKSxyPTA7cjxuOysrcilmb3IodmFyIG8sYT1lW3JdLHM9YS5sZW5ndGgsbD1pW3JdPVtdLGM9MDtjPHM7KytjKShvPWFbY10pJiZ0LmNhbGwobyxvLl9fZGF0YV9fLGMsYSkmJmwucHVzaChvKTtyZXR1cm4gbmV3IHh1KGksdGhpcy5fcGFyZW50cyl9LGRhdGE6ZnVuY3Rpb24gQ3UodCxlKXtpZighdClyZXR1cm4gZj1uZXcgQXJyYXkodGhpcy5zaXplKCkpLHU9LTEsdGhpcy5lYWNoKChmdW5jdGlvbih0KXtmWysrdV09dH0pKSxmO3ZhciBuPWU/Q2M6VGMsaT10aGlzLl9wYXJlbnRzLHI9dGhpcy5fZ3JvdXBzOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD0oZnVuY3Rpb24gbyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KSh0KSk7Zm9yKHZhciBhPXIubGVuZ3RoLHM9bmV3IEFycmF5KGEpLGw9bmV3IEFycmF5KGEpLGM9bmV3IEFycmF5KGEpLHU9MDt1PGE7Kyt1KXt2YXIgaD1pW3VdLGQ9clt1XSxwPWQubGVuZ3RoLGY9dC5jYWxsKGgsaCYmaC5fX2RhdGFfXyx1LGkpLG09Zi5sZW5ndGgsZz1sW3VdPW5ldyBBcnJheShtKSxfPXNbdV09bmV3IEFycmF5KG0pO24oaCxkLGcsXyxjW3VdPW5ldyBBcnJheShwKSxmLGUpO2Zvcih2YXIgeSx2LGI9MCx4PTA7YjxtOysrYilpZih5PWdbYl0pe2ZvcihiPj14JiYoeD1iKzEpOyEodj1fW3hdKSYmKyt4PG07KTt5Ll9uZXh0PXZ8fG51bGx9fXJldHVybihzPW5ldyB4dShzLGkpKS5fZW50ZXI9bCxzLl9leGl0PWMsc30sZW50ZXI6ZnVuY3Rpb24gQXUoKXtyZXR1cm4gbmV3IHh1KHRoaXMuX2VudGVyfHx0aGlzLl9ncm91cHMubWFwKE1jKSx0aGlzLl9wYXJlbnRzKX0sZXhpdDpmdW5jdGlvbiBrdSgpe3JldHVybiBuZXcgeHUodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChNYyksdGhpcy5fcGFyZW50cyl9LGpvaW46ZnVuY3Rpb24gTHUodCxlLG4pe3ZhciBpPXRoaXMuZW50ZXIoKSxyPXRoaXMsbz10aGlzLmV4aXQoKTtyZXR1cm4gaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90KGkpOmkuYXBwZW5kKHQrIiIpLG51bGwhPWUmJihyPWUocikpLG51bGw9PW4/by5yZW1vdmUoKTpuKG8pLGkmJnI/aS5tZXJnZShyKS5vcmRlcigpOnJ9LG1lcmdlOmZ1bmN0aW9uIFB1KHQpe2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj10Ll9ncm91cHMsaT1lLmxlbmd0aCxyPU1hdGgubWluKGksbi5sZW5ndGgpLG89bmV3IEFycmF5KGkpLGE9MDthPHI7KythKWZvcih2YXIgcyxsPWVbYV0sYz1uW2FdLHU9bC5sZW5ndGgsaD1vW2FdPW5ldyBBcnJheSh1KSxkPTA7ZDx1OysrZCkocz1sW2RdfHxjW2RdKSYmKGhbZF09cyk7Zm9yKDthPGk7KythKW9bYV09ZVthXTtyZXR1cm4gbmV3IHh1KG8sdGhpcy5fcGFyZW50cyl9LG9yZGVyOmZ1bmN0aW9uIE51KCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxlPS0xLG49dC5sZW5ndGg7KytlPG47KWZvcih2YXIgaSxyPXRbZV0sbz1yLmxlbmd0aC0xLGE9cltvXTstLW8+PTA7KShpPXJbb10pJiYoYSYmNF5pLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGEpJiZhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGksYSksYT1pKTtyZXR1cm4gdGhpc30sc29ydDpmdW5jdGlvbiBJdSh0KXtmdW5jdGlvbiBlKGUsbil7cmV0dXJuIGUmJm4/dChlLl9fZGF0YV9fLG4uX19kYXRhX18pOiFlLSFufXR8fCh0PUFjKTtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGk9bi5sZW5ndGgscj1uZXcgQXJyYXkoaSksbz0wO288aTsrK28pe2Zvcih2YXIgYSxzPW5bb10sbD1zLmxlbmd0aCxjPXJbb109bmV3IEFycmF5KGwpLHU9MDt1PGw7Kyt1KShhPXNbdV0pJiYoY1t1XT1hKTtjLnNvcnQoZSl9cmV0dXJuIG5ldyB4dShyLHRoaXMuX3BhcmVudHMpLm9yZGVyKCl9LGNhbGw6ZnVuY3Rpb24gUnUoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGFyZ3VtZW50c1swXT10aGlzLHQuYXBwbHkobnVsbCxhcmd1bWVudHMpLHRoaXN9LG5vZGVzOmZ1bmN0aW9uIE91KCl7dmFyIHQ9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSxlPS0xO3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7dFsrK2VdPXRoaXN9KSksdH0sbm9kZTpmdW5jdGlvbiB6dSgpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsZT0wLG49dC5sZW5ndGg7ZTxuOysrZSlmb3IodmFyIGk9dFtlXSxyPTAsbz1pLmxlbmd0aDtyPG87KytyKXt2YXIgYT1pW3JdO2lmKGEpcmV0dXJuIGF9cmV0dXJuIG51bGx9LHNpemU6ZnVuY3Rpb24gRHUoKXt2YXIgdD0wO3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7Kyt0fSkpLHR9LGVtcHR5OmZ1bmN0aW9uIEJ1KCl7cmV0dXJuIXRoaXMubm9kZSgpfSxlYWNoOmZ1bmN0aW9uIEh1KHQpe2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj0wLGk9ZS5sZW5ndGg7bjxpOysrbilmb3IodmFyIHIsbz1lW25dLGE9MCxzPW8ubGVuZ3RoO2E8czsrK2EpKHI9b1thXSkmJnQuY2FsbChyLHIuX19kYXRhX18sYSxvKTtyZXR1cm4gdGhpc30sYXR0cjpmdW5jdGlvbiBGdSh0LGUpe3ZhciBuPW1jKHQpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7dmFyIGk9dGhpcy5ub2RlKCk7cmV0dXJuIG4ubG9jYWw/aS5nZXRBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOmkuZ2V0QXR0cmlidXRlKG4pfXJldHVybiB0aGlzLmVhY2goKG51bGw9PWU/bi5sb2NhbD9MYzprYzoiZnVuY3Rpb24iPT10eXBlb2YgZT9uLmxvY2FsP1JjOkljOm4ubG9jYWw/TmM6UGMpKG4sZSkpfSxzdHlsZTpmdW5jdGlvbiBWdSh0LGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PWU/emM6ImZ1bmN0aW9uIj09dHlwZW9mIGU/QmM6RGMpKHQsZSxudWxsPT1uPyIiOm4pKTpIYyh0aGlzLm5vZGUoKSx0KX0scHJvcGVydHk6ZnVuY3Rpb24gVXUodCxlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09ZT9GYzoiZnVuY3Rpb24iPT10eXBlb2YgZT9VYzpWYykodCxlKSk6dGhpcy5ub2RlKClbdF19LGNsYXNzZWQ6ZnVuY3Rpb24ganUodCxlKXt2YXIgbj1qYyh0KyIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgaT1HYyh0aGlzLm5vZGUoKSkscj0tMSxvPW4ubGVuZ3RoOysrcjxvOylpZighaS5jb250YWlucyhuW3JdKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgZT9LYzplP1hjOiRjKShuLGUpKX0sdGV4dDpmdW5jdGlvbiBHdSh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9aYzooImZ1bmN0aW9uIj09dHlwZW9mIHQ/UWM6SmMpKHQpKTp0aGlzLm5vZGUoKS50ZXh0Q29udGVudH0saHRtbDpmdW5jdGlvbiBXdSh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD90dTooImZ1bmN0aW9uIj09dHlwZW9mIHQ/bnU6ZXUpKHQpKTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LHJhaXNlOmZ1bmN0aW9uIHF1KCl7cmV0dXJuIHRoaXMuZWFjaChpdSl9LGxvd2VyOmZ1bmN0aW9uIFl1KCl7cmV0dXJuIHRoaXMuZWFjaChydSl9LGFwcGVuZDpmdW5jdGlvbiBYdSh0KXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnljKHQpO3JldHVybiB0aGlzLnNlbGVjdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KSl9LGluc2VydDpmdW5jdGlvbiAkdSh0LGUpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eWModCksaT1udWxsPT1lP291OiJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6YmMoZSk7cmV0dXJuIHRoaXMuc2VsZWN0KChmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8bnVsbCl9KSl9LHJlbW92ZTpmdW5jdGlvbiBLdSgpe3JldHVybiB0aGlzLmVhY2goYXUpfSxjbG9uZTpmdW5jdGlvbiBadSh0KXtyZXR1cm4gdGhpcy5zZWxlY3QodD9sdTpzdSl9LGRhdHVtOmZ1bmN0aW9uIEp1KHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIix0KTp0aGlzLm5vZGUoKS5fX2RhdGFfX30sb246ZnVuY3Rpb24gUXUodCxlLG4pe3ZhciBpLHIsbz1wdSh0KyIiKSxhPW8ubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7Zm9yKHM9ZT9tdTpmdSxudWxsPT1uJiYobj0hMSksaT0wO2k8YTsrK2kpdGhpcy5lYWNoKHMob1tpXSxlLG4pKTtyZXR1cm4gdGhpc312YXIgcz10aGlzLm5vZGUoKS5fX29uO2lmKHMpZm9yKHZhciBsLGM9MCx1PXMubGVuZ3RoO2M8dTsrK2MpZm9yKGk9MCxsPXNbY107aTxhOysraSlpZigocj1vW2ldKS50eXBlPT09bC50eXBlJiZyLm5hbWU9PT1sLm5hbWUpcmV0dXJuIGwudmFsdWV9LGRpc3BhdGNoOmZ1bmN0aW9uIHRoKHQsZSl7cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIGU/dnU6eXUpKHQsZSkpfX07dmFyIGVoPTA7ZnVuY3Rpb24gbmgoKXtyZXR1cm4gbmV3IGlofWZ1bmN0aW9uIGloKCl7dGhpcy5fPSJAIisoKytlaCkudG9TdHJpbmcoMzYpfWZ1bmN0aW9uIHJoKCl7Zm9yKHZhciB0LGU9dXU7dD1lLnNvdXJjZUV2ZW50OyllPXQ7cmV0dXJuIGV9ZnVuY3Rpb24gb2godCxlKXt2YXIgbj10Lm93bmVyU1ZHRWxlbWVudHx8dDtpZihuLmNyZWF0ZVNWR1BvaW50KXt2YXIgaT1uLmNyZWF0ZVNWR1BvaW50KCk7cmV0dXJuIGkueD1lLmNsaWVudFgsaS55PWUuY2xpZW50WSxbKGk9aS5tYXRyaXhUcmFuc2Zvcm0odC5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpKS54LGkueV19dmFyIHI9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm5bZS5jbGllbnRYLXIubGVmdC10LmNsaWVudExlZnQsZS5jbGllbnRZLXIudG9wLXQuY2xpZW50VG9wXX1mdW5jdGlvbiBhaCh0KXt2YXIgZT1yaCgpO3JldHVybiBlLmNoYW5nZWRUb3VjaGVzJiYoZT1lLmNoYW5nZWRUb3VjaGVzWzBdKSxvaCh0LGUpfWZ1bmN0aW9uIHNoKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9uZXcgeHUoW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCldLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgeHUoW251bGw9PXQ/W106dF0sYnUpfWZ1bmN0aW9uIGxoKHQsZSxuKXthcmd1bWVudHMubGVuZ3RoPDMmJihuPWUsZT1yaCgpLmNoYW5nZWRUb3VjaGVzKTtmb3IodmFyIGkscj0wLG89ZT9lLmxlbmd0aDowO3I8bzsrK3IpaWYoKGk9ZVtyXSkuaWRlbnRpZmllcj09PW4pcmV0dXJuIG9oKHQsaSk7cmV0dXJuIG51bGx9ZnVuY3Rpb24gY2goKXt1dS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiB1aCgpe3V1LnByZXZlbnREZWZhdWx0KCksdXUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gaGgodCl7dmFyIGU9dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbj1TdSh0KS5vbigiZHJhZ3N0YXJ0LmRyYWciLHVoLCEwKTsib25zZWxlY3RzdGFydCJpbiBlP24ub24oInNlbGVjdHN0YXJ0LmRyYWciLHVoLCEwKTooZS5fX25vc2VsZWN0PWUuc3R5bGUuTW96VXNlclNlbGVjdCxlLnN0eWxlLk1velVzZXJTZWxlY3Q9Im5vbmUiKX1mdW5jdGlvbiBkaCh0LGUpe3ZhciBuPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGk9U3UodCkub24oImRyYWdzdGFydC5kcmFnIixudWxsKTtlJiYoaS5vbigiY2xpY2suZHJhZyIsdWgsITApLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aS5vbigiY2xpY2suZHJhZyIsbnVsbCl9KSwwKSksIm9uc2VsZWN0c3RhcnQiaW4gbj9pLm9uKCJzZWxlY3RzdGFydC5kcmFnIixudWxsKToobi5zdHlsZS5Nb3pVc2VyU2VsZWN0PW4uX19ub3NlbGVjdCxkZWxldGUgbi5fX25vc2VsZWN0KX1mdW5jdGlvbiBwaCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gZmgodCxlLG4saSxyLG8sYSxzLGwsYyl7dGhpcy50YXJnZXQ9dCx0aGlzLnR5cGU9ZSx0aGlzLnN1YmplY3Q9bix0aGlzLmlkZW50aWZpZXI9aSx0aGlzLmFjdGl2ZT1yLHRoaXMueD1vLHRoaXMueT1hLHRoaXMuZHg9cyx0aGlzLmR5PWwsdGhpcy5fPWN9ZnVuY3Rpb24gbWgoKXtyZXR1cm4hdXUuY3RybEtleSYmIXV1LmJ1dHRvbn1mdW5jdGlvbiBnaCgpe3JldHVybiB0aGlzLnBhcmVudE5vZGV9ZnVuY3Rpb24gX2godCl7cmV0dXJuIG51bGw9PXQ/e3g6dXUueCx5OnV1Lnl9OnR9ZnVuY3Rpb24geWgoKXtyZXR1cm4gbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzfHwib250b3VjaHN0YXJ0ImluIHRoaXN9ZnVuY3Rpb24gdmgoKXt2YXIgdCxlLG4saSxyPW1oLG89Z2gsYT1faCxzPXloLGw9e30sYz1sYygic3RhcnQiLCJkcmFnIiwiZW5kIiksdT0wLGg9MDtmdW5jdGlvbiBkKHQpe3Qub24oIm1vdXNlZG93bi5kcmFnIixwKS5maWx0ZXIocykub24oInRvdWNoc3RhcnQuZHJhZyIsZykub24oInRvdWNobW92ZS5kcmFnIixfKS5vbigidG91Y2hlbmQuZHJhZyB0b3VjaGNhbmNlbC5kcmFnIix5KS5zdHlsZSgidG91Y2gtYWN0aW9uIiwibm9uZSIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIil9ZnVuY3Rpb24gcCgpe2lmKCFpJiZyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIGE9digibW91c2UiLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpLGFoLHRoaXMsYXJndW1lbnRzKTthJiYoU3UodXUudmlldykub24oIm1vdXNlbW92ZS5kcmFnIixmLCEwKS5vbigibW91c2V1cC5kcmFnIixtLCEwKSxoaCh1dS52aWV3KSxjaCgpLG49ITEsdD11dS5jbGllbnRYLGU9dXUuY2xpZW50WSxhKCJzdGFydCIpKX19ZnVuY3Rpb24gZigpe2lmKHVoKCksIW4pe3ZhciBpPXV1LmNsaWVudFgtdCxyPXV1LmNsaWVudFktZTtuPWkqaStyKnI+aH1sLm1vdXNlKCJkcmFnIil9ZnVuY3Rpb24gbSgpe1N1KHV1LnZpZXcpLm9uKCJtb3VzZW1vdmUuZHJhZyBtb3VzZXVwLmRyYWciLG51bGwpLGRoKHV1LnZpZXcsbiksdWgoKSxsLm1vdXNlKCJlbmQiKX1mdW5jdGlvbiBnKCl7aWYoci5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciB0LGUsbj11dS5jaGFuZ2VkVG91Y2hlcyxpPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpLGE9bi5sZW5ndGg7Zm9yKHQ9MDt0PGE7Kyt0KShlPXYoblt0XS5pZGVudGlmaWVyLGksbGgsdGhpcyxhcmd1bWVudHMpKSYmKGNoKCksZSgic3RhcnQiKSl9fWZ1bmN0aW9uIF8oKXt2YXIgdCxlLG49dXUuY2hhbmdlZFRvdWNoZXMsaT1uLmxlbmd0aDtmb3IodD0wO3Q8aTsrK3QpKGU9bFtuW3RdLmlkZW50aWZpZXJdKSYmKHVoKCksZSgiZHJhZyIpKX1mdW5jdGlvbiB5KCl7dmFyIHQsZSxuPXV1LmNoYW5nZWRUb3VjaGVzLHI9bi5sZW5ndGg7Zm9yKGkmJmNsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aT1udWxsfSksNTAwKSx0PTA7dDxyOysrdCkoZT1sW25bdF0uaWRlbnRpZmllcl0pJiYoY2goKSxlKCJlbmQiKSl9ZnVuY3Rpb24gdih0LGUsbixpLHIpe3ZhciBvLHMsaCxwPW4oZSx0KSxmPWMuY29weSgpO2lmKGd1KG5ldyBmaChkLCJiZWZvcmVzdGFydCIsbyx0LHUscFswXSxwWzFdLDAsMCxmKSwoZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9KHV1LnN1YmplY3Q9bz1hLmFwcGx5KGkscikpJiYocz1vLngtcFswXXx8MCxoPW8ueS1wWzFdfHwwLCEwKX0pKSlyZXR1cm4gZnVuY3Rpb24gYShjKXt2YXIgbSxnPXA7c3dpdGNoKGMpe2Nhc2Uic3RhcnQiOmxbdF09YSxtPXUrKzticmVhaztjYXNlImVuZCI6ZGVsZXRlIGxbdF0sLS11O2Nhc2UiZHJhZyI6cD1uKGUsdCksbT11fWd1KG5ldyBmaChkLGMsbyx0LG0scFswXStzLHBbMV0raCxwWzBdLWdbMF0scFsxXS1nWzFdLGYpLGYuYXBwbHksZixbYyxpLHJdKX19cmV0dXJuIGQuZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6cGgoISF0KSxkKTpyfSxkLmNvbnRhaW5lcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnBoKHQpLGQpOm99LGQuc3ViamVjdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnBoKHQpLGQpOmF9LGQudG91Y2hhYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6cGgoISF0KSxkKTpzfSxkLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9Yy5vbi5hcHBseShjLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1jP2Q6dH0sZC5jbGlja0Rpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSh0PSt0KSp0LGQpOk1hdGguc3FydChoKX0sZH1mdW5jdGlvbiBiaCh0LGUsbil7dC5wcm90b3R5cGU9ZS5wcm90b3R5cGU9bixuLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24geGgodCxlKXt2YXIgbj1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIGkgaW4gZSluW2ldPWVbaV07cmV0dXJuIG59ZnVuY3Rpb24gd2goKXt9aWgucHJvdG90eXBlPW5oLnByb3RvdHlwZT17Y29uc3RydWN0b3I6aWgsZ2V0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl87IShlIGluIHQpOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHRbZV19LHNldDpmdW5jdGlvbih0LGUpe3JldHVybiB0W3RoaXMuX109ZX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl8gaW4gdCYmZGVsZXRlIHRbdGhpcy5fXX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX0sZmgucHJvdG90eXBlLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fLm9uLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpO3JldHVybiB0PT09dGhpcy5fP3RoaXM6dH07dmFyIFNoPS43LE1oPTEvU2gsRWg9IlxccyooWystXT9cXGQrKVxccyoiLFRoPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLENoPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixBaD0vXiMoWzAtOWEtZl17Myw4fSkkLyxraD1uZXcgUmVnRXhwKCJecmdiXFwoIitbRWgsRWgsRWhdKyJcXCkkIiksTGg9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW0NoLENoLENoXSsiXFwpJCIpLFBoPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbRWgsRWgsRWgsVGhdKyJcXCkkIiksTmg9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tDaCxDaCxDaCxUaF0rIlxcKSQiKSxJaD1uZXcgUmVnRXhwKCJeaHNsXFwoIitbVGgsQ2gsQ2hdKyJcXCkkIiksUmg9bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1tUaCxDaCxDaCxUaF0rIlxcKSQiKSxPaD17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtmdW5jdGlvbiB6aCgpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpfWZ1bmN0aW9uIERoKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCl9ZnVuY3Rpb24gQmgodCl7dmFyIGUsbjtyZXR1cm4gdD0odCsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKGU9QWguZXhlYyh0KSk/KG49ZVsxXS5sZW5ndGgsZT1wYXJzZUludChlWzFdLDE2KSw2PT09bj9IaChlKTozPT09bj9uZXcgamgoZT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgxNSZlKTw8NHwxNSZlLDEpOjg9PT1uP0ZoKGU+PjI0JjI1NSxlPj4xNiYyNTUsZT4+OCYyNTUsKDI1NSZlKS8yNTUpOjQ9PT1uP0ZoKGU+PjEyJjE1fGU+PjgmMjQwLGU+PjgmMTV8ZT4+NCYyNDAsZT4+NCYxNXwyNDAmZSwoKDE1JmUpPDw0fDE1JmUpLzI1NSk6bnVsbCk6KGU9a2guZXhlYyh0KSk/bmV3IGpoKGVbMV0sZVsyXSxlWzNdLDEpOihlPUxoLmV4ZWModCkpP25ldyBqaCgyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCwxKTooZT1QaC5leGVjKHQpKT9GaChlWzFdLGVbMl0sZVszXSxlWzRdKTooZT1OaC5leGVjKHQpKT9GaCgyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCxlWzRdKTooZT1JaC5leGVjKHQpKT9ZaChlWzFdLGVbMl0vMTAwLGVbM10vMTAwLDEpOihlPVJoLmV4ZWModCkpP1loKGVbMV0sZVsyXS8xMDAsZVszXS8xMDAsZVs0XSk6T2guaGFzT3duUHJvcGVydHkodCk/SGgoT2hbdF0pOiJ0cmFuc3BhcmVudCI9PT10P25ldyBqaChOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIEhoKHQpe3JldHVybiBuZXcgamgodD4+MTYmMjU1LHQ+PjgmMjU1LDI1NSZ0LDEpfWZ1bmN0aW9uIEZoKHQsZSxuLGkpe3JldHVybiBpPD0wJiYodD1lPW49TmFOKSxuZXcgamgodCxlLG4saSl9ZnVuY3Rpb24gVmgodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiB3aHx8KHQ9QmgodCkpLHQ/bmV3IGpoKCh0PXQucmdiKCkpLnIsdC5nLHQuYix0Lm9wYWNpdHkpOm5ldyBqaH1mdW5jdGlvbiBVaCh0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/VmgodCk6bmV3IGpoKHQsZSxuLG51bGw9PWk/MTppKX1mdW5jdGlvbiBqaCh0LGUsbixpKXt0aGlzLnI9K3QsdGhpcy5nPStlLHRoaXMuYj0rbix0aGlzLm9wYWNpdHk9K2l9ZnVuY3Rpb24gR2goKXtyZXR1cm4iIyIrcWgodGhpcy5yKStxaCh0aGlzLmcpK3FoKHRoaXMuYil9ZnVuY3Rpb24gV2goKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX1mdW5jdGlvbiBxaCh0KXtyZXR1cm4oKHQ9TWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0KXx8MCkpKTwxNj8iMCI6IiIpK3QudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIFloKHQsZSxuLGkpe3JldHVybiBpPD0wP3Q9ZT1uPU5hTjpuPD0wfHxuPj0xP3Q9ZT1OYU46ZTw9MCYmKHQ9TmFOKSxuZXcgS2godCxlLG4saSl9ZnVuY3Rpb24gWGgodCl7aWYodCBpbnN0YW5jZW9mIEtoKXJldHVybiBuZXcgS2godC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2Ygd2h8fCh0PUJoKHQpKSwhdClyZXR1cm4gbmV3IEtoO2lmKHQgaW5zdGFuY2VvZiBLaClyZXR1cm4gdDt2YXIgZT0odD10LnJnYigpKS5yLzI1NSxuPXQuZy8yNTUsaT10LmIvMjU1LHI9TWF0aC5taW4oZSxuLGkpLG89TWF0aC5tYXgoZSxuLGkpLGE9TmFOLHM9by1yLGw9KG8rcikvMjtyZXR1cm4gcz8oYT1lPT09bz8obi1pKS9zKzYqKG48aSk6bj09PW8/KGktZSkvcysyOihlLW4pL3MrNCxzLz1sPC41P28rcjoyLW8tcixhKj02MCk6cz1sPjAmJmw8MT8wOmEsbmV3IEtoKGEscyxsLHQub3BhY2l0eSl9ZnVuY3Rpb24gJGgodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP1hoKHQpOm5ldyBLaCh0LGUsbixudWxsPT1pPzE6aSl9ZnVuY3Rpb24gS2godCxlLG4saSl7dGhpcy5oPSt0LHRoaXMucz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIFpoKHQsZSxuKXtyZXR1cm4gMjU1Kih0PDYwP2UrKG4tZSkqdC82MDp0PDE4MD9uOnQ8MjQwP2UrKG4tZSkqKDI0MC10KS82MDplKX1iaCh3aCxCaCx7Y29weTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3Rvcix0aGlzLHQpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCl9LGhleDp6aCxmb3JtYXRIZXg6emgsZm9ybWF0SHNsOmZ1bmN0aW9uIEpoKCl7cmV0dXJuIFhoKHRoaXMpLmZvcm1hdEhzbCgpfSxmb3JtYXRSZ2I6RGgsdG9TdHJpbmc6RGh9KSxiaChqaCxVaCx4aCh3aCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9NaDpNYXRoLnBvdyhNaCx0KSxuZXcgamgodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/U2g6TWF0aC5wb3coU2gsdCksbmV3IGpoKHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybi0uNTw9dGhpcy5yJiZ0aGlzLnI8MjU1LjUmJi0uNTw9dGhpcy5nJiZ0aGlzLmc8MjU1LjUmJi0uNTw9dGhpcy5iJiZ0aGlzLmI8MjU1LjUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxoZXg6R2gsZm9ybWF0SGV4OkdoLGZvcm1hdFJnYjpXaCx0b1N0cmluZzpXaH0pKSxiaChLaCwkaCx4aCh3aCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9NaDpNYXRoLnBvdyhNaCx0KSxuZXcgS2godGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9TaDpNYXRoLnBvdyhTaCx0KSxuZXcgS2godGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmglMzYwKzM2MCoodGhpcy5oPDApLGU9aXNOYU4odCl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsbj10aGlzLmwsaT1uKyhuPC41P246MS1uKSplLHI9MipuLWk7cmV0dXJuIG5ldyBqaChaaCh0Pj0yNDA/dC0yNDA6dCsxMjAscixpKSxaaCh0LHIsaSksWmgodDwxMjA/dCsyNDA6dC0xMjAscixpKSx0aGlzLm9wYWNpdHkpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybigwPD10aGlzLnMmJnRoaXMuczw9MXx8aXNOYU4odGhpcy5zKSkmJjA8PXRoaXMubCYmdGhpcy5sPD0xJiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sZm9ybWF0SHNsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcGFjaXR5O3JldHVybigxPT09KHQ9aXNOYU4odCk/MTpNYXRoLm1heCgwLE1hdGgubWluKDEsdCkpKT8iaHNsKCI6ImhzbGEoIikrKHRoaXMuaHx8MCkrIiwgIisxMDAqKHRoaXMuc3x8MCkrIiUsICIrMTAwKih0aGlzLmx8fDApKyIlIisoMT09PXQ/IikiOiIsICIrdCsiKSIpfX0pKTt2YXIgUWg9TWF0aC5QSS8xODAsdGQ9MTgwL01hdGguUEksZWQ9Ljk2NDIyLG5kPS44MjUyMSxpZD00LzI5LHJkPTYvMjksb2Q9MypyZCpyZDtmdW5jdGlvbiBhZCh0KXtpZih0IGluc3RhbmNlb2YgbGQpcmV0dXJuIG5ldyBsZCh0LmwsdC5hLHQuYix0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiBtZClyZXR1cm4gZ2QodCk7dCBpbnN0YW5jZW9mIGpofHwodD1WaCh0KSk7dmFyIGUsbixpPWRkKHQucikscj1kZCh0LmcpLG89ZGQodC5iKSxhPWNkKCguMjIyNTA0NSppKy43MTY4Nzg2KnIrLjA2MDYxNjkqbykvMSk7cmV0dXJuIGk9PT1yJiZyPT09bz9lPW49YTooZT1jZCgoLjQzNjA3NDcqaSsuMzg1MDY0OSpyKy4xNDMwODA0Km8pL2VkKSxuPWNkKCguMDEzOTMyMippKy4wOTcxMDQ1KnIrLjcxNDE3MzMqbykvbmQpKSxuZXcgbGQoMTE2KmEtMTYsNTAwKihlLWEpLDIwMCooYS1uKSx0Lm9wYWNpdHkpfWZ1bmN0aW9uIHNkKHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9hZCh0KTpuZXcgbGQodCxlLG4sbnVsbD09aT8xOmkpfWZ1bmN0aW9uIGxkKHQsZSxuLGkpe3RoaXMubD0rdCx0aGlzLmE9K2UsdGhpcy5iPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiBjZCh0KXtyZXR1cm4gdD4uMDA4ODU2NDUxNjc5MDM1NjMxP01hdGgucG93KHQsMS8zKTp0L29kK2lkfWZ1bmN0aW9uIHVkKHQpe3JldHVybiB0PnJkP3QqdCp0Om9kKih0LWlkKX1mdW5jdGlvbiBoZCh0KXtyZXR1cm4gMjU1Kih0PD0uMDAzMTMwOD8xMi45Mip0OjEuMDU1Kk1hdGgucG93KHQsMS8yLjQpLS4wNTUpfWZ1bmN0aW9uIGRkKHQpe3JldHVybih0Lz0yNTUpPD0uMDQwNDU/dC8xMi45MjpNYXRoLnBvdygodCsuMDU1KS8xLjA1NSwyLjQpfWZ1bmN0aW9uIHBkKHQpe2lmKHQgaW5zdGFuY2VvZiBtZClyZXR1cm4gbmV3IG1kKHQuaCx0LmMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIGxkfHwodD1hZCh0KSksMD09PXQuYSYmMD09PXQuYilyZXR1cm4gbmV3IG1kKE5hTiwwPHQubCYmdC5sPDEwMD8wOk5hTix0LmwsdC5vcGFjaXR5KTt2YXIgZT1NYXRoLmF0YW4yKHQuYix0LmEpKnRkO3JldHVybiBuZXcgbWQoZTwwP2UrMzYwOmUsTWF0aC5zcXJ0KHQuYSp0LmErdC5iKnQuYiksdC5sLHQub3BhY2l0eSl9ZnVuY3Rpb24gZmQodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3BkKHQpOm5ldyBtZCh0LGUsbixudWxsPT1pPzE6aSl9ZnVuY3Rpb24gbWQodCxlLG4saSl7dGhpcy5oPSt0LHRoaXMuYz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIGdkKHQpe2lmKGlzTmFOKHQuaCkpcmV0dXJuIG5ldyBsZCh0LmwsMCwwLHQub3BhY2l0eSk7dmFyIGU9dC5oKlFoO3JldHVybiBuZXcgbGQodC5sLE1hdGguY29zKGUpKnQuYyxNYXRoLnNpbihlKSp0LmMsdC5vcGFjaXR5KX1iaChsZCxzZCx4aCh3aCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBsZCh0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGxkKHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9KHRoaXMubCsxNikvMTE2LGU9aXNOYU4odGhpcy5hKT90OnQrdGhpcy5hLzUwMCxuPWlzTmFOKHRoaXMuYik/dDp0LXRoaXMuYi8yMDA7cmV0dXJuIG5ldyBqaChoZCgzLjEzMzg1NjEqKGU9ZWQqdWQoZSkpLTEuNjE2ODY2NyoodD0xKnVkKHQpKS0uNDkwNjE0Nioobj1uZCp1ZChuKSkpLGhkKC0uOTc4NzY4NCplKzEuOTE2MTQxNSp0Ky4wMzM0NTQqbiksaGQoLjA3MTk0NTMqZS0uMjI4OTkxNCp0KzEuNDA1MjQyNypuKSx0aGlzLm9wYWNpdHkpfX0pKSxiaChtZCxmZCx4aCh3aCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBtZCh0aGlzLmgsdGhpcy5jLHRoaXMubCsxOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG1kKHRoaXMuaCx0aGlzLmMsdGhpcy5sLTE4KihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIGdkKHRoaXMpLnJnYigpfX0pKTt2YXIgX2Q9LS4yOTIyNyx5ZD0tLjkwNjQ5LHZkPTEuOTcyOTQ7ZnVuY3Rpb24gYmQodCl7aWYodCBpbnN0YW5jZW9mIHdkKXJldHVybiBuZXcgd2QodC5oLHQucyx0LmwsdC5vcGFjaXR5KTt0IGluc3RhbmNlb2Ygamh8fCh0PVZoKHQpKTt2YXIgZT10LmcvMjU1LG49dC5iLzI1NSxpPSgtLjY1NTc2MzY2Njc5OTk5OTkqbit0LnIvMjU1Ki0xLjc4ODQ1MDM4MDYtMy41MTcyOTgyNDM4KmUpLy01Ljk2MTUxMjI5MTIscj1uLWksbz0odmQqKGUtaSktX2QqcikveWQsYT1NYXRoLnNxcnQobypvK3IqcikvKHZkKmkqKDEtaSkpLHM9YT9NYXRoLmF0YW4yKG8scikqdGQtMTIwOk5hTjtyZXR1cm4gbmV3IHdkKHM8MD9zKzM2MDpzLGEsaSx0Lm9wYWNpdHkpfWZ1bmN0aW9uIHhkKHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9iZCh0KTpuZXcgd2QodCxlLG4sbnVsbD09aT8xOmkpfWZ1bmN0aW9uIHdkKHQsZSxuLGkpe3RoaXMuaD0rdCx0aGlzLnM9K2UsdGhpcy5sPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiBTZCh0LGUsbixpLHIpe3ZhciBvPXQqdCxhPW8qdDtyZXR1cm4oKDEtMyp0KzMqby1hKSplKyg0LTYqbyszKmEpKm4rKDErMyp0KzMqby0zKmEpKmkrYSpyKS82fWZ1bmN0aW9uIE1kKHQpe3ZhciBlPXQubGVuZ3RoLTE7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBpPW48PTA/bj0wOm4+PTE/KG49MSxlLTEpOk1hdGguZmxvb3IobiplKSxyPXRbaV0sbz10W2krMV07cmV0dXJuIFNkKChuLWkvZSkqZSxpPjA/dFtpLTFdOjIqci1vLHIsbyxpPGUtMT90W2krMl06MipvLXIpfX1mdW5jdGlvbiBFZCh0KXt2YXIgZT10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGk9TWF0aC5mbG9vcigoKG4lPTEpPDA/KytuOm4pKmUpO3JldHVybiBTZCgobi1pL2UpKmUsdFsoaStlLTEpJWVdLHRbaSVlXSx0WyhpKzEpJWVdLHRbKGkrMiklZV0pfX1mdW5jdGlvbiBUZCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gQ2QodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQrbiplfX1mdW5jdGlvbiBBZCh0LGUpe3ZhciBuPWUtdDtyZXR1cm4gbj9DZCh0LG4+MTgwfHxuPC0xODA/bi0zNjAqTWF0aC5yb3VuZChuLzM2MCk6bik6VGQoaXNOYU4odCk/ZTp0KX1mdW5jdGlvbiBrZCh0LGUpe3ZhciBuPWUtdDtyZXR1cm4gbj9DZCh0LG4pOlRkKGlzTmFOKHQpP2U6dCl9Ymgod2QseGQseGgod2gse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/TWg6TWF0aC5wb3coTWgsdCksbmV3IHdkKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/U2g6TWF0aC5wb3coU2gsdCksbmV3IHdkKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9aXNOYU4odGhpcy5oKT8wOih0aGlzLmgrMTIwKSpRaCxlPSt0aGlzLmwsbj1pc05hTih0aGlzLnMpPzA6dGhpcy5zKmUqKDEtZSksaT1NYXRoLmNvcyh0KSxyPU1hdGguc2luKHQpO3JldHVybiBuZXcgamgoMjU1KihlK24qKC0uMTQ4NjEqaSsxLjc4Mjc3KnIpKSwyNTUqKGUrbiooX2QqaSt5ZCpyKSksMjU1KihlK24qKHZkKmkpKSx0aGlzLm9wYWNpdHkpfX0pKTt2YXIgTGQ9KGZ1bmN0aW9uIHQoZSl7dmFyIG49KGZ1bmN0aW9uIGkodCl7cmV0dXJuIDE9PSh0PSt0KT9rZDpmdW5jdGlvbihlLG4pe3JldHVybiBuLWU/KGZ1bmN0aW9uIGkodCxlLG4pe3JldHVybiB0PU1hdGgucG93KHQsbiksZT1NYXRoLnBvdyhlLG4pLXQsbj0xL24sZnVuY3Rpb24oaSl7cmV0dXJuIE1hdGgucG93KHQraSplLG4pfX0pKGUsbix0KTpUZChpc05hTihlKT9uOmUpfX0pKGUpO2Z1bmN0aW9uIHIodCxlKXt2YXIgaT1uKCh0PVVoKHQpKS5yLChlPVVoKGUpKS5yKSxyPW4odC5nLGUuZyksbz1uKHQuYixlLmIpLGE9a2QodC5vcGFjaXR5LGUub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0LnI9aShlKSx0Lmc9cihlKSx0LmI9byhlKSx0Lm9wYWNpdHk9YShlKSx0KyIifX1yZXR1cm4gci5nYW1tYT10LHJ9KSgxKTtmdW5jdGlvbiBQZCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG4saSxyPWUubGVuZ3RoLG89bmV3IEFycmF5KHIpLGE9bmV3IEFycmF5KHIpLHM9bmV3IEFycmF5KHIpO2ZvcihuPTA7bjxyOysrbilpPVVoKGVbbl0pLG9bbl09aS5yfHwwLGFbbl09aS5nfHwwLHNbbl09aS5ifHwwO3JldHVybiBvPXQobyksYT10KGEpLHM9dChzKSxpLm9wYWNpdHk9MSxmdW5jdGlvbih0KXtyZXR1cm4gaS5yPW8odCksaS5nPWEodCksaS5iPXModCksaSsiIn19fXZhciBOZD1QZChNZCksSWQ9UGQoRWQpO2Z1bmN0aW9uIFJkKHQsZSl7ZXx8KGU9W10pO3ZhciBuLGk9dD9NYXRoLm1pbihlLmxlbmd0aCx0Lmxlbmd0aCk6MCxyPWUuc2xpY2UoKTtyZXR1cm4gZnVuY3Rpb24obyl7Zm9yKG49MDtuPGk7KytuKXJbbl09dFtuXSooMS1vKStlW25dKm87cmV0dXJuIHJ9fWZ1bmN0aW9uIE9kKHQpe3JldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcodCkmJiEodCBpbnN0YW5jZW9mIERhdGFWaWV3KX1mdW5jdGlvbiB6ZCh0LGUpe3ZhciBuLGk9ZT9lLmxlbmd0aDowLHI9dD9NYXRoLm1pbihpLHQubGVuZ3RoKTowLG89bmV3IEFycmF5KHIpLGE9bmV3IEFycmF5KGkpO2ZvcihuPTA7bjxyOysrbilvW25dPWpkKHRbbl0sZVtuXSk7Zm9yKDtuPGk7KytuKWFbbl09ZVtuXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKG49MDtuPHI7KytuKWFbbl09b1tuXSh0KTtyZXR1cm4gYX19ZnVuY3Rpb24gRGQodCxlKXt2YXIgbj1uZXcgRGF0ZTtyZXR1cm4gdD0rdCxlPStlLGZ1bmN0aW9uKGkpe3JldHVybiBuLnNldFRpbWUodCooMS1pKStlKmkpLG59fWZ1bmN0aW9uIEJkKHQsZSl7cmV0dXJuIHQ9K3QsZT0rZSxmdW5jdGlvbihuKXtyZXR1cm4gdCooMS1uKStlKm59fWZ1bmN0aW9uIEhkKHQsZSl7dmFyIG4saT17fSxyPXt9O2ZvcihuIGluIG51bGwhPT10JiYib2JqZWN0Ij09dHlwZW9mIHR8fCh0PXt9KSxudWxsIT09ZSYmIm9iamVjdCI9PXR5cGVvZiBlfHwoZT17fSksZSluIGluIHQ/aVtuXT1qZCh0W25dLGVbbl0pOnJbbl09ZVtuXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKG4gaW4gaSlyW25dPWlbbl0odCk7cmV0dXJuIHJ9fXZhciBGZD0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2csVmQ9bmV3IFJlZ0V4cChGZC5zb3VyY2UsImciKTtmdW5jdGlvbiBVZCh0LGUpe3ZhciBuLGkscixvPUZkLmxhc3RJbmRleD1WZC5sYXN0SW5kZXg9MCxhPS0xLHM9W10sbD1bXTtmb3IodCs9IiIsZSs9IiI7KG49RmQuZXhlYyh0KSkmJihpPVZkLmV4ZWMoZSkpOykocj1pLmluZGV4KT5vJiYocj1lLnNsaWNlKG8sciksc1thXT9zW2FdKz1yOnNbKythXT1yKSwobj1uWzBdKT09PShpPWlbMF0pP3NbYV0/c1thXSs9aTpzWysrYV09aTooc1srK2FdPW51bGwsbC5wdXNoKHtpOmEseDpCZChuLGkpfSkpLG89VmQubGFzdEluZGV4O3JldHVybiBvPGUubGVuZ3RoJiYocj1lLnNsaWNlKG8pLHNbYV0/c1thXSs9cjpzWysrYV09cikscy5sZW5ndGg8Mj9sWzBdPyhmdW5jdGlvbiBjKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlKSsiIn19KShsWzBdLngpOihmdW5jdGlvbiB1KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0pKGUpOihlPWwubGVuZ3RoLGZ1bmN0aW9uKHQpe2Zvcih2YXIgbixpPTA7aTxlOysraSlzWyhuPWxbaV0pLmldPW4ueCh0KTtyZXR1cm4gcy5qb2luKCIiKX0pfWZ1bmN0aW9uIGpkKHQsZSl7dmFyIG4saT10eXBlb2YgZTtyZXR1cm4gbnVsbD09ZXx8ImJvb2xlYW4iPT09aT9UZChlKTooIm51bWJlciI9PT1pP0JkOiJzdHJpbmciPT09aT8obj1CaChlKSk/KGU9bixMZCk6VWQ6ZSBpbnN0YW5jZW9mIEJoP0xkOmUgaW5zdGFuY2VvZiBEYXRlP0RkOk9kKGUpP1JkOkFycmF5LmlzQXJyYXkoZSk/emQ6ImZ1bmN0aW9uIiE9dHlwZW9mIGUudmFsdWVPZiYmImZ1bmN0aW9uIiE9dHlwZW9mIGUudG9TdHJpbmd8fGlzTmFOKGUpP0hkOkJkKSh0LGUpfWZ1bmN0aW9uIEdkKHQsZSl7cmV0dXJuIHQ9K3QsZT0rZSxmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5yb3VuZCh0KigxLW4pK2Uqbil9fXZhciBXZCxxZCxZZCxYZCwkZD0xODAvTWF0aC5QSSxLZD17dHJhbnNsYXRlWDowLHRyYW5zbGF0ZVk6MCxyb3RhdGU6MCxza2V3WDowLHNjYWxlWDoxLHNjYWxlWToxfTtmdW5jdGlvbiBaZCh0LGUsbixpLHIsbyl7dmFyIGEscyxsO3JldHVybihhPU1hdGguc3FydCh0KnQrZSplKSkmJih0Lz1hLGUvPWEpLChsPXQqbitlKmkpJiYobi09dCpsLGktPWUqbCksKHM9TWF0aC5zcXJ0KG4qbitpKmkpKSYmKG4vPXMsaS89cyxsLz1zKSx0Kmk8ZSpuJiYodD0tdCxlPS1lLGw9LWwsYT0tYSkse3RyYW5zbGF0ZVg6cix0cmFuc2xhdGVZOm8scm90YXRlOk1hdGguYXRhbjIoZSx0KSokZCxza2V3WDpNYXRoLmF0YW4obCkqJGQsc2NhbGVYOmEsc2NhbGVZOnN9fWZ1bmN0aW9uIEpkKHQsZSxuLGkpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQubGVuZ3RoP3QucG9wKCkrIiAiOiIifXJldHVybiBmdW5jdGlvbihvLGEpe3ZhciBzPVtdLGw9W107cmV0dXJuIG89dChvKSxhPXQoYSksKGZ1bmN0aW9uIGModCxpLHIsbyxhLHMpe2lmKHQhPT1yfHxpIT09byl7dmFyIGw9YS5wdXNoKCJ0cmFuc2xhdGUoIixudWxsLGUsbnVsbCxuKTtzLnB1c2goe2k6bC00LHg6QmQodCxyKX0se2k6bC0yLHg6QmQoaSxvKX0pfWVsc2Uocnx8bykmJmEucHVzaCgidHJhbnNsYXRlKCIrcitlK28rbil9KShvLnRyYW5zbGF0ZVgsby50cmFuc2xhdGVZLGEudHJhbnNsYXRlWCxhLnRyYW5zbGF0ZVkscyxsKSwoZnVuY3Rpb24gdSh0LGUsbixvKXt0IT09ZT8odC1lPjE4MD9lKz0zNjA6ZS10PjE4MCYmKHQrPTM2MCksby5wdXNoKHtpOm4ucHVzaChyKG4pKyJyb3RhdGUoIixudWxsLGkpLTIseDpCZCh0LGUpfSkpOmUmJm4ucHVzaChyKG4pKyJyb3RhdGUoIitlK2kpfSkoby5yb3RhdGUsYS5yb3RhdGUscyxsKSwoZnVuY3Rpb24gaCh0LGUsbixvKXt0IT09ZT9vLnB1c2goe2k6bi5wdXNoKHIobikrInNrZXdYKCIsbnVsbCxpKS0yLHg6QmQodCxlKX0pOmUmJm4ucHVzaChyKG4pKyJza2V3WCgiK2UraSl9KShvLnNrZXdYLGEuc2tld1gscyxsKSwoZnVuY3Rpb24gZCh0LGUsbixpLG8sYSl7aWYodCE9PW58fGUhPT1pKXt2YXIgcz1vLnB1c2gocihvKSsic2NhbGUoIixudWxsLCIsIixudWxsLCIpIik7YS5wdXNoKHtpOnMtNCx4OkJkKHQsbil9LHtpOnMtMix4OkJkKGUsaSl9KX1lbHNlIDE9PT1uJiYxPT09aXx8by5wdXNoKHIobykrInNjYWxlKCIrbisiLCIraSsiKSIpfSkoby5zY2FsZVgsby5zY2FsZVksYS5zY2FsZVgsYS5zY2FsZVkscyxsKSxvPWE9bnVsbCxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0tMSxpPWwubGVuZ3RoOysrbjxpOylzWyhlPWxbbl0pLmldPWUueCh0KTtyZXR1cm4gcy5qb2luKCIiKX19fXZhciBRZD1KZCgoZnVuY3Rpb24gdHAodCl7cmV0dXJuIm5vbmUiPT09dD9LZDooV2R8fChXZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSxxZD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsWWQ9ZG9jdW1lbnQuZGVmYXVsdFZpZXcpLFdkLnN0eWxlLnRyYW5zZm9ybT10LHQ9WWQuZ2V0Q29tcHV0ZWRTdHlsZShxZC5hcHBlbmRDaGlsZChXZCksbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNmb3JtIikscWQucmVtb3ZlQ2hpbGQoV2QpLFpkKCsodD10LnNsaWNlKDcsLTEpLnNwbGl0KCIsIikpWzBdLCt0WzFdLCt0WzJdLCt0WzNdLCt0WzRdLCt0WzVdKSl9KSwicHgsICIsInB4KSIsImRlZykiKSxlcD1KZCgoZnVuY3Rpb24gbnAodCl7cmV0dXJuIG51bGw9PXQ/S2Q6KFhkfHwoWGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsImciKSksWGQuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLHQpLCh0PVhkLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpP1pkKCh0PXQubWF0cml4KS5hLHQuYix0LmMsdC5kLHQuZSx0LmYpOktkKX0pLCIsICIsIikiLCIpIiksaXA9TWF0aC5TUVJUMjtmdW5jdGlvbiBycCh0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpKzEvdCkvMn1mdW5jdGlvbiBvcCh0LGUpe3ZhciBuLGkscj10WzBdLG89dFsxXSxhPXRbMl0scz1lWzJdLGw9ZVswXS1yLGM9ZVsxXS1vLHU9bCpsK2MqYztpZih1PDFlLTEyKWk9TWF0aC5sb2cocy9hKS9pcCxuPWZ1bmN0aW9uKHQpe3JldHVybltyK3QqbCxvK3QqYyxhKk1hdGguZXhwKGlwKnQqaSldfTtlbHNle3ZhciBoPU1hdGguc3FydCh1KSxkPShzKnMtYSphKzQqdSkvKDIqYSoyKmgpLHA9KHMqcy1hKmEtNCp1KS8oMipzKjIqaCksZj1NYXRoLmxvZyhNYXRoLnNxcnQoZCpkKzEpLWQpLG09TWF0aC5sb2coTWF0aC5zcXJ0KHAqcCsxKS1wKTtpPShtLWYpL2lwLG49ZnVuY3Rpb24odCl7dmFyIGU9dCppLG49cnAoZikscz1hLygyKmgpKihuKihmdW5jdGlvbiB1KHQpe3JldHVybigodD1NYXRoLmV4cCgyKnQpKS0xKS8odCsxKX0pKGlwKmUrZiktKGZ1bmN0aW9uIGQodCl7cmV0dXJuKCh0PU1hdGguZXhwKHQpKS0xL3QpLzJ9KShmKSk7cmV0dXJuW3IrcypsLG8rcypjLGEqbi9ycChpcCplK2YpXX19cmV0dXJuIG4uZHVyYXRpb249MWUzKmksbn1mdW5jdGlvbiBhcCh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgaT10KChlPSRoKGUpKS5oLChuPSRoKG4pKS5oKSxyPWtkKGUucyxuLnMpLG89a2QoZS5sLG4ubCksYT1rZChlLm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUuaD1pKHQpLGUucz1yKHQpLGUubD1vKHQpLGUub3BhY2l0eT1hKHQpLGUrIiJ9fX12YXIgc3A9YXAoQWQpLGxwPWFwKGtkKTtmdW5jdGlvbiBjcCh0LGUpe3ZhciBuPWtkKCh0PXNkKHQpKS5sLChlPXNkKGUpKS5sKSxpPWtkKHQuYSxlLmEpLHI9a2QodC5iLGUuYiksbz1rZCh0Lm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQubD1uKGUpLHQuYT1pKGUpLHQuYj1yKGUpLHQub3BhY2l0eT1vKGUpLHQrIiJ9fWZ1bmN0aW9uIHVwKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciBpPXQoKGU9ZmQoZSkpLmgsKG49ZmQobikpLmgpLHI9a2QoZS5jLG4uYyksbz1rZChlLmwsbi5sKSxhPWtkKGUub3BhY2l0eSxuLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5oPWkodCksZS5jPXIodCksZS5sPW8odCksZS5vcGFjaXR5PWEodCksZSsiIn19fXZhciBocD11cChBZCksZHA9dXAoa2QpO2Z1bmN0aW9uIHBwKHQpe3JldHVybihmdW5jdGlvbiBlKG4pe2Z1bmN0aW9uIGkoZSxpKXt2YXIgcj10KChlPXhkKGUpKS5oLChpPXhkKGkpKS5oKSxvPWtkKGUucyxpLnMpLGE9a2QoZS5sLGkubCkscz1rZChlLm9wYWNpdHksaS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUuaD1yKHQpLGUucz1vKHQpLGUubD1hKE1hdGgucG93KHQsbikpLGUub3BhY2l0eT1zKHQpLGUrIiJ9fXJldHVybiBuPStuLGkuZ2FtbWE9ZSxpfSkoMSl9dmFyIGZwLG1wLGdwPXBwKEFkKSxfcD1wcChrZCkseXA9MCx2cD0wLGJwPTAseHA9MCx3cD0wLFNwPTAsTXA9Im9iamVjdCI9PXR5cGVvZiBwZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlOkRhdGUsRXA9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdyk6ZnVuY3Rpb24odCl7c2V0VGltZW91dCh0LDE3KX07ZnVuY3Rpb24gVHAoKXtyZXR1cm4gd3B8fChFcChDcCksd3A9TXAubm93KCkrU3ApfWZ1bmN0aW9uIENwKCl7d3A9MH1mdW5jdGlvbiBBcCgpe3RoaXMuX2NhbGw9dGhpcy5fdGltZT10aGlzLl9uZXh0PW51bGx9ZnVuY3Rpb24ga3AodCxlLG4pe3ZhciBpPW5ldyBBcDtyZXR1cm4gaS5yZXN0YXJ0KHQsZSxuKSxpfWZ1bmN0aW9uIExwKCl7VHAoKSwrK3lwO2Zvcih2YXIgdCxlPWZwO2U7KSh0PXdwLWUuX3RpbWUpPj0wJiZlLl9jYWxsLmNhbGwobnVsbCx0KSxlPWUuX25leHQ7LS15cH1mdW5jdGlvbiBQcCgpe3dwPSh4cD1NcC5ub3coKSkrU3AseXA9dnA9MDt0cnl7THAoKX1maW5hbGx5e3lwPTAsKGZ1bmN0aW9uIHQoKXtmb3IodmFyIHQsZSxuPWZwLGk9MS8wO247KW4uX2NhbGw/KGk+bi5fdGltZSYmKGk9bi5fdGltZSksdD1uLG49bi5fbmV4dCk6KGU9bi5fbmV4dCxuLl9uZXh0PW51bGwsbj10P3QuX25leHQ9ZTpmcD1lKTttcD10LElwKGkpfSkoKSx3cD0wfX1mdW5jdGlvbiBOcCgpe3ZhciB0PU1wLm5vdygpLGU9dC14cDtlPjFlMyYmKFNwLT1lLHhwPXQpfWZ1bmN0aW9uIElwKHQpe3lwfHwodnAmJih2cD1jbGVhclRpbWVvdXQodnApKSx0LXdwPjI0Pyh0PDEvMCYmKHZwPXNldFRpbWVvdXQoUHAsdC1NcC5ub3coKS1TcCkpLGJwJiYoYnA9Y2xlYXJJbnRlcnZhbChicCkpKTooYnB8fCh4cD1NcC5ub3coKSxicD1zZXRJbnRlcnZhbChOcCwxZTMpKSx5cD0xLEVwKFBwKSkpfWZ1bmN0aW9uIFJwKHQsZSxuKXt2YXIgaT1uZXcgQXA7cmV0dXJuIGkucmVzdGFydCgoZnVuY3Rpb24obil7aS5zdG9wKCksdChuK2UpfSksZT1udWxsPT1lPzA6K2UsbiksaX1BcC5wcm90b3R5cGU9a3AucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpBcCxyZXN0YXJ0OmZ1bmN0aW9uKHQsZSxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbiIpO249KG51bGw9PW4/VHAoKTorbikrKG51bGw9PWU/MDorZSksdGhpcy5fbmV4dHx8bXA9PT10aGlzfHwobXA/bXAuX25leHQ9dGhpczpmcD10aGlzLG1wPXRoaXMpLHRoaXMuX2NhbGw9dCx0aGlzLl90aW1lPW4sSXAoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2NhbGwmJih0aGlzLl9jYWxsPW51bGwsdGhpcy5fdGltZT0xLzAsSXAoKSl9fTt2YXIgT3A9bGMoInN0YXJ0IiwiZW5kIiwiY2FuY2VsIiwiaW50ZXJydXB0IiksenA9W107ZnVuY3Rpb24gRHAodCxlLG4saSxyLG8pe3ZhciBhPXQuX190cmFuc2l0aW9uO2lmKGEpe2lmKG4gaW4gYSlyZXR1cm59ZWxzZSB0Ll9fdHJhbnNpdGlvbj17fTshKGZ1bmN0aW9uIHModCxlLG4pe3ZhciBpLHI9dC5fX3RyYW5zaXRpb247ZnVuY3Rpb24gbyhsKXt2YXIgYyx1LGgsZDtpZigxIT09bi5zdGF0ZSlyZXR1cm4gcygpO2ZvcihjIGluIHIpaWYoKGQ9cltjXSkubmFtZT09PW4ubmFtZSl7aWYoMz09PWQuc3RhdGUpcmV0dXJuIFJwKG8pOzQ9PT1kLnN0YXRlPyhkLnN0YXRlPTYsZC50aW1lci5zdG9wKCksZC5vbi5jYWxsKCJpbnRlcnJ1cHQiLHQsdC5fX2RhdGFfXyxkLmluZGV4LGQuZ3JvdXApLGRlbGV0ZSByW2NdKTorYzxlJiYoZC5zdGF0ZT02LGQudGltZXIuc3RvcCgpLGQub24uY2FsbCgiY2FuY2VsIix0LHQuX19kYXRhX18sZC5pbmRleCxkLmdyb3VwKSxkZWxldGUgcltjXSl9aWYoUnAoKGZ1bmN0aW9uKCl7Mz09PW4uc3RhdGUmJihuLnN0YXRlPTQsbi50aW1lci5yZXN0YXJ0KGEsbi5kZWxheSxuLnRpbWUpLGEobCkpfSkpLG4uc3RhdGU9MixuLm9uLmNhbGwoInN0YXJ0Iix0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSwyPT09bi5zdGF0ZSl7Zm9yKG4uc3RhdGU9MyxpPW5ldyBBcnJheShoPW4udHdlZW4ubGVuZ3RoKSxjPTAsdT0tMTtjPGg7KytjKShkPW4udHdlZW5bY10udmFsdWUuY2FsbCh0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSkmJihpWysrdV09ZCk7aS5sZW5ndGg9dSsxfX1mdW5jdGlvbiBhKGUpe2Zvcih2YXIgcj1lPG4uZHVyYXRpb24/bi5lYXNlLmNhbGwobnVsbCxlL24uZHVyYXRpb24pOihuLnRpbWVyLnJlc3RhcnQocyksbi5zdGF0ZT01LDEpLG89LTEsYT1pLmxlbmd0aDsrK288YTspaVtvXS5jYWxsKHQscik7NT09PW4uc3RhdGUmJihuLm9uLmNhbGwoImVuZCIsdCx0Ll9fZGF0YV9fLG4uaW5kZXgsbi5ncm91cCkscygpKX1mdW5jdGlvbiBzKCl7Zm9yKHZhciBpIGluIG4uc3RhdGU9NixuLnRpbWVyLnN0b3AoKSxkZWxldGUgcltlXSxyKXJldHVybjtkZWxldGUgdC5fX3RyYW5zaXRpb259cltlXT1uLG4udGltZXI9a3AoKGZ1bmN0aW9uIGwodCl7bi5zdGF0ZT0xLG4udGltZXIucmVzdGFydChvLG4uZGVsYXksbi50aW1lKSxuLmRlbGF5PD10JiZvKHQtbi5kZWxheSl9KSwwLG4udGltZSl9KSh0LG4se25hbWU6ZSxpbmRleDppLGdyb3VwOnIsb246T3AsdHdlZW46enAsdGltZTpvLnRpbWUsZGVsYXk6by5kZWxheSxkdXJhdGlvbjpvLmR1cmF0aW9uLGVhc2U6by5lYXNlLHRpbWVyOm51bGwsc3RhdGU6MH0pfWZ1bmN0aW9uIEJwKHQsZSl7dmFyIG49RnAodCxlKTtpZihuLnN0YXRlPjApdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFkeSBzY2hlZHVsZWQiKTtyZXR1cm4gbn1mdW5jdGlvbiBIcCh0LGUpe3ZhciBuPUZwKHQsZSk7aWYobi5zdGF0ZT4zKXRocm93IG5ldyBFcnJvcigidG9vIGxhdGU7IGFscmVhZHkgcnVubmluZyIpO3JldHVybiBufWZ1bmN0aW9uIEZwKHQsZSl7dmFyIG49dC5fX3RyYW5zaXRpb247aWYoIW58fCEobj1uW2VdKSl0aHJvdyBuZXcgRXJyb3IoInRyYW5zaXRpb24gbm90IGZvdW5kIik7cmV0dXJuIG59ZnVuY3Rpb24gVnAodCxlKXt2YXIgbixpLHIsbz10Ll9fdHJhbnNpdGlvbixhPSEwO2lmKG8pe2ZvcihyIGluIGU9bnVsbD09ZT9udWxsOmUrIiIsbykobj1vW3JdKS5uYW1lPT09ZT8oaT1uLnN0YXRlPjImJm4uc3RhdGU8NSxuLnN0YXRlPTYsbi50aW1lci5zdG9wKCksbi5vbi5jYWxsKGk/ImludGVycnVwdCI6ImNhbmNlbCIsdCx0Ll9fZGF0YV9fLG4uaW5kZXgsbi5ncm91cCksZGVsZXRlIG9bcl0pOmE9ITE7YSYmZGVsZXRlIHQuX190cmFuc2l0aW9ufX1mdW5jdGlvbiBVcCh0LGUpe3ZhciBuLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9SHAodGhpcyx0KSxvPXIudHdlZW47aWYobyE9PW4pZm9yKHZhciBhPTAscz0oaT1uPW8pLmxlbmd0aDthPHM7KythKWlmKGlbYV0ubmFtZT09PWUpeyhpPWkuc2xpY2UoKSkuc3BsaWNlKGEsMSk7YnJlYWt9ci50d2Vlbj1pfX1mdW5jdGlvbiBqcCh0LGUsbil7dmFyIGkscjtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89SHAodGhpcyx0KSxhPW8udHdlZW47aWYoYSE9PWkpe3I9KGk9YSkuc2xpY2UoKTtmb3IodmFyIHM9e25hbWU6ZSx2YWx1ZTpufSxsPTAsYz1yLmxlbmd0aDtsPGM7KytsKWlmKHJbbF0ubmFtZT09PWUpe3JbbF09czticmVha31sPT09YyYmci5wdXNoKHMpfW8udHdlZW49cn19ZnVuY3Rpb24gR3AodCxlLG4pe3ZhciBpPXQuX2lkO3JldHVybiB0LmVhY2goKGZ1bmN0aW9uKCl7dmFyIHQ9SHAodGhpcyxpKTsodC52YWx1ZXx8KHQudmFsdWU9e30pKVtlXT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pKSxmdW5jdGlvbih0KXtyZXR1cm4gRnAodCxpKS52YWx1ZVtlXX19ZnVuY3Rpb24gV3AodCxlKXt2YXIgbjtyZXR1cm4oIm51bWJlciI9PXR5cGVvZiBlP0JkOmUgaW5zdGFuY2VvZiBCaD9MZDoobj1CaChlKSk/KGU9bixMZCk6VWQpKHQsZSl9ZnVuY3Rpb24gcXAodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIFlwKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gWHAodCxlLG4pe3ZhciBpLHIsbz1uKyIiO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0QXR0cmlidXRlKHQpO3JldHVybiBhPT09bz9udWxsOmE9PT1pP3I6cj1lKGk9YSxuKX19ZnVuY3Rpb24gJHAodCxlLG4pe3ZhciBpLHIsbz1uKyIiO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTtyZXR1cm4gYT09PW8/bnVsbDphPT09aT9yOnI9ZShpPWEsbil9fWZ1bmN0aW9uIEtwKHQsZSxuKXt2YXIgaSxyLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEscyxsPW4odGhpcyk7aWYobnVsbCE9bClyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZSh0KSk9PT0ocz1sKyIiKT9udWxsOmE9PT1pJiZzPT09cj9vOihyPXMsbz1lKGk9YSxsKSk7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIFpwKHQsZSxuKXt2YXIgaSxyLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEscyxsPW4odGhpcyk7aWYobnVsbCE9bClyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCkpPT09KHM9bCsiIik/bnVsbDphPT09aSYmcz09PXI/bzoocj1zLG89ZShpPWEsbCkpO3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gSnAodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGUodCxlLmNhbGwodGhpcyxuKSl9fWZ1bmN0aW9uIFFwKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGUuY2FsbCh0aGlzLG4pKX19ZnVuY3Rpb24gdGYodCxlKXt2YXIgbixpO2Z1bmN0aW9uIHIoKXt2YXIgcj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gciE9PWkmJihuPShpPXIpJiZRcCh0LHIpKSxufXJldHVybiByLl92YWx1ZT1lLHJ9ZnVuY3Rpb24gZWYodCxlKXt2YXIgbixpO2Z1bmN0aW9uIHIoKXt2YXIgcj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gciE9PWkmJihuPShpPXIpJiZKcCh0LHIpKSxufXJldHVybiByLl92YWx1ZT1lLHJ9ZnVuY3Rpb24gbmYodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtCcCh0aGlzLHQpLmRlbGF5PStlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gcmYodCxlKXtyZXR1cm4gZT0rZSxmdW5jdGlvbigpe0JwKHRoaXMsdCkuZGVsYXk9ZX19ZnVuY3Rpb24gb2YodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtIcCh0aGlzLHQpLmR1cmF0aW9uPStlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gYWYodCxlKXtyZXR1cm4gZT0rZSxmdW5jdGlvbigpe0hwKHRoaXMsdCkuZHVyYXRpb249ZX19ZnVuY3Rpb24gc2YodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7SHAodGhpcyx0KS5lYXNlPWV9fWZ1bmN0aW9uIGxmKHQsZSxuKXt2YXIgaSxyLG89KGZ1bmN0aW9uIGEodCl7cmV0dXJuKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5ldmVyeSgoZnVuY3Rpb24odCl7dmFyIGU9dC5pbmRleE9mKCIuIik7cmV0dXJuIGU+PTAmJih0PXQuc2xpY2UoMCxlKSksIXR8fCJzdGFydCI9PT10fSkpfSkoZSk/QnA6SHA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9byh0aGlzLHQpLHM9YS5vbjtzIT09aSYmKHI9KGk9cykuY29weSgpKS5vbihlLG4pLGEub249cn19dmFyIGNmPXd1LnByb3RvdHlwZS5jb25zdHJ1Y3RvcjtmdW5jdGlvbiB1Zih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX1mdW5jdGlvbiBoZih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKGkpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxlLmNhbGwodGhpcyxpKSxuKX19ZnVuY3Rpb24gZGYodCxlLG4pe3ZhciBpLHI7ZnVuY3Rpb24gbygpe3ZhciBvPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBvIT09ciYmKGk9KHI9bykmJmhmKHQsbyxuKSksaX1yZXR1cm4gby5fdmFsdWU9ZSxvfWZ1bmN0aW9uIHBmKHQpe3JldHVybiBmdW5jdGlvbihlKXt0aGlzLnRleHRDb250ZW50PXQuY2FsbCh0aGlzLGUpfX1mdW5jdGlvbiBmZih0KXt2YXIgZSxuO2Z1bmN0aW9uIGkoKXt2YXIgaT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gaSE9PW4mJihlPShuPWkpJiZwZihpKSksZX1yZXR1cm4gaS5fdmFsdWU9dCxpfXZhciBtZj0wO2Z1bmN0aW9uIGdmKHQsZSxuLGkpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9ZSx0aGlzLl9uYW1lPW4sdGhpcy5faWQ9aX1mdW5jdGlvbiBfZih0KXtyZXR1cm4gd3UoKS50cmFuc2l0aW9uKHQpfWZ1bmN0aW9uIHlmKCl7cmV0dXJuKyttZn12YXIgdmY9d3UucHJvdG90eXBlO2Z1bmN0aW9uIGJmKHQpe3JldHVybit0fWZ1bmN0aW9uIHhmKHQpe3JldHVybiB0KnR9ZnVuY3Rpb24gd2YodCl7cmV0dXJuIHQqKDItdCl9ZnVuY3Rpb24gU2YodCl7cmV0dXJuKCh0Kj0yKTw9MT90KnQ6LS10KigyLXQpKzEpLzJ9ZnVuY3Rpb24gTWYodCl7cmV0dXJuIHQqdCp0fWZ1bmN0aW9uIEVmKHQpe3JldHVybi0tdCp0KnQrMX1mdW5jdGlvbiBUZih0KXtyZXR1cm4oKHQqPTIpPD0xP3QqdCp0Oih0LT0yKSp0KnQrMikvMn1nZi5wcm90b3R5cGU9X2YucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpnZixzZWxlY3Q6ZnVuY3Rpb24gQ2YodCl7dmFyIGU9dGhpcy5fbmFtZSxuPXRoaXMuX2lkOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1iYyh0KSk7Zm9yKHZhciBpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89bmV3IEFycmF5KHIpLGE9MDthPHI7KythKWZvcih2YXIgcyxsLGM9aVthXSx1PWMubGVuZ3RoLGg9b1thXT1uZXcgQXJyYXkodSksZD0wO2Q8dTsrK2QpKHM9Y1tkXSkmJihsPXQuY2FsbChzLHMuX19kYXRhX18sZCxjKSkmJigiX19kYXRhX18iaW4gcyYmKGwuX19kYXRhX189cy5fX2RhdGFfXyksaFtkXT1sLERwKGhbZF0sZSxuLGQsaCxGcChzLG4pKSk7cmV0dXJuIG5ldyBnZihvLHRoaXMuX3BhcmVudHMsZSxuKX0sc2VsZWN0QWxsOmZ1bmN0aW9uIEFmKHQpe3ZhciBlPXRoaXMuX25hbWUsbj10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9d2ModCkpO2Zvcih2YXIgaT10aGlzLl9ncm91cHMscj1pLmxlbmd0aCxvPVtdLGE9W10scz0wO3M8cjsrK3MpZm9yKHZhciBsLGM9aVtzXSx1PWMubGVuZ3RoLGg9MDtoPHU7KytoKWlmKGw9Y1toXSl7Zm9yKHZhciBkLHA9dC5jYWxsKGwsbC5fX2RhdGFfXyxoLGMpLGY9RnAobCxuKSxtPTAsZz1wLmxlbmd0aDttPGc7KyttKShkPXBbbV0pJiZEcChkLGUsbixtLHAsZik7by5wdXNoKHApLGEucHVzaChsKX1yZXR1cm4gbmV3IGdmKG8sYSxlLG4pfSxmaWx0ZXI6ZnVuY3Rpb24ga2YodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVNjKHQpKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49ZS5sZW5ndGgsaT1uZXcgQXJyYXkobikscj0wO3I8bjsrK3IpZm9yKHZhciBvLGE9ZVtyXSxzPWEubGVuZ3RoLGw9aVtyXT1bXSxjPTA7YzxzOysrYykobz1hW2NdKSYmdC5jYWxsKG8sby5fX2RhdGFfXyxjLGEpJiZsLnB1c2gobyk7cmV0dXJuIG5ldyBnZihpLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LG1lcmdlOmZ1bmN0aW9uIExmKHQpe2lmKHQuX2lkIT09dGhpcy5faWQpdGhyb3cgbmV3IEVycm9yO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj10Ll9ncm91cHMsaT1lLmxlbmd0aCxyPU1hdGgubWluKGksbi5sZW5ndGgpLG89bmV3IEFycmF5KGkpLGE9MDthPHI7KythKWZvcih2YXIgcyxsPWVbYV0sYz1uW2FdLHU9bC5sZW5ndGgsaD1vW2FdPW5ldyBBcnJheSh1KSxkPTA7ZDx1OysrZCkocz1sW2RdfHxjW2RdKSYmKGhbZF09cyk7Zm9yKDthPGk7KythKW9bYV09ZVthXTtyZXR1cm4gbmV3IGdmKG8sdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sc2VsZWN0aW9uOmZ1bmN0aW9uIFBmKCl7cmV0dXJuIG5ldyBjZih0aGlzLl9ncm91cHMsdGhpcy5fcGFyZW50cyl9LHRyYW5zaXRpb246ZnVuY3Rpb24gTmYoKXtmb3IodmFyIHQ9dGhpcy5fbmFtZSxlPXRoaXMuX2lkLG49eWYoKSxpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89MDtvPHI7KytvKWZvcih2YXIgYSxzPWlbb10sbD1zLmxlbmd0aCxjPTA7YzxsOysrYylpZihhPXNbY10pe3ZhciB1PUZwKGEsZSk7RHAoYSx0LG4sYyxzLHt0aW1lOnUudGltZSt1LmRlbGF5K3UuZHVyYXRpb24sZGVsYXk6MCxkdXJhdGlvbjp1LmR1cmF0aW9uLGVhc2U6dS5lYXNlfSl9cmV0dXJuIG5ldyBnZihpLHRoaXMuX3BhcmVudHMsdCxuKX0sY2FsbDp2Zi5jYWxsLG5vZGVzOnZmLm5vZGVzLG5vZGU6dmYubm9kZSxzaXplOnZmLnNpemUsZW1wdHk6dmYuZW1wdHksZWFjaDp2Zi5lYWNoLG9uOmZ1bmN0aW9uIElmKHQsZSl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj9GcCh0aGlzLm5vZGUoKSxuKS5vbi5vbih0KTp0aGlzLmVhY2gobGYobix0LGUpKX0sYXR0cjpmdW5jdGlvbiBSZih0LGUpe3ZhciBuPW1jKHQpLGk9InRyYW5zZm9ybSI9PT1uP2VwOldwO3JldHVybiB0aGlzLmF0dHJUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBlPyhuLmxvY2FsP1pwOktwKShuLGksR3AodGhpcywiYXR0ci4iK3QsZSkpOm51bGw9PWU/KG4ubG9jYWw/WXA6cXApKG4pOihuLmxvY2FsPyRwOlhwKShuLGksZSkpfSxhdHRyVHdlZW46ZnVuY3Rpb24gT2YodCxlKXt2YXIgbj0iYXR0ci4iK3Q7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXJldHVybihuPXRoaXMudHdlZW4obikpJiZuLl92YWx1ZTtpZihudWxsPT1lKXJldHVybiB0aGlzLnR3ZWVuKG4sbnVsbCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO3ZhciBpPW1jKHQpO3JldHVybiB0aGlzLnR3ZWVuKG4sKGkubG9jYWw/dGY6ZWYpKGksZSkpfSxzdHlsZTpmdW5jdGlvbiB6Zih0LGUsbil7dmFyIGk9InRyYW5zZm9ybSI9PSh0Kz0iIik/UWQ6V3A7cmV0dXJuIG51bGw9PWU/dGhpcy5zdHlsZVR3ZWVuKHQsKGZ1bmN0aW9uIHIodCxlKXt2YXIgbixpLHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89SGModGhpcyx0KSxhPSh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLEhjKHRoaXMsdCkpO3JldHVybiBvPT09YT9udWxsOm89PT1uJiZhPT09aT9yOnI9ZShuPW8saT1hKX19KSh0LGkpKS5vbigiZW5kLnN0eWxlLiIrdCx1Zih0KSk6ImZ1bmN0aW9uIj09dHlwZW9mIGU/dGhpcy5zdHlsZVR3ZWVuKHQsKGZ1bmN0aW9uIGEodCxlLG4pe3ZhciBpLHIsbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1IYyh0aGlzLHQpLHM9bih0aGlzKSxsPXMrIiI7cmV0dXJuIG51bGw9PXMmJih0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLGw9cz1IYyh0aGlzLHQpKSxhPT09bD9udWxsOmE9PT1pJiZsPT09cj9vOihyPWwsbz1lKGk9YSxzKSl9fSkodCxpLEdwKHRoaXMsInN0eWxlLiIrdCxlKSkpLmVhY2goKGZ1bmN0aW9uIG8odCxlKXt2YXIgbixpLHIsbyxhPSJzdHlsZS4iK2Uscz0iZW5kLiIrYTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbD1IcCh0aGlzLHQpLGM9bC5vbix1PW51bGw9PWwudmFsdWVbYV0/b3x8KG89dWYoZSkpOnZvaWQgMDtjPT09biYmcj09PXV8fChpPShuPWMpLmNvcHkoKSkub24ocyxyPXUpLGwub249aX19KSh0aGlzLl9pZCx0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsKGZ1bmN0aW9uIHModCxlLG4pe3ZhciBpLHIsbz1uKyIiO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPUhjKHRoaXMsdCk7cmV0dXJuIGE9PT1vP251bGw6YT09PWk/cjpyPWUoaT1hLG4pfX0pKHQsaSxlKSxuKS5vbigiZW5kLnN0eWxlLiIrdCxudWxsKX0sc3R5bGVUd2VlbjpmdW5jdGlvbiBEZih0LGUsbil7dmFyIGk9InN0eWxlLiIrKHQrPSIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKGk9dGhpcy50d2VlbihpKSkmJmkuX3ZhbHVlO2lmKG51bGw9PWUpcmV0dXJuIHRoaXMudHdlZW4oaSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4oaSxkZih0LGUsbnVsbD09bj8iIjpuKSl9LHRleHQ6ZnVuY3Rpb24gQmYodCl7cmV0dXJuIHRoaXMudHdlZW4oInRleHQiLCJmdW5jdGlvbiI9PXR5cGVvZiB0PyhmdW5jdGlvbiBlKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQodGhpcyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT1lPyIiOmV9fSkoR3AodGhpcywidGV4dCIsdCkpOihmdW5jdGlvbiBuKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KShudWxsPT10PyIiOnQrIiIpKX0sdGV4dFR3ZWVuOmZ1bmN0aW9uIEhmKHQpe3ZhciBlPSJ0ZXh0IjtpZihhcmd1bWVudHMubGVuZ3RoPDEpcmV0dXJuKGU9dGhpcy50d2VlbihlKSkmJmUuX3ZhbHVlO2lmKG51bGw9PXQpcmV0dXJuIHRoaXMudHdlZW4oZSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4oZSxmZih0KSl9LHJlbW92ZTpmdW5jdGlvbiBGZigpe3JldHVybiB0aGlzLm9uKCJlbmQucmVtb3ZlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7Zm9yKHZhciBuIGluIHRoaXMuX190cmFuc2l0aW9uKWlmKCtuIT09ZSlyZXR1cm47dCYmdC5yZW1vdmVDaGlsZCh0aGlzKX19KSh0aGlzLl9pZCkpfSx0d2VlbjpmdW5jdGlvbiBWZih0LGUpe3ZhciBuPXRoaXMuX2lkO2lmKHQrPSIiLGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciBpLHI9RnAodGhpcy5ub2RlKCksbikudHdlZW4sbz0wLGE9ci5sZW5ndGg7bzxhOysrbylpZigoaT1yW29dKS5uYW1lPT09dClyZXR1cm4gaS52YWx1ZTtyZXR1cm4gbnVsbH1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1lP1VwOmpwKShuLHQsZSkpfSxkZWxheTpmdW5jdGlvbiBVZih0KXt2YXIgZT10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiB0P25mOnJmKShlLHQpKTpGcCh0aGlzLm5vZGUoKSxlKS5kZWxheX0sZHVyYXRpb246ZnVuY3Rpb24gamYodCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9vZjphZikoZSx0KSk6RnAodGhpcy5ub2RlKCksZSkuZHVyYXRpb259LGVhc2U6ZnVuY3Rpb24gR2YodCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKHNmKGUsdCkpOkZwKHRoaXMubm9kZSgpLGUpLmVhc2V9LGVuZDpmdW5jdGlvbiBXZigpe3ZhciB0LGUsbj10aGlzLGk9bi5faWQscj1uLnNpemUoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG8sYSl7dmFyIHM9e3ZhbHVlOmF9LGw9e3ZhbHVlOmZ1bmN0aW9uKCl7MD09LS1yJiZvKCl9fTtuLmVhY2goKGZ1bmN0aW9uKCl7dmFyIG49SHAodGhpcyxpKSxyPW4ub247ciE9PXQmJigoZT0odD1yKS5jb3B5KCkpLl8uY2FuY2VsLnB1c2gocyksZS5fLmludGVycnVwdC5wdXNoKHMpLGUuXy5lbmQucHVzaChsKSksbi5vbj1lfSkpfSkpfX07dmFyIHFmPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIE1hdGgucG93KHQsZSl9cmV0dXJuIGU9K2Usbi5leHBvbmVudD10LG59KSgzKSxZZj0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiAxLU1hdGgucG93KDEtdCxlKX1yZXR1cm4gZT0rZSxuLmV4cG9uZW50PXQsbn0pKDMpLFhmPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuKCh0Kj0yKTw9MT9NYXRoLnBvdyh0LGUpOjItTWF0aC5wb3coMi10LGUpKS8yfXJldHVybiBlPStlLG4uZXhwb25lbnQ9dCxufSkoMyksJGY9TWF0aC5QSSxLZj0kZi8yO2Z1bmN0aW9uIFpmKHQpe3JldHVybiAxPT0rdD8xOjEtTWF0aC5jb3ModCpLZil9ZnVuY3Rpb24gSmYodCl7cmV0dXJuIE1hdGguc2luKHQqS2YpfWZ1bmN0aW9uIFFmKHQpe3JldHVybigxLU1hdGguY29zKCRmKnQpKS8yfWZ1bmN0aW9uIHRtKHQpe3JldHVybiAxLjAwMDk3NzUxNzEwNjU0OTQqKE1hdGgucG93KDIsLTEwKnQpLS4wMDA5NzY1NjI1KX1mdW5jdGlvbiBlbSh0KXtyZXR1cm4gdG0oMS0rdCl9ZnVuY3Rpb24gbm0odCl7cmV0dXJuIDEtdG0odCl9ZnVuY3Rpb24gaW0odCl7cmV0dXJuKCh0Kj0yKTw9MT90bSgxLXQpOjItdG0odC0xKSkvMn1mdW5jdGlvbiBybSh0KXtyZXR1cm4gMS1NYXRoLnNxcnQoMS10KnQpfWZ1bmN0aW9uIG9tKHQpe3JldHVybiBNYXRoLnNxcnQoMS0gLS10KnQpfWZ1bmN0aW9uIGFtKHQpe3JldHVybigodCo9Mik8PTE/MS1NYXRoLnNxcnQoMS10KnQpOk1hdGguc3FydCgxLSh0LT0yKSp0KSsxKS8yfXZhciBzbT03LjU2MjU7ZnVuY3Rpb24gbG0odCl7cmV0dXJuIDEtY20oMS10KX1mdW5jdGlvbiBjbSh0KXtyZXR1cm4odD0rdCk8LjM2MzYzNjM2MzYzNjM2MzY1P3NtKnQqdDp0PC43MjcyNzI3MjcyNzI3MjczP3NtKih0LT0uNTQ1NDU0NTQ1NDU0NTQ1NCkqdCsuNzU6dDwuOTA5MDkwOTA5MDkwOTA5MT9zbSoodC09LjgxODE4MTgxODE4MTgxODIpKnQrLjkzNzU6c20qKHQtPS45NTQ1NDU0NTQ1NDU0NTQ2KSp0Ky45ODQzNzV9ZnVuY3Rpb24gdW0odCl7cmV0dXJuKCh0Kj0yKTw9MT8xLWNtKDEtdCk6Y20odC0xKSsxKS8yfXZhciBobT0xLjcwMTU4LGRtPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuKHQ9K3QpKnQqKGUqKHQtMSkrdCl9cmV0dXJuIGU9K2Usbi5vdmVyc2hvb3Q9dCxufSkoaG0pLHBtPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuLS10KnQqKCh0KzEpKmUrdCkrMX1yZXR1cm4gZT0rZSxuLm92ZXJzaG9vdD10LG59KShobSksZm09KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4oKHQqPTIpPDE/dCp0KigoZSsxKSp0LWUpOih0LT0yKSp0KigoZSsxKSp0K2UpKzIpLzJ9cmV0dXJuIGU9K2Usbi5vdmVyc2hvb3Q9dCxufSkoaG0pLG1tPTIqTWF0aC5QSSxnbT0oZnVuY3Rpb24gdChlLG4pe3ZhciBpPU1hdGguYXNpbigxLyhlPU1hdGgubWF4KDEsZSkpKSoobi89bW0pO2Z1bmN0aW9uIHIodCl7cmV0dXJuIGUqdG0oLSAtLXQpKk1hdGguc2luKChpLXQpL24pfXJldHVybiByLmFtcGxpdHVkZT1mdW5jdGlvbihlKXtyZXR1cm4gdChlLG4qbW0pfSxyLnBlcmlvZD1mdW5jdGlvbihuKXtyZXR1cm4gdChlLG4pfSxyfSkoMSwuMyksX209KGZ1bmN0aW9uIHQoZSxuKXt2YXIgaT1NYXRoLmFzaW4oMS8oZT1NYXRoLm1heCgxLGUpKSkqKG4vPW1tKTtmdW5jdGlvbiByKHQpe3JldHVybiAxLWUqdG0odD0rdCkqTWF0aC5zaW4oKHQraSkvbil9cmV0dXJuIHIuYW1wbGl0dWRlPWZ1bmN0aW9uKGUpe3JldHVybiB0KGUsbiptbSl9LHIucGVyaW9kPWZ1bmN0aW9uKG4pe3JldHVybiB0KGUsbil9LHJ9KSgxLC4zKSx5bT0oZnVuY3Rpb24gdChlLG4pe3ZhciBpPU1hdGguYXNpbigxLyhlPU1hdGgubWF4KDEsZSkpKSoobi89bW0pO2Z1bmN0aW9uIHIodCl7cmV0dXJuKCh0PTIqdC0xKTwwP2UqdG0oLXQpKk1hdGguc2luKChpLXQpL24pOjItZSp0bSh0KSpNYXRoLnNpbigoaSt0KS9uKSkvMn1yZXR1cm4gci5hbXBsaXR1ZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSxuKm1tKX0sci5wZXJpb2Q9ZnVuY3Rpb24obil7cmV0dXJuIHQoZSxuKX0scn0pKDEsLjMpLHZtPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGVhc2VMaW5lYXI6YmYsZWFzZVF1YWQ6U2YsZWFzZVF1YWRJbjp4ZixlYXNlUXVhZE91dDp3ZixlYXNlUXVhZEluT3V0OlNmLGVhc2VDdWJpYzpUZixlYXNlQ3ViaWNJbjpNZixlYXNlQ3ViaWNPdXQ6RWYsZWFzZUN1YmljSW5PdXQ6VGYsZWFzZVBvbHk6WGYsZWFzZVBvbHlJbjpxZixlYXNlUG9seU91dDpZZixlYXNlUG9seUluT3V0OlhmLGVhc2VTaW46UWYsZWFzZVNpbkluOlpmLGVhc2VTaW5PdXQ6SmYsZWFzZVNpbkluT3V0OlFmLGVhc2VFeHA6aW0sZWFzZUV4cEluOmVtLGVhc2VFeHBPdXQ6bm0sZWFzZUV4cEluT3V0OmltLGVhc2VDaXJjbGU6YW0sZWFzZUNpcmNsZUluOnJtLGVhc2VDaXJjbGVPdXQ6b20sZWFzZUNpcmNsZUluT3V0OmFtLGVhc2VCb3VuY2U6Y20sZWFzZUJvdW5jZUluOmxtLGVhc2VCb3VuY2VPdXQ6Y20sZWFzZUJvdW5jZUluT3V0OnVtLGVhc2VCYWNrOmZtLGVhc2VCYWNrSW46ZG0sZWFzZUJhY2tPdXQ6cG0sZWFzZUJhY2tJbk91dDpmbSxlYXNlRWxhc3RpYzpfbSxlYXNlRWxhc3RpY0luOmdtLGVhc2VFbGFzdGljT3V0Ol9tLGVhc2VFbGFzdGljSW5PdXQ6eW19KSxibT17dGltZTpudWxsLGRlbGF5OjAsZHVyYXRpb246MjUwLGVhc2U6VGZ9O2Z1bmN0aW9uIHhtKHQsZSl7Zm9yKHZhciBuOyEobj10Ll9fdHJhbnNpdGlvbil8fCEobj1uW2VdKTspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuIGJtLnRpbWU9VHAoKSxibTtyZXR1cm4gbn13dS5wcm90b3R5cGUuaW50ZXJydXB0PWZ1bmN0aW9uIHdtKHQpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7VnAodGhpcyx0KX0pKX0sd3UucHJvdG90eXBlLnRyYW5zaXRpb249ZnVuY3Rpb24gU20odCl7dmFyIGUsbjt0IGluc3RhbmNlb2YgZ2Y/KGU9dC5faWQsdD10Ll9uYW1lKTooZT15ZigpLChuPWJtKS50aW1lPVRwKCksdD1udWxsPT10P251bGw6dCsiIik7Zm9yKHZhciBpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89MDtvPHI7KytvKWZvcih2YXIgYSxzPWlbb10sbD1zLmxlbmd0aCxjPTA7YzxsOysrYykoYT1zW2NdKSYmRHAoYSx0LGUsYyxzLG58fHhtKGEsZSkpO3JldHVybiBuZXcgZ2YoaSx0aGlzLl9wYXJlbnRzLHQsZSl9O3ZhciBNbT1bbnVsbF07ZnVuY3Rpb24gRW0odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIFRtKHQsZSxuKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1lLHRoaXMuc2VsZWN0aW9uPW59ZnVuY3Rpb24gQ20oKXt1dS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBBbSgpe3V1LnByZXZlbnREZWZhdWx0KCksdXUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9dmFyIGttPXtuYW1lOiJkcmFnIn0sTG09e25hbWU6InNwYWNlIn0sUG09e25hbWU6ImhhbmRsZSJ9LE5tPXtuYW1lOiJjZW50ZXIifTtmdW5jdGlvbiBJbSh0KXtyZXR1cm5bK3RbMF0sK3RbMV1dfWZ1bmN0aW9uIFJtKHQpe3JldHVybltJbSh0WzBdKSxJbSh0WzFdKV19ZnVuY3Rpb24gT20odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBsaChlLHV1LnRvdWNoZXMsdCl9fXZhciB6bT17bmFtZToieCIsaGFuZGxlczpbInciLCJlIl0ubWFwKEdtKSxpbnB1dDpmdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P251bGw6W1srdFswXSxlWzBdWzFdXSxbK3RbMV0sZVsxXVsxXV1dfSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlt0WzBdWzBdLHRbMV1bMF1dfX0sRG09e25hbWU6InkiLGhhbmRsZXM6WyJuIiwicyJdLm1hcChHbSksaW5wdXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD9udWxsOltbZVswXVswXSwrdFswXV0sW2VbMV1bMF0sK3RbMV1dXX0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZbdFswXVsxXSx0WzFdWzFdXX19LEJtPXtuYW1lOiJ4eSIsaGFuZGxlczpbIm4iLCJ3IiwiZSIsInMiLCJudyIsIm5lIiwic3ciLCJzZSJdLm1hcChHbSksaW5wdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/bnVsbDpSbSh0KX0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0fX0sSG09e292ZXJsYXk6ImNyb3NzaGFpciIsc2VsZWN0aW9uOiJtb3ZlIixuOiJucy1yZXNpemUiLGU6ImV3LXJlc2l6ZSIsczoibnMtcmVzaXplIix3OiJldy1yZXNpemUiLG53OiJud3NlLXJlc2l6ZSIsbmU6Im5lc3ctcmVzaXplIixzZToibndzZS1yZXNpemUiLHN3OiJuZXN3LXJlc2l6ZSJ9LEZtPXtlOiJ3Iix3OiJlIixudzoibmUiLG5lOiJudyIsc2U6InN3Iixzdzoic2UifSxWbT17bjoicyIsczoibiIsbnc6InN3IixuZToic2UiLHNlOiJuZSIsc3c6Im53In0sVW09e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOm51bGwsZToxLHM6bnVsbCx3Oi0xLG53Oi0xLG5lOjEsc2U6MSxzdzotMX0sam09e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOi0xLGU6bnVsbCxzOjEsdzpudWxsLG53Oi0xLG5lOi0xLHNlOjEsc3c6MX07ZnVuY3Rpb24gR20odCl7cmV0dXJue3R5cGU6dH19ZnVuY3Rpb24gV20oKXtyZXR1cm4hdXUuY3RybEtleSYmIXV1LmJ1dHRvbn1mdW5jdGlvbiBxbSgpe3ZhciB0PXRoaXMub3duZXJTVkdFbGVtZW50fHx0aGlzO3JldHVybiB0Lmhhc0F0dHJpYnV0ZSgidmlld0JveCIpP1tbKHQ9dC52aWV3Qm94LmJhc2VWYWwpLngsdC55XSxbdC54K3Qud2lkdGgsdC55K3QuaGVpZ2h0XV06W1swLDBdLFt0LndpZHRoLmJhc2VWYWwudmFsdWUsdC5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dfWZ1bmN0aW9uIFltKCl7cmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50c3x8Im9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIFhtKHQpe2Zvcig7IXQuX19icnVzaDspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuO3JldHVybiB0Ll9fYnJ1c2h9ZnVuY3Rpb24gJG0odCl7cmV0dXJuIHRbMF1bMF09PT10WzFdWzBdfHx0WzBdWzFdPT09dFsxXVsxXX1mdW5jdGlvbiBLbSh0KXt2YXIgZT10Ll9fYnJ1c2g7cmV0dXJuIGU/ZS5kaW0ub3V0cHV0KGUuc2VsZWN0aW9uKTpudWxsfWZ1bmN0aW9uIFptKCl7cmV0dXJuIFFtKERtKX1mdW5jdGlvbiBKbSgpe3JldHVybiBRbShCbSl9ZnVuY3Rpb24gUW0odCl7dmFyIGUsbj1xbSxpPVdtLHI9WW0sbz0hMCxhPWxjKCJzdGFydCIsImJydXNoIiwiZW5kIikscz02O2Z1bmN0aW9uIGwoZSl7dmFyIG49ZS5wcm9wZXJ0eSgiX19icnVzaCIsbSkuc2VsZWN0QWxsKCIub3ZlcmxheSIpLmRhdGEoW0dtKCJvdmVybGF5IildKTtuLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJvdmVybGF5IikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5hdHRyKCJjdXJzb3IiLEhtLm92ZXJsYXkpLm1lcmdlKG4pLmVhY2goKGZ1bmN0aW9uKCl7dmFyIHQ9WG0odGhpcykuZXh0ZW50O1N1KHRoaXMpLmF0dHIoIngiLHRbMF1bMF0pLmF0dHIoInkiLHRbMF1bMV0pLmF0dHIoIndpZHRoIix0WzFdWzBdLXRbMF1bMF0pLmF0dHIoImhlaWdodCIsdFsxXVsxXS10WzBdWzFdKX0pKSxlLnNlbGVjdEFsbCgiLnNlbGVjdGlvbiIpLmRhdGEoW0dtKCJzZWxlY3Rpb24iKV0pLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJzZWxlY3Rpb24iKS5hdHRyKCJjdXJzb3IiLEhtLnNlbGVjdGlvbikuYXR0cigiZmlsbCIsIiM3NzciKS5hdHRyKCJmaWxsLW9wYWNpdHkiLC4zKS5hdHRyKCJzdHJva2UiLCIjZmZmIikuYXR0cigic2hhcGUtcmVuZGVyaW5nIiwiY3Jpc3BFZGdlcyIpO3ZhciBpPWUuc2VsZWN0QWxsKCIuaGFuZGxlIikuZGF0YSh0LmhhbmRsZXMsKGZ1bmN0aW9uKHQpe3JldHVybiB0LnR5cGV9KSk7aS5leGl0KCkucmVtb3ZlKCksaS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwoZnVuY3Rpb24odCl7cmV0dXJuImhhbmRsZSBoYW5kbGUtLSIrdC50eXBlfSkpLmF0dHIoImN1cnNvciIsKGZ1bmN0aW9uKHQpe3JldHVybiBIbVt0LnR5cGVdfSkpLGUuZWFjaChjKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIikub24oIm1vdXNlZG93bi5icnVzaCIsZCkuZmlsdGVyKHIpLm9uKCJ0b3VjaHN0YXJ0LmJydXNoIixkKS5vbigidG91Y2htb3ZlLmJydXNoIixwKS5vbigidG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLGYpLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCJub25lIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKX1mdW5jdGlvbiBjKCl7dmFyIHQ9U3UodGhpcyksZT1YbSh0aGlzKS5zZWxlY3Rpb247ZT8odC5zZWxlY3RBbGwoIi5zZWxlY3Rpb24iKS5zdHlsZSgiZGlzcGxheSIsbnVsbCkuYXR0cigieCIsZVswXVswXSkuYXR0cigieSIsZVswXVsxXSkuYXR0cigid2lkdGgiLGVbMV1bMF0tZVswXVswXSkuYXR0cigiaGVpZ2h0IixlWzFdWzFdLWVbMF1bMV0pLHQuc2VsZWN0QWxsKCIuaGFuZGxlIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLChmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGVbdC50eXBlLmxlbmd0aC0xXT9lWzFdWzBdLXMvMjplWzBdWzBdLXMvMn0pKS5hdHRyKCJ5IiwoZnVuY3Rpb24odCl7cmV0dXJuInMiPT09dC50eXBlWzBdP2VbMV1bMV0tcy8yOmVbMF1bMV0tcy8yfSkpLmF0dHIoIndpZHRoIiwoZnVuY3Rpb24odCl7cmV0dXJuIm4iPT09dC50eXBlfHwicyI9PT10LnR5cGU/ZVsxXVswXS1lWzBdWzBdK3M6c30pKS5hdHRyKCJoZWlnaHQiLChmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGV8fCJ3Ij09PXQudHlwZT9lWzFdWzFdLWVbMF1bMV0rczpzfSkpKTp0LnNlbGVjdEFsbCgiLnNlbGVjdGlvbiwuaGFuZGxlIikuc3R5bGUoImRpc3BsYXkiLCJub25lIikuYXR0cigieCIsbnVsbCkuYXR0cigieSIsbnVsbCkuYXR0cigid2lkdGgiLG51bGwpLmF0dHIoImhlaWdodCIsbnVsbCl9ZnVuY3Rpb24gdSh0LGUsbil7dmFyIGk9dC5fX2JydXNoLmVtaXR0ZXI7cmV0dXJuIWl8fG4mJmkuY2xlYW4/bmV3IGgodCxlLG4pOml9ZnVuY3Rpb24gaCh0LGUsbil7dGhpcy50aGF0PXQsdGhpcy5hcmdzPWUsdGhpcy5zdGF0ZT10Ll9fYnJ1c2gsdGhpcy5hY3RpdmU9MCx0aGlzLmNsZWFuPW59ZnVuY3Rpb24gZCgpe2lmKCghZXx8dXUudG91Y2hlcykmJmkuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbixyLGEscyxsLGgsZCxwLGYsbSxnLF89dGhpcyx5PXV1LnRhcmdldC5fX2RhdGFfXy50eXBlLHY9InNlbGVjdGlvbiI9PT0obyYmdXUubWV0YUtleT95PSJvdmVybGF5Ijp5KT9rbTpvJiZ1dS5hbHRLZXk/Tm06UG0sYj10PT09RG0/bnVsbDpVbVt5XSx4PXQ9PT16bT9udWxsOmptW3ldLHc9WG0oXyksUz13LmV4dGVudCxNPXcuc2VsZWN0aW9uLEU9U1swXVswXSxUPVNbMF1bMV0sQz1TWzFdWzBdLEE9U1sxXVsxXSxrPTAsTD0wLFA9YiYmeCYmbyYmdXUuc2hpZnRLZXksTj11dS50b3VjaGVzP09tKHV1LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXIpOmFoLEk9TihfKSxSPUksTz11KF8sYXJndW1lbnRzLCEwKS5iZWZvcmVzdGFydCgpOyJvdmVybGF5Ij09PXk/KE0mJihmPSEwKSx3LnNlbGVjdGlvbj1NPVtbbj10PT09RG0/RTpJWzBdLGE9dD09PXptP1Q6SVsxXV0sW2w9dD09PURtP0M6bixkPXQ9PT16bT9BOmFdXSk6KG49TVswXVswXSxhPU1bMF1bMV0sbD1NWzFdWzBdLGQ9TVsxXVsxXSkscj1uLHM9YSxoPWwscD1kO3ZhciB6PVN1KF8pLmF0dHIoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpLEQ9ei5zZWxlY3RBbGwoIi5vdmVybGF5IikuYXR0cigiY3Vyc29yIixIbVt5XSk7aWYodXUudG91Y2hlcylPLm1vdmVkPUgsTy5lbmRlZD1WO2Vsc2V7dmFyIEI9U3UodXUudmlldykub24oIm1vdXNlbW92ZS5icnVzaCIsSCwhMCkub24oIm1vdXNldXAuYnJ1c2giLFYsITApO28mJkIub24oImtleWRvd24uYnJ1c2giLFUsITApLm9uKCJrZXl1cC5icnVzaCIsaiwhMCksaGgodXUudmlldyl9Q20oKSxWcChfKSxjLmNhbGwoXyksTy5zdGFydCgpfWZ1bmN0aW9uIEgoKXt2YXIgdD1OKF8pOyFQfHxtfHxnfHwoTWF0aC5hYnModFswXS1SWzBdKT5NYXRoLmFicyh0WzFdLVJbMV0pP2c9ITA6bT0hMCksUj10LGY9ITAsQW0oKSxGKCl9ZnVuY3Rpb24gRigpe3ZhciB0O3N3aXRjaChrPVJbMF0tSVswXSxMPVJbMV0tSVsxXSx2KXtjYXNlIExtOmNhc2Uga206YiYmKGs9TWF0aC5tYXgoRS1uLE1hdGgubWluKEMtbCxrKSkscj1uK2ssaD1sK2spLHgmJihMPU1hdGgubWF4KFQtYSxNYXRoLm1pbihBLWQsTCkpLHM9YStMLHA9ZCtMKTticmVhaztjYXNlIFBtOmI8MD8oaz1NYXRoLm1heChFLW4sTWF0aC5taW4oQy1uLGspKSxyPW4rayxoPWwpOmI+MCYmKGs9TWF0aC5tYXgoRS1sLE1hdGgubWluKEMtbCxrKSkscj1uLGg9bCtrKSx4PDA/KEw9TWF0aC5tYXgoVC1hLE1hdGgubWluKEEtYSxMKSkscz1hK0wscD1kKTp4PjAmJihMPU1hdGgubWF4KFQtZCxNYXRoLm1pbihBLWQsTCkpLHM9YSxwPWQrTCk7YnJlYWs7Y2FzZSBObTpiJiYocj1NYXRoLm1heChFLE1hdGgubWluKEMsbi1rKmIpKSxoPU1hdGgubWF4KEUsTWF0aC5taW4oQyxsK2sqYikpKSx4JiYocz1NYXRoLm1heChULE1hdGgubWluKEEsYS1MKngpKSxwPU1hdGgubWF4KFQsTWF0aC5taW4oQSxkK0wqeCkpKX1oPHImJihiKj0tMSx0PW4sbj1sLGw9dCx0PXIscj1oLGg9dCx5IGluIEZtJiZELmF0dHIoImN1cnNvciIsSG1beT1GbVt5XV0pKSxwPHMmJih4Kj0tMSx0PWEsYT1kLGQ9dCx0PXMscz1wLHA9dCx5IGluIFZtJiZELmF0dHIoImN1cnNvciIsSG1beT1WbVt5XV0pKSx3LnNlbGVjdGlvbiYmKE09dy5zZWxlY3Rpb24pLG0mJihyPU1bMF1bMF0saD1NWzFdWzBdKSxnJiYocz1NWzBdWzFdLHA9TVsxXVsxXSksTVswXVswXT09PXImJk1bMF1bMV09PT1zJiZNWzFdWzBdPT09aCYmTVsxXVsxXT09PXB8fCh3LnNlbGVjdGlvbj1bW3Isc10sW2gscF1dLGMuY2FsbChfKSxPLmJydXNoKCkpfWZ1bmN0aW9uIFYoKXtpZihDbSgpLHV1LnRvdWNoZXMpe2lmKHV1LnRvdWNoZXMubGVuZ3RoKXJldHVybjtlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2U9bnVsbH0pLDUwMCl9ZWxzZSBkaCh1dS52aWV3LGYpLEIub24oImtleWRvd24uYnJ1c2gga2V5dXAuYnJ1c2ggbW91c2Vtb3ZlLmJydXNoIG1vdXNldXAuYnJ1c2giLG51bGwpO3ouYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKSxELmF0dHIoImN1cnNvciIsSG0ub3ZlcmxheSksdy5zZWxlY3Rpb24mJihNPXcuc2VsZWN0aW9uKSwkbShNKSYmKHcuc2VsZWN0aW9uPW51bGwsYy5jYWxsKF8pKSxPLmVuZCgpfWZ1bmN0aW9uIFUoKXtzd2l0Y2godXUua2V5Q29kZSl7Y2FzZSAxNjpQPWImJng7YnJlYWs7Y2FzZSAxODp2PT09UG0mJihiJiYobD1oLWsqYixuPXIraypiKSx4JiYoZD1wLUwqeCxhPXMrTCp4KSx2PU5tLEYoKSk7YnJlYWs7Y2FzZSAzMjp2IT09UG0mJnYhPT1ObXx8KGI8MD9sPWgtazpiPjAmJihuPXItaykseDwwP2Q9cC1MOng+MCYmKGE9cy1MKSx2PUxtLEQuYXR0cigiY3Vyc29yIixIbS5zZWxlY3Rpb24pLEYoKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59QW0oKX1mdW5jdGlvbiBqKCl7c3dpdGNoKHV1LmtleUNvZGUpe2Nhc2UgMTY6UCYmKG09Zz1QPSExLEYoKSk7YnJlYWs7Y2FzZSAxODp2PT09Tm0mJihiPDA/bD1oOmI+MCYmKG49cikseDwwP2Q9cDp4PjAmJihhPXMpLHY9UG0sRigpKTticmVhaztjYXNlIDMyOnY9PT1MbSYmKHV1LmFsdEtleT8oYiYmKGw9aC1rKmIsbj1yK2sqYikseCYmKGQ9cC1MKngsYT1zK0wqeCksdj1ObSk6KGI8MD9sPWg6Yj4wJiYobj1yKSx4PDA/ZD1wOng+MCYmKGE9cyksdj1QbSksRC5hdHRyKCJjdXJzb3IiLEhtW3ldKSxGKCkpO2JyZWFrO2RlZmF1bHQ6cmV0dXJufUFtKCl9fWZ1bmN0aW9uIHAoKXt1KHRoaXMsYXJndW1lbnRzKS5tb3ZlZCgpfWZ1bmN0aW9uIGYoKXt1KHRoaXMsYXJndW1lbnRzKS5lbmRlZCgpfWZ1bmN0aW9uIG0oKXt2YXIgZT10aGlzLl9fYnJ1c2h8fHtzZWxlY3Rpb246bnVsbH07cmV0dXJuIGUuZXh0ZW50PVJtKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxlLmRpbT10LGV9cmV0dXJuIGwubW92ZT1mdW5jdGlvbihlLG4pe2Uuc2VsZWN0aW9uP2Uub24oInN0YXJ0LmJydXNoIiwoZnVuY3Rpb24oKXt1KHRoaXMsYXJndW1lbnRzKS5iZWZvcmVzdGFydCgpLnN0YXJ0KCl9KSkub24oImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2giLChmdW5jdGlvbigpe3UodGhpcyxhcmd1bWVudHMpLmVuZCgpfSkpLnR3ZWVuKCJicnVzaCIsKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxpPWUuX19icnVzaCxyPXUoZSxhcmd1bWVudHMpLG89aS5zZWxlY3Rpb24sYT10LmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm4saS5leHRlbnQpLHM9amQobyxhKTtmdW5jdGlvbiBsKHQpe2kuc2VsZWN0aW9uPTE9PT10JiZudWxsPT09YT9udWxsOnModCksYy5jYWxsKGUpLHIuYnJ1c2goKX1yZXR1cm4gbnVsbCE9PW8mJm51bGwhPT1hP2w6bCgxKX0pKTplLmVhY2goKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxpPWFyZ3VtZW50cyxyPWUuX19icnVzaCxvPXQuaW5wdXQoImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseShlLGkpOm4sci5leHRlbnQpLGE9dShlLGkpLmJlZm9yZXN0YXJ0KCk7VnAoZSksci5zZWxlY3Rpb249bnVsbD09PW8/bnVsbDpvLGMuY2FsbChlKSxhLnN0YXJ0KCkuYnJ1c2goKS5lbmQoKX0pKX0sbC5jbGVhcj1mdW5jdGlvbih0KXtsLm1vdmUodCxudWxsKX0saC5wcm90b3R5cGU9e2JlZm9yZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLnN0YXRlLmVtaXR0ZXI9dGhpcyx0aGlzLnN0YXJ0aW5nPSEwKSx0aGlzfSxzdGFydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0aW5nPyh0aGlzLnN0YXJ0aW5nPSExLHRoaXMuZW1pdCgic3RhcnQiKSk6dGhpcy5lbWl0KCJicnVzaCIpLHRoaXN9LGJydXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW1pdCgiYnJ1c2giKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09LS10aGlzLmFjdGl2ZSYmKGRlbGV0ZSB0aGlzLnN0YXRlLmVtaXR0ZXIsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbihlKXtndShuZXcgVG0obCxlLHQub3V0cHV0KHRoaXMuc3RhdGUuc2VsZWN0aW9uKSksYS5hcHBseSxhLFtlLHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LGwuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RW0oUm0odCkpLGwpOm59LGwuZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RW0oISF0KSxsKTppfSxsLnRvdWNoYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkVtKCEhdCksbCk6cn0sbC5oYW5kbGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0LGwpOnN9LGwua2V5TW9kaWZpZXJzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSEhdCxsKTpvfSxsLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9YS5vbi5hcHBseShhLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1hP2w6dH0sbH12YXIgdGc9TWF0aC5jb3MsZWc9TWF0aC5zaW4sbmc9TWF0aC5QSSxpZz1uZy8yLHJnPTIqbmcsb2c9TWF0aC5tYXg7ZnVuY3Rpb24gYWcodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQoZS5zb3VyY2UudmFsdWUrZS50YXJnZXQudmFsdWUsbi5zb3VyY2UudmFsdWUrbi50YXJnZXQudmFsdWUpfX12YXIgc2c9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIGxnKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX12YXIgY2c9TWF0aC5QSSx1Zz0yKmNnLGhnPTFlLTYsZGc9dWctaGc7ZnVuY3Rpb24gcGcoKXt0aGlzLl94MD10aGlzLl95MD10aGlzLl94MT10aGlzLl95MT1udWxsLHRoaXMuXz0iIn1mdW5jdGlvbiBmZygpe3JldHVybiBuZXcgcGd9ZnVuY3Rpb24gbWcodCl7cmV0dXJuIHQuc291cmNlfWZ1bmN0aW9uIGdnKHQpe3JldHVybiB0LnRhcmdldH1mdW5jdGlvbiBfZyh0KXtyZXR1cm4gdC5yYWRpdXN9ZnVuY3Rpb24geWcodCl7cmV0dXJuIHQuc3RhcnRBbmdsZX1mdW5jdGlvbiB2Zyh0KXtyZXR1cm4gdC5lbmRBbmdsZX1wZy5wcm90b3R5cGU9ZmcucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpwZyxtb3ZlVG86ZnVuY3Rpb24odCxlKXt0aGlzLl8rPSJNIisodGhpcy5feDA9dGhpcy5feDE9K3QpKyIsIisodGhpcy5feTA9dGhpcy5feTE9K2UpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5feDEmJih0aGlzLl94MT10aGlzLl94MCx0aGlzLl95MT10aGlzLl95MCx0aGlzLl8rPSJaIil9LGxpbmVUbzpmdW5jdGlvbih0LGUpe3RoaXMuXys9IkwiKyh0aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MT0rZSl9LHF1YWRyYXRpY0N1cnZlVG86ZnVuY3Rpb24odCxlLG4saSl7dGhpcy5fKz0iUSIrICt0KyIsIisgK2UrIiwiKyh0aGlzLl94MT0rbikrIiwiKyh0aGlzLl95MT0raSl9LGJlemllckN1cnZlVG86ZnVuY3Rpb24odCxlLG4saSxyLG8pe3RoaXMuXys9IkMiKyArdCsiLCIrICtlKyIsIisgK24rIiwiKyAraSsiLCIrKHRoaXMuX3gxPStyKSsiLCIrKHRoaXMuX3kxPStvKX0sYXJjVG86ZnVuY3Rpb24odCxlLG4saSxyKXt2YXIgbz10aGlzLl94MSxhPXRoaXMuX3kxLHM9KG49K24pLSh0PSt0KSxsPShpPStpKS0oZT0rZSksYz1vLXQsdT1hLWUsaD1jKmMrdSp1O2lmKChyPStyKTwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiK3IpO2lmKG51bGw9PT10aGlzLl94MSl0aGlzLl8rPSJNIisodGhpcy5feDE9dCkrIiwiKyh0aGlzLl95MT1lKTtlbHNlIGlmKGg+aGcpaWYoTWF0aC5hYnModSpzLWwqYyk+aGcmJnIpe3ZhciBkPW4tbyxwPWktYSxmPXMqcytsKmwsbT1kKmQrcCpwLGc9TWF0aC5zcXJ0KGYpLF89TWF0aC5zcXJ0KGgpLHk9cipNYXRoLnRhbigoY2ctTWF0aC5hY29zKChmK2gtbSkvKDIqZypfKSkpLzIpLHY9eS9fLGI9eS9nO01hdGguYWJzKHYtMSk+aGcmJih0aGlzLl8rPSJMIisodCt2KmMpKyIsIisoZSt2KnUpKSx0aGlzLl8rPSJBIityKyIsIityKyIsMCwwLCIrICsodSpkPmMqcCkrIiwiKyh0aGlzLl94MT10K2IqcykrIiwiKyh0aGlzLl95MT1lK2IqbCl9ZWxzZSB0aGlzLl8rPSJMIisodGhpcy5feDE9dCkrIiwiKyh0aGlzLl95MT1lKX0sYXJjOmZ1bmN0aW9uKHQsZSxuLGkscixvKXt0PSt0LGU9K2Usbz0hIW87dmFyIGE9KG49K24pKk1hdGguY29zKGkpLHM9bipNYXRoLnNpbihpKSxsPXQrYSxjPWUrcyx1PTFebyxoPW8/aS1yOnItaTtpZihuPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIrbik7bnVsbD09PXRoaXMuX3gxP3RoaXMuXys9Ik0iK2wrIiwiK2M6KE1hdGguYWJzKHRoaXMuX3gxLWwpPmhnfHxNYXRoLmFicyh0aGlzLl95MS1jKT5oZykmJih0aGlzLl8rPSJMIitsKyIsIitjKSxuJiYoaDwwJiYoaD1oJXVnK3VnKSxoPmRnP3RoaXMuXys9IkEiK24rIiwiK24rIiwwLDEsIit1KyIsIisodC1hKSsiLCIrKGUtcykrIkEiK24rIiwiK24rIiwwLDEsIit1KyIsIisodGhpcy5feDE9bCkrIiwiKyh0aGlzLl95MT1jKTpoPmhnJiYodGhpcy5fKz0iQSIrbisiLCIrbisiLDAsIisgKyhoPj1jZykrIiwiK3UrIiwiKyh0aGlzLl94MT10K24qTWF0aC5jb3MocikpKyIsIisodGhpcy5feTE9ZStuKk1hdGguc2luKHIpKSkpfSxyZWN0OmZ1bmN0aW9uKHQsZSxuLGkpe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rZSkrImgiKyArbisidiIrICtpKyJoIistbisiWiJ9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX319O3ZhciBiZz0iJCI7ZnVuY3Rpb24geGcoKXt9ZnVuY3Rpb24gd2codCxlKXt2YXIgbj1uZXcgeGc7aWYodCBpbnN0YW5jZW9mIHhnKXQuZWFjaCgoZnVuY3Rpb24odCxlKXtuLnNldChlLHQpfSkpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSl7dmFyIGkscj0tMSxvPXQubGVuZ3RoO2lmKG51bGw9PWUpZm9yKDsrK3I8bzspbi5zZXQocix0W3JdKTtlbHNlIGZvcig7KytyPG87KW4uc2V0KGUoaT10W3JdLHIsdCksaSl9ZWxzZSBpZih0KWZvcih2YXIgYSBpbiB0KW4uc2V0KGEsdFthXSk7cmV0dXJuIG59ZnVuY3Rpb24gU2coKXtyZXR1cm57fX1mdW5jdGlvbiBNZyh0LGUsbil7dFtlXT1ufWZ1bmN0aW9uIEVnKCl7cmV0dXJuIHdnKCl9ZnVuY3Rpb24gVGcodCxlLG4pe3Quc2V0KGUsbil9ZnVuY3Rpb24gQ2coKXt9eGcucHJvdG90eXBlPXdnLnByb3RvdHlwZT17Y29uc3RydWN0b3I6eGcsaGFzOmZ1bmN0aW9uKHQpe3JldHVybiBiZyt0IGluIHRoaXN9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpc1tiZyt0XX0sc2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXNbYmcrdF09ZSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9YmcrdDtyZXR1cm4gZSBpbiB0aGlzJiZkZWxldGUgdGhpc1tlXX0sY2xlYXI6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcyl0WzBdPT09YmcmJmRlbGV0ZSB0aGlzW3RdfSxrZXlzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PWJnJiZ0LnB1c2goZS5zbGljZSgxKSk7cmV0dXJuIHR9LHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT1iZyYmdC5wdXNoKHRoaXNbZV0pO3JldHVybiB0fSxlbnRyaWVzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PWJnJiZ0LnB1c2goe2tleTplLnNsaWNlKDEpLHZhbHVlOnRoaXNbZV19KTtyZXR1cm4gdH0sc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTA7Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PWJnJiYrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpaWYodFswXT09PWJnKXJldHVybiExO3JldHVybiEwfSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT1iZyYmdCh0aGlzW2VdLGUuc2xpY2UoMSksdGhpcyl9fTt2YXIgQWc9d2cucHJvdG90eXBlO2Z1bmN0aW9uIGtnKHQsZSl7dmFyIG49bmV3IENnO2lmKHQgaW5zdGFuY2VvZiBDZyl0LmVhY2goKGZ1bmN0aW9uKHQpe24uYWRkKHQpfSkpO2Vsc2UgaWYodCl7dmFyIGk9LTEscj10Lmxlbmd0aDtpZihudWxsPT1lKWZvcig7KytpPHI7KW4uYWRkKHRbaV0pO2Vsc2UgZm9yKDsrK2k8cjspbi5hZGQoZSh0W2ldLGksdCkpfXJldHVybiBufWZ1bmN0aW9uIExnKHQpe3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KWUucHVzaChuKTtyZXR1cm4gZX1DZy5wcm90b3R5cGU9a2cucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpDZyxoYXM6QWcuaGFzLGFkZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpc1tiZysodCs9IiIpXT10LHRoaXN9LHJlbW92ZTpBZy5yZW1vdmUsY2xlYXI6QWcuY2xlYXIsdmFsdWVzOkFnLmtleXMsc2l6ZTpBZy5zaXplLGVtcHR5OkFnLmVtcHR5LGVhY2g6QWcuZWFjaH07dmFyIFBnPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBOZyh0LGUpe3JldHVybiB0LWV9ZnVuY3Rpb24gSWcodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIFJnKHQsZSl7Zm9yKHZhciBuLGk9LTEscj1lLmxlbmd0aDsrK2k8cjspaWYobj1PZyh0LGVbaV0pKXJldHVybiBuO3JldHVybiAwfWZ1bmN0aW9uIE9nKHQsZSl7Zm9yKHZhciBuPWVbMF0saT1lWzFdLHI9LTEsbz0wLGE9dC5sZW5ndGgscz1hLTE7bzxhO3M9bysrKXt2YXIgbD10W29dLGM9bFswXSx1PWxbMV0saD10W3NdLGQ9aFswXSxwPWhbMV07aWYoemcobCxoLGUpKXJldHVybiAwO3U+aSE9cD5pJiZuPChkLWMpKihpLXUpLyhwLXUpK2MmJihyPS1yKX1yZXR1cm4gcn1mdW5jdGlvbiB6Zyh0LGUsbil7dmFyIGk7cmV0dXJuKGZ1bmN0aW9uIHIodCxlLG4pe3JldHVybihlWzBdLXRbMF0pKihuWzFdLXRbMV0pPT0oblswXS10WzBdKSooZVsxXS10WzFdKX0pKHQsZSxuKSYmKGZ1bmN0aW9uIG8odCxlLG4pe3JldHVybiB0PD1lJiZlPD1ufHxuPD1lJiZlPD10fSkodFtpPSsodFswXT09PWVbMF0pXSxuW2ldLGVbaV0pfWZ1bmN0aW9uIERnKCl7fXZhciBCZz1bW10sW1tbMSwxLjVdLFsuNSwxXV1dLFtbWzEuNSwxXSxbMSwxLjVdXV0sW1tbMS41LDFdLFsuNSwxXV1dLFtbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLDEuNV0sWy41LDFdXSxbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLC41XSxbMSwxLjVdXV0sW1tbMSwuNV0sWy41LDFdXV0sW1tbLjUsMV0sWzEsLjVdXV0sW1tbMSwxLjVdLFsxLC41XV1dLFtbWy41LDFdLFsxLC41XV0sW1sxLjUsMV0sWzEsMS41XV1dLFtbWzEuNSwxXSxbMSwuNV1dXSxbW1suNSwxXSxbMS41LDFdXV0sW1tbMSwxLjVdLFsxLjUsMV1dXSxbW1suNSwxXSxbMSwxLjVdXV0sW11dO2Z1bmN0aW9uIEhnKCl7dmFyIHQ9MSxlPTEsbj1qbCxpPXM7ZnVuY3Rpb24gcih0KXt2YXIgZT1uKHQpO2lmKEFycmF5LmlzQXJyYXkoZSkpZT1lLnNsaWNlKCkuc29ydChOZyk7ZWxzZXt2YXIgaT1MbCh0KSxyPWlbMF0sYT1pWzFdO2U9VWwocixhLGUpLGU9emwoTWF0aC5mbG9vcihyL2UpKmUsTWF0aC5mbG9vcihhL2UpKmUsZSl9cmV0dXJuIGUubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gbyh0LGUpfSkpfWZ1bmN0aW9uIG8obixyKXt2YXIgbz1bXSxzPVtdO3JldHVybihmdW5jdGlvbiBsKG4saSxyKXt2YXIgbyxzLGwsYyx1LGg9bmV3IEFycmF5LGQ9bmV3IEFycmF5O2ZvcihvPXM9LTEsQmdbKGw9blswXT49aSk8PDFdLmZvckVhY2gocCk7KytvPHQtMTspQmdbbHwobD1uW28rMV0+PWkpPDwxXS5mb3JFYWNoKHApO2ZvcihCZ1tsPDwwXS5mb3JFYWNoKHApOysrczxlLTE7KXtmb3Iobz0tMSxCZ1sobD1uW3MqdCt0XT49aSk8PDF8KGM9bltzKnRdPj1pKTw8Ml0uZm9yRWFjaChwKTsrK288dC0xOyl1PWMsQmdbbHwobD1uW3MqdCt0K28rMV0+PWkpPDwxfChjPW5bcyp0K28rMV0+PWkpPDwyfHU8PDNdLmZvckVhY2gocCk7QmdbbHxjPDwzXS5mb3JFYWNoKHApfWZvcihvPS0xLEJnWyhjPW5bcyp0XT49aSk8PDJdLmZvckVhY2gocCk7KytvPHQtMTspdT1jLEJnWyhjPW5bcyp0K28rMV0+PWkpPDwyfHU8PDNdLmZvckVhY2gocCk7ZnVuY3Rpb24gcCh0KXt2YXIgZSxuLGk9W3RbMF1bMF0rbyx0WzBdWzFdK3NdLGw9W3RbMV1bMF0rbyx0WzFdWzFdK3NdLGM9YShpKSx1PWEobCk7KGU9ZFtjXSk/KG49aFt1XSk/KGRlbGV0ZSBkW2UuZW5kXSxkZWxldGUgaFtuLnN0YXJ0XSxlPT09bj8oZS5yaW5nLnB1c2gobCkscihlLnJpbmcpKTpoW2Uuc3RhcnRdPWRbbi5lbmRdPXtzdGFydDplLnN0YXJ0LGVuZDpuLmVuZCxyaW5nOmUucmluZy5jb25jYXQobi5yaW5nKX0pOihkZWxldGUgZFtlLmVuZF0sZS5yaW5nLnB1c2gobCksZFtlLmVuZD11XT1lKTooZT1oW3VdKT8obj1kW2NdKT8oZGVsZXRlIGhbZS5zdGFydF0sZGVsZXRlIGRbbi5lbmRdLGU9PT1uPyhlLnJpbmcucHVzaChsKSxyKGUucmluZykpOmhbbi5zdGFydF09ZFtlLmVuZF09e3N0YXJ0Om4uc3RhcnQsZW5kOmUuZW5kLHJpbmc6bi5yaW5nLmNvbmNhdChlLnJpbmcpfSk6KGRlbGV0ZSBoW2Uuc3RhcnRdLGUucmluZy51bnNoaWZ0KGkpLGhbZS5zdGFydD1jXT1lKTpoW2NdPWRbdV09e3N0YXJ0OmMsZW5kOnUscmluZzpbaSxsXX19QmdbYzw8M10uZm9yRWFjaChwKX0pKG4sciwoZnVuY3Rpb24odCl7aSh0LG4sciksKGZ1bmN0aW9uIGUodCl7Zm9yKHZhciBlPTAsbj10Lmxlbmd0aCxpPXRbbi0xXVsxXSp0WzBdWzBdLXRbbi0xXVswXSp0WzBdWzFdOysrZTxuOylpKz10W2UtMV1bMV0qdFtlXVswXS10W2UtMV1bMF0qdFtlXVsxXTtyZXR1cm4gaX0pKHQpPjA/by5wdXNoKFt0XSk6cy5wdXNoKHQpfSkpLHMuZm9yRWFjaCgoZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MCxpPW8ubGVuZ3RoO248aTsrK24paWYoLTEhPT1SZygoZT1vW25dKVswXSx0KSlyZXR1cm4gdm9pZCBlLnB1c2godCl9KSkse3R5cGU6Ik11bHRpUG9seWdvbiIsdmFsdWU6cixjb29yZGluYXRlczpvfX1mdW5jdGlvbiBhKGUpe3JldHVybiAyKmVbMF0rZVsxXSoodCsxKSo0fWZ1bmN0aW9uIHMobixpLHIpe24uZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIG8sYT1uWzBdLHM9blsxXSxsPTB8YSxjPTB8cyx1PWlbYyp0K2xdO2E+MCYmYTx0JiZsPT09YSYmKG5bMF09YSsoci0obz1pW2MqdCtsLTFdKSkvKHUtbyktLjUpLHM+MCYmczxlJiZjPT09cyYmKG5bMV09cysoci0obz1pWyhjLTEpKnQrbF0pKS8odS1vKS0uNSl9KSl9cmV0dXJuIHIuY29udG91cj1vLHIuc2l6ZT1mdW5jdGlvbihuKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm5bdCxlXTt2YXIgaT1NYXRoLmNlaWwoblswXSksbz1NYXRoLmNlaWwoblsxXSk7aWYoIShpPjAmJm8+MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNpemUiKTtyZXR1cm4gdD1pLGU9byxyfSxyLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP0lnKFBnLmNhbGwodCkpOklnKHQpLHIpOm59LHIuc21vb3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQ/czpEZyxyKTppPT09c30scn1mdW5jdGlvbiBGZyh0LGUsbil7Zm9yKHZhciBpPXQud2lkdGgscj10LmhlaWdodCxvPTErKG48PDEpLGE9MDthPHI7KythKWZvcih2YXIgcz0wLGw9MDtzPGkrbjsrK3MpczxpJiYobCs9dC5kYXRhW3MrYSppXSkscz49biYmKHM+PW8mJihsLT10LmRhdGFbcy1vK2EqaV0pLGUuZGF0YVtzLW4rYSppXT1sL01hdGgubWluKHMrMSxpLTErby1zLG8pKX1mdW5jdGlvbiBWZyh0LGUsbil7Zm9yKHZhciBpPXQud2lkdGgscj10LmhlaWdodCxvPTErKG48PDEpLGE9MDthPGk7KythKWZvcih2YXIgcz0wLGw9MDtzPHIrbjsrK3MpczxyJiYobCs9dC5kYXRhW2ErcyppXSkscz49biYmKHM+PW8mJihsLT10LmRhdGFbYSsocy1vKSppXSksZS5kYXRhW2ErKHMtbikqaV09bC9NYXRoLm1pbihzKzEsci0xK28tcyxvKSl9ZnVuY3Rpb24gVWcodCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gamcodCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gR2coKXtyZXR1cm4gMX12YXIgV2c9e30scWc9e307ZnVuY3Rpb24gWWcodCl7cmV0dXJuIG5ldyBGdW5jdGlvbigiZCIsInJldHVybiB7Iit0Lm1hcCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodCkrIjogZFsiK2UrJ10gfHwgIiInfSkpLmpvaW4oIiwiKSsifSIpfWZ1bmN0aW9uIFhnKHQpe3ZhciBlPU9iamVjdC5jcmVhdGUobnVsbCksbj1bXTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtmb3IodmFyIGkgaW4gdClpIGluIGV8fG4ucHVzaChlW2ldPWkpfSkpLG59ZnVuY3Rpb24gJGcodCxlKXt2YXIgbj10KyIiLGk9bi5sZW5ndGg7cmV0dXJuIGk8ZT9uZXcgQXJyYXkoZS1pKzEpLmpvaW4oMCkrbjpufWZ1bmN0aW9uIEtnKHQpe3ZhciBlPW5ldyBSZWdFeHAoJ1siJyt0KyJcblxyXSIpLG49dC5jaGFyQ29kZUF0KDApO2Z1bmN0aW9uIGkodCxlKXt2YXIgaSxyPVtdLG89dC5sZW5ndGgsYT0wLHM9MCxsPW88PTAsYz0hMTtmdW5jdGlvbiB1KCl7aWYobClyZXR1cm4gcWc7aWYoYylyZXR1cm4gYz0hMSxXZzt2YXIgZSxpLHI9YTtpZigzND09PXQuY2hhckNvZGVBdChyKSl7Zm9yKDthKys8byYmMzQhPT10LmNoYXJDb2RlQXQoYSl8fDM0PT09dC5jaGFyQ29kZUF0KCsrYSk7KTtyZXR1cm4oZT1hKT49bz9sPSEwOjEwPT09KGk9dC5jaGFyQ29kZUF0KGErKykpP2M9ITA6MTM9PT1pJiYoYz0hMCwxMD09PXQuY2hhckNvZGVBdChhKSYmKythKSx0LnNsaWNlKHIrMSxlLTEpLnJlcGxhY2UoLyIiL2csJyInKX1mb3IoO2E8bzspe2lmKDEwPT09KGk9dC5jaGFyQ29kZUF0KGU9YSsrKSkpYz0hMDtlbHNlIGlmKDEzPT09aSljPSEwLDEwPT09dC5jaGFyQ29kZUF0KGEpJiYrK2E7ZWxzZSBpZihpIT09biljb250aW51ZTtyZXR1cm4gdC5zbGljZShyLGUpfXJldHVybiBsPSEwLHQuc2xpY2UocixvKX1mb3IoMTA9PT10LmNoYXJDb2RlQXQoby0xKSYmLS1vLDEzPT09dC5jaGFyQ29kZUF0KG8tMSkmJi0tbzsoaT11KCkpIT09cWc7KXtmb3IodmFyIGg9W107aSE9PVdnJiZpIT09cWc7KWgucHVzaChpKSxpPXUoKTtlJiZudWxsPT0oaD1lKGgscysrKSl8fHIucHVzaChoKX1yZXR1cm4gcn1mdW5jdGlvbiByKGUsbil7cmV0dXJuIGUubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gbi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBhKGVbdF0pfSkpLmpvaW4odCl9KSl9ZnVuY3Rpb24gbyhlKXtyZXR1cm4gZS5tYXAoYSkuam9pbih0KX1mdW5jdGlvbiBhKHQpe3JldHVybiBudWxsPT10PyIiOnQgaW5zdGFuY2VvZiBEYXRlPyhmdW5jdGlvbiBuKHQpe3ZhciBlPXQuZ2V0VVRDSG91cnMoKSxuPXQuZ2V0VVRDTWludXRlcygpLGk9dC5nZXRVVENTZWNvbmRzKCkscj10LmdldFVUQ01pbGxpc2Vjb25kcygpO3JldHVybiBpc05hTih0KT8iSW52YWxpZCBEYXRlIjooZnVuY3Rpb24gbyh0KXtyZXR1cm4gdDwwPyItIiskZygtdCw2KTp0Pjk5OTk/IisiKyRnKHQsNik6JGcodCw0KX0pKHQuZ2V0VVRDRnVsbFllYXIoKSkrIi0iKyRnKHQuZ2V0VVRDTW9udGgoKSsxLDIpKyItIiskZyh0LmdldFVUQ0RhdGUoKSwyKSsocj8iVCIrJGcoZSwyKSsiOiIrJGcobiwyKSsiOiIrJGcoaSwyKSsiLiIrJGcociwzKSsiWiI6aT8iVCIrJGcoZSwyKSsiOiIrJGcobiwyKSsiOiIrJGcoaSwyKSsiWiI6bnx8ZT8iVCIrJGcoZSwyKSsiOiIrJGcobiwyKSsiWiI6IiIpfSkodCk6ZS50ZXN0KHQrPSIiKT8nIicrdC5yZXBsYWNlKC8iL2csJyIiJykrJyInOnR9cmV0dXJue3BhcnNlOmZ1bmN0aW9uIHModCxlKXt2YXIgbixyLG89aSh0LChmdW5jdGlvbih0LGkpe2lmKG4pcmV0dXJuIG4odCxpLTEpO3I9dCxuPWU/KGZ1bmN0aW9uIG8odCxlKXt2YXIgbj1ZZyh0KTtyZXR1cm4gZnVuY3Rpb24oaSxyKXtyZXR1cm4gZShuKGkpLHIsdCl9fSkodCxlKTpZZyh0KX0pKTtyZXR1cm4gby5jb2x1bW5zPXJ8fFtdLG99LHBhcnNlUm93czppLGZvcm1hdDpmdW5jdGlvbiBsKGUsbil7cmV0dXJuIG51bGw9PW4mJihuPVhnKGUpKSxbbi5tYXAoYSkuam9pbih0KV0uY29uY2F0KHIoZSxuKSkuam9pbigiXG4iKX0sZm9ybWF0Qm9keTpmdW5jdGlvbiBjKHQsZSl7cmV0dXJuIG51bGw9PWUmJihlPVhnKHQpKSxyKHQsZSkuam9pbigiXG4iKX0sZm9ybWF0Um93czpmdW5jdGlvbiB1KHQpe3JldHVybiB0Lm1hcChvKS5qb2luKCJcbiIpfSxmb3JtYXRSb3c6byxmb3JtYXRWYWx1ZTphfX12YXIgWmc9S2coIiwiKSxKZz1aZy5wYXJzZSxRZz1aZy5wYXJzZVJvd3MsdF89WmcuZm9ybWF0LGVfPVpnLmZvcm1hdEJvZHksbl89WmcuZm9ybWF0Um93cyxpXz1aZy5mb3JtYXRSb3cscl89WmcuZm9ybWF0VmFsdWUsb189S2coIlx0IiksYV89b18ucGFyc2Usc189b18ucGFyc2VSb3dzLGxfPW9fLmZvcm1hdCxjXz1vXy5mb3JtYXRCb2R5LHVfPW9fLmZvcm1hdFJvd3MsaF89b18uZm9ybWF0Um93LGRfPW9fLmZvcm1hdFZhbHVlLHBfPW5ldyBEYXRlKCIyMDE5LTAxLTAxVDAwOjAwIikuZ2V0SG91cnMoKXx8bmV3IERhdGUoIjIwMTktMDctMDFUMDA6MDAiKS5nZXRIb3VycygpO2Z1bmN0aW9uIGZfKHQpe2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcih0LnN0YXR1cysiICIrdC5zdGF0dXNUZXh0KTtyZXR1cm4gdC5ibG9iKCl9ZnVuY3Rpb24gbV8odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LmFycmF5QnVmZmVyKCl9ZnVuY3Rpb24gZ18odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LnRleHQoKX1mdW5jdGlvbiBfXyh0LGUpe3JldHVybiBmZXRjaCh0LGUpLnRoZW4oZ18pfWZ1bmN0aW9uIHlfKHQpe3JldHVybiBmdW5jdGlvbihlLG4saSl7cmV0dXJuIDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgbiYmKGk9bixuPXZvaWQgMCksX18oZSxuKS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gdChlLGkpfSkpfX12YXIgdl89eV8oSmcpLGJfPXlfKGFfKTtmdW5jdGlvbiB4Xyh0KXtpZighdC5vayl0aHJvdyBuZXcgRXJyb3IodC5zdGF0dXMrIiAiK3Quc3RhdHVzVGV4dCk7aWYoMjA0IT09dC5zdGF0dXMmJjIwNSE9PXQuc3RhdHVzKXJldHVybiB0Lmpzb24oKX1mdW5jdGlvbiB3Xyh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtyZXR1cm4gX18oZSxuKS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGUsdCl9KSl9fXZhciBTXz13XygiYXBwbGljYXRpb24veG1sIiksTV89d18oInRleHQvaHRtbCIpLEVfPXdfKCJpbWFnZS9zdmcreG1sIik7ZnVuY3Rpb24gVF8odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIENfKCl7cmV0dXJuIDFlLTYqKE1hdGgucmFuZG9tKCktLjUpfWZ1bmN0aW9uIEFfKHQsZSxuLGkpe2lmKGlzTmFOKGUpfHxpc05hTihuKSlyZXR1cm4gdDt2YXIgcixvLGEscyxsLGMsdSxoLGQscD10Ll9yb290LGY9e2RhdGE6aX0sbT10Ll94MCxnPXQuX3kwLF89dC5feDEseT10Ll95MTtpZighcClyZXR1cm4gdC5fcm9vdD1mLHQ7Zm9yKDtwLmxlbmd0aDspaWYoKGM9ZT49KG89KG0rXykvMikpP209bzpfPW8sKHU9bj49KGE9KGcreSkvMikpP2c9YTp5PWEscj1wLCEocD1wW2g9dTw8MXxjXSkpcmV0dXJuIHJbaF09Zix0O2lmKHM9K3QuX3guY2FsbChudWxsLHAuZGF0YSksbD0rdC5feS5jYWxsKG51bGwscC5kYXRhKSxlPT09cyYmbj09PWwpcmV0dXJuIGYubmV4dD1wLHI/cltoXT1mOnQuX3Jvb3Q9Zix0O2Rve3I9cj9yW2hdPW5ldyBBcnJheSg0KTp0Ll9yb290PW5ldyBBcnJheSg0KSwoYz1lPj0obz0obStfKS8yKSk/bT1vOl89bywodT1uPj0oYT0oZyt5KS8yKSk/Zz1hOnk9YX13aGlsZSgoaD11PDwxfGMpPT0oZD0obD49YSk8PDF8cz49bykpO3JldHVybiByW2RdPXAscltoXT1mLHR9ZnVuY3Rpb24ga18odCxlLG4saSxyKXt0aGlzLm5vZGU9dCx0aGlzLngwPWUsdGhpcy55MD1uLHRoaXMueDE9aSx0aGlzLnkxPXJ9ZnVuY3Rpb24gTF8odCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gUF8odCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gTl8odCxlLG4pe3ZhciBpPW5ldyBJXyhudWxsPT1lP0xfOmUsbnVsbD09bj9QXzpuLE5hTixOYU4sTmFOLE5hTik7cmV0dXJuIG51bGw9PXQ/aTppLmFkZEFsbCh0KX1mdW5jdGlvbiBJXyh0LGUsbixpLHIsbyl7dGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl94MD1uLHRoaXMuX3kwPWksdGhpcy5feDE9cix0aGlzLl95MT1vLHRoaXMuX3Jvb3Q9dm9pZCAwfWZ1bmN0aW9uIFJfKHQpe2Zvcih2YXIgZT17ZGF0YTp0LmRhdGF9LG49ZTt0PXQubmV4dDspbj1uLm5leHQ9e2RhdGE6dC5kYXRhfTtyZXR1cm4gZX12YXIgT189Tl8ucHJvdG90eXBlPUlfLnByb3RvdHlwZTtmdW5jdGlvbiB6Xyh0KXtyZXR1cm4gdC54K3Qudnh9ZnVuY3Rpb24gRF8odCl7cmV0dXJuIHQueSt0LnZ5fWZ1bmN0aW9uIEJfKHQpe3JldHVybiB0LmluZGV4fWZ1bmN0aW9uIEhfKHQsZSl7dmFyIG49dC5nZXQoZSk7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nOiAiK2UpO3JldHVybiBufWZ1bmN0aW9uIEZfKHQpe3JldHVybiB0Lnh9ZnVuY3Rpb24gVl8odCl7cmV0dXJuIHQueX1PXy5jb3B5PWZ1bmN0aW9uKCl7dmFyIHQsZSxuPW5ldyBJXyh0aGlzLl94LHRoaXMuX3ksdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpLGk9dGhpcy5fcm9vdDtpZighaSlyZXR1cm4gbjtpZighaS5sZW5ndGgpcmV0dXJuIG4uX3Jvb3Q9Ul8oaSksbjtmb3IodD1be3NvdXJjZTppLHRhcmdldDpuLl9yb290PW5ldyBBcnJheSg0KX1dO2k9dC5wb3AoKTspZm9yKHZhciByPTA7cjw0OysrcikoZT1pLnNvdXJjZVtyXSkmJihlLmxlbmd0aD90LnB1c2goe3NvdXJjZTplLHRhcmdldDppLnRhcmdldFtyXT1uZXcgQXJyYXkoNCl9KTppLnRhcmdldFtyXT1SXyhlKSk7cmV0dXJuIG59LE9fLmFkZD1mdW5jdGlvbiBVXyh0KXt2YXIgZT0rdGhpcy5feC5jYWxsKG51bGwsdCksbj0rdGhpcy5feS5jYWxsKG51bGwsdCk7cmV0dXJuIEFfKHRoaXMuY292ZXIoZSxuKSxlLG4sdCl9LE9fLmFkZEFsbD1mdW5jdGlvbiBqXyh0KXt2YXIgZSxuLGkscixvPXQubGVuZ3RoLGE9bmV3IEFycmF5KG8pLHM9bmV3IEFycmF5KG8pLGw9MS8wLGM9MS8wLHU9LTEvMCxoPS0xLzA7Zm9yKG49MDtuPG87KytuKWlzTmFOKGk9K3RoaXMuX3guY2FsbChudWxsLGU9dFtuXSkpfHxpc05hTihyPSt0aGlzLl95LmNhbGwobnVsbCxlKSl8fChhW25dPWksc1tuXT1yLGk8bCYmKGw9aSksaT51JiYodT1pKSxyPGMmJihjPXIpLHI+aCYmKGg9cikpO2lmKGw+dXx8Yz5oKXJldHVybiB0aGlzO2Zvcih0aGlzLmNvdmVyKGwsYykuY292ZXIodSxoKSxuPTA7bjxvOysrbilBXyh0aGlzLGFbbl0sc1tuXSx0W25dKTtyZXR1cm4gdGhpc30sT18uY292ZXI9ZnVuY3Rpb24gR18odCxlKXtpZihpc05hTih0PSt0KXx8aXNOYU4oZT0rZSkpcmV0dXJuIHRoaXM7dmFyIG49dGhpcy5feDAsaT10aGlzLl95MCxyPXRoaXMuX3gxLG89dGhpcy5feTE7aWYoaXNOYU4obikpcj0obj1NYXRoLmZsb29yKHQpKSsxLG89KGk9TWF0aC5mbG9vcihlKSkrMTtlbHNle2Zvcih2YXIgYSxzLGw9ci1uLGM9dGhpcy5fcm9vdDtuPnR8fHQ+PXJ8fGk+ZXx8ZT49bzspc3dpdGNoKHM9KGU8aSk8PDF8dDxuLChhPW5ldyBBcnJheSg0KSlbc109YyxjPWEsbCo9MixzKXtjYXNlIDA6cj1uK2wsbz1pK2w7YnJlYWs7Y2FzZSAxOm49ci1sLG89aStsO2JyZWFrO2Nhc2UgMjpyPW4rbCxpPW8tbDticmVhaztjYXNlIDM6bj1yLWwsaT1vLWx9dGhpcy5fcm9vdCYmdGhpcy5fcm9vdC5sZW5ndGgmJih0aGlzLl9yb290PWMpfXJldHVybiB0aGlzLl94MD1uLHRoaXMuX3kwPWksdGhpcy5feDE9cix0aGlzLl95MT1vLHRoaXN9LE9fLmRhdGE9ZnVuY3Rpb24gV18oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy52aXNpdCgoZnVuY3Rpb24oZSl7aWYoIWUubGVuZ3RoKWRve3QucHVzaChlLmRhdGEpfXdoaWxlKGU9ZS5uZXh0KX0pKSx0fSxPXy5leHRlbnQ9ZnVuY3Rpb24gcV8odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5jb3ZlcigrdFswXVswXSwrdFswXVsxXSkuY292ZXIoK3RbMV1bMF0sK3RbMV1bMV0pOmlzTmFOKHRoaXMuX3gwKT92b2lkIDA6W1t0aGlzLl94MCx0aGlzLl95MF0sW3RoaXMuX3gxLHRoaXMuX3kxXV19LE9fLmZpbmQ9ZnVuY3Rpb24gWV8odCxlLG4pe3ZhciBpLHIsbyxhLHMsbCxjLHU9dGhpcy5feDAsaD10aGlzLl95MCxkPXRoaXMuX3gxLHA9dGhpcy5feTEsZj1bXSxtPXRoaXMuX3Jvb3Q7Zm9yKG0mJmYucHVzaChuZXcga18obSx1LGgsZCxwKSksbnVsbD09bj9uPTEvMDoodT10LW4saD1lLW4sZD10K24scD1lK24sbio9bik7bD1mLnBvcCgpOylpZighKCEobT1sLm5vZGUpfHwocj1sLngwKT5kfHwobz1sLnkwKT5wfHwoYT1sLngxKTx1fHwocz1sLnkxKTxoKSlpZihtLmxlbmd0aCl7dmFyIGc9KHIrYSkvMixfPShvK3MpLzI7Zi5wdXNoKG5ldyBrXyhtWzNdLGcsXyxhLHMpLG5ldyBrXyhtWzJdLHIsXyxnLHMpLG5ldyBrXyhtWzFdLGcsbyxhLF8pLG5ldyBrXyhtWzBdLHIsbyxnLF8pKSwoYz0oZT49Xyk8PDF8dD49ZykmJihsPWZbZi5sZW5ndGgtMV0sZltmLmxlbmd0aC0xXT1mW2YubGVuZ3RoLTEtY10sZltmLmxlbmd0aC0xLWNdPWwpfWVsc2V7dmFyIHk9dC0rdGhpcy5feC5jYWxsKG51bGwsbS5kYXRhKSx2PWUtK3RoaXMuX3kuY2FsbChudWxsLG0uZGF0YSksYj15Knkrdip2O2lmKGI8bil7dmFyIHg9TWF0aC5zcXJ0KG49Yik7dT10LXgsaD1lLXgsZD10K3gscD1lK3gsaT1tLmRhdGF9fXJldHVybiBpfSxPXy5yZW1vdmU9ZnVuY3Rpb24gWF8odCl7aWYoaXNOYU4obz0rdGhpcy5feC5jYWxsKG51bGwsdCkpfHxpc05hTihhPSt0aGlzLl95LmNhbGwobnVsbCx0KSkpcmV0dXJuIHRoaXM7dmFyIGUsbixpLHIsbyxhLHMsbCxjLHUsaCxkLHA9dGhpcy5fcm9vdCxmPXRoaXMuX3gwLG09dGhpcy5feTAsZz10aGlzLl94MSxfPXRoaXMuX3kxO2lmKCFwKXJldHVybiB0aGlzO2lmKHAubGVuZ3RoKWZvcig7Oyl7aWYoKGM9bz49KHM9KGYrZykvMikpP2Y9czpnPXMsKHU9YT49KGw9KG0rXykvMikpP209bDpfPWwsZT1wLCEocD1wW2g9dTw8MXxjXSkpcmV0dXJuIHRoaXM7aWYoIXAubGVuZ3RoKWJyZWFrOyhlW2grMSYzXXx8ZVtoKzImM118fGVbaCszJjNdKSYmKG49ZSxkPWgpfWZvcig7cC5kYXRhIT09dDspaWYoaT1wLCEocD1wLm5leHQpKXJldHVybiB0aGlzO3JldHVybihyPXAubmV4dCkmJmRlbGV0ZSBwLm5leHQsaT8ocj9pLm5leHQ9cjpkZWxldGUgaS5uZXh0LHRoaXMpOmU/KHI/ZVtoXT1yOmRlbGV0ZSBlW2hdLChwPWVbMF18fGVbMV18fGVbMl18fGVbM10pJiZwPT09KGVbM118fGVbMl18fGVbMV18fGVbMF0pJiYhcC5sZW5ndGgmJihuP25bZF09cDp0aGlzLl9yb290PXApLHRoaXMpOih0aGlzLl9yb290PXIsdGhpcyl9LE9fLnJlbW92ZUFsbD1mdW5jdGlvbiAkXyh0KXtmb3IodmFyIGU9MCxuPXQubGVuZ3RoO2U8bjsrK2UpdGhpcy5yZW1vdmUodFtlXSk7cmV0dXJuIHRoaXN9LE9fLnJvb3Q9ZnVuY3Rpb24gS18oKXtyZXR1cm4gdGhpcy5fcm9vdH0sT18uc2l6ZT1mdW5jdGlvbiBaXygpe3ZhciB0PTA7cmV0dXJuIHRoaXMudmlzaXQoKGZ1bmN0aW9uKGUpe2lmKCFlLmxlbmd0aClkb3srK3R9d2hpbGUoZT1lLm5leHQpfSkpLHR9LE9fLnZpc2l0PWZ1bmN0aW9uIEpfKHQpe3ZhciBlLG4saSxyLG8sYSxzPVtdLGw9dGhpcy5fcm9vdDtmb3IobCYmcy5wdXNoKG5ldyBrXyhsLHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSk7ZT1zLnBvcCgpOylpZighdChsPWUubm9kZSxpPWUueDAscj1lLnkwLG89ZS54MSxhPWUueTEpJiZsLmxlbmd0aCl7dmFyIGM9KGkrbykvMix1PShyK2EpLzI7KG49bFszXSkmJnMucHVzaChuZXcga18obixjLHUsbyxhKSksKG49bFsyXSkmJnMucHVzaChuZXcga18obixpLHUsYyxhKSksKG49bFsxXSkmJnMucHVzaChuZXcga18obixjLHIsbyx1KSksKG49bFswXSkmJnMucHVzaChuZXcga18obixpLHIsYyx1KSl9cmV0dXJuIHRoaXN9LE9fLnZpc2l0QWZ0ZXI9ZnVuY3Rpb24gUV8odCl7dmFyIGUsbj1bXSxpPVtdO2Zvcih0aGlzLl9yb290JiZuLnB1c2gobmV3IGtfKHRoaXMuX3Jvb3QsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtlPW4ucG9wKCk7KXt2YXIgcj1lLm5vZGU7aWYoci5sZW5ndGgpe3ZhciBvLGE9ZS54MCxzPWUueTAsbD1lLngxLGM9ZS55MSx1PShhK2wpLzIsaD0ocytjKS8yOyhvPXJbMF0pJiZuLnB1c2gobmV3IGtfKG8sYSxzLHUsaCkpLChvPXJbMV0pJiZuLnB1c2gobmV3IGtfKG8sdSxzLGwsaCkpLChvPXJbMl0pJiZuLnB1c2gobmV3IGtfKG8sYSxoLHUsYykpLChvPXJbM10pJiZuLnB1c2gobmV3IGtfKG8sdSxoLGwsYykpfWkucHVzaChlKX1mb3IoO2U9aS5wb3AoKTspdChlLm5vZGUsZS54MCxlLnkwLGUueDEsZS55MSk7cmV0dXJuIHRoaXN9LE9fLng9ZnVuY3Rpb24gdHkodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3g9dCx0aGlzKTp0aGlzLl94fSxPXy55PWZ1bmN0aW9uIGV5KHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl95PXQsdGhpcyk6dGhpcy5feX07dmFyIG55PU1hdGguUEkqKDMtTWF0aC5zcXJ0KDUpKTtmdW5jdGlvbiBpeSh0LGUpe2lmKChuPSh0PWU/dC50b0V4cG9uZW50aWFsKGUtMSk6dC50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoImUiKSk8MClyZXR1cm4gbnVsbDt2YXIgbixpPXQuc2xpY2UoMCxuKTtyZXR1cm5baS5sZW5ndGg+MT9pWzBdK2kuc2xpY2UoMik6aSwrdC5zbGljZShuKzEpXX1mdW5jdGlvbiByeSh0KXtyZXR1cm4odD1peShNYXRoLmFicyh0KSkpP3RbMV06TmFOfXZhciBveSxheT0vXig/OiguKT8oWzw+PV5dKSk/KFsrXC0oIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KH4pPyhbYS16JV0pPyQvaTtmdW5jdGlvbiBzeSh0KXtpZighKGU9YXkuZXhlYyh0KSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdDogIit0KTt2YXIgZTtyZXR1cm4gbmV3IGx5KHtmaWxsOmVbMV0sYWxpZ246ZVsyXSxzaWduOmVbM10sc3ltYm9sOmVbNF0semVybzplWzVdLHdpZHRoOmVbNl0sY29tbWE6ZVs3XSxwcmVjaXNpb246ZVs4XSYmZVs4XS5zbGljZSgxKSx0cmltOmVbOV0sdHlwZTplWzEwXX0pfWZ1bmN0aW9uIGx5KHQpe3RoaXMuZmlsbD12b2lkIDA9PT10LmZpbGw/IiAiOnQuZmlsbCsiIix0aGlzLmFsaWduPXZvaWQgMD09PXQuYWxpZ24/Ij4iOnQuYWxpZ24rIiIsdGhpcy5zaWduPXZvaWQgMD09PXQuc2lnbj8iLSI6dC5zaWduKyIiLHRoaXMuc3ltYm9sPXZvaWQgMD09PXQuc3ltYm9sPyIiOnQuc3ltYm9sKyIiLHRoaXMuemVybz0hIXQuemVybyx0aGlzLndpZHRoPXZvaWQgMD09PXQud2lkdGg/dm9pZCAwOit0LndpZHRoLHRoaXMuY29tbWE9ISF0LmNvbW1hLHRoaXMucHJlY2lzaW9uPXZvaWQgMD09PXQucHJlY2lzaW9uP3ZvaWQgMDordC5wcmVjaXNpb24sdGhpcy50cmltPSEhdC50cmltLHRoaXMudHlwZT12b2lkIDA9PT10LnR5cGU/IiI6dC50eXBlKyIifWZ1bmN0aW9uIGN5KHQsZSl7dmFyIG49aXkodCxlKTtpZighbilyZXR1cm4gdCsiIjt2YXIgaT1uWzBdLHI9blsxXTtyZXR1cm4gcjwwPyIwLiIrbmV3IEFycmF5KC1yKS5qb2luKCIwIikraTppLmxlbmd0aD5yKzE/aS5zbGljZSgwLHIrMSkrIi4iK2kuc2xpY2UocisxKTppK25ldyBBcnJheShyLWkubGVuZ3RoKzIpLmpvaW4oIjAiKX1zeS5wcm90b3R5cGU9bHkucHJvdG90eXBlLGx5LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbGwrdGhpcy5hbGlnbit0aGlzLnNpZ24rdGhpcy5zeW1ib2wrKHRoaXMuemVybz8iMCI6IiIpKyh2b2lkIDA9PT10aGlzLndpZHRoPyIiOk1hdGgubWF4KDEsMHx0aGlzLndpZHRoKSkrKHRoaXMuY29tbWE/IiwiOiIiKSsodm9pZCAwPT09dGhpcy5wcmVjaXNpb24/IiI6Ii4iK01hdGgubWF4KDAsMHx0aGlzLnByZWNpc2lvbikpKyh0aGlzLnRyaW0/In4iOiIiKSt0aGlzLnR5cGV9O3ZhciB1eT17IiUiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuKDEwMCp0KS50b0ZpeGVkKGUpfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDIpfSxjOmZ1bmN0aW9uKHQpe3JldHVybiB0KyIifSxkOmZ1bmN0aW9uIGh5KHQpe3JldHVybiBNYXRoLmFicyh0PU1hdGgucm91bmQodCkpPj0xZTIxP3QudG9Mb2NhbGVTdHJpbmcoImVuIikucmVwbGFjZSgvLC9nLCIiKTp0LnRvU3RyaW5nKDEwKX0sZTpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRvRXhwb25lbnRpYWwoZSl9LGY6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50b0ZpeGVkKGUpfSxnOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9QcmVjaXNpb24oZSl9LG86ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoOCl9LHA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gY3koMTAwKnQsZSl9LHI6Y3ksczpmdW5jdGlvbiBkeSh0LGUpe3ZhciBuPWl5KHQsZSk7aWYoIW4pcmV0dXJuIHQrIiI7dmFyIGk9blswXSxyPW5bMV0sbz1yLShveT0zKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihyLzMpKSkpKzEsYT1pLmxlbmd0aDtyZXR1cm4gbz09PWE/aTpvPmE/aStuZXcgQXJyYXkoby1hKzEpLmpvaW4oIjAiKTpvPjA/aS5zbGljZSgwLG8pKyIuIitpLnNsaWNlKG8pOiIwLiIrbmV3IEFycmF5KDEtbykuam9pbigiMCIpK2l5KHQsTWF0aC5tYXgoMCxlK28tMSkpWzBdfSxYOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSx4OmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KX19O2Z1bmN0aW9uIHB5KHQpe3JldHVybiB0fXZhciBmeSxteSxneSxfeT1BcnJheS5wcm90b3R5cGUubWFwLHl5PVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTtmdW5jdGlvbiB2eSh0KXt2YXIgZT12b2lkIDA9PT10Lmdyb3VwaW5nfHx2b2lkIDA9PT10LnRob3VzYW5kcz9weTooZnVuY3Rpb24gbih0LGUpe3JldHVybiBmdW5jdGlvbihuLGkpe2Zvcih2YXIgcj1uLmxlbmd0aCxvPVtdLGE9MCxzPXRbMF0sbD0wO3I+MCYmcz4wJiYobCtzKzE+aSYmKHM9TWF0aC5tYXgoMSxpLWwpKSxvLnB1c2gobi5zdWJzdHJpbmcoci09cyxyK3MpKSwhKChsKz1zKzEpPmkpKTspcz10W2E9KGErMSkldC5sZW5ndGhdO3JldHVybiBvLnJldmVyc2UoKS5qb2luKGUpfX0pKF95LmNhbGwodC5ncm91cGluZyxOdW1iZXIpLHQudGhvdXNhbmRzKyIiKSxpPXZvaWQgMD09PXQuY3VycmVuY3k/IiI6dC5jdXJyZW5jeVswXSsiIixyPXZvaWQgMD09PXQuY3VycmVuY3k/IiI6dC5jdXJyZW5jeVsxXSsiIixvPXZvaWQgMD09PXQuZGVjaW1hbD8iLiI6dC5kZWNpbWFsKyIiLGE9dm9pZCAwPT09dC5udW1lcmFscz9weTooZnVuY3Rpb24gcyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvWzAtOV0vZywoZnVuY3Rpb24oZSl7cmV0dXJuIHRbK2VdfSkpfX0pKF95LmNhbGwodC5udW1lcmFscyxTdHJpbmcpKSxsPXZvaWQgMD09PXQucGVyY2VudD8iJSI6dC5wZXJjZW50KyIiLGM9dm9pZCAwPT09dC5taW51cz8iLSI6dC5taW51cysiIix1PXZvaWQgMD09PXQubmFuPyJOYU4iOnQubmFuKyIiO2Z1bmN0aW9uIGgodCl7dmFyIG49KHQ9c3kodCkpLmZpbGwscz10LmFsaWduLGg9dC5zaWduLGQ9dC5zeW1ib2wscD10Lnplcm8sZj10LndpZHRoLG09dC5jb21tYSxnPXQucHJlY2lzaW9uLF89dC50cmltLHk9dC50eXBlOyJuIj09PXk/KG09ITAseT0iZyIpOnV5W3ldfHwodm9pZCAwPT09ZyYmKGc9MTIpLF89ITAseT0iZyIpLChwfHwiMCI9PT1uJiYiPSI9PT1zKSYmKHA9ITAsbj0iMCIscz0iPSIpO3ZhciB2PSIkIj09PWQ/aToiIyI9PT1kJiYvW2JveFhdLy50ZXN0KHkpPyIwIit5LnRvTG93ZXJDYXNlKCk6IiIsYj0iJCI9PT1kP3I6L1slcF0vLnRlc3QoeSk/bDoiIix4PXV5W3ldLHc9L1tkZWZncHJzJV0vLnRlc3QoeSk7ZnVuY3Rpb24gUyh0KXt2YXIgaSxyLGwsZD12LFM9YjtpZigiYyI9PT15KVM9eCh0KStTLHQ9IiI7ZWxzZXt2YXIgTT0odD0rdCk8MHx8MS90PDA7aWYodD1pc05hTih0KT91OngoTWF0aC5hYnModCksZyksXyYmKHQ9KGZ1bmN0aW9uIEUodCl7dDpmb3IodmFyIGUsbj10Lmxlbmd0aCxpPTEscj0tMTtpPG47KytpKXN3aXRjaCh0W2ldKXtjYXNlIi4iOnI9ZT1pO2JyZWFrO2Nhc2UiMCI6MD09PXImJihyPWkpLGU9aTticmVhaztkZWZhdWx0OmlmKCErdFtpXSlicmVhayB0O3I+MCYmKHI9MCl9cmV0dXJuIHI+MD90LnNsaWNlKDAscikrdC5zbGljZShlKzEpOnR9KSh0KSksTSYmMD09K3QmJiIrIiE9PWgmJihNPSExKSxkPShNPyIoIj09PWg/aDpjOiItIj09PWh8fCIoIj09PWg/IiI6aCkrZCxTPSgicyI9PT15P3l5Wzgrb3kvM106IiIpK1MrKE0mJiIoIj09PWg/IikiOiIiKSx3KWZvcihpPS0xLHI9dC5sZW5ndGg7KytpPHI7KWlmKDQ4PihsPXQuY2hhckNvZGVBdChpKSl8fGw+NTcpe1M9KDQ2PT09bD9vK3Quc2xpY2UoaSsxKTp0LnNsaWNlKGkpKStTLHQ9dC5zbGljZSgwLGkpO2JyZWFrfX1tJiYhcCYmKHQ9ZSh0LDEvMCkpO3ZhciBUPWQubGVuZ3RoK3QubGVuZ3RoK1MubGVuZ3RoLEM9VDxmP25ldyBBcnJheShmLVQrMSkuam9pbihuKToiIjtzd2l0Y2gobSYmcCYmKHQ9ZShDK3QsQy5sZW5ndGg/Zi1TLmxlbmd0aDoxLzApLEM9IiIpLHMpe2Nhc2UiPCI6dD1kK3QrUytDO2JyZWFrO2Nhc2UiPSI6dD1kK0MrdCtTO2JyZWFrO2Nhc2UiXiI6dD1DLnNsaWNlKDAsVD1DLmxlbmd0aD4+MSkrZCt0K1MrQy5zbGljZShUKTticmVhaztkZWZhdWx0OnQ9QytkK3QrU31yZXR1cm4gYSh0KX1yZXR1cm4gZz12b2lkIDA9PT1nPzY6L1tncHJzXS8udGVzdCh5KT9NYXRoLm1heCgxLE1hdGgubWluKDIxLGcpKTpNYXRoLm1heCgwLE1hdGgubWluKDIwLGcpKSxTLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHQrIiJ9LFN9cmV0dXJue2Zvcm1hdDpoLGZvcm1hdFByZWZpeDpmdW5jdGlvbiBkKHQsZSl7dmFyIG49aCgoKHQ9c3kodCkpLnR5cGU9ImYiLHQpKSxpPTMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKHJ5KGUpLzMpKSkscj1NYXRoLnBvdygxMCwtaSksbz15eVs4K2kvM107cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuKHIqdCkrb319fX1mdW5jdGlvbiBieSh0KXtyZXR1cm4gZnk9dnkodCksbXk9ZnkuZm9ybWF0LGd5PWZ5LmZvcm1hdFByZWZpeCxmeX1mdW5jdGlvbiB4eSh0KXtyZXR1cm4gTWF0aC5tYXgoMCwtcnkoTWF0aC5hYnModCkpKX1mdW5jdGlvbiB3eSh0LGUpe3JldHVybiBNYXRoLm1heCgwLDMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKHJ5KGUpLzMpKSktcnkoTWF0aC5hYnModCkpKX1mdW5jdGlvbiBTeSh0LGUpe3JldHVybiB0PU1hdGguYWJzKHQpLGU9TWF0aC5hYnMoZSktdCxNYXRoLm1heCgwLHJ5KGUpLXJ5KHQpKSsxfWZ1bmN0aW9uIE15KCl7cmV0dXJuIG5ldyBFeX1mdW5jdGlvbiBFeSgpe3RoaXMucmVzZXQoKX1ieSh7ZGVjaW1hbDoiLiIsdGhvdXNhbmRzOiIsIixncm91cGluZzpbM10sY3VycmVuY3k6WyIkIiwiIl0sbWludXM6Ii0ifSksRXkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpFeSxyZXNldDpmdW5jdGlvbigpe3RoaXMucz10aGlzLnQ9MH0sYWRkOmZ1bmN0aW9uKHQpe0N5KFR5LHQsdGhpcy50KSxDeSh0aGlzLFR5LnMsdGhpcy5zKSx0aGlzLnM/dGhpcy50Kz1UeS50OnRoaXMucz1UeS50fSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc319O3ZhciBUeT1uZXcgRXk7ZnVuY3Rpb24gQ3kodCxlLG4pe3ZhciBpPXQucz1lK24scj1pLWU7dC50PWUtKGktcikrKG4tcil9dmFyIEF5PTFlLTYsa3k9MWUtMTIsTHk9TWF0aC5QSSxQeT1MeS8yLE55PUx5LzQsSXk9MipMeSxSeT0xODAvTHksT3k9THkvMTgwLHp5PU1hdGguYWJzLER5PU1hdGguYXRhbixCeT1NYXRoLmF0YW4yLEh5PU1hdGguY29zLEZ5PU1hdGguY2VpbCxWeT1NYXRoLmV4cCxVeT1NYXRoLmxvZyxqeT1NYXRoLnBvdyxHeT1NYXRoLnNpbixXeT1NYXRoLnNpZ258fGZ1bmN0aW9uKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH0scXk9TWF0aC5zcXJ0LFl5PU1hdGgudGFuO2Z1bmN0aW9uIFh5KHQpe3JldHVybiB0PjE/MDp0PC0xP0x5Ok1hdGguYWNvcyh0KX1mdW5jdGlvbiAkeSh0KXtyZXR1cm4gdD4xP1B5OnQ8LTE/LVB5Ok1hdGguYXNpbih0KX1mdW5jdGlvbiBLeSh0KXtyZXR1cm4odD1HeSh0LzIpKSp0fWZ1bmN0aW9uIFp5KCl7fWZ1bmN0aW9uIEp5KHQsZSl7dCYmdHYuaGFzT3duUHJvcGVydHkodC50eXBlKSYmdHZbdC50eXBlXSh0LGUpfXZhciBReT17RmVhdHVyZTpmdW5jdGlvbih0LGUpe0p5KHQuZ2VvbWV0cnksZSl9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZmVhdHVyZXMsaT0tMSxyPW4ubGVuZ3RoOysraTxyOylKeShuW2ldLmdlb21ldHJ5LGUpfX0sdHY9e1NwaGVyZTpmdW5jdGlvbih0LGUpe2Uuc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKHQsZSl7ZS5wb2ludCgodD10LmNvb3JkaW5hdGVzKVswXSx0WzFdLHRbMl0pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuY29vcmRpbmF0ZXMsaT0tMSxyPW4ubGVuZ3RoOysraTxyOyllLnBvaW50KCh0PW5baV0pWzBdLHRbMV0sdFsyXSl9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxlKXtldih0LmNvb3JkaW5hdGVzLGUsMCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmNvb3JkaW5hdGVzLGk9LTEscj1uLmxlbmd0aDsrK2k8cjspZXYobltpXSxlLDApfSxQb2x5Z29uOmZ1bmN0aW9uKHQsZSl7bnYodC5jb29yZGluYXRlcyxlKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuY29vcmRpbmF0ZXMsaT0tMSxyPW4ubGVuZ3RoOysraTxyOyludihuW2ldLGUpfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5nZW9tZXRyaWVzLGk9LTEscj1uLmxlbmd0aDsrK2k8cjspSnkobltpXSxlKX19O2Z1bmN0aW9uIGV2KHQsZSxuKXt2YXIgaSxyPS0xLG89dC5sZW5ndGgtbjtmb3IoZS5saW5lU3RhcnQoKTsrK3I8bzspZS5wb2ludCgoaT10W3JdKVswXSxpWzFdLGlbMl0pO2UubGluZUVuZCgpfWZ1bmN0aW9uIG52KHQsZSl7dmFyIG49LTEsaT10Lmxlbmd0aDtmb3IoZS5wb2x5Z29uU3RhcnQoKTsrK248aTspZXYodFtuXSxlLDEpO2UucG9seWdvbkVuZCgpfWZ1bmN0aW9uIGl2KHQsZSl7dCYmUXkuaGFzT3duUHJvcGVydHkodC50eXBlKT9ReVt0LnR5cGVdKHQsZSk6SnkodCxlKX12YXIgcnYsb3YsYXYsc3YsbHYsY3Y9TXkoKSx1dj1NeSgpLGh2PXtwb2ludDpaeSxsaW5lU3RhcnQ6WnksbGluZUVuZDpaeSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtjdi5yZXNldCgpLGh2LmxpbmVTdGFydD1kdixodi5saW5lRW5kPXB2fSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9K2N2O3V2LmFkZCh0PDA/SXkrdDp0KSx0aGlzLmxpbmVTdGFydD10aGlzLmxpbmVFbmQ9dGhpcy5wb2ludD1aeX0sc3BoZXJlOmZ1bmN0aW9uKCl7dXYuYWRkKEl5KX19O2Z1bmN0aW9uIGR2KCl7aHYucG9pbnQ9ZnZ9ZnVuY3Rpb24gcHYoKXttdihydixvdil9ZnVuY3Rpb24gZnYodCxlKXtodi5wb2ludD1tdixydj10LG92PWUsYXY9dCo9T3ksc3Y9SHkoZT0oZSo9T3kpLzIrTnkpLGx2PUd5KGUpfWZ1bmN0aW9uIG12KHQsZSl7dmFyIG49KHQqPU95KS1hdixpPW4+PTA/MTotMSxyPWkqbixvPUh5KGU9KGUqPU95KS8yK055KSxhPUd5KGUpLHM9bHYqYSxsPXN2Km8rcypIeShyKSxjPXMqaSpHeShyKTtjdi5hZGQoQnkoYyxsKSksYXY9dCxzdj1vLGx2PWF9ZnVuY3Rpb24gZ3YodCl7cmV0dXJuW0J5KHRbMV0sdFswXSksJHkodFsyXSldfWZ1bmN0aW9uIF92KHQpe3ZhciBlPXRbMF0sbj10WzFdLGk9SHkobik7cmV0dXJuW2kqSHkoZSksaSpHeShlKSxHeShuKV19ZnVuY3Rpb24geXYodCxlKXtyZXR1cm4gdFswXSplWzBdK3RbMV0qZVsxXSt0WzJdKmVbMl19ZnVuY3Rpb24gdnYodCxlKXtyZXR1cm5bdFsxXSplWzJdLXRbMl0qZVsxXSx0WzJdKmVbMF0tdFswXSplWzJdLHRbMF0qZVsxXS10WzFdKmVbMF1dfWZ1bmN0aW9uIGJ2KHQsZSl7dFswXSs9ZVswXSx0WzFdKz1lWzFdLHRbMl0rPWVbMl19ZnVuY3Rpb24geHYodCxlKXtyZXR1cm5bdFswXSplLHRbMV0qZSx0WzJdKmVdfWZ1bmN0aW9uIHd2KHQpe3ZhciBlPXF5KHRbMF0qdFswXSt0WzFdKnRbMV0rdFsyXSp0WzJdKTt0WzBdLz1lLHRbMV0vPWUsdFsyXS89ZX12YXIgU3YsTXYsRXYsVHYsQ3YsQXYsa3YsTHYsUHYsTnYsSXYsUnYsT3YsenYsRHYsQnYsSHYsRnYsVnYsVXYsanYsR3YsV3YscXYsWXYsWHYsJHY9TXkoKSxLdj17cG9pbnQ6WnYsbGluZVN0YXJ0OlF2LGxpbmVFbmQ6dGIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7S3YucG9pbnQ9ZWIsS3YubGluZVN0YXJ0PW5iLEt2LmxpbmVFbmQ9aWIsJHYucmVzZXQoKSxodi5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2h2LnBvbHlnb25FbmQoKSxLdi5wb2ludD1adixLdi5saW5lU3RhcnQ9UXYsS3YubGluZUVuZD10YixjdjwwPyhTdj0tKEV2PTE4MCksTXY9LShUdj05MCkpOiR2PkF5P1R2PTkwOiR2PC0xZS02JiYoTXY9LTkwKSxOdlswXT1TdixOdlsxXT1Fdn0sc3BoZXJlOmZ1bmN0aW9uKCl7U3Y9LShFdj0xODApLE12PS0oVHY9OTApfX07ZnVuY3Rpb24gWnYodCxlKXtQdi5wdXNoKE52PVtTdj10LEV2PXRdKSxlPE12JiYoTXY9ZSksZT5UdiYmKFR2PWUpfWZ1bmN0aW9uIEp2KHQsZSl7dmFyIG49X3YoW3QqT3ksZSpPeV0pO2lmKEx2KXt2YXIgaT12dihMdixuKSxyPXZ2KFtpWzFdLC1pWzBdLDBdLGkpO3d2KHIpLHI9Z3Yocik7dmFyIG8sYT10LUN2LHM9YT4wPzE6LTEsbD1yWzBdKlJ5KnMsYz16eShhKT4xODA7Y14ocypDdjxsJiZsPHMqdCk/KG89clsxXSpSeSk+VHYmJihUdj1vKTpjXihzKkN2PChsPShsKzM2MCklMzYwLTE4MCkmJmw8cyp0KT8obz0tclsxXSpSeSk8TXYmJihNdj1vKTooZTxNdiYmKE12PWUpLGU+VHYmJihUdj1lKSksYz90PEN2P3JiKFN2LHQpPnJiKFN2LEV2KSYmKEV2PXQpOnJiKHQsRXYpPnJiKFN2LEV2KSYmKFN2PXQpOkV2Pj1Tdj8odDxTdiYmKFN2PXQpLHQ+RXYmJihFdj10KSk6dD5Ddj9yYihTdix0KT5yYihTdixFdikmJihFdj10KTpyYih0LEV2KT5yYihTdixFdikmJihTdj10KX1lbHNlIFB2LnB1c2goTnY9W1N2PXQsRXY9dF0pO2U8TXYmJihNdj1lKSxlPlR2JiYoVHY9ZSksTHY9bixDdj10fWZ1bmN0aW9uIFF2KCl7S3YucG9pbnQ9SnZ9ZnVuY3Rpb24gdGIoKXtOdlswXT1TdixOdlsxXT1FdixLdi5wb2ludD1adixMdj1udWxsfWZ1bmN0aW9uIGViKHQsZSl7aWYoTHYpe3ZhciBuPXQtQ3Y7JHYuYWRkKHp5KG4pPjE4MD9uKyhuPjA/MzYwOi0zNjApOm4pfWVsc2UgQXY9dCxrdj1lO2h2LnBvaW50KHQsZSksSnYodCxlKX1mdW5jdGlvbiBuYigpe2h2LmxpbmVTdGFydCgpfWZ1bmN0aW9uIGliKCl7ZWIoQXYsa3YpLGh2LmxpbmVFbmQoKSx6eSgkdik+QXkmJihTdj0tKEV2PTE4MCkpLE52WzBdPVN2LE52WzFdPUV2LEx2PW51bGx9ZnVuY3Rpb24gcmIodCxlKXtyZXR1cm4oZS09dCk8MD9lKzM2MDplfWZ1bmN0aW9uIG9iKHQsZSl7cmV0dXJuIHRbMF0tZVswXX1mdW5jdGlvbiBhYih0LGUpe3JldHVybiB0WzBdPD10WzFdP3RbMF08PWUmJmU8PXRbMV06ZTx0WzBdfHx0WzFdPGV9dmFyIHNiPXtzcGhlcmU6WnkscG9pbnQ6bGIsbGluZVN0YXJ0OnViLGxpbmVFbmQ6cGIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7c2IubGluZVN0YXJ0PWZiLHNiLmxpbmVFbmQ9bWJ9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtzYi5saW5lU3RhcnQ9dWIsc2IubGluZUVuZD1wYn19O2Z1bmN0aW9uIGxiKHQsZSl7dCo9T3k7dmFyIG49SHkoZSo9T3kpO2NiKG4qSHkodCksbipHeSh0KSxHeShlKSl9ZnVuY3Rpb24gY2IodCxlLG4peysrSXYsT3YrPSh0LU92KS9Jdix6dis9KGUtenYpL0l2LER2Kz0obi1EdikvSXZ9ZnVuY3Rpb24gdWIoKXtzYi5wb2ludD1oYn1mdW5jdGlvbiBoYih0LGUpe3QqPU95O3ZhciBuPUh5KGUqPU95KTtxdj1uKkh5KHQpLFl2PW4qR3kodCksWHY9R3koZSksc2IucG9pbnQ9ZGIsY2IocXYsWXYsWHYpfWZ1bmN0aW9uIGRiKHQsZSl7dCo9T3k7dmFyIG49SHkoZSo9T3kpLGk9bipIeSh0KSxyPW4qR3kodCksbz1HeShlKSxhPUJ5KHF5KChhPVl2Km8tWHYqcikqYSsoYT1YdippLXF2Km8pKmErKGE9cXYqci1ZdippKSphKSxxdippK1l2KnIrWHYqbyk7UnYrPWEsQnYrPWEqKHF2Kyhxdj1pKSksSHYrPWEqKFl2KyhZdj1yKSksRnYrPWEqKFh2KyhYdj1vKSksY2IocXYsWXYsWHYpfWZ1bmN0aW9uIHBiKCl7c2IucG9pbnQ9bGJ9ZnVuY3Rpb24gZmIoKXtzYi5wb2ludD1nYn1mdW5jdGlvbiBtYigpe19iKEd2LFd2KSxzYi5wb2ludD1sYn1mdW5jdGlvbiBnYih0LGUpe0d2PXQsV3Y9ZSx0Kj1PeSxlKj1PeSxzYi5wb2ludD1fYjt2YXIgbj1IeShlKTtxdj1uKkh5KHQpLFl2PW4qR3kodCksWHY9R3koZSksY2IocXYsWXYsWHYpfWZ1bmN0aW9uIF9iKHQsZSl7dCo9T3k7dmFyIG49SHkoZSo9T3kpLGk9bipIeSh0KSxyPW4qR3kodCksbz1HeShlKSxhPVl2Km8tWHYqcixzPVh2KmktcXYqbyxsPXF2KnItWXYqaSxjPXF5KGEqYStzKnMrbCpsKSx1PSR5KGMpLGg9YyYmLXUvYztWdis9aCphLFV2Kz1oKnMsanYrPWgqbCxSdis9dSxCdis9dSoocXYrKHF2PWkpKSxIdis9dSooWXYrKFl2PXIpKSxGdis9dSooWHYrKFh2PW8pKSxjYihxdixZdixYdil9ZnVuY3Rpb24geWIodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIHZiKHQsZSl7ZnVuY3Rpb24gbihuLGkpe3JldHVybiBuPXQobixpKSxlKG5bMF0sblsxXSl9cmV0dXJuIHQuaW52ZXJ0JiZlLmludmVydCYmKG4uaW52ZXJ0PWZ1bmN0aW9uKG4saSl7cmV0dXJuKG49ZS5pbnZlcnQobixpKSkmJnQuaW52ZXJ0KG5bMF0sblsxXSl9KSxufWZ1bmN0aW9uIGJiKHQsZSl7cmV0dXJuW3p5KHQpPkx5P3QrTWF0aC5yb3VuZCgtdC9JeSkqSXk6dCxlXX1mdW5jdGlvbiB4Yih0LGUsbil7cmV0dXJuKHQlPUl5KT9lfHxuP3ZiKFNiKHQpLE1iKGUsbikpOlNiKHQpOmV8fG4/TWIoZSxuKTpiYn1mdW5jdGlvbiB3Yih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtyZXR1cm5bKGUrPXQpPkx5P2UtSXk6ZTwtTHk/ZStJeTplLG5dfX1mdW5jdGlvbiBTYih0KXt2YXIgZT13Yih0KTtyZXR1cm4gZS5pbnZlcnQ9d2IoLXQpLGV9ZnVuY3Rpb24gTWIodCxlKXt2YXIgbj1IeSh0KSxpPUd5KHQpLHI9SHkoZSksbz1HeShlKTtmdW5jdGlvbiBhKHQsZSl7dmFyIGE9SHkoZSkscz1IeSh0KSphLGw9R3kodCkqYSxjPUd5KGUpLHU9YypuK3MqaTtyZXR1cm5bQnkobCpyLXUqbyxzKm4tYyppKSwkeSh1KnIrbCpvKV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIGE9SHkoZSkscz1IeSh0KSphLGw9R3kodCkqYSxjPUd5KGUpLHU9YypyLWwqbztyZXR1cm5bQnkobCpyK2MqbyxzKm4rdSppKSwkeSh1Km4tcyppKV19LGF9ZnVuY3Rpb24gRWIodCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4oZT10KGVbMF0qT3ksZVsxXSpPeSkpWzBdKj1SeSxlWzFdKj1SeSxlfXJldHVybiB0PXhiKHRbMF0qT3ksdFsxXSpPeSx0Lmxlbmd0aD4yP3RbMl0qT3k6MCksZS5pbnZlcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuKGU9dC5pbnZlcnQoZVswXSpPeSxlWzFdKk95KSlbMF0qPVJ5LGVbMV0qPVJ5LGV9LGV9ZnVuY3Rpb24gVGIodCxlLG4saSxyLG8pe2lmKG4pe3ZhciBhPUh5KGUpLHM9R3koZSksbD1pKm47bnVsbD09cj8ocj1lK2kqSXksbz1lLWwvMik6KHI9Q2IoYSxyKSxvPUNiKGEsbyksKGk+MD9yPG86cj5vKSYmKHIrPWkqSXkpKTtmb3IodmFyIGMsdT1yO2k+MD91Pm86dTxvO3UtPWwpYz1ndihbYSwtcypIeSh1KSwtcypHeSh1KV0pLHQucG9pbnQoY1swXSxjWzFdKX19ZnVuY3Rpb24gQ2IodCxlKXsoZT1fdihlKSlbMF0tPXQsd3YoZSk7dmFyIG49WHkoLWVbMV0pO3JldHVybigoLWVbMl08MD8tbjpuKStJeS1BeSklSXl9ZnVuY3Rpb24gQWIoKXt2YXIgdCxlPVtdO3JldHVybntwb2ludDpmdW5jdGlvbihlLG4saSl7dC5wdXNoKFtlLG4saV0pfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtlLnB1c2godD1bXSl9LGxpbmVFbmQ6WnkscmVqb2luOmZ1bmN0aW9uKCl7ZS5sZW5ndGg+MSYmZS5wdXNoKGUucG9wKCkuY29uY2F0KGUuc2hpZnQoKSkpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgbj1lO3JldHVybiBlPVtdLHQ9bnVsbCxufX19ZnVuY3Rpb24ga2IodCxlKXtyZXR1cm4genkodFswXS1lWzBdKTxBeSYmenkodFsxXS1lWzFdKTxBeX1mdW5jdGlvbiBMYih0LGUsbixpKXt0aGlzLng9dCx0aGlzLno9ZSx0aGlzLm89bix0aGlzLmU9aSx0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIFBiKHQsZSxuLGkscil7dmFyIG8sYSxzPVtdLGw9W107aWYodC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighKChlPXQubGVuZ3RoLTEpPD0wKSl7dmFyIGUsbixpPXRbMF0sYT10W2VdO2lmKGtiKGksYSkpe2lmKCFpWzJdJiYhYVsyXSl7Zm9yKHIubGluZVN0YXJ0KCksbz0wO288ZTsrK28pci5wb2ludCgoaT10W29dKVswXSxpWzFdKTtyZXR1cm4gdm9pZCByLmxpbmVFbmQoKX1hWzBdKz0yZS02fXMucHVzaChuPW5ldyBMYihpLHQsbnVsbCwhMCkpLGwucHVzaChuLm89bmV3IExiKGksbnVsbCxuLCExKSkscy5wdXNoKG49bmV3IExiKGEsdCxudWxsLCExKSksbC5wdXNoKG4ubz1uZXcgTGIoYSxudWxsLG4sITApKX19KSkscy5sZW5ndGgpe2ZvcihsLnNvcnQoZSksTmIocyksTmIobCksbz0wLGE9bC5sZW5ndGg7bzxhOysrbylsW29dLmU9bj0hbjtmb3IodmFyIGMsdSxoPXNbMF07Oyl7Zm9yKHZhciBkPWgscD0hMDtkLnY7KWlmKChkPWQubik9PT1oKXJldHVybjtjPWQueixyLmxpbmVTdGFydCgpO2Rve2lmKGQudj1kLm8udj0hMCxkLmUpe2lmKHApZm9yKG89MCxhPWMubGVuZ3RoO288YTsrK28pci5wb2ludCgodT1jW29dKVswXSx1WzFdKTtlbHNlIGkoZC54LGQubi54LDEscik7ZD1kLm59ZWxzZXtpZihwKWZvcihvPShjPWQucC56KS5sZW5ndGgtMTtvPj0wOy0tbylyLnBvaW50KCh1PWNbb10pWzBdLHVbMV0pO2Vsc2UgaShkLngsZC5wLngsLTEscik7ZD1kLnB9Yz0oZD1kLm8pLnoscD0hcH13aGlsZSghZC52KTtyLmxpbmVFbmQoKX19fWZ1bmN0aW9uIE5iKHQpe2lmKGU9dC5sZW5ndGgpe2Zvcih2YXIgZSxuLGk9MCxyPXRbMF07KytpPGU7KXIubj1uPXRbaV0sbi5wPXIscj1uO3Iubj1uPXRbMF0sbi5wPXJ9fWJiLmludmVydD1iYjt2YXIgSWI9TXkoKTtmdW5jdGlvbiBSYih0KXtyZXR1cm4genkodFswXSk8PUx5P3RbMF06V3kodFswXSkqKCh6eSh0WzBdKStMeSklSXktTHkpfWZ1bmN0aW9uIE9iKHQsZSl7dmFyIG49UmIoZSksaT1lWzFdLHI9R3koaSksbz1bR3kobiksLUh5KG4pLDBdLGE9MCxzPTA7SWIucmVzZXQoKSwxPT09cj9pPVB5K0F5Oi0xPT09ciYmKGk9LVB5LUF5KTtmb3IodmFyIGw9MCxjPXQubGVuZ3RoO2w8YzsrK2wpaWYoaD0odT10W2xdKS5sZW5ndGgpZm9yKHZhciB1LGgsZD11W2gtMV0scD1SYihkKSxmPWRbMV0vMitOeSxtPUd5KGYpLGc9SHkoZiksXz0wO188aDsrK18scD12LG09eCxnPXcsZD15KXt2YXIgeT11W19dLHY9UmIoeSksYj15WzFdLzIrTnkseD1HeShiKSx3PUh5KGIpLFM9di1wLE09Uz49MD8xOi0xLEU9TSpTLFQ9RT5MeSxDPW0qeDtpZihJYi5hZGQoQnkoQypNKkd5KEUpLGcqdytDKkh5KEUpKSksYSs9VD9TK00qSXk6UyxUXnA+PW5edj49bil7dmFyIEE9dnYoX3YoZCksX3YoeSkpO3d2KEEpO3ZhciBrPXZ2KG8sQSk7d3Yoayk7dmFyIEw9KFReUz49MD8tMToxKSokeShrWzJdKTsoaT5MfHxpPT09TCYmKEFbMF18fEFbMV0pKSYmKHMrPVReUz49MD8xOi0xKX19cmV0dXJuKGE8LTFlLTZ8fGE8QXkmJkliPC0xZS02KV4xJnN9ZnVuY3Rpb24gemIodCxlLG4saSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciBvLGEscyxsPWUociksYz1BYigpLHU9ZShjKSxoPSExLGQ9e3BvaW50OnAsbGluZVN0YXJ0Om0sbGluZUVuZDpnLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2QucG9pbnQ9XyxkLmxpbmVTdGFydD15LGQubGluZUVuZD12LGE9W10sbz1bXX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2QucG9pbnQ9cCxkLmxpbmVTdGFydD1tLGQubGluZUVuZD1nLGE9cWwoYSk7dmFyIHQ9T2IobyxpKTthLmxlbmd0aD8oaHx8KHIucG9seWdvblN0YXJ0KCksaD0hMCksUGIoYSxCYix0LG4scikpOnQmJihofHwoci5wb2x5Z29uU3RhcnQoKSxoPSEwKSxyLmxpbmVTdGFydCgpLG4obnVsbCxudWxsLDEsciksci5saW5lRW5kKCkpLGgmJihyLnBvbHlnb25FbmQoKSxoPSExKSxhPW89bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7ci5wb2x5Z29uU3RhcnQoKSxyLmxpbmVTdGFydCgpLG4obnVsbCxudWxsLDEsciksci5saW5lRW5kKCksci5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBwKGUsbil7dChlLG4pJiZyLnBvaW50KGUsbil9ZnVuY3Rpb24gZih0LGUpe2wucG9pbnQodCxlKX1mdW5jdGlvbiBtKCl7ZC5wb2ludD1mLGwubGluZVN0YXJ0KCl9ZnVuY3Rpb24gZygpe2QucG9pbnQ9cCxsLmxpbmVFbmQoKX1mdW5jdGlvbiBfKHQsZSl7cy5wdXNoKFt0LGVdKSx1LnBvaW50KHQsZSl9ZnVuY3Rpb24geSgpe3UubGluZVN0YXJ0KCkscz1bXX1mdW5jdGlvbiB2KCl7XyhzWzBdWzBdLHNbMF1bMV0pLHUubGluZUVuZCgpO3ZhciB0LGUsbixpLGw9dS5jbGVhbigpLGQ9Yy5yZXN1bHQoKSxwPWQubGVuZ3RoO2lmKHMucG9wKCksby5wdXNoKHMpLHM9bnVsbCxwKWlmKDEmbCl7aWYoKGU9KG49ZFswXSkubGVuZ3RoLTEpPjApe2ZvcihofHwoci5wb2x5Z29uU3RhcnQoKSxoPSEwKSxyLmxpbmVTdGFydCgpLHQ9MDt0PGU7Kyt0KXIucG9pbnQoKGk9blt0XSlbMF0saVsxXSk7ci5saW5lRW5kKCl9fWVsc2UgcD4xJiYyJmwmJmQucHVzaChkLnBvcCgpLmNvbmNhdChkLnNoaWZ0KCkpKSxhLnB1c2goZC5maWx0ZXIoRGIpKX1yZXR1cm4gZH19ZnVuY3Rpb24gRGIodCl7cmV0dXJuIHQubGVuZ3RoPjF9ZnVuY3Rpb24gQmIodCxlKXtyZXR1cm4oKHQ9dC54KVswXTwwP3RbMV0tUHktQXk6UHktdFsxXSktKChlPWUueClbMF08MD9lWzFdLVB5LUF5OlB5LWVbMV0pfXZhciBIYj16YigoZnVuY3Rpb24oKXtyZXR1cm4hMH0pLChmdW5jdGlvbiBGYih0KXt2YXIgZSxuPU5hTixpPU5hTixyPU5hTjtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5saW5lU3RhcnQoKSxlPTF9LHBvaW50OmZ1bmN0aW9uKG8sYSl7dmFyIHM9bz4wP0x5Oi1MeSxsPXp5KG8tbik7enkobC1MeSk8QXk/KHQucG9pbnQobixpPShpK2EpLzI+MD9QeTotUHkpLHQucG9pbnQocixpKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQocyxpKSx0LnBvaW50KG8saSksZT0wKTpyIT09cyYmbD49THkmJih6eShuLXIpPEF5JiYobi09cipBeSksenkoby1zKTxBeSYmKG8tPXMqQXkpLGk9KGZ1bmN0aW9uIGModCxlLG4saSl7dmFyIHIsbyxhPUd5KHQtbik7cmV0dXJuIHp5KGEpPkF5P0R5KChHeShlKSoobz1IeShpKSkqR3kobiktR3koaSkqKHI9SHkoZSkpKkd5KHQpKS8ocipvKmEpKTooZStpKS8yfSkobixpLG8sYSksdC5wb2ludChyLGkpLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludChzLGkpLGU9MCksdC5wb2ludChuPW8saT1hKSxyPXN9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0LmxpbmVFbmQoKSxuPWk9TmFOfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiAyLWV9fX0pLChmdW5jdGlvbiBWYih0LGUsbixpKXt2YXIgcjtpZihudWxsPT10KWkucG9pbnQoLUx5LHI9bipQeSksaS5wb2ludCgwLHIpLGkucG9pbnQoTHksciksaS5wb2ludChMeSwwKSxpLnBvaW50KEx5LC1yKSxpLnBvaW50KDAsLXIpLGkucG9pbnQoLUx5LC1yKSxpLnBvaW50KC1MeSwwKSxpLnBvaW50KC1MeSxyKTtlbHNlIGlmKHp5KHRbMF0tZVswXSk+QXkpe3ZhciBvPXRbMF08ZVswXT9MeTotTHk7aS5wb2ludCgtbyxyPW4qby8yKSxpLnBvaW50KDAsciksaS5wb2ludChvLHIpfWVsc2UgaS5wb2ludChlWzBdLGVbMV0pfSksWy1MeSwtUHldKTtmdW5jdGlvbiBVYih0KXt2YXIgZT1IeSh0KSxuPTYqT3ksaT1lPjAscj16eShlKT5BeTtmdW5jdGlvbiBvKHQsbil7cmV0dXJuIEh5KHQpKkh5KG4pPmV9ZnVuY3Rpb24gYSh0LG4saSl7dmFyIHI9WzEsMCwwXSxvPXZ2KF92KHQpLF92KG4pKSxhPXl2KG8sbykscz1vWzBdLGw9YS1zKnM7aWYoIWwpcmV0dXJuIWkmJnQ7dmFyIGM9ZSphL2wsdT0tZSpzL2wsaD12dihyLG8pLGQ9eHYocixjKTtidihkLHh2KG8sdSkpO3ZhciBwPWgsZj15dihkLHApLG09eXYocCxwKSxnPWYqZi1tKih5dihkLGQpLTEpO2lmKCEoZzwwKSl7dmFyIF89cXkoZykseT14dihwLCgtZi1fKS9tKTtpZihidih5LGQpLHk9Z3YoeSksIWkpcmV0dXJuIHk7dmFyIHYsYj10WzBdLHg9blswXSx3PXRbMV0sUz1uWzFdO3g8YiYmKHY9YixiPXgseD12KTt2YXIgTT14LWIsRT16eShNLUx5KTxBeTtpZighRSYmUzx3JiYodj13LHc9UyxTPXYpLEV8fE08QXk/RT93K1M+MF55WzFdPCh6eSh5WzBdLWIpPEF5P3c6Uyk6dzw9eVsxXSYmeVsxXTw9UzpNPkx5XihiPD15WzBdJiZ5WzBdPD14KSl7dmFyIFQ9eHYocCwoLWYrXykvbSk7cmV0dXJuIGJ2KFQsZCksW3ksZ3YoVCldfX19ZnVuY3Rpb24gcyhlLG4pe3ZhciByPWk/dDpMeS10LG89MDtyZXR1cm4gZTwtcj9vfD0xOmU+ciYmKG98PTIpLG48LXI/b3w9NDpuPnImJihvfD04KSxvfXJldHVybiB6YihvLChmdW5jdGlvbiBsKHQpe3ZhciBlLG4sbCxjLHU7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2M9bD0hMSx1PTF9LHBvaW50OmZ1bmN0aW9uKGgsZCl7dmFyIHAsZj1baCxkXSxtPW8oaCxkKSxnPWk/bT8wOnMoaCxkKTptP3MoaCsoaDwwP0x5Oi1MeSksZCk6MDtpZighZSYmKGM9bD1tKSYmdC5saW5lU3RhcnQoKSxtIT09bCYmKCEocD1hKGUsZikpfHxrYihlLHApfHxrYihmLHApKSYmKGZbMl09MSksbSE9PWwpdT0wLG0/KHQubGluZVN0YXJ0KCkscD1hKGYsZSksdC5wb2ludChwWzBdLHBbMV0pKToocD1hKGUsZiksdC5wb2ludChwWzBdLHBbMV0sMiksdC5saW5lRW5kKCkpLGU9cDtlbHNlIGlmKHImJmUmJmlebSl7dmFyIF87ZyZufHwhKF89YShmLGUsITApKXx8KHU9MCxpPyh0LmxpbmVTdGFydCgpLHQucG9pbnQoX1swXVswXSxfWzBdWzFdKSx0LnBvaW50KF9bMV1bMF0sX1sxXVsxXSksdC5saW5lRW5kKCkpOih0LnBvaW50KF9bMV1bMF0sX1sxXVsxXSksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KF9bMF1bMF0sX1swXVsxXSwzKSkpfSFtfHxlJiZrYihlLGYpfHx0LnBvaW50KGZbMF0sZlsxXSksZT1mLGw9bSxuPWd9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtsJiZ0LmxpbmVFbmQoKSxlPW51bGx9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIHV8KGMmJmwpPDwxfX19KSwoZnVuY3Rpb24gYyhlLGkscixvKXtUYihvLHQsbixyLGUsaSl9KSxpP1swLC10XTpbLUx5LHQtTHldKX12YXIgamI9MWU5LEdiPS1qYjtmdW5jdGlvbiBXYih0LGUsbixpKXtmdW5jdGlvbiByKHIsbyl7cmV0dXJuIHQ8PXImJnI8PW4mJmU8PW8mJm88PWl9ZnVuY3Rpb24gbyhyLG8scyxjKXt2YXIgdT0wLGg9MDtpZihudWxsPT1yfHwodT1hKHIscykpIT09KGg9YShvLHMpKXx8bChyLG8pPDBecz4wKWRve2MucG9pbnQoMD09PXV8fDM9PT11P3Q6bix1PjE/aTplKX13aGlsZSgodT0odStzKzQpJTQpIT09aCk7ZWxzZSBjLnBvaW50KG9bMF0sb1sxXSl9ZnVuY3Rpb24gYShpLHIpe3JldHVybiB6eShpWzBdLXQpPEF5P3I+MD8wOjM6enkoaVswXS1uKTxBeT9yPjA/MjoxOnp5KGlbMV0tZSk8QXk/cj4wPzE6MDpyPjA/MzoyfWZ1bmN0aW9uIHModCxlKXtyZXR1cm4gbCh0LngsZS54KX1mdW5jdGlvbiBsKHQsZSl7dmFyIG49YSh0LDEpLGk9YShlLDEpO3JldHVybiBuIT09aT9uLWk6MD09PW4/ZVsxXS10WzFdOjE9PT1uP3RbMF0tZVswXToyPT09bj90WzFdLWVbMV06ZVswXS10WzBdfXJldHVybiBmdW5jdGlvbihhKXt2YXIgbCxjLHUsaCxkLHAsZixtLGcsXyx5LHY9YSxiPUFiKCkseD17cG9pbnQ6VCxsaW5lU3RhcnQ6ZnVuY3Rpb24gdygpe3gucG9pbnQ9QyxjJiZjLnB1c2godT1bXSksXz0hMCxnPSExLGY9bT1OYU59LGxpbmVFbmQ6ZnVuY3Rpb24gUygpe2wmJihDKGgsZCkscCYmZyYmYi5yZWpvaW4oKSxsLnB1c2goYi5yZXN1bHQoKSkpLHgucG9pbnQ9VCxnJiZ2LmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uIE0oKXt2PWIsbD1bXSxjPVtdLHk9ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24gRSgpe3ZhciBlPShmdW5jdGlvbiBuKCl7Zm9yKHZhciBlPTAsbj0wLHI9Yy5sZW5ndGg7bjxyOysrbilmb3IodmFyIG8sYSxzPWNbbl0sbD0xLHU9cy5sZW5ndGgsaD1zWzBdLGQ9aFswXSxwPWhbMV07bDx1OysrbClvPWQsYT1wLGQ9KGg9c1tsXSlbMF0scD1oWzFdLGE8PWk/cD5pJiYoZC1vKSooaS1hKT4ocC1hKSoodC1vKSYmKytlOnA8PWkmJihkLW8pKihpLWEpPChwLWEpKih0LW8pJiYtLWU7cmV0dXJuIGV9KSgpLHI9eSYmZSxoPShsPXFsKGwpKS5sZW5ndGg7KHJ8fGgpJiYoYS5wb2x5Z29uU3RhcnQoKSxyJiYoYS5saW5lU3RhcnQoKSxvKG51bGwsbnVsbCwxLGEpLGEubGluZUVuZCgpKSxoJiZQYihsLHMsZSxvLGEpLGEucG9seWdvbkVuZCgpKSx2PWEsbD1jPXU9bnVsbH19O2Z1bmN0aW9uIFQodCxlKXtyKHQsZSkmJnYucG9pbnQodCxlKX1mdW5jdGlvbiBDKG8sYSl7dmFyIHM9cihvLGEpO2lmKGMmJnUucHVzaChbbyxhXSksXyloPW8sZD1hLHA9cyxfPSExLHMmJih2LmxpbmVTdGFydCgpLHYucG9pbnQobyxhKSk7ZWxzZSBpZihzJiZnKXYucG9pbnQobyxhKTtlbHNle3ZhciBsPVtmPU1hdGgubWF4KEdiLE1hdGgubWluKGpiLGYpKSxtPU1hdGgubWF4KEdiLE1hdGgubWluKGpiLG0pKV0sYj1bbz1NYXRoLm1heChHYixNYXRoLm1pbihqYixvKSksYT1NYXRoLm1heChHYixNYXRoLm1pbihqYixhKSldOyEoZnVuY3Rpb24geCh0LGUsbixpLHIsbyl7dmFyIGEscz10WzBdLGw9dFsxXSxjPTAsdT0xLGg9ZVswXS1zLGQ9ZVsxXS1sO2lmKGE9bi1zLGh8fCEoYT4wKSl7aWYoYS89aCxoPDApe2lmKGE8YylyZXR1cm47YTx1JiYodT1hKX1lbHNlIGlmKGg+MCl7aWYoYT51KXJldHVybjthPmMmJihjPWEpfWlmKGE9ci1zLGh8fCEoYTwwKSl7aWYoYS89aCxoPDApe2lmKGE+dSlyZXR1cm47YT5jJiYoYz1hKX1lbHNlIGlmKGg+MCl7aWYoYTxjKXJldHVybjthPHUmJih1PWEpfWlmKGE9aS1sLGR8fCEoYT4wKSl7aWYoYS89ZCxkPDApe2lmKGE8YylyZXR1cm47YTx1JiYodT1hKX1lbHNlIGlmKGQ+MCl7aWYoYT51KXJldHVybjthPmMmJihjPWEpfWlmKGE9by1sLGR8fCEoYTwwKSl7aWYoYS89ZCxkPDApe2lmKGE+dSlyZXR1cm47YT5jJiYoYz1hKX1lbHNlIGlmKGQ+MCl7aWYoYTxjKXJldHVybjthPHUmJih1PWEpfXJldHVybiBjPjAmJih0WzBdPXMrYypoLHRbMV09bCtjKmQpLHU8MSYmKGVbMF09cyt1KmgsZVsxXT1sK3UqZCksITB9fX19fSkobCxiLHQsZSxuLGkpP3MmJih2LmxpbmVTdGFydCgpLHYucG9pbnQobyxhKSx5PSExKTooZ3x8KHYubGluZVN0YXJ0KCksdi5wb2ludChsWzBdLGxbMV0pKSx2LnBvaW50KGJbMF0sYlsxXSksc3x8di5saW5lRW5kKCkseT0hMSl9Zj1vLG09YSxnPXN9cmV0dXJuIHh9fXZhciBxYixZYixYYiwkYj1NeSgpLEtiPXtzcGhlcmU6WnkscG9pbnQ6WnksbGluZVN0YXJ0OmZ1bmN0aW9uIFpiKCl7S2IucG9pbnQ9UWIsS2IubGluZUVuZD1KYn0sbGluZUVuZDpaeSxwb2x5Z29uU3RhcnQ6WnkscG9seWdvbkVuZDpaeX07ZnVuY3Rpb24gSmIoKXtLYi5wb2ludD1LYi5saW5lRW5kPVp5fWZ1bmN0aW9uIFFiKHQsZSl7cWI9dCo9T3ksWWI9R3koZSo9T3kpLFhiPUh5KGUpLEtiLnBvaW50PXR4fWZ1bmN0aW9uIHR4KHQsZSl7dCo9T3k7dmFyIG49R3koZSo9T3kpLGk9SHkoZSkscj16eSh0LXFiKSxvPUh5KHIpLGE9aSpHeShyKSxzPVhiKm4tWWIqaSpvLGw9WWIqbitYYippKm87JGIuYWRkKEJ5KHF5KGEqYStzKnMpLGwpKSxxYj10LFliPW4sWGI9aX1mdW5jdGlvbiBleCh0KXtyZXR1cm4gJGIucmVzZXQoKSxpdih0LEtiKSwrJGJ9dmFyIG54PVtudWxsLG51bGxdLGl4PXt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpueH07ZnVuY3Rpb24gcngodCxlKXtyZXR1cm4gbnhbMF09dCxueFsxXT1lLGV4KGl4KX12YXIgb3g9e0ZlYXR1cmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gc3godC5nZW9tZXRyeSxlKX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5mZWF0dXJlcyxpPS0xLHI9bi5sZW5ndGg7KytpPHI7KWlmKHN4KG5baV0uZ2VvbWV0cnksZSkpcmV0dXJuITA7cmV0dXJuITF9fSxheD17U3BoZXJlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBvaW50OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGx4KHQuY29vcmRpbmF0ZXMsZSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5jb29yZGluYXRlcyxpPS0xLHI9bi5sZW5ndGg7KytpPHI7KWlmKGx4KG5baV0sZSkpcmV0dXJuITA7cmV0dXJuITF9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxlKXtyZXR1cm4gY3godC5jb29yZGluYXRlcyxlKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuY29vcmRpbmF0ZXMsaT0tMSxyPW4ubGVuZ3RoOysraTxyOylpZihjeChuW2ldLGUpKXJldHVybiEwO3JldHVybiExfSxQb2x5Z29uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHV4KHQuY29vcmRpbmF0ZXMsZSl9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmNvb3JkaW5hdGVzLGk9LTEscj1uLmxlbmd0aDsrK2k8cjspaWYodXgobltpXSxlKSlyZXR1cm4hMDtyZXR1cm4hMX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZ2VvbWV0cmllcyxpPS0xLHI9bi5sZW5ndGg7KytpPHI7KWlmKHN4KG5baV0sZSkpcmV0dXJuITA7cmV0dXJuITF9fTtmdW5jdGlvbiBzeCh0LGUpe3JldHVybiEoIXR8fCFheC5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpKSYmYXhbdC50eXBlXSh0LGUpfWZ1bmN0aW9uIGx4KHQsZSl7cmV0dXJuIDA9PT1yeCh0LGUpfWZ1bmN0aW9uIGN4KHQsZSl7Zm9yKHZhciBuLGkscixvPTAsYT10Lmxlbmd0aDtvPGE7bysrKXtpZigwPT09KGk9cngodFtvXSxlKSkpcmV0dXJuITA7aWYobz4wJiYocj1yeCh0W29dLHRbby0xXSkpPjAmJm48PXImJmk8PXImJihuK2ktcikqKDEtTWF0aC5wb3coKG4taSkvciwyKSk8a3kqcilyZXR1cm4hMDtuPWl9cmV0dXJuITF9ZnVuY3Rpb24gdXgodCxlKXtyZXR1cm4hIU9iKHQubWFwKGh4KSxkeChlKSl9ZnVuY3Rpb24gaHgodCl7cmV0dXJuKHQ9dC5tYXAoZHgpKS5wb3AoKSx0fWZ1bmN0aW9uIGR4KHQpe3JldHVyblt0WzBdKk95LHRbMV0qT3ldfWZ1bmN0aW9uIHB4KHQsZSxuKXt2YXIgaT16bCh0LGUtQXksbikuY29uY2F0KGUpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVyblt0LGVdfSkpfX1mdW5jdGlvbiBmeCh0LGUsbil7dmFyIGk9emwodCxlLUF5LG4pLmNvbmNhdChlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGkubWFwKChmdW5jdGlvbihlKXtyZXR1cm5bZSx0XX0pKX19ZnVuY3Rpb24gbXgoKXt2YXIgdCxlLG4saSxyLG8sYSxzLGwsYyx1LGgsZD0xMCxwPWQsZj05MCxtPTM2MCxnPTIuNTtmdW5jdGlvbiBfKCl7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6eSgpfX1mdW5jdGlvbiB5KCl7cmV0dXJuIHpsKEZ5KGkvZikqZixuLGYpLm1hcCh1KS5jb25jYXQoemwoRnkocy9tKSptLGEsbSkubWFwKGgpKS5jb25jYXQoemwoRnkoZS9kKSpkLHQsZCkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4genkodCVmKT5BeX0pKS5tYXAobCkpLmNvbmNhdCh6bChGeShvL3ApKnAscixwKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB6eSh0JW0pPkF5fSkpLm1hcChjKSl9cmV0dXJuIF8ubGluZXM9ZnVuY3Rpb24oKXtyZXR1cm4geSgpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnR9fSkpfSxfLm91dGxpbmU9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3UoaSkuY29uY2F0KGgoYSkuc2xpY2UoMSksdShuKS5yZXZlcnNlKCkuc2xpY2UoMSksaChzKS5yZXZlcnNlKCkuc2xpY2UoMSkpXX19LF8uZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP18uZXh0ZW50TWFqb3IodCkuZXh0ZW50TWlub3IodCk6Xy5leHRlbnRNaW5vcigpfSxfLmV4dGVudE1ham9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0WzBdWzFdLGE9K3RbMV1bMV0sKGk9K3RbMF1bMF0pPihuPSt0WzFdWzBdKSYmKHQ9aSxpPW4sbj10KSxzPmEmJih0PXMscz1hLGE9dCksXy5wcmVjaXNpb24oZykpOltbaSxzXSxbbixhXV19LF8uZXh0ZW50TWlub3I9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K25bMF1bMV0scj0rblsxXVsxXSwoZT0rblswXVswXSk+KHQ9K25bMV1bMF0pJiYobj1lLGU9dCx0PW4pLG8+ciYmKG49byxvPXIscj1uKSxfLnByZWNpc2lvbihnKSk6W1tlLG9dLFt0LHJdXX0sXy5zdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP18uc3RlcE1ham9yKHQpLnN0ZXBNaW5vcih0KTpfLnN0ZXBNaW5vcigpfSxfLnN0ZXBNYWpvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0rdFswXSxtPSt0WzFdLF8pOltmLG1dfSxfLnN0ZXBNaW5vcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD0rdFswXSxwPSt0WzFdLF8pOltkLHBdfSxfLnByZWNpc2lvbj1mdW5jdGlvbihkKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz0rZCxsPXB4KG8sciw5MCksYz1meChlLHQsZyksdT1weChzLGEsOTApLGg9ZngoaSxuLGcpLF8pOmd9LF8uZXh0ZW50TWFqb3IoW1stMTgwLC04OS45OTk5OTldLFsxODAsODkuOTk5OTk5XV0pLmV4dGVudE1pbm9yKFtbLTE4MCwtODAuMDAwMDAxXSxbMTgwLDgwLjAwMDAwMV1dKX1mdW5jdGlvbiBneCh0KXtyZXR1cm4gdH12YXIgX3gseXgsdngsYngseHg9TXkoKSx3eD1NeSgpLFN4PXtwb2ludDpaeSxsaW5lU3RhcnQ6WnksbGluZUVuZDpaeSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtTeC5saW5lU3RhcnQ9TXgsU3gubGluZUVuZD1DeH0scG9seWdvbkVuZDpmdW5jdGlvbigpe1N4LmxpbmVTdGFydD1TeC5saW5lRW5kPVN4LnBvaW50PVp5LHh4LmFkZCh6eSh3eCkpLHd4LnJlc2V0KCl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PXh4LzI7cmV0dXJuIHh4LnJlc2V0KCksdH19O2Z1bmN0aW9uIE14KCl7U3gucG9pbnQ9RXh9ZnVuY3Rpb24gRXgodCxlKXtTeC5wb2ludD1UeCxfeD12eD10LHl4PWJ4PWV9ZnVuY3Rpb24gVHgodCxlKXt3eC5hZGQoYngqdC12eCplKSx2eD10LGJ4PWV9ZnVuY3Rpb24gQ3goKXtUeChfeCx5eCl9dmFyIEF4LGt4LEx4LFB4LE54PVN4LEl4PTEvMCxSeD1JeCxPeD0tSXgseng9T3gsRHg9e3BvaW50OmZ1bmN0aW9uIEJ4KHQsZSl7dDxJeCYmKEl4PXQpLHQ+T3gmJihPeD10KSxlPFJ4JiYoUng9ZSksZT56eCYmKHp4PWUpfSxsaW5lU3RhcnQ6WnksbGluZUVuZDpaeSxwb2x5Z29uU3RhcnQ6WnkscG9seWdvbkVuZDpaeSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD1bW0l4LFJ4XSxbT3gsenhdXTtyZXR1cm4gT3g9eng9LShSeD1JeD0xLzApLHR9fSxIeD0wLEZ4PTAsVng9MCxVeD0wLGp4PTAsR3g9MCxXeD0wLHF4PTAsWXg9MCxYeD17cG9pbnQ6JHgsbGluZVN0YXJ0Okt4LGxpbmVFbmQ6UXgscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7WHgubGluZVN0YXJ0PXR3LFh4LmxpbmVFbmQ9ZXd9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtYeC5wb2ludD0keCxYeC5saW5lU3RhcnQ9S3gsWHgubGluZUVuZD1ReH0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9WXg/W1d4L1l4LHF4L1l4XTpHeD9bVXgvR3gsangvR3hdOlZ4P1tIeC9WeCxGeC9WeF06W05hTixOYU5dO3JldHVybiBIeD1GeD1WeD1VeD1qeD1HeD1XeD1xeD1ZeD0wLHR9fTtmdW5jdGlvbiAkeCh0LGUpe0h4Kz10LEZ4Kz1lLCsrVnh9ZnVuY3Rpb24gS3goKXtYeC5wb2ludD1aeH1mdW5jdGlvbiBaeCh0LGUpe1h4LnBvaW50PUp4LCR4KEx4PXQsUHg9ZSl9ZnVuY3Rpb24gSngodCxlKXt2YXIgbj10LUx4LGk9ZS1QeCxyPXF5KG4qbitpKmkpO1V4Kz1yKihMeCt0KS8yLGp4Kz1yKihQeCtlKS8yLEd4Kz1yLCR4KEx4PXQsUHg9ZSl9ZnVuY3Rpb24gUXgoKXtYeC5wb2ludD0keH1mdW5jdGlvbiB0dygpe1h4LnBvaW50PW53fWZ1bmN0aW9uIGV3KCl7aXcoQXgsa3gpfWZ1bmN0aW9uIG53KHQsZSl7WHgucG9pbnQ9aXcsJHgoQXg9THg9dCxreD1QeD1lKX1mdW5jdGlvbiBpdyh0LGUpe3ZhciBuPXQtTHgsaT1lLVB4LHI9cXkobipuK2kqaSk7VXgrPXIqKEx4K3QpLzIsangrPXIqKFB4K2UpLzIsR3grPXIsV3grPShyPVB4KnQtTHgqZSkqKEx4K3QpLHF4Kz1yKihQeCtlKSxZeCs9MypyLCR4KEx4PXQsUHg9ZSl9dmFyIHJ3PVh4O2Z1bmN0aW9uIG93KHQpe3RoaXMuX2NvbnRleHQ9dH1vdy5wcm90b3R5cGU9e19yYWRpdXM6NC41LHBvaW50UmFkaXVzOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yYWRpdXM9dCx0aGlzfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpezA9PT10aGlzLl9saW5lJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX3BvaW50PU5hTn0scG9pbnQ6ZnVuY3Rpb24odCxlKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX2NvbnRleHQubGluZVRvKHQsZSk7YnJlYWs7ZGVmYXVsdDp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0K3RoaXMuX3JhZGl1cyxlKSx0aGlzLl9jb250ZXh0LmFyYyh0LGUsdGhpcy5fcmFkaXVzLDAsSXkpfX0scmVzdWx0Olp5fTt2YXIgYXcsc3csbHcsY3csdXcsaHc9TXkoKSxkdz17cG9pbnQ6WnksbGluZVN0YXJ0OmZ1bmN0aW9uKCl7ZHcucG9pbnQ9cHd9LGxpbmVFbmQ6ZnVuY3Rpb24oKXthdyYmZncoc3csbHcpLGR3LnBvaW50PVp5fSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXthdz0hMH0scG9seWdvbkVuZDpmdW5jdGlvbigpe2F3PW51bGx9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PStodztyZXR1cm4gaHcucmVzZXQoKSx0fX07ZnVuY3Rpb24gcHcodCxlKXtkdy5wb2ludD1mdyxzdz1jdz10LGx3PXV3PWV9ZnVuY3Rpb24gZncodCxlKXtody5hZGQocXkoKGN3LT10KSpjdysodXctPWUpKnV3KSksY3c9dCx1dz1lfXZhciBtdz1kdztmdW5jdGlvbiBndygpe3RoaXMuX3N0cmluZz1bXX1mdW5jdGlvbiBfdyh0KXtyZXR1cm4ibTAsIit0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKy0yKnQrImEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrMip0KyJ6In1mdW5jdGlvbiB5dyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49bmV3IHZ3O2Zvcih2YXIgaSBpbiB0KW5baV09dFtpXTtyZXR1cm4gbi5zdHJlYW09ZSxufX1mdW5jdGlvbiB2dygpe31mdW5jdGlvbiBidyh0LGUsbil7dmFyIGk9dC5jbGlwRXh0ZW50JiZ0LmNsaXBFeHRlbnQoKTtyZXR1cm4gdC5zY2FsZSgxNTApLnRyYW5zbGF0ZShbMCwwXSksbnVsbCE9aSYmdC5jbGlwRXh0ZW50KG51bGwpLGl2KG4sdC5zdHJlYW0oRHgpKSxlKER4LnJlc3VsdCgpKSxudWxsIT1pJiZ0LmNsaXBFeHRlbnQoaSksdH1mdW5jdGlvbiB4dyh0LGUsbil7cmV0dXJuIGJ3KHQsKGZ1bmN0aW9uKG4pe3ZhciBpPWVbMV1bMF0tZVswXVswXSxyPWVbMV1bMV0tZVswXVsxXSxvPU1hdGgubWluKGkvKG5bMV1bMF0tblswXVswXSksci8oblsxXVsxXS1uWzBdWzFdKSksYT0rZVswXVswXSsoaS1vKihuWzFdWzBdK25bMF1bMF0pKS8yLHM9K2VbMF1bMV0rKHItbyooblsxXVsxXStuWzBdWzFdKSkvMjt0LnNjYWxlKDE1MCpvKS50cmFuc2xhdGUoW2Esc10pfSksbil9ZnVuY3Rpb24gd3codCxlLG4pe3JldHVybiB4dyh0LFtbMCwwXSxlXSxuKX1mdW5jdGlvbiBTdyh0LGUsbil7cmV0dXJuIGJ3KHQsKGZ1bmN0aW9uKG4pe3ZhciBpPStlLHI9aS8oblsxXVswXS1uWzBdWzBdKSxvPShpLXIqKG5bMV1bMF0rblswXVswXSkpLzIsYT0tcipuWzBdWzFdO3Quc2NhbGUoMTUwKnIpLnRyYW5zbGF0ZShbbyxhXSl9KSxuKX1mdW5jdGlvbiBNdyh0LGUsbil7cmV0dXJuIGJ3KHQsKGZ1bmN0aW9uKG4pe3ZhciBpPStlLHI9aS8oblsxXVsxXS1uWzBdWzFdKSxvPS1yKm5bMF1bMF0sYT0oaS1yKihuWzFdWzFdK25bMF1bMV0pKS8yO3Quc2NhbGUoMTUwKnIpLnRyYW5zbGF0ZShbbyxhXSl9KSxuKX1ndy5wcm90b3R5cGU9e19yYWRpdXM6NC41LF9jaXJjbGU6X3coNC41KSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4odD0rdCkhPT10aGlzLl9yYWRpdXMmJih0aGlzLl9yYWRpdXM9dCx0aGlzLl9jaXJjbGU9bnVsbCksdGhpc30scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPT09dGhpcy5fbGluZSYmdGhpcy5fc3RyaW5nLnB1c2goIloiKSx0aGlzLl9wb2ludD1OYU59LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fc3RyaW5nLnB1c2goIk0iLHQsIiwiLGUpLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3N0cmluZy5wdXNoKCJMIix0LCIsIixlKTticmVhaztkZWZhdWx0Om51bGw9PXRoaXMuX2NpcmNsZSYmKHRoaXMuX2NpcmNsZT1fdyh0aGlzLl9yYWRpdXMpKSx0aGlzLl9zdHJpbmcucHVzaCgiTSIsdCwiLCIsZSx0aGlzLl9jaXJjbGUpfX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYodGhpcy5fc3RyaW5nLmxlbmd0aCl7dmFyIHQ9dGhpcy5fc3RyaW5nLmpvaW4oIiIpO3JldHVybiB0aGlzLl9zdHJpbmc9W10sdH1yZXR1cm4gbnVsbH19LHZ3LnByb3RvdHlwZT17Y29uc3RydWN0b3I6dncscG9pbnQ6ZnVuY3Rpb24odCxlKXt0aGlzLnN0cmVhbS5wb2ludCh0LGUpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX07dmFyIEV3PUh5KDMwKk95KTtmdW5jdGlvbiBUdyh0LGUpe3JldHVybitlPyhmdW5jdGlvbiBuKHQsZSl7ZnVuY3Rpb24gbihpLHIsbyxhLHMsbCxjLHUsaCxkLHAsZixtLGcpe3ZhciBfPWMtaSx5PXUtcix2PV8qXyt5Knk7aWYodj40KmUmJm0tLSl7dmFyIGI9YStkLHg9cytwLHc9bCtmLFM9cXkoYipiK3gqeCt3KncpLE09JHkody89UyksRT16eSh6eSh3KS0xKTxBeXx8enkoby1oKTxBeT8obytoKS8yOkJ5KHgsYiksVD10KEUsTSksQz1UWzBdLEE9VFsxXSxrPUMtaSxMPUEtcixQPXkqay1fKkw7KFAqUC92PmV8fHp5KChfKmsreSpMKS92LS41KT4uM3x8YSpkK3MqcCtsKmY8RXcpJiYobihpLHIsbyxhLHMsbCxDLEEsRSxiLz1TLHgvPVMsdyxtLGcpLGcucG9pbnQoQyxBKSxuKEMsQSxFLGIseCx3LGMsdSxoLGQscCxmLG0sZykpfX1yZXR1cm4gZnVuY3Rpb24oZSl7dmFyIGkscixvLGEscyxsLGMsdSxoLGQscCxmLG09e3BvaW50OmcsbGluZVN0YXJ0Ol8sbGluZUVuZDp2LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2UucG9seWdvblN0YXJ0KCksbS5saW5lU3RhcnQ9Yn0scG9seWdvbkVuZDpmdW5jdGlvbigpe2UucG9seWdvbkVuZCgpLG0ubGluZVN0YXJ0PV99fTtmdW5jdGlvbiBnKG4saSl7bj10KG4saSksZS5wb2ludChuWzBdLG5bMV0pfWZ1bmN0aW9uIF8oKXt1PU5hTixtLnBvaW50PXksZS5saW5lU3RhcnQoKX1mdW5jdGlvbiB5KGkscil7dmFyIG89X3YoW2kscl0pLGE9dChpLHIpO24odSxoLGMsZCxwLGYsdT1hWzBdLGg9YVsxXSxjPWksZD1vWzBdLHA9b1sxXSxmPW9bMl0sMTYsZSksZS5wb2ludCh1LGgpfWZ1bmN0aW9uIHYoKXttLnBvaW50PWcsZS5saW5lRW5kKCl9ZnVuY3Rpb24gYigpe18oKSxtLnBvaW50PXgsbS5saW5lRW5kPXd9ZnVuY3Rpb24geCh0LGUpe3koaT10LGUpLHI9dSxvPWgsYT1kLHM9cCxsPWYsbS5wb2ludD15fWZ1bmN0aW9uIHcoKXtuKHUsaCxjLGQscCxmLHIsbyxpLGEscyxsLDE2LGUpLG0ubGluZUVuZD12LHYoKX1yZXR1cm4gbX19KSh0LGUpOihmdW5jdGlvbiBpKHQpe3JldHVybiB5dyh7cG9pbnQ6ZnVuY3Rpb24oZSxuKXtlPXQoZSxuKSx0aGlzLnN0cmVhbS5wb2ludChlWzBdLGVbMV0pfX0pfSkodCl9dmFyIEN3PXl3KHtwb2ludDpmdW5jdGlvbih0LGUpe3RoaXMuc3RyZWFtLnBvaW50KHQqT3ksZSpPeSl9fSk7ZnVuY3Rpb24gQXcodCxlLG4saSxyKXtmdW5jdGlvbiBvKG8sYSl7cmV0dXJuW2UrdCoobyo9aSksbi10KihhKj1yKV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKG8sYSl7cmV0dXJuWyhvLWUpL3QqaSwobi1hKS90KnJdfSxvfWZ1bmN0aW9uIGt3KHQsZSxuLGkscixvKXt2YXIgYT1IeShvKSxzPUd5KG8pLGw9YSp0LGM9cyp0LHU9YS90LGg9cy90LGQ9KHMqbi1hKmUpL3QscD0ocyplK2EqbikvdDtmdW5jdGlvbiBmKHQsbyl7cmV0dXJuW2wqKHQqPWkpLWMqKG8qPXIpK2Usbi1jKnQtbCpvXX1yZXR1cm4gZi5pbnZlcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm5baSoodSp0LWgqZStkKSxyKihwLWgqdC11KmUpXX0sZn1mdW5jdGlvbiBMdyh0KXtyZXR1cm4gUHcoKGZ1bmN0aW9uKCl7cmV0dXJuIHR9KSkoKX1mdW5jdGlvbiBQdyh0KXt2YXIgZSxuLGkscixvLGEscyxsLGMsdSxoPTE1MCxkPTQ4MCxwPTI1MCxmPTAsbT0wLGc9MCxfPTAseT0wLHY9MCxiPTEseD0xLHc9bnVsbCxTPUhiLE09bnVsbCxFPWd4LFQ9LjU7ZnVuY3Rpb24gQyh0KXtyZXR1cm4gbCh0WzBdKk95LHRbMV0qT3kpfWZ1bmN0aW9uIEEodCl7cmV0dXJuKHQ9bC5pbnZlcnQodFswXSx0WzFdKSkmJlt0WzBdKlJ5LHRbMV0qUnldfWZ1bmN0aW9uIGsoKXt2YXIgdD1rdyhoLDAsMCxiLHgsdikuYXBwbHkobnVsbCxlKGYsbSkpLGk9KHY/a3c6QXcpKGgsZC10WzBdLHAtdFsxXSxiLHgsdik7cmV0dXJuIG49eGIoZyxfLHkpLHM9dmIoZSxpKSxsPXZiKG4scyksYT1UdyhzLFQpLEwoKX1mdW5jdGlvbiBMKCl7cmV0dXJuIGM9dT1udWxsLEN9cmV0dXJuIEMuc3RyZWFtPWZ1bmN0aW9uKHQpe3JldHVybiBjJiZ1PT09dD9jOmM9Q3coKGZ1bmN0aW9uIGUodCl7cmV0dXJuIHl3KHtwb2ludDpmdW5jdGlvbihlLG4pe3ZhciBpPXQoZSxuKTtyZXR1cm4gdGhpcy5zdHJlYW0ucG9pbnQoaVswXSxpWzFdKX19KX0pKG4pKFMoYShFKHU9dCkpKSkpfSxDLnByZWNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KFM9dCx3PXZvaWQgMCxMKCkpOlN9LEMucG9zdGNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEU9dCxNPWk9cj1vPW51bGwsTCgpKTpFfSxDLmNsaXBBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oUz0rdD9VYih3PXQqT3kpOih3PW51bGwsSGIpLEwoKSk6dypSeX0sQy5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhFPW51bGw9PXQ/KE09aT1yPW89bnVsbCxneCk6V2IoTT0rdFswXVswXSxpPSt0WzBdWzFdLHI9K3RbMV1bMF0sbz0rdFsxXVsxXSksTCgpKTpudWxsPT1NP251bGw6W1tNLGldLFtyLG9dXX0sQy5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdCxrKCkpOmh9LEMudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSt0WzBdLHA9K3RbMV0saygpKTpbZCxwXX0sQy5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9dFswXSUzNjAqT3ksbT10WzFdJTM2MCpPeSxrKCkpOltmKlJ5LG0qUnldfSxDLnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz10WzBdJTM2MCpPeSxfPXRbMV0lMzYwKk95LHk9dC5sZW5ndGg+Mj90WzJdJTM2MCpPeTowLGsoKSk6W2cqUnksXypSeSx5KlJ5XX0sQy5hbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj10JTM2MCpPeSxrKCkpOnYqUnl9LEMucmVmbGVjdFg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGI9dD8tMToxLGsoKSk6YjwwfSxDLnJlZmxlY3RZPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PXQ/LTE6MSxrKCkpOng8MH0sQy5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9VHcocyxUPXQqdCksTCgpKTpxeShUKX0sQy5maXRFeHRlbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4geHcoQyx0LGUpfSxDLmZpdFNpemU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gd3coQyx0LGUpfSxDLmZpdFdpZHRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFN3KEMsdCxlKX0sQy5maXRIZWlnaHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTXcoQyx0LGUpfSxmdW5jdGlvbigpe3JldHVybiBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpLEMuaW52ZXJ0PWUuaW52ZXJ0JiZBLGsoKX19ZnVuY3Rpb24gTncodCl7dmFyIGU9MCxuPUx5LzMsaT1Qdyh0KSxyPWkoZSxuKTtyZXR1cm4gci5wYXJhbGxlbHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/aShlPXRbMF0qT3ksbj10WzFdKk95KTpbZSpSeSxuKlJ5XX0scn1mdW5jdGlvbiBJdyh0LGUpe3ZhciBuPUd5KHQpLGk9KG4rR3koZSkpLzI7aWYoenkoaSk8QXkpcmV0dXJuKGZ1bmN0aW9uIHIodCl7dmFyIGU9SHkodCk7ZnVuY3Rpb24gbih0LG4pe3JldHVyblt0KmUsR3kobikvZV19cmV0dXJuIG4uaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuW3QvZSwkeShuKmUpXX0sbn0pKHQpO3ZhciBvPTErbiooMippLW4pLGE9cXkobykvaTtmdW5jdGlvbiBzKHQsZSl7dmFyIG49cXkoby0yKmkqR3koZSkpL2k7cmV0dXJuW24qR3kodCo9aSksYS1uKkh5KHQpXX1yZXR1cm4gcy5pbnZlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1hLWUscj1CeSh0LHp5KG4pKSpXeShuKTtyZXR1cm4gbippPDAmJihyLT1MeSpXeSh0KSpXeShuKSksW3IvaSwkeSgoby0odCp0K24qbikqaSppKS8oMippKSldfSxzfWZ1bmN0aW9uIFJ3KCl7cmV0dXJuIE53KEl3KS5zY2FsZSgxNTUuNDI0KS5jZW50ZXIoWzAsMzMuNjQ0Ml0pfWZ1bmN0aW9uIE93KCl7cmV0dXJuIFJ3KCkucGFyYWxsZWxzKFsyOS41LDQ1LjVdKS5zY2FsZSgxMDcwKS50cmFuc2xhdGUoWzQ4MCwyNTBdKS5yb3RhdGUoWzk2LDBdKS5jZW50ZXIoWy0uNiwzOC43XSl9ZnVuY3Rpb24gencodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIGk9SHkoZSkscj1IeShuKSxvPXQoaSpyKTtyZXR1cm5bbypyKkd5KGUpLG8qR3kobildfX1mdW5jdGlvbiBEdyh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgaT1xeShlKmUrbipuKSxyPXQoaSksbz1HeShyKSxhPUh5KHIpO3JldHVybltCeShlKm8saSphKSwkeShpJiZuKm8vaSldfX12YXIgQnc9encoKGZ1bmN0aW9uKHQpe3JldHVybiBxeSgyLygxK3QpKX0pKTtCdy5pbnZlcnQ9RHcoKGZ1bmN0aW9uKHQpe3JldHVybiAyKiR5KHQvMil9KSk7dmFyIEh3PXp3KChmdW5jdGlvbih0KXtyZXR1cm4odD1YeSh0KSkmJnQvR3kodCl9KSk7ZnVuY3Rpb24gRncodCxlKXtyZXR1cm5bdCxVeShZeSgoUHkrZSkvMikpXX1mdW5jdGlvbiBWdyh0KXt2YXIgZSxuLGkscj1Mdyh0KSxvPXIuY2VudGVyLGE9ci5zY2FsZSxzPXIudHJhbnNsYXRlLGw9ci5jbGlwRXh0ZW50LGM9bnVsbDtmdW5jdGlvbiB1KCl7dmFyIG89THkqYSgpLHM9cihFYihyLnJvdGF0ZSgpKS5pbnZlcnQoWzAsMF0pKTtyZXR1cm4gbChudWxsPT1jP1tbc1swXS1vLHNbMV0tb10sW3NbMF0rbyxzWzFdK29dXTp0PT09Rnc/W1tNYXRoLm1heChzWzBdLW8sYyksZV0sW01hdGgubWluKHNbMF0rbyxuKSxpXV06W1tjLE1hdGgubWF4KHNbMV0tbyxlKV0sW24sTWF0aC5taW4oc1sxXStvLGkpXV0pfXJldHVybiByLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhKHQpLHUoKSk6YSgpfSxyLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocyh0KSx1KCkpOnMoKX0sci5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG8odCksdSgpKTpvKCl9LHIuY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9jPWU9bj1pPW51bGw6KGM9K3RbMF1bMF0sZT0rdFswXVsxXSxuPSt0WzFdWzBdLGk9K3RbMV1bMV0pLHUoKSk6bnVsbD09Yz9udWxsOltbYyxlXSxbbixpXV19LHUoKX1mdW5jdGlvbiBVdyh0KXtyZXR1cm4gWXkoKFB5K3QpLzIpfWZ1bmN0aW9uIGp3KHQsZSl7dmFyIG49SHkodCksaT10PT09ZT9HeSh0KTpVeShuL0h5KGUpKS9VeShVdyhlKS9Vdyh0KSkscj1uKmp5KFV3KHQpLGkpL2k7aWYoIWkpcmV0dXJuIEZ3O2Z1bmN0aW9uIG8odCxlKXtyPjA/ZTwtUHkrQXkmJihlPS1QeStBeSk6ZT5QeS1BeSYmKGU9UHktQXkpO3ZhciBuPXIvankoVXcoZSksaSk7cmV0dXJuW24qR3koaSp0KSxyLW4qSHkoaSp0KV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ci1lLG89V3koaSkqcXkodCp0K24qbiksYT1CeSh0LHp5KG4pKSpXeShuKTtyZXR1cm4gbippPDAmJihhLT1MeSpXeSh0KSpXeShuKSksW2EvaSwyKkR5KGp5KHIvbywxL2kpKS1QeV19LG99ZnVuY3Rpb24gR3codCxlKXtyZXR1cm5bdCxlXX1mdW5jdGlvbiBXdyh0LGUpe3ZhciBuPUh5KHQpLGk9dD09PWU/R3kodCk6KG4tSHkoZSkpLyhlLXQpLHI9bi9pK3Q7aWYoenkoaSk8QXkpcmV0dXJuIEd3O2Z1bmN0aW9uIG8odCxlKXt2YXIgbj1yLWUsbz1pKnQ7cmV0dXJuW24qR3kobyksci1uKkh5KG8pXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1yLWUsbz1CeSh0LHp5KG4pKSpXeShuKTtyZXR1cm4gbippPDAmJihvLT1MeSpXeSh0KSpXeShuKSksW28vaSxyLVd5KGkpKnF5KHQqdCtuKm4pXX0sb31Idy5pbnZlcnQ9RHcoKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpLEZ3LmludmVydD1mdW5jdGlvbih0LGUpe3JldHVyblt0LDIqRHkoVnkoZSkpLVB5XX0sR3cuaW52ZXJ0PUd3O3ZhciBxdz0xLjM0MDI2NCxZdz0tLjA4MTEwNixYdz04OTNlLTYsJHc9LjAwMzc5NixLdz1xeSgzKS8yO2Z1bmN0aW9uIFp3KHQsZSl7dmFyIG49JHkoS3cqR3koZSkpLGk9bipuLHI9aSppKmk7cmV0dXJuW3QqSHkobikvKEt3KihxdyszKll3KmkrciooNypYdys5KiR3KmkpKSksbioocXcrWXcqaStyKihYdyskdyppKSldfWZ1bmN0aW9uIEp3KHQsZSl7dmFyIG49SHkoZSksaT1IeSh0KSpuO3JldHVybltuKkd5KHQpL2ksR3koZSkvaV19ZnVuY3Rpb24gUXcodCxlKXt2YXIgbj1lKmUsaT1uKm47cmV0dXJuW3QqKC44NzA3LS4xMzE5NzkqbitpKihpKiguMDAzOTcxKm4tLjAwMTUyOSppKS0uMDEzNzkxKSksZSooMS4wMDcyMjYrbiooLjAxNTA4NStpKiguMDI4ODc0Km4tLjA0NDQ3NS0uMDA1OTE2KmkpKSldfWZ1bmN0aW9uIHRTKHQsZSl7cmV0dXJuW0h5KGUpKkd5KHQpLEd5KGUpXX1mdW5jdGlvbiBlUyh0LGUpe3ZhciBuPUh5KGUpLGk9MStIeSh0KSpuO3JldHVybltuKkd5KHQpL2ksR3koZSkvaV19ZnVuY3Rpb24gblModCxlKXtyZXR1cm5bVXkoWXkoKFB5K2UpLzIpKSwtdF19ZnVuY3Rpb24gaVModCxlKXtyZXR1cm4gdC5wYXJlbnQ9PT1lLnBhcmVudD8xOjJ9ZnVuY3Rpb24gclModCxlKXtyZXR1cm4gdCtlLnh9ZnVuY3Rpb24gb1ModCxlKXtyZXR1cm4gTWF0aC5tYXgodCxlLnkpfWZ1bmN0aW9uIGFTKHQpe3ZhciBlPTAsbj10LmNoaWxkcmVuLGk9biYmbi5sZW5ndGg7aWYoaSlmb3IoOy0taT49MDspZSs9bltpXS52YWx1ZTtlbHNlIGU9MTt0LnZhbHVlPWV9ZnVuY3Rpb24gc1ModCxlKXt2YXIgbixpLHIsbyxhLHM9bmV3IGhTKHQpLGw9K3QudmFsdWUmJihzLnZhbHVlPXQudmFsdWUpLGM9W3NdO2ZvcihudWxsPT1lJiYoZT1sUyk7bj1jLnBvcCgpOylpZihsJiYobi52YWx1ZT0rbi5kYXRhLnZhbHVlKSwocj1lKG4uZGF0YSkpJiYoYT1yLmxlbmd0aCkpZm9yKG4uY2hpbGRyZW49bmV3IEFycmF5KGEpLG89YS0xO28+PTA7LS1vKWMucHVzaChpPW4uY2hpbGRyZW5bb109bmV3IGhTKHJbb10pKSxpLnBhcmVudD1uLGkuZGVwdGg9bi5kZXB0aCsxO3JldHVybiBzLmVhY2hCZWZvcmUodVMpfWZ1bmN0aW9uIGxTKHQpe3JldHVybiB0LmNoaWxkcmVufWZ1bmN0aW9uIGNTKHQpe3QuZGF0YT10LmRhdGEuZGF0YX1mdW5jdGlvbiB1Uyh0KXt2YXIgZT0wO2Rve3QuaGVpZ2h0PWV9d2hpbGUoKHQ9dC5wYXJlbnQpJiZ0LmhlaWdodDwrK2UpfWZ1bmN0aW9uIGhTKHQpe3RoaXMuZGF0YT10LHRoaXMuZGVwdGg9dGhpcy5oZWlnaHQ9MCx0aGlzLnBhcmVudD1udWxsfVp3LmludmVydD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbixpPWUscj1pKmksbz1yKnIqcixhPTA7YTwxMiYmKG89KHI9KGktPW49KGkqKHF3K1l3KnIrbyooWHcrJHcqcikpLWUpLyhxdyszKll3KnIrbyooNypYdys5KiR3KnIpKSkqaSkqcipyLCEoenkobik8a3kpKTsrK2EpO3JldHVybltLdyp0KihxdyszKll3KnIrbyooNypYdys5KiR3KnIpKS9IeShpKSwkeShHeShpKS9LdyldfSxKdy5pbnZlcnQ9RHcoRHkpLFF3LmludmVydD1mdW5jdGlvbih0LGUpe3ZhciBuLGk9ZSxyPTI1O2Rve3ZhciBvPWkqaSxhPW8qbztpLT1uPShpKigxLjAwNzIyNitvKiguMDE1MDg1K2EqKC4wMjg4NzQqby0uMDQ0NDc1LS4wMDU5MTYqYSkpKS1lKS8oMS4wMDcyMjYrbyooLjA0NTI1NSthKiguMjU5ODY2Km8tLjMxMTMyNS0uMDA1OTE2KjExKmEpKSl9d2hpbGUoenkobik+QXkmJi0tcj4wKTtyZXR1cm5bdC8oLjg3MDcrKG89aSppKSoobyoobypvKm8qKC4wMDM5NzEtLjAwMTUyOSpvKS0uMDEzNzkxKS0uMTMxOTc5KSksaV19LHRTLmludmVydD1EdygkeSksZVMuaW52ZXJ0PUR3KChmdW5jdGlvbih0KXtyZXR1cm4gMipEeSh0KX0pKSxuUy5pbnZlcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm5bLWUsMipEeShWeSh0KSktUHldfSxoUy5wcm90b3R5cGU9c1MucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpoUyxjb3VudDpmdW5jdGlvbiBkUygpe3JldHVybiB0aGlzLmVhY2hBZnRlcihhUyl9LGVhY2g6ZnVuY3Rpb24gcFModCl7dmFyIGUsbixpLHIsbz10aGlzLGE9W29dO2Rve2ZvcihlPWEucmV2ZXJzZSgpLGE9W107bz1lLnBvcCgpOylpZih0KG8pLG49by5jaGlsZHJlbilmb3IoaT0wLHI9bi5sZW5ndGg7aTxyOysraSlhLnB1c2gobltpXSl9d2hpbGUoYS5sZW5ndGgpO3JldHVybiB0aGlzfSxlYWNoQWZ0ZXI6ZnVuY3Rpb24gZlModCl7Zm9yKHZhciBlLG4saSxyPXRoaXMsbz1bcl0sYT1bXTtyPW8ucG9wKCk7KWlmKGEucHVzaChyKSxlPXIuY2hpbGRyZW4pZm9yKG49MCxpPWUubGVuZ3RoO248aTsrK24pby5wdXNoKGVbbl0pO2Zvcig7cj1hLnBvcCgpOyl0KHIpO3JldHVybiB0aGlzfSxlYWNoQmVmb3JlOmZ1bmN0aW9uIG1TKHQpe2Zvcih2YXIgZSxuLGk9dGhpcyxyPVtpXTtpPXIucG9wKCk7KWlmKHQoaSksZT1pLmNoaWxkcmVuKWZvcihuPWUubGVuZ3RoLTE7bj49MDstLW4pci5wdXNoKGVbbl0pO3JldHVybiB0aGlzfSxzdW06ZnVuY3Rpb24gZ1ModCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKChmdW5jdGlvbihlKXtmb3IodmFyIG49K3QoZS5kYXRhKXx8MCxpPWUuY2hpbGRyZW4scj1pJiZpLmxlbmd0aDstLXI+PTA7KW4rPWlbcl0udmFsdWU7ZS52YWx1ZT1ufSkpfSxzb3J0OmZ1bmN0aW9uIF9TKHQpe3JldHVybiB0aGlzLmVhY2hCZWZvcmUoKGZ1bmN0aW9uKGUpe2UuY2hpbGRyZW4mJmUuY2hpbGRyZW4uc29ydCh0KX0pKX0scGF0aDpmdW5jdGlvbiB5Uyh0KXtmb3IodmFyIGU9dGhpcyxuPShmdW5jdGlvbiBpKHQsZSl7aWYodD09PWUpcmV0dXJuIHQ7dmFyIG49dC5hbmNlc3RvcnMoKSxpPWUuYW5jZXN0b3JzKCkscj1udWxsO2Zvcih0PW4ucG9wKCksZT1pLnBvcCgpO3Q9PT1lOylyPXQsdD1uLnBvcCgpLGU9aS5wb3AoKTtyZXR1cm4gcn0pKGUsdCkscj1bZV07ZSE9PW47KXIucHVzaChlPWUucGFyZW50KTtmb3IodmFyIG89ci5sZW5ndGg7dCE9PW47KXIuc3BsaWNlKG8sMCx0KSx0PXQucGFyZW50O3JldHVybiByfSxhbmNlc3RvcnM6ZnVuY3Rpb24gdlMoKXtmb3IodmFyIHQ9dGhpcyxlPVt0XTt0PXQucGFyZW50OyllLnB1c2godCk7cmV0dXJuIGV9LGRlc2NlbmRhbnRzOmZ1bmN0aW9uIGJTKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oZSl7dC5wdXNoKGUpfSkpLHR9LGxlYXZlczpmdW5jdGlvbiB4Uygpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2hCZWZvcmUoKGZ1bmN0aW9uKGUpe2UuY2hpbGRyZW58fHQucHVzaChlKX0pKSx0fSxsaW5rczpmdW5jdGlvbiB3Uygpe3ZhciB0PXRoaXMsZT1bXTtyZXR1cm4gdC5lYWNoKChmdW5jdGlvbihuKXtuIT09dCYmZS5wdXNoKHtzb3VyY2U6bi5wYXJlbnQsdGFyZ2V0Om59KX0pKSxlfSxjb3B5OmZ1bmN0aW9uIFNTKCl7cmV0dXJuIHNTKHRoaXMpLmVhY2hCZWZvcmUoY1MpfX07dmFyIE1TPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBFUyh0KXtmb3IodmFyIGUsbixpPTAscj0odD0oZnVuY3Rpb24gbyh0KXtmb3IodmFyIGUsbixpPXQubGVuZ3RoO2k7KW49TWF0aC5yYW5kb20oKSppLS18MCxlPXRbaV0sdFtpXT10W25dLHRbbl09ZTtyZXR1cm4gdH0pKE1TLmNhbGwodCkpKS5sZW5ndGgsYT1bXTtpPHI7KWU9dFtpXSxuJiZBUyhuLGUpPysraToobj1MUyhhPVRTKGEsZSkpLGk9MCk7cmV0dXJuIG59ZnVuY3Rpb24gVFModCxlKXt2YXIgbixpO2lmKGtTKGUsdCkpcmV0dXJuW2VdO2ZvcihuPTA7bjx0Lmxlbmd0aDsrK24paWYoQ1MoZSx0W25dKSYma1MoUFModFtuXSxlKSx0KSlyZXR1cm5bdFtuXSxlXTtmb3Iobj0wO248dC5sZW5ndGgtMTsrK24pZm9yKGk9bisxO2k8dC5sZW5ndGg7KytpKWlmKENTKFBTKHRbbl0sdFtpXSksZSkmJkNTKFBTKHRbbl0sZSksdFtpXSkmJkNTKFBTKHRbaV0sZSksdFtuXSkmJmtTKE5TKHRbbl0sdFtpXSxlKSx0KSlyZXR1cm5bdFtuXSx0W2ldLGVdO3Rocm93IG5ldyBFcnJvcn1mdW5jdGlvbiBDUyh0LGUpe3ZhciBuPXQuci1lLnIsaT1lLngtdC54LHI9ZS55LXQueTtyZXR1cm4gbjwwfHxuKm48aSppK3Iqcn1mdW5jdGlvbiBBUyh0LGUpe3ZhciBuPXQuci1lLnIrMWUtNixpPWUueC10Lngscj1lLnktdC55O3JldHVybiBuPjAmJm4qbj5pKmkrcipyfWZ1bmN0aW9uIGtTKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDsrK24paWYoIUFTKHQsZVtuXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gTFModCl7c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDE6cmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJue3g6dC54LHk6dC55LHI6dC5yfX0pKHRbMF0pO2Nhc2UgMjpyZXR1cm4gUFModFswXSx0WzFdKTtjYXNlIDM6cmV0dXJuIE5TKHRbMF0sdFsxXSx0WzJdKX19ZnVuY3Rpb24gUFModCxlKXt2YXIgbj10LngsaT10Lnkscj10LnIsbz1lLngsYT1lLnkscz1lLnIsbD1vLW4sYz1hLWksdT1zLXIsaD1NYXRoLnNxcnQobCpsK2MqYyk7cmV0dXJue3g6KG4rbytsL2gqdSkvMix5OihpK2ErYy9oKnUpLzIscjooaCtyK3MpLzJ9fWZ1bmN0aW9uIE5TKHQsZSxuKXt2YXIgaT10Lngscj10Lnksbz10LnIsYT1lLngscz1lLnksbD1lLnIsYz1uLngsdT1uLnksaD1uLnIsZD1pLWEscD1pLWMsZj1yLXMsbT1yLXUsZz1sLW8sXz1oLW8seT1pKmkrcipyLW8qbyx2PXktYSphLXMqcytsKmwsYj15LWMqYy11KnUraCpoLHg9cCpmLWQqbSx3PShmKmItbSp2KS8oMip4KS1pLFM9KG0qZy1mKl8pL3gsTT0ocCp2LWQqYikvKDIqeCktcixFPShkKl8tcCpnKS94LFQ9UypTK0UqRS0xLEM9Mioobyt3KlMrTSpFKSxBPXcqdytNKk0tbypvLGs9LShUPyhDK01hdGguc3FydChDKkMtNCpUKkEpKS8oMipUKTpBL0MpO3JldHVybnt4OmkrdytTKmsseTpyK00rRSprLHI6a319ZnVuY3Rpb24gSVModCxlLG4pe3ZhciBpLHIsbyxhLHM9dC54LWUueCxsPXQueS1lLnksYz1zKnMrbCpsO2M/KHI9ZS5yK24ucixhPXQucituLnIsKHIqPXIpPihhKj1hKT8oaT0oYythLXIpLygyKmMpLG89TWF0aC5zcXJ0KE1hdGgubWF4KDAsYS9jLWkqaSkpLG4ueD10LngtaSpzLW8qbCxuLnk9dC55LWkqbCtvKnMpOihpPShjK3ItYSkvKDIqYyksbz1NYXRoLnNxcnQoTWF0aC5tYXgoMCxyL2MtaSppKSksbi54PWUueCtpKnMtbypsLG4ueT1lLnkraSpsK28qcykpOihuLng9ZS54K24ucixuLnk9ZS55KX1mdW5jdGlvbiBSUyh0LGUpe3ZhciBuPXQucitlLnItMWUtNixpPWUueC10Lngscj1lLnktdC55O3JldHVybiBuPjAmJm4qbj5pKmkrcipyfWZ1bmN0aW9uIE9TKHQpe3ZhciBlPXQuXyxuPXQubmV4dC5fLGk9ZS5yK24ucixyPShlLngqbi5yK24ueCplLnIpL2ksbz0oZS55Km4ucituLnkqZS5yKS9pO3JldHVybiByKnIrbypvfWZ1bmN0aW9uIHpTKHQpe3RoaXMuXz10LHRoaXMubmV4dD1udWxsLHRoaXMucHJldmlvdXM9bnVsbH1mdW5jdGlvbiBEUyh0KXtpZighKHI9dC5sZW5ndGgpKXJldHVybiAwO3ZhciBlLG4saSxyLG8sYSxzLGwsYyx1LGg7aWYoKGU9dFswXSkueD0wLGUueT0wLCEocj4xKSlyZXR1cm4gZS5yO2lmKGUueD0tKG49dFsxXSkucixuLng9ZS5yLG4ueT0wLCEocj4yKSlyZXR1cm4gZS5yK24ucjtJUyhuLGUsaT10WzJdKSxlPW5ldyB6UyhlKSxuPW5ldyB6UyhuKSxpPW5ldyB6UyhpKSxlLm5leHQ9aS5wcmV2aW91cz1uLG4ubmV4dD1lLnByZXZpb3VzPWksaS5uZXh0PW4ucHJldmlvdXM9ZTt0OmZvcihzPTM7czxyOysrcyl7SVMoZS5fLG4uXyxpPXRbc10pLGk9bmV3IHpTKGkpLGw9bi5uZXh0LGM9ZS5wcmV2aW91cyx1PW4uXy5yLGg9ZS5fLnI7ZG97aWYodTw9aCl7aWYoUlMobC5fLGkuXykpe2UubmV4dD1uPWwsbi5wcmV2aW91cz1lLC0tcztjb250aW51ZSB0fXUrPWwuXy5yLGw9bC5uZXh0fWVsc2V7aWYoUlMoYy5fLGkuXykpeyhlPWMpLm5leHQ9bixuLnByZXZpb3VzPWUsLS1zO2NvbnRpbnVlIHR9aCs9Yy5fLnIsYz1jLnByZXZpb3VzfX13aGlsZShsIT09Yy5uZXh0KTtmb3IoaS5wcmV2aW91cz1lLGkubmV4dD1uLGUubmV4dD1uLnByZXZpb3VzPW49aSxvPU9TKGUpOyhpPWkubmV4dCkhPT1uOykoYT1PUyhpKSk8byYmKGU9aSxvPWEpO249ZS5uZXh0fWZvcihlPVtuLl9dLGk9bjsoaT1pLm5leHQpIT09bjspZS5wdXNoKGkuXyk7Zm9yKGk9RVMoZSkscz0wO3M8cjsrK3MpKGU9dFtzXSkueC09aS54LGUueS09aS55O3JldHVybiBpLnJ9ZnVuY3Rpb24gQlModCl7cmV0dXJuIG51bGw9PXQ/bnVsbDpIUyh0KX1mdW5jdGlvbiBIUyh0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHR9ZnVuY3Rpb24gRlMoKXtyZXR1cm4gMH1mdW5jdGlvbiBWUyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gVVModCl7cmV0dXJuIE1hdGguc3FydCh0LnZhbHVlKX1mdW5jdGlvbiBqUyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7ZS5jaGlsZHJlbnx8KGUucj1NYXRoLm1heCgwLCt0KGUpfHwwKSl9fWZ1bmN0aW9uIEdTKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe2lmKGk9bi5jaGlsZHJlbil7dmFyIGkscixvLGE9aS5sZW5ndGgscz10KG4pKmV8fDA7aWYocylmb3Iocj0wO3I8YTsrK3IpaVtyXS5yKz1zO2lmKG89RFMoaSkscylmb3Iocj0wO3I8YTsrK3IpaVtyXS5yLT1zO24ucj1vK3N9fX1mdW5jdGlvbiBXUyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49ZS5wYXJlbnQ7ZS5yKj10LG4mJihlLng9bi54K3QqZS54LGUueT1uLnkrdCplLnkpfX1mdW5jdGlvbiBxUyh0KXt0LngwPU1hdGgucm91bmQodC54MCksdC55MD1NYXRoLnJvdW5kKHQueTApLHQueDE9TWF0aC5yb3VuZCh0LngxKSx0LnkxPU1hdGgucm91bmQodC55MSl9ZnVuY3Rpb24gWVModCxlLG4saSxyKXtmb3IodmFyIG8sYT10LmNoaWxkcmVuLHM9LTEsbD1hLmxlbmd0aCxjPXQudmFsdWUmJihpLWUpL3QudmFsdWU7KytzPGw7KShvPWFbc10pLnkwPW4sby55MT1yLG8ueDA9ZSxvLngxPWUrPW8udmFsdWUqY312YXIgWFM9e2RlcHRoOi0xfSwkUz17fTtmdW5jdGlvbiBLUyh0KXtyZXR1cm4gdC5pZH1mdW5jdGlvbiBaUyh0KXtyZXR1cm4gdC5wYXJlbnRJZH1mdW5jdGlvbiBKUyh0LGUpe3JldHVybiB0LnBhcmVudD09PWUucGFyZW50PzE6Mn1mdW5jdGlvbiBRUyh0KXt2YXIgZT10LmNoaWxkcmVuO3JldHVybiBlP2VbMF06dC50fWZ1bmN0aW9uIHRNKHQpe3ZhciBlPXQuY2hpbGRyZW47cmV0dXJuIGU/ZVtlLmxlbmd0aC0xXTp0LnR9ZnVuY3Rpb24gZU0odCxlLG4pe3ZhciBpPW4vKGUuaS10LmkpO2UuYy09aSxlLnMrPW4sdC5jKz1pLGUueis9bixlLm0rPW59ZnVuY3Rpb24gbk0odCxlLG4pe3JldHVybiB0LmEucGFyZW50PT09ZS5wYXJlbnQ/dC5hOm59ZnVuY3Rpb24gaU0odCxlKXt0aGlzLl89dCx0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49bnVsbCx0aGlzLkE9bnVsbCx0aGlzLmE9dGhpcyx0aGlzLno9MCx0aGlzLm09MCx0aGlzLmM9MCx0aGlzLnM9MCx0aGlzLnQ9bnVsbCx0aGlzLmk9ZX1mdW5jdGlvbiByTSh0LGUsbixpLHIpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4scz0tMSxsPWEubGVuZ3RoLGM9dC52YWx1ZSYmKHItbikvdC52YWx1ZTsrK3M8bDspKG89YVtzXSkueDA9ZSxvLngxPWksby55MD1uLG8ueTE9bis9by52YWx1ZSpjfWlNLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGhTLnByb3RvdHlwZSk7dmFyIG9NPSgxK01hdGguc3FydCg1KSkvMjtmdW5jdGlvbiBhTSh0LGUsbixpLHIsbyl7Zm9yKHZhciBhLHMsbCxjLHUsaCxkLHAsZixtLGcsXz1bXSx5PWUuY2hpbGRyZW4sdj0wLGI9MCx4PXkubGVuZ3RoLHc9ZS52YWx1ZTt2PHg7KXtsPXItbixjPW8taTtkb3t1PXlbYisrXS52YWx1ZX13aGlsZSghdSYmYjx4KTtmb3IoaD1kPXUsZz11KnUqKG09TWF0aC5tYXgoYy9sLGwvYykvKHcqdCkpLGY9TWF0aC5tYXgoZC9nLGcvaCk7Yjx4OysrYil7aWYodSs9cz15W2JdLnZhbHVlLHM8aCYmKGg9cykscz5kJiYoZD1zKSxnPXUqdSptLChwPU1hdGgubWF4KGQvZyxnL2gpKT5mKXt1LT1zO2JyZWFrfWY9cH1fLnB1c2goYT17dmFsdWU6dSxkaWNlOmw8YyxjaGlsZHJlbjp5LnNsaWNlKHYsYil9KSxhLmRpY2U/WVMoYSxuLGkscix3P2krPWMqdS93Om8pOnJNKGEsbixpLHc/bis9bCp1L3c6cixvKSx3LT11LHY9Yn1yZXR1cm4gX312YXIgc009KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0LG4saSxyLG8pe2FNKGUsdCxuLGkscixvKX1yZXR1cm4gbi5yYXRpbz1mdW5jdGlvbihlKXtyZXR1cm4gdCgoZT0rZSk+MT9lOjEpfSxufSkob00pLGxNPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCxuLGkscixvKXtpZigoYT10Ll9zcXVhcmlmeSkmJmEucmF0aW89PT1lKWZvcih2YXIgYSxzLGwsYyx1LGg9LTEsZD1hLmxlbmd0aCxwPXQudmFsdWU7KytoPGQ7KXtmb3IobD0ocz1hW2hdKS5jaGlsZHJlbixjPXMudmFsdWU9MCx1PWwubGVuZ3RoO2M8dTsrK2Mpcy52YWx1ZSs9bFtjXS52YWx1ZTtzLmRpY2U/WVMocyxuLGkscixpKz0oby1pKSpzLnZhbHVlL3ApOnJNKHMsbixpLG4rPShyLW4pKnMudmFsdWUvcCxvKSxwLT1zLnZhbHVlfWVsc2UgdC5fc3F1YXJpZnk9YT1hTShlLHQsbixpLHIsbyksYS5yYXRpbz1lfXJldHVybiBuLnJhdGlvPWZ1bmN0aW9uKGUpe3JldHVybiB0KChlPStlKT4xP2U6MSl9LG59KShvTSk7ZnVuY3Rpb24gY00odCxlLG4pe3JldHVybihlWzBdLXRbMF0pKihuWzFdLXRbMV0pLShlWzFdLXRbMV0pKihuWzBdLXRbMF0pfWZ1bmN0aW9uIHVNKHQsZSl7cmV0dXJuIHRbMF0tZVswXXx8dFsxXS1lWzFdfWZ1bmN0aW9uIGhNKHQpe2Zvcih2YXIgZT10Lmxlbmd0aCxuPVswLDFdLGk9MixyPTI7cjxlOysrcil7Zm9yKDtpPjEmJmNNKHRbbltpLTJdXSx0W25baS0xXV0sdFtyXSk8PTA7KS0taTtuW2krK109cn1yZXR1cm4gbi5zbGljZSgwLGkpfWZ1bmN0aW9uIGRNKCl7cmV0dXJuIE1hdGgucmFuZG9tKCl9dmFyIHBNPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCxuKXtyZXR1cm4gdD1udWxsPT10PzA6K3Qsbj1udWxsPT1uPzE6K24sMT09PWFyZ3VtZW50cy5sZW5ndGg/KG49dCx0PTApOm4tPXQsZnVuY3Rpb24oKXtyZXR1cm4gZSgpKm4rdH19cmV0dXJuIG4uc291cmNlPXQsbn0pKGRNKSxmTT0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQsbil7dmFyIGkscjtyZXR1cm4gdD1udWxsPT10PzA6K3Qsbj1udWxsPT1uPzE6K24sZnVuY3Rpb24oKXt2YXIgbztpZihudWxsIT1pKW89aSxpPW51bGw7ZWxzZSBkb3tpPTIqZSgpLTEsbz0yKmUoKS0xLHI9aSppK28qb313aGlsZSghcnx8cj4xKTtyZXR1cm4gdCtuKm8qTWF0aC5zcXJ0KC0yKk1hdGgubG9nKHIpL3IpfX1yZXR1cm4gbi5zb3VyY2U9dCxufSkoZE0pLG1NPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4oKXt2YXIgdD1mTS5zb3VyY2UoZSkuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBNYXRoLmV4cCh0KCkpfX1yZXR1cm4gbi5zb3VyY2U9dCxufSkoZE0pLGdNPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBuPTAsaT0wO2k8dDsrK2kpbis9ZSgpO3JldHVybiBufX1yZXR1cm4gbi5zb3VyY2U9dCxufSkoZE0pLF9NPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7dmFyIG49Z00uc291cmNlKGUpKHQpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBuKCkvdH19cmV0dXJuIG4uc291cmNlPXQsbn0pKGRNKSx5TT0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybi1NYXRoLmxvZygxLWUoKSkvdH19cmV0dXJuIG4uc291cmNlPXQsbn0pKGRNKTtmdW5jdGlvbiB2TSh0LGUpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6YnJlYWs7Y2FzZSAxOnRoaXMucmFuZ2UodCk7YnJlYWs7ZGVmYXVsdDp0aGlzLnJhbmdlKGUpLmRvbWFpbih0KX1yZXR1cm4gdGhpc31mdW5jdGlvbiBiTSh0LGUpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6YnJlYWs7Y2FzZSAxOnRoaXMuaW50ZXJwb2xhdG9yKHQpO2JyZWFrO2RlZmF1bHQ6dGhpcy5pbnRlcnBvbGF0b3IoZSkuZG9tYWluKHQpfXJldHVybiB0aGlzfXZhciB4TT1BcnJheS5wcm90b3R5cGUsd009eE0ubWFwLFNNPXhNLnNsaWNlLE1NPXtuYW1lOiJpbXBsaWNpdCJ9O2Z1bmN0aW9uIEVNKCl7dmFyIHQ9d2coKSxlPVtdLG49W10saT1NTTtmdW5jdGlvbiByKHIpe3ZhciBvPXIrIiIsYT10LmdldChvKTtpZighYSl7aWYoaSE9PU1NKXJldHVybiBpO3Quc2V0KG8sYT1lLnB1c2gocikpfXJldHVybiBuWyhhLTEpJW4ubGVuZ3RoXX1yZXR1cm4gci5kb21haW49ZnVuY3Rpb24obil7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGUuc2xpY2UoKTtlPVtdLHQ9d2coKTtmb3IodmFyIGksbyxhPS0xLHM9bi5sZW5ndGg7KythPHM7KXQuaGFzKG89KGk9blthXSkrIiIpfHx0LnNldChvLGUucHVzaChpKSk7cmV0dXJuIHJ9LHIucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49U00uY2FsbCh0KSxyKTpuLnNsaWNlKCl9LHIudW5rbm93bj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LHIpOml9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiBFTShlLG4pLnVua25vd24oaSl9LHZNLmFwcGx5KHIsYXJndW1lbnRzKSxyfWZ1bmN0aW9uIFRNKCl7dmFyIHQsZSxuPUVNKCkudW5rbm93bih2b2lkIDApLGk9bi5kb21haW4scj1uLnJhbmdlLG89WzAsMV0sYT0hMSxzPTAsbD0wLGM9LjU7ZnVuY3Rpb24gdSgpe3ZhciBuPWkoKS5sZW5ndGgsdT1vWzFdPG9bMF0saD1vW3UtMF0sZD1vWzEtdV07dD0oZC1oKS9NYXRoLm1heCgxLG4tcysyKmwpLGEmJih0PU1hdGguZmxvb3IodCkpLGgrPShkLWgtdCoobi1zKSkqYyxlPXQqKDEtcyksYSYmKGg9TWF0aC5yb3VuZChoKSxlPU1hdGgucm91bmQoZSkpO3ZhciBwPXpsKG4pLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGgrdCplfSkpO3JldHVybiByKHU/cC5yZXZlcnNlKCk6cCl9cmV0dXJuIGRlbGV0ZSBuLnVua25vd24sbi5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkodCksdSgpKTppKCl9LG4ucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89Wyt0WzBdLCt0WzFdXSx1KCkpOm8uc2xpY2UoKX0sbi5yYW5nZVJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBvPVsrdFswXSwrdFsxXV0sYT0hMCx1KCl9LG4uYmFuZHdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uc3RlcD1mdW5jdGlvbigpe3JldHVybiB0fSxuLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSEhdCx1KCkpOmF9LG4ucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1NYXRoLm1pbigxLGw9K3QpLHUoKSk6c30sbi5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9TWF0aC5taW4oMSx0KSx1KCkpOnN9LG4ucGFkZGluZ091dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPSt0LHUoKSk6bH0sbi5hbGlnbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHUoKSk6Y30sbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFRNKGkoKSxvKS5yb3VuZChhKS5wYWRkaW5nSW5uZXIocykucGFkZGluZ091dGVyKGwpLmFsaWduKGMpfSx2TS5hcHBseSh1KCksYXJndW1lbnRzKX1mdW5jdGlvbiBDTSh0KXt2YXIgZT10LmNvcHk7cmV0dXJuIHQucGFkZGluZz10LnBhZGRpbmdPdXRlcixkZWxldGUgdC5wYWRkaW5nSW5uZXIsZGVsZXRlIHQucGFkZGluZ091dGVyLHQuY29weT1mdW5jdGlvbigpe3JldHVybiBDTShlKCkpfSx0fWZ1bmN0aW9uIEFNKCl7cmV0dXJuIENNKFRNLmFwcGx5KG51bGwsYXJndW1lbnRzKS5wYWRkaW5nSW5uZXIoMSkpfWZ1bmN0aW9uIGtNKHQpe3JldHVybit0fXZhciBMTT1bMCwxXTtmdW5jdGlvbiBQTSh0KXtyZXR1cm4gdH1mdW5jdGlvbiBOTSh0LGUpe3JldHVybihlLT10PSt0KT9mdW5jdGlvbihuKXtyZXR1cm4obi10KS9lfTooZnVuY3Rpb24gbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KShpc05hTihlKT9OYU46LjUpfWZ1bmN0aW9uIElNKHQpe3ZhciBlLG49dFswXSxpPXRbdC5sZW5ndGgtMV07cmV0dXJuIG4+aSYmKGU9bixuPWksaT1lKSxmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5tYXgobixNYXRoLm1pbihpLHQpKX19ZnVuY3Rpb24gUk0odCxlLG4pe3ZhciBpPXRbMF0scj10WzFdLG89ZVswXSxhPWVbMV07cmV0dXJuIHI8aT8oaT1OTShyLGkpLG89bihhLG8pKTooaT1OTShpLHIpLG89bihvLGEpKSxmdW5jdGlvbih0KXtyZXR1cm4gbyhpKHQpKX19ZnVuY3Rpb24gT00odCxlLG4pe3ZhciBpPU1hdGgubWluKHQubGVuZ3RoLGUubGVuZ3RoKS0xLHI9bmV3IEFycmF5KGkpLG89bmV3IEFycmF5KGkpLGE9LTE7Zm9yKHRbaV08dFswXSYmKHQ9dC5zbGljZSgpLnJldmVyc2UoKSxlPWUuc2xpY2UoKS5yZXZlcnNlKCkpOysrYTxpOylyW2FdPU5NKHRbYV0sdFthKzFdKSxvW2FdPW4oZVthXSxlW2ErMV0pO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj1TbCh0LGUsMSxpKS0xO3JldHVybiBvW25dKHJbbl0oZSkpfX1mdW5jdGlvbiB6TSh0LGUpe3JldHVybiBlLmRvbWFpbih0LmRvbWFpbigpKS5yYW5nZSh0LnJhbmdlKCkpLmludGVycG9sYXRlKHQuaW50ZXJwb2xhdGUoKSkuY2xhbXAodC5jbGFtcCgpKS51bmtub3duKHQudW5rbm93bigpKX1mdW5jdGlvbiBETSgpe3ZhciB0LGUsbixpLHIsbyxhPUxNLHM9TE0sbD1qZCxjPVBNO2Z1bmN0aW9uIHUoKXtyZXR1cm4gaT1NYXRoLm1pbihhLmxlbmd0aCxzLmxlbmd0aCk+Mj9PTTpSTSxyPW89bnVsbCxofWZ1bmN0aW9uIGgoZSl7cmV0dXJuIGlzTmFOKGU9K2UpP246KHJ8fChyPWkoYS5tYXAodCkscyxsKSkpKHQoYyhlKSkpfXJldHVybiBoLmludmVydD1mdW5jdGlvbihuKXtyZXR1cm4gYyhlKChvfHwobz1pKHMsYS5tYXAodCksQmQpKSkobikpKX0saC5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9d00uY2FsbCh0LGtNKSxjPT09UE18fChjPUlNKGEpKSx1KCkpOmEuc2xpY2UoKX0saC5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1TTS5jYWxsKHQpLHUoKSk6cy5zbGljZSgpfSxoLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHM9U00uY2FsbCh0KSxsPUdkLHUoKX0saC5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz10P0lNKGEpOlBNLGgpOmMhPT1QTX0saC5pbnRlcnBvbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD10LHUoKSk6bH0saC51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsaCk6bn0sZnVuY3Rpb24obixpKXtyZXR1cm4gdD1uLGU9aSx1KCl9fWZ1bmN0aW9uIEJNKHQsZSl7cmV0dXJuIERNKCkodCxlKX1mdW5jdGlvbiBITSh0LGUsbixpKXt2YXIgcixvPVVsKHQsZSxuKTtzd2l0Y2goKGk9c3kobnVsbD09aT8iLGYiOmkpKS50eXBlKXtjYXNlInMiOnZhciBhPU1hdGgubWF4KE1hdGguYWJzKHQpLE1hdGguYWJzKGUpKTtyZXR1cm4gbnVsbCE9aS5wcmVjaXNpb258fGlzTmFOKHI9d3kobyxhKSl8fChpLnByZWNpc2lvbj1yKSxneShpLGEpO2Nhc2UiIjpjYXNlImUiOmNhc2UiZyI6Y2FzZSJwIjpjYXNlInIiOm51bGwhPWkucHJlY2lzaW9ufHxpc05hTihyPVN5KG8sTWF0aC5tYXgoTWF0aC5hYnModCksTWF0aC5hYnMoZSkpKSl8fChpLnByZWNpc2lvbj1yLSgiZSI9PT1pLnR5cGUpKTticmVhaztjYXNlImYiOmNhc2UiJSI6bnVsbCE9aS5wcmVjaXNpb258fGlzTmFOKHI9eHkobykpfHwoaS5wcmVjaXNpb249ci0yKigiJSI9PT1pLnR5cGUpKX1yZXR1cm4gbXkoaSl9ZnVuY3Rpb24gRk0odCl7dmFyIGU9dC5kb21haW47cmV0dXJuIHQudGlja3M9ZnVuY3Rpb24odCl7dmFyIG49ZSgpO3JldHVybiBGbChuWzBdLG5bbi5sZW5ndGgtMV0sbnVsbD09dD8xMDp0KX0sdC50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsbil7dmFyIGk9ZSgpO3JldHVybiBITShpWzBdLGlbaS5sZW5ndGgtMV0sbnVsbD09dD8xMDp0LG4pfSx0Lm5pY2U9ZnVuY3Rpb24obil7bnVsbD09biYmKG49MTApO3ZhciBpLHI9ZSgpLG89MCxhPXIubGVuZ3RoLTEscz1yW29dLGw9clthXTtyZXR1cm4gbDxzJiYoaT1zLHM9bCxsPWksaT1vLG89YSxhPWkpLChpPVZsKHMsbCxuKSk+MD9pPVZsKHM9TWF0aC5mbG9vcihzL2kpKmksbD1NYXRoLmNlaWwobC9pKSppLG4pOmk8MCYmKGk9Vmwocz1NYXRoLmNlaWwocyppKS9pLGw9TWF0aC5mbG9vcihsKmkpL2ksbikpLGk+MD8ocltvXT1NYXRoLmZsb29yKHMvaSkqaSxyW2FdPU1hdGguY2VpbChsL2kpKmksZShyKSk6aTwwJiYocltvXT1NYXRoLmNlaWwocyppKS9pLHJbYV09TWF0aC5mbG9vcihsKmkpL2ksZShyKSksdH0sdH1mdW5jdGlvbiBWTSgpe3ZhciB0PUJNKFBNLFBNKTtyZXR1cm4gdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHpNKHQsVk0oKSl9LHZNLmFwcGx5KHQsYXJndW1lbnRzKSxGTSh0KX1mdW5jdGlvbiBVTSh0LGUpe3ZhciBuLGk9MCxyPSh0PXQuc2xpY2UoKSkubGVuZ3RoLTEsbz10W2ldLGE9dFtyXTtyZXR1cm4gYTxvJiYobj1pLGk9cixyPW4sbj1vLG89YSxhPW4pLHRbaV09ZS5mbG9vcihvKSx0W3JdPWUuY2VpbChhKSx0fWZ1bmN0aW9uIGpNKHQpe3JldHVybiBNYXRoLmxvZyh0KX1mdW5jdGlvbiBHTSh0KXtyZXR1cm4gTWF0aC5leHAodCl9ZnVuY3Rpb24gV00odCl7cmV0dXJuLU1hdGgubG9nKC10KX1mdW5jdGlvbiBxTSh0KXtyZXR1cm4tTWF0aC5leHAoLXQpfWZ1bmN0aW9uIFlNKHQpe3JldHVybiBpc0Zpbml0ZSh0KT8rKCIxZSIrdCk6dDwwPzA6dH1mdW5jdGlvbiBYTSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuLXQoLWUpfX1mdW5jdGlvbiAkTSh0KXt2YXIgZSxuLGk9dChqTSxHTSkscj1pLmRvbWFpbixvPTEwO2Z1bmN0aW9uIGEoKXtyZXR1cm4gZT0oZnVuY3Rpb24gYSh0KXtyZXR1cm4gdD09PU1hdGguRT9NYXRoLmxvZzoxMD09PXQmJk1hdGgubG9nMTB8fDI9PT10JiZNYXRoLmxvZzJ8fCh0PU1hdGgubG9nKHQpLGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmxvZyhlKS90fSl9KShvKSxuPShmdW5jdGlvbiBzKHQpe3JldHVybiAxMD09PXQ/WU06dD09PU1hdGguRT9NYXRoLmV4cDpmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5wb3codCxlKX19KShvKSxyKClbMF08MD8oZT1YTShlKSxuPVhNKG4pLHQoV00scU0pKTp0KGpNLEdNKSxpfXJldHVybiBpLmJhc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3QsYSgpKTpvfSxpLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocih0KSxhKCkpOnIoKX0saS50aWNrcz1mdW5jdGlvbih0KXt2YXIgaSxhPXIoKSxzPWFbMF0sbD1hW2EubGVuZ3RoLTFdOyhpPWw8cykmJihkPXMscz1sLGw9ZCk7dmFyIGMsdSxoLGQ9ZShzKSxwPWUobCksZj1udWxsPT10PzEwOit0LG09W107aWYoIShvJTEpJiZwLWQ8Zil7aWYoZD1NYXRoLnJvdW5kKGQpLTEscD1NYXRoLnJvdW5kKHApKzEscz4wKXtmb3IoO2Q8cDsrK2QpZm9yKHU9MSxjPW4oZCk7dTxvOysrdSlpZighKChoPWMqdSk8cykpe2lmKGg+bClicmVhazttLnB1c2goaCl9fWVsc2UgZm9yKDtkPHA7KytkKWZvcih1PW8tMSxjPW4oZCk7dT49MTstLXUpaWYoISgoaD1jKnUpPHMpKXtpZihoPmwpYnJlYWs7bS5wdXNoKGgpfX1lbHNlIG09RmwoZCxwLE1hdGgubWluKHAtZCxmKSkubWFwKG4pO3JldHVybiBpP20ucmV2ZXJzZSgpOm19LGkudGlja0Zvcm1hdD1mdW5jdGlvbih0LHIpe2lmKG51bGw9PXImJihyPTEwPT09bz8iLjBlIjoiLCIpLCJmdW5jdGlvbiIhPXR5cGVvZiByJiYocj1teShyKSksdD09PTEvMClyZXR1cm4gcjtudWxsPT10JiYodD0xMCk7dmFyIGE9TWF0aC5tYXgoMSxvKnQvaS50aWNrcygpLmxlbmd0aCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBpPXQvbihNYXRoLnJvdW5kKGUodCkpKTtyZXR1cm4gaSpvPG8tLjUmJihpKj1vKSxpPD1hP3IodCk6IiJ9fSxpLm5pY2U9ZnVuY3Rpb24oKXtyZXR1cm4gcihVTShyKCkse2Zsb29yOmZ1bmN0aW9uKHQpe3JldHVybiBuKE1hdGguZmxvb3IoZSh0KSkpfSxjZWlsOmZ1bmN0aW9uKHQpe3JldHVybiBuKE1hdGguY2VpbChlKHQpKSl9fSkpfSxpfWZ1bmN0aW9uIEtNKCl7dmFyIHQ9JE0oRE0oKSkuZG9tYWluKFsxLDEwXSk7cmV0dXJuIHQuY29weT1mdW5jdGlvbigpe3JldHVybiB6TSh0LEtNKCkpLmJhc2UodC5iYXNlKCkpfSx2TS5hcHBseSh0LGFyZ3VtZW50cyksdH1mdW5jdGlvbiBaTSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguc2lnbihlKSpNYXRoLmxvZzFwKE1hdGguYWJzKGUvdCkpfX1mdW5jdGlvbiBKTSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguc2lnbihlKSpNYXRoLmV4cG0xKE1hdGguYWJzKGUpKSp0fX1mdW5jdGlvbiBRTSh0KXt2YXIgZT0xLG49dChaTShlKSxKTShlKSk7cmV0dXJuIG4uY29uc3RhbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dChaTShlPStuKSxKTShlKSk6ZX0sRk0obil9ZnVuY3Rpb24gdEUodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlPDA/LU1hdGgucG93KC1lLHQpOk1hdGgucG93KGUsdCl9fWZ1bmN0aW9uIGVFKHQpe3JldHVybiB0PDA/LU1hdGguc3FydCgtdCk6TWF0aC5zcXJ0KHQpfWZ1bmN0aW9uIG5FKHQpe3JldHVybiB0PDA/LXQqdDp0KnR9ZnVuY3Rpb24gaUUodCl7dmFyIGU9dChQTSxQTSksbj0xO2Z1bmN0aW9uIGkoKXtyZXR1cm4gMT09PW4/dChQTSxQTSk6LjU9PT1uP3QoZUUsbkUpOnQodEUobiksdEUoMS9uKSl9cmV0dXJuIGUuZXhwb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3QsaSgpKTpufSxGTShlKX1mdW5jdGlvbiByRSgpe3ZhciB0PWlFKERNKCkpO3JldHVybiB0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gek0odCxyRSgpKS5leHBvbmVudCh0LmV4cG9uZW50KCkpfSx2TS5hcHBseSh0LGFyZ3VtZW50cyksdH1mdW5jdGlvbiBvRSgpe3ZhciB0LGU9W10sbj1bXSxpPVtdO2Z1bmN0aW9uIHIoKXt2YXIgdD0wLHI9TWF0aC5tYXgoMSxuLmxlbmd0aCk7Zm9yKGk9bmV3IEFycmF5KHItMSk7Kyt0PHI7KWlbdC0xXT1HbChlLHQvcik7cmV0dXJuIG99ZnVuY3Rpb24gbyhlKXtyZXR1cm4gaXNOYU4oZT0rZSk/dDpuW1NsKGksZSldfXJldHVybiBvLmludmVydEV4dGVudD1mdW5jdGlvbih0KXt2YXIgcj1uLmluZGV4T2YodCk7cmV0dXJuIHI8MD9bTmFOLE5hTl06W3I+MD9pW3ItMV06ZVswXSxyPGkubGVuZ3RoP2lbcl06ZVtlLmxlbmd0aC0xXV19LG8uZG9tYWluPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBlLnNsaWNlKCk7ZT1bXTtmb3IodmFyIG4saT0wLG89dC5sZW5ndGg7aTxvOysraSludWxsPT0obj10W2ldKXx8aXNOYU4obj0rbil8fGUucHVzaChuKTtyZXR1cm4gZS5zb3J0KGJsKSxyKCl9LG8ucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49U00uY2FsbCh0KSxyKCkpOm4uc2xpY2UoKX0sby51bmtub3duPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsbyk6dH0sby5xdWFudGlsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gaS5zbGljZSgpfSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gb0UoKS5kb21haW4oZSkucmFuZ2UobikudW5rbm93bih0KX0sdk0uYXBwbHkobyxhcmd1bWVudHMpfWZ1bmN0aW9uIGFFKCl7dmFyIHQsZT0wLG49MSxpPTEscj1bLjVdLG89WzAsMV07ZnVuY3Rpb24gYShlKXtyZXR1cm4gZTw9ZT9vW1NsKHIsZSwwLGkpXTp0fWZ1bmN0aW9uIHMoKXt2YXIgdD0tMTtmb3Iocj1uZXcgQXJyYXkoaSk7Kyt0PGk7KXJbdF09KCh0KzEpKm4tKHQtaSkqZSkvKGkrMSk7cmV0dXJuIGF9cmV0dXJuIGEuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLG49K3RbMV0scygpKTpbZSxuXX0sYS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0obz1TTS5jYWxsKHQpKS5sZW5ndGgtMSxzKCkpOm8uc2xpY2UoKX0sYS5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIGE9by5pbmRleE9mKHQpO3JldHVybiBhPDA/W05hTixOYU5dOmE8MT9bZSxyWzBdXTphPj1pP1tyW2ktMV0sbl06W3JbYS0xXSxyW2FdXX0sYS51bmtub3duPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsYSk6YX0sYS50aHJlc2hvbGRzPWZ1bmN0aW9uKCl7cmV0dXJuIHIuc2xpY2UoKX0sYS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGFFKCkuZG9tYWluKFtlLG5dKS5yYW5nZShvKS51bmtub3duKHQpfSx2TS5hcHBseShGTShhKSxhcmd1bWVudHMpfXZhciBzRT1uZXcgRGF0ZSxsRT1uZXcgRGF0ZTtmdW5jdGlvbiBjRSh0LGUsbixpKXtmdW5jdGlvbiByKGUpe3JldHVybiB0KGU9MD09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IERhdGU6bmV3IERhdGUoK2UpKSxlfXJldHVybiByLmZsb29yPWZ1bmN0aW9uKGUpe3JldHVybiB0KGU9bmV3IERhdGUoK2UpKSxlfSxyLmNlaWw9ZnVuY3Rpb24obil7cmV0dXJuIHQobj1uZXcgRGF0ZShuLTEpKSxlKG4sMSksdChuKSxufSxyLnJvdW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXIodCksbj1yLmNlaWwodCk7cmV0dXJuIHQtZTxuLXQ/ZTpufSxyLm9mZnNldD1mdW5jdGlvbih0LG4pe3JldHVybiBlKHQ9bmV3IERhdGUoK3QpLG51bGw9PW4/MTpNYXRoLmZsb29yKG4pKSx0fSxyLnJhbmdlPWZ1bmN0aW9uKG4saSxvKXt2YXIgYSxzPVtdO2lmKG49ci5jZWlsKG4pLG89bnVsbD09bz8xOk1hdGguZmxvb3IobyksIShuPGkmJm8+MCkpcmV0dXJuIHM7ZG97cy5wdXNoKGE9bmV3IERhdGUoK24pKSxlKG4sbyksdChuKX13aGlsZShhPG4mJm48aSk7cmV0dXJuIHN9LHIuZmlsdGVyPWZ1bmN0aW9uKG4pe3JldHVybiBjRSgoZnVuY3Rpb24oZSl7aWYoZT49ZSlmb3IoO3QoZSksIW4oZSk7KWUuc2V0VGltZShlLTEpfSksKGZ1bmN0aW9uKHQsaSl7aWYodD49dClpZihpPDApZm9yKDsrK2k8PTA7KWZvcig7ZSh0LC0xKSwhbih0KTspO2Vsc2UgZm9yKDstLWk+PTA7KWZvcig7ZSh0LDEpLCFuKHQpOyk7fSkpfSxuJiYoci5jb3VudD1mdW5jdGlvbihlLGkpe3JldHVybiBzRS5zZXRUaW1lKCtlKSxsRS5zZXRUaW1lKCtpKSx0KHNFKSx0KGxFKSxNYXRoLmZsb29yKG4oc0UsbEUpKX0sci5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP3IuZmlsdGVyKGk/ZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSkldD09MH06ZnVuY3Rpb24oZSl7cmV0dXJuIHIuY291bnQoMCxlKSV0PT0wfSk6cjpudWxsfSkscn12YXIgdUU9Y0UoKGZ1bmN0aW9uKCl7fSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUtdH0pKTt1RS5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP2NFKChmdW5jdGlvbihlKXtlLnNldFRpbWUoTWF0aC5mbG9vcihlL3QpKnQpfSksKGZ1bmN0aW9uKGUsbil7ZS5zZXRUaW1lKCtlK24qdCl9KSwoZnVuY3Rpb24oZSxuKXtyZXR1cm4obi1lKS90fSkpOnVFOm51bGx9O3ZhciBoRT11RSxkRT11RS5yYW5nZSxwRT0xZTMsZkU9NmU0LG1FPTM2ZTUsZ0U9ODY0ZTUsX0U9NjA0OGU1LHlFPWNFKChmdW5jdGlvbih0KXt0LnNldFRpbWUodC10LmdldE1pbGxpc2Vjb25kcygpKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKnBFKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL3BFfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ1NlY29uZHMoKX0pKSx2RT15RSxiRT15RS5yYW5nZSx4RT1jRSgoZnVuY3Rpb24odCl7dC5zZXRUaW1lKHQtdC5nZXRNaWxsaXNlY29uZHMoKS10LmdldFNlY29uZHMoKSpwRSl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFRpbWUoK3QrZSpmRSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS9mRX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNaW51dGVzKCl9KSksd0U9eEUsU0U9eEUucmFuZ2UsTUU9Y0UoKGZ1bmN0aW9uKHQpe3Quc2V0VGltZSh0LXQuZ2V0TWlsbGlzZWNvbmRzKCktdC5nZXRTZWNvbmRzKCkqcEUtdC5nZXRNaW51dGVzKCkqZkUpfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UqbUUpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvbUV9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0SG91cnMoKX0pKSxFRT1NRSxURT1NRS5yYW5nZSxDRT1jRSgoZnVuY3Rpb24odCl7dC5zZXRIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0RGF0ZSh0LmdldERhdGUoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQtKGUuZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKmZFKS9nRX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXREYXRlKCktMX0pKSxBRT1DRSxrRT1DRS5yYW5nZTtmdW5jdGlvbiBMRSh0KXtyZXR1cm4gY0UoKGZ1bmN0aW9uKGUpe2Uuc2V0RGF0ZShlLmdldERhdGUoKS0oZS5nZXREYXkoKSs3LXQpJTcpLGUuc2V0SG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldERhdGUodC5nZXREYXRlKCkrNyplKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQtKGUuZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKmZFKS9fRX0pKX12YXIgUEU9TEUoMCksTkU9TEUoMSksSUU9TEUoMiksUkU9TEUoMyksT0U9TEUoNCksekU9TEUoNSksREU9TEUoNiksQkU9UEUucmFuZ2UsSEU9TkUucmFuZ2UsRkU9SUUucmFuZ2UsVkU9UkUucmFuZ2UsVUU9T0UucmFuZ2UsakU9ekUucmFuZ2UsR0U9REUucmFuZ2UsV0U9Y0UoKGZ1bmN0aW9uKHQpe3Quc2V0RGF0ZSgxKSx0LnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRNb250aCh0LmdldE1vbnRoKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5nZXRNb250aCgpLXQuZ2V0TW9udGgoKSsxMiooZS5nZXRGdWxsWWVhcigpLXQuZ2V0RnVsbFllYXIoKSl9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TW9udGgoKX0pKSxxRT1XRSxZRT1XRS5yYW5nZSxYRT1jRSgoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldEZ1bGxZZWFyKHQuZ2V0RnVsbFllYXIoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybiBlLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KSk7WEUuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9jRSgoZnVuY3Rpb24oZSl7ZS5zZXRGdWxsWWVhcihNYXRoLmZsb29yKGUuZ2V0RnVsbFllYXIoKS90KSp0KSxlLnNldE1vbnRoKDAsMSksZS5zZXRIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbihlLG4pe2Uuc2V0RnVsbFllYXIoZS5nZXRGdWxsWWVhcigpK24qdCl9KSk6bnVsbH07dmFyICRFPVhFLEtFPVhFLnJhbmdlLFpFPWNFKChmdW5jdGlvbih0KXt0LnNldFVUQ1NlY29uZHMoMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKmZFKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL2ZFfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01pbnV0ZXMoKX0pKSxKRT1aRSxRRT1aRS5yYW5nZSx0VD1jRSgoZnVuY3Rpb24odCl7dC5zZXRVVENNaW51dGVzKDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKm1FKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL21FfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0hvdXJzKCl9KSksZVQ9dFQsblQ9dFQucmFuZ2UsaVQ9Y0UoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS9nRX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENEYXRlKCktMX0pKSxyVD1pVCxvVD1pVC5yYW5nZTtmdW5jdGlvbiBhVCh0KXtyZXR1cm4gY0UoKGZ1bmN0aW9uKGUpe2Uuc2V0VVRDRGF0ZShlLmdldFVUQ0RhdGUoKS0oZS5nZXRVVENEYXkoKSs3LXQpJTcpLGUuc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrNyplKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL19FfSkpfXZhciBzVD1hVCgwKSxsVD1hVCgxKSxjVD1hVCgyKSx1VD1hVCgzKSxoVD1hVCg0KSxkVD1hVCg1KSxwVD1hVCg2KSxmVD1zVC5yYW5nZSxtVD1sVC5yYW5nZSxnVD1jVC5yYW5nZSxfVD11VC5yYW5nZSx5VD1oVC5yYW5nZSx2VD1kVC5yYW5nZSxiVD1wVC5yYW5nZSx4VD1jRSgoZnVuY3Rpb24odCl7dC5zZXRVVENEYXRlKDEpLHQuc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFVUQ01vbnRoKHQuZ2V0VVRDTW9udGgoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybiBlLmdldFVUQ01vbnRoKCktdC5nZXRVVENNb250aCgpKzEyKihlLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpKX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENNb250aCgpfSkpLHdUPXhULFNUPXhULnJhbmdlLE1UPWNFKChmdW5jdGlvbih0KXt0LnNldFVUQ01vbnRoKDAsMSksdC5zZXRVVENIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VVRDRnVsbFllYXIodC5nZXRVVENGdWxsWWVhcigpK2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZ2V0VVRDRnVsbFllYXIoKS10LmdldFVUQ0Z1bGxZZWFyKCl9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDRnVsbFllYXIoKX0pKTtNVC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP2NFKChmdW5jdGlvbihlKXtlLnNldFVUQ0Z1bGxZZWFyKE1hdGguZmxvb3IoZS5nZXRVVENGdWxsWWVhcigpL3QpKnQpLGUuc2V0VVRDTW9udGgoMCwxKSxlLnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKGUsbil7ZS5zZXRVVENGdWxsWWVhcihlLmdldFVUQ0Z1bGxZZWFyKCkrbip0KX0pKTpudWxsfTt2YXIgRVQ9TVQsVFQ9TVQucmFuZ2U7ZnVuY3Rpb24gQ1QodCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgZT1uZXcgRGF0ZSgtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCk7cmV0dXJuIGUuc2V0RnVsbFllYXIodC55KSxlfXJldHVybiBuZXcgRGF0ZSh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpfWZ1bmN0aW9uIEFUKHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIGU9bmV3IERhdGUoRGF0ZS5VVEMoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKTtyZXR1cm4gZS5zZXRVVENGdWxsWWVhcih0LnkpLGV9cmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHQueSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpfWZ1bmN0aW9uIGtUKHQsZSxuKXtyZXR1cm57eTp0LG06ZSxkOm4sSDowLE06MCxTOjAsTDowfX1mdW5jdGlvbiBMVCh0KXt2YXIgZT10LmRhdGVUaW1lLG49dC5kYXRlLGk9dC50aW1lLHI9dC5wZXJpb2RzLG89dC5kYXlzLGE9dC5zaG9ydERheXMscz10Lm1vbnRocyxsPXQuc2hvcnRNb250aHMsYz1VVChyKSx1PWpUKHIpLGg9VVQobyksZD1qVChvKSxwPVVUKGEpLGY9alQoYSksbT1VVChzKSxnPWpUKHMpLF89VVQobCkseT1qVChsKSx2PXthOmZ1bmN0aW9uIGIodCl7cmV0dXJuIGFbdC5nZXREYXkoKV19LEE6ZnVuY3Rpb24geCh0KXtyZXR1cm4gb1t0LmdldERheSgpXX0sYjpmdW5jdGlvbiB3KHQpe3JldHVybiBsW3QuZ2V0TW9udGgoKV19LEI6ZnVuY3Rpb24gUyh0KXtyZXR1cm4gc1t0LmdldE1vbnRoKCldfSxjOm51bGwsZDp1QyxlOnVDLGY6bUMsZzpUQyxHOkFDLEg6aEMsSTpkQyxqOnBDLEw6ZkMsbTpnQyxNOl9DLHA6ZnVuY3Rpb24gTSh0KXtyZXR1cm4gclsrKHQuZ2V0SG91cnMoKT49MTIpXX0scTpmdW5jdGlvbiBFKHQpe3JldHVybiAxK35+KHQuZ2V0TW9udGgoKS8zKX0sUTpaQyxzOkpDLFM6eUMsdTp2QyxVOmJDLFY6d0MsdzpTQyxXOk1DLHg6bnVsbCxYOm51bGwseTpFQyxZOkNDLFo6a0MsIiUiOktDfSxUPXthOmZ1bmN0aW9uIEModCl7cmV0dXJuIGFbdC5nZXRVVENEYXkoKV19LEE6ZnVuY3Rpb24gQSh0KXtyZXR1cm4gb1t0LmdldFVUQ0RheSgpXX0sYjpmdW5jdGlvbiBrKHQpe3JldHVybiBsW3QuZ2V0VVRDTW9udGgoKV19LEI6ZnVuY3Rpb24gTCh0KXtyZXR1cm4gc1t0LmdldFVUQ01vbnRoKCldfSxjOm51bGwsZDpMQyxlOkxDLGY6T0MsZzpxQyxHOlhDLEg6UEMsSTpOQyxqOklDLEw6UkMsbTp6QyxNOkRDLHA6ZnVuY3Rpb24gUCh0KXtyZXR1cm4gclsrKHQuZ2V0VVRDSG91cnMoKT49MTIpXX0scTpmdW5jdGlvbiBOKHQpe3JldHVybiAxK35+KHQuZ2V0VVRDTW9udGgoKS8zKX0sUTpaQyxzOkpDLFM6QkMsdTpIQyxVOkZDLFY6VUMsdzpqQyxXOkdDLHg6bnVsbCxYOm51bGwseTpXQyxZOllDLFo6JEMsIiUiOktDfSxJPXthOmZ1bmN0aW9uIFIodCxlLG4pe3ZhciBpPXAuZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC53PWZbaVswXS50b0xvd2VyQ2FzZSgpXSxuK2lbMF0ubGVuZ3RoKTotMX0sQTpmdW5jdGlvbiBPKHQsZSxuKXt2YXIgaT1oLmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIGk/KHQudz1kW2lbMF0udG9Mb3dlckNhc2UoKV0sbitpWzBdLmxlbmd0aCk6LTF9LGI6ZnVuY3Rpb24geih0LGUsbil7dmFyIGk9Xy5leGVjKGUuc2xpY2UobikpO3JldHVybiBpPyh0Lm09eVtpWzBdLnRvTG93ZXJDYXNlKCldLG4raVswXS5sZW5ndGgpOi0xfSxCOmZ1bmN0aW9uIEQodCxlLG4pe3ZhciBpPW0uZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC5tPWdbaVswXS50b0xvd2VyQ2FzZSgpXSxuK2lbMF0ubGVuZ3RoKTotMX0sYzpmdW5jdGlvbiBCKHQsbixpKXtyZXR1cm4gRyh0LGUsbixpKX0sZDp0QyxlOnRDLGY6YUMsZzpLVCxHOiRULEg6bkMsSTpuQyxqOmVDLEw6b0MsbTpRVCxNOmlDLHA6ZnVuY3Rpb24gSCh0LGUsbil7dmFyIGk9Yy5leGVjKGUuc2xpY2UobikpO3JldHVybiBpPyh0LnA9dVtpWzBdLnRvTG93ZXJDYXNlKCldLG4raVswXS5sZW5ndGgpOi0xfSxxOkpULFE6bEMsczpjQyxTOnJDLHU6V1QsVTpxVCxWOllULHc6R1QsVzpYVCx4OmZ1bmN0aW9uIEYodCxlLGkpe3JldHVybiBHKHQsbixlLGkpfSxYOmZ1bmN0aW9uIFYodCxlLG4pe3JldHVybiBHKHQsaSxlLG4pfSx5OktULFk6JFQsWjpaVCwiJSI6c0N9O2Z1bmN0aW9uIFUodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGkscixvLGE9W10scz0tMSxsPTAsYz10Lmxlbmd0aDtmb3IobiBpbnN0YW5jZW9mIERhdGV8fChuPW5ldyBEYXRlKCtuKSk7KytzPGM7KTM3PT09dC5jaGFyQ29kZUF0KHMpJiYoYS5wdXNoKHQuc2xpY2UobCxzKSksbnVsbCE9KHI9elRbaT10LmNoYXJBdCgrK3MpXSk/aT10LmNoYXJBdCgrK3MpOnI9ImUiPT09aT8iICI6IjAiLChvPWVbaV0pJiYoaT1vKG4scikpLGEucHVzaChpKSxsPXMrMSk7cmV0dXJuIGEucHVzaCh0LnNsaWNlKGwscykpLGEuam9pbigiIil9fWZ1bmN0aW9uIGoodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGkscixvPWtUKDE5MDAsdm9pZCAwLDEpO2lmKEcobyx0LG4rPSIiLDApIT1uLmxlbmd0aClyZXR1cm4gbnVsbDtpZigiUSJpbiBvKXJldHVybiBuZXcgRGF0ZShvLlEpO2lmKCJzImluIG8pcmV0dXJuIG5ldyBEYXRlKDFlMypvLnMrKCJMImluIG8/by5MOjApKTtpZihlJiYhKCJaImluIG8pJiYoby5aPTApLCJwImluIG8mJihvLkg9by5IJTEyKzEyKm8ucCksdm9pZCAwPT09by5tJiYoby5tPSJxImluIG8/by5xOjApLCJWImluIG8pe2lmKG8uVjwxfHxvLlY+NTMpcmV0dXJuIG51bGw7InciaW4gb3x8KG8udz0xKSwiWiJpbiBvPyhyPShpPUFUKGtUKG8ueSwwLDEpKSkuZ2V0VVRDRGF5KCksaT1yPjR8fDA9PT1yP2xULmNlaWwoaSk6bFQoaSksaT1yVC5vZmZzZXQoaSw3KihvLlYtMSkpLG8ueT1pLmdldFVUQ0Z1bGxZZWFyKCksby5tPWkuZ2V0VVRDTW9udGgoKSxvLmQ9aS5nZXRVVENEYXRlKCkrKG8udys2KSU3KToocj0oaT1DVChrVChvLnksMCwxKSkpLmdldERheSgpLGk9cj40fHwwPT09cj9ORS5jZWlsKGkpOk5FKGkpLGk9QUUub2Zmc2V0KGksNyooby5WLTEpKSxvLnk9aS5nZXRGdWxsWWVhcigpLG8ubT1pLmdldE1vbnRoKCksby5kPWkuZ2V0RGF0ZSgpKyhvLncrNiklNyl9ZWxzZSgiVyJpbiBvfHwiVSJpbiBvKSYmKCJ3ImluIG98fChvLnc9InUiaW4gbz9vLnUlNzoiVyJpbiBvPzE6MCkscj0iWiJpbiBvP0FUKGtUKG8ueSwwLDEpKS5nZXRVVENEYXkoKTpDVChrVChvLnksMCwxKSkuZ2V0RGF5KCksby5tPTAsby5kPSJXImluIG8/KG8udys2KSU3Kzcqby5XLShyKzUpJTc6by53Kzcqby5VLShyKzYpJTcpO3JldHVybiJaImluIG8/KG8uSCs9by5aLzEwMHwwLG8uTSs9by5aJTEwMCxBVChvKSk6Q1Qobyl9fWZ1bmN0aW9uIEcodCxlLG4saSl7Zm9yKHZhciByLG8sYT0wLHM9ZS5sZW5ndGgsbD1uLmxlbmd0aDthPHM7KXtpZihpPj1sKXJldHVybi0xO2lmKDM3PT09KHI9ZS5jaGFyQ29kZUF0KGErKykpKXtpZihyPWUuY2hhckF0KGErKyksIShvPUlbciBpbiB6VD9lLmNoYXJBdChhKyspOnJdKXx8KGk9byh0LG4saSkpPDApcmV0dXJuLTF9ZWxzZSBpZihyIT1uLmNoYXJDb2RlQXQoaSsrKSlyZXR1cm4tMX1yZXR1cm4gaX1yZXR1cm4gdi54PVUobix2KSx2Llg9VShpLHYpLHYuYz1VKGUsdiksVC54PVUobixUKSxULlg9VShpLFQpLFQuYz1VKGUsVCkse2Zvcm1hdDpmdW5jdGlvbih0KXt2YXIgZT1VKHQrPSIiLHYpO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9LHBhcnNlOmZ1bmN0aW9uKHQpe3ZhciBlPWoodCs9IiIsITEpO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9LHV0Y0Zvcm1hdDpmdW5jdGlvbih0KXt2YXIgZT1VKHQrPSIiLFQpO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9LHV0Y1BhcnNlOmZ1bmN0aW9uKHQpe3ZhciBlPWoodCs9IiIsITApO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9fX12YXIgUFQsTlQsSVQsUlQsT1QselQ9eyItIjoiIixfOiIgIiwwOiIwIn0sRFQ9L15ccypcZCsvLEJUPS9eJS8sSFQ9L1tcXF4kKis/fFtcXSgpLnt9XS9nO2Z1bmN0aW9uIEZUKHQsZSxuKXt2YXIgaT10PDA/Ii0iOiIiLHI9KGk/LXQ6dCkrIiIsbz1yLmxlbmd0aDtyZXR1cm4gaSsobzxuP25ldyBBcnJheShuLW8rMSkuam9pbihlKStyOnIpfWZ1bmN0aW9uIFZUKHQpe3JldHVybiB0LnJlcGxhY2UoSFQsIlxcJCYiKX1mdW5jdGlvbiBVVCh0KXtyZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIrdC5tYXAoVlQpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiBqVCh0KXtmb3IodmFyIGU9e30sbj0tMSxpPXQubGVuZ3RoOysrbjxpOyllW3Rbbl0udG9Mb3dlckNhc2UoKV09bjtyZXR1cm4gZX1mdW5jdGlvbiBHVCh0LGUsbil7dmFyIGk9RFQuZXhlYyhlLnNsaWNlKG4sbisxKSk7cmV0dXJuIGk/KHQudz0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBXVCh0LGUsbil7dmFyIGk9RFQuZXhlYyhlLnNsaWNlKG4sbisxKSk7cmV0dXJuIGk/KHQudT0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBxVCh0LGUsbil7dmFyIGk9RFQuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQuVT0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBZVCh0LGUsbil7dmFyIGk9RFQuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQuVj0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBYVCh0LGUsbil7dmFyIGk9RFQuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQuVz0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiAkVCh0LGUsbil7dmFyIGk9RFQuZXhlYyhlLnNsaWNlKG4sbis0KSk7cmV0dXJuIGk/KHQueT0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBLVCh0LGUsbil7dmFyIGk9RFQuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQueT0raVswXSsoK2lbMF0+Njg/MTkwMDoyZTMpLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFpUKHQsZSxuKXt2YXIgaT0vXihaKXwoWystXVxkXGQpKD86Oj8oXGRcZCkpPy8uZXhlYyhlLnNsaWNlKG4sbis2KSk7cmV0dXJuIGk/KHQuWj1pWzFdPzA6LShpWzJdKyhpWzNdfHwiMDAiKSksbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gSlQodCxlLG4pe3ZhciBpPURULmV4ZWMoZS5zbGljZShuLG4rMSkpO3JldHVybiBpPyh0LnE9MyppWzBdLTMsbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gUVQodCxlLG4pe3ZhciBpPURULmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0Lm09aVswXS0xLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHRDKHQsZSxuKXt2YXIgaT1EVC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5kPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGVDKHQsZSxuKXt2YXIgaT1EVC5leGVjKGUuc2xpY2UobixuKzMpKTtyZXR1cm4gaT8odC5tPTAsdC5kPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG5DKHQsZSxuKXt2YXIgaT1EVC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5IPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGlDKHQsZSxuKXt2YXIgaT1EVC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5NPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHJDKHQsZSxuKXt2YXIgaT1EVC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5TPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG9DKHQsZSxuKXt2YXIgaT1EVC5leGVjKGUuc2xpY2UobixuKzMpKTtyZXR1cm4gaT8odC5MPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGFDKHQsZSxuKXt2YXIgaT1EVC5leGVjKGUuc2xpY2UobixuKzYpKTtyZXR1cm4gaT8odC5MPU1hdGguZmxvb3IoaVswXS8xZTMpLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHNDKHQsZSxuKXt2YXIgaT1CVC5leGVjKGUuc2xpY2UobixuKzEpKTtyZXR1cm4gaT9uK2lbMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGxDKHQsZSxuKXt2YXIgaT1EVC5leGVjKGUuc2xpY2UobikpO3JldHVybiBpPyh0LlE9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gY0ModCxlLG4pe3ZhciBpPURULmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIGk/KHQucz0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1Qyh0LGUpe3JldHVybiBGVCh0LmdldERhdGUoKSxlLDIpfWZ1bmN0aW9uIGhDKHQsZSl7cmV0dXJuIEZUKHQuZ2V0SG91cnMoKSxlLDIpfWZ1bmN0aW9uIGRDKHQsZSl7cmV0dXJuIEZUKHQuZ2V0SG91cnMoKSUxMnx8MTIsZSwyKX1mdW5jdGlvbiBwQyh0LGUpe3JldHVybiBGVCgxK0FFLmNvdW50KCRFKHQpLHQpLGUsMyl9ZnVuY3Rpb24gZkModCxlKXtyZXR1cm4gRlQodC5nZXRNaWxsaXNlY29uZHMoKSxlLDMpfWZ1bmN0aW9uIG1DKHQsZSl7cmV0dXJuIGZDKHQsZSkrIjAwMCJ9ZnVuY3Rpb24gZ0ModCxlKXtyZXR1cm4gRlQodC5nZXRNb250aCgpKzEsZSwyKX1mdW5jdGlvbiBfQyh0LGUpe3JldHVybiBGVCh0LmdldE1pbnV0ZXMoKSxlLDIpfWZ1bmN0aW9uIHlDKHQsZSl7cmV0dXJuIEZUKHQuZ2V0U2Vjb25kcygpLGUsMil9ZnVuY3Rpb24gdkModCl7dmFyIGU9dC5nZXREYXkoKTtyZXR1cm4gMD09PWU/NzplfWZ1bmN0aW9uIGJDKHQsZSl7cmV0dXJuIEZUKFBFLmNvdW50KCRFKHQpLTEsdCksZSwyKX1mdW5jdGlvbiB4Qyh0KXt2YXIgZT10LmdldERheSgpO3JldHVybiBlPj00fHwwPT09ZT9PRSh0KTpPRS5jZWlsKHQpfWZ1bmN0aW9uIHdDKHQsZSl7cmV0dXJuIHQ9eEModCksRlQoT0UuY291bnQoJEUodCksdCkrKDQ9PT0kRSh0KS5nZXREYXkoKSksZSwyKX1mdW5jdGlvbiBTQyh0KXtyZXR1cm4gdC5nZXREYXkoKX1mdW5jdGlvbiBNQyh0LGUpe3JldHVybiBGVChORS5jb3VudCgkRSh0KS0xLHQpLGUsMil9ZnVuY3Rpb24gRUModCxlKXtyZXR1cm4gRlQodC5nZXRGdWxsWWVhcigpJTEwMCxlLDIpfWZ1bmN0aW9uIFRDKHQsZSl7cmV0dXJuIEZUKCh0PXhDKHQpKS5nZXRGdWxsWWVhcigpJTEwMCxlLDIpfWZ1bmN0aW9uIENDKHQsZSl7cmV0dXJuIEZUKHQuZ2V0RnVsbFllYXIoKSUxZTQsZSw0KX1mdW5jdGlvbiBBQyh0LGUpe3ZhciBuPXQuZ2V0RGF5KCk7cmV0dXJuIEZUKCh0PW4+PTR8fDA9PT1uP09FKHQpOk9FLmNlaWwodCkpLmdldEZ1bGxZZWFyKCklMWU0LGUsNCl9ZnVuY3Rpb24ga0ModCl7dmFyIGU9dC5nZXRUaW1lem9uZU9mZnNldCgpO3JldHVybihlPjA/Ii0iOihlKj0tMSwiKyIpKStGVChlLzYwfDAsIjAiLDIpK0ZUKGUlNjAsIjAiLDIpfWZ1bmN0aW9uIExDKHQsZSl7cmV0dXJuIEZUKHQuZ2V0VVRDRGF0ZSgpLGUsMil9ZnVuY3Rpb24gUEModCxlKXtyZXR1cm4gRlQodC5nZXRVVENIb3VycygpLGUsMil9ZnVuY3Rpb24gTkModCxlKXtyZXR1cm4gRlQodC5nZXRVVENIb3VycygpJTEyfHwxMixlLDIpfWZ1bmN0aW9uIElDKHQsZSl7cmV0dXJuIEZUKDErclQuY291bnQoRVQodCksdCksZSwzKX1mdW5jdGlvbiBSQyh0LGUpe3JldHVybiBGVCh0LmdldFVUQ01pbGxpc2Vjb25kcygpLGUsMyl9ZnVuY3Rpb24gT0ModCxlKXtyZXR1cm4gUkModCxlKSsiMDAwIn1mdW5jdGlvbiB6Qyh0LGUpe3JldHVybiBGVCh0LmdldFVUQ01vbnRoKCkrMSxlLDIpfWZ1bmN0aW9uIERDKHQsZSl7cmV0dXJuIEZUKHQuZ2V0VVRDTWludXRlcygpLGUsMil9ZnVuY3Rpb24gQkModCxlKXtyZXR1cm4gRlQodC5nZXRVVENTZWNvbmRzKCksZSwyKX1mdW5jdGlvbiBIQyh0KXt2YXIgZT10LmdldFVUQ0RheSgpO3JldHVybiAwPT09ZT83OmV9ZnVuY3Rpb24gRkModCxlKXtyZXR1cm4gRlQoc1QuY291bnQoRVQodCktMSx0KSxlLDIpfWZ1bmN0aW9uIFZDKHQpe3ZhciBlPXQuZ2V0VVRDRGF5KCk7cmV0dXJuIGU+PTR8fDA9PT1lP2hUKHQpOmhULmNlaWwodCl9ZnVuY3Rpb24gVUModCxlKXtyZXR1cm4gdD1WQyh0KSxGVChoVC5jb3VudChFVCh0KSx0KSsoND09PUVUKHQpLmdldFVUQ0RheSgpKSxlLDIpfWZ1bmN0aW9uIGpDKHQpe3JldHVybiB0LmdldFVUQ0RheSgpfWZ1bmN0aW9uIEdDKHQsZSl7cmV0dXJuIEZUKGxULmNvdW50KEVUKHQpLTEsdCksZSwyKX1mdW5jdGlvbiBXQyh0LGUpe3JldHVybiBGVCh0LmdldFVUQ0Z1bGxZZWFyKCklMTAwLGUsMil9ZnVuY3Rpb24gcUModCxlKXtyZXR1cm4gRlQoKHQ9VkModCkpLmdldFVUQ0Z1bGxZZWFyKCklMTAwLGUsMil9ZnVuY3Rpb24gWUModCxlKXtyZXR1cm4gRlQodC5nZXRVVENGdWxsWWVhcigpJTFlNCxlLDQpfWZ1bmN0aW9uIFhDKHQsZSl7dmFyIG49dC5nZXRVVENEYXkoKTtyZXR1cm4gRlQoKHQ9bj49NHx8MD09PW4/aFQodCk6aFQuY2VpbCh0KSkuZ2V0VVRDRnVsbFllYXIoKSUxZTQsZSw0KX1mdW5jdGlvbiAkQygpe3JldHVybiIrMDAwMCJ9ZnVuY3Rpb24gS0MoKXtyZXR1cm4iJSJ9ZnVuY3Rpb24gWkModCl7cmV0dXJuK3R9ZnVuY3Rpb24gSkModCl7cmV0dXJuIE1hdGguZmxvb3IoK3QvMWUzKX1mdW5jdGlvbiBRQyh0KXtyZXR1cm4gUFQ9TFQodCksTlQ9UFQuZm9ybWF0LElUPVBULnBhcnNlLFJUPVBULnV0Y0Zvcm1hdCxPVD1QVC51dGNQYXJzZSxQVH1RQyh7ZGF0ZVRpbWU6IiV4LCAlWCIsZGF0ZToiJS1tLyUtZC8lWSIsdGltZToiJS1JOiVNOiVTICVwIixwZXJpb2RzOlsiQU0iLCJQTSJdLGRheXM6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLHNob3J0RGF5czpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLG1vbnRoczpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sc2hvcnRNb250aHM6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXX0pO3ZhciB0QT0iJVktJW0tJWRUJUg6JU06JVMuJUxaIixlQT1EYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZz9mdW5jdGlvbiBuQSh0KXtyZXR1cm4gdC50b0lTT1N0cmluZygpfTpSVCh0QSksaUE9K25ldyBEYXRlKCIyMDAwLTAxLTAxVDAwOjAwOjAwLjAwMFoiKT9mdW5jdGlvbiByQSh0KXt2YXIgZT1uZXcgRGF0ZSh0KTtyZXR1cm4gaXNOYU4oZSk/bnVsbDplfTpPVCh0QSksb0E9MzE1MzZlNjtmdW5jdGlvbiBhQSh0KXtyZXR1cm4gbmV3IERhdGUodCl9ZnVuY3Rpb24gc0EodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlPyt0OituZXcgRGF0ZSgrdCl9ZnVuY3Rpb24gbEEodCxlLG4saSxyLG8sYSxzLGwpe3ZhciBjPUJNKFBNLFBNKSx1PWMuaW52ZXJ0LGg9Yy5kb21haW4sZD1sKCIuJUwiKSxwPWwoIjolUyIpLGY9bCgiJUk6JU0iKSxtPWwoIiVJICVwIiksZz1sKCIlYSAlZCIpLF89bCgiJWIgJWQiKSx5PWwoIiVCIiksdj1sKCIlWSIpLGI9W1thLDEsMWUzXSxbYSw1LDVlM10sW2EsMTUsMTVlM10sW2EsMzAsM2U0XSxbbywxLDZlNF0sW28sNSwzZTVdLFtvLDE1LDllNV0sW28sMzAsMThlNV0sW3IsMSwzNmU1XSxbciwzLDEwOGU1XSxbciw2LDIxNmU1XSxbciwxMiw0MzJlNV0sW2ksMSw4NjRlNV0sW2ksMiwxNzI4ZTVdLFtuLDEsNjA0OGU1XSxbZSwxLDI1OTJlNl0sW2UsMyw3Nzc2ZTZdLFt0LDEsb0FdXTtmdW5jdGlvbiB4KHMpe3JldHVybihhKHMpPHM/ZDpvKHMpPHM/cDpyKHMpPHM/ZjppKHMpPHM/bTplKHMpPHM/bihzKTxzP2c6Xzp0KHMpPHM/eTp2KShzKX1mdW5jdGlvbiB3KGUsbixpLHIpe2lmKG51bGw9PWUmJihlPTEwKSwibnVtYmVyIj09dHlwZW9mIGUpe3ZhciBvPU1hdGguYWJzKGktbikvZSxhPXhsKChmdW5jdGlvbih0KXtyZXR1cm4gdFsyXX0pKS5yaWdodChiLG8pO2E9PT1iLmxlbmd0aD8ocj1VbChuL29BLGkvb0EsZSksZT10KTphPyhyPShhPWJbby9iW2EtMV1bMl08YlthXVsyXS9vP2EtMTphXSlbMV0sZT1hWzBdKToocj1NYXRoLm1heChVbChuLGksZSksMSksZT1zKX1yZXR1cm4gbnVsbD09cj9lOmUuZXZlcnkocil9cmV0dXJuIGMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRGF0ZSh1KHQpKX0sYy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/aCh3TS5jYWxsKHQsc0EpKTpoKCkubWFwKGFBKX0sYy50aWNrcz1mdW5jdGlvbih0LGUpe3ZhciBuLGk9aCgpLHI9aVswXSxvPWlbaS5sZW5ndGgtMV0sYT1vPHI7cmV0dXJuIGEmJihuPXIscj1vLG89biksbj0obj13KHQscixvLGUpKT9uLnJhbmdlKHIsbysxKTpbXSxhP24ucmV2ZXJzZSgpOm59LGMudGlja0Zvcm1hdD1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT1lP3g6bChlKX0sYy5uaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIG49aCgpO3JldHVybih0PXcodCxuWzBdLG5bbi5sZW5ndGgtMV0sZSkpP2goVU0obix0KSk6Y30sYy5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHpNKGMsbEEodCxlLG4saSxyLG8sYSxzLGwpKX0sY31mdW5jdGlvbiBjQSgpe3JldHVybiB2TS5hcHBseShsQSgkRSxxRSxQRSxBRSxFRSx3RSx2RSxoRSxOVCkuZG9tYWluKFtuZXcgRGF0ZSgyZTMsMCwxKSxuZXcgRGF0ZSgyZTMsMCwyKV0pLGFyZ3VtZW50cyl9ZnVuY3Rpb24gdUEoKXt2YXIgdCxlLG4saSxyLG89MCxhPTEscz1QTSxsPSExO2Z1bmN0aW9uIGMoZSl7cmV0dXJuIGlzTmFOKGU9K2UpP3I6cygwPT09bj8uNTooZT0oaShlKS10KSpuLGw/TWF0aC5tYXgoMCxNYXRoLm1pbigxLGUpKTplKSl9cmV0dXJuIGMuZG9tYWluPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWkobz0rclswXSksZT1pKGE9K3JbMV0pLG49dD09PWU/MDoxLyhlLXQpLGMpOltvLGFdfSxjLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPSEhdCxjKTpsfSxjLmludGVycG9sYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz10LGMpOnN9LGMudW5rbm93bj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LGMpOnJ9LGZ1bmN0aW9uKHIpe3JldHVybiBpPXIsdD1yKG8pLGU9cihhKSxuPXQ9PT1lPzA6MS8oZS10KSxjfX1mdW5jdGlvbiBoQSh0LGUpe3JldHVybiBlLmRvbWFpbih0LmRvbWFpbigpKS5pbnRlcnBvbGF0b3IodC5pbnRlcnBvbGF0b3IoKSkuY2xhbXAodC5jbGFtcCgpKS51bmtub3duKHQudW5rbm93bigpKX1mdW5jdGlvbiBkQSgpe3ZhciB0PWlFKHVBKCkpO3JldHVybiB0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gaEEodCxkQSgpKS5leHBvbmVudCh0LmV4cG9uZW50KCkpfSxiTS5hcHBseSh0LGFyZ3VtZW50cyl9ZnVuY3Rpb24gcEEoKXt2YXIgdCxlLG4saSxyLG8sYSxzPTAsbD0uNSxjPTEsdT1QTSxoPSExO2Z1bmN0aW9uIGQodCl7cmV0dXJuIGlzTmFOKHQ9K3QpP2E6KHQ9LjUrKCh0PStvKHQpKS1lKSoodDxlP2k6ciksdShoP01hdGgubWF4KDAsTWF0aC5taW4oMSx0KSk6dCkpfXJldHVybiBkLmRvbWFpbj1mdW5jdGlvbihhKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1vKHM9K2FbMF0pLGU9byhsPSthWzFdKSxuPW8oYz0rYVsyXSksaT10PT09ZT8wOi41LyhlLXQpLHI9ZT09PW4/MDouNS8obi1lKSxkKTpbcyxsLGNdfSxkLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSEhdCxkKTpofSxkLmludGVycG9sYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LGQpOnV9LGQudW5rbm93bj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT10LGQpOmF9LGZ1bmN0aW9uKGEpe3JldHVybiBvPWEsdD1hKHMpLGU9YShsKSxuPWEoYyksaT10PT09ZT8wOi41LyhlLXQpLHI9ZT09PW4/MDouNS8obi1lKSxkfX1mdW5jdGlvbiBmQSgpe3ZhciB0PWlFKHBBKCkpO3JldHVybiB0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gaEEodCxmQSgpKS5leHBvbmVudCh0LmV4cG9uZW50KCkpfSxiTS5hcHBseSh0LGFyZ3VtZW50cyl9ZnVuY3Rpb24gbUEodCl7Zm9yKHZhciBlPXQubGVuZ3RoLzZ8MCxuPW5ldyBBcnJheShlKSxpPTA7aTxlOyluW2ldPSIjIit0LnNsaWNlKDYqaSw2KisraSk7cmV0dXJuIG59dmFyIGdBPW1BKCIxZjc3YjRmZjdmMGUyY2EwMmNkNjI3Mjg5NDY3YmQ4YzU2NGJlMzc3YzI3ZjdmN2ZiY2JkMjIxN2JlY2YiKSxfQT1tQSgiN2ZjOTdmYmVhZWQ0ZmRjMDg2ZmZmZjk5Mzg2Y2IwZjAwMjdmYmY1YjE3NjY2NjY2IikseUE9bUEoIjFiOWU3N2Q5NWYwMjc1NzBiM2U3Mjk4YTY2YTYxZWU2YWIwMmE2NzYxZDY2NjY2NiIpLHZBPW1BKCJhNmNlZTMxZjc4YjRiMmRmOGEzM2EwMmNmYjlhOTllMzFhMWNmZGJmNmZmZjdmMDBjYWIyZDY2YTNkOWFmZmZmOTliMTU5MjgiKSxiQT1tQSgiZmJiNGFlYjNjZGUzY2NlYmM1ZGVjYmU0ZmVkOWE2ZmZmZmNjZTVkOGJkZmRkYWVjZjJmMmYyIikseEE9bUEoImIzZTJjZGZkY2RhY2NiZDVlOGY0Y2FlNGU2ZjVjOWZmZjJhZWYxZTJjY2NjY2NjYyIpLHdBPW1BKCJlNDFhMWMzNzdlYjg0ZGFmNGE5ODRlYTNmZjdmMDBmZmZmMzNhNjU2MjhmNzgxYmY5OTk5OTkiKSxTQT1tQSgiNjZjMmE1ZmM4ZDYyOGRhMGNiZTc4YWMzYTZkODU0ZmZkOTJmZTVjNDk0YjNiM2IzIiksTUE9bUEoIjhkZDNjN2ZmZmZiM2JlYmFkYWZiODA3MjgwYjFkM2ZkYjQ2MmIzZGU2OWZjY2RlNWQ5ZDlkOWJjODBiZGNjZWJjNWZmZWQ2ZiIpLEVBPW1BKCI0ZTc5YTdmMjhlMmNlMTU3NTk3NmI3YjI1OWExNGZlZGM5NDlhZjdhYTFmZjlkYTc5Yzc1NWZiYWIwYWIiKTtmdW5jdGlvbiBUQSh0KXtyZXR1cm4gTmQodFt0Lmxlbmd0aC0xXSl9dmFyIENBPW5ldyBBcnJheSgzKS5jb25jYXQoImQ4YjM2NWY1ZjVmNTVhYjRhYyIsImE2NjExYWRmYzI3ZDgwY2RjMTAxODU3MSIsImE2NjExYWRmYzI3ZGY1ZjVmNTgwY2RjMTAxODU3MSIsIjhjNTEwYWQ4YjM2NWY2ZThjM2M3ZWFlNTVhYjRhYzAxNjY1ZSIsIjhjNTEwYWQ4YjM2NWY2ZThjM2Y1ZjVmNWM3ZWFlNTVhYjRhYzAxNjY1ZSIsIjhjNTEwYWJmODEyZGRmYzI3ZGY2ZThjM2M3ZWFlNTgwY2RjMTM1OTc4ZjAxNjY1ZSIsIjhjNTEwYWJmODEyZGRmYzI3ZGY2ZThjM2Y1ZjVmNWM3ZWFlNTgwY2RjMTM1OTc4ZjAxNjY1ZSIsIjU0MzAwNThjNTEwYWJmODEyZGRmYzI3ZGY2ZThjM2M3ZWFlNTgwY2RjMTM1OTc4ZjAxNjY1ZTAwM2MzMCIsIjU0MzAwNThjNTEwYWJmODEyZGRmYzI3ZGY2ZThjM2Y1ZjVmNWM3ZWFlNTgwY2RjMTM1OTc4ZjAxNjY1ZTAwM2MzMCIpLm1hcChtQSksQUE9VEEoQ0EpLGtBPW5ldyBBcnJheSgzKS5jb25jYXQoImFmOGRjM2Y3ZjdmNzdmYmY3YiIsIjdiMzI5NGMyYTVjZmE2ZGJhMDAwODgzNyIsIjdiMzI5NGMyYTVjZmY3ZjdmN2E2ZGJhMDAwODgzNyIsIjc2MmE4M2FmOGRjM2U3ZDRlOGQ5ZjBkMzdmYmY3YjFiNzgzNyIsIjc2MmE4M2FmOGRjM2U3ZDRlOGY3ZjdmN2Q5ZjBkMzdmYmY3YjFiNzgzNyIsIjc2MmE4Mzk5NzBhYmMyYTVjZmU3ZDRlOGQ5ZjBkM2E2ZGJhMDVhYWU2MTFiNzgzNyIsIjc2MmE4Mzk5NzBhYmMyYTVjZmU3ZDRlOGY3ZjdmN2Q5ZjBkM2E2ZGJhMDVhYWU2MTFiNzgzNyIsIjQwMDA0Yjc2MmE4Mzk5NzBhYmMyYTVjZmU3ZDRlOGQ5ZjBkM2E2ZGJhMDVhYWU2MTFiNzgzNzAwNDQxYiIsIjQwMDA0Yjc2MmE4Mzk5NzBhYmMyYTVjZmU3ZDRlOGY3ZjdmN2Q5ZjBkM2E2ZGJhMDVhYWU2MTFiNzgzNzAwNDQxYiIpLm1hcChtQSksTEE9VEEoa0EpLFBBPW5ldyBBcnJheSgzKS5jb25jYXQoImU5YTNjOWY3ZjdmN2ExZDc2YSIsImQwMWM4YmYxYjZkYWI4ZTE4NjRkYWMyNiIsImQwMWM4YmYxYjZkYWY3ZjdmN2I4ZTE4NjRkYWMyNiIsImM1MWI3ZGU5YTNjOWZkZTBlZmU2ZjVkMGExZDc2YTRkOTIyMSIsImM1MWI3ZGU5YTNjOWZkZTBlZmY3ZjdmN2U2ZjVkMGExZDc2YTRkOTIyMSIsImM1MWI3ZGRlNzdhZWYxYjZkYWZkZTBlZmU2ZjVkMGI4ZTE4NjdmYmM0MTRkOTIyMSIsImM1MWI3ZGRlNzdhZWYxYjZkYWZkZTBlZmY3ZjdmN2U2ZjVkMGI4ZTE4NjdmYmM0MTRkOTIyMSIsIjhlMDE1MmM1MWI3ZGRlNzdhZWYxYjZkYWZkZTBlZmU2ZjVkMGI4ZTE4NjdmYmM0MTRkOTIyMTI3NjQxOSIsIjhlMDE1MmM1MWI3ZGRlNzdhZWYxYjZkYWZkZTBlZmY3ZjdmN2U2ZjVkMGI4ZTE4NjdmYmM0MTRkOTIyMTI3NjQxOSIpLm1hcChtQSksTkE9VEEoUEEpLElBPW5ldyBBcnJheSgzKS5jb25jYXQoIjk5OGVjM2Y3ZjdmN2YxYTM0MCIsIjVlM2M5OWIyYWJkMmZkYjg2M2U2NjEwMSIsIjVlM2M5OWIyYWJkMmY3ZjdmN2ZkYjg2M2U2NjEwMSIsIjU0Mjc4ODk5OGVjM2Q4ZGFlYmZlZTBiNmYxYTM0MGIzNTgwNiIsIjU0Mjc4ODk5OGVjM2Q4ZGFlYmY3ZjdmN2ZlZTBiNmYxYTM0MGIzNTgwNiIsIjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNiIsIjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmY3ZjdmN2ZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNiIsIjJkMDA0YjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNjdmM2IwOCIsIjJkMDA0YjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmY3ZjdmN2ZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNjdmM2IwOCIpLm1hcChtQSksUkE9VEEoSUEpLE9BPW5ldyBBcnJheSgzKS5jb25jYXQoImVmOGE2MmY3ZjdmNzY3YTljZiIsImNhMDAyMGY0YTU4MjkyYzVkZTA1NzFiMCIsImNhMDAyMGY0YTU4MmY3ZjdmNzkyYzVkZTA1NzFiMCIsImIyMTgyYmVmOGE2MmZkZGJjN2QxZTVmMDY3YTljZjIxNjZhYyIsImIyMTgyYmVmOGE2MmZkZGJjN2Y3ZjdmN2QxZTVmMDY3YTljZjIxNjZhYyIsImIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2QxZTVmMDkyYzVkZTQzOTNjMzIxNjZhYyIsImIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2Y3ZjdmN2QxZTVmMDkyYzVkZTQzOTNjMzIxNjZhYyIsIjY3MDAxZmIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2QxZTVmMDkyYzVkZTQzOTNjMzIxNjZhYzA1MzA2MSIsIjY3MDAxZmIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2Y3ZjdmN2QxZTVmMDkyYzVkZTQzOTNjMzIxNjZhYzA1MzA2MSIpLm1hcChtQSksekE9VEEoT0EpLERBPW5ldyBBcnJheSgzKS5jb25jYXQoImVmOGE2MmZmZmZmZjk5OTk5OSIsImNhMDAyMGY0YTU4MmJhYmFiYTQwNDA0MCIsImNhMDAyMGY0YTU4MmZmZmZmZmJhYmFiYTQwNDA0MCIsImIyMTgyYmVmOGE2MmZkZGJjN2UwZTBlMDk5OTk5OTRkNGQ0ZCIsImIyMTgyYmVmOGE2MmZkZGJjN2ZmZmZmZmUwZTBlMDk5OTk5OTRkNGQ0ZCIsImIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2UwZTBlMGJhYmFiYTg3ODc4NzRkNGQ0ZCIsImIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2ZmZmZmZmUwZTBlMGJhYmFiYTg3ODc4NzRkNGQ0ZCIsIjY3MDAxZmIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2UwZTBlMGJhYmFiYTg3ODc4NzRkNGQ0ZDFhMWExYSIsIjY3MDAxZmIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2ZmZmZmZmUwZTBlMGJhYmFiYTg3ODc4NzRkNGQ0ZDFhMWExYSIpLm1hcChtQSksQkE9VEEoREEpLEhBPW5ldyBBcnJheSgzKS5jb25jYXQoImZjOGQ1OWZmZmZiZjkxYmZkYiIsImQ3MTkxY2ZkYWU2MWFiZDllOTJjN2JiNiIsImQ3MTkxY2ZkYWU2MWZmZmZiZmFiZDllOTJjN2JiNiIsImQ3MzAyN2ZjOGQ1OWZlZTA5MGUwZjNmODkxYmZkYjQ1NzViNCIsImQ3MzAyN2ZjOGQ1OWZlZTA5MGZmZmZiZmUwZjNmODkxYmZkYjQ1NzViNCIsImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNCIsImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGZmZmZiZmUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNCIsImE1MDAyNmQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNDMxMzY5NSIsImE1MDAyNmQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGZmZmZiZmUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNDMxMzY5NSIpLm1hcChtQSksRkE9VEEoSEEpLFZBPW5ldyBBcnJheSgzKS5jb25jYXQoImZjOGQ1OWZmZmZiZjkxY2Y2MCIsImQ3MTkxY2ZkYWU2MWE2ZDk2YTFhOTY0MSIsImQ3MTkxY2ZkYWU2MWZmZmZiZmE2ZDk2YTFhOTY0MSIsImQ3MzAyN2ZjOGQ1OWZlZTA4YmQ5ZWY4YjkxY2Y2MDFhOTg1MCIsImQ3MzAyN2ZjOGQ1OWZlZTA4YmZmZmZiZmQ5ZWY4YjkxY2Y2MDFhOTg1MCIsImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4YmQ5ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MCIsImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmQ5ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MCIsImE1MDAyNmQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4YmQ5ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MDAwNjgzNyIsImE1MDAyNmQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmQ5ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MDAwNjgzNyIpLm1hcChtQSksVUE9VEEoVkEpLGpBPW5ldyBBcnJheSgzKS5jb25jYXQoImZjOGQ1OWZmZmZiZjk5ZDU5NCIsImQ3MTkxY2ZkYWU2MWFiZGRhNDJiODNiYSIsImQ3MTkxY2ZkYWU2MWZmZmZiZmFiZGRhNDJiODNiYSIsImQ1M2U0ZmZjOGQ1OWZlZTA4YmU2ZjU5ODk5ZDU5NDMyODhiZCIsImQ1M2U0ZmZjOGQ1OWZlZTA4YmZmZmZiZmU2ZjU5ODk5ZDU5NDMyODhiZCIsImQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZCIsImQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZCIsIjllMDE0MmQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZDVlNGZhMiIsIjllMDE0MmQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZDVlNGZhMiIpLm1hcChtQSksR0E9VEEoakEpLFdBPW5ldyBBcnJheSgzKS5jb25jYXQoImU1ZjVmOTk5ZDhjOTJjYTI1ZiIsImVkZjhmYmIyZTJlMjY2YzJhNDIzOGI0NSIsImVkZjhmYmIyZTJlMjY2YzJhNDJjYTI1ZjAwNmQyYyIsImVkZjhmYmNjZWNlNjk5ZDhjOTY2YzJhNDJjYTI1ZjAwNmQyYyIsImVkZjhmYmNjZWNlNjk5ZDhjOTY2YzJhNDQxYWU3NjIzOGI0NTAwNTgyNCIsImY3ZmNmZGU1ZjVmOWNjZWNlNjk5ZDhjOTY2YzJhNDQxYWU3NjIzOGI0NTAwNTgyNCIsImY3ZmNmZGU1ZjVmOWNjZWNlNjk5ZDhjOTY2YzJhNDQxYWU3NjIzOGI0NTAwNmQyYzAwNDQxYiIpLm1hcChtQSkscUE9VEEoV0EpLFlBPW5ldyBBcnJheSgzKS5jb25jYXQoImUwZWNmNDllYmNkYTg4NTZhNyIsImVkZjhmYmIzY2RlMzhjOTZjNjg4NDE5ZCIsImVkZjhmYmIzY2RlMzhjOTZjNjg4NTZhNzgxMGY3YyIsImVkZjhmYmJmZDNlNjllYmNkYThjOTZjNjg4NTZhNzgxMGY3YyIsImVkZjhmYmJmZDNlNjllYmNkYThjOTZjNjhjNmJiMTg4NDE5ZDZlMDE2YiIsImY3ZmNmZGUwZWNmNGJmZDNlNjllYmNkYThjOTZjNjhjNmJiMTg4NDE5ZDZlMDE2YiIsImY3ZmNmZGUwZWNmNGJmZDNlNjllYmNkYThjOTZjNjhjNmJiMTg4NDE5ZDgxMGY3YzRkMDA0YiIpLm1hcChtQSksWEE9VEEoWUEpLCRBPW5ldyBBcnJheSgzKS5jb25jYXQoImUwZjNkYmE4ZGRiNTQzYTJjYSIsImYwZjllOGJhZTRiYzdiY2NjNDJiOGNiZSIsImYwZjllOGJhZTRiYzdiY2NjNDQzYTJjYTA4NjhhYyIsImYwZjllOGNjZWJjNWE4ZGRiNTdiY2NjNDQzYTJjYTA4NjhhYyIsImYwZjllOGNjZWJjNWE4ZGRiNTdiY2NjNDRlYjNkMzJiOGNiZTA4NTg5ZSIsImY3ZmNmMGUwZjNkYmNjZWJjNWE4ZGRiNTdiY2NjNDRlYjNkMzJiOGNiZTA4NTg5ZSIsImY3ZmNmMGUwZjNkYmNjZWJjNWE4ZGRiNTdiY2NjNDRlYjNkMzJiOGNiZTA4NjhhYzA4NDA4MSIpLm1hcChtQSksS0E9VEEoJEEpLFpBPW5ldyBBcnJheSgzKS5jb25jYXQoImZlZThjOGZkYmI4NGUzNGEzMyIsImZlZjBkOWZkY2M4YWZjOGQ1OWQ3MzAxZiIsImZlZjBkOWZkY2M4YWZjOGQ1OWUzNGEzM2IzMDAwMCIsImZlZjBkOWZkZDQ5ZWZkYmI4NGZjOGQ1OWUzNGEzM2IzMDAwMCIsImZlZjBkOWZkZDQ5ZWZkYmI4NGZjOGQ1OWVmNjU0OGQ3MzAxZjk5MDAwMCIsImZmZjdlY2ZlZThjOGZkZDQ5ZWZkYmI4NGZjOGQ1OWVmNjU0OGQ3MzAxZjk5MDAwMCIsImZmZjdlY2ZlZThjOGZkZDQ5ZWZkYmI4NGZjOGQ1OWVmNjU0OGQ3MzAxZmIzMDAwMDdmMDAwMCIpLm1hcChtQSksSkE9VEEoWkEpLFFBPW5ldyBBcnJheSgzKS5jb25jYXQoImVjZTJmMGE2YmRkYjFjOTA5OSIsImY2ZWZmN2JkYzllMTY3YTljZjAyODE4YSIsImY2ZWZmN2JkYzllMTY3YTljZjFjOTA5OTAxNmM1OSIsImY2ZWZmN2QwZDFlNmE2YmRkYjY3YTljZjFjOTA5OTAxNmM1OSIsImY2ZWZmN2QwZDFlNmE2YmRkYjY3YTljZjM2OTBjMDAyODE4YTAxNjQ1MCIsImZmZjdmYmVjZTJmMGQwZDFlNmE2YmRkYjY3YTljZjM2OTBjMDAyODE4YTAxNjQ1MCIsImZmZjdmYmVjZTJmMGQwZDFlNmE2YmRkYjY3YTljZjM2OTBjMDAyODE4YTAxNmM1OTAxNDYzNiIpLm1hcChtQSksdGs9VEEoUUEpLGVrPW5ldyBBcnJheSgzKS5jb25jYXQoImVjZTdmMmE2YmRkYjJiOGNiZSIsImYxZWVmNmJkYzllMTc0YTljZjA1NzBiMCIsImYxZWVmNmJkYzllMTc0YTljZjJiOGNiZTA0NWE4ZCIsImYxZWVmNmQwZDFlNmE2YmRkYjc0YTljZjJiOGNiZTA0NWE4ZCIsImYxZWVmNmQwZDFlNmE2YmRkYjc0YTljZjM2OTBjMDA1NzBiMDAzNGU3YiIsImZmZjdmYmVjZTdmMmQwZDFlNmE2YmRkYjc0YTljZjM2OTBjMDA1NzBiMDAzNGU3YiIsImZmZjdmYmVjZTdmMmQwZDFlNmE2YmRkYjc0YTljZjM2OTBjMDA1NzBiMDA0NWE4ZDAyMzg1OCIpLm1hcChtQSksbms9VEEoZWspLGlrPW5ldyBBcnJheSgzKS5jb25jYXQoImU3ZTFlZmM5OTRjN2RkMWM3NyIsImYxZWVmNmQ3YjVkOGRmNjViMGNlMTI1NiIsImYxZWVmNmQ3YjVkOGRmNjViMGRkMWM3Nzk4MDA0MyIsImYxZWVmNmQ0YjlkYWM5OTRjN2RmNjViMGRkMWM3Nzk4MDA0MyIsImYxZWVmNmQ0YjlkYWM5OTRjN2RmNjViMGU3Mjk4YWNlMTI1NjkxMDAzZiIsImY3ZjRmOWU3ZTFlZmQ0YjlkYWM5OTRjN2RmNjViMGU3Mjk4YWNlMTI1NjkxMDAzZiIsImY3ZjRmOWU3ZTFlZmQ0YjlkYWM5OTRjN2RmNjViMGU3Mjk4YWNlMTI1Njk4MDA0MzY3MDAxZiIpLm1hcChtQSkscms9VEEoaWspLG9rPW5ldyBBcnJheSgzKS5jb25jYXQoImZkZTBkZGZhOWZiNWM1MWI4YSIsImZlZWJlMmZiYjRiOWY3NjhhMWFlMDE3ZSIsImZlZWJlMmZiYjRiOWY3NjhhMWM1MWI4YTdhMDE3NyIsImZlZWJlMmZjYzVjMGZhOWZiNWY3NjhhMWM1MWI4YTdhMDE3NyIsImZlZWJlMmZjYzVjMGZhOWZiNWY3NjhhMWRkMzQ5N2FlMDE3ZTdhMDE3NyIsImZmZjdmM2ZkZTBkZGZjYzVjMGZhOWZiNWY3NjhhMWRkMzQ5N2FlMDE3ZTdhMDE3NyIsImZmZjdmM2ZkZTBkZGZjYzVjMGZhOWZiNWY3NjhhMWRkMzQ5N2FlMDE3ZTdhMDE3NzQ5MDA2YSIpLm1hcChtQSksYWs9VEEob2spLHNrPW5ldyBBcnJheSgzKS5jb25jYXQoImVkZjhiMTdmY2RiYjJjN2ZiOCIsImZmZmZjY2ExZGFiNDQxYjZjNDIyNWVhOCIsImZmZmZjY2ExZGFiNDQxYjZjNDJjN2ZiODI1MzQ5NCIsImZmZmZjY2M3ZTliNDdmY2RiYjQxYjZjNDJjN2ZiODI1MzQ5NCIsImZmZmZjY2M3ZTliNDdmY2RiYjQxYjZjNDFkOTFjMDIyNWVhODBjMmM4NCIsImZmZmZkOWVkZjhiMWM3ZTliNDdmY2RiYjQxYjZjNDFkOTFjMDIyNWVhODBjMmM4NCIsImZmZmZkOWVkZjhiMWM3ZTliNDdmY2RiYjQxYjZjNDFkOTFjMDIyNWVhODI1MzQ5NDA4MWQ1OCIpLm1hcChtQSksbGs9VEEoc2spLGNrPW5ldyBBcnJheSgzKS5jb25jYXQoImY3ZmNiOWFkZGQ4ZTMxYTM1NCIsImZmZmZjY2MyZTY5OTc4YzY3OTIzODQ0MyIsImZmZmZjY2MyZTY5OTc4YzY3OTMxYTM1NDAwNjgzNyIsImZmZmZjY2Q5ZjBhM2FkZGQ4ZTc4YzY3OTMxYTM1NDAwNjgzNyIsImZmZmZjY2Q5ZjBhM2FkZGQ4ZTc4YzY3OTQxYWI1ZDIzODQ0MzAwNWEzMiIsImZmZmZlNWY3ZmNiOWQ5ZjBhM2FkZGQ4ZTc4YzY3OTQxYWI1ZDIzODQ0MzAwNWEzMiIsImZmZmZlNWY3ZmNiOWQ5ZjBhM2FkZGQ4ZTc4YzY3OTQxYWI1ZDIzODQ0MzAwNjgzNzAwNDUyOSIpLm1hcChtQSksdWs9VEEoY2spLGhrPW5ldyBBcnJheSgzKS5jb25jYXQoImZmZjdiY2ZlYzQ0ZmQ5NWYwZSIsImZmZmZkNGZlZDk4ZWZlOTkyOWNjNGMwMiIsImZmZmZkNGZlZDk4ZWZlOTkyOWQ5NWYwZTk5MzQwNCIsImZmZmZkNGZlZTM5MWZlYzQ0ZmZlOTkyOWQ5NWYwZTk5MzQwNCIsImZmZmZkNGZlZTM5MWZlYzQ0ZmZlOTkyOWVjNzAxNGNjNGMwMjhjMmQwNCIsImZmZmZlNWZmZjdiY2ZlZTM5MWZlYzQ0ZmZlOTkyOWVjNzAxNGNjNGMwMjhjMmQwNCIsImZmZmZlNWZmZjdiY2ZlZTM5MWZlYzQ0ZmZlOTkyOWVjNzAxNGNjNGMwMjk5MzQwNDY2MjUwNiIpLm1hcChtQSksZGs9VEEoaGspLHBrPW5ldyBBcnJheSgzKS5jb25jYXQoImZmZWRhMGZlYjI0Y2YwM2IyMCIsImZmZmZiMmZlY2M1Y2ZkOGQzY2UzMWExYyIsImZmZmZiMmZlY2M1Y2ZkOGQzY2YwM2IyMGJkMDAyNiIsImZmZmZiMmZlZDk3NmZlYjI0Y2ZkOGQzY2YwM2IyMGJkMDAyNiIsImZmZmZiMmZlZDk3NmZlYjI0Y2ZkOGQzY2ZjNGUyYWUzMWExY2IxMDAyNiIsImZmZmZjY2ZmZWRhMGZlZDk3NmZlYjI0Y2ZkOGQzY2ZjNGUyYWUzMWExY2IxMDAyNiIsImZmZmZjY2ZmZWRhMGZlZDk3NmZlYjI0Y2ZkOGQzY2ZjNGUyYWUzMWExY2JkMDAyNjgwMDAyNiIpLm1hcChtQSksZms9VEEocGspLG1rPW5ldyBBcnJheSgzKS5jb25jYXQoImRlZWJmNzllY2FlMTMxODJiZCIsImVmZjNmZmJkZDdlNzZiYWVkNjIxNzFiNSIsImVmZjNmZmJkZDdlNzZiYWVkNjMxODJiZDA4NTE5YyIsImVmZjNmZmM2ZGJlZjllY2FlMTZiYWVkNjMxODJiZDA4NTE5YyIsImVmZjNmZmM2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NDU5NCIsImY3ZmJmZmRlZWJmN2M2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NDU5NCIsImY3ZmJmZmRlZWJmN2M2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NTE5YzA4MzA2YiIpLm1hcChtQSksZ2s9VEEobWspLF9rPW5ldyBBcnJheSgzKS5jb25jYXQoImU1ZjVlMGExZDk5YjMxYTM1NCIsImVkZjhlOWJhZTRiMzc0YzQ3NjIzOGI0NSIsImVkZjhlOWJhZTRiMzc0YzQ3NjMxYTM1NDAwNmQyYyIsImVkZjhlOWM3ZTljMGExZDk5Yjc0YzQ3NjMxYTM1NDAwNmQyYyIsImVkZjhlOWM3ZTljMGExZDk5Yjc0YzQ3NjQxYWI1ZDIzOGI0NTAwNWEzMiIsImY3ZmNmNWU1ZjVlMGM3ZTljMGExZDk5Yjc0YzQ3NjQxYWI1ZDIzOGI0NTAwNWEzMiIsImY3ZmNmNWU1ZjVlMGM3ZTljMGExZDk5Yjc0YzQ3NjQxYWI1ZDIzOGI0NTAwNmQyYzAwNDQxYiIpLm1hcChtQSkseWs9VEEoX2spLHZrPW5ldyBBcnJheSgzKS5jb25jYXQoImYwZjBmMGJkYmRiZDYzNjM2MyIsImY3ZjdmN2NjY2NjYzk2OTY5NjUyNTI1MiIsImY3ZjdmN2NjY2NjYzk2OTY5NjYzNjM2MzI1MjUyNSIsImY3ZjdmN2Q5ZDlkOWJkYmRiZDk2OTY5NjYzNjM2MzI1MjUyNSIsImY3ZjdmN2Q5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUyNTI1MjI1MjUyNSIsImZmZmZmZmYwZjBmMGQ5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUyNTI1MjI1MjUyNSIsImZmZmZmZmYwZjBmMGQ5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUyNTI1MjI1MjUyNTAwMDAwMCIpLm1hcChtQSksYms9VEEodmspLHhrPW5ldyBBcnJheSgzKS5jb25jYXQoImVmZWRmNWJjYmRkYzc1NmJiMSIsImYyZjBmN2NiYzllMjllOWFjODZhNTFhMyIsImYyZjBmN2NiYzllMjllOWFjODc1NmJiMTU0Mjc4ZiIsImYyZjBmN2RhZGFlYmJjYmRkYzllOWFjODc1NmJiMTU0Mjc4ZiIsImYyZjBmN2RhZGFlYmJjYmRkYzllOWFjODgwN2RiYTZhNTFhMzRhMTQ4NiIsImZjZmJmZGVmZWRmNWRhZGFlYmJjYmRkYzllOWFjODgwN2RiYTZhNTFhMzRhMTQ4NiIsImZjZmJmZGVmZWRmNWRhZGFlYmJjYmRkYzllOWFjODgwN2RiYTZhNTFhMzU0Mjc4ZjNmMDA3ZCIpLm1hcChtQSksd2s9VEEoeGspLFNrPW5ldyBBcnJheSgzKS5jb25jYXQoImZlZTBkMmZjOTI3MmRlMmQyNiIsImZlZTVkOWZjYWU5MWZiNmE0YWNiMTgxZCIsImZlZTVkOWZjYWU5MWZiNmE0YWRlMmQyNmE1MGYxNSIsImZlZTVkOWZjYmJhMWZjOTI3MmZiNmE0YWRlMmQyNmE1MGYxNSIsImZlZTVkOWZjYmJhMWZjOTI3MmZiNmE0YWVmM2IyY2NiMTgxZDk5MDAwZCIsImZmZjVmMGZlZTBkMmZjYmJhMWZjOTI3MmZiNmE0YWVmM2IyY2NiMTgxZDk5MDAwZCIsImZmZjVmMGZlZTBkMmZjYmJhMWZjOTI3MmZiNmE0YWVmM2IyY2NiMTgxZGE1MGYxNTY3MDAwZCIpLm1hcChtQSksTWs9VEEoU2spLEVrPW5ldyBBcnJheSgzKS5jb25jYXQoImZlZTZjZWZkYWU2YmU2NTUwZCIsImZlZWRkZWZkYmU4NWZkOGQzY2Q5NDcwMSIsImZlZWRkZWZkYmU4NWZkOGQzY2U2NTUwZGE2MzYwMyIsImZlZWRkZWZkZDBhMmZkYWU2YmZkOGQzY2U2NTUwZGE2MzYwMyIsImZlZWRkZWZkZDBhMmZkYWU2YmZkOGQzY2YxNjkxM2Q5NDgwMThjMmQwNCIsImZmZjVlYmZlZTZjZWZkZDBhMmZkYWU2YmZkOGQzY2YxNjkxM2Q5NDgwMThjMmQwNCIsImZmZjVlYmZlZTZjZWZkZDBhMmZkYWU2YmZkOGQzY2YxNjkxM2Q5NDgwMWE2MzYwMzdmMjcwNCIpLm1hcChtQSksVGs9VEEoRWspLENrPV9wKHhkKDMwMCwuNSwwKSx4ZCgtMjQwLC41LDEpKSxBaz1fcCh4ZCgtMTAwLC43NSwuMzUpLHhkKDgwLDEuNSwuOCkpLGtrPV9wKHhkKDI2MCwuNzUsLjM1KSx4ZCg4MCwxLjUsLjgpKSxMaz14ZCgpLFBrPVVoKCksTms9TWF0aC5QSS8zLElrPTIqTWF0aC5QSS8zO2Z1bmN0aW9uIFJrKHQpe3ZhciBlPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdFtNYXRoLm1heCgwLE1hdGgubWluKGUtMSxNYXRoLmZsb29yKG4qZSkpKV19fXZhciBPaz1SayhtQSgiNDQwMTU0NDQwMjU2NDUwNDU3NDUwNTU5NDYwNzVhNDYwODVjNDYwYTVkNDYwYjVlNDcwZDYwNDcwZTYxNDcxMDYzNDcxMTY0NDcxMzY1NDgxNDY3NDgxNjY4NDgxNzY5NDgxODZhNDgxYTZjNDgxYjZkNDgxYzZlNDgxZDZmNDgxZjcwNDgyMDcxNDgyMTczNDgyMzc0NDgyNDc1NDgyNTc2NDgyNjc3NDgyODc4NDgyOTc5NDcyYTdhNDcyYzdhNDcyZDdiNDcyZTdjNDcyZjdkNDYzMDdlNDYzMjdlNDYzMzdmNDYzNDgwNDUzNTgxNDUzNzgxNDUzODgyNDQzOTgzNDQzYTgzNDQzYjg0NDMzZDg0NDMzZTg1NDIzZjg1NDI0MDg2NDI0MTg2NDE0Mjg3NDE0NDg3NDA0NTg4NDA0Njg4M2Y0Nzg4M2Y0ODg5M2U0OTg5M2U0YTg5M2U0YzhhM2Q0ZDhhM2Q0ZThhM2M0ZjhhM2M1MDhiM2I1MThiM2I1MjhiM2E1MzhiM2E1NDhjMzk1NThjMzk1NjhjMzg1ODhjMzg1OThjMzc1YThjMzc1YjhkMzY1YzhkMzY1ZDhkMzU1ZThkMzU1ZjhkMzQ2MDhkMzQ2MThkMzM2MjhkMzM2MzhkMzI2NDhlMzI2NThlMzE2NjhlMzE2NzhlMzE2ODhlMzA2OThlMzA2YThlMmY2YjhlMmY2YzhlMmU2ZDhlMmU2ZThlMmU2ZjhlMmQ3MDhlMmQ3MThlMmM3MThlMmM3MjhlMmM3MzhlMmI3NDhlMmI3NThlMmE3NjhlMmE3NzhlMmE3ODhlMjk3OThlMjk3YThlMjk3YjhlMjg3YzhlMjg3ZDhlMjc3ZThlMjc3ZjhlMjc4MDhlMjY4MThlMjY4MjhlMjY4MjhlMjU4MzhlMjU4NDhlMjU4NThlMjQ4NjhlMjQ4NzhlMjM4ODhlMjM4OThlMjM4YThkMjI4YjhkMjI4YzhkMjI4ZDhkMjE4ZThkMjE4ZjhkMjE5MDhkMjE5MThjMjA5MjhjMjA5MjhjMjA5MzhjMWY5NDhjMWY5NThiMWY5NjhiMWY5NzhiMWY5ODhiMWY5OThhMWY5YThhMWU5YjhhMWU5Yzg5MWU5ZDg5MWY5ZTg5MWY5Zjg4MWZhMDg4MWZhMTg4MWZhMTg3MWZhMjg3MjBhMzg2MjBhNDg2MjFhNTg1MjFhNjg1MjJhNzg1MjJhODg0MjNhOTgzMjRhYTgzMjVhYjgyMjVhYzgyMjZhZDgxMjdhZDgxMjhhZTgwMjlhZjdmMmFiMDdmMmNiMTdlMmRiMjdkMmViMzdjMmZiNDdjMzFiNTdiMzJiNjdhMzRiNjc5MzViNzc5MzdiODc4MzhiOTc3M2FiYTc2M2JiYjc1M2RiYzc0M2ZiYzczNDBiZDcyNDJiZTcxNDRiZjcwNDZjMDZmNDhjMTZlNGFjMTZkNGNjMjZjNGVjMzZiNTBjNDZhNTJjNTY5NTRjNTY4NTZjNjY3NThjNzY1NWFjODY0NWNjODYzNWVjOTYyNjBjYTYwNjNjYjVmNjVjYjVlNjdjYzVjNjljZDViNmNjZDVhNmVjZTU4NzBjZjU3NzNkMDU2NzVkMDU0NzdkMTUzN2FkMTUxN2NkMjUwN2ZkMzRlODFkMzRkODRkNDRiODZkNTQ5ODlkNTQ4OGJkNjQ2OGVkNjQ1OTBkNzQzOTNkNzQxOTVkODQwOThkODNlOWJkOTNjOWRkOTNiYTBkYTM5YTJkYTM3YTVkYjM2YThkYjM0YWFkYzMyYWRkYzMwYjBkZDJmYjJkZDJkYjVkZTJiYjhkZTI5YmFkZTI4YmRkZjI2YzBkZjI1YzJkZjIzYzVlMDIxYzhlMDIwY2FlMTFmY2RlMTFkZDBlMTFjZDJlMjFiZDVlMjFhZDhlMjE5ZGFlMzE5ZGRlMzE4ZGZlMzE4ZTJlNDE4ZTVlNDE5ZTdlNDE5ZWFlNTFhZWNlNTFiZWZlNTFjZjFlNTFkZjRlNjFlZjZlNjIwZjhlNjIxZmJlNzIzZmRlNzI1IikpLHprPVJrKG1BKCIwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMDkwMjAyMGIwMjAyMGQwMzAzMGYwMzAzMTIwNDA0MTQwNTA0MTYwNjA1MTgwNjA1MWEwNzA2MWMwODA3MWUwOTA3MjAwYTA4MjIwYjA5MjQwYzA5MjYwZDBhMjkwZTBiMmIxMDBiMmQxMTBjMmYxMjBkMzExMzBkMzQxNDBlMzYxNTBlMzgxNjBmM2IxODBmM2QxOTEwM2YxYTEwNDIxYzEwNDQxZDExNDcxZTExNDkyMDExNGIyMTExNGUyMjExNTAyNDEyNTMyNTEyNTUyNzEyNTgyOTExNWEyYTExNWMyYzExNWYyZDExNjEyZjExNjMzMTExNjUzMzEwNjczNDEwNjkzNjEwNmIzODEwNmMzOTBmNmUzYjBmNzAzZDBmNzEzZjBmNzI0MDBmNzQ0MjBmNzU0NDBmNzY0NTEwNzc0NzEwNzg0OTEwNzg0YTEwNzk0YzExN2E0ZTExN2I0ZjEyN2I1MTEyN2M1MjEzN2M1NDEzN2Q1NjE0N2Q1NzE1N2U1OTE1N2U1YTE2N2U1YzE2N2Y1ZDE3N2Y1ZjE4N2Y2MDE4ODA2MjE5ODA2NDFhODA2NTFhODA2NzFiODA2ODFjODE2YTFjODE2YjFkODE2ZDFkODE2ZTFlODE3MDFmODE3MjFmODE3MzIwODE3NTIxODE3NjIxODE3ODIyODE3OTIyODI3YjIzODI3YzIzODI3ZTI0ODI4MDI1ODI4MTI1ODE4MzI2ODE4NDI2ODE4NjI3ODE4ODI3ODE4OTI4ODE4YjI5ODE4YzI5ODE4ZTJhODE5MDJhODE5MTJiODE5MzJiODA5NDJjODA5NjJjODA5ODJkODA5OTJkODA5YjJlN2Y5YzJlN2Y5ZTJmN2ZhMDJmN2ZhMTMwN2VhMzMwN2VhNTMxN2VhNjMxN2RhODMyN2RhYTMzN2RhYjMzN2NhZDM0N2NhZTM0N2JiMDM1N2JiMjM1N2JiMzM2N2FiNTM2N2FiNzM3NzliODM3NzliYTM4NzhiYzM5NzhiZDM5NzdiZjNhNzdjMDNhNzZjMjNiNzVjNDNjNzVjNTNjNzRjNzNkNzNjODNlNzNjYTNlNzJjYzNmNzFjZDQwNzFjZjQwNzBkMDQxNmZkMjQyNmZkMzQzNmVkNTQ0NmRkNjQ1NmNkODQ1NmNkOTQ2NmJkYjQ3NmFkYzQ4NjlkZTQ5NjhkZjRhNjhlMDRjNjdlMjRkNjZlMzRlNjVlNDRmNjRlNTUwNjRlNzUyNjNlODUzNjJlOTU0NjJlYTU2NjFlYjU3NjBlYzU4NjBlZDVhNWZlZTViNWVlZjVkNWVmMDVmNWVmMTYwNWRmMjYyNWRmMjY0NWNmMzY1NWNmNDY3NWNmNDY5NWNmNTZiNWNmNjZjNWNmNjZlNWNmNzcwNWNmNzcyNWNmODc0NWNmODc2NWNmOTc4NWRmOTc5NWRmOTdiNWRmYTdkNWVmYTdmNWVmYTgxNWZmYjgzNWZmYjg1NjBmYjg3NjFmYzg5NjFmYzhhNjJmYzhjNjNmYzhlNjRmYzkwNjVmZDkyNjZmZDk0NjdmZDk2NjhmZDk4NjlmZDlhNmFmZDliNmJmZTlkNmNmZTlmNmRmZWExNmVmZWEzNmZmZWE1NzFmZWE3NzJmZWE5NzNmZWFhNzRmZWFjNzZmZWFlNzdmZWIwNzhmZWIyN2FmZWI0N2JmZWI2N2NmZWI3N2VmZWI5N2ZmZWJiODFmZWJkODJmZWJmODRmZWMxODVmZWMyODdmZWM0ODhmZWM2OGFmZWM4OGNmZWNhOGRmZWNjOGZmZWNkOTBmZWNmOTJmZWQxOTRmZWQzOTVmZWQ1OTdmZWQ3OTlmZWQ4OWFmZGRhOWNmZGRjOWVmZGRlYTBmZGUwYTFmZGUyYTNmZGUzYTVmZGU1YTdmZGU3YTlmZGU5YWFmZGViYWNmY2VjYWVmY2VlYjBmY2YwYjJmY2YyYjRmY2Y0YjZmY2Y2YjhmY2Y3YjlmY2Y5YmJmY2ZiYmRmY2ZkYmYiKSksRGs9UmsobUEoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwYTAyMDIwYzAyMDIwZTAzMDIxMDA0MDMxMjA0MDMxNDA1MDQxNzA2MDQxOTA3MDUxYjA4MDUxZDA5MDYxZjBhMDcyMjBiMDcyNDBjMDgyNjBkMDgyOTBlMDkyYjEwMDkyZDExMGEzMDEyMGEzMjE0MGIzNDE1MGIzNzE2MGIzOTE4MGMzYzE5MGMzZTFiMGM0MTFjMGM0MzFlMGM0NTFmMGM0ODIxMGM0YTIzMGM0YzI0MGM0ZjI2MGM1MTI4MGI1MzI5MGI1NTJiMGI1NzJkMGI1OTJmMGE1YjMxMGE1YzMyMGE1ZTM0MGE1ZjM2MDk2MTM4MDk2MjM5MDk2MzNiMDk2NDNkMDk2NTNlMDk2NjQwMGE2NzQyMGE2ODQ0MGE2ODQ1MGE2OTQ3MGI2YTQ5MGI2YTRhMGM2YjRjMGM2YjRkMGQ2YzRmMGQ2YzUxMGU2YzUyMGU2ZDU0MGY2ZDU1MGY2ZDU3MTA2ZTU5MTA2ZTVhMTE2ZTVjMTI2ZTVkMTI2ZTVmMTM2ZTYxMTM2ZTYyMTQ2ZTY0MTU2ZTY1MTU2ZTY3MTY2ZTY5MTY2ZTZhMTc2ZTZjMTg2ZTZkMTg2ZTZmMTk2ZTcxMTk2ZTcyMWE2ZTc0MWE2ZTc1MWI2ZTc3MWM2ZDc4MWM2ZDdhMWQ2ZDdjMWQ2ZDdkMWU2ZDdmMWU2YzgwMWY2YzgyMjA2Yzg0MjA2Yjg1MjE2Yjg3MjE2Yjg4MjI2YThhMjI2YThjMjM2OThkMjM2OThmMjQ2OTkwMjU2ODkyMjU2ODkzMjY2Nzk1MjY2Nzk3Mjc2Njk4Mjc2NjlhMjg2NTliMjk2NDlkMjk2NDlmMmE2M2EwMmE2M2EyMmI2MmEzMmM2MWE1MmM2MGE2MmQ2MGE4MmU1ZmE5MmU1ZWFiMmY1ZWFkMzA1ZGFlMzA1Y2IwMzE1YmIxMzI1YWIzMzI1YWI0MzM1OWI2MzQ1OGI3MzU1N2I5MzU1NmJhMzY1NWJjMzc1NGJkMzg1M2JmMzk1MmMwM2E1MWMxM2E1MGMzM2I0ZmM0M2M0ZWM2M2Q0ZGM3M2U0Y2M4M2Y0YmNhNDA0YWNiNDE0OWNjNDI0OGNlNDM0N2NmNDQ0NmQwNDU0NWQyNDY0NGQzNDc0M2Q0NDg0MmQ1NGE0MWQ3NGIzZmQ4NGMzZWQ5NGQzZGRhNGUzY2RiNTAzYmRkNTEzYWRlNTIzOGRmNTMzN2UwNTUzNmUxNTYzNWUyNTczNGUzNTkzM2U0NWEzMWU1NWMzMGU2NWQyZmU3NWUyZWU4NjAyZGU5NjEyYmVhNjMyYWViNjQyOWViNjYyOGVjNjcyNmVkNjkyNWVlNmEyNGVmNmMyM2VmNmUyMWYwNmYyMGYxNzExZmYxNzMxZGYyNzQxY2YzNzYxYmYzNzgxOWY0NzkxOGY1N2IxN2Y1N2QxNWY2N2UxNGY2ODAxM2Y3ODIxMmY3ODQxMGY4ODUwZmY4ODcwZWY4ODkwY2Y5OGIwYmY5OGMwYWY5OGUwOWZhOTAwOGZhOTIwN2ZhOTQwN2ZiOTYwNmZiOTcwNmZiOTkwNmZiOWIwNmZiOWQwN2ZjOWYwN2ZjYTEwOGZjYTMwOWZjYTUwYWZjYTYwY2ZjYTgwZGZjYWEwZmZjYWMxMWZjYWUxMmZjYjAxNGZjYjIxNmZjYjQxOGZiYjYxYWZiYjgxZGZiYmExZmZiYmMyMWZiYmUyM2ZhYzAyNmZhYzIyOGZhYzQyYWZhYzYyZGY5YzcyZmY5YzkzMmY5Y2IzNWY4Y2QzN2Y4Y2YzYWY3ZDEzZGY3ZDM0MGY2ZDU0M2Y2ZDc0NmY1ZDk0OWY1ZGI0Y2Y0ZGQ0ZmY0ZGY1M2Y0ZTE1NmYzZTM1YWYzZTU1ZGYyZTY2MWYyZTg2NWYyZWE2OWYxZWM2ZGYxZWQ3MWYxZWY3NWYxZjE3OWYyZjI3ZGYyZjQ4MmYzZjU4NmYzZjY4YWY0Zjg4ZWY1Zjk5MmY2ZmE5NmY4ZmI5YWY5ZmM5ZGZhZmRhMWZjZmZhNCIpKSxCaz1SayhtQSgiMGQwODg3MTAwNzg4MTMwNzg5MTYwNzhhMTkwNjhjMWIwNjhkMWQwNjhlMjAwNjhmMjIwNjkwMjQwNjkxMjYwNTkxMjgwNTkyMmEwNTkzMmMwNTk0MmUwNTk1MmYwNTk2MzEwNTk3MzMwNTk3MzUwNDk4MzcwNDk5MzgwNDlhM2EwNDlhM2MwNDliM2UwNDljM2YwNDljNDEwNDlkNDMwMzllNDQwMzllNDYwMzlmNDgwMzlmNDkwM2EwNGIwM2ExNGMwMmExNGUwMmEyNTAwMmEyNTEwMmEzNTMwMmEzNTUwMmE0NTYwMWE0NTgwMWE0NTkwMWE1NWIwMWE1NWMwMWE2NWUwMWE2NjAwMWE2NjEwMGE3NjMwMGE3NjQwMGE3NjYwMGE3NjcwMGE4NjkwMGE4NmEwMGE4NmMwMGE4NmUwMGE4NmYwMGE4NzEwMGE4NzIwMWE4NzQwMWE4NzUwMWE4NzcwMWE4NzgwMWE4N2EwMmE4N2IwMmE4N2QwM2E4N2UwM2E4ODAwNGE4ODEwNGE3ODMwNWE3ODQwNWE3ODYwNmE2ODcwN2E2ODgwOGE2OGEwOWE1OGIwYWE1OGQwYmE1OGUwY2E0OGYwZGE0OTEwZWEzOTIwZmEzOTQxMGEyOTUxMWExOTYxM2ExOTgxNGEwOTkxNTlmOWExNjlmOWMxNzllOWQxODlkOWUxOTlkYTAxYTljYTExYjliYTIxZDlhYTMxZTlhYTUxZjk5YTYyMDk4YTcyMTk3YTgyMjk2YWEyMzk1YWIyNDk0YWMyNjk0YWQyNzkzYWUyODkyYjAyOTkxYjEyYTkwYjIyYjhmYjMyYzhlYjQyZThkYjUyZjhjYjYzMDhiYjczMThhYjgzMjg5YmEzMzg4YmIzNDg4YmMzNTg3YmQzNzg2YmUzODg1YmYzOTg0YzAzYTgzYzEzYjgyYzIzYzgxYzMzZDgwYzQzZTdmYzU0MDdlYzY0MTdkYzc0MjdjYzg0MzdiYzk0NDdhY2E0NTdhY2I0Njc5Y2M0Nzc4Y2M0OTc3Y2Q0YTc2Y2U0Yjc1Y2Y0Yzc0ZDA0ZDczZDE0ZTcyZDI0ZjcxZDM1MTcxZDQ1MjcwZDU1MzZmZDU1NDZlZDY1NTZkZDc1NjZjZDg1NzZiZDk1ODZhZGE1YTZhZGE1YjY5ZGI1YzY4ZGM1ZDY3ZGQ1ZTY2ZGU1ZjY1ZGU2MTY0ZGY2MjYzZTA2MzYzZTE2NDYyZTI2NTYxZTI2NjYwZTM2ODVmZTQ2OTVlZTU2YTVkZTU2YjVkZTY2YzVjZTc2ZTViZTc2ZjVhZTg3MDU5ZTk3MTU4ZTk3MjU3ZWE3NDU3ZWI3NTU2ZWI3NjU1ZWM3NzU0ZWQ3OTUzZWQ3YTUyZWU3YjUxZWY3YzUxZWY3ZTUwZjA3ZjRmZjA4MDRlZjE4MTRkZjE4MzRjZjI4NDRiZjM4NTRiZjM4NzRhZjQ4ODQ5ZjQ4OTQ4ZjU4YjQ3ZjU4YzQ2ZjY4ZDQ1ZjY4ZjQ0Zjc5MDQ0Zjc5MTQzZjc5MzQyZjg5NDQxZjg5NTQwZjk5NzNmZjk5ODNlZjk5YTNlZmE5YjNkZmE5YzNjZmE5ZTNiZmI5ZjNhZmJhMTM5ZmJhMjM4ZmNhMzM4ZmNhNTM3ZmNhNjM2ZmNhODM1ZmNhOTM0ZmRhYjMzZmRhYzMzZmRhZTMyZmRhZjMxZmRiMTMwZmRiMjJmZmRiNDJmZmRiNTJlZmViNzJkZmViODJjZmViYTJjZmViYjJiZmViZDJhZmViZTJhZmVjMDI5ZmRjMjI5ZmRjMzI4ZmRjNTI3ZmRjNjI3ZmRjODI3ZmRjYTI2ZmRjYjI2ZmNjZDI1ZmNjZTI1ZmNkMDI1ZmNkMjI1ZmJkMzI0ZmJkNTI0ZmJkNzI0ZmFkODI0ZmFkYTI0ZjlkYzI0ZjlkZDI1ZjhkZjI1ZjhlMTI1ZjdlMjI1ZjdlNDI1ZjZlNjI2ZjZlODI2ZjVlOTI2ZjVlYjI3ZjRlZDI3ZjNlZTI3ZjNmMDI3ZjJmMjI3ZjFmNDI2ZjFmNTI1ZjBmNzI0ZjBmOTIxIikpO2Z1bmN0aW9uIEhrKHQpe3JldHVybiBmdW5jdGlvbiBlKCl7cmV0dXJuIHR9fXZhciBGaz1NYXRoLmFicyxWaz1NYXRoLmF0YW4yLFVrPU1hdGguY29zLGprPU1hdGgubWF4LEdrPU1hdGgubWluLFdrPU1hdGguc2luLHFrPU1hdGguc3FydCxZaz0xZS0xMixYaz1NYXRoLlBJLCRrPVhrLzIsS2s9MipYaztmdW5jdGlvbiBaayh0KXtyZXR1cm4gdD4xPzA6dDwtMT9YazpNYXRoLmFjb3ModCl9ZnVuY3Rpb24gSmsodCl7cmV0dXJuIHQ+PTE/JGs6dDw9LTE/LSRrOk1hdGguYXNpbih0KX1mdW5jdGlvbiBRayh0KXtyZXR1cm4gdC5pbm5lclJhZGl1c31mdW5jdGlvbiB0TCh0KXtyZXR1cm4gdC5vdXRlclJhZGl1c31mdW5jdGlvbiBlTCh0KXtyZXR1cm4gdC5zdGFydEFuZ2xlfWZ1bmN0aW9uIG5MKHQpe3JldHVybiB0LmVuZEFuZ2xlfWZ1bmN0aW9uIGlMKHQpe3JldHVybiB0JiZ0LnBhZEFuZ2xlfWZ1bmN0aW9uIHJMKHQsZSxuLGkscixvLGEscyl7dmFyIGw9bi10LGM9aS1lLHU9YS1yLGg9cy1vLGQ9aCpsLXUqYztpZighKGQqZDxZaykpcmV0dXJuW3QrKGQ9KHUqKGUtbyktaCoodC1yKSkvZCkqbCxlK2QqY119ZnVuY3Rpb24gb0wodCxlLG4saSxyLG8sYSl7dmFyIHM9dC1uLGw9ZS1pLGM9KGE/bzotbykvcWsocypzK2wqbCksdT1jKmwsaD0tYypzLGQ9dCt1LHA9ZStoLGY9bit1LG09aStoLGc9KGQrZikvMixfPShwK20pLzIseT1mLWQsdj1tLXAsYj15Knkrdip2LHg9ci1vLHc9ZCptLWYqcCxTPSh2PDA/LTE6MSkqcWsoamsoMCx4KngqYi13KncpKSxNPSh3KnYteSpTKS9iLEU9KC13KnktdipTKS9iLFQ9KHcqdit5KlMpL2IsQz0oLXcqeSt2KlMpL2IsQT1NLWcsaz1FLV8sTD1ULWcsUD1DLV87cmV0dXJuIEEqQStrKms+TCpMK1AqUCYmKE09VCxFPUMpLHtjeDpNLGN5OkUseDAxOi11LHkwMTotaCx4MTE6TSooci94LTEpLHkxMTpFKihyL3gtMSl9fWZ1bmN0aW9uIGFMKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBzTCh0KXtyZXR1cm4gbmV3IGFMKHQpfWZ1bmN0aW9uIGxMKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIGNMKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIHVMKCl7dmFyIHQ9bEwsZT1jTCxuPUhrKCEwKSxpPW51bGwscj1zTCxvPW51bGw7ZnVuY3Rpb24gYShhKXt2YXIgcyxsLGMsdT1hLmxlbmd0aCxoPSExO2ZvcihudWxsPT1pJiYobz1yKGM9ZmcoKSkpLHM9MDtzPD11OysrcykhKHM8dSYmbihsPWFbc10scyxhKSk9PT1oJiYoKGg9IWgpP28ubGluZVN0YXJ0KCk6by5saW5lRW5kKCkpLGgmJm8ucG9pbnQoK3QobCxzLGEpLCtlKGwscyxhKSk7aWYoYylyZXR1cm4gbz1udWxsLGMrIiJ8fG51bGx9cmV0dXJuIGEueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOkhrKCtlKSxhKTp0fSxhLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpIaygrdCksYSk6ZX0sYS5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SGsoISF0KSxhKTpufSxhLmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbnVsbCE9aSYmKG89cihpKSksYSk6cn0sYS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P2k9bz1udWxsOm89cihpPXQpLGEpOml9LGF9ZnVuY3Rpb24gaEwoKXt2YXIgdD1sTCxlPW51bGwsbj1IaygwKSxpPWNMLHI9SGsoITApLG89bnVsbCxhPXNMLHM9bnVsbDtmdW5jdGlvbiBsKGwpe3ZhciBjLHUsaCxkLHAsZj1sLmxlbmd0aCxtPSExLGc9bmV3IEFycmF5KGYpLF89bmV3IEFycmF5KGYpO2ZvcihudWxsPT1vJiYocz1hKHA9ZmcoKSkpLGM9MDtjPD1mOysrYyl7aWYoIShjPGYmJnIoZD1sW2NdLGMsbCkpPT09bSlpZihtPSFtKXU9YyxzLmFyZWFTdGFydCgpLHMubGluZVN0YXJ0KCk7ZWxzZXtmb3Iocy5saW5lRW5kKCkscy5saW5lU3RhcnQoKSxoPWMtMTtoPj11Oy0taClzLnBvaW50KGdbaF0sX1toXSk7cy5saW5lRW5kKCkscy5hcmVhRW5kKCl9bSYmKGdbY109K3QoZCxjLGwpLF9bY109K24oZCxjLGwpLHMucG9pbnQoZT8rZShkLGMsbCk6Z1tjXSxpPytpKGQsYyxsKTpfW2NdKSl9aWYocClyZXR1cm4gcz1udWxsLHArIiJ8fG51bGx9ZnVuY3Rpb24gYygpe3JldHVybiB1TCgpLmRlZmluZWQocikuY3VydmUoYSkuY29udGV4dChvKX1yZXR1cm4gbC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246SGsoK24pLGU9bnVsbCxsKTp0fSxsLngwPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6SGsoK2UpLGwpOnR9LGwueDE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SGsoK3QpLGwpOmV9LGwueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkhrKCt0KSxpPW51bGwsbCk6bn0sbC55MD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkhrKCt0KSxsKTpufSxsLnkxPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OkhrKCt0KSxsKTppfSxsLmxpbmVYMD1sLmxpbmVZMD1mdW5jdGlvbigpe3JldHVybiBjKCkueCh0KS55KG4pfSxsLmxpbmVZMT1mdW5jdGlvbigpe3JldHVybiBjKCkueCh0KS55KGkpfSxsLmxpbmVYMT1mdW5jdGlvbigpe3JldHVybiBjKCkueChlKS55KG4pfSxsLmRlZmluZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpIayghIXQpLGwpOnJ9LGwuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCxudWxsIT1vJiYocz1hKG8pKSxsKTphfSxsLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/bz1zPW51bGw6cz1hKG89dCksbCk6b30sbH1mdW5jdGlvbiBkTCh0LGUpe3JldHVybiBlPHQ/LTE6ZT50PzE6ZT49dD8wOk5hTn1mdW5jdGlvbiBwTCh0KXtyZXR1cm4gdH1hTC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxlKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5saW5lVG8odCxlKX19fTt2YXIgZkw9Z0woc0wpO2Z1bmN0aW9uIG1MKHQpe3RoaXMuX2N1cnZlPXR9ZnVuY3Rpb24gZ0wodCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gbmV3IG1MKHQoZSkpfXJldHVybiBlLl9jdXJ2ZT10LGV9ZnVuY3Rpb24gX0wodCl7dmFyIGU9dC5jdXJ2ZTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoZ0wodCkpOmUoKS5fY3VydmV9LHR9ZnVuY3Rpb24geUwoKXtyZXR1cm4gX0wodUwoKS5jdXJ2ZShmTCkpfWZ1bmN0aW9uIHZMKCl7dmFyIHQ9aEwoKS5jdXJ2ZShmTCksZT10LmN1cnZlLG49dC5saW5lWDAsaT10LmxpbmVYMSxyPXQubGluZVkwLG89dC5saW5lWTE7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5zdGFydEFuZ2xlPXQueDAsZGVsZXRlIHQueDAsdC5lbmRBbmdsZT10LngxLGRlbGV0ZSB0LngxLHQucmFkaXVzPXQueSxkZWxldGUgdC55LHQuaW5uZXJSYWRpdXM9dC55MCxkZWxldGUgdC55MCx0Lm91dGVyUmFkaXVzPXQueTEsZGVsZXRlIHQueTEsdC5saW5lU3RhcnRBbmdsZT1mdW5jdGlvbigpe3JldHVybiBfTChuKCkpfSxkZWxldGUgdC5saW5lWDAsdC5saW5lRW5kQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gX0woaSgpKX0sZGVsZXRlIHQubGluZVgxLHQubGluZUlubmVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIF9MKHIoKSl9LGRlbGV0ZSB0LmxpbmVZMCx0LmxpbmVPdXRlclJhZGl1cz1mdW5jdGlvbigpe3JldHVybiBfTChvKCkpfSxkZWxldGUgdC5saW5lWTEsdC5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9lKGdMKHQpKTplKCkuX2N1cnZlfSx0fWZ1bmN0aW9uIGJMKHQsZSl7cmV0dXJuWyhlPStlKSpNYXRoLmNvcyh0LT1NYXRoLlBJLzIpLGUqTWF0aC5zaW4odCldfW1MLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYVN0YXJ0KCl9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5hcmVhRW5kKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LGUpe3RoaXMuX2N1cnZlLnBvaW50KGUqTWF0aC5zaW4odCksZSotTWF0aC5jb3ModCkpfX07dmFyIHhMPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiB3TCh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gU0wodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIE1MKHQpe3ZhciBlPXdMLG49U0wsaT1sTCxyPWNMLG89bnVsbDtmdW5jdGlvbiBhKCl7dmFyIGEscz14TC5jYWxsKGFyZ3VtZW50cyksbD1lLmFwcGx5KHRoaXMscyksYz1uLmFwcGx5KHRoaXMscyk7aWYob3x8KG89YT1mZygpKSx0KG8sK2kuYXBwbHkodGhpcywoc1swXT1sLHMpKSwrci5hcHBseSh0aGlzLHMpLCtpLmFwcGx5KHRoaXMsKHNbMF09YyxzKSksK3IuYXBwbHkodGhpcyxzKSksYSlyZXR1cm4gbz1udWxsLGErIiJ8fG51bGx9cmV0dXJuIGEuc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsYSk6ZX0sYS50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxhKTpufSxhLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpIaygrdCksYSk6aX0sYS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SGsoK3QpLGEpOnJ9LGEuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1udWxsPT10P251bGw6dCxhKTpvfSxhfWZ1bmN0aW9uIEVMKHQsZSxuLGkscil7dC5tb3ZlVG8oZSxuKSx0LmJlemllckN1cnZlVG8oZT0oZStpKS8yLG4sZSxyLGkscil9ZnVuY3Rpb24gVEwodCxlLG4saSxyKXt0Lm1vdmVUbyhlLG4pLHQuYmV6aWVyQ3VydmVUbyhlLG49KG4rcikvMixpLG4saSxyKX1mdW5jdGlvbiBDTCh0LGUsbixpLHIpe3ZhciBvPWJMKGUsbiksYT1iTChlLG49KG4rcikvMikscz1iTChpLG4pLGw9YkwoaSxyKTt0Lm1vdmVUbyhvWzBdLG9bMV0pLHQuYmV6aWVyQ3VydmVUbyhhWzBdLGFbMV0sc1swXSxzWzFdLGxbMF0sbFsxXSl9dmFyIEFMPXtkcmF3OmZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5zcXJ0KGUvWGspO3QubW92ZVRvKG4sMCksdC5hcmMoMCwwLG4sMCxLayl9fSxrTD17ZHJhdzpmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguc3FydChlLzUpLzI7dC5tb3ZlVG8oLTMqbiwtbiksdC5saW5lVG8oLW4sLW4pLHQubGluZVRvKC1uLC0zKm4pLHQubGluZVRvKG4sLTMqbiksdC5saW5lVG8obiwtbiksdC5saW5lVG8oMypuLC1uKSx0LmxpbmVUbygzKm4sbiksdC5saW5lVG8obixuKSx0LmxpbmVUbyhuLDMqbiksdC5saW5lVG8oLW4sMypuKSx0LmxpbmVUbygtbixuKSx0LmxpbmVUbygtMypuLG4pLHQuY2xvc2VQYXRoKCl9fSxMTD1NYXRoLnNxcnQoMS8zKSxQTD0yKkxMLE5MPXtkcmF3OmZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5zcXJ0KGUvUEwpLGk9bipMTDt0Lm1vdmVUbygwLC1uKSx0LmxpbmVUbyhpLDApLHQubGluZVRvKDAsbiksdC5saW5lVG8oLWksMCksdC5jbG9zZVBhdGgoKX19LElMPU1hdGguc2luKFhrLzEwKS9NYXRoLnNpbig3KlhrLzEwKSxSTD1NYXRoLnNpbihLay8xMCkqSUwsT0w9LU1hdGguY29zKEtrLzEwKSpJTCx6TD17ZHJhdzpmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguc3FydCguODkwODEzMDkxNTI5Mjg1MiplKSxpPVJMKm4scj1PTCpuO3QubW92ZVRvKDAsLW4pLHQubGluZVRvKGkscik7Zm9yKHZhciBvPTE7bzw1Oysrbyl7dmFyIGE9S2sqby81LHM9TWF0aC5jb3MoYSksbD1NYXRoLnNpbihhKTt0LmxpbmVUbyhsKm4sLXMqbiksdC5saW5lVG8ocyppLWwqcixsKmkrcypyKX10LmNsb3NlUGF0aCgpfX0sREw9e2RyYXc6ZnVuY3Rpb24odCxlKXt2YXIgbj1NYXRoLnNxcnQoZSksaT0tbi8yO3QucmVjdChpLGksbixuKX19LEJMPU1hdGguc3FydCgzKSxITD17ZHJhdzpmdW5jdGlvbih0LGUpe3ZhciBuPS1NYXRoLnNxcnQoZS8oMypCTCkpO3QubW92ZVRvKDAsMipuKSx0LmxpbmVUbygtQkwqbiwtbiksdC5saW5lVG8oQkwqbiwtbiksdC5jbG9zZVBhdGgoKX19LEZMPS0uNSxWTD1NYXRoLnNxcnQoMykvMixVTD0xL01hdGguc3FydCgxMiksakw9MyooVUwvMisxKSxHTD17ZHJhdzpmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguc3FydChlL2pMKSxpPW4vMixyPW4qVUwsbz1pLGE9bipVTCtuLHM9LW8sbD1hO3QubW92ZVRvKGksciksdC5saW5lVG8obyxhKSx0LmxpbmVUbyhzLGwpLHQubGluZVRvKEZMKmktVkwqcixWTCppK0ZMKnIpLHQubGluZVRvKEZMKm8tVkwqYSxWTCpvK0ZMKmEpLHQubGluZVRvKEZMKnMtVkwqbCxWTCpzK0ZMKmwpLHQubGluZVRvKEZMKmkrVkwqcixGTCpyLVZMKmkpLHQubGluZVRvKEZMKm8rVkwqYSxGTCphLVZMKm8pLHQubGluZVRvKEZMKnMrVkwqbCxGTCpsLVZMKnMpLHQuY2xvc2VQYXRoKCl9fSxXTD1bQUwsa0wsTkwsREwsekwsSEwsR0xdO2Z1bmN0aW9uIHFMKCl7fWZ1bmN0aW9uIFlMKHQsZSxuKXt0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oKDIqdC5feDArdC5feDEpLzMsKDIqdC5feTArdC5feTEpLzMsKHQuX3gwKzIqdC5feDEpLzMsKHQuX3kwKzIqdC5feTEpLzMsKHQuX3gwKzQqdC5feDErZSkvNiwodC5feTArNCp0Ll95MStuKS82KX1mdW5jdGlvbiBYTCh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gJEwodCl7cmV0dXJuIG5ldyBYTCh0KX1mdW5jdGlvbiBLTCh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gWkwodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEpMKHQsZSl7dGhpcy5fYmFzaXM9bmV3IFhMKHQpLHRoaXMuX2JldGE9ZX1YTC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAzOllMKHRoaXMsdGhpcy5feDEsdGhpcy5feTEpO2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxlKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2NvbnRleHQubGluZVRvKCg1KnRoaXMuX3gwK3RoaXMuX3gxKS82LCg1KnRoaXMuX3kwK3RoaXMuX3kxKS82KTtkZWZhdWx0OllMKHRoaXMsdCxlKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPWV9fSxLTC5wcm90b3R5cGU9e2FyZWFTdGFydDpxTCxhcmVhRW5kOnFMLGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MisyKnRoaXMuX3gzKS8zLCh0aGlzLl95MisyKnRoaXMuX3kzKS8zKSx0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMrMip0aGlzLl94MikvMywodGhpcy5feTMrMip0aGlzLl95MikvMyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95MiksdGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCl9fSxwb2ludDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gyPXQsdGhpcy5feTI9ZTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94Mz10LHRoaXMuX3kzPWU7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDQ9dCx0aGlzLl95ND1lLHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYsKHRoaXMuX3kwKzQqdGhpcy5feTErZSkvNik7YnJlYWs7ZGVmYXVsdDpZTCh0aGlzLHQsZSl9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1lfX0sWkwucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7dmFyIG49KHRoaXMuX3gwKzQqdGhpcy5feDErdCkvNixpPSh0aGlzLl95MCs0KnRoaXMuX3kxK2UpLzY7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyhuLGkpOnRoaXMuX2NvbnRleHQubW92ZVRvKG4saSk7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpZTCh0aGlzLHQsZSl9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1lfX0sSkwucHJvdG90eXBlPXtsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PVtdLHRoaXMuX3k9W10sdGhpcy5fYmFzaXMubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl94LGU9dGhpcy5feSxuPXQubGVuZ3RoLTE7aWYobj4wKWZvcih2YXIgaSxyPXRbMF0sbz1lWzBdLGE9dFtuXS1yLHM9ZVtuXS1vLGw9LTE7KytsPD1uOyl0aGlzLl9iYXNpcy5wb2ludCh0aGlzLl9iZXRhKnRbbF0rKDEtdGhpcy5fYmV0YSkqKHIrKGk9bC9uKSphKSx0aGlzLl9iZXRhKmVbbF0rKDEtdGhpcy5fYmV0YSkqKG8raSpzKSk7dGhpcy5feD10aGlzLl95PW51bGwsdGhpcy5fYmFzaXMubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LGUpe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtlKX19O3ZhciBRTD0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiAxPT09ZT9uZXcgWEwodCk6bmV3IEpMKHQsZSl9cmV0dXJuIG4uYmV0YT1mdW5jdGlvbihlKXtyZXR1cm4gdCgrZSl9LG59KSguODUpO2Z1bmN0aW9uIHRQKHQsZSxuKXt0Ll9jb250ZXh0LmJlemllckN1cnZlVG8odC5feDErdC5fayoodC5feDItdC5feDApLHQuX3kxK3QuX2sqKHQuX3kyLXQuX3kwKSx0Ll94Mit0Ll9rKih0Ll94MS1lKSx0Ll95Mit0Ll9rKih0Ll95MS1uKSx0Ll94Mix0Ll95Mil9ZnVuY3Rpb24gZVAodCxlKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1lKS82fWVQLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0UCh0aGlzLHRoaXMuX3gxLHRoaXMuX3kxKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsZSk7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5feDE9dCx0aGlzLl95MT1lO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO2RlZmF1bHQ6dFAodGhpcyx0LGUpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9ZX19O3ZhciBuUD0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBuZXcgZVAodCxlKX1yZXR1cm4gbi50ZW5zaW9uPWZ1bmN0aW9uKGUpe3JldHVybiB0KCtlKX0sbn0pKDApO2Z1bmN0aW9uIGlQKHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtZSkvNn1pUC5wcm90b3R5cGU9e2FyZWFTdGFydDpxTCxhcmVhRW5kOnFMLGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1lO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9ZSk7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1lO2JyZWFrO2RlZmF1bHQ6dFAodGhpcyx0LGUpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9ZX19O3ZhciByUD0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBuZXcgaVAodCxlKX1yZXR1cm4gbi50ZW5zaW9uPWZ1bmN0aW9uKGUpe3JldHVybiB0KCtlKX0sbn0pKDApO2Z1bmN0aW9uIG9QKHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtZSkvNn1vUC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtzd2l0Y2godD0rdCxlPStlLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDp0UCh0aGlzLHQsZSl9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1lfX07dmFyIGFQPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIG5ldyBvUCh0LGUpfXJldHVybiBuLnRlbnNpb249ZnVuY3Rpb24oZSl7cmV0dXJuIHQoK2UpfSxufSkoMCk7ZnVuY3Rpb24gc1AodCxlLG4pe3ZhciBpPXQuX3gxLHI9dC5feTEsbz10Ll94MixhPXQuX3kyO2lmKHQuX2wwMV9hPllrKXt2YXIgcz0yKnQuX2wwMV8yYSszKnQuX2wwMV9hKnQuX2wxMl9hK3QuX2wxMl8yYSxsPTMqdC5fbDAxX2EqKHQuX2wwMV9hK3QuX2wxMl9hKTtpPShpKnMtdC5feDAqdC5fbDEyXzJhK3QuX3gyKnQuX2wwMV8yYSkvbCxyPShyKnMtdC5feTAqdC5fbDEyXzJhK3QuX3kyKnQuX2wwMV8yYSkvbH1pZih0Ll9sMjNfYT5Zayl7dmFyIGM9Mip0Ll9sMjNfMmErMyp0Ll9sMjNfYSp0Ll9sMTJfYSt0Ll9sMTJfMmEsdT0zKnQuX2wyM19hKih0Ll9sMjNfYSt0Ll9sMTJfYSk7bz0obypjK3QuX3gxKnQuX2wyM18yYS1lKnQuX2wxMl8yYSkvdSxhPShhKmMrdC5feTEqdC5fbDIzXzJhLW4qdC5fbDEyXzJhKS91fXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhpLHIsbyxhLHQuX3gyLHQuX3kyKX1mdW5jdGlvbiBsUCh0LGUpe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1lfWxQLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gyLHRoaXMuX3kyKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7aWYodD0rdCxlPStlLHRoaXMuX3BvaW50KXt2YXIgbj10aGlzLl94Mi10LGk9dGhpcy5feTItZTt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KG4qbitpKmksdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxlKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO2RlZmF1bHQ6c1AodGhpcyx0LGUpfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPWV9fTt2YXIgY1A9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gZT9uZXcgbFAodCxlKTpuZXcgZVAodCwwKX1yZXR1cm4gbi5hbHBoYT1mdW5jdGlvbihlKXtyZXR1cm4gdCgrZSl9LG59KSguNSk7ZnVuY3Rpb24gdVAodCxlKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9ZX11UC5wcm90b3R5cGU9e2FyZWFTdGFydDpxTCxhcmVhRW5kOnFMLGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsZSl7aWYodD0rdCxlPStlLHRoaXMuX3BvaW50KXt2YXIgbj10aGlzLl94Mi10LGk9dGhpcy5feTItZTt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KG4qbitpKmksdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gzPXQsdGhpcy5feTM9ZTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94ND10LHRoaXMuX3k0PWUpO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX3g1PXQsdGhpcy5feTU9ZTticmVhaztkZWZhdWx0OnNQKHRoaXMsdCxlKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1lfX07dmFyIGhQPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIGU/bmV3IHVQKHQsZSk6bmV3IGlQKHQsMCl9cmV0dXJuIG4uYWxwaGE9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoK2UpfSxufSkoLjUpO2Z1bmN0aW9uIGRQKHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPWV9ZFAucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7aWYodD0rdCxlPStlLHRoaXMuX3BvaW50KXt2YXIgbj10aGlzLl94Mi10LGk9dGhpcy5feTItZTt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KG4qbitpKmksdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0OnNQKHRoaXMsdCxlKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1lfX07dmFyIHBQPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIGU/bmV3IGRQKHQsZSk6bmV3IG9QKHQsMCl9cmV0dXJuIG4uYWxwaGE9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoK2UpfSxufSkoLjUpO2Z1bmN0aW9uIGZQKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBtUCh0KXtyZXR1cm4gdDwwPy0xOjF9ZnVuY3Rpb24gZ1AodCxlLG4pe3ZhciBpPXQuX3gxLXQuX3gwLHI9ZS10Ll94MSxvPSh0Ll95MS10Ll95MCkvKGl8fHI8MCYmLTApLGE9KG4tdC5feTEpLyhyfHxpPDAmJi0wKSxzPShvKnIrYSppKS8oaStyKTtyZXR1cm4obVAobykrbVAoYSkpKk1hdGgubWluKE1hdGguYWJzKG8pLE1hdGguYWJzKGEpLC41Kk1hdGguYWJzKHMpKXx8MH1mdW5jdGlvbiBfUCh0LGUpe3ZhciBuPXQuX3gxLXQuX3gwO3JldHVybiBuPygzKih0Ll95MS10Ll95MCkvbi1lKS8yOmV9ZnVuY3Rpb24geVAodCxlLG4pe3ZhciBpPXQuX3gwLHI9dC5feDEsbz10Ll95MSxhPShyLWkpLzM7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKGkrYSx0Ll95MCthKmUsci1hLG8tYSpuLHIsbyl9ZnVuY3Rpb24gdlAodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIGJQKHQpe3RoaXMuX2NvbnRleHQ9bmV3IHhQKHQpfWZ1bmN0aW9uIHhQKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiB3UCh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gU1AodCl7dmFyIGUsbixpPXQubGVuZ3RoLTEscj1uZXcgQXJyYXkoaSksbz1uZXcgQXJyYXkoaSksYT1uZXcgQXJyYXkoaSk7Zm9yKHJbMF09MCxvWzBdPTIsYVswXT10WzBdKzIqdFsxXSxlPTE7ZTxpLTE7KytlKXJbZV09MSxvW2VdPTQsYVtlXT00KnRbZV0rMip0W2UrMV07Zm9yKHJbaS0xXT0yLG9baS0xXT03LGFbaS0xXT04KnRbaS0xXSt0W2ldLGU9MTtlPGk7KytlKW9bZV0tPW49cltlXS9vW2UtMV0sYVtlXS09biphW2UtMV07Zm9yKHJbaS0xXT1hW2ktMV0vb1tpLTFdLGU9aS0yO2U+PTA7LS1lKXJbZV09KGFbZV0tcltlKzFdKS9vW2VdO2ZvcihvW2ktMV09KHRbaV0rcltpLTFdKS8yLGU9MDtlPGktMTsrK2Upb1tlXT0yKnRbZSsxXS1yW2UrMV07cmV0dXJuW3Isb119ZnVuY3Rpb24gTVAodCxlKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fdD1lfWZ1bmN0aW9uIEVQKHQsZSl7aWYoKHI9dC5sZW5ndGgpPjEpZm9yKHZhciBuLGkscixvPTEsYT10W2VbMF1dLHM9YS5sZW5ndGg7bzxyOysrbylmb3IoaT1hLGE9dFtlW29dXSxuPTA7bjxzOysrbilhW25dWzFdKz1hW25dWzBdPWlzTmFOKGlbbl1bMV0pP2lbbl1bMF06aVtuXVsxXX1mdW5jdGlvbiBUUCh0KXtmb3IodmFyIGU9dC5sZW5ndGgsbj1uZXcgQXJyYXkoZSk7LS1lPj0wOyluW2VdPWU7cmV0dXJuIG59ZnVuY3Rpb24gQ1AodCxlKXtyZXR1cm4gdFtlXX1mdW5jdGlvbiBBUCh0KXt2YXIgZT10Lm1hcChrUCk7cmV0dXJuIFRQKHQpLnNvcnQoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGVbdF0tZVtuXX0pKX1mdW5jdGlvbiBrUCh0KXtmb3IodmFyIGUsbj0tMSxpPTAscj10Lmxlbmd0aCxvPS0xLzA7KytuPHI7KShlPSt0W25dWzFdKT5vJiYobz1lLGk9bik7cmV0dXJuIGl9ZnVuY3Rpb24gTFAodCl7dmFyIGU9dC5tYXAoUFApO3JldHVybiBUUCh0KS5zb3J0KChmdW5jdGlvbih0LG4pe3JldHVybiBlW3RdLWVbbl19KSl9ZnVuY3Rpb24gUFAodCl7Zm9yKHZhciBlLG49MCxpPS0xLHI9dC5sZW5ndGg7KytpPHI7KShlPSt0W2ldWzFdKSYmKG4rPWUpO3JldHVybiBufWZ1bmN0aW9uIE5QKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBJUCh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBSUCh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBPUCgpe3RoaXMuXz1udWxsfWZ1bmN0aW9uIHpQKHQpe3QuVT10LkM9dC5MPXQuUj10LlA9dC5OPW51bGx9ZnVuY3Rpb24gRFAodCxlKXt2YXIgbj1lLGk9ZS5SLHI9bi5VO3I/ci5MPT09bj9yLkw9aTpyLlI9aTp0Ll89aSxpLlU9cixuLlU9aSxuLlI9aS5MLG4uUiYmKG4uUi5VPW4pLGkuTD1ufWZ1bmN0aW9uIEJQKHQsZSl7dmFyIG49ZSxpPWUuTCxyPW4uVTtyP3IuTD09PW4/ci5MPWk6ci5SPWk6dC5fPWksaS5VPXIsbi5VPWksbi5MPWkuUixuLkwmJihuLkwuVT1uKSxpLlI9bn1mdW5jdGlvbiBIUCh0KXtmb3IoO3QuTDspdD10Lkw7cmV0dXJuIHR9ZnVuY3Rpb24gRlAodCxlLG4saSl7dmFyIHI9W251bGwsbnVsbF0sbz11Ti5wdXNoKHIpLTE7cmV0dXJuIHIubGVmdD10LHIucmlnaHQ9ZSxuJiZVUChyLHQsZSxuKSxpJiZVUChyLGUsdCxpKSxsTlt0LmluZGV4XS5oYWxmZWRnZXMucHVzaChvKSxsTltlLmluZGV4XS5oYWxmZWRnZXMucHVzaChvKSxyfWZ1bmN0aW9uIFZQKHQsZSxuKXt2YXIgaT1bZSxuXTtyZXR1cm4gaS5sZWZ0PXQsaX1mdW5jdGlvbiBVUCh0LGUsbixpKXt0WzBdfHx0WzFdP3QubGVmdD09PW4/dFsxXT1pOnRbMF09aToodFswXT1pLHQubGVmdD1lLHQucmlnaHQ9bil9ZnVuY3Rpb24galAodCxlLG4saSxyKXt2YXIgbyxhPXRbMF0scz10WzFdLGw9YVswXSxjPWFbMV0sdT0wLGg9MSxkPXNbMF0tbCxwPXNbMV0tYztpZihvPWUtbCxkfHwhKG8+MCkpe2lmKG8vPWQsZDwwKXtpZihvPHUpcmV0dXJuO288aCYmKGg9byl9ZWxzZSBpZihkPjApe2lmKG8+aClyZXR1cm47bz51JiYodT1vKX1pZihvPWktbCxkfHwhKG88MCkpe2lmKG8vPWQsZDwwKXtpZihvPmgpcmV0dXJuO28+dSYmKHU9byl9ZWxzZSBpZihkPjApe2lmKG88dSlyZXR1cm47bzxoJiYoaD1vKX1pZihvPW4tYyxwfHwhKG8+MCkpe2lmKG8vPXAscDwwKXtpZihvPHUpcmV0dXJuO288aCYmKGg9byl9ZWxzZSBpZihwPjApe2lmKG8+aClyZXR1cm47bz51JiYodT1vKX1pZihvPXItYyxwfHwhKG88MCkpe2lmKG8vPXAscDwwKXtpZihvPmgpcmV0dXJuO28+dSYmKHU9byl9ZWxzZSBpZihwPjApe2lmKG88dSlyZXR1cm47bzxoJiYoaD1vKX1yZXR1cm4hKHU+MHx8aDwxKXx8KHU+MCYmKHRbMF09W2wrdSpkLGMrdSpwXSksaDwxJiYodFsxXT1bbCtoKmQsYytoKnBdKSwhMCl9fX19fWZ1bmN0aW9uIEdQKHQsZSxuLGkscil7dmFyIG89dFsxXTtpZihvKXJldHVybiEwO3ZhciBhLHMsbD10WzBdLGM9dC5sZWZ0LHU9dC5yaWdodCxoPWNbMF0sZD1jWzFdLHA9dVswXSxmPXVbMV0sbT0oaCtwKS8yO2lmKGY9PT1kKXtpZihtPGV8fG0+PWkpcmV0dXJuO2lmKGg+cCl7aWYobCl7aWYobFsxXT49cilyZXR1cm59ZWxzZSBsPVttLG5dO289W20scl19ZWxzZXtpZihsKXtpZihsWzFdPG4pcmV0dXJufWVsc2UgbD1bbSxyXTtvPVttLG5dfX1lbHNlIGlmKHM9KGQrZikvMi0oYT0oaC1wKS8oZi1kKSkqbSxhPC0xfHxhPjEpaWYoaD5wKXtpZihsKXtpZihsWzFdPj1yKXJldHVybn1lbHNlIGw9WyhuLXMpL2Esbl07bz1bKHItcykvYSxyXX1lbHNle2lmKGwpe2lmKGxbMV08bilyZXR1cm59ZWxzZSBsPVsoci1zKS9hLHJdO289WyhuLXMpL2Esbl19ZWxzZSBpZihkPGYpe2lmKGwpe2lmKGxbMF0+PWkpcmV0dXJufWVsc2UgbD1bZSxhKmUrc107bz1baSxhKmkrc119ZWxzZXtpZihsKXtpZihsWzBdPGUpcmV0dXJufWVsc2UgbD1baSxhKmkrc107bz1bZSxhKmUrc119cmV0dXJuIHRbMF09bCx0WzFdPW8sITB9ZnVuY3Rpb24gV1AodCxlKXt2YXIgbj10LnNpdGUsaT1lLmxlZnQscj1lLnJpZ2h0O3JldHVybiBuPT09ciYmKHI9aSxpPW4pLHI/TWF0aC5hdGFuMihyWzFdLWlbMV0sclswXS1pWzBdKToobj09PWk/KGk9ZVsxXSxyPWVbMF0pOihpPWVbMF0scj1lWzFdKSxNYXRoLmF0YW4yKGlbMF0tclswXSxyWzFdLWlbMV0pKX1mdW5jdGlvbiBxUCh0LGUpe3JldHVybiBlWysoZS5sZWZ0IT09dC5zaXRlKV19ZnVuY3Rpb24gWVAodCxlKXtyZXR1cm4gZVsrKGUubGVmdD09PXQuc2l0ZSldfWZQLnByb3RvdHlwZT17YXJlYVN0YXJ0OnFMLGFyZWFFbmQ6cUwsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuX3BvaW50JiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxwb2ludDpmdW5jdGlvbih0LGUpe3Q9K3QsZT0rZSx0aGlzLl9wb2ludD90aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpOih0aGlzLl9wb2ludD0xLHRoaXMuX2NvbnRleHQubW92ZVRvKHQsZSkpfX0sdlAucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5fdDA9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSk7YnJlYWs7Y2FzZSAzOnlQKHRoaXMsdGhpcy5fdDAsX1AodGhpcyx0aGlzLl90MCkpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxlKXt2YXIgbj1OYU47aWYoZT0rZSwodD0rdCkhPT10aGlzLl94MXx8ZSE9PXRoaXMuX3kxKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxlKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHlQKHRoaXMsX1AodGhpcyxuPWdQKHRoaXMsdCxlKSksbik7YnJlYWs7ZGVmYXVsdDp5UCh0aGlzLHRoaXMuX3QwLG49Z1AodGhpcyx0LGUpKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPWUsdGhpcy5fdDA9bn19fSwoYlAucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodlAucHJvdG90eXBlKSkucG9pbnQ9ZnVuY3Rpb24odCxlKXt2UC5wcm90b3R5cGUucG9pbnQuY2FsbCh0aGlzLGUsdCl9LHhQLnByb3RvdHlwZT17bW92ZVRvOmZ1bmN0aW9uKHQsZSl7dGhpcy5fY29udGV4dC5tb3ZlVG8oZSx0KX0sY2xvc2VQYXRoOmZ1bmN0aW9uKCl7dGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKX0sbGluZVRvOmZ1bmN0aW9uKHQsZSl7dGhpcy5fY29udGV4dC5saW5lVG8oZSx0KX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LGUsbixpLHIsbyl7dGhpcy5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKGUsdCxpLG4sbyxyKX19LHdQLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3g9W10sdGhpcy5feT1bXX0sbGluZUVuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3gsZT10aGlzLl95LG49dC5sZW5ndGg7aWYobilpZih0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRbMF0sZVswXSk6dGhpcy5fY29udGV4dC5tb3ZlVG8odFswXSxlWzBdKSwyPT09bil0aGlzLl9jb250ZXh0LmxpbmVUbyh0WzFdLGVbMV0pO2Vsc2UgZm9yKHZhciBpPVNQKHQpLHI9U1AoZSksbz0wLGE9MTthPG47KytvLCsrYSl0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8oaVswXVtvXSxyWzBdW29dLGlbMV1bb10sclsxXVtvXSx0W2FdLGVbYV0pOyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PW4pJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lLHRoaXMuX3g9dGhpcy5feT1udWxsfSxwb2ludDpmdW5jdGlvbih0LGUpe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtlKX19LE1QLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3g9dGhpcy5feT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpezA8dGhpcy5fdCYmdGhpcy5fdDwxJiYyPT09dGhpcy5fcG9pbnQmJnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsdGhpcy5feSksKHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU+PTAmJih0aGlzLl90PTEtdGhpcy5fdCx0aGlzLl9saW5lPTEtdGhpcy5fbGluZSl9LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsZSk7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7ZGVmYXVsdDppZih0aGlzLl90PD0wKXRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsZSksdGhpcy5fY29udGV4dC5saW5lVG8odCxlKTtlbHNle3ZhciBuPXRoaXMuX3gqKDEtdGhpcy5fdCkrdCp0aGlzLl90O3RoaXMuX2NvbnRleHQubGluZVRvKG4sdGhpcy5feSksdGhpcy5fY29udGV4dC5saW5lVG8obixlKX19dGhpcy5feD10LHRoaXMuX3k9ZX19LE9QLnByb3RvdHlwZT17Y29uc3RydWN0b3I6T1AsaW5zZXJ0OmZ1bmN0aW9uKHQsZSl7dmFyIG4saSxyO2lmKHQpe2lmKGUuUD10LGUuTj10Lk4sdC5OJiYodC5OLlA9ZSksdC5OPWUsdC5SKXtmb3IodD10LlI7dC5MOyl0PXQuTDt0Lkw9ZX1lbHNlIHQuUj1lO249dH1lbHNlIHRoaXMuXz8odD1IUCh0aGlzLl8pLGUuUD1udWxsLGUuTj10LHQuUD10Lkw9ZSxuPXQpOihlLlA9ZS5OPW51bGwsdGhpcy5fPWUsbj1udWxsKTtmb3IoZS5MPWUuUj1udWxsLGUuVT1uLGUuQz0hMCx0PWU7biYmbi5DOyluPT09KGk9bi5VKS5MPyhyPWkuUikmJnIuQz8obi5DPXIuQz0hMSxpLkM9ITAsdD1pKToodD09PW4uUiYmKERQKHRoaXMsbiksbj0odD1uKS5VKSxuLkM9ITEsaS5DPSEwLEJQKHRoaXMsaSkpOihyPWkuTCkmJnIuQz8obi5DPXIuQz0hMSxpLkM9ITAsdD1pKToodD09PW4uTCYmKEJQKHRoaXMsbiksbj0odD1uKS5VKSxuLkM9ITEsaS5DPSEwLERQKHRoaXMsaSkpLG49dC5VO3RoaXMuXy5DPSExfSxyZW1vdmU6ZnVuY3Rpb24odCl7dC5OJiYodC5OLlA9dC5QKSx0LlAmJih0LlAuTj10Lk4pLHQuTj10LlA9bnVsbDt2YXIgZSxuLGkscj10LlUsbz10LkwsYT10LlI7aWYobj1vP2E/SFAoYSk6bzphLHI/ci5MPT09dD9yLkw9bjpyLlI9bjp0aGlzLl89bixvJiZhPyhpPW4uQyxuLkM9dC5DLG4uTD1vLG8uVT1uLG4hPT1hPyhyPW4uVSxuLlU9dC5VLHIuTD10PW4uUixuLlI9YSxhLlU9bik6KG4uVT1yLHI9bix0PW4uUikpOihpPXQuQyx0PW4pLHQmJih0LlU9ciksIWkpaWYodCYmdC5DKXQuQz0hMTtlbHNle2Rve2lmKHQ9PT10aGlzLl8pYnJlYWs7aWYodD09PXIuTCl7aWYoKGU9ci5SKS5DJiYoZS5DPSExLHIuQz0hMCxEUCh0aGlzLHIpLGU9ci5SKSxlLkwmJmUuTC5DfHxlLlImJmUuUi5DKXtlLlImJmUuUi5DfHwoZS5MLkM9ITEsZS5DPSEwLEJQKHRoaXMsZSksZT1yLlIpLGUuQz1yLkMsci5DPWUuUi5DPSExLERQKHRoaXMsciksdD10aGlzLl87YnJlYWt9fWVsc2UgaWYoKGU9ci5MKS5DJiYoZS5DPSExLHIuQz0hMCxCUCh0aGlzLHIpLGU9ci5MKSxlLkwmJmUuTC5DfHxlLlImJmUuUi5DKXtlLkwmJmUuTC5DfHwoZS5SLkM9ITEsZS5DPSEwLERQKHRoaXMsZSksZT1yLkwpLGUuQz1yLkMsci5DPWUuTC5DPSExLEJQKHRoaXMsciksdD10aGlzLl87YnJlYWt9ZS5DPSEwLHQ9cixyPXIuVX13aGlsZSghdC5DKTt0JiYodC5DPSExKX19fTt2YXIgWFAsJFA9W107ZnVuY3Rpb24gS1AoKXt6UCh0aGlzKSx0aGlzLng9dGhpcy55PXRoaXMuYXJjPXRoaXMuc2l0ZT10aGlzLmN5PW51bGx9ZnVuY3Rpb24gWlAodCl7dmFyIGU9dC5QLG49dC5OO2lmKGUmJm4pe3ZhciBpPWUuc2l0ZSxyPXQuc2l0ZSxvPW4uc2l0ZTtpZihpIT09byl7dmFyIGE9clswXSxzPXJbMV0sbD1pWzBdLWEsYz1pWzFdLXMsdT1vWzBdLWEsaD1vWzFdLXMsZD0yKihsKmgtYyp1KTtpZighKGQ+PS1kTikpe3ZhciBwPWwqbCtjKmMsZj11KnUraCpoLG09KGgqcC1jKmYpL2QsZz0obCpmLXUqcCkvZCxfPSRQLnBvcCgpfHxuZXcgS1A7Xy5hcmM9dCxfLnNpdGU9cixfLng9bSthLF8ueT0oXy5jeT1nK3MpK01hdGguc3FydChtKm0rZypnKSx0LmNpcmNsZT1fO2Zvcih2YXIgeT1udWxsLHY9Y04uXzt2OylpZihfLnk8di55fHxfLnk9PT12LnkmJl8ueDw9di54KXtpZighdi5MKXt5PXYuUDticmVha312PXYuTH1lbHNle2lmKCF2LlIpe3k9djticmVha312PXYuUn1jTi5pbnNlcnQoeSxfKSx5fHwoWFA9Xyl9fX19ZnVuY3Rpb24gSlAodCl7dmFyIGU9dC5jaXJjbGU7ZSYmKGUuUHx8KFhQPWUuTiksY04ucmVtb3ZlKGUpLCRQLnB1c2goZSkselAoZSksdC5jaXJjbGU9bnVsbCl9dmFyIFFQPVtdO2Z1bmN0aW9uIHROKCl7elAodGhpcyksdGhpcy5lZGdlPXRoaXMuc2l0ZT10aGlzLmNpcmNsZT1udWxsfWZ1bmN0aW9uIGVOKHQpe3ZhciBlPVFQLnBvcCgpfHxuZXcgdE47cmV0dXJuIGUuc2l0ZT10LGV9ZnVuY3Rpb24gbk4odCl7SlAodCksc04ucmVtb3ZlKHQpLFFQLnB1c2godCkselAodCl9ZnVuY3Rpb24gaU4odCl7dmFyIGU9dC5jaXJjbGUsbj1lLngsaT1lLmN5LHI9W24saV0sbz10LlAsYT10Lk4scz1bdF07bk4odCk7Zm9yKHZhciBsPW87bC5jaXJjbGUmJk1hdGguYWJzKG4tbC5jaXJjbGUueCk8aE4mJk1hdGguYWJzKGktbC5jaXJjbGUuY3kpPGhOOylvPWwuUCxzLnVuc2hpZnQobCksbk4obCksbD1vO3MudW5zaGlmdChsKSxKUChsKTtmb3IodmFyIGM9YTtjLmNpcmNsZSYmTWF0aC5hYnMobi1jLmNpcmNsZS54KTxoTiYmTWF0aC5hYnMoaS1jLmNpcmNsZS5jeSk8aE47KWE9Yy5OLHMucHVzaChjKSxuTihjKSxjPWE7cy5wdXNoKGMpLEpQKGMpO3ZhciB1LGg9cy5sZW5ndGg7Zm9yKHU9MTt1PGg7Kyt1KVVQKChjPXNbdV0pLmVkZ2UsKGw9c1t1LTFdKS5zaXRlLGMuc2l0ZSxyKTsoYz1zW2gtMV0pLmVkZ2U9RlAoKGw9c1swXSkuc2l0ZSxjLnNpdGUsbnVsbCxyKSxaUChsKSxaUChjKX1mdW5jdGlvbiByTih0KXtmb3IodmFyIGUsbixpLHIsbz10WzBdLGE9dFsxXSxzPXNOLl87czspaWYoKGk9b04ocyxhKS1vKT5oTilzPXMuTDtlbHNle2lmKCEoKHI9by1hTihzLGEpKT5oTikpe2k+LWhOPyhlPXMuUCxuPXMpOnI+LWhOPyhlPXMsbj1zLk4pOmU9bj1zO2JyZWFrfWlmKCFzLlIpe2U9czticmVha31zPXMuUn0hKGZ1bmN0aW9uIGwodCl7bE5bdC5pbmRleF09e3NpdGU6dCxoYWxmZWRnZXM6W119fSkodCk7dmFyIGM9ZU4odCk7aWYoc04uaW5zZXJ0KGUsYyksZXx8bil7aWYoZT09PW4pcmV0dXJuIEpQKGUpLG49ZU4oZS5zaXRlKSxzTi5pbnNlcnQoYyxuKSxjLmVkZ2U9bi5lZGdlPUZQKGUuc2l0ZSxjLnNpdGUpLFpQKGUpLHZvaWQgWlAobik7aWYobil7SlAoZSksSlAobik7dmFyIHU9ZS5zaXRlLGg9dVswXSxkPXVbMV0scD10WzBdLWgsZj10WzFdLWQsbT1uLnNpdGUsZz1tWzBdLWgsXz1tWzFdLWQseT0yKihwKl8tZipnKSx2PXAqcCtmKmYsYj1nKmcrXypfLHg9WyhfKnYtZipiKS95K2gsKHAqYi1nKnYpL3krZF07VVAobi5lZGdlLHUsbSx4KSxjLmVkZ2U9RlAodSx0LG51bGwseCksbi5lZGdlPUZQKHQsbSxudWxsLHgpLFpQKGUpLFpQKG4pfWVsc2UgYy5lZGdlPUZQKGUuc2l0ZSxjLnNpdGUpfX1mdW5jdGlvbiBvTih0LGUpe3ZhciBuPXQuc2l0ZSxpPW5bMF0scj1uWzFdLG89ci1lO2lmKCFvKXJldHVybiBpO3ZhciBhPXQuUDtpZighYSlyZXR1cm4tMS8wO3ZhciBzPShuPWEuc2l0ZSlbMF0sbD1uWzFdLGM9bC1lO2lmKCFjKXJldHVybiBzO3ZhciB1PXMtaSxoPTEvby0xL2MsZD11L2M7cmV0dXJuIGg/KC1kK01hdGguc3FydChkKmQtMipoKih1KnUvKC0yKmMpLWwrYy8yK3Itby8yKSkpL2graTooaStzKS8yfWZ1bmN0aW9uIGFOKHQsZSl7dmFyIG49dC5OO2lmKG4pcmV0dXJuIG9OKG4sZSk7dmFyIGk9dC5zaXRlO3JldHVybiBpWzFdPT09ZT9pWzBdOjEvMH12YXIgc04sbE4sY04sdU4saE49MWUtNixkTj0xZS0xMjtmdW5jdGlvbiBwTih0LGUsbil7cmV0dXJuKHRbMF0tblswXSkqKGVbMV0tdFsxXSktKHRbMF0tZVswXSkqKG5bMV0tdFsxXSl9ZnVuY3Rpb24gZk4odCxlKXtyZXR1cm4gZVsxXS10WzFdfHxlWzBdLXRbMF19ZnVuY3Rpb24gbU4odCxlKXt2YXIgbixpLHIsbz10LnNvcnQoZk4pLnBvcCgpO2Zvcih1Tj1bXSxsTj1uZXcgQXJyYXkodC5sZW5ndGgpLHNOPW5ldyBPUCxjTj1uZXcgT1A7OylpZihyPVhQLG8mJighcnx8b1sxXTxyLnl8fG9bMV09PT1yLnkmJm9bMF08ci54KSlvWzBdPT09biYmb1sxXT09PWl8fChyTihvKSxuPW9bMF0saT1vWzFdKSxvPXQucG9wKCk7ZWxzZXtpZighcilicmVhaztpTihyLmFyYyl9aWYoKGZ1bmN0aW9uIGEoKXtmb3IodmFyIHQsZSxuLGkscj0wLG89bE4ubGVuZ3RoO3I8bzsrK3IpaWYoKHQ9bE5bcl0pJiYoaT0oZT10LmhhbGZlZGdlcykubGVuZ3RoKSl7dmFyIGE9bmV3IEFycmF5KGkpLHM9bmV3IEFycmF5KGkpO2ZvcihuPTA7bjxpOysrbilhW25dPW4sc1tuXT1XUCh0LHVOW2Vbbl1dKTtmb3IoYS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBzW2VdLXNbdF19KSksbj0wO248aTsrK24pc1tuXT1lW2Fbbl1dO2ZvcihuPTA7bjxpOysrbillW25dPXNbbl19fSkoKSxlKXt2YXIgcz0rZVswXVswXSxsPStlWzBdWzFdLGM9K2VbMV1bMF0sdT0rZVsxXVsxXTshKGZ1bmN0aW9uIGgodCxlLG4saSl7Zm9yKHZhciByLG89dU4ubGVuZ3RoO28tLTspR1Aocj11TltvXSx0LGUsbixpKSYmalAocix0LGUsbixpKSYmKE1hdGguYWJzKHJbMF1bMF0tclsxXVswXSk+aE58fE1hdGguYWJzKHJbMF1bMV0tclsxXVsxXSk+aE4pfHxkZWxldGUgdU5bb119KShzLGwsYyx1KSwoZnVuY3Rpb24gZCh0LGUsbixpKXt2YXIgcixvLGEscyxsLGMsdSxoLGQscCxmLG0sZz1sTi5sZW5ndGgsXz0hMDtmb3Iocj0wO3I8ZzsrK3IpaWYobz1sTltyXSl7Zm9yKGE9by5zaXRlLHM9KGw9by5oYWxmZWRnZXMpLmxlbmd0aDtzLS07KXVOW2xbc11dfHxsLnNwbGljZShzLDEpO2ZvcihzPTAsYz1sLmxlbmd0aDtzPGM7KWY9KHA9WVAobyx1TltsW3NdXSkpWzBdLG09cFsxXSxoPSh1PXFQKG8sdU5bbFsrK3MlY11dKSlbMF0sZD11WzFdLChNYXRoLmFicyhmLWgpPmhOfHxNYXRoLmFicyhtLWQpPmhOKSYmKGwuc3BsaWNlKHMsMCx1Ti5wdXNoKFZQKGEscCxNYXRoLmFicyhmLXQpPGhOJiZpLW0+aE4/W3QsTWF0aC5hYnMoaC10KTxoTj9kOmldOk1hdGguYWJzKG0taSk8aE4mJm4tZj5oTj9bTWF0aC5hYnMoZC1pKTxoTj9oOm4saV06TWF0aC5hYnMoZi1uKTxoTiYmbS1lPmhOP1tuLE1hdGguYWJzKGgtbik8aE4/ZDplXTpNYXRoLmFicyhtLWUpPGhOJiZmLXQ+aE4/W01hdGguYWJzKGQtZSk8aE4/aDp0LGVdOm51bGwpKS0xKSwrK2MpO2MmJihfPSExKX1pZihfKXt2YXIgeSx2LGIseD0xLzA7Zm9yKHI9MCxfPW51bGw7cjxnOysrcikobz1sTltyXSkmJihiPSh5PShhPW8uc2l0ZSlbMF0tdCkqeSsodj1hWzFdLWUpKnYpPHgmJih4PWIsXz1vKTtpZihfKXt2YXIgdz1bdCxlXSxTPVt0LGldLE09W24saV0sRT1bbixlXTtfLmhhbGZlZGdlcy5wdXNoKHVOLnB1c2goVlAoYT1fLnNpdGUsdyxTKSktMSx1Ti5wdXNoKFZQKGEsUyxNKSktMSx1Ti5wdXNoKFZQKGEsTSxFKSktMSx1Ti5wdXNoKFZQKGEsRSx3KSktMSl9fWZvcihyPTA7cjxnOysrcikobz1sTltyXSkmJihvLmhhbGZlZGdlcy5sZW5ndGh8fGRlbGV0ZSBsTltyXSl9KShzLGwsYyx1KX10aGlzLmVkZ2VzPXVOLHRoaXMuY2VsbHM9bE4sc049Y049dU49bE49bnVsbH1mdW5jdGlvbiBnTih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gX04odCxlLG4pe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPWUsdGhpcy50cmFuc2Zvcm09bn1mdW5jdGlvbiB5Tih0LGUsbil7dGhpcy5rPXQsdGhpcy54PWUsdGhpcy55PW59bU4ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjptTixwb2x5Z29uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMubWFwKChmdW5jdGlvbihlKXt2YXIgbj1lLmhhbGZlZGdlcy5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiBxUChlLHRbbl0pfSkpO3JldHVybiBuLmRhdGE9ZS5zaXRlLmRhdGEsbn0pKX0sdHJpYW5nbGVzOmZ1bmN0aW9uKCl7dmFyIHQ9W10sZT10aGlzLmVkZ2VzO3JldHVybiB0aGlzLmNlbGxzLmZvckVhY2goKGZ1bmN0aW9uKG4saSl7aWYobz0ocj1uLmhhbGZlZGdlcykubGVuZ3RoKWZvcih2YXIgcixvLGEscz1uLnNpdGUsbD0tMSxjPWVbcltvLTFdXSx1PWMubGVmdD09PXM/Yy5yaWdodDpjLmxlZnQ7KytsPG87KWE9dSx1PShjPWVbcltsXV0pLmxlZnQ9PT1zP2MucmlnaHQ6Yy5sZWZ0LGEmJnUmJmk8YS5pbmRleCYmaTx1LmluZGV4JiZwTihzLGEsdSk8MCYmdC5wdXNoKFtzLmRhdGEsYS5kYXRhLHUuZGF0YV0pfSkpLHR9LGxpbmtzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZXMuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5yaWdodH0pKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybntzb3VyY2U6dC5sZWZ0LmRhdGEsdGFyZ2V0OnQucmlnaHQuZGF0YX19KSl9LGZpbmQ6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaSxyLG89dGhpcyxhPW8uX2ZvdW5kfHwwLHM9by5jZWxscy5sZW5ndGg7IShyPW8uY2VsbHNbYV0pOylpZigrK2E+PXMpcmV0dXJuIG51bGw7dmFyIGw9dC1yLnNpdGVbMF0sYz1lLXIuc2l0ZVsxXSx1PWwqbCtjKmM7ZG97cj1vLmNlbGxzW2k9YV0sYT1udWxsLHIuaGFsZmVkZ2VzLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBpPW8uZWRnZXNbbl0scz1pLmxlZnQ7aWYocyE9PXIuc2l0ZSYmc3x8KHM9aS5yaWdodCkpe3ZhciBsPXQtc1swXSxjPWUtc1sxXSxoPWwqbCtjKmM7aDx1JiYodT1oLGE9cy5pbmRleCl9fSkpfXdoaWxlKG51bGwhPT1hKTtyZXR1cm4gby5fZm91bmQ9aSxudWxsPT1ufHx1PD1uKm4/ci5zaXRlOm51bGx9fSx5Ti5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnlOLHNjYWxlOmZ1bmN0aW9uKHQpe3JldHVybiAxPT09dD90aGlzOm5ldyB5Tih0aGlzLmsqdCx0aGlzLngsdGhpcy55KX0sdHJhbnNsYXRlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIDA9PT10JjA9PT1lP3RoaXM6bmV3IHlOKHRoaXMuayx0aGlzLngrdGhpcy5rKnQsdGhpcy55K3RoaXMuayplKX0sYXBwbHk6ZnVuY3Rpb24odCl7cmV0dXJuW3RbMF0qdGhpcy5rK3RoaXMueCx0WzFdKnRoaXMuayt0aGlzLnldfSxhcHBseVg6ZnVuY3Rpb24odCl7cmV0dXJuIHQqdGhpcy5rK3RoaXMueH0sYXBwbHlZOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuayt0aGlzLnl9LGludmVydDpmdW5jdGlvbih0KXtyZXR1cm5bKHRbMF0tdGhpcy54KS90aGlzLmssKHRbMV0tdGhpcy55KS90aGlzLmtdfSxpbnZlcnRYOmZ1bmN0aW9uKHQpe3JldHVybih0LXRoaXMueCkvdGhpcy5rfSxpbnZlcnRZOmZ1bmN0aW9uKHQpe3JldHVybih0LXRoaXMueSkvdGhpcy5rfSxyZXNjYWxlWDpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCkuZG9tYWluKHQucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRYLHRoaXMpLm1hcCh0LmludmVydCx0KSl9LHJlc2NhbGVZOmZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoKS5kb21haW4odC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksdGhpcykubWFwKHQuaW52ZXJ0LHQpKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4idHJhbnNsYXRlKCIrdGhpcy54KyIsIit0aGlzLnkrIikgc2NhbGUoIit0aGlzLmsrIikifX07dmFyIHZOPW5ldyB5TigxLDAsMCk7ZnVuY3Rpb24gYk4odCl7Zm9yKDshdC5fX3pvb207KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybiB2TjtyZXR1cm4gdC5fX3pvb219ZnVuY3Rpb24geE4oKXt1dS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiB3Tigpe3V1LnByZXZlbnREZWZhdWx0KCksdXUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gU04oKXtyZXR1cm4hdXUuY3RybEtleSYmIXV1LmJ1dHRvbn1mdW5jdGlvbiBNTigpe3ZhciB0PXRoaXM7cmV0dXJuIHQgaW5zdGFuY2VvZiBTVkdFbGVtZW50Pyh0PXQub3duZXJTVkdFbGVtZW50fHx0KS5oYXNBdHRyaWJ1dGUoInZpZXdCb3giKT9bWyh0PXQudmlld0JveC5iYXNlVmFsKS54LHQueV0sW3QueCt0LndpZHRoLHQueSt0LmhlaWdodF1dOltbMCwwXSxbdC53aWR0aC5iYXNlVmFsLnZhbHVlLHQuaGVpZ2h0LmJhc2VWYWwudmFsdWVdXTpbWzAsMF0sW3QuY2xpZW50V2lkdGgsdC5jbGllbnRIZWlnaHRdXX1mdW5jdGlvbiBFTigpe3JldHVybiB0aGlzLl9fem9vbXx8dk59ZnVuY3Rpb24gVE4oKXtyZXR1cm4tdXUuZGVsdGFZKigxPT09dXUuZGVsdGFNb2RlPy4wNTp1dS5kZWx0YU1vZGU/MTouMDAyKX1mdW5jdGlvbiBDTigpe3JldHVybiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHN8fCJvbnRvdWNoc3RhcnQiaW4gdGhpc31mdW5jdGlvbiBBTih0LGUsbil7dmFyIGk9dC5pbnZlcnRYKGVbMF1bMF0pLW5bMF1bMF0scj10LmludmVydFgoZVsxXVswXSktblsxXVswXSxvPXQuaW52ZXJ0WShlWzBdWzFdKS1uWzBdWzFdLGE9dC5pbnZlcnRZKGVbMV1bMV0pLW5bMV1bMV07cmV0dXJuIHQudHJhbnNsYXRlKHI+aT8oaStyKS8yOk1hdGgubWluKDAsaSl8fE1hdGgubWF4KDAsciksYT5vPyhvK2EpLzI6TWF0aC5taW4oMCxvKXx8TWF0aC5tYXgoMCxhKSl9ZnVuY3Rpb24ga04oKXt2YXIgdCxlLG49U04saT1NTixyPUFOLG89VE4sYT1DTixzPVswLDEvMF0sbD1bWy0xLzAsLTEvMF0sWzEvMCwxLzBdXSxjPTI1MCx1PW9wLGg9bGMoInN0YXJ0Iiwiem9vbSIsImVuZCIpLGQ9NTAwLHA9MDtmdW5jdGlvbiBmKHQpe3QucHJvcGVydHkoIl9fem9vbSIsRU4pLm9uKCJ3aGVlbC56b29tIix4KS5vbigibW91c2Vkb3duLnpvb20iLHcpLm9uKCJkYmxjbGljay56b29tIixTKS5maWx0ZXIoYSkub24oInRvdWNoc3RhcnQuem9vbSIsTSkub24oInRvdWNobW92ZS56b29tIixFKS5vbigidG91Y2hlbmQuem9vbSB0b3VjaGNhbmNlbC56b29tIixUKS5zdHlsZSgidG91Y2gtYWN0aW9uIiwibm9uZSIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIil9ZnVuY3Rpb24gbSh0LGUpe3JldHVybihlPU1hdGgubWF4KHNbMF0sTWF0aC5taW4oc1sxXSxlKSkpPT09dC5rP3Q6bmV3IHlOKGUsdC54LHQueSl9ZnVuY3Rpb24gZyh0LGUsbil7dmFyIGk9ZVswXS1uWzBdKnQuayxyPWVbMV0tblsxXSp0Lms7cmV0dXJuIGk9PT10LngmJnI9PT10Lnk/dDpuZXcgeU4odC5rLGkscil9ZnVuY3Rpb24gXyh0KXtyZXR1cm5bKCt0WzBdWzBdKyArdFsxXVswXSkvMiwoK3RbMF1bMV0rICt0WzFdWzFdKS8yXX1mdW5jdGlvbiB5KHQsZSxuKXt0Lm9uKCJzdGFydC56b29tIiwoZnVuY3Rpb24oKXt2KHRoaXMsYXJndW1lbnRzKS5zdGFydCgpfSkpLm9uKCJpbnRlcnJ1cHQuem9vbSBlbmQuem9vbSIsKGZ1bmN0aW9uKCl7dih0aGlzLGFyZ3VtZW50cykuZW5kKCl9KSkudHdlZW4oInpvb20iLChmdW5jdGlvbigpe3ZhciB0PXRoaXMscj1hcmd1bWVudHMsbz12KHQsciksYT1pLmFwcGx5KHQscikscz1udWxsPT1uP18oYSk6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0LHIpOm4sbD1NYXRoLm1heChhWzFdWzBdLWFbMF1bMF0sYVsxXVsxXS1hWzBdWzFdKSxjPXQuX196b29tLGg9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0LHIpOmUsZD11KGMuaW52ZXJ0KHMpLmNvbmNhdChsL2MuayksaC5pbnZlcnQocykuY29uY2F0KGwvaC5rKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKDE9PT10KXQ9aDtlbHNle3ZhciBlPWQodCksbj1sL2VbMl07dD1uZXcgeU4obixzWzBdLWVbMF0qbixzWzFdLWVbMV0qbil9by56b29tKG51bGwsdCl9fSkpfWZ1bmN0aW9uIHYodCxlLG4pe3JldHVybiFuJiZ0Ll9fem9vbWluZ3x8bmV3IGIodCxlKX1mdW5jdGlvbiBiKHQsZSl7dGhpcy50aGF0PXQsdGhpcy5hcmdzPWUsdGhpcy5hY3RpdmU9MCx0aGlzLmV4dGVudD1pLmFwcGx5KHQsZSksdGhpcy50YXBzPTB9ZnVuY3Rpb24geCgpe2lmKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdD12KHRoaXMsYXJndW1lbnRzKSxlPXRoaXMuX196b29tLGk9TWF0aC5tYXgoc1swXSxNYXRoLm1pbihzWzFdLGUuaypNYXRoLnBvdygyLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpKSkpLGE9YWgodGhpcyk7aWYodC53aGVlbCl0Lm1vdXNlWzBdWzBdPT09YVswXSYmdC5tb3VzZVswXVsxXT09PWFbMV18fCh0Lm1vdXNlWzFdPWUuaW52ZXJ0KHQubW91c2VbMF09YSkpLGNsZWFyVGltZW91dCh0LndoZWVsKTtlbHNle2lmKGUuaz09PWkpcmV0dXJuO3QubW91c2U9W2EsZS5pbnZlcnQoYSldLFZwKHRoaXMpLHQuc3RhcnQoKX13TigpLHQud2hlZWw9c2V0VGltZW91dChjLDE1MCksdC56b29tKCJtb3VzZSIscihnKG0oZSxpKSx0Lm1vdXNlWzBdLHQubW91c2VbMV0pLHQuZXh0ZW50LGwpKX1mdW5jdGlvbiBjKCl7dC53aGVlbD1udWxsLHQuZW5kKCl9fWZ1bmN0aW9uIHcoKXtpZighZSYmbi5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciB0PXYodGhpcyxhcmd1bWVudHMsITApLGk9U3UodXUudmlldykub24oIm1vdXNlbW92ZS56b29tIixjLCEwKS5vbigibW91c2V1cC56b29tIix1LCEwKSxvPWFoKHRoaXMpLGE9dXUuY2xpZW50WCxzPXV1LmNsaWVudFk7aGgodXUudmlldykseE4oKSx0Lm1vdXNlPVtvLHRoaXMuX196b29tLmludmVydChvKV0sVnAodGhpcyksdC5zdGFydCgpfWZ1bmN0aW9uIGMoKXtpZih3TigpLCF0Lm1vdmVkKXt2YXIgZT11dS5jbGllbnRYLWEsbj11dS5jbGllbnRZLXM7dC5tb3ZlZD1lKmUrbipuPnB9dC56b29tKCJtb3VzZSIscihnKHQudGhhdC5fX3pvb20sdC5tb3VzZVswXT1haCh0LnRoYXQpLHQubW91c2VbMV0pLHQuZXh0ZW50LGwpKX1mdW5jdGlvbiB1KCl7aS5vbigibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tIixudWxsKSxkaCh1dS52aWV3LHQubW92ZWQpLHdOKCksdC5lbmQoKX19ZnVuY3Rpb24gUygpe2lmKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdD10aGlzLl9fem9vbSxlPWFoKHRoaXMpLG89dC5pbnZlcnQoZSksYT10LmsqKHV1LnNoaWZ0S2V5Py41OjIpLHM9cihnKG0odCxhKSxlLG8pLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpLGwpO3dOKCksYz4wP1N1KHRoaXMpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihjKS5jYWxsKHkscyxlKTpTdSh0aGlzKS5jYWxsKGYudHJhbnNmb3JtLHMpfX1mdW5jdGlvbiBNKCl7aWYobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBlLGkscixvLGE9dXUudG91Y2hlcyxzPWEubGVuZ3RoLGw9dih0aGlzLGFyZ3VtZW50cyx1dS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg9PT1zKTtmb3IoeE4oKSxpPTA7aTxzOysraSlvPVtvPWxoKHRoaXMsYSwocj1hW2ldKS5pZGVudGlmaWVyKSx0aGlzLl9fem9vbS5pbnZlcnQobyksci5pZGVudGlmaWVyXSxsLnRvdWNoMD9sLnRvdWNoMXx8bC50b3VjaDBbMl09PT1vWzJdfHwobC50b3VjaDE9byxsLnRhcHM9MCk6KGwudG91Y2gwPW8sZT0hMCxsLnRhcHM9MSshIXQpO3QmJih0PWNsZWFyVGltZW91dCh0KSksZSYmKGwudGFwczwyJiYodD1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3Q9bnVsbH0pLGQpKSxWcCh0aGlzKSxsLnN0YXJ0KCkpfX1mdW5jdGlvbiBFKCl7aWYodGhpcy5fX3pvb21pbmcpe3ZhciBlLG4saSxvLGE9dih0aGlzLGFyZ3VtZW50cykscz11dS5jaGFuZ2VkVG91Y2hlcyxjPXMubGVuZ3RoO2Zvcih3TigpLHQmJih0PWNsZWFyVGltZW91dCh0KSksYS50YXBzPTAsZT0wO2U8YzsrK2UpaT1saCh0aGlzLHMsKG49c1tlXSkuaWRlbnRpZmllciksYS50b3VjaDAmJmEudG91Y2gwWzJdPT09bi5pZGVudGlmaWVyP2EudG91Y2gwWzBdPWk6YS50b3VjaDEmJmEudG91Y2gxWzJdPT09bi5pZGVudGlmaWVyJiYoYS50b3VjaDFbMF09aSk7aWYobj1hLnRoYXQuX196b29tLGEudG91Y2gxKXt2YXIgdT1hLnRvdWNoMFswXSxoPWEudG91Y2gwWzFdLGQ9YS50b3VjaDFbMF0scD1hLnRvdWNoMVsxXSxmPShmPWRbMF0tdVswXSkqZisoZj1kWzFdLXVbMV0pKmYsXz0oXz1wWzBdLWhbMF0pKl8rKF89cFsxXS1oWzFdKSpfO249bShuLE1hdGguc3FydChmL18pKSxpPVsodVswXStkWzBdKS8yLCh1WzFdK2RbMV0pLzJdLG89WyhoWzBdK3BbMF0pLzIsKGhbMV0rcFsxXSkvMl19ZWxzZXtpZighYS50b3VjaDApcmV0dXJuO2k9YS50b3VjaDBbMF0sbz1hLnRvdWNoMFsxXX1hLnpvb20oInRvdWNoIixyKGcobixpLG8pLGEuZXh0ZW50LGwpKX19ZnVuY3Rpb24gVCgpe2lmKHRoaXMuX196b29taW5nKXt2YXIgdCxuLGk9dih0aGlzLGFyZ3VtZW50cykscj11dS5jaGFuZ2VkVG91Y2hlcyxvPXIubGVuZ3RoO2Zvcih4TigpLGUmJmNsZWFyVGltZW91dChlKSxlPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZT1udWxsfSksZCksdD0wO3Q8bzsrK3Qpbj1yW3RdLGkudG91Y2gwJiZpLnRvdWNoMFsyXT09PW4uaWRlbnRpZmllcj9kZWxldGUgaS50b3VjaDA6aS50b3VjaDEmJmkudG91Y2gxWzJdPT09bi5pZGVudGlmaWVyJiZkZWxldGUgaS50b3VjaDE7aWYoaS50b3VjaDEmJiFpLnRvdWNoMCYmKGkudG91Y2gwPWkudG91Y2gxLGRlbGV0ZSBpLnRvdWNoMSksaS50b3VjaDApaS50b3VjaDBbMV09dGhpcy5fX3pvb20uaW52ZXJ0KGkudG91Y2gwWzBdKTtlbHNlIGlmKGkuZW5kKCksMj09PWkudGFwcyl7dmFyIGE9U3UodGhpcykub24oImRibGNsaWNrLnpvb20iKTthJiZhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19fXJldHVybiBmLnRyYW5zZm9ybT1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5zZWxlY3Rpb24/dC5zZWxlY3Rpb24oKTp0O2kucHJvcGVydHkoIl9fem9vbSIsRU4pLHQhPT1pP3kodCxlLG4pOmkuaW50ZXJydXB0KCkuZWFjaCgoZnVuY3Rpb24oKXt2KHRoaXMsYXJndW1lbnRzKS5zdGFydCgpLnpvb20obnVsbCwiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplKS5lbmQoKX0pKX0sZi5zY2FsZUJ5PWZ1bmN0aW9uKHQsZSxuKXtmLnNjYWxlVG8odCwoZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9fem9vbS5rLG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZTtyZXR1cm4gdCpufSksbil9LGYuc2NhbGVUbz1mdW5jdGlvbih0LGUsbil7Zi50cmFuc2Zvcm0odCwoZnVuY3Rpb24oKXt2YXIgdD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxvPXRoaXMuX196b29tLGE9bnVsbD09bj9fKHQpOiJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm4scz1vLmludmVydChhKSxjPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmU7cmV0dXJuIHIoZyhtKG8sYyksYSxzKSx0LGwpfSksbil9LGYudHJhbnNsYXRlQnk9ZnVuY3Rpb24odCxlLG4pe2YudHJhbnNmb3JtKHQsKGZ1bmN0aW9uKCl7cmV0dXJuIHIodGhpcy5fX3pvb20udHJhbnNsYXRlKCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUsImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6biksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyksbCl9KSl9LGYudHJhbnNsYXRlVG89ZnVuY3Rpb24odCxlLG4sbyl7Zi50cmFuc2Zvcm0odCwoZnVuY3Rpb24oKXt2YXIgdD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhPXRoaXMuX196b29tLHM9bnVsbD09bz9fKHQpOiJmdW5jdGlvbiI9PXR5cGVvZiBvP28uYXBwbHkodGhpcyxhcmd1bWVudHMpOm87cmV0dXJuIHIodk4udHJhbnNsYXRlKHNbMF0sc1sxXSkuc2NhbGUoYS5rKS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIGU/LWUuYXBwbHkodGhpcyxhcmd1bWVudHMpOi1lLCJmdW5jdGlvbiI9PXR5cGVvZiBuPy1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTotbiksdCxsKX0pLG8pfSxiLnByb3RvdHlwZT17c3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gMT09Kyt0aGlzLmFjdGl2ZSYmKHRoaXMudGhhdC5fX3pvb21pbmc9dGhpcyx0aGlzLmVtaXQoInN0YXJ0IikpLHRoaXN9LHpvb206ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5tb3VzZSYmIm1vdXNlIiE9PXQmJih0aGlzLm1vdXNlWzFdPWUuaW52ZXJ0KHRoaXMubW91c2VbMF0pKSx0aGlzLnRvdWNoMCYmInRvdWNoIiE9PXQmJih0aGlzLnRvdWNoMFsxXT1lLmludmVydCh0aGlzLnRvdWNoMFswXSkpLHRoaXMudG91Y2gxJiYidG91Y2giIT09dCYmKHRoaXMudG91Y2gxWzFdPWUuaW52ZXJ0KHRoaXMudG91Y2gxWzBdKSksdGhpcy50aGF0Ll9fem9vbT1lLHRoaXMuZW1pdCgiem9vbSIpLHRoaXN9LGVuZDpmdW5jdGlvbigpe3JldHVybiAwPT0tLXRoaXMuYWN0aXZlJiYoZGVsZXRlIHRoaXMudGhhdC5fX3pvb21pbmcsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXtndShuZXcgX04oZix0LHRoaXMudGhhdC5fX3pvb20pLGguYXBwbHksaCxbdCx0aGlzLnRoYXQsdGhpcy5hcmdzXSl9fSxmLndoZWVsRGVsdGE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpnTigrdCksZik6b30sZi5maWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpnTighIXQpLGYpOm59LGYudG91Y2hhYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Z04oISF0KSxmKTphfSxmLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmdOKFtbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dKSxmKTppfSxmLnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzWzBdPSt0WzBdLHNbMV09K3RbMV0sZik6W3NbMF0sc1sxXV19LGYudHJhbnNsYXRlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsWzBdWzBdPSt0WzBdWzBdLGxbMV1bMF09K3RbMV1bMF0sbFswXVsxXT0rdFswXVsxXSxsWzFdWzFdPSt0WzFdWzFdLGYpOltbbFswXVswXSxsWzBdWzFdXSxbbFsxXVswXSxsWzFdWzFdXV19LGYuY29uc3RyYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsZik6cn0sZi5kdXJhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0rdCxmKTpjfSxmLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsZik6dX0sZi5vbj1mdW5jdGlvbigpe3ZhciB0PWgub24uYXBwbHkoaCxhcmd1bWVudHMpO3JldHVybiB0PT09aD9mOnR9LGYuY2xpY2tEaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0odD0rdCkqdCxmKTpNYXRoLnNxcnQocCl9LGZ9Yk4ucHJvdG90eXBlPXlOLnByb3RvdHlwZTt2YXIgTE49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdmVyc2lvbjoiNS43LjAiLGJpc2VjdDpTbCxiaXNlY3RSaWdodDpTbCxiaXNlY3RMZWZ0Ok1sLGFzY2VuZGluZzpibCxiaXNlY3Rvcjp4bCxjcm9zczpUbCxkZXNjZW5kaW5nOmZ1bmN0aW9uIFBOKHQsZSl7cmV0dXJuIGU8dD8tMTplPnQ/MTplPj10PzA6TmFOfSxkZXZpYXRpb246a2wsZXh0ZW50OkxsLGhpc3RvZ3JhbTpmdW5jdGlvbiBOTigpe3ZhciB0PU9sLGU9TGwsbj1qbDtmdW5jdGlvbiBpKGkpe3ZhciByLG8sYT1pLmxlbmd0aCxzPW5ldyBBcnJheShhKTtmb3Iocj0wO3I8YTsrK3Ipc1tyXT10KGlbcl0scixpKTt2YXIgbD1lKHMpLGM9bFswXSx1PWxbMV0saD1uKHMsYyx1KTtBcnJheS5pc0FycmF5KGgpfHwoaD1VbChjLHUsaCksaD16bChNYXRoLmNlaWwoYy9oKSpoLHUsaCkpO2Zvcih2YXIgZD1oLmxlbmd0aDtoWzBdPD1jOyloLnNoaWZ0KCksLS1kO2Zvcig7aFtkLTFdPnU7KWgucG9wKCksLS1kO3ZhciBwLGY9bmV3IEFycmF5KGQrMSk7Zm9yKHI9MDtyPD1kOysrcikocD1mW3JdPVtdKS54MD1yPjA/aFtyLTFdOmMscC54MT1yPGQ/aFtyXTp1O2ZvcihyPTA7cjxhOysrciljPD0obz1zW3JdKSYmbzw9dSYmZltTbChoLG8sMCxkKV0ucHVzaChpW3JdKTtyZXR1cm4gZn1yZXR1cm4gaS52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOlJsKGUpLGkpOnR9LGkuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmwoW3RbMF0sdFsxXV0pLGkpOmV9LGkudGhyZXNob2xkcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkFycmF5LmlzQXJyYXkodCk/UmwoTmwuY2FsbCh0KSk6UmwodCksaSk6bn0saX0sdGhyZXNob2xkRnJlZWRtYW5EaWFjb25pczpmdW5jdGlvbiBJTih0LGUsbil7cmV0dXJuIHQ9SWwuY2FsbCh0LENsKS5zb3J0KGJsKSxNYXRoLmNlaWwoKG4tZSkvKDIqKEdsKHQsLjc1KS1HbCh0LC4yNSkpKk1hdGgucG93KHQubGVuZ3RoLC0xLzMpKSl9LHRocmVzaG9sZFNjb3R0OmZ1bmN0aW9uIFJOKHQsZSxuKXtyZXR1cm4gTWF0aC5jZWlsKChuLWUpLygzLjUqa2wodCkqTWF0aC5wb3codC5sZW5ndGgsLTEvMykpKX0sdGhyZXNob2xkU3R1cmdlczpqbCxtYXg6V2wsbWVhbjpmdW5jdGlvbiBPTih0LGUpe3ZhciBuLGk9dC5sZW5ndGgscj1pLG89LTEsYT0wO2lmKG51bGw9PWUpZm9yKDsrK288aTspaXNOYU4obj1DbCh0W29dKSk/LS1yOmErPW47ZWxzZSBmb3IoOysrbzxpOylpc05hTihuPUNsKGUodFtvXSxvLHQpKSk/LS1yOmErPW47aWYocilyZXR1cm4gYS9yfSxtZWRpYW46ZnVuY3Rpb24gek4odCxlKXt2YXIgbixpPXQubGVuZ3RoLHI9LTEsbz1bXTtpZihudWxsPT1lKWZvcig7KytyPGk7KWlzTmFOKG49Q2wodFtyXSkpfHxvLnB1c2gobik7ZWxzZSBmb3IoOysrcjxpOylpc05hTihuPUNsKGUodFtyXSxyLHQpKSl8fG8ucHVzaChuKTtyZXR1cm4gR2woby5zb3J0KGJsKSwuNSl9LG1lcmdlOnFsLG1pbjpZbCxwYWlyczpmdW5jdGlvbiBETih0LGUpe251bGw9PWUmJihlPUVsKTtmb3IodmFyIG49MCxpPXQubGVuZ3RoLTEscj10WzBdLG89bmV3IEFycmF5KGk8MD8wOmkpO248aTspb1tuXT1lKHIscj10Wysrbl0pO3JldHVybiBvfSxwZXJtdXRlOmZ1bmN0aW9uIEJOKHQsZSl7Zm9yKHZhciBuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pO24tLTspaVtuXT10W2Vbbl1dO3JldHVybiBpfSxxdWFudGlsZTpHbCxyYW5nZTp6bCxzY2FuOmZ1bmN0aW9uIEhOKHQsZSl7aWYobj10Lmxlbmd0aCl7dmFyIG4saSxyPTAsbz0wLGE9dFtvXTtmb3IobnVsbD09ZSYmKGU9YmwpOysrcjxuOykoZShpPXRbcl0sYSk8MHx8MCE9PWUoYSxhKSkmJihhPWksbz1yKTtyZXR1cm4gMD09PWUoYSxhKT9vOnZvaWQgMH19LHNodWZmbGU6ZnVuY3Rpb24gRk4odCxlLG4pe2Zvcih2YXIgaSxyLG89KG51bGw9PW4/dC5sZW5ndGg6biktKGU9bnVsbD09ZT8wOitlKTtvOylyPU1hdGgucmFuZG9tKCkqby0tfDAsaT10W28rZV0sdFtvK2VdPXRbcitlXSx0W3IrZV09aTtyZXR1cm4gdH0sc3VtOmZ1bmN0aW9uIFZOKHQsZSl7dmFyIG4saT10Lmxlbmd0aCxyPS0xLG89MDtpZihudWxsPT1lKWZvcig7KytyPGk7KShuPSt0W3JdKSYmKG8rPW4pO2Vsc2UgZm9yKDsrK3I8aTspKG49K2UodFtyXSxyLHQpKSYmKG8rPW4pO3JldHVybiBvfSx0aWNrczpGbCx0aWNrSW5jcmVtZW50OlZsLHRpY2tTdGVwOlVsLHRyYW5zcG9zZTpYbCx2YXJpYW5jZTpBbCx6aXA6ZnVuY3Rpb24gVU4oKXtyZXR1cm4gWGwoYXJndW1lbnRzKX0sYXhpc1RvcDpmdW5jdGlvbiBqTih0KXtyZXR1cm4gcmMoMSx0KX0sYXhpc1JpZ2h0OmZ1bmN0aW9uIEdOKHQpe3JldHVybiByYygyLHQpfSxheGlzQm90dG9tOm9jLGF4aXNMZWZ0OmFjLGJydXNoOkptLGJydXNoWDpmdW5jdGlvbiBXTigpe3JldHVybiBRbSh6bSl9LGJydXNoWTpabSxicnVzaFNlbGVjdGlvbjpLbSxjaG9yZDpmdW5jdGlvbiBxTigpe3ZhciB0PTAsZT1udWxsLG49bnVsbCxpPW51bGw7ZnVuY3Rpb24gcihyKXt2YXIgbyxhLHMsbCxjLHUsaD1yLmxlbmd0aCxkPVtdLHA9emwoaCksZj1bXSxtPVtdLGc9bS5ncm91cHM9bmV3IEFycmF5KGgpLF89bmV3IEFycmF5KGgqaCk7Zm9yKG89MCxjPS0xOysrYzxoOyl7Zm9yKGE9MCx1PS0xOysrdTxoOylhKz1yW2NdW3VdO2QucHVzaChhKSxmLnB1c2goemwoaCkpLG8rPWF9Zm9yKGUmJnAuc29ydCgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZShkW3RdLGRbbl0pfSkpLG4mJmYuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt0LnNvcnQoKGZ1bmN0aW9uKHQsaSl7cmV0dXJuIG4ocltlXVt0XSxyW2VdW2ldKX0pKX0pKSxsPShvPW9nKDAscmctdCpoKS9vKT90OnJnL2gsYT0wLGM9LTE7KytjPGg7KXtmb3Iocz1hLHU9LTE7Kyt1PGg7KXt2YXIgeT1wW2NdLHY9Zlt5XVt1XSxiPXJbeV1bdl0seD1hLHc9YSs9YipvO19bdipoK3ldPXtpbmRleDp5LHN1YmluZGV4OnYsc3RhcnRBbmdsZTp4LGVuZEFuZ2xlOncsdmFsdWU6Yn19Z1t5XT17aW5kZXg6eSxzdGFydEFuZ2xlOnMsZW5kQW5nbGU6YSx2YWx1ZTpkW3ldfSxhKz1sfWZvcihjPS0xOysrYzxoOylmb3IodT1jLTE7Kyt1PGg7KXt2YXIgUz1fW3UqaCtjXSxNPV9bYypoK3VdOyhTLnZhbHVlfHxNLnZhbHVlKSYmbS5wdXNoKFMudmFsdWU8TS52YWx1ZT97c291cmNlOk0sdGFyZ2V0OlN9Ontzb3VyY2U6Uyx0YXJnZXQ6TX0pfXJldHVybiBpP20uc29ydChpKTptfXJldHVybiByLnBhZEFuZ2xlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW9nKDAsZSkscik6dH0sci5zb3J0R3JvdXBzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQscik6ZX0sci5zb3J0U3ViZ3JvdXBzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQscik6bn0sci5zb3J0Q2hvcmRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P2k9bnVsbDooaT1hZyh0KSkuXz10LHIpOmkmJmkuX30scn0scmliYm9uOmZ1bmN0aW9uIFlOKCl7dmFyIHQ9bWcsZT1nZyxuPV9nLGk9eWcscj12ZyxvPW51bGw7ZnVuY3Rpb24gYSgpe3ZhciBhLHM9c2cuY2FsbChhcmd1bWVudHMpLGw9dC5hcHBseSh0aGlzLHMpLGM9ZS5hcHBseSh0aGlzLHMpLHU9K24uYXBwbHkodGhpcywoc1swXT1sLHMpKSxoPWkuYXBwbHkodGhpcyxzKS1pZyxkPXIuYXBwbHkodGhpcyxzKS1pZyxwPXUqdGcoaCksZj11KmVnKGgpLG09K24uYXBwbHkodGhpcywoc1swXT1jLHMpKSxnPWkuYXBwbHkodGhpcyxzKS1pZyxfPXIuYXBwbHkodGhpcyxzKS1pZztpZihvfHwobz1hPWZnKCkpLG8ubW92ZVRvKHAsZiksby5hcmMoMCwwLHUsaCxkKSxoPT09ZyYmZD09PV98fChvLnF1YWRyYXRpY0N1cnZlVG8oMCwwLG0qdGcoZyksbSplZyhnKSksby5hcmMoMCwwLG0sZyxfKSksby5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCxwLGYpLG8uY2xvc2VQYXRoKCksYSlyZXR1cm4gbz1udWxsLGErIiJ8fG51bGx9cmV0dXJuIGEucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bGcoK3QpLGEpOm59LGEuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmxnKCt0KSxhKTppfSxhLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bGcoK3QpLGEpOnJ9LGEuc291cmNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsYSk6dH0sYS50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxhKTplfSxhLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bnVsbD09dD9udWxsOnQsYSk6b30sYX0sbmVzdDpmdW5jdGlvbiBYTigpe3ZhciB0LGUsbixpPVtdLHI9W107ZnVuY3Rpb24gbyhuLHIsYSxzKXtpZihyPj1pLmxlbmd0aClyZXR1cm4gbnVsbCE9dCYmbi5zb3J0KHQpLG51bGwhPWU/ZShuKTpuO2Zvcih2YXIgbCxjLHUsaD0tMSxkPW4ubGVuZ3RoLHA9aVtyKytdLGY9d2coKSxtPWEoKTsrK2g8ZDspKHU9Zi5nZXQobD1wKGM9bltoXSkrIiIpKT91LnB1c2goYyk6Zi5zZXQobCxbY10pO3JldHVybiBmLmVhY2goKGZ1bmN0aW9uKHQsZSl7cyhtLGUsbyh0LHIsYSxzKSl9KSksbX1mdW5jdGlvbiBhKHQsbil7aWYoKytuPmkubGVuZ3RoKXJldHVybiB0O3ZhciBvLHM9cltuLTFdO3JldHVybiBudWxsIT1lJiZuPj1pLmxlbmd0aD9vPXQuZW50cmllcygpOihvPVtdLHQuZWFjaCgoZnVuY3Rpb24odCxlKXtvLnB1c2goe2tleTplLHZhbHVlczphKHQsbil9KX0pKSksbnVsbCE9cz9vLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHModC5rZXksZS5rZXkpfSkpOm99cmV0dXJuIG49e29iamVjdDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LDAsU2csTWcpfSxtYXA6ZnVuY3Rpb24odCl7cmV0dXJuIG8odCwwLEVnLFRnKX0sZW50cmllczpmdW5jdGlvbih0KXtyZXR1cm4gYShvKHQsMCxFZyxUZyksMCl9LGtleTpmdW5jdGlvbih0KXtyZXR1cm4gaS5wdXNoKHQpLG59LHNvcnRLZXlzOmZ1bmN0aW9uKHQpe3JldHVybiByW2kubGVuZ3RoLTFdPXQsbn0sc29ydFZhbHVlczpmdW5jdGlvbihlKXtyZXR1cm4gdD1lLG59LHJvbGx1cDpmdW5jdGlvbih0KXtyZXR1cm4gZT10LG59fX0sc2V0OmtnLG1hcDp3ZyxrZXlzOkxnLHZhbHVlczpmdW5jdGlvbiAkTih0KXt2YXIgZT1bXTtmb3IodmFyIG4gaW4gdCllLnB1c2godFtuXSk7cmV0dXJuIGV9LGVudHJpZXM6ZnVuY3Rpb24gS04odCl7dmFyIGU9W107Zm9yKHZhciBuIGluIHQpZS5wdXNoKHtrZXk6bix2YWx1ZTp0W25dfSk7cmV0dXJuIGV9LGNvbG9yOkJoLHJnYjpVaCxoc2w6JGgsbGFiOnNkLGhjbDpmZCxsY2g6ZnVuY3Rpb24gWk4odCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3BkKHQpOm5ldyBtZChuLGUsdCxudWxsPT1pPzE6aSl9LGdyYXk6ZnVuY3Rpb24gSk4odCxlKXtyZXR1cm4gbmV3IGxkKHQsMCwwLG51bGw9PWU/MTplKX0sY3ViZWhlbGl4OnhkLGNvbnRvdXJzOkhnLGNvbnRvdXJEZW5zaXR5OmZ1bmN0aW9uIFFOKCl7dmFyIHQ9VWcsZT1qZyxuPUdnLGk9OTYwLHI9NTAwLG89MjAsYT0yLHM9MypvLGw9aSsyKnM+PmEsYz1yKzIqcz4+YSx1PUlnKDIwKTtmdW5jdGlvbiBoKGkpe3ZhciByPW5ldyBGbG9hdDMyQXJyYXkobCpjKSxoPW5ldyBGbG9hdDMyQXJyYXkobCpjKTtpLmZvckVhY2goKGZ1bmN0aW9uKGksbyx1KXt2YXIgaD0rdChpLG8sdSkrcz4+YSxkPStlKGksbyx1KStzPj5hLHA9K24oaSxvLHUpO2g+PTAmJmg8bCYmZD49MCYmZDxjJiYocltoK2QqbF0rPXApfSkpLEZnKHt3aWR0aDpsLGhlaWdodDpjLGRhdGE6cn0se3dpZHRoOmwsaGVpZ2h0OmMsZGF0YTpofSxvPj5hKSxWZyh7d2lkdGg6bCxoZWlnaHQ6YyxkYXRhOmh9LHt3aWR0aDpsLGhlaWdodDpjLGRhdGE6cn0sbz4+YSksRmcoe3dpZHRoOmwsaGVpZ2h0OmMsZGF0YTpyfSx7d2lkdGg6bCxoZWlnaHQ6YyxkYXRhOmh9LG8+PmEpLFZnKHt3aWR0aDpsLGhlaWdodDpjLGRhdGE6aH0se3dpZHRoOmwsaGVpZ2h0OmMsZGF0YTpyfSxvPj5hKSxGZyh7d2lkdGg6bCxoZWlnaHQ6YyxkYXRhOnJ9LHt3aWR0aDpsLGhlaWdodDpjLGRhdGE6aH0sbz4+YSksVmcoe3dpZHRoOmwsaGVpZ2h0OmMsZGF0YTpofSx7d2lkdGg6bCxoZWlnaHQ6YyxkYXRhOnJ9LG8+PmEpO3ZhciBwPXUocik7aWYoIUFycmF5LmlzQXJyYXkocCkpe3ZhciBmPVdsKHIpO3A9VWwoMCxmLHApLChwPXpsKDAsTWF0aC5mbG9vcihmL3ApKnAscCkpLnNoaWZ0KCl9cmV0dXJuIEhnKCkudGhyZXNob2xkcyhwKS5zaXplKFtsLGNdKShyKS5tYXAoZCl9ZnVuY3Rpb24gZCh0KXtyZXR1cm4gdC52YWx1ZSo9TWF0aC5wb3coMiwtMiphKSx0LmNvb3JkaW5hdGVzLmZvckVhY2gocCksdH1mdW5jdGlvbiBwKHQpe3QuZm9yRWFjaChmKX1mdW5jdGlvbiBmKHQpe3QuZm9yRWFjaChtKX1mdW5jdGlvbiBtKHQpe3RbMF09dFswXSpNYXRoLnBvdygyLGEpLXMsdFsxXT10WzFdKk1hdGgucG93KDIsYSktc31mdW5jdGlvbiBnKCl7cmV0dXJuIGw9aSsyKihzPTMqbyk+PmEsYz1yKzIqcz4+YSxofXJldHVybiBoLng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpJZygrZSksaCk6dH0saC55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SWcoK3QpLGgpOmV9LGgud2VpZ2h0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SWcoK3QpLGgpOm59LGguc2l6ZT1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm5baSxyXTt2YXIgZT1NYXRoLmNlaWwodFswXSksbj1NYXRoLmNlaWwodFsxXSk7aWYoIShlPj0wfHxlPj0wKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgc2l6ZSIpO3JldHVybiBpPWUscj1uLGcoKX0saC5jZWxsU2l6ZT1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gMTw8YTtpZighKCh0PSt0KT49MSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNlbGwgc2l6ZSIpO3JldHVybiBhPU1hdGguZmxvb3IoTWF0aC5sb2codCkvTWF0aC5MTjIpLGcoKX0saC50aHJlc2hvbGRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6QXJyYXkuaXNBcnJheSh0KT9JZyhQZy5jYWxsKHQpKTpJZyh0KSxoKTp1fSxoLmJhbmR3aWR0aD1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gTWF0aC5zcXJ0KG8qKG8rMSkpO2lmKCEoKHQ9K3QpPj0wKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgYmFuZHdpZHRoIik7cmV0dXJuIG89TWF0aC5yb3VuZCgoTWF0aC5zcXJ0KDQqdCp0KzEpLTEpLzIpLGcoKX0saH0sZGlzcGF0Y2g6bGMsZHJhZzp2aCxkcmFnRGlzYWJsZTpoaCxkcmFnRW5hYmxlOmRoLGRzdkZvcm1hdDpLZyxjc3ZQYXJzZTpKZyxjc3ZQYXJzZVJvd3M6UWcsY3N2Rm9ybWF0OnRfLGNzdkZvcm1hdEJvZHk6ZV8sY3N2Rm9ybWF0Um93czpuXyxjc3ZGb3JtYXRSb3c6aV8sY3N2Rm9ybWF0VmFsdWU6cl8sdHN2UGFyc2U6YV8sdHN2UGFyc2VSb3dzOnNfLHRzdkZvcm1hdDpsXyx0c3ZGb3JtYXRCb2R5OmNfLHRzdkZvcm1hdFJvd3M6dV8sdHN2Rm9ybWF0Um93OmhfLHRzdkZvcm1hdFZhbHVlOmRfLGF1dG9UeXBlOmZ1bmN0aW9uIHRJKHQpe2Zvcih2YXIgZSBpbiB0KXt2YXIgbixpLHI9dFtlXS50cmltKCk7aWYocilpZigidHJ1ZSI9PT1yKXI9ITA7ZWxzZSBpZigiZmFsc2UiPT09cilyPSExO2Vsc2UgaWYoIk5hTiI9PT1yKXI9TmFOO2Vsc2UgaWYoaXNOYU4obj0rcikpe2lmKCEoaT1yLm1hdGNoKC9eKFstK11cZHsyfSk/XGR7NH0oLVxkezJ9KC1cZHsyfSk/KT8oVFxkezJ9OlxkezJ9KDpcZHsyfShcLlxkezN9KT8pPyhafFstK11cZHsyfTpcZHsyfSk/KT8kLykpKWNvbnRpbnVlO3BfJiZpWzRdJiYhaVs3XSYmKHI9ci5yZXBsYWNlKC8tL2csIi8iKS5yZXBsYWNlKC9ULywiICIpKSxyPW5ldyBEYXRlKHIpfWVsc2Ugcj1uO2Vsc2Ugcj1udWxsO3RbZV09cn1yZXR1cm4gdH0sZWFzZUxpbmVhcjpiZixlYXNlUXVhZDpTZixlYXNlUXVhZEluOnhmLGVhc2VRdWFkT3V0OndmLGVhc2VRdWFkSW5PdXQ6U2YsZWFzZUN1YmljOlRmLGVhc2VDdWJpY0luOk1mLGVhc2VDdWJpY091dDpFZixlYXNlQ3ViaWNJbk91dDpUZixlYXNlUG9seTpYZixlYXNlUG9seUluOnFmLGVhc2VQb2x5T3V0OllmLGVhc2VQb2x5SW5PdXQ6WGYsZWFzZVNpbjpRZixlYXNlU2luSW46WmYsZWFzZVNpbk91dDpKZixlYXNlU2luSW5PdXQ6UWYsZWFzZUV4cDppbSxlYXNlRXhwSW46ZW0sZWFzZUV4cE91dDpubSxlYXNlRXhwSW5PdXQ6aW0sZWFzZUNpcmNsZTphbSxlYXNlQ2lyY2xlSW46cm0sZWFzZUNpcmNsZU91dDpvbSxlYXNlQ2lyY2xlSW5PdXQ6YW0sZWFzZUJvdW5jZTpjbSxlYXNlQm91bmNlSW46bG0sZWFzZUJvdW5jZU91dDpjbSxlYXNlQm91bmNlSW5PdXQ6dW0sZWFzZUJhY2s6Zm0sZWFzZUJhY2tJbjpkbSxlYXNlQmFja091dDpwbSxlYXNlQmFja0luT3V0OmZtLGVhc2VFbGFzdGljOl9tLGVhc2VFbGFzdGljSW46Z20sZWFzZUVsYXN0aWNPdXQ6X20sZWFzZUVsYXN0aWNJbk91dDp5bSxibG9iOmZ1bmN0aW9uIGVJKHQsZSl7cmV0dXJuIGZldGNoKHQsZSkudGhlbihmXyl9LGJ1ZmZlcjpmdW5jdGlvbiBuSSh0LGUpe3JldHVybiBmZXRjaCh0LGUpLnRoZW4obV8pfSxkc3Y6ZnVuY3Rpb24gaUkodCxlLG4saSl7Mz09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlvbiI9PXR5cGVvZiBuJiYoaT1uLG49dm9pZCAwKTt2YXIgcj1LZyh0KTtyZXR1cm4gX18oZSxuKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gci5wYXJzZSh0LGkpfSkpfSxjc3Y6dl8sdHN2OmJfLGltYWdlOmZ1bmN0aW9uIHJJKHQsZSl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihuLGkpe3ZhciByPW5ldyBJbWFnZTtmb3IodmFyIG8gaW4gZSlyW29dPWVbb107ci5vbmVycm9yPWksci5vbmxvYWQ9ZnVuY3Rpb24oKXtuKHIpfSxyLnNyYz10fSkpfSxqc29uOmZ1bmN0aW9uIG9JKHQsZSl7cmV0dXJuIGZldGNoKHQsZSkudGhlbih4Xyl9LHRleHQ6X18seG1sOlNfLGh0bWw6TV8sc3ZnOkVfLGZvcmNlQ2VudGVyOmZ1bmN0aW9uIGFJKHQsZSl7dmFyIG47ZnVuY3Rpb24gaSgpe3ZhciBpLHIsbz1uLmxlbmd0aCxhPTAscz0wO2ZvcihpPTA7aTxvOysraSlhKz0ocj1uW2ldKS54LHMrPXIueTtmb3IoYT1hL28tdCxzPXMvby1lLGk9MDtpPG87KytpKShyPW5baV0pLngtPWEsci55LT1zfXJldHVybiBudWxsPT10JiYodD0wKSxudWxsPT1lJiYoZT0wKSxpLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10fSxpLng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K2UsaSk6dH0saS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0LGkpOmV9LGl9LGZvcmNlQ29sbGlkZTpmdW5jdGlvbiBzSSh0KXt2YXIgZSxuLGk9MSxyPTE7ZnVuY3Rpb24gbygpe2Zvcih2YXIgdCxvLHMsbCxjLHUsaCxkPWUubGVuZ3RoLHA9MDtwPHI7KytwKWZvcihvPU5fKGUsel8sRF8pLnZpc2l0QWZ0ZXIoYSksdD0wO3Q8ZDsrK3QpaD0odT1uWyhzPWVbdF0pLmluZGV4XSkqdSxsPXMueCtzLnZ4LGM9cy55K3Mudnksby52aXNpdChmKTtmdW5jdGlvbiBmKHQsZSxuLHIsbyl7dmFyIGE9dC5kYXRhLGQ9dC5yLHA9dStkO2lmKCFhKXJldHVybiBlPmwrcHx8cjxsLXB8fG4+YytwfHxvPGMtcDtpZihhLmluZGV4PnMuaW5kZXgpe3ZhciBmPWwtYS54LWEudngsbT1jLWEueS1hLnZ5LGc9ZipmK20qbTtnPHAqcCYmKDA9PT1mJiYoZys9KGY9Q18oKSkqZiksMD09PW0mJihnKz0obT1DXygpKSptKSxnPShwLShnPU1hdGguc3FydChnKSkpL2cqaSxzLnZ4Kz0oZio9ZykqKHA9KGQqPWQpLyhoK2QpKSxzLnZ5Kz0obSo9ZykqcCxhLnZ4LT1mKihwPTEtcCksYS52eS09bSpwKX19fWZ1bmN0aW9uIGEodCl7aWYodC5kYXRhKXJldHVybiB0LnI9blt0LmRhdGEuaW5kZXhdO2Zvcih2YXIgZT10LnI9MDtlPDQ7KytlKXRbZV0mJnRbZV0ucj50LnImJih0LnI9dFtlXS5yKX1mdW5jdGlvbiBzKCl7aWYoZSl7dmFyIGkscixvPWUubGVuZ3RoO2ZvcihuPW5ldyBBcnJheShvKSxpPTA7aTxvOysraSluWyhyPWVbaV0pLmluZGV4XT0rdChyLGksZSl9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1UXyhudWxsPT10PzE6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7ZT10LHMoKX0sby5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0LG8pOnJ9LG8uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3Qsbyk6aX0sby5yYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpUXygrZSkscygpLG8pOnR9LG99LGZvcmNlTGluazpmdW5jdGlvbiBsSSh0KXt2YXIgZSxuLGkscixvLGE9Ql8scz1mdW5jdGlvbiBsKHQpe3JldHVybiAxL01hdGgubWluKHJbdC5zb3VyY2UuaW5kZXhdLHJbdC50YXJnZXQuaW5kZXhdKX0sYz1UXygzMCksdT0xO2Z1bmN0aW9uIGgoaSl7Zm9yKHZhciByPTAsYT10Lmxlbmd0aDtyPHU7KytyKWZvcih2YXIgcyxsLGMsaCxkLHAsZixtPTA7bTxhOysrbSloPShjPShzPXRbbV0pLnRhcmdldCkueCtjLnZ4LShsPXMuc291cmNlKS54LWwudnh8fENfKCksZD1jLnkrYy52eS1sLnktbC52eXx8Q18oKSxkKj1wPSgocD1NYXRoLnNxcnQoaCpoK2QqZCkpLW5bbV0pL3AqaSplW21dLGMudngtPShoKj1wKSooZj1vW21dKSxjLnZ5LT1kKmYsbC52eCs9aCooZj0xLWYpLGwudnkrPWQqZn1mdW5jdGlvbiBkKCl7aWYoaSl7dmFyIHMsbCxjPWkubGVuZ3RoLHU9dC5sZW5ndGgsaD13ZyhpLGEpO2ZvcihzPTAscj1uZXcgQXJyYXkoYyk7czx1OysrcykobD10W3NdKS5pbmRleD1zLCJvYmplY3QiIT10eXBlb2YgbC5zb3VyY2UmJihsLnNvdXJjZT1IXyhoLGwuc291cmNlKSksIm9iamVjdCIhPXR5cGVvZiBsLnRhcmdldCYmKGwudGFyZ2V0PUhfKGgsbC50YXJnZXQpKSxyW2wuc291cmNlLmluZGV4XT0ocltsLnNvdXJjZS5pbmRleF18fDApKzEscltsLnRhcmdldC5pbmRleF09KHJbbC50YXJnZXQuaW5kZXhdfHwwKSsxO2ZvcihzPTAsbz1uZXcgQXJyYXkodSk7czx1OysrcylvW3NdPXJbKGw9dFtzXSkuc291cmNlLmluZGV4XS8ocltsLnNvdXJjZS5pbmRleF0rcltsLnRhcmdldC5pbmRleF0pO2U9bmV3IEFycmF5KHUpLHAoKSxuPW5ldyBBcnJheSh1KSxmKCl9fWZ1bmN0aW9uIHAoKXtpZihpKWZvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyOysrbillW25dPStzKHRbbl0sbix0KX1mdW5jdGlvbiBmKCl7aWYoaSlmb3IodmFyIGU9MCxyPXQubGVuZ3RoO2U8cjsrK2UpbltlXT0rYyh0W2VdLGUsdCl9cmV0dXJuIG51bGw9PXQmJih0PVtdKSxoLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7aT10LGQoKX0saC5saW5rcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLGQoKSxoKTp0fSxoLmlkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQsaCk6YX0saC5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LGgpOnV9LGguc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpUXygrdCkscCgpLGgpOnN9LGguZGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpUXygrdCksZigpLGgpOmN9LGh9LGZvcmNlTWFueUJvZHk6ZnVuY3Rpb24gY0koKXt2YXIgdCxlLG4saSxyPVRfKC0zMCksbz0xLGE9MS8wLHM9LjgxO2Z1bmN0aW9uIGwoaSl7dmFyIHIsbz10Lmxlbmd0aCxhPU5fKHQsRl8sVl8pLnZpc2l0QWZ0ZXIodSk7Zm9yKG49aSxyPTA7cjxvOysrcillPXRbcl0sYS52aXNpdChoKX1mdW5jdGlvbiBjKCl7aWYodCl7dmFyIGUsbixvPXQubGVuZ3RoO2ZvcihpPW5ldyBBcnJheShvKSxlPTA7ZTxvOysrZSlpWyhuPXRbZV0pLmluZGV4XT0rcihuLGUsdCl9fWZ1bmN0aW9uIHUodCl7dmFyIGUsbixyLG8sYSxzPTAsbD0wO2lmKHQubGVuZ3RoKXtmb3Iocj1vPWE9MDthPDQ7KythKShlPXRbYV0pJiYobj1NYXRoLmFicyhlLnZhbHVlKSkmJihzKz1lLnZhbHVlLGwrPW4scis9biplLngsbys9biplLnkpO3QueD1yL2wsdC55PW8vbH1lbHNleyhlPXQpLng9ZS5kYXRhLngsZS55PWUuZGF0YS55O2Rve3MrPWlbZS5kYXRhLmluZGV4XX13aGlsZShlPWUubmV4dCl9dC52YWx1ZT1zfWZ1bmN0aW9uIGgodCxyLGwsYyl7aWYoIXQudmFsdWUpcmV0dXJuITA7dmFyIHU9dC54LWUueCxoPXQueS1lLnksZD1jLXIscD11KnUraCpoO2lmKGQqZC9zPHApcmV0dXJuIHA8YSYmKDA9PT11JiYocCs9KHU9Q18oKSkqdSksMD09PWgmJihwKz0oaD1DXygpKSpoKSxwPG8mJihwPU1hdGguc3FydChvKnApKSxlLnZ4Kz11KnQudmFsdWUqbi9wLGUudnkrPWgqdC52YWx1ZSpuL3ApLCEwO2lmKCEodC5sZW5ndGh8fHA+PWEpKXsodC5kYXRhIT09ZXx8dC5uZXh0KSYmKDA9PT11JiYocCs9KHU9Q18oKSkqdSksMD09PWgmJihwKz0oaD1DXygpKSpoKSxwPG8mJihwPU1hdGguc3FydChvKnApKSk7ZG97dC5kYXRhIT09ZSYmKGUudngrPXUqKGQ9aVt0LmRhdGEuaW5kZXhdKm4vcCksZS52eSs9aCpkKX13aGlsZSh0PXQubmV4dCl9fXJldHVybiBsLmluaXRpYWxpemU9ZnVuY3Rpb24oZSl7dD1lLGMoKX0sbC5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlRfKCt0KSxjKCksbCk6cn0sbC5kaXN0YW5jZU1pbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz10KnQsbCk6TWF0aC5zcXJ0KG8pfSxsLmRpc3RhbmNlTWF4PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQqdCxsKTpNYXRoLnNxcnQoYSl9LGwudGhldGE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9dCp0LGwpOk1hdGguc3FydChzKX0sbH0sZm9yY2VSYWRpYWw6ZnVuY3Rpb24gdUkodCxlLG4pe3ZhciBpLHIsbyxhPVRfKC4xKTtmdW5jdGlvbiBzKHQpe2Zvcih2YXIgYT0wLHM9aS5sZW5ndGg7YTxzOysrYSl7dmFyIGw9aVthXSxjPWwueC1lfHwxZS02LHU9bC55LW58fDFlLTYsaD1NYXRoLnNxcnQoYypjK3UqdSksZD0ob1thXS1oKSpyW2FdKnQvaDtsLnZ4Kz1jKmQsbC52eSs9dSpkfX1mdW5jdGlvbiBsKCl7aWYoaSl7dmFyIGUsbj1pLmxlbmd0aDtmb3Iocj1uZXcgQXJyYXkobiksbz1uZXcgQXJyYXkobiksZT0wO2U8bjsrK2Upb1tlXT0rdChpW2VdLGUsaSkscltlXT1pc05hTihvW2VdKT8wOithKGlbZV0sZSxpKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVRfKCt0KSksbnVsbD09ZSYmKGU9MCksbnVsbD09biYmKG49MCkscy5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2k9dCxsKCl9LHMuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpUXygrdCksbCgpLHMpOmF9LHMucmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6VF8oK2UpLGwoKSxzKTp0fSxzLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3Qscyk6ZX0scy55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0LHMpOm59LHN9LGZvcmNlU2ltdWxhdGlvbjpmdW5jdGlvbiBoSSh0KXt2YXIgZSxuPTEsaT0uMDAxLHI9MS1NYXRoLnBvdyhpLDEvMzAwKSxvPTAsYT0uNixzPXdnKCksbD1rcCh1KSxjPWxjKCJ0aWNrIiwiZW5kIik7ZnVuY3Rpb24gdSgpe2goKSxjLmNhbGwoInRpY2siLGUpLG48aSYmKGwuc3RvcCgpLGMuY2FsbCgiZW5kIixlKSl9ZnVuY3Rpb24gaChpKXt2YXIgbCxjLHU9dC5sZW5ndGg7dm9pZCAwPT09aSYmKGk9MSk7Zm9yKHZhciBoPTA7aDxpOysraClmb3Iobis9KG8tbikqcixzLmVhY2goKGZ1bmN0aW9uKHQpe3Qobil9KSksbD0wO2w8dTsrK2wpbnVsbD09KGM9dFtsXSkuZng/Yy54Kz1jLnZ4Kj1hOihjLng9Yy5meCxjLnZ4PTApLG51bGw9PWMuZnk/Yy55Kz1jLnZ5Kj1hOihjLnk9Yy5meSxjLnZ5PTApO3JldHVybiBlfWZ1bmN0aW9uIGQoKXtmb3IodmFyIGUsbj0wLGk9dC5sZW5ndGg7bjxpOysrbil7aWYoKGU9dFtuXSkuaW5kZXg9bixudWxsIT1lLmZ4JiYoZS54PWUuZngpLG51bGwhPWUuZnkmJihlLnk9ZS5meSksaXNOYU4oZS54KXx8aXNOYU4oZS55KSl7dmFyIHI9MTAqTWF0aC5zcXJ0KG4pLG89bipueTtlLng9cipNYXRoLmNvcyhvKSxlLnk9cipNYXRoLnNpbihvKX0oaXNOYU4oZS52eCl8fGlzTmFOKGUudnkpKSYmKGUudng9ZS52eT0wKX19ZnVuY3Rpb24gcChlKXtyZXR1cm4gZS5pbml0aWFsaXplJiZlLmluaXRpYWxpemUodCksZX1yZXR1cm4gbnVsbD09dCYmKHQ9W10pLGQoKSxlPXt0aWNrOmgscmVzdGFydDpmdW5jdGlvbigpe3JldHVybiBsLnJlc3RhcnQodSksZX0sc3RvcDpmdW5jdGlvbigpe3JldHVybiBsLnN0b3AoKSxlfSxub2RlczpmdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGQoKSxzLmVhY2gocCksZSk6dH0sYWxwaGE6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3QsZSk6bn0sYWxwaGFNaW46ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3QsZSk6aX0sYWxwaGFEZWNheTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxlKTorcn0sYWxwaGFUYXJnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3QsZSk6b30sdmVsb2NpdHlEZWNheTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0xLXQsZSk6MS1hfSxmb3JjZTpmdW5jdGlvbih0LG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/KG51bGw9PW4/cy5yZW1vdmUodCk6cy5zZXQodCxwKG4pKSxlKTpzLmdldCh0KX0sZmluZDpmdW5jdGlvbihlLG4saSl7dmFyIHIsbyxhLHMsbCxjPTAsdT10Lmxlbmd0aDtmb3IobnVsbD09aT9pPTEvMDppKj1pLGM9MDtjPHU7KytjKShhPShyPWUtKHM9dFtjXSkueCkqcisobz1uLXMueSkqbyk8aSYmKGw9cyxpPWEpO3JldHVybiBsfSxvbjpmdW5jdGlvbih0LG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/KGMub24odCxuKSxlKTpjLm9uKHQpfX19LGZvcmNlWDpmdW5jdGlvbiBkSSh0KXt2YXIgZSxuLGkscj1UXyguMSk7ZnVuY3Rpb24gbyh0KXtmb3IodmFyIHIsbz0wLGE9ZS5sZW5ndGg7bzxhOysrbykocj1lW29dKS52eCs9KGlbb10tci54KSpuW29dKnR9ZnVuY3Rpb24gYSgpe2lmKGUpe3ZhciBvLGE9ZS5sZW5ndGg7Zm9yKG49bmV3IEFycmF5KGEpLGk9bmV3IEFycmF5KGEpLG89MDtvPGE7KytvKW5bb109aXNOYU4oaVtvXT0rdChlW29dLG8sZSkpPzA6K3IoZVtvXSxvLGUpfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9VF8obnVsbD09dD8wOit0KSksby5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2U9dCxhKCl9LG8uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpUXygrdCksYSgpLG8pOnJ9LG8ueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOlRfKCtlKSxhKCksbyk6dH0sb30sZm9yY2VZOmZ1bmN0aW9uIHBJKHQpe3ZhciBlLG4saSxyPVRfKC4xKTtmdW5jdGlvbiBvKHQpe2Zvcih2YXIgcixvPTAsYT1lLmxlbmd0aDtvPGE7KytvKShyPWVbb10pLnZ5Kz0oaVtvXS1yLnkpKm5bb10qdH1mdW5jdGlvbiBhKCl7aWYoZSl7dmFyIG8sYT1lLmxlbmd0aDtmb3Iobj1uZXcgQXJyYXkoYSksaT1uZXcgQXJyYXkoYSksbz0wO288YTsrK28pbltvXT1pc05hTihpW29dPSt0KGVbb10sbyxlKSk/MDorcihlW29dLG8sZSl9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1UXyhudWxsPT10PzA6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7ZT10LGEoKX0sby5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlRfKCt0KSxhKCksbyk6cn0sby55PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6VF8oK2UpLGEoKSxvKTp0fSxvfSxmb3JtYXREZWZhdWx0TG9jYWxlOmJ5LGdldCBmb3JtYXQoKXtyZXR1cm4gbXl9LGdldCBmb3JtYXRQcmVmaXgoKXtyZXR1cm4gZ3l9LGZvcm1hdExvY2FsZTp2eSxmb3JtYXRTcGVjaWZpZXI6c3ksRm9ybWF0U3BlY2lmaWVyOmx5LHByZWNpc2lvbkZpeGVkOnh5LHByZWNpc2lvblByZWZpeDp3eSxwcmVjaXNpb25Sb3VuZDpTeSxnZW9BcmVhOmZ1bmN0aW9uIGZJKHQpe3JldHVybiB1di5yZXNldCgpLGl2KHQsaHYpLDIqdXZ9LGdlb0JvdW5kczpmdW5jdGlvbiBtSSh0KXt2YXIgZSxuLGkscixvLGEscztpZihUdj1Fdj0tKFN2PU12PTEvMCksUHY9W10saXYodCxLdiksbj1Qdi5sZW5ndGgpe2ZvcihQdi5zb3J0KG9iKSxlPTEsbz1baT1QdlswXV07ZTxuOysrZSlhYihpLChyPVB2W2VdKVswXSl8fGFiKGksclsxXSk/KHJiKGlbMF0sclsxXSk+cmIoaVswXSxpWzFdKSYmKGlbMV09clsxXSkscmIoclswXSxpWzFdKT5yYihpWzBdLGlbMV0pJiYoaVswXT1yWzBdKSk6by5wdXNoKGk9cik7Zm9yKGE9LTEvMCxlPTAsaT1vW249by5sZW5ndGgtMV07ZTw9bjtpPXIsKytlKShzPXJiKGlbMV0sKHI9b1tlXSlbMF0pKT5hJiYoYT1zLFN2PXJbMF0sRXY9aVsxXSl9cmV0dXJuIFB2PU52PW51bGwsU3Y9PT0xLzB8fE12PT09MS8wP1tbTmFOLE5hTl0sW05hTixOYU5dXTpbW1N2LE12XSxbRXYsVHZdXX0sZ2VvQ2VudHJvaWQ6ZnVuY3Rpb24gZ0kodCl7SXY9UnY9T3Y9enY9RHY9QnY9SHY9RnY9VnY9VXY9anY9MCxpdih0LHNiKTt2YXIgZT1WdixuPVV2LGk9anYscj1lKmUrbipuK2kqaTtyZXR1cm4gcjxreSYmKGU9QnYsbj1IdixpPUZ2LFJ2PEF5JiYoZT1PdixuPXp2LGk9RHYpLChyPWUqZStuKm4raSppKTxreSk/W05hTixOYU5dOltCeShuLGUpKlJ5LCR5KGkvcXkocikpKlJ5XX0sZ2VvQ2lyY2xlOmZ1bmN0aW9uIF9JKCl7dmFyIHQsZSxuPXliKFswLDBdKSxpPXliKDkwKSxyPXliKDYpLG89e3BvaW50OmZ1bmN0aW9uIGEobixpKXt0LnB1c2gobj1lKG4saSkpLG5bMF0qPVJ5LG5bMV0qPVJ5fX07ZnVuY3Rpb24gcygpe3ZhciBhPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHM9aS5hcHBseSh0aGlzLGFyZ3VtZW50cykqT3ksbD1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSpPeTtyZXR1cm4gdD1bXSxlPXhiKC1hWzBdKk95LC1hWzFdKk95LDApLmludmVydCxUYihvLHMsbCwxKSxhPXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbdF19LHQ9ZT1udWxsLGF9cmV0dXJuIHMuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eWIoWyt0WzBdLCt0WzFdXSkscyk6bn0scy5yYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5YigrdCkscyk6aX0scy5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5YigrdCkscyk6cn0sc30sZ2VvQ2xpcEFudGltZXJpZGlhbjpIYixnZW9DbGlwQ2lyY2xlOlViLGdlb0NsaXBFeHRlbnQ6ZnVuY3Rpb24geUkoKXt2YXIgdCxlLG4saT0wLHI9MCxvPTk2MCxhPTUwMDtyZXR1cm4gbj17c3RyZWFtOmZ1bmN0aW9uKG4pe3JldHVybiB0JiZlPT09bj90OnQ9V2IoaSxyLG8sYSkoZT1uKX0sZXh0ZW50OmZ1bmN0aW9uKHMpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPStzWzBdWzBdLHI9K3NbMF1bMV0sbz0rc1sxXVswXSxhPStzWzFdWzFdLHQ9ZT1udWxsLG4pOltbaSxyXSxbbyxhXV19fX0sZ2VvQ2xpcFJlY3RhbmdsZTpXYixnZW9Db250YWluczpmdW5jdGlvbiB2SSh0LGUpe3JldHVybih0JiZveC5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpP294W3QudHlwZV06c3gpKHQsZSl9LGdlb0Rpc3RhbmNlOnJ4LGdlb0dyYXRpY3VsZTpteCxnZW9HcmF0aWN1bGUxMDpmdW5jdGlvbiBiSSgpe3JldHVybiBteCgpKCl9LGdlb0ludGVycG9sYXRlOmZ1bmN0aW9uIHhJKHQsZSl7dmFyIG49dFswXSpPeSxpPXRbMV0qT3kscj1lWzBdKk95LG89ZVsxXSpPeSxhPUh5KGkpLHM9R3koaSksbD1IeShvKSxjPUd5KG8pLHU9YSpIeShuKSxoPWEqR3kobiksZD1sKkh5KHIpLHA9bCpHeShyKSxmPTIqJHkocXkoS3koby1pKSthKmwqS3koci1uKSkpLG09R3koZiksZz1mP2Z1bmN0aW9uKHQpe3ZhciBlPUd5KHQqPWYpL20sbj1HeShmLXQpL20saT1uKnUrZSpkLHI9bipoK2UqcCxvPW4qcytlKmM7cmV0dXJuW0J5KHIsaSkqUnksQnkobyxxeShpKmkrcipyKSkqUnldfTpmdW5jdGlvbigpe3JldHVybltuKlJ5LGkqUnldfTtyZXR1cm4gZy5kaXN0YW5jZT1mLGd9LGdlb0xlbmd0aDpleCxnZW9QYXRoOmZ1bmN0aW9uIHdJKHQsZSl7dmFyIG4saSxyPTQuNTtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHImJmkucG9pbnRSYWRpdXMoK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxpdih0LG4oaSkpKSxpLnJlc3VsdCgpfXJldHVybiBvLmFyZWE9ZnVuY3Rpb24odCl7cmV0dXJuIGl2KHQsbihOeCkpLE54LnJlc3VsdCgpfSxvLm1lYXN1cmU9ZnVuY3Rpb24odCl7cmV0dXJuIGl2KHQsbihtdykpLG13LnJlc3VsdCgpfSxvLmJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gaXYodCxuKER4KSksRHgucmVzdWx0KCl9LG8uY2VudHJvaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGl2KHQsbihydykpLHJ3LnJlc3VsdCgpfSxvLnByb2plY3Rpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09ZT8odD1udWxsLGd4KToodD1lKS5zdHJlYW0sbyk6dH0sby5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/KGU9bnVsbCxuZXcgZ3cpOm5ldyBvdyhlPXQpLCJmdW5jdGlvbiIhPXR5cGVvZiByJiZpLnBvaW50UmFkaXVzKHIpLG8pOmV9LG8ucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooaS5wb2ludFJhZGl1cygrdCksK3QpLG8pOnJ9LG8ucHJvamVjdGlvbih0KS5jb250ZXh0KGUpfSxnZW9BbGJlcnM6T3csZ2VvQWxiZXJzVXNhOmZ1bmN0aW9uIFNJKCl7dmFyIHQsZSxuLGkscixvLGE9T3coKSxzPVJ3KCkucm90YXRlKFsxNTQsMF0pLmNlbnRlcihbLTIsNTguNV0pLnBhcmFsbGVscyhbNTUsNjVdKSxsPVJ3KCkucm90YXRlKFsxNTcsMF0pLmNlbnRlcihbLTMsMTkuOV0pLnBhcmFsbGVscyhbOCwxOF0pLGM9e3BvaW50OmZ1bmN0aW9uKHQsZSl7bz1bdCxlXX19O2Z1bmN0aW9uIHUodCl7dmFyIGU9dFswXSxhPXRbMV07cmV0dXJuIG89bnVsbCxuLnBvaW50KGUsYSksb3x8KGkucG9pbnQoZSxhKSxvKXx8KHIucG9pbnQoZSxhKSxvKX1mdW5jdGlvbiBoKCl7cmV0dXJuIHQ9ZT1udWxsLHV9cmV0dXJuIHUuaW52ZXJ0PWZ1bmN0aW9uKHQpe3ZhciBlPWEuc2NhbGUoKSxuPWEudHJhbnNsYXRlKCksaT0odFswXS1uWzBdKS9lLHI9KHRbMV0tblsxXSkvZTtyZXR1cm4ocj49LjEyJiZyPC4yMzQmJmk+PS0uNDI1JiZpPC0uMjE0P3M6cj49LjE2NiYmcjwuMjM0JiZpPj0tLjIxNCYmaTwtLjExNT9sOmEpLmludmVydCh0KX0sdS5zdHJlYW09ZnVuY3Rpb24obil7cmV0dXJuIHQmJmU9PT1uP3Q6dD0oZnVuY3Rpb24gaSh0KXt2YXIgZT10Lmxlbmd0aDtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24obixpKXtmb3IodmFyIHI9LTE7KytyPGU7KXRbcl0ucG9pbnQobixpKX0sc3BoZXJlOmZ1bmN0aW9uKCl7Zm9yKHZhciBuPS0xOysrbjxlOyl0W25dLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtmb3IodmFyIG49LTE7KytuPGU7KXRbbl0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtmb3IodmFyIG49LTE7KytuPGU7KXRbbl0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtmb3IodmFyIG49LTE7KytuPGU7KXRbbl0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtmb3IodmFyIG49LTE7KytuPGU7KXRbbl0ucG9seWdvbkVuZCgpfX19KShbYS5zdHJlYW0oZT1uKSxzLnN0cmVhbShuKSxsLnN0cmVhbShuKV0pfSx1LnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYS5wcmVjaXNpb24odCkscy5wcmVjaXNpb24odCksbC5wcmVjaXNpb24odCksaCgpKTphLnByZWNpc2lvbigpfSx1LnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhLnNjYWxlKHQpLHMuc2NhbGUoLjM1KnQpLGwuc2NhbGUodCksdS50cmFuc2xhdGUoYS50cmFuc2xhdGUoKSkpOmEuc2NhbGUoKX0sdS50cmFuc2xhdGU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGEudHJhbnNsYXRlKCk7dmFyIGU9YS5zY2FsZSgpLG89K3RbMF0sdT0rdFsxXTtyZXR1cm4gbj1hLnRyYW5zbGF0ZSh0KS5jbGlwRXh0ZW50KFtbby0uNDU1KmUsdS0uMjM4KmVdLFtvKy40NTUqZSx1Ky4yMzgqZV1dKS5zdHJlYW0oYyksaT1zLnRyYW5zbGF0ZShbby0uMzA3KmUsdSsuMjAxKmVdKS5jbGlwRXh0ZW50KFtbby0uNDI1KmUrQXksdSsuMTIqZStBeV0sW28tLjIxNCplLUF5LHUrLjIzNCplLUF5XV0pLnN0cmVhbShjKSxyPWwudHJhbnNsYXRlKFtvLS4yMDUqZSx1Ky4yMTIqZV0pLmNsaXBFeHRlbnQoW1tvLS4yMTQqZStBeSx1Ky4xNjYqZStBeV0sW28tLjExNSplLUF5LHUrLjIzNCplLUF5XV0pLnN0cmVhbShjKSxoKCl9LHUuZml0RXh0ZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHh3KHUsdCxlKX0sdS5maXRTaXplPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHd3KHUsdCxlKX0sdS5maXRXaWR0aD1mdW5jdGlvbih0LGUpe3JldHVybiBTdyh1LHQsZSl9LHUuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE13KHUsdCxlKX0sdS5zY2FsZSgxMDcwKX0sZ2VvQXppbXV0aGFsRXF1YWxBcmVhOmZ1bmN0aW9uIE1JKCl7cmV0dXJuIEx3KEJ3KS5zY2FsZSgxMjQuNzUpLmNsaXBBbmdsZSgxNzkuOTk5KX0sZ2VvQXppbXV0aGFsRXF1YWxBcmVhUmF3OkJ3LGdlb0F6aW11dGhhbEVxdWlkaXN0YW50OmZ1bmN0aW9uIEVJKCl7cmV0dXJuIEx3KEh3KS5zY2FsZSg3OS40MTg4KS5jbGlwQW5nbGUoMTc5Ljk5OSl9LGdlb0F6aW11dGhhbEVxdWlkaXN0YW50UmF3Okh3LGdlb0NvbmljQ29uZm9ybWFsOmZ1bmN0aW9uIFRJKCl7cmV0dXJuIE53KGp3KS5zY2FsZSgxMDkuNSkucGFyYWxsZWxzKFszMCwzMF0pfSxnZW9Db25pY0NvbmZvcm1hbFJhdzpqdyxnZW9Db25pY0VxdWFsQXJlYTpSdyxnZW9Db25pY0VxdWFsQXJlYVJhdzpJdyxnZW9Db25pY0VxdWlkaXN0YW50OmZ1bmN0aW9uIENJKCl7cmV0dXJuIE53KFd3KS5zY2FsZSgxMzEuMTU0KS5jZW50ZXIoWzAsMTMuOTM4OV0pfSxnZW9Db25pY0VxdWlkaXN0YW50UmF3Old3LGdlb0VxdWFsRWFydGg6ZnVuY3Rpb24gQUkoKXtyZXR1cm4gTHcoWncpLnNjYWxlKDE3Ny4xNTgpfSxnZW9FcXVhbEVhcnRoUmF3Olp3LGdlb0VxdWlyZWN0YW5ndWxhcjpmdW5jdGlvbiBrSSgpe3JldHVybiBMdyhHdykuc2NhbGUoMTUyLjYzKX0sZ2VvRXF1aXJlY3Rhbmd1bGFyUmF3Okd3LGdlb0dub21vbmljOmZ1bmN0aW9uIExJKCl7cmV0dXJuIEx3KEp3KS5zY2FsZSgxNDQuMDQ5KS5jbGlwQW5nbGUoNjApfSxnZW9Hbm9tb25pY1JhdzpKdyxnZW9JZGVudGl0eTpmdW5jdGlvbiBQSSgpe3ZhciB0LGUsbixpLHIsbyxhLHM9MSxsPTAsYz0wLHU9MSxoPTEsZD0wLHA9bnVsbCxmPTEsbT0xLGc9eXcoe3BvaW50OmZ1bmN0aW9uKHQsZSl7dmFyIG49dihbdCxlXSk7dGhpcy5zdHJlYW0ucG9pbnQoblswXSxuWzFdKX19KSxfPWd4O2Z1bmN0aW9uIHkoKXtyZXR1cm4gZj1zKnUsbT1zKmgsbz1hPW51bGwsdn1mdW5jdGlvbiB2KG4pe3ZhciBpPW5bMF0qZixyPW5bMV0qbTtpZihkKXt2YXIgbz1yKnQtaSplO2k9aSp0K3IqZSxyPW99cmV0dXJuW2krbCxyK2NdfXJldHVybiB2LmludmVydD1mdW5jdGlvbihuKXt2YXIgaT1uWzBdLWwscj1uWzFdLWM7aWYoZCl7dmFyIG89cip0K2kqZTtpPWkqdC1yKmUscj1vfXJldHVybltpL2Ysci9tXX0sdi5zdHJlYW09ZnVuY3Rpb24odCl7cmV0dXJuIG8mJmE9PT10P286bz1nKF8oYT10KSl9LHYucG9zdGNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KF89dCxwPW49aT1yPW51bGwseSgpKTpffSx2LmNsaXBFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KF89bnVsbD09dD8ocD1uPWk9cj1udWxsLGd4KTpXYihwPSt0WzBdWzBdLG49K3RbMF1bMV0saT0rdFsxXVswXSxyPSt0WzFdWzFdKSx5KCkpOm51bGw9PXA/bnVsbDpbW3Asbl0sW2kscl1dfSx2LnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0LHkoKSk6c30sdi50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9K3RbMF0sYz0rdFsxXSx5KCkpOltsLGNdfSx2LmFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPUd5KGQ9biUzNjAqT3kpLHQ9SHkoZCkseSgpKTpkKlJ5fSx2LnJlZmxlY3RYPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQ/LTE6MSx5KCkpOnU8MH0sdi5yZWZsZWN0WT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD10Py0xOjEseSgpKTpoPDB9LHYuZml0RXh0ZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHh3KHYsdCxlKX0sdi5maXRTaXplPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHd3KHYsdCxlKX0sdi5maXRXaWR0aD1mdW5jdGlvbih0LGUpe3JldHVybiBTdyh2LHQsZSl9LHYuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE13KHYsdCxlKX0sdn0sZ2VvUHJvamVjdGlvbjpMdyxnZW9Qcm9qZWN0aW9uTXV0YXRvcjpQdyxnZW9NZXJjYXRvcjpmdW5jdGlvbiBOSSgpe3JldHVybiBWdyhGdykuc2NhbGUoOTYxL0l5KX0sZ2VvTWVyY2F0b3JSYXc6RncsZ2VvTmF0dXJhbEVhcnRoMTpmdW5jdGlvbiBJSSgpe3JldHVybiBMdyhRdykuc2NhbGUoMTc1LjI5NSl9LGdlb05hdHVyYWxFYXJ0aDFSYXc6UXcsZ2VvT3J0aG9ncmFwaGljOmZ1bmN0aW9uIFJJKCl7cmV0dXJuIEx3KHRTKS5zY2FsZSgyNDkuNSkuY2xpcEFuZ2xlKDkwLjAwMDAwMSl9LGdlb09ydGhvZ3JhcGhpY1Jhdzp0UyxnZW9TdGVyZW9ncmFwaGljOmZ1bmN0aW9uIE9JKCl7cmV0dXJuIEx3KGVTKS5zY2FsZSgyNTApLmNsaXBBbmdsZSgxNDIpfSxnZW9TdGVyZW9ncmFwaGljUmF3OmVTLGdlb1RyYW5zdmVyc2VNZXJjYXRvcjpmdW5jdGlvbiB6SSgpe3ZhciB0PVZ3KG5TKSxlPXQuY2VudGVyLG49dC5yb3RhdGU7cmV0dXJuIHQuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoWy10WzFdLHRbMF1dKTpbKHQ9ZSgpKVsxXSwtdFswXV19LHQucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oW3RbMF0sdFsxXSx0Lmxlbmd0aD4yP3RbMl0rOTA6OTBdKTpbKHQ9bigpKVswXSx0WzFdLHRbMl0tOTBdfSxuKFswLDAsOTBdKS5zY2FsZSgxNTkuMTU1KX0sZ2VvVHJhbnN2ZXJzZU1lcmNhdG9yUmF3Om5TLGdlb1JvdGF0aW9uOkViLGdlb1N0cmVhbTppdixnZW9UcmFuc2Zvcm06ZnVuY3Rpb24gREkodCl7cmV0dXJue3N0cmVhbTp5dyh0KX19LGNsdXN0ZXI6ZnVuY3Rpb24gQkkoKXt2YXIgdD1pUyxlPTEsbj0xLGk9ITE7ZnVuY3Rpb24gcihyKXt2YXIgbyxhPTA7ci5lYWNoQWZ0ZXIoKGZ1bmN0aW9uKGUpe3ZhciBuPWUuY2hpbGRyZW47bj8oZS54PShmdW5jdGlvbiBpKHQpe3JldHVybiB0LnJlZHVjZShyUywwKS90Lmxlbmd0aH0pKG4pLGUueT0oZnVuY3Rpb24gcih0KXtyZXR1cm4gMSt0LnJlZHVjZShvUywwKX0pKG4pKTooZS54PW8/YSs9dChlLG8pOjAsZS55PTAsbz1lKX0pKTt2YXIgcz0oZnVuY3Rpb24gbCh0KXtmb3IodmFyIGU7ZT10LmNoaWxkcmVuOyl0PWVbMF07cmV0dXJuIHR9KShyKSxjPShmdW5jdGlvbiB1KHQpe2Zvcih2YXIgZTtlPXQuY2hpbGRyZW47KXQ9ZVtlLmxlbmd0aC0xXTtyZXR1cm4gdH0pKHIpLGg9cy54LXQocyxjKS8yLGQ9Yy54K3QoYyxzKS8yO3JldHVybiByLmVhY2hBZnRlcihpP2Z1bmN0aW9uKHQpe3QueD0odC54LXIueCkqZSx0Lnk9KHIueS10LnkpKm59OmZ1bmN0aW9uKHQpe3QueD0odC54LWgpLyhkLWgpKmUsdC55PSgxLShyLnk/dC55L3IueToxKSkqbn0pfXJldHVybiByLnNlcGFyYXRpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxyKTp0fSxyLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ITEsZT0rdFswXSxuPSt0WzFdLHIpOmk/bnVsbDpbZSxuXX0sci5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0hMCxlPSt0WzBdLG49K3RbMV0scik6aT9bZSxuXTpudWxsfSxyfSxoaWVyYXJjaHk6c1MscGFjazpmdW5jdGlvbiBISSgpe3ZhciB0PW51bGwsZT0xLG49MSxpPUZTO2Z1bmN0aW9uIHIocil7cmV0dXJuIHIueD1lLzIsci55PW4vMix0P3IuZWFjaEJlZm9yZShqUyh0KSkuZWFjaEFmdGVyKEdTKGksLjUpKS5lYWNoQmVmb3JlKFdTKDEpKTpyLmVhY2hCZWZvcmUoalMoVVMpKS5lYWNoQWZ0ZXIoR1MoRlMsMSkpLmVhY2hBZnRlcihHUyhpLHIuci9NYXRoLm1pbihlLG4pKSkuZWFjaEJlZm9yZShXUyhNYXRoLm1pbihlLG4pLygyKnIucikpKSxyfXJldHVybiByLnJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1CUyhlKSxyKTp0fSxyLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3RbMF0sbj0rdFsxXSxyKTpbZSxuXX0sci5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VlMoK3QpLHIpOml9LHJ9LHBhY2tTaWJsaW5nczpmdW5jdGlvbiBGSSh0KXtyZXR1cm4gRFModCksdH0scGFja0VuY2xvc2U6RVMscGFydGl0aW9uOmZ1bmN0aW9uIFZJKCl7dmFyIHQ9MSxlPTEsbj0wLGk9ITE7ZnVuY3Rpb24gcihyKXt2YXIgbz1yLmhlaWdodCsxO3JldHVybiByLngwPXIueTA9bixyLngxPXQsci55MT1lL28sci5lYWNoQmVmb3JlKChmdW5jdGlvbiBhKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKGkpe2kuY2hpbGRyZW4mJllTKGksaS54MCx0KihpLmRlcHRoKzEpL2UsaS54MSx0KihpLmRlcHRoKzIpL2UpO3ZhciByPWkueDAsbz1pLnkwLGE9aS54MS1uLHM9aS55MS1uO2E8ciYmKHI9YT0ocithKS8yKSxzPG8mJihvPXM9KG8rcykvMiksaS54MD1yLGkueTA9byxpLngxPWEsaS55MT1zfX0pKGUsbykpLGkmJnIuZWFjaEJlZm9yZShxUykscn1yZXR1cm4gci5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0hIXQscik6aX0sci5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStuWzBdLGU9K25bMV0scik6W3QsZV19LHIucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdCxyKTpufSxyfSxzdHJhdGlmeTpmdW5jdGlvbiBVSSgpe3ZhciB0PUtTLGU9WlM7ZnVuY3Rpb24gbihuKXt2YXIgaSxyLG8sYSxzLGwsYyx1PW4ubGVuZ3RoLGg9bmV3IEFycmF5KHUpLGQ9e307Zm9yKHI9MDtyPHU7KytyKXM9aFtyXT1uZXcgaFMoaT1uW3JdKSxudWxsIT0obD10KGkscixuKSkmJihsKz0iIikmJihkW2M9IiQiKyhzLmlkPWwpXT1jIGluIGQ/JFM6cyk7Zm9yKHI9MDtyPHU7KytyKWlmKHM9aFtyXSxudWxsIT0obD1lKG5bcl0scixuKSkmJihsKz0iIikpe2lmKCEoYT1kWyIkIitsXSkpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nOiAiK2wpO2lmKGE9PT0kUyl0aHJvdyBuZXcgRXJyb3IoImFtYmlndW91czogIitsKTthLmNoaWxkcmVuP2EuY2hpbGRyZW4ucHVzaChzKTphLmNoaWxkcmVuPVtzXSxzLnBhcmVudD1hfWVsc2V7aWYobyl0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIHJvb3RzIik7bz1zfWlmKCFvKXRocm93IG5ldyBFcnJvcigibm8gcm9vdCIpO2lmKG8ucGFyZW50PVhTLG8uZWFjaEJlZm9yZSgoZnVuY3Rpb24odCl7dC5kZXB0aD10LnBhcmVudC5kZXB0aCsxLC0tdX0pKS5lYWNoQmVmb3JlKHVTKSxvLnBhcmVudD1udWxsLHU+MCl0aHJvdyBuZXcgRXJyb3IoImN5Y2xlIik7cmV0dXJuIG99cmV0dXJuIG4uaWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9SFMoZSksbik6dH0sbi5wYXJlbnRJZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1IUyh0KSxuKTplfSxufSx0cmVlOmZ1bmN0aW9uIGpJKCl7dmFyIHQ9SlMsZT0xLG49MSxpPW51bGw7ZnVuY3Rpb24gcihyKXt2YXIgbD0oZnVuY3Rpb24gYyh0KXtmb3IodmFyIGUsbixpLHIsbyxhPW5ldyBpTSh0LDApLHM9W2FdO2U9cy5wb3AoKTspaWYoaT1lLl8uY2hpbGRyZW4pZm9yKGUuY2hpbGRyZW49bmV3IEFycmF5KG89aS5sZW5ndGgpLHI9by0xO3I+PTA7LS1yKXMucHVzaChuPWUuY2hpbGRyZW5bcl09bmV3IGlNKGlbcl0scikpLG4ucGFyZW50PWU7cmV0dXJuKGEucGFyZW50PW5ldyBpTShudWxsLDApKS5jaGlsZHJlbj1bYV0sYX0pKHIpO2lmKGwuZWFjaEFmdGVyKG8pLGwucGFyZW50Lm09LWwueixsLmVhY2hCZWZvcmUoYSksaSlyLmVhY2hCZWZvcmUocyk7ZWxzZXt2YXIgdT1yLGg9cixkPXI7ci5lYWNoQmVmb3JlKChmdW5jdGlvbih0KXt0Lng8dS54JiYodT10KSx0Lng+aC54JiYoaD10KSx0LmRlcHRoPmQuZGVwdGgmJihkPXQpfSkpO3ZhciBwPXU9PT1oPzE6dCh1LGgpLzIsZj1wLXUueCxtPWUvKGgueCtwK2YpLGc9bi8oZC5kZXB0aHx8MSk7ci5lYWNoQmVmb3JlKChmdW5jdGlvbih0KXt0Lng9KHQueCtmKSptLHQueT10LmRlcHRoKmd9KSl9cmV0dXJuIHJ9ZnVuY3Rpb24gbyhlKXt2YXIgbj1lLmNoaWxkcmVuLGk9ZS5wYXJlbnQuY2hpbGRyZW4scj1lLmk/aVtlLmktMV06bnVsbDtpZihuKXshKGZ1bmN0aW9uIG8odCl7Zm9yKHZhciBlLG49MCxpPTAscj10LmNoaWxkcmVuLG89ci5sZW5ndGg7LS1vPj0wOykoZT1yW29dKS56Kz1uLGUubSs9bixuKz1lLnMrKGkrPWUuYyl9KShlKTt2YXIgYT0oblswXS56K25bbi5sZW5ndGgtMV0ueikvMjtyPyhlLno9ci56K3QoZS5fLHIuXyksZS5tPWUuei1hKTplLno9YX1lbHNlIHImJihlLno9ci56K3QoZS5fLHIuXykpO2UucGFyZW50LkE9KGZ1bmN0aW9uIHMoZSxuLGkpe2lmKG4pe2Zvcih2YXIgcixvPWUsYT1lLHM9bixsPW8ucGFyZW50LmNoaWxkcmVuWzBdLGM9by5tLHU9YS5tLGg9cy5tLGQ9bC5tO3M9dE0ocyksbz1RUyhvKSxzJiZvOylsPVFTKGwpLChhPXRNKGEpKS5hPWUsKHI9cy56K2gtby56LWMrdChzLl8sby5fKSk+MCYmKGVNKG5NKHMsZSxpKSxlLHIpLGMrPXIsdSs9ciksaCs9cy5tLGMrPW8ubSxkKz1sLm0sdSs9YS5tO3MmJiF0TShhKSYmKGEudD1zLGEubSs9aC11KSxvJiYhUVMobCkmJihsLnQ9byxsLm0rPWMtZCxpPWUpfXJldHVybiBpfSkoZSxyLGUucGFyZW50LkF8fGlbMF0pfWZ1bmN0aW9uIGEodCl7dC5fLng9dC56K3QucGFyZW50Lm0sdC5tKz10LnBhcmVudC5tfWZ1bmN0aW9uIHModCl7dC54Kj1lLHQueT10LmRlcHRoKm59cmV0dXJuIHIuc2VwYXJhdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLHIpOnR9LHIuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0hMSxlPSt0WzBdLG49K3RbMV0scik6aT9udWxsOltlLG5dfSxyLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSEwLGU9K3RbMF0sbj0rdFsxXSxyKTppP1tlLG5dOm51bGx9LHJ9LHRyZWVtYXA6ZnVuY3Rpb24gR0koKXt2YXIgdD1zTSxlPSExLG49MSxpPTEscj1bMF0sbz1GUyxhPUZTLHM9RlMsbD1GUyxjPUZTO2Z1bmN0aW9uIHUodCl7cmV0dXJuIHQueDA9dC55MD0wLHQueDE9bix0LnkxPWksdC5lYWNoQmVmb3JlKGgpLHI9WzBdLGUmJnQuZWFjaEJlZm9yZShxUyksdH1mdW5jdGlvbiBoKGUpe3ZhciBuPXJbZS5kZXB0aF0saT1lLngwK24sdT1lLnkwK24saD1lLngxLW4sZD1lLnkxLW47aDxpJiYoaT1oPShpK2gpLzIpLGQ8dSYmKHU9ZD0odStkKS8yKSxlLngwPWksZS55MD11LGUueDE9aCxlLnkxPWQsZS5jaGlsZHJlbiYmKG49cltlLmRlcHRoKzFdPW8oZSkvMixpKz1jKGUpLW4sdSs9YShlKS1uLChoLT1zKGUpLW4pPGkmJihpPWg9KGkraCkvMiksKGQtPWwoZSktbik8dSYmKHU9ZD0odStkKS8yKSx0KGUsaSx1LGgsZCkpfXJldHVybiB1LnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSEhdCx1KTplfSx1LnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3RbMF0saT0rdFsxXSx1KTpbbixpXX0sdS50aWxlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PUhTKGUpLHUpOnR9LHUucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD91LnBhZGRpbmdJbm5lcih0KS5wYWRkaW5nT3V0ZXIodCk6dS5wYWRkaW5nSW5uZXIoKX0sdS5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWUygrdCksdSk6b30sdS5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dS5wYWRkaW5nVG9wKHQpLnBhZGRpbmdSaWdodCh0KS5wYWRkaW5nQm90dG9tKHQpLnBhZGRpbmdMZWZ0KHQpOnUucGFkZGluZ1RvcCgpfSx1LnBhZGRpbmdUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWUygrdCksdSk6YX0sdS5wYWRkaW5nUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWUygrdCksdSk6c30sdS5wYWRkaW5nQm90dG9tPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VlMoK3QpLHUpOmx9LHUucGFkZGluZ0xlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWUygrdCksdSk6Y30sdX0sdHJlZW1hcEJpbmFyeTpmdW5jdGlvbiBXSSh0LGUsbixpLHIpe3ZhciBvLGEscz10LmNoaWxkcmVuLGw9cy5sZW5ndGgsYz1uZXcgQXJyYXkobCsxKTtmb3IoY1swXT1hPW89MDtvPGw7KytvKWNbbysxXT1hKz1zW29dLnZhbHVlOyEoZnVuY3Rpb24gdChlLG4saSxyLG8sYSxsKXtpZihlPj1uLTEpe3ZhciB1PXNbZV07cmV0dXJuIHUueDA9cix1LnkwPW8sdS54MT1hLHZvaWQodS55MT1sKX1mb3IodmFyIGg9Y1tlXSxkPWkvMitoLHA9ZSsxLGY9bi0xO3A8Zjspe3ZhciBtPXArZj4+PjE7Y1ttXTxkP3A9bSsxOmY9bX1kLWNbcC0xXTxjW3BdLWQmJmUrMTxwJiYtLXA7dmFyIGc9Y1twXS1oLF89aS1nO2lmKGEtcj5sLW8pe3ZhciB5PShyKl8rYSpnKS9pO3QoZSxwLGcscixvLHksbCksdChwLG4sXyx5LG8sYSxsKX1lbHNle3ZhciB2PShvKl8rbCpnKS9pO3QoZSxwLGcscixvLGEsdiksdChwLG4sXyxyLHYsYSxsKX19KSgwLGwsdC52YWx1ZSxlLG4saSxyKX0sdHJlZW1hcERpY2U6WVMsdHJlZW1hcFNsaWNlOnJNLHRyZWVtYXBTbGljZURpY2U6ZnVuY3Rpb24gcUkodCxlLG4saSxyKXsoMSZ0LmRlcHRoP3JNOllTKSh0LGUsbixpLHIpfSx0cmVlbWFwU3F1YXJpZnk6c00sdHJlZW1hcFJlc3F1YXJpZnk6bE0saW50ZXJwb2xhdGU6amQsaW50ZXJwb2xhdGVBcnJheTpmdW5jdGlvbiBZSSh0LGUpe3JldHVybihPZChlKT9SZDp6ZCkodCxlKX0saW50ZXJwb2xhdGVCYXNpczpNZCxpbnRlcnBvbGF0ZUJhc2lzQ2xvc2VkOkVkLGludGVycG9sYXRlRGF0ZTpEZCxpbnRlcnBvbGF0ZURpc2NyZXRlOmZ1bmN0aW9uIFhJKHQpe3ZhciBlPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdFtNYXRoLm1heCgwLE1hdGgubWluKGUtMSxNYXRoLmZsb29yKG4qZSkpKV19fSxpbnRlcnBvbGF0ZUh1ZTpmdW5jdGlvbiAkSSh0LGUpe3ZhciBuPUFkKCt0LCtlKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9bih0KTtyZXR1cm4gZS0zNjAqTWF0aC5mbG9vcihlLzM2MCl9fSxpbnRlcnBvbGF0ZU51bWJlcjpCZCxpbnRlcnBvbGF0ZU51bWJlckFycmF5OlJkLGludGVycG9sYXRlT2JqZWN0OkhkLGludGVycG9sYXRlUm91bmQ6R2QsaW50ZXJwb2xhdGVTdHJpbmc6VWQsaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3M6UWQsaW50ZXJwb2xhdGVUcmFuc2Zvcm1Tdmc6ZXAsaW50ZXJwb2xhdGVab29tOm9wLGludGVycG9sYXRlUmdiOkxkLGludGVycG9sYXRlUmdiQmFzaXM6TmQsaW50ZXJwb2xhdGVSZ2JCYXNpc0Nsb3NlZDpJZCxpbnRlcnBvbGF0ZUhzbDpzcCxpbnRlcnBvbGF0ZUhzbExvbmc6bHAsaW50ZXJwb2xhdGVMYWI6Y3AsaW50ZXJwb2xhdGVIY2w6aHAsaW50ZXJwb2xhdGVIY2xMb25nOmRwLGludGVycG9sYXRlQ3ViZWhlbGl4OmdwLGludGVycG9sYXRlQ3ViZWhlbGl4TG9uZzpfcCxwaWVjZXdpc2U6ZnVuY3Rpb24gS0kodCxlKXtmb3IodmFyIG49MCxpPWUubGVuZ3RoLTEscj1lWzBdLG89bmV3IEFycmF5KGk8MD8wOmkpO248aTspb1tuXT10KHIscj1lWysrbl0pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1NYXRoLm1heCgwLE1hdGgubWluKGktMSxNYXRoLmZsb29yKHQqPWkpKSk7cmV0dXJuIG9bZV0odC1lKX19LHF1YW50aXplOmZ1bmN0aW9uIFpJKHQsZSl7Zm9yKHZhciBuPW5ldyBBcnJheShlKSxpPTA7aTxlOysraSluW2ldPXQoaS8oZS0xKSk7cmV0dXJuIG59LHBhdGg6ZmcscG9seWdvbkFyZWE6ZnVuY3Rpb24gSkkodCl7Zm9yKHZhciBlLG49LTEsaT10Lmxlbmd0aCxyPXRbaS0xXSxvPTA7KytuPGk7KW8rPShlPXIpWzFdKihyPXRbbl0pWzBdLWVbMF0qclsxXTtyZXR1cm4gby8yfSxwb2x5Z29uQ2VudHJvaWQ6ZnVuY3Rpb24gUUkodCl7Zm9yKHZhciBlLG4saT0tMSxyPXQubGVuZ3RoLG89MCxhPTAscz10W3ItMV0sbD0wOysraTxyOylsKz1uPShlPXMpWzBdKihzPXRbaV0pWzFdLXNbMF0qZVsxXSxvKz0oZVswXStzWzBdKSpuLGErPShlWzFdK3NbMV0pKm47cmV0dXJuW28vKGwqPTMpLGEvbF19LHBvbHlnb25IdWxsOmZ1bmN0aW9uIHRSKHQpe2lmKChuPXQubGVuZ3RoKTwzKXJldHVybiBudWxsO3ZhciBlLG4saT1uZXcgQXJyYXkobikscj1uZXcgQXJyYXkobik7Zm9yKGU9MDtlPG47KytlKWlbZV09Wyt0W2VdWzBdLCt0W2VdWzFdLGVdO2ZvcihpLnNvcnQodU0pLGU9MDtlPG47KytlKXJbZV09W2lbZV1bMF0sLWlbZV1bMV1dO3ZhciBvPWhNKGkpLGE9aE0ocikscz1hWzBdPT09b1swXSxsPWFbYS5sZW5ndGgtMV09PT1vW28ubGVuZ3RoLTFdLGM9W107Zm9yKGU9by5sZW5ndGgtMTtlPj0wOy0tZSljLnB1c2godFtpW29bZV1dWzJdXSk7Zm9yKGU9K3M7ZTxhLmxlbmd0aC1sOysrZSljLnB1c2godFtpW2FbZV1dWzJdXSk7cmV0dXJuIGN9LHBvbHlnb25Db250YWluczpmdW5jdGlvbiBlUih0LGUpe2Zvcih2YXIgbixpLHI9dC5sZW5ndGgsbz10W3ItMV0sYT1lWzBdLHM9ZVsxXSxsPW9bMF0sYz1vWzFdLHU9ITEsaD0wO2g8cjsrK2gpbj0obz10W2hdKVswXSwoaT1vWzFdKT5zIT1jPnMmJmE8KGwtbikqKHMtaSkvKGMtaSkrbiYmKHU9IXUpLGw9bixjPWk7cmV0dXJuIHV9LHBvbHlnb25MZW5ndGg6ZnVuY3Rpb24gblIodCl7Zm9yKHZhciBlLG4saT0tMSxyPXQubGVuZ3RoLG89dFtyLTFdLGE9b1swXSxzPW9bMV0sbD0wOysraTxyOyllPWEsbj1zLGUtPWE9KG89dFtpXSlbMF0sbi09cz1vWzFdLGwrPU1hdGguc3FydChlKmUrbipuKTtyZXR1cm4gbH0scXVhZHRyZWU6Tl8scmFuZG9tVW5pZm9ybTpwTSxyYW5kb21Ob3JtYWw6Zk0scmFuZG9tTG9nTm9ybWFsOm1NLHJhbmRvbUJhdGVzOl9NLHJhbmRvbUlyd2luSGFsbDpnTSxyYW5kb21FeHBvbmVudGlhbDp5TSxzY2FsZUJhbmQ6VE0sc2NhbGVQb2ludDpBTSxzY2FsZUlkZW50aXR5OmZ1bmN0aW9uIHQoZSl7dmFyIG47ZnVuY3Rpb24gaSh0KXtyZXR1cm4gaXNOYU4odD0rdCk/bjp0fXJldHVybiBpLmludmVydD1pLGkuZG9tYWluPWkucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9d00uY2FsbCh0LGtNKSxpKTplLnNsaWNlKCl9LGkudW5rbm93bj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGkpOm59LGkuY29weT1mdW5jdGlvbigpe3JldHVybiB0KGUpLnVua25vd24obil9LGU9YXJndW1lbnRzLmxlbmd0aD93TS5jYWxsKGUsa00pOlswLDFdLEZNKGkpfSxzY2FsZUxpbmVhcjpWTSxzY2FsZUxvZzpLTSxzY2FsZVN5bWxvZzpmdW5jdGlvbiB0KCl7dmFyIGU9UU0oRE0oKSk7cmV0dXJuIGUuY29weT1mdW5jdGlvbigpe3JldHVybiB6TShlLHQoKSkuY29uc3RhbnQoZS5jb25zdGFudCgpKX0sdk0uYXBwbHkoZSxhcmd1bWVudHMpfSxzY2FsZU9yZGluYWw6RU0sc2NhbGVJbXBsaWNpdDpNTSxzY2FsZVBvdzpyRSxzY2FsZVNxcnQ6ZnVuY3Rpb24gaVIoKXtyZXR1cm4gckUuYXBwbHkobnVsbCxhcmd1bWVudHMpLmV4cG9uZW50KC41KX0sc2NhbGVRdWFudGlsZTpvRSxzY2FsZVF1YW50aXplOmFFLHNjYWxlVGhyZXNob2xkOmZ1bmN0aW9uIHQoKXt2YXIgZSxuPVsuNV0saT1bMCwxXSxyPTE7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdDw9dD9pW1NsKG4sdCwwLHIpXTplfXJldHVybiBvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1TTS5jYWxsKHQpLHI9TWF0aC5taW4obi5sZW5ndGgsaS5sZW5ndGgtMSksbyk6bi5zbGljZSgpfSxvLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPVNNLmNhbGwodCkscj1NYXRoLm1pbihuLmxlbmd0aCxpLmxlbmd0aC0xKSxvKTppLnNsaWNlKCl9LG8uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBlPWkuaW5kZXhPZih0KTtyZXR1cm5bbltlLTFdLG5bZV1dfSxvLnVua25vd249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxvKTplfSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihuKS5yYW5nZShpKS51bmtub3duKGUpfSx2TS5hcHBseShvLGFyZ3VtZW50cyl9LHNjYWxlVGltZTpjQSxzY2FsZVV0YzpmdW5jdGlvbiByUigpe3JldHVybiB2TS5hcHBseShsQShFVCx3VCxzVCxyVCxlVCxKRSx2RSxoRSxSVCkuZG9tYWluKFtEYXRlLlVUQygyZTMsMCwxKSxEYXRlLlVUQygyZTMsMCwyKV0pLGFyZ3VtZW50cyl9LHNjYWxlU2VxdWVudGlhbDpmdW5jdGlvbiB0KCl7dmFyIGU9Rk0odUEoKShQTSkpO3JldHVybiBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gaEEoZSx0KCkpfSxiTS5hcHBseShlLGFyZ3VtZW50cyl9LHNjYWxlU2VxdWVudGlhbExvZzpmdW5jdGlvbiB0KCl7dmFyIGU9JE0odUEoKSkuZG9tYWluKFsxLDEwXSk7cmV0dXJuIGUuY29weT1mdW5jdGlvbigpe3JldHVybiBoQShlLHQoKSkuYmFzZShlLmJhc2UoKSl9LGJNLmFwcGx5KGUsYXJndW1lbnRzKX0sc2NhbGVTZXF1ZW50aWFsUG93OmRBLHNjYWxlU2VxdWVudGlhbFNxcnQ6ZnVuY3Rpb24gb1IoKXtyZXR1cm4gZEEuYXBwbHkobnVsbCxhcmd1bWVudHMpLmV4cG9uZW50KC41KX0sc2NhbGVTZXF1ZW50aWFsU3ltbG9nOmZ1bmN0aW9uIHQoKXt2YXIgZT1RTSh1QSgpKTtyZXR1cm4gZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGhBKGUsdCgpKS5jb25zdGFudChlLmNvbnN0YW50KCkpfSxiTS5hcHBseShlLGFyZ3VtZW50cyl9LHNjYWxlU2VxdWVudGlhbFF1YW50aWxlOmZ1bmN0aW9uIHQoKXt2YXIgZT1bXSxuPVBNO2Z1bmN0aW9uIGkodCl7aWYoIWlzTmFOKHQ9K3QpKXJldHVybiBuKChTbChlLHQpLTEpLyhlLmxlbmd0aC0xKSl9cmV0dXJuIGkuZG9tYWluPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBlLnNsaWNlKCk7ZT1bXTtmb3IodmFyIG4scj0wLG89dC5sZW5ndGg7cjxvOysrciludWxsPT0obj10W3JdKXx8aXNOYU4obj0rbil8fGUucHVzaChuKTtyZXR1cm4gZS5zb3J0KGJsKSxpfSxpLmludGVycG9sYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGkpOm59LGkuY29weT1mdW5jdGlvbigpe3JldHVybiB0KG4pLmRvbWFpbihlKX0sYk0uYXBwbHkoaSxhcmd1bWVudHMpfSxzY2FsZURpdmVyZ2luZzpmdW5jdGlvbiB0KCl7dmFyIGU9Rk0ocEEoKShQTSkpO3JldHVybiBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gaEEoZSx0KCkpfSxiTS5hcHBseShlLGFyZ3VtZW50cyl9LHNjYWxlRGl2ZXJnaW5nTG9nOmZ1bmN0aW9uIHQoKXt2YXIgZT0kTShwQSgpKS5kb21haW4oWy4xLDEsMTBdKTtyZXR1cm4gZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGhBKGUsdCgpKS5iYXNlKGUuYmFzZSgpKX0sYk0uYXBwbHkoZSxhcmd1bWVudHMpfSxzY2FsZURpdmVyZ2luZ1BvdzpmQSxzY2FsZURpdmVyZ2luZ1NxcnQ6ZnVuY3Rpb24gYVIoKXtyZXR1cm4gZkEuYXBwbHkobnVsbCxhcmd1bWVudHMpLmV4cG9uZW50KC41KX0sc2NhbGVEaXZlcmdpbmdTeW1sb2c6ZnVuY3Rpb24gdCgpe3ZhciBlPVFNKHBBKCkpO3JldHVybiBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gaEEoZSx0KCkpLmNvbnN0YW50KGUuY29uc3RhbnQoKSl9LGJNLmFwcGx5KGUsYXJndW1lbnRzKX0sdGlja0Zvcm1hdDpITSxzY2hlbWVDYXRlZ29yeTEwOmdBLHNjaGVtZUFjY2VudDpfQSxzY2hlbWVEYXJrMjp5QSxzY2hlbWVQYWlyZWQ6dkEsc2NoZW1lUGFzdGVsMTpiQSxzY2hlbWVQYXN0ZWwyOnhBLHNjaGVtZVNldDE6d0Esc2NoZW1lU2V0MjpTQSxzY2hlbWVTZXQzOk1BLHNjaGVtZVRhYmxlYXUxMDpFQSxpbnRlcnBvbGF0ZUJyQkc6QUEsc2NoZW1lQnJCRzpDQSxpbnRlcnBvbGF0ZVBSR246TEEsc2NoZW1lUFJHbjprQSxpbnRlcnBvbGF0ZVBpWUc6TkEsc2NoZW1lUGlZRzpQQSxpbnRlcnBvbGF0ZVB1T3I6UkEsc2NoZW1lUHVPcjpJQSxpbnRlcnBvbGF0ZVJkQnU6ekEsc2NoZW1lUmRCdTpPQSxpbnRlcnBvbGF0ZVJkR3k6QkEsc2NoZW1lUmRHeTpEQSxpbnRlcnBvbGF0ZVJkWWxCdTpGQSxzY2hlbWVSZFlsQnU6SEEsaW50ZXJwb2xhdGVSZFlsR246VUEsc2NoZW1lUmRZbEduOlZBLGludGVycG9sYXRlU3BlY3RyYWw6R0Esc2NoZW1lU3BlY3RyYWw6akEsaW50ZXJwb2xhdGVCdUduOnFBLHNjaGVtZUJ1R246V0EsaW50ZXJwb2xhdGVCdVB1OlhBLHNjaGVtZUJ1UHU6WUEsaW50ZXJwb2xhdGVHbkJ1OktBLHNjaGVtZUduQnU6JEEsaW50ZXJwb2xhdGVPclJkOkpBLHNjaGVtZU9yUmQ6WkEsaW50ZXJwb2xhdGVQdUJ1R246dGssc2NoZW1lUHVCdUduOlFBLGludGVycG9sYXRlUHVCdTpuayxzY2hlbWVQdUJ1OmVrLGludGVycG9sYXRlUHVSZDpyayxzY2hlbWVQdVJkOmlrLGludGVycG9sYXRlUmRQdTphayxzY2hlbWVSZFB1Om9rLGludGVycG9sYXRlWWxHbkJ1OmxrLHNjaGVtZVlsR25CdTpzayxpbnRlcnBvbGF0ZVlsR246dWssc2NoZW1lWWxHbjpjayxpbnRlcnBvbGF0ZVlsT3JCcjpkayxzY2hlbWVZbE9yQnI6aGssaW50ZXJwb2xhdGVZbE9yUmQ6Zmssc2NoZW1lWWxPclJkOnBrLGludGVycG9sYXRlQmx1ZXM6Z2ssc2NoZW1lQmx1ZXM6bWssaW50ZXJwb2xhdGVHcmVlbnM6eWssc2NoZW1lR3JlZW5zOl9rLGludGVycG9sYXRlR3JleXM6Ymssc2NoZW1lR3JleXM6dmssaW50ZXJwb2xhdGVQdXJwbGVzOndrLHNjaGVtZVB1cnBsZXM6eGssaW50ZXJwb2xhdGVSZWRzOk1rLHNjaGVtZVJlZHM6U2ssaW50ZXJwb2xhdGVPcmFuZ2VzOlRrLHNjaGVtZU9yYW5nZXM6RWssaW50ZXJwb2xhdGVDaXZpZGlzOmZ1bmN0aW9uIHNSKHQpe3JldHVybiB0PU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSksInJnYigiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQoLTQuNTQtdCooMzUuMzQtdCooMjM4MS43My10Kig2NDAyLjctdCooNzAyNC43Mi0yNzEwLjU3KnQpKSkpKSkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCgzMi40OSt0KigxNzAuNzMrdCooNTIuODItdCooMTMxLjQ2LXQqKDE3Ni41OC02Ny4zNyp0KSkpKSkpKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQoODEuMjQrdCooNDQyLjM2LXQqKDI0ODIuNDMtdCooNjE2Ny4yNC10Kig2NjE0Ljk0LTI0NzUuNjcqdCkpKSkpKSkrIikifSxpbnRlcnBvbGF0ZUN1YmVoZWxpeERlZmF1bHQ6Q2ssaW50ZXJwb2xhdGVSYWluYm93OmZ1bmN0aW9uIGxSKHQpeyh0PDB8fHQ+MSkmJih0LT1NYXRoLmZsb29yKHQpKTt2YXIgZT1NYXRoLmFicyh0LS41KTtyZXR1cm4gTGsuaD0zNjAqdC0xMDAsTGsucz0xLjUtMS41KmUsTGsubD0uOC0uOSplLExrKyIifSxpbnRlcnBvbGF0ZVdhcm06QWssaW50ZXJwb2xhdGVDb29sOmtrLGludGVycG9sYXRlU2luZWJvdzpmdW5jdGlvbiBjUih0KXt2YXIgZTtyZXR1cm4gdD0oLjUtdCkqTWF0aC5QSSxQay5yPTI1NSooZT1NYXRoLnNpbih0KSkqZSxQay5nPTI1NSooZT1NYXRoLnNpbih0K05rKSkqZSxQay5iPTI1NSooZT1NYXRoLnNpbih0K0lrKSkqZSxQaysiIn0saW50ZXJwb2xhdGVUdXJibzpmdW5jdGlvbiB1Uih0KXtyZXR1cm4gdD1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLCJyZ2IoIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKDM0LjYxK3QqKDExNzIuMzMtdCooMTA3OTMuNTYtdCooMzMzMDAuMTItdCooMzgzOTQuNDktMTQ4MjUuMDUqdCkpKSkpKSkrIiwgIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKDIzLjMxK3QqKDU1Ny4zMyt0KigxMjI1LjMzLXQqKDM1NzQuOTYtdCooMTA3My43Nys3MDcuNTYqdCkpKSkpKSkrIiwgIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKDI3LjIrdCooMzIxMS4xLXQqKDE1MzI3Ljk3LXQqKDI3ODE0LXQqKDIyNTY5LjE4LTY4MzguNjYqdCkpKSkpKSkrIikifSxpbnRlcnBvbGF0ZVZpcmlkaXM6T2ssaW50ZXJwb2xhdGVNYWdtYTp6ayxpbnRlcnBvbGF0ZUluZmVybm86RGssaW50ZXJwb2xhdGVQbGFzbWE6QmssY3JlYXRlOmZ1bmN0aW9uIGhSKHQpe3JldHVybiBTdSh5Yyh0KS5jYWxsKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpfSxjcmVhdG9yOnljLGxvY2FsOm5oLG1hdGNoZXI6U2MsbW91c2U6YWgsbmFtZXNwYWNlOm1jLG5hbWVzcGFjZXM6ZmMsY2xpZW50UG9pbnQ6b2gsc2VsZWN0OlN1LHNlbGVjdEFsbDpzaCxzZWxlY3Rpb246d3Usc2VsZWN0b3I6YmMsc2VsZWN0b3JBbGw6d2Msc3R5bGU6SGMsdG91Y2g6bGgsdG91Y2hlczpmdW5jdGlvbiBkUih0LGUpe251bGw9PWUmJihlPXJoKCkudG91Y2hlcyk7Zm9yKHZhciBuPTAsaT1lP2UubGVuZ3RoOjAscj1uZXcgQXJyYXkoaSk7bjxpOysrbilyW25dPW9oKHQsZVtuXSk7cmV0dXJuIHJ9LHdpbmRvdzpPYyxnZXQgZXZlbnQoKXtyZXR1cm4gdXV9LGN1c3RvbUV2ZW50Omd1LGFyYzpmdW5jdGlvbiBwUigpe3ZhciB0PVFrLGU9dEwsbj1IaygwKSxpPW51bGwscj1lTCxvPW5MLGE9aUwscz1udWxsO2Z1bmN0aW9uIGwoKXt2YXIgbCxjLHU9K3QuYXBwbHkodGhpcyxhcmd1bWVudHMpLGg9K2UuYXBwbHkodGhpcyxhcmd1bWVudHMpLGQ9ci5hcHBseSh0aGlzLGFyZ3VtZW50cyktJGsscD1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKS0kayxmPUZrKHAtZCksbT1wPmQ7aWYoc3x8KHM9bD1mZygpKSxoPHUmJihjPWgsaD11LHU9YyksaD5ZaylpZihmPktrLVlrKXMubW92ZVRvKGgqVWsoZCksaCpXayhkKSkscy5hcmMoMCwwLGgsZCxwLCFtKSx1PllrJiYocy5tb3ZlVG8odSpVayhwKSx1KldrKHApKSxzLmFyYygwLDAsdSxwLGQsbSkpO2Vsc2V7dmFyIGcsXyx5PWQsdj1wLGI9ZCx4PXAsdz1mLFM9ZixNPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpLzIsRT1NPllrJiYoaT8raS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6cWsodSp1K2gqaCkpLFQ9R2soRmsoaC11KS8yLCtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksQz1ULEE9VDtpZihFPllrKXt2YXIgaz1KayhFL3UqV2soTSkpLEw9SmsoRS9oKldrKE0pKTsody09MiprKT5Zaz8oYis9ayo9bT8xOi0xLHgtPWspOih3PTAsYj14PShkK3ApLzIpLChTLT0yKkwpPllrPyh5Kz1MKj1tPzE6LTEsdi09TCk6KFM9MCx5PXY9KGQrcCkvMil9dmFyIFA9aCpVayh5KSxOPWgqV2soeSksST11KlVrKHgpLFI9dSpXayh4KTtpZihUPllrKXt2YXIgTyx6PWgqVWsodiksRD1oKldrKHYpLEI9dSpVayhiKSxIPXUqV2soYik7aWYoZjxYayYmKE89ckwoUCxOLEIsSCx6LEQsSSxSKSkpe3ZhciBGPVAtT1swXSxWPU4tT1sxXSxVPXotT1swXSxqPUQtT1sxXSxHPTEvV2soWmsoKEYqVStWKmopLyhxayhGKkYrVipWKSpxayhVKlUraipqKSkpLzIpLFc9cWsoT1swXSpPWzBdK09bMV0qT1sxXSk7Qz1HayhULCh1LVcpLyhHLTEpKSxBPUdrKFQsKGgtVykvKEcrMSkpfX1TPllrP0E+WWs/KGc9b0woQixILFAsTixoLEEsbSksXz1vTCh6LEQsSSxSLGgsQSxtKSxzLm1vdmVUbyhnLmN4K2cueDAxLGcuY3krZy55MDEpLEE8VD9zLmFyYyhnLmN4LGcuY3ksQSxWayhnLnkwMSxnLngwMSksVmsoXy55MDEsXy54MDEpLCFtKToocy5hcmMoZy5jeCxnLmN5LEEsVmsoZy55MDEsZy54MDEpLFZrKGcueTExLGcueDExKSwhbSkscy5hcmMoMCwwLGgsVmsoZy5jeStnLnkxMSxnLmN4K2cueDExKSxWayhfLmN5K18ueTExLF8uY3grXy54MTEpLCFtKSxzLmFyYyhfLmN4LF8uY3ksQSxWayhfLnkxMSxfLngxMSksVmsoXy55MDEsXy54MDEpLCFtKSkpOihzLm1vdmVUbyhQLE4pLHMuYXJjKDAsMCxoLHksdiwhbSkpOnMubW92ZVRvKFAsTiksdT5ZayYmdz5Zaz9DPllrPyhnPW9MKEksUix6LEQsdSwtQyxtKSxfPW9MKFAsTixCLEgsdSwtQyxtKSxzLmxpbmVUbyhnLmN4K2cueDAxLGcuY3krZy55MDEpLEM8VD9zLmFyYyhnLmN4LGcuY3ksQyxWayhnLnkwMSxnLngwMSksVmsoXy55MDEsXy54MDEpLCFtKToocy5hcmMoZy5jeCxnLmN5LEMsVmsoZy55MDEsZy54MDEpLFZrKGcueTExLGcueDExKSwhbSkscy5hcmMoMCwwLHUsVmsoZy5jeStnLnkxMSxnLmN4K2cueDExKSxWayhfLmN5K18ueTExLF8uY3grXy54MTEpLG0pLHMuYXJjKF8uY3gsXy5jeSxDLFZrKF8ueTExLF8ueDExKSxWayhfLnkwMSxfLngwMSksIW0pKSk6cy5hcmMoMCwwLHUseCxiLG0pOnMubGluZVRvKEksUil9ZWxzZSBzLm1vdmVUbygwLDApO2lmKHMuY2xvc2VQYXRoKCksbClyZXR1cm4gcz1udWxsLGwrIiJ8fG51bGx9cmV0dXJuIGwuY2VudHJvaWQ9ZnVuY3Rpb24oKXt2YXIgbj0oK3QuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzIsaT0oK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArby5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzItWGsvMjtyZXR1cm5bVWsoaSkqbixXayhpKSpuXX0sbC5pbm5lclJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOkhrKCtlKSxsKTp0fSxsLm91dGVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SGsoK3QpLGwpOmV9LGwuY29ybmVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SGsoK3QpLGwpOm59LGwucGFkUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OkhrKCt0KSxsKTppfSxsLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpIaygrdCksbCk6cn0sbC5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkhrKCt0KSxsKTpvfSxsLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SGsoK3QpLGwpOmF9LGwuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1udWxsPT10P251bGw6dCxsKTpzfSxsfSxhcmVhOmhMLGxpbmU6dUwscGllOmZ1bmN0aW9uIGZSKCl7dmFyIHQ9cEwsZT1kTCxuPW51bGwsaT1IaygwKSxyPUhrKEtrKSxvPUhrKDApO2Z1bmN0aW9uIGEoYSl7dmFyIHMsbCxjLHUsaCxkPWEubGVuZ3RoLHA9MCxmPW5ldyBBcnJheShkKSxtPW5ldyBBcnJheShkKSxnPStpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxfPU1hdGgubWluKEtrLE1hdGgubWF4KC1LayxyLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1nKSkseT1NYXRoLm1pbihNYXRoLmFicyhfKS9kLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpKSx2PXkqKF88MD8tMToxKTtmb3Iocz0wO3M8ZDsrK3MpKGg9bVtmW3NdPXNdPSt0KGFbc10scyxhKSk+MCYmKHArPWgpO2ZvcihudWxsIT1lP2Yuc29ydCgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZShtW3RdLG1bbl0pfSkpOm51bGwhPW4mJmYuc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gbihhW3RdLGFbZV0pfSkpLHM9MCxjPXA/KF8tZCp2KS9wOjA7czxkOysrcyxnPXUpbVtsPWZbc11dPXtkYXRhOmFbbF0saW5kZXg6cyx2YWx1ZTpoPW1bbF0sc3RhcnRBbmdsZTpnLGVuZEFuZ2xlOnU9ZysoaD4wP2gqYzowKSt2LHBhZEFuZ2xlOnl9O3JldHVybiBtfXJldHVybiBhLnZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6SGsoK2UpLGEpOnR9LGEuc29ydFZhbHVlcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG49bnVsbCxhKTplfSxhLnNvcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxlPW51bGwsYSk6bn0sYS5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SGsoK3QpLGEpOml9LGEuZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpIaygrdCksYSk6cn0sYS5wYWRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkhrKCt0KSxhKTpvfSxhfSxhcmVhUmFkaWFsOnZMLHJhZGlhbEFyZWE6dkwsbGluZVJhZGlhbDp5TCxyYWRpYWxMaW5lOnlMLHBvaW50UmFkaWFsOmJMLGxpbmtIb3Jpem9udGFsOmZ1bmN0aW9uIG1SKCl7cmV0dXJuIE1MKEVMKX0sbGlua1ZlcnRpY2FsOmZ1bmN0aW9uIGdSKCl7cmV0dXJuIE1MKFRMKX0sbGlua1JhZGlhbDpmdW5jdGlvbiBfUigpe3ZhciB0PU1MKENMKTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0fSxzeW1ib2w6ZnVuY3Rpb24geVIoKXt2YXIgdD1IayhBTCksZT1Iayg2NCksbj1udWxsO2Z1bmN0aW9uIGkoKXt2YXIgaTtpZihufHwobj1pPWZnKCkpLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpLmRyYXcobiwrZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGkpcmV0dXJuIG49bnVsbCxpKyIifHxudWxsfXJldHVybiBpLnR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpIayhlKSxpKTp0fSxpLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpIaygrdCksaSk6ZX0saS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPW51bGw9PXQ/bnVsbDp0LGkpOm59LGl9LHN5bWJvbHM6V0wsc3ltYm9sQ2lyY2xlOkFMLHN5bWJvbENyb3NzOmtMLHN5bWJvbERpYW1vbmQ6Tkwsc3ltYm9sU3F1YXJlOkRMLHN5bWJvbFN0YXI6ekwsc3ltYm9sVHJpYW5nbGU6SEwsc3ltYm9sV3llOkdMLGN1cnZlQmFzaXNDbG9zZWQ6ZnVuY3Rpb24gdlIodCl7cmV0dXJuIG5ldyBLTCh0KX0sY3VydmVCYXNpc09wZW46ZnVuY3Rpb24gYlIodCl7cmV0dXJuIG5ldyBaTCh0KX0sY3VydmVCYXNpczokTCxjdXJ2ZUJ1bmRsZTpRTCxjdXJ2ZUNhcmRpbmFsQ2xvc2VkOnJQLGN1cnZlQ2FyZGluYWxPcGVuOmFQLGN1cnZlQ2FyZGluYWw6blAsY3VydmVDYXRtdWxsUm9tQ2xvc2VkOmhQLGN1cnZlQ2F0bXVsbFJvbU9wZW46cFAsY3VydmVDYXRtdWxsUm9tOmNQLGN1cnZlTGluZWFyQ2xvc2VkOmZ1bmN0aW9uIHhSKHQpe3JldHVybiBuZXcgZlAodCl9LGN1cnZlTGluZWFyOnNMLGN1cnZlTW9ub3RvbmVYOmZ1bmN0aW9uIHdSKHQpe3JldHVybiBuZXcgdlAodCl9LGN1cnZlTW9ub3RvbmVZOmZ1bmN0aW9uIFNSKHQpe3JldHVybiBuZXcgYlAodCl9LGN1cnZlTmF0dXJhbDpmdW5jdGlvbiBNUih0KXtyZXR1cm4gbmV3IHdQKHQpfSxjdXJ2ZVN0ZXA6ZnVuY3Rpb24gRVIodCl7cmV0dXJuIG5ldyBNUCh0LC41KX0sY3VydmVTdGVwQWZ0ZXI6ZnVuY3Rpb24gVFIodCl7cmV0dXJuIG5ldyBNUCh0LDEpfSxjdXJ2ZVN0ZXBCZWZvcmU6ZnVuY3Rpb24gQ1IodCl7cmV0dXJuIG5ldyBNUCh0LDApfSxzdGFjazpmdW5jdGlvbiBBUigpe3ZhciB0PUhrKFtdKSxlPVRQLG49RVAsaT1DUDtmdW5jdGlvbiByKHIpe3ZhciBvLGEscz10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxsPXIubGVuZ3RoLGM9cy5sZW5ndGgsdT1uZXcgQXJyYXkoYyk7Zm9yKG89MDtvPGM7KytvKXtmb3IodmFyIGgsZD1zW29dLHA9dVtvXT1uZXcgQXJyYXkobCksZj0wO2Y8bDsrK2YpcFtmXT1oPVswLCtpKHJbZl0sZCxmLHIpXSxoLmRhdGE9cltmXTtwLmtleT1kfWZvcihvPTAsYT1lKHUpO288YzsrK28pdVthW29dXS5pbmRleD1vO3JldHVybiBuKHUsYSksdX1yZXR1cm4gci5rZXlzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6SGsoeEwuY2FsbChlKSkscik6dH0sci52YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkhrKCt0KSxyKTppfSxyLm9yZGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/VFA6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpIayh4TC5jYWxsKHQpKSxyKTplfSxyLm9mZnNldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P0VQOnQscik6bn0scn0sc3RhY2tPZmZzZXRFeHBhbmQ6ZnVuY3Rpb24ga1IodCxlKXtpZigoaT10Lmxlbmd0aCk+MCl7Zm9yKHZhciBuLGkscixvPTAsYT10WzBdLmxlbmd0aDtvPGE7KytvKXtmb3Iocj1uPTA7bjxpOysrbilyKz10W25dW29dWzFdfHwwO2lmKHIpZm9yKG49MDtuPGk7KytuKXRbbl1bb11bMV0vPXJ9RVAodCxlKX19LHN0YWNrT2Zmc2V0RGl2ZXJnaW5nOmZ1bmN0aW9uIExSKHQsZSl7aWYoKHM9dC5sZW5ndGgpPjApZm9yKHZhciBuLGkscixvLGEscyxsPTAsYz10W2VbMF1dLmxlbmd0aDtsPGM7KytsKWZvcihvPWE9MCxuPTA7bjxzOysrbikocj0oaT10W2Vbbl1dW2xdKVsxXS1pWzBdKT4wPyhpWzBdPW8saVsxXT1vKz1yKTpyPDA/KGlbMV09YSxpWzBdPWErPXIpOihpWzBdPTAsaVsxXT1yKX0sc3RhY2tPZmZzZXROb25lOkVQLHN0YWNrT2Zmc2V0U2lsaG91ZXR0ZTpmdW5jdGlvbiBQUih0LGUpe2lmKChuPXQubGVuZ3RoKT4wKXtmb3IodmFyIG4saT0wLHI9dFtlWzBdXSxvPXIubGVuZ3RoO2k8bzsrK2kpe2Zvcih2YXIgYT0wLHM9MDthPG47KythKXMrPXRbYV1baV1bMV18fDA7cltpXVsxXSs9cltpXVswXT0tcy8yfUVQKHQsZSl9fSxzdGFja09mZnNldFdpZ2dsZTpmdW5jdGlvbiBOUih0LGUpe2lmKChyPXQubGVuZ3RoKT4wJiYoaT0obj10W2VbMF1dKS5sZW5ndGgpPjApe2Zvcih2YXIgbixpLHIsbz0wLGE9MTthPGk7KythKXtmb3IodmFyIHM9MCxsPTAsYz0wO3M8cjsrK3Mpe2Zvcih2YXIgdT10W2Vbc11dLGg9dVthXVsxXXx8MCxkPShoLSh1W2EtMV1bMV18fDApKS8yLHA9MDtwPHM7KytwKXt2YXIgZj10W2VbcF1dO2QrPShmW2FdWzFdfHwwKS0oZlthLTFdWzFdfHwwKX1sKz1oLGMrPWQqaH1uW2EtMV1bMV0rPW5bYS0xXVswXT1vLGwmJihvLT1jL2wpfW5bYS0xXVsxXSs9blthLTFdWzBdPW8sRVAodCxlKX19LHN0YWNrT3JkZXJBcHBlYXJhbmNlOkFQLHN0YWNrT3JkZXJBc2NlbmRpbmc6TFAsc3RhY2tPcmRlckRlc2NlbmRpbmc6ZnVuY3Rpb24gSVIodCl7cmV0dXJuIExQKHQpLnJldmVyc2UoKX0sc3RhY2tPcmRlckluc2lkZU91dDpmdW5jdGlvbiBSUih0KXt2YXIgZSxuLGk9dC5sZW5ndGgscj10Lm1hcChQUCksbz1BUCh0KSxhPTAscz0wLGw9W10sYz1bXTtmb3IoZT0wO2U8aTsrK2Upbj1vW2VdLGE8cz8oYSs9cltuXSxsLnB1c2gobikpOihzKz1yW25dLGMucHVzaChuKSk7cmV0dXJuIGMucmV2ZXJzZSgpLmNvbmNhdChsKX0sc3RhY2tPcmRlck5vbmU6VFAsc3RhY2tPcmRlclJldmVyc2U6ZnVuY3Rpb24gT1IodCl7cmV0dXJuIFRQKHQpLnJldmVyc2UoKX0sdGltZUludGVydmFsOmNFLHRpbWVNaWxsaXNlY29uZDpoRSx0aW1lTWlsbGlzZWNvbmRzOmRFLHV0Y01pbGxpc2Vjb25kOmhFLHV0Y01pbGxpc2Vjb25kczpkRSx0aW1lU2Vjb25kOnZFLHRpbWVTZWNvbmRzOmJFLHV0Y1NlY29uZDp2RSx1dGNTZWNvbmRzOmJFLHRpbWVNaW51dGU6d0UsdGltZU1pbnV0ZXM6U0UsdGltZUhvdXI6RUUsdGltZUhvdXJzOlRFLHRpbWVEYXk6QUUsdGltZURheXM6a0UsdGltZVdlZWs6UEUsdGltZVdlZWtzOkJFLHRpbWVTdW5kYXk6UEUsdGltZVN1bmRheXM6QkUsdGltZU1vbmRheTpORSx0aW1lTW9uZGF5czpIRSx0aW1lVHVlc2RheTpJRSx0aW1lVHVlc2RheXM6RkUsdGltZVdlZG5lc2RheTpSRSx0aW1lV2VkbmVzZGF5czpWRSx0aW1lVGh1cnNkYXk6T0UsdGltZVRodXJzZGF5czpVRSx0aW1lRnJpZGF5OnpFLHRpbWVGcmlkYXlzOmpFLHRpbWVTYXR1cmRheTpERSx0aW1lU2F0dXJkYXlzOkdFLHRpbWVNb250aDpxRSx0aW1lTW9udGhzOllFLHRpbWVZZWFyOiRFLHRpbWVZZWFyczpLRSx1dGNNaW51dGU6SkUsdXRjTWludXRlczpRRSx1dGNIb3VyOmVULHV0Y0hvdXJzOm5ULHV0Y0RheTpyVCx1dGNEYXlzOm9ULHV0Y1dlZWs6c1QsdXRjV2Vla3M6ZlQsdXRjU3VuZGF5OnNULHV0Y1N1bmRheXM6ZlQsdXRjTW9uZGF5OmxULHV0Y01vbmRheXM6bVQsdXRjVHVlc2RheTpjVCx1dGNUdWVzZGF5czpnVCx1dGNXZWRuZXNkYXk6dVQsdXRjV2VkbmVzZGF5czpfVCx1dGNUaHVyc2RheTpoVCx1dGNUaHVyc2RheXM6eVQsdXRjRnJpZGF5OmRULHV0Y0ZyaWRheXM6dlQsdXRjU2F0dXJkYXk6cFQsdXRjU2F0dXJkYXlzOmJULHV0Y01vbnRoOndULHV0Y01vbnRoczpTVCx1dGNZZWFyOkVULHV0Y1llYXJzOlRULHRpbWVGb3JtYXREZWZhdWx0TG9jYWxlOlFDLGdldCB0aW1lRm9ybWF0KCl7cmV0dXJuIE5UfSxnZXQgdGltZVBhcnNlKCl7cmV0dXJuIElUfSxnZXQgdXRjRm9ybWF0KCl7cmV0dXJuIFJUfSxnZXQgdXRjUGFyc2UoKXtyZXR1cm4gT1R9LHRpbWVGb3JtYXRMb2NhbGU6TFQsaXNvRm9ybWF0OmVBLGlzb1BhcnNlOmlBLG5vdzpUcCx0aW1lcjprcCx0aW1lckZsdXNoOkxwLHRpbWVvdXQ6UnAsaW50ZXJ2YWw6ZnVuY3Rpb24gelIodCxlLG4pe3ZhciBpPW5ldyBBcCxyPWU7cmV0dXJuIG51bGw9PWU/KGkucmVzdGFydCh0LGUsbiksaSk6KGU9K2Usbj1udWxsPT1uP1RwKCk6K24saS5yZXN0YXJ0KChmdW5jdGlvbiBvKGEpe2ErPXIsaS5yZXN0YXJ0KG8scis9ZSxuKSx0KGEpfSksZSxuKSxpKX0sdHJhbnNpdGlvbjpfZixhY3RpdmU6ZnVuY3Rpb24gRFIodCxlKXt2YXIgbixpLHI9dC5fX3RyYW5zaXRpb247aWYocilmb3IoaSBpbiBlPW51bGw9PWU/bnVsbDplKyIiLHIpaWYoKG49cltpXSkuc3RhdGU+MSYmbi5uYW1lPT09ZSlyZXR1cm4gbmV3IGdmKFtbdF1dLE1tLGUsK2kpO3JldHVybiBudWxsfSxpbnRlcnJ1cHQ6VnAsdm9yb25vaTpmdW5jdGlvbiBCUigpe3ZhciB0PUlQLGU9UlAsbj1udWxsO2Z1bmN0aW9uIGkoaSl7cmV0dXJuIG5ldyBtTihpLm1hcCgoZnVuY3Rpb24obixyKXt2YXIgbz1bTWF0aC5yb3VuZCh0KG4scixpKS9oTikqaE4sTWF0aC5yb3VuZChlKG4scixpKS9oTikqaE5dO3JldHVybiBvLmluZGV4PXIsby5kYXRhPW4sb30pKSxuKX1yZXR1cm4gaS5wb2x5Z29ucz1mdW5jdGlvbih0KXtyZXR1cm4gaSh0KS5wb2x5Z29ucygpfSxpLmxpbmtzPWZ1bmN0aW9uKHQpe3JldHVybiBpKHQpLmxpbmtzKCl9LGkudHJpYW5nbGVzPWZ1bmN0aW9uKHQpe3JldHVybiBpKHQpLnRyaWFuZ2xlcygpfSxpLng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpOUCgrZSksaSk6dH0saS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6TlAoK3QpLGkpOmV9LGkuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPW51bGw9PXQ/bnVsbDpbWyt0WzBdWzBdLCt0WzBdWzFdXSxbK3RbMV1bMF0sK3RbMV1bMV1dXSxpKTpuJiZbW25bMF1bMF0sblswXVsxXV0sW25bMV1bMF0sblsxXVsxXV1dfSxpLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09dD9udWxsOltbMCwwXSxbK3RbMF0sK3RbMV1dXSxpKTpuJiZbblsxXVswXS1uWzBdWzBdLG5bMV1bMV0tblswXVsxXV19LGl9LHpvb206a04sem9vbVRyYW5zZm9ybTpiTix6b29tSWRlbnRpdHk6dk59KTtjb25zdCBIUj1bIiNmZjcwNDMiLCIjMDA3N2JiIiwiI2NjMzMxMSIsIiMzM2JiZWUiLCIjZWUzMzc3IiwiIzAwOTk4OCIsIiNiYmJiYmIiXTtjbGFzcyBGUiBleHRlbmRzIG1se2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9leHBlcmltZW50cz1bXX1sb2FkKCl7Y29uc3QgdD1fcigpLmV4cGVyaW1lbnRzKCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0KS50aGVuKCh0PT57U2UuZXhwb3J0cy5pc0VxdWFsKHRoaXMuX2V4cGVyaW1lbnRzLHQpfHwodGhpcy5fZXhwZXJpbWVudHM9dCx0aGlzLmVtaXRDaGFuZ2UoKSl9KSl9Z2V0RXhwZXJpbWVudHMoKXtyZXR1cm4gdGhpcy5fZXhwZXJpbWVudHMuc2xpY2UoKX19Y29uc3QgVlI9bmV3IEZSO2NsYXNzIFVSe2NvbnN0cnVjdG9yKHQ9SFIpe3RoaXMucGFsZXR0ZT10LHRoaXMuaWRlbnRpZmllcnM9d2coKX1zZXREb21haW4odCl7cmV0dXJuIHRoaXMuaWRlbnRpZmllcnM9d2coKSx0LmZvckVhY2goKCh0LGUpPT57dGhpcy5pZGVudGlmaWVycy5zZXQodCx0aGlzLnBhbGV0dGVbZSV0aGlzLnBhbGV0dGUubGVuZ3RoXSl9KSksdGhpc31nZXRDb2xvcih0KXtpZighdGhpcy5pZGVudGlmaWVycy5oYXModCkpdGhyb3cgbmV3IEVycm9yKGBTdHJpbmcgJHt0fSB3YXMgbm90IGluIHRoZSBkb21haW4uYCk7cmV0dXJuIHRoaXMuaWRlbnRpZmllcnMuZ2V0KHQpfX1mdW5jdGlvbiBqUih0LGUpe2NvbnN0IG49bmV3IFVSO2Z1bmN0aW9uIGkoKXtuLnNldERvbWFpbihlKCkpfXJldHVybiB0LmFkZExpc3RlbmVyKGkpLGkoKSx0PT5uLmdldENvbG9yKHQpfWNvbnN0IEdSPWpSKHZsLCgoKT0+dmwuZ2V0UnVucygpKSk7alIoVlIsKCgpPT5WUi5nZXRFeHBlcmltZW50cygpLm1hcCgoKHtuYW1lOnR9KT0+dCkpKSksZWwoe21vZHVsZU5hbWU6InJ1bi1jb2xvci1zdHlsZSIsc3R5bGVDb250ZW50OiJcbiAgICBbY29sb3ItY2xhc3M9J2xpZ2h0LWJsdWUnXSBwYXBlci1jaGVja2JveCB7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1saWdodC1ibHVlLTkwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtOTAwKTtcbiAgICB9XG4gICAgW2NvbG9yLWNsYXNzPSdyZWQnXSBwYXBlci1jaGVja2JveCB7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXJlZC01MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTUwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTkwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXJlZC05MDApO1xuICAgIH1cbiAgICBbY29sb3ItY2xhc3M9J2dyZWVuJ10gcGFwZXItY2hlY2tib3gge1xuICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1ncmVlbi01MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItZ3JlZW4tNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1ncmVlbi05MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1ncmVlbi05MDApO1xuICAgIH1cbiAgICBbY29sb3ItY2xhc3M9J3B1cnBsZSddIHBhcGVyLWNoZWNrYm94IHtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTUwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtOTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTkwMCk7XG4gICAgfVxuICAgIFtjb2xvci1jbGFzcz0ndGVhbCddIHBhcGVyLWNoZWNrYm94IHtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC01MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC01MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXRlYWwtOTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC05MDApO1xuICAgIH1cbiAgICBbY29sb3ItY2xhc3M9J3BpbmsnXSBwYXBlci1jaGVja2JveCB7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXBpbmstNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXBpbmstNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1waW5rLTkwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXBpbmstOTAwKTtcbiAgICB9XG4gICAgW2NvbG9yLWNsYXNzPSdvcmFuZ2UnXSBwYXBlci1jaGVja2JveCB7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS01MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTkwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS05MDApO1xuICAgIH1cbiAgICBbY29sb3ItY2xhc3M9J2Jyb3duJ10gcGFwZXItY2hlY2tib3gge1xuICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1icm93bi01MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItYnJvd24tNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1icm93bi05MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1icm93bi05MDApO1xuICAgIH1cbiAgICBbY29sb3ItY2xhc3M9J2luZGlnbyddIHBhcGVyLWNoZWNrYm94IHtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTUwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tOTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTkwMCk7XG4gICAgfVxuICAifSk7bGV0IFdSPWNsYXNzIGV4dGVuZHMoZXIoeWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5uYW1lcz1bXSx0aGlzLmNvbG9yaW5nPXtnZXRDb2xvcjooKT0+IiJ9LHRoaXMucmVnZXg9IiIsdGhpcy5zZWxlY3Rpb25TdGF0ZT17fSx0aGlzLm1heE5hbWVzVG9FbmFibGVCeURlZmF1bHQ9NDAsdGhpcy5fZGVib3VuY2VkUmVnZXhDaGFuZ2U9dGhpcy5fZGVib3VuY2VkUmVnZXhDaGFuZ2VJbXBsKCl9X2RlYm91bmNlZFJlZ2V4Q2hhbmdlSW1wbCgpe3ZhciB0PVNlLmV4cG9ydHMuZGVib3VuY2UoKHQ9Pnt0aGlzLnJlZ2V4PXR9KSwxNTAse2xlYWRpbmc6ITF9KTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLiQkKCIjbmFtZXMtcmVnZXgiKS52YWx1ZTsiIj09ZT90aGlzLmFzeW5jKCgoKT0+e3RoaXMucmVnZXg9ZX0pLDMwKTp0KGUpfX1nZXQgX3JlZ2V4KCl7dmFyIHQ9dGhpcy5yZWdleDt0cnl7cmV0dXJuIG5ldyBSZWdFeHAodCl9Y2F0Y2godCl7cmV0dXJuIG51bGx9fV9zZXRJc29sYXRvckljb24oKXt2YXIgdD10aGlzLnNlbGVjdGlvblN0YXRlLGU9U2UuZXhwb3J0cy5maWx0ZXIoU2UuZXhwb3J0cy52YWx1ZXModCkpLmxlbmd0aDtBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmlzb2xhdG9yIikpLmZvckVhY2goKGZ1bmN0aW9uKG4pe24uaWNvbj0xPT09ZSYmdFtuLm5hbWVdPyJyYWRpby1idXR0b24tY2hlY2tlZCI6InJhZGlvLWJ1dHRvbi11bmNoZWNrZWQifSkpfWNvbXB1dGVOYW1lc01hdGNoaW5nUmVnZXgodCxlKXtjb25zdCBuPXRoaXMuX3JlZ2V4O3JldHVybiBuP3RoaXMubmFtZXMuZmlsdGVyKCh0PT5uLnRlc3QodCkpKTp0aGlzLm5hbWVzfWNvbXB1dGVPdXRTZWxlY3RlZCh0LGUpe3ZhciBuPXRoaXMuc2VsZWN0aW9uU3RhdGUsaT10aGlzLm5hbWVzTWF0Y2hpbmdSZWdleC5sZW5ndGg8PXRoaXMubWF4TmFtZXNUb0VuYWJsZUJ5RGVmYXVsdDtyZXR1cm4gdGhpcy5uYW1lc01hdGNoaW5nUmVnZXguZmlsdGVyKCh0PT5udWxsPT1uW3RdP2k6blt0XSkpfXN5bmNocm9uaXplQ29sb3JzKHQpe3RoaXMuX3NldElzb2xhdG9ySWNvbigpLHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJwYXBlci1jaGVja2JveCIpLmZvckVhY2goKHQ9Pntjb25zdCBlPXRoaXMuY29sb3JpbmcuZ2V0Q29sb3IodC5uYW1lKTt0LnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvciI6ZSwiLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvciI6ZSwiLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3IiOmUsIi0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvciI6ZX0pfSkpLHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuaXNvbGF0b3IiKS5mb3JFYWNoKCh0PT57Y29uc3QgZT10aGlzLmNvbG9yaW5nLmdldENvbG9yKHQubmFtZSk7dC5zdHlsZS5jb2xvcj1lfSkpLHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT57dGhpcy51cGRhdGVTdHlsZXMoKX0pKX1faXNvbGF0ZU5hbWUodCl7dmFyIGU9dC50YXJnZXQubmFtZSxuPXt9O3RoaXMubmFtZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7blt0XT10PT1lfSkpLHRoaXMuc2VsZWN0aW9uU3RhdGU9bn1fY2hlY2tib3hDaGFuZ2UodCl7dmFyIGU9dC50YXJnZXQ7Y29uc3Qgbj1TZS5leHBvcnRzLmNsb25lKHRoaXMuc2VsZWN0aW9uU3RhdGUpO25bZS5uYW1lXT1lLmNoZWNrZWQsdGhpcy5zZWxlY3Rpb25TdGF0ZT1ufV9pc0NoZWNrZWQodCxlKXtyZXR1cm4tMSE9dGhpcy5vdXRTZWxlY3RlZC5pbmRleE9mKHQpfXRvZ2dsZUFsbCgpe2NvbnN0IHQ9dGhpcy5uYW1lc01hdGNoaW5nUmVnZXguc29tZSgodD0+dGhpcy5vdXRTZWxlY3RlZC5pbmNsdWRlcyh0KSkpLGU9e307dGhpcy5uYW1lcy5mb3JFYWNoKChuPT57ZVtuXT0hdH0pKSx0aGlzLnNlbGVjdGlvblN0YXRlPWV9fTtXUi50ZW1wbGF0ZT1fZWAKICAgIDxzdHlsZSBpbmNsdWRlPSJzY3JvbGxiYXItc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icnVuLWNvbG9yLXN0eWxlIj48L3N0eWxlPgoKICAgIDxwYXBlci1pbnB1dAogICAgICBpZD0ibmFtZXMtcmVnZXgiCiAgICAgIG5vLWxhYmVsLWZsb2F0PSIiCiAgICAgIGxhYmVsPSJXcml0ZSBhIHJlZ2V4IHRvIGZpbHRlciBydW5zIgogICAgICB2YWx1ZT0iW1tyZWdleF1dIgogICAgICBvbi1iaW5kLXZhbHVlLWNoYW5nZWQ9Il9kZWJvdW5jZWRSZWdleENoYW5nZSIKICAgID48L3BhcGVyLWlucHV0PgogICAgPGRpdiBpZD0ib3V0ZXItY29udGFpbmVyIiBjbGFzcz0ic2Nyb2xsYmFyIj4KICAgICAgPHRlbXBsYXRlCiAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgaXRlbXM9IltbbmFtZXNNYXRjaGluZ1JlZ2V4XV0iCiAgICAgICAgb24tZG9tLWNoYW5nZT0ic3luY2hyb25pemVDb2xvcnMiCiAgICAgID4KICAgICAgICA8ZGl2IGNsYXNzPSJuYW1lLXJvdyI+CiAgICAgICAgICA8ZGl2CiAgICAgICAgICAgIGNsYXNzPSJpY29uLWNvbnRhaW5lciBjaGVja2JveC1jb250YWluZXIgdmVydGljYWwtYWxpZ24tY29udGFpbmVyIgogICAgICAgICAgPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3gKICAgICAgICAgICAgICBjbGFzcz0iY2hlY2tib3ggdmVydGljYWwtYWxpZ24tY2VudGVyIgogICAgICAgICAgICAgIGlkJD0iY2hlY2tib3gtW1tpdGVtXV0iCiAgICAgICAgICAgICAgbmFtZT0iW1tpdGVtXV0iCiAgICAgICAgICAgICAgY2hlY2tlZCQ9IltbX2lzQ2hlY2tlZChpdGVtLCBzZWxlY3Rpb25TdGF0ZS4qKV1dIgogICAgICAgICAgICAgIG9uLWNoYW5nZT0iX2NoZWNrYm94Q2hhbmdlIgogICAgICAgICAgICA+PC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdgogICAgICAgICAgICBjbGFzcz0iaWNvbi1jb250YWluZXIgaXNvbGF0b3ItY29udGFpbmVyIHZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciIKICAgICAgICAgID4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgICAgICAgaWNvbj0icmFkaW8tYnV0dG9uLXVuY2hlY2tlZCIKICAgICAgICAgICAgICBjbGFzcz0iaXNvbGF0b3IgdmVydGljYWwtYWxpZ24tY2VudGVyIgogICAgICAgICAgICAgIG9uLXRhcD0iX2lzb2xhdGVOYW1lIgogICAgICAgICAgICAgIG5hbWU9IltbaXRlbV1dIgogICAgICAgICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaXRlbS1sYWJlbC1jb250YWluZXIiPgogICAgICAgICAgICA8c3Bhbj5bW2l0ZW1dXTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLWlucHV0IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgIH0KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAjb3V0ZXItY29udGFpbmVyIHsKICAgICAgICBjb250YWluOiBjb250ZW50OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgfQogICAgICAubmFtZS1yb3cgewogICAgICAgIGNvbnRhaW46IGNvbnRlbnQ7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogNXB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOyAvKiBtYWtlcyB3cmFwcGluZyBvZiBoeXBlcnBhcmFtIHN0cmluZ3MgYmV0dGVyICovCiAgICAgIH0KICAgICAgLmljb24tY29udGFpbmVyIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAycHg7CiAgICAgIH0KICAgICAgLmNoZWNrYm94IHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgIH0KICAgICAgLmlzb2xhdG9yIHsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgICAgcGFkZGluZzogMHB4OwogICAgICB9CiAgICAgIC5pc29sYXRvci1jb250YWluZXIgewogICAgICAgIHBhZGRpbmctbGVmdDogNnB4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgfQogICAgICAuY2hlY2tib3gtY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgfQogICAgICAuaXRlbS1sYWJlbC1jb250YWluZXIgewogICAgICAgIHBhZGRpbmctbGVmdDogNXB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICB3aWR0aDogMHB4OyAvKiBoYWNrIHRvIGdldCB0aGUgZmxleC1ncm93IHRvIHdvcmsgcHJvcGVybHkgKi8KICAgICAgfQogICAgICAudG9vbHRpcC12YWx1ZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIHBhZGRpbmctbGVmdDogMnB4OwogICAgICB9CiAgICAgIC52ZXJ0aWNhbC1hbGlnbi1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciAudmVydGljYWwtYWxpZ24tY2VudGVyIHsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciAudmVydGljYWwtYWxpZ24tdG9wIHsKICAgICAgICBhbGlnbi1zZWxmOiBzdGFydDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxXUi5wcm90b3R5cGUsIm5hbWVzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFdSLnByb3RvdHlwZSwiY29sb3JpbmciLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFdSLnByb3RvdHlwZSwicmVnZXgiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheSxjb21wdXRlZDoiY29tcHV0ZU5hbWVzTWF0Y2hpbmdSZWdleChuYW1lcy4qLCBfcmVnZXgpIn0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLFdSLnByb3RvdHlwZSwibmFtZXNNYXRjaGluZ1JlZ2V4Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxXUi5wcm90b3R5cGUsInNlbGVjdGlvblN0YXRlIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXksbm90aWZ5OiEwLGNvbXB1dGVkOiJjb21wdXRlT3V0U2VsZWN0ZWQobmFtZXNNYXRjaGluZ1JlZ2V4LiosIHNlbGVjdGlvblN0YXRlLiopIn0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLFdSLnByb3RvdHlwZSwib3V0U2VsZWN0ZWQiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sV1IucHJvdG90eXBlLCJtYXhOYW1lc1RvRW5hYmxlQnlEZWZhdWx0Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFdSLnByb3RvdHlwZSwiX2RlYm91bmNlZFJlZ2V4Q2hhbmdlIix2b2lkIDApLHQoW3MoInJlZ2V4IiksZSgiZGVzaWduOnR5cGUiLFJlZ0V4cCksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sV1IucHJvdG90eXBlLCJfcmVnZXgiLG51bGwpLHQoW2EoInNlbGVjdGlvblN0YXRlIiwibmFtZXMiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLFdSLnByb3RvdHlwZSwiX3NldElzb2xhdG9ySWNvbiIsbnVsbCksV1I9dChbaSgidGYtbXVsdGktY2hlY2tib3giKV0sV1IpO2xldCBxUj1jbGFzcyBleHRlbmRzIHlle2dldCBfcGFydHMoKXt2YXIgdD10aGlzLnZhbHVlLGU9dGhpcy5kZWxpbWl0ZXJQYXR0ZXJuO2NvbnN0IG49W107Zm9yKDs7KXtjb25zdCBpPW5ldyBSZWdFeHAoZSwiZyIpO2lmKGkudGVzdCh0KSwwPT09aS5sYXN0SW5kZXgpe24ucHVzaCh0KTticmVha31uLnB1c2godC5zbGljZSgwLGkubGFzdEluZGV4KSksdD10LnNsaWNlKGkubGFzdEluZGV4KX1yZXR1cm4gbn19O3FSLnRlbXBsYXRlPV9lYAogICAgPCEtLQogICAgICBUaGlzIHVnbHkgZm9ybWF0dGluZyBpcyByZXF1aXJlZCB0byBwcmV2ZW50IHNwYWNlcyBmcm9tIHNsaXBwaW5nCiAgICAgIGludG8gdGhlIEhUTUwuCiAgICAtLT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3BhcnRzXV0iIGFzPSJwYXJ0IgogICAgICA+W1twYXJ0XV08d2JyCiAgICAvPjwvdGVtcGxhdGU+CiAgYCx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxxUi5wcm90b3R5cGUsInZhbHVlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHFSLnByb3RvdHlwZSwiZGVsaW1pdGVyUGF0dGVybiIsdm9pZCAwKSx0KFtzKCJ2YWx1ZSIsImRlbGltaXRlclBhdHRlcm4iKSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLHFSLnByb3RvdHlwZSwiX3BhcnRzIixudWxsKSxxUj10KFtpKCJ0Zi13YnItc3RyaW5nIildLHFSKTtsZXQgWVI9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnJ1blNlbGVjdGlvblN0YXRlPSRzKCJydW5TZWxlY3Rpb25TdGF0ZSIse2RlZmF1bHRWYWx1ZTp7fX0pLmNhbGwodGhpcyksdGhpcy5yZWdleElucHV0PVJzKCJyZWdleElucHV0Iix7ZGVmYXVsdFZhbHVlOiIifSkuY2FsbCh0aGlzKSx0aGlzLl9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoPTI1MCx0aGlzLl9kYXRhTG9jYXRpb25EZWxpbWl0ZXJQYXR0ZXJuPSJbLz1fLC1dIix0aGlzLmNvbG9yaW5nPXtnZXRDb2xvcjpHUn0sdGhpcy5fc3RvcmVSdW5TZWxlY3Rpb25TdGF0ZT1LcygicnVuU2VsZWN0aW9uU3RhdGUiLHtkZWZhdWx0VmFsdWU6e319KSx0aGlzLl9yZWdleE9ic2VydmVyPU9zKCJyZWdleElucHV0Iix7ZGVmYXVsdFZhbHVlOiIifSl9YXR0YWNoZWQoKXt0aGlzLl9ydW5TdG9yZUxpc3RlbmVyPXZsLmFkZExpc3RlbmVyKCgoKT0+e3RoaXMuc2V0KCJydW5zIix2bC5nZXRSdW5zKCkpfSkpLHRoaXMuc2V0KCJydW5zIix2bC5nZXRSdW5zKCkpLHRoaXMuX2VudlN0b3JlTGlzdGVuZXI9X2wuYWRkTGlzdGVuZXIoKCgpPT57dGhpcy5zZXQoImRhdGFMb2NhdGlvbiIsX2wuZ2V0RGF0YUxvY2F0aW9uKCkpfSkpLHRoaXMuc2V0KCJkYXRhTG9jYXRpb24iLF9sLmdldERhdGFMb2NhdGlvbigpKX1kZXRhY2hlZCgpe3ZsLnJlbW92ZUxpc3RlbmVyQnlLZXkodGhpcy5fcnVuU3RvcmVMaXN0ZW5lciksX2wucmVtb3ZlTGlzdGVuZXJCeUtleSh0aGlzLl9lbnZTdG9yZUxpc3RlbmVyKX1fdG9nZ2xlQWxsKCl7dGhpcy4kLm11bHRpQ2hlY2tib3gudG9nZ2xlQWxsKCl9Z2V0IF9jbGlwcGVkRGF0YUxvY2F0aW9uKCl7dmFyIHQ9dGhpcy5kYXRhTG9jYXRpb24sZT10aGlzLl9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoO2lmKHZvaWQgMCE9PXQpcmV0dXJuIHQubGVuZ3RoPmU/dC5zdWJzdHJpbmcoMCxlKTp0fV9vcGVuRGF0YUxvY2F0aW9uRGlhbG9nKHQpe3QucHJldmVudERlZmF1bHQoKSx0aGlzLiQkKCIjZGF0YS1sb2NhdGlvbi1kaWFsb2ciKS5vcGVuKCl9X3Nob3VsZFNob3dFeHBhbmREYXRhTG9jYXRpb25CdXR0b24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg+ZX19O1lSLnRlbXBsYXRlPV9lYAogICAgPHBhcGVyLWRpYWxvZyB3aXRoLWJhY2tkcm9wPSIiIGlkPSJkYXRhLWxvY2F0aW9uLWRpYWxvZyI+CiAgICAgIDxoMj5EYXRhIExvY2F0aW9uPC9oMj4KICAgICAgPHRmLXdici1zdHJpbmcKICAgICAgICB2YWx1ZT0iW1tkYXRhTG9jYXRpb25dXSIKICAgICAgICBkZWxpbWl0ZXItcGF0dGVybj0iW1tfZGF0YUxvY2F0aW9uRGVsaW1pdGVyUGF0dGVybl1dIgogICAgICA+CiAgICAgIDwvdGYtd2JyLXN0cmluZwogICAgPjwvcGFwZXItZGlhbG9nPgogICAgPGRpdiBpZD0idG9wLXRleHQiPgogICAgICA8aDMgaWQ9InRvb2x0aXAtaGVscCIgY2xhc3M9InRvb2x0aXAtY29udGFpbmVyIj5SdW5zPC9oMz4KICAgIDwvZGl2PgogICAgPHRmLW11bHRpLWNoZWNrYm94CiAgICAgIGlkPSJtdWx0aUNoZWNrYm94IgogICAgICBuYW1lcz0iW1tydW5zXV0iCiAgICAgIHNlbGVjdGlvbi1zdGF0ZT0ie3tydW5TZWxlY3Rpb25TdGF0ZX19IgogICAgICBvdXQtc2VsZWN0ZWQ9Int7c2VsZWN0ZWRSdW5zfX0iCiAgICAgIHJlZ2V4PSJ7e3JlZ2V4SW5wdXR9fSIKICAgICAgY29sb3Jpbmc9IltbY29sb3JpbmddXSIKICAgID48L3RmLW11bHRpLWNoZWNrYm94PgogICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIGlkPSJ0b2dnbGUtYWxsIiBvbi10YXA9Il90b2dnbGVBbGwiPgogICAgICBUb2dnbGUgQWxsIFJ1bnMKICAgIDwvcGFwZXItYnV0dG9uPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2RhdGFMb2NhdGlvbl1dIj4KICAgICAgPGRpdiBpZD0iZGF0YS1sb2NhdGlvbiI+CiAgICAgICAgPHRmLXdici1zdHJpbmcKICAgICAgICAgIHZhbHVlPSJbW19jbGlwcGVkRGF0YUxvY2F0aW9uXV0iCiAgICAgICAgICBkZWxpbWl0ZXItcGF0dGVybj0iW1tfZGF0YUxvY2F0aW9uRGVsaW1pdGVyUGF0dGVybl1dIgogICAgICAgID48L3RmLXdici1zdHJpbmcKICAgICAgICA+PCEtLQogICAgICAgICAgV2UgdXNlIEhUTUwgY29tbWVudHMgdG8gcmVtb3ZlIHNwYWNlcyBiZWZvcmUgdGhlIGVsbGlwc2lzLgogICAgICAgIC0tPjx0ZW1wbGF0ZQogICAgICAgICAgaXM9ImRvbS1pZiIKICAgICAgICAgIGlmPSJbW19zaG91bGRTaG93RXhwYW5kRGF0YUxvY2F0aW9uQnV0dG9uKGRhdGFMb2NhdGlvbiwgX2RhdGFMb2NhdGlvbkNsaXBMZW5ndGgpXV0iCiAgICAgICAgICA+PCEtLQogICAgICAgICAgLS0+PGEgaHJlZj0iIiBvbi1jbGljaz0iX29wZW5EYXRhTG9jYXRpb25EaWFsb2ciPuKApjwvYT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTBweDsKICAgICAgfQogICAgICAjdG9wLXRleHQgewogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1zZWNvbmRhcnktdGV4dC1jb2xvcik7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDE2cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfQogICAgICB0Zi13YnItc3RyaW5nIHsKICAgICAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIHRmLW11bHRpLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIC54LWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgfQogICAgICAjdG9vbHRpcC1oZWxwIHsKICAgICAgICBjb2xvcjogdmFyKC0tdGItc2Vjb25kYXJ5LXRleHQtY29sb3IpOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KICAgICAgcGFwZXItYnV0dG9uIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAjZGF0YS1sb2NhdGlvbiB7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbWFyZ2luOiA1cHggMCAwIDA7CiAgICAgICAgbWF4LXdpZHRoOiAyODhweDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfc3RvcmVSdW5TZWxlY3Rpb25TdGF0ZSJ9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sWVIucHJvdG90eXBlLCJydW5TZWxlY3Rpb25TdGF0ZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX3JlZ2V4T2JzZXJ2ZXIifSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFlSLnByb3RvdHlwZSwicmVnZXhJbnB1dCIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLFlSLnByb3RvdHlwZSwic2VsZWN0ZWRSdW5zIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxZUi5wcm90b3R5cGUsInJ1bnMiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFlSLnByb3RvdHlwZSwiZGF0YUxvY2F0aW9uIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLFlSLnByb3RvdHlwZSwiX2RhdGFMb2NhdGlvbkNsaXBMZW5ndGgiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sWVIucHJvdG90eXBlLCJfZGF0YUxvY2F0aW9uRGVsaW1pdGVyUGF0dGVybiIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxZUi5wcm90b3R5cGUsImNvbG9yaW5nIix2b2lkIDApLHQoW3MoImRhdGFMb2NhdGlvbiIsIl9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sWVIucHJvdG90eXBlLCJfY2xpcHBlZERhdGFMb2NhdGlvbiIsbnVsbCksWVI9dChbaSgidGYtcnVucy1zZWxlY3RvciIpXSxZUik7Y2xhc3MgWFJ7Y29uc3RydWN0b3IoKXt0aGlzLmNhbmNlbGxhdGlvbkNvdW50PTB9Y2FuY2VsbGFibGUodCl7Y29uc3QgZT10aGlzLmNhbmNlbGxhdGlvbkNvdW50O3JldHVybiBuPT50KHt2YWx1ZTpuLGNhbmNlbGxlZDp0aGlzLmNhbmNlbGxhdGlvbkNvdW50IT09ZX0pfWNhbmNlbEFsbCgpe3RoaXMuY2FuY2VsbGF0aW9uQ291bnQrK319bGV0ICRSPWNsYXNzIGV4dGVuZHMoZXIoeWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5odG1sPSIifWdldCBzYW5pdGl6ZWRIdG1sKCl7cmV0dXJuIHRoaXMuaHRtbH1hdHRhY2hlZCgpe3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT57dGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLm1hcmtkb3duLCEwKX0pKX19O2Z1bmN0aW9uIEtSKHQpe3JldHVybiB0P3QudG9TdHJpbmcoKS5yZXBsYWNlKC9HTVQtXGQrIFwoKFteKV0rKVwpLywiJDEiKToiIn0kUi50ZW1wbGF0ZT1fZWAKICAgIDxkaXYgaWQ9Im1hcmtkb3duIiBpbm5lci1oLXQtbS1sPSJbW3Nhbml0aXplZEh0bWxdXSI+PC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIC8qCiAgICAgICAqIFJlZHVjZSB0b3Btb3N0IGFuZCBib3R0b21tb3N0IG1hcmdpbnMgZnJvbSAxNnB4IHRvIDAuM2VtIChyZW5kZXJzCiAgICAgICAqIGF0IGFib3V0IDQuOHB4KSB0byBrZWVwIHRoZSBsYXlvdXQgY29tcGFjdC4gVGhpcyBpbXByb3ZlcyB0aGUKICAgICAgICogYXBwZWFyYW5jZSB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIGxpbmUgb2YgdGV4dDsgc3RhbmRhcmQgTWFya2Rvd24KICAgICAgICogcmVuZGVyZXJzIHdpbGwgc3RpbGwgaW5jbHVkZSBhIFxgPHA+XGAgZWxlbWVudC4KICAgICAgICoKICAgICAgICogQnkgdGFyZ2V0aW5nIG9ubHkgdGhlIHRvcC1sZXZlbCwgZXh0cmVtYWwgZWxlbWVudHMsIHdlIHByZXNlcnZlIGFueQogICAgICAgKiBhY3R1YWwgcGFyYWdyYXBoIGJyZWFrcyBhbmQgb25seSBjaGFuZ2UgdGhlIHBhZGRpbmcgYWdhaW5zdCB0aGUKICAgICAgICogY29tcG9uZW50IGVkZ2VzLgogICAgICAgKi8KICAgICAgI21hcmtkb3duID4gcDpmaXJzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLXRvcDogMC4zZW07CiAgICAgIH0KICAgICAgI21hcmtkb3duID4gcDpsYXN0LWNoaWxkIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjNlbTsKICAgICAgfQoKICAgICAgLyogUGxlYXNhbnQgc3R5bGVzIGZvciBNYXJrZG93biB0YWJsZXMuICovCiAgICAgICNtYXJrZG93biB0YWJsZSB7CiAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgICAgfQogICAgICAjbWFya2Rvd24gdGFibGUgdGggewogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgIH0KICAgICAgI21hcmtkb3duIHRhYmxlIHRoLAogICAgICAjbWFya2Rvd24gdGFibGUgdGQgewogICAgICAgIHBhZGRpbmc6IDZweCAxM3B4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXRiLXVpLWJvcmRlciwgI2RmZTJlNSk7CiAgICAgIH0KICAgICAgI21hcmtkb3duIHRhYmxlIHRyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS10Yi11aS1ib3JkZXIsICNjNmNiZDEpOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sJFIucHJvdG90eXBlLCJodG1sIix2b2lkIDApLHQoW3MoImh0bWwiKSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSwkUi5wcm90b3R5cGUsInNhbml0aXplZEh0bWwiLG51bGwpLCRSPXQoW2koInRmLW1hcmtkb3duLXZpZXciKV0sJFIpLGVsKHttb2R1bGVOYW1lOiJ0Zi1jYXJkLWhlYWRpbmctc3R5bGUiLHN0eWxlQ29udGVudDoiXG4gICAgZmlnY2FwdGlvbiB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAvKiogSG9yaXpvbnRhbCBsaW5lIG9mIGxhYmVscy4gKi9cbiAgICAuaGVhZGluZy1yb3cge1xuICAgICAgbWFyZ2luLXRvcDogLTRweDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgIH1cblxuICAgIC8qKiBQaWVjZSBvZiB0ZXh0IGluIHRoZSBmaWd1cmUgY2FwdGlvbi4gKi9cbiAgICAuaGVhZGluZy1sYWJlbCB7XG4gICAgICBmbGV4LWdyb3c6IDE7XG4gICAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XG4gICAgfVxuXG4gICAgLyoqIE1ha2VzIGxhYmVsIHNob3cgb24gdGhlIHJpZ2h0LiAqL1xuICAgIC5oZWFkaW5nLXJpZ2h0IHtcbiAgICAgIGZsZXgtZ3JvdzogMDtcbiAgICB9XG4gICJ9KTtsZXQgWlI9Y2xhc3MgZXh0ZW5kcyB5ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5kaXNwbGF5TmFtZT1udWxsLHRoaXMudGFnPW51bGwsdGhpcy5ydW49bnVsbCx0aGlzLmRlc2NyaXB0aW9uPW51bGwsdGhpcy5jb2xvcj1udWxsfV91cGRhdGVIZWFkaW5nU3R5bGUoKXt0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tdGYtY2FyZC1oZWFkaW5nLWJhY2tncm91bmQtY29sb3IiOnRoaXMuX3J1bkJhY2tncm91bmQsIi0tdGYtY2FyZC1oZWFkaW5nLWNvbG9yIjp0aGlzLl9ydW5Db2xvcn0pfV9jb21wdXRlUnVuQmFja2dyb3VuZCh0KXtyZXR1cm4gdHx8Im5vbmUifV9jb21wdXRlUnVuQ29sb3IodCl7cmV0dXJuKGZ1bmN0aW9uIGUodCl7Y29uc3QgZT0oZnVuY3Rpb24gbih0KXtpZighdClyZXR1cm4gbnVsbDtsZXQgZT10Lm1hdGNoKC9eIyhbMC05YS1mXXsxLDJ9KShbMC05YS1mXXsxLDJ9KShbMC05YS1mXXsxLDJ9KSQvKTtpZighZSlyZXR1cm4gbnVsbDtpZig0PT10Lmxlbmd0aClmb3IodmFyIG49MTtuPD0zO24rKyllW25dPWVbbl0rZVtuXTtyZXR1cm5bcGFyc2VJbnQoZVsxXSwxNikscGFyc2VJbnQoZVsyXSwxNikscGFyc2VJbnQoZVszXSwxNildfSkodCk7cmV0dXJuIGU/TWF0aC5yb3VuZCgoMjk5KmVbMF0rNTg3KmVbMV0rMTE0KmVbMl0pLzFlMyk+MTI1PyJpbmhlcml0IjoiI2VlZSI6ImluaGVyaXQifSkodCl9Z2V0IF9uYW1lTGFiZWwoKXtyZXR1cm4gdGhpcy5kaXNwbGF5TmFtZXx8dGhpcy50YWd8fCIifWdldCBfdGFnTGFiZWwoKXt2YXIgdD10aGlzLnRhZztyZXR1cm4gdCYmdCE9PXRoaXMuZGlzcGxheU5hbWU/dDoiIn1fdG9nZ2xlRGVzY3JpcHRpb25EaWFsb2codCl7Y29uc3QgZT10aGlzLiQuZGVzY3JpcHRpb25EaWFsb2c7ZS5wb3NpdGlvblRhcmdldD10LnRhcmdldCxlLnRvZ2dsZSgpfX07WlIudGVtcGxhdGU9X2VgCiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICA8ZmlnY2FwdGlvbiBjbGFzcz0iY29udGVudCI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19uYW1lTGFiZWxdXSI+CiAgICAgICAgICAgIDxkaXYgaXRlbXByb3A9Im5hbWUiIGNsYXNzPSJoZWFkaW5nLWxhYmVsIG5hbWUiPltbX25hbWVMYWJlbF1dPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3J1bl1dIj4KICAgICAgICAgICAgPCEtLSBFeHRyYSB3cmFwcGluZyBzcGFuIG5lZWRlZCB0byBhdm9pZCBmbGV4Ym94IGJsb2NraWZpY2F0aW9uLiAtLT4KICAgICAgICAgICAgPCEtLSAoc2VlIGZsZXhib3ggc3BlYywgc2VjdGlvbiA0ICJGbGV4IEl0ZW1zIikgLS0+CiAgICAgICAgICAgIDxzcGFuPgogICAgICAgICAgICAgIDxzcGFuCiAgICAgICAgICAgICAgICBpdGVtcHJvcD0icnVuIgogICAgICAgICAgICAgICAgaWQ9ImhlYWRpbmctcnVuIgogICAgICAgICAgICAgICAgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCBydW4iCiAgICAgICAgICAgICAgICA+W1tydW5dXTwvc3BhbgogICAgICAgICAgICAgID4KICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3RhZ0xhYmVsXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgICB0YWc6IDxzcGFuIGl0ZW1wcm9wPSJ0YWciPltbX3RhZ0xhYmVsXV08L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8c2xvdD48L3Nsb3Q+CiAgICAgIDwvZmlnY2FwdGlvbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2Rlc2NyaXB0aW9uXV0iPgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgICAgaWNvbj0iaW5mbyIKICAgICAgICAgIG9uLXRhcD0iX3RvZ2dsZURlc2NyaXB0aW9uRGlhbG9nIgogICAgICAgICAgdGl0bGU9IlNob3cgc3VtbWFyeSBkZXNjcmlwdGlvbiIKICAgICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHBhcGVyLWRpYWxvZwogICAgICAgIGlkPSJkZXNjcmlwdGlvbkRpYWxvZyIKICAgICAgICBuby1vdmVybGFwPSIiCiAgICAgICAgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIKICAgICAgICB2ZXJ0aWNhbC1hbGlnbj0iYXV0byIKICAgICAgPgogICAgICAgIDxwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZT4KICAgICAgICAgIDx0Zi1tYXJrZG93bi12aWV3IGh0bWw9IltbZGVzY3JpcHRpb25dXSI+PC90Zi1tYXJrZG93bi12aWV3PgogICAgICAgIDwvcGFwZXItZGlhbG9nLXNjcm9sbGFibGU+CiAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgPC9kaXY+CiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAuY29udGVudCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAubmFtZSB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CiAgICAgIC5ydW4gewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgcGFkZGluZzogMXB4IDRweCAycHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICBwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZSB7CiAgICAgICAgbWF4LXdpZHRoOiA2NDBweDsKICAgICAgfQogICAgICAjaGVhZGluZy1ydW4gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRmLWNhcmQtaGVhZGluZy1iYWNrZ3JvdW5kLWNvbG9yKTsKICAgICAgICBjb2xvcjogdmFyKC0tdGYtY2FyZC1oZWFkaW5nLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFpSLnByb3RvdHlwZSwiZGlzcGxheU5hbWUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sWlIucHJvdG90eXBlLCJ0YWciLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sWlIucHJvdG90eXBlLCJydW4iLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sWlIucHJvdG90eXBlLCJkZXNjcmlwdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxaUi5wcm90b3R5cGUsImNvbG9yIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkJhY2tncm91bmQoY29sb3IpIixyZWFkT25seTohMCxvYnNlcnZlcjoiX3VwZGF0ZUhlYWRpbmdTdHlsZSJ9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sWlIucHJvdG90eXBlLCJfcnVuQmFja2dyb3VuZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihjb2xvcikiLHJlYWRPbmx5OiEwLG9ic2VydmVyOiJfdXBkYXRlSGVhZGluZ1N0eWxlIn0pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxaUi5wcm90b3R5cGUsIl9ydW5Db2xvciIsdm9pZCAwKSx0KFtzKCJkaXNwbGF5TmFtZSIsInRhZyIpLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLFpSLnByb3RvdHlwZSwiX25hbWVMYWJlbCIsbnVsbCksdChbcygiZGlzcGxheU5hbWUiLCJ0YWciKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxaUi5wcm90b3R5cGUsIl90YWdMYWJlbCIsbnVsbCksWlI9dChbaSgidGYtY2FyZC1oZWFkaW5nIildLFpSKTtsZXQgSlI9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9tZXRhZGF0YUNhbmNlbGxlcj1uZXcgWFIsdGhpcy5fc3RlcHM9W10sdGhpcy5fYXR0YWNoZWQ9ITF9Z2V0IF9ydW5Db2xvcigpe3JldHVybiBHUih0aGlzLnJ1bil9Z2V0IF9oYXNBdExlYXN0T25lU3RlcCgpe3ZhciB0PXRoaXMuX3N0ZXBzO3JldHVybiEhdCYmdC5sZW5ndGg+MH1nZXQgX2hhc011bHRpcGxlU3RlcHMoKXt2YXIgdD10aGlzLl9zdGVwcztyZXR1cm4hIXQmJnQubGVuZ3RoPjF9Z2V0IF9tYXhTdGVwSW5kZXgoKXtyZXR1cm4gdGhpcy5fc3RlcHMubGVuZ3RoLTF9Z2V0IF9jdXJyZW50RGF0dW0oKXtyZXR1cm4gdGhpcy5fc3RlcHNbdGhpcy5fc3RlcEluZGV4XX1nZXQgX3NhbXBsZVRleHQoKXtyZXR1cm5gJHt0aGlzLnNhbXBsZSsxfWB9Z2V0IF9oYXNNdWx0aXBsZVNhbXBsZXMoKXtyZXR1cm4gdGhpcy50b3RhbFNhbXBsZXM+MX1hdHRhY2hlZCgpe3RoaXMuX2F0dGFjaGVkPSEwLHRoaXMucmVsb2FkKCl9X3JlbG9hZE9uUnVuVGFnQ2hhbmdlKCl7dGhpcy5yZWxvYWQoKX1yZWxvYWQoKXtpZighdGhpcy5fYXR0YWNoZWQpcmV0dXJuO3RoaXMuX21ldGFkYXRhQ2FuY2VsbGVyLmNhbmNlbEFsbCgpO2NvbnN0IHQ9X3IoKS5wbHVnaW5Sb3V0ZSgiYXVkaW8iLCIvYXVkaW8iLG5ldyBVUkxTZWFyY2hQYXJhbXMoe3RhZzp0aGlzLnRhZyxydW46dGhpcy5ydW4sc2FtcGxlOlN0cmluZyh0aGlzLnNhbXBsZSl9KSksZT10aGlzLl9tZXRhZGF0YUNhbmNlbGxlci5jYW5jZWxsYWJsZSgodD0+e2lmKHQuY2FuY2VsbGVkKXJldHVybjtjb25zdCBlPXQudmFsdWUubWFwKHRoaXMuX2NyZWF0ZVN0ZXBEYXR1bS5iaW5kKHRoaXMpKTt0aGlzLnNldCgiX3N0ZXBzIixlKSx0aGlzLnNldCgiX3N0ZXBJbmRleCIsZS5sZW5ndGgtMSl9KSk7dGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHQpLnRoZW4oZSl9X2NyZWF0ZVN0ZXBEYXR1bSh0KXtjb25zdCBlPW5ldyBVUkxTZWFyY2hQYXJhbXModC5xdWVyeSk7ZS5hcHBlbmQoInRzIixTdHJpbmcodC53YWxsX3RpbWUpKTtjb25zdCBuPV9yKCkucGx1Z2luUm91dGUoImF1ZGlvIiwiL2luZGl2aWR1YWxBdWRpbyIsZSk7cmV0dXJue3dhbGxfdGltZTpLUihuZXcgRGF0ZSgxZTMqdC53YWxsX3RpbWUpKSxzdGVwOnQuc3RlcCxsYWJlbDp0LmxhYmVsLGNvbnRlbnRUeXBlOnQuY29udGVudFR5cGUsdXJsOm59fX07SlIudGVtcGxhdGU9X2VgCiAgICA8dGYtY2FyZC1oZWFkaW5nCiAgICAgIHRhZz0iW1t0YWddXSIKICAgICAgcnVuPSJbW3J1bl1dIgogICAgICBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIKICAgICAgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSIKICAgICAgY29sb3I9IltbX3J1bkNvbG9yXV0iCiAgICA+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVTYW1wbGVzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwiPgogICAgICAgICAgICBzYW1wbGU6IFtbX3NhbXBsZVRleHRdXSBvZiBbW3RvdGFsU2FtcGxlc11dCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNBdExlYXN0T25lU3RlcF1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgc3RlcCA8c3Ryb25nPltbX2N1cnJlbnREYXR1bS5zdGVwXV08L3N0cm9uZz4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19jdXJyZW50RGF0dW0ud2FsbF90aW1lXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIGhlYWRpbmctcmlnaHQiPgogICAgICAgICAgICAgIFtbX2N1cnJlbnREYXR1bS53YWxsX3RpbWVdXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVTdGVwc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICA8cGFwZXItc2xpZGVyCiAgICAgICAgICAgIGlkPSJzdGVwcyIKICAgICAgICAgICAgaW1tZWRpYXRlLXZhbHVlPSJ7e19zdGVwSW5kZXh9fSIKICAgICAgICAgICAgbWF4PSJbW19tYXhTdGVwSW5kZXhdXSIKICAgICAgICAgICAgbWF4LW1hcmtlcnM9IltbX21heFN0ZXBJbmRleF1dIgogICAgICAgICAgICBzbmFwcz0iIgogICAgICAgICAgICBzdGVwPSIxIgogICAgICAgICAgICB2YWx1ZT0ie3tfc3RlcEluZGV4fX0iCiAgICAgICAgICA+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXBdXSI+CiAgICAgIDxhdWRpbwogICAgICAgIGNvbnRyb2xzPSIiCiAgICAgICAgc3JjJD0iW1tfY3VycmVudERhdHVtLnVybF1dIgogICAgICAgIHR5cGUkPSJbW19jdXJyZW50RGF0dW0uY29udGVudFR5cGVdXSIKICAgICAgPjwvYXVkaW8+CiAgICAgIDx0Zi1tYXJrZG93bi12aWV3IGh0bWw9IltbX2N1cnJlbnREYXR1bS5sYWJlbF1dIj48L3RmLW1hcmtkb3duLXZpZXc+CiAgICA8L3RlbXBsYXRlPgogICAgPGRpdiBpZD0ibWFpbi1hdWRpby1jb250YWluZXIiPjwvZGl2PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1jYXJkLWhlYWRpbmctc3R5bGUiPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yOiAjNDI0MjQyOwogICAgICAgIG1hcmdpbi1yaWdodDogMTVweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CgogICAgICAjc3RlcHMgewogICAgICAgIGhlaWdodDogMTVweDsKICAgICAgICBtYXJnaW46IDAgMCAwIC0xNXB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgcGFkZGluZzogMCA1cHg7IC8qIHNvIHRoZSBzbGlkZXIga25vYiBkb2Vzbid0IGJ1dHQgb3V0ICovCiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogdmFyKC0tc3RlcC1zbGlkZXIta25vYi1jb2xvcik7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogdmFyKC0tc3RlcC1zbGlkZXIta25vYi1jb2xvcik7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tc3RlcC1zbGlkZXIta25vYi1jb2xvcik7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLEpSLnByb3RvdHlwZSwicnVuIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLEpSLnByb3RvdHlwZSwidGFnIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLEpSLnByb3RvdHlwZSwic2FtcGxlIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLEpSLnByb3RvdHlwZSwidG90YWxTYW1wbGVzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEpSLnByb3RvdHlwZSwidGFnTWV0YWRhdGEiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsZHIpXSxKUi5wcm90b3R5cGUsInJlcXVlc3RNYW5hZ2VyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLFhSKV0sSlIucHJvdG90eXBlLCJfbWV0YWRhdGFDYW5jZWxsZXIiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLEpSLnByb3RvdHlwZSwiX3N0ZXBzIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLEpSLnByb3RvdHlwZSwiX3N0ZXBJbmRleCIsdm9pZCAwKSx0KFtzKCJydW4iKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxKUi5wcm90b3R5cGUsIl9ydW5Db2xvciIsbnVsbCksdChbcygiX3N0ZXBzIiksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLEpSLnByb3RvdHlwZSwiX2hhc0F0TGVhc3RPbmVTdGVwIixudWxsKSx0KFtzKCJfc3RlcHMiKSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sSlIucHJvdG90eXBlLCJfaGFzTXVsdGlwbGVTdGVwcyIsbnVsbCksdChbcygiX3N0ZXBzIiksZSgiZGVzaWduOnR5cGUiLE51bWJlciksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sSlIucHJvdG90eXBlLCJfbWF4U3RlcEluZGV4IixudWxsKSx0KFtzKCJfc3RlcHMiLCJfc3RlcEluZGV4IiksZSgiZGVzaWduOnR5cGUiLE9iamVjdCksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sSlIucHJvdG90eXBlLCJfY3VycmVudERhdHVtIixudWxsKSx0KFtzKCJzYW1wbGUiKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxKUi5wcm90b3R5cGUsIl9zYW1wbGVUZXh0IixudWxsKSx0KFtzKCJ0b3RhbFNhbXBsZXMiKSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sSlIucHJvdG90eXBlLCJfaGFzTXVsdGlwbGVTYW1wbGVzIixudWxsKSx0KFthKCJydW4iLCJ0YWciKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLEpSLnByb3RvdHlwZSwiX3JlbG9hZE9uUnVuVGFnQ2hhbmdlIixudWxsKSxKUj10KFtpKCJ0Zi1hdWRpby1sb2FkZXIiKV0sSlIpO2xldCBRUj1jbGFzcyBleHRlbmRzKGVyKHllKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMucmVsb2FkT25SZWFkeT0hMCx0aGlzLl90YWdGaWx0ZXI9IiIsdGhpcy5fcmVxdWVzdE1hbmFnZXI9bmV3IGRyfXJlYWR5KCl7c3VwZXIucmVhZHkoKSx0aGlzLnJlbG9hZE9uUmVhZHkmJnRoaXMucmVsb2FkKCl9cmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKCk9Pnt0aGlzLl9yZWxvYWRBdWRpbygpfSkpfV9mZXRjaFRhZ3MoKXtjb25zdCB0PV9yKCkucGx1Z2luUm91dGUoImF1ZGlvIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0KS50aGVuKCh0PT57aWYoU2UuZXhwb3J0cy5pc0VxdWFsKHQsdGhpcy5fcnVuVG9UYWdJbmZvKSlyZXR1cm47Y29uc3QgZT1hcihTZS5leHBvcnRzLm1hcFZhbHVlcyh0LCh0PT5PYmplY3Qua2V5cyh0KSkpKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWUubGVuZ3RoKSx0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsdCl9KSl9X3JlbG9hZEF1ZGlvKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWF1ZGlvLWxvYWRlciIpLmZvckVhY2goKHQ9Pnt0LnJlbG9hZCgpfSkpfV9zaG91bGRPcGVuKHQpe3JldHVybiB0PD0yfWdldCBfY2F0ZWdvcmllcygpe3ZhciB0PXRoaXMuX3J1blRvVGFnSW5mbyxlPXRoaXMuX3NlbGVjdGVkUnVucyxuPXRoaXMuX3RhZ0ZpbHRlcjtmdW5jdGlvbiBpKGUpe2NvbnN0IG49dFtlLnJ1bl1bZS50YWddLnNhbXBsZXM7cmV0dXJuIFNlLmV4cG9ydHMucmFuZ2UobikubWFwKCh0PT5PYmplY3QuYXNzaWduKHt9LGUse3NhbXBsZTp0LHRvdGFsU2FtcGxlczpufSkpKX1yZXR1cm4gTXIoU2UuZXhwb3J0cy5tYXBWYWx1ZXModCwodD0+T2JqZWN0LmtleXModCkpKSxlLG4pLm1hcCgodD0+T2JqZWN0LmFzc2lnbih7fSx0LHtpdGVtczpbXS5jb25jYXQuYXBwbHkoW10sdC5pdGVtcy5tYXAoaSkpfSkpKX1fdGFnTWV0YWRhdGEodCxlLG4pe3JldHVybiB0W2VdW25dfX07UVIudGVtcGxhdGU9X2VgCiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3IKICAgICAgICAgICAgaWQ9InJ1bnMtc2VsZWN0b3IiCiAgICAgICAgICAgIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319IgogICAgICAgICAgPjwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBhdWRpbyBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6PC9wPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgYXVkaW8gZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiCiAgICAgICAgICAgICAgICA+UkVBRE1FPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIgogICAgICAgICAgICAgICAgPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hCiAgICAgICAgICAgICAgPi4KICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyIKICAgICAgICAgICAgICAgID50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcKICAgICAgICAgICAgICBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIgogICAgICAgICAgICAgIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLWF1ZGlvLWxvYWRlcgogICAgICAgICAgICAgICAgICBhY3RpdmU9IltbYWN0aXZlXV0iCiAgICAgICAgICAgICAgICAgIHJ1bj0iW1tpdGVtLnJ1bl1dIgogICAgICAgICAgICAgICAgICB0YWc9IltbaXRlbS50YWddXSIKICAgICAgICAgICAgICAgICAgc2FtcGxlPSJbW2l0ZW0uc2FtcGxlXV0iCiAgICAgICAgICAgICAgICAgIHRvdGFsLXNhbXBsZXM9IltbaXRlbS50b3RhbFNhbXBsZXNdXSIKICAgICAgICAgICAgICAgICAgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iCiAgICAgICAgICAgICAgICAgIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgICAgICAgICAgID48L3RmLWF1ZGlvLWxvYWRlcj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxRUi5wcm90b3R5cGUsInJlbG9hZE9uUmVhZHkiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLFFSLnByb3RvdHlwZSwiX3NlbGVjdGVkUnVucyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxRUi5wcm90b3R5cGUsIl9ydW5Ub1RhZ0luZm8iLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxRUi5wcm90b3R5cGUsIl9kYXRhTm90Rm91bmQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sUVIucHJvdG90eXBlLCJfdGFnRmlsdGVyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLGRyKV0sUVIucHJvdG90eXBlLCJfcmVxdWVzdE1hbmFnZXIiLHZvaWQgMCksdChbcygiX3J1blRvVGFnSW5mbyIsIl9zZWxlY3RlZFJ1bnMiLCJfdGFnRmlsdGVyIiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxRUi5wcm90b3R5cGUsIl9jYXRlZ29yaWVzIixudWxsKSxRUj10KFtpKCJ0Zi1hdWRpby1kYXNoYm9hcmQiKV0sUVIpO2xldCB0Tz1jbGFzcyBleHRlbmRzKGVyKHllKSl7YXR0YWNoZWQoKXt0aGlzLmFzeW5jKChmdW5jdGlvbigpe3RoaXMuZ2V0RWZmZWN0aXZlQ2hpbGRyZW4oKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3RoaXMubGlzdGVuKHQsInRhcCIsIl9zZWxlY3RUYXJnZXQiKX0uYmluZCh0aGlzKSl9KSl9X3NlbGVjdFRhcmdldCh0KXt0aGlzLnNlbGVjdGVkSWQ9dC5jdXJyZW50VGFyZ2V0LmlkfV9zZWxlY3RlZElkQ2hhbmdlZCgpe3ZhciB0PXRoaXMucXVlcnlFZmZlY3RpdmVDaGlsZHJlbigiIyIrdGhpcy5zZWxlY3RlZElkKTt0JiYodGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LnJlbW92ZSgic2VsZWN0ZWQiKX0pKSx0LmNsYXNzTGlzdC5hZGQoInNlbGVjdGVkIikpfX07ZnVuY3Rpb24gZU8odCxlKXtsZXQgbjtjb25zdCBpPXt9O3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChlPT57Y29uc3Qgcj10W2VdO3ZvaWQgMD09PW4mJihuPXIuZGlzcGxheU5hbWUpLG4hPT1yLmRpc3BsYXlOYW1lJiYobj1udWxsKSx2b2lkIDA9PT1pW3IuZGVzY3JpcHRpb25dJiYoaVtyLmRlc2NyaXB0aW9uXT1bXSksaVtyLmRlc2NyaXB0aW9uXS5wdXNoKGUpfSkpLHtkaXNwbGF5TmFtZTpudWxsIT1uP246ZSxkZXNjcmlwdGlvbjooKCk9Pntjb25zdCB0PU9iamVjdC5rZXlzKGkpO3JldHVybiAwPT09dC5sZW5ndGg/IiI6MT09PXQubGVuZ3RoP3RbMF06YDxwPjxzdHJvbmc+TXVsdGlwbGUgZGVzY3JpcHRpb25zOjwvc3Ryb25nPjwvcD48dWw+JHt0Lm1hcCgodD0+e2NvbnN0IGU9aVt0XS5tYXAoKHQ9PmA8Y29kZT4ke3QucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvJi9nLCImYW1wOyIpfTwvY29kZT5gKSksbj1lLmxlbmd0aD4yP2Uuc2xpY2UoMCxlLmxlbmd0aC0xKS5qb2luKCIsICIpKyIsIGFuZCAiK2VbZS5sZW5ndGgtMV06ZS5qb2luKCIgYW5kICIpO3JldHVybmA8bGk+PHA+Rm9yICR7KGZ1bmN0aW9uIHIodCxlLG4pe3JldHVybiAxPT09dD9lOm59KShlLmxlbmd0aCwicnVuIiwicnVucyIpfSAke259OjwvcD4ke3R9PC9saT5gfSkpLmpvaW4oIiIpfTwvdWw+YH0pKCl9fXRPLnRlbXBsYXRlPV9lYAogICAgPGRpdiBpZD0id3JhcCI+CiAgICAgIDxoMz5bW25hbWVdXTwvaDM+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQtd3JhcHBlciI+PHNsb3Q+PC9zbG90PjwvZGl2PgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIC5jb250ZW50LXdyYXBwZXIgOjpzbG90dGVkKCopIHsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5jb250ZW50LXdyYXBwZXIgOjpzbG90dGVkKCopIHsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5jb250ZW50LXdyYXBwZXIgOjpzbG90dGVkKC5zZWxlY3RlZCkgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICBjb2xvcjogd2hpdGUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgaDMgewogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1zZWNvbmRhcnktdGV4dC1jb2xvcik7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgbWFyZ2luOiAwIDAgNXB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sdE8ucHJvdG90eXBlLCJuYW1lIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLG5vdGlmeTohMCxvYnNlcnZlcjoiX3NlbGVjdGVkSWRDaGFuZ2VkIn0pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx0Ty5wcm90b3R5cGUsInNlbGVjdGVkSWQiLHZvaWQgMCksdE89dChbaSgidGYtb3B0aW9uLXNlbGVjdG9yIildLHRPKTtsZXQgbk89Y2xhc3MgZXh0ZW5kcyB5ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy53ZWlnaHQ9LjYsdGhpcy5fdXBkYXRlV2VpZ2h0PVNlLmV4cG9ydHMuZGVib3VuY2UoKGZ1bmN0aW9uKHQpe3RoaXMud2VpZ2h0PXR9KSwyNTApfV9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlckNoYW5nZWQoKXt0aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ9dGhpcy5faW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXIudG9TdHJpbmcoKSx0aGlzLl91cGRhdGVXZWlnaHQuY2FsbCh0aGlzLHRoaXMuX2ltbWVkaWF0ZVdlaWdodE51bWJlckZvclBhcGVyU2xpZGVyKX1faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0Q2hhbmdlZCgpeyt0aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ8MD90aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ9IjAiOit0aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ+MSYmKHRoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dD0iMSIpO3ZhciB0PSt0aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ7aXNOYU4odCl8fHRoaXMuX3VwZGF0ZVdlaWdodC5jYWxsKHRoaXMsdCl9fTtmdW5jdGlvbiBpTyh0LGUpe2NvbnN0IG49T2JqZWN0LmtleXMoZSkuc29ydCgpLmZpbHRlcigodD0+dm9pZCAwIT09ZVt0XSkpO2lmKCFuLmxlbmd0aClyZXR1cm4gdDtjb25zdCBpPS0xIT09dC5pbmRleE9mKCI/Iik/IiYiOiI/IjtyZXR1cm4gdCtpK1tdLmNvbmNhdCguLi5uLm1hcCgodD0+e2NvbnN0IG49ZVt0XTtyZXR1cm4oQXJyYXkuaXNBcnJheShuKT9uOltuXSkubWFwKChlPT5gJHt0fT0keyhmdW5jdGlvbiBuKHQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQodCkucmVwbGFjZSgvXCgvZywiJTI4IikucmVwbGFjZSgvXCkvZywiJTI5Iil9KShlKX1gKSl9KSkpLmpvaW4oIiYiKX1uTy50ZW1wbGF0ZT1fZWAKICAgIDxoMyBjbGFzcz0idGl0bGUiPlNtb290aGluZzwvaDM+CiAgICA8ZGl2IGNsYXNzPSJzbW9vdGhpbmctYmxvY2siPgogICAgICA8cGFwZXItc2xpZGVyCiAgICAgICAgaWQ9InNsaWRlciIKICAgICAgICBpbW1lZGlhdGUtdmFsdWU9Int7X2ltbWVkaWF0ZVdlaWdodE51bWJlckZvclBhcGVyU2xpZGVyfX0iCiAgICAgICAgbWF4PSJbW21heF1dIgogICAgICAgIG1pbj0iW1ttaW5dXSIKICAgICAgICBwaW4KICAgICAgICBzdGVwPSJbW3N0ZXBdXSIKICAgICAgICB0eXBlPSJudW1iZXIiCiAgICAgICAgdmFsdWU9Int7d2VpZ2h0fX0iCiAgICAgID48L3BhcGVyLXNsaWRlcj4KICAgICAgPHBhcGVyLWlucHV0CiAgICAgICAgaWQ9ImlucHV0IgogICAgICAgIGxhYmVsPSJ3ZWlnaHQiCiAgICAgICAgbm8tbGFiZWwtZmxvYXQKICAgICAgICB2YWx1ZT0ie3tfaW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0fX0iCiAgICAgICAgdHlwZT0ibnVtYmVyIgogICAgICAgIHN0ZXA9Iltbc3RlcF1dIgogICAgICAgIG1pbj0iW1ttaW5dXSIKICAgICAgICBtYXg9IltbbWF4XV0iCiAgICAgID48L3BhcGVyLWlucHV0PgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIC50aXRsZSB7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXNlY29uZGFyeS10ZXh0LWNvbG9yKTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICB9CgogICAgICAuc21vb3RoaW5nLWJsb2NrIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICBmbGV4LWdyb3c6IDI7CiAgICAgIH0KCiAgICAgIHBhcGVyLWlucHV0IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgICAgd2lkdGg6IDYwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxuTy5wcm90b3R5cGUsInN0ZXAiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sbk8ucHJvdG90eXBlLCJtYXgiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sbk8ucHJvdG90eXBlLCJtaW4iLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLG5PLnByb3RvdHlwZSwid2VpZ2h0Iix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLG5vdGlmeTohMCxvYnNlcnZlcjoiX2ltbWVkaWF0ZVdlaWdodE51bWJlckZvclBhcGVyU2xpZGVyQ2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sbk8ucHJvdG90eXBlLCJfaW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXIiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLG9ic2VydmVyOiJfaW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0Q2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sbk8ucHJvdG90eXBlLCJfaW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0Iix2b2lkIDApLG5PPXQoW2koInRmLXNtb290aGluZy1pbnB1dCIpXSxuTyk7dmFyIHJPPXt9LG9PPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfSxhTz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbiB0KGUpe2Zvcih2YXIgbixpPTEscj1hcmd1bWVudHMubGVuZ3RoO2k8cjtpKyspZm9yKHZhciBvIGluIG49YXJndW1lbnRzW2ldKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLG8pJiYoZVtvXT1uW29dKTtyZXR1cm4gZX07Ci8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlCiAgICB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZQogICAgTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBUSElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCiAgICBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVECiAgICBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLAogICAgTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC4KCiAgICBTZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKICAgIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovZnVuY3Rpb24gc08odCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdLG49MDtyZXR1cm4gZT9lLmNhbGwodCk6e25leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdCYmbj49dC5sZW5ndGgmJih0PXZvaWQgMCkse3ZhbHVlOnQmJnRbbisrXSxkb25lOiF0fX19fWZ1bmN0aW9uIGxPKHQsZSl7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdO2lmKCFuKXJldHVybiB0O3ZhciBpLHIsbz1uLmNhbGwodCksYT1bXTt0cnl7Zm9yKDsodm9pZCAwPT09ZXx8ZS0tID4wKSYmIShpPW8ubmV4dCgpKS5kb25lOylhLnB1c2goaS52YWx1ZSl9Y2F0Y2godCl7cj17ZXJyb3I6dH19ZmluYWxseXt0cnl7aSYmIWkuZG9uZSYmKG49by5yZXR1cm4pJiZuLmNhbGwobyl9ZmluYWxseXtpZihyKXRocm93IHIuZXJyb3J9fXJldHVybiBhfWZ1bmN0aW9uIGNPKHQpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgY08/KHRoaXMudj10LHRoaXMpOm5ldyBjTyh0KX12YXIgdU89YmUoT2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsX19leHRlbmRzOmZ1bmN0aW9uIGhPKHQsZSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9dH1vTyh0LGUpLHQucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KG4ucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBuKX0sX19hc3NpZ246YU8sX19yZXN0OmZ1bmN0aW9uIGRPKHQsZSl7dmFyIG49e307Zm9yKHZhciBpIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsaSkmJmUuaW5kZXhPZihpKTwwJiYobltpXT10W2ldKTtpZihudWxsIT10JiYiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9MDtmb3IoaT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpO3I8aS5sZW5ndGg7cisrKWUuaW5kZXhPZihpW3JdKTwwJiYobltpW3JdXT10W2lbcl1dKX1yZXR1cm4gbn0sX19kZWNvcmF0ZTpmdW5jdGlvbiBwTyh0LGUsbixpKXt2YXIgcixvPWFyZ3VtZW50cy5sZW5ndGgsYT1vPDM/ZTpudWxsPT09aT9pPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxuKTppO2lmKCJvYmplY3QiPT10eXBlb2YgUmVmbGVjdCYmImZ1bmN0aW9uIj09dHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUpYT1SZWZsZWN0LmRlY29yYXRlKHQsZSxuLGkpO2Vsc2UgZm9yKHZhciBzPXQubGVuZ3RoLTE7cz49MDtzLS0pKHI9dFtzXSkmJihhPShvPDM/cihhKTpvPjM/cihlLG4sYSk6cihlLG4pKXx8YSk7cmV0dXJuIG8+MyYmYSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbixhKSxhfSxfX3BhcmFtOmZ1bmN0aW9uIGZPKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSl7ZShuLGksdCl9fSxfX21ldGFkYXRhOmZ1bmN0aW9uIG1PKHQsZSl7aWYoIm9iamVjdCI9PXR5cGVvZiBSZWZsZWN0JiYiZnVuY3Rpb24iPT10eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSlyZXR1cm4gUmVmbGVjdC5tZXRhZGF0YSh0LGUpfSxfX2F3YWl0ZXI6ZnVuY3Rpb24gZ08odCxlLG4saSl7cmV0dXJuIG5ldyhufHwobj1Qcm9taXNlKSkoKGZ1bmN0aW9uKHIsbyl7ZnVuY3Rpb24gYSh0KXt0cnl7bChpLm5leHQodCkpfWNhdGNoKHQpe28odCl9fWZ1bmN0aW9uIHModCl7dHJ5e2woaS50aHJvdyh0KSl9Y2F0Y2godCl7byh0KX19ZnVuY3Rpb24gbCh0KXt0LmRvbmU/cih0LnZhbHVlKTpuZXcgbigoZnVuY3Rpb24oZSl7ZSh0LnZhbHVlKX0pKS50aGVuKGEscyl9bCgoaT1pLmFwcGx5KHQsZXx8W10pKS5uZXh0KCkpfSkpfSxfX2dlbmVyYXRvcjpmdW5jdGlvbiBfTyh0LGUpe3ZhciBuLGkscixvLGE9e2xhYmVsOjAsc2VudDpmdW5jdGlvbigpe2lmKDEmclswXSl0aHJvdyByWzFdO3JldHVybiByWzFdfSx0cnlzOltdLG9wczpbXX07cmV0dXJuIG89e25leHQ6cygwKSx0aHJvdzpzKDEpLHJldHVybjpzKDIpfSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYob1tTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxvO2Z1bmN0aW9uIHMobyl7cmV0dXJuIGZ1bmN0aW9uKHMpe3JldHVybihmdW5jdGlvbiBsKG8pe2lmKG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLiIpO2Zvcig7YTspdHJ5e2lmKG49MSxpJiYocj1pWzImb1swXT8icmV0dXJuIjpvWzBdPyJ0aHJvdyI6Im5leHQiXSkmJiEocj1yLmNhbGwoaSxvWzFdKSkuZG9uZSlyZXR1cm4gcjtzd2l0Y2goaT0wLHImJihvPVswLHIudmFsdWVdKSxvWzBdKXtjYXNlIDA6Y2FzZSAxOnI9bzticmVhaztjYXNlIDQ6cmV0dXJuIGEubGFiZWwrKyx7dmFsdWU6b1sxXSxkb25lOiExfTtjYXNlIDU6YS5sYWJlbCsrLGk9b1sxXSxvPVswXTtjb250aW51ZTtjYXNlIDc6bz1hLm9wcy5wb3AoKSxhLnRyeXMucG9wKCk7Y29udGludWU7ZGVmYXVsdDppZighKChyPShyPWEudHJ5cykubGVuZ3RoPjAmJnJbci5sZW5ndGgtMV0pfHw2IT09b1swXSYmMiE9PW9bMF0pKXthPTA7Y29udGludWV9aWYoMz09PW9bMF0mJighcnx8b1sxXT5yWzBdJiZvWzFdPHJbM10pKXthLmxhYmVsPW9bMV07YnJlYWt9aWYoNj09PW9bMF0mJmEubGFiZWw8clsxXSl7YS5sYWJlbD1yWzFdLHI9bzticmVha31pZihyJiZhLmxhYmVsPHJbMl0pe2EubGFiZWw9clsyXSxhLm9wcy5wdXNoKG8pO2JyZWFrfXJbMl0mJmEub3BzLnBvcCgpLGEudHJ5cy5wb3AoKTtjb250aW51ZX1vPWUuY2FsbCh0LGEpfWNhdGNoKHQpe289WzYsdF0saT0wfWZpbmFsbHl7bj1yPTB9aWYoNSZvWzBdKXRocm93IG9bMV07cmV0dXJue3ZhbHVlOm9bMF0/b1sxXTp2b2lkIDAsZG9uZTohMH19KShbbyxzXSl9fX0sX19leHBvcnRTdGFyOmZ1bmN0aW9uIHlPKHQsZSl7Zm9yKHZhciBuIGluIHQpZS5oYXNPd25Qcm9wZXJ0eShuKXx8KGVbbl09dFtuXSl9LF9fdmFsdWVzOnNPLF9fcmVhZDpsTyxfX3NwcmVhZDpmdW5jdGlvbiB2Tygpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0PXQuY29uY2F0KGxPKGFyZ3VtZW50c1tlXSkpO3JldHVybiB0fSxfX2F3YWl0OmNPLF9fYXN5bmNHZW5lcmF0b3I6ZnVuY3Rpb24gYk8odCxlLG4pe2lmKCFTeW1ib2wuYXN5bmNJdGVyYXRvcil0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTt2YXIgaSxyPW4uYXBwbHkodCxlfHxbXSksbz1bXTtyZXR1cm4gaT17fSxhKCJuZXh0IiksYSgidGhyb3ciKSxhKCJyZXR1cm4iKSxpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxpO2Z1bmN0aW9uIGEodCl7clt0XSYmKGlbdF09ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihuLGkpe28ucHVzaChbdCxlLG4saV0pPjF8fHModCxlKX0pKX0pfWZ1bmN0aW9uIHModCxlKXt0cnl7IShmdW5jdGlvbiBuKHQpe3QudmFsdWUgaW5zdGFuY2VvZiBjTz9Qcm9taXNlLnJlc29sdmUodC52YWx1ZS52KS50aGVuKGwsYyk6dShvWzBdWzJdLHQpfSkoclt0XShlKSl9Y2F0Y2godCl7dShvWzBdWzNdLHQpfX1mdW5jdGlvbiBsKHQpe3MoIm5leHQiLHQpfWZ1bmN0aW9uIGModCl7cygidGhyb3ciLHQpfWZ1bmN0aW9uIHUodCxlKXt0KGUpLG8uc2hpZnQoKSxvLmxlbmd0aCYmcyhvWzBdWzBdLG9bMF1bMV0pfX0sX19hc3luY0RlbGVnYXRvcjpmdW5jdGlvbiB4Tyh0KXt2YXIgZSxuO3JldHVybiBlPXt9LGkoIm5leHQiKSxpKCJ0aHJvdyIsKGZ1bmN0aW9uKHQpe3Rocm93IHR9KSksaSgicmV0dXJuIiksZVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGU7ZnVuY3Rpb24gaShpLHIpe3RbaV0mJihlW2ldPWZ1bmN0aW9uKGUpe3JldHVybihuPSFuKT97dmFsdWU6Y08odFtpXShlKSksZG9uZToicmV0dXJuIj09PWl9OnI/cihlKTplfSl9fSxfX2FzeW5jVmFsdWVzOmZ1bmN0aW9uIHdPKHQpe2lmKCFTeW1ib2wuYXN5bmNJdGVyYXRvcil0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC4iKTt2YXIgZT10W1N5bWJvbC5hc3luY0l0ZXJhdG9yXTtyZXR1cm4gZT9lLmNhbGwodCk6c08odCl9LF9fbWFrZVRlbXBsYXRlT2JqZWN0OmZ1bmN0aW9uIFNPKHQsZSl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eT9PYmplY3QuZGVmaW5lUHJvcGVydHkodCwicmF3Iix7dmFsdWU6ZX0pOnQucmF3PWUsdH19KSk7ZnVuY3Rpb24gTU8odCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOnQ+PWU/MDpOYU59ZnVuY3Rpb24gRU8odCl7cmV0dXJuIDE9PT10Lmxlbmd0aCYmKHQ9KGZ1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuIE1PKHQoZSksbil9fSkodCkpLHtsZWZ0OmZ1bmN0aW9uKGUsbixpLHIpe2ZvcihudWxsPT1pJiYoaT0wKSxudWxsPT1yJiYocj1lLmxlbmd0aCk7aTxyOyl7dmFyIG89aStyPj4+MTt0KGVbb10sbik8MD9pPW8rMTpyPW99cmV0dXJuIGl9LHJpZ2h0OmZ1bmN0aW9uKGUsbixpLHIpe2ZvcihudWxsPT1pJiYoaT0wKSxudWxsPT1yJiYocj1lLmxlbmd0aCk7aTxyOyl7dmFyIG89aStyPj4+MTt0KGVbb10sbik+MD9yPW86aT1vKzF9cmV0dXJuIGl9fX12YXIgVE89RU8oTU8pLENPPVRPLnJpZ2h0LEFPPVRPLmxlZnQ7ZnVuY3Rpb24ga08odCxlKXtyZXR1cm5bdCxlXX1mdW5jdGlvbiBMTyh0KXtyZXR1cm4gbnVsbD09PXQ/TmFOOit0fWZ1bmN0aW9uIFBPKHQsZSl7dmFyIG4saSxyPXQubGVuZ3RoLG89MCxhPS0xLHM9MCxsPTA7aWYobnVsbD09ZSlmb3IoOysrYTxyOylpc05hTihuPUxPKHRbYV0pKXx8KGwrPShpPW4tcykqKG4tKHMrPWkvKytvKSkpO2Vsc2UgZm9yKDsrK2E8cjspaXNOYU4obj1MTyhlKHRbYV0sYSx0KSkpfHwobCs9KGk9bi1zKSoobi0ocys9aS8rK28pKSk7aWYobz4xKXJldHVybiBsLyhvLTEpfWZ1bmN0aW9uIE5PKHQsZSl7dmFyIG49UE8odCxlKTtyZXR1cm4gbj9NYXRoLnNxcnQobik6bn1mdW5jdGlvbiBJTyh0LGUpe3ZhciBuLGkscixvPXQubGVuZ3RoLGE9LTE7aWYobnVsbD09ZSl7Zm9yKDsrK2E8bzspaWYobnVsbCE9KG49dFthXSkmJm4+PW4pZm9yKGk9cj1uOysrYTxvOyludWxsIT0obj10W2FdKSYmKGk+biYmKGk9bikscjxuJiYocj1uKSl9ZWxzZSBmb3IoOysrYTxvOylpZihudWxsIT0obj1lKHRbYV0sYSx0KSkmJm4+PW4pZm9yKGk9cj1uOysrYTxvOyludWxsIT0obj1lKHRbYV0sYSx0KSkmJihpPm4mJihpPW4pLHI8biYmKHI9bikpO3JldHVybltpLHJdfXZhciBSTz1BcnJheS5wcm90b3R5cGUsT089Uk8uc2xpY2Usek89Uk8ubWFwO2Z1bmN0aW9uIERPKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBCTyh0KXtyZXR1cm4gdH1mdW5jdGlvbiBITyh0LGUsbil7dD0rdCxlPStlLG49KHI9YXJndW1lbnRzLmxlbmd0aCk8Mj8oZT10LHQ9MCwxKTpyPDM/MTorbjtmb3IodmFyIGk9LTEscj0wfE1hdGgubWF4KDAsTWF0aC5jZWlsKChlLXQpL24pKSxvPW5ldyBBcnJheShyKTsrK2k8cjspb1tpXT10K2kqbjtyZXR1cm4gb312YXIgRk89TWF0aC5zcXJ0KDUwKSxWTz1NYXRoLnNxcnQoMTApLFVPPU1hdGguc3FydCgyKTtmdW5jdGlvbiBqTyh0LGUsbil7dmFyIGk9KGUtdCkvTWF0aC5tYXgoMCxuKSxyPU1hdGguZmxvb3IoTWF0aC5sb2coaSkvTWF0aC5MTjEwKSxvPWkvTWF0aC5wb3coMTAscik7cmV0dXJuIHI+PTA/KG8+PUZPPzEwOm8+PVZPPzU6bz49VU8/MjoxKSpNYXRoLnBvdygxMCxyKTotTWF0aC5wb3coMTAsLXIpLyhvPj1GTz8xMDpvPj1WTz81Om8+PVVPPzI6MSl9ZnVuY3Rpb24gR08odCxlLG4pe3ZhciBpPU1hdGguYWJzKGUtdCkvTWF0aC5tYXgoMCxuKSxyPU1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2coaSkvTWF0aC5MTjEwKSksbz1pL3I7cmV0dXJuIG8+PUZPP3IqPTEwOm8+PVZPP3IqPTU6bz49VU8mJihyKj0yKSxlPHQ/LXI6cn1mdW5jdGlvbiBXTyh0KXtyZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nKHQubGVuZ3RoKS9NYXRoLkxOMikrMX1mdW5jdGlvbiBxTyh0LGUsbil7aWYobnVsbD09biYmKG49TE8pLGk9dC5sZW5ndGgpe2lmKChlPStlKTw9MHx8aTwyKXJldHVybituKHRbMF0sMCx0KTtpZihlPj0xKXJldHVybituKHRbaS0xXSxpLTEsdCk7dmFyIGkscj0oaS0xKSplLG89TWF0aC5mbG9vcihyKSxhPStuKHRbb10sbyx0KTtyZXR1cm4gYSsoK24odFtvKzFdLG8rMSx0KS1hKSooci1vKX19ZnVuY3Rpb24gWU8odCxlKXt2YXIgbixpLHI9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1lKXtmb3IoOysrbzxyOylpZihudWxsIT0obj10W29dKSYmbj49bilmb3IoaT1uOysrbzxyOyludWxsIT0obj10W29dKSYmaT5uJiYoaT1uKX1lbHNlIGZvcig7KytvPHI7KWlmKG51bGwhPShuPWUodFtvXSxvLHQpKSYmbj49bilmb3IoaT1uOysrbzxyOyludWxsIT0obj1lKHRbb10sbyx0KSkmJmk+biYmKGk9bik7cmV0dXJuIGl9ZnVuY3Rpb24gWE8odCl7aWYoIShyPXQubGVuZ3RoKSlyZXR1cm5bXTtmb3IodmFyIGU9LTEsbj1ZTyh0LCRPKSxpPW5ldyBBcnJheShuKTsrK2U8bjspZm9yKHZhciByLG89LTEsYT1pW2VdPW5ldyBBcnJheShyKTsrK288cjspYVtvXT10W29dW2VdO3JldHVybiBpfWZ1bmN0aW9uICRPKHQpe3JldHVybiB0Lmxlbmd0aH12YXIgS089QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIFpPKHQpe3JldHVybiB0fXZhciBKTz0xZS02O2Z1bmN0aW9uIFFPKHQpe3JldHVybiJ0cmFuc2xhdGUoIisodCsuNSkrIiwwKSJ9ZnVuY3Rpb24gdHoodCl7cmV0dXJuInRyYW5zbGF0ZSgwLCIrKHQrLjUpKyIpIn1mdW5jdGlvbiBleih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuK3QoZSl9fWZ1bmN0aW9uIG56KHQpe3ZhciBlPU1hdGgubWF4KDAsdC5iYW5kd2lkdGgoKS0xKS8yO3JldHVybiB0LnJvdW5kKCkmJihlPU1hdGgucm91bmQoZSkpLGZ1bmN0aW9uKG4pe3JldHVybit0KG4pK2V9fWZ1bmN0aW9uIGl6KCl7cmV0dXJuIXRoaXMuX19heGlzfWZ1bmN0aW9uIHJ6KHQsZSl7dmFyIG49W10saT1udWxsLHI9bnVsbCxvPTYsYT02LHM9MyxsPTE9PT10fHw0PT09dD8tMToxLGM9ND09PXR8fDI9PT10PyJ4IjoieSIsdT0xPT09dHx8Mz09PXQ/UU86dHo7ZnVuY3Rpb24gaChoKXt2YXIgZD1udWxsPT1pP2UudGlja3M/ZS50aWNrcy5hcHBseShlLG4pOmUuZG9tYWluKCk6aSxwPW51bGw9PXI/ZS50aWNrRm9ybWF0P2UudGlja0Zvcm1hdC5hcHBseShlLG4pOlpPOnIsZj1NYXRoLm1heChvLDApK3MsbT1lLnJhbmdlKCksZz0rbVswXSsuNSxfPSttW20ubGVuZ3RoLTFdKy41LHk9KGUuYmFuZHdpZHRoP256OmV6KShlLmNvcHkoKSksdj1oLnNlbGVjdGlvbj9oLnNlbGVjdGlvbigpOmgsYj12LnNlbGVjdEFsbCgiLmRvbWFpbiIpLmRhdGEoW251bGxdKSx4PXYuc2VsZWN0QWxsKCIudGljayIpLmRhdGEoZCxlKS5vcmRlcigpLHc9eC5leGl0KCksUz14LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJ0aWNrIiksTT14LnNlbGVjdCgibGluZSIpLEU9eC5zZWxlY3QoInRleHQiKTtiPWIubWVyZ2UoYi5lbnRlcigpLmluc2VydCgicGF0aCIsIi50aWNrIikuYXR0cigiY2xhc3MiLCJkb21haW4iKS5hdHRyKCJzdHJva2UiLCIjMDAwIikpLHg9eC5tZXJnZShTKSxNPU0ubWVyZ2UoUy5hcHBlbmQoImxpbmUiKS5hdHRyKCJzdHJva2UiLCIjMDAwIikuYXR0cihjKyIyIixsKm8pKSxFPUUubWVyZ2UoUy5hcHBlbmQoInRleHQiKS5hdHRyKCJmaWxsIiwiIzAwMCIpLmF0dHIoYyxsKmYpLmF0dHIoImR5IiwxPT09dD8iMGVtIjozPT09dD8iMC43MWVtIjoiMC4zMmVtIikpLGghPT12JiYoYj1iLnRyYW5zaXRpb24oaCkseD14LnRyYW5zaXRpb24oaCksTT1NLnRyYW5zaXRpb24oaCksRT1FLnRyYW5zaXRpb24oaCksdz13LnRyYW5zaXRpb24oaCkuYXR0cigib3BhY2l0eSIsSk8pLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PXkodCkpP3UodCk6dGhpcy5nZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIpfSkpLFMuYXR0cigib3BhY2l0eSIsSk8pLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucGFyZW50Tm9kZS5fX2F4aXM7cmV0dXJuIHUoZSYmaXNGaW5pdGUoZT1lKHQpKT9lOnkodCkpfSkpKSx3LnJlbW92ZSgpLGIuYXR0cigiZCIsND09PXR8fDI9PXQ/Ik0iK2wqYSsiLCIrZysiSDAuNVYiK18rIkgiK2wqYToiTSIrZysiLCIrbCphKyJWMC41SCIrXysiViIrbCphKSx4LmF0dHIoIm9wYWNpdHkiLDEpLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3JldHVybiB1KHkodCkpfSkpLE0uYXR0cihjKyIyIixsKm8pLEUuYXR0cihjLGwqZikudGV4dChwKSx2LmZpbHRlcihpeikuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJmb250LXNpemUiLDEwKS5hdHRyKCJmb250LWZhbWlseSIsInNhbnMtc2VyaWYiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsMj09PXQ/InN0YXJ0Ijo0PT09dD8iZW5kIjoibWlkZGxlIiksdi5lYWNoKChmdW5jdGlvbigpe3RoaXMuX19heGlzPXl9KSl9cmV0dXJuIGguc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxoKTplfSxoLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIG49S08uY2FsbChhcmd1bWVudHMpLGh9LGgudGlja0FyZ3VtZW50cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P1tdOktPLmNhbGwodCksaCk6bi5zbGljZSgpfSxoLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09dD9udWxsOktPLmNhbGwodCksaCk6aSYmaS5zbGljZSgpfSxoLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxoKTpyfSxoLnRpY2tTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWE9K3QsaCk6b30saC50aWNrU2l6ZUlubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSt0LGgpOm99LGgudGlja1NpemVPdXRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rdCxoKTphfSxoLnRpY2tQYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0LGgpOnN9LGh9dmFyIG96PXt2YWx1ZTpmdW5jdGlvbigpe319O2Z1bmN0aW9uIGF6KCl7Zm9yKHZhciB0LGU9MCxuPWFyZ3VtZW50cy5sZW5ndGgsaT17fTtlPG47KytlKXtpZighKHQ9YXJndW1lbnRzW2VdKyIiKXx8dCBpbiBpfHwvW1xzLl0vLnRlc3QodCkpdGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIHR5cGU6ICIrdCk7aVt0XT1bXX1yZXR1cm4gbmV3IHN6KGkpfWZ1bmN0aW9uIHN6KHQpe3RoaXMuXz10fWZ1bmN0aW9uIGx6KHQsZSl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcCgoZnVuY3Rpb24odCl7dmFyIG49IiIsaT10LmluZGV4T2YoIi4iKTtpZihpPj0wJiYobj10LnNsaWNlKGkrMSksdD10LnNsaWNlKDAsaSkpLHQmJiFlLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO3JldHVybnt0eXBlOnQsbmFtZTpufX0pKX1mdW5jdGlvbiBjeih0LGUpe2Zvcih2YXIgbixpPTAscj10Lmxlbmd0aDtpPHI7KytpKWlmKChuPXRbaV0pLm5hbWU9PT1lKXJldHVybiBuLnZhbHVlfWZ1bmN0aW9uIHV6KHQsZSxuKXtmb3IodmFyIGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpaWYodFtpXS5uYW1lPT09ZSl7dFtpXT1veix0PXQuc2xpY2UoMCxpKS5jb25jYXQodC5zbGljZShpKzEpKTticmVha31yZXR1cm4gbnVsbCE9biYmdC5wdXNoKHtuYW1lOmUsdmFsdWU6bn0pLHR9c3oucHJvdG90eXBlPWF6LnByb3RvdHlwZT17Y29uc3RydWN0b3I6c3osb246ZnVuY3Rpb24odCxlKXt2YXIgbixpPXRoaXMuXyxyPWx6KHQrIiIsaSksbz0tMSxhPXIubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7aWYobnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK2UpO2Zvcig7KytvPGE7KWlmKG49KHQ9cltvXSkudHlwZSlpW25dPXV6KGlbbl0sdC5uYW1lLGUpO2Vsc2UgaWYobnVsbD09ZSlmb3IobiBpbiBpKWlbbl09dXooaVtuXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK288YTspaWYoKG49KHQ9cltvXSkudHlwZSkmJihuPWN6KGlbbl0sdC5uYW1lKSkpcmV0dXJuIG59LGNvcHk6ZnVuY3Rpb24oKXt2YXIgdD17fSxlPXRoaXMuXztmb3IodmFyIG4gaW4gZSl0W25dPWVbbl0uc2xpY2UoKTtyZXR1cm4gbmV3IHN6KHQpfSxjYWxsOmZ1bmN0aW9uKHQsZSl7aWYoKG49YXJndW1lbnRzLmxlbmd0aC0yKT4wKWZvcih2YXIgbixpLHI9bmV3IEFycmF5KG4pLG89MDtvPG47KytvKXJbb109YXJndW1lbnRzW28rMl07aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3Iobz0wLG49KGk9dGhpcy5fW3RdKS5sZW5ndGg7bzxuOysrbylpW29dLnZhbHVlLmFwcGx5KGUscil9LGFwcGx5OmZ1bmN0aW9uKHQsZSxuKXtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2Zvcih2YXIgaT10aGlzLl9bdF0scj0wLG89aS5sZW5ndGg7cjxvOysrcilpW3JdLnZhbHVlLmFwcGx5KGUsbil9fTt2YXIgaHo9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLGR6PXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDpoeix4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyJ9O2Z1bmN0aW9uIHB6KHQpe3ZhciBlPXQrPSIiLG49ZS5pbmRleE9mKCI6Iik7cmV0dXJuIG4+PTAmJiJ4bWxucyIhPT0oZT10LnNsaWNlKDAsbikpJiYodD10LnNsaWNlKG4rMSkpLGR6Lmhhc093blByb3BlcnR5KGUpP3tzcGFjZTpkeltlXSxsb2NhbDp0fTp0fWZ1bmN0aW9uIGZ6KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMub3duZXJEb2N1bWVudCxuPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBuPT09aHomJmUuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PWh6P2UuY3JlYXRlRWxlbWVudCh0KTplLmNyZWF0ZUVsZW1lbnROUyhuLHQpfX1mdW5jdGlvbiBteih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBneih0KXt2YXIgZT1weih0KTtyZXR1cm4oZS5sb2NhbD9tejpmeikoZSl9ZnVuY3Rpb24gX3ooKXt9ZnVuY3Rpb24geXoodCl7cmV0dXJuIG51bGw9PXQ/X3o6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpfX1mdW5jdGlvbiB2eigpe3JldHVybltdfWZ1bmN0aW9uIGJ6KHQpe3JldHVybiBudWxsPT10P3Z6OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbCh0KX19ZnVuY3Rpb24geHoodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2hlcyh0KX19ZnVuY3Rpb24gd3oodCl7cmV0dXJuIG5ldyBBcnJheSh0Lmxlbmd0aCl9ZnVuY3Rpb24gU3oodCxlKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPWV9ZnVuY3Rpb24gTXoodCxlLG4saSxyLG8pe2Zvcih2YXIgYSxzPTAsbD1lLmxlbmd0aCxjPW8ubGVuZ3RoO3M8YzsrK3MpKGE9ZVtzXSk/KGEuX19kYXRhX189b1tzXSxpW3NdPWEpOm5bc109bmV3IFN6KHQsb1tzXSk7Zm9yKDtzPGw7KytzKShhPWVbc10pJiYocltzXT1hKX1mdW5jdGlvbiBFeih0LGUsbixpLHIsbyxhKXt2YXIgcyxsLGMsdT17fSxoPWUubGVuZ3RoLGQ9by5sZW5ndGgscD1uZXcgQXJyYXkoaCk7Zm9yKHM9MDtzPGg7KytzKShsPWVbc10pJiYocFtzXT1jPSIkIithLmNhbGwobCxsLl9fZGF0YV9fLHMsZSksYyBpbiB1P3Jbc109bDp1W2NdPWwpO2ZvcihzPTA7czxkOysrcykobD11W2M9IiQiK2EuY2FsbCh0LG9bc10scyxvKV0pPyhpW3NdPWwsbC5fX2RhdGFfXz1vW3NdLHVbY109bnVsbCk6bltzXT1uZXcgU3oodCxvW3NdKTtmb3Iocz0wO3M8aDsrK3MpKGw9ZVtzXSkmJnVbcFtzXV09PT1sJiYocltzXT1sKX1mdW5jdGlvbiBUeih0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6dD49ZT8wOk5hTn1mdW5jdGlvbiBDeih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19ZnVuY3Rpb24gQXoodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBreih0LGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKHQsZSl9fWZ1bmN0aW9uIEx6KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsZSl9fWZ1bmN0aW9uIFB6KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj90aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KTp0aGlzLnNldEF0dHJpYnV0ZSh0LG4pfX1mdW5jdGlvbiBOeih0LGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PW4/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLG4pfX1mdW5jdGlvbiBJeih0KXtyZXR1cm4gdC5vd25lckRvY3VtZW50JiZ0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHQuZG9jdW1lbnQmJnR8fHQuZGVmYXVsdFZpZXd9ZnVuY3Rpb24gUnoodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KX19ZnVuY3Rpb24gT3oodCxlLG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxlLG4pfX1mdW5jdGlvbiB6eih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09aT90aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpOnRoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxpLG4pfX1mdW5jdGlvbiBEeih0LGUpe3JldHVybiB0LnN0eWxlLmdldFByb3BlcnR5VmFsdWUoZSl8fEl6KHQpLmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKGUpfWZ1bmN0aW9uIEJ6KHQpe3JldHVybiBmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW3RdfX1mdW5jdGlvbiBIeih0LGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXNbdF09ZX19ZnVuY3Rpb24gRnoodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP2RlbGV0ZSB0aGlzW3RdOnRoaXNbdF09bn19ZnVuY3Rpb24gVnoodCl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uIFV6KHQpe3JldHVybiB0LmNsYXNzTGlzdHx8bmV3IGp6KHQpfWZ1bmN0aW9uIGp6KHQpe3RoaXMuX25vZGU9dCx0aGlzLl9uYW1lcz1Weih0LmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfWZ1bmN0aW9uIEd6KHQsZSl7Zm9yKHZhciBuPVV6KHQpLGk9LTEscj1lLmxlbmd0aDsrK2k8cjspbi5hZGQoZVtpXSl9ZnVuY3Rpb24gV3oodCxlKXtmb3IodmFyIG49VXoodCksaT0tMSxyPWUubGVuZ3RoOysraTxyOyluLnJlbW92ZShlW2ldKX1mdW5jdGlvbiBxeih0KXtyZXR1cm4gZnVuY3Rpb24oKXtHeih0aGlzLHQpfX1mdW5jdGlvbiBZeih0KXtyZXR1cm4gZnVuY3Rpb24oKXtXeih0aGlzLHQpfX1mdW5jdGlvbiBYeih0LGUpe3JldHVybiBmdW5jdGlvbigpeyhlLmFwcGx5KHRoaXMsYXJndW1lbnRzKT9HejpXeikodGhpcyx0KX19ZnVuY3Rpb24gJHooKXt0aGlzLnRleHRDb250ZW50PSIifWZ1bmN0aW9uIEt6KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19ZnVuY3Rpb24gWnoodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT1lPyIiOmV9fWZ1bmN0aW9uIEp6KCl7dGhpcy5pbm5lckhUTUw9IiJ9ZnVuY3Rpb24gUXoodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9dH19ZnVuY3Rpb24gdEQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pbm5lckhUTUw9bnVsbD09ZT8iIjplfX1mdW5jdGlvbiBlRCgpe3RoaXMubmV4dFNpYmxpbmcmJnRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKX1mdW5jdGlvbiBuRCgpe3RoaXMucHJldmlvdXNTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIGlEKCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gckQoKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7dCYmdC5yZW1vdmVDaGlsZCh0aGlzKX1mdW5jdGlvbiBvRCgpe3ZhciB0PXRoaXMuY2xvbmVOb2RlKCExKSxlPXRoaXMucGFyZW50Tm9kZTtyZXR1cm4gZT9lLmluc2VydEJlZm9yZSh0LHRoaXMubmV4dFNpYmxpbmcpOnR9ZnVuY3Rpb24gYUQoKXt2YXIgdD10aGlzLmNsb25lTm9kZSghMCksZT10aGlzLnBhcmVudE5vZGU7cmV0dXJuIGU/ZS5pbnNlcnRCZWZvcmUodCx0aGlzLm5leHRTaWJsaW5nKTp0fVN6LnByb3RvdHlwZT17Y29uc3RydWN0b3I6U3osYXBwZW5kQ2hpbGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUodCx0aGlzLl9uZXh0KX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUodCxlKX0scXVlcnlTZWxlY3RvcjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3IodCl9LHF1ZXJ5U2VsZWN0b3JBbGw6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHQpfX0sanoucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtlPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKGUsMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgc0Q9e30sbEQ9bnVsbDtmdW5jdGlvbiBjRCh0LGUsbil7cmV0dXJuIHQ9dUQodCxlLG4pLGZ1bmN0aW9uKGUpe3ZhciBuPWUucmVsYXRlZFRhcmdldDtuJiYobj09PXRoaXN8fDgmbi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzKSl8fHQuY2FsbCh0aGlzLGUpfX1mdW5jdGlvbiB1RCh0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKGkpe3ZhciByPWxEO2xEPWk7dHJ5e3QuY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZSxuKX1maW5hbGx5e2xEPXJ9fX1mdW5jdGlvbiBoRCh0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKChmdW5jdGlvbih0KXt2YXIgZT0iIixuPXQuaW5kZXhPZigiLiIpO3JldHVybiBuPj0wJiYoZT10LnNsaWNlKG4rMSksdD10LnNsaWNlKDAsbikpLHt0eXBlOnQsbmFtZTplfX0pKX1mdW5jdGlvbiBkRCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9fb247aWYoZSl7Zm9yKHZhciBuLGk9MCxyPS0xLG89ZS5sZW5ndGg7aTxvOysraSluPWVbaV0sdC50eXBlJiZuLnR5cGUhPT10LnR5cGV8fG4ubmFtZSE9PXQubmFtZT9lWysrcl09bjp0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobi50eXBlLG4ubGlzdGVuZXIsbi5jYXB0dXJlKTsrK3I/ZS5sZW5ndGg9cjpkZWxldGUgdGhpcy5fX29ufX19ZnVuY3Rpb24gcEQodCxlLG4pe3ZhciBpPXNELmhhc093blByb3BlcnR5KHQudHlwZSk/Y0Q6dUQ7cmV0dXJuIGZ1bmN0aW9uKHIsbyxhKXt2YXIgcyxsPXRoaXMuX19vbixjPWkoZSxvLGEpO2lmKGwpZm9yKHZhciB1PTAsaD1sLmxlbmd0aDt1PGg7Kyt1KWlmKChzPWxbdV0pLnR5cGU9PT10LnR5cGUmJnMubmFtZT09PXQubmFtZSlyZXR1cm4gdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHMudHlwZSxzLmxpc3RlbmVyLHMuY2FwdHVyZSksdGhpcy5hZGRFdmVudExpc3RlbmVyKHMudHlwZSxzLmxpc3RlbmVyPWMscy5jYXB0dXJlPW4pLHZvaWQocy52YWx1ZT1lKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIodC50eXBlLGMsbikscz17dHlwZTp0LnR5cGUsbmFtZTp0Lm5hbWUsdmFsdWU6ZSxsaXN0ZW5lcjpjLGNhcHR1cmU6bn0sbD9sLnB1c2gocyk6dGhpcy5fX29uPVtzXX19ZnVuY3Rpb24gZkQodCxlLG4pe3ZhciBpPUl6KHQpLHI9aS5DdXN0b21FdmVudDsiZnVuY3Rpb24iPT10eXBlb2Ygcj9yPW5ldyByKGUsbik6KHI9aS5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxuPyhyLmluaXRFdmVudChlLG4uYnViYmxlcyxuLmNhbmNlbGFibGUpLHIuZGV0YWlsPW4uZGV0YWlsKTpyLmluaXRFdmVudChlLCExLCExKSksdC5kaXNwYXRjaEV2ZW50KHIpfWZ1bmN0aW9uIG1EKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGZEKHRoaXMsdCxlKX19ZnVuY3Rpb24gZ0QodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZkQodGhpcyx0LGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX19InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCYmKCJvbm1vdXNlZW50ZXIiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHwoc0Q9e21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSkpO3ZhciBfRD1bbnVsbF07ZnVuY3Rpb24geUQodCxlKXt0aGlzLl9ncm91cHM9dCx0aGlzLl9wYXJlbnRzPWV9ZnVuY3Rpb24gdkQoKXtyZXR1cm4gbmV3IHlEKFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sX0QpfWZ1bmN0aW9uIGJEKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9uZXcgeUQoW1tkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQpXV0sW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pOm5ldyB5RChbW3RdXSxfRCl9ZnVuY3Rpb24geEQodCl7dmFyIGU9KGZ1bmN0aW9uIG4oKXtmb3IodmFyIHQsZT1sRDt0PWUuc291cmNlRXZlbnQ7KWU9dDtyZXR1cm4gZX0pKCk7cmV0dXJuIGUuY2hhbmdlZFRvdWNoZXMmJihlPWUuY2hhbmdlZFRvdWNoZXNbMF0pLChmdW5jdGlvbiBpKHQsZSl7dmFyIG49dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYobi5jcmVhdGVTVkdQb2ludCl7dmFyIGk9bi5jcmVhdGVTVkdQb2ludCgpO3JldHVybiBpLng9ZS5jbGllbnRYLGkueT1lLmNsaWVudFksWyhpPWkubWF0cml4VHJhbnNmb3JtKHQuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSkueCxpLnldfXZhciByPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW2UuY2xpZW50WC1yLmxlZnQtdC5jbGllbnRMZWZ0LGUuY2xpZW50WS1yLnRvcC10LmNsaWVudFRvcF19KSh0LGUpfWZ1bmN0aW9uIHdEKCl7bEQucHJldmVudERlZmF1bHQoKSxsRC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBTRCh0KXt2YXIgZT10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxuPWJEKHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIsd0QsITApOyJvbnNlbGVjdHN0YXJ0ImluIGU/bi5vbigic2VsZWN0c3RhcnQuZHJhZyIsd0QsITApOihlLl9fbm9zZWxlY3Q9ZS5zdHlsZS5Nb3pVc2VyU2VsZWN0LGUuc3R5bGUuTW96VXNlclNlbGVjdD0ibm9uZSIpfWZ1bmN0aW9uIE1EKHQsZSl7dmFyIG49dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsaT1iRCh0KS5vbigiZHJhZ3N0YXJ0LmRyYWciLG51bGwpO2UmJihpLm9uKCJjbGljay5kcmFnIix3RCwhMCksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtpLm9uKCJjbGljay5kcmFnIixudWxsKX0pLDApKSwib25zZWxlY3RzdGFydCJpbiBuP2kub24oInNlbGVjdHN0YXJ0LmRyYWciLG51bGwpOihuLnN0eWxlLk1velVzZXJTZWxlY3Q9bi5fX25vc2VsZWN0LGRlbGV0ZSBuLl9fbm9zZWxlY3QpfWZ1bmN0aW9uIEVEKHQsZSxuKXt0LnByb3RvdHlwZT1lLnByb3RvdHlwZT1uLG4uY29uc3RydWN0b3I9dH1mdW5jdGlvbiBURCh0LGUpe3ZhciBuPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpO2Zvcih2YXIgaSBpbiBlKW5baV09ZVtpXTtyZXR1cm4gbn1mdW5jdGlvbiBDRCgpe315RC5wcm90b3R5cGU9dkQucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp5RCxzZWxlY3Q6ZnVuY3Rpb24gQUQodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXl6KHQpKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49ZS5sZW5ndGgsaT1uZXcgQXJyYXkobikscj0wO3I8bjsrK3IpZm9yKHZhciBvLGEscz1lW3JdLGw9cy5sZW5ndGgsYz1pW3JdPW5ldyBBcnJheShsKSx1PTA7dTxsOysrdSkobz1zW3VdKSYmKGE9dC5jYWxsKG8sby5fX2RhdGFfXyx1LHMpKSYmKCJfX2RhdGFfXyJpbiBvJiYoYS5fX2RhdGFfXz1vLl9fZGF0YV9fKSxjW3VdPWEpO3JldHVybiBuZXcgeUQoaSx0aGlzLl9wYXJlbnRzKX0sc2VsZWN0QWxsOmZ1bmN0aW9uIGtEKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1ieih0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9W10scj1bXSxvPTA7bzxuOysrbylmb3IodmFyIGEscz1lW29dLGw9cy5sZW5ndGgsYz0wO2M8bDsrK2MpKGE9c1tjXSkmJihpLnB1c2godC5jYWxsKGEsYS5fX2RhdGFfXyxjLHMpKSxyLnB1c2goYSkpO3JldHVybiBuZXcgeUQoaSxyKX0sZmlsdGVyOmZ1bmN0aW9uIExEKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD14eih0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWZvcih2YXIgbyxhPWVbcl0scz1hLmxlbmd0aCxsPWlbcl09W10sYz0wO2M8czsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmbC5wdXNoKG8pO3JldHVybiBuZXcgeUQoaSx0aGlzLl9wYXJlbnRzKX0sZGF0YTpmdW5jdGlvbiBQRCh0LGUpe2lmKCF0KXJldHVybiBmPW5ldyBBcnJheSh0aGlzLnNpemUoKSksdT0tMSx0aGlzLmVhY2goKGZ1bmN0aW9uKHQpe2ZbKyt1XT10fSkpLGY7dmFyIG49ZT9FejpNeixpPXRoaXMuX3BhcmVudHMscj10aGlzLl9ncm91cHM7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PShmdW5jdGlvbiBvKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0pKHQpKTtmb3IodmFyIGE9ci5sZW5ndGgscz1uZXcgQXJyYXkoYSksbD1uZXcgQXJyYXkoYSksYz1uZXcgQXJyYXkoYSksdT0wO3U8YTsrK3Upe3ZhciBoPWlbdV0sZD1yW3VdLHA9ZC5sZW5ndGgsZj10LmNhbGwoaCxoJiZoLl9fZGF0YV9fLHUsaSksbT1mLmxlbmd0aCxnPWxbdV09bmV3IEFycmF5KG0pLF89c1t1XT1uZXcgQXJyYXkobSk7bihoLGQsZyxfLGNbdV09bmV3IEFycmF5KHApLGYsZSk7Zm9yKHZhciB5LHYsYj0wLHg9MDtiPG07KytiKWlmKHk9Z1tiXSl7Zm9yKGI+PXgmJih4PWIrMSk7ISh2PV9beF0pJiYrK3g8bTspO3kuX25leHQ9dnx8bnVsbH19cmV0dXJuKHM9bmV3IHlEKHMsaSkpLl9lbnRlcj1sLHMuX2V4aXQ9YyxzfSxlbnRlcjpmdW5jdGlvbiBORCgpe3JldHVybiBuZXcgeUQodGhpcy5fZW50ZXJ8fHRoaXMuX2dyb3Vwcy5tYXAod3opLHRoaXMuX3BhcmVudHMpfSxleGl0OmZ1bmN0aW9uIElEKCl7cmV0dXJuIG5ldyB5RCh0aGlzLl9leGl0fHx0aGlzLl9ncm91cHMubWFwKHd6KSx0aGlzLl9wYXJlbnRzKX0sam9pbjpmdW5jdGlvbiBSRCh0LGUsbil7dmFyIGk9dGhpcy5lbnRlcigpLHI9dGhpcyxvPXRoaXMuZXhpdCgpO3JldHVybiBpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3QoaSk6aS5hcHBlbmQodCsiIiksbnVsbCE9ZSYmKHI9ZShyKSksbnVsbD09bj9vLnJlbW92ZSgpOm4obyksaSYmcj9pLm1lcmdlKHIpLm9yZGVyKCk6cn0sbWVyZ2U6ZnVuY3Rpb24gT0QodCl7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPXQuX2dyb3VwcyxpPWUubGVuZ3RoLHI9TWF0aC5taW4oaSxuLmxlbmd0aCksbz1uZXcgQXJyYXkoaSksYT0wO2E8cjsrK2EpZm9yKHZhciBzLGw9ZVthXSxjPW5bYV0sdT1sLmxlbmd0aCxoPW9bYV09bmV3IEFycmF5KHUpLGQ9MDtkPHU7KytkKShzPWxbZF18fGNbZF0pJiYoaFtkXT1zKTtmb3IoO2E8aTsrK2Epb1thXT1lW2FdO3JldHVybiBuZXcgeUQobyx0aGlzLl9wYXJlbnRzKX0sb3JkZXI6ZnVuY3Rpb24gekQoKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLGU9LTEsbj10Lmxlbmd0aDsrK2U8bjspZm9yKHZhciBpLHI9dFtlXSxvPXIubGVuZ3RoLTEsYT1yW29dOy0tbz49MDspKGk9cltvXSkmJihhJiY0XmkuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSkmJmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaSxhKSxhPWkpO3JldHVybiB0aGlzfSxzb3J0OmZ1bmN0aW9uIEREKHQpe2Z1bmN0aW9uIGUoZSxuKXtyZXR1cm4gZSYmbj90KGUuX19kYXRhX18sbi5fX2RhdGFfXyk6IWUtIW59dHx8KHQ9VHopO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsaT1uLmxlbmd0aCxyPW5ldyBBcnJheShpKSxvPTA7bzxpOysrbyl7Zm9yKHZhciBhLHM9bltvXSxsPXMubGVuZ3RoLGM9cltvXT1uZXcgQXJyYXkobCksdT0wO3U8bDsrK3UpKGE9c1t1XSkmJihjW3VdPWEpO2Muc29ydChlKX1yZXR1cm4gbmV3IHlEKHIsdGhpcy5fcGFyZW50cykub3JkZXIoKX0sY2FsbDpmdW5jdGlvbiBCRCgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gYXJndW1lbnRzWzBdPXRoaXMsdC5hcHBseShudWxsLGFyZ3VtZW50cyksdGhpc30sbm9kZXM6ZnVuY3Rpb24gSEQoKXt2YXIgdD1uZXcgQXJyYXkodGhpcy5zaXplKCkpLGU9LTE7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXt0WysrZV09dGhpc30pKSx0fSxub2RlOmZ1bmN0aW9uIEZEKCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxlPTAsbj10Lmxlbmd0aDtlPG47KytlKWZvcih2YXIgaT10W2VdLHI9MCxvPWkubGVuZ3RoO3I8bzsrK3Ipe3ZhciBhPWlbcl07aWYoYSlyZXR1cm4gYX1yZXR1cm4gbnVsbH0sc2l6ZTpmdW5jdGlvbiBWRCgpe3ZhciB0PTA7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXsrK3R9KSksdH0sZW1wdHk6ZnVuY3Rpb24gVUQoKXtyZXR1cm4hdGhpcy5ub2RlKCl9LGVhY2g6ZnVuY3Rpb24gakQodCl7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPTAsaT1lLmxlbmd0aDtuPGk7KytuKWZvcih2YXIgcixvPWVbbl0sYT0wLHM9by5sZW5ndGg7YTxzOysrYSkocj1vW2FdKSYmdC5jYWxsKHIsci5fX2RhdGFfXyxhLG8pO3JldHVybiB0aGlzfSxhdHRyOmZ1bmN0aW9uIEdEKHQsZSl7dmFyIG49cHoodCk7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgaT10aGlzLm5vZGUoKTtyZXR1cm4gbi5sb2NhbD9pLmdldEF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCk6aS5nZXRBdHRyaWJ1dGUobil9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09ZT9uLmxvY2FsP0F6OkN6OiJmdW5jdGlvbiI9PXR5cGVvZiBlP24ubG9jYWw/Tno6UHo6bi5sb2NhbD9MejpreikobixlKSl9LHN0eWxlOmZ1bmN0aW9uIFdEKHQsZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09ZT9SejoiZnVuY3Rpb24iPT10eXBlb2YgZT96ejpPeikodCxlLG51bGw9PW4/IiI6bikpOkR6KHRoaXMubm9kZSgpLHQpfSxwcm9wZXJ0eTpmdW5jdGlvbiBxRCh0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKChudWxsPT1lP0J6OiJmdW5jdGlvbiI9PXR5cGVvZiBlP0Z6Okh6KSh0LGUpKTp0aGlzLm5vZGUoKVt0XX0sY2xhc3NlZDpmdW5jdGlvbiBZRCh0LGUpe3ZhciBuPVZ6KHQrIiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciBpPVV6KHRoaXMubm9kZSgpKSxyPS0xLG89bi5sZW5ndGg7KytyPG87KWlmKCFpLmNvbnRhaW5zKG5bcl0pKXJldHVybiExO3JldHVybiEwfXJldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBlP1h6OmU/cXo6WXopKG4sZSkpfSx0ZXh0OmZ1bmN0aW9uIFhEKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10PyR6OigiZnVuY3Rpb24iPT10eXBlb2YgdD9aejpLeikodCkpOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxodG1sOmZ1bmN0aW9uICREKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P0p6OigiZnVuY3Rpb24iPT10eXBlb2YgdD90RDpReikodCkpOnRoaXMubm9kZSgpLmlubmVySFRNTH0scmFpc2U6ZnVuY3Rpb24gS0QoKXtyZXR1cm4gdGhpcy5lYWNoKGVEKX0sbG93ZXI6ZnVuY3Rpb24gWkQoKXtyZXR1cm4gdGhpcy5lYWNoKG5EKX0sYXBwZW5kOmZ1bmN0aW9uIEpEKHQpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Z3oodCk7cmV0dXJuIHRoaXMuc2VsZWN0KChmdW5jdGlvbigpe3JldHVybiB0aGlzLmFwcGVuZENoaWxkKGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0pKX0saW5zZXJ0OmZ1bmN0aW9uIFFEKHQsZSl7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpneih0KSxpPW51bGw9PWU/aUQ6ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTp5eihlKTtyZXR1cm4gdGhpcy5zZWxlY3QoKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpfHxudWxsKX0pKX0scmVtb3ZlOmZ1bmN0aW9uIHRCKCl7cmV0dXJuIHRoaXMuZWFjaChyRCl9LGNsb25lOmZ1bmN0aW9uIGVCKHQpe3JldHVybiB0aGlzLnNlbGVjdCh0P2FEOm9EKX0sZGF0dW06ZnVuY3Rpb24gbkIodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLHQpOnRoaXMubm9kZSgpLl9fZGF0YV9ffSxvbjpmdW5jdGlvbiBpQih0LGUsbil7dmFyIGkscixvPWhEKHQrIiIpLGE9by5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtmb3Iocz1lP3BEOmRELG51bGw9PW4mJihuPSExKSxpPTA7aTxhOysraSl0aGlzLmVhY2gocyhvW2ldLGUsbikpO3JldHVybiB0aGlzfXZhciBzPXRoaXMubm9kZSgpLl9fb247aWYocylmb3IodmFyIGwsYz0wLHU9cy5sZW5ndGg7Yzx1OysrYylmb3IoaT0wLGw9c1tjXTtpPGE7KytpKWlmKChyPW9baV0pLnR5cGU9PT1sLnR5cGUmJnIubmFtZT09PWwubmFtZSlyZXR1cm4gbC52YWx1ZX0sZGlzcGF0Y2g6ZnVuY3Rpb24gckIodCxlKXtyZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgZT9nRDptRCkodCxlKSl9fTt2YXIgb0I9LjcsYUI9MS9vQixzQj0iXFxzKihbKy1dP1xcZCspXFxzKiIsbEI9IlxccyooWystXT9cXGQqXFwuP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pXFxzKiIsY0I9IlxccyooWystXT9cXGQqXFwuP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pJVxccyoiLHVCPS9eIyhbMC05YS1mXXszLDh9KSQvLGhCPW5ldyBSZWdFeHAoIl5yZ2JcXCgiK1tzQixzQixzQl0rIlxcKSQiKSxkQj1uZXcgUmVnRXhwKCJecmdiXFwoIitbY0IsY0IsY0JdKyJcXCkkIikscEI9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tzQixzQixzQixsQl0rIlxcKSQiKSxmQj1uZXcgUmVnRXhwKCJecmdiYVxcKCIrW2NCLGNCLGNCLGxCXSsiXFwpJCIpLG1CPW5ldyBSZWdFeHAoIl5oc2xcXCgiK1tsQixjQixjQl0rIlxcKSQiKSxnQj1uZXcgUmVnRXhwKCJeaHNsYVxcKCIrW2xCLGNCLGNCLGxCXSsiXFwpJCIpLF9CPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O2Z1bmN0aW9uIHlCKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4KCl9ZnVuY3Rpb24gdkIoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKX1mdW5jdGlvbiBiQih0KXt2YXIgZSxuO3JldHVybiB0PSh0KyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwoZT11Qi5leGVjKHQpKT8obj1lWzFdLmxlbmd0aCxlPXBhcnNlSW50KGVbMV0sMTYpLDY9PT1uP3hCKGUpOjM9PT1uP25ldyBFQihlPj44JjE1fGU+PjQmMjQwLGU+PjQmMTV8MjQwJmUsKDE1JmUpPDw0fDE1JmUsMSk6OD09PW4/d0IoZT4+MjQmMjU1LGU+PjE2JjI1NSxlPj44JjI1NSwoMjU1JmUpLzI1NSk6ND09PW4/d0IoZT4+MTImMTV8ZT4+OCYyNDAsZT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgoMTUmZSk8PDR8MTUmZSkvMjU1KTpudWxsKTooZT1oQi5leGVjKHQpKT9uZXcgRUIoZVsxXSxlWzJdLGVbM10sMSk6KGU9ZEIuZXhlYyh0KSk/bmV3IEVCKDI1NSplWzFdLzEwMCwyNTUqZVsyXS8xMDAsMjU1KmVbM10vMTAwLDEpOihlPXBCLmV4ZWModCkpP3dCKGVbMV0sZVsyXSxlWzNdLGVbNF0pOihlPWZCLmV4ZWModCkpP3dCKDI1NSplWzFdLzEwMCwyNTUqZVsyXS8xMDAsMjU1KmVbM10vMTAwLGVbNF0pOihlPW1CLmV4ZWModCkpP2tCKGVbMV0sZVsyXS8xMDAsZVszXS8xMDAsMSk6KGU9Z0IuZXhlYyh0KSk/a0IoZVsxXSxlWzJdLzEwMCxlWzNdLzEwMCxlWzRdKTpfQi5oYXNPd25Qcm9wZXJ0eSh0KT94QihfQlt0XSk6InRyYW5zcGFyZW50Ij09PXQ/bmV3IEVCKE5hTixOYU4sTmFOLDApOm51bGx9ZnVuY3Rpb24geEIodCl7cmV0dXJuIG5ldyBFQih0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQsMSl9ZnVuY3Rpb24gd0IodCxlLG4saSl7cmV0dXJuIGk8PTAmJih0PWU9bj1OYU4pLG5ldyBFQih0LGUsbixpKX1mdW5jdGlvbiBTQih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIENEfHwodD1iQih0KSksdD9uZXcgRUIoKHQ9dC5yZ2IoKSkucix0LmcsdC5iLHQub3BhY2l0eSk6bmV3IEVCfWZ1bmN0aW9uIE1CKHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9TQih0KTpuZXcgRUIodCxlLG4sbnVsbD09aT8xOmkpfWZ1bmN0aW9uIEVCKHQsZSxuLGkpe3RoaXMucj0rdCx0aGlzLmc9K2UsdGhpcy5iPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiBUQigpe3JldHVybiIjIitBQih0aGlzLnIpK0FCKHRoaXMuZykrQUIodGhpcy5iKX1mdW5jdGlvbiBDQigpe3ZhciB0PXRoaXMub3BhY2l0eTtyZXR1cm4oMT09PSh0PWlzTmFOKHQpPzE6TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSk/InJnYigiOiJyZ2JhKCIpK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5yKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmcpfHwwKSkrIiwgIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMuYil8fDApKSsoMT09PXQ/IikiOiIsICIrdCsiKSIpfWZ1bmN0aW9uIEFCKHQpe3JldHVybigodD1NYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHQpfHwwKSkpPDE2PyIwIjoiIikrdC50b1N0cmluZygxNil9ZnVuY3Rpb24ga0IodCxlLG4saSl7cmV0dXJuIGk8PTA/dD1lPW49TmFOOm48PTB8fG4+PTE/dD1lPU5hTjplPD0wJiYodD1OYU4pLG5ldyBQQih0LGUsbixpKX1mdW5jdGlvbiBMQih0KXtpZih0IGluc3RhbmNlb2YgUEIpcmV0dXJuIG5ldyBQQih0LmgsdC5zLHQubCx0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiBDRHx8KHQ9YkIodCkpLCF0KXJldHVybiBuZXcgUEI7aWYodCBpbnN0YW5jZW9mIFBCKXJldHVybiB0O3ZhciBlPSh0PXQucmdiKCkpLnIvMjU1LG49dC5nLzI1NSxpPXQuYi8yNTUscj1NYXRoLm1pbihlLG4saSksbz1NYXRoLm1heChlLG4saSksYT1OYU4scz1vLXIsbD0obytyKS8yO3JldHVybiBzPyhhPWU9PT1vPyhuLWkpL3MrNioobjxpKTpuPT09bz8oaS1lKS9zKzI6KGUtbikvcys0LHMvPWw8LjU/bytyOjItby1yLGEqPTYwKTpzPWw+MCYmbDwxPzA6YSxuZXcgUEIoYSxzLGwsdC5vcGFjaXR5KX1mdW5jdGlvbiBQQih0LGUsbixpKXt0aGlzLmg9K3QsdGhpcy5zPStlLHRoaXMubD0rbix0aGlzLm9wYWNpdHk9K2l9ZnVuY3Rpb24gTkIodCxlLG4pe3JldHVybiAyNTUqKHQ8NjA/ZSsobi1lKSp0LzYwOnQ8MTgwP246dDwyNDA/ZSsobi1lKSooMjQwLXQpLzYwOmUpfWZ1bmN0aW9uIElCKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBSQih0LGUpe3ZhciBuPWUtdDtyZXR1cm4gbj8oZnVuY3Rpb24gaSh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdCtuKmV9fSkodCxuKTpJQihpc05hTih0KT9lOnQpfUVEKENELGJCLHtjb3B5OmZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLHRoaXMsdCl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKX0saGV4OnlCLGZvcm1hdEhleDp5Qixmb3JtYXRIc2w6ZnVuY3Rpb24gT0IoKXtyZXR1cm4gTEIodGhpcykuZm9ybWF0SHNsKCl9LGZvcm1hdFJnYjp2Qix0b1N0cmluZzp2Qn0pLEVEKEVCLE1CLFREKENELHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P2FCOk1hdGgucG93KGFCLHQpLG5ldyBFQih0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9vQjpNYXRoLnBvdyhvQix0KSxuZXcgRUIodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuLS41PD10aGlzLnImJnRoaXMucjwyNTUuNSYmLS41PD10aGlzLmcmJnRoaXMuZzwyNTUuNSYmLS41PD10aGlzLmImJnRoaXMuYjwyNTUuNSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGhleDpUQixmb3JtYXRIZXg6VEIsZm9ybWF0UmdiOkNCLHRvU3RyaW5nOkNCfSkpLEVEKFBCLChmdW5jdGlvbiB6Qih0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/TEIodCk6bmV3IFBCKHQsZSxuLG51bGw9PWk/MTppKX0pLFREKENELHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P2FCOk1hdGgucG93KGFCLHQpLG5ldyBQQih0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P29COk1hdGgucG93KG9CLHQpLG5ldyBQQih0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaCUzNjArMzYwKih0aGlzLmg8MCksZT1pc05hTih0KXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxuPXRoaXMubCxpPW4rKG48LjU/bjoxLW4pKmUscj0yKm4taTtyZXR1cm4gbmV3IEVCKE5CKHQ+PTI0MD90LTI0MDp0KzEyMCxyLGkpLE5CKHQscixpKSxOQih0PDEyMD90KzI0MDp0LTEyMCxyLGkpLHRoaXMub3BhY2l0eSl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxmb3JtYXRIc2w6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJoc2woIjoiaHNsYSgiKSsodGhpcy5ofHwwKSsiLCAiKzEwMCoodGhpcy5zfHwwKSsiJSwgIisxMDAqKHRoaXMubHx8MCkrIiUiKygxPT09dD8iKSI6IiwgIit0KyIpIil9fSkpO3ZhciBEQj0oZnVuY3Rpb24gdChlKXt2YXIgbj0oZnVuY3Rpb24gaSh0KXtyZXR1cm4gMT09KHQ9K3QpP1JCOmZ1bmN0aW9uKGUsbil7cmV0dXJuIG4tZT8oZnVuY3Rpb24gaSh0LGUsbil7cmV0dXJuIHQ9TWF0aC5wb3codCxuKSxlPU1hdGgucG93KGUsbiktdCxuPTEvbixmdW5jdGlvbihpKXtyZXR1cm4gTWF0aC5wb3codCtpKmUsbil9fSkoZSxuLHQpOklCKGlzTmFOKGUpP246ZSl9fSkoZSk7ZnVuY3Rpb24gcih0LGUpe3ZhciBpPW4oKHQ9TUIodCkpLnIsKGU9TUIoZSkpLnIpLHI9bih0LmcsZS5nKSxvPW4odC5iLGUuYiksYT1SQih0Lm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQucj1pKGUpLHQuZz1yKGUpLHQuYj1vKGUpLHQub3BhY2l0eT1hKGUpLHQrIiJ9fXJldHVybiByLmdhbW1hPXQscn0pKDEpO2Z1bmN0aW9uIEJCKHQsZSl7ZXx8KGU9W10pO3ZhciBuLGk9dD9NYXRoLm1pbihlLmxlbmd0aCx0Lmxlbmd0aCk6MCxyPWUuc2xpY2UoKTtyZXR1cm4gZnVuY3Rpb24obyl7Zm9yKG49MDtuPGk7KytuKXJbbl09dFtuXSooMS1vKStlW25dKm87cmV0dXJuIHJ9fWZ1bmN0aW9uIEhCKHQsZSl7dmFyIG4saT1lP2UubGVuZ3RoOjAscj10P01hdGgubWluKGksdC5sZW5ndGgpOjAsbz1uZXcgQXJyYXkociksYT1uZXcgQXJyYXkoaSk7Zm9yKG49MDtuPHI7KytuKW9bbl09cUIodFtuXSxlW25dKTtmb3IoO248aTsrK24pYVtuXT1lW25dO3JldHVybiBmdW5jdGlvbih0KXtmb3Iobj0wO248cjsrK24pYVtuXT1vW25dKHQpO3JldHVybiBhfX1mdW5jdGlvbiBGQih0LGUpe3ZhciBuPW5ldyBEYXRlO3JldHVybiB0PSt0LGU9K2UsZnVuY3Rpb24oaSl7cmV0dXJuIG4uc2V0VGltZSh0KigxLWkpK2UqaSksbn19ZnVuY3Rpb24gVkIodCxlKXtyZXR1cm4gdD0rdCxlPStlLGZ1bmN0aW9uKG4pe3JldHVybiB0KigxLW4pK2Uqbn19ZnVuY3Rpb24gVUIodCxlKXt2YXIgbixpPXt9LHI9e307Zm9yKG4gaW4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdHx8KHQ9e30pLG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV8fChlPXt9KSxlKW4gaW4gdD9pW25dPXFCKHRbbl0sZVtuXSk6cltuXT1lW25dO3JldHVybiBmdW5jdGlvbih0KXtmb3IobiBpbiBpKXJbbl09aVtuXSh0KTtyZXR1cm4gcn19dmFyIGpCPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxHQj1uZXcgUmVnRXhwKGpCLnNvdXJjZSwiZyIpO2Z1bmN0aW9uIFdCKHQsZSl7dmFyIG4saSxyLG89akIubGFzdEluZGV4PUdCLmxhc3RJbmRleD0wLGE9LTEscz1bXSxsPVtdO2Zvcih0Kz0iIixlKz0iIjsobj1qQi5leGVjKHQpKSYmKGk9R0IuZXhlYyhlKSk7KShyPWkuaW5kZXgpPm8mJihyPWUuc2xpY2UobyxyKSxzW2FdP3NbYV0rPXI6c1srK2FdPXIpLChuPW5bMF0pPT09KGk9aVswXSk/c1thXT9zW2FdKz1pOnNbKythXT1pOihzWysrYV09bnVsbCxsLnB1c2goe2k6YSx4OlZCKG4saSl9KSksbz1HQi5sYXN0SW5kZXg7cmV0dXJuIG88ZS5sZW5ndGgmJihyPWUuc2xpY2Uobyksc1thXT9zW2FdKz1yOnNbKythXT1yKSxzLmxlbmd0aDwyP2xbMF0/KGZ1bmN0aW9uIGModCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpKyIifX0pKGxbMF0ueCk6KGZ1bmN0aW9uIHUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSkoZSk6KGU9bC5sZW5ndGgsZnVuY3Rpb24odCl7Zm9yKHZhciBuLGk9MDtpPGU7KytpKXNbKG49bFtpXSkuaV09bi54KHQpO3JldHVybiBzLmpvaW4oIiIpfSl9ZnVuY3Rpb24gcUIodCxlKXt2YXIgbixpPXR5cGVvZiBlO3JldHVybiBudWxsPT1lfHwiYm9vbGVhbiI9PT1pP0lCKGUpOigibnVtYmVyIj09PWk/VkI6InN0cmluZyI9PT1pPyhuPWJCKGUpKT8oZT1uLERCKTpXQjplIGluc3RhbmNlb2YgYkI/REI6ZSBpbnN0YW5jZW9mIERhdGU/RkI6KGZ1bmN0aW9uIHIodCl7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyh0KSYmISh0IGluc3RhbmNlb2YgRGF0YVZpZXcpfSkoZSk/QkI6QXJyYXkuaXNBcnJheShlKT9IQjoiZnVuY3Rpb24iIT10eXBlb2YgZS52YWx1ZU9mJiYiZnVuY3Rpb24iIT10eXBlb2YgZS50b1N0cmluZ3x8aXNOYU4oZSk/VUI6VkIpKHQsZSl9dmFyIFlCLFhCLCRCLEtCLFpCPTE4MC9NYXRoLlBJLEpCPXt0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTowLHJvdGF0ZTowLHNrZXdYOjAsc2NhbGVYOjEsc2NhbGVZOjF9O2Z1bmN0aW9uIFFCKHQsZSxuLGkscixvKXt2YXIgYSxzLGw7cmV0dXJuKGE9TWF0aC5zcXJ0KHQqdCtlKmUpKSYmKHQvPWEsZS89YSksKGw9dCpuK2UqaSkmJihuLT10KmwsaS09ZSpsKSwocz1NYXRoLnNxcnQobipuK2kqaSkpJiYobi89cyxpLz1zLGwvPXMpLHQqaTxlKm4mJih0PS10LGU9LWUsbD0tbCxhPS1hKSx7dHJhbnNsYXRlWDpyLHRyYW5zbGF0ZVk6byxyb3RhdGU6TWF0aC5hdGFuMihlLHQpKlpCLHNrZXdYOk1hdGguYXRhbihsKSpaQixzY2FsZVg6YSxzY2FsZVk6c319ZnVuY3Rpb24gdEgodCxlLG4saSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdC5sZW5ndGg/dC5wb3AoKSsiICI6IiJ9cmV0dXJuIGZ1bmN0aW9uKG8sYSl7dmFyIHM9W10sbD1bXTtyZXR1cm4gbz10KG8pLGE9dChhKSwoZnVuY3Rpb24gYyh0LGkscixvLGEscyl7aWYodCE9PXJ8fGkhPT1vKXt2YXIgbD1hLnB1c2goInRyYW5zbGF0ZSgiLG51bGwsZSxudWxsLG4pO3MucHVzaCh7aTpsLTQseDpWQih0LHIpfSx7aTpsLTIseDpWQihpLG8pfSl9ZWxzZShyfHxvKSYmYS5wdXNoKCJ0cmFuc2xhdGUoIityK2UrbytuKX0pKG8udHJhbnNsYXRlWCxvLnRyYW5zbGF0ZVksYS50cmFuc2xhdGVYLGEudHJhbnNsYXRlWSxzLGwpLChmdW5jdGlvbiB1KHQsZSxuLG8pe3QhPT1lPyh0LWU+MTgwP2UrPTM2MDplLXQ+MTgwJiYodCs9MzYwKSxvLnB1c2goe2k6bi5wdXNoKHIobikrInJvdGF0ZSgiLG51bGwsaSktMix4OlZCKHQsZSl9KSk6ZSYmbi5wdXNoKHIobikrInJvdGF0ZSgiK2UraSl9KShvLnJvdGF0ZSxhLnJvdGF0ZSxzLGwpLChmdW5jdGlvbiBoKHQsZSxuLG8pe3QhPT1lP28ucHVzaCh7aTpuLnB1c2gocihuKSsic2tld1goIixudWxsLGkpLTIseDpWQih0LGUpfSk6ZSYmbi5wdXNoKHIobikrInNrZXdYKCIrZStpKX0pKG8uc2tld1gsYS5za2V3WCxzLGwpLChmdW5jdGlvbiBkKHQsZSxuLGksbyxhKXtpZih0IT09bnx8ZSE9PWkpe3ZhciBzPW8ucHVzaChyKG8pKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKTthLnB1c2goe2k6cy00LHg6VkIodCxuKX0se2k6cy0yLHg6VkIoZSxpKX0pfWVsc2UgMT09PW4mJjE9PT1pfHxvLnB1c2gocihvKSsic2NhbGUoIituKyIsIitpKyIpIil9KShvLnNjYWxlWCxvLnNjYWxlWSxhLnNjYWxlWCxhLnNjYWxlWSxzLGwpLG89YT1udWxsLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPS0xLGk9bC5sZW5ndGg7KytuPGk7KXNbKGU9bFtuXSkuaV09ZS54KHQpO3JldHVybiBzLmpvaW4oIiIpfX19dmFyIGVILG5ILGlIPXRIKChmdW5jdGlvbiBySCh0KXtyZXR1cm4ibm9uZSI9PT10P0pCOihZQnx8KFlCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLFhCPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwkQj1kb2N1bWVudC5kZWZhdWx0VmlldyksWUIuc3R5bGUudHJhbnNmb3JtPXQsdD0kQi5nZXRDb21wdXRlZFN0eWxlKFhCLmFwcGVuZENoaWxkKFlCKSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKSxYQi5yZW1vdmVDaGlsZChZQiksUUIoKyh0PXQuc2xpY2UoNywtMSkuc3BsaXQoIiwiKSlbMF0sK3RbMV0sK3RbMl0sK3RbM10sK3RbNF0sK3RbNV0pKX0pLCJweCwgIiwicHgpIiwiZGVnKSIpLG9IPXRIKChmdW5jdGlvbiBhSCh0KXtyZXR1cm4gbnVsbD09dD9KQjooS0J8fChLQj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwiZyIpKSxLQi5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsdCksKHQ9S0IudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKSk/UUIoKHQ9dC5tYXRyaXgpLmEsdC5iLHQuYyx0LmQsdC5lLHQuZik6SkIpfSksIiwgIiwiKSIsIikiKSxzSD0wLGxIPTAsY0g9MCx1SD0wLGhIPTAsZEg9MCxwSD0ib2JqZWN0Ij09dHlwZW9mIHBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2U6RGF0ZSxmSD0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTcpfTtmdW5jdGlvbiBtSCgpe3JldHVybiBoSHx8KGZIKGdIKSxoSD1wSC5ub3coKStkSCl9ZnVuY3Rpb24gZ0goKXtoSD0wfWZ1bmN0aW9uIF9IKCl7dGhpcy5fY2FsbD10aGlzLl90aW1lPXRoaXMuX25leHQ9bnVsbH1mdW5jdGlvbiB5SCh0LGUsbil7dmFyIGk9bmV3IF9IO3JldHVybiBpLnJlc3RhcnQodCxlLG4pLGl9ZnVuY3Rpb24gdkgoKXtoSD0odUg9cEgubm93KCkpK2RILHNIPWxIPTA7dHJ5eyEoZnVuY3Rpb24gdCgpe21IKCksKytzSDtmb3IodmFyIHQsZT1lSDtlOykodD1oSC1lLl90aW1lKT49MCYmZS5fY2FsbC5jYWxsKG51bGwsdCksZT1lLl9uZXh0Oy0tc0h9KSgpfWZpbmFsbHl7c0g9MCwoZnVuY3Rpb24gZSgpe2Zvcih2YXIgdCxlLG49ZUgsaT0xLzA7bjspbi5fY2FsbD8oaT5uLl90aW1lJiYoaT1uLl90aW1lKSx0PW4sbj1uLl9uZXh0KTooZT1uLl9uZXh0LG4uX25leHQ9bnVsbCxuPXQ/dC5fbmV4dD1lOmVIPWUpO25IPXQseEgoaSl9KSgpLGhIPTB9fWZ1bmN0aW9uIGJIKCl7dmFyIHQ9cEgubm93KCksZT10LXVIO2U+MWUzJiYoZEgtPWUsdUg9dCl9ZnVuY3Rpb24geEgodCl7c0h8fChsSCYmKGxIPWNsZWFyVGltZW91dChsSCkpLHQtaEg+MjQ/KHQ8MS8wJiYobEg9c2V0VGltZW91dCh2SCx0LXBILm5vdygpLWRIKSksY0gmJihjSD1jbGVhckludGVydmFsKGNIKSkpOihjSHx8KHVIPXBILm5vdygpLGNIPXNldEludGVydmFsKGJILDFlMykpLHNIPTEsZkgodkgpKSl9ZnVuY3Rpb24gd0godCxlLG4pe3ZhciBpPW5ldyBfSDtyZXR1cm4gaS5yZXN0YXJ0KChmdW5jdGlvbihuKXtpLnN0b3AoKSx0KG4rZSl9KSxlPW51bGw9PWU/MDorZSxuKSxpfV9ILnByb3RvdHlwZT15SC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOl9ILHJlc3RhcnQ6ZnVuY3Rpb24odCxlLG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uIik7bj0obnVsbD09bj9tSCgpOituKSsobnVsbD09ZT8wOitlKSx0aGlzLl9uZXh0fHxuSD09PXRoaXN8fChuSD9uSC5fbmV4dD10aGlzOmVIPXRoaXMsbkg9dGhpcyksdGhpcy5fY2FsbD10LHRoaXMuX3RpbWU9bix4SCgpfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5fY2FsbCYmKHRoaXMuX2NhbGw9bnVsbCx0aGlzLl90aW1lPTEvMCx4SCgpKX19O3ZhciBTSD1heigic3RhcnQiLCJlbmQiLCJjYW5jZWwiLCJpbnRlcnJ1cHQiKSxNSD1bXTtmdW5jdGlvbiBFSCh0LGUsbixpLHIsbyl7dmFyIGE9dC5fX3RyYW5zaXRpb247aWYoYSl7aWYobiBpbiBhKXJldHVybn1lbHNlIHQuX190cmFuc2l0aW9uPXt9OyEoZnVuY3Rpb24gcyh0LGUsbil7dmFyIGkscj10Ll9fdHJhbnNpdGlvbjtmdW5jdGlvbiBvKGwpe3ZhciBjLHUsaCxkO2lmKDEhPT1uLnN0YXRlKXJldHVybiBzKCk7Zm9yKGMgaW4gcilpZigoZD1yW2NdKS5uYW1lPT09bi5uYW1lKXtpZigzPT09ZC5zdGF0ZSlyZXR1cm4gd0gobyk7ND09PWQuc3RhdGU/KGQuc3RhdGU9NixkLnRpbWVyLnN0b3AoKSxkLm9uLmNhbGwoImludGVycnVwdCIsdCx0Ll9fZGF0YV9fLGQuaW5kZXgsZC5ncm91cCksZGVsZXRlIHJbY10pOitjPGUmJihkLnN0YXRlPTYsZC50aW1lci5zdG9wKCksZC5vbi5jYWxsKCJjYW5jZWwiLHQsdC5fX2RhdGFfXyxkLmluZGV4LGQuZ3JvdXApLGRlbGV0ZSByW2NdKX1pZih3SCgoZnVuY3Rpb24oKXszPT09bi5zdGF0ZSYmKG4uc3RhdGU9NCxuLnRpbWVyLnJlc3RhcnQoYSxuLmRlbGF5LG4udGltZSksYShsKSl9KSksbi5zdGF0ZT0yLG4ub24uY2FsbCgic3RhcnQiLHQsdC5fX2RhdGFfXyxuLmluZGV4LG4uZ3JvdXApLDI9PT1uLnN0YXRlKXtmb3Iobi5zdGF0ZT0zLGk9bmV3IEFycmF5KGg9bi50d2Vlbi5sZW5ndGgpLGM9MCx1PS0xO2M8aDsrK2MpKGQ9bi50d2VlbltjXS52YWx1ZS5jYWxsKHQsdC5fX2RhdGFfXyxuLmluZGV4LG4uZ3JvdXApKSYmKGlbKyt1XT1kKTtpLmxlbmd0aD11KzF9fWZ1bmN0aW9uIGEoZSl7Zm9yKHZhciByPWU8bi5kdXJhdGlvbj9uLmVhc2UuY2FsbChudWxsLGUvbi5kdXJhdGlvbik6KG4udGltZXIucmVzdGFydChzKSxuLnN0YXRlPTUsMSksbz0tMSxhPWkubGVuZ3RoOysrbzxhOylpW29dLmNhbGwodCxyKTs1PT09bi5zdGF0ZSYmKG4ub24uY2FsbCgiZW5kIix0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSxzKCkpfWZ1bmN0aW9uIHMoKXtmb3IodmFyIGkgaW4gbi5zdGF0ZT02LG4udGltZXIuc3RvcCgpLGRlbGV0ZSByW2VdLHIpcmV0dXJuO2RlbGV0ZSB0Ll9fdHJhbnNpdGlvbn1yW2VdPW4sbi50aW1lcj15SCgoZnVuY3Rpb24gbCh0KXtuLnN0YXRlPTEsbi50aW1lci5yZXN0YXJ0KG8sbi5kZWxheSxuLnRpbWUpLG4uZGVsYXk8PXQmJm8odC1uLmRlbGF5KX0pLDAsbi50aW1lKX0pKHQsbix7bmFtZTplLGluZGV4OmksZ3JvdXA6cixvbjpTSCx0d2VlbjpNSCx0aW1lOm8udGltZSxkZWxheTpvLmRlbGF5LGR1cmF0aW9uOm8uZHVyYXRpb24sZWFzZTpvLmVhc2UsdGltZXI6bnVsbCxzdGF0ZTowfSl9ZnVuY3Rpb24gVEgodCxlKXt2YXIgbj1BSCh0LGUpO2lmKG4uc3RhdGU+MCl0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZCIpO3JldHVybiBufWZ1bmN0aW9uIENIKHQsZSl7dmFyIG49QUgodCxlKTtpZihuLnN0YXRlPjMpdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFkeSBydW5uaW5nIik7cmV0dXJuIG59ZnVuY3Rpb24gQUgodCxlKXt2YXIgbj10Ll9fdHJhbnNpdGlvbjtpZighbnx8IShuPW5bZV0pKXRocm93IG5ldyBFcnJvcigidHJhbnNpdGlvbiBub3QgZm91bmQiKTtyZXR1cm4gbn1mdW5jdGlvbiBrSCh0LGUpe3ZhciBuLGkscixvPXQuX190cmFuc2l0aW9uLGE9ITA7aWYobyl7Zm9yKHIgaW4gZT1udWxsPT1lP251bGw6ZSsiIixvKShuPW9bcl0pLm5hbWU9PT1lPyhpPW4uc3RhdGU+MiYmbi5zdGF0ZTw1LG4uc3RhdGU9NixuLnRpbWVyLnN0b3AoKSxuLm9uLmNhbGwoaT8iaW50ZXJydXB0IjoiY2FuY2VsIix0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSxkZWxldGUgb1tyXSk6YT0hMTthJiZkZWxldGUgdC5fX3RyYW5zaXRpb259fWZ1bmN0aW9uIExIKHQsZSl7dmFyIG4saTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1DSCh0aGlzLHQpLG89ci50d2VlbjtpZihvIT09bilmb3IodmFyIGE9MCxzPShpPW49bykubGVuZ3RoO2E8czsrK2EpaWYoaVthXS5uYW1lPT09ZSl7KGk9aS5zbGljZSgpKS5zcGxpY2UoYSwxKTticmVha31yLnR3ZWVuPWl9fWZ1bmN0aW9uIFBIKHQsZSxuKXt2YXIgaSxyO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1DSCh0aGlzLHQpLGE9by50d2VlbjtpZihhIT09aSl7cj0oaT1hKS5zbGljZSgpO2Zvcih2YXIgcz17bmFtZTplLHZhbHVlOm59LGw9MCxjPXIubGVuZ3RoO2w8YzsrK2wpaWYocltsXS5uYW1lPT09ZSl7cltsXT1zO2JyZWFrfWw9PT1jJiZyLnB1c2gocyl9by50d2Vlbj1yfX1mdW5jdGlvbiBOSCh0LGUsbil7dmFyIGk9dC5faWQ7cmV0dXJuIHQuZWFjaCgoZnVuY3Rpb24oKXt2YXIgdD1DSCh0aGlzLGkpOyh0LnZhbHVlfHwodC52YWx1ZT17fSkpW2VdPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpfSkpLGZ1bmN0aW9uKHQpe3JldHVybiBBSCh0LGkpLnZhbHVlW2VdfX1mdW5jdGlvbiBJSCh0LGUpe3ZhciBuO3JldHVybigibnVtYmVyIj09dHlwZW9mIGU/VkI6ZSBpbnN0YW5jZW9mIGJCP0RCOihuPWJCKGUpKT8oZT1uLERCKTpXQikodCxlKX1mdW5jdGlvbiBSSCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19ZnVuY3Rpb24gT0godCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiB6SCh0LGUsbil7dmFyIGkscixvPW4rIiI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRBdHRyaWJ1dGUodCk7cmV0dXJuIGE9PT1vP251bGw6YT09PWk/cjpyPWUoaT1hLG4pfX1mdW5jdGlvbiBESCh0LGUsbil7dmFyIGkscixvPW4rIiI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpO3JldHVybiBhPT09bz9udWxsOmE9PT1pP3I6cj1lKGk9YSxuKX19ZnVuY3Rpb24gQkgodCxlLG4pe3ZhciBpLHIsbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYSxzLGw9bih0aGlzKTtpZihudWxsIT1sKXJldHVybihhPXRoaXMuZ2V0QXR0cmlidXRlKHQpKT09PShzPWwrIiIpP251bGw6YT09PWkmJnM9PT1yP286KHI9cyxvPWUoaT1hLGwpKTt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19ZnVuY3Rpb24gSEgodCxlLG4pe3ZhciBpLHIsbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYSxzLGw9bih0aGlzKTtpZihudWxsIT1sKXJldHVybihhPXRoaXMuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKSk9PT0ocz1sKyIiKT9udWxsOmE9PT1pJiZzPT09cj9vOihyPXMsbz1lKGk9YSxsKSk7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBGSCh0LGUpe3JldHVybiBmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZSh0LGUuY2FsbCh0aGlzLG4pKX19ZnVuY3Rpb24gVkgodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsZS5jYWxsKHRoaXMsbikpfX1mdW5jdGlvbiBVSCh0LGUpe3ZhciBuLGk7ZnVuY3Rpb24gcigpe3ZhciByPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiByIT09aSYmKG49KGk9cikmJlZIKHQscikpLG59cmV0dXJuIHIuX3ZhbHVlPWUscn1mdW5jdGlvbiBqSCh0LGUpe3ZhciBuLGk7ZnVuY3Rpb24gcigpe3ZhciByPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiByIT09aSYmKG49KGk9cikmJkZIKHQscikpLG59cmV0dXJuIHIuX3ZhbHVlPWUscn1mdW5jdGlvbiBHSCh0LGUpe3JldHVybiBmdW5jdGlvbigpe1RIKHRoaXMsdCkuZGVsYXk9K2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBXSCh0LGUpe3JldHVybiBlPStlLGZ1bmN0aW9uKCl7VEgodGhpcyx0KS5kZWxheT1lfX1mdW5jdGlvbiBxSCh0LGUpe3JldHVybiBmdW5jdGlvbigpe0NIKHRoaXMsdCkuZHVyYXRpb249K2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBZSCh0LGUpe3JldHVybiBlPStlLGZ1bmN0aW9uKCl7Q0godGhpcyx0KS5kdXJhdGlvbj1lfX1mdW5jdGlvbiBYSCh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZnVuY3Rpb24oKXtDSCh0aGlzLHQpLmVhc2U9ZX19ZnVuY3Rpb24gJEgodCxlLG4pe3ZhciBpLHIsbz0oZnVuY3Rpb24gYSh0KXtyZXR1cm4odCsiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pLmV2ZXJ5KChmdW5jdGlvbih0KXt2YXIgZT10LmluZGV4T2YoIi4iKTtyZXR1cm4gZT49MCYmKHQ9dC5zbGljZSgwLGUpKSwhdHx8InN0YXJ0Ij09PXR9KSl9KShlKT9USDpDSDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1vKHRoaXMsdCkscz1hLm9uO3MhPT1pJiYocj0oaT1zKS5jb3B5KCkpLm9uKGUsbiksYS5vbj1yfX12YXIgS0g9dkQucHJvdG90eXBlLmNvbnN0cnVjdG9yO2Z1bmN0aW9uIFpIKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fWZ1bmN0aW9uIEpIKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oaSl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LGUuY2FsbCh0aGlzLGkpLG4pfX1mdW5jdGlvbiBRSCh0LGUsbil7dmFyIGkscjtmdW5jdGlvbiBvKCl7dmFyIG89ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG8hPT1yJiYoaT0ocj1vKSYmSkgodCxvLG4pKSxpfXJldHVybiBvLl92YWx1ZT1lLG99ZnVuY3Rpb24gdEYodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3RoaXMudGV4dENvbnRlbnQ9dC5jYWxsKHRoaXMsZSl9fWZ1bmN0aW9uIGVGKHQpe3ZhciBlLG47ZnVuY3Rpb24gaSgpe3ZhciBpPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBpIT09biYmKGU9KG49aSkmJnRGKGkpKSxlfXJldHVybiBpLl92YWx1ZT10LGl9dmFyIG5GPTA7ZnVuY3Rpb24gaUYodCxlLG4saSl7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1lLHRoaXMuX25hbWU9bix0aGlzLl9pZD1pfWZ1bmN0aW9uIHJGKCl7cmV0dXJuKytuRn12YXIgb0Y9dkQucHJvdG90eXBlO2lGLnByb3RvdHlwZT17Y29uc3RydWN0b3I6aUYsc2VsZWN0OmZ1bmN0aW9uIGFGKHQpe3ZhciBlPXRoaXMuX25hbWUsbj10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9eXoodCkpO2Zvcih2YXIgaT10aGlzLl9ncm91cHMscj1pLmxlbmd0aCxvPW5ldyBBcnJheShyKSxhPTA7YTxyOysrYSlmb3IodmFyIHMsbCxjPWlbYV0sdT1jLmxlbmd0aCxoPW9bYV09bmV3IEFycmF5KHUpLGQ9MDtkPHU7KytkKShzPWNbZF0pJiYobD10LmNhbGwocyxzLl9fZGF0YV9fLGQsYykpJiYoIl9fZGF0YV9fImluIHMmJihsLl9fZGF0YV9fPXMuX19kYXRhX18pLGhbZF09bCxFSChoW2RdLGUsbixkLGgsQUgocyxuKSkpO3JldHVybiBuZXcgaUYobyx0aGlzLl9wYXJlbnRzLGUsbil9LHNlbGVjdEFsbDpmdW5jdGlvbiBzRih0KXt2YXIgZT10aGlzLl9uYW1lLG49dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PWJ6KHQpKTtmb3IodmFyIGk9dGhpcy5fZ3JvdXBzLHI9aS5sZW5ndGgsbz1bXSxhPVtdLHM9MDtzPHI7KytzKWZvcih2YXIgbCxjPWlbc10sdT1jLmxlbmd0aCxoPTA7aDx1OysraClpZihsPWNbaF0pe2Zvcih2YXIgZCxwPXQuY2FsbChsLGwuX19kYXRhX18saCxjKSxmPUFIKGwsbiksbT0wLGc9cC5sZW5ndGg7bTxnOysrbSkoZD1wW21dKSYmRUgoZCxlLG4sbSxwLGYpO28ucHVzaChwKSxhLnB1c2gobCl9cmV0dXJuIG5ldyBpRihvLGEsZSxuKX0sZmlsdGVyOmZ1bmN0aW9uIGxGKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD14eih0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWZvcih2YXIgbyxhPWVbcl0scz1hLmxlbmd0aCxsPWlbcl09W10sYz0wO2M8czsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmbC5wdXNoKG8pO3JldHVybiBuZXcgaUYoaSx0aGlzLl9wYXJlbnRzLHRoaXMuX25hbWUsdGhpcy5faWQpfSxtZXJnZTpmdW5jdGlvbiBjRih0KXtpZih0Ll9pZCE9PXRoaXMuX2lkKXRocm93IG5ldyBFcnJvcjtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49dC5fZ3JvdXBzLGk9ZS5sZW5ndGgscj1NYXRoLm1pbihpLG4ubGVuZ3RoKSxvPW5ldyBBcnJheShpKSxhPTA7YTxyOysrYSlmb3IodmFyIHMsbD1lW2FdLGM9blthXSx1PWwubGVuZ3RoLGg9b1thXT1uZXcgQXJyYXkodSksZD0wO2Q8dTsrK2QpKHM9bFtkXXx8Y1tkXSkmJihoW2RdPXMpO2Zvcig7YTxpOysrYSlvW2FdPWVbYV07cmV0dXJuIG5ldyBpRihvLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LHNlbGVjdGlvbjpmdW5jdGlvbiB1Rigpe3JldHVybiBuZXcgS0godGhpcy5fZ3JvdXBzLHRoaXMuX3BhcmVudHMpfSx0cmFuc2l0aW9uOmZ1bmN0aW9uIGhGKCl7Zm9yKHZhciB0PXRoaXMuX25hbWUsZT10aGlzLl9pZCxuPXJGKCksaT10aGlzLl9ncm91cHMscj1pLmxlbmd0aCxvPTA7bzxyOysrbylmb3IodmFyIGEscz1pW29dLGw9cy5sZW5ndGgsYz0wO2M8bDsrK2MpaWYoYT1zW2NdKXt2YXIgdT1BSChhLGUpO0VIKGEsdCxuLGMscyx7dGltZTp1LnRpbWUrdS5kZWxheSt1LmR1cmF0aW9uLGRlbGF5OjAsZHVyYXRpb246dS5kdXJhdGlvbixlYXNlOnUuZWFzZX0pfXJldHVybiBuZXcgaUYoaSx0aGlzLl9wYXJlbnRzLHQsbil9LGNhbGw6b0YuY2FsbCxub2RlczpvRi5ub2Rlcyxub2RlOm9GLm5vZGUsc2l6ZTpvRi5zaXplLGVtcHR5Om9GLmVtcHR5LGVhY2g6b0YuZWFjaCxvbjpmdW5jdGlvbiBkRih0LGUpe3ZhciBuPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/QUgodGhpcy5ub2RlKCksbikub24ub24odCk6dGhpcy5lYWNoKCRIKG4sdCxlKSl9LGF0dHI6ZnVuY3Rpb24gcEYodCxlKXt2YXIgbj1weih0KSxpPSJ0cmFuc2Zvcm0iPT09bj9vSDpJSDtyZXR1cm4gdGhpcy5hdHRyVHdlZW4odCwiZnVuY3Rpb24iPT10eXBlb2YgZT8obi5sb2NhbD9ISDpCSCkobixpLE5IKHRoaXMsImF0dHIuIit0LGUpKTpudWxsPT1lPyhuLmxvY2FsP09IOlJIKShuKToobi5sb2NhbD9ESDp6SCkobixpLGUpKX0sYXR0clR3ZWVuOmZ1bmN0aW9uIGZGKHQsZSl7dmFyIG49ImF0dHIuIit0O2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4obj10aGlzLnR3ZWVuKG4pKSYmbi5fdmFsdWU7aWYobnVsbD09ZSlyZXR1cm4gdGhpcy50d2VlbihuLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcjt2YXIgaT1weih0KTtyZXR1cm4gdGhpcy50d2VlbihuLChpLmxvY2FsP1VIOmpIKShpLGUpKX0sc3R5bGU6ZnVuY3Rpb24gbUYodCxlLG4pe3ZhciBpPSJ0cmFuc2Zvcm0iPT0odCs9IiIpP2lIOklIO3JldHVybiBudWxsPT1lP3RoaXMuc3R5bGVUd2Vlbih0LChmdW5jdGlvbiByKHQsZSl7dmFyIG4saSxyO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPUR6KHRoaXMsdCksYT0odGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KSxEeih0aGlzLHQpKTtyZXR1cm4gbz09PWE/bnVsbDpvPT09biYmYT09PWk/cjpyPWUobj1vLGk9YSl9fSkodCxpKSkub24oImVuZC5zdHlsZS4iK3QsWkgodCkpOiJmdW5jdGlvbiI9PXR5cGVvZiBlP3RoaXMuc3R5bGVUd2Vlbih0LChmdW5jdGlvbiBhKHQsZSxuKXt2YXIgaSxyLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9RHoodGhpcyx0KSxzPW4odGhpcyksbD1zKyIiO3JldHVybiBudWxsPT1zJiYodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KSxsPXM9RHoodGhpcyx0KSksYT09PWw/bnVsbDphPT09aSYmbD09PXI/bzoocj1sLG89ZShpPWEscykpfX0pKHQsaSxOSCh0aGlzLCJzdHlsZS4iK3QsZSkpKS5lYWNoKChmdW5jdGlvbiBvKHQsZSl7dmFyIG4saSxyLG8sYT0ic3R5bGUuIitlLHM9ImVuZC4iK2E7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGw9Q0godGhpcyx0KSxjPWwub24sdT1udWxsPT1sLnZhbHVlW2FdP298fChvPVpIKGUpKTp2b2lkIDA7Yz09PW4mJnI9PT11fHwoaT0obj1jKS5jb3B5KCkpLm9uKHMscj11KSxsLm9uPWl9fSkodGhpcy5faWQsdCkpOnRoaXMuc3R5bGVUd2Vlbih0LChmdW5jdGlvbiBzKHQsZSxuKXt2YXIgaSxyLG89bisiIjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1Eeih0aGlzLHQpO3JldHVybiBhPT09bz9udWxsOmE9PT1pP3I6cj1lKGk9YSxuKX19KSh0LGksZSksbikub24oImVuZC5zdHlsZS4iK3QsbnVsbCl9LHN0eWxlVHdlZW46ZnVuY3Rpb24gZ0YodCxlLG4pe3ZhciBpPSJzdHlsZS4iKyh0Kz0iIik7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXJldHVybihpPXRoaXMudHdlZW4oaSkpJiZpLl92YWx1ZTtpZihudWxsPT1lKXJldHVybiB0aGlzLnR3ZWVuKGksbnVsbCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO3JldHVybiB0aGlzLnR3ZWVuKGksUUgodCxlLG51bGw9PW4/IiI6bikpfSx0ZXh0OmZ1bmN0aW9uIF9GKHQpe3JldHVybiB0aGlzLnR3ZWVuKCJ0ZXh0IiwiZnVuY3Rpb24iPT10eXBlb2YgdD8oZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09ZT8iIjplfX0pKE5IKHRoaXMsInRleHQiLHQpKTooZnVuY3Rpb24gbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fSkobnVsbD09dD8iIjp0KyIiKSl9LHRleHRUd2VlbjpmdW5jdGlvbiB5Rih0KXt2YXIgZT0idGV4dCI7aWYoYXJndW1lbnRzLmxlbmd0aDwxKXJldHVybihlPXRoaXMudHdlZW4oZSkpJiZlLl92YWx1ZTtpZihudWxsPT10KXJldHVybiB0aGlzLnR3ZWVuKGUsbnVsbCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yO3JldHVybiB0aGlzLnR3ZWVuKGUsZUYodCkpfSxyZW1vdmU6ZnVuY3Rpb24gdkYoKXtyZXR1cm4gdGhpcy5vbigiZW5kLnJlbW92ZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO2Zvcih2YXIgbiBpbiB0aGlzLl9fdHJhbnNpdGlvbilpZigrbiE9PWUpcmV0dXJuO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9fSkodGhpcy5faWQpKX0sdHdlZW46ZnVuY3Rpb24gYkYodCxlKXt2YXIgbj10aGlzLl9pZDtpZih0Kz0iIixhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgaSxyPUFIKHRoaXMubm9kZSgpLG4pLnR3ZWVuLG89MCxhPXIubGVuZ3RoO288YTsrK28paWYoKGk9cltvXSkubmFtZT09PXQpcmV0dXJuIGkudmFsdWU7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09ZT9MSDpQSCkobix0LGUpKX0sZGVsYXk6ZnVuY3Rpb24geEYodCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9HSDpXSCkoZSx0KSk6QUgodGhpcy5ub2RlKCksZSkuZGVsYXl9LGR1cmF0aW9uOmZ1bmN0aW9uIHdGKHQpe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIHQ/cUg6WUgpKGUsdCkpOkFIKHRoaXMubm9kZSgpLGUpLmR1cmF0aW9ufSxlYXNlOmZ1bmN0aW9uIFNGKHQpe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChYSChlLHQpKTpBSCh0aGlzLm5vZGUoKSxlKS5lYXNlfSxlbmQ6ZnVuY3Rpb24gTUYoKXt2YXIgdCxlLG49dGhpcyxpPW4uX2lkLHI9bi5zaXplKCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGEpe3ZhciBzPXt2YWx1ZTphfSxsPXt2YWx1ZTpmdW5jdGlvbigpezA9PS0tciYmbygpfX07bi5lYWNoKChmdW5jdGlvbigpe3ZhciBuPUNIKHRoaXMsaSkscj1uLm9uO3IhPT10JiYoKGU9KHQ9cikuY29weSgpKS5fLmNhbmNlbC5wdXNoKHMpLGUuXy5pbnRlcnJ1cHQucHVzaChzKSxlLl8uZW5kLnB1c2gobCkpLG4ub249ZX0pKX0pKX19O3ZhciBFRj17dGltZTpudWxsLGRlbGF5OjAsZHVyYXRpb246MjUwLGVhc2U6VGZ9O2Z1bmN0aW9uIFRGKHQsZSl7Zm9yKHZhciBuOyEobj10Ll9fdHJhbnNpdGlvbil8fCEobj1uW2VdKTspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuIEVGLnRpbWU9bUgoKSxFRjtyZXR1cm4gbn1mdW5jdGlvbiBDRih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gQUYodCxlLG4pe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPWUsdGhpcy5zZWxlY3Rpb249bn1mdW5jdGlvbiBrRigpe2xELnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIExGKCl7bEQucHJldmVudERlZmF1bHQoKSxsRC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX12RC5wcm90b3R5cGUuaW50ZXJydXB0PWZ1bmN0aW9uIFBGKHQpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7a0godGhpcyx0KX0pKX0sdkQucHJvdG90eXBlLnRyYW5zaXRpb249ZnVuY3Rpb24gTkYodCl7dmFyIGUsbjt0IGluc3RhbmNlb2YgaUY/KGU9dC5faWQsdD10Ll9uYW1lKTooZT1yRigpLChuPUVGKS50aW1lPW1IKCksdD1udWxsPT10P251bGw6dCsiIik7Zm9yKHZhciBpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89MDtvPHI7KytvKWZvcih2YXIgYSxzPWlbb10sbD1zLmxlbmd0aCxjPTA7YzxsOysrYykoYT1zW2NdKSYmRUgoYSx0LGUsYyxzLG58fFRGKGEsZSkpO3JldHVybiBuZXcgaUYoaSx0aGlzLl9wYXJlbnRzLHQsZSl9O3ZhciBJRj17bmFtZToiZHJhZyJ9LFJGPXtuYW1lOiJzcGFjZSJ9LE9GPXtuYW1lOiJoYW5kbGUifSx6Rj17bmFtZToiY2VudGVyIn0sREY9e25hbWU6IngiLGhhbmRsZXM6WyJlIiwidyJdLm1hcChXRiksaW5wdXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmW1t0WzBdLGVbMF1bMV1dLFt0WzFdLGVbMV1bMV1dXX0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZbdFswXVswXSx0WzFdWzBdXX19LEJGPXtuYW1lOiJ5IixoYW5kbGVzOlsibiIsInMiXS5tYXAoV0YpLGlucHV0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJltbZVswXVswXSx0WzBdXSxbZVsxXVswXSx0WzFdXV19LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmW3RbMF1bMV0sdFsxXVsxXV19fSxIRj17bmFtZToieHkiLGhhbmRsZXM6WyJuIiwiZSIsInMiLCJ3IiwibnciLCJuZSIsInNlIiwic3ciXS5tYXAoV0YpLGlucHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0fSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHR9fSxGRj17b3ZlcmxheToiY3Jvc3NoYWlyIixzZWxlY3Rpb246Im1vdmUiLG46Im5zLXJlc2l6ZSIsZToiZXctcmVzaXplIixzOiJucy1yZXNpemUiLHc6ImV3LXJlc2l6ZSIsbnc6Im53c2UtcmVzaXplIixuZToibmVzdy1yZXNpemUiLHNlOiJud3NlLXJlc2l6ZSIsc3c6Im5lc3ctcmVzaXplIn0sVkY9e2U6InciLHc6ImUiLG53OiJuZSIsbmU6Im53IixzZToic3ciLHN3OiJzZSJ9LFVGPXtuOiJzIixzOiJuIixudzoic3ciLG5lOiJzZSIsc2U6Im5lIixzdzoibncifSxqRj17b3ZlcmxheToxLHNlbGVjdGlvbjoxLG46bnVsbCxlOjEsczpudWxsLHc6LTEsbnc6LTEsbmU6MSxzZToxLHN3Oi0xfSxHRj17b3ZlcmxheToxLHNlbGVjdGlvbjoxLG46LTEsZTpudWxsLHM6MSx3Om51bGwsbnc6LTEsbmU6LTEsc2U6MSxzdzoxfTtmdW5jdGlvbiBXRih0KXtyZXR1cm57dHlwZTp0fX1mdW5jdGlvbiBxRigpe3JldHVybiFsRC5idXR0b259ZnVuY3Rpb24gWUYoKXt2YXIgdD10aGlzLm93bmVyU1ZHRWxlbWVudHx8dGhpcztyZXR1cm5bWzAsMF0sW3Qud2lkdGguYmFzZVZhbC52YWx1ZSx0LmhlaWdodC5iYXNlVmFsLnZhbHVlXV19ZnVuY3Rpb24gWEYodCl7Zm9yKDshdC5fX2JydXNoOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHQuX19icnVzaH1mdW5jdGlvbiAkRih0KXtyZXR1cm4gdFswXVswXT09PXRbMV1bMF18fHRbMF1bMV09PT10WzFdWzFdfWZ1bmN0aW9uIEtGKHQpe3ZhciBlLG49WUYsaT1xRixyPWF6KGEsInN0YXJ0IiwiYnJ1c2giLCJlbmQiKSxvPTY7ZnVuY3Rpb24gYShlKXt2YXIgbj1lLnByb3BlcnR5KCJfX2JydXNoIixoKS5zZWxlY3RBbGwoIi5vdmVybGF5IikuZGF0YShbV0YoIm92ZXJsYXkiKV0pO24uZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsIm92ZXJsYXkiKS5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLmF0dHIoImN1cnNvciIsRkYub3ZlcmxheSkubWVyZ2UobikuZWFjaCgoZnVuY3Rpb24oKXt2YXIgdD1YRih0aGlzKS5leHRlbnQ7YkQodGhpcykuYXR0cigieCIsdFswXVswXSkuYXR0cigieSIsdFswXVsxXSkuYXR0cigid2lkdGgiLHRbMV1bMF0tdFswXVswXSkuYXR0cigiaGVpZ2h0Iix0WzFdWzFdLXRbMF1bMV0pfSkpLGUuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuZGF0YShbV0YoInNlbGVjdGlvbiIpXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsInNlbGVjdGlvbiIpLmF0dHIoImN1cnNvciIsRkYuc2VsZWN0aW9uKS5hdHRyKCJmaWxsIiwiIzc3NyIpLmF0dHIoImZpbGwtb3BhY2l0eSIsLjMpLmF0dHIoInN0cm9rZSIsIiNmZmYiKS5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIik7dmFyIGk9ZS5zZWxlY3RBbGwoIi5oYW5kbGUiKS5kYXRhKHQuaGFuZGxlcywoZnVuY3Rpb24odCl7cmV0dXJuIHQudHlwZX0pKTtpLmV4aXQoKS5yZW1vdmUoKSxpLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLChmdW5jdGlvbih0KXtyZXR1cm4iaGFuZGxlIGhhbmRsZS0tIit0LnR5cGV9KSkuYXR0cigiY3Vyc29yIiwoZnVuY3Rpb24odCl7cmV0dXJuIEZGW3QudHlwZV19KSksZS5lYWNoKHMpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2ggdG91Y2hzdGFydC5icnVzaCIsdSl9ZnVuY3Rpb24gcygpe3ZhciB0PWJEKHRoaXMpLGU9WEYodGhpcykuc2VsZWN0aW9uO2U/KHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLGVbMF1bMF0pLmF0dHIoInkiLGVbMF1bMV0pLmF0dHIoIndpZHRoIixlWzFdWzBdLWVbMF1bMF0pLmF0dHIoImhlaWdodCIsZVsxXVsxXS1lWzBdWzFdKSx0LnNlbGVjdEFsbCgiLmhhbmRsZSIpLnN0eWxlKCJkaXNwbGF5IixudWxsKS5hdHRyKCJ4IiwoZnVuY3Rpb24odCl7cmV0dXJuImUiPT09dC50eXBlW3QudHlwZS5sZW5ndGgtMV0/ZVsxXVswXS1vLzI6ZVswXVswXS1vLzJ9KSkuYXR0cigieSIsKGZ1bmN0aW9uKHQpe3JldHVybiJzIj09PXQudHlwZVswXT9lWzFdWzFdLW8vMjplWzBdWzFdLW8vMn0pKS5hdHRyKCJ3aWR0aCIsKGZ1bmN0aW9uKHQpe3JldHVybiJuIj09PXQudHlwZXx8InMiPT09dC50eXBlP2VbMV1bMF0tZVswXVswXStvOm99KSkuYXR0cigiaGVpZ2h0IiwoZnVuY3Rpb24odCl7cmV0dXJuImUiPT09dC50eXBlfHwidyI9PT10LnR5cGU/ZVsxXVsxXS1lWzBdWzFdK286b30pKSk6dC5zZWxlY3RBbGwoIi5zZWxlY3Rpb24sLmhhbmRsZSIpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLmF0dHIoIngiLG51bGwpLmF0dHIoInkiLG51bGwpLmF0dHIoIndpZHRoIixudWxsKS5hdHRyKCJoZWlnaHQiLG51bGwpfWZ1bmN0aW9uIGwodCxlKXtyZXR1cm4gdC5fX2JydXNoLmVtaXR0ZXJ8fG5ldyBjKHQsZSl9ZnVuY3Rpb24gYyh0LGUpe3RoaXMudGhhdD10LHRoaXMuYXJncz1lLHRoaXMuc3RhdGU9dC5fX2JydXNoLHRoaXMuYWN0aXZlPTB9ZnVuY3Rpb24gdSgpe2lmKGxELnRvdWNoZXMpe2lmKGxELmNoYW5nZWRUb3VjaGVzLmxlbmd0aDxsRC50b3VjaGVzLmxlbmd0aClyZXR1cm4gTEYoKX1lbHNlIGlmKGUpcmV0dXJuO2lmKGkuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbixyLG8sYSxjLHUsaCxkLHAsZixtLGcsXyx5PXRoaXMsdj1sRC50YXJnZXQuX19kYXRhX18udHlwZSxiPSJzZWxlY3Rpb24iPT09KGxELm1ldGFLZXk/dj0ib3ZlcmxheSI6dik/SUY6bEQuYWx0S2V5P3pGOk9GLHg9dD09PUJGP251bGw6akZbdl0sdz10PT09REY/bnVsbDpHRlt2XSxTPVhGKHkpLE09Uy5leHRlbnQsRT1TLnNlbGVjdGlvbixUPU1bMF1bMF0sQz1NWzBdWzFdLEE9TVsxXVswXSxrPU1bMV1bMV0sTD14JiZ3JiZsRC5zaGlmdEtleSxQPXhEKHkpLE49UCxJPWwoeSxhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCk7Im92ZXJsYXkiPT09dj9TLnNlbGVjdGlvbj1FPVtbbj10PT09QkY/VDpQWzBdLG89dD09PURGP0M6UFsxXV0sW2M9dD09PUJGP0E6bixoPXQ9PT1ERj9rOm9dXToobj1FWzBdWzBdLG89RVswXVsxXSxjPUVbMV1bMF0saD1FWzFdWzFdKSxyPW4sYT1vLHU9YyxkPWg7dmFyIFI9YkQoeSkuYXR0cigicG9pbnRlci1ldmVudHMiLCJub25lIiksTz1SLnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5hdHRyKCJjdXJzb3IiLEZGW3ZdKTtpZihsRC50b3VjaGVzKVIub24oInRvdWNobW92ZS5icnVzaCIsRCwhMCkub24oInRvdWNoZW5kLmJydXNoIHRvdWNoY2FuY2VsLmJydXNoIixILCEwKTtlbHNle3ZhciB6PWJEKGxELnZpZXcpLm9uKCJrZXlkb3duLmJydXNoIixGLCEwKS5vbigia2V5dXAuYnJ1c2giLFYsITApLm9uKCJtb3VzZW1vdmUuYnJ1c2giLEQsITApLm9uKCJtb3VzZXVwLmJydXNoIixILCEwKTtTRChsRC52aWV3KX1rRigpLGtIKHkpLHMuY2FsbCh5KSxJLnN0YXJ0KCl9ZnVuY3Rpb24gRCgpe3ZhciB0PXhEKHkpOyFMfHxnfHxffHwoTWF0aC5hYnModFswXS1OWzBdKT5NYXRoLmFicyh0WzFdLU5bMV0pP189ITA6Zz0hMCksTj10LG09ITAsTEYoKSxCKCl9ZnVuY3Rpb24gQigpe3ZhciB0O3N3aXRjaChwPU5bMF0tUFswXSxmPU5bMV0tUFsxXSxiKXtjYXNlIFJGOmNhc2UgSUY6eCYmKHA9TWF0aC5tYXgoVC1uLE1hdGgubWluKEEtYyxwKSkscj1uK3AsdT1jK3ApLHcmJihmPU1hdGgubWF4KEMtbyxNYXRoLm1pbihrLWgsZikpLGE9bytmLGQ9aCtmKTticmVhaztjYXNlIE9GOng8MD8ocD1NYXRoLm1heChULW4sTWF0aC5taW4oQS1uLHApKSxyPW4rcCx1PWMpOng+MCYmKHA9TWF0aC5tYXgoVC1jLE1hdGgubWluKEEtYyxwKSkscj1uLHU9YytwKSx3PDA/KGY9TWF0aC5tYXgoQy1vLE1hdGgubWluKGstbyxmKSksYT1vK2YsZD1oKTp3PjAmJihmPU1hdGgubWF4KEMtaCxNYXRoLm1pbihrLWgsZikpLGE9byxkPWgrZik7YnJlYWs7Y2FzZSB6Rjp4JiYocj1NYXRoLm1heChULE1hdGgubWluKEEsbi1wKngpKSx1PU1hdGgubWF4KFQsTWF0aC5taW4oQSxjK3AqeCkpKSx3JiYoYT1NYXRoLm1heChDLE1hdGgubWluKGssby1mKncpKSxkPU1hdGgubWF4KEMsTWF0aC5taW4oayxoK2YqdykpKX11PHImJih4Kj0tMSx0PW4sbj1jLGM9dCx0PXIscj11LHU9dCx2IGluIFZGJiZPLmF0dHIoImN1cnNvciIsRkZbdj1WRlt2XV0pKSxkPGEmJih3Kj0tMSx0PW8sbz1oLGg9dCx0PWEsYT1kLGQ9dCx2IGluIFVGJiZPLmF0dHIoImN1cnNvciIsRkZbdj1VRlt2XV0pKSxTLnNlbGVjdGlvbiYmKEU9Uy5zZWxlY3Rpb24pLGcmJihyPUVbMF1bMF0sdT1FWzFdWzBdKSxfJiYoYT1FWzBdWzFdLGQ9RVsxXVsxXSksRVswXVswXT09PXImJkVbMF1bMV09PT1hJiZFWzFdWzBdPT09dSYmRVsxXVsxXT09PWR8fChTLnNlbGVjdGlvbj1bW3IsYV0sW3UsZF1dLHMuY2FsbCh5KSxJLmJydXNoKCkpfWZ1bmN0aW9uIEgoKXtpZihrRigpLGxELnRvdWNoZXMpe2lmKGxELnRvdWNoZXMubGVuZ3RoKXJldHVybjtlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2U9bnVsbH0pLDUwMCksUi5vbigidG91Y2htb3ZlLmJydXNoIHRvdWNoZW5kLmJydXNoIHRvdWNoY2FuY2VsLmJydXNoIixudWxsKX1lbHNlIE1EKGxELnZpZXcsbSksei5vbigia2V5ZG93bi5icnVzaCBrZXl1cC5icnVzaCBtb3VzZW1vdmUuYnJ1c2ggbW91c2V1cC5icnVzaCIsbnVsbCk7Ui5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLE8uYXR0cigiY3Vyc29yIixGRi5vdmVybGF5KSxTLnNlbGVjdGlvbiYmKEU9Uy5zZWxlY3Rpb24pLCRGKEUpJiYoUy5zZWxlY3Rpb249bnVsbCxzLmNhbGwoeSkpLEkuZW5kKCl9ZnVuY3Rpb24gRigpe3N3aXRjaChsRC5rZXlDb2RlKXtjYXNlIDE2Okw9eCYmdzticmVhaztjYXNlIDE4OmI9PT1PRiYmKHgmJihjPXUtcCp4LG49citwKngpLHcmJihoPWQtZip3LG89YStmKncpLGI9ekYsQigpKTticmVhaztjYXNlIDMyOmIhPT1PRiYmYiE9PXpGfHwoeDwwP2M9dS1wOng+MCYmKG49ci1wKSx3PDA/aD1kLWY6dz4wJiYobz1hLWYpLGI9UkYsTy5hdHRyKCJjdXJzb3IiLEZGLnNlbGVjdGlvbiksQigpKTticmVhaztkZWZhdWx0OnJldHVybn1MRigpfWZ1bmN0aW9uIFYoKXtzd2l0Y2gobEQua2V5Q29kZSl7Y2FzZSAxNjpMJiYoZz1fPUw9ITEsQigpKTticmVhaztjYXNlIDE4OmI9PT16RiYmKHg8MD9jPXU6eD4wJiYobj1yKSx3PDA/aD1kOnc+MCYmKG89YSksYj1PRixCKCkpO2JyZWFrO2Nhc2UgMzI6Yj09PVJGJiYobEQuYWx0S2V5Pyh4JiYoYz11LXAqeCxuPXIrcCp4KSx3JiYoaD1kLWYqdyxvPWErZip3KSxiPXpGKTooeDwwP2M9dTp4PjAmJihuPXIpLHc8MD9oPWQ6dz4wJiYobz1hKSxiPU9GKSxPLmF0dHIoImN1cnNvciIsRkZbdl0pLEIoKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59TEYoKX19ZnVuY3Rpb24gaCgpe3ZhciBlPXRoaXMuX19icnVzaHx8e3NlbGVjdGlvbjpudWxsfTtyZXR1cm4gZS5leHRlbnQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS5kaW09dCxlfXJldHVybiBhLm1vdmU9ZnVuY3Rpb24oZSxuKXtlLnNlbGVjdGlvbj9lLm9uKCJzdGFydC5icnVzaCIsKGZ1bmN0aW9uKCl7bCh0aGlzLGFyZ3VtZW50cykuYmVmb3Jlc3RhcnQoKS5zdGFydCgpfSkpLm9uKCJpbnRlcnJ1cHQuYnJ1c2ggZW5kLmJydXNoIiwoZnVuY3Rpb24oKXtsKHRoaXMsYXJndW1lbnRzKS5lbmQoKX0pKS50d2VlbigiYnJ1c2giLChmdW5jdGlvbigpe3ZhciBlPXRoaXMsaT1lLl9fYnJ1c2gscj1sKGUsYXJndW1lbnRzKSxvPWkuc2VsZWN0aW9uLGE9dC5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuLGkuZXh0ZW50KSxjPXFCKG8sYSk7ZnVuY3Rpb24gdSh0KXtpLnNlbGVjdGlvbj0xPT09dCYmJEYoYSk/bnVsbDpjKHQpLHMuY2FsbChlKSxyLmJydXNoKCl9cmV0dXJuIG8mJmE/dTp1KDEpfSkpOmUuZWFjaCgoZnVuY3Rpb24oKXt2YXIgZT10aGlzLGk9YXJndW1lbnRzLHI9ZS5fX2JydXNoLG89dC5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KGUsaSk6bixyLmV4dGVudCksYT1sKGUsaSkuYmVmb3Jlc3RhcnQoKTtrSChlKSxyLnNlbGVjdGlvbj1udWxsPT1vfHwkRihvKT9udWxsOm8scy5jYWxsKGUpLGEuc3RhcnQoKS5icnVzaCgpLmVuZCgpfSkpfSxjLnByb3RvdHlwZT17YmVmb3Jlc3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gMT09Kyt0aGlzLmFjdGl2ZSYmKHRoaXMuc3RhdGUuZW1pdHRlcj10aGlzLHRoaXMuc3RhcnRpbmc9ITApLHRoaXN9LHN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhcnRpbmcmJih0aGlzLnN0YXJ0aW5nPSExLHRoaXMuZW1pdCgic3RhcnQiKSksdGhpc30sYnJ1c2g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbWl0KCJicnVzaCIpLHRoaXN9LGVuZDpmdW5jdGlvbigpe3JldHVybiAwPT0tLXRoaXMuYWN0aXZlJiYoZGVsZXRlIHRoaXMuc3RhdGUuZW1pdHRlcix0aGlzLmVtaXQoImVuZCIpKSx0aGlzfSxlbWl0OmZ1bmN0aW9uKGUpeyEoZnVuY3Rpb24gbih0LGUsaSxyKXt2YXIgbz1sRDt0LnNvdXJjZUV2ZW50PWxELGxEPXQ7dHJ5e2UuYXBwbHkoaSxyKX1maW5hbGx5e2xEPW99fSkobmV3IEFGKGEsZSx0Lm91dHB1dCh0aGlzLnN0YXRlLnNlbGVjdGlvbikpLHIuYXBwbHkscixbZSx0aGlzLnRoYXQsdGhpcy5hcmdzXSl9fSxhLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkNGKFtbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dKSxhKTpufSxhLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkNGKCEhdCksYSk6aX0sYS5oYW5kbGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSt0LGEpOm99LGEub249ZnVuY3Rpb24oKXt2YXIgdD1yLm9uLmFwcGx5KHIsYXJndW1lbnRzKTtyZXR1cm4gdD09PXI/YTp0fSxhfWZ1bmN0aW9uIFpGKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTp0Pj1lPzA6TmFOfWZ1bmN0aW9uIEpGKHQsZSxuKXt0PSt0LGU9K2Usbj0ocj1hcmd1bWVudHMubGVuZ3RoKTwyPyhlPXQsdD0wLDEpOnI8Mz8xOituO2Zvcih2YXIgaT0tMSxyPTB8TWF0aC5tYXgoMCxNYXRoLmNlaWwoKGUtdCkvbikpLG89bmV3IEFycmF5KHIpOysraTxyOylvW2ldPXQraSpuO3JldHVybiBvfSEoZnVuY3Rpb24gUUYodCl7MT09PXQubGVuZ3RoJiYodD0oZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtyZXR1cm4gWkYodChlKSxuKX19KSh0KSl9KShaRik7dmFyIHRWPU1hdGguY29zLGVWPU1hdGguc2luLG5WPU1hdGguUEksaVY9blYvMixyVj0yKm5WLG9WPU1hdGgubWF4O2Z1bmN0aW9uIGFWKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiB0KGUuc291cmNlLnZhbHVlK2UudGFyZ2V0LnZhbHVlLG4uc291cmNlLnZhbHVlK24udGFyZ2V0LnZhbHVlKX19dmFyIHNWPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBsVih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19dmFyIGNWPU1hdGguUEksdVY9MipjVixoVj0xZS02LGRWPXVWLWhWO2Z1bmN0aW9uIHBWKCl7dGhpcy5feDA9dGhpcy5feTA9dGhpcy5feDE9dGhpcy5feTE9bnVsbCx0aGlzLl89IiJ9ZnVuY3Rpb24gZlYoKXtyZXR1cm4gbmV3IHBWfWZ1bmN0aW9uIG1WKHQpe3JldHVybiB0LnNvdXJjZX1mdW5jdGlvbiBnVih0KXtyZXR1cm4gdC50YXJnZXR9ZnVuY3Rpb24gX1YodCl7cmV0dXJuIHQucmFkaXVzfWZ1bmN0aW9uIHlWKHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gdlYodCl7cmV0dXJuIHQuZW5kQW5nbGV9cFYucHJvdG90eXBlPWZWLnByb3RvdHlwZT17Y29uc3RydWN0b3I6cFYsbW92ZVRvOmZ1bmN0aW9uKHQsZSl7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStlKX0sY2xvc2VQYXRoOmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuX3gxJiYodGhpcy5feDE9dGhpcy5feDAsdGhpcy5feTE9dGhpcy5feTAsdGhpcy5fKz0iWiIpfSxsaW5lVG86ZnVuY3Rpb24odCxlKXt0aGlzLl8rPSJMIisodGhpcy5feDE9K3QpKyIsIisodGhpcy5feTE9K2UpfSxxdWFkcmF0aWNDdXJ2ZVRvOmZ1bmN0aW9uKHQsZSxuLGkpe3RoaXMuXys9IlEiKyArdCsiLCIrICtlKyIsIisodGhpcy5feDE9K24pKyIsIisodGhpcy5feTE9K2kpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsZSxuLGkscixvKXt0aGlzLl8rPSJDIisgK3QrIiwiKyArZSsiLCIrICtuKyIsIisgK2krIiwiKyh0aGlzLl94MT0rcikrIiwiKyh0aGlzLl95MT0rbyl9LGFyY1RvOmZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIG89dGhpcy5feDEsYT10aGlzLl95MSxzPShuPStuKS0odD0rdCksbD0oaT0raSktKGU9K2UpLGM9by10LHU9YS1lLGg9YypjK3UqdTtpZigocj0rcik8MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIityKTtpZihudWxsPT09dGhpcy5feDEpdGhpcy5fKz0iTSIrKHRoaXMuX3gxPXQpKyIsIisodGhpcy5feTE9ZSk7ZWxzZSBpZihoPmhWKWlmKE1hdGguYWJzKHUqcy1sKmMpPmhWJiZyKXt2YXIgZD1uLW8scD1pLWEsZj1zKnMrbCpsLG09ZCpkK3AqcCxnPU1hdGguc3FydChmKSxfPU1hdGguc3FydChoKSx5PXIqTWF0aC50YW4oKGNWLU1hdGguYWNvcygoZitoLW0pLygyKmcqXykpKS8yKSx2PXkvXyxiPXkvZztNYXRoLmFicyh2LTEpPmhWJiYodGhpcy5fKz0iTCIrKHQrdipjKSsiLCIrKGUrdip1KSksdGhpcy5fKz0iQSIrcisiLCIrcisiLDAsMCwiKyArKHUqZD5jKnApKyIsIisodGhpcy5feDE9dCtiKnMpKyIsIisodGhpcy5feTE9ZStiKmwpfWVsc2UgdGhpcy5fKz0iTCIrKHRoaXMuX3gxPXQpKyIsIisodGhpcy5feTE9ZSl9LGFyYzpmdW5jdGlvbih0LGUsbixpLHIsbyl7dD0rdCxlPStlLG89ISFvO3ZhciBhPShuPStuKSpNYXRoLmNvcyhpKSxzPW4qTWF0aC5zaW4oaSksbD10K2EsYz1lK3MsdT0xXm8saD1vP2ktcjpyLWk7aWYobjwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiK24pO251bGw9PT10aGlzLl94MT90aGlzLl8rPSJNIitsKyIsIitjOihNYXRoLmFicyh0aGlzLl94MS1sKT5oVnx8TWF0aC5hYnModGhpcy5feTEtYyk+aFYpJiYodGhpcy5fKz0iTCIrbCsiLCIrYyksbiYmKGg8MCYmKGg9aCV1Vit1ViksaD5kVj90aGlzLl8rPSJBIituKyIsIituKyIsMCwxLCIrdSsiLCIrKHQtYSkrIiwiKyhlLXMpKyJBIituKyIsIituKyIsMCwxLCIrdSsiLCIrKHRoaXMuX3gxPWwpKyIsIisodGhpcy5feTE9Yyk6aD5oViYmKHRoaXMuXys9IkEiK24rIiwiK24rIiwwLCIrICsoaD49Y1YpKyIsIit1KyIsIisodGhpcy5feDE9dCtuKk1hdGguY29zKHIpKSsiLCIrKHRoaXMuX3kxPWUrbipNYXRoLnNpbihyKSkpKX0scmVjdDpmdW5jdGlvbih0LGUsbixpKXt0aGlzLl8rPSJNIisodGhpcy5feDA9dGhpcy5feDE9K3QpKyIsIisodGhpcy5feTA9dGhpcy5feTE9K2UpKyJoIisgK24rInYiKyAraSsiaCIrLW4rIloifSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl99fTt2YXIgYlY9IiQiO2Z1bmN0aW9uIHhWKCl7fWZ1bmN0aW9uIHdWKHQsZSl7dmFyIG49bmV3IHhWO2lmKHQgaW5zdGFuY2VvZiB4Vil0LmVhY2goKGZ1bmN0aW9uKHQsZSl7bi5zZXQoZSx0KX0pKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkodCkpe3ZhciBpLHI9LTEsbz10Lmxlbmd0aDtpZihudWxsPT1lKWZvcig7KytyPG87KW4uc2V0KHIsdFtyXSk7ZWxzZSBmb3IoOysrcjxvOyluLnNldChlKGk9dFtyXSxyLHQpLGkpfWVsc2UgaWYodClmb3IodmFyIGEgaW4gdCluLnNldChhLHRbYV0pO3JldHVybiBufWZ1bmN0aW9uIFNWKCl7cmV0dXJue319ZnVuY3Rpb24gTVYodCxlLG4pe3RbZV09bn1mdW5jdGlvbiBFVigpe3JldHVybiB3VigpfWZ1bmN0aW9uIFRWKHQsZSxuKXt0LnNldChlLG4pfWZ1bmN0aW9uIENWKCl7fXhWLnByb3RvdHlwZT13Vi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnhWLGhhczpmdW5jdGlvbih0KXtyZXR1cm4gYlYrdCBpbiB0aGlzfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbYlYrdF19LHNldDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzW2JWK3RdPWUsdGhpc30scmVtb3ZlOmZ1bmN0aW9uKHQpe3ZhciBlPWJWK3Q7cmV0dXJuIGUgaW4gdGhpcyYmZGVsZXRlIHRoaXNbZV19LGNsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpdFswXT09PWJWJiZkZWxldGUgdGhpc1t0XX0sa2V5czpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT1iViYmdC5wdXNoKGUuc2xpY2UoMSkpO3JldHVybiB0fSx2YWx1ZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gdGhpcyllWzBdPT09YlYmJnQucHVzaCh0aGlzW2VdKTtyZXR1cm4gdH0sZW50cmllczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT1iViYmdC5wdXNoKHtrZXk6ZS5zbGljZSgxKSx2YWx1ZTp0aGlzW2VdfSk7cmV0dXJuIHR9LHNpemU6ZnVuY3Rpb24oKXt2YXIgdD0wO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT1iViYmKyt0O3JldHVybiB0fSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzKWlmKHRbMF09PT1iVilyZXR1cm4hMTtyZXR1cm4hMH0sZWFjaDpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdGhpcyllWzBdPT09YlYmJnQodGhpc1tlXSxlLnNsaWNlKDEpLHRoaXMpfX07dmFyIEFWPXdWLnByb3RvdHlwZTtmdW5jdGlvbiBrVih0LGUpe3ZhciBuPW5ldyBDVjtpZih0IGluc3RhbmNlb2YgQ1YpdC5lYWNoKChmdW5jdGlvbih0KXtuLmFkZCh0KX0pKTtlbHNlIGlmKHQpe3ZhciBpPS0xLHI9dC5sZW5ndGg7aWYobnVsbD09ZSlmb3IoOysraTxyOyluLmFkZCh0W2ldKTtlbHNlIGZvcig7KytpPHI7KW4uYWRkKGUodFtpXSxpLHQpKX1yZXR1cm4gbn1mdW5jdGlvbiBMVih0LGUsbil7dC5wcm90b3R5cGU9ZS5wcm90b3R5cGU9bixuLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24gUFYodCxlKXt2YXIgbj1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIGkgaW4gZSluW2ldPWVbaV07cmV0dXJuIG59ZnVuY3Rpb24gTlYoKXt9Q1YucHJvdG90eXBlPWtWLnByb3RvdHlwZT17Y29uc3RydWN0b3I6Q1YsaGFzOkFWLmhhcyxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbYlYrKHQrPSIiKV09dCx0aGlzfSxyZW1vdmU6QVYucmVtb3ZlLGNsZWFyOkFWLmNsZWFyLHZhbHVlczpBVi5rZXlzLHNpemU6QVYuc2l6ZSxlbXB0eTpBVi5lbXB0eSxlYWNoOkFWLmVhY2h9O3ZhciBJVj0uNyxSVj0xL0lWLE9WPSJcXHMqKFsrLV0/XFxkKylcXHMqIix6Vj0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIixEVj0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIsQlY9L14jKFswLTlhLWZdezN9KSQvLEhWPS9eIyhbMC05YS1mXXs2fSkkLyxGVj1uZXcgUmVnRXhwKCJecmdiXFwoIitbT1YsT1YsT1ZdKyJcXCkkIiksVlY9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW0RWLERWLERWXSsiXFwpJCIpLFVWPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbT1YsT1YsT1YselZdKyJcXCkkIiksalY9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tEVixEVixEVix6Vl0rIlxcKSQiKSxHVj1uZXcgUmVnRXhwKCJeaHNsXFwoIitbelYsRFYsRFZdKyJcXCkkIiksV1Y9bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1t6VixEVixEVix6Vl0rIlxcKSQiKSxxVj17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtmdW5jdGlvbiBZVih0KXt2YXIgZTtyZXR1cm4gdD0odCsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKGU9QlYuZXhlYyh0KSk/bmV3IEpWKChlPXBhcnNlSW50KGVbMV0sMTYpKT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgxNSZlKTw8NHwxNSZlLDEpOihlPUhWLmV4ZWModCkpP1hWKHBhcnNlSW50KGVbMV0sMTYpKTooZT1GVi5leGVjKHQpKT9uZXcgSlYoZVsxXSxlWzJdLGVbM10sMSk6KGU9VlYuZXhlYyh0KSk/bmV3IEpWKDI1NSplWzFdLzEwMCwyNTUqZVsyXS8xMDAsMjU1KmVbM10vMTAwLDEpOihlPVVWLmV4ZWModCkpPyRWKGVbMV0sZVsyXSxlWzNdLGVbNF0pOihlPWpWLmV4ZWModCkpPyRWKDI1NSplWzFdLzEwMCwyNTUqZVsyXS8xMDAsMjU1KmVbM10vMTAwLGVbNF0pOihlPUdWLmV4ZWModCkpP1FWKGVbMV0sZVsyXS8xMDAsZVszXS8xMDAsMSk6KGU9V1YuZXhlYyh0KSk/UVYoZVsxXSxlWzJdLzEwMCxlWzNdLzEwMCxlWzRdKTpxVi5oYXNPd25Qcm9wZXJ0eSh0KT9YVihxVlt0XSk6InRyYW5zcGFyZW50Ij09PXQ/bmV3IEpWKE5hTixOYU4sTmFOLDApOm51bGx9ZnVuY3Rpb24gWFYodCl7cmV0dXJuIG5ldyBKVih0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQsMSl9ZnVuY3Rpb24gJFYodCxlLG4saSl7cmV0dXJuIGk8PTAmJih0PWU9bj1OYU4pLG5ldyBKVih0LGUsbixpKX1mdW5jdGlvbiBLVih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIE5WfHwodD1ZVih0KSksdD9uZXcgSlYoKHQ9dC5yZ2IoKSkucix0LmcsdC5iLHQub3BhY2l0eSk6bmV3IEpWfWZ1bmN0aW9uIFpWKHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9LVih0KTpuZXcgSlYodCxlLG4sbnVsbD09aT8xOmkpfWZ1bmN0aW9uIEpWKHQsZSxuLGkpe3RoaXMucj0rdCx0aGlzLmc9K2UsdGhpcy5iPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiBRVih0LGUsbixpKXtyZXR1cm4gaTw9MD90PWU9bj1OYU46bjw9MHx8bj49MT90PWU9TmFOOmU8PTAmJih0PU5hTiksbmV3IG5VKHQsZSxuLGkpfWZ1bmN0aW9uIHRVKHQpe2lmKHQgaW5zdGFuY2VvZiBuVSlyZXR1cm4gbmV3IG5VKHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIE5WfHwodD1ZVih0KSksIXQpcmV0dXJuIG5ldyBuVTtpZih0IGluc3RhbmNlb2YgblUpcmV0dXJuIHQ7dmFyIGU9KHQ9dC5yZ2IoKSkuci8yNTUsbj10LmcvMjU1LGk9dC5iLzI1NSxyPU1hdGgubWluKGUsbixpKSxvPU1hdGgubWF4KGUsbixpKSxhPU5hTixzPW8tcixsPShvK3IpLzI7cmV0dXJuIHM/KGE9ZT09PW8/KG4taSkvcys2KihuPGkpOm49PT1vPyhpLWUpL3MrMjooZS1uKS9zKzQscy89bDwuNT9vK3I6Mi1vLXIsYSo9NjApOnM9bD4wJiZsPDE/MDphLG5ldyBuVShhLHMsbCx0Lm9wYWNpdHkpfWZ1bmN0aW9uIGVVKHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90VSh0KTpuZXcgblUodCxlLG4sbnVsbD09aT8xOmkpfWZ1bmN0aW9uIG5VKHQsZSxuLGkpe3RoaXMuaD0rdCx0aGlzLnM9K2UsdGhpcy5sPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiBpVSh0LGUsbil7cmV0dXJuIDI1NSoodDw2MD9lKyhuLWUpKnQvNjA6dDwxODA/bjp0PDI0MD9lKyhuLWUpKigyNDAtdCkvNjA6ZSl9TFYoTlYsWVYse2Rpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKSsiIn19KSxMVihKVixaVixQVihOVix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9SVjpNYXRoLnBvdyhSVix0KSxuZXcgSlYodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/SVY6TWF0aC5wb3coSVYsdCksbmV3IEpWKHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybiAwPD10aGlzLnImJnRoaXMucjw9MjU1JiYwPD10aGlzLmcmJnRoaXMuZzw9MjU1JiYwPD10aGlzLmImJnRoaXMuYjw9MjU1JiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX19KSksTFYoblUsZVUsUFYoTlYse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/UlY6TWF0aC5wb3coUlYsdCksbmV3IG5VKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/SVY6TWF0aC5wb3coSVYsdCksbmV3IG5VKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5oJTM2MCszNjAqKHRoaXMuaDwwKSxlPWlzTmFOKHQpfHxpc05hTih0aGlzLnMpPzA6dGhpcy5zLG49dGhpcy5sLGk9bisobjwuNT9uOjEtbikqZSxyPTIqbi1pO3JldHVybiBuZXcgSlYoaVUodD49MjQwP3QtMjQwOnQrMTIwLHIsaSksaVUodCxyLGkpLGlVKHQ8MTIwP3QrMjQwOnQtMTIwLHIsaSksdGhpcy5vcGFjaXR5KX0sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4oMDw9dGhpcy5zJiZ0aGlzLnM8PTF8fGlzTmFOKHRoaXMucykpJiYwPD10aGlzLmwmJnRoaXMubDw9MSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9fSkpO3ZhciByVT1NYXRoLlBJLzE4MCxvVT0xODAvTWF0aC5QSSxhVT0uOTUwNDcsc1U9MS4wODg4MyxsVT00LzI5LGNVPTYvMjksdVU9MypjVSpjVTtmdW5jdGlvbiBoVSh0KXtpZih0IGluc3RhbmNlb2YgcFUpcmV0dXJuIG5ldyBwVSh0LmwsdC5hLHQuYix0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiBiVSl7dmFyIGU9dC5oKnJVO3JldHVybiBuZXcgcFUodC5sLE1hdGguY29zKGUpKnQuYyxNYXRoLnNpbihlKSp0LmMsdC5vcGFjaXR5KX10IGluc3RhbmNlb2YgSlZ8fCh0PUtWKHQpKTt2YXIgbj1fVSh0LnIpLGk9X1UodC5nKSxyPV9VKHQuYiksbz1mVSgoLjQxMjQ1NjQqbisuMzU3NTc2MSppKy4xODA0Mzc1KnIpL2FVKSxhPWZVKCguMjEyNjcyOSpuKy43MTUxNTIyKmkrLjA3MjE3NSpyKS8xKTtyZXR1cm4gbmV3IHBVKDExNiphLTE2LDUwMCooby1hKSwyMDAqKGEtZlUoKC4wMTkzMzM5Km4rLjExOTE5MippKy45NTAzMDQxKnIpL3NVKSksdC5vcGFjaXR5KX1mdW5jdGlvbiBkVSh0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/aFUodCk6bmV3IHBVKHQsZSxuLG51bGw9PWk/MTppKX1mdW5jdGlvbiBwVSh0LGUsbixpKXt0aGlzLmw9K3QsdGhpcy5hPStlLHRoaXMuYj0rbix0aGlzLm9wYWNpdHk9K2l9ZnVuY3Rpb24gZlUodCl7cmV0dXJuIHQ+LjAwODg1NjQ1MTY3OTAzNTYzMT9NYXRoLnBvdyh0LDEvMyk6dC91VStsVX1mdW5jdGlvbiBtVSh0KXtyZXR1cm4gdD5jVT90KnQqdDp1VSoodC1sVSl9ZnVuY3Rpb24gZ1UodCl7cmV0dXJuIDI1NSoodDw9LjAwMzEzMDg/MTIuOTIqdDoxLjA1NSpNYXRoLnBvdyh0LDEvMi40KS0uMDU1KX1mdW5jdGlvbiBfVSh0KXtyZXR1cm4odC89MjU1KTw9LjA0MDQ1P3QvMTIuOTI6TWF0aC5wb3coKHQrLjA1NSkvMS4wNTUsMi40KX1mdW5jdGlvbiB5VSh0KXtpZih0IGluc3RhbmNlb2YgYlUpcmV0dXJuIG5ldyBiVSh0LmgsdC5jLHQubCx0Lm9wYWNpdHkpO3QgaW5zdGFuY2VvZiBwVXx8KHQ9aFUodCkpO3ZhciBlPU1hdGguYXRhbjIodC5iLHQuYSkqb1U7cmV0dXJuIG5ldyBiVShlPDA/ZSszNjA6ZSxNYXRoLnNxcnQodC5hKnQuYSt0LmIqdC5iKSx0LmwsdC5vcGFjaXR5KX1mdW5jdGlvbiB2VSh0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/eVUodCk6bmV3IGJVKHQsZSxuLG51bGw9PWk/MTppKX1mdW5jdGlvbiBiVSh0LGUsbixpKXt0aGlzLmg9K3QsdGhpcy5jPStlLHRoaXMubD0rbix0aGlzLm9wYWNpdHk9K2l9TFYocFUsZFUsUFYoTlYse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcFUodGhpcy5sKzE4KihudWxsPT10PzE6dCksdGhpcy5hLHRoaXMuYix0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBwVSh0aGlzLmwtMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PSh0aGlzLmwrMTYpLzExNixlPWlzTmFOKHRoaXMuYSk/dDp0K3RoaXMuYS81MDAsbj1pc05hTih0aGlzLmIpP3Q6dC10aGlzLmIvMjAwO3JldHVybiB0PTEqbVUodCksbmV3IEpWKGdVKDMuMjQwNDU0MiooZT1hVSptVShlKSktMS41MzcxMzg1KnQtLjQ5ODUzMTQqKG49c1UqbVUobikpKSxnVSgtLjk2OTI2NiplKzEuODc2MDEwOCp0Ky4wNDE1NTYqbiksZ1UoLjA1NTY0MzQqZS0uMjA0MDI1OSp0KzEuMDU3MjI1MipuKSx0aGlzLm9wYWNpdHkpfX0pKSxMVihiVSx2VSxQVihOVix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBiVSh0aGlzLmgsdGhpcy5jLHRoaXMubCsxOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGJVKHRoaXMuaCx0aGlzLmMsdGhpcy5sLTE4KihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIGhVKHRoaXMpLnJnYigpfX0pKTt2YXIgeFU9LS4yOTIyNyx3VT0tLjkwNjQ5LFNVPTEuOTcyOTQ7ZnVuY3Rpb24gTVUodCl7aWYodCBpbnN0YW5jZW9mIFRVKXJldHVybiBuZXcgVFUodC5oLHQucyx0LmwsdC5vcGFjaXR5KTt0IGluc3RhbmNlb2YgSlZ8fCh0PUtWKHQpKTt2YXIgZT10LmcvMjU1LG49dC5iLzI1NSxpPSgtLjY1NTc2MzY2Njc5OTk5OTkqbit0LnIvMjU1Ki0xLjc4ODQ1MDM4MDYtMy41MTcyOTgyNDM4KmUpLy01Ljk2MTUxMjI5MTIscj1uLWksbz0oU1UqKGUtaSkteFUqcikvd1UsYT1NYXRoLnNxcnQobypvK3IqcikvKFNVKmkqKDEtaSkpLHM9YT9NYXRoLmF0YW4yKG8scikqb1UtMTIwOk5hTjtyZXR1cm4gbmV3IFRVKHM8MD9zKzM2MDpzLGEsaSx0Lm9wYWNpdHkpfWZ1bmN0aW9uIEVVKHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9NVSh0KTpuZXcgVFUodCxlLG4sbnVsbD09aT8xOmkpfWZ1bmN0aW9uIFRVKHQsZSxuLGkpe3RoaXMuaD0rdCx0aGlzLnM9K2UsdGhpcy5sPStuLHRoaXMub3BhY2l0eT0raX1MVihUVSxFVSxQVihOVix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9SVjpNYXRoLnBvdyhSVix0KSxuZXcgVFUodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9JVjpNYXRoLnBvdyhJVix0KSxuZXcgVFUodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD1pc05hTih0aGlzLmgpPzA6KHRoaXMuaCsxMjApKnJVLGU9K3RoaXMubCxuPWlzTmFOKHRoaXMucyk/MDp0aGlzLnMqZSooMS1lKSxpPU1hdGguY29zKHQpLHI9TWF0aC5zaW4odCk7cmV0dXJuIG5ldyBKVigyNTUqKGUrbiooLS4xNDg2MSppKzEuNzgyNzcqcikpLDI1NSooZStuKih4VSppK3dVKnIpKSwyNTUqKGUrbiooU1UqaSkpLHRoaXMub3BhY2l0eSl9fSkpO3ZhciBDVT17dmFsdWU6ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBBVSgpe2Zvcih2YXIgdCxlPTAsbj1hcmd1bWVudHMubGVuZ3RoLGk9e307ZTxuOysrZSl7aWYoISh0PWFyZ3VtZW50c1tlXSsiIil8fHQgaW4gaSl0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgdHlwZTogIit0KTtpW3RdPVtdfXJldHVybiBuZXcga1UoaSl9ZnVuY3Rpb24ga1UodCl7dGhpcy5fPXR9ZnVuY3Rpb24gTFUodCxlKXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKChmdW5jdGlvbih0KXt2YXIgbj0iIixpPXQuaW5kZXhPZigiLiIpO2lmKGk+PTAmJihuPXQuc2xpY2UoaSsxKSx0PXQuc2xpY2UoMCxpKSksdCYmIWUuaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7cmV0dXJue3R5cGU6dCxuYW1lOm59fSkpfWZ1bmN0aW9uIFBVKHQsZSl7Zm9yKHZhciBuLGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpaWYoKG49dFtpXSkubmFtZT09PWUpcmV0dXJuIG4udmFsdWV9ZnVuY3Rpb24gTlUodCxlLG4pe2Zvcih2YXIgaT0wLHI9dC5sZW5ndGg7aTxyOysraSlpZih0W2ldLm5hbWU9PT1lKXt0W2ldPUNVLHQ9dC5zbGljZSgwLGkpLmNvbmNhdCh0LnNsaWNlKGkrMSkpO2JyZWFrfXJldHVybiBudWxsIT1uJiZ0LnB1c2goe25hbWU6ZSx2YWx1ZTpufSksdH1rVS5wcm90b3R5cGU9QVUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjprVSxvbjpmdW5jdGlvbih0LGUpe3ZhciBuLGk9dGhpcy5fLHI9TFUodCsiIixpKSxvPS0xLGE9ci5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrZSk7Zm9yKDsrK288YTspaWYobj0odD1yW29dKS50eXBlKWlbbl09TlUoaVtuXSx0Lm5hbWUsZSk7ZWxzZSBpZihudWxsPT1lKWZvcihuIGluIGkpaVtuXT1OVShpW25dLHQubmFtZSxudWxsKTtyZXR1cm4gdGhpc31mb3IoOysrbzxhOylpZigobj0odD1yW29dKS50eXBlKSYmKG49UFUoaVtuXSx0Lm5hbWUpKSlyZXR1cm4gbn0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LGU9dGhpcy5fO2Zvcih2YXIgbiBpbiBlKXRbbl09ZVtuXS5zbGljZSgpO3JldHVybiBuZXcga1UodCl9LGNhbGw6ZnVuY3Rpb24odCxlKXtpZigobj1hcmd1bWVudHMubGVuZ3RoLTIpPjApZm9yKHZhciBuLGkscj1uZXcgQXJyYXkobiksbz0wO288bjsrK28pcltvXT1hcmd1bWVudHNbbysyXTtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2ZvcihvPTAsbj0oaT10aGlzLl9bdF0pLmxlbmd0aDtvPG47KytvKWlbb10udmFsdWUuYXBwbHkoZSxyKX0sYXBwbHk6ZnVuY3Rpb24odCxlLG4pe2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKHZhciBpPXRoaXMuX1t0XSxyPTAsbz1pLmxlbmd0aDtyPG87KytyKWlbcl0udmFsdWUuYXBwbHkoZSxuKX19O3ZhciBJVT17dmFsdWU6ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBSVSgpe2Zvcih2YXIgdCxlPTAsbj1hcmd1bWVudHMubGVuZ3RoLGk9e307ZTxuOysrZSl7aWYoISh0PWFyZ3VtZW50c1tlXSsiIil8fHQgaW4gaXx8L1tccy5dLy50ZXN0KHQpKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO2lbdF09W119cmV0dXJuIG5ldyBPVShpKX1mdW5jdGlvbiBPVSh0KXt0aGlzLl89dH1mdW5jdGlvbiB6VSh0LGUpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBuPSIiLGk9dC5pbmRleE9mKCIuIik7aWYoaT49MCYmKG49dC5zbGljZShpKzEpLHQ9dC5zbGljZSgwLGkpKSx0JiYhZS5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtyZXR1cm57dHlwZTp0LG5hbWU6bn19KSl9ZnVuY3Rpb24gRFUodCxlKXtmb3IodmFyIG4saT0wLHI9dC5sZW5ndGg7aTxyOysraSlpZigobj10W2ldKS5uYW1lPT09ZSlyZXR1cm4gbi52YWx1ZX1mdW5jdGlvbiBCVSh0LGUsbil7Zm9yKHZhciBpPTAscj10Lmxlbmd0aDtpPHI7KytpKWlmKHRbaV0ubmFtZT09PWUpe3RbaV09SVUsdD10LnNsaWNlKDAsaSkuY29uY2F0KHQuc2xpY2UoaSsxKSk7YnJlYWt9cmV0dXJuIG51bGwhPW4mJnQucHVzaCh7bmFtZTplLHZhbHVlOm59KSx0fU9VLnByb3RvdHlwZT1SVS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOk9VLG9uOmZ1bmN0aW9uKHQsZSl7dmFyIG4saT10aGlzLl8scj16VSh0KyIiLGkpLG89LTEsYT1yLmxlbmd0aDtpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2lmKG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjazogIitlKTtmb3IoOysrbzxhOylpZihuPSh0PXJbb10pLnR5cGUpaVtuXT1CVShpW25dLHQubmFtZSxlKTtlbHNlIGlmKG51bGw9PWUpZm9yKG4gaW4gaSlpW25dPUJVKGlbbl0sdC5uYW1lLG51bGwpO3JldHVybiB0aGlzfWZvcig7KytvPGE7KWlmKChuPSh0PXJbb10pLnR5cGUpJiYobj1EVShpW25dLHQubmFtZSkpKXJldHVybiBufSxjb3B5OmZ1bmN0aW9uKCl7dmFyIHQ9e30sZT10aGlzLl87Zm9yKHZhciBuIGluIGUpdFtuXT1lW25dLnNsaWNlKCk7cmV0dXJuIG5ldyBPVSh0KX0sY2FsbDpmdW5jdGlvbih0LGUpe2lmKChuPWFyZ3VtZW50cy5sZW5ndGgtMik+MClmb3IodmFyIG4saSxyPW5ldyBBcnJheShuKSxvPTA7bzxuOysrbylyW29dPWFyZ3VtZW50c1tvKzJdO2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKG89MCxuPShpPXRoaXMuX1t0XSkubGVuZ3RoO288bjsrK28paVtvXS52YWx1ZS5hcHBseShlLHIpfSxhcHBseTpmdW5jdGlvbih0LGUsbil7aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3IodmFyIGk9dGhpcy5fW3RdLHI9MCxvPWkubGVuZ3RoO3I8bzsrK3IpaVtyXS52YWx1ZS5hcHBseShlLG4pfX07dmFyIEhVPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixGVT17c3ZnOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIseGh0bWw6SFUseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTtmdW5jdGlvbiBWVSh0KXt2YXIgZT10Kz0iIixuPWUuaW5kZXhPZigiOiIpO3JldHVybiBuPj0wJiYieG1sbnMiIT09KGU9dC5zbGljZSgwLG4pKSYmKHQ9dC5zbGljZShuKzEpKSxGVS5oYXNPd25Qcm9wZXJ0eShlKT97c3BhY2U6RlVbZV0sbG9jYWw6dH06dH1mdW5jdGlvbiBVVSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLm93bmVyRG9jdW1lbnQsbj10aGlzLm5hbWVzcGFjZVVSSTtyZXR1cm4gbj09PUhVJiZlLmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkk9PT1IVT9lLmNyZWF0ZUVsZW1lbnQodCk6ZS5jcmVhdGVFbGVtZW50TlMobix0KX19ZnVuY3Rpb24galUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gR1UodCl7dmFyIGU9VlUodCk7cmV0dXJuKGUubG9jYWw/alU6VVUpKGUpfWZ1bmN0aW9uIFdVKCl7fWZ1bmN0aW9uIHFVKHQpe3JldHVybiBudWxsPT10P1dVOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3Rvcih0KX19ZnVuY3Rpb24gWVUoKXtyZXR1cm5bXX1mdW5jdGlvbiBYVSh0KXtyZXR1cm4gbmV3IEFycmF5KHQubGVuZ3RoKX1mdW5jdGlvbiAkVSh0LGUpe3RoaXMub3duZXJEb2N1bWVudD10Lm93bmVyRG9jdW1lbnQsdGhpcy5uYW1lc3BhY2VVUkk9dC5uYW1lc3BhY2VVUkksdGhpcy5fbmV4dD1udWxsLHRoaXMuX3BhcmVudD10LHRoaXMuX19kYXRhX189ZX1mdW5jdGlvbiBLVSh0LGUsbixpLHIsbyl7Zm9yKHZhciBhLHM9MCxsPWUubGVuZ3RoLGM9by5sZW5ndGg7czxjOysrcykoYT1lW3NdKT8oYS5fX2RhdGFfXz1vW3NdLGlbc109YSk6bltzXT1uZXcgJFUodCxvW3NdKTtmb3IoO3M8bDsrK3MpKGE9ZVtzXSkmJihyW3NdPWEpfWZ1bmN0aW9uIFpVKHQsZSxuLGkscixvLGEpe3ZhciBzLGwsYyx1PXt9LGg9ZS5sZW5ndGgsZD1vLmxlbmd0aCxwPW5ldyBBcnJheShoKTtmb3Iocz0wO3M8aDsrK3MpKGw9ZVtzXSkmJihwW3NdPWM9IiQiK2EuY2FsbChsLGwuX19kYXRhX18scyxlKSxjIGluIHU/cltzXT1sOnVbY109bCk7Zm9yKHM9MDtzPGQ7KytzKShsPXVbYz0iJCIrYS5jYWxsKHQsb1tzXSxzLG8pXSk/KGlbc109bCxsLl9fZGF0YV9fPW9bc10sdVtjXT1udWxsKTpuW3NdPW5ldyAkVSh0LG9bc10pO2ZvcihzPTA7czxoOysrcykobD1lW3NdKSYmdVtwW3NdXT09PWwmJihyW3NdPWwpfWZ1bmN0aW9uIEpVKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTp0Pj1lPzA6TmFOfWZ1bmN0aW9uIFFVKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX1mdW5jdGlvbiB0aih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIGVqKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUodCxlKX19ZnVuY3Rpb24gbmoodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxlKX19ZnVuY3Rpb24gaWoodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpOnRoaXMuc2V0QXR0cmlidXRlKHQsbil9fWZ1bmN0aW9uIHJqKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk6dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsbil9fWZ1bmN0aW9uIG9qKHQpe3JldHVybiB0Lm93bmVyRG9jdW1lbnQmJnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8dC5kb2N1bWVudCYmdHx8dC5kZWZhdWx0Vmlld31mdW5jdGlvbiBhaih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX1mdW5jdGlvbiBzaih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LGUsbil9fWZ1bmN0aW9uIGxqKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1pP3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCk6dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LGksbil9fWZ1bmN0aW9uIGNqKHQsZSl7cmV0dXJuIHQuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShlKXx8b2oodCkuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpLmdldFByb3BlcnR5VmFsdWUoZSl9ZnVuY3Rpb24gdWoodCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbdF19fWZ1bmN0aW9uIGhqKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpc1t0XT1lfX1mdW5jdGlvbiBkaih0LGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PW4/ZGVsZXRlIHRoaXNbdF06dGhpc1t0XT1ufX1mdW5jdGlvbiBwaih0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLyl9ZnVuY3Rpb24gZmoodCl7cmV0dXJuIHQuY2xhc3NMaXN0fHxuZXcgbWoodCl9ZnVuY3Rpb24gbWoodCl7dGhpcy5fbm9kZT10LHRoaXMuX25hbWVzPXBqKHQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9ZnVuY3Rpb24gZ2oodCxlKXtmb3IodmFyIG49ZmoodCksaT0tMSxyPWUubGVuZ3RoOysraTxyOyluLmFkZChlW2ldKX1mdW5jdGlvbiBfaih0LGUpe2Zvcih2YXIgbj1maih0KSxpPS0xLHI9ZS5sZW5ndGg7KytpPHI7KW4ucmVtb3ZlKGVbaV0pfWZ1bmN0aW9uIHlqKHQpe3JldHVybiBmdW5jdGlvbigpe2dqKHRoaXMsdCl9fWZ1bmN0aW9uIHZqKHQpe3JldHVybiBmdW5jdGlvbigpe19qKHRoaXMsdCl9fWZ1bmN0aW9uIGJqKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7KGUuYXBwbHkodGhpcyxhcmd1bWVudHMpP2dqOl9qKSh0aGlzLHQpfX1mdW5jdGlvbiB4aigpe3RoaXMudGV4dENvbnRlbnQ9IiJ9ZnVuY3Rpb24gd2oodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD10fX1mdW5jdGlvbiBTaih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PWU/IiI6ZX19ZnVuY3Rpb24gTWooKXt0aGlzLmlubmVySFRNTD0iIn1mdW5jdGlvbiBFaih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD10fX1mdW5jdGlvbiBUaih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT1lPyIiOmV9fWZ1bmN0aW9uIENqKCl7dGhpcy5uZXh0U2libGluZyYmdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpfWZ1bmN0aW9uIEFqKCl7dGhpcy5wcmV2aW91c1NpYmxpbmcmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcyx0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCl9ZnVuY3Rpb24ga2ooKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBMaigpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTt0JiZ0LnJlbW92ZUNoaWxkKHRoaXMpfWZ1bmN0aW9uIFBqKCl7dmFyIHQ9dGhpcy5jbG9uZU5vZGUoITEpLGU9dGhpcy5wYXJlbnROb2RlO3JldHVybiBlP2UuaW5zZXJ0QmVmb3JlKHQsdGhpcy5uZXh0U2libGluZyk6dH1mdW5jdGlvbiBOaigpe3ZhciB0PXRoaXMuY2xvbmVOb2RlKCEwKSxlPXRoaXMucGFyZW50Tm9kZTtyZXR1cm4gZT9lLmluc2VydEJlZm9yZSh0LHRoaXMubmV4dFNpYmxpbmcpOnR9JFUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjokVSxhcHBlbmRDaGlsZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LHRoaXMuX25leHQpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LGUpfSxxdWVyeVNlbGVjdG9yOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3Rvcih0KX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCl9fSxtai5wcm90b3R5cGU9e2FkZDpmdW5jdGlvbih0KXt0aGlzLl9uYW1lcy5pbmRleE9mKHQpPDAmJih0aGlzLl9uYW1lcy5wdXNoKHQpLHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5fbmFtZXMuam9pbigiICIpKSl9LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9uYW1lcy5pbmRleE9mKHQpO2U+PTAmJih0aGlzLl9uYW1lcy5zcGxpY2UoZSwxKSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxjb250YWluczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZih0KT49MH19O3ZhciBJaj17fSxSaj1udWxsO2Z1bmN0aW9uIE9qKHQsZSxuKXtyZXR1cm4gdD16aih0LGUsbiksZnVuY3Rpb24oZSl7dmFyIG49ZS5yZWxhdGVkVGFyZ2V0O24mJihuPT09dGhpc3x8OCZuLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpKXx8dC5jYWxsKHRoaXMsZSl9fWZ1bmN0aW9uIHpqKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIHI9Umo7Umo9aTt0cnl7dC5jYWxsKHRoaXMsdGhpcy5fX2RhdGFfXyxlLG4pfWZpbmFsbHl7Umo9cn19fWZ1bmN0aW9uIERqKHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlPSIiLG49dC5pbmRleE9mKCIuIik7cmV0dXJuIG4+PTAmJihlPXQuc2xpY2UobisxKSx0PXQuc2xpY2UoMCxuKSkse3R5cGU6dCxuYW1lOmV9fSkpfWZ1bmN0aW9uIEJqKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuX19vbjtpZihlKXtmb3IodmFyIG4saT0wLHI9LTEsbz1lLmxlbmd0aDtpPG87KytpKW49ZVtpXSx0LnR5cGUmJm4udHlwZSE9PXQudHlwZXx8bi5uYW1lIT09dC5uYW1lP2VbKytyXT1uOnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLnR5cGUsbi5saXN0ZW5lcixuLmNhcHR1cmUpOysrcj9lLmxlbmd0aD1yOmRlbGV0ZSB0aGlzLl9fb259fX1mdW5jdGlvbiBIaih0LGUsbil7dmFyIGk9SWouaGFzT3duUHJvcGVydHkodC50eXBlKT9Pajp6ajtyZXR1cm4gZnVuY3Rpb24ocixvLGEpe3ZhciBzLGw9dGhpcy5fX29uLGM9aShlLG8sYSk7aWYobClmb3IodmFyIHU9MCxoPWwubGVuZ3RoO3U8aDsrK3UpaWYoKHM9bFt1XSkudHlwZT09PXQudHlwZSYmcy5uYW1lPT09dC5uYW1lKXJldHVybiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIocy50eXBlLHMubGlzdGVuZXIscy5jYXB0dXJlKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIocy50eXBlLHMubGlzdGVuZXI9YyxzLmNhcHR1cmU9biksdm9pZChzLnZhbHVlPWUpO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LnR5cGUsYyxuKSxzPXt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSx2YWx1ZTplLGxpc3RlbmVyOmMsY2FwdHVyZTpufSxsP2wucHVzaChzKTp0aGlzLl9fb249W3NdfX1mdW5jdGlvbiBGaih0LGUsbixpKXt2YXIgcj1Sajt0LnNvdXJjZUV2ZW50PVJqLFJqPXQ7dHJ5e3JldHVybiBlLmFwcGx5KG4saSl9ZmluYWxseXtSaj1yfX1mdW5jdGlvbiBWaih0LGUsbil7dmFyIGk9b2oodCkscj1pLkN1c3RvbUV2ZW50OyJmdW5jdGlvbiI9PXR5cGVvZiByP3I9bmV3IHIoZSxuKToocj1pLmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLG4/KHIuaW5pdEV2ZW50KGUsbi5idWJibGVzLG4uY2FuY2VsYWJsZSksci5kZXRhaWw9bi5kZXRhaWwpOnIuaW5pdEV2ZW50KGUsITEsITEpKSx0LmRpc3BhdGNoRXZlbnQocil9ZnVuY3Rpb24gVWoodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gVmoodGhpcyx0LGUpfX1mdW5jdGlvbiBqaih0LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBWaih0aGlzLHQsZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX0idW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiYoIm9ubW91c2VlbnRlciJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fChJaj17bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9KSk7dmFyIEdqPVtudWxsXTtmdW5jdGlvbiBXaih0LGUpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9ZX1mdW5jdGlvbiBxaih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFdqKFtbZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0KV1dLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgV2ooW1t0XV0sR2opfWZ1bmN0aW9uIFlqKCl7Zm9yKHZhciB0LGU9Umo7dD1lLnNvdXJjZUV2ZW50OyllPXQ7cmV0dXJuIGV9ZnVuY3Rpb24gWGoodCxlKXt2YXIgbj10Lm93bmVyU1ZHRWxlbWVudHx8dDtpZihuLmNyZWF0ZVNWR1BvaW50KXt2YXIgaT1uLmNyZWF0ZVNWR1BvaW50KCk7cmV0dXJuIGkueD1lLmNsaWVudFgsaS55PWUuY2xpZW50WSxbKGk9aS5tYXRyaXhUcmFuc2Zvcm0odC5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpKS54LGkueV19dmFyIHI9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm5bZS5jbGllbnRYLXIubGVmdC10LmNsaWVudExlZnQsZS5jbGllbnRZLXIudG9wLXQuY2xpZW50VG9wXX1mdW5jdGlvbiAkaih0KXt2YXIgZT1ZaigpO3JldHVybiBlLmNoYW5nZWRUb3VjaGVzJiYoZT1lLmNoYW5nZWRUb3VjaGVzWzBdKSxYaih0LGUpfWZ1bmN0aW9uIEtqKHQsZSxuKXthcmd1bWVudHMubGVuZ3RoPDMmJihuPWUsZT1ZaigpLmNoYW5nZWRUb3VjaGVzKTtmb3IodmFyIGkscj0wLG89ZT9lLmxlbmd0aDowO3I8bzsrK3IpaWYoKGk9ZVtyXSkuaWRlbnRpZmllcj09PW4pcmV0dXJuIFhqKHQsaSk7cmV0dXJuIG51bGx9ZnVuY3Rpb24gWmooKXtSai5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBKaigpe1JqLnByZXZlbnREZWZhdWx0KCksUmouc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gUWoodCl7dmFyIGU9dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbj1xaih0KS5vbigiZHJhZ3N0YXJ0LmRyYWciLEpqLCEwKTsib25zZWxlY3RzdGFydCJpbiBlP24ub24oInNlbGVjdHN0YXJ0LmRyYWciLEpqLCEwKTooZS5fX25vc2VsZWN0PWUuc3R5bGUuTW96VXNlclNlbGVjdCxlLnN0eWxlLk1velVzZXJTZWxlY3Q9Im5vbmUiKX1mdW5jdGlvbiB0Ryh0LGUpe3ZhciBuPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGk9cWoodCkub24oImRyYWdzdGFydC5kcmFnIixudWxsKTtlJiYoaS5vbigiY2xpY2suZHJhZyIsSmosITApLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aS5vbigiY2xpY2suZHJhZyIsbnVsbCl9KSwwKSksIm9uc2VsZWN0c3RhcnQiaW4gbj9pLm9uKCJzZWxlY3RzdGFydC5kcmFnIixudWxsKToobi5zdHlsZS5Nb3pVc2VyU2VsZWN0PW4uX19ub3NlbGVjdCxkZWxldGUgbi5fX25vc2VsZWN0KX1mdW5jdGlvbiBlRyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gbkcodCxlLG4saSxyLG8sYSxzLGwsYyl7dGhpcy50YXJnZXQ9dCx0aGlzLnR5cGU9ZSx0aGlzLnN1YmplY3Q9bix0aGlzLmlkZW50aWZpZXI9aSx0aGlzLmFjdGl2ZT1yLHRoaXMueD1vLHRoaXMueT1hLHRoaXMuZHg9cyx0aGlzLmR5PWwsdGhpcy5fPWN9ZnVuY3Rpb24gaUcoKXtyZXR1cm4hUmouYnV0dG9ufWZ1bmN0aW9uIHJHKCl7cmV0dXJuIHRoaXMucGFyZW50Tm9kZX1mdW5jdGlvbiBvRyh0KXtyZXR1cm4gbnVsbD09dD97eDpSai54LHk6UmoueX06dH1mdW5jdGlvbiBhRygpe3JldHVybiJvbnRvdWNoc3RhcnQiaW4gdGhpc31Xai5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOldqLHNlbGVjdDpmdW5jdGlvbiBzRyh0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9cVUodCkpO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj1lLmxlbmd0aCxpPW5ldyBBcnJheShuKSxyPTA7cjxuOysrcilmb3IodmFyIG8sYSxzPWVbcl0sbD1zLmxlbmd0aCxjPWlbcl09bmV3IEFycmF5KGwpLHU9MDt1PGw7Kyt1KShvPXNbdV0pJiYoYT10LmNhbGwobyxvLl9fZGF0YV9fLHUscykpJiYoIl9fZGF0YV9fImluIG8mJihhLl9fZGF0YV9fPW8uX19kYXRhX18pLGNbdV09YSk7cmV0dXJuIG5ldyBXaihpLHRoaXMuX3BhcmVudHMpfSxzZWxlY3RBbGw6ZnVuY3Rpb24gbEcodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PShmdW5jdGlvbiBlKHQpe3JldHVybiBudWxsPT10P1lVOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbCh0KX19KSh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxpPW4ubGVuZ3RoLHI9W10sbz1bXSxhPTA7YTxpOysrYSlmb3IodmFyIHMsbD1uW2FdLGM9bC5sZW5ndGgsdT0wO3U8YzsrK3UpKHM9bFt1XSkmJihyLnB1c2godC5jYWxsKHMscy5fX2RhdGFfXyx1LGwpKSxvLnB1c2gocykpO3JldHVybiBuZXcgV2oocixvKX0sZmlsdGVyOmZ1bmN0aW9uIGNHKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD0oZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXRjaGVzKHQpfX0pKHQpKTtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGk9bi5sZW5ndGgscj1uZXcgQXJyYXkoaSksbz0wO288aTsrK28pZm9yKHZhciBhLHM9bltvXSxsPXMubGVuZ3RoLGM9cltvXT1bXSx1PTA7dTxsOysrdSkoYT1zW3VdKSYmdC5jYWxsKGEsYS5fX2RhdGFfXyx1LHMpJiZjLnB1c2goYSk7cmV0dXJuIG5ldyBXaihyLHRoaXMuX3BhcmVudHMpfSxkYXRhOmZ1bmN0aW9uIHVHKHQsZSl7aWYoIXQpcmV0dXJuIGY9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSx1PS0xLHRoaXMuZWFjaCgoZnVuY3Rpb24odCl7ZlsrK3VdPXR9KSksZjt2YXIgbj1lP1pVOktVLGk9dGhpcy5fcGFyZW50cyxyPXRoaXMuX2dyb3VwczsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9KGZ1bmN0aW9uIG8odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSkodCkpO2Zvcih2YXIgYT1yLmxlbmd0aCxzPW5ldyBBcnJheShhKSxsPW5ldyBBcnJheShhKSxjPW5ldyBBcnJheShhKSx1PTA7dTxhOysrdSl7dmFyIGg9aVt1XSxkPXJbdV0scD1kLmxlbmd0aCxmPXQuY2FsbChoLGgmJmguX19kYXRhX18sdSxpKSxtPWYubGVuZ3RoLGc9bFt1XT1uZXcgQXJyYXkobSksXz1zW3VdPW5ldyBBcnJheShtKTtuKGgsZCxnLF8sY1t1XT1uZXcgQXJyYXkocCksZixlKTtmb3IodmFyIHksdixiPTAseD0wO2I8bTsrK2IpaWYoeT1nW2JdKXtmb3IoYj49eCYmKHg9YisxKTshKHY9X1t4XSkmJisreDxtOyk7eS5fbmV4dD12fHxudWxsfX1yZXR1cm4ocz1uZXcgV2oocyxpKSkuX2VudGVyPWwscy5fZXhpdD1jLHN9LGVudGVyOmZ1bmN0aW9uIGhHKCl7cmV0dXJuIG5ldyBXaih0aGlzLl9lbnRlcnx8dGhpcy5fZ3JvdXBzLm1hcChYVSksdGhpcy5fcGFyZW50cyl9LGV4aXQ6ZnVuY3Rpb24gZEcoKXtyZXR1cm4gbmV3IFdqKHRoaXMuX2V4aXR8fHRoaXMuX2dyb3Vwcy5tYXAoWFUpLHRoaXMuX3BhcmVudHMpfSxqb2luOmZ1bmN0aW9uIHBHKHQsZSxuKXt2YXIgaT10aGlzLmVudGVyKCkscj10aGlzLG89dGhpcy5leGl0KCk7cmV0dXJuIGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dChpKTppLmFwcGVuZCh0KyIiKSxudWxsIT1lJiYocj1lKHIpKSxudWxsPT1uP28ucmVtb3ZlKCk6bihvKSxpJiZyP2kubWVyZ2Uocikub3JkZXIoKTpyfSxtZXJnZTpmdW5jdGlvbiBmRyh0KXtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49dC5fZ3JvdXBzLGk9ZS5sZW5ndGgscj1NYXRoLm1pbihpLG4ubGVuZ3RoKSxvPW5ldyBBcnJheShpKSxhPTA7YTxyOysrYSlmb3IodmFyIHMsbD1lW2FdLGM9blthXSx1PWwubGVuZ3RoLGg9b1thXT1uZXcgQXJyYXkodSksZD0wO2Q8dTsrK2QpKHM9bFtkXXx8Y1tkXSkmJihoW2RdPXMpO2Zvcig7YTxpOysrYSlvW2FdPWVbYV07cmV0dXJuIG5ldyBXaihvLHRoaXMuX3BhcmVudHMpfSxvcmRlcjpmdW5jdGlvbiBtRygpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsZT0tMSxuPXQubGVuZ3RoOysrZTxuOylmb3IodmFyIGkscj10W2VdLG89ci5sZW5ndGgtMSxhPXJbb107LS1vPj0wOykoaT1yW29dKSYmKGEmJjReaS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhKSYmYS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShpLGEpLGE9aSk7cmV0dXJuIHRoaXN9LHNvcnQ6ZnVuY3Rpb24gZ0codCl7ZnVuY3Rpb24gZShlLG4pe3JldHVybiBlJiZuP3QoZS5fX2RhdGFfXyxuLl9fZGF0YV9fKTohZS0hbn10fHwodD1KVSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxpPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGkpLG89MDtvPGk7KytvKXtmb3IodmFyIGEscz1uW29dLGw9cy5sZW5ndGgsYz1yW29dPW5ldyBBcnJheShsKSx1PTA7dTxsOysrdSkoYT1zW3VdKSYmKGNbdV09YSk7Yy5zb3J0KGUpfXJldHVybiBuZXcgV2oocix0aGlzLl9wYXJlbnRzKS5vcmRlcigpfSxjYWxsOmZ1bmN0aW9uIF9HKCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMF09dGhpcyx0LmFwcGx5KG51bGwsYXJndW1lbnRzKSx0aGlzfSxub2RlczpmdW5jdGlvbiB5Rygpe3ZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSksZT0tMTtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3RbKytlXT10aGlzfSkpLHR9LG5vZGU6ZnVuY3Rpb24gdkcoKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLGU9MCxuPXQubGVuZ3RoO2U8bjsrK2UpZm9yKHZhciBpPXRbZV0scj0wLG89aS5sZW5ndGg7cjxvOysrcil7dmFyIGE9aVtyXTtpZihhKXJldHVybiBhfXJldHVybiBudWxsfSxzaXplOmZ1bmN0aW9uIGJHKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpeysrdH0pKSx0fSxlbXB0eTpmdW5jdGlvbiB4Rygpe3JldHVybiF0aGlzLm5vZGUoKX0sZWFjaDpmdW5jdGlvbiB3Ryh0KXtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49MCxpPWUubGVuZ3RoO248aTsrK24pZm9yKHZhciByLG89ZVtuXSxhPTAscz1vLmxlbmd0aDthPHM7KythKShyPW9bYV0pJiZ0LmNhbGwocixyLl9fZGF0YV9fLGEsbyk7cmV0dXJuIHRoaXN9LGF0dHI6ZnVuY3Rpb24gU0codCxlKXt2YXIgbj1WVSh0KTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciBpPXRoaXMubm9kZSgpO3JldHVybiBuLmxvY2FsP2kuZ2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsKTppLmdldEF0dHJpYnV0ZShuKX1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1lP24ubG9jYWw/dGo6UVU6ImZ1bmN0aW9uIj09dHlwZW9mIGU/bi5sb2NhbD9yajppajpuLmxvY2FsP25qOmVqKShuLGUpKX0sc3R5bGU6ZnVuY3Rpb24gTUcodCxlLG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKChudWxsPT1lP2FqOiJmdW5jdGlvbiI9PXR5cGVvZiBlP2xqOnNqKSh0LGUsbnVsbD09bj8iIjpuKSk6Y2oodGhpcy5ub2RlKCksdCl9LHByb3BlcnR5OmZ1bmN0aW9uIEVHKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PWU/dWo6ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZGo6aGopKHQsZSkpOnRoaXMubm9kZSgpW3RdfSxjbGFzc2VkOmZ1bmN0aW9uIFRHKHQsZSl7dmFyIG49cGoodCsiIik7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodmFyIGk9ZmoodGhpcy5ub2RlKCkpLHI9LTEsbz1uLmxlbmd0aDsrK3I8bzspaWYoIWkuY29udGFpbnMobltyXSkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIGU/Ymo6ZT95ajp2aikobixlKSl9LHRleHQ6ZnVuY3Rpb24gQ0codCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKG51bGw9PXQ/eGo6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P1NqOndqKSh0KSk6dGhpcy5ub2RlKCkudGV4dENvbnRlbnR9LGh0bWw6ZnVuY3Rpb24gQUcodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKG51bGw9PXQ/TWo6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P1RqOkVqKSh0KSk6dGhpcy5ub2RlKCkuaW5uZXJIVE1MfSxyYWlzZTpmdW5jdGlvbiBrRygpe3JldHVybiB0aGlzLmVhY2goQ2opfSxsb3dlcjpmdW5jdGlvbiBMRygpe3JldHVybiB0aGlzLmVhY2goQWopfSxhcHBlbmQ6ZnVuY3Rpb24gUEcodCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpHVSh0KTtyZXR1cm4gdGhpcy5zZWxlY3QoKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSkpfSxpbnNlcnQ6ZnVuY3Rpb24gTkcodCxlKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkdVKHQpLGk9bnVsbD09ZT9rajoiZnVuY3Rpb24iPT10eXBlb2YgZT9lOnFVKGUpO3JldHVybiB0aGlzLnNlbGVjdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUobi5hcHBseSh0aGlzLGFyZ3VtZW50cyksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSkpfSxyZW1vdmU6ZnVuY3Rpb24gSUcoKXtyZXR1cm4gdGhpcy5lYWNoKExqKX0sY2xvbmU6ZnVuY3Rpb24gUkcodCl7cmV0dXJuIHRoaXMuc2VsZWN0KHQ/Tmo6UGopfSxkYXR1bTpmdW5jdGlvbiBPRyh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsdCk6dGhpcy5ub2RlKCkuX19kYXRhX199LG9uOmZ1bmN0aW9uIHpHKHQsZSxuKXt2YXIgaSxyLG89RGoodCsiIiksYT1vLmxlbmd0aDtpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2ZvcihzPWU/SGo6QmosbnVsbD09biYmKG49ITEpLGk9MDtpPGE7KytpKXRoaXMuZWFjaChzKG9baV0sZSxuKSk7cmV0dXJuIHRoaXN9dmFyIHM9dGhpcy5ub2RlKCkuX19vbjtpZihzKWZvcih2YXIgbCxjPTAsdT1zLmxlbmd0aDtjPHU7KytjKWZvcihpPTAsbD1zW2NdO2k8YTsrK2kpaWYoKHI9b1tpXSkudHlwZT09PWwudHlwZSYmci5uYW1lPT09bC5uYW1lKXJldHVybiBsLnZhbHVlfSxkaXNwYXRjaDpmdW5jdGlvbiBERyh0LGUpe3JldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBlP2pqOlVqKSh0LGUpKX19LG5HLnByb3RvdHlwZS5vbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuXy5vbi5hcHBseSh0aGlzLl8sYXJndW1lbnRzKTtyZXR1cm4gdD09PXRoaXMuXz90aGlzOnR9O3ZhciBCRz17fSxIRz17fTtmdW5jdGlvbiBGRyh0KXtyZXR1cm4gbmV3IEZ1bmN0aW9uKCJkIiwicmV0dXJuIHsiK3QubWFwKChmdW5jdGlvbih0LGUpe3JldHVybiBKU09OLnN0cmluZ2lmeSh0KSsiOiBkWyIrZSsiXSJ9KSkuam9pbigiLCIpKyJ9Iil9ZnVuY3Rpb24gVkcodCl7dmFyIGU9bmV3IFJlZ0V4cCgnWyInK3QrIlxuXHJdIiksbj10LmNoYXJDb2RlQXQoMCk7ZnVuY3Rpb24gaSh0LGUpe3ZhciBpLHI9W10sbz10Lmxlbmd0aCxhPTAscz0wLGw9bzw9MCxjPSExO2Z1bmN0aW9uIHUoKXtpZihsKXJldHVybiBIRztpZihjKXJldHVybiBjPSExLEJHO3ZhciBlLGkscj1hO2lmKDM0PT09dC5jaGFyQ29kZUF0KHIpKXtmb3IoO2ErKzxvJiYzNCE9PXQuY2hhckNvZGVBdChhKXx8MzQ9PT10LmNoYXJDb2RlQXQoKythKTspO3JldHVybihlPWEpPj1vP2w9ITA6MTA9PT0oaT10LmNoYXJDb2RlQXQoYSsrKSk/Yz0hMDoxMz09PWkmJihjPSEwLDEwPT09dC5jaGFyQ29kZUF0KGEpJiYrK2EpLHQuc2xpY2UocisxLGUtMSkucmVwbGFjZSgvIiIvZywnIicpfWZvcig7YTxvOyl7aWYoMTA9PT0oaT10LmNoYXJDb2RlQXQoZT1hKyspKSljPSEwO2Vsc2UgaWYoMTM9PT1pKWM9ITAsMTA9PT10LmNoYXJDb2RlQXQoYSkmJisrYTtlbHNlIGlmKGkhPT1uKWNvbnRpbnVlO3JldHVybiB0LnNsaWNlKHIsZSl9cmV0dXJuIGw9ITAsdC5zbGljZShyLG8pfWZvcigxMD09PXQuY2hhckNvZGVBdChvLTEpJiYtLW8sMTM9PT10LmNoYXJDb2RlQXQoby0xKSYmLS1vOyhpPXUoKSkhPT1IRzspe2Zvcih2YXIgaD1bXTtpIT09QkcmJmkhPT1IRzspaC5wdXNoKGkpLGk9dSgpO2UmJm51bGw9PShoPWUoaCxzKyspKXx8ci5wdXNoKGgpfXJldHVybiByfWZ1bmN0aW9uIHIoZSl7cmV0dXJuIGUubWFwKG8pLmpvaW4odCl9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbnVsbD09dD8iIjplLnRlc3QodCs9IiIpPyciJyt0LnJlcGxhY2UoLyIvZywnIiInKSsnIic6dH1yZXR1cm57cGFyc2U6ZnVuY3Rpb24gYSh0LGUpe3ZhciBuLHIsbz1pKHQsKGZ1bmN0aW9uKHQsaSl7aWYobilyZXR1cm4gbih0LGktMSk7cj10LG49ZT8oZnVuY3Rpb24gbyh0LGUpe3ZhciBuPUZHKHQpO3JldHVybiBmdW5jdGlvbihpLHIpe3JldHVybiBlKG4oaSkscix0KX19KSh0LGUpOkZHKHQpfSkpO3JldHVybiBvLmNvbHVtbnM9cnx8W10sb30scGFyc2VSb3dzOmksZm9ybWF0OmZ1bmN0aW9uIHMoZSxuKXtyZXR1cm4gbnVsbD09biYmKG49KGZ1bmN0aW9uIGkodCl7dmFyIGU9T2JqZWN0LmNyZWF0ZShudWxsKSxuPVtdO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2Zvcih2YXIgaSBpbiB0KWkgaW4gZXx8bi5wdXNoKGVbaV09aSl9KSksbn0pKGUpKSxbbi5tYXAobykuam9pbih0KV0uY29uY2F0KGUubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gbi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBvKGVbdF0pfSkpLmpvaW4odCl9KSkpLmpvaW4oIlxuIil9LGZvcm1hdFJvd3M6ZnVuY3Rpb24gbCh0KXtyZXR1cm4gdC5tYXAocikuam9pbigiXG4iKX19fXZhciBVRz1WRygiLCIpLGpHPVVHLnBhcnNlLEdHPVVHLnBhcnNlUm93cyxXRz1VRy5mb3JtYXQscUc9VUcuZm9ybWF0Um93cyxZRz1WRygiXHQiKSxYRz1ZRy5wYXJzZSwkRz1ZRy5wYXJzZVJvd3MsS0c9WUcuZm9ybWF0LFpHPVlHLmZvcm1hdFJvd3M7ZnVuY3Rpb24gSkcodCl7cmV0dXJuKCh0Kj0yKTw9MT90KnQ6LS10KigyLXQpKzEpLzJ9ZnVuY3Rpb24gUUcodCl7cmV0dXJuKCh0Kj0yKTw9MT90KnQqdDoodC09MikqdCp0KzIpLzJ9dmFyIHRXPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIE1hdGgucG93KHQsZSl9cmV0dXJuIGU9K2Usbi5leHBvbmVudD10LG59KSgzKSxlVz0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiAxLU1hdGgucG93KDEtdCxlKX1yZXR1cm4gZT0rZSxuLmV4cG9uZW50PXQsbn0pKDMpLG5XPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuKCh0Kj0yKTw9MT9NYXRoLnBvdyh0LGUpOjItTWF0aC5wb3coMi10LGUpKS8yfXJldHVybiBlPStlLG4uZXhwb25lbnQ9dCxufSkoMyksaVc9TWF0aC5QSSxyVz1pVy8yO2Z1bmN0aW9uIG9XKHQpe3JldHVybigxLU1hdGguY29zKGlXKnQpKS8yfWZ1bmN0aW9uIGFXKHQpe3JldHVybigodCo9Mik8PTE/TWF0aC5wb3coMiwxMCp0LTEwKToyLU1hdGgucG93KDIsMTAtMTAqdCkpLzJ9ZnVuY3Rpb24gc1codCl7cmV0dXJuKCh0Kj0yKTw9MT8xLU1hdGguc3FydCgxLXQqdCk6TWF0aC5zcXJ0KDEtKHQtPTIpKnQpKzEpLzJ9dmFyIGxXPTcuNTYyNTtmdW5jdGlvbiBjVyh0KXtyZXR1cm4odD0rdCk8LjM2MzYzNjM2MzYzNjM2MzY1P2xXKnQqdDp0PC43MjcyNzI3MjcyNzI3MjczP2xXKih0LT0uNTQ1NDU0NTQ1NDU0NTQ1NCkqdCsuNzU6dDwuOTA5MDkwOTA5MDkwOTA5MT9sVyoodC09LjgxODE4MTgxODE4MTgxODIpKnQrLjkzNzU6bFcqKHQtPS45NTQ1NDU0NTQ1NDU0NTQ2KSp0Ky45ODQzNzV9dmFyIHVXPTEuNzAxNTgsaFc9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdCp0KigoZSsxKSp0LWUpfXJldHVybiBlPStlLG4ub3ZlcnNob290PXQsbn0pKHVXKSxkVz0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybi0tdCp0KigoZSsxKSp0K2UpKzF9cmV0dXJuIGU9K2Usbi5vdmVyc2hvb3Q9dCxufSkodVcpLHBXPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuKCh0Kj0yKTwxP3QqdCooKGUrMSkqdC1lKToodC09MikqdCooKGUrMSkqdCtlKSsyKS8yfXJldHVybiBlPStlLG4ub3ZlcnNob290PXQsbn0pKHVXKSxmVz0yKk1hdGguUEksbVc9KGZ1bmN0aW9uIHQoZSxuKXt2YXIgaT1NYXRoLmFzaW4oMS8oZT1NYXRoLm1heCgxLGUpKSkqKG4vPWZXKTtmdW5jdGlvbiByKHQpe3JldHVybiBlKk1hdGgucG93KDIsMTAqLS10KSpNYXRoLnNpbigoaS10KS9uKX1yZXR1cm4gci5hbXBsaXR1ZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSxuKmZXKX0sci5wZXJpb2Q9ZnVuY3Rpb24obil7cmV0dXJuIHQoZSxuKX0scn0pKDEsLjMpLGdXPShmdW5jdGlvbiB0KGUsbil7dmFyIGk9TWF0aC5hc2luKDEvKGU9TWF0aC5tYXgoMSxlKSkpKihuLz1mVyk7ZnVuY3Rpb24gcih0KXtyZXR1cm4gMS1lKk1hdGgucG93KDIsLTEwKih0PSt0KSkqTWF0aC5zaW4oKHQraSkvbil9cmV0dXJuIHIuYW1wbGl0dWRlPWZ1bmN0aW9uKGUpe3JldHVybiB0KGUsbipmVyl9LHIucGVyaW9kPWZ1bmN0aW9uKG4pe3JldHVybiB0KGUsbil9LHJ9KSgxLC4zKSxfVz0oZnVuY3Rpb24gdChlLG4pe3ZhciBpPU1hdGguYXNpbigxLyhlPU1hdGgubWF4KDEsZSkpKSoobi89ZlcpO2Z1bmN0aW9uIHIodCl7cmV0dXJuKCh0PTIqdC0xKTwwP2UqTWF0aC5wb3coMiwxMCp0KSpNYXRoLnNpbigoaS10KS9uKToyLWUqTWF0aC5wb3coMiwtMTAqdCkqTWF0aC5zaW4oKGkrdCkvbikpLzJ9cmV0dXJuIHIuYW1wbGl0dWRlPWZ1bmN0aW9uKGUpe3JldHVybiB0KGUsbipmVyl9LHIucGVyaW9kPWZ1bmN0aW9uKG4pe3JldHVybiB0KGUsbil9LHJ9KSgxLC4zKTtmdW5jdGlvbiB5Vyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gdlcoKXtyZXR1cm4gMWUtNiooTWF0aC5yYW5kb20oKS0uNSl9ZnVuY3Rpb24gYlcodCxlLG4saSl7aWYoaXNOYU4oZSl8fGlzTmFOKG4pKXJldHVybiB0O3ZhciByLG8sYSxzLGwsYyx1LGgsZCxwPXQuX3Jvb3QsZj17ZGF0YTppfSxtPXQuX3gwLGc9dC5feTAsXz10Ll94MSx5PXQuX3kxO2lmKCFwKXJldHVybiB0Ll9yb290PWYsdDtmb3IoO3AubGVuZ3RoOylpZigoYz1lPj0obz0obStfKS8yKSk/bT1vOl89bywodT1uPj0oYT0oZyt5KS8yKSk/Zz1hOnk9YSxyPXAsIShwPXBbaD11PDwxfGNdKSlyZXR1cm4gcltoXT1mLHQ7aWYocz0rdC5feC5jYWxsKG51bGwscC5kYXRhKSxsPSt0Ll95LmNhbGwobnVsbCxwLmRhdGEpLGU9PT1zJiZuPT09bClyZXR1cm4gZi5uZXh0PXAscj9yW2hdPWY6dC5fcm9vdD1mLHQ7ZG97cj1yP3JbaF09bmV3IEFycmF5KDQpOnQuX3Jvb3Q9bmV3IEFycmF5KDQpLChjPWU+PShvPShtK18pLzIpKT9tPW86Xz1vLCh1PW4+PShhPShnK3kpLzIpKT9nPWE6eT1hfXdoaWxlKChoPXU8PDF8Yyk9PShkPShsPj1hKTw8MXxzPj1vKSk7cmV0dXJuIHJbZF09cCxyW2hdPWYsdH1mdW5jdGlvbiB4Vyh0LGUsbixpLHIpe3RoaXMubm9kZT10LHRoaXMueDA9ZSx0aGlzLnkwPW4sdGhpcy54MT1pLHRoaXMueTE9cn1mdW5jdGlvbiB3Vyh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBTVyh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBNVyh0LGUsbil7dmFyIGk9bmV3IEVXKG51bGw9PWU/d1c6ZSxudWxsPT1uP1NXOm4sTmFOLE5hTixOYU4sTmFOKTtyZXR1cm4gbnVsbD09dD9pOmkuYWRkQWxsKHQpfWZ1bmN0aW9uIEVXKHQsZSxuLGkscixvKXt0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3gwPW4sdGhpcy5feTA9aSx0aGlzLl94MT1yLHRoaXMuX3kxPW8sdGhpcy5fcm9vdD12b2lkIDB9ZnVuY3Rpb24gVFcodCl7Zm9yKHZhciBlPXtkYXRhOnQuZGF0YX0sbj1lO3Q9dC5uZXh0OyluPW4ubmV4dD17ZGF0YTp0LmRhdGF9O3JldHVybiBlfXZhciBDVz1NVy5wcm90b3R5cGU9RVcucHJvdG90eXBlO2Z1bmN0aW9uIEFXKHQpe3JldHVybiB0LngrdC52eH1mdW5jdGlvbiBrVyh0KXtyZXR1cm4gdC55K3Qudnl9Q1cuY29weT1mdW5jdGlvbigpe3ZhciB0LGUsbj1uZXcgRVcodGhpcy5feCx0aGlzLl95LHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSxpPXRoaXMuX3Jvb3Q7aWYoIWkpcmV0dXJuIG47aWYoIWkubGVuZ3RoKXJldHVybiBuLl9yb290PVRXKGkpLG47Zm9yKHQ9W3tzb3VyY2U6aSx0YXJnZXQ6bi5fcm9vdD1uZXcgQXJyYXkoNCl9XTtpPXQucG9wKCk7KWZvcih2YXIgcj0wO3I8NDsrK3IpKGU9aS5zb3VyY2Vbcl0pJiYoZS5sZW5ndGg/dC5wdXNoKHtzb3VyY2U6ZSx0YXJnZXQ6aS50YXJnZXRbcl09bmV3IEFycmF5KDQpfSk6aS50YXJnZXRbcl09VFcoZSkpO3JldHVybiBufSxDVy5hZGQ9ZnVuY3Rpb24gTFcodCl7dmFyIGU9K3RoaXMuX3guY2FsbChudWxsLHQpLG49K3RoaXMuX3kuY2FsbChudWxsLHQpO3JldHVybiBiVyh0aGlzLmNvdmVyKGUsbiksZSxuLHQpfSxDVy5hZGRBbGw9ZnVuY3Rpb24gUFcodCl7dmFyIGUsbixpLHIsbz10Lmxlbmd0aCxhPW5ldyBBcnJheShvKSxzPW5ldyBBcnJheShvKSxsPTEvMCxjPTEvMCx1PS0xLzAsaD0tMS8wO2ZvcihuPTA7bjxvOysrbilpc05hTihpPSt0aGlzLl94LmNhbGwobnVsbCxlPXRbbl0pKXx8aXNOYU4ocj0rdGhpcy5feS5jYWxsKG51bGwsZSkpfHwoYVtuXT1pLHNbbl09cixpPGwmJihsPWkpLGk+dSYmKHU9aSkscjxjJiYoYz1yKSxyPmgmJihoPXIpKTtpZihsPnV8fGM+aClyZXR1cm4gdGhpcztmb3IodGhpcy5jb3ZlcihsLGMpLmNvdmVyKHUsaCksbj0wO248bzsrK24pYlcodGhpcyxhW25dLHNbbl0sdFtuXSk7cmV0dXJuIHRoaXN9LENXLmNvdmVyPWZ1bmN0aW9uIE5XKHQsZSl7aWYoaXNOYU4odD0rdCl8fGlzTmFOKGU9K2UpKXJldHVybiB0aGlzO3ZhciBuPXRoaXMuX3gwLGk9dGhpcy5feTAscj10aGlzLl94MSxvPXRoaXMuX3kxO2lmKGlzTmFOKG4pKXI9KG49TWF0aC5mbG9vcih0KSkrMSxvPShpPU1hdGguZmxvb3IoZSkpKzE7ZWxzZXtmb3IodmFyIGEscyxsPXItbixjPXRoaXMuX3Jvb3Q7bj50fHx0Pj1yfHxpPmV8fGU+PW87KXN3aXRjaChzPShlPGkpPDwxfHQ8biwoYT1uZXcgQXJyYXkoNCkpW3NdPWMsYz1hLGwqPTIscyl7Y2FzZSAwOnI9bitsLG89aStsO2JyZWFrO2Nhc2UgMTpuPXItbCxvPWkrbDticmVhaztjYXNlIDI6cj1uK2wsaT1vLWw7YnJlYWs7Y2FzZSAzOm49ci1sLGk9by1sfXRoaXMuX3Jvb3QmJnRoaXMuX3Jvb3QubGVuZ3RoJiYodGhpcy5fcm9vdD1jKX1yZXR1cm4gdGhpcy5feDA9bix0aGlzLl95MD1pLHRoaXMuX3gxPXIsdGhpcy5feTE9byx0aGlzfSxDVy5kYXRhPWZ1bmN0aW9uIElXKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMudmlzaXQoKGZ1bmN0aW9uKGUpe2lmKCFlLmxlbmd0aClkb3t0LnB1c2goZS5kYXRhKX13aGlsZShlPWUubmV4dCl9KSksdH0sQ1cuZXh0ZW50PWZ1bmN0aW9uIFJXKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuY292ZXIoK3RbMF1bMF0sK3RbMF1bMV0pLmNvdmVyKCt0WzFdWzBdLCt0WzFdWzFdKTppc05hTih0aGlzLl94MCk/dm9pZCAwOltbdGhpcy5feDAsdGhpcy5feTBdLFt0aGlzLl94MSx0aGlzLl95MV1dfSxDVy5maW5kPWZ1bmN0aW9uIE9XKHQsZSxuKXt2YXIgaSxyLG8sYSxzLGwsYyx1PXRoaXMuX3gwLGg9dGhpcy5feTAsZD10aGlzLl94MSxwPXRoaXMuX3kxLGY9W10sbT10aGlzLl9yb290O2ZvcihtJiZmLnB1c2gobmV3IHhXKG0sdSxoLGQscCkpLG51bGw9PW4/bj0xLzA6KHU9dC1uLGg9ZS1uLGQ9dCtuLHA9ZStuLG4qPW4pO2w9Zi5wb3AoKTspaWYoISghKG09bC5ub2RlKXx8KHI9bC54MCk+ZHx8KG89bC55MCk+cHx8KGE9bC54MSk8dXx8KHM9bC55MSk8aCkpaWYobS5sZW5ndGgpe3ZhciBnPShyK2EpLzIsXz0obytzKS8yO2YucHVzaChuZXcgeFcobVszXSxnLF8sYSxzKSxuZXcgeFcobVsyXSxyLF8sZyxzKSxuZXcgeFcobVsxXSxnLG8sYSxfKSxuZXcgeFcobVswXSxyLG8sZyxfKSksKGM9KGU+PV8pPDwxfHQ+PWcpJiYobD1mW2YubGVuZ3RoLTFdLGZbZi5sZW5ndGgtMV09ZltmLmxlbmd0aC0xLWNdLGZbZi5sZW5ndGgtMS1jXT1sKX1lbHNle3ZhciB5PXQtK3RoaXMuX3guY2FsbChudWxsLG0uZGF0YSksdj1lLSt0aGlzLl95LmNhbGwobnVsbCxtLmRhdGEpLGI9eSp5K3YqdjtpZihiPG4pe3ZhciB4PU1hdGguc3FydChuPWIpO3U9dC14LGg9ZS14LGQ9dCt4LHA9ZSt4LGk9bS5kYXRhfX1yZXR1cm4gaX0sQ1cucmVtb3ZlPWZ1bmN0aW9uIHpXKHQpe2lmKGlzTmFOKG89K3RoaXMuX3guY2FsbChudWxsLHQpKXx8aXNOYU4oYT0rdGhpcy5feS5jYWxsKG51bGwsdCkpKXJldHVybiB0aGlzO3ZhciBlLG4saSxyLG8sYSxzLGwsYyx1LGgsZCxwPXRoaXMuX3Jvb3QsZj10aGlzLl94MCxtPXRoaXMuX3kwLGc9dGhpcy5feDEsXz10aGlzLl95MTtpZighcClyZXR1cm4gdGhpcztpZihwLmxlbmd0aClmb3IoOzspe2lmKChjPW8+PShzPShmK2cpLzIpKT9mPXM6Zz1zLCh1PWE+PShsPShtK18pLzIpKT9tPWw6Xz1sLGU9cCwhKHA9cFtoPXU8PDF8Y10pKXJldHVybiB0aGlzO2lmKCFwLmxlbmd0aClicmVhazsoZVtoKzEmM118fGVbaCsyJjNdfHxlW2grMyYzXSkmJihuPWUsZD1oKX1mb3IoO3AuZGF0YSE9PXQ7KWlmKGk9cCwhKHA9cC5uZXh0KSlyZXR1cm4gdGhpcztyZXR1cm4ocj1wLm5leHQpJiZkZWxldGUgcC5uZXh0LGk/KHI/aS5uZXh0PXI6ZGVsZXRlIGkubmV4dCx0aGlzKTplPyhyP2VbaF09cjpkZWxldGUgZVtoXSwocD1lWzBdfHxlWzFdfHxlWzJdfHxlWzNdKSYmcD09PShlWzNdfHxlWzJdfHxlWzFdfHxlWzBdKSYmIXAubGVuZ3RoJiYobj9uW2RdPXA6dGhpcy5fcm9vdD1wKSx0aGlzKToodGhpcy5fcm9vdD1yLHRoaXMpfSxDVy5yZW1vdmVBbGw9ZnVuY3Rpb24gRFcodCl7Zm9yKHZhciBlPTAsbj10Lmxlbmd0aDtlPG47KytlKXRoaXMucmVtb3ZlKHRbZV0pO3JldHVybiB0aGlzfSxDVy5yb290PWZ1bmN0aW9uIEJXKCl7cmV0dXJuIHRoaXMuX3Jvb3R9LENXLnNpemU9ZnVuY3Rpb24gSFcoKXt2YXIgdD0wO3JldHVybiB0aGlzLnZpc2l0KChmdW5jdGlvbihlKXtpZighZS5sZW5ndGgpZG97Kyt0fXdoaWxlKGU9ZS5uZXh0KX0pKSx0fSxDVy52aXNpdD1mdW5jdGlvbiBGVyh0KXt2YXIgZSxuLGkscixvLGEscz1bXSxsPXRoaXMuX3Jvb3Q7Zm9yKGwmJnMucHVzaChuZXcgeFcobCx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkpO2U9cy5wb3AoKTspaWYoIXQobD1lLm5vZGUsaT1lLngwLHI9ZS55MCxvPWUueDEsYT1lLnkxKSYmbC5sZW5ndGgpe3ZhciBjPShpK28pLzIsdT0ocithKS8yOyhuPWxbM10pJiZzLnB1c2gobmV3IHhXKG4sYyx1LG8sYSkpLChuPWxbMl0pJiZzLnB1c2gobmV3IHhXKG4saSx1LGMsYSkpLChuPWxbMV0pJiZzLnB1c2gobmV3IHhXKG4sYyxyLG8sdSkpLChuPWxbMF0pJiZzLnB1c2gobmV3IHhXKG4saSxyLGMsdSkpfXJldHVybiB0aGlzfSxDVy52aXNpdEFmdGVyPWZ1bmN0aW9uIFZXKHQpe3ZhciBlLG49W10saT1bXTtmb3IodGhpcy5fcm9vdCYmbi5wdXNoKG5ldyB4Vyh0aGlzLl9yb290LHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSk7ZT1uLnBvcCgpOyl7dmFyIHI9ZS5ub2RlO2lmKHIubGVuZ3RoKXt2YXIgbyxhPWUueDAscz1lLnkwLGw9ZS54MSxjPWUueTEsdT0oYStsKS8yLGg9KHMrYykvMjsobz1yWzBdKSYmbi5wdXNoKG5ldyB4VyhvLGEscyx1LGgpKSwobz1yWzFdKSYmbi5wdXNoKG5ldyB4VyhvLHUscyxsLGgpKSwobz1yWzJdKSYmbi5wdXNoKG5ldyB4VyhvLGEsaCx1LGMpKSwobz1yWzNdKSYmbi5wdXNoKG5ldyB4VyhvLHUsaCxsLGMpKX1pLnB1c2goZSl9Zm9yKDtlPWkucG9wKCk7KXQoZS5ub2RlLGUueDAsZS55MCxlLngxLGUueTEpO3JldHVybiB0aGlzfSxDVy54PWZ1bmN0aW9uIFVXKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl94PXQsdGhpcyk6dGhpcy5feH0sQ1cueT1mdW5jdGlvbiBqVyh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5feT10LHRoaXMpOnRoaXMuX3l9O3ZhciBHVz0iJCI7ZnVuY3Rpb24gV1coKXt9ZnVuY3Rpb24gcVcodCxlKXt2YXIgbj1uZXcgV1c7aWYodCBpbnN0YW5jZW9mIFdXKXQuZWFjaCgoZnVuY3Rpb24odCxlKXtuLnNldChlLHQpfSkpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSl7dmFyIGkscj0tMSxvPXQubGVuZ3RoO2lmKG51bGw9PWUpZm9yKDsrK3I8bzspbi5zZXQocix0W3JdKTtlbHNlIGZvcig7KytyPG87KW4uc2V0KGUoaT10W3JdLHIsdCksaSl9ZWxzZSBpZih0KWZvcih2YXIgYSBpbiB0KW4uc2V0KGEsdFthXSk7cmV0dXJuIG59ZnVuY3Rpb24gWVcoKXt9V1cucHJvdG90eXBlPXFXLnByb3RvdHlwZT17Y29uc3RydWN0b3I6V1csaGFzOmZ1bmN0aW9uKHQpe3JldHVybiBHVyt0IGluIHRoaXN9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpc1tHVyt0XX0sc2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXNbR1crdF09ZSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9R1crdDtyZXR1cm4gZSBpbiB0aGlzJiZkZWxldGUgdGhpc1tlXX0sY2xlYXI6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcyl0WzBdPT09R1cmJmRlbGV0ZSB0aGlzW3RdfSxrZXlzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PUdXJiZ0LnB1c2goZS5zbGljZSgxKSk7cmV0dXJuIHR9LHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT1HVyYmdC5wdXNoKHRoaXNbZV0pO3JldHVybiB0fSxlbnRyaWVzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PUdXJiZ0LnB1c2goe2tleTplLnNsaWNlKDEpLHZhbHVlOnRoaXNbZV19KTtyZXR1cm4gdH0sc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTA7Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PUdXJiYrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpaWYodFswXT09PUdXKXJldHVybiExO3JldHVybiEwfSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT1HVyYmdCh0aGlzW2VdLGUuc2xpY2UoMSksdGhpcyl9fTt2YXIgWFc9cVcucHJvdG90eXBlO2Z1bmN0aW9uICRXKHQpe3JldHVybiB0LmluZGV4fWZ1bmN0aW9uIEtXKHQsZSl7dmFyIG49dC5nZXQoZSk7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nOiAiK2UpO3JldHVybiBufVlXLnByb3RvdHlwZT17Y29uc3RydWN0b3I6WVcsaGFzOlhXLmhhcyxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbR1crKHQrPSIiKV09dCx0aGlzfSxyZW1vdmU6WFcucmVtb3ZlLGNsZWFyOlhXLmNsZWFyLHZhbHVlczpYVy5rZXlzLHNpemU6WFcuc2l6ZSxlbXB0eTpYVy5lbXB0eSxlYWNoOlhXLmVhY2h9O3ZhciBaVz17dmFsdWU6ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBKVygpe2Zvcih2YXIgdCxlPTAsbj1hcmd1bWVudHMubGVuZ3RoLGk9e307ZTxuOysrZSl7aWYoISh0PWFyZ3VtZW50c1tlXSsiIil8fHQgaW4gaXx8L1tccy5dLy50ZXN0KHQpKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO2lbdF09W119cmV0dXJuIG5ldyBRVyhpKX1mdW5jdGlvbiBRVyh0KXt0aGlzLl89dH1mdW5jdGlvbiB0cSh0LGUpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBuPSIiLGk9dC5pbmRleE9mKCIuIik7aWYoaT49MCYmKG49dC5zbGljZShpKzEpLHQ9dC5zbGljZSgwLGkpKSx0JiYhZS5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtyZXR1cm57dHlwZTp0LG5hbWU6bn19KSl9ZnVuY3Rpb24gZXEodCxlKXtmb3IodmFyIG4saT0wLHI9dC5sZW5ndGg7aTxyOysraSlpZigobj10W2ldKS5uYW1lPT09ZSlyZXR1cm4gbi52YWx1ZX1mdW5jdGlvbiBucSh0LGUsbil7Zm9yKHZhciBpPTAscj10Lmxlbmd0aDtpPHI7KytpKWlmKHRbaV0ubmFtZT09PWUpe3RbaV09WlcsdD10LnNsaWNlKDAsaSkuY29uY2F0KHQuc2xpY2UoaSsxKSk7YnJlYWt9cmV0dXJuIG51bGwhPW4mJnQucHVzaCh7bmFtZTplLHZhbHVlOm59KSx0fVFXLnByb3RvdHlwZT1KVy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlFXLG9uOmZ1bmN0aW9uKHQsZSl7dmFyIG4saT10aGlzLl8scj10cSh0KyIiLGkpLG89LTEsYT1yLmxlbmd0aDtpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2lmKG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjazogIitlKTtmb3IoOysrbzxhOylpZihuPSh0PXJbb10pLnR5cGUpaVtuXT1ucShpW25dLHQubmFtZSxlKTtlbHNlIGlmKG51bGw9PWUpZm9yKG4gaW4gaSlpW25dPW5xKGlbbl0sdC5uYW1lLG51bGwpO3JldHVybiB0aGlzfWZvcig7KytvPGE7KWlmKChuPSh0PXJbb10pLnR5cGUpJiYobj1lcShpW25dLHQubmFtZSkpKXJldHVybiBufSxjb3B5OmZ1bmN0aW9uKCl7dmFyIHQ9e30sZT10aGlzLl87Zm9yKHZhciBuIGluIGUpdFtuXT1lW25dLnNsaWNlKCk7cmV0dXJuIG5ldyBRVyh0KX0sY2FsbDpmdW5jdGlvbih0LGUpe2lmKChuPWFyZ3VtZW50cy5sZW5ndGgtMik+MClmb3IodmFyIG4saSxyPW5ldyBBcnJheShuKSxvPTA7bzxuOysrbylyW29dPWFyZ3VtZW50c1tvKzJdO2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKG89MCxuPShpPXRoaXMuX1t0XSkubGVuZ3RoO288bjsrK28paVtvXS52YWx1ZS5hcHBseShlLHIpfSxhcHBseTpmdW5jdGlvbih0LGUsbil7aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3IodmFyIGk9dGhpcy5fW3RdLHI9MCxvPWkubGVuZ3RoO3I8bzsrK3IpaVtyXS52YWx1ZS5hcHBseShlLG4pfX07dmFyIGlxLHJxLG9xPTAsYXE9MCxzcT0wLGxxPTAsY3E9MCx1cT0wLGhxPSJvYmplY3QiPT10eXBlb2YgcGVyZm9ybWFuY2UmJnBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZTpEYXRlLGRxPSJvYmplY3QiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lP3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpOmZ1bmN0aW9uKHQpe3NldFRpbWVvdXQodCwxNyl9O2Z1bmN0aW9uIHBxKCl7cmV0dXJuIGNxfHwoZHEoZnEpLGNxPWhxLm5vdygpK3VxKX1mdW5jdGlvbiBmcSgpe2NxPTB9ZnVuY3Rpb24gbXEoKXt0aGlzLl9jYWxsPXRoaXMuX3RpbWU9dGhpcy5fbmV4dD1udWxsfWZ1bmN0aW9uIGdxKHQsZSxuKXt2YXIgaT1uZXcgbXE7cmV0dXJuIGkucmVzdGFydCh0LGUsbiksaX1mdW5jdGlvbiBfcSgpe2NxPShscT1ocS5ub3coKSkrdXEsb3E9YXE9MDt0cnl7IShmdW5jdGlvbiB0KCl7cHEoKSwrK29xO2Zvcih2YXIgdCxlPWlxO2U7KSh0PWNxLWUuX3RpbWUpPj0wJiZlLl9jYWxsLmNhbGwobnVsbCx0KSxlPWUuX25leHQ7LS1vcX0pKCl9ZmluYWxseXtvcT0wLChmdW5jdGlvbiBlKCl7Zm9yKHZhciB0LGUsbj1pcSxpPTEvMDtuOyluLl9jYWxsPyhpPm4uX3RpbWUmJihpPW4uX3RpbWUpLHQ9bixuPW4uX25leHQpOihlPW4uX25leHQsbi5fbmV4dD1udWxsLG49dD90Ll9uZXh0PWU6aXE9ZSk7cnE9dCx2cShpKX0pKCksY3E9MH19ZnVuY3Rpb24geXEoKXt2YXIgdD1ocS5ub3coKSxlPXQtbHE7ZT4xZTMmJih1cS09ZSxscT10KX1mdW5jdGlvbiB2cSh0KXtvcXx8KGFxJiYoYXE9Y2xlYXJUaW1lb3V0KGFxKSksdC1jcT4yND8odDwxLzAmJihhcT1zZXRUaW1lb3V0KF9xLHQtaHEubm93KCktdXEpKSxzcSYmKHNxPWNsZWFySW50ZXJ2YWwoc3EpKSk6KHNxfHwobHE9aHEubm93KCksc3E9c2V0SW50ZXJ2YWwoeXEsMWUzKSksb3E9MSxkcShfcSkpKX1mdW5jdGlvbiBicSh0KXtyZXR1cm4gdC54fWZ1bmN0aW9uIHhxKHQpe3JldHVybiB0Lnl9bXEucHJvdG90eXBlPWdxLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bXEscmVzdGFydDpmdW5jdGlvbih0LGUsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24iKTtuPShudWxsPT1uP3BxKCk6K24pKyhudWxsPT1lPzA6K2UpLHRoaXMuX25leHR8fHJxPT09dGhpc3x8KHJxP3JxLl9uZXh0PXRoaXM6aXE9dGhpcyxycT10aGlzKSx0aGlzLl9jYWxsPXQsdGhpcy5fdGltZT1uLHZxKCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9jYWxsJiYodGhpcy5fY2FsbD1udWxsLHRoaXMuX3RpbWU9MS8wLHZxKCkpfX07dmFyIHdxLFNxPU1hdGguUEkqKDMtTWF0aC5zcXJ0KDUpKTtmdW5jdGlvbiBNcSh0LGUpe2lmKChuPSh0PWU/dC50b0V4cG9uZW50aWFsKGUtMSk6dC50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoImUiKSk8MClyZXR1cm4gbnVsbDt2YXIgbixpPXQuc2xpY2UoMCxuKTtyZXR1cm5baS5sZW5ndGg+MT9pWzBdK2kuc2xpY2UoMik6aSwrdC5zbGljZShuKzEpXX1mdW5jdGlvbiBFcSh0KXtyZXR1cm4odD1NcShNYXRoLmFicyh0KSkpP3RbMV06TmFOfWZ1bmN0aW9uIFRxKHQsZSl7dmFyIG49TXEodCxlKTtpZighbilyZXR1cm4gdCsiIjt2YXIgaT1uWzBdLHI9blsxXTtyZXR1cm4gcjwwPyIwLiIrbmV3IEFycmF5KC1yKS5qb2luKCIwIikraTppLmxlbmd0aD5yKzE/aS5zbGljZSgwLHIrMSkrIi4iK2kuc2xpY2UocisxKTppK25ldyBBcnJheShyLWkubGVuZ3RoKzIpLmpvaW4oIjAiKX12YXIgQ3E9eyIiOmZ1bmN0aW9uIEFxKHQsZSl7dDpmb3IodmFyIG4saT0odD10LnRvUHJlY2lzaW9uKGUpKS5sZW5ndGgscj0xLG89LTE7cjxpOysrcilzd2l0Y2godFtyXSl7Y2FzZSIuIjpvPW49cjticmVhaztjYXNlIjAiOjA9PT1vJiYobz1yKSxuPXI7YnJlYWs7Y2FzZSJlIjpicmVhayB0O2RlZmF1bHQ6bz4wJiYobz0wKX1yZXR1cm4gbz4wP3Quc2xpY2UoMCxvKSt0LnNsaWNlKG4rMSk6dH0sIiUiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuKDEwMCp0KS50b0ZpeGVkKGUpfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDIpfSxjOmZ1bmN0aW9uKHQpe3JldHVybiB0KyIifSxkOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDEwKX0sZTpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRvRXhwb25lbnRpYWwoZSl9LGY6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50b0ZpeGVkKGUpfSxnOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9QcmVjaXNpb24oZSl9LG86ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoOCl9LHA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gVHEoMTAwKnQsZSl9LHI6VHEsczpmdW5jdGlvbiBrcSh0LGUpe3ZhciBuPU1xKHQsZSk7aWYoIW4pcmV0dXJuIHQrIiI7dmFyIGk9blswXSxyPW5bMV0sbz1yLSh3cT0zKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihyLzMpKSkpKzEsYT1pLmxlbmd0aDtyZXR1cm4gbz09PWE/aTpvPmE/aStuZXcgQXJyYXkoby1hKzEpLmpvaW4oIjAiKTpvPjA/aS5zbGljZSgwLG8pKyIuIitpLnNsaWNlKG8pOiIwLiIrbmV3IEFycmF5KDEtbykuam9pbigiMCIpK01xKHQsTWF0aC5tYXgoMCxlK28tMSkpWzBdfSxYOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSx4OmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KX19LExxPS9eKD86KC4pPyhbPD49Xl0pKT8oWytcLVwoIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KFthLXolXSk/JC9pO2Z1bmN0aW9uIFBxKHQpe3JldHVybiBuZXcgTnEodCl9ZnVuY3Rpb24gTnEodCl7aWYoIShlPUxxLmV4ZWModCkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIrdCk7dmFyIGUsbj1lWzFdfHwiICIsaT1lWzJdfHwiPiIscj1lWzNdfHwiLSIsbz1lWzRdfHwiIixhPSEhZVs1XSxzPWVbNl0mJitlWzZdLGw9ISFlWzddLGM9ZVs4XSYmK2VbOF0uc2xpY2UoMSksdT1lWzldfHwiIjsibiI9PT11PyhsPSEwLHU9ImciKTpDcVt1XXx8KHU9IiIpLChhfHwiMCI9PT1uJiYiPSI9PT1pKSYmKGE9ITAsbj0iMCIsaT0iPSIpLHRoaXMuZmlsbD1uLHRoaXMuYWxpZ249aSx0aGlzLnNpZ249cix0aGlzLnN5bWJvbD1vLHRoaXMuemVybz1hLHRoaXMud2lkdGg9cyx0aGlzLmNvbW1hPWwsdGhpcy5wcmVjaXNpb249Yyx0aGlzLnR5cGU9dX1mdW5jdGlvbiBJcSh0KXtyZXR1cm4gdH1QcS5wcm90b3R5cGU9TnEucHJvdG90eXBlLE5xLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbGwrdGhpcy5hbGlnbit0aGlzLnNpZ24rdGhpcy5zeW1ib2wrKHRoaXMuemVybz8iMCI6IiIpKyhudWxsPT10aGlzLndpZHRoPyIiOk1hdGgubWF4KDEsMHx0aGlzLndpZHRoKSkrKHRoaXMuY29tbWE/IiwiOiIiKSsobnVsbD09dGhpcy5wcmVjaXNpb24/IiI6Ii4iK01hdGgubWF4KDAsMHx0aGlzLnByZWNpc2lvbikpK3RoaXMudHlwZX07dmFyIFJxLE9xLHpxLERxPVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTtmdW5jdGlvbiBCcSh0KXt2YXIgZT10Lmdyb3VwaW5nJiZ0LnRob3VzYW5kcz8oZnVuY3Rpb24gbih0LGUpe3JldHVybiBmdW5jdGlvbihuLGkpe2Zvcih2YXIgcj1uLmxlbmd0aCxvPVtdLGE9MCxzPXRbMF0sbD0wO3I+MCYmcz4wJiYobCtzKzE+aSYmKHM9TWF0aC5tYXgoMSxpLWwpKSxvLnB1c2gobi5zdWJzdHJpbmcoci09cyxyK3MpKSwhKChsKz1zKzEpPmkpKTspcz10W2E9KGErMSkldC5sZW5ndGhdO3JldHVybiBvLnJldmVyc2UoKS5qb2luKGUpfX0pKHQuZ3JvdXBpbmcsdC50aG91c2FuZHMpOklxLGk9dC5jdXJyZW5jeSxyPXQuZGVjaW1hbCxvPXQubnVtZXJhbHM/KGZ1bmN0aW9uIGEodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1swLTldL2csKGZ1bmN0aW9uKGUpe3JldHVybiB0WytlXX0pKX19KSh0Lm51bWVyYWxzKTpJcSxzPXQucGVyY2VudHx8IiUiO2Z1bmN0aW9uIGwodCl7dmFyIG49KHQ9UHEodCkpLmZpbGwsYT10LmFsaWduLGw9dC5zaWduLGM9dC5zeW1ib2wsdT10Lnplcm8saD10LndpZHRoLGQ9dC5jb21tYSxwPXQucHJlY2lzaW9uLGY9dC50eXBlLG09IiQiPT09Yz9pWzBdOiIjIj09PWMmJi9bYm94WF0vLnRlc3QoZik/IjAiK2YudG9Mb3dlckNhc2UoKToiIixnPSIkIj09PWM/aVsxXTovWyVwXS8udGVzdChmKT9zOiIiLF89Q3FbZl0seT0hZnx8L1tkZWZncHJzJV0vLnRlc3QoZik7ZnVuY3Rpb24gdih0KXt2YXIgaSxzLGMsdj1tLGI9ZztpZigiYyI9PT1mKWI9Xyh0KStiLHQ9IiI7ZWxzZXt2YXIgeD0odD0rdCk8MDtpZih0PV8oTWF0aC5hYnModCkscCkseCYmMD09K3QmJih4PSExKSx2PSh4PyIoIj09PWw/bDoiLSI6Ii0iPT09bHx8IigiPT09bD8iIjpsKSt2LGI9KCJzIj09PWY/RHFbOCt3cS8zXToiIikrYisoeCYmIigiPT09bD8iKSI6IiIpLHkpZm9yKGk9LTEscz10Lmxlbmd0aDsrK2k8czspaWYoNDg+KGM9dC5jaGFyQ29kZUF0KGkpKXx8Yz41Nyl7Yj0oNDY9PT1jP3IrdC5zbGljZShpKzEpOnQuc2xpY2UoaSkpK2IsdD10LnNsaWNlKDAsaSk7YnJlYWt9fWQmJiF1JiYodD1lKHQsMS8wKSk7dmFyIHc9di5sZW5ndGgrdC5sZW5ndGgrYi5sZW5ndGgsUz13PGg/bmV3IEFycmF5KGgtdysxKS5qb2luKG4pOiIiO3N3aXRjaChkJiZ1JiYodD1lKFMrdCxTLmxlbmd0aD9oLWIubGVuZ3RoOjEvMCksUz0iIiksYSl7Y2FzZSI8Ijp0PXYrdCtiK1M7YnJlYWs7Y2FzZSI9Ijp0PXYrUyt0K2I7YnJlYWs7Y2FzZSJeIjp0PVMuc2xpY2UoMCx3PVMubGVuZ3RoPj4xKSt2K3QrYitTLnNsaWNlKHcpO2JyZWFrO2RlZmF1bHQ6dD1TK3YrdCtifXJldHVybiBvKHQpfXJldHVybiBwPW51bGw9PXA/Zj82OjEyOi9bZ3Byc10vLnRlc3QoZik/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxwKSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxwKSksdi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0KyIifSx2fXJldHVybntmb3JtYXQ6bCxmb3JtYXRQcmVmaXg6ZnVuY3Rpb24gYyh0LGUpe3ZhciBuPWwoKCh0PVBxKHQpKS50eXBlPSJmIix0KSksaT0zKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihFcShlKS8zKSkpLHI9TWF0aC5wb3coMTAsLWkpLG89RHFbOCtpLzNdO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbihyKnQpK299fX19ZnVuY3Rpb24gSHEodCl7cmV0dXJuIFJxPUJxKHQpLE9xPVJxLmZvcm1hdCx6cT1ScS5mb3JtYXRQcmVmaXgsUnF9ZnVuY3Rpb24gRnEoKXtyZXR1cm4gbmV3IFZxfWZ1bmN0aW9uIFZxKCl7dGhpcy5yZXNldCgpfUhxKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXX0pLFZxLnByb3RvdHlwZT17Y29uc3RydWN0b3I6VnEscmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LGFkZDpmdW5jdGlvbih0KXtqcShVcSx0LHRoaXMudCksanEodGhpcyxVcS5zLHRoaXMucyksdGhpcy5zP3RoaXMudCs9VXEudDp0aGlzLnM9VXEudH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN9fTt2YXIgVXE9bmV3IFZxO2Z1bmN0aW9uIGpxKHQsZSxuKXt2YXIgaT10LnM9ZStuLHI9aS1lO3QudD1lLShpLXIpKyhuLXIpfXZhciBHcT0xZS02LFdxPU1hdGguUEkscXE9V3EvMixZcT1XcS80LFhxPTIqV3EsJHE9MTgwL1dxLEtxPVdxLzE4MCxacT1NYXRoLmFicyxKcT1NYXRoLmF0YW4sUXE9TWF0aC5hdGFuMix0WT1NYXRoLmNvcyxlWT1NYXRoLmNlaWwsblk9TWF0aC5leHAsaVk9TWF0aC5sb2csclk9TWF0aC5wb3csb1k9TWF0aC5zaW4sYVk9TWF0aC5zaWdufHxmdW5jdGlvbih0KXtyZXR1cm4gdD4wPzE6dDwwPy0xOjB9LHNZPU1hdGguc3FydCxsWT1NYXRoLnRhbjtmdW5jdGlvbiBjWSh0KXtyZXR1cm4gdD4xPzA6dDwtMT9XcTpNYXRoLmFjb3ModCl9ZnVuY3Rpb24gdVkodCl7cmV0dXJuIHQ+MT9xcTp0PC0xPy1xcTpNYXRoLmFzaW4odCl9ZnVuY3Rpb24gaFkodCl7cmV0dXJuKHQ9b1kodC8yKSkqdH1mdW5jdGlvbiBkWSgpe31mdW5jdGlvbiBwWSh0LGUpe3QmJm1ZLmhhc093blByb3BlcnR5KHQudHlwZSkmJm1ZW3QudHlwZV0odCxlKX12YXIgZlk9e0ZlYXR1cmU6ZnVuY3Rpb24odCxlKXtwWSh0Lmdlb21ldHJ5LGUpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmZlYXR1cmVzLGk9LTEscj1uLmxlbmd0aDsrK2k8cjspcFkobltpXS5nZW9tZXRyeSxlKX19LG1ZPXtTcGhlcmU6ZnVuY3Rpb24odCxlKXtlLnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbih0LGUpe2UucG9pbnQoKHQ9dC5jb29yZGluYXRlcylbMF0sdFsxXSx0WzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmNvb3JkaW5hdGVzLGk9LTEscj1uLmxlbmd0aDsrK2k8cjspZS5wb2ludCgodD1uW2ldKVswXSx0WzFdLHRbMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsZSl7Z1kodC5jb29yZGluYXRlcyxlLDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5jb29yZGluYXRlcyxpPS0xLHI9bi5sZW5ndGg7KytpPHI7KWdZKG5baV0sZSwwKX0sUG9seWdvbjpmdW5jdGlvbih0LGUpe19ZKHQuY29vcmRpbmF0ZXMsZSl9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmNvb3JkaW5hdGVzLGk9LTEscj1uLmxlbmd0aDsrK2k8cjspX1kobltpXSxlKX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZ2VvbWV0cmllcyxpPS0xLHI9bi5sZW5ndGg7KytpPHI7KXBZKG5baV0sZSl9fTtmdW5jdGlvbiBnWSh0LGUsbil7dmFyIGkscj0tMSxvPXQubGVuZ3RoLW47Zm9yKGUubGluZVN0YXJ0KCk7KytyPG87KWUucG9pbnQoKGk9dFtyXSlbMF0saVsxXSxpWzJdKTtlLmxpbmVFbmQoKX1mdW5jdGlvbiBfWSh0LGUpe3ZhciBuPS0xLGk9dC5sZW5ndGg7Zm9yKGUucG9seWdvblN0YXJ0KCk7KytuPGk7KWdZKHRbbl0sZSwxKTtlLnBvbHlnb25FbmQoKX1mdW5jdGlvbiB5WSh0LGUpe3QmJmZZLmhhc093blByb3BlcnR5KHQudHlwZSk/ZllbdC50eXBlXSh0LGUpOnBZKHQsZSl9dmFyIHZZLGJZLHhZLHdZLFNZLE1ZPUZxKCksRVk9RnEoKSxUWT17cG9pbnQ6ZFksbGluZVN0YXJ0OmRZLGxpbmVFbmQ6ZFkscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7TVkucmVzZXQoKSxUWS5saW5lU3RhcnQ9Q1ksVFkubGluZUVuZD1BWX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciB0PStNWTtFWS5hZGQodDwwP1hxK3Q6dCksdGhpcy5saW5lU3RhcnQ9dGhpcy5saW5lRW5kPXRoaXMucG9pbnQ9ZFl9LHNwaGVyZTpmdW5jdGlvbigpe0VZLmFkZChYcSl9fTtmdW5jdGlvbiBDWSgpe1RZLnBvaW50PWtZfWZ1bmN0aW9uIEFZKCl7TFkodlksYlkpfWZ1bmN0aW9uIGtZKHQsZSl7VFkucG9pbnQ9TFksdlk9dCxiWT1lLHhZPXQqPUtxLHdZPXRZKGU9KGUqPUtxKS8yK1lxKSxTWT1vWShlKX1mdW5jdGlvbiBMWSh0LGUpe3ZhciBuPSh0Kj1LcSkteFksaT1uPj0wPzE6LTEscj1pKm4sbz10WShlPShlKj1LcSkvMitZcSksYT1vWShlKSxzPVNZKmEsbD13WSpvK3MqdFkociksYz1zKmkqb1kocik7TVkuYWRkKFFxKGMsbCkpLHhZPXQsd1k9byxTWT1hfWZ1bmN0aW9uIFBZKHQpe3JldHVybltRcSh0WzFdLHRbMF0pLHVZKHRbMl0pXX1mdW5jdGlvbiBOWSh0KXt2YXIgZT10WzBdLG49dFsxXSxpPXRZKG4pO3JldHVybltpKnRZKGUpLGkqb1koZSksb1kobildfWZ1bmN0aW9uIElZKHQsZSl7cmV0dXJuIHRbMF0qZVswXSt0WzFdKmVbMV0rdFsyXSplWzJdfWZ1bmN0aW9uIFJZKHQsZSl7cmV0dXJuW3RbMV0qZVsyXS10WzJdKmVbMV0sdFsyXSplWzBdLXRbMF0qZVsyXSx0WzBdKmVbMV0tdFsxXSplWzBdXX1mdW5jdGlvbiBPWSh0LGUpe3RbMF0rPWVbMF0sdFsxXSs9ZVsxXSx0WzJdKz1lWzJdfWZ1bmN0aW9uIHpZKHQsZSl7cmV0dXJuW3RbMF0qZSx0WzFdKmUsdFsyXSplXX1mdW5jdGlvbiBEWSh0KXt2YXIgZT1zWSh0WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSk7dFswXS89ZSx0WzFdLz1lLHRbMl0vPWV9dmFyIEJZLEhZLEZZLFZZLFVZLGpZLEdZLFdZLHFZLFlZLFhZLCRZLEtZLFpZLEpZLFFZLHRYLGVYLG5YLGlYLHJYLG9YLGFYLHNYLGxYLGNYLHVYPUZxKCksaFg9e3BvaW50OmRYLGxpbmVTdGFydDpmWCxsaW5lRW5kOm1YLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2hYLnBvaW50PWdYLGhYLmxpbmVTdGFydD1fWCxoWC5saW5lRW5kPXlYLHVYLnJlc2V0KCksVFkucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtUWS5wb2x5Z29uRW5kKCksaFgucG9pbnQ9ZFgsaFgubGluZVN0YXJ0PWZYLGhYLmxpbmVFbmQ9bVgsTVk8MD8oQlk9LShGWT0xODApLEhZPS0oVlk9OTApKTp1WD5HcT9WWT05MDp1WDwtMWUtNiYmKEhZPS05MCksWVlbMF09QlksWVlbMV09Rll9fTtmdW5jdGlvbiBkWCh0LGUpe3FZLnB1c2goWVk9W0JZPXQsRlk9dF0pLGU8SFkmJihIWT1lKSxlPlZZJiYoVlk9ZSl9ZnVuY3Rpb24gcFgodCxlKXt2YXIgbj1OWShbdCpLcSxlKktxXSk7aWYoV1kpe3ZhciBpPVJZKFdZLG4pLHI9UlkoW2lbMV0sLWlbMF0sMF0saSk7RFkocikscj1QWShyKTt2YXIgbyxhPXQtVVkscz1hPjA/MTotMSxsPXJbMF0qJHEqcyxjPVpxKGEpPjE4MDtjXihzKlVZPGwmJmw8cyp0KT8obz1yWzFdKiRxKT5WWSYmKFZZPW8pOmNeKHMqVVk8KGw9KGwrMzYwKSUzNjAtMTgwKSYmbDxzKnQpPyhvPS1yWzFdKiRxKTxIWSYmKEhZPW8pOihlPEhZJiYoSFk9ZSksZT5WWSYmKFZZPWUpKSxjP3Q8VVk/dlgoQlksdCk+dlgoQlksRlkpJiYoRlk9dCk6dlgodCxGWSk+dlgoQlksRlkpJiYoQlk9dCk6Rlk+PUJZPyh0PEJZJiYoQlk9dCksdD5GWSYmKEZZPXQpKTp0PlVZP3ZYKEJZLHQpPnZYKEJZLEZZKSYmKEZZPXQpOnZYKHQsRlkpPnZYKEJZLEZZKSYmKEJZPXQpfWVsc2UgcVkucHVzaChZWT1bQlk9dCxGWT10XSk7ZTxIWSYmKEhZPWUpLGU+VlkmJihWWT1lKSxXWT1uLFVZPXR9ZnVuY3Rpb24gZlgoKXtoWC5wb2ludD1wWH1mdW5jdGlvbiBtWCgpe1lZWzBdPUJZLFlZWzFdPUZZLGhYLnBvaW50PWRYLFdZPW51bGx9ZnVuY3Rpb24gZ1godCxlKXtpZihXWSl7dmFyIG49dC1VWTt1WC5hZGQoWnEobik+MTgwP24rKG4+MD8zNjA6LTM2MCk6bil9ZWxzZSBqWT10LEdZPWU7VFkucG9pbnQodCxlKSxwWCh0LGUpfWZ1bmN0aW9uIF9YKCl7VFkubGluZVN0YXJ0KCl9ZnVuY3Rpb24geVgoKXtnWChqWSxHWSksVFkubGluZUVuZCgpLFpxKHVYKT5HcSYmKEJZPS0oRlk9MTgwKSksWVlbMF09QlksWVlbMV09RlksV1k9bnVsbH1mdW5jdGlvbiB2WCh0LGUpe3JldHVybihlLT10KTwwP2UrMzYwOmV9ZnVuY3Rpb24gYlgodCxlKXtyZXR1cm4gdFswXS1lWzBdfWZ1bmN0aW9uIHhYKHQsZSl7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9ZSYmZTw9dFsxXTplPHRbMF18fHRbMV08ZX12YXIgd1g9e3NwaGVyZTpkWSxwb2ludDpTWCxsaW5lU3RhcnQ6RVgsbGluZUVuZDpBWCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt3WC5saW5lU3RhcnQ9a1gsd1gubGluZUVuZD1MWH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3dYLmxpbmVTdGFydD1FWCx3WC5saW5lRW5kPUFYfX07ZnVuY3Rpb24gU1godCxlKXt0Kj1LcTt2YXIgbj10WShlKj1LcSk7TVgobip0WSh0KSxuKm9ZKHQpLG9ZKGUpKX1mdW5jdGlvbiBNWCh0LGUsbil7KytYWSxLWSs9KHQtS1kpL1hZLFpZKz0oZS1aWSkvWFksSlkrPShuLUpZKS9YWX1mdW5jdGlvbiBFWCgpe3dYLnBvaW50PVRYfWZ1bmN0aW9uIFRYKHQsZSl7dCo9S3E7dmFyIG49dFkoZSo9S3EpO3NYPW4qdFkodCksbFg9bipvWSh0KSxjWD1vWShlKSx3WC5wb2ludD1DWCxNWChzWCxsWCxjWCl9ZnVuY3Rpb24gQ1godCxlKXt0Kj1LcTt2YXIgbj10WShlKj1LcSksaT1uKnRZKHQpLHI9bipvWSh0KSxvPW9ZKGUpLGE9UXEoc1koKGE9bFgqby1jWCpyKSphKyhhPWNYKmktc1gqbykqYSsoYT1zWCpyLWxYKmkpKmEpLHNYKmkrbFgqcitjWCpvKTskWSs9YSxRWSs9YSooc1grKHNYPWkpKSx0WCs9YSoobFgrKGxYPXIpKSxlWCs9YSooY1grKGNYPW8pKSxNWChzWCxsWCxjWCl9ZnVuY3Rpb24gQVgoKXt3WC5wb2ludD1TWH1mdW5jdGlvbiBrWCgpe3dYLnBvaW50PVBYfWZ1bmN0aW9uIExYKCl7Tlgob1gsYVgpLHdYLnBvaW50PVNYfWZ1bmN0aW9uIFBYKHQsZSl7b1g9dCxhWD1lLHQqPUtxLGUqPUtxLHdYLnBvaW50PU5YO3ZhciBuPXRZKGUpO3NYPW4qdFkodCksbFg9bipvWSh0KSxjWD1vWShlKSxNWChzWCxsWCxjWCl9ZnVuY3Rpb24gTlgodCxlKXt0Kj1LcTt2YXIgbj10WShlKj1LcSksaT1uKnRZKHQpLHI9bipvWSh0KSxvPW9ZKGUpLGE9bFgqby1jWCpyLHM9Y1gqaS1zWCpvLGw9c1gqci1sWCppLGM9c1koYSphK3MqcytsKmwpLHU9dVkoYyksaD1jJiYtdS9jO25YKz1oKmEsaVgrPWgqcyxyWCs9aCpsLCRZKz11LFFZKz11KihzWCsoc1g9aSkpLHRYKz11KihsWCsobFg9cikpLGVYKz11KihjWCsoY1g9bykpLE1YKHNYLGxYLGNYKX1mdW5jdGlvbiBJWCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gUlgodCxlKXtmdW5jdGlvbiBuKG4saSl7cmV0dXJuIG49dChuLGkpLGUoblswXSxuWzFdKX1yZXR1cm4gdC5pbnZlcnQmJmUuaW52ZXJ0JiYobi5pbnZlcnQ9ZnVuY3Rpb24obixpKXtyZXR1cm4obj1lLmludmVydChuLGkpKSYmdC5pbnZlcnQoblswXSxuWzFdKX0pLG59ZnVuY3Rpb24gT1godCxlKXtyZXR1cm5bdD5XcT90LVhxOnQ8LVdxP3QrWHE6dCxlXX1mdW5jdGlvbiB6WCh0LGUsbil7cmV0dXJuKHQlPVhxKT9lfHxuP1JYKEJYKHQpLEhYKGUsbikpOkJYKHQpOmV8fG4/SFgoZSxuKTpPWH1mdW5jdGlvbiBEWCh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtyZXR1cm5bKGUrPXQpPldxP2UtWHE6ZTwtV3E/ZStYcTplLG5dfX1mdW5jdGlvbiBCWCh0KXt2YXIgZT1EWCh0KTtyZXR1cm4gZS5pbnZlcnQ9RFgoLXQpLGV9ZnVuY3Rpb24gSFgodCxlKXt2YXIgbj10WSh0KSxpPW9ZKHQpLHI9dFkoZSksbz1vWShlKTtmdW5jdGlvbiBhKHQsZSl7dmFyIGE9dFkoZSkscz10WSh0KSphLGw9b1kodCkqYSxjPW9ZKGUpLHU9YypuK3MqaTtyZXR1cm5bUXEobCpyLXUqbyxzKm4tYyppKSx1WSh1KnIrbCpvKV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIGE9dFkoZSkscz10WSh0KSphLGw9b1kodCkqYSxjPW9ZKGUpLHU9YypyLWwqbztyZXR1cm5bUXEobCpyK2MqbyxzKm4rdSppKSx1WSh1Km4tcyppKV19LGF9ZnVuY3Rpb24gRlgodCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4oZT10KGVbMF0qS3EsZVsxXSpLcSkpWzBdKj0kcSxlWzFdKj0kcSxlfXJldHVybiB0PXpYKHRbMF0qS3EsdFsxXSpLcSx0Lmxlbmd0aD4yP3RbMl0qS3E6MCksZS5pbnZlcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuKGU9dC5pbnZlcnQoZVswXSpLcSxlWzFdKktxKSlbMF0qPSRxLGVbMV0qPSRxLGV9LGV9ZnVuY3Rpb24gVlgodCxlLG4saSxyLG8pe2lmKG4pe3ZhciBhPXRZKGUpLHM9b1koZSksbD1pKm47bnVsbD09cj8ocj1lK2kqWHEsbz1lLWwvMik6KHI9VVgoYSxyKSxvPVVYKGEsbyksKGk+MD9yPG86cj5vKSYmKHIrPWkqWHEpKTtmb3IodmFyIGMsdT1yO2k+MD91Pm86dTxvO3UtPWwpYz1QWShbYSwtcyp0WSh1KSwtcypvWSh1KV0pLHQucG9pbnQoY1swXSxjWzFdKX19ZnVuY3Rpb24gVVgodCxlKXsoZT1OWShlKSlbMF0tPXQsRFkoZSk7dmFyIG49Y1koLWVbMV0pO3JldHVybigoLWVbMl08MD8tbjpuKStYcS1HcSklWHF9ZnVuY3Rpb24galgoKXt2YXIgdCxlPVtdO3JldHVybntwb2ludDpmdW5jdGlvbihlLG4pe3QucHVzaChbZSxuXSl9LGxpbmVTdGFydDpmdW5jdGlvbigpe2UucHVzaCh0PVtdKX0sbGluZUVuZDpkWSxyZWpvaW46ZnVuY3Rpb24oKXtlLmxlbmd0aD4xJiZlLnB1c2goZS5wb3AoKS5jb25jYXQoZS5zaGlmdCgpKSl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciBuPWU7cmV0dXJuIGU9W10sdD1udWxsLG59fX1mdW5jdGlvbiBHWCh0LGUpe3JldHVybiBacSh0WzBdLWVbMF0pPEdxJiZacSh0WzFdLWVbMV0pPEdxfWZ1bmN0aW9uIFdYKHQsZSxuLGkpe3RoaXMueD10LHRoaXMuej1lLHRoaXMubz1uLHRoaXMuZT1pLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gcVgodCxlLG4saSxyKXt2YXIgbyxhLHM9W10sbD1bXTtpZih0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCEoKGU9dC5sZW5ndGgtMSk8PTApKXt2YXIgZSxuLGk9dFswXSxhPXRbZV07aWYoR1goaSxhKSl7Zm9yKHIubGluZVN0YXJ0KCksbz0wO288ZTsrK28pci5wb2ludCgoaT10W29dKVswXSxpWzFdKTtyLmxpbmVFbmQoKX1lbHNlIHMucHVzaChuPW5ldyBXWChpLHQsbnVsbCwhMCkpLGwucHVzaChuLm89bmV3IFdYKGksbnVsbCxuLCExKSkscy5wdXNoKG49bmV3IFdYKGEsdCxudWxsLCExKSksbC5wdXNoKG4ubz1uZXcgV1goYSxudWxsLG4sITApKX19KSkscy5sZW5ndGgpe2ZvcihsLnNvcnQoZSksWVgocyksWVgobCksbz0wLGE9bC5sZW5ndGg7bzxhOysrbylsW29dLmU9bj0hbjtmb3IodmFyIGMsdSxoPXNbMF07Oyl7Zm9yKHZhciBkPWgscD0hMDtkLnY7KWlmKChkPWQubik9PT1oKXJldHVybjtjPWQueixyLmxpbmVTdGFydCgpO2Rve2lmKGQudj1kLm8udj0hMCxkLmUpe2lmKHApZm9yKG89MCxhPWMubGVuZ3RoO288YTsrK28pci5wb2ludCgodT1jW29dKVswXSx1WzFdKTtlbHNlIGkoZC54LGQubi54LDEscik7ZD1kLm59ZWxzZXtpZihwKWZvcihvPShjPWQucC56KS5sZW5ndGgtMTtvPj0wOy0tbylyLnBvaW50KCh1PWNbb10pWzBdLHVbMV0pO2Vsc2UgaShkLngsZC5wLngsLTEscik7ZD1kLnB9Yz0oZD1kLm8pLnoscD0hcH13aGlsZSghZC52KTtyLmxpbmVFbmQoKX19fWZ1bmN0aW9uIFlYKHQpe2lmKGU9dC5sZW5ndGgpe2Zvcih2YXIgZSxuLGk9MCxyPXRbMF07KytpPGU7KXIubj1uPXRbaV0sbi5wPXIscj1uO3Iubj1uPXRbMF0sbi5wPXJ9fU9YLmludmVydD1PWDt2YXIgWFg9RnEoKTtmdW5jdGlvbiAkWCh0LGUpe3ZhciBuPWVbMF0saT1lWzFdLHI9W29ZKG4pLC10WShuKSwwXSxvPTAsYT0wO1hYLnJlc2V0KCk7Zm9yKHZhciBzPTAsbD10Lmxlbmd0aDtzPGw7KytzKWlmKHU9KGM9dFtzXSkubGVuZ3RoKWZvcih2YXIgYyx1LGg9Y1t1LTFdLGQ9aFswXSxwPWhbMV0vMitZcSxmPW9ZKHApLG09dFkocCksZz0wO2c8dTsrK2csZD15LGY9YixtPXgsaD1fKXt2YXIgXz1jW2ddLHk9X1swXSx2PV9bMV0vMitZcSxiPW9ZKHYpLHg9dFkodiksdz15LWQsUz13Pj0wPzE6LTEsTT1TKncsRT1NPldxLFQ9ZipiO2lmKFhYLmFkZChRcShUKlMqb1koTSksbSp4K1QqdFkoTSkpKSxvKz1FP3crUypYcTp3LEVeZD49bl55Pj1uKXt2YXIgQz1SWShOWShoKSxOWShfKSk7RFkoQyk7dmFyIEE9UlkocixDKTtEWShBKTt2YXIgaz0oRV53Pj0wPy0xOjEpKnVZKEFbMl0pOyhpPmt8fGk9PT1rJiYoQ1swXXx8Q1sxXSkpJiYoYSs9RV53Pj0wPzE6LTEpfX1yZXR1cm4obzwtMWUtNnx8bzxHcSYmWFg8LTFlLTYpXjEmYX1mdW5jdGlvbiBLWCh0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6dD49ZT8wOk5hTn1mdW5jdGlvbiBaWCh0LGUsbil7dD0rdCxlPStlLG49KHI9YXJndW1lbnRzLmxlbmd0aCk8Mj8oZT10LHQ9MCwxKTpyPDM/MTorbjtmb3IodmFyIGk9LTEscj0wfE1hdGgubWF4KDAsTWF0aC5jZWlsKChlLXQpL24pKSxvPW5ldyBBcnJheShyKTsrK2k8cjspb1tpXT10K2kqbjtyZXR1cm4gb31mdW5jdGlvbiBKWCh0KXtmb3IodmFyIGUsbixpLHI9dC5sZW5ndGgsbz0tMSxhPTA7KytvPHI7KWErPXRbb10ubGVuZ3RoO2ZvcihuPW5ldyBBcnJheShhKTstLXI+PTA7KWZvcihlPShpPXRbcl0pLmxlbmd0aDstLWU+PTA7KW5bLS1hXT1pW2VdO3JldHVybiBufWZ1bmN0aW9uIFFYKHQsZSxuLGkpe3JldHVybiBmdW5jdGlvbihyKXt2YXIgbyxhLHMsbD1lKHIpLGM9algoKSx1PWUoYyksaD0hMSxkPXtwb2ludDpwLGxpbmVTdGFydDptLGxpbmVFbmQ6Zyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtkLnBvaW50PV8sZC5saW5lU3RhcnQ9eSxkLmxpbmVFbmQ9dixhPVtdLG89W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtkLnBvaW50PXAsZC5saW5lU3RhcnQ9bSxkLmxpbmVFbmQ9ZyxhPUpYKGEpO3ZhciB0PSRYKG8saSk7YS5sZW5ndGg/KGh8fChyLnBvbHlnb25TdGFydCgpLGg9ITApLHFYKGEsZSQsdCxuLHIpKTp0JiYoaHx8KHIucG9seWdvblN0YXJ0KCksaD0hMCksci5saW5lU3RhcnQoKSxuKG51bGwsbnVsbCwxLHIpLHIubGluZUVuZCgpKSxoJiYoci5wb2x5Z29uRW5kKCksaD0hMSksYT1vPW51bGx9LHNwaGVyZTpmdW5jdGlvbigpe3IucG9seWdvblN0YXJ0KCksci5saW5lU3RhcnQoKSxuKG51bGwsbnVsbCwxLHIpLHIubGluZUVuZCgpLHIucG9seWdvbkVuZCgpfX07ZnVuY3Rpb24gcChlLG4pe3QoZSxuKSYmci5wb2ludChlLG4pfWZ1bmN0aW9uIGYodCxlKXtsLnBvaW50KHQsZSl9ZnVuY3Rpb24gbSgpe2QucG9pbnQ9ZixsLmxpbmVTdGFydCgpfWZ1bmN0aW9uIGcoKXtkLnBvaW50PXAsbC5saW5lRW5kKCl9ZnVuY3Rpb24gXyh0LGUpe3MucHVzaChbdCxlXSksdS5wb2ludCh0LGUpfWZ1bmN0aW9uIHkoKXt1LmxpbmVTdGFydCgpLHM9W119ZnVuY3Rpb24gdigpe18oc1swXVswXSxzWzBdWzFdKSx1LmxpbmVFbmQoKTt2YXIgdCxlLG4saSxsPXUuY2xlYW4oKSxkPWMucmVzdWx0KCkscD1kLmxlbmd0aDtpZihzLnBvcCgpLG8ucHVzaChzKSxzPW51bGwscClpZigxJmwpe2lmKChlPShuPWRbMF0pLmxlbmd0aC0xKT4wKXtmb3IoaHx8KHIucG9seWdvblN0YXJ0KCksaD0hMCksci5saW5lU3RhcnQoKSx0PTA7dDxlOysrdClyLnBvaW50KChpPW5bdF0pWzBdLGlbMV0pO3IubGluZUVuZCgpfX1lbHNlIHA+MSYmMiZsJiZkLnB1c2goZC5wb3AoKS5jb25jYXQoZC5zaGlmdCgpKSksYS5wdXNoKGQuZmlsdGVyKHQkKSl9cmV0dXJuIGR9fWZ1bmN0aW9uIHQkKHQpe3JldHVybiB0Lmxlbmd0aD4xfWZ1bmN0aW9uIGUkKHQsZSl7cmV0dXJuKCh0PXQueClbMF08MD90WzFdLXFxLUdxOnFxLXRbMV0pLSgoZT1lLngpWzBdPDA/ZVsxXS1xcS1HcTpxcS1lWzFdKX0hKGZ1bmN0aW9uIG4kKHQpezE9PT10Lmxlbmd0aCYmKHQ9KGZ1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuIEtYKHQoZSksbil9fSkodCkpfSkoS1gpO3ZhciBpJD1RWCgoZnVuY3Rpb24oKXtyZXR1cm4hMH0pLChmdW5jdGlvbiByJCh0KXt2YXIgZSxuPU5hTixpPU5hTixyPU5hTjtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5saW5lU3RhcnQoKSxlPTF9LHBvaW50OmZ1bmN0aW9uKG8sYSl7dmFyIHM9bz4wP1dxOi1XcSxsPVpxKG8tbik7WnEobC1XcSk8R3E/KHQucG9pbnQobixpPShpK2EpLzI+MD9xcTotcXEpLHQucG9pbnQocixpKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQocyxpKSx0LnBvaW50KG8saSksZT0wKTpyIT09cyYmbD49V3EmJihacShuLXIpPEdxJiYobi09cipHcSksWnEoby1zKTxHcSYmKG8tPXMqR3EpLGk9KGZ1bmN0aW9uIGModCxlLG4saSl7dmFyIHIsbyxhPW9ZKHQtbik7cmV0dXJuIFpxKGEpPkdxP0pxKChvWShlKSoobz10WShpKSkqb1kobiktb1koaSkqKHI9dFkoZSkpKm9ZKHQpKS8ocipvKmEpKTooZStpKS8yfSkobixpLG8sYSksdC5wb2ludChyLGkpLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludChzLGkpLGU9MCksdC5wb2ludChuPW8saT1hKSxyPXN9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0LmxpbmVFbmQoKSxuPWk9TmFOfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiAyLWV9fX0pLChmdW5jdGlvbiBvJCh0LGUsbixpKXt2YXIgcjtpZihudWxsPT10KWkucG9pbnQoLVdxLHI9bipxcSksaS5wb2ludCgwLHIpLGkucG9pbnQoV3EsciksaS5wb2ludChXcSwwKSxpLnBvaW50KFdxLC1yKSxpLnBvaW50KDAsLXIpLGkucG9pbnQoLVdxLC1yKSxpLnBvaW50KC1XcSwwKSxpLnBvaW50KC1XcSxyKTtlbHNlIGlmKFpxKHRbMF0tZVswXSk+R3Epe3ZhciBvPXRbMF08ZVswXT9XcTotV3E7aS5wb2ludCgtbyxyPW4qby8yKSxpLnBvaW50KDAsciksaS5wb2ludChvLHIpfWVsc2UgaS5wb2ludChlWzBdLGVbMV0pfSksWy1XcSwtcXFdKTtmdW5jdGlvbiBhJCh0KXt2YXIgZT10WSh0KSxuPTYqS3EsaT1lPjAscj1acShlKT5HcTtmdW5jdGlvbiBvKHQsbil7cmV0dXJuIHRZKHQpKnRZKG4pPmV9ZnVuY3Rpb24gYSh0LG4saSl7dmFyIHI9WzEsMCwwXSxvPVJZKE5ZKHQpLE5ZKG4pKSxhPUlZKG8sbykscz1vWzBdLGw9YS1zKnM7aWYoIWwpcmV0dXJuIWkmJnQ7dmFyIGM9ZSphL2wsdT0tZSpzL2wsaD1SWShyLG8pLGQ9elkocixjKTtPWShkLHpZKG8sdSkpO3ZhciBwPWgsZj1JWShkLHApLG09SVkocCxwKSxnPWYqZi1tKihJWShkLGQpLTEpO2lmKCEoZzwwKSl7dmFyIF89c1koZykseT16WShwLCgtZi1fKS9tKTtpZihPWSh5LGQpLHk9UFkoeSksIWkpcmV0dXJuIHk7dmFyIHYsYj10WzBdLHg9blswXSx3PXRbMV0sUz1uWzFdO3g8YiYmKHY9YixiPXgseD12KTt2YXIgTT14LWIsRT1acShNLVdxKTxHcTtpZighRSYmUzx3JiYodj13LHc9UyxTPXYpLEV8fE08R3E/RT93K1M+MF55WzFdPChacSh5WzBdLWIpPEdxP3c6Uyk6dzw9eVsxXSYmeVsxXTw9UzpNPldxXihiPD15WzBdJiZ5WzBdPD14KSl7dmFyIFQ9elkocCwoLWYrXykvbSk7cmV0dXJuIE9ZKFQsZCksW3ksUFkoVCldfX19ZnVuY3Rpb24gcyhlLG4pe3ZhciByPWk/dDpXcS10LG89MDtyZXR1cm4gZTwtcj9vfD0xOmU+ciYmKG98PTIpLG48LXI/b3w9NDpuPnImJihvfD04KSxvfXJldHVybiBRWChvLChmdW5jdGlvbiBsKHQpe3ZhciBlLG4sbCxjLHU7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2M9bD0hMSx1PTF9LHBvaW50OmZ1bmN0aW9uKGgsZCl7dmFyIHAsZj1baCxkXSxtPW8oaCxkKSxnPWk/bT8wOnMoaCxkKTptP3MoaCsoaDwwP1dxOi1XcSksZCk6MDtpZighZSYmKGM9bD1tKSYmdC5saW5lU3RhcnQoKSxtIT09bCYmKCEocD1hKGUsZikpfHxHWChlLHApfHxHWChmLHApKSYmKGZbMF0rPUdxLGZbMV0rPUdxLG09byhmWzBdLGZbMV0pKSxtIT09bCl1PTAsbT8odC5saW5lU3RhcnQoKSxwPWEoZixlKSx0LnBvaW50KHBbMF0scFsxXSkpOihwPWEoZSxmKSx0LnBvaW50KHBbMF0scFsxXSksdC5saW5lRW5kKCkpLGU9cDtlbHNlIGlmKHImJmUmJmlebSl7dmFyIF87ZyZufHwhKF89YShmLGUsITApKXx8KHU9MCxpPyh0LmxpbmVTdGFydCgpLHQucG9pbnQoX1swXVswXSxfWzBdWzFdKSx0LnBvaW50KF9bMV1bMF0sX1sxXVsxXSksdC5saW5lRW5kKCkpOih0LnBvaW50KF9bMV1bMF0sX1sxXVsxXSksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KF9bMF1bMF0sX1swXVsxXSkpKX0hbXx8ZSYmR1goZSxmKXx8dC5wb2ludChmWzBdLGZbMV0pLGU9ZixsPW0sbj1nfSxsaW5lRW5kOmZ1bmN0aW9uKCl7bCYmdC5saW5lRW5kKCksZT1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiB1fChjJiZsKTw8MX19fSksKGZ1bmN0aW9uIGMoZSxpLHIsbyl7Vlgobyx0LG4scixlLGkpfSksaT9bMCwtdF06Wy1XcSx0LVdxXSl9dmFyIHMkPTFlOSxsJD0tcyQ7ZnVuY3Rpb24gYyQodCxlLG4saSl7ZnVuY3Rpb24gcihyLG8pe3JldHVybiB0PD1yJiZyPD1uJiZlPD1vJiZvPD1pfWZ1bmN0aW9uIG8ocixvLHMsYyl7dmFyIHU9MCxoPTA7aWYobnVsbD09cnx8KHU9YShyLHMpKSE9PShoPWEobyxzKSl8fGwocixvKTwwXnM+MClkb3tjLnBvaW50KDA9PT11fHwzPT09dT90Om4sdT4xP2k6ZSl9d2hpbGUoKHU9KHUrcys0KSU0KSE9PWgpO2Vsc2UgYy5wb2ludChvWzBdLG9bMV0pfWZ1bmN0aW9uIGEoaSxyKXtyZXR1cm4gWnEoaVswXS10KTxHcT9yPjA/MDozOlpxKGlbMF0tbik8R3E/cj4wPzI6MTpacShpWzFdLWUpPEdxP3I+MD8xOjA6cj4wPzM6Mn1mdW5jdGlvbiBzKHQsZSl7cmV0dXJuIGwodC54LGUueCl9ZnVuY3Rpb24gbCh0LGUpe3ZhciBuPWEodCwxKSxpPWEoZSwxKTtyZXR1cm4gbiE9PWk/bi1pOjA9PT1uP2VbMV0tdFsxXToxPT09bj90WzBdLWVbMF06Mj09PW4/dFsxXS1lWzFdOmVbMF0tdFswXX1yZXR1cm4gZnVuY3Rpb24oYSl7dmFyIGwsYyx1LGgsZCxwLGYsbSxnLF8seSx2PWEsYj1qWCgpLHg9e3BvaW50OlQsbGluZVN0YXJ0OmZ1bmN0aW9uIHcoKXt4LnBvaW50PUMsYyYmYy5wdXNoKHU9W10pLF89ITAsZz0hMSxmPW09TmFOfSxsaW5lRW5kOmZ1bmN0aW9uIFMoKXtsJiYoQyhoLGQpLHAmJmcmJmIucmVqb2luKCksbC5wdXNoKGIucmVzdWx0KCkpKSx4LnBvaW50PVQsZyYmdi5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbiBNKCl7dj1iLGw9W10sYz1bXSx5PSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uIEUoKXt2YXIgZT0oZnVuY3Rpb24gbigpe2Zvcih2YXIgZT0wLG49MCxyPWMubGVuZ3RoO248cjsrK24pZm9yKHZhciBvLGEscz1jW25dLGw9MSx1PXMubGVuZ3RoLGg9c1swXSxkPWhbMF0scD1oWzFdO2w8dTsrK2wpbz1kLGE9cCxkPShoPXNbbF0pWzBdLHA9aFsxXSxhPD1pP3A+aSYmKGQtbykqKGktYSk+KHAtYSkqKHQtbykmJisrZTpwPD1pJiYoZC1vKSooaS1hKTwocC1hKSoodC1vKSYmLS1lO3JldHVybiBlfSkoKSxyPXkmJmUsaD0obD1KWChsKSkubGVuZ3RoOyhyfHxoKSYmKGEucG9seWdvblN0YXJ0KCksciYmKGEubGluZVN0YXJ0KCksbyhudWxsLG51bGwsMSxhKSxhLmxpbmVFbmQoKSksaCYmcVgobCxzLGUsbyxhKSxhLnBvbHlnb25FbmQoKSksdj1hLGw9Yz11PW51bGx9fTtmdW5jdGlvbiBUKHQsZSl7cih0LGUpJiZ2LnBvaW50KHQsZSl9ZnVuY3Rpb24gQyhvLGEpe3ZhciBzPXIobyxhKTtpZihjJiZ1LnB1c2goW28sYV0pLF8paD1vLGQ9YSxwPXMsXz0hMSxzJiYodi5saW5lU3RhcnQoKSx2LnBvaW50KG8sYSkpO2Vsc2UgaWYocyYmZyl2LnBvaW50KG8sYSk7ZWxzZXt2YXIgbD1bZj1NYXRoLm1heChsJCxNYXRoLm1pbihzJCxmKSksbT1NYXRoLm1heChsJCxNYXRoLm1pbihzJCxtKSldLGI9W289TWF0aC5tYXgobCQsTWF0aC5taW4ocyQsbykpLGE9TWF0aC5tYXgobCQsTWF0aC5taW4ocyQsYSkpXTshKGZ1bmN0aW9uIHgodCxlLG4saSxyLG8pe3ZhciBhLHM9dFswXSxsPXRbMV0sYz0wLHU9MSxoPWVbMF0tcyxkPWVbMV0tbDtpZihhPW4tcyxofHwhKGE+MCkpe2lmKGEvPWgsaDwwKXtpZihhPGMpcmV0dXJuO2E8dSYmKHU9YSl9ZWxzZSBpZihoPjApe2lmKGE+dSlyZXR1cm47YT5jJiYoYz1hKX1pZihhPXItcyxofHwhKGE8MCkpe2lmKGEvPWgsaDwwKXtpZihhPnUpcmV0dXJuO2E+YyYmKGM9YSl9ZWxzZSBpZihoPjApe2lmKGE8YylyZXR1cm47YTx1JiYodT1hKX1pZihhPWktbCxkfHwhKGE+MCkpe2lmKGEvPWQsZDwwKXtpZihhPGMpcmV0dXJuO2E8dSYmKHU9YSl9ZWxzZSBpZihkPjApe2lmKGE+dSlyZXR1cm47YT5jJiYoYz1hKX1pZihhPW8tbCxkfHwhKGE8MCkpe2lmKGEvPWQsZDwwKXtpZihhPnUpcmV0dXJuO2E+YyYmKGM9YSl9ZWxzZSBpZihkPjApe2lmKGE8YylyZXR1cm47YTx1JiYodT1hKX1yZXR1cm4gYz4wJiYodFswXT1zK2MqaCx0WzFdPWwrYypkKSx1PDEmJihlWzBdPXMrdSpoLGVbMV09bCt1KmQpLCEwfX19fX0pKGwsYix0LGUsbixpKT9zJiYodi5saW5lU3RhcnQoKSx2LnBvaW50KG8sYSkseT0hMSk6KGd8fCh2LmxpbmVTdGFydCgpLHYucG9pbnQobFswXSxsWzFdKSksdi5wb2ludChiWzBdLGJbMV0pLHN8fHYubGluZUVuZCgpLHk9ITEpfWY9byxtPWEsZz1zfXJldHVybiB4fX12YXIgdSQsaCQsZCQscCQ9RnEoKSxmJD17c3BoZXJlOmRZLHBvaW50OmRZLGxpbmVTdGFydDpmdW5jdGlvbiBtJCgpe2YkLnBvaW50PV8kLGYkLmxpbmVFbmQ9ZyR9LGxpbmVFbmQ6ZFkscG9seWdvblN0YXJ0OmRZLHBvbHlnb25FbmQ6ZFl9O2Z1bmN0aW9uIGckKCl7ZiQucG9pbnQ9ZiQubGluZUVuZD1kWX1mdW5jdGlvbiBfJCh0LGUpe3UkPXQqPUtxLGgkPW9ZKGUqPUtxKSxkJD10WShlKSxmJC5wb2ludD15JH1mdW5jdGlvbiB5JCh0LGUpe3QqPUtxO3ZhciBuPW9ZKGUqPUtxKSxpPXRZKGUpLHI9WnEodC11JCksbz10WShyKSxhPWkqb1kocikscz1kJCpuLWgkKmkqbyxsPWgkKm4rZCQqaSpvO3AkLmFkZChRcShzWShhKmErcypzKSxsKSksdSQ9dCxoJD1uLGQkPWl9ZnVuY3Rpb24gdiQodCl7cmV0dXJuIHAkLnJlc2V0KCkseVkodCxmJCksK3AkfXZhciBiJD1bbnVsbCxudWxsXSx4JD17dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6YiR9O2Z1bmN0aW9uIHckKHQsZSl7cmV0dXJuIGIkWzBdPXQsYiRbMV09ZSx2JCh4JCl9dmFyIFMkPXtGZWF0dXJlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEUkKHQuZ2VvbWV0cnksZSl9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZmVhdHVyZXMsaT0tMSxyPW4ubGVuZ3RoOysraTxyOylpZihFJChuW2ldLmdlb21ldHJ5LGUpKXJldHVybiEwO3JldHVybiExfX0sTSQ9e1NwaGVyZTpmdW5jdGlvbigpe3JldHVybiEwfSxQb2ludDpmdW5jdGlvbih0LGUpe3JldHVybiBUJCh0LmNvb3JkaW5hdGVzLGUpfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuY29vcmRpbmF0ZXMsaT0tMSxyPW4ubGVuZ3RoOysraTxyOylpZihUJChuW2ldLGUpKXJldHVybiEwO3JldHVybiExfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEMkKHQuY29vcmRpbmF0ZXMsZSl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmNvb3JkaW5hdGVzLGk9LTEscj1uLmxlbmd0aDsrK2k8cjspaWYoQyQobltpXSxlKSlyZXR1cm4hMDtyZXR1cm4hMX0sUG9seWdvbjpmdW5jdGlvbih0LGUpe3JldHVybiBBJCh0LmNvb3JkaW5hdGVzLGUpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5jb29yZGluYXRlcyxpPS0xLHI9bi5sZW5ndGg7KytpPHI7KWlmKEEkKG5baV0sZSkpcmV0dXJuITA7cmV0dXJuITF9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10Lmdlb21ldHJpZXMsaT0tMSxyPW4ubGVuZ3RoOysraTxyOylpZihFJChuW2ldLGUpKXJldHVybiEwO3JldHVybiExfX07ZnVuY3Rpb24gRSQodCxlKXtyZXR1cm4hKCF0fHwhTSQuaGFzT3duUHJvcGVydHkodC50eXBlKSkmJk0kW3QudHlwZV0odCxlKX1mdW5jdGlvbiBUJCh0LGUpe3JldHVybiAwPT09dyQodCxlKX1mdW5jdGlvbiBDJCh0LGUpe3ZhciBuPXckKHRbMF0sdFsxXSk7cmV0dXJuIHckKHRbMF0sZSkrdyQoZSx0WzFdKTw9bitHcX1mdW5jdGlvbiBBJCh0LGUpe3JldHVybiEhJFgodC5tYXAoayQpLEwkKGUpKX1mdW5jdGlvbiBrJCh0KXtyZXR1cm4odD10Lm1hcChMJCkpLnBvcCgpLHR9ZnVuY3Rpb24gTCQodCl7cmV0dXJuW3RbMF0qS3EsdFsxXSpLcV19ZnVuY3Rpb24gUCQodCxlLG4pe3ZhciBpPVpYKHQsZS1HcSxuKS5jb25jYXQoZSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuW3QsZV19KSl9fWZ1bmN0aW9uIE4kKHQsZSxuKXt2YXIgaT1aWCh0LGUtR3EsbikuY29uY2F0KGUpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybltlLHRdfSkpfX1mdW5jdGlvbiBJJCgpe3ZhciB0LGUsbixpLHIsbyxhLHMsbCxjLHUsaCxkPTEwLHA9ZCxmPTkwLG09MzYwLGc9Mi41O2Z1bmN0aW9uIF8oKXtyZXR1cm57dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczp5KCl9fWZ1bmN0aW9uIHkoKXtyZXR1cm4gWlgoZVkoaS9mKSpmLG4sZikubWFwKHUpLmNvbmNhdChaWChlWShzL20pKm0sYSxtKS5tYXAoaCkpLmNvbmNhdChaWChlWShlL2QpKmQsdCxkKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBacSh0JWYpPkdxfSkpLm1hcChsKSkuY29uY2F0KFpYKGVZKG8vcCkqcCxyLHApLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIFpxKHQlbSk+R3F9KSkubWFwKGMpKX1yZXR1cm4gXy5saW5lcz1mdW5jdGlvbigpe3JldHVybiB5KCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dH19KSl9LF8ub3V0bGluZT1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbdShpKS5jb25jYXQoaChhKS5zbGljZSgxKSx1KG4pLnJldmVyc2UoKS5zbGljZSgxKSxoKHMpLnJldmVyc2UoKS5zbGljZSgxKSldfX0sXy5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/Xy5leHRlbnRNYWpvcih0KS5leHRlbnRNaW5vcih0KTpfLmV4dGVudE1pbm9yKCl9LF8uZXh0ZW50TWFqb3I9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9K3RbMF1bMV0sYT0rdFsxXVsxXSwoaT0rdFswXVswXSk+KG49K3RbMV1bMF0pJiYodD1pLGk9bixuPXQpLHM+YSYmKHQ9cyxzPWEsYT10KSxfLnByZWNpc2lvbihnKSk6W1tpLHNdLFtuLGFdXX0sXy5leHRlbnRNaW5vcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0rblswXVsxXSxyPStuWzFdWzFdLChlPStuWzBdWzBdKT4odD0rblsxXVswXSkmJihuPWUsZT10LHQ9biksbz5yJiYobj1vLG89cixyPW4pLF8ucHJlY2lzaW9uKGcpKTpbW2Usb10sW3Qscl1dfSxfLnN0ZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/Xy5zdGVwTWFqb3IodCkuc3RlcE1pbm9yKHQpOl8uc3RlcE1pbm9yKCl9LF8uc3RlcE1ham9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSt0WzBdLG09K3RbMV0sXyk6W2YsbV19LF8uc3RlcE1pbm9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSt0WzBdLHA9K3RbMV0sXyk6W2QscF19LF8ucHJlY2lzaW9uPWZ1bmN0aW9uKGQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPStkLGw9UCQobyxyLDkwKSxjPU4kKGUsdCxnKSx1PVAkKHMsYSw5MCksaD1OJChpLG4sZyksXyk6Z30sXy5leHRlbnRNYWpvcihbWy0xODAsLTg5Ljk5OTk5OV0sWzE4MCw4OS45OTk5OTldXSkuZXh0ZW50TWlub3IoW1stMTgwLC04MC4wMDAwMDFdLFsxODAsODAuMDAwMDAxXV0pfWZ1bmN0aW9uIFIkKHQpe3JldHVybiB0fXZhciBPJCx6JCxEJCxCJCxIJD1GcSgpLEYkPUZxKCksViQ9e3BvaW50OmRZLGxpbmVTdGFydDpkWSxsaW5lRW5kOmRZLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1YkLmxpbmVTdGFydD1VJCxWJC5saW5lRW5kPVckfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7ViQubGluZVN0YXJ0PVYkLmxpbmVFbmQ9ViQucG9pbnQ9ZFksSCQuYWRkKFpxKEYkKSksRiQucmVzZXQoKX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9SCQvMjtyZXR1cm4gSCQucmVzZXQoKSx0fX07ZnVuY3Rpb24gVSQoKXtWJC5wb2ludD1qJH1mdW5jdGlvbiBqJCh0LGUpe1YkLnBvaW50PUckLE8kPUQkPXQseiQ9QiQ9ZX1mdW5jdGlvbiBHJCh0LGUpe0YkLmFkZChCJCp0LUQkKmUpLEQkPXQsQiQ9ZX1mdW5jdGlvbiBXJCgpe0ckKE8kLHokKX12YXIgcSQsWSQsWCQsJCQsSyQ9MS8wLFokPUskLEokPS1LJCxRJD1KJCx0Sz17cG9pbnQ6ZnVuY3Rpb24gZUsodCxlKXt0PEskJiYoSyQ9dCksdD5KJCYmKEokPXQpLGU8WiQmJihaJD1lKSxlPlEkJiYoUSQ9ZSl9LGxpbmVTdGFydDpkWSxsaW5lRW5kOmRZLHBvbHlnb25TdGFydDpkWSxwb2x5Z29uRW5kOmRZLHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVtbSyQsWiRdLFtKJCxRJF1dO3JldHVybiBKJD1RJD0tKFokPUskPTEvMCksdH19LG5LPTAsaUs9MCxySz0wLG9LPTAsYUs9MCxzSz0wLGxLPTAsY0s9MCx1Sz0wLGhLPXtwb2ludDpkSyxsaW5lU3RhcnQ6cEssbGluZUVuZDpnSyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtoSy5saW5lU3RhcnQ9X0ssaEsubGluZUVuZD15S30scG9seWdvbkVuZDpmdW5jdGlvbigpe2hLLnBvaW50PWRLLGhLLmxpbmVTdGFydD1wSyxoSy5saW5lRW5kPWdLfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD11Sz9bbEsvdUssY0svdUtdOnNLP1tvSy9zSyxhSy9zS106cks/W25LL3JLLGlLL3JLXTpbTmFOLE5hTl07cmV0dXJuIG5LPWlLPXJLPW9LPWFLPXNLPWxLPWNLPXVLPTAsdH19O2Z1bmN0aW9uIGRLKHQsZSl7bksrPXQsaUsrPWUsKytyS31mdW5jdGlvbiBwSygpe2hLLnBvaW50PWZLfWZ1bmN0aW9uIGZLKHQsZSl7aEsucG9pbnQ9bUssZEsoWCQ9dCwkJD1lKX1mdW5jdGlvbiBtSyh0LGUpe3ZhciBuPXQtWCQsaT1lLSQkLHI9c1kobipuK2kqaSk7b0srPXIqKFgkK3QpLzIsYUsrPXIqKCQkK2UpLzIsc0srPXIsZEsoWCQ9dCwkJD1lKX1mdW5jdGlvbiBnSygpe2hLLnBvaW50PWRLfWZ1bmN0aW9uIF9LKCl7aEsucG9pbnQ9dkt9ZnVuY3Rpb24geUsoKXtiSyhxJCxZJCl9ZnVuY3Rpb24gdksodCxlKXtoSy5wb2ludD1iSyxkSyhxJD1YJD10LFkkPSQkPWUpfWZ1bmN0aW9uIGJLKHQsZSl7dmFyIG49dC1YJCxpPWUtJCQscj1zWShuKm4raSppKTtvSys9ciooWCQrdCkvMixhSys9ciooJCQrZSkvMixzSys9cixsSys9KHI9JCQqdC1YJCplKSooWCQrdCksY0srPXIqKCQkK2UpLHVLKz0zKnIsZEsoWCQ9dCwkJD1lKX1mdW5jdGlvbiB4Syh0KXt0aGlzLl9jb250ZXh0PXR9eEsucHJvdG90eXBlPXtfcmFkaXVzOjQuNSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmFkaXVzPXQsdGhpc30scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPT09dGhpcy5fbGluZSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9wb2ludD1OYU59LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxlKSx0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpO2JyZWFrO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5tb3ZlVG8odCt0aGlzLl9yYWRpdXMsZSksdGhpcy5fY29udGV4dC5hcmModCxlLHRoaXMuX3JhZGl1cywwLFhxKX19LHJlc3VsdDpkWX07dmFyIHdLLFNLLE1LLEVLLFRLLENLPUZxKCksQUs9e3BvaW50OmRZLGxpbmVTdGFydDpmdW5jdGlvbigpe0FLLnBvaW50PWtLfSxsaW5lRW5kOmZ1bmN0aW9uKCl7d0smJkxLKFNLLE1LKSxBSy5wb2ludD1kWX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7d0s9ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt3Sz1udWxsfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD0rQ0s7cmV0dXJuIENLLnJlc2V0KCksdH19O2Z1bmN0aW9uIGtLKHQsZSl7QUsucG9pbnQ9TEssU0s9RUs9dCxNSz1USz1lfWZ1bmN0aW9uIExLKHQsZSl7Q0suYWRkKHNZKChFSy09dCkqRUsrKFRLLT1lKSpUSykpLEVLPXQsVEs9ZX1mdW5jdGlvbiBQSygpe3RoaXMuX3N0cmluZz1bXX1mdW5jdGlvbiBOSyh0KXtyZXR1cm4ibTAsIit0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKy0yKnQrImEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrMip0KyJ6In1mdW5jdGlvbiBJSyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49bmV3IFJLO2Zvcih2YXIgaSBpbiB0KW5baV09dFtpXTtyZXR1cm4gbi5zdHJlYW09ZSxufX1mdW5jdGlvbiBSSygpe31mdW5jdGlvbiBPSyh0LGUsbil7dmFyIGk9dC5jbGlwRXh0ZW50JiZ0LmNsaXBFeHRlbnQoKTtyZXR1cm4gdC5zY2FsZSgxNTApLnRyYW5zbGF0ZShbMCwwXSksbnVsbCE9aSYmdC5jbGlwRXh0ZW50KG51bGwpLHlZKG4sdC5zdHJlYW0odEspKSxlKHRLLnJlc3VsdCgpKSxudWxsIT1pJiZ0LmNsaXBFeHRlbnQoaSksdH1mdW5jdGlvbiB6Syh0LGUsbil7cmV0dXJuIE9LKHQsKGZ1bmN0aW9uKG4pe3ZhciBpPWVbMV1bMF0tZVswXVswXSxyPWVbMV1bMV0tZVswXVsxXSxvPU1hdGgubWluKGkvKG5bMV1bMF0tblswXVswXSksci8oblsxXVsxXS1uWzBdWzFdKSksYT0rZVswXVswXSsoaS1vKihuWzFdWzBdK25bMF1bMF0pKS8yLHM9K2VbMF1bMV0rKHItbyooblsxXVsxXStuWzBdWzFdKSkvMjt0LnNjYWxlKDE1MCpvKS50cmFuc2xhdGUoW2Esc10pfSksbil9ZnVuY3Rpb24gREsodCxlLG4pe3JldHVybiB6Syh0LFtbMCwwXSxlXSxuKX1mdW5jdGlvbiBCSyh0LGUsbil7cmV0dXJuIE9LKHQsKGZ1bmN0aW9uKG4pe3ZhciBpPStlLHI9aS8oblsxXVswXS1uWzBdWzBdKSxvPShpLXIqKG5bMV1bMF0rblswXVswXSkpLzIsYT0tcipuWzBdWzFdO3Quc2NhbGUoMTUwKnIpLnRyYW5zbGF0ZShbbyxhXSl9KSxuKX1mdW5jdGlvbiBISyh0LGUsbil7cmV0dXJuIE9LKHQsKGZ1bmN0aW9uKG4pe3ZhciBpPStlLHI9aS8oblsxXVsxXS1uWzBdWzFdKSxvPS1yKm5bMF1bMF0sYT0oaS1yKihuWzFdWzFdK25bMF1bMV0pKS8yO3Quc2NhbGUoMTUwKnIpLnRyYW5zbGF0ZShbbyxhXSl9KSxuKX1QSy5wcm90b3R5cGU9e19yYWRpdXM6NC41LF9jaXJjbGU6TksoNC41KSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4odD0rdCkhPT10aGlzLl9yYWRpdXMmJih0aGlzLl9yYWRpdXM9dCx0aGlzLl9jaXJjbGU9bnVsbCksdGhpc30scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPT09dGhpcy5fbGluZSYmdGhpcy5fc3RyaW5nLnB1c2goIloiKSx0aGlzLl9wb2ludD1OYU59LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fc3RyaW5nLnB1c2goIk0iLHQsIiwiLGUpLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3N0cmluZy5wdXNoKCJMIix0LCIsIixlKTticmVhaztkZWZhdWx0Om51bGw9PXRoaXMuX2NpcmNsZSYmKHRoaXMuX2NpcmNsZT1OSyh0aGlzLl9yYWRpdXMpKSx0aGlzLl9zdHJpbmcucHVzaCgiTSIsdCwiLCIsZSx0aGlzLl9jaXJjbGUpfX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYodGhpcy5fc3RyaW5nLmxlbmd0aCl7dmFyIHQ9dGhpcy5fc3RyaW5nLmpvaW4oIiIpO3JldHVybiB0aGlzLl9zdHJpbmc9W10sdH1yZXR1cm4gbnVsbH19LFJLLnByb3RvdHlwZT17Y29uc3RydWN0b3I6UksscG9pbnQ6ZnVuY3Rpb24odCxlKXt0aGlzLnN0cmVhbS5wb2ludCh0LGUpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX07dmFyIEZLPXRZKDMwKktxKTtmdW5jdGlvbiBWSyh0LGUpe3JldHVybitlPyhmdW5jdGlvbiBuKHQsZSl7ZnVuY3Rpb24gbihpLHIsbyxhLHMsbCxjLHUsaCxkLHAsZixtLGcpe3ZhciBfPWMtaSx5PXUtcix2PV8qXyt5Knk7aWYodj40KmUmJm0tLSl7dmFyIGI9YStkLHg9cytwLHc9bCtmLFM9c1koYipiK3gqeCt3KncpLE09dVkody89UyksRT1acShacSh3KS0xKTxHcXx8WnEoby1oKTxHcT8obytoKS8yOlFxKHgsYiksVD10KEUsTSksQz1UWzBdLEE9VFsxXSxrPUMtaSxMPUEtcixQPXkqay1fKkw7KFAqUC92PmV8fFpxKChfKmsreSpMKS92LS41KT4uM3x8YSpkK3MqcCtsKmY8RkspJiYobihpLHIsbyxhLHMsbCxDLEEsRSxiLz1TLHgvPVMsdyxtLGcpLGcucG9pbnQoQyxBKSxuKEMsQSxFLGIseCx3LGMsdSxoLGQscCxmLG0sZykpfX1yZXR1cm4gZnVuY3Rpb24oZSl7dmFyIGkscixvLGEscyxsLGMsdSxoLGQscCxmLG09e3BvaW50OmcsbGluZVN0YXJ0Ol8sbGluZUVuZDp2LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2UucG9seWdvblN0YXJ0KCksbS5saW5lU3RhcnQ9Yn0scG9seWdvbkVuZDpmdW5jdGlvbigpe2UucG9seWdvbkVuZCgpLG0ubGluZVN0YXJ0PV99fTtmdW5jdGlvbiBnKG4saSl7bj10KG4saSksZS5wb2ludChuWzBdLG5bMV0pfWZ1bmN0aW9uIF8oKXt1PU5hTixtLnBvaW50PXksZS5saW5lU3RhcnQoKX1mdW5jdGlvbiB5KGkscil7dmFyIG89TlkoW2kscl0pLGE9dChpLHIpO24odSxoLGMsZCxwLGYsdT1hWzBdLGg9YVsxXSxjPWksZD1vWzBdLHA9b1sxXSxmPW9bMl0sMTYsZSksZS5wb2ludCh1LGgpfWZ1bmN0aW9uIHYoKXttLnBvaW50PWcsZS5saW5lRW5kKCl9ZnVuY3Rpb24gYigpe18oKSxtLnBvaW50PXgsbS5saW5lRW5kPXd9ZnVuY3Rpb24geCh0LGUpe3koaT10LGUpLHI9dSxvPWgsYT1kLHM9cCxsPWYsbS5wb2ludD15fWZ1bmN0aW9uIHcoKXtuKHUsaCxjLGQscCxmLHIsbyxpLGEscyxsLDE2LGUpLG0ubGluZUVuZD12LHYoKX1yZXR1cm4gbX19KSh0LGUpOihmdW5jdGlvbiBpKHQpe3JldHVybiBJSyh7cG9pbnQ6ZnVuY3Rpb24oZSxuKXtlPXQoZSxuKSx0aGlzLnN0cmVhbS5wb2ludChlWzBdLGVbMV0pfX0pfSkodCl9dmFyIFVLPUlLKHtwb2ludDpmdW5jdGlvbih0LGUpe3RoaXMuc3RyZWFtLnBvaW50KHQqS3EsZSpLcSl9fSk7ZnVuY3Rpb24gaksodCl7cmV0dXJuIEdLKChmdW5jdGlvbigpe3JldHVybiB0fSkpKCl9ZnVuY3Rpb24gR0sodCl7dmFyIGUsbixpLHIsbyxhLHMsbCxjLHUsaD0xNTAsZD00ODAscD0yNTAsZj0wLG09MCxnPTAsXz0wLHk9MCx2PW51bGwsYj1pJCx4PW51bGwsdz1SJCxTPS41LE09VksoQyxTKTtmdW5jdGlvbiBFKHQpe3JldHVyblsodD1vKHRbMF0qS3EsdFsxXSpLcSkpWzBdKmgrbixpLXRbMV0qaF19ZnVuY3Rpb24gVCh0KXtyZXR1cm4odD1vLmludmVydCgodFswXS1uKS9oLChpLXRbMV0pL2gpKSYmW3RbMF0qJHEsdFsxXSokcV19ZnVuY3Rpb24gQyh0LHIpe3JldHVyblsodD1lKHQscikpWzBdKmgrbixpLXRbMV0qaF19ZnVuY3Rpb24gQSgpe289Ulgocj16WChnLF8seSksZSk7dmFyIHQ9ZShmLG0pO3JldHVybiBuPWQtdFswXSpoLGk9cCt0WzFdKmgsaygpfWZ1bmN0aW9uIGsoKXtyZXR1cm4gYz11PW51bGwsRX1yZXR1cm4gRS5zdHJlYW09ZnVuY3Rpb24odCl7cmV0dXJuIGMmJnU9PT10P2M6Yz1VSygoZnVuY3Rpb24gZSh0KXtyZXR1cm4gSUsoe3BvaW50OmZ1bmN0aW9uKGUsbil7dmFyIGk9dChlLG4pO3JldHVybiB0aGlzLnN0cmVhbS5wb2ludChpWzBdLGlbMV0pfX0pfSkocikoYihNKHcodT10KSkpKSl9LEUucHJlY2xpcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj10LHY9dm9pZCAwLGsoKSk6Yn0sRS5wb3N0Y2xpcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odz10LHg9YT1zPWw9bnVsbCxrKCkpOnd9LEUuY2xpcEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPSt0P2EkKHY9dCpLcSk6KHY9bnVsbCxpJCksaygpKTp2KiRxfSxFLmNsaXBFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHc9bnVsbD09dD8oeD1hPXM9bD1udWxsLFIkKTpjJCh4PSt0WzBdWzBdLGE9K3RbMF1bMV0scz0rdFsxXVswXSxsPSt0WzFdWzFdKSxrKCkpOm51bGw9PXg/bnVsbDpbW3gsYV0sW3MsbF1dfSxFLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSt0LEEoKSk6aH0sRS50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9K3RbMF0scD0rdFsxXSxBKCkpOltkLHBdfSxFLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj10WzBdJTM2MCpLcSxtPXRbMV0lMzYwKktxLEEoKSk6W2YqJHEsbSokcV19LEUucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPXRbMF0lMzYwKktxLF89dFsxXSUzNjAqS3EseT10Lmxlbmd0aD4yP3RbMl0lMzYwKktxOjAsQSgpKTpbZyokcSxfKiRxLHkqJHFdfSxFLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTT1WSyhDLFM9dCp0KSxrKCkpOnNZKFMpfSxFLmZpdEV4dGVudD1mdW5jdGlvbih0LGUpe3JldHVybiB6SyhFLHQsZSl9LEUuZml0U2l6ZT1mdW5jdGlvbih0LGUpe3JldHVybiBESyhFLHQsZSl9LEUuZml0V2lkdGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gQksoRSx0LGUpfSxFLmZpdEhlaWdodD1mdW5jdGlvbih0LGUpe3JldHVybiBISyhFLHQsZSl9LGZ1bmN0aW9uKCl7cmV0dXJuIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksRS5pbnZlcnQ9ZS5pbnZlcnQmJlQsQSgpfX1mdW5jdGlvbiBXSyh0KXt2YXIgZT0wLG49V3EvMyxpPUdLKHQpLHI9aShlLG4pO3JldHVybiByLnBhcmFsbGVscz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9pKGU9dFswXSpLcSxuPXRbMV0qS3EpOltlKiRxLG4qJHFdfSxyfWZ1bmN0aW9uIHFLKHQsZSl7dmFyIG49b1kodCksaT0obitvWShlKSkvMjtpZihacShpKTxHcSlyZXR1cm4oZnVuY3Rpb24gcih0KXt2YXIgZT10WSh0KTtmdW5jdGlvbiBuKHQsbil7cmV0dXJuW3QqZSxvWShuKS9lXX1yZXR1cm4gbi5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtyZXR1cm5bdC9lLHVZKG4qZSldfSxufSkodCk7dmFyIG89MStuKigyKmktbiksYT1zWShvKS9pO2Z1bmN0aW9uIHModCxlKXt2YXIgbj1zWShvLTIqaSpvWShlKSkvaTtyZXR1cm5bbipvWSh0Kj1pKSxhLW4qdFkodCldfXJldHVybiBzLmludmVydD1mdW5jdGlvbih0LGUpe3ZhciBuPWEtZTtyZXR1cm5bUXEodCxacShuKSkvaSphWShuKSx1WSgoby0odCp0K24qbikqaSppKS8oMippKSldfSxzfWZ1bmN0aW9uIFlLKCl7cmV0dXJuIFdLKHFLKS5zY2FsZSgxNTUuNDI0KS5jZW50ZXIoWzAsMzMuNjQ0Ml0pfWZ1bmN0aW9uIFhLKCl7cmV0dXJuIFlLKCkucGFyYWxsZWxzKFsyOS41LDQ1LjVdKS5zY2FsZSgxMDcwKS50cmFuc2xhdGUoWzQ4MCwyNTBdKS5yb3RhdGUoWzk2LDBdKS5jZW50ZXIoWy0uNiwzOC43XSl9ZnVuY3Rpb24gJEsodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIGk9dFkoZSkscj10WShuKSxvPXQoaSpyKTtyZXR1cm5bbypyKm9ZKGUpLG8qb1kobildfX1mdW5jdGlvbiBLSyh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgaT1zWShlKmUrbipuKSxyPXQoaSksbz1vWShyKSxhPXRZKHIpO3JldHVybltRcShlKm8saSphKSx1WShpJiZuKm8vaSldfX12YXIgWks9JEsoKGZ1bmN0aW9uKHQpe3JldHVybiBzWSgyLygxK3QpKX0pKTtaSy5pbnZlcnQ9S0soKGZ1bmN0aW9uKHQpe3JldHVybiAyKnVZKHQvMil9KSk7dmFyIEpLPSRLKChmdW5jdGlvbih0KXtyZXR1cm4odD1jWSh0KSkmJnQvb1kodCl9KSk7ZnVuY3Rpb24gUUsodCxlKXtyZXR1cm5bdCxpWShsWSgocXErZSkvMikpXX1mdW5jdGlvbiB0Wih0KXt2YXIgZSxuLGkscj1qSyh0KSxvPXIuY2VudGVyLGE9ci5zY2FsZSxzPXIudHJhbnNsYXRlLGw9ci5jbGlwRXh0ZW50LGM9bnVsbDtmdW5jdGlvbiB1KCl7dmFyIG89V3EqYSgpLHM9cihGWChyLnJvdGF0ZSgpKS5pbnZlcnQoWzAsMF0pKTtyZXR1cm4gbChudWxsPT1jP1tbc1swXS1vLHNbMV0tb10sW3NbMF0rbyxzWzFdK29dXTp0PT09UUs/W1tNYXRoLm1heChzWzBdLW8sYyksZV0sW01hdGgubWluKHNbMF0rbyxuKSxpXV06W1tjLE1hdGgubWF4KHNbMV0tbyxlKV0sW24sTWF0aC5taW4oc1sxXStvLGkpXV0pfXJldHVybiByLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhKHQpLHUoKSk6YSgpfSxyLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocyh0KSx1KCkpOnMoKX0sci5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG8odCksdSgpKTpvKCl9LHIuY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9jPWU9bj1pPW51bGw6KGM9K3RbMF1bMF0sZT0rdFswXVsxXSxuPSt0WzFdWzBdLGk9K3RbMV1bMV0pLHUoKSk6bnVsbD09Yz9udWxsOltbYyxlXSxbbixpXV19LHUoKX1mdW5jdGlvbiBlWih0KXtyZXR1cm4gbFkoKHFxK3QpLzIpfWZ1bmN0aW9uIG5aKHQsZSl7dmFyIG49dFkodCksaT10PT09ZT9vWSh0KTppWShuL3RZKGUpKS9pWShlWihlKS9lWih0KSkscj1uKnJZKGVaKHQpLGkpL2k7aWYoIWkpcmV0dXJuIFFLO2Z1bmN0aW9uIG8odCxlKXtyPjA/ZTwtcXErR3EmJihlPS1xcStHcSk6ZT5xcS1HcSYmKGU9cXEtR3EpO3ZhciBuPXIvclkoZVooZSksaSk7cmV0dXJuW24qb1koaSp0KSxyLW4qdFkoaSp0KV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ci1lLG89YVkoaSkqc1kodCp0K24qbik7cmV0dXJuW1FxKHQsWnEobikpL2kqYVkobiksMipKcShyWShyL28sMS9pKSktcXFdfSxvfWZ1bmN0aW9uIGlaKHQsZSl7cmV0dXJuW3QsZV19ZnVuY3Rpb24gcloodCxlKXt2YXIgbj10WSh0KSxpPXQ9PT1lP29ZKHQpOihuLXRZKGUpKS8oZS10KSxyPW4vaSt0O2lmKFpxKGkpPEdxKXJldHVybiBpWjtmdW5jdGlvbiBvKHQsZSl7dmFyIG49ci1lLG89aSp0O3JldHVybltuKm9ZKG8pLHItbip0WShvKV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ci1lO3JldHVybltRcSh0LFpxKG4pKS9pKmFZKG4pLHItYVkoaSkqc1kodCp0K24qbildfSxvfWZ1bmN0aW9uIG9aKHQsZSl7dmFyIG49dFkoZSksaT10WSh0KSpuO3JldHVybltuKm9ZKHQpL2ksb1koZSkvaV19ZnVuY3Rpb24gYVoodCxlLG4saSl7cmV0dXJuIDE9PT10JiYxPT09ZSYmMD09PW4mJjA9PT1pP1IkOklLKHtwb2ludDpmdW5jdGlvbihyLG8pe3RoaXMuc3RyZWFtLnBvaW50KHIqdCtuLG8qZStpKX19KX1mdW5jdGlvbiBzWih0LGUpe3ZhciBuPWUqZSxpPW4qbjtyZXR1cm5bdCooLjg3MDctLjEzMTk3OSpuK2kqKGkqKC4wMDM5NzEqbi0uMDAxNTI5KmkpLS4wMTM3OTEpKSxlKigxLjAwNzIyNituKiguMDE1MDg1K2kqKC4wMjg4NzQqbi0uMDQ0NDc1LS4wMDU5MTYqaSkpKV19ZnVuY3Rpb24gbFoodCxlKXtyZXR1cm5bdFkoZSkqb1kodCksb1koZSldfWZ1bmN0aW9uIGNaKHQsZSl7dmFyIG49dFkoZSksaT0xK3RZKHQpKm47cmV0dXJuW24qb1kodCkvaSxvWShlKS9pXX1mdW5jdGlvbiB1Wih0LGUpe3JldHVybltpWShsWSgocXErZSkvMikpLC10XX1mdW5jdGlvbiBoWih0LGUpe3JldHVybiB0LnBhcmVudD09PWUucGFyZW50PzE6Mn1mdW5jdGlvbiBkWih0LGUpe3JldHVybiB0K2UueH1mdW5jdGlvbiBwWih0LGUpe3JldHVybiBNYXRoLm1heCh0LGUueSl9ZnVuY3Rpb24gZloodCl7dmFyIGU9MCxuPXQuY2hpbGRyZW4saT1uJiZuLmxlbmd0aDtpZihpKWZvcig7LS1pPj0wOyllKz1uW2ldLnZhbHVlO2Vsc2UgZT0xO3QudmFsdWU9ZX1mdW5jdGlvbiBtWih0LGUpe3ZhciBuLGkscixvLGEscz1uZXcgdloodCksbD0rdC52YWx1ZSYmKHMudmFsdWU9dC52YWx1ZSksYz1bc107Zm9yKG51bGw9PWUmJihlPWdaKTtuPWMucG9wKCk7KWlmKGwmJihuLnZhbHVlPStuLmRhdGEudmFsdWUpLChyPWUobi5kYXRhKSkmJihhPXIubGVuZ3RoKSlmb3Iobi5jaGlsZHJlbj1uZXcgQXJyYXkoYSksbz1hLTE7bz49MDstLW8pYy5wdXNoKGk9bi5jaGlsZHJlbltvXT1uZXcgdloocltvXSkpLGkucGFyZW50PW4saS5kZXB0aD1uLmRlcHRoKzE7cmV0dXJuIHMuZWFjaEJlZm9yZSh5Wil9ZnVuY3Rpb24gZ1oodCl7cmV0dXJuIHQuY2hpbGRyZW59ZnVuY3Rpb24gX1oodCl7dC5kYXRhPXQuZGF0YS5kYXRhfWZ1bmN0aW9uIHlaKHQpe3ZhciBlPTA7ZG97dC5oZWlnaHQ9ZX13aGlsZSgodD10LnBhcmVudCkmJnQuaGVpZ2h0PCsrZSl9ZnVuY3Rpb24gdloodCl7dGhpcy5kYXRhPXQsdGhpcy5kZXB0aD10aGlzLmhlaWdodD0wLHRoaXMucGFyZW50PW51bGx9SksuaW52ZXJ0PUtLKChmdW5jdGlvbih0KXtyZXR1cm4gdH0pKSxRSy5pbnZlcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm5bdCwyKkpxKG5ZKGUpKS1xcV19LGlaLmludmVydD1pWixvWi5pbnZlcnQ9S0soSnEpLHNaLmludmVydD1mdW5jdGlvbih0LGUpe3ZhciBuLGk9ZSxyPTI1O2Rve3ZhciBvPWkqaSxhPW8qbztpLT1uPShpKigxLjAwNzIyNitvKiguMDE1MDg1K2EqKC4wMjg4NzQqby0uMDQ0NDc1LS4wMDU5MTYqYSkpKS1lKS8oMS4wMDcyMjYrbyooLjA0NTI1NSthKiguMjU5ODY2Km8tLjMxMTMyNS0uMDA1OTE2KjExKmEpKSl9d2hpbGUoWnEobik+R3EmJi0tcj4wKTtyZXR1cm5bdC8oLjg3MDcrKG89aSppKSoobyoobypvKm8qKC4wMDM5NzEtLjAwMTUyOSpvKS0uMDEzNzkxKS0uMTMxOTc5KSksaV19LGxaLmludmVydD1LSyh1WSksY1ouaW52ZXJ0PUtLKChmdW5jdGlvbih0KXtyZXR1cm4gMipKcSh0KX0pKSx1Wi5pbnZlcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm5bLWUsMipKcShuWSh0KSktcXFdfSx2Wi5wcm90b3R5cGU9bVoucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp2Wixjb3VudDpmdW5jdGlvbiBiWigpe3JldHVybiB0aGlzLmVhY2hBZnRlcihmWil9LGVhY2g6ZnVuY3Rpb24geFoodCl7dmFyIGUsbixpLHIsbz10aGlzLGE9W29dO2Rve2ZvcihlPWEucmV2ZXJzZSgpLGE9W107bz1lLnBvcCgpOylpZih0KG8pLG49by5jaGlsZHJlbilmb3IoaT0wLHI9bi5sZW5ndGg7aTxyOysraSlhLnB1c2gobltpXSl9d2hpbGUoYS5sZW5ndGgpO3JldHVybiB0aGlzfSxlYWNoQWZ0ZXI6ZnVuY3Rpb24gd1oodCl7Zm9yKHZhciBlLG4saSxyPXRoaXMsbz1bcl0sYT1bXTtyPW8ucG9wKCk7KWlmKGEucHVzaChyKSxlPXIuY2hpbGRyZW4pZm9yKG49MCxpPWUubGVuZ3RoO248aTsrK24pby5wdXNoKGVbbl0pO2Zvcig7cj1hLnBvcCgpOyl0KHIpO3JldHVybiB0aGlzfSxlYWNoQmVmb3JlOmZ1bmN0aW9uIFNaKHQpe2Zvcih2YXIgZSxuLGk9dGhpcyxyPVtpXTtpPXIucG9wKCk7KWlmKHQoaSksZT1pLmNoaWxkcmVuKWZvcihuPWUubGVuZ3RoLTE7bj49MDstLW4pci5wdXNoKGVbbl0pO3JldHVybiB0aGlzfSxzdW06ZnVuY3Rpb24gTVoodCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKChmdW5jdGlvbihlKXtmb3IodmFyIG49K3QoZS5kYXRhKXx8MCxpPWUuY2hpbGRyZW4scj1pJiZpLmxlbmd0aDstLXI+PTA7KW4rPWlbcl0udmFsdWU7ZS52YWx1ZT1ufSkpfSxzb3J0OmZ1bmN0aW9uIEVaKHQpe3JldHVybiB0aGlzLmVhY2hCZWZvcmUoKGZ1bmN0aW9uKGUpe2UuY2hpbGRyZW4mJmUuY2hpbGRyZW4uc29ydCh0KX0pKX0scGF0aDpmdW5jdGlvbiBUWih0KXtmb3IodmFyIGU9dGhpcyxuPShmdW5jdGlvbiBpKHQsZSl7aWYodD09PWUpcmV0dXJuIHQ7dmFyIG49dC5hbmNlc3RvcnMoKSxpPWUuYW5jZXN0b3JzKCkscj1udWxsO2Zvcih0PW4ucG9wKCksZT1pLnBvcCgpO3Q9PT1lOylyPXQsdD1uLnBvcCgpLGU9aS5wb3AoKTtyZXR1cm4gcn0pKGUsdCkscj1bZV07ZSE9PW47KXIucHVzaChlPWUucGFyZW50KTtmb3IodmFyIG89ci5sZW5ndGg7dCE9PW47KXIuc3BsaWNlKG8sMCx0KSx0PXQucGFyZW50O3JldHVybiByfSxhbmNlc3RvcnM6ZnVuY3Rpb24gQ1ooKXtmb3IodmFyIHQ9dGhpcyxlPVt0XTt0PXQucGFyZW50OyllLnB1c2godCk7cmV0dXJuIGV9LGRlc2NlbmRhbnRzOmZ1bmN0aW9uIEFaKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oZSl7dC5wdXNoKGUpfSkpLHR9LGxlYXZlczpmdW5jdGlvbiBrWigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2hCZWZvcmUoKGZ1bmN0aW9uKGUpe2UuY2hpbGRyZW58fHQucHVzaChlKX0pKSx0fSxsaW5rczpmdW5jdGlvbiBMWigpe3ZhciB0PXRoaXMsZT1bXTtyZXR1cm4gdC5lYWNoKChmdW5jdGlvbihuKXtuIT09dCYmZS5wdXNoKHtzb3VyY2U6bi5wYXJlbnQsdGFyZ2V0Om59KX0pKSxlfSxjb3B5OmZ1bmN0aW9uIFBaKCl7cmV0dXJuIG1aKHRoaXMpLmVhY2hCZWZvcmUoX1opfX07dmFyIE5aPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBJWih0KXtmb3IodmFyIGUsbixpPTAscj0odD0oZnVuY3Rpb24gbyh0KXtmb3IodmFyIGUsbixpPXQubGVuZ3RoO2k7KW49TWF0aC5yYW5kb20oKSppLS18MCxlPXRbaV0sdFtpXT10W25dLHRbbl09ZTtyZXR1cm4gdH0pKE5aLmNhbGwodCkpKS5sZW5ndGgsYT1bXTtpPHI7KWU9dFtpXSxuJiZ6WihuLGUpPysraToobj1CWihhPVJaKGEsZSkpLGk9MCk7cmV0dXJuIG59ZnVuY3Rpb24gUloodCxlKXt2YXIgbixpO2lmKERaKGUsdCkpcmV0dXJuW2VdO2ZvcihuPTA7bjx0Lmxlbmd0aDsrK24paWYoT1ooZSx0W25dKSYmRFooSFoodFtuXSxlKSx0KSlyZXR1cm5bdFtuXSxlXTtmb3Iobj0wO248dC5sZW5ndGgtMTsrK24pZm9yKGk9bisxO2k8dC5sZW5ndGg7KytpKWlmKE9aKEhaKHRbbl0sdFtpXSksZSkmJk9aKEhaKHRbbl0sZSksdFtpXSkmJk9aKEhaKHRbaV0sZSksdFtuXSkmJkRaKEZaKHRbbl0sdFtpXSxlKSx0KSlyZXR1cm5bdFtuXSx0W2ldLGVdO3Rocm93IG5ldyBFcnJvcn1mdW5jdGlvbiBPWih0LGUpe3ZhciBuPXQuci1lLnIsaT1lLngtdC54LHI9ZS55LXQueTtyZXR1cm4gbjwwfHxuKm48aSppK3Iqcn1mdW5jdGlvbiB6Wih0LGUpe3ZhciBuPXQuci1lLnIrMWUtNixpPWUueC10Lngscj1lLnktdC55O3JldHVybiBuPjAmJm4qbj5pKmkrcipyfWZ1bmN0aW9uIERaKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDsrK24paWYoIXpaKHQsZVtuXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gQloodCl7c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDE6cmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJue3g6dC54LHk6dC55LHI6dC5yfX0pKHRbMF0pO2Nhc2UgMjpyZXR1cm4gSFoodFswXSx0WzFdKTtjYXNlIDM6cmV0dXJuIEZaKHRbMF0sdFsxXSx0WzJdKX19ZnVuY3Rpb24gSFoodCxlKXt2YXIgbj10LngsaT10Lnkscj10LnIsbz1lLngsYT1lLnkscz1lLnIsbD1vLW4sYz1hLWksdT1zLXIsaD1NYXRoLnNxcnQobCpsK2MqYyk7cmV0dXJue3g6KG4rbytsL2gqdSkvMix5OihpK2ErYy9oKnUpLzIscjooaCtyK3MpLzJ9fWZ1bmN0aW9uIEZaKHQsZSxuKXt2YXIgaT10Lngscj10Lnksbz10LnIsYT1lLngscz1lLnksbD1lLnIsYz1uLngsdT1uLnksaD1uLnIsZD1pLWEscD1pLWMsZj1yLXMsbT1yLXUsZz1sLW8sXz1oLW8seT1pKmkrcipyLW8qbyx2PXktYSphLXMqcytsKmwsYj15LWMqYy11KnUraCpoLHg9cCpmLWQqbSx3PShmKmItbSp2KS8oMip4KS1pLFM9KG0qZy1mKl8pL3gsTT0ocCp2LWQqYikvKDIqeCktcixFPShkKl8tcCpnKS94LFQ9UypTK0UqRS0xLEM9Mioobyt3KlMrTSpFKSxBPXcqdytNKk0tbypvLGs9LShUPyhDK01hdGguc3FydChDKkMtNCpUKkEpKS8oMipUKTpBL0MpO3JldHVybnt4OmkrdytTKmsseTpyK00rRSprLHI6a319ZnVuY3Rpb24gVloodCxlLG4pe3ZhciBpPXQueCxyPXQueSxvPWUucituLnIsYT10LnIrbi5yLHM9ZS54LWksbD1lLnktcixjPXMqcytsKmw7aWYoYyl7dmFyIHU9LjUrKChhKj1hKS0obyo9bykpLygyKmMpLGg9TWF0aC5zcXJ0KE1hdGgubWF4KDAsMipvKihhK2MpLShhLT1jKSphLW8qbykpLygyKmMpO24ueD1pK3UqcytoKmwsbi55PXIrdSpsLWgqc31lbHNlIG4ueD1pK2Esbi55PXJ9ZnVuY3Rpb24gVVoodCxlKXt2YXIgbj1lLngtdC54LGk9ZS55LXQueSxyPXQucitlLnI7cmV0dXJuIHIqci0xZS02Pm4qbitpKml9ZnVuY3Rpb24galoodCl7dmFyIGU9dC5fLG49dC5uZXh0Ll8saT1lLnIrbi5yLHI9KGUueCpuLnIrbi54KmUucikvaSxvPShlLnkqbi5yK24ueSplLnIpL2k7cmV0dXJuIHIqcitvKm99ZnVuY3Rpb24gR1oodCl7dGhpcy5fPXQsdGhpcy5uZXh0PW51bGwsdGhpcy5wcmV2aW91cz1udWxsfWZ1bmN0aW9uIFdaKHQpe2lmKCEocj10Lmxlbmd0aCkpcmV0dXJuIDA7dmFyIGUsbixpLHIsbyxhLHMsbCxjLHUsaDtpZigoZT10WzBdKS54PTAsZS55PTAsIShyPjEpKXJldHVybiBlLnI7aWYoZS54PS0obj10WzFdKS5yLG4ueD1lLnIsbi55PTAsIShyPjIpKXJldHVybiBlLnIrbi5yO1ZaKG4sZSxpPXRbMl0pLGU9bmV3IEdaKGUpLG49bmV3IEdaKG4pLGk9bmV3IEdaKGkpLGUubmV4dD1pLnByZXZpb3VzPW4sbi5uZXh0PWUucHJldmlvdXM9aSxpLm5leHQ9bi5wcmV2aW91cz1lO3Q6Zm9yKHM9MztzPHI7KytzKXtWWihlLl8sbi5fLGk9dFtzXSksaT1uZXcgR1ooaSksbD1uLm5leHQsYz1lLnByZXZpb3VzLHU9bi5fLnIsaD1lLl8ucjtkb3tpZih1PD1oKXtpZihVWihsLl8saS5fKSl7ZS5uZXh0PW49bCxuLnByZXZpb3VzPWUsLS1zO2NvbnRpbnVlIHR9dSs9bC5fLnIsbD1sLm5leHR9ZWxzZXtpZihVWihjLl8saS5fKSl7KGU9YykubmV4dD1uLG4ucHJldmlvdXM9ZSwtLXM7Y29udGludWUgdH1oKz1jLl8ucixjPWMucHJldmlvdXN9fXdoaWxlKGwhPT1jLm5leHQpO2ZvcihpLnByZXZpb3VzPWUsaS5uZXh0PW4sZS5uZXh0PW4ucHJldmlvdXM9bj1pLG89alooZSk7KGk9aS5uZXh0KSE9PW47KShhPWpaKGkpKTxvJiYoZT1pLG89YSk7bj1lLm5leHR9Zm9yKGU9W24uX10saT1uOyhpPWkubmV4dCkhPT1uOyllLnB1c2goaS5fKTtmb3IoaT1JWihlKSxzPTA7czxyOysrcykoZT10W3NdKS54LT1pLngsZS55LT1pLnk7cmV0dXJuIGkucn1mdW5jdGlvbiBxWih0KXtyZXR1cm4gbnVsbD09dD9udWxsOllaKHQpfWZ1bmN0aW9uIFlaKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdH1mdW5jdGlvbiBYWigpe3JldHVybiAwfWZ1bmN0aW9uICRaKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBLWih0KXtyZXR1cm4gTWF0aC5zcXJ0KHQudmFsdWUpfWZ1bmN0aW9uIFpaKHQpe3JldHVybiBmdW5jdGlvbihlKXtlLmNoaWxkcmVufHwoZS5yPU1hdGgubWF4KDAsK3QoZSl8fDApKX19ZnVuY3Rpb24gSloodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7aWYoaT1uLmNoaWxkcmVuKXt2YXIgaSxyLG8sYT1pLmxlbmd0aCxzPXQobikqZXx8MDtpZihzKWZvcihyPTA7cjxhOysrcilpW3JdLnIrPXM7aWYobz1XWihpKSxzKWZvcihyPTA7cjxhOysrcilpW3JdLnItPXM7bi5yPW8rc319fWZ1bmN0aW9uIFFaKHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj1lLnBhcmVudDtlLnIqPXQsbiYmKGUueD1uLngrdCplLngsZS55PW4ueSt0KmUueSl9fWZ1bmN0aW9uIHRKKHQpe3QueDA9TWF0aC5yb3VuZCh0LngwKSx0LnkwPU1hdGgucm91bmQodC55MCksdC54MT1NYXRoLnJvdW5kKHQueDEpLHQueTE9TWF0aC5yb3VuZCh0LnkxKX1mdW5jdGlvbiBlSih0LGUsbixpLHIpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4scz0tMSxsPWEubGVuZ3RoLGM9dC52YWx1ZSYmKGktZSkvdC52YWx1ZTsrK3M8bDspKG89YVtzXSkueTA9bixvLnkxPXIsby54MD1lLG8ueDE9ZSs9by52YWx1ZSpjfXZhciBuSj17ZGVwdGg6LTF9LGlKPXt9O2Z1bmN0aW9uIHJKKHQpe3JldHVybiB0LmlkfWZ1bmN0aW9uIG9KKHQpe3JldHVybiB0LnBhcmVudElkfWZ1bmN0aW9uIGFKKHQsZSl7cmV0dXJuIHQucGFyZW50PT09ZS5wYXJlbnQ/MToyfWZ1bmN0aW9uIHNKKHQpe3ZhciBlPXQuY2hpbGRyZW47cmV0dXJuIGU/ZVswXTp0LnR9ZnVuY3Rpb24gbEoodCl7dmFyIGU9dC5jaGlsZHJlbjtyZXR1cm4gZT9lW2UubGVuZ3RoLTFdOnQudH1mdW5jdGlvbiBjSih0LGUsbil7dmFyIGk9bi8oZS5pLXQuaSk7ZS5jLT1pLGUucys9bix0LmMrPWksZS56Kz1uLGUubSs9bn1mdW5jdGlvbiB1Sih0LGUsbil7cmV0dXJuIHQuYS5wYXJlbnQ9PT1lLnBhcmVudD90LmE6bn1mdW5jdGlvbiBoSih0LGUpe3RoaXMuXz10LHRoaXMucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbj1udWxsLHRoaXMuQT1udWxsLHRoaXMuYT10aGlzLHRoaXMuej0wLHRoaXMubT0wLHRoaXMuYz0wLHRoaXMucz0wLHRoaXMudD1udWxsLHRoaXMuaT1lfWZ1bmN0aW9uIGRKKHQsZSxuLGkscil7Zm9yKHZhciBvLGE9dC5jaGlsZHJlbixzPS0xLGw9YS5sZW5ndGgsYz10LnZhbHVlJiYoci1uKS90LnZhbHVlOysrczxsOykobz1hW3NdKS54MD1lLG8ueDE9aSxvLnkwPW4sby55MT1uKz1vLnZhbHVlKmN9aEoucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodloucHJvdG90eXBlKTt2YXIgcEo9KDErTWF0aC5zcXJ0KDUpKS8yO2Z1bmN0aW9uIGZKKHQsZSxuLGkscixvKXtmb3IodmFyIGEscyxsLGMsdSxoLGQscCxmLG0sZyxfPVtdLHk9ZS5jaGlsZHJlbix2PTAsYj0wLHg9eS5sZW5ndGgsdz1lLnZhbHVlO3Y8eDspe2w9ci1uLGM9by1pO2Rve3U9eVtiKytdLnZhbHVlfXdoaWxlKCF1JiZiPHgpO2ZvcihoPWQ9dSxnPXUqdSoobT1NYXRoLm1heChjL2wsbC9jKS8odyp0KSksZj1NYXRoLm1heChkL2csZy9oKTtiPHg7KytiKXtpZih1Kz1zPXlbYl0udmFsdWUsczxoJiYoaD1zKSxzPmQmJihkPXMpLGc9dSp1Km0sKHA9TWF0aC5tYXgoZC9nLGcvaCkpPmYpe3UtPXM7YnJlYWt9Zj1wfV8ucHVzaChhPXt2YWx1ZTp1LGRpY2U6bDxjLGNoaWxkcmVuOnkuc2xpY2UodixiKX0pLGEuZGljZT9lSihhLG4saSxyLHc/aSs9Yyp1L3c6byk6ZEooYSxuLGksdz9uKz1sKnUvdzpyLG8pLHctPXUsdj1ifXJldHVybiBffXZhciBtSj0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQsbixpLHIsbyl7ZkooZSx0LG4saSxyLG8pfXJldHVybiBuLnJhdGlvPWZ1bmN0aW9uKGUpe3JldHVybiB0KChlPStlKT4xP2U6MSl9LG59KShwSiksZ0o9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0LG4saSxyLG8pe2lmKChhPXQuX3NxdWFyaWZ5KSYmYS5yYXRpbz09PWUpZm9yKHZhciBhLHMsbCxjLHUsaD0tMSxkPWEubGVuZ3RoLHA9dC52YWx1ZTsrK2g8ZDspe2ZvcihsPShzPWFbaF0pLmNoaWxkcmVuLGM9cy52YWx1ZT0wLHU9bC5sZW5ndGg7Yzx1OysrYylzLnZhbHVlKz1sW2NdLnZhbHVlO3MuZGljZT9lSihzLG4saSxyLGkrPShvLWkpKnMudmFsdWUvcCk6ZEoocyxuLGksbis9KHItbikqcy52YWx1ZS9wLG8pLHAtPXMudmFsdWV9ZWxzZSB0Ll9zcXVhcmlmeT1hPWZKKGUsdCxuLGkscixvKSxhLnJhdGlvPWV9cmV0dXJuIG4ucmF0aW89ZnVuY3Rpb24oZSl7cmV0dXJuIHQoKGU9K2UpPjE/ZToxKX0sbn0pKHBKKTtmdW5jdGlvbiBfSih0LGUsbil7dC5wcm90b3R5cGU9ZS5wcm90b3R5cGU9bixuLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24geUoodCxlKXt2YXIgbj1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIGkgaW4gZSluW2ldPWVbaV07cmV0dXJuIG59ZnVuY3Rpb24gdkooKXt9dmFyIGJKPS43LHhKPTEvYkosd0o9IlxccyooWystXT9cXGQrKVxccyoiLFNKPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLE1KPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixFSj0vXiMoWzAtOWEtZl17Myw4fSkkLyxUSj1uZXcgUmVnRXhwKCJecmdiXFwoIitbd0osd0osd0pdKyJcXCkkIiksQ0o9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW01KLE1KLE1KXSsiXFwpJCIpLEFKPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbd0osd0osd0osU0pdKyJcXCkkIiksa0o9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tNSixNSixNSixTSl0rIlxcKSQiKSxMSj1uZXcgUmVnRXhwKCJeaHNsXFwoIitbU0osTUosTUpdKyJcXCkkIiksUEo9bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1tTSixNSixNSixTSl0rIlxcKSQiKSxOSj17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtmdW5jdGlvbiBJSigpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpfWZ1bmN0aW9uIFJKKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCl9ZnVuY3Rpb24gT0oodCl7dmFyIGUsbjtyZXR1cm4gdD0odCsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKGU9RUouZXhlYyh0KSk/KG49ZVsxXS5sZW5ndGgsZT1wYXJzZUludChlWzFdLDE2KSw2PT09bj96SihlKTozPT09bj9uZXcgRkooZT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgxNSZlKTw8NHwxNSZlLDEpOjg9PT1uP0RKKGU+PjI0JjI1NSxlPj4xNiYyNTUsZT4+OCYyNTUsKDI1NSZlKS8yNTUpOjQ9PT1uP0RKKGU+PjEyJjE1fGU+PjgmMjQwLGU+PjgmMTV8ZT4+NCYyNDAsZT4+NCYxNXwyNDAmZSwoKDE1JmUpPDw0fDE1JmUpLzI1NSk6bnVsbCk6KGU9VEouZXhlYyh0KSk/bmV3IEZKKGVbMV0sZVsyXSxlWzNdLDEpOihlPUNKLmV4ZWModCkpP25ldyBGSigyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCwxKTooZT1BSi5leGVjKHQpKT9ESihlWzFdLGVbMl0sZVszXSxlWzRdKTooZT1rSi5leGVjKHQpKT9ESigyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCxlWzRdKTooZT1MSi5leGVjKHQpKT9HSihlWzFdLGVbMl0vMTAwLGVbM10vMTAwLDEpOihlPVBKLmV4ZWModCkpP0dKKGVbMV0sZVsyXS8xMDAsZVszXS8xMDAsZVs0XSk6TkouaGFzT3duUHJvcGVydHkodCk/ekooTkpbdF0pOiJ0cmFuc3BhcmVudCI9PT10P25ldyBGSihOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIHpKKHQpe3JldHVybiBuZXcgRkoodD4+MTYmMjU1LHQ+PjgmMjU1LDI1NSZ0LDEpfWZ1bmN0aW9uIERKKHQsZSxuLGkpe3JldHVybiBpPD0wJiYodD1lPW49TmFOKSxuZXcgRkoodCxlLG4saSl9ZnVuY3Rpb24gQkoodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiB2Snx8KHQ9T0oodCkpLHQ/bmV3IEZKKCh0PXQucmdiKCkpLnIsdC5nLHQuYix0Lm9wYWNpdHkpOm5ldyBGSn1mdW5jdGlvbiBISih0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/QkoodCk6bmV3IEZKKHQsZSxuLG51bGw9PWk/MTppKX1mdW5jdGlvbiBGSih0LGUsbixpKXt0aGlzLnI9K3QsdGhpcy5nPStlLHRoaXMuYj0rbix0aGlzLm9wYWNpdHk9K2l9ZnVuY3Rpb24gVkooKXtyZXR1cm4iIyIrakoodGhpcy5yKStqSih0aGlzLmcpK2pKKHRoaXMuYil9ZnVuY3Rpb24gVUooKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX1mdW5jdGlvbiBqSih0KXtyZXR1cm4oKHQ9TWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0KXx8MCkpKTwxNj8iMCI6IiIpK3QudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIEdKKHQsZSxuLGkpe3JldHVybiBpPD0wP3Q9ZT1uPU5hTjpuPD0wfHxuPj0xP3Q9ZT1OYU46ZTw9MCYmKHQ9TmFOKSxuZXcgWUoodCxlLG4saSl9ZnVuY3Rpb24gV0oodCl7aWYodCBpbnN0YW5jZW9mIFlKKXJldHVybiBuZXcgWUoodC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2Ygdkp8fCh0PU9KKHQpKSwhdClyZXR1cm4gbmV3IFlKO2lmKHQgaW5zdGFuY2VvZiBZSilyZXR1cm4gdDt2YXIgZT0odD10LnJnYigpKS5yLzI1NSxuPXQuZy8yNTUsaT10LmIvMjU1LHI9TWF0aC5taW4oZSxuLGkpLG89TWF0aC5tYXgoZSxuLGkpLGE9TmFOLHM9by1yLGw9KG8rcikvMjtyZXR1cm4gcz8oYT1lPT09bz8obi1pKS9zKzYqKG48aSk6bj09PW8/KGktZSkvcysyOihlLW4pL3MrNCxzLz1sPC41P28rcjoyLW8tcixhKj02MCk6cz1sPjAmJmw8MT8wOmEsbmV3IFlKKGEscyxsLHQub3BhY2l0eSl9ZnVuY3Rpb24gcUoodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP1dKKHQpOm5ldyBZSih0LGUsbixudWxsPT1pPzE6aSl9ZnVuY3Rpb24gWUoodCxlLG4saSl7dGhpcy5oPSt0LHRoaXMucz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIFhKKHQsZSxuKXtyZXR1cm4gMjU1Kih0PDYwP2UrKG4tZSkqdC82MDp0PDE4MD9uOnQ8MjQwP2UrKG4tZSkqKDI0MC10KS82MDplKX1fSih2SixPSix7Y29weTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3Rvcix0aGlzLHQpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCl9LGhleDpJSixmb3JtYXRIZXg6SUosZm9ybWF0SHNsOmZ1bmN0aW9uICRKKCl7cmV0dXJuIFdKKHRoaXMpLmZvcm1hdEhzbCgpfSxmb3JtYXRSZ2I6UkosdG9TdHJpbmc6Ukp9KSxfSihGSixISix5Sih2Six7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD94SjpNYXRoLnBvdyh4Six0KSxuZXcgRkoodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/Yko6TWF0aC5wb3coYkosdCksbmV3IEZKKHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybi0uNTw9dGhpcy5yJiZ0aGlzLnI8MjU1LjUmJi0uNTw9dGhpcy5nJiZ0aGlzLmc8MjU1LjUmJi0uNTw9dGhpcy5iJiZ0aGlzLmI8MjU1LjUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxoZXg6VkosZm9ybWF0SGV4OlZKLGZvcm1hdFJnYjpVSix0b1N0cmluZzpVSn0pKSxfSihZSixxSix5Sih2Six7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD94SjpNYXRoLnBvdyh4Six0KSxuZXcgWUoodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9iSjpNYXRoLnBvdyhiSix0KSxuZXcgWUoodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmglMzYwKzM2MCoodGhpcy5oPDApLGU9aXNOYU4odCl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsbj10aGlzLmwsaT1uKyhuPC41P246MS1uKSplLHI9MipuLWk7cmV0dXJuIG5ldyBGSihYSih0Pj0yNDA/dC0yNDA6dCsxMjAscixpKSxYSih0LHIsaSksWEoodDwxMjA/dCsyNDA6dC0xMjAscixpKSx0aGlzLm9wYWNpdHkpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybigwPD10aGlzLnMmJnRoaXMuczw9MXx8aXNOYU4odGhpcy5zKSkmJjA8PXRoaXMubCYmdGhpcy5sPD0xJiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sZm9ybWF0SHNsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcGFjaXR5O3JldHVybigxPT09KHQ9aXNOYU4odCk/MTpNYXRoLm1heCgwLE1hdGgubWluKDEsdCkpKT8iaHNsKCI6ImhzbGEoIikrKHRoaXMuaHx8MCkrIiwgIisxMDAqKHRoaXMuc3x8MCkrIiUsICIrMTAwKih0aGlzLmx8fDApKyIlIisoMT09PXQ/IikiOiIsICIrdCsiKSIpfX0pKTt2YXIgS0o9TWF0aC5QSS8xODAsWko9MTgwL01hdGguUEksSko9Ljk2NDIyLFFKPS44MjUyMSx0UT00LzI5LGVRPTYvMjksblE9MyplUSplUTtmdW5jdGlvbiBpUSh0KXtpZih0IGluc3RhbmNlb2Ygb1EpcmV0dXJuIG5ldyBvUSh0LmwsdC5hLHQuYix0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiBkUSlyZXR1cm4gcFEodCk7dCBpbnN0YW5jZW9mIEZKfHwodD1CSih0KSk7dmFyIGUsbixpPWNRKHQucikscj1jUSh0LmcpLG89Y1EodC5iKSxhPWFRKCguMjIyNTA0NSppKy43MTY4Nzg2KnIrLjA2MDYxNjkqbykvMSk7cmV0dXJuIGk9PT1yJiZyPT09bz9lPW49YTooZT1hUSgoLjQzNjA3NDcqaSsuMzg1MDY0OSpyKy4xNDMwODA0Km8pL0pKKSxuPWFRKCguMDEzOTMyMippKy4wOTcxMDQ1KnIrLjcxNDE3MzMqbykvUUopKSxuZXcgb1EoMTE2KmEtMTYsNTAwKihlLWEpLDIwMCooYS1uKSx0Lm9wYWNpdHkpfWZ1bmN0aW9uIHJRKHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9pUSh0KTpuZXcgb1EodCxlLG4sbnVsbD09aT8xOmkpfWZ1bmN0aW9uIG9RKHQsZSxuLGkpe3RoaXMubD0rdCx0aGlzLmE9K2UsdGhpcy5iPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiBhUSh0KXtyZXR1cm4gdD4uMDA4ODU2NDUxNjc5MDM1NjMxP01hdGgucG93KHQsMS8zKTp0L25RK3RRfWZ1bmN0aW9uIHNRKHQpe3JldHVybiB0PmVRP3QqdCp0Om5RKih0LXRRKX1mdW5jdGlvbiBsUSh0KXtyZXR1cm4gMjU1Kih0PD0uMDAzMTMwOD8xMi45Mip0OjEuMDU1Kk1hdGgucG93KHQsMS8yLjQpLS4wNTUpfWZ1bmN0aW9uIGNRKHQpe3JldHVybih0Lz0yNTUpPD0uMDQwNDU/dC8xMi45MjpNYXRoLnBvdygodCsuMDU1KS8xLjA1NSwyLjQpfWZ1bmN0aW9uIHVRKHQpe2lmKHQgaW5zdGFuY2VvZiBkUSlyZXR1cm4gbmV3IGRRKHQuaCx0LmMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIG9RfHwodD1pUSh0KSksMD09PXQuYSYmMD09PXQuYilyZXR1cm4gbmV3IGRRKE5hTiwwPHQubCYmdC5sPDEwMD8wOk5hTix0LmwsdC5vcGFjaXR5KTt2YXIgZT1NYXRoLmF0YW4yKHQuYix0LmEpKlpKO3JldHVybiBuZXcgZFEoZTwwP2UrMzYwOmUsTWF0aC5zcXJ0KHQuYSp0LmErdC5iKnQuYiksdC5sLHQub3BhY2l0eSl9ZnVuY3Rpb24gaFEodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3VRKHQpOm5ldyBkUSh0LGUsbixudWxsPT1pPzE6aSl9ZnVuY3Rpb24gZFEodCxlLG4saSl7dGhpcy5oPSt0LHRoaXMuYz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIHBRKHQpe2lmKGlzTmFOKHQuaCkpcmV0dXJuIG5ldyBvUSh0LmwsMCwwLHQub3BhY2l0eSk7dmFyIGU9dC5oKktKO3JldHVybiBuZXcgb1EodC5sLE1hdGguY29zKGUpKnQuYyxNYXRoLnNpbihlKSp0LmMsdC5vcGFjaXR5KX1fSihvUSxyUSx5Sih2Six7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBvUSh0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IG9RKHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9KHRoaXMubCsxNikvMTE2LGU9aXNOYU4odGhpcy5hKT90OnQrdGhpcy5hLzUwMCxuPWlzTmFOKHRoaXMuYik/dDp0LXRoaXMuYi8yMDA7cmV0dXJuIG5ldyBGSihsUSgzLjEzMzg1NjEqKGU9Skoqc1EoZSkpLTEuNjE2ODY2NyoodD0xKnNRKHQpKS0uNDkwNjE0Nioobj1RSipzUShuKSkpLGxRKC0uOTc4NzY4NCplKzEuOTE2MTQxNSp0Ky4wMzM0NTQqbiksbFEoLjA3MTk0NTMqZS0uMjI4OTkxNCp0KzEuNDA1MjQyNypuKSx0aGlzLm9wYWNpdHkpfX0pKSxfSihkUSxoUSx5Sih2Six7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBkUSh0aGlzLmgsdGhpcy5jLHRoaXMubCsxOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGRRKHRoaXMuaCx0aGlzLmMsdGhpcy5sLTE4KihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIHBRKHRoaXMpLnJnYigpfX0pKTt2YXIgZlE9LS4yOTIyNyxtUT0tLjkwNjQ5LGdRPTEuOTcyOTQ7ZnVuY3Rpb24gX1EodCl7aWYodCBpbnN0YW5jZW9mIHZRKXJldHVybiBuZXcgdlEodC5oLHQucyx0LmwsdC5vcGFjaXR5KTt0IGluc3RhbmNlb2YgRkp8fCh0PUJKKHQpKTt2YXIgZT10LmcvMjU1LG49dC5iLzI1NSxpPSgtLjY1NTc2MzY2Njc5OTk5OTkqbit0LnIvMjU1Ki0xLjc4ODQ1MDM4MDYtMy41MTcyOTgyNDM4KmUpLy01Ljk2MTUxMjI5MTIscj1uLWksbz0oZ1EqKGUtaSktZlEqcikvbVEsYT1NYXRoLnNxcnQobypvK3IqcikvKGdRKmkqKDEtaSkpLHM9YT9NYXRoLmF0YW4yKG8scikqWkotMTIwOk5hTjtyZXR1cm4gbmV3IHZRKHM8MD9zKzM2MDpzLGEsaSx0Lm9wYWNpdHkpfWZ1bmN0aW9uIHlRKHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9fUSh0KTpuZXcgdlEodCxlLG4sbnVsbD09aT8xOmkpfWZ1bmN0aW9uIHZRKHQsZSxuLGkpe3RoaXMuaD0rdCx0aGlzLnM9K2UsdGhpcy5sPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiBiUSh0LGUsbixpLHIpe3ZhciBvPXQqdCxhPW8qdDtyZXR1cm4oKDEtMyp0KzMqby1hKSplKyg0LTYqbyszKmEpKm4rKDErMyp0KzMqby0zKmEpKmkrYSpyKS82fWZ1bmN0aW9uIHhRKHQpe3ZhciBlPXQubGVuZ3RoLTE7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBpPW48PTA/bj0wOm4+PTE/KG49MSxlLTEpOk1hdGguZmxvb3IobiplKSxyPXRbaV0sbz10W2krMV07cmV0dXJuIGJRKChuLWkvZSkqZSxpPjA/dFtpLTFdOjIqci1vLHIsbyxpPGUtMT90W2krMl06MipvLXIpfX1mdW5jdGlvbiB3USh0KXt2YXIgZT10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGk9TWF0aC5mbG9vcigoKG4lPTEpPDA/KytuOm4pKmUpO3JldHVybiBiUSgobi1pL2UpKmUsdFsoaStlLTEpJWVdLHRbaSVlXSx0WyhpKzEpJWVdLHRbKGkrMiklZV0pfX1mdW5jdGlvbiBTUSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gTVEodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQrbiplfX1mdW5jdGlvbiBFUSh0LGUpe3ZhciBuPWUtdDtyZXR1cm4gbj9NUSh0LG4+MTgwfHxuPC0xODA/bi0zNjAqTWF0aC5yb3VuZChuLzM2MCk6bik6U1EoaXNOYU4odCk/ZTp0KX1mdW5jdGlvbiBUUSh0LGUpe3ZhciBuPWUtdDtyZXR1cm4gbj9NUSh0LG4pOlNRKGlzTmFOKHQpP2U6dCl9X0oodlEseVEseUoodkose2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/eEo6TWF0aC5wb3coeEosdCksbmV3IHZRKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/Yko6TWF0aC5wb3coYkosdCksbmV3IHZRKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9aXNOYU4odGhpcy5oKT8wOih0aGlzLmgrMTIwKSpLSixlPSt0aGlzLmwsbj1pc05hTih0aGlzLnMpPzA6dGhpcy5zKmUqKDEtZSksaT1NYXRoLmNvcyh0KSxyPU1hdGguc2luKHQpO3JldHVybiBuZXcgRkooMjU1KihlK24qKC0uMTQ4NjEqaSsxLjc4Mjc3KnIpKSwyNTUqKGUrbiooZlEqaSttUSpyKSksMjU1KihlK24qKGdRKmkpKSx0aGlzLm9wYWNpdHkpfX0pKTt2YXIgQ1E9KGZ1bmN0aW9uIHQoZSl7dmFyIG49KGZ1bmN0aW9uIGkodCl7cmV0dXJuIDE9PSh0PSt0KT9UUTpmdW5jdGlvbihlLG4pe3JldHVybiBuLWU/KGZ1bmN0aW9uIGkodCxlLG4pe3JldHVybiB0PU1hdGgucG93KHQsbiksZT1NYXRoLnBvdyhlLG4pLXQsbj0xL24sZnVuY3Rpb24oaSl7cmV0dXJuIE1hdGgucG93KHQraSplLG4pfX0pKGUsbix0KTpTUShpc05hTihlKT9uOmUpfX0pKGUpO2Z1bmN0aW9uIHIodCxlKXt2YXIgaT1uKCh0PUhKKHQpKS5yLChlPUhKKGUpKS5yKSxyPW4odC5nLGUuZyksbz1uKHQuYixlLmIpLGE9VFEodC5vcGFjaXR5LGUub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0LnI9aShlKSx0Lmc9cihlKSx0LmI9byhlKSx0Lm9wYWNpdHk9YShlKSx0KyIifX1yZXR1cm4gci5nYW1tYT10LHJ9KSgxKTtmdW5jdGlvbiBBUSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG4saSxyPWUubGVuZ3RoLG89bmV3IEFycmF5KHIpLGE9bmV3IEFycmF5KHIpLHM9bmV3IEFycmF5KHIpO2ZvcihuPTA7bjxyOysrbilpPUhKKGVbbl0pLG9bbl09aS5yfHwwLGFbbl09aS5nfHwwLHNbbl09aS5ifHwwO3JldHVybiBvPXQobyksYT10KGEpLHM9dChzKSxpLm9wYWNpdHk9MSxmdW5jdGlvbih0KXtyZXR1cm4gaS5yPW8odCksaS5nPWEodCksaS5iPXModCksaSsiIn19fXZhciBrUT1BUSh4USksTFE9QVEod1EpO2Z1bmN0aW9uIFBRKHQsZSl7dmFyIG4saT1lP2UubGVuZ3RoOjAscj10P01hdGgubWluKGksdC5sZW5ndGgpOjAsbz1uZXcgQXJyYXkociksYT1uZXcgQXJyYXkoaSk7Zm9yKG49MDtuPHI7KytuKW9bbl09QlEodFtuXSxlW25dKTtmb3IoO248aTsrK24pYVtuXT1lW25dO3JldHVybiBmdW5jdGlvbih0KXtmb3Iobj0wO248cjsrK24pYVtuXT1vW25dKHQpO3JldHVybiBhfX1mdW5jdGlvbiBOUSh0LGUpe3ZhciBuPW5ldyBEYXRlO3JldHVybiBlLT10PSt0LGZ1bmN0aW9uKGkpe3JldHVybiBuLnNldFRpbWUodCtlKmkpLG59fWZ1bmN0aW9uIElRKHQsZSl7cmV0dXJuIGUtPXQ9K3QsZnVuY3Rpb24obil7cmV0dXJuIHQrZSpufX1mdW5jdGlvbiBSUSh0LGUpe3ZhciBuLGk9e30scj17fTtmb3IobiBpbiBudWxsIT09dCYmIm9iamVjdCI9PXR5cGVvZiB0fHwodD17fSksbnVsbCE9PWUmJiJvYmplY3QiPT10eXBlb2YgZXx8KGU9e30pLGUpbiBpbiB0P2lbbl09QlEodFtuXSxlW25dKTpyW25dPWVbbl07cmV0dXJuIGZ1bmN0aW9uKHQpe2ZvcihuIGluIGkpcltuXT1pW25dKHQpO3JldHVybiByfX12YXIgT1E9L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLHpRPW5ldyBSZWdFeHAoT1Euc291cmNlLCJnIik7ZnVuY3Rpb24gRFEodCxlKXt2YXIgbixpLHIsbz1PUS5sYXN0SW5kZXg9elEubGFzdEluZGV4PTAsYT0tMSxzPVtdLGw9W107Zm9yKHQrPSIiLGUrPSIiOyhuPU9RLmV4ZWModCkpJiYoaT16US5leGVjKGUpKTspKHI9aS5pbmRleCk+byYmKHI9ZS5zbGljZShvLHIpLHNbYV0/c1thXSs9cjpzWysrYV09ciksKG49blswXSk9PT0oaT1pWzBdKT9zW2FdP3NbYV0rPWk6c1srK2FdPWk6KHNbKythXT1udWxsLGwucHVzaCh7aTphLHg6SVEobixpKX0pKSxvPXpRLmxhc3RJbmRleDtyZXR1cm4gbzxlLmxlbmd0aCYmKHI9ZS5zbGljZShvKSxzW2FdP3NbYV0rPXI6c1srK2FdPXIpLHMubGVuZ3RoPDI/bFswXT8oZnVuY3Rpb24gYyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSkrIiJ9fSkobFswXS54KTooZnVuY3Rpb24gdSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KShlKTooZT1sLmxlbmd0aCxmdW5jdGlvbih0KXtmb3IodmFyIG4saT0wO2k8ZTsrK2kpc1sobj1sW2ldKS5pXT1uLngodCk7cmV0dXJuIHMuam9pbigiIil9KX1mdW5jdGlvbiBCUSh0LGUpe3ZhciBuLGk9dHlwZW9mIGU7cmV0dXJuIG51bGw9PWV8fCJib29sZWFuIj09PWk/U1EoZSk6KCJudW1iZXIiPT09aT9JUToic3RyaW5nIj09PWk/KG49T0ooZSkpPyhlPW4sQ1EpOkRROmUgaW5zdGFuY2VvZiBPSj9DUTplIGluc3RhbmNlb2YgRGF0ZT9OUTpBcnJheS5pc0FycmF5KGUpP1BROiJmdW5jdGlvbiIhPXR5cGVvZiBlLnZhbHVlT2YmJiJmdW5jdGlvbiIhPXR5cGVvZiBlLnRvU3RyaW5nfHxpc05hTihlKT9SUTpJUSkodCxlKX12YXIgSFEsRlEsVlEsVVEsalE9MTgwL01hdGguUEksR1E9e3RyYW5zbGF0ZVg6MCx0cmFuc2xhdGVZOjAscm90YXRlOjAsc2tld1g6MCxzY2FsZVg6MSxzY2FsZVk6MX07ZnVuY3Rpb24gV1EodCxlLG4saSxyLG8pe3ZhciBhLHMsbDtyZXR1cm4oYT1NYXRoLnNxcnQodCp0K2UqZSkpJiYodC89YSxlLz1hKSwobD10Km4rZSppKSYmKG4tPXQqbCxpLT1lKmwpLChzPU1hdGguc3FydChuKm4raSppKSkmJihuLz1zLGkvPXMsbC89cyksdCppPGUqbiYmKHQ9LXQsZT0tZSxsPS1sLGE9LWEpLHt0cmFuc2xhdGVYOnIsdHJhbnNsYXRlWTpvLHJvdGF0ZTpNYXRoLmF0YW4yKGUsdCkqalEsc2tld1g6TWF0aC5hdGFuKGwpKmpRLHNjYWxlWDphLHNjYWxlWTpzfX1mdW5jdGlvbiBxUSh0LGUsbixpKXtmdW5jdGlvbiByKHQpe3JldHVybiB0Lmxlbmd0aD90LnBvcCgpKyIgIjoiIn1yZXR1cm4gZnVuY3Rpb24obyxhKXt2YXIgcz1bXSxsPVtdO3JldHVybiBvPXQobyksYT10KGEpLChmdW5jdGlvbiBjKHQsaSxyLG8sYSxzKXtpZih0IT09cnx8aSE9PW8pe3ZhciBsPWEucHVzaCgidHJhbnNsYXRlKCIsbnVsbCxlLG51bGwsbik7cy5wdXNoKHtpOmwtNCx4OklRKHQscil9LHtpOmwtMix4OklRKGksbyl9KX1lbHNlKHJ8fG8pJiZhLnB1c2goInRyYW5zbGF0ZSgiK3IrZStvK24pfSkoby50cmFuc2xhdGVYLG8udHJhbnNsYXRlWSxhLnRyYW5zbGF0ZVgsYS50cmFuc2xhdGVZLHMsbCksKGZ1bmN0aW9uIHUodCxlLG4sbyl7dCE9PWU/KHQtZT4xODA/ZSs9MzYwOmUtdD4xODAmJih0Kz0zNjApLG8ucHVzaCh7aTpuLnB1c2gocihuKSsicm90YXRlKCIsbnVsbCxpKS0yLHg6SVEodCxlKX0pKTplJiZuLnB1c2gocihuKSsicm90YXRlKCIrZStpKX0pKG8ucm90YXRlLGEucm90YXRlLHMsbCksKGZ1bmN0aW9uIGgodCxlLG4sbyl7dCE9PWU/by5wdXNoKHtpOm4ucHVzaChyKG4pKyJza2V3WCgiLG51bGwsaSktMix4OklRKHQsZSl9KTplJiZuLnB1c2gocihuKSsic2tld1goIitlK2kpfSkoby5za2V3WCxhLnNrZXdYLHMsbCksKGZ1bmN0aW9uIGQodCxlLG4saSxvLGEpe2lmKHQhPT1ufHxlIT09aSl7dmFyIHM9by5wdXNoKHIobykrInNjYWxlKCIsbnVsbCwiLCIsbnVsbCwiKSIpO2EucHVzaCh7aTpzLTQseDpJUSh0LG4pfSx7aTpzLTIseDpJUShlLGkpfSl9ZWxzZSAxPT09biYmMT09PWl8fG8ucHVzaChyKG8pKyJzY2FsZSgiK24rIiwiK2krIikiKX0pKG8uc2NhbGVYLG8uc2NhbGVZLGEuc2NhbGVYLGEuc2NhbGVZLHMsbCksbz1hPW51bGwsZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49LTEsaT1sLmxlbmd0aDsrK248aTspc1soZT1sW25dKS5pXT1lLngodCk7cmV0dXJuIHMuam9pbigiIil9fX12YXIgWVE9cVEoKGZ1bmN0aW9uIFhRKHQpe3JldHVybiJub25lIj09PXQ/R1E6KEhRfHwoSFE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksRlE9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFZRPWRvY3VtZW50LmRlZmF1bHRWaWV3KSxIUS5zdHlsZS50cmFuc2Zvcm09dCx0PVZRLmdldENvbXB1dGVkU3R5bGUoRlEuYXBwZW5kQ2hpbGQoSFEpLG51bGwpLmdldFByb3BlcnR5VmFsdWUoInRyYW5zZm9ybSIpLEZRLnJlbW92ZUNoaWxkKEhRKSxXUSgrKHQ9dC5zbGljZSg3LC0xKS5zcGxpdCgiLCIpKVswXSwrdFsxXSwrdFsyXSwrdFszXSwrdFs0XSwrdFs1XSkpfSksInB4LCAiLCJweCkiLCJkZWcpIiksJFE9cVEoKGZ1bmN0aW9uIEtRKHQpe3JldHVybiBudWxsPT10P0dROihVUXx8KFVRPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJnIikpLFVRLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIix0KSwodD1VUS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKT9XUSgodD10Lm1hdHJpeCkuYSx0LmIsdC5jLHQuZCx0LmUsdC5mKTpHUSl9KSwiLCAiLCIpIiwiKSIpLFpRPU1hdGguU1FSVDI7ZnVuY3Rpb24gSlEodCl7cmV0dXJuKCh0PU1hdGguZXhwKHQpKSsxL3QpLzJ9ZnVuY3Rpb24gUVEodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIGk9dCgoZT1xSihlKSkuaCwobj1xSihuKSkuaCkscj1UUShlLnMsbi5zKSxvPVRRKGUubCxuLmwpLGE9VFEoZS5vcGFjaXR5LG4ub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmg9aSh0KSxlLnM9cih0KSxlLmw9byh0KSxlLm9wYWNpdHk9YSh0KSxlKyIifX19dmFyIHQxPVFRKEVRKSxlMT1RUShUUSk7ZnVuY3Rpb24gbjEodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIGk9dCgoZT1oUShlKSkuaCwobj1oUShuKSkuaCkscj1UUShlLmMsbi5jKSxvPVRRKGUubCxuLmwpLGE9VFEoZS5vcGFjaXR5LG4ub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmg9aSh0KSxlLmM9cih0KSxlLmw9byh0KSxlLm9wYWNpdHk9YSh0KSxlKyIifX19dmFyIGkxPW4xKEVRKSxyMT1uMShUUSk7ZnVuY3Rpb24gbzEodCl7cmV0dXJuKGZ1bmN0aW9uIGUobil7ZnVuY3Rpb24gaShlLGkpe3ZhciByPXQoKGU9eVEoZSkpLmgsKGk9eVEoaSkpLmgpLG89VFEoZS5zLGkucyksYT1UUShlLmwsaS5sKSxzPVRRKGUub3BhY2l0eSxpLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5oPXIodCksZS5zPW8odCksZS5sPWEoTWF0aC5wb3codCxuKSksZS5vcGFjaXR5PXModCksZSsiIn19cmV0dXJuIG49K24saS5nYW1tYT1lLGl9KSgxKX12YXIgYTE9bzEoRVEpLHMxPW8xKFRRKSxsMT1NYXRoLlBJLGMxPTIqbDEsdTE9MWUtNixoMT1jMS11MTtmdW5jdGlvbiBkMSgpe3RoaXMuX3gwPXRoaXMuX3kwPXRoaXMuX3gxPXRoaXMuX3kxPW51bGwsdGhpcy5fPSIifWZ1bmN0aW9uIHAxKCl7cmV0dXJuIG5ldyBkMX1mdW5jdGlvbiBmMSh0LGUsbil7cmV0dXJuKGVbMF0tdFswXSkqKG5bMV0tdFsxXSktKGVbMV0tdFsxXSkqKG5bMF0tdFswXSl9ZnVuY3Rpb24gbTEodCxlKXtyZXR1cm4gdFswXS1lWzBdfHx0WzFdLWVbMV19ZnVuY3Rpb24gZzEodCl7Zm9yKHZhciBlPXQubGVuZ3RoLG49WzAsMV0saT0yLHI9MjtyPGU7KytyKXtmb3IoO2k+MSYmZjEodFtuW2ktMl1dLHRbbltpLTFdXSx0W3JdKTw9MDspLS1pO25baSsrXT1yfXJldHVybiBuLnNsaWNlKDAsaSl9ZnVuY3Rpb24gXzEodCxlLG4saSl7aWYoaXNOYU4oZSl8fGlzTmFOKG4pKXJldHVybiB0O3ZhciByLG8sYSxzLGwsYyx1LGgsZCxwPXQuX3Jvb3QsZj17ZGF0YTppfSxtPXQuX3gwLGc9dC5feTAsXz10Ll94MSx5PXQuX3kxO2lmKCFwKXJldHVybiB0Ll9yb290PWYsdDtmb3IoO3AubGVuZ3RoOylpZigoYz1lPj0obz0obStfKS8yKSk/bT1vOl89bywodT1uPj0oYT0oZyt5KS8yKSk/Zz1hOnk9YSxyPXAsIShwPXBbaD11PDwxfGNdKSlyZXR1cm4gcltoXT1mLHQ7aWYocz0rdC5feC5jYWxsKG51bGwscC5kYXRhKSxsPSt0Ll95LmNhbGwobnVsbCxwLmRhdGEpLGU9PT1zJiZuPT09bClyZXR1cm4gZi5uZXh0PXAscj9yW2hdPWY6dC5fcm9vdD1mLHQ7ZG97cj1yP3JbaF09bmV3IEFycmF5KDQpOnQuX3Jvb3Q9bmV3IEFycmF5KDQpLChjPWU+PShvPShtK18pLzIpKT9tPW86Xz1vLCh1PW4+PShhPShnK3kpLzIpKT9nPWE6eT1hfXdoaWxlKChoPXU8PDF8Yyk9PShkPShsPj1hKTw8MXxzPj1vKSk7cmV0dXJuIHJbZF09cCxyW2hdPWYsdH1mdW5jdGlvbiB5MSh0LGUsbixpLHIpe3RoaXMubm9kZT10LHRoaXMueDA9ZSx0aGlzLnkwPW4sdGhpcy54MT1pLHRoaXMueTE9cn1mdW5jdGlvbiB2MSh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBiMSh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiB4MSh0LGUsbil7dmFyIGk9bmV3IHcxKG51bGw9PWU/djE6ZSxudWxsPT1uP2IxOm4sTmFOLE5hTixOYU4sTmFOKTtyZXR1cm4gbnVsbD09dD9pOmkuYWRkQWxsKHQpfWZ1bmN0aW9uIHcxKHQsZSxuLGkscixvKXt0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3gwPW4sdGhpcy5feTA9aSx0aGlzLl94MT1yLHRoaXMuX3kxPW8sdGhpcy5fcm9vdD12b2lkIDB9ZnVuY3Rpb24gUzEodCl7Zm9yKHZhciBlPXtkYXRhOnQuZGF0YX0sbj1lO3Q9dC5uZXh0OyluPW4ubmV4dD17ZGF0YTp0LmRhdGF9O3JldHVybiBlfWQxLnByb3RvdHlwZT1wMS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmQxLG1vdmVUbzpmdW5jdGlvbih0LGUpe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rZSl9LGNsb3NlUGF0aDpmdW5jdGlvbigpe251bGwhPT10aGlzLl94MSYmKHRoaXMuX3gxPXRoaXMuX3gwLHRoaXMuX3kxPXRoaXMuX3kwLHRoaXMuXys9IloiKX0sbGluZVRvOmZ1bmN0aW9uKHQsZSl7dGhpcy5fKz0iTCIrKHRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kxPStlKX0scXVhZHJhdGljQ3VydmVUbzpmdW5jdGlvbih0LGUsbixpKXt0aGlzLl8rPSJRIisgK3QrIiwiKyArZSsiLCIrKHRoaXMuX3gxPStuKSsiLCIrKHRoaXMuX3kxPStpKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LGUsbixpLHIsbyl7dGhpcy5fKz0iQyIrICt0KyIsIisgK2UrIiwiKyArbisiLCIrICtpKyIsIisodGhpcy5feDE9K3IpKyIsIisodGhpcy5feTE9K28pfSxhcmNUbzpmdW5jdGlvbih0LGUsbixpLHIpe3ZhciBvPXRoaXMuX3gxLGE9dGhpcy5feTEscz0obj0rbiktKHQ9K3QpLGw9KGk9K2kpLShlPStlKSxjPW8tdCx1PWEtZSxoPWMqYyt1KnU7aWYoKHI9K3IpPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIrcik7aWYobnVsbD09PXRoaXMuX3gxKXRoaXMuXys9Ik0iKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPWUpO2Vsc2UgaWYoaD51MSlpZihNYXRoLmFicyh1KnMtbCpjKT51MSYmcil7dmFyIGQ9bi1vLHA9aS1hLGY9cypzK2wqbCxtPWQqZCtwKnAsZz1NYXRoLnNxcnQoZiksXz1NYXRoLnNxcnQoaCkseT1yKk1hdGgudGFuKChsMS1NYXRoLmFjb3MoKGYraC1tKS8oMipnKl8pKSkvMiksdj15L18sYj15L2c7TWF0aC5hYnModi0xKT51MSYmKHRoaXMuXys9IkwiKyh0K3YqYykrIiwiKyhlK3YqdSkpLHRoaXMuXys9IkEiK3IrIiwiK3IrIiwwLDAsIisgKyh1KmQ+YypwKSsiLCIrKHRoaXMuX3gxPXQrYipzKSsiLCIrKHRoaXMuX3kxPWUrYipsKX1lbHNlIHRoaXMuXys9IkwiKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPWUpfSxhcmM6ZnVuY3Rpb24odCxlLG4saSxyLG8pe3Q9K3QsZT0rZTt2YXIgYT0obj0rbikqTWF0aC5jb3MoaSkscz1uKk1hdGguc2luKGkpLGw9dCthLGM9ZStzLHU9MV5vLGg9bz9pLXI6ci1pO2lmKG48MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIituKTtudWxsPT09dGhpcy5feDE/dGhpcy5fKz0iTSIrbCsiLCIrYzooTWF0aC5hYnModGhpcy5feDEtbCk+dTF8fE1hdGguYWJzKHRoaXMuX3kxLWMpPnUxKSYmKHRoaXMuXys9IkwiK2wrIiwiK2MpLG4mJihoPDAmJihoPWglYzErYzEpLGg+aDE/dGhpcy5fKz0iQSIrbisiLCIrbisiLDAsMSwiK3UrIiwiKyh0LWEpKyIsIisoZS1zKSsiQSIrbisiLCIrbisiLDAsMSwiK3UrIiwiKyh0aGlzLl94MT1sKSsiLCIrKHRoaXMuX3kxPWMpOmg+dTEmJih0aGlzLl8rPSJBIituKyIsIituKyIsMCwiKyArKGg+PWwxKSsiLCIrdSsiLCIrKHRoaXMuX3gxPXQrbipNYXRoLmNvcyhyKSkrIiwiKyh0aGlzLl95MT1lK24qTWF0aC5zaW4ocikpKSl9LHJlY3Q6ZnVuY3Rpb24odCxlLG4saSl7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStlKSsiaCIrICtuKyJ2IisgK2krImgiKy1uKyJaIn0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX07dmFyIE0xPXgxLnByb3RvdHlwZT13MS5wcm90b3R5cGU7TTEuY29weT1mdW5jdGlvbigpe3ZhciB0LGUsbj1uZXcgdzEodGhpcy5feCx0aGlzLl95LHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSxpPXRoaXMuX3Jvb3Q7aWYoIWkpcmV0dXJuIG47aWYoIWkubGVuZ3RoKXJldHVybiBuLl9yb290PVMxKGkpLG47Zm9yKHQ9W3tzb3VyY2U6aSx0YXJnZXQ6bi5fcm9vdD1uZXcgQXJyYXkoNCl9XTtpPXQucG9wKCk7KWZvcih2YXIgcj0wO3I8NDsrK3IpKGU9aS5zb3VyY2Vbcl0pJiYoZS5sZW5ndGg/dC5wdXNoKHtzb3VyY2U6ZSx0YXJnZXQ6aS50YXJnZXRbcl09bmV3IEFycmF5KDQpfSk6aS50YXJnZXRbcl09UzEoZSkpO3JldHVybiBufSxNMS5hZGQ9ZnVuY3Rpb24gRTEodCl7dmFyIGU9K3RoaXMuX3guY2FsbChudWxsLHQpLG49K3RoaXMuX3kuY2FsbChudWxsLHQpO3JldHVybiBfMSh0aGlzLmNvdmVyKGUsbiksZSxuLHQpfSxNMS5hZGRBbGw9ZnVuY3Rpb24gVDEodCl7dmFyIGUsbixpLHIsbz10Lmxlbmd0aCxhPW5ldyBBcnJheShvKSxzPW5ldyBBcnJheShvKSxsPTEvMCxjPTEvMCx1PS0xLzAsaD0tMS8wO2ZvcihuPTA7bjxvOysrbilpc05hTihpPSt0aGlzLl94LmNhbGwobnVsbCxlPXRbbl0pKXx8aXNOYU4ocj0rdGhpcy5feS5jYWxsKG51bGwsZSkpfHwoYVtuXT1pLHNbbl09cixpPGwmJihsPWkpLGk+dSYmKHU9aSkscjxjJiYoYz1yKSxyPmgmJihoPXIpKTtmb3IodTxsJiYobD10aGlzLl94MCx1PXRoaXMuX3gxKSxoPGMmJihjPXRoaXMuX3kwLGg9dGhpcy5feTEpLHRoaXMuY292ZXIobCxjKS5jb3Zlcih1LGgpLG49MDtuPG87KytuKV8xKHRoaXMsYVtuXSxzW25dLHRbbl0pO3JldHVybiB0aGlzfSxNMS5jb3Zlcj1mdW5jdGlvbiBDMSh0LGUpe2lmKGlzTmFOKHQ9K3QpfHxpc05hTihlPStlKSlyZXR1cm4gdGhpczt2YXIgbj10aGlzLl94MCxpPXRoaXMuX3kwLHI9dGhpcy5feDEsbz10aGlzLl95MTtpZihpc05hTihuKSlyPShuPU1hdGguZmxvb3IodCkpKzEsbz0oaT1NYXRoLmZsb29yKGUpKSsxO2Vsc2V7aWYoIShuPnR8fHQ+cnx8aT5lfHxlPm8pKXJldHVybiB0aGlzO3ZhciBhLHMsbD1yLW4sYz10aGlzLl9yb290O3N3aXRjaChzPShlPChpK28pLzIpPDwxfHQ8KG4rcikvMil7Y2FzZSAwOmRveyhhPW5ldyBBcnJheSg0KSlbc109YyxjPWF9d2hpbGUobz1pKyhsKj0yKSx0PihyPW4rbCl8fGU+byk7YnJlYWs7Y2FzZSAxOmRveyhhPW5ldyBBcnJheSg0KSlbc109YyxjPWF9d2hpbGUobz1pKyhsKj0yKSwobj1yLWwpPnR8fGU+byk7YnJlYWs7Y2FzZSAyOmRveyhhPW5ldyBBcnJheSg0KSlbc109YyxjPWF9d2hpbGUoaT1vLShsKj0yKSx0PihyPW4rbCl8fGk+ZSk7YnJlYWs7Y2FzZSAzOmRveyhhPW5ldyBBcnJheSg0KSlbc109YyxjPWF9d2hpbGUoaT1vLShsKj0yKSwobj1yLWwpPnR8fGk+ZSl9dGhpcy5fcm9vdCYmdGhpcy5fcm9vdC5sZW5ndGgmJih0aGlzLl9yb290PWMpfXJldHVybiB0aGlzLl94MD1uLHRoaXMuX3kwPWksdGhpcy5feDE9cix0aGlzLl95MT1vLHRoaXN9LE0xLmRhdGE9ZnVuY3Rpb24gQTEoKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy52aXNpdCgoZnVuY3Rpb24oZSl7aWYoIWUubGVuZ3RoKWRve3QucHVzaChlLmRhdGEpfXdoaWxlKGU9ZS5uZXh0KX0pKSx0fSxNMS5leHRlbnQ9ZnVuY3Rpb24gazEodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5jb3ZlcigrdFswXVswXSwrdFswXVsxXSkuY292ZXIoK3RbMV1bMF0sK3RbMV1bMV0pOmlzTmFOKHRoaXMuX3gwKT92b2lkIDA6W1t0aGlzLl94MCx0aGlzLl95MF0sW3RoaXMuX3gxLHRoaXMuX3kxXV19LE0xLmZpbmQ9ZnVuY3Rpb24gTDEodCxlLG4pe3ZhciBpLHIsbyxhLHMsbCxjLHU9dGhpcy5feDAsaD10aGlzLl95MCxkPXRoaXMuX3gxLHA9dGhpcy5feTEsZj1bXSxtPXRoaXMuX3Jvb3Q7Zm9yKG0mJmYucHVzaChuZXcgeTEobSx1LGgsZCxwKSksbnVsbD09bj9uPTEvMDoodT10LW4saD1lLW4sZD10K24scD1lK24sbio9bik7bD1mLnBvcCgpOylpZighKCEobT1sLm5vZGUpfHwocj1sLngwKT5kfHwobz1sLnkwKT5wfHwoYT1sLngxKTx1fHwocz1sLnkxKTxoKSlpZihtLmxlbmd0aCl7dmFyIGc9KHIrYSkvMixfPShvK3MpLzI7Zi5wdXNoKG5ldyB5MShtWzNdLGcsXyxhLHMpLG5ldyB5MShtWzJdLHIsXyxnLHMpLG5ldyB5MShtWzFdLGcsbyxhLF8pLG5ldyB5MShtWzBdLHIsbyxnLF8pKSwoYz0oZT49Xyk8PDF8dD49ZykmJihsPWZbZi5sZW5ndGgtMV0sZltmLmxlbmd0aC0xXT1mW2YubGVuZ3RoLTEtY10sZltmLmxlbmd0aC0xLWNdPWwpfWVsc2V7dmFyIHk9dC0rdGhpcy5feC5jYWxsKG51bGwsbS5kYXRhKSx2PWUtK3RoaXMuX3kuY2FsbChudWxsLG0uZGF0YSksYj15Knkrdip2O2lmKGI8bil7dmFyIHg9TWF0aC5zcXJ0KG49Yik7dT10LXgsaD1lLXgsZD10K3gscD1lK3gsaT1tLmRhdGF9fXJldHVybiBpfSxNMS5yZW1vdmU9ZnVuY3Rpb24gUDEodCl7aWYoaXNOYU4obz0rdGhpcy5feC5jYWxsKG51bGwsdCkpfHxpc05hTihhPSt0aGlzLl95LmNhbGwobnVsbCx0KSkpcmV0dXJuIHRoaXM7dmFyIGUsbixpLHIsbyxhLHMsbCxjLHUsaCxkLHA9dGhpcy5fcm9vdCxmPXRoaXMuX3gwLG09dGhpcy5feTAsZz10aGlzLl94MSxfPXRoaXMuX3kxO2lmKCFwKXJldHVybiB0aGlzO2lmKHAubGVuZ3RoKWZvcig7Oyl7aWYoKGM9bz49KHM9KGYrZykvMikpP2Y9czpnPXMsKHU9YT49KGw9KG0rXykvMikpP209bDpfPWwsZT1wLCEocD1wW2g9dTw8MXxjXSkpcmV0dXJuIHRoaXM7aWYoIXAubGVuZ3RoKWJyZWFrOyhlW2grMSYzXXx8ZVtoKzImM118fGVbaCszJjNdKSYmKG49ZSxkPWgpfWZvcig7cC5kYXRhIT09dDspaWYoaT1wLCEocD1wLm5leHQpKXJldHVybiB0aGlzO3JldHVybihyPXAubmV4dCkmJmRlbGV0ZSBwLm5leHQsaT8ocj9pLm5leHQ9cjpkZWxldGUgaS5uZXh0LHRoaXMpOmU/KHI/ZVtoXT1yOmRlbGV0ZSBlW2hdLChwPWVbMF18fGVbMV18fGVbMl18fGVbM10pJiZwPT09KGVbM118fGVbMl18fGVbMV18fGVbMF0pJiYhcC5sZW5ndGgmJihuP25bZF09cDp0aGlzLl9yb290PXApLHRoaXMpOih0aGlzLl9yb290PXIsdGhpcyl9LE0xLnJlbW92ZUFsbD1mdW5jdGlvbiBOMSh0KXtmb3IodmFyIGU9MCxuPXQubGVuZ3RoO2U8bjsrK2UpdGhpcy5yZW1vdmUodFtlXSk7cmV0dXJuIHRoaXN9LE0xLnJvb3Q9ZnVuY3Rpb24gSTEoKXtyZXR1cm4gdGhpcy5fcm9vdH0sTTEuc2l6ZT1mdW5jdGlvbiBSMSgpe3ZhciB0PTA7cmV0dXJuIHRoaXMudmlzaXQoKGZ1bmN0aW9uKGUpe2lmKCFlLmxlbmd0aClkb3srK3R9d2hpbGUoZT1lLm5leHQpfSkpLHR9LE0xLnZpc2l0PWZ1bmN0aW9uIE8xKHQpe3ZhciBlLG4saSxyLG8sYSxzPVtdLGw9dGhpcy5fcm9vdDtmb3IobCYmcy5wdXNoKG5ldyB5MShsLHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSk7ZT1zLnBvcCgpOylpZighdChsPWUubm9kZSxpPWUueDAscj1lLnkwLG89ZS54MSxhPWUueTEpJiZsLmxlbmd0aCl7dmFyIGM9KGkrbykvMix1PShyK2EpLzI7KG49bFszXSkmJnMucHVzaChuZXcgeTEobixjLHUsbyxhKSksKG49bFsyXSkmJnMucHVzaChuZXcgeTEobixpLHUsYyxhKSksKG49bFsxXSkmJnMucHVzaChuZXcgeTEobixjLHIsbyx1KSksKG49bFswXSkmJnMucHVzaChuZXcgeTEobixpLHIsYyx1KSl9cmV0dXJuIHRoaXN9LE0xLnZpc2l0QWZ0ZXI9ZnVuY3Rpb24gejEodCl7dmFyIGUsbj1bXSxpPVtdO2Zvcih0aGlzLl9yb290JiZuLnB1c2gobmV3IHkxKHRoaXMuX3Jvb3QsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtlPW4ucG9wKCk7KXt2YXIgcj1lLm5vZGU7aWYoci5sZW5ndGgpe3ZhciBvLGE9ZS54MCxzPWUueTAsbD1lLngxLGM9ZS55MSx1PShhK2wpLzIsaD0ocytjKS8yOyhvPXJbMF0pJiZuLnB1c2gobmV3IHkxKG8sYSxzLHUsaCkpLChvPXJbMV0pJiZuLnB1c2gobmV3IHkxKG8sdSxzLGwsaCkpLChvPXJbMl0pJiZuLnB1c2gobmV3IHkxKG8sYSxoLHUsYykpLChvPXJbM10pJiZuLnB1c2gobmV3IHkxKG8sdSxoLGwsYykpfWkucHVzaChlKX1mb3IoO2U9aS5wb3AoKTspdChlLm5vZGUsZS54MCxlLnkwLGUueDEsZS55MSk7cmV0dXJuIHRoaXN9LE0xLng9ZnVuY3Rpb24gRDEodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3g9dCx0aGlzKTp0aGlzLl94fSxNMS55PWZ1bmN0aW9uIEIxKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl95PXQsdGhpcyk6dGhpcy5feX07dmFyIEgxPVtdLnNsaWNlLEYxPXt9O2Z1bmN0aW9uIFYxKHQpe3RoaXMuX3NpemU9dCx0aGlzLl9jYWxsPXRoaXMuX2Vycm9yPW51bGwsdGhpcy5fdGFza3M9W10sdGhpcy5fZGF0YT1bXSx0aGlzLl93YWl0aW5nPXRoaXMuX2FjdGl2ZT10aGlzLl9lbmRlZD10aGlzLl9zdGFydD0wfWZ1bmN0aW9uIFUxKHQpe2lmKCF0Ll9zdGFydCl0cnl7IShmdW5jdGlvbiBlKHQpe2Zvcig7dC5fc3RhcnQ9dC5fd2FpdGluZyYmdC5fYWN0aXZlPHQuX3NpemU7KXt2YXIgZT10Ll9lbmRlZCt0Ll9hY3RpdmUsbj10Ll90YXNrc1tlXSxpPW4ubGVuZ3RoLTEscj1uW2ldO25baV09ajEodCxlKSwtLXQuX3dhaXRpbmcsKyt0Ll9hY3RpdmUsbj1yLmFwcGx5KG51bGwsbiksdC5fdGFza3NbZV0mJih0Ll90YXNrc1tlXT1ufHxGMSl9fSkodCl9Y2F0Y2goZSl7aWYodC5fdGFza3NbdC5fZW5kZWQrdC5fYWN0aXZlLTFdKUcxKHQsZSk7ZWxzZSBpZighdC5fZGF0YSl0aHJvdyBlfX1mdW5jdGlvbiBqMSh0LGUpe3JldHVybiBmdW5jdGlvbihuLGkpe3QuX3Rhc2tzW2VdJiYoLS10Ll9hY3RpdmUsKyt0Ll9lbmRlZCx0Ll90YXNrc1tlXT1udWxsLG51bGw9PXQuX2Vycm9yJiYobnVsbCE9bj9HMSh0LG4pOih0Ll9kYXRhW2VdPWksdC5fd2FpdGluZz9VMSh0KTpXMSh0KSkpKX19ZnVuY3Rpb24gRzEodCxlKXt2YXIgbixpPXQuX3Rhc2tzLmxlbmd0aDtmb3IodC5fZXJyb3I9ZSx0Ll9kYXRhPXZvaWQgMCx0Ll93YWl0aW5nPU5hTjstLWk+PTA7KWlmKChuPXQuX3Rhc2tzW2ldKSYmKHQuX3Rhc2tzW2ldPW51bGwsbi5hYm9ydCkpdHJ5e24uYWJvcnQoKX1jYXRjaChlKXt9dC5fYWN0aXZlPU5hTixXMSh0KX1mdW5jdGlvbiBXMSh0KXtpZighdC5fYWN0aXZlJiZ0Ll9jYWxsKXt2YXIgZT10Ll9kYXRhO3QuX2RhdGE9dm9pZCAwLHQuX2NhbGwodC5fZXJyb3IsZSl9fWZ1bmN0aW9uIHExKHQpe2lmKG51bGw9PXQpdD0xLzA7ZWxzZSBpZighKCh0PSt0KT49MSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNvbmN1cnJlbmN5Iik7cmV0dXJuIG5ldyBWMSh0KX1mdW5jdGlvbiBZMSgpe3JldHVybiBNYXRoLnJhbmRvbSgpfVYxLnByb3RvdHlwZT1xMS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlYxLGRlZmVyOmZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjayIpO2lmKHRoaXMuX2NhbGwpdGhyb3cgbmV3IEVycm9yKCJkZWZlciBhZnRlciBhd2FpdCIpO2lmKG51bGwhPXRoaXMuX2Vycm9yKXJldHVybiB0aGlzO3ZhciBlPUgxLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBlLnB1c2godCksKyt0aGlzLl93YWl0aW5nLHRoaXMuX3Rhc2tzLnB1c2goZSksVTEodGhpcyksdGhpc30sYWJvcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09dGhpcy5fZXJyb3ImJkcxKHRoaXMsbmV3IEVycm9yKCJhYm9ydCIpKSx0aGlzfSxhd2FpdDpmdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2siKTtpZih0aGlzLl9jYWxsKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgYXdhaXQiKTtyZXR1cm4gdGhpcy5fY2FsbD1mdW5jdGlvbihlLG4pe3QuYXBwbHkobnVsbCxbZV0uY29uY2F0KG4pKX0sVzEodGhpcyksdGhpc30sYXdhaXRBbGw6ZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrIik7aWYodGhpcy5fY2FsbCl0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIGF3YWl0Iik7cmV0dXJuIHRoaXMuX2NhbGw9dCxXMSh0aGlzKSx0aGlzfX07dmFyIFgxPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCxuKXtyZXR1cm4gdD1udWxsPT10PzA6K3Qsbj1udWxsPT1uPzE6K24sMT09PWFyZ3VtZW50cy5sZW5ndGg/KG49dCx0PTApOm4tPXQsZnVuY3Rpb24oKXtyZXR1cm4gZSgpKm4rdH19cmV0dXJuIG4uc291cmNlPXQsbn0pKFkxKSwkMT0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQsbil7dmFyIGkscjtyZXR1cm4gdD1udWxsPT10PzA6K3Qsbj1udWxsPT1uPzE6K24sZnVuY3Rpb24oKXt2YXIgbztpZihudWxsIT1pKW89aSxpPW51bGw7ZWxzZSBkb3tpPTIqZSgpLTEsbz0yKmUoKS0xLHI9aSppK28qb313aGlsZSghcnx8cj4xKTtyZXR1cm4gdCtuKm8qTWF0aC5zcXJ0KC0yKk1hdGgubG9nKHIpL3IpfX1yZXR1cm4gbi5zb3VyY2U9dCxufSkoWTEpLEsxPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4oKXt2YXIgdD0kMS5zb3VyY2UoZSkuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBNYXRoLmV4cCh0KCkpfX1yZXR1cm4gbi5zb3VyY2U9dCxufSkoWTEpLFoxPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBuPTAsaT0wO2k8dDsrK2kpbis9ZSgpO3JldHVybiBufX1yZXR1cm4gbi5zb3VyY2U9dCxufSkoWTEpLEoxPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7dmFyIG49WjEuc291cmNlKGUpKHQpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBuKCkvdH19cmV0dXJuIG4uc291cmNlPXQsbn0pKFkxKSxRMT0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybi1NYXRoLmxvZygxLWUoKSkvdH19cmV0dXJuIG4uc291cmNlPXQsbn0pKFkxKTtmdW5jdGlvbiB0MCh0LGUpe3ZhciBuLGkscixvLGE9bGMoImJlZm9yZXNlbmQiLCJwcm9ncmVzcyIsImxvYWQiLCJlcnJvciIpLHM9d2coKSxsPW5ldyBYTUxIdHRwUmVxdWVzdCxjPW51bGwsdT1udWxsLGg9MDtmdW5jdGlvbiBkKHQpe3ZhciBlLGk9bC5zdGF0dXM7aWYoIWkmJihmdW5jdGlvbiBvKHQpe3ZhciBlPXQucmVzcG9uc2VUeXBlO3JldHVybiBlJiYidGV4dCIhPT1lP3QucmVzcG9uc2U6dC5yZXNwb25zZVRleHR9KShsKXx8aT49MjAwJiZpPDMwMHx8MzA0PT09aSl7aWYocil0cnl7ZT1yLmNhbGwobixsKX1jYXRjaCh0KXtyZXR1cm4gdm9pZCBhLmNhbGwoImVycm9yIixuLHQpfWVsc2UgZT1sO2EuY2FsbCgibG9hZCIsbixlKX1lbHNlIGEuY2FsbCgiZXJyb3IiLG4sdCl9aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBYRG9tYWluUmVxdWVzdCYmISgid2l0aENyZWRlbnRpYWxzImluIGwpJiYvXihodHRwKHMpPzopP1wvXC8vLnRlc3QodCkmJihsPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBsP2wub25sb2FkPWwub25lcnJvcj1sLm9udGltZW91dD1kOmwub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKHQpe2wucmVhZHlTdGF0ZT4zJiZkKHQpfSxsLm9ucHJvZ3Jlc3M9ZnVuY3Rpb24odCl7YS5jYWxsKCJwcm9ncmVzcyIsbix0KX0sbj17aGVhZGVyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9KHQrIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRzLmxlbmd0aDwyP3MuZ2V0KHQpOihudWxsPT1lP3MucmVtb3ZlKHQpOnMuc2V0KHQsZSsiIiksbil9LG1pbWVUeXBlOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/bnVsbDp0KyIiLG4pOml9LHJlc3BvbnNlVHlwZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz10LG4pOm99LHRpbWVvdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9K3Qsbik6aH0sdXNlcjpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP2M6KGM9bnVsbD09dD9udWxsOnQrIiIsbil9LHBhc3N3b3JkOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dToodT1udWxsPT10P251bGw6dCsiIixuKX0scmVzcG9uc2U6ZnVuY3Rpb24odCl7cmV0dXJuIHI9dCxufSxnZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5zZW5kKCJHRVQiLHQsZSl9LHBvc3Q6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5zZW5kKCJQT1NUIix0LGUpfSxzZW5kOmZ1bmN0aW9uKGUscixkKXtyZXR1cm4gbC5vcGVuKGUsdCwhMCxjLHUpLG51bGw9PWl8fHMuaGFzKCJhY2NlcHQiKXx8cy5zZXQoImFjY2VwdCIsaSsiLCovKiIpLGwuc2V0UmVxdWVzdEhlYWRlciYmcy5lYWNoKChmdW5jdGlvbih0LGUpe2wuc2V0UmVxdWVzdEhlYWRlcihlLHQpfSkpLG51bGwhPWkmJmwub3ZlcnJpZGVNaW1lVHlwZSYmbC5vdmVycmlkZU1pbWVUeXBlKGkpLG51bGwhPW8mJihsLnJlc3BvbnNlVHlwZT1vKSxoPjAmJihsLnRpbWVvdXQ9aCksbnVsbD09ZCYmImZ1bmN0aW9uIj09dHlwZW9mIHImJihkPXIscj1udWxsKSxudWxsIT1kJiYxPT09ZC5sZW5ndGgmJihkPShmdW5jdGlvbiBwKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3QobnVsbD09ZT9uOm51bGwpfX0pKGQpKSxudWxsIT1kJiZuLm9uKCJlcnJvciIsZCkub24oImxvYWQiLChmdW5jdGlvbih0KXtkKG51bGwsdCl9KSksYS5jYWxsKCJiZWZvcmVzZW5kIixuLGwpLGwuc2VuZChudWxsPT1yP251bGw6ciksbn0sYWJvcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gbC5hYm9ydCgpLG59LG9uOmZ1bmN0aW9uKCl7dmFyIHQ9YS5vbi5hcHBseShhLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1hP246dH19LG51bGwhPWUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjazogIitlKTtyZXR1cm4gbi5nZXQoZSl9cmV0dXJuIG59ZnVuY3Rpb24gZTAodCxlKXtyZXR1cm4gZnVuY3Rpb24obixpKXt2YXIgcj10MChuKS5taW1lVHlwZSh0KS5yZXNwb25zZShlKTtpZihudWxsIT1pKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgaSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIraSk7cmV0dXJuIHIuZ2V0KGkpfXJldHVybiByfX12YXIgbjA9ZTAoInRleHQvaHRtbCIsKGZ1bmN0aW9uKHQpe3JldHVybiBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0LnJlc3BvbnNlVGV4dCl9KSksaTA9ZTAoImFwcGxpY2F0aW9uL2pzb24iLChmdW5jdGlvbih0KXtyZXR1cm4gSlNPTi5wYXJzZSh0LnJlc3BvbnNlVGV4dCl9KSkscjA9ZTAoInRleHQvcGxhaW4iLChmdW5jdGlvbih0KXtyZXR1cm4gdC5yZXNwb25zZVRleHR9KSksbzA9ZTAoImFwcGxpY2F0aW9uL3htbCIsKGZ1bmN0aW9uKHQpe3ZhciBlPXQucmVzcG9uc2VYTUw7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJwYXJzZSBlcnJvciIpO3JldHVybiBlfSkpO2Z1bmN0aW9uIGEwKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSxyKXthcmd1bWVudHMubGVuZ3RoPDMmJihyPWksaT1udWxsKTt2YXIgbz10MChuKS5taW1lVHlwZSh0KTtyZXR1cm4gby5yb3c9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/by5yZXNwb25zZShzMChlLGk9dCkpOml9LG8ucm93KGkpLHI/by5nZXQocik6b319ZnVuY3Rpb24gczAodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQobi5yZXNwb25zZVRleHQsZSl9fXZhciBsMD1hMCgidGV4dC9jc3YiLEpnKSxjMD1hMCgidGV4dC90YWItc2VwYXJhdGVkLXZhbHVlcyIsYV8pO2Z1bmN0aW9uIHUwKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTp0Pj1lPzA6TmFOfWZ1bmN0aW9uIGgwKHQpe3JldHVybiAxPT09dC5sZW5ndGgmJih0PShmdW5jdGlvbiBlKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiB1MCh0KGUpLG4pfX0pKHQpKSx7bGVmdDpmdW5jdGlvbihlLG4saSxyKXtmb3IobnVsbD09aSYmKGk9MCksbnVsbD09ciYmKHI9ZS5sZW5ndGgpO2k8cjspe3ZhciBvPWkrcj4+PjE7dChlW29dLG4pPDA/aT1vKzE6cj1vfXJldHVybiBpfSxyaWdodDpmdW5jdGlvbihlLG4saSxyKXtmb3IobnVsbD09aSYmKGk9MCksbnVsbD09ciYmKHI9ZS5sZW5ndGgpO2k8cjspe3ZhciBvPWkrcj4+PjE7dChlW29dLG4pPjA/cj1vOmk9bysxfXJldHVybiBpfX19dmFyIGQwPWgwKHUwKS5yaWdodDtmdW5jdGlvbiBwMCh0KXtyZXR1cm4gbnVsbD09PXQ/TmFOOit0fXZhciBmMD1NYXRoLnNxcnQoNTApLG0wPU1hdGguc3FydCgxMCksZzA9TWF0aC5zcXJ0KDIpO2Z1bmN0aW9uIF8wKHQsZSxuKXt2YXIgaSxyLG8sYSxzPS0xO2lmKG49K24sKHQ9K3QpPT0oZT0rZSkmJm4+MClyZXR1cm5bdF07aWYoKGk9ZTx0KSYmKHI9dCx0PWUsZT1yKSwwPT09KGE9eTAodCxlLG4pKXx8IWlzRmluaXRlKGEpKXJldHVybltdO2lmKGE+MClmb3IodD1NYXRoLmNlaWwodC9hKSxlPU1hdGguZmxvb3IoZS9hKSxvPW5ldyBBcnJheShyPU1hdGguY2VpbChlLXQrMSkpOysrczxyOylvW3NdPSh0K3MpKmE7ZWxzZSBmb3IodD1NYXRoLmZsb29yKHQqYSksZT1NYXRoLmNlaWwoZSphKSxvPW5ldyBBcnJheShyPU1hdGguY2VpbCh0LWUrMSkpOysrczxyOylvW3NdPSh0LXMpL2E7cmV0dXJuIGkmJm8ucmV2ZXJzZSgpLG99ZnVuY3Rpb24geTAodCxlLG4pe3ZhciBpPShlLXQpL01hdGgubWF4KDAsbikscj1NYXRoLmZsb29yKE1hdGgubG9nKGkpL01hdGguTE4xMCksbz1pL01hdGgucG93KDEwLHIpO3JldHVybiByPj0wPyhvPj1mMD8xMDpvPj1tMD81Om8+PWcwPzI6MSkqTWF0aC5wb3coMTAscik6LU1hdGgucG93KDEwLC1yKS8obz49ZjA/MTA6bz49bTA/NTpvPj1nMD8yOjEpfWZ1bmN0aW9uIHYwKHQsZSxuKXt2YXIgaT1NYXRoLmFicyhlLXQpL01hdGgubWF4KDAsbikscj1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKGkpL01hdGguTE4xMCkpLG89aS9yO3JldHVybiBvPj1mMD9yKj0xMDpvPj1tMD9yKj01Om8+PWcwJiYocio9MiksZTx0Py1yOnJ9ZnVuY3Rpb24gYjAodCxlLG4pe2lmKG51bGw9PW4mJihuPXAwKSxpPXQubGVuZ3RoKXtpZigoZT0rZSk8PTB8fGk8MilyZXR1cm4rbih0WzBdLDAsdCk7aWYoZT49MSlyZXR1cm4rbih0W2ktMV0saS0xLHQpO3ZhciBpLHI9KGktMSkqZSxvPU1hdGguZmxvb3IociksYT0rbih0W29dLG8sdCk7cmV0dXJuIGErKCtuKHRbbysxXSxvKzEsdCktYSkqKHItbyl9fXZhciB4MD0iJCI7ZnVuY3Rpb24gdzAoKXt9ZnVuY3Rpb24gUzAodCxlKXt2YXIgbj1uZXcgdzA7aWYodCBpbnN0YW5jZW9mIHcwKXQuZWFjaCgoZnVuY3Rpb24odCxlKXtuLnNldChlLHQpfSkpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSl7dmFyIGkscj0tMSxvPXQubGVuZ3RoO2lmKG51bGw9PWUpZm9yKDsrK3I8bzspbi5zZXQocix0W3JdKTtlbHNlIGZvcig7KytyPG87KW4uc2V0KGUoaT10W3JdLHIsdCksaSl9ZWxzZSBpZih0KWZvcih2YXIgYSBpbiB0KW4uc2V0KGEsdFthXSk7cmV0dXJuIG59ZnVuY3Rpb24gTTAoKXt9dzAucHJvdG90eXBlPVMwLnByb3RvdHlwZT17Y29uc3RydWN0b3I6dzAsaGFzOmZ1bmN0aW9uKHQpe3JldHVybiB4MCt0IGluIHRoaXN9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpc1t4MCt0XX0sc2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXNbeDArdF09ZSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9eDArdDtyZXR1cm4gZSBpbiB0aGlzJiZkZWxldGUgdGhpc1tlXX0sY2xlYXI6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcyl0WzBdPT09eDAmJmRlbGV0ZSB0aGlzW3RdfSxrZXlzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PXgwJiZ0LnB1c2goZS5zbGljZSgxKSk7cmV0dXJuIHR9LHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT14MCYmdC5wdXNoKHRoaXNbZV0pO3JldHVybiB0fSxlbnRyaWVzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PXgwJiZ0LnB1c2goe2tleTplLnNsaWNlKDEpLHZhbHVlOnRoaXNbZV19KTtyZXR1cm4gdH0sc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTA7Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PXgwJiYrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpaWYodFswXT09PXgwKXJldHVybiExO3JldHVybiEwfSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT14MCYmdCh0aGlzW2VdLGUuc2xpY2UoMSksdGhpcyl9fTt2YXIgRTA9UzAucHJvdG90eXBlO00wLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TTAsaGFzOkUwLmhhcyxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbeDArKHQrPSIiKV09dCx0aGlzfSxyZW1vdmU6RTAucmVtb3ZlLGNsZWFyOkUwLmNsZWFyLHZhbHVlczpFMC5rZXlzLHNpemU6RTAuc2l6ZSxlbXB0eTpFMC5lbXB0eSxlYWNoOkUwLmVhY2h9O3ZhciBUMD1BcnJheS5wcm90b3R5cGUsQzA9VDAubWFwLEEwPVQwLnNsaWNlLGswPXtuYW1lOiJpbXBsaWNpdCJ9O2Z1bmN0aW9uIEwwKHQpe3ZhciBlPVMwKCksbj1bXSxpPWswO2Z1bmN0aW9uIHIocil7dmFyIG89cisiIixhPWUuZ2V0KG8pO2lmKCFhKXtpZihpIT09azApcmV0dXJuIGk7ZS5zZXQobyxhPW4ucHVzaChyKSl9cmV0dXJuIHRbKGEtMSkldC5sZW5ndGhdfXJldHVybiB0PW51bGw9PXQ/W106QTAuY2FsbCh0KSxyLmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbi5zbGljZSgpO249W10sZT1TMCgpO2Zvcih2YXIgaSxvLGE9LTEscz10Lmxlbmd0aDsrK2E8czspZS5oYXMobz0oaT10W2FdKSsiIil8fGUuc2V0KG8sbi5wdXNoKGkpKTtyZXR1cm4gcn0sci5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1BMC5jYWxsKGUpLHIpOnQuc2xpY2UoKX0sci51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQscik6aX0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEwwKCkuZG9tYWluKG4pLnJhbmdlKHQpLnVua25vd24oaSl9LHJ9ZnVuY3Rpb24gUDAoKXt2YXIgdCxlLG49TDAoKS51bmtub3duKHZvaWQgMCksaT1uLmRvbWFpbixyPW4ucmFuZ2Usbz1bMCwxXSxhPSExLHM9MCxsPTAsYz0uNTtmdW5jdGlvbiB1KCl7dmFyIG49aSgpLmxlbmd0aCx1PW9bMV08b1swXSxoPW9bdS0wXSxkPW9bMS11XTt0PShkLWgpL01hdGgubWF4KDEsbi1zKzIqbCksYSYmKHQ9TWF0aC5mbG9vcih0KSksaCs9KGQtaC10KihuLXMpKSpjLGU9dCooMS1zKSxhJiYoaD1NYXRoLnJvdW5kKGgpLGU9TWF0aC5yb3VuZChlKSk7dmFyIHA9KGZ1bmN0aW9uIGYodCxlLG4pe3Q9K3QsZT0rZSxuPShyPWFyZ3VtZW50cy5sZW5ndGgpPDI/KGU9dCx0PTAsMSk6cjwzPzE6K247Zm9yKHZhciBpPS0xLHI9MHxNYXRoLm1heCgwLE1hdGguY2VpbCgoZS10KS9uKSksbz1uZXcgQXJyYXkocik7KytpPHI7KW9baV09dCtpKm47cmV0dXJuIG99KShuKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBoK3QqZX0pKTtyZXR1cm4gcih1P3AucmV2ZXJzZSgpOnApfXJldHVybiBkZWxldGUgbi51bmtub3duLG4uZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpKHQpLHUoKSk6aSgpfSxuLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPVsrdFswXSwrdFsxXV0sdSgpKTpvLnNsaWNlKCl9LG4ucmFuZ2VSb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gbz1bK3RbMF0sK3RbMV1dLGE9ITAsdSgpfSxuLmJhbmR3aWR0aD1mdW5jdGlvbigpe3JldHVybiBlfSxuLnN0ZXA9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sbi5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0hIXQsdSgpKTphfSxuLnBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9bD1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHUoKSk6c30sbi5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSx1KCkpOnN9LG4ucGFkZGluZ091dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSksdSgpKTpsfSxuLmFsaWduPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSksdSgpKTpjfSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gUDAoKS5kb21haW4oaSgpKS5yYW5nZShvKS5yb3VuZChhKS5wYWRkaW5nSW5uZXIocykucGFkZGluZ091dGVyKGwpLmFsaWduKGMpfSx1KCl9ZnVuY3Rpb24gTjAodCl7dmFyIGU9dC5jb3B5O3JldHVybiB0LnBhZGRpbmc9dC5wYWRkaW5nT3V0ZXIsZGVsZXRlIHQucGFkZGluZ0lubmVyLGRlbGV0ZSB0LnBhZGRpbmdPdXRlcix0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gTjAoZSgpKX0sdH1mdW5jdGlvbiBJMCh0LGUsbil7dC5wcm90b3R5cGU9ZS5wcm90b3R5cGU9bixuLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24gUjAodCxlKXt2YXIgbj1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIGkgaW4gZSluW2ldPWVbaV07cmV0dXJuIG59ZnVuY3Rpb24gTzAoKXt9dmFyIHowPS43LEQwPTEvejAsQjA9IlxccyooWystXT9cXGQrKVxccyoiLEgwPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLEYwPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixWMD0vXiMoWzAtOWEtZl17Myw4fSkkLyxVMD1uZXcgUmVnRXhwKCJecmdiXFwoIitbQjAsQjAsQjBdKyJcXCkkIiksajA9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW0YwLEYwLEYwXSsiXFwpJCIpLEcwPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbQjAsQjAsQjAsSDBdKyJcXCkkIiksVzA9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tGMCxGMCxGMCxIMF0rIlxcKSQiKSxxMD1uZXcgUmVnRXhwKCJeaHNsXFwoIitbSDAsRjAsRjBdKyJcXCkkIiksWTA9bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1tIMCxGMCxGMCxIMF0rIlxcKSQiKSxYMD17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtmdW5jdGlvbiAkMCgpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpfWZ1bmN0aW9uIEswKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCl9ZnVuY3Rpb24gWjAodCl7dmFyIGUsbjtyZXR1cm4gdD0odCsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKGU9VjAuZXhlYyh0KSk/KG49ZVsxXS5sZW5ndGgsZT1wYXJzZUludChlWzFdLDE2KSw2PT09bj9KMChlKTozPT09bj9uZXcgbjIoZT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgxNSZlKTw8NHwxNSZlLDEpOjg9PT1uP1EwKGU+PjI0JjI1NSxlPj4xNiYyNTUsZT4+OCYyNTUsKDI1NSZlKS8yNTUpOjQ9PT1uP1EwKGU+PjEyJjE1fGU+PjgmMjQwLGU+PjgmMTV8ZT4+NCYyNDAsZT4+NCYxNXwyNDAmZSwoKDE1JmUpPDw0fDE1JmUpLzI1NSk6bnVsbCk6KGU9VTAuZXhlYyh0KSk/bmV3IG4yKGVbMV0sZVsyXSxlWzNdLDEpOihlPWowLmV4ZWModCkpP25ldyBuMigyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCwxKTooZT1HMC5leGVjKHQpKT9RMChlWzFdLGVbMl0sZVszXSxlWzRdKTooZT1XMC5leGVjKHQpKT9RMCgyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCxlWzRdKTooZT1xMC5leGVjKHQpKT9hMihlWzFdLGVbMl0vMTAwLGVbM10vMTAwLDEpOihlPVkwLmV4ZWModCkpP2EyKGVbMV0sZVsyXS8xMDAsZVszXS8xMDAsZVs0XSk6WDAuaGFzT3duUHJvcGVydHkodCk/SjAoWDBbdF0pOiJ0cmFuc3BhcmVudCI9PT10P25ldyBuMihOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIEowKHQpe3JldHVybiBuZXcgbjIodD4+MTYmMjU1LHQ+PjgmMjU1LDI1NSZ0LDEpfWZ1bmN0aW9uIFEwKHQsZSxuLGkpe3JldHVybiBpPD0wJiYodD1lPW49TmFOKSxuZXcgbjIodCxlLG4saSl9ZnVuY3Rpb24gdDIodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBPMHx8KHQ9WjAodCkpLHQ/bmV3IG4yKCh0PXQucmdiKCkpLnIsdC5nLHQuYix0Lm9wYWNpdHkpOm5ldyBuMn1mdW5jdGlvbiBlMih0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dDIodCk6bmV3IG4yKHQsZSxuLG51bGw9PWk/MTppKX1mdW5jdGlvbiBuMih0LGUsbixpKXt0aGlzLnI9K3QsdGhpcy5nPStlLHRoaXMuYj0rbix0aGlzLm9wYWNpdHk9K2l9ZnVuY3Rpb24gaTIoKXtyZXR1cm4iIyIrbzIodGhpcy5yKStvMih0aGlzLmcpK28yKHRoaXMuYil9ZnVuY3Rpb24gcjIoKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX1mdW5jdGlvbiBvMih0KXtyZXR1cm4oKHQ9TWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0KXx8MCkpKTwxNj8iMCI6IiIpK3QudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIGEyKHQsZSxuLGkpe3JldHVybiBpPD0wP3Q9ZT1uPU5hTjpuPD0wfHxuPj0xP3Q9ZT1OYU46ZTw9MCYmKHQ9TmFOKSxuZXcgbDIodCxlLG4saSl9ZnVuY3Rpb24gczIodCl7aWYodCBpbnN0YW5jZW9mIGwyKXJldHVybiBuZXcgbDIodC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YgTzB8fCh0PVowKHQpKSwhdClyZXR1cm4gbmV3IGwyO2lmKHQgaW5zdGFuY2VvZiBsMilyZXR1cm4gdDt2YXIgZT0odD10LnJnYigpKS5yLzI1NSxuPXQuZy8yNTUsaT10LmIvMjU1LHI9TWF0aC5taW4oZSxuLGkpLG89TWF0aC5tYXgoZSxuLGkpLGE9TmFOLHM9by1yLGw9KG8rcikvMjtyZXR1cm4gcz8oYT1lPT09bz8obi1pKS9zKzYqKG48aSk6bj09PW8/KGktZSkvcysyOihlLW4pL3MrNCxzLz1sPC41P28rcjoyLW8tcixhKj02MCk6cz1sPjAmJmw8MT8wOmEsbmV3IGwyKGEscyxsLHQub3BhY2l0eSl9ZnVuY3Rpb24gbDIodCxlLG4saSl7dGhpcy5oPSt0LHRoaXMucz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIGMyKHQsZSxuKXtyZXR1cm4gMjU1Kih0PDYwP2UrKG4tZSkqdC82MDp0PDE4MD9uOnQ8MjQwP2UrKG4tZSkqKDI0MC10KS82MDplKX1JMChPMCxaMCx7Y29weTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3Rvcix0aGlzLHQpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCl9LGhleDokMCxmb3JtYXRIZXg6JDAsZm9ybWF0SHNsOmZ1bmN0aW9uIHUyKCl7cmV0dXJuIHMyKHRoaXMpLmZvcm1hdEhzbCgpfSxmb3JtYXRSZ2I6SzAsdG9TdHJpbmc6SzB9KSxJMChuMixlMixSMChPMCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9EMDpNYXRoLnBvdyhEMCx0KSxuZXcgbjIodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/ejA6TWF0aC5wb3coejAsdCksbmV3IG4yKHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybi0uNTw9dGhpcy5yJiZ0aGlzLnI8MjU1LjUmJi0uNTw9dGhpcy5nJiZ0aGlzLmc8MjU1LjUmJi0uNTw9dGhpcy5iJiZ0aGlzLmI8MjU1LjUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxoZXg6aTIsZm9ybWF0SGV4OmkyLGZvcm1hdFJnYjpyMix0b1N0cmluZzpyMn0pKSxJMChsMiwoZnVuY3Rpb24gaDIodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3MyKHQpOm5ldyBsMih0LGUsbixudWxsPT1pPzE6aSl9KSxSMChPMCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9EMDpNYXRoLnBvdyhEMCx0KSxuZXcgbDIodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD96MDpNYXRoLnBvdyh6MCx0KSxuZXcgbDIodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmglMzYwKzM2MCoodGhpcy5oPDApLGU9aXNOYU4odCl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsbj10aGlzLmwsaT1uKyhuPC41P246MS1uKSplLHI9MipuLWk7cmV0dXJuIG5ldyBuMihjMih0Pj0yNDA/dC0yNDA6dCsxMjAscixpKSxjMih0LHIsaSksYzIodDwxMjA/dCsyNDA6dC0xMjAscixpKSx0aGlzLm9wYWNpdHkpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybigwPD10aGlzLnMmJnRoaXMuczw9MXx8aXNOYU4odGhpcy5zKSkmJjA8PXRoaXMubCYmdGhpcy5sPD0xJiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sZm9ybWF0SHNsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcGFjaXR5O3JldHVybigxPT09KHQ9aXNOYU4odCk/MTpNYXRoLm1heCgwLE1hdGgubWluKDEsdCkpKT8iaHNsKCI6ImhzbGEoIikrKHRoaXMuaHx8MCkrIiwgIisxMDAqKHRoaXMuc3x8MCkrIiUsICIrMTAwKih0aGlzLmx8fDApKyIlIisoMT09PXQ/IikiOiIsICIrdCsiKSIpfX0pKTt2YXIgZDI9TWF0aC5QSS8xODAscDI9MTgwL01hdGguUEksZjI9LS4xNDg2MSxtMj0xLjc4Mjc3LGcyPS0uMjkyMjcsXzI9LS45MDY0OSx5Mj0xLjk3Mjk0LHYyPXkyKl8yLGIyPXkyKm0yLHgyPW0yKmcyLV8yKmYyO2Z1bmN0aW9uIHcyKHQpe2lmKHQgaW5zdGFuY2VvZiBNMilyZXR1cm4gbmV3IE0yKHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7dCBpbnN0YW5jZW9mIG4yfHwodD10Mih0KSk7dmFyIGU9dC5nLzI1NSxuPXQuYi8yNTUsaT0oeDIqbit2MioodC5yLzI1NSktYjIqZSkvKHgyK3YyLWIyKSxyPW4taSxvPSh5MiooZS1pKS1nMipyKS9fMixhPU1hdGguc3FydChvKm8rcipyKS8oeTIqaSooMS1pKSkscz1hP01hdGguYXRhbjIobyxyKSpwMi0xMjA6TmFOO3JldHVybiBuZXcgTTIoczwwP3MrMzYwOnMsYSxpLHQub3BhY2l0eSl9ZnVuY3Rpb24gUzIodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3cyKHQpOm5ldyBNMih0LGUsbixudWxsPT1pPzE6aSl9ZnVuY3Rpb24gTTIodCxlLG4saSl7dGhpcy5oPSt0LHRoaXMucz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIEUyKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBUMih0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdCtuKmV9fWZ1bmN0aW9uIEMyKHQsZSl7dmFyIG49ZS10O3JldHVybiBuP1QyKHQsbik6RTIoaXNOYU4odCk/ZTp0KX1JMChNMixTMixSMChPMCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9EMDpNYXRoLnBvdyhEMCx0KSxuZXcgTTIodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD96MDpNYXRoLnBvdyh6MCx0KSxuZXcgTTIodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD1pc05hTih0aGlzLmgpPzA6KHRoaXMuaCsxMjApKmQyLGU9K3RoaXMubCxuPWlzTmFOKHRoaXMucyk/MDp0aGlzLnMqZSooMS1lKSxpPU1hdGguY29zKHQpLHI9TWF0aC5zaW4odCk7cmV0dXJuIG5ldyBuMigyNTUqKGUrbiooZjIqaSttMipyKSksMjU1KihlK24qKGcyKmkrXzIqcikpLDI1NSooZStuKih5MippKSksdGhpcy5vcGFjaXR5KX19KSk7dmFyIEEyPShmdW5jdGlvbiB0KGUpe3ZhciBuPShmdW5jdGlvbiBpKHQpe3JldHVybiAxPT0odD0rdCk/QzI6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gbi1lPyhmdW5jdGlvbiBpKHQsZSxuKXtyZXR1cm4gdD1NYXRoLnBvdyh0LG4pLGU9TWF0aC5wb3coZSxuKS10LG49MS9uLGZ1bmN0aW9uKGkpe3JldHVybiBNYXRoLnBvdyh0K2kqZSxuKX19KShlLG4sdCk6RTIoaXNOYU4oZSk/bjplKX19KShlKTtmdW5jdGlvbiByKHQsZSl7dmFyIGk9bigodD1lMih0KSkuciwoZT1lMihlKSkucikscj1uKHQuZyxlLmcpLG89bih0LmIsZS5iKSxhPUMyKHQub3BhY2l0eSxlLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5yPWkoZSksdC5nPXIoZSksdC5iPW8oZSksdC5vcGFjaXR5PWEoZSksdCsiIn19cmV0dXJuIHIuZ2FtbWE9dCxyfSkoMSk7ZnVuY3Rpb24gazIodCxlKXtlfHwoZT1bXSk7dmFyIG4saT10P01hdGgubWluKGUubGVuZ3RoLHQubGVuZ3RoKTowLHI9ZS5zbGljZSgpO3JldHVybiBmdW5jdGlvbihvKXtmb3Iobj0wO248aTsrK24pcltuXT10W25dKigxLW8pK2Vbbl0qbztyZXR1cm4gcn19ZnVuY3Rpb24gTDIodCxlKXt2YXIgbixpPWU/ZS5sZW5ndGg6MCxyPXQ/TWF0aC5taW4oaSx0Lmxlbmd0aCk6MCxvPW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShpKTtmb3Iobj0wO248cjsrK24pb1tuXT1EMih0W25dLGVbbl0pO2Zvcig7bjxpOysrbilhW25dPWVbbl07cmV0dXJuIGZ1bmN0aW9uKHQpe2ZvcihuPTA7bjxyOysrbilhW25dPW9bbl0odCk7cmV0dXJuIGF9fWZ1bmN0aW9uIFAyKHQsZSl7dmFyIG49bmV3IERhdGU7cmV0dXJuIHQ9K3QsZT0rZSxmdW5jdGlvbihpKXtyZXR1cm4gbi5zZXRUaW1lKHQqKDEtaSkrZSppKSxufX1mdW5jdGlvbiBOMih0LGUpe3JldHVybiB0PSt0LGU9K2UsZnVuY3Rpb24obil7cmV0dXJuIHQqKDEtbikrZSpufX1mdW5jdGlvbiBJMih0LGUpe3ZhciBuLGk9e30scj17fTtmb3IobiBpbiBudWxsIT09dCYmIm9iamVjdCI9PXR5cGVvZiB0fHwodD17fSksbnVsbCE9PWUmJiJvYmplY3QiPT10eXBlb2YgZXx8KGU9e30pLGUpbiBpbiB0P2lbbl09RDIodFtuXSxlW25dKTpyW25dPWVbbl07cmV0dXJuIGZ1bmN0aW9uKHQpe2ZvcihuIGluIGkpcltuXT1pW25dKHQpO3JldHVybiByfX12YXIgUjI9L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLE8yPW5ldyBSZWdFeHAoUjIuc291cmNlLCJnIik7ZnVuY3Rpb24gejIodCxlKXt2YXIgbixpLHIsbz1SMi5sYXN0SW5kZXg9TzIubGFzdEluZGV4PTAsYT0tMSxzPVtdLGw9W107Zm9yKHQrPSIiLGUrPSIiOyhuPVIyLmV4ZWModCkpJiYoaT1PMi5leGVjKGUpKTspKHI9aS5pbmRleCk+byYmKHI9ZS5zbGljZShvLHIpLHNbYV0/c1thXSs9cjpzWysrYV09ciksKG49blswXSk9PT0oaT1pWzBdKT9zW2FdP3NbYV0rPWk6c1srK2FdPWk6KHNbKythXT1udWxsLGwucHVzaCh7aTphLHg6TjIobixpKX0pKSxvPU8yLmxhc3RJbmRleDtyZXR1cm4gbzxlLmxlbmd0aCYmKHI9ZS5zbGljZShvKSxzW2FdP3NbYV0rPXI6c1srK2FdPXIpLHMubGVuZ3RoPDI/bFswXT8oZnVuY3Rpb24gYyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSkrIiJ9fSkobFswXS54KTooZnVuY3Rpb24gdSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KShlKTooZT1sLmxlbmd0aCxmdW5jdGlvbih0KXtmb3IodmFyIG4saT0wO2k8ZTsrK2kpc1sobj1sW2ldKS5pXT1uLngodCk7cmV0dXJuIHMuam9pbigiIil9KX1mdW5jdGlvbiBEMih0LGUpe3ZhciBuLGk9dHlwZW9mIGU7cmV0dXJuIG51bGw9PWV8fCJib29sZWFuIj09PWk/RTIoZSk6KCJudW1iZXIiPT09aT9OMjoic3RyaW5nIj09PWk/KG49WjAoZSkpPyhlPW4sQTIpOnoyOmUgaW5zdGFuY2VvZiBaMD9BMjplIGluc3RhbmNlb2YgRGF0ZT9QMjooZnVuY3Rpb24gcih0KXtyZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KHQpJiYhKHQgaW5zdGFuY2VvZiBEYXRhVmlldyl9KShlKT9rMjpBcnJheS5pc0FycmF5KGUpP0wyOiJmdW5jdGlvbiIhPXR5cGVvZiBlLnZhbHVlT2YmJiJmdW5jdGlvbiIhPXR5cGVvZiBlLnRvU3RyaW5nfHxpc05hTihlKT9JMjpOMikodCxlKX1mdW5jdGlvbiBCMih0LGUpe3JldHVybiB0PSt0LGU9K2UsZnVuY3Rpb24obil7cmV0dXJuIE1hdGgucm91bmQodCooMS1uKStlKm4pfX1mdW5jdGlvbiBIMih0KXtyZXR1cm4oZnVuY3Rpb24gZShuKXtmdW5jdGlvbiBpKGUsaSl7dmFyIHI9dCgoZT1TMihlKSkuaCwoaT1TMihpKSkuaCksbz1DMihlLnMsaS5zKSxhPUMyKGUubCxpLmwpLHM9QzIoZS5vcGFjaXR5LGkub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmg9cih0KSxlLnM9byh0KSxlLmw9YShNYXRoLnBvdyh0LG4pKSxlLm9wYWNpdHk9cyh0KSxlKyIifX1yZXR1cm4gbj0rbixpLmdhbW1hPWUsaX0pKDEpfUgyKChmdW5jdGlvbiBGMih0LGUpe3ZhciBuPWUtdDtyZXR1cm4gbj9UMih0LG4+MTgwfHxuPC0xODA/bi0zNjAqTWF0aC5yb3VuZChuLzM2MCk6bik6RTIoaXNOYU4odCk/ZTp0KX0pKTt2YXIgVjI9SDIoQzIpO2Z1bmN0aW9uIFUyKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBqMih0KXtyZXR1cm4rdH12YXIgRzI9WzAsMV07ZnVuY3Rpb24gVzIodCxlKXtyZXR1cm4oZS09dD0rdCk/ZnVuY3Rpb24obil7cmV0dXJuKG4tdCkvZX06VTIoZSl9ZnVuY3Rpb24gcTIodCxlLG4saSl7dmFyIHI9dFswXSxvPXRbMV0sYT1lWzBdLHM9ZVsxXTtyZXR1cm4gbzxyPyhyPW4obyxyKSxhPWkocyxhKSk6KHI9bihyLG8pLGE9aShhLHMpKSxmdW5jdGlvbih0KXtyZXR1cm4gYShyKHQpKX19ZnVuY3Rpb24gWTIodCxlLG4saSl7dmFyIHI9TWF0aC5taW4odC5sZW5ndGgsZS5sZW5ndGgpLTEsbz1uZXcgQXJyYXkociksYT1uZXcgQXJyYXkocikscz0tMTtmb3IodFtyXTx0WzBdJiYodD10LnNsaWNlKCkucmV2ZXJzZSgpLGU9ZS5zbGljZSgpLnJldmVyc2UoKSk7KytzPHI7KW9bc109bih0W3NdLHRbcysxXSksYVtzXT1pKGVbc10sZVtzKzFdKTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49ZDAodCxlLDEsciktMTtyZXR1cm4gYVtuXShvW25dKGUpKX19ZnVuY3Rpb24gWDIodCxlKXtyZXR1cm4gZS5kb21haW4odC5kb21haW4oKSkucmFuZ2UodC5yYW5nZSgpKS5pbnRlcnBvbGF0ZSh0LmludGVycG9sYXRlKCkpLmNsYW1wKHQuY2xhbXAoKSl9ZnVuY3Rpb24gJDIodCxlKXt2YXIgbixpLHIsbz1HMixhPUcyLHM9RDIsbD0hMTtmdW5jdGlvbiBjKCl7cmV0dXJuIG49TWF0aC5taW4oby5sZW5ndGgsYS5sZW5ndGgpPjI/WTI6cTIsaT1yPW51bGwsdX1mdW5jdGlvbiB1KGUpe3JldHVybihpfHwoaT1uKG8sYSxsPyhmdW5jdGlvbiByKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciBpPXQoZT0rZSxuPStuKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ8PWU/MDp0Pj1uPzE6aSh0KX19fSkodCk6dCxzKSkpKCtlKX1yZXR1cm4gdS5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuKHJ8fChyPW4oYSxvLFcyLGw/KGZ1bmN0aW9uIGkodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIGk9dChlPStlLG49K24pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdDw9MD9lOnQ+PTE/bjppKHQpfX19KShlKTplKSkpKCt0KX0sdS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89QzAuY2FsbCh0LGoyKSxjKCkpOm8uc2xpY2UoKX0sdS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1BMC5jYWxsKHQpLGMoKSk6YS5zbGljZSgpfSx1LnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGE9QTAuY2FsbCh0KSxzPUIyLGMoKX0sdS5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD0hIXQsYygpKTpsfSx1LmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPXQsYygpKTpzfSxjKCl9ZnVuY3Rpb24gSzIodCxlKXtpZigobj0odD1lP3QudG9FeHBvbmVudGlhbChlLTEpOnQudG9FeHBvbmVudGlhbCgpKS5pbmRleE9mKCJlIikpPDApcmV0dXJuIG51bGw7dmFyIG4saT10LnNsaWNlKDAsbik7cmV0dXJuW2kubGVuZ3RoPjE/aVswXStpLnNsaWNlKDIpOmksK3Quc2xpY2UobisxKV19ZnVuY3Rpb24gWjIodCl7cmV0dXJuKHQ9SzIoTWF0aC5hYnModCkpKT90WzFdOk5hTn12YXIgSjIsUTI9L14oPzooLik/KFs8Pj1eXSkpPyhbK1wtKCBdKT8oWyQjXSk/KDApPyhcZCspPygsKT8oXC5cZCspPyh+KT8oW2EteiVdKT8kL2k7ZnVuY3Rpb24gdDUodCl7aWYoIShlPVEyLmV4ZWModCkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIrdCk7dmFyIGU7cmV0dXJuIG5ldyBlNSh7ZmlsbDplWzFdLGFsaWduOmVbMl0sc2lnbjplWzNdLHN5bWJvbDplWzRdLHplcm86ZVs1XSx3aWR0aDplWzZdLGNvbW1hOmVbN10scHJlY2lzaW9uOmVbOF0mJmVbOF0uc2xpY2UoMSksdHJpbTplWzldLHR5cGU6ZVsxMF19KX1mdW5jdGlvbiBlNSh0KXt0aGlzLmZpbGw9dm9pZCAwPT09dC5maWxsPyIgIjp0LmZpbGwrIiIsdGhpcy5hbGlnbj12b2lkIDA9PT10LmFsaWduPyI+Ijp0LmFsaWduKyIiLHRoaXMuc2lnbj12b2lkIDA9PT10LnNpZ24/Ii0iOnQuc2lnbisiIix0aGlzLnN5bWJvbD12b2lkIDA9PT10LnN5bWJvbD8iIjp0LnN5bWJvbCsiIix0aGlzLnplcm89ISF0Lnplcm8sdGhpcy53aWR0aD12b2lkIDA9PT10LndpZHRoP3ZvaWQgMDordC53aWR0aCx0aGlzLmNvbW1hPSEhdC5jb21tYSx0aGlzLnByZWNpc2lvbj12b2lkIDA9PT10LnByZWNpc2lvbj92b2lkIDA6K3QucHJlY2lzaW9uLHRoaXMudHJpbT0hIXQudHJpbSx0aGlzLnR5cGU9dm9pZCAwPT09dC50eXBlPyIiOnQudHlwZSsiIn1mdW5jdGlvbiBuNSh0LGUpe3ZhciBuPUsyKHQsZSk7aWYoIW4pcmV0dXJuIHQrIiI7dmFyIGk9blswXSxyPW5bMV07cmV0dXJuIHI8MD8iMC4iK25ldyBBcnJheSgtcikuam9pbigiMCIpK2k6aS5sZW5ndGg+cisxP2kuc2xpY2UoMCxyKzEpKyIuIitpLnNsaWNlKHIrMSk6aStuZXcgQXJyYXkoci1pLmxlbmd0aCsyKS5qb2luKCIwIil9dDUucHJvdG90eXBlPWU1LnByb3RvdHlwZSxlNS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxsK3RoaXMuYWxpZ24rdGhpcy5zaWduK3RoaXMuc3ltYm9sKyh0aGlzLnplcm8/IjAiOiIiKSsodm9pZCAwPT09dGhpcy53aWR0aD8iIjpNYXRoLm1heCgxLDB8dGhpcy53aWR0aCkpKyh0aGlzLmNvbW1hPyIsIjoiIikrKHZvaWQgMD09PXRoaXMucHJlY2lzaW9uPyIiOiIuIitNYXRoLm1heCgwLDB8dGhpcy5wcmVjaXNpb24pKSsodGhpcy50cmltPyJ+IjoiIikrdGhpcy50eXBlfTt2YXIgaTU9eyIlIjpmdW5jdGlvbih0LGUpe3JldHVybigxMDAqdCkudG9GaXhlZChlKX0sYjpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZygyKX0sYzpmdW5jdGlvbih0KXtyZXR1cm4gdCsiIn0sZDpmdW5jdGlvbiByNSh0KXtyZXR1cm4gTWF0aC5hYnModD1NYXRoLnJvdW5kKHQpKT49MWUyMT90LnRvTG9jYWxlU3RyaW5nKCJlbiIpLnJlcGxhY2UoLywvZywiIik6dC50b1N0cmluZygxMCl9LGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50b0V4cG9uZW50aWFsKGUpfSxmOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9GaXhlZChlKX0sZzpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRvUHJlY2lzaW9uKGUpfSxvOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDgpfSxwOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG41KDEwMCp0LGUpfSxyOm41LHM6ZnVuY3Rpb24gbzUodCxlKXt2YXIgbj1LMih0LGUpO2lmKCFuKXJldHVybiB0KyIiO3ZhciBpPW5bMF0scj1uWzFdLG89ci0oSjI9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3Ioci8zKSkpKSsxLGE9aS5sZW5ndGg7cmV0dXJuIG89PT1hP2k6bz5hP2krbmV3IEFycmF5KG8tYSsxKS5qb2luKCIwIik6bz4wP2kuc2xpY2UoMCxvKSsiLiIraS5zbGljZShvKToiMC4iK25ldyBBcnJheSgxLW8pLmpvaW4oIjAiKStLMih0LE1hdGgubWF4KDAsZStvLTEpKVswXX0sWDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX0seDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZygxNil9fTtmdW5jdGlvbiBhNSh0KXtyZXR1cm4gdH12YXIgczUsbDUsYzUsdTU9QXJyYXkucHJvdG90eXBlLm1hcCxoNT1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIsK1IiwibSIsIiIsImsiLCJNIiwiRyIsIlQiLCJQIiwiRSIsIloiLCJZIl07ZnVuY3Rpb24gZDUodCl7dmFyIGU9dC5kb21haW47cmV0dXJuIHQudGlja3M9ZnVuY3Rpb24odCl7dmFyIG49ZSgpO3JldHVybiBfMChuWzBdLG5bbi5sZW5ndGgtMV0sbnVsbD09dD8xMDp0KX0sdC50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsbil7cmV0dXJuKGZ1bmN0aW9uIGkodCxlLG4pe3ZhciBpLHI9dFswXSxvPXRbdC5sZW5ndGgtMV0sYT12MChyLG8sbnVsbD09ZT8xMDplKTtzd2l0Y2goKG49dDUobnVsbD09bj8iLGYiOm4pKS50eXBlKXtjYXNlInMiOnZhciBzPU1hdGgubWF4KE1hdGguYWJzKHIpLE1hdGguYWJzKG8pKTtyZXR1cm4gbnVsbCE9bi5wcmVjaXNpb258fGlzTmFOKGk9KGZ1bmN0aW9uIGwodCxlKXtyZXR1cm4gTWF0aC5tYXgoMCwzKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihaMihlKS8zKSkpLVoyKE1hdGguYWJzKHQpKSl9KShhLHMpKXx8KG4ucHJlY2lzaW9uPWkpLGM1KG4scyk7Y2FzZSIiOmNhc2UiZSI6Y2FzZSJnIjpjYXNlInAiOmNhc2UiciI6bnVsbCE9bi5wcmVjaXNpb258fGlzTmFOKGk9KGZ1bmN0aW9uIGModCxlKXtyZXR1cm4gdD1NYXRoLmFicyh0KSxlPU1hdGguYWJzKGUpLXQsTWF0aC5tYXgoMCxaMihlKS1aMih0KSkrMX0pKGEsTWF0aC5tYXgoTWF0aC5hYnMociksTWF0aC5hYnMobykpKSl8fChuLnByZWNpc2lvbj1pLSgiZSI9PT1uLnR5cGUpKTticmVhaztjYXNlImYiOmNhc2UiJSI6bnVsbCE9bi5wcmVjaXNpb258fGlzTmFOKGk9KGZ1bmN0aW9uIHUodCl7cmV0dXJuIE1hdGgubWF4KDAsLVoyKE1hdGguYWJzKHQpKSl9KShhKSl8fChuLnByZWNpc2lvbj1pLTIqKCIlIj09PW4udHlwZSkpfXJldHVybiBsNShuKX0pKGUoKSx0LG4pfSx0Lm5pY2U9ZnVuY3Rpb24obil7bnVsbD09biYmKG49MTApO3ZhciBpLHI9ZSgpLG89MCxhPXIubGVuZ3RoLTEscz1yW29dLGw9clthXTtyZXR1cm4gbDxzJiYoaT1zLHM9bCxsPWksaT1vLG89YSxhPWkpLChpPXkwKHMsbCxuKSk+MD9pPXkwKHM9TWF0aC5mbG9vcihzL2kpKmksbD1NYXRoLmNlaWwobC9pKSppLG4pOmk8MCYmKGk9eTAocz1NYXRoLmNlaWwocyppKS9pLGw9TWF0aC5mbG9vcihsKmkpL2ksbikpLGk+MD8ocltvXT1NYXRoLmZsb29yKHMvaSkqaSxyW2FdPU1hdGguY2VpbChsL2kpKmksZShyKSk6aTwwJiYocltvXT1NYXRoLmNlaWwocyppKS9pLHJbYV09TWF0aC5mbG9vcihsKmkpL2ksZShyKSksdH0sdH1mdW5jdGlvbiBwNSh0LGUpe3ZhciBuLGk9MCxyPSh0PXQuc2xpY2UoKSkubGVuZ3RoLTEsbz10W2ldLGE9dFtyXTtyZXR1cm4gYTxvJiYobj1pLGk9cixyPW4sbj1vLG89YSxhPW4pLHRbaV09ZS5mbG9vcihvKSx0W3JdPWUuY2VpbChhKSx0fWZ1bmN0aW9uIGY1KHQsZSl7cmV0dXJuKGU9TWF0aC5sb2coZS90KSk/ZnVuY3Rpb24obil7cmV0dXJuIE1hdGgubG9nKG4vdCkvZX06VTIoZSl9ZnVuY3Rpb24gbTUodCxlKXtyZXR1cm4gdDwwP2Z1bmN0aW9uKG4pe3JldHVybi1NYXRoLnBvdygtZSxuKSpNYXRoLnBvdygtdCwxLW4pfTpmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5wb3coZSxuKSpNYXRoLnBvdyh0LDEtbil9fWZ1bmN0aW9uIGc1KHQpe3JldHVybiBpc0Zpbml0ZSh0KT8rKCIxZSIrdCk6dDwwPzA6dH1mdW5jdGlvbiBfNSh0KXtyZXR1cm4gMTA9PT10P2c1OnQ9PT1NYXRoLkU/TWF0aC5leHA6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucG93KHQsZSl9fWZ1bmN0aW9uIHk1KHQpe3JldHVybiB0PT09TWF0aC5FP01hdGgubG9nOjEwPT09dCYmTWF0aC5sb2cxMHx8Mj09PXQmJk1hdGgubG9nMnx8KHQ9TWF0aC5sb2codCksZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubG9nKGUpL3R9KX1mdW5jdGlvbiB2NSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuLXQoLWUpfX1mdW5jdGlvbiBiNSh0LGUpe3JldHVybiB0PDA/LU1hdGgucG93KC10LGUpOk1hdGgucG93KHQsZSl9ZnVuY3Rpb24geDUoKXt2YXIgdD0xLGU9JDIoKGZ1bmN0aW9uIG4oZSxpKXtyZXR1cm4oaT1iNShpLHQpLShlPWI1KGUsdCkpKT9mdW5jdGlvbihuKXtyZXR1cm4oYjUobix0KS1lKS9pfTpVMihpKX0pLChmdW5jdGlvbiBpKGUsbil7cmV0dXJuIG49YjUobix0KS0oZT1iNShlLHQpKSxmdW5jdGlvbihpKXtyZXR1cm4gYjUoZStuKmksMS90KX19KSkscj1lLmRvbWFpbjtyZXR1cm4gZS5leHBvbmVudD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rZSxyKHIoKSkpOnR9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBYMihlLHg1KCkuZXhwb25lbnQodCkpfSxkNShlKX0hKGZ1bmN0aW9uIHc1KHQpe3M1PShmdW5jdGlvbiBlKHQpe3ZhciBlPXZvaWQgMD09PXQuZ3JvdXBpbmd8fHZvaWQgMD09PXQudGhvdXNhbmRzP2E1OihmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSl7Zm9yKHZhciByPW4ubGVuZ3RoLG89W10sYT0wLHM9dFswXSxsPTA7cj4wJiZzPjAmJihsK3MrMT5pJiYocz1NYXRoLm1heCgxLGktbCkpLG8ucHVzaChuLnN1YnN0cmluZyhyLT1zLHIrcykpLCEoKGwrPXMrMSk+aSkpOylzPXRbYT0oYSsxKSV0Lmxlbmd0aF07cmV0dXJuIG8ucmV2ZXJzZSgpLmpvaW4oZSl9fSkodTUuY2FsbCh0Lmdyb3VwaW5nLE51bWJlciksdC50aG91c2FuZHMrIiIpLGk9dm9pZCAwPT09dC5jdXJyZW5jeT8iIjp0LmN1cnJlbmN5WzBdKyIiLHI9dm9pZCAwPT09dC5jdXJyZW5jeT8iIjp0LmN1cnJlbmN5WzFdKyIiLG89dm9pZCAwPT09dC5kZWNpbWFsPyIuIjp0LmRlY2ltYWwrIiIsYT12b2lkIDA9PT10Lm51bWVyYWxzP2E1OihmdW5jdGlvbiBzKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9bMC05XS9nLChmdW5jdGlvbihlKXtyZXR1cm4gdFsrZV19KSl9fSkodTUuY2FsbCh0Lm51bWVyYWxzLFN0cmluZykpLGw9dm9pZCAwPT09dC5wZXJjZW50PyIlIjp0LnBlcmNlbnQrIiIsYz12b2lkIDA9PT10Lm1pbnVzPyItIjp0Lm1pbnVzKyIiLHU9dm9pZCAwPT09dC5uYW4/Ik5hTiI6dC5uYW4rIiI7ZnVuY3Rpb24gaCh0KXt2YXIgbj0odD10NSh0KSkuZmlsbCxzPXQuYWxpZ24saD10LnNpZ24sZD10LnN5bWJvbCxwPXQuemVybyxmPXQud2lkdGgsbT10LmNvbW1hLGc9dC5wcmVjaXNpb24sXz10LnRyaW0seT10LnR5cGU7Im4iPT09eT8obT0hMCx5PSJnIik6aTVbeV18fCh2b2lkIDA9PT1nJiYoZz0xMiksXz0hMCx5PSJnIiksKHB8fCIwIj09PW4mJiI9Ij09PXMpJiYocD0hMCxuPSIwIixzPSI9Iik7dmFyIHY9IiQiPT09ZD9pOiIjIj09PWQmJi9bYm94WF0vLnRlc3QoeSk/IjAiK3kudG9Mb3dlckNhc2UoKToiIixiPSIkIj09PWQ/cjovWyVwXS8udGVzdCh5KT9sOiIiLHg9aTVbeV0sdz0vW2RlZmdwcnMlXS8udGVzdCh5KTtmdW5jdGlvbiBTKHQpe3ZhciBpLHIsbCxkPXYsUz1iO2lmKCJjIj09PXkpUz14KHQpK1MsdD0iIjtlbHNle3ZhciBNPSh0PSt0KTwwfHwxL3Q8MDtpZih0PWlzTmFOKHQpP3U6eChNYXRoLmFicyh0KSxnKSxfJiYodD0oZnVuY3Rpb24gRSh0KXt0OmZvcih2YXIgZSxuPXQubGVuZ3RoLGk9MSxyPS0xO2k8bjsrK2kpc3dpdGNoKHRbaV0pe2Nhc2UiLiI6cj1lPWk7YnJlYWs7Y2FzZSIwIjowPT09ciYmKHI9aSksZT1pO2JyZWFrO2RlZmF1bHQ6aWYoISt0W2ldKWJyZWFrIHQ7cj4wJiYocj0wKX1yZXR1cm4gcj4wP3Quc2xpY2UoMCxyKSt0LnNsaWNlKGUrMSk6dH0pKHQpKSxNJiYwPT0rdCYmIisiIT09aCYmKE09ITEpLGQ9KE0/IigiPT09aD9oOmM6Ii0iPT09aHx8IigiPT09aD8iIjpoKStkLFM9KCJzIj09PXk/aDVbOCtKMi8zXToiIikrUysoTSYmIigiPT09aD8iKSI6IiIpLHcpZm9yKGk9LTEscj10Lmxlbmd0aDsrK2k8cjspaWYoNDg+KGw9dC5jaGFyQ29kZUF0KGkpKXx8bD41Nyl7Uz0oNDY9PT1sP28rdC5zbGljZShpKzEpOnQuc2xpY2UoaSkpK1MsdD10LnNsaWNlKDAsaSk7YnJlYWt9fW0mJiFwJiYodD1lKHQsMS8wKSk7dmFyIFQ9ZC5sZW5ndGgrdC5sZW5ndGgrUy5sZW5ndGgsQz1UPGY/bmV3IEFycmF5KGYtVCsxKS5qb2luKG4pOiIiO3N3aXRjaChtJiZwJiYodD1lKEMrdCxDLmxlbmd0aD9mLVMubGVuZ3RoOjEvMCksQz0iIikscyl7Y2FzZSI8Ijp0PWQrdCtTK0M7YnJlYWs7Y2FzZSI9Ijp0PWQrQyt0K1M7YnJlYWs7Y2FzZSJeIjp0PUMuc2xpY2UoMCxUPUMubGVuZ3RoPj4xKStkK3QrUytDLnNsaWNlKFQpO2JyZWFrO2RlZmF1bHQ6dD1DK2QrdCtTfXJldHVybiBhKHQpfXJldHVybiBnPXZvaWQgMD09PWc/NjovW2dwcnNdLy50ZXN0KHkpP01hdGgubWF4KDEsTWF0aC5taW4oMjEsZykpOk1hdGgubWF4KDAsTWF0aC5taW4oMjAsZykpLFMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdCsiIn0sU31yZXR1cm57Zm9ybWF0OmgsZm9ybWF0UHJlZml4OmZ1bmN0aW9uIGQodCxlKXt2YXIgbj1oKCgodD10NSh0KSkudHlwZT0iZiIsdCkpLGk9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoWjIoZSkvMykpKSxyPU1hdGgucG93KDEwLC1pKSxvPWg1WzgraS8zXTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4ocip0KStvfX19fSkodCksbDU9czUuZm9ybWF0LGM1PXM1LmZvcm1hdFByZWZpeH0pKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXSxtaW51czoiLSJ9KTt2YXIgUzU9bmV3IERhdGUsTTU9bmV3IERhdGU7ZnVuY3Rpb24gRTUodCxlLG4saSl7ZnVuY3Rpb24gcihlKXtyZXR1cm4gdChlPTA9PT1hcmd1bWVudHMubGVuZ3RoP25ldyBEYXRlOm5ldyBEYXRlKCtlKSksZX1yZXR1cm4gci5mbG9vcj1mdW5jdGlvbihlKXtyZXR1cm4gdChlPW5ldyBEYXRlKCtlKSksZX0sci5jZWlsPWZ1bmN0aW9uKG4pe3JldHVybiB0KG49bmV3IERhdGUobi0xKSksZShuLDEpLHQobiksbn0sci5yb3VuZD1mdW5jdGlvbih0KXt2YXIgZT1yKHQpLG49ci5jZWlsKHQpO3JldHVybiB0LWU8bi10P2U6bn0sci5vZmZzZXQ9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZSh0PW5ldyBEYXRlKCt0KSxudWxsPT1uPzE6TWF0aC5mbG9vcihuKSksdH0sci5yYW5nZT1mdW5jdGlvbihuLGksbyl7dmFyIGEscz1bXTtpZihuPXIuY2VpbChuKSxvPW51bGw9PW8/MTpNYXRoLmZsb29yKG8pLCEobjxpJiZvPjApKXJldHVybiBzO2Rve3MucHVzaChhPW5ldyBEYXRlKCtuKSksZShuLG8pLHQobil9d2hpbGUoYTxuJiZuPGkpO3JldHVybiBzfSxyLmZpbHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gRTUoKGZ1bmN0aW9uKGUpe2lmKGU+PWUpZm9yKDt0KGUpLCFuKGUpOyllLnNldFRpbWUoZS0xKX0pLChmdW5jdGlvbih0LGkpe2lmKHQ+PXQpaWYoaTwwKWZvcig7KytpPD0wOylmb3IoO2UodCwtMSksIW4odCk7KTtlbHNlIGZvcig7LS1pPj0wOylmb3IoO2UodCwxKSwhbih0KTspO30pKX0sbiYmKHIuY291bnQ9ZnVuY3Rpb24oZSxpKXtyZXR1cm4gUzUuc2V0VGltZSgrZSksTTUuc2V0VGltZSgraSksdChTNSksdChNNSksTWF0aC5mbG9vcihuKFM1LE01KSl9LHIuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9yLmZpbHRlcihpP2Z1bmN0aW9uKGUpe3JldHVybiBpKGUpJXQ9PTB9OmZ1bmN0aW9uKGUpe3JldHVybiByLmNvdW50KDAsZSkldD09MH0pOnI6bnVsbH0pLHJ9dmFyIFQ1PUU1KChmdW5jdGlvbigpe30pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybiBlLXR9KSk7VDUuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9FNSgoZnVuY3Rpb24oZSl7ZS5zZXRUaW1lKE1hdGguZmxvb3IoZS90KSp0KX0pLChmdW5jdGlvbihlLG4pe2Uuc2V0VGltZSgrZStuKnQpfSksKGZ1bmN0aW9uKGUsbil7cmV0dXJuKG4tZSkvdH0pKTpUNTpudWxsfTt2YXIgQzU9VDUsQTU9MWUzLGs1PTZlNCxMNT0zNmU1LFA1PTg2NGU1LE41PTYwNDhlNSxJNT1FNSgoZnVuY3Rpb24odCl7dC5zZXRUaW1lKHQtdC5nZXRNaWxsaXNlY29uZHMoKSl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFRpbWUoK3QrZSpBNSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS9BNX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENTZWNvbmRzKCl9KSksUjU9RTUoKGZ1bmN0aW9uKHQpe3Quc2V0VGltZSh0LXQuZ2V0TWlsbGlzZWNvbmRzKCktdC5nZXRTZWNvbmRzKCkqQTUpfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UqazUpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvazV9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TWludXRlcygpfSkpLE81PUU1KChmdW5jdGlvbih0KXt0LnNldFRpbWUodC10LmdldE1pbGxpc2Vjb25kcygpLXQuZ2V0U2Vjb25kcygpKkE1LXQuZ2V0TWludXRlcygpKms1KX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKkw1KX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL0w1fSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEhvdXJzKCl9KSksejU9RTUoKGZ1bmN0aW9uKHQpe3Quc2V0SG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldERhdGUodC5nZXREYXRlKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10LShlLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSprNSkvUDV9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RGF0ZSgpLTF9KSk7ZnVuY3Rpb24gRDUodCl7cmV0dXJuIEU1KChmdW5jdGlvbihlKXtlLnNldERhdGUoZS5nZXREYXRlKCktKGUuZ2V0RGF5KCkrNy10KSU3KSxlLnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpKzcqZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10LShlLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSprNSkvTjV9KSl9dmFyIEI1PUQ1KDApLEg1PUQ1KDEpO0Q1KDIpLEQ1KDMpO3ZhciBGNT1ENSg0KTtENSg1KSxENSg2KTt2YXIgVjU9RTUoKGZ1bmN0aW9uKHQpe3Quc2V0RGF0ZSgxKSx0LnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRNb250aCh0LmdldE1vbnRoKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5nZXRNb250aCgpLXQuZ2V0TW9udGgoKSsxMiooZS5nZXRGdWxsWWVhcigpLXQuZ2V0RnVsbFllYXIoKSl9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TW9udGgoKX0pKSxVNT1FNSgoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldEZ1bGxZZWFyKHQuZ2V0RnVsbFllYXIoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybiBlLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KSk7VTUuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9FNSgoZnVuY3Rpb24oZSl7ZS5zZXRGdWxsWWVhcihNYXRoLmZsb29yKGUuZ2V0RnVsbFllYXIoKS90KSp0KSxlLnNldE1vbnRoKDAsMSksZS5zZXRIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbihlLG4pe2Uuc2V0RnVsbFllYXIoZS5nZXRGdWxsWWVhcigpK24qdCl9KSk6bnVsbH07dmFyIGo1PVU1LEc1PUU1KChmdW5jdGlvbih0KXt0LnNldFVUQ1NlY29uZHMoMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKms1KX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL2s1fSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01pbnV0ZXMoKX0pKSxXNT1FNSgoZnVuY3Rpb24odCl7dC5zZXRVVENNaW51dGVzKDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKkw1KX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL0w1fSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0hvdXJzKCl9KSkscTU9RTUoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS9QNX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENEYXRlKCktMX0pKTtmdW5jdGlvbiBZNSh0KXtyZXR1cm4gRTUoKGZ1bmN0aW9uKGUpe2Uuc2V0VVRDRGF0ZShlLmdldFVUQ0RhdGUoKS0oZS5nZXRVVENEYXkoKSs3LXQpJTcpLGUuc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrNyplKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL041fSkpfXZhciBYNT1ZNSgwKSwkNT1ZNSgxKTtZNSgyKSxZNSgzKTt2YXIgSzU9WTUoNCk7WTUoNSksWTUoNik7dmFyIFo1PUU1KChmdW5jdGlvbih0KXt0LnNldFVUQ0RhdGUoMSksdC5zZXRVVENIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VVRDTW9udGgodC5nZXRVVENNb250aCgpK2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZ2V0VVRDTW9udGgoKS10LmdldFVUQ01vbnRoKCkrMTIqKGUuZ2V0VVRDRnVsbFllYXIoKS10LmdldFVUQ0Z1bGxZZWFyKCkpfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01vbnRoKCl9KSksSjU9RTUoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTW9udGgoMCwxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRVVENGdWxsWWVhcih0LmdldFVUQ0Z1bGxZZWFyKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5nZXRVVENGdWxsWWVhcigpLXQuZ2V0VVRDRnVsbFllYXIoKX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENGdWxsWWVhcigpfSkpO0o1LmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PU1hdGguZmxvb3IodCkpJiZ0PjA/RTUoKGZ1bmN0aW9uKGUpe2Uuc2V0VVRDRnVsbFllYXIoTWF0aC5mbG9vcihlLmdldFVUQ0Z1bGxZZWFyKCkvdCkqdCksZS5zZXRVVENNb250aCgwLDEpLGUuc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24oZSxuKXtlLnNldFVUQ0Z1bGxZZWFyKGUuZ2V0VVRDRnVsbFllYXIoKStuKnQpfSkpOm51bGx9O3ZhciBRNT1KNTtmdW5jdGlvbiB0Myh0KXtpZigwPD10LnkmJnQueTwxMDApe3ZhciBlPW5ldyBEYXRlKC0xLHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKTtyZXR1cm4gZS5zZXRGdWxsWWVhcih0LnkpLGV9cmV0dXJuIG5ldyBEYXRlKHQueSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCl9ZnVuY3Rpb24gZTModCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgZT1uZXcgRGF0ZShEYXRlLlVUQygtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpO3JldHVybiBlLnNldFVUQ0Z1bGxZZWFyKHQueSksZX1yZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEModC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKSl9ZnVuY3Rpb24gbjModCxlLG4pe3JldHVybnt5OnQsbTplLGQ6bixIOjAsTTowLFM6MCxMOjB9fXZhciBpMyxyMyxvMyxhMz17Ii0iOiIiLF86IiAiLDA6IjAifSxzMz0vXlxzKlxkKy8sbDM9L14lLyxjMz0vW1xcXiQqKz98W1xdKCkue31dL2c7ZnVuY3Rpb24gdTModCxlLG4pe3ZhciBpPXQ8MD8iLSI6IiIscj0oaT8tdDp0KSsiIixvPXIubGVuZ3RoO3JldHVybiBpKyhvPG4/bmV3IEFycmF5KG4tbysxKS5qb2luKGUpK3I6cil9ZnVuY3Rpb24gaDModCl7cmV0dXJuIHQucmVwbGFjZShjMywiXFwkJiIpfWZ1bmN0aW9uIGQzKHQpe3JldHVybiBuZXcgUmVnRXhwKCJeKD86Iit0Lm1hcChoMykuam9pbigifCIpKyIpIiwiaSIpfWZ1bmN0aW9uIHAzKHQpe2Zvcih2YXIgZT17fSxuPS0xLGk9dC5sZW5ndGg7KytuPGk7KWVbdFtuXS50b0xvd2VyQ2FzZSgpXT1uO3JldHVybiBlfWZ1bmN0aW9uIGYzKHQsZSxuKXt2YXIgaT1zMy5leGVjKGUuc2xpY2UobixuKzEpKTtyZXR1cm4gaT8odC53PStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG0zKHQsZSxuKXt2YXIgaT1zMy5leGVjKGUuc2xpY2UobixuKzEpKTtyZXR1cm4gaT8odC51PStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGczKHQsZSxuKXt2YXIgaT1zMy5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5VPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIF8zKHQsZSxuKXt2YXIgaT1zMy5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5WPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHkzKHQsZSxuKXt2YXIgaT1zMy5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5XPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHYzKHQsZSxuKXt2YXIgaT1zMy5leGVjKGUuc2xpY2UobixuKzQpKTtyZXR1cm4gaT8odC55PStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGIzKHQsZSxuKXt2YXIgaT1zMy5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC55PStpWzBdKygraVswXT42OD8xOTAwOjJlMyksbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24geDModCxlLG4pe3ZhciBpPS9eKFopfChbKy1dXGRcZCkoPzo6PyhcZFxkKSk/Ly5leGVjKGUuc2xpY2UobixuKzYpKTtyZXR1cm4gaT8odC5aPWlbMV0/MDotKGlbMl0rKGlbM118fCIwMCIpKSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB3Myh0LGUsbil7dmFyIGk9czMuZXhlYyhlLnNsaWNlKG4sbisxKSk7cmV0dXJuIGk/KHQucT0zKmlbMF0tMyxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBTMyh0LGUsbil7dmFyIGk9czMuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQubT1pWzBdLTEsbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gTTModCxlLG4pe3ZhciBpPXMzLmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0LmQ9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gRTModCxlLG4pe3ZhciBpPXMzLmV4ZWMoZS5zbGljZShuLG4rMykpO3JldHVybiBpPyh0Lm09MCx0LmQ9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gVDModCxlLG4pe3ZhciBpPXMzLmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0Lkg9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gQzModCxlLG4pe3ZhciBpPXMzLmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0Lk09K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gQTModCxlLG4pe3ZhciBpPXMzLmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0LlM9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gazModCxlLG4pe3ZhciBpPXMzLmV4ZWMoZS5zbGljZShuLG4rMykpO3JldHVybiBpPyh0Lkw9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gTDModCxlLG4pe3ZhciBpPXMzLmV4ZWMoZS5zbGljZShuLG4rNikpO3JldHVybiBpPyh0Lkw9TWF0aC5mbG9vcihpWzBdLzFlMyksbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gUDModCxlLG4pe3ZhciBpPWwzLmV4ZWMoZS5zbGljZShuLG4rMSkpO3JldHVybiBpP24raVswXS5sZW5ndGg6LTF9ZnVuY3Rpb24gTjModCxlLG4pe3ZhciBpPXMzLmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIGk/KHQuUT0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBJMyh0LGUsbil7dmFyIGk9czMuZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC5zPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFIzKHQsZSl7cmV0dXJuIHUzKHQuZ2V0RGF0ZSgpLGUsMil9ZnVuY3Rpb24gTzModCxlKXtyZXR1cm4gdTModC5nZXRIb3VycygpLGUsMil9ZnVuY3Rpb24gejModCxlKXtyZXR1cm4gdTModC5nZXRIb3VycygpJTEyfHwxMixlLDIpfWZ1bmN0aW9uIEQzKHQsZSl7cmV0dXJuIHUzKDErejUuY291bnQoajUodCksdCksZSwzKX1mdW5jdGlvbiBCMyh0LGUpe3JldHVybiB1Myh0LmdldE1pbGxpc2Vjb25kcygpLGUsMyl9ZnVuY3Rpb24gSDModCxlKXtyZXR1cm4gQjModCxlKSsiMDAwIn1mdW5jdGlvbiBGMyh0LGUpe3JldHVybiB1Myh0LmdldE1vbnRoKCkrMSxlLDIpfWZ1bmN0aW9uIFYzKHQsZSl7cmV0dXJuIHUzKHQuZ2V0TWludXRlcygpLGUsMil9ZnVuY3Rpb24gVTModCxlKXtyZXR1cm4gdTModC5nZXRTZWNvbmRzKCksZSwyKX1mdW5jdGlvbiBqMyh0KXt2YXIgZT10LmdldERheSgpO3JldHVybiAwPT09ZT83OmV9ZnVuY3Rpb24gRzModCxlKXtyZXR1cm4gdTMoQjUuY291bnQoajUodCktMSx0KSxlLDIpfWZ1bmN0aW9uIFczKHQpe3ZhciBlPXQuZ2V0RGF5KCk7cmV0dXJuIGU+PTR8fDA9PT1lP0Y1KHQpOkY1LmNlaWwodCl9ZnVuY3Rpb24gcTModCxlKXtyZXR1cm4gdD1XMyh0KSx1MyhGNS5jb3VudChqNSh0KSx0KSsoND09PWo1KHQpLmdldERheSgpKSxlLDIpfWZ1bmN0aW9uIFkzKHQpe3JldHVybiB0LmdldERheSgpfWZ1bmN0aW9uIFgzKHQsZSl7cmV0dXJuIHUzKEg1LmNvdW50KGo1KHQpLTEsdCksZSwyKX1mdW5jdGlvbiAkMyh0LGUpe3JldHVybiB1Myh0LmdldEZ1bGxZZWFyKCklMTAwLGUsMil9ZnVuY3Rpb24gSzModCxlKXtyZXR1cm4gdTMoKHQ9VzModCkpLmdldEZ1bGxZZWFyKCklMTAwLGUsMil9ZnVuY3Rpb24gWjModCxlKXtyZXR1cm4gdTModC5nZXRGdWxsWWVhcigpJTFlNCxlLDQpfWZ1bmN0aW9uIEozKHQsZSl7dmFyIG49dC5nZXREYXkoKTtyZXR1cm4gdTMoKHQ9bj49NHx8MD09PW4/RjUodCk6RjUuY2VpbCh0KSkuZ2V0RnVsbFllYXIoKSUxZTQsZSw0KX1mdW5jdGlvbiBRMyh0KXt2YXIgZT10LmdldFRpbWV6b25lT2Zmc2V0KCk7cmV0dXJuKGU+MD8iLSI6KGUqPS0xLCIrIikpK3UzKGUvNjB8MCwiMCIsMikrdTMoZSU2MCwiMCIsMil9ZnVuY3Rpb24gdDQodCxlKXtyZXR1cm4gdTModC5nZXRVVENEYXRlKCksZSwyKX1mdW5jdGlvbiBlNCh0LGUpe3JldHVybiB1Myh0LmdldFVUQ0hvdXJzKCksZSwyKX1mdW5jdGlvbiBuNCh0LGUpe3JldHVybiB1Myh0LmdldFVUQ0hvdXJzKCklMTJ8fDEyLGUsMil9ZnVuY3Rpb24gaTQodCxlKXtyZXR1cm4gdTMoMStxNS5jb3VudChRNSh0KSx0KSxlLDMpfWZ1bmN0aW9uIHI0KHQsZSl7cmV0dXJuIHUzKHQuZ2V0VVRDTWlsbGlzZWNvbmRzKCksZSwzKX1mdW5jdGlvbiBvNCh0LGUpe3JldHVybiByNCh0LGUpKyIwMDAifWZ1bmN0aW9uIGE0KHQsZSl7cmV0dXJuIHUzKHQuZ2V0VVRDTW9udGgoKSsxLGUsMil9ZnVuY3Rpb24gczQodCxlKXtyZXR1cm4gdTModC5nZXRVVENNaW51dGVzKCksZSwyKX1mdW5jdGlvbiBsNCh0LGUpe3JldHVybiB1Myh0LmdldFVUQ1NlY29uZHMoKSxlLDIpfWZ1bmN0aW9uIGM0KHQpe3ZhciBlPXQuZ2V0VVRDRGF5KCk7cmV0dXJuIDA9PT1lPzc6ZX1mdW5jdGlvbiB1NCh0LGUpe3JldHVybiB1MyhYNS5jb3VudChRNSh0KS0xLHQpLGUsMil9ZnVuY3Rpb24gaDQodCl7dmFyIGU9dC5nZXRVVENEYXkoKTtyZXR1cm4gZT49NHx8MD09PWU/SzUodCk6SzUuY2VpbCh0KX1mdW5jdGlvbiBkNCh0LGUpe3JldHVybiB0PWg0KHQpLHUzKEs1LmNvdW50KFE1KHQpLHQpKyg0PT09UTUodCkuZ2V0VVRDRGF5KCkpLGUsMil9ZnVuY3Rpb24gcDQodCl7cmV0dXJuIHQuZ2V0VVRDRGF5KCl9ZnVuY3Rpb24gZjQodCxlKXtyZXR1cm4gdTMoJDUuY291bnQoUTUodCktMSx0KSxlLDIpfWZ1bmN0aW9uIG00KHQsZSl7cmV0dXJuIHUzKHQuZ2V0VVRDRnVsbFllYXIoKSUxMDAsZSwyKX1mdW5jdGlvbiBnNCh0LGUpe3JldHVybiB1MygodD1oNCh0KSkuZ2V0VVRDRnVsbFllYXIoKSUxMDAsZSwyKX1mdW5jdGlvbiBfNCh0LGUpe3JldHVybiB1Myh0LmdldFVUQ0Z1bGxZZWFyKCklMWU0LGUsNCl9ZnVuY3Rpb24geTQodCxlKXt2YXIgbj10LmdldFVUQ0RheSgpO3JldHVybiB1MygodD1uPj00fHwwPT09bj9LNSh0KTpLNS5jZWlsKHQpKS5nZXRVVENGdWxsWWVhcigpJTFlNCxlLDQpfWZ1bmN0aW9uIHY0KCl7cmV0dXJuIiswMDAwIn1mdW5jdGlvbiBiNCgpe3JldHVybiIlIn1mdW5jdGlvbiB4NCh0KXtyZXR1cm4rdH1mdW5jdGlvbiB3NCh0KXtyZXR1cm4gTWF0aC5mbG9vcigrdC8xZTMpfSEoZnVuY3Rpb24gUzQodCl7aTM9KGZ1bmN0aW9uIGUodCl7dmFyIGU9dC5kYXRlVGltZSxuPXQuZGF0ZSxpPXQudGltZSxyPXQucGVyaW9kcyxvPXQuZGF5cyxhPXQuc2hvcnREYXlzLHM9dC5tb250aHMsbD10LnNob3J0TW9udGhzLGM9ZDMociksdT1wMyhyKSxoPWQzKG8pLGQ9cDMobykscD1kMyhhKSxmPXAzKGEpLG09ZDMocyksZz1wMyhzKSxfPWQzKGwpLHk9cDMobCksdj17YTpmdW5jdGlvbiBiKHQpe3JldHVybiBhW3QuZ2V0RGF5KCldfSxBOmZ1bmN0aW9uIHgodCl7cmV0dXJuIG9bdC5nZXREYXkoKV19LGI6ZnVuY3Rpb24gdyh0KXtyZXR1cm4gbFt0LmdldE1vbnRoKCldfSxCOmZ1bmN0aW9uIFModCl7cmV0dXJuIHNbdC5nZXRNb250aCgpXX0sYzpudWxsLGQ6UjMsZTpSMyxmOkgzLGc6SzMsRzpKMyxIOk8zLEk6ejMsajpEMyxMOkIzLG06RjMsTTpWMyxwOmZ1bmN0aW9uIE0odCl7cmV0dXJuIHJbKyh0LmdldEhvdXJzKCk+PTEyKV19LHE6ZnVuY3Rpb24gRSh0KXtyZXR1cm4gMSt+fih0LmdldE1vbnRoKCkvMyl9LFE6eDQsczp3NCxTOlUzLHU6ajMsVTpHMyxWOnEzLHc6WTMsVzpYMyx4Om51bGwsWDpudWxsLHk6JDMsWTpaMyxaOlEzLCIlIjpiNH0sVD17YTpmdW5jdGlvbiBDKHQpe3JldHVybiBhW3QuZ2V0VVRDRGF5KCldfSxBOmZ1bmN0aW9uIEEodCl7cmV0dXJuIG9bdC5nZXRVVENEYXkoKV19LGI6ZnVuY3Rpb24gayh0KXtyZXR1cm4gbFt0LmdldFVUQ01vbnRoKCldfSxCOmZ1bmN0aW9uIEwodCl7cmV0dXJuIHNbdC5nZXRVVENNb250aCgpXX0sYzpudWxsLGQ6dDQsZTp0NCxmOm80LGc6ZzQsRzp5NCxIOmU0LEk6bjQsajppNCxMOnI0LG06YTQsTTpzNCxwOmZ1bmN0aW9uIFAodCl7cmV0dXJuIHJbKyh0LmdldFVUQ0hvdXJzKCk+PTEyKV19LHE6ZnVuY3Rpb24gTih0KXtyZXR1cm4gMSt+fih0LmdldFVUQ01vbnRoKCkvMyl9LFE6eDQsczp3NCxTOmw0LHU6YzQsVTp1NCxWOmQ0LHc6cDQsVzpmNCx4Om51bGwsWDpudWxsLHk6bTQsWTpfNCxaOnY0LCIlIjpiNH0sST17YTpmdW5jdGlvbiBSKHQsZSxuKXt2YXIgaT1wLmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIGk/KHQudz1mW2lbMF0udG9Mb3dlckNhc2UoKV0sbitpWzBdLmxlbmd0aCk6LTF9LEE6ZnVuY3Rpb24gTyh0LGUsbil7dmFyIGk9aC5leGVjKGUuc2xpY2UobikpO3JldHVybiBpPyh0Lnc9ZFtpWzBdLnRvTG93ZXJDYXNlKCldLG4raVswXS5sZW5ndGgpOi0xfSxiOmZ1bmN0aW9uIHoodCxlLG4pe3ZhciBpPV8uZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC5tPXlbaVswXS50b0xvd2VyQ2FzZSgpXSxuK2lbMF0ubGVuZ3RoKTotMX0sQjpmdW5jdGlvbiBEKHQsZSxuKXt2YXIgaT1tLmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIGk/KHQubT1nW2lbMF0udG9Mb3dlckNhc2UoKV0sbitpWzBdLmxlbmd0aCk6LTF9LGM6ZnVuY3Rpb24gQih0LG4saSl7cmV0dXJuIEcodCxlLG4saSl9LGQ6TTMsZTpNMyxmOkwzLGc6YjMsRzp2MyxIOlQzLEk6VDMsajpFMyxMOmszLG06UzMsTTpDMyxwOmZ1bmN0aW9uIEgodCxlLG4pe3ZhciBpPWMuZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC5wPXVbaVswXS50b0xvd2VyQ2FzZSgpXSxuK2lbMF0ubGVuZ3RoKTotMX0scTp3MyxROk4zLHM6STMsUzpBMyx1Om0zLFU6ZzMsVjpfMyx3OmYzLFc6eTMseDpmdW5jdGlvbiBGKHQsZSxpKXtyZXR1cm4gRyh0LG4sZSxpKX0sWDpmdW5jdGlvbiBWKHQsZSxuKXtyZXR1cm4gRyh0LGksZSxuKX0seTpiMyxZOnYzLFo6eDMsIiUiOlAzfTtmdW5jdGlvbiBVKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBpLHIsbyxhPVtdLHM9LTEsbD0wLGM9dC5sZW5ndGg7Zm9yKG4gaW5zdGFuY2VvZiBEYXRlfHwobj1uZXcgRGF0ZSgrbikpOysrczxjOykzNz09PXQuY2hhckNvZGVBdChzKSYmKGEucHVzaCh0LnNsaWNlKGwscykpLG51bGwhPShyPWEzW2k9dC5jaGFyQXQoKytzKV0pP2k9dC5jaGFyQXQoKytzKTpyPSJlIj09PWk/IiAiOiIwIiwobz1lW2ldKSYmKGk9byhuLHIpKSxhLnB1c2goaSksbD1zKzEpO3JldHVybiBhLnB1c2godC5zbGljZShsLHMpKSxhLmpvaW4oIiIpfX1mdW5jdGlvbiBqKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBpLHIsbz1uMygxOTAwLHZvaWQgMCwxKTtpZihHKG8sdCxuKz0iIiwwKSE9bi5sZW5ndGgpcmV0dXJuIG51bGw7aWYoIlEiaW4gbylyZXR1cm4gbmV3IERhdGUoby5RKTtpZigicyJpbiBvKXJldHVybiBuZXcgRGF0ZSgxZTMqby5zKygiTCJpbiBvP28uTDowKSk7aWYoZSYmISgiWiJpbiBvKSYmKG8uWj0wKSwicCJpbiBvJiYoby5IPW8uSCUxMisxMipvLnApLHZvaWQgMD09PW8ubSYmKG8ubT0icSJpbiBvP28ucTowKSwiViJpbiBvKXtpZihvLlY8MXx8by5WPjUzKXJldHVybiBudWxsOyJ3ImluIG98fChvLnc9MSksIloiaW4gbz8ocj0oaT1lMyhuMyhvLnksMCwxKSkpLmdldFVUQ0RheSgpLGk9cj40fHwwPT09cj8kNS5jZWlsKGkpOiQ1KGkpLGk9cTUub2Zmc2V0KGksNyooby5WLTEpKSxvLnk9aS5nZXRVVENGdWxsWWVhcigpLG8ubT1pLmdldFVUQ01vbnRoKCksby5kPWkuZ2V0VVRDRGF0ZSgpKyhvLncrNiklNyk6KHI9KGk9dDMobjMoby55LDAsMSkpKS5nZXREYXkoKSxpPXI+NHx8MD09PXI/SDUuY2VpbChpKTpINShpKSxpPXo1Lm9mZnNldChpLDcqKG8uVi0xKSksby55PWkuZ2V0RnVsbFllYXIoKSxvLm09aS5nZXRNb250aCgpLG8uZD1pLmdldERhdGUoKSsoby53KzYpJTcpfWVsc2UoIlciaW4gb3x8IlUiaW4gbykmJigidyJpbiBvfHwoby53PSJ1ImluIG8/by51JTc6IlciaW4gbz8xOjApLHI9IloiaW4gbz9lMyhuMyhvLnksMCwxKSkuZ2V0VVRDRGF5KCk6dDMobjMoby55LDAsMSkpLmdldERheSgpLG8ubT0wLG8uZD0iVyJpbiBvPyhvLncrNiklNys3Km8uVy0ocis1KSU3Om8udys3Km8uVS0ocis2KSU3KTtyZXR1cm4iWiJpbiBvPyhvLkgrPW8uWi8xMDB8MCxvLk0rPW8uWiUxMDAsZTMobykpOnQzKG8pfX1mdW5jdGlvbiBHKHQsZSxuLGkpe2Zvcih2YXIgcixvLGE9MCxzPWUubGVuZ3RoLGw9bi5sZW5ndGg7YTxzOyl7aWYoaT49bClyZXR1cm4tMTtpZigzNz09PShyPWUuY2hhckNvZGVBdChhKyspKSl7aWYocj1lLmNoYXJBdChhKyspLCEobz1JW3IgaW4gYTM/ZS5jaGFyQXQoYSsrKTpyXSl8fChpPW8odCxuLGkpKTwwKXJldHVybi0xfWVsc2UgaWYociE9bi5jaGFyQ29kZUF0KGkrKykpcmV0dXJuLTF9cmV0dXJuIGl9cmV0dXJuIHYueD1VKG4sdiksdi5YPVUoaSx2KSx2LmM9VShlLHYpLFQueD1VKG4sVCksVC5YPVUoaSxUKSxULmM9VShlLFQpLHtmb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIGU9VSh0Kz0iIix2KTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfSxwYXJzZTpmdW5jdGlvbih0KXt2YXIgZT1qKHQrPSIiLCExKTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfSx1dGNGb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIGU9VSh0Kz0iIixUKTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfSx1dGNQYXJzZTpmdW5jdGlvbih0KXt2YXIgZT1qKHQrPSIiLCEwKTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfX19KSh0KSxyMz1pMy5mb3JtYXQsbzM9aTMudXRjRm9ybWF0fSkoe2RhdGVUaW1lOiIleCwgJVgiLGRhdGU6IiUtbS8lLWQvJVkiLHRpbWU6IiUtSTolTTolUyAlcCIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTt2YXIgTTQ9MzE1MzZlNjtmdW5jdGlvbiBFNCh0KXtyZXR1cm4gbmV3IERhdGUodCl9ZnVuY3Rpb24gVDQodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlPyt0OituZXcgRGF0ZSgrdCl9ZnVuY3Rpb24gQzQodCxlLG4saSxyLG8sYSxzLGwpe3ZhciBjPSQyKFcyLE4yKSx1PWMuaW52ZXJ0LGg9Yy5kb21haW4sZD1sKCIuJUwiKSxwPWwoIjolUyIpLGY9bCgiJUk6JU0iKSxtPWwoIiVJICVwIiksZz1sKCIlYSAlZCIpLF89bCgiJWIgJWQiKSx5PWwoIiVCIiksdj1sKCIlWSIpLGI9W1thLDEsMWUzXSxbYSw1LDVlM10sW2EsMTUsMTVlM10sW2EsMzAsM2U0XSxbbywxLDZlNF0sW28sNSwzZTVdLFtvLDE1LDllNV0sW28sMzAsMThlNV0sW3IsMSwzNmU1XSxbciwzLDEwOGU1XSxbciw2LDIxNmU1XSxbciwxMiw0MzJlNV0sW2ksMSw4NjRlNV0sW2ksMiwxNzI4ZTVdLFtuLDEsNjA0OGU1XSxbZSwxLDI1OTJlNl0sW2UsMyw3Nzc2ZTZdLFt0LDEsTTRdXTtmdW5jdGlvbiB4KHMpe3JldHVybihhKHMpPHM/ZDpvKHMpPHM/cDpyKHMpPHM/ZjppKHMpPHM/bTplKHMpPHM/bihzKTxzP2c6Xzp0KHMpPHM/eTp2KShzKX1mdW5jdGlvbiB3KGUsbixpLHIpe2lmKG51bGw9PWUmJihlPTEwKSwibnVtYmVyIj09dHlwZW9mIGUpe3ZhciBvPU1hdGguYWJzKGktbikvZSxhPWgwKChmdW5jdGlvbih0KXtyZXR1cm4gdFsyXX0pKS5yaWdodChiLG8pO2E9PT1iLmxlbmd0aD8ocj12MChuL000LGkvTTQsZSksZT10KTphPyhyPShhPWJbby9iW2EtMV1bMl08YlthXVsyXS9vP2EtMTphXSlbMV0sZT1hWzBdKToocj1NYXRoLm1heCh2MChuLGksZSksMSksZT1zKX1yZXR1cm4gbnVsbD09cj9lOmUuZXZlcnkocil9cmV0dXJuIGMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRGF0ZSh1KHQpKX0sYy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/aChDMC5jYWxsKHQsVDQpKTpoKCkubWFwKEU0KX0sYy50aWNrcz1mdW5jdGlvbih0LGUpe3ZhciBuLGk9aCgpLHI9aVswXSxvPWlbaS5sZW5ndGgtMV0sYT1vPHI7cmV0dXJuIGEmJihuPXIscj1vLG89biksbj0obj13KHQscixvLGUpKT9uLnJhbmdlKHIsbysxKTpbXSxhP24ucmV2ZXJzZSgpOm59LGMudGlja0Zvcm1hdD1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT1lP3g6bChlKX0sYy5uaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIG49aCgpO3JldHVybih0PXcodCxuWzBdLG5bbi5sZW5ndGgtMV0sZSkpP2gocDUobix0KSk6Y30sYy5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFgyKGMsQzQodCxlLG4saSxyLG8sYSxzLGwpKX0sY31mdW5jdGlvbiBBNCh0KXtyZXR1cm4gdC5tYXRjaCgvLns2fS9nKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIjIit0fSkpfXZhciBrND1BNCgiMWY3N2I0ZmY3ZjBlMmNhMDJjZDYyNzI4OTQ2N2JkOGM1NjRiZTM3N2MyN2Y3ZjdmYmNiZDIyMTdiZWNmIiksTDQ9QTQoIjM5M2I3OTUyNTRhMzZiNmVjZjljOWVkZTYzNzkzOThjYTI1MmI1Y2Y2YmNlZGI5YzhjNmQzMWJkOWUzOWU3YmE1MmU3Y2I5NDg0M2MzOWFkNDk0YWQ2NjE2YmU3OTY5YzdiNDE3M2E1NTE5NGNlNmRiZGRlOWVkNiIpLFA0PUE0KCIzMTgyYmQ2YmFlZDY5ZWNhZTFjNmRiZWZlNjU1MGRmZDhkM2NmZGFlNmJmZGQwYTIzMWEzNTQ3NGM0NzZhMWQ5OWJjN2U5YzA3NTZiYjE5ZTlhYzhiY2JkZGNkYWRhZWI2MzYzNjM5Njk2OTZiZGJkYmRkOWQ5ZDkiKSxOND1BNCgiMWY3N2I0YWVjN2U4ZmY3ZjBlZmZiYjc4MmNhMDJjOThkZjhhZDYyNzI4ZmY5ODk2OTQ2N2JkYzViMGQ1OGM1NjRiYzQ5Yzk0ZTM3N2MyZjdiNmQyN2Y3ZjdmYzdjN2M3YmNiZDIyZGJkYjhkMTdiZWNmOWVkYWU1IiksSTQ9VjIoUzIoMzAwLC41LDApLFMyKC0yNDAsLjUsMSkpLFI0PVYyKFMyKC0xMDAsLjc1LC4zNSksUzIoODAsMS41LC44KSksTzQ9VjIoUzIoMjYwLC43NSwuMzUpLFMyKDgwLDEuNSwuOCkpLHo0PVMyKCk7ZnVuY3Rpb24gRDQodCl7dmFyIGU9dC5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0W01hdGgubWF4KDAsTWF0aC5taW4oZS0xLE1hdGguZmxvb3IobiplKSkpXX19dmFyIEI0PUQ0KEE0KCI0NDAxNTQ0NDAyNTY0NTA0NTc0NTA1NTk0NjA3NWE0NjA4NWM0NjBhNWQ0NjBiNWU0NzBkNjA0NzBlNjE0NzEwNjM0NzExNjQ0NzEzNjU0ODE0Njc0ODE2Njg0ODE3Njk0ODE4NmE0ODFhNmM0ODFiNmQ0ODFjNmU0ODFkNmY0ODFmNzA0ODIwNzE0ODIxNzM0ODIzNzQ0ODI0NzU0ODI1NzY0ODI2Nzc0ODI4Nzg0ODI5Nzk0NzJhN2E0NzJjN2E0NzJkN2I0NzJlN2M0NzJmN2Q0NjMwN2U0NjMyN2U0NjMzN2Y0NjM0ODA0NTM1ODE0NTM3ODE0NTM4ODI0NDM5ODM0NDNhODM0NDNiODQ0MzNkODQ0MzNlODU0MjNmODU0MjQwODY0MjQxODY0MTQyODc0MTQ0ODc0MDQ1ODg0MDQ2ODgzZjQ3ODgzZjQ4ODkzZTQ5ODkzZTRhODkzZTRjOGEzZDRkOGEzZDRlOGEzYzRmOGEzYzUwOGIzYjUxOGIzYjUyOGIzYTUzOGIzYTU0OGMzOTU1OGMzOTU2OGMzODU4OGMzODU5OGMzNzVhOGMzNzViOGQzNjVjOGQzNjVkOGQzNTVlOGQzNTVmOGQzNDYwOGQzNDYxOGQzMzYyOGQzMzYzOGQzMjY0OGUzMjY1OGUzMTY2OGUzMTY3OGUzMTY4OGUzMDY5OGUzMDZhOGUyZjZiOGUyZjZjOGUyZTZkOGUyZTZlOGUyZTZmOGUyZDcwOGUyZDcxOGUyYzcxOGUyYzcyOGUyYzczOGUyYjc0OGUyYjc1OGUyYTc2OGUyYTc3OGUyYTc4OGUyOTc5OGUyOTdhOGUyOTdiOGUyODdjOGUyODdkOGUyNzdlOGUyNzdmOGUyNzgwOGUyNjgxOGUyNjgyOGUyNjgyOGUyNTgzOGUyNTg0OGUyNTg1OGUyNDg2OGUyNDg3OGUyMzg4OGUyMzg5OGUyMzhhOGQyMjhiOGQyMjhjOGQyMjhkOGQyMThlOGQyMThmOGQyMTkwOGQyMTkxOGMyMDkyOGMyMDkyOGMyMDkzOGMxZjk0OGMxZjk1OGIxZjk2OGIxZjk3OGIxZjk4OGIxZjk5OGExZjlhOGExZTliOGExZTljODkxZTlkODkxZjllODkxZjlmODgxZmEwODgxZmExODgxZmExODcxZmEyODcyMGEzODYyMGE0ODYyMWE1ODUyMWE2ODUyMmE3ODUyMmE4ODQyM2E5ODMyNGFhODMyNWFiODIyNWFjODIyNmFkODEyN2FkODEyOGFlODAyOWFmN2YyYWIwN2YyY2IxN2UyZGIyN2QyZWIzN2MyZmI0N2MzMWI1N2IzMmI2N2EzNGI2NzkzNWI3NzkzN2I4NzgzOGI5NzczYWJhNzYzYmJiNzUzZGJjNzQzZmJjNzM0MGJkNzI0MmJlNzE0NGJmNzA0NmMwNmY0OGMxNmU0YWMxNmQ0Y2MyNmM0ZWMzNmI1MGM0NmE1MmM1Njk1NGM1Njg1NmM2Njc1OGM3NjU1YWM4NjQ1Y2M4NjM1ZWM5NjI2MGNhNjA2M2NiNWY2NWNiNWU2N2NjNWM2OWNkNWI2Y2NkNWE2ZWNlNTg3MGNmNTc3M2QwNTY3NWQwNTQ3N2QxNTM3YWQxNTE3Y2QyNTA3ZmQzNGU4MWQzNGQ4NGQ0NGI4NmQ1NDk4OWQ1NDg4YmQ2NDY4ZWQ2NDU5MGQ3NDM5M2Q3NDE5NWQ4NDA5OGQ4M2U5YmQ5M2M5ZGQ5M2JhMGRhMzlhMmRhMzdhNWRiMzZhOGRiMzRhYWRjMzJhZGRjMzBiMGRkMmZiMmRkMmRiNWRlMmJiOGRlMjliYWRlMjhiZGRmMjZjMGRmMjVjMmRmMjNjNWUwMjFjOGUwMjBjYWUxMWZjZGUxMWRkMGUxMWNkMmUyMWJkNWUyMWFkOGUyMTlkYWUzMTlkZGUzMThkZmUzMThlMmU0MThlNWU0MTllN2U0MTllYWU1MWFlY2U1MWJlZmU1MWNmMWU1MWRmNGU2MWVmNmU2MjBmOGU2MjFmYmU3MjNmZGU3MjUiKSksSDQ9RDQoQTQoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwOTAyMDIwYjAyMDIwZDAzMDMwZjAzMDMxMjA0MDQxNDA1MDQxNjA2MDUxODA2MDUxYTA3MDYxYzA4MDcxZTA5MDcyMDBhMDgyMjBiMDkyNDBjMDkyNjBkMGEyOTBlMGIyYjEwMGIyZDExMGMyZjEyMGQzMTEzMGQzNDE0MGUzNjE1MGUzODE2MGYzYjE4MGYzZDE5MTAzZjFhMTA0MjFjMTA0NDFkMTE0NzFlMTE0OTIwMTE0YjIxMTE0ZTIyMTE1MDI0MTI1MzI1MTI1NTI3MTI1ODI5MTE1YTJhMTE1YzJjMTE1ZjJkMTE2MTJmMTE2MzMxMTE2NTMzMTA2NzM0MTA2OTM2MTA2YjM4MTA2YzM5MGY2ZTNiMGY3MDNkMGY3MTNmMGY3MjQwMGY3NDQyMGY3NTQ0MGY3NjQ1MTA3NzQ3MTA3ODQ5MTA3ODRhMTA3OTRjMTE3YTRlMTE3YjRmMTI3YjUxMTI3YzUyMTM3YzU0MTM3ZDU2MTQ3ZDU3MTU3ZTU5MTU3ZTVhMTY3ZTVjMTY3ZjVkMTc3ZjVmMTg3ZjYwMTg4MDYyMTk4MDY0MWE4MDY1MWE4MDY3MWI4MDY4MWM4MTZhMWM4MTZiMWQ4MTZkMWQ4MTZlMWU4MTcwMWY4MTcyMWY4MTczMjA4MTc1MjE4MTc2MjE4MTc4MjI4MTc5MjI4MjdiMjM4MjdjMjM4MjdlMjQ4MjgwMjU4MjgxMjU4MTgzMjY4MTg0MjY4MTg2Mjc4MTg4Mjc4MTg5Mjg4MThiMjk4MThjMjk4MThlMmE4MTkwMmE4MTkxMmI4MTkzMmI4MDk0MmM4MDk2MmM4MDk4MmQ4MDk5MmQ4MDliMmU3ZjljMmU3ZjllMmY3ZmEwMmY3ZmExMzA3ZWEzMzA3ZWE1MzE3ZWE2MzE3ZGE4MzI3ZGFhMzM3ZGFiMzM3Y2FkMzQ3Y2FlMzQ3YmIwMzU3YmIyMzU3YmIzMzY3YWI1MzY3YWI3Mzc3OWI4Mzc3OWJhMzg3OGJjMzk3OGJkMzk3N2JmM2E3N2MwM2E3NmMyM2I3NWM0M2M3NWM1M2M3NGM3M2Q3M2M4M2U3M2NhM2U3MmNjM2Y3MWNkNDA3MWNmNDA3MGQwNDE2ZmQyNDI2ZmQzNDM2ZWQ1NDQ2ZGQ2NDU2Y2Q4NDU2Y2Q5NDY2YmRiNDc2YWRjNDg2OWRlNDk2OGRmNGE2OGUwNGM2N2UyNGQ2NmUzNGU2NWU0NGY2NGU1NTA2NGU3NTI2M2U4NTM2MmU5NTQ2MmVhNTY2MWViNTc2MGVjNTg2MGVkNWE1ZmVlNWI1ZWVmNWQ1ZWYwNWY1ZWYxNjA1ZGYyNjI1ZGYyNjQ1Y2YzNjU1Y2Y0Njc1Y2Y0Njk1Y2Y1NmI1Y2Y2NmM1Y2Y2NmU1Y2Y3NzA1Y2Y3NzI1Y2Y4NzQ1Y2Y4NzY1Y2Y5Nzg1ZGY5Nzk1ZGY5N2I1ZGZhN2Q1ZWZhN2Y1ZWZhODE1ZmZiODM1ZmZiODU2MGZiODc2MWZjODk2MWZjOGE2MmZjOGM2M2ZjOGU2NGZjOTA2NWZkOTI2NmZkOTQ2N2ZkOTY2OGZkOTg2OWZkOWE2YWZkOWI2YmZlOWQ2Y2ZlOWY2ZGZlYTE2ZWZlYTM2ZmZlYTU3MWZlYTc3MmZlYTk3M2ZlYWE3NGZlYWM3NmZlYWU3N2ZlYjA3OGZlYjI3YWZlYjQ3YmZlYjY3Y2ZlYjc3ZWZlYjk3ZmZlYmI4MWZlYmQ4MmZlYmY4NGZlYzE4NWZlYzI4N2ZlYzQ4OGZlYzY4YWZlYzg4Y2ZlY2E4ZGZlY2M4ZmZlY2Q5MGZlY2Y5MmZlZDE5NGZlZDM5NWZlZDU5N2ZlZDc5OWZlZDg5YWZkZGE5Y2ZkZGM5ZWZkZGVhMGZkZTBhMWZkZTJhM2ZkZTNhNWZkZTVhN2ZkZTdhOWZkZTlhYWZkZWJhY2ZjZWNhZWZjZWViMGZjZjBiMmZjZjJiNGZjZjRiNmZjZjZiOGZjZjdiOWZjZjliYmZjZmJiZGZjZmRiZiIpKSxGND1ENChBNCgiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTBhMDIwMjBjMDIwMjBlMDMwMjEwMDQwMzEyMDQwMzE0MDUwNDE3MDYwNDE5MDcwNTFiMDgwNTFkMDkwNjFmMGEwNzIyMGIwNzI0MGMwODI2MGQwODI5MGUwOTJiMTAwOTJkMTEwYTMwMTIwYTMyMTQwYjM0MTUwYjM3MTYwYjM5MTgwYzNjMTkwYzNlMWIwYzQxMWMwYzQzMWUwYzQ1MWYwYzQ4MjEwYzRhMjMwYzRjMjQwYzRmMjYwYzUxMjgwYjUzMjkwYjU1MmIwYjU3MmQwYjU5MmYwYTViMzEwYTVjMzIwYTVlMzQwYTVmMzYwOTYxMzgwOTYyMzkwOTYzM2IwOTY0M2QwOTY1M2UwOTY2NDAwYTY3NDIwYTY4NDQwYTY4NDUwYTY5NDcwYjZhNDkwYjZhNGEwYzZiNGMwYzZiNGQwZDZjNGYwZDZjNTEwZTZjNTIwZTZkNTQwZjZkNTUwZjZkNTcxMDZlNTkxMDZlNWExMTZlNWMxMjZlNWQxMjZlNWYxMzZlNjExMzZlNjIxNDZlNjQxNTZlNjUxNTZlNjcxNjZlNjkxNjZlNmExNzZlNmMxODZlNmQxODZlNmYxOTZlNzExOTZlNzIxYTZlNzQxYTZlNzUxYjZlNzcxYzZkNzgxYzZkN2ExZDZkN2MxZDZkN2QxZTZkN2YxZTZjODAxZjZjODIyMDZjODQyMDZiODUyMTZiODcyMTZiODgyMjZhOGEyMjZhOGMyMzY5OGQyMzY5OGYyNDY5OTAyNTY4OTIyNTY4OTMyNjY3OTUyNjY3OTcyNzY2OTgyNzY2OWEyODY1OWIyOTY0OWQyOTY0OWYyYTYzYTAyYTYzYTIyYjYyYTMyYzYxYTUyYzYwYTYyZDYwYTgyZTVmYTkyZTVlYWIyZjVlYWQzMDVkYWUzMDVjYjAzMTViYjEzMjVhYjMzMjVhYjQzMzU5YjYzNDU4YjczNTU3YjkzNTU2YmEzNjU1YmMzNzU0YmQzODUzYmYzOTUyYzAzYTUxYzEzYTUwYzMzYjRmYzQzYzRlYzYzZDRkYzczZTRjYzgzZjRiY2E0MDRhY2I0MTQ5Y2M0MjQ4Y2U0MzQ3Y2Y0NDQ2ZDA0NTQ1ZDI0NjQ0ZDM0NzQzZDQ0ODQyZDU0YTQxZDc0YjNmZDg0YzNlZDk0ZDNkZGE0ZTNjZGI1MDNiZGQ1MTNhZGU1MjM4ZGY1MzM3ZTA1NTM2ZTE1NjM1ZTI1NzM0ZTM1OTMzZTQ1YTMxZTU1YzMwZTY1ZDJmZTc1ZTJlZTg2MDJkZTk2MTJiZWE2MzJhZWI2NDI5ZWI2NjI4ZWM2NzI2ZWQ2OTI1ZWU2YTI0ZWY2YzIzZWY2ZTIxZjA2ZjIwZjE3MTFmZjE3MzFkZjI3NDFjZjM3NjFiZjM3ODE5ZjQ3OTE4ZjU3YjE3ZjU3ZDE1ZjY3ZTE0ZjY4MDEzZjc4MjEyZjc4NDEwZjg4NTBmZjg4NzBlZjg4OTBjZjk4YjBiZjk4YzBhZjk4ZTA5ZmE5MDA4ZmE5MjA3ZmE5NDA3ZmI5NjA2ZmI5NzA2ZmI5OTA2ZmI5YjA2ZmI5ZDA3ZmM5ZjA3ZmNhMTA4ZmNhMzA5ZmNhNTBhZmNhNjBjZmNhODBkZmNhYTBmZmNhYzExZmNhZTEyZmNiMDE0ZmNiMjE2ZmNiNDE4ZmJiNjFhZmJiODFkZmJiYTFmZmJiYzIxZmJiZTIzZmFjMDI2ZmFjMjI4ZmFjNDJhZmFjNjJkZjljNzJmZjljOTMyZjljYjM1ZjhjZDM3ZjhjZjNhZjdkMTNkZjdkMzQwZjZkNTQzZjZkNzQ2ZjVkOTQ5ZjVkYjRjZjRkZDRmZjRkZjUzZjRlMTU2ZjNlMzVhZjNlNTVkZjJlNjYxZjJlODY1ZjJlYTY5ZjFlYzZkZjFlZDcxZjFlZjc1ZjFmMTc5ZjJmMjdkZjJmNDgyZjNmNTg2ZjNmNjhhZjRmODhlZjVmOTkyZjZmYTk2ZjhmYjlhZjlmYzlkZmFmZGExZmNmZmE0IikpLFY0PUQ0KEE0KCIwZDA4ODcxMDA3ODgxMzA3ODkxNjA3OGExOTA2OGMxYjA2OGQxZDA2OGUyMDA2OGYyMjA2OTAyNDA2OTEyNjA1OTEyODA1OTIyYTA1OTMyYzA1OTQyZTA1OTUyZjA1OTYzMTA1OTczMzA1OTczNTA0OTgzNzA0OTkzODA0OWEzYTA0OWEzYzA0OWIzZTA0OWMzZjA0OWM0MTA0OWQ0MzAzOWU0NDAzOWU0NjAzOWY0ODAzOWY0OTAzYTA0YjAzYTE0YzAyYTE0ZTAyYTI1MDAyYTI1MTAyYTM1MzAyYTM1NTAyYTQ1NjAxYTQ1ODAxYTQ1OTAxYTU1YjAxYTU1YzAxYTY1ZTAxYTY2MDAxYTY2MTAwYTc2MzAwYTc2NDAwYTc2NjAwYTc2NzAwYTg2OTAwYTg2YTAwYTg2YzAwYTg2ZTAwYTg2ZjAwYTg3MTAwYTg3MjAxYTg3NDAxYTg3NTAxYTg3NzAxYTg3ODAxYTg3YTAyYTg3YjAyYTg3ZDAzYTg3ZTAzYTg4MDA0YTg4MTA0YTc4MzA1YTc4NDA1YTc4NjA2YTY4NzA3YTY4ODA4YTY4YTA5YTU4YjBhYTU4ZDBiYTU4ZTBjYTQ4ZjBkYTQ5MTBlYTM5MjBmYTM5NDEwYTI5NTExYTE5NjEzYTE5ODE0YTA5OTE1OWY5YTE2OWY5YzE3OWU5ZDE4OWQ5ZTE5OWRhMDFhOWNhMTFiOWJhMjFkOWFhMzFlOWFhNTFmOTlhNjIwOThhNzIxOTdhODIyOTZhYTIzOTVhYjI0OTRhYzI2OTRhZDI3OTNhZTI4OTJiMDI5OTFiMTJhOTBiMjJiOGZiMzJjOGViNDJlOGRiNTJmOGNiNjMwOGJiNzMxOGFiODMyODliYTMzODhiYjM0ODhiYzM1ODdiZDM3ODZiZTM4ODViZjM5ODRjMDNhODNjMTNiODJjMjNjODFjMzNkODBjNDNlN2ZjNTQwN2VjNjQxN2RjNzQyN2NjODQzN2JjOTQ0N2FjYTQ1N2FjYjQ2NzljYzQ3NzhjYzQ5NzdjZDRhNzZjZTRiNzVjZjRjNzRkMDRkNzNkMTRlNzJkMjRmNzFkMzUxNzFkNDUyNzBkNTUzNmZkNTU0NmVkNjU1NmRkNzU2NmNkODU3NmJkOTU4NmFkYTVhNmFkYTViNjlkYjVjNjhkYzVkNjdkZDVlNjZkZTVmNjVkZTYxNjRkZjYyNjNlMDYzNjNlMTY0NjJlMjY1NjFlMjY2NjBlMzY4NWZlNDY5NWVlNTZhNWRlNTZiNWRlNjZjNWNlNzZlNWJlNzZmNWFlODcwNTllOTcxNThlOTcyNTdlYTc0NTdlYjc1NTZlYjc2NTVlYzc3NTRlZDc5NTNlZDdhNTJlZTdiNTFlZjdjNTFlZjdlNTBmMDdmNGZmMDgwNGVmMTgxNGRmMTgzNGNmMjg0NGJmMzg1NGJmMzg3NGFmNDg4NDlmNDg5NDhmNThiNDdmNThjNDZmNjhkNDVmNjhmNDRmNzkwNDRmNzkxNDNmNzkzNDJmODk0NDFmODk1NDBmOTk3M2ZmOTk4M2VmOTlhM2VmYTliM2RmYTljM2NmYTllM2JmYjlmM2FmYmExMzlmYmEyMzhmY2EzMzhmY2E1MzdmY2E2MzZmY2E4MzVmY2E5MzRmZGFiMzNmZGFjMzNmZGFlMzJmZGFmMzFmZGIxMzBmZGIyMmZmZGI0MmZmZGI1MmVmZWI3MmRmZWI4MmNmZWJhMmNmZWJiMmJmZWJkMmFmZWJlMmFmZWMwMjlmZGMyMjlmZGMzMjhmZGM1MjdmZGM2MjdmZGM4MjdmZGNhMjZmZGNiMjZmY2NkMjVmY2NlMjVmY2QwMjVmY2QyMjVmYmQzMjRmYmQ1MjRmYmQ3MjRmYWQ4MjRmYWRhMjRmOWRjMjRmOWRkMjVmOGRmMjVmOGUxMjVmN2UyMjVmN2U0MjVmNmU2MjZmNmU4MjZmNWU5MjZmNWViMjdmNGVkMjdmM2VlMjdmM2YwMjdmMmYyMjdmMWY0MjZmMWY1MjVmMGY3MjRmMGY5MjEiKSksVTQ9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLGo0PXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDpVNCx4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyJ9O2Z1bmN0aW9uIEc0KHQpe3ZhciBlPXQrPSIiLG49ZS5pbmRleE9mKCI6Iik7cmV0dXJuIG4+PTAmJiJ4bWxucyIhPT0oZT10LnNsaWNlKDAsbikpJiYodD10LnNsaWNlKG4rMSkpLGo0Lmhhc093blByb3BlcnR5KGUpP3tzcGFjZTpqNFtlXSxsb2NhbDp0fTp0fWZ1bmN0aW9uIFc0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMub3duZXJEb2N1bWVudCxuPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBuPT09VTQmJmUuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PVU0P2UuY3JlYXRlRWxlbWVudCh0KTplLmNyZWF0ZUVsZW1lbnROUyhuLHQpfX1mdW5jdGlvbiBxNCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBZNCh0KXt2YXIgZT1HNCh0KTtyZXR1cm4oZS5sb2NhbD9xNDpXNCkoZSl9ZnVuY3Rpb24gWDQoKXt9ZnVuY3Rpb24gJDQodCl7cmV0dXJuIG51bGw9PXQ/WDQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpfX1mdW5jdGlvbiBLNCgpe3JldHVybltdfWZ1bmN0aW9uIFo0KHQpe3JldHVybiBudWxsPT10P0s0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbCh0KX19dmFyIEo0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hdGNoZXModCl9fTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KXt2YXIgUTQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2lmKCFRNC5tYXRjaGVzKXt2YXIgdDY9UTQud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxRNC5tc01hdGNoZXNTZWxlY3Rvcnx8UTQubW96TWF0Y2hlc1NlbGVjdG9yfHxRNC5vTWF0Y2hlc1NlbGVjdG9yO0o0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0Ni5jYWxsKHRoaXMsdCl9fX19dmFyIGU2PUo0O2Z1bmN0aW9uIG42KHQpe3JldHVybiBuZXcgQXJyYXkodC5sZW5ndGgpfWZ1bmN0aW9uIGk2KHQsZSl7dGhpcy5vd25lckRvY3VtZW50PXQub3duZXJEb2N1bWVudCx0aGlzLm5hbWVzcGFjZVVSST10Lm5hbWVzcGFjZVVSSSx0aGlzLl9uZXh0PW51bGwsdGhpcy5fcGFyZW50PXQsdGhpcy5fX2RhdGFfXz1lfWZ1bmN0aW9uIHI2KHQsZSxuLGkscixvKXtmb3IodmFyIGEscz0wLGw9ZS5sZW5ndGgsYz1vLmxlbmd0aDtzPGM7KytzKShhPWVbc10pPyhhLl9fZGF0YV9fPW9bc10saVtzXT1hKTpuW3NdPW5ldyBpNih0LG9bc10pO2Zvcig7czxsOysrcykoYT1lW3NdKSYmKHJbc109YSl9ZnVuY3Rpb24gbzYodCxlLG4saSxyLG8sYSl7dmFyIHMsbCxjLHU9e30saD1lLmxlbmd0aCxkPW8ubGVuZ3RoLHA9bmV3IEFycmF5KGgpO2ZvcihzPTA7czxoOysrcykobD1lW3NdKSYmKHBbc109Yz0iJCIrYS5jYWxsKGwsbC5fX2RhdGFfXyxzLGUpLGMgaW4gdT9yW3NdPWw6dVtjXT1sKTtmb3Iocz0wO3M8ZDsrK3MpKGw9dVtjPSIkIithLmNhbGwodCxvW3NdLHMsbyldKT8oaVtzXT1sLGwuX19kYXRhX189b1tzXSx1W2NdPW51bGwpOm5bc109bmV3IGk2KHQsb1tzXSk7Zm9yKHM9MDtzPGg7KytzKShsPWVbc10pJiZ1W3Bbc11dPT09bCYmKHJbc109bCl9ZnVuY3Rpb24gYTYodCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOnQ+PWU/MDpOYU59ZnVuY3Rpb24gczYodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIGw2KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gYzYodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZSh0LGUpfX1mdW5jdGlvbiB1Nih0LGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGUpfX1mdW5jdGlvbiBoNih0LGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PW4/dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCk6dGhpcy5zZXRBdHRyaWJ1dGUodCxuKX19ZnVuY3Rpb24gZDYodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTp0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxuKX19ZnVuY3Rpb24gcDYodCl7cmV0dXJuIHQub3duZXJEb2N1bWVudCYmdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx0LmRvY3VtZW50JiZ0fHx0LmRlZmF1bHRWaWV3fWZ1bmN0aW9uIGY2KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fWZ1bmN0aW9uIG02KHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsZSxuKX19ZnVuY3Rpb24gZzYodCxlLG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBpPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWk/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsaSxuKX19ZnVuY3Rpb24gXzYodCxlKXtyZXR1cm4gdC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKGUpfHxwNih0KS5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShlKX1mdW5jdGlvbiB5Nih0KXtyZXR1cm4gZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t0XX19ZnVuY3Rpb24gdjYodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzW3RdPWV9fWZ1bmN0aW9uIGI2KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj9kZWxldGUgdGhpc1t0XTp0aGlzW3RdPW59fWZ1bmN0aW9uIHg2KHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiB3Nih0KXtyZXR1cm4gdC5jbGFzc0xpc3R8fG5ldyBTNih0KX1mdW5jdGlvbiBTNih0KXt0aGlzLl9ub2RlPXQsdGhpcy5fbmFtZXM9eDYodC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX1mdW5jdGlvbiBNNih0LGUpe2Zvcih2YXIgbj13Nih0KSxpPS0xLHI9ZS5sZW5ndGg7KytpPHI7KW4uYWRkKGVbaV0pfWZ1bmN0aW9uIEU2KHQsZSl7Zm9yKHZhciBuPXc2KHQpLGk9LTEscj1lLmxlbmd0aDsrK2k8cjspbi5yZW1vdmUoZVtpXSl9ZnVuY3Rpb24gVDYodCl7cmV0dXJuIGZ1bmN0aW9uKCl7TTYodGhpcyx0KX19ZnVuY3Rpb24gQzYodCl7cmV0dXJuIGZ1bmN0aW9uKCl7RTYodGhpcyx0KX19ZnVuY3Rpb24gQTYodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXsoZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk/TTY6RTYpKHRoaXMsdCl9fWZ1bmN0aW9uIGs2KCl7dGhpcy50ZXh0Q29udGVudD0iIn1mdW5jdGlvbiBMNih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fWZ1bmN0aW9uIFA2KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09ZT8iIjplfX1mdW5jdGlvbiBONigpe3RoaXMuaW5uZXJIVE1MPSIifWZ1bmN0aW9uIEk2KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPXR9fWZ1bmN0aW9uIFI2KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaW5uZXJIVE1MPW51bGw9PWU/IiI6ZX19ZnVuY3Rpb24gTzYoKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gejYoKXt0aGlzLnByZXZpb3VzU2libGluZyYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKX1mdW5jdGlvbiBENigpe3JldHVybiBudWxsfWZ1bmN0aW9uIEI2KCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gSDYoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZSghMSksdGhpcy5uZXh0U2libGluZyl9ZnVuY3Rpb24gRjYoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZSghMCksdGhpcy5uZXh0U2libGluZyl9aTYucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjppNixhcHBlbmRDaGlsZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LHRoaXMuX25leHQpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LGUpfSxxdWVyeVNlbGVjdG9yOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3Rvcih0KX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCl9fSxTNi5wcm90b3R5cGU9e2FkZDpmdW5jdGlvbih0KXt0aGlzLl9uYW1lcy5pbmRleE9mKHQpPDAmJih0aGlzLl9uYW1lcy5wdXNoKHQpLHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5fbmFtZXMuam9pbigiICIpKSl9LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9uYW1lcy5pbmRleE9mKHQpO2U+PTAmJih0aGlzLl9uYW1lcy5zcGxpY2UoZSwxKSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxjb250YWluczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZih0KT49MH19O3ZhciBWNj17fSxVNj1udWxsO2Z1bmN0aW9uIGo2KHQsZSxuKXtyZXR1cm4gdD1HNih0LGUsbiksZnVuY3Rpb24oZSl7dmFyIG49ZS5yZWxhdGVkVGFyZ2V0O24mJihuPT09dGhpc3x8OCZuLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpKXx8dC5jYWxsKHRoaXMsZSl9fWZ1bmN0aW9uIEc2KHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIHI9VTY7VTY9aTt0cnl7dC5jYWxsKHRoaXMsdGhpcy5fX2RhdGFfXyxlLG4pfWZpbmFsbHl7VTY9cn19fWZ1bmN0aW9uIFc2KHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlPSIiLG49dC5pbmRleE9mKCIuIik7cmV0dXJuIG4+PTAmJihlPXQuc2xpY2UobisxKSx0PXQuc2xpY2UoMCxuKSkse3R5cGU6dCxuYW1lOmV9fSkpfWZ1bmN0aW9uIHE2KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuX19vbjtpZihlKXtmb3IodmFyIG4saT0wLHI9LTEsbz1lLmxlbmd0aDtpPG87KytpKW49ZVtpXSx0LnR5cGUmJm4udHlwZSE9PXQudHlwZXx8bi5uYW1lIT09dC5uYW1lP2VbKytyXT1uOnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLnR5cGUsbi5saXN0ZW5lcixuLmNhcHR1cmUpOysrcj9lLmxlbmd0aD1yOmRlbGV0ZSB0aGlzLl9fb259fX1mdW5jdGlvbiBZNih0LGUsbil7dmFyIGk9VjYuaGFzT3duUHJvcGVydHkodC50eXBlKT9qNjpHNjtyZXR1cm4gZnVuY3Rpb24ocixvLGEpe3ZhciBzLGw9dGhpcy5fX29uLGM9aShlLG8sYSk7aWYobClmb3IodmFyIHU9MCxoPWwubGVuZ3RoO3U8aDsrK3UpaWYoKHM9bFt1XSkudHlwZT09PXQudHlwZSYmcy5uYW1lPT09dC5uYW1lKXJldHVybiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIocy50eXBlLHMubGlzdGVuZXIscy5jYXB0dXJlKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIocy50eXBlLHMubGlzdGVuZXI9YyxzLmNhcHR1cmU9biksdm9pZChzLnZhbHVlPWUpO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LnR5cGUsYyxuKSxzPXt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSx2YWx1ZTplLGxpc3RlbmVyOmMsY2FwdHVyZTpufSxsP2wucHVzaChzKTp0aGlzLl9fb249W3NdfX1mdW5jdGlvbiBYNih0LGUsbil7dmFyIGk9cDYodCkscj1pLkN1c3RvbUV2ZW50OyJmdW5jdGlvbiI9PXR5cGVvZiByP3I9bmV3IHIoZSxuKToocj1pLmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLG4/KHIuaW5pdEV2ZW50KGUsbi5idWJibGVzLG4uY2FuY2VsYWJsZSksci5kZXRhaWw9bi5kZXRhaWwpOnIuaW5pdEV2ZW50KGUsITEsITEpKSx0LmRpc3BhdGNoRXZlbnQocil9ZnVuY3Rpb24gJDYodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gWDYodGhpcyx0LGUpfX1mdW5jdGlvbiBLNih0LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBYNih0aGlzLHQsZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX0idW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiYoIm9ubW91c2VlbnRlciJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fChWNj17bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9KSk7dmFyIFo2PVtudWxsXTtmdW5jdGlvbiBKNih0LGUpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9ZX1mdW5jdGlvbiBRNigpe3JldHVybiBuZXcgSjYoW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSxaNil9ZnVuY3Rpb24gdDkodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P25ldyBKNihbW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCldXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IEo2KFtbdF1dLFo2KX1KNi5wcm90b3R5cGU9UTYucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpKNixzZWxlY3Q6ZnVuY3Rpb24gZTkodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PSQ0KHQpKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49ZS5sZW5ndGgsaT1uZXcgQXJyYXkobikscj0wO3I8bjsrK3IpZm9yKHZhciBvLGEscz1lW3JdLGw9cy5sZW5ndGgsYz1pW3JdPW5ldyBBcnJheShsKSx1PTA7dTxsOysrdSkobz1zW3VdKSYmKGE9dC5jYWxsKG8sby5fX2RhdGFfXyx1LHMpKSYmKCJfX2RhdGFfXyJpbiBvJiYoYS5fX2RhdGFfXz1vLl9fZGF0YV9fKSxjW3VdPWEpO3JldHVybiBuZXcgSjYoaSx0aGlzLl9wYXJlbnRzKX0sc2VsZWN0QWxsOmZ1bmN0aW9uIG45KHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1aNCh0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9W10scj1bXSxvPTA7bzxuOysrbylmb3IodmFyIGEscz1lW29dLGw9cy5sZW5ndGgsYz0wO2M8bDsrK2MpKGE9c1tjXSkmJihpLnB1c2godC5jYWxsKGEsYS5fX2RhdGFfXyxjLHMpKSxyLnB1c2goYSkpO3JldHVybiBuZXcgSjYoaSxyKX0sZmlsdGVyOmZ1bmN0aW9uIGk5KHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1lNih0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWZvcih2YXIgbyxhPWVbcl0scz1hLmxlbmd0aCxsPWlbcl09W10sYz0wO2M8czsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmbC5wdXNoKG8pO3JldHVybiBuZXcgSjYoaSx0aGlzLl9wYXJlbnRzKX0sZGF0YTpmdW5jdGlvbiByOSh0LGUpe2lmKCF0KXJldHVybiBmPW5ldyBBcnJheSh0aGlzLnNpemUoKSksdT0tMSx0aGlzLmVhY2goKGZ1bmN0aW9uKHQpe2ZbKyt1XT10fSkpLGY7dmFyIG49ZT9vNjpyNixpPXRoaXMuX3BhcmVudHMscj10aGlzLl9ncm91cHM7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PShmdW5jdGlvbiBvKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0pKHQpKTtmb3IodmFyIGE9ci5sZW5ndGgscz1uZXcgQXJyYXkoYSksbD1uZXcgQXJyYXkoYSksYz1uZXcgQXJyYXkoYSksdT0wO3U8YTsrK3Upe3ZhciBoPWlbdV0sZD1yW3VdLHA9ZC5sZW5ndGgsZj10LmNhbGwoaCxoJiZoLl9fZGF0YV9fLHUsaSksbT1mLmxlbmd0aCxnPWxbdV09bmV3IEFycmF5KG0pLF89c1t1XT1uZXcgQXJyYXkobSk7bihoLGQsZyxfLGNbdV09bmV3IEFycmF5KHApLGYsZSk7Zm9yKHZhciB5LHYsYj0wLHg9MDtiPG07KytiKWlmKHk9Z1tiXSl7Zm9yKGI+PXgmJih4PWIrMSk7ISh2PV9beF0pJiYrK3g8bTspO3kuX25leHQ9dnx8bnVsbH19cmV0dXJuKHM9bmV3IEo2KHMsaSkpLl9lbnRlcj1sLHMuX2V4aXQ9YyxzfSxlbnRlcjpmdW5jdGlvbiBvOSgpe3JldHVybiBuZXcgSjYodGhpcy5fZW50ZXJ8fHRoaXMuX2dyb3Vwcy5tYXAobjYpLHRoaXMuX3BhcmVudHMpfSxleGl0OmZ1bmN0aW9uIGE5KCl7cmV0dXJuIG5ldyBKNih0aGlzLl9leGl0fHx0aGlzLl9ncm91cHMubWFwKG42KSx0aGlzLl9wYXJlbnRzKX0sbWVyZ2U6ZnVuY3Rpb24gczkodCl7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPXQuX2dyb3VwcyxpPWUubGVuZ3RoLHI9TWF0aC5taW4oaSxuLmxlbmd0aCksbz1uZXcgQXJyYXkoaSksYT0wO2E8cjsrK2EpZm9yKHZhciBzLGw9ZVthXSxjPW5bYV0sdT1sLmxlbmd0aCxoPW9bYV09bmV3IEFycmF5KHUpLGQ9MDtkPHU7KytkKShzPWxbZF18fGNbZF0pJiYoaFtkXT1zKTtmb3IoO2E8aTsrK2Epb1thXT1lW2FdO3JldHVybiBuZXcgSjYobyx0aGlzLl9wYXJlbnRzKX0sb3JkZXI6ZnVuY3Rpb24gbDkoKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLGU9LTEsbj10Lmxlbmd0aDsrK2U8bjspZm9yKHZhciBpLHI9dFtlXSxvPXIubGVuZ3RoLTEsYT1yW29dOy0tbz49MDspKGk9cltvXSkmJihhJiZhIT09aS5uZXh0U2libGluZyYmYS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShpLGEpLGE9aSk7cmV0dXJuIHRoaXN9LHNvcnQ6ZnVuY3Rpb24gYzkodCl7ZnVuY3Rpb24gZShlLG4pe3JldHVybiBlJiZuP3QoZS5fX2RhdGFfXyxuLl9fZGF0YV9fKTohZS0hbn10fHwodD1hNik7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxpPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGkpLG89MDtvPGk7KytvKXtmb3IodmFyIGEscz1uW29dLGw9cy5sZW5ndGgsYz1yW29dPW5ldyBBcnJheShsKSx1PTA7dTxsOysrdSkoYT1zW3VdKSYmKGNbdV09YSk7Yy5zb3J0KGUpfXJldHVybiBuZXcgSjYocix0aGlzLl9wYXJlbnRzKS5vcmRlcigpfSxjYWxsOmZ1bmN0aW9uIHU5KCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMF09dGhpcyx0LmFwcGx5KG51bGwsYXJndW1lbnRzKSx0aGlzfSxub2RlczpmdW5jdGlvbiBoOSgpe3ZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSksZT0tMTtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3RbKytlXT10aGlzfSkpLHR9LG5vZGU6ZnVuY3Rpb24gZDkoKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLGU9MCxuPXQubGVuZ3RoO2U8bjsrK2UpZm9yKHZhciBpPXRbZV0scj0wLG89aS5sZW5ndGg7cjxvOysrcil7dmFyIGE9aVtyXTtpZihhKXJldHVybiBhfXJldHVybiBudWxsfSxzaXplOmZ1bmN0aW9uIHA5KCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpeysrdH0pKSx0fSxlbXB0eTpmdW5jdGlvbiBmOSgpe3JldHVybiF0aGlzLm5vZGUoKX0sZWFjaDpmdW5jdGlvbiBtOSh0KXtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49MCxpPWUubGVuZ3RoO248aTsrK24pZm9yKHZhciByLG89ZVtuXSxhPTAscz1vLmxlbmd0aDthPHM7KythKShyPW9bYV0pJiZ0LmNhbGwocixyLl9fZGF0YV9fLGEsbyk7cmV0dXJuIHRoaXN9LGF0dHI6ZnVuY3Rpb24gZzkodCxlKXt2YXIgbj1HNCh0KTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciBpPXRoaXMubm9kZSgpO3JldHVybiBuLmxvY2FsP2kuZ2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsKTppLmdldEF0dHJpYnV0ZShuKX1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1lP24ubG9jYWw/bDY6czY6ImZ1bmN0aW9uIj09dHlwZW9mIGU/bi5sb2NhbD9kNjpoNjpuLmxvY2FsP3U2OmM2KShuLGUpKX0sc3R5bGU6ZnVuY3Rpb24gXzkodCxlLG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKChudWxsPT1lP2Y2OiJmdW5jdGlvbiI9PXR5cGVvZiBlP2c2Om02KSh0LGUsbnVsbD09bj8iIjpuKSk6XzYodGhpcy5ub2RlKCksdCl9LHByb3BlcnR5OmZ1bmN0aW9uIHk5KHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PWU/eTY6ImZ1bmN0aW9uIj09dHlwZW9mIGU/YjY6djYpKHQsZSkpOnRoaXMubm9kZSgpW3RdfSxjbGFzc2VkOmZ1bmN0aW9uIHY5KHQsZSl7dmFyIG49eDYodCsiIik7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodmFyIGk9dzYodGhpcy5ub2RlKCkpLHI9LTEsbz1uLmxlbmd0aDsrK3I8bzspaWYoIWkuY29udGFpbnMobltyXSkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIGU/QTY6ZT9UNjpDNikobixlKSl9LHRleHQ6ZnVuY3Rpb24gYjkodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKG51bGw9PXQ/azY6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P1A2Okw2KSh0KSk6dGhpcy5ub2RlKCkudGV4dENvbnRlbnR9LGh0bWw6ZnVuY3Rpb24geDkodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKG51bGw9PXQ/TjY6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P1I2Okk2KSh0KSk6dGhpcy5ub2RlKCkuaW5uZXJIVE1MfSxyYWlzZTpmdW5jdGlvbiB3OSgpe3JldHVybiB0aGlzLmVhY2goTzYpfSxsb3dlcjpmdW5jdGlvbiBTOSgpe3JldHVybiB0aGlzLmVhY2goejYpfSxhcHBlbmQ6ZnVuY3Rpb24gTTkodCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpZNCh0KTtyZXR1cm4gdGhpcy5zZWxlY3QoKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSkpfSxpbnNlcnQ6ZnVuY3Rpb24gRTkodCxlKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Olk0KHQpLGk9bnVsbD09ZT9ENjoiZnVuY3Rpb24iPT10eXBlb2YgZT9lOiQ0KGUpO3JldHVybiB0aGlzLnNlbGVjdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUobi5hcHBseSh0aGlzLGFyZ3VtZW50cyksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSkpfSxyZW1vdmU6ZnVuY3Rpb24gVDkoKXtyZXR1cm4gdGhpcy5lYWNoKEI2KX0sY2xvbmU6ZnVuY3Rpb24gQzkodCl7cmV0dXJuIHRoaXMuc2VsZWN0KHQ/RjY6SDYpfSxkYXR1bTpmdW5jdGlvbiBBOSh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsdCk6dGhpcy5ub2RlKCkuX19kYXRhX199LG9uOmZ1bmN0aW9uIGs5KHQsZSxuKXt2YXIgaSxyLG89VzYodCsiIiksYT1vLmxlbmd0aDtpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2ZvcihzPWU/WTY6cTYsbnVsbD09biYmKG49ITEpLGk9MDtpPGE7KytpKXRoaXMuZWFjaChzKG9baV0sZSxuKSk7cmV0dXJuIHRoaXN9dmFyIHM9dGhpcy5ub2RlKCkuX19vbjtpZihzKWZvcih2YXIgbCxjPTAsdT1zLmxlbmd0aDtjPHU7KytjKWZvcihpPTAsbD1zW2NdO2k8YTsrK2kpaWYoKHI9b1tpXSkudHlwZT09PWwudHlwZSYmci5uYW1lPT09bC5uYW1lKXJldHVybiBsLnZhbHVlfSxkaXNwYXRjaDpmdW5jdGlvbiBMOSh0LGUpe3JldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBlP0s2OiQ2KSh0LGUpKX19O3ZhciBQOT0wO2Z1bmN0aW9uIE45KCl7cmV0dXJuIG5ldyBJOX1mdW5jdGlvbiBJOSgpe3RoaXMuXz0iQCIrKCsrUDkpLnRvU3RyaW5nKDM2KX1mdW5jdGlvbiBSOSgpe2Zvcih2YXIgdCxlPVU2O3Q9ZS5zb3VyY2VFdmVudDspZT10O3JldHVybiBlfWZ1bmN0aW9uIE85KHQsZSl7dmFyIG49dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYobi5jcmVhdGVTVkdQb2ludCl7dmFyIGk9bi5jcmVhdGVTVkdQb2ludCgpO3JldHVybiBpLng9ZS5jbGllbnRYLGkueT1lLmNsaWVudFksWyhpPWkubWF0cml4VHJhbnNmb3JtKHQuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSkueCxpLnldfXZhciByPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW2UuY2xpZW50WC1yLmxlZnQtdC5jbGllbnRMZWZ0LGUuY2xpZW50WS1yLnRvcC10LmNsaWVudFRvcF19STkucHJvdG90eXBlPU45LnByb3RvdHlwZT17Y29uc3RydWN0b3I6STksZ2V0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl87IShlIGluIHQpOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHRbZV19LHNldDpmdW5jdGlvbih0LGUpe3JldHVybiB0W3RoaXMuX109ZX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl8gaW4gdCYmZGVsZXRlIHRbdGhpcy5fXX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX07dmFyIHo5PU1hdGguUEksRDk9Mip6OSxCOT0xZS02LEg5PUQ5LUI5O2Z1bmN0aW9uIEY5KCl7dGhpcy5feDA9dGhpcy5feTA9dGhpcy5feDE9dGhpcy5feTE9bnVsbCx0aGlzLl89IiJ9ZnVuY3Rpb24gVjkoKXtyZXR1cm4gbmV3IEY5fWZ1bmN0aW9uIFU5KHQpe3JldHVybiBmdW5jdGlvbiBlKCl7cmV0dXJuIHR9fUY5LnByb3RvdHlwZT1WOS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkY5LG1vdmVUbzpmdW5jdGlvbih0LGUpe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rZSl9LGNsb3NlUGF0aDpmdW5jdGlvbigpe251bGwhPT10aGlzLl94MSYmKHRoaXMuX3gxPXRoaXMuX3gwLHRoaXMuX3kxPXRoaXMuX3kwLHRoaXMuXys9IloiKX0sbGluZVRvOmZ1bmN0aW9uKHQsZSl7dGhpcy5fKz0iTCIrKHRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kxPStlKX0scXVhZHJhdGljQ3VydmVUbzpmdW5jdGlvbih0LGUsbixpKXt0aGlzLl8rPSJRIisgK3QrIiwiKyArZSsiLCIrKHRoaXMuX3gxPStuKSsiLCIrKHRoaXMuX3kxPStpKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LGUsbixpLHIsbyl7dGhpcy5fKz0iQyIrICt0KyIsIisgK2UrIiwiKyArbisiLCIrICtpKyIsIisodGhpcy5feDE9K3IpKyIsIisodGhpcy5feTE9K28pfSxhcmNUbzpmdW5jdGlvbih0LGUsbixpLHIpe3ZhciBvPXRoaXMuX3gxLGE9dGhpcy5feTEscz0obj0rbiktKHQ9K3QpLGw9KGk9K2kpLShlPStlKSxjPW8tdCx1PWEtZSxoPWMqYyt1KnU7aWYoKHI9K3IpPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIrcik7aWYobnVsbD09PXRoaXMuX3gxKXRoaXMuXys9Ik0iKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPWUpO2Vsc2UgaWYoaD5COSlpZihNYXRoLmFicyh1KnMtbCpjKT5COSYmcil7dmFyIGQ9bi1vLHA9aS1hLGY9cypzK2wqbCxtPWQqZCtwKnAsZz1NYXRoLnNxcnQoZiksXz1NYXRoLnNxcnQoaCkseT1yKk1hdGgudGFuKCh6OS1NYXRoLmFjb3MoKGYraC1tKS8oMipnKl8pKSkvMiksdj15L18sYj15L2c7TWF0aC5hYnModi0xKT5COSYmKHRoaXMuXys9IkwiKyh0K3YqYykrIiwiKyhlK3YqdSkpLHRoaXMuXys9IkEiK3IrIiwiK3IrIiwwLDAsIisgKyh1KmQ+YypwKSsiLCIrKHRoaXMuX3gxPXQrYipzKSsiLCIrKHRoaXMuX3kxPWUrYipsKX1lbHNlIHRoaXMuXys9IkwiKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPWUpfSxhcmM6ZnVuY3Rpb24odCxlLG4saSxyLG8pe3Q9K3QsZT0rZSxvPSEhbzt2YXIgYT0obj0rbikqTWF0aC5jb3MoaSkscz1uKk1hdGguc2luKGkpLGw9dCthLGM9ZStzLHU9MV5vLGg9bz9pLXI6ci1pO2lmKG48MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIituKTtudWxsPT09dGhpcy5feDE/dGhpcy5fKz0iTSIrbCsiLCIrYzooTWF0aC5hYnModGhpcy5feDEtbCk+Qjl8fE1hdGguYWJzKHRoaXMuX3kxLWMpPkI5KSYmKHRoaXMuXys9IkwiK2wrIiwiK2MpLG4mJihoPDAmJihoPWglRDkrRDkpLGg+SDk/dGhpcy5fKz0iQSIrbisiLCIrbisiLDAsMSwiK3UrIiwiKyh0LWEpKyIsIisoZS1zKSsiQSIrbisiLCIrbisiLDAsMSwiK3UrIiwiKyh0aGlzLl94MT1sKSsiLCIrKHRoaXMuX3kxPWMpOmg+QjkmJih0aGlzLl8rPSJBIituKyIsIituKyIsMCwiKyArKGg+PXo5KSsiLCIrdSsiLCIrKHRoaXMuX3gxPXQrbipNYXRoLmNvcyhyKSkrIiwiKyh0aGlzLl95MT1lK24qTWF0aC5zaW4ocikpKSl9LHJlY3Q6ZnVuY3Rpb24odCxlLG4saSl7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStlKSsiaCIrICtuKyJ2IisgK2krImgiKy1uKyJaIn0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX07dmFyIGo5PU1hdGguYWJzLEc5PU1hdGguYXRhbjIsVzk9TWF0aC5jb3MscTk9TWF0aC5tYXgsWTk9TWF0aC5taW4sWDk9TWF0aC5zaW4sJDk9TWF0aC5zcXJ0LEs5PTFlLTEyLFo5PU1hdGguUEksSjk9WjkvMixROT0yKlo5O2Z1bmN0aW9uIHQ4KHQpe3JldHVybiB0PjE/MDp0PC0xP1o5Ok1hdGguYWNvcyh0KX1mdW5jdGlvbiBlOCh0KXtyZXR1cm4gdD49MT9KOTp0PD0tMT8tSjk6TWF0aC5hc2luKHQpfWZ1bmN0aW9uIG44KHQpe3JldHVybiB0LmlubmVyUmFkaXVzfWZ1bmN0aW9uIGk4KHQpe3JldHVybiB0Lm91dGVyUmFkaXVzfWZ1bmN0aW9uIHI4KHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gbzgodCl7cmV0dXJuIHQuZW5kQW5nbGV9ZnVuY3Rpb24gYTgodCl7cmV0dXJuIHQmJnQucGFkQW5nbGV9ZnVuY3Rpb24gczgodCxlLG4saSxyLG8sYSxzKXt2YXIgbD1uLXQsYz1pLWUsdT1hLXIsaD1zLW8sZD0odSooZS1vKS1oKih0LXIpKS8oaCpsLXUqYyk7cmV0dXJuW3QrZCpsLGUrZCpjXX1mdW5jdGlvbiBsOCh0LGUsbixpLHIsbyxhKXt2YXIgcz10LW4sbD1lLWksYz0oYT9vOi1vKS8kOShzKnMrbCpsKSx1PWMqbCxoPS1jKnMsZD10K3UscD1lK2gsZj1uK3UsbT1pK2gsZz0oZCtmKS8yLF89KHArbSkvMix5PWYtZCx2PW0tcCxiPXkqeSt2KnYseD1yLW8sdz1kKm0tZipwLFM9KHY8MD8tMToxKSokOShxOSgwLHgqeCpiLXcqdykpLE09KHcqdi15KlMpL2IsRT0oLXcqeS12KlMpL2IsVD0odyp2K3kqUykvYixDPSgtdyp5K3YqUykvYixBPU0tZyxrPUUtXyxMPVQtZyxQPUMtXztyZXR1cm4gQSpBK2sqaz5MKkwrUCpQJiYoTT1ULEU9Qykse2N4Ok0sY3k6RSx4MDE6LXUseTAxOi1oLHgxMTpNKihyL3gtMSkseTExOkUqKHIveC0xKX19ZnVuY3Rpb24gYzgodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIHU4KHQpe3JldHVybiBuZXcgYzgodCl9ZnVuY3Rpb24gaDgodCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gZDgodCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gcDgoKXt2YXIgdD1oOCxlPWQ4LG49VTkoITApLGk9bnVsbCxyPXU4LG89bnVsbDtmdW5jdGlvbiBhKGEpe3ZhciBzLGwsYyx1PWEubGVuZ3RoLGg9ITE7Zm9yKG51bGw9PWkmJihvPXIoYz1WOSgpKSkscz0wO3M8PXU7KytzKSEoczx1JiZuKGw9YVtzXSxzLGEpKT09PWgmJigoaD0haCk/by5saW5lU3RhcnQoKTpvLmxpbmVFbmQoKSksaCYmby5wb2ludCgrdChsLHMsYSksK2UobCxzLGEpKTtpZihjKXJldHVybiBvPW51bGwsYysiInx8bnVsbH1yZXR1cm4gYS54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6VTkoK2UpLGEpOnR9LGEueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlU5KCt0KSxhKTplfSxhLmRlZmluZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpVOSghIXQpLGEpOm59LGEuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxudWxsIT1pJiYobz1yKGkpKSxhKTpyfSxhLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/aT1vPW51bGw6bz1yKGk9dCksYSk6aX0sYX1mdW5jdGlvbiBmOCgpe3ZhciB0PWg4LGU9bnVsbCxuPVU5KDApLGk9ZDgscj1VOSghMCksbz1udWxsLGE9dTgscz1udWxsO2Z1bmN0aW9uIGwobCl7dmFyIGMsdSxoLGQscCxmPWwubGVuZ3RoLG09ITEsZz1uZXcgQXJyYXkoZiksXz1uZXcgQXJyYXkoZik7Zm9yKG51bGw9PW8mJihzPWEocD1WOSgpKSksYz0wO2M8PWY7KytjKXtpZighKGM8ZiYmcihkPWxbY10sYyxsKSk9PT1tKWlmKG09IW0pdT1jLHMuYXJlYVN0YXJ0KCkscy5saW5lU3RhcnQoKTtlbHNle2ZvcihzLmxpbmVFbmQoKSxzLmxpbmVTdGFydCgpLGg9Yy0xO2g+PXU7LS1oKXMucG9pbnQoZ1toXSxfW2hdKTtzLmxpbmVFbmQoKSxzLmFyZWFFbmQoKX1tJiYoZ1tjXT0rdChkLGMsbCksX1tjXT0rbihkLGMsbCkscy5wb2ludChlPytlKGQsYyxsKTpnW2NdLGk/K2koZCxjLGwpOl9bY10pKX1pZihwKXJldHVybiBzPW51bGwscCsiInx8bnVsbH1mdW5jdGlvbiBjKCl7cmV0dXJuIHA4KCkuZGVmaW5lZChyKS5jdXJ2ZShhKS5jb250ZXh0KG8pfXJldHVybiBsLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpVOSgrbiksZT1udWxsLGwpOnR9LGwueDA9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpVOSgrZSksbCk6dH0sbC54MT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpVOSgrdCksbCk6ZX0sbC55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VTkoK3QpLGk9bnVsbCxsKTpufSxsLnkwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VTkoK3QpLGwpOm59LGwueTE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VTkoK3QpLGwpOml9LGwubGluZVgwPWwubGluZVkwPWZ1bmN0aW9uKCl7cmV0dXJuIGMoKS54KHQpLnkobil9LGwubGluZVkxPWZ1bmN0aW9uKCl7cmV0dXJuIGMoKS54KHQpLnkoaSl9LGwubGluZVgxPWZ1bmN0aW9uKCl7cmV0dXJuIGMoKS54KGUpLnkobil9LGwuZGVmaW5lZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlU5KCEhdCksbCk6cn0sbC5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT10LG51bGwhPW8mJihzPWEobykpLGwpOmF9LGwuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9vPXM9bnVsbDpzPWEobz10KSxsKTpvfSxsfWZ1bmN0aW9uIG04KHQsZSl7cmV0dXJuIGU8dD8tMTplPnQ/MTplPj10PzA6TmFOfWZ1bmN0aW9uIGc4KHQpe3JldHVybiB0fWM4LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsZSk7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7ZGVmYXVsdDp0aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpfX19O3ZhciBfOD12OCh1OCk7ZnVuY3Rpb24geTgodCl7dGhpcy5fY3VydmU9dH1mdW5jdGlvbiB2OCh0KXtmdW5jdGlvbiBlKGUpe3JldHVybiBuZXcgeTgodChlKSl9cmV0dXJuIGUuX2N1cnZlPXQsZX1mdW5jdGlvbiBiOCh0KXt2YXIgZT10LmN1cnZlO3JldHVybiB0LmFuZ2xlPXQueCxkZWxldGUgdC54LHQucmFkaXVzPXQueSxkZWxldGUgdC55LHQuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/ZSh2OCh0KSk6ZSgpLl9jdXJ2ZX0sdH1mdW5jdGlvbiB4OCgpe3JldHVybiBiOChwOCgpLmN1cnZlKF84KSl9ZnVuY3Rpb24gdzgoKXt2YXIgdD1mOCgpLmN1cnZlKF84KSxlPXQuY3VydmUsbj10LmxpbmVYMCxpPXQubGluZVgxLHI9dC5saW5lWTAsbz10LmxpbmVZMTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnN0YXJ0QW5nbGU9dC54MCxkZWxldGUgdC54MCx0LmVuZEFuZ2xlPXQueDEsZGVsZXRlIHQueDEsdC5yYWRpdXM9dC55LGRlbGV0ZSB0LnksdC5pbm5lclJhZGl1cz10LnkwLGRlbGV0ZSB0LnkwLHQub3V0ZXJSYWRpdXM9dC55MSxkZWxldGUgdC55MSx0LmxpbmVTdGFydEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIGI4KG4oKSl9LGRlbGV0ZSB0LmxpbmVYMCx0LmxpbmVFbmRBbmdsZT1mdW5jdGlvbigpe3JldHVybiBiOChpKCkpfSxkZWxldGUgdC5saW5lWDEsdC5saW5lSW5uZXJSYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gYjgocigpKX0sZGVsZXRlIHQubGluZVkwLHQubGluZU91dGVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIGI4KG8oKSl9LGRlbGV0ZSB0LmxpbmVZMSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UodjgodCkpOmUoKS5fY3VydmV9LHR9ZnVuY3Rpb24gUzgodCxlKXtyZXR1cm5bKGU9K2UpKk1hdGguY29zKHQtPU1hdGguUEkvMiksZSpNYXRoLnNpbih0KV19eTgucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5hcmVhU3RhcnQoKX0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmFyZWFFbmQoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5saW5lRW5kKCl9LHBvaW50OmZ1bmN0aW9uKHQsZSl7dGhpcy5fY3VydmUucG9pbnQoZSpNYXRoLnNpbih0KSxlKi1NYXRoLmNvcyh0KSl9fTt2YXIgTTg9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIEU4KHQpe3JldHVybiB0LnNvdXJjZX1mdW5jdGlvbiBUOCh0KXtyZXR1cm4gdC50YXJnZXR9ZnVuY3Rpb24gQzgodCl7dmFyIGU9RTgsbj1UOCxpPWg4LHI9ZDgsbz1udWxsO2Z1bmN0aW9uIGEoKXt2YXIgYSxzPU04LmNhbGwoYXJndW1lbnRzKSxsPWUuYXBwbHkodGhpcyxzKSxjPW4uYXBwbHkodGhpcyxzKTtpZihvfHwobz1hPVY5KCkpLHQobywraS5hcHBseSh0aGlzLChzWzBdPWwscykpLCtyLmFwcGx5KHRoaXMscyksK2kuYXBwbHkodGhpcywoc1swXT1jLHMpKSwrci5hcHBseSh0aGlzLHMpKSxhKXJldHVybiBvPW51bGwsYSsiInx8bnVsbH1yZXR1cm4gYS5zb3VyY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxhKTplfSxhLnRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGEpOm59LGEueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlU5KCt0KSxhKTppfSxhLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpVOSgrdCksYSk6cn0sYS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW51bGw9PXQ/bnVsbDp0LGEpOm99LGF9ZnVuY3Rpb24gQTgodCxlLG4saSxyKXt0Lm1vdmVUbyhlLG4pLHQuYmV6aWVyQ3VydmVUbyhlPShlK2kpLzIsbixlLHIsaSxyKX1mdW5jdGlvbiBrOCh0LGUsbixpLHIpe3QubW92ZVRvKGUsbiksdC5iZXppZXJDdXJ2ZVRvKGUsbj0obityKS8yLGksbixpLHIpfWZ1bmN0aW9uIEw4KHQsZSxuLGkscil7dmFyIG89UzgoZSxuKSxhPVM4KGUsbj0obityKS8yKSxzPVM4KGksbiksbD1TOChpLHIpO3QubW92ZVRvKG9bMF0sb1sxXSksdC5iZXppZXJDdXJ2ZVRvKGFbMF0sYVsxXSxzWzBdLHNbMV0sbFswXSxsWzFdKX12YXIgUDg9e2RyYXc6ZnVuY3Rpb24odCxlKXt2YXIgbj1NYXRoLnNxcnQoZS9aOSk7dC5tb3ZlVG8obiwwKSx0LmFyYygwLDAsbiwwLFE5KX19LE44PXtkcmF3OmZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5zcXJ0KGUvNSkvMjt0Lm1vdmVUbygtMypuLC1uKSx0LmxpbmVUbygtbiwtbiksdC5saW5lVG8oLW4sLTMqbiksdC5saW5lVG8obiwtMypuKSx0LmxpbmVUbyhuLC1uKSx0LmxpbmVUbygzKm4sLW4pLHQubGluZVRvKDMqbixuKSx0LmxpbmVUbyhuLG4pLHQubGluZVRvKG4sMypuKSx0LmxpbmVUbygtbiwzKm4pLHQubGluZVRvKC1uLG4pLHQubGluZVRvKC0zKm4sbiksdC5jbG9zZVBhdGgoKX19LEk4PU1hdGguc3FydCgxLzMpLFI4PTIqSTgsTzg9e2RyYXc6ZnVuY3Rpb24odCxlKXt2YXIgbj1NYXRoLnNxcnQoZS9SOCksaT1uKkk4O3QubW92ZVRvKDAsLW4pLHQubGluZVRvKGksMCksdC5saW5lVG8oMCxuKSx0LmxpbmVUbygtaSwwKSx0LmNsb3NlUGF0aCgpfX0sejg9TWF0aC5zaW4oWjkvMTApL01hdGguc2luKDcqWjkvMTApLEQ4PU1hdGguc2luKFE5LzEwKSp6OCxCOD0tTWF0aC5jb3MoUTkvMTApKno4LEg4PXtkcmF3OmZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5zcXJ0KC44OTA4MTMwOTE1MjkyODUyKmUpLGk9RDgqbixyPUI4Km47dC5tb3ZlVG8oMCwtbiksdC5saW5lVG8oaSxyKTtmb3IodmFyIG89MTtvPDU7KytvKXt2YXIgYT1ROSpvLzUscz1NYXRoLmNvcyhhKSxsPU1hdGguc2luKGEpO3QubGluZVRvKGwqbiwtcypuKSx0LmxpbmVUbyhzKmktbCpyLGwqaStzKnIpfXQuY2xvc2VQYXRoKCl9fSxGOD17ZHJhdzpmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguc3FydChlKSxpPS1uLzI7dC5yZWN0KGksaSxuLG4pfX0sVjg9TWF0aC5zcXJ0KDMpLFU4PXtkcmF3OmZ1bmN0aW9uKHQsZSl7dmFyIG49LU1hdGguc3FydChlLygzKlY4KSk7dC5tb3ZlVG8oMCwyKm4pLHQubGluZVRvKC1WOCpuLC1uKSx0LmxpbmVUbyhWOCpuLC1uKSx0LmNsb3NlUGF0aCgpfX0sajg9LS41LEc4PU1hdGguc3FydCgzKS8yLFc4PTEvTWF0aC5zcXJ0KDEyKSxxOD0zKihXOC8yKzEpLFk4PXtkcmF3OmZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5zcXJ0KGUvcTgpLGk9bi8yLHI9bipXOCxvPWksYT1uKlc4K24scz0tbyxsPWE7dC5tb3ZlVG8oaSxyKSx0LmxpbmVUbyhvLGEpLHQubGluZVRvKHMsbCksdC5saW5lVG8oajgqaS1HOCpyLEc4KmkrajgqciksdC5saW5lVG8oajgqby1HOCphLEc4Km8rajgqYSksdC5saW5lVG8oajgqcy1HOCpsLEc4KnMrajgqbCksdC5saW5lVG8oajgqaStHOCpyLGo4KnItRzgqaSksdC5saW5lVG8oajgqbytHOCphLGo4KmEtRzgqbyksdC5saW5lVG8oajgqcytHOCpsLGo4KmwtRzgqcyksdC5jbG9zZVBhdGgoKX19LFg4PVtQOCxOOCxPOCxGOCxIOCxVOCxZOF07ZnVuY3Rpb24gJDgoKXt9ZnVuY3Rpb24gSzgodCxlLG4pe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbygoMip0Ll94MCt0Ll94MSkvMywoMip0Ll95MCt0Ll95MSkvMywodC5feDArMip0Ll94MSkvMywodC5feTArMip0Ll95MSkvMywodC5feDArNCp0Ll94MStlKS82LCh0Ll95MCs0KnQuX3kxK24pLzYpfWZ1bmN0aW9uIFo4KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBKOCh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gUTgodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIHQ3KHQsZSl7dGhpcy5fYmFzaXM9bmV3IFo4KHQpLHRoaXMuX2JldGE9ZX1aOC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAzOks4KHRoaXMsdGhpcy5feDEsdGhpcy5feTEpO2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxlKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2NvbnRleHQubGluZVRvKCg1KnRoaXMuX3gwK3RoaXMuX3gxKS82LCg1KnRoaXMuX3kwK3RoaXMuX3kxKS82KTtkZWZhdWx0Oks4KHRoaXMsdCxlKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPWV9fSxKOC5wcm90b3R5cGU9e2FyZWFTdGFydDokOCxhcmVhRW5kOiQ4LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MisyKnRoaXMuX3gzKS8zLCh0aGlzLl95MisyKnRoaXMuX3kzKS8zKSx0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMrMip0aGlzLl94MikvMywodGhpcy5feTMrMip0aGlzLl95MikvMyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95MiksdGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCl9fSxwb2ludDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gyPXQsdGhpcy5feTI9ZTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94Mz10LHRoaXMuX3kzPWU7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDQ9dCx0aGlzLl95ND1lLHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYsKHRoaXMuX3kwKzQqdGhpcy5feTErZSkvNik7YnJlYWs7ZGVmYXVsdDpLOCh0aGlzLHQsZSl9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1lfX0sUTgucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7dmFyIG49KHRoaXMuX3gwKzQqdGhpcy5feDErdCkvNixpPSh0aGlzLl95MCs0KnRoaXMuX3kxK2UpLzY7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyhuLGkpOnRoaXMuX2NvbnRleHQubW92ZVRvKG4saSk7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpLOCh0aGlzLHQsZSl9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1lfX0sdDcucHJvdG90eXBlPXtsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PVtdLHRoaXMuX3k9W10sdGhpcy5fYmFzaXMubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl94LGU9dGhpcy5feSxuPXQubGVuZ3RoLTE7aWYobj4wKWZvcih2YXIgaSxyPXRbMF0sbz1lWzBdLGE9dFtuXS1yLHM9ZVtuXS1vLGw9LTE7KytsPD1uOyl0aGlzLl9iYXNpcy5wb2ludCh0aGlzLl9iZXRhKnRbbF0rKDEtdGhpcy5fYmV0YSkqKHIrKGk9bC9uKSphKSx0aGlzLl9iZXRhKmVbbF0rKDEtdGhpcy5fYmV0YSkqKG8raSpzKSk7dGhpcy5feD10aGlzLl95PW51bGwsdGhpcy5fYmFzaXMubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LGUpe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtlKX19O3ZhciBlNz0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiAxPT09ZT9uZXcgWjgodCk6bmV3IHQ3KHQsZSl9cmV0dXJuIG4uYmV0YT1mdW5jdGlvbihlKXtyZXR1cm4gdCgrZSl9LG59KSguODUpO2Z1bmN0aW9uIG43KHQsZSxuKXt0Ll9jb250ZXh0LmJlemllckN1cnZlVG8odC5feDErdC5fayoodC5feDItdC5feDApLHQuX3kxK3QuX2sqKHQuX3kyLXQuX3kwKSx0Ll94Mit0Ll9rKih0Ll94MS1lKSx0Ll95Mit0Ll9rKih0Ll95MS1uKSx0Ll94Mix0Ll95Mil9ZnVuY3Rpb24gaTcodCxlKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1lKS82fWk3LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzpuNyh0aGlzLHRoaXMuX3gxLHRoaXMuX3kxKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsZSk7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5feDE9dCx0aGlzLl95MT1lO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO2RlZmF1bHQ6bjcodGhpcyx0LGUpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9ZX19O3ZhciByNz0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBuZXcgaTcodCxlKX1yZXR1cm4gbi50ZW5zaW9uPWZ1bmN0aW9uKGUpe3JldHVybiB0KCtlKX0sbn0pKDApO2Z1bmN0aW9uIG83KHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtZSkvNn1vNy5wcm90b3R5cGU9e2FyZWFTdGFydDokOCxhcmVhRW5kOiQ4LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1lO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9ZSk7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1lO2JyZWFrO2RlZmF1bHQ6bjcodGhpcyx0LGUpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9ZX19O3ZhciBhNz0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBuZXcgbzcodCxlKX1yZXR1cm4gbi50ZW5zaW9uPWZ1bmN0aW9uKGUpe3JldHVybiB0KCtlKX0sbn0pKDApO2Z1bmN0aW9uIHM3KHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtZSkvNn1zNy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtzd2l0Y2godD0rdCxlPStlLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpuNyh0aGlzLHQsZSl9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1lfX07dmFyIGw3PShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIG5ldyBzNyh0LGUpfXJldHVybiBuLnRlbnNpb249ZnVuY3Rpb24oZSl7cmV0dXJuIHQoK2UpfSxufSkoMCk7ZnVuY3Rpb24gYzcodCxlLG4pe3ZhciBpPXQuX3gxLHI9dC5feTEsbz10Ll94MixhPXQuX3kyO2lmKHQuX2wwMV9hPks5KXt2YXIgcz0yKnQuX2wwMV8yYSszKnQuX2wwMV9hKnQuX2wxMl9hK3QuX2wxMl8yYSxsPTMqdC5fbDAxX2EqKHQuX2wwMV9hK3QuX2wxMl9hKTtpPShpKnMtdC5feDAqdC5fbDEyXzJhK3QuX3gyKnQuX2wwMV8yYSkvbCxyPShyKnMtdC5feTAqdC5fbDEyXzJhK3QuX3kyKnQuX2wwMV8yYSkvbH1pZih0Ll9sMjNfYT5LOSl7dmFyIGM9Mip0Ll9sMjNfMmErMyp0Ll9sMjNfYSp0Ll9sMTJfYSt0Ll9sMTJfMmEsdT0zKnQuX2wyM19hKih0Ll9sMjNfYSt0Ll9sMTJfYSk7bz0obypjK3QuX3gxKnQuX2wyM18yYS1lKnQuX2wxMl8yYSkvdSxhPShhKmMrdC5feTEqdC5fbDIzXzJhLW4qdC5fbDEyXzJhKS91fXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhpLHIsbyxhLHQuX3gyLHQuX3kyKX1mdW5jdGlvbiB1Nyh0LGUpe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1lfXU3LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gyLHRoaXMuX3kyKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7aWYodD0rdCxlPStlLHRoaXMuX3BvaW50KXt2YXIgbj10aGlzLl94Mi10LGk9dGhpcy5feTItZTt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KG4qbitpKmksdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxlKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO2RlZmF1bHQ6YzcodGhpcyx0LGUpfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPWV9fTt2YXIgaDc9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gZT9uZXcgdTcodCxlKTpuZXcgaTcodCwwKX1yZXR1cm4gbi5hbHBoYT1mdW5jdGlvbihlKXtyZXR1cm4gdCgrZSl9LG59KSguNSk7ZnVuY3Rpb24gZDcodCxlKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9ZX1kNy5wcm90b3R5cGU9e2FyZWFTdGFydDokOCxhcmVhRW5kOiQ4LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsZSl7aWYodD0rdCxlPStlLHRoaXMuX3BvaW50KXt2YXIgbj10aGlzLl94Mi10LGk9dGhpcy5feTItZTt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KG4qbitpKmksdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gzPXQsdGhpcy5feTM9ZTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94ND10LHRoaXMuX3k0PWUpO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX3g1PXQsdGhpcy5feTU9ZTticmVhaztkZWZhdWx0OmM3KHRoaXMsdCxlKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1lfX07dmFyIHA3PShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIGU/bmV3IGQ3KHQsZSk6bmV3IG83KHQsMCl9cmV0dXJuIG4uYWxwaGE9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoK2UpfSxufSkoLjUpO2Z1bmN0aW9uIGY3KHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPWV9ZjcucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7aWYodD0rdCxlPStlLHRoaXMuX3BvaW50KXt2YXIgbj10aGlzLl94Mi10LGk9dGhpcy5feTItZTt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KG4qbitpKmksdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0OmM3KHRoaXMsdCxlKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1lfX07dmFyIG03PShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIGU/bmV3IGY3KHQsZSk6bmV3IHM3KHQsMCl9cmV0dXJuIG4uYWxwaGE9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoK2UpfSxufSkoLjUpO2Z1bmN0aW9uIGc3KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBfNyh0KXtyZXR1cm4gdDwwPy0xOjF9ZnVuY3Rpb24geTcodCxlLG4pe3ZhciBpPXQuX3gxLXQuX3gwLHI9ZS10Ll94MSxvPSh0Ll95MS10Ll95MCkvKGl8fHI8MCYmLTApLGE9KG4tdC5feTEpLyhyfHxpPDAmJi0wKSxzPShvKnIrYSppKS8oaStyKTtyZXR1cm4oXzcobykrXzcoYSkpKk1hdGgubWluKE1hdGguYWJzKG8pLE1hdGguYWJzKGEpLC41Kk1hdGguYWJzKHMpKXx8MH1mdW5jdGlvbiB2Nyh0LGUpe3ZhciBuPXQuX3gxLXQuX3gwO3JldHVybiBuPygzKih0Ll95MS10Ll95MCkvbi1lKS8yOmV9ZnVuY3Rpb24gYjcodCxlLG4pe3ZhciBpPXQuX3gwLHI9dC5feDEsbz10Ll95MSxhPShyLWkpLzM7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKGkrYSx0Ll95MCthKmUsci1hLG8tYSpuLHIsbyl9ZnVuY3Rpb24geDcodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIHc3KHQpe3RoaXMuX2NvbnRleHQ9bmV3IFM3KHQpfWZ1bmN0aW9uIFM3KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBNNyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gRTcodCl7dmFyIGUsbixpPXQubGVuZ3RoLTEscj1uZXcgQXJyYXkoaSksbz1uZXcgQXJyYXkoaSksYT1uZXcgQXJyYXkoaSk7Zm9yKHJbMF09MCxvWzBdPTIsYVswXT10WzBdKzIqdFsxXSxlPTE7ZTxpLTE7KytlKXJbZV09MSxvW2VdPTQsYVtlXT00KnRbZV0rMip0W2UrMV07Zm9yKHJbaS0xXT0yLG9baS0xXT03LGFbaS0xXT04KnRbaS0xXSt0W2ldLGU9MTtlPGk7KytlKW9bZV0tPW49cltlXS9vW2UtMV0sYVtlXS09biphW2UtMV07Zm9yKHJbaS0xXT1hW2ktMV0vb1tpLTFdLGU9aS0yO2U+PTA7LS1lKXJbZV09KGFbZV0tcltlKzFdKS9vW2VdO2ZvcihvW2ktMV09KHRbaV0rcltpLTFdKS8yLGU9MDtlPGktMTsrK2Upb1tlXT0yKnRbZSsxXS1yW2UrMV07cmV0dXJuW3Isb119ZnVuY3Rpb24gVDcodCxlKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fdD1lfWZ1bmN0aW9uIEM3KHQsZSl7aWYoKHI9dC5sZW5ndGgpPjEpZm9yKHZhciBuLGkscixvPTEsYT10W2VbMF1dLHM9YS5sZW5ndGg7bzxyOysrbylmb3IoaT1hLGE9dFtlW29dXSxuPTA7bjxzOysrbilhW25dWzFdKz1hW25dWzBdPWlzTmFOKGlbbl1bMV0pP2lbbl1bMF06aVtuXVsxXX1mdW5jdGlvbiBBNyh0KXtmb3IodmFyIGU9dC5sZW5ndGgsbj1uZXcgQXJyYXkoZSk7LS1lPj0wOyluW2VdPWU7cmV0dXJuIG59ZnVuY3Rpb24gazcodCxlKXtyZXR1cm4gdFtlXX1mdW5jdGlvbiBMNyh0KXt2YXIgZT10Lm1hcChQNyk7cmV0dXJuIEE3KHQpLnNvcnQoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGVbdF0tZVtuXX0pKX1mdW5jdGlvbiBQNyh0KXtmb3IodmFyIGUsbj0wLGk9LTEscj10Lmxlbmd0aDsrK2k8cjspKGU9K3RbaV1bMV0pJiYobis9ZSk7cmV0dXJuIG59ZzcucHJvdG90eXBlPXthcmVhU3RhcnQ6JDgsYXJlYUVuZDokOCxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCl9LHBvaW50OmZ1bmN0aW9uKHQsZSl7dD0rdCxlPStlLHRoaXMuX3BvaW50P3RoaXMuX2NvbnRleHQubGluZVRvKHQsZSk6KHRoaXMuX3BvaW50PTEsdGhpcy5fY29udGV4dC5tb3ZlVG8odCxlKSl9fSx4Ny5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT10aGlzLl90MD1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLHRoaXMuX3kxKTticmVhaztjYXNlIDM6YjcodGhpcyx0aGlzLl90MCx2Nyh0aGlzLHRoaXMuX3QwKSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LGUpe3ZhciBuPU5hTjtpZihlPStlLCh0PSt0KSE9PXRoaXMuX3gxfHxlIT09dGhpcy5feTEpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsZSk7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsYjcodGhpcyx2Nyh0aGlzLG49eTcodGhpcyx0LGUpKSxuKTticmVhaztkZWZhdWx0OmI3KHRoaXMsdGhpcy5fdDAsbj15Nyh0aGlzLHQsZSkpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9ZSx0aGlzLl90MD1ufX19LCh3Ny5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4Ny5wcm90b3R5cGUpKS5wb2ludD1mdW5jdGlvbih0LGUpe3g3LnByb3RvdHlwZS5wb2ludC5jYWxsKHRoaXMsZSx0KX0sUzcucHJvdG90eXBlPXttb3ZlVG86ZnVuY3Rpb24odCxlKXt0aGlzLl9jb250ZXh0Lm1vdmVUbyhlLHQpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxsaW5lVG86ZnVuY3Rpb24odCxlKXt0aGlzLl9jb250ZXh0LmxpbmVUbyhlLHQpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsZSxuLGkscixvKXt0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8oZSx0LGksbixvLHIpfX0sTTcucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxlPXRoaXMuX3ksbj10Lmxlbmd0aDtpZihuKWlmKHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odFswXSxlWzBdKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0WzBdLGVbMF0pLDI9PT1uKXRoaXMuX2NvbnRleHQubGluZVRvKHRbMV0sZVsxXSk7ZWxzZSBmb3IodmFyIGk9RTcodCkscj1FNyhlKSxvPTAsYT0xO2E8bjsrK28sKythKXRoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhpWzBdW29dLHJbMF1bb10saVsxXVtvXSxyWzFdW29dLHRbYV0sZVthXSk7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09bikmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmUsdGhpcy5feD10aGlzLl95PW51bGx9LHBvaW50OmZ1bmN0aW9uKHQsZSl7dGhpcy5feC5wdXNoKCt0KSx0aGlzLl95LnB1c2goK2UpfX0sVDcucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD10aGlzLl95PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MDx0aGlzLl90JiZ0aGlzLl90PDEmJjI9PT10aGlzLl9wb2ludCYmdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCx0aGlzLl95KSwodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT49MCYmKHRoaXMuX3Q9MS10aGlzLl90LHRoaXMuX2xpbmU9MS10aGlzLl9saW5lKX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtzd2l0Y2godD0rdCxlPStlLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsZSk6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxlKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OmlmKHRoaXMuX3Q8PTApdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCxlKSx0aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpO2Vsc2V7dmFyIG49dGhpcy5feCooMS10aGlzLl90KSt0KnRoaXMuX3Q7dGhpcy5fY29udGV4dC5saW5lVG8obix0aGlzLl95KSx0aGlzLl9jb250ZXh0LmxpbmVUbyhuLGUpfX10aGlzLl94PXQsdGhpcy5feT1lfX07dmFyIE43PW5ldyBEYXRlLEk3PW5ldyBEYXRlO2Z1bmN0aW9uIFI3KHQsZSxuLGkpe2Z1bmN0aW9uIHIoZSl7cmV0dXJuIHQoZT1uZXcgRGF0ZSgrZSkpLGV9cmV0dXJuIHIuZmxvb3I9cixyLmNlaWw9ZnVuY3Rpb24obil7cmV0dXJuIHQobj1uZXcgRGF0ZShuLTEpKSxlKG4sMSksdChuKSxufSxyLnJvdW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXIodCksbj1yLmNlaWwodCk7cmV0dXJuIHQtZTxuLXQ/ZTpufSxyLm9mZnNldD1mdW5jdGlvbih0LG4pe3JldHVybiBlKHQ9bmV3IERhdGUoK3QpLG51bGw9PW4/MTpNYXRoLmZsb29yKG4pKSx0fSxyLnJhbmdlPWZ1bmN0aW9uKG4saSxvKXt2YXIgYSxzPVtdO2lmKG49ci5jZWlsKG4pLG89bnVsbD09bz8xOk1hdGguZmxvb3IobyksIShuPGkmJm8+MCkpcmV0dXJuIHM7ZG97cy5wdXNoKGE9bmV3IERhdGUoK24pKSxlKG4sbyksdChuKX13aGlsZShhPG4mJm48aSk7cmV0dXJuIHN9LHIuZmlsdGVyPWZ1bmN0aW9uKG4pe3JldHVybiBSNygoZnVuY3Rpb24oZSl7aWYoZT49ZSlmb3IoO3QoZSksIW4oZSk7KWUuc2V0VGltZShlLTEpfSksKGZ1bmN0aW9uKHQsaSl7aWYodD49dClpZihpPDApZm9yKDsrK2k8PTA7KWZvcig7ZSh0LC0xKSwhbih0KTspO2Vsc2UgZm9yKDstLWk+PTA7KWZvcig7ZSh0LDEpLCFuKHQpOyk7fSkpfSxuJiYoci5jb3VudD1mdW5jdGlvbihlLGkpe3JldHVybiBONy5zZXRUaW1lKCtlKSxJNy5zZXRUaW1lKCtpKSx0KE43KSx0KEk3KSxNYXRoLmZsb29yKG4oTjcsSTcpKX0sci5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP3IuZmlsdGVyKGk/ZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSkldD09MH06ZnVuY3Rpb24oZSl7cmV0dXJuIHIuY291bnQoMCxlKSV0PT0wfSk6cjpudWxsfSkscn12YXIgTzc9UjcoKGZ1bmN0aW9uKCl7fSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUtdH0pKTtPNy5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP1I3KChmdW5jdGlvbihlKXtlLnNldFRpbWUoTWF0aC5mbG9vcihlL3QpKnQpfSksKGZ1bmN0aW9uKGUsbil7ZS5zZXRUaW1lKCtlK24qdCl9KSwoZnVuY3Rpb24oZSxuKXtyZXR1cm4obi1lKS90fSkpOk83Om51bGx9O3ZhciB6Nz1PNy5yYW5nZSxENz0xZTMsQjc9NmU0LEg3PTM2ZTUsRjc9ODY0ZTUsVjc9NjA0OGU1LFU3PVI3KChmdW5jdGlvbih0KXt0LnNldFRpbWUoTWF0aC5mbG9vcih0L0Q3KSpENyl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFRpbWUoK3QrZSpENyl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS9EN30pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENTZWNvbmRzKCl9KSksajc9VTcucmFuZ2UsRzc9UjcoKGZ1bmN0aW9uKHQpe3Quc2V0VGltZShNYXRoLmZsb29yKHQvQjcpKkI3KX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKkI3KX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL0I3fSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE1pbnV0ZXMoKX0pKSxXNz1HNy5yYW5nZSxxNz1SNygoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRUaW1lem9uZU9mZnNldCgpKkI3JUg3O2U8MCYmKGUrPUg3KSx0LnNldFRpbWUoTWF0aC5mbG9vcigoK3QtZSkvSDcpKkg3K2UpfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UqSDcpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvSDd9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0SG91cnMoKX0pKSxZNz1xNy5yYW5nZSxYNz1SNygoZnVuY3Rpb24odCl7dC5zZXRIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0RGF0ZSh0LmdldERhdGUoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQtKGUuZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKkI3KS9GN30pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXREYXRlKCktMX0pKSwkNz1YNy5yYW5nZTtmdW5jdGlvbiBLNyh0KXtyZXR1cm4gUjcoKGZ1bmN0aW9uKGUpe2Uuc2V0RGF0ZShlLmdldERhdGUoKS0oZS5nZXREYXkoKSs3LXQpJTcpLGUuc2V0SG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldERhdGUodC5nZXREYXRlKCkrNyplKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQtKGUuZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKkI3KS9WN30pKX12YXIgWjc9SzcoMCksSjc9SzcoMSksUTc9SzcoMiksdHR0PUs3KDMpLGV0dD1LNyg0KSxudHQ9SzcoNSksaXR0PUs3KDYpLHJ0dD1aNy5yYW5nZSxvdHQ9SjcucmFuZ2UsYXR0PVE3LnJhbmdlLHN0dD10dHQucmFuZ2UsbHR0PWV0dC5yYW5nZSxjdHQ9bnR0LnJhbmdlLHV0dD1pdHQucmFuZ2UsaHR0PVI3KChmdW5jdGlvbih0KXt0LnNldERhdGUoMSksdC5zZXRIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0TW9udGgodC5nZXRNb250aCgpK2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZ2V0TW9udGgoKS10LmdldE1vbnRoKCkrMTIqKGUuZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCkpfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE1vbnRoKCl9KSksZHR0PWh0dC5yYW5nZSxwdHQ9UjcoKGZ1bmN0aW9uKHQpe3Quc2V0TW9udGgoMCwxKSx0LnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRGdWxsWWVhcih0LmdldEZ1bGxZZWFyKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5nZXRGdWxsWWVhcigpLXQuZ2V0RnVsbFllYXIoKX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRGdWxsWWVhcigpfSkpO3B0dC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP1I3KChmdW5jdGlvbihlKXtlLnNldEZ1bGxZZWFyKE1hdGguZmxvb3IoZS5nZXRGdWxsWWVhcigpL3QpKnQpLGUuc2V0TW9udGgoMCwxKSxlLnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKGUsbil7ZS5zZXRGdWxsWWVhcihlLmdldEZ1bGxZZWFyKCkrbip0KX0pKTpudWxsfTt2YXIgZnR0PXB0dC5yYW5nZSxtdHQ9UjcoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDU2Vjb25kcygwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UqQjcpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvQjd9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTWludXRlcygpfSkpLGd0dD1tdHQucmFuZ2UsX3R0PVI3KChmdW5jdGlvbih0KXt0LnNldFVUQ01pbnV0ZXMoMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UqSDcpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvSDd9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDSG91cnMoKX0pKSx5dHQ9X3R0LnJhbmdlLHZ0dD1SNygoZnVuY3Rpb24odCl7dC5zZXRVVENIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VVRDRGF0ZSh0LmdldFVUQ0RhdGUoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL0Y3fSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0RhdGUoKS0xfSkpLGJ0dD12dHQucmFuZ2U7ZnVuY3Rpb24geHR0KHQpe3JldHVybiBSNygoZnVuY3Rpb24oZSl7ZS5zZXRVVENEYXRlKGUuZ2V0VVRDRGF0ZSgpLShlLmdldFVUQ0RheSgpKzctdCklNyksZS5zZXRVVENIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VVRDRGF0ZSh0LmdldFVUQ0RhdGUoKSs3KmUpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvVjd9KSl9dmFyIHd0dD14dHQoMCksU3R0PXh0dCgxKSxNdHQ9eHR0KDIpLEV0dD14dHQoMyksVHR0PXh0dCg0KSxDdHQ9eHR0KDUpLEF0dD14dHQoNiksa3R0PXd0dC5yYW5nZSxMdHQ9U3R0LnJhbmdlLFB0dD1NdHQucmFuZ2UsTnR0PUV0dC5yYW5nZSxJdHQ9VHR0LnJhbmdlLFJ0dD1DdHQucmFuZ2UsT3R0PUF0dC5yYW5nZSx6dHQ9UjcoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDRGF0ZSgxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRVVENNb250aCh0LmdldFVUQ01vbnRoKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5nZXRVVENNb250aCgpLXQuZ2V0VVRDTW9udGgoKSsxMiooZS5nZXRVVENGdWxsWWVhcigpLXQuZ2V0VVRDRnVsbFllYXIoKSl9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTW9udGgoKX0pKSxEdHQ9enR0LnJhbmdlLEJ0dD1SNygoZnVuY3Rpb24odCl7dC5zZXRVVENNb250aCgwLDEpLHQuc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFVUQ0Z1bGxZZWFyKHQuZ2V0VVRDRnVsbFllYXIoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybiBlLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0Z1bGxZZWFyKCl9KSk7QnR0LmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PU1hdGguZmxvb3IodCkpJiZ0PjA/UjcoKGZ1bmN0aW9uKGUpe2Uuc2V0VVRDRnVsbFllYXIoTWF0aC5mbG9vcihlLmdldFVUQ0Z1bGxZZWFyKCkvdCkqdCksZS5zZXRVVENNb250aCgwLDEpLGUuc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24oZSxuKXtlLnNldFVUQ0Z1bGxZZWFyKGUuZ2V0VVRDRnVsbFllYXIoKStuKnQpfSkpOm51bGx9O3ZhciBIdHQ9QnR0LnJhbmdlLEZ0dD1uZXcgRGF0ZSxWdHQ9bmV3IERhdGU7ZnVuY3Rpb24gVXR0KHQsZSxuLGkpe2Z1bmN0aW9uIHIoZSl7cmV0dXJuIHQoZT0wPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgRGF0ZTpuZXcgRGF0ZSgrZSkpLGV9cmV0dXJuIHIuZmxvb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZT1uZXcgRGF0ZSgrZSkpLGV9LHIuY2VpbD1mdW5jdGlvbihuKXtyZXR1cm4gdChuPW5ldyBEYXRlKG4tMSkpLGUobiwxKSx0KG4pLG59LHIucm91bmQ9ZnVuY3Rpb24odCl7dmFyIGU9cih0KSxuPXIuY2VpbCh0KTtyZXR1cm4gdC1lPG4tdD9lOm59LHIub2Zmc2V0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIGUodD1uZXcgRGF0ZSgrdCksbnVsbD09bj8xOk1hdGguZmxvb3IobikpLHR9LHIucmFuZ2U9ZnVuY3Rpb24obixpLG8pe3ZhciBhLHM9W107aWYobj1yLmNlaWwobiksbz1udWxsPT1vPzE6TWF0aC5mbG9vcihvKSwhKG48aSYmbz4wKSlyZXR1cm4gcztkb3tzLnB1c2goYT1uZXcgRGF0ZSgrbikpLGUobixvKSx0KG4pfXdoaWxlKGE8biYmbjxpKTtyZXR1cm4gc30sci5maWx0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIFV0dCgoZnVuY3Rpb24oZSl7aWYoZT49ZSlmb3IoO3QoZSksIW4oZSk7KWUuc2V0VGltZShlLTEpfSksKGZ1bmN0aW9uKHQsaSl7aWYodD49dClpZihpPDApZm9yKDsrK2k8PTA7KWZvcig7ZSh0LC0xKSwhbih0KTspO2Vsc2UgZm9yKDstLWk+PTA7KWZvcig7ZSh0LDEpLCFuKHQpOyk7fSkpfSxuJiYoci5jb3VudD1mdW5jdGlvbihlLGkpe3JldHVybiBGdHQuc2V0VGltZSgrZSksVnR0LnNldFRpbWUoK2kpLHQoRnR0KSx0KFZ0dCksTWF0aC5mbG9vcihuKEZ0dCxWdHQpKX0sci5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP3IuZmlsdGVyKGk/ZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSkldD09MH06ZnVuY3Rpb24oZSl7cmV0dXJuIHIuY291bnQoMCxlKSV0PT0wfSk6cjpudWxsfSkscn12YXIganR0PTg2NGU1LEd0dD02MDQ4ZTUsV3R0PVV0dCgoZnVuY3Rpb24odCl7dC5zZXRIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0RGF0ZSh0LmdldERhdGUoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQtNmU0KihlLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSkvanR0fSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldERhdGUoKS0xfSkpO2Z1bmN0aW9uIHF0dCh0KXtyZXR1cm4gVXR0KChmdW5jdGlvbihlKXtlLnNldERhdGUoZS5nZXREYXRlKCktKGUuZ2V0RGF5KCkrNy10KSU3KSxlLnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpKzcqZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10LTZlNCooZS5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkpL0d0dH0pKX12YXIgWXR0PXF0dCgwKSxYdHQ9cXR0KDEpO3F0dCgyKSxxdHQoMyk7dmFyICR0dD1xdHQoNCk7cXR0KDUpLHF0dCg2KTt2YXIgS3R0PVV0dCgoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldEZ1bGxZZWFyKHQuZ2V0RnVsbFllYXIoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybiBlLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KSk7S3R0LmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PU1hdGguZmxvb3IodCkpJiZ0PjA/VXR0KChmdW5jdGlvbihlKXtlLnNldEZ1bGxZZWFyKE1hdGguZmxvb3IoZS5nZXRGdWxsWWVhcigpL3QpKnQpLGUuc2V0TW9udGgoMCwxKSxlLnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKGUsbil7ZS5zZXRGdWxsWWVhcihlLmdldEZ1bGxZZWFyKCkrbip0KX0pKTpudWxsfTt2YXIgWnR0PUt0dCxKdHQ9VXR0KChmdW5jdGlvbih0KXt0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpK2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvanR0fSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0RhdGUoKS0xfSkpO2Z1bmN0aW9uIFF0dCh0KXtyZXR1cm4gVXR0KChmdW5jdGlvbihlKXtlLnNldFVUQ0RhdGUoZS5nZXRVVENEYXRlKCktKGUuZ2V0VVRDRGF5KCkrNy10KSU3KSxlLnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpKzcqZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS9HdHR9KSl9dmFyIHRldD1RdHQoMCksZWV0PVF0dCgxKTtRdHQoMiksUXR0KDMpO3ZhciBuZXQ9UXR0KDQpO1F0dCg1KSxRdHQoNik7dmFyIGlldD1VdHQoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTW9udGgoMCwxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRVVENGdWxsWWVhcih0LmdldFVUQ0Z1bGxZZWFyKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5nZXRVVENGdWxsWWVhcigpLXQuZ2V0VVRDRnVsbFllYXIoKX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENGdWxsWWVhcigpfSkpO2lldC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP1V0dCgoZnVuY3Rpb24oZSl7ZS5zZXRVVENGdWxsWWVhcihNYXRoLmZsb29yKGUuZ2V0VVRDRnVsbFllYXIoKS90KSp0KSxlLnNldFVUQ01vbnRoKDAsMSksZS5zZXRVVENIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbihlLG4pe2Uuc2V0VVRDRnVsbFllYXIoZS5nZXRVVENGdWxsWWVhcigpK24qdCl9KSk6bnVsbH07dmFyIHJldD1pZXQ7ZnVuY3Rpb24gb2V0KHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIGU9bmV3IERhdGUoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpO3JldHVybiBlLnNldEZ1bGxZZWFyKHQueSksZX1yZXR1cm4gbmV3IERhdGUodC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKX1mdW5jdGlvbiBhZXQodCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgZT1uZXcgRGF0ZShEYXRlLlVUQygtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpO3JldHVybiBlLnNldFVUQ0Z1bGxZZWFyKHQueSksZX1yZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEModC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKSl9ZnVuY3Rpb24gc2V0KHQpe3JldHVybnt5OnQsbTowLGQ6MSxIOjAsTTowLFM6MCxMOjB9fWZ1bmN0aW9uIGNldCh0KXt2YXIgZT10LmRhdGVUaW1lLG49dC5kYXRlLGk9dC50aW1lLHI9dC5wZXJpb2RzLG89dC5kYXlzLGE9dC5zaG9ydERheXMscz10Lm1vbnRocyxsPXQuc2hvcnRNb250aHMsYz14ZXQociksdT13ZXQociksaD14ZXQobyksZD13ZXQobykscD14ZXQoYSksZj13ZXQoYSksbT14ZXQocyksZz13ZXQocyksXz14ZXQobCkseT13ZXQobCksdj17YTpmdW5jdGlvbiBiKHQpe3JldHVybiBhW3QuZ2V0RGF5KCldfSxBOmZ1bmN0aW9uIHgodCl7cmV0dXJuIG9bdC5nZXREYXkoKV19LGI6ZnVuY3Rpb24gdyh0KXtyZXR1cm4gbFt0LmdldE1vbnRoKCldfSxCOmZ1bmN0aW9uIFModCl7cmV0dXJuIHNbdC5nZXRNb250aCgpXX0sYzpudWxsLGQ6amV0LGU6amV0LGY6WGV0LEg6R2V0LEk6V2V0LGo6cWV0LEw6WWV0LG06JGV0LE06S2V0LHA6ZnVuY3Rpb24gTSh0KXtyZXR1cm4gclsrKHQuZ2V0SG91cnMoKT49MTIpXX0sUTpNbnQsczpFbnQsUzpaZXQsdTpKZXQsVTpRZXQsVjp0bnQsdzplbnQsVzpubnQseDpudWxsLFg6bnVsbCx5OmludCxZOnJudCxaOm9udCwiJSI6U250fSxFPXthOmZ1bmN0aW9uIFQodCl7cmV0dXJuIGFbdC5nZXRVVENEYXkoKV19LEE6ZnVuY3Rpb24gQyh0KXtyZXR1cm4gb1t0LmdldFVUQ0RheSgpXX0sYjpmdW5jdGlvbiBBKHQpe3JldHVybiBsW3QuZ2V0VVRDTW9udGgoKV19LEI6ZnVuY3Rpb24gayh0KXtyZXR1cm4gc1t0LmdldFVUQ01vbnRoKCldfSxjOm51bGwsZDphbnQsZTphbnQsZjpobnQsSDpzbnQsSTpsbnQsajpjbnQsTDp1bnQsbTpkbnQsTTpwbnQscDpmdW5jdGlvbiBMKHQpe3JldHVybiByWysodC5nZXRVVENIb3VycygpPj0xMildfSxROk1udCxzOkVudCxTOmZudCx1Om1udCxVOmdudCxWOl9udCx3OnludCxXOnZudCx4Om51bGwsWDpudWxsLHk6Ym50LFk6eG50LFo6d250LCIlIjpTbnR9LFA9e2E6ZnVuY3Rpb24gTih0LGUsbil7dmFyIGk9cC5leGVjKGUuc2xpY2UobikpO3JldHVybiBpPyh0Lnc9ZltpWzBdLnRvTG93ZXJDYXNlKCldLG4raVswXS5sZW5ndGgpOi0xfSxBOmZ1bmN0aW9uIEkodCxlLG4pe3ZhciBpPWguZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC53PWRbaVswXS50b0xvd2VyQ2FzZSgpXSxuK2lbMF0ubGVuZ3RoKTotMX0sYjpmdW5jdGlvbiBSKHQsZSxuKXt2YXIgaT1fLmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIGk/KHQubT15W2lbMF0udG9Mb3dlckNhc2UoKV0sbitpWzBdLmxlbmd0aCk6LTF9LEI6ZnVuY3Rpb24gTyh0LGUsbil7dmFyIGk9bS5leGVjKGUuc2xpY2UobikpO3JldHVybiBpPyh0Lm09Z1tpWzBdLnRvTG93ZXJDYXNlKCldLG4raVswXS5sZW5ndGgpOi0xfSxjOmZ1bmN0aW9uIHoodCxuLGkpe3JldHVybiBVKHQsZSxuLGkpfSxkOklldCxlOklldCxmOkhldCxIOk9ldCxJOk9ldCxqOlJldCxMOkJldCxtOk5ldCxNOnpldCxwOmZ1bmN0aW9uIEQodCxlLG4pe3ZhciBpPWMuZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC5wPXVbaVswXS50b0xvd2VyQ2FzZSgpXSxuK2lbMF0ubGVuZ3RoKTotMX0sUTpWZXQsczpVZXQsUzpEZXQsdTpFZXQsVTpUZXQsVjpDZXQsdzpNZXQsVzpBZXQseDpmdW5jdGlvbiBCKHQsZSxpKXtyZXR1cm4gVSh0LG4sZSxpKX0sWDpmdW5jdGlvbiBIKHQsZSxuKXtyZXR1cm4gVSh0LGksZSxuKX0seTpMZXQsWTprZXQsWjpQZXQsIiUiOkZldH07ZnVuY3Rpb24gRih0LGUpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgaSxyLG8sYT1bXSxzPS0xLGw9MCxjPXQubGVuZ3RoO2ZvcihuIGluc3RhbmNlb2YgRGF0ZXx8KG49bmV3IERhdGUoK24pKTsrK3M8YzspMzc9PT10LmNoYXJDb2RlQXQocykmJihhLnB1c2godC5zbGljZShsLHMpKSxudWxsIT0ocj1tZXRbaT10LmNoYXJBdCgrK3MpXSk/aT10LmNoYXJBdCgrK3MpOnI9ImUiPT09aT8iICI6IjAiLChvPWVbaV0pJiYoaT1vKG4scikpLGEucHVzaChpKSxsPXMrMSk7cmV0dXJuIGEucHVzaCh0LnNsaWNlKGwscykpLGEuam9pbigiIil9fWZ1bmN0aW9uIFYodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGkscixvPXNldCgxOTAwKTtpZihVKG8sdCxuKz0iIiwwKSE9bi5sZW5ndGgpcmV0dXJuIG51bGw7aWYoIlEiaW4gbylyZXR1cm4gbmV3IERhdGUoby5RKTtpZigicCJpbiBvJiYoby5IPW8uSCUxMisxMipvLnApLCJWImluIG8pe2lmKG8uVjwxfHxvLlY+NTMpcmV0dXJuIG51bGw7InciaW4gb3x8KG8udz0xKSwiWiJpbiBvPyhyPShpPWFldChzZXQoby55KSkpLmdldFVUQ0RheSgpLGk9cj40fHwwPT09cj9lZXQuY2VpbChpKTplZXQoaSksaT1KdHQub2Zmc2V0KGksNyooby5WLTEpKSxvLnk9aS5nZXRVVENGdWxsWWVhcigpLG8ubT1pLmdldFVUQ01vbnRoKCksby5kPWkuZ2V0VVRDRGF0ZSgpKyhvLncrNiklNyk6KHI9KGk9ZShzZXQoby55KSkpLmdldERheSgpLGk9cj40fHwwPT09cj9YdHQuY2VpbChpKTpYdHQoaSksaT1XdHQub2Zmc2V0KGksNyooby5WLTEpKSxvLnk9aS5nZXRGdWxsWWVhcigpLG8ubT1pLmdldE1vbnRoKCksby5kPWkuZ2V0RGF0ZSgpKyhvLncrNiklNyl9ZWxzZSgiVyJpbiBvfHwiVSJpbiBvKSYmKCJ3ImluIG98fChvLnc9InUiaW4gbz9vLnUlNzoiVyJpbiBvPzE6MCkscj0iWiJpbiBvP2FldChzZXQoby55KSkuZ2V0VVRDRGF5KCk6ZShzZXQoby55KSkuZ2V0RGF5KCksby5tPTAsby5kPSJXImluIG8/KG8udys2KSU3Kzcqby5XLShyKzUpJTc6by53Kzcqby5VLShyKzYpJTcpO3JldHVybiJaImluIG8/KG8uSCs9by5aLzEwMHwwLG8uTSs9by5aJTEwMCxhZXQobykpOmUobyl9fWZ1bmN0aW9uIFUodCxlLG4saSl7Zm9yKHZhciByLG8sYT0wLHM9ZS5sZW5ndGgsbD1uLmxlbmd0aDthPHM7KXtpZihpPj1sKXJldHVybi0xO2lmKDM3PT09KHI9ZS5jaGFyQ29kZUF0KGErKykpKXtpZihyPWUuY2hhckF0KGErKyksIShvPVBbciBpbiBtZXQ/ZS5jaGFyQXQoYSsrKTpyXSl8fChpPW8odCxuLGkpKTwwKXJldHVybi0xfWVsc2UgaWYociE9bi5jaGFyQ29kZUF0KGkrKykpcmV0dXJuLTF9cmV0dXJuIGl9cmV0dXJuIHYueD1GKG4sdiksdi5YPUYoaSx2KSx2LmM9RihlLHYpLEUueD1GKG4sRSksRS5YPUYoaSxFKSxFLmM9RihlLEUpLHtmb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIGU9Rih0Kz0iIix2KTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfSxwYXJzZTpmdW5jdGlvbih0KXt2YXIgZT1WKHQrPSIiLG9ldCk7cmV0dXJuIGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sZX0sdXRjRm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBlPUYodCs9IiIsRSk7cmV0dXJuIGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sZX0sdXRjUGFyc2U6ZnVuY3Rpb24odCl7dmFyIGU9Vih0LGFldCk7cmV0dXJuIGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sZX19fXZhciB1ZXQsaGV0LGRldCxwZXQsZmV0LG1ldD17Ii0iOiIiLF86IiAiLDA6IjAifSxnZXQ9L15ccypcZCsvLF9ldD0vXiUvLHlldD0vW1xcXiQqKz98W1xdKCkue31dL2c7ZnVuY3Rpb24gdmV0KHQsZSxuKXt2YXIgaT10PDA/Ii0iOiIiLHI9KGk/LXQ6dCkrIiIsbz1yLmxlbmd0aDtyZXR1cm4gaSsobzxuP25ldyBBcnJheShuLW8rMSkuam9pbihlKStyOnIpfWZ1bmN0aW9uIGJldCh0KXtyZXR1cm4gdC5yZXBsYWNlKHlldCwiXFwkJiIpfWZ1bmN0aW9uIHhldCh0KXtyZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIrdC5tYXAoYmV0KS5qb2luKCJ8IikrIikiLCJpIil9ZnVuY3Rpb24gd2V0KHQpe2Zvcih2YXIgZT17fSxuPS0xLGk9dC5sZW5ndGg7KytuPGk7KWVbdFtuXS50b0xvd2VyQ2FzZSgpXT1uO3JldHVybiBlfWZ1bmN0aW9uIE1ldCh0LGUsbil7dmFyIGk9Z2V0LmV4ZWMoZS5zbGljZShuLG4rMSkpO3JldHVybiBpPyh0Lnc9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gRWV0KHQsZSxuKXt2YXIgaT1nZXQuZXhlYyhlLnNsaWNlKG4sbisxKSk7cmV0dXJuIGk/KHQudT0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBUZXQodCxlLG4pe3ZhciBpPWdldC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5VPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIENldCh0LGUsbil7dmFyIGk9Z2V0LmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0LlY9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gQWV0KHQsZSxuKXt2YXIgaT1nZXQuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQuVz0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBrZXQodCxlLG4pe3ZhciBpPWdldC5leGVjKGUuc2xpY2UobixuKzQpKTtyZXR1cm4gaT8odC55PStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIExldCh0LGUsbil7dmFyIGk9Z2V0LmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0Lnk9K2lbMF0rKCtpWzBdPjY4PzE5MDA6MmUzKSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBQZXQodCxlLG4pe3ZhciBpPS9eKFopfChbKy1dXGRcZCkoPzo6PyhcZFxkKSk/Ly5leGVjKGUuc2xpY2UobixuKzYpKTtyZXR1cm4gaT8odC5aPWlbMV0/MDotKGlbMl0rKGlbM118fCIwMCIpKSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBOZXQodCxlLG4pe3ZhciBpPWdldC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5tPWlbMF0tMSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBJZXQodCxlLG4pe3ZhciBpPWdldC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5kPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFJldCh0LGUsbil7dmFyIGk9Z2V0LmV4ZWMoZS5zbGljZShuLG4rMykpO3JldHVybiBpPyh0Lm09MCx0LmQ9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gT2V0KHQsZSxuKXt2YXIgaT1nZXQuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQuSD0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB6ZXQodCxlLG4pe3ZhciBpPWdldC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5NPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIERldCh0LGUsbil7dmFyIGk9Z2V0LmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0LlM9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gQmV0KHQsZSxuKXt2YXIgaT1nZXQuZXhlYyhlLnNsaWNlKG4sbiszKSk7cmV0dXJuIGk/KHQuTD0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBIZXQodCxlLG4pe3ZhciBpPWdldC5leGVjKGUuc2xpY2UobixuKzYpKTtyZXR1cm4gaT8odC5MPU1hdGguZmxvb3IoaVswXS8xZTMpLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEZldCh0LGUsbil7dmFyIGk9X2V0LmV4ZWMoZS5zbGljZShuLG4rMSkpO3JldHVybiBpP24raVswXS5sZW5ndGg6LTF9ZnVuY3Rpb24gVmV0KHQsZSxuKXt2YXIgaT1nZXQuZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC5RPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFVldCh0LGUsbil7dmFyIGk9Z2V0LmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIGk/KHQuUT0xZTMqK2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gamV0KHQsZSl7cmV0dXJuIHZldCh0LmdldERhdGUoKSxlLDIpfWZ1bmN0aW9uIEdldCh0LGUpe3JldHVybiB2ZXQodC5nZXRIb3VycygpLGUsMil9ZnVuY3Rpb24gV2V0KHQsZSl7cmV0dXJuIHZldCh0LmdldEhvdXJzKCklMTJ8fDEyLGUsMil9ZnVuY3Rpb24gcWV0KHQsZSl7cmV0dXJuIHZldCgxK1d0dC5jb3VudChadHQodCksdCksZSwzKX1mdW5jdGlvbiBZZXQodCxlKXtyZXR1cm4gdmV0KHQuZ2V0TWlsbGlzZWNvbmRzKCksZSwzKX1mdW5jdGlvbiBYZXQodCxlKXtyZXR1cm4gWWV0KHQsZSkrIjAwMCJ9ZnVuY3Rpb24gJGV0KHQsZSl7cmV0dXJuIHZldCh0LmdldE1vbnRoKCkrMSxlLDIpfWZ1bmN0aW9uIEtldCh0LGUpe3JldHVybiB2ZXQodC5nZXRNaW51dGVzKCksZSwyKX1mdW5jdGlvbiBaZXQodCxlKXtyZXR1cm4gdmV0KHQuZ2V0U2Vjb25kcygpLGUsMil9ZnVuY3Rpb24gSmV0KHQpe3ZhciBlPXQuZ2V0RGF5KCk7cmV0dXJuIDA9PT1lPzc6ZX1mdW5jdGlvbiBRZXQodCxlKXtyZXR1cm4gdmV0KFl0dC5jb3VudChadHQodCksdCksZSwyKX1mdW5jdGlvbiB0bnQodCxlKXt2YXIgbj10LmdldERheSgpO3JldHVybiB0PW4+PTR8fDA9PT1uPyR0dCh0KTokdHQuY2VpbCh0KSx2ZXQoJHR0LmNvdW50KFp0dCh0KSx0KSsoND09PVp0dCh0KS5nZXREYXkoKSksZSwyKX1mdW5jdGlvbiBlbnQodCl7cmV0dXJuIHQuZ2V0RGF5KCl9ZnVuY3Rpb24gbm50KHQsZSl7cmV0dXJuIHZldChYdHQuY291bnQoWnR0KHQpLHQpLGUsMil9ZnVuY3Rpb24gaW50KHQsZSl7cmV0dXJuIHZldCh0LmdldEZ1bGxZZWFyKCklMTAwLGUsMil9ZnVuY3Rpb24gcm50KHQsZSl7cmV0dXJuIHZldCh0LmdldEZ1bGxZZWFyKCklMWU0LGUsNCl9ZnVuY3Rpb24gb250KHQpe3ZhciBlPXQuZ2V0VGltZXpvbmVPZmZzZXQoKTtyZXR1cm4oZT4wPyItIjooZSo9LTEsIisiKSkrdmV0KGUvNjB8MCwiMCIsMikrdmV0KGUlNjAsIjAiLDIpfWZ1bmN0aW9uIGFudCh0LGUpe3JldHVybiB2ZXQodC5nZXRVVENEYXRlKCksZSwyKX1mdW5jdGlvbiBzbnQodCxlKXtyZXR1cm4gdmV0KHQuZ2V0VVRDSG91cnMoKSxlLDIpfWZ1bmN0aW9uIGxudCh0LGUpe3JldHVybiB2ZXQodC5nZXRVVENIb3VycygpJTEyfHwxMixlLDIpfWZ1bmN0aW9uIGNudCh0LGUpe3JldHVybiB2ZXQoMStKdHQuY291bnQocmV0KHQpLHQpLGUsMyl9ZnVuY3Rpb24gdW50KHQsZSl7cmV0dXJuIHZldCh0LmdldFVUQ01pbGxpc2Vjb25kcygpLGUsMyl9ZnVuY3Rpb24gaG50KHQsZSl7cmV0dXJuIHVudCh0LGUpKyIwMDAifWZ1bmN0aW9uIGRudCh0LGUpe3JldHVybiB2ZXQodC5nZXRVVENNb250aCgpKzEsZSwyKX1mdW5jdGlvbiBwbnQodCxlKXtyZXR1cm4gdmV0KHQuZ2V0VVRDTWludXRlcygpLGUsMil9ZnVuY3Rpb24gZm50KHQsZSl7cmV0dXJuIHZldCh0LmdldFVUQ1NlY29uZHMoKSxlLDIpfWZ1bmN0aW9uIG1udCh0KXt2YXIgZT10LmdldFVUQ0RheSgpO3JldHVybiAwPT09ZT83OmV9ZnVuY3Rpb24gZ250KHQsZSl7cmV0dXJuIHZldCh0ZXQuY291bnQocmV0KHQpLHQpLGUsMil9ZnVuY3Rpb24gX250KHQsZSl7dmFyIG49dC5nZXRVVENEYXkoKTtyZXR1cm4gdD1uPj00fHwwPT09bj9uZXQodCk6bmV0LmNlaWwodCksdmV0KG5ldC5jb3VudChyZXQodCksdCkrKDQ9PT1yZXQodCkuZ2V0VVRDRGF5KCkpLGUsMil9ZnVuY3Rpb24geW50KHQpe3JldHVybiB0LmdldFVUQ0RheSgpfWZ1bmN0aW9uIHZudCh0LGUpe3JldHVybiB2ZXQoZWV0LmNvdW50KHJldCh0KSx0KSxlLDIpfWZ1bmN0aW9uIGJudCh0LGUpe3JldHVybiB2ZXQodC5nZXRVVENGdWxsWWVhcigpJTEwMCxlLDIpfWZ1bmN0aW9uIHhudCh0LGUpe3JldHVybiB2ZXQodC5nZXRVVENGdWxsWWVhcigpJTFlNCxlLDQpfWZ1bmN0aW9uIHdudCgpe3JldHVybiIrMDAwMCJ9ZnVuY3Rpb24gU250KCl7cmV0dXJuIiUifWZ1bmN0aW9uIE1udCh0KXtyZXR1cm4rdH1mdW5jdGlvbiBFbnQodCl7cmV0dXJuIE1hdGguZmxvb3IoK3QvMWUzKX1mdW5jdGlvbiBUbnQodCl7cmV0dXJuIHVldD1jZXQodCksaGV0PXVldC5mb3JtYXQsZGV0PXVldC5wYXJzZSxwZXQ9dWV0LnV0Y0Zvcm1hdCxmZXQ9dWV0LnV0Y1BhcnNlLHVldH1UbnQoe2RhdGVUaW1lOiIleCwgJVgiLGRhdGU6IiUtbS8lLWQvJVkiLHRpbWU6IiUtSTolTTolUyAlcCIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTt2YXIgQ250LEFudCxrbnQ9IiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIsTG50PURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nP2Z1bmN0aW9uIFBudCh0KXtyZXR1cm4gdC50b0lTT1N0cmluZygpfTpwZXQoa250KSxObnQ9K25ldyBEYXRlKCIyMDAwLTAxLTAxVDAwOjAwOjAwLjAwMFoiKT9mdW5jdGlvbiBJbnQodCl7dmFyIGU9bmV3IERhdGUodCk7cmV0dXJuIGlzTmFOKGUpP251bGw6ZX06ZmV0KGtudCksUm50PTAsT250PTAsem50PTAsRG50PTAsQm50PTAsSG50PTAsRm50PSJvYmplY3QiPT10eXBlb2YgcGVyZm9ybWFuY2UmJnBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZTpEYXRlLFZudD0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTcpfTtmdW5jdGlvbiBVbnQoKXtyZXR1cm4gQm50fHwoVm50KGpudCksQm50PUZudC5ub3coKStIbnQpfWZ1bmN0aW9uIGpudCgpe0JudD0wfWZ1bmN0aW9uIEdudCgpe3RoaXMuX2NhbGw9dGhpcy5fdGltZT10aGlzLl9uZXh0PW51bGx9ZnVuY3Rpb24gV250KHQsZSxuKXt2YXIgaT1uZXcgR250O3JldHVybiBpLnJlc3RhcnQodCxlLG4pLGl9ZnVuY3Rpb24gcW50KCl7VW50KCksKytSbnQ7Zm9yKHZhciB0LGU9Q250O2U7KSh0PUJudC1lLl90aW1lKT49MCYmZS5fY2FsbC5jYWxsKG51bGwsdCksZT1lLl9uZXh0Oy0tUm50fWZ1bmN0aW9uIFludCgpe0JudD0oRG50PUZudC5ub3coKSkrSG50LFJudD1PbnQ9MDt0cnl7cW50KCl9ZmluYWxseXtSbnQ9MCwoZnVuY3Rpb24gdCgpe2Zvcih2YXIgdCxlLG49Q250LGk9MS8wO247KW4uX2NhbGw/KGk+bi5fdGltZSYmKGk9bi5fdGltZSksdD1uLG49bi5fbmV4dCk6KGU9bi5fbmV4dCxuLl9uZXh0PW51bGwsbj10P3QuX25leHQ9ZTpDbnQ9ZSk7QW50PXQsJG50KGkpfSkoKSxCbnQ9MH19ZnVuY3Rpb24gWG50KCl7dmFyIHQ9Rm50Lm5vdygpLGU9dC1EbnQ7ZT4xZTMmJihIbnQtPWUsRG50PXQpfWZ1bmN0aW9uICRudCh0KXtSbnR8fChPbnQmJihPbnQ9Y2xlYXJUaW1lb3V0KE9udCkpLHQtQm50PjI0Pyh0PDEvMCYmKE9udD1zZXRUaW1lb3V0KFludCx0LUZudC5ub3coKS1IbnQpKSx6bnQmJih6bnQ9Y2xlYXJJbnRlcnZhbCh6bnQpKSk6KHpudHx8KERudD1GbnQubm93KCksem50PXNldEludGVydmFsKFhudCwxZTMpKSxSbnQ9MSxWbnQoWW50KSkpfUdudC5wcm90b3R5cGU9V250LnByb3RvdHlwZT17Y29uc3RydWN0b3I6R250LHJlc3RhcnQ6ZnVuY3Rpb24odCxlLG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uIik7bj0obnVsbD09bj9VbnQoKTorbikrKG51bGw9PWU/MDorZSksdGhpcy5fbmV4dHx8QW50PT09dGhpc3x8KEFudD9BbnQuX25leHQ9dGhpczpDbnQ9dGhpcyxBbnQ9dGhpcyksdGhpcy5fY2FsbD10LHRoaXMuX3RpbWU9biwkbnQoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2NhbGwmJih0aGlzLl9jYWxsPW51bGwsdGhpcy5fdGltZT0xLzAsJG50KCkpfX07dmFyIEtudD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsWm50PXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDpLbnQseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTtmdW5jdGlvbiBKbnQodCl7dmFyIGU9dCs9IiIsbj1lLmluZGV4T2YoIjoiKTtyZXR1cm4gbj49MCYmInhtbG5zIiE9PShlPXQuc2xpY2UoMCxuKSkmJih0PXQuc2xpY2UobisxKSksWm50Lmhhc093blByb3BlcnR5KGUpP3tzcGFjZTpabnRbZV0sbG9jYWw6dH06dH1mdW5jdGlvbiBRbnQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vd25lckRvY3VtZW50LG49dGhpcy5uYW1lc3BhY2VVUkk7cmV0dXJuIG49PT1LbnQmJmUuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PUtudD9lLmNyZWF0ZUVsZW1lbnQodCk6ZS5jcmVhdGVFbGVtZW50TlMobix0KX19ZnVuY3Rpb24gdGl0KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIGVpdCh0KXt2YXIgZT1KbnQodCk7cmV0dXJuKGUubG9jYWw/dGl0OlFudCkoZSl9ZnVuY3Rpb24gbml0KCl7fWZ1bmN0aW9uIGlpdCh0KXtyZXR1cm4gbnVsbD09dD9uaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpfX1mdW5jdGlvbiByaXQoKXtyZXR1cm5bXX1mdW5jdGlvbiBvaXQodCl7cmV0dXJuIG51bGw9PXQ/cml0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbCh0KX19ZnVuY3Rpb24gYWl0KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hdGNoZXModCl9fWZ1bmN0aW9uIHNpdCh0KXtyZXR1cm4gbmV3IEFycmF5KHQubGVuZ3RoKX1mdW5jdGlvbiBsaXQodCxlKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPWV9ZnVuY3Rpb24gY2l0KHQsZSxuLGkscixvKXtmb3IodmFyIGEscz0wLGw9ZS5sZW5ndGgsYz1vLmxlbmd0aDtzPGM7KytzKShhPWVbc10pPyhhLl9fZGF0YV9fPW9bc10saVtzXT1hKTpuW3NdPW5ldyBsaXQodCxvW3NdKTtmb3IoO3M8bDsrK3MpKGE9ZVtzXSkmJihyW3NdPWEpfWZ1bmN0aW9uIHVpdCh0LGUsbixpLHIsbyxhKXt2YXIgcyxsLGMsdT17fSxoPWUubGVuZ3RoLGQ9by5sZW5ndGgscD1uZXcgQXJyYXkoaCk7Zm9yKHM9MDtzPGg7KytzKShsPWVbc10pJiYocFtzXT1jPSIkIithLmNhbGwobCxsLl9fZGF0YV9fLHMsZSksYyBpbiB1P3Jbc109bDp1W2NdPWwpO2ZvcihzPTA7czxkOysrcykobD11W2M9IiQiK2EuY2FsbCh0LG9bc10scyxvKV0pPyhpW3NdPWwsbC5fX2RhdGFfXz1vW3NdLHVbY109bnVsbCk6bltzXT1uZXcgbGl0KHQsb1tzXSk7Zm9yKHM9MDtzPGg7KytzKShsPWVbc10pJiZ1W3Bbc11dPT09bCYmKHJbc109bCl9ZnVuY3Rpb24gaGl0KHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTp0Pj1lPzA6TmFOfWZ1bmN0aW9uIGRpdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19ZnVuY3Rpb24gcGl0KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gZml0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUodCxlKX19ZnVuY3Rpb24gbWl0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsZSl9fWZ1bmN0aW9uIGdpdCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PW4/dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCk6dGhpcy5zZXRBdHRyaWJ1dGUodCxuKX19ZnVuY3Rpb24gX2l0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk6dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsbil9fWZ1bmN0aW9uIHlpdCh0KXtyZXR1cm4gdC5vd25lckRvY3VtZW50JiZ0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHQuZG9jdW1lbnQmJnR8fHQuZGVmYXVsdFZpZXd9ZnVuY3Rpb24gdml0KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fWZ1bmN0aW9uIGJpdCh0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LGUsbil9fWZ1bmN0aW9uIHhpdCh0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09aT90aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpOnRoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxpLG4pfX1mdW5jdGlvbiB3aXQodCxlKXtyZXR1cm4gdC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKGUpfHx5aXQodCkuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpLmdldFByb3BlcnR5VmFsdWUoZSl9ZnVuY3Rpb24gU2l0KHQpe3JldHVybiBmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW3RdfX1mdW5jdGlvbiBNaXQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzW3RdPWV9fWZ1bmN0aW9uIEVpdCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PW4/ZGVsZXRlIHRoaXNbdF06dGhpc1t0XT1ufX1mdW5jdGlvbiBUaXQodCl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uIENpdCh0KXtyZXR1cm4gdC5jbGFzc0xpc3R8fG5ldyBBaXQodCl9ZnVuY3Rpb24gQWl0KHQpe3RoaXMuX25vZGU9dCx0aGlzLl9uYW1lcz1UaXQodC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX1mdW5jdGlvbiBraXQodCxlKXtmb3IodmFyIG49Q2l0KHQpLGk9LTEscj1lLmxlbmd0aDsrK2k8cjspbi5hZGQoZVtpXSl9ZnVuY3Rpb24gTGl0KHQsZSl7Zm9yKHZhciBuPUNpdCh0KSxpPS0xLHI9ZS5sZW5ndGg7KytpPHI7KW4ucmVtb3ZlKGVbaV0pfWZ1bmN0aW9uIFBpdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtraXQodGhpcyx0KX19ZnVuY3Rpb24gTml0KHQpe3JldHVybiBmdW5jdGlvbigpe0xpdCh0aGlzLHQpfX1mdW5jdGlvbiBJaXQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXsoZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk/a2l0OkxpdCkodGhpcyx0KX19ZnVuY3Rpb24gUml0KCl7dGhpcy50ZXh0Q29udGVudD0iIn1mdW5jdGlvbiBPaXQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD10fX1mdW5jdGlvbiB6aXQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT1lPyIiOmV9fWZ1bmN0aW9uIERpdCgpe3RoaXMuaW5uZXJIVE1MPSIifWZ1bmN0aW9uIEJpdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD10fX1mdW5jdGlvbiBIaXQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pbm5lckhUTUw9bnVsbD09ZT8iIjplfX1mdW5jdGlvbiBGaXQoKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gVml0KCl7dGhpcy5wcmV2aW91c1NpYmxpbmcmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcyx0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gVWl0KCl7cmV0dXJuIG51bGx9ZnVuY3Rpb24gaml0KCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gR2l0KCl7dmFyIHQ9dGhpcy5jbG9uZU5vZGUoITEpLGU9dGhpcy5wYXJlbnROb2RlO3JldHVybiBlP2UuaW5zZXJ0QmVmb3JlKHQsdGhpcy5uZXh0U2libGluZyk6dH1mdW5jdGlvbiBXaXQoKXt2YXIgdD10aGlzLmNsb25lTm9kZSghMCksZT10aGlzLnBhcmVudE5vZGU7cmV0dXJuIGU/ZS5pbnNlcnRCZWZvcmUodCx0aGlzLm5leHRTaWJsaW5nKTp0fWxpdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmxpdCxhcHBlbmRDaGlsZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LHRoaXMuX25leHQpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LGUpfSxxdWVyeVNlbGVjdG9yOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3Rvcih0KX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCl9fSxBaXQucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtlPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKGUsMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgcWl0PXt9O2Z1bmN0aW9uIFlpdCh0LGUsbil7cmV0dXJuIHQ9WGl0KHQsZSxuKSxmdW5jdGlvbihlKXt2YXIgbj1lLnJlbGF0ZWRUYXJnZXQ7biYmKG49PT10aGlzfHw4Jm4uY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcykpfHx0LmNhbGwodGhpcyxlKX19ZnVuY3Rpb24gWGl0KHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oaSl7dHJ5e3QuY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZSxuKX1maW5hbGx5e319fWZ1bmN0aW9uICRpdCh0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKChmdW5jdGlvbih0KXt2YXIgZT0iIixuPXQuaW5kZXhPZigiLiIpO3JldHVybiBuPj0wJiYoZT10LnNsaWNlKG4rMSksdD10LnNsaWNlKDAsbikpLHt0eXBlOnQsbmFtZTplfX0pKX1mdW5jdGlvbiBLaXQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fX29uO2lmKGUpe2Zvcih2YXIgbixpPTAscj0tMSxvPWUubGVuZ3RoO2k8bzsrK2kpbj1lW2ldLHQudHlwZSYmbi50eXBlIT09dC50eXBlfHxuLm5hbWUhPT10Lm5hbWU/ZVsrK3JdPW46dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG4udHlwZSxuLmxpc3RlbmVyLG4uY2FwdHVyZSk7KytyP2UubGVuZ3RoPXI6ZGVsZXRlIHRoaXMuX19vbn19fWZ1bmN0aW9uIFppdCh0LGUsbil7dmFyIGk9cWl0Lmhhc093blByb3BlcnR5KHQudHlwZSk/WWl0OlhpdDtyZXR1cm4gZnVuY3Rpb24ocixvLGEpe3ZhciBzLGw9dGhpcy5fX29uLGM9aShlLG8sYSk7aWYobClmb3IodmFyIHU9MCxoPWwubGVuZ3RoO3U8aDsrK3UpaWYoKHM9bFt1XSkudHlwZT09PXQudHlwZSYmcy5uYW1lPT09dC5uYW1lKXJldHVybiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIocy50eXBlLHMubGlzdGVuZXIscy5jYXB0dXJlKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIocy50eXBlLHMubGlzdGVuZXI9YyxzLmNhcHR1cmU9biksdm9pZChzLnZhbHVlPWUpO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LnR5cGUsYyxuKSxzPXt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSx2YWx1ZTplLGxpc3RlbmVyOmMsY2FwdHVyZTpufSxsP2wucHVzaChzKTp0aGlzLl9fb249W3NdfX1mdW5jdGlvbiBKaXQodCxlLG4pe3ZhciBpPXlpdCh0KSxyPWkuQ3VzdG9tRXZlbnQ7ImZ1bmN0aW9uIj09dHlwZW9mIHI/cj1uZXcgcihlLG4pOihyPWkuZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iiksbj8oci5pbml0RXZlbnQoZSxuLmJ1YmJsZXMsbi5jYW5jZWxhYmxlKSxyLmRldGFpbD1uLmRldGFpbCk6ci5pbml0RXZlbnQoZSwhMSwhMSkpLHQuZGlzcGF0Y2hFdmVudChyKX1mdW5jdGlvbiBRaXQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gSml0KHRoaXMsdCxlKX19ZnVuY3Rpb24gdHJ0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEppdCh0aGlzLHQsZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX0idW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiYoIm9ubW91c2VlbnRlciJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fChxaXQ9e21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSkpO3ZhciBlcnQ9W251bGxdO2Z1bmN0aW9uIG5ydCh0LGUpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9ZX1mdW5jdGlvbiBpcnQoKXtyZXR1cm4gbmV3IG5ydChbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLGVydCl9bnJ0LnByb3RvdHlwZT1pcnQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpucnQsc2VsZWN0OmZ1bmN0aW9uIHJydCh0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9aWl0KHQpKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49ZS5sZW5ndGgsaT1uZXcgQXJyYXkobikscj0wO3I8bjsrK3IpZm9yKHZhciBvLGEscz1lW3JdLGw9cy5sZW5ndGgsYz1pW3JdPW5ldyBBcnJheShsKSx1PTA7dTxsOysrdSkobz1zW3VdKSYmKGE9dC5jYWxsKG8sby5fX2RhdGFfXyx1LHMpKSYmKCJfX2RhdGFfXyJpbiBvJiYoYS5fX2RhdGFfXz1vLl9fZGF0YV9fKSxjW3VdPWEpO3JldHVybiBuZXcgbnJ0KGksdGhpcy5fcGFyZW50cyl9LHNlbGVjdEFsbDpmdW5jdGlvbiBvcnQodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PW9pdCh0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9W10scj1bXSxvPTA7bzxuOysrbylmb3IodmFyIGEscz1lW29dLGw9cy5sZW5ndGgsYz0wO2M8bDsrK2MpKGE9c1tjXSkmJihpLnB1c2godC5jYWxsKGEsYS5fX2RhdGFfXyxjLHMpKSxyLnB1c2goYSkpO3JldHVybiBuZXcgbnJ0KGkscil9LGZpbHRlcjpmdW5jdGlvbiBhcnQodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PWFpdCh0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWZvcih2YXIgbyxhPWVbcl0scz1hLmxlbmd0aCxsPWlbcl09W10sYz0wO2M8czsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmbC5wdXNoKG8pO3JldHVybiBuZXcgbnJ0KGksdGhpcy5fcGFyZW50cyl9LGRhdGE6ZnVuY3Rpb24gc3J0KHQsZSl7aWYoIXQpcmV0dXJuIGY9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSx1PS0xLHRoaXMuZWFjaCgoZnVuY3Rpb24odCl7ZlsrK3VdPXR9KSksZjt2YXIgbj1lP3VpdDpjaXQsaT10aGlzLl9wYXJlbnRzLHI9dGhpcy5fZ3JvdXBzOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD0oZnVuY3Rpb24gbyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KSh0KSk7Zm9yKHZhciBhPXIubGVuZ3RoLHM9bmV3IEFycmF5KGEpLGw9bmV3IEFycmF5KGEpLGM9bmV3IEFycmF5KGEpLHU9MDt1PGE7Kyt1KXt2YXIgaD1pW3VdLGQ9clt1XSxwPWQubGVuZ3RoLGY9dC5jYWxsKGgsaCYmaC5fX2RhdGFfXyx1LGkpLG09Zi5sZW5ndGgsZz1sW3VdPW5ldyBBcnJheShtKSxfPXNbdV09bmV3IEFycmF5KG0pO24oaCxkLGcsXyxjW3VdPW5ldyBBcnJheShwKSxmLGUpO2Zvcih2YXIgeSx2LGI9MCx4PTA7YjxtOysrYilpZih5PWdbYl0pe2ZvcihiPj14JiYoeD1iKzEpOyEodj1fW3hdKSYmKyt4PG07KTt5Ll9uZXh0PXZ8fG51bGx9fXJldHVybihzPW5ldyBucnQocyxpKSkuX2VudGVyPWwscy5fZXhpdD1jLHN9LGVudGVyOmZ1bmN0aW9uIGxydCgpe3JldHVybiBuZXcgbnJ0KHRoaXMuX2VudGVyfHx0aGlzLl9ncm91cHMubWFwKHNpdCksdGhpcy5fcGFyZW50cyl9LGV4aXQ6ZnVuY3Rpb24gY3J0KCl7cmV0dXJuIG5ldyBucnQodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChzaXQpLHRoaXMuX3BhcmVudHMpfSxqb2luOmZ1bmN0aW9uIHVydCh0LGUsbil7dmFyIGk9dGhpcy5lbnRlcigpLHI9dGhpcyxvPXRoaXMuZXhpdCgpO3JldHVybiBpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3QoaSk6aS5hcHBlbmQodCsiIiksbnVsbCE9ZSYmKHI9ZShyKSksbnVsbD09bj9vLnJlbW92ZSgpOm4obyksaSYmcj9pLm1lcmdlKHIpLm9yZGVyKCk6cn0sbWVyZ2U6ZnVuY3Rpb24gaHJ0KHQpe2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj10Ll9ncm91cHMsaT1lLmxlbmd0aCxyPU1hdGgubWluKGksbi5sZW5ndGgpLG89bmV3IEFycmF5KGkpLGE9MDthPHI7KythKWZvcih2YXIgcyxsPWVbYV0sYz1uW2FdLHU9bC5sZW5ndGgsaD1vW2FdPW5ldyBBcnJheSh1KSxkPTA7ZDx1OysrZCkocz1sW2RdfHxjW2RdKSYmKGhbZF09cyk7Zm9yKDthPGk7KythKW9bYV09ZVthXTtyZXR1cm4gbmV3IG5ydChvLHRoaXMuX3BhcmVudHMpfSxvcmRlcjpmdW5jdGlvbiBkcnQoKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLGU9LTEsbj10Lmxlbmd0aDsrK2U8bjspZm9yKHZhciBpLHI9dFtlXSxvPXIubGVuZ3RoLTEsYT1yW29dOy0tbz49MDspKGk9cltvXSkmJihhJiY0XmkuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSkmJmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaSxhKSxhPWkpO3JldHVybiB0aGlzfSxzb3J0OmZ1bmN0aW9uIHBydCh0KXtmdW5jdGlvbiBlKGUsbil7cmV0dXJuIGUmJm4/dChlLl9fZGF0YV9fLG4uX19kYXRhX18pOiFlLSFufXR8fCh0PWhpdCk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxpPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGkpLG89MDtvPGk7KytvKXtmb3IodmFyIGEscz1uW29dLGw9cy5sZW5ndGgsYz1yW29dPW5ldyBBcnJheShsKSx1PTA7dTxsOysrdSkoYT1zW3VdKSYmKGNbdV09YSk7Yy5zb3J0KGUpfXJldHVybiBuZXcgbnJ0KHIsdGhpcy5fcGFyZW50cykub3JkZXIoKX0sY2FsbDpmdW5jdGlvbiBmcnQoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGFyZ3VtZW50c1swXT10aGlzLHQuYXBwbHkobnVsbCxhcmd1bWVudHMpLHRoaXN9LG5vZGVzOmZ1bmN0aW9uIG1ydCgpe3ZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSksZT0tMTtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3RbKytlXT10aGlzfSkpLHR9LG5vZGU6ZnVuY3Rpb24gZ3J0KCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxlPTAsbj10Lmxlbmd0aDtlPG47KytlKWZvcih2YXIgaT10W2VdLHI9MCxvPWkubGVuZ3RoO3I8bzsrK3Ipe3ZhciBhPWlbcl07aWYoYSlyZXR1cm4gYX1yZXR1cm4gbnVsbH0sc2l6ZTpmdW5jdGlvbiBfcnQoKXt2YXIgdD0wO3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7Kyt0fSkpLHR9LGVtcHR5OmZ1bmN0aW9uIHlydCgpe3JldHVybiF0aGlzLm5vZGUoKX0sZWFjaDpmdW5jdGlvbiB2cnQodCl7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPTAsaT1lLmxlbmd0aDtuPGk7KytuKWZvcih2YXIgcixvPWVbbl0sYT0wLHM9by5sZW5ndGg7YTxzOysrYSkocj1vW2FdKSYmdC5jYWxsKHIsci5fX2RhdGFfXyxhLG8pO3JldHVybiB0aGlzfSxhdHRyOmZ1bmN0aW9uIGJydCh0LGUpe3ZhciBuPUpudCh0KTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciBpPXRoaXMubm9kZSgpO3JldHVybiBuLmxvY2FsP2kuZ2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsKTppLmdldEF0dHJpYnV0ZShuKX1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1lP24ubG9jYWw/cGl0OmRpdDoiZnVuY3Rpb24iPT10eXBlb2YgZT9uLmxvY2FsP19pdDpnaXQ6bi5sb2NhbD9taXQ6Zml0KShuLGUpKX0sc3R5bGU6ZnVuY3Rpb24geHJ0KHQsZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09ZT92aXQ6ImZ1bmN0aW9uIj09dHlwZW9mIGU/eGl0OmJpdCkodCxlLG51bGw9PW4/IiI6bikpOndpdCh0aGlzLm5vZGUoKSx0KX0scHJvcGVydHk6ZnVuY3Rpb24gd3J0KHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PWU/U2l0OiJmdW5jdGlvbiI9PXR5cGVvZiBlP0VpdDpNaXQpKHQsZSkpOnRoaXMubm9kZSgpW3RdfSxjbGFzc2VkOmZ1bmN0aW9uIFNydCh0LGUpe3ZhciBuPVRpdCh0KyIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgaT1DaXQodGhpcy5ub2RlKCkpLHI9LTEsbz1uLmxlbmd0aDsrK3I8bzspaWYoIWkuY29udGFpbnMobltyXSkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIGU/SWl0OmU/UGl0Ok5pdCkobixlKSl9LHRleHQ6ZnVuY3Rpb24gTXJ0KHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P1JpdDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/eml0Ok9pdCkodCkpOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxodG1sOmZ1bmN0aW9uIEVydCh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9EaXQ6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P0hpdDpCaXQpKHQpKTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LHJhaXNlOmZ1bmN0aW9uIFRydCgpe3JldHVybiB0aGlzLmVhY2goRml0KX0sbG93ZXI6ZnVuY3Rpb24gQ3J0KCl7cmV0dXJuIHRoaXMuZWFjaChWaXQpfSxhcHBlbmQ6ZnVuY3Rpb24gQXJ0KHQpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZWl0KHQpO3JldHVybiB0aGlzLnNlbGVjdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KSl9LGluc2VydDpmdW5jdGlvbiBrcnQodCxlKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmVpdCh0KSxpPW51bGw9PWU/VWl0OiJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6aWl0KGUpO3JldHVybiB0aGlzLnNlbGVjdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUobi5hcHBseSh0aGlzLGFyZ3VtZW50cyksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSkpfSxyZW1vdmU6ZnVuY3Rpb24gTHJ0KCl7cmV0dXJuIHRoaXMuZWFjaChqaXQpfSxjbG9uZTpmdW5jdGlvbiBQcnQodCl7cmV0dXJuIHRoaXMuc2VsZWN0KHQ/V2l0OkdpdCl9LGRhdHVtOmZ1bmN0aW9uIE5ydCh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsdCk6dGhpcy5ub2RlKCkuX19kYXRhX199LG9uOmZ1bmN0aW9uIElydCh0LGUsbil7dmFyIGkscixvPSRpdCh0KyIiKSxhPW8ubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7Zm9yKHM9ZT9aaXQ6S2l0LG51bGw9PW4mJihuPSExKSxpPTA7aTxhOysraSl0aGlzLmVhY2gocyhvW2ldLGUsbikpO3JldHVybiB0aGlzfXZhciBzPXRoaXMubm9kZSgpLl9fb247aWYocylmb3IodmFyIGwsYz0wLHU9cy5sZW5ndGg7Yzx1OysrYylmb3IoaT0wLGw9c1tjXTtpPGE7KytpKWlmKChyPW9baV0pLnR5cGU9PT1sLnR5cGUmJnIubmFtZT09PWwubmFtZSlyZXR1cm4gbC52YWx1ZX0sZGlzcGF0Y2g6ZnVuY3Rpb24gUnJ0KHQsZSl7cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIGU/dHJ0OlFpdCkodCxlKSl9fTt2YXIgT3J0PXt2YWx1ZTpmdW5jdGlvbigpe319O2Z1bmN0aW9uIHpydCgpe2Zvcih2YXIgdCxlPTAsbj1hcmd1bWVudHMubGVuZ3RoLGk9e307ZTxuOysrZSl7aWYoISh0PWFyZ3VtZW50c1tlXSsiIil8fHQgaW4gaXx8L1tccy5dLy50ZXN0KHQpKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO2lbdF09W119cmV0dXJuIG5ldyBEcnQoaSl9ZnVuY3Rpb24gRHJ0KHQpe3RoaXMuXz10fWZ1bmN0aW9uIEJydCh0LGUpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBuPSIiLGk9dC5pbmRleE9mKCIuIik7aWYoaT49MCYmKG49dC5zbGljZShpKzEpLHQ9dC5zbGljZSgwLGkpKSx0JiYhZS5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtyZXR1cm57dHlwZTp0LG5hbWU6bn19KSl9ZnVuY3Rpb24gSHJ0KHQsZSl7Zm9yKHZhciBuLGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpaWYoKG49dFtpXSkubmFtZT09PWUpcmV0dXJuIG4udmFsdWV9ZnVuY3Rpb24gRnJ0KHQsZSxuKXtmb3IodmFyIGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpaWYodFtpXS5uYW1lPT09ZSl7dFtpXT1PcnQsdD10LnNsaWNlKDAsaSkuY29uY2F0KHQuc2xpY2UoaSsxKSk7YnJlYWt9cmV0dXJuIG51bGwhPW4mJnQucHVzaCh7bmFtZTplLHZhbHVlOm59KSx0fURydC5wcm90b3R5cGU9enJ0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6RHJ0LG9uOmZ1bmN0aW9uKHQsZSl7dmFyIG4saT10aGlzLl8scj1CcnQodCsiIixpKSxvPS0xLGE9ci5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrZSk7Zm9yKDsrK288YTspaWYobj0odD1yW29dKS50eXBlKWlbbl09RnJ0KGlbbl0sdC5uYW1lLGUpO2Vsc2UgaWYobnVsbD09ZSlmb3IobiBpbiBpKWlbbl09RnJ0KGlbbl0sdC5uYW1lLG51bGwpO3JldHVybiB0aGlzfWZvcig7KytvPGE7KWlmKChuPSh0PXJbb10pLnR5cGUpJiYobj1IcnQoaVtuXSx0Lm5hbWUpKSlyZXR1cm4gbn0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LGU9dGhpcy5fO2Zvcih2YXIgbiBpbiBlKXRbbl09ZVtuXS5zbGljZSgpO3JldHVybiBuZXcgRHJ0KHQpfSxjYWxsOmZ1bmN0aW9uKHQsZSl7aWYoKG49YXJndW1lbnRzLmxlbmd0aC0yKT4wKWZvcih2YXIgbixpLHI9bmV3IEFycmF5KG4pLG89MDtvPG47KytvKXJbb109YXJndW1lbnRzW28rMl07aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3Iobz0wLG49KGk9dGhpcy5fW3RdKS5sZW5ndGg7bzxuOysrbylpW29dLnZhbHVlLmFwcGx5KGUscil9LGFwcGx5OmZ1bmN0aW9uKHQsZSxuKXtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2Zvcih2YXIgaT10aGlzLl9bdF0scj0wLG89aS5sZW5ndGg7cjxvOysrcilpW3JdLnZhbHVlLmFwcGx5KGUsbil9fTt2YXIgVnJ0LFVydCxqcnQ9MCxHcnQ9MCxXcnQ9MCxxcnQ9MCxZcnQ9MCxYcnQ9MCwkcnQ9Im9iamVjdCI9PXR5cGVvZiBwZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlOkRhdGUsS3J0PSJvYmplY3QiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lP3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpOmZ1bmN0aW9uKHQpe3NldFRpbWVvdXQodCwxNyl9O2Z1bmN0aW9uIFpydCgpe3JldHVybiBZcnR8fChLcnQoSnJ0KSxZcnQ9JHJ0Lm5vdygpK1hydCl9ZnVuY3Rpb24gSnJ0KCl7WXJ0PTB9ZnVuY3Rpb24gUXJ0KCl7dGhpcy5fY2FsbD10aGlzLl90aW1lPXRoaXMuX25leHQ9bnVsbH1mdW5jdGlvbiB0b3QodCxlLG4pe3ZhciBpPW5ldyBRcnQ7cmV0dXJuIGkucmVzdGFydCh0LGUsbiksaX1mdW5jdGlvbiBlb3QoKXtZcnQ9KHFydD0kcnQubm93KCkpK1hydCxqcnQ9R3J0PTA7dHJ5eyEoZnVuY3Rpb24gdCgpe1pydCgpLCsranJ0O2Zvcih2YXIgdCxlPVZydDtlOykodD1ZcnQtZS5fdGltZSk+PTAmJmUuX2NhbGwuY2FsbChudWxsLHQpLGU9ZS5fbmV4dDstLWpydH0pKCl9ZmluYWxseXtqcnQ9MCwoZnVuY3Rpb24gZSgpe2Zvcih2YXIgdCxlLG49VnJ0LGk9MS8wO247KW4uX2NhbGw/KGk+bi5fdGltZSYmKGk9bi5fdGltZSksdD1uLG49bi5fbmV4dCk6KGU9bi5fbmV4dCxuLl9uZXh0PW51bGwsbj10P3QuX25leHQ9ZTpWcnQ9ZSk7VXJ0PXQsaW90KGkpfSkoKSxZcnQ9MH19ZnVuY3Rpb24gbm90KCl7dmFyIHQ9JHJ0Lm5vdygpLGU9dC1xcnQ7ZT4xZTMmJihYcnQtPWUscXJ0PXQpfWZ1bmN0aW9uIGlvdCh0KXtqcnR8fChHcnQmJihHcnQ9Y2xlYXJUaW1lb3V0KEdydCkpLHQtWXJ0PjI0Pyh0PDEvMCYmKEdydD1zZXRUaW1lb3V0KGVvdCx0LSRydC5ub3coKS1YcnQpKSxXcnQmJihXcnQ9Y2xlYXJJbnRlcnZhbChXcnQpKSk6KFdydHx8KHFydD0kcnQubm93KCksV3J0PXNldEludGVydmFsKG5vdCwxZTMpKSxqcnQ9MSxLcnQoZW90KSkpfWZ1bmN0aW9uIHJvdCh0LGUsbil7dmFyIGk9bmV3IFFydDtyZXR1cm4gaS5yZXN0YXJ0KChmdW5jdGlvbihuKXtpLnN0b3AoKSx0KG4rZSl9KSxlPW51bGw9PWU/MDorZSxuKSxpfVFydC5wcm90b3R5cGU9dG90LnByb3RvdHlwZT17Y29uc3RydWN0b3I6UXJ0LHJlc3RhcnQ6ZnVuY3Rpb24odCxlLG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uIik7bj0obnVsbD09bj9acnQoKTorbikrKG51bGw9PWU/MDorZSksdGhpcy5fbmV4dHx8VXJ0PT09dGhpc3x8KFVydD9VcnQuX25leHQ9dGhpczpWcnQ9dGhpcyxVcnQ9dGhpcyksdGhpcy5fY2FsbD10LHRoaXMuX3RpbWU9bixpb3QoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2NhbGwmJih0aGlzLl9jYWxsPW51bGwsdGhpcy5fdGltZT0xLzAsaW90KCkpfX07dmFyIG9vdD16cnQoInN0YXJ0IiwiZW5kIiwiaW50ZXJydXB0IiksYW90PVtdO2Z1bmN0aW9uIHNvdCh0LGUsbixpLHIsbyl7dmFyIGE9dC5fX3RyYW5zaXRpb247aWYoYSl7aWYobiBpbiBhKXJldHVybn1lbHNlIHQuX190cmFuc2l0aW9uPXt9OyEoZnVuY3Rpb24gcyh0LGUsbil7dmFyIGkscj10Ll9fdHJhbnNpdGlvbjtmdW5jdGlvbiBvKGwpe3ZhciBjLHUsaCxkO2lmKDEhPT1uLnN0YXRlKXJldHVybiBzKCk7Zm9yKGMgaW4gcilpZigoZD1yW2NdKS5uYW1lPT09bi5uYW1lKXtpZigzPT09ZC5zdGF0ZSlyZXR1cm4gcm90KG8pOzQ9PT1kLnN0YXRlPyhkLnN0YXRlPTYsZC50aW1lci5zdG9wKCksZC5vbi5jYWxsKCJpbnRlcnJ1cHQiLHQsdC5fX2RhdGFfXyxkLmluZGV4LGQuZ3JvdXApLGRlbGV0ZSByW2NdKTorYzxlJiYoZC5zdGF0ZT02LGQudGltZXIuc3RvcCgpLGRlbGV0ZSByW2NdKX1pZihyb3QoKGZ1bmN0aW9uKCl7Mz09PW4uc3RhdGUmJihuLnN0YXRlPTQsbi50aW1lci5yZXN0YXJ0KGEsbi5kZWxheSxuLnRpbWUpLGEobCkpfSkpLG4uc3RhdGU9MixuLm9uLmNhbGwoInN0YXJ0Iix0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSwyPT09bi5zdGF0ZSl7Zm9yKG4uc3RhdGU9MyxpPW5ldyBBcnJheShoPW4udHdlZW4ubGVuZ3RoKSxjPTAsdT0tMTtjPGg7KytjKShkPW4udHdlZW5bY10udmFsdWUuY2FsbCh0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSkmJihpWysrdV09ZCk7aS5sZW5ndGg9dSsxfX1mdW5jdGlvbiBhKGUpe2Zvcih2YXIgcj1lPG4uZHVyYXRpb24/bi5lYXNlLmNhbGwobnVsbCxlL24uZHVyYXRpb24pOihuLnRpbWVyLnJlc3RhcnQocyksbi5zdGF0ZT01LDEpLG89LTEsYT1pLmxlbmd0aDsrK288YTspaVtvXS5jYWxsKG51bGwscik7NT09PW4uc3RhdGUmJihuLm9uLmNhbGwoImVuZCIsdCx0Ll9fZGF0YV9fLG4uaW5kZXgsbi5ncm91cCkscygpKX1mdW5jdGlvbiBzKCl7Zm9yKHZhciBpIGluIG4uc3RhdGU9NixuLnRpbWVyLnN0b3AoKSxkZWxldGUgcltlXSxyKXJldHVybjtkZWxldGUgdC5fX3RyYW5zaXRpb259cltlXT1uLG4udGltZXI9dG90KChmdW5jdGlvbiBsKHQpe24uc3RhdGU9MSxuLnRpbWVyLnJlc3RhcnQobyxuLmRlbGF5LG4udGltZSksbi5kZWxheTw9dCYmbyh0LW4uZGVsYXkpfSksMCxuLnRpbWUpfSkodCxuLHtuYW1lOmUsaW5kZXg6aSxncm91cDpyLG9uOm9vdCx0d2Vlbjphb3QsdGltZTpvLnRpbWUsZGVsYXk6by5kZWxheSxkdXJhdGlvbjpvLmR1cmF0aW9uLGVhc2U6by5lYXNlLHRpbWVyOm51bGwsc3RhdGU6MH0pfWZ1bmN0aW9uIGxvdCh0LGUpe3ZhciBuPXVvdCh0LGUpO2lmKG4uc3RhdGU+MCl0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZCIpO3JldHVybiBufWZ1bmN0aW9uIGNvdCh0LGUpe3ZhciBuPXVvdCh0LGUpO2lmKG4uc3RhdGU+Mil0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHN0YXJ0ZWQiKTtyZXR1cm4gbn1mdW5jdGlvbiB1b3QodCxlKXt2YXIgbj10Ll9fdHJhbnNpdGlvbjtpZighbnx8IShuPW5bZV0pKXRocm93IG5ldyBFcnJvcigidHJhbnNpdGlvbiBub3QgZm91bmQiKTtyZXR1cm4gbn1mdW5jdGlvbiBob3QodCxlKXt2YXIgbixpLHIsbz10Ll9fdHJhbnNpdGlvbixhPSEwO2lmKG8pe2ZvcihyIGluIGU9bnVsbD09ZT9udWxsOmUrIiIsbykobj1vW3JdKS5uYW1lPT09ZT8oaT1uLnN0YXRlPjImJm4uc3RhdGU8NSxuLnN0YXRlPTYsbi50aW1lci5zdG9wKCksaSYmbi5vbi5jYWxsKCJpbnRlcnJ1cHQiLHQsdC5fX2RhdGFfXyxuLmluZGV4LG4uZ3JvdXApLGRlbGV0ZSBvW3JdKTphPSExO2EmJmRlbGV0ZSB0Ll9fdHJhbnNpdGlvbn19ZnVuY3Rpb24gZG90KHQsZSxuKXt0LnByb3RvdHlwZT1lLnByb3RvdHlwZT1uLG4uY29uc3RydWN0b3I9dH1mdW5jdGlvbiBwb3QodCxlKXt2YXIgbj1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIGkgaW4gZSluW2ldPWVbaV07cmV0dXJuIG59ZnVuY3Rpb24gZm90KCl7fXZhciBtb3Q9LjcsZ290PTEvbW90LF9vdD0iXFxzKihbKy1dP1xcZCspXFxzKiIseW90PSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLHZvdD0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIsYm90PS9eIyhbMC05YS1mXXszLDh9KSQvLHhvdD1uZXcgUmVnRXhwKCJecmdiXFwoIitbX290LF9vdCxfb3RdKyJcXCkkIiksd290PW5ldyBSZWdFeHAoIl5yZ2JcXCgiK1t2b3Qsdm90LHZvdF0rIlxcKSQiKSxTb3Q9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tfb3QsX290LF9vdCx5b3RdKyJcXCkkIiksTW90PW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbdm90LHZvdCx2b3QseW90XSsiXFwpJCIpLEVvdD1uZXcgUmVnRXhwKCJeaHNsXFwoIitbeW90LHZvdCx2b3RdKyJcXCkkIiksVG90PW5ldyBSZWdFeHAoIl5oc2xhXFwoIitbeW90LHZvdCx2b3QseW90XSsiXFwpJCIpLENvdD17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtmdW5jdGlvbiBBb3QoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKX1mdW5jdGlvbiBrb3QoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKX1mdW5jdGlvbiBMb3QodCl7dmFyIGUsbjtyZXR1cm4gdD0odCsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKGU9Ym90LmV4ZWModCkpPyhuPWVbMV0ubGVuZ3RoLGU9cGFyc2VJbnQoZVsxXSwxNiksNj09PW4/UG90KGUpOjM9PT1uP25ldyBPb3QoZT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgxNSZlKTw8NHwxNSZlLDEpOjg9PT1uP05vdChlPj4yNCYyNTUsZT4+MTYmMjU1LGU+PjgmMjU1LCgyNTUmZSkvMjU1KTo0PT09bj9Ob3QoZT4+MTImMTV8ZT4+OCYyNDAsZT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgoMTUmZSk8PDR8MTUmZSkvMjU1KTpudWxsKTooZT14b3QuZXhlYyh0KSk/bmV3IE9vdChlWzFdLGVbMl0sZVszXSwxKTooZT13b3QuZXhlYyh0KSk/bmV3IE9vdCgyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCwxKTooZT1Tb3QuZXhlYyh0KSk/Tm90KGVbMV0sZVsyXSxlWzNdLGVbNF0pOihlPU1vdC5leGVjKHQpKT9Ob3QoMjU1KmVbMV0vMTAwLDI1NSplWzJdLzEwMCwyNTUqZVszXS8xMDAsZVs0XSk6KGU9RW90LmV4ZWModCkpP0hvdChlWzFdLGVbMl0vMTAwLGVbM10vMTAwLDEpOihlPVRvdC5leGVjKHQpKT9Ib3QoZVsxXSxlWzJdLzEwMCxlWzNdLzEwMCxlWzRdKTpDb3QuaGFzT3duUHJvcGVydHkodCk/UG90KENvdFt0XSk6InRyYW5zcGFyZW50Ij09PXQ/bmV3IE9vdChOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIFBvdCh0KXtyZXR1cm4gbmV3IE9vdCh0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQsMSl9ZnVuY3Rpb24gTm90KHQsZSxuLGkpe3JldHVybiBpPD0wJiYodD1lPW49TmFOKSxuZXcgT290KHQsZSxuLGkpfWZ1bmN0aW9uIElvdCh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGZvdHx8KHQ9TG90KHQpKSx0P25ldyBPb3QoKHQ9dC5yZ2IoKSkucix0LmcsdC5iLHQub3BhY2l0eSk6bmV3IE9vdH1mdW5jdGlvbiBSb3QodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP0lvdCh0KTpuZXcgT290KHQsZSxuLG51bGw9PWk/MTppKX1mdW5jdGlvbiBPb3QodCxlLG4saSl7dGhpcy5yPSt0LHRoaXMuZz0rZSx0aGlzLmI9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIHpvdCgpe3JldHVybiIjIitCb3QodGhpcy5yKStCb3QodGhpcy5nKStCb3QodGhpcy5iKX1mdW5jdGlvbiBEb3QoKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX1mdW5jdGlvbiBCb3QodCl7cmV0dXJuKCh0PU1hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodCl8fDApKSk8MTY/IjAiOiIiKSt0LnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBIb3QodCxlLG4saSl7cmV0dXJuIGk8PTA/dD1lPW49TmFOOm48PTB8fG4+PTE/dD1lPU5hTjplPD0wJiYodD1OYU4pLG5ldyBWb3QodCxlLG4saSl9ZnVuY3Rpb24gRm90KHQpe2lmKHQgaW5zdGFuY2VvZiBWb3QpcmV0dXJuIG5ldyBWb3QodC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YgZm90fHwodD1Mb3QodCkpLCF0KXJldHVybiBuZXcgVm90O2lmKHQgaW5zdGFuY2VvZiBWb3QpcmV0dXJuIHQ7dmFyIGU9KHQ9dC5yZ2IoKSkuci8yNTUsbj10LmcvMjU1LGk9dC5iLzI1NSxyPU1hdGgubWluKGUsbixpKSxvPU1hdGgubWF4KGUsbixpKSxhPU5hTixzPW8tcixsPShvK3IpLzI7cmV0dXJuIHM/KGE9ZT09PW8/KG4taSkvcys2KihuPGkpOm49PT1vPyhpLWUpL3MrMjooZS1uKS9zKzQscy89bDwuNT9vK3I6Mi1vLXIsYSo9NjApOnM9bD4wJiZsPDE/MDphLG5ldyBWb3QoYSxzLGwsdC5vcGFjaXR5KX1mdW5jdGlvbiBWb3QodCxlLG4saSl7dGhpcy5oPSt0LHRoaXMucz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIFVvdCh0LGUsbil7cmV0dXJuIDI1NSoodDw2MD9lKyhuLWUpKnQvNjA6dDwxODA/bjp0PDI0MD9lKyhuLWUpKigyNDAtdCkvNjA6ZSl9ZnVuY3Rpb24gam90KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBHb3QodCxlKXt2YXIgbj1lLXQ7cmV0dXJuIG4/KGZ1bmN0aW9uIGkodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQrbiplfX0pKHQsbik6am90KGlzTmFOKHQpP2U6dCl9ZG90KGZvdCxMb3Qse2NvcHk6ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IHRoaXMuY29uc3RydWN0b3IsdGhpcyx0KX0sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSxoZXg6QW90LGZvcm1hdEhleDpBb3QsZm9ybWF0SHNsOmZ1bmN0aW9uIFdvdCgpe3JldHVybiBGb3QodGhpcykuZm9ybWF0SHNsKCl9LGZvcm1hdFJnYjprb3QsdG9TdHJpbmc6a290fSksZG90KE9vdCxSb3QscG90KGZvdCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9nb3Q6TWF0aC5wb3coZ290LHQpLG5ldyBPb3QodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/bW90Ok1hdGgucG93KG1vdCx0KSxuZXcgT290KHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybi0uNTw9dGhpcy5yJiZ0aGlzLnI8MjU1LjUmJi0uNTw9dGhpcy5nJiZ0aGlzLmc8MjU1LjUmJi0uNTw9dGhpcy5iJiZ0aGlzLmI8MjU1LjUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxoZXg6em90LGZvcm1hdEhleDp6b3QsZm9ybWF0UmdiOkRvdCx0b1N0cmluZzpEb3R9KSksZG90KFZvdCwoZnVuY3Rpb24gcW90KHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Gb3QodCk6bmV3IFZvdCh0LGUsbixudWxsPT1pPzE6aSl9KSxwb3QoZm90LHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P2dvdDpNYXRoLnBvdyhnb3QsdCksbmV3IFZvdCh0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P21vdDpNYXRoLnBvdyhtb3QsdCksbmV3IFZvdCh0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaCUzNjArMzYwKih0aGlzLmg8MCksZT1pc05hTih0KXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxuPXRoaXMubCxpPW4rKG48LjU/bjoxLW4pKmUscj0yKm4taTtyZXR1cm4gbmV3IE9vdChVb3QodD49MjQwP3QtMjQwOnQrMTIwLHIsaSksVW90KHQscixpKSxVb3QodDwxMjA/dCsyNDA6dC0xMjAscixpKSx0aGlzLm9wYWNpdHkpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybigwPD10aGlzLnMmJnRoaXMuczw9MXx8aXNOYU4odGhpcy5zKSkmJjA8PXRoaXMubCYmdGhpcy5sPD0xJiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sZm9ybWF0SHNsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcGFjaXR5O3JldHVybigxPT09KHQ9aXNOYU4odCk/MTpNYXRoLm1heCgwLE1hdGgubWluKDEsdCkpKT8iaHNsKCI6ImhzbGEoIikrKHRoaXMuaHx8MCkrIiwgIisxMDAqKHRoaXMuc3x8MCkrIiUsICIrMTAwKih0aGlzLmx8fDApKyIlIisoMT09PXQ/IikiOiIsICIrdCsiKSIpfX0pKTt2YXIgWW90PShmdW5jdGlvbiB0KGUpe3ZhciBuPShmdW5jdGlvbiBpKHQpe3JldHVybiAxPT0odD0rdCk/R290OmZ1bmN0aW9uKGUsbil7cmV0dXJuIG4tZT8oZnVuY3Rpb24gaSh0LGUsbil7cmV0dXJuIHQ9TWF0aC5wb3codCxuKSxlPU1hdGgucG93KGUsbiktdCxuPTEvbixmdW5jdGlvbihpKXtyZXR1cm4gTWF0aC5wb3codCtpKmUsbil9fSkoZSxuLHQpOmpvdChpc05hTihlKT9uOmUpfX0pKGUpO2Z1bmN0aW9uIHIodCxlKXt2YXIgaT1uKCh0PVJvdCh0KSkuciwoZT1Sb3QoZSkpLnIpLHI9bih0LmcsZS5nKSxvPW4odC5iLGUuYiksYT1Hb3QodC5vcGFjaXR5LGUub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0LnI9aShlKSx0Lmc9cihlKSx0LmI9byhlKSx0Lm9wYWNpdHk9YShlKSx0KyIifX1yZXR1cm4gci5nYW1tYT10LHJ9KSgxKTtmdW5jdGlvbiBYb3QodCxlKXtyZXR1cm4gdD0rdCxlPStlLGZ1bmN0aW9uKG4pe3JldHVybiB0KigxLW4pK2Uqbn19dmFyICRvdD0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2csS290PW5ldyBSZWdFeHAoJG90LnNvdXJjZSwiZyIpO2Z1bmN0aW9uIFpvdCh0LGUpe3ZhciBuLGkscixvPSRvdC5sYXN0SW5kZXg9S290Lmxhc3RJbmRleD0wLGE9LTEscz1bXSxsPVtdO2Zvcih0Kz0iIixlKz0iIjsobj0kb3QuZXhlYyh0KSkmJihpPUtvdC5leGVjKGUpKTspKHI9aS5pbmRleCk+byYmKHI9ZS5zbGljZShvLHIpLHNbYV0/c1thXSs9cjpzWysrYV09ciksKG49blswXSk9PT0oaT1pWzBdKT9zW2FdP3NbYV0rPWk6c1srK2FdPWk6KHNbKythXT1udWxsLGwucHVzaCh7aTphLHg6WG90KG4saSl9KSksbz1Lb3QubGFzdEluZGV4O3JldHVybiBvPGUubGVuZ3RoJiYocj1lLnNsaWNlKG8pLHNbYV0/c1thXSs9cjpzWysrYV09cikscy5sZW5ndGg8Mj9sWzBdPyhmdW5jdGlvbiBjKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlKSsiIn19KShsWzBdLngpOihmdW5jdGlvbiB1KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0pKGUpOihlPWwubGVuZ3RoLGZ1bmN0aW9uKHQpe2Zvcih2YXIgbixpPTA7aTxlOysraSlzWyhuPWxbaV0pLmldPW4ueCh0KTtyZXR1cm4gcy5qb2luKCIiKX0pfXZhciBKb3QsUW90LHRhdCxlYXQsbmF0PTE4MC9NYXRoLlBJLGlhdD17dHJhbnNsYXRlWDowLHRyYW5zbGF0ZVk6MCxyb3RhdGU6MCxza2V3WDowLHNjYWxlWDoxLHNjYWxlWToxfTtmdW5jdGlvbiByYXQodCxlLG4saSxyLG8pe3ZhciBhLHMsbDtyZXR1cm4oYT1NYXRoLnNxcnQodCp0K2UqZSkpJiYodC89YSxlLz1hKSwobD10Km4rZSppKSYmKG4tPXQqbCxpLT1lKmwpLChzPU1hdGguc3FydChuKm4raSppKSkmJihuLz1zLGkvPXMsbC89cyksdCppPGUqbiYmKHQ9LXQsZT0tZSxsPS1sLGE9LWEpLHt0cmFuc2xhdGVYOnIsdHJhbnNsYXRlWTpvLHJvdGF0ZTpNYXRoLmF0YW4yKGUsdCkqbmF0LHNrZXdYOk1hdGguYXRhbihsKSpuYXQsc2NhbGVYOmEsc2NhbGVZOnN9fWZ1bmN0aW9uIG9hdCh0LGUsbixpKXtmdW5jdGlvbiByKHQpe3JldHVybiB0Lmxlbmd0aD90LnBvcCgpKyIgIjoiIn1yZXR1cm4gZnVuY3Rpb24obyxhKXt2YXIgcz1bXSxsPVtdO3JldHVybiBvPXQobyksYT10KGEpLChmdW5jdGlvbiBjKHQsaSxyLG8sYSxzKXtpZih0IT09cnx8aSE9PW8pe3ZhciBsPWEucHVzaCgidHJhbnNsYXRlKCIsbnVsbCxlLG51bGwsbik7cy5wdXNoKHtpOmwtNCx4OlhvdCh0LHIpfSx7aTpsLTIseDpYb3QoaSxvKX0pfWVsc2Uocnx8bykmJmEucHVzaCgidHJhbnNsYXRlKCIrcitlK28rbil9KShvLnRyYW5zbGF0ZVgsby50cmFuc2xhdGVZLGEudHJhbnNsYXRlWCxhLnRyYW5zbGF0ZVkscyxsKSwoZnVuY3Rpb24gdSh0LGUsbixvKXt0IT09ZT8odC1lPjE4MD9lKz0zNjA6ZS10PjE4MCYmKHQrPTM2MCksby5wdXNoKHtpOm4ucHVzaChyKG4pKyJyb3RhdGUoIixudWxsLGkpLTIseDpYb3QodCxlKX0pKTplJiZuLnB1c2gocihuKSsicm90YXRlKCIrZStpKX0pKG8ucm90YXRlLGEucm90YXRlLHMsbCksKGZ1bmN0aW9uIGgodCxlLG4sbyl7dCE9PWU/by5wdXNoKHtpOm4ucHVzaChyKG4pKyJza2V3WCgiLG51bGwsaSktMix4OlhvdCh0LGUpfSk6ZSYmbi5wdXNoKHIobikrInNrZXdYKCIrZStpKX0pKG8uc2tld1gsYS5za2V3WCxzLGwpLChmdW5jdGlvbiBkKHQsZSxuLGksbyxhKXtpZih0IT09bnx8ZSE9PWkpe3ZhciBzPW8ucHVzaChyKG8pKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKTthLnB1c2goe2k6cy00LHg6WG90KHQsbil9LHtpOnMtMix4OlhvdChlLGkpfSl9ZWxzZSAxPT09biYmMT09PWl8fG8ucHVzaChyKG8pKyJzY2FsZSgiK24rIiwiK2krIikiKX0pKG8uc2NhbGVYLG8uc2NhbGVZLGEuc2NhbGVYLGEuc2NhbGVZLHMsbCksbz1hPW51bGwsZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49LTEsaT1sLmxlbmd0aDsrK248aTspc1soZT1sW25dKS5pXT1lLngodCk7cmV0dXJuIHMuam9pbigiIil9fX12YXIgYWF0PW9hdCgoZnVuY3Rpb24gc2F0KHQpe3JldHVybiJub25lIj09PXQ/aWF0OihKb3R8fChKb3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksUW90PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCx0YXQ9ZG9jdW1lbnQuZGVmYXVsdFZpZXcpLEpvdC5zdHlsZS50cmFuc2Zvcm09dCx0PXRhdC5nZXRDb21wdXRlZFN0eWxlKFFvdC5hcHBlbmRDaGlsZChKb3QpLG51bGwpLmdldFByb3BlcnR5VmFsdWUoInRyYW5zZm9ybSIpLFFvdC5yZW1vdmVDaGlsZChKb3QpLHJhdCgrKHQ9dC5zbGljZSg3LC0xKS5zcGxpdCgiLCIpKVswXSwrdFsxXSwrdFsyXSwrdFszXSwrdFs0XSwrdFs1XSkpfSksInB4LCAiLCJweCkiLCJkZWcpIiksbGF0PW9hdCgoZnVuY3Rpb24gY2F0KHQpe3JldHVybiBudWxsPT10P2lhdDooZWF0fHwoZWF0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJnIikpLGVhdC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsdCksKHQ9ZWF0LnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpP3JhdCgodD10Lm1hdHJpeCkuYSx0LmIsdC5jLHQuZCx0LmUsdC5mKTppYXQpfSksIiwgIiwiKSIsIikiKTtmdW5jdGlvbiB1YXQodCxlKXt2YXIgbixpO3JldHVybiBmdW5jdGlvbigpe3ZhciByPWNvdCh0aGlzLHQpLG89ci50d2VlbjtpZihvIT09bilmb3IodmFyIGE9MCxzPShpPW49bykubGVuZ3RoO2E8czsrK2EpaWYoaVthXS5uYW1lPT09ZSl7KGk9aS5zbGljZSgpKS5zcGxpY2UoYSwxKTticmVha31yLnR3ZWVuPWl9fWZ1bmN0aW9uIGhhdCh0LGUsbil7dmFyIGkscjtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89Y290KHRoaXMsdCksYT1vLnR3ZWVuO2lmKGEhPT1pKXtyPShpPWEpLnNsaWNlKCk7Zm9yKHZhciBzPXtuYW1lOmUsdmFsdWU6bn0sbD0wLGM9ci5sZW5ndGg7bDxjOysrbClpZihyW2xdLm5hbWU9PT1lKXtyW2xdPXM7YnJlYWt9bD09PWMmJnIucHVzaChzKX1vLnR3ZWVuPXJ9fWZ1bmN0aW9uIGRhdCh0LGUsbil7dmFyIGk9dC5faWQ7cmV0dXJuIHQuZWFjaCgoZnVuY3Rpb24oKXt2YXIgdD1jb3QodGhpcyxpKTsodC52YWx1ZXx8KHQudmFsdWU9e30pKVtlXT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pKSxmdW5jdGlvbih0KXtyZXR1cm4gdW90KHQsaSkudmFsdWVbZV19fWZ1bmN0aW9uIHBhdCh0LGUpe3ZhciBuO3JldHVybigibnVtYmVyIj09dHlwZW9mIGU/WG90OmUgaW5zdGFuY2VvZiBMb3Q/WW90OihuPUxvdChlKSk/KGU9bixZb3QpOlpvdCkodCxlKX1mdW5jdGlvbiBmYXQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIG1hdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIGdhdCh0LGUsbil7dmFyIGkscjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZSh0KTtyZXR1cm4gbz09PW4/bnVsbDpvPT09aT9yOnI9ZShpPW8sbil9fWZ1bmN0aW9uIF9hdCh0LGUsbil7dmFyIGkscjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk7cmV0dXJuIG89PT1uP251bGw6bz09PWk/cjpyPWUoaT1vLG4pfX1mdW5jdGlvbiB5YXQodCxlLG4pe3ZhciBpLHIsbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYSxzPW4odGhpcyk7aWYobnVsbCE9cylyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZSh0KSk9PT1zP251bGw6YT09PWkmJnM9PT1yP286bz1lKGk9YSxyPXMpO3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX1mdW5jdGlvbiB2YXQodCxlLG4pe3ZhciBpLHIsbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYSxzPW4odGhpcyk7aWYobnVsbCE9cylyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCkpPT09cz9udWxsOmE9PT1pJiZzPT09cj9vOm89ZShpPWEscj1zKTt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIGJhdCh0LGUpe2Z1bmN0aW9uIG4oKXt2YXIgbj10aGlzLGk9ZS5hcHBseShuLGFyZ3VtZW50cyk7cmV0dXJuIGkmJmZ1bmN0aW9uKGUpe24uc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGkoZSkpfX1yZXR1cm4gbi5fdmFsdWU9ZSxufWZ1bmN0aW9uIHhhdCh0LGUpe2Z1bmN0aW9uIG4oKXt2YXIgbj10aGlzLGk9ZS5hcHBseShuLGFyZ3VtZW50cyk7cmV0dXJuIGkmJmZ1bmN0aW9uKGUpe24uc2V0QXR0cmlidXRlKHQsaShlKSl9fXJldHVybiBuLl92YWx1ZT1lLG59ZnVuY3Rpb24gd2F0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7bG90KHRoaXMsdCkuZGVsYXk9K2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBTYXQodCxlKXtyZXR1cm4gZT0rZSxmdW5jdGlvbigpe2xvdCh0aGlzLHQpLmRlbGF5PWV9fWZ1bmN0aW9uIE1hdCh0LGUpe3JldHVybiBmdW5jdGlvbigpe2NvdCh0aGlzLHQpLmR1cmF0aW9uPStlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gRWF0KHQsZSl7cmV0dXJuIGU9K2UsZnVuY3Rpb24oKXtjb3QodGhpcyx0KS5kdXJhdGlvbj1lfX1mdW5jdGlvbiBUYXQodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7Y290KHRoaXMsdCkuZWFzZT1lfX1mdW5jdGlvbiBDYXQodCxlLG4pe3ZhciBpLHIsbz0oZnVuY3Rpb24gYSh0KXtyZXR1cm4odCsiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pLmV2ZXJ5KChmdW5jdGlvbih0KXt2YXIgZT10LmluZGV4T2YoIi4iKTtyZXR1cm4gZT49MCYmKHQ9dC5zbGljZSgwLGUpKSwhdHx8InN0YXJ0Ij09PXR9KSl9KShlKT9sb3Q6Y290O3JldHVybiBmdW5jdGlvbigpe3ZhciBhPW8odGhpcyx0KSxzPWEub247cyE9PWkmJihyPShpPXMpLmNvcHkoKSkub24oZSxuKSxhLm9uPXJ9fXZhciBBYXQ9aXJ0LnByb3RvdHlwZS5jb25zdHJ1Y3RvcjtmdW5jdGlvbiBrYXQodCxlLG4pe2Z1bmN0aW9uIGkoKXt2YXIgaT10aGlzLHI9ZS5hcHBseShpLGFyZ3VtZW50cyk7cmV0dXJuIHImJmZ1bmN0aW9uKGUpe2kuc3R5bGUuc2V0UHJvcGVydHkodCxyKGUpLG4pfX1yZXR1cm4gaS5fdmFsdWU9ZSxpfXZhciBMYXQ9MDtmdW5jdGlvbiBQYXQodCxlLG4saSl7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1lLHRoaXMuX25hbWU9bix0aGlzLl9pZD1pfWZ1bmN0aW9uIE5hdCh0KXtyZXR1cm4gaXJ0KCkudHJhbnNpdGlvbih0KX1mdW5jdGlvbiBJYXQoKXtyZXR1cm4rK0xhdH12YXIgUmF0PWlydC5wcm90b3R5cGU7UGF0LnByb3RvdHlwZT1OYXQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpQYXQsc2VsZWN0OmZ1bmN0aW9uIE9hdCh0KXt2YXIgZT10aGlzLl9uYW1lLG49dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PWlpdCh0KSk7Zm9yKHZhciBpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89bmV3IEFycmF5KHIpLGE9MDthPHI7KythKWZvcih2YXIgcyxsLGM9aVthXSx1PWMubGVuZ3RoLGg9b1thXT1uZXcgQXJyYXkodSksZD0wO2Q8dTsrK2QpKHM9Y1tkXSkmJihsPXQuY2FsbChzLHMuX19kYXRhX18sZCxjKSkmJigiX19kYXRhX18iaW4gcyYmKGwuX19kYXRhX189cy5fX2RhdGFfXyksaFtkXT1sLHNvdChoW2RdLGUsbixkLGgsdW90KHMsbikpKTtyZXR1cm4gbmV3IFBhdChvLHRoaXMuX3BhcmVudHMsZSxuKX0sc2VsZWN0QWxsOmZ1bmN0aW9uIHphdCh0KXt2YXIgZT10aGlzLl9uYW1lLG49dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PW9pdCh0KSk7Zm9yKHZhciBpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89W10sYT1bXSxzPTA7czxyOysrcylmb3IodmFyIGwsYz1pW3NdLHU9Yy5sZW5ndGgsaD0wO2g8dTsrK2gpaWYobD1jW2hdKXtmb3IodmFyIGQscD10LmNhbGwobCxsLl9fZGF0YV9fLGgsYyksZj11b3QobCxuKSxtPTAsZz1wLmxlbmd0aDttPGc7KyttKShkPXBbbV0pJiZzb3QoZCxlLG4sbSxwLGYpO28ucHVzaChwKSxhLnB1c2gobCl9cmV0dXJuIG5ldyBQYXQobyxhLGUsbil9LGZpbHRlcjpmdW5jdGlvbiBEYXQodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PWFpdCh0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWZvcih2YXIgbyxhPWVbcl0scz1hLmxlbmd0aCxsPWlbcl09W10sYz0wO2M8czsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmbC5wdXNoKG8pO3JldHVybiBuZXcgUGF0KGksdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sbWVyZ2U6ZnVuY3Rpb24gQmF0KHQpe2lmKHQuX2lkIT09dGhpcy5faWQpdGhyb3cgbmV3IEVycm9yO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj10Ll9ncm91cHMsaT1lLmxlbmd0aCxyPU1hdGgubWluKGksbi5sZW5ndGgpLG89bmV3IEFycmF5KGkpLGE9MDthPHI7KythKWZvcih2YXIgcyxsPWVbYV0sYz1uW2FdLHU9bC5sZW5ndGgsaD1vW2FdPW5ldyBBcnJheSh1KSxkPTA7ZDx1OysrZCkocz1sW2RdfHxjW2RdKSYmKGhbZF09cyk7Zm9yKDthPGk7KythKW9bYV09ZVthXTtyZXR1cm4gbmV3IFBhdChvLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LHNlbGVjdGlvbjpmdW5jdGlvbiBIYXQoKXtyZXR1cm4gbmV3IEFhdCh0aGlzLl9ncm91cHMsdGhpcy5fcGFyZW50cyl9LHRyYW5zaXRpb246ZnVuY3Rpb24gRmF0KCl7Zm9yKHZhciB0PXRoaXMuX25hbWUsZT10aGlzLl9pZCxuPUlhdCgpLGk9dGhpcy5fZ3JvdXBzLHI9aS5sZW5ndGgsbz0wO288cjsrK28pZm9yKHZhciBhLHM9aVtvXSxsPXMubGVuZ3RoLGM9MDtjPGw7KytjKWlmKGE9c1tjXSl7dmFyIHU9dW90KGEsZSk7c290KGEsdCxuLGMscyx7dGltZTp1LnRpbWUrdS5kZWxheSt1LmR1cmF0aW9uLGRlbGF5OjAsZHVyYXRpb246dS5kdXJhdGlvbixlYXNlOnUuZWFzZX0pfXJldHVybiBuZXcgUGF0KGksdGhpcy5fcGFyZW50cyx0LG4pfSxjYWxsOlJhdC5jYWxsLG5vZGVzOlJhdC5ub2Rlcyxub2RlOlJhdC5ub2RlLHNpemU6UmF0LnNpemUsZW1wdHk6UmF0LmVtcHR5LGVhY2g6UmF0LmVhY2gsb246ZnVuY3Rpb24gVmF0KHQsZSl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj91b3QodGhpcy5ub2RlKCksbikub24ub24odCk6dGhpcy5lYWNoKENhdChuLHQsZSkpfSxhdHRyOmZ1bmN0aW9uIFVhdCh0LGUpe3ZhciBuPUpudCh0KSxpPSJ0cmFuc2Zvcm0iPT09bj9sYXQ6cGF0O3JldHVybiB0aGlzLmF0dHJUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBlPyhuLmxvY2FsP3ZhdDp5YXQpKG4saSxkYXQodGhpcywiYXR0ci4iK3QsZSkpOm51bGw9PWU/KG4ubG9jYWw/bWF0OmZhdCkobik6KG4ubG9jYWw/X2F0OmdhdCkobixpLGUrIiIpKX0sYXR0clR3ZWVuOmZ1bmN0aW9uIGphdCh0LGUpe3ZhciBuPSJhdHRyLiIrdDtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKG49dGhpcy50d2VlbihuKSkmJm4uX3ZhbHVlO2lmKG51bGw9PWUpcmV0dXJuIHRoaXMudHdlZW4obixudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7dmFyIGk9Sm50KHQpO3JldHVybiB0aGlzLnR3ZWVuKG4sKGkubG9jYWw/YmF0OnhhdCkoaSxlKSl9LHN0eWxlOmZ1bmN0aW9uIEdhdCh0LGUsbil7dmFyIGk9InRyYW5zZm9ybSI9PSh0Kz0iIik/YWF0OnBhdDtyZXR1cm4gbnVsbD09ZT90aGlzLnN0eWxlVHdlZW4odCwoZnVuY3Rpb24gbyh0LGUpe3ZhciBuLGkscjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz13aXQodGhpcyx0KSxhPSh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLHdpdCh0aGlzLHQpKTtyZXR1cm4gbz09PWE/bnVsbDpvPT09biYmYT09PWk/cjpyPWUobj1vLGk9YSl9fSkodCxpKSkub24oImVuZC5zdHlsZS4iK3QsKGZ1bmN0aW9uIHIodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KX19KSh0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIGU/KGZ1bmN0aW9uIGEodCxlLG4pe3ZhciBpLHIsbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT13aXQodGhpcyx0KSxzPW4odGhpcyk7cmV0dXJuIG51bGw9PXMmJih0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLHM9d2l0KHRoaXMsdCkpLGE9PT1zP251bGw6YT09PWkmJnM9PT1yP286bz1lKGk9YSxyPXMpfX0pKHQsaSxkYXQodGhpcywic3R5bGUuIit0LGUpKTooZnVuY3Rpb24gcyh0LGUsbil7dmFyIGkscjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz13aXQodGhpcyx0KTtyZXR1cm4gbz09PW4/bnVsbDpvPT09aT9yOnI9ZShpPW8sbil9fSkodCxpLGUrIiIpLG4pfSxzdHlsZVR3ZWVuOmZ1bmN0aW9uIFdhdCh0LGUsbil7dmFyIGk9InN0eWxlLiIrKHQrPSIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKGk9dGhpcy50d2VlbihpKSkmJmkuX3ZhbHVlO2lmKG51bGw9PWUpcmV0dXJuIHRoaXMudHdlZW4oaSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4oaSxrYXQodCxlLG51bGw9PW4/IiI6bikpfSx0ZXh0OmZ1bmN0aW9uIHFhdCh0KXtyZXR1cm4gdGhpcy50d2VlbigidGV4dCIsImZ1bmN0aW9uIj09dHlwZW9mIHQ/KGZ1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dCh0aGlzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PWU/IiI6ZX19KShkYXQodGhpcywidGV4dCIsdCkpOihmdW5jdGlvbiBuKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KShudWxsPT10PyIiOnQrIiIpKX0scmVtb3ZlOmZ1bmN0aW9uIFlhdCgpe3JldHVybiB0aGlzLm9uKCJlbmQucmVtb3ZlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7Zm9yKHZhciBuIGluIHRoaXMuX190cmFuc2l0aW9uKWlmKCtuIT09ZSlyZXR1cm47dCYmdC5yZW1vdmVDaGlsZCh0aGlzKX19KSh0aGlzLl9pZCkpfSx0d2VlbjpmdW5jdGlvbiBYYXQodCxlKXt2YXIgbj10aGlzLl9pZDtpZih0Kz0iIixhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgaSxyPXVvdCh0aGlzLm5vZGUoKSxuKS50d2VlbixvPTAsYT1yLmxlbmd0aDtvPGE7KytvKWlmKChpPXJbb10pLm5hbWU9PT10KXJldHVybiBpLnZhbHVlO3JldHVybiBudWxsfXJldHVybiB0aGlzLmVhY2goKG51bGw9PWU/dWF0OmhhdCkobix0LGUpKX0sZGVsYXk6ZnVuY3Rpb24gJGF0KHQpe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIHQ/d2F0OlNhdCkoZSx0KSk6dW90KHRoaXMubm9kZSgpLGUpLmRlbGF5fSxkdXJhdGlvbjpmdW5jdGlvbiBLYXQodCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9NYXQ6RWF0KShlLHQpKTp1b3QodGhpcy5ub2RlKCksZSkuZHVyYXRpb259LGVhc2U6ZnVuY3Rpb24gWmF0KHQpe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChUYXQoZSx0KSk6dW90KHRoaXMubm9kZSgpLGUpLmVhc2V9fTt2YXIgSmF0PXt0aW1lOm51bGwsZGVsYXk6MCxkdXJhdGlvbjoyNTAsZWFzZTpUZn07ZnVuY3Rpb24gUWF0KHQsZSl7Zm9yKHZhciBuOyEobj10Ll9fdHJhbnNpdGlvbil8fCEobj1uW2VdKTspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuIEphdC50aW1lPVpydCgpLEphdDtyZXR1cm4gbn1pcnQucHJvdG90eXBlLmludGVycnVwdD1mdW5jdGlvbiB0c3QodCl7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXtob3QodGhpcyx0KX0pKX0saXJ0LnByb3RvdHlwZS50cmFuc2l0aW9uPWZ1bmN0aW9uIGVzdCh0KXt2YXIgZSxuO3QgaW5zdGFuY2VvZiBQYXQ/KGU9dC5faWQsdD10Ll9uYW1lKTooZT1JYXQoKSwobj1KYXQpLnRpbWU9WnJ0KCksdD1udWxsPT10P251bGw6dCsiIik7Zm9yKHZhciBpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89MDtvPHI7KytvKWZvcih2YXIgYSxzPWlbb10sbD1zLmxlbmd0aCxjPTA7YzxsOysrYykoYT1zW2NdKSYmc290KGEsdCxlLGMscyxufHxRYXQoYSxlKSk7cmV0dXJuIG5ldyBQYXQoaSx0aGlzLl9wYXJlbnRzLHQsZSl9O3ZhciBuc3Q9W251bGxdO2Z1bmN0aW9uIGlzdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gcnN0KHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIG9zdCh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBhc3QoKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBzc3QodCl7dC5VPXQuQz10Lkw9dC5SPXQuUD10Lk49bnVsbH1mdW5jdGlvbiBsc3QodCxlKXt2YXIgbj1lLGk9ZS5SLHI9bi5VO3I/ci5MPT09bj9yLkw9aTpyLlI9aTp0Ll89aSxpLlU9cixuLlU9aSxuLlI9aS5MLG4uUiYmKG4uUi5VPW4pLGkuTD1ufWZ1bmN0aW9uIGNzdCh0LGUpe3ZhciBuPWUsaT1lLkwscj1uLlU7cj9yLkw9PT1uP3IuTD1pOnIuUj1pOnQuXz1pLGkuVT1yLG4uVT1pLG4uTD1pLlIsbi5MJiYobi5MLlU9biksaS5SPW59ZnVuY3Rpb24gdXN0KHQpe2Zvcig7dC5MOyl0PXQuTDtyZXR1cm4gdH1mdW5jdGlvbiBoc3QodCxlLG4saSl7dmFyIHI9W251bGwsbnVsbF0sbz1Pc3QucHVzaChyKS0xO3JldHVybiByLmxlZnQ9dCxyLnJpZ2h0PWUsbiYmcHN0KHIsdCxlLG4pLGkmJnBzdChyLGUsdCxpKSxJc3RbdC5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksSXN0W2UuaW5kZXhdLmhhbGZlZGdlcy5wdXNoKG8pLHJ9ZnVuY3Rpb24gZHN0KHQsZSxuKXt2YXIgaT1bZSxuXTtyZXR1cm4gaS5sZWZ0PXQsaX1mdW5jdGlvbiBwc3QodCxlLG4saSl7dFswXXx8dFsxXT90LmxlZnQ9PT1uP3RbMV09aTp0WzBdPWk6KHRbMF09aSx0LmxlZnQ9ZSx0LnJpZ2h0PW4pfWZ1bmN0aW9uIGZzdCh0LGUsbixpLHIpe3ZhciBvLGE9dFswXSxzPXRbMV0sbD1hWzBdLGM9YVsxXSx1PTAsaD0xLGQ9c1swXS1sLHA9c1sxXS1jO2lmKG89ZS1sLGR8fCEobz4wKSl7aWYoby89ZCxkPDApe2lmKG88dSlyZXR1cm47bzxoJiYoaD1vKX1lbHNlIGlmKGQ+MCl7aWYobz5oKXJldHVybjtvPnUmJih1PW8pfWlmKG89aS1sLGR8fCEobzwwKSl7aWYoby89ZCxkPDApe2lmKG8+aClyZXR1cm47bz51JiYodT1vKX1lbHNlIGlmKGQ+MCl7aWYobzx1KXJldHVybjtvPGgmJihoPW8pfWlmKG89bi1jLHB8fCEobz4wKSl7aWYoby89cCxwPDApe2lmKG88dSlyZXR1cm47bzxoJiYoaD1vKX1lbHNlIGlmKHA+MCl7aWYobz5oKXJldHVybjtvPnUmJih1PW8pfWlmKG89ci1jLHB8fCEobzwwKSl7aWYoby89cCxwPDApe2lmKG8+aClyZXR1cm47bz51JiYodT1vKX1lbHNlIGlmKHA+MCl7aWYobzx1KXJldHVybjtvPGgmJihoPW8pfXJldHVybiEodT4wfHxoPDEpfHwodT4wJiYodFswXT1bbCt1KmQsYyt1KnBdKSxoPDEmJih0WzFdPVtsK2gqZCxjK2gqcF0pLCEwKX19fX19ZnVuY3Rpb24gbXN0KHQsZSxuLGkscil7dmFyIG89dFsxXTtpZihvKXJldHVybiEwO3ZhciBhLHMsbD10WzBdLGM9dC5sZWZ0LHU9dC5yaWdodCxoPWNbMF0sZD1jWzFdLHA9dVswXSxmPXVbMV0sbT0oaCtwKS8yO2lmKGY9PT1kKXtpZihtPGV8fG0+PWkpcmV0dXJuO2lmKGg+cCl7aWYobCl7aWYobFsxXT49cilyZXR1cm59ZWxzZSBsPVttLG5dO289W20scl19ZWxzZXtpZihsKXtpZihsWzFdPG4pcmV0dXJufWVsc2UgbD1bbSxyXTtvPVttLG5dfX1lbHNlIGlmKHM9KGQrZikvMi0oYT0oaC1wKS8oZi1kKSkqbSxhPC0xfHxhPjEpaWYoaD5wKXtpZihsKXtpZihsWzFdPj1yKXJldHVybn1lbHNlIGw9WyhuLXMpL2Esbl07bz1bKHItcykvYSxyXX1lbHNle2lmKGwpe2lmKGxbMV08bilyZXR1cm59ZWxzZSBsPVsoci1zKS9hLHJdO289WyhuLXMpL2Esbl19ZWxzZSBpZihkPGYpe2lmKGwpe2lmKGxbMF0+PWkpcmV0dXJufWVsc2UgbD1bZSxhKmUrc107bz1baSxhKmkrc119ZWxzZXtpZihsKXtpZihsWzBdPGUpcmV0dXJufWVsc2UgbD1baSxhKmkrc107bz1bZSxhKmUrc119cmV0dXJuIHRbMF09bCx0WzFdPW8sITB9ZnVuY3Rpb24gZ3N0KHQsZSl7dmFyIG49dC5zaXRlLGk9ZS5sZWZ0LHI9ZS5yaWdodDtyZXR1cm4gbj09PXImJihyPWksaT1uKSxyP01hdGguYXRhbjIoclsxXS1pWzFdLHJbMF0taVswXSk6KG49PT1pPyhpPWVbMV0scj1lWzBdKTooaT1lWzBdLHI9ZVsxXSksTWF0aC5hdGFuMihpWzBdLXJbMF0sclsxXS1pWzFdKSl9ZnVuY3Rpb24gX3N0KHQsZSl7cmV0dXJuIGVbKyhlLmxlZnQhPT10LnNpdGUpXX1mdW5jdGlvbiB5c3QodCxlKXtyZXR1cm4gZVsrKGUubGVmdD09PXQuc2l0ZSldfWFzdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmFzdCxpbnNlcnQ6ZnVuY3Rpb24odCxlKXt2YXIgbixpLHI7aWYodCl7aWYoZS5QPXQsZS5OPXQuTix0Lk4mJih0Lk4uUD1lKSx0Lk49ZSx0LlIpe2Zvcih0PXQuUjt0Lkw7KXQ9dC5MO3QuTD1lfWVsc2UgdC5SPWU7bj10fWVsc2UgdGhpcy5fPyh0PXVzdCh0aGlzLl8pLGUuUD1udWxsLGUuTj10LHQuUD10Lkw9ZSxuPXQpOihlLlA9ZS5OPW51bGwsdGhpcy5fPWUsbj1udWxsKTtmb3IoZS5MPWUuUj1udWxsLGUuVT1uLGUuQz0hMCx0PWU7biYmbi5DOyluPT09KGk9bi5VKS5MPyhyPWkuUikmJnIuQz8obi5DPXIuQz0hMSxpLkM9ITAsdD1pKToodD09PW4uUiYmKGxzdCh0aGlzLG4pLG49KHQ9bikuVSksbi5DPSExLGkuQz0hMCxjc3QodGhpcyxpKSk6KHI9aS5MKSYmci5DPyhuLkM9ci5DPSExLGkuQz0hMCx0PWkpOih0PT09bi5MJiYoY3N0KHRoaXMsbiksbj0odD1uKS5VKSxuLkM9ITEsaS5DPSEwLGxzdCh0aGlzLGkpKSxuPXQuVTt0aGlzLl8uQz0hMX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3QuTiYmKHQuTi5QPXQuUCksdC5QJiYodC5QLk49dC5OKSx0Lk49dC5QPW51bGw7dmFyIGUsbixpLHI9dC5VLG89dC5MLGE9dC5SO2lmKG49bz9hP3VzdChhKTpvOmEscj9yLkw9PT10P3IuTD1uOnIuUj1uOnRoaXMuXz1uLG8mJmE/KGk9bi5DLG4uQz10LkMsbi5MPW8sby5VPW4sbiE9PWE/KHI9bi5VLG4uVT10LlUsci5MPXQ9bi5SLG4uUj1hLGEuVT1uKToobi5VPXIscj1uLHQ9bi5SKSk6KGk9dC5DLHQ9biksdCYmKHQuVT1yKSwhaSlpZih0JiZ0LkMpdC5DPSExO2Vsc2V7ZG97aWYodD09PXRoaXMuXylicmVhaztpZih0PT09ci5MKXtpZigoZT1yLlIpLkMmJihlLkM9ITEsci5DPSEwLGxzdCh0aGlzLHIpLGU9ci5SKSxlLkwmJmUuTC5DfHxlLlImJmUuUi5DKXtlLlImJmUuUi5DfHwoZS5MLkM9ITEsZS5DPSEwLGNzdCh0aGlzLGUpLGU9ci5SKSxlLkM9ci5DLHIuQz1lLlIuQz0hMSxsc3QodGhpcyxyKSx0PXRoaXMuXzticmVha319ZWxzZSBpZigoZT1yLkwpLkMmJihlLkM9ITEsci5DPSEwLGNzdCh0aGlzLHIpLGU9ci5MKSxlLkwmJmUuTC5DfHxlLlImJmUuUi5DKXtlLkwmJmUuTC5DfHwoZS5SLkM9ITEsZS5DPSEwLGxzdCh0aGlzLGUpLGU9ci5MKSxlLkM9ci5DLHIuQz1lLkwuQz0hMSxjc3QodGhpcyxyKSx0PXRoaXMuXzticmVha31lLkM9ITAsdD1yLHI9ci5VfXdoaWxlKCF0LkMpO3QmJih0LkM9ITEpfX19O3ZhciB2c3QsYnN0PVtdO2Z1bmN0aW9uIHhzdCgpe3NzdCh0aGlzKSx0aGlzLng9dGhpcy55PXRoaXMuYXJjPXRoaXMuc2l0ZT10aGlzLmN5PW51bGx9ZnVuY3Rpb24gd3N0KHQpe3ZhciBlPXQuUCxuPXQuTjtpZihlJiZuKXt2YXIgaT1lLnNpdGUscj10LnNpdGUsbz1uLnNpdGU7aWYoaSE9PW8pe3ZhciBhPXJbMF0scz1yWzFdLGw9aVswXS1hLGM9aVsxXS1zLHU9b1swXS1hLGg9b1sxXS1zLGQ9MioobCpoLWMqdSk7aWYoIShkPj0tRHN0KSl7dmFyIHA9bCpsK2MqYyxmPXUqdStoKmgsbT0oaCpwLWMqZikvZCxnPShsKmYtdSpwKS9kLF89YnN0LnBvcCgpfHxuZXcgeHN0O18uYXJjPXQsXy5zaXRlPXIsXy54PW0rYSxfLnk9KF8uY3k9ZytzKStNYXRoLnNxcnQobSptK2cqZyksdC5jaXJjbGU9Xztmb3IodmFyIHk9bnVsbCx2PVJzdC5fO3Y7KWlmKF8ueTx2Lnl8fF8ueT09PXYueSYmXy54PD12Lngpe2lmKCF2Lkwpe3k9di5QO2JyZWFrfXY9di5MfWVsc2V7aWYoIXYuUil7eT12O2JyZWFrfXY9di5SfVJzdC5pbnNlcnQoeSxfKSx5fHwodnN0PV8pfX19fWZ1bmN0aW9uIFNzdCh0KXt2YXIgZT10LmNpcmNsZTtlJiYoZS5QfHwodnN0PWUuTiksUnN0LnJlbW92ZShlKSxic3QucHVzaChlKSxzc3QoZSksdC5jaXJjbGU9bnVsbCl9dmFyIE1zdD1bXTtmdW5jdGlvbiBFc3QoKXtzc3QodGhpcyksdGhpcy5lZGdlPXRoaXMuc2l0ZT10aGlzLmNpcmNsZT1udWxsfWZ1bmN0aW9uIFRzdCh0KXt2YXIgZT1Nc3QucG9wKCl8fG5ldyBFc3Q7cmV0dXJuIGUuc2l0ZT10LGV9ZnVuY3Rpb24gQ3N0KHQpe1NzdCh0KSxOc3QucmVtb3ZlKHQpLE1zdC5wdXNoKHQpLHNzdCh0KX1mdW5jdGlvbiBBc3QodCl7dmFyIGU9dC5jaXJjbGUsbj1lLngsaT1lLmN5LHI9W24saV0sbz10LlAsYT10Lk4scz1bdF07Q3N0KHQpO2Zvcih2YXIgbD1vO2wuY2lyY2xlJiZNYXRoLmFicyhuLWwuY2lyY2xlLngpPHpzdCYmTWF0aC5hYnMoaS1sLmNpcmNsZS5jeSk8enN0OylvPWwuUCxzLnVuc2hpZnQobCksQ3N0KGwpLGw9bztzLnVuc2hpZnQobCksU3N0KGwpO2Zvcih2YXIgYz1hO2MuY2lyY2xlJiZNYXRoLmFicyhuLWMuY2lyY2xlLngpPHpzdCYmTWF0aC5hYnMoaS1jLmNpcmNsZS5jeSk8enN0OylhPWMuTixzLnB1c2goYyksQ3N0KGMpLGM9YTtzLnB1c2goYyksU3N0KGMpO3ZhciB1LGg9cy5sZW5ndGg7Zm9yKHU9MTt1PGg7Kyt1KXBzdCgoYz1zW3VdKS5lZGdlLChsPXNbdS0xXSkuc2l0ZSxjLnNpdGUscik7KGM9c1toLTFdKS5lZGdlPWhzdCgobD1zWzBdKS5zaXRlLGMuc2l0ZSxudWxsLHIpLHdzdChsKSx3c3QoYyl9ZnVuY3Rpb24ga3N0KHQpe2Zvcih2YXIgZSxuLGkscixvPXRbMF0sYT10WzFdLHM9TnN0Ll87czspaWYoKGk9THN0KHMsYSktbyk+enN0KXM9cy5MO2Vsc2V7aWYoISgocj1vLVBzdChzLGEpKT56c3QpKXtpPi16c3Q/KGU9cy5QLG49cyk6cj4tenN0PyhlPXMsbj1zLk4pOmU9bj1zO2JyZWFrfWlmKCFzLlIpe2U9czticmVha31zPXMuUn0hKGZ1bmN0aW9uIGwodCl7SXN0W3QuaW5kZXhdPXtzaXRlOnQsaGFsZmVkZ2VzOltdfX0pKHQpO3ZhciBjPVRzdCh0KTtpZihOc3QuaW5zZXJ0KGUsYyksZXx8bil7aWYoZT09PW4pcmV0dXJuIFNzdChlKSxuPVRzdChlLnNpdGUpLE5zdC5pbnNlcnQoYyxuKSxjLmVkZ2U9bi5lZGdlPWhzdChlLnNpdGUsYy5zaXRlKSx3c3QoZSksdm9pZCB3c3Qobik7aWYobil7U3N0KGUpLFNzdChuKTt2YXIgdT1lLnNpdGUsaD11WzBdLGQ9dVsxXSxwPXRbMF0taCxmPXRbMV0tZCxtPW4uc2l0ZSxnPW1bMF0taCxfPW1bMV0tZCx5PTIqKHAqXy1mKmcpLHY9cCpwK2YqZixiPWcqZytfKl8seD1bKF8qdi1mKmIpL3kraCwocCpiLWcqdikveStkXTtwc3Qobi5lZGdlLHUsbSx4KSxjLmVkZ2U9aHN0KHUsdCxudWxsLHgpLG4uZWRnZT1oc3QodCxtLG51bGwseCksd3N0KGUpLHdzdChuKX1lbHNlIGMuZWRnZT1oc3QoZS5zaXRlLGMuc2l0ZSl9fWZ1bmN0aW9uIExzdCh0LGUpe3ZhciBuPXQuc2l0ZSxpPW5bMF0scj1uWzFdLG89ci1lO2lmKCFvKXJldHVybiBpO3ZhciBhPXQuUDtpZighYSlyZXR1cm4tMS8wO3ZhciBzPShuPWEuc2l0ZSlbMF0sbD1uWzFdLGM9bC1lO2lmKCFjKXJldHVybiBzO3ZhciB1PXMtaSxoPTEvby0xL2MsZD11L2M7cmV0dXJuIGg/KC1kK01hdGguc3FydChkKmQtMipoKih1KnUvKC0yKmMpLWwrYy8yK3Itby8yKSkpL2graTooaStzKS8yfWZ1bmN0aW9uIFBzdCh0LGUpe3ZhciBuPXQuTjtpZihuKXJldHVybiBMc3QobixlKTt2YXIgaT10LnNpdGU7cmV0dXJuIGlbMV09PT1lP2lbMF06MS8wfXZhciBOc3QsSXN0LFJzdCxPc3QsenN0PTFlLTYsRHN0PTFlLTEyO2Z1bmN0aW9uIEJzdCh0LGUsbil7cmV0dXJuKHRbMF0tblswXSkqKGVbMV0tdFsxXSktKHRbMF0tZVswXSkqKG5bMV0tdFsxXSl9ZnVuY3Rpb24gSHN0KHQsZSl7cmV0dXJuIGVbMV0tdFsxXXx8ZVswXS10WzBdfWZ1bmN0aW9uIEZzdCh0LGUpe3ZhciBuLGkscixvPXQuc29ydChIc3QpLnBvcCgpO2ZvcihPc3Q9W10sSXN0PW5ldyBBcnJheSh0Lmxlbmd0aCksTnN0PW5ldyBhc3QsUnN0PW5ldyBhc3Q7OylpZihyPXZzdCxvJiYoIXJ8fG9bMV08ci55fHxvWzFdPT09ci55JiZvWzBdPHIueCkpb1swXT09PW4mJm9bMV09PT1pfHwoa3N0KG8pLG49b1swXSxpPW9bMV0pLG89dC5wb3AoKTtlbHNle2lmKCFyKWJyZWFrO0FzdChyLmFyYyl9aWYoKGZ1bmN0aW9uIGEoKXtmb3IodmFyIHQsZSxuLGkscj0wLG89SXN0Lmxlbmd0aDtyPG87KytyKWlmKCh0PUlzdFtyXSkmJihpPShlPXQuaGFsZmVkZ2VzKS5sZW5ndGgpKXt2YXIgYT1uZXcgQXJyYXkoaSkscz1uZXcgQXJyYXkoaSk7Zm9yKG49MDtuPGk7KytuKWFbbl09bixzW25dPWdzdCh0LE9zdFtlW25dXSk7Zm9yKGEuc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gc1tlXS1zW3RdfSkpLG49MDtuPGk7KytuKXNbbl09ZVthW25dXTtmb3Iobj0wO248aTsrK24pZVtuXT1zW25dfX0pKCksZSl7dmFyIHM9K2VbMF1bMF0sbD0rZVswXVsxXSxjPStlWzFdWzBdLHU9K2VbMV1bMV07IShmdW5jdGlvbiBoKHQsZSxuLGkpe2Zvcih2YXIgcixvPU9zdC5sZW5ndGg7by0tOyltc3Qocj1Pc3Rbb10sdCxlLG4saSkmJmZzdChyLHQsZSxuLGkpJiYoTWF0aC5hYnMoclswXVswXS1yWzFdWzBdKT56c3R8fE1hdGguYWJzKHJbMF1bMV0tclsxXVsxXSk+enN0KXx8ZGVsZXRlIE9zdFtvXX0pKHMsbCxjLHUpLChmdW5jdGlvbiBkKHQsZSxuLGkpe3ZhciByLG8sYSxzLGwsYyx1LGgsZCxwLGYsbSxnPUlzdC5sZW5ndGgsXz0hMDtmb3Iocj0wO3I8ZzsrK3IpaWYobz1Jc3Rbcl0pe2ZvcihhPW8uc2l0ZSxzPShsPW8uaGFsZmVkZ2VzKS5sZW5ndGg7cy0tOylPc3RbbFtzXV18fGwuc3BsaWNlKHMsMSk7Zm9yKHM9MCxjPWwubGVuZ3RoO3M8YzspZj0ocD15c3QobyxPc3RbbFtzXV0pKVswXSxtPXBbMV0saD0odT1fc3QobyxPc3RbbFsrK3MlY11dKSlbMF0sZD11WzFdLChNYXRoLmFicyhmLWgpPnpzdHx8TWF0aC5hYnMobS1kKT56c3QpJiYobC5zcGxpY2UocywwLE9zdC5wdXNoKGRzdChhLHAsTWF0aC5hYnMoZi10KTx6c3QmJmktbT56c3Q/W3QsTWF0aC5hYnMoaC10KTx6c3Q/ZDppXTpNYXRoLmFicyhtLWkpPHpzdCYmbi1mPnpzdD9bTWF0aC5hYnMoZC1pKTx6c3Q/aDpuLGldOk1hdGguYWJzKGYtbik8enN0JiZtLWU+enN0P1tuLE1hdGguYWJzKGgtbik8enN0P2Q6ZV06TWF0aC5hYnMobS1lKTx6c3QmJmYtdD56c3Q/W01hdGguYWJzKGQtZSk8enN0P2g6dCxlXTpudWxsKSktMSksKytjKTtjJiYoXz0hMSl9aWYoXyl7dmFyIHksdixiLHg9MS8wO2ZvcihyPTAsXz1udWxsO3I8ZzsrK3IpKG89SXN0W3JdKSYmKGI9KHk9KGE9by5zaXRlKVswXS10KSp5Kyh2PWFbMV0tZSkqdik8eCYmKHg9YixfPW8pO2lmKF8pe3ZhciB3PVt0LGVdLFM9W3QsaV0sTT1bbixpXSxFPVtuLGVdO18uaGFsZmVkZ2VzLnB1c2goT3N0LnB1c2goZHN0KGE9Xy5zaXRlLHcsUykpLTEsT3N0LnB1c2goZHN0KGEsUyxNKSktMSxPc3QucHVzaChkc3QoYSxNLEUpKS0xLE9zdC5wdXNoKGRzdChhLEUsdykpLTEpfX1mb3Iocj0wO3I8ZzsrK3IpKG89SXN0W3JdKSYmKG8uaGFsZmVkZ2VzLmxlbmd0aHx8ZGVsZXRlIElzdFtyXSl9KShzLGwsYyx1KX10aGlzLmVkZ2VzPU9zdCx0aGlzLmNlbGxzPUlzdCxOc3Q9UnN0PU9zdD1Jc3Q9bnVsbH1Gc3QucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpGc3QscG9seWdvbnM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVkZ2VzO3JldHVybiB0aGlzLmNlbGxzLm1hcCgoZnVuY3Rpb24oZSl7dmFyIG49ZS5oYWxmZWRnZXMubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gX3N0KGUsdFtuXSl9KSk7cmV0dXJuIG4uZGF0YT1lLnNpdGUuZGF0YSxufSkpfSx0cmlhbmdsZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXSxlPXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMuZm9yRWFjaCgoZnVuY3Rpb24obixpKXtpZihvPShyPW4uaGFsZmVkZ2VzKS5sZW5ndGgpZm9yKHZhciByLG8sYSxzPW4uc2l0ZSxsPS0xLGM9ZVtyW28tMV1dLHU9Yy5sZWZ0PT09cz9jLnJpZ2h0OmMubGVmdDsrK2w8bzspYT11LHU9KGM9ZVtyW2xdXSkubGVmdD09PXM/Yy5yaWdodDpjLmxlZnQsYSYmdSYmaTxhLmluZGV4JiZpPHUuaW5kZXgmJkJzdChzLGEsdSk8MCYmdC5wdXNoKFtzLmRhdGEsYS5kYXRhLHUuZGF0YV0pfSkpLHR9LGxpbmtzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZXMuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5yaWdodH0pKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybntzb3VyY2U6dC5sZWZ0LmRhdGEsdGFyZ2V0OnQucmlnaHQuZGF0YX19KSl9LGZpbmQ6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaSxyLG89dGhpcyxhPW8uX2ZvdW5kfHwwLHM9by5jZWxscy5sZW5ndGg7IShyPW8uY2VsbHNbYV0pOylpZigrK2E+PXMpcmV0dXJuIG51bGw7dmFyIGw9dC1yLnNpdGVbMF0sYz1lLXIuc2l0ZVsxXSx1PWwqbCtjKmM7ZG97cj1vLmNlbGxzW2k9YV0sYT1udWxsLHIuaGFsZmVkZ2VzLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBpPW8uZWRnZXNbbl0scz1pLmxlZnQ7aWYocyE9PXIuc2l0ZSYmc3x8KHM9aS5yaWdodCkpe3ZhciBsPXQtc1swXSxjPWUtc1sxXSxoPWwqbCtjKmM7aDx1JiYodT1oLGE9cy5pbmRleCl9fSkpfXdoaWxlKG51bGwhPT1hKTtyZXR1cm4gby5fZm91bmQ9aSxudWxsPT1ufHx1PD1uKm4/ci5zaXRlOm51bGx9fTt2YXIgVnN0PXt2YWx1ZTpmdW5jdGlvbigpe319O2Z1bmN0aW9uIFVzdCgpe2Zvcih2YXIgdCxlPTAsbj1hcmd1bWVudHMubGVuZ3RoLGk9e307ZTxuOysrZSl7aWYoISh0PWFyZ3VtZW50c1tlXSsiIil8fHQgaW4gaXx8L1tccy5dLy50ZXN0KHQpKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO2lbdF09W119cmV0dXJuIG5ldyBqc3QoaSl9ZnVuY3Rpb24ganN0KHQpe3RoaXMuXz10fWZ1bmN0aW9uIEdzdCh0LGUpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBuPSIiLGk9dC5pbmRleE9mKCIuIik7aWYoaT49MCYmKG49dC5zbGljZShpKzEpLHQ9dC5zbGljZSgwLGkpKSx0JiYhZS5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtyZXR1cm57dHlwZTp0LG5hbWU6bn19KSl9ZnVuY3Rpb24gV3N0KHQsZSl7Zm9yKHZhciBuLGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpaWYoKG49dFtpXSkubmFtZT09PWUpcmV0dXJuIG4udmFsdWV9ZnVuY3Rpb24gcXN0KHQsZSxuKXtmb3IodmFyIGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpaWYodFtpXS5uYW1lPT09ZSl7dFtpXT1Wc3QsdD10LnNsaWNlKDAsaSkuY29uY2F0KHQuc2xpY2UoaSsxKSk7YnJlYWt9cmV0dXJuIG51bGwhPW4mJnQucHVzaCh7bmFtZTplLHZhbHVlOm59KSx0fWpzdC5wcm90b3R5cGU9VXN0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6anN0LG9uOmZ1bmN0aW9uKHQsZSl7dmFyIG4saT10aGlzLl8scj1Hc3QodCsiIixpKSxvPS0xLGE9ci5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrZSk7Zm9yKDsrK288YTspaWYobj0odD1yW29dKS50eXBlKWlbbl09cXN0KGlbbl0sdC5uYW1lLGUpO2Vsc2UgaWYobnVsbD09ZSlmb3IobiBpbiBpKWlbbl09cXN0KGlbbl0sdC5uYW1lLG51bGwpO3JldHVybiB0aGlzfWZvcig7KytvPGE7KWlmKChuPSh0PXJbb10pLnR5cGUpJiYobj1Xc3QoaVtuXSx0Lm5hbWUpKSlyZXR1cm4gbn0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LGU9dGhpcy5fO2Zvcih2YXIgbiBpbiBlKXRbbl09ZVtuXS5zbGljZSgpO3JldHVybiBuZXcganN0KHQpfSxjYWxsOmZ1bmN0aW9uKHQsZSl7aWYoKG49YXJndW1lbnRzLmxlbmd0aC0yKT4wKWZvcih2YXIgbixpLHI9bmV3IEFycmF5KG4pLG89MDtvPG47KytvKXJbb109YXJndW1lbnRzW28rMl07aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3Iobz0wLG49KGk9dGhpcy5fW3RdKS5sZW5ndGg7bzxuOysrbylpW29dLnZhbHVlLmFwcGx5KGUscil9LGFwcGx5OmZ1bmN0aW9uKHQsZSxuKXtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2Zvcih2YXIgaT10aGlzLl9bdF0scj0wLG89aS5sZW5ndGg7cjxvOysrcilpW3JdLnZhbHVlLmFwcGx5KGUsbil9fTt2YXIgWXN0PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixYc3Q9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOllzdCx4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyJ9O2Z1bmN0aW9uICRzdCh0KXt2YXIgZT10Kz0iIixuPWUuaW5kZXhPZigiOiIpO3JldHVybiBuPj0wJiYieG1sbnMiIT09KGU9dC5zbGljZSgwLG4pKSYmKHQ9dC5zbGljZShuKzEpKSxYc3QuaGFzT3duUHJvcGVydHkoZSk/e3NwYWNlOlhzdFtlXSxsb2NhbDp0fTp0fWZ1bmN0aW9uIEtzdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLm93bmVyRG9jdW1lbnQsbj10aGlzLm5hbWVzcGFjZVVSSTtyZXR1cm4gbj09PVlzdCYmZS5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJPT09WXN0P2UuY3JlYXRlRWxlbWVudCh0KTplLmNyZWF0ZUVsZW1lbnROUyhuLHQpfX1mdW5jdGlvbiBac3QodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gSnN0KHQpe3ZhciBlPSRzdCh0KTtyZXR1cm4oZS5sb2NhbD9ac3Q6S3N0KShlKX1mdW5jdGlvbiBRc3QoKXt9ZnVuY3Rpb24gdGx0KHQpe3JldHVybiBudWxsPT10P1FzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IodCl9fWZ1bmN0aW9uIGVsdCgpe3JldHVybltdfWZ1bmN0aW9uIG5sdCh0KXtyZXR1cm4gbnVsbD09dD9lbHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHQpfX1mdW5jdGlvbiBpbHQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2hlcyh0KX19ZnVuY3Rpb24gcmx0KHQpe3JldHVybiBuZXcgQXJyYXkodC5sZW5ndGgpfWZ1bmN0aW9uIG9sdCh0LGUpe3RoaXMub3duZXJEb2N1bWVudD10Lm93bmVyRG9jdW1lbnQsdGhpcy5uYW1lc3BhY2VVUkk9dC5uYW1lc3BhY2VVUkksdGhpcy5fbmV4dD1udWxsLHRoaXMuX3BhcmVudD10LHRoaXMuX19kYXRhX189ZX1mdW5jdGlvbiBhbHQodCxlLG4saSxyLG8pe2Zvcih2YXIgYSxzPTAsbD1lLmxlbmd0aCxjPW8ubGVuZ3RoO3M8YzsrK3MpKGE9ZVtzXSk/KGEuX19kYXRhX189b1tzXSxpW3NdPWEpOm5bc109bmV3IG9sdCh0LG9bc10pO2Zvcig7czxsOysrcykoYT1lW3NdKSYmKHJbc109YSl9ZnVuY3Rpb24gc2x0KHQsZSxuLGkscixvLGEpe3ZhciBzLGwsYyx1PXt9LGg9ZS5sZW5ndGgsZD1vLmxlbmd0aCxwPW5ldyBBcnJheShoKTtmb3Iocz0wO3M8aDsrK3MpKGw9ZVtzXSkmJihwW3NdPWM9IiQiK2EuY2FsbChsLGwuX19kYXRhX18scyxlKSxjIGluIHU/cltzXT1sOnVbY109bCk7Zm9yKHM9MDtzPGQ7KytzKShsPXVbYz0iJCIrYS5jYWxsKHQsb1tzXSxzLG8pXSk/KGlbc109bCxsLl9fZGF0YV9fPW9bc10sdVtjXT1udWxsKTpuW3NdPW5ldyBvbHQodCxvW3NdKTtmb3Iocz0wO3M8aDsrK3MpKGw9ZVtzXSkmJnVbcFtzXV09PT1sJiYocltzXT1sKX1mdW5jdGlvbiBsbHQodCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOnQ+PWU/MDpOYU59ZnVuY3Rpb24gY2x0KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX1mdW5jdGlvbiB1bHQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBobHQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZSh0LGUpfX1mdW5jdGlvbiBkbHQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxlKX19ZnVuY3Rpb24gcGx0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj90aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KTp0aGlzLnNldEF0dHJpYnV0ZSh0LG4pfX1mdW5jdGlvbiBmbHQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTp0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxuKX19ZnVuY3Rpb24gbWx0KHQpe3JldHVybiB0Lm93bmVyRG9jdW1lbnQmJnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8dC5kb2N1bWVudCYmdHx8dC5kZWZhdWx0Vmlld31mdW5jdGlvbiBnbHQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KX19ZnVuY3Rpb24gX2x0KHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsZSxuKX19ZnVuY3Rpb24geWx0KHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1pP3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCk6dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LGksbil9fWZ1bmN0aW9uIHZsdCh0LGUpe3JldHVybiB0LnN0eWxlLmdldFByb3BlcnR5VmFsdWUoZSl8fG1sdCh0KS5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShlKX1mdW5jdGlvbiBibHQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbdF19fWZ1bmN0aW9uIHhsdCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXNbdF09ZX19ZnVuY3Rpb24gd2x0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj9kZWxldGUgdGhpc1t0XTp0aGlzW3RdPW59fWZ1bmN0aW9uIFNsdCh0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLyl9ZnVuY3Rpb24gTWx0KHQpe3JldHVybiB0LmNsYXNzTGlzdHx8bmV3IEVsdCh0KX1mdW5jdGlvbiBFbHQodCl7dGhpcy5fbm9kZT10LHRoaXMuX25hbWVzPVNsdCh0LmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfWZ1bmN0aW9uIFRsdCh0LGUpe2Zvcih2YXIgbj1NbHQodCksaT0tMSxyPWUubGVuZ3RoOysraTxyOyluLmFkZChlW2ldKX1mdW5jdGlvbiBDbHQodCxlKXtmb3IodmFyIG49TWx0KHQpLGk9LTEscj1lLmxlbmd0aDsrK2k8cjspbi5yZW1vdmUoZVtpXSl9ZnVuY3Rpb24gQWx0KHQpe3JldHVybiBmdW5jdGlvbigpe1RsdCh0aGlzLHQpfX1mdW5jdGlvbiBrbHQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7Q2x0KHRoaXMsdCl9fWZ1bmN0aW9uIExsdCh0LGUpe3JldHVybiBmdW5jdGlvbigpeyhlLmFwcGx5KHRoaXMsYXJndW1lbnRzKT9UbHQ6Q2x0KSh0aGlzLHQpfX1mdW5jdGlvbiBQbHQoKXt0aGlzLnRleHRDb250ZW50PSIifWZ1bmN0aW9uIE5sdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fWZ1bmN0aW9uIElsdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PWU/IiI6ZX19ZnVuY3Rpb24gUmx0KCl7dGhpcy5pbm5lckhUTUw9IiJ9ZnVuY3Rpb24gT2x0KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPXR9fWZ1bmN0aW9uIHpsdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT1lPyIiOmV9fWZ1bmN0aW9uIERsdCgpe3RoaXMubmV4dFNpYmxpbmcmJnRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKX1mdW5jdGlvbiBCbHQoKXt0aGlzLnByZXZpb3VzU2libGluZyYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKX1mdW5jdGlvbiBIbHQoKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBGbHQoKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7dCYmdC5yZW1vdmVDaGlsZCh0aGlzKX1mdW5jdGlvbiBWbHQoKXt2YXIgdD10aGlzLmNsb25lTm9kZSghMSksZT10aGlzLnBhcmVudE5vZGU7cmV0dXJuIGU/ZS5pbnNlcnRCZWZvcmUodCx0aGlzLm5leHRTaWJsaW5nKTp0fWZ1bmN0aW9uIFVsdCgpe3ZhciB0PXRoaXMuY2xvbmVOb2RlKCEwKSxlPXRoaXMucGFyZW50Tm9kZTtyZXR1cm4gZT9lLmluc2VydEJlZm9yZSh0LHRoaXMubmV4dFNpYmxpbmcpOnR9b2x0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6b2x0LGFwcGVuZENoaWxkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsdGhpcy5fbmV4dCl9LGluc2VydEJlZm9yZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsZSl9LHF1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHQpfSxxdWVyeVNlbGVjdG9yQWxsOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbCh0KX19LEVsdC5wcm90b3R5cGU9e2FkZDpmdW5jdGlvbih0KXt0aGlzLl9uYW1lcy5pbmRleE9mKHQpPDAmJih0aGlzLl9uYW1lcy5wdXNoKHQpLHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5fbmFtZXMuam9pbigiICIpKSl9LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9uYW1lcy5pbmRleE9mKHQpO2U+PTAmJih0aGlzLl9uYW1lcy5zcGxpY2UoZSwxKSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxjb250YWluczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZih0KT49MH19O3ZhciBqbHQ9e30sR2x0PW51bGw7ZnVuY3Rpb24gV2x0KHQsZSxuKXtyZXR1cm4gdD1xbHQodCxlLG4pLGZ1bmN0aW9uKGUpe3ZhciBuPWUucmVsYXRlZFRhcmdldDtuJiYobj09PXRoaXN8fDgmbi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzKSl8fHQuY2FsbCh0aGlzLGUpfX1mdW5jdGlvbiBxbHQodCxlLG4pe3JldHVybiBmdW5jdGlvbihpKXt2YXIgcj1HbHQ7R2x0PWk7dHJ5e3QuY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZSxuKX1maW5hbGx5e0dsdD1yfX19ZnVuY3Rpb24gWWx0KHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlPSIiLG49dC5pbmRleE9mKCIuIik7cmV0dXJuIG4+PTAmJihlPXQuc2xpY2UobisxKSx0PXQuc2xpY2UoMCxuKSkse3R5cGU6dCxuYW1lOmV9fSkpfWZ1bmN0aW9uIFhsdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9fb247aWYoZSl7Zm9yKHZhciBuLGk9MCxyPS0xLG89ZS5sZW5ndGg7aTxvOysraSluPWVbaV0sdC50eXBlJiZuLnR5cGUhPT10LnR5cGV8fG4ubmFtZSE9PXQubmFtZT9lWysrcl09bjp0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobi50eXBlLG4ubGlzdGVuZXIsbi5jYXB0dXJlKTsrK3I/ZS5sZW5ndGg9cjpkZWxldGUgdGhpcy5fX29ufX19ZnVuY3Rpb24gJGx0KHQsZSxuKXt2YXIgaT1qbHQuaGFzT3duUHJvcGVydHkodC50eXBlKT9XbHQ6cWx0O3JldHVybiBmdW5jdGlvbihyLG8sYSl7dmFyIHMsbD10aGlzLl9fb24sYz1pKGUsbyxhKTtpZihsKWZvcih2YXIgdT0wLGg9bC5sZW5ndGg7dTxoOysrdSlpZigocz1sW3VdKS50eXBlPT09dC50eXBlJiZzLm5hbWU9PT10Lm5hbWUpcmV0dXJuIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihzLnR5cGUscy5saXN0ZW5lcixzLmNhcHR1cmUpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihzLnR5cGUscy5saXN0ZW5lcj1jLHMuY2FwdHVyZT1uKSx2b2lkKHMudmFsdWU9ZSk7dGhpcy5hZGRFdmVudExpc3RlbmVyKHQudHlwZSxjLG4pLHM9e3R5cGU6dC50eXBlLG5hbWU6dC5uYW1lLHZhbHVlOmUsbGlzdGVuZXI6YyxjYXB0dXJlOm59LGw/bC5wdXNoKHMpOnRoaXMuX19vbj1bc119fWZ1bmN0aW9uIEtsdCh0LGUsbil7dmFyIGk9bWx0KHQpLHI9aS5DdXN0b21FdmVudDsiZnVuY3Rpb24iPT10eXBlb2Ygcj9yPW5ldyByKGUsbik6KHI9aS5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxuPyhyLmluaXRFdmVudChlLG4uYnViYmxlcyxuLmNhbmNlbGFibGUpLHIuZGV0YWlsPW4uZGV0YWlsKTpyLmluaXRFdmVudChlLCExLCExKSksdC5kaXNwYXRjaEV2ZW50KHIpfWZ1bmN0aW9uIFpsdCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBLbHQodGhpcyx0LGUpfX1mdW5jdGlvbiBKbHQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gS2x0KHRoaXMsdCxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJigib25tb3VzZWVudGVyImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8KGpsdD17bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9KSk7dmFyIFFsdD1bbnVsbF07ZnVuY3Rpb24gdGN0KHQsZSl7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1lfWZ1bmN0aW9uIGVjdCgpe3JldHVybiBuZXcgdGN0KFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sUWx0KX1mdW5jdGlvbiBuY3QodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P25ldyB0Y3QoW1tkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQpXV0sW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pOm5ldyB0Y3QoW1t0XV0sUWx0KX1mdW5jdGlvbiBpY3QoKXtmb3IodmFyIHQsZT1HbHQ7dD1lLnNvdXJjZUV2ZW50OyllPXQ7cmV0dXJuIGV9ZnVuY3Rpb24gcmN0KHQsZSl7dmFyIG49dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYobi5jcmVhdGVTVkdQb2ludCl7dmFyIGk9bi5jcmVhdGVTVkdQb2ludCgpO3JldHVybiBpLng9ZS5jbGllbnRYLGkueT1lLmNsaWVudFksWyhpPWkubWF0cml4VHJhbnNmb3JtKHQuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSkueCxpLnldfXZhciByPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW2UuY2xpZW50WC1yLmxlZnQtdC5jbGllbnRMZWZ0LGUuY2xpZW50WS1yLnRvcC10LmNsaWVudFRvcF19ZnVuY3Rpb24gb2N0KHQpe3ZhciBlPWljdCgpO3JldHVybiBlLmNoYW5nZWRUb3VjaGVzJiYoZT1lLmNoYW5nZWRUb3VjaGVzWzBdKSxyY3QodCxlKX1mdW5jdGlvbiBhY3QodCxlLG4pe2FyZ3VtZW50cy5sZW5ndGg8MyYmKG49ZSxlPWljdCgpLmNoYW5nZWRUb3VjaGVzKTtmb3IodmFyIGkscj0wLG89ZT9lLmxlbmd0aDowO3I8bzsrK3IpaWYoKGk9ZVtyXSkuaWRlbnRpZmllcj09PW4pcmV0dXJuIHJjdCh0LGkpO3JldHVybiBudWxsfWZ1bmN0aW9uIHNjdCgpe0dsdC5wcmV2ZW50RGVmYXVsdCgpLEdsdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBsY3QodCl7dmFyIGU9dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbj1uY3QodCkub24oImRyYWdzdGFydC5kcmFnIixzY3QsITApOyJvbnNlbGVjdHN0YXJ0ImluIGU/bi5vbigic2VsZWN0c3RhcnQuZHJhZyIsc2N0LCEwKTooZS5fX25vc2VsZWN0PWUuc3R5bGUuTW96VXNlclNlbGVjdCxlLnN0eWxlLk1velVzZXJTZWxlY3Q9Im5vbmUiKX1mdW5jdGlvbiBjY3QodCxlKXt2YXIgbj10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxpPW5jdCh0KS5vbigiZHJhZ3N0YXJ0LmRyYWciLG51bGwpO2UmJihpLm9uKCJjbGljay5kcmFnIixzY3QsITApLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aS5vbigiY2xpY2suZHJhZyIsbnVsbCl9KSwwKSksIm9uc2VsZWN0c3RhcnQiaW4gbj9pLm9uKCJzZWxlY3RzdGFydC5kcmFnIixudWxsKToobi5zdHlsZS5Nb3pVc2VyU2VsZWN0PW4uX19ub3NlbGVjdCxkZWxldGUgbi5fX25vc2VsZWN0KX1mdW5jdGlvbiB1Y3QodCxlLG4pe3QucHJvdG90eXBlPWUucHJvdG90eXBlPW4sbi5jb25zdHJ1Y3Rvcj10fWZ1bmN0aW9uIGhjdCh0LGUpe3ZhciBuPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpO2Zvcih2YXIgaSBpbiBlKW5baV09ZVtpXTtyZXR1cm4gbn1mdW5jdGlvbiBkY3QoKXt9dGN0LnByb3RvdHlwZT1lY3QucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp0Y3Qsc2VsZWN0OmZ1bmN0aW9uIHBjdCh0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9dGx0KHQpKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49ZS5sZW5ndGgsaT1uZXcgQXJyYXkobikscj0wO3I8bjsrK3IpZm9yKHZhciBvLGEscz1lW3JdLGw9cy5sZW5ndGgsYz1pW3JdPW5ldyBBcnJheShsKSx1PTA7dTxsOysrdSkobz1zW3VdKSYmKGE9dC5jYWxsKG8sby5fX2RhdGFfXyx1LHMpKSYmKCJfX2RhdGFfXyJpbiBvJiYoYS5fX2RhdGFfXz1vLl9fZGF0YV9fKSxjW3VdPWEpO3JldHVybiBuZXcgdGN0KGksdGhpcy5fcGFyZW50cyl9LHNlbGVjdEFsbDpmdW5jdGlvbiBmY3QodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PW5sdCh0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9W10scj1bXSxvPTA7bzxuOysrbylmb3IodmFyIGEscz1lW29dLGw9cy5sZW5ndGgsYz0wO2M8bDsrK2MpKGE9c1tjXSkmJihpLnB1c2godC5jYWxsKGEsYS5fX2RhdGFfXyxjLHMpKSxyLnB1c2goYSkpO3JldHVybiBuZXcgdGN0KGkscil9LGZpbHRlcjpmdW5jdGlvbiBtY3QodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PWlsdCh0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWZvcih2YXIgbyxhPWVbcl0scz1hLmxlbmd0aCxsPWlbcl09W10sYz0wO2M8czsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmbC5wdXNoKG8pO3JldHVybiBuZXcgdGN0KGksdGhpcy5fcGFyZW50cyl9LGRhdGE6ZnVuY3Rpb24gZ2N0KHQsZSl7aWYoIXQpcmV0dXJuIGY9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSx1PS0xLHRoaXMuZWFjaCgoZnVuY3Rpb24odCl7ZlsrK3VdPXR9KSksZjt2YXIgbj1lP3NsdDphbHQsaT10aGlzLl9wYXJlbnRzLHI9dGhpcy5fZ3JvdXBzOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD0oZnVuY3Rpb24gbyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KSh0KSk7Zm9yKHZhciBhPXIubGVuZ3RoLHM9bmV3IEFycmF5KGEpLGw9bmV3IEFycmF5KGEpLGM9bmV3IEFycmF5KGEpLHU9MDt1PGE7Kyt1KXt2YXIgaD1pW3VdLGQ9clt1XSxwPWQubGVuZ3RoLGY9dC5jYWxsKGgsaCYmaC5fX2RhdGFfXyx1LGkpLG09Zi5sZW5ndGgsZz1sW3VdPW5ldyBBcnJheShtKSxfPXNbdV09bmV3IEFycmF5KG0pO24oaCxkLGcsXyxjW3VdPW5ldyBBcnJheShwKSxmLGUpO2Zvcih2YXIgeSx2LGI9MCx4PTA7YjxtOysrYilpZih5PWdbYl0pe2ZvcihiPj14JiYoeD1iKzEpOyEodj1fW3hdKSYmKyt4PG07KTt5Ll9uZXh0PXZ8fG51bGx9fXJldHVybihzPW5ldyB0Y3QocyxpKSkuX2VudGVyPWwscy5fZXhpdD1jLHN9LGVudGVyOmZ1bmN0aW9uIF9jdCgpe3JldHVybiBuZXcgdGN0KHRoaXMuX2VudGVyfHx0aGlzLl9ncm91cHMubWFwKHJsdCksdGhpcy5fcGFyZW50cyl9LGV4aXQ6ZnVuY3Rpb24geWN0KCl7cmV0dXJuIG5ldyB0Y3QodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChybHQpLHRoaXMuX3BhcmVudHMpfSxqb2luOmZ1bmN0aW9uIHZjdCh0LGUsbil7dmFyIGk9dGhpcy5lbnRlcigpLHI9dGhpcyxvPXRoaXMuZXhpdCgpO3JldHVybiBpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3QoaSk6aS5hcHBlbmQodCsiIiksbnVsbCE9ZSYmKHI9ZShyKSksbnVsbD09bj9vLnJlbW92ZSgpOm4obyksaSYmcj9pLm1lcmdlKHIpLm9yZGVyKCk6cn0sbWVyZ2U6ZnVuY3Rpb24gYmN0KHQpe2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj10Ll9ncm91cHMsaT1lLmxlbmd0aCxyPU1hdGgubWluKGksbi5sZW5ndGgpLG89bmV3IEFycmF5KGkpLGE9MDthPHI7KythKWZvcih2YXIgcyxsPWVbYV0sYz1uW2FdLHU9bC5sZW5ndGgsaD1vW2FdPW5ldyBBcnJheSh1KSxkPTA7ZDx1OysrZCkocz1sW2RdfHxjW2RdKSYmKGhbZF09cyk7Zm9yKDthPGk7KythKW9bYV09ZVthXTtyZXR1cm4gbmV3IHRjdChvLHRoaXMuX3BhcmVudHMpfSxvcmRlcjpmdW5jdGlvbiB4Y3QoKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLGU9LTEsbj10Lmxlbmd0aDsrK2U8bjspZm9yKHZhciBpLHI9dFtlXSxvPXIubGVuZ3RoLTEsYT1yW29dOy0tbz49MDspKGk9cltvXSkmJihhJiY0XmkuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSkmJmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaSxhKSxhPWkpO3JldHVybiB0aGlzfSxzb3J0OmZ1bmN0aW9uIHdjdCh0KXtmdW5jdGlvbiBlKGUsbil7cmV0dXJuIGUmJm4/dChlLl9fZGF0YV9fLG4uX19kYXRhX18pOiFlLSFufXR8fCh0PWxsdCk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxpPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGkpLG89MDtvPGk7KytvKXtmb3IodmFyIGEscz1uW29dLGw9cy5sZW5ndGgsYz1yW29dPW5ldyBBcnJheShsKSx1PTA7dTxsOysrdSkoYT1zW3VdKSYmKGNbdV09YSk7Yy5zb3J0KGUpfXJldHVybiBuZXcgdGN0KHIsdGhpcy5fcGFyZW50cykub3JkZXIoKX0sY2FsbDpmdW5jdGlvbiBTY3QoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGFyZ3VtZW50c1swXT10aGlzLHQuYXBwbHkobnVsbCxhcmd1bWVudHMpLHRoaXN9LG5vZGVzOmZ1bmN0aW9uIE1jdCgpe3ZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSksZT0tMTtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3RbKytlXT10aGlzfSkpLHR9LG5vZGU6ZnVuY3Rpb24gRWN0KCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxlPTAsbj10Lmxlbmd0aDtlPG47KytlKWZvcih2YXIgaT10W2VdLHI9MCxvPWkubGVuZ3RoO3I8bzsrK3Ipe3ZhciBhPWlbcl07aWYoYSlyZXR1cm4gYX1yZXR1cm4gbnVsbH0sc2l6ZTpmdW5jdGlvbiBUY3QoKXt2YXIgdD0wO3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7Kyt0fSkpLHR9LGVtcHR5OmZ1bmN0aW9uIENjdCgpe3JldHVybiF0aGlzLm5vZGUoKX0sZWFjaDpmdW5jdGlvbiBBY3QodCl7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPTAsaT1lLmxlbmd0aDtuPGk7KytuKWZvcih2YXIgcixvPWVbbl0sYT0wLHM9by5sZW5ndGg7YTxzOysrYSkocj1vW2FdKSYmdC5jYWxsKHIsci5fX2RhdGFfXyxhLG8pO3JldHVybiB0aGlzfSxhdHRyOmZ1bmN0aW9uIGtjdCh0LGUpe3ZhciBuPSRzdCh0KTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciBpPXRoaXMubm9kZSgpO3JldHVybiBuLmxvY2FsP2kuZ2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsKTppLmdldEF0dHJpYnV0ZShuKX1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1lP24ubG9jYWw/dWx0OmNsdDoiZnVuY3Rpb24iPT10eXBlb2YgZT9uLmxvY2FsP2ZsdDpwbHQ6bi5sb2NhbD9kbHQ6aGx0KShuLGUpKX0sc3R5bGU6ZnVuY3Rpb24gTGN0KHQsZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09ZT9nbHQ6ImZ1bmN0aW9uIj09dHlwZW9mIGU/eWx0Ol9sdCkodCxlLG51bGw9PW4/IiI6bikpOnZsdCh0aGlzLm5vZGUoKSx0KX0scHJvcGVydHk6ZnVuY3Rpb24gUGN0KHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PWU/Ymx0OiJmdW5jdGlvbiI9PXR5cGVvZiBlP3dsdDp4bHQpKHQsZSkpOnRoaXMubm9kZSgpW3RdfSxjbGFzc2VkOmZ1bmN0aW9uIE5jdCh0LGUpe3ZhciBuPVNsdCh0KyIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgaT1NbHQodGhpcy5ub2RlKCkpLHI9LTEsbz1uLmxlbmd0aDsrK3I8bzspaWYoIWkuY29udGFpbnMobltyXSkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIGU/TGx0OmU/QWx0OmtsdCkobixlKSl9LHRleHQ6ZnVuY3Rpb24gSWN0KHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P1BsdDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/SWx0Ok5sdCkodCkpOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxodG1sOmZ1bmN0aW9uIFJjdCh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9SbHQ6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P3psdDpPbHQpKHQpKTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LHJhaXNlOmZ1bmN0aW9uIE9jdCgpe3JldHVybiB0aGlzLmVhY2goRGx0KX0sbG93ZXI6ZnVuY3Rpb24gemN0KCl7cmV0dXJuIHRoaXMuZWFjaChCbHQpfSxhcHBlbmQ6ZnVuY3Rpb24gRGN0KHQpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SnN0KHQpO3JldHVybiB0aGlzLnNlbGVjdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KSl9LGluc2VydDpmdW5jdGlvbiBCY3QodCxlKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkpzdCh0KSxpPW51bGw9PWU/SGx0OiJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6dGx0KGUpO3JldHVybiB0aGlzLnNlbGVjdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUobi5hcHBseSh0aGlzLGFyZ3VtZW50cyksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSkpfSxyZW1vdmU6ZnVuY3Rpb24gSGN0KCl7cmV0dXJuIHRoaXMuZWFjaChGbHQpfSxjbG9uZTpmdW5jdGlvbiBGY3QodCl7cmV0dXJuIHRoaXMuc2VsZWN0KHQ/VWx0OlZsdCl9LGRhdHVtOmZ1bmN0aW9uIFZjdCh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsdCk6dGhpcy5ub2RlKCkuX19kYXRhX199LG9uOmZ1bmN0aW9uIFVjdCh0LGUsbil7dmFyIGkscixvPVlsdCh0KyIiKSxhPW8ubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7Zm9yKHM9ZT8kbHQ6WGx0LG51bGw9PW4mJihuPSExKSxpPTA7aTxhOysraSl0aGlzLmVhY2gocyhvW2ldLGUsbikpO3JldHVybiB0aGlzfXZhciBzPXRoaXMubm9kZSgpLl9fb247aWYocylmb3IodmFyIGwsYz0wLHU9cy5sZW5ndGg7Yzx1OysrYylmb3IoaT0wLGw9c1tjXTtpPGE7KytpKWlmKChyPW9baV0pLnR5cGU9PT1sLnR5cGUmJnIubmFtZT09PWwubmFtZSlyZXR1cm4gbC52YWx1ZX0sZGlzcGF0Y2g6ZnVuY3Rpb24gamN0KHQsZSl7cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIGU/Smx0OlpsdCkodCxlKSl9fTt2YXIgR2N0PS43LFdjdD0xL0djdCxxY3Q9IlxccyooWystXT9cXGQrKVxccyoiLFljdD0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIixYY3Q9IlxccyooWystXT9cXGQqXFwuP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pJVxccyoiLCRjdD0vXiMoWzAtOWEtZl17Myw4fSkkLyxLY3Q9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW3FjdCxxY3QscWN0XSsiXFwpJCIpLFpjdD1uZXcgUmVnRXhwKCJecmdiXFwoIitbWGN0LFhjdCxYY3RdKyJcXCkkIiksSmN0PW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbcWN0LHFjdCxxY3QsWWN0XSsiXFwpJCIpLFFjdD1uZXcgUmVnRXhwKCJecmdiYVxcKCIrW1hjdCxYY3QsWGN0LFljdF0rIlxcKSQiKSx0dXQ9bmV3IFJlZ0V4cCgiXmhzbFxcKCIrW1ljdCxYY3QsWGN0XSsiXFwpJCIpLGV1dD1uZXcgUmVnRXhwKCJeaHNsYVxcKCIrW1ljdCxYY3QsWGN0LFljdF0rIlxcKSQiKSxudXQ9e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH07ZnVuY3Rpb24gaXV0KCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4KCl9ZnVuY3Rpb24gcnV0KCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCl9ZnVuY3Rpb24gb3V0KHQpe3ZhciBlLG47cmV0dXJuIHQ9KHQrIiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLChlPSRjdC5leGVjKHQpKT8obj1lWzFdLmxlbmd0aCxlPXBhcnNlSW50KGVbMV0sMTYpLDY9PT1uP2F1dChlKTozPT09bj9uZXcgdXV0KGU+PjgmMTV8ZT4+NCYyNDAsZT4+NCYxNXwyNDAmZSwoMTUmZSk8PDR8MTUmZSwxKTo4PT09bj9zdXQoZT4+MjQmMjU1LGU+PjE2JjI1NSxlPj44JjI1NSwoMjU1JmUpLzI1NSk6ND09PW4/c3V0KGU+PjEyJjE1fGU+PjgmMjQwLGU+PjgmMTV8ZT4+NCYyNDAsZT4+NCYxNXwyNDAmZSwoKDE1JmUpPDw0fDE1JmUpLzI1NSk6bnVsbCk6KGU9S2N0LmV4ZWModCkpP25ldyB1dXQoZVsxXSxlWzJdLGVbM10sMSk6KGU9WmN0LmV4ZWModCkpP25ldyB1dXQoMjU1KmVbMV0vMTAwLDI1NSplWzJdLzEwMCwyNTUqZVszXS8xMDAsMSk6KGU9SmN0LmV4ZWModCkpP3N1dChlWzFdLGVbMl0sZVszXSxlWzRdKTooZT1RY3QuZXhlYyh0KSk/c3V0KDI1NSplWzFdLzEwMCwyNTUqZVsyXS8xMDAsMjU1KmVbM10vMTAwLGVbNF0pOihlPXR1dC5leGVjKHQpKT9mdXQoZVsxXSxlWzJdLzEwMCxlWzNdLzEwMCwxKTooZT1ldXQuZXhlYyh0KSk/ZnV0KGVbMV0sZVsyXS8xMDAsZVszXS8xMDAsZVs0XSk6bnV0Lmhhc093blByb3BlcnR5KHQpP2F1dChudXRbdF0pOiJ0cmFuc3BhcmVudCI9PT10P25ldyB1dXQoTmFOLE5hTixOYU4sMCk6bnVsbH1mdW5jdGlvbiBhdXQodCl7cmV0dXJuIG5ldyB1dXQodD4+MTYmMjU1LHQ+PjgmMjU1LDI1NSZ0LDEpfWZ1bmN0aW9uIHN1dCh0LGUsbixpKXtyZXR1cm4gaTw9MCYmKHQ9ZT1uPU5hTiksbmV3IHV1dCh0LGUsbixpKX1mdW5jdGlvbiBsdXQodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBkY3R8fCh0PW91dCh0KSksdD9uZXcgdXV0KCh0PXQucmdiKCkpLnIsdC5nLHQuYix0Lm9wYWNpdHkpOm5ldyB1dXR9ZnVuY3Rpb24gY3V0KHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9sdXQodCk6bmV3IHV1dCh0LGUsbixudWxsPT1pPzE6aSl9ZnVuY3Rpb24gdXV0KHQsZSxuLGkpe3RoaXMucj0rdCx0aGlzLmc9K2UsdGhpcy5iPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiBodXQoKXtyZXR1cm4iIyIrcHV0KHRoaXMucikrcHV0KHRoaXMuZykrcHV0KHRoaXMuYil9ZnVuY3Rpb24gZHV0KCl7dmFyIHQ9dGhpcy5vcGFjaXR5O3JldHVybigxPT09KHQ9aXNOYU4odCk/MTpNYXRoLm1heCgwLE1hdGgubWluKDEsdCkpKT8icmdiKCI6InJnYmEoIikrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLnIpfHwwKSkrIiwgIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMuZyl8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5iKXx8MCkpKygxPT09dD8iKSI6IiwgIit0KyIpIil9ZnVuY3Rpb24gcHV0KHQpe3JldHVybigodD1NYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHQpfHwwKSkpPDE2PyIwIjoiIikrdC50b1N0cmluZygxNil9ZnVuY3Rpb24gZnV0KHQsZSxuLGkpe3JldHVybiBpPD0wP3Q9ZT1uPU5hTjpuPD0wfHxuPj0xP3Q9ZT1OYU46ZTw9MCYmKHQ9TmFOKSxuZXcgZ3V0KHQsZSxuLGkpfWZ1bmN0aW9uIG11dCh0KXtpZih0IGluc3RhbmNlb2YgZ3V0KXJldHVybiBuZXcgZ3V0KHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIGRjdHx8KHQ9b3V0KHQpKSwhdClyZXR1cm4gbmV3IGd1dDtpZih0IGluc3RhbmNlb2YgZ3V0KXJldHVybiB0O3ZhciBlPSh0PXQucmdiKCkpLnIvMjU1LG49dC5nLzI1NSxpPXQuYi8yNTUscj1NYXRoLm1pbihlLG4saSksbz1NYXRoLm1heChlLG4saSksYT1OYU4scz1vLXIsbD0obytyKS8yO3JldHVybiBzPyhhPWU9PT1vPyhuLWkpL3MrNioobjxpKTpuPT09bz8oaS1lKS9zKzI6KGUtbikvcys0LHMvPWw8LjU/bytyOjItby1yLGEqPTYwKTpzPWw+MCYmbDwxPzA6YSxuZXcgZ3V0KGEscyxsLHQub3BhY2l0eSl9ZnVuY3Rpb24gZ3V0KHQsZSxuLGkpe3RoaXMuaD0rdCx0aGlzLnM9K2UsdGhpcy5sPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiBfdXQodCxlLG4pe3JldHVybiAyNTUqKHQ8NjA/ZSsobi1lKSp0LzYwOnQ8MTgwP246dDwyNDA/ZSsobi1lKSooMjQwLXQpLzYwOmUpfWZ1bmN0aW9uIHl1dCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gdnV0KHQsZSl7dmFyIG49ZS10O3JldHVybiBuPyhmdW5jdGlvbiBpKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0K24qZX19KSh0LG4pOnl1dChpc05hTih0KT9lOnQpfXVjdChkY3Qsb3V0LHtjb3B5OmZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLHRoaXMsdCl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKX0saGV4Oml1dCxmb3JtYXRIZXg6aXV0LGZvcm1hdEhzbDpmdW5jdGlvbiBidXQoKXtyZXR1cm4gbXV0KHRoaXMpLmZvcm1hdEhzbCgpfSxmb3JtYXRSZ2I6cnV0LHRvU3RyaW5nOnJ1dH0pLHVjdCh1dXQsY3V0LGhjdChkY3Qse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/V2N0Ok1hdGgucG93KFdjdCx0KSxuZXcgdXV0KHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P0djdDpNYXRoLnBvdyhHY3QsdCksbmV3IHV1dCh0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4tLjU8PXRoaXMuciYmdGhpcy5yPDI1NS41JiYtLjU8PXRoaXMuZyYmdGhpcy5nPDI1NS41JiYtLjU8PXRoaXMuYiYmdGhpcy5iPDI1NS41JiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0saGV4Omh1dCxmb3JtYXRIZXg6aHV0LGZvcm1hdFJnYjpkdXQsdG9TdHJpbmc6ZHV0fSkpLHVjdChndXQsKGZ1bmN0aW9uIHh1dCh0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/bXV0KHQpOm5ldyBndXQodCxlLG4sbnVsbD09aT8xOmkpfSksaGN0KGRjdCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9XY3Q6TWF0aC5wb3coV2N0LHQpLG5ldyBndXQodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9HY3Q6TWF0aC5wb3coR2N0LHQpLG5ldyBndXQodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmglMzYwKzM2MCoodGhpcy5oPDApLGU9aXNOYU4odCl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsbj10aGlzLmwsaT1uKyhuPC41P246MS1uKSplLHI9MipuLWk7cmV0dXJuIG5ldyB1dXQoX3V0KHQ+PTI0MD90LTI0MDp0KzEyMCxyLGkpLF91dCh0LHIsaSksX3V0KHQ8MTIwP3QrMjQwOnQtMTIwLHIsaSksdGhpcy5vcGFjaXR5KX0sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4oMDw9dGhpcy5zJiZ0aGlzLnM8PTF8fGlzTmFOKHRoaXMucykpJiYwPD10aGlzLmwmJnRoaXMubDw9MSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGZvcm1hdEhzbDpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3BhY2l0eTtyZXR1cm4oMT09PSh0PWlzTmFOKHQpPzE6TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSk/ImhzbCgiOiJoc2xhKCIpKyh0aGlzLmh8fDApKyIsICIrMTAwKih0aGlzLnN8fDApKyIlLCAiKzEwMCoodGhpcy5sfHwwKSsiJSIrKDE9PT10PyIpIjoiLCAiK3QrIikiKX19KSk7dmFyIHd1dD0oZnVuY3Rpb24gdChlKXt2YXIgbj0oZnVuY3Rpb24gaSh0KXtyZXR1cm4gMT09KHQ9K3QpP3Z1dDpmdW5jdGlvbihlLG4pe3JldHVybiBuLWU/KGZ1bmN0aW9uIGkodCxlLG4pe3JldHVybiB0PU1hdGgucG93KHQsbiksZT1NYXRoLnBvdyhlLG4pLXQsbj0xL24sZnVuY3Rpb24oaSl7cmV0dXJuIE1hdGgucG93KHQraSplLG4pfX0pKGUsbix0KTp5dXQoaXNOYU4oZSk/bjplKX19KShlKTtmdW5jdGlvbiByKHQsZSl7dmFyIGk9bigodD1jdXQodCkpLnIsKGU9Y3V0KGUpKS5yKSxyPW4odC5nLGUuZyksbz1uKHQuYixlLmIpLGE9dnV0KHQub3BhY2l0eSxlLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5yPWkoZSksdC5nPXIoZSksdC5iPW8oZSksdC5vcGFjaXR5PWEoZSksdCsiIn19cmV0dXJuIHIuZ2FtbWE9dCxyfSkoMSk7ZnVuY3Rpb24gU3V0KHQsZSl7cmV0dXJuIHQ9K3QsZT0rZSxmdW5jdGlvbihuKXtyZXR1cm4gdCooMS1uKStlKm59fXZhciBNdXQ9L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLEV1dD1uZXcgUmVnRXhwKE11dC5zb3VyY2UsImciKTtmdW5jdGlvbiBUdXQodCxlKXt2YXIgbixpLHIsbz1NdXQubGFzdEluZGV4PUV1dC5sYXN0SW5kZXg9MCxhPS0xLHM9W10sbD1bXTtmb3IodCs9IiIsZSs9IiI7KG49TXV0LmV4ZWModCkpJiYoaT1FdXQuZXhlYyhlKSk7KShyPWkuaW5kZXgpPm8mJihyPWUuc2xpY2UobyxyKSxzW2FdP3NbYV0rPXI6c1srK2FdPXIpLChuPW5bMF0pPT09KGk9aVswXSk/c1thXT9zW2FdKz1pOnNbKythXT1pOihzWysrYV09bnVsbCxsLnB1c2goe2k6YSx4OlN1dChuLGkpfSkpLG89RXV0Lmxhc3RJbmRleDtyZXR1cm4gbzxlLmxlbmd0aCYmKHI9ZS5zbGljZShvKSxzW2FdP3NbYV0rPXI6c1srK2FdPXIpLHMubGVuZ3RoPDI/bFswXT8oZnVuY3Rpb24gYyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSkrIiJ9fSkobFswXS54KTooZnVuY3Rpb24gdSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KShlKTooZT1sLmxlbmd0aCxmdW5jdGlvbih0KXtmb3IodmFyIG4saT0wO2k8ZTsrK2kpc1sobj1sW2ldKS5pXT1uLngodCk7cmV0dXJuIHMuam9pbigiIil9KX12YXIgQ3V0LEF1dCxrdXQsTHV0LFB1dD0xODAvTWF0aC5QSSxOdXQ9e3RyYW5zbGF0ZVg6MCx0cmFuc2xhdGVZOjAscm90YXRlOjAsc2tld1g6MCxzY2FsZVg6MSxzY2FsZVk6MX07ZnVuY3Rpb24gSXV0KHQsZSxuLGkscixvKXt2YXIgYSxzLGw7cmV0dXJuKGE9TWF0aC5zcXJ0KHQqdCtlKmUpKSYmKHQvPWEsZS89YSksKGw9dCpuK2UqaSkmJihuLT10KmwsaS09ZSpsKSwocz1NYXRoLnNxcnQobipuK2kqaSkpJiYobi89cyxpLz1zLGwvPXMpLHQqaTxlKm4mJih0PS10LGU9LWUsbD0tbCxhPS1hKSx7dHJhbnNsYXRlWDpyLHRyYW5zbGF0ZVk6byxyb3RhdGU6TWF0aC5hdGFuMihlLHQpKlB1dCxza2V3WDpNYXRoLmF0YW4obCkqUHV0LHNjYWxlWDphLHNjYWxlWTpzfX1mdW5jdGlvbiBSdXQodCxlLG4saSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdC5sZW5ndGg/dC5wb3AoKSsiICI6IiJ9cmV0dXJuIGZ1bmN0aW9uKG8sYSl7dmFyIHM9W10sbD1bXTtyZXR1cm4gbz10KG8pLGE9dChhKSwoZnVuY3Rpb24gYyh0LGkscixvLGEscyl7aWYodCE9PXJ8fGkhPT1vKXt2YXIgbD1hLnB1c2goInRyYW5zbGF0ZSgiLG51bGwsZSxudWxsLG4pO3MucHVzaCh7aTpsLTQseDpTdXQodCxyKX0se2k6bC0yLHg6U3V0KGksbyl9KX1lbHNlKHJ8fG8pJiZhLnB1c2goInRyYW5zbGF0ZSgiK3IrZStvK24pfSkoby50cmFuc2xhdGVYLG8udHJhbnNsYXRlWSxhLnRyYW5zbGF0ZVgsYS50cmFuc2xhdGVZLHMsbCksKGZ1bmN0aW9uIHUodCxlLG4sbyl7dCE9PWU/KHQtZT4xODA/ZSs9MzYwOmUtdD4xODAmJih0Kz0zNjApLG8ucHVzaCh7aTpuLnB1c2gocihuKSsicm90YXRlKCIsbnVsbCxpKS0yLHg6U3V0KHQsZSl9KSk6ZSYmbi5wdXNoKHIobikrInJvdGF0ZSgiK2UraSl9KShvLnJvdGF0ZSxhLnJvdGF0ZSxzLGwpLChmdW5jdGlvbiBoKHQsZSxuLG8pe3QhPT1lP28ucHVzaCh7aTpuLnB1c2gocihuKSsic2tld1goIixudWxsLGkpLTIseDpTdXQodCxlKX0pOmUmJm4ucHVzaChyKG4pKyJza2V3WCgiK2UraSl9KShvLnNrZXdYLGEuc2tld1gscyxsKSwoZnVuY3Rpb24gZCh0LGUsbixpLG8sYSl7aWYodCE9PW58fGUhPT1pKXt2YXIgcz1vLnB1c2gocihvKSsic2NhbGUoIixudWxsLCIsIixudWxsLCIpIik7YS5wdXNoKHtpOnMtNCx4OlN1dCh0LG4pfSx7aTpzLTIseDpTdXQoZSxpKX0pfWVsc2UgMT09PW4mJjE9PT1pfHxvLnB1c2gocihvKSsic2NhbGUoIituKyIsIitpKyIpIil9KShvLnNjYWxlWCxvLnNjYWxlWSxhLnNjYWxlWCxhLnNjYWxlWSxzLGwpLG89YT1udWxsLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPS0xLGk9bC5sZW5ndGg7KytuPGk7KXNbKGU9bFtuXSkuaV09ZS54KHQpO3JldHVybiBzLmpvaW4oIiIpfX19dmFyIE91dD1SdXQoKGZ1bmN0aW9uIHp1dCh0KXtyZXR1cm4ibm9uZSI9PT10P051dDooQ3V0fHwoQ3V0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLEF1dD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsa3V0PWRvY3VtZW50LmRlZmF1bHRWaWV3KSxDdXQuc3R5bGUudHJhbnNmb3JtPXQsdD1rdXQuZ2V0Q29tcHV0ZWRTdHlsZShBdXQuYXBwZW5kQ2hpbGQoQ3V0KSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKSxBdXQucmVtb3ZlQ2hpbGQoQ3V0KSxJdXQoKyh0PXQuc2xpY2UoNywtMSkuc3BsaXQoIiwiKSlbMF0sK3RbMV0sK3RbMl0sK3RbM10sK3RbNF0sK3RbNV0pKX0pLCJweCwgIiwicHgpIiwiZGVnKSIpLER1dD1SdXQoKGZ1bmN0aW9uIEJ1dCh0KXtyZXR1cm4gbnVsbD09dD9OdXQ6KEx1dHx8KEx1dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwiZyIpKSxMdXQuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLHQpLCh0PUx1dC50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKT9JdXQoKHQ9dC5tYXRyaXgpLmEsdC5iLHQuYyx0LmQsdC5lLHQuZik6TnV0KX0pLCIsICIsIikiLCIpIiksSHV0PU1hdGguU1FSVDI7ZnVuY3Rpb24gRnV0KHQpe3JldHVybigodD1NYXRoLmV4cCh0KSkrMS90KS8yfWZ1bmN0aW9uIFZ1dCh0LGUpe3ZhciBuLGkscj10WzBdLG89dFsxXSxhPXRbMl0scz1lWzJdLGw9ZVswXS1yLGM9ZVsxXS1vLHU9bCpsK2MqYztpZih1PDFlLTEyKWk9TWF0aC5sb2cocy9hKS9IdXQsbj1mdW5jdGlvbih0KXtyZXR1cm5bcit0Kmwsbyt0KmMsYSpNYXRoLmV4cChIdXQqdCppKV19O2Vsc2V7dmFyIGg9TWF0aC5zcXJ0KHUpLGQ9KHMqcy1hKmErNCp1KS8oMiphKjIqaCkscD0ocypzLWEqYS00KnUpLygyKnMqMipoKSxmPU1hdGgubG9nKE1hdGguc3FydChkKmQrMSktZCksbT1NYXRoLmxvZyhNYXRoLnNxcnQocCpwKzEpLXApO2k9KG0tZikvSHV0LG49ZnVuY3Rpb24odCl7dmFyIGU9dCppLG49RnV0KGYpLHM9YS8oMipoKSoobiooZnVuY3Rpb24gdSh0KXtyZXR1cm4oKHQ9TWF0aC5leHAoMip0KSktMSkvKHQrMSl9KShIdXQqZStmKS0oZnVuY3Rpb24gZCh0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpLTEvdCkvMn0pKGYpKTtyZXR1cm5bcitzKmwsbytzKmMsYSpuL0Z1dChIdXQqZStmKV19fXJldHVybiBuLmR1cmF0aW9uPTFlMyppLG59dmFyIFV1dCxqdXQsR3V0PTAsV3V0PTAscXV0PTAsWXV0PTAsWHV0PTAsJHV0PTAsS3V0PSJvYmplY3QiPT10eXBlb2YgcGVyZm9ybWFuY2UmJnBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZTpEYXRlLFp1dD0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTcpfTtmdW5jdGlvbiBKdXQoKXtyZXR1cm4gWHV0fHwoWnV0KFF1dCksWHV0PUt1dC5ub3coKSskdXQpfWZ1bmN0aW9uIFF1dCgpe1h1dD0wfWZ1bmN0aW9uIHRodCgpe3RoaXMuX2NhbGw9dGhpcy5fdGltZT10aGlzLl9uZXh0PW51bGx9ZnVuY3Rpb24gZWh0KHQsZSxuKXt2YXIgaT1uZXcgdGh0O3JldHVybiBpLnJlc3RhcnQodCxlLG4pLGl9ZnVuY3Rpb24gbmh0KCl7WHV0PShZdXQ9S3V0Lm5vdygpKSskdXQsR3V0PVd1dD0wO3RyeXshKGZ1bmN0aW9uIHQoKXtKdXQoKSwrK0d1dDtmb3IodmFyIHQsZT1VdXQ7ZTspKHQ9WHV0LWUuX3RpbWUpPj0wJiZlLl9jYWxsLmNhbGwobnVsbCx0KSxlPWUuX25leHQ7LS1HdXR9KSgpfWZpbmFsbHl7R3V0PTAsKGZ1bmN0aW9uIGUoKXtmb3IodmFyIHQsZSxuPVV1dCxpPTEvMDtuOyluLl9jYWxsPyhpPm4uX3RpbWUmJihpPW4uX3RpbWUpLHQ9bixuPW4uX25leHQpOihlPW4uX25leHQsbi5fbmV4dD1udWxsLG49dD90Ll9uZXh0PWU6VXV0PWUpO2p1dD10LHJodChpKX0pKCksWHV0PTB9fWZ1bmN0aW9uIGlodCgpe3ZhciB0PUt1dC5ub3coKSxlPXQtWXV0O2U+MWUzJiYoJHV0LT1lLFl1dD10KX1mdW5jdGlvbiByaHQodCl7R3V0fHwoV3V0JiYoV3V0PWNsZWFyVGltZW91dChXdXQpKSx0LVh1dD4yND8odDwxLzAmJihXdXQ9c2V0VGltZW91dChuaHQsdC1LdXQubm93KCktJHV0KSkscXV0JiYocXV0PWNsZWFySW50ZXJ2YWwocXV0KSkpOihxdXR8fChZdXQ9S3V0Lm5vdygpLHF1dD1zZXRJbnRlcnZhbChpaHQsMWUzKSksR3V0PTEsWnV0KG5odCkpKX1mdW5jdGlvbiBvaHQodCxlLG4pe3ZhciBpPW5ldyB0aHQ7cmV0dXJuIGkucmVzdGFydCgoZnVuY3Rpb24obil7aS5zdG9wKCksdChuK2UpfSksZT1udWxsPT1lPzA6K2UsbiksaX10aHQucHJvdG90eXBlPWVodC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnRodCxyZXN0YXJ0OmZ1bmN0aW9uKHQsZSxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbiIpO249KG51bGw9PW4/SnV0KCk6K24pKyhudWxsPT1lPzA6K2UpLHRoaXMuX25leHR8fGp1dD09PXRoaXN8fChqdXQ/anV0Ll9uZXh0PXRoaXM6VXV0PXRoaXMsanV0PXRoaXMpLHRoaXMuX2NhbGw9dCx0aGlzLl90aW1lPW4scmh0KCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9jYWxsJiYodGhpcy5fY2FsbD1udWxsLHRoaXMuX3RpbWU9MS8wLHJodCgpKX19O3ZhciBhaHQ9VXN0KCJzdGFydCIsImVuZCIsImNhbmNlbCIsImludGVycnVwdCIpLHNodD1bXTtmdW5jdGlvbiBsaHQodCxlLG4saSxyLG8pe3ZhciBhPXQuX190cmFuc2l0aW9uO2lmKGEpe2lmKG4gaW4gYSlyZXR1cm59ZWxzZSB0Ll9fdHJhbnNpdGlvbj17fTshKGZ1bmN0aW9uIHModCxlLG4pe3ZhciBpLHI9dC5fX3RyYW5zaXRpb247ZnVuY3Rpb24gbyhsKXt2YXIgYyx1LGgsZDtpZigxIT09bi5zdGF0ZSlyZXR1cm4gcygpO2ZvcihjIGluIHIpaWYoKGQ9cltjXSkubmFtZT09PW4ubmFtZSl7aWYoMz09PWQuc3RhdGUpcmV0dXJuIG9odChvKTs0PT09ZC5zdGF0ZT8oZC5zdGF0ZT02LGQudGltZXIuc3RvcCgpLGQub24uY2FsbCgiaW50ZXJydXB0Iix0LHQuX19kYXRhX18sZC5pbmRleCxkLmdyb3VwKSxkZWxldGUgcltjXSk6K2M8ZSYmKGQuc3RhdGU9NixkLnRpbWVyLnN0b3AoKSxkLm9uLmNhbGwoImNhbmNlbCIsdCx0Ll9fZGF0YV9fLGQuaW5kZXgsZC5ncm91cCksZGVsZXRlIHJbY10pfWlmKG9odCgoZnVuY3Rpb24oKXszPT09bi5zdGF0ZSYmKG4uc3RhdGU9NCxuLnRpbWVyLnJlc3RhcnQoYSxuLmRlbGF5LG4udGltZSksYShsKSl9KSksbi5zdGF0ZT0yLG4ub24uY2FsbCgic3RhcnQiLHQsdC5fX2RhdGFfXyxuLmluZGV4LG4uZ3JvdXApLDI9PT1uLnN0YXRlKXtmb3Iobi5zdGF0ZT0zLGk9bmV3IEFycmF5KGg9bi50d2Vlbi5sZW5ndGgpLGM9MCx1PS0xO2M8aDsrK2MpKGQ9bi50d2VlbltjXS52YWx1ZS5jYWxsKHQsdC5fX2RhdGFfXyxuLmluZGV4LG4uZ3JvdXApKSYmKGlbKyt1XT1kKTtpLmxlbmd0aD11KzF9fWZ1bmN0aW9uIGEoZSl7Zm9yKHZhciByPWU8bi5kdXJhdGlvbj9uLmVhc2UuY2FsbChudWxsLGUvbi5kdXJhdGlvbik6KG4udGltZXIucmVzdGFydChzKSxuLnN0YXRlPTUsMSksbz0tMSxhPWkubGVuZ3RoOysrbzxhOylpW29dLmNhbGwodCxyKTs1PT09bi5zdGF0ZSYmKG4ub24uY2FsbCgiZW5kIix0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSxzKCkpfWZ1bmN0aW9uIHMoKXtmb3IodmFyIGkgaW4gbi5zdGF0ZT02LG4udGltZXIuc3RvcCgpLGRlbGV0ZSByW2VdLHIpcmV0dXJuO2RlbGV0ZSB0Ll9fdHJhbnNpdGlvbn1yW2VdPW4sbi50aW1lcj1laHQoKGZ1bmN0aW9uIGwodCl7bi5zdGF0ZT0xLG4udGltZXIucmVzdGFydChvLG4uZGVsYXksbi50aW1lKSxuLmRlbGF5PD10JiZvKHQtbi5kZWxheSl9KSwwLG4udGltZSl9KSh0LG4se25hbWU6ZSxpbmRleDppLGdyb3VwOnIsb246YWh0LHR3ZWVuOnNodCx0aW1lOm8udGltZSxkZWxheTpvLmRlbGF5LGR1cmF0aW9uOm8uZHVyYXRpb24sZWFzZTpvLmVhc2UsdGltZXI6bnVsbCxzdGF0ZTowfSl9ZnVuY3Rpb24gY2h0KHQsZSl7dmFyIG49aGh0KHQsZSk7aWYobi5zdGF0ZT4wKXRocm93IG5ldyBFcnJvcigidG9vIGxhdGU7IGFscmVhZHkgc2NoZWR1bGVkIik7cmV0dXJuIG59ZnVuY3Rpb24gdWh0KHQsZSl7dmFyIG49aGh0KHQsZSk7aWYobi5zdGF0ZT4zKXRocm93IG5ldyBFcnJvcigidG9vIGxhdGU7IGFscmVhZHkgcnVubmluZyIpO3JldHVybiBufWZ1bmN0aW9uIGhodCh0LGUpe3ZhciBuPXQuX190cmFuc2l0aW9uO2lmKCFufHwhKG49bltlXSkpdGhyb3cgbmV3IEVycm9yKCJ0cmFuc2l0aW9uIG5vdCBmb3VuZCIpO3JldHVybiBufWZ1bmN0aW9uIGRodCh0LGUpe3ZhciBuLGkscixvPXQuX190cmFuc2l0aW9uLGE9ITA7aWYobyl7Zm9yKHIgaW4gZT1udWxsPT1lP251bGw6ZSsiIixvKShuPW9bcl0pLm5hbWU9PT1lPyhpPW4uc3RhdGU+MiYmbi5zdGF0ZTw1LG4uc3RhdGU9NixuLnRpbWVyLnN0b3AoKSxuLm9uLmNhbGwoaT8iaW50ZXJydXB0IjoiY2FuY2VsIix0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSxkZWxldGUgb1tyXSk6YT0hMTthJiZkZWxldGUgdC5fX3RyYW5zaXRpb259fWZ1bmN0aW9uIHBodCh0LGUpe3ZhciBuLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9dWh0KHRoaXMsdCksbz1yLnR3ZWVuO2lmKG8hPT1uKWZvcih2YXIgYT0wLHM9KGk9bj1vKS5sZW5ndGg7YTxzOysrYSlpZihpW2FdLm5hbWU9PT1lKXsoaT1pLnNsaWNlKCkpLnNwbGljZShhLDEpO2JyZWFrfXIudHdlZW49aX19ZnVuY3Rpb24gZmh0KHQsZSxuKXt2YXIgaSxyO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz11aHQodGhpcyx0KSxhPW8udHdlZW47aWYoYSE9PWkpe3I9KGk9YSkuc2xpY2UoKTtmb3IodmFyIHM9e25hbWU6ZSx2YWx1ZTpufSxsPTAsYz1yLmxlbmd0aDtsPGM7KytsKWlmKHJbbF0ubmFtZT09PWUpe3JbbF09czticmVha31sPT09YyYmci5wdXNoKHMpfW8udHdlZW49cn19ZnVuY3Rpb24gbWh0KHQsZSxuKXt2YXIgaT10Ll9pZDtyZXR1cm4gdC5lYWNoKChmdW5jdGlvbigpe3ZhciB0PXVodCh0aGlzLGkpOyh0LnZhbHVlfHwodC52YWx1ZT17fSkpW2VdPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpfSkpLGZ1bmN0aW9uKHQpe3JldHVybiBoaHQodCxpKS52YWx1ZVtlXX19ZnVuY3Rpb24gZ2h0KHQsZSl7dmFyIG47cmV0dXJuKCJudW1iZXIiPT10eXBlb2YgZT9TdXQ6ZSBpbnN0YW5jZW9mIG91dD93dXQ6KG49b3V0KGUpKT8oZT1uLHd1dCk6VHV0KSh0LGUpfWZ1bmN0aW9uIF9odCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19ZnVuY3Rpb24geWh0KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gdmh0KHQsZSxuKXt2YXIgaSxyLG89bisiIjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEF0dHJpYnV0ZSh0KTtyZXR1cm4gYT09PW8/bnVsbDphPT09aT9yOnI9ZShpPWEsbil9fWZ1bmN0aW9uIGJodCh0LGUsbil7dmFyIGkscixvPW4rIiI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpO3JldHVybiBhPT09bz9udWxsOmE9PT1pP3I6cj1lKGk9YSxuKX19ZnVuY3Rpb24geGh0KHQsZSxuKXt2YXIgaSxyLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEscyxsPW4odGhpcyk7aWYobnVsbCE9bClyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZSh0KSk9PT0ocz1sKyIiKT9udWxsOmE9PT1pJiZzPT09cj9vOihyPXMsbz1lKGk9YSxsKSk7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIHdodCh0LGUsbil7dmFyIGkscixvO3JldHVybiBmdW5jdGlvbigpe3ZhciBhLHMsbD1uKHRoaXMpO2lmKG51bGwhPWwpcmV0dXJuKGE9dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpKT09PShzPWwrIiIpP251bGw6YT09PWkmJnM9PT1yP286KHI9cyxvPWUoaT1hLGwpKTt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIFNodCh0LGUpe3JldHVybiBmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZSh0LGUuY2FsbCh0aGlzLG4pKX19ZnVuY3Rpb24gTWh0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGUuY2FsbCh0aGlzLG4pKX19ZnVuY3Rpb24gRWh0KHQsZSl7dmFyIG4saTtmdW5jdGlvbiByKCl7dmFyIHI9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHIhPT1pJiYobj0oaT1yKSYmTWh0KHQscikpLG59cmV0dXJuIHIuX3ZhbHVlPWUscn1mdW5jdGlvbiBUaHQodCxlKXt2YXIgbixpO2Z1bmN0aW9uIHIoKXt2YXIgcj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gciE9PWkmJihuPShpPXIpJiZTaHQodCxyKSksbn1yZXR1cm4gci5fdmFsdWU9ZSxyfWZ1bmN0aW9uIENodCh0LGUpe3JldHVybiBmdW5jdGlvbigpe2NodCh0aGlzLHQpLmRlbGF5PStlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gQWh0KHQsZSl7cmV0dXJuIGU9K2UsZnVuY3Rpb24oKXtjaHQodGhpcyx0KS5kZWxheT1lfX1mdW5jdGlvbiBraHQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt1aHQodGhpcyx0KS5kdXJhdGlvbj0rZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIExodCh0LGUpe3JldHVybiBlPStlLGZ1bmN0aW9uKCl7dWh0KHRoaXMsdCkuZHVyYXRpb249ZX19ZnVuY3Rpb24gUGh0KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO3JldHVybiBmdW5jdGlvbigpe3VodCh0aGlzLHQpLmVhc2U9ZX19ZnVuY3Rpb24gTmh0KHQsZSxuKXt2YXIgaSxyLG89KGZ1bmN0aW9uIGEodCl7cmV0dXJuKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5ldmVyeSgoZnVuY3Rpb24odCl7dmFyIGU9dC5pbmRleE9mKCIuIik7cmV0dXJuIGU+PTAmJih0PXQuc2xpY2UoMCxlKSksIXR8fCJzdGFydCI9PT10fSkpfSkoZSk/Y2h0OnVodDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1vKHRoaXMsdCkscz1hLm9uO3MhPT1pJiYocj0oaT1zKS5jb3B5KCkpLm9uKGUsbiksYS5vbj1yfX12YXIgSWh0PWVjdC5wcm90b3R5cGUuY29uc3RydWN0b3I7ZnVuY3Rpb24gUmh0KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fWZ1bmN0aW9uIE9odCh0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKGkpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxlLmNhbGwodGhpcyxpKSxuKX19ZnVuY3Rpb24gemh0KHQsZSxuKXt2YXIgaSxyO2Z1bmN0aW9uIG8oKXt2YXIgbz1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbyE9PXImJihpPShyPW8pJiZPaHQodCxvLG4pKSxpfXJldHVybiBvLl92YWx1ZT1lLG99ZnVuY3Rpb24gRGh0KHQpe3JldHVybiBmdW5jdGlvbihlKXt0aGlzLnRleHRDb250ZW50PXQuY2FsbCh0aGlzLGUpfX1mdW5jdGlvbiBCaHQodCl7dmFyIGUsbjtmdW5jdGlvbiBpKCl7dmFyIGk9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGkhPT1uJiYoZT0obj1pKSYmRGh0KGkpKSxlfXJldHVybiBpLl92YWx1ZT10LGl9dmFyIEhodD0wO2Z1bmN0aW9uIEZodCh0LGUsbixpKXt0aGlzLl9ncm91cHM9dCx0aGlzLl9wYXJlbnRzPWUsdGhpcy5fbmFtZT1uLHRoaXMuX2lkPWl9ZnVuY3Rpb24gVmh0KCl7cmV0dXJuKytIaHR9dmFyIFVodD1lY3QucHJvdG90eXBlO0ZodC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkZodCxzZWxlY3Q6ZnVuY3Rpb24gamh0KHQpe3ZhciBlPXRoaXMuX25hbWUsbj10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9dGx0KHQpKTtmb3IodmFyIGk9dGhpcy5fZ3JvdXBzLHI9aS5sZW5ndGgsbz1uZXcgQXJyYXkociksYT0wO2E8cjsrK2EpZm9yKHZhciBzLGwsYz1pW2FdLHU9Yy5sZW5ndGgsaD1vW2FdPW5ldyBBcnJheSh1KSxkPTA7ZDx1OysrZCkocz1jW2RdKSYmKGw9dC5jYWxsKHMscy5fX2RhdGFfXyxkLGMpKSYmKCJfX2RhdGFfXyJpbiBzJiYobC5fX2RhdGFfXz1zLl9fZGF0YV9fKSxoW2RdPWwsbGh0KGhbZF0sZSxuLGQsaCxoaHQocyxuKSkpO3JldHVybiBuZXcgRmh0KG8sdGhpcy5fcGFyZW50cyxlLG4pfSxzZWxlY3RBbGw6ZnVuY3Rpb24gR2h0KHQpe3ZhciBlPXRoaXMuX25hbWUsbj10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9bmx0KHQpKTtmb3IodmFyIGk9dGhpcy5fZ3JvdXBzLHI9aS5sZW5ndGgsbz1bXSxhPVtdLHM9MDtzPHI7KytzKWZvcih2YXIgbCxjPWlbc10sdT1jLmxlbmd0aCxoPTA7aDx1OysraClpZihsPWNbaF0pe2Zvcih2YXIgZCxwPXQuY2FsbChsLGwuX19kYXRhX18saCxjKSxmPWhodChsLG4pLG09MCxnPXAubGVuZ3RoO208ZzsrK20pKGQ9cFttXSkmJmxodChkLGUsbixtLHAsZik7by5wdXNoKHApLGEucHVzaChsKX1yZXR1cm4gbmV3IEZodChvLGEsZSxuKX0sZmlsdGVyOmZ1bmN0aW9uIFdodCh0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9aWx0KHQpKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49ZS5sZW5ndGgsaT1uZXcgQXJyYXkobikscj0wO3I8bjsrK3IpZm9yKHZhciBvLGE9ZVtyXSxzPWEubGVuZ3RoLGw9aVtyXT1bXSxjPTA7YzxzOysrYykobz1hW2NdKSYmdC5jYWxsKG8sby5fX2RhdGFfXyxjLGEpJiZsLnB1c2gobyk7cmV0dXJuIG5ldyBGaHQoaSx0aGlzLl9wYXJlbnRzLHRoaXMuX25hbWUsdGhpcy5faWQpfSxtZXJnZTpmdW5jdGlvbiBxaHQodCl7aWYodC5faWQhPT10aGlzLl9pZCl0aHJvdyBuZXcgRXJyb3I7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPXQuX2dyb3VwcyxpPWUubGVuZ3RoLHI9TWF0aC5taW4oaSxuLmxlbmd0aCksbz1uZXcgQXJyYXkoaSksYT0wO2E8cjsrK2EpZm9yKHZhciBzLGw9ZVthXSxjPW5bYV0sdT1sLmxlbmd0aCxoPW9bYV09bmV3IEFycmF5KHUpLGQ9MDtkPHU7KytkKShzPWxbZF18fGNbZF0pJiYoaFtkXT1zKTtmb3IoO2E8aTsrK2Epb1thXT1lW2FdO3JldHVybiBuZXcgRmh0KG8sdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sc2VsZWN0aW9uOmZ1bmN0aW9uIFlodCgpe3JldHVybiBuZXcgSWh0KHRoaXMuX2dyb3Vwcyx0aGlzLl9wYXJlbnRzKX0sdHJhbnNpdGlvbjpmdW5jdGlvbiBYaHQoKXtmb3IodmFyIHQ9dGhpcy5fbmFtZSxlPXRoaXMuX2lkLG49Vmh0KCksaT10aGlzLl9ncm91cHMscj1pLmxlbmd0aCxvPTA7bzxyOysrbylmb3IodmFyIGEscz1pW29dLGw9cy5sZW5ndGgsYz0wO2M8bDsrK2MpaWYoYT1zW2NdKXt2YXIgdT1oaHQoYSxlKTtsaHQoYSx0LG4sYyxzLHt0aW1lOnUudGltZSt1LmRlbGF5K3UuZHVyYXRpb24sZGVsYXk6MCxkdXJhdGlvbjp1LmR1cmF0aW9uLGVhc2U6dS5lYXNlfSl9cmV0dXJuIG5ldyBGaHQoaSx0aGlzLl9wYXJlbnRzLHQsbil9LGNhbGw6VWh0LmNhbGwsbm9kZXM6VWh0Lm5vZGVzLG5vZGU6VWh0Lm5vZGUsc2l6ZTpVaHQuc2l6ZSxlbXB0eTpVaHQuZW1wdHksZWFjaDpVaHQuZWFjaCxvbjpmdW5jdGlvbiAkaHQodCxlKXt2YXIgbj10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP2hodCh0aGlzLm5vZGUoKSxuKS5vbi5vbih0KTp0aGlzLmVhY2goTmh0KG4sdCxlKSl9LGF0dHI6ZnVuY3Rpb24gS2h0KHQsZSl7dmFyIG49JHN0KHQpLGk9InRyYW5zZm9ybSI9PT1uP0R1dDpnaHQ7cmV0dXJuIHRoaXMuYXR0clR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIGU/KG4ubG9jYWw/d2h0OnhodCkobixpLG1odCh0aGlzLCJhdHRyLiIrdCxlKSk6bnVsbD09ZT8obi5sb2NhbD95aHQ6X2h0KShuKToobi5sb2NhbD9iaHQ6dmh0KShuLGksZSkpfSxhdHRyVHdlZW46ZnVuY3Rpb24gWmh0KHQsZSl7dmFyIG49ImF0dHIuIit0O2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4obj10aGlzLnR3ZWVuKG4pKSYmbi5fdmFsdWU7aWYobnVsbD09ZSlyZXR1cm4gdGhpcy50d2VlbihuLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcjt2YXIgaT0kc3QodCk7cmV0dXJuIHRoaXMudHdlZW4obiwoaS5sb2NhbD9FaHQ6VGh0KShpLGUpKX0sc3R5bGU6ZnVuY3Rpb24gSmh0KHQsZSxuKXt2YXIgaT0idHJhbnNmb3JtIj09KHQrPSIiKT9PdXQ6Z2h0O3JldHVybiBudWxsPT1lP3RoaXMuc3R5bGVUd2Vlbih0LChmdW5jdGlvbiByKHQsZSl7dmFyIG4saSxyO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPXZsdCh0aGlzLHQpLGE9KHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCksdmx0KHRoaXMsdCkpO3JldHVybiBvPT09YT9udWxsOm89PT1uJiZhPT09aT9yOnI9ZShuPW8saT1hKX19KSh0LGkpKS5vbigiZW5kLnN0eWxlLiIrdCxSaHQodCkpOiJmdW5jdGlvbiI9PXR5cGVvZiBlP3RoaXMuc3R5bGVUd2Vlbih0LChmdW5jdGlvbiBhKHQsZSxuKXt2YXIgaSxyLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9dmx0KHRoaXMsdCkscz1uKHRoaXMpLGw9cysiIjtyZXR1cm4gbnVsbD09cyYmKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCksbD1zPXZsdCh0aGlzLHQpKSxhPT09bD9udWxsOmE9PT1pJiZsPT09cj9vOihyPWwsbz1lKGk9YSxzKSl9fSkodCxpLG1odCh0aGlzLCJzdHlsZS4iK3QsZSkpKS5lYWNoKChmdW5jdGlvbiBvKHQsZSl7dmFyIG4saSxyLG8sYT0ic3R5bGUuIitlLHM9ImVuZC4iK2E7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGw9dWh0KHRoaXMsdCksYz1sLm9uLHU9bnVsbD09bC52YWx1ZVthXT9vfHwobz1SaHQoZSkpOnZvaWQgMDtjPT09biYmcj09PXV8fChpPShuPWMpLmNvcHkoKSkub24ocyxyPXUpLGwub249aX19KSh0aGlzLl9pZCx0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsKGZ1bmN0aW9uIHModCxlLG4pe3ZhciBpLHIsbz1uKyIiO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPXZsdCh0aGlzLHQpO3JldHVybiBhPT09bz9udWxsOmE9PT1pP3I6cj1lKGk9YSxuKX19KSh0LGksZSksbikub24oImVuZC5zdHlsZS4iK3QsbnVsbCl9LHN0eWxlVHdlZW46ZnVuY3Rpb24gUWh0KHQsZSxuKXt2YXIgaT0ic3R5bGUuIisodCs9IiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4oaT10aGlzLnR3ZWVuKGkpKSYmaS5fdmFsdWU7aWYobnVsbD09ZSlyZXR1cm4gdGhpcy50d2VlbihpLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy50d2VlbihpLHpodCh0LGUsbnVsbD09bj8iIjpuKSl9LHRleHQ6ZnVuY3Rpb24gdGR0KHQpe3JldHVybiB0aGlzLnR3ZWVuKCJ0ZXh0IiwiZnVuY3Rpb24iPT10eXBlb2YgdD8oZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09ZT8iIjplfX0pKG1odCh0aGlzLCJ0ZXh0Iix0KSk6KGZ1bmN0aW9uIG4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD10fX0pKG51bGw9PXQ/IiI6dCsiIikpfSx0ZXh0VHdlZW46ZnVuY3Rpb24gZWR0KHQpe3ZhciBlPSJ0ZXh0IjtpZihhcmd1bWVudHMubGVuZ3RoPDEpcmV0dXJuKGU9dGhpcy50d2VlbihlKSkmJmUuX3ZhbHVlO2lmKG51bGw9PXQpcmV0dXJuIHRoaXMudHdlZW4oZSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4oZSxCaHQodCkpfSxyZW1vdmU6ZnVuY3Rpb24gbmR0KCl7cmV0dXJuIHRoaXMub24oImVuZC5yZW1vdmUiLChmdW5jdGlvbiB0KGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTtmb3IodmFyIG4gaW4gdGhpcy5fX3RyYW5zaXRpb24paWYoK24hPT1lKXJldHVybjt0JiZ0LnJlbW92ZUNoaWxkKHRoaXMpfX0pKHRoaXMuX2lkKSl9LHR3ZWVuOmZ1bmN0aW9uIGlkdCh0LGUpe3ZhciBuPXRoaXMuX2lkO2lmKHQrPSIiLGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciBpLHI9aGh0KHRoaXMubm9kZSgpLG4pLnR3ZWVuLG89MCxhPXIubGVuZ3RoO288YTsrK28paWYoKGk9cltvXSkubmFtZT09PXQpcmV0dXJuIGkudmFsdWU7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09ZT9waHQ6Zmh0KShuLHQsZSkpfSxkZWxheTpmdW5jdGlvbiByZHQodCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9DaHQ6QWh0KShlLHQpKTpoaHQodGhpcy5ub2RlKCksZSkuZGVsYXl9LGR1cmF0aW9uOmZ1bmN0aW9uIG9kdCh0KXt2YXIgZT10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiB0P2todDpMaHQpKGUsdCkpOmhodCh0aGlzLm5vZGUoKSxlKS5kdXJhdGlvbn0sZWFzZTpmdW5jdGlvbiBhZHQodCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKFBodChlLHQpKTpoaHQodGhpcy5ub2RlKCksZSkuZWFzZX0sZW5kOmZ1bmN0aW9uIHNkdCgpe3ZhciB0LGUsbj10aGlzLGk9bi5faWQscj1uLnNpemUoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG8sYSl7dmFyIHM9e3ZhbHVlOmF9LGw9e3ZhbHVlOmZ1bmN0aW9uKCl7MD09LS1yJiZvKCl9fTtuLmVhY2goKGZ1bmN0aW9uKCl7dmFyIG49dWh0KHRoaXMsaSkscj1uLm9uO3IhPT10JiYoKGU9KHQ9cikuY29weSgpKS5fLmNhbmNlbC5wdXNoKHMpLGUuXy5pbnRlcnJ1cHQucHVzaChzKSxlLl8uZW5kLnB1c2gobCkpLG4ub249ZX0pKX0pKX19O3ZhciBsZHQ9e3RpbWU6bnVsbCxkZWxheTowLGR1cmF0aW9uOjI1MCxlYXNlOlRmfTtmdW5jdGlvbiBjZHQodCxlKXtmb3IodmFyIG47IShuPXQuX190cmFuc2l0aW9uKXx8IShuPW5bZV0pOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm4gbGR0LnRpbWU9SnV0KCksbGR0O3JldHVybiBufWZ1bmN0aW9uIHVkdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gaGR0KHQsZSxuKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1lLHRoaXMudHJhbnNmb3JtPW59ZnVuY3Rpb24gZGR0KHQsZSxuKXt0aGlzLms9dCx0aGlzLng9ZSx0aGlzLnk9bn1lY3QucHJvdG90eXBlLmludGVycnVwdD1mdW5jdGlvbiBwZHQodCl7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXtkaHQodGhpcyx0KX0pKX0sZWN0LnByb3RvdHlwZS50cmFuc2l0aW9uPWZ1bmN0aW9uIGZkdCh0KXt2YXIgZSxuO3QgaW5zdGFuY2VvZiBGaHQ/KGU9dC5faWQsdD10Ll9uYW1lKTooZT1WaHQoKSwobj1sZHQpLnRpbWU9SnV0KCksdD1udWxsPT10P251bGw6dCsiIik7Zm9yKHZhciBpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89MDtvPHI7KytvKWZvcih2YXIgYSxzPWlbb10sbD1zLmxlbmd0aCxjPTA7YzxsOysrYykoYT1zW2NdKSYmbGh0KGEsdCxlLGMscyxufHxjZHQoYSxlKSk7cmV0dXJuIG5ldyBGaHQoaSx0aGlzLl9wYXJlbnRzLHQsZSl9LGRkdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmRkdCxzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQ/dGhpczpuZXcgZGR0KHRoaXMuayp0LHRoaXMueCx0aGlzLnkpfSx0cmFuc2xhdGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gMD09PXQmMD09PWU/dGhpczpuZXcgZGR0KHRoaXMuayx0aGlzLngrdGhpcy5rKnQsdGhpcy55K3RoaXMuayplKX0sYXBwbHk6ZnVuY3Rpb24odCl7cmV0dXJuW3RbMF0qdGhpcy5rK3RoaXMueCx0WzFdKnRoaXMuayt0aGlzLnldfSxhcHBseVg6ZnVuY3Rpb24odCl7cmV0dXJuIHQqdGhpcy5rK3RoaXMueH0sYXBwbHlZOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuayt0aGlzLnl9LGludmVydDpmdW5jdGlvbih0KXtyZXR1cm5bKHRbMF0tdGhpcy54KS90aGlzLmssKHRbMV0tdGhpcy55KS90aGlzLmtdfSxpbnZlcnRYOmZ1bmN0aW9uKHQpe3JldHVybih0LXRoaXMueCkvdGhpcy5rfSxpbnZlcnRZOmZ1bmN0aW9uKHQpe3JldHVybih0LXRoaXMueSkvdGhpcy5rfSxyZXNjYWxlWDpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCkuZG9tYWluKHQucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRYLHRoaXMpLm1hcCh0LmludmVydCx0KSl9LHJlc2NhbGVZOmZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoKS5kb21haW4odC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksdGhpcykubWFwKHQuaW52ZXJ0LHQpKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4idHJhbnNsYXRlKCIrdGhpcy54KyIsIit0aGlzLnkrIikgc2NhbGUoIit0aGlzLmsrIikifX07dmFyIG1kdD1uZXcgZGR0KDEsMCwwKTtmdW5jdGlvbiBnZHQodCl7cmV0dXJuIHQuX196b29tfHxtZHR9ZnVuY3Rpb24gX2R0KCl7R2x0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIHlkdCgpe0dsdC5wcmV2ZW50RGVmYXVsdCgpLEdsdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiB2ZHQoKXtyZXR1cm4hR2x0LmJ1dHRvbn1mdW5jdGlvbiBiZHQoKXt2YXIgdCxlLG49dGhpcztyZXR1cm4gbiBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ/KHQ9KG49bi5vd25lclNWR0VsZW1lbnR8fG4pLndpZHRoLmJhc2VWYWwudmFsdWUsZT1uLmhlaWdodC5iYXNlVmFsLnZhbHVlKToodD1uLmNsaWVudFdpZHRoLGU9bi5jbGllbnRIZWlnaHQpLFtbMCwwXSxbdCxlXV19ZnVuY3Rpb24geGR0KCl7cmV0dXJuIHRoaXMuX196b29tfHxtZHR9ZnVuY3Rpb24gd2R0KCl7cmV0dXJuLUdsdC5kZWx0YVkqKEdsdC5kZWx0YU1vZGU/MTIwOjEpLzUwMH1mdW5jdGlvbiBTZHQoKXtyZXR1cm4ib250b3VjaHN0YXJ0ImluIHRoaXN9ZnVuY3Rpb24gTWR0KHQsZSxuKXt2YXIgaT10LmludmVydFgoZVswXVswXSktblswXVswXSxyPXQuaW52ZXJ0WChlWzFdWzBdKS1uWzFdWzBdLG89dC5pbnZlcnRZKGVbMF1bMV0pLW5bMF1bMV0sYT10LmludmVydFkoZVsxXVsxXSktblsxXVsxXTtyZXR1cm4gdC50cmFuc2xhdGUocj5pPyhpK3IpLzI6TWF0aC5taW4oMCxpKXx8TWF0aC5tYXgoMCxyKSxhPm8/KG8rYSkvMjpNYXRoLm1pbigwLG8pfHxNYXRoLm1heCgwLGEpKX1nZHQucHJvdG90eXBlPWRkdC5wcm90b3R5cGU7dmFyIEVkdD1iZShPYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCx2ZXJzaW9uOiI0LjEzLjAiLGJpc2VjdDpDTyxiaXNlY3RSaWdodDpDTyxiaXNlY3RMZWZ0OkFPLGFzY2VuZGluZzpNTyxiaXNlY3RvcjpFTyxjcm9zczpmdW5jdGlvbiBUZHQodCxlLG4pe3ZhciBpLHIsbyxhLHM9dC5sZW5ndGgsbD1lLmxlbmd0aCxjPW5ldyBBcnJheShzKmwpO2ZvcihudWxsPT1uJiYobj1rTyksaT1vPTA7aTxzOysraSlmb3IoYT10W2ldLHI9MDtyPGw7KytyLCsrbyljW29dPW4oYSxlW3JdKTtyZXR1cm4gY30sZGVzY2VuZGluZzpmdW5jdGlvbiBDZHQodCxlKXtyZXR1cm4gZTx0Py0xOmU+dD8xOmU+PXQ/MDpOYU59LGRldmlhdGlvbjpOTyxleHRlbnQ6SU8saGlzdG9ncmFtOmZ1bmN0aW9uIEFkdCgpe3ZhciB0PUJPLGU9SU8sbj1XTztmdW5jdGlvbiBpKGkpe3ZhciByLG8sYT1pLmxlbmd0aCxzPW5ldyBBcnJheShhKTtmb3Iocj0wO3I8YTsrK3Ipc1tyXT10KGlbcl0scixpKTt2YXIgbD1lKHMpLGM9bFswXSx1PWxbMV0saD1uKHMsYyx1KTtBcnJheS5pc0FycmF5KGgpfHwoaD1HTyhjLHUsaCksaD1ITyhNYXRoLmNlaWwoYy9oKSpoLE1hdGguZmxvb3IodS9oKSpoLGgpKTtmb3IodmFyIGQ9aC5sZW5ndGg7aFswXTw9YzspaC5zaGlmdCgpLC0tZDtmb3IoO2hbZC0xXT51OyloLnBvcCgpLC0tZDt2YXIgcCxmPW5ldyBBcnJheShkKzEpO2ZvcihyPTA7cjw9ZDsrK3IpKHA9ZltyXT1bXSkueDA9cj4wP2hbci0xXTpjLHAueDE9cjxkP2hbcl06dTtmb3Iocj0wO3I8YTsrK3IpYzw9KG89c1tyXSkmJm88PXUmJmZbQ08oaCxvLDAsZCldLnB1c2goaVtyXSk7cmV0dXJuIGZ9cmV0dXJuIGkudmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpETyhlKSxpKTp0fSxpLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkRPKFt0WzBdLHRbMV1dKSxpKTplfSxpLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP0RPKE9PLmNhbGwodCkpOkRPKHQpLGkpOm59LGl9LHRocmVzaG9sZEZyZWVkbWFuRGlhY29uaXM6ZnVuY3Rpb24ga2R0KHQsZSxuKXtyZXR1cm4gdD16Ty5jYWxsKHQsTE8pLnNvcnQoTU8pLE1hdGguY2VpbCgobi1lKS8oMioocU8odCwuNzUpLXFPKHQsLjI1KSkqTWF0aC5wb3codC5sZW5ndGgsLTEvMykpKX0sdGhyZXNob2xkU2NvdHQ6ZnVuY3Rpb24gTGR0KHQsZSxuKXtyZXR1cm4gTWF0aC5jZWlsKChuLWUpLygzLjUqTk8odCkqTWF0aC5wb3codC5sZW5ndGgsLTEvMykpKX0sdGhyZXNob2xkU3R1cmdlczpXTyxtYXg6ZnVuY3Rpb24gUGR0KHQsZSl7dmFyIG4saSxyPXQubGVuZ3RoLG89LTE7aWYobnVsbD09ZSl7Zm9yKDsrK288cjspaWYobnVsbCE9KG49dFtvXSkmJm4+PW4pZm9yKGk9bjsrK288cjspbnVsbCE9KG49dFtvXSkmJm4+aSYmKGk9bil9ZWxzZSBmb3IoOysrbzxyOylpZihudWxsIT0obj1lKHRbb10sbyx0KSkmJm4+PW4pZm9yKGk9bjsrK288cjspbnVsbCE9KG49ZSh0W29dLG8sdCkpJiZuPmkmJihpPW4pO3JldHVybiBpfSxtZWFuOmZ1bmN0aW9uIE5kdCh0LGUpe3ZhciBuLGk9dC5sZW5ndGgscj1pLG89LTEsYT0wO2lmKG51bGw9PWUpZm9yKDsrK288aTspaXNOYU4obj1MTyh0W29dKSk/LS1yOmErPW47ZWxzZSBmb3IoOysrbzxpOylpc05hTihuPUxPKGUodFtvXSxvLHQpKSk/LS1yOmErPW47aWYocilyZXR1cm4gYS9yfSxtZWRpYW46ZnVuY3Rpb24gSWR0KHQsZSl7dmFyIG4saT10Lmxlbmd0aCxyPS0xLG89W107aWYobnVsbD09ZSlmb3IoOysrcjxpOylpc05hTihuPUxPKHRbcl0pKXx8by5wdXNoKG4pO2Vsc2UgZm9yKDsrK3I8aTspaXNOYU4obj1MTyhlKHRbcl0scix0KSkpfHxvLnB1c2gobik7cmV0dXJuIHFPKG8uc29ydChNTyksLjUpfSxtZXJnZTpmdW5jdGlvbiBSZHQodCl7Zm9yKHZhciBlLG4saSxyPXQubGVuZ3RoLG89LTEsYT0wOysrbzxyOylhKz10W29dLmxlbmd0aDtmb3Iobj1uZXcgQXJyYXkoYSk7LS1yPj0wOylmb3IoZT0oaT10W3JdKS5sZW5ndGg7LS1lPj0wOyluWy0tYV09aVtlXTtyZXR1cm4gbn0sbWluOllPLHBhaXJzOmZ1bmN0aW9uIE9kdCh0LGUpe251bGw9PWUmJihlPWtPKTtmb3IodmFyIG49MCxpPXQubGVuZ3RoLTEscj10WzBdLG89bmV3IEFycmF5KGk8MD8wOmkpO248aTspb1tuXT1lKHIscj10Wysrbl0pO3JldHVybiBvfSxwZXJtdXRlOmZ1bmN0aW9uIHpkdCh0LGUpe2Zvcih2YXIgbj1lLmxlbmd0aCxpPW5ldyBBcnJheShuKTtuLS07KWlbbl09dFtlW25dXTtyZXR1cm4gaX0scXVhbnRpbGU6cU8scmFuZ2U6SE8sc2NhbjpmdW5jdGlvbiBEZHQodCxlKXtpZihuPXQubGVuZ3RoKXt2YXIgbixpLHI9MCxvPTAsYT10W29dO2ZvcihudWxsPT1lJiYoZT1NTyk7KytyPG47KShlKGk9dFtyXSxhKTwwfHwwIT09ZShhLGEpKSYmKGE9aSxvPXIpO3JldHVybiAwPT09ZShhLGEpP286dm9pZCAwfX0sc2h1ZmZsZTpmdW5jdGlvbiBCZHQodCxlLG4pe2Zvcih2YXIgaSxyLG89KG51bGw9PW4/dC5sZW5ndGg6biktKGU9bnVsbD09ZT8wOitlKTtvOylyPU1hdGgucmFuZG9tKCkqby0tfDAsaT10W28rZV0sdFtvK2VdPXRbcitlXSx0W3IrZV09aTtyZXR1cm4gdH0sc3VtOmZ1bmN0aW9uIEhkdCh0LGUpe3ZhciBuLGk9dC5sZW5ndGgscj0tMSxvPTA7aWYobnVsbD09ZSlmb3IoOysrcjxpOykobj0rdFtyXSkmJihvKz1uKTtlbHNlIGZvcig7KytyPGk7KShuPStlKHRbcl0scix0KSkmJihvKz1uKTtyZXR1cm4gb30sdGlja3M6ZnVuY3Rpb24gRmR0KHQsZSxuKXt2YXIgaSxyLG8sYSxzPS0xO2lmKG49K24sKHQ9K3QpPT0oZT0rZSkmJm4+MClyZXR1cm5bdF07aWYoKGk9ZTx0KSYmKHI9dCx0PWUsZT1yKSwwPT09KGE9ak8odCxlLG4pKXx8IWlzRmluaXRlKGEpKXJldHVybltdO2lmKGE+MClmb3IodD1NYXRoLmNlaWwodC9hKSxlPU1hdGguZmxvb3IoZS9hKSxvPW5ldyBBcnJheShyPU1hdGguY2VpbChlLXQrMSkpOysrczxyOylvW3NdPSh0K3MpKmE7ZWxzZSBmb3IodD1NYXRoLmZsb29yKHQqYSksZT1NYXRoLmNlaWwoZSphKSxvPW5ldyBBcnJheShyPU1hdGguY2VpbCh0LWUrMSkpOysrczxyOylvW3NdPSh0LXMpL2E7cmV0dXJuIGkmJm8ucmV2ZXJzZSgpLG99LHRpY2tJbmNyZW1lbnQ6ak8sdGlja1N0ZXA6R08sdHJhbnNwb3NlOlhPLHZhcmlhbmNlOlBPLHppcDpmdW5jdGlvbiBWZHQoKXtyZXR1cm4gWE8oYXJndW1lbnRzKX0sYXhpc1RvcDpmdW5jdGlvbiBVZHQodCl7cmV0dXJuIHJ6KDEsdCl9LGF4aXNSaWdodDpmdW5jdGlvbiBqZHQodCl7cmV0dXJuIHJ6KDIsdCl9LGF4aXNCb3R0b206ZnVuY3Rpb24gR2R0KHQpe3JldHVybiByeigzLHQpfSxheGlzTGVmdDpmdW5jdGlvbiBXZHQodCl7cmV0dXJuIHJ6KDQsdCl9LGJydXNoOmZ1bmN0aW9uIHFkdCgpe3JldHVybiBLRihIRil9LGJydXNoWDpmdW5jdGlvbiBZZHQoKXtyZXR1cm4gS0YoREYpfSxicnVzaFk6ZnVuY3Rpb24gWGR0KCl7cmV0dXJuIEtGKEJGKX0sYnJ1c2hTZWxlY3Rpb246ZnVuY3Rpb24gJGR0KHQpe3ZhciBlPXQuX19icnVzaDtyZXR1cm4gZT9lLmRpbS5vdXRwdXQoZS5zZWxlY3Rpb24pOm51bGx9LGNob3JkOmZ1bmN0aW9uIEtkdCgpe3ZhciB0PTAsZT1udWxsLG49bnVsbCxpPW51bGw7ZnVuY3Rpb24gcihyKXt2YXIgbyxhLHMsbCxjLHUsaD1yLmxlbmd0aCxkPVtdLHA9SkYoaCksZj1bXSxtPVtdLGc9bS5ncm91cHM9bmV3IEFycmF5KGgpLF89bmV3IEFycmF5KGgqaCk7Zm9yKG89MCxjPS0xOysrYzxoOyl7Zm9yKGE9MCx1PS0xOysrdTxoOylhKz1yW2NdW3VdO2QucHVzaChhKSxmLnB1c2goSkYoaCkpLG8rPWF9Zm9yKGUmJnAuc29ydCgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZShkW3RdLGRbbl0pfSkpLG4mJmYuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt0LnNvcnQoKGZ1bmN0aW9uKHQsaSl7cmV0dXJuIG4ocltlXVt0XSxyW2VdW2ldKX0pKX0pKSxsPShvPW9WKDAsclYtdCpoKS9vKT90OnJWL2gsYT0wLGM9LTE7KytjPGg7KXtmb3Iocz1hLHU9LTE7Kyt1PGg7KXt2YXIgeT1wW2NdLHY9Zlt5XVt1XSxiPXJbeV1bdl0seD1hLHc9YSs9YipvO19bdipoK3ldPXtpbmRleDp5LHN1YmluZGV4OnYsc3RhcnRBbmdsZTp4LGVuZEFuZ2xlOncsdmFsdWU6Yn19Z1t5XT17aW5kZXg6eSxzdGFydEFuZ2xlOnMsZW5kQW5nbGU6YSx2YWx1ZTpkW3ldfSxhKz1sfWZvcihjPS0xOysrYzxoOylmb3IodT1jLTE7Kyt1PGg7KXt2YXIgUz1fW3UqaCtjXSxNPV9bYypoK3VdOyhTLnZhbHVlfHxNLnZhbHVlKSYmbS5wdXNoKFMudmFsdWU8TS52YWx1ZT97c291cmNlOk0sdGFyZ2V0OlN9Ontzb3VyY2U6Uyx0YXJnZXQ6TX0pfXJldHVybiBpP20uc29ydChpKTptfXJldHVybiByLnBhZEFuZ2xlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW9WKDAsZSkscik6dH0sci5zb3J0R3JvdXBzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQscik6ZX0sci5zb3J0U3ViZ3JvdXBzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQscik6bn0sci5zb3J0Q2hvcmRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P2k9bnVsbDooaT1hVih0KSkuXz10LHIpOmkmJmkuX30scn0scmliYm9uOmZ1bmN0aW9uIFpkdCgpe3ZhciB0PW1WLGU9Z1Ysbj1fVixpPXlWLHI9dlYsbz1udWxsO2Z1bmN0aW9uIGEoKXt2YXIgYSxzPXNWLmNhbGwoYXJndW1lbnRzKSxsPXQuYXBwbHkodGhpcyxzKSxjPWUuYXBwbHkodGhpcyxzKSx1PStuLmFwcGx5KHRoaXMsKHNbMF09bCxzKSksaD1pLmFwcGx5KHRoaXMscyktaVYsZD1yLmFwcGx5KHRoaXMscyktaVYscD11KnRWKGgpLGY9dSplVihoKSxtPStuLmFwcGx5KHRoaXMsKHNbMF09YyxzKSksZz1pLmFwcGx5KHRoaXMscyktaVYsXz1yLmFwcGx5KHRoaXMscyktaVY7aWYob3x8KG89YT1mVigpKSxvLm1vdmVUbyhwLGYpLG8uYXJjKDAsMCx1LGgsZCksaD09PWcmJmQ9PT1ffHwoby5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCxtKnRWKGcpLG0qZVYoZykpLG8uYXJjKDAsMCxtLGcsXykpLG8ucXVhZHJhdGljQ3VydmVUbygwLDAscCxmKSxvLmNsb3NlUGF0aCgpLGEpcmV0dXJuIG89bnVsbCxhKyIifHxudWxsfXJldHVybiBhLnJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmxWKCt0KSxhKTpufSxhLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpsVigrdCksYSk6aX0sYS5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmxWKCt0KSxhKTpyfSxhLnNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLGEpOnR9LGEudGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsYSk6ZX0sYS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW51bGw9PXQ/bnVsbDp0LGEpOm99LGF9LG5lc3Q6ZnVuY3Rpb24gSmR0KCl7dmFyIHQsZSxuLGk9W10scj1bXTtmdW5jdGlvbiBvKG4scixhLHMpe2lmKHI+PWkubGVuZ3RoKXJldHVybiBudWxsIT10JiZuLnNvcnQodCksbnVsbCE9ZT9lKG4pOm47Zm9yKHZhciBsLGMsdSxoPS0xLGQ9bi5sZW5ndGgscD1pW3IrK10sZj13VigpLG09YSgpOysraDxkOykodT1mLmdldChsPXAoYz1uW2hdKSsiIikpP3UucHVzaChjKTpmLnNldChsLFtjXSk7cmV0dXJuIGYuZWFjaCgoZnVuY3Rpb24odCxlKXtzKG0sZSxvKHQscixhLHMpKX0pKSxtfWZ1bmN0aW9uIGEodCxuKXtpZigrK24+aS5sZW5ndGgpcmV0dXJuIHQ7dmFyIG8scz1yW24tMV07cmV0dXJuIG51bGwhPWUmJm4+PWkubGVuZ3RoP289dC5lbnRyaWVzKCk6KG89W10sdC5lYWNoKChmdW5jdGlvbih0LGUpe28ucHVzaCh7a2V5OmUsdmFsdWVzOmEodCxuKX0pfSkpKSxudWxsIT1zP28uc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gcyh0LmtleSxlLmtleSl9KSk6b31yZXR1cm4gbj17b2JqZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBvKHQsMCxTVixNVil9LG1hcDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LDAsRVYsVFYpfSxlbnRyaWVzOmZ1bmN0aW9uKHQpe3JldHVybiBhKG8odCwwLEVWLFRWKSwwKX0sa2V5OmZ1bmN0aW9uKHQpe3JldHVybiBpLnB1c2godCksbn0sc29ydEtleXM6ZnVuY3Rpb24odCl7cmV0dXJuIHJbaS5sZW5ndGgtMV09dCxufSxzb3J0VmFsdWVzOmZ1bmN0aW9uKGUpe3JldHVybiB0PWUsbn0scm9sbHVwOmZ1bmN0aW9uKHQpe3JldHVybiBlPXQsbn19fSxzZXQ6a1YsbWFwOndWLGtleXM6ZnVuY3Rpb24gUWR0KHQpe3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KWUucHVzaChuKTtyZXR1cm4gZX0sdmFsdWVzOmZ1bmN0aW9uIHRwdCh0KXt2YXIgZT1bXTtmb3IodmFyIG4gaW4gdCllLnB1c2godFtuXSk7cmV0dXJuIGV9LGVudHJpZXM6ZnVuY3Rpb24gZXB0KHQpe3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KWUucHVzaCh7a2V5Om4sdmFsdWU6dFtuXX0pO3JldHVybiBlfSxjb2xvcjpZVixyZ2I6WlYsaHNsOmVVLGxhYjpkVSxoY2w6dlUsY3ViZWhlbGl4OkVVLGRpc3BhdGNoOkFVLGRyYWc6ZnVuY3Rpb24gbnB0KCl7dmFyIHQsZSxuLGkscj1pRyxvPXJHLGE9b0cscz1hRyxsPXt9LGM9UlUoInN0YXJ0IiwiZHJhZyIsImVuZCIpLHU9MCxoPTA7ZnVuY3Rpb24gZCh0KXt0Lm9uKCJtb3VzZWRvd24uZHJhZyIscCkuZmlsdGVyKHMpLm9uKCJ0b3VjaHN0YXJ0LmRyYWciLGcpLm9uKCJ0b3VjaG1vdmUuZHJhZyIsXykub24oInRvdWNoZW5kLmRyYWcgdG91Y2hjYW5jZWwuZHJhZyIseSkuc3R5bGUoInRvdWNoLWFjdGlvbiIsIm5vbmUiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpfWZ1bmN0aW9uIHAoKXtpZighaSYmci5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBhPXYoIm1vdXNlIixvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwkaix0aGlzLGFyZ3VtZW50cyk7YSYmKHFqKFJqLnZpZXcpLm9uKCJtb3VzZW1vdmUuZHJhZyIsZiwhMCkub24oIm1vdXNldXAuZHJhZyIsbSwhMCksUWooUmoudmlldyksWmooKSxuPSExLHQ9UmouY2xpZW50WCxlPVJqLmNsaWVudFksYSgic3RhcnQiKSl9fWZ1bmN0aW9uIGYoKXtpZihKaigpLCFuKXt2YXIgaT1Sai5jbGllbnRYLXQscj1Sai5jbGllbnRZLWU7bj1pKmkrcipyPmh9bC5tb3VzZSgiZHJhZyIpfWZ1bmN0aW9uIG0oKXtxaihSai52aWV3KS5vbigibW91c2Vtb3ZlLmRyYWcgbW91c2V1cC5kcmFnIixudWxsKSx0RyhSai52aWV3LG4pLEpqKCksbC5tb3VzZSgiZW5kIil9ZnVuY3Rpb24gZygpe2lmKHIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdCxlLG49UmouY2hhbmdlZFRvdWNoZXMsaT1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhPW4ubGVuZ3RoO2Zvcih0PTA7dDxhOysrdCkoZT12KG5bdF0uaWRlbnRpZmllcixpLEtqLHRoaXMsYXJndW1lbnRzKSkmJihaaigpLGUoInN0YXJ0IikpfX1mdW5jdGlvbiBfKCl7dmFyIHQsZSxuPVJqLmNoYW5nZWRUb3VjaGVzLGk9bi5sZW5ndGg7Zm9yKHQ9MDt0PGk7Kyt0KShlPWxbblt0XS5pZGVudGlmaWVyXSkmJihKaigpLGUoImRyYWciKSl9ZnVuY3Rpb24geSgpe3ZhciB0LGUsbj1Sai5jaGFuZ2VkVG91Y2hlcyxyPW4ubGVuZ3RoO2ZvcihpJiZjbGVhclRpbWVvdXQoaSksaT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2k9bnVsbH0pLDUwMCksdD0wO3Q8cjsrK3QpKGU9bFtuW3RdLmlkZW50aWZpZXJdKSYmKFpqKCksZSgiZW5kIikpfWZ1bmN0aW9uIHYodCxlLG4saSxyKXt2YXIgbyxzLGgscD1uKGUsdCksZj1jLmNvcHkoKTtpZihGaihuZXcgbkcoZCwiYmVmb3Jlc3RhcnQiLG8sdCx1LHBbMF0scFsxXSwwLDAsZiksKGZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPShSai5zdWJqZWN0PW89YS5hcHBseShpLHIpKSYmKHM9by54LXBbMF18fDAsaD1vLnktcFsxXXx8MCwhMCl9KSkpcmV0dXJuIGZ1bmN0aW9uIGEoYyl7dmFyIG0sZz1wO3N3aXRjaChjKXtjYXNlInN0YXJ0IjpsW3RdPWEsbT11Kys7YnJlYWs7Y2FzZSJlbmQiOmRlbGV0ZSBsW3RdLC0tdTtjYXNlImRyYWciOnA9bihlLHQpLG09dX1GaihuZXcgbkcoZCxjLG8sdCxtLHBbMF0rcyxwWzFdK2gscFswXS1nWzBdLHBbMV0tZ1sxXSxmKSxmLmFwcGx5LGYsW2MsaSxyXSl9fXJldHVybiBkLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmVHKCEhdCksZCk6cn0sZC5jb250YWluZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDplRyh0KSxkKTpvfSxkLnN1YmplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDplRyh0KSxkKTphfSxkLnRvdWNoYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmVHKCEhdCksZCk6c30sZC5vbj1mdW5jdGlvbigpe3ZhciB0PWMub24uYXBwbHkoYyxhcmd1bWVudHMpO3JldHVybiB0PT09Yz9kOnR9LGQuY2xpY2tEaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0odD0rdCkqdCxkKTpNYXRoLnNxcnQoaCl9LGR9LGRyYWdEaXNhYmxlOlFqLGRyYWdFbmFibGU6dEcsZHN2Rm9ybWF0OlZHLGNzdlBhcnNlOmpHLGNzdlBhcnNlUm93czpHRyxjc3ZGb3JtYXQ6V0csY3N2Rm9ybWF0Um93czpxRyx0c3ZQYXJzZTpYRyx0c3ZQYXJzZVJvd3M6JEcsdHN2Rm9ybWF0OktHLHRzdkZvcm1hdFJvd3M6WkcsZWFzZUxpbmVhcjpmdW5jdGlvbiBpcHQodCl7cmV0dXJuK3R9LGVhc2VRdWFkOkpHLGVhc2VRdWFkSW46ZnVuY3Rpb24gcnB0KHQpe3JldHVybiB0KnR9LGVhc2VRdWFkT3V0OmZ1bmN0aW9uIG9wdCh0KXtyZXR1cm4gdCooMi10KX0sZWFzZVF1YWRJbk91dDpKRyxlYXNlQ3ViaWM6UUcsZWFzZUN1YmljSW46ZnVuY3Rpb24gYXB0KHQpe3JldHVybiB0KnQqdH0sZWFzZUN1YmljT3V0OmZ1bmN0aW9uIHNwdCh0KXtyZXR1cm4tLXQqdCp0KzF9LGVhc2VDdWJpY0luT3V0OlFHLGVhc2VQb2x5Om5XLGVhc2VQb2x5SW46dFcsZWFzZVBvbHlPdXQ6ZVcsZWFzZVBvbHlJbk91dDpuVyxlYXNlU2luOm9XLGVhc2VTaW5JbjpmdW5jdGlvbiBscHQodCl7cmV0dXJuIDEtTWF0aC5jb3ModCpyVyl9LGVhc2VTaW5PdXQ6ZnVuY3Rpb24gY3B0KHQpe3JldHVybiBNYXRoLnNpbih0KnJXKX0sZWFzZVNpbkluT3V0Om9XLGVhc2VFeHA6YVcsZWFzZUV4cEluOmZ1bmN0aW9uIHVwdCh0KXtyZXR1cm4gTWF0aC5wb3coMiwxMCp0LTEwKX0sZWFzZUV4cE91dDpmdW5jdGlvbiBocHQodCl7cmV0dXJuIDEtTWF0aC5wb3coMiwtMTAqdCl9LGVhc2VFeHBJbk91dDphVyxlYXNlQ2lyY2xlOnNXLGVhc2VDaXJjbGVJbjpmdW5jdGlvbiBkcHQodCl7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtdCp0KX0sZWFzZUNpcmNsZU91dDpmdW5jdGlvbiBwcHQodCl7cmV0dXJuIE1hdGguc3FydCgxLSAtLXQqdCl9LGVhc2VDaXJjbGVJbk91dDpzVyxlYXNlQm91bmNlOmNXLGVhc2VCb3VuY2VJbjpmdW5jdGlvbiBmcHQodCl7cmV0dXJuIDEtY1coMS10KX0sZWFzZUJvdW5jZU91dDpjVyxlYXNlQm91bmNlSW5PdXQ6ZnVuY3Rpb24gbXB0KHQpe3JldHVybigodCo9Mik8PTE/MS1jVygxLXQpOmNXKHQtMSkrMSkvMn0sZWFzZUJhY2s6cFcsZWFzZUJhY2tJbjpoVyxlYXNlQmFja091dDpkVyxlYXNlQmFja0luT3V0OnBXLGVhc2VFbGFzdGljOmdXLGVhc2VFbGFzdGljSW46bVcsZWFzZUVsYXN0aWNPdXQ6Z1csZWFzZUVsYXN0aWNJbk91dDpfVyxmb3JjZUNlbnRlcjpmdW5jdGlvbiBncHQodCxlKXt2YXIgbjtmdW5jdGlvbiBpKCl7dmFyIGkscixvPW4ubGVuZ3RoLGE9MCxzPTA7Zm9yKGk9MDtpPG87KytpKWErPShyPW5baV0pLngscys9ci55O2ZvcihhPWEvby10LHM9cy9vLWUsaT0wO2k8bzsrK2kpKHI9bltpXSkueC09YSxyLnktPXN9cmV0dXJuIG51bGw9PXQmJih0PTApLG51bGw9PWUmJihlPTApLGkuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtuPXR9LGkueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rZSxpKTp0fSxpLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3QsaSk6ZX0saX0sZm9yY2VDb2xsaWRlOmZ1bmN0aW9uIF9wdCh0KXt2YXIgZSxuLGk9MSxyPTE7ZnVuY3Rpb24gbygpe2Zvcih2YXIgdCxvLHMsbCxjLHUsaCxkPWUubGVuZ3RoLHA9MDtwPHI7KytwKWZvcihvPU1XKGUsQVcsa1cpLnZpc2l0QWZ0ZXIoYSksdD0wO3Q8ZDsrK3QpaD0odT1uWyhzPWVbdF0pLmluZGV4XSkqdSxsPXMueCtzLnZ4LGM9cy55K3Mudnksby52aXNpdChmKTtmdW5jdGlvbiBmKHQsZSxuLHIsbyl7dmFyIGE9dC5kYXRhLGQ9dC5yLHA9dStkO2lmKCFhKXJldHVybiBlPmwrcHx8cjxsLXB8fG4+YytwfHxvPGMtcDtpZihhLmluZGV4PnMuaW5kZXgpe3ZhciBmPWwtYS54LWEudngsbT1jLWEueS1hLnZ5LGc9ZipmK20qbTtnPHAqcCYmKDA9PT1mJiYoZys9KGY9dlcoKSkqZiksMD09PW0mJihnKz0obT12VygpKSptKSxnPShwLShnPU1hdGguc3FydChnKSkpL2cqaSxzLnZ4Kz0oZio9ZykqKHA9KGQqPWQpLyhoK2QpKSxzLnZ5Kz0obSo9ZykqcCxhLnZ4LT1mKihwPTEtcCksYS52eS09bSpwKX19fWZ1bmN0aW9uIGEodCl7aWYodC5kYXRhKXJldHVybiB0LnI9blt0LmRhdGEuaW5kZXhdO2Zvcih2YXIgZT10LnI9MDtlPDQ7KytlKXRbZV0mJnRbZV0ucj50LnImJih0LnI9dFtlXS5yKX1mdW5jdGlvbiBzKCl7aWYoZSl7dmFyIGkscixvPWUubGVuZ3RoO2ZvcihuPW5ldyBBcnJheShvKSxpPTA7aTxvOysraSluWyhyPWVbaV0pLmluZGV4XT0rdChyLGksZSl9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD15VyhudWxsPT10PzE6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7ZT10LHMoKX0sby5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0LG8pOnJ9LG8uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3Qsbyk6aX0sby5yYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTp5VygrZSkscygpLG8pOnR9LG99LGZvcmNlTGluazpmdW5jdGlvbiB5cHQodCl7dmFyIGUsbixpLHIsbyxhPSRXLHM9ZnVuY3Rpb24gbCh0KXtyZXR1cm4gMS9NYXRoLm1pbihyW3Quc291cmNlLmluZGV4XSxyW3QudGFyZ2V0LmluZGV4XSl9LGM9eVcoMzApLHU9MTtmdW5jdGlvbiBoKGkpe2Zvcih2YXIgcj0wLGE9dC5sZW5ndGg7cjx1Oysrcilmb3IodmFyIHMsbCxjLGgsZCxwLGYsbT0wO208YTsrK20paD0oYz0ocz10W21dKS50YXJnZXQpLngrYy52eC0obD1zLnNvdXJjZSkueC1sLnZ4fHx2VygpLGQ9Yy55K2MudnktbC55LWwudnl8fHZXKCksZCo9cD0oKHA9TWF0aC5zcXJ0KGgqaCtkKmQpKS1uW21dKS9wKmkqZVttXSxjLnZ4LT0oaCo9cCkqKGY9b1ttXSksYy52eS09ZCpmLGwudngrPWgqKGY9MS1mKSxsLnZ5Kz1kKmZ9ZnVuY3Rpb24gZCgpe2lmKGkpe3ZhciBzLGwsYz1pLmxlbmd0aCx1PXQubGVuZ3RoLGg9cVcoaSxhKTtmb3Iocz0wLHI9bmV3IEFycmF5KGMpO3M8dTsrK3MpKGw9dFtzXSkuaW5kZXg9cywib2JqZWN0IiE9dHlwZW9mIGwuc291cmNlJiYobC5zb3VyY2U9S1coaCxsLnNvdXJjZSkpLCJvYmplY3QiIT10eXBlb2YgbC50YXJnZXQmJihsLnRhcmdldD1LVyhoLGwudGFyZ2V0KSkscltsLnNvdXJjZS5pbmRleF09KHJbbC5zb3VyY2UuaW5kZXhdfHwwKSsxLHJbbC50YXJnZXQuaW5kZXhdPShyW2wudGFyZ2V0LmluZGV4XXx8MCkrMTtmb3Iocz0wLG89bmV3IEFycmF5KHUpO3M8dTsrK3Mpb1tzXT1yWyhsPXRbc10pLnNvdXJjZS5pbmRleF0vKHJbbC5zb3VyY2UuaW5kZXhdK3JbbC50YXJnZXQuaW5kZXhdKTtlPW5ldyBBcnJheSh1KSxwKCksbj1uZXcgQXJyYXkodSksZigpfX1mdW5jdGlvbiBwKCl7aWYoaSlmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjsrK24pZVtuXT0rcyh0W25dLG4sdCl9ZnVuY3Rpb24gZigpe2lmKGkpZm9yKHZhciBlPTAscj10Lmxlbmd0aDtlPHI7KytlKW5bZV09K2ModFtlXSxlLHQpfXJldHVybiBudWxsPT10JiYodD1bXSksaC5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2k9dCxkKCl9LGgubGlua3M9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxkKCksaCk6dH0saC5pZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT10LGgpOmF9LGguaXRlcmF0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0rdCxoKTp1fSxoLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eVcoK3QpLHAoKSxoKTpzfSxoLmRpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eVcoK3QpLGYoKSxoKTpjfSxofSxmb3JjZU1hbnlCb2R5OmZ1bmN0aW9uIHZwdCgpe3ZhciB0LGUsbixpLHI9eVcoLTMwKSxvPTEsYT0xLzAscz0uODE7ZnVuY3Rpb24gbChpKXt2YXIgcixvPXQubGVuZ3RoLGE9TVcodCxicSx4cSkudmlzaXRBZnRlcih1KTtmb3Iobj1pLHI9MDtyPG87KytyKWU9dFtyXSxhLnZpc2l0KGgpfWZ1bmN0aW9uIGMoKXtpZih0KXt2YXIgZSxuLG89dC5sZW5ndGg7Zm9yKGk9bmV3IEFycmF5KG8pLGU9MDtlPG87KytlKWlbKG49dFtlXSkuaW5kZXhdPStyKG4sZSx0KX19ZnVuY3Rpb24gdSh0KXt2YXIgZSxuLHIsbyxhLHM9MCxsPTA7aWYodC5sZW5ndGgpe2ZvcihyPW89YT0wO2E8NDsrK2EpKGU9dFthXSkmJihuPU1hdGguYWJzKGUudmFsdWUpKSYmKHMrPWUudmFsdWUsbCs9bixyKz1uKmUueCxvKz1uKmUueSk7dC54PXIvbCx0Lnk9by9sfWVsc2V7KGU9dCkueD1lLmRhdGEueCxlLnk9ZS5kYXRhLnk7ZG97cys9aVtlLmRhdGEuaW5kZXhdfXdoaWxlKGU9ZS5uZXh0KX10LnZhbHVlPXN9ZnVuY3Rpb24gaCh0LHIsbCxjKXtpZighdC52YWx1ZSlyZXR1cm4hMDt2YXIgdT10LngtZS54LGg9dC55LWUueSxkPWMtcixwPXUqdStoKmg7aWYoZCpkL3M8cClyZXR1cm4gcDxhJiYoMD09PXUmJihwKz0odT12VygpKSp1KSwwPT09aCYmKHArPShoPXZXKCkpKmgpLHA8byYmKHA9TWF0aC5zcXJ0KG8qcCkpLGUudngrPXUqdC52YWx1ZSpuL3AsZS52eSs9aCp0LnZhbHVlKm4vcCksITA7aWYoISh0Lmxlbmd0aHx8cD49YSkpeyh0LmRhdGEhPT1lfHx0Lm5leHQpJiYoMD09PXUmJihwKz0odT12VygpKSp1KSwwPT09aCYmKHArPShoPXZXKCkpKmgpLHA8byYmKHA9TWF0aC5zcXJ0KG8qcCkpKTtkb3t0LmRhdGEhPT1lJiYoZS52eCs9dSooZD1pW3QuZGF0YS5pbmRleF0qbi9wKSxlLnZ5Kz1oKmQpfXdoaWxlKHQ9dC5uZXh0KX19cmV0dXJuIGwuaW5pdGlhbGl6ZT1mdW5jdGlvbihlKXt0PWUsYygpfSxsLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eVcoK3QpLGMoKSxsKTpyfSxsLmRpc3RhbmNlTWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQqdCxsKTpNYXRoLnNxcnQobyl9LGwuZGlzdGFuY2VNYXg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCp0LGwpOk1hdGguc3FydChhKX0sbC50aGV0YT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz10KnQsbCk6TWF0aC5zcXJ0KHMpfSxsfSxmb3JjZVJhZGlhbDpmdW5jdGlvbiBicHQodCxlLG4pe3ZhciBpLHIsbyxhPXlXKC4xKTtmdW5jdGlvbiBzKHQpe2Zvcih2YXIgYT0wLHM9aS5sZW5ndGg7YTxzOysrYSl7dmFyIGw9aVthXSxjPWwueC1lfHwxZS02LHU9bC55LW58fDFlLTYsaD1NYXRoLnNxcnQoYypjK3UqdSksZD0ob1thXS1oKSpyW2FdKnQvaDtsLnZ4Kz1jKmQsbC52eSs9dSpkfX1mdW5jdGlvbiBsKCl7aWYoaSl7dmFyIGUsbj1pLmxlbmd0aDtmb3Iocj1uZXcgQXJyYXkobiksbz1uZXcgQXJyYXkobiksZT0wO2U8bjsrK2Upb1tlXT0rdChpW2VdLGUsaSkscltlXT1pc05hTihvW2VdKT8wOithKGlbZV0sZSxpKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXlXKCt0KSksbnVsbD09ZSYmKGU9MCksbnVsbD09biYmKG49MCkscy5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2k9dCxsKCl9LHMuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5VygrdCksbCgpLHMpOmF9LHMucmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6eVcoK2UpLGwoKSxzKTp0fSxzLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3Qscyk6ZX0scy55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0LHMpOm59LHN9LGZvcmNlU2ltdWxhdGlvbjpmdW5jdGlvbiB4cHQodCl7dmFyIGUsbj0xLGk9LjAwMSxyPTEtTWF0aC5wb3coaSwxLzMwMCksbz0wLGE9LjYscz1xVygpLGw9Z3EodSksYz1KVygidGljayIsImVuZCIpO2Z1bmN0aW9uIHUoKXtoKCksYy5jYWxsKCJ0aWNrIixlKSxuPGkmJihsLnN0b3AoKSxjLmNhbGwoImVuZCIsZSkpfWZ1bmN0aW9uIGgoKXt2YXIgZSxpLGw9dC5sZW5ndGg7Zm9yKG4rPShvLW4pKnIscy5lYWNoKChmdW5jdGlvbih0KXt0KG4pfSkpLGU9MDtlPGw7KytlKW51bGw9PShpPXRbZV0pLmZ4P2kueCs9aS52eCo9YTooaS54PWkuZngsaS52eD0wKSxudWxsPT1pLmZ5P2kueSs9aS52eSo9YTooaS55PWkuZnksaS52eT0wKX1mdW5jdGlvbiBkKCl7Zm9yKHZhciBlLG49MCxpPXQubGVuZ3RoO248aTsrK24pe2lmKChlPXRbbl0pLmluZGV4PW4saXNOYU4oZS54KXx8aXNOYU4oZS55KSl7dmFyIHI9MTAqTWF0aC5zcXJ0KG4pLG89bipTcTtlLng9cipNYXRoLmNvcyhvKSxlLnk9cipNYXRoLnNpbihvKX0oaXNOYU4oZS52eCl8fGlzTmFOKGUudnkpKSYmKGUudng9ZS52eT0wKX19ZnVuY3Rpb24gcChlKXtyZXR1cm4gZS5pbml0aWFsaXplJiZlLmluaXRpYWxpemUodCksZX1yZXR1cm4gbnVsbD09dCYmKHQ9W10pLGQoKSxlPXt0aWNrOmgscmVzdGFydDpmdW5jdGlvbigpe3JldHVybiBsLnJlc3RhcnQodSksZX0sc3RvcDpmdW5jdGlvbigpe3JldHVybiBsLnN0b3AoKSxlfSxub2RlczpmdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGQoKSxzLmVhY2gocCksZSk6dH0sYWxwaGE6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3QsZSk6bn0sYWxwaGFNaW46ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3QsZSk6aX0sYWxwaGFEZWNheTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxlKTorcn0sYWxwaGFUYXJnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3QsZSk6b30sdmVsb2NpdHlEZWNheTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0xLXQsZSk6MS1hfSxmb3JjZTpmdW5jdGlvbih0LG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/KG51bGw9PW4/cy5yZW1vdmUodCk6cy5zZXQodCxwKG4pKSxlKTpzLmdldCh0KX0sZmluZDpmdW5jdGlvbihlLG4saSl7dmFyIHIsbyxhLHMsbCxjPTAsdT10Lmxlbmd0aDtmb3IobnVsbD09aT9pPTEvMDppKj1pLGM9MDtjPHU7KytjKShhPShyPWUtKHM9dFtjXSkueCkqcisobz1uLXMueSkqbyk8aSYmKGw9cyxpPWEpO3JldHVybiBsfSxvbjpmdW5jdGlvbih0LG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/KGMub24odCxuKSxlKTpjLm9uKHQpfX19LGZvcmNlWDpmdW5jdGlvbiB3cHQodCl7dmFyIGUsbixpLHI9eVcoLjEpO2Z1bmN0aW9uIG8odCl7Zm9yKHZhciByLG89MCxhPWUubGVuZ3RoO288YTsrK28pKHI9ZVtvXSkudngrPShpW29dLXIueCkqbltvXSp0fWZ1bmN0aW9uIGEoKXtpZihlKXt2YXIgbyxhPWUubGVuZ3RoO2ZvcihuPW5ldyBBcnJheShhKSxpPW5ldyBBcnJheShhKSxvPTA7bzxhOysrbyluW29dPWlzTmFOKGlbb109K3QoZVtvXSxvLGUpKT8wOityKGVbb10sbyxlKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXlXKG51bGw9PXQ/MDordCkpLG8uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtlPXQsYSgpfSxvLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eVcoK3QpLGEoKSxvKTpyfSxvLng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTp5VygrZSksYSgpLG8pOnR9LG99LGZvcmNlWTpmdW5jdGlvbiBTcHQodCl7dmFyIGUsbixpLHI9eVcoLjEpO2Z1bmN0aW9uIG8odCl7Zm9yKHZhciByLG89MCxhPWUubGVuZ3RoO288YTsrK28pKHI9ZVtvXSkudnkrPShpW29dLXIueSkqbltvXSp0fWZ1bmN0aW9uIGEoKXtpZihlKXt2YXIgbyxhPWUubGVuZ3RoO2ZvcihuPW5ldyBBcnJheShhKSxpPW5ldyBBcnJheShhKSxvPTA7bzxhOysrbyluW29dPWlzTmFOKGlbb109K3QoZVtvXSxvLGUpKT8wOityKGVbb10sbyxlKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXlXKG51bGw9PXQ/MDordCkpLG8uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtlPXQsYSgpfSxvLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eVcoK3QpLGEoKSxvKTpyfSxvLnk9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTp5VygrZSksYSgpLG8pOnR9LG99LGZvcm1hdERlZmF1bHRMb2NhbGU6SHEsZ2V0IGZvcm1hdCgpe3JldHVybiBPcX0sZ2V0IGZvcm1hdFByZWZpeCgpe3JldHVybiB6cX0sZm9ybWF0TG9jYWxlOkJxLGZvcm1hdFNwZWNpZmllcjpQcSxwcmVjaXNpb25GaXhlZDpmdW5jdGlvbiBNcHQodCl7cmV0dXJuIE1hdGgubWF4KDAsLUVxKE1hdGguYWJzKHQpKSl9LHByZWNpc2lvblByZWZpeDpmdW5jdGlvbiBFcHQodCxlKXtyZXR1cm4gTWF0aC5tYXgoMCwzKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihFcShlKS8zKSkpLUVxKE1hdGguYWJzKHQpKSl9LHByZWNpc2lvblJvdW5kOmZ1bmN0aW9uIFRwdCh0LGUpe3JldHVybiB0PU1hdGguYWJzKHQpLGU9TWF0aC5hYnMoZSktdCxNYXRoLm1heCgwLEVxKGUpLUVxKHQpKSsxfSxnZW9BcmVhOmZ1bmN0aW9uIENwdCh0KXtyZXR1cm4gRVkucmVzZXQoKSx5WSh0LFRZKSwyKkVZfSxnZW9Cb3VuZHM6ZnVuY3Rpb24gQXB0KHQpe3ZhciBlLG4saSxyLG8sYSxzO2lmKFZZPUZZPS0oQlk9SFk9MS8wKSxxWT1bXSx5WSh0LGhYKSxuPXFZLmxlbmd0aCl7Zm9yKHFZLnNvcnQoYlgpLGU9MSxvPVtpPXFZWzBdXTtlPG47KytlKXhYKGksKHI9cVlbZV0pWzBdKXx8eFgoaSxyWzFdKT8odlgoaVswXSxyWzFdKT52WChpWzBdLGlbMV0pJiYoaVsxXT1yWzFdKSx2WChyWzBdLGlbMV0pPnZYKGlbMF0saVsxXSkmJihpWzBdPXJbMF0pKTpvLnB1c2goaT1yKTtmb3IoYT0tMS8wLGU9MCxpPW9bbj1vLmxlbmd0aC0xXTtlPD1uO2k9ciwrK2UpKHM9dlgoaVsxXSwocj1vW2VdKVswXSkpPmEmJihhPXMsQlk9clswXSxGWT1pWzFdKX1yZXR1cm4gcVk9WVk9bnVsbCxCWT09PTEvMHx8SFk9PT0xLzA/W1tOYU4sTmFOXSxbTmFOLE5hTl1dOltbQlksSFldLFtGWSxWWV1dfSxnZW9DZW50cm9pZDpmdW5jdGlvbiBrcHQodCl7WFk9JFk9S1k9Wlk9Slk9UVk9dFg9ZVg9blg9aVg9clg9MCx5WSh0LHdYKTt2YXIgZT1uWCxuPWlYLGk9clgscj1lKmUrbipuK2kqaTtyZXR1cm4gcjwxZS0xMiYmKGU9UVksbj10WCxpPWVYLCRZPEdxJiYoZT1LWSxuPVpZLGk9SlkpLChyPWUqZStuKm4raSppKTwxZS0xMik/W05hTixOYU5dOltRcShuLGUpKiRxLHVZKGkvc1kocikpKiRxXX0sZ2VvQ2lyY2xlOmZ1bmN0aW9uIExwdCgpe3ZhciB0LGUsbj1JWChbMCwwXSksaT1JWCg5MCkscj1JWCg2KSxvPXtwb2ludDpmdW5jdGlvbiBhKG4saSl7dC5wdXNoKG49ZShuLGkpKSxuWzBdKj0kcSxuWzFdKj0kcX19O2Z1bmN0aW9uIHMoKXt2YXIgYT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxzPWkuYXBwbHkodGhpcyxhcmd1bWVudHMpKktxLGw9ci5hcHBseSh0aGlzLGFyZ3VtZW50cykqS3E7cmV0dXJuIHQ9W10sZT16WCgtYVswXSpLcSwtYVsxXSpLcSwwKS5pbnZlcnQsVlgobyxzLGwsMSksYT17dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3RdfSx0PWU9bnVsbCxhfXJldHVybiBzLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OklYKFsrdFswXSwrdFsxXV0pLHMpOm59LHMucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SVgoK3QpLHMpOml9LHMucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SVgoK3QpLHMpOnJ9LHN9LGdlb0NsaXBBbnRpbWVyaWRpYW46aSQsZ2VvQ2xpcENpcmNsZTphJCxnZW9DbGlwRXh0ZW50OmZ1bmN0aW9uIFBwdCgpe3ZhciB0LGUsbixpPTAscj0wLG89OTYwLGE9NTAwO3JldHVybiBuPXtzdHJlYW06ZnVuY3Rpb24obil7cmV0dXJuIHQmJmU9PT1uP3Q6dD1jJChpLHIsbyxhKShlPW4pfSxleHRlbnQ6ZnVuY3Rpb24ocyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3NbMF1bMF0scj0rc1swXVsxXSxvPStzWzFdWzBdLGE9K3NbMV1bMV0sdD1lPW51bGwsbik6W1tpLHJdLFtvLGFdXX19fSxnZW9DbGlwUmVjdGFuZ2xlOmMkLGdlb0NvbnRhaW5zOmZ1bmN0aW9uIE5wdCh0LGUpe3JldHVybih0JiZTJC5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpP1MkW3QudHlwZV06RSQpKHQsZSl9LGdlb0Rpc3RhbmNlOnckLGdlb0dyYXRpY3VsZTpJJCxnZW9HcmF0aWN1bGUxMDpmdW5jdGlvbiBJcHQoKXtyZXR1cm4gSSQoKSgpfSxnZW9JbnRlcnBvbGF0ZTpmdW5jdGlvbiBScHQodCxlKXt2YXIgbj10WzBdKktxLGk9dFsxXSpLcSxyPWVbMF0qS3Esbz1lWzFdKktxLGE9dFkoaSkscz1vWShpKSxsPXRZKG8pLGM9b1kobyksdT1hKnRZKG4pLGg9YSpvWShuKSxkPWwqdFkocikscD1sKm9ZKHIpLGY9Mip1WShzWShoWShvLWkpK2EqbCpoWShyLW4pKSksbT1vWShmKSxnPWY/ZnVuY3Rpb24odCl7dmFyIGU9b1kodCo9ZikvbSxuPW9ZKGYtdCkvbSxpPW4qdStlKmQscj1uKmgrZSpwLG89bipzK2UqYztyZXR1cm5bUXEocixpKSokcSxRcShvLHNZKGkqaStyKnIpKSokcV19OmZ1bmN0aW9uKCl7cmV0dXJuW24qJHEsaSokcV19O3JldHVybiBnLmRpc3RhbmNlPWYsZ30sZ2VvTGVuZ3RoOnYkLGdlb1BhdGg6ZnVuY3Rpb24gT3B0KHQsZSl7dmFyIG4saSxyPTQuNTtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHImJmkucG9pbnRSYWRpdXMoK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKSx5WSh0LG4oaSkpKSxpLnJlc3VsdCgpfXJldHVybiBvLmFyZWE9ZnVuY3Rpb24odCl7cmV0dXJuIHlZKHQsbihWJCkpLFYkLnJlc3VsdCgpfSxvLm1lYXN1cmU9ZnVuY3Rpb24odCl7cmV0dXJuIHlZKHQsbihBSykpLEFLLnJlc3VsdCgpfSxvLmJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4geVkodCxuKHRLKSksdEsucmVzdWx0KCl9LG8uY2VudHJvaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHlZKHQsbihoSykpLGhLLnJlc3VsdCgpfSxvLnByb2plY3Rpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09ZT8odD1udWxsLFIkKToodD1lKS5zdHJlYW0sbyk6dH0sby5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/KGU9bnVsbCxuZXcgUEspOm5ldyB4SyhlPXQpLCJmdW5jdGlvbiIhPXR5cGVvZiByJiZpLnBvaW50UmFkaXVzKHIpLG8pOmV9LG8ucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooaS5wb2ludFJhZGl1cygrdCksK3QpLG8pOnJ9LG8ucHJvamVjdGlvbih0KS5jb250ZXh0KGUpfSxnZW9BbGJlcnM6WEssZ2VvQWxiZXJzVXNhOmZ1bmN0aW9uIHpwdCgpe3ZhciB0LGUsbixpLHIsbyxhPVhLKCkscz1ZSygpLnJvdGF0ZShbMTU0LDBdKS5jZW50ZXIoWy0yLDU4LjVdKS5wYXJhbGxlbHMoWzU1LDY1XSksbD1ZSygpLnJvdGF0ZShbMTU3LDBdKS5jZW50ZXIoWy0zLDE5LjldKS5wYXJhbGxlbHMoWzgsMThdKSxjPXtwb2ludDpmdW5jdGlvbih0LGUpe289W3QsZV19fTtmdW5jdGlvbiB1KHQpe3ZhciBlPXRbMF0sYT10WzFdO3JldHVybiBvPW51bGwsbi5wb2ludChlLGEpLG98fChpLnBvaW50KGUsYSksbyl8fChyLnBvaW50KGUsYSksbyl9ZnVuY3Rpb24gaCgpe3JldHVybiB0PWU9bnVsbCx1fXJldHVybiB1LmludmVydD1mdW5jdGlvbih0KXt2YXIgZT1hLnNjYWxlKCksbj1hLnRyYW5zbGF0ZSgpLGk9KHRbMF0tblswXSkvZSxyPSh0WzFdLW5bMV0pL2U7cmV0dXJuKHI+PS4xMiYmcjwuMjM0JiZpPj0tLjQyNSYmaTwtLjIxND9zOnI+PS4xNjYmJnI8LjIzNCYmaT49LS4yMTQmJmk8LS4xMTU/bDphKS5pbnZlcnQodCl9LHUuc3RyZWFtPWZ1bmN0aW9uKG4pe3JldHVybiB0JiZlPT09bj90OnQ9KGZ1bmN0aW9uIGkodCl7dmFyIGU9dC5sZW5ndGg7cmV0dXJue3BvaW50OmZ1bmN0aW9uKG4saSl7Zm9yKHZhciByPS0xOysrcjxlOyl0W3JdLnBvaW50KG4saSl9LHNwaGVyZTpmdW5jdGlvbigpe2Zvcih2YXIgbj0tMTsrK248ZTspdFtuXS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciBuPS0xOysrbjxlOyl0W25dLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciBuPS0xOysrbjxlOyl0W25dLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciBuPS0xOysrbjxlOyl0W25dLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciBuPS0xOysrbjxlOyl0W25dLnBvbHlnb25FbmQoKX19fSkoW2Euc3RyZWFtKGU9bikscy5zdHJlYW0obiksbC5zdHJlYW0obildKX0sdS5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGEucHJlY2lzaW9uKHQpLHMucHJlY2lzaW9uKHQpLGwucHJlY2lzaW9uKHQpLGgoKSk6YS5wcmVjaXNpb24oKX0sdS5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYS5zY2FsZSh0KSxzLnNjYWxlKC4zNSp0KSxsLnNjYWxlKHQpLHUudHJhbnNsYXRlKGEudHJhbnNsYXRlKCkpKTphLnNjYWxlKCl9LHUudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBhLnRyYW5zbGF0ZSgpO3ZhciBlPWEuc2NhbGUoKSxvPSt0WzBdLHU9K3RbMV07cmV0dXJuIG49YS50cmFuc2xhdGUodCkuY2xpcEV4dGVudChbW28tLjQ1NSplLHUtLjIzOCplXSxbbysuNDU1KmUsdSsuMjM4KmVdXSkuc3RyZWFtKGMpLGk9cy50cmFuc2xhdGUoW28tLjMwNyplLHUrLjIwMSplXSkuY2xpcEV4dGVudChbW28tLjQyNSplK0dxLHUrLjEyKmUrR3FdLFtvLS4yMTQqZS1HcSx1Ky4yMzQqZS1HcV1dKS5zdHJlYW0oYykscj1sLnRyYW5zbGF0ZShbby0uMjA1KmUsdSsuMjEyKmVdKS5jbGlwRXh0ZW50KFtbby0uMjE0KmUrR3EsdSsuMTY2KmUrR3FdLFtvLS4xMTUqZS1HcSx1Ky4yMzQqZS1HcV1dKS5zdHJlYW0oYyksaCgpfSx1LmZpdEV4dGVudD1mdW5jdGlvbih0LGUpe3JldHVybiB6Syh1LHQsZSl9LHUuZml0U2l6ZT1mdW5jdGlvbih0LGUpe3JldHVybiBESyh1LHQsZSl9LHUuZml0V2lkdGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gQksodSx0LGUpfSx1LmZpdEhlaWdodD1mdW5jdGlvbih0LGUpe3JldHVybiBISyh1LHQsZSl9LHUuc2NhbGUoMTA3MCl9LGdlb0F6aW11dGhhbEVxdWFsQXJlYTpmdW5jdGlvbiBEcHQoKXtyZXR1cm4gaksoWkspLnNjYWxlKDEyNC43NSkuY2xpcEFuZ2xlKDE3OS45OTkpfSxnZW9BemltdXRoYWxFcXVhbEFyZWFSYXc6WkssZ2VvQXppbXV0aGFsRXF1aWRpc3RhbnQ6ZnVuY3Rpb24gQnB0KCl7cmV0dXJuIGpLKEpLKS5zY2FsZSg3OS40MTg4KS5jbGlwQW5nbGUoMTc5Ljk5OSl9LGdlb0F6aW11dGhhbEVxdWlkaXN0YW50UmF3OkpLLGdlb0NvbmljQ29uZm9ybWFsOmZ1bmN0aW9uIEhwdCgpe3JldHVybiBXSyhuWikuc2NhbGUoMTA5LjUpLnBhcmFsbGVscyhbMzAsMzBdKX0sZ2VvQ29uaWNDb25mb3JtYWxSYXc6blosZ2VvQ29uaWNFcXVhbEFyZWE6WUssZ2VvQ29uaWNFcXVhbEFyZWFSYXc6cUssZ2VvQ29uaWNFcXVpZGlzdGFudDpmdW5jdGlvbiBGcHQoKXtyZXR1cm4gV0soclopLnNjYWxlKDEzMS4xNTQpLmNlbnRlcihbMCwxMy45Mzg5XSl9LGdlb0NvbmljRXF1aWRpc3RhbnRSYXc6closZ2VvRXF1aXJlY3Rhbmd1bGFyOmZ1bmN0aW9uIFZwdCgpe3JldHVybiBqSyhpWikuc2NhbGUoMTUyLjYzKX0sZ2VvRXF1aXJlY3Rhbmd1bGFyUmF3OmlaLGdlb0dub21vbmljOmZ1bmN0aW9uIFVwdCgpe3JldHVybiBqSyhvWikuc2NhbGUoMTQ0LjA0OSkuY2xpcEFuZ2xlKDYwKX0sZ2VvR25vbW9uaWNSYXc6b1osZ2VvSWRlbnRpdHk6ZnVuY3Rpb24ganB0KCl7dmFyIHQsZSxuLGkscixvLGE9MSxzPTAsbD0wLGM9MSx1PTEsaD1SJCxkPW51bGwscD1SJDtmdW5jdGlvbiBmKCl7cmV0dXJuIGk9cj1udWxsLG99cmV0dXJuIG89e3N0cmVhbTpmdW5jdGlvbih0KXtyZXR1cm4gaSYmcj09PXQ/aTppPWgocChyPXQpKX0scG9zdGNsaXA6ZnVuY3Rpb24oaSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9aSxkPXQ9ZT1uPW51bGwsZigpKTpwfSxjbGlwRXh0ZW50OmZ1bmN0aW9uKGkpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPW51bGw9PWk/KGQ9dD1lPW49bnVsbCxSJCk6YyQoZD0raVswXVswXSx0PStpWzBdWzFdLGU9K2lbMV1bMF0sbj0raVsxXVsxXSksZigpKTpudWxsPT1kP251bGw6W1tkLHRdLFtlLG5dXX0sc2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9YVooKGE9K3QpKmMsYSp1LHMsbCksZigpKTphfSx0cmFuc2xhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9YVooYSpjLGEqdSxzPSt0WzBdLGw9K3RbMV0pLGYoKSk6W3MsbF19LHJlZmxlY3RYOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPWFaKGEqKGM9dD8tMToxKSxhKnUscyxsKSxmKCkpOmM8MH0scmVmbGVjdFk6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9YVooYSpjLGEqKHU9dD8tMToxKSxzLGwpLGYoKSk6dTwwfSxmaXRFeHRlbnQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4geksobyx0LGUpfSxmaXRTaXplOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIERLKG8sdCxlKX0sZml0V2lkdGg6ZnVuY3Rpb24odCxlKXtyZXR1cm4gQksobyx0LGUpfSxmaXRIZWlnaHQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gSEsobyx0LGUpfX19LGdlb1Byb2plY3Rpb246akssZ2VvUHJvamVjdGlvbk11dGF0b3I6R0ssZ2VvTWVyY2F0b3I6ZnVuY3Rpb24gR3B0KCl7cmV0dXJuIHRaKFFLKS5zY2FsZSg5NjEvWHEpfSxnZW9NZXJjYXRvclJhdzpRSyxnZW9OYXR1cmFsRWFydGgxOmZ1bmN0aW9uIFdwdCgpe3JldHVybiBqSyhzWikuc2NhbGUoMTc1LjI5NSl9LGdlb05hdHVyYWxFYXJ0aDFSYXc6c1osZ2VvT3J0aG9ncmFwaGljOmZ1bmN0aW9uIHFwdCgpe3JldHVybiBqSyhsWikuc2NhbGUoMjQ5LjUpLmNsaXBBbmdsZSg5MC4wMDAwMDEpfSxnZW9PcnRob2dyYXBoaWNSYXc6bFosZ2VvU3RlcmVvZ3JhcGhpYzpmdW5jdGlvbiBZcHQoKXtyZXR1cm4gaksoY1opLnNjYWxlKDI1MCkuY2xpcEFuZ2xlKDE0Mil9LGdlb1N0ZXJlb2dyYXBoaWNSYXc6Y1osZ2VvVHJhbnN2ZXJzZU1lcmNhdG9yOmZ1bmN0aW9uIFhwdCgpe3ZhciB0PXRaKHVaKSxlPXQuY2VudGVyLG49dC5yb3RhdGU7cmV0dXJuIHQuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoWy10WzFdLHRbMF1dKTpbKHQ9ZSgpKVsxXSwtdFswXV19LHQucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oW3RbMF0sdFsxXSx0Lmxlbmd0aD4yP3RbMl0rOTA6OTBdKTpbKHQ9bigpKVswXSx0WzFdLHRbMl0tOTBdfSxuKFswLDAsOTBdKS5zY2FsZSgxNTkuMTU1KX0sZ2VvVHJhbnN2ZXJzZU1lcmNhdG9yUmF3OnVaLGdlb1JvdGF0aW9uOkZYLGdlb1N0cmVhbTp5WSxnZW9UcmFuc2Zvcm06ZnVuY3Rpb24gJHB0KHQpe3JldHVybntzdHJlYW06SUsodCl9fSxjbHVzdGVyOmZ1bmN0aW9uIEtwdCgpe3ZhciB0PWhaLGU9MSxuPTEsaT0hMTtmdW5jdGlvbiByKHIpe3ZhciBvLGE9MDtyLmVhY2hBZnRlcigoZnVuY3Rpb24oZSl7dmFyIG49ZS5jaGlsZHJlbjtuPyhlLng9KGZ1bmN0aW9uIGkodCl7cmV0dXJuIHQucmVkdWNlKGRaLDApL3QubGVuZ3RofSkobiksZS55PShmdW5jdGlvbiByKHQpe3JldHVybiAxK3QucmVkdWNlKHBaLDApfSkobikpOihlLng9bz9hKz10KGUsbyk6MCxlLnk9MCxvPWUpfSkpO3ZhciBzPShmdW5jdGlvbiBsKHQpe2Zvcih2YXIgZTtlPXQuY2hpbGRyZW47KXQ9ZVswXTtyZXR1cm4gdH0pKHIpLGM9KGZ1bmN0aW9uIHUodCl7Zm9yKHZhciBlO2U9dC5jaGlsZHJlbjspdD1lW2UubGVuZ3RoLTFdO3JldHVybiB0fSkociksaD1zLngtdChzLGMpLzIsZD1jLngrdChjLHMpLzI7cmV0dXJuIHIuZWFjaEFmdGVyKGk/ZnVuY3Rpb24odCl7dC54PSh0Lngtci54KSplLHQueT0oci55LXQueSkqbn06ZnVuY3Rpb24odCl7dC54PSh0LngtaCkvKGQtaCkqZSx0Lnk9KDEtKHIueT90Lnkvci55OjEpKSpufSl9cmV0dXJuIHIuc2VwYXJhdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLHIpOnR9LHIuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0hMSxlPSt0WzBdLG49K3RbMV0scik6aT9udWxsOltlLG5dfSxyLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSEwLGU9K3RbMF0sbj0rdFsxXSxyKTppP1tlLG5dOm51bGx9LHJ9LGhpZXJhcmNoeTptWixwYWNrOmZ1bmN0aW9uIFpwdCgpe3ZhciB0PW51bGwsZT0xLG49MSxpPVhaO2Z1bmN0aW9uIHIocil7cmV0dXJuIHIueD1lLzIsci55PW4vMix0P3IuZWFjaEJlZm9yZShaWih0KSkuZWFjaEFmdGVyKEpaKGksLjUpKS5lYWNoQmVmb3JlKFFaKDEpKTpyLmVhY2hCZWZvcmUoWlooS1opKS5lYWNoQWZ0ZXIoSlooWFosMSkpLmVhY2hBZnRlcihKWihpLHIuci9NYXRoLm1pbihlLG4pKSkuZWFjaEJlZm9yZShRWihNYXRoLm1pbihlLG4pLygyKnIucikpKSxyfXJldHVybiByLnJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1xWihlKSxyKTp0fSxyLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3RbMF0sbj0rdFsxXSxyKTpbZSxuXX0sci5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6JFooK3QpLHIpOml9LHJ9LHBhY2tTaWJsaW5nczpmdW5jdGlvbiBKcHQodCl7cmV0dXJuIFdaKHQpLHR9LHBhY2tFbmNsb3NlOklaLHBhcnRpdGlvbjpmdW5jdGlvbiBRcHQoKXt2YXIgdD0xLGU9MSxuPTAsaT0hMTtmdW5jdGlvbiByKHIpe3ZhciBvPXIuaGVpZ2h0KzE7cmV0dXJuIHIueDA9ci55MD1uLHIueDE9dCxyLnkxPWUvbyxyLmVhY2hCZWZvcmUoKGZ1bmN0aW9uIGEodCxlKXtyZXR1cm4gZnVuY3Rpb24oaSl7aS5jaGlsZHJlbiYmZUooaSxpLngwLHQqKGkuZGVwdGgrMSkvZSxpLngxLHQqKGkuZGVwdGgrMikvZSk7dmFyIHI9aS54MCxvPWkueTAsYT1pLngxLW4scz1pLnkxLW47YTxyJiYocj1hPShyK2EpLzIpLHM8byYmKG89cz0obytzKS8yKSxpLngwPXIsaS55MD1vLGkueDE9YSxpLnkxPXN9fSkoZSxvKSksaSYmci5lYWNoQmVmb3JlKHRKKSxyfXJldHVybiByLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSEhdCxyKTppfSxyLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K25bMF0sZT0rblsxXSxyKTpbdCxlXX0sci5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0LHIpOm59LHJ9LHN0cmF0aWZ5OmZ1bmN0aW9uIHRmdCgpe3ZhciB0PXJKLGU9b0o7ZnVuY3Rpb24gbihuKXt2YXIgaSxyLG8sYSxzLGwsYyx1PW4ubGVuZ3RoLGg9bmV3IEFycmF5KHUpLGQ9e307Zm9yKHI9MDtyPHU7KytyKXM9aFtyXT1uZXcgdlooaT1uW3JdKSxudWxsIT0obD10KGkscixuKSkmJihsKz0iIikmJihkW2M9IiQiKyhzLmlkPWwpXT1jIGluIGQ/aUo6cyk7Zm9yKHI9MDtyPHU7KytyKWlmKHM9aFtyXSxudWxsIT0obD1lKG5bcl0scixuKSkmJihsKz0iIikpe2lmKCEoYT1kWyIkIitsXSkpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nOiAiK2wpO2lmKGE9PT1pSil0aHJvdyBuZXcgRXJyb3IoImFtYmlndW91czogIitsKTthLmNoaWxkcmVuP2EuY2hpbGRyZW4ucHVzaChzKTphLmNoaWxkcmVuPVtzXSxzLnBhcmVudD1hfWVsc2V7aWYobyl0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIHJvb3RzIik7bz1zfWlmKCFvKXRocm93IG5ldyBFcnJvcigibm8gcm9vdCIpO2lmKG8ucGFyZW50PW5KLG8uZWFjaEJlZm9yZSgoZnVuY3Rpb24odCl7dC5kZXB0aD10LnBhcmVudC5kZXB0aCsxLC0tdX0pKS5lYWNoQmVmb3JlKHlaKSxvLnBhcmVudD1udWxsLHU+MCl0aHJvdyBuZXcgRXJyb3IoImN5Y2xlIik7cmV0dXJuIG99cmV0dXJuIG4uaWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9WVooZSksbik6dH0sbi5wYXJlbnRJZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1ZWih0KSxuKTplfSxufSx0cmVlOmZ1bmN0aW9uIGVmdCgpe3ZhciB0PWFKLGU9MSxuPTEsaT1udWxsO2Z1bmN0aW9uIHIocil7dmFyIGw9KGZ1bmN0aW9uIGModCl7Zm9yKHZhciBlLG4saSxyLG8sYT1uZXcgaEoodCwwKSxzPVthXTtlPXMucG9wKCk7KWlmKGk9ZS5fLmNoaWxkcmVuKWZvcihlLmNoaWxkcmVuPW5ldyBBcnJheShvPWkubGVuZ3RoKSxyPW8tMTtyPj0wOy0tcilzLnB1c2gobj1lLmNoaWxkcmVuW3JdPW5ldyBoSihpW3JdLHIpKSxuLnBhcmVudD1lO3JldHVybihhLnBhcmVudD1uZXcgaEoobnVsbCwwKSkuY2hpbGRyZW49W2FdLGF9KShyKTtpZihsLmVhY2hBZnRlcihvKSxsLnBhcmVudC5tPS1sLnosbC5lYWNoQmVmb3JlKGEpLGkpci5lYWNoQmVmb3JlKHMpO2Vsc2V7dmFyIHU9cixoPXIsZD1yO3IuZWFjaEJlZm9yZSgoZnVuY3Rpb24odCl7dC54PHUueCYmKHU9dCksdC54PmgueCYmKGg9dCksdC5kZXB0aD5kLmRlcHRoJiYoZD10KX0pKTt2YXIgcD11PT09aD8xOnQodSxoKS8yLGY9cC11LngsbT1lLyhoLngrcCtmKSxnPW4vKGQuZGVwdGh8fDEpO3IuZWFjaEJlZm9yZSgoZnVuY3Rpb24odCl7dC54PSh0LngrZikqbSx0Lnk9dC5kZXB0aCpnfSkpfXJldHVybiByfWZ1bmN0aW9uIG8oZSl7dmFyIG49ZS5jaGlsZHJlbixpPWUucGFyZW50LmNoaWxkcmVuLHI9ZS5pP2lbZS5pLTFdOm51bGw7aWYobil7IShmdW5jdGlvbiBvKHQpe2Zvcih2YXIgZSxuPTAsaT0wLHI9dC5jaGlsZHJlbixvPXIubGVuZ3RoOy0tbz49MDspKGU9cltvXSkueis9bixlLm0rPW4sbis9ZS5zKyhpKz1lLmMpfSkoZSk7dmFyIGE9KG5bMF0ueituW24ubGVuZ3RoLTFdLnopLzI7cj8oZS56PXIueit0KGUuXyxyLl8pLGUubT1lLnotYSk6ZS56PWF9ZWxzZSByJiYoZS56PXIueit0KGUuXyxyLl8pKTtlLnBhcmVudC5BPShmdW5jdGlvbiBzKGUsbixpKXtpZihuKXtmb3IodmFyIHIsbz1lLGE9ZSxzPW4sbD1vLnBhcmVudC5jaGlsZHJlblswXSxjPW8ubSx1PWEubSxoPXMubSxkPWwubTtzPWxKKHMpLG89c0oobykscyYmbzspbD1zSihsKSwoYT1sSihhKSkuYT1lLChyPXMueitoLW8uei1jK3Qocy5fLG8uXykpPjAmJihjSih1SihzLGUsaSksZSxyKSxjKz1yLHUrPXIpLGgrPXMubSxjKz1vLm0sZCs9bC5tLHUrPWEubTtzJiYhbEooYSkmJihhLnQ9cyxhLm0rPWgtdSksbyYmIXNKKGwpJiYobC50PW8sbC5tKz1jLWQsaT1lKX1yZXR1cm4gaX0pKGUscixlLnBhcmVudC5BfHxpWzBdKX1mdW5jdGlvbiBhKHQpe3QuXy54PXQueit0LnBhcmVudC5tLHQubSs9dC5wYXJlbnQubX1mdW5jdGlvbiBzKHQpe3QueCo9ZSx0Lnk9dC5kZXB0aCpufXJldHVybiByLnNlcGFyYXRpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxyKTp0fSxyLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ITEsZT0rdFswXSxuPSt0WzFdLHIpOmk/bnVsbDpbZSxuXX0sci5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0hMCxlPSt0WzBdLG49K3RbMV0scik6aT9bZSxuXTpudWxsfSxyfSx0cmVlbWFwOmZ1bmN0aW9uIG5mdCgpe3ZhciB0PW1KLGU9ITEsbj0xLGk9MSxyPVswXSxvPVhaLGE9WFoscz1YWixsPVhaLGM9WFo7ZnVuY3Rpb24gdSh0KXtyZXR1cm4gdC54MD10LnkwPTAsdC54MT1uLHQueTE9aSx0LmVhY2hCZWZvcmUoaCkscj1bMF0sZSYmdC5lYWNoQmVmb3JlKHRKKSx0fWZ1bmN0aW9uIGgoZSl7dmFyIG49cltlLmRlcHRoXSxpPWUueDArbix1PWUueTArbixoPWUueDEtbixkPWUueTEtbjtoPGkmJihpPWg9KGkraCkvMiksZDx1JiYodT1kPSh1K2QpLzIpLGUueDA9aSxlLnkwPXUsZS54MT1oLGUueTE9ZCxlLmNoaWxkcmVuJiYobj1yW2UuZGVwdGgrMV09byhlKS8yLGkrPWMoZSktbix1Kz1hKGUpLW4sKGgtPXMoZSktbik8aSYmKGk9aD0oaStoKS8yKSwoZC09bChlKS1uKTx1JiYodT1kPSh1K2QpLzIpLHQoZSxpLHUsaCxkKSl9cmV0dXJuIHUucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ISF0LHUpOmV9LHUuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdFswXSxpPSt0WzFdLHUpOltuLGldfSx1LnRpbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9WVooZSksdSk6dH0sdS5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3UucGFkZGluZ0lubmVyKHQpLnBhZGRpbmdPdXRlcih0KTp1LnBhZGRpbmdJbm5lcigpfSx1LnBhZGRpbmdJbm5lcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OiRaKCt0KSx1KTpvfSx1LnBhZGRpbmdPdXRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD91LnBhZGRpbmdUb3AodCkucGFkZGluZ1JpZ2h0KHQpLnBhZGRpbmdCb3R0b20odCkucGFkZGluZ0xlZnQodCk6dS5wYWRkaW5nVG9wKCl9LHUucGFkZGluZ1RvcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OiRaKCt0KSx1KTphfSx1LnBhZGRpbmdSaWdodD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OiRaKCt0KSx1KTpzfSx1LnBhZGRpbmdCb3R0b209ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDokWigrdCksdSk6bH0sdS5wYWRkaW5nTGVmdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OiRaKCt0KSx1KTpjfSx1fSx0cmVlbWFwQmluYXJ5OmZ1bmN0aW9uIGlmdCh0LGUsbixpLHIpe3ZhciBvLGEscz10LmNoaWxkcmVuLGw9cy5sZW5ndGgsYz1uZXcgQXJyYXkobCsxKTtmb3IoY1swXT1hPW89MDtvPGw7KytvKWNbbysxXT1hKz1zW29dLnZhbHVlOyEoZnVuY3Rpb24gdChlLG4saSxyLG8sYSxsKXtpZihlPj1uLTEpe3ZhciB1PXNbZV07cmV0dXJuIHUueDA9cix1LnkwPW8sdS54MT1hLHZvaWQodS55MT1sKX1mb3IodmFyIGg9Y1tlXSxkPWkvMitoLHA9ZSsxLGY9bi0xO3A8Zjspe3ZhciBtPXArZj4+PjE7Y1ttXTxkP3A9bSsxOmY9bX1kLWNbcC0xXTxjW3BdLWQmJmUrMTxwJiYtLXA7dmFyIGc9Y1twXS1oLF89aS1nO2lmKGEtcj5sLW8pe3ZhciB5PShyKl8rYSpnKS9pO3QoZSxwLGcscixvLHksbCksdChwLG4sXyx5LG8sYSxsKX1lbHNle3ZhciB2PShvKl8rbCpnKS9pO3QoZSxwLGcscixvLGEsdiksdChwLG4sXyxyLHYsYSxsKX19KSgwLGwsdC52YWx1ZSxlLG4saSxyKX0sdHJlZW1hcERpY2U6ZUosdHJlZW1hcFNsaWNlOmRKLHRyZWVtYXBTbGljZURpY2U6ZnVuY3Rpb24gcmZ0KHQsZSxuLGkscil7KDEmdC5kZXB0aD9kSjplSikodCxlLG4saSxyKX0sdHJlZW1hcFNxdWFyaWZ5Om1KLHRyZWVtYXBSZXNxdWFyaWZ5OmdKLGludGVycG9sYXRlOkJRLGludGVycG9sYXRlQXJyYXk6UFEsaW50ZXJwb2xhdGVCYXNpczp4USxpbnRlcnBvbGF0ZUJhc2lzQ2xvc2VkOndRLGludGVycG9sYXRlRGF0ZTpOUSxpbnRlcnBvbGF0ZU51bWJlcjpJUSxpbnRlcnBvbGF0ZU9iamVjdDpSUSxpbnRlcnBvbGF0ZVJvdW5kOmZ1bmN0aW9uIG9mdCh0LGUpe3JldHVybiBlLT10PSt0LGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnJvdW5kKHQrZSpuKX19LGludGVycG9sYXRlU3RyaW5nOkRRLGludGVycG9sYXRlVHJhbnNmb3JtQ3NzOllRLGludGVycG9sYXRlVHJhbnNmb3JtU3ZnOiRRLGludGVycG9sYXRlWm9vbTpmdW5jdGlvbiBhZnQodCxlKXt2YXIgbixpLHI9dFswXSxvPXRbMV0sYT10WzJdLHM9ZVsyXSxsPWVbMF0tcixjPWVbMV0tbyx1PWwqbCtjKmM7aWYodTwxZS0xMilpPU1hdGgubG9nKHMvYSkvWlEsbj1mdW5jdGlvbih0KXtyZXR1cm5bcit0Kmwsbyt0KmMsYSpNYXRoLmV4cChaUSp0KmkpXX07ZWxzZXt2YXIgaD1NYXRoLnNxcnQodSksZD0ocypzLWEqYSs0KnUpLygyKmEqMipoKSxwPShzKnMtYSphLTQqdSkvKDIqcyoyKmgpLGY9TWF0aC5sb2coTWF0aC5zcXJ0KGQqZCsxKS1kKSxtPU1hdGgubG9nKE1hdGguc3FydChwKnArMSktcCk7aT0obS1mKS9aUSxuPWZ1bmN0aW9uKHQpe3ZhciBlPXQqaSxuPUpRKGYpLHM9YS8oMipoKSoobiooZnVuY3Rpb24gdSh0KXtyZXR1cm4oKHQ9TWF0aC5leHAoMip0KSktMSkvKHQrMSl9KShaUSplK2YpLShmdW5jdGlvbiBkKHQpe3JldHVybigodD1NYXRoLmV4cCh0KSktMS90KS8yfSkoZikpO3JldHVybltyK3MqbCxvK3MqYyxhKm4vSlEoWlEqZStmKV19fXJldHVybiBuLmR1cmF0aW9uPTFlMyppLG59LGludGVycG9sYXRlUmdiOkNRLGludGVycG9sYXRlUmdiQmFzaXM6a1EsaW50ZXJwb2xhdGVSZ2JCYXNpc0Nsb3NlZDpMUSxpbnRlcnBvbGF0ZUhzbDp0MSxpbnRlcnBvbGF0ZUhzbExvbmc6ZTEsaW50ZXJwb2xhdGVMYWI6ZnVuY3Rpb24gc2Z0KHQsZSl7dmFyIG49VFEoKHQ9clEodCkpLmwsKGU9clEoZSkpLmwpLGk9VFEodC5hLGUuYSkscj1UUSh0LmIsZS5iKSxvPVRRKHQub3BhY2l0eSxlLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5sPW4oZSksdC5hPWkoZSksdC5iPXIoZSksdC5vcGFjaXR5PW8oZSksdCsiIn19LGludGVycG9sYXRlSGNsOmkxLGludGVycG9sYXRlSGNsTG9uZzpyMSxpbnRlcnBvbGF0ZUN1YmVoZWxpeDphMSxpbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmc6czEscXVhbnRpemU6ZnVuY3Rpb24gbGZ0KHQsZSl7Zm9yKHZhciBuPW5ldyBBcnJheShlKSxpPTA7aTxlOysraSluW2ldPXQoaS8oZS0xKSk7cmV0dXJuIG59LHBhdGg6cDEscG9seWdvbkFyZWE6ZnVuY3Rpb24gY2Z0KHQpe2Zvcih2YXIgZSxuPS0xLGk9dC5sZW5ndGgscj10W2ktMV0sbz0wOysrbjxpOylvKz0oZT1yKVsxXSoocj10W25dKVswXS1lWzBdKnJbMV07cmV0dXJuIG8vMn0scG9seWdvbkNlbnRyb2lkOmZ1bmN0aW9uIHVmdCh0KXtmb3IodmFyIGUsbixpPS0xLHI9dC5sZW5ndGgsbz0wLGE9MCxzPXRbci0xXSxsPTA7KytpPHI7KWwrPW49KGU9cylbMF0qKHM9dFtpXSlbMV0tc1swXSplWzFdLG8rPShlWzBdK3NbMF0pKm4sYSs9KGVbMV0rc1sxXSkqbjtyZXR1cm5bby8obCo9MyksYS9sXX0scG9seWdvbkh1bGw6ZnVuY3Rpb24gaGZ0KHQpe2lmKChuPXQubGVuZ3RoKTwzKXJldHVybiBudWxsO3ZhciBlLG4saT1uZXcgQXJyYXkobikscj1uZXcgQXJyYXkobik7Zm9yKGU9MDtlPG47KytlKWlbZV09Wyt0W2VdWzBdLCt0W2VdWzFdLGVdO2ZvcihpLnNvcnQobTEpLGU9MDtlPG47KytlKXJbZV09W2lbZV1bMF0sLWlbZV1bMV1dO3ZhciBvPWcxKGkpLGE9ZzEocikscz1hWzBdPT09b1swXSxsPWFbYS5sZW5ndGgtMV09PT1vW28ubGVuZ3RoLTFdLGM9W107Zm9yKGU9by5sZW5ndGgtMTtlPj0wOy0tZSljLnB1c2godFtpW29bZV1dWzJdXSk7Zm9yKGU9K3M7ZTxhLmxlbmd0aC1sOysrZSljLnB1c2godFtpW2FbZV1dWzJdXSk7cmV0dXJuIGN9LHBvbHlnb25Db250YWluczpmdW5jdGlvbiBkZnQodCxlKXtmb3IodmFyIG4saSxyPXQubGVuZ3RoLG89dFtyLTFdLGE9ZVswXSxzPWVbMV0sbD1vWzBdLGM9b1sxXSx1PSExLGg9MDtoPHI7KytoKW49KG89dFtoXSlbMF0sKGk9b1sxXSk+cyE9Yz5zJiZhPChsLW4pKihzLWkpLyhjLWkpK24mJih1PSF1KSxsPW4sYz1pO3JldHVybiB1fSxwb2x5Z29uTGVuZ3RoOmZ1bmN0aW9uIHBmdCh0KXtmb3IodmFyIGUsbixpPS0xLHI9dC5sZW5ndGgsbz10W3ItMV0sYT1vWzBdLHM9b1sxXSxsPTA7KytpPHI7KWU9YSxuPXMsZS09YT0obz10W2ldKVswXSxuLT1zPW9bMV0sbCs9TWF0aC5zcXJ0KGUqZStuKm4pO3JldHVybiBsfSxxdWFkdHJlZTp4MSxxdWV1ZTpxMSxyYW5kb21Vbmlmb3JtOlgxLHJhbmRvbU5vcm1hbDokMSxyYW5kb21Mb2dOb3JtYWw6SzEscmFuZG9tQmF0ZXM6SjEscmFuZG9tSXJ3aW5IYWxsOloxLHJhbmRvbUV4cG9uZW50aWFsOlExLHJlcXVlc3Q6dDAsaHRtbDpuMCxqc29uOmkwLHRleHQ6cjAseG1sOm8wLGNzdjpsMCx0c3Y6YzAsc2NhbGVCYW5kOlAwLHNjYWxlUG9pbnQ6ZnVuY3Rpb24gZmZ0KCl7cmV0dXJuIE4wKFAwKCkucGFkZGluZ0lubmVyKDEpKX0sc2NhbGVJZGVudGl0eTpmdW5jdGlvbiB0KCl7dmFyIGU9WzAsMV07ZnVuY3Rpb24gbih0KXtyZXR1cm4rdH1yZXR1cm4gbi5pbnZlcnQ9bixuLmRvbWFpbj1uLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPUMwLmNhbGwodCxqMiksbik6ZS5zbGljZSgpfSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihlKX0sZDUobil9LHNjYWxlTGluZWFyOmZ1bmN0aW9uIHQoKXt2YXIgZT0kMihXMixOMik7cmV0dXJuIGUuY29weT1mdW5jdGlvbigpe3JldHVybiBYMihlLHQoKSl9LGQ1KGUpfSxzY2FsZUxvZzpmdW5jdGlvbiB0KCl7dmFyIGU9JDIoZjUsbTUpLmRvbWFpbihbMSwxMF0pLG49ZS5kb21haW4saT0xMCxyPXk1KDEwKSxvPV81KDEwKTtmdW5jdGlvbiBhKCl7cmV0dXJuIHI9eTUoaSksbz1fNShpKSxuKClbMF08MCYmKHI9djUociksbz12NShvKSksZX1yZXR1cm4gZS5iYXNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LGEoKSk6aX0sZS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG4odCksYSgpKTpuKCl9LGUudGlja3M9ZnVuY3Rpb24odCl7dmFyIGUsYT1uKCkscz1hWzBdLGw9YVthLmxlbmd0aC0xXTsoZT1sPHMpJiYoZD1zLHM9bCxsPWQpO3ZhciBjLHUsaCxkPXIocykscD1yKGwpLGY9bnVsbD09dD8xMDordCxtPVtdO2lmKCEoaSUxKSYmcC1kPGYpe2lmKGQ9TWF0aC5yb3VuZChkKS0xLHA9TWF0aC5yb3VuZChwKSsxLHM+MCl7Zm9yKDtkPHA7KytkKWZvcih1PTEsYz1vKGQpO3U8aTsrK3UpaWYoISgoaD1jKnUpPHMpKXtpZihoPmwpYnJlYWs7bS5wdXNoKGgpfX1lbHNlIGZvcig7ZDxwOysrZClmb3IodT1pLTEsYz1vKGQpO3U+PTE7LS11KWlmKCEoKGg9Yyp1KTxzKSl7aWYoaD5sKWJyZWFrO20ucHVzaChoKX19ZWxzZSBtPV8wKGQscCxNYXRoLm1pbihwLWQsZikpLm1hcChvKTtyZXR1cm4gZT9tLnJldmVyc2UoKTptfSxlLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxuKXtpZihudWxsPT1uJiYobj0xMD09PWk/Ii4wZSI6IiwiKSwiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49bDUobikpLHQ9PT0xLzApcmV0dXJuIG47bnVsbD09dCYmKHQ9MTApO3ZhciBhPU1hdGgubWF4KDEsaSp0L2UudGlja3MoKS5sZW5ndGgpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT10L28oTWF0aC5yb3VuZChyKHQpKSk7cmV0dXJuIGUqaTxpLS41JiYoZSo9aSksZTw9YT9uKHQpOiIifX0sZS5uaWNlPWZ1bmN0aW9uKCl7cmV0dXJuIG4ocDUobigpLHtmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gbyhNYXRoLmZsb29yKHIodCkpKX0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gbyhNYXRoLmNlaWwocih0KSkpfX0pKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFgyKGUsdCgpLmJhc2UoaSkpfSxlfSxzY2FsZU9yZGluYWw6TDAsc2NhbGVJbXBsaWNpdDprMCxzY2FsZVBvdzp4NSxzY2FsZVNxcnQ6ZnVuY3Rpb24gbWZ0KCl7cmV0dXJuIHg1KCkuZXhwb25lbnQoLjUpfSxzY2FsZVF1YW50aWxlOmZ1bmN0aW9uIHQoKXt2YXIgZT1bXSxuPVtdLGk9W107ZnVuY3Rpb24gcigpe3ZhciB0PTAscj1NYXRoLm1heCgxLG4ubGVuZ3RoKTtmb3IoaT1uZXcgQXJyYXkoci0xKTsrK3Q8cjspaVt0LTFdPWIwKGUsdC9yKTtyZXR1cm4gb31mdW5jdGlvbiBvKHQpe2lmKCFpc05hTih0PSt0KSlyZXR1cm4gbltkMChpLHQpXX1yZXR1cm4gby5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIHI9bi5pbmRleE9mKHQpO3JldHVybiByPDA/W05hTixOYU5dOltyPjA/aVtyLTFdOmVbMF0scjxpLmxlbmd0aD9pW3JdOmVbZS5sZW5ndGgtMV1dfSxvLmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZS5zbGljZSgpO2U9W107Zm9yKHZhciBuLGk9MCxvPXQubGVuZ3RoO2k8bzsrK2kpbnVsbD09KG49dFtpXSl8fGlzTmFOKG49K24pfHxlLnB1c2gobik7cmV0dXJuIGUuc29ydCh1MCkscigpfSxvLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPUEwLmNhbGwodCkscigpKTpuLnNsaWNlKCl9LG8ucXVhbnRpbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIGkuc2xpY2UoKX0sby5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4oZSkucmFuZ2Uobil9LG99LHNjYWxlUXVhbnRpemU6ZnVuY3Rpb24gdCgpe3ZhciBlPTAsbj0xLGk9MSxyPVsuNV0sbz1bMCwxXTtmdW5jdGlvbiBhKHQpe2lmKHQ8PXQpcmV0dXJuIG9bZDAocix0LDAsaSldfWZ1bmN0aW9uIHMoKXt2YXIgdD0tMTtmb3Iocj1uZXcgQXJyYXkoaSk7Kyt0PGk7KXJbdF09KCh0KzEpKm4tKHQtaSkqZSkvKGkrMSk7cmV0dXJuIGF9cmV0dXJuIGEuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLG49K3RbMV0scygpKTpbZSxuXX0sYS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0obz1BMC5jYWxsKHQpKS5sZW5ndGgtMSxzKCkpOm8uc2xpY2UoKX0sYS5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIGE9by5pbmRleE9mKHQpO3JldHVybiBhPDA/W05hTixOYU5dOmE8MT9bZSxyWzBdXTphPj1pP1tyW2ktMV0sbl06W3JbYS0xXSxyW2FdXX0sYS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4oW2Usbl0pLnJhbmdlKG8pfSxkNShhKX0sc2NhbGVUaHJlc2hvbGQ6ZnVuY3Rpb24gdCgpe3ZhciBlPVsuNV0sbj1bMCwxXSxpPTE7ZnVuY3Rpb24gcih0KXtpZih0PD10KXJldHVybiBuW2QwKGUsdCwwLGkpXX1yZXR1cm4gci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9QTAuY2FsbCh0KSxpPU1hdGgubWluKGUubGVuZ3RoLG4ubGVuZ3RoLTEpLHIpOmUuc2xpY2UoKX0sci5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1BMC5jYWxsKHQpLGk9TWF0aC5taW4oZS5sZW5ndGgsbi5sZW5ndGgtMSkscik6bi5zbGljZSgpfSxyLmludmVydEV4dGVudD1mdW5jdGlvbih0KXt2YXIgaT1uLmluZGV4T2YodCk7cmV0dXJuW2VbaS0xXSxlW2ldXX0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4oZSkucmFuZ2Uobil9LHJ9LHNjYWxlVGltZTpmdW5jdGlvbiBnZnQoKXtyZXR1cm4gQzQoajUsVjUsQjUsejUsTzUsUjUsSTUsQzUscjMpLmRvbWFpbihbbmV3IERhdGUoMmUzLDAsMSksbmV3IERhdGUoMmUzLDAsMildKX0sc2NhbGVVdGM6ZnVuY3Rpb24gX2Z0KCl7cmV0dXJuIEM0KFE1LFo1LFg1LHE1LFc1LEc1LEk1LEM1LG8zKS5kb21haW4oW0RhdGUuVVRDKDJlMywwLDEpLERhdGUuVVRDKDJlMywwLDIpXSl9LHNjaGVtZUNhdGVnb3J5MTA6azQsc2NoZW1lQ2F0ZWdvcnkyMGI6TDQsc2NoZW1lQ2F0ZWdvcnkyMGM6UDQsc2NoZW1lQ2F0ZWdvcnkyMDpONCxpbnRlcnBvbGF0ZUN1YmVoZWxpeERlZmF1bHQ6STQsaW50ZXJwb2xhdGVSYWluYm93OmZ1bmN0aW9uIHlmdCh0KXsodDwwfHx0PjEpJiYodC09TWF0aC5mbG9vcih0KSk7dmFyIGU9TWF0aC5hYnModC0uNSk7cmV0dXJuIHo0Lmg9MzYwKnQtMTAwLHo0LnM9MS41LTEuNSplLHo0Lmw9LjgtLjkqZSx6NCsiIn0saW50ZXJwb2xhdGVXYXJtOlI0LGludGVycG9sYXRlQ29vbDpPNCxpbnRlcnBvbGF0ZVZpcmlkaXM6QjQsaW50ZXJwb2xhdGVNYWdtYTpINCxpbnRlcnBvbGF0ZUluZmVybm86RjQsaW50ZXJwb2xhdGVQbGFzbWE6VjQsc2NhbGVTZXF1ZW50aWFsOmZ1bmN0aW9uIHQoZSl7dmFyIG49MCxpPTEscj0hMTtmdW5jdGlvbiBvKHQpe3ZhciBvPSh0LW4pLyhpLW4pO3JldHVybiBlKHI/TWF0aC5tYXgoMCxNYXRoLm1pbigxLG8pKTpvKX1yZXR1cm4gby5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3RbMF0saT0rdFsxXSxvKTpbbixpXX0sby5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hIXQsbyk6cn0sby5pbnRlcnBvbGF0b3I9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxvKTplfSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdChlKS5kb21haW4oW24saV0pLmNsYW1wKHIpfSxkNShvKX0sY3JlYXRlOmZ1bmN0aW9uIHZmdCh0KXtyZXR1cm4gdDkoWTQodCkuY2FsbChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKX0sY3JlYXRvcjpZNCxsb2NhbDpOOSxtYXRjaGVyOmU2LG1vdXNlOmZ1bmN0aW9uIGJmdCh0KXt2YXIgZT1SOSgpO3JldHVybiBlLmNoYW5nZWRUb3VjaGVzJiYoZT1lLmNoYW5nZWRUb3VjaGVzWzBdKSxPOSh0LGUpfSxuYW1lc3BhY2U6RzQsbmFtZXNwYWNlczpqNCxjbGllbnRQb2ludDpPOSxzZWxlY3Q6dDksc2VsZWN0QWxsOmZ1bmN0aW9uIHhmdCh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IEo2KFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IEo2KFtudWxsPT10P1tdOnRdLFo2KX0sc2VsZWN0aW9uOlE2LHNlbGVjdG9yOiQ0LHNlbGVjdG9yQWxsOlo0LHN0eWxlOl82LHRvdWNoOmZ1bmN0aW9uIHdmdCh0LGUsbil7YXJndW1lbnRzLmxlbmd0aDwzJiYobj1lLGU9UjkoKS5jaGFuZ2VkVG91Y2hlcyk7Zm9yKHZhciBpLHI9MCxvPWU/ZS5sZW5ndGg6MDtyPG87KytyKWlmKChpPWVbcl0pLmlkZW50aWZpZXI9PT1uKXJldHVybiBPOSh0LGkpO3JldHVybiBudWxsfSx0b3VjaGVzOmZ1bmN0aW9uIFNmdCh0LGUpe251bGw9PWUmJihlPVI5KCkudG91Y2hlcyk7Zm9yKHZhciBuPTAsaT1lP2UubGVuZ3RoOjAscj1uZXcgQXJyYXkoaSk7bjxpOysrbilyW25dPU85KHQsZVtuXSk7cmV0dXJuIHJ9LHdpbmRvdzpwNixnZXQgZXZlbnQoKXtyZXR1cm4gVTZ9LGN1c3RvbUV2ZW50OmZ1bmN0aW9uIE1mdCh0LGUsbixpKXt2YXIgcj1VNjt0LnNvdXJjZUV2ZW50PVU2LFU2PXQ7dHJ5e3JldHVybiBlLmFwcGx5KG4saSl9ZmluYWxseXtVNj1yfX0sYXJjOmZ1bmN0aW9uIEVmdCgpe3ZhciB0PW44LGU9aTgsbj1VOSgwKSxpPW51bGwscj1yOCxvPW84LGE9YTgscz1udWxsO2Z1bmN0aW9uIGwoKXt2YXIgbCxjLHU9K3QuYXBwbHkodGhpcyxhcmd1bWVudHMpLGg9K2UuYXBwbHkodGhpcyxhcmd1bWVudHMpLGQ9ci5hcHBseSh0aGlzLGFyZ3VtZW50cyktSjkscD1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1KOSxmPWo5KHAtZCksbT1wPmQ7aWYoc3x8KHM9bD1WOSgpKSxoPHUmJihjPWgsaD11LHU9YyksaD5LOSlpZihmPlE5LUs5KXMubW92ZVRvKGgqVzkoZCksaCpYOShkKSkscy5hcmMoMCwwLGgsZCxwLCFtKSx1Pks5JiYocy5tb3ZlVG8odSpXOShwKSx1Klg5KHApKSxzLmFyYygwLDAsdSxwLGQsbSkpO2Vsc2V7dmFyIGcsXyx5PWQsdj1wLGI9ZCx4PXAsdz1mLFM9ZixNPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpLzIsRT1NPks5JiYoaT8raS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6JDkodSp1K2gqaCkpLFQ9WTkoajkoaC11KS8yLCtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksQz1ULEE9VDtpZihFPks5KXt2YXIgaz1lOChFL3UqWDkoTSkpLEw9ZTgoRS9oKlg5KE0pKTsody09MiprKT5LOT8oYis9ayo9bT8xOi0xLHgtPWspOih3PTAsYj14PShkK3ApLzIpLChTLT0yKkwpPks5Pyh5Kz1MKj1tPzE6LTEsdi09TCk6KFM9MCx5PXY9KGQrcCkvMil9dmFyIFA9aCpXOSh5KSxOPWgqWDkoeSksST11Klc5KHgpLFI9dSpYOSh4KTtpZihUPks5KXt2YXIgTz1oKlc5KHYpLHo9aCpYOSh2KSxEPXUqVzkoYiksQj11Klg5KGIpO2lmKGY8Wjkpe3ZhciBIPXc+Szk/czgoUCxOLEQsQixPLHosSSxSKTpbSSxSXSxGPVAtSFswXSxWPU4tSFsxXSxVPU8tSFswXSxqPXotSFsxXSxHPTEvWDkodDgoKEYqVStWKmopLygkOShGKkYrVipWKSokOShVKlUraipqKSkpLzIpLFc9JDkoSFswXSpIWzBdK0hbMV0qSFsxXSk7Qz1ZOShULCh1LVcpLyhHLTEpKSxBPVk5KFQsKGgtVykvKEcrMSkpfX1TPks5P0E+Szk/KGc9bDgoRCxCLFAsTixoLEEsbSksXz1sOChPLHosSSxSLGgsQSxtKSxzLm1vdmVUbyhnLmN4K2cueDAxLGcuY3krZy55MDEpLEE8VD9zLmFyYyhnLmN4LGcuY3ksQSxHOShnLnkwMSxnLngwMSksRzkoXy55MDEsXy54MDEpLCFtKToocy5hcmMoZy5jeCxnLmN5LEEsRzkoZy55MDEsZy54MDEpLEc5KGcueTExLGcueDExKSwhbSkscy5hcmMoMCwwLGgsRzkoZy5jeStnLnkxMSxnLmN4K2cueDExKSxHOShfLmN5K18ueTExLF8uY3grXy54MTEpLCFtKSxzLmFyYyhfLmN4LF8uY3ksQSxHOShfLnkxMSxfLngxMSksRzkoXy55MDEsXy54MDEpLCFtKSkpOihzLm1vdmVUbyhQLE4pLHMuYXJjKDAsMCxoLHksdiwhbSkpOnMubW92ZVRvKFAsTiksdT5LOSYmdz5LOT9DPks5PyhnPWw4KEksUixPLHosdSwtQyxtKSxfPWw4KFAsTixELEIsdSwtQyxtKSxzLmxpbmVUbyhnLmN4K2cueDAxLGcuY3krZy55MDEpLEM8VD9zLmFyYyhnLmN4LGcuY3ksQyxHOShnLnkwMSxnLngwMSksRzkoXy55MDEsXy54MDEpLCFtKToocy5hcmMoZy5jeCxnLmN5LEMsRzkoZy55MDEsZy54MDEpLEc5KGcueTExLGcueDExKSwhbSkscy5hcmMoMCwwLHUsRzkoZy5jeStnLnkxMSxnLmN4K2cueDExKSxHOShfLmN5K18ueTExLF8uY3grXy54MTEpLG0pLHMuYXJjKF8uY3gsXy5jeSxDLEc5KF8ueTExLF8ueDExKSxHOShfLnkwMSxfLngwMSksIW0pKSk6cy5hcmMoMCwwLHUseCxiLG0pOnMubGluZVRvKEksUil9ZWxzZSBzLm1vdmVUbygwLDApO2lmKHMuY2xvc2VQYXRoKCksbClyZXR1cm4gcz1udWxsLGwrIiJ8fG51bGx9cmV0dXJuIGwuY2VudHJvaWQ9ZnVuY3Rpb24oKXt2YXIgbj0oK3QuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzIsaT0oK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArby5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzItWjkvMjtyZXR1cm5bVzkoaSkqbixYOShpKSpuXX0sbC5pbm5lclJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOlU5KCtlKSxsKTp0fSxsLm91dGVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VTkoK3QpLGwpOmV9LGwuY29ybmVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VTkoK3QpLGwpOm59LGwucGFkUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OlU5KCt0KSxsKTppfSxsLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpVOSgrdCksbCk6cn0sbC5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlU5KCt0KSxsKTpvfSxsLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VTkoK3QpLGwpOmF9LGwuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1udWxsPT10P251bGw6dCxsKTpzfSxsfSxhcmVhOmY4LGxpbmU6cDgscGllOmZ1bmN0aW9uIFRmdCgpe3ZhciB0PWc4LGU9bTgsbj1udWxsLGk9VTkoMCkscj1VOShROSksbz1VOSgwKTtmdW5jdGlvbiBhKGEpe3ZhciBzLGwsYyx1LGgsZD1hLmxlbmd0aCxwPTAsZj1uZXcgQXJyYXkoZCksbT1uZXcgQXJyYXkoZCksZz0raS5hcHBseSh0aGlzLGFyZ3VtZW50cyksXz1NYXRoLm1pbihROSxNYXRoLm1heCgtUTksci5hcHBseSh0aGlzLGFyZ3VtZW50cyktZykpLHk9TWF0aC5taW4oTWF0aC5hYnMoXykvZCxvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksdj15KihfPDA/LTE6MSk7Zm9yKHM9MDtzPGQ7KytzKShoPW1bZltzXT1zXT0rdChhW3NdLHMsYSkpPjAmJihwKz1oKTtmb3IobnVsbCE9ZT9mLnNvcnQoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUobVt0XSxtW25dKX0pKTpudWxsIT1uJiZmLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oYVt0XSxhW2VdKX0pKSxzPTAsYz1wPyhfLWQqdikvcDowO3M8ZDsrK3MsZz11KW1bbD1mW3NdXT17ZGF0YTphW2xdLGluZGV4OnMsdmFsdWU6aD1tW2xdLHN0YXJ0QW5nbGU6ZyxlbmRBbmdsZTp1PWcrKGg+MD9oKmM6MCkrdixwYWRBbmdsZTp5fTtyZXR1cm4gbX1yZXR1cm4gYS52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOlU5KCtlKSxhKTp0fSxhLnNvcnRWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuPW51bGwsYSk6ZX0sYS5zb3J0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZT1udWxsLGEpOm59LGEuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlU5KCt0KSxhKTppfSxhLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VTkoK3QpLGEpOnJ9LGEucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpVOSgrdCksYSk6b30sYX0sYXJlYVJhZGlhbDp3OCxyYWRpYWxBcmVhOnc4LGxpbmVSYWRpYWw6eDgscmFkaWFsTGluZTp4OCxwb2ludFJhZGlhbDpTOCxsaW5rSG9yaXpvbnRhbDpmdW5jdGlvbiBDZnQoKXtyZXR1cm4gQzgoQTgpfSxsaW5rVmVydGljYWw6ZnVuY3Rpb24gQWZ0KCl7cmV0dXJuIEM4KGs4KX0sbGlua1JhZGlhbDpmdW5jdGlvbiBrZnQoKXt2YXIgdD1DOChMOCk7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5yYWRpdXM9dC55LGRlbGV0ZSB0LnksdH0sc3ltYm9sOmZ1bmN0aW9uIExmdCgpe3ZhciB0PVU5KFA4KSxlPVU5KDY0KSxuPW51bGw7ZnVuY3Rpb24gaSgpe3ZhciBpO2lmKG58fChuPWk9VjkoKSksdC5hcHBseSh0aGlzLGFyZ3VtZW50cykuZHJhdyhuLCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksaSlyZXR1cm4gbj1udWxsLGkrIiJ8fG51bGx9cmV0dXJuIGkudHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOlU5KGUpLGkpOnR9LGkuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlU5KCt0KSxpKTplfSxpLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09dD9udWxsOnQsaSk6bn0saX0sc3ltYm9sczpYOCxzeW1ib2xDaXJjbGU6UDgsc3ltYm9sQ3Jvc3M6Tjgsc3ltYm9sRGlhbW9uZDpPOCxzeW1ib2xTcXVhcmU6Rjgsc3ltYm9sU3RhcjpIOCxzeW1ib2xUcmlhbmdsZTpVOCxzeW1ib2xXeWU6WTgsY3VydmVCYXNpc0Nsb3NlZDpmdW5jdGlvbiBQZnQodCl7cmV0dXJuIG5ldyBKOCh0KX0sY3VydmVCYXNpc09wZW46ZnVuY3Rpb24gTmZ0KHQpe3JldHVybiBuZXcgUTgodCl9LGN1cnZlQmFzaXM6ZnVuY3Rpb24gSWZ0KHQpe3JldHVybiBuZXcgWjgodCl9LGN1cnZlQnVuZGxlOmU3LGN1cnZlQ2FyZGluYWxDbG9zZWQ6YTcsY3VydmVDYXJkaW5hbE9wZW46bDcsY3VydmVDYXJkaW5hbDpyNyxjdXJ2ZUNhdG11bGxSb21DbG9zZWQ6cDcsY3VydmVDYXRtdWxsUm9tT3BlbjptNyxjdXJ2ZUNhdG11bGxSb206aDcsY3VydmVMaW5lYXJDbG9zZWQ6ZnVuY3Rpb24gUmZ0KHQpe3JldHVybiBuZXcgZzcodCl9LGN1cnZlTGluZWFyOnU4LGN1cnZlTW9ub3RvbmVYOmZ1bmN0aW9uIE9mdCh0KXtyZXR1cm4gbmV3IHg3KHQpfSxjdXJ2ZU1vbm90b25lWTpmdW5jdGlvbiB6ZnQodCl7cmV0dXJuIG5ldyB3Nyh0KX0sY3VydmVOYXR1cmFsOmZ1bmN0aW9uIERmdCh0KXtyZXR1cm4gbmV3IE03KHQpfSxjdXJ2ZVN0ZXA6ZnVuY3Rpb24gQmZ0KHQpe3JldHVybiBuZXcgVDcodCwuNSl9LGN1cnZlU3RlcEFmdGVyOmZ1bmN0aW9uIEhmdCh0KXtyZXR1cm4gbmV3IFQ3KHQsMSl9LGN1cnZlU3RlcEJlZm9yZTpmdW5jdGlvbiBGZnQodCl7cmV0dXJuIG5ldyBUNyh0LDApfSxzdGFjazpmdW5jdGlvbiBWZnQoKXt2YXIgdD1VOShbXSksZT1BNyxuPUM3LGk9azc7ZnVuY3Rpb24gcihyKXt2YXIgbyxhLHM9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksbD1yLmxlbmd0aCxjPXMubGVuZ3RoLHU9bmV3IEFycmF5KGMpO2ZvcihvPTA7bzxjOysrbyl7Zm9yKHZhciBoLGQ9c1tvXSxwPXVbb109bmV3IEFycmF5KGwpLGY9MDtmPGw7KytmKXBbZl09aD1bMCwraShyW2ZdLGQsZixyKV0saC5kYXRhPXJbZl07cC5rZXk9ZH1mb3Iobz0wLGE9ZSh1KTtvPGM7KytvKXVbYVtvXV0uaW5kZXg9bztyZXR1cm4gbih1LGEpLHV9cmV0dXJuIHIua2V5cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOlU5KE04LmNhbGwoZSkpLHIpOnR9LHIudmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpVOSgrdCkscik6aX0sci5vcmRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P0E3OiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VTkoTTguY2FsbCh0KSkscik6ZX0sci5vZmZzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09dD9DNzp0LHIpOm59LHJ9LHN0YWNrT2Zmc2V0RXhwYW5kOmZ1bmN0aW9uIFVmdCh0LGUpe2lmKChpPXQubGVuZ3RoKT4wKXtmb3IodmFyIG4saSxyLG89MCxhPXRbMF0ubGVuZ3RoO288YTsrK28pe2ZvcihyPW49MDtuPGk7KytuKXIrPXRbbl1bb11bMV18fDA7aWYocilmb3Iobj0wO248aTsrK24pdFtuXVtvXVsxXS89cn1DNyh0LGUpfX0sc3RhY2tPZmZzZXREaXZlcmdpbmc6ZnVuY3Rpb24gamZ0KHQsZSl7aWYoKHM9dC5sZW5ndGgpPjEpZm9yKHZhciBuLGkscixvLGEscyxsPTAsYz10W2VbMF1dLmxlbmd0aDtsPGM7KytsKWZvcihvPWE9MCxuPTA7bjxzOysrbikocj0oaT10W2Vbbl1dW2xdKVsxXS1pWzBdKT49MD8oaVswXT1vLGlbMV09bys9cik6cjwwPyhpWzFdPWEsaVswXT1hKz1yKTppWzBdPW99LHN0YWNrT2Zmc2V0Tm9uZTpDNyxzdGFja09mZnNldFNpbGhvdWV0dGU6ZnVuY3Rpb24gR2Z0KHQsZSl7aWYoKG49dC5sZW5ndGgpPjApe2Zvcih2YXIgbixpPTAscj10W2VbMF1dLG89ci5sZW5ndGg7aTxvOysraSl7Zm9yKHZhciBhPTAscz0wO2E8bjsrK2Epcys9dFthXVtpXVsxXXx8MDtyW2ldWzFdKz1yW2ldWzBdPS1zLzJ9QzcodCxlKX19LHN0YWNrT2Zmc2V0V2lnZ2xlOmZ1bmN0aW9uIFdmdCh0LGUpe2lmKChyPXQubGVuZ3RoKT4wJiYoaT0obj10W2VbMF1dKS5sZW5ndGgpPjApe2Zvcih2YXIgbixpLHIsbz0wLGE9MTthPGk7KythKXtmb3IodmFyIHM9MCxsPTAsYz0wO3M8cjsrK3Mpe2Zvcih2YXIgdT10W2Vbc11dLGg9dVthXVsxXXx8MCxkPShoLSh1W2EtMV1bMV18fDApKS8yLHA9MDtwPHM7KytwKXt2YXIgZj10W2VbcF1dO2QrPShmW2FdWzFdfHwwKS0oZlthLTFdWzFdfHwwKX1sKz1oLGMrPWQqaH1uW2EtMV1bMV0rPW5bYS0xXVswXT1vLGwmJihvLT1jL2wpfW5bYS0xXVsxXSs9blthLTFdWzBdPW8sQzcodCxlKX19LHN0YWNrT3JkZXJBc2NlbmRpbmc6TDcsc3RhY2tPcmRlckRlc2NlbmRpbmc6ZnVuY3Rpb24gcWZ0KHQpe3JldHVybiBMNyh0KS5yZXZlcnNlKCl9LHN0YWNrT3JkZXJJbnNpZGVPdXQ6ZnVuY3Rpb24gWWZ0KHQpe3ZhciBlLG4saT10Lmxlbmd0aCxyPXQubWFwKFA3KSxvPUE3KHQpLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHJbZV0tclt0XX0pKSxhPTAscz0wLGw9W10sYz1bXTtmb3IoZT0wO2U8aTsrK2Upbj1vW2VdLGE8cz8oYSs9cltuXSxsLnB1c2gobikpOihzKz1yW25dLGMucHVzaChuKSk7cmV0dXJuIGMucmV2ZXJzZSgpLmNvbmNhdChsKX0sc3RhY2tPcmRlck5vbmU6QTcsc3RhY2tPcmRlclJldmVyc2U6ZnVuY3Rpb24gWGZ0KHQpe3JldHVybiBBNyh0KS5yZXZlcnNlKCl9LHRpbWVJbnRlcnZhbDpSNyx0aW1lTWlsbGlzZWNvbmQ6TzcsdGltZU1pbGxpc2Vjb25kczp6Nyx1dGNNaWxsaXNlY29uZDpPNyx1dGNNaWxsaXNlY29uZHM6ejcsdGltZVNlY29uZDpVNyx0aW1lU2Vjb25kczpqNyx1dGNTZWNvbmQ6VTcsdXRjU2Vjb25kczpqNyx0aW1lTWludXRlOkc3LHRpbWVNaW51dGVzOlc3LHRpbWVIb3VyOnE3LHRpbWVIb3VyczpZNyx0aW1lRGF5Olg3LHRpbWVEYXlzOiQ3LHRpbWVXZWVrOlo3LHRpbWVXZWVrczpydHQsdGltZVN1bmRheTpaNyx0aW1lU3VuZGF5czpydHQsdGltZU1vbmRheTpKNyx0aW1lTW9uZGF5czpvdHQsdGltZVR1ZXNkYXk6UTcsdGltZVR1ZXNkYXlzOmF0dCx0aW1lV2VkbmVzZGF5OnR0dCx0aW1lV2VkbmVzZGF5czpzdHQsdGltZVRodXJzZGF5OmV0dCx0aW1lVGh1cnNkYXlzOmx0dCx0aW1lRnJpZGF5Om50dCx0aW1lRnJpZGF5czpjdHQsdGltZVNhdHVyZGF5Oml0dCx0aW1lU2F0dXJkYXlzOnV0dCx0aW1lTW9udGg6aHR0LHRpbWVNb250aHM6ZHR0LHRpbWVZZWFyOnB0dCx0aW1lWWVhcnM6ZnR0LHV0Y01pbnV0ZTptdHQsdXRjTWludXRlczpndHQsdXRjSG91cjpfdHQsdXRjSG91cnM6eXR0LHV0Y0RheTp2dHQsdXRjRGF5czpidHQsdXRjV2Vlazp3dHQsdXRjV2Vla3M6a3R0LHV0Y1N1bmRheTp3dHQsdXRjU3VuZGF5czprdHQsdXRjTW9uZGF5OlN0dCx1dGNNb25kYXlzOkx0dCx1dGNUdWVzZGF5Ok10dCx1dGNUdWVzZGF5czpQdHQsdXRjV2VkbmVzZGF5OkV0dCx1dGNXZWRuZXNkYXlzOk50dCx1dGNUaHVyc2RheTpUdHQsdXRjVGh1cnNkYXlzOkl0dCx1dGNGcmlkYXk6Q3R0LHV0Y0ZyaWRheXM6UnR0LHV0Y1NhdHVyZGF5OkF0dCx1dGNTYXR1cmRheXM6T3R0LHV0Y01vbnRoOnp0dCx1dGNNb250aHM6RHR0LHV0Y1llYXI6QnR0LHV0Y1llYXJzOkh0dCx0aW1lRm9ybWF0RGVmYXVsdExvY2FsZTpUbnQsZ2V0IHRpbWVGb3JtYXQoKXtyZXR1cm4gaGV0fSxnZXQgdGltZVBhcnNlKCl7cmV0dXJuIGRldH0sZ2V0IHV0Y0Zvcm1hdCgpe3JldHVybiBwZXR9LGdldCB1dGNQYXJzZSgpe3JldHVybiBmZXR9LHRpbWVGb3JtYXRMb2NhbGU6Y2V0LGlzb0Zvcm1hdDpMbnQsaXNvUGFyc2U6Tm50LG5vdzpVbnQsdGltZXI6V250LHRpbWVyRmx1c2g6cW50LHRpbWVvdXQ6ZnVuY3Rpb24gJGZ0KHQsZSxuKXt2YXIgaT1uZXcgR250O3JldHVybiBpLnJlc3RhcnQoKGZ1bmN0aW9uKG4pe2kuc3RvcCgpLHQobitlKX0pLGU9bnVsbD09ZT8wOitlLG4pLGl9LGludGVydmFsOmZ1bmN0aW9uIEtmdCh0LGUsbil7dmFyIGk9bmV3IEdudCxyPWU7cmV0dXJuIG51bGw9PWU/KGkucmVzdGFydCh0LGUsbiksaSk6KGU9K2Usbj1udWxsPT1uP1VudCgpOituLGkucmVzdGFydCgoZnVuY3Rpb24gbyhhKXthKz1yLGkucmVzdGFydChvLHIrPWUsbiksdChhKX0pLGUsbiksaSl9LHRyYW5zaXRpb246TmF0LGFjdGl2ZTpmdW5jdGlvbiBaZnQodCxlKXt2YXIgbixpLHI9dC5fX3RyYW5zaXRpb247aWYocilmb3IoaSBpbiBlPW51bGw9PWU/bnVsbDplKyIiLHIpaWYoKG49cltpXSkuc3RhdGU+MSYmbi5uYW1lPT09ZSlyZXR1cm4gbmV3IFBhdChbW3RdXSxuc3QsZSwraSk7cmV0dXJuIG51bGx9LGludGVycnVwdDpob3Qsdm9yb25vaTpmdW5jdGlvbiBKZnQoKXt2YXIgdD1yc3QsZT1vc3Qsbj1udWxsO2Z1bmN0aW9uIGkoaSl7cmV0dXJuIG5ldyBGc3QoaS5tYXAoKGZ1bmN0aW9uKG4scil7dmFyIG89W01hdGgucm91bmQodChuLHIsaSkvenN0KSp6c3QsTWF0aC5yb3VuZChlKG4scixpKS96c3QpKnpzdF07cmV0dXJuIG8uaW5kZXg9cixvLmRhdGE9bixvfSkpLG4pfXJldHVybiBpLnBvbHlnb25zPWZ1bmN0aW9uKHQpe3JldHVybiBpKHQpLnBvbHlnb25zKCl9LGkubGlua3M9ZnVuY3Rpb24odCl7cmV0dXJuIGkodCkubGlua3MoKX0saS50cmlhbmdsZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGkodCkudHJpYW5nbGVzKCl9LGkueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOmlzdCgrZSksaSk6dH0saS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6aXN0KCt0KSxpKTplfSxpLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P251bGw6W1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0saSk6biYmW1tuWzBdWzBdLG5bMF1bMV1dLFtuWzFdWzBdLG5bMV1bMV1dXX0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPW51bGw9PXQ/bnVsbDpbWzAsMF0sWyt0WzBdLCt0WzFdXV0saSk6biYmW25bMV1bMF0tblswXVswXSxuWzFdWzFdLW5bMF1bMV1dfSxpfSx6b29tOmZ1bmN0aW9uIFFmdCgpe3ZhciB0LGUsbj12ZHQsaT1iZHQscj1NZHQsbz13ZHQsYT1TZHQscz1bMCwxLzBdLGw9W1stMS8wLC0xLzBdLFsxLzAsMS8wXV0sYz0yNTAsdT1WdXQsaD1bXSxkPVVzdCgic3RhcnQiLCJ6b29tIiwiZW5kIikscD01MDAsZj0wO2Z1bmN0aW9uIG0odCl7dC5wcm9wZXJ0eSgiX196b29tIix4ZHQpLm9uKCJ3aGVlbC56b29tIix3KS5vbigibW91c2Vkb3duLnpvb20iLFMpLm9uKCJkYmxjbGljay56b29tIixNKS5maWx0ZXIoYSkub24oInRvdWNoc3RhcnQuem9vbSIsRSkub24oInRvdWNobW92ZS56b29tIixUKS5vbigidG91Y2hlbmQuem9vbSB0b3VjaGNhbmNlbC56b29tIixDKS5zdHlsZSgidG91Y2gtYWN0aW9uIiwibm9uZSIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIil9ZnVuY3Rpb24gZyh0LGUpe3JldHVybihlPU1hdGgubWF4KHNbMF0sTWF0aC5taW4oc1sxXSxlKSkpPT09dC5rP3Q6bmV3IGRkdChlLHQueCx0LnkpfWZ1bmN0aW9uIF8odCxlLG4pe3ZhciBpPWVbMF0tblswXSp0Lmsscj1lWzFdLW5bMV0qdC5rO3JldHVybiBpPT09dC54JiZyPT09dC55P3Q6bmV3IGRkdCh0LmssaSxyKX1mdW5jdGlvbiB5KHQpe3JldHVyblsoK3RbMF1bMF0rICt0WzFdWzBdKS8yLCgrdFswXVsxXSsgK3RbMV1bMV0pLzJdfWZ1bmN0aW9uIHYodCxlLG4pe3Qub24oInN0YXJ0Lnpvb20iLChmdW5jdGlvbigpe2IodGhpcyxhcmd1bWVudHMpLnN0YXJ0KCl9KSkub24oImludGVycnVwdC56b29tIGVuZC56b29tIiwoZnVuY3Rpb24oKXtiKHRoaXMsYXJndW1lbnRzKS5lbmQoKX0pKS50d2Vlbigiem9vbSIsKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxyPWFyZ3VtZW50cyxvPWIodCxyKSxhPWkuYXBwbHkodCxyKSxzPW58fHkoYSksbD1NYXRoLm1heChhWzFdWzBdLWFbMF1bMF0sYVsxXVsxXS1hWzBdWzFdKSxjPXQuX196b29tLGg9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0LHIpOmUsZD11KGMuaW52ZXJ0KHMpLmNvbmNhdChsL2MuayksaC5pbnZlcnQocykuY29uY2F0KGwvaC5rKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKDE9PT10KXQ9aDtlbHNle3ZhciBlPWQodCksbj1sL2VbMl07dD1uZXcgZGR0KG4sc1swXS1lWzBdKm4sc1sxXS1lWzFdKm4pfW8uem9vbShudWxsLHQpfX0pKX1mdW5jdGlvbiBiKHQsZSl7Zm9yKHZhciBuLGk9MCxyPWgubGVuZ3RoO2k8cjsrK2kpaWYoKG49aFtpXSkudGhhdD09PXQpcmV0dXJuIG47cmV0dXJuIG5ldyB4KHQsZSl9ZnVuY3Rpb24geCh0LGUpe3RoaXMudGhhdD10LHRoaXMuYXJncz1lLHRoaXMuaW5kZXg9LTEsdGhpcy5hY3RpdmU9MCx0aGlzLmV4dGVudD1pLmFwcGx5KHQsZSl9ZnVuY3Rpb24gdygpe2lmKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdD1iKHRoaXMsYXJndW1lbnRzKSxlPXRoaXMuX196b29tLGk9TWF0aC5tYXgoc1swXSxNYXRoLm1pbihzWzFdLGUuaypNYXRoLnBvdygyLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpKSkpLGE9b2N0KHRoaXMpO2lmKHQud2hlZWwpdC5tb3VzZVswXVswXT09PWFbMF0mJnQubW91c2VbMF1bMV09PT1hWzFdfHwodC5tb3VzZVsxXT1lLmludmVydCh0Lm1vdXNlWzBdPWEpKSxjbGVhclRpbWVvdXQodC53aGVlbCk7ZWxzZXtpZihlLms9PT1pKXJldHVybjt0Lm1vdXNlPVthLGUuaW52ZXJ0KGEpXSxkaHQodGhpcyksdC5zdGFydCgpfXlkdCgpLHQud2hlZWw9c2V0VGltZW91dChjLDE1MCksdC56b29tKCJtb3VzZSIscihfKGcoZSxpKSx0Lm1vdXNlWzBdLHQubW91c2VbMV0pLHQuZXh0ZW50LGwpKX1mdW5jdGlvbiBjKCl7dC53aGVlbD1udWxsLHQuZW5kKCl9fWZ1bmN0aW9uIFMoKXtpZighZSYmbi5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciB0PWIodGhpcyxhcmd1bWVudHMpLGk9bmN0KEdsdC52aWV3KS5vbigibW91c2Vtb3ZlLnpvb20iLGMsITApLm9uKCJtb3VzZXVwLnpvb20iLHUsITApLG89b2N0KHRoaXMpLGE9R2x0LmNsaWVudFgscz1HbHQuY2xpZW50WTtsY3QoR2x0LnZpZXcpLF9kdCgpLHQubW91c2U9W28sdGhpcy5fX3pvb20uaW52ZXJ0KG8pXSxkaHQodGhpcyksdC5zdGFydCgpfWZ1bmN0aW9uIGMoKXtpZih5ZHQoKSwhdC5tb3ZlZCl7dmFyIGU9R2x0LmNsaWVudFgtYSxuPUdsdC5jbGllbnRZLXM7dC5tb3ZlZD1lKmUrbipuPmZ9dC56b29tKCJtb3VzZSIscihfKHQudGhhdC5fX3pvb20sdC5tb3VzZVswXT1vY3QodC50aGF0KSx0Lm1vdXNlWzFdKSx0LmV4dGVudCxsKSl9ZnVuY3Rpb24gdSgpe2kub24oIm1vdXNlbW92ZS56b29tIG1vdXNldXAuem9vbSIsbnVsbCksY2N0KEdsdC52aWV3LHQubW92ZWQpLHlkdCgpLHQuZW5kKCl9fWZ1bmN0aW9uIE0oKXtpZihuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIHQ9dGhpcy5fX3pvb20sZT1vY3QodGhpcyksbz10LmludmVydChlKSxhPXQuayooR2x0LnNoaWZ0S2V5Py41OjIpLHM9cihfKGcodCxhKSxlLG8pLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpLGwpO3lkdCgpLGM+MD9uY3QodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKGMpLmNhbGwodixzLGUpOm5jdCh0aGlzKS5jYWxsKG0udHJhbnNmb3JtLHMpfX1mdW5jdGlvbiBFKCl7aWYobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBlLGkscixvLGE9Yih0aGlzLGFyZ3VtZW50cykscz1HbHQuY2hhbmdlZFRvdWNoZXMsbD1zLmxlbmd0aDtmb3IoX2R0KCksaT0wO2k8bDsrK2kpbz1bbz1hY3QodGhpcyxzLChyPXNbaV0pLmlkZW50aWZpZXIpLHRoaXMuX196b29tLmludmVydChvKSxyLmlkZW50aWZpZXJdLGEudG91Y2gwP2EudG91Y2gxfHwoYS50b3VjaDE9byk6KGEudG91Y2gwPW8sZT0hMCk7aWYodCYmKHQ9Y2xlYXJUaW1lb3V0KHQpLCFhLnRvdWNoMSkpcmV0dXJuIGEuZW5kKCksdm9pZCgobz1uY3QodGhpcykub24oImRibGNsaWNrLnpvb20iKSkmJm8uYXBwbHkodGhpcyxhcmd1bWVudHMpKTtlJiYodD1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3Q9bnVsbH0pLHApLGRodCh0aGlzKSxhLnN0YXJ0KCkpfX1mdW5jdGlvbiBUKCl7dmFyIGUsbixpLG8sYT1iKHRoaXMsYXJndW1lbnRzKSxzPUdsdC5jaGFuZ2VkVG91Y2hlcyxjPXMubGVuZ3RoO2Zvcih5ZHQoKSx0JiYodD1jbGVhclRpbWVvdXQodCkpLGU9MDtlPGM7KytlKWk9YWN0KHRoaXMscywobj1zW2VdKS5pZGVudGlmaWVyKSxhLnRvdWNoMCYmYS50b3VjaDBbMl09PT1uLmlkZW50aWZpZXI/YS50b3VjaDBbMF09aTphLnRvdWNoMSYmYS50b3VjaDFbMl09PT1uLmlkZW50aWZpZXImJihhLnRvdWNoMVswXT1pKTtpZihuPWEudGhhdC5fX3pvb20sYS50b3VjaDEpe3ZhciB1PWEudG91Y2gwWzBdLGg9YS50b3VjaDBbMV0sZD1hLnRvdWNoMVswXSxwPWEudG91Y2gxWzFdLGY9KGY9ZFswXS11WzBdKSpmKyhmPWRbMV0tdVsxXSkqZixtPShtPXBbMF0taFswXSkqbSsobT1wWzFdLWhbMV0pKm07bj1nKG4sTWF0aC5zcXJ0KGYvbSkpLGk9Wyh1WzBdK2RbMF0pLzIsKHVbMV0rZFsxXSkvMl0sbz1bKGhbMF0rcFswXSkvMiwoaFsxXStwWzFdKS8yXX1lbHNle2lmKCFhLnRvdWNoMClyZXR1cm47aT1hLnRvdWNoMFswXSxvPWEudG91Y2gwWzFdfWEuem9vbSgidG91Y2giLHIoXyhuLGksbyksYS5leHRlbnQsbCkpfWZ1bmN0aW9uIEMoKXt2YXIgdCxuLGk9Yih0aGlzLGFyZ3VtZW50cykscj1HbHQuY2hhbmdlZFRvdWNoZXMsbz1yLmxlbmd0aDtmb3IoX2R0KCksZSYmY2xlYXJUaW1lb3V0KGUpLGU9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtlPW51bGx9KSxwKSx0PTA7dDxvOysrdCluPXJbdF0saS50b3VjaDAmJmkudG91Y2gwWzJdPT09bi5pZGVudGlmaWVyP2RlbGV0ZSBpLnRvdWNoMDppLnRvdWNoMSYmaS50b3VjaDFbMl09PT1uLmlkZW50aWZpZXImJmRlbGV0ZSBpLnRvdWNoMTtpLnRvdWNoMSYmIWkudG91Y2gwJiYoaS50b3VjaDA9aS50b3VjaDEsZGVsZXRlIGkudG91Y2gxKSxpLnRvdWNoMD9pLnRvdWNoMFsxXT10aGlzLl9fem9vbS5pbnZlcnQoaS50b3VjaDBbMF0pOmkuZW5kKCl9cmV0dXJuIG0udHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5zZWxlY3Rpb24/dC5zZWxlY3Rpb24oKTp0O24ucHJvcGVydHkoIl9fem9vbSIseGR0KSx0IT09bj92KHQsZSk6bi5pbnRlcnJ1cHQoKS5lYWNoKChmdW5jdGlvbigpe2IodGhpcyxhcmd1bWVudHMpLnN0YXJ0KCkuem9vbShudWxsLCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUpLmVuZCgpfSkpfSxtLnNjYWxlQnk9ZnVuY3Rpb24odCxlKXttLnNjYWxlVG8odCwoZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9fem9vbS5rLG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZTtyZXR1cm4gdCpufSkpfSxtLnNjYWxlVG89ZnVuY3Rpb24odCxlKXttLnRyYW5zZm9ybSh0LChmdW5jdGlvbigpe3ZhciB0PWkuYXBwbHkodGhpcyxhcmd1bWVudHMpLG49dGhpcy5fX3pvb20sbz15KHQpLGE9bi5pbnZlcnQobykscz0iZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplO3JldHVybiByKF8oZyhuLHMpLG8sYSksdCxsKX0pKX0sbS50cmFuc2xhdGVCeT1mdW5jdGlvbih0LGUsbil7bS50cmFuc2Zvcm0odCwoZnVuY3Rpb24oKXtyZXR1cm4gcih0aGlzLl9fem9vbS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZSwiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuKSxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxsKX0pKX0sbS50cmFuc2xhdGVUbz1mdW5jdGlvbih0LGUsbil7bS50cmFuc2Zvcm0odCwoZnVuY3Rpb24oKXt2YXIgdD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxvPXRoaXMuX196b29tLGE9eSh0KTtyZXR1cm4gcihtZHQudHJhbnNsYXRlKGFbMF0sYVsxXSkuc2NhbGUoby5rKS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIGU/LWUuYXBwbHkodGhpcyxhcmd1bWVudHMpOi1lLCJmdW5jdGlvbiI9PXR5cGVvZiBuPy1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTotbiksdCxsKX0pKX0seC5wcm90b3R5cGU9e3N0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLmluZGV4PWgucHVzaCh0aGlzKS0xLHRoaXMuZW1pdCgic3RhcnQiKSksdGhpc30sem9vbTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm1vdXNlJiYibW91c2UiIT09dCYmKHRoaXMubW91c2VbMV09ZS5pbnZlcnQodGhpcy5tb3VzZVswXSkpLHRoaXMudG91Y2gwJiYidG91Y2giIT09dCYmKHRoaXMudG91Y2gwWzFdPWUuaW52ZXJ0KHRoaXMudG91Y2gwWzBdKSksdGhpcy50b3VjaDEmJiJ0b3VjaCIhPT10JiYodGhpcy50b3VjaDFbMV09ZS5pbnZlcnQodGhpcy50b3VjaDFbMF0pKSx0aGlzLnRoYXQuX196b29tPWUsdGhpcy5lbWl0KCJ6b29tIiksdGhpc30sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PS0tdGhpcy5hY3RpdmUmJihoLnNwbGljZSh0aGlzLmluZGV4LDEpLHRoaXMuaW5kZXg9LTEsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXshKGZ1bmN0aW9uIGUodCxuLGkscil7dmFyIG89R2x0O3Quc291cmNlRXZlbnQ9R2x0LEdsdD10O3RyeXtuLmFwcGx5KGkscil9ZmluYWxseXtHbHQ9b319KShuZXcgaGR0KG0sdCx0aGlzLnRoYXQuX196b29tKSxkLmFwcGx5LGQsW3QsdGhpcy50aGF0LHRoaXMuYXJnc10pfX0sbS53aGVlbERlbHRhPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dWR0KCt0KSxtKTpvfSxtLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnVkdCghIXQpLG0pOm59LG0udG91Y2hhYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dWR0KCEhdCksbSk6YX0sbS5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp1ZHQoW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLG0pOml9LG0uc2NhbGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHNbMF09K3RbMF0sc1sxXT0rdFsxXSxtKTpbc1swXSxzWzFdXX0sbS50cmFuc2xhdGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGxbMF1bMF09K3RbMF1bMF0sbFsxXVswXT0rdFsxXVswXSxsWzBdWzFdPSt0WzBdWzFdLGxbMV1bMV09K3RbMV1bMV0sbSk6W1tsWzBdWzBdLGxbMF1bMV1dLFtsWzFdWzBdLGxbMV1bMV1dXX0sbS5jb25zdHJhaW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxtKTpyfSxtLmR1cmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSt0LG0pOmN9LG0uaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxtKTp1fSxtLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9ZC5vbi5hcHBseShkLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1kP206dH0sbS5jbGlja0Rpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSh0PSt0KSp0LG0pOk1hdGguc3FydChmKX0sbX0sem9vbVRyYW5zZm9ybTpnZHQsem9vbUlkZW50aXR5Om1kdH0pKTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKgogICAgICogQGZpbGVvdmVydmlldyBtYW51YWxseSBhZGQgZDMtc2VsZWN0aW9uLW11bHRpIHRvIGQzIGRlZmF1bHQgYnVuZGxlLiBNb3N0IG9mIHRoaXMgY29kZSBpcwogICAgICogY29waWVkIGZyb20gZDMtc2VsZWN0aW9uLW11bHRpQDEuMC4wLgogICAgICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1zZWxlY3Rpb24tbXVsdGkvaXNzdWVzLzExIGZvciB3aHkgd2UgaGF2ZSB0byBkbyB0aGlzCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgdG10PUVkdCxlbXQ9RWR0O2Z1bmN0aW9uIG5tdCh0LGUpe3JldHVybiB0LmVhY2goKGZ1bmN0aW9uKCl7dmFyIHQ9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksbj10bXQuc2VsZWN0KHRoaXMpO2Zvcih2YXIgaSBpbiB0KW4uYXR0cihpLHRbaV0pfSkpfWZ1bmN0aW9uIGltdCh0LGUpe2Zvcih2YXIgbiBpbiBlKXQuYXR0cihuLGVbbl0pO3JldHVybiB0fWZ1bmN0aW9uIHJtdCh0LGUsbil7cmV0dXJuIHQuZWFjaCgoZnVuY3Rpb24oKXt2YXIgdD1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxpPXRtdC5zZWxlY3QodGhpcyk7Zm9yKHZhciByIGluIHQpaS5zdHlsZShyLHRbcl0sbil9KSl9ZnVuY3Rpb24gb210KHQsZSxuKXtmb3IodmFyIGkgaW4gZSl0LnN0eWxlKGksZVtpXSxuKTtyZXR1cm4gdH1mdW5jdGlvbiBhbXQodCxlKXtyZXR1cm4gdC5lYWNoKChmdW5jdGlvbigpe3ZhciB0PWUuYXBwbHkodGhpcyxhcmd1bWVudHMpLG49dG10LnNlbGVjdCh0aGlzKTtmb3IodmFyIGkgaW4gdCluLnByb3BlcnR5KGksdFtpXSl9KSl9ZnVuY3Rpb24gc210KHQsZSl7Zm9yKHZhciBuIGluIGUpdC5wcm9wZXJ0eShuLGVbbl0pO3JldHVybiB0fWZ1bmN0aW9uIGxtdCh0LGUpe3JldHVybiB0LmVhY2goKGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksaT10bXQuc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24odCk7Zm9yKHZhciByIGluIG4paS5hdHRyKHIsbltyXSl9KSl9ZnVuY3Rpb24gY210KHQsZSl7Zm9yKHZhciBuIGluIGUpdC5hdHRyKG4sZVtuXSk7cmV0dXJuIHR9ZnVuY3Rpb24gdW10KHQsZSxuKXtyZXR1cm4gdC5lYWNoKChmdW5jdGlvbigpe3ZhciBpPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHI9dG10LnNlbGVjdCh0aGlzKS50cmFuc2l0aW9uKHQpO2Zvcih2YXIgbyBpbiBpKXIuc3R5bGUobyxpW29dLG4pfSkpfWZ1bmN0aW9uIGhtdCh0LGUsbil7Zm9yKHZhciBpIGluIGUpdC5zdHlsZShpLGVbaV0sbik7cmV0dXJuIHR9dG10LnNlbGVjdGlvbi5wcm90b3R5cGUuYXR0cnM9ZnVuY3Rpb24gZG10KHQpe3JldHVybigiZnVuY3Rpb24iPT10eXBlb2YgdD9ubXQ6aW10KSh0aGlzLHQpfSx0bXQuc2VsZWN0aW9uLnByb3RvdHlwZS5zdHlsZXM9ZnVuY3Rpb24gcG10KHQsZSl7cmV0dXJuKCJmdW5jdGlvbiI9PXR5cGVvZiB0P3JtdDpvbXQpKHRoaXMsdCxudWxsPT1lPyIiOmUpfSx0bXQuc2VsZWN0aW9uLnByb3RvdHlwZS5wcm9wZXJ0aWVzPWZ1bmN0aW9uIGZtdCh0KXtyZXR1cm4oImZ1bmN0aW9uIj09dHlwZW9mIHQ/YW10OnNtdCkodGhpcyx0KX0sZW10LnRyYW5zaXRpb24ucHJvdG90eXBlLmF0dHJzPWZ1bmN0aW9uIG1tdCh0KXtyZXR1cm4oImZ1bmN0aW9uIj09dHlwZW9mIHQ/bG10OmNtdCkodGhpcyx0KX0sZW10LnRyYW5zaXRpb24ucHJvdG90eXBlLnN0eWxlcz1mdW5jdGlvbiBnbXQodCxlKXtyZXR1cm4oImZ1bmN0aW9uIj09dHlwZW9mIHQ/dW10OmhtdCkodGhpcyx0LG51bGw9PWU/IiI6ZSl9O3ZhciBfbXQ9e30seW10PXt9LHZtdD1iZSh2bSksYm10PXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShibXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB4bXQ9RWR0O2JtdC5jb2VyY2VFeHRlcm5hbEQzPWZ1bmN0aW9uIHdtdCh0KXtpZihudWxsPT10LmF0dHJzKXtpZihudWxsPT10Lm5vZGVzKXt2YXIgZT1bXTtyZXR1cm4gdC5lYWNoKChmdW5jdGlvbigpe2UucHVzaCh0aGlzKX0pKSx4bXQuc2VsZWN0QWxsKGUpfXJldHVybiB4bXQuc2VsZWN0QWxsKHQubm9kZXMoKSl9cmV0dXJuIHR9O3ZhciBTbXQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KFNtdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksU210Lm1ha2VFbnVtPWZ1bmN0aW9uIE1tdCh0KXtyZXR1cm4gdC5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbZV09ZSx0fSkse30pfSwKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHltdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIEVtdD1ibXQsVG10PXtsaW5lYXI6dm10LmVhc2VMaW5lYXIscXVhZDp2bXQuZWFzZVF1YWQscXVhZEluOnZtdC5lYXNlUXVhZEluLHF1YWRPdXQ6dm10LmVhc2VRdWFkT3V0LHF1YWRJbk91dDp2bXQuZWFzZVF1YWRJbk91dCxjdWJpYzp2bXQuZWFzZUN1YmljLGN1YmljSW46dm10LmVhc2VDdWJpY0luLGN1YmljT3V0OnZtdC5lYXNlQ3ViaWNPdXQsY3ViaWNJbk91dDp2bXQuZWFzZUN1YmljSW5PdXQscG9seTp2bXQuZWFzZVBvbHkscG9seUluOnZtdC5lYXNlUG9seUluLHBvbHlPdXQ6dm10LmVhc2VQb2x5T3V0LHBvbHlJbk91dDp2bXQuZWFzZVBvbHlJbk91dCxzaW46dm10LmVhc2VTaW4sc2luSW46dm10LmVhc2VTaW5JbixzaW5PdXQ6dm10LmVhc2VTaW5PdXQsc2luSW5PdXQ6dm10LmVhc2VTaW5Jbk91dCxleHA6dm10LmVhc2VFeHAsZXhwSW46dm10LmVhc2VFeHBJbixleHBPdXQ6dm10LmVhc2VFeHBPdXQsZXhwSW5PdXQ6dm10LmVhc2VFeHBJbk91dCxjaXJjbGU6dm10LmVhc2VDaXJjbGUsY2lyY2xlSW46dm10LmVhc2VDaXJjbGVJbixjaXJjbGVPdXQ6dm10LmVhc2VDaXJjbGVPdXQsY2lyY2xlSW5PdXQ6dm10LmVhc2VDaXJjbGVJbk91dCxib3VuY2U6dm10LmVhc2VCb3VuY2UsYm91bmNlSW46dm10LmVhc2VCb3VuY2VJbixib3VuY2VPdXQ6dm10LmVhc2VCb3VuY2VPdXQsYm91bmNlSW5PdXQ6dm10LmVhc2VCb3VuY2VJbk91dCxiYWNrOnZtdC5lYXNlQmFjayxiYWNrSW46dm10LmVhc2VCYWNrSW4sYmFja091dDp2bXQuZWFzZUJhY2tPdXQsYmFja0luT3V0OnZtdC5lYXNlQmFja0luT3V0LGVsYXN0aWM6dm10LmVhc2VFbGFzdGljLGVsYXN0aWNJbjp2bXQuZWFzZUVsYXN0aWNJbixlbGFzdGljT3V0OnZtdC5lYXNlRWxhc3RpY091dCxlbGFzdGljSW5PdXQ6dm10LmVhc2VFbGFzdGljSW5PdXR9O3ltdC5FYXNlTmFtZT1TbXQubWFrZUVudW0oWyJsaW5lYXIiLCJxdWFkIiwicXVhZEluIiwicXVhZE91dCIsInF1YWRJbk91dCIsImN1YmljIiwiY3ViaWNJbiIsImN1YmljT3V0IiwiY3ViaWNJbk91dCIsInBvbHkiLCJwb2x5SW4iLCJwb2x5T3V0IiwicG9seUluT3V0Iiwic2luIiwic2luSW4iLCJzaW5PdXQiLCJzaW5Jbk91dCIsImV4cCIsImV4cEluIiwiZXhwT3V0IiwiZXhwSW5PdXQiLCJjaXJjbGUiLCJjaXJjbGVJbiIsImNpcmNsZU91dCIsImNpcmNsZUluT3V0IiwiYm91bmNlIiwiYm91bmNlSW4iLCJib3VuY2VPdXQiLCJib3VuY2VJbk91dCIsImJhY2siLCJiYWNrSW4iLCJiYWNrT3V0IiwiYmFja0luT3V0IiwiZWxhc3RpYyIsImVsYXN0aWNJbiIsImVsYXN0aWNPdXQiLCJlbGFzdGljSW5PdXQiXSk7dmFyIENtdD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fc3RhcnREZWxheT10Ll9ERUZBVUxUX1NUQVJUX0RFTEFZX01JTExJU0VDT05EUyx0aGlzLl9zdGVwRHVyYXRpb249dC5fREVGQVVMVF9TVEVQX0RVUkFUSU9OX01JTExJU0VDT05EUyx0aGlzLl9zdGVwRGVsYXk9dC5fREVGQVVMVF9JVEVSQVRJVkVfREVMQVlfTUlMTElTRUNPTkRTLHRoaXMuX21heFRvdGFsRHVyYXRpb249dC5fREVGQVVMVF9NQVhfVE9UQUxfRFVSQVRJT05fTUlMTElTRUNPTkRTLHRoaXMuX2Vhc2luZ01vZGU9dC5fREVGQVVMVF9FQVNJTkdfTU9ERX1yZXR1cm4gdC5wcm90b3R5cGUudG90YWxUaW1lPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2dldEFkanVzdGVkSXRlcmF0aXZlRGVsYXkodCk7cmV0dXJuIHRoaXMuc3RhcnREZWxheSgpK2UqTWF0aC5tYXgodC0xLDApK3RoaXMuc3RlcER1cmF0aW9uKCl9LHQucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLGk9KHQ9RW10LmNvZXJjZUV4dGVybmFsRDModCkpLnNpemUoKSxyPXRoaXMuX2dldEFkanVzdGVkSXRlcmF0aXZlRGVsYXkoaSk7cmV0dXJuIHQudHJhbnNpdGlvbigpLmVhc2UodGhpcy5fZ2V0RWFzZUZhY3RvcnkoKSkuZHVyYXRpb24odGhpcy5zdGVwRHVyYXRpb24oKSkuZGVsYXkoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uc3RhcnREZWxheSgpK3IqZX0pKS5hdHRycyhlKX0sdC5wcm90b3R5cGUuc3RhcnREZWxheT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9zdGFydERlbGF5Oih0aGlzLl9zdGFydERlbGF5PXQsdGhpcyl9LHQucHJvdG90eXBlLnN0ZXBEdXJhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9NYXRoLm1pbih0aGlzLl9zdGVwRHVyYXRpb24sdGhpcy5fbWF4VG90YWxEdXJhdGlvbik6KHRoaXMuX3N0ZXBEdXJhdGlvbj10LHRoaXMpfSx0LnByb3RvdHlwZS5zdGVwRGVsYXk9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fc3RlcERlbGF5Oih0aGlzLl9zdGVwRGVsYXk9dCx0aGlzKX0sdC5wcm90b3R5cGUubWF4VG90YWxEdXJhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9tYXhUb3RhbER1cmF0aW9uOih0aGlzLl9tYXhUb3RhbER1cmF0aW9uPXQsdGhpcyl9LHQucHJvdG90eXBlLmVhc2luZ01vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZWFzaW5nTW9kZToodGhpcy5fZWFzaW5nTW9kZT10LHRoaXMpfSx0LnByb3RvdHlwZS5fZ2V0RWFzZUZhY3Rvcnk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVhc2luZ01vZGUoKTtpZigic3RyaW5nIj09dHlwZW9mIHQpe3ZhciBlPVRtdFt0XTtyZXR1cm4gbnVsbD09ZT9UbXQubGluZWFyOmV9cmV0dXJuIHR9LHQucHJvdG90eXBlLl9nZXRBZGp1c3RlZEl0ZXJhdGl2ZURlbGF5PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubWF4VG90YWxEdXJhdGlvbigpLXRoaXMuc3RlcER1cmF0aW9uKCksbj0oZT1NYXRoLm1heChlLDApKS9NYXRoLm1heCh0LTEsMSk7cmV0dXJuIE1hdGgubWluKHRoaXMuc3RlcERlbGF5KCksbil9LHQuX0RFRkFVTFRfU1RBUlRfREVMQVlfTUlMTElTRUNPTkRTPTAsdC5fREVGQVVMVF9TVEVQX0RVUkFUSU9OX01JTExJU0VDT05EUz0zMDAsdC5fREVGQVVMVF9JVEVSQVRJVkVfREVMQVlfTUlMTElTRUNPTkRTPTE1LHQuX0RFRkFVTFRfTUFYX1RPVEFMX0RVUkFUSU9OX01JTExJU0VDT05EUz0xLzAsdC5fREVGQVVMVF9FQVNJTkdfTU9ERT0iZXhwT3V0Iix0fSkoKTt5bXQuRWFzaW5nPUNtdDt2YXIgQW10PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShBbXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBrbXQ9Ym10LExtdD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS50b3RhbFRpbWU9ZnVuY3Rpb24odCl7cmV0dXJuIDB9LHQucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4odD1rbXQuY29lcmNlRXh0ZXJuYWxEMyh0KSkuYXR0cnMoZSl9LHR9KSgpO0FtdC5OdWxsPUxtdCwoZnVuY3Rpb24odCl7Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZT11TztlLl9fZXhwb3J0U3Rhcih5bXQsdCksZS5fX2V4cG9ydFN0YXIoQW10LHQpfSkoX210KTt2YXIgUG10PXt9LE5tdD17fSxJbXQ9e30sUm10PXt9LE9tdD17fSx6bXQ9e30sRG10PXt9LEJtdD17fSxIbXQ9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KEhtdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIEZtdD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuY2FjaGU9e30sdGhpcy5jb21wdXRlPXR9cmV0dXJuIHQucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jYWNoZS5oYXNPd25Qcm9wZXJ0eSh0KXx8KHRoaXMuY2FjaGVbdF09dGhpcy5jb21wdXRlKHQpKSx0aGlzLmNhY2hlW3RdfSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNhY2hlPXt9LHRoaXN9LHR9KSgpO0htdC5DYWNoZT1GbXQ7dmFyIFZtdD17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVm10LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgVW10PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQuYXJyYXlFcT1mdW5jdGlvbih0LGUpe2lmKG51bGw9PXR8fG51bGw9PWUpcmV0dXJuIHQ9PT1lO2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspaWYodFtuXSE9PWVbbl0pcmV0dXJuITE7cmV0dXJuITB9LHQub2JqRXE9ZnVuY3Rpb24oZSxuKXtpZihudWxsPT1lfHxudWxsPT1uKXJldHVybiBlPT09bjt2YXIgaT1PYmplY3Qua2V5cyhlKS5zb3J0KCkscj1PYmplY3Qua2V5cyhuKS5zb3J0KCksbz1pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGVbdF19KSksYT1yLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIG5bdF19KSk7cmV0dXJuIHQuYXJyYXlFcShpLHIpJiZ0LmFycmF5RXEobyxhKX0sdC5zdHJpY3RFcT1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZX0sdC5kZWZhdWx0cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZVtuLTFdPWFyZ3VtZW50c1tuXTtpZihudWxsPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCIpO3ZhciBpPU9iamVjdCh0KTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbih0KXtpZihudWxsIT10KWZvcih2YXIgZSBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpJiYoaVtlXT10W2VdKX0pKSxpfSx0fSkoKTtWbXQuTWV0aG9kcz1VbXQ7dmFyIGptdD17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoam10LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgR210PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQuY29tYmluZVdoaXRlc3BhY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZSgvWyBcdF0rL2csIiAiKX0sdC5pc05vdEVtcHR5U3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB0JiYiIiE9PXQudHJpbSgpfSx0LnRyaW1TdGFydD1mdW5jdGlvbihlLG4pe2lmKCFlKXJldHVybiBlO3ZhciBpPWUuc3BsaXQoIiIpLHI9bj9mdW5jdGlvbihlKXtyZXR1cm4gZS5zcGxpdChuKS5zb21lKHQuaXNOb3RFbXB0eVN0cmluZyl9OnQuaXNOb3RFbXB0eVN0cmluZztyZXR1cm4gaS5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIodCtlKT90K2U6dH0pLCIiKX0sdC50cmltRW5kPWZ1bmN0aW9uKGUsbil7aWYoIWUpcmV0dXJuIGU7dmFyIGk9ZS5zcGxpdCgiIik7cmV0dXJuIGkucmV2ZXJzZSgpLChpPXQudHJpbVN0YXJ0KGkuam9pbigiIiksbikuc3BsaXQoIiIpKS5yZXZlcnNlKCksaS5qb2luKCIiKX0sdH0pKCk7am10LlN0cmluZ01ldGhvZHM9R210O3ZhciBXbXQ9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KFdtdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHFtdD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5Xb3JkRGl2aWRlclJlZ0V4cD1uZXcgUmVnRXhwKCJcXFciKSx0aGlzLldoaXRlc3BhY2VSZWdFeHA9bmV3IFJlZ0V4cCgiXFxzIil9cmV0dXJuIHQucHJvdG90eXBlLnRva2VuaXplPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7cmV0dXJuIHQuc3BsaXQoIiIpLnJlZHVjZSgoZnVuY3Rpb24odCxuKXtyZXR1cm4gdC5zbGljZSgwLC0xKS5jb25jYXQoZS5zaG91bGRDcmVhdGVOZXdUb2tlbih0W3QubGVuZ3RoLTFdLG4pKX0pLFsiIl0pfSx0LnByb3RvdHlwZS5zaG91bGRDcmVhdGVOZXdUb2tlbj1mdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybltlXTt2YXIgbj10W3QubGVuZ3RoLTFdO3JldHVybiB0aGlzLldoaXRlc3BhY2VSZWdFeHAudGVzdChuKSYmdGhpcy5XaGl0ZXNwYWNlUmVnRXhwLnRlc3QoZSk/W3QrZV06dGhpcy5XaGl0ZXNwYWNlUmVnRXhwLnRlc3Qobil8fHRoaXMuV2hpdGVzcGFjZVJlZ0V4cC50ZXN0KGUpP1t0LGVdOnRoaXMuV29yZERpdmlkZXJSZWdFeHAudGVzdChuKT9uPT09ZT9bdCtlXTpbdCxlXTpbdCtlXX0sdH0pKCk7V210LlRva2VuaXplcj1xbXQsKGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7Zm9yKHZhciBuIGluIGUpdC5oYXNPd25Qcm9wZXJ0eShuKXx8KHRbbl09ZVtuXSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUoSG10KSxlKFZtdCksZShqbXQpLGUoV210KX0pKEJtdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KERtdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFltdD1CbXQsWG10PXt0ZXh0Um90YXRpb246MCx0ZXh0U2hlYXI6MCx4QWxpZ246ImxlZnQiLHlBbGlnbjoidG9wIn0sJG10PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4pe3RoaXMuX21lYXN1cmVyPXQsdGhpcy5fcGVuRmFjdG9yeT1lLHRoaXMuX3dyYXBwZXI9bn1yZXR1cm4gdC5wcm90b3R5cGUubWVhc3VyZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX21lYXN1cmVyPXQsdGhpc30sdC5wcm90b3R5cGUud3JhcHBlcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fd3JhcHBlcj10LHRoaXN9LHQucHJvdG90eXBlLnBlbkZhY3Rvcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BlbkZhY3Rvcnk9dCx0aGlzfSx0LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLG4saSxyLG8pe2lmKHZvaWQgMD09PXImJihyPXt9KSxyPVltdC5NZXRob2RzLmRlZmF1bHRzKHt9LFhtdCxyKSwtMT09PXQuU3VwcG9ydGVkUm90YXRpb24uaW5kZXhPZihyLnRleHRSb3RhdGlvbikpdGhyb3cgbmV3IEVycm9yKCJ1bnN1cHBvcnRlZCByb3RhdGlvbiAtICIrci50ZXh0Um90YXRpb24rIi4gU3VwcG9ydGVkIHJvdGF0aW9ucyBhcmUgIit0LlN1cHBvcnRlZFJvdGF0aW9uLmpvaW4oIiwgIikpO2lmKG51bGwhPXIudGV4dFNoZWFyJiZyLnRleHRTaGVhcjwtODB8fHIudGV4dFNoZWFyPjgwKXRocm93IG5ldyBFcnJvcigidW5zdXBwb3J0ZWQgc2hlYXIgYW5nbGUgLSAiK3IudGV4dFNoZWFyKyIuIE11c3QgYmUgYmV0d2VlbiAtODAgYW5kIDgwIik7dmFyIGE9TWF0aC5hYnMoTWF0aC5hYnMoci50ZXh0Um90YXRpb24pLTkwKT40NSxzPWE/bjppLGw9YT9pOm4sYz1yLnRleHRTaGVhcix1PWMqTWF0aC5QSS8xODAsaD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0LGQ9aCpNYXRoLnRhbih1KSxwPXMvTWF0aC5jb3ModSktTWF0aC5hYnMoZCksZj1sKk1hdGguY29zKHUpLG09WW10LlN0cmluZ01ldGhvZHMuY29tYmluZVdoaXRlc3BhY2UoZSksZz0odGhpcy5fd3JhcHBlcj90aGlzLl93cmFwcGVyLndyYXAobSx0aGlzLl9tZWFzdXJlcixwLGYpLndyYXBwZWRUZXh0Om0pLnNwbGl0KCJcbiIpLF89dC5YT2Zmc2V0RmFjdG9yW3IueEFsaWduXSpwKk1hdGguc2luKHUpLXQuWU9mZnNldEZhY3RvcltyLnlBbGlnbl0qKGYtZy5sZW5ndGgqaCkseT1bMCwwXSx2PXIudGV4dFJvdGF0aW9uK2M7c3dpdGNoKHIudGV4dFJvdGF0aW9uKXtjYXNlIDkwOnk9W24rXywwXTticmVhaztjYXNlLTkwOnk9Wy1fLGldO2JyZWFrO2Nhc2UgMTgwOnk9W24saStfXTticmVhaztkZWZhdWx0Onk9WzAsLV9dfXZhciBiPXRoaXMuX3BlbkZhY3RvcnkuY3JlYXRlUGVuKGUse3RyYW5zbGF0ZTp5LHJvdGF0ZTp2fSxvKTt0aGlzLndyaXRlTGluZXMoZyxiLHAsaCxkLHIueEFsaWduKSxudWxsIT1iLmRlc3Ryb3kmJmIuZGVzdHJveSgpfSx0LnByb3RvdHlwZS53cml0ZUxpbmVzPWZ1bmN0aW9uKHQsZSxuLGkscixvKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQsYSl7ZS53cml0ZSh0LG4sbyxyPjA/KGErMSkqcjphKnIsKGErMSkqaSl9KSl9LHR9KSgpOyRtdC5YT2Zmc2V0RmFjdG9yPXtjZW50ZXI6LjUsbGVmdDowLHJpZ2h0OjF9LCRtdC5ZT2Zmc2V0RmFjdG9yPXtib3R0b206MSxjZW50ZXI6LjUsdG9wOjB9LCRtdC5TdXBwb3J0ZWRSb3RhdGlvbj1bLTkwLDAsMTgwLDkwXSxEbXQuV3JpdGVyPSRtdCwoZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLChmdW5jdGlvbiBlKG4pe2Zvcih2YXIgaSBpbiBuKXQuaGFzT3duUHJvcGVydHkoaSl8fCh0W2ldPW5baV0pfSkoRG10KX0pKHptdCk7dmFyIEttdD17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoS210LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgWm10PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQuYXBwZW5kPWZ1bmN0aW9uKGUsbil7Zm9yKHZhciBpPVtdLHI9MjtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKWlbci0yXT1hcmd1bWVudHNbcl07dmFyIG89dC5jcmVhdGUuYXBwbHkodCxbbl0uY29uY2F0KGkpKTtyZXR1cm4gZS5hcHBlbmRDaGlsZChvKSxvfSx0LmNyZWF0ZT1mdW5jdGlvbihlKXtmb3IodmFyIG49W10saT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspbltpLTFdPWFyZ3VtZW50c1tpXTt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpO3JldHVybiB0LmFkZENsYXNzZXMuYXBwbHkodCxbcl0uY29uY2F0KG4pKSxyfSx0LmFkZENsYXNzZXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWVbbi0xXT1hcmd1bWVudHNbbl07ZT1lLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXR9KSksbnVsbCE9dC5jbGFzc0xpc3Q/ZS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmNsYXNzTGlzdC5hZGQoZSl9KSk6dC5zZXRBdHRyaWJ1dGUoImNsYXNzIixlLmpvaW4oIiAiKSl9LHQuZ2V0RGltZW5zaW9ucz1mdW5jdGlvbih0KXtpZih0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCl0cnl7dmFyIGU9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57d2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHR9fWNhdGNoKHQpe31yZXR1cm57aGVpZ2h0OjAsd2lkdGg6MH19LHR9KSgpO0ttdC5IdG1sVXRpbHM9Wm10O3ZhciBKbXQ9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dm9pZCAwPT09biYmKG49ITEpO3ZhciBpPXRoaXM7dGhpcy5lbGVtZW50PXQsdGhpcy5jbGFzc05hbWU9ZSx0aGlzLmFkZFRpdGxlPW4sdGhpcy5jcmVhdGVSdWxlcj1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1abXQuYXBwZW5kKGkuZWxlbWVudCwic3BhbiIsInRleHQtdG1wIixpLmNsYXNzTmFtZSk7ZS50ZXh0Q29udGVudD10O3ZhciBuPVptdC5nZXREaW1lbnNpb25zKGUpO3JldHVybiBpLmVsZW1lbnQucmVtb3ZlQ2hpbGQoZSksbn19LHRoaXMuY3JlYXRlUGVuPWZ1bmN0aW9uKHQsZSxuKXtudWxsPT1uJiYobj1pLmVsZW1lbnQpO3ZhciByPVptdC5hcHBlbmQobiwiZGl2IiwidGV4dC1ibG9jayIsaS5jbGFzc05hbWUpO3JldHVybiByLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsci5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAtMWVtKSB0cmFuc2xhdGUoIitlLnRyYW5zbGF0ZVswXSsicHgsICIrZS50cmFuc2xhdGVbMV0rInB4KSByb3RhdGUoIitlLnJvdGF0ZSsiZGVnKSIsci5zdHlsZS50cmFuc2Zvcm1PcmlnaW49IjAgMS4yZW0iLGkuYWRkVGl0bGUmJnIuc2V0QXR0cmlidXRlKCJ0aXRsZSIsdCksaS5jcmVhdGVIdG1sTGluZVBlbihyKX19cmV0dXJuIHQucHJvdG90eXBlLnNldEFkZFRpdGxlPWZ1bmN0aW9uKHQpe3RoaXMuYWRkVGl0bGU9dH0sdC5wcm90b3R5cGUuY3JlYXRlSHRtbExpbmVQZW49ZnVuY3Rpb24odCl7cmV0dXJue3dyaXRlOmZ1bmN0aW9uKGUsbixpLHIsbyl7dmFyIGE9Wm10LmFwcGVuZCh0LCJkaXYiLCJ0ZXh0LWxpbmUiKTthLnRleHRDb250ZW50PWUsYS5zdHlsZS53aWR0aD1uKyJweCIsYS5zdHlsZS50ZXh0QWxpZ249aSxhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aGl0ZVNwYWNlPSJub3dyYXAiLGEuc3R5bGUudG9wPW8rInB4IixhLnN0eWxlLmxlZnQ9cisicHgifX19LHR9KSgpO0ttdC5IdG1sQ29udGV4dD1KbXQsT2JqZWN0LmRlZmluZVByb3BlcnR5KE9tdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFFtdD16bXQsdGd0PUttdCxlZ3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5hcHBlbmQ9ZnVuY3Rpb24oZSxuKXtmb3IodmFyIGk9W10scj0yO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspaVtyLTJdPWFyZ3VtZW50c1tyXTt2YXIgbz10LmNyZWF0ZS5hcHBseSh0LFtuXS5jb25jYXQoaSkpO3JldHVybiBlLmFwcGVuZENoaWxkKG8pLG99LHQuY3JlYXRlPWZ1bmN0aW9uKGUpe2Zvcih2YXIgbj1bXSxpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyluW2ktMV09YXJndW1lbnRzW2ldO3ZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0LlNWR19OUyxlKTtyZXR1cm4gdGd0Lkh0bWxVdGlscy5hZGRDbGFzc2VzLmFwcGx5KHRndC5IdG1sVXRpbHMsW3JdLmNvbmNhdChuKSkscn0sdC5nZXREaW1lbnNpb25zPWZ1bmN0aW9uKHQpe2lmKHQuZ2V0QkJveCl0cnl7dmFyIGU9dC5nZXRCQm94KCk7cmV0dXJue3dpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0fX1jYXRjaCh0KXt9cmV0dXJue2hlaWdodDowLHdpZHRoOjB9fSx0fSkoKTtlZ3QuU1ZHX05TPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsT210LlN2Z1V0aWxzPWVndDt2YXIgbmd0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4pe3ZvaWQgMD09PW4mJihuPSExKTt2YXIgaT10aGlzO3RoaXMuZWxlbWVudD10LHRoaXMuY2xhc3NOYW1lPWUsdGhpcy5hZGRUaXRsZUVsZW1lbnQ9bix0aGlzLmNyZWF0ZVJ1bGVyPWZ1bmN0aW9uKCl7dmFyIHQ9aS5nZXRUZXh0RWxlbWVudHMoaS5lbGVtZW50KSxlPXQucGFyZW50RWxlbWVudCxuPXQuY29udGFpbmVyRWxlbWVudCxyPXQudGV4dEVsZW1lbnQ7cmV0dXJuIGZ1bmN0aW9uKHQpe2UuYXBwZW5kQ2hpbGQobiksci50ZXh0Q29udGVudD10O3ZhciBpPWVndC5nZXREaW1lbnNpb25zKHIpO3JldHVybiBlLnJlbW92ZUNoaWxkKG4pLGl9fSx0aGlzLmNyZWF0ZVBlbj1mdW5jdGlvbih0LGUsbil7bnVsbD09biYmKG49aS5lbGVtZW50KTt2YXIgcj1lZ3QuYXBwZW5kKG4sImciLCJ0ZXh0LWNvbnRhaW5lciIsaS5jbGFzc05hbWUpO2kuYWRkVGl0bGVFbGVtZW50JiYoZWd0LmFwcGVuZChyLCJ0aXRsZSIpLnRleHRDb250ZW50PXQsci5zZXRBdHRyaWJ1dGUoInRpdGxlIix0KSk7dmFyIG89ZWd0LmFwcGVuZChyLCJnIiwidGV4dC1hcmVhIik7cmV0dXJuIG8uc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitlLnRyYW5zbGF0ZVswXSsiLCIrZS50cmFuc2xhdGVbMV0rIilyb3RhdGUoIitlLnJvdGF0ZSsiKSIpLGkuY3JlYXRlU3ZnTGluZVBlbihvKX19cmV0dXJuIHQucHJvdG90eXBlLnNldEFkZFRpdGxlRWxlbWVudD1mdW5jdGlvbih0KXt0aGlzLmFkZFRpdGxlRWxlbWVudD10fSx0LnByb3RvdHlwZS5jcmVhdGVTdmdMaW5lUGVuPWZ1bmN0aW9uKGUpe3JldHVybnt3cml0ZTpmdW5jdGlvbihuLGkscixvLGEpe28rPWkqUW10LldyaXRlci5YT2Zmc2V0RmFjdG9yW3JdO3ZhciBzPWVndC5hcHBlbmQoZSwidGV4dCIsInRleHQtbGluZSIpO3MudGV4dENvbnRlbnQ9bixzLnNldEF0dHJpYnV0ZSgidGV4dC1hbmNob3IiLHQuQW5jaG9yTWFwW3JdKSxzLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrbysiLCIrYSsiKSIpLHMuc2V0QXR0cmlidXRlKCJ5IiwiLTAuMjVlbSIpfX19LHQucHJvdG90eXBlLmdldFRleHRFbGVtZW50cz1mdW5jdGlvbih0KXtpZigidGV4dCI9PT10LnRhZ05hbWUpcmV0dXJuIG51bGw9PShlPXQucGFyZW50RWxlbWVudCkmJihlPXQucGFyZW50Tm9kZSksZS5yZW1vdmVDaGlsZCh0KSx7Y29udGFpbmVyRWxlbWVudDp0LHBhcmVudEVsZW1lbnQ6ZSx0ZXh0RWxlbWVudDp0fTt2YXIgZSxuPXQucXVlcnlTZWxlY3RvcigidGV4dCIpO2lmKG51bGwhPW4pcmV0dXJuIG51bGw9PShlPW4ucGFyZW50RWxlbWVudCkmJihlPW4ucGFyZW50Tm9kZSksZS5yZW1vdmVDaGlsZChuKSx7Y29udGFpbmVyRWxlbWVudDpuLHBhcmVudEVsZW1lbnQ6ZSx0ZXh0RWxlbWVudDpufTt2YXIgaT1lZ3QuY3JlYXRlKCJ0ZXh0Iix0aGlzLmNsYXNzTmFtZSk7cmV0dXJue2NvbnRhaW5lckVsZW1lbnQ6aSxwYXJlbnRFbGVtZW50OnQsdGV4dEVsZW1lbnQ6aX19LHR9KSgpO25ndC5BbmNob3JNYXA9e2NlbnRlcjoibWlkZGxlIixsZWZ0OiJzdGFydCIscmlnaHQ6ImVuZCJ9LE9tdC5TdmdDb250ZXh0PW5ndDt2YXIgaWd0PXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShpZ3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByZ3Q9em10LG9ndD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXt2b2lkIDA9PT1lJiYoZT0xMCksdm9pZCAwPT09biYmKG49e30pO3ZhciBpPXRoaXM7dGhpcy5jdHg9dCx0aGlzLmxpbmVIZWlnaHQ9ZSx0aGlzLnN0eWxlPW4sdGhpcy5jcmVhdGVSdWxlcj1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaS5jdHguZm9udD1pLnN0eWxlLmZvbnQse3dpZHRoOmkuY3R4Lm1lYXN1cmVUZXh0KHQpLndpZHRoLGhlaWdodDppLmxpbmVIZWlnaHR9fX0sdGhpcy5jcmVhdGVQZW49ZnVuY3Rpb24odCxlLG4pe3JldHVybiBudWxsPT1uJiYobj1pLmN0eCksbi5zYXZlKCksbi50cmFuc2xhdGUoZS50cmFuc2xhdGVbMF0sZS50cmFuc2xhdGVbMV0pLG4ucm90YXRlKGUucm90YXRlKk1hdGguUEkvMTgwKSxpLmNyZWF0ZUNhbnZhc1BlbihuKX0sdm9pZCAwPT09dGhpcy5zdHlsZS5maWxsJiYodGhpcy5zdHlsZS5maWxsPSIjNDQ0Iil9cmV0dXJuIHQucHJvdG90eXBlLmNyZWF0ZUNhbnZhc1Blbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybntkZXN0cm95OmZ1bmN0aW9uKCl7dC5yZXN0b3JlKCl9LHdyaXRlOmZ1bmN0aW9uKG4saSxyLG8sYSl7bys9aSpyZ3QuV3JpdGVyLlhPZmZzZXRGYWN0b3Jbcl0sdC50ZXh0QWxpZ249cixudWxsIT1lLnN0eWxlLmZvbnQmJih0LmZvbnQ9ZS5zdHlsZS5mb250KSxudWxsIT1lLnN0eWxlLmZpbGwmJih0LmZpbGxTdHlsZT1lLnN0eWxlLmZpbGwsdC5maWxsVGV4dChuLG8sYSkpLG51bGwhPWUuc3R5bGUuc3Ryb2tlJiYodC5zdHJva2VTdHlsZT1lLnN0eWxlLmZpbGwsdC5zdHJva2VUZXh0KG4sbyxhKSl9fX0sdH0pKCk7aWd0LkNhbnZhc0NvbnRleHQ9b2d0LChmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe2Zvcih2YXIgbiBpbiBlKXQuaGFzT3duUHJvcGVydHkobil8fCh0W25dPWVbbl0pfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlKE9tdCksZShpZ3QpLGUoS210KX0pKFJtdCk7dmFyIGFndD17fSxzZ3Q9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KHNndCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGxndD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMucnVsZXI9bnVsbCE9dC5jcmVhdGVSdWxlcj90LmNyZWF0ZVJ1bGVyKCk6dH1yZXR1cm4gdC5wcm90b3R5cGUubWVhc3VyZT1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dC5IRUlHSFRfVEVYVCksdGhpcy5ydWxlcihlKX0sdH0pKCk7bGd0LkhFSUdIVF9URVhUPSJiZHBxbCIsc2d0LkFic3RyYWN0TWVhc3VyZXI9bGd0O3ZhciBjZ3Q9e30sdWd0PXt9LGhndD17fSxkZ3Q9dmUmJnZlLl9fZXh0ZW5kc3x8KGZ1bmN0aW9uKCl7dmFyIHQ9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9O3JldHVybiBmdW5jdGlvbihlLG4pe2Z1bmN0aW9uIGkoKXt0aGlzLmNvbnN0cnVjdG9yPWV9dChlLG4pLGUucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KGkucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyBpKX19KSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShoZ3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBwZ3Q9c2d0LGZndD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZvaWQgMD09PW4mJihuPSExKTt2YXIgaT10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gaS51c2VHdWFyZHM9bixpfXJldHVybiBkZ3QoZSx0KSxlLnByb3RvdHlwZS5fYWRkR3VhcmRzPWZ1bmN0aW9uKHQpe3JldHVybiBwZ3QuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVCt0K3BndC5BYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUfSxlLnByb3RvdHlwZS5fbWVhc3VyZUxpbmU9ZnVuY3Rpb24oZSxuKXt2b2lkIDA9PT1uJiYobj0hMSk7dmFyIGk9dGhpcy51c2VHdWFyZHN8fG58fC9eW1x0IF0kLy50ZXN0KGUpLHI9aT90aGlzLl9hZGRHdWFyZHMoZSk6ZSxvPXQucHJvdG90eXBlLm1lYXN1cmUuY2FsbCh0aGlzLHIpO3JldHVybiBvLndpZHRoLT1pPzIqdGhpcy5nZXRHdWFyZFdpZHRoKCk6MCxvfSxlLnByb3RvdHlwZS5tZWFzdXJlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYodm9pZCAwPT09dCYmKHQ9cGd0LkFic3RyYWN0TWVhc3VyZXIuSEVJR0hUX1RFWFQpLCIiPT09dC50cmltKCkpcmV0dXJue3dpZHRoOjAsaGVpZ2h0OjB9O3ZhciBuPXQudHJpbSgpLnNwbGl0KCJcbiIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX21lYXN1cmVMaW5lKHQpfSkpO3JldHVybntoZWlnaHQ6bi5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZS5oZWlnaHR9KSwwKSx3aWR0aDpuLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5tYXgodCxlLndpZHRoKX0pLDApfX0sZS5wcm90b3R5cGUuZ2V0R3VhcmRXaWR0aD1mdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLmd1YXJkV2lkdGgmJih0aGlzLmd1YXJkV2lkdGg9dC5wcm90b3R5cGUubWVhc3VyZS5jYWxsKHRoaXMpLndpZHRoKSx0aGlzLmd1YXJkV2lkdGh9LGV9KShwZ3QuQWJzdHJhY3RNZWFzdXJlcik7aGd0Lk1lYXN1cmVyPWZndDt2YXIgbWd0PXZlJiZ2ZS5fX2V4dGVuZHN8fChmdW5jdGlvbigpe3ZhciB0PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfTtyZXR1cm4gZnVuY3Rpb24oZSxuKXtmdW5jdGlvbiBpKCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfXQoZSxuKSxlLnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihpLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgaSl9fSkoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodWd0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZ2d0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gbWd0KGUsdCksZS5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIHQucHJvdG90eXBlLl9tZWFzdXJlTGluZS5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLl9tZWFzdXJlTGluZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dC5zcGxpdCgiIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fbWVhc3VyZUNoYXJhY3Rlcih0KX0pKTtyZXR1cm57aGVpZ2h0Om4ucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLm1heCh0LGUuaGVpZ2h0KX0pLDApLHdpZHRoOm4ucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiB0K2Uud2lkdGh9KSwwKX19LGV9KShoZ3QuTWVhc3VyZXIpO3VndC5DaGFyYWN0ZXJNZWFzdXJlcj1nZ3Q7dmFyIF9ndD12ZSYmdmUuX19leHRlbmRzfHwoZnVuY3Rpb24oKXt2YXIgdD1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX07cmV0dXJuIGZ1bmN0aW9uKGUsbil7ZnVuY3Rpb24gaSgpe3RoaXMuY29uc3RydWN0b3I9ZX10KGUsbiksZS5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKTooaS5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IGkpfX0pKCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNndCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHlndD1CbXQsdmd0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7dmFyIGk9dC5jYWxsKHRoaXMsZSxuKXx8dGhpcztyZXR1cm4gaS5jYWNoZT1uZXcgeWd0LkNhY2hlKChmdW5jdGlvbih0KXtyZXR1cm4gaS5fbWVhc3VyZUNoYXJhY3Rlck5vdEZyb21DYWNoZSh0KX0pKSxpfXJldHVybiBfZ3QoZSx0KSxlLnByb3RvdHlwZS5fbWVhc3VyZUNoYXJhY3Rlck5vdEZyb21DYWNoZT1mdW5jdGlvbihlKXtyZXR1cm4gdC5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXIuY2FsbCh0aGlzLGUpfSxlLnByb3RvdHlwZS5fbWVhc3VyZUNoYXJhY3Rlcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jYWNoZS5nZXQodCl9LGUucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5jYWNoZS5jbGVhcigpfSxlfSkodWd0LkNoYXJhY3Rlck1lYXN1cmVyKTtjZ3QuQ2FjaGVDaGFyYWN0ZXJNZWFzdXJlcj12Z3Q7dmFyIGJndD17fSx4Z3Q9dmUmJnZlLl9fZXh0ZW5kc3x8KGZ1bmN0aW9uKCl7dmFyIHQ9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9O3JldHVybiBmdW5jdGlvbihlLG4pe2Z1bmN0aW9uIGkoKXt0aGlzLmNvbnN0cnVjdG9yPWV9dChlLG4pLGUucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KGkucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyBpKX19KSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShiZ3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB3Z3Q9Qm10LFNndD1zZ3QsTWd0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiBuLmRpbUNhY2hlPW5ldyB3Z3QuQ2FjaGUoKGZ1bmN0aW9uKHQpe3JldHVybiBuLl9tZWFzdXJlTm90RnJvbUNhY2hlKHQpfSkpLG59cmV0dXJuIHhndChlLHQpLGUucHJvdG90eXBlLl9tZWFzdXJlTm90RnJvbUNhY2hlPWZ1bmN0aW9uKGUpe3JldHVybiB0LnByb3RvdHlwZS5tZWFzdXJlLmNhbGwodGhpcyxlKX0sZS5wcm90b3R5cGUubWVhc3VyZT1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9U2d0LkFic3RyYWN0TWVhc3VyZXIuSEVJR0hUX1RFWFQpLHRoaXMuZGltQ2FjaGUuZ2V0KHQpfSxlLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuZGltQ2FjaGUuY2xlYXIoKSx0LnByb3RvdHlwZS5yZXNldC5jYWxsKHRoaXMpfSxlfSkoY2d0LkNhY2hlQ2hhcmFjdGVyTWVhc3VyZXIpO2JndC5DYWNoZU1lYXN1cmVyPU1ndCwoZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXtmb3IodmFyIG4gaW4gZSl0Lmhhc093blByb3BlcnR5KG4pfHwodFtuXT1lW25dKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZShzZ3QpLGUoY2d0KSxlKGJndCksZSh1Z3QpLGUoaGd0KX0pKGFndCk7dmFyIEVndD17fSxUZ3Q9e30sQ2d0PXt9LEFndD17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQWd0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIga2d0PUJtdCxMZ3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMubWF4TGluZXMoMS8wKSx0aGlzLnRleHRUcmltbWluZygiZWxsaXBzaXMiKSx0aGlzLmFsbG93QnJlYWtpbmdXb3JkcyghMSksdGhpcy5fdG9rZW5pemVyPW5ldyBrZ3QuVG9rZW5pemVyLHRoaXMuX2JyZWFraW5nQ2hhcmFjdGVyPSItIn1yZXR1cm4gdC5wcm90b3R5cGUubWF4TGluZXM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fbWF4TGluZXM6KHRoaXMuX21heExpbmVzPXQsdGhpcyl9LHQucHJvdG90eXBlLnRleHRUcmltbWluZz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl90ZXh0VHJpbW1pbmc7aWYoImVsbGlwc2lzIiE9PXQmJiJub25lIiE9PXQpdGhyb3cgbmV3IEVycm9yKHQrIiAtIHVuc3VwcG9ydGVkIHRleHQgdHJpbW1pbmcgb3B0aW9uLiIpO3JldHVybiB0aGlzLl90ZXh0VHJpbW1pbmc9dCx0aGlzfSx0LnByb3RvdHlwZS5hbGxvd0JyZWFraW5nV29yZHM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fYWxsb3dCcmVha2luZ1dvcmRzOih0aGlzLl9hbGxvd0JyZWFraW5nV29yZHM9dCx0aGlzKX0sdC5wcm90b3R5cGUud3JhcD1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10aGlzO3ZvaWQgMD09PWkmJihpPTEvMCk7dmFyIG89e25vQnJva2VXb3JkczowLG5vTGluZXM6MCxvcmlnaW5hbFRleHQ6dCx0cnVuY2F0ZWRUZXh0OiIiLHdyYXBwZWRUZXh0OiIifSxhPXthdmFpbGFibGVMaW5lczpNYXRoLm1pbihNYXRoLmZsb29yKGkvZS5tZWFzdXJlKCkuaGVpZ2h0KSx0aGlzLl9tYXhMaW5lcyksYXZhaWxhYmxlV2lkdGg6bixjYW5GaXRUZXh0OiEwLGN1cnJlbnRMaW5lOiIiLHdyYXBwaW5nOm99LHM9dC5zcGxpdCgiXG4iKTtyZXR1cm4gcy5yZWR1Y2UoKGZ1bmN0aW9uKHQsbixpKXtyZXR1cm4gci5icmVha0xpbmVUb0ZpdFdpZHRoKHQsbixpIT09cy5sZW5ndGgtMSxlKX0pLGEpLndyYXBwaW5nfSx0LnByb3RvdHlwZS5icmVha0xpbmVUb0ZpdFdpZHRoPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPXRoaXM7dC5jYW5GaXRUZXh0fHwiIj09PXQud3JhcHBpbmcudHJ1bmNhdGVkVGV4dHx8KHQud3JhcHBpbmcudHJ1bmNhdGVkVGV4dCs9IlxuIiksdD10aGlzLl90b2tlbml6ZXIudG9rZW5pemUoZSkucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiByLndyYXBOZXh0VG9rZW4oZSx0LGkpfSksdCk7dmFyIG89a2d0LlN0cmluZ01ldGhvZHMudHJpbUVuZCh0LmN1cnJlbnRMaW5lKTtyZXR1cm4gdC53cmFwcGluZy5ub0xpbmVzKz0rKCIiIT09byksdC53cmFwcGluZy5ub0xpbmVzPT09dC5hdmFpbGFibGVMaW5lcyYmIm5vbmUiIT09dGhpcy5fdGV4dFRyaW1taW5nJiZuP3QuY2FuRml0VGV4dD0hMTp0LndyYXBwaW5nLndyYXBwZWRUZXh0Kz1vLHQuY3VycmVudExpbmU9IlxuIix0fSx0LnByb3RvdHlwZS5jYW5GaXRUb2tlbj1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcyxyPXQuc3BsaXQoIiIpLm1hcCgoZnVuY3Rpb24oZSxuKXtyZXR1cm4gbiE9PXQubGVuZ3RoLTE/ZStpLl9icmVha2luZ0NoYXJhY3RlcjplfSkpO3JldHVybiBuLm1lYXN1cmUodCkud2lkdGg8PWV8fHIuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiBuLm1lYXN1cmUodCkud2lkdGg8PWV9KSl9LHQucHJvdG90eXBlLmFkZEVsbGlwc2lzPWZ1bmN0aW9uKHQsZSxuKXtpZigibm9uZSI9PT10aGlzLl90ZXh0VHJpbW1pbmcpcmV0dXJue3JlbWFpbmluZ1Rva2VuOiIiLHdyYXBwZWRUb2tlbjp0fTt2YXIgaT10LnN1YnN0cmluZygwKS50cmltKCkscj1uLm1lYXN1cmUoaSkud2lkdGgsbz1uLm1lYXN1cmUoIi4uLiIpLndpZHRoLGE9dC5sZW5ndGg+MCYmIlxuIj09PXRbMF0/IlxuIjoiIjtpZihlPD1vKXt2YXIgcz1NYXRoLmZsb29yKGUvKG8vMykpO3JldHVybntyZW1haW5pbmdUb2tlbjp0LHdyYXBwZWRUb2tlbjphKyIuLi4iLnN1YnN0cigwLHMpfX1mb3IoO3Irbz5lOylpPWtndC5TdHJpbmdNZXRob2RzLnRyaW1FbmQoaS5zdWJzdHIoMCxpLmxlbmd0aC0xKSkscj1uLm1lYXN1cmUoaSkud2lkdGg7cmV0dXJue3JlbWFpbmluZ1Rva2VuOmtndC5TdHJpbmdNZXRob2RzLnRyaW1FbmQodC5zdWJzdHJpbmcoaS5sZW5ndGgpLCItIikudHJpbSgpLHdyYXBwZWRUb2tlbjphK2krIi4uLiJ9fSx0LnByb3RvdHlwZS53cmFwTmV4dFRva2VuPWZ1bmN0aW9uKHQsZSxuKXtpZighZS5jYW5GaXRUZXh0fHxlLmF2YWlsYWJsZUxpbmVzPT09ZS53cmFwcGluZy5ub0xpbmVzfHwhdGhpcy5jYW5GaXRUb2tlbih0LGUuYXZhaWxhYmxlV2lkdGgsbikpcmV0dXJuIHRoaXMuZmluaXNoV3JhcHBpbmcodCxlLG4pO2Zvcih2YXIgaT10O2k7KXt2YXIgcj10aGlzLmJyZWFrVG9rZW5Ub0ZpdEluV2lkdGgoaSxlLmN1cnJlbnRMaW5lLGUuYXZhaWxhYmxlV2lkdGgsbik7aWYoZS5jdXJyZW50TGluZT1yLmxpbmUsbnVsbCE9KGk9ci5yZW1haW5pbmdUb2tlbikpe2lmKGUud3JhcHBpbmcubm9Ccm9rZVdvcmRzKz0rci5icmVha1dvcmQsKytlLndyYXBwaW5nLm5vTGluZXMsZS5hdmFpbGFibGVMaW5lcz09PWUud3JhcHBpbmcubm9MaW5lcyl7dmFyIG89dGhpcy5hZGRFbGxpcHNpcyhlLmN1cnJlbnRMaW5lLGUuYXZhaWxhYmxlV2lkdGgsbik7cmV0dXJuIGUud3JhcHBpbmcud3JhcHBlZFRleHQrPW8ud3JhcHBlZFRva2VuLGUud3JhcHBpbmcudHJ1bmNhdGVkVGV4dCs9by5yZW1haW5pbmdUb2tlbitpLGUuY3VycmVudExpbmU9IlxuIixlfWUud3JhcHBpbmcud3JhcHBlZFRleHQrPWtndC5TdHJpbmdNZXRob2RzLnRyaW1FbmQoZS5jdXJyZW50TGluZSksZS5jdXJyZW50TGluZT0iXG4ifX1yZXR1cm4gZX0sdC5wcm90b3R5cGUuZmluaXNoV3JhcHBpbmc9ZnVuY3Rpb24odCxlLG4pe2lmKGUuY2FuRml0VGV4dCYmZS5hdmFpbGFibGVMaW5lcyE9PWUud3JhcHBpbmcubm9MaW5lcyYmIm5vbmUiIT09dGhpcy5fdGV4dFRyaW1taW5nKXt2YXIgaT10aGlzLmFkZEVsbGlwc2lzKGUuY3VycmVudExpbmUrdCxlLmF2YWlsYWJsZVdpZHRoLG4pO2Uud3JhcHBpbmcud3JhcHBlZFRleHQrPWkud3JhcHBlZFRva2VuLGUud3JhcHBpbmcudHJ1bmNhdGVkVGV4dCs9aS5yZW1haW5pbmdUb2tlbixlLndyYXBwaW5nLm5vQnJva2VXb3Jkcys9KyhpLnJlbWFpbmluZ1Rva2VuLmxlbmd0aDx0Lmxlbmd0aCksZS53cmFwcGluZy5ub0xpbmVzKz0rKGkud3JhcHBlZFRva2VuLmxlbmd0aD4wKSxlLmN1cnJlbnRMaW5lPSIifWVsc2UgZS53cmFwcGluZy50cnVuY2F0ZWRUZXh0Kz10O3JldHVybiBlLmNhbkZpdFRleHQ9ITEsZX0sdC5wcm90b3R5cGUuYnJlYWtUb2tlblRvRml0SW5XaWR0aD1mdW5jdGlvbih0LGUsbixpLHIpe2lmKHZvaWQgMD09PXImJihyPXRoaXMuX2JyZWFraW5nQ2hhcmFjdGVyKSxpLm1lYXN1cmUoZSt0KS53aWR0aDw9bilyZXR1cm57YnJlYWtXb3JkOiExLGxpbmU6ZSt0LHJlbWFpbmluZ1Rva2VuOm51bGx9O2lmKCIiPT09dC50cmltKCkpcmV0dXJue2JyZWFrV29yZDohMSxsaW5lOmUscmVtYWluaW5nVG9rZW46IiJ9O2lmKCF0aGlzLl9hbGxvd0JyZWFraW5nV29yZHMmJiIiIT09ZS50cmltKCkpcmV0dXJue2JyZWFrV29yZDohMSxsaW5lOmUscmVtYWluaW5nVG9rZW46dH07Zm9yKHZhciBvPTA7bzx0Lmxlbmd0aCYmaS5tZWFzdXJlKGUrdC5zdWJzdHJpbmcoMCxvKzEpK3IpLndpZHRoPD1uOykrK287dmFyIGE9IiI7cmV0dXJuIG8+MCYmKGE9cikse2JyZWFrV29yZDpvPjAsbGluZTplK3Quc3Vic3RyaW5nKDAsbykrYSxyZW1haW5pbmdUb2tlbjp0LnN1YnN0cmluZyhvKX19LHR9KSgpO0FndC5XcmFwcGVyPUxndDt2YXIgUGd0PXZlJiZ2ZS5fX2V4dGVuZHN8fChmdW5jdGlvbigpe3ZhciB0PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfTtyZXR1cm4gZnVuY3Rpb24oZSxuKXtmdW5jdGlvbiBpKCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfXQoZSxuKSxlLnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihpLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgaSl9fSkoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoQ2d0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgTmd0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gUGd0KGUsdCksZS5wcm90b3R5cGUud3JhcD1mdW5jdGlvbihuLGkscixvKXt2YXIgYT10aGlzO2lmKHZvaWQgMD09PW8mJihvPTEvMCksbi5zcGxpdCgiXG4iKS5sZW5ndGg+MSl0aHJvdyBuZXcgRXJyb3IoIlNpbmdsZUxpbmVXcmFwcGVyIGlzIGRlc2lnbmVkIHRvIHdvcmsgb25seSBvbiBzaW5nbGUgbGluZSIpO3ZhciBzPWZ1bmN0aW9uKGUpe3JldHVybiB0LnByb3RvdHlwZS53cmFwLmNhbGwoYSxuLGksZSxvKX0sbD1zKHIpO2lmKGwubm9MaW5lczwyKXJldHVybiBsO2Zvcih2YXIgYz0wLHU9cixoPTA7aDxlLk5PX1dSQVBfSVRFUkFUSU9OUyYmdT5jOysraCl7dmFyIGQ9KHUrYykvMixwPXMoZCk7dGhpcy5hcmVTYW1lUmVzdWx0cyhsLHApPyh1PWQsbD1wKTpjPWR9cmV0dXJuIGx9LGUucHJvdG90eXBlLmFyZVNhbWVSZXN1bHRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubm9MaW5lcz09PWUubm9MaW5lcyYmdC50cnVuY2F0ZWRUZXh0PT09ZS50cnVuY2F0ZWRUZXh0fSxlfSkoQWd0LldyYXBwZXIpO05ndC5OT19XUkFQX0lURVJBVElPTlM9NSxDZ3QuU2luZ2xlTGluZVdyYXBwZXI9Tmd0LChmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe2Zvcih2YXIgbiBpbiBlKXQuaGFzT3duUHJvcGVydHkobil8fCh0W25dPWVbbl0pfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlKENndCksZShBZ3QpfSkoVGd0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRWd0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgSWd0PVJtdCxSZ3Q9YWd0LE9ndD1UZ3Qsemd0PXptdCxEZ3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLmNvbnRleHQ9dCx0aGlzLm1lYXN1cmVyPW5ldyBSZ3QuQ2FjaGVNZWFzdXJlcih0aGlzLmNvbnRleHQpLHRoaXMud3JhcHBlcj1uZXcgT2d0LldyYXBwZXIsdGhpcy53cml0ZXI9bmV3IHpndC5Xcml0ZXIodGhpcy5tZWFzdXJlcix0aGlzLmNvbnRleHQsdGhpcy53cmFwcGVyKX1yZXR1cm4gdC5zdmc9ZnVuY3Rpb24oZSxuLGkpe3JldHVybiBuZXcgdChuZXcgSWd0LlN2Z0NvbnRleHQoZSxuLGkpKX0sdC5jYW52YXM9ZnVuY3Rpb24oZSxuLGkpe3JldHVybiBuZXcgdChuZXcgSWd0LkNhbnZhc0NvbnRleHQoZSxuLGkpKX0sdC5odG1sPWZ1bmN0aW9uKGUsbixpKXtyZXR1cm4gbmV3IHQobmV3IElndC5IdG1sQ29udGV4dChlLG4saSkpfSx0LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LGUsbixpLHIpe3RoaXMud3JpdGVyLndyaXRlKHQsZSxuLGkscil9LHQucHJvdG90eXBlLmNsZWFyTWVhc3VyZXJDYWNoZT1mdW5jdGlvbigpe3RoaXMubWVhc3VyZXIucmVzZXQoKX0sdH0pKCk7RWd0LlR5cGVzZXR0ZXI9RGd0LChmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe2Zvcih2YXIgbiBpbiBlKXQuaGFzT3duUHJvcGVydHkobil8fCh0W25dPWVbbl0pfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlKFJtdCksZShhZ3QpLGUoRWd0KSxlKEJtdCksZShUZ3QpLGUoem10KX0pKEltdCk7dmFyIEJndD17fSxIZ3Q9e30sRmd0PXt9LFZndD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KFZndCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFVndD1FZHQsamd0PXdpbmRvdy5BcnJheTtWZ3QuYWRkPWZ1bmN0aW9uIEdndCh0LGUpe2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJhdHRlbXB0ZWQgdG8gYWRkIGFycmF5cyBvZiB1bmVxdWFsIGxlbmd0aCIpO3JldHVybiB0Lm1hcCgoZnVuY3Rpb24obixpKXtyZXR1cm4gdFtpXStlW2ldfSkpfSxWZ3QudW5pcT1mdW5jdGlvbiBXZ3QodCl7dmFyIGU9VWd0LnNldCgpLG49W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7ZS5oYXMoU3RyaW5nKHQpKXx8KGUuYWRkKFN0cmluZyh0KSksbi5wdXNoKHQpKX0pKSxufSxWZ3QuZmxhdHRlbj1mdW5jdGlvbiBxZ3QodCl7cmV0dXJuIGpndC5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLHQpfSxWZ3QuY3JlYXRlRmlsbGVkQXJyYXk9ZnVuY3Rpb24gWWd0KHQsZSl7Zm9yKHZhciBuPVtdLGk9MDtpPGU7aSsrKW5baV09ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dChpKTp0O3JldHVybiBufTt2YXIgWGd0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShYZ3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciAkZ3Q9RWR0LEtndD13aW5kb3cuTWF0aDtmdW5jdGlvbiBaZ3QodCl7dmFyIGU9JGd0LnJnYih0KSxuPWZ1bmN0aW9uKHQpe3JldHVybih0Lz0yNTUpPD0uMDM5Mjg/dC8xMi45MjpLZ3QucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCl9O3JldHVybi4yMTI2Km4oZS5yKSsuNzE1MipuKGUuZykrLjA3MjIqbihlLmIpfVhndC5jb250cmFzdD1mdW5jdGlvbiBKZ3QodCxlKXt2YXIgbj1aZ3QodCkrLjA1LGk9Wmd0KGUpKy4wNTtyZXR1cm4gbj5pP24vaTppL259LFhndC5saWdodGVuQ29sb3I9ZnVuY3Rpb24gUWd0KHQsZSl7cmV0dXJuICRndC5jb2xvcih0KS5icmlnaHRlcihlKS5yZ2IoKS50b1N0cmluZygpfSxYZ3QuY29sb3JUZXN0PWZ1bmN0aW9uIHRfdCh0LGUpe3QuY2xhc3NlZChlLCEwKTt2YXIgbj10LnN0eWxlKCJiYWNrZ3JvdW5kLWNvbG9yIik7aWYoInRyYW5zcGFyZW50Ij09PW4pcmV0dXJuIG51bGw7dmFyIGk9L1woKC4rKVwpLy5leGVjKG4pO2lmKCFpKXJldHVybiBudWxsO3ZhciByPWlbMV0uc3BsaXQoIiwiKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlPSt0LG49ZS50b1N0cmluZygxNik7cmV0dXJuIGU8MTY/IjAiK246bn0pKTtpZig0PT09ci5sZW5ndGgmJiIwMCI9PT1yWzNdKXJldHVybiBudWxsO3ZhciBvPSIjIityLmpvaW4oIiIpO3JldHVybiB0LmNsYXNzZWQoZSwhMSksb307dmFyIGVfdD17fTshKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9RWR0LG49d2luZG93Lk1hdGg7ZnVuY3Rpb24gaSh0KXt2YXIgZTt0cnl7ZT10Lm5vZGUoKS5nZXRCQm94KCl9Y2F0Y2godCl7ZT17eDowLHk6MCx3aWR0aDowLGhlaWdodDowfX1yZXR1cm4gZX10LmNvbnRhaW5zPWZ1bmN0aW9uIHIodCxlKXtmb3IodmFyIG49ZTtudWxsIT1uJiZuIT09dDspbj1uLnBhcmVudE5vZGU7cmV0dXJuIG49PT10fSx0LmVsZW1lbnRCQm94PWksdC5lbnRpdHlCb3VuZHM9ZnVuY3Rpb24gbyh0KXtpZih0IGluc3RhbmNlb2YgU1ZHRWxlbWVudClyZXR1cm4gaShlLnNlbGVjdCh0KSk7aWYodCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KXt2YXIgbj10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt4Om4ubGVmdCx5Om4udG9wLHdpZHRoOm4ud2lkdGgsaGVpZ2h0Om4uaGVpZ2h0fX1yZXR1cm57eDowLHk6MCx3aWR0aDowLGhlaWdodDowfX0sdC5TQ1JFRU5fUkVGUkVTSF9SQVRFX01JTExJU0VDT05EUz0xZTMvNjAsdC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbD1mdW5jdGlvbiBhKGUpe251bGwhPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShlKTpzZXRUaW1lb3V0KGUsdC5TQ1JFRU5fUkVGUkVTSF9SQVRFX01JTExJU0VDT05EUyl9LHQuZWxlbWVudFdpZHRoPWZ1bmN0aW9uIHModCl7dmFyIG49dCBpbnN0YW5jZW9mIGUuc2VsZWN0aW9uP3Qubm9kZSgpOnQsaT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShuKTtyZXR1cm4gbShpLCJ3aWR0aCIpK20oaSwicGFkZGluZy1sZWZ0IikrbShpLCJwYWRkaW5nLXJpZ2h0IikrbShpLCJib3JkZXItbGVmdC13aWR0aCIpK20oaSwiYm9yZGVyLXJpZ2h0LXdpZHRoIil9LHQuZWxlbWVudEhlaWdodD1mdW5jdGlvbiBsKHQpe3ZhciBuPXQgaW5zdGFuY2VvZiBlLnNlbGVjdGlvbj90Lm5vZGUoKTp0LGk9d2luZG93LmdldENvbXB1dGVkU3R5bGUobik7cmV0dXJuIG0oaSwiaGVpZ2h0IikrbShpLCJwYWRkaW5nLXRvcCIpK20oaSwicGFkZGluZy1ib3R0b20iKSttKGksImJvcmRlci10b3Atd2lkdGgiKSttKGksImJvcmRlci1ib3R0b20td2lkdGgiKX07dmFyIGM9Iig/OlstK10/WzAtOV0qXFwuP1swLTldKykiLHU9Iig/Oig/OlxccyssP1xccyopfCg/OixcXHMqKSkiLGg9bmV3IFJlZ0V4cCgidHJhbnNsYXRlXFxzKlxcKFxccyooIitjKyIpKD86Iit1KyIoIitjKyIpKT9cXHMqXFwpIiksZD1uZXcgUmVnRXhwKCJyb3RhdGVcXHMqXFwoXFxzKigiK2MrIilcXHMqXFwpIikscD1uZXcgUmVnRXhwKCJzY2FsZVxccypcXChcXHMqKCIrYysiKSg/OiIrdSsiKCIrYysiKSk/XFxzKlxcKSIpO2Z1bmN0aW9uIGYodCl7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybnttaW46dCxtYXg6dH07aWYodCBpbnN0YW5jZW9mIE9iamVjdCYmIm1pbiJpbiB0JiYibWF4ImluIHQpcmV0dXJuIHQ7dGhyb3cgbmV3IEVycm9yKCJpbnB1dCAnIit0KyInIGNhbid0IGJlIHBhcnNlZCBhcyBhbiBSYW5nZSIpfWZ1bmN0aW9uIG0odCxlKXt2YXIgbj10LmdldFByb3BlcnR5VmFsdWUoZSk7cmV0dXJuIHBhcnNlRmxvYXQobil8fDB9dC5nZXRUcmFuc2xhdGVWYWx1ZXM9ZnVuY3Rpb24gZyh0KXt2YXIgZT1oLmV4ZWModC5hdHRyKCJ0cmFuc2Zvcm0iKSk7aWYobnVsbCE9ZSl7dmFyIG49ZVsyXTtyZXR1cm5bK2VbMV0sKyh2b2lkIDA9PT1uPzA6bildfXJldHVyblswLDBdfSx0LmdldFJvdGF0ZT1mdW5jdGlvbiBfKHQpe3ZhciBlPWQuZXhlYyh0LmF0dHIoInRyYW5zZm9ybSIpKTtyZXR1cm4gbnVsbCE9ZT8rZVsxXTowfSx0LmdldFNjYWxlVmFsdWVzPWZ1bmN0aW9uIHkodCl7dmFyIGU9cC5leGVjKHQuYXR0cigidHJhbnNmb3JtIikpO2lmKG51bGwhPWUpe3ZhciBuPWVbMV0saT1lWzJdO3JldHVyblsrbixudWxsPT1pPytuOitpXX1yZXR1cm5bMCwwXX0sdC5jbGllbnRSZWN0c092ZXJsYXA9ZnVuY3Rpb24gdih0LGUpe3JldHVybiEobi5mbG9vcih0LnJpZ2h0KTw9bi5jZWlsKGUubGVmdCl8fG4uY2VpbCh0LmxlZnQpPj1uLmZsb29yKGUucmlnaHQpfHxuLmZsb29yKHQuYm90dG9tKTw9bi5jZWlsKGUudG9wKXx8bi5jZWlsKHQudG9wKT49bi5mbG9vcihlLmJvdHRvbSkpfSx0LmV4cGFuZFJlY3Q9ZnVuY3Rpb24gYih0LGUpe3JldHVybntsZWZ0OnQubGVmdC1lLHRvcDp0LnRvcC1lLHJpZ2h0OnQucmlnaHQrZSxib3R0b206dC5ib3R0b20rZSx3aWR0aDp0LndpZHRoKzIqZSxoZWlnaHQ6dC5oZWlnaHQrMiplfX0sdC5jbGllbnRSZWN0SW5zaWRlPWZ1bmN0aW9uIHgodCxlKXtyZXR1cm4gbi5mbG9vcihlLmxlZnQpPD1uLmNlaWwodC5sZWZ0KSYmbi5mbG9vcihlLnRvcCk8PW4uY2VpbCh0LnRvcCkmJm4uZmxvb3IodC5yaWdodCk8PW4uY2VpbChlLnJpZ2h0KSYmbi5mbG9vcih0LmJvdHRvbSk8PW4uY2VpbChlLmJvdHRvbSl9LHQuaW50ZXJzZWN0c0JCb3g9ZnVuY3Rpb24gdyh0LGUsbixpKXt2b2lkIDA9PT1pJiYoaT0uNSk7dmFyIHI9Zih0KSxvPWYoZSk7cmV0dXJuIG4ueCtuLndpZHRoPj1yLm1pbi1pJiZuLng8PXIubWF4K2kmJm4ueStuLmhlaWdodD49by5taW4taSYmbi55PD1vLm1heCtpfSx0LmdldEh0bWxFbGVtZW50QW5jZXN0b3JzPWZ1bmN0aW9uIFModCl7Zm9yKHZhciBlPVtdO3QmJnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDspZS5wdXNoKHQpLHQ9dC5wYXJlbnRFbGVtZW50O3JldHVybiBlfSx0LmdldEVsZW1lbnRUcmFuc2Zvcm09ZnVuY3Rpb24gTSh0KXt2YXIgZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpO3JldHVybihmdW5jdGlvbiBuKHQpe2lmKG51bGw9PXR8fCJub25lIj09PXQpcmV0dXJuIG51bGw7dmFyIGU9dC5tYXRjaChFKTtpZihudWxsPT1lfHxlLmxlbmd0aDwyKXJldHVybiBudWxsO3ZhciBuPWVbMV0uc3BsaXQoVCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gcGFyc2VGbG9hdCh0KX0pKTtyZXR1cm4gNiE9bi5sZW5ndGg/bnVsbDpufSkoZS5nZXRQcm9wZXJ0eVZhbHVlKCItd2Via2l0LXRyYW5zZm9ybSIpfHxlLmdldFByb3BlcnR5VmFsdWUoIi1tb3otdHJhbnNmb3JtIil8fGUuZ2V0UHJvcGVydHlWYWx1ZSgiLW1zLXRyYW5zZm9ybSIpfHxlLmdldFByb3BlcnR5VmFsdWUoIi1vLXRyYW5zZm9ybSIpfHxlLmdldFByb3BlcnR5VmFsdWUoInRyYW5zZm9ybSIpKX07dmFyIEU9L15tYXRyaXhcKChbXildKylcKSQvLFQ9L1ssIF0rL30pKGVfdCk7dmFyIG5fdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkobl90LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgaV90PUVkdCxyX3Q9ZV90LG9fdD13aW5kb3cuTWF0aCxhX3Q9WzEsMCwwLDEsMCwwXTtmdW5jdGlvbiBzX3QodCxlKXtyZXR1cm5bdFswXSplWzBdK3RbMl0qZVsxXSx0WzFdKmVbMF0rdFszXSplWzFdLHRbMF0qZVsyXSt0WzJdKmVbM10sdFsxXSplWzJdK3RbM10qZVszXSx0WzBdKmVbNF0rdFsyXSplWzVdK3RbNF0sdFsxXSplWzRdK3RbM10qZVs1XSt0WzVdXX1mdW5jdGlvbiBsX3QodCxlKXtyZXR1cm5bdFswXSx0WzFdLHRbMl0sdFszXSx0WzBdKmVbMF0rdFsyXSplWzFdK3RbNF0sdFsxXSplWzBdK3RbM10qZVsxXSt0WzVdXX1mdW5jdGlvbiBjX3QodCl7dmFyIGU9dFswXSp0WzNdLXRbMV0qdFsyXTtpZigwPT09ZSl0aHJvdyBuZXcgRXJyb3IoInNpbmd1bGFyIG1hdHJpeCIpO3ZhciBuPTEvZTtyZXR1cm5bbip0WzNdLG4qLXRbMV0sbiotdFsyXSxuKnRbMF0sbiooLXRbM10qdFs0XSt0WzJdKnRbNV0pLG4qKHRbMV0qdFs0XSstdFswXSp0WzVdKV19bl90LmluUmFuZ2U9ZnVuY3Rpb24gdV90KHQsZSxuKXtyZXR1cm4gb190Lm1pbihlLG4pPD10JiZ0PD1vX3QubWF4KGUsbil9LG5fdC5jbGFtcD1mdW5jdGlvbiBoX3QodCxlLG4pe3JldHVybiBvX3QubWluKG9fdC5tYXgoZSx0KSxuKX0sbl90Lm1heD1mdW5jdGlvbiBkX3QodCxlLG4pe3ZhciBpPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bnVsbCxyPW51bGw9PWk/ZTpuLG89bnVsbD09aT9pX3QubWF4KHQpOmlfdC5tYXgodCxpKTtyZXR1cm4gdm9pZCAwIT09bz9vOnJ9LG5fdC5taW49ZnVuY3Rpb24gcF90KHQsZSxuKXt2YXIgaT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm51bGwscj1udWxsPT1pP2U6bixvPW51bGw9PWk/aV90Lm1pbih0KTppX3QubWluKHQsaSk7cmV0dXJuIHZvaWQgMCE9PW8/bzpyfSxuX3QuaXNOYU49ZnVuY3Rpb24gZl90KHQpe3JldHVybiB0IT10fSxuX3QuaXNWYWxpZE51bWJlcj1mdW5jdGlvbiBtX3QodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0LXQ8MX0sbl90LnJhbmdlPWZ1bmN0aW9uIGdfdCh0LGUsbil7aWYodm9pZCAwPT09biYmKG49MSksMD09PW4pdGhyb3cgbmV3IEVycm9yKCJzdGVwIGNhbm5vdCBiZSAwIik7Zm9yKHZhciBpPW9fdC5tYXgob190LmNlaWwoKGUtdCkvbiksMCkscj1bXSxvPTA7bzxpOysrbylyW29dPXQrbipvO3JldHVybiByfSxuX3QuZGlzdGFuY2VTcXVhcmVkPWZ1bmN0aW9uIF9fdCh0LGUpe3JldHVybiBvX3QucG93KGUueS10LnksMikrb190LnBvdyhlLngtdC54LDIpfSxuX3QuZGVncmVlc1RvUmFkaWFucz1mdW5jdGlvbiB5X3QodCl7cmV0dXJuIHQvMzYwKm9fdC5QSSoyfSxuX3Qud2l0aGluPWZ1bmN0aW9uIHZfdCh0LGUpe3JldHVybiBlLnRvcExlZnQueDw9dC54JiZlLmJvdHRvbVJpZ2h0Lng+PXQueCYmZS50b3BMZWZ0Lnk8PXQueSYmZS5ib3R0b21SaWdodC55Pj10Lnl9LG5fdC5ib3VuZHNJbnRlcnNlY3RzPWZ1bmN0aW9uIGJfdCh0LGUsbixpLHIsbyxhLHMpe3JldHVybiB0PD1yK2EmJnI8PXQrbiYmZTw9bytzJiZvPD1lK2l9LG5fdC5nZXRDdW11bGF0aXZlVHJhbnNmb3JtPWZ1bmN0aW9uIHhfdCh0KXtmb3IodmFyIGU9cl90LmdldEh0bWxFbGVtZW50QW5jZXN0b3JzKHQpLG49YV90LGk9bnVsbCxyPTAsbz1lO3I8by5sZW5ndGg7cisrKXt2YXIgYT1vW3JdLHM9cl90LmdldEVsZW1lbnRUcmFuc2Zvcm0oYSk7aWYobnVsbCE9cyl7dmFyIGw9YS5jbGllbnRXaWR0aC8yLGM9YS5jbGllbnRIZWlnaHQvMjtuPWxfdChuLFtsLGNdKSxuPWxfdChuPXNfdChuLGNfdChzKSksWy1sLC1jXSl9dmFyIHU9YS5zY3JvbGxMZWZ0LGg9YS5zY3JvbGxUb3A7bnVsbCE9PWkmJmEhPT1pfHwodS09YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxoLT1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxpPWEub2Zmc2V0UGFyZW50KSxuPWxfdChuLFt1LGhdKX1yZXR1cm4gbn0sbl90Lm11bHRpcGx5TWF0cml4PXNfdCxuX3QucHJlbXVsdGlwbHlUcmFuc2xhdGU9ZnVuY3Rpb24gd190KHQsZSl7cmV0dXJuW2VbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSt0WzBdLGVbNV0rdFsxXV19LG5fdC5tdWx0aXBseVRyYW5zbGF0ZT1sX3Qsbl90LmludmVydE1hdHJpeD1jX3Qsbl90LmFwcGx5VHJhbnNmb3JtPWZ1bmN0aW9uIFNfdCh0LGUpe3JldHVybnt4OnRbMF0qZS54K3RbMl0qZS55K3RbNF0seTp0WzFdKmUueCt0WzNdKmUueSt0WzVdfX07dmFyIE1fdD17fSxFX3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTctcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFX3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBUX3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49TWF0aC5jZWlsKHQubGVuZ3RoLzIpLGk9MDtpPG47aSsrKWVbMF0uaW5zZXJ0KHRbaV0pO2ZvcihpPW47aTx0Lmxlbmd0aDtpKyspZVsxXS5pbnNlcnQodFtpXSl9LHR9KSgpO0VfdC5TcGxpdFN0cmF0ZWd5VHJpdmlhbD1UX3Q7dmFyIENfdD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbih0LGUpe2Zvcih0PXQuc2xpY2UoKSx0aGlzLmNob29zZUZpcnN0U3BsaXQodCxlKTt0Lmxlbmd0aD4wOyl0aGlzLmFkZE5leHQodCxlKX0sdC5wcm90b3R5cGUuY2hvb3NlRmlyc3RTcGxpdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLGk9MCxyPXQubGVuZ3RoLTEsbz10Lmxlbmd0aC0xLGE9MTthPHQubGVuZ3RoLTE7YSsrKXt2YXIgcz10W2FdO3MuYm91bmRzLnhsPnRbcl0uYm91bmRzLnhsP3I9YTpzLmJvdW5kcy54aDx0W25dLmJvdW5kcy54aCYmKG49YSkscy5ib3VuZHMueWw+dFtvXS5ib3VuZHMueWw/bz1hOnMuYm91bmRzLnloPHRbaV0uYm91bmRzLnloJiYoaT1hKX12YXIgbD1NYXRoLmFicyh0W25dLmJvdW5kcy54aC10W3JdLmJvdW5kcy54bCk+TWF0aC5hYnModFtpXS5ib3VuZHMueWgtdFtvXS5ib3VuZHMueWwpP1tuLHJdOltpLG9dLGM9bFswXSx1PWxbMV07Yz09PXUmJihjPTAsdT10Lmxlbmd0aC0xKSxlWzBdLmluc2VydCh0LnNwbGljZShNYXRoLm1heChjLHUpLDEpWzBdKSxlWzFdLmluc2VydCh0LnNwbGljZShNYXRoLm1pbihjLHUpLDEpWzBdKX0sdC5wcm90b3R5cGUuYWRkTmV4dD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1udWxsLGk9bnVsbCxyPW51bGwsbz0wO288dC5sZW5ndGg7bysrKXt2YXIgYT10W29dLHM9ZVswXS51bmlvbkFyZWFEaWZmZXJlbmNlKGEuYm91bmRzKSxsPWVbMV0udW5pb25BcmVhRGlmZmVyZW5jZShhLmJvdW5kcyk7KHM8aXx8bnVsbD09bikmJihuPW8saT1zLHI9ZVswXSksbDxpJiYobj1vLGk9bCxyPWVbMV0pfXIuaW5zZXJ0KHQuc3BsaWNlKG4sMSlbMF0pfSx0fSkoKTtFX3QuU3BsaXRTdHJhdGVneUxpbmVhcj1DX3QsKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE3LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGUsbj1uZXcgRV90LlNwbGl0U3RyYXRlZ3lMaW5lYXI7ZnVuY3Rpb24gaSh0LG4saSl7dmFyIHI9MS8wLG89MS8wO3JldHVybiBmdW5jdGlvbihhKXt2YXIgcz1uKGEuYm91bmRzLHQpLGw9aShhLmJvdW5kcyx0KTtyZXR1cm4gbnVsbCE9YS52YWx1ZT9zPHI/KHI9cyxvPWwsZS5QQVNTX0FORF9PVkVSV1JJVEUpOnM9PT1yP2UuUEFTUzplLkZBSUw6cz5vP2UuRkFJTDoobz1NYXRoLm1heChsLG8pLGUuUEFTUyl9fWZ1bmN0aW9uIHIodCxlKXtyZXR1cm4gZnVuY3Rpb24obixpKXtyZXR1cm4gZShpLmJvdW5kcyx0KS1lKG4uYm91bmRzLHQpfX0hKGZ1bmN0aW9uKHQpe3RbdC5QQVNTPTBdPSJQQVNTIix0W3QuRkFJTD0xXT0iRkFJTCIsdFt0LlBBU1NfQU5EX09WRVJXUklURT0yXT0iUEFTU19BTkRfT1ZFUldSSVRFIn0pKGU9dC5RdWVyeVByZWRpY2F0ZVJlc3VsdHx8KHQuUXVlcnlQcmVkaWNhdGVSZXN1bHQ9e30pKSx0LmNyZWF0ZU1pbmltaXppbmdOb2RlUHJlZGljYXRlPWksdC5jcmVhdGVOb2RlU29ydD1yO3ZhciBvPShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt2b2lkIDA9PT10JiYodD01KSx2b2lkIDA9PT1lJiYoZT1uKSx0aGlzLm1heE5vZGVDaGlsZHJlbj10LHRoaXMuc3BsaXRTdHJhdGVneT1lLHRoaXMucm9vdD1uZXcgYSghMCksdGhpcy5zaXplPTB9cmV0dXJuIHQucHJvdG90eXBlLmdldFJvb3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb290fSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMucm9vdD1uZXcgYSghMCksdGhpcy5zaXplPTB9LHQucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLnJvb3Q7IW4ubGVhZjspbj1uLnN1YnRyZWUodCk7dmFyIGk9YS52YWx1ZU5vZGUodCxlKTtmb3Iobi5pbnNlcnQoaSksdGhpcy5zaXplKz0xO24ub3ZlcmZsb3codGhpcy5tYXhOb2RlQ2hpbGRyZW4pOyludWxsPT0obj1uLnNwbGl0KHRoaXMuc3BsaXRTdHJhdGVneSkpLnBhcmVudCYmKHRoaXMucm9vdD1uKTtyZXR1cm4gaX0sdC5wcm90b3R5cGUubG9jYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnF1ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4gZS5jb250YWlucyh0KX0pKX0sdC5wcm90b3R5cGUubG9jYXRlTmVhcmVzdD1mdW5jdGlvbih0KXt2YXIgZT1pKHQscy5kaXN0YW5jZVNxdWFyZWRUb05lYXJFZGdlLHMuZGlzdGFuY2VTcXVhcmVkVG9GYXJFZGdlKTtyZXR1cm4gdGhpcy5xdWVyeU5vZGVzKGUpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQudmFsdWV9KSl9LHQucHJvdG90eXBlLmxvY2F0ZU5lYXJlc3RYPWZ1bmN0aW9uKHQpe3ZhciBlPWkodCxzLmFic29sdXRlRGlzdGFuY2VUb05lYXJFZGdlWCxzLmFic29sdXRlRGlzdGFuY2VUb0ZhckVkZ2VYKSxuPXRoaXMucXVlcnlOb2RlcyhlKTtyZXR1cm4gbi5zb3J0KHIodCxzLmFic29sdXRlRGlzdGFuY2VUb05lYXJFZGdlWSkpLG4ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC52YWx1ZX0pKX0sdC5wcm90b3R5cGUubG9jYXRlTmVhcmVzdFk9ZnVuY3Rpb24odCl7dmFyIGU9aSh0LHMuYWJzb2x1dGVEaXN0YW5jZVRvTmVhckVkZ2VZLHMuYWJzb2x1dGVEaXN0YW5jZVRvRmFyRWRnZVkpLG49dGhpcy5xdWVyeU5vZGVzKGUpO3JldHVybiBuLnNvcnQocih0LHMuYWJzb2x1dGVEaXN0YW5jZVRvTmVhckVkZ2VYKSksbi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnZhbHVlfSkpfSx0LnByb3RvdHlwZS5pbnRlcnNlY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucXVlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiBzLmlzQm91bmRzT3ZlcmxhcEJvdW5kcyhlLHQpfSkpfSx0LnByb3RvdHlwZS5pbnRlcnNlY3RYPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnF1ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4gcy5pc0JvdW5kc092ZXJsYXBYKGUsdCl9KSl9LHQucHJvdG90eXBlLmludGVyc2VjdFk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucXVlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiBzLmlzQm91bmRzT3ZlcmxhcFkoZSx0KX0pKX0sdC5wcm90b3R5cGUucXVlcnk9ZnVuY3Rpb24odCl7dmFyIGU9W107aWYobnVsbCE9dGhpcy5yb290LmJvdW5kcyYmIXQodGhpcy5yb290LmJvdW5kcykpcmV0dXJuIGU7Zm9yKHZhciBuPVt0aGlzLnJvb3RdO24ubGVuZ3RoPjA7KWZvcih2YXIgaT1uLnNoaWZ0KCkscj0wO3I8aS5lbnRyaWVzLmxlbmd0aDtyKyspe3ZhciBvPWkuZW50cmllc1tyXTt0KG8uYm91bmRzKSYmKGkubGVhZj9lLnB1c2goby52YWx1ZSk6bi5wdXNoKG8pKX1yZXR1cm4gZX0sdC5wcm90b3R5cGUucXVlcnlOb2Rlcz1mdW5jdGlvbih0KXt2YXIgbj1bXTtpZihudWxsIT10aGlzLnJvb3QuYm91bmRzJiZ0KHRoaXMucm9vdCk9PT1lLkZBSUwpcmV0dXJuIG47Zm9yKHZhciBpPVt0aGlzLnJvb3RdO2kubGVuZ3RoPjA7KWZvcih2YXIgcj1pLnNoaWZ0KCksbz0wO288ci5lbnRyaWVzLmxlbmd0aDtvKyspe3ZhciBhPXIuZW50cmllc1tvXSxzPXQoYSk7cz09PWUuUEFTU19BTkRfT1ZFUldSSVRFJiYobj1bXSkscyE9PWUuUEFTUyYmcyE9PWUuUEFTU19BTkRfT1ZFUldSSVRFfHwoci5sZWFmP24ucHVzaChhKTppLnB1c2goYSkpfXJldHVybiBufSx0fSkoKTt0LlJUcmVlPW87dmFyIGE9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLmxlYWY9dCx0aGlzLmJvdW5kcz1udWxsLHRoaXMuZW50cmllcz1bXSx0aGlzLnBhcmVudD1udWxsLHRoaXMudmFsdWU9bnVsbH1yZXR1cm4gdC52YWx1ZU5vZGU9ZnVuY3Rpb24oZSxuKXt2YXIgaT1uZXcgdCghMCk7cmV0dXJuIGkuYm91bmRzPWUsaS52YWx1ZT1uLGl9LHQucHJvdG90eXBlLm92ZXJmbG93PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVudHJpZXMubGVuZ3RoPnR9LHQucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0KXt0aGlzLmVudHJpZXMucHVzaCh0KSx0LnBhcmVudD10aGlzO2Zvcih2YXIgZT10aGlzO251bGwhPWU7KWUuYm91bmRzPXMudW5pb25BbGwoW2UuYm91bmRzLHQuYm91bmRzXSksZT1lLnBhcmVudDtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZW50cmllcy5pbmRleE9mKHQpO2lmKGU+PTApe3RoaXMuZW50cmllcy5zcGxpY2UoZSwxKTtmb3IodmFyIG49dGhpcztudWxsIT1uOyluLmJvdW5kcz1zLnVuaW9uQWxsKG4uZW50cmllcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmJvdW5kc30pKSksbj1uLnBhcmVudH1yZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuc3VidHJlZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MS8wLG49bnVsbCxpPTA7aTx0aGlzLmVudHJpZXMubGVuZ3RoO2krKyl7dmFyIHI9dGhpcy5lbnRyaWVzW2ldLG89ci51bmlvbkFyZWFEaWZmZXJlbmNlKHQpOyhvPGV8fG89PT1lJiZudWxsIT1uJiZyLmVudHJpZXMubGVuZ3RoPG4uZW50cmllcy5sZW5ndGgpJiYobj1yKX1yZXR1cm4gbn0sdC5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24oZSl7bnVsbCE9dGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJlbW92ZSh0aGlzKTt2YXIgbj1bbmV3IHQodGhpcy5sZWFmKSxuZXcgdCh0aGlzLmxlYWYpXTtlLnNwbGl0KHRoaXMuZW50cmllcyxuKTt2YXIgaT1udWxsIT10aGlzLnBhcmVudD90aGlzLnBhcmVudDpuZXcgdCghMSk7cmV0dXJuIGkuaW5zZXJ0KG5bMF0pLGkuaW5zZXJ0KG5bMV0pLGkubGVhZj0hMSxpfSx0LnByb3RvdHlwZS51bmlvbkFyZWFEaWZmZXJlbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmFicyhzLnVuaW9uKHRoaXMuYm91bmRzLHQpLmFyZWEoKS10aGlzLmJvdW5kcy5hcmVhKCkpfSx0LnByb3RvdHlwZS5tYXhEZXB0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxlYWY/MToxK3RoaXMuZW50cmllcy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm1heERlcHRoKCl9KSkucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLm1heCh0LGUpfSkpfSx0fSkoKTt0LlJUcmVlTm9kZT1hO3ZhciBzPShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4saSl7dGhpcy54bD10LHRoaXMueWw9ZSx0aGlzLnhoPW4sdGhpcy55aD1pLHRoaXMud2lkdGg9dGhpcy54aC10aGlzLnhsLHRoaXMuaGVpZ2h0PXRoaXMueWgtdGhpcy55bH1yZXR1cm4gdC54eXdoPWZ1bmN0aW9uKGUsbixpLHIpe3JldHVybiBuZXcgdChlLG4sZStpLG4rcil9LHQuZW50aXR5Qm91bmRzPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdChlLngsZS55LGUueCtlLndpZHRoLGUueStlLmhlaWdodCl9LHQuYm91bmRzPWZ1bmN0aW9uKGUpe3JldHVybiB0LnBvaW50UGFpcihlLnRvcExlZnQsZS5ib3R0b21SaWdodCl9LHQucG9pbnRQYWlyPWZ1bmN0aW9uKGUsbil7cmV0dXJuIG5ldyB0KE1hdGgubWluKGUueCxuLngpLE1hdGgubWluKGUueSxuLnkpLE1hdGgubWF4KGUueCxuLngpLE1hdGgubWF4KGUueSxuLnkpKX0sdC5wb2ludHM9ZnVuY3Rpb24oZSl7aWYoZS5sZW5ndGg8Mil0aHJvdyBuZXcgRXJyb3IoIm5lZWQgYXQgbGVhc3QgMiBwb2ludHMgdG8gY3JlYXRlIGJvdW5kcyIpO3ZhciBuPWUubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC54fSkpLGk9ZS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lnl9KSk7cmV0dXJuIG5ldyB0KG4ucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLm1pbih0LGUpfSkpLGkucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLm1pbih0LGUpfSkpLG4ucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLm1heCh0LGUpfSkpLGkucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLm1heCh0LGUpfSkpKX0sdC51bmlvbj1mdW5jdGlvbihlLG4pe3JldHVybiBuZXcgdChNYXRoLm1pbihlLnhsLG4ueGwpLE1hdGgubWluKGUueWwsbi55bCksTWF0aC5tYXgoZS54aCxuLnhoKSxNYXRoLm1heChlLnloLG4ueWgpKX0sdC51bmlvbkFsbD1mdW5jdGlvbihlKXtyZXR1cm4gMD09PShlPWUuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dH0pKSkubGVuZ3RoP251bGw6ZS5yZWR1Y2UoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQudW5pb24oZSxuKX0pKX0sdC5pc0JvdW5kc092ZXJsYXBCb3VuZHM9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5pc0JvdW5kc092ZXJsYXBYKGUsbikmJnQuaXNCb3VuZHNPdmVybGFwWShlLG4pfSx0LmlzQm91bmRzT3ZlcmxhcFg9ZnVuY3Rpb24odCxlKXtyZXR1cm4hKHQueGg8ZS54bHx8dC54bD5lLnhoKX0sdC5pc0JvdW5kc092ZXJsYXBZPWZ1bmN0aW9uKHQsZSl7cmV0dXJuISh0LnloPGUueWx8fHQueWw+ZS55aCl9LHQuYWJzb2x1dGVEaXN0YW5jZVRvTmVhckVkZ2VYPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC53aWR0aC8yO3JldHVybiBNYXRoLm1heChNYXRoLmFicyhlLngtKHQueGwrbikpLW4sMCl9LHQuYWJzb2x1dGVEaXN0YW5jZVRvTmVhckVkZ2VZPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5oZWlnaHQvMjtyZXR1cm4gTWF0aC5tYXgoTWF0aC5hYnMoZS55LSh0LnlsK24pKS1uLDApfSx0LmFic29sdXRlRGlzdGFuY2VUb0ZhckVkZ2VYPWZ1bmN0aW9uKGUsbil7dmFyIGk9dC5hYnNvbHV0ZURpc3RhbmNlVG9OZWFyRWRnZVgoZSxuKTtyZXR1cm4gMD09PWk/MDppK2Uud2lkdGh9LHQuYWJzb2x1dGVEaXN0YW5jZVRvRmFyRWRnZVk9ZnVuY3Rpb24oZSxuKXt2YXIgaT10LmFic29sdXRlRGlzdGFuY2VUb05lYXJFZGdlWShlLG4pO3JldHVybiAwPT09aT8wOmkrZS5oZWlnaHR9LHQuZGlzdGFuY2VTcXVhcmVkVG9OZWFyRWRnZT1mdW5jdGlvbihlLG4pe3ZhciBpPXQuYWJzb2x1dGVEaXN0YW5jZVRvTmVhckVkZ2VYKGUsbikscj10LmFic29sdXRlRGlzdGFuY2VUb05lYXJFZGdlWShlLG4pO3JldHVybiBpKmkrcipyfSx0LmRpc3RhbmNlU3F1YXJlZFRvRmFyRWRnZT1mdW5jdGlvbihlLG4pe3ZhciBpPXQuYWJzb2x1dGVEaXN0YW5jZVRvRmFyRWRnZVgoZSxuKSxyPXQuYWJzb2x1dGVEaXN0YW5jZVRvRmFyRWRnZVkoZSxuKTtyZXR1cm4gaSppK3Iqcn0sdC5wcm90b3R5cGUuYXJlYT1mdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLmFyZWFDYWNoZWQmJih0aGlzLmFyZWFDYWNoZWQ9KHRoaXMueGgtdGhpcy54bCkqKHRoaXMueWgtdGhpcy55bCkpLHRoaXMuYXJlYUNhY2hlZH0sdC5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueGw8PXQueCYmdGhpcy54aD49dC54JiZ0aGlzLnlsPD10LnkmJnRoaXMueWg+PXQueX0sdH0pKCk7dC5SVHJlZUJvdW5kcz1zfSkoTV90KTt2YXIgQV90PXt9OyEoZnVuY3Rpb24odCl7Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZT1FZHQsbj1TZS5leHBvcnRzLGk9Rmd0O3QuSVN0YWNraW5nT3JkZXI9U210Lm1ha2VFbnVtKFsidG9wZG93biIsImJvdHRvbXVwIl0pO3ZhciByPXdpbmRvdy5NYXRoO3Quc3RhY2s9ZnVuY3Rpb24gbyhuLHIsYSxzKXt2b2lkIDA9PT1zJiYocz0iYm90dG9tdXAiKTt2YXIgbD1lLm1hcCgpLGM9ZS5tYXAoKSx1PW5ldyBpLk1hcDsidG9wZG93biI9PT1zJiYobj1uLnNsaWNlKCkpLnJldmVyc2UoKTtmb3IodmFyIGg9MCxkPW47aDxkLmxlbmd0aDtoKyspe2Zvcih2YXIgcD1kW2hdLGY9bmV3IGkuTWFwLG09cC5kYXRhKCksZz1tLmxlbmd0aCxfPTA7XzxnO18rKyl7dmFyIHk9bVtfXSx2PXIoeSxfLHApLGI9dC5ub3JtYWxpemVLZXkodikseD0rYSh5LF8scCksdz12b2lkIDAsUz14Pj0wP2w6YztTLmhhcyhiKT8odz1TLmdldChiKSxTLnNldChiLHcreCkpOih3PTAsUy5zZXQoYix4KSksZi5zZXQoYix7b2Zmc2V0OncsdmFsdWU6eCxheGlzVmFsdWU6dixvcmlnaW5hbERhdHVtOnksb3JpZ2luYWxEYXRhc2V0OnAsb3JpZ2luYWxJbmRleDpffSl9dS5zZXQocCxmKX1yZXR1cm4gdX0sdC5zdGFja2VkRXh0ZW50cz1mdW5jdGlvbiBhKHQpe3ZhciBlPW5ldyBpLk1hcCxuPW5ldyBpLk1hcDtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQscil7dmFyIG89dC5vZmZzZXQrdC52YWx1ZSxhPWkuTWF0aC5tYXgoW28sdC5vZmZzZXRdLHQub2Zmc2V0KSxzPWkuTWF0aC5taW4oW28sdC5vZmZzZXRdLHQub2Zmc2V0KSxsPXQuYXhpc1ZhbHVlO2UuaGFzKHIpP2UuZ2V0KHIpLmV4dGVudDxhJiZlLnNldChyLHtleHRlbnQ6YSxheGlzVmFsdWU6bCxzdGFja2VkRGF0dW06dH0pOmUuc2V0KHIse2V4dGVudDphLGF4aXNWYWx1ZTpsLHN0YWNrZWREYXR1bTp0fSksbi5oYXMocik/bi5nZXQocikuZXh0ZW50PnMmJm4uc2V0KHIse2V4dGVudDpzLGF4aXNWYWx1ZTpsLHN0YWNrZWREYXR1bTp0fSk6bi5zZXQocix7ZXh0ZW50OnMsYXhpc1ZhbHVlOmwsc3RhY2tlZERhdHVtOnR9KX0pKX0pKSx7bWF4aW11bUV4dGVudHM6ZSxtaW5pbXVtRXh0ZW50czpufX0sdC5zdGFja2VkRXh0ZW50PWZ1bmN0aW9uIHMoZSxuLG8pe3ZhciBhPVtdO2UuZm9yRWFjaCgoZnVuY3Rpb24oZSxpKXtmb3IodmFyIHI9aS5kYXRhKCkscz1yLmxlbmd0aCxsPTA7bDxzO2wrKyl7dmFyIGM9cltsXTtpZihudWxsPT1vfHxvKGMsbCxpKSl7dmFyIHU9ZS5nZXQodC5ub3JtYWxpemVLZXkobihjLGwsaSkpKTthLnB1c2godS52YWx1ZSt1Lm9mZnNldCl9fX0pKTt2YXIgcz1pLk1hdGgubWF4KGEsMCksbD1pLk1hdGgubWluKGEsMCk7cmV0dXJuW3IubWluKGwsMCksci5tYXgoMCxzKV19LHQubm9ybWFsaXplS2V5PW4ubWVtb2l6ZSgoZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0KX0pKX0pKEFfdCk7dmFyIGtfdD17fSxMX3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShMX3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLExfdC5TSE9XX1dBUk5JTkdTPSEwLExfdC5BRERfVElUTEVfRUxFTUVOVFM9ITAsCi8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShrX3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBQX3Q9TF90O2Z1bmN0aW9uIE5fdCh0KXtQX3QuU0hPV19XQVJOSU5HUyYmY29uc29sZS53YXJuKHQpfWZ1bmN0aW9uIElfdCh0LGUpe2Zvcih2YXIgbj1bXSxpPTI7aTxhcmd1bWVudHMubGVuZ3RoO2krKyluW2ktMl09YXJndW1lbnRzW2ldO3JldHVybiAwPT09ZT8odChuKSwtMSk6d2luZG93LnNldFRpbWVvdXQodCxlLG4pfWtfdC53YXJuPU5fdCxrX3Quc2V0VGltZW91dD1JX3Qsa190LmRlYm91bmNlPWZ1bmN0aW9uIFJfdCh0LGUsbil7dmFyIGk9bnVsbCxyPVtdLG89ZnVuY3Rpb24oKXtlLmFwcGx5KG4scil9O3JldHVybiBmdW5jdGlvbigpe3I9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSxjbGVhclRpbWVvdXQoaSksaT1JX3Qobyx0KX19LGtfdC5kZXByZWNhdGVkPWZ1bmN0aW9uIE9fdCh0LGUsbil7dm9pZCAwPT09biYmKG49IiIpLE5fdCgiTWV0aG9kICIrdCsiIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAiK2UrIi4gUGxlYXNlIHJlZmVyIHRvIHRoZSByZWxlYXNlIG5vdGVzLiAiK24pfTt2YXIgel90PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE3LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eSh6X3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBEX3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dGhpcy5lbnRyeUluZGV4PXQsdGhpcy5leGl0SW5kZXg9dCx0aGlzLm1pbkluZGV4PXQsdGhpcy5tYXhJbmRleD10LHRoaXMuYnVja2V0VmFsdWU9ZSx0aGlzLm1pblZhbHVlPW4sdGhpcy5tYXhWYWx1ZT1ufXJldHVybiB0LnByb3RvdHlwZS5pc0luQnVja2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0PT10aGlzLmJ1Y2tldFZhbHVlfSx0LnByb3RvdHlwZS5hZGRUb0J1Y2tldD1mdW5jdGlvbih0LGUpe3Q8dGhpcy5taW5WYWx1ZSYmKHRoaXMubWluVmFsdWU9dCx0aGlzLm1pbkluZGV4PWUpLHQ+dGhpcy5tYXhWYWx1ZSYmKHRoaXMubWF4VmFsdWU9dCx0aGlzLm1heEluZGV4PWUpLHRoaXMuZXhpdEluZGV4PWV9LHQucHJvdG90eXBlLmdldFVuaXF1ZUluZGljZXM9ZnVuY3Rpb24oKXt2YXIgdD1bdGhpcy5lbnRyeUluZGV4LHRoaXMubWF4SW5kZXgsdGhpcy5taW5JbmRleCx0aGlzLmV4aXRJbmRleF07cmV0dXJuIHQuZmlsdGVyKChmdW5jdGlvbihlLG4pe3JldHVybiAwPT1ufHxlIT10W24tMV19KSl9LHR9KSgpO3pfdC5CdWNrZXQ9RF90O3ZhciBCX3Q9e30sSF90PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoSF90LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgRl90PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXsiZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LlNldD90aGlzLl9lczZTZXQ9bmV3IHdpbmRvdy5TZXQ6dGhpcy5fdmFsdWVzPVtdLHRoaXMuc2l6ZT0wfXJldHVybiB0LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXRoaXMuX2VzNlNldD8odGhpcy5fZXM2U2V0LmFkZCh0KSx0aGlzLnNpemU9dGhpcy5fZXM2U2V0LnNpemUsdGhpcyk6KHRoaXMuaGFzKHQpfHwodGhpcy5fdmFsdWVzLnB1c2godCksdGhpcy5zaXplPXRoaXMuX3ZhbHVlcy5sZW5ndGgpLHRoaXMpfSx0LnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7aWYobnVsbCE9dGhpcy5fZXM2U2V0KXt2YXIgZT10aGlzLl9lczZTZXQuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemU9dGhpcy5fZXM2U2V0LnNpemUsZX12YXIgbj10aGlzLl92YWx1ZXMuaW5kZXhPZih0KTtyZXR1cm4tMSE9PW4mJih0aGlzLl92YWx1ZXMuc3BsaWNlKG4sMSksdGhpcy5zaXplPXRoaXMuX3ZhbHVlcy5sZW5ndGgsITApfSx0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXRoaXMuX2VzNlNldD90aGlzLl9lczZTZXQuaGFzKHQpOi0xIT09dGhpcy5fdmFsdWVzLmluZGV4T2YodCl9LHQucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO251bGw9PXRoaXMuX2VzNlNldD90aGlzLl92YWx1ZXMuZm9yRWFjaCgoZnVuY3Rpb24oaSl7dC5jYWxsKGUsaSxpLG4pfSkpOnRoaXMuX2VzNlNldC5mb3JFYWNoKChmdW5jdGlvbihpLHIpe3JldHVybiB0LmNhbGwoZSxpLHIsbil9KSxlKX0sdH0pKCk7SF90LlNldD1GX3QsCi8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCX3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBWX3Q9dU8sVV90PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gVl90Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLmNhbGxDYWxsYmFja3M9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvckVhY2goKGZ1bmN0aW9uKG4pe24uYXBwbHkodCxlKX0pKSx0aGlzfSxlfSkoSF90LlNldCk7Ql90LkNhbGxiYWNrU2V0PVVfdDt2YXIgal90PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShqX3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBHX3Q9TV90LFdfdD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fZW50aXRpZXM9W10sdGhpcy5fcnRyZWU9bmV3IEdfdC5SVHJlZX1yZXR1cm4gdC5wcm90b3R5cGUuYWRkQWxsPWZ1bmN0aW9uKHQsZSxuKXtpZih0aGlzLl9lbnRpdGllcz10aGlzLl9lbnRpdGllcy5jb25jYXQodCksdm9pZCAwIT09bilmb3IodmFyIGk9R190LlJUcmVlQm91bmRzLmJvdW5kcyhuKSxyPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBvPUdfdC5SVHJlZUJvdW5kcy5lbnRpdHlCb3VuZHMoZShhPXRbcl0pKTtHX3QuUlRyZWVCb3VuZHMuaXNCb3VuZHNPdmVybGFwQm91bmRzKGksbykmJnRoaXMuX3J0cmVlLmluc2VydChvLGEpfWVsc2UgZm9yKHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIGE7bz1HX3QuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKGUoYT10W3JdKSksdGhpcy5fcnRyZWUuaW5zZXJ0KG8sYSl9fSx0LnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ydHJlZS5sb2NhdGVOZWFyZXN0KHQpLnBvcCgpfSx0LnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0WD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcnRyZWUubG9jYXRlTmVhcmVzdFgodCkucG9wKCl9LHQucHJvdG90eXBlLmVudGl0eU5lYXJlc3RZPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ydHJlZS5sb2NhdGVOZWFyZXN0WSh0KS5wb3AoKX0sdC5wcm90b3R5cGUuZW50aXRpZXNJbkJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcnRyZWUuaW50ZXJzZWN0KEdfdC5SVHJlZUJvdW5kcy5lbnRpdHlCb3VuZHModCkpfSx0LnByb3RvdHlwZS5lbnRpdGllc0luWEJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcnRyZWUuaW50ZXJzZWN0WChHX3QuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKHQpKX0sdC5wcm90b3R5cGUuZW50aXRpZXNJbllCb3VuZHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3J0cmVlLmludGVyc2VjdFkoR190LlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyh0KSl9LHQucHJvdG90eXBlLmVudGl0aWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VudGl0aWVzfSx0fSkoKTtqX3QuRW50aXR5U3RvcmU9V190O3ZhciBxX3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KHFfdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFlfdD1uX3QsWF90PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXsiZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Lk1hcD90aGlzLl9lczZNYXA9bmV3IHdpbmRvdy5NYXA6dGhpcy5fa2V5VmFsdWVQYWlycz1bXX1yZXR1cm4gdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7aWYoWV90LmlzTmFOKHQpKXRocm93IG5ldyBFcnJvcigiTmFOIG1heSBub3QgYmUgdXNlZCBhcyBhIGtleSB0byB0aGUgTWFwIik7aWYobnVsbCE9dGhpcy5fZXM2TWFwKXJldHVybiB0aGlzLl9lczZNYXAuc2V0KHQsZSksdGhpcztmb3IodmFyIG49MDtuPHRoaXMuX2tleVZhbHVlUGFpcnMubGVuZ3RoO24rKylpZih0aGlzLl9rZXlWYWx1ZVBhaXJzW25dLmtleT09PXQpcmV0dXJuIHRoaXMuX2tleVZhbHVlUGFpcnNbbl0udmFsdWU9ZSx0aGlzO3JldHVybiB0aGlzLl9rZXlWYWx1ZVBhaXJzLnB1c2goe2tleTp0LHZhbHVlOmV9KSx0aGlzfSx0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7aWYobnVsbCE9dGhpcy5fZXM2TWFwKXJldHVybiB0aGlzLl9lczZNYXAuZ2V0KHQpO2Zvcih2YXIgZT0wO2U8dGhpcy5fa2V5VmFsdWVQYWlycy5sZW5ndGg7ZSsrKWlmKHRoaXMuX2tleVZhbHVlUGFpcnNbZV0ua2V5PT09dClyZXR1cm4gdGhpcy5fa2V5VmFsdWVQYWlyc1tlXS52YWx1ZX0sdC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe2lmKG51bGwhPXRoaXMuX2VzNk1hcClyZXR1cm4gdGhpcy5fZXM2TWFwLmhhcyh0KTtmb3IodmFyIGU9MDtlPHRoaXMuX2tleVZhbHVlUGFpcnMubGVuZ3RoO2UrKylpZih0aGlzLl9rZXlWYWx1ZVBhaXJzW2VdLmtleT09PXQpcmV0dXJuITA7cmV0dXJuITF9LHQucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO251bGw9PXRoaXMuX2VzNk1hcD90aGlzLl9rZXlWYWx1ZVBhaXJzLmZvckVhY2goKGZ1bmN0aW9uKGkpe3QuY2FsbChlLGkudmFsdWUsaS5rZXksbil9KSk6dGhpcy5fZXM2TWFwLmZvckVhY2goKGZ1bmN0aW9uKGkscil7cmV0dXJuIHQuY2FsbChlLGkscixuKX0pLGUpfSx0LnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24odCl7aWYobnVsbCE9dGhpcy5fZXM2TWFwKXJldHVybiB0aGlzLl9lczZNYXAuZGVsZXRlKHQpO2Zvcih2YXIgZT0wO2U8dGhpcy5fa2V5VmFsdWVQYWlycy5sZW5ndGg7ZSsrKWlmKHRoaXMuX2tleVZhbHVlUGFpcnNbZV0ua2V5PT09dClyZXR1cm4gdGhpcy5fa2V5VmFsdWVQYWlycy5zcGxpY2UoZSwxKSwhMDtyZXR1cm4hMX0sdH0pKCk7cV90Lk1hcD1YX3Q7dmFyICRfdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNy1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoJF90LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSwkX3QuYXNzaWduPWZ1bmN0aW9uIEtfdCgpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTtmb3IodmFyIG49e30saT0wLHI9dDtpPHIubGVuZ3RoO2krKylmb3IodmFyIG89cltpXSxhPU9iamVjdC5rZXlzKG8pLHM9MCxsPWE7czxsLmxlbmd0aDtzKyspe3ZhciBjPWxbc107bltjXT1vW2NdfXJldHVybiBufTt2YXIgWl90PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE3LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShaX3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBKX3Q9Rmd0LFFfdD0iX19QbG90dGFibGVfQ2xpZW50VHJhbnNsYXRvciI7Wl90LmdldFRyYW5zbGF0b3I9ZnVuY3Rpb24gdHl0KHQpe3ZhciBlPXQucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpLG49ZVtRX3RdO3JldHVybiBudWxsPT1uJiYobj1uZXcgZXl0KGUpLGVbUV90XT1uKSxufTt2YXIgZXl0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5fcm9vdEVsZW1lbnQ9dH1yZXR1cm4gdC5wcm90b3R5cGUuY29tcHV0ZVBvc2l0aW9uPWZ1bmN0aW9uKHQsZSl7dmFyIG49e3g6dCx5OmV9LGk9Sl90Lk1hdGguZ2V0Q3VtdWxhdGl2ZVRyYW5zZm9ybSh0aGlzLl9yb290RWxlbWVudCk7cmV0dXJuIG51bGw9PWk/bjpKX3QuTWF0aC5hcHBseVRyYW5zZm9ybShpLG4pfSx0LmlzRXZlbnRJbnNpZGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gSl90LkRPTS5jb250YWlucyh0LnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKSxlLnRhcmdldCl9LHR9KSgpO1pfdC5UcmFuc2xhdG9yPWV5dCwoZnVuY3Rpb24odCl7Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZT11Tzt0LkFycmF5PVZndCx0LkNvbG9yPVhndCx0LkRPTT1lX3QsdC5NYXRoPW5fdCx0LlJUcmVlPU1fdCx0LlN0YWNraW5nPUFfdCx0LldpbmRvdz1rX3QsZS5fX2V4cG9ydFN0YXIoel90LHQpLGUuX19leHBvcnRTdGFyKEJfdCx0KSxlLl9fZXhwb3J0U3RhcihibXQsdCksZS5fX2V4cG9ydFN0YXIoal90LHQpLGUuX19leHBvcnRTdGFyKHFfdCx0KSxlLl9fZXhwb3J0U3RhcigkX3QsdCksZS5fX2V4cG9ydFN0YXIoSF90LHQpLGUuX19leHBvcnRTdGFyKFpfdCx0KX0pKEZndCk7dmFyIG55dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkobnl0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgaXl0PUZndCxyeXQ9SGd0LG95dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyeXQuZmx1c2goKX0sdH0pKCk7bnl0LkltbWVkaWF0ZT1veXQ7dmFyIGF5dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtpeXQuRE9NLnJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsKHJ5dC5mbHVzaCl9LHR9KSgpO255dC5BbmltYXRpb25GcmFtZT1heXQ7dmFyIHN5dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fdGltZW91dE1zZWM9aXl0LkRPTS5TQ1JFRU5fUkVGUkVTSF9SQVRFX01JTExJU0VDT05EU31yZXR1cm4gdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7c2V0VGltZW91dChyeXQuZmx1c2gsdGhpcy5fdGltZW91dE1zZWMpfSx0fSkoKTtueXQuVGltZW91dD1zeXQsKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9Rmd0LG49U210LGk9bnl0LHI9bmV3IGUuU2V0LG89bmV3IGUuU2V0LGE9ITEscz0hMTt0LlBvbGljeT1uLm1ha2VFbnVtKFsiaW1tZWRpYXRlIiwiYW5pbWF0aW9uRnJhbWUiLCJ0aW1lb3V0Il0pO3ZhciBsPW5ldyBpLkFuaW1hdGlvbkZyYW1lO2Z1bmN0aW9uIGModCl7by5hZGQodCksci5hZGQodCksdSgpfWZ1bmN0aW9uIHUoKXthfHwoYT0hMCxsLnJlbmRlcigpKX10LnJlbmRlclBvbGljeT1mdW5jdGlvbiBoKG4pe2lmKG51bGw9PW4pcmV0dXJuIGw7c3dpdGNoKG4pe2Nhc2UgdC5Qb2xpY3kuaW1tZWRpYXRlOmw9bmV3IGkuSW1tZWRpYXRlO2JyZWFrO2Nhc2UgdC5Qb2xpY3kuYW5pbWF0aW9uRnJhbWU6bD1uZXcgaS5BbmltYXRpb25GcmFtZTticmVhaztjYXNlIHQuUG9saWN5LnRpbWVvdXQ6bD1uZXcgaS5UaW1lb3V0O2JyZWFrO2RlZmF1bHQ6ZS5XaW5kb3cud2FybigiVW5yZWNvZ25pemVkIHJlbmRlclBvbGljeTogIituKX19LHQucmVnaXN0ZXJUb1JlbmRlcj1mdW5jdGlvbiBkKHQpe3MmJmUuV2luZG93Lndhcm4oIlJlZ2lzdGVyZWQgdG8gcmVuZGVyIHdoaWxlIG90aGVyIGNvbXBvbmVudHMgYXJlIGZsdXNoaW5nOiByZXF1ZXN0IG1heSBiZSBpZ25vcmVkIiksci5hZGQodCksdSgpfSx0LnJlZ2lzdGVyVG9Db21wdXRlTGF5b3V0QW5kUmVuZGVyPWMsdC5yZWdpc3RlclRvQ29tcHV0ZUxheW91dD1mdW5jdGlvbiBwKHQpe2ModCl9LHQuZmx1c2g9ZnVuY3Rpb24gZigpe2lmKGEpe28uZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY29tcHV0ZUxheW91dCgpfSkpLHIuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHQucmVuZGVyKCl9KSkscz0hMDt2YXIgdD1uZXcgZS5TZXQ7ci5mb3JFYWNoKChmdW5jdGlvbihlKXt0cnl7ZS5yZW5kZXJJbW1lZGlhdGVseSgpfWNhdGNoKG4pe3dpbmRvdy5zZXRUaW1lb3V0KChmdW5jdGlvbigpe3Rocm93IG59KSwwKSx0LmFkZChlKX19KSksbz1uZXcgZS5TZXQscj10LGE9ITEscz0hMX19fSkoSGd0KSwKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KEJndCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGx5dD1FZHQsY3l0PUhndCx1eXQ9Rmd0LGh5dD1TZS5leHBvcnRzLGR5dD1ibXQscHl0PVNtdDtCZ3QuWEFsaWdubWVudD1weXQubWFrZUVudW0oWyJsZWZ0IiwiY2VudGVyIiwicmlnaHQiXSksQmd0LllBbGlnbm1lbnQ9cHl0Lm1ha2VFbnVtKFsidG9wIiwiY2VudGVyIiwiYm90dG9tIl0pO3ZhciBmeXQ9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuX292ZXJmbG93SGlkZGVuPSExLHRoaXMuX29yaWdpbj17eDowLHk6MH0sdGhpcy5feEFsaWdubWVudD0ibGVmdCIsdGhpcy5feUFsaWdubWVudD0idG9wIix0aGlzLl9pc1NldHVwPSExLHRoaXMuX2lzQW5jaG9yZWQ9ITEsdGhpcy5fY3NzQ2xhc3Nlcz1uZXcgdXl0LlNldCx0aGlzLl9kZXN0cm95ZWQ9ITEsdGhpcy5fb25BbmNob3JDYWxsYmFja3M9bmV3IHV5dC5DYWxsYmFja1NldCx0aGlzLl9vbkRldGFjaENhbGxiYWNrcz1uZXcgdXl0LkNhbGxiYWNrU2V0LHRoaXMuX2Nzc0NsYXNzZXMuYWRkKCJjb21wb25lbnQiKX1yZXR1cm4gdC5wcm90b3R5cGUuYW5jaG9yPWZ1bmN0aW9uKHQpe2lmKHQ9ZHl0LmNvZXJjZUV4dGVybmFsRDModCksdGhpcy5fZGVzdHJveWVkKXRocm93IG5ldyBFcnJvcigiQ2FuJ3QgcmV1c2UgZGVzdHJveSgpLWVkIENvbXBvbmVudHMhIik7cmV0dXJuIHRoaXMuaXNSb290KCkmJih0aGlzLl9yb290RWxlbWVudD10LHRoaXMuX3Jvb3RFbGVtZW50LmNsYXNzZWQoInBsb3R0YWJsZSIsITApKSxudWxsIT10aGlzLl9lbGVtZW50P3Qubm9kZSgpLmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQubm9kZSgpKToodGhpcy5fZWxlbWVudD10LmFwcGVuZCgiZGl2IiksdGhpcy5fc2V0dXAoKSksdGhpcy5faXNBbmNob3JlZD0hMCx0aGlzLl9vbkFuY2hvckNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMpLHRoaXN9LHQucHJvdG90eXBlLm9uQW5jaG9yPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pc0FuY2hvcmVkJiZ0KHRoaXMpLHRoaXMuX29uQW5jaG9yQ2FsbGJhY2tzLmFkZCh0KSx0aGlzfSx0LnByb3RvdHlwZS5vZmZBbmNob3I9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX29uQW5jaG9yQ2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSx0LnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX2lzU2V0dXB8fCh0aGlzLl9jc3NDbGFzc2VzLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuX2VsZW1lbnQuY2xhc3NlZChlLCEwKX0pKSx0aGlzLl9jc3NDbGFzc2VzPW5ldyB1eXQuU2V0LHRoaXMuX2JhY2tncm91bmRDb250YWluZXI9dGhpcy5fZWxlbWVudC5hcHBlbmQoInN2ZyIpLmNsYXNzZWQoImJhY2tncm91bmQtY29udGFpbmVyIiwhMCksdGhpcy5fY29udGVudD10aGlzLl9lbGVtZW50LmFwcGVuZCgic3ZnIikuY2xhc3NlZCgiY29udGVudCIsITApLHRoaXMuX2ZvcmVncm91bmRDb250YWluZXI9dGhpcy5fZWxlbWVudC5hcHBlbmQoInN2ZyIpLmNsYXNzZWQoImZvcmVncm91bmQtY29udGFpbmVyIiwhMCksdGhpcy5fY29udGVudC5jbGFzc2VkKHRoaXMuX292ZXJmbG93SGlkZGVuPyJjb21wb25lbnQtb3ZlcmZsb3ctaGlkZGVuIjoiY29tcG9uZW50LW92ZXJmbG93LXZpc2libGUiLCEwKSx0aGlzLl9pc1NldHVwPSEwKX0sdC5wcm90b3R5cGUucmVxdWVzdGVkU3BhY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm57bWluV2lkdGg6MCxtaW5IZWlnaHQ6MH19LHQucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oZSxuLGkpe2lmKG51bGw9PWV8fG51bGw9PW58fG51bGw9PWkpe2lmKG51bGw9PXRoaXMuX2VsZW1lbnQpdGhyb3cgbmV3IEVycm9yKCJhbmNob3IoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY29tcHV0ZUxheW91dCgpIik7aWYobnVsbD09dGhpcy5fcm9vdEVsZW1lbnQpdGhyb3cgbmV3IEVycm9yKCJudWxsIGFyZ3VtZW50cyBjYW5ub3QgYmUgcGFzc2VkIHRvIGNvbXB1dGVMYXlvdXQoKSBvbiBhIG5vbi1yb290LCB1bmFuY2hvcmVkIG5vZGUiKTtlPXt4OjAseTowfTt2YXIgcj10aGlzLl9yb290RWxlbWVudC5ub2RlKCk7bj11eXQuRE9NLmVsZW1lbnRXaWR0aChyKSxpPXV5dC5ET00uZWxlbWVudEhlaWdodChyKX12YXIgbz10aGlzLl9zaXplRnJvbU9mZmVyKG4saSksYT1vLmhlaWdodCxzPW8ud2lkdGg7cmV0dXJuIHRoaXMuc2V0Qm91bmRzKHMsYSxlLngrKG4tcykqdC5feEFsaWduVG9Qcm9wb3J0aW9uW3RoaXMuX3hBbGlnbm1lbnRdLGUueSsoaS1hKSp0Ll95QWxpZ25Ub1Byb3BvcnRpb25bdGhpcy5feUFsaWdubWVudF0pLHRoaXN9LHQucHJvdG90eXBlLnNldEJvdW5kcz1mdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gdm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09aSYmKGk9MCksdGhpcy5fd2lkdGg9dCx0aGlzLl9oZWlnaHQ9ZSx0aGlzLl9vcmlnaW49e3g6bix5Oml9LG51bGwhPXRoaXMuX2VsZW1lbnQmJnRoaXMuX2VsZW1lbnQuc3R5bGVzKHtsZWZ0Om4rInB4IixoZWlnaHQ6ZSsicHgiLHRvcDppKyJweCIsd2lkdGg6dCsicHgifSksbnVsbCE9dGhpcy5fcmVzaXplSGFuZGxlciYmdGhpcy5fcmVzaXplSGFuZGxlcih7d2lkdGg6dCxoZWlnaHQ6ZX0pLHRoaXN9LHQucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5yZXF1ZXN0ZWRTcGFjZSh0LGUpO3JldHVybnt3aWR0aDp0aGlzLmZpeGVkV2lkdGgoKT9NYXRoLm1pbih0LG4ubWluV2lkdGgpOnQsaGVpZ2h0OnRoaXMuZml4ZWRIZWlnaHQoKT9NYXRoLm1pbihlLG4ubWluSGVpZ2h0KTplfX0sdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2lzU2V0dXAmJnRoaXMud2lkdGgoKT49MCYmdGhpcy5oZWlnaHQoKT49MCYmY3l0LnJlZ2lzdGVyVG9SZW5kZXIodGhpcyksdGhpc30sdC5wcm90b3R5cGUucmVuZGVyTG93UHJpb3JpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXIoKX0sdC5wcm90b3R5cGUuX3NjaGVkdWxlQ29tcHV0ZUxheW91dD1mdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2lzU2V0dXAmJmN5dC5yZWdpc3RlclRvQ29tcHV0ZUxheW91dEFuZFJlbmRlcih0aGlzKX0sdC5wcm90b3R5cGUub25SZXNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3Jlc2l6ZUhhbmRsZXI9dCx0aGlzfSx0LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNBbmNob3JlZCYmdGhpcy5faXNTZXR1cCYmKHRoaXMuaXNSb290KCk/dGhpcy5fc2NoZWR1bGVDb21wdXRlTGF5b3V0KCk6dGhpcy5wYXJlbnQoKS5yZWRyYXcoKSksdGhpc30sdC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7fSx0LnByb3RvdHlwZS5yZW5kZXJUbz1mdW5jdGlvbih0KXtpZih0aGlzLmRldGFjaCgpLG51bGwhPXQpe3ZhciBlPXZvaWQgMDtpZighKGU9InN0cmluZyI9PXR5cGVvZiB0fHxoeXQuaXNFbGVtZW50KHQpP2x5dC5zZWxlY3QodCk6ZHl0LmNvZXJjZUV4dGVybmFsRDModCkpLm5vZGUoKXx8bnVsbD09ZS5ub2RlKCkubm9kZU5hbWUpdGhyb3cgbmV3IEVycm9yKCJQbG90dGFibGUgcmVxdWlyZXMgYSB2YWxpZCBFbGVtZW50IHRvIHJlbmRlclRvIik7aWYoInN2ZyI9PT1lLm5vZGUoKS5ub2RlTmFtZSl0aHJvdyBuZXcgRXJyb3IoIlBsb3R0YWJsZSAzLnggYW5kIGxhdGVyIGNhbiBvbmx5IHJlbmRlclRvIGFuIEhUTUwgY29tcG9uZW50OyBwYXNzIGEgZGl2IGluc3RlYWQhIik7dGhpcy5hbmNob3IoZSl9aWYobnVsbD09dGhpcy5fZWxlbWVudCl0aHJvdyBuZXcgRXJyb3IoIklmIGEgQ29tcG9uZW50IGhhcyBuZXZlciBiZWVuIHJlbmRlcmVkIGJlZm9yZSwgdGhlbiByZW5kZXJUbyBtdXN0IGJlIGdpdmVuIGEgbm9kZSB0byByZW5kZXIgdG8sIG9yIGEgZDMuU2VsZWN0aW9uLCBvciBhIHNlbGVjdG9yIHN0cmluZyIpO3JldHVybiBjeXQucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXRBbmRSZW5kZXIodGhpcyksY3l0LmZsdXNoKCksdGhpc30sdC5wcm90b3R5cGUueEFsaWdubWVudD1mdW5jdGlvbihlKXtpZihudWxsPT1lKXJldHVybiB0aGlzLl94QWxpZ25tZW50O2lmKGU9ZS50b0xvd2VyQ2FzZSgpLG51bGw9PXQuX3hBbGlnblRvUHJvcG9ydGlvbltlXSl0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIGFsaWdubWVudDogIitlKTtyZXR1cm4gdGhpcy5feEFsaWdubWVudD1lLHRoaXMucmVkcmF3KCksdGhpc30sdC5wcm90b3R5cGUueUFsaWdubWVudD1mdW5jdGlvbihlKXtpZihudWxsPT1lKXJldHVybiB0aGlzLl95QWxpZ25tZW50O2lmKGU9ZS50b0xvd2VyQ2FzZSgpLG51bGw9PXQuX3lBbGlnblRvUHJvcG9ydGlvbltlXSl0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIGFsaWdubWVudDogIitlKTtyZXR1cm4gdGhpcy5feUFsaWdubWVudD1lLHRoaXMucmVkcmF3KCksdGhpc30sdC5wcm90b3R5cGUuaGFzQ2xhc3M9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJihudWxsPT10aGlzLl9lbGVtZW50P3RoaXMuX2Nzc0NsYXNzZXMuaGFzKHQpOnRoaXMuX2VsZW1lbnQuY2xhc3NlZCh0KSl9LHQucHJvdG90eXBlLmFkZENsYXNzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fHwobnVsbD09dGhpcy5fZWxlbWVudD90aGlzLl9jc3NDbGFzc2VzLmFkZCh0KTp0aGlzLl9lbGVtZW50LmNsYXNzZWQodCwhMCkpLHRoaXN9LHQucHJvdG90eXBlLnJlbW92ZUNsYXNzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fHwobnVsbD09dGhpcy5fZWxlbWVudD90aGlzLl9jc3NDbGFzc2VzLmRlbGV0ZSh0KTp0aGlzLl9lbGVtZW50LmNsYXNzZWQodCwhMSkpLHRoaXN9LHQucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdC5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdC5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KG51bGwpLHRoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2VsZW1lbnQucmVtb3ZlKCksdGhpcy5faXNBbmNob3JlZD0hMSx0aGlzLl9vbkRldGFjaENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMpLHRoaXN9LHQucHJvdG90eXBlLm9uRGV0YWNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9vbkRldGFjaENhbGxiYWNrcy5hZGQodCksdGhpc30sdC5wcm90b3R5cGUub2ZmRGV0YWNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9vbkRldGFjaENhbGxiYWNrcy5kZWxldGUodCksdGhpc30sdC5wcm90b3R5cGUucGFyZW50PWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXMuX3BhcmVudDtpZihudWxsIT09dCYmIXQuaGFzKHRoaXMpKXRocm93IG5ldyBFcnJvcigiUGFzc2VkIGludmFsaWQgcGFyZW50Iik7cmV0dXJuIHRoaXMuX3BhcmVudD10LHRoaXN9LHQucHJvdG90eXBlLmJvdW5kcz1mdW5jdGlvbigpe3ZhciB0PXRoaXMub3JpZ2luKCk7cmV0dXJue3RvcExlZnQ6dCxib3R0b21SaWdodDp7eDp0LngrdGhpcy53aWR0aCgpLHk6dC55K3RoaXMuaGVpZ2h0KCl9fX0sdC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX2Rlc3Ryb3llZD0hMCx0aGlzLmRldGFjaCgpfSx0LnByb3RvdHlwZS53aWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl93aWR0aH0sdC5wcm90b3R5cGUuaGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hlaWdodH0sdC5wcm90b3R5cGUub3JpZ2luPWZ1bmN0aW9uKCl7cmV0dXJue3g6dGhpcy5fb3JpZ2luLngseTp0aGlzLl9vcmlnaW4ueX19LHQucHJvdG90eXBlLm9yaWdpblRvUm9vdD1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLm9yaWdpbigpLGU9dGhpcy5wYXJlbnQoKTtudWxsIT1lOyl7dmFyIG49ZS5vcmlnaW4oKTt0LngrPW4ueCx0LnkrPW4ueSxlPWUucGFyZW50KCl9cmV0dXJuIHR9LHQucHJvdG90eXBlLnJvb3Q9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpczshdC5pc1Jvb3QoKTspdD10LnBhcmVudCgpO3JldHVybiB0fSx0LnByb3RvdHlwZS5pc1Jvb3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09dGhpcy5wYXJlbnQoKX0sdC5wcm90b3R5cGUuZm9yZWdyb3VuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9mb3JlZ3JvdW5kQ29udGFpbmVyfSx0LnByb3RvdHlwZS5jb250ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRlbnR9LHQucHJvdG90eXBlLmVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxlbWVudH0sdC5wcm90b3R5cGUucm9vdEVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb290KCkuX3Jvb3RFbGVtZW50fSx0LnByb3RvdHlwZS5iYWNrZ3JvdW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tncm91bmRDb250YWluZXJ9LHQuX3hBbGlnblRvUHJvcG9ydGlvbj17bGVmdDowLGNlbnRlcjouNSxyaWdodDoxfSx0Ll95QWxpZ25Ub1Byb3BvcnRpb249e3RvcDowLGNlbnRlcjouNSxib3R0b206MX0sdH0pKCk7Qmd0LkNvbXBvbmVudD1meXQ7dmFyIG15dD17fSxneXQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShneXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBfeXQ9RWR0O2Z1bmN0aW9uIHl5dCh0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9Myksdnl0KHQpLGZ1bmN0aW9uKGUpe3JldHVybiBlLnRvRml4ZWQodCl9fWZ1bmN0aW9uIHZ5dCh0KXtpZih0PDB8fHQ+MjApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkZvcm1hdHRlciBwcmVjaXNpb24gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDIwIik7aWYodCE9PU1hdGguZmxvb3IodCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkZvcm1hdHRlciBwcmVjaXNpb24gbXVzdCBiZSBhbiBpbnRlZ2VyIil9Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovZ3l0LmN1cnJlbmN5PWZ1bmN0aW9uIGJ5dCh0LGUsbil7dm9pZCAwPT09dCYmKHQ9Miksdm9pZCAwPT09ZSYmKGU9IiQiKSx2b2lkIDA9PT1uJiYobj0hMCk7dmFyIGk9eXl0KHQpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgcj1pKE1hdGguYWJzKHQpKTtyZXR1cm4iIiE9PXImJihuP3I9ZStyOnIrPWUsdDwwJiYocj0iLSIrcikpLHJ9fSxneXQuZml4ZWQ9eXl0LGd5dC5nZW5lcmFsPWZ1bmN0aW9uIHh5dCh0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9Myksdnl0KHQpLGZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiPT10eXBlb2YgZSl7dmFyIG49TWF0aC5wb3coMTAsdCk7cmV0dXJuIFN0cmluZyhNYXRoLnJvdW5kKGUqbikvbil9cmV0dXJuIFN0cmluZyhlKX19LGd5dC5pZGVudGl0eT1mdW5jdGlvbiB3eXQoKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0KX19LGd5dC5wZXJjZW50YWdlPWZ1bmN0aW9uIFN5dCh0KXt2b2lkIDA9PT10JiYodD0wKTt2YXIgZT15eXQodCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPTEwMCp0LGk9dC50b1N0cmluZygpLHI9TWF0aC5wb3coMTAsaS5sZW5ndGgtKGkuaW5kZXhPZigiLiIpKzEpKTtyZXR1cm4gbj1wYXJzZUludCgobipyKS50b1N0cmluZygpLDEwKS9yLGUobikrIiUifX0sZ3l0LnNpU3VmZml4PWZ1bmN0aW9uIE15dCh0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9Myksdnl0KHQpLGZ1bmN0aW9uKGUpe3JldHVybiBfeXQuZm9ybWF0KCIuIit0KyJzIikoZSl9fSxneXQuc2hvcnRTY2FsZT1mdW5jdGlvbiBFeXQodCl7dm9pZCAwPT09dCYmKHQ9Myksdnl0KHQpO3ZhciBlPSJLTUJUUSIsbj1feXQuZm9ybWF0KCIuIit0KyJlIiksaT1feXQuZm9ybWF0KCIuIit0KyJmIikscj1NYXRoLnBvdygxMCwzKihlLmxlbmd0aCsxKSksbz1NYXRoLnBvdygxMCwtdCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBhPU1hdGguYWJzKHQpO2lmKChhPG98fGE+PXIpJiYwIT09YSlyZXR1cm4gbih0KTtmb3IodmFyIHM9LTE7YT49TWF0aC5wb3coMWUzLHMrMikmJnM8ZS5sZW5ndGgtMTspcysrO3ZhciBsPSIiO3JldHVybiBsPS0xPT09cz9pKHQpOmkodC9NYXRoLnBvdygxZTMscysxKSkrZVtzXSwodD4wJiYiMTAwMCI9PT1sLnN1YnN0cigwLDQpfHx0PDAmJiItMTAwMCI9PT1sLnN1YnN0cigwLDUpKSYmKHM8ZS5sZW5ndGgtMT8ocysrLGw9aSh0L01hdGgucG93KDFlMyxzKzEpKStlW3NdKTpsPW4odCkpLGx9fSxneXQubXVsdGlUaW1lPWZ1bmN0aW9uIFR5dCgpe3ZhciB0PVt7c3BlY2lmaWVyOiIuJUwiLHByZWRpY2F0ZTpmdW5jdGlvbih0KXtyZXR1cm4gMCE9PXQuZ2V0TWlsbGlzZWNvbmRzKCl9fSx7c3BlY2lmaWVyOiI6JVMiLHByZWRpY2F0ZTpmdW5jdGlvbih0KXtyZXR1cm4gMCE9PXQuZ2V0U2Vjb25kcygpfX0se3NwZWNpZmllcjoiJUk6JU0iLHByZWRpY2F0ZTpmdW5jdGlvbih0KXtyZXR1cm4gMCE9PXQuZ2V0TWludXRlcygpfX0se3NwZWNpZmllcjoiJUkgJXAiLHByZWRpY2F0ZTpmdW5jdGlvbih0KXtyZXR1cm4gMCE9PXQuZ2V0SG91cnMoKX19LHtzcGVjaWZpZXI6IiVhICVkIixwcmVkaWNhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIDAhPT10LmdldERheSgpJiYxIT09dC5nZXREYXRlKCl9fSx7c3BlY2lmaWVyOiIlYiAlZCIscHJlZGljYXRlOmZ1bmN0aW9uKHQpe3JldHVybiAxIT09dC5nZXREYXRlKCl9fSx7c3BlY2lmaWVyOiIlYiIscHJlZGljYXRlOmZ1bmN0aW9uKHQpe3JldHVybiAwIT09dC5nZXRNb250aCgpfX1dO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj10LmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQucHJlZGljYXRlKGUpfSkpO3JldHVybiBfeXQudGltZUZvcm1hdChuLmxlbmd0aD4wP25bMF0uc3BlY2lmaWVyOiIlWSIpKGUpfX0sZ3l0LnRpbWU9ZnVuY3Rpb24gQ3l0KHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPSExKSxlP195dC51dGNGb3JtYXQodCk6X3l0LnRpbWVGb3JtYXQodCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShteXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBBeXQ9dU8sa3l0PUVkdCxMeXQ9SW10LFB5dD1CZ3QsTnl0PWd5dCxJeXQ9Rmd0O215dC5BeGlzT3JpZW50YXRpb249U210Lm1ha2VFbnVtKFsiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwidG9wIl0pO3ZhciBSeXQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt2YXIgaT10LmNhbGwodGhpcyl8fHRoaXM7aWYoaS5fZW5kVGlja0xlbmd0aD01LGkuX2lubmVyVGlja0xlbmd0aD01LGkuX3RpY2tMYWJlbFBhZGRpbmc9MTAsaS5fbWFyZ2luPTE1LGkuX3Nob3dFbmRUaWNrTGFiZWxzPSExLGkuX2Fubm90YXRpb25zRW5hYmxlZD0hMSxpLl9hbm5vdGF0aW9uVGllckNvdW50PTEsbnVsbD09ZXx8bnVsbD09bil0aHJvdyBuZXcgRXJyb3IoIkF4aXMgcmVxdWlyZXMgYSBzY2FsZSBhbmQgb3JpZW50YXRpb24iKTtyZXR1cm4gaS5fc2NhbGU9ZSxpLm9yaWVudGF0aW9uKG4pLGkuX3NldERlZmF1bHRBbGlnbm1lbnQoKSxpLmFkZENsYXNzKCJheGlzIiksaS5pc0hvcml6b250YWwoKT9pLmFkZENsYXNzKCJ4LWF4aXMiKTppLmFkZENsYXNzKCJ5LWF4aXMiKSxpLmZvcm1hdHRlcihOeXQuaWRlbnRpdHkoKSksaS5fcmVzY2FsZUNhbGxiYWNrPWZ1bmN0aW9uKHQpe3JldHVybiBpLl9yZXNjYWxlKCl9LGkuX3NjYWxlLm9uVXBkYXRlKGkuX3Jlc2NhbGVDYWxsYmFjayksaS5fYW5ub3RhdGVkVGlja3M9W10saS5fYW5ub3RhdGlvbkZvcm1hdHRlcj1OeXQuaWRlbnRpdHkoKSxpfXJldHVybiBBeXQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3QucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKSx0aGlzLl9zY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVzY2FsZUNhbGxiYWNrKX0sZS5wcm90b3R5cGUudGlja0xhYmVsRGF0YU9uRWxlbWVudD1mdW5jdGlvbih0KXtpZihudWxsIT10KXtmb3IodmFyIG47bnVsbCE9dCYmdC5jbGFzc0xpc3QmJnZvaWQgMD09PW47KXQuY2xhc3NMaXN0LmNvbnRhaW5zKGUuVElDS19MQUJFTF9DTEFTUyk/bj10OnQ9dC5wYXJlbnROb2RlO3JldHVybiB2b2lkIDA9PT10P3ZvaWQgMDpreXQuc2VsZWN0KHQpLmRhdHVtKCl9fSxlLnByb3RvdHlwZS5fY29tcHV0ZVdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpfSxlLnByb3RvdHlwZS5fY29tcHV0ZUhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKX0sZS5wcm90b3R5cGUucmVxdWVzdGVkU3BhY2U9ZnVuY3Rpb24odCxuKXt2YXIgaT0wLHI9MDtyZXR1cm4gdGhpcy5pc0hvcml6b250YWwoKT8ocj10aGlzLl9jb21wdXRlSGVpZ2h0KCkrdGhpcy5fbWFyZ2luLHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkmJihyKz0odGhpcy5fYW5ub3RhdGlvbk1lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQrMiplLl9BTk5PVEFUSU9OX0xBQkVMX1BBRERJTkcpKnRoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpKSk6KGk9dGhpcy5fY29tcHV0ZVdpZHRoKCkrdGhpcy5fbWFyZ2luLHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkmJihpKz0odGhpcy5fYW5ub3RhdGlvbk1lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQrMiplLl9BTk5PVEFUSU9OX0xBQkVMX1BBRERJTkcpKnRoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpKSkse21pbldpZHRoOmksbWluSGVpZ2h0OnJ9fSxlLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzSG9yaXpvbnRhbCgpfSxlLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNIb3Jpem9udGFsKCl9LGUucHJvdG90eXBlLl9yZXNjYWxlPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXIoKX0sZS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihlLG4saSl7cmV0dXJuIHQucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLGUsbixpKSx0aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuX3NjYWxlLnJhbmdlKFswLHRoaXMud2lkdGgoKV0pOnRoaXMuX3NjYWxlLnJhbmdlKFt0aGlzLmhlaWdodCgpLDBdKSx0aGlzfSxlLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMucmVxdWVzdGVkU3BhY2UodCxlKTtyZXR1cm4gdGhpcy5pc0hvcml6b250YWwoKT97d2lkdGg6dCxoZWlnaHQ6bi5taW5IZWlnaHR9OntoZWlnaHQ6ZSx3aWR0aDpuLm1pbldpZHRofX0sZS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyksdGhpcy5fdGlja01hcmtDb250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChlLlRJQ0tfTUFSS19DTEFTUysiLWNvbnRhaW5lciIsITApLHRoaXMuX3RpY2tMYWJlbENvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKGUuVElDS19MQUJFTF9DTEFTUysiLWNvbnRhaW5lciIsITApLHRoaXMuX2Jhc2VsaW5lPXRoaXMuY29udGVudCgpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImJhc2VsaW5lIiwhMCksdGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLWNvbnRhaW5lciIsITApLHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1saW5lLWNvbnRhaW5lciIsITApLHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1jaXJjbGUtY29udGFpbmVyIiwhMCksdGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLXJlY3QtY29udGFpbmVyIiwhMCk7dmFyIG49dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLWxhYmVsLWNvbnRhaW5lciIsITApLGk9bmV3IEx5dC5TdmdDb250ZXh0KG4ubm9kZSgpKTt0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXI9bmV3IEx5dC5DYWNoZU1lYXN1cmVyKGkpLHRoaXMuX2Fubm90YXRpb25Xcml0ZXI9bmV3IEx5dC5Xcml0ZXIodGhpcy5fYW5ub3RhdGlvbk1lYXN1cmVyLGkpfSxlLnByb3RvdHlwZS5fZ2V0VGlja1ZhbHVlcz1mdW5jdGlvbigpe3JldHVybltdfSxlLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2dldFRpY2tWYWx1ZXMoKSxuPXRoaXMuX3RpY2tNYXJrQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrZS5USUNLX01BUktfQ0xBU1MpLmRhdGEodCksaT1uLmVudGVyKCkuYXBwZW5kKCJsaW5lIikuY2xhc3NlZChlLlRJQ0tfTUFSS19DTEFTUywhMCkubWVyZ2Uobik7cmV0dXJuIGkuYXR0cnModGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCkpLGt5dC5zZWxlY3QoaS5ub2RlcygpWzBdKS5jbGFzc2VkKGUuRU5EX1RJQ0tfTUFSS19DTEFTUywhMCkuYXR0cnModGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCEwKSksa3l0LnNlbGVjdChpLm5vZGVzKClbdC5sZW5ndGgtMV0pLmNsYXNzZWQoZS5FTkRfVElDS19NQVJLX0NMQVNTLCEwKS5hdHRycyh0aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goITApKSxuLmV4aXQoKS5yZW1vdmUoKSx0aGlzLl9iYXNlbGluZS5hdHRycyh0aGlzLl9nZW5lcmF0ZUJhc2VsaW5lQXR0ckhhc2goKSksdGhpcy5hbm5vdGF0aW9uc0VuYWJsZWQoKT90aGlzLl9kcmF3QW5ub3RhdGlvbnMoKTp0aGlzLl9yZW1vdmVBbm5vdGF0aW9ucygpLHRoaXN9LGUucHJvdG90eXBlLmFubm90YXRlZFRpY2tzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2Fubm90YXRlZFRpY2tzOih0aGlzLl9hbm5vdGF0ZWRUaWNrcz10LHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLmFubm90YXRpb25Gb3JtYXR0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fYW5ub3RhdGlvbkZvcm1hdHRlcjoodGhpcy5fYW5ub3RhdGlvbkZvcm1hdHRlcj10LHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLmFubm90YXRpb25zRW5hYmxlZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9hbm5vdGF0aW9uc0VuYWJsZWQ6KHRoaXMuX2Fubm90YXRpb25zRW5hYmxlZD10LHRoaXMucmVkcmF3KCksdGhpcyl9LGUucHJvdG90eXBlLmFubm90YXRpb25UaWVyQ291bnQ9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fYW5ub3RhdGlvblRpZXJDb3VudDtpZih0PDApdGhyb3cgbmV3IEVycm9yKCJhbm5vdGF0aW9uVGllckNvdW50IGNhbm5vdCBiZSBuZWdhdGl2ZSIpO3JldHVybiB0aGlzLl9hbm5vdGF0aW9uVGllckNvdW50PXQsdGhpcy5yZWRyYXcoKSx0aGlzfSxlLnByb3RvdHlwZS5fZHJhd0Fubm90YXRpb25zPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPWUuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORyxpPW5ldyBJeXQuTWFwLHI9dGhpcy5fYW5ub3RhdGVkVGlja3NUb1JlbmRlcigpO3IuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHI9dC5fYW5ub3RhdGlvbk1lYXN1cmVyLm1lYXN1cmUodC5hbm5vdGF0aW9uRm9ybWF0dGVyKCkoZSkpO2kuc2V0KGUse3dpZHRoOnIud2lkdGgrMipuLGhlaWdodDpyLmhlaWdodCsyKm59KX0pKTt2YXIgbz10aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCsyKm4sYT10aGlzLl9hbm5vdGF0aW9uVG9UaWVyKGkpLHM9bmV3IEl5dC5TZXQsbD10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuaGVpZ2h0KCk6dGhpcy53aWR0aCgpLGM9dGhpcy5fY29yZVNpemUoKSx1PU1hdGgubWluKHRoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpLE1hdGguZmxvb3IoKGwtYykvbykpO2EuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXsoLTE9PT10fHx0Pj11KSYmcy5hZGQoZSl9KSk7dmFyIGgsZD1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5zZWxlY3RBbGwoIi4iK24pLmRhdGEociksbz1pLmVudGVyKCkuYXBwZW5kKGUpLmNsYXNzZWQobiwhMCkubWVyZ2UoaSk7cmV0dXJuIGkuZXhpdCgpLnJlbW92ZSgpLG99LHA9ZnVuY3Rpb24oZSl7c3dpdGNoKHQub3JpZW50YXRpb24oKSl7Y2FzZSJib3R0b20iOmNhc2UicmlnaHQiOnJldHVybiBhLmdldChlKSpvK2M7Y2FzZSJ0b3AiOmNhc2UibGVmdCI6cmV0dXJuIGwtYy1hLmdldChlKSpvfX0sZj1mdW5jdGlvbihlKXtyZXR1cm4gdC5fc2NhbGUuc2NhbGUoZSl9LG09ZnVuY3Rpb24odCl7cmV0dXJuIHMuaGFzKHQpPyJoaWRkZW4iOiJ2aXNpYmxlIn07c3dpdGNoKHRoaXMub3JpZW50YXRpb24oKSl7Y2FzZSJib3R0b20iOmNhc2UicmlnaHQiOmg9MDticmVhaztjYXNlInRvcCI6aD10aGlzLmhlaWdodCgpO2JyZWFrO2Nhc2UibGVmdCI6aD10aGlzLndpZHRoKCl9dmFyIGc9dGhpcy5pc0hvcml6b250YWwoKTtkKHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1saW5lLWNvbnRhaW5lciIpLCJsaW5lIixlLkFOTk9UQVRJT05fTElORV9DTEFTUykuYXR0cnMoe3gxOmc/ZjpoLHgyOmc/ZjpwLHkxOmc/aDpmLHkyOmc/cDpmLHZpc2liaWxpdHk6bX0pLGQodGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3QoIi5hbm5vdGF0aW9uLWNpcmNsZS1jb250YWluZXIiKSwiY2lyY2xlIixlLkFOTk9UQVRJT05fQ0lSQ0xFX0NMQVNTKS5hdHRycyh7Y3g6Zz9mOmgsY3k6Zz9oOmYscjozfSk7dmFyIF89ZnVuY3Rpb24oZSl7c3dpdGNoKHQub3JpZW50YXRpb24oKSl7Y2FzZSJib3R0b20iOmNhc2UicmlnaHQiOnJldHVybiBwKGUpO2Nhc2UidG9wIjpjYXNlImxlZnQiOnJldHVybiBwKGUpLWkuZ2V0KGUpLmhlaWdodH19O2QodGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3QoIi5hbm5vdGF0aW9uLXJlY3QtY29udGFpbmVyIiksInJlY3QiLGUuQU5OT1RBVElPTl9SRUNUX0NMQVNTKS5hdHRycyh7eDpnP2Y6Xyx5Omc/XzpmLHdpZHRoOmc/ZnVuY3Rpb24odCl7cmV0dXJuIGkuZ2V0KHQpLndpZHRofTpmdW5jdGlvbih0KXtyZXR1cm4gaS5nZXQodCkuaGVpZ2h0fSxoZWlnaHQ6Zz9mdW5jdGlvbih0KXtyZXR1cm4gaS5nZXQodCkuaGVpZ2h0fTpmdW5jdGlvbih0KXtyZXR1cm4gaS5nZXQodCkud2lkdGh9LHZpc2liaWxpdHk6bX0pO3ZhciB5PXRoaXMuX2Fubm90YXRpb25Xcml0ZXIsdj10aGlzLmFubm90YXRpb25Gb3JtYXR0ZXIoKSxiPWQodGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3QoIi5hbm5vdGF0aW9uLWxhYmVsLWNvbnRhaW5lciIpLCJnIixlLkFOTk9UQVRJT05fTEFCRUxfQ0xBU1MpO2Iuc2VsZWN0QWxsKCIudGV4dC1jb250YWluZXIiKS5yZW1vdmUoKSxiLmF0dHJzKHt0cmFuc2Zvcm06ZnVuY3Rpb24odCl7cmV0dXJuInRyYW5zbGF0ZSgiKyhnP2YodCk6Xyh0KSkrIiwiKyhnP18odCk6Zih0KSkrIikifSx2aXNpYmlsaXR5Om19KS5lYWNoKChmdW5jdGlvbih0KXt5LndyaXRlKHYodCksZz9pLmdldCh0KS53aWR0aDppLmdldCh0KS5oZWlnaHQsZz9pLmdldCh0KS5oZWlnaHQ6aS5nZXQodCkud2lkdGgse3hBbGlnbjoiY2VudGVyIix5QWxpZ246ImNlbnRlciIsdGV4dFJvdGF0aW9uOmc/MDo5MH0sa3l0LnNlbGVjdCh0aGlzKS5ub2RlKCkpfSkpfSxlLnByb3RvdHlwZS5fYW5ub3RhdGVkVGlja3NUb1JlbmRlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLl9zY2FsZS5yYW5nZSgpO3JldHVybiBJeXQuQXJyYXkudW5pcSh0aGlzLmFubm90YXRlZFRpY2tzKCkuZmlsdGVyKChmdW5jdGlvbihuKXtyZXR1cm4gbnVsbCE9biYmSXl0Lk1hdGguaW5SYW5nZSh0Ll9zY2FsZS5zY2FsZShuKSxlWzBdLGVbMV0pfSkpKX0sZS5wcm90b3R5cGUuX2NvcmVTaXplPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5pc0hvcml6b250YWwoKT90aGlzLmhlaWdodCgpOnRoaXMud2lkdGgoKSxlPXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5fY29tcHV0ZUhlaWdodCgpOnRoaXMuX2NvbXB1dGVXaWR0aCgpO3JldHVybiBNYXRoLm1pbihlLHQpfSxlLnByb3RvdHlwZS5fYW5ub3RhdGlvblRpZXJIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYW5ub3RhdGlvbk1lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQrMiplLl9BTk5PVEFUSU9OX0xBQkVMX1BBRERJTkd9LGUucHJvdG90eXBlLl9hbm5vdGF0aW9uVG9UaWVyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1bW11dLGk9bmV3IEl5dC5NYXAscj10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMud2lkdGgoKTp0aGlzLmhlaWdodCgpO3JldHVybiB0aGlzLl9hbm5vdGF0ZWRUaWNrc1RvUmVuZGVyKCkuZm9yRWFjaCgoZnVuY3Rpb24obyl7dmFyIGE9ZS5fc2NhbGUuc2NhbGUobykscz10LmdldChvKS53aWR0aDtpZihhPDB8fGErcz5yKWkuc2V0KG8sLTEpO2Vsc2V7Zm9yKHZhciBsPTA7bltsXS5zb21lKChmdW5jdGlvbihuKXt2YXIgaT1lLl9zY2FsZS5zY2FsZShuKSxyPXQuZ2V0KG4pLndpZHRoO3JldHVybiBhK3M+PWkmJmE8PWkrcn0pKTspbCsrLG4ubGVuZ3RoPT09bCYmbi5wdXNoKFtdKTtuW2xdLnB1c2gobyksaS5zZXQobyxsKX19KSksaX0sZS5wcm90b3R5cGUuX3JlbW92ZUFubm90YXRpb25zPWZ1bmN0aW9uKCl7dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3RBbGwoIi5hbm5vdGF0aW9uLWxpbmUiKS5yZW1vdmUoKSx0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tY2lyY2xlIikucmVtb3ZlKCksdGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3RBbGwoIi5hbm5vdGF0aW9uLXJlY3QiKS5yZW1vdmUoKSx0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tbGFiZWwiKS5yZW1vdmUoKX0sZS5wcm90b3R5cGUuX2dlbmVyYXRlQmFzZWxpbmVBdHRySGFzaD1mdW5jdGlvbigpe3ZhciB0PXt4MTowLHkxOjAseDI6MCx5MjowfTtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UiYm90dG9tIjp0LngyPXRoaXMud2lkdGgoKTticmVhaztjYXNlInRvcCI6dC54Mj10aGlzLndpZHRoKCksdC55MT10aGlzLmhlaWdodCgpLHQueTI9dGhpcy5oZWlnaHQoKTticmVhaztjYXNlImxlZnQiOnQueDE9dGhpcy53aWR0aCgpLHQueDI9dGhpcy53aWR0aCgpLHQueTI9dGhpcy5oZWlnaHQoKTticmVhaztjYXNlInJpZ2h0Ijp0LnkyPXRoaXMuaGVpZ2h0KCl9cmV0dXJuIHR9LGUucHJvdG90eXBlLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2g9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt2b2lkIDA9PT10JiYodD0hMSk7dmFyIG49e3gxOjAseTE6MCx4MjowLHkyOjB9LGk9ZnVuY3Rpb24odCl7cmV0dXJuIGUuX3NjYWxlLnNjYWxlKHQpfTt0aGlzLmlzSG9yaXpvbnRhbCgpPyhuLngxPWksbi54Mj1pKToobi55MT1pLG4ueTI9aSk7dmFyIHI9dD90aGlzLl9lbmRUaWNrTGVuZ3RoOnRoaXMuX2lubmVyVGlja0xlbmd0aDtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UiYm90dG9tIjpuLnkyPXI7YnJlYWs7Y2FzZSJ0b3AiOm4ueTE9dGhpcy5oZWlnaHQoKSxuLnkyPXRoaXMuaGVpZ2h0KCktcjticmVhaztjYXNlImxlZnQiOm4ueDE9dGhpcy53aWR0aCgpLG4ueDI9dGhpcy53aWR0aCgpLXI7YnJlYWs7Y2FzZSJyaWdodCI6bi54Mj1yfXJldHVybiBufSxlLnByb3RvdHlwZS5fc2V0RGVmYXVsdEFsaWdubWVudD1mdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9vcmllbnRhdGlvbil7Y2FzZSJib3R0b20iOnRoaXMueUFsaWdubWVudCgidG9wIik7YnJlYWs7Y2FzZSJ0b3AiOnRoaXMueUFsaWdubWVudCgiYm90dG9tIik7YnJlYWs7Y2FzZSJsZWZ0Ijp0aGlzLnhBbGlnbm1lbnQoInJpZ2h0Iik7YnJlYWs7Y2FzZSJyaWdodCI6dGhpcy54QWxpZ25tZW50KCJsZWZ0Iil9fSxlLnByb3RvdHlwZS5pc0hvcml6b250YWw9ZnVuY3Rpb24oKXtyZXR1cm4idG9wIj09PXRoaXMuX29yaWVudGF0aW9ufHwiYm90dG9tIj09PXRoaXMuX29yaWVudGF0aW9ufSxlLnByb3RvdHlwZS5nZXRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY2FsZX0sZS5wcm90b3R5cGUuZm9ybWF0dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2Zvcm1hdHRlcjoodGhpcy5fZm9ybWF0dGVyPXQsdGhpcy5yZWRyYXcoKSx0aGlzKX0sZS5wcm90b3R5cGUuaW5uZXJUaWNrTGVuZ3RoPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX2lubmVyVGlja0xlbmd0aDtpZih0PDApdGhyb3cgbmV3IEVycm9yKCJpbm5lciB0aWNrIGxlbmd0aCBtdXN0IGJlIHBvc2l0aXZlIik7cmV0dXJuIHRoaXMuX2lubmVyVGlja0xlbmd0aD10LHRoaXMucmVkcmF3KCksdGhpc30sZS5wcm90b3R5cGUuZW5kVGlja0xlbmd0aD1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9lbmRUaWNrTGVuZ3RoO2lmKHQ8MCl0aHJvdyBuZXcgRXJyb3IoImVuZCB0aWNrIGxlbmd0aCBtdXN0IGJlIHBvc2l0aXZlIik7cmV0dXJuIHRoaXMuX2VuZFRpY2tMZW5ndGg9dCx0aGlzLnJlZHJhdygpLHRoaXN9LGUucHJvdG90eXBlLl9tYXhMYWJlbFRpY2tMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaG93RW5kVGlja0xhYmVscygpP01hdGgubWF4KHRoaXMuaW5uZXJUaWNrTGVuZ3RoKCksdGhpcy5lbmRUaWNrTGVuZ3RoKCkpOnRoaXMuaW5uZXJUaWNrTGVuZ3RoKCl9LGUucHJvdG90eXBlLnRpY2tMYWJlbFBhZGRpbmc9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fdGlja0xhYmVsUGFkZGluZztpZih0PDApdGhyb3cgbmV3IEVycm9yKCJ0aWNrIGxhYmVsIHBhZGRpbmcgbXVzdCBiZSBwb3NpdGl2ZSIpO3JldHVybiB0aGlzLl90aWNrTGFiZWxQYWRkaW5nPXQsdGhpcy5yZWRyYXcoKSx0aGlzfSxlLnByb3RvdHlwZS5tYXJnaW49ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fbWFyZ2luO2lmKHQ8MCl0aHJvdyBuZXcgRXJyb3IoIm1hcmdpbiBzaXplIG11c3QgYmUgcG9zaXRpdmUiKTtyZXR1cm4gdGhpcy5fbWFyZ2luPXQsdGhpcy5yZWRyYXcoKSx0aGlzfSxlLnByb3RvdHlwZS5vcmllbnRhdGlvbj1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9vcmllbnRhdGlvbjt2YXIgZT10LnRvTG93ZXJDYXNlKCk7aWYoInRvcCIhPT1lJiYiYm90dG9tIiE9PWUmJiJsZWZ0IiE9PWUmJiJyaWdodCIhPT1lKXRocm93IG5ldyBFcnJvcigidW5zdXBwb3J0ZWQgb3JpZW50YXRpb24iKTtyZXR1cm4gdGhpcy5fb3JpZW50YXRpb249ZSx0aGlzLnJlZHJhdygpLHRoaXN9LGUucHJvdG90eXBlLnNob3dFbmRUaWNrTGFiZWxzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX3Nob3dFbmRUaWNrTGFiZWxzOih0aGlzLl9zaG93RW5kVGlja0xhYmVscz10LHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLl9zaG93QWxsVGlja01hcmtzPWZ1bmN0aW9uKCl7dGhpcy5fdGlja01hcmtDb250YWluZXIuc2VsZWN0QWxsKCIuIitlLlRJQ0tfTUFSS19DTEFTUykuZWFjaCgoZnVuY3Rpb24oKXtreXQuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaW5oZXJpdCIpfSkpfSxlLnByb3RvdHlwZS5fc2hvd0FsbFRpY2tMYWJlbHM9ZnVuY3Rpb24oKXt0aGlzLl90aWNrTGFiZWxDb250YWluZXIuc2VsZWN0QWxsKCIuIitlLlRJQ0tfTEFCRUxfQ0xBU1MpLmVhY2goKGZ1bmN0aW9uKCl7a3l0LnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIsImluaGVyaXQiKX0pKX0sZS5wcm90b3R5cGUuX2hpZGVPdmVyZmxvd2luZ1RpY2tMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsZW1lbnQoKS5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj10aGlzLl90aWNrTGFiZWxDb250YWluZXIuc2VsZWN0QWxsKCIuIitlLlRJQ0tfTEFCRUxfQ0xBU1MpO24uZW1wdHkoKXx8bi5lYWNoKChmdW5jdGlvbihlLG4pe0l5dC5ET00uY2xpZW50UmVjdEluc2lkZSh0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHQpfHxreXQuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9KSl9LGUucHJvdG90eXBlLl9oaWRlVGlja01hcmtzV2l0aG91dExhYmVsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fdGlja01hcmtDb250YWluZXIuc2VsZWN0QWxsKCIuIitlLlRJQ0tfTUFSS19DTEFTUyksbj10aGlzLl90aWNrTGFiZWxDb250YWluZXIuc2VsZWN0QWxsKCIuIitlLlRJQ0tfTEFCRUxfQ0xBU1MpLmZpbHRlcigoZnVuY3Rpb24odCxlKXt2YXIgbj1reXQuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5Iik7cmV0dXJuImluaGVyaXQiPT09bnx8InZpc2libGUiPT09bn0pKS5kYXRhKCk7dC5lYWNoKChmdW5jdGlvbih0LGUpey0xPT09bi5pbmRleE9mKHQpJiZreXQuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9KSl9LGUucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe3QucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpLHRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5yZXNldCgpfSxlLkVORF9USUNLX01BUktfQ0xBU1M9ImVuZC10aWNrLW1hcmsiLGUuVElDS19NQVJLX0NMQVNTPSJ0aWNrLW1hcmsiLGUuVElDS19MQUJFTF9DTEFTUz0idGljay1sYWJlbCIsZS5BTk5PVEFUSU9OX0xJTkVfQ0xBU1M9ImFubm90YXRpb24tbGluZSIsZS5BTk5PVEFUSU9OX1JFQ1RfQ0xBU1M9ImFubm90YXRpb24tcmVjdCIsZS5BTk5PVEFUSU9OX0NJUkNMRV9DTEFTUz0iYW5ub3RhdGlvbi1jaXJjbGUiLGUuQU5OT1RBVElPTl9MQUJFTF9DTEFTUz0iYW5ub3RhdGlvbi1sYWJlbCIsZS5fQU5OT1RBVElPTl9MQUJFTF9QQURESU5HPTQsZX0pKFB5dC5Db21wb25lbnQpO215dC5BeGlzPVJ5dCwKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KE5tdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIE95dD11Tyx6eXQ9RWR0LER5dD1JbXQsQnl0PUJndCxIeXQ9Rmd0LEZ5dD1teXQsVnl0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7dm9pZCAwPT09biYmKG49ImJvdHRvbSIpO3ZhciBpPXQuY2FsbCh0aGlzLGUsbil8fHRoaXM7cmV0dXJuIGkuX3RpY2tMYWJlbEFuZ2xlPTAsaS5fdGlja0xhYmVsU2hlYXJBbmdsZT0wLGkuYWRkQ2xhc3MoImNhdGVnb3J5LWF4aXMiKSxpfXJldHVybiBPeXQuX19leHRlbmRzKGUsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJfd3JhcHBlciIse2dldDpmdW5jdGlvbigpe3ZhciB0PW5ldyBEeXQuV3JhcHBlcjtyZXR1cm4gbnVsbCE9dGhpcy5fdGlja0xhYmVsTWF4TGluZXMmJnQubWF4TGluZXModGhpcy5fdGlja0xhYmVsTWF4TGluZXMpLHR9LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCJfd3JpdGVyIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBEeXQuV3JpdGVyKHRoaXMuX21lYXN1cmVyLHRoaXMuX3R5cGVzZXR0ZXJDb250ZXh0LHRoaXMuX3dyYXBwZXIpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3QucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpLHRoaXMuX3R5cGVzZXR0ZXJDb250ZXh0PW5ldyBEeXQuU3ZnQ29udGV4dCh0aGlzLl90aWNrTGFiZWxDb250YWluZXIubm9kZSgpKSx0aGlzLl9tZWFzdXJlcj1uZXcgRHl0LkNhY2hlTWVhc3VyZXIodGhpcy5fdHlwZXNldHRlckNvbnRleHQpfSxlLnByb3RvdHlwZS5fcmVzY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlZHJhdygpfSxlLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuaXNIb3Jpem9udGFsKCk/MDp0aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpK3RoaXMubWFyZ2luKCksaT10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCkrdGhpcy5tYXJnaW4oKTowO2lmKDA9PT10aGlzLl9zY2FsZS5kb21haW4oKS5sZW5ndGgpcmV0dXJue21pbldpZHRoOjAsbWluSGVpZ2h0OjB9O2lmKHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkpe3ZhciByPXRoaXMuX2Fubm90YXRpb25UaWVySGVpZ2h0KCkqdGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCk7dGhpcy5pc0hvcml6b250YWwoKT9pKz1yOm4rPXJ9dmFyIG89dGhpcy5fbWVhc3VyZVRpY2tMYWJlbHModCxlKTtyZXR1cm57bWluV2lkdGg6by51c2VkV2lkdGgrbixtaW5IZWlnaHQ6by51c2VkSGVpZ2h0K2l9fSxlLnByb3RvdHlwZS5fY29yZVNpemU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuaGVpZ2h0KCk6dGhpcy53aWR0aCgpLGU9dGhpcy5pc0hvcml6b250YWwoKT90aGlzLnJlcXVlc3RlZFNwYWNlKHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpKS5taW5IZWlnaHQ6dGhpcy5yZXF1ZXN0ZWRTcGFjZSh0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSkubWluV2lkdGgsbj10aGlzLm1hcmdpbigpK3RoaXMuX2Fubm90YXRpb25UaWVySGVpZ2h0KCk7cmV0dXJuIE1hdGgubWluKGUtbix0KX0sZS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXREb3duc2FtcGxlSW5mbygpLmRvbWFpbn0sZS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gQnl0LkNvbXBvbmVudC5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXIuY2FsbCh0aGlzLHQsZSl9LGUucHJvdG90eXBlLmdldERvd25zYW1wbGVJbmZvPWZ1bmN0aW9uKHQsbil7dm9pZCAwPT09dCYmKHQ9dGhpcy5fc2NhbGUpLHZvaWQgMD09PW4mJihuPXQuaW52ZXJ0UmFuZ2UoKSk7dmFyIGk9MD09PXRoaXMuX3RpY2tMYWJlbEFuZ2xlPzE6MS9NYXRoLmNvcyh0aGlzLl90aWNrTGFiZWxTaGVhckFuZ2xlLzE4MCpNYXRoLlBJKSxyPU1hdGguY2VpbChlLl9NSU5JTVVNX1dJRFRIX1BFUl9MQUJFTF9QWCppL3Quc3RlcFdpZHRoKCkpO3JldHVybntkb21haW46bi5maWx0ZXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUlcj09MH0pKSxzdGVwV2lkdGg6cip0LnN0ZXBXaWR0aCgpfX0sZS5wcm90b3R5cGUudGlja0xhYmVsQW5nbGU9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fdGlja0xhYmVsQW5nbGU7aWYoMCE9PXQmJjkwIT09dCYmLTkwIT09dCl0aHJvdyBuZXcgRXJyb3IoIkFuZ2xlICIrdCsiIG5vdCBzdXBwb3J0ZWQ7IG9ubHkgMCwgOTAsIGFuZCAtOTAgYXJlIHZhbGlkIHZhbHVlcyIpO3JldHVybiB0aGlzLl90aWNrTGFiZWxBbmdsZT10LHRoaXMucmVkcmF3KCksdGhpc30sZS5wcm90b3R5cGUudGlja0xhYmVsU2hlYXJBbmdsZT1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl90aWNrTGFiZWxTaGVhckFuZ2xlO2lmKHQ8LTgwfHx0PjgwKXRocm93IG5ldyBFcnJvcigiQW5nbGUgIit0KyIgbm90IHN1cHBvcnRlZDsgTXVzdCBiZSBiZXR3ZWVuIFstODAsIDgwXSIpO3JldHVybiB0aGlzLl90aWNrTGFiZWxTaGVhckFuZ2xlPXQsdGhpcy5yZWRyYXcoKSx0aGlzfSxlLnByb3RvdHlwZS50aWNrTGFiZWxNYXhXaWR0aD1mdW5jdGlvbih0KXtyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5fdGlja0xhYmVsTWF4V2lkdGg6KHRoaXMuX3RpY2tMYWJlbE1heFdpZHRoPXQsdGhpcy5yZWRyYXcoKSx0aGlzKX0sZS5wcm90b3R5cGUudGlja0xhYmVsTWF4TGluZXM9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMuX3RpY2tMYWJlbE1heExpbmVzOih0aGlzLl90aWNrTGFiZWxNYXhMaW5lcz10LHRoaXMucmVkcmF3KCksdGhpcyl9LGUucHJvdG90eXBlLl90aWNrU3BhY2VSZXF1aXJlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSt0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKX0sZS5wcm90b3R5cGUuX2RyYXdUaWNrcz1mdW5jdGlvbih0LGUpe3ZhciBuLGkscj10aGlzO3N3aXRjaCh0aGlzLnRpY2tMYWJlbEFuZ2xlKCkpe2Nhc2UgMDpuPXtsZWZ0OiJyaWdodCIscmlnaHQ6ImxlZnQiLHRvcDoiY2VudGVyIixib3R0b206ImNlbnRlciJ9LGk9e2xlZnQ6ImNlbnRlciIscmlnaHQ6ImNlbnRlciIsdG9wOiJib3R0b20iLGJvdHRvbToidG9wIn07YnJlYWs7Y2FzZSA5MDpuPXtsZWZ0OiJjZW50ZXIiLHJpZ2h0OiJjZW50ZXIiLHRvcDoicmlnaHQiLGJvdHRvbToibGVmdCJ9LGk9e2xlZnQ6InRvcCIscmlnaHQ6ImJvdHRvbSIsdG9wOiJjZW50ZXIiLGJvdHRvbToiY2VudGVyIn07YnJlYWs7Y2FzZS05MDpuPXtsZWZ0OiJjZW50ZXIiLHJpZ2h0OiJjZW50ZXIiLHRvcDoibGVmdCIsYm90dG9tOiJyaWdodCJ9LGk9e2xlZnQ6ImJvdHRvbSIscmlnaHQ6InRvcCIsdG9wOiJjZW50ZXIiLGJvdHRvbToiY2VudGVyIn19ZS5lYWNoKChmdW5jdGlvbihlKXt2YXIgbz16eXQuc2VsZWN0KHRoaXMpLGE9ci5pc0hvcml6b250YWwoKT90OnIud2lkdGgoKS1yLl90aWNrU3BhY2VSZXF1aXJlZCgpLHM9ci5pc0hvcml6b250YWwoKT9yLmhlaWdodCgpLXIuX3RpY2tTcGFjZVJlcXVpcmVkKCk6dCxsPXt4QWxpZ246bltyLm9yaWVudGF0aW9uKCldLHlBbGlnbjppW3Iub3JpZW50YXRpb24oKV0sdGV4dFJvdGF0aW9uOnIudGlja0xhYmVsQW5nbGUoKSx0ZXh0U2hlYXI6ci50aWNrTGFiZWxTaGVhckFuZ2xlKCl9O2lmKG51bGwhPXIuX3RpY2tMYWJlbE1heFdpZHRoKXtpZigibGVmdCI9PT1yLm9yaWVudGF0aW9uKCkmJmE+ci5fdGlja0xhYmVsTWF4V2lkdGgpe3ZhciBjPWEtci5fdGlja0xhYmVsTWF4V2lkdGgsdT1vLmF0dHIoInRyYW5zZm9ybSIpKyIgdHJhbnNsYXRlKCIrYysiLCAwKSI7by5hdHRyKCJ0cmFuc2Zvcm0iLHUpfWE9TWF0aC5taW4oYSxyLl90aWNrTGFiZWxNYXhXaWR0aCl9ci5fd3JpdGVyLndyaXRlKHIuZm9ybWF0dGVyKCkoZSksYSxzLGwsby5ub2RlKCkpfSkpfSxlLnByb3RvdHlwZS5fbWVhc3VyZVRpY2tMYWJlbHM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLGk9dGhpcy5fc2NhbGUuY2xvbmVXaXRob3V0UHJvdmlkZXJzKCkucmFuZ2UoWzAsdGhpcy5pc0hvcml6b250YWwoKT90OmVdKSxyPXRoaXMuZ2V0RG93bnNhbXBsZUluZm8oaSksbz1yLmRvbWFpbixhPXIuc3RlcFdpZHRoLHM9dC10aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpO3RoaXMuaXNIb3Jpem9udGFsKCkmJihzPWEsMCE9PXRoaXMuX3RpY2tMYWJlbEFuZ2xlJiYocz1lLXRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCkpLHM9TWF0aC5tYXgocywwKSk7dmFyIGw9YTt0aGlzLmlzSG9yaXpvbnRhbCgpJiYobD1lLXRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCksMCE9PXRoaXMuX3RpY2tMYWJlbEFuZ2xlJiYobD10LXRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCkpLGw9TWF0aC5tYXgobCwwKSksbnVsbCE9dGhpcy5fdGlja0xhYmVsTWF4V2lkdGgmJihzPU1hdGgubWluKHMsdGhpcy5fdGlja0xhYmVsTWF4V2lkdGgpKTt2YXIgYyx1PW8ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gbi5fd3JhcHBlci53cmFwKG4uZm9ybWF0dGVyKCkodCksbi5fbWVhc3VyZXIscyxsKX0pKSxoPXRoaXMuaXNIb3Jpem9udGFsKCkmJjA9PT10aGlzLl90aWNrTGFiZWxBbmdsZT96eXQuc3VtOkh5dC5NYXRoLm1heCxkPXRoaXMuaXNIb3Jpem9udGFsKCkmJjA9PT10aGlzLl90aWNrTGFiZWxBbmdsZT9IeXQuTWF0aC5tYXg6enl0LnN1bSxwPWgodSwoZnVuY3Rpb24odCl7cmV0dXJuIG4uX21lYXN1cmVyLm1lYXN1cmUodC53cmFwcGVkVGV4dCkud2lkdGh9KSwwKSxmPWQodSwoZnVuY3Rpb24odCl7cmV0dXJuIG4uX21lYXN1cmVyLm1lYXN1cmUodC53cmFwcGVkVGV4dCkuaGVpZ2h0fSksMCk7cmV0dXJuIDAhPT10aGlzLl90aWNrTGFiZWxBbmdsZSYmKHA9KGM9W2YscF0pWzBdLGY9Y1sxXSkse3VzZWRXaWR0aDpwLHVzZWRIZWlnaHQ6Zn19LGUucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3ZhciBuPXRoaXMuX3NjYWxlLGk9dGhpcy5nZXREb3duc2FtcGxlSW5mbyhuKSxyPWkuZG9tYWluLG89aS5zdGVwV2lkdGgsYT1vO3RoaXMuaXNIb3Jpem9udGFsKCkmJm51bGwhPXRoaXMuX3RpY2tMYWJlbE1heFdpZHRoJiYoYT1NYXRoLm1pbihhLHRoaXMuX3RpY2tMYWJlbE1heFdpZHRoKSk7dmFyIHM9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrRnl0LkF4aXMuVElDS19MQUJFTF9DTEFTUykuZGF0YShyKSxsPXMuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKEZ5dC5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MsITApLm1lcmdlKHMpO3MuZXhpdCgpLnJlbW92ZSgpLGwuYXR0cigidHJhbnNmb3JtIiwoZnVuY3Rpb24odCxpKXt2YXIgcj1uLnNjYWxlKHQpLWEvMjtyZXR1cm4idHJhbnNsYXRlKCIrKGUuaXNIb3Jpem9udGFsKCk/cjowKSsiLCIrKGUuaXNIb3Jpem9udGFsKCk/MDpyKSsiKSJ9KSksbC50ZXh0KCIiKSx0aGlzLl9kcmF3VGlja3MobyxsKTt2YXIgYz0icmlnaHQiPT09dGhpcy5vcmllbnRhdGlvbigpP3RoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCk6MCx1PSJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpP3RoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCk6MDtyZXR1cm4gdGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2MrIiwiK3UrIikiKSx0aGlzLl9zaG93QWxsVGlja01hcmtzKCksdGhpcy5fc2hvd0FsbFRpY2tMYWJlbHMoKSx0aGlzLl9oaWRlVGlja01hcmtzV2l0aG91dExhYmVsKCksdGhpc30sZS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihlLG4saSl7cmV0dXJuIHQucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLGUsbixpKSx0aGlzLmlzSG9yaXpvbnRhbCgpfHx0aGlzLl9zY2FsZS5yYW5nZShbMCx0aGlzLmhlaWdodCgpXSksdGhpc30sZS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyksdGhpcy5fbWVhc3VyZXIucmVzZXQoKX0sZS5fTUlOSU1VTV9XSURUSF9QRVJfTEFCRUxfUFg9MTUsZX0pKEZ5dC5BeGlzKTtObXQuQ2F0ZWdvcnk9Vnl0O3ZhciBVeXQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KFV5dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGp5dD11TyxHeXQ9RWR0LFd5dD1JbXQscXl0PWd5dCxZeXQ9Rmd0LFh5dD1teXQsJHl0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7dmFyIGk9dC5jYWxsKHRoaXMsZSxuKXx8dGhpcztyZXR1cm4gaS5fdGlja0xhYmVsUG9zaXRpb25pbmc9ImNlbnRlciIsaS5fdXNlc1RleHRXaWR0aEFwcHJveGltYXRpb249ITEsaS5mb3JtYXR0ZXIocXl0LmdlbmVyYWwoKSksaX1yZXR1cm4ganl0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3QucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3ZhciBlPW5ldyBXeXQuU3ZnQ29udGV4dCh0aGlzLl90aWNrTGFiZWxDb250YWluZXIubm9kZSgpLFh5dC5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpO3RoaXMuX21lYXN1cmVyPW5ldyBXeXQuQ2FjaGVNZWFzdXJlcihlKSx0aGlzLl93cmFwcGVyPShuZXcgV3l0LldyYXBwZXIpLm1heExpbmVzKDEpfSxlLnByb3RvdHlwZS5fY29tcHV0ZVdpZHRoPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fdXNlc1RleHRXaWR0aEFwcHJveGltYXRpb24/dGhpcy5fY29tcHV0ZUFwcHJveGltYXRlVGV4dFdpZHRoKCk6dGhpcy5fY29tcHV0ZUV4YWN0VGV4dFdpZHRoKCk7cmV0dXJuImNlbnRlciI9PT10aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZz90aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSt0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSt0Ok1hdGgubWF4KHRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpLHRoaXMudGlja0xhYmVsUGFkZGluZygpK3QpfSxlLnByb3RvdHlwZS5fY29tcHV0ZUV4YWN0VGV4dFdpZHRoPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuX2dldFRpY2tWYWx1ZXMoKS5tYXAoKGZ1bmN0aW9uKGUpe3ZhciBuPXQuZm9ybWF0dGVyKCkoZSk7cmV0dXJuIHQuX21lYXN1cmVyLm1lYXN1cmUobikud2lkdGh9KSk7cmV0dXJuIFl5dC5NYXRoLm1heChlLDApfSxlLnByb3RvdHlwZS5fY29tcHV0ZUFwcHJveGltYXRlVGV4dFdpZHRoPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuX2dldFRpY2tWYWx1ZXMoKSxuPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoIk0iKS53aWR0aCxpPWUubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gdC5mb3JtYXR0ZXIoKShlKS5sZW5ndGgqbn0pKTtyZXR1cm4gWXl0Lk1hdGgubWF4KGksMCl9LGUucHJvdG90eXBlLl9jb21wdXRlSGVpZ2h0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodDtyZXR1cm4iY2VudGVyIj09PXRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nP3RoaXMuX21heExhYmVsVGlja0xlbmd0aCgpK3RoaXMudGlja0xhYmVsUGFkZGluZygpK3Q6TWF0aC5tYXgodGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCksdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkrdCl9LGUucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc2NhbGUsZT10LmRvbWFpbigpLG49ZVswXTw9ZVsxXT9lWzBdOmVbMV0saT1lWzBdPj1lWzFdP2VbMF06ZVsxXTtyZXR1cm4gdC50aWNrcygpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQ+PW4mJnQ8PWl9KSl9LGUucHJvdG90eXBlLl9yZXNjYWxlPWZ1bmN0aW9uKCl7aWYodGhpcy5faXNTZXR1cCl7aWYoIXRoaXMuaXNIb3Jpem9udGFsKCkpe3ZhciB0PXRoaXMuX2NvbXB1dGVXaWR0aCgpO2lmKHQ+dGhpcy53aWR0aCgpfHx0PHRoaXMud2lkdGgoKS10aGlzLm1hcmdpbigpKXJldHVybiB2b2lkIHRoaXMucmVkcmF3KCl9dGhpcy5yZW5kZXIoKX19LGUucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3ZhciBuPXt4OjAseTowLGR4OiIwZW0iLGR5OiIwLjNlbSJ9LGk9dGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkscj10aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSxvPSJtaWRkbGUiLGE9MCxzPTAsbD0wLGM9MDtpZih0aGlzLmlzSG9yaXpvbnRhbCgpKXN3aXRjaCh0aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZyl7Y2FzZSJsZWZ0IjpvPSJlbmQiLGE9LXIsYz1yO2JyZWFrO2Nhc2UiY2VudGVyIjpjPWkrcjticmVhaztjYXNlInJpZ2h0IjpvPSJzdGFydCIsYT1yLGM9cn1lbHNlIHN3aXRjaCh0aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZyl7Y2FzZSJ0b3AiOm4uZHk9Ii0wLjNlbSIsbD1yLHM9LXI7YnJlYWs7Y2FzZSJjZW50ZXIiOmw9aStyO2JyZWFrO2Nhc2UiYm90dG9tIjpuLmR5PSIxZW0iLGw9cixzPXJ9dmFyIHU9dGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCk7c3dpdGNoKHRoaXMub3JpZW50YXRpb24oKSl7Y2FzZSJib3R0b20iOm4ueD11LngxLG4uZHk9IjAuOTVlbSIscz11LnkxK2M7YnJlYWs7Y2FzZSJ0b3AiOm4ueD11LngxLG4uZHk9Ii0uMjVlbSIscz11LnkxLWM7YnJlYWs7Y2FzZSJsZWZ0IjpvPSJlbmQiLGE9dS54MS1sLG4ueT11LnkxO2JyZWFrO2Nhc2UicmlnaHQiOm89InN0YXJ0IixhPXUueDErbCxuLnk9dS55MX12YXIgaD10aGlzLl9nZXRUaWNrVmFsdWVzKCksZD10aGlzLl90aWNrTGFiZWxDb250YWluZXIuc2VsZWN0QWxsKCIuIitYeXQuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5kYXRhKGgpO3JldHVybiBkLmV4aXQoKS5yZW1vdmUoKSxkLmVudGVyKCkuYXBwZW5kKCJ0ZXh0IikuY2xhc3NlZChYeXQuQXhpcy5USUNLX0xBQkVMX0NMQVNTLCEwKS5tZXJnZShkKS5zdHlsZSgidGV4dC1hbmNob3IiLG8pLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaW5oZXJpdCIpLmF0dHJzKG4pLnRleHQoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmZvcm1hdHRlcigpKHQpfSkpLHRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIithKyIsICIrcysiKSIpLHRoaXMuX3Nob3dBbGxUaWNrTWFya3MoKSx0aGlzLnNob3dFbmRUaWNrTGFiZWxzKCl8fHRoaXMuX2hpZGVFbmRUaWNrTGFiZWxzKCksdGhpcy5faGlkZU92ZXJmbG93aW5nVGlja0xhYmVscygpLHRoaXMuX2hpZGVPdmVybGFwcGluZ1RpY2tMYWJlbHMoKSwiY2VudGVyIiE9PXRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nJiZ0aGlzLl9oaWRlVGlja01hcmtzV2l0aG91dExhYmVsKCksdGhpc30sZS5wcm90b3R5cGUudGlja0xhYmVsUG9zaXRpb249ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc7dmFyIGU9dC50b0xvd2VyQ2FzZSgpO2lmKHRoaXMuaXNIb3Jpem9udGFsKCkpe2lmKCJsZWZ0IiE9PWUmJiJjZW50ZXIiIT09ZSYmInJpZ2h0IiE9PWUpdGhyb3cgbmV3IEVycm9yKGUrIiBpcyBub3QgYSB2YWxpZCB0aWNrIGxhYmVsIHBvc2l0aW9uIGZvciBhIGhvcml6b250YWwgTnVtZXJpY0F4aXMiKX1lbHNlIGlmKCJ0b3AiIT09ZSYmImNlbnRlciIhPT1lJiYiYm90dG9tIiE9PWUpdGhyb3cgbmV3IEVycm9yKGUrIiBpcyBub3QgYSB2YWxpZCB0aWNrIGxhYmVsIHBvc2l0aW9uIGZvciBhIHZlcnRpY2FsIE51bWVyaWNBeGlzIik7cmV0dXJuIHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nPWUsdGhpcy5yZWRyYXcoKSx0aGlzfSxlLnByb3RvdHlwZS51c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl91c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbjoodGhpcy5fdXNlc1RleHRXaWR0aEFwcHJveGltYXRpb249dCx0aGlzKX0sZS5wcm90b3R5cGUuX2hpZGVFbmRUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbGVtZW50KCkubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrWHl0LkF4aXMuVElDS19MQUJFTF9DTEFTUyk7aWYoMCE9PWUuc2l6ZSgpKXt2YXIgbj1lLm5vZGVzKClbMF07WXl0LkRPTS5jbGllbnRSZWN0SW5zaWRlKG4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdCl8fEd5dC5zZWxlY3Qobikuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKTt2YXIgaT1lLm5vZGVzKClbZS5zaXplKCktMV07WXl0LkRPTS5jbGllbnRSZWN0SW5zaWRlKGkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdCl8fEd5dC5zZWxlY3QoaSkuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX19LGUucHJvdG90eXBlLl9oaWRlT3ZlcmxhcHBpbmdUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5zZWxlY3RBbGwoIi4iK1h5dC5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmZpbHRlcigoZnVuY3Rpb24odCxlKXt2YXIgbj1HeXQuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5Iik7cmV0dXJuImluaGVyaXQiPT09bnx8InZpc2libGUiPT09bn0pKSxlPXQubm9kZXMoKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfSkpLG49MTshdGhpcy5faGFzT3ZlcmxhcFdpdGhJbnRlcnZhbChuLGUpJiZuPGUubGVuZ3RoOyluKz0xO3QuZWFjaCgoZnVuY3Rpb24odCxlKXt2YXIgaT1HeXQuc2VsZWN0KHRoaXMpO2UlbiE9MCYmaS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpfSkpfSxlLnByb3RvdHlwZS5faGFzT3ZlcmxhcFdpdGhJbnRlcnZhbD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0iY2VudGVyIj09PXRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nP3RoaXMudGlja0xhYmVsUGFkZGluZygpOjMqdGhpcy50aWNrTGFiZWxQYWRkaW5nKCksaT1lLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIFl5dC5ET00uZXhwYW5kUmVjdCh0LG4pfSkpLHI9MDtyPGkubGVuZ3RoLXQ7cis9dClpZihZeXQuRE9NLmNsaWVudFJlY3RzT3ZlcmxhcChpW3JdLGlbcit0XSkpcmV0dXJuITE7cmV0dXJuITB9LGUucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe3QucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpLHRoaXMuX21lYXN1cmVyLnJlc2V0KCl9LGV9KShYeXQuQXhpcyk7VXl0Lk51bWVyaWM9JHl0O3ZhciBLeXQ9e30sWnl0PXt9LEp5dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KEp5dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFF5dD1GZ3Q7Snl0LmludGVydmFsVGlja0dlbmVyYXRvcj1mdW5jdGlvbiB0dnQodCl7aWYodDw9MCl0aHJvdyBuZXcgRXJyb3IoImludGVydmFsIG11c3QgYmUgcG9zaXRpdmUgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPWUuZG9tYWluKCksaT1NYXRoLm1pbihuWzBdLG5bMV0pLHI9TWF0aC5tYXgoblswXSxuWzFdKSxvPU1hdGguY2VpbChpL3QpKnQsYT1NYXRoLmZsb29yKChyLW8pL3QpKzEscz1pJXQ9PTA/W106W2ldLGw9UXl0Lk1hdGgucmFuZ2UoMCxhKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBvK2UqdH0pKSxjPXIldD09MD9bXTpbcl07cmV0dXJuIHMuY29uY2F0KGwpLmNvbmNhdChjKX19LEp5dC5pbnRlZ2VyVGlja0dlbmVyYXRvcj1mdW5jdGlvbiBldnQoKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dC5kZWZhdWx0VGlja3MoKTtyZXR1cm4gZS5maWx0ZXIoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIHQlMT09MHx8MD09PW58fG49PT1lLmxlbmd0aC0xfSkpfX07dmFyIG52dD17fSxpdnQ9e307ZnVuY3Rpb24gcnZ0KHQsZSxuKXtyZXR1cm4gbi0obi10KSplfWZ1bmN0aW9uIG92dCh0LGUsbil7cmV0dXJuKHQqZS1uKS8oZS0xKX1mdW5jdGlvbiBhdnQodCxlLG4saSl7dmFyIHI9ZT4xLG89cj9pOm47aWYobnVsbD09bylyZXR1cm4gZTt2YXIgYT10LmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCkscz1NYXRoLmFicyhhWzFdLWFbMF0pO3JldHVybihyP01hdGgubWluOk1hdGgubWF4KShlLG8vcyl9ZnVuY3Rpb24gc3Z0KHQsZSxuLGkscil7aWYoZTw9MSlyZXR1cm57Y2VudGVyUG9pbnQ6bix6b29tQW1vdW50OmV9O2lmKG51bGw9PWkmJm51bGw9PXIpcmV0dXJue2NlbnRlclBvaW50Om4sem9vbUFtb3VudDplfTt2YXIgbz1sdnQodCksYT0oZnVuY3Rpb24gcyh0KXt2YXIgZT10LmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCk7cmV0dXJuIGVbMV08ZVswXX0pKHQpO2k9bnVsbD09aT9hPzEvMDotMS8wOmkscj1udWxsPT1yP2E/LTEvMDoxLzA6cjt2YXIgbD10LmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCksYz1sWzBdLHU9bFsxXSxoPXQuc2NhbGVUcmFuc2Zvcm1hdGlvbihyKSxkPXQuc2NhbGVUcmFuc2Zvcm1hdGlvbih1KSxwPXJ2dChkLGUsbiksZj10LnNjYWxlVHJhbnNmb3JtYXRpb24oaSksbT10LnNjYWxlVHJhbnNmb3JtYXRpb24oYyksZz1ydnQobSxlLG4pLF89TWF0aC5hYnMoaC1mKTtpZihNYXRoLmFicyhwLWcpPl8pe3ZhciB5PShoLWYpLyhkLW0pO3JldHVybiAxIT09eT97Y2VudGVyUG9pbnQ6b3Z0KGQseSxoKSx6b29tQW1vdW50Onl9OntjZW50ZXJQb2ludDpuLHpvb21BbW91bnQ6eX19cmV0dXJuIHA+aCE9bz97Y2VudGVyUG9pbnQ6b3Z0KGQsZSxoKSx6b29tQW1vdW50OmV9Omc8ZiE9bz97Y2VudGVyUG9pbnQ6b3Z0KG0sZSxmKSx6b29tQW1vdW50OmV9OntjZW50ZXJQb2ludDpuLHpvb21BbW91bnQ6ZX19ZnVuY3Rpb24gbHZ0KHQpe3ZhciBlPXQucmFuZ2UoKTtyZXR1cm4gZVsxXTxlWzBdfQovKioKICAgICAqIENvcHlyaWdodCAyMDE3LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoaXZ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxpdnQuem9vbU91dD1ydnQsaXZ0LmNvbnN0cmFpbmVkWm9vbT1mdW5jdGlvbiBjdnQodCxlLG4saSxyLG8sYSl7cmV0dXJuIHN2dCh0LGU9YXZ0KHQsZSxpLHIpLG4sbyxhKX0saXZ0LmNvbnN0cmFpblpvb21FeHRlbnRzPWF2dCxpdnQuY29uc3RyYWluWm9vbVZhbHVlcz1zdnQsaXZ0LmNvbnN0cmFpbmVkVHJhbnNsYXRpb249ZnVuY3Rpb24gdXZ0KHQsZSxuLGkpe3ZhciByLG89dC5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpLGE9b1swXSxzPW9bMV0sbD1sdnQodCk7aWYoZT4wIT09bCl7aWYobnVsbCE9KHI9aSkpe3ZhciBjPXQuc2NhbGVUcmFuc2Zvcm1hdGlvbihzKSx1PXQuc2NhbGVUcmFuc2Zvcm1hdGlvbihyKTtlPShsP01hdGgubWF4Ok1hdGgubWluKShjK2UsdSktY319ZWxzZSBpZihudWxsIT0ocj1uKSl7dmFyIGg9dC5zY2FsZVRyYW5zZm9ybWF0aW9uKGEpLGQ9dC5zY2FsZVRyYW5zZm9ybWF0aW9uKHIpO2U9KGw/TWF0aC5taW46TWF0aC5tYXgpKGgrZSxkKS1ofXJldHVybiBlfTt2YXIgaHZ0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShodnQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBkdnQ9Rmd0LHB2dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fYXV0b0RvbWFpbkF1dG9tYXRpY2FsbHk9ITAsdGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzcz0hMSx0aGlzLl91cGRhdGVJZD0wLHRoaXMuX2NhbGxiYWNrcz1uZXcgZHZ0LkNhbGxiYWNrU2V0LHRoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXJzPW5ldyBkdnQuU2V0fXJldHVybiB0LnByb3RvdHlwZS5leHRlbnRPZlZhbHVlcz1mdW5jdGlvbih0KXtyZXR1cm5bXX0sdC5wcm90b3R5cGUuX2dldEFsbEluY2x1ZGVkVmFsdWVzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dm9pZCAwPT09dCYmKHQ9ITEpO3ZhciBuPVtdO3JldHVybiB0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVycy5mb3JFYWNoKChmdW5jdGlvbihpKXt2YXIgcj1pKGUsdCk7bj1uLmNvbmNhdChyKX0pKSxufSx0LnByb3RvdHlwZS5fZ2V0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuW119LHQucHJvdG90eXBlLm9uVXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jYWxsYmFja3MuYWRkKHQpLHRoaXN9LHQucHJvdG90eXBlLm9mZlVwZGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSx0LnByb3RvdHlwZS5fZGlzcGF0Y2hVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVJZCsrLHRoaXMuX2NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMpfSx0LnByb3RvdHlwZS5hdXRvRG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2F1dG9Eb21haW5BdXRvbWF0aWNhbGx5PSEwLHRoaXMuX3NldERvbWFpbih0aGlzLl9nZXRFeHRlbnQoKSksdGhpc30sdC5wcm90b3R5cGUuYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZT1mdW5jdGlvbigpe3RoaXMuX2F1dG9Eb21haW5BdXRvbWF0aWNhbGx5JiZ0aGlzLmF1dG9Eb21haW4oKX0sdC5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBzY2FsZSIpfSx0LnByb3RvdHlwZS50aWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbWFpbigpfSx0LnByb3RvdHlwZS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZ2V0RG9tYWluKCk6KHRoaXMuX2F1dG9Eb21haW5BdXRvbWF0aWNhbGx5PSExLHRoaXMuX3NldERvbWFpbih0KSx0aGlzKX0sdC5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2dldERvbWFpbiIpfSx0LnByb3RvdHlwZS5fc2V0RG9tYWluPWZ1bmN0aW9uKHQpe3RoaXMuX2RvbWFpbk1vZGlmaWNhdGlvbkluUHJvZ3Jlc3N8fCh0aGlzLl9kb21haW5Nb2RpZmljYXRpb25JblByb2dyZXNzPSEwLHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbih0KSx0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpLHRoaXMuX2RvbWFpbk1vZGlmaWNhdGlvbkluUHJvZ3Jlc3M9ITEpfSx0LnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2JhY2tpbmdEb21haW4iKX0sdC5wcm90b3R5cGUucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZ2V0UmFuZ2UoKToodGhpcy5fc2V0UmFuZ2UodCksdGhpcyl9LHQucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2dldFJhbmdlIil9LHQucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIF9zZXRSYW5nZSIpfSx0LnByb3RvdHlwZS5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVycy5hZGQodCksdGhpcy5hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCksdGhpc30sdC5wcm90b3R5cGUucmVtb3ZlSW5jbHVkZWRWYWx1ZXNQcm92aWRlcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcnMuZGVsZXRlKHQpLHRoaXMuYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpLHRoaXN9LHQucHJvdG90eXBlLnVwZGF0ZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VwZGF0ZUlkfSx0fSkoKTtodnQuU2NhbGU9cHZ0LAovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkobnZ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZnZ0PXVPLG12dD1FZHQsZ3Z0PWl2dCxfdnQ9Rmd0LHl2dD1bMCwxXSx2dnQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4uX3JhbmdlPVswLDFdLG4uX2QzU2NhbGU9bXZ0LnNjYWxlQmFuZCgpLG4uX2QzU2NhbGUucmFuZ2UoeXZ0KSxuLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGU9bXZ0LnNjYWxlTGluZWFyKCksbi5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih5dnQpLG4uX2lubmVyUGFkZGluZz1lLl9jb252ZXJ0VG9QbG90dGFibGVJbm5lclBhZGRpbmcoLjMpLG4uX291dGVyUGFkZGluZz1lLl9jb252ZXJ0VG9QbG90dGFibGVPdXRlclBhZGRpbmcoLjUsLjMpLG59cmV0dXJuIGZ2dC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5jbG9uZVdpdGhvdXRQcm92aWRlcnM9ZnVuY3Rpb24oKXt2YXIgdD0obmV3IGUpLmRvbWFpbih0aGlzLmRvbWFpbigpKS5yYW5nZSh0aGlzLnJhbmdlKCkpLmlubmVyUGFkZGluZyh0aGlzLmlubmVyUGFkZGluZygpKS5vdXRlclBhZGRpbmcodGhpcy5vdXRlclBhZGRpbmcoKSk7cmV0dXJuIHQuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4odGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbigpKSx0fSxlLnByb3RvdHlwZS5leHRlbnRPZlZhbHVlcz1mdW5jdGlvbih0KXtyZXR1cm4gX3Z0LkFycmF5LnVuaXEodCl9LGUucHJvdG90eXBlLl9nZXRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gX3Z0LkFycmF5LnVuaXEodGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKSl9LGUucHJvdG90eXBlLmRvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gdC5wcm90b3R5cGUuZG9tYWluLmNhbGwodGhpcyxlKX0sZS5wcm90b3R5cGUuaW52ZXJ0UmFuZ2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt2b2lkIDA9PT10JiYodD10aGlzLnJhbmdlKCkpO3ZhciBuPXRoaXMuX2QzU2NhbGUuYmFuZHdpZHRoKCksaT10aGlzLmludmVydGVkVHJhbnNmb3JtYXRpb24odFswXSkscj10aGlzLmludmVydGVkVHJhbnNmb3JtYXRpb24odFsxXSksbz10aGlzLl9kM1NjYWxlLmRvbWFpbigpLGE9by5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9kM1NjYWxlKHQpK24vMn0pKSxzPW12dC5iaXNlY3QoYSxpKSxsPW12dC5iaXNlY3QoYSxyKTtyZXR1cm4gby5zbGljZShzLGwpfSxlLnByb3RvdHlwZS5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gdC5wcm90b3R5cGUucmFuZ2UuY2FsbCh0aGlzLGUpfSxlLl9jb252ZXJ0VG9QbG90dGFibGVJbm5lclBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIDEvKDEtdCktMX0sZS5fY29udmVydFRvUGxvdHRhYmxlT3V0ZXJQYWRkaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQvKDEtZSl9LGUucHJvdG90eXBlLl9zZXRCYW5kcz1mdW5jdGlvbigpe3ZhciB0PTEtMS8oMSt0aGlzLmlubmVyUGFkZGluZygpKSxlPXRoaXMub3V0ZXJQYWRkaW5nKCkvKDErdGhpcy5pbm5lclBhZGRpbmcoKSk7dGhpcy5fZDNTY2FsZS5wYWRkaW5nSW5uZXIodCksdGhpcy5fZDNTY2FsZS5wYWRkaW5nT3V0ZXIoZSl9LGUucHJvdG90eXBlLnJhbmdlQmFuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXNjYWxlQmFuZCh0aGlzLl9kM1NjYWxlLmJhbmR3aWR0aCgpKX0sZS5wcm90b3R5cGUuc3RlcFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc2NhbGVCYW5kKHRoaXMuX2QzU2NhbGUuYmFuZHdpZHRoKCkqKDErdGhpcy5pbm5lclBhZGRpbmcoKSkpfSxlLnByb3RvdHlwZS50aWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbWFpbigpfSxlLnByb3RvdHlwZS5pbm5lclBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5faW5uZXJQYWRkaW5nOih0aGlzLl9pbm5lclBhZGRpbmc9dCx0aGlzLnJhbmdlKHRoaXMucmFuZ2UoKSksdGhpcy5fZGlzcGF0Y2hVcGRhdGUoKSx0aGlzKX0sZS5wcm90b3R5cGUub3V0ZXJQYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX291dGVyUGFkZGluZzoodGhpcy5fb3V0ZXJQYWRkaW5nPXQsdGhpcy5yYW5nZSh0aGlzLnJhbmdlKCkpLHRoaXMuX2Rpc3BhdGNoVXBkYXRlKCksdGhpcyl9LGUucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2QzU2NhbGUodCkrdGhpcy5fZDNTY2FsZS5iYW5kd2lkdGgoKS8yO3JldHVybiB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUoZSl9LGUucHJvdG90eXBlLnpvb209ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3RoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4odGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLnJhbmdlKCkubWFwKChmdW5jdGlvbihpKXtyZXR1cm4gbi5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmludmVydChndnQuem9vbU91dChpLHQsZSkpfSkpKSx0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfSxlLnByb3RvdHlwZS5wYW49ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5yYW5nZSgpLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIGUuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5pbnZlcnQobit0KX0pKSksdGhpcy5fZGlzcGF0Y2hVcGRhdGUoKX0sZS5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlKHQpfSxlLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuaW52ZXJ0KHQpfSxlLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD1mdW5jdGlvbigpe3JldHVybiB5dnR9LGUucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4oKX0sZS5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24odCl7dGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih0KSx0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfSxlLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfSxlLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2QzU2NhbGUuZG9tYWluKCk6KHRoaXMuX2QzU2NhbGUuZG9tYWluKHQpLHRoaXMuX3NldEJhbmRzKCksdGhpcyl9LGUucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYW5nZX0sZS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHQpe3RoaXMuX3JhbmdlPXQsdGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLnJhbmdlKHQpLHRoaXMuX3NldEJhbmRzKCl9LGUucHJvdG90eXBlLl9yZXNjYWxlQmFuZD1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5hYnModGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlKHQpLXRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZSgwKSl9LGV9KShodnQuU2NhbGUpO252dC5DYXRlZ29yeT12dnQ7dmFyIGJ2dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoYnZ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgeHZ0PXVPLHd2dD1FZHQsU3Z0PUZndCxNdnQ9aHZ0LEV2dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5jb3VudD0wLHRoaXMudHJhY2tlcj17fX1yZXR1cm4gdC5wcm90b3R5cGUuZ2V0SW5kZXg9ZnVuY3Rpb24odCl7aWYobnVsbCE9dGhpcy50cmFja2VyW3RdKXJldHVybiB0aGlzLnRyYWNrZXJbdF07dmFyIGU9dGhpcy5jb3VudDtyZXR1cm4gdGhpcy50cmFja2VyW3RdPWUsdGhpcy5jb3VudCs9MSxlfSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuY291bnQ9MCx0aGlzLnRyYWNrZXI9e319LHR9KSgpLFR2dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXt2YXIgaSxyPXQuY2FsbCh0aGlzKXx8dGhpcztzd2l0Y2goci5fcmFuZ2VMZW5ndGg9MSxyLl90cmFja2VyPW5ldyBFdnQsbil7Y2FzZSBudWxsOmNhc2Ugdm9pZCAwOm51bGw9PWUuX3Bsb3R0YWJsZUNvbG9yQ2FjaGUmJihlLl9wbG90dGFibGVDb2xvckNhY2hlPWUuX2dldFBsb3R0YWJsZUNvbG9ycygpKSxpPXd2dC5zY2FsZU9yZGluYWwoKS5yYW5nZShlLl9wbG90dGFibGVDb2xvckNhY2hlKTticmVhaztjYXNlIkNhdGVnb3J5MTAiOmNhc2UiY2F0ZWdvcnkxMCI6Y2FzZSIxMCI6aT13dnQuc2NhbGVPcmRpbmFsKHd2dC5zY2hlbWVDYXRlZ29yeTEwKTticmVhaztjYXNlIkNhdGVnb3J5MjAiOmNhc2UiY2F0ZWdvcnkyMCI6Y2FzZSIyMCI6aT13dnQuc2NhbGVPcmRpbmFsKHd2dC5zY2hlbWVDYXRlZ29yeTIwKTticmVhaztjYXNlIkNhdGVnb3J5MjBiIjpjYXNlImNhdGVnb3J5MjBiIjpjYXNlIjIwYiI6aT13dnQuc2NhbGVPcmRpbmFsKHd2dC5zY2hlbWVDYXRlZ29yeTIwYik7YnJlYWs7Y2FzZSJDYXRlZ29yeTIwYyI6Y2FzZSJjYXRlZ29yeTIwYyI6Y2FzZSIyMGMiOmk9d3Z0LnNjYWxlT3JkaW5hbCh3dnQuc2NoZW1lQ2F0ZWdvcnkyMGMpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCBDb2xvclNjYWxlIHR5cGUiKX1yZXR1cm4gci5fZDNTY2FsZT1pLHIuX3JhbmdlTGVuZ3RoPXIuX2QzU2NhbGUucmFuZ2UoKS5sZW5ndGgscn1yZXR1cm4geHZ0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybiBTdnQuQXJyYXkudW5pcSh0KX0sZS5wcm90b3R5cGUuX2dldEV4dGVudD1mdW5jdGlvbigpe3JldHVybiBTdnQuQXJyYXkudW5pcSh0aGlzLl9nZXRBbGxJbmNsdWRlZFZhbHVlcygpKX0sZS5pbnZhbGlkYXRlQ29sb3JDYWNoZT1mdW5jdGlvbigpe2UuX3Bsb3R0YWJsZUNvbG9yQ2FjaGU9bnVsbH0sZS5fZ2V0UGxvdHRhYmxlQ29sb3JzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9d3Z0LnNlbGVjdCgiYm9keSIpLmFwcGVuZCgicGxvdHRhYmxlLWNvbG9yLXRlc3RlciIpLG49U3Z0LkNvbG9yLmNvbG9yVGVzdChlLCIiKSxpPTAscj1TdnQuQ29sb3IuY29sb3JUZXN0KGUsInBsb3R0YWJsZS1jb2xvcnMtMCIpO251bGwhPXImJmk8dGhpcy5fTUFYSU1VTV9DT0xPUlNfRlJPTV9DU1MmJihyIT09bnx8ciE9PXRbdC5sZW5ndGgtMV0pOyl0LnB1c2gociksaSsrLHI9U3Z0LkNvbG9yLmNvbG9yVGVzdChlLCJwbG90dGFibGUtY29sb3JzLSIraSk7cmV0dXJuIGUucmVtb3ZlKCksdH0sZS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fZDNTY2FsZSh0KSxpPXRoaXMuX3RyYWNrZXIuZ2V0SW5kZXgodCkscj1NYXRoLmZsb29yKGkvdGhpcy5fcmFuZ2VMZW5ndGgpO2lmKDA9PT1yKXJldHVybiBuO3ZhciBvPU1hdGgubG9nKHIqZS5fTE9PUF9MSUdIVEVOX0ZBQ1RPUisxKTtyZXR1cm4gU3Z0LkNvbG9yLmxpZ2h0ZW5Db2xvcihuLG8pfSxlLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfSxlLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2QzU2NhbGUuZG9tYWluKCk6KHRoaXMuX2QzU2NhbGUuZG9tYWluKHQpLHRoaXMuX3RyYWNrZXIuY2xlYXIoKSx0aGlzKX0sZS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUucmFuZ2UoKX0sZS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHQpe3RoaXMuX2QzU2NhbGUucmFuZ2UodCksdGhpcy5fcmFuZ2VMZW5ndGg9dC5sZW5ndGh9LGUuX0xPT1BfTElHSFRFTl9GQUNUT1I9MS42LGUuX01BWElNVU1fQ09MT1JTX0ZST01fQ1NTPTI1NixlfSkoTXZ0LlNjYWxlKTtidnQuQ29sb3I9VHZ0O3ZhciBDdnQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KEN2dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIEF2dD11TyxrdnQ9RWR0LEx2dD1GZ3QsUHZ0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZvaWQgMD09PW4mJihuPSJsaW5lYXIiKTt2YXIgaT10LmNhbGwodGhpcyl8fHRoaXM7c3dpdGNoKG4pe2Nhc2UibGluZWFyIjppLl9jb2xvclNjYWxlPWt2dC5zY2FsZUxpbmVhcigpO2JyZWFrO2Nhc2UibG9nIjppLl9jb2xvclNjYWxlPWt2dC5zY2FsZUxvZygpO2JyZWFrO2Nhc2Uic3FydCI6aS5fY29sb3JTY2FsZT1rdnQuc2NhbGVTcXJ0KCk7YnJlYWs7Y2FzZSJwb3ciOmkuX2NvbG9yU2NhbGU9a3Z0LnNjYWxlUG93KCl9aWYobnVsbD09aS5fY29sb3JTY2FsZSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gUXVhbnRpdGF0aXZlU2NhbGUgc2NhbGUgdHlwZSAiK24pO3JldHVybiBpLnJhbmdlKGUuUkVEUyksaX1yZXR1cm4gQXZ0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKHQpe3ZhciBlPWt2dC5leHRlbnQodCk7cmV0dXJuIG51bGw9PWVbMF18fG51bGw9PWVbMV0/W106ZX0sZS5wcm90b3R5cGUuX2QzSW50ZXJwb2xhdGVkU2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29sb3JTY2FsZS5yYW5nZShbMCwxXSkuaW50ZXJwb2xhdGUodGhpcy5faW50ZXJwb2xhdGVDb2xvcnMoKSl9LGUucHJvdG90eXBlLl9pbnRlcnBvbGF0ZUNvbG9ycz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NvbG9yUmFuZ2U7aWYodC5sZW5ndGg8Mil0aHJvdyBuZXcgRXJyb3IoIkNvbG9yIHNjYWxlIGFycmF5cyBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIGVsZW1lbnRzLiIpO3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj0oZT1NYXRoLm1heCgwLE1hdGgubWluKDEsZSkpKSoodC5sZW5ndGgtMSksaT1NYXRoLmZsb29yKG4pLHI9TWF0aC5jZWlsKG4pLG89bi1pO3JldHVybiBrdnQuaW50ZXJwb2xhdGVMYWIodFtpXSx0W3JdKShvKX19fSxlLnByb3RvdHlwZS5fcmVzZXRTY2FsZT1mdW5jdGlvbigpe3RoaXMuX2QzU2NhbGU9dGhpcy5fZDNJbnRlcnBvbGF0ZWRTY2FsZSgpLHRoaXMuYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpLHRoaXMuX2Rpc3BhdGNoVXBkYXRlKCl9LGUucHJvdG90eXBlLmF1dG9Eb21haW49ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9nZXRBbGxJbmNsdWRlZFZhbHVlcygpO3JldHVybiB0Lmxlbmd0aD4wJiZ0aGlzLl9zZXREb21haW4oW0x2dC5NYXRoLm1pbih0LDApLEx2dC5NYXRoLm1heCh0LDApXSksdGhpc30sZS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUodCl9LGUucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCl9LGUucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZDNTY2FsZS5kb21haW4oKToodGhpcy5fZDNTY2FsZS5kb21haW4odCksdGhpcyl9LGUucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb2xvclJhbmdlfSxlLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24odCl7dGhpcy5fY29sb3JSYW5nZT10LHRoaXMuX3Jlc2V0U2NhbGUoKX0sZS5SRURTPVsiI0ZGRkZGRiIsIiNGRkY2RTEiLCIjRkVGNEMwIiwiI0ZFRDk3NiIsIiNGRUIyNEMiLCIjRkQ4RDNDIiwiI0ZDNEUyQSIsIiNFMzFBMUMiLCIjQjEwMDI2Il0sZS5CTFVFUz1bIiNGRkZGRkYiLCIjQ0NGRkZGIiwiI0E1RkZGRCIsIiM4NUY3RkIiLCIjNkVEM0VGIiwiIzU1QTdFMCIsIiM0MTdGRDAiLCIjMjU0NUQzIiwiIzBCMDJFMSJdLGUuUE9TTkVHPVsiIzBCMDJFMSIsIiMyNTQ1RDMiLCIjNDE3RkQwIiwiIzU1QTdFMCIsIiM2RUQzRUYiLCIjODVGN0ZCIiwiI0E1RkZGRCIsIiNDQ0ZGRkYiLCIjRkZGRkZGIiwiI0ZGRjZFMSIsIiNGRUY0QzAiLCIjRkVEOTc2IiwiI0ZFQjI0QyIsIiNGRDhEM0MiLCIjRkM0RTJBIiwiI0UzMUExQyIsIiNCMTAwMjYiXSxlfSkoaHZ0LlNjYWxlKTtDdnQuSW50ZXJwb2xhdGVkQ29sb3I9UHZ0O3ZhciBOdnQ9e30sSXZ0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoSXZ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgUnZ0PXVPLE92dD1FZHQsenZ0PWl2dCxEdnQ9Rmd0LEJ2dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gZS5fdGlja0dlbmVyYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gdC5kZWZhdWx0VGlja3MoKX0sZS5fcGFkUHJvcG9ydGlvbj0uMDUsZS5fc25hcHBpbmdEb21haW5FbmFibGVkPSEwLGUuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzPW5ldyBEdnQuU2V0LGV9cmV0dXJuIFJ2dC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5hdXRvRG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RvbWFpbk1pbj1udWxsLHRoaXMuX2RvbWFpbk1heD1udWxsLHQucHJvdG90eXBlLmF1dG9Eb21haW4uY2FsbCh0aGlzKSx0aGlzfSxlLnByb3RvdHlwZS5hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlPWZ1bmN0aW9uKCl7aWYobnVsbD09dGhpcy5fZG9tYWluTWlufHxudWxsPT10aGlzLl9kb21haW5NYXgpe3ZhciBlPXRoaXMuX2dldEV4dGVudCgpO2lmKG51bGwhPXRoaXMuX2RvbWFpbk1pbil7dmFyIG49ZVsxXTtyZXR1cm4gdGhpcy5fZG9tYWluTWluPj1uJiYobj10aGlzLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbihbdGhpcy5fZG9tYWluTWluLHRoaXMuX2RvbWFpbk1pbl0pWzFdKSx2b2lkIHRoaXMuX3NldERvbWFpbihbdGhpcy5fZG9tYWluTWluLG5dKX1pZihudWxsIT10aGlzLl9kb21haW5NYXgpe3ZhciBpPWVbMF07cmV0dXJuIHRoaXMuX2RvbWFpbk1heDw9aSYmKGk9dGhpcy5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW4oW3RoaXMuX2RvbWFpbk1heCx0aGlzLl9kb21haW5NYXhdKVswXSksdm9pZCB0aGlzLl9zZXREb21haW4oW2ksdGhpcy5fZG9tYWluTWF4XSl9dC5wcm90b3R5cGUuYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZS5jYWxsKHRoaXMpfWVsc2UgdGhpcy5fc2V0RG9tYWluKFt0aGlzLl9kb21haW5NaW4sdGhpcy5fZG9tYWluTWF4XSl9LGUucHJvdG90eXBlLl9nZXRVbmJvdW5kZWRFeHRlbnQ9ZnVuY3Rpb24odCl7dm9pZCAwPT09dCYmKHQ9ITEpO3ZhciBlPXRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKHQpLG49dGhpcy5fZGVmYXVsdEV4dGVudCgpO2lmKDAhPT1lLmxlbmd0aCl7dmFyIGk9W0R2dC5NYXRoLm1pbihlLG5bMF0pLER2dC5NYXRoLm1heChlLG5bMV0pXTtuPXRoaXMuX3BhZERvbWFpbihpKX1yZXR1cm4gbn0sZS5wcm90b3R5cGUuX2dldEV4dGVudD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2dldFVuYm91bmRlZEV4dGVudCgpO3JldHVybiBudWxsIT10aGlzLl9kb21haW5NaW4mJih0WzBdPXRoaXMuX2RvbWFpbk1pbiksbnVsbCE9dGhpcy5fZG9tYWluTWF4JiYodFsxXT10aGlzLl9kb21haW5NYXgpLHR9LGUucHJvdG90eXBlLmFkZFBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzLmFkZCh0KSx0aGlzLmF1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKSx0aGlzfSxlLnByb3RvdHlwZS5yZW1vdmVQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVycy5kZWxldGUodCksdGhpcy5hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCksdGhpc30sZS5wcm90b3R5cGUucGFkUHJvcG9ydGlvbj1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9wYWRQcm9wb3J0aW9uO2lmKHQ8MCl0aHJvdyBuZXcgRXJyb3IoInBhZFByb3BvcnRpb24gbXVzdCBiZSBub24tbmVnYXRpdmUiKTtyZXR1cm4gdGhpcy5fcGFkUHJvcG9ydGlvbj10LHRoaXMuYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpLHRoaXN9LGUucHJvdG90eXBlLl9wYWREb21haW49ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZih0WzBdLnZhbHVlT2YoKT09PXRbMV0udmFsdWVPZigpKXJldHVybiB0aGlzLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbih0KTtpZigwPT09dGhpcy5fcGFkUHJvcG9ydGlvbilyZXR1cm4gdDt2YXIgbj10aGlzLl9wYWRQcm9wb3J0aW9uLzIsaT10WzBdLHI9dFsxXSxvPSExLGE9ITE7dGhpcy5fcGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcnMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dChlKS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnZhbHVlT2YoKT09PWkudmFsdWVPZigpJiYobz0hMCksdC52YWx1ZU9mKCk9PT1yLnZhbHVlT2YoKSYmKGE9ITApfSkpfSkpO3ZhciBzPXRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpO3RoaXMuX2JhY2tpbmdTY2FsZURvbWFpbih0KTt2YXIgbD1vP2k6dGhpcy5pbnZlcnQodGhpcy5zY2FsZShpKS0odGhpcy5zY2FsZShyKS10aGlzLnNjYWxlKGkpKSpuKSxjPWE/cjp0aGlzLmludmVydCh0aGlzLnNjYWxlKHIpKyh0aGlzLnNjYWxlKHIpLXRoaXMuc2NhbGUoaSkpKm4pO3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4ocyksdGhpcy5fc25hcHBpbmdEb21haW5FbmFibGVkP3RoaXMuX25pY2VEb21haW4oW2wsY10pOltsLGNdfSxlLnByb3RvdHlwZS5zbmFwcGluZ0RvbWFpbkVuYWJsZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fc25hcHBpbmdEb21haW5FbmFibGVkOih0aGlzLl9zbmFwcGluZ0RvbWFpbkVuYWJsZWQ9dCx0aGlzLmF1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKSx0aGlzKX0sZS5wcm90b3R5cGUuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiB0fSxlLnByb3RvdHlwZS5pbnZlcnQ9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpbnZlcnQiKX0sZS5wcm90b3R5cGUuZG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lJiYodGhpcy5fZG9tYWluTWluPWVbMF0sdGhpcy5fZG9tYWluTWF4PWVbMV0pLHQucHJvdG90eXBlLmRvbWFpbi5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLmRvbWFpbk1pbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLmRvbWFpbigpWzBdOih0aGlzLl9kb21haW5NaW49dCx0aGlzLmF1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKSx0aGlzKX0sZS5wcm90b3R5cGUuZG9tYWluTWF4PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuZG9tYWluKClbMV06KHRoaXMuX2RvbWFpbk1heD10LHRoaXMuYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpLHRoaXMpfSxlLnByb3RvdHlwZS5leHRlbnRPZlZhbHVlcz1mdW5jdGlvbih0KXt2YXIgZT1PdnQuZXh0ZW50KHQuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gRHZ0Lk1hdGguaXNWYWxpZE51bWJlcigrdCl9KSkpO3JldHVybiBudWxsPT1lWzBdfHxudWxsPT1lWzFdP1tdOmV9LGUucHJvdG90eXBlLnpvb209ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3RoaXMuZG9tYWluKHRoaXMucmFuZ2UoKS5tYXAoKGZ1bmN0aW9uKGkpe3JldHVybiBuLmludmVydCh6dnQuem9vbU91dChpLHQsZSkpfSkpKX0sZS5wcm90b3R5cGUucGFuPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5kb21haW4odGhpcy5yYW5nZSgpLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIGUuaW52ZXJ0KG4rdCl9KSkpfSxlLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgc2NhbGVUcmFuc2Zvcm1hdGlvbiIpfSxlLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbiIpfSxlLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQiKX0sZS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGdldFRyYW5zZm9ybWF0aW9uRG9tYWluIil9LGUucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgc2V0VHJhbnNmb3JtYXRpb25Eb21haW4iKX0sZS5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihlKXt2YXIgbj1mdW5jdGlvbih0KXtyZXR1cm4gRHZ0Lk1hdGguaXNOYU4odCl8fHQ9PT0xLzB8fHQ9PT0tMS8wfTtuKGVbMF0pfHxuKGVbMV0pP0R2dC5XaW5kb3cud2FybigiV2FybmluZzogUXVhbnRpdGF0aXZlU2NhbGVzIGNhbm5vdCB0YWtlIE5hTiBvciBJbmZpbml0eSBhcyBhIGRvbWFpbiB2YWx1ZS4gSWdub3JpbmcuIik6dC5wcm90b3R5cGUuX3NldERvbWFpbi5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLmRlZmF1bHRUaWNrcz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2dldERlZmF1bHRUaWNrcyIpfSxlLnByb3RvdHlwZS50aWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90aWNrR2VuZXJhdG9yKHRoaXMpfSxlLnByb3RvdHlwZS5fbmljZURvbWFpbj1mdW5jdGlvbih0LGUpe3Rocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX25pY2VEb21haW4iKX0sZS5wcm90b3R5cGUuX2RlZmF1bHRFeHRlbnQ9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIF9kZWZhdWx0RXh0ZW50Iil9LGUucHJvdG90eXBlLnRpY2tHZW5lcmF0b3I9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fdGlja0dlbmVyYXRvcjoodGhpcy5fdGlja0dlbmVyYXRvcj10LHRoaXMpfSxlLl9ERUZBVUxUX05VTV9USUNLUz0xMCxlfSkoaHZ0LlNjYWxlKTtJdnQuUXVhbnRpdGF0aXZlU2NhbGU9QnZ0LAovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoTnZ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgSHZ0PXVPLEZ2dD1FZHQsVnZ0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBlLl9kM1NjYWxlPUZ2dC5zY2FsZUxpbmVhcigpLGV9cmV0dXJuIEh2dC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3JldHVyblswLDFdfSxlLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIHRbMF09PT10WzFdP1t0WzBdLTEsdFsxXSsxXTp0fSxlLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZDNTY2FsZSh0KX0sZS5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zY2FsZSh0KX0sZS5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbnZlcnQodCl9LGUucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCl9LGUucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tYWluKCl9LGUucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKHQpe3RoaXMuZG9tYWluKHQpfSxlLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfSxlLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2QzU2NhbGUuZG9tYWluKCk6KHRoaXMuX2QzU2NhbGUuZG9tYWluKHQpLHRoaXMpfSxlLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5yYW5nZSgpfSxlLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24odCl7dGhpcy5fZDNTY2FsZS5yYW5nZSh0KX0sZS5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kM1NjYWxlLmludmVydCh0KX0sZS5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUudGlja3MoZS5fREVGQVVMVF9OVU1fVElDS1MpfSxlLnByb3RvdHlwZS5fbmljZURvbWFpbj1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9kM1NjYWxlLmNvcHkoKS5kb21haW4odCkubmljZShlKS5kb21haW4oKX0sZX0pKEl2dC5RdWFudGl0YXRpdmVTY2FsZSk7TnZ0LkxpbmVhcj1WdnQ7dmFyIFV2dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoVXZ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIganZ0PXVPLEd2dD1FZHQsV3Z0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPTEwKTt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4uX2QzU2NhbGU9R3Z0LnNjYWxlTG9nKCkuYmFzZShlKSxuLl9zZXREb21haW4obi5fZGVmYXVsdEV4dGVudCgpKSxufXJldHVybiBqdnQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX2RlZmF1bHRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm5bMSx0aGlzLl9kM1NjYWxlLmJhc2UoKV19LGUucHJvdG90eXBlLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gdFswXT09PXRbMV0/W3RbMF0vdGhpcy5fZDNTY2FsZS5iYXNlKCksdFsxXSp0aGlzLl9kM1NjYWxlLmJhc2UoKV06dH0sZS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUodCl9LGUucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc2NhbGUodCl9LGUucHJvdG90eXBlLmludmVydGVkVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW52ZXJ0KHQpfSxlLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRVbmJvdW5kZWRFeHRlbnQoITApfSxlLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbWFpbigpfSxlLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbih0KXt0aGlzLmRvbWFpbih0KX0sZS5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX0sZS5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9kM1NjYWxlLmRvbWFpbigpOih0aGlzLl9kM1NjYWxlLmRvbWFpbih0KSx0aGlzKX0sZS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUucmFuZ2UoKX0sZS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHQpe3RoaXMuX2QzU2NhbGUucmFuZ2UodCl9LGUucHJvdG90eXBlLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5pbnZlcnQodCl9LGUucHJvdG90eXBlLmRlZmF1bHRUaWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnRpY2tzKGUuX0RFRkFVTFRfTlVNX1RJQ0tTKX0sZS5wcm90b3R5cGUuX25pY2VEb21haW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5jb3B5KCkuZG9tYWluKHQpLm5pY2UoKS5kb21haW4oKX0sZX0pKEl2dC5RdWFudGl0YXRpdmVTY2FsZSk7VXZ0LkxvZz1XdnQ7dmFyIHF2dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkocXZ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgWXZ0PXVPLFh2dD1FZHQsJHZ0PUZndCxLdnQ9Wnl0LFp2dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT0xMCk7dmFyIG49dC5jYWxsKHRoaXMpfHx0aGlzO2lmKG4uX2xvZ1RpY2tHZW5lcmF0b3I9ZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24odCxlLG4pe3JldHVyblt0LGUsbl0uc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC1lfSkpWzFdfSxpPSR2dC5NYXRoLm1pbihuLl91bnRyYW5zZm9ybWVkRG9tYWluLDApLHI9JHZ0Lk1hdGgubWF4KG4uX3VudHJhbnNmb3JtZWREb21haW4sMCksbz1pLGE9ZShpLHIsLW4uX3Bpdm90KSxzPWUoaSxyLG4uX3Bpdm90KSxsPXIsYz1uLl9sb2dUaWNrcygtYSwtbykubWFwKChmdW5jdGlvbih0KXtyZXR1cm4tdH0pKS5yZXZlcnNlKCksdT1uLl9sb2dUaWNrcyhzLGwpLGg9TWF0aC5tYXgoaSwtbi5fcGl2b3QpLGQ9TWF0aC5taW4ocixuLl9waXZvdCkscD1YdnQuc2NhbGVMaW5lYXIoKS5kb21haW4oW2gsZF0pLnRpY2tzKG4uX2hvd01hbnlUaWNrcyhoLGQpKSxmPWMuY29uY2F0KHApLmNvbmNhdCh1KTtyZXR1cm4gZi5sZW5ndGg8PTEmJihmPVh2dC5zY2FsZUxpbmVhcigpLmRvbWFpbihbaSxyXSkudGlja3MoS3Z0Lk1vZGlmaWVkTG9nLl9ERUZBVUxUX05VTV9USUNLUykpLGZ9LG4uX2QzU2NhbGU9WHZ0LnNjYWxlTGluZWFyKCksbi5fYmFzZT1lLG4uX3Bpdm90PW4uX2Jhc2Usbi5fc2V0RG9tYWluKG4uX2RlZmF1bHRFeHRlbnQoKSksbi50aWNrR2VuZXJhdG9yKG4uX2xvZ1RpY2tHZW5lcmF0b3IpLGU8PTEpdGhyb3cgbmV3IEVycm9yKCJNb2RpZmllZExvZ1NjYWxlOiBUaGUgYmFzZSBtdXN0IGJlID4gMSIpO3JldHVybiBufXJldHVybiBZdnQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX2FkanVzdGVkTG9nPWZ1bmN0aW9uKHQpe3ZhciBlPXQ8MD8tMToxO3JldHVybih0Kj1lKTx0aGlzLl9waXZvdCYmKHQrPSh0aGlzLl9waXZvdC10KS90aGlzLl9waXZvdCksKHQ9TWF0aC5sb2codCkvTWF0aC5sb2codGhpcy5fYmFzZSkpKmV9LGUucHJvdG90eXBlLl9pbnZlcnRlZEFkanVzdGVkTG9nPWZ1bmN0aW9uKHQpe3ZhciBlPXQ8MD8tMToxO3JldHVybiB0Kj1lLCh0PU1hdGgucG93KHRoaXMuX2Jhc2UsdCkpPHRoaXMuX3Bpdm90JiYodD10aGlzLl9waXZvdCoodC0xKS8odGhpcy5fcGl2b3QtMSkpLHQqZX0sZS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUodGhpcy5fYWRqdXN0ZWRMb2codCkpfSxlLnByb3RvdHlwZS5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2ludmVydGVkQWRqdXN0ZWRMb2codGhpcy5fZDNTY2FsZS5pbnZlcnQodCkpfSxlLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNjYWxlKHQpfSxlLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmludmVydCh0KX0sZS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0VW5ib3VuZGVkRXh0ZW50KCEwKX0sZS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21haW4oKX0sZS5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24odCl7dGhpcy5kb21haW4odCl9LGUucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbn0sZS5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihlKXt0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluPWU7dmFyIG49W3RoaXMuX2FkanVzdGVkTG9nKGVbMF0pLHRoaXMuX2FkanVzdGVkTG9nKGVbMV0pXTt0LnByb3RvdHlwZS5fc2V0RG9tYWluLmNhbGwodGhpcyxuKX0sZS5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9kM1NjYWxlLmRvbWFpbigpOih0aGlzLl9kM1NjYWxlLmRvbWFpbih0KSx0aGlzKX0sZS5wcm90b3R5cGUuX2xvZ1RpY2tzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxpPXRoaXMuX2hvd01hbnlUaWNrcyh0LGUpO2lmKDA9PT1pKXJldHVybltdO3ZhciByPU1hdGguZmxvb3IoTWF0aC5sb2codCkvTWF0aC5sb2codGhpcy5fYmFzZSkpLG89TWF0aC5jZWlsKE1hdGgubG9nKGUpL01hdGgubG9nKHRoaXMuX2Jhc2UpKSxhPVh2dC5yYW5nZShvLHIsLU1hdGguY2VpbCgoby1yKS9pKSkscz1YdnQucmFuZ2UodGhpcy5fYmFzZSwxLC0odGhpcy5fYmFzZS0xKSkubWFwKE1hdGguZmxvb3IpLGw9JHZ0LkFycmF5LnVuaXEocyksYz1hLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGwubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5wb3cobi5fYmFzZSx0LTEpKmV9KSl9KSk7cmV0dXJuICR2dC5BcnJheS5mbGF0dGVuKGMpLmZpbHRlcigoZnVuY3Rpb24obil7cmV0dXJuIHQ8PW4mJm48PWV9KSkuc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC1lfSkpfSxlLnByb3RvdHlwZS5faG93TWFueVRpY2tzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fYWRqdXN0ZWRMb2coJHZ0Lk1hdGgubWluKHRoaXMuX3VudHJhbnNmb3JtZWREb21haW4sMCkpLGk9dGhpcy5fYWRqdXN0ZWRMb2coJHZ0Lk1hdGgubWF4KHRoaXMuX3VudHJhbnNmb3JtZWREb21haW4sMCkpLHI9dGhpcy5fYWRqdXN0ZWRMb2codCksbz10aGlzLl9hZGp1c3RlZExvZyhlKTtyZXR1cm4gTWF0aC5jZWlsKChvLXIpLyhpLW4pKkt2dC5Nb2RpZmllZExvZy5fREVGQVVMVF9OVU1fVElDS1MpfSxlLnByb3RvdHlwZS5fbmljZURvbWFpbj1mdW5jdGlvbih0LGUpe3JldHVybiB0fSxlLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3JldHVyblswLHRoaXMuX2Jhc2VdfSxlLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW49ZnVuY3Rpb24odCl7aWYodFswXT09PXRbMV0pe3ZhciBlPXRbMF07cmV0dXJuIGU+MD9bZS90aGlzLl9iYXNlLGUqdGhpcy5fYmFzZV06MD09PWU/Wy10aGlzLl9iYXNlLHRoaXMuX2Jhc2VdOltlKnRoaXMuX2Jhc2UsZS90aGlzLl9iYXNlXX1yZXR1cm4gdH0sZS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUucmFuZ2UoKX0sZS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHQpe3RoaXMuX2QzU2NhbGUucmFuZ2UodCl9LGUucHJvdG90eXBlLmRlZmF1bHRUaWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnRpY2tzKEt2dC5Nb2RpZmllZExvZy5fREVGQVVMVF9OVU1fVElDS1MpfSxlfSkoSXZ0LlF1YW50aXRhdGl2ZVNjYWxlKTtxdnQuTW9kaWZpZWRMb2c9WnZ0O3ZhciBKdnQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KEp2dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFF2dD11Tyx0YnQ9RWR0LGVidD1LeXQsbmJ0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBlLl9kM1NjYWxlPXRidC5zY2FsZVRpbWUoKSxlLmF1dG9Eb21haW4oKSxlfXJldHVybiBRdnQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUudGlja0ludGVydmFsPWZ1bmN0aW9uKHQsbixpKXt2b2lkIDA9PT1uJiYobj0xKSx2b2lkIDA9PT1pJiYoaT0hMSk7dmFyIHI9dGJ0LnNjYWxlVGltZSgpLG89ZS50aW1lSW50ZXJ2YWxUb0QzVGltZSh0LGkpLmV2ZXJ5KG4pO3JldHVybiByLmRvbWFpbih0aGlzLmRvbWFpbigpKSxyLnJhbmdlKHRoaXMucmFuZ2UoKSksci50aWNrcyhvKX0sZS5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihlKXtpZihlWzFdPGVbMF0pdGhyb3cgbmV3IEVycm9yKCJTY2FsZS5UaW1lIGRvbWFpbiB2YWx1ZXMgbXVzdCBiZSBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyIik7cmV0dXJuIHQucHJvdG90eXBlLl9zZXREb21haW4uY2FsbCh0aGlzLGUpfSxlLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3JldHVybltuZXcgRGF0ZSgiMTk3MC0wMS0wMSIpLG5ldyBEYXRlKCIxOTcwLTAxLTAyIildfSxlLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW49ZnVuY3Rpb24odCl7dmFyIGU9dFswXS5nZXRUaW1lKCksbj10WzFdLmdldFRpbWUoKTtpZihlPT09bil7dmFyIGk9bmV3IERhdGUoZSk7aS5zZXREYXRlKGkuZ2V0RGF0ZSgpLTEpO3ZhciByPW5ldyBEYXRlKG4pO3JldHVybiByLnNldERhdGUoci5nZXREYXRlKCkrMSksW2kscl19cmV0dXJuIHR9LGUucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kM1NjYWxlKHQpfSxlLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNjYWxlKG5ldyBEYXRlKHQpKX0sZS5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbnZlcnQodCkuZ2V0VGltZSgpfSxlLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCk7cmV0dXJuW3RbMF0udmFsdWVPZigpLHRbMV0udmFsdWVPZigpXX0sZS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmRvbWFpbigpO3JldHVyblt0WzBdLnZhbHVlT2YoKSx0WzFdLnZhbHVlT2YoKV19LGUucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKHQpe3ZhciBlPXRbMV07dGhpcy5kb21haW4oW25ldyBEYXRlKHRbMF0pLG5ldyBEYXRlKGUpXSl9LGUucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCl9LGUucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZDNTY2FsZS5kb21haW4oKToodGhpcy5fZDNTY2FsZS5kb21haW4odCksdGhpcyl9LGUucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnJhbmdlKCl9LGUucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbih0KXt0aGlzLl9kM1NjYWxlLnJhbmdlKHQpfSxlLnByb3RvdHlwZS5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUuaW52ZXJ0KHQpfSxlLnByb3RvdHlwZS5kZWZhdWx0VGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS50aWNrcyhlLl9ERUZBVUxUX05VTV9USUNLUyl9LGUucHJvdG90eXBlLl9uaWNlRG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kM1NjYWxlLmNvcHkoKS5kb21haW4odCkubmljZSgpLmRvbWFpbigpfSxlLnRpbWVJbnRlcnZhbFRvRDNUaW1lPWZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQpe2Nhc2UgZWJ0LlRpbWVJbnRlcnZhbC5zZWNvbmQ6cmV0dXJuIGU/dGJ0LnV0Y1NlY29uZDp0YnQudGltZVNlY29uZDtjYXNlIGVidC5UaW1lSW50ZXJ2YWwubWludXRlOnJldHVybiBlP3RidC51dGNNaW51dGU6dGJ0LnRpbWVNaW51dGU7Y2FzZSBlYnQuVGltZUludGVydmFsLmhvdXI6cmV0dXJuIGU/dGJ0LnV0Y0hvdXI6dGJ0LnRpbWVIb3VyO2Nhc2UgZWJ0LlRpbWVJbnRlcnZhbC5kYXk6cmV0dXJuIGU/dGJ0LnV0Y0RheTp0YnQudGltZURheTtjYXNlIGVidC5UaW1lSW50ZXJ2YWwud2VlazpyZXR1cm4gZT90YnQudXRjV2Vlazp0YnQudGltZVdlZWs7Y2FzZSBlYnQuVGltZUludGVydmFsLm1vbnRoOnJldHVybiBlP3RidC51dGNNb250aDp0YnQudGltZU1vbnRoO2Nhc2UgZWJ0LlRpbWVJbnRlcnZhbC55ZWFyOnJldHVybiBlP3RidC51dGNZZWFyOnRidC50aW1lWWVhcjtkZWZhdWx0OnRocm93IEVycm9yKCJUaW1lSW50ZXJ2YWwgc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0OiAiK3QpfX0sZX0pKEl2dC5RdWFudGl0YXRpdmVTY2FsZSk7SnZ0LlRpbWU9bmJ0LChmdW5jdGlvbih0KXsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBlPXVPO3QuVGlja0dlbmVyYXRvcnM9Snl0LGUuX19leHBvcnRTdGFyKG52dCx0KSxlLl9fZXhwb3J0U3RhcihidnQsdCksZS5fX2V4cG9ydFN0YXIoQ3Z0LHQpLGUuX19leHBvcnRTdGFyKE52dCx0KSxlLl9fZXhwb3J0U3RhcihVdnQsdCksZS5fX2V4cG9ydFN0YXIocXZ0LHQpLGUuX19leHBvcnRTdGFyKEp2dCx0KTt2YXIgbj1udnQsaT1JdnQ7dC5pc1RyYW5zZm9ybWFibGU9ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGkuUXVhbnRpdGF0aXZlU2NhbGV8fHQgaW5zdGFuY2VvZiBuLkNhdGVnb3J5fX0pKFp5dCksKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9dU8sbj1FZHQsaT1JbXQscj1neXQsbz1aeXQsYT1GZ3Qscz1TbXQsbD1teXQ7dC5UaW1lSW50ZXJ2YWw9cy5tYWtlRW51bShbInNlY29uZCIsIm1pbnV0ZSIsImhvdXIiLCJkYXkiLCJ3ZWVrIiwibW9udGgiLCJ5ZWFyIl0pLHQuVGltZUF4aXNPcmllbnRhdGlvbj1zLm1ha2VFbnVtKFsidG9wIiwiYm90dG9tIl0pLHQuVGllckxhYmVsUG9zaXRpb249cy5tYWtlRW51bShbImJldHdlZW4iLCJjZW50ZXIiXSk7dmFyIGMsdT0oZnVuY3Rpb24ocyl7ZnVuY3Rpb24gdSh0LGUsbil7dmFyIGk9cy5jYWxsKHRoaXMsdCxlKXx8dGhpcztyZXR1cm4gaS5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uPW51bGwsaS5fdGllckxhYmVsUG9zaXRpb25zPVtdLGkuX3VzZVVUQz1uLGkuYWRkQ2xhc3MoInRpbWUtYXhpcyIpLGkudGlja0xhYmVsUGFkZGluZyg1KSxpLmF4aXNDb25maWd1cmF0aW9ucyh1Ll9ERUZBVUxUX1RJTUVfQVhJU19DT05GSUdVUkFUSU9OUyhpLl91c2VVVEMpKSxpLmFubm90YXRpb25Gb3JtYXR0ZXIoci50aW1lKCIlYSAlYiAlZCwgJVkiLGkuX3VzZVVUQykpLGl9cmV0dXJuIGUuX19leHRlbmRzKHUscyksdS5wcm90b3R5cGUudGllckxhYmVsUG9zaXRpb25zPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3RpZXJMYWJlbFBvc2l0aW9ucztpZighdC5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuImJldHdlZW4iPT09dC50b0xvd2VyQ2FzZSgpfHwiY2VudGVyIj09PXQudG9Mb3dlckNhc2UoKX0pKSl0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIHBvc2l0aW9uIGZvciB0aWVyIGxhYmVscyIpO3JldHVybiB0aGlzLl90aWVyTGFiZWxQb3NpdGlvbnM9dCx0aGlzLnJlZHJhdygpLHRoaXN9LHUucHJvdG90eXBlLm1heFRpbWVJbnRlcnZhbFByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb246KHRoaXMuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbj10LHRoaXMucmVkcmF3KCksdGhpcyl9LHUucHJvdG90eXBlLmN1cnJlbnRBeGlzQ29uZmlndXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnNbdGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleF19LHUucHJvdG90eXBlLmF4aXNDb25maWd1cmF0aW9ucz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnM7dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zPXQsdGhpcy5fbnVtVGllcnM9YS5NYXRoLm1heCh0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5sZW5ndGh9KSksMCksdGhpcy5faXNBbmNob3JlZCYmdGhpcy5fc2V0dXBEb21FbGVtZW50cygpO2Zvcih2YXIgZT10aGlzLnRpZXJMYWJlbFBvc2l0aW9ucygpLG49W10saT0wO2k8dGhpcy5fbnVtVGllcnM7aSsrKW4ucHVzaChlW2ldfHwiYmV0d2VlbiIpO3JldHVybiB0aGlzLnRpZXJMYWJlbFBvc2l0aW9ucyhuKSx0aGlzLnJlZHJhdygpLHRoaXN9LHUucHJvdG90eXBlLl9nZXRNb3N0UHJlY2lzZUNvbmZpZ3VyYXRpb25JbmRleD1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMubGVuZ3RoO3JldHVybiB0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMuZm9yRWFjaCgoZnVuY3Rpb24obixpKXtpPGUmJm4uZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiB0Ll9jaGVja1RpbWVBeGlzVGllckNvbmZpZ3VyYXRpb24oZSl9KSkmJihlPWkpfSkpLGU9PT10aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMubGVuZ3RoJiYoYS5XaW5kb3cud2Fybigiem9vbWVkIG91dCB0b28gZmFyOiBjb3VsZCBub3QgZmluZCBzdWl0YWJsZSBpbnRlcnZhbCB0byBkaXNwbGF5IGxhYmVscyIpLC0tZSksZX0sdS5wcm90b3R5cGUub3JpZW50YXRpb249ZnVuY3Rpb24odCl7aWYodCYmKCJyaWdodCI9PT10LnRvTG93ZXJDYXNlKCl8fCJsZWZ0Ij09PXQudG9Mb3dlckNhc2UoKSkpdGhyb3cgbmV3IEVycm9yKHQrIiBpcyBub3QgYSBzdXBwb3J0ZWQgb3JpZW50YXRpb24gZm9yIFRpbWVBeGlzIC0gb25seSBob3Jpem9udGFsIG9yaWVudGF0aW9ucyBhcmUgc3VwcG9ydGVkIik7cmV0dXJuIHMucHJvdG90eXBlLm9yaWVudGF0aW9uLmNhbGwodGhpcyx0KX0sdS5wcm90b3R5cGUuX2NvbXB1dGVIZWlnaHQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0O3RoaXMuX3RpZXJIZWlnaHRzPVtdO2Zvcih2YXIgZT0wO2U8dGhpcy5fbnVtVGllcnM7ZSsrKXRoaXMuX3RpZXJIZWlnaHRzLnB1c2godCt0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSsoImJldHdlZW4iPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW2VdPzA6dGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkpKTtyZXR1cm4gbi5zdW0odGhpcy5fdGllckhlaWdodHMpfSx1LnByb3RvdHlwZS5fZ2V0SW50ZXJ2YWxMZW5ndGg9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fc2NhbGUuZG9tYWluKClbMF0sbj1vLlRpbWUudGltZUludGVydmFsVG9EM1RpbWUodC5pbnRlcnZhbCx0aGlzLl91c2VVVEMpLm9mZnNldChlLHQuc3RlcCk7cmV0dXJuIG4+dGhpcy5fc2NhbGUuZG9tYWluKClbMV0/dGhpcy53aWR0aCgpOk1hdGguYWJzKHRoaXMuX3NjYWxlLnNjYWxlKG4pLXRoaXMuX3NjYWxlLnNjYWxlKGUpKX0sdS5wcm90b3R5cGUuX21heFdpZHRoRm9ySW50ZXJ2YWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX21lYXN1cmVyLm1lYXN1cmUodC5mb3JtYXR0ZXIodS5fTE9OR19EQVRFKSkud2lkdGh9LHUucHJvdG90eXBlLl9jaGVja1RpbWVBeGlzVGllckNvbmZpZ3VyYXRpb249ZnVuY3Rpb24odCl7aWYobnVsbCE9dGhpcy5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uKXt2YXIgZT11Ll9TT1JURURfVElNRV9JTlRFUlZBTF9JTkRFWFt0aGlzLl9tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb25dLG49dS5fU09SVEVEX1RJTUVfSU5URVJWQUxfSU5ERVhbdC5pbnRlcnZhbF07aWYobnVsbCE9ZSYmbnVsbCE9biYmbjxlKXJldHVybiExfXZhciBpPXRoaXMuX21heFdpZHRoRm9ySW50ZXJ2YWwodCkrMip0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTtyZXR1cm4gTWF0aC5taW4odGhpcy5fZ2V0SW50ZXJ2YWxMZW5ndGgodCksdGhpcy53aWR0aCgpKT49aX0sdS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24odCxlKXt2YXIgbj1zLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlci5jYWxsKHRoaXMsdCxlKSxpPXRoaXMuX3RpZXJIZWlnaHRzLnJlZHVjZSgoZnVuY3Rpb24odCxlLGkscil7cmV0dXJuIHQrZT5uLmhlaWdodD90OnQrZX0pKSxyPXRoaXMubWFyZ2luKCkrKHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCk/dGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCkqdGhpcy5fYW5ub3RhdGlvblRpZXJIZWlnaHQoKTowKTtyZXR1cm4gbi5oZWlnaHQ9TWF0aC5taW4obi5oZWlnaHQsaStyKSxufSx1LnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtzLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKSx0aGlzLl9zZXR1cERvbUVsZW1lbnRzKCl9LHUucHJvdG90eXBlLl9zZXR1cERvbUVsZW1lbnRzPWZ1bmN0aW9uKCl7dGhpcy5jb250ZW50KCkuc2VsZWN0QWxsKCIuIit1LlRJTUVfQVhJU19USUVSX0NMQVNTKS5yZW1vdmUoKSx0aGlzLl90aWVyTGFiZWxDb250YWluZXJzPVtdLHRoaXMuX3RpZXJNYXJrQ29udGFpbmVycz1bXSx0aGlzLl90aWVyQmFzZWxpbmVzPVtdLHRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5yZW1vdmUoKSx0aGlzLl9iYXNlbGluZS5yZW1vdmUoKTtmb3IodmFyIHQ9MDt0PHRoaXMuX251bVRpZXJzOysrdCl7dmFyIGU9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCh1LlRJTUVfQVhJU19USUVSX0NMQVNTLCEwKTt0aGlzLl90aWVyTGFiZWxDb250YWluZXJzLnB1c2goZS5hcHBlbmQoImciKS5jbGFzc2VkKGwuQXhpcy5USUNLX0xBQkVMX0NMQVNTKyItY29udGFpbmVyIiwhMCkpLHRoaXMuX3RpZXJNYXJrQ29udGFpbmVycy5wdXNoKGUuYXBwZW5kKCJnIikuY2xhc3NlZChsLkF4aXMuVElDS19NQVJLX0NMQVNTKyItY29udGFpbmVyIiwhMCkpLHRoaXMuX3RpZXJCYXNlbGluZXMucHVzaChlLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImJhc2VsaW5lIiwhMCkpfXZhciBuPW5ldyBpLlN2Z0NvbnRleHQodGhpcy5fdGllckxhYmVsQ29udGFpbmVyc1swXS5ub2RlKCkpO3RoaXMuX21lYXN1cmVyPW5ldyBpLkNhY2hlTWVhc3VyZXIobil9LHUucHJvdG90eXBlLl9nZXRUaWNrSW50ZXJ2YWxWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3NjYWxlLnRpY2tJbnRlcnZhbCh0LmludGVydmFsLHQuc3RlcCx0aGlzLl91c2VVVEMpfSx1LnByb3RvdHlwZS5fZ2V0VGlja1ZhbHVlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9uc1t0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4XS5yZWR1Y2UoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGUuY29uY2F0KHQuX2dldFRpY2tJbnRlcnZhbFZhbHVlcyhuKSl9KSxbXSl9LHUucHJvdG90eXBlLl9jbGVhblRpZXJzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLl90aWVyTGFiZWxDb250YWluZXJzLmxlbmd0aDt0KyspdGhpcy5fdGllckxhYmVsQ29udGFpbmVyc1t0XS5zZWxlY3RBbGwoIi4iK2wuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5yZW1vdmUoKSx0aGlzLl90aWVyTWFya0NvbnRhaW5lcnNbdF0uc2VsZWN0QWxsKCIuIitsLkF4aXMuVElDS19NQVJLX0NMQVNTKS5yZW1vdmUoKSx0aGlzLl90aWVyQmFzZWxpbmVzW3RdLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9LHUucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzRm9yQ29uZmlndXJhdGlvbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9zY2FsZS50aWNrSW50ZXJ2YWwodC5pbnRlcnZhbCx0LnN0ZXAsdGhpcy5fdXNlVVRDKSxuPXRoaXMuX3NjYWxlLmRvbWFpbigpLGk9ZS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnZhbHVlT2YoKX0pKTtyZXR1cm4tMT09PWkuaW5kZXhPZihuWzBdLnZhbHVlT2YoKSkmJmUudW5zaGlmdChuWzBdKSwtMT09PWkuaW5kZXhPZihuWzFdLnZhbHVlT2YoKSkmJmUucHVzaChuWzFdKSxlfSx1LnByb3RvdHlwZS5fcmVuZGVyVGllckxhYmVscz1mdW5jdGlvbih0LGUsaSl7dmFyIHI9dGhpcyxvPXRoaXMuX2dldFRpY2tWYWx1ZXNGb3JDb25maWd1cmF0aW9uKGUpLGE9W107ImJldHdlZW4iPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW2ldJiYxPT09ZS5zdGVwP28ubWFwKChmdW5jdGlvbih0LGUpe2UrMT49by5sZW5ndGh8fGEucHVzaChuZXcgRGF0ZSgob1tlKzFdLnZhbHVlT2YoKS1vW2VdLnZhbHVlT2YoKSkvMitvW2VdLnZhbHVlT2YoKSkpfSkpOmE9bzt2YXIgcz10LnNlbGVjdEFsbCgiLiIrbC5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmRhdGEoYSwoZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0LnZhbHVlT2YoKSl9KSksYz1zLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZChsLkF4aXMuVElDS19MQUJFTF9DTEFTUywhMCk7Yy5hcHBlbmQoInRleHQiKTt2YXIgdSxoPSJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW2ldfHwxPT09ZS5zdGVwPzA6dGhpcy50aWNrTGFiZWxQYWRkaW5nKCk7dT0iYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT9uLnN1bSh0aGlzLl90aWVySGVpZ2h0cy5zbGljZSgwLGkrMSkpLXRoaXMudGlja0xhYmVsUGFkZGluZygpOiJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW2ldP3RoaXMuaGVpZ2h0KCktbi5zdW0odGhpcy5fdGllckhlaWdodHMuc2xpY2UoMCxpKSktdGhpcy50aWNrTGFiZWxQYWRkaW5nKCktdGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCk6dGhpcy5oZWlnaHQoKS1uLnN1bSh0aGlzLl90aWVySGVpZ2h0cy5zbGljZSgwLGkpKS10aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTt2YXIgZD1zLm1lcmdlKGMpLHA9ZC5zZWxlY3RBbGwoInRleHQiKTtwLnNpemUoKT4wJiZwLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2grIiwiK3UrIikiKSxzLmV4aXQoKS5yZW1vdmUoKSxkLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3JldHVybiJ0cmFuc2xhdGUoIityLl9zY2FsZS5zY2FsZSh0KSsiLDApIn0pKTt2YXIgZj0iY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tpXXx8MT09PWUuc3RlcD8ibWlkZGxlIjoic3RhcnQiO2Quc2VsZWN0QWxsKCJ0ZXh0IikudGV4dChlLmZvcm1hdHRlcikuc3R5bGUoInRleHQtYW5jaG9yIixmKX0sdS5wcm90b3R5cGUuX3JlbmRlclRpY2tNYXJrcz1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX3RpZXJNYXJrQ29udGFpbmVyc1tlXS5zZWxlY3RBbGwoIi4iK2wuQXhpcy5USUNLX01BUktfQ0xBU1MpLmRhdGEodCkscj1pLmVudGVyKCkuYXBwZW5kKCJsaW5lIikuY2xhc3NlZChsLkF4aXMuVElDS19NQVJLX0NMQVNTLCEwKS5tZXJnZShpKSxvPXRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCgpLGE9dGhpcy5fdGllckhlaWdodHMuc2xpY2UoMCxlKS5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZX0pLDApOyJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpPyhvLnkxPWEsby55Mj1hKygiY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tlXT90aGlzLmlubmVyVGlja0xlbmd0aCgpOnRoaXMuX3RpZXJIZWlnaHRzW2VdKSk6KG8ueTE9dGhpcy5oZWlnaHQoKS1hLG8ueTI9dGhpcy5oZWlnaHQoKS0oYSsoImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbZV0/dGhpcy5pbm5lclRpY2tMZW5ndGgoKTp0aGlzLl90aWVySGVpZ2h0c1tlXSkpKSxyLmF0dHJzKG8pLCJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpPyhvLnkxPWEsby55Mj1hKygiY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tlXT90aGlzLmVuZFRpY2tMZW5ndGgoKTp0aGlzLl90aWVySGVpZ2h0c1tlXSkpOihvLnkxPXRoaXMuaGVpZ2h0KCktYSxvLnkyPXRoaXMuaGVpZ2h0KCktKGErKCJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW2VdP3RoaXMuZW5kVGlja0xlbmd0aCgpOnRoaXMuX3RpZXJIZWlnaHRzW2VdKSkpLG4uc2VsZWN0KHIubm9kZXMoKVswXSkuYXR0cnMobyksbi5zZWxlY3Qoci5ub2RlcygpW3Iuc2l6ZSgpLTFdKS5hdHRycyhvKSxuLnNlbGVjdChyLm5vZGVzKClbMF0pLmNsYXNzZWQobC5BeGlzLkVORF9USUNLX01BUktfQ0xBU1MsITApLG4uc2VsZWN0KHIubm9kZXMoKVtyLnNpemUoKS0xXSkuY2xhc3NlZChsLkF4aXMuRU5EX1RJQ0tfTUFSS19DTEFTUywhMCksaS5leGl0KCkucmVtb3ZlKCl9LHUucHJvdG90eXBlLl9yZW5kZXJMYWJlbGxlc3NUaWNrTWFya3M9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdGlja01hcmtDb250YWluZXIuc2VsZWN0QWxsKCIuIitsLkF4aXMuVElDS19NQVJLX0NMQVNTKS5kYXRhKHQpLG49ZS5lbnRlcigpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQobC5BeGlzLlRJQ0tfTUFSS19DTEFTUywhMCkubWVyZ2UoZSksaT10aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goKTtpLnkyPSJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpP3RoaXMudGlja0xhYmVsUGFkZGluZygpOnRoaXMuaGVpZ2h0KCktdGhpcy50aWNrTGFiZWxQYWRkaW5nKCksbi5hdHRycyhpKSxlLmV4aXQoKS5yZW1vdmUoKX0sdS5wcm90b3R5cGUuX2dlbmVyYXRlTGFiZWxsZXNzVGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleDwxP1tdOnRoaXMuX2dldFRpY2tJbnRlcnZhbFZhbHVlcyh0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnNbdGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleC0xXVswXSl9LHUucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4PXRoaXMuX2dldE1vc3RQcmVjaXNlQ29uZmlndXJhdGlvbkluZGV4KCk7dmFyIGU9dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zW3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXhdO3RoaXMuX2NsZWFuVGllcnMoKSxlLmZvckVhY2goKGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuX3JlbmRlclRpZXJMYWJlbHModC5fdGllckxhYmVsQ29udGFpbmVyc1tuXSxlLG4pfSkpO2Zvcih2YXIgbj1lLm1hcCgoZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5fZ2V0VGlja1ZhbHVlc0ZvckNvbmZpZ3VyYXRpb24oZSl9KSksaT0wLHI9MDtyPE1hdGgubWF4KGUubGVuZ3RoLDEpOysrcil7dmFyIG89dGhpcy5fZ2VuZXJhdGVCYXNlbGluZUF0dHJIYXNoKCk7by55MSs9ImJvdHRvbSI9PT10aGlzLm9yaWVudGF0aW9uKCk/aTotaSxvLnkyPW8ueTEsdGhpcy5fdGllckJhc2VsaW5lc1tyXS5hdHRycyhvKS5zdHlsZSgidmlzaWJpbGl0eSIsImluaGVyaXQiKSxpKz10aGlzLl90aWVySGVpZ2h0c1tyXX12YXIgYT1bXSxzPXRoaXMuX3NjYWxlLmRvbWFpbigpLGw9dGhpcy5fc2NhbGUuc2NhbGUoc1sxXSktdGhpcy5fc2NhbGUuc2NhbGUoc1swXSk7Zm9yKDEuNSp0aGlzLl9nZXRJbnRlcnZhbExlbmd0aChlWzBdKT49bCYmKGE9dGhpcy5fZ2VuZXJhdGVMYWJlbGxlc3NUaWNrcygpKSx0aGlzLl9yZW5kZXJMYWJlbGxlc3NUaWNrTWFya3MoYSksdGhpcy5faGlkZU92ZXJmbG93aW5nVGllcnMoKSxyPTA7cjxlLmxlbmd0aDsrK3IpdGhpcy5fcmVuZGVyVGlja01hcmtzKG5bcl0sciksdGhpcy5faGlkZU92ZXJsYXBwaW5nQW5kQ3V0T2ZmTGFiZWxzKHIpO3JldHVybiB0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpP3RoaXMuX2RyYXdBbm5vdGF0aW9ucygpOnRoaXMuX3JlbW92ZUFubm90YXRpb25zKCksdGhpc30sdS5wcm90b3R5cGUuX2hpZGVPdmVyZmxvd2luZ1RpZXJzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuaGVpZ2h0KCksbj0wO3RoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiLiIrdS5USU1FX0FYSVNfVElFUl9DTEFTUykuYXR0cigidmlzaWJpbGl0eSIsKGZ1bmN0aW9uKGkscil7cmV0dXJuKG4rPXQuX3RpZXJIZWlnaHRzW3JdKTw9ZT8iaW5oZXJpdCI6ImhpZGRlbiJ9KSl9LHUucHJvdG90eXBlLl9oaWRlT3ZlcmxhcHBpbmdBbmRDdXRPZmZMYWJlbHM9ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzLHI9dGhpcy5lbGVtZW50KCkubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG89dGhpcy5fdGllck1hcmtDb250YWluZXJzW3RdLnNlbGVjdEFsbCgiLiIrbC5BeGlzLlRJQ0tfTUFSS19DTEFTUykuZmlsdGVyKChmdW5jdGlvbih0LGUpe3ZhciBpPW4uc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5Iik7cmV0dXJuInZpc2libGUiPT09aXx8ImluaGVyaXQiPT09aX0pKS5ub2RlcygpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9KSk7dGhpcy5fdGllckxhYmVsQ29udGFpbmVyc1t0XS5zZWxlY3RBbGwoIi4iK2wuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5maWx0ZXIoKGZ1bmN0aW9uKHQsZSl7dmFyIGk9bi5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiKTtyZXR1cm4idmlzaWJsZSI9PT1pfHwiaW5oZXJpdCI9PT1pfSkpLmVhY2goKGZ1bmN0aW9uKHQscyl7dmFyIGwsYz10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHU9bi5zZWxlY3QodGhpcyksaD1vW3NdLGQ9b1tzKzFdLHA9bnVsbCE9ZSYmYS5ET00uY2xpZW50UmVjdHNPdmVybGFwKGMsZSksZj1udWxsIT1oJiZhLkRPTS5jbGllbnRSZWN0c092ZXJsYXAoYyxoKSxtPW51bGwhPWQmJmEuRE9NLmNsaWVudFJlY3RzT3ZlcmxhcChjLGQpO2w9YywhKE1hdGguZmxvb3Ioci5sZWZ0KTw9TWF0aC5jZWlsKGwubGVmdCkmJk1hdGguZmxvb3Ioci50b3ApPD1NYXRoLmNlaWwobC50b3ApJiZNYXRoLmZsb29yKGwucmlnaHQpPD1NYXRoLmNlaWwoci5sZWZ0K2kud2lkdGgoKSkmJk1hdGguZmxvb3IobC5ib3R0b20pPD1NYXRoLmNlaWwoci50b3AraS5oZWlnaHQoKSkpfHxwfHxmfHxtP3Uuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKTooZT1jLHUuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0IikpfSkpfSx1LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtzLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKSx0aGlzLl9tZWFzdXJlci5yZXNldCgpfSx1LlRJTUVfQVhJU19USUVSX0NMQVNTPSJ0aW1lLWF4aXMtdGllciIsdS5fU09SVEVEX1RJTUVfSU5URVJWQUxfSU5ERVg9KChjPXt9KVt0LlRpbWVJbnRlcnZhbC5zZWNvbmRdPTAsY1t0LlRpbWVJbnRlcnZhbC5taW51dGVdPTEsY1t0LlRpbWVJbnRlcnZhbC5ob3VyXT0yLGNbdC5UaW1lSW50ZXJ2YWwuZGF5XT0zLGNbdC5UaW1lSW50ZXJ2YWwud2Vla109NCxjW3QuVGltZUludGVydmFsLm1vbnRoXT01LGNbdC5UaW1lSW50ZXJ2YWwueWVhcl09NixjKSx1Ll9ERUZBVUxUX1RJTUVfQVhJU19DT05GSUdVUkFUSU9OUz1mdW5jdGlvbihlKXt2YXIgbj1mdW5jdGlvbih0KXtyZXR1cm4gci50aW1lKHQsZSl9O3JldHVybltbe2ludGVydmFsOnQuVGltZUludGVydmFsLnNlY29uZCxzdGVwOjEsZm9ybWF0dGVyOm4oIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuc2Vjb25kLHN0ZXA6NSxmb3JtYXR0ZXI6bigiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOnQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm4oIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDoxMCxmb3JtYXR0ZXI6bigiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOnQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm4oIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDoxNSxmb3JtYXR0ZXI6bigiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOnQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm4oIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDozMCxmb3JtYXR0ZXI6bigiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOnQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm4oIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5taW51dGUsc3RlcDoxLGZvcm1hdHRlcjpuKCIlSTolTSAlcCIpfSx7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bigiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLm1pbnV0ZSxzdGVwOjUsZm9ybWF0dGVyOm4oIiVJOiVNICVwIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6MTAsZm9ybWF0dGVyOm4oIiVJOiVNICVwIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6MTUsZm9ybWF0dGVyOm4oIiVJOiVNICVwIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6MzAsZm9ybWF0dGVyOm4oIiVJOiVNICVwIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuaG91cixzdGVwOjEsZm9ybWF0dGVyOm4oIiVJICVwIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuaG91cixzdGVwOjMsZm9ybWF0dGVyOm4oIiVJICVwIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuaG91cixzdGVwOjYsZm9ybWF0dGVyOm4oIiVJICVwIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuaG91cixzdGVwOjEyLGZvcm1hdHRlcjpuKCIlSSAlcCIpfSx7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bigiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm4oIiVhICVlIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjEsZm9ybWF0dGVyOm4oIiVCICVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm4oIiVlIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjEsZm9ybWF0dGVyOm4oIiVCICVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6MSxmb3JtYXR0ZXI6bigiJUIiKX0se2ludGVydmFsOnQuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpuKCIlWSIpfV0sW3tpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjEsZm9ybWF0dGVyOm4oIiViIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6bigiJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDozLGZvcm1hdHRlcjpuKCIlYiIpfSx7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOm4oIiVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6Nixmb3JtYXR0ZXI6bigiJWIiKX0se2ludGVydmFsOnQuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpuKCIlWSIpfV0sW3tpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6bigiJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOm4oIiV5Iil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLnllYXIsc3RlcDo1LGZvcm1hdHRlcjpuKCIlWSIpfV0sW3tpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MjUsZm9ybWF0dGVyOm4oIiVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLnllYXIsc3RlcDo1MCxmb3JtYXR0ZXI6bigiJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEwMCxmb3JtYXR0ZXI6bigiJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjIwMCxmb3JtYXR0ZXI6bigiJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjUwMCxmb3JtYXR0ZXI6bigiJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjFlMyxmb3JtYXR0ZXI6bigiJVkiKX1dXX0sdS5fTE9OR19EQVRFPW5ldyBEYXRlKDk5OTksOCwyOSwxMiw1OSw5OTk5KSx1fSkobC5BeGlzKTt0LlRpbWU9dX0pKEt5dCksKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9dU87ZS5fX2V4cG9ydFN0YXIoTm10LHQpLGUuX19leHBvcnRTdGFyKFV5dCx0KSxlLl9fZXhwb3J0U3RhcihLeXQsdCl9KShQbXQpO3ZhciBpYnQ9e30scmJ0PXt9LG9idD17fSxhYnQ9e30sc2J0PXt9LGxidD17fSxjYnQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShjYnQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB1YnQ9Rmd0LGhidD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbj17fSx0aGlzLl9ldmVudFRhcmdldD1kb2N1bWVudCx0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0PXt9LHRoaXMuX2Nvbm5lY3RlZD0hMX1yZXR1cm4gdC5wcm90b3R5cGUuX2hhc05vQ2FsbGJhY2tzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PU9iamVjdC5rZXlzKHRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXQpLGU9MDtlPHQubGVuZ3RoO2UrKylpZigwIT09dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFt0W2VdXS5zaXplKXJldHVybiExO3JldHVybiEwfSx0LnByb3RvdHlwZS5fY29ubmVjdD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fY29ubmVjdGVkfHwoT2JqZWN0LmtleXModGhpcy5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbikuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5fZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihlLHQuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bZV0sIndoZWVsIj09PWU/e3Bhc3NpdmU6ITF9OnZvaWQgMCl9KSksdGhpcy5fY29ubmVjdGVkPSEwKX0sdC5wcm90b3R5cGUuX2Rpc2Nvbm5lY3Q9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX2Nvbm5lY3RlZCYmdGhpcy5faGFzTm9DYWxsYmFja3MoKSYmKE9iamVjdC5rZXlzKHRoaXMuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb24pLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuX2V2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0Ll9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW2VdKX0pKSx0aGlzLl9jb25uZWN0ZWQ9ITEpfSx0LnByb3RvdHlwZS5fYWRkQ2FsbGJhY2tGb3JFdmVudD1mdW5jdGlvbih0LGUpe251bGw9PXRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRbdF0mJih0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W3RdPW5ldyB1YnQuQ2FsbGJhY2tTZXQpLHRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRbdF0uYWRkKGUpLHRoaXMuX2Nvbm5lY3QoKX0sdC5wcm90b3R5cGUuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQ9ZnVuY3Rpb24odCxlKXtudWxsIT10aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W3RdJiZ0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W3RdLmRlbGV0ZShlKSx0aGlzLl9kaXNjb25uZWN0KCl9LHQucHJvdG90eXBlLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWVbbi0xXT1hcmd1bWVudHNbbl07dmFyIGk9dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFt0XTtudWxsIT1pJiZpLmNhbGxDYWxsYmFja3MuYXBwbHkoaSxlKX0sdH0pKCk7Y2J0LkRpc3BhdGNoZXI9aGJ0LAovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkobGJ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZGJ0PXVPLHBidD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gbi5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltlLl9LRVlET1dOX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHQpe3JldHVybiBuLl9wcm9jZXNzS2V5ZG93bih0KX0sbi5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltlLl9LRVlVUF9FVkVOVF9OQU1FXT1mdW5jdGlvbih0KXtyZXR1cm4gbi5fcHJvY2Vzc0tleXVwKHQpfSxufXJldHVybiBkYnQuX19leHRlbmRzKGUsdCksZS5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnRbZS5fRElTUEFUQ0hFUl9LRVldO3JldHVybiBudWxsPT10JiYodD1uZXcgZSxkb2N1bWVudFtlLl9ESVNQQVRDSEVSX0tFWV09dCksdH0sZS5wcm90b3R5cGUuX3Byb2Nlc3NLZXlkb3duPWZ1bmN0aW9uKHQpe3RoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChlLl9LRVlET1dOX0VWRU5UX05BTUUsdC5rZXlDb2RlLHQpfSxlLnByb3RvdHlwZS5fcHJvY2Vzc0tleXVwPWZ1bmN0aW9uKHQpe3RoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChlLl9LRVlVUF9FVkVOVF9OQU1FLHQua2V5Q29kZSx0KX0sZS5wcm90b3R5cGUub25LZXlEb3duPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGUuX0tFWURPV05fRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZLZXlEb3duPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KGUuX0tFWURPV05fRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5vbktleVVwPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGUuX0tFWVVQX0VWRU5UX05BTUUsdCksdGhpc30sZS5wcm90b3R5cGUub2ZmS2V5VXA9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQoZS5fS0VZVVBfRVZFTlRfTkFNRSx0KSx0aGlzfSxlLl9ESVNQQVRDSEVSX0tFWT0iX19QbG90dGFibGVfRGlzcGF0Y2hlcl9LZXkiLGUuX0tFWURPV05fRVZFTlRfTkFNRT0ia2V5ZG93biIsZS5fS0VZVVBfRVZFTlRfTkFNRT0ia2V5dXAiLGV9KShjYnQuRGlzcGF0Y2hlcik7bGJ0LktleT1wYnQ7dmFyIGZidD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoZmJ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbWJ0PXVPLGdidD1GZ3QsX2J0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciBpPXQuY2FsbCh0aGlzKXx8dGhpcztpLl9sYXN0TW91c2VQb3NpdGlvbj17eDotMSx5Oi0xfSxpLl90cmFuc2xhdG9yPWdidC5nZXRUcmFuc2xhdG9yKG4pO3ZhciByPWZ1bmN0aW9uKHQpe3JldHVybiBpLl9tZWFzdXJlQW5kRGlzcGF0Y2gobix0LGUuX01PVVNFTU9WRV9FVkVOVF9OQU1FLCJwYWdlIil9O3JldHVybiBpLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW2UuX01PVVNFT1ZFUl9FVkVOVF9OQU1FXT1yLGkuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bZS5fTU9VU0VNT1ZFX0VWRU5UX05BTUVdPXIsaS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltlLl9NT1VTRU9VVF9FVkVOVF9OQU1FXT1yLGkuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bZS5fTU9VU0VET1dOX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHQpe3JldHVybiBpLl9tZWFzdXJlQW5kRGlzcGF0Y2gobix0LGUuX01PVVNFRE9XTl9FVkVOVF9OQU1FKX0saS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltlLl9NT1VTRVVQX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHQpe3JldHVybiBpLl9tZWFzdXJlQW5kRGlzcGF0Y2gobix0LGUuX01PVVNFVVBfRVZFTlRfTkFNRSwicGFnZSIpfSxpLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW2UuX1dIRUVMX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHQpe3JldHVybiBpLl9tZWFzdXJlQW5kRGlzcGF0Y2gobix0LGUuX1dIRUVMX0VWRU5UX05BTUUpfSxpLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW2UuX0RCTENMSUNLX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHQpe3JldHVybiBpLl9tZWFzdXJlQW5kRGlzcGF0Y2gobix0LGUuX0RCTENMSUNLX0VWRU5UX05BTUUpfSxpfXJldHVybiBtYnQuX19leHRlbmRzKGUsdCksZS5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKHQpe3ZhciBuPXQucm9vdCgpLnJvb3RFbGVtZW50KCksaT1uW2UuX0RJU1BBVENIRVJfS0VZXTtyZXR1cm4gbnVsbD09aSYmKGk9bmV3IGUodCksbltlLl9ESVNQQVRDSEVSX0tFWV09aSksaX0sZS5wcm90b3R5cGUub25Nb3VzZU1vdmU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQoZS5fTU9VU0VNT1ZFX0VWRU5UX05BTUUsdCksdGhpc30sZS5wcm90b3R5cGUub2ZmTW91c2VNb3ZlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KGUuX01PVVNFTU9WRV9FVkVOVF9OQU1FLHQpLHRoaXN9LGUucHJvdG90eXBlLm9uTW91c2VEb3duPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGUuX01PVVNFRE9XTl9FVkVOVF9OQU1FLHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZk1vdXNlRG93bj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChlLl9NT1VTRURPV05fRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5vbk1vdXNlVXA9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQoZS5fTU9VU0VVUF9FVkVOVF9OQU1FLHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZk1vdXNlVXA9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQoZS5fTU9VU0VVUF9FVkVOVF9OQU1FLHQpLHRoaXN9LGUucHJvdG90eXBlLm9uV2hlZWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQoZS5fV0hFRUxfRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZXaGVlbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChlLl9XSEVFTF9FVkVOVF9OQU1FLHQpLHRoaXN9LGUucHJvdG90eXBlLm9uRGJsQ2xpY2s9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQoZS5fREJMQ0xJQ0tfRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZEYmxDbGljaz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChlLl9EQkxDTElDS19FVkVOVF9OQU1FLHQpLHRoaXN9LGUucHJvdG90eXBlLl9tZWFzdXJlQW5kRGlzcGF0Y2g9ZnVuY3Rpb24odCxlLG4saSl7aWYodm9pZCAwPT09aSYmKGk9ImVsZW1lbnQiKSwicGFnZSIhPT1pJiYiZWxlbWVudCIhPT1pKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzY29wZSAnIitpKyInLCBtdXN0IGJlICdlbGVtZW50JyBvciAncGFnZSciKTtpZigicGFnZSI9PT1pfHx0aGlzLmV2ZW50SW5zaWRlKHQsZSkpe3ZhciByPXRoaXMuX3RyYW5zbGF0b3IuY29tcHV0ZVBvc2l0aW9uKGUuY2xpZW50WCxlLmNsaWVudFkpO3RoaXMuX2xhc3RNb3VzZVBvc2l0aW9uPXIsdGhpcy5fY2FsbENhbGxiYWNrc0ZvckV2ZW50KG4sdGhpcy5sYXN0TW91c2VQb3NpdGlvbigpLGUpfX0sZS5wcm90b3R5cGUuZXZlbnRJbnNpZGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZ2J0LlRyYW5zbGF0b3IuaXNFdmVudEluc2lkZSh0LGUpfSxlLnByb3RvdHlwZS5sYXN0TW91c2VQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYXN0TW91c2VQb3NpdGlvbn0sZS5fRElTUEFUQ0hFUl9LRVk9Il9fUGxvdHRhYmxlX0Rpc3BhdGNoZXJfTW91c2UiLGUuX01PVVNFT1ZFUl9FVkVOVF9OQU1FPSJtb3VzZW92ZXIiLGUuX01PVVNFTU9WRV9FVkVOVF9OQU1FPSJtb3VzZW1vdmUiLGUuX01PVVNFT1VUX0VWRU5UX05BTUU9Im1vdXNlb3V0IixlLl9NT1VTRURPV05fRVZFTlRfTkFNRT0ibW91c2Vkb3duIixlLl9NT1VTRVVQX0VWRU5UX05BTUU9Im1vdXNldXAiLGUuX1dIRUVMX0VWRU5UX05BTUU9IndoZWVsIixlLl9EQkxDTElDS19FVkVOVF9OQU1FPSJkYmxjbGljayIsZX0pKGNidC5EaXNwYXRjaGVyKTtmYnQuTW91c2U9X2J0O3ZhciB5YnQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KHlidCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHZidD11TyxiYnQ9Rmd0LHhidD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXt2YXIgaT10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIGkuX3RyYW5zbGF0b3I9YmJ0LmdldFRyYW5zbGF0b3IobiksaS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltlLl9UT1VDSFNUQVJUX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHQpe3JldHVybiBpLl9tZWFzdXJlQW5kRGlzcGF0Y2gobix0LGUuX1RPVUNIU1RBUlRfRVZFTlRfTkFNRSwicGFnZSIpfSxpLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW2UuX1RPVUNITU9WRV9FVkVOVF9OQU1FXT1mdW5jdGlvbih0KXtyZXR1cm4gaS5fbWVhc3VyZUFuZERpc3BhdGNoKG4sdCxlLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSwicGFnZSIpfSxpLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW2UuX1RPVUNIRU5EX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHQpe3JldHVybiBpLl9tZWFzdXJlQW5kRGlzcGF0Y2gobix0LGUuX1RPVUNIRU5EX0VWRU5UX05BTUUsInBhZ2UiKX0saS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltlLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FXT1mdW5jdGlvbih0KXtyZXR1cm4gaS5fbWVhc3VyZUFuZERpc3BhdGNoKG4sdCxlLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FLCJwYWdlIil9LGl9cmV0dXJuIHZidC5fX2V4dGVuZHMoZSx0KSxlLmdldERpc3BhdGNoZXI9ZnVuY3Rpb24odCl7dmFyIG49dC5yb290KCkucm9vdEVsZW1lbnQoKSxpPW5bZS5fRElTUEFUQ0hFUl9LRVldO3JldHVybiBudWxsPT1pJiYoaT1uZXcgZSh0KSxuW2UuX0RJU1BBVENIRVJfS0VZXT1pKSxpfSxlLnByb3RvdHlwZS5vblRvdWNoU3RhcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQoZS5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FLHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZlRvdWNoU3RhcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQoZS5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FLHQpLHRoaXN9LGUucHJvdG90eXBlLm9uVG91Y2hNb3ZlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGUuX1RPVUNITU9WRV9FVkVOVF9OQU1FLHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZlRvdWNoTW92ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChlLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5vblRvdWNoRW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGUuX1RPVUNIRU5EX0VWRU5UX05BTUUsdCksdGhpc30sZS5wcm90b3R5cGUub2ZmVG91Y2hFbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQoZS5fVE9VQ0hFTkRfRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5vblRvdWNoQ2FuY2VsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGUuX1RPVUNIQ0FOQ0VMX0VWRU5UX05BTUUsdCksdGhpc30sZS5wcm90b3R5cGUub2ZmVG91Y2hDYW5jZWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQoZS5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5fbWVhc3VyZUFuZERpc3BhdGNoPWZ1bmN0aW9uKHQsZSxuLGkpe2lmKHZvaWQgMD09PWkmJihpPSJlbGVtZW50IiksInBhZ2UiIT09aSYmImVsZW1lbnQiIT09aSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc2NvcGUgJyIraSsiJywgbXVzdCBiZSAnZWxlbWVudCcgb3IgJ3BhZ2UnIik7aWYoImVsZW1lbnQiIT09aXx8dGhpcy5ldmVudEluc2lkZSh0LGUpKXtmb3IodmFyIHI9ZS5jaGFuZ2VkVG91Y2hlcyxvPXt9LGE9W10scz0wO3M8ci5sZW5ndGg7cysrKXt2YXIgbD1yW3NdLGM9bC5pZGVudGlmaWVyLHU9dGhpcy5fdHJhbnNsYXRvci5jb21wdXRlUG9zaXRpb24obC5jbGllbnRYLGwuY2xpZW50WSk7bnVsbCE9dSYmKG9bY109dSxhLnB1c2goYykpfWEubGVuZ3RoPjAmJnRoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChuLGEsbyxlKX19LGUucHJvdG90eXBlLmV2ZW50SW5zaWRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGJidC5UcmFuc2xhdG9yLmlzRXZlbnRJbnNpZGUodCxlKX0sZS5fRElTUEFUQ0hFUl9LRVk9Il9fUGxvdHRhYmxlX0Rpc3BhdGNoZXJfVG91Y2giLGUuX1RPVUNIU1RBUlRfRVZFTlRfTkFNRT0idG91Y2hzdGFydCIsZS5fVE9VQ0hNT1ZFX0VWRU5UX05BTUU9InRvdWNobW92ZSIsZS5fVE9VQ0hFTkRfRVZFTlRfTkFNRT0idG91Y2hlbmQiLGUuX1RPVUNIQ0FOQ0VMX0VWRU5UX05BTUU9InRvdWNoY2FuY2VsIixlfSkoY2J0LkRpc3BhdGNoZXIpO3lidC5Ub3VjaD14YnQsKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9dU87ZS5fX2V4cG9ydFN0YXIobGJ0LHQpLGUuX19leHBvcnRTdGFyKGZidCx0KSxlLl9fZXhwb3J0U3Rhcih5YnQsdCl9KShzYnQpO3ZhciB3YnQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KHdidCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFNidD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIHQ9dGhpczt0aGlzLl9hbmNob3JDYWxsYmFjaz1mdW5jdGlvbihlKXtyZXR1cm4gdC5fYW5jaG9yKGUpfSx0aGlzLl9lbmFibGVkPSEwfXJldHVybiB0LnByb3RvdHlwZS5hdHRhY2hUbz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZGlzY29ubmVjdCgpLHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG89dCx0aGlzLl9jb25uZWN0KCksdGhpc30sdC5wcm90b3R5cGUuZGV0YWNoRnJvbT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kZXRhY2goKX0sdC5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc2Nvbm5lY3QoKSx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvPW51bGwsdGhpc30sdC5wcm90b3R5cGUuZW5hYmxlZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9lbmFibGVkOih0aGlzLl9lbmFibGVkPXQsdGhpcy5fZW5hYmxlZD90aGlzLl9jb25uZWN0KCk6dGhpcy5fZGlzY29ubmVjdCgpLHRoaXMpfSx0LnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKHQpe3RoaXMuX2lzQW5jaG9yZWQ9ITB9LHQucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQ9ITF9LHQucHJvdG90eXBlLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ub3JpZ2luVG9Sb290KCk7cmV0dXJue3g6dC54LWUueCx5OnQueS1lLnl9fSx0LnByb3RvdHlwZS5faXNJbnNpZGVDb21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIDA8PXQueCYmMDw9dC55JiZ0Lng8PXRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ud2lkdGgoKSYmdC55PD10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLmhlaWdodCgpfSx0LnByb3RvdHlwZS5fY29ubmVjdD1mdW5jdGlvbigpe3RoaXMuZW5hYmxlZCgpJiZudWxsIT10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvJiYhdGhpcy5faXNBbmNob3JlZCYmdGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby5vbkFuY2hvcih0aGlzLl9hbmNob3JDYWxsYmFjayl9LHQucHJvdG90eXBlLl9kaXNjb25uZWN0PWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5fdW5hbmNob3IoKSxudWxsIT10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvJiZ0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLm9mZkFuY2hvcih0aGlzLl9hbmNob3JDYWxsYmFjayl9LHR9KSgpO3didC5JbnRlcmFjdGlvbj1TYnQsCi8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhYnQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBNYnQ9dU8sRWJ0PXNidCxUYnQ9Rmd0LENidD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5fY2xpY2tlZERvd249ITEsZS5fZG91YmxlQ2xpY2tpbmc9ITEsZS5fb25DbGlja0NhbGxiYWNrcz1uZXcgVGJ0LkNhbGxiYWNrU2V0LGUuX29uRG91YmxlQ2xpY2tDYWxsYmFja3M9bmV3IFRidC5DYWxsYmFja1NldCxlLl9tb3VzZURvd25DYWxsYmFjaz1mdW5jdGlvbih0LG4pe3JldHVybiBlLl9oYW5kbGVDbGlja0Rvd24odCxuKX0sZS5fbW91c2VVcENhbGxiYWNrPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuX2hhbmRsZUNsaWNrVXAodCxuKX0sZS5fZGJsQ2xpY2tDYWxsYmFjaz1mdW5jdGlvbih0LG4pe3JldHVybiBlLl9oYW5kbGVEYmxDbGljayh0LG4pfSxlLl90b3VjaFN0YXJ0Q2FsbGJhY2s9ZnVuY3Rpb24odCxuLGkpe3JldHVybiBlLl9oYW5kbGVDbGlja0Rvd24oblt0WzBdXSxpKX0sZS5fdG91Y2hFbmRDYWxsYmFjaz1mdW5jdGlvbih0LG4saSl7cmV0dXJuIGUuX2hhbmRsZUNsaWNrVXAoblt0WzBdXSxpKX0sZS5fdG91Y2hDYW5jZWxDYWxsYmFjaz1mdW5jdGlvbih0LG4pe3JldHVybiBlLl9jbGlja2VkRG93bj0hMX0sZX1yZXR1cm4gTWJ0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsZSksdGhpcy5fbW91c2VEaXNwYXRjaGVyPUVidC5Nb3VzZS5nZXREaXNwYXRjaGVyKGUpLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlRG93bih0aGlzLl9tb3VzZURvd25DYWxsYmFjayksdGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VVcCh0aGlzLl9tb3VzZVVwQ2FsbGJhY2spLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vbkRibENsaWNrKHRoaXMuX2RibENsaWNrQ2FsbGJhY2spLHRoaXMuX3RvdWNoRGlzcGF0Y2hlcj1FYnQuVG91Y2guZ2V0RGlzcGF0Y2hlcihlKSx0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayl9LGUucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZURvd24odGhpcy5fbW91c2VEb3duQ2FsbGJhY2spLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayksdGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZkRibENsaWNrKHRoaXMuX2RibENsaWNrQ2FsbGJhY2spLHRoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsLHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spLHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaENhbmNlbCh0aGlzLl90b3VjaENhbmNlbENhbGxiYWNrKSx0aGlzLl90b3VjaERpc3BhdGNoZXI9bnVsbH0sZS5wcm90b3R5cGUuX2hhbmRsZUNsaWNrRG93bj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UodCk7dGhpcy5faXNJbnNpZGVDb21wb25lbnQobikmJih0aGlzLl9jbGlja2VkRG93bj0hMCx0aGlzLl9jbGlja2VkUG9pbnQ9bil9LGUucHJvdG90eXBlLl9oYW5kbGVDbGlja1VwPWZ1bmN0aW9uKHQsbil7dmFyIGk9dGhpcyxyPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UodCk7dGhpcy5fY2xpY2tlZERvd24mJmUuX3BvaW50c0VxdWFsKHIsdGhpcy5fY2xpY2tlZFBvaW50KSYmc2V0VGltZW91dCgoZnVuY3Rpb24oKXtpLl9kb3VibGVDbGlja2luZ3x8aS5fb25DbGlja0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHIsbil9KSwwKSx0aGlzLl9jbGlja2VkRG93bj0hMX0sZS5wcm90b3R5cGUuX2hhbmRsZURibENsaWNrPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxpPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UodCk7dGhpcy5fZG91YmxlQ2xpY2tpbmc9ITAsdGhpcy5fb25Eb3VibGVDbGlja0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKGksZSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtyZXR1cm4gbi5fZG91YmxlQ2xpY2tpbmc9ITF9KSwwKX0sZS5fcG9pbnRzRXF1YWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC54PT09ZS54JiZ0Lnk9PT1lLnl9LGUucHJvdG90eXBlLm9uQ2xpY2s9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX29uQ2xpY2tDYWxsYmFja3MuYWRkKHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZkNsaWNrPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9vbkNsaWNrQ2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlLnByb3RvdHlwZS5vbkRvdWJsZUNsaWNrPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9vbkRvdWJsZUNsaWNrQ2FsbGJhY2tzLmFkZCh0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZEb3VibGVDbGljaz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fb25Eb3VibGVDbGlja0NhbGxiYWNrcy5kZWxldGUodCksdGhpc30sZX0pKHdidC5JbnRlcmFjdGlvbik7YWJ0LkNsaWNrPUNidDt2YXIgQWJ0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShBYnQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBrYnQ9dU8sTGJ0PXNidCxQYnQ9Rmd0LE5idD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXt2YXIgaT10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIGkuX2RyYWdnaW5nPSExLGkuX2NvbnN0cmFpbmVkVG9Db21wb25lbnQ9ITAsaS5fbW91c2VGaWx0ZXI9ZS5fREVGQVVMVF9NT1VTRV9GSUxURVIsaS5fZHJhZ1N0YXJ0Q2FsbGJhY2tzPW5ldyBQYnQuQ2FsbGJhY2tTZXQsaS5fZHJhZ0NhbGxiYWNrcz1uZXcgUGJ0LkNhbGxiYWNrU2V0LGkuX2RyYWdFbmRDYWxsYmFja3M9bmV3IFBidC5DYWxsYmFja1NldCxpLl9tb3VzZURvd25DYWxsYmFjaz1mdW5jdGlvbih0LGUpe3JldHVybiBpLl9zdGFydERyYWcodCxlKX0saS5fbW91c2VNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaS5fZG9EcmFnKHQsZSl9LGkuX21vdXNlVXBDYWxsYmFjaz1mdW5jdGlvbih0LGUpe3JldHVybiBpLl9lbmREcmFnKHQsZSl9LGkuX3RvdWNoU3RhcnRDYWxsYmFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGkuX3N0YXJ0RHJhZyhlW3RbMF1dLG4pfSxpLl90b3VjaE1vdmVDYWxsYmFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGkuX2RvRHJhZyhlW3RbMF1dLG4pfSxpLl90b3VjaEVuZENhbGxiYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaS5fZW5kRHJhZyhlW3RbMF1dLG4pfSxpLl9tb3VzZUJ1dHRvbj12b2lkIDAhPT1uP246MCxpfXJldHVybiBrYnQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX2FuY2hvcj1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5fYW5jaG9yLmNhbGwodGhpcyxlKSx0aGlzLl9tb3VzZURpc3BhdGNoZXI9TGJ0Lk1vdXNlLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyksdGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VEb3duKHRoaXMuX21vdXNlRG93bkNhbGxiYWNrKSx0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlVXAodGhpcy5fbW91c2VVcENhbGxiYWNrKSx0aGlzLl90b3VjaERpc3BhdGNoZXI9TGJ0LlRvdWNoLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyksdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spLHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoTW92ZSh0aGlzLl90b3VjaE1vdmVDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayl9LGUucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZURvd24odGhpcy5fbW91c2VEb3duQ2FsbGJhY2spLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayksdGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGwsdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKSx0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hNb3ZlKHRoaXMuX3RvdWNoTW92ZUNhbGxiYWNrKSx0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyPW51bGx9LGUucHJvdG90eXBlLl90cmFuc2xhdGVBbmRDb25zdHJhaW49ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZSh0KTtyZXR1cm4gdGhpcy5fY29uc3RyYWluZWRUb0NvbXBvbmVudD97eDpQYnQuTWF0aC5jbGFtcChlLngsMCx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkpLHk6UGJ0Lk1hdGguY2xhbXAoZS55LDAsdGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby5oZWlnaHQoKSl9OmV9LGUucHJvdG90eXBlLl9zdGFydERyYWc9ZnVuY3Rpb24odCxlKXtpZighKGUgaW5zdGFuY2VvZiBNb3VzZUV2ZW50KXx8dGhpcy5fbW91c2VGaWx0ZXIoZSkpe3ZhciBuPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UodCk7dGhpcy5faXNJbnNpZGVDb21wb25lbnQobikmJihlLnByZXZlbnREZWZhdWx0KCksdGhpcy5fZHJhZ2dpbmc9ITAsdGhpcy5fZHJhZ09yaWdpbj1uLHRoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMuX2RyYWdPcmlnaW4pKX19LGUucHJvdG90eXBlLl9kb0RyYWc9ZnVuY3Rpb24odCxlKXt0aGlzLl9kcmFnZ2luZyYmdGhpcy5fZHJhZ0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMuX2RyYWdPcmlnaW4sdGhpcy5fdHJhbnNsYXRlQW5kQ29uc3RyYWluKHQpKX0sZS5wcm90b3R5cGUuX2VuZERyYWc9ZnVuY3Rpb24odCxlKXtlIGluc3RhbmNlb2YgTW91c2VFdmVudCYmZS5idXR0b24hPT10aGlzLl9tb3VzZUJ1dHRvbnx8dGhpcy5fZHJhZ2dpbmcmJih0aGlzLl9kcmFnZ2luZz0hMSx0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcy5fZHJhZ09yaWdpbix0aGlzLl90cmFuc2xhdGVBbmRDb25zdHJhaW4odCkpKX0sZS5wcm90b3R5cGUuY29uc3RyYWluZWRUb0NvbXBvbmVudD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9jb25zdHJhaW5lZFRvQ29tcG9uZW50Oih0aGlzLl9jb25zdHJhaW5lZFRvQ29tcG9uZW50PXQsdGhpcyl9LGUucHJvdG90eXBlLm1vdXNlRmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLl9tb3VzZUZpbHRlcjoodGhpcy5fbW91c2VGaWx0ZXI9dCx0aGlzKX0sZS5wcm90b3R5cGUub25EcmFnU3RhcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUub2ZmRHJhZ1N0YXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZGVsZXRlKHQpLHRoaXN9LGUucHJvdG90eXBlLm9uRHJhZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZHJhZ0NhbGxiYWNrcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUub2ZmRHJhZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZHJhZ0NhbGxiYWNrcy5kZWxldGUodCksdGhpc30sZS5wcm90b3R5cGUub25EcmFnRW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmFkZCh0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZEcmFnRW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlLl9ERUZBVUxUX01PVVNFX0ZJTFRFUj1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXQuYnV0dG9ufSxlfSkod2J0LkludGVyYWN0aW9uKTtBYnQuRHJhZz1OYnQ7dmFyIElidD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoSWJ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgUmJ0PXVPLE9idD1zYnQsemJ0PUZndCxEYnQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUuX2tleVByZXNzQ2FsbGJhY2tzPXt9LGUuX2tleVJlbGVhc2VDYWxsYmFja3M9e30sZS5fbW91c2VNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24odCl7cmV0dXJuITF9LGUuX2Rvd25lZEtleXM9bmV3IHpidC5TZXQsZS5fa2V5RG93bkNhbGxiYWNrPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuX2hhbmRsZUtleURvd25FdmVudCh0LG4pfSxlLl9rZXlVcENhbGxiYWNrPWZ1bmN0aW9uKHQpe3JldHVybiBlLl9oYW5kbGVLZXlVcEV2ZW50KHQpfSxlfXJldHVybiBSYnQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX2FuY2hvcj1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5fYW5jaG9yLmNhbGwodGhpcyxlKSx0aGlzLl9wb3NpdGlvbkRpc3BhdGNoZXI9T2J0Lk1vdXNlLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyksdGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKSx0aGlzLl9rZXlEaXNwYXRjaGVyPU9idC5LZXkuZ2V0RGlzcGF0Y2hlcigpLHRoaXMuX2tleURpc3BhdGNoZXIub25LZXlEb3duKHRoaXMuX2tleURvd25DYWxsYmFjayksdGhpcy5fa2V5RGlzcGF0Y2hlci5vbktleVVwKHRoaXMuX2tleVVwQ2FsbGJhY2spfSxlLnByb3RvdHlwZS5fdW5hbmNob3I9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5fdW5hbmNob3IuY2FsbCh0aGlzKSx0aGlzLl9wb3NpdGlvbkRpc3BhdGNoZXIub2ZmTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKSx0aGlzLl9wb3NpdGlvbkRpc3BhdGNoZXI9bnVsbCx0aGlzLl9rZXlEaXNwYXRjaGVyLm9mZktleURvd24odGhpcy5fa2V5RG93bkNhbGxiYWNrKSx0aGlzLl9rZXlEaXNwYXRjaGVyLm9mZktleVVwKHRoaXMuX2tleVVwQ2FsbGJhY2spLHRoaXMuX2tleURpc3BhdGNoZXI9bnVsbH0sZS5wcm90b3R5cGUuX2hhbmRsZUtleURvd25FdmVudD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UodGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyLmxhc3RNb3VzZVBvc2l0aW9uKCkpO3RoaXMuX2lzSW5zaWRlQ29tcG9uZW50KG4pJiYhZS5yZXBlYXQmJih0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1t0XSYmdGhpcy5fa2V5UHJlc3NDYWxsYmFja3NbdF0uY2FsbENhbGxiYWNrcyh0KSx0aGlzLl9kb3duZWRLZXlzLmFkZCh0KSl9LGUucHJvdG90eXBlLl9oYW5kbGVLZXlVcEV2ZW50PWZ1bmN0aW9uKHQpe3RoaXMuX2Rvd25lZEtleXMuaGFzKHQpJiZ0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW3RdJiZ0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW3RdLmNhbGxDYWxsYmFja3ModCksdGhpcy5fZG93bmVkS2V5cy5kZWxldGUodCl9LGUucHJvdG90eXBlLm9uS2V5UHJlc3M9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fa2V5UHJlc3NDYWxsYmFja3NbdF18fCh0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1t0XT1uZXcgemJ0LkNhbGxiYWNrU2V0KSx0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1t0XS5hZGQoZSksdGhpc30sZS5wcm90b3R5cGUub2ZmS2V5UHJlc3M9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fa2V5UHJlc3NDYWxsYmFja3NbdF0uZGVsZXRlKGUpLDA9PT10aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1t0XS5zaXplJiZkZWxldGUgdGhpcy5fa2V5UHJlc3NDYWxsYmFja3NbdF0sdGhpc30sZS5wcm90b3R5cGUub25LZXlSZWxlYXNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3NbdF18fCh0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW3RdPW5ldyB6YnQuQ2FsbGJhY2tTZXQpLHRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3NbdF0uYWRkKGUpLHRoaXN9LGUucHJvdG90eXBlLm9mZktleVJlbGVhc2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1t0XS5kZWxldGUoZSksMD09PXRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3NbdF0uc2l6ZSYmZGVsZXRlIHRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3NbdF0sdGhpc30sZX0pKHdidC5JbnRlcmFjdGlvbik7SWJ0LktleT1EYnQ7dmFyIEJidD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoQmJ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgSGJ0PXVPLEZidD1FZHQsVmJ0PXNidCxVYnQ9Wnl0LGpidD1GZ3QsR2J0PW9idCxXYnQ9aXZ0LHFidD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZhciBpPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gaS5fd2hlZWxGaWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuITB9LGkuX3doZWVsQ2FsbGJhY2s9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaS5faGFuZGxlV2hlZWxFdmVudCh0LGUpfSxpLl90b3VjaFN0YXJ0Q2FsbGJhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBpLl9oYW5kbGVUb3VjaFN0YXJ0KHQsZSxuKX0saS5fdG91Y2hNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBpLl9oYW5kbGVQaW5jaCh0LGUsbil9LGkuX3RvdWNoRW5kQ2FsbGJhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBpLl9oYW5kbGVUb3VjaEVuZCh0LGUsbil9LGkuX3RvdWNoQ2FuY2VsQ2FsbGJhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBpLl9oYW5kbGVUb3VjaEVuZCh0LGUsbil9LGkuX3BhbkVuZENhbGxiYWNrcz1uZXcgamJ0LkNhbGxiYWNrU2V0LGkuX3pvb21FbmRDYWxsYmFja3M9bmV3IGpidC5DYWxsYmFja1NldCxpLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzPW5ldyBqYnQuQ2FsbGJhY2tTZXQsaS5feFNjYWxlcz1uZXcgamJ0LlNldCxpLl95U2NhbGVzPW5ldyBqYnQuU2V0LGkuX2RyYWdJbnRlcmFjdGlvbj1uZXcgR2J0LkRyYWcsaS5fc2V0dXBEcmFnSW50ZXJhY3Rpb24oKSxpLl90b3VjaElkcz1GYnQubWFwKCksaS5fbWluRG9tYWluRXh0ZW50cz1uZXcgamJ0Lk1hcCxpLl9tYXhEb21haW5FeHRlbnRzPW5ldyBqYnQuTWFwLGkuX21pbkRvbWFpblZhbHVlcz1uZXcgamJ0Lk1hcCxpLl9tYXhEb21haW5WYWx1ZXM9bmV3IGpidC5NYXAsbnVsbCE9ZSYmaS5hZGRYU2NhbGUoZSksbnVsbCE9biYmaS5hZGRZU2NhbGUobiksaX1yZXR1cm4gSGJ0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLmRyYWdJbnRlcmFjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb259LGUucHJvdG90eXBlLndoZWVsRmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLl93aGVlbEZpbHRlcjoodGhpcy5fd2hlZWxGaWx0ZXI9dCx0aGlzKX0sZS5wcm90b3R5cGUucGFuPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy54U2NhbGVzKCkuZm9yRWFjaCgoZnVuY3Rpb24obil7bi5wYW4oZS5fY29uc3RyYWluZWRUcmFuc2xhdGlvbihuLHQueCkpfSkpLHRoaXMueVNjYWxlcygpLmZvckVhY2goKGZ1bmN0aW9uKG4pe24ucGFuKGUuX2NvbnN0cmFpbmVkVHJhbnNsYXRpb24obix0LnkpKX0pKSx0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKX0sZS5wcm90b3R5cGUuem9vbT1mdW5jdGlvbih0LGUsbil7dmFyIGkscixvPXRoaXM7cmV0dXJuIHZvaWQgMD09PW4mJihuPSEwKSxudWxsIT1lJiYoaT1lLngscj1lLnksbiYmKHRoaXMueFNjYWxlcygpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPW8uX2NvbnN0cmFpbmVkWm9vbShlLHQsaSk7aT1uLmNlbnRlclBvaW50LHQ9bi56b29tQW1vdW50fSkpLHRoaXMueVNjYWxlcygpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPW8uX2NvbnN0cmFpbmVkWm9vbShlLHQscik7cj1uLmNlbnRlclBvaW50LHQ9bi56b29tQW1vdW50fSkpKSksdGhpcy54U2NhbGVzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49ZS5yYW5nZSgpO2Uuem9vbSh0LG51bGw9PWk/KG5bMV0rblswXSkvMjppKX0pKSx0aGlzLnlTY2FsZXMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1lLnJhbmdlKCk7ZS56b29tKHQsbnVsbD09cj8oblsxXStuWzBdKS8yOnIpfSkpLHRoaXMuX3Bhblpvb21VcGRhdGVDYWxsYmFja3MuY2FsbENhbGxiYWNrcygpLHt6b29tQW1vdW50OnQsY2VudGVyVmFsdWU6e2NlbnRlclg6aSxjZW50ZXJZOnJ9fX0sZS5wcm90b3R5cGUuX2FuY2hvcj1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5fYW5jaG9yLmNhbGwodGhpcyxlKSx0aGlzLl9kcmFnSW50ZXJhY3Rpb24uYXR0YWNoVG8oZSksdGhpcy5fbW91c2VEaXNwYXRjaGVyPVZidC5Nb3VzZS5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vbldoZWVsKHRoaXMuX3doZWVsQ2FsbGJhY2spLHRoaXMuX3RvdWNoRGlzcGF0Y2hlcj1WYnQuVG91Y2guZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKSx0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hNb3ZlKHRoaXMuX3RvdWNoTW92ZUNhbGxiYWNrKSx0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaEVuZCh0aGlzLl90b3VjaEVuZENhbGxiYWNrKSx0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaENhbmNlbCh0aGlzLl90b3VjaENhbmNlbENhbGxiYWNrKX0sZS5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuX3VuYW5jaG9yLmNhbGwodGhpcyksdGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZldoZWVsKHRoaXMuX3doZWVsQ2FsbGJhY2spLHRoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsLHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoTW92ZSh0aGlzLl90b3VjaE1vdmVDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spLHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaENhbmNlbCh0aGlzLl90b3VjaENhbmNlbENhbGxiYWNrKSx0aGlzLl90b3VjaERpc3BhdGNoZXI9bnVsbCx0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCl9LGUucHJvdG90eXBlLl9oYW5kbGVUb3VjaFN0YXJ0PWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9MDtpPHQubGVuZ3RoJiZ0aGlzLl90b3VjaElkcy5zaXplKCk8MjtpKyspe3ZhciByPXRbaV07dGhpcy5fdG91Y2hJZHMuc2V0KHIudG9TdHJpbmcoKSx0aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKGVbcl0pKX19LGUucHJvdG90eXBlLl9oYW5kbGVQaW5jaD1mdW5jdGlvbih0LG4saSl7dmFyIHI9dGhpcztpZighKHRoaXMuX3RvdWNoSWRzLnNpemUoKTwyKSl7dmFyIG89dGhpcy5fdG91Y2hJZHMudmFsdWVzKCk7aWYodGhpcy5faXNJbnNpZGVDb21wb25lbnQodGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShvWzBdKSkmJnRoaXMuX2lzSW5zaWRlQ29tcG9uZW50KHRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2Uob1sxXSkpKXt2YXIgYT1lLl9wb2ludERpc3RhbmNlKG9bMF0sb1sxXSk7aWYoMCE9PWEpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7ci5fdG91Y2hJZHMuaGFzKHQudG9TdHJpbmcoKSkmJnIuX3RvdWNoSWRzLnNldCh0LnRvU3RyaW5nKCksci5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShuW3RdKSl9KSk7dmFyIHM9dGhpcy5fdG91Y2hJZHMudmFsdWVzKCksbD1lLl9wb2ludERpc3RhbmNlKHNbMF0sc1sxXSk7aWYoMCE9PWwpe3ZhciBjPWEvbCx1PXMubWFwKChmdW5jdGlvbih0LGUpe3JldHVybnt4Oih0Lngtb1tlXS54KS9jLHk6KHQueS1vW2VdLnkpL2N9fSkpLGg9ZS5jZW50ZXJQb2ludChvWzBdLG9bMV0pLGQ9dGhpcy56b29tKGMsaCkscD1kLmNlbnRlclZhbHVlLGY9ZC56b29tQW1vdW50LG09cC5jZW50ZXJYLGc9cC5jZW50ZXJZLF89by5tYXAoKGZ1bmN0aW9uKHQsZSl7cmV0dXJue3g6dVtlXS54KmYrdC54LHk6dVtlXS55KmYrdC55fX0pKTt0aGlzLnBhbih7eDptLShfWzBdLngrX1sxXS54KS8yLHk6Zy0oX1swXS55K19bMV0ueSkvMn0pfX19fX0sZS5jZW50ZXJQb2ludD1mdW5jdGlvbih0LGUpe3ZhciBuPU1hdGgubWluKHQueCxlLngpLGk9TWF0aC5tYXgodC54LGUueCkscj1NYXRoLm1pbih0LnksZS55KTtyZXR1cm57eDoobitpKS8yLHk6KE1hdGgubWF4KHQueSxlLnkpK3IpLzJ9fSxlLl9wb2ludERpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5taW4odC54LGUueCksaT1NYXRoLm1heCh0LngsZS54KSxyPU1hdGgubWluKHQueSxlLnkpLG89TWF0aC5tYXgodC55LGUueSk7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhpLW4sMikrTWF0aC5wb3coby1yLDIpKX0sZS5wcm90b3R5cGUuX2hhbmRsZVRvdWNoRW5kPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzO3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7aS5fdG91Y2hJZHMucmVtb3ZlKHQudG9TdHJpbmcoKSl9KSksdGhpcy5fdG91Y2hJZHMuc2l6ZSgpPjAmJnRoaXMuX3pvb21FbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcygpfSxlLnByb3RvdHlwZS5faGFuZGxlV2hlZWxFdmVudD1mdW5jdGlvbih0LG4pe2lmKHRoaXMuX3doZWVsRmlsdGVyKG4pKXt2YXIgaT10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHQpO2lmKHRoaXMuX2lzSW5zaWRlQ29tcG9uZW50KGkpKXtuLnByZXZlbnREZWZhdWx0KCk7dmFyIHI9TWF0aC5wb3coMiwoMCE9PW4uZGVsdGFZP24uZGVsdGFZOm4uZGVsdGFYKSoobi5kZWx0YU1vZGU/ZS5fUElYRUxTX1BFUl9MSU5FOjEpKi4wMDIpO3RoaXMuem9vbShyLGkpLHRoaXMuX3pvb21FbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcygpfX19LGUucHJvdG90eXBlLl9jb25zdHJhaW5lZFpvb209ZnVuY3Rpb24odCxlLG4pe3JldHVybiBXYnQuY29uc3RyYWluZWRab29tKHQsZSxuLHRoaXMubWluRG9tYWluRXh0ZW50KHQpLHRoaXMubWF4RG9tYWluRXh0ZW50KHQpLHRoaXMubWluRG9tYWluVmFsdWUodCksdGhpcy5tYXhEb21haW5WYWx1ZSh0KSl9LGUucHJvdG90eXBlLl9jb25zdHJhaW5lZFRyYW5zbGF0aW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFdidC5jb25zdHJhaW5lZFRyYW5zbGF0aW9uKHQsZSx0aGlzLm1pbkRvbWFpblZhbHVlKHQpLHRoaXMubWF4RG9tYWluVmFsdWUodCkpfSxlLnByb3RvdHlwZS5fc2V0dXBEcmFnSW50ZXJhY3Rpb249ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXM7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmNvbnN0cmFpbmVkVG9Db21wb25lbnQoITEpLHRoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdTdGFydCgoZnVuY3Rpb24oKXtyZXR1cm4gdD1udWxsfSkpLHRoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWcoKGZ1bmN0aW9uKG4saSl7ZS5fdG91Y2hJZHMuc2l6ZSgpPj0yfHwoZS5wYW4oe3g6KG51bGw9PXQ/bi54OnQueCktaS54LHk6KG51bGw9PXQ/bi55OnQueSktaS55fSksdD1pKX0pKSx0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnRW5kKChmdW5jdGlvbigpe3JldHVybiBlLl9wYW5FbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcygpfSkpfSxlLnByb3RvdHlwZS5fbm9uTGluZWFyU2NhbGVXaXRoRXh0ZW50cz1mdW5jdGlvbih0KXtyZXR1cm4hKG51bGw9PXRoaXMubWluRG9tYWluRXh0ZW50KHQpfHxudWxsPT10aGlzLm1heERvbWFpbkV4dGVudCh0KXx8dCBpbnN0YW5jZW9mIFVidC5MaW5lYXJ8fHQgaW5zdGFuY2VvZiBVYnQuVGltZSl9LGUucHJvdG90eXBlLnhTY2FsZXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZihudWxsPT10KXt2YXIgbj1bXTtyZXR1cm4gdGhpcy5feFNjYWxlcy5mb3JFYWNoKChmdW5jdGlvbih0KXtuLnB1c2godCl9KSksbn1yZXR1cm4gdGhpcy5feFNjYWxlcz1uZXcgamJ0LlNldCx0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2UuYWRkWFNjYWxlKHQpfSkpLHRoaXN9LGUucHJvdG90eXBlLnlTY2FsZXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZihudWxsPT10KXt2YXIgbj1bXTtyZXR1cm4gdGhpcy5feVNjYWxlcy5mb3JFYWNoKChmdW5jdGlvbih0KXtuLnB1c2godCl9KSksbn1yZXR1cm4gdGhpcy5feVNjYWxlcz1uZXcgamJ0LlNldCx0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2UuYWRkWVNjYWxlKHQpfSkpLHRoaXN9LGUucHJvdG90eXBlLmFkZFhTY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5feFNjYWxlcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUucmVtb3ZlWFNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl94U2NhbGVzLmRlbGV0ZSh0KSx0aGlzLl9taW5Eb21haW5FeHRlbnRzLmRlbGV0ZSh0KSx0aGlzLl9tYXhEb21haW5FeHRlbnRzLmRlbGV0ZSh0KSx0aGlzLl9taW5Eb21haW5WYWx1ZXMuZGVsZXRlKHQpLHRoaXMuX21heERvbWFpblZhbHVlcy5kZWxldGUodCksdGhpc30sZS5wcm90b3R5cGUuYWRkWVNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl95U2NhbGVzLmFkZCh0KSx0aGlzfSxlLnByb3RvdHlwZS5yZW1vdmVZU2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3lTY2FsZXMuZGVsZXRlKHQpLHRoaXMuX21pbkRvbWFpbkV4dGVudHMuZGVsZXRlKHQpLHRoaXMuX21heERvbWFpbkV4dGVudHMuZGVsZXRlKHQpLHRoaXMuX21pbkRvbWFpblZhbHVlcy5kZWxldGUodCksdGhpcy5fbWF4RG9tYWluVmFsdWVzLmRlbGV0ZSh0KSx0aGlzfSxlLnByb3RvdHlwZS5taW5Eb21haW5FeHRlbnQ9ZnVuY3Rpb24odCxlKXtpZihudWxsPT1lKXJldHVybiB0aGlzLl9taW5Eb21haW5FeHRlbnRzLmdldCh0KTtpZihlLnZhbHVlT2YoKTwwKXRocm93IG5ldyBFcnJvcigiZXh0ZW50IG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7dmFyIG49dGhpcy5tYXhEb21haW5FeHRlbnQodCk7aWYobnVsbCE9biYmbi52YWx1ZU9mKCk8ZS52YWx1ZU9mKCkpdGhyb3cgbmV3IEVycm9yKCJtaW5Eb21haW5FeHRlbnQgbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4RG9tYWluRXh0ZW50IGZvciB0aGUgc2FtZSBTY2FsZSIpO3JldHVybiB0aGlzLl9ub25MaW5lYXJTY2FsZVdpdGhFeHRlbnRzKHQpJiZqYnQuV2luZG93Lndhcm4oIlBhbm5pbmcgYW5kIHpvb21pbmcgd2l0aCBleHRlbnRzIG9uIGEgbm9ubGluZWFyIHNjYWxlIG1heSBoYXZlIHVuaW50ZW5kZWQgYmVoYXZpb3IuIiksdGhpcy5fbWluRG9tYWluRXh0ZW50cy5zZXQodCxlKSx0aGlzfSxlLnByb3RvdHlwZS5tYXhEb21haW5FeHRlbnQ9ZnVuY3Rpb24odCxlKXtpZihudWxsPT1lKXJldHVybiB0aGlzLl9tYXhEb21haW5FeHRlbnRzLmdldCh0KTtpZihlLnZhbHVlT2YoKTw9MCl0aHJvdyBuZXcgRXJyb3IoImV4dGVudCBtdXN0IGJlIHBvc2l0aXZlIik7dmFyIG49dGhpcy5taW5Eb21haW5FeHRlbnQodCk7aWYobnVsbCE9biYmZS52YWx1ZU9mKCk8bi52YWx1ZU9mKCkpdGhyb3cgbmV3IEVycm9yKCJtYXhEb21haW5FeHRlbnQgbXVzdCBiZSBsYXJnZXIgdGhhbiBtaW5Eb21haW5FeHRlbnQgZm9yIHRoZSBzYW1lIFNjYWxlIik7cmV0dXJuIHRoaXMuX25vbkxpbmVhclNjYWxlV2l0aEV4dGVudHModCkmJmpidC5XaW5kb3cud2FybigiUGFubmluZyBhbmQgem9vbWluZyB3aXRoIGV4dGVudHMgb24gYSBub25saW5lYXIgc2NhbGUgbWF5IGhhdmUgdW5pbnRlbmRlZCBiZWhhdmlvci4iKSx0aGlzLl9tYXhEb21haW5FeHRlbnRzLnNldCh0LGUpLHRoaXN9LGUucHJvdG90eXBlLm1pbkRvbWFpblZhbHVlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PWU/dGhpcy5fbWluRG9tYWluVmFsdWVzLmdldCh0KToodGhpcy5fbWluRG9tYWluVmFsdWVzLnNldCh0LGUpLHRoaXMpfSxlLnByb3RvdHlwZS5tYXhEb21haW5WYWx1ZT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT1lP3RoaXMuX21heERvbWFpblZhbHVlcy5nZXQodCk6KHRoaXMuX21heERvbWFpblZhbHVlcy5zZXQodCxlKSx0aGlzKX0sZS5wcm90b3R5cGUuc2V0TWluTWF4RG9tYWluVmFsdWVzVG89ZnVuY3Rpb24odCl7dGhpcy5fbWluRG9tYWluVmFsdWVzLmRlbGV0ZSh0KSx0aGlzLl9tYXhEb21haW5WYWx1ZXMuZGVsZXRlKHQpO3ZhciBlPXQuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKSxuPWVbMV07cmV0dXJuIHRoaXMubWluRG9tYWluVmFsdWUodCxlWzBdKSx0aGlzLm1heERvbWFpblZhbHVlKHQsbiksdGhpc30sZS5wcm90b3R5cGUub25QYW5FbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhbkVuZENhbGxiYWNrcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUub2ZmUGFuRW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYW5FbmRDYWxsYmFja3MuZGVsZXRlKHQpLHRoaXN9LGUucHJvdG90eXBlLm9uWm9vbUVuZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fem9vbUVuZENhbGxiYWNrcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUub2ZmWm9vbUVuZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fem9vbUVuZENhbGxiYWNrcy5kZWxldGUodCksdGhpc30sZS5wcm90b3R5cGUub25QYW5ab29tVXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmFkZCh0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZQYW5ab29tVXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlLl9QSVhFTFNfUEVSX0xJTkU9MTIwLGV9KSh3YnQuSW50ZXJhY3Rpb24pO0JidC5QYW5ab29tPXFidDt2YXIgWWJ0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShZYnQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBYYnQ9dU8sJGJ0PXNidCxLYnQ9Rmd0LFpidD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5fb3ZlckNvbXBvbmVudD0hMSxlLl9wb2ludGVyRW50ZXJDYWxsYmFja3M9bmV3IEtidC5DYWxsYmFja1NldCxlLl9wb2ludGVyTW92ZUNhbGxiYWNrcz1uZXcgS2J0LkNhbGxiYWNrU2V0LGUuX3BvaW50ZXJFeGl0Q2FsbGJhY2tzPW5ldyBLYnQuQ2FsbGJhY2tTZXQsZS5fbW91c2VNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5faGFuZGxlTW91c2VFdmVudCh0LG4pfSxlLl90b3VjaFN0YXJ0Q2FsbGJhY2s9ZnVuY3Rpb24odCxuLGkpe3JldHVybiBlLl9oYW5kbGVUb3VjaEV2ZW50KG5bdFswXV0saSl9LGV9cmV0dXJuIFhidC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLGUpLHRoaXMuX21vdXNlRGlzcGF0Y2hlcj0kYnQuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKSx0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spLHRoaXMuX3RvdWNoRGlzcGF0Y2hlcj0kYnQuVG91Y2guZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKSx0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayl9LGUucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spLHRoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsLHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyPW51bGx9LGUucHJvdG90eXBlLl9oYW5kbGVNb3VzZUV2ZW50PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fbW91c2VEaXNwYXRjaGVyLmV2ZW50SW5zaWRlKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8sZSk7dGhpcy5faGFuZGxlUG9pbnRlckV2ZW50KHQsbil9LGUucHJvdG90eXBlLl9oYW5kbGVUb3VjaEV2ZW50PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fdG91Y2hEaXNwYXRjaGVyLmV2ZW50SW5zaWRlKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8sZSk7dGhpcy5faGFuZGxlUG9pbnRlckV2ZW50KHQsbil9LGUucHJvdG90eXBlLl9oYW5kbGVQb2ludGVyRXZlbnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHQpLGk9dGhpcy5faXNJbnNpZGVDb21wb25lbnQobik7aSYmZT8odGhpcy5fb3ZlckNvbXBvbmVudHx8dGhpcy5fcG9pbnRlckVudGVyQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MobiksdGhpcy5fcG9pbnRlck1vdmVDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhuKSk6dGhpcy5fb3ZlckNvbXBvbmVudCYmdGhpcy5fcG9pbnRlckV4aXRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhuKSx0aGlzLl9vdmVyQ29tcG9uZW50PWkmJmV9LGUucHJvdG90eXBlLm9uUG9pbnRlckVudGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wb2ludGVyRW50ZXJDYWxsYmFja3MuYWRkKHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZlBvaW50ZXJFbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcG9pbnRlckVudGVyQ2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlLnByb3RvdHlwZS5vblBvaW50ZXJNb3ZlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wb2ludGVyTW92ZUNhbGxiYWNrcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUub2ZmUG9pbnRlck1vdmU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BvaW50ZXJNb3ZlQ2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlLnByb3RvdHlwZS5vblBvaW50ZXJFeGl0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wb2ludGVyRXhpdENhbGxiYWNrcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUub2ZmUG9pbnRlckV4aXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BvaW50ZXJFeGl0Q2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlfSkod2J0LkludGVyYWN0aW9uKTtZYnQuUG9pbnRlcj1aYnQsKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9dU87ZS5fX2V4cG9ydFN0YXIoYWJ0LHQpLGUuX19leHBvcnRTdGFyKEFidCx0KSxlLl9fZXhwb3J0U3RhcihJYnQsdCksZS5fX2V4cG9ydFN0YXIoQmJ0LHQpLGUuX19leHBvcnRTdGFyKFlidCx0KSx0Lnpvb21PdXQ9aXZ0Lnpvb21PdXR9KShvYnQpO3ZhciBKYnQ9e307IShmdW5jdGlvbih0KXsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBlLG49dU8saT1GZ3Qscj1CZ3Q7IShmdW5jdGlvbih0KXt0W3QuVkFMVUU9MF09IlZBTFVFIix0W3QuUElYRUw9MV09IlBJWEVMIn0pKGU9dC5Qcm9wZXJ0eU1vZGV8fCh0LlByb3BlcnR5TW9kZT17fSkpO3ZhciBvPShmdW5jdGlvbih0KXtmdW5jdGlvbiByKCl7dmFyIG49dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBuLl9ib3hWaXNpYmxlPSExLG4uX2JveEJvdW5kcz17dG9wTGVmdDp7eDowLHk6MH0sYm90dG9tUmlnaHQ6e3g6MCx5OjB9fSxuLl94Qm91bmRzTW9kZT1lLlBJWEVMLG4uX3lCb3VuZHNNb2RlPWUuUElYRUwsbi5hZGRDbGFzcygic2VsZWN0aW9uLWJveC1sYXllciIpLG4uX2FkanVzdEJvdW5kc0NhbGxiYWNrPWZ1bmN0aW9uKCl7bi5yZW5kZXIoKX0sbi5fb3ZlcmZsb3dIaWRkZW49ITAsbi5feEV4dGVudD1bdm9pZCAwLHZvaWQgMF0sbi5feUV4dGVudD1bdm9pZCAwLHZvaWQgMF0sbn1yZXR1cm4gbi5fX2V4dGVuZHMocix0KSxyLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKSx0aGlzLl9ib3g9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgic2VsZWN0aW9uLWJveCIsITApLnJlbW92ZSgpLHRoaXMuX2JveEFyZWE9dGhpcy5fYm94LmFwcGVuZCgicmVjdCIpLmNsYXNzZWQoInNlbGVjdGlvbi1hcmVhIiwhMCl9LHIucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJue3dpZHRoOnQsaGVpZ2h0OmV9fSxyLnByb3RvdHlwZS5ib3VuZHM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZ2V0Qm91bmRzKCk6KHRoaXMuX3NldEJvdW5kcyh0KSx0aGlzLl94Qm91bmRzTW9kZT1lLlBJWEVMLHRoaXMuX3lCb3VuZHNNb2RlPWUuUElYRUwsdGhpcy5yZW5kZXIoKSx0aGlzKX0sci5wcm90b3R5cGUuX3NldEJvdW5kcz1mdW5jdGlvbih0KXt2YXIgZT17eDpNYXRoLm1pbih0LnRvcExlZnQueCx0LmJvdHRvbVJpZ2h0LngpLHk6TWF0aC5taW4odC50b3BMZWZ0LnksdC5ib3R0b21SaWdodC55KX0sbj17eDpNYXRoLm1heCh0LnRvcExlZnQueCx0LmJvdHRvbVJpZ2h0LngpLHk6TWF0aC5tYXgodC50b3BMZWZ0LnksdC5ib3R0b21SaWdodC55KX07dGhpcy5fYm94Qm91bmRzPXt0b3BMZWZ0OmUsYm90dG9tUmlnaHQ6bn19LHIucHJvdG90eXBlLl9nZXRCb3VuZHM9ZnVuY3Rpb24oKXtyZXR1cm57dG9wTGVmdDp7eDp0aGlzLl94Qm91bmRzTW9kZT09PWUuUElYRUw/dGhpcy5fYm94Qm91bmRzLnRvcExlZnQueDpudWxsPT10aGlzLl94U2NhbGU/MDpNYXRoLm1pbih0aGlzLnhTY2FsZSgpLnNjYWxlKHRoaXMueEV4dGVudCgpWzBdKSx0aGlzLnhTY2FsZSgpLnNjYWxlKHRoaXMueEV4dGVudCgpWzFdKSkseTp0aGlzLl95Qm91bmRzTW9kZT09PWUuUElYRUw/dGhpcy5fYm94Qm91bmRzLnRvcExlZnQueTpudWxsPT10aGlzLl95U2NhbGU/MDpNYXRoLm1pbih0aGlzLnlTY2FsZSgpLnNjYWxlKHRoaXMueUV4dGVudCgpWzBdKSx0aGlzLnlTY2FsZSgpLnNjYWxlKHRoaXMueUV4dGVudCgpWzFdKSl9LGJvdHRvbVJpZ2h0Ont4OnRoaXMuX3hCb3VuZHNNb2RlPT09ZS5QSVhFTD90aGlzLl9ib3hCb3VuZHMuYm90dG9tUmlnaHQueDpudWxsPT10aGlzLl94U2NhbGU/MDpNYXRoLm1heCh0aGlzLnhTY2FsZSgpLnNjYWxlKHRoaXMueEV4dGVudCgpWzBdKSx0aGlzLnhTY2FsZSgpLnNjYWxlKHRoaXMueEV4dGVudCgpWzFdKSkseTp0aGlzLl95Qm91bmRzTW9kZT09PWUuUElYRUw/dGhpcy5fYm94Qm91bmRzLmJvdHRvbVJpZ2h0Lnk6bnVsbD09dGhpcy5feVNjYWxlPzA6TWF0aC5tYXgodGhpcy55U2NhbGUoKS5zY2FsZSh0aGlzLnlFeHRlbnQoKVswXSksdGhpcy55U2NhbGUoKS5zY2FsZSh0aGlzLnlFeHRlbnQoKVsxXSkpfX19LHIucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7aWYodC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKSx0aGlzLl9ib3hWaXNpYmxlKXt2YXIgZT10aGlzLmJvdW5kcygpLG49ZS50b3BMZWZ0Lnkscj1lLmJvdHRvbVJpZ2h0Lnksbz1lLnRvcExlZnQueCxhPWUuYm90dG9tUmlnaHQueDtpZighKGkuTWF0aC5pc1ZhbGlkTnVtYmVyKG4pJiZpLk1hdGguaXNWYWxpZE51bWJlcihyKSYmaS5NYXRoLmlzVmFsaWROdW1iZXIobykmJmkuTWF0aC5pc1ZhbGlkTnVtYmVyKGEpKSl0aHJvdyBuZXcgRXJyb3IoImJvdW5kcyBoYXZlIG5vdCBiZWVuIHByb3Blcmx5IHNldCIpO3RoaXMuX2JveEFyZWEuYXR0cnMoe3g6byx5Om4sd2lkdGg6YS1vLGhlaWdodDpyLW59KSx0aGlzLmNvbnRlbnQoKS5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fYm94Lm5vZGUoKSl9ZWxzZSB0aGlzLl9ib3gucmVtb3ZlKCk7cmV0dXJuIHRoaXN9LHIucHJvdG90eXBlLmJveFZpc2libGU9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fYm94VmlzaWJsZToodGhpcy5fYm94VmlzaWJsZT10LHRoaXMucmVuZGVyKCksdGhpcyl9LHIucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sci5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sci5wcm90b3R5cGUueFNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX3hTY2FsZToobnVsbCE9dGhpcy5feFNjYWxlJiZ0aGlzLl94U2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKSx0aGlzLl94U2NhbGU9dCx0aGlzLl94Qm91bmRzTW9kZT1lLlZBTFVFLHRoaXMuX3hTY2FsZS5vblVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayksdGhpcy5yZW5kZXIoKSx0aGlzKX0sci5wcm90b3R5cGUueVNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX3lTY2FsZToobnVsbCE9dGhpcy5feVNjYWxlJiZ0aGlzLl95U2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKSx0aGlzLl95U2NhbGU9dCx0aGlzLl95Qm91bmRzTW9kZT1lLlZBTFVFLHRoaXMuX3lTY2FsZS5vblVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayksdGhpcy5yZW5kZXIoKSx0aGlzKX0sci5wcm90b3R5cGUueEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9nZXRYRXh0ZW50KCk6KHRoaXMuX3NldFhFeHRlbnQodCksdGhpcy5feEJvdW5kc01vZGU9ZS5WQUxVRSx0aGlzLnJlbmRlcigpLHRoaXMpfSxyLnByb3RvdHlwZS5fZ2V0WEV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl94Qm91bmRzTW9kZT09PWUuVkFMVUU/dGhpcy5feEV4dGVudDpudWxsPT10aGlzLl94U2NhbGU/W3ZvaWQgMCx2b2lkIDBdOlt0aGlzLl94U2NhbGUuaW52ZXJ0KHRoaXMuX2JveEJvdW5kcy50b3BMZWZ0LngpLHRoaXMuX3hTY2FsZS5pbnZlcnQodGhpcy5fYm94Qm91bmRzLmJvdHRvbVJpZ2h0LngpXX0sci5wcm90b3R5cGUuX3NldFhFeHRlbnQ9ZnVuY3Rpb24odCl7dGhpcy5feEV4dGVudD10fSxyLnByb3RvdHlwZS55RXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2dldFlFeHRlbnQoKToodGhpcy5fc2V0WUV4dGVudCh0KSx0aGlzLl95Qm91bmRzTW9kZT1lLlZBTFVFLHRoaXMucmVuZGVyKCksdGhpcyl9LHIucHJvdG90eXBlLl9nZXRZRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3lCb3VuZHNNb2RlPT09ZS5WQUxVRT90aGlzLl95RXh0ZW50Om51bGw9PXRoaXMuX3lTY2FsZT9bdm9pZCAwLHZvaWQgMF06W3RoaXMuX3lTY2FsZS5pbnZlcnQodGhpcy5fYm94Qm91bmRzLnRvcExlZnQueSksdGhpcy5feVNjYWxlLmludmVydCh0aGlzLl9ib3hCb3VuZHMuYm90dG9tUmlnaHQueSldfSxyLnByb3RvdHlwZS5fc2V0WUV4dGVudD1mdW5jdGlvbih0KXt0aGlzLl95RXh0ZW50PXR9LHIucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyksbnVsbCE9dGhpcy5feFNjYWxlJiZ0aGlzLnhTY2FsZSgpLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayksbnVsbCE9dGhpcy5feVNjYWxlJiZ0aGlzLnlTY2FsZSgpLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayl9LHJ9KShyLkNvbXBvbmVudCk7dC5TZWxlY3Rpb25Cb3hMYXllcj1vfSkoSmJ0KSwKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHJidCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFFidD11Tyx0eHQ9b2J0LGV4dD1GZ3Qsbnh0PWJtdCxpeHQ9aWJ0LHJ4dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gZS5fZGV0ZWN0aW9uUmFkaXVzPTMsZS5fcmVzaXphYmxlPSExLGUuX21vdmFibGU9ITEsZS5faGFzQ29ybmVycz0hMCxlLmFkZENsYXNzKCJkcmFnLWJveC1sYXllciIpLGUuX2RyYWdJbnRlcmFjdGlvbj1uZXcgdHh0LkRyYWcsZS5fc2V0VXBDYWxsYmFja3MoKSxlLl9kcmFnSW50ZXJhY3Rpb24uYXR0YWNoVG8oZSksZS5fZHJhZ1N0YXJ0Q2FsbGJhY2tzPW5ldyBleHQuQ2FsbGJhY2tTZXQsZS5fZHJhZ0NhbGxiYWNrcz1uZXcgZXh0LkNhbGxiYWNrU2V0LGUuX2RyYWdFbmRDYWxsYmFja3M9bmV3IGV4dC5DYWxsYmFja1NldCxlfXJldHVybiBRYnQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX3NldFVwQ2FsbGJhY2tzPWZ1bmN0aW9uKCl7dmFyIHQsZSxuLGkscj10aGlzLG89MCxhPWZ1bmN0aW9uKGEpe3Q9ci5fZ2V0UmVzaXppbmdFZGdlcyhhKTt2YXIgcz1yLmJvdW5kcygpLGw9cy50b3BMZWZ0Lng8PWEueCYmYS54PD1zLmJvdHRvbVJpZ2h0LngmJnMudG9wTGVmdC55PD1hLnkmJmEueTw9cy5ib3R0b21SaWdodC55O3IuYm94VmlzaWJsZSgpJiYodC50b3B8fHQuYm90dG9tfHx0LmxlZnR8fHQucmlnaHQpP289MTpyLmJveFZpc2libGUoKSYmci5tb3ZhYmxlKCkmJmw/bz0yOihvPTAsci5fc2V0Qm91bmRzKHt0b3BMZWZ0OmEsYm90dG9tUmlnaHQ6YX0pLHIuX3hCb3VuZHNNb2RlPT09aXh0LlByb3BlcnR5TW9kZS5WQUxVRSYmbnVsbCE9ci54U2NhbGUoKSYmci5fc2V0WEV4dGVudChbci54U2NhbGUoKS5pbnZlcnQoYS54KSxyLnhTY2FsZSgpLmludmVydChhLngpXSksci5feUJvdW5kc01vZGU9PT1peHQuUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT1yLnlTY2FsZSgpJiZyLl9zZXRZRXh0ZW50KFtyLnlTY2FsZSgpLmludmVydChhLnkpLHIueVNjYWxlKCkuaW52ZXJ0KGEueSldKSxyLnJlbmRlcigpKSxyLmJveFZpc2libGUoITApLHM9ci5ib3VuZHMoKSxlPXt4OnMudG9wTGVmdC54LHk6cy50b3BMZWZ0Lnl9LG49e3g6cy5ib3R0b21SaWdodC54LHk6cy5ib3R0b21SaWdodC55fSxpPWEsci5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3Mocyl9LHM9ZnVuY3Rpb24oYSxzKXtzd2l0Y2gobyl7Y2FzZSAwOm4ueD1zLngsbi55PXMueTticmVhaztjYXNlIDE6dC5ib3R0b20/bi55PXMueTp0LnRvcCYmKGUueT1zLnkpLHQucmlnaHQ/bi54PXMueDp0LmxlZnQmJihlLng9cy54KTticmVhaztjYXNlIDI6dmFyIGw9cy54LWkueCxjPXMueS1pLnk7ZS54Kz1sLGUueSs9YyxuLngrPWwsbi55Kz1jLGk9c31yLl9zZXRCb3VuZHMoe3RvcExlZnQ6ZSxib3R0b21SaWdodDpufSksci5feEJvdW5kc01vZGU9PT1peHQuUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT1yLnhTY2FsZSgpJiZyLl9zZXRYRXh0ZW50KFtyLnhTY2FsZSgpLmludmVydChlLngpLHIueFNjYWxlKCkuaW52ZXJ0KG4ueCldKSxyLl95Qm91bmRzTW9kZT09PWl4dC5Qcm9wZXJ0eU1vZGUuVkFMVUUmJm51bGwhPXIueVNjYWxlKCkmJnIuX3NldFlFeHRlbnQoW3IueVNjYWxlKCkuaW52ZXJ0KGUueSksci55U2NhbGUoKS5pbnZlcnQobi55KV0pLHIucmVuZGVyKCksci5fZHJhZ0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHIuYm91bmRzKCkpfSxsPWZ1bmN0aW9uKHQsZSl7MD09PW8mJnQueD09PWUueCYmdC55PT09ZS55JiZyLmJveFZpc2libGUoITEpLHIuX2RyYWdFbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhyLmJvdW5kcygpKX07dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ1N0YXJ0KGEpLHRoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWcocyksdGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZChsKSx0aGlzLl9kaXNjb25uZWN0SW50ZXJhY3Rpb249ZnVuY3Rpb24oKXtyLl9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZ1N0YXJ0KGEpLHIuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnKHMpLHIuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnRW5kKGwpLHIuX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKX19LGUucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dmFyIG49ZnVuY3Rpb24oKXtyZXR1cm4gZS5fYm94LmFwcGVuZCgibGluZSIpLnN0eWxlcyh7b3BhY2l0eTowLHN0cm9rZToicGluayIsInBvaW50ZXItZXZlbnRzIjoidmlzaWJsZVN0cm9rZSJ9KX07aWYodGhpcy5fZGV0ZWN0aW9uRWRnZVQ9bigpLmNsYXNzZWQoImRyYWctZWRnZS10YiIsITApLHRoaXMuX2RldGVjdGlvbkVkZ2VCPW4oKS5jbGFzc2VkKCJkcmFnLWVkZ2UtdGIiLCEwKSx0aGlzLl9kZXRlY3Rpb25FZGdlTD1uKCkuY2xhc3NlZCgiZHJhZy1lZGdlLWxyIiwhMCksdGhpcy5fZGV0ZWN0aW9uRWRnZVI9bigpLmNsYXNzZWQoImRyYWctZWRnZS1sciIsITApLHRoaXMuX2hhc0Nvcm5lcnMpe3ZhciBpPWZ1bmN0aW9uKCl7cmV0dXJuIGUuX2JveC5hcHBlbmQoImNpcmNsZSIpLnN0eWxlcyh7b3BhY2l0eTowLGZpbGw6InBpbmsiLCJwb2ludGVyLWV2ZW50cyI6InZpc2libGVGaWxsIn0pfTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJUTD1pKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItdGwiLCEwKSx0aGlzLl9kZXRlY3Rpb25Db3JuZXJUUj1pKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItdHIiLCEwKSx0aGlzLl9kZXRlY3Rpb25Db3JuZXJCTD1pKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItYmwiLCEwKSx0aGlzLl9kZXRlY3Rpb25Db3JuZXJCUj1pKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItYnIiLCEwKX19LGUucHJvdG90eXBlLl9nZXRSZXNpemluZ0VkZ2VzPWZ1bmN0aW9uKHQpe3ZhciBlPXt0b3A6ITEsYm90dG9tOiExLGxlZnQ6ITEscmlnaHQ6ITF9O2lmKCF0aGlzLnJlc2l6YWJsZSgpKXJldHVybiBlO3ZhciBuPXRoaXMuYm91bmRzKCksaT1uLnRvcExlZnQueSxyPW4uYm90dG9tUmlnaHQueSxvPW4udG9wTGVmdC54LGE9bi5ib3R0b21SaWdodC54LHM9dGhpcy5fZGV0ZWN0aW9uUmFkaXVzO3JldHVybiBvLXM8PXQueCYmdC54PD1hK3MmJihlLnRvcD1pLXM8PXQueSYmdC55PD1pK3MsZS5ib3R0b209ci1zPD10LnkmJnQueTw9citzKSxpLXM8PXQueSYmdC55PD1yK3MmJihlLmxlZnQ9by1zPD10LngmJnQueDw9bytzLGUucmlnaHQ9YS1zPD10LngmJnQueDw9YStzKSxlfSxlLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe2lmKHQucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyksdGhpcy5ib3hWaXNpYmxlKCkpe3ZhciBlPXRoaXMuYm91bmRzKCksbj1lLnRvcExlZnQueSxpPWUuYm90dG9tUmlnaHQueSxyPWUudG9wTGVmdC54LG89ZS5ib3R0b21SaWdodC54O3RoaXMuX2RldGVjdGlvbkVkZ2VULmF0dHJzKHt4MTpyLHkxOm4seDI6byx5MjpuLCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSksdGhpcy5fZGV0ZWN0aW9uRWRnZUIuYXR0cnMoe3gxOnIseTE6aSx4MjpvLHkyOmksInN0cm9rZS13aWR0aCI6Mip0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSx0aGlzLl9kZXRlY3Rpb25FZGdlTC5hdHRycyh7eDE6cix5MTpuLHgyOnIseTI6aSwic3Ryb2tlLXdpZHRoIjoyKnRoaXMuX2RldGVjdGlvblJhZGl1c30pLHRoaXMuX2RldGVjdGlvbkVkZ2VSLmF0dHJzKHt4MTpvLHkxOm4seDI6byx5MjppLCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSksdGhpcy5faGFzQ29ybmVycyYmKHRoaXMuX2RldGVjdGlvbkNvcm5lclRMLmF0dHJzKHtjeDpyLGN5Om4scjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSx0aGlzLl9kZXRlY3Rpb25Db3JuZXJUUi5hdHRycyh7Y3g6byxjeTpuLHI6dGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSksdGhpcy5fZGV0ZWN0aW9uQ29ybmVyQkwuYXR0cnMoe2N4OnIsY3k6aSxyOnRoaXMuX2RldGVjdGlvblJhZGl1c30pLHRoaXMuX2RldGVjdGlvbkNvcm5lckJSLmF0dHJzKHtjeDpvLGN5Omkscjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSl9cmV0dXJuIHRoaXN9LGUucHJvdG90eXBlLmRldGVjdGlvblJhZGl1cz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9kZXRlY3Rpb25SYWRpdXM7aWYodDwwKXRocm93IG5ldyBFcnJvcigiZGV0ZWN0aW9uIHJhZGl1cyBjYW5ub3QgYmUgbmVnYXRpdmUuIik7cmV0dXJuIHRoaXMuX2RldGVjdGlvblJhZGl1cz10LHRoaXMucmVuZGVyKCksdGhpc30sZS5wcm90b3R5cGUucmVzaXphYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX3Jlc2l6YWJsZToodGhpcy5fcmVzaXphYmxlPXQsdGhpcy5fc2V0UmVzaXphYmxlQ2xhc3Nlcyh0KSx0aGlzKX0sZS5wcm90b3R5cGUuX3NldFJlc2l6YWJsZUNsYXNzZXM9ZnVuY3Rpb24odCl7dCYmdGhpcy5lbmFibGVkKCk/KHRoaXMuYWRkQ2xhc3MoIngtcmVzaXphYmxlIiksdGhpcy5hZGRDbGFzcygieS1yZXNpemFibGUiKSk6KHRoaXMucmVtb3ZlQ2xhc3MoIngtcmVzaXphYmxlIiksdGhpcy5yZW1vdmVDbGFzcygieS1yZXNpemFibGUiKSl9LGUucHJvdG90eXBlLm1vdmFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fbW92YWJsZToodGhpcy5fbW92YWJsZT10LHRoaXMuX3NldE1vdmFibGVDbGFzcygpLHRoaXMpfSxlLnByb3RvdHlwZS5fc2V0TW92YWJsZUNsYXNzPWZ1bmN0aW9uKCl7dGhpcy5tb3ZhYmxlKCkmJnRoaXMuZW5hYmxlZCgpP3RoaXMuYWRkQ2xhc3MoIm1vdmFibGUiKTp0aGlzLnJlbW92ZUNsYXNzKCJtb3ZhYmxlIil9LGUucHJvdG90eXBlLm9uRHJhZ1N0YXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuYWRkKHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZkRyYWdTdGFydD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlLnByb3RvdHlwZS5vbkRyYWc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RyYWdDYWxsYmFja3MuYWRkKHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZkRyYWc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RyYWdDYWxsYmFja3MuZGVsZXRlKHQpLHRoaXN9LGUucHJvdG90eXBlLm9uRHJhZ0VuZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUub2ZmRHJhZ0VuZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUodCksdGhpc30sZS5wcm90b3R5cGUuZHJhZ0ludGVyYWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdJbnRlcmFjdGlvbn0sZS5wcm90b3R5cGUuZW5hYmxlZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9kcmFnSW50ZXJhY3Rpb24uZW5hYmxlZCgpOih0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZW5hYmxlZCh0KSx0aGlzLl9zZXRSZXNpemFibGVDbGFzc2VzKHRoaXMucmVzaXphYmxlKCkpLHRoaXMuX3NldE1vdmFibGVDbGFzcygpLHRoaXMpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyksdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZSh0KX0pKSx0aGlzLl9kcmFnQ2FsbGJhY2tzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZSh0KX0pKSx0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZSh0KX0pKSx0aGlzLl9kaXNjb25uZWN0SW50ZXJhY3Rpb24oKX0sZS5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc2V0U3RhdGUoKSx0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCksdC5wcm90b3R5cGUuZGV0YWNoLmNhbGwodGhpcyksdGhpc30sZS5wcm90b3R5cGUuYW5jaG9yPWZ1bmN0aW9uKGUpe3JldHVybiBlPW54dC5jb2VyY2VFeHRlcm5hbEQzKGUpLHRoaXMuX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyh0aGlzKSx0LnByb3RvdHlwZS5hbmNob3IuY2FsbCh0aGlzLGUpLHRoaXN9LGUucHJvdG90eXBlLl9yZXNldFN0YXRlPWZ1bmN0aW9uKCl7dGhpcy5ib3VuZHMoe3RvcExlZnQ6e3g6MCx5OjB9LGJvdHRvbVJpZ2h0Ont4OjAseTowfX0pfSxlfSkoSmJ0LlNlbGVjdGlvbkJveExheWVyKTtyYnQuRHJhZ0JveExheWVyPXJ4dDt2YXIgb3h0PXt9LGF4dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KGF4dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHN4dCxseHQ9dU8sY3h0PUZndCx1eHQ9Qmd0OyEoZnVuY3Rpb24odCl7dFt0LlZBTFVFPTBdPSJWQUxVRSIsdFt0LlBJWEVMPTFdPSJQSVhFTCJ9KShzeHR8fChzeHQ9e30pKTt2YXIgaHh0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciBpPXQuY2FsbCh0aGlzKXx8dGhpcztpZihpLl9tb2RlPXN4dC5WQUxVRSxuIT09ZS5PUklFTlRBVElPTl9WRVJUSUNBTCYmbiE9PWUuT1JJRU5UQVRJT05fSE9SSVpPTlRBTCl0aHJvdyBuZXcgRXJyb3IobisiIGlzIG5vdCBhIHZhbGlkIG9yaWVudGF0aW9uIGZvciBHdWlkZUxpbmVMYXllciIpO3JldHVybiBpLl9vcmllbnRhdGlvbj1uLGkuX292ZXJmbG93SGlkZGVuPSEwLGkuYWRkQ2xhc3MoImd1aWRlLWxpbmUtbGF5ZXIiKSxpLl9pc1ZlcnRpY2FsKCk/aS5hZGRDbGFzcygidmVydGljYWwiKTppLmFkZENsYXNzKCJob3Jpem9udGFsIiksaS5fc2NhbGVVcGRhdGVDYWxsYmFjaz1mdW5jdGlvbigpe2kuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWUoKSxpLnJlbmRlcigpfSxpfXJldHVybiBseHQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyksdGhpcy5fZ3VpZGVMaW5lPXRoaXMuY29udGVudCgpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImd1aWRlLWxpbmUiLCEwKX0sZS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm57d2lkdGg6dCxoZWlnaHQ6ZX19LGUucHJvdG90eXBlLl9pc1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGF0aW9uPT09ZS5PUklFTlRBVElPTl9WRVJUSUNBTH0sZS5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiEwfSxlLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiEwfSxlLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKGUsbixpKXtyZXR1cm4gdC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsZSxuLGkpLG51bGwhPXRoaXMuc2NhbGUoKSYmKHRoaXMuX2lzVmVydGljYWwoKT90aGlzLnNjYWxlKCkucmFuZ2UoWzAsdGhpcy53aWR0aCgpXSk6dGhpcy5zY2FsZSgpLnJhbmdlKFt0aGlzLmhlaWdodCgpLDBdKSksdGhpc30sZS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtyZXR1cm4gdC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKSx0aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCksdGhpcy5fZ3VpZGVMaW5lLmF0dHJzKHt4MTp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6MCx5MTp0aGlzLl9pc1ZlcnRpY2FsKCk/MDp0aGlzLnBpeGVsUG9zaXRpb24oKSx4Mjp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6dGhpcy53aWR0aCgpLHkyOnRoaXMuX2lzVmVydGljYWwoKT90aGlzLmhlaWdodCgpOnRoaXMucGl4ZWxQb3NpdGlvbigpfSksdGhpc30sZS5wcm90b3R5cGUuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWU9ZnVuY3Rpb24oKXtudWxsIT10aGlzLnNjYWxlKCkmJih0aGlzLl9tb2RlPT09c3h0LlZBTFVFJiZudWxsIT10aGlzLnZhbHVlKCk/dGhpcy5fcGl4ZWxQb3NpdGlvbj10aGlzLnNjYWxlKCkuc2NhbGUodGhpcy52YWx1ZSgpKTp0aGlzLl9tb2RlPT09c3h0LlBJWEVMJiZudWxsIT10aGlzLnBpeGVsUG9zaXRpb24oKSYmKHRoaXMuX3ZhbHVlPXRoaXMuc2NhbGUoKS5pbnZlcnQodGhpcy5waXhlbFBvc2l0aW9uKCkpKSl9LGUucHJvdG90eXBlLl9zZXRQaXhlbFBvc2l0aW9uV2l0aG91dENoYW5naW5nTW9kZT1mdW5jdGlvbih0KXt0aGlzLl9waXhlbFBvc2l0aW9uPXQsbnVsbCE9dGhpcy5zY2FsZSgpJiYodGhpcy5fdmFsdWU9dGhpcy5zY2FsZSgpLmludmVydCh0aGlzLnBpeGVsUG9zaXRpb24oKSkpLHRoaXMucmVuZGVyKCl9LGUucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3NjYWxlO3ZhciBlPXRoaXMuX3NjYWxlO3JldHVybiBudWxsIT1lJiZlLm9mZlVwZGF0ZSh0aGlzLl9zY2FsZVVwZGF0ZUNhbGxiYWNrKSx0aGlzLl9zY2FsZT10LHRoaXMuX3NjYWxlLm9uVXBkYXRlKHRoaXMuX3NjYWxlVXBkYXRlQ2FsbGJhY2spLHRoaXMuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWUoKSx0aGlzLnJlZHJhdygpLHRoaXN9LGUucHJvdG90eXBlLnZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX3ZhbHVlOih0aGlzLl92YWx1ZT10LHRoaXMuX21vZGU9c3h0LlZBTFVFLHRoaXMuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWUoKSx0aGlzLnJlbmRlcigpLHRoaXMpfSxlLnByb3RvdHlwZS5waXhlbFBvc2l0aW9uPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3BpeGVsUG9zaXRpb247aWYoIWN4dC5NYXRoLmlzVmFsaWROdW1iZXIodCkpdGhyb3cgbmV3IEVycm9yKCJwaXhlbFBvc2l0aW9uIG11c3QgYmUgYSBmaW5pdGUgbnVtYmVyIik7cmV0dXJuIHRoaXMuX3BpeGVsUG9zaXRpb249dCx0aGlzLl9tb2RlPXN4dC5QSVhFTCx0aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCksdGhpcy5yZW5kZXIoKSx0aGlzfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpLG51bGwhPXRoaXMuc2NhbGUoKSYmdGhpcy5zY2FsZSgpLm9mZlVwZGF0ZSh0aGlzLl9zY2FsZVVwZGF0ZUNhbGxiYWNrKX0sZS5PUklFTlRBVElPTl9WRVJUSUNBTD0idmVydGljYWwiLGUuT1JJRU5UQVRJT05fSE9SSVpPTlRBTD0iaG9yaXpvbnRhbCIsZX0pKHV4dC5Db21wb25lbnQpO2F4dC5HdWlkZUxpbmVMYXllcj1oeHQsCi8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShveHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBkeHQ9dU8scHh0PW9idCxmeHQ9Rmd0LG14dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10LmNhbGwodGhpcyxlKXx8dGhpcztuLl9kZXRlY3Rpb25SYWRpdXM9MyxuLl9lbmFibGVkPSEwLG4uYWRkQ2xhc3MoImRyYWctbGluZS1sYXllciIpLG4uYWRkQ2xhc3MoImVuYWJsZWQiKSxuLl9kcmFnSW50ZXJhY3Rpb249bmV3IHB4dC5EcmFnLG4uX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyhuKTt2YXIgaT0hMSxyPWZ1bmN0aW9uKHQpeyhmdW5jdGlvbih0KXtyZXR1cm4gbi5faXNWZXJ0aWNhbCgpJiZuLnBpeGVsUG9zaXRpb24oKS1uLmRldGVjdGlvblJhZGl1cygpPD10LngmJnQueDw9bi5waXhlbFBvc2l0aW9uKCkrbi5kZXRlY3Rpb25SYWRpdXMoKXx8IW4uX2lzVmVydGljYWwoKSYmbi5waXhlbFBvc2l0aW9uKCktbi5kZXRlY3Rpb25SYWRpdXMoKTw9dC55JiZ0Lnk8PW4ucGl4ZWxQb3NpdGlvbigpK24uZGV0ZWN0aW9uUmFkaXVzKCl9KSh0KSYmKGk9ITAsbi5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3MobikpfTtuLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQocik7dmFyIG89ZnVuY3Rpb24odCxlKXtpJiYobi5fc2V0UGl4ZWxQb3NpdGlvbldpdGhvdXRDaGFuZ2luZ01vZGUobi5faXNWZXJ0aWNhbCgpP2UueDplLnkpLG4uX2RyYWdDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhuKSl9O24uX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWcobyk7dmFyIGE9ZnVuY3Rpb24odCxlKXtpJiYoaT0hMSxuLl9kcmFnRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MobikpfTtyZXR1cm4gbi5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZChhKSxuLl9kaXNjb25uZWN0SW50ZXJhY3Rpb249ZnVuY3Rpb24oKXtuLl9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZ1N0YXJ0KHIpLG4uX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnKG8pLG4uX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnRW5kKGEpLG4uX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKX0sbi5fZHJhZ1N0YXJ0Q2FsbGJhY2tzPW5ldyBmeHQuQ2FsbGJhY2tTZXQsbi5fZHJhZ0NhbGxiYWNrcz1uZXcgZnh0LkNhbGxiYWNrU2V0LG4uX2RyYWdFbmRDYWxsYmFja3M9bmV3IGZ4dC5DYWxsYmFja1NldCxufXJldHVybiBkeHQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyksdGhpcy5fZGV0ZWN0aW9uRWRnZT10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImxpbmUiKS5zdHlsZXMoe29wYWNpdHk6MCxzdHJva2U6InBpbmsiLCJwb2ludGVyLWV2ZW50cyI6InZpc2libGVTdHJva2UifSkuY2xhc3NlZCgiZHJhZy1lZGdlIiwhMCl9LGUucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyksdGhpcy5fZGV0ZWN0aW9uRWRnZS5hdHRycyh7eDE6dGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMucGl4ZWxQb3NpdGlvbigpOjAseTE6dGhpcy5faXNWZXJ0aWNhbCgpPzA6dGhpcy5waXhlbFBvc2l0aW9uKCkseDI6dGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMucGl4ZWxQb3NpdGlvbigpOnRoaXMud2lkdGgoKSx5Mjp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLnBpeGVsUG9zaXRpb24oKSwic3Ryb2tlLXdpZHRoIjoyKnRoaXMuX2RldGVjdGlvblJhZGl1c30pLHRoaXN9LGUucHJvdG90eXBlLmRldGVjdGlvblJhZGl1cz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9kZXRlY3Rpb25SYWRpdXM7aWYodDwwKXRocm93IG5ldyBFcnJvcigiZGV0ZWN0aW9uIHJhZGl1cyBjYW5ub3QgYmUgbmVnYXRpdmUuIik7cmV0dXJuIHRoaXMuX2RldGVjdGlvblJhZGl1cz10LHRoaXMucmVuZGVyKCksdGhpc30sZS5wcm90b3R5cGUuZW5hYmxlZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9lbmFibGVkOih0aGlzLl9lbmFibGVkPXQsdD90aGlzLmFkZENsYXNzKCJlbmFibGVkIik6dGhpcy5yZW1vdmVDbGFzcygiZW5hYmxlZCIpLHRoaXMuX2RyYWdJbnRlcmFjdGlvbi5lbmFibGVkKHQpLHRoaXMpfSxlLnByb3RvdHlwZS5vbkRyYWdTdGFydD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmFkZCh0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZEcmFnU3RhcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUodCksdGhpc30sZS5wcm90b3R5cGUub25EcmFnPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kcmFnQ2FsbGJhY2tzLmFkZCh0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZEcmFnPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlLnByb3RvdHlwZS5vbkRyYWdFbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RyYWdFbmRDYWxsYmFja3MuYWRkKHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZkRyYWdFbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RyYWdFbmRDYWxsYmFja3MuZGVsZXRlKHQpLHRoaXN9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3QucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKSx0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUodCl9KSksdGhpcy5fZHJhZ0NhbGxiYWNrcy5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fZHJhZ0NhbGxiYWNrcy5kZWxldGUodCl9KSksdGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUodCl9KSksdGhpcy5fZGlzY29ubmVjdEludGVyYWN0aW9uKCl9LGV9KShheHQuR3VpZGVMaW5lTGF5ZXIpO294dC5EcmFnTGluZUxheWVyPW14dDt2YXIgZ3h0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShneHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBfeHQ9dU87ZnVuY3Rpb24geXh0KHQsZSxuKXt2YXIgaT17fTtpZih2b2lkIDAhPT1uKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKWlbbltyXV09bltyLTFdO3JldHVybiBmdW5jdGlvbihuKXt2YXIgcixvPXQuc2NhbGUobik7aWYoIWUpcmV0dXJuIG87dmFyIGE9dm9pZCAwPT09aVtuXT92b2lkIDA6dC5zY2FsZShpW25dKTtyZXR1cm4gdm9pZCAwIT09YSYmKHI9YSsoby1hKS8yKSxyfX12YXIgdnh0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7dmFyIGk9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBpLmFkZENsYXNzKCJncmlkbGluZXMiKSxpLl94U2NhbGU9ZSxpLl95U2NhbGU9bixpLl9yZW5kZXJDYWxsYmFjaz1mdW5jdGlvbih0KXtyZXR1cm4gaS5yZW5kZXIoKX0saS5feFNjYWxlJiZpLl94U2NhbGUub25VcGRhdGUoaS5fcmVuZGVyQ2FsbGJhY2spLGkuX3lTY2FsZSYmaS5feVNjYWxlLm9uVXBkYXRlKGkuX3JlbmRlckNhbGxiYWNrKSxpfXJldHVybiBfeHQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuYmV0d2Vlblg9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQ/dGhpcy5fYmV0d2Vlblg6KHQhPT10aGlzLl9iZXR3ZWVuWCYmKHRoaXMuX2JldHdlZW5YPXQsdGhpcy5yZW5kZXIoKSksdGhpcyl9LGUucHJvdG90eXBlLmJldHdlZW5ZPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10P3RoaXMuX2JldHdlZW5ZOih0IT09dGhpcy5fYmV0d2VlblkmJih0aGlzLl9iZXR3ZWVuWT10LHRoaXMucmVuZGVyKCkpLHRoaXMpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKSx0aGlzLl94U2NhbGUmJnRoaXMuX3hTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spLHRoaXMuX3lTY2FsZSYmdGhpcy5feVNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZW5kZXJDYWxsYmFjayksdGhpc30sZS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyksdGhpcy5feExpbmVzQ29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoIngtZ3JpZGxpbmVzIiwhMCksdGhpcy5feUxpbmVzQ29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoInktZ3JpZGxpbmVzIiwhMCl9LGUucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyksdGhpcy5fcmVkcmF3WExpbmVzKCksdGhpcy5fcmVkcmF3WUxpbmVzKCksdGhpc30sZS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihlLG4saSl7cmV0dXJuIHQucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLGUsbixpKSxudWxsIT10aGlzLl94U2NhbGUmJnRoaXMuX3hTY2FsZS5yYW5nZShbMCx0aGlzLndpZHRoKCldKSxudWxsIT10aGlzLl95U2NhbGUmJnRoaXMuX3lTY2FsZS5yYW5nZShbdGhpcy5oZWlnaHQoKSwwXSksdGhpc30sZS5wcm90b3R5cGUuX3JlZHJhd1hMaW5lcz1mdW5jdGlvbigpe2lmKHRoaXMuX3hTY2FsZSl7dmFyIHQ9dGhpcy5iZXR3ZWVuWCgpLGU9dGhpcy5feFNjYWxlLnRpY2tzKCkuc2xpY2UodD8xOjApLG49dGhpcy5feExpbmVzQ29udGFpbmVyLnNlbGVjdEFsbCgibGluZSIpLmRhdGEoZSk7bi5lbnRlcigpLmFwcGVuZCgibGluZSIpLm1lcmdlKG4pLmF0dHIoIngxIix5eHQodGhpcy5feFNjYWxlLHQsdGhpcy5feFNjYWxlLnRpY2tzKCkpKS5hdHRyKCJ5MSIsMCkuYXR0cigieDIiLHl4dCh0aGlzLl94U2NhbGUsdCx0aGlzLl94U2NhbGUudGlja3MoKSkpLmF0dHIoInkyIix0aGlzLmhlaWdodCgpKS5jbGFzc2VkKCJiZXR3ZWVubGluZSIsdCkuY2xhc3NlZCgiemVyb2xpbmUiLChmdW5jdGlvbih0KXtyZXR1cm4gMD09PXR9KSksbi5leGl0KCkucmVtb3ZlKCl9fSxlLnByb3RvdHlwZS5fcmVkcmF3WUxpbmVzPWZ1bmN0aW9uKCl7aWYodGhpcy5feVNjYWxlKXt2YXIgdD10aGlzLmJldHdlZW5ZKCksZT10aGlzLl95U2NhbGUudGlja3MoKS5zbGljZSh0PzE6MCksbj10aGlzLl95TGluZXNDb250YWluZXIuc2VsZWN0QWxsKCJsaW5lIikuZGF0YShlKTtuLmVudGVyKCkuYXBwZW5kKCJsaW5lIikubWVyZ2UobikuYXR0cigieDEiLDApLmF0dHIoInkxIix5eHQodGhpcy5feVNjYWxlLHQsdGhpcy5feVNjYWxlLnRpY2tzKCkpKS5hdHRyKCJ4MiIsdGhpcy53aWR0aCgpKS5hdHRyKCJ5MiIseXh0KHRoaXMuX3lTY2FsZSx0LHRoaXMuX3lTY2FsZS50aWNrcygpKSkuY2xhc3NlZCgiYmV0d2VlbmxpbmUiLHQpLmNsYXNzZWQoInplcm9saW5lIiwoZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10fSkpLG4uZXhpdCgpLnJlbW92ZSgpfX0sZX0pKEJndC5Db21wb25lbnQpO2d4dC5HcmlkbGluZXM9dnh0O3ZhciBieHQ9e30seHh0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoeHh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgd3h0PXVPLFN4dD1ibXQsTXh0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBlLl9kZXRhY2hDYWxsYmFjaz1mdW5jdGlvbih0KXtyZXR1cm4gZS5yZW1vdmUodCl9LGV9cmV0dXJuIHd4dC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5hbmNob3I9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztyZXR1cm4gZT1TeHQuY29lcmNlRXh0ZXJuYWxEMyhlKSx0LnByb3RvdHlwZS5hbmNob3IuY2FsbCh0aGlzLGUpLHRoaXMuX2ZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiB0LmFuY2hvcihuLmVsZW1lbnQoKSl9KSksdGhpc30sZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlbmRlcigpfSkpLHRoaXN9LGUucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoImhhcygpIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiBDb21wb25lbnRDb250YWluZXIiKX0sZS5wcm90b3R5cGUuX2Fkb3B0QW5kQW5jaG9yPWZ1bmN0aW9uKHQpe3QucGFyZW50KHRoaXMpLHQub25EZXRhY2godGhpcy5fZGV0YWNoQ2FsbGJhY2spLHRoaXMuX2lzQW5jaG9yZWQmJnQuYW5jaG9yKHRoaXMuZWxlbWVudCgpKX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmhhcyh0KSYmKHQub2ZmRGV0YWNoKHRoaXMuX2RldGFjaENhbGxiYWNrKSx0aGlzLl9yZW1vdmUodCksdC5kZXRhY2goKSx0aGlzLnJlZHJhdygpKSx0aGlzfSxlLnByb3RvdHlwZS5fcmVtb3ZlPWZ1bmN0aW9uKHQpe3JldHVybiExfSxlLnByb3RvdHlwZS5fZm9yRWFjaD1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoIl9mb3JFYWNoKCkgaXMgbm90IGltcGxlbWVudGVkIG9uIENvbXBvbmVudENvbnRhaW5lciIpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpLHRoaXMuX2ZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiB0LmRlc3Ryb3koKX0pKX0sZS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dGhpcy5fZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuaW52YWxpZGF0ZUNhY2hlKCl9KSl9LGV9KShCZ3QuQ29tcG9uZW50KTt4eHQuQ29tcG9uZW50Q29udGFpbmVyPU14dCwKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KGJ4dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIEV4dD11TyxUeHQ9Rmd0LEN4dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT1bXSk7dmFyIG49dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBuLl9jb21wb25lbnRzPVtdLG4uYWRkQ2xhc3MoImNvbXBvbmVudC1ncm91cCIpLGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIG4uYXBwZW5kKHQpfSkpLG59cmV0dXJuIEV4dC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fZm9yRWFjaD1mdW5jdGlvbih0KXt0aGlzLmNvbXBvbmVudHMoKS5mb3JFYWNoKHQpfSxlLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudHMuaW5kZXhPZih0KT49MH0sZS5wcm90b3R5cGUucmVxdWVzdGVkU3BhY2U9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9jb21wb25lbnRzLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIG4ucmVxdWVzdGVkU3BhY2UodCxlKX0pKTtyZXR1cm57bWluV2lkdGg6VHh0Lk1hdGgubWF4KG4sKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm1pbldpZHRofSksMCksbWluSGVpZ2h0OlR4dC5NYXRoLm1heChuLChmdW5jdGlvbih0KXtyZXR1cm4gdC5taW5IZWlnaHR9KSwwKX19LGUucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oZSxuLGkpe3ZhciByPXRoaXM7cmV0dXJuIHQucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLGUsbixpKSx0aGlzLl9mb3JFYWNoKChmdW5jdGlvbih0KXt0LmNvbXB1dGVMYXlvdXQoe3g6MCx5OjB9LHIud2lkdGgoKSxyLmhlaWdodCgpKX0pKSx0aGlzfSxlLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbih0LGUpe3JldHVybnt3aWR0aDp0LGhlaWdodDplfX0sZS5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnRzLmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gdC5maXhlZFdpZHRoKCl9KSl9LGUucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudHMuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmZpeGVkSGVpZ2h0KCl9KSl9LGUucHJvdG90eXBlLmNvbXBvbmVudHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29tcG9uZW50cy5zbGljZSgpfSxlLnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXR8fHRoaXMuaGFzKHQpfHwodC5kZXRhY2goKSx0aGlzLl9jb21wb25lbnRzLnB1c2godCksdGhpcy5fYWRvcHRBbmRBbmNob3IodCksdGhpcy5yZWRyYXcoKSksdGhpc30sZS5wcm90b3R5cGUuX3JlbW92ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9jb21wb25lbnRzLmluZGV4T2YodCk7cmV0dXJuIGU+PTAmJih0aGlzLl9jb21wb25lbnRzLnNwbGljZShlLDEpLCEwKX0sZX0pKHh4dC5Db21wb25lbnRDb250YWluZXIpO2J4dC5Hcm91cD1DeHQ7dmFyIEF4dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoQXh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIga3h0PXVPLEx4dD1JbXQsUHh0PUxfdCxOeHQ9Z3l0LEl4dD1GZ3QsUnh0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzKXx8dGhpcztpZihuLl90ZXh0UGFkZGluZz01LG51bGw9PWUpdGhyb3cgbmV3IEVycm9yKCJJbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZCByZXF1aXJlcyBhIGludGVycG9sYXRlZENvbG9yU2NhbGUiKTtyZXR1cm4gbi5fc2NhbGU9ZSxuLl9yZWRyYXdDYWxsYmFjaz1mdW5jdGlvbih0KXtyZXR1cm4gbi5yZWRyYXcoKX0sbi5fc2NhbGUub25VcGRhdGUobi5fcmVkcmF3Q2FsbGJhY2spLG4uX2Zvcm1hdHRlcj1OeHQuZ2VuZXJhbCgpLG4uX29yaWVudGF0aW9uPSJob3Jpem9udGFsIixuLl9leHBhbmRzPSExLG4uYWRkQ2xhc3MoImxlZ2VuZCIpLG4uYWRkQ2xhc3MoImludGVycG9sYXRlZC1jb2xvci1sZWdlbmQiKSxufXJldHVybiBreHQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3QucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKSx0aGlzLl9zY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spfSxlLnByb3RvdHlwZS5mb3JtYXR0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQ/dGhpcy5fZm9ybWF0dGVyOih0aGlzLl9mb3JtYXR0ZXI9dCx0aGlzLnJlZHJhdygpLHRoaXMpfSxlLnByb3RvdHlwZS5leHBhbmRzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2V4cGFuZHM6KHRoaXMuX2V4cGFuZHM9dCx0aGlzLnJlZHJhdygpLHRoaXMpfSxlLl9lbnN1cmVPcmllbnRhdGlvbj1mdW5jdGlvbih0KXtpZigiaG9yaXpvbnRhbCI9PT0odD10LnRvTG93ZXJDYXNlKCkpfHwibGVmdCI9PT10fHwicmlnaHQiPT09dClyZXR1cm4gdDt0aHJvdyBuZXcgRXJyb3IoJyInK3QrJyIgaXMgbm90IGEgdmFsaWQgb3JpZW50YXRpb24gZm9yIEludGVycG9sYXRlZENvbG9yTGVnZW5kJyl9LGUucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX29yaWVudGF0aW9uOih0aGlzLl9vcmllbnRhdGlvbj1lLl9lbnN1cmVPcmllbnRhdGlvbih0KSx0aGlzLnJlZHJhdygpLHRoaXMpfSxlLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZXhwYW5kcygpfHx0aGlzLl9pc1ZlcnRpY2FsKCl9LGUucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZXhwYW5kcygpfHwhdGhpcy5faXNWZXJ0aWNhbCgpfSxlLnByb3RvdHlwZS5fZ2VuZXJhdGVUaWNrcz1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD1lLl9ERUZBVUxUX05VTV9TV0FUQ0hFUyk7dmFyIG49dGhpcy5fc2NhbGUuZG9tYWluKCk7aWYoMT09PXQpcmV0dXJuW25bMF1dO2Zvcih2YXIgaT0oblsxXS1uWzBdKS8odC0xKSxyPVtdLG89MDtvPHQ7bysrKXIucHVzaChuWzBdK2kqbyk7cmV0dXJuIHJ9LGUucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3QucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpLHRoaXMuX3N3YXRjaENvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJzd2F0Y2gtY29udGFpbmVyIiwhMCksdGhpcy5fc3dhdGNoQm91bmRpbmdCb3g9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJyZWN0IikuY2xhc3NlZCgic3dhdGNoLWJvdW5kaW5nLWJveCIsITApLHRoaXMuX2xvd2VyTGFiZWw9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChlLkxFR0VORF9MQUJFTF9DTEFTUywhMCksdGhpcy5fdXBwZXJMYWJlbD10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKGUuTEVHRU5EX0xBQkVMX0NMQVNTLCEwKTt2YXIgbj1uZXcgTHh0LlN2Z0NvbnRleHQodGhpcy5jb250ZW50KCkubm9kZSgpKTt0aGlzLl9tZWFzdXJlcj1uZXcgTHh0Lk1lYXN1cmVyKG4pLHRoaXMuX3dyYXBwZXI9bmV3IEx4dC5XcmFwcGVyLHRoaXMuX3dyaXRlcj1uZXcgTHh0LldyaXRlcih0aGlzLl9tZWFzdXJlcixuLHRoaXMuX3dyYXBwZXIpfSxlLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbih0LG4pe3ZhciBpLHIsbz10aGlzLGE9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCxzPWEsbD10aGlzLl9zY2FsZS5kb21haW4oKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBvLl9tZWFzdXJlci5tZWFzdXJlKG8uX2Zvcm1hdHRlcih0KSkud2lkdGh9KSksYz1lLl9ERUZBVUxUX05VTV9TV0FUQ0hFUztpZih0aGlzLl9pc1ZlcnRpY2FsKCkpe3ZhciB1PUl4dC5NYXRoLm1heChsLDApO3I9cythK3RoaXMuX3RleHRQYWRkaW5nK3UrdGhpcy5fdGV4dFBhZGRpbmcsaT1jKmF9ZWxzZSBpPXMrYStzLHI9dGhpcy5fdGV4dFBhZGRpbmcrbFswXStjKmErbFsxXSt0aGlzLl90ZXh0UGFkZGluZztyZXR1cm57bWluV2lkdGg6cixtaW5IZWlnaHQ6aX19LGUucHJvdG90eXBlLl9pc1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuImhvcml6b250YWwiIT09dGhpcy5fb3JpZW50YXRpb259LGUucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3ZhciBuLGkscixvLGEscyxsPXRoaXMuX3NjYWxlLmRvbWFpbigpLGM9dGhpcy5fZm9ybWF0dGVyKGxbMF0pLHU9dGhpcy5fbWVhc3VyZXIubWVhc3VyZShjKS53aWR0aCxoPXRoaXMuX2Zvcm1hdHRlcihsWzFdKSxkPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoaCkud2lkdGgscD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0LGY9dGhpcy5fdGV4dFBhZGRpbmcsbT17eDowLHk6MH0sZz17eDowLHk6MH0sXz17eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIix0ZXh0Um90YXRpb246MH0seT17eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIix0ZXh0Um90YXRpb246MH0sdj17eDowLHk6MCx3aWR0aDowLGhlaWdodDowfTtpZih0aGlzLl9pc1ZlcnRpY2FsKCkpe3M9TWF0aC5mbG9vcih0aGlzLmhlaWdodCgpKTt2YXIgYj1NYXRoLm1heCh1LGQpO2E9KHRoaXMud2lkdGgoKS1iLTIqdGhpcy5fdGV4dFBhZGRpbmcpLzIsbj1NYXRoLm1heCh0aGlzLndpZHRoKCktYS0yKmYtYiwwKSxpPTEsbz1mdW5jdGlvbih0LG4pe3JldHVybiBlLmhlaWdodCgpLShuKzEpfSx5LnlBbGlnbj0idG9wIixtLnk9MCxfLnlBbGlnbj0iYm90dG9tIixnLnk9MCwibGVmdCI9PT10aGlzLl9vcmllbnRhdGlvbj8ocj1mdW5jdGlvbih0LGUpe3JldHVybiBmK2IrZn0seS54QWxpZ249InJpZ2h0IixtLng9LShhK24rZiksXy54QWxpZ249InJpZ2h0IixnLng9LShhK24rZikpOihyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGF9LHkueEFsaWduPSJsZWZ0IixtLng9YStuK2YsXy54QWxpZ249ImxlZnQiLGcueD1hK24rZiksdi53aWR0aD1uLHYuaGVpZ2h0PXMqaX1lbHNlIGE9TWF0aC5tYXgoZiwodGhpcy5oZWlnaHQoKS1wKS8yKSxzPU1hdGgubWF4KE1hdGguZmxvb3IodGhpcy53aWR0aCgpLTQqZi11LWQpLDApLG49MSxpPU1hdGgubWF4KHRoaXMuaGVpZ2h0KCktMiphLDApLHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5mbG9vcih1KzIqZikrZX0sbz1mdW5jdGlvbih0LGUpe3JldHVybiBhfSx5LnhBbGlnbj0icmlnaHQiLG0ueD0tZixfLnhBbGlnbj0ibGVmdCIsZy54PWYsdi55PWEsdi53aWR0aD1zKm4sdi5oZWlnaHQ9aTt2Lng9cihudWxsLDApLHRoaXMuX3VwcGVyTGFiZWwudGV4dCgiIiksdGhpcy5fd3JpdGVyLndyaXRlKGgsdGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkseSx0aGlzLl91cHBlckxhYmVsLm5vZGUoKSksdGhpcy5fdXBwZXJMYWJlbC5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIittLngrIiwgIittLnkrIikiKSx0aGlzLl9sb3dlckxhYmVsLnRleHQoIiIpLHRoaXMuX3dyaXRlci53cml0ZShjLHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpLF8sdGhpcy5fbG93ZXJMYWJlbC5ub2RlKCkpLHRoaXMuX2xvd2VyTGFiZWwuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrZy54KyIsICIrZy55KyIpIiksdGhpcy5fc3dhdGNoQm91bmRpbmdCb3guYXR0cnModik7dmFyIHg9dGhpcy5fZ2VuZXJhdGVUaWNrcyhzKSx3PXRoaXMuX3N3YXRjaENvbnRhaW5lci5zZWxlY3RBbGwoInJlY3Quc3dhdGNoIikuZGF0YSh4KSxTPXcuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5jbGFzc2VkKCJzd2F0Y2giLCEwKSxNPXcubWVyZ2UoUyk7cmV0dXJuIHcuZXhpdCgpLnJlbW92ZSgpLE0uYXR0cnMoe2ZpbGw6ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5fc2NhbGUuc2NhbGUodCl9LHdpZHRoOm4saGVpZ2h0OmkseDpyLHk6bywic2hhcGUtcmVuZGVyaW5nIjoiY3Jpc3BFZGdlcyJ9KSxQeHQuQUREX1RJVExFX0VMRU1FTlRTJiZTLmFwcGVuZCgidGl0bGUiKS50ZXh0KChmdW5jdGlvbih0KXtyZXR1cm4gZS5fZm9ybWF0dGVyKHQpfSkpLHRoaXN9LGUuX0RFRkFVTFRfTlVNX1NXQVRDSEVTPTExLGUuTEVHRU5EX0xBQkVMX0NMQVNTPSJsZWdlbmQtbGFiZWwiLGV9KShCZ3QuQ29tcG9uZW50KTtBeHQuSW50ZXJwb2xhdGVkQ29sb3JMZWdlbmQ9Unh0O3ZhciBPeHQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KE94dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHp4dD11TyxEeHQ9SW10LEJ4dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZvaWQgMD09PWUmJihlPSIiKSx2b2lkIDA9PT1uJiYobj0wKTt2YXIgaT10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIGkuYWRkQ2xhc3MoImxhYmVsIiksaS50ZXh0KGUpLGkuYW5nbGUobiksaS54QWxpZ25tZW50KCJjZW50ZXIiKS55QWxpZ25tZW50KCJjZW50ZXIiKSxpLl9wYWRkaW5nPTAsaX1yZXR1cm4genh0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fbWVhc3VyZXIubWVhc3VyZSh0aGlzLl90ZXh0KTtyZXR1cm57bWluV2lkdGg6KDA9PT10aGlzLmFuZ2xlKCk/bi53aWR0aDpuLmhlaWdodCkrMip0aGlzLnBhZGRpbmcoKSxtaW5IZWlnaHQ6KDA9PT10aGlzLmFuZ2xlKCk/bi5oZWlnaHQ6bi53aWR0aCkrMip0aGlzLnBhZGRpbmcoKX19LGUucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3QucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpLHRoaXMuX3RleHRDb250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIik7dmFyIGU9bmV3IER4dC5TdmdDb250ZXh0KHRoaXMuX3RleHRDb250YWluZXIubm9kZSgpKTt0aGlzLl9tZWFzdXJlcj1uZXcgRHh0LkNhY2hlTWVhc3VyZXIoZSksdGhpcy5fd3JhcHBlcj1uZXcgRHh0LldyYXBwZXIsdGhpcy5fd3JpdGVyPW5ldyBEeHQuV3JpdGVyKHRoaXMuX21lYXN1cmVyLGUsdGhpcy5fd3JhcHBlciksdGhpcy50ZXh0KHRoaXMuX3RleHQpfSxlLnByb3RvdHlwZS50ZXh0PWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3RleHQ7aWYoInN0cmluZyIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcigiTGFiZWwudGV4dCgpIG9ubHkgdGFrZXMgc3RyaW5ncyBhcyBpbnB1dCIpO3JldHVybiB0aGlzLl90ZXh0PXQsdGhpcy5yZWRyYXcoKSx0aGlzfSxlLnByb3RvdHlwZS5hbmdsZT1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9hbmdsZTtpZigodCU9MzYwKT4xODA/dC09MzYwOnQ8LTE4MCYmKHQrPTM2MCksLTkwIT09dCYmMCE9PXQmJjkwIT09dCl0aHJvdyBuZXcgRXJyb3IodCsiIGlzIG5vdCBhIHZhbGlkIGFuZ2xlIGZvciBMYWJlbCIpO3JldHVybiB0aGlzLl9hbmdsZT10LHRoaXMucmVkcmF3KCksdGhpc30sZS5wcm90b3R5cGUucGFkZGluZz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9wYWRkaW5nO2lmKCh0PSt0KTwwKXRocm93IG5ldyBFcnJvcih0KyIgaXMgbm90IGEgdmFsaWQgcGFkZGluZyB2YWx1ZS4gQ2Fubm90IGJlIGxlc3MgdGhhbiAwLiIpO3JldHVybiB0aGlzLl9wYWRkaW5nPXQsdGhpcy5yZWRyYXcoKSx0aGlzfSxlLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuITB9LGUucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuITB9LGUucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKSx0aGlzLl90ZXh0Q29udGFpbmVyLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpO3ZhciBlPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUodGhpcy5fdGV4dCksbj1NYXRoLm1heChNYXRoLm1pbigodGhpcy5oZWlnaHQoKS1lLmhlaWdodCkvMix0aGlzLnBhZGRpbmcoKSksMCksaT1NYXRoLm1heChNYXRoLm1pbigodGhpcy53aWR0aCgpLWUud2lkdGgpLzIsdGhpcy5wYWRkaW5nKCkpLDApO3RoaXMuX3RleHRDb250YWluZXIuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIraSsiLCIrbisiKSIpO3ZhciByPXRoaXMud2lkdGgoKS0yKmksbz10aGlzLmhlaWdodCgpLTIqbixhPXt4QWxpZ246dGhpcy54QWxpZ25tZW50KCkseUFsaWduOnRoaXMueUFsaWdubWVudCgpLHRleHRSb3RhdGlvbjp0aGlzLmFuZ2xlKCl9O3JldHVybiB0aGlzLl93cml0ZXIud3JpdGUodGhpcy5fdGV4dCxyLG8sYSksdGhpc30sZS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyksdGhpcy5fbWVhc3VyZXIucmVzZXQoKX0sZX0pKEJndC5Db21wb25lbnQpO094dC5MYWJlbD1CeHQ7dmFyIEh4dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuLGkpe3ZhciByPXQuY2FsbCh0aGlzLG4saSl8fHRoaXM7cmV0dXJuIHIuYWRkQ2xhc3MoZS5USVRMRV9MQUJFTF9DTEFTUykscn1yZXR1cm4genh0Ll9fZXh0ZW5kcyhlLHQpLGUuVElUTEVfTEFCRUxfQ0xBU1M9InRpdGxlLWxhYmVsIixlfSkoQnh0KTtPeHQuVGl0bGVMYWJlbD1IeHQ7dmFyIEZ4dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuLGkpe3ZhciByPXQuY2FsbCh0aGlzLG4saSl8fHRoaXM7cmV0dXJuIHIuYWRkQ2xhc3MoZS5BWElTX0xBQkVMX0NMQVNTKSxyfXJldHVybiB6eHQuX19leHRlbmRzKGUsdCksZS5BWElTX0xBQkVMX0NMQVNTPSJheGlzLWxhYmVsIixlfSkoQnh0KTtPeHQuQXhpc0xhYmVsPUZ4dDt2YXIgVnh0PXt9LFV4dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KFV4dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGp4dD1FZHQ7VXh0LmNpcmNsZT1mdW5jdGlvbiBHeHQoKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGp4dC5zeW1ib2woKS50eXBlKGp4dC5zeW1ib2xDaXJjbGUpLnNpemUoTWF0aC5QSSpNYXRoLnBvdyh0LzIsMikpfX0sVXh0LnNxdWFyZT1mdW5jdGlvbiBXeHQoKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGp4dC5zeW1ib2woKS50eXBlKGp4dC5zeW1ib2xTcXVhcmUpLnNpemUoTWF0aC5wb3codCwyKSl9fSxVeHQuY3Jvc3M9ZnVuY3Rpb24gcXh0KCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBqeHQuc3ltYm9sKCkudHlwZShqeHQuc3ltYm9sQ3Jvc3MpLnNpemUoNS85Kk1hdGgucG93KHQsMikpfX0sVXh0LmRpYW1vbmQ9ZnVuY3Rpb24gWXh0KCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBqeHQuc3ltYm9sKCkudHlwZShqeHQuc3ltYm9sRGlhbW9uZCkuc2l6ZShNYXRoLnRhbihNYXRoLlBJLzYpKk1hdGgucG93KHQsMikvMil9fSxVeHQudHJpYW5nbGU9ZnVuY3Rpb24gWHh0KCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBqeHQuc3ltYm9sKCkudHlwZShqeHQuc3ltYm9sVHJpYW5nbGUpLnNpemUoTWF0aC5zcXJ0KDMpKk1hdGgucG93KHQvMiwyKSl9fSxVeHQuc3Rhcj1mdW5jdGlvbiAkeHQoKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGp4dC5zeW1ib2woKS50eXBlKGp4dC5zeW1ib2xTdGFyKS5zaXplKC44OTA4MTMwOTE1MjkyODUyKk1hdGgucG93KHQvMiwyKSl9fTt2YXIgS3h0PTMqKDEvTWF0aC5zcXJ0KDEyKS8yKzEpO1V4dC53eWU9ZnVuY3Rpb24gWnh0KCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBqeHQuc3ltYm9sKCkudHlwZShqeHQuc3ltYm9sV3llKS5zaXplKEt4dCpNYXRoLnBvdyh0LzIuNCwyKSl9fSwKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ4dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIEp4dD11TyxReHQ9RWR0LHR3dD1JbXQsZXd0PUxfdCxud3Q9Z3l0LGl3dD1VeHQscnd0PUZndCxvd3Q9Qmd0LGF3dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXt2b2lkIDA9PT10JiYodD1bXSksdm9pZCAwPT09ZSYmKGU9MCksdm9pZCAwPT09biYmKG49MS8wKSx0aGlzLmNvbHVtbnM9dCx0aGlzLmJvdHRvbVBhZGRpbmc9ZSx0aGlzLm1heFdpZHRoPW59cmV0dXJuIHQucHJvdG90eXBlLmFkZENvbHVtbj1mdW5jdGlvbih0KXt2YXIgZT10LndpZHRoLG49dGhpcy5nZXRXaWR0aEF2YWlsYWJsZSgpO3Qud2lkdGg9TWF0aC5taW4obixlKSx0aGlzLmNvbHVtbnMucHVzaCh0KX0sdC5wcm90b3R5cGUuZ2V0Qm91bmRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmNvbHVtbnNbdF0sbj0wLGk9MDtpPHQ7aSsrKW4rPXRoaXMuY29sdW1uc1tpXS53aWR0aDtyZXR1cm57dG9wTGVmdDp7eDpuLHk6MH0sYm90dG9tUmlnaHQ6e3g6bitlLndpZHRoLHk6ZS5oZWlnaHR9fX0sdC5wcm90b3R5cGUuZ2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHJ3dC5NYXRoLm1heCh0aGlzLmNvbHVtbnMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5oZWlnaHR9KSksMCkrdGhpcy5ib3R0b21QYWRkaW5nfSx0LnByb3RvdHlwZS5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1pbih0aGlzLmNvbHVtbnMucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiB0K2Uud2lkdGh9KSwwKSx0aGlzLm1heFdpZHRoKX0sdC5wcm90b3R5cGUuZ2V0V2lkdGhBdmFpbGFibGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFdpZHRoKCk7cmV0dXJuIE1hdGgubWF4KHRoaXMubWF4V2lkdGgtdCwwKX0sdH0pKCksc3d0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4saSl7dm9pZCAwPT09dCYmKHQ9MS8wKSx2b2lkIDA9PT1lJiYoZT0xLzApLHZvaWQgMD09PW4mJihuPTApLHZvaWQgMD09PWkmJihpPVtdKSx0aGlzLm1heFdpZHRoPXQsdGhpcy5tYXhIZWlnaHQ9ZSx0aGlzLnBhZGRpbmc9bix0aGlzLnJvd3M9aX1yZXR1cm4gdC5wcm90b3R5cGUuYWRkUm93PWZ1bmN0aW9uKHQpe3QubWF4V2lkdGg9dGhpcy5tYXhXaWR0aC0yKnRoaXMucGFkZGluZyx0aGlzLnJvd3MucHVzaCh0KX0sdC5wcm90b3R5cGUuZ2V0Q29sdW1uQm91bmRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXRSb3dCb3VuZHModCksaT10aGlzLnJvd3NbdF0uZ2V0Qm91bmRzKGUpO3JldHVybiBpLnRvcExlZnQueCs9bi50b3BMZWZ0LngsaS5ib3R0b21SaWdodC54Kz1uLnRvcExlZnQueCxpLnRvcExlZnQueSs9bi50b3BMZWZ0LnksaS5ib3R0b21SaWdodC55Kz1uLnRvcExlZnQueSxpfSx0LnByb3RvdHlwZS5nZXRSb3dCb3VuZHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMucGFkZGluZyxuPXRoaXMucGFkZGluZyxpPTA7aTx0O2krKyluKz10aGlzLnJvd3NbaV0uZ2V0SGVpZ2h0KCk7cmV0dXJue3RvcExlZnQ6e3g6ZSx5Om59LGJvdHRvbVJpZ2h0Ont4OmUrdGhpcy5yb3dzW3RdLmdldFdpZHRoKCkseTpuK3RoaXMucm93c1t0XS5nZXRIZWlnaHQoKX19fSx0LnByb3RvdHlwZS5nZXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4odGhpcy5yb3dzLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCtlLmdldEhlaWdodCgpfSksMCkrMip0aGlzLnBhZGRpbmcsdGhpcy5tYXhIZWlnaHQpfSx0LnByb3RvdHlwZS5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1pbihyd3QuTWF0aC5tYXgodGhpcy5yb3dzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0V2lkdGgoKX0pKSwwKSsyKnRoaXMucGFkZGluZyx0aGlzLm1heFdpZHRoKX0sdH0pKCksbHd0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzKXx8dGhpcztpZihuLl9wYWRkaW5nPTUsbi5fcm93Qm90dG9tUGFkZGluZz0zLG4uYWRkQ2xhc3MoImxlZ2VuZCIpLG4ubWF4RW50cmllc1BlclJvdygxKSxudWxsPT1lKXRocm93IG5ldyBFcnJvcigiTGVnZW5kIHJlcXVpcmVzIGEgY29sb3JTY2FsZSIpO3JldHVybiBuLl9jb2xvclNjYWxlPWUsbi5fcmVkcmF3Q2FsbGJhY2s9ZnVuY3Rpb24odCl7cmV0dXJuIG4ucmVkcmF3KCl9LG4uX2NvbG9yU2NhbGUub25VcGRhdGUobi5fcmVkcmF3Q2FsbGJhY2spLG4uX2Zvcm1hdHRlcj1ud3QuaWRlbnRpdHkoKSxuLm1heExpbmVzUGVyRW50cnkoMSksbi54QWxpZ25tZW50KCJyaWdodCIpLnlBbGlnbm1lbnQoInRvcCIpLG4uY29tcGFyYXRvcigoZnVuY3Rpb24odCxlKXt2YXIgaT1uLl9jb2xvclNjYWxlLmRvbWFpbigpLnNsaWNlKCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gbi5fZm9ybWF0dGVyKHQpfSkpO3JldHVybiBpLmluZGV4T2YodCktaS5pbmRleE9mKGUpfSkpLG4uX3N5bWJvbEZhY3RvcnlBY2Nlc3Nvcj1mdW5jdGlvbigpe3JldHVybiBpd3QuY2lyY2xlKCl9LG4uX3N5bWJvbE9wYWNpdHlBY2Nlc3Nvcj1mdW5jdGlvbigpe3JldHVybiAxfSxufXJldHVybiBKeHQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dmFyIG49dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChlLkxFR0VORF9ST1dfQ0xBU1MsITApO24uYXBwZW5kKCJnIikuY2xhc3NlZChlLkxFR0VORF9FTlRSWV9DTEFTUywhMCkuYXBwZW5kKCJ0ZXh0Iik7dmFyIGk9bmV3IHR3dC5TdmdDb250ZXh0KG4ubm9kZSgpLG51bGwsZXd0LkFERF9USVRMRV9FTEVNRU5UUyk7dGhpcy5fbWVhc3VyZXI9bmV3IHR3dC5DYWNoZU1lYXN1cmVyKGkpLHRoaXMuX3dyYXBwZXI9KG5ldyB0d3QuV3JhcHBlcikubWF4TGluZXModGhpcy5tYXhMaW5lc1BlckVudHJ5KCkpLHRoaXMuX3dyaXRlcj1uZXcgdHd0LldyaXRlcih0aGlzLl9tZWFzdXJlcixpLHRoaXMuX3dyYXBwZXIpfSxlLnByb3RvdHlwZS5mb3JtYXR0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZm9ybWF0dGVyOih0aGlzLl9mb3JtYXR0ZXI9dCx0aGlzLnJlZHJhdygpLHRoaXMpfSxlLnByb3RvdHlwZS5tYXhFbnRyaWVzUGVyUm93PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX21heEVudHJpZXNQZXJSb3c6KHRoaXMuX21heEVudHJpZXNQZXJSb3c9dCx0aGlzLnJlZHJhdygpLHRoaXMpfSxlLnByb3RvdHlwZS5tYXhMaW5lc1BlckVudHJ5PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX21heExpbmVzUGVyRW50cnk6KHRoaXMuX21heExpbmVzUGVyRW50cnk9dCx0aGlzLnJlZHJhdygpLHRoaXMpfSxlLnByb3RvdHlwZS5tYXhXaWR0aD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9tYXhXaWR0aDoodGhpcy5fbWF4V2lkdGg9dCx0aGlzLnJlZHJhdygpLHRoaXMpfSxlLnByb3RvdHlwZS5jb21wYXJhdG9yPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2NvbXBhcmF0b3I6KHRoaXMuX2NvbXBhcmF0b3I9dCx0aGlzLnJlZHJhdygpLHRoaXMpfSxlLnByb3RvdHlwZS5jb2xvclNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10Pyh0aGlzLl9jb2xvclNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZWRyYXdDYWxsYmFjayksdGhpcy5fY29sb3JTY2FsZT10LHRoaXMuX2NvbG9yU2NhbGUub25VcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spLHRoaXMucmVkcmF3KCksdGhpcyk6dGhpcy5fY29sb3JTY2FsZX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3QucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKSx0aGlzLl9jb2xvclNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZWRyYXdDYWxsYmFjayl9LGUucHJvdG90eXBlLl9idWlsZExlZ2VuZFRhYmxlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxpPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQscj1uZXcgc3d0KHQsZSx0aGlzLl9wYWRkaW5nKSxvPXRoaXMuX2NvbG9yU2NhbGUuZG9tYWluKCkuc2xpY2UoKS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBuLl9jb21wYXJhdG9yKG4uX2Zvcm1hdHRlcih0KSxuLl9mb3JtYXR0ZXIoZSkpfSkpLGE9bmV3IGF3dDtyZXR1cm4gci5hZGRSb3coYSksYS5ib3R0b21QYWRkaW5nPXRoaXMuX3Jvd0JvdHRvbVBhZGRpbmcsby5mb3JFYWNoKChmdW5jdGlvbih0LGUpe2EuY29sdW1ucy5sZW5ndGgvMj09PW4ubWF4RW50cmllc1BlclJvdygpJiYoKGE9bmV3IGF3dCkuYm90dG9tUGFkZGluZz1uLl9yb3dCb3R0b21QYWRkaW5nLHIuYWRkUm93KGEpKTt2YXIgbz1hLmdldFdpZHRoQXZhaWxhYmxlKCkscz1uLl9mb3JtYXR0ZXIodCksbD1uLl9tZWFzdXJlci5tZWFzdXJlKHMpLndpZHRoO28taS1sPDAmJmEuY29sdW1ucy5sZW5ndGg+MSYmKChhPW5ldyBhd3QpLmJvdHRvbVBhZGRpbmc9bi5fcm93Qm90dG9tUGFkZGluZyxyLmFkZFJvdyhhKSksYS5hZGRDb2x1bW4oe3dpZHRoOmksaGVpZ2h0OmksZGF0YTp7bmFtZTp0LHR5cGU6InN5bWJvbCJ9fSksbz1hLmdldFdpZHRoQXZhaWxhYmxlKCk7dmFyIGM9TWF0aC5taW4obyxsKTtuLl93cmFwcGVyLm1heExpbmVzKG4ubWF4TGluZXNQZXJFbnRyeSgpKTt2YXIgdT1uLl93cmFwcGVyLndyYXAocyxuLl9tZWFzdXJlcixjKS5ub0xpbmVzO2EuYWRkQ29sdW1uKHt3aWR0aDpjLGhlaWdodDp1KmksZGF0YTp7bmFtZTp0LHR5cGU6InRleHQifX0pfSkpLHJ9LGUucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fYnVpbGRMZWdlbmRUYWJsZShyd3QuTWF0aC5taW4oW3RoaXMubWF4V2lkdGgoKSx0XSx0KSxlKTtyZXR1cm57bWluSGVpZ2h0Om4uZ2V0SGVpZ2h0KCksbWluV2lkdGg6bi5nZXRXaWR0aCgpfX0sZS5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbih0KXt2YXIgbj10aGlzO2lmKCF0aGlzLl9pc1NldHVwKXJldHVybltdO3ZhciBpPXRoaXMuX2J1aWxkTGVnZW5kVGFibGUodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpO3JldHVybiBpLnJvd3MucmVkdWNlKChmdW5jdGlvbihyLG8sYSl7aWYoMCE9PXIubGVuZ3RoKXJldHVybiByO3ZhciBzPWkuZ2V0Um93Qm91bmRzKGEpO3JldHVybiByd3QuTWF0aC53aXRoaW4odCxzKT9vLmNvbHVtbnMucmVkdWNlKChmdW5jdGlvbihyLG8scyl7dmFyIGw9aS5nZXRDb2x1bW5Cb3VuZHMoYSxzKTtpZihyd3QuTWF0aC53aXRoaW4odCxsKSl7dmFyIGM9bi5jb250ZW50KCkuc2VsZWN0QWxsKCIuIitlLkxFR0VORF9ST1dfQ0xBU1MpLm5vZGVzKClbYV0sdT1ReHQuc2VsZWN0KGMpLnNlbGVjdEFsbCgiLiIrZS5MRUdFTkRfRU5UUllfQ0xBU1MpLm5vZGVzKClbTWF0aC5mbG9vcihzLzIpXSxoPVF4dC5zZWxlY3QodSkuc2VsZWN0KCIuIitlLkxFR0VORF9TWU1CT0xfQ0xBU1MpLGQ9cnd0LkRPTS5nZXRUcmFuc2xhdGVWYWx1ZXMoUXh0LnNlbGVjdChjKSkscD1yd3QuRE9NLmdldFRyYW5zbGF0ZVZhbHVlcyhoKTtyZXR1cm5be2JvdW5kczpyd3QuRE9NLmVsZW1lbnRCQm94KFF4dC5zZWxlY3QoYykpLGRhdHVtOm8uZGF0YS5uYW1lLHBvc2l0aW9uOnt4OmRbMF0rcFswXSx5OmRbMV0rcFsxXX0sc2VsZWN0aW9uOlF4dC5zZWxlY3QodSksY29tcG9uZW50Om59XX1yZXR1cm4gcn0pLHIpOnJ9KSxbXSl9LGUucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt2YXIgbj10aGlzLl9idWlsZExlZ2VuZFRhYmxlKHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpKTt0aGlzLmNvbnRlbnQoKS5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTt2YXIgaT10aGlzLmNvbnRlbnQoKS5zZWxlY3RBbGwoImcuIitlLkxFR0VORF9ST1dfQ0xBU1MpLmRhdGEobi5yb3dzKSxyPWkuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKGUuTEVHRU5EX1JPV19DTEFTUywhMCkubWVyZ2UoaSk7aS5leGl0KCkucmVtb3ZlKCksci5hdHRyKCJ0cmFuc2Zvcm0iLChmdW5jdGlvbih0LGUpe3ZhciBpPW4uZ2V0Um93Qm91bmRzKGUpO3JldHVybiJ0cmFuc2xhdGUoIitpLnRvcExlZnQueCsiLCAiK2kudG9wTGVmdC55KyIpIn0pKTt2YXIgbz10aGlzO3JldHVybiByLmVhY2goKGZ1bmN0aW9uKHQsaSl7Zm9yKHZhciByPVtdLGE9MDthPHQuY29sdW1ucy5sZW5ndGg7YSs9MilyLnB1c2goW3QuY29sdW1uc1thXSx0LmNvbHVtbnNbYSsxXV0pO3ZhciBzPVF4dC5zZWxlY3QodGhpcykuc2VsZWN0QWxsKCJnLiIrZS5MRUdFTkRfRU5UUllfQ0xBU1MpLmRhdGEociksbD1zLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZChlLkxFR0VORF9FTlRSWV9DTEFTUywhMCkubWVyZ2Uocyk7bC5hcHBlbmQoInBhdGgiKS5hdHRyKCJkIiwoZnVuY3Rpb24odCxlKXt2YXIgbj10WzBdO3JldHVybiBvLnN5bWJvbCgpKG4uZGF0YS5uYW1lLGkpKC42Km4uaGVpZ2h0KShudWxsKX0pKS5hdHRyKCJ0cmFuc2Zvcm0iLChmdW5jdGlvbih0LGUpe3ZhciByPXRbMF0sbz1uLnJvd3NbaV0uY29sdW1ucy5pbmRleE9mKHIpO3JldHVybiJ0cmFuc2xhdGUoIisobi5nZXRDb2x1bW5Cb3VuZHMoaSxvKS50b3BMZWZ0Lngrci53aWR0aC8yKSsiLCAiK3IuaGVpZ2h0LzIrIikifSkpLmF0dHIoImZpbGwiLChmdW5jdGlvbih0KXtyZXR1cm4gby5fY29sb3JTY2FsZS5zY2FsZSh0WzBdLmRhdGEubmFtZSl9KSkuYXR0cigib3BhY2l0eSIsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG8uc3ltYm9sT3BhY2l0eSgpKHRbMF0uZGF0YS5uYW1lLGkpfSkpLmNsYXNzZWQoZS5MRUdFTkRfU1lNQk9MX0NMQVNTLCEwKSxsLmFwcGVuZCgiZyIpLmNsYXNzZWQoInRleHQtY29udGFpbmVyIiwhMCkuYXR0cigidHJhbnNmb3JtIiwoZnVuY3Rpb24odCxlKXt2YXIgcj1uLnJvd3NbaV0uY29sdW1ucy5pbmRleE9mKHRbMV0pO3JldHVybiJ0cmFuc2xhdGUoIituLmdldENvbHVtbkJvdW5kcyhpLHIpLnRvcExlZnQueCsiLCAwKSJ9KSkuZWFjaCgoZnVuY3Rpb24odCxlLG4pe3ZhciBpPVF4dC5zZWxlY3QodGhpcykscj10WzFdO28uX3dyaXRlci53cml0ZShvLl9mb3JtYXR0ZXIoci5kYXRhLm5hbWUpLHIud2lkdGgsby5oZWlnaHQoKSx7eEFsaWduOiJsZWZ0Iix5QWxpZ246InRvcCIsdGV4dFJvdGF0aW9uOjB9LGkubm9kZSgpKX0pKSxzLmV4aXQoKS5yZW1vdmUoKX0pKSx0aGlzfSxlLnByb3RvdHlwZS5zeW1ib2w9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fc3ltYm9sRmFjdG9yeUFjY2Vzc29yOih0aGlzLl9zeW1ib2xGYWN0b3J5QWNjZXNzb3I9dCx0aGlzLnJlbmRlcigpLHRoaXMpfSxlLnByb3RvdHlwZS5zeW1ib2xPcGFjaXR5PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX3N5bWJvbE9wYWNpdHlBY2Nlc3NvcjoodGhpcy5fc3ltYm9sT3BhY2l0eUFjY2Vzc29yPSJudW1iZXIiPT10eXBlb2YgdD9mdW5jdGlvbigpe3JldHVybiB0fTp0LHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyksdGhpcy5fbWVhc3VyZXIucmVzZXQoKX0sZS5MRUdFTkRfUk9XX0NMQVNTPSJsZWdlbmQtcm93IixlLkxFR0VORF9FTlRSWV9DTEFTUz0ibGVnZW5kLWVudHJ5IixlLkxFR0VORF9TWU1CT0xfQ0xBU1M9ImxlZ2VuZC1zeW1ib2wiLGV9KShvd3QuQ29tcG9uZW50KTtWeHQuTGVnZW5kPWx3dDt2YXIgY3d0PXt9LHV3dD17fSxod3Q9e307IShmdW5jdGlvbih0KXt2YXIgZTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLChlPXQuQW5pbWF0b3J8fCh0LkFuaW1hdG9yPXt9KSkuTUFJTj0ibWFpbiIsZS5SRVNFVD0icmVzZXQifSkoaHd0KTt2YXIgZHd0PXt9LHB3dD17fSxmd3Q9e307ZnVuY3Rpb24gbXd0KHQpe3JldHVybiEwPT09KGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG51bGwhPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmITE9PT1BcnJheS5pc0FycmF5KGUpfSkodCkmJiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfXZhciBnd3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShnd3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBfd3Q9Rmd0LHl3dD0wLHZ3dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dm9pZCAwPT09dCYmKHQ9W10pLHZvaWQgMD09PWUmJihlPXt9KSx0aGlzLl91cGRhdGVJZD15d3QrKyx0aGlzLl9kYXRhPXQsdGhpcy5fbWV0YWRhdGE9ZSx0aGlzLl9jYWxsYmFja3M9bmV3IF93dC5DYWxsYmFja1NldH1yZXR1cm4gdC5wcm90b3R5cGUub25VcGRhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NhbGxiYWNrcy5hZGQodCksdGhpc30sdC5wcm90b3R5cGUub2ZmVXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jYWxsYmFja3MuZGVsZXRlKHQpLHRoaXN9LHQucHJvdG90eXBlLmRhdGE9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZGF0YToodGhpcy5fZGF0YT10LHRoaXMuX2Rpc3BhdGNoVXBkYXRlKCksdGhpcyl9LHQucHJvdG90eXBlLm1ldGFkYXRhPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX21ldGFkYXRhOih0aGlzLl9tZXRhZGF0YT10LHRoaXMuX2Rpc3BhdGNoVXBkYXRlKCksdGhpcyl9LHQucHJvdG90eXBlLnVwZGF0ZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VwZGF0ZUlkfSx0LnByb3RvdHlwZS5fZGlzcGF0Y2hVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVJZD15d3QrKyx0aGlzLl9jYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKX0sdH0pKCk7Z3d0LkRhdGFzZXQ9dnd0LAovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqIEBmaWxlb3ZlcnZpZXcgSW1wbGVtZW50cyB0aGUgU2lnbmF0dXJlIEFQSSB0byBoZWxwIGluIGNvbXBhcmluZyB3aGVuIHR3bwogICAgICogUGxvdHRhYmxlIG9iamVjdHMgaGF2ZSAiY2hhbmdlZCIuCiAgICAgKgogICAgICogTWVtb2l6YXRpb24gaW4gUGxvdHRhYmxlIGlzIGNvbXBsaWNhdGVkIGJ5IG11dGFibGUgc2NhbGVzIGFuZCBkYXRhc2V0cy4gV2UgY2Fubm90IHNpbXBseQogICAgICogcmVmZXJlbmNlIGNvbXBhcmUgdHdvIGUuZy4gc2NhbGVzIHNpbmNlIGl0IG1heSBoYXZlIGludGVybmFsbHkgbXV0YXRlZC4gVG8gcmVzb2x2ZSB0aGlzLAogICAgICogd2Ugd3JpdGUgYSByZWN1cnNpdmUgU2lnbmF0dXJlIGludGVyZmFjZSB0aGF0IGhvbGRzIGFuIGltbXV0YWJsZSBzbmFwc2hvdCBvZiB3aGF0ZXZlcgogICAgICogc3RhdGUgdGhlIHNjYWxlL2RhdGEgd2FzIGluIGF0IHRoZSB0aW1lLiBUaGVuIG9uIG1lbW9pemVkIGZ1bmN0aW9uIGludm9jYXRpb24gd2Ugc2lnbiB0aGUKICAgICAqIG5ldyBpbnB1dHMgYW5kIGNvbXBhcmUgdGhlIHNpZ25hdHVyZXMgdG8gZGVjaWRlIGlmIHdlIHNob3VsZCByZWNvbXB1dGUuCiAgICAgKgogICAgICogV2UgbXVzdCBoYW5kLXdyaXRlIGEgc2lnbmF0dXJlIGZvciBlYWNoIGN1c3RvbSBjbGFzcyB3ZSB3aXNoIHRvIHN1cHBvcnQuCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KGZ3dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGJ3dD11Tyx4d3Q9Z3d0LHd3dD1odnQ7ZnVuY3Rpb24gU3d0KHQpe3JldHVybiB0IGluc3RhbmNlb2Yga3d0P3Q6dCBpbnN0YW5jZW9mIERhdGU/VHd0KHQudmFsdWVPZigpKTp0IGluc3RhbmNlb2Ygd3d0LlNjYWxlP013dCh0KTp0IGluc3RhbmNlb2YgeHd0LkRhdGFzZXQ/RXd0KHQpOihmdW5jdGlvbiB0KGUpe3ZhciBuLGk7cmV0dXJuITEhPT1td3QoZSkmJiJmdW5jdGlvbiI9PXR5cGVvZihuPWUuY29uc3RydWN0b3IpJiYhMSE9PW13dChpPW4ucHJvdG90eXBlKSYmITEhPT1pLmhhc093blByb3BlcnR5KCJpc1Byb3RvdHlwZU9mIil9KSh0KT9Bd3QodCk6QXJyYXkuaXNBcnJheSh0KT9Dd3QodCk6VHd0KHQpfWZ1bmN0aW9uIE13dCh0KXtyZXR1cm4gQXd0KHtkb21haW46dC5kb21haW4oKSxyYW5nZTp0LnJhbmdlKCksdXBkYXRlSWQ6dC51cGRhdGVJZCgpLHJlZjpUd3QodCl9KX1mdW5jdGlvbiBFd3QodCl7cmV0dXJuIEF3dCh7cmVmOlR3dCh0KSx1cGRhdGVJZDp0LnVwZGF0ZUlkKCl9KX1mdW5jdGlvbiBUd3QodCl7cmV0dXJuIG5ldyBQd3QodCl9ZnVuY3Rpb24gQ3d0KHQpe3JldHVybiBuZXcgTHd0KHQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gU3d0KHQpfSkpKX1mdW5jdGlvbiBBd3QodCl7dmFyIGU9e307Zm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmKGVbbl09U3d0KHRbbl0pKTtyZXR1cm4gbmV3IE53dChlKX1md3Quc2lnbj1Td3QsZnd0LnNpZ25TY2FsZT1Nd3QsZnd0LnNpZ25EYXRhc2V0PUV3dCxmd3Quc2lnblJlZj1Ud3QsZnd0LnNpZ25BcnJheT1Dd3QsZnd0LnNpZ25PYmo9QXd0O3ZhciBrd3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5wcm90b3R5cGUuaXNEaWZmZXJlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuISh0IGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcil8fHRoaXMuaXNTaWduYXR1cmVEaWZmZXJlbnQodCl9LHR9KSgpO2Z3dC5TaWduYXR1cmU9a3d0O3ZhciBMd3Q9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG49dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBuLmFycmF5PWUsbn1yZXR1cm4gYnd0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLmlzU2lnbmF0dXJlRGlmZmVyZW50PWZ1bmN0aW9uKHQpe2lmKHQuYXJyYXkubGVuZ3RoIT09dGhpcy5hcnJheS5sZW5ndGgpcmV0dXJuITA7Zm9yKHZhciBlPTA7ZTx0aGlzLmFycmF5Lmxlbmd0aDtlKyspaWYodGhpcy5hcnJheVtlXS5pc0RpZmZlcmVudCh0LmFycmF5W2VdKSlyZXR1cm4hMDtyZXR1cm4hMX0sZX0pKGt3dCk7Znd0LkFycmF5U2lnbmF0dXJlPUx3dDt2YXIgUHd0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZhciBuPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gbi5yZWY9ZSxufXJldHVybiBid3QuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuaXNTaWduYXR1cmVEaWZmZXJlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmVmIT09dC5yZWZ9LGV9KShrd3QpO2Z3dC5SZWZlcmVuY2VTaWduYXR1cmU9UHd0O3ZhciBOd3Q9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG49dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBuLm9iaj1lLG59cmV0dXJuIGJ3dC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5pc1NpZ25hdHVyZURpZmZlcmVudD1mdW5jdGlvbih0KXt2YXIgZT1PYmplY3Qua2V5cyh0aGlzLm9iaiksbj1PYmplY3Qua2V5cyh0Lm9iaik7aWYoZS5sZW5ndGghPT1uLmxlbmd0aClyZXR1cm4hMDtmb3IodmFyIGk9MCxyPWU7aTxyLmxlbmd0aDtpKyspe3ZhciBvPXJbaV07aWYoIXQub2JqLmhhc093blByb3BlcnR5KG8pKXJldHVybiEwO2lmKHRoaXMub2JqW29dLmlzRGlmZmVyZW50KHQub2JqW29dKSlyZXR1cm4hMH1yZXR1cm4hMX0sZX0pKGt3dCk7Znd0Lk9iamVjdFNpZ25hdHVyZT1Od3QsCi8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICogQGZpbGVvdmVydmlldyBJbXBsZW1lbnRzIGEgZnVuY3Rpb24gbWVtb2l6ZXIgdXNpbmcgdGhlIFNpZ25hdHVyZSBBUEkuCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHB3dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIEl3dD1md3Q7cHd0Lm1lbW9pemU9ZnVuY3Rpb24gUnd0KHQpe3ZhciBlLG49dm9pZCAwLGk9ITEscj0hMSxvPWZ1bmN0aW9uKCl7Zm9yKHZhciBvPVtdLGE9MDthPGFyZ3VtZW50cy5sZW5ndGg7YSsrKW9bYV09YXJndW1lbnRzW2FdO2lmKGkpcmV0dXJuIGU7dmFyIHM9SXd0LnNpZ25BcnJheShvKTtyZXR1cm4gdm9pZCAwPT09bnx8bi5pc0RpZmZlcmVudChzKT8ociYmY29uc29sZS53YXJuKCJjYWNoZSBtaXNzISBjb21wdXRpbmciKSxuPXMsZT10LmFwcGx5KHRoaXMsbykpOnImJmNvbnNvbGUud2FybigiY2FjaGUgaGl0ISIpLGV9O3JldHVybiBvLmRvTG9ja2VkPWZ1bmN0aW9uKHQpe2lmKGkpdGhyb3cgbmV3IEVycm9yKCJMb2NraW5nIGFuIGFscmVhZHkgbG9ja2VkIG1lbW9pemUgZnVuY3Rpb24hIik7aT0hMDt2YXIgZT10LmFwcGx5KHRoaXMpO3JldHVybiBpPSExLGV9LG8ubG9nUGVyZm9ybWFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PSEwKSxyPXQsdGhpc30sb307dmFyIE93dD17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoT3d0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgend0PVNlLmV4cG9ydHMsRHd0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLm1hcD1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuZXhpc3RzPU9iamVjdC5jcmVhdGUobnVsbCl9cmV0dXJuIHQucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXtyZXR1cm4gZGVsZXRlIHRoaXMubWFwW3RdLGRlbGV0ZSB0aGlzLmV4aXN0c1t0XSwhMH0sdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1hcFt0XX0sdC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiEhdGhpcy5leGlzdHNbdF19LHQucHJvdG90eXBlLnNldD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm1hcFt0XT1lLHRoaXMuZXhpc3RzW3RdPSEwLHRoaXN9LHR9KSgpLEJ3dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5tYXA9bmV3IER3dH1yZXR1cm4gdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1hcC5nZXQodFswXSkuZ2V0KHRbMV0pfSx0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubWFwLmhhcyh0WzBdKSYmdGhpcy5tYXAuZ2V0KHRbMF0pLmhhcyh0WzFdKX0sdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubWFwLmhhcyh0WzBdKXx8dGhpcy5tYXAuc2V0KHRbMF0sbmV3IER3dCksdGhpcy5tYXAuZ2V0KHRbMF0pLnNldCh0WzFdLGUpLHRoaXN9LHQucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5tYXAuaGFzKHRbMF0pJiZ0aGlzLm1hcC5nZXQodFswXSkuZGVsZXRlKHRbMV0pLCEwfSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMubWFwPW5ldyBEd3R9LHQucmVzb2x2ZXI9ZnVuY3Rpb24odCxlLG4pe3JldHVybltuLnVwZGF0ZUlkKCksZV19LHR9KSgpO2Z1bmN0aW9uIEh3dCh0KXt2YXIgZT16d3QubWVtb2l6ZSh0LEJ3dC5yZXNvbHZlcik7cmV0dXJuIGUuY2FjaGU9bmV3IEJ3dCxlfU93dC5tZW1vaXplUHJvamVjdG9yPUh3dCxPd3QubWVtb2l6ZVByb2plY3RvcnM9ZnVuY3Rpb24gRnd0KHQpe3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChmdW5jdGlvbihlKXt0W2VdPUh3dCh0W2VdKX0pKSx0fTt2YXIgVnd0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqIEBmaWxlb3ZlcnZpZXcgSW1wbGVtZW50cyBhIGNvbnZlbmllbnQgdGh1bmsgZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSBjb21tb24gY2FzZQogICAgICogb2YgY3JlYXRpbmcgYSBtZW1vaXplZCBmdW5jdGlvbiB0aGF0IHRha2VzIGl0cyBpbnB1dHMgZnJvbSBtdXRhYmxlIGNsYXNzIHByb3BlcnRpZXMuCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoVnd0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgVXd0PWR3dDtWd3QubWVtVGh1bms9ZnVuY3Rpb24gand0KCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3ZhciBuPXQuc2xpY2UoMCwtMSksaT10W3QubGVuZ3RoLTFdLHI9VXd0Lm1lbW9pemUoaSksbz1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1uLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXBwbHkodCl9KSk7cmV0dXJuIHIuYXBwbHkodm9pZCAwLGUpfTtyZXR1cm4gb30sKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9dU87ZS5fX2V4cG9ydFN0YXIocHd0LHQpLGUuX19leHBvcnRTdGFyKE93dCx0KSxlLl9fZXhwb3J0U3RhcihWd3QsdCksdC5zaWduPWZ3dC5zaWdufSkoZHd0KTt2YXIgR3d0PXt9OyEoZnVuY3Rpb24odCl7Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZT1FZHQsbj0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2RyYXdTdGVwPWV9cmV0dXJuIHQucHJvdG90eXBlLmdldERyYXdTdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYXdTdGVwfSx0LnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZVtlLmxlbmd0aC0xXS5hdHRyVG9BcHBsaWVkUHJvamVjdG9yO3RoaXMuX2NvbnRleHQuc2F2ZSgpLHRoaXMuX2RyYXdTdGVwKHRoaXMuX2NvbnRleHQsdCxuKSx0aGlzLl9jb250ZXh0LnJlc3RvcmUoKX0sdC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlcz1mdW5jdGlvbigpe3JldHVybltdfSx0LnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsfSx0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt9LHR9KSgpO2Z1bmN0aW9uIGkodCxlLG4saSl7Zm9yKHZhciByPXt9LG89MCxhPWU7bzxhLmxlbmd0aDtvKyspe3ZhciBzPWFbb107dC5oYXNPd25Qcm9wZXJ0eShzKSYmKHJbc109dFtzXShuLGkpKX1yZXR1cm4gcn1mdW5jdGlvbiByKHQpe3JldHVybiBudWxsIT10WyJzdHJva2Utd2lkdGgiXT9wYXJzZUZsb2F0KHRbInN0cm9rZS13aWR0aCJdKToxfWZ1bmN0aW9uIG8odCl7dmFyIGU9dFsic3Ryb2tlLWRhc2hhcnJheSJdO2lmKG51bGwhPWUpdHJ5e3JldHVybiBlLnNwbGl0KC9bICxdKy8pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlSW50KHQsMTApfSkpfWNhdGNoKHQpe3JldHVybiBjb25zb2xlLmVycm9yKCJnZXRTdHJva2VEYXNoQXJyYXkgZmFpbGVkIHdpdGg6ICIrdCksW119cmV0dXJuW119ZnVuY3Rpb24gYSh0LG4pe2lmKG4uc3Ryb2tlKXt0LmxpbmVXaWR0aD1yKG4pO3ZhciBpPWUuY29sb3Iobi5zdHJva2UpLGE9byhuKTt0LnNldExpbmVEYXNoKGEpLGkub3BhY2l0eSo9KGZ1bmN0aW9uIHModCl7dmFyIGU9bnVsbCE9dC5vcGFjaXR5P3BhcnNlRmxvYXQodC5vcGFjaXR5KToxO3JldHVybihudWxsIT10WyJzdHJva2Utb3BhY2l0eSJdP3BhcnNlRmxvYXQodFsic3Ryb2tlLW9wYWNpdHkiXSk6MSkqZX0pKG4pLHQuc3Ryb2tlU3R5bGU9aS50b1N0cmluZygpLHQuc3Ryb2tlKCl9aWYobi5maWxsKXt2YXIgbD1lLmNvbG9yKG4uZmlsbCk7bC5vcGFjaXR5Kj0oZnVuY3Rpb24gYyh0KXt2YXIgZT1udWxsIT10Lm9wYWNpdHk/cGFyc2VGbG9hdCh0Lm9wYWNpdHkpOjE7cmV0dXJuKG51bGwhPXRbImZpbGwtb3BhY2l0eSJdP3BhcnNlRmxvYXQodFsiZmlsbC1vcGFjaXR5Il0pOjEpKmV9KShuKSx0LmZpbGxTdHlsZT1sLnRvU3RyaW5nKCksdC5maWxsKCl9fXQuQ2FudmFzRHJhd2VyPW4sdC5Db250ZXh0U3R5bGVBdHRycz1bImZpbGwtb3BhY2l0eSIsImZpbGwiLCJvcGFjaXR5Iiwic3Ryb2tlLW9wYWNpdHkiLCJzdHJva2Utd2lkdGgiLCJzdHJva2UiLCJzdHJva2UtZGFzaGFycmF5Il0sdC5yZXNvbHZlQXR0cmlidXRlc1N1YnNldFdpdGhTdHlsZXM9ZnVuY3Rpb24gcyhlLG4scixvKXtyZXR1cm4gaShlLHQuQ29udGV4dFN0eWxlQXR0cnMuY29uY2F0KG4pLHIsbyl9LHQucmVzb2x2ZUF0dHJpYnV0ZXM9aSx0LmdldFN0cm9rZVdpZHRoPXIsdC5nZXRTdHJva2VEYXNoQXJyYXk9byx0LnJlbmRlckFyZWE9ZnVuY3Rpb24gbCh0LGUsbixpKXt0LnNhdmUoKSx0LmJlZ2luUGF0aCgpLGUuY29udGV4dCh0KSxlKG4pLHQubGluZUpvaW49InJvdW5kIixhKHQsaSksdC5yZXN0b3JlKCl9LHQucmVuZGVyTGluZT1mdW5jdGlvbiBjKHQsZSxuLGkpe3Quc2F2ZSgpLHQuYmVnaW5QYXRoKCksZS5jb250ZXh0KHQpLGUobiksdC5saW5lSm9pbj0icm91bmQiLGEodCxpKSx0LnJlc3RvcmUoKX0sdC5yZW5kZXJQYXRoV2l0aFN0eWxlPWF9KShHd3QpO3ZhciBXd3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KFd3dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHF3dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5fc3ZnRHJhd2VyRmFjdG9yeT10LHRoaXMuX2NhbnZhc0RyYXdlckZhY3Rvcnk9ZX1yZXR1cm4gdC5wcm90b3R5cGUudXNlU1ZHPWZ1bmN0aW9uKHQpe251bGwhPXRoaXMuX2N1cnJlbnREcmF3ZXImJnRoaXMuX2N1cnJlbnREcmF3ZXIucmVtb3ZlKCk7dmFyIGU9dGhpcy5fc3ZnRHJhd2VyRmFjdG9yeSgpO2UuYXR0YWNoVG8odCksdGhpcy5fY3VycmVudERyYXdlcj1lfSx0LnByb3RvdHlwZS51c2VDYW52YXM9ZnVuY3Rpb24odCl7bnVsbCE9dGhpcy5fY3VycmVudERyYXdlciYmdGhpcy5fY3VycmVudERyYXdlci5yZW1vdmUoKSx0aGlzLl9jdXJyZW50RHJhd2VyPXRoaXMuX2NhbnZhc0RyYXdlckZhY3RvcnkodC5ub2RlKCkuZ2V0Q29udGV4dCgiMmQiKSl9LHQucHJvdG90eXBlLmdldERyYXdlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jdXJyZW50RHJhd2VyfSx0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXtudWxsIT10aGlzLl9jdXJyZW50RHJhd2VyJiZ0aGlzLl9jdXJyZW50RHJhd2VyLnJlbW92ZSgpfSx0LnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKHQsZSl7dGhpcy5fY3VycmVudERyYXdlci5kcmF3KHQsZSl9LHQucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY3VycmVudERyYXdlci5nZXRWaXN1YWxQcmltaXRpdmVzKCl9LHQucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2N1cnJlbnREcmF3ZXIuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleCh0KX0sdH0pKCk7V3d0LlByb3h5RHJhd2VyPXF3dDt2YXIgWXd0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShZd3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBYd3Q9RWR0LCR3dD1GZ3QsS3d0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLl9yb290PVh3dC5zZWxlY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsImciKSksdGhpcy5fY2xhc3NOYW1lPWUsdGhpcy5fc3ZnRWxlbWVudE5hbWU9dH1yZXR1cm4gdC5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7dGhpcy5fY3JlYXRlQW5kRGVzdHJveURPTUVsZW1lbnRzKHQpO2Zvcih2YXIgaT0wLHI9ZS5sZW5ndGgsbz1mdW5jdGlvbihyKXt2YXIgbz1lW3JdOyR3dC5XaW5kb3cuc2V0VGltZW91dCgoZnVuY3Rpb24oKXtyZXR1cm4gbi5fZHJhd1N0ZXAobyl9KSxpKSxpKz1vLmFuaW1hdG9yLnRvdGFsVGltZSh0Lmxlbmd0aCl9LGE9MDthPHI7YSsrKW8oYSl9LHQucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09dGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzJiYodGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzPXRoaXMuX3NlbGVjdGlvbi5ub2RlcygpKSx0aGlzLl9jYWNoZWRWaXN1YWxQcmltaXRpdmVzTm9kZXN9LHQucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXRoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2RlTWFwP251bGw6dGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVNYXAuZ2V0KHQpfSx0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLl9yb290LnJlbW92ZSgpfSx0LnByb3RvdHlwZS5hdHRhY2hUbz1mdW5jdGlvbih0KXt0Lm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLl9yb290Lm5vZGUoKSl9LHQucHJvdG90eXBlLmdldFJvb3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm9vdH0sdC5wcm90b3R5cGUuc2VsZWN0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3ZnRWxlbWVudE5hbWV9LHQucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKHQpe30sdC5wcm90b3R5cGUuX2NyZWF0ZUFuZERlc3Ryb3lET01FbGVtZW50cz1mdW5jdGlvbih0KXt2YXIgZT10Lm1hcCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dD97ZDp0LGk6ZX06bnVsbH0pKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10fSkpLG49dGhpcy5fcm9vdC5zZWxlY3RBbGwodGhpcy5zZWxlY3RvcigpKS5kYXRhKGUpO3RoaXMuX3NlbGVjdGlvbj1uLmVudGVyKCkuYXBwZW5kKHRoaXMuX3N2Z0VsZW1lbnROYW1lKS5tZXJnZShuKSxuLmV4aXQoKS5yZW1vdmUoKTt2YXIgaT1uZXcgJHd0Lk1hcDt0aGlzLl9zZWxlY3Rpb24uZWFjaCgoZnVuY3Rpb24odCl7aS5zZXQodC5pLHRoaXMpfSkpLHRoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2RlTWFwPWksdGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzPW51bGwsdGhpcy5fc2VsZWN0aW9uLmRhdGEodGhpcy5fc2VsZWN0aW9uLmRhdGEoKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmR9KSkpLG51bGwhPXRoaXMuX2NsYXNzTmFtZSYmdGhpcy5fc2VsZWN0aW9uLmNsYXNzZWQodGhpcy5fY2xhc3NOYW1lLCEwKSx0aGlzLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzKHRoaXMuX3NlbGVjdGlvbil9LHQucHJvdG90eXBlLl9kcmF3U3RlcD1mdW5jdGlvbih0KXt2YXIgZT10aGlzO1siZmlsbCIsInN0cm9rZSJdLmZvckVhY2goKGZ1bmN0aW9uKG4pe251bGwhPXQuYXR0clRvQXBwbGllZFByb2plY3RvcltuXSYmZS5fc2VsZWN0aW9uLmF0dHIobix0LmF0dHJUb0FwcGxpZWRQcm9qZWN0b3Jbbl0pfSkpLHQuYW5pbWF0b3IuYW5pbWF0ZSh0aGlzLl9zZWxlY3Rpb24sdC5hdHRyVG9BcHBsaWVkUHJvamVjdG9yKSxudWxsIT10aGlzLl9jbGFzc05hbWUmJnRoaXMuX3NlbGVjdGlvbi5jbGFzc2VkKHRoaXMuX2NsYXNzTmFtZSwhMCl9LHR9KSgpO1l3dC5TVkdEcmF3ZXI9S3d0O3ZhciBad3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTctcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KFp3dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIEp3dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIHQ9dGhpczt0aGlzLnNjYWxlPTAsdGhpcy50cmFuc2xhdGU9MCx0aGlzLmNhY2hlZERvbWFpbj1bbnVsbCxudWxsXSx0aGlzLmxhc3RTZWVuRG9tYWluPVtudWxsLG51bGxdLHRoaXMudXBkYXRlRG9tYWluPWZ1bmN0aW9uKGUpe3QubGFzdFNlZW5Eb21haW49ZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpO3ZhciBuPWUuc2NhbGVUcmFuc2Zvcm1hdGlvbih0LmNhY2hlZERvbWFpblsxXSktZS5zY2FsZVRyYW5zZm9ybWF0aW9uKHQuY2FjaGVkRG9tYWluWzBdKSxpPWUuc2NhbGVUcmFuc2Zvcm1hdGlvbih0Lmxhc3RTZWVuRG9tYWluWzFdKS1lLnNjYWxlVHJhbnNmb3JtYXRpb24odC5sYXN0U2VlbkRvbWFpblswXSk7dC5zY2FsZT1uL2l8fDEsdC50cmFuc2xhdGU9ZS5zY2FsZVRyYW5zZm9ybWF0aW9uKHQuY2FjaGVkRG9tYWluWzBdKS1lLnNjYWxlVHJhbnNmb3JtYXRpb24odC5sYXN0U2VlbkRvbWFpblswXSkqdC5zY2FsZXx8MH19cmV0dXJuIHQucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5zY2FsZT0xLHRoaXMudHJhbnNsYXRlPTAsdGhpcy5jYWNoZWREb21haW49dGhpcy5sYXN0U2VlbkRvbWFpbn0sdC5wcm90b3R5cGUuc2V0RG9tYWluPWZ1bmN0aW9uKHQpe3RoaXMuY2FjaGVkRG9tYWluPXQuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKX0sdH0pKCksUXd0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuKXt2YXIgaT10aGlzO3RoaXMucmVuZGVyQ2FsbGJhY2s9ZSx0aGlzLmFwcGx5VHJhbnNmb3JtQ2FsbGJhY2s9bix0aGlzLmRvbWFpblRyYW5zZm9ybVg9bmV3IEp3dCx0aGlzLmRvbWFpblRyYW5zZm9ybVk9bmV3IEp3dCx0aGlzLnJlbmRlckRlZmVycmVkPWZ1bmN0aW9uKCl7aS5hcHBseVRyYW5zZm9ybSgpLGNsZWFyVGltZW91dChpLnRpbWVvdXRUb2tlbiksaS50aW1lb3V0VG9rZW49c2V0VGltZW91dCgoZnVuY3Rpb24oKXtpLnJlbmRlckNhbGxiYWNrKCl9KSx0LkRFRkVSUkVEX1JFTkRFUklOR19ERUxBWSl9fXJldHVybiB0LnByb3RvdHlwZS5zZXREb21haW5zPWZ1bmN0aW9uKHQsZSl7dCYmdGhpcy5kb21haW5UcmFuc2Zvcm1YLnNldERvbWFpbih0KSxlJiZ0aGlzLmRvbWFpblRyYW5zZm9ybVkuc2V0RG9tYWluKGUpLHRoaXMucmVuZGVyRGVmZXJyZWQoKX0sdC5wcm90b3R5cGUudXBkYXRlRG9tYWlucz1mdW5jdGlvbih0LGUpe3QmJnRoaXMuZG9tYWluVHJhbnNmb3JtWC51cGRhdGVEb21haW4odCksZSYmdGhpcy5kb21haW5UcmFuc2Zvcm1ZLnVwZGF0ZURvbWFpbihlKSx0aGlzLnJlbmRlckRlZmVycmVkKCl9LHQucHJvdG90eXBlLnJlc2V0VHJhbnNmb3Jtcz1mdW5jdGlvbigpe3RoaXMuZG9tYWluVHJhbnNmb3JtWC5yZXNldCgpLHRoaXMuZG9tYWluVHJhbnNmb3JtWS5yZXNldCgpLHRoaXMuYXBwbHlUcmFuc2Zvcm0oKX0sdC5wcm90b3R5cGUuYXBwbHlUcmFuc2Zvcm09ZnVuY3Rpb24oKXt0aGlzLmFwcGx5VHJhbnNmb3JtQ2FsbGJhY2sodGhpcy5kb21haW5UcmFuc2Zvcm1YLnRyYW5zbGF0ZSx0aGlzLmRvbWFpblRyYW5zZm9ybVkudHJhbnNsYXRlLHRoaXMuZG9tYWluVHJhbnNmb3JtWC5zY2FsZSx0aGlzLmRvbWFpblRyYW5zZm9ybVkuc2NhbGUpfSx0LkRFRkVSUkVEX1JFTkRFUklOR19ERUxBWT0yMDAsdH0pKCk7Wnd0LkRlZmVycmVkUmVuZGVyZXI9UXd0LAovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodXd0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgdFN0PXVPLGVTdD1FZHQsblN0PV9tdCxpU3Q9Rmd0LHJTdD1od3Qsb1N0PWR3dCxhU3Q9Qmd0LHNTdD1Hd3QsbFN0PVd3dCxjU3Q9WXd0LHVTdD1ibXQsaFN0PVp3dDt1d3QuUmVuZGVyZXI9U210Lm1ha2VFbnVtKFsic3ZnIiwiY2FudmFzIl0pO3ZhciBkU3Q9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7bi5fZGF0YUNoYW5nZWQ9ITEsbi5fYXR0ckV4dGVudHM9e30sbi5fYW5pbWF0ZT0hMSxuLl9hbmltYXRvcnM9e30sbi5fcHJvcGVydHlFeHRlbnRzPXt9LG4uX3Jlc2V0RW50aXR5U3RvcmU9ZnVuY3Rpb24oKXtuLl9jYWNoZWRFbnRpdHlTdG9yZT12b2lkIDB9LG4uX292ZXJmbG93SGlkZGVuPSEwLG4uYWRkQ2xhc3MoInBsb3QiKSxuLl9kYXRhc2V0VG9EcmF3ZXI9bmV3IGlTdC5NYXAsbi5fYXR0ckJpbmRpbmdzPWVTdC5tYXAoKSxuLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uX2luY2x1ZGVkVmFsdWVzRm9yU2NhbGUodCxlKX0sbi5fcmVuZGVyQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gbi5yZW5kZXIoKX0sbi5fb25EYXRhc2V0VXBkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gbi5fb25EYXRhc2V0VXBkYXRlKCl9LG4uX3Byb3BlcnR5QmluZGluZ3M9ZVN0Lm1hcCgpO3ZhciBpPShuZXcgblN0LkVhc2luZykubWF4VG90YWxEdXJhdGlvbihlLl9BTklNQVRJT05fTUFYX0RVUkFUSU9OKTtyZXR1cm4gbi5hbmltYXRvcihyU3QuQW5pbWF0b3IuTUFJTixpKSxuLmFuaW1hdG9yKHJTdC5BbmltYXRvci5SRVNFVCxuZXcgblN0Lk51bGwpLG4uX2RlZmVycmVkUmVzZXRFbnRpdHlTdG9yZT1pU3QuV2luZG93LmRlYm91bmNlKGhTdC5EZWZlcnJlZFJlbmRlcmVyLkRFRkVSUkVEX1JFTkRFUklOR19ERUxBWSxuLl9yZXNldEVudGl0eVN0b3JlKSxufXJldHVybiB0U3QuX19leHRlbmRzKGUsdCksZS5nZXRUb3RhbERyYXdUaW1lPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUucmVkdWNlKChmdW5jdGlvbihlLG4pe3JldHVybiBlK24uYW5pbWF0b3IudG90YWxUaW1lKHQubGVuZ3RoKX0pLDApfSxlLmFwcGx5RHJhd1N0ZXBzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQubWFwKChmdW5jdGlvbih0KXt2YXIgbj10LmF0dHJUb1Byb2plY3RvcixpPXt9O3JldHVybiBPYmplY3Qua2V5cyhuKS5mb3JFYWNoKChmdW5jdGlvbih0KXtpW3RdPWZ1bmN0aW9uKGkscil7cmV0dXJuIG5bdF0oaSxyLGUpfX0pKSx7YXR0clRvQXBwbGllZFByb2plY3RvcjppLGFuaW1hdG9yOnQuYW5pbWF0b3J9fSkpfSxlLnByb3RvdHlwZS5hbmNob3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dVN0LmNvZXJjZUV4dGVybmFsRDMoZSksdC5wcm90b3R5cGUuYW5jaG9yLmNhbGwodGhpcyxlKSx0aGlzLl9kYXRhQ2hhbmdlZD0hMCx0aGlzLl9yZXNldEVudGl0eVN0b3JlKCksdGhpcy5fdXBkYXRlRXh0ZW50cygpLHRoaXN9LGUucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5faXNTZXR1cHx8KHQucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpLG51bGwhPXRoaXMuX2NhbnZhcyYmdGhpcy5fYXBwZW5kQ2FudmFzTm9kZSgpLHRoaXMuX3JlbmRlckFyZWE9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgicmVuZGVyLWFyZWEiLCEwKSx0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldCh0KX0pKSl9LGUucHJvdG90eXBlLl9hcHBlbmRDYW52YXNOb2RlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbGVtZW50KCkuc2VsZWN0KCIucGxvdC1jYW52YXMtY29udGFpbmVyIik7dC5lbXB0eSgpJiYodD10aGlzLmVsZW1lbnQoKS5hcHBlbmQoImRpdiIpLmNsYXNzZWQoInBsb3QtY2FudmFzLWNvbnRhaW5lciIsITApKS5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fY2FudmFzLm5vZGUoKSl9LGUucHJvdG90eXBlLnNldEJvdW5kcz1mdW5jdGlvbihlLG4saSxyKXtpZih0LnByb3RvdHlwZS5zZXRCb3VuZHMuY2FsbCh0aGlzLGUsbixpLHIpLHRoaXMuX3VwZGF0ZUV4dGVudHMoKSxudWxsIT10aGlzLl9jYW52YXMpe2lmKHRoaXMuX2J1ZmZlckNhbnZhcyYmIXRoaXMuX2J1ZmZlckNhbnZhc1ZhbGlkKXt0aGlzLl9idWZmZXJDYW52YXMuYXR0cigid2lkdGgiLHRoaXMuX2NhbnZhcy5hdHRyKCJ3aWR0aCIpKSx0aGlzLl9idWZmZXJDYW52YXMuYXR0cigiaGVpZ2h0Iix0aGlzLl9jYW52YXMuYXR0cigiaGVpZ2h0IikpO3ZhciBvPXRoaXMuX2J1ZmZlckNhbnZhcy5ub2RlKCkuZ2V0Q29udGV4dCgiMmQiKTtpZihvKXt2YXIgYT10aGlzLl9jYW52YXMubm9kZSgpO2Eud2lkdGg+MCYmYS5oZWlnaHQ+MD9vLmNhbnZhcy53aWR0aD4wJiZvLmNhbnZhcy5oZWlnaHQ+MCYmby5kcmF3SW1hZ2UoYSwwLDApOmNvbnNvbGUud2FybigiRmFpbGVkIHRvIGZpbGwgYnVmZmVyIGNhbnZhcyB3aXRoIHdpdGggMHgwIGNhbnZhcyIpfXRoaXMuX2J1ZmZlckNhbnZhc1ZhbGlkPSEwfXZhciBzPW51bGwhPXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvP3dpbmRvdy5kZXZpY2VQaXhlbFJhdGlvOjE7dGhpcy5fY2FudmFzLmF0dHIoIndpZHRoIixlKnMpLHRoaXMuX2NhbnZhcy5hdHRyKCJoZWlnaHQiLG4qcyk7dmFyIGw9dGhpcy5fY2FudmFzLm5vZGUoKS5nZXRDb250ZXh0KCIyZCIpO2lmKGwmJihsLnNldFRyYW5zZm9ybShzLDAsMCxzLDAsMCksdGhpcy5fYnVmZmVyQ2FudmFzKSl7dmFyIGM9dGhpcy5fYnVmZmVyQ2FudmFzLm5vZGUoKTtjLndpZHRoPjAmJmMuaGVpZ2h0PjA/bC5jYW52YXMud2lkdGg+MCYmbC5jYW52YXMuaGVpZ2h0PjAmJmwuZHJhd0ltYWdlKGMsMCwwLGUsbik6Y29uc29sZS53YXJuKCJGYWlsZWQgdG8gZmlsbCBjYW52YXMgd2l0aCAweDAgYnVmZmVyIGNhbnZhcyIpfX1yZXR1cm4gdGhpc30sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpLHRoaXMuX3NjYWxlcygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm9mZlVwZGF0ZShlLl9yZW5kZXJDYWxsYmFjayl9KSksdGhpcy5kYXRhc2V0cyhbXSl9LGUucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZGF0YXNldFRvRHJhd2VyLmdldCh0KTtyZXR1cm4ic3ZnIj09PXRoaXMucmVuZGVyZXIoKT9lLnVzZVNWRyh0aGlzLl9yZW5kZXJBcmVhKTplLnVzZUNhbnZhcyh0aGlzLl9jYW52YXMpLGV9LGUucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBsU3QuUHJveHlEcmF3ZXIoKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBjU3QuU1ZHRHJhd2VyKCJwYXRoIiwiIil9KSwoZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBzU3QuQ2FudmFzRHJhd2VyKHQsKGZ1bmN0aW9uKCl7fSkpfSkpfSxlLnByb3RvdHlwZS5fZ2V0QW5pbWF0b3I9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSYmdGhpcy5fYW5pbWF0b3JzW3RdfHxuZXcgblN0Lk51bGx9LGUucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVFeHRlbnRzKCksdGhpcy5fZGF0YUNoYW5nZWQ9ITAsdGhpcy5fcmVzZXRFbnRpdHlTdG9yZSgpLHRoaXMucmVuZGVyTG93UHJpb3JpdHkoKX0sZS5wcm90b3R5cGUuYXR0cj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG51bGw9PWU/dGhpcy5fYXR0ckJpbmRpbmdzLmdldCh0KToodGhpcy5fYmluZEF0dHIodCxlLG4pLHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLl9iaW5kUHJvcGVydHk9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQodCksbz1udWxsIT1yP3Iuc2NhbGU6bnVsbDt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLnNldCh0LHthY2Nlc3NvcjoiZnVuY3Rpb24iPT10eXBlb2YgZT9lOmZ1bmN0aW9uKCl7cmV0dXJuIGV9LHNjYWxlOm4scG9zdFNjYWxlOml9KSxudWxsIT1vJiZ0aGlzLl91bmluc3RhbGxTY2FsZUZvcktleShvLHQpLG51bGwhPW4mJnRoaXMuX2luc3RhbGxTY2FsZUZvcktleShuLHQpLHRoaXMuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGUoKX0sZS5wcm90b3R5cGUuX2JpbmRBdHRyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLl9hdHRyQmluZGluZ3MuZ2V0KHQpLHI9bnVsbCE9aT9pLnNjYWxlOm51bGw7dGhpcy5fYXR0ckJpbmRpbmdzLnNldCh0LHthY2Nlc3NvcjoiZnVuY3Rpb24iPT10eXBlb2YgZT9lOmZ1bmN0aW9uKCl7cmV0dXJuIGV9LHNjYWxlOm59KSxudWxsIT1yJiZ0aGlzLl91bmluc3RhbGxTY2FsZUZvcktleShyLHQpLG51bGwhPW4mJnRoaXMuX2luc3RhbGxTY2FsZUZvcktleShuLHQpLHRoaXMuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGUoKX0sZS5wcm90b3R5cGUuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGU9ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yfSxlLnByb3RvdHlwZS5fZ2V0QXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7aWYobnVsbD09dGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yKXt2YXIgdD10aGlzLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3RvcigpO2UuT1BUSU1JWkVfTUVNT0laRV9QUk9KRUNUT1JTJiYodD1vU3QubWVtb2l6ZVByb2plY3RvcnModCkpLHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3Rvcj10fXJldHVybiBpU3QuYXNzaWduKHt9LHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3Rvcil9LGUucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe3ZhciB0PXt9O3RoaXMuX2F0dHJCaW5kaW5ncy5lYWNoKChmdW5jdGlvbihuLGkpe3RbaV09ZS5fc2NhbGVkQWNjZXNzb3Iobil9KSk7dmFyIG49dGhpcy5fcHJvcGVydHlQcm9qZWN0b3JzKCk7cmV0dXJuIE9iamVjdC5rZXlzKG4pLmZvckVhY2goKGZ1bmN0aW9uKGUpe251bGw9PXRbZV0mJih0W2VdPW5bZV0pfSkpLHR9LGUucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyksdGhpcy5faXNBbmNob3JlZCYmKHRoaXMuX3BhaW50KCksdGhpcy5fZGF0YUNoYW5nZWQ9ITEpLHRoaXN9LGUucHJvdG90eXBlLnJlbmRlckxvd1ByaW9yaXR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlbmRlckNhbGxiYWNrKCksdGhpc30sZS5wcm90b3R5cGUuYW5pbWF0ZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fYW5pbWF0ZToodGhpcy5fYW5pbWF0ZT10LHRoaXMpfSxlLnByb3RvdHlwZS5kZXRhY2g9ZnVuY3Rpb24oKXtyZXR1cm4gdC5wcm90b3R5cGUuZGV0YWNoLmNhbGwodGhpcyksdGhpcy5fdXBkYXRlRXh0ZW50cygpLHRoaXN9LGUucHJvdG90eXBlLl9zY2FsZXM9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5fYXR0ckJpbmRpbmdzLmVhY2goKGZ1bmN0aW9uKGUsbil7dmFyIGk9ZS5zY2FsZTtudWxsIT1pJiYtMT09PXQuaW5kZXhPZihpKSYmdC5wdXNoKGkpfSkpLHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZWFjaCgoZnVuY3Rpb24oZSxuKXt2YXIgaT1lLnNjYWxlO251bGwhPWkmJi0xPT09dC5pbmRleE9mKGkpJiZ0LnB1c2goaSl9KSksdH0sZS5wcm90b3R5cGUuX3VwZGF0ZUV4dGVudHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX3Jlc2V0RW50aXR5U3RvcmUoKSx0aGlzLl9zY2FsZXMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXtyZXR1cm4gZS5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHQuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXIpfSkpfSxlLnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGx9LGUucHJvdG90eXBlLmdldEV4dGVudHNGb3JBdHRyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYobnVsbD09dGhpcy5fYXR0ckV4dGVudHNbdF0pe3ZhciBuPW9TdC5tZW1UaHVuaygoZnVuY3Rpb24oKXtyZXR1cm4gZS5kYXRhc2V0cygpfSksKGZ1bmN0aW9uKCl7cmV0dXJuIGUuX2F0dHJCaW5kaW5ncy5nZXQodCl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09ZXx8bnVsbD09ZS5hY2Nlc3Nvcj9udWxsOnQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gcFN0KHQsZSxudWxsKX0pKX0pKTt0aGlzLl9hdHRyRXh0ZW50c1t0XT1ufXJldHVybiB0aGlzLl9hdHRyRXh0ZW50c1t0XSgpfSxlLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZihudWxsPT10aGlzLl9wcm9wZXJ0eUV4dGVudHNbdF0pe3ZhciBuPW9TdC5tZW1UaHVuaygoZnVuY3Rpb24oKXtyZXR1cm4gZS5kYXRhc2V0cygpfSksKGZ1bmN0aW9uKCl7cmV0dXJuIGUuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHQpfSksKGZ1bmN0aW9uKCl7cmV0dXJuIGUuX2ZpbHRlckZvclByb3BlcnR5KHQpfSksKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbnVsbD09ZXx8bnVsbD09ZS5hY2Nlc3Nvcj9udWxsOnQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gcFN0KHQsZSxuKX0pKX0pKTt0aGlzLl9wcm9wZXJ0eUV4dGVudHNbdF09bn1yZXR1cm4gdGhpcy5fcHJvcGVydHlFeHRlbnRzW3RdKCl9LGUucHJvdG90eXBlLl9pbmNsdWRlZFZhbHVlc0ZvclNjYWxlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpZighdGhpcy5faXNBbmNob3JlZCYmIWUpcmV0dXJuW107dmFyIGk9W107cmV0dXJuIHRoaXMuX2F0dHJCaW5kaW5ncy5lYWNoKChmdW5jdGlvbihlLHIpe2lmKGUuc2NhbGU9PT10KXt2YXIgbz1uLmdldEV4dGVudHNGb3JBdHRyKHIpO251bGwhPW8mJihpPWkuY29uY2F0KGVTdC5tZXJnZShvKSkpfX0pKSx0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmVhY2goKGZ1bmN0aW9uKGUscil7aWYoZS5zY2FsZT09PXQpe3ZhciBvPW4uZ2V0RXh0ZW50c0ZvclByb3BlcnR5KHIpO251bGwhPW8mJihpPWkuY29uY2F0KGVTdC5tZXJnZShvKSkpfX0pKSxpfSxlLnByb3RvdHlwZS5hbmltYXRvcj1mdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lP3RoaXMuX2FuaW1hdG9yc1t0XToodGhpcy5fYW5pbWF0b3JzW3RdPWUsdGhpcyl9LGUucHJvdG90eXBlLnJlbmRlcmVyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7cmV0dXJuIHZvaWQgMD09PXQ/bnVsbD09dGhpcy5fY2FudmFzPyJzdmciOiJjYW52YXMiOihudWxsPT10aGlzLl9jYW52YXMmJiJjYW52YXMiPT09dD8odGhpcy5fY2FudmFzPWVTdC5zZWxlY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikpLmNsYXNzZWQoInBsb3QtY2FudmFzIiwhMCksdGhpcy5fYnVmZmVyQ2FudmFzPWVTdC5zZWxlY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikpLG51bGwhPXRoaXMuZWxlbWVudCgpJiZ0aGlzLl9hcHBlbmRDYW52YXNOb2RlKCksdGhpcy5fZGF0YXNldFRvRHJhd2VyLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QudXNlQ2FudmFzKGUuX2NhbnZhcyl9KSksdGhpcy5yZW5kZXIoKSk6bnVsbCE9dGhpcy5fY2FudmFzJiYic3ZnIj09dCYmKHRoaXMuX2NhbnZhcy5yZW1vdmUoKSx0aGlzLl9jYW52YXM9bnVsbCx0aGlzLl9idWZmZXJDYW52YXM9bnVsbCx0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC51c2VTVkcoZS5fcmVuZGVyQXJlYSl9KSksdGhpcy5yZW5kZXIoKSksdGhpcyl9LGUucHJvdG90eXBlLmFkZERhdGFzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FkZERhdGFzZXQodCksdGhpcy5fb25EYXRhc2V0VXBkYXRlKCksdGhpc30sZS5wcm90b3R5cGUuX2FkZERhdGFzZXQ9ZnVuY3Rpb24odCl7dGhpcy5fcmVtb3ZlRGF0YXNldCh0KTt2YXIgZT10aGlzLl9jcmVhdGVEcmF3ZXIodCk7cmV0dXJuIHRoaXMuX2RhdGFzZXRUb0RyYXdlci5zZXQodCxlKSx0aGlzLl9pc1NldHVwJiZ0aGlzLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQodCksdC5vblVwZGF0ZSh0aGlzLl9vbkRhdGFzZXRVcGRhdGVDYWxsYmFjayksdGhpc30sZS5wcm90b3R5cGUucmVtb3ZlRGF0YXNldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVtb3ZlRGF0YXNldCh0KSx0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKSx0aGlzfSxlLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldD1mdW5jdGlvbih0KXtyZXR1cm4tMT09PXRoaXMuZGF0YXNldHMoKS5pbmRleE9mKHQpfHwodGhpcy5fcmVtb3ZlRGF0YXNldE5vZGVzKHQpLHQub2ZmVXBkYXRlKHRoaXMuX29uRGF0YXNldFVwZGF0ZUNhbGxiYWNrKSx0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZGVsZXRlKHQpKSx0aGlzfSxlLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzPWZ1bmN0aW9uKHQpe3RoaXMuX2RhdGFzZXRUb0RyYXdlci5nZXQodCkucmVtb3ZlKCl9LGUucHJvdG90eXBlLmRhdGFzZXRzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1bXTtyZXR1cm4gdGhpcy5fZGF0YXNldFRvRHJhd2VyLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4ucHVzaChlKX0pKSxudWxsPT10P246KG4uZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX3JlbW92ZURhdGFzZXQodCl9KSksdC5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fYWRkRGF0YXNldCh0KX0pKSx0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKSx0aGlzKX0sZS5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7cmV0dXJuW3thdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6bmV3IG5TdC5OdWxsfV19LGUucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24odCl7fSxlLnByb3RvdHlwZS5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxpKXtmb3IodmFyIHI9ZS5fZGF0YXNldFRvRHJhd2VyLmdldCh0KSxvPTAsYT10LmRhdGEoKSxzPWEubGVuZ3RoLGw9ZnVuY3Rpb24ocyl7dmFyIGw9YVtzXSxjPWUuX3BpeGVsUG9pbnQobCxzLHQpO2lmKGlTdC5NYXRoLmlzTmFOKGMueCl8fGlTdC5NYXRoLmlzTmFOKGMueSkpcmV0dXJuImNvbnRpbnVlIjt2YXIgdT1lO24ucHVzaCh7ZGF0dW06bCxnZXQgcG9zaXRpb24oKXtyZXR1cm4gdS5fcGl4ZWxQb2ludC5jYWxsKHUsbCxzLHQpfSxpbmRleDpzLGRhdGFzZXQ6dCxkYXRhc2V0SW5kZXg6aSxjb21wb25lbnQ6ZSxkcmF3ZXI6cix2YWxpZERhdHVtSW5kZXg6b30pLG8rK30sYz0wO2M8cztjKyspbChjKX0pKSxufSxlLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciB0PW5ldyBpU3QuTWFwO3JldHVybiB0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuc2V0KGUsZS5kYXRhKCkpfSkpLHR9LGUucHJvdG90eXBlLl9wYWludD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7ZGVsZXRlIHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3Rvcjt2YXIgbj10aGlzLl9nZW5lcmF0ZURyYXdTdGVwcygpLGk9dGhpcy5fZ2V0RGF0YVRvRHJhdygpLHI9dGhpcy5kYXRhc2V0cygpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuX2RhdGFzZXRUb0RyYXdlci5nZXQoZSl9KSk7aWYoImNhbnZhcyI9PT10aGlzLnJlbmRlcmVyKCkpe3ZhciBvPXRoaXMuX2NhbnZhcy5ub2RlKCk7by5nZXRDb250ZXh0KCIyZCIpLmNsZWFyUmVjdCgwLDAsby5jbGllbnRXaWR0aCxvLmNsaWVudEhlaWdodCksdGhpcy5fYnVmZmVyQ2FudmFzVmFsaWQ9ITF9dGhpcy5kYXRhc2V0cygpLmZvckVhY2goKGZ1bmN0aW9uKHQsbyl7dmFyIGE9ZS5hcHBseURyYXdTdGVwcyhuLHQpO3Jbb10uZHJhdyhpLmdldCh0KSxhKX0pKTt2YXIgYT10aGlzLmRhdGFzZXRzKCkubWFwKChmdW5jdGlvbih0LHIpe3JldHVybiBlLmdldFRvdGFsRHJhd1RpbWUoaS5nZXQodCksbil9KSkscz1pU3QuTWF0aC5tYXgoYSwwKTt0aGlzLl9hZGRpdGlvbmFsUGFpbnQocyl9LGUucHJvdG90eXBlLnNlbGVjdGlvbnM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZih2b2lkIDA9PT10JiYodD10aGlzLmRhdGFzZXRzKCkpLCJjYW52YXMiPT09dGhpcy5yZW5kZXJlcigpKXJldHVybiBlU3Quc2VsZWN0QWxsKCk7dmFyIG49W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGk9ZS5fZGF0YXNldFRvRHJhd2VyLmdldCh0KTtpZihudWxsIT1pKXt2YXIgcj1pLmdldFZpc3VhbFByaW1pdGl2ZXMoKTtuLnB1c2guYXBwbHkobixyKX19KSksZVN0LnNlbGVjdEFsbChuKX0sZS5wcm90b3R5cGUuZW50aXRpZXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4gdGhpcy5fZ2V0RW50aXR5U3RvcmUodCkuZW50aXRpZXMoKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkodCl9KSl9LGUucHJvdG90eXBlLmZpbHRlckVudGl0aWVzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7cmV0dXJuIHRoaXMuX2dldEVudGl0eVN0b3JlKCkuZW50aXRpZXMoKS5maWx0ZXIodCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KHQpfSkpfSxlLnByb3RvdHlwZS5fZ2V0RW50aXR5U3RvcmU9ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzLGk9ZnVuY3Rpb24odCl7cmV0dXJuIG4uX2VudGl0eUJvdW5kcyh0KX07cmV0dXJuIHZvaWQgMCE9PXQ/KChlPW5ldyBpU3QuRW50aXR5U3RvcmUpLmFkZEFsbCh0aGlzLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzKHQpLGksdGhpcy5fbG9jYWxPcmlnaW5Cb3VuZHMoKSksZSk6KHZvaWQgMD09PXRoaXMuX2NhY2hlZEVudGl0eVN0b3JlJiYoKGU9bmV3IGlTdC5FbnRpdHlTdG9yZSkuYWRkQWxsKHRoaXMuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXModGhpcy5kYXRhc2V0cygpKSxpLHRoaXMuX2xvY2FsT3JpZ2luQm91bmRzKCkpLHRoaXMuX2NhY2hlZEVudGl0eVN0b3JlPWUpLHRoaXMuX2NhY2hlZEVudGl0eVN0b3JlKX0sZS5wcm90b3R5cGUuX2xvY2FsT3JpZ2luQm91bmRzPWZ1bmN0aW9uKCl7cmV0dXJue3RvcExlZnQ6e3g6MCx5OjB9LGJvdHRvbVJpZ2h0Ont4OnRoaXMud2lkdGgoKSx5OnRoaXMuaGVpZ2h0KCl9fX0sZS5wcm90b3R5cGUuX2VudGl0eUJvdW5kcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9waXhlbFBvaW50KHQuZGF0dW0sdC5pbmRleCx0LmRhdGFzZXQpO3JldHVybnt4OmUueCx5OmUueSx3aWR0aDowLGhlaWdodDowfX0sZS5wcm90b3R5cGUuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eT1mdW5jdGlvbih0KXtyZXR1cm57Ym91bmRzOnRoaXMuX2VudGl0eUJvdW5kcyh0KSxjb21wb25lbnQ6dC5jb21wb25lbnQsZGF0YXNldDp0LmRhdGFzZXQsZGF0YXNldEluZGV4OnQuZGF0YXNldEluZGV4LGRhdHVtOnQuZGF0dW0saW5kZXg6dC5pbmRleCxwb3NpdGlvbjp0LnBvc2l0aW9uLHNlbGVjdGlvbjplU3Quc2VsZWN0KHQuZHJhd2VyLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXgodC52YWxpZERhdHVtSW5kZXgpKX19LGUucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJwbG90cyBtdXN0IGltcGxlbWVudCBlbnRpdGllc0F0Iil9LGUucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdHlOZWFyZXN0KHQpO3JldHVybiB2b2lkIDA9PT1lP3ZvaWQgMDp0aGlzLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoZSl9LGUucHJvdG90eXBlLmVudGl0aWVzSW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5lbnRpdGllc0luQm91bmRzKG51bGw9PWU/e3g6dC50b3BMZWZ0LngseTp0LnRvcExlZnQueSx3aWR0aDp0LmJvdHRvbVJpZ2h0LngtdC50b3BMZWZ0LngsaGVpZ2h0OnQuYm90dG9tUmlnaHQueS10LnRvcExlZnQueX06e3g6dC5taW4seTplLm1pbix3aWR0aDp0Lm1heC10Lm1pbixoZWlnaHQ6ZS5tYXgtZS5taW59KX0sZS5wcm90b3R5cGUuZW50aXRpZXNJbkJvdW5kcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllc0luQm91bmRzKHQpO2lmKG4pcmV0dXJuIG4ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KHQpfSkpfSxlLnByb3RvdHlwZS5lbnRpdGllc0luWEJvdW5kcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllc0luWEJvdW5kcyh0KTtpZihuKXJldHVybiBuLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eSh0KX0pKX0sZS5wcm90b3R5cGUuZW50aXRpZXNJbllCb3VuZHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXRoaXMuX2dldEVudGl0eVN0b3JlKCkuZW50aXRpZXNJbllCb3VuZHModCk7aWYobilyZXR1cm4gbi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkodCl9KSl9LGUucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbih0LGUpe3Qub2ZmVXBkYXRlKHRoaXMuX3JlbmRlckNhbGxiYWNrKSx0Lm9mZlVwZGF0ZSh0aGlzLl9kZWZlcnJlZFJlc2V0RW50aXR5U3RvcmUpLHQucmVtb3ZlSW5jbHVkZWRWYWx1ZXNQcm92aWRlcih0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKX0sZS5wcm90b3R5cGUuX2luc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbih0LGUpe3Qub25VcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spLHQub25VcGRhdGUodGhpcy5fZGVmZXJyZWRSZXNldEVudGl0eVN0b3JlKSx0LmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXIodGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcil9LGUucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXtyZXR1cm57fX0sZS5fc2NhbGVkQWNjZXNzb3I9ZnVuY3Rpb24odCl7dmFyIGU9dC5zY2FsZSxuPXQuYWNjZXNzb3IsaT10LnBvc3RTY2FsZSxyPW51bGw9PWU/bjpmdW5jdGlvbih0LGkscil7cmV0dXJuIGUuc2NhbGUobih0LGkscikpfTtyZXR1cm4gbnVsbD09aT9yOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaShyKHQsZSxuKSx0LGUsbil9fSxlLnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbih0LGUsbil7cmV0dXJue3g6MCx5OjB9fSxlLnByb3RvdHlwZS5fYW5pbWF0ZU9uTmV4dFJlbmRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbmltYXRlJiZ0aGlzLl9kYXRhQ2hhbmdlZH0sZS5PUFRJTUlaRV9NRU1PSVpFX1BST0pFQ1RPUlM9ITEsZS5fQU5JTUFUSU9OX01BWF9EVVJBVElPTj02MDAsZX0pKGFTdC5Db21wb25lbnQpO2Z1bmN0aW9uIHBTdCh0LGUsbil7dmFyIGk9ZS5hY2Nlc3NvcixyPWUuc2NhbGU7aWYobnVsbD09cilyZXR1cm5bXTt2YXIgbz10LmRhdGEoKTtudWxsIT1uJiYobz1vLmZpbHRlcigoZnVuY3Rpb24oZSxpKXtyZXR1cm4gbihlLGksdCl9KSkpO3ZhciBhPW8ubWFwKChmdW5jdGlvbihlLG4pe3JldHVybiBpKGUsbix0KX0pKTtyZXR1cm4gci5leHRlbnRPZlZhbHVlcyhhKX0KLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi91d3QuUGxvdD1kU3QsT2JqZWN0LmRlZmluZVByb3BlcnR5KGN3dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGZTdD11TyxtU3Q9dXd0LGdTdD1GZ3QsX1N0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gZlN0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24odCl7dmFyIGUsbj0xLzA7cmV0dXJuIHRoaXMuY29tcG9uZW50cygpLmZvckVhY2goKGZ1bmN0aW9uKGkpe3ZhciByPWkuZW50aXR5TmVhcmVzdCh0KTtpZihudWxsIT1yKXt2YXIgbz1nU3QuTWF0aC5kaXN0YW5jZVNxdWFyZWQoci5wb3NpdGlvbix0KTtvPD1uJiYobj1vLGU9cil9fSkpLGV9LGUucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbihlKXtpZihudWxsIT1lJiYhKGUgaW5zdGFuY2VvZiBtU3QuUGxvdCkpdGhyb3cgbmV3IEVycm9yKCJQbG90IEdyb3VwIG9ubHkgYWNjZXB0cyBwbG90cyIpO3JldHVybiB0LnByb3RvdHlwZS5hcHBlbmQuY2FsbCh0aGlzLGUpLHRoaXN9LGV9KShieHQuR3JvdXApO2N3dC5QbG90R3JvdXA9X1N0O3ZhciB5U3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KHlTdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHZTdD11TyxiU3Q9RWR0LHhTdD1GZ3Qsd1N0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPVtdKTt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4uX3Jvd1BhZGRpbmc9MCxuLl9jb2x1bW5QYWRkaW5nPTAsbi5fcm93cz1bXSxuLl9yb3dXZWlnaHRzPVtdLG4uX2NvbHVtbldlaWdodHM9W10sbi5fblJvd3M9MCxuLl9uQ29scz0wLG4uX2NhbGN1bGF0ZWRMYXlvdXQ9bnVsbCxuLmFkZENsYXNzKCJ0YWJsZSIpLGUuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQsaSl7bnVsbCE9dCYmbi5hZGQodCxlLGkpfSkpfSkpLG59cmV0dXJuIHZTdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fZm9yRWFjaD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX25Sb3dzO2UrKylmb3IodmFyIG49MDtuPHRoaXMuX25Db2xzO24rKyludWxsIT10aGlzLl9yb3dzW2VdW25dJiZ0KHRoaXMuX3Jvd3NbZV1bbl0pfSxlLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9uUm93cztlKyspZm9yKHZhciBuPTA7bjx0aGlzLl9uQ29scztuKyspaWYodGhpcy5fcm93c1tlXVtuXT09PXQpcmV0dXJuITA7cmV0dXJuITF9LGUucHJvdG90eXBlLmNvbXBvbmVudEF0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8MHx8dD49dGhpcy5fblJvd3N8fGU8MHx8ZT49dGhpcy5fbkNvbHM/bnVsbDp0aGlzLl9yb3dzW3RdW2VdfSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCxlLG4pe2lmKG51bGw9PXQpdGhyb3cgRXJyb3IoIkNhbm5vdCBhZGQgbnVsbCB0byBhIHRhYmxlIGNlbGwiKTtpZighdGhpcy5oYXModCkpe2lmKG51bGwhPSh0aGlzLl9yb3dzW2VdJiZ0aGlzLl9yb3dzW2VdW25dKSl0aHJvdyBuZXcgRXJyb3IoImNlbGwgaXMgb2NjdXBpZWQiKTt0LmRldGFjaCgpLHRoaXMuX25Sb3dzPU1hdGgubWF4KGUrMSx0aGlzLl9uUm93cyksdGhpcy5fbkNvbHM9TWF0aC5tYXgobisxLHRoaXMuX25Db2xzKSx0aGlzLl9wYWRUYWJsZVRvU2l6ZSh0aGlzLl9uUm93cyx0aGlzLl9uQ29scyksdGhpcy5fcm93c1tlXVtuXT10LHRoaXMuX2Fkb3B0QW5kQW5jaG9yKHQpLHRoaXMucmVkcmF3KCl9cmV0dXJuIHRoaXN9LGUucHJvdG90eXBlLl9yZW1vdmU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9uUm93cztlKyspZm9yKHZhciBuPTA7bjx0aGlzLl9uQ29scztuKyspaWYodGhpcy5fcm93c1tlXVtuXT09PXQpcmV0dXJuIHRoaXMuX3Jvd3NbZV1bbl09bnVsbCwhMDtyZXR1cm4hMX0sZS5wcm90b3R5cGUuX2l0ZXJhdGVMYXlvdXQ9ZnVuY3Rpb24odCxuLGkpe3ZvaWQgMD09PWkmJihpPSExKTtmb3IodmFyIHIsbyxhLHMsbCxjPXRoaXMuX3Jvd3MsdT1iU3QudHJhbnNwb3NlKHRoaXMuX3Jvd3MpLGg9dC10aGlzLl9jb2x1bW5QYWRkaW5nKih0aGlzLl9uQ29scy0xKSxkPW4tdGhpcy5fcm93UGFkZGluZyoodGhpcy5fblJvd3MtMSkscD1lLl9jYWxjQ29tcG9uZW50V2VpZ2h0cyh0aGlzLl9yb3dXZWlnaHRzLGMsKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fHx0LmZpeGVkSGVpZ2h0KCl9KSksZj1lLl9jYWxjQ29tcG9uZW50V2VpZ2h0cyh0aGlzLl9jb2x1bW5XZWlnaHRzLHUsKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fHx0LmZpeGVkV2lkdGgoKX0pKSxtPWYubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQ/LjU6dH0pKSxnPXAubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQ/LjU6dH0pKSxfPWUuX2NhbGNQcm9wb3J0aW9uYWxTcGFjZShtLGgpLHk9ZS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKGcsZCksdj14U3QuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCx0aGlzLl9uQ29scyksYj14U3QuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCx0aGlzLl9uUm93cykseD0wOzspe3ZhciB3PXhTdC5BcnJheS5hZGQoYix5KSxTPXhTdC5BcnJheS5hZGQodixfKTt2PShhPXRoaXMuX2RldGVybWluZUd1YXJhbnRlZXMoUyx3LGkpKS5ndWFyYW50ZWVkV2lkdGhzLGI9YS5ndWFyYW50ZWVkSGVpZ2h0cyxzPWEud2FudHNXaWR0aEFyci5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gdH0pKSxsPWEud2FudHNIZWlnaHRBcnIuc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIHR9KSk7dmFyIE09cixFPW87cj1oLWJTdC5zdW0oYS5ndWFyYW50ZWVkV2lkdGhzKSxvPWQtYlN0LnN1bShhLmd1YXJhbnRlZWRIZWlnaHRzKTt2YXIgVD12b2lkIDA7cz8oVD1hLndhbnRzV2lkdGhBcnIubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdD8uMTowfSkpLFQ9eFN0LkFycmF5LmFkZChULGYpKTpUPWY7dmFyIEM9dm9pZCAwO2lmKGw/KEM9YS53YW50c0hlaWdodEFyci5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0Py4xOjB9KSksQz14U3QuQXJyYXkuYWRkKEMscCkpOkM9cCxfPWUuX2NhbGNQcm9wb3J0aW9uYWxTcGFjZShULHIpLHk9ZS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKEMsbykseCsrLCEocj4wJiZyIT09TXx8bz4wJiZvIT09RSkpYnJlYWs7aWYoeD41KWJyZWFrfXJldHVybiByPWgtYlN0LnN1bShhLmd1YXJhbnRlZWRXaWR0aHMpLG89ZC1iU3Quc3VtKGEuZ3VhcmFudGVlZEhlaWdodHMpLHtjb2xQcm9wb3J0aW9uYWxTcGFjZTpfPWUuX2NhbGNQcm9wb3J0aW9uYWxTcGFjZShmLHIpLHJvd1Byb3BvcnRpb25hbFNwYWNlOnk9ZS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKHAsbyksZ3VhcmFudGVlZFdpZHRoczphLmd1YXJhbnRlZWRXaWR0aHMsZ3VhcmFudGVlZEhlaWdodHM6YS5ndWFyYW50ZWVkSGVpZ2h0cyx3YW50c1dpZHRoOnMsd2FudHNIZWlnaHQ6bH19LGUucHJvdG90eXBlLl9kZXRlcm1pbmVHdWFyYW50ZWVzPWZ1bmN0aW9uKHQsZSxuKXt2b2lkIDA9PT1uJiYobj0hMSk7dmFyIGk9eFN0LkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KDAsdGhpcy5fbkNvbHMpLHI9eFN0LkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KDAsdGhpcy5fblJvd3MpLG89eFN0LkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KCExLHRoaXMuX25Db2xzKSxhPXhTdC5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSghMSx0aGlzLl9uUm93cyk7cmV0dXJuIHRoaXMuX3Jvd3MuZm9yRWFjaCgoZnVuY3Rpb24ocyxsKXtzLmZvckVhY2goKGZ1bmN0aW9uKHMsYyl7dmFyIHU7dT1udWxsIT1zP3MucmVxdWVzdGVkU3BhY2UodFtjXSxlW2xdKTp7bWluV2lkdGg6MCxtaW5IZWlnaHQ6MH07dmFyIGg9bj9NYXRoLm1pbih1Lm1pbldpZHRoLHRbY10pOnUubWluV2lkdGg7aVtjXT1NYXRoLm1heChpW2NdLGgpO3ZhciBkPW4/TWF0aC5taW4odS5taW5IZWlnaHQsZVtsXSk6dS5taW5IZWlnaHQ7cltsXT1NYXRoLm1heChyW2xdLGQpLG9bY109b1tjXXx8dS5taW5XaWR0aD50W2NdLGFbbF09YVtsXXx8dS5taW5IZWlnaHQ+ZVtsXX0pKX0pKSx7Z3VhcmFudGVlZFdpZHRoczppLGd1YXJhbnRlZWRIZWlnaHRzOnIsd2FudHNXaWR0aEFycjpvLHdhbnRzSGVpZ2h0QXJyOmF9fSxlLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9jYWxjdWxhdGVkTGF5b3V0PXRoaXMuX2l0ZXJhdGVMYXlvdXQodCxlKSx7bWluV2lkdGg6YlN0LnN1bSh0aGlzLl9jYWxjdWxhdGVkTGF5b3V0Lmd1YXJhbnRlZWRXaWR0aHMpLG1pbkhlaWdodDpiU3Quc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZEhlaWdodHMpfX0sZS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihlLG4saSl7dmFyIHI9dGhpczt0LnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxlLG4saSk7dmFyIG89YlN0LnN1bSh0aGlzLl9jYWxjdWxhdGVkTGF5b3V0Lmd1YXJhbnRlZWRXaWR0aHMpLGE9YlN0LnN1bSh0aGlzLl9jYWxjdWxhdGVkTGF5b3V0Lmd1YXJhbnRlZWRIZWlnaHRzKSxzPXRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQ7KG8+dGhpcy53aWR0aCgpfHxhPnRoaXMuaGVpZ2h0KCkpJiYocz10aGlzLl9pdGVyYXRlTGF5b3V0KHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpLCEwKSk7dmFyIGw9MCxjPXhTdC5BcnJheS5hZGQocy5yb3dQcm9wb3J0aW9uYWxTcGFjZSxzLmd1YXJhbnRlZWRIZWlnaHRzKSx1PXhTdC5BcnJheS5hZGQocy5jb2xQcm9wb3J0aW9uYWxTcGFjZSxzLmd1YXJhbnRlZWRXaWR0aHMpO3JldHVybiB0aGlzLl9yb3dzLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7dmFyIG49MDt0LmZvckVhY2goKGZ1bmN0aW9uKHQsaSl7bnVsbCE9dCYmdC5jb21wdXRlTGF5b3V0KHt4Om4seTpsfSx1W2ldLGNbZV0pLG4rPXVbaV0rci5fY29sdW1uUGFkZGluZ30pKSxsKz1jW2VdK3IuX3Jvd1BhZGRpbmd9KSksdGhpc30sZS5wcm90b3R5cGUucm93UGFkZGluZz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9yb3dQYWRkaW5nO2lmKCF4U3QuTWF0aC5pc1ZhbGlkTnVtYmVyKHQpfHx0PDApdGhyb3cgRXJyb3IoInJvd1BhZGRpbmcgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgdmFsdWUiKTtyZXR1cm4gdGhpcy5fcm93UGFkZGluZz10LHRoaXMucmVkcmF3KCksdGhpc30sZS5wcm90b3R5cGUuY29sdW1uUGFkZGluZz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9jb2x1bW5QYWRkaW5nO2lmKCF4U3QuTWF0aC5pc1ZhbGlkTnVtYmVyKHQpfHx0PDApdGhyb3cgRXJyb3IoImNvbHVtblBhZGRpbmcgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgdmFsdWUiKTtyZXR1cm4gdGhpcy5fY29sdW1uUGFkZGluZz10LHRoaXMucmVkcmF3KCksdGhpc30sZS5wcm90b3R5cGUucm93V2VpZ2h0PWZ1bmN0aW9uKHQsZSl7aWYobnVsbD09ZSlyZXR1cm4gdGhpcy5fcm93V2VpZ2h0c1t0XTtpZigheFN0Lk1hdGguaXNWYWxpZE51bWJlcihlKXx8ZTwwKXRocm93IEVycm9yKCJyb3dXZWlnaHQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgdmFsdWUiKTtyZXR1cm4gdGhpcy5fcm93V2VpZ2h0c1t0XT1lLHRoaXMucmVkcmF3KCksdGhpc30sZS5wcm90b3R5cGUuY29sdW1uV2VpZ2h0PWZ1bmN0aW9uKHQsZSl7aWYobnVsbD09ZSlyZXR1cm4gdGhpcy5fY29sdW1uV2VpZ2h0c1t0XTtpZigheFN0Lk1hdGguaXNWYWxpZE51bWJlcihlKXx8ZTwwKXRocm93IEVycm9yKCJjb2x1bW5XZWlnaHQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgdmFsdWUiKTtyZXR1cm4gdGhpcy5fY29sdW1uV2VpZ2h0c1t0XT1lLHRoaXMucmVkcmF3KCksdGhpc30sZS5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3ZhciB0PWJTdC50cmFuc3Bvc2UodGhpcy5fcm93cyk7cmV0dXJuIGUuX2ZpeGVkU3BhY2UodCwoZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXR8fHQuZml4ZWRXaWR0aCgpfSkpfSxlLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiBlLl9maXhlZFNwYWNlKHRoaXMuX3Jvd3MsKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fHx0LmZpeGVkSGVpZ2h0KCl9KSl9LGUucHJvdG90eXBlLl9wYWRUYWJsZVRvU2l6ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wO248dDtuKyspe3ZvaWQgMD09PXRoaXMuX3Jvd3Nbbl0mJih0aGlzLl9yb3dzW25dPVtdLHRoaXMuX3Jvd1dlaWdodHNbbl09bnVsbCk7Zm9yKHZhciBpPTA7aTxlO2krKyl2b2lkIDA9PT10aGlzLl9yb3dzW25dW2ldJiYodGhpcy5fcm93c1tuXVtpXT1udWxsKX1mb3IoaT0wO2k8ZTtpKyspdm9pZCAwPT09dGhpcy5fY29sdW1uV2VpZ2h0c1tpXSYmKHRoaXMuX2NvbHVtbldlaWdodHNbaV09bnVsbCl9LGUuX2NhbGNDb21wb25lbnRXZWlnaHRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdC5tYXAoKGZ1bmN0aW9uKHQsaSl7cmV0dXJuIG51bGwhPXQ/dDplW2ldLm1hcChuKS5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJmV9KSwhMCk/MDoxfSkpfSxlLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2U9ZnVuY3Rpb24odCxlKXt2YXIgbj1iU3Quc3VtKHQpO3JldHVybiAwPT09bj94U3QuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCx0Lmxlbmd0aCk6dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBlKnQvbn0pKX0sZS5fZml4ZWRTcGFjZT1mdW5jdGlvbih0LGUpe3ZhciBuPWZ1bmN0aW9uKHQpe3JldHVybiB0LnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmZX0pLCEwKX07cmV0dXJuIG4odC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBuKHQubWFwKGUpKX0pKSl9LGV9KSh4eHQuQ29tcG9uZW50Q29udGFpbmVyKTt5U3QuVGFibGU9d1N0O3ZhciBTU3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KFNTdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIE1TdD11TyxFU3Q9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUuX21heExpbmVzPTIsZX1yZXR1cm4gTVN0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHQsZSl7dGhpcy5fd3JhcHBlci5tYXhMaW5lcyh0aGlzLl9tYXhMaW5lcyk7dmFyIG49MD09PXRoaXMuYW5nbGUoKT90OmU7MD09PW4mJihuPTEvMCk7dmFyIGk9dGhpcy5fd3JhcHBlci53cmFwKHRoaXMuX3RleHQsdGhpcy5fbWVhc3VyZXIsbikscj10aGlzLl9tZWFzdXJlci5tZWFzdXJlKGkud3JhcHBlZFRleHQpO3JldHVybnttaW5XaWR0aDooMD09PXRoaXMuYW5nbGUoKT9yLndpZHRoOnIuaGVpZ2h0KSsyKnRoaXMucGFkZGluZygpLG1pbkhlaWdodDooMD09PXRoaXMuYW5nbGUoKT9yLmhlaWdodDpyLndpZHRoKSsyKnRoaXMucGFkZGluZygpfX0sZS5wcm90b3R5cGUubWF4TGluZXM9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMuX21heExpbmVzOih0aGlzLl9tYXhMaW5lcz10LHRoaXMucmVkcmF3KCksdGhpcyl9LGV9KShPeHQuTGFiZWwpO1NTdC5XcmFwcGVkTGFiZWw9RVN0O3ZhciBUU3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KFRTdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIENTdD11TyxBU3Q9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIGUuYWRkQ2xhc3MoIngtZHJhZy1ib3gtbGF5ZXIiKSxlLl9oYXNDb3JuZXJzPSExLGV9cmV0dXJuIENTdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKGUsbixpKXtyZXR1cm4gdC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsZSxuLGkpLHRoaXMuX3NldEJvdW5kcyh0aGlzLmJvdW5kcygpKSx0aGlzfSxlLnByb3RvdHlwZS5fc2V0Qm91bmRzPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLl9zZXRCb3VuZHMuY2FsbCh0aGlzLHt0b3BMZWZ0Ont4OmUudG9wTGVmdC54LHk6MH0sYm90dG9tUmlnaHQ6e3g6ZS5ib3R0b21SaWdodC54LHk6dGhpcy5oZWlnaHQoKX19KX0sZS5wcm90b3R5cGUuX3NldFJlc2l6YWJsZUNsYXNzZXM9ZnVuY3Rpb24odCl7dCYmdGhpcy5lbmFibGVkKCk/dGhpcy5hZGRDbGFzcygieC1yZXNpemFibGUiKTp0aGlzLnJlbW92ZUNsYXNzKCJ4LXJlc2l6YWJsZSIpfSxlLnByb3RvdHlwZS55U2NhbGU9ZnVuY3Rpb24oZSl7aWYobnVsbD09ZSlyZXR1cm4gdC5wcm90b3R5cGUueVNjYWxlLmNhbGwodGhpcyk7dGhyb3cgbmV3IEVycm9yKCJ5U2NhbGVzIGNhbm5vdCBiZSBzZXQgb24gYW4gWERyYWdCb3hMYXllciIpfSxlLnByb3RvdHlwZS55RXh0ZW50PWZ1bmN0aW9uKGUpe2lmKG51bGw9PWUpcmV0dXJuIHQucHJvdG90eXBlLnlFeHRlbnQuY2FsbCh0aGlzKTt0aHJvdyBuZXcgRXJyb3IoIlhEcmFnQm94TGF5ZXIgaGFzIG5vIHlFeHRlbnQiKX0sZX0pKHJidC5EcmFnQm94TGF5ZXIpO1RTdC5YRHJhZ0JveExheWVyPUFTdDt2YXIga1N0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShrU3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBMU3Q9dU8sUFN0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBlLmFkZENsYXNzKCJ5LWRyYWctYm94LWxheWVyIiksZS5faGFzQ29ybmVycz0hMSxlfXJldHVybiBMU3QuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihlLG4saSl7cmV0dXJuIHQucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLGUsbixpKSx0aGlzLl9zZXRCb3VuZHModGhpcy5ib3VuZHMoKSksdGhpc30sZS5wcm90b3R5cGUuX3NldEJvdW5kcz1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5fc2V0Qm91bmRzLmNhbGwodGhpcyx7dG9wTGVmdDp7eDowLHk6ZS50b3BMZWZ0Lnl9LGJvdHRvbVJpZ2h0Ont4OnRoaXMud2lkdGgoKSx5OmUuYm90dG9tUmlnaHQueX19KX0sZS5wcm90b3R5cGUuX3NldFJlc2l6YWJsZUNsYXNzZXM9ZnVuY3Rpb24odCl7dCYmdGhpcy5lbmFibGVkKCk/dGhpcy5hZGRDbGFzcygieS1yZXNpemFibGUiKTp0aGlzLnJlbW92ZUNsYXNzKCJ5LXJlc2l6YWJsZSIpfSxlLnByb3RvdHlwZS54U2NhbGU9ZnVuY3Rpb24oZSl7aWYobnVsbD09ZSlyZXR1cm4gdC5wcm90b3R5cGUueFNjYWxlLmNhbGwodGhpcyk7dGhyb3cgbmV3IEVycm9yKCJ4U2NhbGVzIGNhbm5vdCBiZSBzZXQgb24gYW4gWURyYWdCb3hMYXllciIpfSxlLnByb3RvdHlwZS54RXh0ZW50PWZ1bmN0aW9uKGUpe2lmKG51bGw9PWUpcmV0dXJuIHQucHJvdG90eXBlLnhFeHRlbnQuY2FsbCh0aGlzKTt0aHJvdyBuZXcgRXJyb3IoIllEcmFnQm94TGF5ZXIgaGFzIG5vIHhFeHRlbnQiKX0sZX0pKHJidC5EcmFnQm94TGF5ZXIpO2tTdC5ZRHJhZ0JveExheWVyPVBTdCwoZnVuY3Rpb24odCl7Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZT11TztlLl9fZXhwb3J0U3RhcihyYnQsdCksZS5fX2V4cG9ydFN0YXIob3h0LHQpLGUuX19leHBvcnRTdGFyKGd4dCx0KSxlLl9fZXhwb3J0U3RhcihieHQsdCksZS5fX2V4cG9ydFN0YXIoYXh0LHQpLGUuX19leHBvcnRTdGFyKEF4dCx0KSxlLl9fZXhwb3J0U3RhcihPeHQsdCksZS5fX2V4cG9ydFN0YXIoVnh0LHQpLGUuX19leHBvcnRTdGFyKGN3dCx0KSxlLl9fZXhwb3J0U3RhcihKYnQsdCksZS5fX2V4cG9ydFN0YXIoeVN0LHQpLGUuX19leHBvcnRTdGFyKFNTdCx0KSxlLl9fZXhwb3J0U3RhcihUU3QsdCksZS5fX2V4cG9ydFN0YXIoa1N0LHQpfSkoaWJ0KTt2YXIgTlN0PXt9LElTdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KElTdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFJTdD11TyxPU3Q9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gdC5jYWxsKHRoaXMsInBhdGgiLCJhcmMgZmlsbCIpfHx0aGlzfXJldHVybiBSU3QuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24odCl7dC5zdHlsZSgic3Ryb2tlIiwibm9uZSIpfSxlfSkoWXd0LlNWR0RyYXdlcik7SVN0LkFyY1NWR0RyYXdlcj1PU3Q7dmFyIHpTdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoelN0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgRFN0PXVPLEJTdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiB0LmNhbGwodGhpcywicGF0aCIsImFyYyBvdXRsaW5lIil8fHRoaXN9cmV0dXJuIERTdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fYXBwbHlEZWZhdWx0QXR0cmlidXRlcz1mdW5jdGlvbih0KXt0LnN0eWxlKCJmaWxsIiwibm9uZSIpfSxlfSkoWXd0LlNWR0RyYXdlcik7elN0LkFyY091dGxpbmVTVkdEcmF3ZXI9QlN0O3ZhciBIU3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KEhTdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIEZTdD11TyxWU3Q9R3d0LFVTdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiB0LmNhbGwodGhpcywicGF0aCIsImFyZWEiKXx8dGhpc31yZXR1cm4gRlN0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKHQpe3Quc3R5bGUoInN0cm9rZSIsIm5vbmUiKX0sZS5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleD1mdW5jdGlvbihlKXtyZXR1cm4gdC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleC5jYWxsKHRoaXMsMCl9LGV9KShZd3QuU1ZHRHJhd2VyKTtIU3QuQXJlYVNWR0RyYXdlcj1VU3Q7dmFyIGpTdD1bIm9wYWNpdHkiLCJmaWxsIiwiZmlsbC1vcGFjaXR5Il0sR1N0PVsib3BhY2l0eSIsInN0cm9rZSIsInN0cm9rZS13aWR0aCJdO0hTdC5tYWtlQXJlYUNhbnZhc0RyYXdTdGVwPWZ1bmN0aW9uIFdTdCh0LGUpe3JldHVybiBmdW5jdGlvbihuLGkscil7dmFyIG89VlN0LnJlc29sdmVBdHRyaWJ1dGVzKHIsalN0LGlbMF0sMCk7VlN0LnJlbmRlckFyZWEobix0KCksaVswXSxvKTt2YXIgYT1WU3QucmVzb2x2ZUF0dHJpYnV0ZXMocixHU3QsaVswXSwwKTtWU3QucmVuZGVyTGluZShuLGUoKSxpWzBdLGEpfX07dmFyIHFTdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkocVN0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgWVN0PXVPLFhTdD1Hd3QsJFN0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIHQuY2FsbCh0aGlzLCJwYXRoIiwibGluZSIpfHx0aGlzfXJldHVybiBZU3QuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24odCl7dC5zdHlsZSgiZmlsbCIsIm5vbmUiKX0sZS5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleD1mdW5jdGlvbihlKXtyZXR1cm4gdC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleC5jYWxsKHRoaXMsMCl9LGV9KShZd3QuU1ZHRHJhd2VyKTtxU3QuTGluZVNWR0RyYXdlcj0kU3Q7dmFyIEtTdD1bIm9wYWNpdHkiLCJzdHJva2Utb3BhY2l0eSIsInN0cm9rZS13aWR0aCIsInN0cm9rZSIsInN0cm9rZS1kYXNoYXJyYXkiXTtxU3QubWFrZUxpbmVDYW52YXNEcmF3U3RlcD1mdW5jdGlvbiBaU3QodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixpKXt2YXIgcj1YU3QucmVzb2x2ZUF0dHJpYnV0ZXMoaSxLU3QsblswXSwwKTtYU3QucmVuZGVyTGluZShlLHQoKSxuWzBdLHIpfX07dmFyIEpTdD17fTshKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9dU8sbj1Hd3QsaT0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlKXt2b2lkIDA9PT1lJiYoZT0iIik7dmFyIG49dC5jYWxsKHRoaXMsInJlY3QiLCIiKXx8dGhpcztyZXR1cm4gbi5fcm9vdENsYXNzTmFtZT1lLG4uX3Jvb3QuY2xhc3NlZChuLl9yb290Q2xhc3NOYW1lLCEwKSxufXJldHVybiBlLl9fZXh0ZW5kcyhuLHQpLG59KShZd3QuU1ZHRHJhd2VyKTt0LlJlY3RhbmdsZVNWR0RyYXdlcj1pO3ZhciByPW4uQ29udGV4dFN0eWxlQXR0cnMuY29uY2F0KFsieCIsInkiLCJ3aWR0aCIsImhlaWdodCJdKTt0LlJlY3RhbmdsZUNhbnZhc0RyYXdTdGVwPWZ1bmN0aW9uKHQsZSxpKXt0LnNhdmUoKTtmb3IodmFyIG89ZS5sZW5ndGgsYT0wO2E8bzthKyspe3ZhciBzPWVbYV07aWYobnVsbCE9cyl7dmFyIGw9bi5yZXNvbHZlQXR0cmlidXRlcyhpLHIscyxhKTt0LmJlZ2luUGF0aCgpLHQucmVjdChsLngsbC55LGwud2lkdGgsbC5oZWlnaHQpLG4ucmVuZGVyUGF0aFdpdGhTdHlsZSh0LGwpfX10LnJlc3RvcmUoKX07dmFyIG89KGZ1bmN0aW9uKG4pe2Z1bmN0aW9uIGkoZSl7cmV0dXJuIG4uY2FsbCh0aGlzLGUsdC5SZWN0YW5nbGVDYW52YXNEcmF3U3RlcCl8fHRoaXN9cmV0dXJuIGUuX19leHRlbmRzKGksbiksaX0pKG4uQ2FudmFzRHJhd2VyKTt0LlJlY3RhbmdsZUNhbnZhc0RyYXdlcj1vfSkoSlN0KTt2YXIgUVN0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShRU3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB0TXQ9dU8sZU10PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIHQuY2FsbCh0aGlzLCJsaW5lIiwiIil8fHRoaXN9cmV0dXJuIHRNdC5fX2V4dGVuZHMoZSx0KSxlfSkoWXd0LlNWR0RyYXdlcik7UVN0LlNlZ21lbnRTVkdEcmF3ZXI9ZU10O3ZhciBuTXQ9e30saU10PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE3LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoaU10LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgck10PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuLGkpe3ZvaWQgMD09PWkmJihpPXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKSx0aGlzLnNjcmVlbldpZHRoPWUsdGhpcy5zY3JlZW5IZWlnaHQ9bix0aGlzLmRldmljZVBpeGVsUmF0aW89aSx0aGlzLnBpeGVsV2lkdGg9ZSppLHRoaXMucGl4ZWxIZWlnaHQ9bippLHRoaXMuY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLHRoaXMuY3R4PXRoaXMuY2FudmFzLmdldENvbnRleHQoIjJkIiksdC5zaXplUGl4ZWxzKHRoaXMuY3R4LGUsbixpKX1yZXR1cm4gdC5zaXplUGl4ZWxzPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPXQuY2FudmFzO3Iud2lkdGg9ZSppLHIuaGVpZ2h0PW4qaSxyLnN0eWxlLndpZHRoPWUrInB4IixyLnN0eWxlLmhlaWdodD1uKyJweCIsdC5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLHQuc2NhbGUoaSxpKX0sdC5wcm90b3R5cGUuYmxpdD1mdW5jdGlvbih0LGUsbil7dm9pZCAwPT09ZSYmKGU9MCksdm9pZCAwPT09biYmKG49MCksdC5kcmF3SW1hZ2UodGhpcy5jYW52YXMsZSxuLHRoaXMuc2NyZWVuV2lkdGgsdGhpcy5zY3JlZW5IZWlnaHQpfSx0LnByb3RvdHlwZS5ibGl0Q2VudGVyPWZ1bmN0aW9uKHQsZSxuKXt2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1uJiYobj0wKSx0aGlzLmJsaXQodCxNYXRoLmZsb29yKGUtdGhpcy5zY3JlZW5XaWR0aC8yKSxNYXRoLmZsb29yKG4tdGhpcy5zY3JlZW5IZWlnaHQvMikpfSx0LnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oZSxuLGkpe3ZvaWQgMD09PWkmJihpPSExKTt2YXIgcj10aGlzLmRldmljZVBpeGVsUmF0aW87cmV0dXJuIHRoaXMuc2NyZWVuV2lkdGg9ZSx0aGlzLnNjcmVlbkhlaWdodD1uLHRoaXMucGl4ZWxXaWR0aD1lKnIsdGhpcy5waXhlbEhlaWdodD1uKnIsdC5zaXplUGl4ZWxzKHRoaXMuY3R4LGUsbixyKSxpJiZ0aGlzLmN0eC50cmFuc2xhdGUoZS8yLGUvMiksdGhpc30sdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWUucGl4ZWxXaWR0aCxpPWUucGl4ZWxIZWlnaHQscj1lLmN0eDtyZXR1cm4gci5zYXZlKCksci5zZXRUcmFuc2Zvcm0oMSwwLDAsMSwwLDApLG51bGw9PXQ/ci5jbGVhclJlY3QoMCwwLG4saSk6KHIuZmlsbFN0eWxlPXQsci5maWxsUmVjdCgwLDAsbixpKSksci5yZXN0b3JlKCksdGhpc30sdC5wcm90b3R5cGUuZ2V0SW1hZ2VEYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3R4LmdldEltYWdlRGF0YSgwLDAsdGhpcy5waXhlbFdpZHRoLHRoaXMucGl4ZWxIZWlnaHQpfSx0fSkoKTtpTXQuQ2FudmFzQnVmZmVyPXJNdCwKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KG5NdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG9NdD11TyxhTXQ9R3d0LHNNdD1pTXQsbE10PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIHQuY2FsbCh0aGlzLCJwYXRoIiwic3ltYm9sIil8fHRoaXN9cmV0dXJuIG9NdC5fX2V4dGVuZHMoZSx0KSxlfSkoWXd0LlNWR0RyYXdlcik7bk10LlN5bWJvbFNWR0RyYXdlcj1sTXQ7dmFyIGNNdD1hTXQuQ29udGV4dFN0eWxlQXR0cnMuY29uY2F0KFsieCIsInkiXSk7ZnVuY3Rpb24gdU10KHQsZSxuLGkscil7cmV0dXJuIG4rcj49MCYmbi1yPD10JiZpK3I+PTAmJmktcjw9ZX1mdW5jdGlvbiBoTXQodCxlLG4pe2lmKG51bGw9PXQpcmV0dXJuITE7Zm9yKHZhciBpPTA7aTxuLmxlbmd0aDtpKyspe3ZhciByPW5baV07aWYodFtyXSE9ZVtyXSlyZXR1cm4hMX1yZXR1cm4hMH1uTXQubWFrZVN5bWJvbENhbnZhc0RyYXdTdGVwPWZ1bmN0aW9uIGRNdCh0LGUsbixpKXt2YXIgcj10aGlzO3JldHVybiBmdW5jdGlvbihvLGEscyl7Zm9yKHZhciBsPW8uY2FudmFzLGM9bC5jbGllbnRXaWR0aCx1PWwuY2xpZW50SGVpZ2h0LGg9dm9pZCAwPT09aT9uZXcgc010LkNhbnZhc0J1ZmZlcigwLDApOmksZD1lKCkscD1uKCksZj1udWxsLG09bnVsbCxnPW51bGwsXz0wO188YS5sZW5ndGg7XysrKXt2YXIgeT1hW19dO2lmKG51bGwhPXkpe3ZhciB2PWFNdC5yZXNvbHZlQXR0cmlidXRlcyhzLGNNdCx5LF8pLGI9cCh5LF8sdCk7aWYodU10KGMsdSx2Lngsdi55LGIpKXt2YXIgeD1oTXQoZix2LGFNdC5Db250ZXh0U3R5bGVBdHRycyksdz1kKHksXyxyLl9kYXRhc2V0KTtpZih4JiZnPT1iJiZtPT13KTtlbHNle3ZhciBTPWIrYU10LmdldFN0cm9rZVdpZHRoKHYpKzE7KFM+aC5zY3JlZW5XaWR0aHx8Uz5oLnNjcmVlbkhlaWdodCkmJmgucmVzaXplKFMsUywhMCksaC5jbGVhcigpO3ZhciBNPWguY3R4O00uYmVnaW5QYXRoKCksdyhiKS5jb250ZXh0KE0pKG51bGwpLE0uY2xvc2VQYXRoKCksYU10LnJlbmRlclBhdGhXaXRoU3R5bGUoTSx2KSxtPXcsZz1iLGY9dn1oLmJsaXRDZW50ZXIobyx2Lngsdi55KX19fX19LChmdW5jdGlvbih0KXsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBlPXVPO2UuX19leHBvcnRTdGFyKElTdCx0KSxlLl9fZXhwb3J0U3Rhcih6U3QsdCksZS5fX2V4cG9ydFN0YXIoSFN0LHQpLGUuX19leHBvcnRTdGFyKEd3dCx0KSxlLl9fZXhwb3J0U3RhcihXd3QsdCksZS5fX2V4cG9ydFN0YXIocVN0LHQpLGUuX19leHBvcnRTdGFyKEpTdCx0KSxlLl9fZXhwb3J0U3RhcihRU3QsdCksZS5fX2V4cG9ydFN0YXIoWXd0LHQpLGUuX19leHBvcnRTdGFyKG5NdCx0KX0pKE5TdCk7dmFyIHBNdD17fSxmTXQ9e30sbU10PXt9LGdNdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KGdNdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIF9NdD11Tyx5TXQ9Wnl0LHZNdD1GZ3QsYk10PVp3dCx4TXQ9dXd0LHdNdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gZS5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj0hMSxlLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluPSExLGUuX2RlZmVycmVkUmVuZGVyaW5nPSExLGUuX2FwcGx5RGVmZXJyZWRSZW5kZXJpbmdUcmFuc2Zvcm09ZnVuY3Rpb24odCxuLGkscil7ZS5faXNBbmNob3JlZCYmKG51bGwhPWUuX3JlbmRlckFyZWEmJmUuX3JlbmRlckFyZWEuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrdCsiLCAiK24rIikgc2NhbGUoIitpKyIsICIrcisiKSIpLG51bGwhPWUuX2NhbnZhcyYmZS5fY2FudmFzLnN0eWxlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit0KyJweCwgIituKyJweCkgc2NhbGUoIitpKyIsICIrcisiKSIpKX0sZS5hZGRDbGFzcygieHktcGxvdCIpLGUuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YQ2FsbGJhY2s9ZnVuY3Rpb24odCl7cmV0dXJuIGUuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YKCl9LGUuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZQ2FsbGJhY2s9ZnVuY3Rpb24odCl7cmV0dXJuIGUuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZKCl9LGUuX3JlbmRlckNhbGxiYWNrPWZ1bmN0aW9uKCl7aWYoZS5kZWZlcnJlZFJlbmRlcmluZygpKXt2YXIgdD1lLngoKSYmZS54KCkuc2NhbGUsbj1lLnkoKSYmZS55KCkuc2NhbGU7ZS5fZGVmZXJyZWRSZW5kZXJlci51cGRhdGVEb21haW5zKHQsbil9ZWxzZSBlLnJlbmRlcigpfSxlLl9kZWZlcnJlZFJlbmRlcmVyPW5ldyBiTXQuRGVmZXJyZWRSZW5kZXJlcigoZnVuY3Rpb24oKXtyZXR1cm4gZS5yZW5kZXIoKX0pLGUuX2FwcGx5RGVmZXJyZWRSZW5kZXJpbmdUcmFuc2Zvcm0pLGV9cmV0dXJuIF9NdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWZlcnJlZFJlbmRlcmluZygpJiZ0aGlzLl9kZWZlcnJlZFJlbmRlcmVyLnJlc2V0VHJhbnNmb3JtcygpLHQucHJvdG90eXBlLnJlbmRlci5jYWxsKHRoaXMpfSxlLnByb3RvdHlwZS5kZWZlcnJlZFJlbmRlcmluZz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9kZWZlcnJlZFJlbmRlcmluZztpZih0KXt2YXIgZT10aGlzLngoKSYmdGhpcy54KCkuc2NhbGUsbj10aGlzLnkoKSYmdGhpcy55KCkuc2NhbGU7dGhpcy5fZGVmZXJyZWRSZW5kZXJlci5zZXREb21haW5zKGUsbil9cmV0dXJuIHRoaXMuX2RlZmVycmVkUmVuZGVyaW5nPXQsdGhpc30sZS5wcm90b3R5cGUueD1mdW5jdGlvbih0LG4saSl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoZS5fWF9LRVkpO3RoaXMuX2JpbmRQcm9wZXJ0eShlLl9YX0tFWSx0LG4saSk7dmFyIHI9dGhpcy53aWR0aCgpO3JldHVybiBudWxsIT1uJiZudWxsIT1yJiZuLnJhbmdlKFswLHJdKSx0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW4oKSx0aGlzLnJlbmRlcigpLHRoaXN9LGUucHJvdG90eXBlLnk9ZnVuY3Rpb24odCxuLGkpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KGUuX1lfS0VZKTt0aGlzLl9iaW5kUHJvcGVydHkoZS5fWV9LRVksdCxuLGkpO3ZhciByPXRoaXMuaGVpZ2h0KCk7cmV0dXJuIG51bGwhPW4mJm51bGwhPXImJm4ucmFuZ2UobiBpbnN0YW5jZW9mIHlNdC5DYXRlZ29yeT9bMCxyXTpbciwwXSksdGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbiYmdGhpcy5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluKCksdGhpcy5yZW5kZXIoKSx0aGlzfSxlLnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24odCl7cmV0dXJuIngiPT09dCYmdGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj90aGlzLl9tYWtlRmlsdGVyQnlQcm9wZXJ0eSgieSIpOiJ5IiE9PXQmJiJ5MCIhPT10fHwhdGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj9udWxsOnRoaXMuX21ha2VGaWx0ZXJCeVByb3BlcnR5KCJ4Iil9LGUucHJvdG90eXBlLl9tYWtlRmlsdGVyQnlQcm9wZXJ0eT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh0KTtpZihudWxsIT1lKXt2YXIgbj1lLmFjY2Vzc29yLGk9ZS5zY2FsZTtpZihudWxsIT1pKXJldHVybiBmdW5jdGlvbih0LGUscil7dmFyIG89aS5yYW5nZSgpO3JldHVybiB2TXQuTWF0aC5pblJhbmdlKGkuc2NhbGUobih0LGUscikpLG9bMF0sb1sxXSl9fXJldHVybiBudWxsfSxlLnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24obixpKXt0LnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXkuY2FsbCh0aGlzLG4saSksbi5vZmZVcGRhdGUoaT09PWUuX1hfS0VZP3RoaXMuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YQ2FsbGJhY2s6dGhpcy5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVlDYWxsYmFjayl9LGUucHJvdG90eXBlLl9pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24obixpKXt0LnByb3RvdHlwZS5faW5zdGFsbFNjYWxlRm9yS2V5LmNhbGwodGhpcyxuLGkpLG4ub25VcGRhdGUoaT09PWUuX1hfS0VZP3RoaXMuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YQ2FsbGJhY2s6dGhpcy5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVlDYWxsYmFjayl9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtyZXR1cm4gdC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpLHRoaXMueCgpLnNjYWxlJiZ0aGlzLngoKS5zY2FsZS5vZmZVcGRhdGUodGhpcy5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVhDYWxsYmFjayksdGhpcy55KCkuc2NhbGUmJnRoaXMueSgpLnNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWUNhbGxiYWNrKSx0aGlzfSxlLnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW4/IngiOnRoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW4/InkiOiJub25lIjtzd2l0Y2godCl7Y2FzZSJ4Ijp0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluPSEwLHRoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49ITEsdGhpcy5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVkoKTticmVhaztjYXNlInkiOnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW49ITEsdGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj0hMCx0aGlzLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWCgpO2JyZWFrO2Nhc2Uibm9uZSI6dGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj0hMSx0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluPSExO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHNjYWxlIG5hbWUgJyIrdCsiJywgbXVzdCBiZSAneCcsICd5JyBvciAnbm9uZSciKX1yZXR1cm4gdGhpc30sZS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihlLG4saSl7dC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsZSxuLGkpO3ZhciByPXRoaXMueCgpLG89ciYmci5zY2FsZTtudWxsIT1vJiZvLnJhbmdlKFswLHRoaXMud2lkdGgoKV0pO3ZhciBhPXRoaXMueSgpLHM9YSYmYS5zY2FsZTtyZXR1cm4gbnVsbCE9cyYmcy5yYW5nZShzIGluc3RhbmNlb2YgeU10LkNhdGVnb3J5P1swLHRoaXMuaGVpZ2h0KCldOlt0aGlzLmhlaWdodCgpLDBdKSx0aGlzfSxlLnByb3RvdHlwZS5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy54KCkuc2NhbGU7bnVsbCE9dCYmdC5hdXRvRG9tYWluKCl9LGUucHJvdG90eXBlLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW49ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnkoKS5zY2FsZTtudWxsIT10JiZ0LmF1dG9Eb21haW4oKX0sZS5wcm90b3R5cGUuc2hvd0FsbERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluKCksdGhpcy5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluKCksdGhpc30sZS5wcm90b3R5cGUuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YPWZ1bmN0aW9uKCl7dGhpcy5fcHJvamVjdG9yc1JlYWR5KCkmJnRoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW4mJnRoaXMuX3VwZGF0ZVlFeHRlbnRzQW5kQXV0b2RvbWFpbigpfSxlLnByb3RvdHlwZS5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVk9ZnVuY3Rpb24oKXt0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKSYmdGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbiYmdGhpcy5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluKCl9LGUucHJvdG90eXBlLl9wcm9qZWN0b3JzUmVhZHk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLngoKSxlPXRoaXMueSgpO3JldHVybiBudWxsIT10JiZudWxsIT10LmFjY2Vzc29yJiZudWxsIT1lJiZudWxsIT1lLmFjY2Vzc29yfSxlLnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbih0LGUsbil7dmFyIGk9eE10LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxyPXhNdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7cmV0dXJue3g6aSh0LGUsbikseTpyKHQsZSxuKX19LGUucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPXQucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3LmNhbGwodGhpcyksaT10aGlzLmF0dHIoImRlZmluZWQiKTtyZXR1cm4gdGhpcy5kYXRhc2V0cygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe24uc2V0KHQsbi5nZXQodCkuZmlsdGVyKChmdW5jdGlvbihuLHIpe3JldHVybihmdW5jdGlvbih0LG4scil7dmFyIG89eE10LlBsb3QuX3NjYWxlZEFjY2Vzc29yKGUueCgpKSh0LG4sciksYT14TXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IoZS55KCkpKHQsbixyKTtyZXR1cm4oIWl8fCExIT09aS5hY2Nlc3Nvcih0LG4scikpJiZ2TXQuTWF0aC5pc1ZhbGlkTnVtYmVyKG8pJiZ2TXQuTWF0aC5pc1ZhbGlkTnVtYmVyKGEpfSkobixyLHQpfSkpKX0pKSxufSxlLl9YX0tFWT0ieCIsZS5fWV9LRVk9InkiLGV9KSh4TXQuUGxvdCk7Z010LlhZUGxvdD13TXQsCi8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtTXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBTTXQ9dU8sTU10PUVkdCxFTXQ9X210LFRNdD1OU3QsQ010PVd3dCxBTXQ9cVN0LGtNdD1aeXQsTE10PUl2dCxQTXQ9Rmd0LE5NdD1wTXQsSU10PXV3dCxSTXQ9Z010LE9NdD17bGluZWFyOk1NdC5jdXJ2ZUxpbmVhcixsaW5lYXJDbG9zZWQ6TU10LmN1cnZlTGluZWFyQ2xvc2VkLHN0ZXA6TU10LmN1cnZlU3RlcCxzdGVwQmVmb3JlOk1NdC5jdXJ2ZVN0ZXBCZWZvcmUsc3RlcEFmdGVyOk1NdC5jdXJ2ZVN0ZXBBZnRlcixiYXNpczpNTXQuY3VydmVCYXNpcyxiYXNpc09wZW46TU10LmN1cnZlQmFzaXNPcGVuLGJhc2lzQ2xvc2VkOk1NdC5jdXJ2ZUJhc2lzQ2xvc2VkLGJ1bmRsZTpNTXQuY3VydmVCdW5kbGUsY2FyZGluYWw6TU10LmN1cnZlQ2FyZGluYWwsY2FyZGluYWxPcGVuOk1NdC5jdXJ2ZUNhcmRpbmFsT3BlbixjYXJkaW5hbENsb3NlZDpNTXQuY3VydmVDYXJkaW5hbENsb3NlZCxtb25vdG9uZTpNTXQuY3VydmVNb25vdG9uZVh9O21NdC5DdXJ2ZU5hbWU9U210Lm1ha2VFbnVtKFsibGluZWFyIiwibGluZWFyQ2xvc2VkIiwic3RlcCIsInN0ZXBCZWZvcmUiLCJzdGVwQWZ0ZXIiLCJiYXNpcyIsImJhc2lzT3BlbiIsImJhc2lzQ2xvc2VkIiwiYnVuZGxlIiwiY2FyZGluYWwiLCJjYXJkaW5hbE9wZW4iLCJjYXJkaW5hbENsb3NlZCIsIm1vbm90b25lIl0pO3ZhciB6TXQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT10LmNhbGwodGhpcyl8fHRoaXM7ZS5fY3VydmU9ImxpbmVhciIsZS5fYXV0b3JhbmdlU21vb3RoPSExLGUuX2Nyb3BwZWRSZW5kZXJpbmdFbmFibGVkPSEwLGUuX2NvbGxhcHNlRGVuc2VWZXJ0aWNhbExpbmVzRW5hYmxlZD0hMSxlLl9kb3duc2FtcGxpbmdFbmFibGVkPSExLGUuYWRkQ2xhc3MoImxpbmUtcGxvdCIpO3ZhciBuPW5ldyBFTXQuRWFzaW5nO3JldHVybiBuLnN0ZXBEdXJhdGlvbihJTXQuUGxvdC5fQU5JTUFUSU9OX01BWF9EVVJBVElPTiksbi5lYXNpbmdNb2RlKCJleHBJbk91dCIpLG4ubWF4VG90YWxEdXJhdGlvbihJTXQuUGxvdC5fQU5JTUFUSU9OX01BWF9EVVJBVElPTiksZS5hbmltYXRvcihOTXQuQW5pbWF0b3IuTUFJTixuKSxlLmF0dHIoInN0cm9rZSIsKG5ldyBrTXQuQ29sb3IpLnJhbmdlKClbMF0pLGUuYXR0cigic3Ryb2tlLXdpZHRoIiwiMnB4IiksZX1yZXR1cm4gU010Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLng9ZnVuY3Rpb24oZSxuLGkpe3JldHVybiBudWxsPT1lP3QucHJvdG90eXBlLnguY2FsbCh0aGlzKToodC5wcm90b3R5cGUueC5jYWxsKHRoaXMsZSxuLGkpLHRoaXMuX3NldFNjYWxlU25hcHBpbmcoKSx0aGlzKX0sZS5wcm90b3R5cGUueT1mdW5jdGlvbihlLG4saSl7cmV0dXJuIG51bGw9PWU/dC5wcm90b3R5cGUueS5jYWxsKHRoaXMpOih0LnByb3RvdHlwZS55LmNhbGwodGhpcyxlLG4saSksdGhpcy5fc2V0U2NhbGVTbmFwcGluZygpLHRoaXMpfSxlLnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3QucHJvdG90eXBlLmF1dG9yYW5nZU1vZGUuY2FsbCh0aGlzKToodC5wcm90b3R5cGUuYXV0b3JhbmdlTW9kZS5jYWxsKHRoaXMsZSksdGhpcy5fc2V0U2NhbGVTbmFwcGluZygpLHRoaXMpfSxlLnByb3RvdHlwZS5hdXRvcmFuZ2VTbW9vdGg9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fYXV0b3JhbmdlU21vb3RoOih0aGlzLl9hdXRvcmFuZ2VTbW9vdGg9dCx0aGlzLl9zZXRTY2FsZVNuYXBwaW5nKCksdGhpcyl9LGUucHJvdG90eXBlLl9zZXRTY2FsZVNuYXBwaW5nPWZ1bmN0aW9uKCl7IngiPT09dGhpcy5hdXRvcmFuZ2VNb2RlKCkmJnRoaXMueCgpJiZ0aGlzLngoKS5zY2FsZSYmdGhpcy54KCkuc2NhbGUgaW5zdGFuY2VvZiBMTXQuUXVhbnRpdGF0aXZlU2NhbGUmJnRoaXMueCgpLnNjYWxlLnNuYXBwaW5nRG9tYWluRW5hYmxlZCghdGhpcy5hdXRvcmFuZ2VTbW9vdGgoKSksInkiPT09dGhpcy5hdXRvcmFuZ2VNb2RlKCkmJnRoaXMueSgpJiZ0aGlzLnkoKS5zY2FsZSYmdGhpcy55KCkuc2NhbGUgaW5zdGFuY2VvZiBMTXQuUXVhbnRpdGF0aXZlU2NhbGUmJnRoaXMueSgpLnNjYWxlLnNuYXBwaW5nRG9tYWluRW5hYmxlZCghdGhpcy5hdXRvcmFuZ2VTbW9vdGgoKSl9LGUucHJvdG90eXBlLmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2N1cnZlOih0aGlzLl9jdXJ2ZT10LHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLmRvd25zYW1wbGluZ0VuYWJsZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZG93bnNhbXBsaW5nRW5hYmxlZDoodGhpcy5fZG93bnNhbXBsaW5nRW5hYmxlZD10LHRoaXMpfSxlLnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZDoodGhpcy5fY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQ9dCx0aGlzLnJlbmRlcigpLHRoaXMpfSxlLnByb3RvdHlwZS5jb2xsYXBzZURlbnNlTGluZXNFbmFibGVkPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2NvbGxhcHNlRGVuc2VWZXJ0aWNhbExpbmVzRW5hYmxlZDoodGhpcy5fY29sbGFwc2VEZW5zZVZlcnRpY2FsTGluZXNFbmFibGVkPXQsdGhpcy5yZW5kZXIoKSx0aGlzKX0sZS5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiBuZXcgQ010LlByb3h5RHJhd2VyKChmdW5jdGlvbigpe3JldHVybiBuZXcgQU10LkxpbmVTVkdEcmF3ZXJ9KSwoZnVuY3Rpb24obil7cmV0dXJuIG5ldyBUTXQuQ2FudmFzRHJhd2VyKG4sQU10Lm1ha2VMaW5lQ2FudmFzRHJhd1N0ZXAoKGZ1bmN0aW9uKCl7cmV0dXJuIGUuX2QzTGluZUZhY3RvcnkodCl9KSkpfSkpfSxlLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oZSl7dmFyIG49dC5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5LmNhbGwodGhpcyxlKTtpZighdGhpcy5fYXV0b3JhbmdlU21vb3RoKXJldHVybiBuO2lmKHRoaXMuYXV0b3JhbmdlTW9kZSgpIT09ZSlyZXR1cm4gbjtpZigieCIhPT10aGlzLmF1dG9yYW5nZU1vZGUoKSYmInkiIT09dGhpcy5hdXRvcmFuZ2VNb2RlKCkpcmV0dXJuIG47dmFyIGkscj10aGlzLl9nZXRFZGdlSW50ZXJzZWN0aW9uUG9pbnRzKCk7cmV0dXJuIGk9InkiPT09dGhpcy5hdXRvcmFuZ2VNb2RlKCk/ci5sZWZ0LmNvbmNhdChyLnJpZ2h0KS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lnl9KSk6ci50b3AuY29uY2F0KHIuYm90dG9tKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lnh9KSksbi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBNTXQuZXh0ZW50KE1NdC5tZXJnZShbdCxpXSkpfSkpfSxlLnByb3RvdHlwZS5fZ2V0RWRnZUludGVyc2VjdGlvblBvaW50cz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoISh0aGlzLnkoKS5zY2FsZSBpbnN0YW5jZW9mIExNdC5RdWFudGl0YXRpdmVTY2FsZSYmdGhpcy54KCkuc2NhbGUgaW5zdGFuY2VvZiBMTXQuUXVhbnRpdGF0aXZlU2NhbGUpKXJldHVybntsZWZ0OltdLHJpZ2h0OltdLHRvcDpbXSxib3R0b206W119O3ZhciBlPXRoaXMueSgpLnNjYWxlLG49dGhpcy54KCkuc2NhbGUsaT17bGVmdDpbXSxyaWdodDpbXSx0b3A6W10sYm90dG9tOltdfSxyPW4uc2NhbGUobi5kb21haW4oKVswXSksbz1uLnNjYWxlKG4uZG9tYWluKClbMV0pLGE9ZS5zY2FsZShlLmRvbWFpbigpWzBdKSxzPWUuc2NhbGUoZS5kb21haW4oKVsxXSk7cmV0dXJuIHRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKChmdW5jdGlvbihsKXtmb3IodmFyIGMsdSxoLGQscD1sLmRhdGEoKSxmPTE7ZjxwLmxlbmd0aDtmKyspYz1ofHxuLnNjYWxlKHQueCgpLmFjY2Vzc29yKHBbZi0xXSxmLTEsbCkpLHU9ZHx8ZS5zY2FsZSh0LnkoKS5hY2Nlc3NvcihwW2YtMV0sZi0xLGwpKSxoPW4uc2NhbGUodC54KCkuYWNjZXNzb3IocFtmXSxmLGwpKSxkPWUuc2NhbGUodC55KCkuYWNjZXNzb3IocFtmXSxmLGwpKSxjPHI9PXI8PWgmJmkubGVmdC5wdXNoKHt4OnIseTplLmludmVydCh1KyhyLWMpKihkLXUpLyhoLWMpKX0pLGM8bz09bzw9aCYmaS5yaWdodC5wdXNoKHt4Om8seTplLmludmVydCh1KyhvLWMpKihkLXUpLyhoLWMpKX0pLHU8cz09czw9ZCYmaS50b3AucHVzaCh7eDpuLmludmVydChjKyhzLXUpKihoLWMpLyhkLXUpKSx5OnN9KSx1PGE9PWE8PWQmJmkuYm90dG9tLnB1c2goe3g6bi5pbnZlcnQoYysoYS11KSooaC1jKS8oZC11KSkseTphfSl9KSksaX0sZS5wcm90b3R5cGUuX2dldFJlc2V0WUZ1bmN0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy55KCkuc2NhbGUuZG9tYWluKCksZT1NYXRoLm1heCh0WzBdLHRbMV0pLG49TWF0aC5taW4odFswXSx0WzFdKSxpPWU8MCYmZXx8bj4wJiZufHwwLHI9dGhpcy55KCkuc2NhbGUuc2NhbGUoaSk7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcn19LGUucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz1mdW5jdGlvbigpe3ZhciB0PVtdO2lmKHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSl7dmFyIGU9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7ZS5kPXRoaXMuX2NvbnN0cnVjdExpbmVQcm9qZWN0b3IoSU10LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx0aGlzLl9nZXRSZXNldFlGdW5jdGlvbigpKSx0LnB1c2goe2F0dHJUb1Byb2plY3RvcjplLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKE5NdC5BbmltYXRvci5SRVNFVCl9KX1yZXR1cm4gdC5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoTk10LkFuaW1hdG9yLk1BSU4pfSksdH0sZS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyk7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCJkIiE9PXQpe3ZhciBuPWVbdF07ZVt0XT1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIHQubGVuZ3RoPjA/bih0WzBdLGUsaSk6bnVsbH19fSkpLGV9LGUucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5lbnRpdHlOZWFyZXN0QnlYVGhlblkodCk7cmV0dXJuIG51bGwhPWU/W2VdOltdfSxlLnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0QnlYVGhlblk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49MS8wLGk9MS8wLHI9dGhpcy5ib3VuZHMoKSxvPXRoaXMuZW50aXRpZXMoKSxhPW8ubGVuZ3RoLHM9MDtzPGE7cysrKXt2YXIgbD1vW3NdO2lmKFBNdC5NYXRoLndpdGhpbihsLnBvc2l0aW9uLHIpKXt2YXIgYz1NYXRoLmFicyh0LngtbC5wb3NpdGlvbi54KSx1PU1hdGguYWJzKHQueS1sLnBvc2l0aW9uLnkpOyhjPG58fGM9PT1uJiZ1PGkpJiYoZT1sLG49YyxpPXUpfX1yZXR1cm4gZX0sZS5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBlPXQucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKTtyZXR1cm4gZS5kPXRoaXMuX2NvbnN0cnVjdExpbmVQcm9qZWN0b3IoSU10LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxJTXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpKSxlfSxlLnByb3RvdHlwZS5fY29uc3RydWN0TGluZVByb2plY3Rvcj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKGkscixvKXtyZXR1cm4gbi5fZDNMaW5lRmFjdG9yeShvLHQsZSkoaSl9fSxlLnByb3RvdHlwZS5fZDNMaW5lRmFjdG9yeT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHZvaWQgMD09PWUmJihlPUlNdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSkpLHZvaWQgMD09PW4mJihuPUlNdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkpLE1NdC5saW5lKCkueCgoZnVuY3Rpb24obixpKXtyZXR1cm4gZShuLGksdCl9KSkueSgoZnVuY3Rpb24oZSxpKXtyZXR1cm4gbihlLGksdCl9KSkuY3VydmUodGhpcy5fZ2V0Q3VydmVGYWN0b3J5KCkpLmRlZmluZWQoKGZ1bmN0aW9uKGkscil7cmV0dXJuKGZ1bmN0aW9uKHQsaSxyKXt2YXIgbz1lKHQsaSxyKSxhPW4odCxpLHIpO3JldHVybiBQTXQuTWF0aC5pc1ZhbGlkTnVtYmVyKG8pJiZQTXQuTWF0aC5pc1ZhbGlkTnVtYmVyKGEpfSkoaSxyLHQpfSkpfSxlLnByb3RvdHlwZS5fZ2V0Q3VydmVGYWN0b3J5PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jdXJ2ZSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIGU9T010W3RdO3JldHVybiBudWxsPT1lP09NdC5saW5lYXI6ZX1yZXR1cm4gdH0sZS5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9bmV3IFBNdC5NYXA7cmV0dXJuIHRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKChmdW5jdGlvbihuKXt2YXIgaT1uLmRhdGEoKTtpZih0Ll9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZHx8dC5fZG93bnNhbXBsaW5nRW5hYmxlZCl7Zm9yKHZhciByPVtdLG89aS5sZW5ndGgsYT0wO2E8bzthKyspclthXT1hO3QuX2Nyb3BwZWRSZW5kZXJpbmdFbmFibGVkJiYocj10Ll9maWx0ZXJDcm9wcGVkUmVuZGVyaW5nKG4scikpLHQuX2Rvd25zYW1wbGluZ0VuYWJsZWQmJihyPXQuX2ZpbHRlckRvd25zYW1wbGluZyhuLHIpKSx0Ll9jb2xsYXBzZURlbnNlVmVydGljYWxMaW5lc0VuYWJsZWQmJihyPXQuX2ZpbHRlckRlbnNlTGluZXMobixyKSk7dmFyIHM9W10sbD1yLmxlbmd0aDtmb3IoYT0wO2E8bDthKyspc1thXT1pW3JbYV1dO2Uuc2V0KG4sW3NdKX1lbHNlIGUuc2V0KG4sW2ldKX0pKSxlfSxlLnByb3RvdHlwZS5fZmlsdGVyQ3JvcHBlZFJlbmRlcmluZz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLGk9SU10LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxyPUlNdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSksbz10LmRhdGEoKSxhPVtdLHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gUE10Lk1hdGguaW5SYW5nZSh0LDAsbi53aWR0aCgpKSYmUE10Lk1hdGguaW5SYW5nZShlLDAsbi5oZWlnaHQoKSl9LGw9MDtsPGUubGVuZ3RoO2wrKyl7dmFyIGM9cyhpKG9bZVtsXV0sZVtsXSx0KSxyKG9bZVtsXV0sZVtsXSx0KSk7aWYoIWMmJm51bGwhPWVbbC0xXSYmbnVsbCE9b1tlW2wtMV1dKXt2YXIgdT1pKG9bZVtsLTFdXSxlW2wtMV0sdCksaD1yKG9bZVtsLTFdXSxlW2wtMV0sdCk7Yz1jfHxzKHUsaCl9aWYoIWMmJm51bGwhPWVbbCsxXSYmbnVsbCE9b1tlW2wrMV1dKXt2YXIgZD1pKG9bZVtsKzFdXSxlW2wrMV0sdCkscD1yKG9bZVtsKzFdXSxlW2wrMV0sdCk7Yz1jfHxzKGQscCl9YyYmYS5wdXNoKGVbbF0pfXJldHVybiBhfSxlLnByb3RvdHlwZS5fZmlsdGVyRG93bnNhbXBsaW5nPWZ1bmN0aW9uKHQsZSl7aWYoMD09PWUubGVuZ3RoKXJldHVybltdO2Zvcih2YXIgbj10LmRhdGEoKSxpPUlNdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSkscj1JTXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLG89W2VbMF1dLGE9ZnVuY3Rpb24obyxhKXt2YXIgcz1pKG5bZVtvXV0sZVtvXSx0KSxsPXIobltlW29dXSxlW29dLHQpLGM9aShuW2VbbysxXV0sZVtvKzFdLHQpLHU9cihuW2VbbysxXV0sZVtvKzFdLHQpO2lmKGE9PT0xLzApcmV0dXJuIE1hdGguZmxvb3Iocyk9PT1NYXRoLmZsb29yKGMpO3ZhciBoPWwrKGMtcykqYTtyZXR1cm4gTWF0aC5mbG9vcih1KT09PU1hdGguZmxvb3IoaCl9LHM9MDtzPGUubGVuZ3RoLTE7KXtmb3IodmFyIGw9ZVtzXSxjPWkobltlW3NdXSxlW3NdLHQpLHU9cihuW2Vbc11dLGVbc10sdCksaD1pKG5bZVtzKzFdXSxlW3MrMV0sdCksZD1yKG5bZVtzKzFdXSxlW3MrMV0sdCkscD1NYXRoLmZsb29yKGMpPT09TWF0aC5mbG9vcihoKT8xLzA6KGQtdSkvKGgtYyksZj1lW3NdLG09cD09PTEvMD91OmMsZz1mLF89bSx5PSEwO3M8ZS5sZW5ndGgtMSYmKHl8fGEocyxwKSk7KXtzKysseT0hMTt2YXIgdj1wPT09MS8wP3IobltlW3NdXSxlW3NdLHQpOmkobltlW3NdXSxlW3NdLHQpO3Y+XyYmKF89dixnPWVbc10pLHY8bSYmKG09dixmPWVbc10pfXZhciBiPWVbc107ZiE9PWwmJm8ucHVzaChmKSxnIT09ZiYmZyE9PWwmJm8ucHVzaChnKSxiIT09bCYmYiE9PWYmJmIhPT1nJiZvLnB1c2goYil9cmV0dXJuIG99LGUucHJvdG90eXBlLl9maWx0ZXJEZW5zZUxpbmVzPWZ1bmN0aW9uKHQsZSl7aWYoMD09PWUubGVuZ3RoKXJldHVybltdO3ZhciBuPXQuZGF0YSgpLGk9SU10LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxyPUlNdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7cmV0dXJuIHRoaXMuX2J1Y2tldEJ5WCh0LGUsKGZ1bmN0aW9uKGUpe3JldHVybiBpKG5bZV0sZSx0KX0pLChmdW5jdGlvbihlKXtyZXR1cm4gcihuW2VdLGUsdCl9KSl9LGUucHJvdG90eXBlLl9idWNrZXRCeVg9ZnVuY3Rpb24odCxlLG4saSl7Zm9yKHZhciByPVtdLG89dC5kYXRhKCksYT1udWxsLHM9ZS5sZW5ndGgsbD0wO2w8PXM7KytsKXt2YXIgYz1lW2xdO2lmKG51bGwhPW9bY10pe3ZhciB1PU1hdGguZmxvb3IobihjKSksaD1pKGMpO251bGw9PWE/YT1uZXcgUE10LkJ1Y2tldChjLHUsaCk6YS5pc0luQnVja2V0KHUpP2EuYWRkVG9CdWNrZXQoaCxjKTooci5wdXNoLmFwcGx5KHIsYS5nZXRVbmlxdWVJbmRpY2VzKCkpLGE9bmV3IFBNdC5CdWNrZXQoYyx1LGgpKX19cmV0dXJuIG51bGwhPWEmJnIucHVzaC5hcHBseShyLGEuZ2V0VW5pcXVlSW5kaWNlcygpKSxyfSxlfSkoUk10LlhZUGxvdCk7bU10LkxpbmU9ek10LAovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoZk10LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgRE10PXVPLEJNdD1FZHQsSE10PVp5dCxGTXQ9Rmd0LFZNdD1OU3QsVU10PUhTdCxqTXQ9V3d0LEdNdD1xU3QsV010PXBNdCxxTXQ9dXd0LFlNdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gZS5hZGRDbGFzcygiYXJlYS1wbG90IiksZS55MCgwKSxlLmF0dHIoImZpbGwtb3BhY2l0eSIsLjI1KSxlLmF0dHIoImZpbGwiLChuZXcgSE10LkNvbG9yKS5yYW5nZSgpWzBdKSxlLl9saW5lRHJhd2Vycz1uZXcgRk10Lk1hcCxlfXJldHVybiBETXQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUueT1mdW5jdGlvbihuLGkpe2lmKG51bGw9PW4pcmV0dXJuIHQucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtpZihudWxsPT1pP3QucHJvdG90eXBlLnkuY2FsbCh0aGlzLG4pOnQucHJvdG90eXBlLnkuY2FsbCh0aGlzLG4saSksbnVsbCE9aSl7dmFyIHI9dGhpcy55MCgpLmFjY2Vzc29yO251bGwhPXImJnRoaXMuX2JpbmRQcm9wZXJ0eShlLl9ZMF9LRVkscixpKSx0aGlzLl91cGRhdGVZU2NhbGUoKX1yZXR1cm4gdGhpc30sZS5wcm90b3R5cGUueTA9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoZS5fWTBfS0VZKTt2YXIgbj10aGlzLnkoKTtyZXR1cm4gdGhpcy5fYmluZFByb3BlcnR5KGUuX1kwX0tFWSx0LG4mJm4uc2NhbGUpLHRoaXMuX3VwZGF0ZVlTY2FsZSgpLHRoaXMucmVuZGVyKCksdGhpc30sZS5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe3QucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKSx0aGlzLl91cGRhdGVZU2NhbGUoKX0sZS5wcm90b3R5cGUuX2FkZERhdGFzZXQ9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztyZXR1cm4gdGhpcy5fbGluZURyYXdlcnMuc2V0KGUsbmV3IFZNdC5Qcm94eURyYXdlcigoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEdNdC5MaW5lU1ZHRHJhd2VyfSksKGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgVk10LkNhbnZhc0RyYXdlcih0LEdNdC5tYWtlTGluZUNhbnZhc0RyYXdTdGVwKChmdW5jdGlvbigpe3ZhciB0PXFNdC5QbG90Ll9zY2FsZWRBY2Nlc3NvcihuLngoKSksaT1xTXQuUGxvdC5fc2NhbGVkQWNjZXNzb3Iobi55KCkpO3JldHVybiBuLl9kM0xpbmVGYWN0b3J5KGUsdCxpKX0pKSl9KSkpLHQucHJvdG90eXBlLl9hZGREYXRhc2V0LmNhbGwodGhpcyxlKSx0aGlzfSxlLnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0PWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQuY2FsbCh0aGlzLGUpO3ZhciBuPXRoaXMuX2xpbmVEcmF3ZXJzLmdldChlKTtyZXR1cm4ic3ZnIj09PXRoaXMucmVuZGVyZXIoKT9uLnVzZVNWRyh0aGlzLl9yZW5kZXJBcmVhKTpuLnVzZUNhbnZhcyh0aGlzLl9jYW52YXMpLG59LGUucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXM9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcy5jYWxsKHRoaXMsZSksdGhpcy5fbGluZURyYXdlcnMuZ2V0KGUpLnJlbW92ZSgpfSxlLnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuX2dlbmVyYXRlTGluZURyYXdTdGVwcygpLG49dGhpcy5fZ2V0RGF0YVRvRHJhdygpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKChmdW5jdGlvbihpKXt2YXIgcj1xTXQuUGxvdC5hcHBseURyYXdTdGVwcyhlLGkpO3QuX2xpbmVEcmF3ZXJzLmdldChpKS5kcmF3KG4uZ2V0KGkpLHIpfSkpfSxlLnByb3RvdHlwZS5fZ2VuZXJhdGVMaW5lRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7dmFyIHQ9W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgZT10aGlzLl9nZW5lcmF0ZUxpbmVBdHRyVG9Qcm9qZWN0b3IoKTtlLmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3RvcihxTXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHRoaXMuX2dldFJlc2V0WUZ1bmN0aW9uKCkpLHQucHVzaCh7YXR0clRvUHJvamVjdG9yOmUsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoV010LkFuaW1hdG9yLlJFU0VUKX0pfXJldHVybiB0LnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZW5lcmF0ZUxpbmVBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihXTXQuQW5pbWF0b3IuTUFJTil9KSx0fSxlLnByb3RvdHlwZS5fZ2VuZXJhdGVMaW5lQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7cmV0dXJuIHQuZD10aGlzLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yKHFNdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSkscU10LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSksdH0sZS5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiBuZXcgak10LlByb3h5RHJhd2VyKChmdW5jdGlvbigpe3JldHVybiBuZXcgVU10LkFyZWFTVkdEcmF3ZXJ9KSwoZnVuY3Rpb24obil7cmV0dXJuIG5ldyBWTXQuQ2FudmFzRHJhd2VyKG4sVU10Lm1ha2VBcmVhQ2FudmFzRHJhd1N0ZXAoKGZ1bmN0aW9uKCl7dmFyIG49ZS5fY29vcmRpbmF0ZVByb2plY3RvcnMoKSxpPW5bMF0scj1uWzFdLG89blsyXSxhPWUuX2NyZWF0ZURlZmluZWRQcm9qZWN0b3IoaSxyKTtyZXR1cm4gZS5fY3JlYXRlQXJlYUdlbmVyYXRvcihpLHIsbyxhLHQpfSksKGZ1bmN0aW9uKCl7dmFyIG49ZS5fY29vcmRpbmF0ZVByb2plY3RvcnMoKSxpPW5bMF0scj1uWzFdLG89ZS5fY3JlYXRlRGVmaW5lZFByb2plY3RvcihpLHIpO3JldHVybiBlLl9jcmVhdGVUb3BMaW5lR2VuZXJhdG9yKGkscixvLHQpfSkpKX0pKX0sZS5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7dmFyIHQ9W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgZT10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTtlLmQ9dGhpcy5fY29uc3RydWN0QXJlYVByb2plY3RvcihxTXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHRoaXMuX2dldFJlc2V0WUZ1bmN0aW9uKCkscU10LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTAoKSkpLHQucHVzaCh7YXR0clRvUHJvamVjdG9yOmUsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoV010LkFuaW1hdG9yLlJFU0VUKX0pfXJldHVybiB0LnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihXTXQuQW5pbWF0b3IuTUFJTil9KSx0fSxlLnByb3RvdHlwZS5fdXBkYXRlWVNjYWxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRFeHRlbnRzRm9yUHJvcGVydHkoInkwIiksZT1GTXQuQXJyYXkuZmxhdHRlbih0KSxuPUZNdC5BcnJheS51bmlxKGUpLGk9MT09PW4ubGVuZ3RoP25bMF06bnVsbCxyPXRoaXMueSgpLG89ciYmci5zY2FsZTtudWxsIT1vJiYobnVsbCE9dGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXImJihvLnJlbW92ZVBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXIodGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXIpLHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyPW51bGwpLG51bGwhPWkmJih0aGlzLl9jb25zdGFudEJhc2VsaW5lVmFsdWVQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybltpXX0sby5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyKSkpfSxlLnByb3RvdHlwZS5fZ2V0UmVzZXRZRnVuY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gcU10LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTAoKSl9LGUucHJvdG90eXBlLl9jb29yZGluYXRlUHJvamVjdG9ycz1mdW5jdGlvbigpe3JldHVybltxTXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHFNdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkscU10LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTAoKSldfSxlLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpLG49dGhpcy5fY29vcmRpbmF0ZVByb2plY3RvcnMoKTtyZXR1cm4gZS5kPXRoaXMuX2NvbnN0cnVjdEFyZWFQcm9qZWN0b3IoblswXSxuWzFdLG5bMl0pLGV9LGUucHJvdG90eXBlLnNlbGVjdGlvbnM9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztpZih2b2lkIDA9PT1lJiYoZT10aGlzLmRhdGFzZXRzKCkpLCJjYW52YXMiPT09dGhpcy5yZW5kZXJlcigpKXJldHVybiBCTXQuc2VsZWN0QWxsKCk7dmFyIGk9dC5wcm90b3R5cGUuc2VsZWN0aW9ucy5jYWxsKHRoaXMsZSkubm9kZXMoKTtyZXR1cm4gZS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBuLl9saW5lRHJhd2Vycy5nZXQodCl9KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dH0pKS5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gaS5wdXNoLmFwcGx5KGksdC5nZXRWaXN1YWxQcmltaXRpdmVzKCkpfSkpLEJNdC5zZWxlY3RBbGwoaSl9LGUucHJvdG90eXBlLl9jb25zdHJ1Y3RBcmVhUHJvamVjdG9yPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLHI9dGhpcy5fY3JlYXRlRGVmaW5lZFByb2plY3RvcihxTXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHFNdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkpO3JldHVybiBmdW5jdGlvbihvLGEscyl7cmV0dXJuIGkuX2NyZWF0ZUFyZWFHZW5lcmF0b3IodCxlLG4scixzKShvKX19LGUucHJvdG90eXBlLl9jcmVhdGVEZWZpbmVkUHJvamVjdG9yPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSxyKXt2YXIgbz10KG4saSxyKSxhPWUobixpLHIpO3JldHVybiBGTXQuTWF0aC5pc1ZhbGlkTnVtYmVyKG8pJiZGTXQuTWF0aC5pc1ZhbGlkTnVtYmVyKGEpfX0sZS5wcm90b3R5cGUuX2NyZWF0ZUFyZWFHZW5lcmF0b3I9ZnVuY3Rpb24odCxlLG4saSxyKXt2YXIgbz10aGlzLl9nZXRDdXJ2ZUZhY3RvcnkoKTtyZXR1cm4gQk10LmFyZWEoKS54KChmdW5jdGlvbihlLG4pe3JldHVybiB0KGUsbixyKX0pKS55MSgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZSh0LG4scil9KSkueTAoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odCxlLHIpfSkpLmN1cnZlKG8pLmRlZmluZWQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkodCxlLHIpfSkpfSxlLnByb3RvdHlwZS5fY3JlYXRlVG9wTGluZUdlbmVyYXRvcj1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10aGlzLl9nZXRDdXJ2ZUZhY3RvcnkoKTtyZXR1cm4gQk10LmxpbmUoKS54KChmdW5jdGlvbihlLG4pe3JldHVybiB0KGUsbixpKX0pKS55KChmdW5jdGlvbih0LG4pe3JldHVybiBlKHQsbixpKX0pKS5jdXJ2ZShyKS5kZWZpbmVkKChmdW5jdGlvbih0LGUpe3JldHVybiBuKHQsZSxpKX0pKX0sZS5fWTBfS0VZPSJ5MCIsZX0pKG1NdC5MaW5lKTtmTXQuQXJlYT1ZTXQ7dmFyIFhNdD17fTshKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9dU8sbj1FZHQsaT1JbXQscj1fbXQsbz1neXQsYT1OU3Qscz1Xd3QsbD1KU3QsYz1kd3QsdT1aeXQsaD1JdnQsZD1GZ3QscD1TbXQsZj1wTXQsbT11d3QsZz1nTXQ7dC5CYXJPcmllbnRhdGlvbj1wLm1ha2VFbnVtKFsidmVydGljYWwiLCJob3Jpem9udGFsIl0pLHQuTGFiZWxzUG9zaXRpb249cC5tYWtlRW51bShbInN0YXJ0IiwibWlkZGxlIiwiZW5kIiwib3V0c2lkZSJdKSx0LkJhckFsaWdubWVudD1wLm1ha2VFbnVtKFsic3RhcnQiLCJtaWRkbGUiLCJlbmQiXSk7dmFyIF89KGZ1bmN0aW9uKHApe2Z1bmN0aW9uIGcoZSl7dm9pZCAwPT09ZSYmKGU9InZlcnRpY2FsIik7dmFyIG49cC5jYWxsKHRoaXMpfHx0aGlzO2lmKG4uX2xhYmVsRm9ybWF0dGVyPW8uaWRlbnRpdHkoKSxuLl9sYWJlbHNFbmFibGVkPSExLG4uX2xhYmVsc1Bvc2l0aW9uPXQuTGFiZWxzUG9zaXRpb24uZW5kLG4uX2hpZGVCYXJzSWZBbnlBcmVUb29XaWRlPSEwLG4uX2JhckFsaWdubWVudD0ibWlkZGxlIixuLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3M9Yy5tZW1vaXplKHkpLG4uX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M9ITAsbi5hZGRDbGFzcygiYmFyLXBsb3QiKSwidmVydGljYWwiIT09ZSYmImhvcml6b250YWwiIT09ZSl0aHJvdyBuZXcgRXJyb3IoZSsiIGlzIG5vdCBhIHZhbGlkIG9yaWVudGF0aW9uIGZvciBQbG90cy5CYXIiKTtyZXR1cm4gbi5faXNWZXJ0aWNhbD0idmVydGljYWwiPT09ZSxuLmFuaW1hdG9yKCJiYXNlbGluZSIsbmV3IHIuTnVsbCksbi5hdHRyKCJmaWxsIiwobmV3IHUuQ29sb3IpLnJhbmdlKClbMF0pLG4uYXR0cihnLl9CQVJfVEhJQ0tORVNTX0tFWSwoZnVuY3Rpb24oKXtyZXR1cm4gbi5fYmFyUGl4ZWxUaGlja25lc3MoKX0pKSxuLl9sYWJlbENvbmZpZz1uZXcgZC5NYXAsbi5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuW24uYmFzZWxpbmVWYWx1ZSgpXX0sbn1yZXR1cm4gZS5fX2V4dGVuZHMoZyxwKSxnLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsdCxlLG4pLHRoaXMuX3VwZGF0ZUV4dGVudHMoKSx0aGlzfSxnLnByb3RvdHlwZS54PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/cC5wcm90b3R5cGUueC5jYWxsKHRoaXMpOihudWxsPT1lP3AucHJvdG90eXBlLnguY2FsbCh0aGlzLHQpOnAucHJvdG90eXBlLnguY2FsbCh0aGlzLHQsZSksdGhpcy5fdXBkYXRlVGhpY2tuZXNzQXR0cigpLHRoaXMuX3VwZGF0ZUxlbmd0aFNjYWxlKCksdGhpcyl9LGcucHJvdG90eXBlLnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD9wLnByb3RvdHlwZS55LmNhbGwodGhpcyk6KG51bGw9PWU/cC5wcm90b3R5cGUueS5jYWxsKHRoaXMsdCk6cC5wcm90b3R5cGUueS5jYWxsKHRoaXMsdCxlKSx0aGlzLl91cGRhdGVMZW5ndGhTY2FsZSgpLHRoaXMpfSxnLnByb3RvdHlwZS5sZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNWZXJ0aWNhbD90aGlzLnkoKTp0aGlzLngoKX0sZy5wcm90b3R5cGUucG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNWZXJ0aWNhbD90aGlzLngoKTp0aGlzLnkoKX0sZy5wcm90b3R5cGUuYmFyRW5kPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KGcuX0JBUl9FTkRfS0VZKTt2YXIgZT10aGlzLnBvc2l0aW9uKCk7cmV0dXJuIHRoaXMuX2JpbmRQcm9wZXJ0eShnLl9CQVJfRU5EX0tFWSx0LGUmJmUuc2NhbGUpLHRoaXMuX3VwZGF0ZVRoaWNrbmVzc0F0dHIoKSx0aGlzLl91cGRhdGVMZW5ndGhTY2FsZSgpLHRoaXMucmVuZGVyKCksdGhpc30sZy5wcm90b3R5cGUuYmFyQWxpZ25tZW50PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2JhckFsaWdubWVudDoodGhpcy5fYmFyQWxpZ25tZW50PXQsdGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpLHRoaXMucmVuZGVyKCksdGhpcyl9LGcucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9LGcucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHMuUHJveHlEcmF3ZXIoKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBsLlJlY3RhbmdsZVNWR0RyYXdlcihnLl9CQVJfQVJFQV9DTEFTUyl9KSwoZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBhLlJlY3RhbmdsZUNhbnZhc0RyYXdlcih0KX0pKX0sZy5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyksdGhpcy5fYmFzZWxpbmU9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApfSxnLnByb3RvdHlwZS5iYXNlbGluZVZhbHVlPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpe2lmKG51bGwhPXRoaXMuX2Jhc2VsaW5lVmFsdWUpcmV0dXJuIHRoaXMuX2Jhc2VsaW5lVmFsdWU7aWYoIXRoaXMuX3Byb2plY3RvcnNSZWFkeSgpKXJldHVybiAwO3ZhciBlPXRoaXMubGVuZ3RoKCkuc2NhbGU7cmV0dXJuIGUmJmUgaW5zdGFuY2VvZiB1LlRpbWU/bmV3IERhdGUoMCk6MH1yZXR1cm4gdGhpcy5fYmFzZWxpbmVWYWx1ZT10LHRoaXMuX3VwZGF0ZUxlbmd0aFNjYWxlKCksdGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpLHRoaXMucmVuZGVyKCksdGhpc30sZy5wcm90b3R5cGUuYWRkRGF0YXNldD1mdW5jdGlvbih0KXtyZXR1cm4gcC5wcm90b3R5cGUuYWRkRGF0YXNldC5jYWxsKHRoaXMsdCksdGhpc30sZy5wcm90b3R5cGUuX2FkZERhdGFzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHAucHJvdG90eXBlLl9hZGREYXRhc2V0LmNhbGwodGhpcyx0KSx0aGlzfSxnLnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKHQpe3JldHVybiBwLnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0LmNhbGwodGhpcyx0KSx0aGlzfSxnLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldD1mdW5jdGlvbih0KXtyZXR1cm4gcC5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQuY2FsbCh0aGlzLHQpLHRoaXN9LGcucHJvdG90eXBlLmRhdGFzZXRzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3AucHJvdG90eXBlLmRhdGFzZXRzLmNhbGwodGhpcyk6KHAucHJvdG90eXBlLmRhdGFzZXRzLmNhbGwodGhpcyx0KSx0aGlzKX0sZy5wcm90b3R5cGUubGFiZWxzRW5hYmxlZD1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3RoaXMuX2xhYmVsc0VuYWJsZWQ6KHRoaXMuX2xhYmVsc0VuYWJsZWQ9dCxudWxsIT1lJiYodGhpcy5fbGFiZWxzUG9zaXRpb249ZSksdGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpLHRoaXMucmVuZGVyKCksdGhpcyl9LGcucHJvdG90eXBlLmxhYmVsRm9ybWF0dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2xhYmVsRm9ybWF0dGVyOih0aGlzLl9sYWJlbEZvcm1hdHRlcj10LHRoaXMuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGUoKSx0aGlzLnJlbmRlcigpLHRoaXMpfSxnLnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXAucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQuY2FsbCh0aGlzLHQpLG49dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImciKS5jbGFzc2VkKGcuX0xBQkVMX0FSRUFfQ0xBU1MsITApLHI9bmV3IGkuU3ZnQ29udGV4dChuLm5vZGUoKSksbz1uZXcgaS5DYWNoZU1lYXN1cmVyKHIpLGE9bmV3IGkuV3JpdGVyKG8scik7cmV0dXJuIHRoaXMuX2xhYmVsQ29uZmlnLnNldCh0LHtsYWJlbEFyZWE6bixtZWFzdXJlcjpvLHdyaXRlcjphfSksZX0sZy5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcz1mdW5jdGlvbih0KXtwLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzLmNhbGwodGhpcyx0KTt2YXIgZT10aGlzLl9sYWJlbENvbmZpZy5nZXQodCk7bnVsbCE9ZSYmKGUubGFiZWxBcmVhLnJlbW92ZSgpLHRoaXMuX2xhYmVsQ29uZmlnLmRlbGV0ZSh0KSl9LGcucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWZ1bmN0aW9uKCl7dmFyIG49ZS5faXNWZXJ0aWNhbD9lLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0eU5lYXJlc3RYKHQpOmUuX2dldEVudGl0eVN0b3JlKCkuZW50aXR5TmVhcmVzdFkodCk7cmV0dXJuIHZvaWQgMD09PW4/dm9pZCAwOmUuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShuKX07cmV0dXJuIHRoaXMuX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M/dGhpcy5fY29tcHV0ZUJhclBpeGVsVGhpY2tuZXNzLmRvTG9ja2VkKG4pOm4oKX0sZy5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49ZnVuY3Rpb24oKXtyZXR1cm4gZS5fZW50aXRpZXNJbnRlcnNlY3RpbmcodC54LHQueSl9O3JldHVybiB0aGlzLl9maXhlZEJhclBpeGVsVGhpY2tuZXNzP3RoaXMuX2NvbXB1dGVCYXJQaXhlbFRoaWNrbmVzcy5kb0xvY2tlZChuKTpuKCl9LGcucHJvdG90eXBlLmVudGl0aWVzSW5Cb3VuZHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWZ1bmN0aW9uKCl7cmV0dXJuIHAucHJvdG90eXBlLmVudGl0aWVzSW5Cb3VuZHMuY2FsbChlLHQpfTtyZXR1cm4gdGhpcy5fZml4ZWRCYXJQaXhlbFRoaWNrbmVzcz90aGlzLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3MuZG9Mb2NrZWQobik6bigpfSxnLnByb3RvdHlwZS5lbnRpdGllc0luWEJvdW5kcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49ZnVuY3Rpb24oKXtyZXR1cm4gcC5wcm90b3R5cGUuZW50aXRpZXNJblhCb3VuZHMuY2FsbChlLHQpfTtyZXR1cm4gdGhpcy5fZml4ZWRCYXJQaXhlbFRoaWNrbmVzcz90aGlzLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3MuZG9Mb2NrZWQobik6bigpfSxnLnByb3RvdHlwZS5lbnRpdGllc0luWUJvdW5kcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49ZnVuY3Rpb24oKXtyZXR1cm4gcC5wcm90b3R5cGUuZW50aXRpZXNJbllCb3VuZHMuY2FsbChlLHQpfTtyZXR1cm4gdGhpcy5fZml4ZWRCYXJQaXhlbFRoaWNrbmVzcz90aGlzLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3MuZG9Mb2NrZWQobik6bigpfSxnLnByb3RvdHlwZS5fZW50aXRpZXNJbnRlcnNlY3Rpbmc9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10saT10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzKCkscj1pLmxlbmd0aCxvPTA7bzxyO28rKyl7dmFyIGE9aVtvXTtkLkRPTS5pbnRlcnNlY3RzQkJveCh0LGUsdGhpcy5fZW50aXR5Qm91bmRzKGEpKSYmbi5wdXNoKHRoaXMuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShhKSl9cmV0dXJuIG59LGcucHJvdG90eXBlLl91cGRhdGVMZW5ndGhTY2FsZT1mdW5jdGlvbigpe2lmKHRoaXMuX3Byb2plY3RvcnNSZWFkeSgpKXt2YXIgdD10aGlzLmxlbmd0aCgpLnNjYWxlO3QgaW5zdGFuY2VvZiBoLlF1YW50aXRhdGl2ZVNjYWxlJiYodC5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlciksdC5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlcikpfX0sZy5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLl9iYXJQaXhlbFRoaWNrbmVzcygpLHRoaXMuX2NvbXB1dGVCYXJQaXhlbFRoaWNrbmVzcy5kb0xvY2tlZCgoZnVuY3Rpb24oKXtyZXR1cm4gcC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0KX0pKX0sZy5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dGhpcy5sZW5ndGgoKS5zY2FsZS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSksaT17eDE6dGhpcy5faXNWZXJ0aWNhbD8wOm4seTE6dGhpcy5faXNWZXJ0aWNhbD9uOjAseDI6dGhpcy5faXNWZXJ0aWNhbD90aGlzLndpZHRoKCk6bix5Mjp0aGlzLl9pc1ZlcnRpY2FsP246dGhpcy5oZWlnaHQoKX07dGhpcy5fZ2V0QW5pbWF0b3IoImJhc2VsaW5lIikuYW5pbWF0ZSh0aGlzLl9iYXNlbGluZSxpKSx0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX2xhYmVsQ29uZmlnLmdldCh0KS5sYWJlbEFyZWEuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCl9KSksdGhpcy5fbGFiZWxzRW5hYmxlZCYmZC5XaW5kb3cuc2V0VGltZW91dCgoZnVuY3Rpb24oKXtyZXR1cm4gZS5fZHJhd0xhYmVscygpfSksdCl9LGcucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMscj1wLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLHQpO2lmKCJ4Ij09PXQmJnRoaXMuX2lzVmVydGljYWwpZT10aGlzLngoKTtlbHNle2lmKCJ5IiE9PXR8fHRoaXMuX2lzVmVydGljYWwpcmV0dXJuIHI7ZT10aGlzLnkoKX1pZighKGUmJmUuc2NhbGUmJmUuc2NhbGUgaW5zdGFuY2VvZiBoLlF1YW50aXRhdGl2ZVNjYWxlKSlyZXR1cm4gcjt2YXIgbz1lLnNjYWxlLGE9dGhpcy5fYmFyUGl4ZWxUaGlja25lc3MoKTtyZXR1cm4gci5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBuLmV4dGVudChbby5pbnZlcnQoaS5fZ2V0UG9zaXRpb25BdHRyKG8uc2NhbGUodFswXSksYSkpLG8uaW52ZXJ0KGkuX2dldFBvc2l0aW9uQXR0cihvLnNjYWxlKHRbMF0pLGEpK2EpLG8uaW52ZXJ0KGkuX2dldFBvc2l0aW9uQXR0cihvLnNjYWxlKHRbMV0pLGEpKSxvLmludmVydChpLl9nZXRQb3NpdGlvbkF0dHIoby5zY2FsZSh0WzFdKSxhKSthKV0pfSkpfSxnLnByb3RvdHlwZS5fZ2V0UG9zaXRpb25BdHRyPWZ1bmN0aW9uKHQsZSl7c3dpdGNoKHRoaXMuX2lzVmVydGljYWx8fCh0LT1lLGUqPS0xKSx0aGlzLl9iYXJBbGlnbm1lbnQpe2Nhc2Uic3RhcnQiOnJldHVybiB0O2Nhc2UiZW5kIjpyZXR1cm4gdC1lO2Nhc2UibWlkZGxlIjpkZWZhdWx0OnJldHVybiB0LWUvMn19LGcucHJvdG90eXBlLl9kcmF3TGFiZWxzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuX2dldERhdGFUb0RyYXcoKSxuPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGk9dGhpcy5kYXRhc2V0cygpLnNvbWUoKGZ1bmN0aW9uKGkpe3JldHVybiBlLmdldChpKS5zb21lKChmdW5jdGlvbihlLHIpe3JldHVybiBudWxsIT1lJiZ0Ll9kcmF3TGFiZWwoZSxyLGksbil9KSl9KSk7dGhpcy5faGlkZUJhcnNJZkFueUFyZVRvb1dpZGUmJmkmJnRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXtyZXR1cm4gdC5fbGFiZWxDb25maWcuZ2V0KGUpLmxhYmVsQXJlYS5zZWxlY3RBbGwoImciKS5yZW1vdmUoKX0pKX0sZy5wcm90b3R5cGUuX2RyYXdMYWJlbD1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10aGlzLl9sYWJlbENvbmZpZy5nZXQobiksbz1yLmxhYmVsQXJlYSxhPXIubWVhc3VyZXIscz1yLndyaXRlcixsPSgwLHRoaXMubGVuZ3RoKCkuYWNjZXNzb3IpKHQsZSxuKSxjPXRoaXMubGVuZ3RoKCkuc2NhbGUsdT1udWxsIT1jP2Muc2NhbGUobCk6bCxoPW51bGwhPWM/Yy5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSk6dGhpcy5iYXNlbGluZVZhbHVlKCksZD17eDppLngodCxlLG4pLHk6aS55KHQsZSxuKX0scD17d2lkdGg6aS53aWR0aCh0LGUsbiksaGVpZ2h0OmkuaGVpZ2h0KHQsZSxuKX0sZj10aGlzLl9sYWJlbEZvcm1hdHRlcihsLHQsZSxuKSxtPWEubWVhc3VyZShmKSxnPXRoaXMuX3Nob3VsZFNob3dMYWJlbE9uQmFyKGQscCxtKSxfPXRoaXMuX2NhbGN1bGF0ZUxhYmVsUHJvcGVydGllcyhkLHAsbSxnLHRoaXMuX2lzVmVydGljYWw/dTw9aDp1PGgpLHk9Xy5jb250YWluZXJEaW1lbnNpb25zLHY9Xy5sYWJlbENvbnRhaW5lck9yaWdpbixiPV8ubGFiZWxPcmlnaW4seD1fLmFsaWdubWVudCx3PWkuZmlsbCh0LGUsbiksUz10aGlzLl9jcmVhdGVMYWJlbENvbnRhaW5lcihvLHYsYixtLGcsdyk7cmV0dXJuIHMud3JpdGUoZix5LndpZHRoLHkuaGVpZ2h0LHt4QWxpZ246eC54LHlBbGlnbjp4Lnl9LFMubm9kZSgpKSx0aGlzLl9pc1ZlcnRpY2FsP3Aud2lkdGg8bS53aWR0aDpwLmhlaWdodDxtLmhlaWdodH0sZy5wcm90b3R5cGUuX3Nob3VsZFNob3dMYWJlbE9uQmFyPWZ1bmN0aW9uKGUsbixpKXtpZih0aGlzLl9sYWJlbHNQb3NpdGlvbj09PXQuTGFiZWxzUG9zaXRpb24ub3V0c2lkZSlyZXR1cm4hMTt2YXIgcj10aGlzLl9pc1ZlcnRpY2FsP2UueTplLngsbz10aGlzLl9pc1ZlcnRpY2FsP24uaGVpZ2h0Om4ud2lkdGgsYT10aGlzLl9pc1ZlcnRpY2FsP3RoaXMuaGVpZ2h0KCk6dGhpcy53aWR0aCgpLHM9citvLGw9bztyZXR1cm4gcz5hP2w9YS1yOnI8MCYmKGw9cyksKHRoaXMuX2lzVmVydGljYWw/aS5oZWlnaHQ6aS53aWR0aCkrZy5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVI8PWx9LGcucHJvdG90eXBlLl9jYWxjdWxhdGVMYWJlbFByb3BlcnRpZXM9ZnVuY3Rpb24oZSxuLGkscixvKXt2YXIgYT10aGlzLHM9dGhpcy5faXNWZXJ0aWNhbD9lLnk6ZS54LGw9dGhpcy5faXNWZXJ0aWNhbD9uLmhlaWdodDpuLndpZHRoLGM9dGhpcy5faXNWZXJ0aWNhbD9pLmhlaWdodDppLndpZHRoLHU9ImNlbnRlciIsaD1sLGQ9cyxwPXMsZj1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSJ0b3BMZWZ0IjpyZXR1cm4gdT1hLl9pc1ZlcnRpY2FsPyJ0b3AiOiJsZWZ0IixkKz1nLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUix2b2lkKHArPWcuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSKTtjYXNlImNlbnRlciI6cmV0dXJuIHZvaWQocCs9KGwrYykvMik7Y2FzZSJib3R0b21SaWdodCI6cmV0dXJuIHU9YS5faXNWZXJ0aWNhbD8iYm90dG9tIjoicmlnaHQiLGQtPWcuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSLHZvaWQocCs9aC1nLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUi1jKX19O2lmKHIpc3dpdGNoKHRoaXMuX2xhYmVsc1Bvc2l0aW9uKXtjYXNlIHQuTGFiZWxzUG9zaXRpb24uc3RhcnQ6ZihvPyJib3R0b21SaWdodCI6InRvcExlZnQiKTticmVhaztjYXNlIHQuTGFiZWxzUG9zaXRpb24ubWlkZGxlOmYoImNlbnRlciIpO2JyZWFrO2Nhc2UgdC5MYWJlbHNQb3NpdGlvbi5lbmQ6ZihvPyJ0b3BMZWZ0IjoiYm90dG9tUmlnaHQiKX1lbHNlIG8/KHU9dGhpcy5faXNWZXJ0aWNhbD8idG9wIjoibGVmdCIsaD1sK2cuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSK2MsZC09Zy5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIrYyxwLT1nLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUitjKToodT10aGlzLl9pc1ZlcnRpY2FsPyJib3R0b20iOiJyaWdodCIsaD1sK2cuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSK2MscCs9bCtnLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUik7cmV0dXJue2NvbnRhaW5lckRpbWVuc2lvbnM6e3dpZHRoOnRoaXMuX2lzVmVydGljYWw/bi53aWR0aDpoLGhlaWdodDp0aGlzLl9pc1ZlcnRpY2FsP2g6bi5oZWlnaHR9LGxhYmVsQ29udGFpbmVyT3JpZ2luOnt4OnRoaXMuX2lzVmVydGljYWw/ZS54OmQseTp0aGlzLl9pc1ZlcnRpY2FsP2Q6ZS55fSxsYWJlbE9yaWdpbjp7eDp0aGlzLl9pc1ZlcnRpY2FsP2UueCtuLndpZHRoLzItaS53aWR0aC8yOnAseTp0aGlzLl9pc1ZlcnRpY2FsP3A6ZS55K24uaGVpZ2h0LzItaS5oZWlnaHQvMn0sYWxpZ25tZW50Ont4OnRoaXMuX2lzVmVydGljYWw/ImNlbnRlciI6dSx5OnRoaXMuX2lzVmVydGljYWw/dToiY2VudGVyIn19fSxnLnByb3RvdHlwZS5fY3JlYXRlTGFiZWxDb250YWluZXI9ZnVuY3Rpb24odCxlLG4saSxyLG8pe3ZhciBhPXQuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrZS54KyIsICIrZS55KyIpIik7aWYocil7YS5jbGFzc2VkKCJvbi1iYXItbGFiZWwiLCEwKTt2YXIgcz0xLjYqZC5Db2xvci5jb250cmFzdCgid2hpdGUiLG8pPGQuQ29sb3IuY29udHJhc3QoImJsYWNrIixvKTthLmNsYXNzZWQocz8iZGFyay1sYWJlbCI6ImxpZ2h0LWxhYmVsIiwhMCl9ZWxzZSBhLmNsYXNzZWQoIm9mZi1iYXItbGFiZWwiLCEwKTtyZXR1cm4gYX0sZy5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7dmFyIHQ9W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgZT10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxuPXRoaXMubGVuZ3RoKCkuc2NhbGUuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpLGk9dGhpcy5faXNWZXJ0aWNhbD8iaGVpZ2h0Ijoid2lkdGgiO2VbdGhpcy5faXNWZXJ0aWNhbD8ieSI6IngiXT1mdW5jdGlvbigpe3JldHVybiBufSxlW2ldPWZ1bmN0aW9uKCl7cmV0dXJuIDB9LHQucHVzaCh7YXR0clRvUHJvamVjdG9yOmUsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoZi5BbmltYXRvci5SRVNFVCl9KX1yZXR1cm4gdC5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoZi5BbmltYXRvci5NQUlOKX0pLHR9LGcucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1wLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IuY2FsbCh0aGlzKSxuPXRoaXMubGVuZ3RoKCkuc2NhbGUuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpLGk9dGhpcy5faXNWZXJ0aWNhbD8ieSI6IngiLHI9dGhpcy5faXNWZXJ0aWNhbD8ieCI6InkiLG89bS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnBvc2l0aW9uKCkpLGE9bS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLmxlbmd0aCgpKSxzPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gTWF0aC5hYnMobi1hKHQsZSxpKSl9LGw9ZVtnLl9CQVJfVEhJQ0tORVNTX0tFWV0sYz1lLmdhcCx1PW51bGw9PWM/bDpmdW5jdGlvbih0LGUsbil7dmFyIGk9bCh0LGUsbik7cmV0dXJuIGk8Zy5fQkFSX0dBUExFU1NfVEhSRVNIT0xEX1BYP2k6aS1jKHQsZSxuKX07cmV0dXJuIGUud2lkdGg9dGhpcy5faXNWZXJ0aWNhbD91OnMsZS5oZWlnaHQ9dGhpcy5faXNWZXJ0aWNhbD9zOnUsZVtpXT1mdW5jdGlvbih0LGUsaSl7dmFyIHI9YSh0LGUsaSk7cmV0dXJuIHI+bj9uOnJ9LGVbcl09ZnVuY3Rpb24oZSxuLGkpe3JldHVybiB0Ll9nZXRQb3NpdGlvbkF0dHIobyhlLG4saSksbChlLG4saSkpfSxlfSxnLnByb3RvdHlwZS5fdXBkYXRlVGhpY2tuZXNzQXR0cj1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLnBvc2l0aW9uKCksbj10aGlzLmJhckVuZCgpO251bGwhPWUmJm51bGwhPW4/KHRoaXMuX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M9ITEsdGhpcy5hdHRyKGcuX0JBUl9USElDS05FU1NfS0VZLChmdW5jdGlvbih0LGkscil7dmFyIG89ZS5hY2Nlc3Nvcih0LGksciksYT1uLmFjY2Vzc29yKHQsaSxyKTtyZXR1cm4gbz1lLnNjYWxlP2Uuc2NhbGUuc2NhbGUobyk6byxhPW4uc2NhbGU/bi5zY2FsZS5zY2FsZShhKTphLE1hdGguYWJzKGEtbyl9KSkpOih0aGlzLl9maXhlZEJhclBpeGVsVGhpY2tuZXNzPSEwLHRoaXMuYXR0cihnLl9CQVJfVEhJQ0tORVNTX0tFWSwoZnVuY3Rpb24oKXtyZXR1cm4gdC5fYmFyUGl4ZWxUaGlja25lc3MoKX0pKSl9LGcucHJvdG90eXBlLl9iYXJQaXhlbFRoaWNrbmVzcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9maXhlZEJhclBpeGVsVGhpY2tuZXNzJiZ0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKT90aGlzLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3ModGhpcy5wb3NpdGlvbigpLHRoaXMuZGF0YXNldHMoKSx0aGlzLl9pc1ZlcnRpY2FsP3RoaXMud2lkdGgoKTp0aGlzLmhlaWdodCgpKTowfSxnLnByb3RvdHlwZS5lbnRpdGllcz1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9dGhpcy5kYXRhc2V0cygpKSx0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKT9wLnByb3RvdHlwZS5lbnRpdGllcy5jYWxsKHRoaXMsdCk6W119LGcucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BpeGVsQm91bmRzKHQuZGF0dW0sdC5pbmRleCx0LmRhdGFzZXQpfSxnLnByb3RvdHlwZS5fcGl4ZWxCb3VuZHM9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO3JldHVybnt4OmkueCh0LGUsbikseTppLnkodCxlLG4pLHdpZHRoOmkud2lkdGgodCxlLG4pLGhlaWdodDppLmhlaWdodCh0LGUsbil9fSxnLnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcy5fcGl4ZWxCb3VuZHModCxlLG4pLHI9bS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLl9pc1ZlcnRpY2FsP3RoaXMueSgpOnRoaXMueCgpKSh0LGUsbiksbz0odGhpcy5faXNWZXJ0aWNhbD90aGlzLnkoKS5zY2FsZTp0aGlzLngoKS5zY2FsZSkuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpO3JldHVybiB0aGlzLl9waXhlbFBvaW50QmFyKHIsbyxpKX0sZy5wcm90b3R5cGUuX3BpeGVsUG9pbnRCYXI9ZnVuY3Rpb24odCxlLG4pe3ZhciBpLHI7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/KGk9bi54K24ud2lkdGgvMixyPXQ8PWU/bi55Om4ueStuLmhlaWdodCk6KGk9dD49ZT9uLngrbi53aWR0aDpuLngscj1uLnkrbi5oZWlnaHQvMikse3g6aSx5OnJ9fSxnLnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24odCxlKXtwLnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXkuY2FsbCh0aGlzLHQsZSl9LGcucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPW5ldyBkLk1hcCxuPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGk9dGhpcy53aWR0aCgpLHI9dGhpcy5oZWlnaHQoKTtyZXR1cm4gdGhpcy5kYXRhc2V0cygpLmZvckVhY2goKGZ1bmN0aW9uKG8pe3ZhciBhPW8uZGF0YSgpLm1hcCgoZnVuY3Rpb24oZSxhKXtyZXR1cm4gdC5faXNEYXR1bU9uU2NyZWVuKG4saSxyLGUsYSxvKT9lOm51bGx9KSk7ZS5zZXQobyxhKX0pKSxlfSxnLnByb3RvdHlwZS5faXNEYXR1bU9uU2NyZWVuPWZ1bmN0aW9uKHQsZSxuLGkscixvKXt2YXIgYT10LngoaSxyLG8pLHM9dC55KGkscixvKSxsPXQud2lkdGgoaSxyLG8pLGM9dC5oZWlnaHQoaSxyLG8pO3JldHVybiEhKGQuTWF0aC5pc1ZhbGlkTnVtYmVyKGEpJiZkLk1hdGguaXNWYWxpZE51bWJlcihzKSYmZC5NYXRoLmlzVmFsaWROdW1iZXIobCkmJmQuTWF0aC5pc1ZhbGlkTnVtYmVyKGMpKSYmZC5NYXRoLmJvdW5kc0ludGVyc2VjdHMoYSxzLGwsYywwLDAsZSxuKX0sZy5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztwLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKSx0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuX2xhYmVsQ29uZmlnLmdldChlKS5tZWFzdXJlci5yZXNldCgpfSkpfSxnLl9CQVJfVEhJQ0tORVNTX1JBVElPPS45NSxnLl9CQVJfR0FQTEVTU19USFJFU0hPTERfUFg9MyxnLl9TSU5HTEVfQkFSX0RJTUVOU0lPTl9SQVRJTz0uNCxnLl9CQVJfQVJFQV9DTEFTUz0iYmFyLWFyZWEiLGcuX0JBUl9FTkRfS0VZPSJiYXJFbmQiLGcuX0JBUl9USElDS05FU1NfS0VZPSJ3aWR0aCIsZy5fTEFCRUxfQVJFQV9DTEFTUz0iYmFyLWxhYmVsLXRleHQtYXJlYSIsZy5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVI9MTAsZ30pKGcuWFlQbG90KTtmdW5jdGlvbiB5KHQsZSxpKXt2YXIgcixvPXQuc2NhbGU7aWYobyBpbnN0YW5jZW9mIHUuQ2F0ZWdvcnkpcj1vLnJhbmdlQmFuZCgpO2Vsc2V7dmFyIGE9dC5hY2Nlc3NvcixzPW4uc2V0KGQuQXJyYXkuZmxhdHRlbihlLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZGF0YSgpLm1hcCgoZnVuY3Rpb24oZSxuKXtyZXR1cm4gYShlLG4sdCl9KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dH0pKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnZhbHVlT2YoKX0pKX0pKSkpLnZhbHVlcygpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuK3R9KSk7cy5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiB0LWV9KSk7dmFyIGw9cy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBvLnNjYWxlKHQpfSkpLGM9bi5wYWlycyhsKTtyPWQuTWF0aC5taW4oYywoZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5hYnModFsxXS10WzBdKX0pLGkqXy5fU0lOR0xFX0JBUl9ESU1FTlNJT05fUkFUSU8pLHIqPV8uX0JBUl9USElDS05FU1NfUkFUSU99cmV0dXJuIHJ9dC5CYXI9X30pKFhNdCk7dmFyICRNdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoJE10LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgS010PXVPLFpNdD1aeXQsSk10PUZndCxRTXQ9WE10LHRFdD11d3QsZUV0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPSJ2ZXJ0aWNhbCIpO3ZhciBuPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiBuLl9jbHVzdGVyT2Zmc2V0cz1uZXcgSk10Lk1hcCxufXJldHVybiBLTXQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPXQucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLGk9dGhpcy5fbWFrZUlubmVyU2NhbGUoKSxyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkucmFuZ2VCYW5kKCl9O24ud2lkdGg9dGhpcy5faXNWZXJ0aWNhbD9yOm4ud2lkdGgsbi5oZWlnaHQ9dGhpcy5faXNWZXJ0aWNhbD9uLmhlaWdodDpyO3ZhciBvPW4ueCxhPW4ueTtyZXR1cm4gbi54PXRoaXMuX2lzVmVydGljYWw/ZnVuY3Rpb24odCxuLGkpe3JldHVybiBvKHQsbixpKStlLl9jbHVzdGVyT2Zmc2V0cy5nZXQoaSl9OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbyh0LGUsbil9LG4ueT10aGlzLl9pc1ZlcnRpY2FsP2Z1bmN0aW9uKHQsZSxuKXtyZXR1cm4gYSh0LGUsbil9OmZ1bmN0aW9uKHQsbixpKXtyZXR1cm4gYSh0LG4saSkrZS5fY2x1c3Rlck9mZnNldHMuZ2V0KGkpfSxufSxlLnByb3RvdHlwZS5fdXBkYXRlQ2x1c3RlclBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuX21ha2VJbm5lclNjYWxlKCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goKGZ1bmN0aW9uKG4saSl7cmV0dXJuIHQuX2NsdXN0ZXJPZmZzZXRzLnNldChuLGUuc2NhbGUoU3RyaW5nKGkpKS1lLnJhbmdlQmFuZCgpLzIpfSkpfSxlLnByb3RvdHlwZS5fbWFrZUlubmVyU2NhbGU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgWk10LkNhdGVnb3J5O3QuZG9tYWluKHRoaXMuZGF0YXNldHMoKS5tYXAoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIFN0cmluZyhlKX0pKSk7dmFyIGU9dEV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuYXR0cihRTXQuQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSkpO3JldHVybiB0LnJhbmdlKFswLGUobnVsbCwwLG51bGwpXSksdH0sZS5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXBkYXRlQ2x1c3RlclBvc2l0aW9uKCksdC5wcm90b3R5cGUuX2dldERhdGFUb0RyYXcuY2FsbCh0aGlzKX0sZX0pKFFNdC5CYXIpOyRNdC5DbHVzdGVyZWRCYXI9ZUV0O3ZhciBuRXQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KG5FdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGlFdD11TyxyRXQ9RWR0LG9FdD1JbXQsYUV0PV9tdCxzRXQ9Z3l0LGxFdD1aeXQsY0V0PUZndCx1RXQ9SVN0LGhFdD16U3QsZEV0PVd3dCxwRXQ9a190LGZFdD11d3QsbUV0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBlLl9zdGFydEFuZ2xlPTAsZS5fZW5kQW5nbGU9MipNYXRoLlBJLGUuX2xhYmVsRm9ybWF0dGVyPXNFdC5pZGVudGl0eSgpLGUuX2xhYmVsc0VuYWJsZWQ9ITEsZS5pbm5lclJhZGl1cygwKSxlLm91dGVyUmFkaXVzKChmdW5jdGlvbigpe3ZhciB0PWUuX3BpZUNlbnRlcigpO3JldHVybiBNYXRoLm1pbihNYXRoLm1heChlLndpZHRoKCktdC54LHQueCksTWF0aC5tYXgoZS5oZWlnaHQoKS10LnksdC55KSl9KSksZS5hZGRDbGFzcygicGllLXBsb3QiKSxlLmF0dHIoImZpbGwiLChmdW5jdGlvbih0LGUpe3JldHVybiBTdHJpbmcoZSl9KSxuZXcgbEV0LkNvbG9yKSxlLl9zdHJva2VEcmF3ZXJzPW5ldyBjRXQuTWFwLGV9cmV0dXJuIGlFdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3QucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpLHRoaXMuX3N0cm9rZURyYXdlcnMuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuYXR0YWNoVG8oZS5fcmVuZGVyQXJlYSl9KSl9LGUucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oZSxuLGkpe3QucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLGUsbixpKTt2YXIgcj10aGlzLl9waWVDZW50ZXIoKTt0aGlzLl9yZW5kZXJBcmVhLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK3IueCsiLCIrci55KyIpIik7dmFyIG89TWF0aC5taW4oTWF0aC5tYXgodGhpcy53aWR0aCgpLXIueCxyLngpLE1hdGgubWF4KHRoaXMuaGVpZ2h0KCktci55LHIueSkpO3JldHVybiBudWxsIT10aGlzLmlubmVyUmFkaXVzKCkuc2NhbGUmJnRoaXMuaW5uZXJSYWRpdXMoKS5zY2FsZS5yYW5nZShbMCxvXSksbnVsbCE9dGhpcy5vdXRlclJhZGl1cygpLnNjYWxlJiZ0aGlzLm91dGVyUmFkaXVzKCkuc2NhbGUucmFuZ2UoWzAsb10pLHRoaXN9LGUucHJvdG90eXBlLmFkZERhdGFzZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQucHJvdG90eXBlLmFkZERhdGFzZXQuY2FsbCh0aGlzLGUpLHRoaXN9LGUucHJvdG90eXBlLl9hZGREYXRhc2V0PWZ1bmN0aW9uKGUpe2lmKDE9PT10aGlzLmRhdGFzZXRzKCkubGVuZ3RoKXJldHVybiBjRXQuV2luZG93Lndhcm4oIk9ubHkgb25lIGRhdGFzZXQgaXMgc3VwcG9ydGVkIGluIFBpZSBwbG90cyIpLHRoaXM7dGhpcy5fdXBkYXRlUGllQW5nbGVzKCksdC5wcm90b3R5cGUuX2FkZERhdGFzZXQuY2FsbCh0aGlzLGUpO3ZhciBuPW5ldyBoRXQuQXJjT3V0bGluZVNWR0RyYXdlcjtyZXR1cm4gdGhpcy5faXNTZXR1cCYmbi5hdHRhY2hUbyh0aGlzLl9yZW5kZXJBcmVhKSx0aGlzLl9zdHJva2VEcmF3ZXJzLnNldChlLG4pLHRoaXN9LGUucHJvdG90eXBlLnJlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQucHJvdG90eXBlLnJlbW92ZURhdGFzZXQuY2FsbCh0aGlzLGUpLHRoaXN9LGUucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXM9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcy5jYWxsKHRoaXMsZSksdGhpcy5fc3Ryb2tlRHJhd2Vycy5nZXQoZSkucmVtb3ZlKCl9LGUucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKGUpe3JldHVybiB0LnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldC5jYWxsKHRoaXMsZSksdGhpcy5fc3Ryb2tlRHJhd2Vycy5kZWxldGUoZSksdGhpcy5fc3RhcnRBbmdsZXM9W10sdGhpcy5fZW5kQW5nbGVzPVtdLHRoaXN9LGUucHJvdG90eXBlLnNlbGVjdGlvbnM9ZnVuY3Rpb24oZSl7dmFyIG49dGhpczt2b2lkIDA9PT1lJiYoZT10aGlzLmRhdGFzZXRzKCkpO3ZhciBpPXQucHJvdG90eXBlLnNlbGVjdGlvbnMuY2FsbCh0aGlzLGUpLm5vZGVzKCk7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9bi5fc3Ryb2tlRHJhd2Vycy5nZXQodCk7bnVsbCE9ZSYmaS5wdXNoLmFwcGx5KGksZS5nZXRWaXN1YWxQcmltaXRpdmVzKCkpfSkpLHJFdC5zZWxlY3RBbGwoaSl9LGUucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlLmNhbGwodGhpcyksdGhpcy5fdXBkYXRlUGllQW5nbGVzKCksdGhpcy5yZW5kZXIoKX0sZS5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbigpe3JldHVybiBuZXcgZEV0LlByb3h5RHJhd2VyKChmdW5jdGlvbigpe3JldHVybiBuZXcgdUV0LkFyY1NWR0RyYXdlcn0pLChmdW5jdGlvbigpe3JldHVybiBwRXQud2FybigiY2FudmFzIHJlbmRlcmVyIGlzIG5vdCBzdXBwb3J0ZWQgb24gUGllIFBsb3QhIiksbnVsbH0pKX0sZS5wcm90b3R5cGUuZW50aXRpZXM9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztyZXR1cm4gdm9pZCAwPT09ZSYmKGU9dGhpcy5kYXRhc2V0cygpKSx0LnByb3RvdHlwZS5lbnRpdGllcy5jYWxsKHRoaXMsZSkubWFwKChmdW5jdGlvbih0KXt0LnBvc2l0aW9uLngrPW4ud2lkdGgoKS8yLHQucG9zaXRpb24ueSs9bi5oZWlnaHQoKS8yO3ZhciBlPXJFdC5zZWxlY3Qobi5fc3Ryb2tlRHJhd2Vycy5nZXQodC5kYXRhc2V0KS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4KHQuaW5kZXgpKSxpPXQ7cmV0dXJuIGkuc3Ryb2tlU2VsZWN0aW9uPWUsaX0pKX0sZS5wcm90b3R5cGUuc2VjdG9yVmFsdWU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbnVsbD09dD90aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChlLl9TRUNUT1JfVkFMVUVfS0VZKToodGhpcy5fYmluZFByb3BlcnR5KGUuX1NFQ1RPUl9WQUxVRV9LRVksdCxuKSx0aGlzLl91cGRhdGVQaWVBbmdsZXMoKSx0aGlzLnJlbmRlcigpLHRoaXMpfSxlLnByb3RvdHlwZS5pbm5lclJhZGl1cz1mdW5jdGlvbih0LG4pe3JldHVybiBudWxsPT10P3RoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KGUuX0lOTkVSX1JBRElVU19LRVkpOih0aGlzLl9iaW5kUHJvcGVydHkoZS5fSU5ORVJfUkFESVVTX0tFWSx0LG4pLHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLm91dGVyUmFkaXVzPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG51bGw9PXQ/dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoZS5fT1VURVJfUkFESVVTX0tFWSk6KHRoaXMuX2JpbmRQcm9wZXJ0eShlLl9PVVRFUl9SQURJVVNfS0VZLHQsbiksdGhpcy5yZW5kZXIoKSx0aGlzKX0sZS5wcm90b3R5cGUuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9zdGFydEFuZ2xlOih0aGlzLl9zdGFydEFuZ2xlPXQsdGhpcy5fdXBkYXRlUGllQW5nbGVzKCksdGhpcy5yZW5kZXIoKSx0aGlzKX0sZS5wcm90b3R5cGUuZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZW5kQW5nbGU6KHRoaXMuX2VuZEFuZ2xlPXQsdGhpcy5fdXBkYXRlUGllQW5nbGVzKCksdGhpcy5yZW5kZXIoKSx0aGlzKX0sZS5wcm90b3R5cGUubGFiZWxzRW5hYmxlZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9sYWJlbHNFbmFibGVkOih0aGlzLl9sYWJlbHNFbmFibGVkPXQsdGhpcy5yZW5kZXIoKSx0aGlzKX0sZS5wcm90b3R5cGUubGFiZWxGb3JtYXR0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fbGFiZWxGb3JtYXR0ZXI6KHRoaXMuX2xhYmVsRm9ybWF0dGVyPXQsdGhpcy5yZW5kZXIoKSx0aGlzKX0sZS5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLndpZHRoKCkvMixuPXRoaXMuaGVpZ2h0KCkvMixpPXRoaXMuX3NsaWNlSW5kZXhGb3JQb2ludCh7eDp0LngtZSx5OnQueS1ufSk7cmV0dXJuIG51bGw9PWk/W106W3RoaXMuZW50aXRpZXMoKVtpXV19LGUucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49dC5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpLGk9ZkV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuaW5uZXJSYWRpdXMoKSkscj1mRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5vdXRlclJhZGl1cygpKTtyZXR1cm4gbi5kPWZ1bmN0aW9uKHQsbixvKXtyZXR1cm4gckV0LmFyYygpLmlubmVyUmFkaXVzKGkodCxuLG8pKS5vdXRlclJhZGl1cyhyKHQsbixvKSkuc3RhcnRBbmdsZShlLl9zdGFydEFuZ2xlc1tuXSkuZW5kQW5nbGUoZS5fZW5kQW5nbGVzW25dKSh0LG4pfSxufSxlLnByb3RvdHlwZS5fdXBkYXRlUGllQW5nbGVzPWZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5zZWN0b3JWYWx1ZSgpJiYwIT09dGhpcy5kYXRhc2V0cygpLmxlbmd0aCl7dmFyIHQ9ZkV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2VjdG9yVmFsdWUoKSksZT10aGlzLmRhdGFzZXRzKClbMF0sbj10aGlzLl9nZXREYXRhVG9EcmF3KCkuZ2V0KGUpLGk9ckV0LnBpZSgpLnNvcnQobnVsbCkuc3RhcnRBbmdsZSh0aGlzLl9zdGFydEFuZ2xlKS5lbmRBbmdsZSh0aGlzLl9lbmRBbmdsZSkudmFsdWUoKGZ1bmN0aW9uKG4saSl7cmV0dXJuIHQobixpLGUpfSkpKG4pO3RoaXMuX3N0YXJ0QW5nbGVzPWkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5zdGFydEFuZ2xlfSkpLHRoaXMuX2VuZEFuZ2xlcz1pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZW5kQW5nbGV9KSl9fSxlLnByb3RvdHlwZS5fcGllQ2VudGVyPWZ1bmN0aW9uKCl7dmFyIHQsZSxuLGkscj10aGlzLl9zdGFydEFuZ2xlPHRoaXMuX2VuZEFuZ2xlP3RoaXMuX3N0YXJ0QW5nbGU6dGhpcy5fZW5kQW5nbGUsbz10aGlzLl9zdGFydEFuZ2xlPHRoaXMuX2VuZEFuZ2xlP3RoaXMuX2VuZEFuZ2xlOnRoaXMuX3N0YXJ0QW5nbGUsYT1NYXRoLnNpbihyKSxzPU1hdGguY29zKHIpLGw9TWF0aC5zaW4obyksYz1NYXRoLmNvcyhvKTtyZXR1cm4gYT49MCYmbD49MD9zPj0wJiZjPj0wPyh0PXMsZT0wLGk9MCxuPWwpOnM8MCYmYzwwPyh0PTAsZT0tYyxpPTAsbj1hKTpzPj0wJiZjPDA/KHQ9cyxlPS1jLGk9MCxuPWEpOnM8MCYmYz49MCYmKHQ9MSxlPTEsaT0xLG49TWF0aC5tYXgoYSxsKSk6YT49MCYmbDwwP3M+PTAmJmM+PTA/KHQ9TWF0aC5tYXgocyxjKSxlPTEsaT0xLG49MSk6czwwJiZjPDA/KHQ9MCxlPTEsaT0tbCxuPWEpOnM+PTAmJmM8MD8odD1zLGU9MSxpPS1sLG49MSk6czwwJiZjPj0wJiYodD1jLGU9MSxpPTEsbj1hKTphPDAmJmw+PTA/cz49MCYmYz49MD8odD0xLGU9MCxpPS1hLG49bCk6czwwJiZjPDA/KHQ9MSxlPU1hdGgubWF4KC1zLC1jKSxpPTEsbj0xKTpzPj0wJiZjPDA/KHQ9MSxlPS1jLGk9LWEsbj0xKTpzPDAmJmM+PTAmJih0PTEsZT0tcyxpPTEsbj1sKTphPDAmJmw8MCYmKHM+PTAmJmM+PTA/KHQ9YyxlPTAsaT0tYSxuPTApOnM8MCYmYzwwPyh0PTAsZT0tcyxpPS1sLG49MCk6cz49MCYmYzwwPyh0PTEsZT0xLGk9TWF0aC5tYXgocywtYyksbj0xKTpzPDAmJmM+PTAmJih0PWMsZT0tcyxpPTEsbj0wKSkse3g6aStuPT0wPzA6aS8oaStuKSp0aGlzLndpZHRoKCkseTp0K2U9PTA/MDp0Lyh0K2UpKnRoaXMuaGVpZ2h0KCl9fSxlLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBuPXQucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3LmNhbGwodGhpcyk7aWYoMD09PXRoaXMuZGF0YXNldHMoKS5sZW5ndGgpcmV0dXJuIG47dmFyIGk9ZkV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2VjdG9yVmFsdWUoKSkscj10aGlzLmRhdGFzZXRzKClbMF0sbz1uLmdldChyKS5maWx0ZXIoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuX2lzVmFsaWREYXRhKGkodCxuLHIpKX0pKTtyZXR1cm4gbi5zZXQocixvKSxufSxlLl9pc1ZhbGlkRGF0YT1mdW5jdGlvbih0KXtyZXR1cm4gY0V0Lk1hdGguaXNWYWxpZE51bWJlcih0KSYmdD49MH0sZS5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24odCxuLGkpe3ZhciByPWZFdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnNlY3RvclZhbHVlKCkpO2lmKCFlLl9pc1ZhbGlkRGF0YShyKHQsbixpKSkpcmV0dXJue3g6TmFOLHk6TmFOfTt2YXIgbz0oZkV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuaW5uZXJSYWRpdXMoKSkodCxuLGkpK2ZFdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLm91dGVyUmFkaXVzKCkpKHQsbixpKSkvMixhPXJFdC5waWUoKS5zb3J0KG51bGwpLnZhbHVlKChmdW5jdGlvbih0LG4pe3ZhciBvPXIodCxuLGkpO3JldHVybiBlLl9pc1ZhbGlkRGF0YShvKT9vOjB9KSkuc3RhcnRBbmdsZSh0aGlzLl9zdGFydEFuZ2xlKS5lbmRBbmdsZSh0aGlzLl9lbmRBbmdsZSkoaS5kYXRhKCkpLHM9KGFbbl0uc3RhcnRBbmdsZSthW25dLmVuZEFuZ2xlKS8yO3JldHVybnt4Om8qTWF0aC5zaW4ocykseTotbypNYXRoLmNvcyhzKX19LGUucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLl9yZW5kZXJBcmVhLnNlbGVjdCgiLmxhYmVsLWFyZWEiKS5yZW1vdmUoKSx0aGlzLl9sYWJlbHNFbmFibGVkJiZjRXQuV2luZG93LnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cmV0dXJuIGUuX2RyYXdMYWJlbHMoKX0pLHQpO3ZhciBuPXRoaXMuX2dlbmVyYXRlU3Ryb2tlRHJhd1N0ZXBzKCksaT10aGlzLl9nZXREYXRhVG9EcmF3KCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciByPWZFdC5QbG90LmFwcGx5RHJhd1N0ZXBzKG4sdCk7ZS5fc3Ryb2tlRHJhd2Vycy5nZXQodCkuZHJhdyhpLmdldCh0KSxyKX0pKX0sZS5wcm90b3R5cGUuX2dlbmVyYXRlU3Ryb2tlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7cmV0dXJuW3thdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6bmV3IGFFdC5OdWxsfV19LGUucHJvdG90eXBlLl9zbGljZUluZGV4Rm9yUG9pbnQ9ZnVuY3Rpb24odCl7dmFyIGUsbj1NYXRoLnNxcnQoTWF0aC5wb3codC54LDIpK01hdGgucG93KHQueSwyKSksaT1NYXRoLmFjb3MoLXQueS9uKTt0Lng8MCYmKGk9MipNYXRoLlBJLWkpO2Zvcih2YXIgcj0wO3I8dGhpcy5fc3RhcnRBbmdsZXMubGVuZ3RoO3IrKylpZih0aGlzLl9zdGFydEFuZ2xlc1tyXTxpJiZ0aGlzLl9lbmRBbmdsZXNbcl0+aSl7ZT1yO2JyZWFrfWlmKHZvaWQgMCE9PWUpe3ZhciBvPXRoaXMuZGF0YXNldHMoKVswXSxhPW8uZGF0YSgpW2VdLHM9dGhpcy5pbm5lclJhZGl1cygpLmFjY2Vzc29yKGEsZSxvKSxsPXRoaXMub3V0ZXJSYWRpdXMoKS5hY2Nlc3NvcihhLGUsbyk7aWYobj5zJiZuPGwpcmV0dXJuIGV9cmV0dXJuIG51bGx9LGUucHJvdG90eXBlLl9kcmF3TGFiZWxzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMsZT10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxuPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZCgibGFiZWwtYXJlYSIsITApLGk9bmV3IG9FdC5TdmdDb250ZXh0KG4ubm9kZSgpKSxyPW5ldyBvRXQuQ2FjaGVNZWFzdXJlcihpKSxvPW5ldyBvRXQuV3JpdGVyKHIsaSksYT10aGlzLmRhdGFzZXRzKClbMF0scz10aGlzLl9nZXREYXRhVG9EcmF3KCkuZ2V0KGEpLGw9cy5sZW5ndGgsYz1mdW5jdGlvbihpKXt2YXIgbD1zW2ldLGM9dS5zZWN0b3JWYWx1ZSgpLmFjY2Vzc29yKGwsaSxhKTtpZighY0V0Lk1hdGguaXNWYWxpZE51bWJlcihjKSlyZXR1cm4iY29udGludWUiO2M9dS5fbGFiZWxGb3JtYXR0ZXIoYyxsLGksYSk7dmFyIGg9ci5tZWFzdXJlKGMpLGQ9KHUuX2VuZEFuZ2xlc1tpXSt1Ll9zdGFydEFuZ2xlc1tpXSkvMixwPXUub3V0ZXJSYWRpdXMoKS5hY2Nlc3NvcihsLGksYSk7dS5vdXRlclJhZGl1cygpLnNjYWxlJiYocD11Lm91dGVyUmFkaXVzKCkuc2NhbGUuc2NhbGUocCkpO3ZhciBmPXUuaW5uZXJSYWRpdXMoKS5hY2Nlc3NvcihsLGksYSk7dS5pbm5lclJhZGl1cygpLnNjYWxlJiYoZj11LmlubmVyUmFkaXVzKCkuc2NhbGUuc2NhbGUoZikpO3ZhciBtPShwK2YpLzIsZz1NYXRoLnNpbihkKSptLWgud2lkdGgvMixfPS1NYXRoLmNvcyhkKSptLWguaGVpZ2h0LzIseT1be3g6Zyx5Ol99LHt4OmcseTpfK2guaGVpZ2h0fSx7eDpnK2gud2lkdGgseTpffSx7eDpnK2gud2lkdGgseTpfK2guaGVpZ2h0fV0sdj15LmV2ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5hYnMoZS54KTw9dC53aWR0aCgpLzImJk1hdGguYWJzKGUueSk8PXQuaGVpZ2h0KCkvMn0pKTt2JiYodj15Lm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuX3NsaWNlSW5kZXhGb3JQb2ludChlKX0pKS5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1pfSkpKTt2YXIgYj1lLmZpbGwobCxpLGEpLHg9MS42KmNFdC5Db2xvci5jb250cmFzdCgid2hpdGUiLGIpPGNFdC5Db2xvci5jb250cmFzdCgiYmxhY2siLGIpLHc9bi5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitnKyIsIitfKyIpIik7dy5jbGFzc2VkKHg/ImRhcmstbGFiZWwiOiJsaWdodC1sYWJlbCIsITApLHcuc3R5bGUoInZpc2liaWxpdHkiLHY/ImluaGVyaXQiOiJoaWRkZW4iKSxvLndyaXRlKGMsaC53aWR0aCxoLmhlaWdodCx7eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIn0sdy5ub2RlKCkpfSx1PXRoaXMsaD0wO2g8bDtoKyspYyhoKX0sZS5fSU5ORVJfUkFESVVTX0tFWT0iaW5uZXItcmFkaXVzIixlLl9PVVRFUl9SQURJVVNfS0VZPSJvdXRlci1yYWRpdXMiLGUuX1NFQ1RPUl9WQUxVRV9LRVk9InNlY3Rvci12YWx1ZSIsZX0pKGZFdC5QbG90KTtuRXQuUGllPW1FdDt2YXIgZ0V0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShnRXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBfRXQ9dU8seUV0PUVkdCx2RXQ9SW10LGJFdD1fbXQseEV0PU5TdCx3RXQ9V3d0LFNFdD1KU3QsTUV0PVp5dCxFRXQ9Rmd0LFRFdD11d3QsQ0V0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBlLl9sYWJlbHNFbmFibGVkPSExLGUuX2xhYmVsPW51bGwsZS5hbmltYXRvcigicmVjdGFuZ2xlcyIsbmV3IGJFdC5OdWxsKSxlLmFkZENsYXNzKCJyZWN0YW5nbGUtcGxvdCIpLGUuYXR0cigiZmlsbCIsKG5ldyBNRXQuQ29sb3IpLnJhbmdlKClbMF0pLGV9cmV0dXJuIF9FdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB3RXQuUHJveHlEcmF3ZXIoKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBTRXQuUmVjdGFuZ2xlU1ZHRHJhd2VyfSksKGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgeEV0LlJlY3RhbmdsZUNhbnZhc0RyYXdlcih0KX0pKX0sZS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIG49dGhpcyxpPXQucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLHI9VEV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxvPWlbZS5fWDJfS0VZXSxhPVRFdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkscz1pW2UuX1kyX0tFWV0sbD10aGlzLngoKS5zY2FsZSxjPXRoaXMueSgpLnNjYWxlO3JldHVybiBudWxsIT1vPyhpLndpZHRoPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTWF0aC5hYnMobyh0LGUsbiktcih0LGUsbikpfSxpLng9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBNYXRoLm1pbihvKHQsZSxuKSxyKHQsZSxuKSl9KTooaS53aWR0aD1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIG4uX3JlY3RhbmdsZVdpZHRoKGwpfSxpLng9ZnVuY3Rpb24odCxlLG4pe3JldHVybiByKHQsZSxuKS0uNSppLndpZHRoKHQsZSxuKX0pLG51bGwhPXM/KGkuaGVpZ2h0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTWF0aC5hYnMocyh0LGUsbiktYSh0LGUsbikpfSxpLnk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBNYXRoLm1heChzKHQsZSxuKSxhKHQsZSxuKSktaS5oZWlnaHQodCxlLG4pfSk6KGkuaGVpZ2h0PWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbi5fcmVjdGFuZ2xlV2lkdGgoYyl9LGkueT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGEodCxlLG4pLS41KmkuaGVpZ2h0KHQsZSxuKX0pLGRlbGV0ZSBpW2UuX1gyX0tFWV0sZGVsZXRlIGlbZS5fWTJfS0VZXSxpfSxlLnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXtyZXR1cm5be2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcigicmVjdGFuZ2xlcyIpfV19LGUucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eT1mdW5jdGlvbihlKXtyZXR1cm4gdC5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywieDIiPT09ZT8ieCI6InkyIj09PWU/InkiOmUpfSxlLnByb3RvdHlwZS54PWZ1bmN0aW9uKG4saSxyKXtpZihudWxsPT1uKXJldHVybiB0LnByb3RvdHlwZS54LmNhbGwodGhpcyk7aWYobnVsbD09aT90LnByb3RvdHlwZS54LmNhbGwodGhpcyxuKTp0LnByb3RvdHlwZS54LmNhbGwodGhpcyxuLGksciksbnVsbCE9aSl7dmFyIG89dGhpcy54MigpLGE9byYmby5hY2Nlc3NvcjtudWxsIT1hJiZ0aGlzLl9iaW5kUHJvcGVydHkoZS5fWDJfS0VZLGEsaSxvLnBvc3RTY2FsZSl9cmV0dXJuIGkgaW5zdGFuY2VvZiBNRXQuQ2F0ZWdvcnkmJmkuaW5uZXJQYWRkaW5nKDApLm91dGVyUGFkZGluZygwKSx0aGlzfSxlLnByb3RvdHlwZS54Mj1mdW5jdGlvbih0LG4pe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KGUuX1gyX0tFWSk7dmFyIGk9dGhpcy54KCk7cmV0dXJuIHRoaXMuX2JpbmRQcm9wZXJ0eShlLl9YMl9LRVksdCxpJiZpLnNjYWxlLG4pLHRoaXMucmVuZGVyKCksdGhpc30sZS5wcm90b3R5cGUueT1mdW5jdGlvbihuLGkscil7aWYobnVsbD09bilyZXR1cm4gdC5wcm90b3R5cGUueS5jYWxsKHRoaXMpO2lmKG51bGw9PWk/dC5wcm90b3R5cGUueS5jYWxsKHRoaXMsbik6dC5wcm90b3R5cGUueS5jYWxsKHRoaXMsbixpLHIpLG51bGwhPWkpe3ZhciBvPXRoaXMueTIoKSxhPW8mJm8uYWNjZXNzb3I7bnVsbCE9YSYmdGhpcy5fYmluZFByb3BlcnR5KGUuX1kyX0tFWSxhLGksby5wb3N0U2NhbGUpfXJldHVybiBpIGluc3RhbmNlb2YgTUV0LkNhdGVnb3J5JiZpLmlubmVyUGFkZGluZygwKS5vdXRlclBhZGRpbmcoMCksdGhpc30sZS5wcm90b3R5cGUueTI9ZnVuY3Rpb24odCxuKXtpZihudWxsPT10KXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChlLl9ZMl9LRVkpO3ZhciBpPXRoaXMueSgpO3JldHVybiB0aGlzLl9iaW5kUHJvcGVydHkoZS5fWTJfS0VZLHQsaSYmaS5zY2FsZSxuKSx0aGlzLnJlbmRlcigpLHRoaXN9LGUucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7cmV0dXJuIHRoaXMuZW50aXRpZXMoKS5maWx0ZXIoKGZ1bmN0aW9uKG4pe3ZhciBpPW4uZGF0dW0scj1uLmluZGV4LG89bi5kYXRhc2V0LGE9ZS54KGkscixvKSxzPWUueShpLHIsbyksbD1lLndpZHRoKGkscixvKSxjPWUuaGVpZ2h0KGkscixvKTtyZXR1cm4gYTw9dC54JiZ0Lng8PWErbCYmczw9dC55JiZ0Lnk8PXMrY30pKX0sZS5wcm90b3R5cGUuX2VudGl0eUJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZW50aXR5QkJveCh0LmRhdHVtLHQuaW5kZXgsdC5kYXRhc2V0LHRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpKX0sZS5wcm90b3R5cGUuX2VudGl0eUJCb3g9ZnVuY3Rpb24odCxlLG4saSl7cmV0dXJue3g6aS54KHQsZSxuKSx5OmkueSh0LGUsbiksd2lkdGg6aS53aWR0aCh0LGUsbiksaGVpZ2h0OmkuaGVpZ2h0KHQsZSxuKX19LGUucHJvdG90eXBlLmxhYmVsPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2xhYmVsOih0aGlzLl9sYWJlbD10LHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fbGFiZWxzRW5hYmxlZDoodGhpcy5fbGFiZWxzRW5hYmxlZD10LHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyk7cmV0dXJuIG51bGwhPXRoaXMueDIoKSYmKGUueDI9VEV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueDIoKSkpLG51bGwhPXRoaXMueTIoKSYmKGUueTI9VEV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTIoKSkpLGV9LGUucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxyPWkueCh0LGUsbiksbz1pLnkodCxlLG4pO3JldHVybnt4OnIraS53aWR0aCh0LGUsbikvMix5Om8raS5oZWlnaHQodCxlLG4pLzJ9fSxlLnByb3RvdHlwZS5fcmVjdGFuZ2xlV2lkdGg9ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIE1FdC5DYXRlZ29yeSlyZXR1cm4gdC5yYW5nZUJhbmQoKTt2YXIgZT10PT09dGhpcy54KCkuc2NhbGU/dGhpcy54KCkuYWNjZXNzb3I6dGhpcy55KCkuYWNjZXNzb3Isbj15RXQuc2V0KEVFdC5BcnJheS5mbGF0dGVuKHRoaXMuZGF0YXNldHMoKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmRhdGEoKS5tYXAoKGZ1bmN0aW9uKG4saSl7cmV0dXJuIGUobixpLHQpLnZhbHVlT2YoKX0pKX0pKSkpLnZhbHVlcygpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuK3R9KSksaT1FRXQuTWF0aC5taW4obiwwKSxyPUVFdC5NYXRoLm1heChuLDApLG89dC5zY2FsZShpKTtyZXR1cm4odC5zY2FsZShyKS1vKS9NYXRoLmFicyhyLWkpfSxlLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciB0PW5ldyBFRXQuTWFwLGU9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7cmV0dXJuIHRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKChmdW5jdGlvbihuKXt2YXIgaT1uLmRhdGEoKS5tYXAoKGZ1bmN0aW9uKHQsaSl7cmV0dXJuIEVFdC5NYXRoLmlzVmFsaWROdW1iZXIoZS54KHQsaSxuKSkmJkVFdC5NYXRoLmlzVmFsaWROdW1iZXIoZS55KHQsaSxuKSkmJkVFdC5NYXRoLmlzVmFsaWROdW1iZXIoZS53aWR0aCh0LGksbikpJiZFRXQuTWF0aC5pc1ZhbGlkTnVtYmVyKGUuaGVpZ2h0KHQsaSxuKSk/dDpudWxsfSkpO3Quc2V0KG4saSl9KSksdH0sZS5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuX3JlbmRlckFyZWEuc2VsZWN0QWxsKCIubGFiZWwtYXJlYSIpLnJlbW92ZSgpLHRoaXMuX2xhYmVsc0VuYWJsZWQmJm51bGwhPXRoaXMubGFiZWwoKSYmRUV0LldpbmRvdy5zZXRUaW1lb3V0KChmdW5jdGlvbigpe3JldHVybiBlLl9kcmF3TGFiZWxzKCl9KSx0KX0sZS5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5fZ2V0RGF0YVRvRHJhdygpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKChmdW5jdGlvbihuLGkpe3JldHVybiB0Ll9kcmF3TGFiZWwoZSxuLGkpfSkpfSxlLnByb3RvdHlwZS5fZHJhd0xhYmVsPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGk9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCkscj10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgiZyIpLmNsYXNzZWQoImxhYmVsLWFyZWEiLCEwKSxvPW5ldyB2RXQuU3ZnQ29udGV4dChyLm5vZGUoKSksYT1uZXcgdkV0LkNhY2hlTWVhc3VyZXIobykscz1uZXcgdkV0LldyaXRlcihhLG8pLGw9dGhpcy54KCkuc2NhbGUucmFuZ2UoKSxjPXRoaXMueSgpLnNjYWxlLnJhbmdlKCksdT1NYXRoLm1pbi5hcHBseShudWxsLGwpLGg9TWF0aC5tYXguYXBwbHkobnVsbCxsKSxkPU1hdGgubWluLmFwcGx5KG51bGwsYykscD1NYXRoLm1heC5hcHBseShudWxsLGMpLGY9dC5nZXQoZSksbT1mLmxlbmd0aCxnPTA7ZzxtO2crKyl7dmFyIF89ZltnXTtpZihudWxsIT1fKXt2YXIgeT0iIit0aGlzLmxhYmVsKCkoXyxnLGUpLHY9YS5tZWFzdXJlKHkpLGI9aS54KF8sZyxlKSx4PWkueShfLGcsZSksdz1pLndpZHRoKF8sZyxlKSxTPWkuaGVpZ2h0KF8sZyxlKTtpZih2LmhlaWdodDw9UyYmdi53aWR0aDw9dyl7dmFyIE09e21pbjpiKz0ody12LndpZHRoKS8yLG1heDpiK3Yud2lkdGh9LEU9e21pbjp4Kz0oUy12LmhlaWdodCkvMixtYXg6eCt2LmhlaWdodH07aWYoTS5taW48dXx8TS5tYXg+aHx8RS5taW48ZHx8RS5tYXg+cCljb250aW51ZTtpZih0aGlzLl9vdmVybGF5TGFiZWwoTSxFLGcsbix0KSljb250aW51ZTt2YXIgVD1pLmZpbGwoXyxnLGUpLEM9MS42KkVFdC5Db2xvci5jb250cmFzdCgid2hpdGUiLFQpPEVFdC5Db2xvci5jb250cmFzdCgiYmxhY2siLFQpLEE9ci5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitiKyIsIit4KyIpIik7QS5jbGFzc2VkKEM/ImRhcmstbGFiZWwiOiJsaWdodC1sYWJlbCIsITApLHMud3JpdGUoeSx2LndpZHRoLHYuaGVpZ2h0LHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIifSxBLm5vZGUoKSl9fX19LGUucHJvdG90eXBlLl9vdmVybGF5TGFiZWw9ZnVuY3Rpb24odCxlLG4saSxyKXtmb3IodmFyIG89dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYT10aGlzLmRhdGFzZXRzKCkscz1pO3M8YS5sZW5ndGg7cysrKWZvcih2YXIgbD1hW3NdLGM9ci5nZXQobCksdT1jLmxlbmd0aCxoPXM9PT1pP24rMTowO2g8dTtoKyspaWYoRUV0LkRPTS5pbnRlcnNlY3RzQkJveCh0LGUsdGhpcy5fZW50aXR5QkJveChjW2hdLGgsbCxvKSkpcmV0dXJuITA7cmV0dXJuITF9LGUuX1gyX0tFWT0ieDIiLGUuX1kyX0tFWT0ieTIiLGV9KShnTXQuWFlQbG90KTtnRXQuUmVjdGFuZ2xlPUNFdDt2YXIgQUV0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShBRXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBrRXQ9dU8sTEV0PUltdCxQRXQ9Z3l0LE5FdD1VeHQsSUV0PVd3dCxSRXQ9bk10LE9FdD1fbXQsekV0PU5TdCxERXQ9Wnl0LEJFdD1GZ3QsSEV0PXBNdCxGRXQ9dXd0LFZFdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztlLl9sYWJlbEZvcm1hdHRlcj1QRXQuaWRlbnRpdHkoKSxlLl9sYWJlbHNFbmFibGVkPSExLGUuYWRkQ2xhc3MoInNjYXR0ZXItcGxvdCIpO3ZhciBuPW5ldyBPRXQuRWFzaW5nO24uc3RhcnREZWxheSg1KSxuLnN0ZXBEdXJhdGlvbigyNTApLG4ubWF4VG90YWxEdXJhdGlvbihGRXQuUGxvdC5fQU5JTUFUSU9OX01BWF9EVVJBVElPTiksZS5hbmltYXRvcihIRXQuQW5pbWF0b3IuTUFJTixuKSxlLmF0dHIoIm9wYWNpdHkiLC42KSxlLmF0dHIoImZpbGwiLChuZXcgREV0LkNvbG9yKS5yYW5nZSgpWzBdKSxlLnNpemUoNik7dmFyIGk9TkV0LmNpcmNsZSgpO3JldHVybiBlLnN5bWJvbCgoZnVuY3Rpb24oKXtyZXR1cm4gaX0pKSxlLl9sYWJlbENvbmZpZz1uZXcgQkV0Lk1hcCxlfXJldHVybiBrRXQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXM9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztyZXR1cm4gdC5wcm90b3R5cGUuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXMuY2FsbCh0aGlzLGUpLm1hcCgoZnVuY3Rpb24odCl7dmFyIGU9RkV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKG4uc2l6ZSgpKSh0LmRhdHVtLHQuaW5kZXgsdC5kYXRhc2V0KTtyZXR1cm4gdC5kaWFtZXRlcj1lLHR9KSl9LGUucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4gbmV3IElFdC5Qcm94eURyYXdlcigoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFJFdC5TeW1ib2xTVkdEcmF3ZXJ9KSwoZnVuY3Rpb24obil7cmV0dXJuIG5ldyB6RXQuQ2FudmFzRHJhd2VyKG4sUkV0Lm1ha2VTeW1ib2xDYW52YXNEcmF3U3RlcCh0LChmdW5jdGlvbigpe3JldHVybiBGRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IoZS5zeW1ib2woKSl9KSwoZnVuY3Rpb24oKXtyZXR1cm4gRkV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKGUuc2l6ZSgpKX0pKSl9KSl9LGUucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbnVsbD09dD90aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChlLl9TSVpFX0tFWSk6KHRoaXMuX2JpbmRQcm9wZXJ0eShlLl9TSVpFX0tFWSx0LG4pLHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLnN5bWJvbD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChlLl9TWU1CT0xfS0VZKToodGhpcy5fcHJvcGVydHlCaW5kaW5ncy5zZXQoZS5fU1lNQk9MX0tFWSx7YWNjZXNzb3I6dH0pLHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz1mdW5jdGlvbigpe3ZhciB0PVtdO2lmKHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSl7dmFyIGU9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksbj1GRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zeW1ib2woKSk7ZS5kPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbih0LGUsaSkoMCkobnVsbCl9LHQucHVzaCh7YXR0clRvUHJvamVjdG9yOmUsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoSEV0LkFuaW1hdG9yLlJFU0VUKX0pfXJldHVybiB0LnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihIRXQuQW5pbWF0b3IuTUFJTil9KSx0fSxlLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpLG49RkV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxpPUZFdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7cmV0dXJuIGUueD1uLGUueT1pLGUudHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4idHJhbnNsYXRlKCIrbih0LGUscikrIiwiK2kodCxlLHIpKyIpIn0sZS5kPXRoaXMuX2NvbnN0cnVjdFN5bWJvbEdlbmVyYXRvcigpLGV9LGUucHJvdG90eXBlLl9jb25zdHJ1Y3RTeW1ib2xHZW5lcmF0b3I9ZnVuY3Rpb24oKXt2YXIgdD1GRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zeW1ib2woKSksZT1GRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zaXplKCkpO3JldHVybiBmdW5jdGlvbihuLGkscil7cmV0dXJuIHQobixpLHIpKGUobixpLHIpKShudWxsKX19LGUucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24odCl7cmV0dXJue3g6dC5wb3NpdGlvbi54LXQuZGlhbWV0ZXIvMix5OnQucG9zaXRpb24ueS10LmRpYW1ldGVyLzIsd2lkdGg6dC5kaWFtZXRlcixoZWlnaHQ6dC5kaWFtZXRlcn19LGUucHJvdG90eXBlLl9lbnRpdHlWaXNpYmxlT25QbG90PWZ1bmN0aW9uKHQsZSl7dmFyIG49e21pbjplLnRvcExlZnQueCxtYXg6ZS5ib3R0b21SaWdodC54fSxpPXttaW46ZS50b3BMZWZ0LnksbWF4OmUuYm90dG9tUmlnaHQueX0scj10aGlzLl9lbnRpdHlCb3VuZHModCk7cmV0dXJuIEJFdC5ET00uaW50ZXJzZWN0c0JCb3gobixpLHIpfSxlLnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKHQpe3ZhciBlPUZFdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksbj1GRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLGk9RkV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2l6ZSgpKTtyZXR1cm4gdGhpcy5lbnRpdGllcygpLmZpbHRlcigoZnVuY3Rpb24ocil7dmFyIG89ci5kYXR1bSxhPXIuaW5kZXgscz1yLmRhdGFzZXQsbD1lKG8sYSxzKSxjPW4obyxhLHMpLHU9aShvLGEscyk7cmV0dXJuIGwtdS8yPD10LngmJnQueDw9bCt1LzImJmMtdS8yPD10LnkmJnQueTw9Yyt1LzJ9KSl9LGUucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fbGFiZWxzRW5hYmxlZDoodGhpcy5fbGFiZWxzRW5hYmxlZD10LHRoaXMuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGUoKSx0aGlzLnJlbmRlcigpLHRoaXMpfSxlLnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0PWZ1bmN0aW9uKG4pe3ZhciBpPXQucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQuY2FsbCh0aGlzLG4pLHI9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImciKS5jbGFzc2VkKGUuX0xBQkVMX0FSRUFfQ0xBU1MsITApLG89bmV3IExFdC5TdmdDb250ZXh0KHIubm9kZSgpKSxhPW5ldyBMRXQuQ2FjaGVNZWFzdXJlcihvKSxzPW5ldyBMRXQuV3JpdGVyKGEsbyk7cmV0dXJuIHRoaXMuX2xhYmVsQ29uZmlnLnNldChuLHtsYWJlbEFyZWE6cixtZWFzdXJlcjphLHdyaXRlcjpzfSksaX0sZS5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcz1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzLmNhbGwodGhpcyxlKTt2YXIgbj10aGlzLl9sYWJlbENvbmZpZy5nZXQoZSk7bnVsbCE9biYmKG4ubGFiZWxBcmVhLnJlbW92ZSgpLHRoaXMuX2xhYmVsQ29uZmlnLmRlbGV0ZShlKSl9LGUucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX2xhYmVsQ29uZmlnLmdldCh0KS5sYWJlbEFyZWEuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCl9KSksdGhpcy5fbGFiZWxzRW5hYmxlZCYmQkV0LldpbmRvdy5zZXRUaW1lb3V0KChmdW5jdGlvbigpe3JldHVybiBlLl9kcmF3TGFiZWxzKCl9KSx0KX0sZS5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5fZ2V0RGF0YVRvRHJhdygpLG49dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goKGZ1bmN0aW9uKGkpe2Zvcih2YXIgcj1lLmdldChpKSxvPXIubGVuZ3RoLGE9MDthPG87YSsrKXt2YXIgcz1yW2FdO251bGwhPXMmJnQuX2RyYXdMYWJlbChzLGEsaSxuKX19KSl9LGUucHJvdG90eXBlLl9kcmF3TGFiZWw9ZnVuY3Rpb24odCxlLG4saSl7aWYobnVsbCE9dC5sYWJlbCl7dmFyIHI9dGhpcy5fbGFiZWxDb25maWcuZ2V0KG4pLG89ci5sYWJlbEFyZWEsYT1yLm1lYXN1cmVyLHM9ci53cml0ZXIsbD17eDppLngodCxlLG4pLHk6aS55KHQsZSxuKX0sYz1GRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zaXplKCkpKHQsZSxuKSx1PXRoaXMuX2xhYmVsRm9ybWF0dGVyKHQubGFiZWwsdCxlLG4pLGg9YS5tZWFzdXJlKHUpLGQ9dGhpcy5fY2FsY3VsYXRlTGFiZWxQcm9wZXJ0aWVzKGwsYyxoKSxwPWQuY29udGFpbmVyRGltZW5zaW9ucyxmPWQuYWxpZ25tZW50LG09dGhpcy5fY3JlYXRlTGFiZWxDb250YWluZXIobyxkLmxhYmVsQ29udGFpbmVyT3JpZ2luLGQubGFiZWxPcmlnaW4saCk7cy53cml0ZSh1LHAud2lkdGgscC5oZWlnaHQse3hBbGlnbjpmLngseUFsaWduOmYueX0sbS5ub2RlKCkpfX0sZS5wcm90b3R5cGUuX2NhbGN1bGF0ZUxhYmVsUHJvcGVydGllcz1mdW5jdGlvbih0LG4saSl7cmV0dXJue2NvbnRhaW5lckRpbWVuc2lvbnM6e3dpZHRoOmkud2lkdGgsaGVpZ2h0OmkuaGVpZ2h0fSxsYWJlbENvbnRhaW5lck9yaWdpbjp7eDp0LngtaS53aWR0aC8yLHk6dC55LWkuaGVpZ2h0LzIrKG48aS5oZWlnaHQ/bi8yK2UuX0xBQkVMX01BUkdJTl9GUk9NX0JVQkJMRTowKX0sbGFiZWxPcmlnaW46e3g6dC54LHk6dC55fSxhbGlnbm1lbnQ6e3g6ImNlbnRlciIseToiY2VudGVyIn19fSxlLnByb3RvdHlwZS5fY3JlYXRlTGFiZWxDb250YWluZXI9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dC5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitlLngrIiwgIitlLnkrIikiKTtyZXR1cm4gci5jbGFzc2VkKCJvbi1iYXItbGFiZWwiLCEwKSxyfSxlLl9TSVpFX0tFWT0ic2l6ZSIsZS5fU1lNQk9MX0tFWT0ic3ltYm9sIixlLl9MQUJFTF9BUkVBX0NMQVNTPSJzY2F0dGVyLWxhYmVsLXRleHQtYXJlYSIsZS5fTEFCRUxfTUFSR0lOX0ZST01fQlVCQkxFPTE1LGV9KShnTXQuWFlQbG90KTtBRXQuU2NhdHRlcj1WRXQ7dmFyIFVFdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoVUV0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgakV0PXVPLEdFdD1fbXQsV0V0PVd3dCxxRXQ9UVN0LFlFdD1aeXQsWEV0PWtfdCwkRXQ9dXd0LEtFdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gZS5hZGRDbGFzcygic2VnbWVudC1wbG90IiksZS5hdHRyKCJzdHJva2UiLChuZXcgWUV0LkNvbG9yKS5yYW5nZSgpWzBdKSxlLmF0dHIoInN0cm9rZS13aWR0aCIsIjJweCIpLGV9cmV0dXJuIGpFdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBXRXQuUHJveHlEcmF3ZXIoKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBxRXQuU2VnbWVudFNWR0RyYXdlcn0pLChmdW5jdGlvbigpe3JldHVybiBYRXQud2FybigiY2FudmFzIHJlbmRlcmVyIGlzIG5vdCBzdXBwb3J0ZWQgb24gU2VnbWVudCBQbG90ISIpLG51bGx9KSl9LGUucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz1mdW5jdGlvbigpe3JldHVyblt7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGFuaW1hdG9yOm5ldyBHRXQuTnVsbH1dfSxlLnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24oZSl7cmV0dXJuIHQucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsIngyIj09PWU/IngiOiJ5MiI9PT1lPyJ5IjplKX0sZS5wcm90b3R5cGUueD1mdW5jdGlvbihuLGkpe2lmKG51bGw9PW4pcmV0dXJuIHQucHJvdG90eXBlLnguY2FsbCh0aGlzKTtpZihudWxsPT1pKXQucHJvdG90eXBlLnguY2FsbCh0aGlzLG4pO2Vsc2V7dC5wcm90b3R5cGUueC5jYWxsKHRoaXMsbixpKTt2YXIgcj10aGlzLngyKCksbz1yJiZyLmFjY2Vzc29yO251bGwhPW8mJnRoaXMuX2JpbmRQcm9wZXJ0eShlLl9YMl9LRVksbyxpKX1yZXR1cm4gdGhpc30sZS5wcm90b3R5cGUueDI9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoZS5fWDJfS0VZKTt2YXIgbj10aGlzLngoKTtyZXR1cm4gdGhpcy5fYmluZFByb3BlcnR5KGUuX1gyX0tFWSx0LG4mJm4uc2NhbGUpLHRoaXMucmVuZGVyKCksdGhpc30sZS5wcm90b3R5cGUueT1mdW5jdGlvbihuLGkpe2lmKG51bGw9PW4pcmV0dXJuIHQucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtpZihudWxsPT1pKXQucHJvdG90eXBlLnkuY2FsbCh0aGlzLG4pO2Vsc2V7dC5wcm90b3R5cGUueS5jYWxsKHRoaXMsbixpKTt2YXIgcj10aGlzLnkyKCksbz1yJiZyLmFjY2Vzc29yO251bGwhPW8mJnRoaXMuX2JpbmRQcm9wZXJ0eShlLl9ZMl9LRVksbyxpKX1yZXR1cm4gdGhpc30sZS5wcm90b3R5cGUueTI9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoZS5fWTJfS0VZKTt2YXIgbj10aGlzLnkoKTtyZXR1cm4gdGhpcy5fYmluZFByb3BlcnR5KGUuX1kyX0tFWSx0LG4mJm4uc2NhbGUpLHRoaXMucmVuZGVyKCksdGhpc30sZS5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBlPXQucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKTtyZXR1cm4gZS54MT0kRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLGUueDI9bnVsbD09dGhpcy54MigpPyRFdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSk6JEV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueDIoKSksZS55MT0kRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLGUueTI9bnVsbD09dGhpcy55MigpPyRFdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk6JEV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTIoKSksZX0sZS5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmVudGl0eU5lYXJlc3QodCk7cmV0dXJuIG51bGwhPWU/W2VdOltdfSxlLnByb3RvdHlwZS5lbnRpdGllc0luPWZ1bmN0aW9uKHQsZSl7dmFyIG4saTtyZXR1cm4gbnVsbD09ZT8obj17bWluOnQudG9wTGVmdC54LG1heDp0LmJvdHRvbVJpZ2h0Lnh9LGk9e21pbjp0LnRvcExlZnQueSxtYXg6dC5ib3R0b21SaWdodC55fSk6KG49dCxpPWUpLHRoaXMuX2VudGl0aWVzSW50ZXJzZWN0aW5nKG4saSl9LGUucHJvdG90eXBlLl9lbnRpdGllc0ludGVyc2VjdGluZz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1bXSxpPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLHI9dGhpcy5lbnRpdGllcygpLG89ci5sZW5ndGgsYT0wO2E8bzthKyspe3ZhciBzPXJbYV07dGhpcy5fbGluZUludGVyc2VjdHNCb3gocyx0LGUsaSkmJm4ucHVzaChzKX1yZXR1cm4gbn0sZS5wcm90b3R5cGUuX2xpbmVJbnRlcnNlY3RzQm94PWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPXRoaXMsbz1pLngxKHQuZGF0dW0sdC5pbmRleCx0LmRhdGFzZXQpLGE9aS54Mih0LmRhdHVtLHQuaW5kZXgsdC5kYXRhc2V0KSxzPWkueTEodC5kYXR1bSx0LmluZGV4LHQuZGF0YXNldCksbD1pLnkyKHQuZGF0dW0sdC5pbmRleCx0LmRhdGFzZXQpO2lmKGUubWluPD1vJiZvPD1lLm1heCYmbi5taW48PXMmJnM8PW4ubWF4fHxlLm1pbjw9YSYmYTw9ZS5tYXgmJm4ubWluPD1sJiZsPD1uLm1heClyZXR1cm4hMDt2YXIgYz17eDpvLHk6c30sdT17eDphLHk6bH0saD1be3g6ZS5taW4seTpuLm1pbn0se3g6ZS5taW4seTpuLm1heH0se3g6ZS5tYXgseTpuLm1heH0se3g6ZS5tYXgseTpuLm1pbn1dO3JldHVybiBoLmZpbHRlcigoZnVuY3Rpb24odCxlKXtyZXR1cm4gMCE9PWUmJnIuX2xpbmVJbnRlcnNlY3RzU2VnbWVudChjLHUsdCxoW2UtMV0pJiZyLl9saW5lSW50ZXJzZWN0c1NlZ21lbnQodCxoW2UtMV0sYyx1KX0pKS5sZW5ndGg+MH0sZS5wcm90b3R5cGUuX2xpbmVJbnRlcnNlY3RzU2VnbWVudD1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuKGUueC10LngpKihuLnktZS55KS0oZS55LXQueSkqKG4ueC1lLngpfTtyZXR1cm4gcih0LGUsbikqcih0LGUsaSk8MH0sZS5fWDJfS0VZPSJ4MiIsZS5fWTJfS0VZPSJ5MiIsZX0pKGdNdC5YWVBsb3QpO1VFdC5TZWdtZW50PUtFdDt2YXIgWkV0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShaRXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBKRXQ9dU8sUUV0PUVkdCx0VHQ9X210LGVUdD1kd3QsblR0PUZndCxpVHQ9dXd0LHJUdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gZS5fc3RhY2tpbmdSZXN1bHQ9ZVR0Lm1lbVRodW5rKChmdW5jdGlvbigpe3JldHVybiBlLmRhdGFzZXRzKCl9KSwoZnVuY3Rpb24oKXtyZXR1cm4gZS54KCkuYWNjZXNzb3J9KSwoZnVuY3Rpb24oKXtyZXR1cm4gZS55KCkuYWNjZXNzb3J9KSwoZnVuY3Rpb24oKXtyZXR1cm4gZS5fc3RhY2tpbmdPcmRlcn0pLChmdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gblR0LlN0YWNraW5nLnN0YWNrKHQsZSxuLGkpfSkpLGUuX3N0YWNrZWRFeHRlbnQ9ZVR0Lm1lbVRodW5rKGUuX3N0YWNraW5nUmVzdWx0LChmdW5jdGlvbigpe3JldHVybiBlLngoKS5hY2Nlc3Nvcn0pLChmdW5jdGlvbigpe3JldHVybiBlLl9maWx0ZXJGb3JQcm9wZXJ0eSgieSIpfSksKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gblR0LlN0YWNraW5nLnN0YWNrZWRFeHRlbnQodCxlLG4pfSkpLGUuX2Jhc2VsaW5lVmFsdWU9MCxlLl9zdGFja2luZ09yZGVyPSJib3R0b211cCIsZS5hZGRDbGFzcygic3RhY2tlZC1hcmVhLXBsb3QiKSxlLl9iYXNlbGluZVZhbHVlUHJvdmlkZXI9ZnVuY3Rpb24oKXtyZXR1cm5bZS5fYmFzZWxpbmVWYWx1ZV19LGUuY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQoITEpLGV9cmV0dXJuIEpFdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT90LnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZC5jYWxsKHRoaXMpOmU/KG5UdC5XaW5kb3cud2FybigiV2FybmluZzogU3RhY2tlZCBBcmVhIFBsb3QgZG9lcyBub3Qgc3VwcG9ydCBjcm9wcGVkIHJlbmRlcmluZy4iKSx0aGlzKTp0LnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZC5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLl9nZXRBbmltYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHRUdC5OdWxsfSxlLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKSx0aGlzLl9iYXNlbGluZT10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImJhc2VsaW5lIiwhMCl9LGUucHJvdG90eXBlLng9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gbnVsbD09ZT90LnByb3RvdHlwZS54LmNhbGwodGhpcyk6KG51bGw9PW4/dC5wcm90b3R5cGUueC5jYWxsKHRoaXMsZSk6dC5wcm90b3R5cGUueC5jYWxsKHRoaXMsZSxuKSx0aGlzLl9jaGVja1NhbWVEb21haW4oKSx0aGlzKX0sZS5wcm90b3R5cGUueT1mdW5jdGlvbihlLG4pe3JldHVybiBudWxsPT1lP3QucHJvdG90eXBlLnkuY2FsbCh0aGlzKToobnVsbD09bj90LnByb3RvdHlwZS55LmNhbGwodGhpcyxlKTp0LnByb3RvdHlwZS55LmNhbGwodGhpcyxlLG4pLHRoaXMuX2NoZWNrU2FtZURvbWFpbigpLHRoaXMpfSxlLnByb3RvdHlwZS55T2Zmc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fc3RhY2tpbmdSZXN1bHQoKTtpZihudWxsIT1uKXt2YXIgaT1uLmdldCh0KTtpZihudWxsIT1pKXt2YXIgcj1pLmdldChTdHJpbmcoZSkpO2lmKG51bGwhPXIpcmV0dXJuIHIub2Zmc2V0fX19LGUucHJvdG90eXBlLnN0YWNraW5nT3JkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fc3RhY2tpbmdPcmRlcjoodGhpcy5fc3RhY2tpbmdPcmRlcj10LHRoaXMuX29uRGF0YXNldFVwZGF0ZSgpLHRoaXMpfSxlLnByb3RvdHlwZS5kb3duc2FtcGxpbmdFbmFibGVkPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3QucHJvdG90eXBlLmRvd25zYW1wbGluZ0VuYWJsZWQuY2FsbCh0aGlzKTooblR0LldpbmRvdy53YXJuKCJXYXJuaW5nOiBTdGFja2VkIEFyZWEgUGxvdCBkb2VzIG5vdCBzdXBwb3J0IGRvd25zYW1wbGluZyIpLHRoaXMpfSxlLnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy55KCkuc2NhbGUuc2NhbGUodGhpcy5fYmFzZWxpbmVWYWx1ZSksZT17eDE6MCx5MTp0LHgyOnRoaXMud2lkdGgoKSx5Mjp0fTt0aGlzLl9nZXRBbmltYXRvcigiYmFzZWxpbmUiKS5hbmltYXRlKHRoaXMuX2Jhc2VsaW5lLGUpfSxlLnByb3RvdHlwZS5fdXBkYXRlWVNjYWxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy55KCksZT10JiZ0LnNjYWxlO251bGwhPWUmJihlLmFkZFBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXIodGhpcy5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyKSxlLmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXIodGhpcy5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyKSl9LGUucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2hlY2tTYW1lRG9tYWluKCksdC5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZS5jYWxsKHRoaXMpLHRoaXN9LGUucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbihlKXtyZXR1cm4ieSI9PT1lP1t0aGlzLl9zdGFja2VkRXh0ZW50KCldOnQucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLl9jaGVja1NhbWVEb21haW49ZnVuY3Rpb24oKXtpZih0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKSl7dmFyIHQ9dGhpcy5kYXRhc2V0cygpLG49dGhpcy54KCkuYWNjZXNzb3IsaT10Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIFFFdC5zZXQodC5kYXRhKCkubWFwKChmdW5jdGlvbihlLGkpe3JldHVybiBuVHQuU3RhY2tpbmcubm9ybWFsaXplS2V5KG4oZSxpLHQpKX0pKSkudmFsdWVzKCl9KSkscj1lLl9kb21haW5LZXlzKHQsbik7aS5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gdC5sZW5ndGghPT1yLmxlbmd0aH0pKSYmblR0LldpbmRvdy53YXJuKCJ0aGUgZG9tYWlucyBhY3Jvc3MgdGhlIGRhdGFzZXRzIGFyZSBub3QgdGhlIHNhbWUuIFBsb3QgbWF5IHByb2R1Y2UgdW5pbnRlbmRlZCBiZWhhdmlvci4iKX19LGUuX2RvbWFpbktleXM9ZnVuY3Rpb24odCxlKXt2YXIgbj1RRXQuc2V0KCk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7Zm9yKHZhciBpPXQuZGF0YSgpLHI9aS5sZW5ndGgsbz0wO288cjtvKyspbi5hZGQoZShpW29dLG8sdCkpfSkpLG4udmFsdWVzKCl9LGUucHJvdG90eXBlLl9jb29yZGluYXRlUHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1pVHQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLG49dGhpcy55KCkuYWNjZXNzb3IsaT10aGlzLngoKS5hY2Nlc3NvcixyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gblR0LlN0YWNraW5nLm5vcm1hbGl6ZUtleShpKHQsZSxuKSl9LG89dGhpcy5fc3RhY2tpbmdSZXN1bHQoKTtyZXR1cm5bZSxmdW5jdGlvbihlLGksYSl7dmFyIHM9K24oZSxpLGEpLGw9by5nZXQoYSkuZ2V0KHIoZSxpLGEpKS5vZmZzZXQ7cmV0dXJuIHQueSgpLnNjYWxlLnNjYWxlKHMrbCl9LGZ1bmN0aW9uKGUsbixpKXt2YXIgYT1vLmdldChpKS5nZXQocihlLG4saSkpLm9mZnNldDtyZXR1cm4gdC55KCkuc2NhbGUuc2NhbGUoYSl9XX0sZS5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBlPXQucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKSxuPXRoaXMuX2Nvb3JkaW5hdGVQcm9qZWN0b3JzKCk7cmV0dXJuIGUuZD10aGlzLl9jb25zdHJ1Y3RBcmVhUHJvamVjdG9yKG5bMF0sblsxXSxuWzJdKSxlfSxlLnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbihlLG4saSl7dmFyIHI9dC5wcm90b3R5cGUuX3BpeGVsUG9pbnQuY2FsbCh0aGlzLGUsbixpKSxvPXRoaXMueCgpLmFjY2Vzc29yKGUsbixpKSxhPXRoaXMueSgpLmFjY2Vzc29yKGUsbixpKSxzPXRoaXMueSgpLnNjYWxlLnNjYWxlKCthK3RoaXMuX3N0YWNraW5nUmVzdWx0KCkuZ2V0KGkpLmdldChuVHQuU3RhY2tpbmcubm9ybWFsaXplS2V5KG8pKS5vZmZzZXQpO3JldHVybnt4OnIueCx5OnN9fSxlfSkoZk10LkFyZWEpO1pFdC5TdGFja2VkQXJlYT1yVHQ7dmFyIG9UdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkob1R0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgYVR0PXVPLHNUdD1JbXQsbFR0PWd5dCxjVHQ9ZHd0LHVUdD1GZ3QsaFR0PVhNdCxkVHQ9dXd0LHBUdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT0idmVydGljYWwiKTt2YXIgbj10LmNhbGwodGhpcyxlKXx8dGhpcztyZXR1cm4gbi5fZXh0cmVtYUZvcm1hdHRlcj1sVHQuaWRlbnRpdHkoKSxuLl9zdGFja2luZ1Jlc3VsdD1jVHQubWVtVGh1bmsoKGZ1bmN0aW9uKCl7cmV0dXJuIG4uZGF0YXNldHMoKX0pLChmdW5jdGlvbigpe3JldHVybiBuLnBvc2l0aW9uKCkuYWNjZXNzb3J9KSwoZnVuY3Rpb24oKXtyZXR1cm4gbi5sZW5ndGgoKS5hY2Nlc3Nvcn0pLChmdW5jdGlvbigpe3JldHVybiBuLl9zdGFja2luZ09yZGVyfSksKGZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiB1VHQuU3RhY2tpbmcuc3RhY2sodCxlLG4saSl9KSksbi5fc3RhY2tlZEV4dGVudD1jVHQubWVtVGh1bmsobi5fc3RhY2tpbmdSZXN1bHQsKGZ1bmN0aW9uKCl7cmV0dXJuIG4ucG9zaXRpb24oKS5hY2Nlc3Nvcn0pLChmdW5jdGlvbigpe3JldHVybiBuLl9maWx0ZXJGb3JQcm9wZXJ0eShuLl9pc1ZlcnRpY2FsPyJ5IjoieCIpfSksKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdVR0LlN0YWNraW5nLnN0YWNrZWRFeHRlbnQodCxlLG4pfSkpLG4uYWRkQ2xhc3MoInN0YWNrZWQtYmFyLXBsb3QiKSxuLl9zdGFja2luZ09yZGVyPSJib3R0b211cCIsbn1yZXR1cm4gYVR0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLnN0YWNraW5nT3JkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fc3RhY2tpbmdPcmRlcjoodGhpcy5fc3RhY2tpbmdPcmRlcj10LHRoaXMuX29uRGF0YXNldFVwZGF0ZSgpLHRoaXMpfSxlLnByb3RvdHlwZS5leHRyZW1hRm9ybWF0dGVyPWZ1bmN0aW9uKHQpe3JldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLl9leHRyZW1hRm9ybWF0dGVyOih0aGlzLl9leHRyZW1hRm9ybWF0dGVyPXQsdGhpcy5yZW5kZXIoKSx0aGlzKX0sZS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyksdGhpcy5fbGFiZWxBcmVhPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZChoVHQuQmFyLl9MQUJFTF9BUkVBX0NMQVNTLCEwKTt2YXIgZT1uZXcgc1R0LlN2Z0NvbnRleHQodGhpcy5fbGFiZWxBcmVhLm5vZGUoKSk7dGhpcy5fbWVhc3VyZXI9bmV3IHNUdC5DYWNoZU1lYXN1cmVyKGUpLHRoaXMuX3dyaXRlcj1uZXcgc1R0LldyaXRlcih0aGlzLl9tZWFzdXJlcixlKX0sZS5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3QucHJvdG90eXBlLl9kcmF3TGFiZWxzLmNhbGwodGhpcyksdGhpcy5fbGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpO3ZhciBpPSt0aGlzLmJhc2VsaW5lVmFsdWUoKSxyPXRoaXMucG9zaXRpb24oKS5zY2FsZSxvPXRoaXMubGVuZ3RoKCkuc2NhbGUsYT11VHQuU3RhY2tpbmcuc3RhY2tlZEV4dGVudHModGhpcy5fc3RhY2tpbmdSZXN1bHQoKSkscz1hLm1pbmltdW1FeHRlbnRzLGw9W10sYz1mdW5jdGlvbih0LGUpe3ZhciBhPW4uX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yKCkscz1uLndpZHRoKCksYz1uLmhlaWdodCgpO3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYodC5leHRlbnQhPT1pKXt2YXIgdT1uLmV4dHJlbWFGb3JtYXR0ZXIoKSh0LmV4dGVudCksaD1uLl9tZWFzdXJlci5tZWFzdXJlKHUpLGQ9dC5zdGFja2VkRGF0dW0scD1kLm9yaWdpbmFsRGF0dW0sZj1kLm9yaWdpbmFsSW5kZXgsbT1kLm9yaWdpbmFsRGF0YXNldDtpZighbi5faXNEYXR1bU9uU2NyZWVuKGEscyxjLHAsZixtKSlyZXR1cm47dmFyIGc9ZFR0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKG4uYXR0cihoVHQuQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSkpKHAsZixtKSxfPW8uc2NhbGUodC5leHRlbnQpLHk9bi5fZ2V0UG9zaXRpb25BdHRyKHIuc2NhbGUodC5heGlzVmFsdWUpLGcpK2cvMix2PWUobi5faXNWZXJ0aWNhbD97eDp5LHk6X306e3g6Xyx5Onl9LGgsZyksYj0oZnVuY3Rpb24odCxlLGkpe3ZhciByPWUudG9wTGVmdCxvPXIueCxhPXIueSxzPWUuYm90dG9tUmlnaHQueC1lLnRvcExlZnQueCxsPWUuYm90dG9tUmlnaHQueS1lLnRvcExlZnQueSxjPW4uX2lzVmVydGljYWw/cz5pOmw+aTtpZighYyl7dmFyIHU9bi5fbGFiZWxBcmVhLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK28rIiwgIithKyIpIik7dS5jbGFzc2VkKCJzdGFja2VkLWJhci1sYWJlbCIsITApLG4uX3dyaXRlci53cml0ZSh0LHMsbCx7eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIn0sdS5ub2RlKCkpfXJldHVybiBjfSkodSx7dG9wTGVmdDp2LGJvdHRvbVJpZ2h0Ont4OnYueCtoLndpZHRoLHk6di55K2guaGVpZ2h0fX0sZyk7bC5wdXNoKGIpfX0pKX07YyhhLm1heGltdW1FeHRlbnRzLChmdW5jdGlvbih0LGkscil7dmFyIG89bi5faXNWZXJ0aWNhbD9pLndpZHRoOmkuaGVpZ2h0O3JldHVybnt4Om4uX2lzVmVydGljYWw/dC54LW8vMjp0LngrZS5fRVhUUkVNQV9MQUJFTF9NQVJHSU5fRlJPTV9CQVIseTpuLl9pc1ZlcnRpY2FsP3QueS0obi5faXNWZXJ0aWNhbD9pLmhlaWdodDppLndpZHRoKTp0Lnktby8yfX0pKSxjKHMsKGZ1bmN0aW9uKHQsaSxyKXt2YXIgbz1uLl9pc1ZlcnRpY2FsP2kud2lkdGg6aS5oZWlnaHQ7cmV0dXJue3g6bi5faXNWZXJ0aWNhbD90Lngtby8yOnQueC0obi5faXNWZXJ0aWNhbD9pLmhlaWdodDppLndpZHRoKSx5Om4uX2lzVmVydGljYWw/dC55K2UuX0VYVFJFTUFfTEFCRUxfTUFSR0lOX0ZST01fQkFSOnQueS1vLzJ9fSkpLGwuc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIHR9KSkmJnRoaXMuX2xhYmVsQXJlYS5zZWxlY3RBbGwoImciKS5yZW1vdmUoKX0sZS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPXQucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLGk9dGhpcy5faXNWZXJ0aWNhbD8ieSI6IngiLHI9dGhpcy5sZW5ndGgoKS5zY2FsZSxvPXRoaXMubGVuZ3RoKCkuYWNjZXNzb3IsYT10aGlzLnBvc2l0aW9uKCkuYWNjZXNzb3Iscz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHVUdC5TdGFja2luZy5ub3JtYWxpemVLZXkoYSh0LGUsbikpfSxsPXRoaXMuX3N0YWNraW5nUmVzdWx0KCksYz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHIuc2NhbGUobC5nZXQobikuZ2V0KHModCxlLG4pKS5vZmZzZXQpfSx1PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gci5zY2FsZSgrbyh0LGUsbikrbC5nZXQobikuZ2V0KHModCxlLG4pKS5vZmZzZXQpfSxoPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTWF0aC5hYnModSh0LGUsbiktYyh0LGUsbikpfTtuW3RoaXMuX2lzVmVydGljYWw/ImhlaWdodCI6IndpZHRoIl09aDt2YXIgZD1mdW5jdGlvbih0LGUsbil7cmV0dXJuK28odCxlLG4pPDA/Yyh0LGUsbik6dSh0LGUsbil9O3JldHVybiBuW2ldPWZ1bmN0aW9uKHQsbixpKXtyZXR1cm4gZS5faXNWZXJ0aWNhbD9kKHQsbixpKTpkKHQsbixpKS1oKHQsbixpKX0sbn0sZS5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5PWZ1bmN0aW9uKGUpe3JldHVybiBlPT09KHRoaXMuX2lzVmVydGljYWw/InkiOiJ4Iik/W3RoaXMuX3N0YWNrZWRFeHRlbnQoKV06dC5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5LmNhbGwodGhpcyxlKX0sZS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyksdGhpcy5fbWVhc3VyZXIucmVzZXQoKX0sZS5fRVhUUkVNQV9MQUJFTF9NQVJHSU5fRlJPTV9CQVI9NSxlfSkoaFR0LkJhcik7b1R0LlN0YWNrZWRCYXI9cFR0O3ZhciBmVHQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KGZUdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIG1UdD11TyxnVHQ9Rmd0LF9UdD11d3QseVR0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBlLl9jb25uZWN0b3JzRW5hYmxlZD0hMSxlLmFkZENsYXNzKCJ3YXRlcmZhbGwtcGxvdCIpLGV9cmV0dXJuIG1UdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5jb25uZWN0b3JzRW5hYmxlZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9jb25uZWN0b3JzRW5hYmxlZDoodGhpcy5fY29ubmVjdG9yc0VuYWJsZWQ9dCx0aGlzKX0sZS5wcm90b3R5cGUudG90YWw9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoZS5fVE9UQUxfS0VZKToodGhpcy5fYmluZFByb3BlcnR5KGUuX1RPVEFMX0tFWSx0LG51bGwpLHRoaXMpfSxlLnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5fY29ubmVjdG9yQXJlYS5zZWxlY3RBbGwoImxpbmUiKS5yZW1vdmUoKSx0aGlzLl9jb25uZWN0b3JzRW5hYmxlZCYmZ1R0LldpbmRvdy5zZXRUaW1lb3V0KChmdW5jdGlvbigpe3JldHVybiBlLl9kcmF3Q29ubmVjdG9ycygpfSksdCl9LGUucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQ9ZnVuY3Rpb24obil7dmFyIGk9dC5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldC5jYWxsKHRoaXMsbik7cmV0dXJuIHRoaXMuX2Nvbm5lY3RvckFyZWE9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImciKS5jbGFzc2VkKGUuX0NPTk5FQ1RPUl9BUkVBX0NMQVNTLCEwKSxpfSxlLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oZSl7cmV0dXJuInkiPT09ZT9bdGhpcy5fZXh0ZW50XTp0LnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLGUpfSxlLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLGk9dC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcykscj10aGlzLnkoKS5zY2FsZSxvPV9UdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnRvdGFsKCkpO3JldHVybiBudWxsPT10aGlzLmF0dHIoInkiKSYmKGkueT1mdW5jdGlvbih0LGUsaSl7dmFyIGE9bi55KCkuYWNjZXNzb3IodCxlLGkpO2lmKG8odCxlLGkpKXJldHVybiBNYXRoLm1pbihyLnNjYWxlKGEpLHIuc2NhbGUoMCkpO3ZhciBzPW4uX3N1YnRvdGFsc1tlXTtpZigwPT09ZSlyZXR1cm4gci5zY2FsZShhPDA/cy1hOnMpO3ZhciBsPW4uX3N1YnRvdGFsc1tlLTFdO3JldHVybiByLnNjYWxlKHM+bD9zOmwpfSksbnVsbD09dGhpcy5hdHRyKCJoZWlnaHQiKSYmKGkuaGVpZ2h0PWZ1bmN0aW9uKHQsZSxpKXt2YXIgYT1vKHQsZSxpKSxzPW4ueSgpLmFjY2Vzc29yKHQsZSxpKTtpZihhKXJldHVybiBNYXRoLmFicyhyLnNjYWxlKHMpLXIuc2NhbGUoMCkpO3ZhciBsPW4uX3N1YnRvdGFsc1tlXTtpZigwPT09ZSlyZXR1cm4gTWF0aC5hYnMoci5zY2FsZShsKS1yLnNjYWxlKGwtcykpO3ZhciBjPW4uX3N1YnRvdGFsc1tlLTFdO3JldHVybiBNYXRoLmFicyhyLnNjYWxlKGwpLXIuc2NhbGUoYykpfSksaS5jbGFzcz1mdW5jdGlvbih0LGkscil7dmFyIGE9IiI7cmV0dXJuIG51bGwhPW4uYXR0cigiY2xhc3MiKSYmKGE9bi5hdHRyKCJjbGFzcyIpLmFjY2Vzc29yKHQsaSxyKSsiICIpLG8odCxpLHIpP2ErZS5fQkFSX1RPVEFMX0NMQVNTOmErKG4ueSgpLmFjY2Vzc29yKHQsaSxyKT4wP2UuX0JBUl9HUk9XVEhfQ0xBU1M6ZS5fQkFSX0RFQ0xJTkVfQ0xBU1MpfSxpfSxlLnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VwZGF0ZVN1YnRvdGFscygpLHQucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKSx0aGlzfSxlLnByb3RvdHlwZS5fY2FsY3VsYXRlU3VidG90YWxzQW5kRXh0ZW50PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1OdW1iZXIuTUFYX1ZBTFVFLG49TnVtYmVyLk1JTl9WQUxVRSxpPTAscj0hMSxvPXQuZGF0YSgpLGE9by5sZW5ndGgscz0wO3M8YTtzKyspe3ZhciBsPW9bc10sYz10aGlzLnkoKS5hY2Nlc3NvcihsLHMsdCksdT10aGlzLnRvdGFsKCkuYWNjZXNzb3IobCxzLHQpO2lmKHUmJjAhPT1zfHwoaSs9YyksdGhpcy5fc3VidG90YWxzLnB1c2goaSksaTxlJiYoZT1pKSxpPm4mJihuPWkpLHUmJihjPGUmJihlPWMpLGM+biYmKG49YykpLCFyJiZ1KXtmb3IodmFyIGg9Yy1pLGQ9MDtkPHRoaXMuX3N1YnRvdGFscy5sZW5ndGg7ZCsrKXRoaXMuX3N1YnRvdGFsc1tkXSs9aDtyPSEwLGkrPWgsZSs9aCxuKz1ofX10aGlzLl9leHRlbnQ9W2Usbl19LGUucHJvdG90eXBlLl9kcmF3Q29ubmVjdG9ycz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxuPXRoaXMuZGF0YXNldHMoKVswXSxpPTE7aTxuLmRhdGEoKS5sZW5ndGg7aSsrKXt2YXIgcj1pLTEsbz1uLmRhdGEoKVtpXSxhPW4uZGF0YSgpW3JdLHM9dC54KGEscixuKSxsPXQueChvLGksbikrdC53aWR0aChvLGksbiksYz10LnkobyxpLG4pOyh0aGlzLl9zdWJ0b3RhbHNbaV0+MCYmdGhpcy5fc3VidG90YWxzW2ldPnRoaXMuX3N1YnRvdGFsc1tyXXx8dGhpcy5fc3VidG90YWxzW2ldPDAmJnRoaXMuX3N1YnRvdGFsc1tpXT49dGhpcy5fc3VidG90YWxzW3JdKSYmKGM9dC55KG8saSxuKSt0LmhlaWdodChvLGksbikpLHRoaXMuX2Nvbm5lY3RvckFyZWEuYXBwZW5kKCJsaW5lIikuY2xhc3NlZChlLl9DT05ORUNUT1JfQ0xBU1MsITApLmF0dHIoIngxIixzKS5hdHRyKCJ4MiIsbCkuYXR0cigieTEiLGMpLmF0dHIoInkyIixjKX19LGUucHJvdG90eXBlLl91cGRhdGVTdWJ0b3RhbHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmRhdGFzZXRzKCk7aWYodC5sZW5ndGg+MCl7dmFyIGU9dFt0Lmxlbmd0aC0xXTt0aGlzLl9zdWJ0b3RhbHM9bmV3IEFycmF5LHRoaXMuX2NhbGN1bGF0ZVN1YnRvdGFsc0FuZEV4dGVudChlKX19LGUuX0JBUl9ERUNMSU5FX0NMQVNTPSJ3YXRlcmZhbGwtZGVjbGluZSIsZS5fQkFSX0dST1dUSF9DTEFTUz0id2F0ZXJmYWxsLWdyb3d0aCIsZS5fQkFSX1RPVEFMX0NMQVNTPSJ3YXRlcmZhbGwtdG90YWwiLGUuX0NPTk5FQ1RPUl9DTEFTUz0iY29ubmVjdG9yIixlLl9DT05ORUNUT1JfQVJFQV9DTEFTUz0iY29ubmVjdG9yLWFyZWEiLGUuX1RPVEFMX0tFWT0idG90YWwiLGV9KShYTXQuQmFyKTtmVHQuV2F0ZXJmYWxsPXlUdCwoZnVuY3Rpb24odCl7Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZT11TztlLl9fZXhwb3J0U3RhcihmTXQsdCksZS5fX2V4cG9ydFN0YXIoWE10LHQpLGUuX19leHBvcnRTdGFyKGh3dCx0KSxlLl9fZXhwb3J0U3RhcigkTXQsdCksZS5fX2V4cG9ydFN0YXIobU10LHQpLGUuX19leHBvcnRTdGFyKG5FdCx0KSxlLl9fZXhwb3J0U3RhcihnRXQsdCksZS5fX2V4cG9ydFN0YXIoQUV0LHQpLGUuX19leHBvcnRTdGFyKFVFdCx0KSxlLl9fZXhwb3J0U3RhcihaRXQsdCksZS5fX2V4cG9ydFN0YXIob1R0LHQpLGUuX19leHBvcnRTdGFyKGZUdCx0KX0pKHBNdCk7dmFyIHZUdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkodlR0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx2VHQudmVyc2lvbj0iMy45LjAiLChmdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9dU87dC5BbmltYXRvcnM9X210LHQuQXhlcz1QbXQsdC5Db21wb25lbnRzPWlidCx0LkNvbmZpZ3M9TF90LHQuRm9ybWF0dGVycz1neXQsdC5SZW5kZXJDb250cm9sbGVyPUhndCx0LlJlbmRlclBvbGljaWVzPW55dCx0LlN5bWJvbEZhY3Rvcmllcz1VeHQsdC5EaXNwYXRjaGVycz1zYnQsdC5EcmF3ZXJzPU5TdCx0LkludGVyYWN0aW9ucz1vYnQsdC5QbG90cz1wTXQsdC5TY2FsZXM9Wnl0LHQuVXRpbHM9Rmd0LGUuX19leHBvcnRTdGFyKG15dCx0KSx0LlRpbWVJbnRlcnZhbD1LeXQuVGltZUludGVydmFsLGUuX19leHBvcnRTdGFyKEJndCx0KSxlLl9fZXhwb3J0U3Rhcih4eHQsdCksZS5fX2V4cG9ydFN0YXIoZ3d0LHQpLHQudmVyc2lvbj12VHQudmVyc2lvbixlLl9fZXhwb3J0U3RhcihjYnQsdCksZS5fX2V4cG9ydFN0YXIoV3d0LHQpLGUuX19leHBvcnRTdGFyKHdidCx0KSxlLl9fZXhwb3J0U3RhcihJYnQsdCksZS5fX2V4cG9ydFN0YXIoZ010LHQpLGUuX19leHBvcnRTdGFyKHV3dCx0KSxlLl9fZXhwb3J0U3RhcihJdnQsdCksZS5fX2V4cG9ydFN0YXIoaHZ0LHQpfSkock8pO2NvbnN0IGJUdD1be2NoYXJhY3Rlcjoi4pe8IixtZXRob2Q6ck8uU3ltYm9sRmFjdG9yaWVzLnNxdWFyZX0se2NoYXJhY3Rlcjoi4peGIixtZXRob2Q6ck8uU3ltYm9sRmFjdG9yaWVzLmRpYW1vbmR9LHtjaGFyYWN0ZXI6IuKWsiIsbWV0aG9kOnJPLlN5bWJvbEZhY3Rvcmllcy50cmlhbmdsZX0se2NoYXJhY3Rlcjoi4piFIixtZXRob2Q6ck8uU3ltYm9sRmFjdG9yaWVzLnN0YXJ9LHtjaGFyYWN0ZXI6IuKcmiIsbWV0aG9kOnJPLlN5bWJvbEZhY3Rvcmllcy5jcm9zc31dO3ZhciB4VHQ7ZnVuY3Rpb24gd1R0KHQpe3JldHVybiBlPT57bGV0IG4saT1NYXRoLmFicyhlKTtyZXR1cm4gaTwxZS0xNSYmKGk9MCksbj1teShpPj0xZTR8fGk+MCYmaTwuMDE/Ii4iK3QrIn5lIjoiLiIrdCsifmciKSxuKGUpfX0hKGZ1bmN0aW9uKHQpe3QuU1RFUD0ic3RlcCIsdC5SRUxBVElWRT0icmVsYXRpdmUiLHQuV0FMTF9USU1FPSJ3YWxsX3RpbWUifSkoeFR0fHwoeFR0PXt9KSk7Y29uc3QgU1R0PW15KCIuNH5zIik7ZnVuY3Rpb24gTVR0KCl7bGV0IHQ9bmV3IHJPLlNjYWxlcy5MaW5lYXI7dC50aWNrR2VuZXJhdG9yKHJPLlNjYWxlcy5UaWNrR2VuZXJhdG9ycy5pbnRlZ2VyVGlja0dlbmVyYXRvcigpKTtsZXQgZT1uZXcgck8uQXhlcy5OdW1lcmljKHQsImJvdHRvbSIpO3JldHVybiBlLmZvcm1hdHRlcihTVHQpLHtzY2FsZTp0LGF4aXM6ZSxhY2Nlc3Nvcjp0PT50LnN0ZXB9fWxldCBFVHQ9ck8uRm9ybWF0dGVycy50aW1lKCIlYSAlYiAlZSwgJUg6JU06JVMiKSxUVHQ9KHQsZSxuKT0+e2lmKG51bGwhPXQucmVsYXRpdmUpcmV0dXJuIHQucmVsYXRpdmU7bGV0IGk9bi5kYXRhKCk7cmV0dXJuKCt0LndhbGxfdGltZS0oaS5sZW5ndGg+MD8raVswXS53YWxsX3RpbWU6MCkpLzM2ZTV9LENUdD10PT57bGV0IGU9IiIsbj1NYXRoLmZsb29yKHQvMjQpO3QtPTI0Km4sbiYmKGUrPW4rImQgIik7bGV0IGk9TWF0aC5mbG9vcih0KTt0LT1pLHQqPTYwLChpfHxuKSYmKGUrPWkrImggIik7bGV0IHI9TWF0aC5mbG9vcih0KTtyZXR1cm4gdC09cix0Kj02MCwocnx8aXx8bikmJihlKz1yKyJtICIpLGUrTWF0aC5mbG9vcih0KSsicyJ9O2Z1bmN0aW9uIEFUdCh0KXtzd2l0Y2godCl7Y2FzZSB4VHQuU1RFUDpyZXR1cm4gTVR0KCk7Y2FzZSB4VHQuV0FMTF9USU1FOnJldHVybihmdW5jdGlvbiBlKCl7bGV0IHQ9bmV3IHJPLlNjYWxlcy5UaW1lO3JldHVybntzY2FsZTp0LGF4aXM6bmV3IHJPLkF4ZXMuVGltZSh0LCJib3R0b20iKSxhY2Nlc3Nvcjp0PT50LndhbGxfdGltZX19KSgpO2Nhc2UgeFR0LlJFTEFUSVZFOnJldHVybihmdW5jdGlvbiBuKCl7bGV0IHQ9bmV3IHJPLlNjYWxlcy5MaW5lYXI7cmV0dXJue3NjYWxlOnQsYXhpczpuZXcgck8uQXhlcy5OdW1lcmljKHQsImJvdHRvbSIpLGFjY2Vzc29yOlRUdH19KSgpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHhUeXBlOiAiK3QpfX12YXIga1R0O2Z1bmN0aW9uIExUdCh0KXtyZXR1cm4gY2xhc3MgZXh0ZW5kcyB0e2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmxvYWRLZXk9IiIsdGhpcy5kYXRhVG9Mb2FkPVtdLHRoaXMuZ2V0RGF0YUxvYWROYW1lPXQ9PlN0cmluZyh0KSx0aGlzLmRhdGFMb2FkaW5nPSExLHRoaXMuZGF0YUxvYWRlZEF0TGVhc3RPbmNlPSExLHRoaXMuX2lzQ29ubmVjdGVkPSExLHRoaXMuX2RhdGFMb2FkU3RhdGU9bmV3IE1hcCx0aGlzLl9jYW5jZWxsZXI9bmV3IFhSLHRoaXMuX2xvYWREYXRhQXN5bmM9bnVsbCx0aGlzLl9sb2FkRGF0YT1TZS5leHBvcnRzLnRocm90dGxlKHRoaXMuX2xvYWREYXRhSW1wbCwxMDAse2xlYWRpbmc6ITAsdHJhaWxpbmc6ITB9KX1jb25uZWN0ZWRDYWxsYmFjaygpe3N1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCksdGhpcy5faXNDb25uZWN0ZWQ9ITB9ZGlzY29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpLHRoaXMuX2lzQ29ubmVjdGVkPSExfXN0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybnthY3RpdmU6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2xvYWREYXRhSWZBY3RpdmUifSxfaXNDb25uZWN0ZWQ6e3R5cGU6Qm9vbGVhbn0sbG9hZEtleTp7dHlwZTpTdHJpbmd9LGRhdGFUb0xvYWQ6e3R5cGU6QXJyYXl9LGdldERhdGFMb2FkTmFtZTp7dHlwZTpPYmplY3R9LGxvYWREYXRhQ2FsbGJhY2s6e3R5cGU6T2JqZWN0fSxyZXF1ZXN0RGF0YTp7dHlwZTpPYmplY3R9fX1zdGF0aWMgZ2V0IG9ic2VydmVycygpe3JldHVyblsiX2RhdGFUb0xvYWRDaGFuZ2VkKF9pc0Nvbm5lY3RlZCwgZGF0YVRvTG9hZC4qKSJdfW9uTG9hZEZpbmlzaCgpe31yZWxvYWQoKXt0aGlzLl9kYXRhTG9hZFN0YXRlLmNsZWFyKCksdGhpcy5fbG9hZERhdGEoKX1yZXNldCgpe251bGwhPXRoaXMuX2xvYWREYXRhQXN5bmMmJihjbGVhclRpbWVvdXQodGhpcy5fbG9hZERhdGFBc3luYyksdGhpcy5fbG9hZERhdGFBc3luYz1udWxsKSx0aGlzLl9jYW5jZWxsZXImJnRoaXMuX2NhbmNlbGxlci5jYW5jZWxBbGwoKSx0aGlzLl9kYXRhTG9hZFN0YXRlJiZ0aGlzLl9kYXRhTG9hZFN0YXRlLmNsZWFyKCksdGhpcy5faXNDb25uZWN0ZWQmJnRoaXMuX2xvYWREYXRhKCl9X2RhdGFUb0xvYWRDaGFuZ2VkKCl7dGhpcy5faXNDb25uZWN0ZWQmJnRoaXMuX2xvYWREYXRhKCl9ZGV0YWNoZWQoKXtudWxsIT10aGlzLl9sb2FkRGF0YUFzeW5jJiYoY2xlYXJUaW1lb3V0KHRoaXMuX2xvYWREYXRhQXN5bmMpLHRoaXMuX2xvYWREYXRhQXN5bmM9bnVsbCl9X2xvYWREYXRhSWZBY3RpdmUoKXt0aGlzLmFjdGl2ZSYmdGhpcy5fbG9hZERhdGEoKX1fbG9hZERhdGFJbXBsKCl7dGhpcy5hY3RpdmUmJihudWxsIT09dGhpcy5fbG9hZERhdGFBc3luYyYmY2xlYXJUaW1lb3V0KHRoaXMuX2xvYWREYXRhQXN5bmMpLHRoaXMuX2xvYWREYXRhQXN5bmM9c2V0VGltZW91dCh0aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoKHQ9PntpZih0LmNhbmNlbGxlZClyZXR1cm47dGhpcy5kYXRhTG9hZGluZz0hMDtjb25zdCBlPXRoaXMuZGF0YVRvTG9hZC5maWx0ZXIoKHQ9Pntjb25zdCBlPXRoaXMuZ2V0RGF0YUxvYWROYW1lKHQpO3JldHVybiF0aGlzLl9kYXRhTG9hZFN0YXRlLmhhcyhlKX0pKTtmb3IoY29uc3QgdCBvZiBlKXtjb25zdCBlPXRoaXMuZ2V0RGF0YUxvYWROYW1lKHQpO3RoaXMuX2RhdGFMb2FkU3RhdGUuc2V0KGUsa1R0LkxPQURJTkcpfWNvbnN0IG49dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKCh0PT57aWYodC5jYW5jZWxsZWQpcmV0dXJuO2NvbnN0e2l0ZW06ZSxkYXRhOm59PXQudmFsdWUsaT10aGlzLmdldERhdGFMb2FkTmFtZShlKTt0aGlzLl9kYXRhTG9hZFN0YXRlLnNldChpLGtUdC5MT0FERUQpLHRoaXMubG9hZERhdGFDYWxsYmFjayh0aGlzLGUsbil9KSksaT10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoKHQ9PntpZighdC5jYW5jZWxsZWQpe2NvbnN0IHQ9bmV3IFNldChlLm1hcCgodD0+dGhpcy5nZXREYXRhTG9hZE5hbWUodCkpKSk7dGhpcy5kYXRhVG9Mb2FkLnNvbWUoKGU9PnQuaGFzKHRoaXMuZ2V0RGF0YUxvYWROYW1lKGUpKSkpJiZ0aGlzLm9uTG9hZEZpbmlzaCgpLHRoaXMuX2xvYWREYXRhQXN5bmM9bnVsbCx0aGlzLmRhdGFMb2FkZWRBdExlYXN0T25jZT0hMH1BcnJheS5mcm9tKHRoaXMuX2RhdGFMb2FkU3RhdGUudmFsdWVzKCkpLmluY2x1ZGVzKGtUdC5MT0FESU5HKXx8KHRoaXMuZGF0YUxvYWRpbmc9ITEpfSkpO3RoaXMucmVxdWVzdERhdGEoZSxuLCgoKT0+aSh2b2lkIDApKSl9KSkpKX19fSEoZnVuY3Rpb24odCl7dFt0LkxPQURJTkc9MF09IkxPQURJTkciLHRbdC5MT0FERUQ9MV09IkxPQURFRCJ9KShrVHR8fChrVHQ9e30pKSxlbCh7bW9kdWxlTmFtZToicGxvdHRhYmxlLXN0eWxlIixzdHlsZUNvbnRlbnQ6IlxuICAgIFxuLnBsb3R0YWJsZS1jb2xvcnMtMCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1Mjc5Yzc7IC8qIElORElHTyAqL1xufVxuXG4ucGxvdHRhYmxlLWNvbG9ycy0xIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZkMzczZTsgLyogQ09SQUxfUkVEICovXG59XG5cbi5wbG90dGFibGUtY29sb3JzLTIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjNjMjYxOyAvKiBGRVJOICovXG59XG5cbi5wbG90dGFibGUtY29sb3JzLTMge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFkNDE5OyAvKiBCUklHSFRfU1VOICovXG59XG5cbi5wbG90dGFibGUtY29sb3JzLTQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMmMyYjZmOyAvKiBKQUNBUlRBICovXG59XG5cbi5wbG90dGFibGUtY29sb3JzLTUge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY3OTM5OyAvKiBCVVJOSU5HX09SQU5HRSAqL1xufVxuXG4ucGxvdHRhYmxlLWNvbG9ycy02IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2RiMmU2NTsgLyogQ0VSSVNFX1JFRCAqL1xufVxuXG4ucGxvdHRhYmxlLWNvbG9ycy03IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzk5Y2U1MDsgLyogQ09OSUZFUiAqL1xufVxuXG4ucGxvdHRhYmxlLWNvbG9ycy04IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzk2MjU2NTsgLyogUk9ZQUxfSEVBVEggKi9cbn1cblxuLnBsb3R0YWJsZS1jb2xvcnMtOSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwNmNjY2M7IC8qIFJPQklOU19FR0dfQkxVRSAqL1xufVxuXG4vKipcbiAqIFVzZXItc3VwcGxpZWQgcmVuZGVyVG8gZWxlbWVudC5cbiAqL1xuLnBsb3R0YWJsZSB7XG4gIGRpc3BsYXk6IGJsb2NrOyAvKiBtdXN0IGJlIGJsb2NrIGVsZW1lbnRzIGZvciB3aWR0aC9oZWlnaHQgY2FsY3VsYXRpb25zIHRvIHdvcmsgaW4gRmlyZWZveC4gKi9cbiAgcG9pbnRlci1ldmVudHM6IHZpc2libGVGaWxsO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIC8qKlxuICAgKiBQcmUgMy4wLCB1c2VycyBjb3VsZCBzZXQgdGhlIGRpbWVuc2lvbiBvZiB0aGUgcm9vdCBlbGVtZW50IGluIHR3byB3YXlzOiBlaXRoZXIgdXNpbmcgQ1NTXG4gICAqIChpbmxpbmUgb3IgdGhyb3VnaCBhIHN0eWxlc2hlZXQpLCBvciB1c2luZyB0aGUgU1ZHIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzLiBCeSBkZWZhdWx0LCB3ZVxuICAgKiBzZXQgdGhlIFNWRyB3aWR0aC9oZWlnaHQgYXR0cmlidXRlcyB0byAxMDAlLlxuICAgKlxuICAgKiBQb3N0IDMuMCB0aGUgcm9vdCBlbGVtZW50IGlzIGFsd2F5cyBhIG5vcm1hbCBkaXYgYW5kIHRoZSBvbmx5IHdheSB0byBzZXQgdGhlIGRpbWVuc2lvbnMgaXNcbiAgICogdG8gdXNlIENTUy4gVG8gcmVwbGljYXRlIHRoZSBcIjEwMCUtYnktZGVmYXVsdFwiIGJlaGF2aW9yLCB3ZSBhcHBseSB3aWR0aC9oZWlnaHQgMTAwJS5cbiAgICovXG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG59XG5cbi8qKlxuICogVGhlIF9lbGVtZW50IHRoYXQgcm9vdHMgZWFjaCBDb21wb25lbnQncyBET00uXG4gKi9cbi5wbG90dGFibGUgLmNvbXBvbmVudCB7XG4gIC8qIEFsbG93IGNvbXBvbmVudHMgdG8gYmUgcG9zaXRpb25lZCB3aXRoIGV4cGxpY2l0IGxlZnQvdG9wL3dpZHRoL2hlaWdodCBzdHlsZXMgKi9cbiAgcG9zaXRpb246IGFic29sdXRlO1xufVxuXG4ucGxvdHRhYmxlIC5iYWNrZ3JvdW5kLWNvbnRhaW5lcixcbi5wbG90dGFibGUgLmNvbnRlbnQsXG4ucGxvdHRhYmxlIC5mb3JlZ3JvdW5kLWNvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbn1cblxuLyoqXG4gKiBEb24ndCBhbGxvdyBzdmcgZWxlbWVudHMgYWJvdmUgdGhlIGNvbnRlbnQgdG8gc3RlYWwgZXZlbnRzXG4gKi9cbi5wbG90dGFibGUgLmZvcmVncm91bmQtY29udGFpbmVyIHtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy1oaWRkZW4ge1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ucGxvdHRhYmxlIC5jb21wb25lbnQtb3ZlcmZsb3ctdmlzaWJsZSB7XG4gIG92ZXJmbG93OiB2aXNpYmxlO1xufVxuXG4ucGxvdHRhYmxlIC5wbG90LWNhbnZhcy1jb250YWluZXIge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4ucGxvdHRhYmxlIC5wbG90LWNhbnZhcyB7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIC8qKlxuICAgKiBQbGF5IHdlbGwgd2l0aCBkZWZlcnJlZCByZW5kZXJpbmcuXG4gICAqL1xuICB0cmFuc2Zvcm0tb3JpZ2luOiAwcHggMHB4IDBweDtcbn1cblxuLnBsb3R0YWJsZSB0ZXh0IHtcbiAgdGV4dC1yZW5kZXJpbmc6IGdlb21ldHJpY1ByZWNpc2lvbjtcbn1cblxuLnBsb3R0YWJsZSAubGFiZWwgdGV4dCB7XG4gIGZpbGw6ICMzMjMxM0Y7XG59XG5cbi5wbG90dGFibGUgLmJhci1sYWJlbC10ZXh0LWFyZWEgdGV4dCxcbi5wbG90dGFibGUgLnNjYXR0ZXItbGFiZWwtdGV4dC1hcmVhIHRleHQge1xuICBmb250LXNpemU6IDEycHg7XG59XG5cbi5wbG90dGFibGUgLmxhYmVsLWFyZWEgdGV4dCB7XG4gIGZpbGw6ICMzMjMxM0Y7XG4gIGZvbnQtc2l6ZTogMTRweDtcbn1cblxuLnBsb3R0YWJsZSAubGlnaHQtbGFiZWwgdGV4dCB7XG4gIGZpbGw6IHdoaXRlO1xufVxuXG4ucGxvdHRhYmxlIC5kYXJrLWxhYmVsIHRleHQge1xuICBmaWxsOiAjMzIzMTNGO1xufVxuXG4ucGxvdHRhYmxlIC5vZmYtYmFyLWxhYmVsIHRleHQge1xuICBmaWxsOiAjMzIzMTNGO1xufVxuXG4ucGxvdHRhYmxlIC5zdGFja2VkLWJhci1sYWJlbCB0ZXh0IHtcbiAgZmlsbDogIzMyMzEzRjtcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xufVxuXG4ucGxvdHRhYmxlIC5zdGFja2VkLWJhci1wbG90IC5vZmYtYmFyLWxhYmVsIHtcbiAgLyogSEFDS0hBQ0sgIzI3OTU6IGNvcnJlY3Qgb2ZmLWJhciBsYWJlbCBsb2dpYyB0byBiZSBpbXBsZW1lbnRlZCBvbiBTdGFja2VkQmFyICovXG4gIHZpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50O1xufVxuXG4ucGxvdHRhYmxlIC5heGlzLWxhYmVsIHRleHQge1xuICBmb250LXNpemU6IDEwcHg7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBsZXR0ZXItc3BhY2luZzogMXB4O1xuICBsaW5lLWhlaWdodDogbm9ybWFsO1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xufVxuXG4ucGxvdHRhYmxlIC50aXRsZS1sYWJlbCB0ZXh0IHtcbiAgZm9udC1zaXplOiAyMHB4O1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLnBsb3R0YWJsZSAuYXhpcyBsaW5lLmJhc2VsaW5lIHtcbiAgc3Ryb2tlOiAjQ0NDO1xuICBzdHJva2Utd2lkdGg6IDFweDtcbn1cblxuLnBsb3R0YWJsZSAuYXhpcyBsaW5lLnRpY2stbWFyayB7XG4gIHN0cm9rZTogI0NDQztcbiAgc3Ryb2tlLXdpZHRoOiAxcHg7XG59XG5cbi5wbG90dGFibGUgLmF4aXMgdGV4dCB7XG4gIGZpbGw6ICMzMjMxM0Y7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgZm9udC13ZWlnaHQ6IDIwMDtcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcbn1cblxuLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1jaXJjbGUge1xuICBmaWxsOiB3aGl0ZTtcbiAgc3Ryb2tlLXdpZHRoOiAxcHg7XG4gIHN0cm9rZTogI0NDQztcbn1cblxuLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1saW5lIHtcbiAgc3Ryb2tlOiAjQ0NDO1xuICBzdHJva2Utd2lkdGg6IDFweDtcbn1cblxuLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1yZWN0IHtcbiAgc3Ryb2tlOiAjQ0NDO1xuICBzdHJva2Utd2lkdGg6IDFweDtcbiAgZmlsbDogd2hpdGU7XG59XG5cbi5wbG90dGFibGUgLmJhci1wbG90IC5iYXNlbGluZSB7XG4gIHN0cm9rZTogIzk5OTtcbn1cblxuLnBsb3R0YWJsZSAuZ3JpZGxpbmVzIGxpbmUge1xuICBzdHJva2U6ICMzQzNDM0M7IC8qIGhhY2toYWNrOiBncmlkbGluZXMgc2hvdWxkIGJlIHNvbGlkOyBzZWUgIzgyMCAqL1xuICBvcGFjaXR5OiAwLjI1O1xuICBzdHJva2Utd2lkdGg6IDFweDtcbn1cblxuLnBsb3R0YWJsZSAuc2VsZWN0aW9uLWJveC1sYXllciAuc2VsZWN0aW9uLWFyZWEge1xuICBmaWxsOiBibGFjaztcbiAgZmlsbC1vcGFjaXR5OiAwLjAzO1xuICBzdHJva2U6ICNDQ0M7XG59XG4vKiBEcmFnQm94TGF5ZXIgKi9cbi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlIC5kcmFnLWVkZ2UtbHIge1xuICBjdXJzb3I6IGV3LXJlc2l6ZTtcbn1cbi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLnktcmVzaXphYmxlIC5kcmFnLWVkZ2UtdGIge1xuICBjdXJzb3I6IG5zLXJlc2l6ZTtcbn1cblxuLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLXRsIHtcbiAgY3Vyc29yOiBud3NlLXJlc2l6ZTtcbn1cbi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci10ciB7XG4gIGN1cnNvcjogbmVzdy1yZXNpemU7XG59XG4ucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItYmwge1xuICBjdXJzb3I6IG5lc3ctcmVzaXplO1xufVxuLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLWJyIHtcbiAgY3Vyc29yOiBud3NlLXJlc2l6ZTtcbn1cblxuLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIubW92YWJsZSAuc2VsZWN0aW9uLWFyZWEge1xuICBjdXJzb3I6IG1vdmU7IC8qIElFIGZhbGxiYWNrICovXG4gIGN1cnNvcjogLW1vei1ncmFiO1xuICBjdXJzb3I6IC13ZWJraXQtZ3JhYjtcbiAgY3Vyc29yOiBncmFiO1xufVxuXG4ucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci5tb3ZhYmxlIC5zZWxlY3Rpb24tYXJlYTphY3RpdmUge1xuICBjdXJzb3I6IC1tb3otZ3JhYmJpbmc7XG4gIGN1cnNvcjogLXdlYmtpdC1ncmFiYmluZztcbiAgY3Vyc29yOiBncmFiYmluZztcbn1cbi8qIC9EcmFnQm94TGF5ZXIgKi9cblxuLnBsb3R0YWJsZSAuZ3VpZGUtbGluZS1sYXllciBsaW5lLmd1aWRlLWxpbmUge1xuICBzdHJva2U6ICNDQ0M7XG4gIHN0cm9rZS13aWR0aDogMXB4O1xufVxuXG4ucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC52ZXJ0aWNhbCBsaW5lLmRyYWctZWRnZSB7XG4gIGN1cnNvcjogZXctcmVzaXplO1xufVxuXG4ucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC5ob3Jpem9udGFsIGxpbmUuZHJhZy1lZGdlIHtcbiAgY3Vyc29yOiBucy1yZXNpemU7XG59XG5cbi5wbG90dGFibGUgLmxlZ2VuZCB0ZXh0IHtcbiAgZmlsbDogIzMyMzEzRjtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcbn1cblxuLnBsb3R0YWJsZSAuaW50ZXJwb2xhdGVkLWNvbG9yLWxlZ2VuZCByZWN0LnN3YXRjaC1ib3VuZGluZy1ib3gge1xuICBmaWxsOiBub25lO1xuICBzdHJva2U6ICNDQ0M7XG4gIHN0cm9rZS13aWR0aDogMXB4O1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLnBsb3R0YWJsZSAud2F0ZXJmYWxsLXBsb3QgbGluZS5jb25uZWN0b3Ige1xuICBzdHJva2U6ICNDQ0M7XG4gIHN0cm9rZS13aWR0aDogMXB4O1xufVxuXG4ucGxvdHRhYmxlIC5waWUtcGxvdCAuYXJjLm91dGxpbmUge1xuICBzdHJva2UtbGluZWpvaW46IHJvdW5kO1xufVxuXG4ifSk7Y29uc3QgUFR0PVsxLDAsMCwxLDAsMF07Y2xhc3MgTlR0IGV4dGVuZHMgck8uVXRpbHMuVHJhbnNsYXRvcntjb21wdXRlUG9zaXRpb24odCxlKXtjb25zdCBuPXt4OnQseTplfSxpPShmdW5jdGlvbiByKHQpe2NvbnN0IGU9KGZ1bmN0aW9uIG4odCl7Y29uc3QgZT1bXTtmb3IoO3QmJnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDspaWYoZS5wdXNoKHQpLHQuYXNzaWduZWRTbG90KXQ9dC5hc3NpZ25lZFNsb3Q7ZWxzZSBpZih0LnBhcmVudEVsZW1lbnQpdD10LnBhcmVudEVsZW1lbnQ7ZWxzZXtjb25zdCBlPXQucGFyZW50Tm9kZTt0PWUgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50P2UuaG9zdDplIT09dD9lOm51bGx9cmV0dXJuIGV9KSh0KTtsZXQgaT1QVHQscj1udWxsO2Zvcihjb25zdCB0IG9mIGUpe2NvbnN0IGU9ck8uVXRpbHMuRE9NLmdldEVsZW1lbnRUcmFuc2Zvcm0odCk7aWYobnVsbCE9ZSl7Y29uc3Qgbj10LmNsaWVudFdpZHRoLzIscj10LmNsaWVudEhlaWdodC8yO2k9ck8uVXRpbHMuTWF0aC5tdWx0aXBseVRyYW5zbGF0ZShpLFtuLHJdKSxpPXJPLlV0aWxzLk1hdGgubXVsdGlwbHlNYXRyaXgoaSxyTy5VdGlscy5NYXRoLmludmVydE1hdHJpeChlKSksaT1yTy5VdGlscy5NYXRoLm11bHRpcGx5VHJhbnNsYXRlKGksWy1uLC1yXSl9bGV0IG49dC5zY3JvbGxMZWZ0LG89dC5zY3JvbGxUb3A7bnVsbCE9PXImJnQhPT1yfHwobi09dC5vZmZzZXRMZWZ0K3QuY2xpZW50TGVmdCxvLT10Lm9mZnNldFRvcCt0LmNsaWVudFRvcCxyPXQub2Zmc2V0UGFyZW50KSxpPXJPLlV0aWxzLk1hdGgubXVsdGlwbHlUcmFuc2xhdGUoaSxbbixvXSl9cmV0dXJuIGl9KSh0aGlzLl9yb290RWxlbWVudCk7cmV0dXJuIG51bGw9PWk/bjpyTy5VdGlscy5NYXRoLmFwcGx5VHJhbnNmb3JtKGksbil9fWNsYXNzIElUdCBleHRlbmRzIHJPLkRpc3BhdGNoZXJzLk1vdXNle2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuX2V2ZW50VGFyZ2V0PXQucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpLHRoaXMuX3RyYW5zbGF0b3I9bmV3IE5UdCh0LnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKSl9c3RhdGljIGdldERpc3BhdGNoZXIodCl7Y29uc3QgZT10LnJvb3QoKS5yb290RWxlbWVudCgpO2xldCBuPWVbSVR0Ll9ESVNQQVRDSEVSX0tFWV07cmV0dXJuIG58fChuPW5ldyBJVHQodCksZVtJVHQuX0RJU1BBVENIRVJfS0VZXT1uKSxufX1jbGFzcyBSVHQgZXh0ZW5kcyByTy5EaXNwYXRjaGVycy5Ub3VjaHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLl9ldmVudFRhcmdldD10LnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKSx0aGlzLl90cmFuc2xhdG9yPW5ldyBOVHQodC5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCkpfXN0YXRpYyBnZXREaXNwYXRjaGVyKHQpe2NvbnN0IGU9dC5yb290KCkucm9vdEVsZW1lbnQoKTtsZXQgbj1lW1JUdC5fRElTUEFUQ0hFUl9LRVldO3JldHVybiBufHwobj1uZXcgUlR0KHQpLGVbUlR0Ll9ESVNQQVRDSEVSX0tFWV09biksbn19ck8uSW50ZXJhY3Rpb24ucHJvdG90eXBlLl9pc0luc2lkZUNvbXBvbmVudD1mdW5jdGlvbih0KXtyZXR1cm4gMDw9dC54JiYwPD10LnkmJnQueDx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkmJnQueTx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLmhlaWdodCgpfTtjbGFzcyBPVHQgZXh0ZW5kcyByTy5JbnRlcmFjdGlvbnMuUG9pbnRlcntfYW5jaG9yKHQpe2NvbnN0IGU9dGhpcztlLl9pc0FuY2hvcmVkPSEwLGUuX21vdXNlRGlzcGF0Y2hlcj1JVHQuZ2V0RGlzcGF0Y2hlcihlLl9jb21wb25lbnRBdHRhY2hlZFRvKSxlLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZU1vdmUoZS5fbW91c2VNb3ZlQ2FsbGJhY2spLGUuX3RvdWNoRGlzcGF0Y2hlcj1SVHQuZ2V0RGlzcGF0Y2hlcihlLl9jb21wb25lbnRBdHRhY2hlZFRvKSxlLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KGUuX3RvdWNoU3RhcnRDYWxsYmFjayl9fXZhciB6VHQ7IShmdW5jdGlvbih0KXt0LkFVVE89ImF1dG8iLHQuQk9UVE9NPSJib3R0b20iLHQuUklHSFQ9InJpZ2h0In0pKHpUdHx8KHpUdD17fSkpO2NvbnN0IERUdD17Ym94U2hhZG93OiIwIDFweCA0cHggcmdiYSgwLCAwLCAwLCAuMykiLG9wYWNpdHk6MCxwb3NpdGlvbjoiZml4ZWQiLHdpbGxDaGFuZ2U6InRyYW5zZm9ybSIsekluZGV4OjV9O2xldCBCVHQ9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnBvc2l0aW9uPXpUdC5BVVRPLHRoaXMubWluRGlzdEZyb21FZGdlPTE1LHRoaXMuX3N0eWxlQ2FjaGU9bnVsbCx0aGlzLl9yYWY9bnVsbCx0aGlzLl90dW5uZWw9bnVsbH1yZWFkeSgpe3RoaXMuX3N0eWxlQ2FjaGU9bnVsbCx0aGlzLl9yYWY9bnVsbCx0aGlzLl90dW5uZWw9bnVsbH1hdHRhY2hlZCgpe3RoaXMuX3R1bm5lbD10aGlzLl9jcmVhdGVUdW5uZWwoKSx0aGlzLl9oaWRlT25CbHVyPSgpPT57ZG9jdW1lbnQuaGlkZGVuJiZ0aGlzLmhpZGUoKX0sd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHRoaXMuX2hpZGVPbkJsdXIpfWRldGFjaGVkKCl7dGhpcy5oaWRlKCksdGhpcy5fcmVtb3ZlVHVubmVsKHRoaXMuX3R1bm5lbCksdGhpcy5fdHVubmVsPW51bGwsd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHRoaXMuX2hpZGVPbkJsdXIpfWNvbnRlbnQoKXtyZXR1cm4gdGhpcy5fdHVubmVsLnNoYWRvd1Jvb3R9aGlkZSgpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yYWYpLHRoaXMuX3N0eWxlQ2FjaGU9bnVsbCx0aGlzLl90dW5uZWwuc3R5bGUub3BhY2l0eT0wfXVwZGF0ZUFuZFBvc2l0aW9uKHQpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yYWYpLHRoaXMuX3JhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+e3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5fcmVwb3NpdGlvbkltcGwodCl9KSl9X3JlcG9zaXRpb25JbXBsKHQpe2NvbnN0IGU9dGhpcy5fdHVubmVsLG49dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxpPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscj13aW5kb3cuaW5uZXJIZWlnaHQsbz1kb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLGE9bi50b3Ascz1hK24uaGVpZ2h0LGw9aS5oZWlnaHQrMjA7bGV0IGM9bnVsbCx1PU1hdGgubWF4KHRoaXMubWluRGlzdEZyb21FZGdlLG4ubGVmdCksaD1udWxsLGQ9YTt0aGlzLnBvc2l0aW9uPT16VHQuUklHSFQ/dT1uLnJpZ2h0OihkPXMrMjAsbzx1K2kud2lkdGgrdGhpcy5taW5EaXN0RnJvbUVkZ2UmJih1PW51bGwsaD10aGlzLm1pbkRpc3RGcm9tRWRnZSkpLHRoaXMucG9zaXRpb249PXpUdC5BVVRPJiZuLnRvcC1sPjAmJnI8bi50b3Arbi5oZWlnaHQrbCYmKGQ9bnVsbCxjPXItYSsyMCk7Y29uc3QgcD17Y29udGFpbjoiY29udGVudCIsb3BhY2l0eToxLGxlZnQ6dT9gJHt1fXB4YDpudWxsLHJpZ2h0Omg/YCR7aH1weGA6bnVsbCx0b3A6ZD9gJHtkfXB4YDpudWxsLGJvdHRvbTpjP2Ake2N9cHhgOm51bGx9O1NlLmV4cG9ydHMuaXNFcXVhbCh0aGlzLl9zdHlsZUNhY2hlLHApfHwoT2JqZWN0LmFzc2lnbihlLnN0eWxlLHApLHRoaXMuX3N0eWxlQ2FjaGU9cCl9X2NyZWF0ZVR1bm5lbCgpe2lmKCF0aGlzLmNvbnRlbnRDb21wb25lbnROYW1lKXRocm93IG5ldyBSYW5nZUVycm9yKCJSZXF1aXJlIGBjb250ZW50Q29tcG9uZW50TmFtZWAgdG8gYmUgYSBuYW1lIG9mIGEgUG9seW1lciBjb21wb25lbnQiKTtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5jb250ZW50Q29tcG9uZW50TmFtZSk7cmV0dXJuIE9iamVjdC5hc3NpZ24odC5zdHlsZSxEVHQpLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodCksdH1fcmVtb3ZlVHVubmVsKHQpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodCl9fTt0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxCVHQucHJvdG90eXBlLCJjb250ZW50Q29tcG9uZW50TmFtZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxCVHQucHJvdG90eXBlLCJwb3NpdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxCVHQucHJvdG90eXBlLCJtaW5EaXN0RnJvbUVkZ2UiLHZvaWQgMCksQlR0PXQoW2koInZ6LWNoYXJ0LXRvb2x0aXAiKV0sQlR0KTtjb25zdCBIVHQ9bXkoIi4yfmUiKSxGVHQ9bXkoIi40fnIiKSxWVHQ9bXkoIix+Iik7ZnVuY3Rpb24gVVR0KHQpe2lmKDA9PT10KXJldHVybiIwIjtjb25zdCBlPU1hdGguYWJzKHQpO3JldHVybiBlPj0xZTR8fGU8LjAwMT9IVHQodCk6RlR0KHQpfWNvbnN0IGpUdD17Zm9ybWF0VGljazpVVHQsZm9ybWF0U2hvcnQ6VVR0LGZvcm1hdFJlYWRhYmxlKHQpe2NvbnN0IGU9TWF0aC5hYnModCk7cmV0dXJuIGU+PTFlNHx8ZTwuMDAxP0hUdCh0KTpWVHQodCl9LGZvcm1hdExvbmc6VlR0fTtteSgiMC4zfnMiKSxteSgiLC4zfmYiKSxteSgiLjR+Iik7Y29uc3QgR1R0PWNBKCkudGlja0Zvcm1hdCgpO2xldCBXVHQ7Y29uc3QgcVR0PXtmb3JtYXRUaWNrOnQ9PkdUdChuZXcgRGF0ZSh0KSksZm9ybWF0U2hvcnQ6dD0+bmV3IERhdGUodCkudG9Mb2NhbGVTdHJpbmcoV1R0LHt5ZWFyOiJudW1lcmljIixtb250aDoic2hvcnQiLGRheToibnVtZXJpYyIsaG91cjoibnVtZXJpYyIsbWludXRlOiJudW1lcmljIixzZWNvbmQ6Im51bWVyaWMifSksZm9ybWF0UmVhZGFibGU6dD0+bmV3IERhdGUodCkudG9Mb2NhbGVTdHJpbmcoV1R0LHt5ZWFyOiJudW1lcmljIixtb250aDoic2hvcnQiLGRheToibnVtZXJpYyIsaG91cjoibnVtZXJpYyIsbWludXRlOiJudW1lcmljIixzZWNvbmQ6Im51bWVyaWMiLHRpbWVab25lTmFtZToic2hvcnQifSksZm9ybWF0TG9uZzp0PT5uZXcgRGF0ZSh0KS50b0xvY2FsZVN0cmluZyhXVHQse3llYXI6Im51bWVyaWMiLG1vbnRoOiJsb25nIixkYXk6Im51bWVyaWMiLGhvdXI6Im51bWVyaWMiLG1pbnV0ZToibnVtZXJpYyIsc2Vjb25kOiJudW1lcmljIix0aW1lWm9uZU5hbWU6InNob3J0IixmcmFjdGlvbmFsU2Vjb25kRGlnaXRzOjN9KX07dmFyIFlUdDshKGZ1bmN0aW9uKHQpe3RbdC5MSU5FQVI9MF09IkxJTkVBUiIsdFt0LkxPRzEwPTFdPSJMT0cxMCIsdFt0LlRJTUU9Ml09IlRJTUUifSkoWVR0fHwoWVR0PXt9KSk7Y2xhc3MgWFR0e2NvbnN0cnVjdG9yKCl7dGhpcy5kZWZhdWx0Rm9ybWF0dGVyPWpUdH10cmFuc2Zvcm0odCxlLG4pe2NvbnN0W2kscl09dCxvPXItaSxbYSxzXT1lO3JldHVybiAwPT09bz9hOihzLWEpL28qKG4taSkrYX1mb3J3YXJkKHQsZSxuKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0odCxlLG4pfXJldmVyc2UodCxlLG4pe3JldHVybiB0aGlzLnRyYW5zZm9ybShlLHQsbil9bmljZURvbWFpbih0KXtsZXRbZSxuXT10O2lmKG48ZSl0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgaW5wdXQ6IG1pbiBpcyBsYXJnZXIgdGhhbiBtYXgiKTtpZihuPT09ZSlyZXR1cm4gMD09PWU/Wy0xLDFdOmU8MD9bMiplLDBdOlswLDIqZV07Y29uc3QgaT1WTSgpLHI9LjA1KihuLWUrTnVtYmVyLkVQU0lMT04pLFtvLGFdPWkuZG9tYWluKFtlLXIsbityXSkubmljZSgpLmRvbWFpbigpO3JldHVybltvLGFdfXRpY2tzKHQsZSl7cmV0dXJuIFZNKCkuZG9tYWluKHQpLnRpY2tzKGUpfWlzU2FmZU51bWJlcih0KXtyZXR1cm4gTnVtYmVyLmlzRmluaXRlKHQpfX1jbGFzcyAkVHR7Y29uc3RydWN0b3IoKXt0aGlzLmRlZmF1bHRGb3JtYXR0ZXI9alR0fXRyYW5zZm9ybSh0KXtyZXR1cm4gTWF0aC5sb2cxMCh0PjA/dDpOdW1iZXIuTUlOX1ZBTFVFKX11bnRyYW5zZm9ybSh0KXtyZXR1cm4gTWF0aC5leHAodC9NYXRoLkxPRzEwRSl9Zm9yd2FyZCh0LGUsbil7aWYobjw9MClyZXR1cm4gZVswXTtjb25zdFtpLHJdPXQsW28sYV09ZSxzPXRoaXMudHJhbnNmb3JtKGkpLGw9dGhpcy50cmFuc2Zvcm0ociktcyxjPWEtbztyZXR1cm4gbj10aGlzLnRyYW5zZm9ybShuKSxjLyhsK051bWJlci5FUFNJTE9OKSoobi1zKStvfXJldmVyc2UodCxlLG4pe2NvbnN0W2kscl09dCxbbyxhXT1lLHM9dGhpcy50cmFuc2Zvcm0oaSksbD10aGlzLnRyYW5zZm9ybShyKTtyZXR1cm4gdGhpcy51bnRyYW5zZm9ybSgobC1zKS8oYS1vK051bWJlci5FUFNJTE9OKSoobi1vKStzKX1uaWNlRG9tYWluKHQpe2NvbnN0W2Usbl09dDtpZihlPm4pdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGlucHV0OiBtaW4gaXMgbGFyZ2VyIHRoYW4gbWF4Iik7Y29uc3QgaT1NYXRoLm1heChlLE51bWJlci5NSU5fVkFMVUUpLHI9TWF0aC5tYXgobixOdW1iZXIuTUlOX1ZBTFVFKTtyZXR1cm4gbjw9MD9bTnVtYmVyLk1JTl9WQUxVRSwxXTpbTWF0aC5tYXgoTnVtYmVyLk1JTl9WQUxVRSwuNSppKSwyKnJdfXRpY2tzKHQsZSl7Y29uc3Qgbj10WzBdPD0wP051bWJlci5NSU5fVkFMVUU6dFswXSxpPXRbMV08PTA/TnVtYmVyLk1JTl9WQUxVRTp0WzFdLHI9S00oKS5kb21haW4oW24saV0pLnRpY2tzKGUpO3JldHVybiByLmxlbmd0aD9yOnR9aXNTYWZlTnVtYmVyKHQpe3JldHVybiBOdW1iZXIuaXNGaW5pdGUodCkmJnQ+MH19Y2xhc3MgS1R0e2NvbnN0cnVjdG9yKCl7dGhpcy5zY2FsZT1jQSgpLHRoaXMuZGVmYXVsdEZvcm1hdHRlcj1xVHR9Zm9yd2FyZCh0LGUsbil7cmV0dXJuIHRoaXMuc2NhbGUuZG9tYWluKHQpLnJhbmdlKGUpKG4pfXJldmVyc2UodCxlLG4pe3JldHVybiB0aGlzLnNjYWxlLmRvbWFpbih0KS5yYW5nZShlKS5pbnZlcnQobikuZ2V0VGltZSgpfW5pY2VEb21haW4odCl7Y29uc3RbZSxuXT10aGlzLnNjYWxlLmRvbWFpbih0KS5uaWNlKCkuZG9tYWluKCk7cmV0dXJuW2UuZ2V0VGltZSgpLG4uZ2V0VGltZSgpXX10aWNrcyh0LGUpe3JldHVybiB0aGlzLnNjYWxlLmRvbWFpbih0KS50aWNrcyhlKS5tYXAoKHQ9PnQuZ2V0VGltZSgpKSl9aXNTYWZlTnVtYmVyKHQpe3JldHVybiBOdW1iZXIuaXNGaW5pdGUodCl9fWNsYXNzIFpUdCBleHRlbmRzIHJPLlNjYWxlcy5MaW5lYXJ7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX2lnbm9yZU91dGxpZXI9ITEsdGhpcy5wYWRQcm9wb3J0aW9uKC4yKX1zZXRWYWx1ZVByb3ZpZGVyRm9yRG9tYWluKHQpe3JldHVybiB0aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluPXQsdGhpc31fbmljZURvbWFpbih0LGUpe2NvbnN0W24saV09dDtyZXR1cm4oZnVuY3Rpb24gcih0KXtzd2l0Y2godCl7Y2FzZSBZVHQuTElORUFSOnJldHVybiBuZXcgWFR0O2Nhc2UgWVR0LkxPRzEwOnJldHVybiBuZXcgJFR0O2Nhc2UgWVR0LlRJTUU6cmV0dXJuIG5ldyBLVHQ7ZGVmYXVsdDp0aHJvdyBuZXcgUmFuZ2VFcnJvcihgU2NhbGVUeXBlICR7dH0gbm90IHN1cHBvcnRlZC5gKX19KShZVHQuTElORUFSKS5uaWNlRG9tYWluKFtuLGldKX1fZ2V0VW5ib3VuZGVkRXh0ZW50KHQpe2NvbnN0IGU9dGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXModCk7bGV0IG49dGhpcy5fZGVmYXVsdEV4dGVudCgpO2lmKDAhPT1lLmxlbmd0aCl7Y29uc3QgdD1bck8uVXRpbHMuTWF0aC5taW4oZSxuWzBdKSxyTy5VdGlscy5NYXRoLm1heChlLG5bMV0pXTtuPXRoaXMuX25pY2VEb21haW4odCl9cmV0dXJuIG59X2dldEFsbEluY2x1ZGVkVmFsdWVzKHQ9ITEpe2NvbnN0IGU9dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbj90aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluKCk6W107cmV0dXJuIHRoaXMuZXh0ZW50T2ZWYWx1ZXMoZSl9ZXh0ZW50T2ZWYWx1ZXModCl7Y29uc3QgZT10LmZpbHRlcigodD0+ck8uVXRpbHMuTWF0aC5pc1ZhbGlkTnVtYmVyKHQpKSk7bGV0IG49ZTtpZih0aGlzLmlnbm9yZU91dGxpZXIoKSl7Y29uc3QgdD1lLnNvcnQoKCh0LGUpPT50LWUpKSxpPUdsKHQsLjA1KSxyPUdsKHQsLjk1KTtuPWUuZmlsdGVyKCh0PT50Pj1pJiZ0PD1yKSl9Y29uc3QgaT1MbChuKTtyZXR1cm4gbnVsbD09aVswXXx8bnVsbD09aVsxXT9bXTppfWlnbm9yZU91dGxpZXIodCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdD8odGhpcy5faWdub3JlT3V0bGllcj10LHRoaXMpOnRoaXMuX2lnbm9yZU91dGxpZXJ9fWNsYXNzIEpUdCBleHRlbmRzIHJPLlF1YW50aXRhdGl2ZVNjYWxle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9pZ25vcmVPdXRsaWVyPSExfXNldFZhbHVlUHJvdmlkZXJGb3JEb21haW4odCl7cmV0dXJuIHRoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW49dCx0aGlzfWlnbm9yZU91dGxpZXIodCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdD8odGhpcy5faWdub3JlT3V0bGllcj10LHRoaXMpOnRoaXMuX2lnbm9yZU91dGxpZXJ9X2dldEFsbEluY2x1ZGVkVmFsdWVzKHQ9ITEpe2NvbnN0IGU9dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbj90aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluKCk6W107cmV0dXJuIHRoaXMuZXh0ZW50T2ZWYWx1ZXMoZSl9fWNvbnN0IFFUdD1NYXRoLnBvdygyLC0xMDc0KTtmdW5jdGlvbiB0Q3QodCl7cmV0dXJuIE1hdGgubG9nMTAodCl9ZnVuY3Rpb24gZUN0KHQpe3JldHVybiBNYXRoLnBvdygxMCx0KX1jbGFzcyBuQ3QgZXh0ZW5kcyBKVHR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX2QzTG9nU2NhbGU9S00oKSx0aGlzLnBhZFByb3BvcnRpb24oLjIpfXNjYWxlKHQpe3JldHVybiB0PD0wP05hTjp0aGlzLl9kM0xvZ1NjYWxlKHQpfWludmVydCh0KXtyZXR1cm4gdGhpcy5fZDNMb2dTY2FsZS5pbnZlcnQodCl9c2NhbGVUcmFuc2Zvcm1hdGlvbih0KXtyZXR1cm4gdGhpcy5zY2FsZSh0KX1pbnZlcnRlZFRyYW5zZm9ybWF0aW9uKHQpe3JldHVybiB0aGlzLmludmVydCh0KX1nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpe3JldHVybiB0aGlzLmRvbWFpbigpfXNldFRyYW5zZm9ybWF0aW9uRG9tYWluKHQpe3RoaXMuZG9tYWluKHQpfWdldFRyYW5zZm9ybWF0aW9uRXh0ZW50KCl7cmV0dXJuIHRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCl9X2dldERvbWFpbigpe3JldHVybiB0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWlufV9zZXREb21haW4odCl7dGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbj10O2NvbnN0W2Usbl09dDtzdXBlci5fc2V0RG9tYWluKFtNYXRoLm1heChRVHQsZSksbl0pfV9uaWNlRG9tYWluKHQsZSl7Y29uc3RbbixpXT10LHI9TWF0aC5tYXgodEN0KFFUdCksdEN0KG4pKSxvPXRDdChpKSxhPW8tcixzPWE/YSp0aGlzLnBhZFByb3BvcnRpb24oKToxO3JldHVybltlQ3QoTWF0aC5tYXgodEN0KFFUdCksci1zKSksZUN0KG8rcyldfV9nZXRVbmJvdW5kZWRFeHRlbnQodCl7Y29uc3QgZT10aGlzLl9nZXRBbGxJbmNsdWRlZFZhbHVlcyh0KTtsZXQgbj10aGlzLl9kZWZhdWx0RXh0ZW50KCk7aWYoMCE9PWUubGVuZ3RoKXtjb25zdCB0PVtyTy5VdGlscy5NYXRoLm1pbihlLG5bMF0pLHJPLlV0aWxzLk1hdGgubWF4KGUsblsxXSldO249dGhpcy5fbmljZURvbWFpbih0KX1yZXR1cm4gbn1fZ2V0QWxsSW5jbHVkZWRWYWx1ZXModD0hMSl7cmV0dXJuIHN1cGVyLl9nZXRBbGxJbmNsdWRlZFZhbHVlcygpLm1hcCgodD0+dD4wP3Q6UVR0KSl9X2RlZmF1bHRFeHRlbnQoKXtyZXR1cm5bMSwxMF19X2JhY2tpbmdTY2FsZURvbWFpbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9kM0xvZ1NjYWxlLmRvbWFpbigpOih0aGlzLl9kM0xvZ1NjYWxlLmRvbWFpbih0KSx0aGlzKX1fZ2V0UmFuZ2UoKXtyZXR1cm4gdGhpcy5fZDNMb2dTY2FsZS5yYW5nZSgpfV9zZXRSYW5nZSh0KXt0aGlzLl9kM0xvZ1NjYWxlLnJhbmdlKHQpfWRlZmF1bHRUaWNrcygpe3JldHVybiB0aGlzLl9kM0xvZ1NjYWxlLnRpY2tzKDEpfXRpY2tzKCl7cmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUudGlja3MoKX1leHRlbnRPZlZhbHVlcyh0KXtjb25zdCBlPXQuZmlsdGVyKCh0PT5yTy5VdGlscy5NYXRoLmlzVmFsaWROdW1iZXIodCkmJnQ+MCkpO2xldCBuPWU7aWYodGhpcy5pZ25vcmVPdXRsaWVyKCkpe2NvbnN0IHQ9ZS5tYXAodEN0KS5zb3J0KCgodCxlKT0+dC1lKSksaT1HbCh0LC4wNSkscj1HbCh0LC45NSk7bj10LmZpbHRlcigodD0+dD49aSYmdDw9cikpLm1hcChlQ3QpfWNvbnN0IGk9TGwobik7cmV0dXJuIG51bGw9PWlbMF18fG51bGw9PWlbMV0/W106aX19Y2xhc3MgaUN0IGV4dGVuZHMgck8uQ29tcG9uZW50cy5TZWxlY3Rpb25Cb3hMYXllcntjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIoKSx0aGlzLmVhc2VGbj1UZix0aGlzLl9hbmltYXRpb25UaW1lPTc1MCx0aGlzLnhTY2FsZSh0KSx0aGlzLnlTY2FsZShlKSx0aGlzLl9kcmFnSW50ZXJhY3Rpb249bmV3IHJPLkludGVyYWN0aW9ucy5EcmFnLHRoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb249bmV3IHJPLkludGVyYWN0aW9ucy5DbGljayx0aGlzLnNldHVwQ2FsbGJhY2tzKCksdGhpcy51bnpvb21NZXRob2Q9bix0aGlzLm9uRGV0YWNoKCgoKT0+e3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24uZGV0YWNoRnJvbSh0aGlzKSx0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoRnJvbSh0aGlzKX0pKSx0aGlzLm9uQW5jaG9yKCgoKT0+e3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24uYXR0YWNoVG8odGhpcyksdGhpcy5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKHRoaXMpfSkpfWludGVyYWN0aW9uU3RhcnQodCl7dGhpcy5vblN0YXJ0PXR9aW50ZXJhY3Rpb25FbmQodCl7dGhpcy5vbkVuZD10fWRyYWdJbnRlcmFjdGlvbigpe3JldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb259c2V0dXBDYWxsYmFja3MoKXtsZXQgdD0hMTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQoKHQ9Pnt0aGlzLmJvdW5kcyh7dG9wTGVmdDp0LGJvdHRvbVJpZ2h0OnR9KSx0aGlzLm9uU3RhcnQoKX0pKSx0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnKCgoZSxuKT0+e3RoaXMuYm91bmRzKHt0b3BMZWZ0OmUsYm90dG9tUmlnaHQ6bn0pLHRoaXMuYm94VmlzaWJsZSghMCksdD0hMH0pKSx0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnRW5kKCgoZSxuKT0+e3RoaXMuYm94VmlzaWJsZSghMSksdGhpcy5ib3VuZHMoe3RvcExlZnQ6ZSxib3R0b21SaWdodDpufSksdD90aGlzLnpvb20oKTp0aGlzLm9uRW5kKCksdD0hMX0pKSx0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uLm9uRG91YmxlQ2xpY2sodGhpcy51bnpvb20uYmluZCh0aGlzKSl9YW5pbWF0aW9uVGltZSh0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9hbmltYXRpb25UaW1lO2lmKHQ8MCl0aHJvdyBuZXcgRXJyb3IoImFuaW1hdGlvblRpbWUgY2Fubm90IGJlIG5lZ2F0aXZlIik7cmV0dXJuIHRoaXMuX2FuaW1hdGlvblRpbWU9dCx0aGlzfWVhc2UodCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJlYXNlIGZ1bmN0aW9uIG11c3QgYmUgYSBmdW5jdGlvbiIpO3JldHVybiAwPT09dCgwKSYmMT09PXQoMSl8fHJPLlV0aWxzLldpbmRvdy53YXJuKCJFYXNpbmcgZnVuY3Rpb24gZG9lcyBub3QgbWFpbnRhaW4gaW52YXJpYW50IGYoMCk9PTAgJiYgZigxKT09MS4gQmFkIGJlaGF2aW9yIG1heSByZXN1bHQuIiksdGhpcy5lYXNlRm49dCx0aGlzfXpvb20oKXtsZXQgdD10aGlzLnhFeHRlbnQoKVswXS52YWx1ZU9mKCksZT10aGlzLnhFeHRlbnQoKVsxXS52YWx1ZU9mKCksbj10aGlzLnlFeHRlbnQoKVsxXS52YWx1ZU9mKCksaT10aGlzLnlFeHRlbnQoKVswXS52YWx1ZU9mKCk7dCE9PWUmJm4hPT1pJiZ0aGlzLmludGVycG9sYXRlWm9vbSh0LGUsbixpKX11bnpvb20oKXtsZXQgdD10aGlzLnhTY2FsZSgpO3QuX2RvbWFpbk1pbj1udWxsLHQuX2RvbWFpbk1heD1udWxsO2xldCBlPXQuX2dldEV4dGVudCgpO3RoaXMueFNjYWxlKCkuZG9tYWluKGUpLHRoaXMudW56b29tTWV0aG9kKCl9aXNab29taW5nKHQpe3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5lbmFibGVkKCF0KSx0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uLmVuYWJsZWQoIXQpfWludGVycG9sYXRlWm9vbSh0LGUsbixpKXtsZXQgcj10aGlzLnhTY2FsZSgpLmRvbWFpbigpWzBdLnZhbHVlT2YoKSxvPXRoaXMueFNjYWxlKCkuZG9tYWluKClbMV0udmFsdWVPZigpLGE9dGhpcy55U2NhbGUoKS5kb21haW4oKVswXS52YWx1ZU9mKCkscz10aGlzLnlTY2FsZSgpLmRvbWFpbigpWzFdLnZhbHVlT2YoKSxsPXRoaXMuZWFzZUZuLGM9KHQsZSxuKT0+QmQodCxlKShsKG4pKTt0aGlzLmlzWm9vbWluZyghMCk7bGV0IHU9RGF0ZS5ub3coKSxoPSgpPT57bGV0IGw9RGF0ZS5ub3coKSxkPTA9PT10aGlzLl9hbmltYXRpb25UaW1lPzE6TWF0aC5taW4oMSwobC11KS90aGlzLl9hbmltYXRpb25UaW1lKSxwPWMocix0LGQpLGY9YyhvLGUsZCksbT1jKGEsbixkKSxnPWMocyxpLGQpO3RoaXMueFNjYWxlKCkuZG9tYWluKFtwLGZdKSx0aGlzLnlTY2FsZSgpLmRvbWFpbihbbSxnXSksZDwxP3JPLlV0aWxzLkRPTS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbChoKToodGhpcy5vbkVuZCgpLHRoaXMuaXNab29taW5nKCExKSl9O2goKX19dmFyIHJDdCxvQ3QsYUN0LHNDdDshKGZ1bmN0aW9uKHQpe3RbdC5OT05FPTBdPSJOT05FIix0W3QuRFJBR19aT09NSU5HPTFdPSJEUkFHX1pPT01JTkciLHRbdC5QQU5OSU5HPTJdPSJQQU5OSU5HIn0pKHJDdHx8KHJDdD17fSkpO2NsYXNzIGxDdCBleHRlbmRzIHJPLkNvbXBvbmVudHMuR3JvdXB7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKCksdGhpcy5zdGF0ZT1yQ3QuTk9ORSx0aGlzLnBhblN0YXJ0Q2FsbGJhY2s9bmV3IHJPLlV0aWxzLkNhbGxiYWNrU2V0LHRoaXMucGFuRW5kQ2FsbGJhY2s9bmV3IHJPLlV0aWxzLkNhbGxiYWNrU2V0LHRoaXMucGFuWm9vbT1uZXcgck8uSW50ZXJhY3Rpb25zLlBhblpvb20odCxlKSx0aGlzLnBhblpvb20uZHJhZ0ludGVyYWN0aW9uKCkubW91c2VGaWx0ZXIoKHQ9PmxDdC5pc1BhbktleSh0KSYmMD09PXQuYnV0dG9uKSksdGhpcy5wYW5ab29tLndoZWVsRmlsdGVyKHRoaXMuY2FuU2Nyb2xsWm9vbSksdGhpcy5kcmFnWm9vbUxheWVyPW5ldyBpQ3QodCxlLG4pLHRoaXMuZHJhZ1pvb21MYXllci5kcmFnSW50ZXJhY3Rpb24oKS5tb3VzZUZpbHRlcigodD0+IWxDdC5pc1BhbktleSh0KSYmMD09PXQuYnV0dG9uKSksdGhpcy5hcHBlbmQodGhpcy5kcmFnWm9vbUxheWVyKTtjb25zdCBpPXRoaXMub25XaGVlbC5iaW5kKHRoaXMpO3RoaXMub25BbmNob3IoKCgpPT57dGhpcy5fbW91c2VEaXNwYXRjaGVyPXJPLkRpc3BhdGNoZXJzLk1vdXNlLmdldERpc3BhdGNoZXIodGhpcyksdGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uV2hlZWwoaSksdGhpcy5wYW5ab29tLmF0dGFjaFRvKHRoaXMpfSkpLHRoaXMub25EZXRhY2goKCgpPT57dGhpcy5wYW5ab29tLmRldGFjaEZyb20odGhpcyksdGhpcy5fbW91c2VEaXNwYXRjaGVyJiYodGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZldoZWVsKGkpLHRoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsKX0pKSx0aGlzLnBhblpvb20uZHJhZ0ludGVyYWN0aW9uKCkub25EcmFnU3RhcnQoKCgpPT57dGhpcy5zdGF0ZT09ckN0Lk5PTkUmJnRoaXMuc2V0U3RhdGUockN0LlBBTk5JTkcpfSkpLHRoaXMucGFuWm9vbS5kcmFnSW50ZXJhY3Rpb24oKS5vbkRyYWdFbmQoKCgpPT57dGhpcy5zdGF0ZT09ckN0LlBBTk5JTkcmJnRoaXMuc2V0U3RhdGUockN0Lk5PTkUpfSkpLHRoaXMuZHJhZ1pvb21MYXllci5kcmFnSW50ZXJhY3Rpb24oKS5vbkRyYWdTdGFydCgoKCk9Pnt0aGlzLnN0YXRlPT1yQ3QuTk9ORSYmdGhpcy5zZXRTdGF0ZShyQ3QuRFJBR19aT09NSU5HKX0pKSx0aGlzLmRyYWdab29tTGF5ZXIuZHJhZ0ludGVyYWN0aW9uKCkub25EcmFnRW5kKCgoKT0+e3RoaXMuc3RhdGU9PXJDdC5EUkFHX1pPT01JTkcmJnRoaXMuc2V0U3RhdGUockN0Lk5PTkUpfSkpfW9uV2hlZWwodCxlKXtpZih0aGlzLmNhblNjcm9sbFpvb20oZSkpcmV0dXJuO2NvbnN0IG49dGhpcy5lbGVtZW50KCk7aWYoIW4uc2VsZWN0KCIuaGVscCIpLmVtcHR5KCkpcmV0dXJuO2NvbnN0IGk9bi5hcHBlbmQoImRpdiIpLmNsYXNzZWQoImhlbHAiLCEwKTtpLmFwcGVuZCgic3BhbiIpLnRleHQoIkFsdCArIFNjcm9sbCB0byBab29tIiksaS5vbigiYW5pbWF0aW9uZW5kIiwoKCk9PntpLnJlbW92ZSgpfSkpfXN0YXRpYyBpc1BhbktleSh0KXtyZXR1cm4gQm9vbGVhbih0LmFsdEtleSl8fEJvb2xlYW4odC5zaGlmdEtleSl9Y2FuU2Nyb2xsWm9vbSh0KXtyZXR1cm4gdC5hbHRLZXl9c2V0U3RhdGUodCl7aWYodGhpcy5zdGF0ZT09dClyZXR1cm47Y29uc3QgZT10aGlzLnN0YXRlO3RoaXMuc3RhdGU9dCx0aGlzLnJvb3QoKS5yZW1vdmVDbGFzcyh0aGlzLnN0YXRlQ2xhc3NOYW1lKGUpKSx0aGlzLnJvb3QoKS5hZGRDbGFzcyh0aGlzLnN0YXRlQ2xhc3NOYW1lKHQpKSxlPT1yQ3QuUEFOTklORyYmdGhpcy5wYW5FbmRDYWxsYmFjay5jYWxsQ2FsbGJhY2tzKCksdD09ckN0LlBBTk5JTkcmJnRoaXMucGFuU3RhcnRDYWxsYmFjay5jYWxsQ2FsbGJhY2tzKCl9c3RhdGVDbGFzc05hbWUodCl7c3dpdGNoKHQpe2Nhc2UgckN0LlBBTk5JTkc6cmV0dXJuInBhbm5pbmciO2Nhc2UgckN0LkRSQUdfWk9PTUlORzpyZXR1cm4iZHJhZy16b29taW5nIjtjYXNlIHJDdC5OT05FOmRlZmF1bHQ6cmV0dXJuIiJ9fW9uUGFuU3RhcnQodCl7dGhpcy5wYW5TdGFydENhbGxiYWNrLmFkZCh0KX1vblBhbkVuZCh0KXt0aGlzLnBhbkVuZENhbGxiYWNrLmFkZCh0KX1vblNjcm9sbFpvb20odCl7dGhpcy5wYW5ab29tLm9uWm9vbUVuZCh0KX1vbkRyYWdab29tU3RhcnQodCl7dGhpcy5kcmFnWm9vbUxheWVyLmludGVyYWN0aW9uU3RhcnQodCl9b25EcmFnWm9vbUVuZCh0KXt0aGlzLmRyYWdab29tTGF5ZXIuaW50ZXJhY3Rpb25FbmQodCl9fSEoZnVuY3Rpb24odCl7dFt0LlRFWFQ9MF09IlRFWFQiLHRbdC5ET009MV09IkRPTSJ9KShvQ3R8fChvQ3Q9e30pKSwoZnVuY3Rpb24odCl7dC5MT0c9ImxvZyIsdC5MSU5FQVI9ImxpbmVhciJ9KShhQ3R8fChhQ3Q9e30pKTtjbGFzcyBjQ3R7Y29uc3RydWN0b3IodCxlLG4saSxyLG8sYSxzLGwsYyx1KXt0aGlzLmRpcnR5RGF0YXNldHM9bmV3IFNldCx0aGlzLnNlcmllc05hbWVzPVtdLHRoaXMubmFtZTJkYXRhc2V0cz17fSx0aGlzLmNvbG9yU2NhbGU9aSx0aGlzLnRvb2x0aXA9cix0aGlzLmRhdGFzZXRzPVtdLHRoaXMuX2lnbm9yZVlPdXRsaWVycz0hMSx0aGlzLmxhc3RQb2ludHNEYXRhc2V0PW5ldyByTy5EYXRhc2V0LHRoaXMubmFuRGF0YXNldD1uZXcgck8uRGF0YXNldCx0aGlzLnlWYWx1ZUFjY2Vzc29yPWUsdGhpcy5zeW1ib2xGdW5jdGlvbj1jLHRoaXMuX2RlZmF1bHRYUmFuZ2U9cyx0aGlzLl9kZWZhdWx0WVJhbmdlPWwsdGhpcy50b29sdGlwQ29sdW1ucz1vLHRoaXMuYnVpbGRDaGFydCh0LGUsbixhLHUpfWJ1aWxkQ2hhcnQodCxlLG4saSxyKXt0aGlzLmRlc3Ryb3koKTtjb25zdCBvPXQoKTt0aGlzLnhBY2Nlc3Nvcj1vLmFjY2Vzc29yLHRoaXMueFNjYWxlPW8uc2NhbGUsdGhpcy54QXhpcz1vLmF4aXMsdGhpcy54QXhpcy5tYXJnaW4oMSkudGlja0xhYmVsUGFkZGluZygzKSxyJiZ0aGlzLnhBeGlzLmZvcm1hdHRlcihyKSx0aGlzLnlTY2FsZT1jQ3QuZ2V0WVNjYWxlRnJvbVR5cGUobiksdGhpcy55U2NhbGUuc2V0VmFsdWVQcm92aWRlckZvckRvbWFpbigoKCk9PnRoaXMuZ2V0VmFsdWVzRm9yWUF4aXNEb21haW5Db21wdXRlKCkpKSx0aGlzLnlBeGlzPW5ldyByTy5BeGVzLk51bWVyaWModGhpcy55U2NhbGUsImxlZnQiKTtsZXQgYT13VHQoMyk7dGhpcy55QXhpcy5tYXJnaW4oMCkudGlja0xhYmVsUGFkZGluZyg1KS5mb3JtYXR0ZXIoYSksdGhpcy55QXhpcy51c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbighMCksdGhpcy5maWxsQXJlYT1pO2NvbnN0IHM9bmV3IGxDdCh0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSwoKCk9PnRoaXMucmVzZXREb21haW4oKSkpO3RoaXMudG9vbHRpcEludGVyYWN0aW9uPXRoaXMuY3JlYXRlVG9vbHRpcEludGVyYWN0aW9uKHMpLHRoaXMudG9vbHRpcFBvaW50c0NvbXBvbmVudD1uZXcgck8uQ29tcG9uZW50O2NvbnN0IGw9dGhpcy5idWlsZFBsb3QodGhpcy54U2NhbGUsdGhpcy55U2NhbGUsaSk7dGhpcy5ncmlkbGluZXM9bmV3IHJPLkNvbXBvbmVudHMuR3JpZGxpbmVzKHRoaXMueFNjYWxlLHRoaXMueVNjYWxlKTtsZXQgYz1udWxsO24hPT1hQ3QuTE9HJiYoYz1uZXcgck8uQ29tcG9uZW50cy5HdWlkZUxpbmVMYXllcigiaG9yaXpvbnRhbCIpLGMuc2NhbGUodGhpcy55U2NhbGUpLnZhbHVlKDApKTtsZXQgdT1uZXcgck8uQ29tcG9uZW50cy5HdWlkZUxpbmVMYXllcigidmVydGljYWwiKTt1LnNjYWxlKHRoaXMueFNjYWxlKS52YWx1ZSgwKSx0aGlzLmNlbnRlcj1uZXcgck8uQ29tcG9uZW50cy5Hcm91cChbdGhpcy5ncmlkbGluZXMsYyx1LGwsdGhpcy50b29sdGlwUG9pbnRzQ29tcG9uZW50LHNdKSx0aGlzLmNlbnRlci5hZGRDbGFzcygibWFpbiIpLHRoaXMub3V0ZXI9bmV3IHJPLkNvbXBvbmVudHMuVGFibGUoW1t0aGlzLnlBeGlzLHRoaXMuY2VudGVyXSxbbnVsbCx0aGlzLnhBeGlzXV0pfWJ1aWxkUGxvdCh0LGUsbil7biYmKHRoaXMubWFyZ2luQXJlYVBsb3Q9bmV3IHJPLlBsb3RzLkFyZWEsdGhpcy5tYXJnaW5BcmVhUGxvdC54KHRoaXMueEFjY2Vzc29yLHQpLHRoaXMubWFyZ2luQXJlYVBsb3QueShuLmhpZ2hlckFjY2Vzc29yLGUpLHRoaXMubWFyZ2luQXJlYVBsb3QueTAobi5sb3dlckFjY2Vzc29yKSx0aGlzLm1hcmdpbkFyZWFQbG90LmF0dHIoImZpbGwiLCgodCxlLG4pPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUobi5tZXRhZGF0YSgpLm5hbWUpKSksdGhpcy5tYXJnaW5BcmVhUGxvdC5hdHRyKCJmaWxsLW9wYWNpdHkiLC4zKSx0aGlzLm1hcmdpbkFyZWFQbG90LmF0dHIoInN0cm9rZS13aWR0aCIsMCkpLHRoaXMuc21vb3RoZWRBY2Nlc3Nvcj10PT50LnNtb290aGVkO2xldCBpPW5ldyByTy5QbG90cy5MaW5lO2kueCh0aGlzLnhBY2Nlc3Nvcix0KSxpLnkodGhpcy55VmFsdWVBY2Nlc3NvcixlKSxpLmF0dHIoInN0cm9rZSIsKCh0LGUsbik9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShuLm1ldGFkYXRhKCkubmFtZSkpKSx0aGlzLmxpbmVQbG90PWksdGhpcy5zZXR1cFRvb2x0aXBzKGkpO2xldCByPW5ldyByTy5QbG90cy5MaW5lO2lmKHIueCh0aGlzLnhBY2Nlc3Nvcix0KSxyLnkodGhpcy5zbW9vdGhlZEFjY2Vzc29yLGUpLHIuYXR0cigic3Ryb2tlIiwoKHQsZSxuKT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKG4ubWV0YWRhdGEoKS5uYW1lKSkpLHRoaXMuc21vb3RoTGluZVBsb3Q9cix0aGlzLnN5bWJvbEZ1bmN0aW9uKXtjb25zdCBuPW5ldyByTy5QbG90cy5TY2F0dGVyO24ueCh0aGlzLnhBY2Nlc3Nvcix0KSxuLnkodGhpcy55VmFsdWVBY2Nlc3NvcixlKSxuLmF0dHIoImZpbGwiLCgodCxlLG4pPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUobi5tZXRhZGF0YSgpLm5hbWUpKSksbi5hdHRyKCJvcGFjaXR5IiwxKSxuLnNpemUoOCksbi5zeW1ib2woKCh0LGUsbik9PnRoaXMuc3ltYm9sRnVuY3Rpb24obi5tZXRhZGF0YSgpLm5hbWUpKSksdGhpcy5tYXJrZXJzU2NhdHRlclBsb3Q9bn1sZXQgbz1uZXcgck8uUGxvdHMuU2NhdHRlcjtvLngodGhpcy54QWNjZXNzb3IsdCksby55KHRoaXMueVZhbHVlQWNjZXNzb3IsZSksby5hdHRyKCJmaWxsIiwodD0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHQubmFtZSkpKSxvLmF0dHIoIm9wYWNpdHkiLDEpLG8uc2l6ZSg4KSxvLmRhdGFzZXRzKFt0aGlzLmxhc3RQb2ludHNEYXRhc2V0XSksdGhpcy5zY2F0dGVyUGxvdD1vO2xldCBhPW5ldyByTy5QbG90cy5TY2F0dGVyO2EueCh0aGlzLnhBY2Nlc3Nvcix0KSxhLnkoKHQ9PnQuZGlzcGxheVkpLGUpLGEuYXR0cigiZmlsbCIsKHQ9PnRoaXMuY29sb3JTY2FsZS5zY2FsZSh0Lm5hbWUpKSksYS5hdHRyKCJvcGFjaXR5IiwxKSxhLnNpemUoMTIpLGEuZGF0YXNldHMoW3RoaXMubmFuRGF0YXNldF0pLGEuc3ltYm9sKHJPLlN5bWJvbEZhY3Rvcmllcy50cmlhbmdsZSksdGhpcy5uYW5EaXNwbGF5PWE7Y29uc3Qgcz1bYSxvLHIsaV07cmV0dXJuIHRoaXMubWFyZ2luQXJlYVBsb3QmJnMucHVzaCh0aGlzLm1hcmdpbkFyZWFQbG90KSx0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdCYmcy5wdXNoKHRoaXMubWFya2Vyc1NjYXR0ZXJQbG90KSxuZXcgck8uQ29tcG9uZW50cy5Hcm91cChzKX1pZ25vcmVZT3V0bGllcnModCl7dCE9PXRoaXMuX2lnbm9yZVlPdXRsaWVycyYmKHRoaXMuX2lnbm9yZVlPdXRsaWVycz10LHRoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCksdGhpcy55U2NhbGUuaWdub3JlT3V0bGllcih0KSx0aGlzLnJlc2V0WURvbWFpbigpKX1nZXRWYWx1ZXNGb3JZQXhpc0RvbWFpbkNvbXB1dGUoKXtjb25zdCB0PXRoaXMuZ2V0QWNjZXNzb3JzRm9yQ29tcHV0aW5nWVJhbmdlKCk7cmV0dXJuIFNlLmV4cG9ydHMuZmxhdHRlbkRlZXAodGhpcy5kYXRhc2V0cy5tYXAoKGU9PnQubWFwKCh0PT5lLmRhdGEoKS5tYXAoKG49PnQobiwtMSxlKSkpKSkpKSkuZmlsdGVyKGlzRmluaXRlKX11cGRhdGVTcGVjaWFsRGF0YXNldHMoKXtjb25zdCB0PXRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpO2xldCBlPXRoaXMuZGF0YXNldHMubWFwKChlPT57bGV0IG49bnVsbCxpPWUuZGF0YSgpLmZpbHRlcigobj0+IWlzTmFOKHQobiwtMSxlKSkpKTtyZXR1cm4gaS5sZW5ndGg+MCYmKG49aVtpLmxlbmd0aC0xXSxuLm5hbWU9ZS5tZXRhZGF0YSgpLm5hbWUsbi5yZWxhdGl2ZT1UVHQobiwwLGUpKSxufSkpLmZpbHRlcigodD0+bnVsbCE9dCkpO3RoaXMubGFzdFBvaW50c0RhdGFzZXQuZGF0YShlKSx0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdCYmdGhpcy5tYXJrZXJzU2NhdHRlclBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cy5tYXAodGhpcy5jcmVhdGVTYW1wbGVkRGF0YXNldEZvck1hcmtlcnMpKTtsZXQgbj1TZS5leHBvcnRzLmZsYXR0ZW4odGhpcy5kYXRhc2V0cy5tYXAoKGU9PntsZXQgbj1udWxsLGk9ZS5kYXRhKCkscj0wO2Zvcig7cjxpLmxlbmd0aCYmbnVsbD09bjspaXNOYU4odChpW3JdLC0xLGUpKXx8KG49dChpW3JdLC0xLGUpKSxyKys7bnVsbD09biYmKG49MCk7bGV0IG89W107Zm9yKHI9MDtyPGkubGVuZ3RoO3IrKylpc05hTih0KGlbcl0sLTEsZSkpPyhpW3JdLm5hbWU9ZS5tZXRhZGF0YSgpLm5hbWUsaVtyXS5kaXNwbGF5WT1uLGlbcl0ucmVsYXRpdmU9VFR0KGlbcl0sMCxlKSxvLnB1c2goaVtyXSkpOm49dChpW3JdLC0xLGUpO3JldHVybiBvfSkpKTt0aGlzLm5hbkRhdGFzZXQuZGF0YShuKX1yZXNldERvbWFpbigpe3RoaXMucmVzZXRYRG9tYWluKCksdGhpcy5yZXNldFlEb21haW4oKX1yZXNldFhEb21haW4oKXtsZXQgdDtpZihudWxsIT10aGlzLl9kZWZhdWx0WFJhbmdlKXQ9dGhpcy5fZGVmYXVsdFhSYW5nZTtlbHNle2NvbnN0IGU9dGhpcy54U2NhbGU7ZS5fZG9tYWluTWluPW51bGwsZS5fZG9tYWluTWF4PW51bGwsdD1lLl9nZXRFeHRlbnQoKX10aGlzLnhTY2FsZS5kb21haW4odCl9cmVzZXRZRG9tYWluKCl7bnVsbCE9dGhpcy5fZGVmYXVsdFlSYW5nZT90aGlzLnlTY2FsZS5kb21haW4odGhpcy5fZGVmYXVsdFlSYW5nZSk6KHRoaXMueVNjYWxlLmF1dG9Eb21haW4oKSx0aGlzLnlTY2FsZS5kb21haW4odGhpcy55U2NhbGUuZG9tYWluKCkpKX1nZXRBY2Nlc3NvcnNGb3JDb21wdXRpbmdZUmFuZ2UoKXtjb25zdCB0PVt0aGlzLmdldFlBeGlzQWNjZXNzb3IoKV07cmV0dXJuIHRoaXMuZmlsbEFyZWEmJnQucHVzaCh0aGlzLmZpbGxBcmVhLmxvd2VyQWNjZXNzb3IsdGhpcy5maWxsQXJlYS5oaWdoZXJBY2Nlc3NvciksdH1nZXRZQXhpc0FjY2Vzc29yKCl7cmV0dXJuIHRoaXMuc21vb3RoaW5nRW5hYmxlZD90aGlzLnNtb290aGVkQWNjZXNzb3I6dGhpcy55VmFsdWVBY2Nlc3Nvcn1jcmVhdGVUb29sdGlwSW50ZXJhY3Rpb24odCl7Y29uc3QgZT1uZXcgT1R0LG49KCk9PntlLmVuYWJsZWQoITEpLHRoaXMuaGlkZVRvb2x0aXBzKCl9LGk9KCk9PmUuZW5hYmxlZCghMCk7cmV0dXJuIHQub25QYW5TdGFydChuKSx0Lm9uRHJhZ1pvb21TdGFydChuKSx0Lm9uUGFuRW5kKGkpLHQub25EcmFnWm9vbUVuZChpKSx0Lm9uU2Nyb2xsWm9vbSgoKCk9PnRoaXMudXBkYXRlVG9vbHRpcENvbnRlbnQodGhpcy5fbGFzdE1vdXNlUG9zaXRpb24pKSksZS5vblBvaW50ZXJNb3ZlKCh0PT57dGhpcy5fbGFzdE1vdXNlUG9zaXRpb249dCx0aGlzLnVwZGF0ZVRvb2x0aXBDb250ZW50KHQpfSkpLGUub25Qb2ludGVyRXhpdCgoKCk9PnRoaXMuaGlkZVRvb2x0aXBzKCkpKSxlfXVwZGF0ZVRvb2x0aXBDb250ZW50KHQpe3RoaXMubGluZVBsb3QmJih3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdG9vbHRpcFVwZGF0ZUFuaW1hdGlvbkZyYW1lKSx0aGlzLl90b29sdGlwVXBkYXRlQW5pbWF0aW9uRnJhbWU9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKCk9PntsZXQgZT17eDp0LngseTp0LnksZGF0dW06bnVsbCxkYXRhc2V0Om51bGx9LG49dGhpcy5ncmlkbGluZXMuY29udGVudCgpLm5vZGUoKS5nZXRCQm94KCksaT10aGlzLmxpbmVQbG90LmRhdGFzZXRzKCkubWFwKCh0PT50aGlzLmZpbmRDbG9zZXN0UG9pbnQoZSx0KSkpLmZpbHRlcihCb29sZWFuKSxyPXJPLlV0aWxzLkRPTS5pbnRlcnNlY3RzQkJveCxvPWkuZmlsdGVyKCh0PT5yKHQueCx0Lnksbil8fGlzTmFOKHRoaXMueVZhbHVlQWNjZXNzb3IodC5kYXR1bSwwLHQuZGF0YXNldCkpKSksYT1vLmZpbHRlcigodD0+IWlzTmFOKHRoaXMueVZhbHVlQWNjZXNzb3IodC5kYXR1bSwwLHQuZGF0YXNldCkpKSk7aWYoMCE9PWkubGVuZ3RoKXt0aGlzLnNjYXR0ZXJQbG90LmF0dHIoImRpc3BsYXkiLCJub25lIik7Y29uc3QgdD10aGlzLnRvb2x0aXBQb2ludHNDb21wb25lbnQuY29udGVudCgpLnNlbGVjdEFsbCgiLnBvaW50IikuZGF0YShhLCh0PT50LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSk7dC5lbnRlcigpLmFwcGVuZCgiY2lyY2xlIikuY2xhc3NlZCgicG9pbnQiLCEwKSx0LmF0dHIoInIiLDQpLmF0dHIoImN4IiwodD0+dC54KSkuYXR0cigiY3kiLCh0PT50LnkpKS5zdHlsZSgic3Ryb2tlIiwibm9uZSIpLmF0dHIoImZpbGwiLCh0PT50aGlzLmNvbG9yU2NhbGUuc2NhbGUodC5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSkpKSx0LmV4aXQoKS5yZW1vdmUoKSx0aGlzLmRyYXdUb29sdGlwcyhvLGUsdGhpcy50b29sdGlwQ29sdW1ucyl9ZWxzZSB0aGlzLmhpZGVUb29sdGlwcygpfSkpKX1oaWRlVG9vbHRpcHMoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdG9vbHRpcFVwZGF0ZUFuaW1hdGlvbkZyYW1lKSx0aGlzLnRvb2x0aXAuaGlkZSgpLHRoaXMuc2NhdHRlclBsb3QuYXR0cigiZGlzcGxheSIsImJsb2NrIiksdGhpcy50b29sdGlwUG9pbnRzQ29tcG9uZW50LmNvbnRlbnQoKS5zZWxlY3RBbGwoIi5wb2ludCIpLnJlbW92ZSgpfXNldHVwVG9vbHRpcHModCl7dC5vbkRldGFjaCgoKCk9Pnt0aGlzLnRvb2x0aXBJbnRlcmFjdGlvbi5kZXRhY2hGcm9tKHQpLHRoaXMudG9vbHRpcEludGVyYWN0aW9uLmVuYWJsZWQoITEpfSkpLHQub25BbmNob3IoKCgpPT57dGhpcy50b29sdGlwSW50ZXJhY3Rpb24uYXR0YWNoVG8odCksdGhpcy50b29sdGlwSW50ZXJhY3Rpb24uZW5hYmxlZCghMCl9KSl9ZHJhd1Rvb2x0aXBzKHQsZSxuKXtpZighdC5sZW5ndGgpcmV0dXJuIHZvaWQgdGhpcy50b29sdGlwLmhpZGUoKTtjb25zdHtjb2xvclNjYWxlOml9PXRoaXM7bj1be3RpdGxlOiIiLHN0YXRpYzohMSxldmFsVHlwZTpvQ3QuRE9NLGV2YWx1YXRlKHQpe3JldHVybiBTdSh0aGlzKS5zZWxlY3QoInNwYW4iKS5zdHlsZSgiYmFja2dyb3VuZC1jb2xvciIsKCgpPT5pLnNjYWxlKHQuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUpKSksIiJ9LGVudGVyKHQpe1N1KHRoaXMpLmFwcGVuZCgic3BhbiIpLmNsYXNzZWQoInN3YXRjaCIsITApLnN0eWxlKCJiYWNrZ3JvdW5kLWNvbG9yIiwoKCk9Pmkuc2NhbGUodC5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSkpKX19LC4uLm5dO2NvbnN0IHI9dD0+TWF0aC5wb3codC54LWUueCwyKStNYXRoLnBvdyh0LnktZS55LDIpLG89U2UuZXhwb3J0cy5taW4odC5tYXAocikpLGE9dGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuc21vb3RoZWRBY2Nlc3Nvcjp0aGlzLnlWYWx1ZUFjY2Vzc29yO3Q9ImFzY2VuZGluZyI9PT10aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kP1NlLmV4cG9ydHMuc29ydEJ5KHQsKHQ9PmEodC5kYXR1bSwtMSx0LmRhdGFzZXQpKSk6ImRlc2NlbmRpbmciPT09dGhpcy50b29sdGlwU29ydGluZ01ldGhvZD9TZS5leHBvcnRzLnNvcnRCeSh0LCh0PT5hKHQuZGF0dW0sLTEsdC5kYXRhc2V0KSkpLnJldmVyc2UoKToibmVhcmVzdCI9PT10aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kP1NlLmV4cG9ydHMuc29ydEJ5KHQscik6dC5zbGljZSgwKS5yZXZlcnNlKCk7Y29uc3Qgcz10aGlzLGw9U3UodGhpcy50b29sdGlwLmNvbnRlbnQoKSkuc2VsZWN0KCJ0YWJsZSIpLGM9bC5zZWxlY3QoInRoZWFkIikuc2VsZWN0QWxsKCJ0aCIpLmRhdGEobiwoKHQsZSxuKT0+dC50aXRsZSkpO2MuZW50ZXIoKS5hcHBlbmQoInRoIikudGV4dCgodD0+dC50aXRsZSkpLm5vZGVzKCksYy5leGl0KCkucmVtb3ZlKCk7Y29uc3QgdT1sLnNlbGVjdCgidGJvZHkiKS5zZWxlY3RBbGwoInRyIikuZGF0YSh0LCgodCxlLG4pPT50LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSk7dS5jbGFzc2VkKCJkaXN0YW50IiwodD0+e2xldCBuPXQuZGF0YXNldC5kYXRhKClbMF0saT1TZS5leHBvcnRzLmxhc3QodC5kYXRhc2V0LmRhdGEoKSkscj10aGlzLnhTY2FsZS5zY2FsZSh0aGlzLnhBY2Nlc3NvcihuLDAsdC5kYXRhc2V0KSksbz10aGlzLnhTY2FsZS5zY2FsZSh0aGlzLnhBY2Nlc3NvcihpLDAsdC5kYXRhc2V0KSksYT10aGlzLnNtb290aGluZ0VuYWJsZWQ/dC5kYXR1bS5zbW9vdGhlZDp0aGlzLnlWYWx1ZUFjY2Vzc29yKHQuZGF0dW0sMCx0LmRhdGFzZXQpO3JldHVybiBlLng8cnx8ZS54Pm98fGlzTmFOKGEpfSkpLmNsYXNzZWQoImNsb3Nlc3QiLCh0PT5yKHQpPT09bykpLmVhY2goKGZ1bmN0aW9uKHQpe3MuZHJhd1Rvb2x0aXBSb3codGhpcyxuLHQpfSkpLm9yZGVyKCksdS5leGl0KCkucmVtb3ZlKCksdS5lbnRlcigpLmFwcGVuZCgidHIiKS5lYWNoKChmdW5jdGlvbih0KXtzLmRyYXdUb29sdGlwUm93KHRoaXMsbix0KX0pKS5ub2RlcygpLHRoaXMudG9vbHRpcC51cGRhdGVBbmRQb3NpdGlvbih0aGlzLnRhcmdldFNWRy5ub2RlKCkpfWRyYXdUb29sdGlwUm93KHQsZSxuKXtjb25zdCBpPXRoaXMscj1TdSh0KS5zZWxlY3RBbGwoInRkIikuZGF0YShlKTtyLmVhY2goKGZ1bmN0aW9uKHQpe3Quc3RhdGljfHxpLmRyYXdUb29sdGlwQ29sdW1uLmNhbGwoaSx0aGlzLHQsbil9KSksci5leGl0KCkucmVtb3ZlKCksci5lbnRlcigpLmFwcGVuZCgidGQiKS5lYWNoKChmdW5jdGlvbih0KXsiZW50ZXIiaW4gdCYmdC5lbnRlciYmdC5lbnRlci5jYWxsKHRoaXMsbiksaS5kcmF3VG9vbHRpcENvbHVtbi5jYWxsKGksdGhpcyx0LG4pfSkpfWRyYXdUb29sdGlwQ29sdW1uKHQsZSxuKXtjb25zdHtzbW9vdGhpbmdFbmFibGVkOml9PXRoaXM7ImV2YWxUeXBlImluIGUmJmUuZXZhbFR5cGU9PW9DdC5ET00/ZS5ldmFsdWF0ZS5jYWxsKHQsbix7c21vb3RoaW5nRW5hYmxlZDppfSk6U3UodCkudGV4dChlLmV2YWx1YXRlLmNhbGwodCxuLHtzbW9vdGhpbmdFbmFibGVkOml9KSl9ZmluZENsb3Nlc3RQb2ludCh0LGUpe2NvbnN0IG49ZS5kYXRhKCkubWFwKCgodCxuKT0+dGhpcy54U2NhbGUuc2NhbGUodGhpcy54QWNjZXNzb3IodCxuLGUpKSkpO2xldCBpPVNlLmV4cG9ydHMuc29ydGVkSW5kZXgobix0LngpO2lmKDA9PW4ubGVuZ3RoKXJldHVybiBudWxsO2k9PT1uLmxlbmd0aD9pLT0xOjAhPT1pJiYoaT1NYXRoLmFicyhuW2ktMV0tdC54KTxNYXRoLmFicyhuW2ldLXQueCk/aS0xOmkpO2NvbnN0IHI9ZS5kYXRhKClbaV0sbz10aGlzLnNtb290aGluZ0VuYWJsZWQ/dGhpcy5zbW9vdGhlZEFjY2Vzc29yKHIsaSxlKTp0aGlzLnlWYWx1ZUFjY2Vzc29yKHIsaSxlKTtyZXR1cm57eDpuW2ldLHk6dGhpcy55U2NhbGUuc2NhbGUobyksZGF0dW06cixkYXRhc2V0OmV9fXJlc21vb3RoRGF0YXNldCh0KXtsZXQgZT10LmRhdGEoKTtjb25zdCBuPXRoaXMuc21vb3RoaW5nV2VpZ2h0O2xldCBpPWUubGVuZ3RoPjA/MDpOYU4scj0wO2NvbnN0IG89ZS5tYXAoKChlLG4pPT50aGlzLnlWYWx1ZUFjY2Vzc29yKGUsbix0KSkpLGE9by5ldmVyeSgodD0+dD09b1swXSkpO2UuZm9yRWFjaCgoKHQsZSk9Pntjb25zdCBzPW9bZV07aWYoYXx8IU51bWJlci5pc0Zpbml0ZShzKSl0LnNtb290aGVkPXM7ZWxzZXtpPWkqbisoMS1uKSpzLHIrKztsZXQgZT0xOzEhPT1uJiYoZT0xLU1hdGgucG93KG4scikpLHQuc21vb3RoZWQ9aS9lfX0pKX1nZXREYXRhc2V0KHQpe3JldHVybiB2b2lkIDA9PT10aGlzLm5hbWUyZGF0YXNldHNbdF0mJih0aGlzLm5hbWUyZGF0YXNldHNbdF09bmV3IHJPLkRhdGFzZXQoW10se25hbWU6dCxtZXRhOm51bGx9KSksdGhpcy5uYW1lMmRhdGFzZXRzW3RdfXN0YXRpYyBnZXRZU2NhbGVGcm9tVHlwZSh0KXtpZih0PT09YUN0LkxPRylyZXR1cm4gbmV3IG5DdDtpZih0PT09YUN0LkxJTkVBUilyZXR1cm4gbmV3IFpUdDt0aHJvdyBuZXcgRXJyb3IoIlVucmVjb2duaXplZCB5U2NhbGUgdHlwZSAiK3QpfXNldFZpc2libGVTZXJpZXModCl7dGhpcy5kaXNhYmxlQ2hhbmdlcygpLCh0PXQuc29ydCgpKS5yZXZlcnNlKCksdGhpcy5zZXJpZXNOYW1lcz10fWRpc2FibGVDaGFuZ2VzKCl7dGhpcy5kaXJ0eURhdGFzZXRzLnNpemV8fCh0aGlzLmxpbmVQbG90LmRhdGFzZXRzKFtdKSx0aGlzLnNtb290aExpbmVQbG90JiZ0aGlzLnNtb290aExpbmVQbG90LmRhdGFzZXRzKFtdKSx0aGlzLm1hcmdpbkFyZWFQbG90JiZ0aGlzLm1hcmdpbkFyZWFQbG90LmRhdGFzZXRzKFtdKSl9Y29tbWl0Q2hhbmdlcygpe3RoaXMuZGF0YXNldHM9dGhpcy5zZXJpZXNOYW1lcy5tYXAoKHQ9PnRoaXMuZ2V0RGF0YXNldCh0KSkpLFsuLi50aGlzLmRpcnR5RGF0YXNldHNdLmZvckVhY2goKHQ9Pnt0aGlzLnNtb290aGluZ0VuYWJsZWQmJnRoaXMucmVzbW9vdGhEYXRhc2V0KHRoaXMuZ2V0RGF0YXNldCh0KSl9KSksdGhpcy51cGRhdGVTcGVjaWFsRGF0YXNldHMoKSx0aGlzLmxpbmVQbG90LmRhdGFzZXRzKHRoaXMuZGF0YXNldHMpLHRoaXMuc21vb3RoaW5nRW5hYmxlZCYmdGhpcy5zbW9vdGhMaW5lUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKSx0aGlzLm1hcmdpbkFyZWFQbG90JiZ0aGlzLm1hcmdpbkFyZWFQbG90LmRhdGFzZXRzKHRoaXMuZGF0YXNldHMpLHRoaXMubWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXRJblJhZigpLHRoaXMuZGlydHlEYXRhc2V0cy5jbGVhcigpfWNyZWF0ZVNhbXBsZWREYXRhc2V0Rm9yTWFya2Vycyh0KXtjb25zdCBlPXQuZGF0YSgpO2lmKGUubGVuZ3RoPD0yMClyZXR1cm4gdDtjb25zdCBuPU1hdGguY2VpbChlLmxlbmd0aC8yMCksaT1uZXcgQXJyYXkoTWF0aC5mbG9vcihlLmxlbmd0aC9uKSk7Zm9yKGxldCB0PTAscj0wO3Q8aS5sZW5ndGg7dCsrLHIrPW4paVt0XT1lW3JdO3JldHVybiBuZXcgck8uRGF0YXNldChpLHQubWV0YWRhdGEoKSl9c2V0U2VyaWVzRGF0YSh0LGUpe3RoaXMuZGlzYWJsZUNoYW5nZXMoKSx0aGlzLmdldERhdGFzZXQodCkuZGF0YShlKSx0aGlzLmRpcnR5RGF0YXNldHMuYWRkKHQpfXNldFNlcmllc01ldGFkYXRhKHQsZSl7dGhpcy5kaXNhYmxlQ2hhbmdlcygpLHRoaXMuZ2V0RGF0YXNldCh0KS5tZXRhZGF0YShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5nZXREYXRhc2V0KHQpLm1ldGFkYXRhKCkpLHttZXRhOmV9KSksdGhpcy5kaXJ0eURhdGFzZXRzLmFkZCh0KX1zbW9vdGhpbmdVcGRhdGUodCl7dGhpcy5zbW9vdGhpbmdXZWlnaHQ9dCx0aGlzLmRhdGFzZXRzLmZvckVhY2goKHQ9PnRoaXMucmVzbW9vdGhEYXRhc2V0KHQpKSksdGhpcy5zbW9vdGhpbmdFbmFibGVkfHwodGhpcy5saW5lUGxvdC5hZGRDbGFzcygiZ2hvc3QiKSx0aGlzLnNjYXR0ZXJQbG90LnkodGhpcy5zbW9vdGhlZEFjY2Vzc29yLHRoaXMueVNjYWxlKSx0aGlzLnNtb290aGluZ0VuYWJsZWQ9ITAsdGhpcy5zbW9vdGhMaW5lUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKSksdGhpcy5tYXJrZXJzU2NhdHRlclBsb3QmJnRoaXMubWFya2Vyc1NjYXR0ZXJQbG90LnkodGhpcy5nZXRZQXhpc0FjY2Vzc29yKCksdGhpcy55U2NhbGUpLHRoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCl9c21vb3RoaW5nRGlzYWJsZSgpe3RoaXMuc21vb3RoaW5nRW5hYmxlZCYmKHRoaXMubGluZVBsb3QucmVtb3ZlQ2xhc3MoImdob3N0IiksdGhpcy5zY2F0dGVyUGxvdC55KHRoaXMueVZhbHVlQWNjZXNzb3IsdGhpcy55U2NhbGUpLHRoaXMuc21vb3RoTGluZVBsb3QuZGF0YXNldHMoW10pLHRoaXMuc21vb3RoaW5nRW5hYmxlZD0hMSx0aGlzLnVwZGF0ZVNwZWNpYWxEYXRhc2V0cygpKSx0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdCYmdGhpcy5tYXJrZXJzU2NhdHRlclBsb3QueSh0aGlzLmdldFlBeGlzQWNjZXNzb3IoKSx0aGlzLnlTY2FsZSl9c2V0Q29sb3JTY2FsZSh0KXt0aGlzLmNvbG9yU2NhbGU9dH1zZXRUb29sdGlwQ29sdW1ucyh0KXt0aGlzLnRvb2x0aXBDb2x1bW5zPXR9c2V0VG9vbHRpcFNvcnRpbmdNZXRob2QodCl7dGhpcy50b29sdGlwU29ydGluZ01ldGhvZD10fXJlbmRlclRvKHQpe3RoaXMudGFyZ2V0U1ZHPXQsdGhpcy5vdXRlci5yZW5kZXJUbyh0KSxudWxsIT10aGlzLl9kZWZhdWx0WFJhbmdlJiZ0aGlzLnJlc2V0WERvbWFpbigpLG51bGwhPXRoaXMuX2RlZmF1bHRZUmFuZ2UmJnRoaXMucmVzZXRZRG9tYWluKCksdGhpcy5tZWFzdXJlQkJveEFuZE1heWJlSW52YWxpZGF0ZUxheW91dEluUmFmKCl9cmVkcmF3KCl7d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlZHJhd1JhZiksdGhpcy5fcmVkcmF3UmFmPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT57dGhpcy5tZWFzdXJlQkJveEFuZE1heWJlSW52YWxpZGF0ZUxheW91dCgpLHRoaXMub3V0ZXIucmVkcmF3KCl9KSl9bWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXRJblJhZigpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9pbnZhbGlkYXRlTGF5b3V0UmFmKSx0aGlzLl9pbnZhbGlkYXRlTGF5b3V0UmFmPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT57dGhpcy5tZWFzdXJlQkJveEFuZE1heWJlSW52YWxpZGF0ZUxheW91dCgpfSkpfW1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0KCl7aWYodGhpcy5fbGFzdERyYXdCQm94KXtjb25zdHt3aWR0aDp0fT10aGlzLl9sYXN0RHJhd0JCb3gse3dpZHRoOmV9PXRoaXMudGFyZ2V0U1ZHLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTswPT10JiZ0PGUmJnRoaXMub3V0ZXIuaW52YWxpZGF0ZUNhY2hlKCl9dGhpcy5fbGFzdERyYXdCQm94PXRoaXMudGFyZ2V0U1ZHLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1kZXN0cm95KCl7d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlZHJhd1JhZiksd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX2ludmFsaWRhdGVMYXlvdXRSYWYpLHRoaXMub3V0ZXImJnRoaXMub3V0ZXIuZGVzdHJveSgpfW9uQW5jaG9yKHQpe3RoaXMub3V0ZXImJnRoaXMub3V0ZXIub25BbmNob3IodCl9aXNEYXRhRml0VG9Eb21haW4oKXtyZXR1cm4gdCh0aGlzLnhBeGlzLmdldFNjYWxlKCkpJiZ0KHRoaXMueUF4aXMuZ2V0U2NhbGUoKSk7ZnVuY3Rpb24gdCh0KXtjb25zdCBlPXQuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKSxuPXQuZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQoKTtyZXR1cm4gblswXT09PWVbMF0mJm5bMV09PT1lWzFdfX19IShmdW5jdGlvbih0KXt0LkdST1VQPSJHIix0LkRJVj0iRElWIix0LlNWRz0iU1ZHIix0LlRFWFQ9IlRFWFQifSkoc0N0fHwoc0N0PXt9KSk7Y2xhc3MgdUN0IGV4dGVuZHMgY2xhc3N7Y29uc3RydWN0b3IodCl7dGhpcy51bmlxdWVJZD0wLHRoaXMucm9vdD10fWV4cG9ydEFzU3RyaW5nKCl7Y29uc3QgdD10aGlzLmNvbnZlcnQodGhpcy5yb290KTtpZighdClyZXR1cm4iIjtjb25zdCBlPXRoaXMuY3JlYXRlUm9vdFN2ZygpO3JldHVybiBlLmFwcGVuZENoaWxkKHQpLGUub3V0ZXJIVE1MfWNyZWF0ZVVuaXF1ZUlkKHQpe3JldHVybmAke3R9XyR7dGhpcy51bmlxdWVJZCsrfWB9Z2V0U2l6ZSgpe3JldHVybiB0aGlzLnJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y3JlYXRlUm9vdFN2Zygpe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3ZnIiksZT10aGlzLmdldFNpemUoKTtyZXR1cm4gdC5zZXRBdHRyaWJ1dGVOUygic3ZnIiwidmlld0JveCIsYDAgMCAke2Uud2lkdGh9ICR7ZS5oZWlnaHR9YCksdC5zZXRBdHRyaWJ1dGUoInhtbG5zIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciKSx0fWNvbnZlcnQodCl7bGV0IGU9bnVsbDtjb25zdCBuPXQubm9kZU5hbWUudG9VcHBlckNhc2UoKTtpZih0Lm5vZGVUeXBlIT1Ob2RlLkVMRU1FTlRfTk9ERXx8biE9c0N0LkRJViYmbiE9c0N0LlNWRyllPXQuY2xvbmVOb2RlKCk7ZWxzZXtlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoc0N0LkdST1VQKTtjb25zdCBuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLGk9cGFyc2VJbnQobi5sZWZ0LDEwKSxyPXBhcnNlSW50KG4udG9wLDEwKTtpZihpfHxyKXtjb25zdCB0PXRoaXMuY3JlYXRlVW5pcXVlSWQoImNsaXAiKTtlLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIixgdHJhbnNsYXRlKCR7aX0sICR7cn0pYCksZS5zZXRBdHRyaWJ1dGUoImNsaXAtcGF0aCIsYHVybCgjJHt0fSlgKTtjb25zdCBvPXBhcnNlSW50KG4ud2lkdGgsMTApLGE9cGFyc2VJbnQobi5oZWlnaHQsMTApLHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicmVjdCIpO3Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsU3RyaW5nKG8pKSxzLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixTdHJpbmcoYSkpO2NvbnN0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJzdmciLCJjbGlwUGF0aCIpO2wuaWQ9dCxsLmFwcGVuZENoaWxkKHMpLGUuYXBwZW5kQ2hpbGQobCl9fXJldHVybiBBcnJheS5mcm9tKHQuY2hpbGROb2RlcykubWFwKCh0PT50aGlzLmNvbnZlcnQodCkpKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaCgodD0+ZS5hcHBlbmRDaGlsZCh0KSkpLGUubm9kZU5hbWUudG9VcHBlckNhc2UoKT09c0N0LkdST1VQJiYhZS5oYXNDaGlsZE5vZGVzKCl8fHRoaXMuc2hvdWxkT21pdE5vZGUodCk/bnVsbDp0aGlzLnN0cmlwQ2xhc3ModGhpcy50cmFuc2ZlclN0eWxlKHQsZSkpfXN0cmlwQ2xhc3ModCl7cmV0dXJuIHQubm9kZVR5cGU9PU5vZGUuRUxFTUVOVF9OT0RFJiZ0LnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKSx0fXRyYW5zZmVyU3R5bGUodCxlKXtpZihlLm5vZGVUeXBlIT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4gZTtjb25zdCBuPWUsaT1lLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkscj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KTtyZXR1cm4gaT09c0N0LlRFWFQmJk9iamVjdC5hc3NpZ24obi5zdHlsZSx7Zm9udEZhbWlseTpyLmZvbnRGYW1pbHksZm9udFNpemU6ci5mb250U2l6ZSxmb250V2VpZ2h0OnIuZm9udFdlaWdodH0pLGkhPXNDdC5HUk9VUCYmKG4uc2V0QXR0cmlidXRlKCJmaWxsIixyLmZpbGwpLG4uc2V0QXR0cmlidXRlKCJzdHJva2UiLHIuc3Ryb2tlKSxuLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIixyLnN0cm9rZVdpZHRoKSksIjEiIT1yLm9wYWNpdHkmJm4uc2V0QXR0cmlidXRlKCJvcGFjaXR5IixyLm9wYWNpdHkpLGV9c2hvdWxkT21pdE5vZGUodCl7cmV0dXJuITF9fXtzaG91bGRPbWl0Tm9kZSh0KXtyZXR1cm4gdC5ub2RlVHlwZT09Tm9kZS5FTEVNRU5UX05PREUmJnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzY2F0dGVyLXBsb3QiKX19ZWwoe21vZHVsZU5hbWU6InZ6LXBhbi16b29tLXN0eWxlIixzdHlsZUNvbnRlbnQ6IlxuICAgIC5oZWxwIHtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBhbmltYXRpb24tZGVsYXk6IDFzO1xuICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAxcztcbiAgICAgIGFuaW1hdGlvbi1uYW1lOiBmYWRlLW91dDtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMzAsIDMwLCAzMCwgMC42KTtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgbGVmdDogMDtcbiAgICAgIG9wYWNpdHk6IDE7XG4gICAgICBwYWRkaW5nOiAyMHB4O1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICByaWdodDogMDtcbiAgICAgIHRvcDogMDtcbiAgICB9XG5cbiAgICAuaGVscCA+IHNwYW4ge1xuICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcbiAgICB9XG5cbiAgICBAa2V5ZnJhbWVzIGZhZGUtb3V0IHtcbiAgICAgIDAlIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgIH1cblxuICAgICAgMTAwJSB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICB9XG4gICAgfVxuICAifSk7Y29uc3QgaEN0PXdUdCg0KSxkQ3Q9dD0+aXNOYU4odCk/Ik5hTiI6aEN0KHQpLHBDdD1be3RpdGxlOiJOYW1lIixldmFsdWF0ZTp0PT50LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfSx7dGl0bGU6IlNtb290aGVkIixldmFsdWF0ZSh0LGUpe2NvbnN0e3Ntb290aGluZ0VuYWJsZWQ6bn09ZTtyZXR1cm4gZEN0KG4/dC5kYXR1bS5zbW9vdGhlZDp0LmRhdHVtLnNjYWxhcil9fSx7dGl0bGU6IlZhbHVlIixldmFsdWF0ZTp0PT5kQ3QodC5kYXR1bS5zY2FsYXIpfSx7dGl0bGU6IlN0ZXAiLGV2YWx1YXRlOnQ9PlNUdCh0LmRhdHVtLnN0ZXApfSx7dGl0bGU6IlRpbWUiLGV2YWx1YXRlOnQ9PkVUdCh0LmRhdHVtLndhbGxfdGltZSl9LHt0aXRsZToiUmVsYXRpdmUiLGV2YWx1YXRlOnQ9PkNUdChUVHQodC5kYXR1bSwwLHQuZGF0YXNldCkpfV07bGV0IGZDdD1jbGFzcyBleHRlbmRzKGVyKHllKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29sb3JTY2FsZT0obmV3IHJPLlNjYWxlcy5Db2xvcikucmFuZ2UoZ0Euc2xpY2UoMCkpLHRoaXMuc21vb3RoaW5nRW5hYmxlZD0hMSx0aGlzLnNtb290aGluZ1dlaWdodD0uNix0aGlzLnhUeXBlPW51bGwsdGhpcy54Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kPW51bGwsdGhpcy55VmFsdWVBY2Nlc3Nvcj10PT50LnNjYWxhcix0aGlzLnRvb2x0aXBDb2x1bW5zPXBDdCx0aGlzLnlTY2FsZVR5cGU9YUN0LkxJTkVBUix0aGlzLmlnbm9yZVlPdXRsaWVycz0hMSx0aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kPSJkZWZhdWx0Iix0aGlzLnRvb2x0aXBQb3NpdGlvbj16VHQuQk9UVE9NLHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZT1bXSx0aGlzLl9zZXJpZXNEYXRhQ2FjaGU9e30sdGhpcy5fc2VyaWVzTWV0YWRhdGFDYWNoZT17fSx0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9bnVsbH1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLmNoYXJ0ZGl2LCEwKX1hdHRhY2hlZCgpe2NvbnN0IHQ9e2NhcHR1cmU6ITAscGFzc2l2ZTohMH07dGhpcy5fbGlzdGVuKHRoaXMsIm1vdXNlZG93biIsdGhpcy5fb25Nb3VzZURvd24uYmluZCh0aGlzKSx0KSx0aGlzLl9saXN0ZW4odGhpcywibW91c2V1cCIsdGhpcy5fb25Nb3VzZVVwLmJpbmQodGhpcyksdCksdGhpcy5fbGlzdGVuKHdpbmRvdywia2V5ZG93biIsdGhpcy5fb25LZXlEb3duLmJpbmQodGhpcyksdCksdGhpcy5fbGlzdGVuKHdpbmRvdywia2V5dXAiLHRoaXMuX29uS2V5VXAuYmluZCh0aGlzKSx0KX1kZXRhY2hlZCgpe3RoaXMuY2FuY2VsQXN5bmModGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkKSx0aGlzLl9jaGFydCYmKHRoaXMuX2NoYXJ0LmRlc3Ryb3koKSx0aGlzLl9jaGFydD12b2lkIDApLHRoaXMuX2xpc3RlbmVycyYmKHRoaXMuX2xpc3RlbmVycy5mb3JFYWNoKCgoe25vZGU6dCxldmVudE5hbWU6ZSxmdW5jOm4sb3B0aW9uOml9KT0+e3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLG4saSl9KSksdGhpcy5fbGlzdGVuZXJzLmNsZWFyKCkpfV9saXN0ZW4odCxlLG4saT17fSl7dGhpcy5fbGlzdGVuZXJzfHwodGhpcy5fbGlzdGVuZXJzPW5ldyBTZXQpLHRoaXMuX2xpc3RlbmVycy5hZGQoe25vZGU6dCxldmVudE5hbWU6ZSxmdW5jOm4sb3B0aW9uOml9KSx0LmFkZEV2ZW50TGlzdGVuZXIoZSxuLGkpfV9vbktleURvd24odCl7dGhpcy50b2dnbGVDbGFzcygicGFua2V5IixsQ3QuaXNQYW5LZXkodCkpfV9vbktleVVwKHQpe3RoaXMudG9nZ2xlQ2xhc3MoInBhbmtleSIsbEN0LmlzUGFuS2V5KHQpKX1fb25Nb3VzZURvd24odCl7dGhpcy50b2dnbGVDbGFzcygibW91c2Vkb3duIiwhMCl9X29uTW91c2VVcCh0KXt0aGlzLnRvZ2dsZUNsYXNzKCJtb3VzZWRvd24iLCExKX1pc0RhdGFGaXRUb0RvbWFpbigpe3JldHVybiF0aGlzLl9jaGFydHx8dGhpcy5fY2hhcnQuaXNEYXRhRml0VG9Eb21haW4oKX1zZXRWaXNpYmxlU2VyaWVzKHQpe1NlLmV4cG9ydHMuaXNFcXVhbCh0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUsdCl8fCh0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGU9dCl9c2V0U2VyaWVzRGF0YSh0LGUpe3RoaXMuX3Nlcmllc0RhdGFDYWNoZVt0XT1lLHRoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5zZXRTZXJpZXNEYXRhKHQsZSl9c2V0U2VyaWVzTWV0YWRhdGEodCxlKXt0aGlzLl9zZXJpZXNNZXRhZGF0YUNhY2hlW3RdPWUsdGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnNldFNlcmllc01ldGFkYXRhKHQsZSl9Y29tbWl0Q2hhbmdlcygpe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5jb21taXRDaGFuZ2VzKCl9cmVzZXREb21haW4oKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQucmVzZXREb21haW4oKX1yZWRyYXcoKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQucmVkcmF3KCl9X21ha2VDaGFydCgpe251bGwhPT10aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZCksdGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkPW51bGwpLHRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZD10aGlzLmFzeW5jKChmdW5jdGlvbigpe3RoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZD1udWxsO2xldCB0PXRoaXMueENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZDtpZih0aGlzLnhUeXBlfHx0P3RoaXMueFR5cGUmJih0PSgpPT5BVHQodGhpcy54VHlwZSkpOnQ9TVR0LHQmJnRoaXMueVZhbHVlQWNjZXNzb3ImJnRoaXMudG9vbHRpcENvbHVtbnMpe3ZhciBlPW5ldyBjQ3QodCx0aGlzLnlWYWx1ZUFjY2Vzc29yLHRoaXMueVNjYWxlVHlwZSx0aGlzLmNvbG9yU2NhbGUsdGhpcy4kLnRvb2x0aXAsdGhpcy50b29sdGlwQ29sdW1ucyx0aGlzLmZpbGxBcmVhLHRoaXMuZGVmYXVsdFhSYW5nZSx0aGlzLmRlZmF1bHRZUmFuZ2UsdGhpcy5zeW1ib2xGdW5jdGlvbix0aGlzLnhBeGlzRm9ybWF0dGVyKSxuPVN1KHRoaXMuJC5jaGFydGRpdik7ZS5yZW5kZXJUbyhuKSx0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuZGVzdHJveSgpLHRoaXMuX2NoYXJ0PWUsdGhpcy5fY2hhcnQub25BbmNob3IoKCgpPT50aGlzLmZpcmUoImNoYXJ0LWF0dGFjaGVkIikpKX19KSwzNTApfV9yZWxvYWRGcm9tQ2FjaGUoKXt0aGlzLl9jaGFydCYmKHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZS5mb3JFYWNoKCh0PT57dGhpcy5fY2hhcnQuc2V0U2VyaWVzRGF0YSh0LHRoaXMuX3Nlcmllc0RhdGFDYWNoZVt0XXx8W10pfSkpLHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZS5maWx0ZXIoKHQ9PnRoaXMuX3Nlcmllc01ldGFkYXRhQ2FjaGVbdF0pKS5mb3JFYWNoKCh0PT57dGhpcy5fY2hhcnQuc2V0U2VyaWVzTWV0YWRhdGEodCx0aGlzLl9zZXJpZXNNZXRhZGF0YUNhY2hlW3RdKX0pKSx0aGlzLl9jaGFydC5zZXRWaXNpYmxlU2VyaWVzKHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZSksdGhpcy5fY2hhcnQuY29tbWl0Q2hhbmdlcygpKX1fc21vb3RoaW5nQ2hhbmdlZCgpe3RoaXMuX2NoYXJ0JiYodGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuX2NoYXJ0LnNtb290aGluZ1VwZGF0ZSh0aGlzLnNtb290aGluZ1dlaWdodCk6dGhpcy5fY2hhcnQuc21vb3RoaW5nRGlzYWJsZSgpKX1fb3V0bGllcnNDaGFuZ2VkKCl7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0Lmlnbm9yZVlPdXRsaWVycyh0aGlzLmlnbm9yZVlPdXRsaWVycyl9X2NvbG9yU2NhbGVDaGFuZ2VkKCl7dGhpcy5fY2hhcnQmJih0aGlzLl9jaGFydC5zZXRDb2xvclNjYWxlKHRoaXMuY29sb3JTY2FsZSksdGhpcy5fY2hhcnQucmVkcmF3KCkpfV90b29sdGlwQ29sdW1uc0NoYW5nZWQoKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuc2V0VG9vbHRpcENvbHVtbnModGhpcy50b29sdGlwQ29sdW1ucyl9X3Rvb2x0aXBTb3J0aW5nTWV0aG9kQ2hhbmdlZCgpe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5zZXRUb29sdGlwU29ydGluZ01ldGhvZCh0aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kKX1nZXRFeHBvcnRlcigpe3JldHVybiBuZXcgdUN0KHRoaXMuJC5jaGFydGRpdil9fTtmQ3QudGVtcGxhdGU9X2VgCiAgICA8ZGl2IGlkPSJjaGFydGRpdiI+PC9kaXY+CiAgICA8dnotY2hhcnQtdG9vbHRpcAogICAgICBpZD0idG9vbHRpcCIKICAgICAgcG9zaXRpb249IltbdG9vbHRpcFBvc2l0aW9uXV0iCiAgICAgIGNvbnRlbnQtY29tcG9uZW50LW5hbWU9InZ6LWxpbmUtY2hhcnQtdG9vbHRpcCIKICAgID48L3Z6LWNoYXJ0LXRvb2x0aXA+CiAgICA8c3R5bGUgaW5jbHVkZT0icGxvdHRhYmxlLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZ6LXBhbi16b29tLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQogICAgICBkaXYgewogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgIH0KCiAgICAgICNjaGFydGRpdiAubWFpbiB7CiAgICAgICAgY29udGFpbjogc3RyaWN0OwogICAgICAgIGN1cnNvcjogY3Jvc3NoYWlyOwogICAgICB9CgogICAgICA6aG9zdCgucGFua2V5KSAjY2hhcnRkaXYgOm5vdCguZHJhZy16b29taW5nKSAubWFpbiB7CiAgICAgICAgY3Vyc29yOiAtd2Via2l0LWdyYWI7CiAgICAgICAgY3Vyc29yOiBncmFiOwogICAgICB9CgogICAgICA6aG9zdCgubW91c2Vkb3duKSAjY2hhcnRkaXYgLnBhbm5pbmcgLm1haW4gewogICAgICAgIGN1cnNvcjogLXdlYmtpdC1ncmFiYmluZzsKICAgICAgICBjdXJzb3I6IGdyYWJiaW5nOwogICAgICB9CgogICAgICAjY2hhcnRkaXYgewogICAgICAgIGNvbnRhaW46IHN0cmljdDsKICAgICAgfQoKICAgICAgI2NoYXJ0ZGl2IGxpbmUuZ3VpZGUtbGluZSB7CiAgICAgICAgc3Ryb2tlOiAjOTk5OwogICAgICAgIHN0cm9rZS13aWR0aDogMS41cHg7CiAgICAgIH0KICAgICAgI2NoYXJ0ZGl2OmhvdmVyIC5tYWluIHsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAuZ2hvc3QgewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQoKICAgICAgLnBsb3R0YWJsZSAuYXhpcyB0ZXh0IHsKICAgICAgICBmaWxsOiBjdXJyZW50Q29sb3I7CiAgICAgIH0KCiAgICAgIC5wbG90dGFibGUgLmdyaWRsaW5lcyBsaW5lIHsKICAgICAgICBzdHJva2U6IHZhcigtLXRiLXNlY29uZGFyeS10ZXh0LWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLHJPLlNjYWxlcy5Db2xvcildLGZDdC5wcm90b3R5cGUsImNvbG9yU2NhbGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pXSxmQ3QucHJvdG90eXBlLCJzeW1ib2xGdW5jdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxmQ3QucHJvdG90eXBlLCJzbW9vdGhpbmdFbmFibGVkIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLGZDdC5wcm90b3R5cGUsInNtb290aGluZ1dlaWdodCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxmQ3QucHJvdG90eXBlLCJ4VHlwZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLGZDdC5wcm90b3R5cGUsInhDb21wb25lbnRzQ3JlYXRpb25NZXRob2QiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pXSxmQ3QucHJvdG90eXBlLCJ4QXhpc0Zvcm1hdHRlciIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLGZDdC5wcm90b3R5cGUsInlWYWx1ZUFjY2Vzc29yIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxmQ3QucHJvdG90eXBlLCJ0b29sdGlwQ29sdW1ucyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxmQ3QucHJvdG90eXBlLCJmaWxsQXJlYSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sZkN0LnByb3RvdHlwZSwiZGVmYXVsdFhSYW5nZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sZkN0LnByb3RvdHlwZSwiZGVmYXVsdFlSYW5nZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxmQ3QucHJvdG90eXBlLCJ5U2NhbGVUeXBlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sZkN0LnByb3RvdHlwZSwiaWdub3JlWU91dGxpZXJzIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGZDdC5wcm90b3R5cGUsInRvb2x0aXBTb3J0aW5nTWV0aG9kIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGZDdC5wcm90b3R5cGUsInRvb2x0aXBQb3NpdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxmQ3QucHJvdG90eXBlLCJfY2hhcnQiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLGZDdC5wcm90b3R5cGUsIl92aXNpYmxlU2VyaWVzQ2FjaGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sZkN0LnByb3RvdHlwZSwiX3Nlcmllc0RhdGFDYWNoZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxmQ3QucHJvdG90eXBlLCJfc2VyaWVzTWV0YWRhdGFDYWNoZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxmQ3QucHJvdG90eXBlLCJfbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkIix2b2lkIDApLHQoW2EoInhDb21wb25lbnRzQ3JlYXRpb25NZXRob2QiLCJ4VHlwZSIsInlWYWx1ZUFjY2Vzc29yIiwieVNjYWxlVHlwZSIsImlzQXR0YWNoZWQiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGZDdC5wcm90b3R5cGUsIl9tYWtlQ2hhcnQiLG51bGwpLHQoW2EoIl9jaGFydCIsIl92aXNpYmxlU2VyaWVzQ2FjaGUiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGZDdC5wcm90b3R5cGUsIl9yZWxvYWRGcm9tQ2FjaGUiLG51bGwpLHQoW2EoInNtb290aGluZ0VuYWJsZWQiLCJzbW9vdGhpbmdXZWlnaHQiLCJfY2hhcnQiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGZDdC5wcm90b3R5cGUsIl9zbW9vdGhpbmdDaGFuZ2VkIixudWxsKSx0KFthKCJpZ25vcmVZT3V0bGllcnMiLCJfY2hhcnQiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGZDdC5wcm90b3R5cGUsIl9vdXRsaWVyc0NoYW5nZWQiLG51bGwpLHQoW2EoImNvbG9yU2NhbGUiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGZDdC5wcm90b3R5cGUsIl9jb2xvclNjYWxlQ2hhbmdlZCIsbnVsbCksdChbYSgidG9vbHRpcENvbHVtbnMiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGZDdC5wcm90b3R5cGUsIl90b29sdGlwQ29sdW1uc0NoYW5nZWQiLG51bGwpLHQoW2EoInRvb2x0aXBTb3J0aW5nTWV0aG9kIiwiX2NoYXJ0IiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxmQ3QucHJvdG90eXBlLCJfdG9vbHRpcFNvcnRpbmdNZXRob2RDaGFuZ2VkIixudWxsKSxmQ3Q9dChbaSgidnotbGluZS1jaGFydDIiKV0sZkN0KTtsZXQgbUN0PWNsYXNzIGV4dGVuZHMgeWV7fTttQ3QudGVtcGxhdGU9X2VgCiAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgPHRhYmxlPgogICAgICAgIDx0aGVhZD48L3RoZWFkPgogICAgICAgIDx0Ym9keT48L3Rib2R5PgogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLmNvbnRlbnQgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC44KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgdGFibGUgewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBsaW5lLWhlaWdodDogMS40ZW07CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgIH0KCiAgICAgIHRoZWFkIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KCiAgICAgIHRib2R5IHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIxcHg7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgdGQgewogICAgICAgIHBhZGRpbmc6IDAgNXB4OwogICAgICB9CgogICAgICAuc3dhdGNoIHsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICAgIHdpZHRoOiAxOHB4OwogICAgICB9CgogICAgICAuY2xvc2VzdCAuc3dhdGNoIHsKICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAycHggI2ZmZjsKICAgICAgfQoKICAgICAgdGggewogICAgICAgIHBhZGRpbmc6IDAgNXB4OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIC5kaXN0YW50IHRkOm5vdCguc3dhdGNoKSB7CiAgICAgICAgb3BhY2l0eTogMC44OwogICAgICB9CgogICAgICAuZ2hvc3QgewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLG1DdD10KFtpKCJ2ei1saW5lLWNoYXJ0LXRvb2x0aXAiKV0sbUN0KTtjb25zdCBnQ3Q9W10sX0N0PVNlLmV4cG9ydHMudGhyb3R0bGUoKGZ1bmN0aW9uIHQoKXtpZigwPT1nQ3QubGVuZ3RoKXJldHVybjtjb25zdCBlPWdDdC5zaGlmdCgpO2UmJmUuYWN0aXZlJiYoZS5yZWRyYXcoKSxlLl9tYXliZVJlbmRlcmVkSW5CYWRTdGF0ZT0hMSksd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKDApLHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodCl9KSwxMDApO2xldCB5Q3Q9Y2xhc3MgZXh0ZW5kcyhMVHQoZXIoeWUpKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX3JlZHJhd1JhZj1udWxsLHRoaXMuYWN0aXZlPSExLHRoaXMubG9nU2NhbGVBY3RpdmU9ITEsdGhpcy5jb2xvclNjYWxlPXtzY2FsZTpHUn0sdGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkPSEwLHRoaXMuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlPSExfW9uTG9hZEZpbmlzaCgpe3RoaXMuY29tbWl0Q2hhbmdlcygpLHRoaXMuZGF0YVRvTG9hZC5sZW5ndGg+MCYmdGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkJiYodGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkPSExLHRoaXMuZ2V0Q2hhcnQoKS5yZXNldERvbWFpbigpKSx0aGlzLnJlZHJhdygpfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKSxudWxsIT09dGhpcy5fcmVkcmF3UmFmJiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWRyYXdSYWYpfWV4cG9ydEFzU3ZnU3RyaW5nKCl7cmV0dXJuIHRoaXMuZ2V0Q2hhcnQoKS5nZXRFeHBvcnRlcigpLmV4cG9ydEFzU3RyaW5nKCl9Z2V0Q2hhcnQoKXtyZXR1cm4gdGhpcy4kLmNoYXJ0fXJlc2V0RG9tYWluKCl7dGhpcy5nZXRDaGFydCgpLnJlc2V0RG9tYWluKCl9c2V0U2VyaWVzRGF0YSh0LGUpe3RoaXMuZ2V0Q2hhcnQoKS5zZXRTZXJpZXNEYXRhKHQsZSl9c2V0U2VyaWVzTWV0YWRhdGEodCxlKXt0aGlzLmdldENoYXJ0KCkuc2V0U2VyaWVzTWV0YWRhdGEodCxlKX1jb21taXRDaGFuZ2VzKCl7dGhpcy5nZXRDaGFydCgpLmNvbW1pdENoYW5nZXMoKX1yZWRyYXcoKXtudWxsIT09dGhpcy5fcmVkcmF3UmFmJiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWRyYXdSYWYpLHRoaXMuX3JlZHJhd1JhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+e3RoaXMuYWN0aXZlP3RoaXMuZ2V0Q2hhcnQoKS5yZWRyYXcoKTp0aGlzLl9tYXliZVJlbmRlcmVkSW5CYWRTdGF0ZT0hMH0pKX1fbG9hZEtleUNoYW5nZWQoKXt0aGlzLnJlc2V0KCksdGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkPSEwfV9kYXRhU2VyaWVzQ2hhbmdlZCgpe3RoaXMuZ2V0Q2hhcnQoKS5zZXRWaXNpYmxlU2VyaWVzKHRoaXMuZGF0YVNlcmllcyl9X2xvZ1NjYWxlQ2hhbmdlZCh0KXt0aGlzLmdldENoYXJ0KCkueVNjYWxlVHlwZT10P2FDdC5MT0c6YUN0LkxJTkVBUix0aGlzLnJlZHJhdygpfV9maXhCYWRTdGF0ZVdoZW5BY3RpdmUoKXt0aGlzLmFjdGl2ZSYmdGhpcy5fbWF5YmVSZW5kZXJlZEluQmFkU3RhdGUmJihnQ3QucHVzaCh0aGlzKSxfQ3QoKSl9X29uQ2hhcnRBdHRhY2hlZCgpe3RoaXMuYWN0aXZlfHwodGhpcy5fbWF5YmVSZW5kZXJlZEluQmFkU3RhdGU9ITApfX07eUN0LnRlbXBsYXRlPV9lYAogICAgPGRpdiBpZD0iY2hhcnQtYW5kLXNwaW5uZXItY29udGFpbmVyIj4KICAgICAgPHZ6LWxpbmUtY2hhcnQyCiAgICAgICAgaWQ9ImNoYXJ0IgogICAgICAgIGRhdGEtbG9hZGluZyQ9IltbZGF0YUxvYWRpbmddXSIKICAgICAgICBkYXRhLWxvYWRlZC1vbmNlJD0iW1tkYXRhTG9hZGVkQXRMZWFzdE9uY2VdXSIKICAgICAgICBjb2xvci1zY2FsZT0iW1tjb2xvclNjYWxlXV0iCiAgICAgICAgZGVmYXVsdC14LXJhbmdlPSJbW2RlZmF1bHRYUmFuZ2VdXSIKICAgICAgICBkZWZhdWx0LXktcmFuZ2U9IltbZGVmYXVsdFlSYW5nZV1dIgogICAgICAgIGZpbGwtYXJlYT0iW1tmaWxsQXJlYV1dIgogICAgICAgIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIgogICAgICAgIG9uLWNoYXJ0LWF0dGFjaGVkPSJfb25DaGFydEF0dGFjaGVkIgogICAgICAgIHNtb290aGluZy1lbmFibGVkPSJbW3Ntb290aGluZ0VuYWJsZWRdXSIKICAgICAgICBzbW9vdGhpbmctd2VpZ2h0PSJbW3Ntb290aGluZ1dlaWdodF1dIgogICAgICAgIHN5bWJvbC1mdW5jdGlvbj0iW1tzeW1ib2xGdW5jdGlvbl1dIgogICAgICAgIHRvb2x0aXAtY29sdW1ucz0iW1t0b29sdGlwQ29sdW1uc11dIgogICAgICAgIHRvb2x0aXAtcG9zaXRpb249IltbdG9vbHRpcFBvc2l0aW9uXV0iCiAgICAgICAgdG9vbHRpcC1zb3J0aW5nLW1ldGhvZD0iW1t0b29sdGlwU29ydGluZ01ldGhvZF1dIgogICAgICAgIHgtY29tcG9uZW50cy1jcmVhdGlvbi1tZXRob2Q9IltbeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZF1dIgogICAgICAgIHgtdHlwZT0iW1t4VHlwZV1dIgogICAgICAgIHktdmFsdWUtYWNjZXNzb3I9IltbeVZhbHVlQWNjZXNzb3JdXSIKICAgICAgPjwvdnotbGluZS1jaGFydDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tkYXRhTG9hZGluZ11dIj4KICAgICAgICA8ZGl2IGlkPSJsb2FkaW5nLXNwaW5uZXItY29udGFpbmVyIj4KICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlPSIiPjwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICA6aG9zdChbX21heWJlLXJlbmRlcmVkLWluLWJhZC1zdGF0ZV0pIHZ6LWxpbmUtY2hhcnQgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI2NoYXJ0LWFuZC1zcGlubmVyLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjbG9hZGluZy1zcGlubmVyLWNvbnRhaW5lciB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydDIgewogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydDJbZGF0YS1sb2FkaW5nXSB7CiAgICAgICAgb3BhY2l0eTogMC4zOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfZml4QmFkU3RhdGVXaGVuQWN0aXZlIn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0seUN0LnByb3RvdHlwZSwiYWN0aXZlIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSx5Q3QucHJvdG90eXBlLCJkYXRhU2VyaWVzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLGRyKV0seUN0LnByb3RvdHlwZSwicmVxdWVzdE1hbmFnZXIiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfbG9nU2NhbGVDaGFuZ2VkIn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0seUN0LnByb3RvdHlwZSwibG9nU2NhbGVBY3RpdmUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0seUN0LnByb3RvdHlwZSwieENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx5Q3QucHJvdG90eXBlLCJ4VHlwZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLHlDdC5wcm90b3R5cGUsInlWYWx1ZUFjY2Vzc29yIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHlDdC5wcm90b3R5cGUsImZpbGxBcmVhIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0seUN0LnByb3RvdHlwZSwic21vb3RoaW5nRW5hYmxlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSx5Q3QucHJvdG90eXBlLCJzbW9vdGhpbmdXZWlnaHQiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLHlDdC5wcm90b3R5cGUsInRvb2x0aXBDb2x1bW5zIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHlDdC5wcm90b3R5cGUsInRvb2x0aXBTb3J0aW5nTWV0aG9kIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHlDdC5wcm90b3R5cGUsInRvb2x0aXBQb3NpdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLHlDdC5wcm90b3R5cGUsImlnbm9yZVlPdXRsaWVycyIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0seUN0LnByb3RvdHlwZSwiZGVmYXVsdFhSYW5nZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0seUN0LnByb3RvdHlwZSwiZGVmYXVsdFlSYW5nZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLHlDdC5wcm90b3R5cGUsInN5bWJvbEZ1bmN0aW9uIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHlDdC5wcm90b3R5cGUsImNvbG9yU2NhbGUiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSx5Q3QucHJvdG90eXBlLCJfcmVzZXREb21haW5Pbk5leHRMb2FkIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLHlDdC5wcm90b3R5cGUsIl9tYXliZVJlbmRlcmVkSW5CYWRTdGF0ZSIsdm9pZCAwKSx0KFthKCJsb2FkS2V5IiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSx5Q3QucHJvdG90eXBlLCJfbG9hZEtleUNoYW5nZWQiLG51bGwpLHQoW2EoImRhdGFTZXJpZXMuKiIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0seUN0LnByb3RvdHlwZSwiX2RhdGFTZXJpZXNDaGFuZ2VkIixudWxsKSx5Q3Q9dChbaSgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpXSx5Q3QpLGVsKHttb2R1bGVOYW1lOiJ0Zi1jdXN0b20tc2NhbGFyLWNhcmQtc3R5bGUiLHN0eWxlQ29udGVudDoiXG4gICAgOmhvc3Qge1xuICAgICAgbWFyZ2luOiA1cHggMTBweDtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIHdpZHRoOiAzMzBweDtcbiAgICAgIHZlcnRpY2FsLWFsaWduOiB0ZXh0LXRvcDtcbiAgICB9XG5cbiAgICA6aG9zdChbX2V4cGFuZGVkXSkge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgOmhvc3QoW19leHBhbmRlZF0pICN0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciB7XG4gICAgICBoZWlnaHQ6IDQwMHB4O1xuICAgIH1cblxuICAgIGgxIHtcbiAgICAgIGZvbnQtc2l6ZTogMTlweDtcbiAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgfVxuXG4gICAgI3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIHtcbiAgICAgIGhlaWdodDogMjAwcHg7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAjYnV0dG9ucyB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICB9XG5cbiAgICBwYXBlci1pY29uLWJ1dHRvbiB7XG4gICAgICBjb2xvcjogIzIxOTZmMztcbiAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgICB3aWR0aDogMzJweDtcbiAgICAgIGhlaWdodDogMzJweDtcbiAgICAgIHBhZGRpbmc6IDRweDtcbiAgICB9XG5cbiAgICBwYXBlci1pY29uLWJ1dHRvbltzZWxlY3RlZF0ge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTtcbiAgICB9XG5cbiAgICAuZG93bmxvYWQtbGlua3Mge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGhlaWdodDogMzJweDtcbiAgICB9XG5cbiAgICAuZG93bmxvYWQtbGlua3MgYSB7XG4gICAgICBmb250LXNpemU6IDEwcHg7XG4gICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7XG4gICAgICBtYXJnaW46IDJweDtcbiAgICB9XG5cbiAgICAuZG93bmxvYWQtbGlua3MgcGFwZXItZHJvcGRvd24tbWVudSB7XG4gICAgICB3aWR0aDogMTAwcHg7XG4gICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDoge1xuICAgICAgICBmb250LXNpemU6IDEwcHg7XG4gICAgICB9XG4gICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDoge1xuICAgICAgICBmb250LXNpemU6IDEwcHg7XG4gICAgICB9XG4gICAgfVxuICAifSk7Y2xhc3MgdkN0e2NvbnN0cnVjdG9yKHQsZSxuLGkscil7dGhpcy5ydW49dCx0aGlzLnRhZz1lLHRoaXMubmFtZT1uLHRoaXMuc2NhbGFyRGF0YT1pLHRoaXMuc3ltYm9sPXJ9Z2V0TmFtZSgpe3JldHVybiB0aGlzLm5hbWV9c2V0RGF0YSh0KXt0aGlzLnNjYWxhckRhdGE9dH1nZXREYXRhKCl7cmV0dXJuIHRoaXMuc2NhbGFyRGF0YX1nZXRSdW4oKXtyZXR1cm4gdGhpcy5ydW59Z2V0VGFnKCl7cmV0dXJuIHRoaXMudGFnfWdldFN5bWJvbCgpe3JldHVybiB0aGlzLnN5bWJvbH19ZnVuY3Rpb24gYkN0KHQsZSl7cmV0dXJuYCR7ZX0gKCR7dH0pYH1jbGFzcyB4Q3R7Y29uc3RydWN0b3IodCl7dGhpcy5ydW5CYXNlZENvbG9yU2NhbGU9dH1zY2FsZSh0KXtyZXR1cm4gdGhpcy5ydW5CYXNlZENvbG9yU2NhbGUuc2NhbGUodGhpcy5wYXJzZVJ1bk5hbWUodCkpfXBhcnNlUnVuTmFtZSh0KXtjb25zdCBlPXQubWF0Y2goL1woKC4qKVwpJC8pO3JldHVybiBlP2VbMV06IiJ9fWxldCB3Q3Q9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmFjdGl2ZT0hMCx0aGlzLl9jb2xvclNjYWxlPW5ldyB4Q3Qoe3NjYWxlOkdSfSksdGhpcy5fbmFtZVRvRGF0YVNlcmllcz17fSx0aGlzLl9leHBhbmRlZD0hMSx0aGlzLl9yZXF1ZXN0RGF0YT0odCxlLG4pPT57Y29uc3QgaT1fcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9zY2FsYXJzIik7UHJvbWlzZS5hbGwodC5tYXAoKHQ9Pntjb25zdCBuPWlPKGkse3RhZzp0aGlzLl90YWdGaWx0ZXIscnVuOnR9KTtyZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KG4pLnRoZW4oKG49PntlKHtpdGVtOnQsZGF0YTpufSl9KSl9KSkpLmZpbmFsbHkoKCgpPT57bigpfSkpfSx0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleD17fSx0aGlzLl9tYXRjaGVzTGlzdE9wZW5lZD0hMSx0aGlzLl9maWxsQXJlYT17bG93ZXJBY2Nlc3Nvcjp0PT50Lmxvd2VyLGhpZ2hlckFjY2Vzc29yOnQ9PnQudXBwZXJ9LHRoaXMuX3Rvb2x0aXBDb2x1bW5zPSgoKT0+e2NvbnN0IHQ9d1R0KDQpLGU9ZT0+aXNOYU4oZSk/Ik5hTiI6dChlKTtyZXR1cm5be3RpdGxlOiJOYW1lIixldmFsdWF0ZTp0PT50LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfSx7dGl0bGU6IlZhbHVlIixldmFsdWF0ZTp0PT5lKHQuZGF0dW0uc2NhbGFyKX0se3RpdGxlOiJMb3dlciBNYXJnaW4iLGV2YWx1YXRlOnQ9PmUodC5kYXR1bS5sb3dlcil9LHt0aXRsZToiVXBwZXIgTWFyZ2luIixldmFsdWF0ZTp0PT5lKHQuZGF0dW0udXBwZXIpfSx7dGl0bGU6IlN0ZXAiLGV2YWx1YXRlOnQ9PlNUdCh0LmRhdHVtLnN0ZXApfSx7dGl0bGU6IlRpbWUiLGV2YWx1YXRlOnQ9PkVUdCh0LmRhdHVtLndhbGxfdGltZSl9LHt0aXRsZToiUmVsYXRpdmUiLGV2YWx1YXRlOnQ9PkNUdChUVHQodC5kYXR1bSwwLHQuZGF0YXNldCkpfV19KSgpLHRoaXMuX21pc3NpbmdUYWdzPVtdLHRoaXMuX21pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuZWQ9ITF9cmVsb2FkKCl7dGhpcy4kLmxvYWRlci5yZWxvYWQoKX1yZWRyYXcoKXt0aGlzLiQubG9hZGVyLnJlZHJhdygpfV90b2dnbGVFeHBhbmRlZCh0KXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpLHRoaXMucmVkcmF3KCl9X3RvZ2dsZUxvZ1NjYWxlKCl7dGhpcy5zZXQoIl9sb2dTY2FsZUFjdGl2ZSIsIXRoaXMuX2xvZ1NjYWxlQWN0aXZlKX1fcmVzZXREb21haW4oKXtjb25zdCB0PXRoaXMuJC5sb2FkZXI7dCYmdC5yZXNldERvbWFpbigpfV9jc3ZVcmwodCxlKXtyZXR1cm4gZT9pTyh0aGlzLl9kb3dubG9hZERhdGFVcmwodCxlKSx7Zm9ybWF0OiJjc3YifSk6IiJ9X2pzb25VcmwodCxlKXtyZXR1cm4gZT9pTyh0aGlzLl9kb3dubG9hZERhdGFVcmwodCxlKSx7Zm9ybWF0OiJqc29uIn0pOiIifV9kb3dubG9hZERhdGFVcmwodCxlKXtjb25zdCBuPXRbZV0saT17dGFnOm4uZ2V0VGFnKCkscnVuOm4uZ2V0UnVuKCl9O3JldHVybiBpTyhfcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9kb3dubG9hZF9kYXRhIiksaSl9X2NyZWF0ZVByb2Nlc3NEYXRhRnVuY3Rpb24odCl7cmV0dXJuKGUsbixpKT0+e2lmKCFpLnJlZ2V4X3ZhbGlkKXJldHVybiB2b2lkIHRoaXMuc2V0KCJfdGFnRmlsdGVySW52YWxpZCIsITApO2NvbnN0IHI9U2UuZXhwb3J0cy5jbG9uZSh0aGlzLl9uYW1lVG9EYXRhU2VyaWVzKSxvPVtdO1NlLmV4cG9ydHMuZm9yRWFjaCh0LCh0PT57bGV0IGU9ITE7Y29uc3QgYT1pLnRhZ190b19ldmVudHNbdC52YWx1ZV0scz1pLnRhZ190b19ldmVudHNbdC5sb3dlcl0sbD1pLnRhZ190b19ldmVudHNbdC51cHBlcl07aWYoU2UuZXhwb3J0cy5pc1VuZGVmaW5lZChhKSYmKG8ucHVzaCh0LnZhbHVlKSxlPSEwKSxTZS5leHBvcnRzLmlzVW5kZWZpbmVkKHMpJiYoby5wdXNoKHQubG93ZXIpLGU9ITApLFNlLmV4cG9ydHMuaXNVbmRlZmluZWQobCkmJihvLnB1c2godC51cHBlciksZT0hMCksZSlyZXR1cm47Y29uc3QgYz10PT50WzFdLHU9dGhpcy5fZmluZFN0ZXBNaXNtYXRjaCh0LGEubWFwKGMpLHMubWFwKGMpLGwubWFwKGMpKTtpZih1KXJldHVybiB2b2lkIHRoaXMuc2V0KCJfc3RlcHNNaXNtYXRjaCIsdSk7Y29uc3QgaD10PT50WzJdLGQ9YS5tYXAoKCh0LGUpPT4oe3dhbGxfdGltZTpuZXcgRGF0ZSgxZTMqdFswXSksc3RlcDpjKHQpLHNjYWxhcjpoKHQpLGxvd2VyOmgoc1tlXSksdXBwZXI6aChsW2VdKX0pKSkscD1iQ3Qobix0LnZhbHVlKSxmPXJbcF07aWYoZilmLnNldERhdGEoZCk7ZWxzZXtjb25zdCBlPXRoaXMuX2NyZWF0ZU5ld0RhdGFTZXJpZXMobix0LnZhbHVlLHAsZCk7cltwXT1lfX0pKSx0aGlzLnNldCgiX25hbWVUb0RhdGFTZXJpZXMiLHIpO2NvbnN0IGE9U2UuZXhwb3J0cy5maW5kSW5kZXgodGhpcy5fbWlzc2luZ1RhZ3MsKHQ9PnQucnVuPT09bikpO2lmKG8ubGVuZ3RoJiYzIT1vLmxlbmd0aCl7Y29uc3QgdD17cnVuOm4sdGFnczpvfTthPj0wP3RoaXMuc3BsaWNlKCJfbWlzc2luZ1RhZ3MiLGEsMSx0KTp0aGlzLnB1c2goIl9taXNzaW5nVGFncyIsdCl9ZWxzZSBhPj0wJiZ0aGlzLnNwbGljZSgiX21pc3NpbmdUYWdzIixhLDEpfX1fZmluZFN0ZXBNaXNtYXRjaCh0LGUsbixpKXtyZXR1cm4gU2UuZXhwb3J0cy5pc0VxdWFsKG4sZSkmJlNlLmV4cG9ydHMuaXNFcXVhbChpLGUpP251bGw6e3Nlcmllc09iamVjdDp0LHZhbHVlU3RlcHM6ZSxsb3dlclN0ZXBzOm4sdXBwZXJTdGVwczppfX1fY3JlYXRlTmV3RGF0YVNlcmllcyh0LGUsbixpKXt0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFt0XXw9MDtjb25zdCByPW5ldyB2Q3QodCxlLG4saSxiVHRbdGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbdF1dKTtyZXR1cm4gdGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbdF09KHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W3RdKzEpJWJUdC5sZW5ndGgscn1fdXBkYXRlQ2hhcnQoKXtTZS5leHBvcnRzLmZvck93bih0aGlzLl9uYW1lVG9EYXRhU2VyaWVzLCh0PT57dGhpcy4kLmxvYWRlci5zZXRTZXJpZXNEYXRhKHQuZ2V0TmFtZSgpLHQuZ2V0RGF0YSgpKX0pKSx0aGlzLiQubG9hZGVyLmNvbW1pdENoYW5nZXMoKX1nZXQgX3Nlcmllc05hbWVzKCl7Y29uc3QgdD1uZXcgU2V0KHRoaXMucnVucyk7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuX25hbWVUb0RhdGFTZXJpZXMpLmZpbHRlcigoKFtlLG5dKT0+dC5oYXMobi5ydW4pKSkubWFwKCgoW3RdKT0+dCkpfV9kZXRlcm1pbmVDb2xvcih0LGUpe3JldHVybiB0LnNjYWxlKGUpfV9yZWZyZXNoRGF0YVNlcmllcygpe3RoaXMuc2V0KCJfbmFtZVRvRGF0YVNlcmllcyIse30pfV9jcmVhdGVTeW1ib2xGdW5jdGlvbigpe3JldHVybiB0PT50aGlzLl9uYW1lVG9EYXRhU2VyaWVzW3RdLmdldFN5bWJvbCgpLm1ldGhvZCgpfV9kZXRlcm1pbmVTeW1ib2wodCxlKXtyZXR1cm4gdFtlXS5nZXRTeW1ib2woKS5jaGFyYWN0ZXJ9Z2V0IF90YWdGaWx0ZXIoKXtyZXR1cm4gU2UuZXhwb3J0cy5mbGF0dGVuKHRoaXMubWFyZ2luQ2hhcnRTZXJpZXMubWFwKCh0PT5bdC52YWx1ZSx0Lmxvd2VyLHQudXBwZXJdKSkpLm1hcCgodD0+IigiK3RoaXMuX2VzY2FwZVJlZ2V4Q2hhcmFjdGVycyh0KSsiKSIpKS5qb2luKCJ8Iil9X2VzY2FwZVJlZ2V4Q2hhcmFjdGVycyh0KXtyZXR1cm4gdC5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywiXFwkJiIpfV9nZXRUb2dnbGVDb2xsYXBzaWJsZUljb24odCl7cmV0dXJuIHQ/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifV90b2dnbGVNYXRjaGVzT3Blbigpe3RoaXMuc2V0KCJfbWF0Y2hlc0xpc3RPcGVuZWQiLCF0aGlzLl9tYXRjaGVzTGlzdE9wZW5lZCl9Z2V0IF90aXRsZURpc3BsYXlTdHJpbmcoKXtyZXR1cm4gdGhpcy50aXRsZXx8InVudGl0bGVkIn1fc2VwYXJhdGVXaXRoQ29tbWFzKHQpe3JldHVybiB0LmpvaW4oIiwgIil9X3RvZ2dsZU1pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuKCl7dGhpcy5zZXQoIl9taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkIiwhdGhpcy5fbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZCl9X21hdGNoTGlzdEVudHJ5Q29sb3JVcGRhdGVkKCl7Y29uc3QgdD10aGlzLiQkKCIjbWF0Y2gtbGlzdC1yZXBlYXQiKTt0JiZ0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLm1hdGNoLWxpc3QtZW50cnkiKS5mb3JFYWNoKChlPT57Y29uc3Qgbj10Lml0ZW1Gb3JFbGVtZW50KGUpO2Uuc3R5bGUuY29sb3I9dGhpcy5fZGV0ZXJtaW5lQ29sb3IodGhpcy5fY29sb3JTY2FsZSxuKX0pKX19O3dDdC50ZW1wbGF0ZT1fZWAKICAgIDx0Zi1jYXJkLWhlYWRpbmcgZGlzcGxheS1uYW1lPSJbW190aXRsZURpc3BsYXlTdHJpbmddXSI+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8ZGl2IGlkPSJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciI+CiAgICAgIDx0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyCiAgICAgICAgaWQ9ImxvYWRlciIKICAgICAgICBhY3RpdmU9IltbYWN0aXZlXV0iCiAgICAgICAgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIKICAgICAgICBkYXRhLXNlcmllcz0iW1tfc2VyaWVzTmFtZXNdXSIKICAgICAgICBmaWxsLWFyZWE9IltbX2ZpbGxBcmVhXV0iCiAgICAgICAgaWdub3JlLXktb3V0bGllcnM9IltbaWdub3JlWU91dGxpZXJzXV0iCiAgICAgICAgbG9hZC1rZXk9IltbX3RhZ0ZpbHRlcl1dIgogICAgICAgIGRhdGEtdG8tbG9hZD0iW1tydW5zXV0iCiAgICAgICAgcmVxdWVzdC1kYXRhPSJbW19yZXF1ZXN0RGF0YV1dIgogICAgICAgIGxvZy1zY2FsZS1hY3RpdmU9IltbX2xvZ1NjYWxlQWN0aXZlXV0iCiAgICAgICAgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKG1hcmdpbkNoYXJ0U2VyaWVzKV1dIgogICAgICAgIHJlcXVlc3QtbWFuYWdlcj0iW1tyZXF1ZXN0TWFuYWdlcl1dIgogICAgICAgIHN5bWJvbC1mdW5jdGlvbj0iW1tfY3JlYXRlU3ltYm9sRnVuY3Rpb24oKV1dIgogICAgICAgIHRvb2x0aXAtY29sdW1ucz0iW1tfdG9vbHRpcENvbHVtbnNdXSIKICAgICAgICB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iCiAgICAgICAgeC10eXBlPSJbW3hUeXBlXV0iCiAgICAgID4KICAgICAgPC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJidXR0b25zIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIgogICAgICAgIGljb249ImZ1bGxzY3JlZW4iCiAgICAgICAgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiCiAgICAgID48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICBzZWxlY3RlZCQ9IltbX2xvZ1NjYWxlQWN0aXZlXV0iCiAgICAgICAgaWNvbj0ibGluZS13ZWlnaHQiCiAgICAgICAgb24tdGFwPSJfdG9nZ2xlTG9nU2NhbGUiCiAgICAgICAgdGl0bGU9IlRvZ2dsZSB5LWF4aXMgbG9nIHNjYWxlIgogICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgaWNvbj0ic2V0dGluZ3Mtb3ZlcnNjYW4iCiAgICAgICAgb24tdGFwPSJfcmVzZXREb21haW4iCiAgICAgICAgdGl0bGU9IkZpdCBkb21haW4gdG8gZGF0YSIKICAgICAgPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxzcGFuIHN0eWxlPSJmbGV4LWdyb3c6IDEiPjwvc3Bhbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dEb3dubG9hZExpbmtzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImRvd25sb2FkLWxpbmtzIj4KICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51CiAgICAgICAgICAgIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIgogICAgICAgICAgICBsYWJlbD0ic2VyaWVzIHRvIGRvd25sb2FkIgogICAgICAgICAgICBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWR9fSIKICAgICAgICAgID4KICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgICAgICAgICBpdGVtcz0iW1tfc2VyaWVzTmFtZXNdXSIKICAgICAgICAgICAgICAgIGFzPSJkYXRhU2VyaWVzTmFtZSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSIKICAgICAgICAgICAgICAgICAgPltbZGF0YVNlcmllc05hbWVdXTwvcGFwZXItaXRlbQogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDxhCiAgICAgICAgICAgIGRvd25sb2FkPSJbW19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWRdXS5jc3YiCiAgICAgICAgICAgIGhyZWY9IltbX2NzdlVybChfbmFtZVRvRGF0YVNlcmllcywgX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZCldXSIKICAgICAgICAgICAgPkNTVjwvYQogICAgICAgICAgPgogICAgICAgICAgPGEKICAgICAgICAgICAgZG93bmxvYWQ9IltbX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZF1dLmpzb24iCiAgICAgICAgICAgIGhyZWY9IltbX2pzb25VcmwoX25hbWVUb0RhdGFTZXJpZXMsIF9kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWQpXV0iCiAgICAgICAgICAgID5KU09OPC9hCiAgICAgICAgICA+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KCiAgICA8IS0tIGhlcmUgLS0+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX21pc3NpbmdUYWdzLmxlbmd0aF1dIj4KICAgICAgPGRpdiBjbGFzcz0iY29sbGFwc2libGUtbGlzdC10aXRsZSI+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgICBpY29uPSJbW19nZXRUb2dnbGVDb2xsYXBzaWJsZUljb24oX21pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuZWQpXV0iCiAgICAgICAgICBvbi1jbGljaz0iX3RvZ2dsZU1pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuIgogICAgICAgICAgY2xhc3M9InRvZ2dsZS1jb2xsYXBzaWJsZS1idXR0b24iCiAgICAgICAgPgogICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNvbGxhcHNpYmxlLXRpdGxlLXRleHQiPgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJpY29uczplcnJvciI+PC9pcm9uLWljb24+IE1pc3NpbmcgVGFncwogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZF1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJlcnJvci1jb250ZW50Ij4KICAgICAgICAgIDxpcm9uLWljb24gY2xhc3M9ImVycm9yLWljb24iIGljb249Imljb25zOmVycm9yIj48L2lyb24taWNvbj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX21pc3NpbmdUYWdzXV0iIGFzPSJtaXNzaW5nRW50cnkiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtaXNzaW5nLXRhZ3MtZm9yLXJ1bi1jb250YWluZXIiPgogICAgICAgICAgICAgIFJ1biAiW1ttaXNzaW5nRW50cnkucnVuXV0iIGxhY2tzIGRhdGEgZm9yIHRhZ3MKICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUKICAgICAgICAgICAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgICAgICAgICAgIGl0ZW1zPSJbW21pc3NpbmdFbnRyeS50YWdzXV0iCiAgICAgICAgICAgICAgICAgIGFzPSJ0YWciCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIDxsaT5bW3RhZ11dPC9saT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tY29sbGFwc2U+CiAgICA8L3RlbXBsYXRlPgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdGFnRmlsdGVySW52YWxpZF1dIj4KICAgICAgPGRpdiBjbGFzcz0iZXJyb3ItY29udGVudCI+CiAgICAgICAgPGlyb24taWNvbiBjbGFzcz0iZXJyb3ItaWNvbiIgaWNvbj0iaWNvbnM6ZXJyb3IiPjwvaXJvbi1pY29uPgogICAgICAgIFRoaXMgcmVndWxhciBleHByZXNpb24gaXMgaW52YWxpZDo8YnIgLz4KICAgICAgICA8c3BhbiBjbGFzcz0iaW52YWxpZC1yZWdleCI+W1tfdGFnRmlsdGVyXV08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3N0ZXBzTWlzbWF0Y2hdXSI+CiAgICAgIDxkaXYgY2xhc3M9ImVycm9yLWNvbnRlbnQiPgogICAgICAgIDxpcm9uLWljb24gY2xhc3M9ImVycm9yLWljb24iIGljb249Imljb25zOmVycm9yIj48L2lyb24taWNvbj4KICAgICAgICBUaGUgc3RlcHMgZm9yIHZhbHVlLCBsb3dlciwgYW5kIHVwcGVyIHRhZ3MgZG8gbm90IG1hdGNoOgogICAgICAgIDx1bD4KICAgICAgICAgIDxsaT4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRhZy1uYW1lIj5bW19zdGVwc01pc21hdGNoLnNlcmllc09iamVjdC52YWx1ZV1dPC9zcGFuPjoKICAgICAgICAgICAgW1tfc2VwYXJhdGVXaXRoQ29tbWFzKF9zdGVwc01pc21hdGNoLnZhbHVlU3RlcHMpXV0KICAgICAgICAgIDwvbGk+CiAgICAgICAgICA8bGk+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0YWctbmFtZSI+W1tfc3RlcHNNaXNtYXRjaC5zZXJpZXNPYmplY3QubG93ZXJdXTwvc3Bhbj46CiAgICAgICAgICAgIFtbX3NlcGFyYXRlV2l0aENvbW1hcyhfc3RlcHNNaXNtYXRjaC5sb3dlclN0ZXBzKV1dCiAgICAgICAgICA8L2xpPgogICAgICAgICAgPGxpPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0idGFnLW5hbWUiPltbX3N0ZXBzTWlzbWF0Y2guc2VyaWVzT2JqZWN0LnVwcGVyXV08L3NwYW4+OgogICAgICAgICAgICBbW19zZXBhcmF0ZVdpdGhDb21tYXMoX3N0ZXBzTWlzbWF0Y2gudXBwZXJTdGVwcyldXQogICAgICAgICAgPC9saT4KICAgICAgICA8L3VsPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPGRpdiBpZD0ibWF0Y2hlcy1jb250YWluZXIiPgogICAgICA8ZGl2IGNsYXNzPSJjb2xsYXBzaWJsZS1saXN0LXRpdGxlIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nlcmllc05hbWVzLmxlbmd0aF1dIj4KICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgICAgICBpY29uPSJbW19nZXRUb2dnbGVDb2xsYXBzaWJsZUljb24oX21hdGNoZXNMaXN0T3BlbmVkKV1dIgogICAgICAgICAgICBvbi1jbGljaz0iX3RvZ2dsZU1hdGNoZXNPcGVuIgogICAgICAgICAgICBjbGFzcz0idG9nZ2xlLW1hdGNoZXMtYnV0dG9uIgogICAgICAgICAgPgogICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8c3BhbiBjbGFzcz0iY29sbGFwc2libGUtdGl0bGUtdGV4dCI+CiAgICAgICAgICBNYXRjaGVzIChbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSkKICAgICAgICA8L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nlcmllc05hbWVzLmxlbmd0aF1dIj4KICAgICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9IltbX21hdGNoZXNMaXN0T3BlbmVkXV0iPgogICAgICAgICAgPGRpdiBpZD0ibWF0Y2hlcy1saXN0Ij4KICAgICAgICAgICAgPHRlbXBsYXRlCiAgICAgICAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgICAgICAgaXRlbXM9IltbX3Nlcmllc05hbWVzXV0iCiAgICAgICAgICAgICAgYXM9InNlcmllc05hbWUiCiAgICAgICAgICAgICAgaWQ9Im1hdGNoLWxpc3QtcmVwZWF0IgogICAgICAgICAgICAgIG9uLWRvbS1jaGFuZ2U9Il9tYXRjaExpc3RFbnRyeUNvbG9yVXBkYXRlZCIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1hdGNoLWxpc3QtZW50cnkiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1hdGNoLWVudHJ5LXN5bWJvbCI+CiAgICAgICAgICAgICAgICAgIFtbX2RldGVybWluZVN5bWJvbChfbmFtZVRvRGF0YVNlcmllcywgc2VyaWVzTmFtZSldXQogICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgW1tzZXJpZXNOYW1lXV0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1jdXN0b20tc2NhbGFyLWNhcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5lcnJvci1jb250ZW50IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZjAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBtYXJnaW46IDEwcHggMCAwIDA7CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgfQoKICAgICAgLmVycm9yLWljb24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgICAgbWFyZ2luOiAwIGF1dG8gNXB4IGF1dG87CiAgICAgIH0KCiAgICAgIC5pbnZhbGlkLXJlZ2V4IHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQoKICAgICAgLmVycm9yLWNvbnRlbnQgdWwgewogICAgICAgIG1hcmdpbjogMXB4IDAgMCAwOwogICAgICAgIHBhZGRpbmc6IDAgMCAwIDE5cHg7CiAgICAgIH0KCiAgICAgIC50YWctbmFtZSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5jb2xsYXBzaWJsZS1saXN0LXRpdGxlIHsKICAgICAgICBtYXJnaW46IDEwcHggMCA1cHggMDsKICAgICAgfQoKICAgICAgLmNvbGxhcHNpYmxlLXRpdGxlLXRleHQgewogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgICNtYXRjaGVzLWxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIC5tYXRjaC1saXN0LWVudHJ5IHsKICAgICAgICBtYXJnaW46IDAgMCA1cHggMDsKICAgICAgfQoKICAgICAgLm1hdGNoLWVudHJ5LXN5bWJvbCB7CiAgICAgICAgZm9udC1mYW1pbHk6IGFyaWFsLCBzYW5zLXNlcmlmOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgfQoKICAgICAgLm1pc3NpbmctdGFncy1mb3ItcnVuLWNvbnRhaW5lciB7CiAgICAgICAgbWFyZ2luOiA4cHggMCAwIDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sd0N0LnByb3RvdHlwZSwicnVucyIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx3Q3QucHJvdG90eXBlLCJ4VHlwZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLHdDdC5wcm90b3R5cGUsImFjdGl2ZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx3Q3QucHJvdG90eXBlLCJ0aXRsZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sd0N0LnByb3RvdHlwZSwibWFyZ2luQ2hhcnRTZXJpZXMiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSx3Q3QucHJvdG90eXBlLCJpZ25vcmVZT3V0bGllcnMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsZHIpXSx3Q3QucHJvdG90eXBlLCJyZXF1ZXN0TWFuYWdlciIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLHdDdC5wcm90b3R5cGUsInNob3dEb3dubG9hZExpbmtzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHdDdC5wcm90b3R5cGUsInRhZ01ldGFkYXRhIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHdDdC5wcm90b3R5cGUsInRvb2x0aXBTb3J0aW5nTWV0aG9kIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHdDdC5wcm90b3R5cGUsIl9jb2xvclNjYWxlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sd0N0LnByb3RvdHlwZSwiX3RhZ0ZpbHRlckludmFsaWQiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sd0N0LnByb3RvdHlwZSwiX25hbWVUb0RhdGFTZXJpZXMiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sd0N0LnByb3RvdHlwZSwiX2V4cGFuZGVkIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sd0N0LnByb3RvdHlwZSwiX2xvZ1NjYWxlQWN0aXZlIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKV0sd0N0LnByb3RvdHlwZSwiX3JlcXVlc3REYXRhIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHdDdC5wcm90b3R5cGUsIl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLHdDdC5wcm90b3R5cGUsIl9tYXRjaGVzTGlzdE9wZW5lZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSx3Q3QucHJvdG90eXBlLCJfZmlsbEFyZWEiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLHdDdC5wcm90b3R5cGUsIl90b29sdGlwQ29sdW1ucyIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sd0N0LnByb3RvdHlwZSwiX21pc3NpbmdUYWdzIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sd0N0LnByb3RvdHlwZSwiX21pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuZWQiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sd0N0LnByb3RvdHlwZSwiX3N0ZXBzTWlzbWF0Y2giLHZvaWQgMCksdChbYSgiX25hbWVUb0RhdGFTZXJpZXMiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLHdDdC5wcm90b3R5cGUsIl91cGRhdGVDaGFydCIsbnVsbCksdChbcygiX25hbWVUb0RhdGFTZXJpZXMiLCJydW5zIiksZSgiZGVzaWduOnR5cGUiLE9iamVjdCksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sd0N0LnByb3RvdHlwZSwiX3Nlcmllc05hbWVzIixudWxsKSx0KFthKCJfdGFnRmlsdGVyIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSx3Q3QucHJvdG90eXBlLCJfcmVmcmVzaERhdGFTZXJpZXMiLG51bGwpLHQoW3MoIm1hcmdpbkNoYXJ0U2VyaWVzIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sd0N0LnByb3RvdHlwZSwiX3RhZ0ZpbHRlciIsbnVsbCksdChbcygidGl0bGUiKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSx3Q3QucHJvdG90eXBlLCJfdGl0bGVEaXNwbGF5U3RyaW5nIixudWxsKSx3Q3Q9dChbaSgidGYtY3VzdG9tLXNjYWxhci1tYXJnaW4tY2hhcnQtY2FyZCIpXSx3Q3QpO3ZhciBTQ3Q9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsVFlQRVM6W10sZ2V0UnVuc05hbWVkOmZ1bmN0aW9uIE1DdCh0KXtyZXR1cm4gU2UuZXhwb3J0cy5rZXlzKHQpLnNvcnQobnIpfSxnZXRUYWdzOmFyLGZpbHRlclRhZ3M6ZnVuY3Rpb24gRUN0KHQsZSl7bGV0IG49W107cmV0dXJuIGUuZm9yRWFjaCgoZT0+bj1uLmNvbmNhdCh0W2VdKSkpLFNlLmV4cG9ydHMudW5pcShuKS5zb3J0KG5yKX0sTGlzdGVuS2V5OmZsLEJhc2VTdG9yZTptbCxDYW5jZWxsZXI6WFIsRW52aXJvbm1lbnRTdG9yZTpnbCxlbnZpcm9ubWVudFN0b3JlOl9sLEV4cGVyaW1lbnRzU3RvcmU6RlIsZXhwZXJpbWVudHNTdG9yZTpWUixSZXF1ZXN0Q2FuY2VsbGF0aW9uRXJyb3I6c3IsSW52YWxpZFJlcXVlc3RPcHRpb25zRXJyb3I6bHIsUmVxdWVzdE5ldHdvcmtFcnJvcjpjcixnZXQgSHR0cE1ldGhvZFR5cGUoKXtyZXR1cm4gdXJ9LFJlcXVlc3RPcHRpb25zOmhyLFJlcXVlc3RNYW5hZ2VyOmRyLGNyZWF0ZVJvdXRlcjpncixnZXRSb3V0ZXI6X3Isc2V0Um91dGVyOmZ1bmN0aW9uIFRDdCh0KXtpZihudWxsPT10KXRocm93IG5ldyBFcnJvcigiUm91dGVyIHJlcXVpcmVkLCBidXQgZ290OiAiK3QpO21yPXR9LGNyZWF0ZVNlYXJjaFBhcmFtOnZyLFJ1bnNTdG9yZTp5bCxydW5zU3RvcmU6dmwsYWRkUGFyYW1zOmlPfSk7bGV0IENDdD1jbGFzcyBleHRlbmRzKGVyKHllKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuYWN0aXZlPSEwLHRoaXMuX2NvbG9yU2NhbGU9bmV3IHhDdCh7c2NhbGU6R1J9KSx0aGlzLl9uYW1lVG9EYXRhU2VyaWVzPXt9LHRoaXMuX2V4cGFuZGVkPSExLHRoaXMuX3JlcXVlc3REYXRhPSh0LGUsbik9Pntjb25zdCBpPV9yKCkucGx1Z2luUm91dGUoImN1c3RvbV9zY2FsYXJzIiwiL3NjYWxhcnMiKTtQcm9taXNlLmFsbCh0Lm1hcCgodD0+e2NvbnN0IG49aU8oaSx7dGFnOnRoaXMuX3RhZ0ZpbHRlcixydW46dH0pO3JldHVybiB0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QobikudGhlbigobj0+e2Uoe2l0ZW06dCxkYXRhOm59KX0pKX0pKSkuZmluYWxseSgoKCk9PntuKCl9KSl9LHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4PXt9LHRoaXMuX21hdGNoZXNMaXN0T3BlbmVkPSExfXJlbG9hZCgpe3RoaXMuJC5sb2FkZXIucmVsb2FkKCl9cmVkcmF3KCl7dGhpcy4kLmxvYWRlci5yZWRyYXcoKX1fdG9nZ2xlRXhwYW5kZWQodCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKSx0aGlzLnJlZHJhdygpfV90b2dnbGVMb2dTY2FsZSgpe3RoaXMuc2V0KCJfbG9nU2NhbGVBY3RpdmUiLCF0aGlzLl9sb2dTY2FsZUFjdGl2ZSl9X3Jlc2V0RG9tYWluKCl7Y29uc3QgdD10aGlzLiQubG9hZGVyO3QmJnQucmVzZXREb21haW4oKX1fY3N2VXJsKHQsZSl7cmV0dXJuIGU/aU8odGhpcy5fZG93bmxvYWREYXRhVXJsKHQsZSkse2Zvcm1hdDoiY3N2In0pOiIifV9qc29uVXJsKHQsZSl7cmV0dXJuIGU/aU8odGhpcy5fZG93bmxvYWREYXRhVXJsKHQsZSkse2Zvcm1hdDoianNvbiJ9KToiIn1fZG93bmxvYWREYXRhVXJsKHQsZSl7Y29uc3Qgbj10W2VdLGk9e3RhZzpuLmdldFRhZygpLHJ1bjpuLmdldFJ1bigpfTtyZXR1cm4gaU8oX3IoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvZG93bmxvYWRfZGF0YSIpLGkpfV9jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKCl7cmV0dXJuKHQsZSxuKT0+e2lmKG4ucmVnZXhfdmFsaWQpe2NvbnN0IHQ9U2UuZXhwb3J0cy5jbG9uZSh0aGlzLl9uYW1lVG9EYXRhU2VyaWVzKTtTZS5leHBvcnRzLmZvck93bihuLnRhZ190b19ldmVudHMsKChuLGkpPT57Y29uc3Qgcj1uLm1hcCgodD0+KHt3YWxsX3RpbWU6bmV3IERhdGUoMWUzKnRbMF0pLHN0ZXA6dFsxXSxzY2FsYXI6dFsyXX0pKSksbz1iQ3QoZSxpKSxhPXRbb107aWYoYSlhLnNldERhdGEocik7ZWxzZXtTZS5leHBvcnRzLmlzVW5kZWZpbmVkKHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2VdKSYmKHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2VdPTApO2NvbnN0IG49bmV3IHZDdChlLGksbyxyLGJUdFt0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtlXV0pO3Rbb109bix0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtlXT0odGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbZV0rMSklYlR0Lmxlbmd0aH19KSksdGhpcy5zZXQoIl9uYW1lVG9EYXRhU2VyaWVzIix0KX19fV91cGRhdGVDaGFydCgpe09iamVjdC5lbnRyaWVzKHRoaXMuX25hbWVUb0RhdGFTZXJpZXMpLmZvckVhY2goKChbdCxlXSk9Pnt0aGlzLiQubG9hZGVyLnNldFNlcmllc0RhdGEodCxlLmdldERhdGEoKSl9KSksdGhpcy4kLmxvYWRlci5jb21taXRDaGFuZ2VzKCl9X2NvbXB1dGVTZWxlY3RlZFJ1bnNTZXQodCl7Y29uc3QgZT17fTtyZXR1cm4gU2UuZXhwb3J0cy5mb3JFYWNoKHQsKHQ9PntlW3RdPTF9KSksZX1nZXQgX3Nlcmllc05hbWVzKCl7Y29uc3QgdD1uZXcgU2V0KHRoaXMucnVucyk7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuX25hbWVUb0RhdGFTZXJpZXMpLmZpbHRlcigoKFtlLG5dKT0+dC5oYXMobi5ydW4pKSkubWFwKCgoW3RdKT0+dCkpfV9kZXRlcm1pbmVDb2xvcih0LGUpe3JldHVybiB0LnNjYWxlKGUpfV9yZWZyZXNoRGF0YVNlcmllcygpe3RoaXMuc2V0KCJfbmFtZVRvRGF0YVNlcmllcyIse30pfV9jcmVhdGVTeW1ib2xGdW5jdGlvbigpe3JldHVybiB0PT50aGlzLl9uYW1lVG9EYXRhU2VyaWVzW3RdLmdldFN5bWJvbCgpLm1ldGhvZCgpfV9kZXRlcm1pbmVTeW1ib2wodCxlKXtyZXR1cm4gdFtlXS5nZXRTeW1ib2woKS5jaGFyYWN0ZXJ9Z2V0IF90YWdGaWx0ZXIoKXt2YXIgdD10aGlzLnRhZ1JlZ2V4ZXM7cmV0dXJuIDE9PT10Lmxlbmd0aD90WzBdOnQubWFwKCh0PT4iKCIrdCsiKSIpKS5qb2luKCJ8Iil9X2dldFRvZ2dsZU1hdGNoZXNJY29uKHQpe3JldHVybiB0PyJleHBhbmQtbGVzcyI6ImV4cGFuZC1tb3JlIn1fdG9nZ2xlTWF0Y2hlc09wZW4oKXt0aGlzLnNldCgiX21hdGNoZXNMaXN0T3BlbmVkIiwhdGhpcy5fbWF0Y2hlc0xpc3RPcGVuZWQpfWdldCBfdGl0bGVEaXNwbGF5U3RyaW5nKCl7cmV0dXJuIHRoaXMudGl0bGV8fCJ1bnRpdGxlZCJ9X21hdGNoTGlzdEVudHJ5Q29sb3JVcGRhdGVkKHQpe2NvbnN0IGU9dGhpcy4kJCgiI21hdGNoLWxpc3QtcmVwZWF0Iik7ZSYmdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5tYXRjaC1saXN0LWVudHJ5IikuZm9yRWFjaCgodD0+e2NvbnN0IG49ZS5pdGVtRm9yRWxlbWVudCh0KTt0LnN0eWxlLmNvbG9yPXRoaXMuX2RldGVybWluZUNvbG9yKHRoaXMuX2NvbG9yU2NhbGUsbil9KSl9fTtDQ3QudGVtcGxhdGU9X2VgCiAgICA8dGYtY2FyZC1oZWFkaW5nIGRpc3BsYXktbmFtZT0iW1tfdGl0bGVEaXNwbGF5U3RyaW5nXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgPGRpdiBpZD0idGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIiPgogICAgICA8dGYtbGluZS1jaGFydC1kYXRhLWxvYWRlcgogICAgICAgIGlkPSJsb2FkZXIiCiAgICAgICAgYWN0aXZlPSJbW2FjdGl2ZV1dIgogICAgICAgIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlXV0iCiAgICAgICAgZGF0YS1zZXJpZXM9IltbX3Nlcmllc05hbWVzXV0iCiAgICAgICAgaWdub3JlLXktb3V0bGllcnM9IltbaWdub3JlWU91dGxpZXJzXV0iCiAgICAgICAgbG9hZC1rZXk9IltbX3RhZ0ZpbHRlcl1dIgogICAgICAgIGRhdGEtdG8tbG9hZD0iW1tydW5zXV0iCiAgICAgICAgcmVxdWVzdC1kYXRhPSJbW19yZXF1ZXN0RGF0YV1dIgogICAgICAgIGxvZy1zY2FsZS1hY3RpdmU9IltbX2xvZ1NjYWxlQWN0aXZlXV0iCiAgICAgICAgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKCldXSIKICAgICAgICByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgICBzbW9vdGhpbmctZW5hYmxlZD0iW1tzbW9vdGhpbmdFbmFibGVkXV0iCiAgICAgICAgc21vb3RoaW5nLXdlaWdodD0iW1tzbW9vdGhpbmdXZWlnaHRdXSIKICAgICAgICBzeW1ib2wtZnVuY3Rpb249IltbX2NyZWF0ZVN5bWJvbEZ1bmN0aW9uKCldXSIKICAgICAgICB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iCiAgICAgICAgeC10eXBlPSJbW3hUeXBlXV0iCiAgICAgID4KICAgICAgPC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJidXR0b25zIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIgogICAgICAgIGljb249ImZ1bGxzY3JlZW4iCiAgICAgICAgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiCiAgICAgID48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICBzZWxlY3RlZCQ9IltbX2xvZ1NjYWxlQWN0aXZlXV0iCiAgICAgICAgaWNvbj0ibGluZS13ZWlnaHQiCiAgICAgICAgb24tdGFwPSJfdG9nZ2xlTG9nU2NhbGUiCiAgICAgICAgdGl0bGU9IlRvZ2dsZSB5LWF4aXMgbG9nIHNjYWxlIgogICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgaWNvbj0ic2V0dGluZ3Mtb3ZlcnNjYW4iCiAgICAgICAgb24tdGFwPSJfcmVzZXREb21haW4iCiAgICAgICAgdGl0bGU9IkZpdCBkb21haW4gdG8gZGF0YSIKICAgICAgPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxzcGFuIHN0eWxlPSJmbGV4LWdyb3c6IDEiPjwvc3Bhbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dEb3dubG9hZExpbmtzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImRvd25sb2FkLWxpbmtzIj4KICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51CiAgICAgICAgICAgIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIgogICAgICAgICAgICBsYWJlbD0ic2VyaWVzIHRvIGRvd25sb2FkIgogICAgICAgICAgICBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWR9fSIKICAgICAgICAgID4KICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgICAgICAgICBpdGVtcz0iW1tfc2VyaWVzTmFtZXNdXSIKICAgICAgICAgICAgICAgIGFzPSJkYXRhU2VyaWVzTmFtZSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSIKICAgICAgICAgICAgICAgICAgPltbZGF0YVNlcmllc05hbWVdXTwvcGFwZXItaXRlbQogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDxhCiAgICAgICAgICAgIGRvd25sb2FkPSJbW19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWRdXS5jc3YiCiAgICAgICAgICAgIGhyZWY9IltbX2NzdlVybChfbmFtZVRvRGF0YVNlcmllcywgX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZCldXSIKICAgICAgICAgICAgPkNTVjwvYQogICAgICAgICAgPgogICAgICAgICAgPGEKICAgICAgICAgICAgZG93bmxvYWQ9IltbX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZF1dLmpzb24iCiAgICAgICAgICAgIGhyZWY9IltbX2pzb25VcmwoX25hbWVUb0RhdGFTZXJpZXMsIF9kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWQpXV0iCiAgICAgICAgICAgID5KU09OPC9hCiAgICAgICAgICA+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9Im1hdGNoZXMtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0ibWF0Y2hlcy1saXN0LXRpdGxlIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nlcmllc05hbWVzLmxlbmd0aF1dIj4KICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgICAgICBpY29uPSJbW19nZXRUb2dnbGVNYXRjaGVzSWNvbihfbWF0Y2hlc0xpc3RPcGVuZWQpXV0iCiAgICAgICAgICAgIG9uLWNsaWNrPSJfdG9nZ2xlTWF0Y2hlc09wZW4iCiAgICAgICAgICAgIGNsYXNzPSJ0b2dnbGUtbWF0Y2hlcy1idXR0b24iCiAgICAgICAgICA+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgIDxzcGFuIGNsYXNzPSJtYXRjaGVzLXRleHQiPiBNYXRjaGVzIChbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSkgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSI+CiAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW19tYXRjaGVzTGlzdE9wZW5lZF1dIj4KICAgICAgICAgIDxkaXYgaWQ9Im1hdGNoZXMtbGlzdCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgICAgIGlzPSJkb20tcmVwZWF0IgogICAgICAgICAgICAgIGl0ZW1zPSJbW19zZXJpZXNOYW1lc11dIgogICAgICAgICAgICAgIGFzPSJzZXJpZXNOYW1lIgogICAgICAgICAgICAgIGlkPSJtYXRjaC1saXN0LXJlcGVhdCIKICAgICAgICAgICAgICBvbi1kb20tY2hhbmdlPSJfbWF0Y2hMaXN0RW50cnlDb2xvclVwZGF0ZWQiCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYXRjaC1saXN0LWVudHJ5Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtYXRjaC1lbnRyeS1zeW1ib2wiPgogICAgICAgICAgICAgICAgICBbW19kZXRlcm1pbmVTeW1ib2woX25hbWVUb0RhdGFTZXJpZXMsIHNlcmllc05hbWUpXV0KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgIFtbc2VyaWVzTmFtZV1dCiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY3VzdG9tLXNjYWxhci1jYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAjbWF0Y2hlcy1saXN0LXRpdGxlIHsKICAgICAgICBtYXJnaW46IDEwcHggMCA1cHggMDsKICAgICAgfQoKICAgICAgI21hdGNoZXMtbGlzdCB7CiAgICAgICAgbWF4LWhlaWdodDogMjAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgLm1hdGNoLWxpc3QtZW50cnkgewogICAgICAgIG1hcmdpbjogMCAwIDVweCAwOwogICAgICB9CgogICAgICAubWF0Y2gtZW50cnktc3ltYm9sIHsKICAgICAgICBmb250LWZhbWlseTogYXJpYWwsIHNhbnMtc2VyaWY7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICB9CgogICAgICAubWF0Y2hlcy10ZXh0IHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLENDdC5wcm90b3R5cGUsInJ1bnMiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sQ0N0LnByb3RvdHlwZSwieFR5cGUiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxDQ3QucHJvdG90eXBlLCJhY3RpdmUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sQ0N0LnByb3RvdHlwZSwidGl0bGUiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLENDdC5wcm90b3R5cGUsInRhZ1JlZ2V4ZXMiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxDQ3QucHJvdG90eXBlLCJpZ25vcmVZT3V0bGllcnMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsZHIpXSxDQ3QucHJvdG90eXBlLCJyZXF1ZXN0TWFuYWdlciIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLENDdC5wcm90b3R5cGUsInNob3dEb3dubG9hZExpbmtzIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sQ0N0LnByb3RvdHlwZSwic21vb3RoaW5nRW5hYmxlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxDQ3QucHJvdG90eXBlLCJzbW9vdGhpbmdXZWlnaHQiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sQ0N0LnByb3RvdHlwZSwidGFnTWV0YWRhdGEiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sQ0N0LnByb3RvdHlwZSwidG9vbHRpcFNvcnRpbmdNZXRob2QiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIseEN0KV0sQ0N0LnByb3RvdHlwZSwiX2NvbG9yU2NhbGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sQ0N0LnByb3RvdHlwZSwiX25hbWVUb0RhdGFTZXJpZXMiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sQ0N0LnByb3RvdHlwZSwiX2V4cGFuZGVkIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sQ0N0LnByb3RvdHlwZSwiX2xvZ1NjYWxlQWN0aXZlIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKV0sQ0N0LnByb3RvdHlwZSwiX3JlcXVlc3REYXRhIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLENDdC5wcm90b3R5cGUsIl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLENDdC5wcm90b3R5cGUsIl9tYXRjaGVzTGlzdE9wZW5lZCIsdm9pZCAwKSx0KFthKCJfbmFtZVRvRGF0YVNlcmllcyIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sQ0N0LnByb3RvdHlwZSwiX3VwZGF0ZUNoYXJ0IixudWxsKSx0KFtzKCJfbmFtZVRvRGF0YVNlcmllcyIsInJ1bnMiKSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxDQ3QucHJvdG90eXBlLCJfc2VyaWVzTmFtZXMiLG51bGwpLHQoW2EoIl90YWdGaWx0ZXIiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLENDdC5wcm90b3R5cGUsIl9yZWZyZXNoRGF0YVNlcmllcyIsbnVsbCksdChbcygidGFnUmVnZXhlcyIpLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLENDdC5wcm90b3R5cGUsIl90YWdGaWx0ZXIiLG51bGwpLHQoW3MoInRpdGxlIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sQ0N0LnByb3RvdHlwZSwiX3RpdGxlRGlzcGxheVN0cmluZyIsbnVsbCksQ0N0PXQoW2koInRmLWN1c3RvbS1zY2FsYXItbXVsdGktbGluZS1jaGFydC1jYXJkIildLENDdCk7bGV0IEFDdD1jbGFzcyBleHRlbmRzIHlle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9yZXF1ZXN0TWFuYWdlcj1uZXcgZHIoNTApLHRoaXMuX2NhbmNlbGxlcj1uZXcgWFIsdGhpcy5fc2hvd0Rvd25sb2FkTGlua3M9SHMoIl9zaG93RG93bmxvYWRMaW5rcyIse2RlZmF1bHRWYWx1ZTohMSx1c2VMb2NhbFN0b3JhZ2U6ITB9KS5jYWxsKHRoaXMpLHRoaXMuX3Ntb290aGluZ1dlaWdodD1HcygiX3Ntb290aGluZ1dlaWdodCIse2RlZmF1bHRWYWx1ZTouNn0pLmNhbGwodGhpcyksdGhpcy5faWdub3JlWU91dGxpZXJzPUhzKCJfaWdub3JlWU91dGxpZXJzIix7ZGVmYXVsdFZhbHVlOiEwLHVzZUxvY2FsU3RvcmFnZTohMH0pLmNhbGwodGhpcyksdGhpcy5feFR5cGU9InN0ZXAiLHRoaXMuX2FjdGl2ZT0hMCx0aGlzLnJlbG9hZE9uUmVhZHk9ITAsdGhpcy5fc2hvd0Rvd25sb2FkTGlua3NPYnNlcnZlcj1GcygiX3Nob3dEb3dubG9hZExpbmtzIix7ZGVmYXVsdFZhbHVlOiExLHVzZUxvY2FsU3RvcmFnZTohMH0pLHRoaXMuX3Ntb290aGluZ1dlaWdodE9ic2VydmVyPVdzKCJfc21vb3RoaW5nV2VpZ2h0Iix7ZGVmYXVsdFZhbHVlOi42fSksdGhpcy5faWdub3JlWU91dGxpZXJzT2JzZXJ2ZXI9RnMoIl9pZ25vcmVZT3V0bGllcnMiLHtkZWZhdWx0VmFsdWU6ITAsdXNlTG9jYWxTdG9yYWdlOiEwfSl9cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMucmVsb2FkT25SZWFkeSYmdGhpcy5yZWxvYWQoKX1yZWxvYWQoKXtjb25zdCB0PV9yKCkucGx1Z2luc0xpc3RpbmcoKSxlPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZSgodD0+e3QuY2FuY2VsbGVkfHwodGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLCF0LnZhbHVlLmN1c3RvbV9zY2FsYXJzKSx0aGlzLl9kYXRhTm90Rm91bmR8fHRoaXMuX3JldHJpZXZlTGF5b3V0QW5kRGF0YSgpKX0pKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHQpLnRoZW4oZSl9X3JlbG9hZENoYXJ0cygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkLCB0Zi1jdXN0b20tc2NhbGFyLW11bHRpLWxpbmUtY2hhcnQtY2FyZCIpLmZvckVhY2goKHQ9Pnt0LnJlbG9hZCgpfSkpfV9yZXRyaWV2ZUxheW91dEFuZERhdGEoKXtjb25zdCB0PV9yKCkucGx1Z2luUm91dGUoImN1c3RvbV9zY2FsYXJzIiwiL2xheW91dCIpLGU9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKCh0PT57dC5jYW5jZWxsZWR8fCh0aGlzLnNldCgiX2xheW91dCIsdC52YWx1ZSksdGhpcy5fZGF0YU5vdEZvdW5kfHx0aGlzLl9yZWxvYWRDaGFydHMoKSl9KSk7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0KS50aGVuKGUpfWdldCBfc21vb3RoaW5nRW5hYmxlZCgpe3JldHVybiB0aGlzLl9zbW9vdGhpbmdXZWlnaHQ+MH1nZXQgX2NhdGVnb3JpZXMoKXt2YXIgdD10aGlzLl9sYXlvdXQ7aWYoIXQuY2F0ZWdvcnkpcmV0dXJuW107bGV0IGU9ITE7cmV0dXJuIHRoaXMuX29wZW5lZENhdGVnb3JpZXN8fChlPSEwLHRoaXMuX29wZW5lZENhdGVnb3JpZXM9e30pLHQuY2F0ZWdvcnkubWFwKCh0PT4oZSYmIXQuY2xvc2VkJiYodGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1t0LnRpdGxlXT0hMCkse25hbWU6dC50aXRsZSxpdGVtczp0LmNoYXJ0LG1ldGFkYXRhOnt0eXBlOmJyLlBSRUZJWF9HUk9VUCxvcGVuZWQ6ISF0aGlzLl9vcGVuZWRDYXRlZ29yaWVzW3QudGl0bGVdfX0pKSl9X2NhdGVnb3J5T3BlbmVkVG9nZ2xlZCh0KXtjb25zdCBlPXQudGFyZ2V0O2Uub3BlbmVkP3RoaXMuX29wZW5lZENhdGVnb3JpZXNbZS5jYXRlZ29yeS5uYW1lXT0hMDpkZWxldGUgdGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1tlLmNhdGVnb3J5Lm5hbWVdfX07QUN0LnRlbXBsYXRlPV9lYAogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxpbmUtaXRlbSI+CiAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7X3Nob3dEb3dubG9hZExpbmtzfX0iCiAgICAgICAgICAgICAgICA+U2hvdyBkYXRhIGRvd25sb2FkIGxpbmtzPC9wYXBlci1jaGVja2JveAogICAgICAgICAgICAgID4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxpbmUtaXRlbSI+CiAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7X2lnbm9yZVlPdXRsaWVyc319IgogICAgICAgICAgICAgICAgPklnbm9yZSBvdXRsaWVycyBpbiBjaGFydCBzY2FsaW5nPC9wYXBlci1jaGVja2JveAogICAgICAgICAgICAgID4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZyI+CiAgICAgICAgICAgICAgPGRpdiBpZD0idG9vbHRpcC1zb3J0aW5nLWxhYmVsIj5Ub29sdGlwIHNvcnRpbmcgbWV0aG9kOjwvZGl2PgogICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51CiAgICAgICAgICAgICAgICBuby1sYWJlbC1mbG9hdD0iIgogICAgICAgICAgICAgICAgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfdG9vbHRpcFNvcnRpbmdNZXRob2R9fSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveAogICAgICAgICAgICAgICAgICBjbGFzcz0iZHJvcGRvd24tY29udGVudCIKICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ9IjAiCiAgICAgICAgICAgICAgICAgIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlZmF1bHQ8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlc2NlbmRpbmc8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmFzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bmVhcmVzdDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8dGYtc21vb3RoaW5nLWlucHV0CiAgICAgICAgICAgICAgd2VpZ2h0PSJ7e19zbW9vdGhpbmdXZWlnaHR9fSIKICAgICAgICAgICAgICBzdGVwPSIwLjAwMSIKICAgICAgICAgICAgICBtaW49IjAiCiAgICAgICAgICAgICAgbWF4PSIxIgogICAgICAgICAgICA+PC90Zi1zbW9vdGhpbmctaW5wdXQ+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IKICAgICAgICAgICAgICBpZD0ieC10eXBlLXNlbGVjdG9yIgogICAgICAgICAgICAgIG5hbWU9Ikhvcml6b250YWwgQXhpcyIKICAgICAgICAgICAgICBzZWxlY3RlZC1pZD0ie3tfeFR5cGV9fSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InN0ZXAiPnN0ZXA8L3BhcGVyLWJ1dHRvbgogICAgICAgICAgICAgID48IS0tCiAgICAgICAgICAgIC0tPjxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgPjwhLS0KICAgICAgICAgICAgLS0+PHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiIGlkPSJjYXRlZ29yaWVzLWNvbnRhaW5lciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+VGhlIGN1c3RvbSBzY2FsYXJzIGRhc2hib2FyZCBpcyBpbmFjdGl2ZS48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6PC9wPgogICAgICAgICAgICA8b2w+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbid0IGxhaWQgb3V0IHRoZSBkYXNoYm9hcmQuPC9saT4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBzY2FsYXIgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvb2w+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBUbyBsYXkgb3V0IHRoZSBkYXNoYm9hcmQsIHBhc3MgYSA8Y29kZT5MYXlvdXQ8L2NvZGU+IHByb3RvYnVmZmVyCiAgICAgICAgICAgICAgdG8gdGhlIDxjb2RlPnNldF9sYXlvdXQ8L2NvZGU+IG1ldGhvZC4gRm9yIGV4YW1wbGUsCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgPHByZT4KZnJvbSB0ZW5zb3Jib2FyZCBpbXBvcnQgc3VtbWFyeQpmcm9tIHRlbnNvcmJvYXJkLnBsdWdpbnMuY3VzdG9tX3NjYWxhciBpbXBvcnQgbGF5b3V0X3BiMgouLi4KIyBUaGlzIGFjdGlvbiBkb2VzIG5vdCBoYXZlIHRvIGJlIHBlcmZvcm1lZCBhdCBldmVyeSBzdGVwLCBzbyB0aGUgYWN0aW9uIGlzIG5vdAojIHRha2VuIGNhcmUgb2YgYnkgYW4gb3AgaW4gdGhlIGdyYXBoLiBXZSBvbmx5IG5lZWQgdG8gc3BlY2lmeSB0aGUgbGF5b3V0IG9uY2UKIyAoaW5zdGVhZCBvZiBwZXIgc3RlcCkuCmxheW91dF9zdW1tYXJ5ID0gc3VtbWFyeV9saWIuY3VzdG9tX3NjYWxhcl9wYihsYXlvdXRfcGIyLkxheW91dCgKICBjYXRlZ29yeT1bCiAgICBsYXlvdXRfcGIyLkNhdGVnb3J5KAogICAgICB0aXRsZT0nbG9zc2VzJywKICAgICAgY2hhcnQ9WwogICAgICAgICAgbGF5b3V0X3BiMi5DaGFydCgKICAgICAgICAgICAgICB0aXRsZT0nbG9zc2VzJywKICAgICAgICAgICAgICBtdWx0aWxpbmU9bGF5b3V0X3BiMi5NdWx0aWxpbmVDaGFydENvbnRlbnQoCiAgICAgICAgICAgICAgICB0YWc9W3InbG9zcy4qJ10sCiAgICAgICAgICAgICAgKSksCiAgICAgICAgICBsYXlvdXRfcGIyLkNoYXJ0KAogICAgICAgICAgICAgIHRpdGxlPSdiYXonLAogICAgICAgICAgICAgIG1hcmdpbj1sYXlvdXRfcGIyLk1hcmdpbkNoYXJ0Q29udGVudCgKICAgICAgICAgICAgICAgIHNlcmllcz1bCiAgICAgICAgICAgICAgICAgIGxheW91dF9wYjIuTWFyZ2luQ2hhcnRDb250ZW50LlNlcmllcygKICAgICAgICAgICAgICAgICAgICB2YWx1ZT0nbG9zcy9iYXovc2NhbGFyX3N1bW1hcnknLAogICAgICAgICAgICAgICAgICAgIGxvd2VyPSdiYXpfbG93ZXIvYmF6L3NjYWxhcl9zdW1tYXJ5JywKICAgICAgICAgICAgICAgICAgICB1cHBlcj0nYmF6X3VwcGVyL2Jhei9zY2FsYXJfc3VtbWFyeScpLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICApKSwKICAgICAgXSksCiAgICBsYXlvdXRfcGIyLkNhdGVnb3J5KAogICAgICB0aXRsZT0ndHJpZyBmdW5jdGlvbnMnLAogICAgICBjaGFydD1bCiAgICAgICAgICBsYXlvdXRfcGIyLkNoYXJ0KAogICAgICAgICAgICAgIHRpdGxlPSd3YXZlIHRyaWcgZnVuY3Rpb25zJywKICAgICAgICAgICAgICBtdWx0aWxpbmU9bGF5b3V0X3BiMi5NdWx0aWxpbmVDaGFydENvbnRlbnQoCiAgICAgICAgICAgICAgICB0YWc9W3IndHJpZ0Z1bmN0aW9ucy9jb3NpbmUnLCByJ3RyaWdGdW5jdGlvbnMvc2luZSddLAogICAgICAgICAgICAgICkpLAogICAgICAgICAgIyBUaGUgcmFuZ2Ugb2YgdGFuZ2VudCBpcyBkaWZmZXJlbnQuIExldCdzIGdpdmUgaXQgaXRzIG93biBjaGFydC4KICAgICAgICAgIGxheW91dF9wYjIuQ2hhcnQoCiAgICAgICAgICAgICAgdGl0bGU9J3RhbicsCiAgICAgICAgICAgICAgbXVsdGlsaW5lPWxheW91dF9wYjIuTXVsdGlsaW5lQ2hhcnRDb250ZW50KAogICAgICAgICAgICAgICAgdGFnPVtyJ3RyaWdGdW5jdGlvbnMvdGFuZ2VudCddLAogICAgICAgICAgICAgICkpLAogICAgICBdLAogICAgICAjIFRoaXMgY2F0ZWdvcnkgd2UgY2FyZSBsZXNzIGFib3V0LiBMZXQncyBtYWtlIGl0IGluaXRpYWxseSBjbG9zZWQuCiAgICAgIGNsb3NlZD1UcnVlKSwKICBdKSkKd3JpdGVyLmFkZF9zdW1tYXJ5KGxheW91dF9zdW1tYXJ5KQo8L3ByZQogICAgICAgICAgICA+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIKICAgICAgICAgICAgICAgID5SRUFETUU8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiCiAgICAgICAgICAgICAgICA+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2EKICAgICAgICAgICAgICA+LgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3CiAgICAgICAgICAgICAgYXM9ImNoYXJ0IgogICAgICAgICAgICAgIGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iCiAgICAgICAgICAgICAgZGlzYWJsZS1wYWdpbmF0aW9uCiAgICAgICAgICAgICAgaW5pdGlhbC1vcGVuZWQ9IltbY2F0ZWdvcnkubWV0YWRhdGEub3BlbmVkXV0iCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbY2hhcnQubXVsdGlsaW5lXV0iPgogICAgICAgICAgICAgICAgICA8dGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQKICAgICAgICAgICAgICAgICAgICBhY3RpdmU9IltbYWN0aXZlXV0iCiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIgogICAgICAgICAgICAgICAgICAgIHJ1bnM9IltbX3NlbGVjdGVkUnVuc11dIgogICAgICAgICAgICAgICAgICAgIHRpdGxlPSJbW2NoYXJ0LnRpdGxlXV0iCiAgICAgICAgICAgICAgICAgICAgeC10eXBlPSJbW194VHlwZV1dIgogICAgICAgICAgICAgICAgICAgIHNtb290aGluZy1lbmFibGVkPSJbW19zbW9vdGhpbmdFbmFibGVkXV0iCiAgICAgICAgICAgICAgICAgICAgc21vb3RoaW5nLXdlaWdodD0iW1tfc21vb3RoaW5nV2VpZ2h0XV0iCiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcC1zb3J0aW5nLW1ldGhvZD0iW1t0b29sdGlwU29ydGluZ01ldGhvZF1dIgogICAgICAgICAgICAgICAgICAgIGlnbm9yZS15LW91dGxpZXJzPSJbW19pZ25vcmVZT3V0bGllcnNdXSIKICAgICAgICAgICAgICAgICAgICBzaG93LWRvd25sb2FkLWxpbmtzPSJbW19zaG93RG93bmxvYWRMaW5rc11dIgogICAgICAgICAgICAgICAgICAgIHRhZy1yZWdleGVzPSJbW2NoYXJ0Lm11bHRpbGluZS50YWddXSIKICAgICAgICAgICAgICAgICAgPjwvdGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQ+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJ0Lm1hcmdpbl1dIj4KICAgICAgICAgICAgICAgICAgPHRmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQKICAgICAgICAgICAgICAgICAgICBhY3RpdmU9IltbYWN0aXZlXV0iCiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIgogICAgICAgICAgICAgICAgICAgIHJ1bnM9IltbX3NlbGVjdGVkUnVuc11dIgogICAgICAgICAgICAgICAgICAgIHRpdGxlPSJbW2NoYXJ0LnRpdGxlXV0iCiAgICAgICAgICAgICAgICAgICAgeC10eXBlPSJbW194VHlwZV1dIgogICAgICAgICAgICAgICAgICAgIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIKICAgICAgICAgICAgICAgICAgICBpZ25vcmUteS1vdXRsaWVycz0iW1tfaWdub3JlWU91dGxpZXJzXV0iCiAgICAgICAgICAgICAgICAgICAgc2hvdy1kb3dubG9hZC1saW5rcz0iW1tfc2hvd0Rvd25sb2FkTGlua3NdXSIKICAgICAgICAgICAgICAgICAgICBtYXJnaW4tY2hhcnQtc2VyaWVzPSJbW2NoYXJ0Lm1hcmdpbi5zZXJpZXNdXSIKICAgICAgICAgICAgICAgICAgPjwvdGYtY3VzdG9tLXNjYWxhci1tYXJnaW4tY2hhcnQtY2FyZD4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgI3Rvb2x0aXAtc29ydGluZyB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tdG9wOiAxNXB4OwogICAgICB9CiAgICAgICN0b29sdGlwLXNvcnRpbmcgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIHdpZHRoOiAxMDVweDsKICAgICAgfQogICAgICAubGluZS1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nLXRvcDogNXB4OwogICAgICB9CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsZHIpXSxBQ3QucHJvdG90eXBlLCJfcmVxdWVzdE1hbmFnZXIiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsWFIpXSxBQ3QucHJvdG90eXBlLCJfY2FuY2VsbGVyIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxBQ3QucHJvdG90eXBlLCJfc2VsZWN0ZWRSdW5zIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixub3RpZnk6ITAsb2JzZXJ2ZXI6Il9zaG93RG93bmxvYWRMaW5rc09ic2VydmVyIn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sQUN0LnByb3RvdHlwZSwiX3Nob3dEb3dubG9hZExpbmtzIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLG5vdGlmeTohMCxvYnNlcnZlcjoiX3Ntb290aGluZ1dlaWdodE9ic2VydmVyIn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxBQ3QucHJvdG90eXBlLCJfc21vb3RoaW5nV2VpZ2h0Iix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2lnbm9yZVlPdXRsaWVyc09ic2VydmVyIn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sQUN0LnByb3RvdHlwZSwiX2lnbm9yZVlPdXRsaWVycyIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxBQ3QucHJvdG90eXBlLCJfeFR5cGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sQUN0LnByb3RvdHlwZSwiX2xheW91dCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLEFDdC5wcm90b3R5cGUsIl9kYXRhTm90Rm91bmQiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sQUN0LnByb3RvdHlwZSwiX29wZW5lZENhdGVnb3JpZXMiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxBQ3QucHJvdG90eXBlLCJfYWN0aXZlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sQUN0LnByb3RvdHlwZSwicmVsb2FkT25SZWFkeSIsdm9pZCAwKSx0KFtzKCJfc21vb3RoaW5nV2VpZ2h0IiksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLEFDdC5wcm90b3R5cGUsIl9zbW9vdGhpbmdFbmFibGVkIixudWxsKSx0KFtzKCJfbGF5b3V0IiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxBQ3QucHJvdG90eXBlLCJfY2F0ZWdvcmllcyIsbnVsbCksQUN0PXQoW2koInRmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkIildLEFDdCk7Y2xhc3Mga0N0e2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5ydW4yZGF0YXNldHM9e30sdGhpcy5jb2xvclNjYWxlPWUsdGhpcy5idWlsZENoYXJ0KHQpfWdldERhdGFzZXQodCl7cmV0dXJuIHZvaWQgMD09PXRoaXMucnVuMmRhdGFzZXRzW3RdJiYodGhpcy5ydW4yZGF0YXNldHNbdF09bmV3IHJPLkRhdGFzZXQoW10se3J1bjp0fSkpLHRoaXMucnVuMmRhdGFzZXRzW3RdfWJ1aWxkQ2hhcnQodCl7dGhpcy5vdXRlciYmdGhpcy5vdXRlci5kZXN0cm95KCk7bGV0IGU9QVR0KHQpO3RoaXMueEFjY2Vzc29yPWUuYWNjZXNzb3IsdGhpcy54U2NhbGU9ZS5zY2FsZSx0aGlzLnhBeGlzPWUuYXhpcyx0aGlzLnhBeGlzLm1hcmdpbigwKSx0aGlzLnhBeGlzLnRpY2tMYWJlbFBhZGRpbmcoMyksdGhpcy55U2NhbGU9bmV3IHJPLlNjYWxlcy5MaW5lYXIsdGhpcy55QXhpcz1uZXcgck8uQXhlcy5OdW1lcmljKHRoaXMueVNjYWxlLCJsZWZ0Iik7bGV0IG49d1R0KDMpO3RoaXMueUF4aXMubWFyZ2luKDApLnRpY2tMYWJlbFBhZGRpbmcoNSkuZm9ybWF0dGVyKG4pLHRoaXMueUF4aXMudXNlc1RleHRXaWR0aEFwcHJveGltYXRpb24oITApO2xldCBpPXRoaXMuYnVpbGRQbG90KHRoaXMueEFjY2Vzc29yLHRoaXMueFNjYWxlLHRoaXMueVNjYWxlKTt0aGlzLmdyaWRsaW5lcz1uZXcgck8uQ29tcG9uZW50cy5HcmlkbGluZXModGhpcy54U2NhbGUsdGhpcy55U2NhbGUpLHRoaXMuY2VudGVyPW5ldyByTy5Db21wb25lbnRzLkdyb3VwKFt0aGlzLmdyaWRsaW5lcyxpXSksdGhpcy5vdXRlcj1uZXcgck8uQ29tcG9uZW50cy5UYWJsZShbW3RoaXMueUF4aXMsdGhpcy5jZW50ZXJdLFtudWxsLHRoaXMueEF4aXNdXSl9YnVpbGRQbG90KHQsZSxuKXtsZXQgaT1bMCwyMjgsMTU4NywzMDg1LDVlMyw2OTE1LDg0MTMsOTc3MiwxZTRdLHI9U2UuZXhwb3J0cy5yYW5nZShpLmxlbmd0aC0xKS5tYXAoKHQ9PihpW3QrMV0taVt0XSkvMjUwMCkpLG89aS5tYXAoKCh0LGUpPT50PT50W2VdWzFdKSksYT1vWzRdLHM9U2UuZXhwb3J0cy5yYW5nZShvLmxlbmd0aC0xKS5tYXAoKGk9PntsZXQgYT1uZXcgck8uUGxvdHMuQXJlYTthLngodCxlKTtsZXQgcz1pPjQ/b1tpXTpvW2krMV07cmV0dXJuIGEueShpPjQ/b1tpKzFdOm9baV0sbiksYS55MChzKSxhLmF0dHIoImZpbGwiLCgodCxlLG4pPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUobi5tZXRhZGF0YSgpLnJ1bikpKSxhLmF0dHIoInN0cm9rZSIsKCh0LGUsbik9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShuLm1ldGFkYXRhKCkucnVuKSkpLGEuYXR0cigic3Ryb2tlLXdlaWdodCIsKCh0LGUsbik9PiIwLjVweCIpKSxhLmF0dHIoInN0cm9rZS1vcGFjaXR5IiwoKCk9PnJbaV0pKSxhLmF0dHIoImZpbGwtb3BhY2l0eSIsKCgpPT5yW2ldKSksYX0pKSxsPW5ldyByTy5QbG90cy5MaW5lO3JldHVybiBsLngodCxlKSxsLnkoYSxuKSxsLmF0dHIoInN0cm9rZSIsKCh0LGUsbik9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShuLnJ1bikpKSx0aGlzLnBsb3RzPXMsbmV3IHJPLkNvbXBvbmVudHMuR3JvdXAocyl9c2V0VmlzaWJsZVNlcmllcyh0KXt0aGlzLnJ1bnM9dDtsZXQgZT10Lm1hcCgodD0+dGhpcy5nZXREYXRhc2V0KHQpKSk7dGhpcy5wbG90cy5mb3JFYWNoKCh0PT50LmRhdGFzZXRzKGUpKSl9c2V0U2VyaWVzRGF0YSh0LGUpe3RoaXMuZ2V0RGF0YXNldCh0KS5kYXRhKGUpfXJlbmRlclRvKHQpe3RoaXMudGFyZ2V0U1ZHPXQsdGhpcy5vdXRlci5yZW5kZXJUbyh0KX1yZWRyYXcoKXt0aGlzLm91dGVyLnJlZHJhdygpfWRlc3Ryb3koKXt0aGlzLm91dGVyLmRlc3Ryb3koKX19bGV0IExDdD1jbGFzcyBleHRlbmRzKGVyKHllKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29sb3JTY2FsZT0obmV3IHJPLlNjYWxlcy5Db2xvcikucmFuZ2UoZ0Euc2xpY2UoKSksdGhpcy54VHlwZT0ic3RlcCIsdGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlPVtdLHRoaXMuX3Nlcmllc0RhdGFDYWNoZT17fSx0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9bnVsbH1zZXRWaXNpYmxlU2VyaWVzKHQpe3RoaXMuX3Zpc2libGVTZXJpZXNDYWNoZT10LHRoaXMuX2NoYXJ0JiYodGhpcy5fY2hhcnQuc2V0VmlzaWJsZVNlcmllcyh0KSx0aGlzLnJlZHJhdygpKX1zZXRTZXJpZXNEYXRhKHQsZSl7dGhpcy5fc2VyaWVzRGF0YUNhY2hlW3RdPWUsdGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnNldFNlcmllc0RhdGEodCxlKX1yZWRyYXcoKXt0aGlzLl9jaGFydC5yZWRyYXcoKX1fbWFrZUNoYXJ0KCl7dmFyIHQ9dGhpcy54VHlwZSxlPXRoaXMuY29sb3JTY2FsZSxuPXRoaXMuX2F0dGFjaGVkO251bGw9PT10aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQmJnRoaXMuY2FuY2VsQXN5bmModGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkKSx0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9dGhpcy5hc3luYygoZnVuY3Rpb24oKXtpZih0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9bnVsbCxuKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuZGVzdHJveSgpO3ZhciBpPW5ldyBrQ3QodCxlKSxyPVN1KHRoaXMuJC5jaGFydGRpdik7aS5yZW5kZXJUbyhyKSx0aGlzLl9jaGFydD1pfX0pLDM1MCl9X3JlbG9hZEZyb21DYWNoZSgpe3RoaXMuX2NoYXJ0JiYodGhpcy5fY2hhcnQuc2V0VmlzaWJsZVNlcmllcyh0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUpLHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3RoaXMuX2NoYXJ0LnNldFNlcmllc0RhdGEodCx0aGlzLl9zZXJpZXNEYXRhQ2FjaGVbdF18fFtdKX0uYmluZCh0aGlzKSkpfWF0dGFjaGVkKCl7dGhpcy5fYXR0YWNoZWQ9ITB9ZGV0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMX19O0xDdC50ZW1wbGF0ZT1fZWAKICAgIDxzdHlsZSBpbmNsdWRlPSJwbG90dGFibGUtc3R5bGUiPjwvc3R5bGU+CiAgICA8ZGl2IGlkPSJjaGFydGRpdiI+PC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgI2NoYXJ0ZGl2IHsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICB9CiAgICAgIC5wbG90dGFibGUgLmF4aXMgdGV4dCB7CiAgICAgICAgZmlsbDogY3VycmVudENvbG9yOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsck8uU2NhbGVzLkNvbG9yKV0sTEN0LnByb3RvdHlwZSwiY29sb3JTY2FsZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxMQ3QucHJvdG90eXBlLCJ4VHlwZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLExDdC5wcm90b3R5cGUsIl9hdHRhY2hlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixrQ3QpXSxMQ3QucHJvdG90eXBlLCJfY2hhcnQiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLExDdC5wcm90b3R5cGUsIl92aXNpYmxlU2VyaWVzQ2FjaGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTEN0LnByb3RvdHlwZSwiX3Nlcmllc0RhdGFDYWNoZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxMQ3QucHJvdG90eXBlLCJfbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkIix2b2lkIDApLHQoW2EoInhUeXBlIiwiY29sb3JTY2FsZSIsIl9hdHRhY2hlZCIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sTEN0LnByb3RvdHlwZSwiX21ha2VDaGFydCIsbnVsbCksdChbYSgiX2NoYXJ0IiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxMQ3QucHJvdG90eXBlLCJfcmVsb2FkRnJvbUNhY2hlIixudWxsKSxMQ3Q9dChbaSgidnotZGlzdHJpYnV0aW9uLWNoYXJ0IildLExDdCk7bGV0IFBDdD1jbGFzcyBleHRlbmRzKExUdChlcih5ZSkpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5nZXREYXRhTG9hZE5hbWU9KHtydW46dH0pPT50LHRoaXMucmVxdWVzdERhdGE9KHQsZSxuKT0+e2NvbnN0IGk9X3IoKS5wbHVnaW5Sb3V0ZSgiZGlzdHJpYnV0aW9ucyIsIi9kaXN0cmlidXRpb25zIik7UHJvbWlzZS5hbGwodC5tYXAoKHQ9Pntjb25zdCBuPWlPKGkse3RhZzp0LnRhZyxydW46dC5ydW59KTtyZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KG4pLnRoZW4oKG49PntlKHtpdGVtOnQsZGF0YTpufSl9KSl9KSkpLmZpbmFsbHkoKCgpPT57bigpfSkpfSx0aGlzLmxvYWREYXRhQ2FsbGJhY2s9KHQsZSxuKT0+e2NvbnN0IGk9bi5tYXAoKHQ9Pntjb25zdFtlLG4saV09dDtyZXR1cm4gaS53YWxsX3RpbWU9bmV3IERhdGUoMWUzKmUpLGkuc3RlcD1uLGl9KSkscj10aGlzLmdldERhdGFMb2FkTmFtZShlKTt0aGlzLiQuY2hhcnQuc2V0U2VyaWVzRGF0YShyLGkpLHRoaXMuJC5jaGFydC5zZXRWaXNpYmxlU2VyaWVzKFtyXSl9LHRoaXMuX2NvbG9yU2NhbGU9e3NjYWxlOkdSfSx0aGlzLl9leHBhbmRlZD0hMSx0aGlzLl9jYW5jZWxsZXI9bmV3IFhSfV9yZWxvYWRPblJ1blRhZ0NoYW5nZSgpe3RoaXMucmVsb2FkKCl9X3VwZGF0ZURhdGFUb0xvYWQoKXt0aGlzLmRhdGFUb0xvYWQ9W3tydW46dGhpcy5ydW4sdGFnOnRoaXMudGFnfV19Z2V0IF9ydW5Db2xvcigpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlLnNjYWxlKHRoaXMucnVuKX1yZWRyYXcoKXt0aGlzLiQuY2hhcnQucmVkcmF3KCl9X3RvZ2dsZUV4cGFuZGVkKHQpe3RoaXMuc2V0KCJfZXhwYW5kZWQiLCF0aGlzLl9leHBhbmRlZCksdGhpcy5yZWRyYXcoKX19O1BDdC50ZW1wbGF0ZT1fZWAKICAgIDx0Zi1jYXJkLWhlYWRpbmcKICAgICAgdGFnPSJbW3RhZ11dIgogICAgICBydW49IltbcnVuXV0iCiAgICAgIGRpc3BsYXktbmFtZT0iW1t0YWdNZXRhZGF0YS5kaXNwbGF5TmFtZV1dIgogICAgICBkZXNjcmlwdGlvbj0iW1t0YWdNZXRhZGF0YS5kZXNjcmlwdGlvbl1dIgogICAgICBjb2xvcj0iW1tfcnVuQ29sb3JdXSIKICAgID48L3RmLWNhcmQtaGVhZGluZz4KICAgIDwhLS0KICAgICAgVGhlIG1haW4gZGlzdHJpYnV0aW9uIHRoYXQgd2UgcmVuZGVyLiBEYXRhIGlzIHNldCBkaXJlY3RseSB3aXRoCiAgICAgIFxgc2V0U2VyaWVzRGF0YVxgLCBub3Qgd2l0aCBhIGJvdW5kIHByb3BlcnR5LgogICAgLS0+CiAgICA8dnotZGlzdHJpYnV0aW9uLWNoYXJ0CiAgICAgIGlkPSJjaGFydCIKICAgICAgeC10eXBlPSJbW3hUeXBlXV0iCiAgICAgIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlXV0iCiAgICA+PC92ei1kaXN0cmlidXRpb24tY2hhcnQ+CiAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogcm93OyI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIKICAgICAgICBpY29uPSJmdWxsc2NyZWVuIgogICAgICAgIG9uLXRhcD0iX3RvZ2dsZUV4cGFuZGVkIgogICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHdpZHRoOiAzMzBweDsKICAgICAgICBoZWlnaHQ6IDIzNXB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDcwMHB4OwogICAgICAgIGhlaWdodDogNTAwcHg7CiAgICAgIH0KCiAgICAgIHZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIHsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICB0Zi1jYXJkLWhlYWRpbmcgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxQQ3QucHJvdG90eXBlLCJydW4iLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sUEN0LnByb3RvdHlwZSwidGFnIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFBDdC5wcm90b3R5cGUsInRhZ01ldGFkYXRhIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFBDdC5wcm90b3R5cGUsInhUeXBlIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFBDdC5wcm90b3R5cGUsImdldERhdGFMb2FkTmFtZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxQQ3QucHJvdG90eXBlLCJsb2FkRGF0YUNhbGxiYWNrIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFBDdC5wcm90b3R5cGUsIl9jb2xvclNjYWxlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFBDdC5wcm90b3R5cGUsIl9leHBhbmRlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixkcildLFBDdC5wcm90b3R5cGUsInJlcXVlc3RNYW5hZ2VyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLFhSKV0sUEN0LnByb3RvdHlwZSwiX2NhbmNlbGxlciIsdm9pZCAwKSx0KFthKCJydW4iLCJ0YWciKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLFBDdC5wcm90b3R5cGUsIl9yZWxvYWRPblJ1blRhZ0NoYW5nZSIsbnVsbCksdChbYSgicnVuIiwidGFnIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxQQ3QucHJvdG90eXBlLCJfdXBkYXRlRGF0YVRvTG9hZCIsbnVsbCksdChbcygicnVuIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sUEN0LnByb3RvdHlwZSwiX3J1bkNvbG9yIixudWxsKSxQQ3Q9dChbaSgidGYtZGlzdHJpYnV0aW9uLWxvYWRlciIpXSxQQ3QpO2xldCBOQ3Q9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnJlbG9hZE9uUmVhZHk9ITAsdGhpcy5feFR5cGU9InN0ZXAiLHRoaXMuX3JlcXVlc3RNYW5hZ2VyPW5ldyBkcn1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5yZWxvYWRPblJlYWR5JiZ0aGlzLnJlbG9hZCgpfXJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCgpPT57dGhpcy5fcmVsb2FkRGlzdHJpYnV0aW9ucygpfSkpfV9mZXRjaFRhZ3MoKXtjb25zdCB0PV9yKCkucGx1Z2luUm91dGUoImRpc3RyaWJ1dGlvbnMiLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHQpLnRoZW4oKHQ9PntpZihTZS5leHBvcnRzLmlzRXF1YWwodCx0aGlzLl9ydW5Ub1RhZ0luZm8pKXJldHVybjtjb25zdCBlPVNlLmV4cG9ydHMubWFwVmFsdWVzKHQsKHQ9Pk9iamVjdC5rZXlzKHQpKSksbj1hcihlKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PW4ubGVuZ3RoKSx0aGlzLnNldCgiX3J1blRvVGFnIixlKSx0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsdCksdGhpcy5hc3luYygoKCk9Pnt0aGlzLnNldCgiX2NhdGVnb3JpZXNEb21SZWFkeSIsITApfSkpfSkpfV9yZWxvYWREaXN0cmlidXRpb25zKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWRpc3RyaWJ1dGlvbi1sb2FkZXIiKS5mb3JFYWNoKCh0PT57dC5yZWxvYWQoKX0pKX1fc2hvdWxkT3Blbih0KXtyZXR1cm4gdDw9Mn1nZXQgX2NhdGVnb3JpZXMoKXtyZXR1cm4gTXIodGhpcy5fcnVuVG9UYWcsdGhpcy5fc2VsZWN0ZWRSdW5zLHRoaXMuX3RhZ0ZpbHRlcil9X3RhZ01ldGFkYXRhKHQsZSxuKXtyZXR1cm4gdFtlXVtuXX19O05DdC50ZW1wbGF0ZT1fZWAKICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZXR0aW5ncyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yCiAgICAgICAgICAgICAgaWQ9InhUeXBlU2VsZWN0b3IiCiAgICAgICAgICAgICAgbmFtZT0iSG9yaXpvbnRhbCBheGlzIgogICAgICAgICAgICAgIHNlbGVjdGVkLWlkPSJ7e194VHlwZX19IgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9IndhbGxfdGltZSI+d2FsbDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBydW5zLXNlbGVjdG9yIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gZGlzdHJpYnV0aW9uIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczo8L3A+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGhpc3RvZ3JhbSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuCiAgICAgICAgICAgICAgICAoSGlzdG9ncmFtcyBhbmQgZGlzdHJpYnV0aW9ucyBib3RoIHVzZSB0aGUgaGlzdG9ncmFtIHN1bW1hcnkKICAgICAgICAgICAgICAgIG9wZXJhdGlvbi4pCiAgICAgICAgICAgICAgPC9saT4KCiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiCiAgICAgICAgICAgICAgICA+UkVBRE1FPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIgogICAgICAgICAgICAgICAgPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hCiAgICAgICAgICAgICAgPi4KICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyIKICAgICAgICAgICAgICAgID50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcKICAgICAgICAgICAgICBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIgogICAgICAgICAgICAgIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLWRpc3RyaWJ1dGlvbi1sb2FkZXIKICAgICAgICAgICAgICAgICAgYWN0aXZlPSJbW2FjdGl2ZV1dIgogICAgICAgICAgICAgICAgICBydW49IltbaXRlbS5ydW5dXSIKICAgICAgICAgICAgICAgICAgdGFnPSJbW2l0ZW0udGFnXV0iCiAgICAgICAgICAgICAgICAgIHRhZy1tZXRhZGF0YT0iW1tfdGFnTWV0YWRhdGEoX3J1blRvVGFnSW5mbywgaXRlbS5ydW4sIGl0ZW0udGFnKV1dIgogICAgICAgICAgICAgICAgICB4LXR5cGU9IltbX3hUeXBlXV0iCiAgICAgICAgICAgICAgICAgIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgICAgICAgICAgID48L3RmLWRpc3RyaWJ1dGlvbi1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLE5DdC5wcm90b3R5cGUsInJlbG9hZE9uUmVhZHkiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sTkN0LnByb3RvdHlwZSwiX3hUeXBlIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxOQ3QucHJvdG90eXBlLCJfc2VsZWN0ZWRSdW5zIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLE5DdC5wcm90b3R5cGUsIl9ydW5Ub1RhZyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxOQ3QucHJvdG90eXBlLCJfcnVuVG9UYWdJbmZvIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sTkN0LnByb3RvdHlwZSwiX2RhdGFOb3RGb3VuZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxOQ3QucHJvdG90eXBlLCJfdGFnRmlsdGVyIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sTkN0LnByb3RvdHlwZSwiX2NhdGVnb3JpZXNEb21SZWFkeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixkcildLE5DdC5wcm90b3R5cGUsIl9yZXF1ZXN0TWFuYWdlciIsdm9pZCAwKSx0KFtzKCJfcnVuVG9UYWciLCJfc2VsZWN0ZWRSdW5zIiwiX3RhZ0ZpbHRlciIsIl9jYXRlZ29yaWVzRG9tUmVhZHkiKSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLE5DdC5wcm90b3R5cGUsIl9jYXRlZ29yaWVzIixudWxsKSxOQ3Q9dChbaSgidGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZCIpXSxOQ3QpO3ZhciBJQ3Q9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsTGlzdGVuS2V5OmRzLGFkZEhhc2hMaXN0ZW5lcjptcyxhZGRTdG9yYWdlTGlzdGVuZXI6Z3MsZmlyZVN0b3JhZ2VDaGFuZ2VkOl9zLHJlbW92ZUhhc2hMaXN0ZW5lckJ5S2V5OnlzLHJlbW92ZVN0b3JhZ2VMaXN0ZW5lckJ5S2V5OnZzLGdldFVybEhhc2hEaWN0OmZ1bmN0aW9uIFJDdCgpe3JldHVybiBDc30sRElTQU1CSUdVQVRPUjoiZGlzYW1iaWd1YXRvciIsZ2V0U3RyaW5nOk5zLHNldFN0cmluZzpJcyxnZXRTdHJpbmdJbml0aWFsaXplcjpScyxnZXRTdHJpbmdPYnNlcnZlcjpPcyxkaXNwb3NlU3RyaW5nQmluZGluZzp6cyxnZXRCb29sZWFuOkRzLHNldEJvb2xlYW46QnMsZ2V0Qm9vbGVhbkluaXRpYWxpemVyOkhzLGdldEJvb2xlYW5PYnNlcnZlcjpGcyxkaXNwb3NlQm9vbGVhbkJpbmRpbmc6VnMsZ2V0TnVtYmVyOlVzLHNldE51bWJlcjpqcyxnZXROdW1iZXJJbml0aWFsaXplcjpHcyxnZXROdW1iZXJPYnNlcnZlcjpXcyxkaXNwb3NlTnVtYmVyQmluZGluZzpxcyxnZXRPYmplY3Q6WXMsc2V0T2JqZWN0OlhzLGdldE9iamVjdEluaXRpYWxpemVyOiRzLGdldE9iamVjdE9ic2VydmVyOktzLGRpc3Bvc2VPYmplY3RCaW5kaW5nOlpzLG1ha2VCaW5kaW5nczpKcyxtaWdyYXRlTGVnYWN5VVJMU2NoZW1lOmZ1bmN0aW9uIE9DdCgpe2NvbnN0IHQ9bmV3IFNldChbImV4YW1wbGVzUGF0aCIsImhpZGVNb2RlbFBhbmUyIiwibW9kZWxOYW1lMSIsIm1vZGVsTmFtZTIiLCJpbmZlcmVuY2VBZGRyZXNzMSIsImluZmVyZW5jZUFkZHJlc3MyIiwibW9kZWxUeXBlIiwibW9kZWxWZXJzaW9uMSIsIm1vZGVsVmVyc2lvbjIiLCJtb2RlbFNpZ25hdHVyZTEiLCJtb2RlbFNpZ25hdHVyZTIiLCJtYXhFeGFtcGxlcyIsImxhYmVsVm9jYWJQYXRoIiwibXVsdGlDbGFzcyIsInNlcXVlbmNlRXhhbXBsZXMiLCJtYXhDbGFzc2VzVG9EaXNwbGF5Iiwic2FtcGxpbmdPZGRzIiwidXNlUHJlZGljdEFwaSIsInByZWRpY3RJbnB1dFRlbnNvciIsInByZWRpY3RPdXRwdXRUZW5zb3IiXSksZT1rcyhBcygpKTtpZigid2hhdGlmIj09PWUuX190YWJfXylmb3IobGV0IG4gb2YgdCluIGluIGUmJihlW2BwLndoYXRpZi4ke259YF09ZVtuXSk7THMoUHMoZSkpLChmdW5jdGlvbiBuKHQpe0NzPXR9KShlKX19KSx6Q3Q9ZnVuY3Rpb24gREN0KHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfSxCQ3Q9ekN0LEhDdD1mdW5jdGlvbiBGQ3QodCxlKXtmb3IodmFyIG49dC5sZW5ndGg7bi0tOylpZihCQ3QodFtuXVswXSxlKSlyZXR1cm4gbjtyZXR1cm4tMX0sVkN0PUhDdCxVQ3Q9QXJyYXkucHJvdG90eXBlLnNwbGljZSxqQ3Q9SEN0LEdDdD1IQ3QsV0N0PUhDdDtmdW5jdGlvbiBxQ3QodCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciBpPXRbZV07dGhpcy5zZXQoaVswXSxpWzFdKX19cUN0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbiBZQ3QoKXt0aGlzLl9fZGF0YV9fPVtdLHRoaXMuc2l6ZT0wfSxxQ3QucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbiBYQ3QodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPVZDdChlLHQpO3JldHVybiEobjwwfHwobj09ZS5sZW5ndGgtMT9lLnBvcCgpOlVDdC5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwwKSl9LHFDdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uICRDdCh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49akN0KGUsdCk7cmV0dXJuIG48MD92b2lkIDA6ZVtuXVsxXX0scUN0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24gS0N0KHQpe3JldHVybiBHQ3QodGhpcy5fX2RhdGFfXyx0KT4tMX0scUN0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24gWkN0KHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxpPVdDdChuLHQpO3JldHVybiBpPDA/KCsrdGhpcy5zaXplLG4ucHVzaChbdCxlXSkpOm5baV1bMV09ZSx0aGlzfTt2YXIgSkN0LFFDdD1xQ3QsdEF0PVFDdCxlQXQ9Im9iamVjdCI9PXR5cGVvZiB2ZSYmdmUmJnZlLk9iamVjdD09PU9iamVjdCYmdmUsbkF0PSJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsaUF0PWVBdHx8bkF0fHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLHJBdD1pQXQuU3ltYm9sLG9BdD1PYmplY3QucHJvdG90eXBlLGFBdD1vQXQuaGFzT3duUHJvcGVydHksc0F0PW9BdC50b1N0cmluZyxsQXQ9ckF0P3JBdC50b1N0cmluZ1RhZzp2b2lkIDAsY0F0PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsdUF0PXJBdD9yQXQudG9TdHJpbmdUYWc6dm9pZCAwLGhBdD1mdW5jdGlvbiBkQXQodCl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwPT09dD8iW29iamVjdCBVbmRlZmluZWRdIjoiW29iamVjdCBOdWxsXSI6dUF0JiZ1QXQgaW4gT2JqZWN0KHQpPyhmdW5jdGlvbiBlKHQpe3ZhciBlPWFBdC5jYWxsKHQsbEF0KSxuPXRbbEF0XTt0cnl7dFtsQXRdPXZvaWQgMDt2YXIgaT0hMH1jYXRjaCh0KXt9dmFyIHI9c0F0LmNhbGwodCk7cmV0dXJuIGkmJihlP3RbbEF0XT1uOmRlbGV0ZSB0W2xBdF0pLHJ9KSh0KTooZnVuY3Rpb24gbih0KXtyZXR1cm4gY0F0LmNhbGwodCl9KSh0KX0scEF0PWZ1bmN0aW9uIGZBdCh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX0sbUF0PWhBdCxnQXQ9cEF0LF9BdD1mdW5jdGlvbiB5QXQodCl7aWYoIWdBdCh0KSlyZXR1cm4hMTt2YXIgZT1tQXQodCk7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBQcm94eV0iPT1lfSx2QXQ9aUF0WyJfX2NvcmUtanNfc2hhcmVkX18iXSxiQXQ9KEpDdD0vW14uXSskLy5leGVjKHZBdCYmdkF0LmtleXMmJnZBdC5rZXlzLklFX1BST1RPfHwiIikpPyJTeW1ib2woc3JjKV8xLiIrSkN0OiIiLHhBdD1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcsd0F0PWZ1bmN0aW9uIFNBdCh0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIHhBdC5jYWxsKHQpfWNhdGNoKHQpe310cnl7cmV0dXJuIHQrIiJ9Y2F0Y2godCl7fX1yZXR1cm4iIn0sTUF0PV9BdCxFQXQ9cEF0LFRBdD13QXQsQ0F0PS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvLEFBdD1SZWdFeHAoIl4iK0Z1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpLnJlcGxhY2UoL1tcXF4kLiorPygpW1xde318XS9nLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpLGtBdD1mdW5jdGlvbiBMQXQodCxlKXt2YXIgbj0oZnVuY3Rpb24gaSh0LGUpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfSkodCxlKTtyZXR1cm4oZnVuY3Rpb24gcih0KXtyZXR1cm4hKCFFQXQodCl8fChmdW5jdGlvbiBlKHQpe3JldHVybiEhYkF0JiZiQXQgaW4gdH0pKHQpKSYmKE1BdCh0KT9BQXQ6Q0F0KS50ZXN0KFRBdCh0KSl9KShuKT9uOnZvaWQgMH0sUEF0PWtBdChpQXQsIk1hcCIpLE5BdD1rQXQoT2JqZWN0LCJjcmVhdGUiKSxJQXQ9TkF0LFJBdD1OQXQsT0F0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksekF0PU5BdCxEQXQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxCQXQ9TkF0O2Z1bmN0aW9uIEhBdCh0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIGk9dFtlXTt0aGlzLnNldChpWzBdLGlbMV0pfX1IQXQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uIEZBdCgpe3RoaXMuX19kYXRhX189SUF0P0lBdChudWxsKTp7fSx0aGlzLnNpemU9MH0sSEF0LnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24gVkF0KHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxIQXQucHJvdG90eXBlLmdldD1mdW5jdGlvbiBVQXQodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZihSQXQpe3ZhciBuPWVbdF07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09bj92b2lkIDA6bn1yZXR1cm4gT0F0LmNhbGwoZSx0KT9lW3RdOnZvaWQgMH0sSEF0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24gakF0KHQpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIHpBdD92b2lkIDAhPT1lW3RdOkRBdC5jYWxsKGUsdCl9LEhBdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uIEdBdCh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLG5bdF09QkF0JiZ2b2lkIDA9PT1lPyJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjplLHRoaXN9O3ZhciBXQXQ9SEF0LHFBdD1RQ3QsWUF0PVBBdCxYQXQ9ZnVuY3Rpb24gJEF0KHQsZSl7dmFyIG49dC5fX2RhdGFfXztyZXR1cm4oZnVuY3Rpb24gaSh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4ic3RyaW5nIj09ZXx8Im51bWJlciI9PWV8fCJzeW1ib2wiPT1lfHwiYm9vbGVhbiI9PWU/Il9fcHJvdG9fXyIhPT10Om51bGw9PT10fSkoZSk/blsic3RyaW5nIj09dHlwZW9mIGU/InN0cmluZyI6Imhhc2giXTpuLm1hcH0sS0F0PVhBdCxaQXQ9WEF0LEpBdD1YQXQsUUF0PVhBdDtmdW5jdGlvbiB0a3QodCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciBpPXRbZV07dGhpcy5zZXQoaVswXSxpWzFdKX19dGt0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbiBla3QoKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyBXQXQsbWFwOm5ldyhZQXR8fHFBdCksc3RyaW5nOm5ldyBXQXR9fSx0a3QucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbiBua3QodCl7dmFyIGU9S0F0KHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LHRrdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uIGlrdCh0KXtyZXR1cm4gWkF0KHRoaXMsdCkuZ2V0KHQpfSx0a3QucHJvdG90eXBlLmhhcz1mdW5jdGlvbiBya3QodCl7cmV0dXJuIEpBdCh0aGlzLHQpLmhhcyh0KX0sdGt0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24gb2t0KHQsZSl7dmFyIG49UUF0KHRoaXMsdCksaT1uLnNpemU7cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplKz1uLnNpemU9PWk/MDoxLHRoaXN9O3ZhciBha3Q9dGt0LHNrdD1RQ3QsbGt0PVBBdCxja3Q9YWt0LHVrdD1RQ3Q7ZnVuY3Rpb24gaGt0KHQpe3ZhciBlPXRoaXMuX19kYXRhX189bmV3IHVrdCh0KTt0aGlzLnNpemU9ZS5zaXplfWhrdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24gZGt0KCl7dGhpcy5fX2RhdGFfXz1uZXcgdEF0LHRoaXMuc2l6ZT0wfSxoa3QucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbiBwa3QodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWUuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemU9ZS5zaXplLG59LGhrdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uIGZrdCh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9LGhrdC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uIG1rdCh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9LGhrdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uIGdrdCh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187aWYobiBpbnN0YW5jZW9mIHNrdCl7dmFyIGk9bi5fX2RhdGFfXztpZighbGt0fHxpLmxlbmd0aDwxOTkpcmV0dXJuIGkucHVzaChbdCxlXSksdGhpcy5zaXplPSsrbi5zaXplLHRoaXM7bj10aGlzLl9fZGF0YV9fPW5ldyBja3QoaSl9cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplPW4uc2l6ZSx0aGlzfTt2YXIgX2t0PWhrdCx5a3Q9ZnVuY3Rpb24gdmt0KHQsZSl7Zm9yKHZhciBuPS0xLGk9bnVsbD09dD8wOnQubGVuZ3RoOysrbjxpJiYhMSE9PWUodFtuXSxuLHQpOyk7cmV0dXJuIHR9LGJrdD1rQXQseGt0PShmdW5jdGlvbigpe3RyeXt2YXIgdD1ia3QoT2JqZWN0LCJkZWZpbmVQcm9wZXJ0eSIpO3JldHVybiB0KHt9LCIiLHt9KSx0fWNhdGNoKHQpe319KSgpLHdrdD14a3QsU2t0PWZ1bmN0aW9uIE1rdCh0LGUsbil7Il9fcHJvdG9fXyI9PWUmJndrdD93a3QodCxlLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpuLHdyaXRhYmxlOiEwfSk6dFtlXT1ufSxFa3Q9U2t0LFRrdD16Q3QsQ2t0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksQWt0PWZ1bmN0aW9uIGtrdCh0LGUsbil7dmFyIGk9dFtlXTtDa3QuY2FsbCh0LGUpJiZUa3QoaSxuKSYmKHZvaWQgMCE9PW58fGUgaW4gdCl8fEVrdCh0LGUsbil9LExrdD1Ba3QsUGt0PVNrdCxOa3Q9ZnVuY3Rpb24gSWt0KHQsZSxuLGkpe3ZhciByPSFuO258fChuPXt9KTtmb3IodmFyIG89LTEsYT1lLmxlbmd0aDsrK288YTspe3ZhciBzPWVbb10sbD1pP2kobltzXSx0W3NdLHMsbix0KTp2b2lkIDA7dm9pZCAwPT09bCYmKGw9dFtzXSkscj9Qa3QobixzLGwpOkxrdChuLHMsbCl9cmV0dXJuIG59LFJrdD1mdW5jdGlvbiBPa3QodCl7cmV0dXJuIG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdH0semt0PWhBdCxEa3Q9Umt0LEJrdD1mdW5jdGlvbiBIa3QodCl7cmV0dXJuIERrdCh0KSYmIltvYmplY3QgQXJndW1lbnRzXSI9PXprdCh0KX0sRmt0PVJrdCxWa3Q9T2JqZWN0LnByb3RvdHlwZSxVa3Q9Vmt0Lmhhc093blByb3BlcnR5LGprdD1Wa3QucHJvcGVydHlJc0VudW1lcmFibGUsR2t0PUJrdCgoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSkoKSk/Qmt0OmZ1bmN0aW9uKHQpe3JldHVybiBGa3QodCkmJlVrdC5jYWxsKHQsImNhbGxlZSIpJiYhamt0LmNhbGwodCwiY2FsbGVlIil9LFdrdD1BcnJheS5pc0FycmF5LHFrdD17ZXhwb3J0czp7fX0sWWt0PWZ1bmN0aW9uIFhrdCgpe3JldHVybiExfTshKGZ1bmN0aW9uKHQsZSl7dmFyIG49ZSYmIWUubm9kZVR5cGUmJmUsaT1uJiZ0JiYhdC5ub2RlVHlwZSYmdCxyPWkmJmkuZXhwb3J0cz09PW4/aUF0LkJ1ZmZlcjp2b2lkIDA7dC5leHBvcnRzPShyP3IuaXNCdWZmZXI6dm9pZCAwKXx8WWt0fSkocWt0LHFrdC5leHBvcnRzKTt2YXIgJGt0PS9eKD86MHxbMS05XVxkKikkLyxLa3Q9ZnVuY3Rpb24gWmt0KHQsZSl7dmFyIG49dHlwZW9mIHQ7cmV0dXJuISEoZT1udWxsPT1lPzkwMDcxOTkyNTQ3NDA5OTE6ZSkmJigibnVtYmVyIj09bnx8InN5bWJvbCIhPW4mJiRrdC50ZXN0KHQpKSYmdD4tMSYmdCUxPT0wJiZ0PGV9LEprdD1mdW5jdGlvbiBRa3QodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0Pi0xJiZ0JTE9PTAmJnQ8PTkwMDcxOTkyNTQ3NDA5OTF9LHRMdD1oQXQsZUx0PUprdCxuTHQ9Umt0LGlMdD17fTtpTHRbIltvYmplY3QgRmxvYXQzMkFycmF5XSJdPWlMdFsiW29iamVjdCBGbG9hdDY0QXJyYXldIl09aUx0WyJbb2JqZWN0IEludDhBcnJheV0iXT1pTHRbIltvYmplY3QgSW50MTZBcnJheV0iXT1pTHRbIltvYmplY3QgSW50MzJBcnJheV0iXT1pTHRbIltvYmplY3QgVWludDhBcnJheV0iXT1pTHRbIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIl09aUx0WyJbb2JqZWN0IFVpbnQxNkFycmF5XSJdPWlMdFsiW29iamVjdCBVaW50MzJBcnJheV0iXT0hMCxpTHRbIltvYmplY3QgQXJndW1lbnRzXSJdPWlMdFsiW29iamVjdCBBcnJheV0iXT1pTHRbIltvYmplY3QgQXJyYXlCdWZmZXJdIl09aUx0WyJbb2JqZWN0IEJvb2xlYW5dIl09aUx0WyJbb2JqZWN0IERhdGFWaWV3XSJdPWlMdFsiW29iamVjdCBEYXRlXSJdPWlMdFsiW29iamVjdCBFcnJvcl0iXT1pTHRbIltvYmplY3QgRnVuY3Rpb25dIl09aUx0WyJbb2JqZWN0IE1hcF0iXT1pTHRbIltvYmplY3QgTnVtYmVyXSJdPWlMdFsiW29iamVjdCBPYmplY3RdIl09aUx0WyJbb2JqZWN0IFJlZ0V4cF0iXT1pTHRbIltvYmplY3QgU2V0XSJdPWlMdFsiW29iamVjdCBTdHJpbmddIl09aUx0WyJbb2JqZWN0IFdlYWtNYXBdIl09ITE7dmFyIHJMdD1mdW5jdGlvbiBvTHQodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX0sYUx0PXtleHBvcnRzOnt9fTshKGZ1bmN0aW9uKHQsZSl7dmFyIG49ZSYmIWUubm9kZVR5cGUmJmUsaT1uJiZ0JiYhdC5ub2RlVHlwZSYmdCxyPWkmJmkuZXhwb3J0cz09PW4mJmVBdC5wcm9jZXNzLG89KGZ1bmN0aW9uKCl7dHJ5e3JldHVybiBpJiZpLnJlcXVpcmUmJmkucmVxdWlyZSgidXRpbCIpLnR5cGVzfHxyJiZyLmJpbmRpbmcmJnIuYmluZGluZygidXRpbCIpfWNhdGNoKHQpe319KSgpO3QuZXhwb3J0cz1vfSkoYUx0LGFMdC5leHBvcnRzKTt2YXIgc0x0PWFMdC5leHBvcnRzLGxMdD1zTHQmJnNMdC5pc1R5cGVkQXJyYXksY0x0PWxMdD9yTHQobEx0KTpmdW5jdGlvbiB1THQodCl7cmV0dXJuIG5MdCh0KSYmZUx0KHQubGVuZ3RoKSYmISFpTHRbdEx0KHQpXX0saEx0PUdrdCxkTHQ9V2t0LHBMdD1xa3QuZXhwb3J0cyxmTHQ9S2t0LG1MdD1jTHQsZ0x0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksX0x0PWZ1bmN0aW9uIHlMdCh0LGUpe3ZhciBuPWRMdCh0KSxpPSFuJiZoTHQodCkscj0hbiYmIWkmJnBMdCh0KSxvPSFuJiYhaSYmIXImJm1MdCh0KSxhPW58fGl8fHJ8fG8scz1hPyhmdW5jdGlvbiBsKHQsZSl7Zm9yKHZhciBuPS0xLGk9QXJyYXkodCk7KytuPHQ7KWlbbl09ZShuKTtyZXR1cm4gaX0pKHQubGVuZ3RoLFN0cmluZyk6W10sYz1zLmxlbmd0aDtmb3IodmFyIHUgaW4gdCkhZSYmIWdMdC5jYWxsKHQsdSl8fGEmJigibGVuZ3RoIj09dXx8ciYmKCJvZmZzZXQiPT11fHwicGFyZW50Ij09dSl8fG8mJigiYnVmZmVyIj09dXx8ImJ5dGVMZW5ndGgiPT11fHwiYnl0ZU9mZnNldCI9PXUpfHxmTHQodSxjKSl8fHMucHVzaCh1KTtyZXR1cm4gc30sdkx0PU9iamVjdC5wcm90b3R5cGUsYkx0PWZ1bmN0aW9uIHhMdCh0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yO3JldHVybiB0PT09KCJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLnByb3RvdHlwZXx8dkx0KX0sd0x0PWZ1bmN0aW9uIFNMdCh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChlKG4pKX19LE1MdD13THQoT2JqZWN0LmtleXMsT2JqZWN0KSxFTHQ9Ykx0LFRMdD1NTHQsQ0x0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksQUx0PWZ1bmN0aW9uIGtMdCh0KXtpZighRUx0KHQpKXJldHVybiBUTHQodCk7dmFyIGU9W107Zm9yKHZhciBuIGluIE9iamVjdCh0KSlDTHQuY2FsbCh0LG4pJiYiY29uc3RydWN0b3IiIT1uJiZlLnB1c2gobik7cmV0dXJuIGV9LExMdD1fQXQsUEx0PUprdCxOTHQ9ZnVuY3Rpb24gSUx0KHQpe3JldHVybiBudWxsIT10JiZQTHQodC5sZW5ndGgpJiYhTEx0KHQpfSxSTHQ9X0x0LE9MdD1BTHQsekx0PU5MdCxETHQ9ZnVuY3Rpb24gQkx0KHQpe3JldHVybiB6THQodCk/Ukx0KHQpOk9MdCh0KX0sSEx0PU5rdCxGTHQ9REx0LFZMdD1wQXQsVUx0PWJMdCxqTHQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxHTHQ9X0x0LFdMdD1OTHQscUx0PWZ1bmN0aW9uIFlMdCh0KXtyZXR1cm4gV0x0KHQpP0dMdCh0LCEwKTooZnVuY3Rpb24gZSh0KXtpZighVkx0KHQpKXJldHVybihmdW5jdGlvbiBlKHQpe3ZhciBlPVtdO2lmKG51bGwhPXQpZm9yKHZhciBuIGluIE9iamVjdCh0KSllLnB1c2gobik7cmV0dXJuIGV9KSh0KTt2YXIgbj1VTHQodCksaT1bXTtmb3IodmFyIHIgaW4gdCkoImNvbnN0cnVjdG9yIiE9cnx8IW4mJmpMdC5jYWxsKHQscikpJiZpLnB1c2gocik7cmV0dXJuIGl9KSh0KX0sWEx0PU5rdCwkTHQ9cUx0LEtMdD17ZXhwb3J0czp7fX07IShmdW5jdGlvbih0LGUpe3ZhciBuPWUmJiFlLm5vZGVUeXBlJiZlLGk9biYmdCYmIXQubm9kZVR5cGUmJnQscj1pJiZpLmV4cG9ydHM9PT1uP2lBdC5CdWZmZXI6dm9pZCAwLG89cj9yLmFsbG9jVW5zYWZlOnZvaWQgMDt0LmV4cG9ydHM9ZnVuY3Rpb24gYSh0LGUpe2lmKGUpcmV0dXJuIHQuc2xpY2UoKTt2YXIgbj10Lmxlbmd0aCxpPW8/byhuKTpuZXcgdC5jb25zdHJ1Y3RvcihuKTtyZXR1cm4gdC5jb3B5KGkpLGl9fSkoS0x0LEtMdC5leHBvcnRzKTt2YXIgWkx0PWZ1bmN0aW9uIEpMdCh0LGUpe3ZhciBuPS0xLGk9dC5sZW5ndGg7Zm9yKGV8fChlPUFycmF5KGkpKTsrK248aTspZVtuXT10W25dO3JldHVybiBlfSxRTHQ9ZnVuY3Rpb24gdFB0KHQsZSl7Zm9yKHZhciBuPS0xLGk9bnVsbD09dD8wOnQubGVuZ3RoLHI9MCxvPVtdOysrbjxpOyl7dmFyIGE9dFtuXTtlKGEsbix0KSYmKG9bcisrXT1hKX1yZXR1cm4gb30sZVB0PWZ1bmN0aW9uIG5QdCgpe3JldHVybltdfSxpUHQ9UUx0LHJQdD1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLG9QdD1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLGFQdD1vUHQ/ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106KHQ9T2JqZWN0KHQpLGlQdChvUHQodCksKGZ1bmN0aW9uKGUpe3JldHVybiByUHQuY2FsbCh0LGUpfSkpKX06ZVB0LHNQdD1Oa3QsbFB0PWFQdCxjUHQ9ZnVuY3Rpb24gdVB0KHQsZSl7Zm9yKHZhciBuPS0xLGk9ZS5sZW5ndGgscj10Lmxlbmd0aDsrK248aTspdFtyK25dPWVbbl07cmV0dXJuIHR9LGhQdD13THQoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCksZFB0PWNQdCxwUHQ9aFB0LGZQdD1hUHQsbVB0PU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM/ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdO3Q7KWRQdChlLGZQdCh0KSksdD1wUHQodCk7cmV0dXJuIGV9OmVQdCxnUHQ9Tmt0LF9QdD1tUHQseVB0PWNQdCx2UHQ9V2t0LGJQdD1mdW5jdGlvbiB4UHQodCxlLG4pe3ZhciBpPWUodCk7cmV0dXJuIHZQdCh0KT9pOnlQdChpLG4odCkpfSx3UHQ9YlB0LFNQdD1hUHQsTVB0PURMdCxFUHQ9ZnVuY3Rpb24gVFB0KHQpe3JldHVybiB3UHQodCxNUHQsU1B0KX0sQ1B0PWJQdCxBUHQ9bVB0LGtQdD1xTHQsTFB0PWtBdChpQXQsIkRhdGFWaWV3IiksUFB0PWtBdChpQXQsIlByb21pc2UiKSxOUHQ9a0F0KGlBdCwiU2V0IiksSVB0PUxQdCxSUHQ9UEF0LE9QdD1QUHQselB0PU5QdCxEUHQ9a0F0KGlBdCwiV2Vha01hcCIpLEJQdD1oQXQsSFB0PXdBdCxGUHQ9IltvYmplY3QgTWFwXSIsVlB0PSJbb2JqZWN0IFByb21pc2VdIixVUHQ9IltvYmplY3QgU2V0XSIsalB0PSJbb2JqZWN0IFdlYWtNYXBdIixHUHQ9IltvYmplY3QgRGF0YVZpZXddIixXUHQ9SFB0KElQdCkscVB0PUhQdChSUHQpLFlQdD1IUHQoT1B0KSxYUHQ9SFB0KHpQdCksJFB0PUhQdChEUHQpLEtQdD1CUHQ7KElQdCYmS1B0KG5ldyBJUHQobmV3IEFycmF5QnVmZmVyKDEpKSkhPUdQdHx8UlB0JiZLUHQobmV3IFJQdCkhPUZQdHx8T1B0JiZLUHQoT1B0LnJlc29sdmUoKSkhPVZQdHx8elB0JiZLUHQobmV3IHpQdCkhPVVQdHx8RFB0JiZLUHQobmV3IERQdCkhPWpQdCkmJihLUHQ9ZnVuY3Rpb24odCl7dmFyIGU9QlB0KHQpLG49IltvYmplY3QgT2JqZWN0XSI9PWU/dC5jb25zdHJ1Y3Rvcjp2b2lkIDAsaT1uP0hQdChuKToiIjtpZihpKXN3aXRjaChpKXtjYXNlIFdQdDpyZXR1cm4gR1B0O2Nhc2UgcVB0OnJldHVybiBGUHQ7Y2FzZSBZUHQ6cmV0dXJuIFZQdDtjYXNlIFhQdDpyZXR1cm4gVVB0O2Nhc2UgJFB0OnJldHVybiBqUHR9cmV0dXJuIGV9KTt2YXIgWlB0PUtQdCxKUHQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxRUHQ9aUF0LlVpbnQ4QXJyYXksdE50PVFQdCxlTnQ9ZnVuY3Rpb24gbk50KHQpe3ZhciBlPW5ldyB0LmNvbnN0cnVjdG9yKHQuYnl0ZUxlbmd0aCk7cmV0dXJuIG5ldyB0TnQoZSkuc2V0KG5ldyB0TnQodCkpLGV9LGlOdD1lTnQsck50PS9cdyokLyxvTnQ9ckF0P3JBdC5wcm90b3R5cGU6dm9pZCAwLGFOdD1vTnQ/b050LnZhbHVlT2Y6dm9pZCAwLHNOdD1lTnQsbE50PWZ1bmN0aW9uIGNOdCh0LGUpe3ZhciBuPWU/c050KHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3Iobix0LmJ5dGVPZmZzZXQsdC5sZW5ndGgpfSx1TnQ9ZU50LGhOdD1sTnQsZE50PXBBdCxwTnQ9T2JqZWN0LmNyZWF0ZSxmTnQ9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gZnVuY3Rpb24oZSl7aWYoIWROdChlKSlyZXR1cm57fTtpZihwTnQpcmV0dXJuIHBOdChlKTt0LnByb3RvdHlwZT1lO3ZhciBuPW5ldyB0O3JldHVybiB0LnByb3RvdHlwZT12b2lkIDAsbn19KSgpLG1OdD1mTnQsZ050PWhQdCxfTnQ9Ykx0LHlOdD1mdW5jdGlvbiB2TnQodCl7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQuY29uc3RydWN0b3J8fF9OdCh0KT97fTptTnQoZ050KHQpKX0sYk50PVpQdCx4TnQ9Umt0LHdOdD1hTHQuZXhwb3J0cyxTTnQ9d050JiZ3TnQuaXNNYXAsTU50PVNOdD9yTHQoU050KTpmdW5jdGlvbiBFTnQodCl7cmV0dXJuIHhOdCh0KSYmIltvYmplY3QgTWFwXSI9PWJOdCh0KX0sVE50PVpQdCxDTnQ9Umt0LEFOdD1hTHQuZXhwb3J0cyxrTnQ9QU50JiZBTnQuaXNTZXQsTE50PWtOdD9yTHQoa050KTpmdW5jdGlvbiBQTnQodCl7cmV0dXJuIENOdCh0KSYmIltvYmplY3QgU2V0XSI9PVROdCh0KX0sTk50PV9rdCxJTnQ9eWt0LFJOdD1Ba3QsT050PUtMdC5leHBvcnRzLHpOdD1aTHQsRE50PUVQdCxCTnQ9ZnVuY3Rpb24gSE50KHQpe3JldHVybiBDUHQodCxrUHQsQVB0KX0sRk50PVpQdCxWTnQ9eU50LFVOdD1Xa3Qsak50PXFrdC5leHBvcnRzLEdOdD1NTnQsV050PXBBdCxxTnQ9TE50LFlOdD1ETHQsWE50PXFMdCwkTnQ9IltvYmplY3QgQXJndW1lbnRzXSIsS050PSJbb2JqZWN0IEZ1bmN0aW9uXSIsWk50PSJbb2JqZWN0IE9iamVjdF0iLEpOdD17fTtKTnRbJE50XT1KTnRbIltvYmplY3QgQXJyYXldIl09Sk50WyJbb2JqZWN0IEFycmF5QnVmZmVyXSJdPUpOdFsiW29iamVjdCBEYXRhVmlld10iXT1KTnRbIltvYmplY3QgQm9vbGVhbl0iXT1KTnRbIltvYmplY3QgRGF0ZV0iXT1KTnRbIltvYmplY3QgRmxvYXQzMkFycmF5XSJdPUpOdFsiW29iamVjdCBGbG9hdDY0QXJyYXldIl09Sk50WyJbb2JqZWN0IEludDhBcnJheV0iXT1KTnRbIltvYmplY3QgSW50MTZBcnJheV0iXT1KTnRbIltvYmplY3QgSW50MzJBcnJheV0iXT1KTnRbIltvYmplY3QgTWFwXSJdPUpOdFsiW29iamVjdCBOdW1iZXJdIl09Sk50W1pOdF09Sk50WyJbb2JqZWN0IFJlZ0V4cF0iXT1KTnRbIltvYmplY3QgU2V0XSJdPUpOdFsiW29iamVjdCBTdHJpbmddIl09Sk50WyJbb2JqZWN0IFN5bWJvbF0iXT1KTnRbIltvYmplY3QgVWludDhBcnJheV0iXT1KTnRbIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIl09Sk50WyJbb2JqZWN0IFVpbnQxNkFycmF5XSJdPUpOdFsiW29iamVjdCBVaW50MzJBcnJheV0iXT0hMCxKTnRbIltvYmplY3QgRXJyb3JdIl09Sk50W0tOdF09Sk50WyJbb2JqZWN0IFdlYWtNYXBdIl09ITE7dmFyIFFOdD1mdW5jdGlvbiB0KGUsbixpLHIsbyxhKXt2YXIgcyxsPTEmbixjPTImbix1PTQmbjtpZihpJiYocz1vP2koZSxyLG8sYSk6aShlKSksdm9pZCAwIT09cylyZXR1cm4gcztpZighV050KGUpKXJldHVybiBlO3ZhciBoPVVOdChlKTtpZihoKXtpZihzPShmdW5jdGlvbiBkKHQpe3ZhciBlPXQubGVuZ3RoLG49bmV3IHQuY29uc3RydWN0b3IoZSk7cmV0dXJuIGUmJiJzdHJpbmciPT10eXBlb2YgdFswXSYmSlB0LmNhbGwodCwiaW5kZXgiKSYmKG4uaW5kZXg9dC5pbmRleCxuLmlucHV0PXQuaW5wdXQpLG59KShlKSwhbClyZXR1cm4gek50KGUscyl9ZWxzZXt2YXIgcD1GTnQoZSksZj1wPT1LTnR8fCJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSI9PXA7aWYoak50KGUpKXJldHVybiBPTnQoZSxsKTtpZihwPT1aTnR8fHA9PSROdHx8ZiYmIW8pe2lmKHM9Y3x8Zj97fTpWTnQoZSksIWwpcmV0dXJuIGM/KGZ1bmN0aW9uIGcodCxlKXtyZXR1cm4gZ1B0KHQsX1B0KHQpLGUpfSkoZSwoZnVuY3Rpb24gbSh0LGUpe3JldHVybiB0JiZYTHQoZSwkTHQoZSksdCl9KShzLGUpKTooZnVuY3Rpb24geSh0LGUpe3JldHVybiBzUHQodCxsUHQodCksZSl9KShlLChmdW5jdGlvbiBfKHQsZSl7cmV0dXJuIHQmJkhMdChlLEZMdChlKSx0KX0pKHMsZSkpfWVsc2V7aWYoIUpOdFtwXSlyZXR1cm4gbz9lOnt9O3M9KGZ1bmN0aW9uIHYodCxlLG4pe3ZhciBpPXQuY29uc3RydWN0b3I7c3dpdGNoKGUpe2Nhc2UiW29iamVjdCBBcnJheUJ1ZmZlcl0iOnJldHVybiB1TnQodCk7Y2FzZSJbb2JqZWN0IEJvb2xlYW5dIjpjYXNlIltvYmplY3QgRGF0ZV0iOnJldHVybiBuZXcgaSgrdCk7Y2FzZSJbb2JqZWN0IERhdGFWaWV3XSI6cmV0dXJuKGZ1bmN0aW9uIHIodCxlKXt2YXIgbj1lP2lOdCh0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKG4sdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aCl9KSh0LG4pO2Nhc2UiW29iamVjdCBGbG9hdDMyQXJyYXldIjpjYXNlIltvYmplY3QgRmxvYXQ2NEFycmF5XSI6Y2FzZSJbb2JqZWN0IEludDhBcnJheV0iOmNhc2UiW29iamVjdCBJbnQxNkFycmF5XSI6Y2FzZSJbb2JqZWN0IEludDMyQXJyYXldIjpjYXNlIltvYmplY3QgVWludDhBcnJheV0iOmNhc2UiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iOmNhc2UiW29iamVjdCBVaW50MTZBcnJheV0iOmNhc2UiW29iamVjdCBVaW50MzJBcnJheV0iOnJldHVybiBoTnQodCxuKTtjYXNlIltvYmplY3QgTWFwXSI6cmV0dXJuIG5ldyBpO2Nhc2UiW29iamVjdCBOdW1iZXJdIjpjYXNlIltvYmplY3QgU3RyaW5nXSI6cmV0dXJuIG5ldyBpKHQpO2Nhc2UiW29iamVjdCBSZWdFeHBdIjpyZXR1cm4oZnVuY3Rpb24gbyh0KXt2YXIgZT1uZXcgdC5jb25zdHJ1Y3Rvcih0LnNvdXJjZSxyTnQuZXhlYyh0KSk7cmV0dXJuIGUubGFzdEluZGV4PXQubGFzdEluZGV4LGV9KSh0KTtjYXNlIltvYmplY3QgU2V0XSI6cmV0dXJuIG5ldyBpO2Nhc2UiW29iamVjdCBTeW1ib2xdIjpyZXR1cm4oZnVuY3Rpb24gYSh0KXtyZXR1cm4gYU50P09iamVjdChhTnQuY2FsbCh0KSk6e319KSh0KX19KShlLHAsbCl9fWF8fChhPW5ldyBOTnQpO3ZhciBiPWEuZ2V0KGUpO2lmKGIpcmV0dXJuIGI7YS5zZXQoZSxzKSxxTnQoZSk/ZS5mb3JFYWNoKChmdW5jdGlvbihyKXtzLmFkZCh0KHIsbixpLHIsZSxhKSl9KSk6R050KGUpJiZlLmZvckVhY2goKGZ1bmN0aW9uKHIsbyl7cy5zZXQobyx0KHIsbixpLG8sZSxhKSl9KSk7dmFyIHg9aD92b2lkIDA6KHU/Yz9CTnQ6RE50OmM/WE50OllOdCkoZSk7cmV0dXJuIElOdCh4fHxlLChmdW5jdGlvbihyLG8pe3gmJihyPWVbbz1yXSksUk50KHMsbyx0KHIsbixpLG8sZSxhKSl9KSksc30sdEl0PVFOdCxlSXQ9ZnVuY3Rpb24gbkl0KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0saUl0PShmdW5jdGlvbiBySXQodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixpKXtmb3IodmFyIHI9LTEsbz1PYmplY3QoZSksYT1pKGUpLHM9YS5sZW5ndGg7cy0tOyl7dmFyIGw9YVt0P3M6KytyXTtpZighMT09PW4ob1tsXSxsLG8pKWJyZWFrfXJldHVybiBlfX0pKCksb0l0PWlJdCxhSXQ9REx0LHNJdD1mdW5jdGlvbiBsSXQodCxlKXtyZXR1cm4gdCYmb0l0KHQsZSxhSXQpfSxjSXQ9Tkx0LHVJdD0oZnVuY3Rpb24gaEl0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSl7aWYobnVsbD09bilyZXR1cm4gbjtpZighY0l0KG4pKXJldHVybiB0KG4saSk7Zm9yKHZhciByPW4ubGVuZ3RoLG89ZT9yOi0xLGE9T2JqZWN0KG4pOyhlP28tLTorK288cikmJiExIT09aShhW29dLG8sYSk7KTtyZXR1cm4gbn19KShzSXQpLGRJdD1mdW5jdGlvbiBwSXQodCl7cmV0dXJuIHR9LGZJdD1kSXQsbUl0PWZ1bmN0aW9uIGdJdCh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OmZJdH0sX0l0PXlrdCx5SXQ9dUl0LHZJdD1tSXQsYkl0PVdrdCx4SXQ9ZnVuY3Rpb24gd0l0KHQsZSl7cmV0dXJuKGJJdCh0KT9fSXQ6eUl0KSh0LHZJdChlKSl9LFNJdD14SXQsTUl0PXVJdCxFSXQ9YWt0O2Z1bmN0aW9uIFRJdCh0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgRUl0OysrZTxuOyl0aGlzLmFkZCh0W2VdKX1USXQucHJvdG90eXBlLmFkZD1USXQucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24gQ0l0KHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLnNldCh0LCJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIiksdGhpc30sVEl0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24gQUl0KHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX07dmFyIGtJdD1USXQsTEl0PWZ1bmN0aW9uIFBJdCh0LGUpe3JldHVybiB0LmhhcyhlKX0sTkl0PWtJdCxJSXQ9ZnVuY3Rpb24gUkl0KHQsZSl7Zm9yKHZhciBuPS0xLGk9bnVsbD09dD8wOnQubGVuZ3RoOysrbjxpOylpZihlKHRbbl0sbix0KSlyZXR1cm4hMDtyZXR1cm4hMX0sT0l0PUxJdCx6SXQ9ZnVuY3Rpb24gREl0KHQsZSxuLGkscixvKXt2YXIgYT0xJm4scz10Lmxlbmd0aCxsPWUubGVuZ3RoO2lmKHMhPWwmJiEoYSYmbD5zKSlyZXR1cm4hMTt2YXIgYz1vLmdldCh0KSx1PW8uZ2V0KGUpO2lmKGMmJnUpcmV0dXJuIGM9PWUmJnU9PXQ7dmFyIGg9LTEsZD0hMCxwPTImbj9uZXcgTkl0OnZvaWQgMDtmb3Ioby5zZXQodCxlKSxvLnNldChlLHQpOysraDxzOyl7dmFyIGY9dFtoXSxtPWVbaF07aWYoaSl2YXIgZz1hP2kobSxmLGgsZSx0LG8pOmkoZixtLGgsdCxlLG8pO2lmKHZvaWQgMCE9PWcpe2lmKGcpY29udGludWU7ZD0hMTticmVha31pZihwKXtpZighSUl0KGUsKGZ1bmN0aW9uKHQsZSl7aWYoIU9JdChwLGUpJiYoZj09PXR8fHIoZix0LG4saSxvKSkpcmV0dXJuIHAucHVzaChlKX0pKSl7ZD0hMTticmVha319ZWxzZSBpZihmIT09bSYmIXIoZixtLG4saSxvKSl7ZD0hMTticmVha319cmV0dXJuIG8uZGVsZXRlKHQpLG8uZGVsZXRlKGUpLGR9LEJJdD1mdW5jdGlvbiBISXQodCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe25bKytlXT10fSkpLG59LEZJdD1RUHQsVkl0PXpDdCxVSXQ9ekl0LGpJdD1mdW5jdGlvbiBHSXQodCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQsaSl7blsrK2VdPVtpLHRdfSkpLG59LFdJdD1CSXQscUl0PXJBdD9yQXQucHJvdG90eXBlOnZvaWQgMCxZSXQ9cUl0P3FJdC52YWx1ZU9mOnZvaWQgMCxYSXQ9RVB0LCRJdD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEtJdD1fa3QsWkl0PXpJdCxKSXQ9WlB0LFFJdD1Xa3QsdFJ0PXFrdC5leHBvcnRzLGVSdD1jTHQsblJ0PSJbb2JqZWN0IEFyZ3VtZW50c10iLGlSdD0iW29iamVjdCBBcnJheV0iLHJSdD0iW29iamVjdCBPYmplY3RdIixvUnQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxhUnQ9Umt0LHNSdD1mdW5jdGlvbiB0KGUsbixpLHIsbyl7cmV0dXJuIGU9PT1ufHwobnVsbD09ZXx8bnVsbD09bnx8IWFSdChlKSYmIWFSdChuKT9lIT1lJiZuIT1uOihmdW5jdGlvbiBhKHQsZSxuLGkscixvKXt2YXIgYT1RSXQodCkscz1RSXQoZSksbD1hP2lSdDpKSXQodCksYz1zP2lSdDpKSXQoZSksdT0obD1sPT1uUnQ/clJ0OmwpPT1yUnQsaD0oYz1jPT1uUnQ/clJ0OmMpPT1yUnQsZD1sPT1jO2lmKGQmJnRSdCh0KSl7aWYoIXRSdChlKSlyZXR1cm4hMTthPSEwLHU9ITF9aWYoZCYmIXUpcmV0dXJuIG98fChvPW5ldyBLSXQpLGF8fGVSdCh0KT9aSXQodCxlLG4saSxyLG8pOihmdW5jdGlvbiBwKHQsZSxuLGkscixvLGEpe3N3aXRjaChuKXtjYXNlIltvYmplY3QgRGF0YVZpZXddIjppZih0LmJ5dGVMZW5ndGghPWUuYnl0ZUxlbmd0aHx8dC5ieXRlT2Zmc2V0IT1lLmJ5dGVPZmZzZXQpcmV0dXJuITE7dD10LmJ1ZmZlcixlPWUuYnVmZmVyO2Nhc2UiW29iamVjdCBBcnJheUJ1ZmZlcl0iOnJldHVybiEodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fCFvKG5ldyBGSXQodCksbmV3IEZJdChlKSkpO2Nhc2UiW29iamVjdCBCb29sZWFuXSI6Y2FzZSJbb2JqZWN0IERhdGVdIjpjYXNlIltvYmplY3QgTnVtYmVyXSI6cmV0dXJuIFZJdCgrdCwrZSk7Y2FzZSJbb2JqZWN0IEVycm9yXSI6cmV0dXJuIHQubmFtZT09ZS5uYW1lJiZ0Lm1lc3NhZ2U9PWUubWVzc2FnZTtjYXNlIltvYmplY3QgUmVnRXhwXSI6Y2FzZSJbb2JqZWN0IFN0cmluZ10iOnJldHVybiB0PT1lKyIiO2Nhc2UiW29iamVjdCBNYXBdIjp2YXIgcz1qSXQ7Y2FzZSJbb2JqZWN0IFNldF0iOmlmKHN8fChzPVdJdCksdC5zaXplIT1lLnNpemUmJiEoMSZpKSlyZXR1cm4hMTt2YXIgbD1hLmdldCh0KTtpZihsKXJldHVybiBsPT1lO2l8PTIsYS5zZXQodCxlKTt2YXIgYz1VSXQocyh0KSxzKGUpLGkscixvLGEpO3JldHVybiBhLmRlbGV0ZSh0KSxjO2Nhc2UiW29iamVjdCBTeW1ib2xdIjppZihZSXQpcmV0dXJuIFlJdC5jYWxsKHQpPT1ZSXQuY2FsbChlKX1yZXR1cm4hMX0pKHQsZSxsLG4saSxyLG8pO2lmKCEoMSZuKSl7dmFyIGY9dSYmb1J0LmNhbGwodCwiX193cmFwcGVkX18iKSxtPWgmJm9SdC5jYWxsKGUsIl9fd3JhcHBlZF9fIik7aWYoZnx8bSl7dmFyIGc9Zj90LnZhbHVlKCk6dCxfPW0/ZS52YWx1ZSgpOmU7cmV0dXJuIG98fChvPW5ldyBLSXQpLHIoZyxfLG4saSxvKX19cmV0dXJuISFkJiYob3x8KG89bmV3IEtJdCksKGZ1bmN0aW9uIHkodCxlLG4saSxyLG8pe3ZhciBhPTEmbixzPVhJdCh0KSxsPXMubGVuZ3RoO2lmKGwhPVhJdChlKS5sZW5ndGgmJiFhKXJldHVybiExO2Zvcih2YXIgYz1sO2MtLTspe3ZhciB1PXNbY107aWYoIShhP3UgaW4gZTokSXQuY2FsbChlLHUpKSlyZXR1cm4hMX12YXIgaD1vLmdldCh0KSxkPW8uZ2V0KGUpO2lmKGgmJmQpcmV0dXJuIGg9PWUmJmQ9PXQ7dmFyIHA9ITA7by5zZXQodCxlKSxvLnNldChlLHQpO2Zvcih2YXIgZj1hOysrYzxsOyl7dmFyIG09dFt1PXNbY11dLGc9ZVt1XTtpZihpKXZhciBfPWE/aShnLG0sdSxlLHQsbyk6aShtLGcsdSx0LGUsbyk7aWYoISh2b2lkIDA9PT1fP209PT1nfHxyKG0sZyxuLGksbyk6Xykpe3A9ITE7YnJlYWt9Znx8KGY9ImNvbnN0cnVjdG9yIj09dSl9aWYocCYmIWYpe3ZhciB5PXQuY29uc3RydWN0b3Isdj1lLmNvbnN0cnVjdG9yO3k9PXZ8fCEoImNvbnN0cnVjdG9yImluIHQpfHwhKCJjb25zdHJ1Y3RvciJpbiBlKXx8ImZ1bmN0aW9uIj09dHlwZW9mIHkmJnkgaW5zdGFuY2VvZiB5JiYiZnVuY3Rpb24iPT10eXBlb2YgdiYmdiBpbnN0YW5jZW9mIHZ8fChwPSExKX1yZXR1cm4gby5kZWxldGUodCksby5kZWxldGUoZSkscH0pKHQsZSxuLGkscixvKSl9KShlLG4saSxyLHQsbykpfSxsUnQ9X2t0LGNSdD1zUnQsdVJ0PXBBdCxoUnQ9ZnVuY3Rpb24gZFJ0KHQpe3JldHVybiB0PT10JiYhdVJ0KHQpfSxwUnQ9aFJ0LGZSdD1ETHQsbVJ0PWZ1bmN0aW9uIGdSdCh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbnVsbCE9biYmblt0XT09PWUmJih2b2lkIDAhPT1lfHx0IGluIE9iamVjdChuKSl9fSxfUnQ9bVJ0LHlSdD1oQXQsdlJ0PVJrdCxiUnQ9ZnVuY3Rpb24geFJ0KHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdHx8dlJ0KHQpJiYiW29iamVjdCBTeW1ib2xdIj09eVJ0KHQpfSx3UnQ9V2t0LFNSdD1iUnQsTVJ0PS9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLEVSdD0vXlx3KiQvLFRSdD1mdW5jdGlvbiBDUnQodCxlKXtpZih3UnQodCkpcmV0dXJuITE7dmFyIG49dHlwZW9mIHQ7cmV0dXJuISgibnVtYmVyIiE9biYmInN5bWJvbCIhPW4mJiJib29sZWFuIiE9biYmbnVsbCE9dCYmIVNSdCh0KSl8fEVSdC50ZXN0KHQpfHwhTVJ0LnRlc3QodCl8fG51bGwhPWUmJnQgaW4gT2JqZWN0KGUpfSxBUnQ9YWt0O2Z1bmN0aW9uIGtSdCh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0fHxudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBhIGZ1bmN0aW9uIik7dmFyIG49ZnVuY3Rpb24oKXt2YXIgaT1hcmd1bWVudHMscj1lP2UuYXBwbHkodGhpcyxpKTppWzBdLG89bi5jYWNoZTtpZihvLmhhcyhyKSlyZXR1cm4gby5nZXQocik7dmFyIGE9dC5hcHBseSh0aGlzLGkpO3JldHVybiBuLmNhY2hlPW8uc2V0KHIsYSl8fG8sYX07cmV0dXJuIG4uY2FjaGU9bmV3KGtSdC5DYWNoZXx8QVJ0KSxufWtSdC5DYWNoZT1BUnQ7dmFyIExSdCxQUnQ9a1J0LE5SdD0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxJUnQ9L1xcKFxcKT8vZyxSUnQ9KGZ1bmN0aW9uIE9SdCh0KXt2YXIgZT1QUnQodCwoZnVuY3Rpb24odCl7cmV0dXJuIDUwMD09PW4uc2l6ZSYmbi5jbGVhcigpLHR9KSksbj1lLmNhY2hlO3JldHVybiBlfSkoKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKCIiKSx0LnJlcGxhY2UoTlJ0LChmdW5jdGlvbih0LG4saSxyKXtlLnB1c2goaT9yLnJlcGxhY2UoSVJ0LCIkMSIpOm58fHQpfSkpLGV9KSkselJ0PWZ1bmN0aW9uIERSdCh0LGUpe2Zvcih2YXIgbj0tMSxpPW51bGw9PXQ/MDp0Lmxlbmd0aCxyPUFycmF5KGkpOysrbjxpOylyW25dPWUodFtuXSxuLHQpO3JldHVybiByfSxCUnQ9elJ0LEhSdD1Xa3QsRlJ0PWJSdCxWUnQ9ckF0P3JBdC5wcm90b3R5cGU6dm9pZCAwLFVSdD1WUnQ/VlJ0LnRvU3RyaW5nOnZvaWQgMCxqUnQ9ZnVuY3Rpb24gdChlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIGU7aWYoSFJ0KGUpKXJldHVybiBCUnQoZSx0KSsiIjtpZihGUnQoZSkpcmV0dXJuIFVSdD9VUnQuY2FsbChlKToiIjt2YXIgbj1lKyIiO3JldHVybiIwIj09biYmMS9lPT0tMS8wPyItMCI6bn0sR1J0PWZ1bmN0aW9uIFdSdCh0KXtyZXR1cm4gbnVsbD09dD8iIjpqUnQodCl9LHFSdD1Xa3QsWVJ0PVRSdCxYUnQ9UlJ0LCRSdD1HUnQsS1J0PWZ1bmN0aW9uIFpSdCh0LGUpe3JldHVybiBxUnQodCk/dDpZUnQodCxlKT9bdF06WFJ0KCRSdCh0KSl9LEpSdD1iUnQsUVJ0PWZ1bmN0aW9uIHRPdCh0KXtpZigic3RyaW5nIj09dHlwZW9mIHR8fEpSdCh0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0tMS8wPyItMCI6ZX0sZU90PUtSdCxuT3Q9UVJ0LGlPdD1mdW5jdGlvbiByT3QodCxlKXtmb3IodmFyIG49MCxpPShlPWVPdChlLHQpKS5sZW5ndGg7bnVsbCE9dCYmbjxpOyl0PXRbbk90KGVbbisrXSldO3JldHVybiBuJiZuPT1pP3Q6dm9pZCAwfSxvT3Q9aU90LGFPdD1LUnQsc090PUdrdCxsT3Q9V2t0LGNPdD1La3QsdU90PUprdCxoT3Q9UVJ0LGRPdD1mdW5jdGlvbiBwT3QodCxlLG4pe2Zvcih2YXIgaT0tMSxyPShlPWFPdChlLHQpKS5sZW5ndGgsbz0hMTsrK2k8cjspe3ZhciBhPWhPdChlW2ldKTtpZighKG89bnVsbCE9dCYmbih0LGEpKSlicmVhazt0PXRbYV19cmV0dXJuIG98fCsraSE9cj9vOiEhKHI9bnVsbD09dD8wOnQubGVuZ3RoKSYmdU90KHIpJiZjT3QoYSxyKSYmKGxPdCh0KXx8c090KHQpKX0sZk90PWZ1bmN0aW9uIG1PdCh0LGUpe3JldHVybiBudWxsIT10JiZlIGluIE9iamVjdCh0KX0sZ090PWRPdCxfT3Q9ZnVuY3Rpb24geU90KHQsZSl7cmV0dXJuIG51bGwhPXQmJmdPdCh0LGUsZk90KX0sdk90PXNSdCxiT3Q9X090LHhPdD1UUnQsd090PWhSdCxTT3Q9bVJ0LE1PdD1RUnQsRU90PWZ1bmN0aW9uIFRPdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/dm9pZCAwOmVbdF19fSxDT3Q9aU90LEFPdD1FT3Qsa090PVRSdCxMT3Q9UVJ0LFBPdD1kSXQsTk90PVdrdCxJT3Q9ZnVuY3Rpb24gUk90KHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bnVsbD09dD9QT3Q6Im9iamVjdCI9PXR5cGVvZiB0P05PdCh0KT8oZnVuY3Rpb24gZSh0LG4pe3JldHVybiB4T3QodCkmJndPdChuKT9TT3QoTU90KHQpLG4pOmZ1bmN0aW9uKGUpe3ZhciBpPShmdW5jdGlvbiByKHQsZSxuKXt2YXIgaT1udWxsPT10P3ZvaWQgMDpvT3QodCxlKTtyZXR1cm4gdm9pZCAwPT09aT9uOml9KShlLHQpO3JldHVybiB2b2lkIDA9PT1pJiZpPT09bj9iT3QoZSx0KTp2T3QobixpLDMpfX0pKHRbMF0sdFsxXSk6KGZ1bmN0aW9uIG4odCl7dmFyIGU9KGZ1bmN0aW9uIG4odCl7Zm9yKHZhciBlPWZSdCh0KSxuPWUubGVuZ3RoO24tLTspe3ZhciBpPWVbbl0scj10W2ldO2Vbbl09W2kscixwUnQocildfXJldHVybiBlfSkodCk7cmV0dXJuIDE9PWUubGVuZ3RoJiZlWzBdWzJdP19SdChlWzBdWzBdLGVbMF1bMV0pOmZ1bmN0aW9uKG4pe3JldHVybiBuPT09dHx8KGZ1bmN0aW9uIGkodCxlLG4scil7dmFyIG89bi5sZW5ndGgsYT1vLHM9IXI7aWYobnVsbD09dClyZXR1cm4hYTtmb3IodD1PYmplY3QodCk7by0tOyl7dmFyIGw9bltvXTtpZihzJiZsWzJdP2xbMV0hPT10W2xbMF1dOiEobFswXWluIHQpKXJldHVybiExfWZvcig7KytvPGE7KXt2YXIgYz0obD1uW29dKVswXSx1PXRbY10saD1sWzFdO2lmKHMmJmxbMl0pe2lmKHZvaWQgMD09PXUmJiEoYyBpbiB0KSlyZXR1cm4hMX1lbHNle3ZhciBkPW5ldyBsUnQ7aWYocil2YXIgcD1yKHUsaCxjLHQsZSxkKTtpZighKHZvaWQgMD09PXA/Y1J0KGgsdSwzLHIsZCk6cCkpcmV0dXJuITF9fXJldHVybiEwfSkobix0LGUpfX0pKHQpOihmdW5jdGlvbiBpKHQpe3JldHVybiBrT3QodCk/QU90KExPdCh0KSk6KGZ1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBDT3QoZSx0KX19KSh0KX0pKHQpfSxPT3Q9UUx0LHpPdD1mdW5jdGlvbiBET3QodCxlKXt2YXIgbj1bXTtyZXR1cm4gTUl0KHQsKGZ1bmN0aW9uKHQsaSxyKXtlKHQsaSxyKSYmbi5wdXNoKHQpfSkpLG59LEJPdD1JT3QsSE90PVdrdCxGT3Q9ZnVuY3Rpb24gVk90KHQsZSl7cmV0dXJuKEhPdCh0KT9PT3Q6ek90KSh0LEJPdChlKSl9LFVPdD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGpPdD1mdW5jdGlvbiBHT3QodCxlKXtyZXR1cm4gbnVsbCE9dCYmVU90LmNhbGwodCxlKX0sV090PWRPdCxxT3Q9ZnVuY3Rpb24gWU90KHQsZSl7cmV0dXJuIG51bGwhPXQmJldPdCh0LGUsak90KX0sWE90PUFMdCwkT3Q9WlB0LEtPdD1Ha3QsWk90PVdrdCxKT3Q9Tkx0LFFPdD1xa3QuZXhwb3J0cyx0enQ9Ykx0LGV6dD1jTHQsbnp0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksaXp0PWZ1bmN0aW9uIHJ6dCh0KXtyZXR1cm4gdm9pZCAwPT09dH0sb3p0PXVJdCxhenQ9Tkx0LHN6dD1mdW5jdGlvbiBsenQodCxlKXt2YXIgbj0tMSxpPWF6dCh0KT9BcnJheSh0Lmxlbmd0aCk6W107cmV0dXJuIG96dCh0LChmdW5jdGlvbih0LHIsbyl7aVsrK25dPWUodCxyLG8pfSkpLGl9LGN6dD16UnQsdXp0PUlPdCxoenQ9c3p0LGR6dD1Xa3QscHp0PWZ1bmN0aW9uIGZ6dCh0LGUpe3JldHVybihkenQodCk/Y3p0Omh6dCkodCx1enQoZSkpfSxtenQ9ZnVuY3Rpb24gZ3p0KHQsZSxuLGkpe3ZhciByPS0xLG89bnVsbD09dD8wOnQubGVuZ3RoO2ZvcihpJiZvJiYobj10Wysrcl0pOysrcjxvOyluPWUobix0W3JdLHIsdCk7cmV0dXJuIG59LF96dD11SXQseXp0PUlPdCx2enQ9ZnVuY3Rpb24gYnp0KHQsZSxuLGkscil7cmV0dXJuIHIodCwoZnVuY3Rpb24odCxyLG8pe249aT8oaT0hMSx0KTplKG4sdCxyLG8pfSkpLG59LHh6dD1Xa3Qsd3p0PWZ1bmN0aW9uIFN6dCh0LGUsbil7dmFyIGk9eHp0KHQpP216dDp2enQscj1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIGkodCx5enQoZSksbixyLF96dCl9LE16dD1oQXQsRXp0PVdrdCxUenQ9Umt0LEN6dD1FT3QoImxlbmd0aCIpLEF6dD1SZWdFeHAoIltcXHUyMDBkXFx1ZDgwMC1cXHVkZmZmXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXFx1ZmUwZVxcdWZlMGZdIiksa3p0PSJbXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXSIsTHp0PSJcXHVkODNjW1xcdWRmZmItXFx1ZGZmZl0iLFB6dD0iW15cXHVkODAwLVxcdWRmZmZdIixOenQ9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLEl6dD0iW1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXSIsUnp0PSIoPzoiK2t6dCsifCIrTHp0KyIpPyIsT3p0PSJbXFx1ZmUwZVxcdWZlMGZdPyIsenp0PU96dCtSenQrIig/OlxcdTIwMGQoPzoiK1tQenQsTnp0LEl6dF0uam9pbigifCIpKyIpIitPenQrUnp0KyIpKiIsRHp0PSIoPzoiK1tQenQra3p0KyI/IixrenQsTnp0LEl6dCwiW1xcdWQ4MDAtXFx1ZGZmZl0iXS5qb2luKCJ8IikrIikiLEJ6dD1SZWdFeHAoTHp0KyIoPz0iK0x6dCsiKXwiK0R6dCt6enQsImciKSxIenQ9Q3p0LEZ6dD1BTHQsVnp0PVpQdCxVenQ9Tkx0LGp6dD1mdW5jdGlvbiBHenQodCl7cmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJuIEF6dC50ZXN0KHQpfSkodCk/KGZ1bmN0aW9uIG4odCl7Zm9yKHZhciBlPUJ6dC5sYXN0SW5kZXg9MDtCenQudGVzdCh0KTspKytlO3JldHVybiBlfSkodCk6SHp0KHQpfSxXenQ9eWt0LHF6dD1mTnQsWXp0PXNJdCxYenQ9SU90LCR6dD1oUHQsS3p0PVdrdCxaenQ9cWt0LmV4cG9ydHMsSnp0PV9BdCxRenQ9cEF0LHREdD1jTHQsZUR0PUdrdCxuRHQ9V2t0LGlEdD1yQXQ/ckF0LmlzQ29uY2F0U3ByZWFkYWJsZTp2b2lkIDAsckR0PWNQdCxvRHQ9ZnVuY3Rpb24gYUR0KHQpe3JldHVybiBuRHQodCl8fGVEdCh0KXx8ISEoaUR0JiZ0JiZ0W2lEdF0pfSxzRHQ9ZnVuY3Rpb24gdChlLG4saSxyLG8pe3ZhciBhPS0xLHM9ZS5sZW5ndGg7Zm9yKGl8fChpPW9EdCksb3x8KG89W10pOysrYTxzOyl7dmFyIGw9ZVthXTtuPjAmJmkobCk/bj4xP3QobCxuLTEsaSxyLG8pOnJEdChvLGwpOnJ8fChvW28ubGVuZ3RoXT1sKX1yZXR1cm4gb30sbER0PWZ1bmN0aW9uIGNEdCh0LGUsbil7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHQuY2FsbChlKTtjYXNlIDE6cmV0dXJuIHQuY2FsbChlLG5bMF0pO2Nhc2UgMjpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSxuWzJdKX1yZXR1cm4gdC5hcHBseShlLG4pfSx1RHQ9TWF0aC5tYXgsaER0PWZ1bmN0aW9uIGREdCh0LGUsbil7cmV0dXJuIGU9dUR0KHZvaWQgMD09PWU/dC5sZW5ndGgtMTplLDApLGZ1bmN0aW9uKCl7Zm9yKHZhciBpPWFyZ3VtZW50cyxyPS0xLG89dUR0KGkubGVuZ3RoLWUsMCksYT1BcnJheShvKTsrK3I8bzspYVtyXT1pW2Urcl07cj0tMTtmb3IodmFyIHM9QXJyYXkoZSsxKTsrK3I8ZTspc1tyXT1pW3JdO3JldHVybiBzW2VdPW4oYSksbER0KHQsdGhpcyxzKX19LHBEdD1lSXQsZkR0PXhrdCxtRHQ9RGF0ZS5ub3csZ0R0PShmdW5jdGlvbiBfRHQodCl7dmFyIGU9MCxuPTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9bUR0KCkscj0xNi0oaS1uKTtpZihuPWkscj4wKXtpZigrK2U+PTgwMClyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgZT0wO3JldHVybiB0LmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpfX0pKGZEdD9mdW5jdGlvbih0LGUpe3JldHVybiBmRHQodCwidG9TdHJpbmciLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTpwRHQoZSksd3JpdGFibGU6ITB9KX06ZEl0KSx5RHQ9ZEl0LHZEdD1oRHQsYkR0PWdEdCx4RHQ9ZnVuY3Rpb24gd0R0KHQsZSl7cmV0dXJuIGJEdCh2RHQodCxlLHlEdCksdCsiIil9LFNEdD1mdW5jdGlvbiBNRHQodCxlLG4saSl7Zm9yKHZhciByPXQubGVuZ3RoLG89bisoaT8xOi0xKTtpP28tLTorK288cjspaWYoZSh0W29dLG8sdCkpcmV0dXJuIG87cmV0dXJuLTF9LEVEdD1TRHQsVER0PWZ1bmN0aW9uIENEdCh0KXtyZXR1cm4gdCE9dH0sQUR0PU5QdCxrRHQ9QUR0JiYxL0JJdChuZXcgQUR0KFssLTBdKSlbMV09PTEvMD9mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEFEdCh0KX06ZnVuY3Rpb24gTER0KCl7fSxQRHQ9a0l0LE5EdD1mdW5jdGlvbiBJRHQodCxlKXtyZXR1cm4hKG51bGw9PXR8fCF0Lmxlbmd0aCkmJihmdW5jdGlvbiBuKHQsZSxpKXtyZXR1cm4gZT09ZT8oZnVuY3Rpb24gcih0LGUsbil7Zm9yKHZhciBpPW4tMSxyPXQubGVuZ3RoOysraTxyOylpZih0W2ldPT09ZSlyZXR1cm4gaTtyZXR1cm4tMX0pKHQsZSxpKTpFRHQodCxURHQsaSl9KSh0LGUsMCk+LTF9LFJEdD1mdW5jdGlvbiBPRHQodCxlLG4pe2Zvcih2YXIgaT0tMSxyPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK2k8cjspaWYobihlLHRbaV0pKXJldHVybiEwO3JldHVybiExfSx6RHQ9TEl0LEREdD1rRHQsQkR0PUJJdCxIRHQ9Tkx0LEZEdD1Sa3QsVkR0PWZ1bmN0aW9uIFVEdCh0KXtyZXR1cm4gRkR0KHQpJiZIRHQodCl9LGpEdD1zRHQsR0R0PVZEdCxXRHQ9eER0KChmdW5jdGlvbih0KXtyZXR1cm4oZnVuY3Rpb24gZSh0LG4saSl7dmFyIHI9LTEsbz1ORHQsYT10Lmxlbmd0aCxzPSEwLGw9W10sYz1sO2lmKGkpcz0hMSxvPVJEdDtlbHNlIGlmKGE+PTIwMCl7dmFyIHU9bj9udWxsOkREdCh0KTtpZih1KXJldHVybiBCRHQodSk7cz0hMSxvPXpEdCxjPW5ldyBQRHR9ZWxzZSBjPW4/W106bDt0OmZvcig7KytyPGE7KXt2YXIgaD10W3JdLGQ9bj9uKGgpOmg7aWYoaD1pfHwwIT09aD9oOjAscyYmZD09ZCl7Zm9yKHZhciBwPWMubGVuZ3RoO3AtLTspaWYoY1twXT09PWQpY29udGludWUgdDtuJiZjLnB1c2goZCksbC5wdXNoKGgpfWVsc2UgbyhjLGQsaSl8fChjIT09bCYmYy5wdXNoKGQpLGwucHVzaChoKSl9cmV0dXJuIGx9KShqRHQodCwxLEdEdCwhMCkpfSkpLHFEdD16UnQsWUR0PURMdCxYRHQ9ZnVuY3Rpb24gJER0KHQpe3JldHVybiBudWxsPT10P1tdOihmdW5jdGlvbiBlKHQsbil7cmV0dXJuIHFEdChuLChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pKX0pKHQsWUR0KHQpKX07dHJ5e0xSdD17Y2xvbmU6ZnVuY3Rpb24gS0R0KHQpe3JldHVybiB0SXQodCw0KX0sY29uc3RhbnQ6ZUl0LGVhY2g6U0l0LGZpbHRlcjpGT3QsaGFzOnFPdCxpc0FycmF5OldrdCxpc0VtcHR5OmZ1bmN0aW9uIFpEdCh0KXtpZihudWxsPT10KXJldHVybiEwO2lmKEpPdCh0KSYmKFpPdCh0KXx8InN0cmluZyI9PXR5cGVvZiB0fHwiZnVuY3Rpb24iPT10eXBlb2YgdC5zcGxpY2V8fFFPdCh0KXx8ZXp0KHQpfHxLT3QodCkpKXJldHVybiF0Lmxlbmd0aDt2YXIgZT0kT3QodCk7aWYoIltvYmplY3QgTWFwXSI9PWV8fCJbb2JqZWN0IFNldF0iPT1lKXJldHVybiF0LnNpemU7aWYodHp0KHQpKXJldHVybiFYT3QodCkubGVuZ3RoO2Zvcih2YXIgbiBpbiB0KWlmKG56dC5jYWxsKHQsbikpcmV0dXJuITE7cmV0dXJuITB9LGlzRnVuY3Rpb246X0F0LGlzVW5kZWZpbmVkOml6dCxrZXlzOkRMdCxtYXA6cHp0LHJlZHVjZTp3enQsc2l6ZTpmdW5jdGlvbiBKRHQodCl7aWYobnVsbD09dClyZXR1cm4gMDtpZihVenQodCkpcmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHwhRXp0KHQpJiZUenQodCkmJiJbb2JqZWN0IFN0cmluZ10iPT1NenQodCl9KSh0KT9qenQodCk6dC5sZW5ndGg7dmFyIG49Vnp0KHQpO3JldHVybiJbb2JqZWN0IE1hcF0iPT1ufHwiW29iamVjdCBTZXRdIj09bj90LnNpemU6Rnp0KHQpLmxlbmd0aH0sdHJhbnNmb3JtOmZ1bmN0aW9uIFFEdCh0LGUsbil7dmFyIGk9S3p0KHQpLHI9aXx8Wnp0KHQpfHx0RHQodCk7aWYoZT1YenQoZSksbnVsbD09bil7dmFyIG89dCYmdC5jb25zdHJ1Y3RvcjtuPXI/aT9uZXcgbzpbXTpRenQodCkmJkp6dChvKT9xenQoJHp0KHQpKTp7fX1yZXR1cm4ocj9XenQ6WXp0KSh0LChmdW5jdGlvbih0LGkscil7cmV0dXJuIGUobix0LGkscil9KSksbn0sdW5pb246V0R0LHZhbHVlczpYRHR9fWNhdGNoKHQpe31MUnR8fChMUnQ9d2luZG93Ll8pO3ZhciB0QnQ9TFJ0LGVCdD10QnQsbkJ0PXJCdCxpQnQ9IlwwIjtmdW5jdGlvbiByQnQodCl7dGhpcy5faXNEaXJlY3RlZD0hZUJ0Lmhhcyh0LCJkaXJlY3RlZCIpfHx0LmRpcmVjdGVkLHRoaXMuX2lzTXVsdGlncmFwaD0hIWVCdC5oYXModCwibXVsdGlncmFwaCIpJiZ0Lm11bHRpZ3JhcGgsdGhpcy5faXNDb21wb3VuZD0hIWVCdC5oYXModCwiY29tcG91bmQiKSYmdC5jb21wb3VuZCx0aGlzLl9sYWJlbD12b2lkIDAsdGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuPWVCdC5jb25zdGFudCh2b2lkIDApLHRoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbj1lQnQuY29uc3RhbnQodm9pZCAwKSx0aGlzLl9ub2Rlcz17fSx0aGlzLl9pc0NvbXBvdW5kJiYodGhpcy5fcGFyZW50PXt9LHRoaXMuX2NoaWxkcmVuPXt9LHRoaXMuX2NoaWxkcmVuWyJcMCJdPXt9KSx0aGlzLl9pbj17fSx0aGlzLl9wcmVkcz17fSx0aGlzLl9vdXQ9e30sdGhpcy5fc3Vjcz17fSx0aGlzLl9lZGdlT2Jqcz17fSx0aGlzLl9lZGdlTGFiZWxzPXt9fWZ1bmN0aW9uIG9CdCh0LGUpe3RbZV0/dFtlXSsrOnRbZV09MX1mdW5jdGlvbiBhQnQodCxlKXstLXRbZV18fGRlbGV0ZSB0W2VdfWZ1bmN0aW9uIHNCdCh0LGUsbixpKXt2YXIgcj0iIitlLG89IiIrbjtpZighdCYmcj5vKXt2YXIgYT1yO3I9byxvPWF9cmV0dXJuIHIrIgEiK28rIgEiKyhlQnQuaXNVbmRlZmluZWQoaSk/IlwwIjppKX1mdW5jdGlvbiBsQnQodCxlLG4saSl7dmFyIHI9IiIrZSxvPSIiK247aWYoIXQmJnI+byl7dmFyIGE9cjtyPW8sbz1hfXZhciBzPXt2OnIsdzpvfTtyZXR1cm4gaSYmKHMubmFtZT1pKSxzfWZ1bmN0aW9uIGNCdCh0LGUpe3JldHVybiBzQnQodCxlLnYsZS53LGUubmFtZSl9ckJ0LnByb3RvdHlwZS5fbm9kZUNvdW50PTAsckJ0LnByb3RvdHlwZS5fZWRnZUNvdW50PTAsckJ0LnByb3RvdHlwZS5pc0RpcmVjdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzRGlyZWN0ZWR9LHJCdC5wcm90b3R5cGUuaXNNdWx0aWdyYXBoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzTXVsdGlncmFwaH0sckJ0LnByb3RvdHlwZS5pc0NvbXBvdW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzQ29tcG91bmR9LHJCdC5wcm90b3R5cGUuc2V0R3JhcGg9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2xhYmVsPXQsdGhpc30sckJ0LnByb3RvdHlwZS5ncmFwaD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYWJlbH0sckJ0LnByb3RvdHlwZS5zZXREZWZhdWx0Tm9kZUxhYmVsPWZ1bmN0aW9uKHQpe3JldHVybiBlQnQuaXNGdW5jdGlvbih0KXx8KHQ9ZUJ0LmNvbnN0YW50KHQpKSx0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm49dCx0aGlzfSxyQnQucHJvdG90eXBlLm5vZGVDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2RlQ291bnR9LHJCdC5wcm90b3R5cGUubm9kZXM9ZnVuY3Rpb24oKXtyZXR1cm4gZUJ0LmtleXModGhpcy5fbm9kZXMpfSxyQnQucHJvdG90eXBlLnNvdXJjZXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiBlQnQuZmlsdGVyKHRoaXMubm9kZXMoKSwoZnVuY3Rpb24oZSl7cmV0dXJuIGVCdC5pc0VtcHR5KHQuX2luW2VdKX0pKX0sckJ0LnByb3RvdHlwZS5zaW5rcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIGVCdC5maWx0ZXIodGhpcy5ub2RlcygpLChmdW5jdGlvbihlKXtyZXR1cm4gZUJ0LmlzRW1wdHkodC5fb3V0W2VdKX0pKX0sckJ0LnByb3RvdHlwZS5zZXROb2Rlcz1mdW5jdGlvbih0LGUpe3ZhciBuPWFyZ3VtZW50cyxpPXRoaXM7cmV0dXJuIGVCdC5lYWNoKHQsKGZ1bmN0aW9uKHQpe24ubGVuZ3RoPjE/aS5zZXROb2RlKHQsZSk6aS5zZXROb2RlKHQpfSkpLHRoaXN9LHJCdC5wcm90b3R5cGUuc2V0Tm9kZT1mdW5jdGlvbih0LGUpe3JldHVybiBlQnQuaGFzKHRoaXMuX25vZGVzLHQpPyhhcmd1bWVudHMubGVuZ3RoPjEmJih0aGlzLl9ub2Rlc1t0XT1lKSx0aGlzKToodGhpcy5fbm9kZXNbdF09YXJndW1lbnRzLmxlbmd0aD4xP2U6dGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuKHQpLHRoaXMuX2lzQ29tcG91bmQmJih0aGlzLl9wYXJlbnRbdF09aUJ0LHRoaXMuX2NoaWxkcmVuW3RdPXt9LHRoaXMuX2NoaWxkcmVuWyJcMCJdW3RdPSEwKSx0aGlzLl9pblt0XT17fSx0aGlzLl9wcmVkc1t0XT17fSx0aGlzLl9vdXRbdF09e30sdGhpcy5fc3Vjc1t0XT17fSwrK3RoaXMuX25vZGVDb3VudCx0aGlzKX0sckJ0LnByb3RvdHlwZS5ub2RlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ub2Rlc1t0XX0sckJ0LnByb3RvdHlwZS5oYXNOb2RlPWZ1bmN0aW9uKHQpe3JldHVybiBlQnQuaGFzKHRoaXMuX25vZGVzLHQpfSxyQnQucHJvdG90eXBlLnJlbW92ZU5vZGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZihlQnQuaGFzKHRoaXMuX25vZGVzLHQpKXt2YXIgbj1mdW5jdGlvbih0KXtlLnJlbW92ZUVkZ2UoZS5fZWRnZU9ianNbdF0pfTtkZWxldGUgdGhpcy5fbm9kZXNbdF0sdGhpcy5faXNDb21wb3VuZCYmKHRoaXMuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0KHQpLGRlbGV0ZSB0aGlzLl9wYXJlbnRbdF0sZUJ0LmVhY2godGhpcy5jaGlsZHJlbih0KSwoZnVuY3Rpb24odCl7ZS5zZXRQYXJlbnQodCl9KSksZGVsZXRlIHRoaXMuX2NoaWxkcmVuW3RdKSxlQnQuZWFjaChlQnQua2V5cyh0aGlzLl9pblt0XSksbiksZGVsZXRlIHRoaXMuX2luW3RdLGRlbGV0ZSB0aGlzLl9wcmVkc1t0XSxlQnQuZWFjaChlQnQua2V5cyh0aGlzLl9vdXRbdF0pLG4pLGRlbGV0ZSB0aGlzLl9vdXRbdF0sZGVsZXRlIHRoaXMuX3N1Y3NbdF0sLS10aGlzLl9ub2RlQ291bnR9cmV0dXJuIHRoaXN9LHJCdC5wcm90b3R5cGUuc2V0UGFyZW50PWZ1bmN0aW9uKHQsZSl7aWYoIXRoaXMuX2lzQ29tcG91bmQpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qgc2V0IHBhcmVudCBpbiBhIG5vbi1jb21wb3VuZCBncmFwaCIpO2lmKGVCdC5pc1VuZGVmaW5lZChlKSllPWlCdDtlbHNle2Zvcih2YXIgbj1lKz0iIjshZUJ0LmlzVW5kZWZpbmVkKG4pO249dGhpcy5wYXJlbnQobikpaWYobj09PXQpdGhyb3cgbmV3IEVycm9yKCJTZXR0aW5nICIrZSsiIGFzIHBhcmVudCBvZiAiK3QrIiB3b3VsZCBjcmVhdGUgYSBjeWNsZSIpO3RoaXMuc2V0Tm9kZShlKX1yZXR1cm4gdGhpcy5zZXROb2RlKHQpLHRoaXMuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0KHQpLHRoaXMuX3BhcmVudFt0XT1lLHRoaXMuX2NoaWxkcmVuW2VdW3RdPSEwLHRoaXN9LHJCdC5wcm90b3R5cGUuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0PWZ1bmN0aW9uKHQpe2RlbGV0ZSB0aGlzLl9jaGlsZHJlblt0aGlzLl9wYXJlbnRbdF1dW3RdfSxyQnQucHJvdG90eXBlLnBhcmVudD1mdW5jdGlvbih0KXtpZih0aGlzLl9pc0NvbXBvdW5kKXt2YXIgZT10aGlzLl9wYXJlbnRbdF07aWYoZSE9PWlCdClyZXR1cm4gZX19LHJCdC5wcm90b3R5cGUuY2hpbGRyZW49ZnVuY3Rpb24odCl7aWYoZUJ0LmlzVW5kZWZpbmVkKHQpJiYodD1pQnQpLHRoaXMuX2lzQ29tcG91bmQpe3ZhciBlPXRoaXMuX2NoaWxkcmVuW3RdO2lmKGUpcmV0dXJuIGVCdC5rZXlzKGUpfWVsc2V7aWYodD09PWlCdClyZXR1cm4gdGhpcy5ub2RlcygpO2lmKHRoaXMuaGFzTm9kZSh0KSlyZXR1cm5bXX19LHJCdC5wcm90b3R5cGUucHJlZGVjZXNzb3JzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3ByZWRzW3RdO2lmKGUpcmV0dXJuIGVCdC5rZXlzKGUpfSxyQnQucHJvdG90eXBlLnN1Y2Nlc3NvcnM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fc3Vjc1t0XTtpZihlKXJldHVybiBlQnQua2V5cyhlKX0sckJ0LnByb3RvdHlwZS5uZWlnaGJvcnM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wcmVkZWNlc3NvcnModCk7aWYoZSlyZXR1cm4gZUJ0LnVuaW9uKGUsdGhpcy5zdWNjZXNzb3JzKHQpKX0sckJ0LnByb3RvdHlwZS5pc0xlYWY9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT0odGhpcy5pc0RpcmVjdGVkKCk/dGhpcy5zdWNjZXNzb3JzKHQpOnRoaXMubmVpZ2hib3JzKHQpKS5sZW5ndGh9LHJCdC5wcm90b3R5cGUuZmlsdGVyTm9kZXM9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHRoaXMuY29uc3RydWN0b3Ioe2RpcmVjdGVkOnRoaXMuX2lzRGlyZWN0ZWQsbXVsdGlncmFwaDp0aGlzLl9pc011bHRpZ3JhcGgsY29tcG91bmQ6dGhpcy5faXNDb21wb3VuZH0pO2Uuc2V0R3JhcGgodGhpcy5ncmFwaCgpKTt2YXIgbj10aGlzO2VCdC5lYWNoKHRoaXMuX25vZGVzLChmdW5jdGlvbihuLGkpe3QoaSkmJmUuc2V0Tm9kZShpLG4pfSkpLGVCdC5lYWNoKHRoaXMuX2VkZ2VPYmpzLChmdW5jdGlvbih0KXtlLmhhc05vZGUodC52KSYmZS5oYXNOb2RlKHQudykmJmUuc2V0RWRnZSh0LG4uZWRnZSh0KSl9KSk7dmFyIGk9e307ZnVuY3Rpb24gcih0KXt2YXIgbz1uLnBhcmVudCh0KTtyZXR1cm4gdm9pZCAwPT09b3x8ZS5oYXNOb2RlKG8pPyhpW3RdPW8sbyk6byBpbiBpP2lbb106cihvKX1yZXR1cm4gdGhpcy5faXNDb21wb3VuZCYmZUJ0LmVhY2goZS5ub2RlcygpLChmdW5jdGlvbih0KXtlLnNldFBhcmVudCh0LHIodCkpfSkpLGV9LHJCdC5wcm90b3R5cGUuc2V0RGVmYXVsdEVkZ2VMYWJlbD1mdW5jdGlvbih0KXtyZXR1cm4gZUJ0LmlzRnVuY3Rpb24odCl8fCh0PWVCdC5jb25zdGFudCh0KSksdGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuPXQsdGhpc30sckJ0LnByb3RvdHlwZS5lZGdlQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZUNvdW50fSxyQnQucHJvdG90eXBlLmVkZ2VzPWZ1bmN0aW9uKCl7cmV0dXJuIGVCdC52YWx1ZXModGhpcy5fZWRnZU9ianMpfSxyQnQucHJvdG90eXBlLnNldFBhdGg9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLGk9YXJndW1lbnRzO3JldHVybiBlQnQucmVkdWNlKHQsKGZ1bmN0aW9uKHQscil7cmV0dXJuIGkubGVuZ3RoPjE/bi5zZXRFZGdlKHQscixlKTpuLnNldEVkZ2UodCxyKSxyfSkpLHRoaXN9LHJCdC5wcm90b3R5cGUuc2V0RWRnZT1mdW5jdGlvbigpe3ZhciB0LGUsbixpLHI9ITEsbz1hcmd1bWVudHNbMF07Im9iamVjdCI9PXR5cGVvZiBvJiZudWxsIT09byYmInYiaW4gbz8odD1vLnYsZT1vLncsbj1vLm5hbWUsMj09PWFyZ3VtZW50cy5sZW5ndGgmJihpPWFyZ3VtZW50c1sxXSxyPSEwKSk6KHQ9byxlPWFyZ3VtZW50c1sxXSxuPWFyZ3VtZW50c1szXSxhcmd1bWVudHMubGVuZ3RoPjImJihpPWFyZ3VtZW50c1syXSxyPSEwKSksdD0iIit0LGU9IiIrZSxlQnQuaXNVbmRlZmluZWQobil8fChuPSIiK24pO3ZhciBhPXNCdCh0aGlzLl9pc0RpcmVjdGVkLHQsZSxuKTtpZihlQnQuaGFzKHRoaXMuX2VkZ2VMYWJlbHMsYSkpcmV0dXJuIHImJih0aGlzLl9lZGdlTGFiZWxzW2FdPWkpLHRoaXM7aWYoIWVCdC5pc1VuZGVmaW5lZChuKSYmIXRoaXMuX2lzTXVsdGlncmFwaCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBzZXQgYSBuYW1lZCBlZGdlIHdoZW4gaXNNdWx0aWdyYXBoID0gZmFsc2UiKTt0aGlzLnNldE5vZGUodCksdGhpcy5zZXROb2RlKGUpLHRoaXMuX2VkZ2VMYWJlbHNbYV09cj9pOnRoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbih0LGUsbik7dmFyIHM9bEJ0KHRoaXMuX2lzRGlyZWN0ZWQsdCxlLG4pO3JldHVybiB0PXMudixlPXMudyxPYmplY3QuZnJlZXplKHMpLHRoaXMuX2VkZ2VPYmpzW2FdPXMsb0J0KHRoaXMuX3ByZWRzW2VdLHQpLG9CdCh0aGlzLl9zdWNzW3RdLGUpLHRoaXMuX2luW2VdW2FdPXMsdGhpcy5fb3V0W3RdW2FdPXMsdGhpcy5fZWRnZUNvdW50KyssdGhpc30sckJ0LnByb3RvdHlwZS5lZGdlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT0xPT09YXJndW1lbnRzLmxlbmd0aD9jQnQodGhpcy5faXNEaXJlY3RlZCxhcmd1bWVudHNbMF0pOnNCdCh0aGlzLl9pc0RpcmVjdGVkLHQsZSxuKTtyZXR1cm4gdGhpcy5fZWRnZUxhYmVsc1tpXX0sckJ0LnByb3RvdHlwZS5oYXNFZGdlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT0xPT09YXJndW1lbnRzLmxlbmd0aD9jQnQodGhpcy5faXNEaXJlY3RlZCxhcmd1bWVudHNbMF0pOnNCdCh0aGlzLl9pc0RpcmVjdGVkLHQsZSxuKTtyZXR1cm4gZUJ0Lmhhcyh0aGlzLl9lZGdlTGFiZWxzLGkpfSxyQnQucHJvdG90eXBlLnJlbW92ZUVkZ2U9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPTE9PT1hcmd1bWVudHMubGVuZ3RoP2NCdCh0aGlzLl9pc0RpcmVjdGVkLGFyZ3VtZW50c1swXSk6c0J0KHRoaXMuX2lzRGlyZWN0ZWQsdCxlLG4pLHI9dGhpcy5fZWRnZU9ianNbaV07cmV0dXJuIHImJih0PXIudixlPXIudyxkZWxldGUgdGhpcy5fZWRnZUxhYmVsc1tpXSxkZWxldGUgdGhpcy5fZWRnZU9ianNbaV0sYUJ0KHRoaXMuX3ByZWRzW2VdLHQpLGFCdCh0aGlzLl9zdWNzW3RdLGUpLGRlbGV0ZSB0aGlzLl9pbltlXVtpXSxkZWxldGUgdGhpcy5fb3V0W3RdW2ldLHRoaXMuX2VkZ2VDb3VudC0tKSx0aGlzfSxyQnQucHJvdG90eXBlLmluRWRnZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9pblt0XTtpZihuKXt2YXIgaT1lQnQudmFsdWVzKG4pO3JldHVybiBlP2VCdC5maWx0ZXIoaSwoZnVuY3Rpb24odCl7cmV0dXJuIHQudj09PWV9KSk6aX19LHJCdC5wcm90b3R5cGUub3V0RWRnZXM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9vdXRbdF07aWYobil7dmFyIGk9ZUJ0LnZhbHVlcyhuKTtyZXR1cm4gZT9lQnQuZmlsdGVyKGksKGZ1bmN0aW9uKHQpe3JldHVybiB0Lnc9PT1lfSkpOml9fSxyQnQucHJvdG90eXBlLm5vZGVFZGdlcz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuaW5FZGdlcyh0LGUpO2lmKG4pcmV0dXJuIG4uY29uY2F0KHRoaXMub3V0RWRnZXModCxlKSl9O3ZhciB1QnQ9e0dyYXBoOm5CdCx2ZXJzaW9uOiIyLjEuOCJ9LGhCdD10QnQsZEJ0PW5CdCxwQnQ9e3dyaXRlOmZ1bmN0aW9uIGZCdCh0KXt2YXIgZT17b3B0aW9uczp7ZGlyZWN0ZWQ6dC5pc0RpcmVjdGVkKCksbXVsdGlncmFwaDp0LmlzTXVsdGlncmFwaCgpLGNvbXBvdW5kOnQuaXNDb21wb3VuZCgpfSxub2RlczpnQnQodCksZWRnZXM6X0J0KHQpfTtyZXR1cm4gaEJ0LmlzVW5kZWZpbmVkKHQuZ3JhcGgoKSl8fChlLnZhbHVlPWhCdC5jbG9uZSh0LmdyYXBoKCkpKSxlfSxyZWFkOmZ1bmN0aW9uIG1CdCh0KXt2YXIgZT1uZXcgZEJ0KHQub3B0aW9ucykuc2V0R3JhcGgodC52YWx1ZSk7cmV0dXJuIGhCdC5lYWNoKHQubm9kZXMsKGZ1bmN0aW9uKHQpe2Uuc2V0Tm9kZSh0LnYsdC52YWx1ZSksdC5wYXJlbnQmJmUuc2V0UGFyZW50KHQudix0LnBhcmVudCl9KSksaEJ0LmVhY2godC5lZGdlcywoZnVuY3Rpb24odCl7ZS5zZXRFZGdlKHt2OnQudix3OnQudyxuYW1lOnQubmFtZX0sdC52YWx1ZSl9KSksZX19O2Z1bmN0aW9uIGdCdCh0KXtyZXR1cm4gaEJ0Lm1hcCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGUpe3ZhciBuPXQubm9kZShlKSxpPXQucGFyZW50KGUpLHI9e3Y6ZX07cmV0dXJuIGhCdC5pc1VuZGVmaW5lZChuKXx8KHIudmFsdWU9biksaEJ0LmlzVW5kZWZpbmVkKGkpfHwoci5wYXJlbnQ9aSkscn0pKX1mdW5jdGlvbiBfQnQodCl7cmV0dXJuIGhCdC5tYXAodC5lZGdlcygpLChmdW5jdGlvbihlKXt2YXIgbj10LmVkZ2UoZSksaT17djplLnYsdzplLnd9O3JldHVybiBoQnQuaXNVbmRlZmluZWQoZS5uYW1lKXx8KGkubmFtZT1lLm5hbWUpLGhCdC5pc1VuZGVmaW5lZChuKXx8KGkudmFsdWU9biksaX0pKX12YXIgeUJ0PXRCdCx2QnQ9dEJ0LGJCdD14QnQ7ZnVuY3Rpb24geEJ0KCl7dGhpcy5fYXJyPVtdLHRoaXMuX2tleUluZGljZXM9e319eEJ0LnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fyci5sZW5ndGh9LHhCdC5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcnIubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5rZXl9KSl9LHhCdC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB2QnQuaGFzKHRoaXMuX2tleUluZGljZXMsdCl9LHhCdC5wcm90b3R5cGUucHJpb3JpdHk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fa2V5SW5kaWNlc1t0XTtpZih2b2lkIDAhPT1lKXJldHVybiB0aGlzLl9hcnJbZV0ucHJpb3JpdHl9LHhCdC5wcm90b3R5cGUubWluPWZ1bmN0aW9uKCl7aWYoMD09PXRoaXMuc2l6ZSgpKXRocm93IG5ldyBFcnJvcigiUXVldWUgdW5kZXJmbG93Iik7cmV0dXJuIHRoaXMuX2FyclswXS5rZXl9LHhCdC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fa2V5SW5kaWNlcztpZih0PVN0cmluZyh0KSwhdkJ0LmhhcyhuLHQpKXt2YXIgaT10aGlzLl9hcnIscj1pLmxlbmd0aDtyZXR1cm4gblt0XT1yLGkucHVzaCh7a2V5OnQscHJpb3JpdHk6ZX0pLHRoaXMuX2RlY3JlYXNlKHIpLCEwfXJldHVybiExfSx4QnQucHJvdG90eXBlLnJlbW92ZU1pbj1mdW5jdGlvbigpe3RoaXMuX3N3YXAoMCx0aGlzLl9hcnIubGVuZ3RoLTEpO3ZhciB0PXRoaXMuX2Fyci5wb3AoKTtyZXR1cm4gZGVsZXRlIHRoaXMuX2tleUluZGljZXNbdC5rZXldLHRoaXMuX2hlYXBpZnkoMCksdC5rZXl9LHhCdC5wcm90b3R5cGUuZGVjcmVhc2U9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9rZXlJbmRpY2VzW3RdO2lmKGU+dGhpcy5fYXJyW25dLnByaW9yaXR5KXRocm93IG5ldyBFcnJvcigiTmV3IHByaW9yaXR5IGlzIGdyZWF0ZXIgdGhhbiBjdXJyZW50IHByaW9yaXR5LiBLZXk6ICIrdCsiIE9sZDogIit0aGlzLl9hcnJbbl0ucHJpb3JpdHkrIiBOZXc6ICIrZSk7dGhpcy5fYXJyW25dLnByaW9yaXR5PWUsdGhpcy5fZGVjcmVhc2Uobil9LHhCdC5wcm90b3R5cGUuX2hlYXBpZnk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYXJyLG49Mip0LGk9bisxLHI9dDtuPGUubGVuZ3RoJiYocj1lW25dLnByaW9yaXR5PGVbcl0ucHJpb3JpdHk/bjpyLGk8ZS5sZW5ndGgmJihyPWVbaV0ucHJpb3JpdHk8ZVtyXS5wcmlvcml0eT9pOnIpLHIhPT10JiYodGhpcy5fc3dhcCh0LHIpLHRoaXMuX2hlYXBpZnkocikpKX0seEJ0LnByb3RvdHlwZS5fZGVjcmVhc2U9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49dGhpcy5fYXJyLGk9blt0XS5wcmlvcml0eTswIT09dCYmIShuW2U9dD4+MV0ucHJpb3JpdHk8aSk7KXRoaXMuX3N3YXAodCxlKSx0PWV9LHhCdC5wcm90b3R5cGUuX3N3YXA9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9hcnIsaT10aGlzLl9rZXlJbmRpY2VzLHI9blt0XSxvPW5bZV07blt0XT1vLG5bZV09cixpW28ua2V5XT10LGlbci5rZXldPWV9O3ZhciB3QnQ9YkJ0LFNCdD1mdW5jdGlvbiBNQnQodCxlLG4saSl7cmV0dXJuKGZ1bmN0aW9uIHIodCxlLG4saSl7dmFyIHIsbyxhPXt9LHM9bmV3IHdCdCxsPWZ1bmN0aW9uKHQpe3ZhciBlPXQudiE9PXI/dC52OnQudyxpPWFbZV0sbD1uKHQpLGM9by5kaXN0YW5jZStsO2lmKGw8MCl0aHJvdyBuZXcgRXJyb3IoImRpamtzdHJhIGRvZXMgbm90IGFsbG93IG5lZ2F0aXZlIGVkZ2Ugd2VpZ2h0cy4gQmFkIGVkZ2U6ICIrdCsiIFdlaWdodDogIitsKTtjPGkuZGlzdGFuY2UmJihpLmRpc3RhbmNlPWMsaS5wcmVkZWNlc3Nvcj1yLHMuZGVjcmVhc2UoZSxjKSl9O2Zvcih0Lm5vZGVzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG49dD09PWU/MDpOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7YVt0XT17ZGlzdGFuY2U6bn0scy5hZGQodCxuKX0pKTtzLnNpemUoKT4wJiYocj1zLnJlbW92ZU1pbigpLChvPWFbcl0pLmRpc3RhbmNlIT09TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTspaShyKS5mb3JFYWNoKGwpO3JldHVybiBhfSkodCxTdHJpbmcoZSksbnx8RUJ0LGl8fGZ1bmN0aW9uKGUpe3JldHVybiB0Lm91dEVkZ2VzKGUpfSl9LEVCdD10QnQuY29uc3RhbnQoMSksVEJ0PVNCdCxDQnQ9dEJ0LEFCdD10QnQsa0J0PWZ1bmN0aW9uIExCdCh0KXt2YXIgZT0wLG49W10saT17fSxyPVtdO2Z1bmN0aW9uIG8oYSl7dmFyIHM9aVthXT17b25TdGFjazohMCxsb3dsaW5rOmUsaW5kZXg6ZSsrfTtpZihuLnB1c2goYSksdC5zdWNjZXNzb3JzKGEpLmZvckVhY2goKGZ1bmN0aW9uKHQpe0FCdC5oYXMoaSx0KT9pW3RdLm9uU3RhY2smJihzLmxvd2xpbms9TWF0aC5taW4ocy5sb3dsaW5rLGlbdF0uaW5kZXgpKToobyh0KSxzLmxvd2xpbms9TWF0aC5taW4ocy5sb3dsaW5rLGlbdF0ubG93bGluaykpfSkpLHMubG93bGluaz09PXMuaW5kZXgpe3ZhciBsLGM9W107ZG97bD1uLnBvcCgpLGlbbF0ub25TdGFjaz0hMSxjLnB1c2gobCl9d2hpbGUoYSE9PWwpO3IucHVzaChjKX19cmV0dXJuIHQubm9kZXMoKS5mb3JFYWNoKChmdW5jdGlvbih0KXtBQnQuaGFzKGksdCl8fG8odCl9KSkscn0sUEJ0PXRCdCxOQnQ9a0J0LElCdD10QnQuY29uc3RhbnQoMSksUkJ0PXRCdCxPQnQ9ekJ0O2Z1bmN0aW9uIHpCdCh0KXt2YXIgZT17fSxuPXt9LGk9W107aWYoUkJ0LmVhY2godC5zaW5rcygpLChmdW5jdGlvbiByKG8pe2lmKFJCdC5oYXMobixvKSl0aHJvdyBuZXcgREJ0O1JCdC5oYXMoZSxvKXx8KG5bb109ITAsZVtvXT0hMCxSQnQuZWFjaCh0LnByZWRlY2Vzc29ycyhvKSxyKSxkZWxldGUgbltvXSxpLnB1c2gobykpfSkpLFJCdC5zaXplKGUpIT09dC5ub2RlQ291bnQoKSl0aHJvdyBuZXcgREJ0O3JldHVybiBpfWZ1bmN0aW9uIERCdCgpe316QnQuQ3ljbGVFeGNlcHRpb249REJ0LERCdC5wcm90b3R5cGU9bmV3IEVycm9yO3ZhciBCQnQ9T0J0LEhCdD10QnQsRkJ0PWZ1bmN0aW9uIFZCdCh0LGUsbil7SEJ0LmlzQXJyYXkoZSl8fChlPVtlXSk7dmFyIGk9KHQuaXNEaXJlY3RlZCgpP3Quc3VjY2Vzc29yczp0Lm5laWdoYm9ycykuYmluZCh0KSxyPVtdLG89e307cmV0dXJuIEhCdC5lYWNoKGUsKGZ1bmN0aW9uKGUpe2lmKCF0Lmhhc05vZGUoZSkpdGhyb3cgbmV3IEVycm9yKCJHcmFwaCBkb2VzIG5vdCBoYXZlIG5vZGU6ICIrZSk7VUJ0KHQsZSwicG9zdCI9PT1uLG8saSxyKX0pKSxyfTtmdW5jdGlvbiBVQnQodCxlLG4saSxyLG8pe0hCdC5oYXMoaSxlKXx8KGlbZV09ITAsbnx8by5wdXNoKGUpLEhCdC5lYWNoKHIoZSksKGZ1bmN0aW9uKGUpe1VCdCh0LGUsbixpLHIsbyl9KSksbiYmby5wdXNoKGUpKX12YXIgakJ0LEdCdD1GQnQsV0J0PUZCdCxxQnQ9dEJ0LFlCdD1uQnQsWEJ0PWJCdCwkQnQ9e0dyYXBoOnVCdC5HcmFwaCxqc29uOnBCdCxhbGc6e2NvbXBvbmVudHM6ZnVuY3Rpb24gS0J0KHQpe3ZhciBlLG49e30saT1bXTtmdW5jdGlvbiByKGkpe3lCdC5oYXMobixpKXx8KG5baV09ITAsZS5wdXNoKGkpLHlCdC5lYWNoKHQuc3VjY2Vzc29ycyhpKSxyKSx5QnQuZWFjaCh0LnByZWRlY2Vzc29ycyhpKSxyKSl9cmV0dXJuIHlCdC5lYWNoKHQubm9kZXMoKSwoZnVuY3Rpb24odCl7ZT1bXSxyKHQpLGUubGVuZ3RoJiZpLnB1c2goZSl9KSksaX0sZGlqa3N0cmE6U0J0LGRpamtzdHJhQWxsOmZ1bmN0aW9uIFpCdCh0LGUsbil7cmV0dXJuIENCdC50cmFuc2Zvcm0odC5ub2RlcygpLChmdW5jdGlvbihpLHIpe2lbcl09VEJ0KHQscixlLG4pfSkse30pfSxmaW5kQ3ljbGVzOmZ1bmN0aW9uIEpCdCh0KXtyZXR1cm4gUEJ0LmZpbHRlcihOQnQodCksKGZ1bmN0aW9uKGUpe3JldHVybiBlLmxlbmd0aD4xfHwxPT09ZS5sZW5ndGgmJnQuaGFzRWRnZShlWzBdLGVbMF0pfSkpfSxmbG95ZFdhcnNoYWxsOmZ1bmN0aW9uIFFCdCh0LGUsbil7cmV0dXJuKGZ1bmN0aW9uIGkodCxlLG4pe3ZhciBpPXt9LHI9dC5ub2RlcygpO3JldHVybiByLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lbdF09e30saVt0XVt0XT17ZGlzdGFuY2U6MH0sci5mb3JFYWNoKChmdW5jdGlvbihlKXt0IT09ZSYmKGlbdF1bZV09e2Rpc3RhbmNlOk51bWJlci5QT1NJVElWRV9JTkZJTklUWX0pfSkpLG4odCkuZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIHI9bi52PT09dD9uLnc6bi52LG89ZShuKTtpW3RdW3JdPXtkaXN0YW5jZTpvLHByZWRlY2Vzc29yOnR9fSkpfSkpLHIuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9aVt0XTtyLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBvPWlbbl07ci5mb3JFYWNoKChmdW5jdGlvbihuKXt2YXIgaT1lW25dLHI9b1tuXSxhPW9bdF0uZGlzdGFuY2UraS5kaXN0YW5jZTthPHIuZGlzdGFuY2UmJihyLmRpc3RhbmNlPWEsci5wcmVkZWNlc3Nvcj1pLnByZWRlY2Vzc29yKX0pKX0pKX0pKSxpfSkodCxlfHxJQnQsbnx8ZnVuY3Rpb24oZSl7cmV0dXJuIHQub3V0RWRnZXMoZSl9KX0saXNBY3ljbGljOmZ1bmN0aW9uIHRIdCh0KXt0cnl7QkJ0KHQpfWNhdGNoKHQpe2lmKHQgaW5zdGFuY2VvZiBCQnQuQ3ljbGVFeGNlcHRpb24pcmV0dXJuITE7dGhyb3cgdH1yZXR1cm4hMH0scG9zdG9yZGVyOmZ1bmN0aW9uIGVIdCh0LGUpe3JldHVybiBHQnQodCxlLCJwb3N0Iil9LHByZW9yZGVyOmZ1bmN0aW9uIG5IdCh0LGUpe3JldHVybiBXQnQodCxlLCJwcmUiKX0scHJpbTpmdW5jdGlvbiBpSHQodCxlKXt2YXIgbixpPW5ldyBZQnQscj17fSxvPW5ldyBYQnQ7ZnVuY3Rpb24gYSh0KXt2YXIgaT10LnY9PT1uP3Qudzp0LnYsYT1vLnByaW9yaXR5KGkpO2lmKHZvaWQgMCE9PWEpe3ZhciBzPWUodCk7czxhJiYocltpXT1uLG8uZGVjcmVhc2UoaSxzKSl9fWlmKDA9PT10Lm5vZGVDb3VudCgpKXJldHVybiBpO3FCdC5lYWNoKHQubm9kZXMoKSwoZnVuY3Rpb24odCl7by5hZGQodCxOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpLGkuc2V0Tm9kZSh0KX0pKSxvLmRlY3JlYXNlKHQubm9kZXMoKVswXSwwKTtmb3IodmFyIHM9ITE7by5zaXplKCk+MDspe2lmKG49by5yZW1vdmVNaW4oKSxxQnQuaGFzKHIsbikpaS5zZXRFZGdlKG4scltuXSk7ZWxzZXtpZihzKXRocm93IG5ldyBFcnJvcigiSW5wdXQgZ3JhcGggaXMgbm90IGNvbm5lY3RlZDogIit0KTtzPSEwfXQubm9kZUVkZ2VzKG4pLmZvckVhY2goYSl9cmV0dXJuIGl9LHRhcmphbjprQnQsdG9wc29ydDpPQnR9LHZlcnNpb246dUJ0LnZlcnNpb259O3RyeXtqQnQ9JEJ0fWNhdGNoKHQpe31qQnR8fChqQnQ9d2luZG93LmdyYXBobGliKTt2YXIgckh0LG9IdD1qQnQsYUh0PVFOdCxzSHQ9ekN0LGxIdD1OTHQsY0h0PUtrdCx1SHQ9cEF0LGhIdD1mdW5jdGlvbiBkSHQodCxlLG4pe2lmKCF1SHQobikpcmV0dXJuITE7dmFyIGk9dHlwZW9mIGU7cmV0dXJuISEoIm51bWJlciI9PWk/bEh0KG4pJiZjSHQoZSxuLmxlbmd0aCk6InN0cmluZyI9PWkmJmUgaW4gbikmJnNIdChuW2VdLHQpfSxwSHQ9ekN0LGZIdD1oSHQsbUh0PXFMdCxnSHQ9T2JqZWN0LnByb3RvdHlwZSxfSHQ9Z0h0Lmhhc093blByb3BlcnR5LHlIdD14RHQoKGZ1bmN0aW9uKHQsZSl7dD1PYmplY3QodCk7dmFyIG49LTEsaT1lLmxlbmd0aCxyPWk+Mj9lWzJdOnZvaWQgMDtmb3IociYmZkh0KGVbMF0sZVsxXSxyKSYmKGk9MSk7KytuPGk7KWZvcih2YXIgbz1lW25dLGE9bUh0KG8pLHM9LTEsbD1hLmxlbmd0aDsrK3M8bDspe3ZhciBjPWFbc10sdT10W2NdOyh2b2lkIDA9PT11fHxwSHQodSxnSHRbY10pJiYhX0h0LmNhbGwodCxjKSkmJih0W2NdPW9bY10pfXJldHVybiB0fSkpLHZIdD1JT3QsYkh0PU5MdCx4SHQ9REx0LHdIdD0vXHMvLFNIdD0vXlxzKy8sTUh0PXBBdCxFSHQ9YlJ0LFRIdD0vXlstK10weFswLTlhLWZdKyQvaSxDSHQ9L14wYlswMV0rJC9pLEFIdD0vXjBvWzAtN10rJC9pLGtIdD1wYXJzZUludCxMSHQ9ZnVuY3Rpb24gUEh0KHQpe3JldHVybiB0PzEvMD09PSh0PShmdW5jdGlvbiBlKHQpe2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdDtpZihFSHQodCkpcmV0dXJuIE5hTjtpZihNSHQodCkpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2Y/dC52YWx1ZU9mKCk6dDt0PU1IdChlKT9lKyIiOmV9aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiAwPT09dD90Oit0O3Q9KGZ1bmN0aW9uIG4odCl7cmV0dXJuIHQ/dC5zbGljZSgwLChmdW5jdGlvbiBlKHQpe2Zvcih2YXIgZT10Lmxlbmd0aDtlLS0mJndIdC50ZXN0KHQuY2hhckF0KGUpKTspO3JldHVybiBlfSkodCkrMSkucmVwbGFjZShTSHQsIiIpOnR9KSh0KTt2YXIgaT1DSHQudGVzdCh0KTtyZXR1cm4gaXx8QUh0LnRlc3QodCk/a0h0KHQuc2xpY2UoMiksaT8yOjgpOlRIdC50ZXN0KHQpP05hTjordH0pKHQpKXx8dD09PS0xLzA/MTc5NzY5MzEzNDg2MjMxNTdlMjkyKih0PDA/LTE6MSk6dD09dD90OjA6MD09PXQ/dDowfSxOSHQ9TEh0LElIdD1TRHQsUkh0PUlPdCxPSHQ9TWF0aC5tYXgsekh0PShmdW5jdGlvbiBCSHQodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixpKXt2YXIgcj1PYmplY3QoZSk7aWYoIWJIdChlKSl7dmFyIG89dkh0KG4pO2U9eEh0KGUpLG49ZnVuY3Rpb24odCl7cmV0dXJuIG8oclt0XSx0LHIpfX12YXIgYT10KGUsbixpKTtyZXR1cm4gYT4tMT9yW28/ZVthXTphXTp2b2lkIDB9fSkoKGZ1bmN0aW9uIERIdCh0LGUsbil7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO2lmKCFpKXJldHVybi0xO3ZhciByPW51bGw9PW4/MDooZnVuY3Rpb24gbyh0KXt2YXIgZT1OSHQodCksbj1lJTE7cmV0dXJuIGU9PWU/bj9lLW46ZTowfSkobik7cmV0dXJuIHI8MCYmKHI9T0h0KGkrciwwKSksSUh0KHQsUkh0KGUpLHIpfSkpLEhIdD1zRHQsRkh0PWZ1bmN0aW9uIFZIdCh0KXtyZXR1cm4gbnVsbCE9dCYmdC5sZW5ndGg/SEh0KHQsMSk6W119LFVIdD1pSXQsakh0PW1JdCxHSHQ9cUx0LFdIdD1Ta3QscUh0PXNJdCxZSHQ9SU90LFhIdD1iUnQsJEh0PWZ1bmN0aW9uIEtIdCh0LGUsbil7Zm9yKHZhciBpPS0xLHI9dC5sZW5ndGg7KytpPHI7KXt2YXIgbz10W2ldLGE9ZShvKTtpZihudWxsIT1hJiYodm9pZCAwPT09cz9hPT1hJiYhWEh0KGEpOm4oYSxzKSkpdmFyIHM9YSxsPW99cmV0dXJuIGx9LFpIdD0kSHQsSkh0PWZ1bmN0aW9uIFFIdCh0LGUpe3JldHVybiB0PmV9LHRGdD1kSXQsZUZ0PVNrdCxuRnQ9ekN0LGlGdD1mdW5jdGlvbiByRnQodCxlLG4peyh2b2lkIDAhPT1uJiYhbkZ0KHRbZV0sbil8fHZvaWQgMD09PW4mJiEoZSBpbiB0KSkmJmVGdCh0LGUsbil9LG9GdD1oQXQsYUZ0PWhQdCxzRnQ9Umt0LGxGdD1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcsY0Z0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksdUZ0PWxGdC5jYWxsKE9iamVjdCksaEZ0PWZ1bmN0aW9uIGRGdCh0LGUpe2lmKCgiY29uc3RydWN0b3IiIT09ZXx8ImZ1bmN0aW9uIiE9dHlwZW9mIHRbZV0pJiYiX19wcm90b19fIiE9ZSlyZXR1cm4gdFtlXX0scEZ0PU5rdCxmRnQ9cUx0LG1GdD1pRnQsZ0Z0PUtMdC5leHBvcnRzLF9GdD1sTnQseUZ0PVpMdCx2RnQ9eU50LGJGdD1Ha3QseEZ0PVdrdCx3RnQ9VkR0LFNGdD1xa3QuZXhwb3J0cyxNRnQ9X0F0LEVGdD1wQXQsVEZ0PWNMdCxDRnQ9aEZ0LEFGdD1fa3Qsa0Z0PWlGdCxMRnQ9aUl0LFBGdD1wQXQsTkZ0PXFMdCxJRnQ9aEZ0LFJGdD14RHQsT0Z0PWhIdCx6RnQ9ZnVuY3Rpb24gdChlLG4saSxyLG8pe2UhPT1uJiZMRnQobiwoZnVuY3Rpb24oYSxzKXtpZihvfHwobz1uZXcgQUZ0KSxQRnQoYSkpIShmdW5jdGlvbiBsKHQsZSxuLGkscixvLGEpe3ZhciBzPUNGdCh0LG4pLGw9Q0Z0KGUsbiksYz1hLmdldChsKTtpZihjKW1GdCh0LG4sYyk7ZWxzZXt2YXIgdT1vP28ocyxsLG4rIiIsdCxlLGEpOnZvaWQgMCxoPXZvaWQgMD09PXU7aWYoaCl7dmFyIGQ9eEZ0KGwpLHA9IWQmJlNGdChsKSxmPSFkJiYhcCYmVEZ0KGwpO3U9bCxkfHxwfHxmP3hGdChzKT91PXM6d0Z0KHMpP3U9eUZ0KHMpOnA/KGg9ITEsdT1nRnQobCwhMCkpOmY/KGg9ITEsdT1fRnQobCwhMCkpOnU9W106KGZ1bmN0aW9uIG0odCl7aWYoIXNGdCh0KXx8IltvYmplY3QgT2JqZWN0XSIhPW9GdCh0KSlyZXR1cm4hMTt2YXIgZT1hRnQodCk7aWYobnVsbD09PWUpcmV0dXJuITA7dmFyIG49Y0Z0LmNhbGwoZSwiY29uc3RydWN0b3IiKSYmZS5jb25zdHJ1Y3RvcjtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgbiYmbiBpbnN0YW5jZW9mIG4mJmxGdC5jYWxsKG4pPT11RnR9KShsKXx8YkZ0KGwpPyh1PXMsYkZ0KHMpP3U9KGZ1bmN0aW9uIGcodCl7cmV0dXJuIHBGdCh0LGZGdCh0KSl9KShzKTpFRnQocykmJiFNRnQocyl8fCh1PXZGdChsKSkpOmg9ITF9aCYmKGEuc2V0KGwsdSkscih1LGwsaSxvLGEpLGEuZGVsZXRlKGwpKSxtRnQodCxuLHUpfX0pKGUsbixzLGksdCxyLG8pO2Vsc2V7dmFyIGM9cj9yKElGdChlLHMpLGEscysiIixlLG4sbyk6dm9pZCAwO3ZvaWQgMD09PWMmJihjPWEpLGtGdChlLHMsYyl9fSksTkZ0KX0sREZ0PShmdW5jdGlvbiBCRnQodCl7cmV0dXJuIFJGdCgoZnVuY3Rpb24oZSxuKXt2YXIgaT0tMSxyPW4ubGVuZ3RoLG89cj4xP25bci0xXTp2b2lkIDAsYT1yPjI/blsyXTp2b2lkIDA7Zm9yKG89dC5sZW5ndGg+MyYmImZ1bmN0aW9uIj09dHlwZW9mIG8/KHItLSxvKTp2b2lkIDAsYSYmT0Z0KG5bMF0sblsxXSxhKSYmKG89cjwzP3ZvaWQgMDpvLHI9MSksZT1PYmplY3QoZSk7KytpPHI7KXt2YXIgcz1uW2ldO3MmJnQoZSxzLGksbyl9cmV0dXJuIGV9KSl9KSgoZnVuY3Rpb24odCxlLG4pe3pGdCh0LGUsbil9KSksSEZ0PWZ1bmN0aW9uIEZGdCh0LGUpe3JldHVybiB0PGV9LFZGdD0kSHQsVUZ0PUhGdCxqRnQ9ZEl0LEdGdD0kSHQsV0Z0PUlPdCxxRnQ9SEZ0LFlGdD1pQXQsWEZ0PUFrdCwkRnQ9S1J0LEtGdD1La3QsWkZ0PXBBdCxKRnQ9UVJ0LFFGdD1pT3QsdFZ0PWZ1bmN0aW9uIGVWdCh0LGUsbixpKXtpZighWkZ0KHQpKXJldHVybiB0O2Zvcih2YXIgcj0tMSxvPShlPSRGdChlLHQpKS5sZW5ndGgsYT1vLTEscz10O251bGwhPXMmJisrcjxvOyl7dmFyIGw9SkZ0KGVbcl0pLGM9bjtpZigiX19wcm90b19fIj09PWx8fCJjb25zdHJ1Y3RvciI9PT1sfHwicHJvdG90eXBlIj09PWwpcmV0dXJuIHQ7aWYociE9YSl7dmFyIHU9c1tsXTt2b2lkIDA9PT0oYz1pP2kodSxsLHMpOnZvaWQgMCkmJihjPVpGdCh1KT91OktGdChlW3IrMV0pP1tdOnt9KX1YRnQocyxsLGMpLHM9c1tsXX1yZXR1cm4gdH0sblZ0PUtSdCxpVnQ9X090LHJWdD1GSHQsb1Z0PWhEdCxhVnQ9Z0R0LHNWdD0oZnVuY3Rpb24gbFZ0KHQpe3JldHVybiBhVnQob1Z0KHQsdm9pZCAwLHJWdCksdCsiIil9KSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD97fTooZnVuY3Rpb24gbih0LGUpe3JldHVybihmdW5jdGlvbiBuKHQsZSxpKXtmb3IodmFyIHI9LTEsbz1lLmxlbmd0aCxhPXt9OysrcjxvOyl7dmFyIHM9ZVtyXSxsPVFGdCh0LHMpO2kobCxzKSYmdFZ0KGEsblZ0KHMsdCksbCl9cmV0dXJuIGF9KSh0LGUsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGlWdCh0LG4pfSkpfSkodCxlKX0pKSxjVnQ9TWF0aC5jZWlsLHVWdD1NYXRoLm1heCxoVnQ9aEh0LGRWdD1MSHQscFZ0PShmdW5jdGlvbiBmVnQodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixpKXtyZXR1cm4gaSYmIm51bWJlciIhPXR5cGVvZiBpJiZoVnQoZSxuLGkpJiYobj1pPXZvaWQgMCksZT1kVnQoZSksdm9pZCAwPT09bj8obj1lLGU9MCk6bj1kVnQobiksKGZ1bmN0aW9uIHIodCxlLG4saSl7Zm9yKHZhciByPS0xLG89dVZ0KGNWdCgoZS10KS8obnx8MSkpLDApLGE9QXJyYXkobyk7by0tOylhW2k/bzorK3JdPXQsdCs9bjtyZXR1cm4gYX0pKGUsbixpPXZvaWQgMD09PWk/ZTxuPzE6LTE6ZFZ0KGkpLHQpfX0pKCksbVZ0PWJSdCxnVnQ9ZnVuY3Rpb24gX1Z0KHQsZSl7aWYodCE9PWUpe3ZhciBuPXZvaWQgMCE9PXQsaT1udWxsPT09dCxyPXQ9PXQsbz1tVnQodCksYT12b2lkIDAhPT1lLHM9bnVsbD09PWUsbD1lPT1lLGM9bVZ0KGUpO2lmKCFzJiYhYyYmIW8mJnQ+ZXx8byYmYSYmbCYmIXMmJiFjfHxpJiZhJiZsfHwhbiYmbHx8IXIpcmV0dXJuIDE7aWYoIWkmJiFvJiYhYyYmdDxlfHxjJiZuJiZyJiYhaSYmIW98fHMmJm4mJnJ8fCFhJiZyfHwhbClyZXR1cm4tMX1yZXR1cm4gMH0seVZ0PXpSdCx2VnQ9aU90LGJWdD1JT3QseFZ0PXN6dCx3VnQ9ckx0LFNWdD1kSXQsTVZ0PVdrdCxFVnQ9c0R0LFRWdD1oSHQsQ1Z0PXhEdCgoZnVuY3Rpb24odCxlKXtpZihudWxsPT10KXJldHVybltdO3ZhciBuPWUubGVuZ3RoO3JldHVybiBuPjEmJlRWdCh0LGVbMF0sZVsxXSk/ZT1bXTpuPjImJlRWdChlWzBdLGVbMV0sZVsyXSkmJihlPVtlWzBdXSksKGZ1bmN0aW9uIGkodCxlLG4pe2U9ZS5sZW5ndGg/eVZ0KGUsKGZ1bmN0aW9uKHQpe3JldHVybiBNVnQodCk/ZnVuY3Rpb24oZSl7cmV0dXJuIHZWdChlLDE9PT10Lmxlbmd0aD90WzBdOnQpfTp0fSkpOltTVnRdO3ZhciBpPS0xO3JldHVybiBlPXlWdChlLHdWdChiVnQpKSwoZnVuY3Rpb24gcih0LGUpe3ZhciBuPXQubGVuZ3RoO2Zvcih0LnNvcnQoZSk7bi0tOyl0W25dPXRbbl0udmFsdWU7cmV0dXJuIHR9KSh4VnQodCwoZnVuY3Rpb24odCxuLHIpe3JldHVybntjcml0ZXJpYTp5VnQoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUodCl9KSksaW5kZXg6KytpLHZhbHVlOnR9fSkpLChmdW5jdGlvbih0LGUpe3JldHVybihmdW5jdGlvbiBpKHQsZSxuKXtmb3IodmFyIGk9LTEscj10LmNyaXRlcmlhLG89ZS5jcml0ZXJpYSxhPXIubGVuZ3RoLHM9bi5sZW5ndGg7KytpPGE7KXt2YXIgbD1nVnQocltpXSxvW2ldKTtpZihsKXJldHVybiBpPj1zP2w6bCooImRlc2MiPT1uW2ldPy0xOjEpfXJldHVybiB0LmluZGV4LWUuaW5kZXh9KSh0LGUsbil9KSl9KSh0LEVWdChlLDEpLFtdKX0pKSxBVnQ9R1J0LGtWdD0wLExWdD1Ba3Q7dHJ5e3JIdD17Y2xvbmVEZWVwOmZ1bmN0aW9uIFBWdCh0KXtyZXR1cm4gYUh0KHQsNSl9LGNvbnN0YW50OmVJdCxkZWZhdWx0czp5SHQsZWFjaDpTSXQsZmlsdGVyOkZPdCxmaW5kOnpIdCxmbGF0dGVuOkZIdCxmb3JFYWNoOnhJdCxmb3JJbjpmdW5jdGlvbiBOVnQodCxlKXtyZXR1cm4gbnVsbD09dD90OlVIdCh0LGpIdChlKSxHSHQpfSxoYXM6cU90LGlzVW5kZWZpbmVkOml6dCxsYXN0OmZ1bmN0aW9uIElWdCh0KXt2YXIgZT1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIGU/dFtlLTFdOnZvaWQgMH0sbWFwOnB6dCxtYXBWYWx1ZXM6ZnVuY3Rpb24gUlZ0KHQsZSl7dmFyIG49e307cmV0dXJuIGU9WUh0KGUpLHFIdCh0LChmdW5jdGlvbih0LGkscil7V0h0KG4saSxlKHQsaSxyKSl9KSksbn0sbWF4OmZ1bmN0aW9uIE9WdCh0KXtyZXR1cm4gdCYmdC5sZW5ndGg/Wkh0KHQsdEZ0LEpIdCk6dm9pZCAwfSxtZXJnZTpERnQsbWluOmZ1bmN0aW9uIHpWdCh0KXtyZXR1cm4gdCYmdC5sZW5ndGg/VkZ0KHQsakZ0LFVGdCk6dm9pZCAwfSxtaW5CeTpmdW5jdGlvbiBEVnQodCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/R0Z0KHQsV0Z0KGUpLHFGdCk6dm9pZCAwfSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4gWUZ0LkRhdGUubm93KCl9LHBpY2s6c1Z0LHJhbmdlOnBWdCxyZWR1Y2U6d3p0LHNvcnRCeTpDVnQsdW5pcXVlSWQ6ZnVuY3Rpb24gQlZ0KHQpe3ZhciBlPSsra1Z0O3JldHVybiBBVnQodCkrZX0sdmFsdWVzOlhEdCx6aXBPYmplY3Q6ZnVuY3Rpb24gSFZ0KHQsZSl7cmV0dXJuKGZ1bmN0aW9uIG4odCxlLGkpe2Zvcih2YXIgcj0tMSxvPXQubGVuZ3RoLGE9ZS5sZW5ndGgscz17fTsrK3I8bzspaShzLHRbcl0scjxhP2Vbcl06dm9pZCAwKTtyZXR1cm4gc30pKHR8fFtdLGV8fFtdLExWdCl9fX1jYXRjaCh0KXt9ckh0fHwockh0PXdpbmRvdy5fKTt2YXIgRlZ0PXJIdCxWVnQ9VVZ0O2Z1bmN0aW9uIFVWdCgpe3ZhciB0PXt9O3QuX25leHQ9dC5fcHJldj10LHRoaXMuX3NlbnRpbmVsPXR9ZnVuY3Rpb24galZ0KHQpe3QuX3ByZXYuX25leHQ9dC5fbmV4dCx0Ll9uZXh0Ll9wcmV2PXQuX3ByZXYsZGVsZXRlIHQuX25leHQsZGVsZXRlIHQuX3ByZXZ9ZnVuY3Rpb24gR1Z0KHQsZSl7aWYoIl9uZXh0IiE9PXQmJiJfcHJldiIhPT10KXJldHVybiBlfVVWdC5wcm90b3R5cGUuZGVxdWV1ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3NlbnRpbmVsLGU9dC5fcHJldjtpZihlIT09dClyZXR1cm4galZ0KGUpLGV9LFVWdC5wcm90b3R5cGUuZW5xdWV1ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9zZW50aW5lbDt0Ll9wcmV2JiZ0Ll9uZXh0JiZqVnQodCksdC5fbmV4dD1lLl9uZXh0LGUuX25leHQuX3ByZXY9dCxlLl9uZXh0PXQsdC5fcHJldj1lfSxVVnQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9dGhpcy5fc2VudGluZWwsbj1lLl9wcmV2O24hPT1lOyl0LnB1c2goSlNPTi5zdHJpbmdpZnkobixHVnQpKSxuPW4uX3ByZXY7cmV0dXJuIlsiK3Quam9pbigiLCAiKSsiXSJ9O3ZhciBXVnQ9RlZ0LHFWdD1vSHQuR3JhcGgsWVZ0PVZWdCxYVnQ9V1Z0LmNvbnN0YW50KDEpO2Z1bmN0aW9uICRWdCh0LGUsbixpLHIpe3ZhciBvPXI/W106dm9pZCAwO3JldHVybiBXVnQuZm9yRWFjaCh0LmluRWRnZXMoaS52KSwoZnVuY3Rpb24oaSl7dmFyIGE9dC5lZGdlKGkpLHM9dC5ub2RlKGkudik7ciYmby5wdXNoKHt2Omkudix3Omkud30pLHMub3V0LT1hLEtWdChlLG4scyl9KSksV1Z0LmZvckVhY2godC5vdXRFZGdlcyhpLnYpLChmdW5jdGlvbihpKXt2YXIgcj10LmVkZ2UoaSksbz10Lm5vZGUoaS53KTtvLmluLT1yLEtWdChlLG4sbyl9KSksdC5yZW1vdmVOb2RlKGkudiksb31mdW5jdGlvbiBLVnQodCxlLG4pe24ub3V0P24uaW4/dFtuLm91dC1uLmluK2VdLmVucXVldWUobik6dFt0Lmxlbmd0aC0xXS5lbnF1ZXVlKG4pOnRbMF0uZW5xdWV1ZShuKX12YXIgWlZ0PUZWdCxKVnQ9e3J1bjpmdW5jdGlvbiBRVnQodCl7dmFyIGU9ImdyZWVkeSI9PT10LmdyYXBoKCkuYWN5Y2xpY2VyPyhmdW5jdGlvbiBpKHQsZSl7aWYodC5ub2RlQ291bnQoKTw9MSlyZXR1cm5bXTt2YXIgbj0oZnVuY3Rpb24gaSh0LGUpe3ZhciBuPW5ldyBxVnQsaT0wLHI9MDtXVnQuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKHQpe24uc2V0Tm9kZSh0LHt2OnQsaW46MCxvdXQ6MH0pfSkpLFdWdC5mb3JFYWNoKHQuZWRnZXMoKSwoZnVuY3Rpb24odCl7dmFyIG89bi5lZGdlKHQudix0LncpfHwwLGE9ZSh0KTtuLnNldEVkZ2UodC52LHQudyxvK2EpLHI9TWF0aC5tYXgocixuLm5vZGUodC52KS5vdXQrPWEpLGk9TWF0aC5tYXgoaSxuLm5vZGUodC53KS5pbis9YSl9KSk7dmFyIG89V1Z0LnJhbmdlKHIraSszKS5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBZVnR9KSksYT1pKzE7cmV0dXJuIFdWdC5mb3JFYWNoKG4ubm9kZXMoKSwoZnVuY3Rpb24odCl7S1Z0KG8sYSxuLm5vZGUodCkpfSkpLHtncmFwaDpuLGJ1Y2tldHM6byx6ZXJvSWR4OmF9fSkodCxlfHxYVnQpLHI9KGZ1bmN0aW9uIG8odCxlLG4pe2Zvcih2YXIgaSxyPVtdLG89ZVtlLmxlbmd0aC0xXSxhPWVbMF07dC5ub2RlQ291bnQoKTspe2Zvcig7aT1hLmRlcXVldWUoKTspJFZ0KHQsZSxuLGkpO2Zvcig7aT1vLmRlcXVldWUoKTspJFZ0KHQsZSxuLGkpO2lmKHQubm9kZUNvdW50KCkpZm9yKHZhciBzPWUubGVuZ3RoLTI7cz4wOy0tcylpZihpPWVbc10uZGVxdWV1ZSgpKXtyPXIuY29uY2F0KCRWdCh0LGUsbixpLCEwKSk7YnJlYWt9fXJldHVybiByfSkobi5ncmFwaCxuLmJ1Y2tldHMsbi56ZXJvSWR4KTtyZXR1cm4gV1Z0LmZsYXR0ZW4oV1Z0Lm1hcChyLChmdW5jdGlvbihlKXtyZXR1cm4gdC5vdXRFZGdlcyhlLnYsZS53KX0pKSwhMCl9KSh0LChmdW5jdGlvbiBuKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5lZGdlKGUpLndlaWdodH19KSh0KSk6KGZ1bmN0aW9uIHIodCl7dmFyIGU9W10sbj17fSxpPXt9O3JldHVybiBaVnQuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uIHIobyl7WlZ0LmhhcyhpLG8pfHwoaVtvXT0hMCxuW29dPSEwLFpWdC5mb3JFYWNoKHQub3V0RWRnZXMobyksKGZ1bmN0aW9uKHQpe1pWdC5oYXMobix0LncpP2UucHVzaCh0KTpyKHQudyl9KSksZGVsZXRlIG5bb10pfSkpLGV9KSh0KTtaVnQuZm9yRWFjaChlLChmdW5jdGlvbihlKXt2YXIgbj10LmVkZ2UoZSk7dC5yZW1vdmVFZGdlKGUpLG4uZm9yd2FyZE5hbWU9ZS5uYW1lLG4ucmV2ZXJzZWQ9ITAsdC5zZXRFZGdlKGUudyxlLnYsbixaVnQudW5pcXVlSWQoInJldiIpKX0pKX0sdW5kbzpmdW5jdGlvbiB0VXQodCl7WlZ0LmZvckVhY2godC5lZGdlcygpLChmdW5jdGlvbihlKXt2YXIgbj10LmVkZ2UoZSk7aWYobi5yZXZlcnNlZCl7dC5yZW1vdmVFZGdlKGUpO3ZhciBpPW4uZm9yd2FyZE5hbWU7ZGVsZXRlIG4ucmV2ZXJzZWQsZGVsZXRlIG4uZm9yd2FyZE5hbWUsdC5zZXRFZGdlKGUudyxlLnYsbixpKX19KSl9fSxlVXQ9RlZ0LG5VdD1vSHQuR3JhcGgsaVV0PXthZGREdW1teU5vZGU6Z1V0LHNpbXBsaWZ5OmZ1bmN0aW9uIHJVdCh0KXt2YXIgZT0obmV3IG5VdCkuc2V0R3JhcGgodC5ncmFwaCgpKTtyZXR1cm4gZVV0LmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbihuKXtlLnNldE5vZGUobix0Lm5vZGUobikpfSkpLGVVdC5mb3JFYWNoKHQuZWRnZXMoKSwoZnVuY3Rpb24obil7dmFyIGk9ZS5lZGdlKG4udixuLncpfHx7d2VpZ2h0OjAsbWlubGVuOjF9LHI9dC5lZGdlKG4pO2Uuc2V0RWRnZShuLnYsbi53LHt3ZWlnaHQ6aS53ZWlnaHQrci53ZWlnaHQsbWlubGVuOk1hdGgubWF4KGkubWlubGVuLHIubWlubGVuKX0pfSkpLGV9LGFzTm9uQ29tcG91bmRHcmFwaDpmdW5jdGlvbiBvVXQodCl7dmFyIGU9bmV3IG5VdCh7bXVsdGlncmFwaDp0LmlzTXVsdGlncmFwaCgpfSkuc2V0R3JhcGgodC5ncmFwaCgpKTtyZXR1cm4gZVV0LmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbihuKXt0LmNoaWxkcmVuKG4pLmxlbmd0aHx8ZS5zZXROb2RlKG4sdC5ub2RlKG4pKX0pKSxlVXQuZm9yRWFjaCh0LmVkZ2VzKCksKGZ1bmN0aW9uKG4pe2Uuc2V0RWRnZShuLHQuZWRnZShuKSl9KSksZX0sc3VjY2Vzc29yV2VpZ2h0czpmdW5jdGlvbiBhVXQodCl7dmFyIGU9ZVV0Lm1hcCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGUpe3ZhciBuPXt9O3JldHVybiBlVXQuZm9yRWFjaCh0Lm91dEVkZ2VzKGUpLChmdW5jdGlvbihlKXtuW2Uud109KG5bZS53XXx8MCkrdC5lZGdlKGUpLndlaWdodH0pKSxufSkpO3JldHVybiBlVXQuemlwT2JqZWN0KHQubm9kZXMoKSxlKX0scHJlZGVjZXNzb3JXZWlnaHRzOmZ1bmN0aW9uIHNVdCh0KXt2YXIgZT1lVXQubWFwKHQubm9kZXMoKSwoZnVuY3Rpb24oZSl7dmFyIG49e307cmV0dXJuIGVVdC5mb3JFYWNoKHQuaW5FZGdlcyhlKSwoZnVuY3Rpb24oZSl7bltlLnZdPShuW2Uudl18fDApK3QuZWRnZShlKS53ZWlnaHR9KSksbn0pKTtyZXR1cm4gZVV0LnppcE9iamVjdCh0Lm5vZGVzKCksZSl9LGludGVyc2VjdFJlY3Q6ZnVuY3Rpb24gbFV0KHQsZSl7dmFyIG4saSxyPXQueCxvPXQueSxhPWUueC1yLHM9ZS55LW8sbD10LndpZHRoLzIsYz10LmhlaWdodC8yO2lmKCFhJiYhcyl0aHJvdyBuZXcgRXJyb3IoIk5vdCBwb3NzaWJsZSB0byBmaW5kIGludGVyc2VjdGlvbiBpbnNpZGUgb2YgdGhlIHJlY3RhbmdsZSIpO3JldHVybiBNYXRoLmFicyhzKSpsPk1hdGguYWJzKGEpKmM/KHM8MCYmKGM9LWMpLG49YyphL3MsaT1jKTooYTwwJiYobD0tbCksbj1sLGk9bCpzL2EpLHt4OnIrbix5Om8raX19LGJ1aWxkTGF5ZXJNYXRyaXg6ZnVuY3Rpb24gY1V0KHQpe3ZhciBlPWVVdC5tYXAoZVV0LnJhbmdlKF9VdCh0KSsxKSwoZnVuY3Rpb24oKXtyZXR1cm5bXX0pKTtyZXR1cm4gZVV0LmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbihuKXt2YXIgaT10Lm5vZGUobikscj1pLnJhbms7ZVV0LmlzVW5kZWZpbmVkKHIpfHwoZVtyXVtpLm9yZGVyXT1uKX0pKSxlfSxub3JtYWxpemVSYW5rczpmdW5jdGlvbiB1VXQodCl7dmFyIGU9ZVV0Lm1pbihlVXQubWFwKHQubm9kZXMoKSwoZnVuY3Rpb24oZSl7cmV0dXJuIHQubm9kZShlKS5yYW5rfSkpKTtlVXQuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKG4pe3ZhciBpPXQubm9kZShuKTtlVXQuaGFzKGksInJhbmsiKSYmKGkucmFuay09ZSl9KSl9LHJlbW92ZUVtcHR5UmFua3M6ZnVuY3Rpb24gaFV0KHQpe3ZhciBlPWVVdC5taW4oZVV0Lm1hcCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGUpe3JldHVybiB0Lm5vZGUoZSkucmFua30pKSksbj1bXTtlVXQuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGkpe3ZhciByPXQubm9kZShpKS5yYW5rLWU7bltyXXx8KG5bcl09W10pLG5bcl0ucHVzaChpKX0pKTt2YXIgaT0wLHI9dC5ncmFwaCgpLm5vZGVSYW5rRmFjdG9yO2VVdC5mb3JFYWNoKG4sKGZ1bmN0aW9uKGUsbil7ZVV0LmlzVW5kZWZpbmVkKGUpJiZuJXIhPTA/LS1pOmkmJmVVdC5mb3JFYWNoKGUsKGZ1bmN0aW9uKGUpe3Qubm9kZShlKS5yYW5rKz1pfSkpfSkpfSxhZGRCb3JkZXJOb2RlOmZ1bmN0aW9uIGRVdCh0LGUsbixpKXt2YXIgcj17d2lkdGg6MCxoZWlnaHQ6MH07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+PTQmJihyLnJhbms9bixyLm9yZGVyPWkpLGdVdCh0LCJib3JkZXIiLHIsZSl9LG1heFJhbms6X1V0LHBhcnRpdGlvbjpmdW5jdGlvbiBwVXQodCxlKXt2YXIgbj17bGhzOltdLHJoczpbXX07cmV0dXJuIGVVdC5mb3JFYWNoKHQsKGZ1bmN0aW9uKHQpe2UodCk/bi5saHMucHVzaCh0KTpuLnJocy5wdXNoKHQpfSkpLG59LHRpbWU6ZnVuY3Rpb24gZlV0KHQsZSl7dmFyIG49ZVV0Lm5vdygpO3RyeXtyZXR1cm4gZSgpfWZpbmFsbHl7Y29uc29sZS5sb2codCsiIHRpbWU6ICIrKGVVdC5ub3coKS1uKSsibXMiKX19LG5vdGltZTpmdW5jdGlvbiBtVXQodCxlKXtyZXR1cm4gZSgpfX07ZnVuY3Rpb24gZ1V0KHQsZSxuLGkpe3ZhciByO2Rve3I9ZVV0LnVuaXF1ZUlkKGkpfXdoaWxlKHQuaGFzTm9kZShyKSk7cmV0dXJuIG4uZHVtbXk9ZSx0LnNldE5vZGUocixuKSxyfWZ1bmN0aW9uIF9VdCh0KXtyZXR1cm4gZVV0Lm1heChlVXQubWFwKHQubm9kZXMoKSwoZnVuY3Rpb24oZSl7dmFyIG49dC5ub2RlKGUpLnJhbms7aWYoIWVVdC5pc1VuZGVmaW5lZChuKSlyZXR1cm4gbn0pKSl9dmFyIHlVdD1GVnQsdlV0PWlVdCxiVXQ9e3J1bjpmdW5jdGlvbiB4VXQodCl7dC5ncmFwaCgpLmR1bW15Q2hhaW5zPVtdLHlVdC5mb3JFYWNoKHQuZWRnZXMoKSwoZnVuY3Rpb24oZSl7IShmdW5jdGlvbiBuKHQsZSl7dmFyIG4saSxyLG89ZS52LGE9dC5ub2RlKG8pLnJhbmsscz1lLncsbD10Lm5vZGUocykucmFuayxjPWUubmFtZSx1PXQuZWRnZShlKSxoPXUubGFiZWxSYW5rO2lmKGwhPT1hKzEpe2Zvcih0LnJlbW92ZUVkZ2UoZSkscj0wLCsrYTthPGw7KytyLCsrYSl1LnBvaW50cz1bXSxuPXZVdC5hZGREdW1teU5vZGUodCwiZWRnZSIsaT17d2lkdGg6MCxoZWlnaHQ6MCxlZGdlTGFiZWw6dSxlZGdlT2JqOmUscmFuazphfSwiX2QiKSxhPT09aCYmKGkud2lkdGg9dS53aWR0aCxpLmhlaWdodD11LmhlaWdodCxpLmR1bW15PSJlZGdlLWxhYmVsIixpLmxhYmVscG9zPXUubGFiZWxwb3MpLHQuc2V0RWRnZShvLG4se3dlaWdodDp1LndlaWdodH0sYyksMD09PXImJnQuZ3JhcGgoKS5kdW1teUNoYWlucy5wdXNoKG4pLG89bjt0LnNldEVkZ2UobyxzLHt3ZWlnaHQ6dS53ZWlnaHR9LGMpfX0pKHQsZSl9KSl9LHVuZG86ZnVuY3Rpb24gd1V0KHQpe3lVdC5mb3JFYWNoKHQuZ3JhcGgoKS5kdW1teUNoYWlucywoZnVuY3Rpb24oZSl7dmFyIG4saT10Lm5vZGUoZSkscj1pLmVkZ2VMYWJlbDtmb3IodC5zZXRFZGdlKGkuZWRnZU9iaixyKTtpLmR1bW15OyluPXQuc3VjY2Vzc29ycyhlKVswXSx0LnJlbW92ZU5vZGUoZSksci5wb2ludHMucHVzaCh7eDppLngseTppLnl9KSwiZWRnZS1sYWJlbCI9PT1pLmR1bW15JiYoci54PWkueCxyLnk9aS55LHIud2lkdGg9aS53aWR0aCxyLmhlaWdodD1pLmhlaWdodCksaT10Lm5vZGUoZT1uKX0pKX19LFNVdD1GVnQsTVV0PWZ1bmN0aW9uIEVVdCh0KXt2YXIgZT17fTtTVXQuZm9yRWFjaCh0LnNvdXJjZXMoKSwoZnVuY3Rpb24gbihpKXt2YXIgcj10Lm5vZGUoaSk7aWYoU1V0LmhhcyhlLGkpKXJldHVybiByLnJhbms7ZVtpXT0hMDt2YXIgbz1TVXQubWluKFNVdC5tYXAodC5vdXRFZGdlcyhpKSwoZnVuY3Rpb24oZSl7cmV0dXJuIG4oZS53KS10LmVkZ2UoZSkubWlubGVufSkpKTtyZXR1cm4gbyE9PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSYmbnVsbCE9b3x8KG89MCksci5yYW5rPW99KSl9LFRVdD1mdW5jdGlvbiBDVXQodCxlKXtyZXR1cm4gdC5ub2RlKGUudykucmFuay10Lm5vZGUoZS52KS5yYW5rLXQuZWRnZShlKS5taW5sZW59LEFVdD1GVnQsa1V0PW9IdC5HcmFwaCxMVXQ9VFV0LFBVdD1mdW5jdGlvbiBOVXQodCl7dmFyIGUsbixpPW5ldyBrVXQoe2RpcmVjdGVkOiExfSkscj10Lm5vZGVzKClbMF0sbz10Lm5vZGVDb3VudCgpO2ZvcihpLnNldE5vZGUocix7fSk7SVV0KGksdCk8bzspZT1SVXQoaSx0KSxuPWkuaGFzTm9kZShlLnYpP0xVdCh0LGUpOi1MVXQodCxlKSxPVXQoaSx0LG4pO3JldHVybiBpfTtmdW5jdGlvbiBJVXQodCxlKXtyZXR1cm4gQVV0LmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbiBuKGkpe0FVdC5mb3JFYWNoKGUubm9kZUVkZ2VzKGkpLChmdW5jdGlvbihyKXt2YXIgbz1yLnYsYT1pPT09bz9yLnc6bzt0Lmhhc05vZGUoYSl8fExVdChlLHIpfHwodC5zZXROb2RlKGEse30pLHQuc2V0RWRnZShpLGEse30pLG4oYSkpfSkpfSkpLHQubm9kZUNvdW50KCl9ZnVuY3Rpb24gUlV0KHQsZSl7cmV0dXJuIEFVdC5taW5CeShlLmVkZ2VzKCksKGZ1bmN0aW9uKG4pe2lmKHQuaGFzTm9kZShuLnYpIT09dC5oYXNOb2RlKG4udykpcmV0dXJuIExVdChlLG4pfSkpfWZ1bmN0aW9uIE9VdCh0LGUsbil7QVV0LmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbih0KXtlLm5vZGUodCkucmFuays9bn0pKX12YXIgelV0PUZWdCxEVXQ9UFV0LEJVdD1UVXQsSFV0PU1VdCxGVXQ9b0h0LmFsZy5wcmVvcmRlcixWVXQ9b0h0LmFsZy5wb3N0b3JkZXIsVVV0PWlVdC5zaW1wbGlmeSxqVXQ9R1V0O2Z1bmN0aW9uIEdVdCh0KXt0PVVVdCh0KSxIVXQodCk7dmFyIGUsbj1EVXQodCk7Zm9yKFlVdChuKSxXVXQobix0KTtlPSRVdChuKTspWlV0KG4sdCxlLEtVdChuLHQsZSkpfWZ1bmN0aW9uIFdVdCh0LGUpe3ZhciBuPVZVdCh0LHQubm9kZXMoKSk7bj1uLnNsaWNlKDAsbi5sZW5ndGgtMSkselV0LmZvckVhY2gobiwoZnVuY3Rpb24obil7IShmdW5jdGlvbiBpKHQsZSxuKXt2YXIgaT10Lm5vZGUobik7dC5lZGdlKG4saS5wYXJlbnQpLmN1dHZhbHVlPXFVdCh0LGUsbil9KSh0LGUsbil9KSl9ZnVuY3Rpb24gcVV0KHQsZSxuKXt2YXIgaT10Lm5vZGUobikucGFyZW50LHI9ITAsbz1lLmVkZ2UobixpKSxhPTA7cmV0dXJuIG98fChyPSExLG89ZS5lZGdlKGksbikpLGE9by53ZWlnaHQselV0LmZvckVhY2goZS5ub2RlRWRnZXMobiksKGZ1bmN0aW9uKG8pe3ZhciBzPW8udj09PW4sbD1zP28udzpvLnY7aWYobCE9PWkpe3ZhciBjPXM9PT1yLHU9ZS5lZGdlKG8pLndlaWdodDtpZihhKz1jP3U6LXUsKGZ1bmN0aW9uIGgodCxlLG4pe3JldHVybiB0Lmhhc0VkZ2UoZSxuKX0pKHQsbixsKSl7dmFyIGQ9dC5lZGdlKG4sbCkuY3V0dmFsdWU7YSs9Yz8tZDpkfX19KSksYX1mdW5jdGlvbiBZVXQodCxlKXthcmd1bWVudHMubGVuZ3RoPDImJihlPXQubm9kZXMoKVswXSksWFV0KHQse30sMSxlKX1mdW5jdGlvbiBYVXQodCxlLG4saSxyKXt2YXIgbz1uLGE9dC5ub2RlKGkpO3JldHVybiBlW2ldPSEwLHpVdC5mb3JFYWNoKHQubmVpZ2hib3JzKGkpLChmdW5jdGlvbihyKXt6VXQuaGFzKGUscil8fChuPVhVdCh0LGUsbixyLGkpKX0pKSxhLmxvdz1vLGEubGltPW4rKyxyP2EucGFyZW50PXI6ZGVsZXRlIGEucGFyZW50LG59ZnVuY3Rpb24gJFV0KHQpe3JldHVybiB6VXQuZmluZCh0LmVkZ2VzKCksKGZ1bmN0aW9uKGUpe3JldHVybiB0LmVkZ2UoZSkuY3V0dmFsdWU8MH0pKX1mdW5jdGlvbiBLVXQodCxlLG4pe3ZhciBpPW4udixyPW4udztlLmhhc0VkZ2UoaSxyKXx8KGk9bi53LHI9bi52KTt2YXIgbz10Lm5vZGUoaSksYT10Lm5vZGUocikscz1vLGw9ITE7by5saW0+YS5saW0mJihzPWEsbD0hMCk7dmFyIGM9elV0LmZpbHRlcihlLmVkZ2VzKCksKGZ1bmN0aW9uKGUpe3JldHVybiBsPT09SlV0KDAsdC5ub2RlKGUudikscykmJmwhPT1KVXQoMCx0Lm5vZGUoZS53KSxzKX0pKTtyZXR1cm4gelV0Lm1pbkJ5KGMsKGZ1bmN0aW9uKHQpe3JldHVybiBCVXQoZSx0KX0pKX1mdW5jdGlvbiBaVXQodCxlLG4saSl7dC5yZW1vdmVFZGdlKG4udixuLncpLHQuc2V0RWRnZShpLnYsaS53LHt9KSxZVXQodCksV1V0KHQsZSksKGZ1bmN0aW9uIHIodCxlKXt2YXIgbj16VXQuZmluZCh0Lm5vZGVzKCksKGZ1bmN0aW9uKHQpe3JldHVybiFlLm5vZGUodCkucGFyZW50fSkpLGk9RlV0KHQsbik7aT1pLnNsaWNlKDEpLHpVdC5mb3JFYWNoKGksKGZ1bmN0aW9uKG4pe3ZhciBpPXQubm9kZShuKS5wYXJlbnQscj1lLmVkZ2UobixpKSxvPSExO3J8fChyPWUuZWRnZShpLG4pLG89ITApLGUubm9kZShuKS5yYW5rPWUubm9kZShpKS5yYW5rKyhvP3IubWlubGVuOi1yLm1pbmxlbil9KSl9KSh0LGUpfWZ1bmN0aW9uIEpVdCh0LGUsbil7cmV0dXJuIG4ubG93PD1lLmxpbSYmZS5saW08PW4ubGltfUdVdC5pbml0TG93TGltVmFsdWVzPVlVdCxHVXQuaW5pdEN1dFZhbHVlcz1XVXQsR1V0LmNhbGNDdXRWYWx1ZT1xVXQsR1V0LmxlYXZlRWRnZT0kVXQsR1V0LmVudGVyRWRnZT1LVXQsR1V0LmV4Y2hhbmdlRWRnZXM9WlV0O3ZhciBRVXQ9TVV0LHRqdD1QVXQsZWp0PWpVdCxuanQ9UVV0O2Z1bmN0aW9uIGlqdCh0KXtlanQodCl9dmFyIHJqdD1GVnQsb2p0PUZWdCxhanQ9aVV0O2Z1bmN0aW9uIHNqdCh0LGUsbixpLHIsbyxhKXt2YXIgcz10LmNoaWxkcmVuKGEpO2lmKHMubGVuZ3RoKXt2YXIgbD1hanQuYWRkQm9yZGVyTm9kZSh0LCJfYnQiKSxjPWFqdC5hZGRCb3JkZXJOb2RlKHQsIl9iYiIpLHU9dC5ub2RlKGEpO3Quc2V0UGFyZW50KGwsYSksdS5ib3JkZXJUb3A9bCx0LnNldFBhcmVudChjLGEpLHUuYm9yZGVyQm90dG9tPWMsb2p0LmZvckVhY2gocywoZnVuY3Rpb24ocyl7c2p0KHQsZSxuLGkscixvLHMpO3ZhciB1PXQubm9kZShzKSxoPXUuYm9yZGVyVG9wP3UuYm9yZGVyVG9wOnMsZD11LmJvcmRlckJvdHRvbT91LmJvcmRlckJvdHRvbTpzLHA9dS5ib3JkZXJUb3A/aToyKmksZj1oIT09ZD8xOnItb1thXSsxO3Quc2V0RWRnZShsLGgse3dlaWdodDpwLG1pbmxlbjpmLG5lc3RpbmdFZGdlOiEwfSksdC5zZXRFZGdlKGQsYyx7d2VpZ2h0OnAsbWlubGVuOmYsbmVzdGluZ0VkZ2U6ITB9KX0pKSx0LnBhcmVudChhKXx8dC5zZXRFZGdlKGUsbCx7d2VpZ2h0OjAsbWlubGVuOnIrb1thXX0pfWVsc2UgYSE9PWUmJnQuc2V0RWRnZShlLGEse3dlaWdodDowLG1pbmxlbjpufSl9dmFyIGxqdD1GVnQsY2p0PWlVdDtmdW5jdGlvbiB1anQodCxlLG4saSxyLG8pe3ZhciBhPXJbZV1bby0xXSxzPWNqdC5hZGREdW1teU5vZGUodCwiYm9yZGVyIix7d2lkdGg6MCxoZWlnaHQ6MCxyYW5rOm8sYm9yZGVyVHlwZTplfSxuKTtyW2VdW29dPXMsdC5zZXRQYXJlbnQocyxpKSxhJiZ0LnNldEVkZ2UoYSxzLHt3ZWlnaHQ6MX0pfXZhciBoanQ9RlZ0O2Z1bmN0aW9uIGRqdCh0KXtoanQuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGUpe3BqdCh0Lm5vZGUoZSkpfSkpLGhqdC5mb3JFYWNoKHQuZWRnZXMoKSwoZnVuY3Rpb24oZSl7cGp0KHQuZWRnZShlKSl9KSl9ZnVuY3Rpb24gcGp0KHQpe3ZhciBlPXQud2lkdGg7dC53aWR0aD10LmhlaWdodCx0LmhlaWdodD1lfWZ1bmN0aW9uIGZqdCh0KXt0Lnk9LXQueX1mdW5jdGlvbiBtanQodCl7dmFyIGU9dC54O3QueD10LnksdC55PWV9dmFyIGdqdD1GVnQsX2p0PUZWdDtmdW5jdGlvbiB5anQodCxlLG4pe2Zvcih2YXIgaT1fanQuemlwT2JqZWN0KG4sX2p0Lm1hcChuLChmdW5jdGlvbih0LGUpe3JldHVybiBlfSkpKSxyPV9qdC5mbGF0dGVuKF9qdC5tYXAoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIF9qdC5zb3J0QnkoX2p0Lm1hcCh0Lm91dEVkZ2VzKGUpLChmdW5jdGlvbihlKXtyZXR1cm57cG9zOmlbZS53XSx3ZWlnaHQ6dC5lZGdlKGUpLndlaWdodH19KSksInBvcyIpfSkpLCEwKSxvPTE7bzxuLmxlbmd0aDspbzw8PTE7dmFyIGE9MipvLTE7by09MTt2YXIgcz1fanQubWFwKG5ldyBBcnJheShhKSwoZnVuY3Rpb24oKXtyZXR1cm4gMH0pKSxsPTA7cmV0dXJuIF9qdC5mb3JFYWNoKHIuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIGU9dC5wb3MrbztzW2VdKz10LndlaWdodDtmb3IodmFyIG49MDtlPjA7KWUlMiYmKG4rPXNbZSsxXSksc1tlPWUtMT4+MV0rPXQud2VpZ2h0O2wrPXQud2VpZ2h0Km59KSkpLGx9dmFyIHZqdD1GVnQsYmp0PUZWdCx4anQ9RlZ0LHdqdD1pVXQ7ZnVuY3Rpb24gU2p0KHQsZSxuKXtmb3IodmFyIGk7ZS5sZW5ndGgmJihpPXhqdC5sYXN0KGUpKS5pPD1uOyllLnBvcCgpLHQucHVzaChpLnZzKSxuKys7cmV0dXJuIG59dmFyIE1qdD1GVnQsRWp0PUZWdCxUanQ9b0h0LkdyYXBoLENqdD1GVnQsQWp0PUZWdCxranQ9ZnVuY3Rpb24gTGp0KHQsZSl7Zm9yKHZhciBuPTAsaT0xO2k8ZS5sZW5ndGg7KytpKW4rPXlqdCh0LGVbaS0xXSxlW2ldKTtyZXR1cm4gbn0sUGp0PWZ1bmN0aW9uIHQoZSxuLGkscil7dmFyIG89ZS5jaGlsZHJlbihuKSxhPWUubm9kZShuKSxzPWE/YS5ib3JkZXJMZWZ0OnZvaWQgMCxsPWE/YS5ib3JkZXJSaWdodDp2b2lkIDAsYz17fTtzJiYobz1NanQuZmlsdGVyKG8sKGZ1bmN0aW9uKHQpe3JldHVybiB0IT09cyYmdCE9PWx9KSkpO3ZhciB1PShmdW5jdGlvbiBoKHQsZSl7cmV0dXJuIHZqdC5tYXAoZSwoZnVuY3Rpb24oZSl7dmFyIG49dC5pbkVkZ2VzKGUpO2lmKG4ubGVuZ3RoKXt2YXIgaT12anQucmVkdWNlKG4sKGZ1bmN0aW9uKGUsbil7dmFyIGk9dC5lZGdlKG4pLHI9dC5ub2RlKG4udik7cmV0dXJue3N1bTplLnN1bStpLndlaWdodCpyLm9yZGVyLHdlaWdodDplLndlaWdodCtpLndlaWdodH19KSx7c3VtOjAsd2VpZ2h0OjB9KTtyZXR1cm57djplLGJhcnljZW50ZXI6aS5zdW0vaS53ZWlnaHQsd2VpZ2h0Omkud2VpZ2h0fX1yZXR1cm57djplfX0pKX0pKGUsbyk7TWp0LmZvckVhY2godSwoZnVuY3Rpb24obil7aWYoZS5jaGlsZHJlbihuLnYpLmxlbmd0aCl7dmFyIG89dChlLG4udixpLHIpO2Nbbi52XT1vLE1qdC5oYXMobywiYmFyeWNlbnRlciIpJiYoZnVuY3Rpb24gYSh0LGUpe01qdC5pc1VuZGVmaW5lZCh0LmJhcnljZW50ZXIpPyh0LmJhcnljZW50ZXI9ZS5iYXJ5Y2VudGVyLHQud2VpZ2h0PWUud2VpZ2h0KToodC5iYXJ5Y2VudGVyPSh0LmJhcnljZW50ZXIqdC53ZWlnaHQrZS5iYXJ5Y2VudGVyKmUud2VpZ2h0KS8odC53ZWlnaHQrZS53ZWlnaHQpLHQud2VpZ2h0Kz1lLndlaWdodCl9KShuLG8pfX0pKTt2YXIgZD0oZnVuY3Rpb24gcCh0LGUpe3ZhciBuPXt9O3JldHVybiBianQuZm9yRWFjaCh0LChmdW5jdGlvbih0LGUpe3ZhciBpPW5bdC52XT17aW5kZWdyZWU6MCxpbjpbXSxvdXQ6W10sdnM6W3Qudl0saTplfTtianQuaXNVbmRlZmluZWQodC5iYXJ5Y2VudGVyKXx8KGkuYmFyeWNlbnRlcj10LmJhcnljZW50ZXIsaS53ZWlnaHQ9dC53ZWlnaHQpfSkpLGJqdC5mb3JFYWNoKGUuZWRnZXMoKSwoZnVuY3Rpb24odCl7dmFyIGU9blt0LnZdLGk9blt0LnddO2JqdC5pc1VuZGVmaW5lZChlKXx8Ymp0LmlzVW5kZWZpbmVkKGkpfHwoaS5pbmRlZ3JlZSsrLGUub3V0LnB1c2goblt0LnddKSl9KSksKGZ1bmN0aW9uIGkodCl7dmFyIGU9W107ZnVuY3Rpb24gbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7ZS5tZXJnZWR8fChianQuaXNVbmRlZmluZWQoZS5iYXJ5Y2VudGVyKXx8Ymp0LmlzVW5kZWZpbmVkKHQuYmFyeWNlbnRlcil8fGUuYmFyeWNlbnRlcj49dC5iYXJ5Y2VudGVyKSYmKGZ1bmN0aW9uIG4odCxlKXt2YXIgbj0wLGk9MDt0LndlaWdodCYmKG4rPXQuYmFyeWNlbnRlcip0LndlaWdodCxpKz10LndlaWdodCksZS53ZWlnaHQmJihuKz1lLmJhcnljZW50ZXIqZS53ZWlnaHQsaSs9ZS53ZWlnaHQpLHQudnM9ZS52cy5jb25jYXQodC52cyksdC5iYXJ5Y2VudGVyPW4vaSx0LndlaWdodD1pLHQuaT1NYXRoLm1pbihlLmksdC5pKSxlLm1lcmdlZD0hMH0pKHQsZSl9fWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe24uaW4ucHVzaChlKSwwPT0tLW4uaW5kZWdyZWUmJnQucHVzaChuKX19Zm9yKDt0Lmxlbmd0aDspe3ZhciByPXQucG9wKCk7ZS5wdXNoKHIpLGJqdC5mb3JFYWNoKHIuaW4ucmV2ZXJzZSgpLG4ocikpLGJqdC5mb3JFYWNoKHIub3V0LGkocikpfXJldHVybiBianQubWFwKGJqdC5maWx0ZXIoZSwoZnVuY3Rpb24odCl7cmV0dXJuIXQubWVyZ2VkfSkpLChmdW5jdGlvbih0KXtyZXR1cm4gYmp0LnBpY2sodCxbInZzIiwiaSIsImJhcnljZW50ZXIiLCJ3ZWlnaHQiXSl9KSl9KShianQuZmlsdGVyKG4sKGZ1bmN0aW9uKHQpe3JldHVybiF0LmluZGVncmVlfSkpKX0pKHUsaSk7IShmdW5jdGlvbiBmKHQsZSl7TWp0LmZvckVhY2godCwoZnVuY3Rpb24odCl7dC52cz1NanQuZmxhdHRlbih0LnZzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGVbdF0/ZVt0XS52czp0fSkpLCEwKX0pKX0pKGQsYyk7dmFyIG09KGZ1bmN0aW9uIGcodCxlKXt2YXIgbj13anQucGFydGl0aW9uKHQsKGZ1bmN0aW9uKHQpe3JldHVybiB4anQuaGFzKHQsImJhcnljZW50ZXIiKX0pKSxpPW4ubGhzLHI9eGp0LnNvcnRCeShuLnJocywoZnVuY3Rpb24odCl7cmV0dXJuLXQuaX0pKSxvPVtdLGE9MCxzPTAsbD0wO2kuc29ydCgoZnVuY3Rpb24gYyh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtyZXR1cm4gZS5iYXJ5Y2VudGVyPG4uYmFyeWNlbnRlcj8tMTplLmJhcnljZW50ZXI+bi5iYXJ5Y2VudGVyPzE6dD9uLmktZS5pOmUuaS1uLml9fSkoISFlKSksbD1TanQobyxyLGwpLHhqdC5mb3JFYWNoKGksKGZ1bmN0aW9uKHQpe2wrPXQudnMubGVuZ3RoLG8ucHVzaCh0LnZzKSxhKz10LmJhcnljZW50ZXIqdC53ZWlnaHQscys9dC53ZWlnaHQsbD1TanQobyxyLGwpfSkpO3ZhciB1PXt2czp4anQuZmxhdHRlbihvLCEwKX07cmV0dXJuIHMmJih1LmJhcnljZW50ZXI9YS9zLHUud2VpZ2h0PXMpLHV9KShkLHIpO2lmKHMmJihtLnZzPU1qdC5mbGF0dGVuKFtzLG0udnMsbF0sITApLGUucHJlZGVjZXNzb3JzKHMpLmxlbmd0aCkpe3ZhciBfPWUubm9kZShlLnByZWRlY2Vzc29ycyhzKVswXSkseT1lLm5vZGUoZS5wcmVkZWNlc3NvcnMobClbMF0pO01qdC5oYXMobSwiYmFyeWNlbnRlciIpfHwobS5iYXJ5Y2VudGVyPTAsbS53ZWlnaHQ9MCksbS5iYXJ5Y2VudGVyPShtLmJhcnljZW50ZXIqbS53ZWlnaHQrXy5vcmRlcit5Lm9yZGVyKS8obS53ZWlnaHQrMiksbS53ZWlnaHQrPTJ9cmV0dXJuIG19LE5qdD1vSHQuR3JhcGgsSWp0PWlVdDtmdW5jdGlvbiBSanQodCxlLG4pe3JldHVybiBBanQubWFwKGUsKGZ1bmN0aW9uKGUpe3JldHVybihmdW5jdGlvbiBpKHQsZSxuKXt2YXIgaT0oZnVuY3Rpb24gcih0KXtmb3IodmFyIGU7dC5oYXNOb2RlKGU9RWp0LnVuaXF1ZUlkKCJfcm9vdCIpKTspO3JldHVybiBlfSkodCksbz1uZXcgVGp0KHtjb21wb3VuZDohMH0pLnNldEdyYXBoKHtyb290Oml9KS5zZXREZWZhdWx0Tm9kZUxhYmVsKChmdW5jdGlvbihlKXtyZXR1cm4gdC5ub2RlKGUpfSkpO3JldHVybiBFanQuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKHIpe3ZhciBhPXQubm9kZShyKSxzPXQucGFyZW50KHIpOyhhLnJhbms9PT1lfHxhLm1pblJhbms8PWUmJmU8PWEubWF4UmFuaykmJihvLnNldE5vZGUociksby5zZXRQYXJlbnQocixzfHxpKSxFanQuZm9yRWFjaCh0W25dKHIpLChmdW5jdGlvbihlKXt2YXIgbj1lLnY9PT1yP2UudzplLnYsaT1vLmVkZ2UobixyKSxhPUVqdC5pc1VuZGVmaW5lZChpKT8wOmkud2VpZ2h0O28uc2V0RWRnZShuLHIse3dlaWdodDp0LmVkZ2UoZSkud2VpZ2h0K2F9KX0pKSxFanQuaGFzKGEsIm1pblJhbmsiKSYmby5zZXROb2RlKHIse2JvcmRlckxlZnQ6YS5ib3JkZXJMZWZ0W2VdLGJvcmRlclJpZ2h0OmEuYm9yZGVyUmlnaHRbZV19KSl9KSksb30pKHQsZSxuKX0pKX1mdW5jdGlvbiBPanQodCxlKXt2YXIgbj1uZXcgTmp0O0FqdC5mb3JFYWNoKHQsKGZ1bmN0aW9uKHQpe3ZhciBpPXQuZ3JhcGgoKS5yb290LHI9UGp0KHQsaSxuLGUpO0FqdC5mb3JFYWNoKHIudnMsKGZ1bmN0aW9uKGUsbil7dC5ub2RlKGUpLm9yZGVyPW59KSksKGZ1bmN0aW9uIG8odCxlLG4pe3ZhciBpLHI9e307Q2p0LmZvckVhY2gobiwoZnVuY3Rpb24obil7Zm9yKHZhciBvLGEscz10LnBhcmVudChuKTtzOyl7aWYoKG89dC5wYXJlbnQocykpPyhhPXJbb10scltvXT1zKTooYT1pLGk9cyksYSYmYSE9PXMpcmV0dXJuIHZvaWQgZS5zZXRFZGdlKGEscyk7cz1vfX0pKX0pKHQsbixyLnZzKX0pKX1mdW5jdGlvbiB6anQodCxlKXtBanQuZm9yRWFjaChlLChmdW5jdGlvbihlKXtBanQuZm9yRWFjaChlLChmdW5jdGlvbihlLG4pe3Qubm9kZShlKS5vcmRlcj1ufSkpfSkpfXZhciBEanQ9RlZ0LEJqdD1vSHQuR3JhcGgsSGp0PWlVdDtmdW5jdGlvbiBGanQodCxlLG4pe2lmKGU+bil7dmFyIGk9ZTtlPW4sbj1pfXZhciByPXRbZV07cnx8KHRbZV09cj17fSkscltuXT0hMH1mdW5jdGlvbiBWanQodCxlLG4pe2lmKGU+bil7dmFyIGk9ZTtlPW4sbj1pfXJldHVybiBEanQuaGFzKHRbZV0sbil9dmFyIFVqdD1GVnQsamp0PWlVdCxHanQ9RlZ0LFdqdD1KVnQscWp0PWJVdCxZanQ9aVV0Lm5vcm1hbGl6ZVJhbmtzLFhqdD1pVXQucmVtb3ZlRW1wdHlSYW5rcywkanQ9ZnVuY3Rpb24gS2p0KHQpe3ZhciBlPWFqdC5hZGREdW1teU5vZGUodCwicm9vdCIse30sIl9yb290Iiksbj0oZnVuY3Rpb24gaSh0KXt2YXIgZT17fTtmdW5jdGlvbiBuKGkscil7dmFyIG89dC5jaGlsZHJlbihpKTtvJiZvLmxlbmd0aCYmb2p0LmZvckVhY2gobywoZnVuY3Rpb24odCl7bih0LHIrMSl9KSksZVtpXT1yfXJldHVybiBvanQuZm9yRWFjaCh0LmNoaWxkcmVuKCksKGZ1bmN0aW9uKHQpe24odCwxKX0pKSxlfSkodCkscj1vanQubWF4KG9qdC52YWx1ZXMobikpLTEsbz0yKnIrMTt0LmdyYXBoKCkubmVzdGluZ1Jvb3Q9ZSxvanQuZm9yRWFjaCh0LmVkZ2VzKCksKGZ1bmN0aW9uKGUpe3QuZWRnZShlKS5taW5sZW4qPW99KSk7dmFyIGE9KGZ1bmN0aW9uIHModCl7cmV0dXJuIG9qdC5yZWR1Y2UodC5lZGdlcygpLChmdW5jdGlvbihlLG4pe3JldHVybiBlK3QuZWRnZShuKS53ZWlnaHR9KSwwKX0pKHQpKzE7b2p0LmZvckVhY2godC5jaGlsZHJlbigpLChmdW5jdGlvbihpKXtzanQodCxlLG8sYSxyLG4saSl9KSksdC5ncmFwaCgpLm5vZGVSYW5rRmFjdG9yPW99LFpqdD1pVXQsSmp0PW9IdC5HcmFwaCxRanQ9WyJub2Rlc2VwIiwiZWRnZXNlcCIsInJhbmtzZXAiLCJtYXJnaW54IiwibWFyZ2lueSJdLHRHdD17cmFua3NlcDo1MCxlZGdlc2VwOjIwLG5vZGVzZXA6NTAscmFua2RpcjoidGIifSxlR3Q9WyJhY3ljbGljZXIiLCJyYW5rZXIiLCJyYW5rZGlyIiwiYWxpZ24iXSxuR3Q9WyJ3aWR0aCIsImhlaWdodCJdLGlHdD17d2lkdGg6MCxoZWlnaHQ6MH0sckd0PVsibWlubGVuIiwid2VpZ2h0Iiwid2lkdGgiLCJoZWlnaHQiLCJsYWJlbG9mZnNldCJdLG9HdD17bWlubGVuOjEsd2VpZ2h0OjEsd2lkdGg6MCxoZWlnaHQ6MCxsYWJlbG9mZnNldDoxMCxsYWJlbHBvczoiciJ9LGFHdD1bImxhYmVscG9zIl07ZnVuY3Rpb24gc0d0KHQsZSl7cmV0dXJuIEdqdC5tYXBWYWx1ZXMoR2p0LnBpY2sodCxlKSxOdW1iZXIpfWZ1bmN0aW9uIGxHdCh0KXt2YXIgZT17fTtyZXR1cm4gR2p0LmZvckVhY2godCwoZnVuY3Rpb24odCxuKXtlW24udG9Mb3dlckNhc2UoKV09dH0pKSxlfXZhciBjR3QsdUd0LGhHdD1GVnQsZEd0PWlVdCxwR3Q9b0h0LkdyYXBoLGZHdD17Z3JhcGhsaWI6b0h0LGxheW91dDpmdW5jdGlvbiBtR3QodCxlKXt2YXIgbj1lJiZlLmRlYnVnVGltaW5nP1pqdC50aW1lOlpqdC5ub3RpbWU7bigibGF5b3V0IiwoZnVuY3Rpb24oKXt2YXIgZT1uKCIgIGJ1aWxkTGF5b3V0R3JhcGgiLChmdW5jdGlvbigpe3JldHVybihmdW5jdGlvbiBlKHQpe3ZhciBlPW5ldyBKanQoe211bHRpZ3JhcGg6ITAsY29tcG91bmQ6ITB9KSxuPWxHdCh0LmdyYXBoKCkpO3JldHVybiBlLnNldEdyYXBoKEdqdC5tZXJnZSh7fSx0R3Qsc0d0KG4sUWp0KSxHanQucGljayhuLGVHdCkpKSxHanQuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKG4pe3ZhciBpPWxHdCh0Lm5vZGUobikpO2Uuc2V0Tm9kZShuLEdqdC5kZWZhdWx0cyhzR3QoaSxuR3QpLGlHdCkpLGUuc2V0UGFyZW50KG4sdC5wYXJlbnQobikpfSkpLEdqdC5mb3JFYWNoKHQuZWRnZXMoKSwoZnVuY3Rpb24obil7dmFyIGk9bEd0KHQuZWRnZShuKSk7ZS5zZXRFZGdlKG4sR2p0Lm1lcmdlKHt9LG9HdCxzR3QoaSxyR3QpLEdqdC5waWNrKGksYUd0KSkpfSkpLGV9KSh0KX0pKTtuKCIgIHJ1bkxheW91dCIsKGZ1bmN0aW9uKCl7IShmdW5jdGlvbiB0KGUsbil7bigiICAgIG1ha2VTcGFjZUZvckVkZ2VMYWJlbHMiLChmdW5jdGlvbigpeyEoZnVuY3Rpb24gdChlKXt2YXIgbj1lLmdyYXBoKCk7bi5yYW5rc2VwLz0yLEdqdC5mb3JFYWNoKGUuZWRnZXMoKSwoZnVuY3Rpb24odCl7dmFyIGk9ZS5lZGdlKHQpO2kubWlubGVuKj0yLCJjIiE9PWkubGFiZWxwb3MudG9Mb3dlckNhc2UoKSYmKCJUQiI9PT1uLnJhbmtkaXJ8fCJCVCI9PT1uLnJhbmtkaXI/aS53aWR0aCs9aS5sYWJlbG9mZnNldDppLmhlaWdodCs9aS5sYWJlbG9mZnNldCl9KSl9KShlKX0pKSxuKCIgICAgcmVtb3ZlU2VsZkVkZ2VzIiwoZnVuY3Rpb24oKXshKGZ1bmN0aW9uIHQoZSl7R2p0LmZvckVhY2goZS5lZGdlcygpLChmdW5jdGlvbih0KXtpZih0LnY9PT10Lncpe3ZhciBuPWUubm9kZSh0LnYpO24uc2VsZkVkZ2VzfHwobi5zZWxmRWRnZXM9W10pLG4uc2VsZkVkZ2VzLnB1c2goe2U6dCxsYWJlbDplLmVkZ2UodCl9KSxlLnJlbW92ZUVkZ2UodCl9fSkpfSkoZSl9KSksbigiICAgIGFjeWNsaWMiLChmdW5jdGlvbigpe1dqdC5ydW4oZSl9KSksbigiICAgIG5lc3RpbmdHcmFwaC5ydW4iLChmdW5jdGlvbigpeyRqdChlKX0pKSxuKCIgICAgcmFuayIsKGZ1bmN0aW9uKCl7IShmdW5jdGlvbiB0KGUpe3N3aXRjaChlLmdyYXBoKCkucmFua2VyKXtjYXNlIm5ldHdvcmstc2ltcGxleCI6aWp0KGUpO2JyZWFrO2Nhc2UidGlnaHQtdHJlZSI6IShmdW5jdGlvbiBuKHQpe1FVdCh0KSx0anQodCl9KShlKTticmVhaztjYXNlImxvbmdlc3QtcGF0aCI6bmp0KGUpO2JyZWFrO2RlZmF1bHQ6aWp0KGUpfX0pKFpqdC5hc05vbkNvbXBvdW5kR3JhcGgoZSkpfSkpLG4oIiAgICBpbmplY3RFZGdlTGFiZWxQcm94aWVzIiwoZnVuY3Rpb24oKXshKGZ1bmN0aW9uIHQoZSl7R2p0LmZvckVhY2goZS5lZGdlcygpLChmdW5jdGlvbih0KXt2YXIgbj1lLmVkZ2UodCk7aWYobi53aWR0aCYmbi5oZWlnaHQpe3ZhciBpPWUubm9kZSh0LnYpLHI9ZS5ub2RlKHQudyk7Wmp0LmFkZER1bW15Tm9kZShlLCJlZGdlLXByb3h5Iix7cmFuazooci5yYW5rLWkucmFuaykvMitpLnJhbmssZTp0fSwiX2VwIil9fSkpfSkoZSl9KSksbigiICAgIHJlbW92ZUVtcHR5UmFua3MiLChmdW5jdGlvbigpe1hqdChlKX0pKSxuKCIgICAgbmVzdGluZ0dyYXBoLmNsZWFudXAiLChmdW5jdGlvbigpeyEoZnVuY3Rpb24gdChlKXt2YXIgbj1lLmdyYXBoKCk7ZS5yZW1vdmVOb2RlKG4ubmVzdGluZ1Jvb3QpLGRlbGV0ZSBuLm5lc3RpbmdSb290LG9qdC5mb3JFYWNoKGUuZWRnZXMoKSwoZnVuY3Rpb24odCl7ZS5lZGdlKHQpLm5lc3RpbmdFZGdlJiZlLnJlbW92ZUVkZ2UodCl9KSl9KShlKX0pKSxuKCIgICAgbm9ybWFsaXplUmFua3MiLChmdW5jdGlvbigpe1lqdChlKX0pKSxuKCIgICAgYXNzaWduUmFua01pbk1heCIsKGZ1bmN0aW9uKCl7IShmdW5jdGlvbiB0KGUpe3ZhciBuPTA7R2p0LmZvckVhY2goZS5ub2RlcygpLChmdW5jdGlvbih0KXt2YXIgaT1lLm5vZGUodCk7aS5ib3JkZXJUb3AmJihpLm1pblJhbms9ZS5ub2RlKGkuYm9yZGVyVG9wKS5yYW5rLGkubWF4UmFuaz1lLm5vZGUoaS5ib3JkZXJCb3R0b20pLnJhbmssbj1HanQubWF4KG4saS5tYXhSYW5rKSl9KSksZS5ncmFwaCgpLm1heFJhbms9bn0pKGUpfSkpLG4oIiAgICByZW1vdmVFZGdlTGFiZWxQcm94aWVzIiwoZnVuY3Rpb24oKXshKGZ1bmN0aW9uIHQoZSl7R2p0LmZvckVhY2goZS5ub2RlcygpLChmdW5jdGlvbih0KXt2YXIgbj1lLm5vZGUodCk7ImVkZ2UtcHJveHkiPT09bi5kdW1teSYmKGUuZWRnZShuLmUpLmxhYmVsUmFuaz1uLnJhbmssZS5yZW1vdmVOb2RlKHQpKX0pKX0pKGUpfSkpLG4oIiAgICBub3JtYWxpemUucnVuIiwoZnVuY3Rpb24oKXtxanQucnVuKGUpfSkpLG4oIiAgICBwYXJlbnREdW1teUNoYWlucyIsKGZ1bmN0aW9uKCl7IShmdW5jdGlvbiB0KGUpe3ZhciBuPShmdW5jdGlvbiBpKHQpe3ZhciBlPXt9LG49MDtyZXR1cm4gcmp0LmZvckVhY2godC5jaGlsZHJlbigpLChmdW5jdGlvbiBpKHIpe3ZhciBvPW47cmp0LmZvckVhY2godC5jaGlsZHJlbihyKSxpKSxlW3JdPXtsb3c6byxsaW06bisrfX0pKSxlfSkoZSk7cmp0LmZvckVhY2goZS5ncmFwaCgpLmR1bW15Q2hhaW5zLChmdW5jdGlvbih0KXtmb3IodmFyIGk9ZS5ub2RlKHQpLHI9aS5lZGdlT2JqLG89KGZ1bmN0aW9uIGEodCxlLG4saSl7dmFyIHIsbyxhPVtdLHM9W10sbD1NYXRoLm1pbihlW25dLmxvdyxlW2ldLmxvdyksYz1NYXRoLm1heChlW25dLmxpbSxlW2ldLmxpbSk7cj1uO2Rve3I9dC5wYXJlbnQociksYS5wdXNoKHIpfXdoaWxlKHImJihlW3JdLmxvdz5sfHxjPmVbcl0ubGltKSk7Zm9yKG89cixyPWk7KHI9dC5wYXJlbnQocikpIT09bzspcy5wdXNoKHIpO3JldHVybntwYXRoOmEuY29uY2F0KHMucmV2ZXJzZSgpKSxsY2E6b319KShlLG4sci52LHIudykscz1vLnBhdGgsbD1vLmxjYSxjPTAsdT1zW2NdLGg9ITA7dCE9PXIudzspe2lmKGk9ZS5ub2RlKHQpLGgpe2Zvcig7KHU9c1tjXSkhPT1sJiZlLm5vZGUodSkubWF4UmFuazxpLnJhbms7KWMrKzt1PT09bCYmKGg9ITEpfWlmKCFoKXtmb3IoO2M8cy5sZW5ndGgtMSYmZS5ub2RlKHU9c1tjKzFdKS5taW5SYW5rPD1pLnJhbms7KWMrKzt1PXNbY119ZS5zZXRQYXJlbnQodCx1KSx0PWUuc3VjY2Vzc29ycyh0KVswXX19KSl9KShlKX0pKSxuKCIgICAgYWRkQm9yZGVyU2VnbWVudHMiLChmdW5jdGlvbigpeyEoZnVuY3Rpb24gdChlKXtsanQuZm9yRWFjaChlLmNoaWxkcmVuKCksKGZ1bmN0aW9uIHQobil7dmFyIGk9ZS5jaGlsZHJlbihuKSxyPWUubm9kZShuKTtpZihpLmxlbmd0aCYmbGp0LmZvckVhY2goaSx0KSxsanQuaGFzKHIsIm1pblJhbmsiKSl7ci5ib3JkZXJMZWZ0PVtdLHIuYm9yZGVyUmlnaHQ9W107Zm9yKHZhciBvPXIubWluUmFuayxhPXIubWF4UmFuaysxO288YTsrK28pdWp0KGUsImJvcmRlckxlZnQiLCJfYmwiLG4scixvKSx1anQoZSwiYm9yZGVyUmlnaHQiLCJfYnIiLG4scixvKX19KSl9KShlKX0pKSxuKCIgICAgb3JkZXIiLChmdW5jdGlvbigpeyEoZnVuY3Rpb24gdChlKXt2YXIgbj1JanQubWF4UmFuayhlKSxpPVJqdChlLEFqdC5yYW5nZSgxLG4rMSksImluRWRnZXMiKSxyPVJqdChlLEFqdC5yYW5nZShuLTEsLTEsLTEpLCJvdXRFZGdlcyIpLG89KGZ1bmN0aW9uIGEodCl7dmFyIGU9e30sbj1nanQuZmlsdGVyKHQubm9kZXMoKSwoZnVuY3Rpb24oZSl7cmV0dXJuIXQuY2hpbGRyZW4oZSkubGVuZ3RofSkpLGk9Z2p0Lm1heChnanQubWFwKG4sKGZ1bmN0aW9uKGUpe3JldHVybiB0Lm5vZGUoZSkucmFua30pKSkscj1nanQubWFwKGdqdC5yYW5nZShpKzEpLChmdW5jdGlvbigpe3JldHVybltdfSkpLG89Z2p0LnNvcnRCeShuLChmdW5jdGlvbihlKXtyZXR1cm4gdC5ub2RlKGUpLnJhbmt9KSk7cmV0dXJuIGdqdC5mb3JFYWNoKG8sKGZ1bmN0aW9uIG4oaSl7aWYoIWdqdC5oYXMoZSxpKSl7ZVtpXT0hMDt2YXIgbz10Lm5vZGUoaSk7cltvLnJhbmtdLnB1c2goaSksZ2p0LmZvckVhY2godC5zdWNjZXNzb3JzKGkpLG4pfX0pKSxyfSkoZSk7emp0KGUsbyk7Zm9yKHZhciBzLGw9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGM9MCx1PTA7dTw0OysrYywrK3Upe09qdChjJTI/aTpyLGMlND49Miksbz1JanQuYnVpbGRMYXllck1hdHJpeChlKTt2YXIgaD1ranQoZSxvKTtoPGwmJih1PTAscz1BanQuY2xvbmVEZWVwKG8pLGw9aCl9emp0KGUscyl9KShlKX0pKSxuKCIgICAgaW5zZXJ0U2VsZkVkZ2VzIiwoZnVuY3Rpb24oKXshKGZ1bmN0aW9uIHQoZSl7dmFyIG49Wmp0LmJ1aWxkTGF5ZXJNYXRyaXgoZSk7R2p0LmZvckVhY2gobiwoZnVuY3Rpb24odCl7dmFyIG49MDtHanQuZm9yRWFjaCh0LChmdW5jdGlvbih0LGkpe3ZhciByPWUubm9kZSh0KTtyLm9yZGVyPWkrbixHanQuZm9yRWFjaChyLnNlbGZFZGdlcywoZnVuY3Rpb24odCl7Wmp0LmFkZER1bW15Tm9kZShlLCJzZWxmZWRnZSIse3dpZHRoOnQubGFiZWwud2lkdGgsaGVpZ2h0OnQubGFiZWwuaGVpZ2h0LHJhbms6ci5yYW5rLG9yZGVyOmkrICsrbixlOnQuZSxsYWJlbDp0LmxhYmVsfSwiX3NlIil9KSksZGVsZXRlIHIuc2VsZkVkZ2VzfSkpfSkpfSkoZSl9KSksbigiICAgIGFkanVzdENvb3JkaW5hdGVTeXN0ZW0iLChmdW5jdGlvbigpeyEoZnVuY3Rpb24gdChlKXt2YXIgbj1lLmdyYXBoKCkucmFua2Rpci50b0xvd2VyQ2FzZSgpOyJsciIhPT1uJiYicmwiIT09bnx8ZGp0KGUpfSkoZSl9KSksbigiICAgIHBvc2l0aW9uIiwoZnVuY3Rpb24oKXshKGZ1bmN0aW9uIHQoZSl7KGZ1bmN0aW9uIG4odCl7dmFyIGU9amp0LmJ1aWxkTGF5ZXJNYXRyaXgodCksbj10LmdyYXBoKCkucmFua3NlcCxpPTA7VWp0LmZvckVhY2goZSwoZnVuY3Rpb24oZSl7dmFyIHI9VWp0Lm1heChVanQubWFwKGUsKGZ1bmN0aW9uKGUpe3JldHVybiB0Lm5vZGUoZSkuaGVpZ2h0fSkpKTtVanQuZm9yRWFjaChlLChmdW5jdGlvbihlKXt0Lm5vZGUoZSkueT1pK3IvMn0pKSxpKz1yK259KSl9KShlPWpqdC5hc05vbkNvbXBvdW5kR3JhcGgoZSkpLFVqdC5mb3JFYWNoKChmdW5jdGlvbiBpKHQpe3ZhciBlLG49SGp0LmJ1aWxkTGF5ZXJNYXRyaXgodCksaT1EanQubWVyZ2UoKGZ1bmN0aW9uIHIodCxlKXt2YXIgbj17fTtyZXR1cm4gRGp0LnJlZHVjZShlLChmdW5jdGlvbiBpKGUscil7dmFyIG89MCxhPTAscz1lLmxlbmd0aCxsPURqdC5sYXN0KHIpO3JldHVybiBEanQuZm9yRWFjaChyLChmdW5jdGlvbihlLGkpe3ZhciBjPShmdW5jdGlvbiB1KHQsZSl7aWYodC5ub2RlKGUpLmR1bW15KXJldHVybiBEanQuZmluZCh0LnByZWRlY2Vzc29ycyhlKSwoZnVuY3Rpb24oZSl7cmV0dXJuIHQubm9kZShlKS5kdW1teX0pKX0pKHQsZSksaD1jP3Qubm9kZShjKS5vcmRlcjpzOyhjfHxlPT09bCkmJihEanQuZm9yRWFjaChyLnNsaWNlKGEsaSsxKSwoZnVuY3Rpb24oZSl7RGp0LmZvckVhY2godC5wcmVkZWNlc3NvcnMoZSksKGZ1bmN0aW9uKGkpe3ZhciByPXQubm9kZShpKSxhPXIub3JkZXI7IShhPG98fGg8YSl8fHIuZHVtbXkmJnQubm9kZShlKS5kdW1teXx8Rmp0KG4saSxlKX0pKX0pKSxhPWkrMSxvPWgpfSkpLHJ9KSksbn0pKHQsbiksKGZ1bmN0aW9uIG8odCxlKXt2YXIgbj17fTtmdW5jdGlvbiBpKGUsaSxyLG8sYSl7dmFyIHM7RGp0LmZvckVhY2goRGp0LnJhbmdlKGksciksKGZ1bmN0aW9uKGkpe3Qubm9kZShzPWVbaV0pLmR1bW15JiZEanQuZm9yRWFjaCh0LnByZWRlY2Vzc29ycyhzKSwoZnVuY3Rpb24oZSl7dmFyIGk9dC5ub2RlKGUpO2kuZHVtbXkmJihpLm9yZGVyPG98fGkub3JkZXI+YSkmJkZqdChuLGUscyl9KSl9KSl9cmV0dXJuIERqdC5yZWR1Y2UoZSwoZnVuY3Rpb24gcihlLG4pe3ZhciByLG89LTEsYT0wO3JldHVybiBEanQuZm9yRWFjaChuLChmdW5jdGlvbihzLGwpe2lmKCJib3JkZXIiPT09dC5ub2RlKHMpLmR1bW15KXt2YXIgYz10LnByZWRlY2Vzc29ycyhzKTtjLmxlbmd0aCYmKHI9dC5ub2RlKGNbMF0pLm9yZGVyLGkobixhLGwsbyxyKSxhPWwsbz1yKX1pKG4sYSxuLmxlbmd0aCxyLGUubGVuZ3RoKX0pKSxufSkpLG59KSh0LG4pKSxhPXt9O0RqdC5mb3JFYWNoKFsidSIsImQiXSwoZnVuY3Rpb24ocil7ZT0idSI9PT1yP246RGp0LnZhbHVlcyhuKS5yZXZlcnNlKCksRGp0LmZvckVhY2goWyJsIiwiciJdLChmdW5jdGlvbihuKXsiciI9PT1uJiYoZT1EanQubWFwKGUsKGZ1bmN0aW9uKHQpe3JldHVybiBEanQudmFsdWVzKHQpLnJldmVyc2UoKX0pKSk7dmFyIG89KCJ1Ij09PXI/dC5wcmVkZWNlc3NvcnM6dC5zdWNjZXNzb3JzKS5iaW5kKHQpLHM9KGZ1bmN0aW9uIGwodCxlLG4saSl7dmFyIHI9e30sbz17fSxhPXt9O3JldHVybiBEanQuZm9yRWFjaChlLChmdW5jdGlvbih0KXtEanQuZm9yRWFjaCh0LChmdW5jdGlvbih0LGUpe3JbdF09dCxvW3RdPXQsYVt0XT1lfSkpfSkpLERqdC5mb3JFYWNoKGUsKGZ1bmN0aW9uKHQpe3ZhciBlPS0xO0RqdC5mb3JFYWNoKHQsKGZ1bmN0aW9uKHQpe3ZhciBzPWkodCk7aWYocy5sZW5ndGgpZm9yKHZhciBsPSgocz1EanQuc29ydEJ5KHMsKGZ1bmN0aW9uKHQpe3JldHVybiBhW3RdfSkpKS5sZW5ndGgtMSkvMixjPU1hdGguZmxvb3IobCksdT1NYXRoLmNlaWwobCk7Yzw9dTsrK2Mpe3ZhciBoPXNbY107b1t0XT09PXQmJmU8YVtoXSYmIVZqdChuLHQsaCkmJihvW2hdPXQsb1t0XT1yW3RdPXJbaF0sZT1hW2hdKX19KSl9KSkse3Jvb3Q6cixhbGlnbjpvfX0pKDAsZSxpLG8pLGM9KGZ1bmN0aW9uIHUodCxlLG4saSxyKXt2YXIgbz17fSxhPShmdW5jdGlvbiBzKHQsZSxuLGkpe3ZhciByPW5ldyBCanQsbz10LmdyYXBoKCksYT0oZnVuY3Rpb24gcyh0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKGkscixvKXt2YXIgYSxzPWkubm9kZShyKSxsPWkubm9kZShvKSxjPTA7aWYoYys9cy53aWR0aC8yLERqdC5oYXMocywibGFiZWxwb3MiKSlzd2l0Y2gocy5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpKXtjYXNlImwiOmE9LXMud2lkdGgvMjticmVhaztjYXNlInIiOmE9cy53aWR0aC8yfWlmKGEmJihjKz1uP2E6LWEpLGE9MCxjKz0ocy5kdW1teT9lOnQpLzIsYys9KGwuZHVtbXk/ZTp0KS8yLGMrPWwud2lkdGgvMixEanQuaGFzKGwsImxhYmVscG9zIikpc3dpdGNoKGwubGFiZWxwb3MudG9Mb3dlckNhc2UoKSl7Y2FzZSJsIjphPWwud2lkdGgvMjticmVhaztjYXNlInIiOmE9LWwud2lkdGgvMn1yZXR1cm4gYSYmKGMrPW4/YTotYSksYT0wLGN9fSkoby5ub2Rlc2VwLG8uZWRnZXNlcCxpKTtyZXR1cm4gRGp0LmZvckVhY2goZSwoZnVuY3Rpb24oZSl7dmFyIGk7RGp0LmZvckVhY2goZSwoZnVuY3Rpb24oZSl7dmFyIG89bltlXTtpZihyLnNldE5vZGUobyksaSl7dmFyIHM9bltpXSxsPXIuZWRnZShzLG8pO3Iuc2V0RWRnZShzLG8sTWF0aC5tYXgoYSh0LGUsaSksbHx8MCkpfWk9ZX0pKX0pKSxyfSkodCxlLG4sciksbD1yPyJib3JkZXJMZWZ0IjoiYm9yZGVyUmlnaHQiO2Z1bmN0aW9uIGModCxlKXtmb3IodmFyIG49YS5ub2RlcygpLGk9bi5wb3AoKSxyPXt9O2k7KXJbaV0/dChpKToocltpXT0hMCxuLnB1c2goaSksbj1uLmNvbmNhdChlKGkpKSksaT1uLnBvcCgpfXJldHVybiBjKChmdW5jdGlvbiB1KHQpe29bdF09YS5pbkVkZ2VzKHQpLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5tYXgodCxvW2Uudl0rYS5lZGdlKGUpKX0pLDApfSksYS5wcmVkZWNlc3NvcnMuYmluZChhKSksYygoZnVuY3Rpb24gaChlKXt2YXIgbj1hLm91dEVkZ2VzKGUpLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gTWF0aC5taW4odCxvW2Uud10tYS5lZGdlKGUpKX0pLE51bWJlci5QT1NJVElWRV9JTkZJTklUWSksaT10Lm5vZGUoZSk7biE9PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSYmaS5ib3JkZXJUeXBlIT09bCYmKG9bZV09TWF0aC5tYXgob1tlXSxuKSl9KSxhLnN1Y2Nlc3NvcnMuYmluZChhKSksRGp0LmZvckVhY2goaSwoZnVuY3Rpb24odCl7b1t0XT1vW25bdF1dfSkpLG99KSh0LGUscy5yb290LHMuYWxpZ24sInIiPT09bik7InIiPT09biYmKGM9RGp0Lm1hcFZhbHVlcyhjLChmdW5jdGlvbih0KXtyZXR1cm4tdH0pKSksYVtyK25dPWN9KSl9KSk7dmFyIHM9KGZ1bmN0aW9uIGwodCxlKXtyZXR1cm4gRGp0Lm1pbkJ5KERqdC52YWx1ZXMoZSksKGZ1bmN0aW9uKGUpe3ZhciBuPU51bWJlci5ORUdBVElWRV9JTkZJTklUWSxpPU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtyZXR1cm4gRGp0LmZvckluKGUsKGZ1bmN0aW9uKGUscil7dmFyIG89KGZ1bmN0aW9uIGEodCxlKXtyZXR1cm4gdC5ub2RlKGUpLndpZHRofSkodCxyKS8yO249TWF0aC5tYXgoZStvLG4pLGk9TWF0aC5taW4oZS1vLGkpfSkpLG4taX0pKX0pKHQsYSk7cmV0dXJuKGZ1bmN0aW9uIGModCxlKXt2YXIgbj1EanQudmFsdWVzKGUpLGk9RGp0Lm1pbihuKSxyPURqdC5tYXgobik7RGp0LmZvckVhY2goWyJ1IiwiZCJdLChmdW5jdGlvbihuKXtEanQuZm9yRWFjaChbImwiLCJyIl0sKGZ1bmN0aW9uKG8pe3ZhciBhLHM9bitvLGw9dFtzXTtpZihsIT09ZSl7dmFyIGM9RGp0LnZhbHVlcyhsKTsoYT0ibCI9PT1vP2ktRGp0Lm1pbihjKTpyLURqdC5tYXgoYykpJiYodFtzXT1EanQubWFwVmFsdWVzKGwsKGZ1bmN0aW9uKHQpe3JldHVybiB0K2F9KSkpfX0pKX0pKX0pKGEscyksKGZ1bmN0aW9uIHUodCxlKXtyZXR1cm4gRGp0Lm1hcFZhbHVlcyh0LnVsLChmdW5jdGlvbihuLGkpe2lmKGUpcmV0dXJuIHRbZS50b0xvd2VyQ2FzZSgpXVtpXTt2YXIgcj1EanQuc29ydEJ5KERqdC5tYXAodCxpKSk7cmV0dXJuKHJbMV0rclsyXSkvMn0pKX0pKGEsdC5ncmFwaCgpLmFsaWduKX0pKGUpLChmdW5jdGlvbih0LG4pe2Uubm9kZShuKS54PXR9KSl9KShlKX0pKSxuKCIgICAgcG9zaXRpb25TZWxmRWRnZXMiLChmdW5jdGlvbigpeyEoZnVuY3Rpb24gdChlKXtHanQuZm9yRWFjaChlLm5vZGVzKCksKGZ1bmN0aW9uKHQpe3ZhciBuPWUubm9kZSh0KTtpZigic2VsZmVkZ2UiPT09bi5kdW1teSl7dmFyIGk9ZS5ub2RlKG4uZS52KSxyPWkueCtpLndpZHRoLzIsbz1pLnksYT1uLngtcixzPWkuaGVpZ2h0LzI7ZS5zZXRFZGdlKG4uZSxuLmxhYmVsKSxlLnJlbW92ZU5vZGUodCksbi5sYWJlbC5wb2ludHM9W3t4OnIrMiphLzMseTpvLXN9LHt4OnIrNSphLzYseTpvLXN9LHt4OnIrYSx5Om99LHt4OnIrNSphLzYseTpvK3N9LHt4OnIrMiphLzMseTpvK3N9XSxuLmxhYmVsLng9bi54LG4ubGFiZWwueT1uLnl9fSkpfSkoZSl9KSksbigiICAgIHJlbW92ZUJvcmRlck5vZGVzIiwoZnVuY3Rpb24oKXshKGZ1bmN0aW9uIHQoZSl7R2p0LmZvckVhY2goZS5ub2RlcygpLChmdW5jdGlvbih0KXtpZihlLmNoaWxkcmVuKHQpLmxlbmd0aCl7dmFyIG49ZS5ub2RlKHQpLGk9ZS5ub2RlKG4uYm9yZGVyVG9wKSxyPWUubm9kZShuLmJvcmRlckJvdHRvbSksbz1lLm5vZGUoR2p0Lmxhc3Qobi5ib3JkZXJMZWZ0KSksYT1lLm5vZGUoR2p0Lmxhc3Qobi5ib3JkZXJSaWdodCkpO24ud2lkdGg9TWF0aC5hYnMoYS54LW8ueCksbi5oZWlnaHQ9TWF0aC5hYnMoci55LWkueSksbi54PW8ueCtuLndpZHRoLzIsbi55PWkueStuLmhlaWdodC8yfX0pKSxHanQuZm9yRWFjaChlLm5vZGVzKCksKGZ1bmN0aW9uKHQpeyJib3JkZXIiPT09ZS5ub2RlKHQpLmR1bW15JiZlLnJlbW92ZU5vZGUodCl9KSl9KShlKX0pKSxuKCIgICAgbm9ybWFsaXplLnVuZG8iLChmdW5jdGlvbigpe3FqdC51bmRvKGUpfSkpLG4oIiAgICBmaXh1cEVkZ2VMYWJlbENvb3JkcyIsKGZ1bmN0aW9uKCl7IShmdW5jdGlvbiB0KGUpe0dqdC5mb3JFYWNoKGUuZWRnZXMoKSwoZnVuY3Rpb24odCl7dmFyIG49ZS5lZGdlKHQpO2lmKEdqdC5oYXMobiwieCIpKXN3aXRjaCgibCIhPT1uLmxhYmVscG9zJiYiciIhPT1uLmxhYmVscG9zfHwobi53aWR0aC09bi5sYWJlbG9mZnNldCksbi5sYWJlbHBvcyl7Y2FzZSJsIjpuLngtPW4ud2lkdGgvMituLmxhYmVsb2Zmc2V0O2JyZWFrO2Nhc2UiciI6bi54Kz1uLndpZHRoLzIrbi5sYWJlbG9mZnNldH19KSl9KShlKX0pKSxuKCIgICAgdW5kb0Nvb3JkaW5hdGVTeXN0ZW0iLChmdW5jdGlvbigpeyEoZnVuY3Rpb24gdChlKXt2YXIgbj1lLmdyYXBoKCkucmFua2Rpci50b0xvd2VyQ2FzZSgpOyJidCIhPT1uJiYicmwiIT09bnx8KGZ1bmN0aW9uIGkodCl7aGp0LmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbihlKXtmanQodC5ub2RlKGUpKX0pKSxoanQuZm9yRWFjaCh0LmVkZ2VzKCksKGZ1bmN0aW9uKGUpe3ZhciBuPXQuZWRnZShlKTtoanQuZm9yRWFjaChuLnBvaW50cyxmanQpLGhqdC5oYXMobiwieSIpJiZmanQobil9KSl9KShlKSwibHIiIT09biYmInJsIiE9PW58fCgoZnVuY3Rpb24gcih0KXtoanQuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGUpe21qdCh0Lm5vZGUoZSkpfSkpLGhqdC5mb3JFYWNoKHQuZWRnZXMoKSwoZnVuY3Rpb24oZSl7dmFyIG49dC5lZGdlKGUpO2hqdC5mb3JFYWNoKG4ucG9pbnRzLG1qdCksaGp0LmhhcyhuLCJ4IikmJm1qdChuKX0pKX0pKGUpLGRqdChlKSl9KShlKX0pKSxuKCIgICAgdHJhbnNsYXRlR3JhcGgiLChmdW5jdGlvbigpeyEoZnVuY3Rpb24gdChlKXt2YXIgbj1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksaT0wLHI9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLG89MCxhPWUuZ3JhcGgoKSxzPWEubWFyZ2lueHx8MCxsPWEubWFyZ2lueXx8MDtmdW5jdGlvbiBjKHQpe3ZhciBlPXQueCxhPXQueSxzPXQud2lkdGgsbD10LmhlaWdodDtuPU1hdGgubWluKG4sZS1zLzIpLGk9TWF0aC5tYXgoaSxlK3MvMikscj1NYXRoLm1pbihyLGEtbC8yKSxvPU1hdGgubWF4KG8sYStsLzIpfUdqdC5mb3JFYWNoKGUubm9kZXMoKSwoZnVuY3Rpb24odCl7YyhlLm5vZGUodCkpfSkpLEdqdC5mb3JFYWNoKGUuZWRnZXMoKSwoZnVuY3Rpb24odCl7dmFyIG49ZS5lZGdlKHQpO0dqdC5oYXMobiwieCIpJiZjKG4pfSkpLG4tPXMsci09bCxHanQuZm9yRWFjaChlLm5vZGVzKCksKGZ1bmN0aW9uKHQpe3ZhciBpPWUubm9kZSh0KTtpLngtPW4saS55LT1yfSkpLEdqdC5mb3JFYWNoKGUuZWRnZXMoKSwoZnVuY3Rpb24odCl7dmFyIGk9ZS5lZGdlKHQpO0dqdC5mb3JFYWNoKGkucG9pbnRzLChmdW5jdGlvbih0KXt0LngtPW4sdC55LT1yfSkpLEdqdC5oYXMoaSwieCIpJiYoaS54LT1uKSxHanQuaGFzKGksInkiKSYmKGkueS09cil9KSksYS53aWR0aD1pLW4rcyxhLmhlaWdodD1vLXIrbH0pKGUpfSkpLG4oIiAgICBhc3NpZ25Ob2RlSW50ZXJzZWN0cyIsKGZ1bmN0aW9uKCl7IShmdW5jdGlvbiB0KGUpe0dqdC5mb3JFYWNoKGUuZWRnZXMoKSwoZnVuY3Rpb24odCl7dmFyIG4saSxyPWUuZWRnZSh0KSxvPWUubm9kZSh0LnYpLGE9ZS5ub2RlKHQudyk7ci5wb2ludHM/KG49ci5wb2ludHNbMF0saT1yLnBvaW50c1tyLnBvaW50cy5sZW5ndGgtMV0pOihyLnBvaW50cz1bXSxuPWEsaT1vKSxyLnBvaW50cy51bnNoaWZ0KFpqdC5pbnRlcnNlY3RSZWN0KG8sbikpLHIucG9pbnRzLnB1c2goWmp0LmludGVyc2VjdFJlY3QoYSxpKSl9KSl9KShlKX0pKSxuKCIgICAgcmV2ZXJzZVBvaW50cyIsKGZ1bmN0aW9uKCl7IShmdW5jdGlvbiB0KGUpe0dqdC5mb3JFYWNoKGUuZWRnZXMoKSwoZnVuY3Rpb24odCl7dmFyIG49ZS5lZGdlKHQpO24ucmV2ZXJzZWQmJm4ucG9pbnRzLnJldmVyc2UoKX0pKX0pKGUpfSkpLG4oIiAgICBhY3ljbGljLnVuZG8iLChmdW5jdGlvbigpe1dqdC51bmRvKGUpfSkpfSkoZSxuKX0pKSxuKCIgIHVwZGF0ZUlucHV0R3JhcGgiLChmdW5jdGlvbigpeyEoZnVuY3Rpb24gbih0LGUpe0dqdC5mb3JFYWNoKHQubm9kZXMoKSwoZnVuY3Rpb24obil7dmFyIGk9dC5ub2RlKG4pLHI9ZS5ub2RlKG4pO2kmJihpLng9ci54LGkueT1yLnksZS5jaGlsZHJlbihuKS5sZW5ndGgmJihpLndpZHRoPXIud2lkdGgsaS5oZWlnaHQ9ci5oZWlnaHQpKX0pKSxHanQuZm9yRWFjaCh0LmVkZ2VzKCksKGZ1bmN0aW9uKG4pe3ZhciBpPXQuZWRnZShuKSxyPWUuZWRnZShuKTtpLnBvaW50cz1yLnBvaW50cyxHanQuaGFzKHIsIngiKSYmKGkueD1yLngsaS55PXIueSl9KSksdC5ncmFwaCgpLndpZHRoPWUuZ3JhcGgoKS53aWR0aCx0LmdyYXBoKCkuaGVpZ2h0PWUuZ3JhcGgoKS5oZWlnaHR9KSh0LGUpfSkpfSkpfSxkZWJ1Zzp7ZGVidWdPcmRlcmluZzpmdW5jdGlvbiBnR3QodCl7dmFyIGU9ZEd0LmJ1aWxkTGF5ZXJNYXRyaXgodCksbj1uZXcgcEd0KHtjb21wb3VuZDohMCxtdWx0aWdyYXBoOiEwfSkuc2V0R3JhcGgoe30pO3JldHVybiBoR3QuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGUpe24uc2V0Tm9kZShlLHtsYWJlbDplfSksbi5zZXRQYXJlbnQoZSwibGF5ZXIiK3Qubm9kZShlKS5yYW5rKX0pKSxoR3QuZm9yRWFjaCh0LmVkZ2VzKCksKGZ1bmN0aW9uKHQpe24uc2V0RWRnZSh0LnYsdC53LHt9LHQubmFtZSl9KSksaEd0LmZvckVhY2goZSwoZnVuY3Rpb24odCxlKXtuLnNldE5vZGUoImxheWVyIitlLHtyYW5rOiJzYW1lIn0pLGhHdC5yZWR1Y2UodCwoZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5zZXRFZGdlKHQsZSx7c3R5bGU6ImludmlzIn0pLGV9KSl9KSksbn19LHV0aWw6e3RpbWU6aVV0LnRpbWUsbm90aW1lOmlVdC5ub3RpbWV9LHZlcnNpb246IjAuOC41In07IShmdW5jdGlvbih0KXt0LkZFVENIX1BCVFhUX0JZVEVTPSJGRVRDSF9QQlRYVF9CWVRFUyIsdC5GRVRDSF9QQlRYVF9CWVRFU19GUk9NX0ZJTEVTWVNURU09IkZFVENIX1BCVFhUX0JZVEVTX0ZST01fRklMRVNZU1RFTSIsdC5GRVRDSF9QQlRYVF9CWVRFU19GUk9NX1NFUlZFUj0iRkVUQ0hfUEJUWFRfQllURVNfRlJPTV9TRVJWRVIiLHQuUEFSU0VfUEJUWFRfSU5UT19PQkpFQ1Q9IlBBUlNFX1BCVFhUX0lOVE9fT0JKRUNUIix0LkZFVENIX01FVEFEQVRBX1BCVFhUX0JZVEVTPSJGRVRDSF9NRVRBREFUQV9QQlRYVF9CWVRFUyIsdC5QQVJTRV9NRVRBREFUQV9QQlRYVF9JTlRPX09CSkVDVD0iUEFSU0VfTUVUQURBVEFfUEJUWFRfSU5UT19PQkpFQ1QiLHQuTk9STUFMSVpJTkdfTkFNRVM9Ik5PUk1BTElaSU5HX05BTUVTIix0LkJVSUxEX1NMSU1fR1JBUEg9IkJVSUxEX1NMSU1fR1JBUEgiLHQuSElFUkFSQ0hZX0FERF9OT0RFUz0iSElFUkFSQ0hZX0FERF9OT0RFUyIsdC5ISUVSQVJDSFlfREVURUNUX1NFUklFUz0iSElFUkFSQ0hZX0RFVEVDVF9TRVJJRVMiLHQuSElFUkFSQ0hZX0FERF9FREdFUz0iSElFUkFSQ0hZX0FERF9FREdFUyIsdC5ISUVSQVJDSFlfRklORF9TSU1JTEFSX1NVQkdSQVBIUz0iSElFUkFSQ0hZX0ZJTkRfU0lNSUxBUl9TVUJHUkFQSFMiLHQuUkVOREVSX0JVSUxEX0hJRVJBUkNIWT0iUkVOREVSX0JVSUxEX0hJRVJBUkNIWSIsdC5SRU5ERVJfU0NFTkVfTEFZT1VUPSJSRU5ERVJfU0NFTkVfTEFZT1VUIix0LlJFTkRFUl9TQ0VORV9CVUlMRF9TQ0VORT0iUkVOREVSX1NDRU5FX0JVSUxEX1NDRU5FIix0LkdSQVBIX0xPQURfU1VDQ0VFREVEPSJHUkFQSF9MT0FEX1NVQ0NFRURFRCIsdC5HUkFQSF9MT0FEX0ZBSUxFRD0iR1JBUEhfTE9BRF9GQUlMRUQifSkoY0d0fHwoY0d0PXt9KSksKGZ1bmN0aW9uKHQpe3QuTk9ERV9FWFBBTlNJT05fVE9HR0xFRD0iTk9ERV9FWFBBTlNJT05fVE9HR0xFRCIsdC5OT0RFX1NFQVJDSF9SRVNVTFRfRk9DVVNFRD0iTk9ERV9TRUFSQ0hfUkVTVUxUX0ZPQ1VTRUQiLHQuTk9ERV9BVVhJTElBUllfRVhUUkFDVElPTl9DSEFOR0VEPSJOT0RFX0FVWElMSUFSWV9FWFRSQUNUSU9OX0NIQU5HRUQiLHQuR1JBUEhfVFlQRV9DSEFOR0VEPSJHUkFQSF9UWVBFX0NIQU5HRUQiLHQuVFJBQ0VfSU5QVVRfTU9ERV9UT0dHTEVEPSJUUkFDRV9JTlBVVF9NT0RFX1RPR0dMRUQiLHQuTk9ERV9DT0xPUl9NT0RFX0NIQU5HRUQ9Ik5PREVfQ09MT1JfTU9ERV9DSEFOR0VEIix0LlVQTE9BREVEX0dSQVBIX0ZST01fRklMRVNZU1RFTT0iVVBMT0FERURfR1JBUEhfRlJPTV9GSUxFU1lTVEVNIn0pKHVHdHx8KHVHdD17fSkpO2NvbnN0IF9HdD1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sY0d0KSx1R3QpO3ZhciB5R3Q7IShmdW5jdGlvbih0KXt0Lk9QX0dSQVBIPSJvcF9ncmFwaCIsdC5DT05DRVBUVUFMX0dSQVBIPSJjb25jZXB0dWFsX2dyYXBoIix0LlBST0ZJTEU9InByb2ZpbGUifSkoeUd0fHwoeUd0PXt9KSk7bGV0IHZHdD17Tm9kZTp7Q09OVEFJTkVSOiJub2RlcyIsR1JPVVA6Im5vZGUiLFNIQVBFOiJub2Rlc2hhcGUiLENPTE9SX1RBUkdFVDoibm9kZWNvbG9ydGFyZ2V0IixMQUJFTDoibm9kZWxhYmVsIixCVVRUT05fQ09OVEFJTkVSOiJidXR0b25jb250YWluZXIiLEJVVFRPTl9DSVJDTEU6ImJ1dHRvbmNpcmNsZSIsRVhQQU5EX0JVVFRPTjoiZXhwYW5kYnV0dG9uIixDT0xMQVBTRV9CVVRUT046ImNvbGxhcHNlYnV0dG9uIn0sRWRnZTp7Q09OVEFJTkVSOiJlZGdlcyIsR1JPVVA6ImVkZ2UiLExJTkU6ImVkZ2VsaW5lIixSRUZFUkVOQ0VfRURHRToicmVmZXJlbmNlZWRnZSIsUkVGX0xJTkU6InJlZmxpbmUiLFNFTEVDVEFCTEU6InNlbGVjdGFibGVlZGdlIixTRUxFQ1RFRDoic2VsZWN0ZWRlZGdlIixTVFJVQ1RVUkFMOiJzdHJ1Y3R1cmFsIn0sQW5ub3RhdGlvbjp7T1VUQk9YOiJvdXQtYW5ub3RhdGlvbnMiLElOQk9YOiJpbi1hbm5vdGF0aW9ucyIsR1JPVVA6ImFubm90YXRpb24iLE5PREU6ImFubm90YXRpb24tbm9kZSIsRURHRToiYW5ub3RhdGlvbi1lZGdlIixDT05UUk9MX0VER0U6ImFubm90YXRpb24tY29udHJvbC1lZGdlIixMQUJFTDoiYW5ub3RhdGlvbi1sYWJlbCIsRUxMSVBTSVM6ImFubm90YXRpb24tZWxsaXBzaXMifSxTY2VuZTp7R1JPVVA6InNjZW5lIixDT1JFOiJjb3JlIixGVU5DVElPTl9MSUJSQVJZOiJmdW5jdGlvbi1saWJyYXJ5IixJTkVYVFJBQ1Q6ImluLWV4dHJhY3QiLE9VVEVYVFJBQ1Q6Im91dC1leHRyYWN0In0sU3Vic2NlbmU6e0dST1VQOiJzdWJzY2VuZSJ9LE9QTk9ERToib3AiLE1FVEFOT0RFOiJtZXRhIixTRVJJRVNOT0RFOiJzZXJpZXMiLEJSSURHRU5PREU6ImJyaWRnZSIsRUxMSVBTSVNOT0RFOiJlbGxpcHNpcyJ9O2NvbnN0IGJHdD0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciO2Z1bmN0aW9uIHhHdCh0LGUsbil7bGV0IGk9dC5ub2RlKCkuY2hpbGROb2Rlcztmb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrKyl7bGV0IHI9aVt0XTtpZihyLnRhZ05hbWU9PT1lKWlmKG4gaW5zdGFuY2VvZiBBcnJheSl7bGV0IHQ9ITA7Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspdD10JiZyLmNsYXNzTGlzdC5jb250YWlucyhuW2VdKTtpZih0KXJldHVybiBTdShyKX1lbHNlIGlmKCFufHxyLmNsYXNzTGlzdC5jb250YWlucyhuKSlyZXR1cm4gU3Uocil9cmV0dXJuIFN1KG51bGwpfWZ1bmN0aW9uIHdHdCh0LGUsbixpKXtsZXQgcj14R3QodCxlLG4pO2lmKCFyLmVtcHR5KCkpcmV0dXJuIHI7bGV0IG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsZSk7aWYobiBpbnN0YW5jZW9mIEFycmF5KWZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKW8uY2xhc3NMaXN0LmFkZChuW3RdKTtlbHNlIG8uY2xhc3NMaXN0LmFkZChuKTtyZXR1cm4gaT90Lm5vZGUoKS5pbnNlcnRCZWZvcmUobyxpKTp0Lm5vZGUoKS5hcHBlbmRDaGlsZChvKSxTdShvKS5kYXR1bSh0LmRhdHVtKCkpfWNsYXNzIFNHdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnRvdGFsQnl0ZXM9MCx0aGlzLm91dHB1dFNpemU9dH1hZGRFeGVjdXRpb25UaW1lKHQsZSl7dGhpcy5zdGFydFRpbWU9bnVsbCE9dGhpcy5zdGFydFRpbWU/TWF0aC5taW4odGhpcy5zdGFydFRpbWUsdCk6dCx0aGlzLmVuZFRpbWU9bnVsbCE9dGhpcy5lbmRUaW1lP01hdGgubWF4KHRoaXMuZW5kVGltZSxlKTplfWFkZEJ5dGVzQWxsb2NhdGlvbih0KXt0aGlzLnRvdGFsQnl0ZXM9bnVsbCE9dGhpcy50b3RhbEJ5dGVzP01hdGgubWF4KHRoaXMudG90YWxCeXRlcyx0KTp0fWNvbWJpbmUodCl7bnVsbCE9dC50b3RhbEJ5dGVzJiYodGhpcy50b3RhbEJ5dGVzKz10LnRvdGFsQnl0ZXMpLG51bGwhPXQuZ2V0VG90YWxNaWNyb3MoKSYmdGhpcy5hZGRFeGVjdXRpb25UaW1lKHQuc3RhcnRUaW1lLHQuZW5kVGltZSl9Z2V0VG90YWxNaWNyb3MoKXtyZXR1cm4gbnVsbD09dGhpcy5zdGFydFRpbWV8fG51bGw9PXRoaXMuZW5kVGltZT9udWxsOnRoaXMuZW5kVGltZS10aGlzLnN0YXJ0VGltZX19Y29uc3QgTUd0PS43NSxFR3Q9ckUoKS5leHBvbmVudCguMykuZG9tYWluKFsxLDVlNl0pLnJhbmdlKFtNR3QsMTJdKS5jbGFtcCghMCk7ZnVuY3Rpb24gVEd0KHQpeyEoZnVuY3Rpb24gZSh0KXt0Lmhhc093blByb3BlcnR5KCJ0aW1pbmdJZCIpfSkodCl9ZnVuY3Rpb24gQ0d0KHQsZSxuKXtsZXQgaT1EYXRlLm5vdygpLHI9ZSgpO2NvbnN0IG89RGF0ZS5ub3coKS1pO3JldHVybiBjb25zb2xlLmxvZyh0LCI6IixvLCJtcyIpLG4mJlRHdCh7dGltaW5nSWQ6bixldmVudFZhbHVlOm99KSxyfWZ1bmN0aW9uIEFHdCh0KXtyZXR1cm57c2V0TWVzc2FnZTpmdW5jdGlvbihlKXt0LnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTp0LnByb2dyZXNzLnZhbHVlLG1zZzplfSl9LHVwZGF0ZVByb2dyZXNzOmZ1bmN0aW9uKGUpe3Quc2V0KCJwcm9ncmVzcyIse3ZhbHVlOnQucHJvZ3Jlc3MudmFsdWUrZSxtc2c6dC5wcm9ncmVzcy5tc2d9KX0scmVwb3J0RXJyb3I6ZnVuY3Rpb24oZSxuKXtjb25zb2xlLmVycm9yKG4uc3RhY2spLHQuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOnQucHJvZ3Jlc3MudmFsdWUsbXNnOmUsZXJyb3I6ITB9KX19fWZ1bmN0aW9uIGtHdCh0LGUsbil7cmV0dXJue3NldE1lc3NhZ2U6ZnVuY3Rpb24oZSl7dC5zZXRNZXNzYWdlKG4rIjogIitlKX0sdXBkYXRlUHJvZ3Jlc3M6ZnVuY3Rpb24obil7dC51cGRhdGVQcm9ncmVzcyhuKmUvMTAwKX0scmVwb3J0RXJyb3I6ZnVuY3Rpb24oZSxpKXt0LnJlcG9ydEVycm9yKG4rIjogIitlLGkpfX19ZnVuY3Rpb24gTEd0KHQsZSxuLGkscil7cmV0dXJuIG5ldyBQcm9taXNlKCgobyxhKT0+e2kuc2V0TWVzc2FnZSh0KSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3RyeXtsZXQgYT1DR3QodCxuLHIpO2kudXBkYXRlUHJvZ3Jlc3MoZSksbyhhKX1jYXRjaChlKXtpLnJlcG9ydEVycm9yKCJGYWlsZWQgIit0LGUpfX0pLDIwKX0pKX1mdW5jdGlvbiBQR3QodCxlLG4saSxyKXtyZXR1cm4gbmV3IFByb21pc2UoKChvLGEpPT57bGV0IHM9ZnVuY3Rpb24oZSl7aS5yZXBvcnRFcnJvcigiRmFpbGVkICIrdCxlKSxhKGUpfTtpLnNldE1lc3NhZ2UodCksc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0cnl7bGV0IGE9RGF0ZS5ub3coKTtuKCkudGhlbigoZnVuY3Rpb24obil7Y29uc3Qgcz1EYXRlLm5vdygpLWE7Y29uc29sZS5sb2codCwiOiIscywibXMiKSxpLnVwZGF0ZVByb2dyZXNzKGUpLFRHdCh7dGltaW5nSWQ6cixldmVudFZhbHVlOnN9KSxvKG4pfSkpLmNhdGNoKHMpfWNhdGNoKHQpe3ModCl9fSksMjApfSkpfWNvbnN0IE5HdD1be3N5bWJvbDoiQiJ9LHtzeW1ib2w6IktCIixudW1Vbml0czoxMDI0fSx7c3ltYm9sOiJNQiIsbnVtVW5pdHM6MTAyNH0se3N5bWJvbDoiR0IiLG51bVVuaXRzOjEwMjR9LHtzeW1ib2w6IlRCIixudW1Vbml0czoxMDI0fSx7c3ltYm9sOiJQQiIsbnVtVW5pdHM6MTAyNH1dLElHdD1be3N5bWJvbDoiwrVzIn0se3N5bWJvbDoibXMiLG51bVVuaXRzOjFlM30se3N5bWJvbDoicyIsbnVtVW5pdHM6MWUzfSx7c3ltYm9sOiJtaW4iLG51bVVuaXRzOjYwfSx7c3ltYm9sOiJociIsbnVtVW5pdHM6NjB9LHtzeW1ib2w6ImRheXMiLG51bVVuaXRzOjI0fV07ZnVuY3Rpb24gUkd0KHQsZSxuPTApe3JldHVybiBuKzE8ZS5sZW5ndGgmJnQ+PWVbbisxXS5udW1Vbml0cz9SR3QodC9lW24rMV0ubnVtVW5pdHMsZSxuKzEpOk51bWJlcih0LnRvUHJlY2lzaW9uKDMpKSsiICIrZVtuXS5zeW1ib2x9ZnVuY3Rpb24gT0d0KHQpe3JldHVybiEoIXR8fCEodC50b3RhbEJ5dGVzPjB8fHQuZ2V0VG90YWxNaWNyb3MoKT4wfHx0Lm91dHB1dFNpemUpKX1mdW5jdGlvbiB6R3QodCl7aWYodC5sZW5ndGg8MilyZXR1cm4gdDtsZXQgZT0wLG49MCxpPVNlLmV4cG9ydHMubWluKFNlLmV4cG9ydHMubWFwKHQsKHQ9PnQubGVuZ3RoKSkpO2Zvcig7Oyl7ZSsrO2xldCByPVNlLmV4cG9ydHMubWFwKHQsKHQ9PnQuc3Vic3RyaW5nKDAsZSkpKTtpZighci5ldmVyeSgoKHQsZSk9PjA9PT1lfHx0PT09cltlLTFdKSkpYnJlYWs7aWYoZT49aSlyZXR1cm4gdDtuPWV9cmV0dXJuIFNlLmV4cG9ydHMubWFwKHQsKHQ9PnQuc3Vic3RyaW5nKG4pKSl9Y29uc3QgREd0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHQoIjJkIik7ZnVuY3Rpb24gQkd0KHQsZSl7cmV0dXJuIERHdC5mb250PWAke2V9cHggUm9ib3RvLCBzYW5zLXNlcmlmYCxER3QubWVhc3VyZVRleHQodCkud2lkdGh9Y29uc3QgSEd0PSIvIixGR3Q9Il9fcm9vdF9fIixWR3Q9Il9fZnVuY3Rpb25fbGlicmFyeV9fIjt2YXIgVUd0LGpHdCxHR3QsV0d0OyEoZnVuY3Rpb24odCl7dFt0LkZVTEw9MF09IkZVTEwiLHRbdC5FTUJFRERFRD0xXT0iRU1CRURERUQiLHRbdC5NRVRBPTJdPSJNRVRBIix0W3QuU0VSSUVTPTNdPSJTRVJJRVMiLHRbdC5DT1JFPTRdPSJDT1JFIix0W3QuU0hBRE9XPTVdPSJTSEFET1ciLHRbdC5CUklER0U9Nl09IkJSSURHRSIsdFt0LkVER0U9N109IkVER0UifSkoVUd0fHwoVUd0PXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5NRVRBPTBdPSJNRVRBIix0W3QuT1A9MV09Ik9QIix0W3QuU0VSSUVTPTJdPSJTRVJJRVMiLHRbdC5CUklER0U9M109IkJSSURHRSIsdFt0LkVMTElQU0lTPTRdPSJFTExJUFNJUyJ9KShqR3R8fChqR3Q9e30pKSwoZnVuY3Rpb24odCl7dFt0LklOQ0xVREU9MF09IklOQ0xVREUiLHRbdC5FWENMVURFPTFdPSJFWENMVURFIix0W3QuVU5TUEVDSUZJRUQ9Ml09IlVOU1BFQ0lGSUVEIn0pKEdHdHx8KEdHdD17fSkpLChmdW5jdGlvbih0KXt0W3QuR1JPVVA9MF09IkdST1VQIix0W3QuVU5HUk9VUD0xXT0iVU5HUk9VUCJ9KShXR3R8fChXR3Q9e30pKTtjbGFzcyBxR3R7Y29uc3RydWN0b3IoKXt0aGlzLm5vZGVzPXt9LHRoaXMuZWRnZXM9W119fWNsYXNzIFlHdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnR5cGU9akd0LkVMTElQU0lTLHRoaXMuaXNHcm91cE5vZGU9ITEsdGhpcy5jYXJkaW5hbGl0eT0xLHRoaXMucGFyZW50Tm9kZT1udWxsLHRoaXMuc3RhdHM9bnVsbCx0aGlzLnNldE51bU1vcmVOb2Rlcyh0KSx0aGlzLmluY2x1ZGU9R0d0LlVOU1BFQ0lGSUVEfXNldE51bU1vcmVOb2Rlcyh0KXt0aGlzLm51bU1vcmVOb2Rlcz10LHRoaXMubmFtZT0iLi4uICIrdCsiIG1vcmUifX1jbGFzcyBYR3R7Y29uc3RydWN0b3IodCl7dGhpcy5vcD10Lm9wLHRoaXMubmFtZT10Lm5hbWUsdGhpcy5kZXZpY2U9dC5kZXZpY2UsdGhpcy5hdHRyPXQuYXR0cix0aGlzLmlucHV0cz0oZnVuY3Rpb24gZSh0KXtjb25zdCBlPVtdO2xldCBuPW51bGw7Zm9yKGxldCBpIG9mIHR8fFtdKXtjb25zdCB0PWkuc3RhcnRzV2l0aCgiXiIpO3QmJihpPWkuc3Vic3RyaW5nKDEpKTtsZXQgcj1pLG89IjAiO2NvbnN0IGE9aS5pbmNsdWRlcygiOiIpJiZpLm1hdGNoKG5XdCk7YSYmKHI9YVsxXSxvPWFbMl0pLG4hPT1yJiYobj1yLGUucHVzaCh7bmFtZTpyLG91dHB1dFRlbnNvcktleTpvLGlzQ29udHJvbERlcGVuZGVuY3k6dH0pKX1yZXR1cm4gZX0pKHQuaW5wdXQpLHRoaXMub3V0cHV0U2hhcGVzPShmdW5jdGlvbiBuKHQpe2lmKCF0KXJldHVybiBudWxsO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtsZXR7a2V5Om4sdmFsdWU6aX09dFtlXTtpZigiX291dHB1dF9zaGFwZXMiPT09bil7aWYoIWkubGlzdHx8IWkubGlzdC5zaGFwZSlyZXR1cm4gbnVsbDtsZXQgbj1pLmxpc3Quc2hhcGUubWFwKCh0PT50LnVua25vd25fcmFuaz9udWxsOm51bGw9PXQuZGltfHwxPT09dC5kaW0ubGVuZ3RoJiZudWxsPT10LmRpbVswXS5zaXplP1tdOnQuZGltLm1hcCgodD0+dC5zaXplKSkpKTtyZXR1cm4gdC5zcGxpY2UoZSwxKSxufX1yZXR1cm4gbnVsbH0pKHQuYXR0ciksdGhpcy54bGFDbHVzdGVyPShmdW5jdGlvbiBpKHQpe2lmKCF0KXJldHVybiBudWxsO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKCJfWGxhQ2x1c3RlciI9PT10W2VdLmtleSlyZXR1cm4gdFtlXS52YWx1ZS5zfHxudWxsO3JldHVybiBudWxsfSkodC5hdHRyKSx0aGlzLmNvbXBhdGlibGU9ITEsdGhpcy50eXBlPWpHdC5PUCx0aGlzLmlzR3JvdXBOb2RlPSExLHRoaXMuY2FyZGluYWxpdHk9MSx0aGlzLmluRW1iZWRkaW5ncz1bXSx0aGlzLm91dEVtYmVkZGluZ3M9W10sdGhpcy5wYXJlbnROb2RlPW51bGwsdGhpcy5pbmNsdWRlPUdHdC5VTlNQRUNJRklFRCx0aGlzLm93bmluZ1Nlcmllcz1udWxsfX1mdW5jdGlvbiAkR3QodCxlPXt9KXtyZXR1cm4gbmV3IEtHdCh0LGUpfWNsYXNzIEtHdHtjb25zdHJ1Y3Rvcih0LGU9e30pe3RoaXMubmFtZT10LHRoaXMudHlwZT1qR3QuTUVUQSx0aGlzLmRlcHRoPTEsdGhpcy5pc0dyb3VwTm9kZT0hMCx0aGlzLmNhcmRpbmFsaXR5PTAsdGhpcy5tZXRhZ3JhcGg9b1d0KHQsVUd0Lk1FVEEsZSksdGhpcy5icmlkZ2VncmFwaD1udWxsLHRoaXMub3BIaXN0b2dyYW09e30sdGhpcy5kZXZpY2VIaXN0b2dyYW09e30sdGhpcy54bGFDbHVzdGVySGlzdG9ncmFtPXt9LHRoaXMuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbT17Y29tcGF0aWJsZTowLGluY29tcGF0aWJsZTowfSx0aGlzLnRlbXBsYXRlSWQ9bnVsbCx0aGlzLnBhcmVudE5vZGU9bnVsbCx0aGlzLmhhc05vbkNvbnRyb2xFZGdlcz0hMSx0aGlzLmluY2x1ZGU9R0d0LlVOU1BFQ0lGSUVELHRoaXMuYXNzb2NpYXRlZEZ1bmN0aW9uPSIifWdldEZpcnN0Q2hpbGQoKXtyZXR1cm4gdGhpcy5tZXRhZ3JhcGgubm9kZSh0aGlzLm1ldGFncmFwaC5ub2RlcygpWzBdKX1nZXRSb290T3AoKXtsZXQgdD10aGlzLm5hbWUuc3BsaXQoIi8iKTtyZXR1cm4gdGhpcy5tZXRhZ3JhcGgubm9kZSh0aGlzLm5hbWUrIi8oIit0W3QubGVuZ3RoLTFdKyIpIil9bGVhdmVzKCl7bGV0IHQsZT1bXSxuPVt0aGlzXTtmb3IoO24ubGVuZ3RoOyl7bGV0IGk9bi5zaGlmdCgpO2kuaXNHcm91cE5vZGU/KHQ9aS5tZXRhZ3JhcGgsU2UuZXhwb3J0cy5lYWNoKHQubm9kZXMoKSwoZT0+bi5wdXNoKHQubm9kZShlKSkpKSk6ZS5wdXNoKGkubmFtZSl9cmV0dXJuIGV9fWZ1bmN0aW9uIFpHdCh0LGUpe3JldHVybiBuZXcgSkd0KHQsZSl9Y2xhc3MgSkd0e2NvbnN0cnVjdG9yKHQsZSl7dGhpcy52PXQsdGhpcy53PWUsdGhpcy5iYXNlRWRnZUxpc3Q9W10sdGhpcy5pbmJvdW5kPW51bGwsdGhpcy5udW1SZWd1bGFyRWRnZXM9MCx0aGlzLm51bUNvbnRyb2xFZGdlcz0wLHRoaXMubnVtUmVmRWRnZXM9MCx0aGlzLnRvdGFsU2l6ZT0wfWFkZEJhc2VFZGdlKHQsZSl7dGhpcy5iYXNlRWRnZUxpc3QucHVzaCh0KSx0LmlzQ29udHJvbERlcGVuZGVuY3k/dGhpcy5udW1Db250cm9sRWRnZXMrPTE6dGhpcy5udW1SZWd1bGFyRWRnZXMrPTEsdC5pc1JlZmVyZW5jZUVkZ2UmJih0aGlzLm51bVJlZkVkZ2VzKz0xKSx0aGlzLnRvdGFsU2l6ZSs9Skd0LmNvbXB1dGVTaXplT2ZFZGdlKHQsZSksZS5tYXhNZXRhRWRnZVNpemU9TWF0aC5tYXgoZS5tYXhNZXRhRWRnZVNpemUsdGhpcy50b3RhbFNpemUpfXN0YXRpYyBjb21wdXRlU2l6ZU9mRWRnZSh0LGUpe2xldCBuPWUubm9kZSh0LnYpO2lmKCFuLm91dHB1dFNoYXBlcylyZXR1cm4gMTtlLmhhc1NoYXBlSW5mbz0hMDtjb25zdCBpPU9iamVjdC5rZXlzKG4ub3V0cHV0U2hhcGVzKS5tYXAoKHQ9Pm4ub3V0cHV0U2hhcGVzW3RdKSkubWFwKCh0PT5udWxsPT10PzE6dC5yZWR1Y2UoKCh0LGUpPT4oLTE9PT1lJiYoZT0xKSx0KmUpKSwxKSkpO3JldHVybiBTZS5leHBvcnRzLnN1bShpKX19ZnVuY3Rpb24gUUd0KHQsZSxuLGkscixvKXtyZXR1cm4gbmV3IGVXdCh0LGUsbixpLHIsbyl9ZnVuY3Rpb24gdFd0KHQsZSxuLGkscil7cmV0dXJuKG4/bisiLyI6IiIpK3QrKHZvaWQgMCE9PWkmJnZvaWQgMCE9PXI/IlsiK2krIi0iK3IrIl0iOiIjIikrZX1jbGFzcyBlV3R7Y29uc3RydWN0b3IodCxlLG4saSxyLG8pe3RoaXMubmFtZT1yfHx0V3QodCxlLG4pLHRoaXMudHlwZT1qR3QuU0VSSUVTLHRoaXMuaGFzTG9vcD0hMSx0aGlzLnByZWZpeD10LHRoaXMuc3VmZml4PWUsdGhpcy5jbHVzdGVySWQ9aSx0aGlzLmlkcz1bXSx0aGlzLnBhcmVudD1uLHRoaXMuaXNHcm91cE5vZGU9ITAsdGhpcy5jYXJkaW5hbGl0eT0wLHRoaXMubWV0YWdyYXBoPW9XdChyLFVHdC5TRVJJRVMsbyksdGhpcy5icmlkZ2VncmFwaD1udWxsLHRoaXMucGFyZW50Tm9kZT1udWxsLHRoaXMuZGV2aWNlSGlzdG9ncmFtPXt9LHRoaXMueGxhQ2x1c3Rlckhpc3RvZ3JhbT17fSx0aGlzLmNvbXBhdGliaWxpdHlIaXN0b2dyYW09e2NvbXBhdGlibGU6MCxpbmNvbXBhdGlibGU6MH0sdGhpcy5oYXNOb25Db250cm9sRWRnZXM9ITEsdGhpcy5pbmNsdWRlPUdHdC5VTlNQRUNJRklFRH19Y29uc3Qgbld0PS9eKFteOl0rKTooKFx3Kzp8KVxkKykkLztmdW5jdGlvbiBpV3QodCxlLG4saSxyLG8pe2UhPT1uLm5hbWUmJnQuZWRnZXMucHVzaCh7djplLHc6bi5uYW1lLG91dHB1dFRlbnNvcktleTppLm91dHB1dFRlbnNvcktleSxpc0NvbnRyb2xEZXBlbmRlbmN5OmkuaXNDb250cm9sRGVwZW5kZW5jeSxpc1JlZmVyZW5jZUVkZ2U6ITA9PT1yLnJlZkVkZ2VzW24ub3ArIiAiK29dfSl9Y29uc3Qgcld0PXtlbmFibGVFbWJlZGRpbmc6ITAsaW5FbWJlZGRpbmdUeXBlczpbIkNvbnN0Il0sb3V0RW1iZWRkaW5nVHlwZXM6WyJeW2EtekEtWl0rU3VtbWFyeSQiXSxyZWZFZGdlczp7IkFzc2lnbiAwIjohMCwiQXNzaWduQWRkIDAiOiEwLCJBc3NpZ25TdWIgMCI6ITAsImFzc2lnbiAwIjohMCwiYXNzaWduX2FkZCAwIjohMCwiYXNzaWduX3N1YiAwIjohMCwiY291bnRfdXBfdG8gMCI6ITAsIlNjYXR0ZXJBZGQgMCI6ITAsIlNjYXR0ZXJTdWIgMCI6ITAsIlNjYXR0ZXJVcGRhdGUgMCI6ITAsInNjYXR0ZXJfYWRkIDAiOiEwLCJzY2F0dGVyX3N1YiAwIjohMCwic2NhdHRlcl91cGRhdGUgMCI6ITB9fTtmdW5jdGlvbiBvV3QodCxlLG49e30pe2NvbnN0IGk9bmV3IGZHdC5ncmFwaGxpYi5HcmFwaChuKTtyZXR1cm4gaS5zZXRHcmFwaCh7bmFtZTp0LHJhbmtkaXI6bi5yYW5rZGlyfHwiQlQiLHR5cGU6ZX0pLGl9ZnVuY3Rpb24gYVd0KHQpe3JldHVybiBmdW5jdGlvbihlKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7bGV0IGk9bmV3IFJlZ0V4cCh0W25dKTtpZigic3RyaW5nIj09dHlwZW9mIGUub3AmJmUub3AubWF0Y2goaSkpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIHNXdCh0KXtsZXQgZT10LnNwbGl0KEhHdCk7cmV0dXJuIHQrSEd0KyIoIitlW2UubGVuZ3RoLTFdKyIpIn1mdW5jdGlvbiBsV3QodCl7bGV0IGU9dC5ub2RlcygpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQubmVpZ2hib3JzKGUpLmxlbmd0aH0pKTtyZXR1cm4gZS5zb3J0KCksZX1mdW5jdGlvbiBjV3QodCxlKXtsZXQgbj1bXSxpPXQuaW5kZXhPZihIR3QpO2Zvcig7aT49MDspbi5wdXNoKHQuc3Vic3RyaW5nKDAsaSkpLGk9dC5pbmRleE9mKEhHdCxpKzEpO2lmKGUpe2xldCBpPWVbdF07aSYmbi5wdXNoKGkpfXJldHVybiBuLnB1c2godCksbn1mdW5jdGlvbiB1V3QodCl7cmV0dXJuIHQ9PT1HR3QuRVhDTFVERT8iQWRkIHRvIG1haW4gZ3JhcGgiOiJSZW1vdmUgZnJvbSBtYWluIGdyYXBoIn1sZXQgaFd0PSIjMGY5ZDU4IixkV3Q9IiNkYjQ0MzciLHBXdD17REVGQVVMVF9GSUxMOiIjZDlkOWQ5IixERUZBVUxUX1NUUk9LRToiI2E2YTZhNiIsU0FUVVJBVElPTjouNixMSUdIVE5FU1M6Ljg1LEVYUEFOREVEX0NPTE9SOiIjZjBmMGYwIixIVUVTOlsyMjAsMTAwLDE4MCw0MCwyMCwzNDAsMjYwLDMwMCwxNDAsNjBdLFNUUlVDVFVSRV9QQUxFVFRFKHQsZSl7bGV0IG49cFd0LkhVRVMsaT1uW3Qlbi5sZW5ndGhdLHI9TWF0aC5zaW4oaSpNYXRoLlBJLzM2MCk7cmV0dXJuICRoKGksLjAxKihlPzMwOjkwLTYwKnIpLC4wMSooZT85NTo4MCkpLnRvU3RyaW5nKCl9LERFVklDRV9QQUxFVFRFOnQ9PnBXdC5TVFJVQ1RVUkVfUEFMRVRURSh0KSxYTEFfQ0xVU1RFUl9QQUxFVFRFOnQ9PnBXdC5TVFJVQ1RVUkVfUEFMRVRURSh0KSxVTktOT1dOOiIjZWVlIixHUkFESUVOVF9PVVRMSU5FOiIjODg4In07Y29uc3QgZld0PVsiTm9PcCJdLG1XdD1bXSxnV3Q9WyIjZmZmNWYwIiwiI2ZiNmE0YSJdLF9XdD1uZXcgUmVnRXhwKCJeKD86X19mdW5jdGlvbl9saWJyYXJ5X18pPyhcXHcrKV9bYS16MC05XXs4fSg/Ol9cXGQrKT8kIik7Y2xhc3MgeVd0e2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLmhpZXJhcmNoeT10LHRoaXMuZGlzcGxheWluZ1N0YXRzPWUsdGhpcy5hdXRvRXh0cmFjdE5vZGVzPW4sdGhpcy5pbmRleD17fSx0aGlzLnJlbmRlcmVkT3BOYW1lcz1bXSx0aGlzLmNvbXB1dGVTY2FsZXMoKSx0aGlzLmhhc1N1YmhpZXJhcmNoeT17fSx0aGlzLnJvb3Q9bmV3IFRXdCh0LnJvb3QsdC5ncmFwaE9wdGlvbnMpLHRoaXMuaW5kZXhbdC5yb290Lm5hbWVdPXRoaXMucm9vdCx0aGlzLnJlbmRlcmVkT3BOYW1lcy5wdXNoKHQucm9vdC5uYW1lKSx0aGlzLmJ1aWxkU3ViaGllcmFyY2h5KHQucm9vdC5uYW1lKSx0aGlzLnJvb3QuZXhwYW5kZWQ9ITAsdGhpcy50cmFjZUlucHV0cz0hMX1jb21wdXRlU2NhbGVzKCl7dGhpcy5kZXZpY2VDb2xvck1hcD1FTSgpLmRvbWFpbih0aGlzLmhpZXJhcmNoeS5kZXZpY2VzKS5yYW5nZShTZS5leHBvcnRzLm1hcCh6bCh0aGlzLmhpZXJhcmNoeS5kZXZpY2VzLmxlbmd0aCkscFd0LkRFVklDRV9QQUxFVFRFKSksdGhpcy54bGFDbHVzdGVyQ29sb3JNYXA9RU0oKS5kb21haW4odGhpcy5oaWVyYXJjaHkueGxhQ2x1c3RlcnMpLnJhbmdlKFNlLmV4cG9ydHMubWFwKHpsKHRoaXMuaGllcmFyY2h5LnhsYUNsdXN0ZXJzLmxlbmd0aCkscFd0LlhMQV9DTFVTVEVSX1BBTEVUVEUpKTtsZXQgdD10aGlzLmhpZXJhcmNoeS5yb290Lm1ldGFncmFwaCxlPVdsKHQubm9kZXMoKSwoKGUsbik9PntsZXQgaT10Lm5vZGUoZSk7aWYobnVsbCE9aS5zdGF0cylyZXR1cm4gaS5zdGF0cy50b3RhbEJ5dGVzfSkpO3RoaXMubWVtb3J5VXNhZ2VTY2FsZT1WTSgpLmRvbWFpbihbMCxlXSkucmFuZ2UoZ1d0KTtsZXQgbj1XbCh0Lm5vZGVzKCksKChlLG4pPT57bGV0IGk9dC5ub2RlKGUpO2lmKG51bGwhPWkuc3RhdHMpcmV0dXJuIGkuc3RhdHMuZ2V0VG90YWxNaWNyb3MoKX0pKTt0aGlzLmNvbXB1dGVUaW1lU2NhbGU9Vk0oKS5kb21haW4oWzAsbl0pLnJhbmdlKGdXdCksdGhpcy5lZGdlV2lkdGhTaXplZEJhc2VkU2NhbGU9dGhpcy5oaWVyYXJjaHkuaGFzU2hhcGVJbmZvP0VHdDpWTSgpLmRvbWFpbihbMSx0aGlzLmhpZXJhcmNoeS5tYXhNZXRhRWRnZVNpemVdKS5yYW5nZShbTUd0LDEyXSl9Z2V0UmVuZGVyTm9kZUJ5TmFtZSh0KXtyZXR1cm4gdGhpcy5pbmRleFt0XX1nZXROb2RlQnlOYW1lKHQpe3JldHVybiB0aGlzLmhpZXJhcmNoeS5ub2RlKHQpfWNvbG9ySGlzdG9ncmFtKHQsZSl7aWYoT2JqZWN0LmtleXModCkubGVuZ3RoPjApe2NvbnN0IG49U2UuZXhwb3J0cy5zdW0oT2JqZWN0LmtleXModCkubWFwKChlPT50W2VdKSkpO3JldHVybiBPYmplY3Qua2V5cyh0KS5tYXAoKGk9Pih7Y29sb3I6ZShpKSxwcm9wb3J0aW9uOnRbaV0vbn0pKSl9cmV0dXJuIG51bGx9Z2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKHQpe2lmKCF0KXJldHVybiBudWxsO2lmKHQgaW4gdGhpcy5pbmRleClyZXR1cm4gdGhpcy5pbmRleFt0XTtsZXQgZT10aGlzLmhpZXJhcmNoeS5ub2RlKHQpO2lmKCFlKXJldHVybiBudWxsO2xldCBuPWUuaXNHcm91cE5vZGU/bmV3IFRXdChlLHRoaXMuaGllcmFyY2h5LmdyYXBoT3B0aW9ucyk6bmV3IHdXdChlKTt0aGlzLmluZGV4W3RdPW4sdGhpcy5yZW5kZXJlZE9wTmFtZXMucHVzaCh0KSxlLnN0YXRzJiYobi5tZW1vcnlDb2xvcj10aGlzLm1lbW9yeVVzYWdlU2NhbGUoZS5zdGF0cy50b3RhbEJ5dGVzKSxuLmNvbXB1dGVUaW1lQ29sb3I9dGhpcy5jb21wdXRlVGltZVNjYWxlKGUuc3RhdHMuZ2V0VG90YWxNaWNyb3MoKSkpLG4uaXNGYWRlZE91dD10aGlzLmRpc3BsYXlpbmdTdGF0cyYmIU9HdChlLnN0YXRzKTt2YXIgaT1udWxsLHI9bnVsbCxvPW51bGw7aWYoZS5pc0dyb3VwTm9kZSl7aT1lLmRldmljZUhpc3RvZ3JhbSxyPWUueGxhQ2x1c3Rlckhpc3RvZ3JhbTtsZXQgdD1lLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZSxuPWUuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU7MD09dCYmMD09bnx8KG89dC8odCtuKSl9ZWxzZXtsZXQgdD1uLm5vZGUuZGV2aWNlO3QmJihpPXtbdF06MX0pO2xldCBlPW4ubm9kZS54bGFDbHVzdGVyO2UmJihyPXtbZV06MX0pLG4ubm9kZS50eXBlPT09akd0Lk9QJiYobz1uLm5vZGUuY29tcGF0aWJsZT8xOjApfXJldHVybiBpJiYobi5kZXZpY2VDb2xvcnM9dGhpcy5jb2xvckhpc3RvZ3JhbShpLHRoaXMuZGV2aWNlQ29sb3JNYXApKSxyJiYobi54bGFDbHVzdGVyQ29sb3JzPXRoaXMuY29sb3JIaXN0b2dyYW0ocix0aGlzLnhsYUNsdXN0ZXJDb2xvck1hcCkpLG51bGwhPW8mJihuLmNvbXBhdGliaWxpdHlDb2xvcnM9W3tjb2xvcjpoV3QscHJvcG9ydGlvbjpvfSx7Y29sb3I6ZFd0LHByb3BvcnRpb246MS1vfV0pLHRoaXMuaW5kZXhbdF19Z2V0TmVhcmVzdFZpc2libGVBbmNlc3Rvcih0KXtsZXQgZT1jV3QodCksbj0wLGk9bnVsbCxyPXQ7Zm9yKDtuPGUubGVuZ3RoJiYocj1lW25dLGk9dGhpcy5nZXRSZW5kZXJOb2RlQnlOYW1lKHIpLGkuZXhwYW5kZWQpO24rKyk7aWYobj09ZS5sZW5ndGgtMil7bGV0IHQ9ZVtuKzFdO2lmKGkuaW5Bbm5vdGF0aW9ucy5ub2RlTmFtZXNbdF0pcmV0dXJuIHQ7aWYoaS5vdXRBbm5vdGF0aW9ucy5ub2RlTmFtZXNbdF0pcmV0dXJuIHR9cmV0dXJuIHJ9c2V0RGVwdGgodCl7Q1d0KHRoaXMucm9vdCwrdCl9aXNOb2RlQXV4aWxpYXJ5KHQpe2xldCBlPXRoaXMuZ2V0UmVuZGVyTm9kZUJ5TmFtZSh0Lm5vZGUucGFyZW50Tm9kZS5uYW1lKSxuPVNlLmV4cG9ydHMuZmluZChlLmlzb2xhdGVkSW5FeHRyYWN0LChlPT5lLm5vZGUubmFtZT09PXQubm9kZS5uYW1lKSk7cmV0dXJuISFufHwobj1TZS5leHBvcnRzLmZpbmQoZS5pc29sYXRlZE91dEV4dHJhY3QsKGU9PmUubm9kZS5uYW1lPT09dC5ub2RlLm5hbWUpKSwhIW4pfWdldE5hbWVzT2ZSZW5kZXJlZE9wcygpe3JldHVybiB0aGlzLnJlbmRlcmVkT3BOYW1lc31jbG9uZUFuZEFkZEZ1bmN0aW9uT3BOb2RlKHQsZSxuLGkpe2NvbnN0IHI9bi5uYW1lLnJlcGxhY2UoZSxpKTtsZXQgbz10Lm1ldGFncmFwaC5ub2RlKHIpO2lmKG8pcmV0dXJuIG87bz1uZXcgWEd0KHtuYW1lOnIsaW5wdXQ6W10sZGV2aWNlOm4uZGV2aWNlLG9wOm4ub3AsYXR0cjpTZS5leHBvcnRzLmNsb25lRGVlcChuLmF0dHIpfSksby5jYXJkaW5hbGl0eT1uLmNhcmRpbmFsaXR5LG8uaW5jbHVkZT1uLmluY2x1ZGUsby5vdXRwdXRTaGFwZXM9U2UuZXhwb3J0cy5jbG9uZURlZXAobi5vdXRwdXRTaGFwZXMpLG8ueGxhQ2x1c3Rlcj1uLnhsYUNsdXN0ZXIsby5mdW5jdGlvbklucHV0SW5kZXg9bi5mdW5jdGlvbklucHV0SW5kZXgsby5mdW5jdGlvbk91dHB1dEluZGV4PW4uZnVuY3Rpb25PdXRwdXRJbmRleCxvLmlucHV0cz1uLmlucHV0cy5tYXAoKHQ9Pntjb25zdCBuPVNlLmV4cG9ydHMuY2xvbmUodCk7cmV0dXJuIG4ubmFtZT10Lm5hbWUucmVwbGFjZShlLGkpLG59KSksby5wYXJlbnROb2RlPXQsdC5tZXRhZ3JhcGguc2V0Tm9kZShvLm5hbWUsbyksdGhpcy5oaWVyYXJjaHkuc2V0Tm9kZShvLm5hbWUsbyk7Y29uc3QgYT1uPT50aGlzLmNsb25lQW5kQWRkRnVuY3Rpb25PcE5vZGUodCxlLG4saSk7cmV0dXJuIG8uaW5FbWJlZGRpbmdzPW4uaW5FbWJlZGRpbmdzLm1hcChhKSxvLm91dEVtYmVkZGluZ3M9bi5vdXRFbWJlZGRpbmdzLm1hcChhKSxvfWNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGUodCxlLG4saSxyKXtjb25zdCBvPXt9LGE9dGhpcy5jbG9uZUZ1bmN0aW9uTGlicmFyeU1ldGFub2RlSGVscGVyKHQsZSxuLGkscixvKTtyZXR1cm4gU2UuZXhwb3J0cy5pc0VtcHR5KG8pfHx0aGlzLnBhdGNoRWRnZXNGcm9tRnVuY3Rpb25PdXRwdXRzKGUsbyksYX1jbG9uZUZ1bmN0aW9uTGlicmFyeU1ldGFub2RlSGVscGVyKHQsZSxuLGkscixvKXtjb25zdCBhPSRHdChuLm5hbWUucmVwbGFjZShpLHIpKTtyZXR1cm4gYS5kZXB0aD1uLmRlcHRoLGEuY2FyZGluYWxpdHk9bi5jYXJkaW5hbGl0eSxhLnRlbXBsYXRlSWQ9bi50ZW1wbGF0ZUlkLGEub3BIaXN0b2dyYW09U2UuZXhwb3J0cy5jbG9uZShuLm9wSGlzdG9ncmFtKSxhLmRldmljZUhpc3RvZ3JhbT1TZS5leHBvcnRzLmNsb25lKG4uZGV2aWNlSGlzdG9ncmFtKSxhLnhsYUNsdXN0ZXJIaXN0b2dyYW09U2UuZXhwb3J0cy5jbG9uZShuLnhsYUNsdXN0ZXJIaXN0b2dyYW0pLGEuaGFzTm9uQ29udHJvbEVkZ2VzPW4uaGFzTm9uQ29udHJvbEVkZ2VzLGEuaW5jbHVkZT1uLmluY2x1ZGUsYS5ub2RlQXR0cmlidXRlcz1TZS5leHBvcnRzLmNsb25lKG4ubm9kZUF0dHJpYnV0ZXMpLGEuYXNzb2NpYXRlZEZ1bmN0aW9uPW4uYXNzb2NpYXRlZEZ1bmN0aW9uLFNlLmV4cG9ydHMuZWFjaChuLm1ldGFncmFwaC5ub2RlcygpLChzPT57Y29uc3QgbD1uLm1ldGFncmFwaC5ub2RlKHMpO3N3aXRjaChsLnR5cGUpe2Nhc2Ugakd0Lk1FVEE6Y29uc3Qgbj10aGlzLmNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGVIZWxwZXIodCxlLGwsaSxyLG8pO24ucGFyZW50Tm9kZT1hLGEubWV0YWdyYXBoLnNldE5vZGUobi5uYW1lLG4pLHRoaXMuaGllcmFyY2h5LnNldE5vZGUobi5uYW1lLG4pO2JyZWFrO2Nhc2Ugakd0Lk9QOmNvbnN0IHM9dGhpcy5jbG9uZUFuZEFkZEZ1bmN0aW9uT3BOb2RlKGEsaSxsLHIpO1NlLmV4cG9ydHMuaXNOdW1iZXIocy5mdW5jdGlvbklucHV0SW5kZXgpJiZ0aGlzLnBhdGNoRWRnZXNJbnRvRnVuY3Rpb25JbnB1dHMoZSxzKSxTZS5leHBvcnRzLmlzTnVtYmVyKHMuZnVuY3Rpb25PdXRwdXRJbmRleCkmJihvW3MuZnVuY3Rpb25PdXRwdXRJbmRleF09cyk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4obC5uYW1lKyIgaXMgb2RkbHkgbmVpdGhlciBhIG1ldGFub2RlIG5vciBhbiBvcG5vZGUuIil9fSkpLHRoaXMuY2xvbmVMaWJyYXJ5TWV0YW5vZGVFZGdlcyhuLGEsaSxyKSxhfWNsb25lTGlicmFyeU1ldGFub2RlRWRnZXModCxlLG4saSl7U2UuZXhwb3J0cy5lYWNoKHQubWV0YWdyYXBoLmVkZ2VzKCksKHI9Pntjb25zdCBvPXQubWV0YWdyYXBoLmVkZ2UociksYT1vLnYucmVwbGFjZShuLGkpLHM9by53LnJlcGxhY2UobixpKSxsPW5ldyBKR3QoYSxzKTtsLmluYm91bmQ9by5pbmJvdW5kLGwubnVtUmVndWxhckVkZ2VzPW8ubnVtUmVndWxhckVkZ2VzLGwubnVtQ29udHJvbEVkZ2VzPW8ubnVtQ29udHJvbEVkZ2VzLGwubnVtUmVmRWRnZXM9by5udW1SZWZFZGdlcyxsLnRvdGFsU2l6ZT1vLnRvdGFsU2l6ZSxvLmJhc2VFZGdlTGlzdCYmKGwuYmFzZUVkZ2VMaXN0PW8uYmFzZUVkZ2VMaXN0Lm1hcCgodD0+e2NvbnN0IGU9U2UuZXhwb3J0cy5jbG9uZSh0KTtyZXR1cm4gZS52PXQudi5yZXBsYWNlKG4saSksZS53PXQudy5yZXBsYWNlKG4saSksZX0pKSksZS5tZXRhZ3JhcGgubm9kZShzKT9lLm1ldGFncmFwaC5zZXRFZGdlKGEscyxsKTplLm1ldGFncmFwaC5zZXRFZGdlKHMsYSxsKX0pKX1wYXRjaEVkZ2VzSW50b0Z1bmN0aW9uSW5wdXRzKHQsZSl7bGV0IG49TWF0aC5taW4oZS5mdW5jdGlvbklucHV0SW5kZXgsdC5pbnB1dHMubGVuZ3RoLTEpLGk9U2UuZXhwb3J0cy5jbG9uZSh0LmlucHV0c1tuXSk7Zm9yKDtpLmlzQ29udHJvbERlcGVuZGVuY3k7KW4rKyxpPXQuaW5wdXRzW25dO2UuaW5wdXRzLnB1c2goaSk7Y29uc3Qgcj10aGlzLmhpZXJhcmNoeS5nZXRQcmVkZWNlc3NvcnModC5uYW1lKTtsZXQgbyxhPTA7U2UuZXhwb3J0cy5lYWNoKHIucmVndWxhciwodD0+e2lmKGErPXQubnVtUmVndWxhckVkZ2VzLGE+bilyZXR1cm4gbz10LCExfSkpLFNlLmV4cG9ydHMuZWFjaChvLmJhc2VFZGdlTGlzdCwobj0+e24udz09PXQubmFtZSYmKG4udz1lLm5hbWUpLG4udj09PXQubmFtZSYmKG4udj1lLm5hbWUpfSkpfXBhdGNoRWRnZXNGcm9tRnVuY3Rpb25PdXRwdXRzKHQsZSl7Y29uc3Qgbj10aGlzLmhpZXJhcmNoeS5nZXRTdWNjZXNzb3JzKHQubmFtZSk7U2UuZXhwb3J0cy5lYWNoKG4ucmVndWxhciwobj0+e1NlLmV4cG9ydHMuZWFjaChuLmJhc2VFZGdlTGlzdCwobj0+e2NvbnN0IGk9dGhpcy5oaWVyYXJjaHkubm9kZShuLncpO1NlLmV4cG9ydHMuZWFjaChpLmlucHV0cywoaT0+e2kubmFtZT09PXQubmFtZSYmKGkubmFtZT1lW2kub3V0cHV0VGVuc29yS2V5XS5uYW1lLGkub3V0cHV0VGVuc29yS2V5PW4ub3V0cHV0VGVuc29yS2V5KX0pKX0pKSxTZS5leHBvcnRzLmVhY2gobi5iYXNlRWRnZUxpc3QsKHQ9Pnt0LnY9ZVt0Lm91dHB1dFRlbnNvcktleV0ubmFtZSx0Lm91dHB1dFRlbnNvcktleT0iMCJ9KSl9KSl9YnVpbGRTdWJoaWVyYXJjaHkodCl7aWYodCBpbiB0aGlzLmhhc1N1YmhpZXJhcmNoeSlyZXR1cm47dGhpcy5oYXNTdWJoaWVyYXJjaHlbdF09ITA7bGV0IGU9dGhpcy5pbmRleFt0XTtpZihlLm5vZGUudHlwZSE9PWpHdC5NRVRBJiZlLm5vZGUudHlwZSE9PWpHdC5TRVJJRVMpcmV0dXJuO2xldCBuPWUsaT1uLm5vZGUubWV0YWdyYXBoLHI9bi5jb3JlR3JhcGg7Y29uc3Qgbz1bXSxhPVtdO1NlLmV4cG9ydHMuaXNFbXB0eSh0aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zKXx8KFNlLmV4cG9ydHMuZWFjaChpLm5vZGVzKCksKHQ9Pntjb25zdCBlPWkubm9kZSh0KSxuPXRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnNbZS5vcF07aWYoIW4pcmV0dXJuO2lmKDA9PT10LmluZGV4T2YoVkd0KSlyZXR1cm47Y29uc3Qgcj10aGlzLmNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGUoaSxlLG4ubm9kZSxuLm5vZGUubmFtZSxlLm5hbWUpO28ucHVzaChlKSxhLnB1c2gocil9KSksU2UuZXhwb3J0cy5lYWNoKGEsKCh0LGUpPT57Y29uc3Qgbj1vW2VdO3QucGFyZW50Tm9kZT1uLnBhcmVudE5vZGUsaS5zZXROb2RlKG4ubmFtZSx0KSx0aGlzLmhpZXJhcmNoeS5zZXROb2RlKG4ubmFtZSx0KX0pKSksU2UuZXhwb3J0cy5lYWNoKGkubm9kZXMoKSwodD0+e2xldCBlPXRoaXMuZ2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKHQpLG49ZS5ub2RlO3Iuc2V0Tm9kZSh0LGUpLG4uaXNHcm91cE5vZGV8fChTZS5leHBvcnRzLmVhY2gobi5pbkVtYmVkZGluZ3MsKHQ9PntsZXQgbj1uZXcgU1d0KG51bGwpLGk9bmV3IHdXdCh0KTtNV3QoZSx0LGksbixiV3QuQ09OU1RBTlQpLHRoaXMuaW5kZXhbdC5uYW1lXT1pfSkpLFNlLmV4cG9ydHMuZWFjaChuLm91dEVtYmVkZGluZ3MsKHQ9PntsZXQgbj1uZXcgU1d0KG51bGwpLGk9bmV3IHdXdCh0KTtFV3QoZSx0LGksbixiV3QuU1VNTUFSWSksdGhpcy5pbmRleFt0Lm5hbWVdPWl9KSkpfSkpLFNlLmV4cG9ydHMuZWFjaChpLmVkZ2VzKCksKHQ9PntsZXQgZT1pLmVkZ2UodCksbj1uZXcgU1d0KGUpO24uaXNGYWRlZE91dD10aGlzLmluZGV4W3Qudl0uaXNGYWRlZE91dHx8dGhpcy5pbmRleFt0LnddLmlzRmFkZWRPdXQsci5zZXRFZGdlKHQudix0Lncsbil9KSksbi5ub2RlLnR5cGU9PT1qR3QuTUVUQSYmKGZ1bmN0aW9uIHModCxlKXsoZnVuY3Rpb24gbih0KXtsZXQgZT10LmNvcmVHcmFwaDtTZS5leHBvcnRzLmVhY2goZS5ub2RlcygpLChuPT57ZS5ub2RlKG4pLm5vZGUuaW5jbHVkZSE9PUdHdC5FWENMVURFfHxuLnN0YXJ0c1dpdGgoVkd0KXx8KHQuY29yZUdyYXBoLm91dEVkZ2VzKG4pLmxlbmd0aD50LmNvcmVHcmFwaC5pbkVkZ2VzKG4pLmxlbmd0aD9rV3QodCxuKTpMV3QodCxuKSl9KSl9KSh0KSxmV3QubGVuZ3RoJiYoZnVuY3Rpb24gaSh0KXtsZXQgZT10LmNvcmVHcmFwaDtTZS5leHBvcnRzLmVhY2goZS5ub2RlcygpLChuPT57bGV0IGk9ZS5ub2RlKG4pO2kubm9kZS5pbmNsdWRlPT09R0d0LlVOU1BFQ0lGSUVEJiZQV3QoaS5ub2RlLGZXdCkmJmtXdCh0LG4pfSkpfSkodCksbVd0Lmxlbmd0aCYmKGZ1bmN0aW9uIHIodCl7bGV0IGU9dC5jb3JlR3JhcGg7U2UuZXhwb3J0cy5lYWNoKGUubm9kZXMoKSwobj0+e2xldCBpPWUubm9kZShuKTtpLm5vZGUuaW5jbHVkZT09PUdHdC5VTlNQRUNJRklFRCYmUFd0KGkubm9kZSxtV3QpJiZMV3QodCxuKX0pKX0pKHQpLGUmJihmdW5jdGlvbiBvKHQpe2xldCBlPXQuY29yZUdyYXBoLG49e30saT17fSxyPTA7aWYoU2UuZXhwb3J0cy5lYWNoKGUubm9kZXMoKSwodD0+e2lmKGUubm9kZSh0KS5ub2RlLmluY2x1ZGUhPT1HR3QuVU5TUEVDSUZJRUQpcmV0dXJuO2xldCBvPVNlLmV4cG9ydHMucmVkdWNlKGUucHJlZGVjZXNzb3JzKHQpLCgobixpKT0+bisoZS5lZGdlKGksdCkubWV0YWVkZ2UubnVtUmVndWxhckVkZ2VzPzE6MCkpLDApOzA9PT1vJiZlLnByZWRlY2Vzc29ycyh0KS5sZW5ndGg+MCYmKG89ZS5wcmVkZWNlc3NvcnModCkubGVuZ3RoKTtsZXQgYT1TZS5leHBvcnRzLnJlZHVjZShlLnN1Y2Nlc3NvcnModCksKChuLGkpPT5uKyhlLmVkZ2UodCxpKS5tZXRhZWRnZS5udW1SZWd1bGFyRWRnZXM/MTowKSksMCk7MD09PWEmJmUuc3VjY2Vzc29ycyh0KS5sZW5ndGg+MCYmKGE9ZS5zdWNjZXNzb3JzKHQpLmxlbmd0aCksblt0XT1vLGlbdF09YSxyKyt9KSkscjwxNSlyZXR1cm47bGV0IG89TWF0aC5yb3VuZCguNzUqciksYT1NYXRoLnJvdW5kKC4yNSpyKSxzPU9iamVjdC5rZXlzKG4pLnNvcnQoKCh0LGUpPT5uW3RdLW5bZV0pKSxsPW5bc1tvXV0sYz1sK2wtbltzW2FdXTtjPU1hdGgubWF4KGMsNCk7Zm9yKGxldCBlPXItMTtuW3NbZV1dPmM7ZS0tKUxXdCh0LHNbZV0pO2xldCB1PU9iamVjdC5rZXlzKGkpLnNvcnQoKCh0LGUpPT5pW3RdLWlbZV0pKSxoPWlbdVtvXV0sZD1oKzQqKGgtaVt1W2FdXSk7ZD1NYXRoLm1heChkLDQpO2ZvcihsZXQgbj1yLTE7aVt1W25dXT5kO24tLSl7bGV0IGk9ZS5ub2RlKHVbbl0pO2kmJiFpLmlzSW5FeHRyYWN0JiZrV3QodCx1W25dKX19KSh0KSwoZnVuY3Rpb24gYSh0KXtsZXQgZT10LmNvcmVHcmFwaCxuPXt9O1NlLmV4cG9ydHMuZWFjaChlLmVkZ2VzKCksKHQ9PntlLmVkZ2UodCkubWV0YWVkZ2UubnVtUmVndWxhckVkZ2VzfHwoKG5bdC52XT1uW3Qudl18fFtdKS5wdXNoKHQpLChuW3Qud109blt0LnddfHxbXSkucHVzaCh0KSl9KSksU2UuZXhwb3J0cy5lYWNoKG4sKCh0LG4pPT57dC5sZW5ndGg+NCYmU2UuZXhwb3J0cy5lYWNoKHQsKHQ9PkFXdChlLHQudix0LncpKSl9KSl9KSh0KTtsZXQgcz10LmNvcmVHcmFwaDtTZS5leHBvcnRzLmVhY2gocy5ub2RlcygpLChlPT57bGV0IG49cy5ub2RlKGUpLGk9cy5uZWlnaGJvcnMoZSkubGVuZ3RoO2lmKG4ubm9kZS5pbmNsdWRlPT09R0d0LlVOU1BFQ0lGSUVEJiYwPT09aSl7bGV0IGk9bi5vdXRBbm5vdGF0aW9ucy5saXN0Lmxlbmd0aD4wLHI9bi5pbkFubm90YXRpb25zLmxpc3QubGVuZ3RoPjA7bi5pc0luRXh0cmFjdD8odC5pc29sYXRlZEluRXh0cmFjdC5wdXNoKG4pLG4ubm9kZS5pbmNsdWRlPUdHdC5FWENMVURFLHMucmVtb3ZlTm9kZShlKSk6bi5pc091dEV4dHJhY3Q/KHQuaXNvbGF0ZWRPdXRFeHRyYWN0LnB1c2gobiksbi5ub2RlLmluY2x1ZGU9R0d0LkVYQ0xVREUscy5yZW1vdmVOb2RlKGUpKTppJiYhcj8obi5pc0luRXh0cmFjdD0hMCx0Lmlzb2xhdGVkSW5FeHRyYWN0LnB1c2gobiksbi5ub2RlLmluY2x1ZGU9R0d0LkVYQ0xVREUscy5yZW1vdmVOb2RlKGUpKTpyJiYhaSYmKG4uaXNPdXRFeHRyYWN0PSEwLHQuaXNvbGF0ZWRPdXRFeHRyYWN0LnB1c2gobiksbi5ub2RlLmluY2x1ZGU9R0d0LkVYQ0xVREUscy5yZW1vdmVOb2RlKGUpKX19KSl9KShuLHRoaXMuYXV0b0V4dHJhY3ROb2RlcyksU2UuZXhwb3J0cy5pc0VtcHR5KHRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnMpfHx0aGlzLmJ1aWxkU3ViaGllcmFyY2hpZXNGb3JOZWVkZWRGdW5jdGlvbnMoaSksdD09PUZHdCYmU2UuZXhwb3J0cy5mb3JPd24odGhpcy5oaWVyYXJjaHkubGlicmFyeUZ1bmN0aW9ucywoKHQsZSk9Pntjb25zdCBpPXQubm9kZSxvPXRoaXMuZ2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKGkubmFtZSk7bi5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5wdXNoKG8pLG8ubm9kZS5pbmNsdWRlPUdHdC5FWENMVURFLHIucmVtb3ZlTm9kZShpLm5hbWUpfSkpO2xldCBsPW4ubm9kZS5wYXJlbnROb2RlO2lmKCFsKXJldHVybjtsZXQgYz10aGlzLmluZGV4W2wubmFtZV0sdT0odCwuLi5lKT0+ZS5jb25jYXQoW3Q/IklOIjoiT1VUIl0pLmpvaW4oIn5+IiksaD10aGlzLmhpZXJhcmNoeS5nZXRCcmlkZ2VncmFwaCh0KSxkPXtpbjp7fSxvdXQ6e30sY29udHJvbDp7fX07U2UuZXhwb3J0cy5lYWNoKGguZWRnZXMoKSwodD0+e2xldCBlPSEhaS5ub2RlKHQudyksbj1lP3Qudjp0Lnc7aC5lZGdlKHQpLm51bVJlZ3VsYXJFZGdlcz9lP2Qub3V0W25dPShkLm91dFtuXXx8MCkrMTpkLmluW25dPShkLmluW25dfHwwKSsxOmQuY29udHJvbFtuXT0oZC5jb250cm9sW25dfHwwKSsxfSkpO2xldCBwPXRoaXMuaGllcmFyY2h5LmdldE5vZGVNYXAoKTtTZS5leHBvcnRzLmVhY2goaC5lZGdlcygpLChuPT57bGV0IG89aC5lZGdlKG4pLGE9ISFpLm5vZGUobi53KSxbcyxmXT1hP1tuLncsbi52XTpbbi52LG4ud10sbT10aGlzLmluZGV4W3NdLGc9dGhpcy5pbmRleFtmXSxfPWc/Zy5ub2RlOnBbZl0seT0hby5udW1SZWd1bGFyRWRnZXMmJmQuY29udHJvbFtmXT40LFssdl09YT9bZS5pbkFubm90YXRpb25zLG0uaW5Bbm5vdGF0aW9uc106W2Uub3V0QW5ub3RhdGlvbnMsbS5vdXRBbm5vdGF0aW9uc10sYj1udWxsLHg9ITE7aWYoISgoYT9kLm91dDpkLmluKVtmXT40KSYmIXkmJm0uaXNJbkNvcmUoKSl7bGV0IGU9ZT0+Yy5jb3JlR3JhcGguZWRnZShhP3t2OmUsdzp0fTp7djp0LHc6ZX0pO2I9ZShmKSxifHwoYj1lKHUoYSxmLGwubmFtZSkpKSx4PSEhYn1sZXQgdz0hMTtpZihiJiYhby5udW1SZWd1bGFyRWRnZXMpe2xldCB0PWIsZT1jLm5vZGU7Zm9yKDt0LmFkam9pbmluZ01ldGFlZGdlOyl0PXQuYWRqb2luaW5nTWV0YWVkZ2UsZT1lLnBhcmVudE5vZGU7bGV0IG49dGhpcy5oaWVyYXJjaHkuZ2V0VG9wb2xvZ2ljYWxPcmRlcmluZyhlLm5hbWUpLGk9dC5tZXRhZWRnZTt3PW5baS52XT5uW2kud119aWYoeD14JiYhdywheClyZXR1cm4gdm9pZCB2LnB1c2gobmV3IHZXdChfLGcsbmV3IFNXdChvKSxiV3QuU0hPUlRDVVQsYSkpO2xldCBTPXUoYSx0KSxNPXUoYSxmLHQpLEU9ci5ub2RlKE0pO2lmKCFFKXtsZXQgdD1yLm5vZGUoUyk7dHx8KHQ9bmV3IHdXdCh7bmFtZTpTLHR5cGU6akd0LkJSSURHRSxpc0dyb3VwTm9kZTohMSxjYXJkaW5hbGl0eTowLHBhcmVudE5vZGU6bnVsbCxzdGF0czpudWxsLGluY2x1ZGU6R0d0LlVOU1BFQ0lGSUVELGluYm91bmQ6YSxub2RlQXR0cmlidXRlczp7fX0pLHRoaXMuaW5kZXhbU109dCxyLnNldE5vZGUoUyx0KSksRT1uZXcgd1d0KHtuYW1lOk0sdHlwZTpqR3QuQlJJREdFLGlzR3JvdXBOb2RlOiExLGNhcmRpbmFsaXR5OjEscGFyZW50Tm9kZTpudWxsLHN0YXRzOm51bGwsaW5jbHVkZTpHR3QuVU5TUEVDSUZJRUQsaW5ib3VuZDphLG5vZGVBdHRyaWJ1dGVzOnt9fSksdGhpcy5pbmRleFtNXT1FLHIuc2V0Tm9kZShNLEUpLHIuc2V0UGFyZW50KE0sUyksdC5ub2RlLmNhcmRpbmFsaXR5Kyt9bGV0IFQ9bmV3IFNXdChvKTtULmFkam9pbmluZ01ldGFlZGdlPWIsYT9yLnNldEVkZ2UoTSxzLFQpOnIuc2V0RWRnZShzLE0sVCl9KSksU2UuZXhwb3J0cy5lYWNoKFshMCwhMV0sKGU9PntsZXQgbj11KGUsdCksaT1yLm5vZGUobik7aSYmU2UuZXhwb3J0cy5lYWNoKHIubm9kZXMoKSwobz0+e2lmKHIubm9kZShvKS5ub2RlLnR5cGU9PT1qR3QuQlJJREdFKXJldHVybjtpZighKGU/IXIucHJlZGVjZXNzb3JzKG8pLmxlbmd0aDohci5zdWNjZXNzb3JzKG8pLmxlbmd0aCkpcmV0dXJuO2xldCBhPXUoZSx0LCJTVFJVQ1RVUkFMX1RBUkdFVCIpLHM9ci5ub2RlKGEpO3N8fChzPW5ldyB3V3Qoe25hbWU6YSx0eXBlOmpHdC5CUklER0UsaXNHcm91cE5vZGU6ITEsY2FyZGluYWxpdHk6MSxwYXJlbnROb2RlOm51bGwsc3RhdHM6bnVsbCxpbmNsdWRlOkdHdC5VTlNQRUNJRklFRCxpbmJvdW5kOmUsbm9kZUF0dHJpYnV0ZXM6e319KSxzLnN0cnVjdHVyYWw9ITAsdGhpcy5pbmRleFthXT1zLHIuc2V0Tm9kZShhLHMpLGkubm9kZS5jYXJkaW5hbGl0eSsrLHIuc2V0UGFyZW50KGEsbikpO2xldCBsPW5ldyBTV3QobnVsbCk7bC5zdHJ1Y3R1cmFsPSEwLGwud2VpZ2h0LS0sZT9yLnNldEVkZ2UoYSxvLGwpOnIuc2V0RWRnZShvLGEsbCl9KSl9KSl9YnVpbGRTdWJoaWVyYXJjaGllc0Zvck5lZWRlZEZ1bmN0aW9ucyh0KXtTZS5leHBvcnRzLmVhY2godC5lZGdlcygpLChlPT57bGV0IG49dC5lZGdlKGUpLGk9bmV3IFNXdChuKTtTZS5leHBvcnRzLmZvckVhY2goaS5tZXRhZWRnZS5iYXNlRWRnZUxpc3QsKHQ9Pntjb25zdCBlPXQudi5zcGxpdChIR3QpO2ZvcihsZXQgdD1lLmxlbmd0aDt0Pj0wO3QtLSl7Y29uc3Qgbj1lLnNsaWNlKDAsdCksaT10aGlzLmhpZXJhcmNoeS5ub2RlKG4uam9pbihIR3QpKTtpZihpKXtpZihpLnR5cGU9PT1qR3QuT1AmJnRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnNbaS5vcF0pZm9yKGxldCB0PTE7dDxuLmxlbmd0aDt0Kyspe2NvbnN0IGU9bi5zbGljZSgwLHQpLmpvaW4oSEd0KTtlJiZ0aGlzLmJ1aWxkU3ViaGllcmFyY2h5KGUpfWJyZWFrfX19KSl9KSl9fWNsYXNzIHZXdHtjb25zdHJ1Y3Rvcih0LGUsbixpLHIpe3RoaXMubm9kZT10LHRoaXMucmVuZGVyTm9kZUluZm89ZSx0aGlzLnJlbmRlck1ldGFlZGdlSW5mbz1uLHRoaXMuYW5ub3RhdGlvblR5cGU9aSx0aGlzLmR4PTAsdGhpcy5keT0wLHRoaXMud2lkdGg9MCx0aGlzLmhlaWdodD0wLG4mJm4ubWV0YWVkZ2UmJih0aGlzLnY9bi5tZXRhZWRnZS52LHRoaXMudz1uLm1ldGFlZGdlLncpLHRoaXMuaXNJbj1yLHRoaXMucG9pbnRzPVtdfX12YXIgYld0OyEoZnVuY3Rpb24odCl7dFt0LlNIT1JUQ1VUPTBdPSJTSE9SVENVVCIsdFt0LkNPTlNUQU5UPTFdPSJDT05TVEFOVCIsdFt0LlNVTU1BUlk9Ml09IlNVTU1BUlkiLHRbdC5FTExJUFNJUz0zXT0iRUxMSVBTSVMifSkoYld0fHwoYld0PXt9KSk7Y2xhc3MgeFd0e2NvbnN0cnVjdG9yKCl7dGhpcy5saXN0PVtdLHRoaXMubm9kZU5hbWVzPXt9fXB1c2godCl7aWYodC5ub2RlLm5hbWUgaW4gdGhpcy5ub2RlTmFtZXMpcmV0dXJuO2lmKHRoaXMubm9kZU5hbWVzW3Qubm9kZS5uYW1lXT0hMCx0aGlzLmxpc3QubGVuZ3RoPDUpcmV0dXJuIHZvaWQgdGhpcy5saXN0LnB1c2godCk7bGV0IGU9dGhpcy5saXN0W3RoaXMubGlzdC5sZW5ndGgtMV07aWYoZS5hbm5vdGF0aW9uVHlwZT09PWJXdC5FTExJUFNJUyl7bGV0IHQ9ZS5ub2RlO3JldHVybiB2b2lkIHQuc2V0TnVtTW9yZU5vZGVzKCsrdC5udW1Nb3JlTm9kZXMpfWxldCBuPW5ldyBZR3QoMSk7dGhpcy5saXN0LnB1c2gobmV3IHZXdChuLG5ldyB3V3QobiksbnVsbCxiV3QuRUxMSVBTSVMsdC5pc0luKSl9fWNsYXNzIHdXdHtjb25zdHJ1Y3Rvcih0KXtpZih0aGlzLm5vZGU9dCx0aGlzLmV4cGFuZGVkPSExLHRoaXMuaW5Bbm5vdGF0aW9ucz1uZXcgeFd0LHRoaXMub3V0QW5ub3RhdGlvbnM9bmV3IHhXdCx0aGlzLng9MCx0aGlzLnk9MCx0aGlzLndpZHRoPTAsdGhpcy5oZWlnaHQ9MCx0aGlzLmluYm94V2lkdGg9MCx0aGlzLm91dGJveFdpZHRoPTAsdGhpcy5leGNsdWRlZD0hMSx0aGlzLnN0cnVjdHVyYWw9ITEsdGhpcy5sYWJlbE9mZnNldD0wLHRoaXMucmFkaXVzPTAsdGhpcy5sYWJlbEhlaWdodD0wLHRoaXMucGFkZGluZ1RvcD0wLHRoaXMucGFkZGluZ0xlZnQ9MCx0aGlzLnBhZGRpbmdSaWdodD0wLHRoaXMucGFkZGluZ0JvdHRvbT0wLHRoaXMuaXNJbkV4dHJhY3Q9ITEsdGhpcy5pc091dEV4dHJhY3Q9ITEsdGhpcy5jb3JlQm94PXt3aWR0aDowLGhlaWdodDowfSx0aGlzLmlzRmFkZWRPdXQ9ITEsdGhpcy5kaXNwbGF5TmFtZT10Lm5hbWUuc3Vic3RyaW5nKHQubmFtZS5sYXN0SW5kZXhPZihIR3QpKzEpLHQudHlwZT09PWpHdC5NRVRBJiZ0LmFzc29jaWF0ZWRGdW5jdGlvbil7Y29uc3QgdD10aGlzLmRpc3BsYXlOYW1lLm1hdGNoKF9XdCk7dD90aGlzLmRpc3BsYXlOYW1lPXRbMV06U2UuZXhwb3J0cy5zdGFydHNXaXRoKHRoaXMuZGlzcGxheU5hbWUsVkd0KSYmKHRoaXMuZGlzcGxheU5hbWU9dGhpcy5kaXNwbGF5TmFtZS5zdWJzdHJpbmcoVkd0Lmxlbmd0aCkpfX1pc0luQ29yZSgpe3JldHVybiF0aGlzLmlzSW5FeHRyYWN0JiYhdGhpcy5pc091dEV4dHJhY3QmJiF0aGlzLmlzTGlicmFyeUZ1bmN0aW9ufX1jbGFzcyBTV3R7Y29uc3RydWN0b3IodCl7dGhpcy5tZXRhZWRnZT10LHRoaXMuYWRqb2luaW5nTWV0YWVkZ2U9bnVsbCx0aGlzLnN0cnVjdHVyYWw9ITEsdGhpcy53ZWlnaHQ9MSx0aGlzLmlzRmFkZWRPdXQ9ITF9fWZ1bmN0aW9uIE1XdCh0LGUsbixpLHIpe2xldCBvPW5ldyB2V3QoZSxuLGksciwhMCk7dC5pbkFubm90YXRpb25zLnB1c2gobyl9ZnVuY3Rpb24gRVd0KHQsZSxuLGkscil7bGV0IG89bmV3IHZXdChlLG4saSxyLCExKTt0Lm91dEFubm90YXRpb25zLnB1c2gobyl9Y2xhc3MgVFd0IGV4dGVuZHMgd1d0e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCk7bGV0IG49dC5tZXRhZ3JhcGguZ3JhcGgoKTt0aGlzLmNvcmVHcmFwaD1vV3Qobi5uYW1lLFVHdC5DT1JFLGUpLHRoaXMuaW5FeHRyYWN0Qm94PXt3aWR0aDowLGhlaWdodDowfSx0aGlzLm91dEV4dHJhY3RCb3g9e3dpZHRoOjAsaGVpZ2h0OjB9LHRoaXMubGlicmFyeUZ1bmN0aW9uc0JveD17d2lkdGg6MCxoZWlnaHQ6MH0sdGhpcy5pc29sYXRlZEluRXh0cmFjdD1bXSx0aGlzLmlzb2xhdGVkT3V0RXh0cmFjdD1bXSx0aGlzLmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0PVtdfX1mdW5jdGlvbiBDV3QodCxlKXt0LmNvcmVHcmFwaCYmKGZ1bmN0aW9uIG4odCxlKXtTZS5leHBvcnRzLmVhY2godC5ub2RlcygpLChuPT57bGV0IGk9dC5ub2RlKG4pO2lmKGkuZXhwYW5kZWQ9ZT4xLGU+MClzd2l0Y2goaS5ub2RlLnR5cGUpe2Nhc2Ugakd0Lk1FVEE6Y2FzZSBqR3QuU0VSSUVTOkNXdChpLGUtMSl9fSkpfSkodC5jb3JlR3JhcGgsZSl9ZnVuY3Rpb24gQVd0KHQsZSxuKXtsZXQgaT10Lm5vZGUoZSkscj10Lm5vZGUobiksbz10LmVkZ2UoZSxuKTsoaS5ub2RlLmluY2x1ZGUhPT1HR3QuSU5DTFVERSYmci5ub2RlLmluY2x1ZGUhPT1HR3QuSU5DTFVERXx8aS5ub2RlLmluY2x1ZGU9PT1HR3QuRVhDTFVERXx8ci5ub2RlLmluY2x1ZGU9PT1HR3QuRVhDTFVERSkmJihFV3QoaSxyLm5vZGUscixvLGJXdC5TSE9SVENVVCksTVd0KHIsaS5ub2RlLGksbyxiV3QuU0hPUlRDVVQpLHQucmVtb3ZlRWRnZShlLG4pKX1mdW5jdGlvbiBrV3QodCxlLG4pe2xldCBpPXQuY29yZUdyYXBoLHI9aS5ub2RlKGUpO3IuaXNPdXRFeHRyYWN0PSEwLFNlLmV4cG9ydHMuZWFjaChpLnByZWRlY2Vzc29ycyhlKSwoKHQsbik9PntBV3QoaSx0LGUpfSkpLFNlLmV4cG9ydHMuZWFjaChpLnN1Y2Nlc3NvcnMoZSksKCh0LG4pPT57QVd0KGksZSx0KX0pKSwwPT09aS5uZWlnaGJvcnMoZSkubGVuZ3RoJiYoci5ub2RlLmluY2x1ZGU9R0d0LkVYQ0xVREUsdC5pc29sYXRlZE91dEV4dHJhY3QucHVzaChyKSxpLnJlbW92ZU5vZGUoZSkpfWZ1bmN0aW9uIExXdCh0LGUsbil7bGV0IGk9dC5jb3JlR3JhcGgscj1pLm5vZGUoZSk7ci5pc0luRXh0cmFjdD0hMCxTZS5leHBvcnRzLmVhY2goaS5zdWNjZXNzb3JzKGUpLCgodCxuKT0+e0FXdChpLGUsdCl9KSksU2UuZXhwb3J0cy5lYWNoKGkucHJlZGVjZXNzb3JzKGUpLCgodCxuKT0+e0FXdChpLHQsZSl9KSksMD09PWkubmVpZ2hib3JzKGUpLmxlbmd0aCYmKHIubm9kZS5pbmNsdWRlPUdHdC5FWENMVURFLHQuaXNvbGF0ZWRJbkV4dHJhY3QucHVzaChyKSxpLnJlbW92ZU5vZGUoZSkpfWZ1bmN0aW9uIFBXdCh0LGUpe2lmKHQudHlwZT09PWpHdC5PUCl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspaWYodC5vcD09PWVbbl0pcmV0dXJuITB9ZWxzZSBpZih0LnR5cGU9PT1qR3QuTUVUQSl7bGV0IG49dC5nZXRSb290T3AoKTtpZihuKWZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWlmKG4ub3A9PT1lW3RdKXJldHVybiEwfXJldHVybiExfWNvbnN0IE5XdD17YW5pbWF0aW9uOntkdXJhdGlvbjoyNTB9LGdyYXBoOnttZXRhOntub2RlU2VwOjUscmFua1NlcDoyNSxlZGdlU2VwOjV9LHNlcmllczp7bm9kZVNlcDo1LHJhbmtTZXA6MjUsZWRnZVNlcDo1fSxwYWRkaW5nOntwYWRkaW5nVG9wOjQwLHBhZGRpbmdMZWZ0OjIwfX0sc3Vic2NlbmU6e21ldGE6e3BhZGRpbmdUb3A6MTAscGFkZGluZ0JvdHRvbToxMCxwYWRkaW5nTGVmdDoxMCxwYWRkaW5nUmlnaHQ6MTAsbGFiZWxIZWlnaHQ6MjAsZXh0cmFjdFhPZmZzZXQ6MTUsZXh0cmFjdFlPZmZzZXQ6MjB9LHNlcmllczp7cGFkZGluZ1RvcDoxMCxwYWRkaW5nQm90dG9tOjEwLHBhZGRpbmdMZWZ0OjEwLHBhZGRpbmdSaWdodDoxMCxsYWJlbEhlaWdodDoxMH19LG5vZGVTaXplOnttZXRhOntyYWRpdXM6NSx3aWR0aDo2MCxtYXhMYWJlbFdpZHRoOjUyLGhlaWdodDpWTSgpLmRvbWFpbihbMSwyMDBdKS5yYW5nZShbMTUsNjBdKS5jbGFtcCghMCksZXhwYW5kQnV0dG9uUmFkaXVzOjN9LG9wOnt3aWR0aDoxNSxoZWlnaHQ6NixyYWRpdXM6MyxsYWJlbE9mZnNldDotOCxtYXhMYWJlbFdpZHRoOjMwfSxzZXJpZXM6e2V4cGFuZGVkOntyYWRpdXM6MTAsbGFiZWxPZmZzZXQ6MH0sdmVydGljYWw6e3dpZHRoOjE2LGhlaWdodDoxMyxsYWJlbE9mZnNldDotMTN9LGhvcml6b250YWw6e3dpZHRoOjI0LGhlaWdodDo4LHJhZGl1czoxMCxsYWJlbE9mZnNldDotMTB9fSxicmlkZ2U6e3dpZHRoOjIwLGhlaWdodDoyMCxyYWRpdXM6MixsYWJlbE9mZnNldDowfX0sc2hvcnRjdXRTaXplOntvcDp7d2lkdGg6MTAsaGVpZ2h0OjR9LG1ldGE6e3dpZHRoOjEyLGhlaWdodDo0LHJhZGl1czoxfSxzZXJpZXM6e3dpZHRoOjE0LGhlaWdodDo0fX0sYW5ub3RhdGlvbnM6e2luYm94V2lkdGg6NTAsb3V0Ym94V2lkdGg6NTAseE9mZnNldDoxMCx5T2Zmc2V0OjMsbGFiZWxPZmZzZXQ6MixtYXhMYWJlbFdpZHRoOjQwfSxjb25zdGFudDp7c2l6ZTp7d2lkdGg6NCxoZWlnaHQ6NH19LHNlcmllczp7bWF4U3RhY2tDb3VudDozLHBhcmFsbGVsU3RhY2tPZmZzZXRSYXRpbzouMix0b3dlclN0YWNrT2Zmc2V0UmF0aW86LjV9LG1pbmltYXA6e3NpemU6MTUwfX0sSVd0PTE0MDtmdW5jdGlvbiBSV3QodCl7dC5ub2RlLmlzR3JvdXBOb2RlJiYoZnVuY3Rpb24gZSh0KXtsZXQgZT10LmNvcmVHcmFwaC5ub2RlcygpLm1hcCgoZT0+dC5jb3JlR3JhcGgubm9kZShlKSkpLmNvbmNhdCh0Lmlzb2xhdGVkSW5FeHRyYWN0LHQuaXNvbGF0ZWRPdXRFeHRyYWN0LHQubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QpO1NlLmV4cG9ydHMuZWFjaChlLCh0PT57c3dpdGNoKHQubm9kZS50eXBlKXtjYXNlIGpHdC5PUDpTZS5leHBvcnRzLmV4dGVuZCh0LE5XdC5ub2RlU2l6ZS5vcCk7YnJlYWs7Y2FzZSBqR3QuQlJJREdFOlNlLmV4cG9ydHMuZXh0ZW5kKHQsTld0Lm5vZGVTaXplLmJyaWRnZSk7YnJlYWs7Y2FzZSBqR3QuTUVUQTp0LmV4cGFuZGVkP1JXdCh0KTooU2UuZXhwb3J0cy5leHRlbmQodCxOV3Qubm9kZVNpemUubWV0YSksdC5oZWlnaHQ9Tld0Lm5vZGVTaXplLm1ldGEuaGVpZ2h0KHQubm9kZS5jYXJkaW5hbGl0eSkpO2JyZWFrO2Nhc2Ugakd0LlNFUklFUzp0LmV4cGFuZGVkPyhTZS5leHBvcnRzLmV4dGVuZCh0LE5XdC5ub2RlU2l6ZS5zZXJpZXMuZXhwYW5kZWQpLFJXdCh0KSk6U2UuZXhwb3J0cy5leHRlbmQodCx0Lm5vZGUuaGFzTm9uQ29udHJvbEVkZ2VzP05XdC5ub2RlU2l6ZS5zZXJpZXMudmVydGljYWw6Tld0Lm5vZGVTaXplLnNlcmllcy5ob3Jpem9udGFsKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJVbnJlY29nbml6ZWQgbm9kZSB0eXBlOiAiK3Qubm9kZS50eXBlKX10LmV4cGFuZGVkfHwoZnVuY3Rpb24gZSh0KXt0LmluYm94V2lkdGg9dC5pbkFubm90YXRpb25zLmxpc3QubGVuZ3RoPjA/Tld0LmFubm90YXRpb25zLmluYm94V2lkdGg6MCx0Lm91dGJveFdpZHRoPXQub3V0QW5ub3RhdGlvbnMubGlzdC5sZW5ndGg+MD9OV3QuYW5ub3RhdGlvbnMub3V0Ym94V2lkdGg6MCx0LmNvcmVCb3gud2lkdGg9dC53aWR0aCx0LmNvcmVCb3guaGVpZ2h0PXQuaGVpZ2h0LHQud2lkdGg9TWF0aC5tYXgodC5jb3JlQm94LndpZHRoK3QuaW5ib3hXaWR0aCt0Lm91dGJveFdpZHRoLDMqdC5kaXNwbGF5TmFtZS5sZW5ndGgpfSkodCksKGZ1bmN0aW9uIG4odCl7aWYodC5leHBhbmRlZClyZXR1cm47bGV0IGU9dC5pbkFubm90YXRpb25zLmxpc3Qsbj10Lm91dEFubm90YXRpb25zLmxpc3Q7U2UuZXhwb3J0cy5lYWNoKGUsKHQ9PnpXdCh0KSkpLFNlLmV4cG9ydHMuZWFjaChuLCh0PT56V3QodCkpKTtsZXQgaT1OV3QuYW5ub3RhdGlvbnMscj1TZS5leHBvcnRzLnJlZHVjZShlLCgoZSxuLHIpPT57bGV0IG89cj4wP2kueU9mZnNldDowO3JldHVybiBuLmR4PS0odC5jb3JlQm94LndpZHRoK24ud2lkdGgpLzItaS54T2Zmc2V0LG4uZHk9ZStvK24uaGVpZ2h0LzIsZStvK24uaGVpZ2h0fSksMCk7U2UuZXhwb3J0cy5lYWNoKGUsKHQ9Pnt0LmR5LT1yLzIsdC5sYWJlbE9mZnNldD1pLmxhYmVsT2Zmc2V0fSkpO2xldCBvPVNlLmV4cG9ydHMucmVkdWNlKG4sKChlLG4scik9PntsZXQgbz1yPjA/aS55T2Zmc2V0OjA7cmV0dXJuIG4uZHg9KHQuY29yZUJveC53aWR0aCtuLndpZHRoKS8yK2kueE9mZnNldCxuLmR5PWUrbytuLmhlaWdodC8yLGUrbytuLmhlaWdodH0pLDApO1NlLmV4cG9ydHMuZWFjaChuLCh0PT57dC5keS09by8yLHQubGFiZWxPZmZzZXQ9aS5sYWJlbE9mZnNldH0pKTtsZXQgYT1NYXRoLm1pbih0LmhlaWdodC8yLXQucmFkaXVzLHIvMik7YT1hPDA/MDphO2xldCBzPVZNKCkuZG9tYWluKFswLGUubGVuZ3RoLTFdKS5yYW5nZShbLWEsYV0pO1NlLmV4cG9ydHMuZWFjaChlLCgobixpKT0+e24ucG9pbnRzPVt7ZHg6bi5keCtuLndpZHRoLzIsZHk6bi5keX0se2R4Oi10LmNvcmVCb3gud2lkdGgvMixkeTplLmxlbmd0aD4xP3MoaSk6MH1dfSkpO2xldCBsPU1hdGgubWluKHQuaGVpZ2h0LzItdC5yYWRpdXMsby8yKTtsPWw8MD8wOmw7bGV0IGM9Vk0oKS5kb21haW4oWzAsbi5sZW5ndGgtMV0pLnJhbmdlKFstbCxsXSk7U2UuZXhwb3J0cy5lYWNoKG4sKChlLGkpPT57ZS5wb2ludHM9W3tkeDp0LmNvcmVCb3gud2lkdGgvMixkeTpuLmxlbmd0aD4xP2MoaSk6MH0se2R4OmUuZHgtZS53aWR0aC8yLGR5OmUuZHl9XX0pKSx0LmhlaWdodD1NYXRoLm1heCh0LmhlaWdodCxyLG8pfSkodCl9KSl9KSh0KSx0Lm5vZGUudHlwZT09PWpHdC5NRVRBPyhmdW5jdGlvbiBuKHQpe2xldCBlPU5XdC5zdWJzY2VuZS5tZXRhO1NlLmV4cG9ydHMuZXh0ZW5kKHQsZSksU2UuZXhwb3J0cy5leHRlbmQodC5jb3JlQm94LE9XdCh0LmNvcmVHcmFwaCxOV3QuZ3JhcGgubWV0YSkpO2xldCBuPXQuaXNvbGF0ZWRJbkV4dHJhY3QubGVuZ3RoP1NlLmV4cG9ydHMubWF4QnkodC5pc29sYXRlZEluRXh0cmFjdCwodD0+dC53aWR0aCkpLndpZHRoOm51bGw7dC5pbkV4dHJhY3RCb3gud2lkdGg9bnVsbCE9bj9uOjAsdC5pbkV4dHJhY3RCb3guaGVpZ2h0PVNlLmV4cG9ydHMucmVkdWNlKHQuaXNvbGF0ZWRJbkV4dHJhY3QsKCh0LG4saSk9PntsZXQgcj1pPjA/ZS5leHRyYWN0WU9mZnNldDowO3JldHVybiBuLng9MCxuLnk9dCtyK24uaGVpZ2h0LzIsdCtyK24uaGVpZ2h0fSksMCk7bGV0IGk9dC5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoP1NlLmV4cG9ydHMubWF4QnkodC5pc29sYXRlZE91dEV4dHJhY3QsKHQ9PnQud2lkdGgpKS53aWR0aDpudWxsO3Qub3V0RXh0cmFjdEJveC53aWR0aD1udWxsIT1pP2k6MCx0Lm91dEV4dHJhY3RCb3guaGVpZ2h0PVNlLmV4cG9ydHMucmVkdWNlKHQuaXNvbGF0ZWRPdXRFeHRyYWN0LCgodCxuLGkpPT57bGV0IHI9aT4wP2UuZXh0cmFjdFlPZmZzZXQ6MDtyZXR1cm4gbi54PTAsbi55PXQrcituLmhlaWdodC8yLHQrcituLmhlaWdodH0pLDApO2xldCByPXQubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QubGVuZ3RoP1NlLmV4cG9ydHMubWF4QnkodC5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdCwodD0+dC53aWR0aCkpLndpZHRoOm51bGw7dC5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoPW51bGwhPXI/cjowLHQubGlicmFyeUZ1bmN0aW9uc0JveC5oZWlnaHQ9U2UuZXhwb3J0cy5yZWR1Y2UodC5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdCwoKHQsbixpKT0+e2xldCByPWk+MD9lLmV4dHJhY3RZT2Zmc2V0OjA7cmV0dXJuIG4ueD0wLG4ueT10K3Irbi5oZWlnaHQvMix0K3Irbi5oZWlnaHR9KSwwKTtsZXQgbz0wO3QuaXNvbGF0ZWRJbkV4dHJhY3QubGVuZ3RoPjAmJm8rKyx0Lmlzb2xhdGVkT3V0RXh0cmFjdC5sZW5ndGg+MCYmbysrLHQubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QubGVuZ3RoPjAmJm8rKyx0LmNvcmVHcmFwaC5ub2RlQ291bnQoKT4wJiZvKys7bGV0IGE9bzw9MT8wOm8qTld0LnN1YnNjZW5lLm1ldGEuZXh0cmFjdFhPZmZzZXQ7Y29uc3Qgcz1NYXRoLm1heChJV3QsdC5pbkV4dHJhY3RCb3gud2lkdGgrdC5vdXRFeHRyYWN0Qm94LndpZHRoKTt0LmNvcmVCb3gud2lkdGgrPXMrYSt0LmxpYnJhcnlGdW5jdGlvbnNCb3gud2lkdGgrYSx0LmNvcmVCb3guaGVpZ2h0PWUubGFiZWxIZWlnaHQrTWF0aC5tYXgodC5pbkV4dHJhY3RCb3guaGVpZ2h0LHQuY29yZUJveC5oZWlnaHQsdC5saWJyYXJ5RnVuY3Rpb25zQm94LmhlaWdodCx0Lm91dEV4dHJhY3RCb3guaGVpZ2h0KSx0LndpZHRoPXQuY29yZUJveC53aWR0aCtlLnBhZGRpbmdMZWZ0K2UucGFkZGluZ1JpZ2h0LHQuaGVpZ2h0PXQucGFkZGluZ1RvcCt0LmNvcmVCb3guaGVpZ2h0K3QucGFkZGluZ0JvdHRvbX0pKHQpOnQubm9kZS50eXBlPT09akd0LlNFUklFUyYmKGZ1bmN0aW9uIGkodCl7bGV0IGU9dC5jb3JlR3JhcGgsbj1OV3Quc3Vic2NlbmUuc2VyaWVzO1NlLmV4cG9ydHMuZXh0ZW5kKHQsbiksU2UuZXhwb3J0cy5leHRlbmQodC5jb3JlQm94LE9XdCh0LmNvcmVHcmFwaCxOV3QuZ3JhcGguc2VyaWVzKSksU2UuZXhwb3J0cy5lYWNoKGUubm9kZXMoKSwodD0+e2Uubm9kZSh0KS5leGNsdWRlZD0hMX0pKSx0LndpZHRoPXQuY29yZUJveC53aWR0aCtuLnBhZGRpbmdMZWZ0K24ucGFkZGluZ1JpZ2h0LHQuaGVpZ2h0PXQuY29yZUJveC5oZWlnaHQrbi5wYWRkaW5nVG9wK24ucGFkZGluZ0JvdHRvbX0pKHQpfWZ1bmN0aW9uIE9XdCh0LGUpe1NlLmV4cG9ydHMuZXh0ZW5kKHQuZ3JhcGgoKSx7bm9kZXNlcDplLm5vZGVTZXAscmFua3NlcDplLnJhbmtTZXAsZWRnZXNlcDplLmVkZ2VTZXB9KTtsZXQgbj1bXTtpZihTZS5leHBvcnRzLmVhY2godC5ub2RlcygpLChlPT57dC5ub2RlKGUpLm5vZGUudHlwZT09PWpHdC5CUklER0V8fG4ucHVzaChlKX0pKSwhbi5sZW5ndGgpcmV0dXJue3dpZHRoOjAsaGVpZ2h0OjB9O2ZHdC5sYXlvdXQodCk7bGV0IGk9MS8wLHI9MS8wLG89LTEvMCxhPS0xLzA7cmV0dXJuIFNlLmV4cG9ydHMuZWFjaChuLChlPT57bGV0IG49dC5ub2RlKGUpLHM9LjUqbi53aWR0aCxsPW4ueC1zLGM9bi54K3M7aT1sPGk/bDppLG89Yz5vP2M6bztsZXQgdT0uNSpuLmhlaWdodCxoPW4ueS11LGQ9bi55K3U7cj1oPHI/aDpyLGE9ZD5hP2Q6YX0pKSxTZS5leHBvcnRzLmVhY2godC5lZGdlcygpLChlPT57bGV0IG49dC5lZGdlKGUpO2lmKG4uc3RydWN0dXJhbClyZXR1cm47bGV0IHM9dC5ub2RlKG4ubWV0YWVkZ2UudiksbD10Lm5vZGUobi5tZXRhZWRnZS53KTtpZigzPT09bi5wb2ludHMubGVuZ3RoJiYoZnVuY3Rpb24gYyh0KXtsZXQgZT1CV3QodFswXSx0WzFdKTtmb3IobGV0IG49MTtuPHQubGVuZ3RoLTE7bisrKXtsZXQgaT1CV3QodFtuXSx0W24rMV0pO2lmKE1hdGguYWJzKGktZSk+MSlyZXR1cm4hMTtlPWl9cmV0dXJuITB9KShuLnBvaW50cykpe2lmKG51bGwhPXMpe2xldCB0PXMuZXhwYW5kZWQ/cy54OkRXdChzKTtuLnBvaW50c1swXS54PXR9aWYobnVsbCE9bCl7bGV0IHQ9bC5leHBhbmRlZD9sLng6RFd0KGwpO24ucG9pbnRzWzJdLng9dH1uLnBvaW50cz1bbi5wb2ludHNbMF0sbi5wb2ludHNbMV1dfW51bGwhPWwmJihuLnBvaW50c1tuLnBvaW50cy5sZW5ndGgtMV09SFd0KG4ucG9pbnRzW24ucG9pbnRzLmxlbmd0aC0yXSxsKSksbnVsbCE9cyYmKG4ucG9pbnRzWzBdPUhXdChuLnBvaW50c1sxXSxzKSksU2UuZXhwb3J0cy5lYWNoKG4ucG9pbnRzLCh0PT57aT10Lng8aT90Lng6aSxvPXQueD5vP3QueDpvLHI9dC55PHI/dC55OnIsYT10Lnk+YT90Lnk6YX0pKX0pKSxTZS5leHBvcnRzLmVhY2godC5ub2RlcygpLChlPT57bGV0IG49dC5ub2RlKGUpO24ueC09aSxuLnktPXJ9KSksU2UuZXhwb3J0cy5lYWNoKHQuZWRnZXMoKSwoZT0+e1NlLmV4cG9ydHMuZWFjaCh0LmVkZ2UoZSkucG9pbnRzLCh0PT57dC54LT1pLHQueS09cn0pKX0pKSx7d2lkdGg6by1pLGhlaWdodDphLXJ9fWZ1bmN0aW9uIHpXdCh0KXtzd2l0Y2godC5hbm5vdGF0aW9uVHlwZSl7Y2FzZSBiV3QuQ09OU1RBTlQ6U2UuZXhwb3J0cy5leHRlbmQodCxOV3QuY29uc3RhbnQuc2l6ZSk7YnJlYWs7Y2FzZSBiV3QuU0hPUlRDVVQ6aWYodC5ub2RlLnR5cGU9PT1qR3QuT1ApU2UuZXhwb3J0cy5leHRlbmQodCxOV3Quc2hvcnRjdXRTaXplLm9wKTtlbHNlIGlmKHQubm9kZS50eXBlPT09akd0Lk1FVEEpU2UuZXhwb3J0cy5leHRlbmQodCxOV3Quc2hvcnRjdXRTaXplLm1ldGEpO2Vsc2V7aWYodC5ub2RlLnR5cGUhPT1qR3QuU0VSSUVTKXRocm93IEVycm9yKCJJbnZhbGlkIG5vZGUgdHlwZTogIit0Lm5vZGUudHlwZSk7U2UuZXhwb3J0cy5leHRlbmQodCxOV3Quc2hvcnRjdXRTaXplLnNlcmllcyl9YnJlYWs7Y2FzZSBiV3QuU1VNTUFSWTpTZS5leHBvcnRzLmV4dGVuZCh0LE5XdC5jb25zdGFudC5zaXplKX19ZnVuY3Rpb24gRFd0KHQpe3JldHVybiB0LmV4cGFuZGVkP3QueDp0LngtdC53aWR0aC8yKyh0LmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGg/dC5pbmJveFdpZHRoOjApK3QuY29yZUJveC53aWR0aC8yfWZ1bmN0aW9uIEJXdCh0LGUpe3JldHVybiAxODAqTWF0aC5hdGFuKChlLnktdC55KS8oZS54LXQueCkpL01hdGguUEl9ZnVuY3Rpb24gSFd0KHQsZSl7bGV0IG4saSxyPWUuZXhwYW5kZWQ/ZS54OkRXdChlKSxvPWUueSxhPXQueC1yLHM9dC55LW8sbD1lLmV4cGFuZGVkP2Uud2lkdGg6ZS5jb3JlQm94LndpZHRoLGM9ZS5leHBhbmRlZD9lLmhlaWdodDplLmNvcmVCb3guaGVpZ2h0O3JldHVybiBNYXRoLmFicyhzKSpsLzI+TWF0aC5hYnMoYSkqYy8yPyhzPDAmJihjPS1jKSxuPTA9PT1zPzA6Yy8yKmEvcyxpPWMvMik6KGE8MCYmKGw9LWwpLG49bC8yLGk9MD09PWE/MDpsLzIqcy9hKSx7eDpyK24seTpvK2l9fWNvbnN0IEZXdD14R3QsVld0PXZHdDtsZXQgVVd0PVt7YmFja2dyb3VuZF9jb2xvcjoiI0NDMkYyQyIsbGFiZWw6Ik5hTiJ9LHtiYWNrZ3JvdW5kX2NvbG9yOiIjRkY4RDAwIixsYWJlbDoiLeKIniJ9LHtiYWNrZ3JvdW5kX2NvbG9yOiIjRUFFQUVBIixsYWJlbDoiLSJ9LHtiYWNrZ3JvdW5kX2NvbG9yOiIjQTVBNUE1IixsYWJlbDoiMCJ9LHtiYWNrZ3JvdW5kX2NvbG9yOiIjMjYyNjI2IixsYWJlbDoiKyJ9LHtiYWNrZ3JvdW5kX2NvbG9yOiIjMDAzRUQ0IixsYWJlbDoiK+KIniJ9XTtmdW5jdGlvbiBqV3QodCxlLG4pe251bGwhPXQuYXR0cigidHJhbnNmb3JtIikmJih0PXQudHJhbnNpdGlvbigicG9zaXRpb24iKSksdC5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitlKyIsIituKyIpIil9ZnVuY3Rpb24gR1d0KHQsZSxuLGkscil7dC50cmFuc2l0aW9uKCkuYXR0cigieCIsZS1pLzIpLmF0dHIoInkiLG4tci8yKS5hdHRyKCJ3aWR0aCIsaSkuYXR0cigiaGVpZ2h0IixyKX1mdW5jdGlvbiBXV3QodCxlLG4saSxyKXt0LnRyYW5zaXRpb24oKS5hdHRyKCJjeCIsZSkuYXR0cigiY3kiLG4pLmF0dHIoInJ4IixpLzIpLmF0dHIoInJ5IixyLzIpfWZ1bmN0aW9uIHFXdCh0LGUpe3JldHVybiBlP3QudG9GaXhlZCgwKTpNYXRoLmFicyh0KT49MT90LnRvRml4ZWQoMSk6dC50b0V4cG9uZW50aWFsKDEpfWxldCBZV3Q9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnNwZWNpZmljSGVhbHRoUGlsbFN0ZXA9MCx0aGlzLmhlYWx0aFBpbGxFbnRyaWVzPVVXdH1yZWFkeSgpe3N1cGVyLnJlYWR5KCk7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1haW5Db250YWluZXIiKSxlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInRmLWRhc2hib2FyZC1sYXlvdXQgLnNjcm9sbGJhciIpO3QmJmUmJih0LnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGUuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpfV9oZWFsdGhQaWxsc0F2YWlsYWJsZSh0LGUpe3JldHVybiB0JiZlfV9jb21wdXRlVGVuc29yQ291bnRTdHJpbmcodCxlKXtyZXR1cm4gdD90W2VdLnRvRml4ZWQoMCk6IiJ9Z2V0IGhlYWx0aFBpbGxWYWx1ZXNGb3JTZWxlY3RlZE5vZGUoKXt2YXIgdD10aGlzLnNlbGVjdGVkTm9kZTtpZih0aGlzLmFyZUhlYWx0aFBpbGxzTG9hZGluZylyZXR1cm4gbnVsbDtpZighdClyZXR1cm4gbnVsbDtjb25zdCBlPXRoaXMubm9kZU5hbWVzVG9IZWFsdGhQaWxsc1t0XTtpZighZSlyZXR1cm4gbnVsbDtjb25zdCBuPWVbdGhpcy5hbGxTdGVwc01vZGVFbmFibGVkPzA6dGhpcy5oZWFsdGhQaWxsU3RlcEluZGV4XTtyZXR1cm4gbj9uLnZhbHVlLnNsaWNlKDIsOCk6bnVsbH1nZXQgX2N1cnJlbnRTdGVwRGlzcGxheVZhbHVlKCl7dmFyIHQ9dGhpcy5ub2RlTmFtZXNUb0hlYWx0aFBpbGxzLGU9dGhpcy5oZWFsdGhQaWxsU3RlcEluZGV4LG49dGhpcy5hcmVIZWFsdGhQaWxsc0xvYWRpbmc7aWYodGhpcy5hbGxTdGVwc01vZGVFbmFibGVkKXJldHVybiB0aGlzLnNwZWNpZmljSGVhbHRoUGlsbFN0ZXAudG9GaXhlZCgwKTtpZihuKXJldHVybiAwO2ZvcihsZXQgbiBpbiB0KXJldHVybiB0W25dW2VdLnN0ZXAudG9GaXhlZCgwKTtyZXR1cm4gMH1nZXQgX2JpZ2dlc3RTdGVwRXZlclNlZW4oKXt2YXIgdD10aGlzLm5vZGVOYW1lc1RvSGVhbHRoUGlsbHM7Zm9yKGxldCBuIGluIHQpe3ZhciBlPXRbbl07cmV0dXJuIE1hdGgubWF4KHRoaXMuX2JpZ2dlc3RTdGVwRXZlclNlZW4sZVtlLmxlbmd0aC0xXS5zdGVwKX1yZXR1cm4gdGhpcy5fYmlnZ2VzdFN0ZXBFdmVyU2Vlbnx8MH1nZXQgX21heFN0ZXBJbmRleCgpe3ZhciB0PXRoaXMubm9kZU5hbWVzVG9IZWFsdGhQaWxscztmb3IobGV0IGUgaW4gdClyZXR1cm4gdFtlXS5sZW5ndGgtMTtyZXR1cm4gMH1faGFzRGVidWdnZXJOdW1lcmljQWxlcnRzKHQpe3JldHVybiB0JiZ0Lmxlbmd0aH1fdXBkYXRlQWxlcnRzTGlzdCgpe3ZhciB0PXRoaXMuZGVidWdnZXJOdW1lcmljQWxlcnRzLGU9dGhpcy4kJCgiI251bWVyaWMtYWxlcnRzLWJvZHkiKTtpZihlKXtlLmlubmVyVGV4dD0iIjtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIGk9dFtuXSxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIiksbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO28uaW5uZXJUZXh0PShmPWkuZmlyc3RfdGltZXN0YW1wLChtPStuZXcgRGF0ZS0rbmV3IERhdGUoZi8xZTMpKTwzZTQ/Imp1c3Qgbm93IjptPDZlND9NYXRoLmZsb29yKG0vMWUzKSsiIHNlY29uZHMgYWdvIjptPDEyZTQ/ImEgbWludXRlIGFnbyI6bTwzNmU1P01hdGguZmxvb3IobS82ZTQpKyIgbWludXRlcyBhZ28iOjE9PU1hdGguZmxvb3IobS8zNmU1KT8iYW4gaG91ciBhZ28iOm08ODY0ZTU/TWF0aC5mbG9vcihtLzM2ZTUpKyIgaG91cnMgYWdvIjptPDE3MjhlNT8ieWVzdGVyZGF5IjpNYXRoLmZsb29yKG0vODY0ZTUpKyIgZGF5cyBhZ28iKSxvLmNsYXNzTGlzdC5hZGQoImZpcnN0LW9mZmVuc2UtdGQiKSxyLmFwcGVuZENoaWxkKG8pO3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7YS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3ItZGV2aWNlLXRkIik7dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cy5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGUiKSxzLmlubmVyVGV4dD1pLnRlbnNvcl9uYW1lLHRoaXMuX2FkZE9wRXhwYW5zaW9uTGlzdGVuZXIocyxpLnRlbnNvcl9uYW1lKSxhLmFwcGVuZENoaWxkKHMpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuY2xhc3NMaXN0LmFkZCgiZGV2aWNlLXNlY3Rpb24td2l0aGluLXRhYmxlIiksbC5pbm5lclRleHQ9IigiK2kuZGV2aWNlX25hbWUrIikiLGEuYXBwZW5kQ2hpbGQobCksci5hcHBlbmRDaGlsZChhKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmNsYXNzTGlzdC5hZGQoIm1pbmktaGVhbHRoLXBpbGwiKTt2YXIgdT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO2lmKHUuY2xhc3NMaXN0LmFkZCgibWluaS1oZWFsdGgtcGlsbC10ZCIpLHUuYXBwZW5kQ2hpbGQoYyksci5hcHBlbmRDaGlsZCh1KSxpLm5lZ19pbmZfZXZlbnRfY291bnQpe3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guY2xhc3NMaXN0LmFkZCgibmVnYXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiIpLGguaW5uZXJUZXh0PWkubmVnX2luZl9ldmVudF9jb3VudCxoLnNldEF0dHJpYnV0ZSgidGl0bGUiLGkubmVnX2luZl9ldmVudF9jb3VudCsiIGV2ZW50cyB3aXRoIC3iiJ4iKSxjLmFwcGVuZENoaWxkKGgpfWlmKGkucG9zX2luZl9ldmVudF9jb3VudCl7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5jbGFzc0xpc3QuYWRkKCJwb3NpdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIiksZC5pbm5lclRleHQ9aS5wb3NfaW5mX2V2ZW50X2NvdW50LGQuc2V0QXR0cmlidXRlKCJ0aXRsZSIsaS5wb3NfaW5mX2V2ZW50X2NvdW50KyIgZXZlbnRzIHdpdGggK+KIniIpLGMuYXBwZW5kQ2hpbGQoZCl9aWYoaS5uYW5fZXZlbnRfY291bnQpe3ZhciBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3AuY2xhc3NMaXN0LmFkZCgibmFuLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiIpLHAuaW5uZXJUZXh0PWkubmFuX2V2ZW50X2NvdW50LHAuc2V0QXR0cmlidXRlKCJ0aXRsZSIsaS5uYW5fZXZlbnRfY291bnQrIiBldmVudHMgd2l0aCBOYU4iKSxjLmFwcGVuZENoaWxkKHApfVlpKGUpLmFwcGVuZENoaWxkKHIpfXZhciBmLG19fV9hZGRPcEV4cGFuc2lvbkxpc3RlbmVyKHQsZSl7dC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCgpPT57dmFyIHQsbj0oZnVuY3Rpb24gaSh0LGUsbil7Y29uc3QgaT1uLnNwbGl0KCIvIikscj1pW2kubGVuZ3RoLTFdLm1hdGNoKC8oLiopOlx3Ky8pOzI9PT1yLmxlbmd0aCYmKGlbaS5sZW5ndGgtMV09clsxXSk7bGV0IG89aVswXSxhPWUuZ2V0UmVuZGVyTm9kZUJ5TmFtZShvKTtmb3IobGV0IG49MTtuPGkubGVuZ3RoJiZhLm5vZGUudHlwZSE9PWpHdC5PUDtuKyspZS5idWlsZFN1YmhpZXJhcmNoeShvKSxhLmV4cGFuZGVkPSEwLHQuc2V0Tm9kZUV4cGFuZGVkKGEpLG8rPSIvIitpW25dLGE9ZS5nZXRSZW5kZXJOb2RlQnlOYW1lKG8pO3JldHVybiBhLm5vZGUubmFtZX0pKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzY2VuZSIpLHRoaXMucmVuZGVySGllcmFyY2h5LGUpLHI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigidGYtZ3JhcGgtaW5mbyNncmFwaC1pbmZvIik7ciYmKHQ9ci5zY3JvbGxIZWlnaHQtci5zY3JvbGxUb3ApO3ZhciBvPXRoaXMuc2VsZWN0ZWROb2RlO3RoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLG4pO3ZhciBhPSgpPT57ci5zY3JvbGxUb3A9ci5zY3JvbGxIZWlnaHQtdH07ciYmKG8/YSgpOndpbmRvdy5zZXRUaW1lb3V0KGEsMjApKX0pKX19O3ZhciBYV3Q7WVd0LnRlbXBsYXRlPV9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtbGVnZW5kIHsKICAgICAgICBwYWRkaW5nOiAxNXB4OwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtbGVnZW5kIGgyIHsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgewogICAgICAgIG1hcmdpbjogMTBweCAxMHB4IDEwcHggMDsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLWVudHJ5IC5jb2xvci1wcmV2aWV3IHsKICAgICAgICB3aWR0aDogMjZweDsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtYXJnaW46IDAgMTBweCAwIDA7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAuY29sb3ItbGFiZWwsCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAudGVuc29yLWNvdW50IHsKICAgICAgICBjb2xvcjogIzc3NzsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMjJweDsKICAgICAgICBsaW5lLWhlaWdodDogMjZweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgLnRlbnNvci1jb3VudCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CgogICAgICAjaGVhbHRoLXBpbGwtc3RlcC1zbGlkZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1hcmdpbjogMCAwIDAgLTE1cHg7CiAgICAgICAgLyogMzEgY29tZXMgZnJvbSBhZGRpbmcgYSBwYWRkaW5nIG9mIDE1cHggZnJvbSBib3RoIHNpZGVzIG9mIHRoZSBwYXBlci1zbGlkZXIsIHN1YnRyYWN0aW5nCiAgICogMXB4IHNvIHRoYXQgdGhlIHNsaWRlciB3aWR0aCBhbGlnbnMgd2l0aCB0aGUgaW1hZ2UgKHRoZSBsYXN0IHNsaWRlciBtYXJrZXIgdGFrZXMgdXAgMXB4KSwKICAgKiBhbmQgYWRkaW5nIDJweCB0byBhY2NvdW50IGZvciBhIGJvcmRlciBvZiAxcHggb24gYm90aCBzaWRlcyBvZiB0aGUgaW1hZ2UuIDMwIC0gMSArIDIuCiAgICogQXBwYXJlbnRseSwgdGhlIHBhcGVyLXNsaWRlciBsYWNrcyBhIG1peGluIGZvciB0aG9zZSBwYWRkaW5nIHZhbHVlcy4gKi8KICAgICAgICB3aWR0aDogY2FsYygxMDAlICsgMzFweCk7CiAgICAgIH0KCiAgICAgICNoZWFsdGgtcGlsbHMtbG9hZGluZy1zcGlubmVyIHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQoKICAgICAgI2hlYWx0aC1waWxsLXN0ZXAtbnVtYmVyLWlucHV0IHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlLWNvbnRhaW5lciB7CiAgICAgICAgbWF4LWhlaWdodDogNDAwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgICNudW1lcmljLWFsZXJ0cy10YWJsZSB7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlIHRkIHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAjbnVtZXJpYy1hbGVydHMtdGFibGUgLmZpcnN0LW9mZmVuc2UtdGQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmZpcnN0LW9mZmVuc2UtdGQgewogICAgICAgIHdpZHRoOiA4MHB4OwogICAgICB9CgogICAgICAudGVuc29yLWRldmljZS10ZCB7CiAgICAgICAgbWF4LXdpZHRoOiAxNDBweDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KCiAgICAgIC50ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGUgewogICAgICAgIGNvbG9yOiAjMjY2MjM2OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KCiAgICAgIC50ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGU6aG92ZXIgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5kZXZpY2Utc2VjdGlvbi13aXRoaW4tdGFibGUgewogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAubWluaS1oZWFsdGgtcGlsbCB7CiAgICAgICAgd2lkdGg6IDEzMHB4OwogICAgICB9CgogICAgICAubWluaS1oZWFsdGgtcGlsbCA+IGRpdiB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgfQoKICAgICAgI2V2ZW50LWNvdW50cy10aCB7CiAgICAgICAgcGFkZGluZzogMCAwIDAgMTBweDsKICAgICAgfQoKICAgICAgLm5lZ2F0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24gewogICAgICAgIGJhY2tncm91bmQ6IHJnYigyNTUsIDE0MSwgMCk7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5wb3NpdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMCwgNjIsIDIxMik7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5uYW4tbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMjA0LCA0NywgNDQpOwogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICB9CgogICAgICAubmVnYXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiwKICAgICAgLnBvc2l0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24sCiAgICAgIC5uYW4tbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1hcmdpbjogMCAwIDAgMTBweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5uby1udW1lcmljLWFsZXJ0cy1ub3RpZmljYXRpb24gewogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGNsYXNzPSJjYXJkIGhlYWx0aC1waWxsLWxlZ2VuZCI+CiAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICBFbmFibGUgYWxsIChub3QganVzdCBzYW1wbGVkKSBzdGVwcy4gUmVxdWlyZXMgc2xvdyBkaXNrIHJlYWQuCiAgICAgIDwvZGl2PgogICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbgogICAgICAgIGlkPSJlbmFibGVBbGxTdGVwc01vZGVUb2dnbGUiCiAgICAgICAgY2hlY2tlZD0ie3thbGxTdGVwc01vZGVFbmFibGVkfX0iCiAgICAgID4KICAgICAgPC9wYXBlci10b2dnbGUtYnV0dG9uPgogICAgICA8aDI+CiAgICAgICAgU3RlcCBvZiBIZWFsdGggUGlsbHM6CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2FsbFN0ZXBzTW9kZUVuYWJsZWRdXSI+CiAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgdHlwZT0ibnVtYmVyIgogICAgICAgICAgICBpZD0iaGVhbHRoLXBpbGwtc3RlcC1udW1iZXItaW5wdXQiCiAgICAgICAgICAgIG1pbj0iMCIKICAgICAgICAgICAgbWF4PSJbW19iaWdnZXN0U3RlcEV2ZXJTZWVuXV0iCiAgICAgICAgICAgIHZhbHVlPSJ7e3NwZWNpZmljSGVhbHRoUGlsbFN0ZXA6OmlucHV0fX0iCiAgICAgICAgICAvPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFhbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgICAgW1tfY3VycmVudFN0ZXBEaXNwbGF5VmFsdWVdXQogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHBhcGVyLXNwaW5uZXItbGl0ZQogICAgICAgICAgYWN0aXZlCiAgICAgICAgICBoaWRkZW4kPSJbWyFhcmVIZWFsdGhQaWxsc0xvYWRpbmddXSIKICAgICAgICAgIGlkPSJoZWFsdGgtcGlsbHMtbG9hZGluZy1zcGlubmVyIgogICAgICAgID48L3BhcGVyLXNwaW5uZXItbGl0ZT4KICAgICAgPC9oMj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2FsbFN0ZXBzTW9kZUVuYWJsZWRdXSI+CiAgICAgICAgPHBhcGVyLXNsaWRlcgogICAgICAgICAgaWQ9ImhlYWx0aC1waWxsLXN0ZXAtc2xpZGVyIgogICAgICAgICAgaW1tZWRpYXRlLXZhbHVlPSJ7e3NwZWNpZmljSGVhbHRoUGlsbFN0ZXB9fSIKICAgICAgICAgIG1heD0iW1tfYmlnZ2VzdFN0ZXBFdmVyU2Vlbl1dIgogICAgICAgICAgc25hcHMKICAgICAgICAgIHN0ZXA9IjEiCiAgICAgICAgICB2YWx1ZT0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iCiAgICAgICAgPjwvcGFwZXItc2xpZGVyPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWFsbFN0ZXBzTW9kZUVuYWJsZWRdXSI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19tYXhTdGVwSW5kZXhdXSI+CiAgICAgICAgICA8cGFwZXItc2xpZGVyCiAgICAgICAgICAgIGlkPSJoZWFsdGgtcGlsbC1zdGVwLXNsaWRlciIKICAgICAgICAgICAgaW1tZWRpYXRlLXZhbHVlPSJ7e2hlYWx0aFBpbGxTdGVwSW5kZXh9fSIKICAgICAgICAgICAgbWF4PSJbW19tYXhTdGVwSW5kZXhdXSIKICAgICAgICAgICAgc25hcHMKICAgICAgICAgICAgc3RlcD0iMSIKICAgICAgICAgICAgdmFsdWU9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19IgogICAgICAgICAgPjwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxoMj4KICAgICAgICBIZWFsdGggUGlsbAogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1toZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlXV0iPgogICAgICAgICAgQ291bnRzIGZvciBTZWxlY3RlZCBOb2RlCiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWhlYWx0aFBpbGxWYWx1ZXNGb3JTZWxlY3RlZE5vZGVdXSI+CiAgICAgICAgICBMZWdlbmQKICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2gyPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2hlYWx0aFBpbGxFbnRyaWVzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWx0aC1waWxsLWVudHJ5Ij4KICAgICAgICAgIDxkaXYKICAgICAgICAgICAgY2xhc3M9ImNvbG9yLXByZXZpZXciCiAgICAgICAgICAgIHN0eWxlPSJiYWNrZ3JvdW5kOltbaXRlbS5iYWNrZ3JvdW5kX2NvbG9yXV0iCiAgICAgICAgICA+PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sYWJlbCI+W1tpdGVtLmxhYmVsXV08L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRlbnNvci1jb3VudCI+CiAgICAgICAgICAgIFtbX2NvbXB1dGVUZW5zb3JDb3VudFN0cmluZyhoZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlLAogICAgICAgICAgICBpbmRleCldXQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxkaXYgaGlkZGVuJD0iW1shX2hhc0RlYnVnZ2VyTnVtZXJpY0FsZXJ0cyhkZWJ1Z2dlck51bWVyaWNBbGVydHMpXV0iPgogICAgICAgIDxoMiBpZD0ibnVtZXJpYy1hbGVydHMtaGVhZGVyIj5OdW1lcmljIEFsZXJ0czwvaDI+CiAgICAgICAgPHA+QWxlcnRzIGFyZSBzb3J0ZWQgZnJvbSB0b3AgdG8gYm90dG9tIGJ5IGluY3JlYXNpbmcgdGltZXN0YW1wLjwvcD4KICAgICAgICA8ZGl2IGlkPSJudW1lcmljLWFsZXJ0cy10YWJsZS1jb250YWluZXIiPgogICAgICAgICAgPHRhYmxlIGlkPSJudW1lcmljLWFsZXJ0cy10YWJsZSI+CiAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGg+Rmlyc3QgT2ZmZW5zZTwvdGg+CiAgICAgICAgICAgICAgICA8dGg+VGVuc29yIChEZXZpY2UpPC90aD4KICAgICAgICAgICAgICAgIDx0aCBpZD0iZXZlbnQtY291bnRzLXRoIj5FdmVudCBDb3VudHM8L3RoPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgIDx0Ym9keSBpZD0ibnVtZXJpYy1hbGVydHMtYm9keSI+PC90Ym9keT4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUKICAgICAgICBpcz0iZG9tLWlmIgogICAgICAgIGlmPSJbWyFfaGFzRGVidWdnZXJOdW1lcmljQWxlcnRzKGRlYnVnZ2VyTnVtZXJpY0FsZXJ0cyldXSIKICAgICAgPgogICAgICAgIDxwIGNsYXNzPSJuby1udW1lcmljLWFsZXJ0cy1ub3RpZmljYXRpb24iPgogICAgICAgICAgTm8gbnVtZXJpYyBhbGVydHMgc28gZmFyLiBUaGF0IGlzIGxpa2VseSBnb29kLiBBbGVydHMgaW5kaWNhdGUgdGhlCiAgICAgICAgICBwcmVzZW5jZSBvZiBOYU4gb3IgKCsvLSkgSW5maW5pdHkgdmFsdWVzLCB3aGljaCBtYXkgYmUgY29uY2VybmluZy4KICAgICAgICA8L3A+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3BhcGVyLW1hdGVyaWFsPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIseVd0KV0sWVd0LnByb3RvdHlwZSwicmVuZGVySGllcmFyY2h5Iix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXksbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFlXdC5wcm90b3R5cGUsImRlYnVnZ2VyTnVtZXJpY0FsZXJ0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxZV3QucHJvdG90eXBlLCJub2RlTmFtZXNUb0hlYWx0aFBpbGxzIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxZV3QucHJvdG90eXBlLCJoZWFsdGhQaWxsU3RlcEluZGV4Iix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxZV3QucHJvdG90eXBlLCJzcGVjaWZpY0hlYWx0aFBpbGxTdGVwIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxZV3QucHJvdG90eXBlLCJzZWxlY3RlZE5vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFlXdC5wcm90b3R5cGUsImhpZ2hsaWdodGVkTm9kZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcixub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sWVd0LnByb3RvdHlwZSwic2VsZWN0ZWROb2RlSW5jbHVkZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sWVd0LnByb3RvdHlwZSwiYXJlSGVhbHRoUGlsbHNMb2FkaW5nIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxZV3QucHJvdG90eXBlLCJoZWFsdGhQaWxsRW50cmllcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFlXdC5wcm90b3R5cGUsImFsbFN0ZXBzTW9kZUVuYWJsZWQiLHZvaWQgMCksdChbcygibm9kZU5hbWVzVG9IZWFsdGhQaWxscyIsImhlYWx0aFBpbGxTdGVwSW5kZXgiLCJzZWxlY3RlZE5vZGUiLCJhbGxTdGVwc01vZGVFbmFibGVkIiwiYXJlSGVhbHRoUGlsbHNMb2FkaW5nIiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxZV3QucHJvdG90eXBlLCJoZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlIixudWxsKSx0KFtzKCJub2RlTmFtZXNUb0hlYWx0aFBpbGxzIiwiaGVhbHRoUGlsbFN0ZXBJbmRleCIsImFsbFN0ZXBzTW9kZUVuYWJsZWQiLCJzcGVjaWZpY0hlYWx0aFBpbGxTdGVwIiwiYXJlSGVhbHRoUGlsbHNMb2FkaW5nIiksZSgiZGVzaWduOnR5cGUiLE9iamVjdCksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sWVd0LnByb3RvdHlwZSwiX2N1cnJlbnRTdGVwRGlzcGxheVZhbHVlIixudWxsKSx0KFtzKCJub2RlTmFtZXNUb0hlYWx0aFBpbGxzIiksZSgiZGVzaWduOnR5cGUiLE51bWJlciksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sWVd0LnByb3RvdHlwZSwiX2JpZ2dlc3RTdGVwRXZlclNlZW4iLG51bGwpLHQoW3MoIm5vZGVOYW1lc1RvSGVhbHRoUGlsbHMiKSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxZV3QucHJvdG90eXBlLCJfbWF4U3RlcEluZGV4IixudWxsKSx0KFthKCJkZWJ1Z2dlck51bWVyaWNBbGVydHMiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLFlXdC5wcm90b3R5cGUsIl91cGRhdGVBbGVydHNMaXN0IixudWxsKSxZV3Q9dChbaSgidGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkIildLFlXdCksKGZ1bmN0aW9uKHQpe3QuQ09OU1Q9IkNPTlNUIix0Lk1FVEE9Ik1FVEEiLHQuT1A9Ik9QIix0LlNFUklFUz0iU0VSSUVTIix0LlNVTU1BUlk9IlNVTU1BUlkifSkoWFd0fHwoWFd0PXt9KSk7bGV0ICRXdD1jbGFzcyBleHRlbmRzKGVyKGlsKHllKSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnZlcnRpY2FsPSExLHRoaXMuZmlsbE92ZXJyaWRlPW51bGwsdGhpcy5zdHJva2VPdmVycmlkZT1udWxsLHRoaXMuaGVpZ2h0PTIwLHRoaXMuZmFkZWQ9ITF9Z2V0U3ZnRGVmaW5hYmxlRWxlbWVudCgpe3JldHVybiB0aGlzLiQuc3ZnRGVmc31nZXQgX2ZpbGwoKXt2YXIgdD10aGlzLmZpbGxPdmVycmlkZTtpZihudWxsIT10KXJldHVybiB0O3N3aXRjaCh0aGlzLnR5cGUpe2Nhc2UgWFd0Lk1FVEE6cmV0dXJuIHBXdC5ERUZBVUxUX0ZJTEw7Y2FzZSBYV3QuU0VSSUVTOnJldHVybiJ3aGl0ZSI7ZGVmYXVsdDpyZXR1cm4iI2ZmZmZmZiJ9fWdldCBfc3Ryb2tlKCl7dmFyIHQ9dGhpcy5zdHJva2VPdmVycmlkZTtpZihudWxsIT10KXJldHVybiB0O3N3aXRjaCh0aGlzLnR5cGUpe2Nhc2UgWFd0Lk1FVEE6cmV0dXJuIHBXdC5ERUZBVUxUX1NUUk9LRTtjYXNlIFhXdC5TRVJJRVM6ZGVmYXVsdDpyZXR1cm4iI2IyYjJiMiJ9fV9pc1R5cGUodCxlKXtyZXR1cm4gdD09PWV9X2ZhZGVkQ2xhc3ModCxlKXtyZXR1cm4gdD8iZmFkZWQtIitlOiIifX07JFd0LnRlbXBsYXRlPV9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAwOwogICAgICB9CgogICAgICA6aG9zdCguZGFyay1tb2RlKSBzdmcgewogICAgICAgIGZpbHRlcjogaW52ZXJ0KDEpOwogICAgICB9CgogICAgICAuZmFkZWQtcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpOwogICAgICB9CgogICAgICAuZmFkZWQtZWxsaXBzZSB7CiAgICAgICAgZmlsbDogdXJsKCNlbGxpcHNlSGF0Y2gpOwogICAgICB9CgogICAgICAuZmFkZWQtcmVjdCwKICAgICAgLmZhZGVkLWVsbGlwc2UsCiAgICAgIC5mYWRlZC1zZXJpZXMgewogICAgICAgIHN0cm9rZTogdmFyKC0tdGItZ3JhcGgtZmFkZWQpICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgI3JlY3RIYXRjaCBsaW5lLAogICAgICAjZWxsaXBzZUhhdGNoIGxpbmUgewogICAgICAgIGNvbG9yOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8IS0tIFNWRyBmb3IgZGVmaW5pdGlvbnMgLS0+CiAgICA8c3ZnIGhlaWdodD0iMCIgd2lkdGg9IjAiIGlkPSJzdmdEZWZzIj4KICAgICAgPGRlZnM+CiAgICAgICAgPCEtLSBIYXRjaCBwYXR0ZXJucyBmb3IgZmFkZWQgb3V0IG5vZGVzLiAtLT4KICAgICAgICA8cGF0dGVybgogICAgICAgICAgaWQ9InJlY3RIYXRjaCIKICAgICAgICAgIHBhdHRlcm5UcmFuc2Zvcm09InJvdGF0ZSg0NSAwIDApIgogICAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgICBoZWlnaHQ9IjUiCiAgICAgICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgID4KICAgICAgICAgIDxsaW5lIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSI1IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxIj48L2xpbmU+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIDxwYXR0ZXJuCiAgICAgICAgICBpZD0iZWxsaXBzZUhhdGNoIgogICAgICAgICAgcGF0dGVyblRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiCiAgICAgICAgICB3aWR0aD0iMiIKICAgICAgICAgIGhlaWdodD0iMiIKICAgICAgICAgIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICAgPgogICAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjIiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiPjwvbGluZT4KICAgICAgICA8L3BhdHRlcm4+CiAgICAgICAgPCEtLSBUZW1wbGF0ZSBmb3IgYW4gT3Agbm9kZSBlbGxpcHNlLiAtLT4KICAgICAgICA8ZWxsaXBzZQogICAgICAgICAgaWQ9Im9wLW5vZGUtc3RhbXAiCiAgICAgICAgICByeD0iNy41IgogICAgICAgICAgcnk9IjMiCiAgICAgICAgICBzdHJva2U9ImluaGVyaXQiCiAgICAgICAgICBmaWxsPSJpbmhlcml0IgogICAgICAgID48L2VsbGlwc2U+CiAgICAgICAgPCEtLSBUZW1wbGF0ZSBmb3IgYW4gT3Agbm9kZSBhbm5vdGF0aW9uIGVsbGlwc2UgKHNtYWxsZXIpLiAtLT4KICAgICAgICA8ZWxsaXBzZQogICAgICAgICAgaWQ9Im9wLW5vZGUtYW5ub3RhdGlvbi1zdGFtcCIKICAgICAgICAgIHJ4PSI1IgogICAgICAgICAgcnk9IjIiCiAgICAgICAgICBzdHJva2U9ImluaGVyaXQiCiAgICAgICAgICBmaWxsPSJpbmhlcml0IgogICAgICAgID48L2VsbGlwc2U+CiAgICAgICAgPCEtLSBWZXJ0aWNhbGx5IHN0YWNrZWQgc2VyaWVzIG9mIE9wIG5vZGVzIHdoZW4gdW5leHBhbmRlZC4gLS0+CiAgICAgICAgPGcgaWQ9Im9wLXNlcmllcy12ZXJ0aWNhbC1zdGFtcCI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSI5Ij48L3VzZT4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjYiPjwvdXNlPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iMyI+PC91c2U+CiAgICAgICAgPC9nPgogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtaG9yaXpvbnRhbC1zdGFtcCI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxNiIgeT0iNCI+PC91c2U+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxMiIgeT0iNCI+PC91c2U+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSI0Ij48L3VzZT4KICAgICAgICA8L2c+CiAgICAgICAgPGcKICAgICAgICAgIGlkPSJzdW1tYXJ5LWljb24iCiAgICAgICAgICBmaWxsPSIjODQ4NDg0IgogICAgICAgICAgaGVpZ2h0PSIxMiIKICAgICAgICAgIHZpZXdCb3g9IjAgMCAyNCAyNCIKICAgICAgICAgIHdpZHRoPSIxMiIKICAgICAgICA+CiAgICAgICAgICA8cGF0aAogICAgICAgICAgICBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6TTkgMTdIN3YtN2gydjd6bTQgMGgtMlY3aDJ2MTB6bTQgMGgtMnYtNGgydjR6IgogICAgICAgICAgPjwvcGF0aD4KICAgICAgICA8L2c+CiAgICAgIDwvZGVmcz4KICAgIDwvc3ZnPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ0NPTlNUJyldXSI+CiAgICAgIDxzdmcKICAgICAgICBoZWlnaHQkPSJbW2hlaWdodF1dIgogICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWlkIG1lZXQiCiAgICAgICAgdmlld0JveD0iMCAwIDEwIDEwIgogICAgICA+CiAgICAgICAgPGNpcmNsZQogICAgICAgICAgY3g9IjUiCiAgICAgICAgICBjeT0iNSIKICAgICAgICAgIHI9IjMiCiAgICAgICAgICBmaWxsJD0iW1tfZmlsbF1dIgogICAgICAgICAgc3Ryb2tlJD0iW1tfc3Ryb2tlXV0iCiAgICAgICAgPjwvY2lyY2xlPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnU1VNTUFSWScpXV0iPgogICAgICA8c3ZnCiAgICAgICAgd2lkdGgkPSJbW2hlaWdodF1dIgogICAgICAgIGhlaWdodCQ9IltbaGVpZ2h0XV0iCiAgICAgICAgdmlld0JveD0iMCAwIDI0IDI0IgogICAgICAgIGZpbGw9IiM4NDg0ODQiCiAgICAgID4KICAgICAgICA8cGF0aAogICAgICAgICAgZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIKICAgICAgICA+PC9wYXRoPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnT1AnKV1dIj4KICAgICAgPHN2ZwogICAgICAgIGhlaWdodCQ9IltbaGVpZ2h0XV0iCiAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pbllNaWQgbWVldCIKICAgICAgICB2aWV3Qm94PSIwIDAgMTYgOCIKICAgICAgPgogICAgICAgIDx1c2UKICAgICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICAgICAgICAgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiCiAgICAgICAgICBmaWxsJD0iW1tfZmlsbF1dIgogICAgICAgICAgc3Ryb2tlJD0iW1tfc3Ryb2tlXV0iCiAgICAgICAgICBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdlbGxpcHNlJyl9fSIKICAgICAgICAgIHg9IjgiCiAgICAgICAgICB5PSI0IgogICAgICAgID48L3VzZT4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ01FVEEnKV1dIj4KICAgICAgPHN2ZwogICAgICAgIGhlaWdodCQ9IltbaGVpZ2h0XV0iCiAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pbllNaWQgbWVldCIKICAgICAgICB2aWV3Qm94PSIwIDAgMzcgMTYiCiAgICAgID4KICAgICAgICA8cmVjdAogICAgICAgICAgeD0iMSIKICAgICAgICAgIHk9IjEiCiAgICAgICAgICBmaWxsJD0iW1tfZmlsbF1dIgogICAgICAgICAgc3Ryb2tlJD0iW1tfc3Ryb2tlXV0iCiAgICAgICAgICBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdyZWN0Jyl9fSIKICAgICAgICAgIHN0cm9rZS13aWR0aD0iMnB4IgogICAgICAgICAgaGVpZ2h0PSIxNCIKICAgICAgICAgIHdpZHRoPSIzNSIKICAgICAgICAgIHJ4PSI1IgogICAgICAgICAgcnk9IjUiCiAgICAgICAgPjwvcmVjdD4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ1NFUklFUycpXV0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbdmVydGljYWxdXSI+CiAgICAgICAgPHN2ZwogICAgICAgICAgaGVpZ2h0JD0iW1toZWlnaHRdXSIKICAgICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWlkIG1lZXQiCiAgICAgICAgICB2aWV3Qm94PSIwIDAgMTYgMTUiCiAgICAgICAgPgogICAgICAgICAgPHVzZQogICAgICAgICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgICAgICAgICAgeGxpbms6aHJlZj0iI29wLXNlcmllcy12ZXJ0aWNhbC1zdGFtcCIKICAgICAgICAgICAgZmlsbCQ9IltbX2ZpbGxdXSIKICAgICAgICAgICAgc3Ryb2tlJD0iW1tfc3Ryb2tlXV0iCiAgICAgICAgICAgIGNsYXNzJD0ie3tfZmFkZWRDbGFzcyhmYWRlZCwgJ3NlcmllcycpfX0iCiAgICAgICAgICAgIHg9IjAiCiAgICAgICAgICAgIHk9IjIiCiAgICAgICAgICA+PC91c2U+CiAgICAgICAgPC9zdmc+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shdmVydGljYWxdXSI+CiAgICAgICAgPHN2ZwogICAgICAgICAgaGVpZ2h0JD0iW1toZWlnaHRdXSIKICAgICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWlkIG1lZXQiCiAgICAgICAgICB2aWV3Qm94PSIwIDAgMjQgMTAiCiAgICAgICAgPgogICAgICAgICAgPHVzZQogICAgICAgICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgICAgICAgICAgeGxpbms6aHJlZj0iI29wLXNlcmllcy1ob3Jpem9udGFsLXN0YW1wIgogICAgICAgICAgICBmaWxsJD0iW1tfZmlsbF1dIgogICAgICAgICAgICBzdHJva2UkPSJbW19zdHJva2VdXSIKICAgICAgICAgICAgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGZhZGVkLCAnc2VyaWVzJyl9fSIKICAgICAgICAgICAgeD0iMCIKICAgICAgICAgICAgeT0iMSIKICAgICAgICAgID48L3VzZT4KICAgICAgICA8L3N2Zz4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdGVtcGxhdGU+CiAgYCx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSwkV3QucHJvdG90eXBlLCJ0eXBlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sJFd0LnByb3RvdHlwZSwidmVydGljYWwiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sJFd0LnByb3RvdHlwZSwiZmlsbE92ZXJyaWRlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLCRXdC5wcm90b3R5cGUsInN0cm9rZU92ZXJyaWRlIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLCRXdC5wcm90b3R5cGUsImhlaWdodCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLCRXdC5wcm90b3R5cGUsImZhZGVkIix2b2lkIDApLHQoW3MoInR5cGUiLCJmaWxsT3ZlcnJpZGUiKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSwkV3QucHJvdG90eXBlLCJfZmlsbCIsbnVsbCksdChbcygidHlwZSIsInN0cm9rZU92ZXJyaWRlIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sJFd0LnByb3RvdHlwZSwiX3N0cm9rZSIsbnVsbCksJFd0PXQoW2koInRmLWdyYXBoLWljb24iKV0sJFd0KTt2YXIgS1d0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGdldCBHcmFwaEljb25UeXBlKCl7cmV0dXJuIFhXdH19KTtmdW5jdGlvbiBaV3QodCxlKXtjb25zdCBuPXQuZ2V0Q29udGV4dE1lbnUoKSxpPVN1KHQuZ2V0Q29udGV4dE1lbnUoKSk7cmV0dXJuIGZ1bmN0aW9uKHIsbyl7bGV0IGE9dXU7Y29uc3Qgcz0oZnVuY3Rpb24gbCh0KXtsZXQgZT0wLG49MCxpPXQ7Zm9yKDtpJiZpLm9mZnNldExlZnQ+PTAmJmkub2Zmc2V0VG9wPj0wOyllKz1pLm9mZnNldExlZnQtaS5zY3JvbGxMZWZ0LG4rPWkub2Zmc2V0VG9wLWkuc2Nyb2xsVG9wLGk9aS5vZmZzZXRQYXJlbnQ7cmV0dXJue2xlZnQ6ZSx0b3A6bn19KSh0KTtmdW5jdGlvbiBjKHQpe3QmJnQuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXMobil8fChpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixjLHtjYXB0dXJlOiEwfSkpfWkuc3R5bGUoImRpc3BsYXkiLCJibG9jayIpLnN0eWxlKCJsZWZ0IixhLmNsaWVudFgtcy5sZWZ0KzErInB4Iikuc3R5bGUoInRvcCIsYS5jbGllbnRZLXMudG9wKzErInB4IiksYS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcFByb3BhZ2F0aW9uKCksZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLGMse2NhcHR1cmU6ITB9KSxpLmh0bWwoIiIpLGkuYXBwZW5kKCJ1bCIpLnNlbGVjdEFsbCgibGkiKS5kYXRhKGUpLmVudGVyKCkuYXBwZW5kKCJsaSIpLm9uKCJjbGljayIsKCh0LGUpPT57dC5hY3Rpb24odGhpcyxyLG8pLGMoKX0pKS5odG1sKChmdW5jdGlvbih0KXtyZXR1cm4gdC50aXRsZShyKX0pKX19bGV0IEpXdD1hRSgpLmRvbWFpbihbTUd0LDEyXSkucmFuZ2UoWyJzbWFsbCIsIm1lZGl1bSIsImxhcmdlIiwieGxhcmdlIl0pO2Z1bmN0aW9uIFFXdCh0KXtyZXR1cm4gdC52KyItLSIrdC53fWZ1bmN0aW9uIHRxdCh0LGUpe2xldCBuPWUuZ2V0Tm9kZUJ5TmFtZSh0LnYpO2lmKG51bGw9PW4ub3V0cHV0U2hhcGVzfHxTZS5leHBvcnRzLmlzRW1wdHkobi5vdXRwdXRTaGFwZXMpKXJldHVybiBudWxsO2xldCBpPW4ub3V0cHV0U2hhcGVzW3Qub3V0cHV0VGVuc29yS2V5XTtyZXR1cm4gbnVsbD09aT9udWxsOjA9PT1pLmxlbmd0aD8ic2NhbGFyIjppLm1hcCgodD0+LTE9PT10PyI/Ijp0KSkuam9pbigiw5ciKX1mdW5jdGlvbiBlcXQodCxlKXtyZXR1cm4gZS5lZGdlTGFiZWxGdW5jdGlvbj9lLmVkZ2VMYWJlbEZ1bmN0aW9uKHQsZSk6dC5iYXNlRWRnZUxpc3QubGVuZ3RoPjE/dC5iYXNlRWRnZUxpc3QubGVuZ3RoKyIgdGVuc29ycyI6dHF0KHQuYmFzZUVkZ2VMaXN0WzBdLGUpfWZ1bmN0aW9uIG5xdCh0LGUsbil7Y29uc3QgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoYkd0LCJwYXRoIik7Zm9yKGxldCByPTE7cjx0Lmxlbmd0aDtyKyspaWYoaS5zZXRBdHRyaWJ1dGUoImQiLG4odC5zbGljZSgwLHIpKSksaS5nZXRUb3RhbExlbmd0aCgpPmUpcmV0dXJuIHItMTtyZXR1cm4gdC5sZW5ndGgtMX1mdW5jdGlvbiBpcXQodCxlLG4pe2xldCBpPXVMKCkueCgodD0+dC54KSkueSgodD0+dC55KSkscj1TdShkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwicGF0aCIpKS5hdHRyKCJkIixpKHQpKSxvPStlLmF0dHIoIm1hcmtlcldpZHRoIiksYT1lLmF0dHIoInZpZXdCb3giKS5zcGxpdCgiICIpLm1hcChOdW1iZXIpLHM9YVsyXS1hWzBdLGw9K2UuYXR0cigicmVmWCIpLGM9ci5ub2RlKCk7aWYobil7Y29uc3QgZT1vKigxLWwvcyksbj1jLmdldFBvaW50QXRMZW5ndGgoZSkscj1ucXQodCxlLGkpO3JldHVybiB0W3ItMV09e3g6bi54LHk6bi55fSx0LnNsaWNlKHItMSl9e2NvbnN0IGU9MS1sL3Msbj1jLmdldFRvdGFsTGVuZ3RoKCktbyplLHI9Yy5nZXRQb2ludEF0TGVuZ3RoKG4pLGE9bnF0KHQsbixpKTtyZXR1cm4gdFthXT17eDpyLngseTpyLnl9LHQuc2xpY2UoMCxhKzEpfX1mdW5jdGlvbiBycXQodCxlLG4saSl7aT1pfHx2R3QuRWRnZS5MSU5FLGUubGFiZWwmJmUubGFiZWwuc3RydWN0dXJhbCYmKGkrPSIgIit2R3QuRWRnZS5TVFJVQ1RVUkFMKSxlLmxhYmVsJiZlLmxhYmVsLm1ldGFlZGdlJiZlLmxhYmVsLm1ldGFlZGdlLm51bVJlZkVkZ2VzJiYoaSs9IiAiK3ZHdC5FZGdlLlJFRkVSRU5DRV9FREdFKSxuLmhhbmRsZUVkZ2VTZWxlY3RlZCYmKGkrPSIgIit2R3QuRWRnZS5TRUxFQ1RBQkxFKTtsZXQgcixvPSJwYXRoXyIrUVd0KGUpO2lmKG4ucmVuZGVySGllcmFyY2h5LmVkZ2VXaWR0aEZ1bmN0aW9uKXI9bi5yZW5kZXJIaWVyYXJjaHkuZWRnZVdpZHRoRnVuY3Rpb24oZSxpKTtlbHNle2xldCB0PTE7bnVsbCE9ZS5sYWJlbCYmbnVsbCE9ZS5sYWJlbC5tZXRhZWRnZSYmKHQ9ZS5sYWJlbC5tZXRhZWRnZS50b3RhbFNpemUpLHI9bi5yZW5kZXJIaWVyYXJjaHkuZWRnZVdpZHRoU2l6ZWRCYXNlZFNjYWxlKHQpfWxldCBhPXQuYXBwZW5kKCJwYXRoIikuYXR0cigiaWQiLG8pLmF0dHIoImNsYXNzIixpKS5zdHlsZSgic3Ryb2tlLXdpZHRoIixyKyJweCIpO2lmKGUubGFiZWwmJmUubGFiZWwubWV0YWVkZ2UpaWYoZS5sYWJlbC5tZXRhZWRnZS5udW1SZWZFZGdlcyl7Y29uc3QgdD1gcmVmZXJlbmNlLWFycm93aGVhZC0ke0pXdChyKX1gO2Euc3R5bGUoIm1hcmtlci1zdGFydCIsYHVybCgjJHt0fSlgKSxlLmxhYmVsLnN0YXJ0TWFya2VySWQ9dH1lbHNle2NvbnN0IHQ9YGRhdGFmbG93LWFycm93aGVhZC0ke0pXdChyKX1gO2Euc3R5bGUoIm1hcmtlci1lbmQiLGB1cmwoIyR7dH0pYCksZS5sYWJlbC5lbmRNYXJrZXJJZD10fWlmKG51bGw9PWUubGFiZWx8fG51bGw9PWUubGFiZWwubWV0YWVkZ2UpcmV0dXJuO2xldCBzPWVxdChlLmxhYmVsLm1ldGFlZGdlLG4ucmVuZGVySGllcmFyY2h5KTtudWxsIT1zJiZ0LmFwcGVuZCgidGV4dCIpLmFwcGVuZCgidGV4dFBhdGgiKS5hdHRyKCJ4bGluazpocmVmIiwiIyIrbykuYXR0cigic3RhcnRPZmZzZXQiLCI1MCUiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLmF0dHIoImRvbWluYW50LWJhc2VsaW5lIiwiY2VudHJhbCIpLnRleHQocyl9bGV0IG9xdD11TCgpLmN1cnZlKCRMKS54KCh0PT50LngpKS55KCh0PT50LnkpKTt2YXIgYXF0O2Z1bmN0aW9uIHNxdCh0LGUsbil7bGV0IGk9d0d0KHQsImciLHZHdC5Ob2RlLkNPTlRBSU5FUikuc2VsZWN0QWxsKChmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9KSkuZGF0YShlLCh0PT50Lm5vZGUubmFtZSsiOiIrdC5ub2RlLnR5cGUpKTtyZXR1cm4gaS5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImRhdGEtbmFtZSIsKHQ9PnQubm9kZS5uYW1lKSkuZWFjaCgoZnVuY3Rpb24odCl7bGV0IGU9U3UodGhpcyk7bi5hZGROb2RlR3JvdXAodC5ub2RlLm5hbWUsZSl9KSkubWVyZ2UoaSkuYXR0cigiY2xhc3MiLCh0PT52R3QuTm9kZS5HUk9VUCsiICIreXF0KHQpKSkuZWFjaCgoZnVuY3Rpb24odCl7bGV0IGU9U3UodGhpcyk7QXF0KHdHdChlLCJnIix2R3QuQW5ub3RhdGlvbi5JTkJPWCksdC5pbkFubm90YXRpb25zLHQsbiksQXF0KHdHdChlLCJnIix2R3QuQW5ub3RhdGlvbi5PVVRCT1gpLHQub3V0QW5ub3RhdGlvbnMsdCxuKTtsZXQgaT1fcXQoZSx0LHZHdC5Ob2RlLlNIQVBFKTt0Lm5vZGUuaXNHcm91cE5vZGUmJihmdW5jdGlvbiByKHQsZSxuKXtsZXQgaT13R3QodCwiZyIsdkd0Lk5vZGUuQlVUVE9OX0NPTlRBSU5FUik7d0d0KGksImNpcmNsZSIsdkd0Lk5vZGUuQlVUVE9OX0NJUkNMRSksd0d0KGksInBhdGgiLHZHdC5Ob2RlLkVYUEFORF9CVVRUT04pLmF0dHIoImQiLCJNMCwtMi4yIFYyLjIgTS0yLjIsMCBIMi4yIiksd0d0KGksInBhdGgiLHZHdC5Ob2RlLkNPTExBUFNFX0JVVFRPTikuYXR0cigiZCIsIk0tMi4yLDAgSDIuMiIpLGkub24oImNsaWNrIiwodD0+e3V1LnN0b3BQcm9wYWdhdGlvbigpLG4uZmlyZSgibm9kZS10b2dnbGUtZXhwYW5kIix7bmFtZTp0Lm5vZGUubmFtZX0pfSkpLChmdW5jdGlvbiByKHQsZSl7bGV0IG49RFd0KGUpKyhlLmV4cGFuZGVkP2Uud2lkdGg6ZS5jb3JlQm94LndpZHRoKS8yLTYsaT1lLnktKGUuZXhwYW5kZWQ/ZS5oZWlnaHQ6ZS5jb3JlQm94LmhlaWdodCkvMis2O2Uubm9kZS50eXBlIT09akd0LlNFUklFU3x8ZS5leHBhbmRlZHx8KG4rPTEwLGktPTIpO2xldCByPSJ0cmFuc2xhdGUoIituKyIsIitpKyIpIjt0LnNlbGVjdEFsbCgicGF0aCIpLnRyYW5zaXRpb24oKS5hdHRyKCJ0cmFuc2Zvcm0iLHIpLHQuc2VsZWN0KCJjaXJjbGUiKS50cmFuc2l0aW9uKCkuYXR0cih7Y3g6bixjeTppLHI6Tld0Lm5vZGVTaXplLm1ldGEuZXhwYW5kQnV0dG9uUmFkaXVzfSl9KShpLGUpfSkoaSx0LG4pLGNxdChpLHQsbiksKGZ1bmN0aW9uIG8odCxlLG4pe2lmKGUubm9kZS5pc0dyb3VwTm9kZSl7aWYoZS5leHBhbmRlZClyZXR1cm4gTHF0KHQsZSxuLHZHdC5TdWJzY2VuZS5HUk9VUCk7Rld0KHQsImciLHZHdC5TdWJzY2VuZS5HUk9VUCkucmVtb3ZlKCl9fSkoZSx0LG4pLGNxdCgoZnVuY3Rpb24gYSh0LGUsbil7bGV0IGk9ZS5kaXNwbGF5TmFtZSxyPWUubm9kZS50eXBlPT09akd0Lk1FVEEmJiFlLmV4cGFuZGVkLG89d0d0KHQsInRleHQiLHZHdC5Ob2RlLkxBQkVMKSxhPW8ubm9kZSgpO2EucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChhKSxvLmF0dHIoImR5IiwiLjM1ZW0iKS5hdHRyKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpO2xldCBzPTg7c3dpdGNoKGUubm9kZS50eXBlKXtjYXNlIGpHdC5NRVRBOnM9ZS5leHBhbmRlZD85Ojg7YnJlYWs7Y2FzZSBqR3QuT1A6cz02fWlmKHIpe2kubGVuZ3RoPm4ubWF4TWV0YW5vZGVMYWJlbExlbmd0aCYmKGk9aS5zdWJzdHIoMCxuLm1heE1ldGFub2RlTGFiZWxMZW5ndGgtMikrIuKApiIpO2xldCB0PShmdW5jdGlvbiBsKHQpe3JldHVybiBtcXR8fChtcXQ9Vk0oKS5kb21haW4oW3QubWF4TWV0YW5vZGVMYWJlbExlbmd0aExhcmdlRm9udCx0Lm1heE1ldGFub2RlTGFiZWxMZW5ndGhdKS5yYW5nZShbdC5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemUsdC5taW5NZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemVdKS5jbGFtcCghMCkpLG1xdH0pKG4pO28uYXR0cigiZm9udC1zaXplIix0KGkubGVuZ3RoKSsicHgiKSxzPXQoaS5sZW5ndGgpfXJldHVybiBmcXQoby50ZXh0KGkpLGUubm9kZS50eXBlLHMsZSksb30pKGUsdCxuKSx0LG4sdC5ub2RlLnR5cGU9PT1qR3QuTUVUQSksd3F0KGUsdCxuKSwoZnVuY3Rpb24gcyh0LGUpe2xldCBuPUZXdCh0LCJnIix2R3QuTm9kZS5TSEFQRSksaT1EV3QoZSk7c3dpdGNoKGUubm9kZS50eXBlKXtjYXNlIGpHdC5PUDp7Y29uc3Qgcj1lLm5vZGU7U2UuZXhwb3J0cy5pc051bWJlcihyLmZ1bmN0aW9uSW5wdXRJbmRleCl8fFNlLmV4cG9ydHMuaXNOdW1iZXIoci5mdW5jdGlvbk91dHB1dEluZGV4KT8oZnVuY3Rpb24gcih0LGUsbixpLG8pe2NvbnN0IGE9by8yLHM9aS8yLGw9W1tlLG4tYV0sW2UrcyxuK2FdLFtlLXMsbithXV07dC50cmFuc2l0aW9uKCkuYXR0cigicG9pbnRzIixsLm1hcCgodD0+dC5qb2luKCIsIikpKS5qb2luKCIgIikpfSkoRld0KG4sInBvbHlnb24iKSxlLngsZS55LGUuY29yZUJveC53aWR0aCxlLmNvcmVCb3guaGVpZ2h0KTpXV3QoRld0KG4sImVsbGlwc2UiKSxpLGUueSxlLmNvcmVCb3gud2lkdGgsZS5jb3JlQm94LmhlaWdodCksZ3F0KHQsaSxlLnksZS5sYWJlbE9mZnNldCk7YnJlYWt9Y2FzZSBqR3QuTUVUQTp7bGV0IHI9bi5zZWxlY3RBbGwoInJlY3QiKTtlLmV4cGFuZGVkPyhHV3QocixlLngsZS55LGUud2lkdGgsZS5oZWlnaHQpLGxxdCh0LGUpLGdxdCh0LGksZS55LC1lLmhlaWdodC8yK2UubGFiZWxIZWlnaHQvMikpOihHV3QocixpLGUueSxlLmNvcmVCb3gud2lkdGgsZS5jb3JlQm94LmhlaWdodCksZ3F0KHQsaSxlLnksMCkpO2JyZWFrfWNhc2Ugakd0LlNFUklFUzp7bGV0IHI9Rld0KG4sInVzZSIpO2UuZXhwYW5kZWQ/KEdXdChyLGUueCxlLnksZS53aWR0aCxlLmhlaWdodCksbHF0KHQsZSksZ3F0KHQsaSxlLnksLWUuaGVpZ2h0LzIrZS5sYWJlbEhlaWdodC8yKSk6KEdXdChyLGksZS55LGUuY29yZUJveC53aWR0aCxlLmNvcmVCb3guaGVpZ2h0KSxncXQodCxpLGUueSxlLmxhYmVsT2Zmc2V0KSk7YnJlYWt9Y2FzZSBqR3QuQlJJREdFOkdXdChGV3QobiwicmVjdCIpLGUueCxlLnksZS53aWR0aCxlLmhlaWdodCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIG5vZGUgdHlwZTogIitlLm5vZGUudHlwZSl9fSkoZSx0KX0pKSxpLmV4aXQoKS5lYWNoKChmdW5jdGlvbih0KXtuLnJlbW92ZU5vZGVHcm91cCh0Lm5vZGUubmFtZSk7bGV0IGU9U3UodGhpcyk7dC5pbkFubm90YXRpb25zLmxpc3QubGVuZ3RoPjAmJmUuc2VsZWN0KCIuIit2R3QuQW5ub3RhdGlvbi5JTkJPWCkuc2VsZWN0QWxsKCIuIit2R3QuQW5ub3RhdGlvbi5HUk9VUCkuZWFjaCgoZT0+e24ucmVtb3ZlQW5ub3RhdGlvbkdyb3VwKGUsdCl9KSksdC5vdXRBbm5vdGF0aW9ucy5saXN0Lmxlbmd0aD4wJiZlLnNlbGVjdCgiLiIrdkd0LkFubm90YXRpb24uT1VUQk9YKS5zZWxlY3RBbGwoIi4iK3ZHdC5Bbm5vdGF0aW9uLkdST1VQKS5lYWNoKChlPT57bi5yZW1vdmVBbm5vdGF0aW9uR3JvdXAoZSx0KX0pKX0pKS5yZW1vdmUoKSxpfWZ1bmN0aW9uIGxxdCh0LGUpe2xldCBuPWUueC1lLndpZHRoLzIrZS5wYWRkaW5nTGVmdCxpPWUueS1lLmhlaWdodC8yK2UucGFkZGluZ1RvcDtqV3QoRld0KHQsImciLHZHdC5TdWJzY2VuZS5HUk9VUCksbixpKX1mdW5jdGlvbiBjcXQodCxlLG4saSl7aWYoaSlyZXR1cm4gdm9pZCB0LmF0dHIoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpO2xldCByPVpXdChuLHVxdChlLm5vZGUsbikpO3Qub24oImRibGNsaWNrIiwodD0+e24uZmlyZSgibm9kZS10b2dnbGUtZXhwYW5kIix7bmFtZTp0Lm5vZGUubmFtZX0pfSkpLm9uKCJtb3VzZW92ZXIiLCh0PT57bi5pc05vZGVFeHBhbmRlZCh0KXx8bi5maXJlKCJub2RlLWhpZ2hsaWdodCIse25hbWU6dC5ub2RlLm5hbWV9KX0pKS5vbigibW91c2VvdXQiLCh0PT57bi5pc05vZGVFeHBhbmRlZCh0KXx8bi5maXJlKCJub2RlLXVuaGlnaGxpZ2h0Iix7bmFtZTp0Lm5vZGUubmFtZX0pfSkpLm9uKCJjbGljayIsKHQ9Pnt1dS5zdG9wUHJvcGFnYXRpb24oKSxuLmZpcmUoIm5vZGUtc2VsZWN0Iix7bmFtZTp0Lm5vZGUubmFtZX0pfSkpLm9uKCJjb250ZXh0bWVudSIsKCh0LGUpPT57bi5maXJlKCJub2RlLXNlbGVjdCIse25hbWU6dC5ub2RlLm5hbWV9KSxyLmNhbGwodCxlKX0pKX1mdW5jdGlvbiB1cXQodCxlKXtsZXQgbj1be3RpdGxlOmU9PnVXdCh0LmluY2x1ZGUpLGFjdGlvbjoobixpLHIpPT57ZS5maXJlKCJub2RlLXRvZ2dsZS1leHRyYWN0Iix7bmFtZTp0Lm5hbWV9KX19XTtyZXR1cm4gZS5ub2RlQ29udGV4dE1lbnVJdGVtcyYmKG49bi5jb25jYXQoZS5ub2RlQ29udGV4dE1lbnVJdGVtcykpLGhxdCh0KSYmbi5wdXNoKHt0aXRsZTplPT5wcXQodCksYWN0aW9uOihuLGkscik9PntlLmZpcmUoIm5vZGUtdG9nZ2xlLXNlcmllc2dyb3VwIix7bmFtZTpkcXQodCl9KX19KSxufWZ1bmN0aW9uIGhxdCh0KXtyZXR1cm4gbnVsbCE9PWRxdCh0KX1mdW5jdGlvbiBkcXQodCl7cmV0dXJuIHQ/dC50eXBlPT09akd0LlNFUklFUz90Lm5hbWU6dC50eXBlPT09akd0Lk9QP3Qub3duaW5nU2VyaWVzOm51bGw6bnVsbH1mdW5jdGlvbiBwcXQodCl7cmV0dXJuKGZ1bmN0aW9uIG4odCl7cmV0dXJuIHQ9PT1XR3QuR1JPVVA/IlVuZ3JvdXAgdGhpcyBzZXJpZXMgb2Ygbm9kZXMiOiJHcm91cCB0aGlzIHNlcmllcyBvZiBub2RlcyJ9KShudWxsIT09KGZ1bmN0aW9uIGUodCl7bGV0IGU9bnVsbDtyZXR1cm4gdD8odC50eXBlPT09akd0LlNFUklFUz9lPXQ6dC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUudHlwZT09PWpHdC5TRVJJRVMmJihlPXQucGFyZW50Tm9kZSksZSk6bnVsbH0pKHQpP1dHdC5HUk9VUDpXR3QuVU5HUk9VUCl9ZnVuY3Rpb24gZnF0KHQsZSxuLGkpe2xldCByPXQubm9kZSgpLG89ci50ZXh0Q29udGVudCxhPW51bGw7c3dpdGNoKGUpe2Nhc2Ugakd0Lk1FVEE6aSYmIWkuZXhwYW5kZWQmJihhPU5XdC5ub2RlU2l6ZS5tZXRhLm1heExhYmVsV2lkdGgpO2JyZWFrO2Nhc2Ugakd0Lk9QOmE9Tld0Lm5vZGVTaXplLm9wLm1heExhYmVsV2lkdGg7YnJlYWs7Y2FzZS0xOmE9Tld0LmFubm90YXRpb25zLm1heExhYmVsV2lkdGh9aWYobnVsbCE9PWEpcmV0dXJuIHIudGV4dENvbnRlbnQ9KGZ1bmN0aW9uIHModCxlLG4pe2lmKCF0KXJldHVybiIiO2lmKEJHdCh0LGUpPD1uKXJldHVybiB0O2xldCBpPTAscj10Lmxlbmd0aDtmb3IoO2k8cjspe2NvbnN0IG89aStNYXRoLnJvdW5kKChyLWkpLzIpO0JHdCh0LnNsaWNlKDAsbykrIuKApiIsZSk8PW4/aT1vOnI9by0xfXJldHVybiAwPT09aT90WzBdOnQuc2xpY2UoMCxpKSsi4oCmIn0pKHIudGV4dENvbnRlbnQsbixhKSx0LmFwcGVuZCgidGl0bGUiKS50ZXh0KG8pfSEoZnVuY3Rpb24odCl7dC5OT05FPSJub25lIix0LkNPTVBVVEVfVElNRT0iY29tcHV0ZV90aW1lIix0LkRFVklDRT0iZGV2aWNlIix0Lk1FTU9SWT0ibWVtb3J5Iix0Lk9QX0NPTVBBVElCSUxJVFk9Im9wX2NvbXBhdGliaWxpdHkiLHQuU1RSVUNUVVJFPSJzdHJ1Y3R1cmUiLHQuWExBX0NMVVNURVI9InhsYV9jbHVzdGVyIn0pKGFxdHx8KGFxdD17fSkpO2xldCBtcXQ9bnVsbDtmdW5jdGlvbiBncXQodCxlLG4saSl7Rld0KHQsInRleHQiLHZHdC5Ob2RlLkxBQkVMKS50cmFuc2l0aW9uKCkuYXR0cigieCIsZSkuYXR0cigieSIsbitpKX1mdW5jdGlvbiBfcXQodCxlLG4pe2xldCBpPXdHdCh0LCJnIixuKTtzd2l0Y2goZS5ub2RlLnR5cGUpe2Nhc2Ugakd0Lk9QOmNvbnN0IHQ9ZS5ub2RlO2lmKFNlLmV4cG9ydHMuaXNOdW1iZXIodC5mdW5jdGlvbklucHV0SW5kZXgpfHxTZS5leHBvcnRzLmlzTnVtYmVyKHQuZnVuY3Rpb25PdXRwdXRJbmRleCkpe3dHdChpLCJwb2x5Z29uIix2R3QuTm9kZS5DT0xPUl9UQVJHRVQpO2JyZWFrfXdHdChpLCJlbGxpcHNlIix2R3QuTm9kZS5DT0xPUl9UQVJHRVQpO2JyZWFrO2Nhc2Ugakd0LlNFUklFUzpsZXQgbj0iYW5ub3RhdGlvbiIscj1lO3IuY29yZUdyYXBoJiYobj1yLm5vZGUuaGFzTm9uQ29udHJvbEVkZ2VzPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwiKTtsZXQgbz1bdkd0Lk5vZGUuQ09MT1JfVEFSR0VUXTtyLmlzRmFkZWRPdXQmJm8ucHVzaCgiZmFkZWQtZWxsaXBzZSIpLHdHdChpLCJ1c2UiLG8pLmF0dHIoInhsaW5rOmhyZWYiLCIjb3Atc2VyaWVzLSIrbisiLXN0YW1wIiksd0d0KGksInJlY3QiLHZHdC5Ob2RlLkNPTE9SX1RBUkdFVCkuYXR0cigicngiLGUucmFkaXVzKS5hdHRyKCJyeSIsZS5yYWRpdXMpO2JyZWFrO2Nhc2Ugakd0LkJSSURHRTpjYXNlIGpHdC5NRVRBOndHdChpLCJyZWN0Iix2R3QuTm9kZS5DT0xPUl9UQVJHRVQpLmF0dHIoInJ4IixlLnJhZGl1cykuYXR0cigicnkiLGUucmFkaXVzKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJVbnJlY29nbml6ZWQgbm9kZSB0eXBlOiAiK2Uubm9kZS50eXBlKX1yZXR1cm4gaX1mdW5jdGlvbiB5cXQodCl7c3dpdGNoKHQubm9kZS50eXBlKXtjYXNlIGpHdC5PUDpyZXR1cm4gdkd0Lk9QTk9ERTtjYXNlIGpHdC5NRVRBOnJldHVybiB2R3QuTUVUQU5PREU7Y2FzZSBqR3QuU0VSSUVTOnJldHVybiB2R3QuU0VSSUVTTk9ERTtjYXNlIGpHdC5CUklER0U6cmV0dXJuIHZHdC5CUklER0VOT0RFO2Nhc2Ugakd0LkVMTElQU0lTOnJldHVybiB2R3QuRUxMSVBTSVNOT0RFfXRocm93IEVycm9yKCJVbnJlY29nbml6ZWQgbm9kZSB0eXBlOiAiK3Qubm9kZS50eXBlKX1mdW5jdGlvbiB2cXQodCxlLG4pe2xldCBpPShmdW5jdGlvbiByKHQpe3JldHVybiB0LnJlcGxhY2UoLyhbOi5cW1xdLC9cXFwoXCldKS9nLCJcXCQxIil9KSh0KTtpZighbilyZXR1cm5gdXJsKCMke2l9KWA7bGV0IG89U3UobiksYT1vLnNlbGVjdCgiZGVmcyNfZ3JhcGgtZ3JhZGllbnRzIik7YS5lbXB0eSgpJiYoYT1vLmFwcGVuZCgiZGVmcyIpLmF0dHIoImlkIiwiX2dyYXBoLWdyYWRpZW50cyIpKTtsZXQgcz1hLnNlbGVjdCgibGluZWFyR3JhZGllbnQjIitpKTtpZihzLmVtcHR5KCkpe3M9YS5hcHBlbmQoImxpbmVhckdyYWRpZW50IikuYXR0cigiaWQiLHQpLHMuc2VsZWN0QWxsKCIqIikucmVtb3ZlKCk7bGV0IG49MDtTZS5leHBvcnRzLmVhY2goZSwodD0+e2xldCBlPXQuY29sb3I7cy5hcHBlbmQoInN0b3AiKS5hdHRyKCJvZmZzZXQiLG4pLmF0dHIoInN0b3AtY29sb3IiLGUpLHMuYXBwZW5kKCJzdG9wIikuYXR0cigib2Zmc2V0IixuK3QucHJvcG9ydGlvbikuYXR0cigic3RvcC1jb2xvciIsZSksbis9dC5wcm9wb3J0aW9ufSkpfXJldHVybmB1cmwoIyR7aX0pYH1mdW5jdGlvbiBicXQodCl7U3UodCkuc2VsZWN0KCJkZWZzI19ncmFwaC1ncmFkaWVudHMiKS5yZW1vdmUoKX1mdW5jdGlvbiB4cXQodCxlLG4saSxyKXtsZXQgbz1wV3Q7c3dpdGNoKHQ9dHx8KCgpPT4wKSxlKXtjYXNlIGFxdC5OT05FOmNhc2UgYXF0LlNUUlVDVFVSRTppZihuLm5vZGUudHlwZT09PWpHdC5NRVRBKXtsZXQgcj1uLm5vZGUudGVtcGxhdGVJZDtyZXR1cm4gZT09PWFxdC5TVFJVQ1RVUkUmJm51bGwhPT1yP28uU1RSVUNUVVJFX1BBTEVUVEUodChyKSxpKTpvLlVOS05PV059cmV0dXJuIG4ubm9kZS50eXBlPT09akd0LlNFUklFUz9pP28uRVhQQU5ERURfQ09MT1I6IndoaXRlIjpuLm5vZGUudHlwZT09PWpHdC5CUklER0U/bi5zdHJ1Y3R1cmFsPyIjZjBlIjpuLm5vZGUuaW5ib3VuZD8iIzBlZiI6IiNmZTAiOlNlLmV4cG9ydHMuaXNOdW1iZXIobi5ub2RlLmZ1bmN0aW9uSW5wdXRJbmRleCk/IiM3OTU1NDgiOlNlLmV4cG9ydHMuaXNOdW1iZXIobi5ub2RlLmZ1bmN0aW9uT3V0cHV0SW5kZXgpPyIjMDA5Njg4Ijoid2hpdGUiO2Nhc2UgYXF0LkRFVklDRTpyZXR1cm4gbnVsbD09bi5kZXZpY2VDb2xvcnM/by5VTktOT1dOOmk/by5FWFBBTkRFRF9DT0xPUjp2cXQoImRldmljZS0iK24ubm9kZS5uYW1lLG4uZGV2aWNlQ29sb3JzLHIpO2Nhc2UgYXF0LlhMQV9DTFVTVEVSOnJldHVybiBudWxsPT1uLnhsYUNsdXN0ZXJDb2xvcnM/by5VTktOT1dOOmk/by5FWFBBTkRFRF9DT0xPUjp2cXQoInhsYS0iK24ubm9kZS5uYW1lLG4ueGxhQ2x1c3RlckNvbG9ycyxyKTtjYXNlIGFxdC5DT01QVVRFX1RJTUU6cmV0dXJuIGk/by5FWFBBTkRFRF9DT0xPUjpuLmNvbXB1dGVUaW1lQ29sb3J8fG8uVU5LTk9XTjtjYXNlIGFxdC5NRU1PUlk6cmV0dXJuIGk/by5FWFBBTkRFRF9DT0xPUjpuLm1lbW9yeUNvbG9yfHxvLlVOS05PV047Y2FzZSBhcXQuT1BfQ09NUEFUSUJJTElUWTpyZXR1cm4gbnVsbD09bi5jb21wYXRpYmlsaXR5Q29sb3JzP28uVU5LTk9XTjppP28uRVhQQU5ERURfQ09MT1I6dnF0KCJvcC1jb21wYXQtIituLm5vZGUubmFtZSxuLmNvbXBhdGliaWxpdHlDb2xvcnMscik7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gY2FzZSB0byBjb2xvciBub2RlcyBieSIpfX1mdW5jdGlvbiB3cXQodCxlLG4saSl7aT1pfHx2R3QuTm9kZS5TSEFQRTtjb25zdCByPW4uaXNOb2RlSGlnaGxpZ2h0ZWQoZS5ub2RlLm5hbWUpLG89bi5pc05vZGVTZWxlY3RlZChlLm5vZGUubmFtZSksYT1lLmlzSW5FeHRyYWN0fHxlLmlzT3V0RXh0cmFjdHx8ZS5pc0xpYnJhcnlGdW5jdGlvbixzPWUuZXhwYW5kZWQmJmkhPT12R3QuQW5ub3RhdGlvbi5OT0RFLGw9ZS5pc0ZhZGVkT3V0O3QuY2xhc3NlZCgiaGlnaGxpZ2h0ZWQiLHIpLHQuY2xhc3NlZCgic2VsZWN0ZWQiLG8pLHQuY2xhc3NlZCgiZXh0cmFjdCIsYSksdC5jbGFzc2VkKCJleHBhbmRlZCIscyksdC5jbGFzc2VkKCJmYWRlZCIsbCk7Y29uc3QgYz10LnNlbGVjdCgiLiIraSsiIC4iK3ZHdC5Ob2RlLkNPTE9SX1RBUkdFVCksdT14cXQobi50ZW1wbGF0ZUluZGV4LG4uY29sb3JCeSxlLHMsbi5nZXRHcmFwaFN2Z1Jvb3QoKSk7Yy5zdHlsZSgiZmlsbCIsdSksYy5zdHlsZSgic3Ryb2tlIixvP251bGw6U3F0KHUpKX1mdW5jdGlvbiBTcXQodCl7cmV0dXJuInVybCI9PT10LnN1YnN0cmluZygwLDMpP3BXdC5HUkFESUVOVF9PVVRMSU5FOlVoKHQpLmRhcmtlcigpLnRvU3RyaW5nKCl9ZnVuY3Rpb24gTXF0KHQsZSxuLGkpe2NvbnN0IHI9U3UodCk7aWYoci5zZWxlY3RBbGwoIi5pbnB1dC1oaWdobGlnaHQiKS5jbGFzc2VkKCJpbnB1dC1oaWdobGlnaHQiLCExKSxyLnNlbGVjdEFsbCgiLm5vbi1pbnB1dCIpLmNsYXNzZWQoIm5vbi1pbnB1dCIsITEpLHIuc2VsZWN0QWxsKCIuaW5wdXQtcGFyZW50IikuY2xhc3NlZCgiaW5wdXQtcGFyZW50IiwhMSksci5zZWxlY3RBbGwoIi5pbnB1dC1jaGlsZCIpLmNsYXNzZWQoImlucHV0LWNoaWxkIiwhMSksci5zZWxlY3RBbGwoIi5pbnB1dC1lZGdlLWhpZ2hsaWdodCIpLmNsYXNzZWQoImlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMSksci5zZWxlY3RBbGwoIi5ub24taW5wdXQtZWRnZS1oaWdobGlnaHQiKS5jbGFzc2VkKCJub24taW5wdXQtZWRnZS1oaWdobGlnaHQiLCExKSxyLnNlbGVjdEFsbCgiLmlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZCIpLmNsYXNzZWQoImlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZCIsITEpLCFlfHwhaXx8IW4pcmV0dXJuO2xldCBvPUVxdChuLGUpLGE9e307U2UuZXhwb3J0cy5lYWNoKG8sKGZ1bmN0aW9uKG4pe2E9VHF0KHQsZSxuLGEpfSkpO2xldCBzPU9iamVjdC5rZXlzKGEpLGw9KGZ1bmN0aW9uIGModCxlKXtsZXQgbj17fTtyZXR1cm4gU2UuZXhwb3J0cy5lYWNoKGUsKGZ1bmN0aW9uKGUpe2xldCBpPXQuZ2V0Tm9kZUJ5TmFtZShlKSxyPUNxdCh0LGkpO25bci5uYW1lXT1yfSkpLG59KShlLHMpOyEoZnVuY3Rpb24gdSh0LGUpe1NlLmV4cG9ydHMuZm9yT3duKGUsKGZ1bmN0aW9uKGUpe2xldCBuPWU7Zm9yKDtuLm5hbWUhPT1GR3Q7KXtjb25zdCBlPVN1KHQpLnNlbGVjdChgLm5vZGVbZGF0YS1uYW1lPSIke24ubmFtZX0iXWApOyFlLm5vZGVzKCkubGVuZ3RofHxlLmNsYXNzZWQoImlucHV0LWhpZ2hsaWdodCIpfHxlLmNsYXNzZWQoInNlbGVjdGVkIil8fGUuY2xhc3NlZCgib3AiKXx8ZS5jbGFzc2VkKCJpbnB1dC1wYXJlbnQiLCEwKSxuPW4ucGFyZW50Tm9kZX19KSl9KSh0LGwpLHIuc2VsZWN0QWxsKCJnLm5vZGU6bm90KC5zZWxlY3RlZCk6bm90KC5pbnB1dC1oaWdobGlnaHQpOm5vdCguaW5wdXQtcGFyZW50KTpub3QoLmlucHV0LWNoaWxkcmVuKSIpLmNsYXNzZWQoIm5vbi1pbnB1dCIsITApLmVhY2goKGZ1bmN0aW9uKHQpe3Iuc2VsZWN0QWxsKGBbZGF0YS1uYW1lPSIke3Qubm9kZS5uYW1lfSJdYCkuY2xhc3NlZCgibm9uLWlucHV0IiwhMCl9KSksci5zZWxlY3RBbGwoImcuZWRnZTpub3QoLmlucHV0LWVkZ2UtaGlnaGxpZ2h0KSIpLmNsYXNzZWQoIm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApfWZ1bmN0aW9uIEVxdCh0LGUpe2xldCBuPVtdLGk9ZS5nZXROb2RlQnlOYW1lKHQpO2lmKGkgaW5zdGFuY2VvZiBYR3QpcmV0dXJuW2ldLmNvbmNhdChpLmluRW1iZWRkaW5ncyk7bGV0IHI9aS5tZXRhZ3JhcGgubm9kZXMoKTtyZXR1cm4gU2UuZXhwb3J0cy5lYWNoKHIsKGZ1bmN0aW9uKHQpe249bi5jb25jYXQoRXF0KHQsZSkpfSkpLG59ZnVuY3Rpb24gVHF0KHQsZSxuLGkpe2lmKGlbbi5uYW1lXSlyZXR1cm4gaTtpW24ubmFtZV09ITA7bGV0IHI9bi5pbnB1dHMsbz1DcXQoZSxuKTtTdSh0KS5zZWxlY3QoYC5ub2RlW2RhdGEtbmFtZT0iJHtvLm5hbWV9Il1gKS5jbGFzc2VkKCJpbnB1dC1oaWdobGlnaHQiLCEwKTtsZXQgYT17fTtTZS5leHBvcnRzLmVhY2gociwoZnVuY3Rpb24odCl7bGV0IG49ZS5nZXROb2RlQnlOYW1lKHQubmFtZSk7aWYodm9pZCAwPT09bilyZXR1cm47aWYobiBpbnN0YW5jZW9mIEtHdCl7bGV0IHQ9c1d0KG4ubmFtZSk7bj1lLmdldE5vZGVCeU5hbWUodCl9bGV0IGk9Q3F0KGUsbikscj1hW2kubmFtZV07cj9yLm9wTm9kZXMucHVzaChuKTphW2kubmFtZV09e3Zpc2libGVQYXJlbnQ6aSxvcE5vZGVzOltuXX19KSk7bGV0IHM9e30sbD1bb107c1tvLm5hbWVdPXt0cmFjZWQ6ITEsaW5kZXg6MCxjb25uZWN0aW9uRW5kcG9pbnRzOltdfTtsZXQgYz1vO2ZvcihsZXQgdD0xO2MubmFtZSE9PUZHdDt0KyspYz1jLnBhcmVudE5vZGUsc1tjLm5hbWVdPXt0cmFjZWQ6ITEsaW5kZXg6dCxjb25uZWN0aW9uRW5kcG9pbnRzOltdfSxsW3RdPWM7cmV0dXJuIFNlLmV4cG9ydHMuZm9yT3duKGEsKGZ1bmN0aW9uKG4scil7bGV0IGE9bi52aXNpYmxlUGFyZW50O1NlLmV4cG9ydHMuZWFjaChuLm9wTm9kZXMsKGZ1bmN0aW9uKG4pe2k9VHF0KHQsZSxuLGkpfSkpLGEubmFtZSE9PW8ubmFtZSYmKGZ1bmN0aW9uIGModCxlLG4saSl7bGV0IHI9ZSxvPWUsYT1bXTtmb3IoOyFuW3IubmFtZV07KW8ubmFtZSE9PXIubmFtZSYmYS5wdXNoKFtvLHJdKSxvPXIscj1yLnBhcmVudE5vZGU7bGV0IHM9bltyLm5hbWVdLmluZGV4LGw9aVtNYXRoLm1heChzLTEsMCldLm5hbWUsYz1sLHU9by5uYW1lLGg9by5uYW1lO2NvbnN0IGQ9U3UodCk7ZC5zZWxlY3RBbGwoYFtkYXRhLWVkZ2U9IiR7aH0tLSR7bH0iXWApLmNsYXNzZWQoImlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCksU2UuZXhwb3J0cy5lYWNoKGEsKGZ1bmN0aW9uKHQpe2Quc2VsZWN0QWxsKGBbZGF0YS1lZGdlPSIke3RbMF0ubmFtZX0tLSR7Y31+fiR7dFsxXS5uYW1lfX5+T1VUIl1gKS5jbGFzc2VkKCJpbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApfSkpO2ZvcihsZXQgdD0xO3Q8czt0KyspZC5zZWxlY3RBbGwoYFtkYXRhLWVkZ2U9IiR7dX1+fiR7aVt0XS5uYW1lfX5+SU4tLSR7aVt0LTFdLm5hbWV9Il1gKS5jbGFzc2VkKCJpbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApfSkodCxhLHMsbCl9KSksaX1mdW5jdGlvbiBDcXQodCxlKXtsZXQgbj0hMSxpPWU7Zm9yKDshbjspaWYoaT0oZT1pKS5wYXJlbnROb2RlLHZvaWQgMD09PWkpbj0hMDtlbHNle2xldCBlPXQuZ2V0UmVuZGVyTm9kZUJ5TmFtZShpLm5hbWUpO2UmJihlLmV4cGFuZGVkfHxpIGluc3RhbmNlb2YgWEd0KSYmKG49ITApfXJldHVybiBlfWZ1bmN0aW9uIEFxdCh0LGUsbixpKXtsZXQgcj10LnNlbGVjdEFsbCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGlsZE5vZGVzfSkpLmRhdGEoZS5saXN0LCh0PT50Lm5vZGUubmFtZSkpO3JldHVybiByLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiZGF0YS1uYW1lIiwodD0+dC5ub2RlLm5hbWUpKS5lYWNoKChmdW5jdGlvbih0KXtsZXQgZT1TdSh0aGlzKTtpLmFkZEFubm90YXRpb25Hcm91cCh0LG4sZSk7bGV0IHI9dkd0LkFubm90YXRpb24uRURHRSxvPXQucmVuZGVyTWV0YWVkZ2VJbmZvJiZ0LnJlbmRlck1ldGFlZGdlSW5mby5tZXRhZWRnZTtvJiYhby5udW1SZWd1bGFyRWRnZXMmJihyKz0iICIrdkd0LkFubm90YXRpb24uQ09OVFJPTF9FREdFKSxvJiZvLm51bVJlZkVkZ2VzJiYocis9IiAiK3ZHdC5FZGdlLlJFRl9MSU5FKSxycXQoZSx0LGksciksdC5hbm5vdGF0aW9uVHlwZSE9PWJXdC5FTExJUFNJUz8oKGZ1bmN0aW9uIGEodCxlKXtsZXQgbj1lLm5vZGUubmFtZS5zcGxpdCgiLyIpO2txdCh0LG5bbi5sZW5ndGgtMV0sZSxudWxsKX0pKGUsdCksKGZ1bmN0aW9uIHModCxlKXtlLmFubm90YXRpb25UeXBlPT09Yld0LlNVTU1BUlk/d0d0KHQsInVzZSIpLmF0dHIoImNsYXNzIiwic3VtbWFyeSIpLmF0dHIoInhsaW5rOmhyZWYiLCIjc3VtbWFyeS1pY29uIikuYXR0cigiY3Vyc29yIiwicG9pbnRlciIpOndHdChfcXQodCxlLHZHdC5Bbm5vdGF0aW9uLk5PREUpLCJ0aXRsZSIpLnRleHQoZS5ub2RlLm5hbWUpfSkoZSx0KSk6a3F0KGUsdC5ub2RlLm5hbWUsdCx2R3QuQW5ub3RhdGlvbi5FTExJUFNJUyl9KSkubWVyZ2UocikuYXR0cigiY2xhc3MiLCh0PT52R3QuQW5ub3RhdGlvbi5HUk9VUCsiICIrKGZ1bmN0aW9uIGUodCl7cmV0dXJuKGJXdFt0XXx8IiIpLnRvTG93ZXJDYXNlKCl8fG51bGx9KSh0LmFubm90YXRpb25UeXBlKSsiICIreXF0KHQpKSkuZWFjaCgoZnVuY3Rpb24odCl7bGV0IGU9U3UodGhpcyk7IShmdW5jdGlvbiByKHQsZSxuLGkpe2xldCByPURXdChlKTtuLnJlbmRlck5vZGVJbmZvJiZuLmFubm90YXRpb25UeXBlIT09Yld0LkVMTElQU0lTJiZ3cXQodCxuLnJlbmRlck5vZGVJbmZvLGksdkd0LkFubm90YXRpb24uTk9ERSksbi5hbm5vdGF0aW9uVHlwZT09PWJXdC5TVU1NQVJZJiYobi53aWR0aCs9MTApLHQuc2VsZWN0KCJ0ZXh0LiIrdkd0LkFubm90YXRpb24uTEFCRUwpLnRyYW5zaXRpb24oKS5hdHRyKCJ4IixyK24uZHgrKG4uaXNJbj8tMToxKSoobi53aWR0aC8yK24ubGFiZWxPZmZzZXQpKS5hdHRyKCJ5IixlLnkrbi5keSksdC5zZWxlY3QoInVzZS5zdW1tYXJ5IikudHJhbnNpdGlvbigpLmF0dHIoIngiLHIrbi5keC0zKS5hdHRyKCJ5IixlLnkrbi5keS02KSxXV3QodC5zZWxlY3QoIi4iK3ZHdC5Bbm5vdGF0aW9uLk5PREUrIiBlbGxpcHNlIikscituLmR4LGUueStuLmR5LG4ud2lkdGgsbi5oZWlnaHQpLEdXdCh0LnNlbGVjdCgiLiIrdkd0LkFubm90YXRpb24uTk9ERSsiIHJlY3QiKSxyK24uZHgsZS55K24uZHksbi53aWR0aCxuLmhlaWdodCksR1d0KHQuc2VsZWN0KCIuIit2R3QuQW5ub3RhdGlvbi5OT0RFKyIgdXNlIikscituLmR4LGUueStuLmR5LG4ud2lkdGgsbi5oZWlnaHQpLHQuc2VsZWN0KCJwYXRoLiIrdkd0LkFubm90YXRpb24uRURHRSkudHJhbnNpdGlvbigpLmF0dHIoImQiLCh0PT57bGV0IG49dC5wb2ludHMubWFwKCh0PT4oe3g6dC5keCtyLHk6dC5keStlLnl9KSkpO3JldHVybiBvcXQobil9KSl9KShlLG4sdCxpKSx0LmFubm90YXRpb25UeXBlIT09Yld0LkVMTElQU0lTJiYoZnVuY3Rpb24gbyh0LGUsbixpKXt0Lm9uKCJtb3VzZW92ZXIiLCh0PT57aS5maXJlKCJhbm5vdGF0aW9uLWhpZ2hsaWdodCIse25hbWU6dC5ub2RlLm5hbWUsaG9zdE5hbWU6ZS5ub2RlLm5hbWV9KX0pKS5vbigibW91c2VvdXQiLCh0PT57aS5maXJlKCJhbm5vdGF0aW9uLXVuaGlnaGxpZ2h0Iix7bmFtZTp0Lm5vZGUubmFtZSxob3N0TmFtZTplLm5vZGUubmFtZX0pfSkpLm9uKCJjbGljayIsKHQ9Pnt1dS5zdG9wUHJvcGFnYXRpb24oKSxpLmZpcmUoImFubm90YXRpb24tc2VsZWN0Iix7bmFtZTp0Lm5vZGUubmFtZSxob3N0TmFtZTplLm5vZGUubmFtZX0pfSkpLG4uYW5ub3RhdGlvblR5cGUhPT1iV3QuU1VNTUFSWSYmbi5hbm5vdGF0aW9uVHlwZSE9PWJXdC5DT05TVEFOVCYmdC5vbigiY29udGV4dG1lbnUiLFpXdChpLHVxdChuLm5vZGUsaSkpKX0pKGUsbix0LGkpfSkpLHIuZXhpdCgpLmVhY2goKGZ1bmN0aW9uKHQpe2kucmVtb3ZlQW5ub3RhdGlvbkdyb3VwKHQsbil9KSkucmVtb3ZlKCkscn1mdW5jdGlvbiBrcXQodCxlLG4saSl7bGV0IHI9dkd0LkFubm90YXRpb24uTEFCRUw7cmV0dXJuIGkmJihyKz0iICIraSksZnF0KHQuYXBwZW5kKCJ0ZXh0IikuYXR0cigiY2xhc3MiLHIpLmF0dHIoImR5IiwiLjM1ZW0iKS5hdHRyKCJ0ZXh0LWFuY2hvciIsbi5pc0luPyJlbmQiOiJzdGFydCIpLnRleHQoZSksLTEsNSl9ZnVuY3Rpb24gTHF0KHQsZSxuLGkpe2xldCByPXhHdCh0LCJnIixpPWl8fHZHdC5TY2VuZS5HUk9VUCkuZW1wdHkoKSxvPXdHdCh0LCJnIixpKSxhPXdHdChvLCJnIix2R3QuU2NlbmUuQ09SRSkscz1TZS5leHBvcnRzLnJlZHVjZShlLmNvcmVHcmFwaC5ub2RlcygpLCgodCxuKT0+e2xldCBpPWUuY29yZUdyYXBoLm5vZGUobik7cmV0dXJuIGkuZXhjbHVkZWR8fHQucHVzaChpKSx0fSksW10pO3JldHVybiBlLm5vZGUudHlwZT09PWpHdC5TRVJJRVMmJnMucmV2ZXJzZSgpLChmdW5jdGlvbiBsKHQsZSxuKXtjb25zdCBpPW47bGV0IHI9W107cj1TZS5leHBvcnRzLnJlZHVjZShlLmVkZ2VzKCksKCh0LG4pPT57bGV0IGk9ZS5lZGdlKG4pO3JldHVybiB0LnB1c2goe3Y6bi52LHc6bi53LGxhYmVsOml9KSx0fSkscik7bGV0IG89d0d0KHQsImciLHZHdC5FZGdlLkNPTlRBSU5FUikuc2VsZWN0QWxsKChmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9KSkuZGF0YShyLFFXdCk7by5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIix2R3QuRWRnZS5HUk9VUCkuYXR0cigiZGF0YS1lZGdlIixRV3QpLmVhY2goKGZ1bmN0aW9uKHQpe2xldCBlPVN1KHRoaXMpO3QubGFiZWwuZWRnZUdyb3VwPWUsaS5fZWRnZUdyb3VwSW5kZXhbUVd0KHQpXT1lLGkuaGFuZGxlRWRnZVNlbGVjdGVkJiZlLm9uKCJjbGljayIsKHQ9Pnt1dS5zdG9wUHJvcGFnYXRpb24oKSxpLmZpcmUoImVkZ2Utc2VsZWN0Iix7ZWRnZURhdGE6dCxlZGdlR3JvdXA6ZX0pfSkpLHJxdChlLHQsaSl9KSkubWVyZ2UobykuZWFjaCgoZnVuY3Rpb24oKXshKGZ1bmN0aW9uIHQoZSxuKXtTdShuKS5zZWxlY3QoInBhdGguIit2R3QuRWRnZS5MSU5FKS50cmFuc2l0aW9uKCkuYXR0clR3ZWVuKCJkIiwoZnVuY3Rpb24odCxuLGkpe3JldHVybihmdW5jdGlvbiByKHQsZSxuLGksbyl7bGV0IGE9bi5sYWJlbCxzPWEuYWRqb2luaW5nTWV0YWVkZ2UsbD1hLnBvaW50cztjb25zdHtzaGFkb3dSb290OmN9PXQ7aWYobi5sYWJlbC5zdGFydE1hcmtlcklkJiYobD1pcXQobCxTdShjLnF1ZXJ5U2VsZWN0b3IoIiMiK24ubGFiZWwuc3RhcnRNYXJrZXJJZCkpLCEwKSksbi5sYWJlbC5lbmRNYXJrZXJJZCYmKGw9aXF0KGwsU3UoYy5xdWVyeVNlbGVjdG9yKCIjIituLmxhYmVsLmVuZE1hcmtlcklkKSksITEpKSwhcylyZXR1cm4gamQobyxvcXQobCkpO2xldCB1PXMuZWRnZUdyb3VwLm5vZGUoKS5maXJzdENoaWxkLGg9YS5tZXRhZWRnZS5pbmJvdW5kO3JldHVybiBmdW5jdGlvbih0KXtsZXQgbj11LmdldFBvaW50QXRMZW5ndGgoaD91LmdldFRvdGFsTGVuZ3RoKCk6MCkubWF0cml4VHJhbnNmb3JtKHUuZ2V0Q1RNKCkpLm1hdHJpeFRyYW5zZm9ybShlLmdldENUTSgpLmludmVyc2UoKSksaT1oPzA6bC5sZW5ndGgtMTtyZXR1cm4gbFtpXS54PW4ueCxsW2ldLnk9bi55LG9xdChsKX19KShlLHRoaXMsdCwwLGkpfSkpfSkobix0aGlzKX0pKS5lYWNoKChmdW5jdGlvbih0KXshKGZ1bmN0aW9uIGUodCxuLGkpe3QuY2xhc3NlZCgiZmFkZWQiLG4ubGFiZWwuaXNGYWRlZE91dCk7bGV0IHI9bi5sYWJlbC5tZXRhZWRnZTt0LnNlbGVjdCgicGF0aC4iK3ZHdC5FZGdlLkxJTkUpLmNsYXNzZWQoImNvbnRyb2wtZGVwIixyJiYhci5udW1SZWd1bGFyRWRnZXMpfSkoU3UodGhpcyksdCl9KSksby5leGl0KCkuZWFjaCgodD0+e2RlbGV0ZSBpLl9lZGdlR3JvdXBJbmRleFtRV3QodCldfSkpLnJlbW92ZSgpfSkoYSxlLmNvcmVHcmFwaCxuKSxzcXQoYSxzLG4pLGUuaXNvbGF0ZWRJbkV4dHJhY3QubGVuZ3RoPjA/c3F0KHdHdChvLCJnIix2R3QuU2NlbmUuSU5FWFRSQUNUKSxlLmlzb2xhdGVkSW5FeHRyYWN0LG4pOnhHdChvLCJnIix2R3QuU2NlbmUuSU5FWFRSQUNUKS5yZW1vdmUoKSxlLmlzb2xhdGVkT3V0RXh0cmFjdC5sZW5ndGg+MD9zcXQod0d0KG8sImciLHZHdC5TY2VuZS5PVVRFWFRSQUNUKSxlLmlzb2xhdGVkT3V0RXh0cmFjdCxuKTp4R3QobywiZyIsdkd0LlNjZW5lLk9VVEVYVFJBQ1QpLnJlbW92ZSgpLGUubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QubGVuZ3RoPjA/c3F0KHdHdChvLCJnIix2R3QuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSksZS5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdCxuKTp4R3QobywiZyIsdkd0LlNjZW5lLkZVTkNUSU9OX0xJQlJBUlkpLnJlbW92ZSgpLChmdW5jdGlvbiBjKHQsZSl7bGV0IG49ZS5ub2RlLnR5cGU9PT1qR3QuU0VSSUVTPzA6Tld0LnN1YnNjZW5lLm1ldGEubGFiZWxIZWlnaHQ7ald0KEZXdCh0LCJnIixWV3QuU2NlbmUuQ09SRSksMCxuKTtsZXQgaT1lLmlzb2xhdGVkSW5FeHRyYWN0Lmxlbmd0aD4wLHI9ZS5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoPjAsbz1lLmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0Lmxlbmd0aD4wLGE9Tld0LnN1YnNjZW5lLm1ldGEuZXh0cmFjdFhPZmZzZXQscz0wO2lmKGkmJihzKz1lLm91dEV4dHJhY3RCb3gud2lkdGgpLHImJihzKz1lLm91dEV4dHJhY3RCb3gud2lkdGgpLGkpe2xldCBpPWUuY29yZUJveC53aWR0aDtpPXM8SVd0P2ktSVd0K2UuaW5FeHRyYWN0Qm94LndpZHRoLzI6aS1lLmluRXh0cmFjdEJveC53aWR0aC8yLWUub3V0RXh0cmFjdEJveC53aWR0aC0ocj9hOjApLGk9aS1lLmxpYnJhcnlGdW5jdGlvbnNCb3gud2lkdGgtKG8/YTowKSxqV3QoRld0KHQsImciLFZXdC5TY2VuZS5JTkVYVFJBQ1QpLGksbil9aWYocil7bGV0IGk9ZS5jb3JlQm94LndpZHRoO3M8SVd0P2k9aS1JV3QrZS5vdXRFeHRyYWN0Qm94LndpZHRoLzI6aS09ZS5vdXRFeHRyYWN0Qm94LndpZHRoLzIsaT1pLWUubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aC0obz9hOjApLGpXdChGV3QodCwiZyIsVld0LlNjZW5lLk9VVEVYVFJBQ1QpLGksbil9aWYobyl7bGV0IGk9ZS5jb3JlQm94LndpZHRoLWUubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aC8yO2pXdChGV3QodCwiZyIsVld0LlNjZW5lLkZVTkNUSU9OX0xJQlJBUlkpLGksbil9fSkobyxlKSxyJiZvLmF0dHIoIm9wYWNpdHkiLDApLnRyYW5zaXRpb24oKS5hdHRyKCJvcGFjaXR5IiwxKSxvfWxldCBQcXQ9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLm5vZGU9bnVsbCx0aGlzLnJlbmRlckluZm89bnVsbCx0aGlzLmNvbG9yQnk9YXF0LlNUUlVDVFVSRSx0aGlzLnRlbXBsYXRlSW5kZXg9bnVsbCx0aGlzLnR5cGU9bnVsbCx0aGlzLnZlcnRpY2FsPSExLHRoaXMuY29uc3Q9ITEsdGhpcy5zdW1tYXJ5PSExLHRoaXMuZmlsbD1udWxsLHRoaXMuaGVpZ2h0PTIwfV9jb21wdXRlRmlsbE92ZXJyaWRlKHQsZSxuLGkscil7cmV0dXJuIHQmJmUmJmk/eHF0KGksbixlLCExKTpyfV9nZXRTdHJva2VPdmVycmlkZSh0KXtyZXR1cm4gdD9TcXQodCk6bnVsbH1fZ2V0VHlwZSh0LGUsbixpKXtjb25zdHtHcmFwaEljb25UeXBlOnJ9PUtXdDtpZih0KXN3aXRjaCh0LnR5cGUpe2Nhc2Ugakd0Lk9QOntjb25zdCBpPXQub3A7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBpP3IuT1A6IkNvbnN0Ij09PWl8fG4/ci5DT05TVDppLmVuZHNXaXRoKCJTdW1tYXJ5Iil8fGU/ci5TVU1NQVJZOnIuT1B9Y2FzZSBqR3QuTUVUQTpyZXR1cm4gci5NRVRBO2Nhc2Ugakd0LlNFUklFUzpyZXR1cm4gci5TRVJJRVN9cmV0dXJuIGl9X2lzVmVydGljYWwodCxlKXtyZXR1cm4gdD90Lmhhc05vbkNvbnRyb2xFZGdlczohIWV9X2dldEZhZGVkKHQpe3JldHVybiB0JiZ0LmlzRmFkZWRPdXR9X29uRmlsbE92ZXJyaWRlQ2hhbmdlZCh0LGUpe2NvbnN0e25vZGU6bixyZW5kZXJJbmZvOmksY29sb3JCeTpyLHRlbXBsYXRlSW5kZXg6b309dGhpczt0IT09ZSYmYnF0KHRoaXMuJC5pY29uLmdldFN2Z0RlZmluYWJsZUVsZW1lbnQoKSksbiYmaSYmbyYmeHF0KG8scixpLCExLHRoaXMuJC5pY29uLmdldFN2Z0RlZmluYWJsZUVsZW1lbnQoKSl9fTtQcXQudGVtcGxhdGU9X2VgCiAgICA8c3R5bGU+CiAgICAgIHRmLWdyYXBoLWljb24gewogICAgICAgIC0tdGItZ3JhcGgtZmFkZWQ6IHZhcigtLXRiLWdyYXBoLWZhZGVkKTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDx0Zi1ncmFwaC1pY29uCiAgICAgIGlkPSJpY29uIgogICAgICB0eXBlPSJbW19nZXRUeXBlKG5vZGUsIHN1bW1hcnksIGNvbnN0LCB0eXBlKV1dIgogICAgICBoZWlnaHQ9IltbaGVpZ2h0XV0iCiAgICAgIGZpbGwtb3ZlcnJpZGU9IltbX2ZpbGxPdmVycmlkZV1dIgogICAgICBzdHJva2Utb3ZlcnJpZGU9IltbX2dldFN0cm9rZU92ZXJyaWRlKF9maWxsT3ZlcnJpZGUpXV0iCiAgICAgIGZhZGVkPSJbW19nZXRGYWRlZChyZW5kZXJJbmZvKV1dIgogICAgICB2ZXJ0aWNhbD0iW1tfaXNWZXJ0aWNhbChub2RlLCB2ZXJ0aWNhbCldXSIKICAgID48L3RmLWdyYXBoLWljb24+CiAgYCx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxQcXQucHJvdG90eXBlLCJub2RlIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFBxdC5wcm90b3R5cGUsInJlbmRlckluZm8iLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sUHF0LnByb3RvdHlwZSwiY29sb3JCeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLFBxdC5wcm90b3R5cGUsInRlbXBsYXRlSW5kZXgiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sUHF0LnByb3RvdHlwZSwidHlwZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFBxdC5wcm90b3R5cGUsInZlcnRpY2FsIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sUHF0LnByb3RvdHlwZSwiY29uc3QiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxQcXQucHJvdG90eXBlLCJzdW1tYXJ5Iix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFBxdC5wcm90b3R5cGUsImZpbGwiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sUHF0LnByb3RvdHlwZSwiaGVpZ2h0Iix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUZpbGxPdmVycmlkZShub2RlLCByZW5kZXJJbmZvLCBjb2xvckJ5LCB0ZW1wbGF0ZUluZGV4LCBmaWxsKSIsb2JzZXJ2ZXI6Il9vbkZpbGxPdmVycmlkZUNoYW5nZWQifSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFBxdC5wcm90b3R5cGUsIl9maWxsT3ZlcnJpZGUiLHZvaWQgMCksUHF0PXQoW2koInRmLW5vZGUtaWNvbiIpXSxQcXQpO2xldCBOcXQ9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe19pdGVtVHlwZUNoYW5nZWQoKXsic3Vibm9kZSIhPT10aGlzLml0ZW1UeXBlP3RoaXMuJFsibGlzdC1pdGVtIl0uY2xhc3NMaXN0LmFkZCgiY2xpY2thYmxlIik6dGhpcy4kWyJsaXN0LWl0ZW0iXS5jbGFzc0xpc3QucmVtb3ZlKCJjbGlja2FibGUiKX1fbm9kZUxpc3RlbmVyKHQpe3RoaXMuZmlyZSgibm9kZS1saXN0LWl0ZW0tIit0LnR5cGUse25vZGVOYW1lOnRoaXMubmFtZSx0eXBlOnRoaXMuaXRlbVR5cGV9KX1fZmFkZWRDbGFzcyh0KXtyZXR1cm4gdCYmdC5pc0ZhZGVkT3V0PyJmYWRlZCI6IiJ9fTtmdW5jdGlvbiBJcXQodCxlLG4pe3JldHVybiBTZS5leHBvcnRzLnNvcnRCeSh0LFt0PT5lLm5vZGUodCkub3AsdD0+ZS5ub2RlKHQpLnRlbXBsYXRlSWQsdD0+ZS5uZWlnaGJvcnModCkubGVuZ3RoLHQ9PmUucHJlZGVjZXNzb3JzKHQpLmxlbmd0aCx0PT5lLnN1Y2Nlc3NvcnModCkubGVuZ3RoLHQ9PnQuc3Vic3RyKG4ubGVuZ3RoKV0pfWZ1bmN0aW9uIFJxdCh0LGUpe2lmKCEoZnVuY3Rpb24gbih0LGUpe2xldCBuPWxXdCh0KSxpPWxXdChlKTtmb3IobGV0IHQ9MDt0PG4ubGVuZ3RoO3QrKylpZihuW3RdIT09aVt0XSlyZXR1cm4hMTtyZXR1cm4hMH0pKHQsZSkpcmV0dXJuITE7bGV0IGk9dC5ncmFwaCgpLm5hbWUscj1lLmdyYXBoKCkubmFtZSxvPXt9LGE9e30scz1bXTtmdW5jdGlvbiBsKHQsZSl7bGV0IG49dC5zdWJzdHIoaS5sZW5ndGgpLGw9ZS5zdWJzdHIoci5sZW5ndGgpO3JldHVybiBvW25dXmFbbF0/KGNvbnNvbGUud2FybigiZGlmZmVyZW50IHZpc2l0IHBhdHRlcm4iLCJbIitpKyJdIixuLCJbIityKyJdIixsKSwhMCk6KG9bbl18fChvW25dPWFbbF09ITAscy5wdXNoKHtuMTp0LG4yOmV9KSksITEpfWxldCBjPXQuc291cmNlcygpLHU9ZS5zb3VyY2VzKCk7aWYoYy5sZW5ndGghPT11Lmxlbmd0aClyZXR1cm4gY29uc29sZS5sb2coImRpZmZlcmVudCBzb3VyY2UgbGVuZ3RoIiksITE7Yz1JcXQoYyx0LGkpLHU9SXF0KHUsZSxyKTtmb3IobGV0IHQ9MDt0PGMubGVuZ3RoO3QrKylpZihsKGNbdF0sdVt0XSkpcmV0dXJuITE7Zm9yKDtzLmxlbmd0aD4wOyl7bGV0IG49cy5wb3AoKTtpZighT3F0KHQubm9kZShuLm4xKSxlLm5vZGUobi5uMikpKXJldHVybiExO2xldCBvPXQuc3VjY2Vzc29ycyhuLm4xKSxhPWUuc3VjY2Vzc29ycyhuLm4yKTtpZihvLmxlbmd0aCE9PWEubGVuZ3RoKXJldHVybiBjb25zb2xlLmxvZygiIyBvZiBzdWNjZXNzb3JzIG1pc21hdGNoIixvLGEpLCExO289SXF0KG8sdCxpKSxhPUlxdChhLGUscik7Zm9yKGxldCB0PTA7dDxvLmxlbmd0aDt0KyspaWYobChvW3RdLGFbdF0pKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIE9xdCh0LGUpe2lmKHQudHlwZT09PWpHdC5NRVRBKXtsZXQgbj10LGk9ZTtyZXR1cm4gbi50ZW1wbGF0ZUlkJiZpLnRlbXBsYXRlSWQmJm4udGVtcGxhdGVJZD09PWkudGVtcGxhdGVJZH1pZih0LnR5cGU9PT1qR3QuT1AmJmUudHlwZT09PWpHdC5PUClyZXR1cm4gdC5vcD09PWUub3A7aWYodC50eXBlPT09akd0LlNFUklFUyYmZS50eXBlPT09akd0LlNFUklFUyl7bGV0IG49dCxpPWUscj1uLm1ldGFncmFwaC5ub2RlQ291bnQoKTtyZXR1cm4gcj09PWkubWV0YWdyYXBoLm5vZGVDb3VudCgpJiYoMD09PXJ8fG4ubWV0YWdyYXBoLm5vZGUobi5tZXRhZ3JhcGgubm9kZXMoKVswXSkub3A9PT1pLm1ldGFncmFwaC5ub2RlKGkubWV0YWdyYXBoLm5vZGVzKClbMF0pLm9wKX1yZXR1cm4hMX12YXIgenF0O05xdC50ZW1wbGF0ZT1fZWAKICAgIDxzdHlsZT4KICAgICAgI2xpc3QtaXRlbSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgY29sb3I6IHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKTsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICAjbGlzdC1pdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1nb29nbGUteWVsbG93LTEwMCk7CiAgICAgIH0KCiAgICAgIC5jbGlja2FibGUgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuIHsKICAgICAgICBtYXJnaW4tbGVmdDogNDBweDsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbS5leGNsdWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuLmVkZ2UtbGFiZWwgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDNweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgICAgfQoKICAgICAgLm5vZGUtaWNvbiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMXB4OwogICAgICAgIGxlZnQ6IDJweDsKICAgICAgfQoKICAgICAgLmZhZGVkIHNwYW4gewogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1ncmFwaC1mYWRlZCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdgogICAgICBpZD0ibGlzdC1pdGVtIgogICAgICBvbi1tb3VzZW92ZXI9Il9ub2RlTGlzdGVuZXIiCiAgICAgIG9uLW1vdXNlb3V0PSJfbm9kZUxpc3RlbmVyIgogICAgICBvbi1jbGljaz0iX25vZGVMaXN0ZW5lciIKICAgID4KICAgICAgPGRpdiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoaXRlbVJlbmRlckluZm8pfX0iPgogICAgICAgIDx0Zi1ub2RlLWljb24KICAgICAgICAgIGNsYXNzPSJub2RlLWljb24iCiAgICAgICAgICBoZWlnaHQ9IjEyIgogICAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgICAgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIKICAgICAgICAgIG5vZGU9IltbaXRlbU5vZGVdXSIKICAgICAgICAgIHJlbmRlci1pbmZvPSJbW2l0ZW1SZW5kZXJJbmZvXV0iCiAgICAgICAgICB0ZW1wbGF0ZS1pbmRleD0iW1t0ZW1wbGF0ZUluZGV4XV0iCiAgICAgICAgPgogICAgICAgIDwvdGYtbm9kZS1pY29uPgogICAgICAgIDxzcGFuIHRpdGxlJD0iW1tuYW1lXV0iPltbbmFtZV1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTnF0LnByb3RvdHlwZSwiY2FyZE5vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTnF0LnByb3RvdHlwZSwiaXRlbU5vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sTnF0LnByb3RvdHlwZSwiZWRnZUxhYmVsIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLE5xdC5wcm90b3R5cGUsIml0ZW1SZW5kZXJJbmZvIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLE5xdC5wcm90b3R5cGUsIm5hbWUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9pdGVtVHlwZUNoYW5nZWQifSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLE5xdC5wcm90b3R5cGUsIml0ZW1UeXBlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLE5xdC5wcm90b3R5cGUsImNvbG9yQnkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTnF0LnByb3RvdHlwZSwiY29sb3JCeVBhcmFtcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLE5xdC5wcm90b3R5cGUsInRlbXBsYXRlSW5kZXgiLHZvaWQgMCksTnF0PXQoW2koInRmLWdyYXBoLW9wLWNvbXBhdC1saXN0LWl0ZW0iKV0sTnF0KSwoZnVuY3Rpb24odCl7dFt0LlRFTVBMQVRFU19VUERBVEVEPTBdPSJURU1QTEFURVNfVVBEQVRFRCJ9KSh6cXR8fCh6cXQ9e30pKTtjbGFzcyBEcXQgZXh0ZW5kcyBjbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuZXZlbnRUeXBlVG9MaXN0ZW5lcnM9bmV3IE1hcH1nZXRMaXN0ZW5lcnModCl7cmV0dXJuIHRoaXMuZXZlbnRUeXBlVG9MaXN0ZW5lcnMuaGFzKHQpfHx0aGlzLmV2ZW50VHlwZVRvTGlzdGVuZXJzLnNldCh0LFtdKSx0aGlzLmV2ZW50VHlwZVRvTGlzdGVuZXJzLmdldCh0KX1hZGRMaXN0ZW5lcih0LGUpe3RoaXMuZ2V0TGlzdGVuZXJzKHQpLnB1c2goZSl9cmVtb3ZlTGlzdGVuZXIodCxlKXtjb25zdCBuPXRoaXMuZ2V0TGlzdGVuZXJzKHQpLmZpbHRlcigodD0+dCE9PWUpKTt0aGlzLmV2ZW50VHlwZVRvTGlzdGVuZXJzLnNldCh0LG4pfWRpc3BhdGNoRXZlbnQodCxlKXtmb3IoY29uc3QgbiBvZiB0aGlzLmdldExpc3RlbmVycyh0KSluKGUpfX17Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmhhc1NoYXBlSW5mbz0hMSx0aGlzLm1heE1ldGFFZGdlU2l6ZT0xLHRoaXMuZ3JhcGhPcHRpb25zPXt9LHRoaXMudGVtcGxhdGVzPW51bGwsdGhpcy5ncmFwaE9wdGlvbnMuY29tcG91bmQ9ITAsdGhpcy5ncmFwaE9wdGlvbnMucmFua2Rpcj10LnJhbmtEaXJlY3Rpb24sdGhpcy5yb290PSRHdChGR3QsdGhpcy5ncmFwaE9wdGlvbnMpLHRoaXMubGlicmFyeUZ1bmN0aW9ucz17fSx0aGlzLnNlcmllc0dyb3VwTWFwPW5ldyBNYXAodC5zZXJpZXNNYXApLHRoaXMuZGV2aWNlcz1udWxsLHRoaXMueGxhQ2x1c3RlcnM9bnVsbCx0aGlzLnZlcmlmeVRlbXBsYXRlPXQudmVyaWZ5VGVtcGxhdGUsdGhpcy5pbmRleD17fSx0aGlzLmluZGV4Ll9fcm9vdF9fPXRoaXMucm9vdCx0aGlzLm9yZGVyaW5ncz17fX1nZXRTZXJpZXNHcm91cFR5cGUodCl7dmFyIGU7cmV0dXJuIG51bGwhPT0oZT10aGlzLnNlcmllc0dyb3VwTWFwLmdldCh0KSkmJnZvaWQgMCE9PWU/ZTpXR3QuR1JPVVB9c2V0U2VyaWVzR3JvdXBUeXBlKHQsZSl7cmV0dXJuIHRoaXMuc2VyaWVzR3JvdXBNYXAuc2V0KHQsZSl9YnVpbGRTZXJpZXNHcm91cE1hcFRvZ2dsZWQodCl7Y29uc3QgZT10aGlzLmdldFNlcmllc0dyb3VwVHlwZSh0KT09PVdHdC5HUk9VUD9XR3QuVU5HUk9VUDpXR3QuR1JPVVA7cmV0dXJuIG5ldyBNYXAoWy4uLnRoaXMuc2VyaWVzR3JvdXBNYXAsW3QsZV1dKX1nZXROb2RlTWFwKCl7cmV0dXJuIHRoaXMuaW5kZXh9bm9kZSh0KXtyZXR1cm4gdGhpcy5pbmRleFt0XX1zZXROb2RlKHQsZSl7dGhpcy5pbmRleFt0XT1lfWdldEJyaWRnZWdyYXBoKHQpe2xldCBlPXRoaXMuaW5kZXhbdF07aWYoIWUpdGhyb3cgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIG5vZGUgaW4gaGllcmFyY2h5OiAiK3QpO2lmKCEoIm1ldGFncmFwaCJpbiBlKSlyZXR1cm4gbnVsbDtpZihlLmJyaWRnZWdyYXBoKXJldHVybiBlLmJyaWRnZWdyYXBoO2xldCBuPWUuYnJpZGdlZ3JhcGg9b1d0KCJCUklER0VHUkFQSCIsVUd0LkJSSURHRSx0aGlzLmdyYXBoT3B0aW9ucyk7aWYoIWUucGFyZW50Tm9kZXx8ISgibWV0YWdyYXBoImluIGUucGFyZW50Tm9kZSkpcmV0dXJuIG47bGV0IGk9ZS5wYXJlbnROb2RlLHI9aS5tZXRhZ3JhcGgsbz10aGlzLmdldEJyaWRnZWdyYXBoKGkubmFtZSk7cmV0dXJuIFNlLmV4cG9ydHMuZWFjaChbcixvXSwoZT0+e2UuZWRnZXMoKS5maWx0ZXIoKGU9PmUudj09PXR8fGUudz09PXQpKS5mb3JFYWNoKChpPT57bGV0IHI9aS53PT09dCxvPWUuZWRnZShpKTtTZS5leHBvcnRzLmVhY2goby5iYXNlRWRnZUxpc3QsKGU9PntsZXRbbyxhXT1yP1tlLncsaS52XTpbZS52LGkud10scz10aGlzLmdldENoaWxkTmFtZSh0LG8pLGw9e3Y6cj9hOnMsdzpyP3M6YX0sYz1uLmVkZ2UobCk7Y3x8KGM9Wkd0KGwudixsLncpLGMuaW5ib3VuZD1yLG4uc2V0RWRnZShsLnYsbC53LGMpKSxjLmFkZEJhc2VFZGdlKGUsdGhpcyl9KSl9KSl9KSksbn1nZXRDaGlsZE5hbWUodCxlKXtsZXQgbj10aGlzLmluZGV4W2VdO2Zvcig7bjspe2lmKG4ucGFyZW50Tm9kZSYmbi5wYXJlbnROb2RlLm5hbWU9PT10KXJldHVybiBuLm5hbWU7bj1uLnBhcmVudE5vZGV9dGhyb3cgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIGltbWVkaWF0ZSBjaGlsZCBmb3IgZGVzY2VuZGFudDogIitlKX1nZXRQcmVkZWNlc3NvcnModCl7bGV0IGU9dGhpcy5pbmRleFt0XTtpZighZSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSB3aXRoIG5hbWU6ICIrdCk7bGV0IG49dGhpcy5nZXRPbmVXYXlFZGdlcyhlLCEwKTtyZXR1cm4gZS5pc0dyb3VwTm9kZXx8U2UuZXhwb3J0cy5lYWNoKGUuaW5FbWJlZGRpbmdzLChpPT57U2UuZXhwb3J0cy5lYWNoKGUuaW5wdXRzLChlPT57aWYoZS5uYW1lPT09aS5uYW1lKXtsZXQgcj1uZXcgSkd0KGkubmFtZSx0KTtyLmFkZEJhc2VFZGdlKHtpc0NvbnRyb2xEZXBlbmRlbmN5OmUuaXNDb250cm9sRGVwZW5kZW5jeSxvdXRwdXRUZW5zb3JLZXk6ZS5vdXRwdXRUZW5zb3JLZXksaXNSZWZlcmVuY2VFZGdlOiExLHY6aS5uYW1lLHc6dH0sdGhpcyksbi5yZWd1bGFyLnB1c2gocil9fSkpfSkpLG59Z2V0U3VjY2Vzc29ycyh0KXtsZXQgZT10aGlzLmluZGV4W3RdO2lmKCFlKXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBub2RlIHdpdGggbmFtZTogIit0KTtsZXQgbj10aGlzLmdldE9uZVdheUVkZ2VzKGUsITEpO3JldHVybiBlLmlzR3JvdXBOb2RlfHxTZS5leHBvcnRzLmVhY2goZS5vdXRFbWJlZGRpbmdzLChlPT57U2UuZXhwb3J0cy5lYWNoKGUuaW5wdXRzLChpPT57aWYoaS5uYW1lPT09dCl7bGV0IHI9bmV3IEpHdCh0LGUubmFtZSk7ci5hZGRCYXNlRWRnZSh7aXNDb250cm9sRGVwZW5kZW5jeTppLmlzQ29udHJvbERlcGVuZGVuY3ksb3V0cHV0VGVuc29yS2V5Omkub3V0cHV0VGVuc29yS2V5LGlzUmVmZXJlbmNlRWRnZTohMSx2OnQsdzplLm5hbWV9LHRoaXMpLG4ucmVndWxhci5wdXNoKHIpfX0pKX0pKSxufWdldE9uZVdheUVkZ2VzKHQsZSl7bGV0IG49e2NvbnRyb2w6W10scmVndWxhcjpbXX07aWYoIXQucGFyZW50Tm9kZXx8IXQucGFyZW50Tm9kZS5pc0dyb3VwTm9kZSlyZXR1cm4gbjtsZXQgaT10LnBhcmVudE5vZGUscj1pLm1ldGFncmFwaCxvPXRoaXMuZ2V0QnJpZGdlZ3JhcGgoaS5uYW1lKTtyZXR1cm4gQnF0KHIsdCxlLG4pLEJxdChvLHQsZSxuKSxufWdldFRvcG9sb2dpY2FsT3JkZXJpbmcodCl7bGV0IGU9dGhpcy5pbmRleFt0XTtpZighZSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSB3aXRoIG5hbWU6ICIrdCk7aWYoIWUuaXNHcm91cE5vZGUpcmV0dXJuIG51bGw7aWYodCBpbiB0aGlzLm9yZGVyaW5ncylyZXR1cm4gdGhpcy5vcmRlcmluZ3NbdF07bGV0IG49e30saT17fSxyPWUubWV0YWdyYXBoO1NlLmV4cG9ydHMuZWFjaChyLmVkZ2VzKCksKHQ9PntyLmVkZ2UodCkubnVtUmVndWxhckVkZ2VzJiYodC52IGluIG58fChuW3Qudl09W10pLG5bdC52XS5wdXNoKHQudyksaVt0LnddPSEwKX0pKTtsZXQgbz1TZS5leHBvcnRzLmRpZmZlcmVuY2UoU2UuZXhwb3J0cy5rZXlzKG4pLFNlLmV4cG9ydHMua2V5cyhpKSksYT10aGlzLm9yZGVyaW5nc1t0XT17fSxzPTA7Zm9yKDtvLmxlbmd0aDspe2xldCB0PW8uc2hpZnQoKTthW3RdPXMrKyxTZS5leHBvcnRzLmVhY2goblt0XSwodD0+by5wdXNoKHQpKSksZGVsZXRlIG5bdF19cmV0dXJuIGF9Z2V0VGVtcGxhdGVJbmRleCgpe2lmKCF0aGlzLnRlbXBsYXRlcylyZXR1cm4gbnVsbDtsZXQgdD1MZyh0aGlzLnRlbXBsYXRlcyk7aWYoIXQubGVuZ3RoKXJldHVybiBudWxsO2xldCBlPUVNKCkuZG9tYWluKHQpLnJhbmdlKHpsKDAsdC5sZW5ndGgpKTtyZXR1cm4gdD0+ZSh0KX11cGRhdGVUZW1wbGF0ZXMoKXtDR3QoIkZpbmRpbmcgc2ltaWxhciBzdWJncmFwaHMiLCgoKT0+e3RoaXMudGVtcGxhdGVzPShmdW5jdGlvbiB0KGUsbil7bGV0IGk9KGZ1bmN0aW9uIG8odCxlKXtyZXR1cm4gU2UuZXhwb3J0cy5yZWR1Y2UodCwoZnVuY3Rpb24odCxuKXtsZXQgaT1uWzBdLHI9W107cmV0dXJuIG5bMV0ubm9kZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7Zm9yKGxldCBuPTA7bjxyLmxlbmd0aDtuKyspaWYoIWV8fFJxdChyW25dLm1ldGFub2RlLm1ldGFncmFwaCx0Lm1ldGFncmFwaCkpcmV0dXJuIHQudGVtcGxhdGVJZD1yW25dLm1ldGFub2RlLnRlbXBsYXRlSWQsdm9pZCByW25dLm1lbWJlcnMucHVzaCh0Lm5hbWUpO3QudGVtcGxhdGVJZD1pKyJbIityLmxlbmd0aCsiXSIsci5wdXNoKHttZXRhbm9kZTp0LG1lbWJlcnM6W3QubmFtZV19KX0pKSxyLmZvckVhY2goKGZ1bmN0aW9uKGUpe3RbZS5tZXRhbm9kZS50ZW1wbGF0ZUlkXT17bGV2ZWw6blsxXS5sZXZlbCxub2RlczplLm1lbWJlcnN9fSkpLHR9KSx7fSl9KSgoZnVuY3Rpb24gcih0KXtjb25zdCBlPXQuZ2V0Tm9kZU1hcCgpO2xldCBuPU9iamVjdC5rZXlzKGUpLnJlZHVjZSgoKHQsbik9Pntjb25zdCBpPWVbbl07aWYoaS50eXBlIT09akd0Lk1FVEEpcmV0dXJuIHQ7bGV0IHI9bi5zcGxpdCgiLyIpLmxlbmd0aC0xLG89KGZ1bmN0aW9uIGEodCl7cmV0dXJuIFNlLmV4cG9ydHMubWFwKHtkZXB0aDp0LmRlcHRoLCJ8VnwiOnQubWV0YWdyYXBoLm5vZGVzKCkubGVuZ3RoLCJ8RXwiOnQubWV0YWdyYXBoLmVkZ2VzKCkubGVuZ3RofSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZSsiPSIrdH0pKS5qb2luKCIgIikrIiBbb3BzXSAiK1NlLmV4cG9ydHMubWFwKHQub3BIaXN0b2dyYW0sKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUrIj0iK3R9KSkuam9pbigiLCIpfSkoaSkscz10W29dfHx7bm9kZXM6W10sbGV2ZWw6cn07cmV0dXJuIHRbb109cyxzLm5vZGVzLnB1c2goaSkscy5sZXZlbD5yJiYocy5sZXZlbD1yKSx0fSkse30pO3JldHVybiBPYmplY3Qua2V5cyhuKS5tYXAoKHQ9Plt0LG5bdF1dKSkuZmlsdGVyKCgoW3QsZV0pPT57Y29uc3R7bm9kZXM6bn09ZTtpZihuLmxlbmd0aD4xKXJldHVybiEwO2NvbnN0IGk9blswXTtyZXR1cm4gaS50eXBlPT09akd0Lk1FVEEmJmkuYXNzb2NpYXRlZEZ1bmN0aW9ufSkpLnNvcnQoKChbdCxlXSk9PmUubm9kZXNbMF0uZGVwdGgpKX0pKGUpLG4pO3JldHVybiBPYmplY3Qua2V5cyhpKS5zb3J0KCh0PT5pW3RdLmxldmVsKSkucmVkdWNlKCgodCxlKT0+KHRbZV09aVtlXSx0KSkse30pfSkodGhpcyx0aGlzLnZlcmlmeVRlbXBsYXRlKSx0aGlzLmRpc3BhdGNoRXZlbnQoenF0LlRFTVBMQVRFU19VUERBVEVEKX0pLF9HdC5ISUVSQVJDSFlfRklORF9TSU1JTEFSX1NVQkdSQVBIUyl9fWZ1bmN0aW9uIEJxdCh0LGUsbixpKXtsZXQgcj1uP3QuaW5FZGdlcyhlLm5hbWUpOnQub3V0RWRnZXMoZS5uYW1lKTtTZS5leHBvcnRzLmVhY2gociwoZT0+e2xldCBuPXQuZWRnZShlKTsobi5udW1SZWd1bGFyRWRnZXM/aS5yZWd1bGFyOmkuY29udHJvbCkucHVzaChuKX0pKX1jb25zdCBIcXQ9e3ZlcmlmeVRlbXBsYXRlOiEwLHNlcmllc05vZGVNaW5TaXplOjUsc2VyaWVzTWFwOm5ldyBNYXAscmFua0RpcmVjdGlvbjoiQlQiLHVzZUdlbmVyYWxpemVkU2VyaWVzUGF0dGVybnM6ITF9O2Z1bmN0aW9uIEZxdCh0LGUsbil7Y29uc3QgaT1uZXcgRHF0KGUpLHI9e307cmV0dXJuIExHdCgiQWRkaW5nIG5vZGVzIiwzMCwoKCk9PntsZXQgZT17fSxuPXt9O1NlLmV4cG9ydHMuZWFjaCh0Lm5vZGVzLCgodCxpKT0+e3QuZGV2aWNlJiYoZVt0LmRldmljZV09ITApLHQueGxhQ2x1c3RlciYmKG5bdC54bGFDbHVzdGVyXT0hMCl9KSksaS5kZXZpY2VzPVNlLmV4cG9ydHMua2V5cyhlKSxpLnhsYUNsdXN0ZXJzPVNlLmV4cG9ydHMua2V5cyhuKSwoZnVuY3Rpb24gcih0LGUpe2NvbnN0IG49e307U2UuZXhwb3J0cy5lYWNoKGUubm9kZXMsKChlLGkpPT57bGV0IHI9Y1d0KGUubmFtZSksbz10LnJvb3Q7by5kZXB0aD1NYXRoLm1heChyLmxlbmd0aCxvLmRlcHRoKSxuW2Uub3BdfHwobltlLm9wXT1bXSksbltlLm9wXS5wdXNoKGUpO2ZvcihsZXQgaT0wO2k8ci5sZW5ndGgmJihvLmRlcHRoPU1hdGgubWF4KG8uZGVwdGgsci5sZW5ndGgtaSksby5jYXJkaW5hbGl0eSs9ZS5jYXJkaW5hbGl0eSxvLm9wSGlzdG9ncmFtW2Uub3BdPShvLm9wSGlzdG9ncmFtW2Uub3BdfHwwKSsxLG51bGwhPWUuZGV2aWNlJiYoby5kZXZpY2VIaXN0b2dyYW1bZS5kZXZpY2VdPShvLmRldmljZUhpc3RvZ3JhbVtlLmRldmljZV18fDApKzEpLG51bGwhPWUueGxhQ2x1c3RlciYmKG8ueGxhQ2x1c3Rlckhpc3RvZ3JhbVtlLnhsYUNsdXN0ZXJdPShvLnhsYUNsdXN0ZXJIaXN0b2dyYW1bZS54bGFDbHVzdGVyXXx8MCkrMSksZS5jb21wYXRpYmxlP28uY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShvLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpvLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShvLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxLFNlLmV4cG9ydHMuZWFjaChlLmluRW1iZWRkaW5ncywodD0+e3QuY29tcGF0aWJsZT9vLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0oby5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6by5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0oby5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMX0pKSxTZS5leHBvcnRzLmVhY2goZS5vdXRFbWJlZGRpbmdzLCh0PT57dC5jb21wYXRpYmxlP28uY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShvLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpvLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShvLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxfSkpLGkhPT1yLmxlbmd0aC0xKTtpKyspe2xldCBlPXJbaV0sYT10Lm5vZGUoZSk7aWYoIWEmJihhPSRHdChlLHQuZ3JhcGhPcHRpb25zKSxhLnBhcmVudE5vZGU9byx0LnNldE5vZGUoZSxhKSxvLm1ldGFncmFwaC5zZXROb2RlKGUsYSksMD09PWUuaW5kZXhPZihWR3QpJiZvLm5hbWU9PT1GR3QpKXtjb25zdCBpPWUuc3Vic3RyaW5nKFZHdC5sZW5ndGgpO25baV18fChuW2ldPVtdKSx0LmxpYnJhcnlGdW5jdGlvbnNbaV09e25vZGU6YSx1c2FnZXM6bltpXX0sYS5hc3NvY2lhdGVkRnVuY3Rpb249aX1vPWF9dC5zZXROb2RlKGUubmFtZSxlKSxlLnBhcmVudE5vZGU9byxvLm1ldGFncmFwaC5zZXROb2RlKGUubmFtZSxlKSxTZS5leHBvcnRzLmVhY2goZS5pbkVtYmVkZGluZ3MsKGZ1bmN0aW9uKG4pe3Quc2V0Tm9kZShuLm5hbWUsbiksbi5wYXJlbnROb2RlPWV9KSksU2UuZXhwb3J0cy5lYWNoKGUub3V0RW1iZWRkaW5ncywoZnVuY3Rpb24obil7dC5zZXROb2RlKG4ubmFtZSxuKSxuLnBhcmVudE5vZGU9ZX0pKX0pKX0pKGksdCl9KSxuLF9HdC5ISUVSQVJDSFlfQUREX05PREVTKS50aGVuKCgoKT0+TEd0KCJEZXRlY3Qgc2VyaWVzIiwzMCwoKCk9PntlLnNlcmllc05vZGVNaW5TaXplPjAmJlZxdChpLnJvb3QsaSxyLGUuc2VyaWVzTm9kZU1pblNpemUsZS5zZXJpZXNNYXAsZS51c2VHZW5lcmFsaXplZFNlcmllc1BhdHRlcm5zKX0pLG4sX0d0LkhJRVJBUkNIWV9ERVRFQ1RfU0VSSUVTKSkpLnRoZW4oKCgpPT5MR3QoIkFkZGluZyBlZGdlcyIsNDAsKCgpPT57IShmdW5jdGlvbiBlKHQsbixpKXtsZXQgcj10LmdldE5vZGVNYXAoKSxvPVtdLGE9W10scz0odCxlKT0+e2xldCBuPTA7Zm9yKDt0OyllW24rK109dC5uYW1lLHQ9dC5wYXJlbnROb2RlO3JldHVybiBuLTF9O1NlLmV4cG9ydHMuZWFjaChuLmVkZ2VzLChlPT57bGV0IGk9cyhuLm5vZGVzW2Uudl0sbyksbD1zKG4ubm9kZXNbZS53XSxhKTtpZigtMT09PWl8fC0xPT09bClyZXR1cm47Zm9yKDtvW2ldPT09YVtsXTspaWYoaS0tLGwtLSxpPDB8fGw8MCl0aHJvdyBFcnJvcigiTm8gZGlmZmVyZW5jZSBmb3VuZCBiZXR3ZWVuIGFuY2VzdG9yIHBhdGhzLiIpO2xldCBjPXJbb1tpKzFdXSx1PW9baV0saD1hW2xdLGQ9Yy5tZXRhZ3JhcGguZWRnZSh1LGgpO2R8fChkPVpHdCh1LGgpLGMubWV0YWdyYXBoLnNldEVkZ2UodSxoLGQpKSxjLmhhc05vbkNvbnRyb2xFZGdlc3x8ZS5pc0NvbnRyb2xEZXBlbmRlbmN5fHwoYy5oYXNOb25Db250cm9sRWRnZXM9ITApLGQuYWRkQmFzZUVkZ2UoZSx0KX0pKX0pKGksdCl9KSxuLF9HdC5ISUVSQVJDSFlfQUREX0VER0VTKSkpLnRoZW4oKCgpPT5pKSl9ZnVuY3Rpb24gVnF0KHQsZSxuLGkscixvKXtsZXQgYT10Lm1ldGFncmFwaDtTZS5leHBvcnRzLmVhY2goYS5ub2RlcygpLCh0PT57bGV0IHM9YS5ub2RlKHQpO3MudHlwZT09PWpHdC5NRVRBJiZWcXQocyxlLG4saSxyLG8pfSkpO2xldCBzPShmdW5jdGlvbiBsKHQpe3JldHVybiBTZS5leHBvcnRzLnJlZHVjZSh0Lm5vZGVzKCksKChlLG4pPT57bGV0IGk9dC5ub2RlKG4pO2lmKGkudHlwZT09PWpHdC5NRVRBKXJldHVybiBlO2xldCByPWkub3A7cmV0dXJuIHImJihlW3JdPWVbcl18fFtdLGVbcl0ucHVzaChpLm5hbWUpKSxlfSkse30pfSkoYSksYz0obz9qcXQ6VXF0KShzLGEsZS5ncmFwaE9wdGlvbnMpO1NlLmV4cG9ydHMuZWFjaChjLChmdW5jdGlvbih0LHIpe2xldCBvPXQubWV0YWdyYXBoLm5vZGVzKCk7U2UuZXhwb3J0cy5lYWNoKG8sKHQ9PntsZXQgZT1hLm5vZGUodCk7ZS5vd25pbmdTZXJpZXN8fChlLm93bmluZ1Nlcmllcz1yKX0pKSxvLmxlbmd0aDxpJiZlLmdldFNlcmllc0dyb3VwVHlwZSh0Lm5hbWUpPT09V0d0LkdST1VQJiZlLnNldFNlcmllc0dyb3VwVHlwZSh0Lm5hbWUsV0d0LlVOR1JPVVApLGUuZ2V0U2VyaWVzR3JvdXBUeXBlKHQubmFtZSkhPT1XR3QuVU5HUk9VUCYmKGUuc2V0Tm9kZShyLHQpLGEuc2V0Tm9kZShyLHQpLFNlLmV4cG9ydHMuZWFjaChvLChlPT57bGV0IGk9YS5ub2RlKGUpO3QubWV0YWdyYXBoLnNldE5vZGUoZSxpKSx0LnBhcmVudE5vZGU9aS5wYXJlbnROb2RlLHQuY2FyZGluYWxpdHkrKyxudWxsIT1pLmRldmljZSYmKHQuZGV2aWNlSGlzdG9ncmFtW2kuZGV2aWNlXT0odC5kZXZpY2VIaXN0b2dyYW1baS5kZXZpY2VdfHwwKSsxKSxudWxsIT1pLnhsYUNsdXN0ZXImJih0LnhsYUNsdXN0ZXJIaXN0b2dyYW1baS54bGFDbHVzdGVyXT0odC54bGFDbHVzdGVySGlzdG9ncmFtW2kueGxhQ2x1c3Rlcl18fDApKzEpLGkuY29tcGF0aWJsZT90LmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0odC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6dC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0odC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMSxTZS5leHBvcnRzLmVhY2goaS5pbkVtYmVkZGluZ3MsKGU9PntlLmNvbXBhdGlibGU/dC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KHQuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOnQuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9KHQuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGV8fDApKzF9KSksU2UuZXhwb3J0cy5lYWNoKGkub3V0RW1iZWRkaW5ncywoZT0+e2UuY29tcGF0aWJsZT90LmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0odC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6dC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0odC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMX0pKSxpLnBhcmVudE5vZGU9dCxuW2VdPXIsYS5yZW1vdmVOb2RlKGUpfSkpKX0pKX1mdW5jdGlvbiBVcXQodCxlLG4pe2xldCBpPXt9O3JldHVybiBTZS5leHBvcnRzLmVhY2godCwoZnVuY3Rpb24odCxyKXtpZih0Lmxlbmd0aDw9MSlyZXR1cm47bGV0IG89e307U2UuZXhwb3J0cy5lYWNoKHQsKGZ1bmN0aW9uKHQpe2NvbnN0IGU9IioiPT09dC5jaGFyQXQodC5sZW5ndGgtMSksaT10LnNwbGl0KCIvIikscj1pW2kubGVuZ3RoLTFdLGE9aS5zbGljZSgwLGkubGVuZ3RoLTEpLmpvaW4oIi8iKSxzPXIubWF0Y2goL14oXEQqKShcZCspJC8pO2xldCBsLGMsdT0iIjtzPyhsPXNbMV0sYz1zWzJdKToobD1lP3Iuc3Vic3RyKDAsci5sZW5ndGgtMSk6cixjPTAsdT1lPyIqIjoiIik7Y29uc3QgaD10V3QobCx1LGEpO29baF09b1toXXx8W107Y29uc3QgZD1RR3QobCx1LGEsK2MsdCxuKTtvW2hdLnB1c2goZCl9KSksU2UuZXhwb3J0cy5lYWNoKG8sKGZ1bmN0aW9uKHQsbyl7aWYodC5sZW5ndGg8MilyZXR1cm47dC5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybit0LmNsdXN0ZXJJZC0rZS5jbHVzdGVySWR9KSk7bGV0IGE9W3RbMF1dO2ZvcihsZXQgbz0xO288dC5sZW5ndGg7bysrKXtsZXQgcz10W29dO3MuY2x1c3RlcklkIT09YVthLmxlbmd0aC0xXS5jbHVzdGVySWQrMT8oR3F0KGEsaSwrcixlLG4pLGE9W3NdKTphLnB1c2gocyl9R3F0KGEsaSwrcixlLG4pfSkpfSkpLGl9ZnVuY3Rpb24ganF0KHQsZSxuKXtsZXQgaT17fTtyZXR1cm4gU2UuZXhwb3J0cy5lYWNoKHQsKGZ1bmN0aW9uKHQscil7aWYodC5sZW5ndGg8PTEpcmV0dXJuO2xldCBvPXt9LGE9e307U2UuZXhwb3J0cy5lYWNoKHQsKGZ1bmN0aW9uKHQpe2xldCBlPSIqIj09PXQuY2hhckF0KHQubGVuZ3RoLTEpLGk9dC5zcGxpdCgiLyIpLHI9aVtpLmxlbmd0aC0xXSxzPWkuc2xpY2UoMCxpLmxlbmd0aC0xKS5qb2luKCIvIik7Y29uc3QgbD0vKFxkKykvZztsZXQgYyx1LGgsZCxwLGY9MDtmb3IoO2M9bC5leGVjKHIpOykrK2YsdT1yLnNsaWNlKDAsYy5pbmRleCksaD1jWzBdLGQ9ci5zbGljZShjLmluZGV4K2NbMF0ubGVuZ3RoKSxwPXRXdCh1LGQscyksb1twXT1vW3BdLG9bcF18fChvW3BdPVFHdCh1LGQscywraCx0LG4pKSxvW3BdLmlkcy5wdXNoKGgpLGFbdF09YVt0XXx8W10sYVt0XS5wdXNoKFtwLGhdKTtmPDEmJih1PWU/ci5zdWJzdHIoMCxyLmxlbmd0aC0xKTpyLGg9MCxkPWU/IioiOiIiLHA9dFd0KHUsZCxzKSxvW3BdPW9bcF0sb1twXXx8KG9bcF09UUd0KHUsZCxzLCtoLHQsbikpLG9bcF0uaWRzLnB1c2goaCksYVt0XT1hW3RdfHxbXSxhW3RdLnB1c2goW3AsaF0pKX0pKTt2YXIgcz17fTtTZS5leHBvcnRzLmVhY2goYSwoZnVuY3Rpb24odCxlKXt0LnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG9bZVswXV0uaWRzLmxlbmd0aC1vW3RbMF1dLmlkcy5sZW5ndGh9KSk7dmFyIGk9dFswXVswXSxyPXRbMF1bMV07c1tpXT1zW2ldfHxbXTtjb25zdCBhPWUuc3BsaXQoIi8iKSxsPWEuc2xpY2UoMCxhLmxlbmd0aC0xKS5qb2luKCIvIik7dmFyIGM9UUd0KG9baV0ucHJlZml4LG9baV0uc3VmZml4LGwsK3IsZSxuKTtzW2ldLnB1c2goYyl9KSksU2UuZXhwb3J0cy5lYWNoKHMsKGZ1bmN0aW9uKHQsbyl7aWYodC5sZW5ndGg8MilyZXR1cm47dC5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybit0LmNsdXN0ZXJJZC0rZS5jbHVzdGVySWR9KSk7bGV0IGE9W3RbMF1dO2ZvcihsZXQgbz0xO288dC5sZW5ndGg7bysrKXtsZXQgcz10W29dO3MuY2x1c3RlcklkIT09YVthLmxlbmd0aC0xXS5jbHVzdGVySWQrMT8oR3F0KGEsaSwrcixlLG4pLGE9W3NdKTphLnB1c2gocyl9R3F0KGEsaSwrcixlLG4pfSkpfSkpLGl9ZnVuY3Rpb24gR3F0KHQsZSxuLGkscil7aWYodC5sZW5ndGg+MSl7bGV0IG89dFd0KHRbMF0ucHJlZml4LHRbMF0uc3VmZml4LHRbMF0ucGFyZW50LHRbMF0uY2x1c3RlcklkLHRbdC5sZW5ndGgtMV0uY2x1c3RlcklkKSxhPVFHdCh0WzBdLnByZWZpeCx0WzBdLnN1ZmZpeCx0WzBdLnBhcmVudCxuLG8scik7U2UuZXhwb3J0cy5lYWNoKHQsKGZ1bmN0aW9uKHQpe2EuaWRzLnB1c2godC5jbHVzdGVySWQpLGEubWV0YWdyYXBoLnNldE5vZGUodC5uYW1lLGkubm9kZSh0Lm5hbWUpKX0pKSxlW29dPWF9fWxldCBXcXQ9Y2xhc3MgZXh0ZW5kcyhlcihpbCh5ZSkpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fZXhwYW5kZWQ9ITAsdGhpcy5fb3BDb21wYXRDb2xvcj1oV3QsdGhpcy5fb3BJbmNvbXBhdENvbG9yPWRXdCx0aGlzLl90ZW1wbGF0ZUluZGV4PW51bGx9X2dldE5vZGUodCxlKXtyZXR1cm4gZS5ub2RlKHQpfV9nZXRSZW5kZXJJbmZvKHQsZSl7cmV0dXJuIHRoaXMucmVuZGVySGllcmFyY2h5LmdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZSh0KX1fdG9nZ2xlRXhwYW5kZWQoKXt0aGlzLl9leHBhbmRlZD0hdGhpcy5fZXhwYW5kZWR9X2dldFRvZ2dsZUljb24odCl7cmV0dXJuIHQ/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifV9yZXNpemVMaXN0KHQpe3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCk7ZSYmZS5maXJlKCJpcm9uLXJlc2l6ZSIpfWdldCBfaW5jb21wYXRpYmxlT3BOb2Rlcygpe2NvbnN0IHQ9dGhpcy5ncmFwaEhpZXJhcmNoeTtyZXR1cm4gdCYmdC5yb290Pyh0aGlzLmFzeW5jKHRoaXMuX3Jlc2l6ZUxpc3QuYmluZCh0aGlzLCIjaW5jb21wYXRpYmxlT3BzTGlzdCIpKSwoZnVuY3Rpb24gZSh0KXtjb25zdCBlPVtdLG49e307cmV0dXJuIFNlLmV4cG9ydHMuZWFjaCh0LnJvb3QubGVhdmVzKCksKGk9PntsZXQgcj10Lm5vZGUoaSk7aWYoci50eXBlPT1qR3QuT1Ape2xldCBpPXI7aWYoIWkuY29tcGF0aWJsZSlpZihpLm93bmluZ1Nlcmllcyl7aWYodC5nZXRTZXJpZXNHcm91cFR5cGUoaS5vd25pbmdTZXJpZXMpPT09V0d0LlVOR1JPVVApZS5wdXNoKGkpO2Vsc2UgaWYoIW5baS5vd25pbmdTZXJpZXNdKXtsZXQgcj10Lm5vZGUoaS5vd25pbmdTZXJpZXMpO3ImJihuW2kub3duaW5nU2VyaWVzXT1yLGUucHVzaChyKSl9fWVsc2UgZS5wdXNoKGkpO1NlLmV4cG9ydHMuZWFjaChpLmluRW1iZWRkaW5ncywodD0+e3QuY29tcGF0aWJsZXx8ZS5wdXNoKHQpfSkpLFNlLmV4cG9ydHMuZWFjaChpLm91dEVtYmVkZGluZ3MsKHQ9Pnt0LmNvbXBhdGlibGV8fGUucHVzaCh0KX0pKX19KSksZX0pKHQpKTpbXX1nZXQgX29wQ29tcGF0U2NvcmUoKXt2YXIgdD10aGlzLmdyYXBoSGllcmFyY2h5O2lmKHQmJnQucm9vdCl7dmFyIGU9dC5yb290LG49ZS5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGUsaT1lLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlO3JldHVybiAwPT1uJiYwPT1pPzA6TWF0aC5mbG9vcigxMDAqbi8obitpKSkvMTAwfXJldHVybiAwfWdldCBfb3BDb21wYXRTY29yZUxhYmVsKCl7dmFyIHQ9dGhpcy5fb3BDb21wYXRTY29yZTtyZXR1cm4gbXkoIi4wJSIpKHQpfWdldCBfdG90YWxJbmNvbXBhdE9wcygpe3ZhciB0PXRoaXMuZ3JhcGhIaWVyYXJjaHk7cmV0dXJuIHQmJnQucm9vdD90LnJvb3QuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU6MH1fZ3JhcGhIaWVyYXJjaHlDaGFuZ2VkKCl7dGhpcy5fdGVtcGxhdGVJbmRleD10aGlzLmdyYXBoSGllcmFyY2h5LmdldFRlbXBsYXRlSW5kZXgoKSx0aGlzLmdyYXBoSGllcmFyY2h5LmFkZExpc3RlbmVyKHpxdC5URU1QTEFURVNfVVBEQVRFRCwoKCk9Pnt0aGlzLl90ZW1wbGF0ZUluZGV4PXRoaXMuZ3JhcGhIaWVyYXJjaHkuZ2V0VGVtcGxhdGVJbmRleCgpfSkpfX07V3F0LnRlbXBsYXRlPV9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgbWF4LWhlaWdodDogNTAwcHg7CiAgICAgIH0KCiAgICAgIC5pbmNvbXBhdGlibGUtb3BzLWxpc3QgewogICAgICAgIGhlaWdodDogMzUwcHg7CiAgICAgICAgbWF4LWhlaWdodDogNDAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgaXJvbi1saXN0IHsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfQoKICAgICAgcGFwZXItaXRlbSB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1zZWNvbmRhcnktYmFja2dyb3VuZC1jb2xvcik7CiAgICAgIH0KCiAgICAgIHBhcGVyLWl0ZW0tYm9keVt0d28tbGluZV0gewogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHggNHB4OwogICAgICB9CgogICAgICAuZXhwYW5kZWRJbmZvIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLm5vZGUtbmFtZSB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgZm9udC1zaXplOiAxNHB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC5zdWJ0aXRsZSB7CiAgICAgICAgY29sb3I6IHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKTsKICAgICAgICBmb250LXNpemU6IDEycHQ7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgbWF4LWhlaWdodDogMjBweDsKICAgICAgICBtYXgtd2lkdGg6IDIwcHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLm5vbi1jb250cm9sLWxpc3QtaXRlbSB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAxMHB4OwogICAgICB9CgogICAgICBkaXYub3AtY29tcGF0LWRpc3BsYXkgewogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2FkbHksIGJlY2F1c2UgdGhlIHdob2xlIGJvZHkgaXMgaW52ZXJ0ZWQgaW4gY29sb3IsIGxlZ2VuZHMgYWxzbyBuZWVkCiAgICAgICAqIHRvIGJlIGludmVydGVkLgogICAgICAgKiovCiAgICAgIDpob3N0KC5kYXJrLW1vZGUpIGRpdi5vcC1jb21wYXQtZGlzcGxheSB7CiAgICAgICAgZmlsdGVyOiBpbnZlcnQoMSk7CiAgICAgIH0KCiAgICAgIHN2Zy5vcC1jb21wYXQgewogICAgICAgIHdpZHRoOiAyNTBweDsKICAgICAgICBoZWlnaHQ6IDI1cHg7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KCiAgICAgIGRpdi5vcC1jb21wYXQtdmFsdWUgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGNvbG9yOiBibGFjazsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaXRlbT4KICAgICAgPHBhcGVyLWl0ZW0tYm9keSB0d28tbGluZT4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgICAgIGljb249Int7X2dldFRvZ2dsZUljb24oX2V4cGFuZGVkKX19IgogICAgICAgICAgICBvbi1jbGljaz0iX3RvZ2dsZUV4cGFuZGVkIgogICAgICAgICAgICBjbGFzcz0idG9nZ2xlLWJ1dHRvbiIKICAgICAgICAgID4KICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJub2RlLW5hbWUiIGlkPSJub2RldGl0bGUiPltbbm9kZVRpdGxlXV08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHNlY29uZGFyeT4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1YnRpdGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3AtY29tcGF0LWRpc3BsYXkiPgogICAgICAgICAgICAgIDxzdmcKICAgICAgICAgICAgICAgIGNsYXNzPSJvcC1jb21wYXQiCiAgICAgICAgICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pZCBtZWV0IgogICAgICAgICAgICAgICAgdmlld0JveD0iMCAwIDI1MCAyNSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8ZGVmcz4KICAgICAgICAgICAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJvcC1jb21wYXQtZmlsbCI+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yJD0iW1tfb3BDb21wYXRDb2xvcl1dIj48L3N0b3A+CiAgICAgICAgICAgICAgICAgICAgPHN0b3AKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCQ9IltbX29wQ29tcGF0U2NvcmVdXSIKICAgICAgICAgICAgICAgICAgICAgIHN0b3AtY29sb3IkPSJbW19vcENvbXBhdENvbG9yXV0iCiAgICAgICAgICAgICAgICAgICAgPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgICA8c3RvcAogICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0JD0iW1tfb3BDb21wYXRTY29yZV1dIgogICAgICAgICAgICAgICAgICAgICAgc3RvcC1jb2xvciQ9IltbX29wSW5jb21wYXRDb2xvcl1dIgogICAgICAgICAgICAgICAgICAgID48L3N0b3A+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yJD0iW1tfb3BJbmNvbXBhdENvbG9yIF1dIj48L3N0b3A+CiAgICAgICAgICAgICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgICAgICAgICA8L2RlZnM+CiAgICAgICAgICAgICAgICA8cmVjdAogICAgICAgICAgICAgICAgICBoZWlnaHQ9IjI1IgogICAgICAgICAgICAgICAgICB3aWR0aD0iMjUwIgogICAgICAgICAgICAgICAgICByeD0iNSIKICAgICAgICAgICAgICAgICAgcnk9IjUiCiAgICAgICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiB1cmwoJyNvcC1jb21wYXQtZmlsbCcpOyIKICAgICAgICAgICAgICAgID48L3JlY3Q+CiAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3AtY29tcGF0LXZhbHVlIj5bW19vcENvbXBhdFNjb3JlTGFiZWxdXTwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3BhcGVyLWl0ZW0tYm9keT4KICAgIDwvcGFwZXItaXRlbT4KCiAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9Int7X2V4cGFuZGVkfX0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2V4cGFuZGVkfX0iIHJlc3RhbXA9InRydWUiPgogICAgICAgIDxkaXYgY2xhc3M9ImV4cGFuZGVkSW5mbyI+CiAgICAgICAgICBJbmNvbXBhdGlibGUgT3BlcmF0aW9uczogKDxzcGFuPltbX3RvdGFsSW5jb21wYXRPcHNdXTwvc3Bhbj4pCiAgICAgICAgICA8aXJvbi1saXN0CiAgICAgICAgICAgIGNsYXNzPSJpbmNvbXBhdGlibGUtb3BzLWxpc3QiCiAgICAgICAgICAgIGlkPSJpbmNvbXBhdGlibGVPcHNMaXN0IgogICAgICAgICAgICBpdGVtcz0iW1tfaW5jb21wYXRpYmxlT3BOb2Rlc11dIgogICAgICAgICAgPgogICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLW9wLWNvbXBhdC1saXN0LWl0ZW0KICAgICAgICAgICAgICAgIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iCiAgICAgICAgICAgICAgICBpdGVtLW5vZGU9IltbaXRlbV1dIgogICAgICAgICAgICAgICAgaXRlbS1yZW5kZXItaW5mbz0iW1tfZ2V0UmVuZGVySW5mbyhpdGVtLm5hbWUsIHJlbmRlckhpZXJhcmNoeSldXSIKICAgICAgICAgICAgICAgIG5hbWU9IltbaXRlbS5uYW1lXV0iCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIgogICAgICAgICAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgICAgICAgICAgaXRlbS10eXBlPSJpbmNvbXBhdGlibGUtb3BzIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICA8L3RmLWdyYXBoLW9wLWNvbXBhdC1saXN0LWl0ZW0+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvaXJvbi1jb2xsYXBzZT4KICBgLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLERxdCldLFdxdC5wcm90b3R5cGUsImdyYXBoSGllcmFyY2h5Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLHlXdCldLFdxdC5wcm90b3R5cGUsInJlbmRlckhpZXJhcmNoeSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxXcXQucHJvdG90eXBlLCJub2RlVGl0bGUiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxXcXQucHJvdG90eXBlLCJfZXhwYW5kZWQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sV3F0LnByb3RvdHlwZSwiX29wQ29tcGF0Q29sb3IiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sV3F0LnByb3RvdHlwZSwiX29wSW5jb21wYXRDb2xvciIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLFdxdC5wcm90b3R5cGUsIl90ZW1wbGF0ZUluZGV4Iix2b2lkIDApLHQoW3MoImdyYXBoSGllcmFyY2h5IiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxXcXQucHJvdG90eXBlLCJfaW5jb21wYXRpYmxlT3BOb2RlcyIsbnVsbCksdChbcygiZ3JhcGhIaWVyYXJjaHkiKSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxXcXQucHJvdG90eXBlLCJfb3BDb21wYXRTY29yZSIsbnVsbCksdChbcygiX29wQ29tcGF0U2NvcmUiKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxXcXQucHJvdG90eXBlLCJfb3BDb21wYXRTY29yZUxhYmVsIixudWxsKSx0KFtzKCJncmFwaEhpZXJhcmNoeSIpLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLFdxdC5wcm90b3R5cGUsIl90b3RhbEluY29tcGF0T3BzIixudWxsKSx0KFthKCJncmFwaEhpZXJhcmNoeSIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sV3F0LnByb3RvdHlwZSwiX2dyYXBoSGllcmFyY2h5Q2hhbmdlZCIsbnVsbCksV3F0PXQoW2koInRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIildLFdxdCk7bGV0IHFxdD1jbGFzcyBleHRlbmRzKGVyKGlsKHllKSkpe19pdGVtVHlwZUNoYW5nZWQoKXsic3Vibm9kZSIhPT10aGlzLml0ZW1UeXBlP3RoaXMuJFsibGlzdC1pdGVtIl0uY2xhc3NMaXN0LmFkZCgiY2xpY2thYmxlIik6dGhpcy4kWyJsaXN0LWl0ZW0iXS5jbGFzc0xpc3QucmVtb3ZlKCJjbGlja2FibGUiKX1fbm9kZUxpc3RlbmVyKHQpe3RoaXMuZmlyZSgibm9kZS1saXN0LWl0ZW0tIit0LnR5cGUse2NhcmROb2RlOnRoaXMuY2FyZE5vZGUubmFtZSxub2RlTmFtZTp0aGlzLm5hbWUsdHlwZTp0aGlzLml0ZW1UeXBlfSl9X2ZhZGVkQ2xhc3ModCl7cmV0dXJuIHQmJnQuaXNGYWRlZE91dD8iZmFkZWQiOiIifX07cXF0LnRlbXBsYXRlPV9lYAogICAgPHN0eWxlPgogICAgICAjbGlzdC1pdGVtIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBjb2xvcjogdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpOwogICAgICAgIGZvbnQtc2l6ZTogMTFwdDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW06aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWdvb2dsZS15ZWxsb3ctMTAwKTsKICAgICAgfQoKICAgICAgOmhvc3QoLmRhcmstbW9kZSkgI2xpc3QtaXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXIteWVsbG93LTkwMCk7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgIC5jbGlja2FibGUgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuIHsKICAgICAgICBtYXJnaW4tbGVmdDogNDBweDsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbS5leGNsdWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuLmVkZ2UtbGFiZWwgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDNweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgICAgfQoKICAgICAgLm5vZGUtaWNvbiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMXB4OwogICAgICAgIGxlZnQ6IDJweDsKICAgICAgfQoKICAgICAgLmZhZGVkIHNwYW4gewogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1ncmFwaC1mYWRlZCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2CiAgICAgIGlkPSJsaXN0LWl0ZW0iCiAgICAgIG9uLW1vdXNlb3Zlcj0iX25vZGVMaXN0ZW5lciIKICAgICAgb24tbW91c2VvdXQ9Il9ub2RlTGlzdGVuZXIiCiAgICAgIG9uLWNsaWNrPSJfbm9kZUxpc3RlbmVyIgogICAgPgogICAgICA8ZGl2IGNsYXNzJD0ie3tfZmFkZWRDbGFzcyhpdGVtUmVuZGVySW5mbyl9fSI+CiAgICAgICAgPHRmLW5vZGUtaWNvbgogICAgICAgICAgY2xhc3M9Im5vZGUtaWNvbiIKICAgICAgICAgIGhlaWdodD0iMTIiCiAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgICBjb2xvci1ieS1wYXJhbXM9IltbY29sb3JCeVBhcmFtc11dIgogICAgICAgICAgbm9kZT0iW1tpdGVtTm9kZV1dIgogICAgICAgICAgcmVuZGVyLWluZm89IltbaXRlbVJlbmRlckluZm9dXSIKICAgICAgICAgIHRlbXBsYXRlLWluZGV4PSJbW3RlbXBsYXRlSW5kZXhdXSIKICAgICAgICA+PC90Zi1ub2RlLWljb24+CiAgICAgICAgPHNwYW4gdGl0bGUkPSJbW25hbWVdXSI+W1tuYW1lXV08L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9ImVkZ2UtbGFiZWwiPltbZWRnZUxhYmVsXV08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgYCx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxxcXQucHJvdG90eXBlLCJjYXJkTm9kZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxxcXQucHJvdG90eXBlLCJpdGVtTm9kZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxxcXQucHJvdG90eXBlLCJlZGdlTGFiZWwiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0scXF0LnByb3RvdHlwZSwiaXRlbVJlbmRlckluZm8iLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0scXF0LnByb3RvdHlwZSwibmFtZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX2l0ZW1UeXBlQ2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0scXF0LnByb3RvdHlwZSwiaXRlbVR5cGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0scXF0LnByb3RvdHlwZSwiY29sb3JCeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxxcXQucHJvdG90eXBlLCJjb2xvckJ5UGFyYW1zIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHFxdC5wcm90b3R5cGUsInRlbXBsYXRlSW5kZXgiLHZvaWQgMCkscXF0PXQoW2koInRmLW5vZGUtbGlzdC1pdGVtIildLHFxdCk7bGV0IFlxdD1jbGFzcyBleHRlbmRzKGVyKHllKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX2V4cGFuZGVkPSEwLHRoaXMuX29wZW5lZENvbnRyb2xQcmVkPSExLHRoaXMuX29wZW5lZENvbnRyb2xTdWNjPSExLHRoaXMuX3RlbXBsYXRlSW5kZXg9bnVsbH1leHBhbmROb2RlKCl7dGhpcy5maXJlKCJfbm9kZS5leHBhbmQiLHRoaXMubm9kZSl9X2dldE5vZGUodCxlKXtyZXR1cm4gZS5ub2RlKHQpfV9nZXROb2RlU3RhdHModCxlKXt2YXIgbj10aGlzLl9nZXROb2RlKHQsZSk7cmV0dXJuIG4/bi5zdGF0czpudWxsfV9nZXRUb3RhbE1pY3Jvcyh0KXtyZXR1cm4gdD90LmdldFRvdGFsTWljcm9zKCk6MH1nZXQgX2hhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzKCl7cmV0dXJuIE9HdCh0aGlzLl9ub2RlU3RhdHMpfWdldCBfbm9kZVN0YXRzRm9ybWF0dGVkQnl0ZXMoKXt2YXIgdD10aGlzLl9ub2RlU3RhdHM7aWYodCYmdC50b3RhbEJ5dGVzKXJldHVybiBSR3QodC50b3RhbEJ5dGVzLE5HdCl9Z2V0IF9ub2RlU3RhdHNGb3JtYXR0ZWRDb21wdXRlVGltZSgpe3ZhciB0PXRoaXMuX25vZGVTdGF0cztpZih0JiZ0LmdldFRvdGFsTWljcm9zKCkpcmV0dXJuIFJHdCh0LmdldFRvdGFsTWljcm9zKCksSUd0KX1nZXQgX25vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzKCl7dmFyIHQ9dGhpcy5fbm9kZVN0YXRzO2lmKHQmJnQub3V0cHV0U2l6ZSYmdC5vdXRwdXRTaXplLmxlbmd0aClyZXR1cm4gU2UuZXhwb3J0cy5tYXAodC5vdXRwdXRTaXplLChmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQubGVuZ3RoPyJzY2FsYXIiOiJbIit0LmpvaW4oIiwgIikrIl0ifSkpfV9nZXRSZW5kZXJJbmZvKHQsZSl7cmV0dXJuIHRoaXMucmVuZGVySGllcmFyY2h5LmdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZSh0KX1nZXQgX2F0dHJpYnV0ZXMoKXt2YXIgdD10aGlzLl9ub2RlO2lmKHRoaXMuYXN5bmModGhpcy5fcmVzaXplTGlzdC5iaW5kKHRoaXMsIiNhdHRyaWJ1dGVzTGlzdCIpKSwhdHx8IXQuYXR0cilyZXR1cm5bXTt2YXIgZT1bXTtyZXR1cm4gU2UuZXhwb3J0cy5lYWNoKHQuYXR0ciwoZnVuY3Rpb24odCl7Il90b29fbGFyZ2VfYXR0cnMiPT09dC5rZXk/ZT1lLmNvbmNhdCh0LnZhbHVlLmxpc3Qucy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybntrZXk6dCx2YWx1ZToiVG9vIGxhcmdlIHRvIHNob3cuLi4ifX0pKSk6ZS5wdXNoKHtrZXk6dC5rZXksdmFsdWU6SlNPTi5zdHJpbmdpZnkodC52YWx1ZSl9KX0pKSxlfWdldCBfZGV2aWNlKCl7dmFyIHQ9dGhpcy5fbm9kZTtyZXR1cm4gdD90LmRldmljZTpudWxsfWdldCBfc3VjY2Vzc29ycygpe3ZhciB0PXRoaXMuX25vZGUsZT10aGlzLmdyYXBoSGllcmFyY2h5O3JldHVybiB0aGlzLl9yZWZyZXNoTm9kZUl0ZW1MaXN0KCJpbnB1dHNMaXN0IiksdD90aGlzLl9jb252ZXJ0RWRnZUxpc3RUb0VkZ2VJbmZvTGlzdChlLmdldFN1Y2Nlc3NvcnModC5uYW1lKSwhMSx0LmlzR3JvdXBOb2RlKTp7cmVndWxhcjpbXSxjb250cm9sOltdfX1nZXQgX3ByZWRlY2Vzc29ycygpe3ZhciB0PXRoaXMuX25vZGUsZT10aGlzLmdyYXBoSGllcmFyY2h5O3JldHVybiB0aGlzLl9yZWZyZXNoTm9kZUl0ZW1MaXN0KCJvdXRwdXRzTGlzdCIpLHQ/dGhpcy5fY29udmVydEVkZ2VMaXN0VG9FZGdlSW5mb0xpc3QoZS5nZXRQcmVkZWNlc3NvcnModC5uYW1lKSwhMCx0LmlzR3JvdXBOb2RlKTp7cmVndWxhcjpbXSxjb250cm9sOltdfX1nZXQgX2Z1bmN0aW9uVXNhZ2VzKCl7dmFyIHQ9dGhpcy5fbm9kZSxlPXRoaXMuZ3JhcGhIaWVyYXJjaHk7aWYodGhpcy5fcmVmcmVzaE5vZGVJdGVtTGlzdCgiZnVuY3Rpb25Vc2FnZXNMaXN0IiksIXR8fHQudHlwZSE9PWpHdC5NRVRBKXJldHVybltdO2NvbnN0IG49ZS5saWJyYXJ5RnVuY3Rpb25zW3QuYXNzb2NpYXRlZEZ1bmN0aW9uXTtyZXR1cm4gbj9uLnVzYWdlczpbXX1fcmVmcmVzaE5vZGVJdGVtTGlzdCh0KXt0aGlzLmFzeW5jKHRoaXMuX3Jlc2l6ZUxpc3QuYmluZCh0aGlzLGAjJHt0fWApKX1fY29udmVydEVkZ2VMaXN0VG9FZGdlSW5mb0xpc3QodCxlLG4pe3ZhciBpPXQ9PlNlLmV4cG9ydHMubWFwKHQuYmFzZUVkZ2VMaXN0LCh0PT57dmFyIG49ZT90LnY6dC53O3JldHVybntuYW1lOm4sbm9kZTp0aGlzLl9nZXROb2RlKG4sdGhpcy5ncmFwaEhpZXJhcmNoeSksZWRnZUxhYmVsOnRxdCh0LHRoaXMucmVuZGVySGllcmFyY2h5KSxyZW5kZXJJbmZvOnRoaXMuX2dldFJlbmRlckluZm8obix0aGlzLnJlbmRlckhpZXJhcmNoeSl9fSkpLHI9ZnVuY3Rpb24odCl7dmFyIHI9W107cmV0dXJuIFNlLmV4cG9ydHMuZWFjaCh0LCh0PT57dmFyIG89ZT90LnY6dC53O24mJjEhPXQuYmFzZUVkZ2VMaXN0Lmxlbmd0aD9yLnB1c2goe25hbWU6byxub2RlOnRoaXMuX2dldE5vZGUobyx0aGlzLmdyYXBoSGllcmFyY2h5KSxlZGdlTGFiZWw6ZXF0KHQsdGhpcy5yZW5kZXJIaWVyYXJjaHkpLHJlbmRlckluZm86dGhpcy5fZ2V0UmVuZGVySW5mbyhvLHRoaXMucmVuZGVySGllcmFyY2h5KX0pOnI9ci5jb25jYXQoaSh0KSl9KSkscn0uYmluZCh0aGlzKTtyZXR1cm57cmVndWxhcjpyKHQucmVndWxhciksY29udHJvbDpyKHQuY29udHJvbCl9fWdldCBfc3Vibm9kZXMoKXt2YXIgdD10aGlzLl9ub2RlO3JldHVybiB0JiZ0Lm1ldGFncmFwaD90Lm1ldGFncmFwaC5ub2RlcygpOm51bGx9Z2V0IF90b3RhbFByZWRlY2Vzc29ycygpe3ZhciB0PXRoaXMuX3ByZWRlY2Vzc29ycztyZXR1cm4gdC5yZWd1bGFyLmxlbmd0aCt0LmNvbnRyb2wubGVuZ3RofWdldCBfdG90YWxTdWNjZXNzb3JzKCl7dmFyIHQ9dGhpcy5fc3VjY2Vzc29ycztyZXR1cm4gdC5yZWd1bGFyLmxlbmd0aCt0LmNvbnRyb2wubGVuZ3RofV90b2dnbGVDb250cm9sUHJlZCgpe3RoaXMuX29wZW5lZENvbnRyb2xQcmVkPSF0aGlzLl9vcGVuZWRDb250cm9sUHJlZH1fdG9nZ2xlQ29udHJvbFN1Y2MoKXt0aGlzLl9vcGVuZWRDb250cm9sU3VjYz0hdGhpcy5fb3BlbmVkQ29udHJvbFN1Y2N9X3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5fZXhwYW5kZWQ9IXRoaXMuX2V4cGFuZGVkfV9nZXRUb2dnbGVJY29uKHQpe3JldHVybiB0PyJleHBhbmQtbGVzcyI6ImV4cGFuZC1tb3JlIn1fcmVzZXRTdGF0ZSgpe3RoaXMuX29wZW5lZENvbnRyb2xQcmVkPSExLHRoaXMuX29wZW5lZENvbnRyb2xTdWNjPSExLHRoaXMuc2V0KCJfZ3JvdXBCdXR0b25UZXh0IixwcXQodGhpcy5fbm9kZSkpfV9yZXNpemVMaXN0KHQpe3ZhciBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCk7ZSYmZS5maXJlKCJpcm9uLXJlc2l6ZSIpfV90b2dnbGVJbmNsdWRlKCl7dGhpcy5maXJlKCJub2RlLXRvZ2dsZS1pbmNsdXNpb24iLHtuYW1lOnRoaXMuZ3JhcGhOb2RlTmFtZX0pfV9ub2RlSW5jbHVkZVN0YXRlQ2hhbmdlZCh0LGUpe3RoaXMuc2V0KCJfYXV4QnV0dG9uVGV4dCIsdVd0KHQpKX1fdG9nZ2xlR3JvdXAoKXt2YXIgdD1kcXQodGhpcy5fbm9kZSk7dGhpcy5maXJlKCJub2RlLXRvZ2dsZS1zZXJpZXNncm91cCIse25hbWU6dH0pfV9pc0xpYnJhcnlGdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5uYW1lLnN0YXJ0c1dpdGgoVkd0KX1faXNJblNlcmllcyh0KXtyZXR1cm4gaHF0KHQpfV9ncmFwaEhpZXJhcmNoeUNoYW5nZWQoKXt0aGlzLl90ZW1wbGF0ZUluZGV4PXRoaXMuZ3JhcGhIaWVyYXJjaHkuZ2V0VGVtcGxhdGVJbmRleCgpLHRoaXMuZ3JhcGhIaWVyYXJjaHkuYWRkTGlzdGVuZXIoenF0LlRFTVBMQVRFU19VUERBVEVELCgoKT0+e3RoaXMuX3RlbXBsYXRlSW5kZXg9dGhpcy5ncmFwaEhpZXJhcmNoeS5nZXRUZW1wbGF0ZUluZGV4KCl9KSl9fTtZcXQudGVtcGxhdGU9X2VgCiAgICA8c3R5bGU+CiAgICAgIC5zdWItbGlzdC1ncm91cCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBmb250LXNpemU6IDEycHQ7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDhweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0IHsKICAgICAgICBtYXgtaGVpZ2h0OiAzMDBweDsKICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7CiAgICAgIH0KCiAgICAgIC5hdHRyLWxlZnQgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIHdpZHRoOiAzMCU7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIGNvbG9yOiB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcik7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KCiAgICAgIC5hdHRyLXJpZ2h0IHsKICAgICAgICBtYXJnaW4tbGVmdDogMzAlOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBjb2xvcjogdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpOwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZSB7CiAgICAgICAgZGlzcGxheTogdGFibGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZS1yb3cgewogICAgICAgIGRpc3BsYXk6IHRhYmxlLXJvdzsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0LXRhYmxlLXJvdyAuc3ViLWxpc3QtdGFibGUtY2VsbDpsYXN0LWNoaWxkIHsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0LXRhYmxlLWNlbGwgewogICAgICAgIGNvbG9yOiB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcik7CiAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbDsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBtYXgtd2lkdGg6IDIwMHB4OwogICAgICAgIHBhZGRpbmc6IDAgNHB4OwogICAgICB9CgogICAgICBwYXBlci1pdGVtIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvcik7CiAgICAgIH0KCiAgICAgIHBhcGVyLWl0ZW0tYm9keVt0d28tbGluZV0gewogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHggNHB4OwogICAgICB9CgogICAgICAuZXhwYW5kZWRJbmZvIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgfQoKICAgICAgLmNvbnRyb2xEZXBzIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCA4cHg7CiAgICAgIH0KCiAgICAgIC5ub2RlLW5hbWUgewogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIGZvbnQtc2l6ZTogMTRwdDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICB9CgogICAgICAubm9kZS1pY29uIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KCiAgICAgIC5zdWJ0aXRsZSB7CiAgICAgICAgY29sb3I6IHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKTsKICAgICAgICBmb250LXNpemU6IDEycHQ7CiAgICAgIH0KCiAgICAgIC5jb250cm9sTGluZSB7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgbWF4LWhlaWdodDogMjBweDsKICAgICAgICBtYXgtd2lkdGg6IDIwcHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLmNvbnRyb2wtdG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgbWF4LWhlaWdodDogMjBweDsKICAgICAgICBtYXgtd2lkdGg6IDIwcHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1pbmNsdWRlLWdyb3VwIHsKICAgICAgICBwYWRkaW5nLXRvcDogNHB4OwogICAgICB9CgogICAgICAudG9nZ2xlLWluY2x1ZGUgewogICAgICAgIG1hcmdpbjogNXB4IDZweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICBwYWRkaW5nOiA0cHggNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhOwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAudG9nZ2xlLWluY2x1ZGU6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWdvb2dsZS15ZWxsb3ctMTAwKTsKICAgICAgfQoKICAgICAgLm5vbi1jb250cm9sLWxpc3QtaXRlbSB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHBhcGVyLWl0ZW0+CiAgICAgIDxwYXBlci1pdGVtLWJvZHkgdHdvLWxpbmU+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgICAgICBpY29uPSJ7e19nZXRUb2dnbGVJY29uKF9leHBhbmRlZCl9fSIKICAgICAgICAgICAgb24tY2xpY2s9Il90b2dnbGVFeHBhbmRlZCIKICAgICAgICAgICAgY2xhc3M9InRvZ2dsZS1idXR0b24iCiAgICAgICAgICA+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm9kZS1uYW1lIj4KICAgICAgICAgICAgPHRmLXdici1zdHJpbmcgdmFsdWU9IltbX25vZGUubmFtZV1dIiBkZWxpbWl0ZXItcGF0dGVybj0iLyI+CiAgICAgICAgICAgIDwvdGYtd2JyLXN0cmluZz4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgc2Vjb25kYXJ5PgogICAgICAgICAgPHRmLW5vZGUtaWNvbgogICAgICAgICAgICBjbGFzcz0ibm9kZS1pY29uIgogICAgICAgICAgICBub2RlPSJbW19ub2RlXV0iCiAgICAgICAgICAgIHJlbmRlci1pbmZvPSJbW19nZXRSZW5kZXJJbmZvKGdyYXBoTm9kZU5hbWUsIHJlbmRlckhpZXJhcmNoeSldXSIKICAgICAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgICAgICB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIgogICAgICAgICAgPjwvdGYtbm9kZS1pY29uPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19ub2RlLm9wfX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWJ0aXRsZSI+CiAgICAgICAgICAgICAgT3BlcmF0aW9uOgogICAgICAgICAgICAgIDxzcGFuPltbX25vZGUub3BdXTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19ub2RlLm1ldGFncmFwaH19Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3VidGl0bGUiPgogICAgICAgICAgICAgIFN1YmdyYXBoOgogICAgICAgICAgICAgIDxzcGFuPltbX25vZGUuY2FyZGluYWxpdHldXTwvc3Bhbj4gbm9kZXMKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3BhcGVyLWl0ZW0tYm9keT4KICAgIDwvcGFwZXItaXRlbT4KICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0ie3tfZXhwYW5kZWR9fSI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfZXhwYW5kZWR9fSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZXhwYW5kZWRJbmZvIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIGF0dHJpYnV0ZXMiPgogICAgICAgICAgICBBdHRyaWJ1dGVzICg8c3Bhbj5bW19hdHRyaWJ1dGVzLmxlbmd0aF1dPC9zcGFuPikKICAgICAgICAgICAgPGlyb24tbGlzdAogICAgICAgICAgICAgIGNsYXNzPSJzdWItbGlzdCIKICAgICAgICAgICAgICBpZD0iYXR0cmlidXRlc0xpc3QiCiAgICAgICAgICAgICAgaXRlbXM9IltbX2F0dHJpYnV0ZXNdXSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF0dHItbGVmdCI+W1tpdGVtLmtleV1dPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF0dHItcmlnaHQiPltbaXRlbS52YWx1ZV1dPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfZGV2aWNlfX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC1ncm91cCBkZXZpY2UiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF0dHItbGVmdCI+RGV2aWNlPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYXR0ci1yaWdodCI+W1tfZGV2aWNlXV08L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIHByZWRlY2Vzc29ycyI+CiAgICAgICAgICAgIElucHV0cyAoPHNwYW4+W1tfdG90YWxQcmVkZWNlc3NvcnNdXTwvc3Bhbj4pCiAgICAgICAgICAgIDxpcm9uLWxpc3QKICAgICAgICAgICAgICBjbGFzcz0ic3ViLWxpc3QiCiAgICAgICAgICAgICAgaWQ9ImlucHV0c0xpc3QiCiAgICAgICAgICAgICAgaXRlbXM9IltbX3ByZWRlY2Vzc29ycy5yZWd1bGFyXV0iCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtbm9kZS1saXN0LWl0ZW0KICAgICAgICAgICAgICAgICAgY2xhc3M9Im5vbi1jb250cm9sLWxpc3QtaXRlbSIKICAgICAgICAgICAgICAgICAgY2FyZC1ub2RlPSJbW19ub2RlXV0iCiAgICAgICAgICAgICAgICAgIGl0ZW0tbm9kZT0iW1tpdGVtLm5vZGVdXSIKICAgICAgICAgICAgICAgICAgZWRnZS1sYWJlbD0iW1tpdGVtLmVkZ2VMYWJlbF1dIgogICAgICAgICAgICAgICAgICBpdGVtLXJlbmRlci1pbmZvPSJbW2l0ZW0ucmVuZGVySW5mb11dIgogICAgICAgICAgICAgICAgICBuYW1lPSJbW2l0ZW0ubmFtZV1dIgogICAgICAgICAgICAgICAgICBpdGVtLXR5cGU9InByZWRlY2Vzc29ycyIKICAgICAgICAgICAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPC90Zi1ub2RlLWxpc3QtaXRlbT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19wcmVkZWNlc3NvcnMuY29udHJvbC5sZW5ndGhdXSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbERlcHMiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbExpbmUiPgogICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICAgICAgICAgICAgICBpY29uPSJ7e19nZXRUb2dnbGVJY29uKF9vcGVuZWRDb250cm9sUHJlZCl9fSIKICAgICAgICAgICAgICAgICAgICBvbi1jbGljaz0iX3RvZ2dsZUNvbnRyb2xQcmVkIgogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJjb250cm9sLXRvZ2dsZS1idXR0b24iCiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgQ29udHJvbCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19vcGVuZWRDb250cm9sUHJlZH19IiBuby1hbmltYXRpb24+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgICAgICAgICAgIGlzPSJkb20taWYiCiAgICAgICAgICAgICAgICAgICAgaWY9Int7X29wZW5lZENvbnRyb2xQcmVkfX0iCiAgICAgICAgICAgICAgICAgICAgcmVzdGFtcD0idHJ1ZSIKICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgIDxpcm9uLWxpc3QKICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJzdWItbGlzdCIKICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zPSJbW19wcmVkZWNlc3NvcnMuY29udHJvbF1dIgogICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC1ub2RlPSJbW19ub2RlXV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS1ub2RlPSJbW2l0ZW0ubm9kZV1dIgogICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iW1tpdGVtLm5hbWVdXSIKICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLXR5cGU9InByZWRlY2Vzc29ycyIKICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSIKICAgICAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIHN1Y2Nlc3NvcnMiPgogICAgICAgICAgICBPdXRwdXRzICg8c3Bhbj5bW190b3RhbFN1Y2Nlc3NvcnNdXTwvc3Bhbj4pCiAgICAgICAgICAgIDxpcm9uLWxpc3QKICAgICAgICAgICAgICBjbGFzcz0ic3ViLWxpc3QiCiAgICAgICAgICAgICAgaWQ9Im91dHB1dHNMaXN0IgogICAgICAgICAgICAgIGl0ZW1zPSJbW19zdWNjZXNzb3JzLnJlZ3VsYXJdXSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1ub2RlLWxpc3QtaXRlbQogICAgICAgICAgICAgICAgICBjbGFzcz0ibm9uLWNvbnRyb2wtbGlzdC1pdGVtIgogICAgICAgICAgICAgICAgICBjYXJkLW5vZGU9IltbX25vZGVdXSIKICAgICAgICAgICAgICAgICAgaXRlbS1ub2RlPSJbW2l0ZW0ubm9kZV1dIgogICAgICAgICAgICAgICAgICBlZGdlLWxhYmVsPSJbW2l0ZW0uZWRnZUxhYmVsXV0iCiAgICAgICAgICAgICAgICAgIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iCiAgICAgICAgICAgICAgICAgIG5hbWU9IltbaXRlbS5uYW1lXV0iCiAgICAgICAgICAgICAgICAgIGl0ZW0tdHlwZT0ic3VjY2Vzc29yIgogICAgICAgICAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvaXJvbi1saXN0PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3N1Y2Nlc3NvcnMuY29udHJvbC5sZW5ndGhdXSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbERlcHMiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbExpbmUiPgogICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICAgICAgICAgICAgICBpY29uPSJ7e19nZXRUb2dnbGVJY29uKF9vcGVuZWRDb250cm9sU3VjYyl9fSIKICAgICAgICAgICAgICAgICAgICBvbi1jbGljaz0iX3RvZ2dsZUNvbnRyb2xTdWNjIgogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJjb250cm9sLXRvZ2dsZS1idXR0b24iCiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgQ29udHJvbCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19vcGVuZWRDb250cm9sU3VjY319IiBuby1hbmltYXRpb24+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgICAgICAgICAgIGlzPSJkb20taWYiCiAgICAgICAgICAgICAgICAgICAgaWY9Int7X29wZW5lZENvbnRyb2xTdWNjfX0iCiAgICAgICAgICAgICAgICAgICAgcmVzdGFtcD0idHJ1ZSIKICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgIDxpcm9uLWxpc3QgY2xhc3M9InN1Yi1saXN0IiBpdGVtcz0iW1tfc3VjY2Vzc29ycy5jb250cm9sXV0iPgogICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICA8dGYtbm9kZS1saXN0LWl0ZW0KICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLW5vZGU9IltbX25vZGVdXSIKICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS1yZW5kZXItaW5mbz0iW1tpdGVtLnJlbmRlckluZm9dXSIKICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJbW2l0ZW0ubmFtZV1dIgogICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tdHlwZT0ic3VjY2Vzc29ycyIKICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSIKICAgICAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19oYXNEaXNwbGF5YWJsZU5vZGVTdGF0c319Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgbm9kZS1zdGF0cyI+CiAgICAgICAgICAgICAgTm9kZSBTdGF0cwogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlIj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfbm9kZVN0YXRzLnRvdGFsQnl0ZXN9fSI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLXJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtY2VsbCI+TWVtb3J5PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICBbW19ub2RlU3RhdHNGb3JtYXR0ZWRCeXRlc11dCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfZ2V0VG90YWxNaWNyb3MoX25vZGVTdGF0cyl9fSI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLXJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtY2VsbCI+Q29tcHV0ZSBUaW1lPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICBbW19ub2RlU3RhdHNGb3JtYXR0ZWRDb21wdXRlVGltZV1dCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfbm9kZVN0YXRzLm91dHB1dFNpemV9fSI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLXJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtY2VsbCI+VGVuc29yIE91dHB1dCBTaXplczwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPgogICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIGlzPSJkb20tcmVwZWF0IgogICAgICAgICAgICAgICAgICAgICAgICBpdGVtcz0ie3tfbm9kZVN0YXRzRm9ybWF0dGVkT3V0cHV0U2l6ZXN9fSIKICAgICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgICAgW1tpdGVtXV0gPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2Z1bmN0aW9uVXNhZ2VzLmxlbmd0aF1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgcHJlZGVjZXNzb3JzIj4KICAgICAgICAgICAgICBVc2FnZXMgb2YgdGhlIEZ1bmN0aW9uICg8c3Bhbj5bW19mdW5jdGlvblVzYWdlcy5sZW5ndGhdXTwvc3Bhbj4pCiAgICAgICAgICAgICAgPGlyb24tbGlzdAogICAgICAgICAgICAgICAgY2xhc3M9InN1Yi1saXN0IgogICAgICAgICAgICAgICAgaWQ9ImZ1bmN0aW9uVXNhZ2VzTGlzdCIKICAgICAgICAgICAgICAgIGl0ZW1zPSJbW19mdW5jdGlvblVzYWdlc11dIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtCiAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im5vbi1jb250cm9sLWxpc3QtaXRlbSIKICAgICAgICAgICAgICAgICAgICBjYXJkLW5vZGU9IltbX25vZGVdXSIKICAgICAgICAgICAgICAgICAgICBpdGVtLW5vZGU9IltbaXRlbV1dIgogICAgICAgICAgICAgICAgICAgIG5hbWU9IltbaXRlbS5uYW1lXV0iCiAgICAgICAgICAgICAgICAgICAgaXRlbS10eXBlPSJmdW5jdGlvblVzYWdlcyIKICAgICAgICAgICAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSIKICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzTGlicmFyeUZ1bmN0aW9uKF9ub2RlKV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9nZ2xlLWluY2x1ZGUtZ3JvdXAiPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24KICAgICAgICAgICAgICAgIHJhaXNlZAogICAgICAgICAgICAgICAgY2xhc3M9InRvZ2dsZS1pbmNsdWRlIgogICAgICAgICAgICAgICAgb24tY2xpY2s9Il90b2dnbGVJbmNsdWRlIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxzcGFuPltbX2F1eEJ1dHRvblRleHRdXTwvc3Bhbj4KICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfaXNJblNlcmllcyhfbm9kZSl9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1pbmNsdWRlLWdyb3VwIj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgICByYWlzZWQKICAgICAgICAgICAgICAgIGNsYXNzPSJ0b2dnbGUtaW5jbHVkZSIKICAgICAgICAgICAgICAgIG9uLWNsaWNrPSJfdG9nZ2xlR3JvdXAiCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPHNwYW4+W1tfZ3JvdXBCdXR0b25UZXh0XV08L3NwYW4+CiAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvaXJvbi1jb2xsYXBzZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFlxdC5wcm90b3R5cGUsImdyYXBoTm9kZU5hbWUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRHF0KV0sWXF0LnByb3RvdHlwZSwiZ3JhcGhIaWVyYXJjaHkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sWXF0LnByb3RvdHlwZSwicmVuZGVySGllcmFyY2h5Iix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFlxdC5wcm90b3R5cGUsImNvbG9yQnkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9nZXROb2RlKGdyYXBoTm9kZU5hbWUsIGdyYXBoSGllcmFyY2h5KSIsb2JzZXJ2ZXI6Il9yZXNldFN0YXRlIn0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxZcXQucHJvdG90eXBlLCJfbm9kZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldE5vZGVTdGF0cyhncmFwaE5vZGVOYW1lLCBncmFwaEhpZXJhcmNoeSkiLG9ic2VydmVyOiJfcmVzZXRTdGF0ZSJ9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sWXF0LnByb3RvdHlwZSwiX25vZGVTdGF0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcixvYnNlcnZlcjoiX25vZGVJbmNsdWRlU3RhdGVDaGFuZ2VkIn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxZcXQucHJvdG90eXBlLCJub2RlSW5jbHVkZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFlxdC5wcm90b3R5cGUsIl9leHBhbmRlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFlxdC5wcm90b3R5cGUsIl9vcGVuZWRDb250cm9sUHJlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFlxdC5wcm90b3R5cGUsIl9vcGVuZWRDb250cm9sU3VjYyIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxZcXQucHJvdG90eXBlLCJfYXV4QnV0dG9uVGV4dCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxZcXQucHJvdG90eXBlLCJfZ3JvdXBCdXR0b25UZXh0Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKV0sWXF0LnByb3RvdHlwZSwiX3RlbXBsYXRlSW5kZXgiLHZvaWQgMCksdChbcygiX25vZGVTdGF0cyIpLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxZcXQucHJvdG90eXBlLCJfaGFzRGlzcGxheWFibGVOb2RlU3RhdHMiLG51bGwpLHQoW3MoIl9ub2RlU3RhdHMiKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxZcXQucHJvdG90eXBlLCJfbm9kZVN0YXRzRm9ybWF0dGVkQnl0ZXMiLG51bGwpLHQoW3MoIl9ub2RlU3RhdHMiKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxZcXQucHJvdG90eXBlLCJfbm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWUiLG51bGwpLHQoW3MoIl9ub2RlU3RhdHMiKSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLFlxdC5wcm90b3R5cGUsIl9ub2RlU3RhdHNGb3JtYXR0ZWRPdXRwdXRTaXplcyIsbnVsbCksdChbcygiX25vZGUiKSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLFlxdC5wcm90b3R5cGUsIl9hdHRyaWJ1dGVzIixudWxsKSx0KFtzKCJfbm9kZSIpLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLFlxdC5wcm90b3R5cGUsIl9kZXZpY2UiLG51bGwpLHQoW3MoIl9ub2RlIiwiZ3JhcGhIaWVyYXJjaHkiKSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxZcXQucHJvdG90eXBlLCJfc3VjY2Vzc29ycyIsbnVsbCksdChbcygiX25vZGUiLCJncmFwaEhpZXJhcmNoeSIpLGUoImRlc2lnbjp0eXBlIixPYmplY3QpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLFlxdC5wcm90b3R5cGUsIl9wcmVkZWNlc3NvcnMiLG51bGwpLHQoW3MoIl9ub2RlIiwiZ3JhcGhIaWVyYXJjaHkiKSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLFlxdC5wcm90b3R5cGUsIl9mdW5jdGlvblVzYWdlcyIsbnVsbCksdChbcygiX25vZGUiKSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLFlxdC5wcm90b3R5cGUsIl9zdWJub2RlcyIsbnVsbCksdChbcygiX3ByZWRlY2Vzc29ycyIpLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLFlxdC5wcm90b3R5cGUsIl90b3RhbFByZWRlY2Vzc29ycyIsbnVsbCksdChbcygiX3N1Y2Nlc3NvcnMiKSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxZcXQucHJvdG90eXBlLCJfdG90YWxTdWNjZXNzb3JzIixudWxsKSx0KFthKCJncmFwaEhpZXJhcmNoeSIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sWXF0LnByb3RvdHlwZSwiX2dyYXBoSGllcmFyY2h5Q2hhbmdlZCIsbnVsbCksWXF0PXQoW2koInRmLW5vZGUtaW5mbyIpXSxZcXQpO2xldCBYcXQ9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe3JlYWR5KCl7c3VwZXIucmVhZHkoKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoIm5vZGUtbGlzdC1pdGVtLWNsaWNrIix0aGlzLl9ub2RlTGlzdEl0ZW1DbGlja2VkLmJpbmQodGhpcykpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigibm9kZS1saXN0LWl0ZW0tbW91c2VvdmVyIix0aGlzLl9ub2RlTGlzdEl0ZW1Nb3VzZW92ZXIuYmluZCh0aGlzKSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJub2RlLWxpc3QtaXRlbS1tb3VzZW91dCIsdGhpcy5fbm9kZUxpc3RJdGVtTW91c2VvdXQuYmluZCh0aGlzKSl9X25vZGVMaXN0SXRlbUNsaWNrZWQodCl7dGhpcy5zZWxlY3RlZE5vZGU9dC5kZXRhaWwubm9kZU5hbWV9X25vZGVMaXN0SXRlbU1vdXNlb3Zlcih0KXt0aGlzLmhpZ2hsaWdodGVkTm9kZT10LmRldGFpbC5ub2RlTmFtZX1fbm9kZUxpc3RJdGVtTW91c2VvdXQoKXt0aGlzLmhpZ2hsaWdodGVkTm9kZT1udWxsfV9oZWFsdGhQaWxsc0F2YWlsYWJsZSh0LGUpe3JldHVybiB0JiZlJiZPYmplY3Qua2V5cyhlKS5sZW5ndGg+MH1fZXF1YWxzKHQsZSl7cmV0dXJuIHQ9PT1lfX07WHF0LnRlbXBsYXRlPV9lYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tc2Vjb25kYXJ5LWJhY2tncm91bmQtY29sb3IpOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXgtaGVpZ2h0OiA2NTBweDsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgaDIgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tzZWxlY3RlZE5vZGV9fSI+CiAgICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGNsYXNzPSJjYXJkIj4KICAgICAgICA8dGYtbm9kZS1pbmZvCiAgICAgICAgICBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIKICAgICAgICAgIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iCiAgICAgICAgICBmbGF0LWdyYXBoPSJbW2dyYXBoXV0iCiAgICAgICAgICBncmFwaC1ub2RlLW5hbWU9Iltbc2VsZWN0ZWROb2RlXV0iCiAgICAgICAgICBub2RlLWluY2x1ZGU9Iltbc2VsZWN0ZWROb2RlSW5jbHVkZV1dIgogICAgICAgICAgaGlnaGxpZ2h0ZWQtbm9kZT0ie3toaWdobGlnaHRlZE5vZGV9fSIKICAgICAgICAgIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIKICAgICAgICA+CiAgICAgICAgPC90Zi1ub2RlLWluZm8+CiAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ29wX2NvbXBhdGliaWxpdHknKV1dIj4KICAgICAgPHRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkCiAgICAgICAgZ3JhcGgtaGllcmFyY2h5PSJbW2dyYXBoSGllcmFyY2h5XV0iCiAgICAgICAgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIKICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgbm9kZS10aXRsZT0iW1tjb21wYXROb2RlVGl0bGVdXSIKICAgICAgPgogICAgICA8L3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkPgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZQogICAgICBpcz0iZG9tLWlmIgogICAgICBpZj0iW1tfaGVhbHRoUGlsbHNBdmFpbGFibGUoZGVidWdnZXJEYXRhRW5hYmxlZCwgbm9kZU5hbWVzVG9IZWFsdGhQaWxscyldXSIKICAgID4KICAgICAgPHRmLWdyYXBoLWRlYnVnZ2VyLWRhdGEtY2FyZAogICAgICAgIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iCiAgICAgICAgZGVidWdnZXItbnVtZXJpYy1hbGVydHM9IltbZGVidWdnZXJOdW1lcmljQWxlcnRzXV0iCiAgICAgICAgbm9kZS1uYW1lcy10by1oZWFsdGgtcGlsbHM9Iltbbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIgogICAgICAgIHNlbGVjdGVkLW5vZGU9Int7c2VsZWN0ZWROb2RlfX0iCiAgICAgICAgaGlnaGxpZ2h0ZWQtbm9kZT0ie3toaWdobGlnaHRlZE5vZGV9fSIKICAgICAgICBhcmUtaGVhbHRoLXBpbGxzLWxvYWRpbmc9IltbYXJlSGVhbHRoUGlsbHNMb2FkaW5nXV0iCiAgICAgICAgYWxsLXN0ZXBzLW1vZGUtZW5hYmxlZD0ie3thbGxTdGVwc01vZGVFbmFibGVkfX0iCiAgICAgICAgc3BlY2lmaWMtaGVhbHRoLXBpbGwtc3RlcD0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iCiAgICAgICAgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0ie3toZWFsdGhQaWxsU3RlcEluZGV4fX0iCiAgICAgID4KICAgICAgPC90Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQ+CiAgICA8L3RlbXBsYXRlPgogIGAsdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sWHF0LnByb3RvdHlwZSwidGl0bGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRHF0KV0sWHF0LnByb3RvdHlwZSwiZ3JhcGhIaWVyYXJjaHkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIscUd0KV0sWHF0LnByb3RvdHlwZSwiZ3JhcGgiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIseVd0KV0sWHF0LnByb3RvdHlwZSwicmVuZGVySGllcmFyY2h5Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFhxdC5wcm90b3R5cGUsIm5vZGVOYW1lc1RvSGVhbHRoUGlsbHMiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLFhxdC5wcm90b3R5cGUsImhlYWx0aFBpbGxTdGVwSW5kZXgiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sWHF0LnByb3RvdHlwZSwiY29sb3JCeSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxYcXQucHJvdG90eXBlLCJjb21wYXROb2RlVGl0bGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFhxdC5wcm90b3R5cGUsInNlbGVjdGVkTm9kZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sWHF0LnByb3RvdHlwZSwiaGlnaGxpZ2h0ZWROb2RlIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxYcXQucHJvdG90eXBlLCJzZWxlY3RlZE5vZGVJbmNsdWRlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sWHF0LnByb3RvdHlwZSwiZGVidWdnZXJEYXRhRW5hYmxlZCIsdm9pZCAwKSxYcXQ9dChbaSgidGYtZ3JhcGgtaW5mbyIpXSxYcXQpO2NsYXNzICRxdHtjb25zdHJ1Y3Rvcih0LGUsbixpLHIsbyl7dGhpcy5zdmc9dCx0aGlzLmxhYmVsUGFkZGluZz1vLHRoaXMuem9vbUc9ZSx0aGlzLm1haW5ab29tPW4sdGhpcy5tYXhXYW5kSD1yO2xldCBhPVN1KGkuc2hhZG93Um9vdCkscz1hLnNlbGVjdCgic3ZnIiksbD1zLnNlbGVjdCgicmVjdCIpO3RoaXMudmlld3BvaW50Q29vcmQ9e3g6MCx5OjB9O2xldCBjPXZoKCkuc3ViamVjdChPYmplY3QpLm9uKCJkcmFnIiwodD0+e3RoaXMudmlld3BvaW50Q29vcmQueD11dS54LHRoaXMudmlld3BvaW50Q29vcmQueT11dS55LHRoaXMudXBkYXRlVmlld3BvaW50KCl9KSk7bC5kYXR1bSh0aGlzLnZpZXdwb2ludENvb3JkKS5jYWxsKGMpLHMub24oImNsaWNrIiwoKCk9PntpZih1dS5kZWZhdWx0UHJldmVudGVkKXJldHVybjtsZXQgdD1OdW1iZXIobC5hdHRyKCJ3aWR0aCIpKSxlPU51bWJlcihsLmF0dHIoImhlaWdodCIpKSxuPWFoKHMubm9kZSgpKTt0aGlzLnZpZXdwb2ludENvb3JkLng9blswXS10LzIsdGhpcy52aWV3cG9pbnRDb29yZC55PW5bMV0tZS8yLHRoaXMudXBkYXRlVmlld3BvaW50KCl9KSksdGhpcy52aWV3cG9pbnQ9bC5ub2RlKCksdGhpcy5taW5pbWFwU3ZnPXMubm9kZSgpLHRoaXMubWluaW1hcD1pLHRoaXMuY2FudmFzPWEuc2VsZWN0KCJjYW52YXMuZmlyc3QiKS5ub2RlKCksdGhpcy5jYW52YXNCdWZmZXI9YS5zZWxlY3QoImNhbnZhcy5zZWNvbmQiKS5ub2RlKCksdGhpcy5kb3dubG9hZENhbnZhcz1hLnNlbGVjdCgiY2FudmFzLmRvd25sb2FkIikubm9kZSgpLFN1KHRoaXMuZG93bmxvYWRDYW52YXMpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLHRoaXMudXBkYXRlKCl9dXBkYXRlVmlld3BvaW50KCl7U3UodGhpcy52aWV3cG9pbnQpLmF0dHIoIngiLHRoaXMudmlld3BvaW50Q29vcmQueCkuYXR0cigieSIsdGhpcy52aWV3cG9pbnRDb29yZC55KTtsZXQgdD0tdGhpcy52aWV3cG9pbnRDb29yZC54KnRoaXMuc2NhbGVNYWluL3RoaXMuc2NhbGVNaW5pbWFwLGU9LXRoaXMudmlld3BvaW50Q29vcmQueSp0aGlzLnNjYWxlTWFpbi90aGlzLnNjYWxlTWluaW1hcDtTdSh0aGlzLnN2ZykuY2FsbCh0aGlzLm1haW5ab29tLnRyYW5zZm9ybSx2Ti50cmFuc2xhdGUodCxlKS5zY2FsZSh0aGlzLnNjYWxlTWFpbikpfWdldEltYWdlQmxvYigpe3JldHVybiBuZXcgUHJvbWlzZSgodD0+e3RoaXMuZG93bmxvYWRDYW52YXMudG9CbG9iKChlPT57dChlKX0pLCJpbWFnZS9wbmciKX0pKX11cGRhdGUoKXtsZXQgdD1udWxsO3RyeXtpZih0PXRoaXMuem9vbUcuZ2V0QkJveCgpLDA9PT10LndpZHRoKXJldHVybn1jYXRjaCh0KXtyZXR1cm59bGV0IGU9U3UodGhpcy5zdmcpLG49IiI7Y29uc3QgaT10aGlzLnN2ZyxyPShpLmdldFJvb3ROb2RlP2kuZ2V0Um9vdE5vZGUoKTp0aGlzLnN2Zy5wYXJlbnROb2RlKS5zdHlsZVNoZWV0cztmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrKyl0cnl7bGV0IGU9clt0XS5jc3NSdWxlc3x8clt0XS5ydWxlcztpZihudWxsPT1lKWNvbnRpbnVlO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKW4rPWVbdF0uY3NzVGV4dC5yZXBsYWNlKC8gP3RmLVtcdy1dKyA/L2csIiIpKyJcbiJ9Y2F0Y2godCl7aWYoIlNlY3VyaXR5RXJyb3IiIT09dC5uYW1lKXRocm93IHR9bGV0IG89ZS5hcHBlbmQoInN0eWxlIik7by50ZXh0KG4pO2xldCBhPVN1KHRoaXMuem9vbUcpLHM9YS5hdHRyKCJ0cmFuc2Zvcm0iKTthLmF0dHIoInRyYW5zZm9ybSIsbnVsbCksdC5oZWlnaHQrPXQueSx0LndpZHRoKz10LngsdC5oZWlnaHQrPTIqdGhpcy5sYWJlbFBhZGRpbmcsdC53aWR0aCs9Mip0aGlzLmxhYmVsUGFkZGluZyxlLmF0dHIoIndpZHRoIix0LndpZHRoKS5hdHRyKCJoZWlnaHQiLHQuaGVpZ2h0KSx0aGlzLnNjYWxlTWluaW1hcD10aGlzLm1heFdhbmRIL01hdGgubWF4KHQud2lkdGgsdC5oZWlnaHQpLHRoaXMubWluaW1hcFNpemU9e3dpZHRoOnQud2lkdGgqdGhpcy5zY2FsZU1pbmltYXAsaGVpZ2h0OnQuaGVpZ2h0KnRoaXMuc2NhbGVNaW5pbWFwfSxTdSh0aGlzLm1pbmltYXBTdmcpLmF0dHIodGhpcy5taW5pbWFwU2l6ZSksU3UodGhpcy5jYW52YXNCdWZmZXIpLmF0dHIodGhpcy5taW5pbWFwU2l6ZSk7Y29uc3QgbD1TdSh0aGlzLmRvd25sb2FkQ2FudmFzKTtsLnN0eWxlKCJ3aWR0aCIsdC53aWR0aCksbC5zdHlsZSgiaGVpZ2h0Iix0LmhlaWdodCksbC5hdHRyKCJ3aWR0aCIsMyp0LndpZHRoKSxsLmF0dHIoImhlaWdodCIsMyp0LmhlaWdodCksbnVsbCE9dGhpcy50cmFuc2xhdGUmJm51bGwhPXRoaXMuem9vbSYmcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+dGhpcy56b29tKCkpKTtsZXQgYz0obmV3IFhNTFNlcmlhbGl6ZXIpLnNlcmlhbGl6ZVRvU3RyaW5nKHRoaXMuc3ZnKTtvLnJlbW92ZSgpLGUuYXR0cigid2lkdGgiLG51bGwpLmF0dHIoImhlaWdodCIsbnVsbCksYS5hdHRyKCJ0cmFuc2Zvcm0iLHMpO2xldCB1PW5ldyBJbWFnZTt1Lm9ubG9hZD0oKT0+e2xldCB0PXRoaXMuY2FudmFzQnVmZmVyLmdldENvbnRleHQoIjJkIik7dC5jbGVhclJlY3QoMCwwLHRoaXMuY2FudmFzQnVmZmVyLndpZHRoLHRoaXMuY2FudmFzQnVmZmVyLmhlaWdodCksdC5kcmF3SW1hZ2UodSwwLDAsdGhpcy5taW5pbWFwU2l6ZS53aWR0aCx0aGlzLm1pbmltYXBTaXplLmhlaWdodCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+e1N1KHRoaXMuY2FudmFzQnVmZmVyKS5zdHlsZSgiZGlzcGxheSIsbnVsbCksU3UodGhpcy5jYW52YXMpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLFt0aGlzLmNhbnZhcyx0aGlzLmNhbnZhc0J1ZmZlcl09W3RoaXMuY2FudmFzQnVmZmVyLHRoaXMuY2FudmFzXX0pKTtsZXQgZT10aGlzLmRvd25sb2FkQ2FudmFzLmdldENvbnRleHQoIjJkIik7ZS5jbGVhclJlY3QoMCwwLHRoaXMuZG93bmxvYWRDYW52YXMud2lkdGgsdGhpcy5kb3dubG9hZENhbnZhcy5oZWlnaHQpLGUuZHJhd0ltYWdlKHUsMCwwLHRoaXMuZG93bmxvYWRDYW52YXMud2lkdGgsdGhpcy5kb3dubG9hZENhbnZhcy5oZWlnaHQpfSx1Lm9uZXJyb3I9KCk9PntsZXQgdD1uZXcgQmxvYihbY10se3R5cGU6ImltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCJ9KTt1LnNyYz1VUkwuY3JlYXRlT2JqZWN0VVJMKHQpfSx1LnNyYz0iZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsIitlbmNvZGVVUklDb21wb25lbnQoYyl9em9vbSh0KXtpZihudWxsPT10aGlzLnNjYWxlTWluaW1hcClyZXR1cm47dCYmKHRoaXMudHJhbnNsYXRlPVt0LngsdC55XSx0aGlzLnNjYWxlTWFpbj10LmspO2xldCBlPXRoaXMuc3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49U3UodGhpcy52aWV3cG9pbnQpO3RoaXMudmlld3BvaW50Q29vcmQueD0tdGhpcy50cmFuc2xhdGVbMF0qdGhpcy5zY2FsZU1pbmltYXAvdGhpcy5zY2FsZU1haW4sdGhpcy52aWV3cG9pbnRDb29yZC55PS10aGlzLnRyYW5zbGF0ZVsxXSp0aGlzLnNjYWxlTWluaW1hcC90aGlzLnNjYWxlTWFpbjtsZXQgaT1lLndpZHRoKnRoaXMuc2NhbGVNaW5pbWFwL3RoaXMuc2NhbGVNYWluLHI9ZS5oZWlnaHQqdGhpcy5zY2FsZU1pbmltYXAvdGhpcy5zY2FsZU1haW47bi5hdHRyKCJ4Iix0aGlzLnZpZXdwb2ludENvb3JkLngpLmF0dHIoInkiLHRoaXMudmlld3BvaW50Q29vcmQueSkuYXR0cigid2lkdGgiLGkpLmF0dHIoImhlaWdodCIscik7bGV0IG89dGhpcy5taW5pbWFwU2l6ZS53aWR0aCxhPXRoaXMubWluaW1hcFNpemUuaGVpZ2h0LHM9dGhpcy52aWV3cG9pbnRDb29yZC54LGw9dGhpcy52aWV3cG9pbnRDb29yZC55OyhNYXRoLm1pbihNYXRoLm1heCgwLHMraSksbyktTWF0aC5taW4oTWF0aC5tYXgoMCxzKSxvKSkqKE1hdGgubWluKE1hdGgubWF4KDAsbCtyKSxhKS1NYXRoLm1pbihNYXRoLm1heCgwLGwpLGEpKS8obyphKTwuOD90aGlzLm1pbmltYXAuY2xhc3NMaXN0LnJlbW92ZSgiaGlkZGVuIik6dGhpcy5taW5pbWFwLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpfX1sZXQgS3F0PWNsYXNzIGV4dGVuZHMgeWV7aW5pdCh0LGUsbixpLHIpe3JldHVybiBuZXcgJHF0KHQsZSxuLHRoaXMsaSxyKX19O0txdC50ZW1wbGF0ZT1fZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcyBsaW5lYXI7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAgIH0KCiAgICAgIDpob3N0KC5oaWRkZW4pIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICBjYW52YXMgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM5OTk7CiAgICAgIH0KCiAgICAgIHJlY3QgewogICAgICAgIGZpbGw6IHdoaXRlOwogICAgICAgIHN0cm9rZTogIzExMTExMTsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgICBmaWxsLW9wYWNpdHk6IDA7CiAgICAgICAgZmlsdGVyOiB1cmwoI21pbmltYXBEcm9wU2hhZG93KTsKICAgICAgICBjdXJzb3I6IG1vdmU7CiAgICAgIH0KCiAgICAgIHN2ZyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHN2Zz4KICAgICAgPGRlZnM+CiAgICAgICAgPGZpbHRlcgogICAgICAgICAgaWQ9Im1pbmltYXBEcm9wU2hhZG93IgogICAgICAgICAgeD0iLTIwJSIKICAgICAgICAgIHk9Ii0yMCUiCiAgICAgICAgICB3aWR0aD0iMTUwJSIKICAgICAgICAgIGhlaWdodD0iMTUwJSIKICAgICAgICA+CiAgICAgICAgICA8ZmVPZmZzZXQgcmVzdWx0PSJvZmZPdXQiIGluPSJTb3VyY2VHcmFwaGljIiBkeD0iMSIgZHk9IjEiPjwvZmVPZmZzZXQ+CiAgICAgICAgICA8ZmVDb2xvck1hdHJpeAogICAgICAgICAgICByZXN1bHQ9Im1hdHJpeE91dCIKICAgICAgICAgICAgaW49Im9mZk91dCIKICAgICAgICAgICAgdHlwZT0ibWF0cml4IgogICAgICAgICAgICB2YWx1ZXM9IjAuMSAwIDAgMCAwIDAgMC4xIDAgMCAwIDAgMCAwLjEgMCAwIDAgMCAwIDAuNSAwIgogICAgICAgICAgPjwvZmVDb2xvck1hdHJpeD4KICAgICAgICAgIDxmZUdhdXNzaWFuQmx1cgogICAgICAgICAgICByZXN1bHQ9ImJsdXJPdXQiCiAgICAgICAgICAgIGluPSJtYXRyaXhPdXQiCiAgICAgICAgICAgIHN0ZERldmlhdGlvbj0iMiIKICAgICAgICAgID48L2ZlR2F1c3NpYW5CbHVyPgogICAgICAgICAgPGZlQmxlbmQgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iYmx1ck91dCIgbW9kZT0ibm9ybWFsIj48L2ZlQmxlbmQ+CiAgICAgICAgPC9maWx0ZXI+CiAgICAgIDwvZGVmcz4KICAgICAgPHJlY3Q+PC9yZWN0PgogICAgPC9zdmc+CiAgICA8Y2FudmFzIGNsYXNzPSJmaXJzdCI+PC9jYW52YXM+CiAgICA8IS0tIEFkZGl0aW9uYWwgY2FudmFzIHRvIHVzZSBhcyBidWZmZXIgdG8gYXZvaWQgZmxpY2tlcmluZyBiZXR3ZWVuIHVwZGF0ZXMgLS0+CiAgICA8Y2FudmFzIGNsYXNzPSJzZWNvbmQiPjwvY2FudmFzPgogICAgPGNhbnZhcyBjbGFzcz0iZG93bmxvYWQiPjwvY2FudmFzPgogIGAsS3F0PXQoW2koInRmLWdyYXBoLW1pbmltYXAiKV0sS3F0KTtjb25zdCBacXQ9X2VgCiAgPHN0eWxlPgogICAgOmhvc3QoLmRhcmstbW9kZSkgewogICAgICBmaWx0ZXI6IGludmVydCgxKTsKICAgIH0KCiAgICA6aG9zdCB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB3aWR0aDogMTAwJTsKICAgIH0KCiAgICAjc3ZnIHsKICAgICAgZmxleDogMTsKICAgICAgZm9udC1mYW1pbHk6IFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB3aWR0aDogMTAwJTsKICAgIH0KCiAgICAjaGlkZGVuIHsKICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB0b3A6IDBweDsKICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgfQoKICAgIHRleHQgewogICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIH0KCiAgICAvKiAtLS0gTm9kZSBhbmQgYW5ub3RhdGlvbi1ub2RlIGZvciBNZXRhbm9kZSAtLS0gKi8KCiAgICAubWV0YSA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgLm1ldGEgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgZmlsbDogaHNsKDAsIDAlLCA3MCUpOwogICAgfQogICAgLm5vZGUubWV0YS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgLm5vZGUubWV0YS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgfQogICAgLmFubm90YXRpb24ubWV0YS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgLmFubm90YXRpb24ubWV0YS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgc3Ryb2tlLXdpZHRoOiAxOwogICAgfQogICAgLm1ldGEuc2VsZWN0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgIC5tZXRhLnNlbGVjdGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICBzdHJva2U6IHJlZDsKICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgfQogICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgIHN0cm9rZS13aWR0aDogMzsKICAgIH0KICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgIHN0cm9rZTogcmVkOwogICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICB9CiAgICAubm9kZS5tZXRhLnNlbGVjdGVkLmV4cGFuZGVkLmhpZ2hsaWdodGVkID4gLm5vZGVzaGFwZSA+IHJlY3QsCiAgICAubm9kZS5tZXRhLnNlbGVjdGVkLmV4cGFuZGVkLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICBzdHJva2U6IHJlZDsKICAgICAgc3Ryb2tlLXdpZHRoOiA0OwogICAgfQoKICAgIC5mYWRlZCwKICAgIC5mYWRlZCByZWN0LAogICAgLmZhZGVkIGVsbGlwc2UsCiAgICAuZmFkZWQgcGF0aCwKICAgIC5mYWRlZCB1c2UsCiAgICAjcmVjdEhhdGNoIGxpbmUsCiAgICAjZWxsaXBzZUhhdGNoIGxpbmUgewogICAgICBjb2xvcjogI2UwZDRiMyAhaW1wb3J0YW50OwogICAgICBmaWxsOiB3aGl0ZTsKICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLmZhZGVkIHBhdGggewogICAgICBzdHJva2Utd2lkdGg6IDFweCAhaW1wb3J0YW50OwogICAgfQoKICAgIC5mYWRlZCByZWN0IHsKICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLmZhZGVkIGVsbGlwc2UsCiAgICAuZmFkZWQgdXNlIHsKICAgICAgZmlsbDogdXJsKCNlbGxpcHNlSGF0Y2gpICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLmZhZGVkIHRleHQgewogICAgICBvcGFjaXR5OiAwOwogICAgfQoKICAgIC8qIFJ1bGVzIHVzZWQgZm9yIGlucHV0LXRyYWNpbmcuICovCiAgICAuaW5wdXQtaGlnaGxpZ2h0ID4gKiA+IHJlY3QsCiAgICAuaW5wdXQtaGlnaGxpZ2h0ID4gKiA+IGVsbGlwc2UsCiAgICAuaW5wdXQtaGlnaGxpZ2h0ID4gKiA+IHVzZSB7CiAgICAgIGZpbGw6IHdoaXRlOwogICAgICBzdHJva2U6ICNmZjk4MDAgIWltcG9ydGFudDsKICAgIH0KCiAgICAvKiAgLSBGYWRlZCBub24taW5wdXQgc3R5bGluZyAqLwogICAgLm5vbi1pbnB1dCA+ICogPiByZWN0LAoubm9uLWlucHV0ID4gKiA+IGVsbGlwc2UsCi5ub24taW5wdXQgPiAqID4gdXNlLAovKiBGb3IgQ29uc3Qgbm9kZXMuICovCi5ub24taW5wdXQgPiAqID4gLmNvbnN0YW50Om5vdChbY2xhc3MqPSJpbnB1dC1oaWdobGlnaHQiXSkgPgogIC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlLAovKiBGb3Igc3R5bGluZyBvZiBhbm5vdGF0aW9uIG5vZGVzIG9mIG5vbi1pbnB1dCBub2Rlcy4gKi8KLm5vbi1pbnB1dCA+IGcgPiAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgIHN0cm9rZS13aWR0aDogaW5oZXJpdDsKICAgICAgc3Ryb2tlLWRhc2hhcnJheTogaW5oZXJpdDsKICAgIH0KCiAgICAubm9uLWlucHV0IHBhdGggewogICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICB9CgogICAgLm5vbi1pbnB1dCA+IC5ub2Rlc2hhcGUgPiByZWN0LAoubm9uLWlucHV0ID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QsCi8qIEZvciBzdHlsaW5nIG9mIGFubm90YXRpb24gbm9kZXMgb2Ygbm9uLWlucHV0IG5vZGVzLiAqLwoubm9uLWlucHV0ID4gZyA+IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICBmaWxsOiB1cmwoI3JlY3RIYXRjaCkgIWltcG9ydGFudDsKICAgIH0KCiAgICAubm9uLWlucHV0IGVsbGlwc2UsCiAgICAubm9uLWlucHV0IHVzZSB7CiAgICAgIGZpbGw6IHVybCgjZWxsaXBzZUhhdGNoKSAhaW1wb3J0YW50OwogICAgfQoKICAgIC5ub24taW5wdXQgPiB0ZXh0IHsKICAgICAgb3BhY2l0eTogMDsKICAgIH0KCiAgICAubm9uLWlucHV0IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZSB7CiAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgfQoKICAgIC5ub24taW5wdXQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICBtYXJrZXItc3RhcnQ6IHVybCgjcmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgIH0KCiAgICAvKiBJbnB1dCBlZGdlcy4gKi8KICAgIC5pbnB1dC1lZGdlLWhpZ2hsaWdodCA+IHRleHQgewogICAgICBmaWxsOiBibGFjayAhaW1wb3J0YW50OwogICAgfQogICAgLmlucHV0LWhpZ2hsaWdodCA+IC5pbi1hbm5vdGF0aW9ucyA+IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZSwKICAgIC5pbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQKICAgICAgPiAuaW4tYW5ub3RhdGlvbnMKICAgICAgPiAuYW5ub3RhdGlvbgogICAgICA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICBzdHJva2U6ICM5OTkgIWltcG9ydGFudDsKICAgIH0KCiAgICAvKiBOb24taW5wdXQgZWRnZXMuICovCiAgICAubm9uLWlucHV0LWVkZ2UtaGlnaGxpZ2h0LAoubm9uLWlucHV0ID4gZyA+IC5hbm5vdGF0aW9uID4gcGF0aCwKLyogQW5ub3RhdGlvbiBzdHlsZXMgKGxhYmVsIGFuZCBlZGdlcyByZXNwZWN0aXZlbHkpLiAqLwoubm9uLWlucHV0ID4gZyA+Ci5hbm5vdGF0aW9uOm5vdCguaW5wdXQtaGlnaGxpZ2h0KTpub3QoLmlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZCkgPgouYW5ub3RhdGlvbi1sYWJlbAovKi5hbm5vdGF0aW9uLWVkZ2UqLyB7CiAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIH0KCiAgICAvKiAtLS0gT3AgTm9kZSAtLS0gKi8KCiAgICAub3AgPiAubm9kZXNoYXBlID4gLm5vZGVjb2xvcnRhcmdldCwKICAgIC5vcCA+IC5hbm5vdGF0aW9uLW5vZGUgPiAubm9kZWNvbG9ydGFyZ2V0IHsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICBmaWxsOiAjZmZmOwogICAgICBzdHJva2U6ICNjY2M7CiAgICB9CgogICAgLm9wLnNlbGVjdGVkID4gLm5vZGVzaGFwZSA+IC5ub2RlY29sb3J0YXJnZXQsCiAgICAub3Auc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gLm5vZGVjb2xvcnRhcmdldCB7CiAgICAgIHN0cm9rZTogcmVkOwogICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICB9CgogICAgLm9wLmhpZ2hsaWdodGVkID4gLm5vZGVzaGFwZSA+IC5ub2RlY29sb3J0YXJnZXQsCiAgICAub3AuaGlnaGxpZ2h0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gLm5vZGVjb2xvcnRhcmdldCB7CiAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgIH0KCiAgICAvKiAtLS0gU2VyaWVzIE5vZGUgLS0tICovCgogICAgLyogQnkgZGVmYXVsdCwgZG9uJ3Qgc2hvdyB0aGUgc2VyaWVzIGJhY2tncm91bmQgPHJlY3Q+LiAqLwogICAgLnNlcmllcyA+IC5ub2Rlc2hhcGUgPiByZWN0IHsKICAgICAgZmlsbDogaHNsKDAsIDAlLCA3MCUpOwogICAgICBmaWxsLW9wYWNpdHk6IDA7CiAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDUsIDU7CiAgICAgIHN0cm9rZS1vcGFjaXR5OiAwOwogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB9CgogICAgLyogT25jZSBleHBhbmRlZCwgc2hvdyB0aGUgc2VyaWVzIGJhY2tncm91bmQgPHJlY3Q+IGFuZCBoaWRlIHRoZSA8dXNlPi4gKi8KICAgIC5zZXJpZXMuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgIGZpbGwtb3BhY2l0eTogMC4xNTsKICAgICAgc3Ryb2tlOiBoc2woMCwgMCUsIDcwJSk7CiAgICAgIHN0cm9rZS1vcGFjaXR5OiAxOwogICAgfQogICAgLnNlcmllcy5leHBhbmRlZCA+IC5ub2Rlc2hhcGUgPiB1c2UgewogICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICB9CgogICAgLyoqCiAqIFRPRE86IFNpbXBsaWZ5IHRoaXMgYnkgYXBwbHlpbmcgYSBzdGFibGUgY2xhc3MgbmFtZSB0byBhbGwgPGc+CiAqIGVsZW1lbnRzIHRoYXQgY3VycmVudGx5IGhhdmUgZWl0aGVyIHRoZSBub2Rlc2hhcGUgb3IgYW5ub3RhdGlvbi1ub2RlIGNsYXNzZXMuCiAqLwogICAgLnNlcmllcyA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAuc2VyaWVzID4gLmFubm90YXRpb24tbm9kZSA+IHVzZSB7CiAgICAgIHN0cm9rZTogI2NjYzsKICAgIH0KICAgIC5zZXJpZXMuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gdXNlLAogICAgLnNlcmllcy5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiB1c2UgewogICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICB9CiAgICAuc2VyaWVzLnNlbGVjdGVkID4gLm5vZGVzaGFwZSA+IHVzZSwKICAgIC5zZXJpZXMuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgIH0KCiAgICAuc2VyaWVzLnNlbGVjdGVkID4gLm5vZGVzaGFwZSA+IHJlY3QgewogICAgICBzdHJva2U6IHJlZDsKICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgfQoKICAgIC5hbm5vdGF0aW9uLnNlcmllcy5zZWxlY3RlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiB1c2UgewogICAgICBzdHJva2U6IHJlZDsKICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgfQoKICAgIC8qIC0tLSBCcmlkZ2UgTm9kZSAtLS0gKi8KICAgIC5icmlkZ2UgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgIHN0cm9rZTogI2YwZjsKICAgICAgb3BhY2l0eTogMC4yOwogICAgICBkaXNwbGF5OiBub25lOwogICAgfQoKICAgIC8qIC0tLSBTdHJ1Y3R1cmFsIEVsZW1lbnRzIC0tLSAqLwogICAgLmVkZ2UgPiBwYXRoLmVkZ2VsaW5lLnN0cnVjdHVyYWwgewogICAgICBzdHJva2U6ICNmMGY7CiAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgZGlzcGxheTogbm9uZTsKICAgIH0KCiAgICAvKiBSZWZlcmVuY2UgRWRnZSAqLwogICAgLmVkZ2UgPiBwYXRoLmVkZ2VsaW5lLnJlZmVyZW5jZWVkZ2UgewogICAgICBzdHJva2U6ICNmZmI3NGQ7CiAgICAgIG9wYWNpdHk6IDE7CiAgICB9CgogICAgLyogLS0tIFNlcmllcyBOb2RlcyAtLS0gKi8KCiAgICAvKiBIaWRlIHRoZSByZWN0IGZvciBhIHNlcmllcycgYW5ub3RhdGlvbi4gKi8KICAgIC5zZXJpZXMgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICB9CgogICAgLyogLS0tIE5vZGUgbGFiZWwgLS0tICovCgogICAgLm5vZGUgewogICAgICAvKiBQcm92aWRlIGEgaGludCB0byBicm93c2VycyB0byBhdm9pZCB1c2luZyB0aGVpciBzdGF0aWMgcmFzdGVyaXphdGlvbgogICAgICBhdCBpbml0aWFsIHNjYWxlLCB3aGljaCBsb29rcyB2ZXJ5IHBpeGVsYXRlZCBvbiBDaHJvbWl1bSB3aGVuIHpvb21lZCBpbi4KICAgICAgTm90ZSB0aGF0IHdlIGludGVudGlvbmFsbHkgZG8gKm5vdCogdXNlICd3aWxsLWNoYW5nZTogdHJhbnNmb3JtJyBhbmQKICAgICAgJ3RyYW5zbGF0ZVooMCkgaGVyZSwgd2hpY2ggaW50cm9kdWNlIGJsdXJyaW5lc3Mgb24gRmlyZWZveC4KICAgICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2lzc3Vlcy80NzQ0ICovCiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWigxcHgpOwogICAgfQoKICAgIC5ub2RlID4gdGV4dC5ub2RlbGFiZWwgewogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIGZpbGw6ICM0NDQ7CiAgICB9CgogICAgLm1ldGEuZXhwYW5kZWQgPiB0ZXh0Lm5vZGVsYWJlbCB7CiAgICAgIGZvbnQtc2l6ZTogOXB4OwogICAgfQoKICAgIC5zZXJpZXMgPiB0ZXh0Lm5vZGVsYWJlbCB7CiAgICAgIGZvbnQtc2l6ZTogOHB4OwogICAgfQoKICAgIC5vcCA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgZm9udC1zaXplOiA2cHg7CiAgICB9CgogICAgLmJyaWRnZSA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgZGlzcGxheTogbm9uZTsKICAgIH0KCiAgICAubm9kZS5tZXRhLmV4cGFuZGVkID4gdGV4dC5ub2RlbGFiZWwgewogICAgICBjdXJzb3I6IG5vcm1hbDsKICAgIH0KCiAgICAuYW5ub3RhdGlvbi5tZXRhLmhpZ2hsaWdodGVkID4gdGV4dC5hbm5vdGF0aW9uLWxhYmVsIHsKICAgICAgZmlsbDogIzUwYTNmNzsKICAgIH0KCiAgICAuYW5ub3RhdGlvbi5tZXRhLnNlbGVjdGVkID4gdGV4dC5hbm5vdGF0aW9uLWxhYmVsIHsKICAgICAgZmlsbDogIzQyODVmNDsKICAgIH0KCiAgICAvKiAtLS0gQW5ub3RhdGlvbiAtLS0gKi8KCiAgICAvKiBvbmx5IGFwcGxpZWQgZm9yIGFubm90YXRpb25zIHRoYXQgYXJlIG5vdCBzdW1tYXJ5IG9yIGNvbnN0YW50LgooLnN1bW1hcnksIC5jb25zdGFudCBnZXRzIG92ZXJyaWRkZW4gYmVsb3cpICovCiAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLW5vZGUgPiAqIHsKICAgICAgc3Ryb2tlLXdpZHRoOiAwLjU7CiAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDEsIDE7CiAgICB9CgogICAgLmFubm90YXRpb24uc3VtbWFyeSA+IC5hbm5vdGF0aW9uLW5vZGUgPiAqLAogICAgLmFubm90YXRpb24uY29uc3RhbnQgPiAuYW5ub3RhdGlvbi1ub2RlID4gKiB7CiAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgc3Ryb2tlLWRhc2hhcnJheTogbm9uZTsKICAgIH0KCiAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICBmaWxsOiBub25lOwogICAgICBzdHJva2U6ICNhYWE7CiAgICAgIHN0cm9rZS13aWR0aDogMC41OwogICAgICBtYXJrZXItZW5kOiB1cmwoI2Fubm90YXRpb24tYXJyb3doZWFkKTsKICAgIH0KCiAgICAuZmFkZWQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlIHsKICAgICAgbWFya2VyLWVuZDogdXJsKCNhbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCk7CiAgICB9CgogICAgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICBtYXJrZXItc3RhcnQ6IHVybCgjcmVmLWFubm90YXRpb24tYXJyb3doZWFkKTsKICAgIH0KCiAgICAuZmFkZWQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICBtYXJrZXItc3RhcnQ6IHVybCgjcmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgIH0KCiAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWNvbnRyb2wtZWRnZSB7CiAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDEsIDE7CiAgICB9CgogICAgI2Fubm90YXRpb24tYXJyb3doZWFkIHsKICAgICAgZmlsbDogI2FhYTsKICAgIH0KCiAgICAjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQgewogICAgICBmaWxsOiAjZTBkNGIzOwogICAgfQoKICAgICNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQgewogICAgICBmaWxsOiAjYWFhOwogICAgfQoKICAgICNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQgewogICAgICBmaWxsOiAjZTBkNGIzOwogICAgfQoKICAgIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tbGFiZWwgewogICAgICBmb250LXNpemU6IDVweDsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgfQogICAgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1sYWJlbC5hbm5vdGF0aW9uLWVsbGlwc2lzIHsKICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgfQoKICAgIC8qIEhpZGUgYW5ub3RhdGlvbnMgb24gZXhwYW5kZWQgbWV0YSBub2RlcyBzaW5jZSB0aGV5J3JlIHJlZHVuZGFudC4gKi8KICAgIC5leHBhbmRlZCA+IC5pbi1hbm5vdGF0aW9ucywKICAgIC5leHBhbmRlZCA+IC5vdXQtYW5ub3RhdGlvbnMgewogICAgICBkaXNwbGF5OiBub25lOwogICAgfQoKICAgIC8qIC0tLSBBbm5vdGF0aW9uOiBDb25zdGFudCAtLS0gKi8KCiAgICAuY29uc3RhbnQgPiAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSB7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgZmlsbDogd2hpdGU7CiAgICAgIHN0cm9rZTogIzg0ODQ4NDsKICAgIH0KCiAgICAuY29uc3RhbnQuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSB7CiAgICAgIGZpbGw6IHdoaXRlOwogICAgICBzdHJva2U6IHJlZDsKICAgIH0KCiAgICAuY29uc3RhbnQuaGlnaGxpZ2h0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSB7CiAgICAgIHN0cm9rZS13aWR0aDogMS41OwogICAgfQoKICAgIC8qIC0tLSBBbm5vdGF0aW9uOiBTdW1tYXJ5IC0tLSAqLwoKICAgIC5zdW1tYXJ5ID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIGZpbGw6ICNkYjQ0Mzc7CiAgICAgIHN0cm9rZTogI2RiNDQzNzsKICAgIH0KCiAgICAuc3VtbWFyeS5zZWxlY3RlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgZmlsbDogI2E1MjcxNDsKICAgICAgc3Ryb2tlOiAjYTUyNzE0OwogICAgfQoKICAgIC5zdW1tYXJ5LmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgIH0KCiAgICAvKiAtLS0gRWRnZSAtLS0gKi8KCiAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUgewogICAgICBmaWxsOiBub25lOwogICAgICBzdHJva2U6ICNiYmI7CiAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgc3Ryb2tlLXdpZHRoOiAwLjc1OwogICAgfQoKICAgIC5lZGdlIC5zZWxlY3RhYmxlZWRnZSB7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIH0KCiAgICAuc2VsZWN0ZWRlZGdlID4gcGF0aC5lZGdlbGluZSB7CiAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgc3Ryb2tlOiAjZjAwOwogICAgfQoKICAgIC5lZGdlLnNlbGVjdGVkZWRnZSB0ZXh0IHsKICAgICAgZmlsbDogIzAwMDsKICAgIH0KCiAgICAvKiBMYWJlbHMgc2hvd2luZyB0ZW5zb3Igc2hhcGVzIG9uIGVkZ2VzICovCiAgICAuZWRnZSA+IHRleHQgewogICAgICBmb250LXNpemU6IDMuNXB4OwogICAgICBmaWxsOiAjNjY2OwogICAgfQoKICAgIC5kYXRhZmxvdy1hcnJvd2hlYWQgewogICAgICBmaWxsOiAjYmJiOwogICAgfQoKICAgIC5yZWZlcmVuY2UtYXJyb3doZWFkIHsKICAgICAgZmlsbDogI2ZmYjc0ZDsKICAgIH0KCiAgICAuc2VsZWN0ZWQtYXJyb3doZWFkIHsKICAgICAgZmlsbDogI2YwMDsKICAgIH0KCiAgICAuZWRnZSAuY29udHJvbC1kZXAgewogICAgICBzdHJva2UtZGFzaGFycmF5OiAyLCAyOwogICAgfQoKICAgIC8qIC0tLSBHcm91cCBub2RlIGV4cGFuZC9jb2xsYXBzZSBidXR0b24gLS0tICovCgogICAgLyogSGlkZXMgZXhwYW5kL2NvbGxhcHNlIGJ1dHRvbnMgd2hlbiBhIG5vZGUgaXNuJ3QgZXhwYW5kZWQgb3IgaGlnaGxpZ2h0ZWQuIFVzaW5nCiAgIGluY3JlZGlibHkgc21hbGwgb3BhY2l0eSBzbyB0aGF0IHRoZSBib3VuZGluZyBib3ggb2YgdGhlIDxnPiBwYXJlbnQgc3RpbGwgdGFrZXMKICAgdGhpcyBjb250YWluZXIgaW50byBhY2NvdW50IGV2ZW4gd2hlbiBpdCBpc24ndCB2aXNpYmxlICovCiAgICAubm9kZTpub3QoLmhpZ2hsaWdodGVkKTpub3QoLmV4cGFuZGVkKSA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyIHsKICAgICAgb3BhY2l0eTogMC4wMTsKICAgIH0KICAgIC5ub2RlLmhpZ2hsaWdodGVkID4gLm5vZGVzaGFwZSA+IC5idXR0b25jb250YWluZXIgewogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB9CiAgICAuYnV0dG9uY2lyY2xlIHsKICAgICAgZmlsbDogI2U3ODExZDsKICAgIH0KICAgIC5idXR0b25jaXJjbGU6aG92ZXIgewogICAgICBmaWxsOiAjYjk2NzE3OwogICAgfQogICAgLmV4cGFuZGJ1dHRvbiwKICAgIC5jb2xsYXBzZWJ1dHRvbiB7CiAgICAgIHN0cm9rZTogd2hpdGU7CiAgICB9CiAgICAvKiBEbyBub3QgbGV0IHRoZSBwYXRoIGVsZW1lbnRzIGluIHRoZSBidXR0b24gdGFrZSBwb2ludGVyIGZvY3VzICovCiAgICAubm9kZSA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyID4gLmV4cGFuZGJ1dHRvbiwKICAgIC5ub2RlID4gLm5vZGVzaGFwZSA+IC5idXR0b25jb250YWluZXIgPiAuY29sbGFwc2VidXR0b24gewogICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIH0KICAgIC8qIE9ubHkgc2hvdyB0aGUgZXhwYW5kIGJ1dHRvbiB3aGVuIGEgbm9kZSBpcyBjb2xsYXBzZWQgYW5kIG9ubHkgc2hvdyB0aGUKICAgY29sbGFwc2UgYnV0dG9uIHdoZW4gYSBub2RlIGlzIGV4cGFuZGVkLiAqLwogICAgLm5vZGUuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5leHBhbmRidXR0b24gewogICAgICBkaXNwbGF5OiBub25lOwogICAgfQogICAgLm5vZGU6bm90KC5leHBhbmRlZCkgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5jb2xsYXBzZWJ1dHRvbiB7CiAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICB9CgogICAgLmhlYWx0aC1waWxsLXN0YXRzIHsKICAgICAgZm9udC1zaXplOiA0cHg7CiAgICAgIHRleHQtYW5jaG9yOiBtaWRkbGU7CiAgICB9CgogICAgLmhlYWx0aC1waWxsIHJlY3QgewogICAgICBmaWx0ZXI6IHVybCgjaGVhbHRoLXBpbGwtc2hhZG93KTsKICAgICAgcng6IDM7CiAgICAgIHJ5OiAzOwogICAgfQoKICAgIC50aXRsZUNvbnRhaW5lciB7CiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgdG9wOiAyMHB4OwogICAgfQoKICAgIC50aXRsZSwKICAgIC5hdXhUaXRsZSwKICAgIC5mdW5jdGlvbkxpYnJhcnlUaXRsZSB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIH0KCiAgICAjbWluaW1hcCB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgcmlnaHQ6IDIwcHg7CiAgICAgIGJvdHRvbTogMjBweDsKICAgIH0KCiAgICAuY29udGV4dC1tZW51IHsKICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICBkaXNwbGF5OiBub25lOwogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUyOwogICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgbWluLXdpZHRoOiAxNTBweDsKICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q0ZDRkNDsKICAgIH0KCiAgICAuY29udGV4dC1tZW51IHVsIHsKICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogICAgICBtYXJnaW46IDA7CiAgICAgIHBhZGRpbmc6IDA7CiAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIH0KCiAgICAuY29udGV4dC1tZW51IHVsIGxpIHsKICAgICAgcGFkZGluZzogNHB4IDE2cHg7CiAgICB9CgogICAgLmNvbnRleHQtbWVudSB1bCBsaTpob3ZlciB7CiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgIGNvbG9yOiB3aGl0ZTsKICAgIH0KICA8L3N0eWxlPgogIDxkaXYgY2xhc3M9InRpdGxlQ29udGFpbmVyIj4KICAgIDxkaXYgaWQ9InRpdGxlIiBjbGFzcz0idGl0bGUiPk1haW4gR3JhcGg8L2Rpdj4KICAgIDxkaXYgaWQ9ImF1eFRpdGxlIiBjbGFzcz0iYXV4VGl0bGUiPkF1eGlsaWFyeSBOb2RlczwvZGl2PgogICAgPGRpdiBpZD0iZnVuY3Rpb25MaWJyYXJ5VGl0bGUiIGNsYXNzPSJmdW5jdGlvbkxpYnJhcnlUaXRsZSI+RnVuY3Rpb25zPC9kaXY+CiAgPC9kaXY+CiAgPHN2ZyBpZD0ic3ZnIj4KICAgIDxkZWZzPgogICAgICA8IS0tIEFycm93IGhlYWRzIGZvciByZWZlcmVuY2UgZWRnZSBwYXRocyBvZiBkaWZmZXJlbnQgcHJlZGVmaW5lZCBzaXplcyBwZXIgY29sb3IuIC0tPgogICAgICA8cGF0aAogICAgICAgIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXBhdGgiCiAgICAgICAgZD0iTSAwLDAgTCAxMCw1IEwgMCwxMCBDIDMsNyAzLDMgMCwwIgogICAgICA+PC9wYXRoPgogICAgICA8bWFya2VyCiAgICAgICAgY2xhc3M9InJlZmVyZW5jZS1hcnJvd2hlYWQiCiAgICAgICAgaWQ9InJlZmVyZW5jZS1hcnJvd2hlYWQtc21hbGwiCiAgICAgICAgdmlld0JveD0iMCAwIDEwIDEwIgogICAgICAgIG1hcmtlcldpZHRoPSI1IgogICAgICAgIG1hcmtlckhlaWdodD0iNSIKICAgICAgICByZWZYPSIyIgogICAgICAgIHJlZlk9IjUiCiAgICAgICAgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiCiAgICAgICAgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICA+CiAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIj48L3VzZT4KICAgICAgPC9tYXJrZXI+CiAgICAgIDxtYXJrZXIKICAgICAgICBjbGFzcz0icmVmZXJlbmNlLWFycm93aGVhZCIKICAgICAgICBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1tZWRpdW0iCiAgICAgICAgdmlld0JveD0iMCAwIDEwIDEwIgogICAgICAgIG1hcmtlcldpZHRoPSIxMyIKICAgICAgICBtYXJrZXJIZWlnaHQ9IjEzIgogICAgICAgIHJlZlg9IjIiCiAgICAgICAgcmVmWT0iNSIKICAgICAgICBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIKICAgICAgICBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgID4KICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNyZWZlcmVuY2UtYXJyb3doZWFkLXBhdGgiPjwvdXNlPgogICAgICA8L21hcmtlcj4KICAgICAgPG1hcmtlcgogICAgICAgIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIgogICAgICAgIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLWxhcmdlIgogICAgICAgIHZpZXdCb3g9IjAgMCAxMCAxMCIKICAgICAgICBtYXJrZXJXaWR0aD0iMTYiCiAgICAgICAgbWFya2VySGVpZ2h0PSIxNiIKICAgICAgICByZWZYPSIyIgogICAgICAgIHJlZlk9IjUiCiAgICAgICAgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiCiAgICAgICAgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICA+CiAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIj48L3VzZT4KICAgICAgPC9tYXJrZXI+CiAgICAgIDxtYXJrZXIKICAgICAgICBjbGFzcz0icmVmZXJlbmNlLWFycm93aGVhZCIKICAgICAgICBpZD0icmVmZXJlbmNlLWFycm93aGVhZC14bGFyZ2UiCiAgICAgICAgdmlld0JveD0iMCAwIDEwIDEwIgogICAgICAgIG1hcmtlcldpZHRoPSIyMCIKICAgICAgICBtYXJrZXJIZWlnaHQ9IjIwIgogICAgICAgIHJlZlg9IjIiCiAgICAgICAgcmVmWT0iNSIKICAgICAgICBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIKICAgICAgICBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgID4KICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNyZWZlcmVuY2UtYXJyb3doZWFkLXBhdGgiPjwvdXNlPgogICAgICA8L21hcmtlcj4KCiAgICAgIDwhLS0gQXJyb3cgaGVhZHMgZm9yIGRhdGFmbG93IGVkZ2UgcGF0aHMgb2YgZGlmZmVyZW50IHByZWRlZmluZWQgc2l6ZXMgcGVyIGNvbG9yLiAtLT4KICAgICAgPHBhdGgKICAgICAgICBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLXBhdGgiCiAgICAgICAgZD0iTSAwLDAgTCAxMCw1IEwgMCwxMCBDIDMsNyAzLDMgMCwwIgogICAgICA+PC9wYXRoPgogICAgICA8bWFya2VyCiAgICAgICAgY2xhc3M9ImRhdGFmbG93LWFycm93aGVhZCIKICAgICAgICBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLXNtYWxsIgogICAgICAgIHZpZXdCb3g9IjAgMCAxMCAxMCIKICAgICAgICBtYXJrZXJXaWR0aD0iNSIKICAgICAgICBtYXJrZXJIZWlnaHQ9IjUiCiAgICAgICAgcmVmWD0iMiIKICAgICAgICByZWZZPSI1IgogICAgICAgIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIgogICAgICAgIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIj48L3VzZT4KICAgICAgPC9tYXJrZXI+CiAgICAgIDxtYXJrZXIKICAgICAgICBjbGFzcz0iZGF0YWZsb3ctYXJyb3doZWFkIgogICAgICAgIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbWVkaXVtIgogICAgICAgIHZpZXdCb3g9IjAgMCAxMCAxMCIKICAgICAgICBtYXJrZXJXaWR0aD0iMTMiCiAgICAgICAgbWFya2VySGVpZ2h0PSIxMyIKICAgICAgICByZWZYPSIyIgogICAgICAgIHJlZlk9IjUiCiAgICAgICAgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiCiAgICAgICAgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICA+CiAgICAgICAgPHVzZSB4bGluazpocmVmPSIjZGF0YWZsb3ctYXJyb3doZWFkLXBhdGgiPjwvdXNlPgogICAgICA8L21hcmtlcj4KICAgICAgPG1hcmtlcgogICAgICAgIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiCiAgICAgICAgaWQ9ImRhdGFmbG93LWFycm93aGVhZC1sYXJnZSIKICAgICAgICB2aWV3Qm94PSIwIDAgMTAgMTAiCiAgICAgICAgbWFya2VyV2lkdGg9IjE2IgogICAgICAgIG1hcmtlckhlaWdodD0iMTYiCiAgICAgICAgcmVmWD0iMiIKICAgICAgICByZWZZPSI1IgogICAgICAgIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIgogICAgICAgIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIj48L3VzZT4KICAgICAgPC9tYXJrZXI+CiAgICAgIDxtYXJrZXIKICAgICAgICBjbGFzcz0iZGF0YWZsb3ctYXJyb3doZWFkIgogICAgICAgIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQteGxhcmdlIgogICAgICAgIHZpZXdCb3g9IjAgMCAxMCAxMCIKICAgICAgICBtYXJrZXJXaWR0aD0iMjAiCiAgICAgICAgbWFya2VySGVpZ2h0PSIyMCIKICAgICAgICByZWZYPSIyIgogICAgICAgIHJlZlk9IjUiCiAgICAgICAgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiCiAgICAgICAgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICA+CiAgICAgICAgPHVzZSB4bGluazpocmVmPSIjZGF0YWZsb3ctYXJyb3doZWFkLXBhdGgiPjwvdXNlPgogICAgICA8L21hcmtlcj4KCiAgICAgIDwhLS0gQXJyb3cgaGVhZCBmb3IgYW5ub3RhdGlvbiBlZGdlIHBhdGhzLiAtLT4KICAgICAgPG1hcmtlcgogICAgICAgIGlkPSJhbm5vdGF0aW9uLWFycm93aGVhZCIKICAgICAgICBtYXJrZXJXaWR0aD0iNSIKICAgICAgICBtYXJrZXJIZWlnaHQ9IjUiCiAgICAgICAgcmVmWD0iNSIKICAgICAgICByZWZZPSIyLjUiCiAgICAgICAgb3JpZW50PSJhdXRvIgogICAgICA+CiAgICAgICAgPHBhdGggZD0iTSAwLDAgTCA1LDIuNSBMIDAsNSBMIDAsMCI+PC9wYXRoPgogICAgICA8L21hcmtlcj4KICAgICAgPG1hcmtlcgogICAgICAgIGlkPSJhbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCIKICAgICAgICBtYXJrZXJXaWR0aD0iNSIKICAgICAgICBtYXJrZXJIZWlnaHQ9IjUiCiAgICAgICAgcmVmWD0iNSIKICAgICAgICByZWZZPSIyLjUiCiAgICAgICAgb3JpZW50PSJhdXRvIgogICAgICA+CiAgICAgICAgPHBhdGggZD0iTSAwLDAgTCA1LDIuNSBMIDAsNSBMIDAsMCI+PC9wYXRoPgogICAgICA8L21hcmtlcj4KICAgICAgPG1hcmtlcgogICAgICAgIGlkPSJyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQiCiAgICAgICAgbWFya2VyV2lkdGg9IjUiCiAgICAgICAgbWFya2VySGVpZ2h0PSI1IgogICAgICAgIHJlZlg9IjAiCiAgICAgICAgcmVmWT0iMi41IgogICAgICAgIG9yaWVudD0iYXV0byIKICAgICAgPgogICAgICAgIDxwYXRoIGQ9Ik0gNSwwIEwgMCwyLjUgTCA1LDUgTCA1LDAiPjwvcGF0aD4KICAgICAgPC9tYXJrZXI+CiAgICAgIDxtYXJrZXIKICAgICAgICBpZD0icmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkIgogICAgICAgIG1hcmtlcldpZHRoPSI1IgogICAgICAgIG1hcmtlckhlaWdodD0iNSIKICAgICAgICByZWZYPSIwIgogICAgICAgIHJlZlk9IjIuNSIKICAgICAgICBvcmllbnQ9ImF1dG8iCiAgICAgID4KICAgICAgICA8cGF0aCBkPSJNIDUsMCBMIDAsMi41IEwgNSw1IEwgNSwwIj48L3BhdGg+CiAgICAgIDwvbWFya2VyPgogICAgICA8IS0tIFRlbXBsYXRlIGZvciBhbiBPcCBub2RlIGVsbGlwc2UuIC0tPgogICAgICA8ZWxsaXBzZQogICAgICAgIGlkPSJvcC1ub2RlLXN0YW1wIgogICAgICAgIHJ4PSI3LjUiCiAgICAgICAgcnk9IjMiCiAgICAgICAgc3Ryb2tlPSJpbmhlcml0IgogICAgICAgIGZpbGw9ImluaGVyaXQiCiAgICAgID48L2VsbGlwc2U+CiAgICAgIDwhLS0gVGVtcGxhdGUgZm9yIGFuIE9wIG5vZGUgYW5ub3RhdGlvbiBlbGxpcHNlIChzbWFsbGVyKS4gLS0+CiAgICAgIDxlbGxpcHNlCiAgICAgICAgaWQ9Im9wLW5vZGUtYW5ub3RhdGlvbi1zdGFtcCIKICAgICAgICByeD0iNSIKICAgICAgICByeT0iMiIKICAgICAgICBzdHJva2U9ImluaGVyaXQiCiAgICAgICAgZmlsbD0iaW5oZXJpdCIKICAgICAgPjwvZWxsaXBzZT4KICAgICAgPCEtLSBWZXJ0aWNhbGx5IHN0YWNrZWQgc2VyaWVzIG9mIE9wIG5vZGVzIHdoZW4gdW5leHBhbmRlZC4gLS0+CiAgICAgIDxnIGlkPSJvcC1zZXJpZXMtdmVydGljYWwtc3RhbXAiPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjkiPjwvdXNlPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjYiPjwvdXNlPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjMiPjwvdXNlPgogICAgICA8L2c+CiAgICAgIDwhLS0gSG9yaXpvbnRhbGx5IHN0YWNrZWQgc2VyaWVzIG9mIE9wIG5vZGVzIHdoZW4gdW5leHBhbmRlZC4gLS0+CiAgICAgIDxnIGlkPSJvcC1zZXJpZXMtaG9yaXpvbnRhbC1zdGFtcCI+CiAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTYiIHk9IjQiPjwvdXNlPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjEyIiB5PSI0Ij48L3VzZT4KICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSI0Ij48L3VzZT4KICAgICAgPC9nPgogICAgICA8IS0tIEhvcml6b250YWxseSBzdGFja2VkIHNlcmllcyBvZiBPcCBub2RlcyBmb3IgYW5ub3RhdGlvbi4gLS0+CiAgICAgIDxnIGlkPSJvcC1zZXJpZXMtYW5ub3RhdGlvbi1zdGFtcCI+CiAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1hbm5vdGF0aW9uLXN0YW1wIiB4PSI5IiB5PSIyIj48L3VzZT4KICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjciIHk9IjIiPjwvdXNlPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtYW5ub3RhdGlvbi1zdGFtcCIgeD0iNSIgeT0iMiI+PC91c2U+CiAgICAgIDwvZz4KICAgICAgPHN2ZwogICAgICAgIGlkPSJzdW1tYXJ5LWljb24iCiAgICAgICAgZmlsbD0iIzg0ODQ4NCIKICAgICAgICBoZWlnaHQ9IjEyIgogICAgICAgIHZpZXdCb3g9IjAgMCAyNCAyNCIKICAgICAgICB3aWR0aD0iMTIiCiAgICAgID4KICAgICAgICA8cGF0aAogICAgICAgICAgZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIKICAgICAgICA+PC9wYXRoPgogICAgICA8L3N2Zz4KCiAgICAgIDwhLS0gSGF0Y2ggcGF0dGVybnMgZm9yIGZhZGVkIG91dCBub2Rlcy4gLS0+CiAgICAgIDxwYXR0ZXJuCiAgICAgICAgaWQ9InJlY3RIYXRjaCIKICAgICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJyb3RhdGUoNDUgMCAwKSIKICAgICAgICB3aWR0aD0iNSIKICAgICAgICBoZWlnaHQ9IjUiCiAgICAgICAgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgPgogICAgICAgIDxsaW5lIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSI1IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxIj48L2xpbmU+CiAgICAgIDwvcGF0dGVybj4KICAgICAgPHBhdHRlcm4KICAgICAgICBpZD0iZWxsaXBzZUhhdGNoIgogICAgICAgIHBhdHRlcm5UcmFuc2Zvcm09InJvdGF0ZSg0NSAwIDApIgogICAgICAgIHdpZHRoPSIyIgogICAgICAgIGhlaWdodD0iMiIKICAgICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICA+CiAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjIiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiPjwvbGluZT4KICAgICAgPC9wYXR0ZXJuPgoKICAgICAgPCEtLSBBIHNoYWRvdyBmb3IgaGVhbHRoIHBpbGxzLiAtLT4KICAgICAgPGZpbHRlcgogICAgICAgIGlkPSJoZWFsdGgtcGlsbC1zaGFkb3ciCiAgICAgICAgeD0iLTQwJSIKICAgICAgICB5PSItNDAlIgogICAgICAgIHdpZHRoPSIxODAlIgogICAgICAgIGhlaWdodD0iMTgwJSIKICAgICAgPgogICAgICAgIDxmZUdhdXNzaWFuQmx1ciBpbj0iU291cmNlQWxwaGEiIHN0ZERldmlhdGlvbj0iMC44Ij48L2ZlR2F1c3NpYW5CbHVyPgogICAgICAgIDxmZU9mZnNldCBkeD0iMCIgZHk9IjAiIHJlc3VsdD0ib2Zmc2V0Ymx1ciI+PC9mZU9mZnNldD4KICAgICAgICA8ZmVGbG9vZCBmbG9vZC1jb2xvcj0iIzAwMDAwMCI+PC9mZUZsb29kPgogICAgICAgIDxmZUNvbXBvc2l0ZSBpbjI9Im9mZnNldGJsdXIiIG9wZXJhdG9yPSJpbiI+PC9mZUNvbXBvc2l0ZT4KICAgICAgICA8ZmVNZXJnZT4KICAgICAgICAgIDxmZU1lcmdlTm9kZT48L2ZlTWVyZ2VOb2RlPgogICAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIj48L2ZlTWVyZ2VOb2RlPgogICAgICAgIDwvZmVNZXJnZT4KICAgICAgPC9maWx0ZXI+CiAgICA8L2RlZnM+CiAgICA8IS0tIE1ha2UgYSBsYXJnZSByZWN0YW5nbGUgdGhhdCBmaWxscyB0aGUgc3ZnIHNwYWNlIHNvIHRoYXQKICB6b29tIGV2ZW50cyBnZXQgY2FwdHVyZWQgb24gc2FmYXJpIC0tPgogICAgPHJlY3QgZmlsbD0id2hpdGUiIHdpZHRoPSIxMDAwMCIgaGVpZ2h0PSIxMDAwMCI+PC9yZWN0PgogICAgPGcgaWQ9InJvb3QiPjwvZz4KICA8L3N2Zz4KICA8dGYtZ3JhcGgtbWluaW1hcCBpZD0ibWluaW1hcCI+PC90Zi1ncmFwaC1taW5pbWFwPgogIDxkaXYgaWQ9ImNvbnRleHRNZW51IiBjbGFzcz0iY29udGV4dC1tZW51Ij48L2Rpdj4KYDtsZXQgSnF0PWNsYXNzIGV4dGVuZHMoZXIoaWwoeWUpKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX3pvb21lZD0hMSx0aGlzLl96b29tU3RhcnRDb29yZHM9bnVsbCx0aGlzLl96b29tVHJhbnNmb3JtPW51bGwsdGhpcy5fbWF4Wm9vbURpc3RhbmNlRm9yQ2xpY2s9MjAsdGhpcy5fbm9kZUdyb3VwSW5kZXg9e30sdGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXg9e30sdGhpcy5fZWRnZUdyb3VwSW5kZXg9e30sdGhpcy5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemU9OSx0aGlzLm1pbk1ldGFub2RlTGFiZWxMZW5ndGhGb250U2l6ZT02LHRoaXMubWF4TWV0YW5vZGVMYWJlbExlbmd0aExhcmdlRm9udD0xMSx0aGlzLm1heE1ldGFub2RlTGFiZWxMZW5ndGg9MTh9Z2V0Tm9kZSh0KXtyZXR1cm4gdGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZSh0KX1pc05vZGVFeHBhbmRlZCh0KXtyZXR1cm4gdC5leHBhbmRlZH1zZXROb2RlRXhwYW5kZWQodCl7dGhpcy5fYnVpbGQodGhpcy5yZW5kZXJIaWVyYXJjaHkpLHRoaXMuX3VwZGF0ZUxhYmVscyghdGhpcy5fem9vbWVkKX1wYW5Ub05vZGUodCl7KGZ1bmN0aW9uIGUodCxuLGkscil7Y29uc3Qgbz1TdShuKS5zZWxlY3QoYFtkYXRhLW5hbWU9IiR7dH0iXWApLm5vZGUoKTtpZighbylyZXR1cm4gY29uc29sZS53YXJuKGBwYW5Ub05vZGUoKSBmYWlsZWQgZm9yIG5vZGUgbmFtZSAiJHt0fSJgKSwhMTtsZXQgYT1vLmdldEJCb3goKSxzPW8uZ2V0U2NyZWVuQ1RNKCksbD1uLmNyZWF0ZVNWR1BvaW50KCksYz1uLmNyZWF0ZVNWR1BvaW50KCk7bC54PWEueCxsLnk9YS55LGMueD1hLngrYS53aWR0aCxjLnk9YS55K2EuaGVpZ2h0LGw9bC5tYXRyaXhUcmFuc2Zvcm0ocyksYz1jLm1hdHJpeFRyYW5zZm9ybShzKTtsZXQgdT0odCxlLG4saSk9PiEodD5uJiZlPGkpLGg9bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCBkPWgudG9wK2guaGVpZ2h0LTE1MDtpZih1KGwueCxjLngsaC5sZWZ0LGgubGVmdCtoLndpZHRoLTMyMCl8fHUobC55LGMueSxoLnRvcCxkKSl7bGV0IHQ9aC5sZWZ0K2gud2lkdGgvMi0obC54K2MueCkvMixlPWgudG9wK2guaGVpZ2h0LzItKGwueStjLnkpLzI7Y29uc3QgaT1iTihuKTtyZXR1cm4gU3UobikudHJhbnNpdGlvbigpLmR1cmF0aW9uKDUwMCkuY2FsbChyLnRyYW5zbGF0ZUJ5LHQvaS5rLGUvaS5rKSwhMH1yZXR1cm4hMX0pKHQsdGhpcy4kLnN2ZywwLHRoaXMuX3pvb20pJiYodGhpcy5fem9vbWVkPSEwKX1nZXRHcmFwaFN2Z1Jvb3QoKXtyZXR1cm4gdGhpcy4kLnN2Z31nZXRDb250ZXh0TWVudSgpe3JldHVybiB0aGlzLiQuY29udGV4dE1lbnV9X3Jlc2V0U3RhdGUoKXt0aGlzLl9ub2RlR3JvdXBJbmRleD17fSx0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleD17fSx0aGlzLl9lZGdlR3JvdXBJbmRleD17fSx0aGlzLl91cGRhdGVMYWJlbHMoITEpLFN1KHRoaXMuJC5zdmcpLnNlbGVjdCgiI3Jvb3QiKS5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKSxicXQodGhpcy4kLnN2Zyl9X2J1aWxkKHQpe3RoaXMudGVtcGxhdGVJbmRleD10LmhpZXJhcmNoeS5nZXRUZW1wbGF0ZUluZGV4KCksQ0d0KCJ0Zi1ncmFwaC1zY2VuZSAobGF5b3V0KToiLGZ1bmN0aW9uKCl7Uld0KHQucm9vdCl9LmJpbmQodGhpcyksX0d0LlJFTkRFUl9TQ0VORV9MQVlPVVQpLENHdCgidGYtZ3JhcGgtc2NlbmUgKGJ1aWxkIHNjZW5lKToiLGZ1bmN0aW9uKCl7THF0KFN1KHRoaXMuJC5yb290KSx0LnJvb3QsdGhpcyksKGZ1bmN0aW9uIGUodCxuKXtTdSh0KS5vbigiY2xpY2siLCgoKT0+e24uZmlyZSgiZ3JhcGgtc2VsZWN0Iil9KSl9KSh0aGlzLiQuc3ZnLHRoaXMpLHRoaXMuX3VwZGF0ZUlucHV0VHJhY2UoKX0uYmluZCh0aGlzKSxfR3QuUkVOREVSX1NDRU5FX0JVSUxEX1NDRU5FKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSGVhbHRoUGlsbHModGhpcy5ub2RlTmFtZXNUb0hlYWx0aFBpbGxzLHRoaXMuaGVhbHRoUGlsbFN0ZXBJbmRleCksdGhpcy5taW5pbWFwLnVwZGF0ZSgpfS5iaW5kKHRoaXMpLE5XdC5hbmltYXRpb24uZHVyYXRpb24pfXJlYWR5KCl7c3VwZXIucmVhZHkoKSx0aGlzLl96b29tPWtOKCkub24oImVuZCIsZnVuY3Rpb24oKXt0aGlzLl96b29tU3RhcnRDb29yZHMmJihNYXRoLnNxcnQoTWF0aC5wb3codGhpcy5fem9vbVN0YXJ0Q29vcmRzLngtdGhpcy5fem9vbVRyYW5zZm9ybS54LDIpK01hdGgucG93KHRoaXMuX3pvb21TdGFydENvb3Jkcy55LXRoaXMuX3pvb21UcmFuc2Zvcm0ueSwyKSk8dGhpcy5fbWF4Wm9vbURpc3RhbmNlRm9yQ2xpY2s/dGhpcy5fZmlyZUVuYWJsZUNsaWNrKCk6c2V0VGltZW91dCh0aGlzLl9maXJlRW5hYmxlQ2xpY2suYmluZCh0aGlzKSw1MCkpLHRoaXMuX3pvb21TdGFydENvb3Jkcz1udWxsfS5iaW5kKHRoaXMpKS5vbigiem9vbSIsZnVuY3Rpb24oKXt0aGlzLl96b29tVHJhbnNmb3JtPXV1LnRyYW5zZm9ybSx0aGlzLl96b29tU3RhcnRDb29yZHN8fCh0aGlzLl96b29tU3RhcnRDb29yZHM9dGhpcy5fem9vbVRyYW5zZm9ybSx0aGlzLmZpcmUoImRpc2FibGUtY2xpY2siKSksdGhpcy5fem9vbWVkPSEwLFN1KHRoaXMuJC5yb290KS5hdHRyKCJ0cmFuc2Zvcm0iLHV1LnRyYW5zZm9ybSksdGhpcy5taW5pbWFwLnpvb20odXUudHJhbnNmb3JtKX0uYmluZCh0aGlzKSksU3UodGhpcy4kLnN2ZykuY2FsbCh0aGlzLl96b29tKS5vbigiZGJsY2xpY2suem9vbSIsbnVsbCksU3Uod2luZG93KS5vbigicmVzaXplIixmdW5jdGlvbigpe3RoaXMubWluaW1hcC56b29tKCl9LmJpbmQodGhpcykpLHRoaXMubWluaW1hcD10aGlzLiQubWluaW1hcC5pbml0KHRoaXMuJC5zdmcsdGhpcy4kLnJvb3QsdGhpcy5fem9vbSxOV3QubWluaW1hcC5zaXplLE5XdC5zdWJzY2VuZS5tZXRhLmxhYmVsSGVpZ2h0KX1hdHRhY2hlZCgpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITApfWRldGFjaGVkKCl7dGhpcy5zZXQoIl9pc0F0dGFjaGVkIiwhMSl9X3JlbmRlckhpZXJhcmNoeUNoYW5nZWQoKXt2YXIgdD10aGlzLnJlbmRlckhpZXJhcmNoeTt0aGlzLl9oYXNSZW5kZXJIaWVyYXJjaHlCZWVuRml0T25jZT0hMSx0aGlzLl9yZXNldFN0YXRlKCksdGhpcy5fYnVpbGQodCl9X2FuaW1hdGVBbmRGaXQoKXshdGhpcy5faGFzUmVuZGVySGllcmFyY2h5QmVlbkZpdE9uY2UmJnRoaXMuX2lzQXR0YWNoZWQmJnNldFRpbWVvdXQodGhpcy5maXQuYmluZCh0aGlzKSxOV3QuYW5pbWF0aW9uLmR1cmF0aW9uKX1fdXBkYXRlTGFiZWxzKHQpe3ZhciBlPXRoaXMuJCQoIi50aXRsZSIpLG49ZS5zdHlsZSxpPXRoaXMuJCQoIi5hdXhUaXRsZSIpLHI9aS5zdHlsZSxvPXRoaXMuJCQoIi5mdW5jdGlvbkxpYnJhcnlUaXRsZSIpLnN0eWxlO2NvbnN0IGE9U3UodGhpcy4kLnN2Zyk7dmFyIHM9YS5zZWxlY3QoIi4iK1ZXdC5TY2VuZS5HUk9VUCsiPi4iK1ZXdC5TY2VuZS5DT1JFKS5ub2RlKCk7aWYodCYmcyYmdGhpcy5wcm9ncmVzcyYmMTAwPT09dGhpcy5wcm9ncmVzcy52YWx1ZSl7dmFyIGw9YS5zZWxlY3QoIi4iK1ZXdC5TY2VuZS5HUk9VUCsiPi4iK1ZXdC5TY2VuZS5JTkVYVFJBQ1QpLm5vZGUoKXx8YS5zZWxlY3QoIi4iK1ZXdC5TY2VuZS5HUk9VUCsiPi4iK1ZXdC5TY2VuZS5PVVRFWFRSQUNUKS5ub2RlKCksYz1zLmdldENUTSgpLmUsdT1sP2wuZ2V0Q1RNKCkuZTpudWxsO24uZGlzcGxheT0iaW5saW5lIixuLmxlZnQ9YysicHgiLG51bGwhPT11JiZ1IT09Yz8oci5kaXNwbGF5PSJpbmxpbmUiLHU9TWF0aC5tYXgoYytlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLHUpLHIubGVmdD11KyJweCIpOnIuZGlzcGxheT0ibm9uZSI7bGV0IHQ9YS5zZWxlY3QoIi4iK1ZXdC5TY2VuZS5HUk9VUCsiPi4iK1ZXdC5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKS5ub2RlKCksaD10P3QuZ2V0Q1RNKCkuZTpudWxsO251bGwhPT1oJiZoIT09dT8oby5kaXNwbGF5PSJpbmxpbmUiLGg9TWF0aC5tYXgodStpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLGgpLG8ubGVmdD1oKyJweCIpOm8uZGlzcGxheT0ibm9uZSJ9ZWxzZSBuLmRpc3BsYXk9Im5vbmUiLHIuZGlzcGxheT0ibm9uZSIsby5kaXNwbGF5PSJub25lIn1ub2RlQ29sb3JzQ2hhbmdlZCgpe251bGwhPXRoaXMucmVuZGVySGllcmFyY2h5JiYodGhpcy50ZW1wbGF0ZUluZGV4PXRoaXMucmVuZGVySGllcmFyY2h5LmhpZXJhcmNoeS5nZXRUZW1wbGF0ZUluZGV4KCksU2UuZXhwb3J0cy5lYWNoKHRoaXMuX25vZGVHcm91cEluZGV4LCgodCxlKT0+e3RoaXMuX3VwZGF0ZU5vZGVTdGF0ZShlKX0pKSx0aGlzLm1pbmltYXAudXBkYXRlKCkpfWZpdCgpe3RoaXMuX2hhc1JlbmRlckhpZXJhcmNoeUJlZW5GaXRPbmNlPSEwLChmdW5jdGlvbiB0KGUsbixpLHIpe2xldCBvPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYT1udWxsO3RyeXtpZihhPW4uZ2V0QkJveCgpLDA9PT1hLndpZHRoKXJldHVybn1jYXRjaCh0KXtyZXR1cm59bGV0IHM9LjkqTWF0aC5taW4oby53aWR0aC9hLndpZHRoLG8uaGVpZ2h0L2EuaGVpZ2h0LDIpLGw9Tld0LmdyYXBoO2NvbnN0IGM9dk4uc2NhbGUocykudHJhbnNsYXRlKGwucGFkZGluZy5wYWRkaW5nTGVmdCxsLnBhZGRpbmcucGFkZGluZ1RvcCk7U3UoZSkudHJhbnNpdGlvbigpLmR1cmF0aW9uKDUwMCkuY2FsbChpLnRyYW5zZm9ybSxjKS5vbigiZW5kLmZpdHRlZCIsKCgpPT57aS5vbigiZW5kLmZpdHRlZCIsbnVsbCkscigpfSkpfSkodGhpcy4kLnN2Zyx0aGlzLiQucm9vdCx0aGlzLl96b29tLGZ1bmN0aW9uKCl7dGhpcy5fem9vbWVkPSExfS5iaW5kKHRoaXMpKX1nZXRJbWFnZUJsb2IoKXtyZXR1cm4gdGhpcy5taW5pbWFwLmdldEltYWdlQmxvYigpfWlzTm9kZVNlbGVjdGVkKHQpe3JldHVybiB0PT09dGhpcy5zZWxlY3RlZE5vZGV9aXNOb2RlSGlnaGxpZ2h0ZWQodCl7cmV0dXJuIHQ9PT10aGlzLmhpZ2hsaWdodGVkTm9kZX1hZGRBbm5vdGF0aW9uR3JvdXAodCxlLG4pe3ZhciBpPXQubm9kZS5uYW1lO3RoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2ldPXRoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2ldfHx7fSx0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleFtpXVtlLm5vZGUubmFtZV09bn1nZXRBbm5vdGF0aW9uR3JvdXBzSW5kZXgodCl7cmV0dXJuIHRoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W3RdfXJlbW92ZUFubm90YXRpb25Hcm91cCh0LGUpe2RlbGV0ZSB0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleFt0Lm5vZGUubmFtZV1bZS5ub2RlLm5hbWVdfWFkZE5vZGVHcm91cCh0LGUpe3RoaXMuX25vZGVHcm91cEluZGV4W3RdPWV9Z2V0Tm9kZUdyb3VwKHQpe3JldHVybiB0aGlzLl9ub2RlR3JvdXBJbmRleFt0XX1yZW1vdmVOb2RlR3JvdXAodCl7ZGVsZXRlIHRoaXMuX25vZGVHcm91cEluZGV4W3RdfWFkZEVkZ2VHcm91cCh0LGUpe3RoaXMuX2VkZ2VHcm91cEluZGV4W3RdPWV9Z2V0RWRnZUdyb3VwKHQpe3JldHVybiB0aGlzLl9lZGdlR3JvdXBJbmRleFt0XX1fdXBkYXRlSGVhbHRoUGlsbHMoKXshKGZ1bmN0aW9uIHQoZSxuLGkpe2lmKCFuKXJldHVybjtsZXQgcj0xO1N1KGUpLnNlbGVjdEFsbCgiZy5ub2Rlc2hhcGUiKS5lYWNoKChmdW5jdGlvbih0KXtjb25zdCBlPW5bdC5ub2RlLm5hbWVdOyEoZnVuY3Rpb24gbyh0LGUsbixpLHI9NjAsYT0xMCxzPTAsbCl7aWYoU3UodC5wYXJlbnROb2RlKS5zZWxlY3RBbGwoIi5oZWFsdGgtcGlsbCIpLnJlbW92ZSgpLCFlKXJldHVybjtjb25zdCBjPWUudmFsdWUsdT1jLnNsaWNlKDIsOCksaD11WzBdLGQ9dVsxXSxwPXVbNV07bGV0IGY9Y1sxXTtjb25zdCBtPXttaW46Y1s4XSxtYXg6Y1s5XSxtZWFuOmNbMTBdLHN0ZGRldjpNYXRoLnNxcnQoY1sxMV0pfTtudWxsPT1yJiYocj02MCksbnVsbD09YSYmKGE9MTApLG51bGw9PXMmJihzPTApLG51bGwhPW4mJm4ubm9kZS50eXBlPT09akd0Lk9QJiYoci89MixhLz0yKTtsZXQgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoYkd0LCJnIik7Zy5jbGFzc0xpc3QuYWRkKCJoZWFsdGgtcGlsbCIpO2xldCBfPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhiR3QsImRlZnMiKTtnLmFwcGVuZENoaWxkKF8pO2xldCB5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhiR3QsImxpbmVhckdyYWRpZW50Iik7Y29uc3Qgdj0iaGVhbHRoLXBpbGwtZ3JhZGllbnQtIitpO3kuc2V0QXR0cmlidXRlKCJpZCIsdik7bGV0IGI9MCx4PSIwJSI7Zm9yKGxldCB0PTA7dDx1Lmxlbmd0aDt0Kyspe2lmKCF1W3RdKWNvbnRpbnVlO2IrPXVbdF07bGV0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGJHdCwic3RvcCIpO2Uuc2V0QXR0cmlidXRlKCJvZmZzZXQiLHgpLGUuc2V0QXR0cmlidXRlKCJzdG9wLWNvbG9yIixVV3RbdF0uYmFja2dyb3VuZF9jb2xvcikseS5hcHBlbmRDaGlsZChlKTtsZXQgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoYkd0LCJzdG9wIiksaT0xMDAqYi9mKyIlIjtuLnNldEF0dHJpYnV0ZSgib2Zmc2V0IixpKSxuLnNldEF0dHJpYnV0ZSgic3RvcC1jb2xvciIsVVd0W3RdLmJhY2tncm91bmRfY29sb3IpLHkuYXBwZW5kQ2hpbGQobikseD1pfV8uYXBwZW5kQ2hpbGQoeSk7bGV0IHc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGJHdCwicmVjdCIpO3cuc2V0QXR0cmlidXRlKCJmaWxsIiwidXJsKCMiK3YrIikiKSx3LnNldEF0dHJpYnV0ZSgid2lkdGgiLFN0cmluZyhyKSksdy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsU3RyaW5nKGEpKSx3LnNldEF0dHJpYnV0ZSgieSIsU3RyaW5nKHMpKSxnLmFwcGVuZENoaWxkKHcpO2xldCBTPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhiR3QsInRpdGxlIik7Uy50ZXh0Q29udGVudD0oZnVuY3Rpb24gTSh0LGUsbixpKXtsZXQgcj0iRGV2aWNlOiAiK3QuZGV2aWNlX25hbWUrIlxuIjtyKz0iZHR5cGU6ICIrdC5kdHlwZSsiXG4iO2xldCBvPSIoc2NhbGFyKSI7dC5zaGFwZS5sZW5ndGg+MCYmKG89IigiK3Quc2hhcGUuam9pbigiLCIpKyIpIikscis9Ilxuc2hhcGU6ICIrbysiXG5cbiIscis9IiMoZWxlbWVudHMpOiAiK2UrIlxuIjtjb25zdCBhPVtdO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKW5bdF0+MCYmYS5wdXNoKCIjKCIrVVd0W3RdLmxhYmVsKyIpOiAiK25bdF0pO3JldHVybiByKz1hLmpvaW4oIiwgIikrIlxuXG4iLGkubWF4Pj1pLm1pbiYmKHIrPSJtaW46ICIraS5taW4rIiwgbWF4OiAiK2kubWF4KyJcbiIscis9Im1lYW46ICIraS5tZWFuKyIsIHN0ZGRldjogIitpLnN0ZGRldikscn0pKGUsZix1LG0pLGcuYXBwZW5kQ2hpbGQoUyk7bGV0IEU9ITE7aWYobnVsbCE9bil7bGV0IHQ9bi55LWEtbi5oZWlnaHQvMi0yO2lmKG4ubGFiZWxPZmZzZXQ8MCYmKHQrPW4ubGFiZWxPZmZzZXQpLGcuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIisobi54LXIvMikrIiwgIit0KyIpIiksdVsyXXx8dVszXXx8dVs0XSl7bGV0IHQ9bi5ub2RlLmF0dHI7aWYodCYmdC5sZW5ndGgpZm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspaWYoIlQiPT09dFtlXS5rZXkpe2xldCBuPXRbZV0udmFsdWUudHlwZTtFPW4mJi9eRFRfKEJPT0x8SU5UfFVJTlQpLy50ZXN0KG4pO2JyZWFrfX19bGV0IFQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGJHdCwidGV4dCIpO2lmKE51bWJlci5pc0Zpbml0ZShtLm1pbikmJk51bWJlci5pc0Zpbml0ZShtLm1heCkpe2NvbnN0IHQ9cVd0KG0ubWluLEUpLGU9cVd0KG0ubWF4LEUpO2lmKFQudGV4dENvbnRlbnQ9Zj4xP3QrIiB+ICIrZTp0LGg+MHx8ZD4wfHxwPjApe1QudGV4dENvbnRlbnQrPSIgKCI7Y29uc3QgdD1bXTtoPjAmJnQucHVzaChgTmFOw5cke2h9YCksZD4wJiZ0LnB1c2goYC3iiJ7DlyR7ZH1gKSxwPjAmJnQucHVzaChgK+KInsOXJHtwfWApLFQudGV4dENvbnRlbnQrPXQuam9pbigiOyAiKSsiKSJ9fWVsc2UgVC50ZXh0Q29udGVudD0iKE5vIGZpbml0ZSBlbGVtZW50cykiO1QuY2xhc3NMaXN0LmFkZCgiaGVhbHRoLXBpbGwtc3RhdHMiKSxudWxsPT1sJiYobD1yLzIpLFQuc2V0QXR0cmlidXRlKCJ4IixTdHJpbmcobCkpLFQuc2V0QXR0cmlidXRlKCJ5IixTdHJpbmcocy0yKSksZy5hcHBlbmRDaGlsZChUKSxZaSh0LnBhcmVudE5vZGUpLmFwcGVuZENoaWxkKGcpfSkodGhpcyxlP2VbaV06bnVsbCx0LHIrKyl9KSl9KSh0aGlzLiQuc3ZnLHRoaXMubm9kZU5hbWVzVG9IZWFsdGhQaWxscyx0aGlzLmhlYWx0aFBpbGxTdGVwSW5kZXgpfV91cGRhdGVOb2RlU3RhdGUodCl7dmFyIGU9dGhpcy5nZXROb2RlKHQpLG49dGhpcy5nZXROb2RlR3JvdXAodCk7biYmd3F0KG4sZSx0aGlzKSxlLm5vZGUudHlwZT09PWpHdC5NRVRBJiZlLm5vZGUuYXNzb2NpYXRlZEZ1bmN0aW9uJiYhZS5pc0xpYnJhcnlGdW5jdGlvbiYmd3F0KFN1KCIuIitWV3QuU2NlbmUuR1JPVVArIj4uIitWV3QuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSsnIGdbZGF0YS1uYW1lPSInKyhWR3QrZS5ub2RlLmFzc29jaWF0ZWRGdW5jdGlvbikrJyJdJyksZSx0aGlzKTt2YXIgaT10aGlzLmdldEFubm90YXRpb25Hcm91cHNJbmRleCh0KTtTZS5leHBvcnRzLmVhY2goaSwoKHQsbik9Pnt3cXQodCxlLHRoaXMsVld0LkFubm90YXRpb24uTk9ERSl9KSl9X3NlbGVjdGVkTm9kZUNoYW5nZWQodCxlKXtpZih0IT09ZSYmKGUmJnRoaXMuX3VwZGF0ZU5vZGVTdGF0ZShlKSx0KSl7dGhpcy5taW5pbWFwLnVwZGF0ZSgpO2Zvcih2YXIgbixpPXRoaXMucmVuZGVySGllcmFyY2h5LmhpZXJhcmNoeS5ub2RlKHQpLHI9W107bnVsbCE9aS5wYXJlbnROb2RlJiZpLnBhcmVudE5vZGUubmFtZSE9Rkd0OylyLnB1c2goKGk9aS5wYXJlbnROb2RlKS5uYW1lKTtTZS5leHBvcnRzLmZvckVhY2hSaWdodChyLCh0PT57dGhpcy5yZW5kZXJIaWVyYXJjaHkuYnVpbGRTdWJoaWVyYXJjaHkodCk7dmFyIGU9dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZSh0KTtlLm5vZGUuaXNHcm91cE5vZGUmJiFlLmV4cGFuZGVkJiYoZS5leHBhbmRlZD0hMCxufHwobj1lKSl9KSksbiYmKHRoaXMuc2V0Tm9kZUV4cGFuZGVkKG4pLHRoaXMuX3pvb21lZD0hMCksdCYmdGhpcy5fdXBkYXRlTm9kZVN0YXRlKHQpLHNldFRpbWVvdXQoKCgpPT57dGhpcy5wYW5Ub05vZGUodCl9KSxOV3QuYW5pbWF0aW9uLmR1cmF0aW9uKX19X2hpZ2hsaWdodGVkTm9kZUNoYW5nZWQodCxlKXt0IT09ZSYmKHQmJnRoaXMuX3VwZGF0ZU5vZGVTdGF0ZSh0KSxlJiZ0aGlzLl91cGRhdGVOb2RlU3RhdGUoZSkpfV9vblpvb21DaGFuZ2VkKCl7dGhpcy5fdXBkYXRlTGFiZWxzKCF0aGlzLl96b29tZWQpfV9maXJlRW5hYmxlQ2xpY2soKXt0aGlzLmZpcmUoImVuYWJsZS1jbGljayIpfV91cGRhdGVJbnB1dFRyYWNlKCl7TXF0KHRoaXMuZ2V0R3JhcGhTdmdSb290KCksdGhpcy5yZW5kZXJIaWVyYXJjaHksdGhpcy5zZWxlY3RlZE5vZGUsdGhpcy50cmFjZUlucHV0cyl9fTtKcXQudGVtcGxhdGU9WnF0LHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLHlXdCldLEpxdC5wcm90b3R5cGUsInJlbmRlckhpZXJhcmNoeSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxKcXQucHJvdG90eXBlLCJuYW1lIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLEpxdC5wcm90b3R5cGUsImNvbG9yQnkiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxKcXQucHJvdG90eXBlLCJ0cmFjZUlucHV0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLEpxdC5wcm90b3R5cGUsIl9oYXNSZW5kZXJIaWVyYXJjaHlCZWVuRml0T25jZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLEpxdC5wcm90b3R5cGUsIl9pc0F0dGFjaGVkIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEpxdC5wcm90b3R5cGUsIl96b29tIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfaGlnaGxpZ2h0ZWROb2RlQ2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sSnF0LnByb3RvdHlwZSwiaGlnaGxpZ2h0ZWROb2RlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfc2VsZWN0ZWROb2RlQ2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sSnF0LnByb3RvdHlwZSwic2VsZWN0ZWROb2RlIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEpxdC5wcm90b3R5cGUsImhhbmRsZUVkZ2VTZWxlY3RlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9vblpvb21DaGFuZ2VkIn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sSnF0LnByb3RvdHlwZSwiX3pvb21lZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxKcXQucHJvdG90eXBlLCJfem9vbVN0YXJ0Q29vcmRzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEpxdC5wcm90b3R5cGUsIl96b29tVHJhbnNmb3JtIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLEpxdC5wcm90b3R5cGUsIl9tYXhab29tRGlzdGFuY2VGb3JDbGljayIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLEpxdC5wcm90b3R5cGUsInRlbXBsYXRlSW5kZXgiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sSnF0LnByb3RvdHlwZSwiX25vZGVHcm91cEluZGV4Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEpxdC5wcm90b3R5cGUsIl9hbm5vdGF0aW9uR3JvdXBJbmRleCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxKcXQucHJvdG90eXBlLCJfZWRnZUdyb3VwSW5kZXgiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sSnF0LnByb3RvdHlwZSwibWF4TWV0YW5vZGVMYWJlbExlbmd0aEZvbnRTaXplIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLEpxdC5wcm90b3R5cGUsIm1pbk1ldGFub2RlTGFiZWxMZW5ndGhGb250U2l6ZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxKcXQucHJvdG90eXBlLCJtYXhNZXRhbm9kZUxhYmVsTGVuZ3RoTGFyZ2VGb250Iix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLEpxdC5wcm90b3R5cGUsIm1heE1ldGFub2RlTGFiZWxMZW5ndGgiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sSnF0LnByb3RvdHlwZSwicHJvZ3Jlc3MiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLEpxdC5wcm90b3R5cGUsIm5vZGVDb250ZXh0TWVudUl0ZW1zIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEpxdC5wcm90b3R5cGUsIm5vZGVOYW1lc1RvSGVhbHRoUGlsbHMiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sSnF0LnByb3RvdHlwZSwiaGVhbHRoUGlsbFN0ZXBJbmRleCIsdm9pZCAwKSx0KFthKCJyZW5kZXJIaWVyYXJjaHkiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLEpxdC5wcm90b3R5cGUsIl9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkIixudWxsKSx0KFthKCJfaXNBdHRhY2hlZCIsInJlbmRlckhpZXJhcmNoeSIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sSnF0LnByb3RvdHlwZSwiX2FuaW1hdGVBbmRGaXQiLG51bGwpLHQoW2EoImNvbG9yQnkiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLEpxdC5wcm90b3R5cGUsIm5vZGVDb2xvcnNDaGFuZ2VkIixudWxsKSx0KFthKCJub2RlTmFtZXNUb0hlYWx0aFBpbGxzIiwiaGVhbHRoUGlsbFN0ZXBJbmRleCIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sSnF0LnByb3RvdHlwZSwiX3VwZGF0ZUhlYWx0aFBpbGxzIixudWxsKSx0KFthKCJ0cmFjZUlucHV0cyIsInNlbGVjdGVkTm9kZSIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sSnF0LnByb3RvdHlwZSwiX3VwZGF0ZUlucHV0VHJhY2UiLG51bGwpLEpxdD10KFtpKCJ0Zi1ncmFwaC1zY2VuZSIpXSxKcXQpO2xldCBRcXQ9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9yZW5kZXJEZXB0aD0xLHRoaXMuX2FsbG93R3JhcGhTZWxlY3Q9ITAsdGhpcy5lZGdlV2lkdGhGdW5jdGlvbj0iIix0aGlzLmhhbmRsZU5vZGVTZWxlY3RlZD0iIix0aGlzLmVkZ2VMYWJlbEZ1bmN0aW9uPSIiLHRoaXMuaGFuZGxlRWRnZVNlbGVjdGVkPSIifXBhblRvTm9kZSh0KXt0aGlzLiQkKCJ0Zi1ncmFwaC1zY2VuZSIpLnBhblRvTm9kZSh0KX1fYXV0b0V4dHJhY3ROb2Rlc0NoYW5nZWQoKXt2YXIgdD10aGlzLmdyYXBoSGllcmFyY2h5O2lmKHQpe2Zvcihjb25zdCBlIG9mIE9iamVjdC52YWx1ZXModC5nZXROb2RlTWFwKCkpKWUuaW5jbHVkZT1HR3QuVU5TUEVDSUZJRUQ7dGhpcy5fYnVpbGRSZW5kZXJIaWVyYXJjaHkodCl9fV9idWlsZE5ld1JlbmRlckhpZXJhcmNoeSgpe3ZhciB0PXRoaXMuZ3JhcGhIaWVyYXJjaHk7dCYmdGhpcy5fYnVpbGRSZW5kZXJIaWVyYXJjaHkodCl9X3N0YXRzQ2hhbmdlZCgpe3ZhciB0PXRoaXMuc3RhdHMsZT10aGlzLmRldmljZXNGb3JTdGF0czt0aGlzLmdyYXBoSGllcmFyY2h5JiYodCYmZSYmKChmdW5jdGlvbiBuKHQsZSxpKXtTZS5leHBvcnRzLmVhY2godC5ub2RlcywodD0+e3Quc3RhdHM9bnVsbH0pKSxTZS5leHBvcnRzLmVhY2goZS5kZXZfc3RhdHMsKGU9PntpJiYhaVtlLmRldmljZV18fFNlLmV4cG9ydHMuZWFjaChlLm5vZGVfc3RhdHMsKG49PntsZXQgaT1uLm5vZGVfbmFtZSBpbiB0Lm5vZGVzP24ubm9kZV9uYW1lOnNXdChuLm5vZGVfbmFtZSk7aWYoIShpIGluIHQubm9kZXMpKXJldHVybjtsZXQgcj0wO24ubWVtb3J5JiZTZS5leHBvcnRzLmVhY2gobi5tZW1vcnksKHQ9Pnt0LnRvdGFsX2J5dGVzJiYodC50b3RhbF9ieXRlcz4wP3IrPU51bWJlcih0LnRvdGFsX2J5dGVzKTpjb25zb2xlLmxvZygiaWdub3JpbmcgbmVnYXRpdmUgbWVtb3J5IGFsbG9jYXRpb24gZm9yICIraSkpfSkpO2xldCBvPW51bGw7bi5vdXRwdXQmJihvPVNlLmV4cG9ydHMubWFwKG4ub3V0cHV0LCh0PT5TZS5leHBvcnRzLm1hcCh0LnRlbnNvcl9kZXNjcmlwdGlvbi5zaGFwZS5kaW0sKHQ9Pk51bWJlcih0LnNpemUpKSkpKSksdC5ub2Rlc1tpXS5kZXZpY2U9ZS5kZXZpY2UsbnVsbD09dC5ub2Rlc1tpXS5zdGF0cyYmKHQubm9kZXNbaV0uc3RhdHM9bmV3IFNHdChvKSksdC5ub2Rlc1tpXS5zdGF0cy5hZGRCeXRlc0FsbG9jYXRpb24ociksbi5hbGxfZW5kX3JlbF9taWNyb3MmJihuLmFsbF9lbmRfcmVsX21pY3Jvcz4wP3Qubm9kZXNbaV0uc3RhdHMuYWRkRXhlY3V0aW9uVGltZShuLmFsbF9zdGFydF9taWNyb3Msbi5hbGxfc3RhcnRfbWljcm9zK24uYWxsX2VuZF9yZWxfbWljcm9zKTpjb25zb2xlLmxvZygiaWdub3JpbmcgbmVnYXRpdmUgcnVudGltZSBmb3IgIitpKSl9KSl9KSl9KSh0aGlzLmJhc2ljR3JhcGgsdCxlKSwoZnVuY3Rpb24gaSh0LGUpe2xldCBuPXt9LGk9e307U2UuZXhwb3J0cy5lYWNoKHQucm9vdC5sZWF2ZXMoKSwoZT0+e2xldCByPXQubm9kZShlKTtudWxsIT1yLmRldmljZSYmKG5bci5kZXZpY2VdPSEwKSxudWxsIT1yLnhsYUNsdXN0ZXImJihpW3IueGxhQ2x1c3Rlcl09ITApfSkpLHQuZGV2aWNlcz1TZS5leHBvcnRzLmtleXMobiksdC54bGFDbHVzdGVycz1TZS5leHBvcnRzLmtleXMoaSksU2UuZXhwb3J0cy5lYWNoKHQuZ2V0Tm9kZU1hcCgpLCgodCxlKT0+e3QuaXNHcm91cE5vZGUmJih0LnN0YXRzPW5ldyBTR3QobnVsbCksdC5kZXZpY2VIaXN0b2dyYW09e30pfSkpLFNlLmV4cG9ydHMuZWFjaCh0LnJvb3QubGVhdmVzKCksKGU9PntsZXQgbj10Lm5vZGUoZSksaT1uO2Zvcig7bnVsbCE9aS5wYXJlbnROb2RlOyl7aWYobnVsbCE9bi5kZXZpY2Upe2xldCB0PWkucGFyZW50Tm9kZS5kZXZpY2VIaXN0b2dyYW07dFtuLmRldmljZV09KHRbbi5kZXZpY2VdfHwwKSsxfWlmKG51bGwhPW4ueGxhQ2x1c3Rlcil7bGV0IHQ9aS5wYXJlbnROb2RlLnhsYUNsdXN0ZXJIaXN0b2dyYW07dFtuLnhsYUNsdXN0ZXJdPSh0W24ueGxhQ2x1c3Rlcl18fDApKzF9bnVsbCE9bi5zdGF0cyYmaS5wYXJlbnROb2RlLnN0YXRzLmNvbWJpbmUobi5zdGF0cyksaT1pLnBhcmVudE5vZGV9fSkpfSkodGhpcy5ncmFwaEhpZXJhcmNoeSkpLHRoaXMuX2J1aWxkUmVuZGVySGllcmFyY2h5KHRoaXMuZ3JhcGhIaWVyYXJjaHkpKX1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJncmFwaC1zZWxlY3QiLHRoaXMuX2dyYXBoU2VsZWN0ZWQuYmluZCh0aGlzKSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJkaXNhYmxlLWNsaWNrIix0aGlzLl9kaXNhYmxlQ2xpY2suYmluZCh0aGlzKSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJlbmFibGUtY2xpY2siLHRoaXMuX2VuYWJsZUNsaWNrLmJpbmQodGhpcykpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigibm9kZS10b2dnbGUtZXhwYW5kIix0aGlzLl9ub2RlVG9nZ2xlRXhwYW5kLmJpbmQodGhpcykpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigibm9kZS1zZWxlY3QiLHRoaXMuX25vZGVTZWxlY3RlZC5iaW5kKHRoaXMpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoIm5vZGUtaGlnaGxpZ2h0Iix0aGlzLl9ub2RlSGlnaGxpZ2h0ZWQuYmluZCh0aGlzKSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJub2RlLXVuaGlnaGxpZ2h0Iix0aGlzLl9ub2RlVW5oaWdobGlnaHRlZC5iaW5kKHRoaXMpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoIm5vZGUtdG9nZ2xlLWV4dHJhY3QiLHRoaXMuX25vZGVUb2dnbGVFeHRyYWN0LmJpbmQodGhpcykpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigibm9kZS10b2dnbGUtc2VyaWVzZ3JvdXAiLHRoaXMuX25vZGVUb2dnbGVTZXJpZXNHcm91cC5iaW5kKHRoaXMpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImVkZ2Utc2VsZWN0Iix0aGlzLl9lZGdlU2VsZWN0ZWQuYmluZCh0aGlzKSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJhbm5vdGF0aW9uLXNlbGVjdCIsdGhpcy5fbm9kZVNlbGVjdGVkLmJpbmQodGhpcykpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiYW5ub3RhdGlvbi1oaWdobGlnaHQiLHRoaXMuX25vZGVIaWdobGlnaHRlZC5iaW5kKHRoaXMpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImFubm90YXRpb24tdW5oaWdobGlnaHQiLHRoaXMuX25vZGVVbmhpZ2hsaWdodGVkLmJpbmQodGhpcykpfV9idWlsZFJlbmRlckhpZXJhcmNoeSh0KXtpZih0LnJvb3QudHlwZSE9PWpHdC5NRVRBKXJldHVybjtjb25zdCBlPXRoaXMsbj1DR3QoIm5ldyB0Zl9ncmFwaF9yZW5kZXIuSGllcmFyY2h5IiwoKCk9Pntjb25zdCBuPW5ldyB5V3QodCwhIXRoaXMuc3RhdHMsdGhpcy5hdXRvRXh0cmFjdE5vZGVzKTtmdW5jdGlvbiBpKHQpe3JldHVybnttaW5WYWx1ZTp0LmRvbWFpbigpWzBdLG1heFZhbHVlOnQuZG9tYWluKClbMV0sc3RhcnRDb2xvcjp0LnJhbmdlKClbMF0sZW5kQ29sb3I6dC5yYW5nZSgpWzFdfX1yZXR1cm4gbi5lZGdlTGFiZWxGdW5jdGlvbj10aGlzLmVkZ2VMYWJlbEZ1bmN0aW9uLG4uZWRnZVdpZHRoRnVuY3Rpb249dGhpcy5lZGdlV2lkdGhGdW5jdGlvbixlLl9zZXRDb2xvckJ5UGFyYW1zKHtjb21wdXRlX3RpbWU6aShuLmNvbXB1dGVUaW1lU2NhbGUpLG1lbW9yeTppKG4ubWVtb3J5VXNhZ2VTY2FsZSksZGV2aWNlOlNlLmV4cG9ydHMubWFwKG4uZGV2aWNlQ29sb3JNYXAuZG9tYWluKCksKGZ1bmN0aW9uKHQpe3JldHVybntkZXZpY2U6dCxjb2xvcjpuLmRldmljZUNvbG9yTWFwKHQpfX0pKSx4bGFfY2x1c3RlcjpTZS5leHBvcnRzLm1hcChuLnhsYUNsdXN0ZXJDb2xvck1hcC5kb21haW4oKSwoZnVuY3Rpb24odCl7cmV0dXJue3hsYV9jbHVzdGVyOnQsY29sb3I6bi54bGFDbHVzdGVyQ29sb3JNYXAodCl9fSkpfSksbn0pLF9HdC5SRU5ERVJfQlVJTERfSElFUkFSQ0hZKTtlLl9zZXRSZW5kZXJIaWVyYXJjaHkobil9X2dldFZpc2libGUodCl7cmV0dXJuIHQ/dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0TmVhcmVzdFZpc2libGVBbmNlc3Rvcih0KTp0fWZpdCgpe3RoaXMuJC5zY2VuZS5maXQoKX1nZXRJbWFnZUJsb2IoKXtyZXR1cm4gdGhpcy4kLnNjZW5lLmdldEltYWdlQmxvYigpfV9ncmFwaENoYW5nZWQoKXt0aGlzLmdyYXBoSGllcmFyY2h5JiYodGhpcy5ncmFwaEhpZXJhcmNoeS5hZGRMaXN0ZW5lcih6cXQuVEVNUExBVEVTX1VQREFURUQsKCgpPT57dGhpcy4kLnNjZW5lLm5vZGVDb2xvcnNDaGFuZ2VkKCl9KSksdGhpcy5maXJlKCJncmFwaC1zZWxlY3QiKSl9X2dyYXBoU2VsZWN0ZWQodCl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdCYmKHRoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLG51bGwpLHRoaXMuc2V0KCJzZWxlY3RlZEVkZ2UiLG51bGwpKSx0aGlzLl9hbGxvd0dyYXBoU2VsZWN0PSEwfV9kaXNhYmxlQ2xpY2sodCl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMX1fZW5hYmxlQ2xpY2sodCl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMH1fc2VsZWN0ZWROb2RlQ2hhbmdlZCgpe3RoaXMuaGFuZGxlTm9kZVNlbGVjdGVkJiZ0aGlzLmhhbmRsZU5vZGVTZWxlY3RlZCh0aGlzLnNlbGVjdGVkTm9kZSl9X3NlbGVjdGVkRWRnZUNoYW5nZWQoKXt2YXIgdD10aGlzLnNlbGVjdGVkRWRnZTt0aGlzLl9kZXNlbGVjdFByZXZpb3VzRWRnZSgpLHQmJih0aGlzLl9sYXN0U2VsZWN0ZWRFZGdlR3JvdXAuY2xhc3NlZChWV3QuRWRnZS5TRUxFQ1RFRCwhMCksdGhpcy5fdXBkYXRlTWFya2VyT2ZTZWxlY3RlZEVkZ2UodCkpLHRoaXMuaGFuZGxlRWRnZVNlbGVjdGVkJiZ0aGlzLmhhbmRsZUVkZ2VTZWxlY3RlZCh0KX1fbm9kZVNlbGVjdGVkKHQpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3QmJnRoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLHQuZGV0YWlsLm5hbWUpLHRoaXMuX2FsbG93R3JhcGhTZWxlY3Q9ITB9X2VkZ2VTZWxlY3RlZCh0KXt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0JiYodGhpcy5zZXQoIl9sYXN0U2VsZWN0ZWRFZGdlR3JvdXAiLHQuZGV0YWlsLmVkZ2VHcm91cCksdGhpcy5zZXQoInNlbGVjdGVkRWRnZSIsdC5kZXRhaWwuZWRnZURhdGEpKSx0aGlzLl9hbGxvd0dyYXBoU2VsZWN0PSEwfV9ub2RlSGlnaGxpZ2h0ZWQodCl7dGhpcy5zZXQoImhpZ2hsaWdodGVkTm9kZSIsdC5kZXRhaWwubmFtZSl9X25vZGVVbmhpZ2hsaWdodGVkKHQpe3RoaXMuc2V0KCJoaWdobGlnaHRlZE5vZGUiLG51bGwpfV9ub2RlVG9nZ2xlRXhwYW5kKHQpe3RoaXMuX25vZGVTZWxlY3RlZCh0KTt2YXIgZT10LmRldGFpbC5uYW1lLG49dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShlKTtuLm5vZGUudHlwZSE9PWpHdC5PUCYmKHRoaXMucmVuZGVySGllcmFyY2h5LmJ1aWxkU3ViaGllcmFyY2h5KGUpLG4uZXhwYW5kZWQ9IW4uZXhwYW5kZWQsdGhpcy5hc3luYygoZnVuY3Rpb24oKXt0aGlzLiQuc2NlbmUuc2V0Tm9kZUV4cGFuZGVkKG4pfSksNzUpLFRHdCh7YWN0aW9uSWQ6X0d0Lk5PREVfRVhQQU5TSU9OX1RPR0dMRUQsZXZlbnRMYWJlbDpuLmV4cGFuZGVkPyJleHBhbmRlZCI6ImNvbGxhcHNlZCJ9KSl9X25vZGVUb2dnbGVFeHRyYWN0KHQpe3RoaXMubm9kZVRvZ2dsZUV4dHJhY3QodC5kZXRhaWwubmFtZSl9bm9kZVRvZ2dsZUV4dHJhY3QodCl7Y29uc3QgZT10aGlzLnJlbmRlckhpZXJhcmNoeS5nZXRSZW5kZXJOb2RlQnlOYW1lKHQpO2Uubm9kZS5pbmNsdWRlPWUubm9kZS5pbmNsdWRlPT1HR3QuSU5DTFVERT9HR3QuRVhDTFVERTplLm5vZGUuaW5jbHVkZT09R0d0LkVYQ0xVREV8fHRoaXMucmVuZGVySGllcmFyY2h5LmlzTm9kZUF1eGlsaWFyeShlKT9HR3QuSU5DTFVERTpHR3QuRVhDTFVERSx0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0aGlzLmdyYXBoSGllcmFyY2h5KSxUR3Qoe2FjdGlvbklkOl9HdC5OT0RFX0FVWElMSUFSWV9FWFRSQUNUSU9OX0NIQU5HRUQsZXZlbnRMYWJlbDplLm5vZGUuaW5jbHVkZT09PUdHdC5JTkNMVURFPyJBdXhpbGlhcnkgdG8gTWFpbiI6Ik1haW4gdG8gQXV4aWxpYXJ5In0pfV9ub2RlVG9nZ2xlU2VyaWVzR3JvdXAodCl7dGhpcy5ub2RlVG9nZ2xlU2VyaWVzR3JvdXAodC5kZXRhaWwubmFtZSl9bm9kZVRvZ2dsZVNlcmllc0dyb3VwKHQpe3RoaXMuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOjAsbXNnOiIifSk7dmFyIGU9a0d0KEFHdCh0aGlzKSwxMDAsIk5hbWVzcGFjZSBoaWVyYXJjaHkiKTtjb25zdCBuPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0aGlzLmhpZXJhcmNoeVBhcmFtcykse3Nlcmllc01hcDp0aGlzLmdyYXBoSGllcmFyY2h5LmJ1aWxkU2VyaWVzR3JvdXBNYXBUb2dnbGVkKHQpfSk7RnF0KHRoaXMuYmFzaWNHcmFwaCxuLGUpLnRoZW4oZnVuY3Rpb24odCl7dGhpcy5zZXQoImdyYXBoSGllcmFyY2h5Iix0KSx0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0aGlzLmdyYXBoSGllcmFyY2h5KX0uYmluZCh0aGlzKSl9X2Rlc2VsZWN0UHJldmlvdXNFZGdlKCl7U3UoIi4iK1ZXdC5FZGdlLlNFTEVDVEVEKS5jbGFzc2VkKFZXdC5FZGdlLlNFTEVDVEVELCExKS5lYWNoKCgodCxlKT0+e2lmKHQubGFiZWwpe2NvbnN0IGU9U3UodGhpcykuc2VsZWN0QWxsKCJwYXRoLmVkZ2VsaW5lIik7dC5sYWJlbC5zdGFydE1hcmtlcklkJiZlLnN0eWxlKCJtYXJrZXItc3RhcnQiLGB1cmwoIyR7dC5sYWJlbC5zdGFydE1hcmtlcklkfSlgKSx0LmxhYmVsLmVuZE1hcmtlcklkJiZlLnN0eWxlKCJtYXJrZXItZW5kIixgdXJsKCMke3QubGFiZWwuZW5kTWFya2VySWR9KWApfX0pKX1fdXBkYXRlTWFya2VyT2ZTZWxlY3RlZEVkZ2UodCl7aWYodC5sYWJlbCl7Y29uc3QgZT10LmxhYmVsLnN0YXJ0TWFya2VySWR8fHQubGFiZWwuZW5kTWFya2VySWQ7aWYoZSl7Y29uc3Qgbj1lLnJlcGxhY2UoImRhdGFmbG93LSIsInNlbGVjdGVkLSIpO2xldCBpPXRoaXMuJCQoIiMiK24pO2lmKCFpKXtjb25zdCB0PXRoaXMuJC5zY2VuZS5xdWVyeVNlbGVjdG9yKCIjIitlKTtpPXQuY2xvbmVOb2RlKCEwKSxpLnNldEF0dHJpYnV0ZSgiaWQiLG4pLGkuY2xhc3NMaXN0LmFkZCgic2VsZWN0ZWQtYXJyb3doZWFkIiksdC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGkpfWNvbnN0IHI9dC5sYWJlbC5zdGFydE1hcmtlcklkPyJtYXJrZXItc3RhcnQiOiJtYXJrZXItZW5kIjt0aGlzLl9sYXN0U2VsZWN0ZWRFZGdlR3JvdXAuc2VsZWN0QWxsKCJwYXRoLmVkZ2VsaW5lIikuc3R5bGUocixgdXJsKCMke259KWApfX19bm90KHQpe3JldHVybiF0fX07UXF0LnRlbXBsYXRlPV9lYAogICAgPHN0eWxlPgogICAgICAuY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4yKTsKICAgICAgfQoKICAgICAgLnZlcnRpY2FsIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICB9CgogICAgICAuYXV0byB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtdmVydGljYWw7CiAgICAgIH0KCiAgICAgIGgyIHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICA8ZGl2IGNsYXNzPSJ2ZXJ0aWNhbCI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3RpdGxlXV0iPgogICAgICAgICAgPGgyPltbdGl0bGVdXTwvaDI+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGYtZ3JhcGgtc2NlbmUKICAgICAgICAgIGlkPSJzY2VuZSIKICAgICAgICAgIGNsYXNzPSJhdXRvIgogICAgICAgICAgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIKICAgICAgICAgIGhpZ2hsaWdodGVkLW5vZGU9IltbX2dldFZpc2libGUoaGlnaGxpZ2h0ZWROb2RlKV1dIgogICAgICAgICAgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIKICAgICAgICAgIHNlbGVjdGVkLWVkZ2U9Int7c2VsZWN0ZWRFZGdlfX0iCiAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgICBwcm9ncmVzcz0iW1twcm9ncmVzc11dIgogICAgICAgICAgbm9kZS1jb250ZXh0LW1lbnUtaXRlbXM9Iltbbm9kZUNvbnRleHRNZW51SXRlbXNdXSIKICAgICAgICAgIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIKICAgICAgICAgIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19IgogICAgICAgICAgaGFuZGxlLWVkZ2Utc2VsZWN0ZWQ9IltbaGFuZGxlRWRnZVNlbGVjdGVkXV0iCiAgICAgICAgICB0cmFjZS1pbnB1dHM9IltbdHJhY2VJbnB1dHNdXSIKICAgICAgICA+PC90Zi1ncmFwaC1zY2VuZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgLHQoW28oe3R5cGU6T2JqZWN0LG5vdGlmeTohMCxvYnNlcnZlcjoiX2dyYXBoQ2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsRHF0KV0sUXF0LnByb3RvdHlwZSwiZ3JhcGhIaWVyYXJjaHkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIscUd0KV0sUXF0LnByb3RvdHlwZSwiYmFzaWNHcmFwaCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxRcXQucHJvdG90eXBlLCJzdGF0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxRcXQucHJvdG90eXBlLCJkZXZpY2VzRm9yU3RhdHMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sUXF0LnByb3RvdHlwZSwiaGllcmFyY2h5UGFyYW1zIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxRcXQucHJvdG90eXBlLCJwcm9ncmVzcyIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxRcXQucHJvdG90eXBlLCJ0aXRsZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sUXF0LnByb3RvdHlwZSwic2VsZWN0ZWROb2RlIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxRcXQucHJvdG90eXBlLCJzZWxlY3RlZEVkZ2UiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sUXF0LnByb3RvdHlwZSwiX2xhc3RTZWxlY3RlZEVkZ2VHcm91cCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sUXF0LnByb3RvdHlwZSwiaGlnaGxpZ2h0ZWROb2RlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFFxdC5wcm90b3R5cGUsImNvbG9yQnkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFFxdC5wcm90b3R5cGUsImNvbG9yQnlQYXJhbXMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLHlXdCldLFFxdC5wcm90b3R5cGUsInJlbmRlckhpZXJhcmNoeSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFFxdC5wcm90b3R5cGUsInRyYWNlSW5wdXRzIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sUXF0LnByb3RvdHlwZSwiYXV0b0V4dHJhY3ROb2RlcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sUXF0LnByb3RvdHlwZSwibm9kZUNvbnRleHRNZW51SXRlbXMiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sUXF0LnByb3RvdHlwZSwiX3JlbmRlckRlcHRoIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sUXF0LnByb3RvdHlwZSwiX2FsbG93R3JhcGhTZWxlY3QiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sUXF0LnByb3RvdHlwZSwibm9kZU5hbWVzVG9IZWFsdGhQaWxscyIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxRcXQucHJvdG90eXBlLCJoZWFsdGhQaWxsU3RlcEluZGV4Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFFxdC5wcm90b3R5cGUsImVkZ2VXaWR0aEZ1bmN0aW9uIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFFxdC5wcm90b3R5cGUsImhhbmRsZU5vZGVTZWxlY3RlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxRcXQucHJvdG90eXBlLCJlZGdlTGFiZWxGdW5jdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxRcXQucHJvdG90eXBlLCJoYW5kbGVFZGdlU2VsZWN0ZWQiLHZvaWQgMCksdChbYSgiYXV0b0V4dHJhY3ROb2RlcyIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sUXF0LnByb3RvdHlwZSwiX2F1dG9FeHRyYWN0Tm9kZXNDaGFuZ2VkIixudWxsKSx0KFthKCJncmFwaEhpZXJhcmNoeSIsImVkZ2VXaWR0aEZ1bmN0aW9uIiwiaGFuZGxlTm9kZVNlbGVjdGVkIiwiZWRnZUxhYmVsRnVuY3Rpb24iLCJoYW5kbGVFZGdlU2VsZWN0ZWQiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLFFxdC5wcm90b3R5cGUsIl9idWlsZE5ld1JlbmRlckhpZXJhcmNoeSIsbnVsbCksdChbYSgic3RhdHMiLCJkZXZpY2VzRm9yU3RhdHMiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLFFxdC5wcm90b3R5cGUsIl9zdGF0c0NoYW5nZWQiLG51bGwpLHQoW2EoInNlbGVjdGVkTm9kZSIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sUXF0LnByb3RvdHlwZSwiX3NlbGVjdGVkTm9kZUNoYW5nZWQiLG51bGwpLHQoW2EoInNlbGVjdGVkRWRnZSIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sUXF0LnByb3RvdHlwZSwiX3NlbGVjdGVkRWRnZUNoYW5nZWQiLG51bGwpLFFxdD10KFtpKCJ0Zi1ncmFwaCIpXSxRcXQpO2NvbnN0IHRZdD17TUFYX05PREVfQ09VTlQ6MWU0LE1BWF9FREdFX0NPVU5UOjFlNH07bGV0IGVZdD1jbGFzcyBleHRlbmRzKGVyKHllKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuaGllcmFyY2h5UGFyYW1zPUhxdCx0aGlzLmFsbFN0ZXBzTW9kZUVuYWJsZWQ9ITEsdGhpcy5zcGVjaWZpY0hlYWx0aFBpbGxTdGVwPTAsdGhpcy5jb21wYXROb2RlVGl0bGU9IlRQVSBDb21wYXRpYmlsaXR5In1maXQoKXt0aGlzLiQuZ3JhcGguZml0KCl9ZG93bmxvYWRBc0ltYWdlKHQpe3JldHVybiBuKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT15aWVsZCB0aGlzLiQuZ3JhcGguZ2V0SW1hZ2VCbG9iKCksbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7bi5ocmVmPVVSTC5jcmVhdGVPYmplY3RVUkwoZSksbi5kb3dubG9hZD10LG4uY2xpY2soKSxVUkwucmV2b2tlT2JqZWN0VVJMKG4uaHJlZil9KSl9X2lzTm90Q29tcGxldGUodCl7cmV0dXJuIHQudmFsdWU8MTAwfV9nZXRDb250YWluZXJDbGFzcyh0KXt2YXIgZT0iY29udGFpbmVyIjtyZXR1cm4gdC5lcnJvciYmKGUrPSIgZXJyb3IiKSx0aGlzLl9pc05vdENvbXBsZXRlKHQpJiYoZSs9IiBsb2FkaW5nIiksZX1fb25Ob2RlSW5jbHVzaW9uVG9nZ2xlZCh0KXt0aGlzLiQuZ3JhcGgubm9kZVRvZ2dsZUV4dHJhY3QodC5kZXRhaWwubmFtZSl9X29uTm9kZVNlcmllc0dyb3VwVG9nZ2xlZCh0KXt0aGlzLiQuZ3JhcGgubm9kZVRvZ2dsZVNlcmllc0dyb3VwKHQuZGV0YWlsLm5hbWUpfV91cGRhdGVOb2RlSW5jbHVkZSgpe2NvbnN0IHQ9dGhpcy5yZW5kZXJIaWVyYXJjaHk/dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0Tm9kZUJ5TmFtZSh0aGlzLnNlbGVjdGVkTm9kZSk6bnVsbDt0aGlzLl9zZWxlY3RlZE5vZGVJbmNsdWRlPXQ/dC5pbmNsdWRlOkdHdC5VTlNQRUNJRklFRH1fc2xpbUdyYXBoQ2hhbmdlZCgpe2lmKCF0aGlzLmdyYXBoKXJldHVybjtjb25zdHtNQVhfTk9ERV9DT1VOVDp0LE1BWF9FREdFX0NPVU5UOmV9PXRZdDtPYmplY3Qua2V5cyh0aGlzLmdyYXBoLm5vZGVzKS5sZW5ndGg+dCYmdGhpcy5ncmFwaC5lZGdlcy5sZW5ndGg+ZSYmdGhpcy5jb2xvckJ5PT09YXF0LlNUUlVDVFVSRSYmKHRoaXMuY29sb3JCeT1hcXQuTk9ORSl9X2Vuc3VyZVRlbXBsYXRlcygpe3RoaXMuZ3JhcGhIaWVyYXJjaHkmJnRoaXMuY29sb3JCeT09PWFxdC5TVFJVQ1RVUkUmJih0aGlzLmdyYXBoSGllcmFyY2h5LmdldFRlbXBsYXRlSW5kZXgoKXx8dGhpcy5ncmFwaEhpZXJhcmNoeS51cGRhdGVUZW1wbGF0ZXMoKSl9fTtlWXQudGVtcGxhdGU9X2VgCiAgICA8c3R5bGU+CiAgICAgIDo6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIC9kZWVwLyAuY2xvc2UgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgbGVmdDogMTVweDsKICAgICAgICBib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgIC5jb250YWluZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAuY29udGFpbmVyLmxvYWRpbmcgewogICAgICAgIGN1cnNvcjogcHJvZ3Jlc3M7CiAgICAgICAgb3BhY2l0eTogMC4xOwogICAgICB9CgogICAgICAuY29udGFpbmVyLmxvYWRpbmcuZXJyb3IgewogICAgICAgIGN1cnNvcjogYXV0bzsKICAgICAgfQoKICAgICAgI2luZm8gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogNXB4OwogICAgICAgIHRvcDogNXB4OwogICAgICAgIHBhZGRpbmc6IDBweDsKICAgICAgICBtYXgtd2lkdGg6IDM4MHB4OwogICAgICAgIG1pbi13aWR0aDogMzIwcHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMmRwOwogICAgICB9CgogICAgICAjbWFpbiB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAjcHJvZ3Jlc3MtYmFyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA0MHB4OwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICB9CgogICAgICAjcHJvZ3Jlc3MtbXNnIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgICAgIHdpZHRoOiA0MDBweDsKICAgICAgfQoKICAgICAgcGFwZXItcHJvZ3Jlc3MgewogICAgICAgIHdpZHRoOiA0MDBweDsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWhlaWdodDogNnB4OwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtYWN0aXZlLWNvbG9yOiAjZjM5MTNlOwogICAgICB9CgogICAgICAuY29udGV4dC1tZW51IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWluLXdpZHRoOiAxNTBweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZDRkNGQ0OwogICAgICB9CgogICAgICAvZGVlcC8gLmNvbnRleHQtbWVudSB1bCB7CiAgICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgL2RlZXAvIC5jb250ZXh0LW1lbnUgdWwgbGkgewogICAgICAgIHBhZGRpbmc6IDRweCAxNnB4OwogICAgICB9CgogICAgICAvZGVlcC8gLmNvbnRleHQtbWVudSB1bCBsaTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YzOTEzZTsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzTm90Q29tcGxldGUocHJvZ3Jlc3MpXV0iPgogICAgICA8ZGl2IGlkPSJwcm9ncmVzcy1iYXIiPgogICAgICAgIDxkaXYgaWQ9InByb2dyZXNzLW1zZyI+W1twcm9ncmVzcy5tc2ddXTwvZGl2PgogICAgICAgIDxwYXBlci1wcm9ncmVzcyB2YWx1ZT0iW1twcm9ncmVzcy52YWx1ZV1dIj48L3BhcGVyLXByb2dyZXNzPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzJD0iW1tfZ2V0Q29udGFpbmVyQ2xhc3MocHJvZ3Jlc3MpXV0iPgogICAgICA8ZGl2IGlkPSJtYWluIj4KICAgICAgICA8dGYtZ3JhcGgKICAgICAgICAgIGlkPSJncmFwaCIKICAgICAgICAgIGdyYXBoLWhpZXJhcmNoeT0ie3tncmFwaEhpZXJhcmNoeX19IgogICAgICAgICAgYmFzaWMtZ3JhcGg9IltbZ3JhcGhdXSIKICAgICAgICAgIGhpZXJhcmNoeS1wYXJhbXM9IltbaGllcmFyY2h5UGFyYW1zXV0iCiAgICAgICAgICByZW5kZXItaGllcmFyY2h5PSJ7e3JlbmRlckhpZXJhcmNoeX19IgogICAgICAgICAgZGV2aWNlcy1mb3Itc3RhdHM9IltbZGV2aWNlc0ZvclN0YXRzXV0iCiAgICAgICAgICBzdGF0cz0iW1tzdGF0c11dIgogICAgICAgICAgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIKICAgICAgICAgIGhpZ2hsaWdodGVkLW5vZGU9Int7X2hpZ2hsaWdodGVkTm9kZX19IgogICAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgICAgY29sb3ItYnktcGFyYW1zPSJ7e2NvbG9yQnlQYXJhbXN9fSIKICAgICAgICAgIHByb2dyZXNzPSJ7e3Byb2dyZXNzfX0iCiAgICAgICAgICBlZGdlLWxhYmVsLWZ1bmN0aW9uPSJbW2VkZ2VMYWJlbEZ1bmN0aW9uXV0iCiAgICAgICAgICBlZGdlLXdpZHRoLWZ1bmN0aW9uPSJbW2VkZ2VXaWR0aEZ1bmN0aW9uXV0iCiAgICAgICAgICBub2RlLW5hbWVzLXRvLWhlYWx0aC1waWxscz0iW1tub2RlTmFtZXNUb0hlYWx0aFBpbGxzXV0iCiAgICAgICAgICBoZWFsdGgtcGlsbC1zdGVwLWluZGV4PSJbW2hlYWx0aFBpbGxTdGVwSW5kZXhdXSIKICAgICAgICAgIGhhbmRsZS1ub2RlLXNlbGVjdGVkPSJbW2hhbmRsZU5vZGVTZWxlY3RlZF1dIgogICAgICAgICAgaGFuZGxlLWVkZ2Utc2VsZWN0ZWQ9IltbaGFuZGxlRWRnZVNlbGVjdGVkXV0iCiAgICAgICAgICB0cmFjZS1pbnB1dHM9IltbdHJhY2VJbnB1dHNdXSIKICAgICAgICAgIGF1dG8tZXh0cmFjdC1ub2Rlcz0iW1thdXRvRXh0cmFjdE5vZGVzXV0iCiAgICAgICAgPjwvdGYtZ3JhcGg+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGlkPSJpbmZvIj4KICAgICAgICA8dGYtZ3JhcGgtaW5mbwogICAgICAgICAgaWQ9ImdyYXBoLWluZm8iCiAgICAgICAgICB0aXRsZT0ic2VsZWN0ZWQiCiAgICAgICAgICBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIKICAgICAgICAgIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iCiAgICAgICAgICBncmFwaD0iW1tncmFwaF1dIgogICAgICAgICAgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIKICAgICAgICAgIHNlbGVjdGVkLW5vZGUtaW5jbHVkZT0ie3tfc2VsZWN0ZWROb2RlSW5jbHVkZX19IgogICAgICAgICAgaGlnaGxpZ2h0ZWQtbm9kZT0ie3tfaGlnaGxpZ2h0ZWROb2RlfX0iCiAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgICBjb2xvci1ieS1wYXJhbXM9IltbY29sb3JCeVBhcmFtc11dIgogICAgICAgICAgZGVidWdnZXItZGF0YS1lbmFibGVkPSJbW2RlYnVnZ2VyRGF0YUVuYWJsZWRdXSIKICAgICAgICAgIGFyZS1oZWFsdGgtcGlsbHMtbG9hZGluZz0iW1thcmVIZWFsdGhQaWxsc0xvYWRpbmddXSIKICAgICAgICAgIGRlYnVnZ2VyLW51bWVyaWMtYWxlcnRzPSJbW2RlYnVnZ2VyTnVtZXJpY0FsZXJ0c11dIgogICAgICAgICAgbm9kZS1uYW1lcy10by1oZWFsdGgtcGlsbHM9Iltbbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIgogICAgICAgICAgYWxsLXN0ZXBzLW1vZGUtZW5hYmxlZD0ie3thbGxTdGVwc01vZGVFbmFibGVkfX0iCiAgICAgICAgICBzcGVjaWZpYy1oZWFsdGgtcGlsbC1zdGVwPSJ7e3NwZWNpZmljSGVhbHRoUGlsbFN0ZXB9fSIKICAgICAgICAgIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19IgogICAgICAgICAgY29tcGF0LW5vZGUtdGl0bGU9IltbY29tcGF0Tm9kZVRpdGxlXV0iCiAgICAgICAgICBvbi1ub2RlLXRvZ2dsZS1pbmNsdXNpb249Il9vbk5vZGVJbmNsdXNpb25Ub2dnbGVkIgogICAgICAgICAgb24tbm9kZS10b2dnbGUtc2VyaWVzZ3JvdXA9Il9vbk5vZGVTZXJpZXNHcm91cFRvZ2dsZWQiCiAgICAgICAgPjwvdGYtZ3JhcGgtaW5mbz4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLERxdCldLGVZdC5wcm90b3R5cGUsImdyYXBoSGllcmFyY2h5Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLHFHdCldLGVZdC5wcm90b3R5cGUsImdyYXBoIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGVZdC5wcm90b3R5cGUsImhpZXJhcmNoeVBhcmFtcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxlWXQucHJvdG90eXBlLCJzdGF0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxlWXQucHJvdG90eXBlLCJwcm9ncmVzcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGVZdC5wcm90b3R5cGUsInRyYWNlSW5wdXRzIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sZVl0LnByb3RvdHlwZSwiYXV0b0V4dHJhY3ROb2RlcyIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sZVl0LnByb3RvdHlwZSwiY29sb3JCeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sZVl0LnByb3RvdHlwZSwiY29sb3JCeVBhcmFtcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIseVd0KV0sZVl0LnByb3RvdHlwZSwicmVuZGVySGllcmFyY2h5Iix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sZVl0LnByb3RvdHlwZSwiZGVidWdnZXJEYXRhRW5hYmxlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGVZdC5wcm90b3R5cGUsImFyZUhlYWx0aFBpbGxzTG9hZGluZyIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLGVZdC5wcm90b3R5cGUsImRlYnVnZ2VyTnVtZXJpY0FsZXJ0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxlWXQucHJvdG90eXBlLCJub2RlTmFtZXNUb0hlYWx0aFBpbGxzIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGVZdC5wcm90b3R5cGUsImFsbFN0ZXBzTW9kZUVuYWJsZWQiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLGVZdC5wcm90b3R5cGUsInNwZWNpZmljSGVhbHRoUGlsbFN0ZXAiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sZVl0LnByb3RvdHlwZSwiaGVhbHRoUGlsbFN0ZXBJbmRleCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sZVl0LnByb3RvdHlwZSwic2VsZWN0ZWROb2RlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGVZdC5wcm90b3R5cGUsImNvbXBhdE5vZGVUaXRsZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxlWXQucHJvdG90eXBlLCJlZGdlV2lkdGhGdW5jdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxlWXQucHJvdG90eXBlLCJfc2VsZWN0ZWROb2RlSW5jbHVkZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxlWXQucHJvdG90eXBlLCJfaGlnaGxpZ2h0ZWROb2RlIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGVZdC5wcm90b3R5cGUsImhhbmRsZU5vZGVTZWxlY3RlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxlWXQucHJvdG90eXBlLCJlZGdlTGFiZWxGdW5jdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxlWXQucHJvdG90eXBlLCJoYW5kbGVFZGdlU2VsZWN0ZWQiLHZvaWQgMCksdChbYSgic2VsZWN0ZWROb2RlIiwicmVuZGVySGllcmFyY2h5IiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxlWXQucHJvdG90eXBlLCJfdXBkYXRlTm9kZUluY2x1ZGUiLG51bGwpLHQoW2EoImdyYXBoIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxlWXQucHJvdG90eXBlLCJfc2xpbUdyYXBoQ2hhbmdlZCIsbnVsbCksdChbYSgiY29sb3JCeSIsImdyYXBoSGllcmFyY2h5IiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxlWXQucHJvdG90eXBlLCJfZW5zdXJlVGVtcGxhdGVzIixudWxsKSxlWXQ9dChbaSgidGYtZ3JhcGgtYm9hcmQiKV0sZVl0KTtsZXQgbll0PWNsYXNzIGV4dGVuZHMoZXIoeWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fcmF3UmVnZXhJbnB1dD0iIix0aGlzLl9wcmV2aW91c1JlZ2V4SW5wdXQ9IiIsdGhpcy5fc2VhcmNoVGltZW91dERlbGF5PTE1MCx0aGlzLl9tYXhSZWdleFJlc3VsdHM9NDJ9Z2V0IF9yZWdleElucHV0KCl7cmV0dXJuIHRoaXMuX3Jhd1JlZ2V4SW5wdXQudHJpbSgpfV9yZWdleElucHV0Q2hhbmdlZCgpe3RoaXMuX3JlcXVlc3RTZWFyY2goKX1fY2xlYXJTZWFyY2hSZXN1bHRzKCl7dGhpcy5zZXQoIl9yZWdleE1hdGNoZXMiLFtdKX1fcmVxdWVzdFNlYXJjaCgpe3RoaXMuX3NlYXJjaFBlbmRpbmd8fCh0aGlzLl9yZWdleElucHV0IT09dGhpcy5fcHJldmlvdXNSZWdleElucHV0Pyh0aGlzLl9zZWFyY2hQZW5kaW5nPSEwLHRoaXMuX2V4ZWN1dGVTZWFyY2goKSx0aGlzLmFzeW5jKCgoKT0+e3RoaXMuX3NlYXJjaFBlbmRpbmc9ITEsdGhpcy5fcmVxdWVzdFNlYXJjaCgpfSksdGhpcy5fc2VhcmNoVGltZW91dERlbGF5KSk6dGhpcy5fc2VhcmNoUGVuZGluZz0hMSl9X2V4ZWN1dGVTZWFyY2goKXtpZih0aGlzLl9wcmV2aW91c1JlZ2V4SW5wdXQ9dGhpcy5fcmVnZXhJbnB1dCwhdGhpcy5fcmVnZXhJbnB1dClyZXR1cm4gdm9pZCB0aGlzLl9jbGVhclNlYXJjaFJlc3VsdHMoKTt0cnl7dmFyIHQ9bmV3IFJlZ0V4cCh0aGlzLl9yZWdleElucHV0KX1jYXRjaCh0KXtyZXR1cm4gdm9pZCB0aGlzLl9jbGVhclNlYXJjaFJlc3VsdHMoKX1jb25zdCBlPVtdLG49dGhpcy5yZW5kZXJIaWVyYXJjaHkuaGllcmFyY2h5LmdldE5vZGVNYXAoKTtTZS5leHBvcnRzLmVhY2gobiwoKG4saSk9PntpZihlLmxlbmd0aD49dGhpcy5fbWF4UmVnZXhSZXN1bHRzKXJldHVybiExO3QudGVzdChpKSYmZS5wdXNoKGkpfSkpLHRoaXMuc2V0KCJfcmVnZXhNYXRjaGVzIixlKX1fbWF0Y2hDbGlja2VkKHQpe3RoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLHQubW9kZWwuaXRlbSksVEd0KHthY3Rpb25JZDpfR3QuTk9ERV9TRUFSQ0hfUkVTVUxUX0ZPQ1VTRUR9KX19O25ZdC50ZW1wbGF0ZT1fZWAKICAgIDxkaXYgaWQ9InNlYXJjaC1jb250YWluZXIiPgogICAgICA8cGFwZXItaW5wdXQKICAgICAgICBpZD0icnVucy1yZWdleCIKICAgICAgICBsYWJlbD0iU2VhcmNoIG5vZGVzIChyZWdleCkiCiAgICAgICAgdmFsdWU9Int7X3Jhd1JlZ2V4SW5wdXR9fSIKICAgICAgPgogICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8ZGl2IGlkPSJzZWFyY2gtcmVzdWx0cy1hbmNob3IiPgogICAgICAgIDxkaXYgaWQ9InNlYXJjaC1yZXN1bHRzIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3JlZ2V4TWF0Y2hlc11dIj4KICAgICAgICAgICAgPGRpdiBpZD0ic2VhcmNoLW1hdGNoIiBvbi1jbGljaz0iX21hdGNoQ2xpY2tlZCI+W1tpdGVtXV08L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgICNzZWFyY2gtY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgI3J1bnMtcmVnZXggewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjc2VhcmNoLXJlc3VsdHMtYW5jaG9yIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgICNzZWFyY2gtcmVzdWx0cyB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CgogICAgICAjc2VhcmNoLW1hdGNoIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlyZWN0aW9uOiBydGw7CiAgICAgIH0KCiAgICAgICNzZWFyY2gtbWF0Y2g6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLW9yYW5nZS13ZWFrKTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxuWXQucHJvdG90eXBlLCJyZW5kZXJIaWVyYXJjaHkiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLG5ZdC5wcm90b3R5cGUsInNlbGVjdGVkTm9kZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxuWXQucHJvdG90eXBlLCJfcmF3UmVnZXhJbnB1dCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxuWXQucHJvdG90eXBlLCJfcHJldmlvdXNSZWdleElucHV0Iix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLG5ZdC5wcm90b3R5cGUsIl9zZWFyY2hUaW1lb3V0RGVsYXkiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxuWXQucHJvdG90eXBlLCJfc2VhcmNoUGVuZGluZyIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxuWXQucHJvdG90eXBlLCJfbWF4UmVnZXhSZXN1bHRzIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxuWXQucHJvdG90eXBlLCJfcmVnZXhNYXRjaGVzIix2b2lkIDApLHQoW3MoInJlbmRlckhpZXJhcmNoeSIsIl9yYXdSZWdleElucHV0IiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sbll0LnByb3RvdHlwZSwiX3JlZ2V4SW5wdXQiLG51bGwpLHQoW2EoIl9yZWdleElucHV0IiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxuWXQucHJvdG90eXBlLCJfcmVnZXhJbnB1dENoYW5nZWQiLG51bGwpLG5ZdD10KFtpKCJ0Zi1ncmFwaC1ub2RlLXNlYXJjaCIpXSxuWXQpO2NvbnN0IGlZdD0vZGV2aWNlOihbXjpdKzpbMC05XSspJC8scll0PVt7cmVnZXg6aVl0fV0sb1l0PVtdLGFZdD1uZXcgU2V0KFthcXQuQ09NUFVURV9USU1FLGFxdC5NRU1PUlldKTtsZXQgc1l0PWNsYXNzIGV4dGVuZHMoZXIoaWwoeWUpKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuQ29sb3JCeT1hcXQsdGhpcy5zdGF0cz1udWxsLHRoaXMuZGV2aWNlc0ZvclN0YXRzPW51bGwsdGhpcy5jb2xvckJ5PWFxdC5TVFJVQ1RVUkUsdGhpcy5kYXRhc2V0cz1bXSx0aGlzLl9zZWxlY3RlZFJ1bkluZGV4PTAsdGhpcy50cmFjZUlucHV0cz0hMSx0aGlzLmF1dG9FeHRyYWN0Tm9kZXM9ITAsdGhpcy5fc2VsZWN0ZWRUYWdJbmRleD0wLHRoaXMuX3NlbGVjdGVkR3JhcGhUeXBlPXlHdC5PUF9HUkFQSCx0aGlzLnNob3dTZXNzaW9uUnVuc0Ryb3Bkb3duPSEwLHRoaXMuc2hvd1VwbG9hZEJ1dHRvbj0hMCx0aGlzLl9sZWdlbmRPcGVuZWQ9ITAsdGhpcy5fZG93bmxvYWRGaWxlbmFtZT0iZ3JhcGgucG5nIn1fb25HcmFwaFR5cGVDaGFuZ2VkQnlVc2VyR2VzdHVyZSgpe1RHdCh7YWN0aW9uSWQ6X0d0LkdSQVBIX1RZUEVfQ0hBTkdFRCxldmVudExhYmVsOnRoaXMuX3NlbGVjdGVkR3JhcGhUeXBlfSl9X29uQ29sb3JCeUNoYW5nZWRCeVVzZXJHZXN0dXJlKCl7VEd0KHthY3Rpb25JZDpfR3QuTk9ERV9DT0xPUl9NT0RFX0NIQU5HRUQsZXZlbnRMYWJlbDp0aGlzLmNvbG9yQnl9KX1fb25UcmFjZUlucHV0c0NoYW5nZWRCeVVzZXJHZXN0dXJlKCl7VEd0KHthY3Rpb25JZDpfR3QuVFJBQ0VfSU5QVVRfTU9ERV9UT0dHTEVEfSl9X3hsYUNsdXN0ZXJzUHJvdmlkZWQodCl7cmV0dXJuIHQmJnQuaGllcmFyY2h5JiZ0LmhpZXJhcmNoeS54bGFDbHVzdGVycy5sZW5ndGg+MH1fc3RhdHNDaGFuZ2VkKHQpe2lmKG51bGwhPXQpe3ZhciBlPXt9O1NlLmV4cG9ydHMuZWFjaCh0LmRldl9zdGF0cywoZnVuY3Rpb24odCl7dmFyIG49U2UuZXhwb3J0cy5zb21lKHJZdCwoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVnZXgudGVzdCh0LmRldmljZSl9KSksaT1TZS5leHBvcnRzLnNvbWUob1l0LChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZWdleC50ZXN0KHQuZGV2aWNlKX0pKTtuJiYhaSYmKGVbdC5kZXZpY2VdPSEwKX0pKSx0aGlzLnNldCgiZGV2aWNlc0ZvclN0YXRzIixlKX19Z2V0IF9jdXJyZW50RGV2aWNlcygpe3ZhciB0PXRoaXMuZGV2aWNlc0ZvclN0YXRzO2NvbnN0IGU9dGhpcy5zdGF0cyxuPShlP2UuZGV2X3N0YXRzOltdKS5tYXAoKHQ9PnQuZGV2aWNlKSkuZmlsdGVyKCh0PT5yWXQuc29tZSgoZT0+ZS5yZWdleC50ZXN0KHQpKSkpKSxpPXpHdChuKTtpZigxPT1pLmxlbmd0aCl7Y29uc3QgdD1pWzBdLm1hdGNoKGlZdCk7dCYmKGlbMF09dFsxXSl9cmV0dXJuIG4ubWFwKCgoZSxuKT0+e2xldCByPW51bGw7cmV0dXJuIG9ZdC5mb3JFYWNoKCh0PT57dC5yZWdleC50ZXN0KGUpJiYocj10Lm1zZyl9KSkse2RldmljZTplLHN1ZmZpeDppW25dLHVzZWQ6dFtlXSxpZ25vcmVkTXNnOnJ9fSkpfV9kZXZpY2VDaGVja2JveENsaWNrZWQodCl7Y29uc3QgZT10LnRhcmdldCxuPU9iamVjdC5hc3NpZ24oe30sdGhpcy5kZXZpY2VzRm9yU3RhdHMpLGk9ZS52YWx1ZTtlLmNoZWNrZWQ/bltpXT0hMDpkZWxldGUgbltpXSx0aGlzLnNldCgiZGV2aWNlc0ZvclN0YXRzIixuKX1fbnVtVGFncyh0LGUpe3JldHVybiB0aGlzLl9nZXRUYWdzKHQsZSkubGVuZ3RofV9nZXRUYWdzKHQsZSl7cmV0dXJuIHQmJnRbZV0/dFtlXS50YWdzOltdfV9maXQoKXt0aGlzLmZpcmUoImZpdC10YXAiKX1faXNHcmFkaWVudENvbG9yaW5nKHQsZSl7cmV0dXJuIGFZdC5oYXMoZSkmJm51bGwhPXR9X2VxdWFscyh0LGUpe3JldHVybiB0PT09ZX1nZXQgX2N1cnJlbnREZXZpY2VQYXJhbXMoKXtjb25zdCB0PXRoaXMuY29sb3JCeVBhcmFtcy5kZXZpY2UuZmlsdGVyKCh0PT5yWXQuc29tZSgoZT0+ZS5yZWdleC50ZXN0KHQuZGV2aWNlKSkpKSksZT16R3QodC5tYXAoKHQ9PnQuZGV2aWNlKSkpO2lmKDE9PWUubGVuZ3RoKXt2YXIgbj1lWzBdLm1hdGNoKGlZdCk7biYmKGVbMF09blsxXSl9cmV0dXJuIHQubWFwKCgodCxuKT0+KHtkZXZpY2U6ZVtuXSxjb2xvcjp0LmNvbG9yfSkpKX1nZXQgX2N1cnJlbnRYbGFDbHVzdGVyUGFyYW1zKCl7cmV0dXJuIHRoaXMuY29sb3JCeVBhcmFtcy54bGFfY2x1c3Rlcn1nZXQgX2N1cnJlbnRHcmFkaWVudFBhcmFtcygpe3ZhciB0PXRoaXMuY29sb3JCeVBhcmFtcyxlPXRoaXMuY29sb3JCeTtpZighdGhpcy5faXNHcmFkaWVudENvbG9yaW5nKHRoaXMuc3RhdHMsZSkpcmV0dXJuO2NvbnN0IG49dFtlXTtsZXQgaT1uLm1pblZhbHVlLHI9bi5tYXhWYWx1ZTtyZXR1cm4gZT09PWFxdC5NRU1PUlk/KGk9Ukd0KGksTkd0KSxyPVJHdChyLE5HdCkpOmU9PT1hcXQuQ09NUFVURV9USU1FJiYoaT1SR3QoaSxJR3QpLHI9Ukd0KHIsSUd0KSkse21pblZhbHVlOmksbWF4VmFsdWU6cixzdGFydENvbG9yOm4uc3RhcnRDb2xvcixlbmRDb2xvcjpuLmVuZENvbG9yfX1kb3dubG9hZCgpe3RoaXMuZmlyZSgiZG93bmxvYWQtaW1hZ2UtcmVxdWVzdGVkIix0aGlzLl9kb3dubG9hZEZpbGVuYW1lKX1fdXBkYXRlRmlsZUlucHV0KHQpe2NvbnN0IGU9dC50YXJnZXQuZmlsZXNbMF07aWYoIWUpcmV0dXJuO2xldCBuPWUubmFtZTtjb25zdCBpPW4ubGFzdEluZGV4T2YoIi4iKTtpPj0wJiYobj1uLnN1YnN0cmluZygwLGkpKTtjb25zdCByPW4ubGFzdEluZGV4T2YoIi8iKTtyPj0wJiYobj1uLnN1YnN0cmluZyhyKzEpKSx0aGlzLl9zZXREb3dubG9hZEZpbGVuYW1lKG4pLHRoaXMuc2V0KCJzZWxlY3RlZEZpbGUiLHQpLFRHdCh7YWN0aW9uSWQ6X0d0LlVQTE9BREVEX0dSQVBIX0ZST01fRklMRVNZU1RFTX0pfV9kYXRhc2V0c0NoYW5nZWQodCxlKXt2YXIgbjtudWxsIT1lJiYodGhpcy5fc2VsZWN0ZWRSdW5JbmRleD0wKSx0aGlzLl9zZXREb3dubG9hZEZpbGVuYW1lKG51bGw9PT0obj10aGlzLmRhdGFzZXRzW3RoaXMuX3NlbGVjdGVkUnVuSW5kZXhdKXx8dm9pZCAwPT09bj92b2lkIDA6bi5uYW1lKX1fY29tcHV0ZVNlbGVjdGlvbih0LGUsbixpKXtyZXR1cm4gdFtlXSYmdFtlXS50YWdzW25dP3tydW46dFtlXS5uYW1lLHRhZzp0W2VdLnRhZ3Nbbl0udGFnLHR5cGU6aX06bnVsbH1fc2VsZWN0ZWRSdW5JbmRleENoYW5nZWQodCl7dmFyIGU7dGhpcy5kYXRhc2V0cyYmKHRoaXMuY29sb3JCeT1hcXQuU1RSVUNUVVJFLHRoaXMuX3NlbGVjdGVkVGFnSW5kZXg9MCx0aGlzLl9zZWxlY3RlZEdyYXBoVHlwZT10aGlzLl9nZXREZWZhdWx0U2VsZWN0aW9uVHlwZSgpLHRoaXMudHJhY2VJbnB1dHM9ITEsdGhpcy5fc2V0RG93bmxvYWRGaWxlbmFtZShudWxsPT09KGU9dGhpcy5kYXRhc2V0c1t0XSl8fHZvaWQgMD09PWU/dm9pZCAwOmUubmFtZSkpfV9zZWxlY3RlZFRhZ0luZGV4Q2hhbmdlZCgpe3RoaXMuX3NlbGVjdGVkR3JhcGhUeXBlPXRoaXMuX2dldERlZmF1bHRTZWxlY3Rpb25UeXBlKCl9X2dldERlZmF1bHRTZWxlY3Rpb25UeXBlKCl7Y29uc3R7ZGF0YXNldHM6dCxfc2VsZWN0ZWRSdW5JbmRleDplLF9zZWxlY3RlZFRhZ0luZGV4Om59PXRoaXM7aWYoIXR8fCF0W2VdfHwhdFtlXS50YWdzW25dfHx0W2VdLnRhZ3Nbbl0ub3BHcmFwaClyZXR1cm4geUd0Lk9QX0dSQVBIO2NvbnN0IGk9dFtlXTtyZXR1cm4gaS50YWdzW25dLnByb2ZpbGU/eUd0LlBST0ZJTEU6aS50YWdzW25dLmNvbmNlcHR1YWxHcmFwaD95R3QuQ09OQ0VQVFVBTF9HUkFQSDp5R3QuT1BfR1JBUEh9X2dldEZpbGUoKXt0aGlzLiQkKCIjZmlsZSIpLmNsaWNrKCl9X3NldERvd25sb2FkRmlsZW5hbWUodCl7dGhpcy5fZG93bmxvYWRGaWxlbmFtZT0odHx8ImdyYXBoIikrIi5wbmcifV9zdGF0c05vdE51bGwodCl7cmV0dXJuIG51bGwhPT10fV90b2dnbGVMZWdlbmRPcGVuKCl7dGhpcy5zZXQoIl9sZWdlbmRPcGVuZWQiLCF0aGlzLl9sZWdlbmRPcGVuZWQpfV9nZXRUb2dnbGVMZWdlbmRJY29uKHQpe3JldHVybiB0PyJleHBhbmQtbW9yZSI6ImV4cGFuZC1sZXNzIn1fZ2V0U2VsZWN0aW9uT3BHcmFwaERpc2FibGVkKHQsZSxuKXtyZXR1cm4hdFtlXXx8IXRbZV0udGFnc1tuXXx8IXRbZV0udGFnc1tuXS5vcEdyYXBofV9nZXRTZWxlY3Rpb25Qcm9maWxlRGlzYWJsZWQodCxlLG4pe3JldHVybiF0W2VdfHwhdFtlXS50YWdzW25dfHwhdFtlXS50YWdzW25dLnByb2ZpbGV9X2dldFNlbGVjdGlvbkNvbmNlcHR1YWxHcmFwaERpc2FibGVkKHQsZSxuKXtyZXR1cm4hdFtlXXx8IXRbZV0udGFnc1tuXXx8IXRbZV0udGFnc1tuXS5jb25jZXB0dWFsR3JhcGh9fTtzWXQudGVtcGxhdGU9X2VgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBjb2xvcjogIzU1NTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIC0tdGItZ3JhcGgtY29udHJvbHMtdGl0bGUtY29sb3I6ICMwMDA7CiAgICAgICAgLS10Yi1ncmFwaC1jb250cm9scy1sZWdlbmQtdGV4dC1jb2xvcjogIzAwMDsKICAgICAgICAtLXRiLWdyYXBoLWNvbnRyb2xzLXRleHQtY29sb3I6ICM1NTU7CiAgICAgICAgLS10Yi1ncmFwaC1jb250cm9scy10aXRsZS1mb250LXNpemU6IDE0cHg7CiAgICAgICAgLS10Yi1ncmFwaC1jb250cm9scy1zdWJ0aXRsZS1mb250LXNpemU6IDE0cHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItc2hhcmVkLWlucHV0LXN0eWxlXy1fZm9udC1zaXplOiAxNHB4OwogICAgICAgIC0tcGFwZXItZm9udC1zdWJoZWFkXy1fZm9udC1zaXplOiAxNHB4OwogICAgICB9CgogICAgICA6aG9zdCguZGFyay1tb2RlKSB7CiAgICAgICAgLS10Yi1ncmFwaC1jb250cm9scy10aXRsZS1jb2xvcjogI2ZmZjsKICAgICAgICAtLXRiLWdyYXBoLWNvbnRyb2xzLWxlZ2VuZC10ZXh0LWNvbG9yOiAjZjNmM2YzOwogICAgICAgIC0tdGItZ3JhcGgtY29udHJvbHMtdGV4dC1jb2xvcjogI2VlZTsKICAgICAgfQoKICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgLS1wYXBlci1kcm9wZG93bi1tZW51LWlucHV0OiB7CiAgICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgICAgfQogICAgICAgIC0taXJvbi1pY29uLXdpZHRoOiAxNXB4OwogICAgICAgIC0taXJvbi1pY29uLWhlaWdodDogMTVweDsKICAgICAgICAtLXByaW1hcnktdGV4dC1jb2xvcjogZ3JheTsKICAgICAgICAtLXBhcGVyLWl0ZW0tbWluLWhlaWdodDogMzBweDsKICAgICAgfQoKICAgICAgcGFwZXItYnV0dG9uW3JhaXNlZF0ua2V5Ym9hcmQtZm9jdXMgewogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC5ydW4tZHJvcGRvd24gewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyOiB7CiAgICAgICAgICBwYWRkaW5nOiA1cHggMCA1cHggNXB4OwogICAgICAgIH0KICAgICAgfQoKICAgICAgdGFibGUgewogICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICAgICAgYm9yZGVyLXNwYWNpbmc6IDA7CiAgICAgIH0KCiAgICAgIHRhYmxlIHRyIHsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgIH0KCiAgICAgIHRhYmxlIHRkIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQoKICAgICAgLmFsbGNvbnRyb2xzIHsKICAgICAgICBwYWRkaW5nOiAwIDIwcHggMjBweDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgLmxlZ2VuZC1ob2xkZXIgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXNlY29uZGFyeS1iYWNrZ3JvdW5kLWNvbG9yKTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1ncmFwaC1jb250cm9scy10ZXh0LWNvbG9yKTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLmxlZ2VuZC10b29sYmFyIHsKICAgICAgICBhcHBlYXJhbmNlOiBub25lOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjY2M7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNjY2M7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiBub25lOwogICAgICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBjb2xvcjogdmFyKC0tdGItZ3JhcGgtY29udHJvbHMtbGVnZW5kLXRleHQtY29sb3IpOwogICAgICAgIGZvbnQ6IGluaGVyaXQ7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLmxlZ2VuZC10b29sYmFyLAogICAgICAubGVnZW5kLWNvbnRlbnQgewogICAgICAgIHBhZGRpbmc6IDhweCAyMHB4OwogICAgICB9CgogICAgICAudG9nZ2xlLWxlZ2VuZC1idXR0b24gewogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtbGVnZW5kLXRleHQgewogICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tdGItZ3JhcGgtY29udHJvbHMtc3VidGl0bGUtZm9udC1zaXplKTsKICAgICAgfQoKICAgICAgcGFwZXItcmFkaW8tYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiA1cHg7CiAgICAgIH0KICAgICAgc3ZnLmljb24sCiAgICAgIHRmLWdyYXBoLWljb24gewogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICAgIGhlaWdodDogMThweDsKICAgICAgfQogICAgICAuZG9tYWluVmFsdWVzIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICAgIHdpZHRoOiAxNjVweDsKICAgICAgfQogICAgICAuZG9tYWluU3RhcnQgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICB9CiAgICAgIC5kb21haW5FbmQgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQogICAgICAuY29sb3JCb3ggewogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICB9CgogICAgICAuaW1hZ2UtaWNvbiB7CiAgICAgICAgd2lkdGg6IDI0cHg7CiAgICAgICAgaGVpZ2h0OiAyNHB4OwogICAgICB9CgogICAgICAuaGVscC1pY29uIHsKICAgICAgICBoZWlnaHQ6IDE1cHg7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5ncmF5IHsKICAgICAgICBjb2xvcjogIzY2NjsKICAgICAgfQoKICAgICAgLnRpdGxlIHsKICAgICAgICBmb250LXNpemU6IHZhcigtLXRiLWdyYXBoLWNvbnRyb2xzLXRpdGxlLWZvbnQtc2l6ZSk7CiAgICAgICAgbWFyZ2luOiA4cHggNXB4IDhweCAwOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1ncmFwaC1jb250cm9scy10aXRsZS1jb2xvcik7CiAgICAgIH0KICAgICAgLnRpdGxlIHNtYWxsIHsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIC5kZXZpY2VMaXN0LAogICAgICAueGxhQ2x1c3Rlckxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgICNmaWxlIHsKICAgICAgICBwYWRkaW5nOiA4cHggMDsKICAgICAgfQoKICAgICAgLmNvbG9yLWxlZ2VuZC1yb3cgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgY2xlYXI6IGJvdGg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICB9CgogICAgICAuY29sb3ItbGVnZW5kLXJvdyAubGFiZWwsCiAgICAgIC5jb2xvci1sZWdlbmQtcm93IHN2ZywKICAgICAgLmNvbG9yLWxlZ2VuZC1yb3cgdGYtZ3JhcGgtaWNvbiB7CiAgICAgICAgZmxleDogMCAwIDQwcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyMHB4OwogICAgICB9CgogICAgICAuZGV2aWNlcy1jaGVja2JveCBpbnB1dCB7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CgogICAgICAuY29udHJvbC1ob2xkZXIgLmljb24tYnV0dG9uIHsKICAgICAgICBmb250LXNpemU6IHZhcigtLXRiLWdyYXBoLWNvbnRyb2xzLXN1YnRpdGxlLWZvbnQtc2l6ZSk7CiAgICAgICAgbWFyZ2luOiAwIC01cHg7CiAgICAgICAgcGFkZGluZzogNXB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1ncmFwaC1jb250cm9scy10ZXh0LWNvbG9yKTsKICAgICAgfQoKICAgICAgLmJ1dHRvbi10ZXh0IHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgIH0KCiAgICAgIC51cGxvYWQtYnV0dG9uIHsKICAgICAgICB3aWR0aDogMTY1cHg7CiAgICAgICAgaGVpZ2h0OiAyNXB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICAgIG1hcmdpbi10b3A6IDRweDsKICAgICAgfQoKICAgICAgLmJ1dHRvbi1pY29uIHsKICAgICAgICB3aWR0aDogMjZweDsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS01MDApOwogICAgICB9CgogICAgICAuaGlkZGVuLWlucHV0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAuYWxsY29udHJvbHMgLmNvbnRyb2wtaG9sZGVyIHsKICAgICAgICBjbGVhcjogYm90aDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQoKICAgICAgLmFsbGNvbnRyb2xzIC5jb250cm9sLWhvbGRlci5jb250cm9sLW9wdGlvbnMgewogICAgICAgIHBhZGRpbmc6IDAgMCAxNXB4IDE1cHg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgLmFsbGNvbnRyb2xzIC5jb250cm9sLWhvbGRlciBwYXBlci10b2dnbGUtYnV0dG9uIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KCiAgICAgIHNwYW4uY291bnRlciB7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS10Yi1ncmFwaC1jb250cm9scy1zdWJ0aXRsZS1mb250LXNpemUpOwogICAgICAgIGNvbG9yOiBncmF5OwogICAgICAgIG1hcmdpbi1sZWZ0OiA0cHg7CiAgICAgIH0KCiAgICAgIC5ydW5zLXJvdyAudGl0bGUsCiAgICAgIC50YWdzLXJvdyAudGl0bGUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICB9CgogICAgICAucnVucy1yb3cgcGFwZXItaXRlbSwKICAgICAgLnRhZ3Mtcm93IHBhcGVyLWl0ZW0gewogICAgICAgIC0tcGFwZXItaXRlbTogewogICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRhYmxlLmNvbnRyb2wtaG9sZGVyIHsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgICAgfQoKICAgICAgdGFibGUudGYtZ3JhcGgtY29udHJvbHMgdGQuaW5wdXQtZWxlbWVudC10YWJsZS1kYXRhIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAyMHB4OwogICAgICB9CgogICAgICAuc3BhY2VyIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KCiAgICAgIC5jb2xvci10ZXh0IHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAuY29sb3ItdGV4dC5ncmFkaWVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogMCA1cHg7CiAgICAgIH0KCiAgICAgIC8qKiBPdmVycmlkZSBpbmxpbmUgc3R5bGVzIHRoYXQgc3VwcHJlc3MgcG9pbnRlciBldmVudHMgZm9yIGRpc2FibGVkIGJ1dHRvbnMuIE90aGVyd2lzZSwgdGhlICovCiAgICAgIC8qICB0b29sdGlwcyBkbyBub3QgYXBwZWFyLiAqLwogICAgICBwYXBlci1yYWRpby1ncm91cCBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5sZWdlbmQtY2xhcmlmaWVyIHsKICAgICAgICBjb2xvcjogIzI2NjIzNjsKICAgICAgICBjdXJzb3I6IGhlbHA7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICB9CgogICAgICAubGVnZW5kLWNsYXJpZmllciBwYXBlci10b29sdGlwIHsKICAgICAgICB3aWR0aDogMTUwcHg7CiAgICAgIH0KCiAgICAgIC8qKiBPdGhlcndpc2UsIHBvbHltZXIgVUkgY29udHJvbHMgYXBwZWFyIGF0b3Agbm9kZSBzZWFyY2guICovCiAgICAgIHRmLWdyYXBoLW5vZGUtc2VhcmNoIHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iYWxsY29udHJvbHMiPgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgPHRmLWdyYXBoLW5vZGUtc2VhcmNoCiAgICAgICAgICBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IgogICAgICAgICAgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIKICAgICAgICA+PC90Zi1ncmFwaC1ub2RlLXNlYXJjaD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJpY29uLWJ1dHRvbiIgb24tdGFwPSJfZml0IiBhbHQ9IkZpdCB0byBzY3JlZW4iPgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJhc3BlY3QtcmF0aW8iIGNsYXNzPSJidXR0b24taWNvbiI+PC9pcm9uLWljb24+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iYnV0dG9uLXRleHQiPkZpdCB0byBzY3JlZW48L3NwYW4+CiAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgPHBhcGVyLWJ1dHRvbgogICAgICAgICAgY2xhc3M9Imljb24tYnV0dG9uIgogICAgICAgICAgb24tY2xpY2s9ImRvd25sb2FkIgogICAgICAgICAgYWx0PSJEb3dubG9hZCBQTkciCiAgICAgICAgPgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJmaWxlLWRvd25sb2FkIiBjbGFzcz0iYnV0dG9uLWljb24iPjwvaXJvbi1pY29uPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImJ1dHRvbi10ZXh0Ij5Eb3dubG9hZCBQTkc8L3NwYW4+CiAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd1VwbG9hZEJ1dHRvbl1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICAgIGNsYXNzPSJpY29uLWJ1dHRvbiIKICAgICAgICAgICAgb24tY2xpY2s9Il9nZXRGaWxlIgogICAgICAgICAgICBhbHQ9IlVwbG9hZCBmaWxlIgogICAgICAgICAgICB0aXRsZT0iVXBsb2FkIGEgcGJ0eHQgZmlsZSB0byB2aWV3IGEgZ3JhcGggZnJvbSB0aGUgbG9jYWwgZmlsZXN5c3RlbSIKICAgICAgICAgID4KICAgICAgICAgICAgPGlyb24taWNvbiBpY29uPSJmaWxlLXVwbG9hZCIgY2xhc3M9ImJ1dHRvbi1pY29uIj48L2lyb24taWNvbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJ1dHRvbi10ZXh0Ij5VcGxvYWQgZmlsZTwvc3Bhbj4KICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgoKICAgICAgICAgIDxkaXYgY2xhc3M9ImhpZGRlbi1pbnB1dCI+CiAgICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICAgIHR5cGU9ImZpbGUiCiAgICAgICAgICAgICAgaWQ9ImZpbGUiCiAgICAgICAgICAgICAgbmFtZT0iZmlsZSIKICAgICAgICAgICAgICBvbi1jaGFuZ2U9Il91cGRhdGVGaWxlSW5wdXQiCiAgICAgICAgICAgICAgYWNjZXB0PSIucGJ0eHQiCiAgICAgICAgICAgIC8+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIgcnVucy1yb3ciPgogICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICAgIFJ1biA8c3BhbiBjbGFzcz0iY291bnRlciI+KFtbZGF0YXNldHMubGVuZ3RoXV0pPC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51CiAgICAgICAgICBuby1sYWJlbC1mbG9hdAogICAgICAgICAgbm8tYW5pbWF0aW9ucwogICAgICAgICAgbm9pbmsKICAgICAgICAgIGhvcml6b250YWwtYWxpZ249ImxlZnQiCiAgICAgICAgICBjbGFzcz0icnVuLWRyb3Bkb3duIgogICAgICAgID4KICAgICAgICAgIDxwYXBlci1saXN0Ym94CiAgICAgICAgICAgIGNsYXNzPSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgICBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRSdW5JbmRleH19IgogICAgICAgICAgICBzbG90PSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2RhdGFzZXRzXV0iPgogICAgICAgICAgICAgIDxwYXBlci1pdGVtPltbaXRlbS5uYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dTZXNzaW9uUnVuc0Ryb3Bkb3duXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIHRhZ3Mtcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICAgICAgVGFnCiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb3VudGVyIgogICAgICAgICAgICAgID4oW1tfbnVtVGFncyhkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgpXV0pPC9zcGFuCiAgICAgICAgICAgID4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUKICAgICAgICAgICAgbm8tbGFiZWwtZmxvYXQKICAgICAgICAgICAgbm8tYW5pbWF0aW9ucwogICAgICAgICAgICBob3Jpem9udGFsLWFsaWduPSJsZWZ0IgogICAgICAgICAgICBub2luawogICAgICAgICAgICBjbGFzcz0icnVuLWRyb3Bkb3duIgogICAgICAgICAgPgogICAgICAgICAgICA8cGFwZXItbGlzdGJveAogICAgICAgICAgICAgIGNsYXNzPSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgICAgIHNlbGVjdGVkPSJ7e19zZWxlY3RlZFRhZ0luZGV4fX0iCiAgICAgICAgICAgICAgc2xvdD0iZHJvcGRvd24tY29udGVudCIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgICAgICAgICBpdGVtcz0iW1tfZ2V0VGFncyhkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgpXV0iCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+W1tpdGVtLmRpc3BsYXlOYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+R3JhcGggdHlwZTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciBjb250cm9sLW9wdGlvbnMiPgogICAgICAgIDxwYXBlci1yYWRpby1ncm91cAogICAgICAgICAgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkR3JhcGhUeXBlfX0iCiAgICAgICAgICBvbi1wYXBlci1yYWRpby1ncm91cC1jaGFuZ2VkPSJfb25HcmFwaFR5cGVDaGFuZ2VkQnlVc2VyR2VzdHVyZSIKICAgICAgICA+CiAgICAgICAgICA8IS0tIE5vdGUgdGhhdCB0aGUgbmFtZSBoYXMgdG8gbWF0Y2ggdGhhdCBvZiB0Zl9ncmFwaF9jb21tb24uU2VsZWN0aW9uVHlwZS4gLS0+CiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uCiAgICAgICAgICAgIG5hbWU9Im9wX2dyYXBoIgogICAgICAgICAgICBkaXNhYmxlZD0iW1tfZ2V0U2VsZWN0aW9uT3BHcmFwaERpc2FibGVkKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCwgX3NlbGVjdGVkVGFnSW5kZXgpXV0iCiAgICAgICAgICAgID5PcCBncmFwaDwvcGFwZXItcmFkaW8tYnV0dG9uCiAgICAgICAgICA+CiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uCiAgICAgICAgICAgIG5hbWU9ImNvbmNlcHR1YWxfZ3JhcGgiCiAgICAgICAgICAgIGRpc2FibGVkPSJbW19nZXRTZWxlY3Rpb25Db25jZXB0dWFsR3JhcGhEaXNhYmxlZChkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4KV1dIgogICAgICAgICAgICA+Q29uY2VwdHVhbCBncmFwaDwvcGFwZXItcmFkaW8tYnV0dG9uCiAgICAgICAgICA+CiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uCiAgICAgICAgICAgIG5hbWU9InByb2ZpbGUiCiAgICAgICAgICAgIGRpc2FibGVkPSJbW19nZXRTZWxlY3Rpb25Qcm9maWxlRGlzYWJsZWQoZGF0YXNldHMsIF9zZWxlY3RlZFJ1bkluZGV4LCBfc2VsZWN0ZWRUYWdJbmRleCldXSIKICAgICAgICAgICAgPlByb2ZpbGU8L3BhcGVyLXJhZGlvLWJ1dHRvbgogICAgICAgICAgPgogICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+Tm9kZSBvcHRpb25zPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIGNvbnRyb2wtb3B0aW9ucyI+CiAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24KICAgICAgICAgIGNoZWNrZWQ9Int7dHJhY2VJbnB1dHN9fSIKICAgICAgICAgIG9uLWNoYW5nZT0iX29uVHJhY2VJbnB1dHNDaGFuZ2VkQnlVc2VyR2VzdHVyZSIKICAgICAgICA+CiAgICAgICAgICBUcmFjZSBpbnB1dHMKICAgICAgICA8L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2hlY2tlZD0ie3thdXRvRXh0cmFjdE5vZGVzfX0iPgogICAgICAgICAgQXV0by1leHRyYWN0IGhpZ2gtZGVncmVlIG5vZGVzCiAgICAgICAgPC9wYXBlci10b2dnbGUtYnV0dG9uPgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hlYWx0aFBpbGxzRmVhdHVyZUVuYWJsZWRdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2hlY2tlZD0ie3toZWFsdGhQaWxsc1RvZ2dsZWRPbn19IgogICAgICAgICAgICA+U2hvdyBoZWFsdGggcGlsbHM8L3BhcGVyLXRvZ2dsZS1idXR0b24KICAgICAgICAgID4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPkNvbG9yIGJ5PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIGNvbnRyb2wtb3B0aW9ucyI+CiAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwCiAgICAgICAgICBzZWxlY3RlZD0ie3tjb2xvckJ5fX0iCiAgICAgICAgICBvbi1wYXBlci1yYWRpby1ncm91cC1jaGFuZ2VkPSJfb25Db2xvckJ5Q2hhbmdlZEJ5VXNlckdlc3R1cmUiCiAgICAgICAgPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJbW0NvbG9yQnkuTk9ORV1dIj5Ob25lPC9wYXBlci1yYWRpby1idXR0b24+CgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJbW0NvbG9yQnkuU1RSVUNUVVJFXV0iCiAgICAgICAgICAgID5TdHJ1Y3R1cmU8L3BhcGVyLXJhZGlvLWJ1dHRvbgogICAgICAgICAgPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iW1tDb2xvckJ5LkRFVklDRV1dIgogICAgICAgICAgICA+RGV2aWNlPC9wYXBlci1yYWRpby1idXR0b24KICAgICAgICAgID4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uCiAgICAgICAgICAgIGlkPSJ4bGEtY2x1c3Rlci1yYWRpby1idXR0b24iCiAgICAgICAgICAgIG5hbWU9IltbQ29sb3JCeS5YTEFfQ0xVU1RFUl1dIgogICAgICAgICAgICBkaXNhYmxlZD0iW1shX3hsYUNsdXN0ZXJzUHJvdmlkZWQocmVuZGVySGllcmFyY2h5KV1dIgogICAgICAgICAgPgogICAgICAgICAgICBYTEEgY2x1c3RlcgogICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItdG9vbHRpcAogICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgIGZvcj0ieGxhLWNsdXN0ZXItcmFkaW8tYnV0dG9uIgogICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgID4KICAgICAgICAgICAgQ29sb3JpbmcgYnkgWExBIGNsdXN0ZXIgaXMgb25seSBlbmFibGVkIGlmIGF0IGxlYXN0IDEgb3Agc3BlY2lmaWVzCiAgICAgICAgICAgIGFuIFhMQSBjbHVzdGVyLgogICAgICAgICAgPC9wYXBlci10b29sdGlwPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24KICAgICAgICAgICAgaWQ9ImNvbXB1dGUtdGltZS1yYWRpby1idXR0b24iCiAgICAgICAgICAgIG5hbWU9IltbQ29sb3JCeS5DT01QVVRFX1RJTUVdXSIKICAgICAgICAgICAgZGlzYWJsZWQ9IltbIXN0YXRzXV0iCiAgICAgICAgICA+CiAgICAgICAgICAgIENvbXB1dGUgdGltZQogICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItdG9vbHRpcAogICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgIGZvcj0iY29tcHV0ZS10aW1lLXJhZGlvLWJ1dHRvbiIKICAgICAgICAgICAgcG9zaXRpb249InJpZ2h0IgogICAgICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgICA+CiAgICAgICAgICAgIENvbG9yaW5nIGJ5IGNvbXB1dGUgdGltZSBpcyBvbmx5IGVuYWJsZWQgaWYgdGhlIFJ1bk1ldGFkYXRhIHByb3RvIGlzCiAgICAgICAgICAgIHBhc3NlZCB0byB0aGUgRmlsZVdyaXRlciB3aGVuIGEgc3BlY2lmaWMgc2Vzc2lvbiBpcyBydW4uCiAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbgogICAgICAgICAgICBpZD0ibWVtb3J5LXJhZGlvLWJ1dHRvbiIKICAgICAgICAgICAgbmFtZT0iW1tDb2xvckJ5Lk1FTU9SWV1dIgogICAgICAgICAgICBkaXNhYmxlZD0iW1shc3RhdHNdXSIKICAgICAgICAgID4KICAgICAgICAgICAgTWVtb3J5CiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci10b29sdGlwCiAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgZm9yPSJtZW1vcnktcmFkaW8tYnV0dG9uIgogICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgID4KICAgICAgICAgICAgQ29sb3JpbmcgYnkgbWVtb3J5IGlzIG9ubHkgZW5hYmxlZCBpZiB0aGUgUnVuTWV0YWRhdGEgcHJvdG8gaXMKICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSBGaWxlV3JpdGVyIHdoZW4gYSBzcGVjaWZpYyBzZXNzaW9uIGlzIHJ1bi4KICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uCiAgICAgICAgICAgIGlkPSJ0cHUtY29tcGF0aWJpbGl0eS1yYWRpby1idXR0b24iCiAgICAgICAgICAgIG5hbWU9IltbQ29sb3JCeS5PUF9DT01QQVRJQklMSVRZXV0iCiAgICAgICAgICA+CiAgICAgICAgICAgIFRQVSBjb21wYXRpYmlsaXR5CiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci10b29sdGlwCiAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgZm9yPSJ0cHUtY29tcGF0aWJpbGl0eS1yYWRpby1idXR0b24iCiAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICAgPgogICAgICAgICAgICBDb2xvcmluZyBieSB3aGV0aGVyIGFuIG9wZXJhdGlvbiBpcyBjb21wYXRpYmxlIGZvciB0aGUgVFBVIGRldmljZS4KICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgogICAgICAgIDxzcGFuIGNsYXNzPSJzcGFjZXIiPjwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1ob2xkZXIiPgogICAgICA8YnV0dG9uIGNsYXNzPSJsZWdlbmQtdG9vbGJhciIgb24tY2xpY2s9Il90b2dnbGVMZWdlbmRPcGVuIj4KICAgICAgICA8c3BhbiBjbGFzcz0idG9nZ2xlLWxlZ2VuZC10ZXh0Ij5MZWdlbmQ8L3NwYW4+CiAgICAgICAgPGlyb24taWNvbgogICAgICAgICAgaWNvbj0iW1tfZ2V0VG9nZ2xlTGVnZW5kSWNvbihfbGVnZW5kT3BlbmVkKV1dIgogICAgICAgICAgY2xhc3M9InRvZ2dsZS1sZWdlbmQtYnV0dG9uIgogICAgICAgID4KICAgICAgICA8L2lyb24taWNvbj4KICAgICAgPC9idXR0b24+CiAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbGVnZW5kT3BlbmVkXV0iIGNsYXNzPSJsZWdlbmQtY29udGVudCI+CiAgICAgICAgPCEtLSBDb2xvci1tb2RlLXNwZWNpZmljIGxlZ2VuZCBpdGVtcyAtLT4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0dyYWRpZW50Q29sb3Jpbmcoc3RhdHMsIGNvbG9yQnkpXV0iPgogICAgICAgICAgICA8c3ZnIHdpZHRoPSIxNDAiIGhlaWdodD0iMjAiIGNsYXNzPSJjb2xvci10ZXh0IGdyYWRpZW50LWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgICA8bGluZWFyR3JhZGllbnQKICAgICAgICAgICAgICAgICAgaWQ9ImxpbmVhckdyYWRpZW50IgogICAgICAgICAgICAgICAgICB4MT0iMCUiCiAgICAgICAgICAgICAgICAgIHkxPSIwJSIKICAgICAgICAgICAgICAgICAgeDI9IjEwMCUiCiAgICAgICAgICAgICAgICAgIHkyPSIwJSIKICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgPHN0b3AKICAgICAgICAgICAgICAgICAgICBjbGFzcz0ic3RhcnQiCiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwJSIKICAgICAgICAgICAgICAgICAgICBzdG9wLWNvbG9yJD0iW1tfY3VycmVudEdyYWRpZW50UGFyYW1zLnN0YXJ0Q29sb3JdXSIKICAgICAgICAgICAgICAgICAgPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgPHN0b3AKICAgICAgICAgICAgICAgICAgICBjbGFzcz0iZW5kIgogICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMTAwJSIKICAgICAgICAgICAgICAgICAgICBzdG9wLWNvbG9yJD0iW1tfY3VycmVudEdyYWRpZW50UGFyYW1zLmVuZENvbG9yXV0iCiAgICAgICAgICAgICAgICAgID48L3N0b3A+CiAgICAgICAgICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICA8cmVjdAogICAgICAgICAgICAgICAgeD0iMCIKICAgICAgICAgICAgICAgIHk9IjAiCiAgICAgICAgICAgICAgICB3aWR0aD0iMTM1IgogICAgICAgICAgICAgICAgaGVpZ2h0PSIyMCIKICAgICAgICAgICAgICAgIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQpIgogICAgICAgICAgICAgICAgc3Ryb2tlPSJibGFjayIKICAgICAgICAgICAgICA+PC9yZWN0PgogICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZG9tYWluVmFsdWVzIGNvbG9yLXRleHQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRvbWFpblN0YXJ0Ij5bW19jdXJyZW50R3JhZGllbnRQYXJhbXMubWluVmFsdWVdXTwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRvbWFpbkVuZCI+W1tfY3VycmVudEdyYWRpZW50UGFyYW1zLm1heFZhbHVlXV08L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxiciBzdHlsZT0iY2xlYXI6IGJvdGgiIC8+CiAgICAgICAgICAgIDxkaXY+RGV2aWNlcyBpbmNsdWRlZCBpbiBzdGF0czo8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGV2aWNlTGlzdCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY3VycmVudERldmljZXNdXSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93IGRldmljZXMtY2hlY2tib3giPgogICAgICAgICAgICAgICAgICA8c3BhbgogICAgICAgICAgICAgICAgICAgID48aW5wdXQKICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgICAgdmFsdWUkPSJbW2l0ZW0uZGV2aWNlXV0iCiAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkJD0iW1tpdGVtLnVzZWRdXSIKICAgICAgICAgICAgICAgICAgICAgIG9uLWNsaWNrPSJfZGV2aWNlQ2hlY2tib3hDbGlja2VkIgogICAgICAgICAgICAgICAgICAvPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHNwYW4+W1tpdGVtLnN1ZmZpeF1dPC9zcGFuPgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaXRlbS5pZ25vcmVkTXNnXV0iPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgICAgICAgICAgICAgICAgaWNvbj0iaGVscCIKICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJoZWxwLWljb24iCiAgICAgICAgICAgICAgICAgICAgPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgICAgICAgICAgID5bW2l0ZW0uaWdub3JlZE1zZ11dPC9wYXBlci10b29sdGlwCiAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ3N0cnVjdHVyZScpXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci10ZXh0Ij4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsYWJlbCI+IGNvbG9ycyA8L3NwYW4+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5zYW1lIHN1YnN0cnVjdHVyZTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uCiAgICAgICAgICAgICAgICAgIHR5cGU9Ik1FVEEiCiAgICAgICAgICAgICAgICAgIGhlaWdodD0iMTYiCiAgICAgICAgICAgICAgICAgIGZpbGwtb3ZlcnJpZGU9IiNlZWUiCiAgICAgICAgICAgICAgICAgIHN0cm9rZS1vdmVycmlkZT0iI2E2YTZhNiIKICAgICAgICAgICAgICAgID48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj51bmlxdWUgc3Vic3RydWN0dXJlPC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2VxdWFscyhjb2xvckJ5LCAnZGV2aWNlJyldXSI+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY3VycmVudERldmljZVBhcmFtc11dIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbgogICAgICAgICAgICAgICAgICAgIHR5cGU9Ik1FVEEiCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PSIxNiIKICAgICAgICAgICAgICAgICAgICBmaWxsLW92ZXJyaWRlPSJbW2l0ZW0uY29sb3JdXSIKICAgICAgICAgICAgICAgICAgICBzdHJva2Utb3ZlcnJpZGU9IiNhNmE2YTYiCiAgICAgICAgICAgICAgICAgID48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPltbaXRlbS5kZXZpY2VdXTwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbgogICAgICAgICAgICAgICAgICB0eXBlPSJNRVRBIgogICAgICAgICAgICAgICAgICBoZWlnaHQ9IjE2IgogICAgICAgICAgICAgICAgICBmaWxsLW92ZXJyaWRlPSIjZWVlIgogICAgICAgICAgICAgICAgICBzdHJva2Utb3ZlcnJpZGU9IiNhNmE2YTYiCiAgICAgICAgICAgICAgICA+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+dW5rbm93biBkZXZpY2U8L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICd4bGFfY2x1c3RlcicpXV0iPgogICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2N1cnJlbnRYbGFDbHVzdGVyUGFyYW1zXV0iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgICAgIDxzdmc+CiAgICAgICAgICAgICAgICAgICAgPHVzZQogICAgICAgICAgICAgICAgICAgICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgICAgICAgICAgICAgICAgICAgICB4bGluazpocmVmPSIjdW5maWxsZWQtcmVjdCIKICAgICAgICAgICAgICAgICAgICAgIHg9IjAiCiAgICAgICAgICAgICAgICAgICAgICB5PSIwIgogICAgICAgICAgICAgICAgICAgICAgc3R5bGU9ImZpbGw6W1tpdGVtLmNvbG9yXV0iCiAgICAgICAgICAgICAgICAgICAgPjwvdXNlPgogICAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+W1tpdGVtLnhsYV9jbHVzdGVyXV08L3NwYW4+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgICAgPHN2Zz4KICAgICAgICAgICAgICAgICAgPHVzZQogICAgICAgICAgICAgICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICAgICAgICAgICAgICAgICAgIHhsaW5rOmhyZWY9IiNncmV5LXJlY3QiCiAgICAgICAgICAgICAgICAgICAgeD0iMCIKICAgICAgICAgICAgICAgICAgICB5PSIwIgogICAgICAgICAgICAgICAgICA+PC91c2U+CiAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPnVua25vd24gWExBIGNsdXN0ZXI8L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICdvcF9jb21wYXRpYmlsaXR5JyldXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLXRleHQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24KICAgICAgICAgICAgICAgICAgdHlwZT0iT1AiCiAgICAgICAgICAgICAgICAgIGhlaWdodD0iMTYiCiAgICAgICAgICAgICAgICAgIGZpbGwtb3ZlcnJpZGU9IiMwZjlkNTgiCiAgICAgICAgICAgICAgICAgIHN0cm9rZS1vdmVycmlkZT0iI2NjYyIKICAgICAgICAgICAgICAgID48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5WYWxpZCBPcDwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uCiAgICAgICAgICAgICAgICAgIHR5cGU9Ik9QIgogICAgICAgICAgICAgICAgICBoZWlnaHQ9IjE2IgogICAgICAgICAgICAgICAgICBmaWxsLW92ZXJyaWRlPSIjZGI0NDM3IgogICAgICAgICAgICAgICAgICBzdHJva2Utb3ZlcnJpZGU9IiNjY2MiCiAgICAgICAgICAgICAgICA+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+SW52YWxpZCBPcDwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zdGF0c05vdE51bGwoc3RhdHMpXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJNRVRBIiBoZWlnaHQ9IjE2IiBmYWRlZD48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+dW51c2VkIHN1YnN0cnVjdHVyZTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8IS0tIENvbW1vbiBsZWdlbmQgaXRlbXMgLS0+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgPHRib2R5PgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD48L3RkPgogICAgICAgICAgICAgICAgPHRkPigqID0gZXhwYW5kYWJsZSk8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbgogICAgICAgICAgICAgICAgICAgIHR5cGU9Ik1FVEEiCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PSIxNiIKICAgICAgICAgICAgICAgICAgICBmaWxsLW92ZXJyaWRlPSIjZDlkOWQ5IgogICAgICAgICAgICAgICAgICAgIHN0cm9rZS1vdmVycmlkZT0iI2NjYyIKICAgICAgICAgICAgICAgICAgPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZTxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwCiAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgRW5jYXBzdWxhdGVzIGEgc2V0IG9mIG5vZGVzLiBOYW1lc3BhY2UgaXMgaGllcmFyY2hpY2FsIGFuZAogICAgICAgICAgICAgICAgICAgICAgYmFzZWQgb24gc2NvcGUuCiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik9QIiBoZWlnaHQ9IjE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICBPcE5vZGUKICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcAogICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5PSIwIgogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249InJpZ2h0IgogICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgIE5vZGUgdGhhdCBwZXJmb3JtcyBhbiBvcGVyYXRpb24uIFRoZXNlIG5vZGVzIGNhbm5vdAogICAgICAgICAgICAgICAgICAgICAgZXhwYW5kLgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJTRVJJRVMiIGhlaWdodD0iMTYiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIFVuY29ubmVjdGVkIHNlcmllczxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwCiAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2Ugb2YgbnVtYmVyZWQgbm9kZXMgdGhhdCBhcmUgbm90IGNvbm5lY3RlZCB0byBlYWNoCiAgICAgICAgICAgICAgICAgICAgICBvdGhlci4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24KICAgICAgICAgICAgICAgICAgICB0eXBlPSJTRVJJRVMiCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PSIxNiIKICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbAogICAgICAgICAgICAgICAgICA+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgQ29ubmVjdGVkIHNlcmllczxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwCiAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2Ugb2YgbnVtYmVyZWQgbm9kZXMgdGhhdCBhcmUgY29ubmVjdGVkIHRvIGVhY2gKICAgICAgICAgICAgICAgICAgICAgIG90aGVyLgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJpY29uIj4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlCiAgICAgICAgICAgICAgICAgICAgICBmaWxsPSJ3aGl0ZSIKICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT0iIzg0ODQ4NCIKICAgICAgICAgICAgICAgICAgICAgIGN4PSIxMCIKICAgICAgICAgICAgICAgICAgICAgIGN5PSIxMCIKICAgICAgICAgICAgICAgICAgICAgIHI9IjUiCiAgICAgICAgICAgICAgICAgICAgPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIENvbnN0YW50CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICBOb2RlIHRoYXQgb3V0cHV0cyBhIGNvbnN0YW50IHZhbHVlLgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJTVU1NQVJZIiBoZWlnaHQ9IjIwIj48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICBTdW1tYXJ5CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICBOb2RlIHRoYXQgY29sbGVjdHMgZGF0YSBmb3IgdmlzdWFsaXphdGlvbiB3aXRoaW4KICAgICAgICAgICAgICAgICAgICAgIFRlbnNvckJvYXJkLgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8c3ZnCiAgICAgICAgICAgICAgICAgICAgY2xhc3M9Imljb24iCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PSIxNXB4IgogICAgICAgICAgICAgICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWlkIG1lZXQiCiAgICAgICAgICAgICAgICAgICAgdmlld0JveD0iMCAwIDE1IDE1IgogICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgICAgICAgICA8bWFya2VyCiAgICAgICAgICAgICAgICAgICAgICAgIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbGVnZW5kIgogICAgICAgICAgICAgICAgICAgICAgICBmaWxsPSIjYmJiIgogICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJXaWR0aD0iMTAiCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckhlaWdodD0iMTAiCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZlg9IjkiCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZlk9IjUiCiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIgogICAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNIDAsMCBMIDEwLDUgTCAwLDEwIEMgMyw3IDMsMyAwLDAiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgIDwvbWFya2VyPgogICAgICAgICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgICAgICAgICAgbWFya2VyLWVuZD0idXJsKCNkYXRhZmxvdy1hcnJvd2hlYWQtbGVnZW5kKSIKICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT0iI2JiYiIKICAgICAgICAgICAgICAgICAgICAgIGQ9Ik0yIDkgbCAyOSAwIgogICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogICAgICAgICAgICAgICAgICAgID48L3BhdGg+CiAgICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgRGF0YWZsb3cgZWRnZQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwCiAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgRWRnZSBzaG93aW5nIHRoZSBkYXRhIGZsb3cgYmV0d2VlbiBvcGVyYXRpb25zLiBFZGdlcyBmbG93CiAgICAgICAgICAgICAgICAgICAgICB1cHdhcmRzIHVubGVzcyBhcnJvd2hlYWRzIHNwZWNpZnkgb3RoZXJ3aXNlLgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8c3ZnCiAgICAgICAgICAgICAgICAgICAgY2xhc3M9Imljb24iCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PSIxNXB4IgogICAgICAgICAgICAgICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWlkIG1lZXQiCiAgICAgICAgICAgICAgICAgICAgdmlld0JveD0iMCAwIDE1IDE1IgogICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT0iI2JiYiIKICAgICAgICAgICAgICAgICAgICAgIGQ9Ik0yIDkgbCAyOSAwIgogICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWRhc2hhcnJheT0iMiwgMiIKICAgICAgICAgICAgICAgICAgICA+PC9wYXRoPgogICAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIENvbnRyb2wgZGVwZW5kZW5jeSBlZGdlCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICBFZGdlIHNob3dpbmcgdGhlIGNvbnRyb2wgZGVwZW5kZW5jeSBiZXR3ZWVuIG9wZXJhdGlvbnMuCiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIDxzdmcKICAgICAgICAgICAgICAgICAgICBjbGFzcz0iaWNvbiIKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9IjE1cHgiCiAgICAgICAgICAgICAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pbllNaWQgbWVldCIKICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PSIwIDAgMTUgMTUiCiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICA8ZGVmcz4KICAgICAgICAgICAgICAgICAgICAgIDxtYXJrZXIKICAgICAgICAgICAgICAgICAgICAgICAgaWQ9InJlZmVyZW5jZS1hcnJvd2hlYWQtbGVnZW5kIgogICAgICAgICAgICAgICAgICAgICAgICBmaWxsPSIjRkZCNzREIgogICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJXaWR0aD0iMTAiCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckhlaWdodD0iMTAiCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZlg9IjkiCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZlk9IjUiCiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIgogICAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNIDAsMCBMIDEwLDUgTCAwLDEwIEMgMyw3IDMsMyAwLDAiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgIDwvbWFya2VyPgogICAgICAgICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgICAgICAgICAgbWFya2VyLWVuZD0idXJsKCNyZWZlcmVuY2UtYXJyb3doZWFkLWxlZ2VuZCkiCiAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9IiNGRkI3NEQiCiAgICAgICAgICAgICAgICAgICAgICBkPSJNMiA5IGwgMjkgMCIKICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIKICAgICAgICAgICAgICAgICAgICA+PC9wYXRoPgogICAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZSBlZGdlCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICBFZGdlIHNob3dpbmcgdGhhdCB0aGUgb3V0Z29pbmcgb3BlcmF0aW9uIG5vZGUgY2FuIG11dGF0ZQogICAgICAgICAgICAgICAgICAgICAgdGhlIGluY29taW5nIHRlbnNvci4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgPC9kaXY+CiAgYCx0KFtvKHt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3N0YXRzQ2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sc1l0LnByb3RvdHlwZSwic3RhdHMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHNZdC5wcm90b3R5cGUsImRldmljZXNGb3JTdGF0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sc1l0LnByb3RvdHlwZSwiY29sb3JCeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sc1l0LnByb3RvdHlwZSwiY29sb3JCeVBhcmFtcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5LG9ic2VydmVyOiJfZGF0YXNldHNDaGFuZ2VkIn0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxzWXQucHJvdG90eXBlLCJkYXRhc2V0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIix5V3QpXSxzWXQucHJvdG90eXBlLCJyZW5kZXJIaWVyYXJjaHkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwLGNvbXB1dGVkOiJfY29tcHV0ZVNlbGVjdGlvbihkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4LCBfc2VsZWN0ZWRHcmFwaFR5cGUpIn0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxzWXQucHJvdG90eXBlLCJzZWxlY3Rpb24iLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHNZdC5wcm90b3R5cGUsInNlbGVjdGVkRmlsZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcixvYnNlcnZlcjoiX3NlbGVjdGVkUnVuSW5kZXhDaGFuZ2VkIn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxzWXQucHJvdG90eXBlLCJfc2VsZWN0ZWRSdW5JbmRleCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxzWXQucHJvdG90eXBlLCJ0cmFjZUlucHV0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxzWXQucHJvdG90eXBlLCJhdXRvRXh0cmFjdE5vZGVzIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLG9ic2VydmVyOiJfc2VsZWN0ZWRUYWdJbmRleENoYW5nZWQifSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLHNZdC5wcm90b3R5cGUsIl9zZWxlY3RlZFRhZ0luZGV4Iix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHNZdC5wcm90b3R5cGUsIl9zZWxlY3RlZEdyYXBoVHlwZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sc1l0LnByb3RvdHlwZSwic2VsZWN0ZWROb2RlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sc1l0LnByb3RvdHlwZSwic2hvd1Nlc3Npb25SdW5zRHJvcGRvd24iLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxzWXQucHJvdG90eXBlLCJzaG93VXBsb2FkQnV0dG9uIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sc1l0LnByb3RvdHlwZSwiaGVhbHRoUGlsbHNGZWF0dXJlRW5hYmxlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxzWXQucHJvdG90eXBlLCJoZWFsdGhQaWxsc1RvZ2dsZWRPbiIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLHNZdC5wcm90b3R5cGUsIl9sZWdlbmRPcGVuZWQiLHZvaWQgMCksdChbcygiZGV2aWNlc0ZvclN0YXRzIiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxzWXQucHJvdG90eXBlLCJfY3VycmVudERldmljZXMiLG51bGwpLHQoW3MoImNvbG9yQnlQYXJhbXMiKSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLHNZdC5wcm90b3R5cGUsIl9jdXJyZW50RGV2aWNlUGFyYW1zIixudWxsKSx0KFtzKCJjb2xvckJ5UGFyYW1zIiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxzWXQucHJvdG90eXBlLCJfY3VycmVudFhsYUNsdXN0ZXJQYXJhbXMiLG51bGwpLHQoW3MoImNvbG9yQnlQYXJhbXMiLCJjb2xvckJ5IiksZSgiZGVzaWduOnR5cGUiLE9iamVjdCksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sc1l0LnByb3RvdHlwZSwiX2N1cnJlbnRHcmFkaWVudFBhcmFtcyIsbnVsbCksc1l0PXQoW2koInRmLWdyYXBoLWNvbnRyb2xzIildLHNZdCk7Y2xhc3MgbFl0e2lzTm90VHB1T3AodCl7cmV0dXJuLTEhPXQudG9Mb3dlckNhc2UoKS5zZWFyY2goImNwdToiKXx8LTEhPXQudG9Mb3dlckNhc2UoKS5zZWFyY2goImdwdToiKXx8LTE9PXQudG9Mb3dlckNhc2UoKS5zZWFyY2goInRwdSIpfW9wVmFsaWQodCl7cmV0dXJuIDA9PXQubmFtZS5zZWFyY2goVkd0KXx8IXQub3B8fCEoIXQuZGV2aWNlfHwhdGhpcy5pc05vdFRwdU9wKHQuZGV2aWNlKSl8fCEoIXQuZGV2aWNlfHwtMT09dC5kZXZpY2Uuc2VhcmNoKCJUUFVfU1lTVEVNIikpfHxTZS5leHBvcnRzLmluY2x1ZGVzKGxZdC5XSElURUxJU1QsdC5vcCl9fWZ1bmN0aW9uIGNZdCh0KXtyZXR1cm4gbmV3IFByb21pc2UoKChlLG4pPT57ZmV0Y2godCkudGhlbigodD0+e3Qub2s/dC5hcnJheUJ1ZmZlcigpLnRoZW4oZSxuKTp0LnRleHQoKS50aGVuKG4sbil9KSl9KSl9bFl0LldISVRFTElTVD1bIkFicyIsIkFjb3MiLCJBY29zaCIsIkFkZCIsIkFkZE4iLCJBZGRWMiIsIkFkanVzdENvbnRyYXN0djIiLCJBZGp1c3RIdWUiLCJBZGp1c3RTYXR1cmF0aW9uIiwiQWxsIiwiQWxsVG9BbGwiLCJBbmdsZSIsIkFueSIsIkFwcHJveGltYXRlRXF1YWwiLCJBcmdNYXgiLCJBcmdNaW4iLCJBc2luIiwiQXNpbmgiLCJBc3NlcnQiLCJBc3NpZ25BZGRWYXJpYWJsZU9wIiwiQXNzaWduU3ViVmFyaWFibGVPcCIsIkFzc2lnblZhcmlhYmxlT3AiLCJBdGFuIiwiQXRhbjIiLCJBdGFuaCIsIkF2Z1Bvb2wiLCJBdmdQb29sM0QiLCJBdmdQb29sM0RHcmFkIiwiQXZnUG9vbEdyYWQiLCJCYXRjaE1hdE11bCIsIkJhdGNoTWF0TXVsVjIiLCJCYXRjaFRvU3BhY2UiLCJCYXRjaFRvU3BhY2VORCIsIkJlc3NlbEkwZSIsIkJlc3NlbEkxZSIsIkJldGFpbmMiLCJCaWFzQWRkIiwiQmlhc0FkZEdyYWQiLCJCaWFzQWRkVjEiLCJCaXRjYXN0IiwiQml0d2lzZUFuZCIsIkJpdHdpc2VPciIsIkJpdHdpc2VYb3IiLCJCcm9hZGNhc3RBcmdzIiwiQnJvYWRjYXN0R3JhZGllbnRBcmdzIiwiQnJvYWRjYXN0VG8iLCJCdWNrZXRpemUiLCJDYXNlIiwiQ2FzdCIsIkNlaWwiLCJDaGVja051bWVyaWNzIiwiQ2hvbGVza3kiLCJDbGlwQnlWYWx1ZSIsIkNvbGxlY3RpdmVQZXJtdXRlIiwiQ29sbGVjdGl2ZVJlZHVjZVYyIiwiQ29tcGxleCIsIkNvbXBsZXhBYnMiLCJDb25jYXQiLCJDb25jYXRPZmZzZXQiLCJDb25jYXRWMiIsIkNvbmoiLCJDb25qdWdhdGVUcmFuc3Bvc2UiLCJDb25zdCIsIkNvbnRyb2xUcmlnZ2VyIiwiQ29udjJEIiwiQ29udjJEQmFja3Byb3BGaWx0ZXIiLCJDb252MkRCYWNrcHJvcElucHV0IiwiQ29udjNEIiwiQ29udjNEQmFja3Byb3BGaWx0ZXJWMiIsIkNvbnYzREJhY2twcm9wSW5wdXRWMiIsIkNvcyIsIkNvc2giLCJDcm9zcyIsIkNyb3NzUmVwbGljYVN1bSIsIkN1bXByb2QiLCJDdW1zdW0iLCJEYXRhRm9ybWF0RGltTWFwIiwiRGF0YUZvcm1hdFZlY1Blcm11dGUiLCJEZXB0aFRvU3BhY2UiLCJEZXB0aHdpc2VDb252MmROYXRpdmUiLCJEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciIsIkRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQiLCJEZXF1YW50aXplIiwiRGV2aWNlSW5kZXgiLCJEaWFnIiwiRGlhZ1BhcnQiLCJEaWdhbW1hIiwiRGl2IiwiRGl2Tm9OYW4iLCJEeW5hbWljU3RpdGNoIiwiRWluc3VtIiwiRWx1IiwiRWx1R3JhZCIsIkVtcHR5IiwiRW1wdHlUZW5zb3JMaXN0IiwiRW5zdXJlU2hhcGUiLCJFcXVhbCIsIkVyZiIsIkVyZmMiLCJFcmZpbnYiLCJFeHAiLCJFeHBhbmREaW1zIiwiRXhwbTEiLCJFeHRyYWN0SW1hZ2VQYXRjaGVzIiwiRkZUIiwiRkZUMkQiLCJGRlQzRCIsIkZha2VQYXJhbSIsIkZha2VRdWFudFdpdGhNaW5NYXhBcmdzIiwiRmFrZVF1YW50V2l0aE1pbk1heEFyZ3NHcmFkaWVudCIsIkZha2VRdWFudFdpdGhNaW5NYXhWYXJzIiwiRmFrZVF1YW50V2l0aE1pbk1heFZhcnNHcmFkaWVudCIsIkZpbGwiLCJGbG9vciIsIkZsb29yRGl2IiwiRmxvb3JNb2QiLCJGdXNlZEJhdGNoTm9ybSIsIkZ1c2VkQmF0Y2hOb3JtR3JhZCIsIkZ1c2VkQmF0Y2hOb3JtR3JhZFYyIiwiRnVzZWRCYXRjaE5vcm1HcmFkVjMiLCJGdXNlZEJhdGNoTm9ybVYyIiwiRnVzZWRCYXRjaE5vcm1WMyIsIkdhdGhlciIsIkdhdGhlck5kIiwiR2F0aGVyVjIiLCJHZXRJdGVtIiwiR3JlYXRlciIsIkdyZWF0ZXJFcXVhbCIsIkhTVlRvUkdCIiwiSUZGVCIsIklGRlQyRCIsIklGRlQzRCIsIklSRkZUIiwiSVJGRlQyRCIsIklSRkZUM0QiLCJJZGVudGl0eSIsIklkZW50aXR5TiIsIklmIiwiSWdhbW1hIiwiSWdhbW1hR3JhZEEiLCJJZ2FtbWFjIiwiSW1hZyIsIkluVG9wS1YyIiwiSW5mZWVkRGVxdWV1ZSIsIkluZmVlZERlcXVldWVUdXBsZSIsIklucGxhY2VBZGQiLCJJbnBsYWNlVXBkYXRlIiwiSW52IiwiSW52ZXJ0IiwiSW52ZXJ0UGVybXV0YXRpb24iLCJJc0Zpbml0ZSIsIklzSW5mIiwiSXNOYW4iLCJLdGhPcmRlclN0YXRpc3RpYyIsIkwyTG9zcyIsIkxSTiIsIkxSTkdyYWQiLCJMZWFreVJlbHUiLCJMZWFreVJlbHVHcmFkIiwiTGVmdFNoaWZ0IiwiTGVzcyIsIkxlc3NFcXVhbCIsIkxnYW1tYSIsIkxpblNwYWNlIiwiTGlzdERpZmYiLCJMb2ciLCJMb2cxcCIsIkxvZ1NvZnRtYXgiLCJMb2dpY2FsQW5kIiwiTG9naWNhbE5vdCIsIkxvZ2ljYWxPciIsIkxvd2VyQm91bmQiLCJNYWtlVW5pcXVlIiwiTWF0TXVsIiwiTWF0cml4QmFuZFBhcnQiLCJNYXRyaXhEaWFnIiwiTWF0cml4RGlhZ1BhcnQiLCJNYXRyaXhEaWFnUGFydFYyIiwiTWF0cml4RGlhZ1BhcnRWMyIsIk1hdHJpeERpYWdWMiIsIk1hdHJpeERpYWdWMyIsIk1hdHJpeEludmVyc2UiLCJNYXRyaXhTZXREaWFnIiwiTWF0cml4U2V0RGlhZ1YyIiwiTWF0cml4U2V0RGlhZ1YzIiwiTWF0cml4U29sdmUiLCJNYXRyaXhUcmlhbmd1bGFyU29sdmUiLCJNYXgiLCJNYXhQb29sIiwiTWF4UG9vbDNEIiwiTWF4UG9vbDNER3JhZCIsIk1heFBvb2wzREdyYWRHcmFkIiwiTWF4UG9vbEdyYWQiLCJNYXhQb29sR3JhZEdyYWQiLCJNYXhQb29sR3JhZEdyYWRWMiIsIk1heFBvb2xHcmFkVjIiLCJNYXhQb29sVjIiLCJNYXhpbXVtIiwiTWVhbiIsIk1pbiIsIk1pbmltdW0iLCJNaXJyb3JQYWQiLCJNaXJyb3JQYWRHcmFkIiwiTW9kIiwiTXVsIiwiTXVsTm9OYW4iLCJNdWx0aW5vbWlhbCIsIk5kdHJpIiwiTmVnIiwiTmV4dEFmdGVyIiwiTm9PcCIsIk5vbk1heFN1cHByZXNzaW9uVjQiLCJOb3RFcXVhbCIsIk9uZUhvdCIsIk9uZXNMaWtlIiwiT3V0ZmVlZEVucXVldWUiLCJPdXRmZWVkRW5xdWV1ZVR1cGxlIiwiUGFjayIsIlBhZCIsIlBhZFYyIiwiUGFyYWxsZWxEeW5hbWljU3RpdGNoIiwiUGFyYW1ldGVyaXplZFRydW5jYXRlZE5vcm1hbCIsIlBhcnRpdGlvbmVkQ2FsbCIsIlBsYWNlaG9sZGVyV2l0aERlZmF1bHQiLCJQb2x5Z2FtbWEiLCJQb3B1bGF0aW9uQ291bnQiLCJQb3ciLCJQcmV2ZW50R3JhZGllbnQiLCJQcm9kIiwiUXIiLCJRdWFudGl6ZUFuZERlcXVhbnRpemVWMiIsIlF1YW50aXplQW5kRGVxdWFudGl6ZVYzIiwiUkZGVCIsIlJGRlQyRCIsIlJGRlQzRCIsIlJHQlRvSFNWIiwiUmFuZG9tR2FtbWFHcmFkIiwiUmFuZG9tU2h1ZmZsZSIsIlJhbmRvbVN0YW5kYXJkTm9ybWFsIiwiUmFuZG9tVW5pZm9ybSIsIlJhbmRvbVVuaWZvcm1JbnQiLCJSYW5nZSIsIlJhbmsiLCJSZWFkVmFyaWFibGVPcCIsIlJlYWwiLCJSZWFsRGl2IiwiUmVjaXByb2NhbCIsIlJlY2lwcm9jYWxHcmFkIiwiUmVsdSIsIlJlbHU2IiwiUmVsdTZHcmFkIiwiUmVsdUdyYWQiLCJSZXNoYXBlIiwiUmVzaXplQmlsaW5lYXIiLCJSZXNpemVCaWxpbmVhckdyYWQiLCJSZXNpemVOZWFyZXN0TmVpZ2hib3IiLCJSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkIiwiUmVzb3VyY2VBcHBseUFkYU1heCIsIlJlc291cmNlQXBwbHlBZGFkZWx0YSIsIlJlc291cmNlQXBwbHlBZGFncmFkIiwiUmVzb3VyY2VBcHBseUFkYWdyYWREQSIsIlJlc291cmNlQXBwbHlBZGFncmFkVjIiLCJSZXNvdXJjZUFwcGx5QWRhbSIsIlJlc291cmNlQXBwbHlBZGRTaWduIiwiUmVzb3VyY2VBcHBseUNlbnRlcmVkUk1TUHJvcCIsIlJlc291cmNlQXBwbHlGdHJsIiwiUmVzb3VyY2VBcHBseUZ0cmxWMiIsIlJlc291cmNlQXBwbHlHcmFkaWVudERlc2NlbnQiLCJSZXNvdXJjZUFwcGx5S2VyYXNNb21lbnR1bSIsIlJlc291cmNlQXBwbHlNb21lbnR1bSIsIlJlc291cmNlQXBwbHlQb3dlclNpZ24iLCJSZXNvdXJjZUFwcGx5UHJveGltYWxBZGFncmFkIiwiUmVzb3VyY2VBcHBseVByb3hpbWFsR3JhZGllbnREZXNjZW50IiwiUmVzb3VyY2VBcHBseVJNU1Byb3AiLCJSZXNvdXJjZUdhdGhlciIsIlJlc291cmNlU2NhdHRlckFkZCIsIlJlc291cmNlU2NhdHRlckRpdiIsIlJlc291cmNlU2NhdHRlck1heCIsIlJlc291cmNlU2NhdHRlck1pbiIsIlJlc291cmNlU2NhdHRlck11bCIsIlJlc291cmNlU2NhdHRlck5kQWRkIiwiUmVzb3VyY2VTY2F0dGVyTmRTdWIiLCJSZXNvdXJjZVNjYXR0ZXJOZFVwZGF0ZSIsIlJlc291cmNlU2NhdHRlclN1YiIsIlJlc291cmNlU2NhdHRlclVwZGF0ZSIsIlJlc291cmNlU3RyaWRlZFNsaWNlQXNzaWduIiwiUmV2ZXJzZSIsIlJldmVyc2VTZXF1ZW5jZSIsIlJldmVyc2VWMiIsIlJpZ2h0U2hpZnQiLCJSaW50IiwiUm5nUmVhZEFuZFNraXAiLCJSbmdTa2lwIiwiUm9sbCIsIlJvdW5kIiwiUnNxcnQiLCJSc3FydEdyYWQiLCJTY2F0dGVyTmQiLCJTZWxlY3QiLCJTZWxlY3RWMiIsIlNlbGZBZGpvaW50RWlnVjIiLCJTZWx1IiwiU2VsdUdyYWQiLCJTaGFwZSIsIlNoYXBlTiIsIlNpZ21vaWQiLCJTaWdtb2lkR3JhZCIsIlNpZ24iLCJTaW4iLCJTaW5oIiwiU2l6ZSIsIlNsaWNlIiwiU25hcHNob3QiLCJTb2Z0bWF4IiwiU29mdG1heENyb3NzRW50cm9weVdpdGhMb2dpdHMiLCJTb2Z0cGx1cyIsIlNvZnRwbHVzR3JhZCIsIlNvZnRzaWduIiwiU29mdHNpZ25HcmFkIiwiU3BhY2VUb0JhdGNoIiwiU3BhY2VUb0JhdGNoTkQiLCJTcGFjZVRvRGVwdGgiLCJTcGFyc2VNYXRNdWwiLCJTcGFyc2VTb2Z0bWF4Q3Jvc3NFbnRyb3B5V2l0aExvZ2l0cyIsIlNwYXJzZVRvRGVuc2UiLCJTcGxpdCIsIlNwbGl0ViIsIlNxcnQiLCJTcXJ0R3JhZCIsIlNxdWFyZSIsIlNxdWFyZWREaWZmZXJlbmNlIiwiU3F1ZWV6ZSIsIlN0YWNrQ2xvc2VWMiIsIlN0YWNrUG9wVjIiLCJTdGFja1B1c2hWMiIsIlN0YWNrVjIiLCJTdGF0ZWZ1bFBhcnRpdGlvbmVkQ2FsbCIsIlN0YXRlZnVsU3RhbmRhcmROb3JtYWxWMiIsIlN0YXRlZnVsVHJ1bmNhdGVkTm9ybWFsIiwiU3RhdGVmdWxVbmlmb3JtIiwiU3RhdGVmdWxVbmlmb3JtRnVsbEludCIsIlN0YXRlZnVsVW5pZm9ybUludCIsIlN0YXRlbGVzc0Nhc2UiLCJTdGF0ZWxlc3NJZiIsIlN0YXRlbGVzc011bHRpbm9taWFsIiwiU3RhdGVsZXNzUmFuZG9tR2V0QWxnIiwiU3RhdGVsZXNzUmFuZG9tR2V0S2V5Q291bnRlciIsIlN0YXRlbGVzc1JhbmRvbUdldEtleUNvdW50ZXJBbGciLCJTdGF0ZWxlc3NSYW5kb21Ob3JtYWwiLCJTdGF0ZWxlc3NSYW5kb21Ob3JtYWxWMiIsIlN0YXRlbGVzc1JhbmRvbVVuaWZvcm0iLCJTdGF0ZWxlc3NSYW5kb21Vbmlmb3JtRnVsbEludCIsIlN0YXRlbGVzc1JhbmRvbVVuaWZvcm1GdWxsSW50VjIiLCJTdGF0ZWxlc3NSYW5kb21Vbmlmb3JtSW50IiwiU3RhdGVsZXNzUmFuZG9tVW5pZm9ybUludFYyIiwiU3RhdGVsZXNzUmFuZG9tVW5pZm9ybVYyIiwiU3RhdGVsZXNzVHJ1bmNhdGVkTm9ybWFsIiwiU3RhdGVsZXNzVHJ1bmNhdGVkTm9ybWFsVjIiLCJTdGF0ZWxlc3NXaGlsZSIsIlN0b3BHcmFkaWVudCIsIlN0cmlkZWRTbGljZSIsIlN0cmlkZWRTbGljZUdyYWQiLCJTdWIiLCJTdW0iLCJTdmQiLCJTeW1ib2xpY0dyYWRpZW50IiwiVFBVRW1iZWRkaW5nQWN0aXZhdGlvbnMiLCJUYW4iLCJUYW5oIiwiVGFuaEdyYWQiLCJUZW5zb3JBcnJheUNsb3NlVjMiLCJUZW5zb3JBcnJheUNvbmNhdFYzIiwiVGVuc29yQXJyYXlHYXRoZXJWMyIsIlRlbnNvckFycmF5R3JhZFYzIiwiVGVuc29yQXJyYXlSZWFkVjMiLCJUZW5zb3JBcnJheVNjYXR0ZXJWMyIsIlRlbnNvckFycmF5U2l6ZVYzIiwiVGVuc29yQXJyYXlTcGxpdFYzIiwiVGVuc29yQXJyYXlWMyIsIlRlbnNvckFycmF5V3JpdGVWMyIsIlRlbnNvckxpc3RDb25jYXRWMiIsIlRlbnNvckxpc3RFbGVtZW50U2hhcGUiLCJUZW5zb3JMaXN0RnJvbVRlbnNvciIsIlRlbnNvckxpc3RHYXRoZXIiLCJUZW5zb3JMaXN0R2V0SXRlbSIsIlRlbnNvckxpc3RMZW5ndGgiLCJUZW5zb3JMaXN0UG9wQmFjayIsIlRlbnNvckxpc3RQdXNoQmFjayIsIlRlbnNvckxpc3RSZXNlcnZlIiwiVGVuc29yTGlzdFNldEl0ZW0iLCJUZW5zb3JMaXN0U3BsaXQiLCJUZW5zb3JMaXN0U3RhY2siLCJUZW5zb3JTY2F0dGVyQWRkIiwiVGVuc29yU2NhdHRlck1heCIsIlRlbnNvclNjYXR0ZXJNaW4iLCJUZW5zb3JTY2F0dGVyU3ViIiwiVGVuc29yU2NhdHRlclVwZGF0ZSIsIlRlbnNvclN0cmlkZWRTbGljZVVwZGF0ZSIsIlRpbGUiLCJUb3BLVW5pcXVlIiwiVG9wS1YyIiwiVG9wS1dpdGhVbmlxdWUiLCJUcmFuc3Bvc2UiLCJUcmlkaWFnb25hbFNvbHZlIiwiVHJ1bmNhdGVEaXYiLCJUcnVuY2F0ZU1vZCIsIlRydW5jYXRlZE5vcm1hbCIsIlVuaXF1ZSIsIlVucGFjayIsIlVuc29ydGVkU2VnbWVudE1heCIsIlVuc29ydGVkU2VnbWVudE1pbiIsIlVuc29ydGVkU2VnbWVudFByb2QiLCJVbnNvcnRlZFNlZ21lbnRTdW0iLCJVcHBlckJvdW5kIiwiVmFySXNJbml0aWFsaXplZE9wIiwiVmFyaWFibGVTaGFwZSIsIldoZXJlIiwiV2hpbGUiLCJYZGl2eSIsIlhsYUJyb2FkY2FzdEhlbHBlciIsIlhsYUNvbnYiLCJYbGFDb252VjIiLCJYbGFEZXF1YW50aXplIiwiWGxhRG90IiwiWGxhRG90VjIiLCJYbGFEeW5hbWljU2xpY2UiLCJYbGFEeW5hbWljVXBkYXRlU2xpY2UiLCJYbGFFaW5zdW0iLCJYbGFHYXRoZXIiLCJYbGFIb3N0Q29tcHV0ZSIsIlhsYUlmIiwiWGxhS2V5VmFsdWVTb3J0IiwiWGxhUGFkIiwiWGxhUmVjdiIsIlhsYVJlY3ZGcm9tSG9zdCIsIlhsYVJlZHVjZSIsIlhsYVJlZHVjZVdpbmRvdyIsIlhsYVJlcGxpY2FJZCIsIlhsYVNjYXR0ZXIiLCJYbGFTZWxlY3RBbmRTY2F0dGVyIiwiWGxhU2VsZkFkam9pbnRFaWciLCJYbGFTZW5kIiwiWGxhU2VuZFRvSG9zdCIsIlhsYVNldEJvdW5kIiwiWGxhU2V0RHluYW1pY0RpbWVuc2lvblNpemUiLCJYbGFTaGFyZGluZyIsIlhsYVNvcnQiLCJYbGFTcG1kRnVsbFRvU2hhcmRTaGFwZSIsIlhsYVNwbWRTaGFyZFRvRnVsbFNoYXBlIiwiWGxhU3ZkIiwiWGxhVmFyaWFkaWNSZWR1Y2UiLCJYbGFWYXJpYWRpY1NvcnQiLCJYbGFXaGlsZSIsIlhsb2cxcHkiLCJYbG9neSIsIlplcm9zTGlrZSIsIlpldGEiLCJFbnRlciIsIkV4aXQiLCJMb29wQ29uZCIsIk1lcmdlIiwiTmV4dEl0ZXJhdGlvbiIsIlN3aXRjaCIsIl9BcmciLCJfQXJyYXlUb0xpc3QiLCJfRnVzZWRCYXRjaE5vcm1FeCIsIl9MaXN0VG9BcnJheSIsIl9QYXJhbGxlbENvbmNhdFVwZGF0ZSIsIl9SZWN2VFBVRW1iZWRkaW5nQWN0aXZhdGlvbnMiLCJfUmVjdlRQVUVtYmVkZGluZ0RlZHVwbGljYXRpb25EYXRhIiwiX1JldHZhbCIsIl9TZW5kVFBVRW1iZWRkaW5nR3JhZGllbnRzIiwiX1RQVUNvbXBpbGUiLCJfVFBVRXhlY3V0ZSIsIl9VbmFyeU9wc0NvbXBvc2l0aW9uIiwiVFBVQ29tcGlsYXRpb25SZXN1bHQiLCJUUFVSZXBsaWNhdGVkSW5wdXQiLCJUUFVSZXBsaWNhdGVkT3V0cHV0IiwiVFBVUmVwbGljYXRlTWV0YWRhdGEiLCJNZXJnZVYyQ2hlY2twb2ludHMiLCJSZXN0b3JlVjIiLCJTYXZlVjIiLCJBYm9ydCIsIkFzc2VydCIsIkFzc2lnbiIsIlBsYWNlaG9sZGVyIiwiUGxhY2Vob2xkZXJWMiIsIlNoYXJkZWRGaWxlbmFtZSIsIlN0cmluZ0pvaW4iLCJWYXJpYWJsZSIsIlZhcmlhYmxlVjIiLCJWYXJIYW5kbGVPcCIsIkF1ZGlvU3VtbWFyeSIsIkF1ZGlvU3VtbWFyeVYyIiwiRGVidWdOdW1lcmljU3VtbWFyeSIsIkhpc3RvZ3JhbVN1bW1hcnkiLCJJbWFnZVN1bW1hcnkiLCJNZXJnZVN1bW1hcnkiLCJTY2FsYXJTdW1tYXJ5IiwiU3RhdHNBZ2dyZWdhdG9yU3VtbWFyeSJdO2NvbnN0IHVZdD17ImxpYnJhcnkuZnVuY3Rpb24iOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5pbnB1dCI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ciI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LmIiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5mIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QuZnVuYyI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LmkiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5zIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3Quc2hhcGUiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5zaGFwZS5kaW0iOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC50ZW5zb3IiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC50eXBlIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLnNoYXBlLmRpbSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS50ZW5zb3Iuc3RyaW5nX3ZhbCI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS50ZW5zb3IudGVuc29yX3NoYXBlLmRpbSI6ITAsImxpYnJhcnkuZnVuY3Rpb24uc2lnbmF0dXJlLmlucHV0X2FyZyI6ITAsImxpYnJhcnkuZnVuY3Rpb24uc2lnbmF0dXJlLm91dHB1dF9hcmciOiEwLCJsaWJyYXJ5LnZlcnNpb25zIjohMCxub2RlOiEwLCJub2RlLmlucHV0IjohMCwibm9kZS5hdHRyIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QuYiI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LmYiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5mdW5jIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QuaSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnMiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5zaGFwZSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnNoYXBlLmRpbSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnRlbnNvciI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnR5cGUiOiEwLCJub2RlLmF0dHIudmFsdWUuc2hhcGUuZGltIjohMCwibm9kZS5hdHRyLnZhbHVlLnRlbnNvci5zdHJpbmdfdmFsIjohMCwibm9kZS5hdHRyLnZhbHVlLnRlbnNvci50ZW5zb3Jfc2hhcGUuZGltIjohMH0saFl0PXsic3RlcF9zdGF0cy5kZXZfc3RhdHMiOiEwLCJzdGVwX3N0YXRzLmRldl9zdGF0cy5ub2RlX3N0YXRzIjohMCwic3RlcF9zdGF0cy5kZXZfc3RhdHMubm9kZV9zdGF0cy5vdXRwdXQiOiEwLCJzdGVwX3N0YXRzLmRldl9zdGF0cy5ub2RlX3N0YXRzLm1lbW9yeSI6ITAsInN0ZXBfc3RhdHMuZGV2X3N0YXRzLm5vZGVfc3RhdHMub3V0cHV0LnRlbnNvcl9kZXNjcmlwdGlvbi5zaGFwZS5kaW0iOiEwfTtmdW5jdGlvbiBkWXQodCxlKXtsZXQgbj17fSxpPVtdLHI9W10sbz1uO2Z1bmN0aW9uIGEodCxuLGkscil7bGV0IG89dFtuXTtudWxsPT1vP3Rbbl09ci5qb2luKCIuIilpbiBlP1tpXTppOkFycmF5LmlzQXJyYXkobyk/by5wdXNoKGkpOnRbbl09W28saV19cmV0dXJuKGZ1bmN0aW9uIHModCxlLG49MWU2LGk9IlxuIil7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8peyEoZnVuY3Rpb24gYShzLGwsYyl7Y29uc3QgdT1jPj10LmJ5dGVMZW5ndGgsaD1sLnNwbGl0KGkpO2hbMF09cytoWzBdO2NvbnN0IGQ9dT8iIjpoLnBvcCgpO2ZvcihsZXQgdCBvZiBoKXRyeXtlKHQpfWNhdGNoKHQpe3JldHVybiB2b2lkIG8odCl9aWYodSlyZXR1cm4gdm9pZCByKCEwKTtjb25zdCBwPW5ldyBCbG9iKFt0LnNsaWNlKGMsYytuKV0pLGY9bmV3IEZpbGVSZWFkZXI7Zi5vbmxvYWQ9ZnVuY3Rpb24odCl7YShkLHQudGFyZ2V0LnJlc3VsdCxjK24pfSxmLnJlYWRBc1RleHQocCl9KSgiIiwiIiwwKX0pKX0pKHQsKGZ1bmN0aW9uKHQpe2lmKHQ9dC50cmltKCkpc3dpdGNoKHRbdC5sZW5ndGgtMV0pe2Nhc2UieyI6bGV0IGU9dC5zdWJzdHJpbmcoMCx0Lmxlbmd0aC0yKS50cmltKCksbj17fTtpLnB1c2gobyksci5wdXNoKGUpLGEobyxlLG4sciksbz1uO2JyZWFrO2Nhc2UifSI6bz1pLnBvcCgpLHIucG9wKCk7YnJlYWs7ZGVmYXVsdDpsZXQgcz0oZnVuY3Rpb24gZSh0KXtsZXQgZT10LmluZGV4T2YoIjoiKTtyZXR1cm57bmFtZTp0LnN1YnN0cmluZygwLGUpLnRyaW0oKSx2YWx1ZTooZnVuY3Rpb24gbih0KXtpZigidHJ1ZSI9PT10KXJldHVybiEwO2lmKCJmYWxzZSI9PT10KXJldHVybiExO2lmKCciJz09PXRbMF0pcmV0dXJuIHQuc3Vic3RyaW5nKDEsdC5sZW5ndGgtMSk7bGV0IGU9cGFyc2VGbG9hdCh0KTtyZXR1cm4gaXNOYU4oZSk/dDplfSkodC5zdWJzdHJpbmcoZSsyKS50cmltKCkpfX0pKHQpO2EobyxzLm5hbWUscy52YWx1ZSxyLmNvbmNhdChzLm5hbWUpKX19KSkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gbn0pKX1sZXQgcFl0PWNsYXNzIGV4dGVuZHMoZXIoeWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb21wYXRpYmlsaXR5UHJvdmlkZXI9bmV3IGxZdCx0aGlzLmhpZXJhcmNoeVBhcmFtcz1IcXQsdGhpcy5fdGVtcGxhdGU9bnVsbH1fc2VsZWN0aW9uQ2hhbmdlZCgpe3RoaXMuc2VsZWN0aW9uJiZ0aGlzLmRlYm91bmNlKCJzZWxlY3Rpb25jaGFuZ2UiLCgoKT0+e3RoaXMuX2xvYWQodGhpcy5zZWxlY3Rpb24pfSkpfV9sb2FkKHQpe2NvbnN0e3J1bjplLHRhZzpuLHR5cGU6aX09dDtzd2l0Y2goaSl7Y2FzZSB5R3QuT1BfR1JBUEg6Y2FzZSB5R3QuQ09OQ0VQVFVBTF9HUkFQSDp7KGZ1bmN0aW9uKCl7dGhpcy5fc2V0T3V0U3RhdHMobnVsbCl9KS5iaW5kKHRoaXMpKCk7Y29uc3QgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3Quc2V0KCJydW4iLGUpLHQuc2V0KCJjb25jZXB0dWFsIixTdHJpbmcoaT09PXlHdC5DT05DRVBUVUFMX0dSQVBIKSksbiYmdC5zZXQoInRhZyIsbik7Y29uc3Qgcj1fcigpLnBsdWdpblJvdXRlKCJncmFwaHMiLCIvZ3JhcGgiLHQpO3JldHVybiB0aGlzLl9mZXRjaEFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoKHIpLnRoZW4oKCgpPT57dGhpcy5fZ3JhcGhSdW5UYWc9e3J1bjplLHRhZzpufX0pKX1jYXNlIHlHdC5QUk9GSUxFOntjb25zdHt0YWdzOnR9PXRoaXMuZGF0YXNldHMuZmluZCgoKHtuYW1lOnR9KT0+dD09PWUpKSxpPXQuZmluZCgodD0+dC50YWc9PT1uKSkub3BHcmFwaD9uOm51bGw7Y29uc29sZS5hc3NlcnQodC5maW5kKCh0PT50LnRhZz09PWkpKSxgUmVxdWlyZWQgdGFnICgke2l9KSBpcyBtaXNzaW5nLmApO2NvbnN0IHI9dGhpcy5fZ3JhcGhSdW5UYWcmJnRoaXMuX2dyYXBoUnVuVGFnLnJ1bj09PWUmJnRoaXMuX2dyYXBoUnVuVGFnLnRhZz09PWk/UHJvbWlzZS5yZXNvbHZlKCk6dGhpcy5fbG9hZCh7cnVuOmUsdGFnOmksdHlwZTp5R3QuT1BfR1JBUEh9KSxvPW5ldyBVUkxTZWFyY2hQYXJhbXM7by5zZXQoInRhZyIsbiksby5zZXQoInJ1biIsZSk7Y29uc3QgYT1fcigpLnBsdWdpblJvdXRlKCJncmFwaHMiLCIvcnVuX21ldGFkYXRhIixvKTtyZXR1cm4gci50aGVuKCgoKT0+dGhpcy5fcmVhZEFuZFBhcnNlTWV0YWRhdGEoYSkpKX1kZWZhdWx0OnJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVua25vd24gc2VsZWN0aW9uIHR5cGU6ICR7aX1gKSl9fV9yZWFkQW5kUGFyc2VNZXRhZGF0YSh0KXt0aGlzLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTowLG1zZzoiIn0pLChmdW5jdGlvbiBlKHQsbil7cmV0dXJuKGZ1bmN0aW9uIGkodCxlLG4scixvKXtyLnNldE1lc3NhZ2UodCk7dHJ5e2xldCBpPUNHdCh0LG4sbyk7cmV0dXJuIHIudXBkYXRlUHJvZ3Jlc3MoZSksaX1jYXRjaChlKXtyLnJlcG9ydEVycm9yKCJGYWlsZWQgIit0LGUpfX0pKCJSZWFkaW5nIG1ldGFkYXRhIHBidHh0Iiw0MCwoKCk9Pm51bGw9PXQ/UHJvbWlzZS5yZXNvbHZlKG51bGwpOmNZdCh0KSksbixfR3QuRkVUQ0hfTUVUQURBVEFfUEJUWFRfQllURVMpLnRoZW4oKHQ9PlBHdCgiUGFyc2luZyBtZXRhZGF0YS5wYnR4dCIsNjAsKCgpPT5udWxsIT10PyhmdW5jdGlvbiBlKHQpe3JldHVybiBkWXQodCxoWXQpLnRoZW4oKHQ9PnQuc3RlcF9zdGF0cykpfSkodCk6UHJvbWlzZS5yZXNvbHZlKG51bGwpKSxuLF9HdC5QQVJTRV9NRVRBREFUQV9QQlRYVF9JTlRPX09CSkVDVCkpKX0pKHQsQUd0KHRoaXMpKS50aGVuKGZ1bmN0aW9uKHQpe3RoaXMuX3NldE91dFN0YXRzKHQpfS5iaW5kKHRoaXMpKX1fZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaCh0LGUpe3JldHVybiB0aGlzLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTowLG1zZzoiIn0pLChmdW5jdGlvbiBpKHQsZSxyLG89bmV3IGxZdCxhPUhxdCl7Y29uc3Qgcz1rR3QodCwzMCwiRGF0YSIpLGw9a0d0KHQsMjAsIkdyYXBoIiksYz1rR3QodCw1MCwiTmFtZXNwYWNlIGhpZXJhcmNoeSIpLHU9RGF0ZS5ub3coKTtyZXR1cm4oZnVuY3Rpb24gaCh0LGUsaSl7cmV0dXJuIFBHdCgiUmVhZGluZyBncmFwaCBwYnR4dCIsNDAsKCgpPT5uKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3Qgbj1EYXRlLm5vdygpO2lmKGUpe2NvbnN0IHQ9eWllbGQgbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQsbil7bGV0IGk9bmV3IEZpbGVSZWFkZXI7aS5vbmxvYWQ9KCk9PnQoaS5yZXN1bHQpLGkub25lcnJvcj0oKT0+bihpLmVycm9yKSxpLnJlYWRBc0FycmF5QnVmZmVyKGUpfSkpO3JldHVybiBUR3Qoe3RpbWluZ0lkOl9HdC5GRVRDSF9QQlRYVF9CWVRFU19GUk9NX0ZJTEVTWVNURU0sZXZlbnRWYWx1ZTpEYXRlLm5vdygpLW59KSx0fWNvbnN0IGk9eWllbGQgY1l0KHQpO3JldHVybiBUR3Qoe3RpbWluZ0lkOl9HdC5GRVRDSF9QQlRYVF9CWVRFU19GUk9NX1NFUlZFUixldmVudFZhbHVlOkRhdGUubm93KCktbn0pLGl9KSkpLGksX0d0LkZFVENIX1BCVFhUX0JZVEVTKS50aGVuKCh0PT5QR3QoIlBhcnNpbmcgZ3JhcGgucGJ0eHQiLDYwLCgoKT0+KGZ1bmN0aW9uIGUodCl7cmV0dXJuIGRZdCh0LHVZdCl9KSh0KSksaSxfR3QuUEFSU0VfUEJUWFRfSU5UT19PQkpFQ1QpKSl9KShlLHIscykudGhlbigoZnVuY3Rpb24odCl7aWYoIXQubm9kZSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBncmFwaCBpcyBlbXB0eS4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gVGVuc29yRmxvdyBjb3VsZCBub3QgdHJhY2UgYW55IGdyYXBoLiBQbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvaXNzdWVzLzE5NjEgZm9yIG1vcmUgaW5mb3JtYXRpb24uIik7cmV0dXJuKGZ1bmN0aW9uIGUodCxuLGkpe2xldCByPXt9LG89e30sYT17fSxzPWFXdChuLmluRW1iZWRkaW5nVHlwZXMpLGw9YVd0KG4ub3V0RW1iZWRkaW5nVHlwZXMpLGM9W10sdT10Lm5vZGUsaD1uZXcgQXJyYXkodS5sZW5ndGgpO3JldHVybiBMR3QoIk5vcm1hbGl6aW5nIG5hbWVzIiwzMCwoKCk9PntsZXQgZT1uZXcgQXJyYXkodS5sZW5ndGgpLG49MDtjb25zdCBpPXQ9PntsZXQgaT1uZXcgWEd0KHQpO3JldHVybiBzKGkpPyhjLnB1c2goaS5uYW1lKSxyW2kubmFtZV09aSxpKTpsKGkpPyhjLnB1c2goaS5uYW1lKSxvW2kubmFtZV09aSxTZS5leHBvcnRzLmVhY2goaS5pbnB1dHMsKHQ9PntsZXQgZT10Lm5hbWU7YVtlXT1hW2VdfHxbXSxhW2VdLnB1c2goaSl9KSksaSk6KGVbbl09aSxoW25dPWkubmFtZSxuKyssaSl9O3JldHVybiBTZS5leHBvcnRzLmVhY2godSxpKSx0LmxpYnJhcnkmJnQubGlicmFyeS5mdW5jdGlvbiYmU2UuZXhwb3J0cy5lYWNoKHQubGlicmFyeS5mdW5jdGlvbiwodD0+e2NvbnN0IGU9Vkd0K3Quc2lnbmF0dXJlLm5hbWU7aWYoaSh7bmFtZTplLGlucHV0OltdLGRldmljZToiIixvcDoiIixhdHRyOltdfSksdC5zaWduYXR1cmUuaW5wdXRfYXJnKXtsZXQgbj0wO2NvbnN0IHI9dD0+e2koe25hbWU6ZStIR3QrdC5uYW1lLGlucHV0OltdLGRldmljZToiIixvcDoiaW5wdXRfYXJnIixhdHRyOlt7a2V5OiJUIix2YWx1ZTp7dHlwZTp0LnR5cGV9fV19KS5mdW5jdGlvbklucHV0SW5kZXg9bixuKyt9O3Quc2lnbmF0dXJlLmlucHV0X2FyZy5uYW1lP3IodC5zaWduYXR1cmUuaW5wdXRfYXJnKTpTZS5leHBvcnRzLmVhY2godC5zaWduYXR1cmUuaW5wdXRfYXJnLHIpfWxldCBuPTA7Y29uc3Qgcj17fTtpZih0LnNpZ25hdHVyZS5vdXRwdXRfYXJnKXtjb25zdCBpPXQ9PntyW2UrSEd0K3QubmFtZV09bixuKyt9O3Quc2lnbmF0dXJlLm91dHB1dF9hcmcubmFtZT9pKHQuc2lnbmF0dXJlLm91dHB1dF9hcmcpOlNlLmV4cG9ydHMuZWFjaCh0LnNpZ25hdHVyZS5vdXRwdXRfYXJnLGkpfVNlLmV4cG9ydHMuZWFjaCh0Lm5vZGVfZGVmLCh0PT57dC5uYW1lPWUrIi8iK3QubmFtZSwic3RyaW5nIj09dHlwZW9mIHQuaW5wdXQmJih0LmlucHV0PVt0LmlucHV0XSk7Y29uc3Qgbj1pKHQpO1NlLmV4cG9ydHMuaXNOdW1iZXIoclt0Lm5hbWVdKSYmKG4uZnVuY3Rpb25PdXRwdXRJbmRleD1yW3QubmFtZV0pLFNlLmV4cG9ydHMuZWFjaChuLmlucHV0cywodD0+e3QubmFtZT1lK0hHdCt0Lm5hbWV9KSl9KSl9KSksZS5zcGxpY2UobiksaC5zcGxpY2UobiksZX0pLGksX0d0Lk5PUk1BTElaSU5HX05BTUVTKS50aGVuKCh0PT5MR3QoIkJ1aWxkaW5nIHRoZSBkYXRhIHN0cnVjdHVyZSIsNzAsKCgpPT57bGV0IGU9KGZ1bmN0aW9uIGkodCxlKXtsZXQgbj17fSxpPXt9O3Quc29ydCgpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGgtMTsrK2Upe2xldCByPXRbZV07U2UuZXhwb3J0cy5lYWNoKGNXdChyKS5zbGljZSgwLC0xKSwodD0+e2lbdF09ITB9KSk7Zm9yKGxldCBpPWUrMTtpPHQubGVuZ3RoOysraSl7bGV0IGU9dFtpXTtpZighU2UuZXhwb3J0cy5zdGFydHNXaXRoKGUscikpYnJlYWs7aWYoZS5sZW5ndGg+ci5sZW5ndGgmJmUuY2hhckF0KHIubGVuZ3RoKT09PUhHdCl7bltyXT1zV3Qocik7YnJlYWt9fX1yZXR1cm4gU2UuZXhwb3J0cy5lYWNoKGUsKHQ9Pnt0IGluIGkmJihuW3RdPXNXdCh0KSl9KSksbn0pKGgsYykscz1uZXcgcUd0O3JldHVybiBTZS5leHBvcnRzLmVhY2godCwodD0+e2xldCBuPWVbdC5uYW1lXXx8dC5uYW1lO3Mubm9kZXNbbl09dCx0Lm5hbWUgaW4gYSYmKHQub3V0RW1iZWRkaW5ncz1hW3QubmFtZV0sU2UuZXhwb3J0cy5lYWNoKHQub3V0RW1iZWRkaW5ncywodD0+e3QubmFtZT1lW3QubmFtZV18fHQubmFtZX0pKSksdC5uYW1lPW59KSksU2UuZXhwb3J0cy5lYWNoKHQsKHQ9PntTZS5leHBvcnRzLmVhY2godC5pbnB1dHMsKChpLGEpPT57bGV0IGw9aS5uYW1lO2lmKGwgaW4gcil7bGV0IGk9cltsXTt0LmluRW1iZWRkaW5ncy5wdXNoKGkpO2ZvcihsZXQgciBvZiBpLmlucHV0cylpV3QocyxlW3IubmFtZV18fHIubmFtZSx0LHIsbixhKX1lbHNlIGlmKGwgaW4gbyl7bGV0IHI9b1tsXTtmb3IobGV0IG8gb2Ygci5pbnB1dHMpaVd0KHMsZVtvLm5hbWVdfHxvLm5hbWUsdCxpLG4sYSl9ZWxzZSBpV3QocyxlW2xdfHxsLHQsaSxuLGEpfSkpfSkpLFNlLmV4cG9ydHMuZWFjaChyLCgodCxuKT0+e3QubmFtZT1lW3QubmFtZV18fHQubmFtZX0pKSxzfSksaSxfR3QuQlVJTERfU0xJTV9HUkFQSCkpKX0pKHQscld0LGwpfSksKCgpPT57dGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgR3JhcGhEZWYuIFRoaXMgY2FuIHNvbWV0aW1lcyBiZSBjYXVzZWQgYnkgYSBiYWQgbmV0d29yayBjb25uZWN0aW9uIG9yIGRpZmZpY3VsdHkgcmVjb25jaWxpbmcgbXVsdGlwbGUgR3JhcGhEZWZzOyBmb3IgdGhlIGxhdHRlciBjYXNlLCBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvaXNzdWVzLzE5MjkuIil9KSkudGhlbigodD0+bih0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpeyEoZnVuY3Rpb24gZSh0LG4pe2lmKG51bGw9PT1uKXRocm93IG5ldyBFcnJvcigiQ29tcGF0aWJpbGl0eSBwcm92aWRlciByZXF1aXJlZCwgYnV0IGdvdDogIituKTtTZS5leHBvcnRzLmVhY2godC5ub2RlcywodD0+e3QuY29tcGF0aWJsZT1uLm9wVmFsaWQodCksU2UuZXhwb3J0cy5lYWNoKHQuaW5FbWJlZGRpbmdzLCh0PT57dC5jb21wYXRpYmxlPW4ub3BWYWxpZCh0KX0pKSxTZS5leHBvcnRzLmVhY2godC5vdXRFbWJlZGRpbmdzLCh0PT57dC5jb21wYXRpYmxlPW4ub3BWYWxpZCh0KX0pKX0pKX0pKHQsbyk7Y29uc3Qgbj15aWVsZCBGcXQodCxhLGMpO3JldHVybiBUR3Qoe3RpbWluZ0lkOl9HdC5HUkFQSF9MT0FEX1NVQ0NFRURFRCxldmVudFZhbHVlOkRhdGUubm93KCktdX0pLHtncmFwaDp0LGdyYXBoSGllcmFyY2h5Om59fSkpKSkuY2F0Y2goKGU9Pnt0aHJvdyB0LnJlcG9ydEVycm9yKGBHcmFwaCB2aXN1YWxpemF0aW9uIGZhaWxlZC5cblxuJHtlfWAsZSksVEd0KHt0aW1pbmdJZDpfR3QuR1JBUEhfTE9BRF9GQUlMRUQsZXZlbnRWYWx1ZTpEYXRlLm5vdygpLXV9KSxlfSkpfSkoQUd0KHRoaXMpLHQsZSx0aGlzLmNvbXBhdGliaWxpdHlQcm92aWRlcix0aGlzLmhpZXJhcmNoeVBhcmFtcykudGhlbihmdW5jdGlvbih7Z3JhcGg6dCxncmFwaEhpZXJhcmNoeTplfSl7dGhpcy5fc2V0T3V0R3JhcGgodCksdGhpcy5fc2V0T3V0R3JhcGhIaWVyYXJjaHkoZSl9LmJpbmQodGhpcykpfV9zZWxlY3RlZEZpbGVDaGFuZ2VkKCl7dmFyIHQ9dGhpcy5zZWxlY3RlZEZpbGU7aWYoIXQpcmV0dXJuO2NvbnN0IGU9dC50YXJnZXQsbj1lLmZpbGVzWzBdO24mJihlLnZhbHVlPSIiLHRoaXMuX2ZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgobnVsbCxuKSl9fTt0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0scFl0LnByb3RvdHlwZSwiZGF0YXNldHMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHBZdC5wcm90b3R5cGUsInByb2dyZXNzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHBZdC5wcm90b3R5cGUsInNlbGVjdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxwWXQucHJvdG90eXBlLCJzZWxlY3RlZEZpbGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0scFl0LnByb3RvdHlwZSwiY29tcGF0aWJpbGl0eVByb3ZpZGVyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHBZdC5wcm90b3R5cGUsImhpZXJhcmNoeVBhcmFtcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsRHF0KV0scFl0LnByb3RvdHlwZSwib3V0R3JhcGhIaWVyYXJjaHkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLHFHdCldLHBZdC5wcm90b3R5cGUsIm91dEdyYXBoIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxwWXQucHJvdG90eXBlLCJvdXRTdGF0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxwWXQucHJvdG90eXBlLCJfZ3JhcGhSdW5UYWciLHZvaWQgMCksdChbYSgic2VsZWN0aW9uIiwiY29tcGF0aWJpbGl0eVByb3ZpZGVyIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxwWXQucHJvdG90eXBlLCJfc2VsZWN0aW9uQ2hhbmdlZCIsbnVsbCksdChbYSgic2VsZWN0ZWRGaWxlIiwiY29tcGF0aWJpbGl0eVByb3ZpZGVyIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxwWXQucHJvdG90eXBlLCJfc2VsZWN0ZWRGaWxlQ2hhbmdlZCIsbnVsbCkscFl0PXQoW2koInRmLWdyYXBoLWRhc2hib2FyZC1sb2FkZXIiKV0scFl0KTtsZXQgZll0PWNsYXNzIGV4dGVuZHMoZXIoeWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fZGF0YXNldHM9W10sdGhpcy5fZGF0YXNldHNGZXRjaGVkPSExLHRoaXMuX3NlbGVjdGVkRGF0YXNldD0wLHRoaXMuX3JlcXVlc3RNYW5hZ2VyPW5ldyBkcix0aGlzLl9jYW5jZWxsZXI9bmV3IFhSLHRoaXMuc3BlY2lmaWNIZWFsdGhQaWxsU3RlcD0wLHRoaXMuaGVhbHRoUGlsbHNUb2dnbGVkT249ITEsdGhpcy5fZGVidWdnZXJOdW1lcmljQWxlcnRzPVtdLHRoaXMuX25vZGVOYW1lc1RvSGVhbHRoUGlsbHM9e30sdGhpcy5faGVhbHRoUGlsbFJlcXVlc3RJZD0xLHRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVyRGVsYXk9NTAwLHRoaXMucnVuPVJzKCJydW4iLHtkZWZhdWx0VmFsdWU6IiIsdXNlTG9jYWxTdG9yYWdlOiExfSkuY2FsbCh0aGlzKSx0aGlzLl9ydW5PYnNlcnZlcj1PcygicnVuIix7ZGVmYXVsdFZhbHVlOiIiLHBvbHltZXJQcm9wZXJ0eToicnVuIix1c2VMb2NhbFN0b3JhZ2U6ITF9KX1hdHRhY2hlZCgpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITApfWRldGFjaGVkKCl7dGhpcy5zZXQoIl9pc0F0dGFjaGVkIiwhMSl9cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigibm9kZS10b2dnbGUtZXhwYW5kIix0aGlzLl9oYW5kbGVOb2RlVG9nZ2xlRXhwYW5kLmJpbmQodGhpcykpfXJlbG9hZCgpe3RoaXMuX2RlYnVnZ2VyRGF0YUVuYWJsZWR8fHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoX3IoKS5wbHVnaW5zTGlzdGluZygpKS50aGVuKHRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZSgodD0+e3QuY2FuY2VsbGVkfHx0LnZhbHVlLmRlYnVnZ2VyJiZ0aGlzLnNldCgiX2RlYnVnZ2VyRGF0YUVuYWJsZWQiLCEwKX0pKSksdGhpcy5fbWF5YmVGZXRjaEhlYWx0aFBpbGxzKCl9X2ZpdCgpe3RoaXMuJCQoIiNncmFwaGJvYXJkIikuZml0KCl9X29uRG93bmxvYWRJbWFnZVJlcXVlc3RlZCh0KXt0aGlzLiQkKCIjZ3JhcGhib2FyZCIpLmRvd25sb2FkQXNJbWFnZSh0LmRldGFpbCl9X2dldEdyYXBoRGlzcGxheUNsYXNzTmFtZSh0LGUpe3JldHVybiB0fHxlLmxlbmd0aD8iIjoibm8tZ3JhcGgifV9mZXRjaERhdGFzZXQoKXtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChfcigpLnBsdWdpblJvdXRlKCJncmFwaHMiLCIvaW5mbyIpKX1fZmV0Y2hIZWFsdGhQaWxscyh0LGUpe2NvbnN0IG49e25vZGVfbmFtZXM6SlNPTi5zdHJpbmdpZnkodCkscnVuOiJfX2RlYnVnZ2VyX2RhdGFfXyJ9O3ZvaWQgMCE9PWUmJihuLnN0ZXA9ZSk7Y29uc3QgaT1fcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9oZWFsdGhfcGlsbHMiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChpLG4pfV9mZXRjaERlYnVnZ2VyTnVtZXJpY3NBbGVydHMoKXtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChfcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9udW1lcmljc19hbGVydF9yZXBvcnQiKSl9X2dyYXBoVXJsKHQsZSxuKXtyZXR1cm4gX3IoKS5wbHVnaW5Sb3V0ZSgiZ3JhcGhzIiwiL2dyYXBoIixuZXcgVVJMU2VhcmNoUGFyYW1zKHtydW46dCxsaW1pdF9hdHRyX3NpemU6ZSxsYXJnZV9hdHRyc19rZXk6bn0pKX1fc2hvdWxkUmVxdWVzdEhlYWx0aFBpbGxzKCl7cmV0dXJuIHRoaXMuX2RlYnVnZ2VyRGF0YUVuYWJsZWQmJnRoaXMuaGVhbHRoUGlsbHNUb2dnbGVkT24mJnRoaXMuX3JlbmRlckhpZXJhcmNoeSYmdGhpcy5fZGF0YXNldHNTdGF0ZSh0aGlzLl9kYXRhc2V0c0ZldGNoZWQsdGhpcy5fZGF0YXNldHMsIlBSRVNFTlQiKX1fbWF5YmVJbml0aWFsaXplRGFzaGJvYXJkKCl7IXRoaXMuX2luaXRpYWxpemVkJiZ0aGlzLl9pc0F0dGFjaGVkJiYodGhpcy5zZXQoIl9jb21wYXRpYmlsaXR5UHJvdmlkZXIiLG5ldyBsWXQpLHRoaXMuX2luaXRpYWxpemVkPSEwLHRoaXMuX2ZldGNoRGF0YXNldCgpLnRoZW4oKHQ9Pntjb25zdCBlPU9iamVjdC5rZXlzKHQpO3RoaXMuX2RhdGFzZXRzPWUuc29ydChucikubWFwKChlPT57Y29uc3Qgbj10W2VdLGk9T2JqZWN0LmtleXMobi50YWdzKS5zb3J0KG5yKS5tYXAoKHQ9Pm4udGFnc1t0XSkpLm1hcCgoKHt0YWc6dCxjb25jZXB0dWFsX2dyYXBoOmUsb3BfZ3JhcGg6bixwcm9maWxlOml9KT0+KHt0YWc6dCxkaXNwbGF5TmFtZTp0LGNvbmNlcHR1YWxHcmFwaDplLG9wR3JhcGg6bixwcm9maWxlOml9KSkpO3JldHVybntuYW1lOmUsdGFnczpuLnJ1bl9ncmFwaD9be3RhZzpudWxsLGRpc3BsYXlOYW1lOiJEZWZhdWx0Iixjb25jZXB0dWFsR3JhcGg6ITEsb3BHcmFwaDohMCxwcm9maWxlOiExfSwuLi5pXTppfX0pKSx0aGlzLl9kYXRhc2V0c0ZldGNoZWQ9ITB9KSkpfV9kZXRlcm1pbmVTZWxlY3RlZERhdGFzZXQoKXt2YXIgdD10aGlzLl9kYXRhc2V0c0ZldGNoZWQsZT10aGlzLl9kYXRhc2V0cyxuPXRoaXMucnVuO2lmKCFuKXJldHVybiB2b2lkIHRoaXMuc2V0KCJfc2VsZWN0ZWREYXRhc2V0IiwwKTtjb25zdCBpPWUuZmluZEluZGV4KCh0PT50Lm5hbWU9PT1uKSk7aWYoLTEhPT1pKXRoaXMuc2V0KCJfc2VsZWN0ZWREYXRhc2V0IixpKTtlbHNlIGlmKHQpe2NvbnN0IHQ9dGhpcy4kJCgiI2Vycm9yLWRpYWxvZyIpO3QudGV4dENvbnRlbnQ9YE5vIGRhdGFzZXQgbmFtZWQgIiR7bn0iIGNvdWxkIGJlIGZvdW5kLmAsdC5vcGVuKCl9fV91cGRhdGVTZWxlY3RlZERhdGFzZXROYW1lKCl7dmFyIHQ9dGhpcy5fZGF0YXNldHMsZT10aGlzLl9zZWxlY3RlZERhdGFzZXQ7dGhpcy5fZGF0YXNldHNGZXRjaGVkJiYodC5sZW5ndGg8PWV8fHRoaXMuc2V0KCJydW4iLHRbZV0ubmFtZSkpfV9yZXF1ZXN0SGVhbHRoUGlsbHMoKXt0aGlzLnNldCgiX2FyZUhlYWx0aFBpbGxzTG9hZGluZyIsITApO3ZhciB0PSsrdGhpcy5faGVhbHRoUGlsbFJlcXVlc3RJZDtudWxsIT09dGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZCksdGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZD1udWxsKSx0aGlzLmFsbFN0ZXBzTW9kZUVuYWJsZWQ/dGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZD1udWxsLHRoaXMuX2luaXRpYXRlTmV0d29ya1JlcXVlc3RGb3JIZWFsdGhQaWxscyh0KX0uYmluZCh0aGlzKSx0aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lckRlbGF5KTp0aGlzLl9pbml0aWF0ZU5ldHdvcmtSZXF1ZXN0Rm9ySGVhbHRoUGlsbHModCl9X2luaXRpYXRlTmV0d29ya1JlcXVlc3RGb3JIZWFsdGhQaWxscyh0KXtpZih0aGlzLl9oZWFsdGhQaWxsUmVxdWVzdElkIT09dClyZXR1cm47Y29uc3QgZT10aGlzLmFsbFN0ZXBzTW9kZUVuYWJsZWQ/dGhpcy5zcGVjaWZpY0hlYWx0aFBpbGxTdGVwOnZvaWQgMCxuPXRoaXMuX2ZldGNoSGVhbHRoUGlsbHModGhpcy5fcmVuZGVySGllcmFyY2h5LmdldE5hbWVzT2ZSZW5kZXJlZE9wcygpLGUpLGk9dGhpcy5fZmV0Y2hEZWJ1Z2dlck51bWVyaWNzQWxlcnRzKCk7UHJvbWlzZS5hbGwoW24saV0pLnRoZW4oZnVuY3Rpb24oZSl7dmFyIG49ZVswXSxpPWVbMV07aWYodGhpcy5oZWFsdGhQaWxsc1RvZ2dsZWRPbiYmdD09PXRoaXMuX2hlYWx0aFBpbGxSZXF1ZXN0SWQpe2Zvcih2YXIgciBpbiBuKXt0aGlzLnNldCgiX2hlYWx0aFBpbGxTdGVwSW5kZXgiLG5bcl0ubGVuZ3RoLTEpO2JyZWFrfXRoaXMuc2V0KCJfZGVidWdnZXJOdW1lcmljQWxlcnRzIixpKSx0aGlzLnNldCgiX25vZGVOYW1lc1RvSGVhbHRoUGlsbHMiLG4pLHRoaXMuc2V0KCJfYXJlSGVhbHRoUGlsbHNMb2FkaW5nIiwhMSksdGhpcy5zZXQoIl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkIixudWxsKX19LmJpbmQodGhpcykpfV9kYXRhc2V0c1N0YXRlKHQsZSxuKXtyZXR1cm4gdD9lJiZlLmxlbmd0aD8iUFJFU0VOVCI9PT1uOiJFTVBUWSI9PT1uOiJOT1RfTE9BREVEIj09PW59X3JlbmRlckhpZXJhcmNoeUNoYW5nZWQodCl7dGhpcy5yZWxvYWQoKX1faGFuZGxlTm9kZVRvZ2dsZUV4cGFuZCgpe3RoaXMuX21heWJlRmV0Y2hIZWFsdGhQaWxscygpfV9oZWFsdGhQaWxsc1RvZ2dsZWRPbkNoYW5nZWQodCl7dD90aGlzLnJlbG9hZCgpOnRoaXMuc2V0KCJfbm9kZU5hbWVzVG9IZWFsdGhQaWxscyIse30pfV9tYXliZUZldGNoSGVhbHRoUGlsbHMoKXt0aGlzLl9zaG91bGRSZXF1ZXN0SGVhbHRoUGlsbHMoKSYmdGhpcy5fcmVxdWVzdEhlYWx0aFBpbGxzKCl9fTtmWXQudGVtcGxhdGU9X2VgCiAgICA8cGFwZXItZGlhbG9nIGlkPSJlcnJvci1kaWFsb2ciIHdpdGgtYmFja2Ryb3A+PC9wYXBlci1kaWFsb2c+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPHRmLWdyYXBoLWNvbnRyb2xzCiAgICAgICAgaWQ9ImNvbnRyb2xzIgogICAgICAgIGNsYXNzPSJzaWRlYmFyIgogICAgICAgIHNsb3Q9InNpZGViYXIiCiAgICAgICAgZGV2aWNlcy1mb3Itc3RhdHM9Int7X2RldmljZXNGb3JTdGF0c319IgogICAgICAgIGNvbG9yLWJ5LXBhcmFtcz0iW1tfY29sb3JCeVBhcmFtc11dIgogICAgICAgIHN0YXRzPSJbW19zdGF0c11dIgogICAgICAgIGNvbG9yLWJ5PSJ7e19jb2xvckJ5fX0iCiAgICAgICAgZGF0YXNldHM9IltbX2RhdGFzZXRzXV0iCiAgICAgICAgcmVuZGVyLWhpZXJhcmNoeT0iW1tfcmVuZGVySGllcmFyY2h5XV0iCiAgICAgICAgc2VsZWN0aW9uPSJ7e19zZWxlY3Rpb259fSIKICAgICAgICBzZWxlY3RlZC1maWxlPSJ7e19zZWxlY3RlZEZpbGV9fSIKICAgICAgICBzZWxlY3RlZC1ub2RlPSJ7e19zZWxlY3RlZE5vZGV9fSIKICAgICAgICBoZWFsdGgtcGlsbHMtZmVhdHVyZS1lbmFibGVkPSJbW19kZWJ1Z2dlckRhdGFFbmFibGVkXV0iCiAgICAgICAgaGVhbHRoLXBpbGxzLXRvZ2dsZWQtb249Int7aGVhbHRoUGlsbHNUb2dnbGVkT259fSIKICAgICAgICBvbi1maXQtdGFwPSJfZml0IgogICAgICAgIHRyYWNlLWlucHV0cz0ie3tfdHJhY2VJbnB1dHN9fSIKICAgICAgICBhdXRvLWV4dHJhY3Qtbm9kZXM9Int7X2F1dG9FeHRyYWN0Tm9kZXN9fSIKICAgICAgICBvbi1kb3dubG9hZC1pbWFnZS1yZXF1ZXN0ZWQ9Il9vbkRvd25sb2FkSW1hZ2VSZXF1ZXN0ZWQiCiAgICAgID48L3RmLWdyYXBoLWNvbnRyb2xzPgogICAgICA8ZGl2CiAgICAgICAgY2xhc3MkPSJjZW50ZXIgW1tfZ2V0R3JhcGhEaXNwbGF5Q2xhc3NOYW1lKF9zZWxlY3RlZEZpbGUsIF9kYXRhc2V0cyldXSIKICAgICAgICBzbG90PSJjZW50ZXIiCiAgICAgID4KICAgICAgICA8dGYtZ3JhcGgtZGFzaGJvYXJkLWxvYWRlcgogICAgICAgICAgaWQ9ImxvYWRlciIKICAgICAgICAgIGRhdGFzZXRzPSJbW19kYXRhc2V0c11dIgogICAgICAgICAgc2VsZWN0aW9uPSJbW19zZWxlY3Rpb25dXSIKICAgICAgICAgIHNlbGVjdGVkLWZpbGU9IltbX3NlbGVjdGVkRmlsZV1dIgogICAgICAgICAgb3V0LWdyYXBoLWhpZXJhcmNoeT0ie3tfZ3JhcGhIaWVyYXJjaHl9fSIKICAgICAgICAgIG91dC1ncmFwaD0ie3tfZ3JhcGh9fSIKICAgICAgICAgIG91dC1zdGF0cz0ie3tfc3RhdHN9fSIKICAgICAgICAgIHByb2dyZXNzPSJ7e19wcm9ncmVzc319IgogICAgICAgICAgaGllcmFyY2h5LXBhcmFtcz0iW1tfaGllcmFyY2h5UGFyYW1zXV0iCiAgICAgICAgICBjb21wYXRpYmlsaXR5LXByb3ZpZGVyPSJbW19jb21wYXRpYmlsaXR5UHJvdmlkZXJdXSIKICAgICAgICA+PC90Zi1ncmFwaC1kYXNoYm9hcmQtbG9hZGVyPgogICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtbWVzc2FnZSI+CiAgICAgICAgICA8aDM+Tm8gZ3JhcGggZGVmaW5pdGlvbiBmaWxlcyB3ZXJlIGZvdW5kLjwvaDM+CiAgICAgICAgICA8cD4KICAgICAgICAgICAgVG8gc3RvcmUgYSBncmFwaCwgY3JlYXRlIGEKICAgICAgICAgICAgPGNvZGU+dGYuc3VtbWFyeS5GaWxlV3JpdGVyPC9jb2RlPgogICAgICAgICAgICBhbmQgcGFzcyB0aGUgZ3JhcGggZWl0aGVyIHZpYSB0aGUgY29uc3RydWN0b3IsIG9yIGJ5IGNhbGxpbmcgaXRzCiAgICAgICAgICAgIDxjb2RlPmFkZF9ncmFwaCgpPC9jb2RlPiBtZXRob2QuIFlvdSBtYXkgd2FudCB0byBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL3RlbnNvcmJvYXJkL2dyYXBocyIKICAgICAgICAgICAgICA+ZXhhbWluaW5nIHRoZSBUZW5zb3JGbG93IGdyYXBoIHR1dG9yaWFsPC9hCiAgICAgICAgICAgID4uCiAgICAgICAgICA8L3A+CgogICAgICAgICAgPHA+CiAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvIGFkZAogICAgICAgICAgICBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICA8YQogICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIKICAgICAgICAgICAgICA+UkVBRE1FPC9hCiAgICAgICAgICAgID4KICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCIKICAgICAgICAgICAgICA+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2EKICAgICAgICAgICAgPi4KICAgICAgICAgIDwvcD4KCiAgICAgICAgICA8cD4KICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgPGEKICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIgogICAgICAgICAgICAgID50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hCiAgICAgICAgICAgID4KICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICA8L3A+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iZ3JhcGhib2FyZCI+CiAgICAgICAgICA8dGYtZ3JhcGgtYm9hcmQKICAgICAgICAgICAgaWQ9ImdyYXBoYm9hcmQiCiAgICAgICAgICAgIGRldmljZXMtZm9yLXN0YXRzPSJbW19kZXZpY2VzRm9yU3RhdHNdXSIKICAgICAgICAgICAgY29sb3ItYnk9Int7X2NvbG9yQnl9fSIKICAgICAgICAgICAgY29sb3ItYnktcGFyYW1zPSJ7e19jb2xvckJ5UGFyYW1zfX0iCiAgICAgICAgICAgIGdyYXBoLWhpZXJhcmNoeT0iW1tfZ3JhcGhIaWVyYXJjaHldXSIKICAgICAgICAgICAgZ3JhcGg9IltbX2dyYXBoXV0iCiAgICAgICAgICAgIGhpZXJhcmNoeS1wYXJhbXM9IltbX2hpZXJhcmNoeVBhcmFtc11dIgogICAgICAgICAgICBwcm9ncmVzcz0iW1tfcHJvZ3Jlc3NdXSIKICAgICAgICAgICAgZGVidWdnZXItZGF0YS1lbmFibGVkPSJbW19kZWJ1Z2dlckRhdGFFbmFibGVkXV0iCiAgICAgICAgICAgIGFyZS1oZWFsdGgtcGlsbHMtbG9hZGluZz0iW1tfYXJlSGVhbHRoUGlsbHNMb2FkaW5nXV0iCiAgICAgICAgICAgIGRlYnVnZ2VyLW51bWVyaWMtYWxlcnRzPSJbW19kZWJ1Z2dlck51bWVyaWNBbGVydHNdXSIKICAgICAgICAgICAgbm9kZS1uYW1lcy10by1oZWFsdGgtcGlsbHM9IltbX25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIKICAgICAgICAgICAgYWxsLXN0ZXBzLW1vZGUtZW5hYmxlZD0ie3thbGxTdGVwc01vZGVFbmFibGVkfX0iCiAgICAgICAgICAgIHNwZWNpZmljLWhlYWx0aC1waWxsLXN0ZXA9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19IgogICAgICAgICAgICBoZWFsdGgtcGlsbC1zdGVwLWluZGV4PSJbW19oZWFsdGhQaWxsU3RlcEluZGV4XV0iCiAgICAgICAgICAgIHJlbmRlci1oaWVyYXJjaHk9Int7X3JlbmRlckhpZXJhcmNoeX19IgogICAgICAgICAgICBzZWxlY3RlZC1ub2RlPSJ7e19zZWxlY3RlZE5vZGV9fSIKICAgICAgICAgICAgc3RhdHM9IltbX3N0YXRzXV0iCiAgICAgICAgICAgIHRyYWNlLWlucHV0cz0iW1tfdHJhY2VJbnB1dHNdXSIKICAgICAgICAgICAgYXV0by1leHRyYWN0LW5vZGVzPSJbW19hdXRvRXh0cmFjdE5vZGVzXV0iCiAgICAgICAgICA+PC90Zi1ncmFwaC1ib2FyZD4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IC9kZWVwLyB7CiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8nLCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAuc2lkZWJhciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5jZW50ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWRpYWxvZyB7CiAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgfQoKICAgICAgLm5vLWRhdGEtbWVzc2FnZSB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KCiAgICAgIC5ncmFwaGJvYXJkIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5uby1ncmFwaCAuZ3JhcGhib2FyZCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLmNlbnRlcjpub3QoLm5vLWdyYXBoKSAubm8tZGF0YS1tZXNzYWdlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICBhIHsKICAgICAgICBjb2xvcjogdmFyKC0tdGItbGluayk7CiAgICAgIH0KCiAgICAgIGE6dmlzaXRlZCB7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLWxpbmstdmlzaXRlZCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sZll0LnByb3RvdHlwZSwiX2RhdGFzZXRzIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sZll0LnByb3RvdHlwZSwiX2RhdGFzZXRzRmV0Y2hlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxmWXQucHJvdG90eXBlLCJfc2VsZWN0ZWREYXRhc2V0Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfcmVuZGVySGllcmFyY2h5Q2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIseVd0KV0sZll0LnByb3RvdHlwZSwiX3JlbmRlckhpZXJhcmNoeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixkcildLGZZdC5wcm90b3R5cGUsIl9yZXF1ZXN0TWFuYWdlciIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixYUildLGZZdC5wcm90b3R5cGUsIl9jYW5jZWxsZXIiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxmWXQucHJvdG90eXBlLCJfZGVidWdnZXJEYXRhRW5hYmxlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGZZdC5wcm90b3R5cGUsImFsbFN0ZXBzTW9kZUVuYWJsZWQiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sZll0LnByb3RvdHlwZSwic3BlY2lmaWNIZWFsdGhQaWxsU3RlcCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9oZWFsdGhQaWxsc1RvZ2dsZWRPbkNoYW5nZWQifSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxmWXQucHJvdG90eXBlLCJoZWFsdGhQaWxsc1RvZ2dsZWRPbiIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sZll0LnByb3RvdHlwZSwic2VsZWN0ZWROb2RlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sZll0LnByb3RvdHlwZSwiX2lzQXR0YWNoZWQiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxmWXQucHJvdG90eXBlLCJfaW5pdGlhbGl6ZWQiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxmWXQucHJvdG90eXBlLCJfYXJlSGVhbHRoUGlsbHNMb2FkaW5nIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXksbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sZll0LnByb3RvdHlwZSwiX2RlYnVnZ2VyTnVtZXJpY0FsZXJ0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxmWXQucHJvdG90eXBlLCJfbm9kZU5hbWVzVG9IZWFsdGhQaWxscyIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxmWXQucHJvdG90eXBlLCJfaGVhbHRoUGlsbFN0ZXBJbmRleCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxmWXQucHJvdG90eXBlLCJfaGVhbHRoUGlsbFJlcXVlc3RJZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxmWXQucHJvdG90eXBlLCJfaGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxmWXQucHJvdG90eXBlLCJfaGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJEZWxheSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sZll0LnByb3RvdHlwZSwicnVucyIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9ydW5PYnNlcnZlciJ9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sZll0LnByb3RvdHlwZSwicnVuIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGZZdC5wcm90b3R5cGUsIl9zZWxlY3Rpb24iLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sZll0LnByb3RvdHlwZSwiX2NvbXBhdGliaWxpdHlQcm92aWRlciIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGZZdC5wcm90b3R5cGUsIl90cmFjZUlucHV0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGZZdC5wcm90b3R5cGUsIl9hdXRvRXh0cmFjdE5vZGVzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGZZdC5wcm90b3R5cGUsIl9zZWxlY3RlZEZpbGUiLHZvaWQgMCksdChbYSgiX2lzQXR0YWNoZWQiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGZZdC5wcm90b3R5cGUsIl9tYXliZUluaXRpYWxpemVEYXNoYm9hcmQiLG51bGwpLHQoW2EoIl9kYXRhc2V0c0ZldGNoZWQiLCJfZGF0YXNldHMiLCJydW4iKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGZZdC5wcm90b3R5cGUsIl9kZXRlcm1pbmVTZWxlY3RlZERhdGFzZXQiLG51bGwpLHQoW2EoIl9kYXRhc2V0c0ZldGNoZWQiLCJfZGF0YXNldHMiLCJfc2VsZWN0ZWREYXRhc2V0IiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxmWXQucHJvdG90eXBlLCJfdXBkYXRlU2VsZWN0ZWREYXRhc2V0TmFtZSIsbnVsbCksZll0PXQoW2koInRmLWdyYXBoLWRhc2hib2FyZCIpXSxmWXQpO2NvbnN0IG1ZdD1MTjtsZXQgZ1l0PWNsYXNzIGV4dGVuZHMoZXIoaWwoeWUpKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMubW9kZT0ib2Zmc2V0Iix0aGlzLnRpbWVQcm9wZXJ0eT0ic3RlcCIsdGhpcy5iaW5zPSJiaW5zIix0aGlzLng9IngiLHRoaXMuZHg9ImR4Iix0aGlzLnk9InkiLHRoaXMuY29sb3JTY2FsZT1tWXQuc2NhbGVPcmRpbmFsKG1ZdC5zY2hlbWVDYXRlZ29yeTEwKSx0aGlzLm1vZGVUcmFuc2l0aW9uRHVyYXRpb249NTAwLHRoaXMuX25hbWU9bnVsbCx0aGlzLl9kYXRhPW51bGx9cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5zdmcsITApfWF0dGFjaGVkKCl7dGhpcy5fYXR0YWNoZWQ9ITB9ZGV0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMX1zZXRTZXJpZXNEYXRhKHQsZSl7dGhpcy5fbmFtZT10LHRoaXMuX2RhdGE9ZSx0aGlzLnJlZHJhdygpfV9yZWRyYXdPbkNoYW5nZSgpe3RoaXMucmVkcmF3KCl9cmVkcmF3KCl7dGhpcy5fZHJhdygwKX1fbW9kZVJlZHJhdygpe3RoaXMuX2RyYXcodGhpcy5tb2RlVHJhbnNpdGlvbkR1cmF0aW9uKX1fZHJhdyh0KXtpZighdGhpcy5fYXR0YWNoZWR8fCF0aGlzLl9kYXRhKXJldHVybjtpZih2b2lkIDA9PT10KXRocm93IG5ldyBFcnJvcigidnotaGlzdG9ncmFtLXRpbWVzZXJpZXMgX2RyYXcgbmVlZHMgZHVyYXRpb24iKTtpZih0aGlzLl9kYXRhLmxlbmd0aDw9MCl0aHJvdyBuZXcgRXJyb3IoIk5vdCBlbm91Z2ggc3RlcHMgaW4gdGhlIGRhdGEiKTtpZighdGhpcy5fZGF0YVswXS5oYXNPd25Qcm9wZXJ0eSh0aGlzLmJpbnMpKXRocm93IG5ldyBFcnJvcigiTm8gYmlucyBwcm9wZXJ0eSBvZiAnIit0aGlzLmJpbnMrIicgaW4gZGF0YSIpO2lmKHRoaXMuX2RhdGFbMF1bdGhpcy5iaW5zXS5sZW5ndGg8PTApdGhyb3cgbmV3IEVycm9yKCJNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGJpbiBpbiBiaW5zIGluIGRhdGEiKTtpZighdGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdWzBdLmhhc093blByb3BlcnR5KHRoaXMueCkpdGhyb3cgbmV3IEVycm9yKCJObyB4IHByb3BlcnR5ICciK3RoaXMueCsiJyBvbiBiaW5zIGRhdGEiKTtpZighdGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdWzBdLmhhc093blByb3BlcnR5KHRoaXMuZHgpKXRocm93IG5ldyBFcnJvcigiTm8gZHggcHJvcGVydHkgJyIrdGhpcy5keCsiJyBvbiBiaW5zIGRhdGEiKTtpZighdGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdWzBdLmhhc093blByb3BlcnR5KHRoaXMueSkpdGhyb3cgbmV3IEVycm9yKCJObyB5IHByb3BlcnR5ICciK3RoaXMueSsiJyBvbiBiaW5zIGRhdGEiKTt2YXIgZT10aGlzLnRpbWVQcm9wZXJ0eSxuPXRoaXMueCxpPXRoaXMuYmlucyxyPXRoaXMuZHgsbz10aGlzLnksYT10aGlzLl9kYXRhLHM9dGhpcy5tb2RlLGw9bVl0LmhjbCh0aGlzLmNvbG9yU2NhbGUodGhpcy5fbmFtZSkpLGM9bVl0LnNlbGVjdCh0aGlzLiQudG9vbHRpcCksdT1mdW5jdGlvbih0KXtyZXR1cm4gdFtuXX0saD1mdW5jdGlvbih0KXtyZXR1cm4gdFtvXX0sZD1mdW5jdGlvbih0KXtyZXR1cm4gdFtuXSt0W3JdfSxwPWZ1bmN0aW9uKHQpe3JldHVybiB0W2VdfTsicmVsYXRpdmUiPT09ZSYmKHA9ZnVuY3Rpb24odCl7cmV0dXJuIHQud2FsbF90aW1lLWFbMF0ud2FsbF90aW1lfSk7dmFyIGYsbT10aGlzLiQuc3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGc9bS53aWR0aCxfPW0uaGVpZ2h0LHk9e3RvcDo1LHJpZ2h0OjYwLGJvdHRvbToyMCxsZWZ0OjI0fTsib2Zmc2V0Ij09PXM/eS50b3A9NSsoZj1fLzIuNSk6Zj1fLXkudG9wLXkuYm90dG9tO3ZhciB2PWcteS5sZWZ0LXkucmlnaHQsYj1fLXkudG9wLXkuYm90dG9tO21ZdC5taW4oYSx1KSxtWXQubWF4KGEsZCk7dmFyIHg9bVl0LmZvcm1hdCgiLjNuIiksdz1tWXQuZm9ybWF0KCIuMGYiKTsid2FsbF90aW1lIj09PWU/dz1tWXQudGltZUZvcm1hdCgiJW0vJWQgJVgiKToicmVsYXRpdmUiPT09ZSYmKHc9ZnVuY3Rpb24odCl7cmV0dXJuIG1ZdC5mb3JtYXQoIi4xciIpKHQvMzZlNSkrImgifSk7dmFyIFM9YS5tYXAoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuW21ZdC5taW4odFtpXSx1KSxtWXQubWF4KHRbaV0sZCldfSkpLE09YS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBtWXQuZXh0ZW50KHRbaV0saCl9KSksRT01MDAsVD1tWXQuZXh0ZW50KGEscCksQz0oIndhbGxfdGltZSI9PT1lP21ZdC5zY2FsZVRpbWUoKTptWXQuc2NhbGVMaW5lYXIoKSkuZG9tYWluKFQpLnJhbmdlKFswLCJvZmZzZXQiPT09cz9iOjBdKSxBPW1ZdC5zY2FsZUxpbmVhcigpLmRvbWFpbihbMCxtWXQubWF4KGEsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1bZV1bMV19KSldKS5yYW5nZShbZiwwXSksaz1tWXQuc2NhbGVMaW5lYXIoKS5kb21haW4oQS5kb21haW4oKSkucmFuZ2UoW0UsMF0pLEw9bVl0LnNjYWxlTGluZWFyKCkuZG9tYWluKFttWXQubWluKGEsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIFNbZV1bMF19KSksbVl0Lm1heChhLChmdW5jdGlvbih0LGUpe3JldHVybiBTW2VdWzFdfSkpXSkubmljZSgpLnJhbmdlKFswLHZdKSxQPW1ZdC5zY2FsZUxpbmVhcigpLmRvbWFpbihMLmRvbWFpbigpKS5yYW5nZShbMCxFXSk7Y29uc3QgTj1tWXQuc2NhbGVMaW5lYXIoKS5kb21haW4obVl0LmV4dGVudChhLHApKS5yYW5nZShbbC5icmlnaHRlcigpLGwuZGFya2VyKCldKS5pbnRlcnBvbGF0ZShtWXQuaW50ZXJwb2xhdGVIY2wpO3ZhciBJPW1ZdC5heGlzQm90dG9tKEwpLnRpY2tzKE1hdGgubWF4KDIsdi8yMCkpLFI9bVl0LmF4aXNSaWdodChDKS50aWNrcyhNYXRoLm1heCgyLGIvMTUpKS50aWNrRm9ybWF0KHcpLE89bVl0LmF4aXNSaWdodChBKS50aWNrcyhNYXRoLm1heCgyLGIvMTUpKS50aWNrU2l6ZSh2KzUpLnRpY2tGb3JtYXQoeCksej1mdW5jdGlvbih0KXtyZXR1cm4gdFtuXSt0W3JdLzJ9LEQ9bVl0LmxpbmUoKS54KChmdW5jdGlvbih0KXtyZXR1cm4gUCh6KHQpKX0pKS55KChmdW5jdGlvbih0KXtyZXR1cm4gayh0W29dKX0pKSxCPXRoaXMuJC5zdmcsSD1tWXQuc2VsZWN0KEIpLEY9SC50cmFuc2l0aW9uKCkuZHVyYXRpb24odCksVj1ILnNlbGVjdCgiZyIpLmNsYXNzZWQoInNtYWxsIiwoZnVuY3Rpb24oKXtyZXR1cm4gdj4wJiZ2PD0xNTB9KSkuY2xhc3NlZCgibWVkaXVtIiwoZnVuY3Rpb24oKXtyZXR1cm4gdj4xNTAmJnY8PTMwMH0pKS5jbGFzc2VkKCJsYXJnZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIHY+MzAwfSkpLFU9Ri5zZWxlY3QoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit5LmxlZnQrIiwiK3kudG9wKyIpIiksaj1tWXQuYmlzZWN0b3IoZCkubGVmdCxHPVYuc2VsZWN0KCIuc3RhZ2UiKS5vbigibW91c2VvdmVyIiwoZnVuY3Rpb24oKXtKLnN0eWxlKCJvcGFjaXR5IiwxKSxldC5zdHlsZSgib3BhY2l0eSIsMSkscnQuc3R5bGUoIm9wYWNpdHkiLDEpLHN0LnN0eWxlKCJvcGFjaXR5IiwxKSxjLnN0eWxlKCJvcGFjaXR5IiwxKX0pKS5vbigibW91c2VvdXQiLChmdW5jdGlvbigpe0ouc3R5bGUoIm9wYWNpdHkiLDApLGV0LnN0eWxlKCJvcGFjaXR5IiwwKSxydC5zdHlsZSgib3BhY2l0eSIsMCksc3Quc3R5bGUoIm9wYWNpdHkiLDApLEouY2xhc3NlZCgiaG92ZXItY2xvc2VzdCIsITEpLEsuY2xhc3NlZCgib3V0bGluZS1ob3ZlciIsITEpLGMuc3R5bGUoIm9wYWNpdHkiLDApfSkpLm9uKCJtb3VzZW1vdmUiLChmdW5jdGlvbiBXKCl7dmFyIHQsYT1tWXQubW91c2UodGhpcyksbD1MLmludmVydChhWzBdKTtmdW5jdGlvbiB1KHQpe3JldHVybiBNYXRoLm1pbih0W2ldLmxlbmd0aC0xLGoodFtpXSxsKSl9Qy5pbnZlcnQoYVsxXSk7dmFyIGgsZD0xLzA7Si5hdHRyKCJ0cmFuc2Zvcm0iLChmdW5jdGlvbihlLGwpe3ZhciBjPXUoZSk7aD1lO3ZhciBtPUwoZVtpXVtjXVtuXStlW2ldW2NdW3JdLzIpLGc9QShlW2ldW2NdW29dKSxfPSJvZmZzZXQiPT09cz9DKHAoZSkpLShmLWcpOmcseT1NYXRoLmFicyhhWzFdLV8pO3JldHVybiB5PGQmJihkPXksdD1lKSwidHJhbnNsYXRlKCIrbSsiLCIrZysiKSJ9KSksSi5zZWxlY3QoInRleHQiKS50ZXh0KChmdW5jdGlvbih0KXt2YXIgZT11KHQpO3JldHVybiB0W2ldW2VdW29dfSkpLEouY2xhc3NlZCgiaG92ZXItY2xvc2VzdCIsKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dH0pKSxLLmNsYXNzZWQoIm91dGxpbmUtaG92ZXIiLChmdW5jdGlvbihlKXtyZXR1cm4gZT09PXR9KSk7dmFyIG09dShoKTtldC5hdHRyKCJ0cmFuc2Zvcm0iLChmdW5jdGlvbih0KXtyZXR1cm4idHJhbnNsYXRlKCIrTChoW2ldW21dW25dK2hbaV1bbV1bcl0vMikrIiwgIitiKyIpIn0pKS5zZWxlY3QoInRleHQiKS50ZXh0KChmdW5jdGlvbih0KXtyZXR1cm4geChoW2ldW21dW25dK2hbaV1bbV1bcl0vMil9KSk7dmFyIGc9Ui50aWNrRm9ybWF0KCk7cnQuYXR0cigidHJhbnNmb3JtIiwoZnVuY3Rpb24oZSl7cmV0dXJuInRyYW5zbGF0ZSgiK3YrIiwgIisoIm9mZnNldCI9PT1zP0MocCh0KSk6MCkrIikifSkpLnN0eWxlKCJkaXNwbGF5Iiwib2Zmc2V0Ij09PXM/IiI6Im5vbmUiKS5zZWxlY3QoInRleHQiKS50ZXh0KChmdW5jdGlvbihlKXtyZXR1cm4gZyhwKHQpKX0pKTt2YXIgXz1PLnRpY2tGb3JtYXQoKTtzdC5hdHRyKCJ0cmFuc2Zvcm0iLChmdW5jdGlvbihlKXtyZXR1cm4idHJhbnNsYXRlKCIrdisiLCAiKygib2Zmc2V0Ij09PXM/MDpBKHRbaV1bbV1bb10pKSsiKSJ9KSkuc3R5bGUoImRpc3BsYXkiLCJvZmZzZXQiPT09cz8ibm9uZSI6IiIpLnNlbGVjdCgidGV4dCIpLnRleHQoKGZ1bmN0aW9uKGUpe3JldHVybiBfKHRbaV1bbV1bb10pfSkpO3ZhciB5PW1ZdC5tb3VzZShCKTtjLnN0eWxlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIisoeVswXSsxNSkrInB4LCIrKHlbMV0tMTUpKyJweCkiKS5zZWxlY3QoInNwYW4iKS50ZXh0KCJvZmZzZXQiPT09cz9fKHRbaV1bbV1bb10pOigic3RlcCI9PT1lPyJzdGVwICI6IiIpK2cocCh0KSkpfSkpO0cuc2VsZWN0KCIuYmFja2dyb3VuZCIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiKy15LmxlZnQrIiwiKy15LnRvcCsiKSIpLmF0dHIoIndpZHRoIixnKS5hdHRyKCJoZWlnaHQiLF8pO3ZhciBxPUcuc2VsZWN0QWxsKCIuaGlzdG9ncmFtIikuZGF0YShhKTtxLmV4aXQoKS5yZW1vdmUoKTt2YXIgWT1xLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJoaXN0b2dyYW0iKSxYPVkubWVyZ2UocSkuc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gcCh0KS1wKGUpfSkpLCQ9VS5zZWxlY3RBbGwoIi5oaXN0b2dyYW0iKS5hdHRyKCJ0cmFuc2Zvcm0iLChmdW5jdGlvbih0KXtyZXR1cm4idHJhbnNsYXRlKDAsICIrKCJvZmZzZXQiPT09cz9DKHAodCkpLWY6MCkrIikifSkpO1kuYXBwZW5kKCJsaW5lIikuYXR0cigiY2xhc3MiLCJiYXNlbGluZSIpLCQuc2VsZWN0KCIuYmFzZWxpbmUiKS5zdHlsZSgic3Ryb2tlLW9wYWNpdHkiLChmdW5jdGlvbih0KXtyZXR1cm4ib2Zmc2V0Ij09PXM/LjE6MH0pKS5hdHRyKCJ5MSIsZikuYXR0cigieTIiLGYpLmF0dHIoIngyIix2KSxZLmFwcGVuZCgicGF0aCIpLmF0dHIoImNsYXNzIiwib3V0bGluZSIpO3ZhciBLPVguc2VsZWN0KCIub3V0bGluZSIpLmF0dHIoInZlY3Rvci1lZmZlY3QiLCJub24tc2NhbGluZy1zdHJva2UiKS5hdHRyKCJkIiwoZnVuY3Rpb24odCl7cmV0dXJuKGZ1bmN0aW9uKHQpe3JldHVybiJNIitQKHoodFswXSkpKyIsIitrKDApKyJMIitEKHQpLnNsaWNlKDEpKyJMIitQKHoodFt0Lmxlbmd0aC0xXSkpKyIsIitrKDApfSkodFtpXSl9KSkuc3R5bGUoInN0cm9rZS13aWR0aCIsMSk7JC5zZWxlY3QoIi5vdXRsaW5lIikuYXR0cigidHJhbnNmb3JtIiwic2NhbGUoIit2L0UrIiwgIitmL0UrIikiKS5zdHlsZSgic3Ryb2tlIiwoZnVuY3Rpb24odCl7cmV0dXJuIm9mZnNldCI9PT1zPyIiOk4ocCh0KSl9KSkuc3R5bGUoImZpbGwtb3BhY2l0eSIsKGZ1bmN0aW9uKHQpe3JldHVybiJvZmZzZXQiPT09cz8xOjB9KSkuc3R5bGUoImZpbGwiLChmdW5jdGlvbih0KXtyZXR1cm4gTihwKHQpKX0pKTt2YXIgWj1ZLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwiaG92ZXIiKSxKPVguc2VsZWN0KCIuaG92ZXIiKS5zdHlsZSgiZmlsbCIsKGZ1bmN0aW9uKHQpe3JldHVybiBOKHAodCkpfSkpO1ouYXBwZW5kKCJjaXJjbGUiKS5hdHRyKCJyIiwyKSxaLmFwcGVuZCgidGV4dCIpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLmF0dHIoImR4Iiw0KTt2YXIgUT1WLnNlbGVjdCgiLngtYXhpcy1ob3ZlciIpLnNlbGVjdEFsbCgiLmxhYmVsIikuZGF0YShbIngiXSksdHQ9US5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibGFiZWwiKSxldD1RLm1lcmdlKHR0KTt0dC5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtMjApLmF0dHIoInkiLDYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCksdHQuYXBwZW5kKCJsaW5lIikuYXR0cigieDEiLDApLmF0dHIoIngyIiwwKS5hdHRyKCJ5MSIsMCkuYXR0cigieTIiLDYpLHR0LmFwcGVuZCgidGV4dCIpLmF0dHIoImR5IiwxOCk7dmFyIG50PVYuc2VsZWN0KCIueS1heGlzLWhvdmVyIikuc2VsZWN0QWxsKCIubGFiZWwiKS5kYXRhKFsieSJdKSxpdD1udC5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibGFiZWwiKSxydD1udC5tZXJnZShpdCk7aXQuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsOCkuYXR0cigieSIsLTYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCksaXQuYXBwZW5kKCJsaW5lIikuYXR0cigieDEiLDApLmF0dHIoIngyIiw2KS5hdHRyKCJ5MSIsMCkuYXR0cigieTIiLDApLGl0LmFwcGVuZCgidGV4dCIpLmF0dHIoImR4Iiw4KS5hdHRyKCJkeSIsNCk7dmFyIG90PVYuc2VsZWN0KCIueS1zbGljZS1heGlzLWhvdmVyIikuc2VsZWN0QWxsKCIubGFiZWwiKS5kYXRhKFsieSJdKSxhdD1vdC5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibGFiZWwiKSxzdD1vdC5tZXJnZShhdCk7YXQuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsOCkuYXR0cigieSIsLTYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCksYXQuYXBwZW5kKCJsaW5lIikuYXR0cigieDEiLDApLmF0dHIoIngyIiw2KS5hdHRyKCJ5MSIsMCkuYXR0cigieTIiLDApLGF0LmFwcGVuZCgidGV4dCIpLmF0dHIoImR4Iiw4KS5hdHRyKCJkeSIsNCksVS5zZWxlY3QoIi55LmF4aXMuc2xpY2UiKS5zdHlsZSgib3BhY2l0eSIsIm9mZnNldCI9PT1zPzA6MSkuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDAsICIrKCJvZmZzZXQiPT09cz8tZjowKSsiKSIpLmNhbGwoTyksVS5zZWxlY3QoIi54LmF4aXMiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwgIitiKyIpIikuY2FsbChJKSxVLnNlbGVjdCgiLnkuYXhpcyIpLnN0eWxlKCJvcGFjaXR5Iiwib2Zmc2V0Ij09PXM/MTowKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit2KyIsICIrKCJvZmZzZXQiPT09cz8wOmIpKyIpIikuY2FsbChSKSxVLnNlbGVjdEFsbCgiLnRpY2sgdGV4dCIpLmF0dHIoImZpbGwiLCIjYWFhIiksVS5zZWxlY3RBbGwoIi5heGlzIHBhdGguZG9tYWluIikuYXR0cigic3Ryb2tlIiwibm9uZSIpfX07ZnVuY3Rpb24gX1l0KHQpe2NvbnN0W2UsbixpXT10O3JldHVybnt3YWxsX3RpbWU6ZSxzdGVwOm4sbWluOllsKGkubWFwKCgoW3QsLF0pPT50KSkpLG1heDpXbChpLm1hcCgoKFssdF0pPT50KSkpLGJ1Y2tldHM6aS5tYXAoKChbdCxlLG5dKT0+KHtsZWZ0OnQscmlnaHQ6ZSxjb3VudDpufSkpKX19ZnVuY3Rpb24geVl0KHQsZSxuLGk9MzApe249PT1lJiYobj0xLjEqZSsxLGU9ZS8xLjEtMSk7Y29uc3Qgcj0obi1lKS9pO2xldCBvPTA7cmV0dXJuIHpsKGUsbixyKS5tYXAoKGk9Pntjb25zdCBhPWkrcjtsZXQgcz0wO2Zvcig7bzx0LmJ1Y2tldHMubGVuZ3RoOyl7Y29uc3Qgcj1NYXRoLm1pbihuLHQuYnVja2V0c1tvXS5yaWdodCksbD1NYXRoLm1heChlLHQuYnVja2V0c1tvXS5sZWZ0KSxjPU1hdGgubWluKHIsYSktTWF0aC5tYXgobCxpKSx1PWMvKHItbCkqdC5idWNrZXRzW29dLmNvdW50O2lmKHMrPWM+MD91OjAscj5hKWJyZWFrO28rK31yZXR1cm57eDppLGR4OnIseTpzfX0pKX1nWXQudGVtcGxhdGU9X2VgCiAgICA8ZGl2IGlkPSJ0b29sdGlwIj48c3Bhbj48L3NwYW4+PC9kaXY+CiAgICA8c3ZnIGlkPSJzdmciPgogICAgICA8Zz4KICAgICAgICA8ZyBjbGFzcz0iYXhpcyB4Ij48L2c+CiAgICAgICAgPGcgY2xhc3M9ImF4aXMgeSI+PC9nPgogICAgICAgIDxnIGNsYXNzPSJheGlzIHkgc2xpY2UiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0ic3RhZ2UiPgogICAgICAgICAgPHJlY3QgY2xhc3M9ImJhY2tncm91bmQiPjwvcmVjdD4KICAgICAgICA8L2c+CiAgICAgICAgPGcgY2xhc3M9IngtYXhpcy1ob3ZlciI+PC9nPgogICAgICAgIDxnIGNsYXNzPSJ5LWF4aXMtaG92ZXIiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0ieS1zbGljZS1heGlzLWhvdmVyIj48L2c+CiAgICAgIDwvZz4KICAgIDwvc3ZnPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGNvbG9yOiAjYWFhOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIC0tdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMtaG92ZXItYmctY29sb3I6ICNmZmY7CiAgICAgICAgLS12ei1oaXN0b2dyYW0tdGltZXNlcmllcy1vdXRsaW5lLWNvbG9yOiAjZmZmOwogICAgICAgIC0tdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMtaG92ZXItb3V0bGluZS1jb2xvcjogIzAwMDsKICAgICAgfQoKICAgICAgOmhvc3QoLmRhcmstbW9kZSkgewogICAgICAgIC0tdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMtaG92ZXItYmctY29sb3I6IHZhcigKICAgICAgICAgIC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yCiAgICAgICAgKTsKICAgICAgICAtLXZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzLW91dGxpbmUtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNjAwKTsKICAgICAgICAtLXZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzLWhvdmVyLW91dGxpbmUtY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgIHN2ZyB7CiAgICAgICAgZm9udC1mYW1pbHk6IHJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgIH0KCiAgICAgIHRleHQgewogICAgICAgIGZpbGw6IGN1cnJlbnRDb2xvcjsKICAgICAgfQoKICAgICAgI3Rvb2x0aXAgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgfQoKICAgICAgLmJhY2tncm91bmQgewogICAgICAgIGZpbGwtb3BhY2l0eTogMDsKICAgICAgICBmaWxsOiByZWQ7CiAgICAgIH0KCiAgICAgIC5oaXN0b2dyYW0gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAuaG92ZXIgewogICAgICAgIGZvbnQtc2l6ZTogOXB4OwogICAgICAgIGRvbWluYW50LWJhc2VsaW5lOiBtaWRkbGU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmhvdmVyIGNpcmNsZSB7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMC41OwogICAgICAgIHN0cm9rZS13aWR0aDogMXB4OwogICAgICB9CgogICAgICAuaG92ZXIgdGV4dCB7CiAgICAgICAgZmlsbDogYmxhY2s7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmhvdmVyLmhvdmVyLWNsb3Nlc3QgY2lyY2xlIHsKICAgICAgICBmaWxsOiB2YXIoLS12ei1oaXN0b2dyYW0tdGltZXNlcmllcy1ob3Zlci1vdXRsaW5lLWNvbG9yKSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaG92ZXIuaG92ZXItY2xvc2VzdCB0ZXh0IHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAuYmFzZWxpbmUgewogICAgICAgIHN0cm9rZTogYmxhY2s7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuMTsKICAgICAgfQoKICAgICAgLm91dGxpbmUgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiB2YXIoLS12ei1oaXN0b2dyYW0tdGltZXNlcmllcy1vdXRsaW5lLWNvbG9yKTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAub3V0bGluZS5vdXRsaW5lLWhvdmVyIHsKICAgICAgICBzdHJva2U6IHZhcigtLXZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzLWhvdmVyLW91dGxpbmUtY29sb3IpICFpbXBvcnRhbnQ7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIsCiAgICAgIC55LWF4aXMtaG92ZXIsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIC5sYWJlbCwKICAgICAgLnktYXhpcy1ob3ZlciAubGFiZWwsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgLmxhYmVsIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB0ZXh0LWFuY2hvcjogZW5kOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIHRleHQgewogICAgICAgIHRleHQtYW5jaG9yOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIC55LWF4aXMtaG92ZXIgdGV4dCwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciB0ZXh0IHsKICAgICAgICB0ZXh0LWFuY2hvcjogc3RhcnQ7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIgbGluZSwKICAgICAgLnktYXhpcy1ob3ZlciBsaW5lLAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIGxpbmUgewogICAgICAgIHN0cm9rZTogY3VycmVudENvbG9yOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIHJlY3QsCiAgICAgIC55LWF4aXMtaG92ZXIgcmVjdCwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciByZWN0IHsKICAgICAgICBmaWxsOiB2YXIoLS12ei1oaXN0b2dyYW0tdGltZXNlcmllcy1ob3Zlci1iZy1jb2xvcik7CiAgICAgIH0KCiAgICAgICN0b29sdGlwLAogICAgICAueC1heGlzLWhvdmVyIHRleHQsCiAgICAgIC55LWF4aXMtaG92ZXIgdGV4dCwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciB0ZXh0IHsKICAgICAgICBjb2xvcjogdmFyKC0tdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMtaG92ZXItb3V0bGluZS1jb2xvcik7CiAgICAgIH0KCiAgICAgIC5heGlzIHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgIH0KCiAgICAgIC5heGlzIHBhdGguZG9tYWluIHsKICAgICAgICBmaWxsOiBub25lOwogICAgICB9CgogICAgICAuYXhpcyAudGljayBsaW5lIHsKICAgICAgICBzdHJva2U6ICNkZGQ7CiAgICAgIH0KCiAgICAgIC5heGlzLnNsaWNlIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICB9CgogICAgICAuYXhpcy5zbGljZSAudGljayBsaW5lIHsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiAyOwogICAgICB9CgogICAgICAuc21hbGwgLmF4aXMgdGV4dCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAuc21hbGwgLmF4aXMgLnRpY2s6Zmlyc3Qtb2YtdHlwZSB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAuc21hbGwgLmF4aXMgLnRpY2s6bGFzdC1vZi10eXBlIHRleHQgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5tZWRpdW0gLmF4aXMgdGV4dCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAubWVkaXVtIC5heGlzIC50aWNrOm50aC1jaGlsZCgybiArIDEpIHRleHQgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5sYXJnZSAuYXhpcyB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIC5sYXJnZSAuYXhpcyAudGljazpudGgtY2hpbGQoMm4gKyAxKSB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGdZdC5wcm90b3R5cGUsIm1vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sZ1l0LnByb3RvdHlwZSwidGltZVByb3BlcnR5Iix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGdZdC5wcm90b3R5cGUsImJpbnMiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sZ1l0LnByb3RvdHlwZSwieCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxnWXQucHJvdG90eXBlLCJkeCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxnWXQucHJvdG90eXBlLCJ5Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGdZdC5wcm90b3R5cGUsImNvbG9yU2NhbGUiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sZ1l0LnByb3RvdHlwZSwibW9kZVRyYW5zaXRpb25EdXJhdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGdZdC5wcm90b3R5cGUsIl9hdHRhY2hlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxnWXQucHJvdG90eXBlLCJfbmFtZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sZ1l0LnByb3RvdHlwZSwiX2RhdGEiLHZvaWQgMCksdChbYSgidGltZVByb3BlcnR5IiwiY29sb3JTY2FsZSIsIl9hdHRhY2hlZCIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sZ1l0LnByb3RvdHlwZSwiX3JlZHJhd09uQ2hhbmdlIixudWxsKSx0KFthKCJtb2RlIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxnWXQucHJvdG90eXBlLCJfbW9kZVJlZHJhdyIsbnVsbCksZ1l0PXQoW2koInZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIildLGdZdCk7bGV0IHZZdD1jbGFzcyBleHRlbmRzKExUdChlcih5ZSkpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5nZXREYXRhTG9hZE5hbWU9KHtydW46dH0pPT50LHRoaXMucmVxdWVzdERhdGE9KHQsZSxuKT0+e2NvbnN0IGk9X3IoKS5wbHVnaW5Sb3V0ZSgiaGlzdG9ncmFtcyIsIi9oaXN0b2dyYW1zIik7UHJvbWlzZS5hbGwodC5tYXAoKHQ9Pntjb25zdCBuPWlPKGkse3RhZzp0LnRhZyxydW46dC5ydW59KTtyZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KG4pLnRoZW4oKG49PntlKHtpdGVtOnQsZGF0YTpufSl9KSl9KSkpLmZpbmFsbHkoKCgpPT57bigpfSkpfSx0aGlzLmxvYWREYXRhQ2FsbGJhY2s9KHQsZSxuKT0+e2NvbnN0IGk9KGZ1bmN0aW9uIHIodCl7Y29uc3QgZT10Lm1hcChfWXQpLG49WWwoZSwodD0+dC5taW4pKSxpPVdsKGUsKHQ9PnQubWF4KSk7cmV0dXJuIGUubWFwKCh0PT4oe3dhbGxfdGltZTp0LndhbGxfdGltZSxzdGVwOnQuc3RlcCxiaW5zOnlZdCh0LG4saSl9KSkpfSkobiksbz10aGlzLmdldERhdGFMb2FkTmFtZShlKTt0aGlzLiQuY2hhcnQuc2V0U2VyaWVzRGF0YShvLGkpfSx0aGlzLl9jb2xvclNjYWxlRnVuY3Rpb249R1IsdGhpcy5fZXhwYW5kZWQ9ITF9X3JlbG9hZE9uUnVuVGFnUmVxdWVzdE1hbmFnZXJDaGFuZ2UoKXt0aGlzLnJlbG9hZCgpfV91cGRhdGVEYXRhVG9Mb2FkKCl7dGhpcy5kYXRhVG9Mb2FkPVt7cnVuOnRoaXMucnVuLHRhZzp0aGlzLnRhZ31dfWdldCBfcnVuQ29sb3IoKXtyZXR1cm4gdGhpcy5fY29sb3JTY2FsZUZ1bmN0aW9uKHRoaXMucnVuKX1yZWRyYXcoKXt0aGlzLiQuY2hhcnQucmVkcmF3KCl9X3RvZ2dsZUV4cGFuZGVkKHQpe3RoaXMuc2V0KCJfZXhwYW5kZWQiLCF0aGlzLl9leHBhbmRlZCksdGhpcy5yZWRyYXcoKX19O3ZZdC50ZW1wbGF0ZT1fZWAKICAgIDx0Zi1jYXJkLWhlYWRpbmcKICAgICAgdGFnPSJbW3RhZ11dIgogICAgICBydW49IltbcnVuXV0iCiAgICAgIGRpc3BsYXktbmFtZT0iW1t0YWdNZXRhZGF0YS5kaXNwbGF5TmFtZV1dIgogICAgICBkZXNjcmlwdGlvbj0iW1t0YWdNZXRhZGF0YS5kZXNjcmlwdGlvbl1dIgogICAgICBjb2xvcj0iW1tfcnVuQ29sb3JdXSIKICAgID48L3RmLWNhcmQtaGVhZGluZz4KICAgIDwhLS0KICAgICAgVGhlIG1haW4gaGlzdG9ncmFtIHRoYXQgd2UgcmVuZGVyLiBEYXRhIGlzIHNldCBkaXJlY3RseSB3aXRoCiAgICAgIFxgc2V0U2VyaWVzRGF0YVxgLCBub3Qgd2l0aCBhIGJvdW5kIHByb3BlcnR5LgogICAgLS0+CiAgICA8dnotaGlzdG9ncmFtLXRpbWVzZXJpZXMKICAgICAgaWQ9ImNoYXJ0IgogICAgICB0aW1lLXByb3BlcnR5PSJbW3RpbWVQcm9wZXJ0eV1dIgogICAgICBtb2RlPSJbW2hpc3RvZ3JhbU1vZGVdXSIKICAgICAgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVGdW5jdGlvbl1dIgogICAgPjwvdnotaGlzdG9ncmFtLXRpbWVzZXJpZXM+CiAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogcm93OyI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIKICAgICAgICBpY29uPSJmdWxsc2NyZWVuIgogICAgICAgIG9uLXRhcD0iX3RvZ2dsZUV4cGFuZGVkIgogICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHdpZHRoOiAzMzBweDsKICAgICAgICBoZWlnaHQ6IDIzNXB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDcwMHB4OwogICAgICAgIGhlaWdodDogNTAwcHg7CiAgICAgIH0KCiAgICAgIHZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIHsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICB0Zi1jYXJkLWhlYWRpbmcgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgICAgd2lkdGg6IDkwJTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHZZdC5wcm90b3R5cGUsInJ1biIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx2WXQucHJvdG90eXBlLCJ0YWciLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sdll0LnByb3RvdHlwZSwiZ2V0RGF0YUxvYWROYW1lIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLGRyKV0sdll0LnByb3RvdHlwZSwicmVxdWVzdE1hbmFnZXIiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sdll0LnByb3RvdHlwZSwibG9hZERhdGFDYWxsYmFjayIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSx2WXQucHJvdG90eXBlLCJ0YWdNZXRhZGF0YSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx2WXQucHJvdG90eXBlLCJ0aW1lUHJvcGVydHkiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sdll0LnByb3RvdHlwZSwiaGlzdG9ncmFtTW9kZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLHZZdC5wcm90b3R5cGUsIl9jb2xvclNjYWxlRnVuY3Rpb24iLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sdll0LnByb3RvdHlwZSwiX2V4cGFuZGVkIix2b2lkIDApLHQoW2EoInJ1biIsInRhZyIsInJlcXVlc3RNYW5hZ2VyIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSx2WXQucHJvdG90eXBlLCJfcmVsb2FkT25SdW5UYWdSZXF1ZXN0TWFuYWdlckNoYW5nZSIsbnVsbCksdChbYSgicnVuIiwidGFnIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSx2WXQucHJvdG90eXBlLCJfdXBkYXRlRGF0YVRvTG9hZCIsbnVsbCksdChbcygicnVuIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sdll0LnByb3RvdHlwZSwiX3J1bkNvbG9yIixudWxsKSx2WXQ9dChbaSgidGYtaGlzdG9ncmFtLWxvYWRlciIpXSx2WXQpO2xldCBiWXQ9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnJlbG9hZE9uUmVhZHk9ITAsdGhpcy5faGlzdG9ncmFtTW9kZT0ib2Zmc2V0Iix0aGlzLl90aW1lUHJvcGVydHk9InN0ZXAiLHRoaXMuX3Jlc3RhbXA9ITEsdGhpcy5fcmVxdWVzdE1hbmFnZXI9bmV3IGRyfV9yZWRyYXdDYXRlZ29yeVBhbmUodCxlKXtlJiZ0LnRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1oaXN0b2dyYW0tbG9hZGVyIikuZm9yRWFjaCgodD0+dC5yZWRyYXcoKSkpfXJlYWR5KCl7c3VwZXIucmVhZHkoKSx0aGlzLnJlbG9hZE9uUmVhZHkmJnRoaXMucmVsb2FkKCl9cmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKCk9Pnt0aGlzLl9yZWxvYWRIaXN0b2dyYW1zKCl9KSl9X2ZldGNoVGFncygpe2NvbnN0IHQ9X3IoKS5wbHVnaW5Sb3V0ZSgiaGlzdG9ncmFtcyIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodCkudGhlbigodD0+e2lmKFNlLmV4cG9ydHMuaXNFcXVhbCh0LHRoaXMuX3J1blRvVGFnSW5mbykpcmV0dXJuO2NvbnN0IGU9U2UuZXhwb3J0cy5tYXBWYWx1ZXModCwodD0+T2JqZWN0LmtleXModCkpKSxuPWFyKGUpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09bi5sZW5ndGgpLHRoaXMuc2V0KCJfcnVuVG9UYWciLGUpLHRoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIix0KSx0aGlzLmFzeW5jKCgoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KSl9KSl9X3JlbG9hZEhpc3RvZ3JhbXMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtaGlzdG9ncmFtLWxvYWRlciIpLmZvckVhY2goKHQ9Pnt0LnJlbG9hZCgpfSkpfV9zaG91bGRPcGVuKHQpe3JldHVybiB0PD0yfWdldCBfY2F0ZWdvcmllcygpe3JldHVybiBNcih0aGlzLl9ydW5Ub1RhZyx0aGlzLl9zZWxlY3RlZFJ1bnMsdGhpcy5fdGFnRmlsdGVyKX1fdGFnTWV0YWRhdGEodCxlLG4pe3JldHVybiB0W2VdW25dfX07ZnVuY3Rpb24geFl0KHQpe3JldHVybiIiIT09dC5kaXNwbGF5TmFtZSYmdm9pZCAwIT09dC5kaXNwbGF5TmFtZT90LmRpc3BsYXlOYW1lOnQubmFtZX1mdW5jdGlvbiB3WXQodCl7aWYoIiIhPT10LmRpc3BsYXlOYW1lJiZ2b2lkIDAhPT10LmRpc3BsYXlOYW1lKXJldHVybiB0LmRpc3BsYXlOYW1lO2xldCBlPXQubmFtZS5ncm91cCxuPXQubmFtZS50YWc7cmV0dXJuIHZvaWQgMD09PWUmJihlPSIiKSx2b2lkIDA9PT1uJiYobj0iIiksIiI9PT1lP246ZSsiLiIrbn1mdW5jdGlvbiBTWXQodCxlKXtyZXR1cm4gZTx0LmhwYXJhbUNvbHVtbnMubGVuZ3RoP3hZdCh0LmhwYXJhbUNvbHVtbnNbZV0uaHBhcmFtSW5mbyk6d1l0KHQubWV0cmljQ29sdW1uc1tlLXQuaHBhcmFtQ29sdW1ucy5sZW5ndGhdLm1ldHJpY0luZm8pfWZ1bmN0aW9uIE1ZdCh0KXtyZXR1cm4gdC5ocGFyYW1Db2x1bW5zLmxlbmd0aH1mdW5jdGlvbiBFWXQodCl7cmV0dXJuIHQubWV0cmljQ29sdW1ucy5sZW5ndGh9ZnVuY3Rpb24gVFl0KHQpe3JldHVybiBNWXQodCkrRVl0KHQpfWZ1bmN0aW9uIENZdCh0LGUpe3JldHVybiB0W2VdfWZ1bmN0aW9uIEFZdCh0LGUpe3JldHVybiB0LmZpbmQoKHQ9PlNlLmV4cG9ydHMuaXNFcXVhbCh0Lm5hbWUsZSkpKX1mdW5jdGlvbiBrWXQodCxlLG4pe3JldHVybiBlLmhwYXJhbXNbdC5ocGFyYW1Db2x1bW5zW25dLmhwYXJhbUluZm8ubmFtZV19ZnVuY3Rpb24gTFl0KHQsZSxuKXtjb25zdCBpPUFZdChlLm1ldHJpY1ZhbHVlcyx0Lm1ldHJpY0NvbHVtbnNbbl0ubWV0cmljSW5mby5uYW1lKTtyZXR1cm4gdm9pZCAwPT09aT92b2lkIDA6aS52YWx1ZX1mdW5jdGlvbiBQWXQodCxlLG4pe3JldHVybiBuPHQuaHBhcmFtQ29sdW1ucy5sZW5ndGg/a1l0KHQsZSxuKTpMWXQodCxlLG4tdC5ocGFyYW1Db2x1bW5zLmxlbmd0aCl9ZnVuY3Rpb24gTll0KHQsZSxuKXtyZXR1cm4gTGwoZSwoZT0+UFl0KHQsZSxuKSkpfWZ1bmN0aW9uIElZdCh0LGUsbil7bGV0IGk7aWYobjxlLmhwYXJhbUluZm9zLmxlbmd0aClpPXQuaHBhcmFtQ29sdW1ucy5maW5kSW5kZXgoKHQ9PnQuaHBhcmFtSW5mby5uYW1lPT09ZS5ocGFyYW1JbmZvc1tuXS5uYW1lKSk7ZWxzZXtjb25zdCByPWUubWV0cmljSW5mb3Nbbi1lLmhwYXJhbUluZm9zLmxlbmd0aF0ubmFtZTtpPXQuaHBhcmFtQ29sdW1ucy5sZW5ndGgrdC5tZXRyaWNDb2x1bW5zLmZpbmRJbmRleCgodD0+dC5tZXRyaWNJbmZvLm5hbWU9PT1yKSl9cmV0dXJuIGNvbnNvbGUuYXNzZXJ0KC0xIT09aSksaX1mdW5jdGlvbiBSWXQodCl7cmV0dXJuIHQuaHBhcmFtSW5mb3MubGVuZ3RofWZ1bmN0aW9uIE9ZdCh0KXtyZXR1cm4gdC5tZXRyaWNJbmZvcy5sZW5ndGh9ZnVuY3Rpb24gell0KHQsZSxuKXtyZXR1cm4gTGwoZSwoZT0+Rll0KHQsZSxuKSkpfWZ1bmN0aW9uIERZdCh0LGUpe3JldHVybiB0LmZpbmQoKHQ9PnQubmFtZT09PWUpKX1mdW5jdGlvbiBCWXQodCxlLG4pe3JldHVybiBlLmhwYXJhbXNbdC5ocGFyYW1JbmZvc1tuXS5uYW1lXX1mdW5jdGlvbiBIWXQodCxlLG4pe2NvbnN0IGk9QVl0KGUubWV0cmljVmFsdWVzLHQubWV0cmljSW5mb3Nbbl0ubmFtZSk7cmV0dXJuIHZvaWQgMD09PWk/dm9pZCAwOmkudmFsdWV9ZnVuY3Rpb24gRll0KHQsZSxuKXtyZXR1cm4gbjx0LmhwYXJhbUluZm9zLmxlbmd0aD9CWXQodCxlLG4pOkhZdCh0LGUsbi10LmhwYXJhbUluZm9zLmxlbmd0aCl9ZnVuY3Rpb24gVll0KHQpe3JldHVybiBTZS5leHBvcnRzLmlzTnVtYmVyKHQpP3QudG9QcmVjaXNpb24oNSk6dm9pZCAwPT09dD8iIjp0LnRvU3RyaW5nKCl9ZnVuY3Rpb24gVVl0KHQsZSl7cmV0dXJuIHQqdCtlKmV9ZnVuY3Rpb24gall0KHQsZSxuLGkpe3JldHVybiBNYXRoLnNxcnQoVVl0KHQtbixlLWkpKX1mdW5jdGlvbiBHWXQodCxlLG4saSxyLG8pe2lmKHQ8biYmZTxpKXJldHVybiBqWXQodCxlLG4saSk7aWYobjw9dCYmdDxyJiZlPGkpcmV0dXJuIGktZTtpZihyPD10JiZlPGkpcmV0dXJuIGpZdCh0LGUscixpKTtpZih0PG4mJmk8PWUmJmU8bylyZXR1cm4gbi10O2lmKG48PXQmJnQ8ciYmaTw9ZSYmZTxvKXJldHVybiAwO2lmKHI8PXQmJmk8PWUmJmU8bylyZXR1cm4gdC1yO2lmKHQ8biYmbzw9ZSlyZXR1cm4gall0KHQsZSxuLG8pO2lmKG48PXQmJnQ8ciYmbzw9ZSlyZXR1cm4gZS1vO2lmKHI8PXQmJm88PWUpcmV0dXJuIGpZdCh0LGUscixvKTt0aHJvdyJQb2ludCAoeCx5KSBtdXN0IGJlIGluIG9uZSBvZiB0aGUgcmVnaW9ucyBkZWZpbmVkIGFib3ZlLiJ9ZnVuY3Rpb24gV1l0KHQsZSl7cmV0dXJuIHZvaWQgMD09PWU/InRyYW5zbGF0ZSgiK3QrIikiOiJ0cmFuc2xhdGUoIit0KyIsIitlKyIpIn1mdW5jdGlvbiBxWXQodCxlLG4pe2NvbnN0IGk9dC5nZXQoZSx0KTtBcnJheS5pc0FycmF5KGkpP3Quc3BsaWNlLmFwcGx5KHQsW2UsMCxpLmxlbmd0aF0uY29uY2F0KG4pKTp0LnNldChlLG4pfWZ1bmN0aW9uIFlZdCh0KXtsZXQgZT0wO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7KytuKWU9MzEqZSt0LmNoYXJDb2RlQXQobikmNDI5NDk2NzI5NTtyZXR1cm4gZStNYXRoLnBvdygyLDMxKX1iWXQudGVtcGxhdGU9X2VgCiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZXR0aW5ncyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yCiAgICAgICAgICAgICAgaWQ9Imhpc3RvZ3JhbU1vZGVTZWxlY3RvciIKICAgICAgICAgICAgICBuYW1lPSJIaXN0b2dyYW0gbW9kZSIKICAgICAgICAgICAgICBzZWxlY3RlZC1pZD0ie3tfaGlzdG9ncmFtTW9kZX19IgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ib3ZlcmxheSI+b3ZlcmxheTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9Im9mZnNldCI+b2Zmc2V0PC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yCiAgICAgICAgICAgICAgaWQ9InRpbWVQcm9wZXJ0eVNlbGVjdG9yIgogICAgICAgICAgICAgIG5hbWU9Ik9mZnNldCB0aW1lIGF4aXMiCiAgICAgICAgICAgICAgc2VsZWN0ZWQtaWQ9Int7X3RpbWVQcm9wZXJ0eX19IgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9IndhbGxfdGltZSI+d2FsbDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBydW5zLXNlbGVjdG9yIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBoaXN0b2dyYW0gZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIFlvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgaGlzdG9ncmFtIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy4KICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIgogICAgICAgICAgICAgICAgPlJFQURNRTwvYQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCIKICAgICAgICAgICAgICAgID5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYQogICAgICAgICAgICAgID4uCiAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciCiAgICAgICAgICAgICAgICA+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3CiAgICAgICAgICAgICAgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIKICAgICAgICAgICAgICBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1oaXN0b2dyYW0tbG9hZGVyCiAgICAgICAgICAgICAgICAgIHJ1bj0iW1tpdGVtLnJ1bl1dIgogICAgICAgICAgICAgICAgICB0YWc9IltbaXRlbS50YWddXSIKICAgICAgICAgICAgICAgICAgYWN0aXZlPSJbW2FjdGl2ZV1dIgogICAgICAgICAgICAgICAgICB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVuLCBpdGVtLnRhZyldXSIKICAgICAgICAgICAgICAgICAgdGltZS1wcm9wZXJ0eT0iW1tfdGltZVByb3BlcnR5XV0iCiAgICAgICAgICAgICAgICAgIGhpc3RvZ3JhbS1tb2RlPSJbW19oaXN0b2dyYW1Nb2RlXV0iCiAgICAgICAgICAgICAgICAgIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgICAgICAgICAgID48L3RmLWhpc3RvZ3JhbS1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGJZdC5wcm90b3R5cGUsInJlbG9hZE9uUmVhZHkiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sYll0LnByb3RvdHlwZSwiX2hpc3RvZ3JhbU1vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sYll0LnByb3RvdHlwZSwiX3RpbWVQcm9wZXJ0eSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sYll0LnByb3RvdHlwZSwiX3NlbGVjdGVkUnVucyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxiWXQucHJvdG90eXBlLCJfcnVuVG9UYWciLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sYll0LnByb3RvdHlwZSwiX3J1blRvVGFnSW5mbyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGJZdC5wcm90b3R5cGUsIl9kYXRhTm90Rm91bmQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sYll0LnByb3RvdHlwZSwiX3RhZ0ZpbHRlciIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGJZdC5wcm90b3R5cGUsIl9yZXN0YW1wIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sYll0LnByb3RvdHlwZSwiX2NhdGVnb3JpZXNEb21SZWFkeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixkcildLGJZdC5wcm90b3R5cGUsIl9yZXF1ZXN0TWFuYWdlciIsdm9pZCAwKSx0KFtzKCJfcnVuVG9UYWciLCJfc2VsZWN0ZWRSdW5zIiwiX3RhZ0ZpbHRlciIsIl9jYXRlZ29yaWVzRG9tUmVhZHkiKSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLGJZdC5wcm90b3R5cGUsIl9jYXRlZ29yaWVzIixudWxsKSxiWXQ9dChbaSgidGYtaGlzdG9ncmFtLWRhc2hib2FyZCIpXSxiWXQpO3ZhciBYWXQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsaHBhcmFtTmFtZTp4WXQsbWV0cmljTmFtZTp3WXQsc2NoZW1hQ29sdW1uTmFtZTpTWXQsbnVtSFBhcmFtczpNWXQsbnVtTWV0cmljczpFWXQsbnVtQ29sdW1uczpUWXQsaHBhcmFtVmFsdWVCeU5hbWU6Q1l0LG1ldHJpY1ZhbHVlQnlOYW1lOkFZdCxocGFyYW1WYWx1ZUJ5SW5kZXg6a1l0LG1ldHJpY1ZhbHVlQnlJbmRleDpMWXQsY29sdW1uVmFsdWVCeUluZGV4OlBZdCxudW1lcmljQ29sdW1uRXh0ZW50Ok5ZdCxnZXRBYnNvbHV0ZUNvbHVtbkluZGV4OklZdCxzY2hlbWFWaXNpYmxlQ29sdW1uTmFtZTpmdW5jdGlvbiAkWXQodCxlKXtyZXR1cm4gZTx0LmhwYXJhbUluZm9zLmxlbmd0aD94WXQodC5ocGFyYW1JbmZvc1tlXSk6d1l0KHQubWV0cmljSW5mb3NbZS10LmhwYXJhbUluZm9zLmxlbmd0aF0pfSxudW1WaXNpYmxlSFBhcmFtczpSWXQsbnVtVmlzaWJsZU1ldHJpY3M6T1l0LG51bVZpc2libGVDb2x1bW5zOmZ1bmN0aW9uIEtZdCh0KXtyZXR1cm4gUll0KHQpK09ZdCh0KX0sdmlzaWJsZU51bWVyaWNDb2x1bW5FeHRlbnQ6ell0LHByZXR0eVByaW50SFBhcmFtVmFsdWVCeU5hbWU6ZnVuY3Rpb24gWll0KHQsZSl7cmV0dXJuIFZZdChDWXQodCxlKSl9LHByZXR0eVByaW50TWV0cmljVmFsdWVCeU5hbWU6ZnVuY3Rpb24gSll0KHQsZSl7cmV0dXJuIFZZdChBWXQodCxlKSl9LHNlc3Npb25Hcm91cFdpdGhOYW1lOkRZdCxocGFyYW1WYWx1ZUJ5VmlzaWJsZUluZGV4OkJZdCxtZXRyaWNWYWx1ZUJ5VmlzaWJsZUluZGV4OkhZdCxjb2x1bW5WYWx1ZUJ5VmlzaWJsZUluZGV4OkZZdCxwcmV0dHlQcmludDpWWXQsbDJOb3JtU3F1YXJlZDpVWXQsZXVjbGlkZWFuRGlzdDpqWXQscG9pbnRUb1JlY3RhbmdsZURpc3Q6R1l0LHRyYW5zbGF0ZVN0cjpXWXQscm90YXRlU3RyOmZ1bmN0aW9uIFFZdCh0LGUsbil7bGV0IGk9InJvdGF0ZSgiK3Q7cmV0dXJuIHZvaWQgMCE9PWUmJnZvaWQgMCE9PW4mJihpPWkrIiwiK2UrIiwiK24pLGkrPSIpIixpfSxpc051bGxPclVuZGVmaW5lZDpmdW5jdGlvbiB0WHQodCl7cmV0dXJuIG51bGw9PXR9LHF1YWRUcmVlVmlzaXRQb2ludHNJblJlY3Q6ZnVuY3Rpb24gZVh0KHQsZSxuLGkscixvKXt0LnZpc2l0KCgoYSxzLGwsYyx1KT0+e2lmKHZvaWQgMD09PWEubGVuZ3RoKXtkb3tjb25zdCBzPXQueCgpKGEuZGF0YSksbD10LnkoKShhLmRhdGEpO2U8PXMmJnM8aSYmbjw9bCYmbDxyJiZvKGEuZGF0YSl9d2hpbGUoYT1hLm5leHQpO3JldHVybiEwfXJldHVybiBzPj1pfHxjPD1lfHxsPj1yfHx1PD1ufSkpfSxxdWFkVHJlZVZpc2l0UG9pbnRzSW5EaXNrOmZ1bmN0aW9uIG5YdCh0LGUsbixpLHIpe3QudmlzaXQoKChvLGEscyxsLGMpPT57aWYodm9pZCAwPT09by5sZW5ndGgpe2Rve2NvbnN0IGE9dC54KCkoby5kYXRhKSxzPXQueSgpKG8uZGF0YSksbD1qWXQoZSxuLGEscyk7bDw9aSYmcihvLmRhdGEsbCl9d2hpbGUobz1vLm5leHQpO3JldHVybiEwfXJldHVybiBHWXQoZSxuLGEscyxsLGMpPml9KSl9LGZpbHRlclNldDpmdW5jdGlvbiBpWHQodCxlKXtjb25zdCBuPW5ldyBTZXQ7cmV0dXJuIHQuZm9yRWFjaCgodD0+e2UodCkmJm4uYWRkKHQpfSkpLG59LHNldEFycmF5T2JzZXJ2YWJseTpxWXQsaGFzaE9mU3RyaW5nOllZdH0pO2xldCByWHQ9Y2xhc3MgZXh0ZW5kcyB5ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5vcmllbnRhdGlvbj0iaG9yaXpvbnRhbCJ9fTtyWHQudGVtcGxhdGU9X2VgCiAgICA8c2xvdCBuYW1lPSJjb250ZW50Ij48L3Nsb3Q+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0IHNsb3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICA6aG9zdCA6OnNsb3R0ZWQoKikgewogICAgICAgIGZsZXg6IDAgMCBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgc2xvdCB7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbb3JpZW50YXRpb249J3ZlcnRpY2FsJ10pIHNsb3QgewogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgOmhvc3QgOjpzbG90dGVkKCo6bm90KDpsYXN0LWNoaWxkKSkgewogICAgICAgIGJvcmRlcjogMCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCAjY2NjKTsKICAgICAgfQoKICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSd2ZXJ0aWNhbCddKSA6OnNsb3R0ZWQoKjpub3QoOmxhc3QtY2hpbGQpKSB7CiAgICAgICAgYm9yZGVyLWJvdHRvbS13aWR0aDogNXB4OwogICAgICB9CgogICAgICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgOjpzbG90dGVkKCo6bm90KDpsYXN0LWNoaWxkKSkgewogICAgICAgIGJvcmRlci1yaWdodC13aWR0aDogNXB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpTdHJpbmcscmVmbGVjdFRvQXR0cmlidXRlOiEwfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHJYdC5wcm90b3R5cGUsIm9yaWVudGF0aW9uIix2b2lkIDApLHJYdD10KFtpKCJocGFyYW1zLXNwbGl0LWxheW91dCIpXSxyWHQpO2xldCBvWHQ9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvbmZpZ3VyYXRpb249e3NjaGVtYTp7aHBhcmFtQ29sdW1uczpbXSxtZXRyaWNDb2x1bW5zOltdfSxjb2x1bW5zVmlzaWJpbGl0eTpbXSx2aXNpYmxlU2NoZW1hOntocGFyYW1JbmZvczpbXSxtZXRyaWNJbmZvczpbXX19LHRoaXMuc2Vzc2lvbkdyb3Vwcz1bXSx0aGlzLmRhdGFMb2FkZWRXaXRoTm9uRW1wdHlIcGFyYW1zPSExLHRoaXMuZGF0YUxvYWRlZFdpdGhFbXB0eUhwYXJhbXM9ITEsdGhpcy5fc3RhdHVzZXM9W3t2YWx1ZToiU1RBVFVTX1VOS05PV04iLGRpc3BsYXlOYW1lOiJVbmtub3duIixhbGxvd2VkOiEwfSx7dmFsdWU6IlNUQVRVU19TVUNDRVNTIixkaXNwbGF5TmFtZToiU3VjY2VzcyIsYWxsb3dlZDohMH0se3ZhbHVlOiJTVEFUVVNfRkFJTFVSRSIsZGlzcGxheU5hbWU6IkZhaWx1cmUiLGFsbG93ZWQ6ITB9LHt2YWx1ZToiU1RBVFVTX1JVTk5JTkciLGRpc3BsYXlOYW1lOiJSdW5uaW5nIixhbGxvd2VkOiEwfV0sdGhpcy5fZ2V0RXhwZXJpbWVudFJlc29sdmVkPW5ldyBQcm9taXNlKCh0PT57dGhpcy5fcmVzb2x2ZUdldEV4cGVyaW1lbnQ9dH0pKSx0aGlzLl9saXN0U2Vzc2lvbkdyb3Vwc0NhbmNlbGxlcj1uZXcgWFIsdGhpcy5fcGFnZVNpemVJbnB1dD17dmFsdWU6IjEwMCIsaW52YWxpZDohMX0sdGhpcy5fcGFnZU51bWJlcklucHV0PXt2YWx1ZToiMSIsaW52YWxpZDohMX0sdGhpcy5fcGFnZUNvdW50U3RyPSI/Iix0aGlzLl9ocGFyYW1OYW1lPXhZdCx0aGlzLl9tZXRyaWNOYW1lPXdZdCx0aGlzLl9wcmV0dHlQcmludD1WWXR9cmVsb2FkKCl7dGhpcy5fcXVlcnlTZXJ2ZXIoKX1fY3N2VXJsKHQsZSl7cmV0dXJuIHRoaXMuX2Rvd25sb2FkRGF0YVVybCh0LGUsImNzdiIpfV9qc29uVXJsKHQsZSl7cmV0dXJuIHRoaXMuX2Rvd25sb2FkRGF0YVVybCh0LGUsImpzb24iKX1fbGF0ZXhVcmwodCxlKXtyZXR1cm4gdGhpcy5fZG93bmxvYWREYXRhVXJsKHQsZSwibGF0ZXgiKX1fZG93bmxvYWREYXRhVXJsKHQsZSxuKXtyZXR1cm4gdGhpcy5iYWNrZW5kLmdldERvd25sb2FkVXJsKG4sdCxlLmNvbHVtbnNWaXNpYmlsaXR5KX1fY29tcHV0ZUV4cGVyaW1lbnRBbmRSZWxhdGVkUHJvcHMoKXtjb25zdCB0PVhZdDt0LmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuYmFja2VuZCl8fHQuaXNOdWxsT3JVbmRlZmluZWQodGhpcy5leHBlcmltZW50TmFtZSl8fHRoaXMuYmFja2VuZC5nZXRFeHBlcmltZW50KHtleHBlcmltZW50TmFtZTp0aGlzLmV4cGVyaW1lbnROYW1lfSkudGhlbigodD0+e1NlLmV4cG9ydHMuaXNFcXVhbCh0LHRoaXMuX2V4cGVyaW1lbnQpfHwodGhpcy5zZXQoIl9leHBlcmltZW50Iix0KSx0aGlzLl9jb21wdXRlSFBhcmFtcygpLHRoaXMuX2NvbXB1dGVNZXRyaWNzKCksdGhpcy5fcXVlcnlTZXJ2ZXIoKSx0aGlzLl9yZXNvbHZlR2V0RXhwZXJpbWVudCgpKX0pKS5maW5hbGx5KCgoKT0+e3RoaXMuX2NvbXB1dGVEYXRhRm91bmQoKX0pKX1fY29tcHV0ZURhdGFGb3VuZCgpe2NvbnN0IHQ9Qm9vbGVhbih0aGlzLl9leHBlcmltZW50JiZ0aGlzLl9leHBlcmltZW50LmhwYXJhbUluZm9zJiZ0aGlzLl9leHBlcmltZW50LmhwYXJhbUluZm9zLmxlbmd0aD4wJiZ0aGlzLl9leHBlcmltZW50Lm1ldHJpY0luZm9zJiZ0aGlzLl9leHBlcmltZW50Lm1ldHJpY0luZm9zLmxlbmd0aD4wKTt0aGlzLnNldCgiZGF0YUxvYWRlZFdpdGhOb25FbXB0eUhwYXJhbXMiLHQpLHRoaXMuc2V0KCJkYXRhTG9hZGVkV2l0aEVtcHR5SHBhcmFtcyIsIXQpfV9jb21wdXRlSFBhcmFtcygpe2NvbnN0IHQ9W107dGhpcy5fZXhwZXJpbWVudC5ocGFyYW1JbmZvcy5mb3JFYWNoKCgoZSxuKT0+e2NvbnN0IGk9e2luZm86ZSxkaXNwbGF5ZWQ6bjw1LGZpbHRlcjp7fX07aS5pbmZvLmhhc093blByb3BlcnR5KCJkb21haW5EaXNjcmV0ZSIpPyhpLmZpbHRlci5kb21haW5EaXNjcmV0ZT1bXSxpLmluZm8uZG9tYWluRGlzY3JldGUuZm9yRWFjaCgodD0+e2kuZmlsdGVyLmRvbWFpbkRpc2NyZXRlLnB1c2goe3ZhbHVlOnQsY2hlY2tlZDohMH0pfSkpKToiREFUQV9UWVBFX0JPT0wiPT09aS5pbmZvLnR5cGU/aS5maWx0ZXIuZG9tYWluRGlzY3JldGU9W3t2YWx1ZTohMSxjaGVja2VkOiEwfSx7dmFsdWU6ITAsY2hlY2tlZDohMH1dOiJEQVRBX1RZUEVfRkxPQVQ2NCI9PT1pLmluZm8udHlwZT9pLmZpbHRlci5pbnRlcnZhbD17bWluOnt2YWx1ZToiIixpbnZhbGlkOiExfSxtYXg6e3ZhbHVlOiIiLGludmFsaWQ6ITF9fToiREFUQV9UWVBFX1NUUklORyI9PT1pLmluZm8udHlwZT9pLmZpbHRlci5yZWdleHA9IiI6Y29uc29sZS53YXJuKCJ1bmtub3duIGhwYXJhbS5pbmZvLnR5cGU6ICVzIixpLmluZm8udHlwZSksdC5wdXNoKGkpfSkpLHRoaXMuc2V0KCJfaHBhcmFtcyIsdCl9X2NvbXB1dGVNZXRyaWNzKCl7Y29uc3QgdD1bXTt0aGlzLl9leHBlcmltZW50Lm1ldHJpY0luZm9zLmZvckVhY2goKChlLG4pPT57dC5wdXNoKHtpbmZvOmUsZmlsdGVyOntpbnRlcnZhbDp7bWluOnt2YWx1ZToiIixpbnZhbGlkOiExfSxtYXg6e3ZhbHVlOiIiLGludmFsaWQ6ITF9fX0sZGlzcGxheWVkOm48NX0pfSkpLHRoaXMuc2V0KCJfbWV0cmljcyIsdCl9X2NvbXB1dGVTY2hlbWEoKXtyZXR1cm4gdGhpcy5faHBhcmFtcyYmdGhpcy5fbWV0cmljcz97aHBhcmFtQ29sdW1uczp0aGlzLl9ocGFyYW1zLm1hcCgodD0+KHtocGFyYW1JbmZvOnQuaW5mb30pKSksbWV0cmljQ29sdW1uczp0aGlzLl9tZXRyaWNzLm1hcCgodD0+KHttZXRyaWNJbmZvOnQuaW5mb30pKSl9OntocGFyYW1Db2x1bW5zOltdLG1ldHJpY0NvbHVtbnM6W119fV91cGRhdGVDb25maWd1cmF0aW9uKCl7dGhpcy5kZWJvdW5jZSgiX3VwZGF0ZUNvbmZpZ3VyYXRpb24iLCgoKT0+e3RoaXMuY29uZmlndXJhdGlvbj17c2NoZW1hOnRoaXMuX2NvbXB1dGVTY2hlbWEoKSxjb2x1bW5zVmlzaWJpbGl0eTp0aGlzLl9jb21wdXRlQ29sdW1uc1Zpc2liaWxpdHkoKSx2aXNpYmxlU2NoZW1hOnRoaXMuX2NvbXB1dGVWaXNpYmxlU2NoZW1hKCl9fSkpfV9jb21wdXRlQ29sdW1uc1Zpc2liaWxpdHkoKXtyZXR1cm4gdGhpcy5faHBhcmFtcyYmdGhpcy5fbWV0cmljcz90aGlzLl9ocGFyYW1zLm1hcCgodD0+dC5kaXNwbGF5ZWQpKS5jb25jYXQodGhpcy5fbWV0cmljcy5tYXAoKHQ9PnQuZGlzcGxheWVkKSkpOltdfV9jb21wdXRlVmlzaWJsZVNjaGVtYSgpe3JldHVybiB0aGlzLl9ocGFyYW1zJiZ0aGlzLl9tZXRyaWNzP3tocGFyYW1JbmZvczp0aGlzLl9ocGFyYW1zLmZpbHRlcigodD0+dC5kaXNwbGF5ZWQpKS5tYXAoKHQ9PnQuaW5mbykpLG1ldHJpY0luZm9zOnRoaXMuX21ldHJpY3MuZmlsdGVyKCh0PT50LmRpc3BsYXllZCkpLm1hcCgodD0+dC5pbmZvKSl9OntocGFyYW1JbmZvczpbXSxtZXRyaWNJbmZvczpbXX19X3F1ZXJ5U2VydmVyKCl7dGhpcy5kZWJvdW5jZSgicXVlcnlTZXJ2ZXIiLCgoKT0+dGhpcy5fcXVlcnlTZXJ2ZXJOb0RlYm91bmNlKCkpLDEwMCl9X3F1ZXJ5U2VydmVyTm9EZWJvdW5jZSgpe2lmKHRoaXMuX2hwYXJhbXMmJnRoaXMuX21ldHJpY3MpcmV0dXJuIHRoaXMuX3NlbmRMaXN0U2Vzc2lvbkdyb3Vwc1JlcXVlc3QoKS50aGVuKHRoaXMuX2xpc3RTZXNzaW9uR3JvdXBzQ2FuY2VsbGVyLmNhbmNlbGxhYmxlKCgoe3ZhbHVlOnQsY2FuY2VsbGVkOmV9KT0+e2V8fCh0LnRvdGFsU2l6ZT49MD8odGhpcy5zZXQoIl9wYWdlQ291bnRTdHIiLFN0cmluZyhNYXRoLmNlaWwodC50b3RhbFNpemUvK3RoaXMuX3BhZ2VTaXplSW5wdXQudmFsdWUpKSksdGhpcy5zZXQoIl90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0ciIsdC50b3RhbFNpemUpKToodGhpcy5zZXQoIl9wYWdlQ291bnRTdHIiLCI/IiksdGhpcy5zZXQoIl90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0ciIsIlVua25vd24iKSkscVl0KHRoaXMsInNlc3Npb25Hcm91cHMiLHQuc2Vzc2lvbkdyb3VwcykpfSkpKX1fc2VuZExpc3RTZXNzaW9uR3JvdXBzUmVxdWVzdCgpe2NvbnN0IHQ9dGhpcy5fYnVpbGRMaXN0U2Vzc2lvbkdyb3Vwc1JlcXVlc3QoKTtpZihudWxsIT09dClyZXR1cm4gdGhpcy5zZXQoIl9zZXNzaW9uR3JvdXBzUmVxdWVzdCIsdCksdGhpcy5fbGlzdFNlc3Npb25Hcm91cHNDYW5jZWxsZXIuY2FuY2VsQWxsKCksdGhpcy5iYWNrZW5kLmxpc3RTZXNzaW9uR3JvdXBzKHQpfV9idWlsZExpc3RTZXNzaW9uR3JvdXBzUmVxdWVzdCgpe2NvbnN0IHQ9dGhpcztsZXQgZT0hMDtmdW5jdGlvbiBuKG4pe2NvbnN0IGk9dC5nZXQobisiLm1pbi52YWx1ZSIpO2NvbnNvbGUuYXNzZXJ0KHZvaWQgMCE9PWkpO2NvbnN0IHI9IiI9PT1pPyItSW5maW5pdHkiOitpO3Quc2V0KG4rIi5taW4uaW52YWxpZCIsaXNOYU4ocikpLGU9ZSYmIWlzTmFOKHIpO2NvbnN0IG89dC5nZXQobisiLm1heC52YWx1ZSIpO2NvbnNvbGUuYXNzZXJ0KHZvaWQgMCE9PW8pO2NvbnN0IGE9IiI9PT1vPyJJbmZpbml0eSI6K287cmV0dXJuIHQuc2V0KG4rIi5tYXguaW52YWxpZCIsaXNOYU4oYSkpLGU9ZSYmIWlzTmFOKGEpLGlzTmFOKHIpfHxpc05hTihhKT9udWxsOnttaW5WYWx1ZTpyLG1heFZhbHVlOmF9fWZ1bmN0aW9uIGkobil7Y29uc3QgaT10LmdldChuKyIudmFsdWUiKTtjb25zb2xlLmFzc2VydCh2b2lkIDAhPT1pKTtjb25zdCByPStpLG89TnVtYmVyLmlzSW50ZWdlcihyKSYmcj4wO3JldHVybiB0LnNldChuKyIuaW52YWxpZCIsIW8pLGU9ZSYmbyxvP3I6bnVsbH1jb25zdCByPXRoaXMuX3N0YXR1c2VzLmZpbHRlcigodD0+dC5hbGxvd2VkKSkubWFwKCh0PT50LnZhbHVlKSk7bGV0IG89W107aWYodGhpcy5faHBhcmFtcy5mb3JFYWNoKCgodCxlKT0+e2xldCBpPXtocGFyYW06dC5pbmZvLm5hbWV9O2lmKHQuZmlsdGVyLmRvbWFpbkRpc2NyZXRlKWkuZmlsdGVyRGlzY3JldGU9W10sdC5maWx0ZXIuZG9tYWluRGlzY3JldGUuZm9yRWFjaCgodD0+e3QuY2hlY2tlZCYmaS5maWx0ZXJEaXNjcmV0ZS5wdXNoKHQudmFsdWUpfSkpO2Vsc2UgaWYodC5maWx0ZXIuaW50ZXJ2YWwpaS5maWx0ZXJJbnRlcnZhbD1uKCJfaHBhcmFtcy4iK2UrIi5maWx0ZXIuaW50ZXJ2YWwiKTtlbHNle2lmKCF0LmZpbHRlci5yZWdleHApcmV0dXJuIGNvbnNvbGUuZXJyb3IoImhwYXJhbS5maWx0ZXIgd2l0aCBubyBkb21haW5EaXNjcmV0ZSwgaW50ZXJ2YWwgb3IgcmVnZXhwIHByb3BlcnRpZXMgc2V0OiAlcyIsdCksbnVsbDtpLmZpbHRlclJlZ2V4cD10LmZpbHRlci5yZWdleHB9by5wdXNoKGkpfSkpLHRoaXMuX21ldHJpY3MuZm9yRWFjaCgoKHQsZSk9PntsZXQgaT17bWV0cmljOnQuaW5mby5uYW1lLGZpbHRlckludGVydmFsOm4oIl9tZXRyaWNzLiIrZSsiLmZpbHRlci5pbnRlcnZhbCIpfTtvLnB1c2goaSl9KSksdm9pZCAwIT09dGhpcy5fc29ydEJ5SW5kZXgmJnZvaWQgMCE9PXRoaXMuX3NvcnREaXJlY3Rpb24pe2lmKCEodGhpcy5fc29ydEJ5SW5kZXggaW4gbykpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIk5vIGNvbHVtbiBpbiBjb2xQYXJhbXMgd2l0aCBpbmRleCBzb3J0QnlJbmRleDogJXMiLHRoaXMuX3NvcnRCeUluZGV4KSxudWxsO29bdGhpcy5fc29ydEJ5SW5kZXhdLm9yZGVyPTA9PT10aGlzLl9zb3J0RGlyZWN0aW9uPyJPUkRFUl9BU0MiOiJPUkRFUl9ERVNDIn1jb25zdCBhPWkoIl9wYWdlTnVtYmVySW5wdXQiKSxzPWkoIl9wYWdlU2l6ZUlucHV0Iik7cmV0dXJuIGU/e2V4cGVyaW1lbnROYW1lOnRoaXMuZXhwZXJpbWVudE5hbWUsYWxsb3dlZFN0YXR1c2VzOnIsY29sUGFyYW1zOm8sc3RhcnRJbmRleDpzKihhLTEpLHNsaWNlU2l6ZTpzfTpudWxsfV9tZXRyaWNTb3J0QnlJbmRleCh0KXtyZXR1cm4gdCt0aGlzLl9ocGFyYW1zLmxlbmd0aH19O29YdC50ZW1wbGF0ZT1fZWAKICAgIDxocGFyYW1zLXNwbGl0LWxheW91dCBvcmllbnRhdGlvbj0idmVydGljYWwiPgogICAgICA8ZGl2IHNsb3Q9ImNvbnRlbnQiIGNsYXNzPSJzZWN0aW9uIGh5cGVycGFyYW1ldGVycyI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+SHlwZXJwYXJhbWV0ZXJzPC9kaXY+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tfaHBhcmFtc319IiBhcz0iaHBhcmFtIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhwYXJhbSI+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveAogICAgICAgICAgICAgIGNoZWNrZWQ9Int7aHBhcmFtLmRpc3BsYXllZH19IgogICAgICAgICAgICAgIGNsYXNzPSJocGFyYW0tY2hlY2tib3giCiAgICAgICAgICAgID4KICAgICAgICAgICAgICBbW19ocGFyYW1OYW1lKGhwYXJhbS5pbmZvKV1dCiAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgIDwhLS0gUHJlY2lzZWx5IG9uZSBvZiB0aGUgdGVtcGxhdGVzIGJlbG93IHdpbGwgYmUgc3RhbXBlZC4tLT4KICAgICAgICAgICAgPCEtLSAxLiBBIGxpc3Qgb2YgY2hlY2tib3hlcyAtLT4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hwYXJhbS5maWx0ZXIuZG9tYWluRGlzY3JldGVdXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlCiAgICAgICAgICAgICAgICBpcz0iZG9tLXJlcGVhdCIKICAgICAgICAgICAgICAgIGl0ZW1zPSJbW2hwYXJhbS5maWx0ZXIuZG9tYWluRGlzY3JldGVdXSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3gKICAgICAgICAgICAgICAgICAgY2hlY2tlZD0ie3tpdGVtLmNoZWNrZWR9fSIKICAgICAgICAgICAgICAgICAgY2xhc3M9ImRpc2NyZXRlLXZhbHVlLWNoZWNrYm94IgogICAgICAgICAgICAgICAgICBvbi1jaGFuZ2U9Il9xdWVyeVNlcnZlciIKICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgW1tfcHJldHR5UHJpbnQoaXRlbS52YWx1ZSldXQogICAgICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8IS0tIDIuIEEgbnVtZXJpYyBpbnRlcnZhbCAtLT4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWxdXSI+CiAgICAgICAgICAgICAgPHBhcGVyLWlucHV0CiAgICAgICAgICAgICAgICBsYWJlbD0iTWluIgogICAgICAgICAgICAgICAgdmFsdWU9Int7aHBhcmFtLmZpbHRlci5pbnRlcnZhbC5taW4udmFsdWV9fSIKICAgICAgICAgICAgICAgIGFsbG93ZWRfcGF0dGVybj0iWzAtOS5lXFwtXSIKICAgICAgICAgICAgICAgIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIKICAgICAgICAgICAgICAgIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiCiAgICAgICAgICAgICAgICBpbnZhbGlkPSJbW2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWwubWluLmludmFsaWRdXSIKICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSItaW5maW5pdHkiCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgPHBhcGVyLWlucHV0CiAgICAgICAgICAgICAgICBsYWJlbD0iTWF4IgogICAgICAgICAgICAgICAgdmFsdWU9Int7aHBhcmFtLmZpbHRlci5pbnRlcnZhbC5tYXgudmFsdWV9fSIKICAgICAgICAgICAgICAgIGFsbG93ZWRfcGF0dGVybj0iWzAtOS5lXFwtXSIKICAgICAgICAgICAgICAgIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIKICAgICAgICAgICAgICAgIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiCiAgICAgICAgICAgICAgICBpbnZhbGlkPSJbW2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWwubWF4LmludmFsaWRdXSIKICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSIraW5maW5pdHkiCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwhLS0gMy4gQSByZWdleHAgLS0+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tocGFyYW0uZmlsdGVyLnJlZ2V4cF1dIj4KICAgICAgICAgICAgICA8cGFwZXItaW5wdXQKICAgICAgICAgICAgICAgIGxhYmVsPSJSZWd1bGFyIGV4cHJlc3Npb24iCiAgICAgICAgICAgICAgICB2YWx1ZT0ie3tocGFyYW0uZmlsdGVyLnJlZ2V4cH19IgogICAgICAgICAgICAgICAgb24tdmFsdWUtY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc2xvdD0iY29udGVudCIgY2xhc3M9InNlY3Rpb24gbWV0cmljcyI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+TWV0cmljczwvZGl2PgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7X21ldHJpY3N9fSIgYXM9Im1ldHJpYyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXRyaWMiPgogICAgICAgICAgICA8IS0tIFRPRE8oZXJleik6IE1ha2UgaXQgZWFzaWVyIHRvIGhhbmRsZSBhIGxhcmdlIG51bWJlciBvZgogICAgICAgICAgICAgICAgICBtZXRyaWNzOgogICAgICAgICAgICAgICAgICAxLiBBZGQgYW4gJ2lzb2xhdG9yJyByYWRpby1idXR0b24gdG8gc2VsZWN0IGp1c3Qgb25lCiAgICAgICAgICAgICAgICAgIG1ldHJpYyBhbmQKICAgICAgICAgICAgICAgICAgaGlkZSBhbGwgdGhlIHJlc3QKICAgICAgICAgICAgICAgICAgMi4gQWRkIGEgJ3RvZ2dsZS1hbGwnIGJ1dHRvbiB0aGF0IHdpbGwgaGlkZS91bmhpZGUKICAgICAgICAgICAgICAgICAgICBhbGwgdGhlCiAgICAgICAgICAgICAgICAgIG1ldHJpY3MuCiAgICAgICAgICAgICAgICAgIFVzZSBzaW1pbGFyIGxvZ2ljL2FwcGVhcmFuY2UgdG8gdGhlIHJ1bi1zZWxlY3RvciBvZgogICAgICAgICAgICAgICAgICBzY2FsYXJzLi0tPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3gKICAgICAgICAgICAgICBjaGVja2VkPSJ7e21ldHJpYy5kaXNwbGF5ZWR9fSIKICAgICAgICAgICAgICBjbGFzcz0ibWV0cmljLWNoZWNrYm94IgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgW1tfbWV0cmljTmFtZShtZXRyaWMuaW5mbyldXQogICAgICAgICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmxpbmUtZWxlbWVudCI+CiAgICAgICAgICAgICAgPHBhcGVyLWlucHV0CiAgICAgICAgICAgICAgICBsYWJlbD0iTWluIgogICAgICAgICAgICAgICAgdmFsdWU9Int7bWV0cmljLmZpbHRlci5pbnRlcnZhbC5taW4udmFsdWV9fSIKICAgICAgICAgICAgICAgIGFsbG93ZWQtcGF0dGVybj0iWzAtOS5lXFwtXSIKICAgICAgICAgICAgICAgIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIKICAgICAgICAgICAgICAgIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiCiAgICAgICAgICAgICAgICBpbnZhbGlkPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWluLmludmFsaWR9fSIKICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSItaW5maW5pdHkiCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmxpbmUtZWxlbWVudCI+CiAgICAgICAgICAgICAgPHBhcGVyLWlucHV0CiAgICAgICAgICAgICAgICBsYWJlbD0iTWF4IgogICAgICAgICAgICAgICAgYWxsb3dlZC1wYXR0ZXJuPSJbMC05LmVcXC1dIgogICAgICAgICAgICAgICAgdmFsdWU9Int7bWV0cmljLmZpbHRlci5pbnRlcnZhbC5tYXgudmFsdWV9fSIKICAgICAgICAgICAgICAgIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIKICAgICAgICAgICAgICAgIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiCiAgICAgICAgICAgICAgICBpbnZhbGlkPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWF4LmludmFsaWR9fSIKICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSIraW5maW5pdHkiCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc2xvdD0iY29udGVudCIgY2xhc3M9InNlY3Rpb24gc3RhdHVzIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5TdGF0dXM8L2Rpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zdGF0dXNlc11dIiBhcz0ic3RhdHVzIj4KICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e3N0YXR1cy5hbGxvd2VkfX0iIG9uLWNoYW5nZT0iX3F1ZXJ5U2VydmVyIj4KICAgICAgICAgICAgW1tzdGF0dXMuZGlzcGxheU5hbWVdXQogICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjb250ZW50IiBjbGFzcz0ic2VjdGlvbiBzb3J0aW5nIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5Tb3J0aW5nPC9kaXY+CiAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUKICAgICAgICAgIGxhYmVsPSJTb3J0IGJ5IgogICAgICAgICAgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiCiAgICAgICAgICBob3Jpem9udGFsLWFsaWduPSJsZWZ0IgogICAgICAgID4KICAgICAgICAgIDxwYXBlci1saXN0Ym94CiAgICAgICAgICAgIGNsYXNzPSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgICBzbG90PSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgICBzZWxlY3RlZD0ie3tfc29ydEJ5SW5kZXh9fSIKICAgICAgICAgICAgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiCiAgICAgICAgICA+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2hwYXJhbXNdXSIgYXM9ImhwYXJhbSI+CiAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+IFtbX2hwYXJhbU5hbWUoaHBhcmFtLmluZm8pXV0gPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19tZXRyaWNzXV0iIGFzPSJtZXRyaWMiPgogICAgICAgICAgICAgIDxwYXBlci1pdGVtPiBbW19tZXRyaWNOYW1lKG1ldHJpYy5pbmZvKV1dIDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUKICAgICAgICAgIGxhYmVsPSJEaXJlY3Rpb24iCiAgICAgICAgICBvbi1zZWxlY3RlZC1pdGVtLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIKICAgICAgICAgIGhvcml6b250YWwtYWxpZ249ImxlZnQiCiAgICAgICAgPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3gKICAgICAgICAgICAgY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiCiAgICAgICAgICAgIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiCiAgICAgICAgICAgIHNlbGVjdGVkPSJ7e19zb3J0RGlyZWN0aW9ufX0iCiAgICAgICAgICA+CiAgICAgICAgICAgIDxwYXBlci1pdGVtPkFzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0+RGVzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IHNsb3Q9ImNvbnRlbnQiIGNsYXNzPSJzZWN0aW9uIHBhZ2luZyI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+UGFnaW5nPC9kaXY+CiAgICAgICAgPGRpdj4KICAgICAgICAgIE51bWJlciBvZiBtYXRjaGluZyBzZXNzaW9uIGdyb3VwczogW1tfdG90YWxTZXNzaW9uR3JvdXBzQ291bnRTdHJdXQogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50IHBhZ2UtbnVtYmVyLWlucHV0Ij4KICAgICAgICAgIDxwYXBlci1pbnB1dAogICAgICAgICAgICBsYWJlbD0iUGFnZSAjIgogICAgICAgICAgICB2YWx1ZT0ie3tfcGFnZU51bWJlcklucHV0LnZhbHVlfX0iCiAgICAgICAgICAgIGFsbG93ZWQtcGF0dGVybj0iWzAtOV0iCiAgICAgICAgICAgIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiCiAgICAgICAgICAgIGludmFsaWQ9IltbX3BhZ2VOdW1iZXJJbnB1dC5pbnZhbGlkXV0iCiAgICAgICAgICAgIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIKICAgICAgICAgID4KICAgICAgICAgICAgPGRpdiBzbG90PSJzdWZmaXgiIGNsYXNzPSJwYWdlLXN1ZmZpeCI+LyBbW19wYWdlQ291bnRTdHJdXTwvZGl2PgogICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJpbmxpbmUtZWxlbWVudCBwYWdlLXNpemUtaW5wdXQiPgogICAgICAgICAgPHBhcGVyLWlucHV0CiAgICAgICAgICAgIGxhYmVsPSJNYXggIyBvZiBzZXNzaW9uIGdyb3VwcyBwZXIgcGFnZToiCiAgICAgICAgICAgIHZhbHVlPSJ7e19wYWdlU2l6ZUlucHV0LnZhbHVlfX0iCiAgICAgICAgICAgIGFsbG93ZWQtcGF0dGVybj0iWzAtOV0iCiAgICAgICAgICAgIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiCiAgICAgICAgICAgIGludmFsaWQ9IltbX3BhZ2VTaXplSW5wdXQuaW52YWxpZF1dIgogICAgICAgICAgICBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiCiAgICAgICAgICA+CiAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjb250ZW50IiBjbGFzcz0ic2VjdGlvbiBkb3dubG9hZCI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXNzaW9uR3JvdXBzUmVxdWVzdF1dIj4KICAgICAgICAgIERvd25sb2FkIGRhdGEgYXMKICAgICAgICAgIDxzcGFuPgogICAgICAgICAgICA8YQogICAgICAgICAgICAgIGlkPSJjc3ZMaW5rIgogICAgICAgICAgICAgIGRvd25sb2FkPSJocGFyYW1zX3RhYmxlLmNzdiIKICAgICAgICAgICAgICBocmVmPSJbW19jc3ZVcmwoX3Nlc3Npb25Hcm91cHNSZXF1ZXN0LCBjb25maWd1cmF0aW9uKV1dIgogICAgICAgICAgICAgID5DU1Y8L2EKICAgICAgICAgICAgPgogICAgICAgICAgICA8YQogICAgICAgICAgICAgIGlkPSJqc29uTGluayIKICAgICAgICAgICAgICBkb3dubG9hZD0iaHBhcmFtc190YWJsZS5qc29uIgogICAgICAgICAgICAgIGhyZWY9IltbX2pzb25VcmwoX3Nlc3Npb25Hcm91cHNSZXF1ZXN0LCBjb25maWd1cmF0aW9uKV1dIgogICAgICAgICAgICAgID5KU09OPC9hCiAgICAgICAgICAgID4KICAgICAgICAgICAgPGEKICAgICAgICAgICAgICBpZD0ibGF0ZXhMaW5rIgogICAgICAgICAgICAgIGRvd25sb2FkPSJocGFyYW1zX3RhYmxlLnRleCIKICAgICAgICAgICAgICBocmVmPSJbW19sYXRleFVybChfc2Vzc2lvbkdyb3Vwc1JlcXVlc3QsIGNvbmZpZ3VyYXRpb24pXV0iCiAgICAgICAgICAgICAgPkxhVGVYPC9hCiAgICAgICAgICAgID4KICAgICAgICAgIDwvc3Bhbj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvaHBhcmFtcy1zcGxpdC1sYXlvdXQ+CiAgICA8c3R5bGU+CiAgICAgIC5zZWN0aW9uIHsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICB9CiAgICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBtYXJnaW4tYm90dG9tOiA3cHg7CiAgICAgIH0KICAgICAgLmRpc2NyZXRlLXZhbHVlLWNoZWNrYm94LAogICAgICAubWV0cmljLWNoZWNrYm94LAogICAgICAuaHBhcmFtLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAuZGlzY3JldGUtdmFsdWUtY2hlY2tib3ggewogICAgICAgIG1hcmdpbi1sZWZ0OiAyMHB4OwogICAgICB9CiAgICAgIC5ocGFyYW0sCiAgICAgIC5tZXRyaWMgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5pbmxpbmUtZWxlbWVudCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiA0MCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgICAgLnBhZ2UtbnVtYmVyLWlucHV0IHsKICAgICAgICB3aWR0aDogMjAlOwogICAgICB9CiAgICAgIC5wYWdlLXNpemUtaW5wdXQgewogICAgICAgIHdpZHRoOiA2MCU7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIHBhcGVyLWxpc3Rib3ggewogICAgICAgIG1heC1oZWlnaHQ6IDE1ZW07CiAgICAgIH0KICAgICAgLnBhZ2Utc3VmZml4IHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sb1h0LnByb3RvdHlwZSwiZXhwZXJpbWVudE5hbWUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLG9YdC5wcm90b3R5cGUsImNvbmZpZ3VyYXRpb24iLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheSxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sb1h0LnByb3RvdHlwZSwic2Vzc2lvbkdyb3VwcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxvWHQucHJvdG90eXBlLCJkYXRhTG9hZGVkV2l0aE5vbkVtcHR5SHBhcmFtcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxvWHQucHJvdG90eXBlLCJkYXRhTG9hZGVkV2l0aEVtcHR5SHBhcmFtcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxvWHQucHJvdG90eXBlLCJfZXhwZXJpbWVudCIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sb1h0LnByb3RvdHlwZSwiX2hwYXJhbXMiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLG9YdC5wcm90b3R5cGUsIl9tZXRyaWNzIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sb1h0LnByb3RvdHlwZSwiX3N0YXR1c2VzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLG9YdC5wcm90b3R5cGUsIl9nZXRFeHBlcmltZW50UmVzb2x2ZWQiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pXSxvWHQucHJvdG90eXBlLCJfcmVzb2x2ZUdldEV4cGVyaW1lbnQiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sb1h0LnByb3RvdHlwZSwiX2xpc3RTZXNzaW9uR3JvdXBzQ2FuY2VsbGVyIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLG9YdC5wcm90b3R5cGUsIl9zb3J0QnlJbmRleCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxvWHQucHJvdG90eXBlLCJfc29ydERpcmVjdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxvWHQucHJvdG90eXBlLCJfcGFnZVNpemVJbnB1dCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxvWHQucHJvdG90eXBlLCJfcGFnZU51bWJlcklucHV0Iix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLG9YdC5wcm90b3R5cGUsIl9wYWdlQ291bnRTdHIiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sb1h0LnByb3RvdHlwZSwiX3RvdGFsU2Vzc2lvbkdyb3Vwc0NvdW50U3RyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLG9YdC5wcm90b3R5cGUsIl9zZXNzaW9uR3JvdXBzUmVxdWVzdCIsdm9pZCAwKSx0KFthKCJiYWNrZW5kIiwiZXhwZXJpbWVudE5hbWUiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLG9YdC5wcm90b3R5cGUsIl9jb21wdXRlRXhwZXJpbWVudEFuZFJlbGF0ZWRQcm9wcyIsbnVsbCksdChbYSgiX2hwYXJhbXMuKiIsIl9tZXRyaWNzLioiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLG9YdC5wcm90b3R5cGUsIl91cGRhdGVDb25maWd1cmF0aW9uIixudWxsKSxvWHQ9dChbaSgidGYtaHBhcmFtcy1xdWVyeS1wYW5lIildLG9YdCk7bGV0IGFYdD1jbGFzcyBleHRlbmRzIHlle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLm9wdGlvbnM9bnVsbH1fY29uZmlndXJhdGlvbkNoYW5nZWQoKXtjb25zdCB0PXRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLGU9dGhpcy5jb25maWd1cmF0aW9uLnNjaGVtYSxuPXtjb2x1bW5zOnQuaHBhcmFtSW5mb3MubWFwKCgobixpKT0+KHtuYW1lOnhZdChuKSxpbmRleDppLGFic29sdXRlSW5kZXg6SVl0KGUsdCxpKSxzY2FsZTp0aGlzLl9pc051bWVyaWNDb2x1bW4oaSk/IkxJTkVBUiI6Ik5PTl9OVU1FUklDIn0pKSkuY29uY2F0KHQubWV0cmljSW5mb3MubWFwKCgobixpKT0+e2NvbnN0IHI9aSt0LmhwYXJhbUluZm9zLmxlbmd0aDtyZXR1cm57c2NhbGU6IkxJTkVBUiIsbmFtZTp3WXQobiksaW5kZXg6cixhYnNvbHV0ZUluZGV4OklZdChlLHQscil9fSkpKSxtaW5Db2xvcjoiIzAwMDBGRiIsbWF4Q29sb3I6IiNGRjAwMDAiLGNvbmZpZ3VyYXRpb246dGhpcy5jb25maWd1cmF0aW9ufTt0aGlzLnNldCgib3B0aW9ucyIsbiksRGkoKSx0aGlzLnNldCgib3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgiLHRoaXMuX2RlZmF1bHRDb2xvckJ5Q29sdW1uSW5kZXgoKSl9X3Vuc2VsZWN0RGlzYWJsZWRMb2dTY2FsZXMoKXtudWxsIT09dGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMuY29sdW1ucy5mb3JFYWNoKCh0PT57Y29uc3QgZT0ib3B0aW9ucy5jb2x1bW5zLiIrdC5pbmRleDt0aGlzLl9hbGxvd0xvZ1NjYWxlKHQpfHwiTE9HIiE9PXQuc2NhbGV8fHRoaXMuc2V0KGUrIi5zY2FsZSIsIkxJTkVBUiIpfSkpfV9hbGxvd0xvZ1NjYWxlKHQpe2lmKCF0aGlzLl9pc051bWVyaWNDb2x1bW4odC5pbmRleCl8fCF0aGlzLnNlc3Npb25Hcm91cHMpcmV0dXJuITE7Y29uc3RbZSxuXT16WXQodGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEsdGhpcy5zZXNzaW9uR3JvdXBzLHQuaW5kZXgpO3JldHVybiBlPjB8fG48MH1faXNOdW1lcmljQ29sdW1uKHQpe3JldHVybiB0Pj10aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvcy5sZW5ndGh8fCJEQVRBX1RZUEVfRkxPQVQ2NCI9PT10aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvc1t0XS50eXBlfV9kZWZhdWx0Q29sb3JCeUNvbHVtbkluZGV4KCl7aWYodGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEubWV0cmljSW5mb3MubGVuZ3RoPjApcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zLmxlbmd0aDtjb25zdCB0PXRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zLmZpbmRJbmRleCgodD0+IkRBVEFfVFlQRV9GTE9BVDY0Ij09PXQudHlwZSkpO3JldHVybi0xIT09dD90OnZvaWQgMH19O2FYdC50ZW1wbGF0ZT1fZWAKICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtcGFuZWwiPgogICAgICA8IS0tICdDb2xvciBieScgZHJvcCBkb3duIG1lbnUgLS0+CiAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51CiAgICAgICAgbGFiZWw9IkNvbG9yIGJ5IgogICAgICAgIGlkPSJjb2xvckJ5RHJvcERvd25NZW51IgogICAgICAgIGhvcml6b250YWwtYWxpZ249ImxlZnQiCiAgICAgID4KICAgICAgICA8cGFwZXItbGlzdGJveAogICAgICAgICAgY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiCiAgICAgICAgICBzbG90PSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgc2VsZWN0ZWQ9Int7b3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXh9fSIKICAgICAgICAgIGlkPSJjb2xvckJ5TGlzdEJveCIKICAgICAgICA+CiAgICAgICAgICA8dGVtcGxhdGUKICAgICAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgICAgIGl0ZW1zPSJbW29wdGlvbnMuY29sdW1uc11dIgogICAgICAgICAgICBhcz0iY29sdW1uIgogICAgICAgICAgICBpZD0iY29sb3JCeUNvbHVtblRlbXBsYXRlIgogICAgICAgICAgPgogICAgICAgICAgICA8cGFwZXItaXRlbSBkaXNhYmxlZD0iW1shX2lzTnVtZXJpY0NvbHVtbihjb2x1bW4uaW5kZXgpXV0iPgogICAgICAgICAgICAgIFtbY29sdW1uLm5hbWVdXQogICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgoKICAgICAgPCEtLSBDb2x1bW5zIHNjYWxlcyAtLT4KICAgICAgPGRpdiBjbGFzcz0iY29sdW1ucy1jb250YWluZXIiPgogICAgICAgIDwhLS0gU2NhbGUgb3B0aW9ucyBmb3IgZWFjaCBudW1lcmljIGZlYXR1cmUgLS0+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tvcHRpb25zLmNvbHVtbnN9fSIgYXM9ImNvbHVtbiI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzTnVtZXJpY0NvbHVtbihjb2x1bW4uaW5kZXgpXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2x1bW4iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbHVtbi10aXRsZSI+W1tjb2x1bW4ubmFtZV1dPC9kaXY+CiAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1ncm91cAogICAgICAgICAgICAgICAgICBjbGFzcz0ic2NhbGUtcmFkaW8tZ3JvdXAiCiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkPSJ7e2NvbHVtbi5zY2FsZX19IgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9IkxJTkVBUiI+CiAgICAgICAgICAgICAgICAgICAgTGluZWFyCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICA8IS0tIFRoZSBpZCBoZXJlIGlzIHVzZWQgdG8gYWNjZXNzIHRoaXMgYnV0dG9uIGluIHVuaXQKICAgICAgICAgICAgICAgICAgICAgICB0ZXN0cy4tLT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbgogICAgICAgICAgICAgICAgICAgIGlkPSJsb2dTY2FsZUJ1dHRvbl9bW2NvbHVtbi5uYW1lXV0iCiAgICAgICAgICAgICAgICAgICAgbmFtZT0iTE9HIgogICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPSJbWyFfYWxsb3dMb2dTY2FsZShjb2x1bW4sIHNlc3Npb25Hcm91cHMuKildXSIKICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgIExvZ2FyaXRobWljCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9IlFVQU5USUxFIj4KICAgICAgICAgICAgICAgICAgICBRdWFudGlsZQogICAgICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5jb250cm9sLXBhbmVsIHsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQogICAgICAuY29sdW1uIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICAgICAgYm9yZGVyOiBzb2xpZCAxcHggZGFya2dyYXk7CiAgICAgICAgcGFkZGluZzogM3B4OwogICAgICB9CiAgICAgIC5jb2x1bW4tdGl0bGUgewogICAgICAgIC8qIEZpdCBldmVyeSB0aXRsZSBpbiBvbmUgbGluZSBzbyB0aGUgcmFkaW8gYm94ZXMgYWxpZ24gdmVydGljYWxseS4gKi8KICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICB9CiAgICAgIC5jb2x1bW5zLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CiAgICAgIC5zY2FsZS1yYWRpby1ncm91cCBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIHBhZGRpbmc6IDJweDsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICBwYXBlci1saXN0Ym94IHsKICAgICAgICBtYXgtaGVpZ2h0OiAxNWVtOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sYVh0LnByb3RvdHlwZSwiY29uZmlndXJhdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sYVh0LnByb3RvdHlwZSwic2Vzc2lvbkdyb3VwcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sYVh0LnByb3RvdHlwZSwib3B0aW9ucyIsdm9pZCAwKSx0KFthKCJjb25maWd1cmF0aW9uLioiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGFYdC5wcm90b3R5cGUsIl9jb25maWd1cmF0aW9uQ2hhbmdlZCIsbnVsbCksdChbYSgic2Vzc2lvbkdyb3Vwcy4qIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxhWHQucHJvdG90eXBlLCJfdW5zZWxlY3REaXNhYmxlZExvZ1NjYWxlcyIsbnVsbCksYVh0PXQoW2koInRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzIildLGFYdCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICAgKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICAgKiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgICogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAgKi8KY29uc3Qgc1h0PSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZudWxsIT13aW5kb3cuY3VzdG9tRWxlbWVudHMmJnZvaWQgMCE9PXdpbmRvdy5jdXN0b21FbGVtZW50cy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrLGxYdD0odCxlLG49bnVsbCk9Pntmb3IoO2UhPT1uOyl7Y29uc3Qgbj1lLm5leHRTaWJsaW5nO3QucmVtb3ZlQ2hpbGQoZSksZT1ufX0sY1h0PWB7e2xpdC0ke1N0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZSgyKX19fWAsdVh0PWBceDNjIS0tJHtjWHR9LS1ceDNlYCxoWHQ9bmV3IFJlZ0V4cChgJHtjWHR9fCR7dVh0fWApLGRYdD0iJGxpdCQiO2NsYXNzIHBYdHtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMucGFydHM9W10sdGhpcy5lbGVtZW50PWU7Y29uc3Qgbj1bXSxpPVtdLHI9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihlLmNvbnRlbnQsMTMzLG51bGwsITEpO2xldCBvPTAsYT0tMSxzPTA7Y29uc3R7c3RyaW5nczpsLHZhbHVlczp7bGVuZ3RoOmN9fT10O2Zvcig7czxjOyl7Y29uc3QgdD1yLm5leHROb2RlKCk7aWYobnVsbCE9PXQpe2lmKGErKywxPT09dC5ub2RlVHlwZSl7aWYodC5oYXNBdHRyaWJ1dGVzKCkpe2NvbnN0IGU9dC5hdHRyaWJ1dGVzLHtsZW5ndGg6bn09ZTtsZXQgaT0wO2ZvcihsZXQgdD0wO3Q8bjt0KyspZlh0KGVbdF0ubmFtZSxkWHQpJiZpKys7Zm9yKDtpLS0gPjA7KXtjb25zdCBlPV9YdC5leGVjKGxbc10pWzJdLG49ZS50b0xvd2VyQ2FzZSgpK2RYdCxpPXQuZ2V0QXR0cmlidXRlKG4pO3QucmVtb3ZlQXR0cmlidXRlKG4pO2NvbnN0IHI9aS5zcGxpdChoWHQpO3RoaXMucGFydHMucHVzaCh7dHlwZToiYXR0cmlidXRlIixpbmRleDphLG5hbWU6ZSxzdHJpbmdzOnJ9KSxzKz1yLmxlbmd0aC0xfX0iVEVNUExBVEUiPT09dC50YWdOYW1lJiYoaS5wdXNoKHQpLHIuY3VycmVudE5vZGU9dC5jb250ZW50KX1lbHNlIGlmKDM9PT10Lm5vZGVUeXBlKXtjb25zdCBlPXQuZGF0YTtpZihlLmluZGV4T2YoY1h0KT49MCl7Y29uc3QgaT10LnBhcmVudE5vZGUscj1lLnNwbGl0KGhYdCksbz1yLmxlbmd0aC0xO2ZvcihsZXQgZT0wO2U8bztlKyspe2xldCBuLG89cltlXTtpZigiIj09PW8pbj1nWHQoKTtlbHNle2NvbnN0IHQ9X1h0LmV4ZWMobyk7bnVsbCE9PXQmJmZYdCh0WzJdLGRYdCkmJihvPW8uc2xpY2UoMCx0LmluZGV4KSt0WzFdK3RbMl0uc2xpY2UoMCwtZFh0Lmxlbmd0aCkrdFszXSksbj1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShvKX1pLmluc2VydEJlZm9yZShuLHQpLHRoaXMucGFydHMucHVzaCh7dHlwZToibm9kZSIsaW5kZXg6KythfSl9IiI9PT1yW29dPyhpLmluc2VydEJlZm9yZShnWHQoKSx0KSxuLnB1c2godCkpOnQuZGF0YT1yW29dLHMrPW99fWVsc2UgaWYoOD09PXQubm9kZVR5cGUpaWYodC5kYXRhPT09Y1h0KXtjb25zdCBlPXQucGFyZW50Tm9kZTtudWxsIT09dC5wcmV2aW91c1NpYmxpbmcmJmEhPT1vfHwoYSsrLGUuaW5zZXJ0QmVmb3JlKGdYdCgpLHQpKSxvPWEsdGhpcy5wYXJ0cy5wdXNoKHt0eXBlOiJub2RlIixpbmRleDphfSksbnVsbD09PXQubmV4dFNpYmxpbmc/dC5kYXRhPSIiOihuLnB1c2godCksYS0tKSxzKyt9ZWxzZXtsZXQgZT0tMTtmb3IoOy0xIT09KGU9dC5kYXRhLmluZGV4T2YoY1h0LGUrMSkpOyl0aGlzLnBhcnRzLnB1c2goe3R5cGU6Im5vZGUiLGluZGV4Oi0xfSkscysrfX1lbHNlIHIuY3VycmVudE5vZGU9aS5wb3AoKX1mb3IoY29uc3QgdCBvZiBuKXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KX19Y29uc3QgZlh0PSh0LGUpPT57Y29uc3Qgbj10Lmxlbmd0aC1lLmxlbmd0aDtyZXR1cm4gbj49MCYmdC5zbGljZShuKT09PWV9LG1YdD10PT4tMSE9PXQuaW5kZXgsZ1h0PSgpPT5kb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSxfWHQ9LyhbIFx4MDlceDBhXHgwY1x4MGRdKShbXlwwLVx4MUZceDdGLVx4OUYgIic+PS9dKykoWyBceDA5XHgwYVx4MGNceDBkXSo9WyBceDA5XHgwYVx4MGNceDBkXSooPzpbXiBceDA5XHgwYVx4MGNceDBkIidgPD49XSp8IlteIl0qfCdbXiddKikpJC87ZnVuY3Rpb24geVh0KHQsZSl7Y29uc3R7ZWxlbWVudDp7Y29udGVudDpufSxwYXJ0czppfT10LHI9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihuLDEzMyxudWxsLCExKTtsZXQgbz1iWHQoaSksYT1pW29dLHM9LTEsbD0wO2NvbnN0IGM9W107bGV0IHU9bnVsbDtmb3IoO3IubmV4dE5vZGUoKTspe3MrKztjb25zdCB0PXIuY3VycmVudE5vZGU7Zm9yKHQucHJldmlvdXNTaWJsaW5nPT09dSYmKHU9bnVsbCksZS5oYXModCkmJihjLnB1c2godCksbnVsbD09PXUmJih1PXQpKSxudWxsIT09dSYmbCsrO3ZvaWQgMCE9PWEmJmEuaW5kZXg9PT1zOylhLmluZGV4PW51bGwhPT11Py0xOmEuaW5kZXgtbCxvPWJYdChpLG8pLGE9aVtvXX1jLmZvckVhY2goKHQ9PnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSkpfWNvbnN0IHZYdD10PT57bGV0IGU9MTE9PT10Lm5vZGVUeXBlPzA6MTtjb25zdCBuPWRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIodCwxMzMsbnVsbCwhMSk7Zm9yKDtuLm5leHROb2RlKCk7KWUrKztyZXR1cm4gZX0sYlh0PSh0LGU9LTEpPT57Zm9yKGxldCBuPWUrMTtuPHQubGVuZ3RoO24rKylpZihtWHQodFtuXSkpcmV0dXJuIG47cmV0dXJuLTF9LHhYdD1uZXcgV2Vha01hcCx3WHQ9e30sU1h0PXt9OwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgICAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgICogVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgICogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgICAqIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgICovCmNsYXNzIE1YdHtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5fX3BhcnRzPVtdLHRoaXMudGVtcGxhdGU9dCx0aGlzLnByb2Nlc3Nvcj1lLHRoaXMub3B0aW9ucz1ufXVwZGF0ZSh0KXtsZXQgZT0wO2Zvcihjb25zdCBuIG9mIHRoaXMuX19wYXJ0cyl2b2lkIDAhPT1uJiZuLnNldFZhbHVlKHRbZV0pLGUrKztmb3IoY29uc3QgdCBvZiB0aGlzLl9fcGFydHMpdm9pZCAwIT09dCYmdC5jb21taXQoKX1fY2xvbmUoKXtjb25zdCB0PXNYdD90aGlzLnRlbXBsYXRlLmVsZW1lbnQuY29udGVudC5jbG9uZU5vZGUoITApOmRvY3VtZW50LmltcG9ydE5vZGUodGhpcy50ZW1wbGF0ZS5lbGVtZW50LmNvbnRlbnQsITApLGU9W10sbj10aGlzLnRlbXBsYXRlLnBhcnRzLGk9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcih0LDEzMyxudWxsLCExKTtsZXQgcixvPTAsYT0wLHM9aS5uZXh0Tm9kZSgpO2Zvcig7bzxuLmxlbmd0aDspaWYocj1uW29dLG1YdChyKSl7Zm9yKDthPHIuaW5kZXg7KWErKywiVEVNUExBVEUiPT09cy5ub2RlTmFtZSYmKGUucHVzaChzKSxpLmN1cnJlbnROb2RlPXMuY29udGVudCksbnVsbD09PShzPWkubmV4dE5vZGUoKSkmJihpLmN1cnJlbnROb2RlPWUucG9wKCkscz1pLm5leHROb2RlKCkpO2lmKCJub2RlIj09PXIudHlwZSl7Y29uc3QgdD10aGlzLnByb2Nlc3Nvci5oYW5kbGVUZXh0RXhwcmVzc2lvbih0aGlzLm9wdGlvbnMpO3QuaW5zZXJ0QWZ0ZXJOb2RlKHMucHJldmlvdXNTaWJsaW5nKSx0aGlzLl9fcGFydHMucHVzaCh0KX1lbHNlIHRoaXMuX19wYXJ0cy5wdXNoKC4uLnRoaXMucHJvY2Vzc29yLmhhbmRsZUF0dHJpYnV0ZUV4cHJlc3Npb25zKHMsci5uYW1lLHIuc3RyaW5ncyx0aGlzLm9wdGlvbnMpKTtvKyt9ZWxzZSB0aGlzLl9fcGFydHMucHVzaCh2b2lkIDApLG8rKztyZXR1cm4gc1h0JiYoZG9jdW1lbnQuYWRvcHROb2RlKHQpLGN1c3RvbUVsZW1lbnRzLnVwZ3JhZGUodCkpLHR9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgICAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgICogVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgICogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgICAqIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgICovY29uc3QgRVh0PXdpbmRvdy50cnVzdGVkVHlwZXMmJnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImxpdC1odG1sIix7Y3JlYXRlSFRNTDp0PT50fSksVFh0PWAgJHtjWHR9IGA7Y2xhc3MgQ1h0e2NvbnN0cnVjdG9yKHQpe3RoaXMudmFsdWU9dm9pZCAwLHRoaXMuX19wZW5kaW5nVmFsdWU9dm9pZCAwLHRoaXMub3B0aW9ucz10fWFwcGVuZEludG8odCl7dGhpcy5zdGFydE5vZGU9dC5hcHBlbmRDaGlsZChnWHQoKSksdGhpcy5lbmROb2RlPXQuYXBwZW5kQ2hpbGQoZ1h0KCkpfWluc2VydEFmdGVyTm9kZSh0KXt0aGlzLnN0YXJ0Tm9kZT10LHRoaXMuZW5kTm9kZT10Lm5leHRTaWJsaW5nfWFwcGVuZEludG9QYXJ0KHQpe3QuX19pbnNlcnQodGhpcy5zdGFydE5vZGU9Z1h0KCkpLHQuX19pbnNlcnQodGhpcy5lbmROb2RlPWdYdCgpKX1pbnNlcnRBZnRlclBhcnQodCl7dC5fX2luc2VydCh0aGlzLnN0YXJ0Tm9kZT1nWHQoKSksdGhpcy5lbmROb2RlPXQuZW5kTm9kZSx0LmVuZE5vZGU9dGhpcy5zdGFydE5vZGV9c2V0VmFsdWUodCl7dGhpcy5fX3BlbmRpbmdWYWx1ZT10fWNvbW1pdCgpe2lmKG51bGw9PT10aGlzLnN0YXJ0Tm9kZS5wYXJlbnROb2RlKXJldHVybjtmb3IoOyJmdW5jdGlvbiI9PXR5cGVvZih0PXRoaXMuX19wZW5kaW5nVmFsdWUpJiZ4WHQuaGFzKHQpOyl7Y29uc3QgdD10aGlzLl9fcGVuZGluZ1ZhbHVlO3RoaXMuX19wZW5kaW5nVmFsdWU9d1h0LHQodGhpcyl9dmFyIHQ7Y29uc3QgZT10aGlzLl9fcGVuZGluZ1ZhbHVlO2UhPT13WHQmJigodD0+bnVsbD09PXR8fCEoIm9iamVjdCI9PXR5cGVvZiB0fHwiZnVuY3Rpb24iPT10eXBlb2YgdCkpKGUpP2UhPT10aGlzLnZhbHVlJiZ0aGlzLl9fY29tbWl0VGV4dChlKTplIGluc3RhbmNlb2YgY2xhc3N7Y29uc3RydWN0b3IodCxlLG4saSl7dGhpcy5zdHJpbmdzPXQsdGhpcy52YWx1ZXM9ZSx0aGlzLnR5cGU9bix0aGlzLnByb2Nlc3Nvcj1pfWdldEhUTUwoKXtjb25zdCB0PXRoaXMuc3RyaW5ncy5sZW5ndGgtMTtsZXQgZT0iIixuPSExO2ZvcihsZXQgaT0wO2k8dDtpKyspe2NvbnN0IHQ9dGhpcy5zdHJpbmdzW2ldLHI9dC5sYXN0SW5kZXhPZigiXHgzYyEtLSIpO249KHI+LTF8fG4pJiYtMT09PXQuaW5kZXhPZigiLS1ceDNlIixyKzEpO2NvbnN0IG89X1h0LmV4ZWModCk7ZSs9bnVsbD09PW8/dCsobj9UWHQ6dVh0KTp0LnN1YnN0cigwLG8uaW5kZXgpK29bMV0rb1syXStkWHQrb1szXStjWHR9cmV0dXJuIGUrPXRoaXMuc3RyaW5nc1t0XSxlfWdldFRlbXBsYXRlRWxlbWVudCgpe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtsZXQgZT10aGlzLmdldEhUTUwoKTtyZXR1cm4gdm9pZCAwIT09RVh0JiYoZT1FWHQuY3JlYXRlSFRNTChlKSksdC5pbm5lckhUTUw9ZSx0fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICAgKiBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgICAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgICAqIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICAgKiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICAqLz90aGlzLl9fY29tbWl0VGVtcGxhdGVSZXN1bHQoZSk6ZSBpbnN0YW5jZW9mIE5vZGU/dGhpcy5fX2NvbW1pdE5vZGUoZSk6KHQ9PkFycmF5LmlzQXJyYXkodCl8fCEoIXR8fCF0W1N5bWJvbC5pdGVyYXRvcl0pKShlKT90aGlzLl9fY29tbWl0SXRlcmFibGUoZSk6ZT09PVNYdD8odGhpcy52YWx1ZT1TWHQsdGhpcy5jbGVhcigpKTp0aGlzLl9fY29tbWl0VGV4dChlKSl9X19pbnNlcnQodCl7dGhpcy5lbmROb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHQsdGhpcy5lbmROb2RlKX1fX2NvbW1pdE5vZGUodCl7dGhpcy52YWx1ZSE9PXQmJih0aGlzLmNsZWFyKCksdGhpcy5fX2luc2VydCh0KSx0aGlzLnZhbHVlPXQpfV9fY29tbWl0VGV4dCh0KXtjb25zdCBlPXRoaXMuc3RhcnROb2RlLm5leHRTaWJsaW5nLG49InN0cmluZyI9PXR5cGVvZih0PW51bGw9PXQ/IiI6dCk/dDpTdHJpbmcodCk7ZT09PXRoaXMuZW5kTm9kZS5wcmV2aW91c1NpYmxpbmcmJjM9PT1lLm5vZGVUeXBlP2UuZGF0YT1uOnRoaXMuX19jb21taXROb2RlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG4pKSx0aGlzLnZhbHVlPXR9X19jb21taXRUZW1wbGF0ZVJlc3VsdCh0KXtjb25zdCBlPXRoaXMub3B0aW9ucy50ZW1wbGF0ZUZhY3RvcnkodCk7aWYodGhpcy52YWx1ZSBpbnN0YW5jZW9mIE1YdCYmdGhpcy52YWx1ZS50ZW1wbGF0ZT09PWUpdGhpcy52YWx1ZS51cGRhdGUodC52YWx1ZXMpO2Vsc2V7Y29uc3Qgbj1uZXcgTVh0KGUsdC5wcm9jZXNzb3IsdGhpcy5vcHRpb25zKSxpPW4uX2Nsb25lKCk7bi51cGRhdGUodC52YWx1ZXMpLHRoaXMuX19jb21taXROb2RlKGkpLHRoaXMudmFsdWU9bn19X19jb21taXRJdGVyYWJsZSh0KXtBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpfHwodGhpcy52YWx1ZT1bXSx0aGlzLmNsZWFyKCkpO2NvbnN0IGU9dGhpcy52YWx1ZTtsZXQgbixpPTA7Zm9yKGNvbnN0IHIgb2YgdCluPWVbaV0sdm9pZCAwPT09biYmKG49bmV3IENYdCh0aGlzLm9wdGlvbnMpLGUucHVzaChuKSwwPT09aT9uLmFwcGVuZEludG9QYXJ0KHRoaXMpOm4uaW5zZXJ0QWZ0ZXJQYXJ0KGVbaS0xXSkpLG4uc2V0VmFsdWUociksbi5jb21taXQoKSxpKys7aTxlLmxlbmd0aCYmKGUubGVuZ3RoPWksdGhpcy5jbGVhcihuJiZuLmVuZE5vZGUpKX1jbGVhcih0PXRoaXMuc3RhcnROb2RlKXtsWHQodGhpcy5zdGFydE5vZGUucGFyZW50Tm9kZSx0Lm5leHRTaWJsaW5nLHRoaXMuZW5kTm9kZSl9fWxldCBBWHQ9ITE7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICAgKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICAgKiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgICogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAgKi8KZnVuY3Rpb24ga1h0KHQpe2xldCBlPUxYdC5nZXQodC50eXBlKTt2b2lkIDA9PT1lJiYoZT17c3RyaW5nc0FycmF5Om5ldyBXZWFrTWFwLGtleVN0cmluZzpuZXcgTWFwfSxMWHQuc2V0KHQudHlwZSxlKSk7bGV0IG49ZS5zdHJpbmdzQXJyYXkuZ2V0KHQuc3RyaW5ncyk7aWYodm9pZCAwIT09bilyZXR1cm4gbjtjb25zdCBpPXQuc3RyaW5ncy5qb2luKGNYdCk7cmV0dXJuIG49ZS5rZXlTdHJpbmcuZ2V0KGkpLHZvaWQgMD09PW4mJihuPW5ldyBwWHQodCx0LmdldFRlbXBsYXRlRWxlbWVudCgpKSxlLmtleVN0cmluZy5zZXQoaSxuKSksZS5zdHJpbmdzQXJyYXkuc2V0KHQuc3RyaW5ncyxuKSxufSgoKT0+e3RyeXtjb25zdCB0PXtnZXQgY2FwdHVyZSgpe3JldHVybiBBWHQ9ITAsITF9fTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsdCx0KSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGVzdCIsdCx0KX1jYXRjaCh0KXt9fSkoKTtjb25zdCBMWHQ9bmV3IE1hcCxQWHQ9bmV3IFdlYWtNYXA7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICAgKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICAgKiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgICogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAgKi8KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICAgKiBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgICAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgICAqIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICAgKiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICAqLwoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmKHdpbmRvdy5saXRIdG1sVmVyc2lvbnN8fCh3aW5kb3cubGl0SHRtbFZlcnNpb25zPVtdKSkucHVzaCgiMS40LjEiKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICAgKiBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgICAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgICAqIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICAgKiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICAqL2NvbnN0IE5YdD0odCxlKT0+YCR7dH0tLSR7ZX1gO2xldCBJWHQ9ITA7dm9pZCAwPT09d2luZG93LlNoYWR5Q1NTP0lYdD0hMTp2b2lkIDA9PT13aW5kb3cuU2hhZHlDU1MucHJlcGFyZVRlbXBsYXRlRG9tJiYoY29uc29sZS53YXJuKCJJbmNvbXBhdGlibGUgU2hhZHlDU1MgdmVyc2lvbiBkZXRlY3RlZC4gUGxlYXNlIHVwZGF0ZSB0byBhdCBsZWFzdCBAd2ViY29tcG9uZW50cy93ZWJjb21wb25lbnRzanNAMi4wLjIgYW5kIEB3ZWJjb21wb25lbnRzL3NoYWR5Y3NzQDEuMy4xLiIpLElYdD0hMSk7Y29uc3QgUlh0PXQ9PmU9Pntjb25zdCBuPU5YdChlLnR5cGUsdCk7bGV0IGk9TFh0LmdldChuKTt2b2lkIDA9PT1pJiYoaT17c3RyaW5nc0FycmF5Om5ldyBXZWFrTWFwLGtleVN0cmluZzpuZXcgTWFwfSxMWHQuc2V0KG4saSkpO2xldCByPWkuc3RyaW5nc0FycmF5LmdldChlLnN0cmluZ3MpO2lmKHZvaWQgMCE9PXIpcmV0dXJuIHI7Y29uc3Qgbz1lLnN0cmluZ3Muam9pbihjWHQpO2lmKHI9aS5rZXlTdHJpbmcuZ2V0KG8pLHZvaWQgMD09PXIpe2NvbnN0IG49ZS5nZXRUZW1wbGF0ZUVsZW1lbnQoKTtJWHQmJndpbmRvdy5TaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGVEb20obix0KSxyPW5ldyBwWHQoZSxuKSxpLmtleVN0cmluZy5zZXQobyxyKX1yZXR1cm4gaS5zdHJpbmdzQXJyYXkuc2V0KGUuc3RyaW5ncyxyKSxyfSxPWHQ9WyJodG1sIiwic3ZnIl0selh0PW5ldyBTZXQ7d2luZG93LkpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHk9KHQsZSk9PnQ7Y29uc3QgRFh0PXt0b0F0dHJpYnV0ZSh0LGUpe3N3aXRjaChlKXtjYXNlIEJvb2xlYW46cmV0dXJuIHQ/IiI6bnVsbDtjYXNlIE9iamVjdDpjYXNlIEFycmF5OnJldHVybiBudWxsPT10P3Q6SlNPTi5zdHJpbmdpZnkodCl9cmV0dXJuIHR9LGZyb21BdHRyaWJ1dGUodCxlKXtzd2l0Y2goZSl7Y2FzZSBCb29sZWFuOnJldHVybiBudWxsIT09dDtjYXNlIE51bWJlcjpyZXR1cm4gbnVsbD09PXQ/bnVsbDpOdW1iZXIodCk7Y2FzZSBPYmplY3Q6Y2FzZSBBcnJheTpyZXR1cm4gSlNPTi5wYXJzZSh0KX1yZXR1cm4gdH19LEJYdD0odCxlKT0+ZSE9PXQmJihlPT1lfHx0PT10KSxIWHQ9e2F0dHJpYnV0ZTohMCx0eXBlOlN0cmluZyxjb252ZXJ0ZXI6RFh0LHJlZmxlY3Q6ITEsaGFzQ2hhbmdlZDpCWHR9O2NsYXNzIEZYdCBleHRlbmRzIEhUTUxFbGVtZW50e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmluaXRpYWxpemUoKX1zdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpe3RoaXMuZmluYWxpemUoKTtjb25zdCB0PVtdO3JldHVybiB0aGlzLl9jbGFzc1Byb3BlcnRpZXMuZm9yRWFjaCgoKGUsbik9Pntjb25zdCBpPXRoaXMuX2F0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShuLGUpO3ZvaWQgMCE9PWkmJih0aGlzLl9hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwLnNldChpLG4pLHQucHVzaChpKSl9KSksdH1zdGF0aWMgX2Vuc3VyZUNsYXNzUHJvcGVydGllcygpe2lmKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl9jbGFzc1Byb3BlcnRpZXMiLHRoaXMpKSl7dGhpcy5fY2xhc3NQcm9wZXJ0aWVzPW5ldyBNYXA7Y29uc3QgdD1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2NsYXNzUHJvcGVydGllczt2b2lkIDAhPT10JiZ0LmZvckVhY2goKCh0LGUpPT50aGlzLl9jbGFzc1Byb3BlcnRpZXMuc2V0KGUsdCkpKX19c3RhdGljIGNyZWF0ZVByb3BlcnR5KHQsZT1IWHQpe2lmKHRoaXMuX2Vuc3VyZUNsYXNzUHJvcGVydGllcygpLHRoaXMuX2NsYXNzUHJvcGVydGllcy5zZXQodCxlKSxlLm5vQWNjZXNzb3J8fHRoaXMucHJvdG90eXBlLmhhc093blByb3BlcnR5KHQpKXJldHVybjtjb25zdCBuPSJzeW1ib2wiPT10eXBlb2YgdD9TeW1ib2woKTpgX18ke3R9YCxpPXRoaXMuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHQsbixlKTt2b2lkIDAhPT1pJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5wcm90b3R5cGUsdCxpKX1zdGF0aWMgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHQsZSxuKXtyZXR1cm57Z2V0KCl7cmV0dXJuIHRoaXNbZV19LHNldChpKXtjb25zdCByPXRoaXNbdF07dGhpc1tlXT1pLHRoaXMucmVxdWVzdFVwZGF0ZUludGVybmFsKHQscixuKX0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITB9fXN0YXRpYyBnZXRQcm9wZXJ0eU9wdGlvbnModCl7cmV0dXJuIHRoaXMuX2NsYXNzUHJvcGVydGllcyYmdGhpcy5fY2xhc3NQcm9wZXJ0aWVzLmdldCh0KXx8SFh0fXN0YXRpYyBmaW5hbGl6ZSgpe2NvbnN0IHQ9T2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO2lmKHQuaGFzT3duUHJvcGVydHkoImZpbmFsaXplZCIpfHx0LmZpbmFsaXplKCksdGhpcy5maW5hbGl6ZWQ9ITAsdGhpcy5fZW5zdXJlQ2xhc3NQcm9wZXJ0aWVzKCksdGhpcy5fYXR0cmlidXRlVG9Qcm9wZXJ0eU1hcD1uZXcgTWFwLHRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgicHJvcGVydGllcyIsdGhpcykpKXtjb25zdCB0PXRoaXMucHJvcGVydGllcyxlPVsuLi5PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KSwuLi4iZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz9PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpOltdXTtmb3IoY29uc3QgbiBvZiBlKXRoaXMuY3JlYXRlUHJvcGVydHkobix0W25dKX19c3RhdGljIF9hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkodCxlKXtjb25zdCBuPWUuYXR0cmlidXRlO3JldHVybiExPT09bj92b2lkIDA6InN0cmluZyI9PXR5cGVvZiBuP246InN0cmluZyI9PXR5cGVvZiB0P3QudG9Mb3dlckNhc2UoKTp2b2lkIDB9c3RhdGljIF92YWx1ZUhhc0NoYW5nZWQodCxlLG49Qlh0KXtyZXR1cm4gbih0LGUpfXN0YXRpYyBfcHJvcGVydHlWYWx1ZUZyb21BdHRyaWJ1dGUodCxlKXtjb25zdCBuPWUuY29udmVydGVyfHxEWHQsaT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOm4uZnJvbUF0dHJpYnV0ZTtyZXR1cm4gaT9pKHQsZS50eXBlKTp0fXN0YXRpYyBfcHJvcGVydHlWYWx1ZVRvQXR0cmlidXRlKHQsZSl7aWYodm9pZCAwPT09ZS5yZWZsZWN0KXJldHVybjtjb25zdCBuPWUuY29udmVydGVyO3JldHVybihuJiZuLnRvQXR0cmlidXRlfHxEWHQudG9BdHRyaWJ1dGUpKHQsZS50eXBlKX1pbml0aWFsaXplKCl7dGhpcy5fdXBkYXRlU3RhdGU9MCx0aGlzLl91cGRhdGVQcm9taXNlPW5ldyBQcm9taXNlKCh0PT50aGlzLl9lbmFibGVVcGRhdGluZ1Jlc29sdmVyPXQpKSx0aGlzLl9jaGFuZ2VkUHJvcGVydGllcz1uZXcgTWFwLHRoaXMuX3NhdmVJbnN0YW5jZVByb3BlcnRpZXMoKSx0aGlzLnJlcXVlc3RVcGRhdGVJbnRlcm5hbCgpfV9zYXZlSW5zdGFuY2VQcm9wZXJ0aWVzKCl7dGhpcy5jb25zdHJ1Y3Rvci5fY2xhc3NQcm9wZXJ0aWVzLmZvckVhY2goKCh0LGUpPT57aWYodGhpcy5oYXNPd25Qcm9wZXJ0eShlKSl7Y29uc3QgdD10aGlzW2VdO2RlbGV0ZSB0aGlzW2VdLHRoaXMuX2luc3RhbmNlUHJvcGVydGllc3x8KHRoaXMuX2luc3RhbmNlUHJvcGVydGllcz1uZXcgTWFwKSx0aGlzLl9pbnN0YW5jZVByb3BlcnRpZXMuc2V0KGUsdCl9fSkpfV9hcHBseUluc3RhbmNlUHJvcGVydGllcygpe3RoaXMuX2luc3RhbmNlUHJvcGVydGllcy5mb3JFYWNoKCgodCxlKT0+dGhpc1tlXT10KSksdGhpcy5faW5zdGFuY2VQcm9wZXJ0aWVzPXZvaWQgMH1jb25uZWN0ZWRDYWxsYmFjaygpe3RoaXMuZW5hYmxlVXBkYXRpbmcoKX1lbmFibGVVcGRhdGluZygpe3ZvaWQgMCE9PXRoaXMuX2VuYWJsZVVwZGF0aW5nUmVzb2x2ZXImJih0aGlzLl9lbmFibGVVcGRhdGluZ1Jlc29sdmVyKCksdGhpcy5fZW5hYmxlVXBkYXRpbmdSZXNvbHZlcj12b2lkIDApfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7fWF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0LGUsbil7ZSE9PW4mJnRoaXMuX2F0dHJpYnV0ZVRvUHJvcGVydHkodCxuKX1fcHJvcGVydHlUb0F0dHJpYnV0ZSh0LGUsbj1IWHQpe2NvbnN0IGk9dGhpcy5jb25zdHJ1Y3RvcixyPWkuX2F0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eSh0LG4pO2lmKHZvaWQgMCE9PXIpe2NvbnN0IHQ9aS5fcHJvcGVydHlWYWx1ZVRvQXR0cmlidXRlKGUsbik7aWYodm9pZCAwPT09dClyZXR1cm47dGhpcy5fdXBkYXRlU3RhdGU9OHx0aGlzLl91cGRhdGVTdGF0ZSxudWxsPT10P3RoaXMucmVtb3ZlQXR0cmlidXRlKHIpOnRoaXMuc2V0QXR0cmlidXRlKHIsdCksdGhpcy5fdXBkYXRlU3RhdGU9LTkmdGhpcy5fdXBkYXRlU3RhdGV9fV9hdHRyaWJ1dGVUb1Byb3BlcnR5KHQsZSl7aWYoOCZ0aGlzLl91cGRhdGVTdGF0ZSlyZXR1cm47Y29uc3Qgbj10aGlzLmNvbnN0cnVjdG9yLGk9bi5fYXR0cmlidXRlVG9Qcm9wZXJ0eU1hcC5nZXQodCk7aWYodm9pZCAwIT09aSl7Y29uc3QgdD1uLmdldFByb3BlcnR5T3B0aW9ucyhpKTt0aGlzLl91cGRhdGVTdGF0ZT0xNnx0aGlzLl91cGRhdGVTdGF0ZSx0aGlzW2ldPW4uX3Byb3BlcnR5VmFsdWVGcm9tQXR0cmlidXRlKGUsdCksdGhpcy5fdXBkYXRlU3RhdGU9LTE3JnRoaXMuX3VwZGF0ZVN0YXRlfX1yZXF1ZXN0VXBkYXRlSW50ZXJuYWwodCxlLG4pe2xldCBpPSEwO2lmKHZvaWQgMCE9PXQpe2NvbnN0IHI9dGhpcy5jb25zdHJ1Y3RvcjtuPW58fHIuZ2V0UHJvcGVydHlPcHRpb25zKHQpLHIuX3ZhbHVlSGFzQ2hhbmdlZCh0aGlzW3RdLGUsbi5oYXNDaGFuZ2VkKT8odGhpcy5fY2hhbmdlZFByb3BlcnRpZXMuaGFzKHQpfHx0aGlzLl9jaGFuZ2VkUHJvcGVydGllcy5zZXQodCxlKSwhMCE9PW4ucmVmbGVjdHx8MTYmdGhpcy5fdXBkYXRlU3RhdGV8fCh2b2lkIDA9PT10aGlzLl9yZWZsZWN0aW5nUHJvcGVydGllcyYmKHRoaXMuX3JlZmxlY3RpbmdQcm9wZXJ0aWVzPW5ldyBNYXApLHRoaXMuX3JlZmxlY3RpbmdQcm9wZXJ0aWVzLnNldCh0LG4pKSk6aT0hMX0hdGhpcy5faGFzUmVxdWVzdGVkVXBkYXRlJiZpJiYodGhpcy5fdXBkYXRlUHJvbWlzZT10aGlzLl9lbnF1ZXVlVXBkYXRlKCkpfXJlcXVlc3RVcGRhdGUodCxlKXtyZXR1cm4gdGhpcy5yZXF1ZXN0VXBkYXRlSW50ZXJuYWwodCxlKSx0aGlzLnVwZGF0ZUNvbXBsZXRlfWFzeW5jIF9lbnF1ZXVlVXBkYXRlKCl7dGhpcy5fdXBkYXRlU3RhdGU9NHx0aGlzLl91cGRhdGVTdGF0ZTt0cnl7YXdhaXQgdGhpcy5fdXBkYXRlUHJvbWlzZX1jYXRjaCh0KXt9Y29uc3QgdD10aGlzLnBlcmZvcm1VcGRhdGUoKTtyZXR1cm4gbnVsbCE9dCYmYXdhaXQgdCwhdGhpcy5faGFzUmVxdWVzdGVkVXBkYXRlfWdldCBfaGFzUmVxdWVzdGVkVXBkYXRlKCl7cmV0dXJuIDQmdGhpcy5fdXBkYXRlU3RhdGV9Z2V0IGhhc1VwZGF0ZWQoKXtyZXR1cm4gMSZ0aGlzLl91cGRhdGVTdGF0ZX1wZXJmb3JtVXBkYXRlKCl7aWYoIXRoaXMuX2hhc1JlcXVlc3RlZFVwZGF0ZSlyZXR1cm47dGhpcy5faW5zdGFuY2VQcm9wZXJ0aWVzJiZ0aGlzLl9hcHBseUluc3RhbmNlUHJvcGVydGllcygpO2xldCB0PSExO2NvbnN0IGU9dGhpcy5fY2hhbmdlZFByb3BlcnRpZXM7dHJ5e3Q9dGhpcy5zaG91bGRVcGRhdGUoZSksdD90aGlzLnVwZGF0ZShlKTp0aGlzLl9tYXJrVXBkYXRlZCgpfWNhdGNoKGUpe3Rocm93IHQ9ITEsdGhpcy5fbWFya1VwZGF0ZWQoKSxlfXQmJigxJnRoaXMuX3VwZGF0ZVN0YXRlfHwodGhpcy5fdXBkYXRlU3RhdGU9MXx0aGlzLl91cGRhdGVTdGF0ZSx0aGlzLmZpcnN0VXBkYXRlZChlKSksdGhpcy51cGRhdGVkKGUpKX1fbWFya1VwZGF0ZWQoKXt0aGlzLl9jaGFuZ2VkUHJvcGVydGllcz1uZXcgTWFwLHRoaXMuX3VwZGF0ZVN0YXRlPS01JnRoaXMuX3VwZGF0ZVN0YXRlfWdldCB1cGRhdGVDb21wbGV0ZSgpe3JldHVybiB0aGlzLl9nZXRVcGRhdGVDb21wbGV0ZSgpfV9nZXRVcGRhdGVDb21wbGV0ZSgpe3JldHVybiB0aGlzLmdldFVwZGF0ZUNvbXBsZXRlKCl9Z2V0VXBkYXRlQ29tcGxldGUoKXtyZXR1cm4gdGhpcy5fdXBkYXRlUHJvbWlzZX1zaG91bGRVcGRhdGUodCl7cmV0dXJuITB9dXBkYXRlKHQpe3ZvaWQgMCE9PXRoaXMuX3JlZmxlY3RpbmdQcm9wZXJ0aWVzJiZ0aGlzLl9yZWZsZWN0aW5nUHJvcGVydGllcy5zaXplPjAmJih0aGlzLl9yZWZsZWN0aW5nUHJvcGVydGllcy5mb3JFYWNoKCgodCxlKT0+dGhpcy5fcHJvcGVydHlUb0F0dHJpYnV0ZShlLHRoaXNbZV0sdCkpKSx0aGlzLl9yZWZsZWN0aW5nUHJvcGVydGllcz12b2lkIDApLHRoaXMuX21hcmtVcGRhdGVkKCl9dXBkYXRlZCh0KXt9Zmlyc3RVcGRhdGVkKHQpe319Rlh0LmZpbmFsaXplZD0hMDsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE5IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IFZYdD13aW5kb3cuU2hhZG93Um9vdCYmKHZvaWQgMD09PXdpbmRvdy5TaGFkeUNTU3x8d2luZG93LlNoYWR5Q1NTLm5hdGl2ZVNoYWRvdykmJiJhZG9wdGVkU3R5bGVTaGVldHMiaW4gRG9jdW1lbnQucHJvdG90eXBlJiYicmVwbGFjZSJpbiBDU1NTdHlsZVNoZWV0LnByb3RvdHlwZSxVWHQ9U3ltYm9sKCk7Y2xhc3Mgalh0e2NvbnN0cnVjdG9yKHQsZSl7aWYoZSE9PVVYdCl0aHJvdyBuZXcgRXJyb3IoIkNTU1Jlc3VsdCBpcyBub3QgY29uc3RydWN0YWJsZS4gVXNlIGB1bnNhZmVDU1NgIG9yIGBjc3NgIGluc3RlYWQuIik7dGhpcy5jc3NUZXh0PXR9Z2V0IHN0eWxlU2hlZXQoKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5fc3R5bGVTaGVldCYmKFZYdD8odGhpcy5fc3R5bGVTaGVldD1uZXcgQ1NTU3R5bGVTaGVldCx0aGlzLl9zdHlsZVNoZWV0LnJlcGxhY2VTeW5jKHRoaXMuY3NzVGV4dCkpOnRoaXMuX3N0eWxlU2hlZXQ9bnVsbCksdGhpcy5fc3R5bGVTaGVldH10b1N0cmluZygpe3JldHVybiB0aGlzLmNzc1RleHR9fWNvbnN0IEdYdD0odCwuLi5lKT0+e2NvbnN0IG49ZS5yZWR1Y2UoKChlLG4saSk9PmUrKHQ9PntpZih0IGluc3RhbmNlb2Ygalh0KXJldHVybiB0LmNzc1RleHQ7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiB0O3Rocm93IG5ldyBFcnJvcihgVmFsdWUgcGFzc2VkIHRvICdjc3MnIGZ1bmN0aW9uIG11c3QgYmUgYSAnY3NzJyBmdW5jdGlvbiByZXN1bHQ6ICR7dH0uIFVzZSAndW5zYWZlQ1NTJyB0byBwYXNzIG5vbi1saXRlcmFsIHZhbHVlcywgYnV0XG4gICAgICAgICAgICB0YWtlIGNhcmUgdG8gZW5zdXJlIHBhZ2Ugc2VjdXJpdHkuYCl9KShuKSt0W2krMV0pLHRbMF0pO3JldHVybiBuZXcgalh0KG4sVVh0KX07Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICAgKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICAgKiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgICogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAgKi8KKHdpbmRvdy5saXRFbGVtZW50VmVyc2lvbnN8fCh3aW5kb3cubGl0RWxlbWVudFZlcnNpb25zPVtdKSkucHVzaCgiMi41LjEiKTtjb25zdCBXWHQ9e307Y2xhc3MgcVh0IGV4dGVuZHMgRlh0e3N0YXRpYyBnZXRTdHlsZXMoKXtyZXR1cm4gdGhpcy5zdHlsZXN9c3RhdGljIF9nZXRVbmlxdWVTdHlsZXMoKXtpZih0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl9zdHlsZXMiLHRoaXMpKSlyZXR1cm47Y29uc3QgdD10aGlzLmdldFN0eWxlcygpO2lmKEFycmF5LmlzQXJyYXkodCkpe2NvbnN0IGU9KHQsbik9PnQucmVkdWNlUmlnaHQoKCh0LG4pPT5BcnJheS5pc0FycmF5KG4pP2Uobix0KToodC5hZGQobiksdCkpLG4pLG49ZSh0LG5ldyBTZXQpLGk9W107bi5mb3JFYWNoKCh0PT5pLnVuc2hpZnQodCkpKSx0aGlzLl9zdHlsZXM9aX1lbHNlIHRoaXMuX3N0eWxlcz12b2lkIDA9PT10P1tdOlt0XTt0aGlzLl9zdHlsZXM9dGhpcy5fc3R5bGVzLm1hcCgodD0+dCBpbnN0YW5jZW9mIENTU1N0eWxlU2hlZXQmJiFWWHQ/KHQ9Pm5ldyBqWHQoU3RyaW5nKHQpLFVYdCkpKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQuY3NzUnVsZXMpLnJlZHVjZSgoKHQsZSk9PnQrZS5jc3NUZXh0KSwiIikpOnQpKX1pbml0aWFsaXplKCl7c3VwZXIuaW5pdGlhbGl6ZSgpLHRoaXMuY29uc3RydWN0b3IuX2dldFVuaXF1ZVN0eWxlcygpLHRoaXMucmVuZGVyUm9vdD10aGlzLmNyZWF0ZVJlbmRlclJvb3QoKSx3aW5kb3cuU2hhZG93Um9vdCYmdGhpcy5yZW5kZXJSb290IGluc3RhbmNlb2Ygd2luZG93LlNoYWRvd1Jvb3QmJnRoaXMuYWRvcHRTdHlsZXMoKX1jcmVhdGVSZW5kZXJSb290KCl7cmV0dXJuIHRoaXMuYXR0YWNoU2hhZG93KHRoaXMuY29uc3RydWN0b3Iuc2hhZG93Um9vdE9wdGlvbnMpfWFkb3B0U3R5bGVzKCl7Y29uc3QgdD10aGlzLmNvbnN0cnVjdG9yLl9zdHlsZXM7MCE9PXQubGVuZ3RoJiYodm9pZCAwPT09d2luZG93LlNoYWR5Q1NTfHx3aW5kb3cuU2hhZHlDU1MubmF0aXZlU2hhZG93P1ZYdD90aGlzLnJlbmRlclJvb3QuYWRvcHRlZFN0eWxlU2hlZXRzPXQubWFwKCh0PT50IGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldD90OnQuc3R5bGVTaGVldCkpOnRoaXMuX25lZWRzU2hpbUFkb3B0ZWRTdHlsZVNoZWV0cz0hMDp3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0ucHJlcGFyZUFkb3B0ZWRDc3NUZXh0KHQubWFwKCh0PT50LmNzc1RleHQpKSx0aGlzLmxvY2FsTmFtZSkpfWNvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLmhhc1VwZGF0ZWQmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLnN0eWxlRWxlbWVudCh0aGlzKX11cGRhdGUodCl7Y29uc3QgZT10aGlzLnJlbmRlcigpO3N1cGVyLnVwZGF0ZSh0KSxlIT09V1h0JiZ0aGlzLmNvbnN0cnVjdG9yLnJlbmRlcihlLHRoaXMucmVuZGVyUm9vdCx7c2NvcGVOYW1lOnRoaXMubG9jYWxOYW1lLGV2ZW50Q29udGV4dDp0aGlzfSksdGhpcy5fbmVlZHNTaGltQWRvcHRlZFN0eWxlU2hlZXRzJiYodGhpcy5fbmVlZHNTaGltQWRvcHRlZFN0eWxlU2hlZXRzPSExLHRoaXMuY29uc3RydWN0b3IuX3N0eWxlcy5mb3JFYWNoKCh0PT57Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2UudGV4dENvbnRlbnQ9dC5jc3NUZXh0LHRoaXMucmVuZGVyUm9vdC5hcHBlbmRDaGlsZChlKX0pKSl9cmVuZGVyKCl7cmV0dXJuIFdYdH19cVh0LmZpbmFsaXplZD0hMCxxWHQucmVuZGVyPSh0LGUsbik9PntpZighbnx8Im9iamVjdCIhPXR5cGVvZiBufHwhbi5zY29wZU5hbWUpdGhyb3cgbmV3IEVycm9yKCJUaGUgYHNjb3BlTmFtZWAgb3B0aW9uIGlzIHJlcXVpcmVkLiIpO2NvbnN0IGk9bi5zY29wZU5hbWUscj1QWHQuaGFzKGUpLG89SVh0JiYxMT09PWUubm9kZVR5cGUmJiEhZS5ob3N0LGE9byYmIXpYdC5oYXMoaSkscz1hP2RvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTplO2lmKCgodCxlLG4pPT57bGV0IGk9UFh0LmdldChlKTt2b2lkIDA9PT1pJiYobFh0KGUsZS5maXJzdENoaWxkKSxQWHQuc2V0KGUsaT1uZXcgQ1h0KE9iamVjdC5hc3NpZ24oe3RlbXBsYXRlRmFjdG9yeTprWHR9LG4pKSksaS5hcHBlbmRJbnRvKGUpKSxpLnNldFZhbHVlKHQpLGkuY29tbWl0KCl9KSh0LHMsT2JqZWN0LmFzc2lnbih7dGVtcGxhdGVGYWN0b3J5OlJYdChpKX0sbikpLGEpe2NvbnN0IHQ9UFh0LmdldChzKTtQWHQuZGVsZXRlKHMpLCgodCxlLG4pPT57elh0LmFkZCh0KTtjb25zdCBpPW4/bi5lbGVtZW50OmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIikscj1lLnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlIikse2xlbmd0aDpvfT1yO2lmKDA9PT1vKXJldHVybiB2b2lkIHdpbmRvdy5TaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGVTdHlsZXMoaSx0KTtjb25zdCBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7Zm9yKGxldCB0PTA7dDxvO3QrKyl7Y29uc3QgZT1yW3RdO2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSxhLnRleHRDb250ZW50Kz1lLnRleHRDb250ZW50fSh0PT57T1h0LmZvckVhY2goKGU9Pntjb25zdCBuPUxYdC5nZXQoTlh0KGUsdCkpO3ZvaWQgMCE9PW4mJm4ua2V5U3RyaW5nLmZvckVhY2goKHQ9Pntjb25zdHtlbGVtZW50Ontjb250ZW50OmV9fT10LG49bmV3IFNldDtBcnJheS5mcm9tKGUucXVlcnlTZWxlY3RvckFsbCgic3R5bGUiKSkuZm9yRWFjaCgodD0+e24uYWRkKHQpfSkpLHlYdCh0LG4pfSkpfSkpfSkodCk7Y29uc3Qgcz1pLmNvbnRlbnQ7bj8oZnVuY3Rpb24gbCh0LGUsbj1udWxsKXtjb25zdHtlbGVtZW50Ontjb250ZW50Oml9LHBhcnRzOnJ9PXQ7aWYobnVsbD09bilyZXR1cm4gdm9pZCBpLmFwcGVuZENoaWxkKGUpO2NvbnN0IG89ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihpLDEzMyxudWxsLCExKTtsZXQgYT1iWHQocikscz0wLGw9LTE7Zm9yKDtvLm5leHROb2RlKCk7KWZvcihsKyssby5jdXJyZW50Tm9kZT09PW4mJihzPXZYdChlKSxuLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsbikpOy0xIT09YSYmclthXS5pbmRleD09PWw7KXtpZihzPjApe2Zvcig7LTEhPT1hOylyW2FdLmluZGV4Kz1zLGE9Ylh0KHIsYSk7cmV0dXJufWE9Ylh0KHIsYSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgICAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgICogVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgICogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgICAqIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgICovKShuLGEscy5maXJzdENoaWxkKTpzLmluc2VydEJlZm9yZShhLHMuZmlyc3RDaGlsZCksd2luZG93LlNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZVN0eWxlcyhpLHQpO2NvbnN0IGM9cy5xdWVyeVNlbGVjdG9yKCJzdHlsZSIpO2lmKHdpbmRvdy5TaGFkeUNTUy5uYXRpdmVTaGFkb3cmJm51bGwhPT1jKWUuaW5zZXJ0QmVmb3JlKGMuY2xvbmVOb2RlKCEwKSxlLmZpcnN0Q2hpbGQpO2Vsc2UgaWYobil7cy5pbnNlcnRCZWZvcmUoYSxzLmZpcnN0Q2hpbGQpO2NvbnN0IHQ9bmV3IFNldDt0LmFkZChhKSx5WHQobix0KX19KShpLHMsdC52YWx1ZSBpbnN0YW5jZW9mIE1YdD90LnZhbHVlLnRlbXBsYXRlOnZvaWQgMCksbFh0KGUsZS5maXJzdENoaWxkKSxlLmFwcGVuZENoaWxkKHMpLFBYdC5zZXQoZSx0KX0hciYmbyYmd2luZG93LlNoYWR5Q1NTLnN0eWxlRWxlbWVudChlLmhvc3QpfSxxWHQuc2hhZG93Um9vdE9wdGlvbnM9e21vZGU6Im9wZW4ifTtsZXQgWVh0PTA7Y29uc3QgWFh0PXt9LCRYdD0odCxlLG4pPT57Y29uc3QgaT1uJiZuLm1vZHVsZUlkfHwiY3VzdG9tLXN0eWxlLW1vZHVsZS0iK1lYdCsrO0FycmF5LmlzQXJyYXkoZSl8fChlPWU/W2VdOltdKSxlLmZvckVhY2goKHQ9PntpZighKHQgaW5zdGFuY2VvZiBqWHQpKXRocm93IG5ldyBFcnJvcigiQW4gaXRlbSBpbiBzdHlsZXMgaXMgbm90IG9mIHR5cGUgQ1NTUmVzdWx0LiBVc2UgYHVuc2FmZUNTU2Agb3IgYGNzc2AuIik7aWYoIVhYdFt0XSl7Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkb20tbW9kdWxlIik7ZS5pbm5lckhUTUw9YFxuICAgICAgICA8dGVtcGxhdGU+XG4gICAgICAgICAgPHN0eWxlPiR7dC50b1N0cmluZygpfTwvc3R5bGU+XG4gICAgICAgIDwvdGVtcGxhdGU+XG4gICAgICBgO2NvbnN0IG49ImN1c3RvbS1zdHlsZS1tb2R1bGUtIitZWHQrKztlLnJlZ2lzdGVyKG4pLFhYdFt0XT1ufX0pKTtjb25zdCByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRvbS1tb2R1bGUiKTtpZih0KXtjb25zdCBlPWN1c3RvbUVsZW1lbnRzLmdldCh0KTtlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwiX19maW5hbGl6ZWQiKSYmY29uc29sZS53YXJuKGBUaGUgY3VzdG9tIGVsZW1lbnQgZGVmaW5pdGlvbiBmb3IgIiR7dH0iXG4gICAgICB3YXMgZmluYWxpemVkIGJlZm9yZSBhIHN0eWxlIG1vZHVsZSB3YXMgcmVnaXN0ZXJlZC5cbiAgICAgIE1ha2Ugc3VyZSB0byBhZGQgY29tcG9uZW50IHNwZWNpZmljIHN0eWxlIG1vZHVsZXMgYmVmb3JlXG4gICAgICBpbXBvcnRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY3VzdG9tIGVsZW1lbnQuYCksci5zZXRBdHRyaWJ1dGUoInRoZW1lLWZvciIsdCl9ci5pbm5lckhUTUw9YFxuICAgIDx0ZW1wbGF0ZT5cbiAgICAgICR7KG4mJm4uaW5jbHVkZXx8W10pLm1hcCgodD0+YDxzdHlsZSBpbmNsdWRlPSR7dH0+PC9zdHlsZT5gKSl9XG4gICAgICAke2UubWFwKCh0PT5gPHN0eWxlIGluY2x1ZGU9JHtYWHRbdF19Pjwvc3R5bGU+YCkpfVxuICAgIDwvdGVtcGxhdGU+XG4gIGAsci5yZWdpc3RlcihpKX07Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovCmNsYXNzIEtYdCBleHRlbmRzIEhUTUxFbGVtZW50e3N0YXRpYyBnZXQgdmVyc2lvbigpe3JldHVybiIyMC4wLjIifX1jdXN0b21FbGVtZW50cy5kZWZpbmUoInZhYWRpbi1sdW1vLXN0eWxlcyIsS1h0KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi8KY29uc3QgWlh0PUdYdGAKICA6aG9zdCB7CiAgICAvKiBCYXNlIChiYWNrZ3JvdW5kKSAqLwogICAgLS1sdW1vLWJhc2UtY29sb3I6ICNmZmY7CgogICAgLyogVGludCAqLwogICAgLS1sdW1vLXRpbnQtNXBjdDogaHNsYSgwLCAwJSwgMTAwJSwgMC4zKTsKICAgIC0tbHVtby10aW50LTEwcGN0OiBoc2xhKDAsIDAlLCAxMDAlLCAwLjM3KTsKICAgIC0tbHVtby10aW50LTIwcGN0OiBoc2xhKDAsIDAlLCAxMDAlLCAwLjQ0KTsKICAgIC0tbHVtby10aW50LTMwcGN0OiBoc2xhKDAsIDAlLCAxMDAlLCAwLjUpOwogICAgLS1sdW1vLXRpbnQtNDBwY3Q6IGhzbGEoMCwgMCUsIDEwMCUsIDAuNTcpOwogICAgLS1sdW1vLXRpbnQtNTBwY3Q6IGhzbGEoMCwgMCUsIDEwMCUsIDAuNjQpOwogICAgLS1sdW1vLXRpbnQtNjBwY3Q6IGhzbGEoMCwgMCUsIDEwMCUsIDAuNyk7CiAgICAtLWx1bW8tdGludC03MHBjdDogaHNsYSgwLCAwJSwgMTAwJSwgMC43Nyk7CiAgICAtLWx1bW8tdGludC04MHBjdDogaHNsYSgwLCAwJSwgMTAwJSwgMC44NCk7CiAgICAtLWx1bW8tdGludC05MHBjdDogaHNsYSgwLCAwJSwgMTAwJSwgMC45KTsKICAgIC0tbHVtby10aW50OiAjZmZmOwoKICAgIC8qIFNoYWRlICovCiAgICAtLWx1bW8tc2hhZGUtNXBjdDogaHNsYSgyMTQsIDYxJSwgMjUlLCAwLjA1KTsKICAgIC0tbHVtby1zaGFkZS0xMHBjdDogaHNsYSgyMTQsIDU3JSwgMjQlLCAwLjEpOwogICAgLS1sdW1vLXNoYWRlLTIwcGN0OiBoc2xhKDIxNCwgNTMlLCAyMyUsIDAuMTYpOwogICAgLS1sdW1vLXNoYWRlLTMwcGN0OiBoc2xhKDIxNCwgNTAlLCAyMiUsIDAuMjYpOwogICAgLS1sdW1vLXNoYWRlLTQwcGN0OiBoc2xhKDIxNCwgNDclLCAyMSUsIDAuMzgpOwogICAgLS1sdW1vLXNoYWRlLTUwcGN0OiBoc2xhKDIxNCwgNDUlLCAyMCUsIDAuNSk7CiAgICAtLWx1bW8tc2hhZGUtNjBwY3Q6IGhzbGEoMjE0LCA0MyUsIDE5JSwgMC42MSk7CiAgICAtLWx1bW8tc2hhZGUtNzBwY3Q6IGhzbGEoMjE0LCA0MiUsIDE4JSwgMC43Mik7CiAgICAtLWx1bW8tc2hhZGUtODBwY3Q6IGhzbGEoMjE0LCA0MSUsIDE3JSwgMC44Myk7CiAgICAtLWx1bW8tc2hhZGUtOTBwY3Q6IGhzbGEoMjE0LCA0MCUsIDE2JSwgMC45NCk7CiAgICAtLWx1bW8tc2hhZGU6IGhzbCgyMTQsIDM1JSwgMTUlKTsKCiAgICAvKiBDb250cmFzdCAqLwogICAgLS1sdW1vLWNvbnRyYXN0LTVwY3Q6IHZhcigtLWx1bW8tc2hhZGUtNXBjdCk7CiAgICAtLWx1bW8tY29udHJhc3QtMTBwY3Q6IHZhcigtLWx1bW8tc2hhZGUtMTBwY3QpOwogICAgLS1sdW1vLWNvbnRyYXN0LTIwcGN0OiB2YXIoLS1sdW1vLXNoYWRlLTIwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC0zMHBjdDogdmFyKC0tbHVtby1zaGFkZS0zMHBjdCk7CiAgICAtLWx1bW8tY29udHJhc3QtNDBwY3Q6IHZhcigtLWx1bW8tc2hhZGUtNDBwY3QpOwogICAgLS1sdW1vLWNvbnRyYXN0LTUwcGN0OiB2YXIoLS1sdW1vLXNoYWRlLTUwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC02MHBjdDogdmFyKC0tbHVtby1zaGFkZS02MHBjdCk7CiAgICAtLWx1bW8tY29udHJhc3QtNzBwY3Q6IHZhcigtLWx1bW8tc2hhZGUtNzBwY3QpOwogICAgLS1sdW1vLWNvbnRyYXN0LTgwcGN0OiB2YXIoLS1sdW1vLXNoYWRlLTgwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC05MHBjdDogdmFyKC0tbHVtby1zaGFkZS05MHBjdCk7CiAgICAtLWx1bW8tY29udHJhc3Q6IHZhcigtLWx1bW8tc2hhZGUpOwoKICAgIC8qIFRleHQgKi8KICAgIC0tbHVtby1oZWFkZXItdGV4dC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdCk7CiAgICAtLWx1bW8tYm9keS10ZXh0LWNvbG9yOiB2YXIoLS1sdW1vLWNvbnRyYXN0LTkwcGN0KTsKICAgIC0tbHVtby1zZWNvbmRhcnktdGV4dC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC03MHBjdCk7CiAgICAtLWx1bW8tdGVydGlhcnktdGV4dC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC01MHBjdCk7CiAgICAtLWx1bW8tZGlzYWJsZWQtdGV4dC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0zMHBjdCk7CgogICAgLyogUHJpbWFyeSAqLwogICAgLS1sdW1vLXByaW1hcnktY29sb3I6IGhzbCgyMTQsIDkwJSwgNTIlKTsKICAgIC0tbHVtby1wcmltYXJ5LWNvbG9yLTUwcGN0OiBoc2xhKDIxNCwgOTAlLCA1MiUsIDAuNSk7CiAgICAtLWx1bW8tcHJpbWFyeS1jb2xvci0xMHBjdDogaHNsYSgyMTQsIDkwJSwgNTIlLCAwLjEpOwogICAgLS1sdW1vLXByaW1hcnktdGV4dC1jb2xvcjogdmFyKC0tbHVtby1wcmltYXJ5LWNvbG9yKTsKICAgIC0tbHVtby1wcmltYXJ5LWNvbnRyYXN0LWNvbG9yOiAjZmZmOwoKICAgIC8qIEVycm9yICovCiAgICAtLWx1bW8tZXJyb3ItY29sb3I6IGhzbCgzLCAxMDAlLCA2MSUpOwogICAgLS1sdW1vLWVycm9yLWNvbG9yLTUwcGN0OiBoc2xhKDMsIDEwMCUsIDYwJSwgMC41KTsKICAgIC0tbHVtby1lcnJvci1jb2xvci0xMHBjdDogaHNsYSgzLCAxMDAlLCA2MCUsIDAuMSk7CiAgICAtLWx1bW8tZXJyb3ItdGV4dC1jb2xvcjogaHNsKDMsIDkyJSwgNTMlKTsKICAgIC0tbHVtby1lcnJvci1jb250cmFzdC1jb2xvcjogI2ZmZjsKCiAgICAvKiBTdWNjZXNzICovCiAgICAtLWx1bW8tc3VjY2Vzcy1jb2xvcjogaHNsKDE0NSwgODAlLCA0MiUpOyAvKiBoc2woMTQ0LDgyJSwzNyUpOyAqLwogICAgLS1sdW1vLXN1Y2Nlc3MtY29sb3ItNTBwY3Q6IGhzbGEoMTQ1LCA3NiUsIDQ0JSwgMC41NSk7CiAgICAtLWx1bW8tc3VjY2Vzcy1jb2xvci0xMHBjdDogaHNsYSgxNDUsIDc2JSwgNDQlLCAwLjEyKTsKICAgIC0tbHVtby1zdWNjZXNzLXRleHQtY29sb3I6IGhzbCgxNDUsIDEwMCUsIDMyJSk7CiAgICAtLWx1bW8tc3VjY2Vzcy1jb250cmFzdC1jb2xvcjogI2ZmZjsKICB9CmAsSlh0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7Slh0LmlubmVySFRNTD1gPHN0eWxlPiR7Wlh0LnRvU3RyaW5nKCkucmVwbGFjZSgiOmhvc3QiLCJodG1sIil9PC9zdHlsZT5gLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoSlh0LmNvbnRlbnQpLCRYdCgiIixHWHRgCiAgW3RoZW1lfj0nZGFyayddIHsKICAgIC8qIEJhc2UgKGJhY2tncm91bmQpICovCiAgICAtLWx1bW8tYmFzZS1jb2xvcjogaHNsKDIxNCwgMzUlLCAyMSUpOwoKICAgIC8qIFRpbnQgKi8KICAgIC0tbHVtby10aW50LTVwY3Q6IGhzbGEoMjE0LCA2NSUsIDg1JSwgMC4wNik7CiAgICAtLWx1bW8tdGludC0xMHBjdDogaHNsYSgyMTQsIDYwJSwgODAlLCAwLjE0KTsKICAgIC0tbHVtby10aW50LTIwcGN0OiBoc2xhKDIxNCwgNjQlLCA4MiUsIDAuMjMpOwogICAgLS1sdW1vLXRpbnQtMzBwY3Q6IGhzbGEoMjE0LCA2OSUsIDg0JSwgMC4zMik7CiAgICAtLWx1bW8tdGludC00MHBjdDogaHNsYSgyMTQsIDczJSwgODYlLCAwLjQxKTsKICAgIC0tbHVtby10aW50LTUwcGN0OiBoc2xhKDIxNCwgNzglLCA4OCUsIDAuNSk7CiAgICAtLWx1bW8tdGludC02MHBjdDogaHNsYSgyMTQsIDgyJSwgOTAlLCAwLjYpOwogICAgLS1sdW1vLXRpbnQtNzBwY3Q6IGhzbGEoMjE0LCA4NyUsIDkyJSwgMC43KTsKICAgIC0tbHVtby10aW50LTgwcGN0OiBoc2xhKDIxNCwgOTElLCA5NCUsIDAuOCk7CiAgICAtLWx1bW8tdGludC05MHBjdDogaHNsYSgyMTQsIDk2JSwgOTYlLCAwLjkpOwogICAgLS1sdW1vLXRpbnQ6IGhzbCgyMTQsIDEwMCUsIDk4JSk7CgogICAgLyogU2hhZGUgKi8KICAgIC0tbHVtby1zaGFkZS01cGN0OiBoc2xhKDIxNCwgMCUsIDAlLCAwLjA3KTsKICAgIC0tbHVtby1zaGFkZS0xMHBjdDogaHNsYSgyMTQsIDQlLCAyJSwgMC4xNSk7CiAgICAtLWx1bW8tc2hhZGUtMjBwY3Q6IGhzbGEoMjE0LCA4JSwgNCUsIDAuMjMpOwogICAgLS1sdW1vLXNoYWRlLTMwcGN0OiBoc2xhKDIxNCwgMTIlLCA2JSwgMC4zMik7CiAgICAtLWx1bW8tc2hhZGUtNDBwY3Q6IGhzbGEoMjE0LCAxNiUsIDglLCAwLjQxKTsKICAgIC0tbHVtby1zaGFkZS01MHBjdDogaHNsYSgyMTQsIDIwJSwgMTAlLCAwLjUpOwogICAgLS1sdW1vLXNoYWRlLTYwcGN0OiBoc2xhKDIxNCwgMjQlLCAxMiUsIDAuNik7CiAgICAtLWx1bW8tc2hhZGUtNzBwY3Q6IGhzbGEoMjE0LCAyOCUsIDEzJSwgMC43KTsKICAgIC0tbHVtby1zaGFkZS04MHBjdDogaHNsYSgyMTQsIDMyJSwgMTMlLCAwLjgpOwogICAgLS1sdW1vLXNoYWRlLTkwcGN0OiBoc2xhKDIxNCwgMzMlLCAxMyUsIDAuOSk7CiAgICAtLWx1bW8tc2hhZGU6IGhzbCgyMTQsIDMzJSwgMTMlKTsKCiAgICAvKiBDb250cmFzdCAqLwogICAgLS1sdW1vLWNvbnRyYXN0LTVwY3Q6IHZhcigtLWx1bW8tdGludC01cGN0KTsKICAgIC0tbHVtby1jb250cmFzdC0xMHBjdDogdmFyKC0tbHVtby10aW50LTEwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC0yMHBjdDogdmFyKC0tbHVtby10aW50LTIwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC0zMHBjdDogdmFyKC0tbHVtby10aW50LTMwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC00MHBjdDogdmFyKC0tbHVtby10aW50LTQwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC01MHBjdDogdmFyKC0tbHVtby10aW50LTUwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC02MHBjdDogdmFyKC0tbHVtby10aW50LTYwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC03MHBjdDogdmFyKC0tbHVtby10aW50LTcwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC04MHBjdDogdmFyKC0tbHVtby10aW50LTgwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC05MHBjdDogdmFyKC0tbHVtby10aW50LTkwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdDogdmFyKC0tbHVtby10aW50KTsKCiAgICAvKiBUZXh0ICovCiAgICAtLWx1bW8taGVhZGVyLXRleHQtY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QpOwogICAgLS1sdW1vLWJvZHktdGV4dC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC05MHBjdCk7CiAgICAtLWx1bW8tc2Vjb25kYXJ5LXRleHQtY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QtNzBwY3QpOwogICAgLS1sdW1vLXRlcnRpYXJ5LXRleHQtY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QtNTBwY3QpOwogICAgLS1sdW1vLWRpc2FibGVkLXRleHQtY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QtMzBwY3QpOwoKICAgIC8qIFByaW1hcnkgKi8KICAgIC0tbHVtby1wcmltYXJ5LWNvbG9yOiBoc2woMjE0LCA4NiUsIDU1JSk7CiAgICAtLWx1bW8tcHJpbWFyeS1jb2xvci01MHBjdDogaHNsYSgyMTQsIDg2JSwgNTUlLCAwLjUpOwogICAgLS1sdW1vLXByaW1hcnktY29sb3ItMTBwY3Q6IGhzbGEoMjE0LCA5MCUsIDYzJSwgMC4xKTsKICAgIC0tbHVtby1wcmltYXJ5LXRleHQtY29sb3I6IGhzbCgyMTQsIDEwMCUsIDcwJSk7CiAgICAtLWx1bW8tcHJpbWFyeS1jb250cmFzdC1jb2xvcjogI2ZmZjsKCiAgICAvKiBFcnJvciAqLwogICAgLS1sdW1vLWVycm9yLWNvbG9yOiBoc2woMywgOTAlLCA2MyUpOwogICAgLS1sdW1vLWVycm9yLWNvbG9yLTUwcGN0OiBoc2xhKDMsIDkwJSwgNjMlLCAwLjUpOwogICAgLS1sdW1vLWVycm9yLWNvbG9yLTEwcGN0OiBoc2xhKDMsIDkwJSwgNjMlLCAwLjEpOwogICAgLS1sdW1vLWVycm9yLXRleHQtY29sb3I6IGhzbCgzLCAxMDAlLCA2NyUpOwoKICAgIC8qIFN1Y2Nlc3MgKi8KICAgIC0tbHVtby1zdWNjZXNzLWNvbG9yOiBoc2woMTQ1LCA2NSUsIDQyJSk7CiAgICAtLWx1bW8tc3VjY2Vzcy1jb2xvci01MHBjdDogaHNsYSgxNDUsIDY1JSwgNDIlLCAwLjUpOwogICAgLS1sdW1vLXN1Y2Nlc3MtY29sb3ItMTBwY3Q6IGhzbGEoMTQ1LCA2NSUsIDQyJSwgMC4xKTsKICAgIC0tbHVtby1zdWNjZXNzLXRleHQtY29sb3I6IGhzbCgxNDUsIDg1JSwgNDclKTsKICB9CgogIGh0bWwgewogICAgY29sb3I6IHZhcigtLWx1bW8tYm9keS10ZXh0LWNvbG9yKTsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tYmFzZS1jb2xvcik7CiAgfQoKICBbdGhlbWV+PSdkYXJrJ10gewogICAgY29sb3I6IHZhcigtLWx1bW8tYm9keS10ZXh0LWNvbG9yKTsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tYmFzZS1jb2xvcik7CiAgfQoKICBoMSwKICBoMiwKICBoMywKICBoNCwKICBoNSwKICBoNiB7CiAgICBjb2xvcjogdmFyKC0tbHVtby1oZWFkZXItdGV4dC1jb2xvcik7CiAgfQoKICBhIHsKICAgIGNvbG9yOiB2YXIoLS1sdW1vLXByaW1hcnktdGV4dC1jb2xvcik7CiAgfQoKICBibG9ja3F1b3RlIHsKICAgIGNvbG9yOiB2YXIoLS1sdW1vLXNlY29uZGFyeS10ZXh0LWNvbG9yKTsKICB9CgogIGNvZGUsCiAgcHJlIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QtMTBwY3QpOwogICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbHVtby1ib3JkZXItcmFkaXVzLW0pOwogIH0KYCx7bW9kdWxlSWQ6Imx1bW8tY29sb3IifSksJFh0KCIiLEdYdGAKICA6aG9zdCB7CiAgICBjb2xvcjogdmFyKC0tbHVtby1ib2R5LXRleHQtY29sb3IpICFpbXBvcnRhbnQ7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1sdW1vLWJhc2UtY29sb3IpICFpbXBvcnRhbnQ7CiAgfQpgLHttb2R1bGVJZDoibHVtby1jb2xvci1sZWdhY3kiLGluY2x1ZGU6WyJsdW1vLWNvbG9yIl19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi8KY29uc3QgUVh0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7UVh0LmlubmVySFRNTD0nXG4gIDxzdHlsZT5cbiAgICBAZm9udC1mYWNlIHtcbiAgICAgIGZvbnQtZmFtaWx5OiBcJ2x1bW8taWNvbnNcJztcbiAgICAgIHNyYzogdXJsKGRhdGE6YXBwbGljYXRpb24vZm9udC13b2ZmO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdSZ0FCQUFBQUFCRWNBQXNBQUFBQUlpd0FBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCSFUxVkNBQUFCQ0FBQUFEc0FBQUJVSUlzbGVrOVRMeklBQUFGRUFBQUFRd0FBQUZaQUlVdUtZMjFoY0FBQUFZZ0FBQUQ0QUFBRHJzQ1U4ZDVuYkhsbUFBQUNnQUFBQzJNQUFCZDRoOVRvMldobFlXUUFBQTNrQUFBQU1BQUFBRFphLzZTc2FHaGxZUUFBRGhRQUFBQWRBQUFBSkFicEEzNW9iWFI0QUFBT05BQUFBQkFBQUFDc3BCQUFBR3h2WTJFQUFBNUVBQUFBV0FBQUFGaDU1SUFzYldGNGNBQUFEcHdBQUFBZkFBQUFJQUZLQVhCdVlXMWxBQUFPdkFBQUFURUFBQUl1VVVKWkNIQnZjM1FBQUEvd0FBQUJLd0FBQWVsbThTelZlSnhqWUdSZ1lPQmlNR0N3WTJCeWNmTUpZZURMU1N6Slk1QmlZR0dBQUpBOE1wc3hKek05a1lFRHhnUEtzWUJwRGlCbWc0Z0NBQ1k3QlVnQWVKeGpZR1MreURpQmdaV0JnYW1LYVE4REEwTVBoR1o4d0dESXlBUVVaV0JsWnNBS0F0SmNVeGdjWGpHKzBtSU8rcC9GRU1VY3hEQU5LTXdJa2dNQUJuOE1MUUI0bk8zU1dXNkRNQUJGMFV0d0NFbklQTS96aExLOExxaGZYUnliU1AxNFhVWXRIVjloR1lRd1FCTklvM2NVSVBraFFlTTdyaWIxZWtxblhnOTgxWHVDMXF2eTg0bHpvamxlaDNwdXhMMGhQakdqUlU0NzN0ZWxvRWVmQVVOR2pKa3daY2FjQlV0V3JObXdaY2VlQTBkT25MbHc1Y2FkQjA5ZWxQR2hHZitqME5USS82NUtmWGVyVDZKaHFLbnBSS3RnT3B1cWFUcnRLalBVbHFIbWh0bzIxSTdwTDZpNmhscVkzcTdxR1dyZlVBZUdPalRVa2FHT0RYVmlxRk5EblJucTNGQVhocm8wMUpXaHJnMTFZNmhiUTkwWjZ0NVFENFo2Tk5TVG9aNE45V0tvVjBPOUdlcmRVQitHK2pUVWw2R1dSdmtMMjRCa0VYaWN0Vmg5YkZ2VkZiL254dmJ6KzdSZi9ONnpIY2QyYkNmUCtXZ2MxWjlOMGpwTm5FTDZrYlJWUzZIQTJoUVlHaDlUR1IxQ2JDcWEyclhyV09rUUUvc0hOSmdtdFp2b1ZOWnFFMUIxRE5IeHpUUXhDZWhVVFlpSlRReUVOdWkwcVNMZXpyM1BkdXlRZmdtUldPZmRlOCs5NTUxejdybm4vTzRqTG9KL2JSUDBVYUtRTUxGSmpwQkF2cGhMWkMzRGswb2s3V0J6UjIvdXBKczdSeXcvbmZGYmxuL3V1Ti9hcEN2d3JLTHJTdlVxUnVmYm01cG4wZnMwdzRnWXhuR1ZQNnFIbk80YldpRFFHUWd3dFM2bG0zbEIzUW9YMU0ydndFbXV6aXJGMzl5K0VzMitESjhkMXBreXFCSXFvemUzRDErWno0RHJGb2F6eEk4ZFd3TXJEbFoyRE1xUUFSOUFST3NKVSsyY21sVFBhelRjbzUyRjF4VGEyYTIrSzh2dnE5MmRWSG10TG9QZVFYL0FaUFJZR3RoRFlPZVpqQmpLb0ZzVkd1bFIzbFdVOTVXZUNLNDRxSFU3TWhXVUdVS1pEVDNvS1VjRzJHV3VoK0VERGZVWUEvamhBaGwwVE9zSk5ZU0V1N21RbWkzVXpmWHdaS0E0QnNWc0hMWFFZR2dSVzk1dUV0cEoxVmZuOVhpTHJpUkJsRkVxeHNEakEwOXlDTlVvUXh4d2Q3S1dTVHQyeTNHVEtpZmxxSFJTb1daYzNtMTFXYS9mSmRGZ1hENHNTWWZsZUpCS2Q4R016N0o4ZFpuL2NHUkNjS0dEbkEyR2UzZkt6Y3ZsblRETnRoR1dMWHpYL1dhWHRVQW1SZ2VMbEhTcjMwcjBHOVVUWE1iMEF0bXd6T295NzNma1NsSFprZHV3L1RZdVU5Y0FENFl1dFBveFRUc0EzNzk3d1ZyNFovMU5DNXpBUkhyNHZ0eEpqeElmaVpNaE1rYldrKzE0Qm5KWkt3cUdad0Rmc3dMeXhXRFNnMTFyRkxKRjdOb3B4amQxaDEvUU9UK29lemdmdTNZcStIaytkdWY1eCs0MG8xR1RrYUlnaWtLL0lFbkM2YVl4Q1VCYVpKU040WFRZRmpVL1lNTklLcUp3aERHT0NDSThGRFhuWG1YanRHaEdKeVNocWpBT25CT2tXMkpHOVM3R2dZZU1XQVU1SnpobldtQk9hT00rQ0tFUG9xU2ZGREMyVW5xK0RMbFVnVVZVRkZMWkdKZzZqdGxvanNkc2E4a1BPYlB1SmRpNWRuQmRCc0xKTUdUV0RhNHQySnZ0d3VQbzlzK1k4NnN1di9XMzNRRzFyQWFPQVVWK3Z4NEs2ZjJEMDRQVktsQzdXTFNyWnpBaTQ1WlY2bElDN1dvWHFtUnl2VXFvVndyelVvVnNJamVUWFdRditSSDVHVGxCWGlCL0luOGxuMEliQkNBRk9hakFKcmdaWXlPSFdxT2ZVZS9hSGpJMTJSNk9RbzFqQ2d0MjE1bCs0ZjZYUGIrME1Ob3UwVis0M24yRjc3dFNmUmIyNGQ3eml0Z25LbXZZSHM2OXp1Z2FQdkJ3djZpb1hrYjJMZEw2NUF0dzUxdUxrWGx1MWJoTU1SY1hTUGNZb3FLSVJsaDM0bFFQOC81SmJ1VUZ5ZTR2eEQ2LzZNeEZGMTFDMHVWTHI5VWxndzQ0dFMzcE1WaU5MVUV4YnljRmdMSWN0K1FETWliUmlteDF5ZFV6OEZYWml1T0lEQk9NVlgyblVaYytodU5FNVhVSjgxdWlKb2lhYndxYVZGMHVhY0tiYXUvcGw0UjJWVzBYWGxKcmE2Ym9WcllHNjQ2VEY1Tll6d3k0dmpFTlZyRGxjTnBaUGw4REg2WFg4WFdDeDBtdldWWlk2S0ZMcnZzWTY2L3pQaWN0NUZueGFOVVIvanV2WkNNM1R2RDYwRTJXMXRaaXpiWFRQRHVhYmNtMG5iYnpwV0twbUExYXlCUThnaWVkTFVNK0Ewa05qQmpRam11WXo3WXJnSVhZdm1GNjNaTEJ3U1hycG45VGI5d3dkZC9VMUgwUE1RSzNYY084dWwzV1Q3UHlQUGRweTBUZW1LeE5SY0pOYXVpWEpublVEcFVwcFFXczRTblVJeTBFRVNHWXFKWVFMR0h4emFHV3dWSWFTNlk3bVFGTThaallEUTNheGpmNjFTV2pVMzNKd09aQTFwd2FHMUw5bXpmNzFhSFJkWDFKSHc2RnAwYVhoTndicXllR05nNE5iZHpHQ0J4b3o0WlhqeTROdTY5WnI2c0RZNnZNckxVNW5BMVA4SmtiZFdYSjZFUmZNcnl2TmgxSmZROStUNGRJaEd2Szl3M2R4akJCemF0c1EvTWxPSFZJRG5ZcER6Nm9kQVhsUTAxdDJQYTVJYWZkOE1NcHhBZURLUDBDNkNqZ1ZMVDVvc0I2aWNVeDAxbFdqWHh6VC9HeVJGMndlbEVNNVovN2pHM1ZqUTFTck5uNUlieXpPRzVkb2JCMy9RSHh5WnZzWGNvejhJb0V3UzdwbENnK3p4SFFrNDI0cTlCZkVwa0VTSmJGSFF1c0RCU1dGa3VCa29QTzBrTEt3UlZZanhHWGxIVGNURFFNSi9INlRYOWFma083bW5yYVRPMWZlVG5aQVhMdTRjcDdIQVhNbU5HMXllRms5VGdTL05IaFpSLzRRb0JUci9aQis2aENneWwxNU5xMVViTjZuRTEvWm5QMVUyY2l6Q0JwdnM4Y0pRWko0TGtZeDVOL3laUEFVWk5RUTBWNGYzQlFsbFdySzNZUnpsMzBkT1Q2UlZuMnVwTnVyNndvU2E4Q3FwZFQvYUtuQk00bzNqTnVyOWQ5eHF0VVQ2dmVCRXQ5Q2E5YXQrRVJ6RUVoVWtSOHNhNW1RNGFWdkpvVmVFQTh6STRlaTVtVUxYRkd5VTd6LzZUQWVZTFZjcHpTV1pZOFBZWUY1eXJUVjYwc1QwK1hWMTQxdlgrK1dmMTZWMmJGZUdWUFpYeEZwa3Z5ZUtUV0xsemZXMG1uS3hzWTZZMzI5NC8wOTk4U0NmWDFibG01cGJjdkZHbHEvcjA3TVJBTWhZSURpVzVKRktXVzN2ZHJFcENzWlNKRytvbTdadS9QU1NjWkpoTmtMYm1XNVdzcjEycFdxVzV6S3Rsd1JTNGJGT3hVdzE3bUN6eTZsc2tDRGwxV1lPR1dEWXJBRHJNQTdCRER3ZVdXTmQ1a29pSm5SMWR6K3l0TFAycTBTcVBCMWxuSzJjY0I3UlllNEZTb1BrczNpQjN0NHR4VFNIY3RiMnN5MWl2azBwdkh1Q05tNncxZjZ3eHYzK09DZ043OExxZFFuVVZoN1Iwb1RBcDB6T2YycmJXNzcwVnU1QzJkSXlHZFRuSG84elNqaTdkcHBqMFVTb1ZDeitsaFJNVGg1M1RlcTlWYkdmYmp1U2JBb29TZFhheVk0UFlIZzM3NEM2ZjdnbDFCL0RYdUo0L1FYeE9CZEpGSnNwRnNJM2VncG9XVVVDamxUSUZuTllObCtaeVpLbUJlWUtHSGtEMVF5RGxoYUtiS3dLY0lKcUo0VExKMk9tZFkvSldYYWU0RGRHQnc4SFo3ZVhjZ0ZGMnpyMlNvYWxEcnk1aUtxb2EwUHVoZTNoUFEyczNlbFRZTStNSStuM3JLMEtnTDcvTGEzR2VNTHQ2bTd1OTEydkdudnRPUmlJYTBxQm1ocVZpK1hXOVhOQm1xYjhlVmdLeklIZkdJNWJOb0c3WDBVQ3plSVNtcUljTy9uWThGSDdVOGF2WDlmeC9TVCtoeDBzZXpQdzlReThNdW0zR1dmMk40VXkveUlZR1ZCWGJKSFdJWnA3ZGZUY3B0ZE1UcjlRbXE3RGFpSy91a3FDTDRrdDRSVWZTNVhQbk10bVQyMi9tUUZxRjdlbVNxdHJsdThTVkVseERSSnJaT0RrcHV3ZTBWZlRmamRFcDFmN0E3ditmb3pOQlhVSi82V1R1SzJUdEZscEZWWkFaM0xjRnZVaTFaMnAyWVQrRU1Ba0dKVlN0T3pMVEFQZzRJcVdJQWx6UlNqT0JrbDJ6eGozVEt5Y3B6VC9NbnZYM3VhU01XTStnVTBya1hqb2hoZWZWUk1hcHMzL2tMTVNLdjIzbFQyM3V4UXJrUWp5T0psZU1Ec2RoQW5ENlpHRWxXWjVNakNYekNFL2hrV1grV0Y0a256R2hWT3lLMmVRWmVrVjNleW8wekw4a3VZV0NuREN2ampoQWtjVFBPQkRYVmRvYXYzSFZjRm5Rakx2dFY5UzJwMHpBNkplZ1B3TVF4dCt5RmIzbGw5ekdscS81ZFJLYjNjRXlRWW9hTllwaGFySjd4Q0I3QVd4c0xZM2pqWlhZMFhzWmowV2p3YzlJNlBQL2RLQUJuQ1phcUhwYVpFQUN4azRaZUxaU0tOZ1pBQmwrbFlRWDFzSlFPU1gzbjZyNDEwZXZjb3VkNUplQUdVWFZQOUgxdFpPS2VqVHE0T25vMHowZXJybzFGcm5PcG9odmExZC9oVGR0VnNRZEtONVc5UmxUM05qRDBuem55S05UZ0tBTWZXTldjeW9kVjBJR0xQSUhPRjBvNEp5cXVmYUs0ejZXSUl6dUdoM2Q4Yzhjd1FnOEVSK09WeHlyamRtOHZOdWh0czRMb09paEd4SU11VWRnendpWU43eGhoMStvWm5KTnVURzdnUVp2dTRYV1o5R0FaWmpHRXVid2VQcVlodEtEVEgrOVZRa2wxNy9pR3lic25KKzgrc0t0eVByY2xsOXR5NjVac2RzdC85aXFwRUtoN001VmRCeGgzY3NPZE5jNnRXM0kxdXlNMVB6T1hlZ1NPckxGc0ZOSTJPMjdNK1RGMkFwbk45TVV2NXVkNkxqeEl2RVFuSFJ6eEl1NElzQTlNTEZrSm4ydGNab1o3T043ZFhlN3VqcmM4SHJ1c1BLYW1scVh3ZDc3bFFVdUxwaWxhdTRQVU1hcHVlQmI3aXJVNFJvVVhFWVh1VnVJR2xSR21PcCsybE5rYVJQVnppT3FtbGFadmFxRzRkRmdTajBqeEVKV3J2MTJJVVdudG13K3JmUWFyUkUwQXBoNG9jSTZubFVsR3FzK3UzLytUL2V0aFc2MlBwSHAyZUhiWnN0bmgvd09POTV5REFIaWNZMkJrWUdBQTRwbUo2UUh4L0RaZkdiaVpYd0JGR0dwVU56UWk2UCt2bWFjeTNRSnlPUmlZUUtJQU5vVUxWWGljWTJCa1lHQU8rcDhGSkY4d0FBSHpWQVpHQmxTZ0RRQlc5Z052QUFBQWVKeGpZR0JnWUg0eE5EQUF6d1FtandBQUFBQUFUZ0NhQU9nQkNnRXNBVTRCY0FHYUFjUUI3Z0lhQXB3QzZBU2FCTHdFMWdUeUJRNEZLZ1Y2QmRBRi9nWkVCbVlHdGdjWUI1QUlHQWhTQ0dvSS9nbEdDYjRKMmdvRUNqd0tnZ3E0Q3ZBTFVBdVdDN3g0bkdOZ1pHQmcwR1pNWVJCbEFBRW1JT1lDUWdhRy8yQStBd0FZbEFHOEFIaWNiWkU5VHNNd0dJYmY5QS9SU2dnRVltSHhBZ3RxK2pOMlpHajNEdDNUMUdsVE9YSGt1Qlc5QXlmZ0VCeUNnVE53Q0E3QlcvTkpsVkJ0eWQvangrOFhLd21BYTN3aHduRkU2SWIxT0JxNDRPNlBtNlFiNFJiNVFiaU5IaDZGTy9SRDRTNmVNUkh1NFJhYVQ0aGFselIzZUJWdTRBcHZ3azM2ZCtFVytVTzRqWHQ4Q25mb3Y0VzdXT0JIdUllbjZNWHNDdHZQVTF2V2M3M2VtY1NkeElrVzJ0VzVMZFVvSHA3a1RKZmFKVjZ2MVBLZzZ2MTY3SDJtTW1jTE5iV2wxOFpZVlRtNzFhbVBOOTVYazhFZ0V4K250b0RCRGdVcytzaVJzcGFvTWVmN3J1a05Fcml6aVhOdXdTN0htb2U5d2dneHYrZTU1SXpKTXFRVGVOWVYwMHNjdU5iWTgrWXhyVWZHZmNhTVpiL0NOUFFlMDRiVDBsVGhiRXVUMHNmWWhLNksvMjNBbWYzTHgrSDI0aGNqNEdTY0FBQUFlSnh0anRsdWd6QVFSYmtKVUVKSXV1Lzd2cVI4bEdOUEFjV3gwWUFiNWUvTGtsUjk2RWdlblN1ZkdZMDM4UHFLdmY5cmhnR0c4QkVneEE0aWpCQmpqQVFUVExHTFBlempBSWM0d2pGT2NJb3puT01DbDdqQ05XNXdpenZjNHdHUGVNSXpYdkNLTjd6akF6Tjhlb25RUldaU1NhWW1qdnVnNmFzZTk4aEZsdGV4TUptbVZObVYyV0J2ZE5nWlVjK3VqQVd6WFczVURudTF3NDNhc1N0SGM4R3B6QVhYL3B5MGpxVFFaSlRna2N4SkxwYUNGMGxEMzJ4TnQrNDN0QXNuMjlEZnQwMnVES1MyY2pHVU5nc2syNnFLMmxGdGhZb1UyN0lOUHFtaURxZzVnb2UwcHFSNXFTb3FNZGVrL0NVWkZ5d0w0NnJFc2lJbWxlcWlxb015dDRiYVhsdS8xR0xkTkZmNXpiY05tZHIxWVVXQ1plNDdvK3pVbWIvRG9TdGJ3M2NWc2VmOUFMamppUFFBKSBmb3JtYXQoXCd3b2ZmXCcpO1xuICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICAgIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgICB9XG5cbiAgICBodG1sIHtcbiAgICAgIC0tbHVtby1pY29ucy1hbGlnbi1jZW50ZXI6ICJcXGVhMDEiO1xuICAgICAgLS1sdW1vLWljb25zLWFsaWduLWxlZnQ6ICJcXGVhMDIiO1xuICAgICAgLS1sdW1vLWljb25zLWFsaWduLXJpZ2h0OiAiXFxlYTAzIjtcbiAgICAgIC0tbHVtby1pY29ucy1hbmdsZS1kb3duOiAiXFxlYTA0IjtcbiAgICAgIC0tbHVtby1pY29ucy1hbmdsZS1sZWZ0OiAiXFxlYTA1IjtcbiAgICAgIC0tbHVtby1pY29ucy1hbmdsZS1yaWdodDogIlxcZWEwNiI7XG4gICAgICAtLWx1bW8taWNvbnMtYW5nbGUtdXA6ICJcXGVhMDciO1xuICAgICAgLS1sdW1vLWljb25zLWFycm93LWRvd246ICJcXGVhMDgiO1xuICAgICAgLS1sdW1vLWljb25zLWFycm93LWxlZnQ6ICJcXGVhMDkiO1xuICAgICAgLS1sdW1vLWljb25zLWFycm93LXJpZ2h0OiAiXFxlYTBhIjtcbiAgICAgIC0tbHVtby1pY29ucy1hcnJvdy11cDogIlxcZWEwYiI7XG4gICAgICAtLWx1bW8taWNvbnMtYmFyLWNoYXJ0OiAiXFxlYTBjIjtcbiAgICAgIC0tbHVtby1pY29ucy1iZWxsOiAiXFxlYTBkIjtcbiAgICAgIC0tbHVtby1pY29ucy1jYWxlbmRhcjogIlxcZWEwZSI7XG4gICAgICAtLWx1bW8taWNvbnMtY2hlY2ttYXJrOiAiXFxlYTBmIjtcbiAgICAgIC0tbHVtby1pY29ucy1jaGV2cm9uLWRvd246ICJcXGVhMTAiO1xuICAgICAgLS1sdW1vLWljb25zLWNoZXZyb24tbGVmdDogIlxcZWExMSI7XG4gICAgICAtLWx1bW8taWNvbnMtY2hldnJvbi1yaWdodDogIlxcZWExMiI7XG4gICAgICAtLWx1bW8taWNvbnMtY2hldnJvbi11cDogIlxcZWExMyI7XG4gICAgICAtLWx1bW8taWNvbnMtY2xvY2s6ICJcXGVhMTQiO1xuICAgICAgLS1sdW1vLWljb25zLWNvZzogIlxcZWExNSI7XG4gICAgICAtLWx1bW8taWNvbnMtY3Jvc3M6ICJcXGVhMTYiO1xuICAgICAgLS1sdW1vLWljb25zLWRvd25sb2FkOiAiXFxlYTE3IjtcbiAgICAgIC0tbHVtby1pY29ucy1kcm9wZG93bjogIlxcZWExOCI7XG4gICAgICAtLWx1bW8taWNvbnMtZWRpdDogIlxcZWExOSI7XG4gICAgICAtLWx1bW8taWNvbnMtZXJyb3I6ICJcXGVhMWEiO1xuICAgICAgLS1sdW1vLWljb25zLWV5ZTogIlxcZWExYiI7XG4gICAgICAtLWx1bW8taWNvbnMtZXllLWRpc2FibGVkOiAiXFxlYTFjIjtcbiAgICAgIC0tbHVtby1pY29ucy1tZW51OiAiXFxlYTFkIjtcbiAgICAgIC0tbHVtby1pY29ucy1taW51czogIlxcZWExZSI7XG4gICAgICAtLWx1bW8taWNvbnMtb3JkZXJlZC1saXN0OiAiXFxlYTFmIjtcbiAgICAgIC0tbHVtby1pY29ucy1waG9uZTogIlxcZWEyMCI7XG4gICAgICAtLWx1bW8taWNvbnMtcGhvdG86ICJcXGVhMjEiO1xuICAgICAgLS1sdW1vLWljb25zLXBsYXk6ICJcXGVhMjIiO1xuICAgICAgLS1sdW1vLWljb25zLXBsdXM6ICJcXGVhMjMiO1xuICAgICAgLS1sdW1vLWljb25zLXJlZG86ICJcXGVhMjQiO1xuICAgICAgLS1sdW1vLWljb25zLXJlbG9hZDogIlxcZWEyNSI7XG4gICAgICAtLWx1bW8taWNvbnMtc2VhcmNoOiAiXFxlYTI2IjtcbiAgICAgIC0tbHVtby1pY29ucy11bmRvOiAiXFxlYTI3IjtcbiAgICAgIC0tbHVtby1pY29ucy11bm9yZGVyZWQtbGlzdDogIlxcZWEyOCI7XG4gICAgICAtLWx1bW8taWNvbnMtdXBsb2FkOiAiXFxlYTI5IjtcbiAgICAgIC0tbHVtby1pY29ucy11c2VyOiAiXFxlYTJhIjtcbiAgICB9XG4gIDwvc3R5bGU+XG4nLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoUVh0LmNvbnRlbnQpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLwpjb25zdCB0JHQ9R1h0YAogIDpob3N0IHsKICAgIC0tbHVtby1zaXplLXhzOiAxLjYyNXJlbTsKICAgIC0tbHVtby1zaXplLXM6IDEuODc1cmVtOwogICAgLS1sdW1vLXNpemUtbTogMi4yNXJlbTsKICAgIC0tbHVtby1zaXplLWw6IDIuNzVyZW07CiAgICAtLWx1bW8tc2l6ZS14bDogMy41cmVtOwoKICAgIC8qIEljb25zICovCiAgICAtLWx1bW8taWNvbi1zaXplLXM6IDEuMjVlbTsKICAgIC0tbHVtby1pY29uLXNpemUtbTogMS41ZW07CiAgICAtLWx1bW8taWNvbi1zaXplLWw6IDIuMjVlbTsKICAgIC8qIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLwogICAgLS1sdW1vLWljb24tc2l6ZTogdmFyKC0tbHVtby1pY29uLXNpemUtbSk7CiAgfQpgLGUkdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpO2UkdC5pbm5lckhUTUw9YDxzdHlsZT4ke3QkdC50b1N0cmluZygpLnJlcGxhY2UoIjpob3N0IiwiaHRtbCIpfTwvc3R5bGU+YCxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGUkdC5jb250ZW50KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi8KY29uc3QgbiR0PUdYdGAKICA6aG9zdCB7CiAgICAvKiBTcXVhcmUgKi8KICAgIC0tbHVtby1zcGFjZS14czogMC4yNXJlbTsKICAgIC0tbHVtby1zcGFjZS1zOiAwLjVyZW07CiAgICAtLWx1bW8tc3BhY2UtbTogMXJlbTsKICAgIC0tbHVtby1zcGFjZS1sOiAxLjVyZW07CiAgICAtLWx1bW8tc3BhY2UteGw6IDIuNXJlbTsKCiAgICAvKiBXaWRlICovCiAgICAtLWx1bW8tc3BhY2Utd2lkZS14czogY2FsYyh2YXIoLS1sdW1vLXNwYWNlLXhzKSAvIDIpIHZhcigtLWx1bW8tc3BhY2UteHMpOwogICAgLS1sdW1vLXNwYWNlLXdpZGUtczogY2FsYyh2YXIoLS1sdW1vLXNwYWNlLXMpIC8gMikgdmFyKC0tbHVtby1zcGFjZS1zKTsKICAgIC0tbHVtby1zcGFjZS13aWRlLW06IGNhbGModmFyKC0tbHVtby1zcGFjZS1tKSAvIDIpIHZhcigtLWx1bW8tc3BhY2UtbSk7CiAgICAtLWx1bW8tc3BhY2Utd2lkZS1sOiBjYWxjKHZhcigtLWx1bW8tc3BhY2UtbCkgLyAyKSB2YXIoLS1sdW1vLXNwYWNlLWwpOwogICAgLS1sdW1vLXNwYWNlLXdpZGUteGw6IGNhbGModmFyKC0tbHVtby1zcGFjZS14bCkgLyAyKSB2YXIoLS1sdW1vLXNwYWNlLXhsKTsKCiAgICAvKiBUYWxsICovCiAgICAtLWx1bW8tc3BhY2UtdGFsbC14czogdmFyKC0tbHVtby1zcGFjZS14cykgY2FsYyh2YXIoLS1sdW1vLXNwYWNlLXhzKSAvIDIpOwogICAgLS1sdW1vLXNwYWNlLXRhbGwtczogdmFyKC0tbHVtby1zcGFjZS1zKSBjYWxjKHZhcigtLWx1bW8tc3BhY2UtcykgLyAyKTsKICAgIC0tbHVtby1zcGFjZS10YWxsLW06IHZhcigtLWx1bW8tc3BhY2UtbSkgY2FsYyh2YXIoLS1sdW1vLXNwYWNlLW0pIC8gMik7CiAgICAtLWx1bW8tc3BhY2UtdGFsbC1sOiB2YXIoLS1sdW1vLXNwYWNlLWwpIGNhbGModmFyKC0tbHVtby1zcGFjZS1sKSAvIDIpOwogICAgLS1sdW1vLXNwYWNlLXRhbGwteGw6IHZhcigtLWx1bW8tc3BhY2UteGwpIGNhbGModmFyKC0tbHVtby1zcGFjZS14bCkgLyAyKTsKICB9CmAsaSR0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7aSR0LmlubmVySFRNTD1gPHN0eWxlPiR7biR0LnRvU3RyaW5nKCkucmVwbGFjZSgiOmhvc3QiLCJodG1sIil9PC9zdHlsZT5gLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoaSR0LmNvbnRlbnQpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLwpjb25zdCByJHQ9R1h0YAogIDpob3N0IHsKICAgIC8qIEJvcmRlciByYWRpdXMgKi8KICAgIC0tbHVtby1ib3JkZXItcmFkaXVzLXM6IDAuMjVlbTsgLyogQ2hlY2tib3gsIGJhZGdlLCBkYXRlLXBpY2tlciB5ZWFyIGluZGljYXRvciwgZXRjICovCiAgICAtLWx1bW8tYm9yZGVyLXJhZGl1cy1tOiB2YXIoLS1sdW1vLWJvcmRlci1yYWRpdXMsIDAuMjVlbSk7IC8qIEJ1dHRvbiwgdGV4dCBmaWVsZCwgbWVudSBvdmVybGF5LCBldGMgKi8KICAgIC0tbHVtby1ib3JkZXItcmFkaXVzLWw6IDAuNWVtOyAvKiBEaWFsb2csIG5vdGlmaWNhdGlvbiwgZXRjICovCiAgICAtLWx1bW8tYm9yZGVyLXJhZGl1czogMC4yNWVtOyAvKiBEZXByZWNhdGVkICovCgogICAgLyogU2hhZG93ICovCiAgICAtLWx1bW8tYm94LXNoYWRvdy14czogMCAxcHggNHB4IC0xcHggdmFyKC0tbHVtby1zaGFkZS01MHBjdCk7CiAgICAtLWx1bW8tYm94LXNoYWRvdy1zOiAwIDJweCA0cHggLTFweCB2YXIoLS1sdW1vLXNoYWRlLTIwcGN0KSwgMCAzcHggMTJweCAtMXB4IHZhcigtLWx1bW8tc2hhZGUtMzBwY3QpOwogICAgLS1sdW1vLWJveC1zaGFkb3ctbTogMCAycHggNnB4IC0xcHggdmFyKC0tbHVtby1zaGFkZS0yMHBjdCksIDAgOHB4IDI0cHggLTRweCB2YXIoLS1sdW1vLXNoYWRlLTQwcGN0KTsKICAgIC0tbHVtby1ib3gtc2hhZG93LWw6IDAgM3B4IDE4cHggLTJweCB2YXIoLS1sdW1vLXNoYWRlLTIwcGN0KSwgMCAxMnB4IDQ4cHggLTZweCB2YXIoLS1sdW1vLXNoYWRlLTQwcGN0KTsKICAgIC0tbHVtby1ib3gtc2hhZG93LXhsOiAwIDRweCAyNHB4IC0zcHggdmFyKC0tbHVtby1zaGFkZS0yMHBjdCksIDAgMThweCA2NHB4IC04cHggdmFyKC0tbHVtby1zaGFkZS00MHBjdCk7CgogICAgLyogQ2xpY2thYmxlIGVsZW1lbnQgY3Vyc29yICovCiAgICAtLWx1bW8tY2xpY2thYmxlLWN1cnNvcjogZGVmYXVsdDsKICB9CmAsbyR0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7byR0LmlubmVySFRNTD1gPHN0eWxlPiR7ciR0LnRvU3RyaW5nKCkucmVwbGFjZSgiOmhvc3QiLCJodG1sIil9PC9zdHlsZT5gLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobyR0LmNvbnRlbnQpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLwpjb25zdCBhJHQ9R1h0YAogIDpob3N0IHsKICAgIC8qIHByZXR0aWVyLWlnbm9yZSAqLwogICAgLS1sdW1vLWZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdSb2JvdG8nLCAnU2Vnb2UgVUknLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmLCAnQXBwbGUgQ29sb3IgRW1vamknLCAnU2Vnb2UgVUkgRW1vamknLCAnU2Vnb2UgVUkgU3ltYm9sJzsKCiAgICAvKiBGb250IHNpemVzICovCiAgICAtLWx1bW8tZm9udC1zaXplLXh4czogMC43NXJlbTsKICAgIC0tbHVtby1mb250LXNpemUteHM6IDAuODEyNXJlbTsKICAgIC0tbHVtby1mb250LXNpemUtczogMC44NzVyZW07CiAgICAtLWx1bW8tZm9udC1zaXplLW06IDFyZW07CiAgICAtLWx1bW8tZm9udC1zaXplLWw6IDEuMTI1cmVtOwogICAgLS1sdW1vLWZvbnQtc2l6ZS14bDogMS4zNzVyZW07CiAgICAtLWx1bW8tZm9udC1zaXplLXh4bDogMS43NXJlbTsKICAgIC0tbHVtby1mb250LXNpemUteHh4bDogMi41cmVtOwoKICAgIC8qIExpbmUgaGVpZ2h0cyAqLwogICAgLS1sdW1vLWxpbmUtaGVpZ2h0LXhzOiAxLjI1OwogICAgLS1sdW1vLWxpbmUtaGVpZ2h0LXM6IDEuMzc1OwogICAgLS1sdW1vLWxpbmUtaGVpZ2h0LW06IDEuNjI1OwogIH0KYCxzJHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtzJHQuaW5uZXJIVE1MPWA8c3R5bGU+JHthJHQudG9TdHJpbmcoKS5yZXBsYWNlKCI6aG9zdCIsImh0bWwiKX08L3N0eWxlPmAsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzJHQuY29udGVudCksJFh0KCIiLEdYdGAKICBodG1sIHsKICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1sdW1vLWZvbnQtZmFtaWx5KTsKICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUsIHZhcigtLWx1bW8tZm9udC1zaXplLW0pKTsKICAgIGxpbmUtaGVpZ2h0OiB2YXIoLS1sdW1vLWxpbmUtaGVpZ2h0LW0pOwogICAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOwogICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlOwogIH0KCiAgLyogQ2Fu4oCZdCBjb21iaW5lIHdpdGggdGhlIGFib3ZlIHNlbGVjdG9yIGJlY2F1c2UgdGhhdCBkb2VzbuKAmXQgd29yayBpbiBicm93c2VycyB3aXRob3V0IG5hdGl2ZSBzaGFkb3cgZG9tICovCiAgOmhvc3QgewogICAgZm9udC1mYW1pbHk6IHZhcigtLWx1bW8tZm9udC1mYW1pbHkpOwogICAgZm9udC1zaXplOiB2YXIoLS1sdW1vLWZvbnQtc2l6ZSwgdmFyKC0tbHVtby1mb250LXNpemUtbSkpOwogICAgbGluZS1oZWlnaHQ6IHZhcigtLWx1bW8tbGluZS1oZWlnaHQtbSk7CiAgICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7CiAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7CiAgfQoKICBzbWFsbCwKICBbdGhlbWV+PSdmb250LXNpemUtcyddIHsKICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUtcyk7CiAgICBsaW5lLWhlaWdodDogdmFyKC0tbHVtby1saW5lLWhlaWdodC1zKTsKICB9CgogIFt0aGVtZX49J2ZvbnQtc2l6ZS14cyddIHsKICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUteHMpOwogICAgbGluZS1oZWlnaHQ6IHZhcigtLWx1bW8tbGluZS1oZWlnaHQteHMpOwogIH0KCiAgaDEsCiAgaDIsCiAgaDMsCiAgaDQsCiAgaDUsCiAgaDYgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGxpbmUtaGVpZ2h0OiB2YXIoLS1sdW1vLWxpbmUtaGVpZ2h0LXhzKTsKICAgIG1hcmdpbi10b3A6IDEuMjVlbTsKICB9CgogIGgxIHsKICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUteHh4bCk7CiAgICBtYXJnaW4tYm90dG9tOiAwLjc1ZW07CiAgfQoKICBoMiB7CiAgICBmb250LXNpemU6IHZhcigtLWx1bW8tZm9udC1zaXplLXh4bCk7CiAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKICB9CgogIGgzIHsKICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUteGwpOwogICAgbWFyZ2luLWJvdHRvbTogMC41ZW07CiAgfQoKICBoNCB7CiAgICBmb250LXNpemU6IHZhcigtLWx1bW8tZm9udC1zaXplLWwpOwogICAgbWFyZ2luLWJvdHRvbTogMC41ZW07CiAgfQoKICBoNSB7CiAgICBmb250LXNpemU6IHZhcigtLWx1bW8tZm9udC1zaXplLW0pOwogICAgbWFyZ2luLWJvdHRvbTogMC4yNWVtOwogIH0KCiAgaDYgewogICAgZm9udC1zaXplOiB2YXIoLS1sdW1vLWZvbnQtc2l6ZS14cyk7CiAgICBtYXJnaW4tYm90dG9tOiAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIGxldHRlci1zcGFjaW5nOiAwLjAzZW07CiAgfQoKICBwLAogIGJsb2NrcXVvdGUgewogICAgbWFyZ2luLXRvcDogMC41ZW07CiAgICBtYXJnaW4tYm90dG9tOiAwLjc1ZW07CiAgfQoKICBhIHsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICB9CgogIGE6aG92ZXIgewogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgfQoKICBociB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICBoZWlnaHQ6IDFweDsKICAgIGJvcmRlcjogMDsKICAgIHBhZGRpbmc6IDA7CiAgICBtYXJnaW46IHZhcigtLWx1bW8tc3BhY2UtcykgY2FsYyh2YXIoLS1sdW1vLWJvcmRlci1yYWRpdXMtbSkgLyAyKTsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QtMTBwY3QpOwogIH0KCiAgYmxvY2txdW90ZSB7CiAgICBib3JkZXItbGVmdDogMnB4IHNvbGlkIHZhcigtLWx1bW8tY29udHJhc3QtMzBwY3QpOwogIH0KCiAgYiwKICBzdHJvbmcgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICB9CgogIC8qIFJUTCBzcGVjaWZpYyBzdHlsZXMgKi8KCiAgYmxvY2txdW90ZVtkaXI9J3J0bCddIHsKICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgYm9yZGVyLXJpZ2h0OiAycHggc29saWQgdmFyKC0tbHVtby1jb250cmFzdC0zMHBjdCk7CiAgfQpgLHttb2R1bGVJZDoibHVtby10eXBvZ3JhcGh5In0pLCRYdCgidmFhZGluLWNoZWNrYm94IixHWHRgCiAgICA6aG9zdCB7CiAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIG91dGxpbmU6IG5vbmU7CiAgICB9CgogICAgW3BhcnQ9J2xhYmVsJ106bm90KFtlbXB0eV0pIHsKICAgICAgbWFyZ2luOiAwLjE4NzVlbSAwLjg3NWVtIDAuMTg3NWVtIDAuMzc1ZW07CiAgICB9CgogICAgW3BhcnQ9J2NoZWNrYm94J10gewogICAgICB3aWR0aDogY2FsYygxZW0gKyAycHgpOwogICAgICBoZWlnaHQ6IGNhbGMoMWVtICsgMnB4KTsKICAgICAgbWFyZ2luOiAwLjE4NzVlbTsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1sdW1vLWJvcmRlci1yYWRpdXMtcyk7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QtMjBwY3QpOwogICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4ycyBjdWJpYy1iZXppZXIoMC4xMiwgMC4zMiwgMC41NCwgMiksIGJhY2tncm91bmQtY29sb3IgMC4xNXM7CiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICBsaW5lLWhlaWdodDogMS4yOwogICAgfQoKICAgIDpob3N0KFtpbmRldGVybWluYXRlXSkgW3BhcnQ9J2NoZWNrYm94J10sCiAgICA6aG9zdChbY2hlY2tlZF0pIFtwYXJ0PSdjaGVja2JveCddIHsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1wcmltYXJ5LWNvbG9yKTsKICAgIH0KCiAgICAvKiBOZWVkZWQgdG8gYWxpZ24gdGhlIGNoZWNrYm94IG5pY2VseSBvbiB0aGUgYmFzZWxpbmUgKi8KICAgIFtwYXJ0PSdjaGVja2JveCddOjpiZWZvcmUgewogICAgICBjb250ZW50OiAnXFwyMDAzJzsKICAgIH0KCiAgICAvKiBDaGVja21hcmsgKi8KICAgIFtwYXJ0PSdjaGVja2JveCddOjphZnRlciB7CiAgICAgIGNvbnRlbnQ6ICcnOwogICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIHdpZHRoOiAwOwogICAgICBoZWlnaHQ6IDA7CiAgICAgIGJvcmRlcjogMCBzb2xpZCB2YXIoLS1sdW1vLXByaW1hcnktY29udHJhc3QtY29sb3IpOwogICAgICBib3JkZXItd2lkdGg6IDAuMTg3NWVtIDAgMCAwLjE4NzVlbTsKICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgdHJhbnNmb3JtLW9yaWdpbjogMCAwOwogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHRvcDogMC44MTI1ZW07CiAgICAgIGxlZnQ6IDAuNWVtOwogICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNTUpIHJvdGF0ZSgtMTM1ZGVnKTsKICAgICAgb3BhY2l0eTogMDsKICAgIH0KCiAgICA6aG9zdChbY2hlY2tlZF0pIFtwYXJ0PSdjaGVja2JveCddOjphZnRlciB7CiAgICAgIG9wYWNpdHk6IDE7CiAgICAgIHdpZHRoOiAwLjYyNWVtOwogICAgICBoZWlnaHQ6IDEuMDYyNWVtOwogICAgfQoKICAgIC8qIEluZGV0ZXJtaW5hdGUgY2hlY2ttYXJrICovCiAgICA6aG9zdChbaW5kZXRlcm1pbmF0ZV0pIFtwYXJ0PSdjaGVja2JveCddOjphZnRlciB7CiAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgICAgb3BhY2l0eTogMTsKICAgICAgdG9wOiA0NSU7CiAgICAgIGhlaWdodDogMTAlOwogICAgICBsZWZ0OiAyMiU7CiAgICAgIHJpZ2h0OiAyMiU7CiAgICAgIHdpZHRoOiBhdXRvOwogICAgICBib3JkZXI6IDA7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tcHJpbWFyeS1jb250cmFzdC1jb2xvcik7CiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4yNXM7CiAgICB9CgogICAgLyogRm9jdXMgcmluZyAqLwogICAgOmhvc3QoW2ZvY3VzLXJpbmddKSBbcGFydD0nY2hlY2tib3gnXSB7CiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCB2YXIoLS1sdW1vLXByaW1hcnktY29sb3ItNTBwY3QpOwogICAgfQoKICAgIC8qIERpc2FibGVkICovCiAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICBjb2xvcjogdmFyKC0tbHVtby1kaXNhYmxlZC10ZXh0LWNvbG9yKTsKICAgIH0KCiAgICA6aG9zdChbZGlzYWJsZWRdKSBbcGFydD0nbGFiZWwnXSA6OnNsb3R0ZWQoKikgewogICAgICBjb2xvcjogaW5oZXJpdDsKICAgIH0KCiAgICA6aG9zdChbZGlzYWJsZWRdKSBbcGFydD0nY2hlY2tib3gnXSB7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QtMTBwY3QpOwogICAgfQoKICAgIDpob3N0KFtkaXNhYmxlZF0pIFtwYXJ0PSdjaGVja2JveCddOjphZnRlciB7CiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0zMHBjdCk7CiAgICB9CgogICAgOmhvc3QoW2luZGV0ZXJtaW5hdGVdW2Rpc2FibGVkXSkgW3BhcnQ9J2NoZWNrYm94J106OmFmdGVyIHsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0zMHBjdCk7CiAgICB9CgogICAgLyogUlRMIHNwZWNpZmljIHN0eWxlcyAqLwogICAgOmhvc3QoW2Rpcj0ncnRsJ10pIFtwYXJ0PSdsYWJlbCddOm5vdChbZW1wdHldKSB7CiAgICAgIG1hcmdpbjogMC4xODc1ZW0gMC4zNzVlbSAwLjE4NzVlbSAwLjg3NWVtOwogICAgfQoKICAgIC8qIFRyYW5zaXRpb24gdGhlIGNoZWNrbWFyayBpZiBhY3RpdmF0ZWQgd2l0aCB0aGUgbW91c2UgKGRpc2FibGVkIGZvciBncmlkIHNlbGVjdC1hbGwgdGhpcyB3YXkpICovCiAgICA6aG9zdCg6aG92ZXIpIFtwYXJ0PSdjaGVja2JveCddOjphZnRlciB7CiAgICAgIHRyYW5zaXRpb246IHdpZHRoIDAuMXMsIGhlaWdodCAwLjI1czsKICAgIH0KCiAgICAvKiBVc2VkIGZvciBhY3RpdmF0aW9uICJoYWxvIiAqLwogICAgW3BhcnQ9J2NoZWNrYm94J106OmJlZm9yZSB7CiAgICAgIGNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB3aWR0aDogMTAwJTsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0OwogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0OwogICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuNCk7CiAgICAgIG9wYWNpdHk6IDA7CiAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjFzLCBvcGFjaXR5IDAuOHM7CiAgICB9CgogICAgLyogSG92ZXIgKi8KICAgIDpob3N0KDpub3QoW2NoZWNrZWRdKTpub3QoW2luZGV0ZXJtaW5hdGVdKTpub3QoW2Rpc2FibGVkXSk6aG92ZXIpIFtwYXJ0PSdjaGVja2JveCddIHsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0zMHBjdCk7CiAgICB9CgogICAgLyogRGlzYWJsZSBob3ZlciBmb3IgdG91Y2ggZGV2aWNlcyAqLwogICAgQG1lZGlhIChwb2ludGVyOiBjb2Fyc2UpIHsKICAgICAgOmhvc3QoOm5vdChbY2hlY2tlZF0pOm5vdChbaW5kZXRlcm1pbmF0ZV0pOm5vdChbZGlzYWJsZWRdKTpob3ZlcikgW3BhcnQ9J2NoZWNrYm94J10gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QtMjBwY3QpOwogICAgICB9CiAgICB9CgogICAgLyogQWN0aXZlICovCiAgICA6aG9zdChbYWN0aXZlXSkgW3BhcnQ9J2NoZWNrYm94J10gewogICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOSk7CiAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMDVzOwogICAgfQoKICAgIDpob3N0KFthY3RpdmVdW2NoZWNrZWRdKSBbcGFydD0nY2hlY2tib3gnXSB7CiAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTsKICAgIH0KCiAgICA6aG9zdChbYWN0aXZlXTpub3QoW2NoZWNrZWRdKSkgW3BhcnQ9J2NoZWNrYm94J106OmJlZm9yZSB7CiAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMDFzLCAwLjAxczsKICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgICAgb3BhY2l0eTogMC40OwogICAgfQogIGAse21vZHVsZUlkOiJsdW1vLWNoZWNrYm94In0pO2NvbnN0IGwkdD10PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue3RoZW1lOnt0eXBlOlN0cmluZyxyZWFkT25seTohMH19fWF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0LGUsbil7c3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHQsZSxuKSwidGhlbWUiPT09dCYmdGhpcy5fc2V0VGhlbWUobil9fSxjJHQ9dD0+Y2xhc3MgZXh0ZW5kcyhsJHQodCkpe3N0YXRpYyBmaW5hbGl6ZSgpe3N1cGVyLmZpbmFsaXplKCk7Y29uc3QgdD10aGlzLnByb3RvdHlwZS5fdGVtcGxhdGUsZT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcy5wcm90b3R5cGUpLl90ZW1wbGF0ZTtlJiZBcnJheS5mcm9tKGUuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCJzdHlsZVtpbmNsdWRlXSIpKS5mb3JFYWNoKChlPT57dGhpcy5faW5jbHVkZVN0eWxlKGUuZ2V0QXR0cmlidXRlKCJpbmNsdWRlIiksdCl9KSksdGhpcy5faW5jbHVkZU1hdGNoaW5nVGhlbWVzKHQpfXN0YXRpYyBfaW5jbHVkZU1hdGNoaW5nVGhlbWVzKHQpe2NvbnN0IGU9Qi5wcm90b3R5cGUubW9kdWxlcztsZXQgbj0hMTtjb25zdCBpPXRoaXMuaXMrIi1kZWZhdWx0LXRoZW1lIjtPYmplY3Qua2V5cyhlKS5zb3J0KCgodCxlKT0+e2NvbnN0IG49MD09PXQuaW5kZXhPZigidmFhZGluLSIpLGk9MD09PWUuaW5kZXhPZigidmFhZGluLSIpLHI9WyJsdW1vLSIsIm1hdGVyaWFsLSJdLG89ci5maWx0ZXIoKGU9PjA9PT10LmluZGV4T2YoZSkpKS5sZW5ndGg+MCxhPXIuZmlsdGVyKCh0PT4wPT09ZS5pbmRleE9mKHQpKSkubGVuZ3RoPjA7cmV0dXJuIG4hPT1pP24/LTE6MTpvIT09YT9vPy0xOjE6MH0pKS5mb3JFYWNoKChyPT57aWYociE9PWkpe2NvbnN0IGk9ZVtyXS5nZXRBdHRyaWJ1dGUoInRoZW1lLWZvciIpO2kmJmkuc3BsaXQoIiAiKS5mb3JFYWNoKChlPT57bmV3IFJlZ0V4cCgiXiIrZS5zcGxpdCgiKiIpLmpvaW4oIi4qIikrIiQiKS50ZXN0KHRoaXMuaXMpJiYobj0hMCx0aGlzLl9pbmNsdWRlU3R5bGUocix0KSl9KSl9fSkpLCFuJiZlW2ldJiZ0aGlzLl9pbmNsdWRlU3R5bGUoaSx0KX1zdGF0aWMgX2luY2x1ZGVTdHlsZSh0LGUpe2lmKGUmJiFlLmNvbnRlbnQucXVlcnlTZWxlY3Rvcihgc3R5bGVbaW5jbHVkZT0iJHt0fSJdYCkpe2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtuLnNldEF0dHJpYnV0ZSgiaW5jbHVkZSIsdCksZS5jb250ZW50LmFwcGVuZENoaWxkKG4pfX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovO2xldCB1JHQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCgoKT0+e3UkdD0hMH0pLHtjYXB0dXJlOiEwfSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsKCgpPT57dSR0PSExfSkse2NhcHR1cmU6ITB9KTtjb25zdCBoJHQ9dD0+Y2xhc3MgZXh0ZW5kcygodD0+Y2xhc3MgZXh0ZW5kcyB0e3N0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybnt0YWJpbmRleDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsb2JzZXJ2ZXI6Il90YWJpbmRleENoYW5nZWQifX19fSkodCkpe3N0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybnthdXRvZm9jdXM6e3R5cGU6Qm9vbGVhbn0sX3ByZXZpb3VzVGFiSW5kZXg6e3R5cGU6TnVtYmVyfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfZGlzYWJsZWRDaGFuZ2VkIixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9pc1NoaWZ0VGFiYmluZzp7dHlwZTpCb29sZWFufX19cmVhZHkoKXt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzaW4iLCh0PT57dC5jb21wb3NlZFBhdGgoKVswXT09PXRoaXM/dGhpcy5jb250YWlucyh0LnJlbGF0ZWRUYXJnZXQpfHx0aGlzLl9mb2N1cygpOi0xPT09dC5jb21wb3NlZFBhdGgoKS5pbmRleE9mKHRoaXMuZm9jdXNFbGVtZW50KXx8dGhpcy5kaXNhYmxlZHx8dGhpcy5fc2V0Rm9jdXNlZCghMCl9KSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJmb2N1c291dCIsKCgpPT50aGlzLl9zZXRGb2N1c2VkKCExKSkpLHN1cGVyLnJlYWR5KCksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwodD0+eyF0LmRlZmF1bHRQcmV2ZW50ZWQmJjk9PT10LmtleUNvZGUmJnQuc2hpZnRLZXkmJih0aGlzLl9pc1NoaWZ0VGFiYmluZz0hMCxIVE1MRWxlbWVudC5wcm90b3R5cGUuZm9jdXMuYXBwbHkodGhpcyksdGhpcy5fc2V0Rm9jdXNlZCghMSksc2V0VGltZW91dCgoKCk9PnRoaXMuX2lzU2hpZnRUYWJiaW5nPSExKSwwKSl9KSksdGhpcy5hdXRvZm9jdXMmJiF0aGlzLmRpc2FibGVkJiZ3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+e3RoaXMuX2ZvY3VzKCksdGhpcy5fc2V0Rm9jdXNlZCghMCksdGhpcy5zZXRBdHRyaWJ1dGUoImZvY3VzLXJpbmciLCIiKX0pKX1kaXNjb25uZWN0ZWRDYWxsYmFjaygpe3N1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCksdGhpcy5oYXNBdHRyaWJ1dGUoImZvY3VzZWQiKSYmdGhpcy5fc2V0Rm9jdXNlZCghMSl9X3NldEZvY3VzZWQodCl7dD90aGlzLnNldEF0dHJpYnV0ZSgiZm9jdXNlZCIsIiIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKCJmb2N1c2VkIiksdCYmdSR0P3RoaXMuc2V0QXR0cmlidXRlKCJmb2N1cy1yaW5nIiwiIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImZvY3VzLXJpbmciKX1nZXQgZm9jdXNFbGVtZW50KCl7cmV0dXJuIHdpbmRvdy5jb25zb2xlLndhcm4oYFBsZWFzZSBpbXBsZW1lbnQgdGhlICdmb2N1c0VsZW1lbnQnIHByb3BlcnR5IGluIDwke3RoaXMubG9jYWxOYW1lfT5gKSx0aGlzfV9mb2N1cygpe3RoaXMuZm9jdXNFbGVtZW50JiYhdGhpcy5faXNTaGlmdFRhYmJpbmcmJih0aGlzLmZvY3VzRWxlbWVudC5mb2N1cygpLHRoaXMuX3NldEZvY3VzZWQoITApKX1mb2N1cygpe3RoaXMuZm9jdXNFbGVtZW50JiYhdGhpcy5kaXNhYmxlZCYmKHRoaXMuZm9jdXNFbGVtZW50LmZvY3VzKCksdGhpcy5fc2V0Rm9jdXNlZCghMCkpfWJsdXIoKXt0aGlzLmZvY3VzRWxlbWVudCYmKHRoaXMuZm9jdXNFbGVtZW50LmJsdXIoKSx0aGlzLl9zZXRGb2N1c2VkKCExKSl9X2Rpc2FibGVkQ2hhbmdlZCh0KXt0aGlzLmZvY3VzRWxlbWVudC5kaXNhYmxlZD10LHQ/KHRoaXMuYmx1cigpLHRoaXMuX3ByZXZpb3VzVGFiSW5kZXg9dGhpcy50YWJpbmRleCx0aGlzLnRhYmluZGV4PS0xLHRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWRpc2FibGVkIiwidHJ1ZSIpKToodm9pZCAwIT09dGhpcy5fcHJldmlvdXNUYWJJbmRleCYmKHRoaXMudGFiaW5kZXg9dGhpcy5fcHJldmlvdXNUYWJJbmRleCksdGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiKSl9X3RhYmluZGV4Q2hhbmdlZCh0KXt2b2lkIDAhPT10JiYodGhpcy5mb2N1c0VsZW1lbnQudGFiSW5kZXg9dCksdGhpcy5kaXNhYmxlZCYmdGhpcy50YWJpbmRleCYmKC0xIT09dGhpcy50YWJpbmRleCYmKHRoaXMuX3ByZXZpb3VzVGFiSW5kZXg9dGhpcy50YWJpbmRleCksdGhpcy50YWJpbmRleD10PXZvaWQgMCl9Y2xpY2soKXt0aGlzLmRpc2FibGVkfHxzdXBlci5jbGljaygpfX0sZCR0PS9cL1wqXCpccyt2YWFkaW4tZGV2LW1vZGU6c3RhcnQoW1xzXFNdKil2YWFkaW4tZGV2LW1vZGU6ZW5kXHMrXCpcKlwvL2kscCR0PXdpbmRvdy5WYWFkaW4mJndpbmRvdy5WYWFkaW4uRmxvdyYmd2luZG93LlZhYWRpbi5GbG93LmNsaWVudHM7ZnVuY3Rpb24gZiR0KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpcmV0dXJuO2NvbnN0IG49ZCR0LmV4ZWModC50b1N0cmluZygpKTtpZihuKXRyeXt0PW5ldyBGdW5jdGlvbihuWzFdKX1jYXRjaCh0KXtjb25zb2xlLmxvZygidmFhZGluLWRldmVsb3BtZW50LW1vZGUtZGV0ZWN0b3I6IHVuY29tbWVudEFuZFJ1bigpIGZhaWxlZCIsdCl9cmV0dXJuIHQoZSl9ZnVuY3Rpb24gbSR0KCl7fXdpbmRvdy5WYWFkaW49d2luZG93LlZhYWRpbnx8e30sdm9pZCAwPT09d2luZG93LlZhYWRpbi5kZXZlbG9wbWVudE1vZGUmJih3aW5kb3cuVmFhZGluLmRldmVsb3BtZW50TW9kZT0oZnVuY3Rpb24gZyR0KCl7dHJ5e3JldHVybiEhKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oInZhYWRpbi5kZXZlbG9wbWVudG1vZGUuZm9yY2UiKX0pKCl8fCEhKGZ1bmN0aW9uIGUoKXtyZXR1cm5bImxvY2FsaG9zdCIsIjEyNy4wLjAuMSJdLmluZGV4T2Yod2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKT49MH0pKCkmJihwJHQ/IShmdW5jdGlvbiBuKCl7cmV0dXJuISEocCR0JiZPYmplY3Qua2V5cyhwJHQpLm1hcCgodD0+cCR0W3RdKSkuZmlsdGVyKCh0PT50LnByb2R1Y3Rpb25Nb2RlKSkubGVuZ3RoPjApfSkoKTohKGZ1bmN0aW9uIGkoKXtyZXR1cm4gZiR0KChmdW5jdGlvbiB0KCl7cmV0dXJuITB9KSl9KSgpKX1jYXRjaCh0KXtyZXR1cm4hMX19KSgpKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi8KY2xhc3MgXyR0e3N0YXRpYyBkZXRlY3RTY3JvbGxUeXBlKCl7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LnRleHRDb250ZW50PSJBQkNEIix0LmRpcj0icnRsIix0LnN0eWxlLmZvbnRTaXplPSIxNHB4Iix0LnN0eWxlLndpZHRoPSI0cHgiLHQuc3R5bGUuaGVpZ2h0PSIxcHgiLHQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0LnN0eWxlLnRvcD0iLTEwMDBweCIsdC5zdHlsZS5vdmVyZmxvdz0ic2Nyb2xsIixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHQpO2xldCBlPSJyZXZlcnNlIjtyZXR1cm4gdC5zY3JvbGxMZWZ0PjA/ZT0iZGVmYXVsdCI6KHQuc2Nyb2xsTGVmdD0yLHQuc2Nyb2xsTGVmdDwyJiYoZT0ibmVnYXRpdmUiKSksZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0KSxlfXN0YXRpYyBnZXROb3JtYWxpemVkU2Nyb2xsTGVmdCh0LGUsbil7Y29uc3R7c2Nyb2xsTGVmdDppfT1uO2lmKCJydGwiIT09ZXx8IXQpcmV0dXJuIGk7c3dpdGNoKHQpe2Nhc2UibmVnYXRpdmUiOnJldHVybiBuLnNjcm9sbFdpZHRoLW4uY2xpZW50V2lkdGgraTtjYXNlInJldmVyc2UiOnJldHVybiBuLnNjcm9sbFdpZHRoLW4uY2xpZW50V2lkdGgtaX1yZXR1cm4gaX1zdGF0aWMgc2V0Tm9ybWFsaXplZFNjcm9sbExlZnQodCxlLG4saSl7aWYoInJ0bCI9PT1lJiZ0KXN3aXRjaCh0KXtjYXNlIm5lZ2F0aXZlIjpuLnNjcm9sbExlZnQ9bi5jbGllbnRXaWR0aC1uLnNjcm9sbFdpZHRoK2k7YnJlYWs7Y2FzZSJyZXZlcnNlIjpuLnNjcm9sbExlZnQ9bi5zY3JvbGxXaWR0aC1uLmNsaWVudFdpZHRoLWk7YnJlYWs7ZGVmYXVsdDpuLnNjcm9sbExlZnQ9aX1lbHNlIG4uc2Nyb2xsTGVmdD1pfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi9jb25zdCB5JHQ9W107bGV0IHYkdDtuZXcgTXV0YXRpb25PYnNlcnZlcigoZnVuY3Rpb24oKXtjb25zdCB0PXgkdCgpO3kkdC5mb3JFYWNoKChlPT57YiR0KGUsdCl9KSl9KSkub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQse2F0dHJpYnV0ZXM6ITAsYXR0cmlidXRlRmlsdGVyOlsiZGlyIl19KTtjb25zdCBiJHQ9ZnVuY3Rpb24odCxlLG49dC5nZXRBdHRyaWJ1dGUoImRpciIpKXtlP3Quc2V0QXR0cmlidXRlKCJkaXIiLGUpOm51bGwhPW4mJnQucmVtb3ZlQXR0cmlidXRlKCJkaXIiKX0seCR0PWZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoImRpciIpfSx3JHQ9dD0+Y2xhc3MgZXh0ZW5kcyB0e3N0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntkaXI6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19fXN0YXRpYyBmaW5hbGl6ZSgpe3N1cGVyLmZpbmFsaXplKCksdiR0fHwodiR0PV8kdC5kZXRlY3RTY3JvbGxUeXBlKCkpfWNvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLmhhc0F0dHJpYnV0ZSgiZGlyIil8fCh0aGlzLl9fc3Vic2NyaWJlKCksYiR0KHRoaXMseCR0KCksbnVsbCkpfWF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0LGUsbil7aWYoc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHQsZSxuKSwiZGlyIiE9PXQpcmV0dXJuO2NvbnN0IGk9eCR0KCkscj1uPT09aSYmLTE9PT15JHQuaW5kZXhPZih0aGlzKSxvPSFuJiZlJiYtMT09PXkkdC5pbmRleE9mKHRoaXMpLGE9biE9PWkmJmU9PT1pO3J8fG8/KHRoaXMuX19zdWJzY3JpYmUoKSxiJHQodGhpcyxpLG4pKTphJiZ0aGlzLl9fc3Vic2NyaWJlKCExKX1kaXNjb25uZWN0ZWRDYWxsYmFjaygpe3N1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCksdGhpcy5fX3N1YnNjcmliZSghMSksdGhpcy5yZW1vdmVBdHRyaWJ1dGUoImRpciIpfV92YWx1ZVRvTm9kZUF0dHJpYnV0ZSh0LGUsbil7KCJkaXIiIT09bnx8IiIhPT1lfHx0Lmhhc0F0dHJpYnV0ZSgiZGlyIikpJiZzdXBlci5fdmFsdWVUb05vZGVBdHRyaWJ1dGUodCxlLG4pfV9hdHRyaWJ1dGVUb1Byb3BlcnR5KHQsZSxuKXsiZGlyIiE9PXR8fGU/c3VwZXIuX2F0dHJpYnV0ZVRvUHJvcGVydHkodCxlLG4pOnRoaXMuZGlyPSIifV9fc3Vic2NyaWJlKHQ9ITApe3Q/LTE9PT15JHQuaW5kZXhPZih0aGlzKSYmeSR0LnB1c2godGhpcyk6eSR0LmluZGV4T2YodGhpcyk+LTEmJnkkdC5zcGxpY2UoeSR0LmluZGV4T2YodGhpcyksMSl9X19nZXROb3JtYWxpemVkU2Nyb2xsTGVmdCh0KXtyZXR1cm4gXyR0LmdldE5vcm1hbGl6ZWRTY3JvbGxMZWZ0KHYkdCx0aGlzLmdldEF0dHJpYnV0ZSgiZGlyIil8fCJsdHIiLHQpfV9fc2V0Tm9ybWFsaXplZFNjcm9sbExlZnQodCxlKXtyZXR1cm4gXyR0LnNldE5vcm1hbGl6ZWRTY3JvbGxMZWZ0KHYkdCx0aGlzLmdldEF0dHJpYnV0ZSgiZGlyIil8fCJsdHIiLHQsZSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLztsZXQgUyR0O3dpbmRvdy5WYWFkaW49d2luZG93LlZhYWRpbnx8e30sd2luZG93LlZhYWRpbi5yZWdpc3RyYXRpb25zPXdpbmRvdy5WYWFkaW4ucmVnaXN0cmF0aW9uc3x8W10sd2luZG93LlZhYWRpbi5kZXZlbG9wbWVudE1vZGVDYWxsYmFjaz13aW5kb3cuVmFhZGluLmRldmVsb3BtZW50TW9kZUNhbGxiYWNrfHx7fSx3aW5kb3cuVmFhZGluLmRldmVsb3BtZW50TW9kZUNhbGxiYWNrWyJ2YWFkaW4tdXNhZ2Utc3RhdGlzdGljcyJdPWZ1bmN0aW9uKCl7dmFyIHQ7dD1tJHQsd2luZG93LlZhYWRpbi5kZXZlbG9wbWVudE1vZGUmJmYkdCh0LHZvaWQgMCl9O2NvbnN0IE0kdD1uZXcgU2V0LEUkdD10PT5jbGFzcyBleHRlbmRzKHckdCh0KSl7c3RhdGljIGZpbmFsaXplKCl7c3VwZXIuZmluYWxpemUoKTtjb25zdHtpczp0fT10aGlzO3QmJiFNJHQuaGFzKHQpJiYod2luZG93LlZhYWRpbi5yZWdpc3RyYXRpb25zLnB1c2godGhpcyksTSR0LmFkZCh0KSx3aW5kb3cuVmFhZGluLmRldmVsb3BtZW50TW9kZUNhbGxiYWNrJiYoUyR0PVRuLmRlYm91bmNlKFMkdCx5dCwoKCk9Pnt3aW5kb3cuVmFhZGluLmRldmVsb3BtZW50TW9kZUNhbGxiYWNrWyJ2YWFkaW4tdXNhZ2Utc3RhdGlzdGljcyJdKCl9KSksQW4oUyR0KSkpfWNvbnN0cnVjdG9yKCl7c3VwZXIoKSxudWxsPT09ZG9jdW1lbnQuZG9jdHlwZSYmY29uc29sZS53YXJuKCdWYWFkaW4gY29tcG9uZW50cyByZXF1aXJlIHRoZSAic3RhbmRhcmRzIG1vZGUiIGRlY2xhcmF0aW9uLiBQbGVhc2UgYWRkIDwhRE9DVFlQRSBodG1sPiB0byB0aGUgSFRNTCBkb2N1bWVudC4nKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovO2NsYXNzIFQkdCBleHRlbmRzKEUkdChoJHQoYyR0KHBpKHllKSkpKSl7c3RhdGljIGdldCB0ZW1wbGF0ZSgpe3JldHVybiBfZWAKICAgICAgPHN0eWxlPgogICAgICAgIDpob3N0IHsKICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB9CgogICAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgfQoKICAgICAgICBsYWJlbCB7CiAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgfQoKICAgICAgICBbcGFydD0nY2hlY2tib3gnXSB7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgICBmbGV4OiBub25lOwogICAgICAgIH0KCiAgICAgICAgaW5wdXRbdHlwZT0nY2hlY2tib3gnXSB7CiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICB0b3A6IDA7CiAgICAgICAgICBsZWZ0OiAwOwogICAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgICBjdXJzb3I6IGluaGVyaXQ7CiAgICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgfQoKICAgICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgICAgIH0KICAgICAgPC9zdHlsZT4KCiAgICAgIDxsYWJlbD4KICAgICAgICA8c3BhbiBwYXJ0PSJjaGVja2JveCI+CiAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgdHlwZT0iY2hlY2tib3giCiAgICAgICAgICAgIGNoZWNrZWQ9Int7Y2hlY2tlZDo6Y2hhbmdlfX0iCiAgICAgICAgICAgIGRpc2FibGVkJD0iW1tkaXNhYmxlZF1dIgogICAgICAgICAgICBpbmRldGVybWluYXRlPSJ7e2luZGV0ZXJtaW5hdGU6OmNoYW5nZX19IgogICAgICAgICAgICByb2xlPSJwcmVzZW50YXRpb24iCiAgICAgICAgICAgIHRhYmluZGV4PSItMSIKICAgICAgICAgIC8+CiAgICAgICAgPC9zcGFuPgoKICAgICAgICA8c3BhbiBwYXJ0PSJsYWJlbCI+CiAgICAgICAgICA8c2xvdD48L3Nsb3Q+CiAgICAgICAgPC9zcGFuPgogICAgICA8L2xhYmVsPgogICAgYH1zdGF0aWMgZ2V0IGlzKCl7cmV0dXJuInZhYWRpbi1jaGVja2JveCJ9c3RhdGljIGdldCB2ZXJzaW9uKCl7cmV0dXJuIjIwLjAuMiJ9c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue2NoZWNrZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9jaGVja2VkQ2hhbmdlZCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxpbmRldGVybWluYXRlOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLG9ic2VydmVyOiJfaW5kZXRlcm1pbmF0ZUNoYW5nZWQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMX0sdmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiJvbiJ9LF9uYXRpdmVDaGVja2JveDp7dHlwZTpPYmplY3R9fX1jb25zdHJ1Y3Rvcigpe3N1cGVyKCl9Z2V0IG5hbWUoKXtyZXR1cm4gdGhpcy5jaGVja2VkP3RoaXMuX3N0b3JlZE5hbWU6IiJ9c2V0IG5hbWUodCl7dGhpcy5fc3RvcmVkTmFtZT10fXJlYWR5KCl7c3VwZXIucmVhZHkoKSx0aGlzLnNldEF0dHJpYnV0ZSgicm9sZSIsImNoZWNrYm94IiksdGhpcy5fbmF0aXZlQ2hlY2tib3g9dGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W3R5cGU9ImNoZWNrYm94Il0nKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLl9oYW5kbGVDbGljay5iaW5kKHRoaXMpKSx0aGlzLl9hZGRBY3RpdmVMaXN0ZW5lcnMoKTtjb25zdCB0PXRoaXMuZ2V0QXR0cmlidXRlKCJuYW1lIik7dCYmKHRoaXMubmFtZT10KSx0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignW3BhcnR+PSJsYWJlbCJdJykucXVlcnlTZWxlY3Rvcigic2xvdCIpLmFkZEV2ZW50TGlzdGVuZXIoInNsb3RjaGFuZ2UiLHRoaXMuX3VwZGF0ZUxhYmVsQXR0cmlidXRlLmJpbmQodGhpcykpLHRoaXMuX3VwZGF0ZUxhYmVsQXR0cmlidXRlKCl9X3VwZGF0ZUxhYmVsQXR0cmlidXRlKCl7Y29uc3QgdD10aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignW3BhcnR+PSJsYWJlbCJdJyksZT10LmZpcnN0RWxlbWVudENoaWxkLmFzc2lnbmVkTm9kZXMoKTt0aGlzLl9pc0Fzc2lnbmVkTm9kZXNFbXB0eShlKT90LnNldEF0dHJpYnV0ZSgiZW1wdHkiLCIiKTp0LnJlbW92ZUF0dHJpYnV0ZSgiZW1wdHkiKX1faXNBc3NpZ25lZE5vZGVzRW1wdHkodCl7cmV0dXJuIDA9PT10Lmxlbmd0aHx8MT09dC5sZW5ndGgmJnRbMF0ubm9kZVR5cGU9PU5vZGUuVEVYVF9OT0RFJiYiIj09PXRbMF0udGV4dENvbnRlbnQudHJpbSgpfV9jaGVja2VkQ2hhbmdlZCh0KXt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1jaGVja2VkIix0aGlzLmluZGV0ZXJtaW5hdGU/Im1peGVkIjpCb29sZWFuKHQpKX1faW5kZXRlcm1pbmF0ZUNoYW5nZWQodCl7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIsdD8ibWl4ZWQiOnRoaXMuY2hlY2tlZCl9X2FkZEFjdGl2ZUxpc3RlbmVycygpe3RoaXMuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUodGhpcywiZG93biIsKHQ9Pnt0aGlzLl9faW50ZXJhY3Rpb25zQWxsb3dlZCh0KSYmdGhpcy5zZXRBdHRyaWJ1dGUoImFjdGl2ZSIsIiIpfSkpLHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUodGhpcywidXAiLCgoKT0+dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFjdGl2ZSIpKSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwodD0+e3RoaXMuX19pbnRlcmFjdGlvbnNBbGxvd2VkKHQpJiYzMj09PXQua2V5Q29kZSYmKHQucHJldmVudERlZmF1bHQoKSx0aGlzLnNldEF0dHJpYnV0ZSgiYWN0aXZlIiwiIikpfSkpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLCh0PT57dGhpcy5fX2ludGVyYWN0aW9uc0FsbG93ZWQodCkmJjMyPT09dC5rZXlDb2RlJiYodC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX3RvZ2dsZUNoZWNrZWQoKSx0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYWN0aXZlIiksdGhpcy5pbmRldGVybWluYXRlJiYodGhpcy5pbmRldGVybWluYXRlPSExKSl9KSl9Z2V0IGZvY3VzRWxlbWVudCgpe3JldHVybiB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiaW5wdXQiKX1fX2ludGVyYWN0aW9uc0FsbG93ZWQodCl7cmV0dXJuIXRoaXMuZGlzYWJsZWQmJiJhIiE9PXQudGFyZ2V0LmxvY2FsTmFtZX1faGFuZGxlQ2xpY2sodCl7dGhpcy5fX2ludGVyYWN0aW9uc0FsbG93ZWQodCkmJih0aGlzLmluZGV0ZXJtaW5hdGU/KHRoaXMuaW5kZXRlcm1pbmF0ZT0hMSx0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fdG9nZ2xlQ2hlY2tlZCgpKTp0LmNvbXBvc2VkUGF0aCgpWzBdIT09dGhpcy5fbmF0aXZlQ2hlY2tib3gmJih0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fdG9nZ2xlQ2hlY2tlZCgpKSl9X3RvZ2dsZUNoZWNrZWQoKXt0aGlzLmNoZWNrZWQ9IXRoaXMuY2hlY2tlZCx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjaGFuZ2UiLHtjb21wb3NlZDohMSxidWJibGVzOiEwfSkpfX1jdXN0b21FbGVtZW50cy5kZWZpbmUoVCR0LmlzLFQkdCksJFh0KCJ2YWFkaW4tZ3JpZCIsR1h0YAogICAgOmhvc3QgewogICAgICBmb250LWZhbWlseTogdmFyKC0tbHVtby1mb250LWZhbWlseSk7CiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUtbSk7CiAgICAgIGxpbmUtaGVpZ2h0OiB2YXIoLS1sdW1vLWxpbmUtaGVpZ2h0LXMpOwogICAgICBjb2xvcjogdmFyKC0tbHVtby1ib2R5LXRleHQtY29sb3IpOwogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1sdW1vLWJhc2UtY29sb3IpOwogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7CiAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlOwoKICAgICAgLyogRm9yIGludGVybmFsIHVzZSBvbmx5ICovCiAgICAgIC0tX2x1bW8tZ3JpZC1ib3JkZXItY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QtMjBwY3QpOwogICAgICAtLV9sdW1vLWdyaWQtc2Vjb25kYXJ5LWJvcmRlci1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0xMHBjdCk7CiAgICAgIC0tX2x1bW8tZ3JpZC1ib3JkZXItd2lkdGg6IDFweDsKICAgICAgLS1fbHVtby1ncmlkLXNlbGVjdGVkLXJvdy1jb2xvcjogdmFyKC0tbHVtby1wcmltYXJ5LWNvbG9yLTEwcGN0KTsKICAgIH0KCiAgICAvKiBObyAob3V0ZXIpIGJvcmRlciAqLwoKICAgIDpob3N0KDpub3QoW3RoZW1lfj0nbm8tYm9yZGVyJ10pKSB7CiAgICAgIGJvcmRlcjogdmFyKC0tX2x1bW8tZ3JpZC1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLWNvbG9yKTsKICAgIH0KCiAgICAvKiBDZWxsIHN0eWxlcyAqLwoKICAgIFtwYXJ0fj0nY2VsbCddIHsKICAgICAgbWluLWhlaWdodDogdmFyKC0tbHVtby1zaXplLW0pOwogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1sdW1vLWJhc2UtY29sb3IpOwogICAgfQoKICAgIFtwYXJ0fj0nY2VsbCddIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICBwYWRkaW5nOiB2YXIoLS1sdW1vLXNwYWNlLXhzKSB2YXIoLS1sdW1vLXNwYWNlLW0pOwogICAgfQoKICAgIC8qIEFwcGx5IHJvdyBib3JkZXJzIGJ5IGRlZmF1bHQgYW5kIGludHJvZHVjZSB0aGUgIm5vLXJvdy1ib3JkZXJzIiB2YXJpYW50ICovCiAgICA6aG9zdCg6bm90KFt0aGVtZX49J25vLXJvdy1ib3JkZXJzJ10pKSBbcGFydH49J2NlbGwnXTpub3QoW3BhcnR+PSdkZXRhaWxzLWNlbGwnXSkgewogICAgICBib3JkZXItdG9wOiB2YXIoLS1fbHVtby1ncmlkLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tX2x1bW8tZ3JpZC1zZWNvbmRhcnktYm9yZGVyLWNvbG9yKTsKICAgIH0KCiAgICAvKiBIaWRlIGZpcnN0IGJvZHkgcm93IHRvcCBib3JkZXIgKi8KICAgIDpob3N0KDpub3QoW3RoZW1lfj0nbm8tcm93LWJvcmRlcnMnXSkpIFtwYXJ0PSdyb3cnXVtmaXJzdF0gW3BhcnR+PSdjZWxsJ106bm90KFtwYXJ0fj0nZGV0YWlscy1jZWxsJ10pIHsKICAgICAgYm9yZGVyLXRvcDogMDsKICAgICAgbWluLWhlaWdodDogY2FsYyh2YXIoLS1sdW1vLXNpemUtbSkgLSB2YXIoLS1fbHVtby1ncmlkLWJvcmRlci13aWR0aCkpOwogICAgfQoKICAgIC8qIEZvY3VzLXJpbmcgKi8KCiAgICBbcGFydH49J2NlbGwnXTpmb2N1cyB7CiAgICAgIG91dGxpbmU6IG5vbmU7CiAgICB9CgogICAgOmhvc3QoW25hdmlnYXRpbmddKSBbcGFydH49J2NlbGwnXTpmb2N1czo6YmVmb3JlIHsKICAgICAgY29udGVudDogJyc7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgdG9wOiAwOwogICAgICByaWdodDogMDsKICAgICAgYm90dG9tOiAwOwogICAgICBsZWZ0OiAwOwogICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMnB4IHZhcigtLWx1bW8tcHJpbWFyeS1jb2xvci01MHBjdCk7CiAgICB9CgogICAgLyogRHJhZyBhbmQgRHJvcCBzdHlsZXMgKi8KICAgIDpob3N0KFtkcmFnb3Zlcl0pOjphZnRlciB7CiAgICAgIGNvbnRlbnQ6ICcnOwogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHotaW5kZXg6IDEwMDsKICAgICAgdG9wOiAwOwogICAgICByaWdodDogMDsKICAgICAgYm90dG9tOiAwOwogICAgICBsZWZ0OiAwOwogICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMnB4IHZhcigtLWx1bW8tcHJpbWFyeS1jb2xvci01MHBjdCk7CiAgICB9CgogICAgW3BhcnR+PSdyb3cnXVtkcmFnb3Zlcl0gewogICAgICB6LWluZGV4OiAxMDAgIWltcG9ydGFudDsKICAgIH0KCiAgICBbcGFydH49J3JvdyddW2RyYWdvdmVyXSBbcGFydH49J2NlbGwnXSB7CiAgICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgfQoKICAgIFtwYXJ0fj0ncm93J11bZHJhZ292ZXJdIFtwYXJ0fj0nY2VsbCddOjphZnRlciB7CiAgICAgIGNvbnRlbnQ6ICcnOwogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHRvcDogMDsKICAgICAgcmlnaHQ6IDA7CiAgICAgIGJvdHRvbTogMDsKICAgICAgbGVmdDogMDsKICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLXdpZHRoKSArIDJweCk7CiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1sdW1vLXByaW1hcnktY29sb3ItNTBwY3QpOwogICAgfQoKICAgIDpob3N0KFt0aGVtZX49J25vLXJvdy1ib3JkZXJzJ10pIFtkcmFnb3Zlcl0gW3BhcnR+PSdjZWxsJ106OmFmdGVyIHsKICAgICAgaGVpZ2h0OiAycHg7CiAgICB9CgogICAgW3BhcnR+PSdyb3cnXVtkcmFnb3Zlcj0nYmVsb3cnXSBbcGFydH49J2NlbGwnXTo6YWZ0ZXIgewogICAgICB0b3A6IDEwMCU7CiAgICAgIGJvdHRvbTogYXV0bzsKICAgICAgbWFyZ2luLXRvcDogLTFweDsKICAgIH0KCiAgICBbcGFydH49J3JvdyddW2RyYWdvdmVyPSdhYm92ZSddIFtwYXJ0fj0nY2VsbCddOjphZnRlciB7CiAgICAgIHRvcDogYXV0bzsKICAgICAgYm90dG9tOiAxMDAlOwogICAgICBtYXJnaW4tYm90dG9tOiAtMXB4OwogICAgfQoKICAgIFtwYXJ0fj0ncm93J11bZGV0YWlscy1vcGVuZWRdW2RyYWdvdmVyPSdiZWxvdyddIFtwYXJ0fj0nY2VsbCddOm5vdChbcGFydH49J2RldGFpbHMtY2VsbCddKTo6YWZ0ZXIsCiAgICBbcGFydH49J3JvdyddW2RldGFpbHMtb3BlbmVkXVtkcmFnb3Zlcj0nYWJvdmUnXSBbcGFydH49J2RldGFpbHMtY2VsbCddOjphZnRlciB7CiAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICB9CgogICAgW3BhcnR+PSdyb3cnXVtkcmFnb3Zlcl1bZHJhZ292ZXI9J29uLXRvcCddIFtwYXJ0fj0nY2VsbCddOjphZnRlciB7CiAgICAgIGhlaWdodDogMTAwJTsKICAgIH0KCiAgICBbcGFydH49J3JvdyddW2RyYWdzdGFydF0gewogICAgICAvKiBBZGQgYm90dG9tLXNwYWNlIHRvIHRoZSByb3cgc28gdGhlIGRyYWcgbnVtYmVyIGRvZXNuJ3QgZ2V0IGNsaXBwZWQuIE5lZWRlZCBmb3IgSUUvRWRnZSAqLwogICAgICBib3JkZXItYm90dG9tOiAxMDBweCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgei1pbmRleDogMTAwICFpbXBvcnRhbnQ7CiAgICAgIG9wYWNpdHk6IDAuOTsKICAgIH0KCiAgICBbcGFydH49J3JvdyddW2RyYWdzdGFydF0gW3BhcnR+PSdjZWxsJ10gewogICAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50OwogICAgfQoKICAgIFtwYXJ0fj0ncm93J11bZHJhZ3N0YXJ0XSBbcGFydH49J2NlbGwnXVtsYXN0LWNvbHVtbl0gewogICAgICBib3JkZXItcmFkaXVzOiAwIHZhcigtLWx1bW8tYm9yZGVyLXJhZGl1cy1zKSB2YXIoLS1sdW1vLWJvcmRlci1yYWRpdXMtcykgMDsKICAgIH0KCiAgICBbcGFydH49J3JvdyddW2RyYWdzdGFydF0gW3BhcnR+PSdjZWxsJ11bZmlyc3QtY29sdW1uXSB7CiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWx1bW8tYm9yZGVyLXJhZGl1cy1zKSAwIDAgdmFyKC0tbHVtby1ib3JkZXItcmFkaXVzLXMpOwogICAgfQoKICAgIFtpb3NdIFtwYXJ0fj0ncm93J11bZHJhZ3N0YXJ0XSBbcGFydH49J2NlbGwnXSB7CiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWx1bW8tcHJpbWFyeS1jb2xvci01MHBjdCk7CiAgICB9CgogICAgI3Njcm9sbGVyOm5vdChbaW9zXSkgW3BhcnR+PSdyb3cnXVtkcmFnc3RhcnRdOm5vdChbZHJhZ3N0YXJ0PScnXSk6OmFmdGVyIHsKICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgbGVmdDogdmFyKC0tX2dyaWQtZHJhZy1zdGFydC14KTsKICAgICAgdG9wOiB2YXIoLS1fZ3JpZC1kcmFnLXN0YXJ0LXkpOwogICAgICB6LWluZGV4OiAxMDA7CiAgICAgIGNvbnRlbnQ6IGF0dHIoZHJhZ3N0YXJ0KTsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIHBhZGRpbmc6IGNhbGModmFyKC0tbHVtby1zcGFjZS14cykgKiAwLjgpOwogICAgICBjb2xvcjogdmFyKC0tbHVtby1lcnJvci1jb250cmFzdC1jb2xvcik7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tZXJyb3ItY29sb3IpOwogICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1sdW1vLWJvcmRlci1yYWRpdXMtbSk7CiAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1sdW1vLWZvbnQtZmFtaWx5KTsKICAgICAgZm9udC1zaXplOiB2YXIoLS1sdW1vLWZvbnQtc2l6ZS14eHMpOwogICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgdGV4dC10cmFuc2Zvcm06IGluaXRpYWw7CiAgICAgIGxldHRlci1zcGFjaW5nOiBpbml0aWFsOwogICAgICBtaW4td2lkdGg6IGNhbGModmFyKC0tbHVtby1zaXplLXMpICogMC43KTsKICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgfQoKICAgIC8qIEhlYWRlcnMgYW5kIGZvb3RlcnMgKi8KCiAgICBbcGFydH49J2hlYWRlci1jZWxsJ10gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCksCiAgICBbcGFydH49J2Zvb3Rlci1jZWxsJ10gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCksCiAgICBbcGFydH49J3Jlb3JkZXItZ2hvc3QnXSB7CiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUtcyk7CiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICB9CgogICAgW3BhcnR+PSdmb290ZXItY2VsbCddIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgIH0KCiAgICBbcGFydD0ncm93J106b25seS1jaGlsZCBbcGFydH49J2hlYWRlci1jZWxsJ10gewogICAgICBtaW4taGVpZ2h0OiB2YXIoLS1sdW1vLXNpemUteGwpOwogICAgfQoKICAgIC8qIEhlYWRlciBib3JkZXJzICovCgogICAgLyogSGlkZSBmaXJzdCBoZWFkZXIgcm93IHRvcCBib3JkZXIgKi8KICAgIDpob3N0KDpub3QoW3RoZW1lfj0nbm8tcm93LWJvcmRlcnMnXSkpIFtwYXJ0PSdyb3cnXTpmaXJzdC1jaGlsZCBbcGFydH49J2hlYWRlci1jZWxsJ10gewogICAgICBib3JkZXItdG9wOiAwOwogICAgfQoKICAgIFtwYXJ0PSdyb3cnXTpsYXN0LWNoaWxkIFtwYXJ0fj0naGVhZGVyLWNlbGwnXSB7CiAgICAgIGJvcmRlci1ib3R0b206IHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLXdpZHRoKSBzb2xpZCB0cmFuc3BhcmVudDsKICAgIH0KCiAgICA6aG9zdCg6bm90KFt0aGVtZX49J25vLXJvdy1ib3JkZXJzJ10pKSBbcGFydD0ncm93J106bGFzdC1jaGlsZCBbcGFydH49J2hlYWRlci1jZWxsJ10gewogICAgICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1fbHVtby1ncmlkLXNlY29uZGFyeS1ib3JkZXItY29sb3IpOwogICAgfQoKICAgIC8qIE92ZXJmbG93IHVzZXMgYSBzdHJvbmdlciBib3JkZXIgY29sb3IgKi8KICAgIDpob3N0KFtvdmVyZmxvd349J3RvcCddKSBbcGFydD0ncm93J106bGFzdC1jaGlsZCBbcGFydH49J2hlYWRlci1jZWxsJ10gewogICAgICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1fbHVtby1ncmlkLWJvcmRlci1jb2xvcik7CiAgICB9CgogICAgLyogRm9vdGVyIGJvcmRlcnMgKi8KCiAgICBbcGFydD0ncm93J106Zmlyc3QtY2hpbGQgW3BhcnR+PSdmb290ZXItY2VsbCddIHsKICAgICAgYm9yZGVyLXRvcDogdmFyKC0tX2x1bW8tZ3JpZC1ib3JkZXItd2lkdGgpIHNvbGlkIHRyYW5zcGFyZW50OwogICAgfQoKICAgIDpob3N0KDpub3QoW3RoZW1lfj0nbm8tcm93LWJvcmRlcnMnXSkpIFtwYXJ0PSdyb3cnXTpmaXJzdC1jaGlsZCBbcGFydH49J2Zvb3Rlci1jZWxsJ10gewogICAgICBib3JkZXItdG9wLWNvbG9yOiB2YXIoLS1fbHVtby1ncmlkLXNlY29uZGFyeS1ib3JkZXItY29sb3IpOwogICAgfQoKICAgIC8qIE92ZXJmbG93IHVzZXMgYSBzdHJvbmdlciBib3JkZXIgY29sb3IgKi8KICAgIDpob3N0KFtvdmVyZmxvd349J2JvdHRvbSddKSBbcGFydD0ncm93J106Zmlyc3QtY2hpbGQgW3BhcnR+PSdmb290ZXItY2VsbCddIHsKICAgICAgYm9yZGVyLXRvcC1jb2xvcjogdmFyKC0tX2x1bW8tZ3JpZC1ib3JkZXItY29sb3IpOwogICAgfQoKICAgIC8qIENvbHVtbiByZW9yZGVyaW5nICovCgogICAgOmhvc3QoW3Jlb3JkZXJpbmddKSBbcGFydH49J2NlbGwnXSB7CiAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh2YXIoLS1sdW1vLXNoYWRlLTIwcGN0KSwgdmFyKC0tbHVtby1zaGFkZS0yMHBjdCkpIHZhcigtLWx1bW8tYmFzZS1jb2xvcik7CiAgICB9CgogICAgOmhvc3QoW3Jlb3JkZXJpbmddKSBbcGFydH49J2NlbGwnXVtyZW9yZGVyLXN0YXR1cz0nYWxsb3dlZCddIHsKICAgICAgYmFja2dyb3VuZDogdmFyKC0tbHVtby1iYXNlLWNvbG9yKTsKICAgIH0KCiAgICA6aG9zdChbcmVvcmRlcmluZ10pIFtwYXJ0fj0nY2VsbCddW3Jlb3JkZXItc3RhdHVzPSdkcmFnZ2luZyddIHsKICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHZhcigtLWx1bW8tY29udHJhc3QtNXBjdCksIHZhcigtLWx1bW8tY29udHJhc3QtNXBjdCkpIHZhcigtLWx1bW8tYmFzZS1jb2xvcik7CiAgICB9CgogICAgW3BhcnR+PSdyZW9yZGVyLWdob3N0J10gewogICAgICBvcGFjaXR5OiAwLjg1OwogICAgICBib3gtc2hhZG93OiB2YXIoLS1sdW1vLWJveC1zaGFkb3ctcyk7CiAgICAgIC8qIFRPRE8gVXNlIHRoZSBzYW1lIHN0eWxlcyBhcyBmb3IgdGhlIGNlbGwgZWxlbWVudCAocmVvcmRlci1naG9zdCBjb3BpZXMgc3R5bGVzIGZyb20gdGhlIGNlbGwgZWxlbWVudCkgKi8KICAgICAgcGFkZGluZzogdmFyKC0tbHVtby1zcGFjZS1zKSB2YXIoLS1sdW1vLXNwYWNlLW0pICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLyogQ29sdW1uIHJlc2l6aW5nICovCgogICAgW3BhcnQ9J3Jlc2l6ZS1oYW5kbGUnXSB7CiAgICAgIHdpZHRoOiAzcHg7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tcHJpbWFyeS1jb2xvci01MHBjdCk7CiAgICAgIG9wYWNpdHk6IDA7CiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4yczsKICAgIH0KCiAgICA6aG9zdCg6bm90KFtyZW9yZGVyaW5nXSkpICo6bm90KFtjb2x1bW4tcmVzaXppbmddKSBbcGFydH49J2NlbGwnXTpob3ZlciBbcGFydD0ncmVzaXplLWhhbmRsZSddLAogICAgW3BhcnQ9J3Jlc2l6ZS1oYW5kbGUnXTphY3RpdmUgewogICAgICBvcGFjaXR5OiAxOwogICAgICB0cmFuc2l0aW9uLWRlbGF5OiAwLjE1czsKICAgIH0KCiAgICAvKiBDb2x1bW4gYm9yZGVycyAqLwoKICAgIDpob3N0KFt0aGVtZX49J2NvbHVtbi1ib3JkZXJzJ10pIFtwYXJ0fj0nY2VsbCddOm5vdChbbGFzdC1jb2x1bW5dKTpub3QoW3BhcnR+PSdkZXRhaWxzLWNlbGwnXSkgewogICAgICBib3JkZXItcmlnaHQ6IHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1fbHVtby1ncmlkLXNlY29uZGFyeS1ib3JkZXItY29sb3IpOwogICAgfQoKICAgIC8qIEZyb3plbiBjb2x1bW5zICovCgogICAgW2xhc3QtZnJvemVuXSB7CiAgICAgIGJvcmRlci1yaWdodDogdmFyKC0tX2x1bW8tZ3JpZC1ib3JkZXItd2lkdGgpIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgfQoKICAgIDpob3N0KFtvdmVyZmxvd349J2xlZnQnXSkgW3BhcnR+PSdjZWxsJ11bbGFzdC1mcm96ZW5dOm5vdChbcGFydH49J2RldGFpbHMtY2VsbCddKSB7CiAgICAgIGJvcmRlci1yaWdodC1jb2xvcjogdmFyKC0tX2x1bW8tZ3JpZC1ib3JkZXItY29sb3IpOwogICAgfQoKICAgIC8qIFJvdyBzdHJpcGVzICovCgogICAgOmhvc3QoW3RoZW1lfj0ncm93LXN0cmlwZXMnXSkgW3BhcnR+PSdyb3cnXTpub3QoW29kZF0pIFtwYXJ0fj0nYm9keS1jZWxsJ10sCiAgICA6aG9zdChbdGhlbWV+PSdyb3ctc3RyaXBlcyddKSBbcGFydH49J3JvdyddOm5vdChbb2RkXSkgW3BhcnR+PSdkZXRhaWxzLWNlbGwnXSB7CiAgICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh2YXIoLS1sdW1vLWNvbnRyYXN0LTVwY3QpLCB2YXIoLS1sdW1vLWNvbnRyYXN0LTVwY3QpKTsKICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OwogICAgfQoKICAgIC8qIFNlbGVjdGVkIHJvdyAqLwoKICAgIC8qIFJhaXNlIHRoZSBzZWxlY3RlZCByb3dzIGFib3ZlIHVuc2VsZWN0ZWQgcm93cyAoc28gdGhhdCBib3gtc2hhZG93IGNhbiBjb3ZlciB1bnNlbGVjdGVkIHJvd3MpICovCiAgICA6aG9zdCg6bm90KFtyZW9yZGVyaW5nXSkpIFtwYXJ0fj0ncm93J11bc2VsZWN0ZWRdIHsKICAgICAgei1pbmRleDogMTsKICAgIH0KCiAgICA6aG9zdCg6bm90KFtyZW9yZGVyaW5nXSkpIFtwYXJ0fj0ncm93J11bc2VsZWN0ZWRdIFtwYXJ0fj0nYm9keS1jZWxsJ106bm90KFtwYXJ0fj0nZGV0YWlscy1jZWxsJ10pIHsKICAgICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHZhcigtLV9sdW1vLWdyaWQtc2VsZWN0ZWQtcm93LWNvbG9yKSwgdmFyKC0tX2x1bW8tZ3JpZC1zZWxlY3RlZC1yb3ctY29sb3IpKTsKICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdDsKICAgIH0KCiAgICAvKiBDb3ZlciB0aGUgYm9yZGVyIG9mIGFuIHVuc2VsZWN0ZWQgcm93ICovCiAgICA6aG9zdCg6bm90KFt0aGVtZX49J25vLXJvdy1ib3JkZXJzJ10pKSBbcGFydH49J3JvdyddW3NlbGVjdGVkXSBbcGFydH49J2NlbGwnXTpub3QoW3BhcnR+PSdkZXRhaWxzLWNlbGwnXSkgewogICAgICBib3gtc2hhZG93OiAwIHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLXdpZHRoKSAwIDAgdmFyKC0tX2x1bW8tZ3JpZC1zZWxlY3RlZC1yb3ctY29sb3IpOwogICAgfQoKICAgIC8qIENvbXBhY3QgKi8KCiAgICA6aG9zdChbdGhlbWV+PSdjb21wYWN0J10pIFtwYXJ0PSdyb3cnXTpvbmx5LWNoaWxkIFtwYXJ0fj0naGVhZGVyLWNlbGwnXSB7CiAgICAgIG1pbi1oZWlnaHQ6IHZhcigtLWx1bW8tc2l6ZS1tKTsKICAgIH0KCiAgICA6aG9zdChbdGhlbWV+PSdjb21wYWN0J10pIFtwYXJ0fj0nY2VsbCddIHsKICAgICAgbWluLWhlaWdodDogdmFyKC0tbHVtby1zaXplLXMpOwogICAgfQoKICAgIDpob3N0KFt0aGVtZX49J2NvbXBhY3QnXSkgW3BhcnQ9J3JvdyddW2ZpcnN0XSBbcGFydH49J2NlbGwnXTpub3QoW3BhcnR+PSdkZXRhaWxzLWNlbGwnXSkgewogICAgICBtaW4taGVpZ2h0OiBjYWxjKHZhcigtLWx1bW8tc2l6ZS1zKSAtIHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLXdpZHRoKSk7CiAgICB9CgogICAgOmhvc3QoW3RoZW1lfj0nY29tcGFjdCddKSBbcGFydH49J2NlbGwnXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgIHBhZGRpbmc6IHZhcigtLWx1bW8tc3BhY2UteHMpIHZhcigtLWx1bW8tc3BhY2Utcyk7CiAgICB9CgogICAgLyogV3JhcCBjZWxsIGNvbnRlbnRzICovCgogICAgOmhvc3QoW3RoZW1lfj0nd3JhcC1jZWxsLWNvbnRlbnQnXSkgW3BhcnR+PSdjZWxsJ10gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgfQoKICAgIC8qIFJUTCBzcGVjaWZpYyBzdHlsZXMgKi8KCiAgICA6aG9zdChbZGlyPSdydGwnXSkgW3BhcnR+PSdyb3cnXVtkcmFnc3RhcnRdIFtwYXJ0fj0nY2VsbCddW2xhc3QtY29sdW1uXSB7CiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWx1bW8tYm9yZGVyLXJhZGl1cy1zKSAwIDAgdmFyKC0tbHVtby1ib3JkZXItcmFkaXVzLXMpOwogICAgfQoKICAgIDpob3N0KFtkaXI9J3J0bCddKSBbcGFydH49J3JvdyddW2RyYWdzdGFydF0gW3BhcnR+PSdjZWxsJ11bZmlyc3QtY29sdW1uXSB7CiAgICAgIGJvcmRlci1yYWRpdXM6IDAgdmFyKC0tbHVtby1ib3JkZXItcmFkaXVzLXMpIHZhcigtLWx1bW8tYm9yZGVyLXJhZGl1cy1zKSAwOwogICAgfQoKICAgIDpob3N0KFtkaXI9J3J0bCddW3RoZW1lfj0nY29sdW1uLWJvcmRlcnMnXSkgW3BhcnR+PSdjZWxsJ106bm90KFtsYXN0LWNvbHVtbl0pOm5vdChbcGFydH49J2RldGFpbHMtY2VsbCddKSB7CiAgICAgIGJvcmRlci1yaWdodDogbm9uZTsKICAgICAgYm9yZGVyLWxlZnQ6IHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1fbHVtby1ncmlkLXNlY29uZGFyeS1ib3JkZXItY29sb3IpOwogICAgfQoKICAgIDpob3N0KFtkaXI9J3J0bCddKSBbbGFzdC1mcm96ZW5dIHsKICAgICAgYm9yZGVyLXJpZ2h0OiBub25lOwogICAgICBib3JkZXItbGVmdDogdmFyKC0tX2x1bW8tZ3JpZC1ib3JkZXItd2lkdGgpIHNvbGlkIHRyYW5zcGFyZW50OwogICAgfQoKICAgIDpob3N0KFtkaXI9J3J0bCddW292ZXJmbG93fj0ncmlnaHQnXSkgW3BhcnR+PSdjZWxsJ11bbGFzdC1mcm96ZW5dOm5vdChbcGFydH49J2RldGFpbHMtY2VsbCddKSB7CiAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiB2YXIoLS1fbHVtby1ncmlkLWJvcmRlci1jb2xvcik7CiAgICB9CiAgYCx7bW9kdWxlSWQ6Imx1bW8tZ3JpZCJ9KSwkWHQoInZhYWRpbi1jaGVja2JveCIsR1h0YAogICAgOmhvc3QoLnZhYWRpbi1ncmlkLXNlbGVjdC1hbGwtY2hlY2tib3gpIHsKICAgICAgZm9udC1zaXplOiB2YXIoLS1sdW1vLWZvbnQtc2l6ZS1tKTsKICAgIH0KICBgLHttb2R1bGVJZDoidmFhZGluLWdyaWQtc2VsZWN0LWFsbC1jaGVja2JveC1sdW1vIn0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBDJHQ9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpob25lfGFkOyg/OiBVOyk/IENQVSkgT1MgKFxkKykvKSxBJHQ9QyR0JiZDJHRbMV0+PTgsayR0PUlyKHtiZWhhdmlvcnM6W2dvLERvXSxfcmF0aW86LjUsX3Njcm9sbGVyUGFkZGluZ1RvcDowLF9zY3JvbGxQb3NpdGlvbjowLF9waHlzaWNhbFNpemU6MCxfcGh5c2ljYWxBdmVyYWdlOjAsX3BoeXNpY2FsQXZlcmFnZUNvdW50OjAsX3BoeXNpY2FsVG9wOjAsX3ZpcnR1YWxDb3VudDowLF9lc3RTY3JvbGxIZWlnaHQ6MCxfc2Nyb2xsSGVpZ2h0OjAsX3ZpZXdwb3J0SGVpZ2h0OjAsX3ZpZXdwb3J0V2lkdGg6MCxfcGh5c2ljYWxJdGVtczpudWxsLF9waHlzaWNhbFNpemVzOm51bGwsX2ZpcnN0VmlzaWJsZUluZGV4VmFsOm51bGwsX2xhc3RWaXNpYmxlSW5kZXhWYWw6bnVsbCxfbWF4UGFnZXM6MixfZm9jdXNlZFZpcnR1YWxJbmRleDotMSxfdGVtcGxhdGVDb3N0OjAsZ2V0IF9waHlzaWNhbEJvdHRvbSgpe3JldHVybiB0aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9waHlzaWNhbFNpemV9LGdldCBfc2Nyb2xsQm90dG9tKCl7cmV0dXJuIHRoaXMuX3Njcm9sbFBvc2l0aW9uK3RoaXMuX3ZpZXdwb3J0SGVpZ2h0fSxnZXQgX3ZpcnR1YWxFbmQoKXtyZXR1cm4gdGhpcy5fdmlydHVhbFN0YXJ0K3RoaXMuX3BoeXNpY2FsQ291bnQtMX0sZ2V0IF9oaWRkZW5Db250ZW50U2l6ZSgpe3JldHVybiB0aGlzLl9waHlzaWNhbFNpemUtdGhpcy5fdmlld3BvcnRIZWlnaHR9LGdldCBfbWF4U2Nyb2xsVG9wKCl7cmV0dXJuIHRoaXMuX2VzdFNjcm9sbEhlaWdodC10aGlzLl92aWV3cG9ydEhlaWdodCt0aGlzLl9zY3JvbGxPZmZzZXR9LGdldCBfbWF4VmlydHVhbFN0YXJ0KCl7cmV0dXJuIE1hdGgubWF4KDAsdGhpcy5fdmlydHVhbENvdW50LXRoaXMuX3BoeXNpY2FsQ291bnQpfSxzZXQgX3ZpcnR1YWxTdGFydCh0KXt0PXRoaXMuX2NsYW1wKHQsMCx0aGlzLl9tYXhWaXJ0dWFsU3RhcnQpLHRoaXMuX3ZpcnR1YWxTdGFydFZhbD10fSxnZXQgX3ZpcnR1YWxTdGFydCgpe3JldHVybiB0aGlzLl92aXJ0dWFsU3RhcnRWYWx8fDB9LHNldCBfcGh5c2ljYWxTdGFydCh0KXsodCU9dGhpcy5fcGh5c2ljYWxDb3VudCk8MCYmKHQ9dGhpcy5fcGh5c2ljYWxDb3VudCt0KSx0aGlzLl9waHlzaWNhbFN0YXJ0VmFsPXR9LGdldCBfcGh5c2ljYWxTdGFydCgpe3JldHVybiB0aGlzLl9waHlzaWNhbFN0YXJ0VmFsfHwwfSxnZXQgX3BoeXNpY2FsRW5kKCl7cmV0dXJuKHRoaXMuX3BoeXNpY2FsU3RhcnQrdGhpcy5fcGh5c2ljYWxDb3VudC0xKSV0aGlzLl9waHlzaWNhbENvdW50fSxzZXQgX3BoeXNpY2FsQ291bnQodCl7dGhpcy5fcGh5c2ljYWxDb3VudFZhbD10fSxnZXQgX3BoeXNpY2FsQ291bnQoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxDb3VudFZhbHx8MH0sZ2V0IF9vcHRQaHlzaWNhbFNpemUoKXtyZXR1cm4gMD09PXRoaXMuX3ZpZXdwb3J0SGVpZ2h0PzEvMDp0aGlzLl92aWV3cG9ydEhlaWdodCp0aGlzLl9tYXhQYWdlc30sZ2V0IF9pc1Zpc2libGUoKXtyZXR1cm4gQm9vbGVhbih0aGlzLm9mZnNldFdpZHRofHx0aGlzLm9mZnNldEhlaWdodCl9LGdldCBmaXJzdFZpc2libGVJbmRleCgpe2xldCB0PXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsO2lmKG51bGw9PXQpe2xldCBlPXRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbE9mZnNldDt0PXRoaXMuX2l0ZXJhdGVJdGVtcygoZnVuY3Rpb24odCxuKXtpZihlKz10aGlzLl9waHlzaWNhbFNpemVzW3RdLGU+dGhpcy5fc2Nyb2xsUG9zaXRpb24pcmV0dXJuIG59KSl8fDAsdGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9dH1yZXR1cm4gdH0sZ2V0IGxhc3RWaXNpYmxlSW5kZXgoKXtsZXQgdD10aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsO2lmKG51bGw9PXQpe2xldCBlPXRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbE9mZnNldDt0aGlzLl9pdGVyYXRlSXRlbXMoKGZ1bmN0aW9uKG4saSl7ZTx0aGlzLl9zY3JvbGxCb3R0b20mJih0PWkpLGUrPXRoaXMuX3BoeXNpY2FsU2l6ZXNbbl19KSksdGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10fXJldHVybiB0fSxnZXQgX3Njcm9sbE9mZnNldCgpe3JldHVybiB0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3B9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLHRoaXMuX3JlbmRlcixfdCksdGhpcy5saXN0ZW4odGhpcywiaXJvbi1yZXNpemUiLCJfcmVzaXplSGFuZGxlciIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMudW5saXN0ZW4odGhpcywiaXJvbi1yZXNpemUiLCJfcmVzaXplSGFuZGxlciIpfSx1cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXM6ZnVuY3Rpb24oKXtjb25zdCB0PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpO3RoaXMuX3Njcm9sbGVyUGFkZGluZ1RvcD10aGlzLnNjcm9sbFRhcmdldD09PXRoaXM/MDpwYXJzZUludCh0WyJwYWRkaW5nLXRvcCJdLDEwKSx0aGlzLl9pc1JUTD1Cb29sZWFuKCJydGwiPT09dC5kaXJlY3Rpb24pLHRoaXMuX3ZpZXdwb3J0V2lkdGg9dGhpcy4kLml0ZW1zLm9mZnNldFdpZHRoLHRoaXMuX3ZpZXdwb3J0SGVpZ2h0PXRoaXMuX3Njcm9sbFRhcmdldEhlaWdodH0sX3Njcm9sbEhhbmRsZXI6ZnVuY3Rpb24oKXtjb25zdCB0PU1hdGgubWF4KDAsTWF0aC5taW4odGhpcy5fbWF4U2Nyb2xsVG9wLHRoaXMuX3Njcm9sbFRvcCkpO2xldCBlPXQtdGhpcy5fc2Nyb2xsUG9zaXRpb247Y29uc3Qgbj1lPj0wO2lmKHRoaXMuX3Njcm9sbFBvc2l0aW9uPXQsdGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbCx0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPW51bGwsTWF0aC5hYnMoZSk+dGhpcy5fcGh5c2ljYWxTaXplJiZ0aGlzLl9waHlzaWNhbFNpemU+MCl7ZS09dGhpcy5fc2Nyb2xsT2Zmc2V0O2NvbnN0IHQ9TWF0aC5yb3VuZChlL3RoaXMuX3BoeXNpY2FsQXZlcmFnZSk7dGhpcy5fdmlydHVhbFN0YXJ0PXRoaXMuX3ZpcnR1YWxTdGFydCt0LHRoaXMuX3BoeXNpY2FsU3RhcnQ9dGhpcy5fcGh5c2ljYWxTdGFydCt0LHRoaXMuX3BoeXNpY2FsVG9wPU1hdGguZmxvb3IodGhpcy5fdmlydHVhbFN0YXJ0KSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2UsdGhpcy5fdXBkYXRlKCl9ZWxzZSBpZih0aGlzLl9waHlzaWNhbENvdW50PjApe2NvbnN0e3BoeXNpY2FsVG9wOnQsaW5kZXhlczplfT10aGlzLl9nZXRSZXVzYWJsZXMobik7bj8odGhpcy5fcGh5c2ljYWxUb3A9dCx0aGlzLl92aXJ0dWFsU3RhcnQ9dGhpcy5fdmlydHVhbFN0YXJ0K2UubGVuZ3RoLHRoaXMuX3BoeXNpY2FsU3RhcnQ9dGhpcy5fcGh5c2ljYWxTdGFydCtlLmxlbmd0aCk6KHRoaXMuX3ZpcnR1YWxTdGFydD10aGlzLl92aXJ0dWFsU3RhcnQtZS5sZW5ndGgsdGhpcy5fcGh5c2ljYWxTdGFydD10aGlzLl9waHlzaWNhbFN0YXJ0LWUubGVuZ3RoKSx0aGlzLl91cGRhdGUoZSxuP251bGw6ZSksdGhpcy5fZGVib3VuY2UoIl9pbmNyZWFzZVBvb2xJZk5lZWRlZCIsdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQuYmluZCh0aGlzLDApLHZ0KX19LF9nZXRSZXVzYWJsZXM6ZnVuY3Rpb24odCl7bGV0IGUsbixpO2NvbnN0IHI9W10sbz10aGlzLl9oaWRkZW5Db250ZW50U2l6ZSp0aGlzLl9yYXRpbyxhPXRoaXMuX3ZpcnR1YWxTdGFydCxzPXRoaXMuX3ZpcnR1YWxFbmQsbD10aGlzLl9waHlzaWNhbENvdW50O2xldCBjPXRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbE9mZnNldDtjb25zdCB1PXRoaXMuX3Njcm9sbFRvcCxoPXRoaXMuX3Njcm9sbEJvdHRvbTtmb3IodD8oZT10aGlzLl9waHlzaWNhbFN0YXJ0LG49dS1jKTooZT10aGlzLl9waHlzaWNhbEVuZCxuPXRoaXMuX3BoeXNpY2FsQm90dG9tK3RoaXMuX3Njcm9sbE9mZnNldC1oKTtpPXRoaXMuX3BoeXNpY2FsU2l6ZXNbZV0sbi09aSwhKHIubGVuZ3RoPj1sfHxuPD1vKTspaWYodCl7aWYocytyLmxlbmd0aCsxPj10aGlzLl92aXJ0dWFsQ291bnQpYnJlYWs7aWYoYytpPj11LXRoaXMuX3Njcm9sbE9mZnNldClicmVhaztyLnB1c2goZSksYys9aSxlPShlKzEpJWx9ZWxzZXtpZihhLXIubGVuZ3RoPD0wKWJyZWFrO2lmKGMrdGhpcy5fcGh5c2ljYWxTaXplLWk8PWgpYnJlYWs7ci5wdXNoKGUpLGMtPWksZT0wPT09ZT9sLTE6ZS0xfXJldHVybntpbmRleGVzOnIscGh5c2ljYWxUb3A6Yy10aGlzLl9zY3JvbGxPZmZzZXR9fSxfdXBkYXRlOmZ1bmN0aW9uKHQsZSl7aWYoISh0JiYwPT09dC5sZW5ndGh8fDA9PT10aGlzLl9waHlzaWNhbENvdW50KSl7aWYodGhpcy5fYXNzaWduTW9kZWxzKHQpLHRoaXMuX3VwZGF0ZU1ldHJpY3ModCksZSlmb3IoO2UubGVuZ3RoOyl7Y29uc3QgdD1lLnBvcCgpO3RoaXMuX3BoeXNpY2FsVG9wLT10aGlzLl9waHlzaWNhbFNpemVzW3RdfXRoaXMuX3Bvc2l0aW9uSXRlbXMoKSx0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoKX19LF9pc0NsaWVudEZ1bGw6ZnVuY3Rpb24oKXtyZXR1cm4gMCE9dGhpcy5fc2Nyb2xsQm90dG9tJiZ0aGlzLl9waHlzaWNhbEJvdHRvbS0xPj10aGlzLl9zY3JvbGxCb3R0b20mJnRoaXMuX3BoeXNpY2FsVG9wPD10aGlzLl9zY3JvbGxQb3NpdGlvbn0sX2luY3JlYXNlUG9vbElmTmVlZGVkOmZ1bmN0aW9uKHQpe2NvbnN0IGU9dGhpcy5fY2xhbXAodGhpcy5fcGh5c2ljYWxDb3VudCt0LDMsdGhpcy5fdmlydHVhbENvdW50LXRoaXMuX3ZpcnR1YWxTdGFydCktdGhpcy5fcGh5c2ljYWxDb3VudDtsZXQgbj1NYXRoLnJvdW5kKC41KnRoaXMuX3BoeXNpY2FsQ291bnQpO2lmKCEoZTwwKSl7aWYoZT4wKXtjb25zdCB0PXdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKTtbXS5wdXNoLmFwcGx5KHRoaXMuX3BoeXNpY2FsSXRlbXMsdGhpcy5fY3JlYXRlUG9vbChlKSk7Zm9yKGxldCB0PTA7dDxlO3QrKyl0aGlzLl9waHlzaWNhbFNpemVzLnB1c2goMCk7dGhpcy5fcGh5c2ljYWxDb3VudD10aGlzLl9waHlzaWNhbENvdW50K2UsdGhpcy5fcGh5c2ljYWxTdGFydD50aGlzLl9waHlzaWNhbEVuZCYmdGhpcy5faXNJbmRleFJlbmRlcmVkKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgpJiZ0aGlzLl9nZXRQaHlzaWNhbEluZGV4KHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgpPHRoaXMuX3BoeXNpY2FsRW5kJiYodGhpcy5fcGh5c2ljYWxTdGFydD10aGlzLl9waHlzaWNhbFN0YXJ0K2UpLHRoaXMuX3VwZGF0ZSgpLHRoaXMuX3RlbXBsYXRlQ29zdD0od2luZG93LnBlcmZvcm1hbmNlLm5vdygpLXQpL2Usbj1NYXRoLnJvdW5kKC41KnRoaXMuX3BoeXNpY2FsQ291bnQpfXRoaXMuX3ZpcnR1YWxFbmQ+PXRoaXMuX3ZpcnR1YWxDb3VudC0xfHwwPT09bnx8KHRoaXMuX2lzQ2xpZW50RnVsbCgpP3RoaXMuX3BoeXNpY2FsU2l6ZTx0aGlzLl9vcHRQaHlzaWNhbFNpemUmJnRoaXMuX2RlYm91bmNlKCJfaW5jcmVhc2VQb29sSWZOZWVkZWQiLHRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkLmJpbmQodGhpcyx0aGlzLl9jbGFtcChNYXRoLnJvdW5kKDUwL3RoaXMuX3RlbXBsYXRlQ29zdCksMSxuKSkseXQpOnRoaXMuX2RlYm91bmNlKCJfaW5jcmVhc2VQb29sSWZOZWVkZWQiLHRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkLmJpbmQodGhpcyxuKSx2dCkpfX0sX3JlbmRlcjpmdW5jdGlvbigpe2lmKHRoaXMuaXNBdHRhY2hlZCYmdGhpcy5faXNWaXNpYmxlKWlmKDAhPT10aGlzLl9waHlzaWNhbENvdW50KXtjb25zdHtwaHlzaWNhbFRvcDp0LGluZGV4ZXM6ZX09dGhpcy5fZ2V0UmV1c2FibGVzKCEwKTt0aGlzLl9waHlzaWNhbFRvcD10LHRoaXMuX3ZpcnR1YWxTdGFydD10aGlzLl92aXJ0dWFsU3RhcnQrZS5sZW5ndGgsdGhpcy5fcGh5c2ljYWxTdGFydD10aGlzLl9waHlzaWNhbFN0YXJ0K2UubGVuZ3RoLHRoaXMuX3VwZGF0ZShlKSx0aGlzLl91cGRhdGUoKSx0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgwKX1lbHNlIHRoaXMuX3ZpcnR1YWxDb3VudD4wJiYodGhpcy51cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXMoKSx0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgzKSl9LF9pdGVtc0NoYW5nZWQ6ZnVuY3Rpb24odCl7Iml0ZW1zIj09PXQucGF0aCYmKHRoaXMuX3ZpcnR1YWxTdGFydD0wLHRoaXMuX3BoeXNpY2FsVG9wPTAsdGhpcy5fdmlydHVhbENvdW50PXRoaXMuaXRlbXM/dGhpcy5pdGVtcy5sZW5ndGg6MCx0aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5PXt9LHRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPW51bGwsdGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1udWxsLHRoaXMuX3BoeXNpY2FsQ291bnQ9dGhpcy5fcGh5c2ljYWxDb3VudHx8MCx0aGlzLl9waHlzaWNhbEl0ZW1zPXRoaXMuX3BoeXNpY2FsSXRlbXN8fFtdLHRoaXMuX3BoeXNpY2FsU2l6ZXM9dGhpcy5fcGh5c2ljYWxTaXplc3x8W10sdGhpcy5fcGh5c2ljYWxTdGFydD0wLHRoaXMuX3Njcm9sbFRvcD50aGlzLl9zY3JvbGxPZmZzZXQmJnRoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24oMCksdGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLHRoaXMuX3JlbmRlcixfdCkpfSxfaXRlcmF0ZUl0ZW1zOmZ1bmN0aW9uKHQsZSl7bGV0IG4saSxyLG87aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgmJmUpe2ZvcihvPTA7bzxlLmxlbmd0aDtvKyspaWYobj1lW29dLGk9dGhpcy5fY29tcHV0ZVZpZHgobiksbnVsbCE9KHI9dC5jYWxsKHRoaXMsbixpKSkpcmV0dXJuIHJ9ZWxzZXtmb3Iobj10aGlzLl9waHlzaWNhbFN0YXJ0LGk9dGhpcy5fdmlydHVhbFN0YXJ0O248dGhpcy5fcGh5c2ljYWxDb3VudDtuKyssaSsrKWlmKG51bGwhPShyPXQuY2FsbCh0aGlzLG4saSkpKXJldHVybiByO2ZvcihuPTA7bjx0aGlzLl9waHlzaWNhbFN0YXJ0O24rKyxpKyspaWYobnVsbCE9KHI9dC5jYWxsKHRoaXMsbixpKSkpcmV0dXJuIHJ9fSxfY29tcHV0ZVZpZHg6ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PXRoaXMuX3BoeXNpY2FsU3RhcnQ/dGhpcy5fdmlydHVhbFN0YXJ0Kyh0LXRoaXMuX3BoeXNpY2FsU3RhcnQpOnRoaXMuX3ZpcnR1YWxTdGFydCsodGhpcy5fcGh5c2ljYWxDb3VudC10aGlzLl9waHlzaWNhbFN0YXJ0KSt0fSxfdXBkYXRlTWV0cmljczpmdW5jdGlvbih0KXtpZighdGhpcy5faXNWaXNpYmxlKXJldHVybjtEaSgpO2xldCBlPTAsbj0wO2NvbnN0IGk9dGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQscj10aGlzLl9waHlzaWNhbEF2ZXJhZ2U7dGhpcy5faXRlcmF0ZUl0ZW1zKChmdW5jdGlvbih0KXtuKz10aGlzLl9waHlzaWNhbFNpemVzW3RdLHRoaXMuX3BoeXNpY2FsU2l6ZXNbdF09dGhpcy5fcGh5c2ljYWxJdGVtc1t0XS5vZmZzZXRIZWlnaHQsZSs9dGhpcy5fcGh5c2ljYWxTaXplc1t0XSx0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCs9dGhpcy5fcGh5c2ljYWxTaXplc1t0XT8xOjB9KSx0KSx0aGlzLl9waHlzaWNhbFNpemU9dGhpcy5fcGh5c2ljYWxTaXplK2Utbix0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCE9PWkmJih0aGlzLl9waHlzaWNhbEF2ZXJhZ2U9TWF0aC5yb3VuZCgocippK2UpL3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50KSl9LF9wb3NpdGlvbkl0ZW1zOmZ1bmN0aW9uKCl7dGhpcy5fYWRqdXN0U2Nyb2xsUG9zaXRpb24oKTtsZXQgdD10aGlzLl9waHlzaWNhbFRvcDt0aGlzLl9pdGVyYXRlSXRlbXMoKGZ1bmN0aW9uKGUpe3RoaXMudHJhbnNsYXRlM2QoMCx0KyJweCIsMCx0aGlzLl9waHlzaWNhbEl0ZW1zW2VdKSx0Kz10aGlzLl9waHlzaWNhbFNpemVzW2VdfSkpfSxfYWRqdXN0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXtjb25zdCB0PTA9PT10aGlzLl92aXJ0dWFsU3RhcnQ/dGhpcy5fcGh5c2ljYWxUb3A6TWF0aC5taW4odGhpcy5fc2Nyb2xsUG9zaXRpb24rdGhpcy5fcGh5c2ljYWxUb3AsMCk7aWYoMCE9PXQpe3RoaXMuX3BoeXNpY2FsVG9wPXRoaXMuX3BoeXNpY2FsVG9wLXQ7Y29uc3QgZT10aGlzLl9zY3JvbGxUb3A7IUEkdCYmZT4wJiZ0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKGUtdCl9fSxfcmVzZXRTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbih0KXt0aGlzLnNjcm9sbFRhcmdldCYmdD49MCYmKHRoaXMuX3Njcm9sbFRvcD10LHRoaXMuX3Njcm9sbFBvc2l0aW9uPXRoaXMuX3Njcm9sbFRvcCl9LF91cGRhdGVTY3JvbGxlclNpemU6ZnVuY3Rpb24odCl7dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0PXRoaXMuX3BoeXNpY2FsQm90dG9tK01hdGgubWF4KHRoaXMuX3ZpcnR1YWxDb3VudC10aGlzLl9waHlzaWNhbENvdW50LXRoaXMuX3ZpcnR1YWxTdGFydCwwKSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2UsKCh0PSh0PXR8fDA9PT10aGlzLl9zY3JvbGxIZWlnaHQpfHx0aGlzLl9zY3JvbGxQb3NpdGlvbj49dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3BoeXNpY2FsU2l6ZSl8fE1hdGguYWJzKHRoaXMuX2VzdFNjcm9sbEhlaWdodC10aGlzLl9zY3JvbGxIZWlnaHQpPj10aGlzLl92aWV3cG9ydEhlaWdodCkmJih0aGlzLiQuaXRlbXMuc3R5bGUuaGVpZ2h0PXRoaXMuX2VzdFNjcm9sbEhlaWdodCsicHgiLHRoaXMuX3Njcm9sbEhlaWdodD10aGlzLl9lc3RTY3JvbGxIZWlnaHQpfSxzY3JvbGxUb0luZGV4OmZ1bmN0aW9uKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdHx8dDwwfHx0PnRoaXMuaXRlbXMubGVuZ3RoLTEpcmV0dXJuO2lmKERpKCksMD09PXRoaXMuX3BoeXNpY2FsQ291bnQpcmV0dXJuO3Q9dGhpcy5fY2xhbXAodCwwLHRoaXMuX3ZpcnR1YWxDb3VudC0xKSwoIXRoaXMuX2lzSW5kZXhSZW5kZXJlZCh0KXx8dD49dGhpcy5fbWF4VmlydHVhbFN0YXJ0KSYmKHRoaXMuX3ZpcnR1YWxTdGFydD10LTEpLHRoaXMuX2Fzc2lnbk1vZGVscygpLHRoaXMuX3VwZGF0ZU1ldHJpY3MoKSx0aGlzLl9waHlzaWNhbFRvcD1NYXRoLmZsb29yKHRoaXMuX3ZpcnR1YWxTdGFydCkqdGhpcy5fcGh5c2ljYWxBdmVyYWdlO2xldCBlPXRoaXMuX3BoeXNpY2FsU3RhcnQsbj10aGlzLl92aXJ0dWFsU3RhcnQsaT0wO2NvbnN0IHI9dGhpcy5faGlkZGVuQ29udGVudFNpemU7Zm9yKDtuPHQmJmk8PXI7KWkrPXRoaXMuX3BoeXNpY2FsU2l6ZXNbZV0sZT0oZSsxKSV0aGlzLl9waHlzaWNhbENvdW50LG4rKzt0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoITApLHRoaXMuX3Bvc2l0aW9uSXRlbXMoKSx0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKHRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbE9mZnNldCtpKSx0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgwKSx0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsLHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9bnVsbH0sX3Jlc2V0QXZlcmFnZTpmdW5jdGlvbigpe3RoaXMuX3BoeXNpY2FsQXZlcmFnZT0wLHRoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50PTB9LF9yZXNpemVIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLChmdW5jdGlvbigpe3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPW51bGwsdGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1udWxsLHRoaXMudXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzKCksdGhpcy5faXNWaXNpYmxlPyh0aGlzLnRvZ2dsZVNjcm9sbExpc3RlbmVyKCEwKSx0aGlzLl9yZXNldEF2ZXJhZ2UoKSx0aGlzLl9yZW5kZXIoKSk6dGhpcy50b2dnbGVTY3JvbGxMaXN0ZW5lcighMSl9KSxfdCl9LF9pc0luZGV4UmVuZGVyZWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PXRoaXMuX3ZpcnR1YWxTdGFydCYmdDw9dGhpcy5fdmlydHVhbEVuZH0sX2dldFBoeXNpY2FsSW5kZXg6ZnVuY3Rpb24odCl7cmV0dXJuKHRoaXMuX3BoeXNpY2FsU3RhcnQrKHQtdGhpcy5fdmlydHVhbFN0YXJ0KSkldGhpcy5fcGh5c2ljYWxDb3VudH0sX2NsYW1wOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTWF0aC5taW4obixNYXRoLm1heChlLHQpKX0sX2RlYm91bmNlOmZ1bmN0aW9uKHQsZSxuKXt0aGlzLl9kZWJvdW5jZXJzPXRoaXMuX2RlYm91bmNlcnN8fHt9LHRoaXMuX2RlYm91bmNlcnNbdF09VG4uZGVib3VuY2UodGhpcy5fZGVib3VuY2Vyc1t0XSxuLGUuYmluZCh0aGlzKSksQW4odGhpcy5fZGVib3VuY2Vyc1t0XSl9fSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovCmNsYXNzIEwkdCBleHRlbmRzIGskdHtzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKXtyZXR1cm57c2l6ZTp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxfdmlkeE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MH19fXN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCl7cmV0dXJuWyJfZWZmZWN0aXZlU2l6ZUNoYW5nZWQoX2VmZmVjdGl2ZVNpemUpIl19Y29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLHRoaXMuX3Njcm9sbEhhbmRsZXIoKX1fdXBkYXRlU2Nyb2xsZXJJdGVtKCl7fV9hZnRlclNjcm9sbCgpe31fZ2V0Um93VGFyZ2V0KCl7fV9jcmVhdGVTY3JvbGxlclJvd3MoKXt9X2NhblBvcHVsYXRlKCl7fXNjcm9sbFRvSW5kZXgodCl7dGhpcy5fd2FyblByaXZhdGVBUElBY2Nlc3MoInNjcm9sbFRvSW5kZXgiKSx0aGlzLl9zY3JvbGxpbmdUb0luZGV4PSEwLHQ9TWF0aC5taW4oTWF0aC5tYXgodCwwKSx0aGlzLl9lZmZlY3RpdmVTaXplLTEpLHRoaXMuJC50YWJsZS5zY3JvbGxUb3A9dC90aGlzLl9lZmZlY3RpdmVTaXplKih0aGlzLiQudGFibGUuc2Nyb2xsSGVpZ2h0LXRoaXMuJC50YWJsZS5vZmZzZXRIZWlnaHQpLHRoaXMuX3Njcm9sbEhhbmRsZXIoKSx0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSSgoKCk9PnRoaXMuX21heFNjcm9sbFRvcCkpJiZ0aGlzLl92aXJ0dWFsQ291bnQ8dGhpcy5fZWZmZWN0aXZlU2l6ZSYmdGhpcy5fYWRqdXN0VmlydHVhbEluZGV4T2Zmc2V0KDFlNiksdGhpcy5fYWNjZXNzSXJvbkxpc3RBUEkoKCgpPT5zdXBlci5zY3JvbGxUb0luZGV4KHQtdGhpcy5fdmlkeE9mZnNldCkpKSx0aGlzLl9zY3JvbGxIYW5kbGVyKCk7Y29uc3QgZT1BcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZmlsdGVyKChlPT5lLmluZGV4PT09dCkpWzBdO2lmKGUpe2NvbnN0IHQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AtdGhpcy4kLmhlYWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b207TWF0aC5hYnModCk+MSYmKHRoaXMuJC50YWJsZS5zY3JvbGxUb3ArPXQsdGhpcy5fc2Nyb2xsSGFuZGxlcigpKX10aGlzLl9zY3JvbGxpbmdUb0luZGV4PSExfV9lZmZlY3RpdmVTaXplQ2hhbmdlZCh0KXtsZXQgZSxuPTA7dGhpcy5faXRlcmF0ZUl0ZW1zKCgodCxpKT0+e2lmKGk9PT10aGlzLl9maXJzdFZpc2libGVJbmRleCl7Y29uc3QgaT10aGlzLl9waHlzaWNhbEl0ZW1zW3RdO2U9aS5pbmRleCxuPWkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wfX0pKSx0aGlzLml0ZW1zJiZ0PHRoaXMuaXRlbXMubGVuZ3RoJiYodGhpcy5fc2Nyb2xsVG9wPTApLEFycmF5LmlzQXJyYXkodGhpcy5pdGVtcyl8fCh0aGlzLml0ZW1zPXtsZW5ndGg6TWF0aC5taW4odCwxZTUpfSksdGhpcy5fYWNjZXNzSXJvbkxpc3RBUEkoKCgpPT5zdXBlci5faXRlbXNDaGFuZ2VkKHtwYXRoOiJpdGVtcyJ9KSkpLHRoaXMuX3ZpcnR1YWxDb3VudD1NYXRoLm1pbih0aGlzLml0ZW1zLmxlbmd0aCx0KXx8MCwwPT09dGhpcy5fc2Nyb2xsVG9wJiYodGhpcy5fYWNjZXNzSXJvbkxpc3RBUEkoKCgpPT50aGlzLl9zY3JvbGxUb0luZGV4KE1hdGgubWluKHQtMSxlKSkpKSx0aGlzLl9pdGVyYXRlSXRlbXMoKHQ9Pntjb25zdCBpPXRoaXMuX3BoeXNpY2FsSXRlbXNbdF07aWYoaS5pbmRleD09PWUmJih0aGlzLiQudGFibGUuc2Nyb2xsVG9wKz1NYXRoLnJvdW5kKGkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLW4pKSxpLmluZGV4PT09dGhpcy5fZm9jdXNlZEl0ZW1JbmRleCYmdGhpcy5faXRlbXNGb2N1c2FibGUmJnRoaXMuJC5pdGVtcy5jb250YWlucyh0aGlzLnNoYWRvd1Jvb3QuYWN0aXZlRWxlbWVudCkpe2NvbnN0IHQ9QXJyYXkuZnJvbSh0aGlzLl9pdGVtc0ZvY3VzYWJsZS5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKS5pbmRleE9mKHRoaXMuX2l0ZW1zRm9jdXNhYmxlKTtpLmNoaWxkcmVuW3RdLmZvY3VzKCl9fSkpKSx0aGlzLl9hc3NpZ25Nb2RlbHMoKSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT50aGlzLl91cGRhdGUoKSkpLHRoaXMuX191cGRhdGVGb290ZXJQb3NpdGlvbmluZygpfV9wb3NpdGlvbkl0ZW1zKCl7bGV0IHQ7dGhpcy5fYWRqdXN0U2Nyb2xsUG9zaXRpb24oKSxpc05hTih0aGlzLl9waHlzaWNhbFRvcCkmJih0PSEwLHRoaXMuX3BoeXNpY2FsVG9wPTApO2xldCBlPXRoaXMuX3BoeXNpY2FsVG9wO3RoaXMuX2l0ZXJhdGVJdGVtcygodD0+e3RoaXMuX3BoeXNpY2FsSXRlbXNbdF0uc3R5bGUudHJhbnNmb3JtPWB0cmFuc2xhdGVZKCR7ZX1weClgLGUrPXRoaXMuX3BoeXNpY2FsU2l6ZXNbdF19KSksdCYmdGhpcy5fc2Nyb2xsVG9JbmRleCgwKX1faW5jcmVhc2VQb29sSWZOZWVkZWQodCl7MD09PXQmJnRoaXMuX3Njcm9sbGluZ1RvSW5kZXh8fCF0aGlzLl9jYW5Qb3B1bGF0ZSgpfHwhdGhpcy5fZWZmZWN0aXZlU2l6ZXx8KHRoaXMuX2luaXRpYWxQb29sQ3JlYXRlZD90aGlzLl9vcHRQaHlzaWNhbFNpemUhPT0xLzAmJih0aGlzLl9kZWJvdW5jZUluY3JlYXNlUG9vbD1Ubi5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZUluY3JlYXNlUG9vbCxfdCwoKCk9Pnt0aGlzLl91cGRhdGVNZXRyaWNzKCk7bGV0IHQ9TWF0aC5jZWlsKCh0aGlzLl9vcHRQaHlzaWNhbFNpemUtdGhpcy5fcGh5c2ljYWxTaXplKS90aGlzLl9waHlzaWNhbEF2ZXJhZ2UpO3RoaXMuX3BoeXNpY2FsQ291bnQrdD50aGlzLl9lZmZlY3RpdmVTaXplJiYodD1NYXRoLm1heCgwLHRoaXMuX2VmZmVjdGl2ZVNpemUtdGhpcy5fcGh5c2ljYWxDb3VudCkpLHRoaXMuX3BoeXNpY2FsU2l6ZSYmdD4wJiZ0aGlzLl9vcHRQaHlzaWNhbFNpemUhPT0xLzAmJihzdXBlci5faW5jcmVhc2VQb29sSWZOZWVkZWQodCksdGhpcy5fX3Jlb3JkZXJDaGlsZE5vZGVzKCkpfSkpKToodGhpcy5faW5pdGlhbFBvb2xDcmVhdGVkPSEwLHN1cGVyLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgyNSkpKX1fX3Jlb3JkZXJDaGlsZE5vZGVzKCl7Y29uc3QgdD1BcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZE5vZGVzKTt0LnJlZHVjZSgoKHQsZSxuLGkpPT57aWYoMD09PW58fGlbbi0xXS5pbmRleD09PWUuaW5kZXgtMSlyZXR1cm4gdH0pLCEwKXx8dC5zb3J0KCgodCxlKT0+dC5pbmRleC1lLmluZGV4KSkuZm9yRWFjaCgodD0+dGhpcy4kLml0ZW1zLmFwcGVuZENoaWxkKHQpKSl9X2NyZWF0ZVBvb2wodCl7Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksbj10aGlzLl9jcmVhdGVTY3JvbGxlclJvd3ModCk7bi5mb3JFYWNoKCh0PT5lLmFwcGVuZENoaWxkKHQpKSksdGhpcy5fZ2V0Um93VGFyZ2V0KCkuYXBwZW5kQ2hpbGQoZSk7Y29uc3QgaT10aGlzLnF1ZXJ5U2VsZWN0b3IoIltzbG90XSIpO2lmKGkpe2NvbnN0IHQ9aS5nZXRBdHRyaWJ1dGUoInNsb3QiKTtpLnNldEF0dHJpYnV0ZSgic2xvdCIsImZvby1iYXIiKSxpLnNldEF0dHJpYnV0ZSgic2xvdCIsdCl9cmV0dXJuIExpKHRoaXMsKCgpPT50aGlzLm5vdGlmeVJlc2l6ZSgpKSksbn1fYXNzaWduTW9kZWxzKHQpe3RoaXMuX2l0ZXJhdGVJdGVtcygoKHQsZSk9Pntjb25zdCBuPXRoaXMuX3BoeXNpY2FsSXRlbXNbdF07dGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJoaWRkZW4iLGU+PXRoaXMuX2VmZmVjdGl2ZVNpemUsbiksdGhpcy5fdXBkYXRlU2Nyb2xsZXJJdGVtKG4sZSsodGhpcy5fdmlkeE9mZnNldHx8MCkpfSksdCl9X3Njcm9sbEhhbmRsZXIoKXtjb25zdCB0PXRoaXMuJC50YWJsZS5zY3JvbGxUb3AtdGhpcy5fc2Nyb2xsUG9zaXRpb247dGhpcy5fYWNjZXNzSXJvbkxpc3RBUEkoc3VwZXIuX3Njcm9sbEhhbmRsZXIpO2NvbnN0IGU9dGhpcy5fdmlkeE9mZnNldDt0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSSgoKCk9PnRoaXMuX21heFNjcm9sbFRvcCkpJiZ0aGlzLl92aXJ0dWFsQ291bnQ8dGhpcy5fZWZmZWN0aXZlU2l6ZT90aGlzLl9hZGp1c3RWaXJ0dWFsSW5kZXhPZmZzZXQodCk6dGhpcy5fdmlkeE9mZnNldD0wLHRoaXMuX3ZpZHhPZmZzZXQhPT1lJiZ0aGlzLl91cGRhdGUoKSx0aGlzLl9hZnRlclNjcm9sbCgpfV9hZGp1c3RWaXJ0dWFsSW5kZXhPZmZzZXQodCl7aWYoTWF0aC5hYnModCk+MWU0KXtpZih0aGlzLl9ub1NjYWxlKXJldHVybiB2b2lkKHRoaXMuX25vU2NhbGU9ITEpO2NvbnN0IHQ9dGhpcy4kLnRhYmxlLnNjcm9sbFRvcC8odGhpcy4kLnRhYmxlLnNjcm9sbEhlaWdodC10aGlzLiQudGFibGUub2Zmc2V0SGVpZ2h0KTt0aGlzLl92aWR4T2Zmc2V0PU1hdGgucm91bmQodCp0aGlzLl9lZmZlY3RpdmVTaXplLXQqdGhpcy5fdmlydHVhbENvdW50KX1lbHNle2NvbnN0IHQ9dGhpcy5fdmlkeE9mZnNldHx8MCxlPTFlMyxuPTEwMDswPT09dGhpcy5fc2Nyb2xsVG9wPyh0aGlzLl92aWR4T2Zmc2V0PTAsdCE9PXRoaXMuX3ZpZHhPZmZzZXQmJnN1cGVyLnNjcm9sbFRvSW5kZXgoMCkpOnRoaXMuZmlyc3RWaXNpYmxlSW5kZXg8ZSYmdGhpcy5fdmlkeE9mZnNldD4wJiYodGhpcy5fdmlkeE9mZnNldC09TWF0aC5taW4odGhpcy5fdmlkeE9mZnNldCxuKSx0IT09dGhpcy5fdmlkeE9mZnNldCYmc3VwZXIuc2Nyb2xsVG9JbmRleCh0aGlzLmZpcnN0VmlzaWJsZUluZGV4Kyh0LXRoaXMuX3ZpZHhPZmZzZXQpKSx0aGlzLl9ub1NjYWxlPSEwKTtjb25zdCBpPXRoaXMuX2VmZmVjdGl2ZVNpemUtdGhpcy5fdmlydHVhbENvdW50O3RoaXMuX3Njcm9sbFRvcD49dGhpcy5fbWF4U2Nyb2xsVG9wJiZ0aGlzLl9tYXhTY3JvbGxUb3A+MD8odGhpcy5fdmlkeE9mZnNldD1pLHQhPT10aGlzLl92aWR4T2Zmc2V0JiZzdXBlci5zY3JvbGxUb0luZGV4KHRoaXMuX3ZpcnR1YWxDb3VudCkpOnRoaXMuZmlyc3RWaXNpYmxlSW5kZXg+dGhpcy5fdmlydHVhbENvdW50LWUmJnRoaXMuX3ZpZHhPZmZzZXQ8aSYmKHRoaXMuX3ZpZHhPZmZzZXQrPU1hdGgubWluKGktdGhpcy5fdmlkeE9mZnNldCxuKSx0IT09dGhpcy5fdmlkeE9mZnNldCYmc3VwZXIuc2Nyb2xsVG9JbmRleCh0aGlzLmZpcnN0VmlzaWJsZUluZGV4LSh0aGlzLl92aWR4T2Zmc2V0LXQpKSx0aGlzLl9ub1NjYWxlPSEwKX19X2FjY2Vzc0lyb25MaXN0QVBJKHQpe3RoaXMuX3dhcm5Qcml2YXRlQVBJQWNjZXNzQXN5bmNFbmFibGVkPSExO2NvbnN0IGU9dC5hcHBseSh0aGlzKTtyZXR1cm4gdGhpcy5fZGVib3VuY2VyV2FyblByaXZhdGVBUElBY2Nlc3M9VG4uZGVib3VuY2UodGhpcy5fZGVib3VuY2VyV2FyblByaXZhdGVBUElBY2Nlc3MsX3QsKCgpPT50aGlzLl93YXJuUHJpdmF0ZUFQSUFjY2Vzc0FzeW5jRW5hYmxlZD0hMCkpLGV9X2RlYm91bmNlUmVuZGVyKHQsZSl7c3VwZXIuX2RlYm91bmNlUmVuZGVyKCgoKT0+dGhpcy5fYWNjZXNzSXJvbkxpc3RBUEkodCkpLGUpfV93YXJuUHJpdmF0ZUFQSUFjY2Vzcyh0KXt0aGlzLl93YXJuUHJpdmF0ZUFQSUFjY2Vzc0FzeW5jRW5hYmxlZCYmY29uc29sZS53YXJuKGBBY2Nlc3NpbmcgcHJpdmF0ZSBBUEkgKCR7dH0pIWApfV9yZW5kZXIoKXt0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSShzdXBlci5fcmVuZGVyKX1faXRlbXNDaGFuZ2VkKCl7fWdldCBfZmlyc3RWaXNpYmxlSW5kZXgoKXtyZXR1cm4gdGhpcy5fYWNjZXNzSXJvbkxpc3RBUEkoKCgpPT5zdXBlci5maXJzdFZpc2libGVJbmRleCkpfWdldCBfbGFzdFZpc2libGVJbmRleCgpe3JldHVybiB0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSSgoKCk9PnN1cGVyLmxhc3RWaXNpYmxlSW5kZXgpKX1fc2Nyb2xsVG9JbmRleCh0KXt0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSSgoKCk9PnRoaXMuc2Nyb2xsVG9JbmRleCh0KSkpfWdldCBmaXJzdFZpc2libGVJbmRleCgpe3JldHVybiB0aGlzLl93YXJuUHJpdmF0ZUFQSUFjY2VzcygiZmlyc3RWaXNpYmxlSW5kZXgiKSxzdXBlci5maXJzdFZpc2libGVJbmRleH1zZXQgZmlyc3RWaXNpYmxlSW5kZXgodCl7dGhpcy5fd2FyblByaXZhdGVBUElBY2Nlc3MoImZpcnN0VmlzaWJsZUluZGV4Iiksc3VwZXIuZmlyc3RWaXNpYmxlSW5kZXg9dH1nZXQgbGFzdFZpc2libGVJbmRleCgpe3JldHVybiB0aGlzLl93YXJuUHJpdmF0ZUFQSUFjY2VzcygibGFzdFZpc2libGVJbmRleCIpLHN1cGVyLmxhc3RWaXNpYmxlSW5kZXh9c2V0IGxhc3RWaXNpYmxlSW5kZXgodCl7dGhpcy5fd2FyblByaXZhdGVBUElBY2Nlc3MoImxhc3RWaXNpYmxlSW5kZXgiKSxzdXBlci5sYXN0VmlzaWJsZUluZGV4PXR9dXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzKCl7dGhpcy5fd2FyblByaXZhdGVBUElBY2Nlc3MoInVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcyIpLHN1cGVyLnVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9X3Jlc2l6ZUhhbmRsZXIoKXtzdXBlci5fcmVzaXplSGFuZGxlcigpLERpKCl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqL2NvbnN0IFAkdD10PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBvYnNlcnZlcnMoKXtyZXR1cm5bIl9hMTF5VXBkYXRlR3JpZFNpemUoc2l6ZSwgX2NvbHVtblRyZWUsIF9jb2x1bW5UcmVlLiopIl19X2ExMXlHZXRIZWFkZXJSb3dDb3VudCh0KXtyZXR1cm4gdC5maWx0ZXIoKHQ9PnQuc29tZSgodD0+dC5faGVhZGVyVGVtcGxhdGV8fHQuaGVhZGVyUmVuZGVyZXJ8fHQucGF0aHx8dC5oZWFkZXIpKSkpLmxlbmd0aH1fYTExeUdldEZvb3RlclJvd0NvdW50KHQpe3JldHVybiB0LmZpbHRlcigodD0+dC5zb21lKCh0PT50Ll9oZWFkZXJUZW1wbGF0ZXx8dC5oZWFkZXJSZW5kZXJlcikpKSkubGVuZ3RofV9hMTF5VXBkYXRlR3JpZFNpemUodCxlKXtpZih2b2lkIDA9PT10fHx2b2lkIDA9PT1lKXJldHVybjtjb25zdCBuPWVbZS5sZW5ndGgtMV07dGhpcy4kLnRhYmxlLnNldEF0dHJpYnV0ZSgiYXJpYS1yb3djb3VudCIsdCt0aGlzLl9hMTF5R2V0SGVhZGVyUm93Q291bnQoZSkrdGhpcy5fYTExeUdldEZvb3RlclJvd0NvdW50KGUpKSx0aGlzLiQudGFibGUuc2V0QXR0cmlidXRlKCJhcmlhLWNvbGNvdW50IixuJiZuLmxlbmd0aHx8MCksdGhpcy5fYTExeVVwZGF0ZUhlYWRlclJvd3MoKSx0aGlzLl9hMTF5VXBkYXRlRm9vdGVyUm93cygpfV9hMTF5VXBkYXRlSGVhZGVyUm93cygpe0FycmF5LmZyb20odGhpcy4kLmhlYWRlci5jaGlsZHJlbikuZm9yRWFjaCgoKHQsZSk9PnQuc2V0QXR0cmlidXRlKCJhcmlhLXJvd2luZGV4IixlKzEpKSl9X2ExMXlVcGRhdGVGb290ZXJSb3dzKCl7QXJyYXkuZnJvbSh0aGlzLiQuZm9vdGVyLmNoaWxkcmVuKS5mb3JFYWNoKCgodCxlKT0+dC5zZXRBdHRyaWJ1dGUoImFyaWEtcm93aW5kZXgiLHRoaXMuX2ExMXlHZXRIZWFkZXJSb3dDb3VudCh0aGlzLl9jb2x1bW5UcmVlKSt0aGlzLnNpemUrZSsxKSkpfV9hMTF5VXBkYXRlUm93Um93aW5kZXgodCxlKXt0LnNldEF0dHJpYnV0ZSgiYXJpYS1yb3dpbmRleCIsZSt0aGlzLl9hMTF5R2V0SGVhZGVyUm93Q291bnQodGhpcy5fY29sdW1uVHJlZSkrMSl9X2ExMXlVcGRhdGVSb3dTZWxlY3RlZCh0LGUpe3Quc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIixCb29sZWFuKGUpKSxBcnJheS5mcm9tKHQuY2hpbGRyZW4pLmZvckVhY2goKHQ9PnQuc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIixCb29sZWFuKGUpKSkpfV9hMTF5VXBkYXRlUm93TGV2ZWwodCxlKXt0LnNldEF0dHJpYnV0ZSgiYXJpYS1sZXZlbCIsZSsxKX1fYTExeVVwZGF0ZVJvd0RldGFpbHNPcGVuZWQodCxlKXtBcnJheS5mcm9tKHQuY2hpbGRyZW4pLmZvckVhY2goKHQ9PnsiYm9vbGVhbiI9PXR5cGVvZiBlP3Quc2V0QXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIixlKTp0Lmhhc0F0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIpJiZ0LnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIpfSkpfV9hMTF5U2V0Um93RGV0YWlsc0NlbGwodCxlKXtBcnJheS5mcm9tKHQuY2hpbGRyZW4pLmZvckVhY2goKHQ9Pnt0IT09ZSYmdC5zZXRBdHRyaWJ1dGUoImFyaWEtY29udHJvbHMiLGUuaWQpfSkpfV9hMTF5VXBkYXRlQ2VsbENvbHNwYW4odCxlKXt0LnNldEF0dHJpYnV0ZSgiYXJpYS1jb2xzcGFuIixOdW1iZXIoZSkpfV9hMTF5VXBkYXRlU29ydGVycygpe0FycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCJ2YWFkaW4tZ3JpZC1zb3J0ZXIiKSkuZm9yRWFjaCgodD0+e2xldCBlPXQucGFyZW50Tm9kZTtmb3IoO2UmJiJ2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQiIT09ZS5sb2NhbE5hbWU7KWU9ZS5wYXJlbnROb2RlO2UmJmUuYXNzaWduZWRTbG90JiZlLmFzc2lnbmVkU2xvdC5wYXJlbnROb2RlLnNldEF0dHJpYnV0ZSgiYXJpYS1zb3J0Iix7YXNjOiJhc2NlbmRpbmciLGRlc2M6ImRlc2NlbmRpbmcifVtTdHJpbmcodC5kaXJlY3Rpb24pXXx8Im5vbmUiKX0pKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovLE4kdD10PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue2FjdGl2ZUl0ZW06e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTpudWxsfX19cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMuJC5zY3JvbGxlci5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5fb25DbGljay5iaW5kKHRoaXMpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImNlbGwtYWN0aXZhdGUiLHRoaXMuX2FjdGl2YXRlSXRlbS5iaW5kKHRoaXMpKX1fYWN0aXZhdGVJdGVtKHQpe2NvbnN0IGU9dC5kZXRhaWwubW9kZWwsbj1lP2UuaXRlbTpudWxsO24mJih0aGlzLmFjdGl2ZUl0ZW09dGhpcy5faXRlbXNFcXVhbCh0aGlzLmFjdGl2ZUl0ZW0sbik/bnVsbDpuKX1fb25DbGljayh0KXtpZih0LmRlZmF1bHRQcmV2ZW50ZWQpcmV0dXJuO2NvbnN0IGU9dC5jb21wb3NlZFBhdGgoKSxuPWVbZS5pbmRleE9mKHRoaXMuJC50YWJsZSktM107aWYoIW58fG4uZ2V0QXR0cmlidXRlKCJwYXJ0IikuaW5kZXhPZigiZGV0YWlscy1jZWxsIik+LTEpcmV0dXJuO2NvbnN0IGk9bi5fY29udGVudCxyPXRoaXMuZ2V0Um9vdE5vZGUoKS5hY3RpdmVFbGVtZW50O2kuY29udGFpbnMocil8fHRoaXMuX2lzRm9jdXNhYmxlKHQudGFyZ2V0KXx8dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY2VsbC1hY3RpdmF0ZSIse2RldGFpbDp7bW9kZWw6dGhpcy5fX2dldFJvd01vZGVsKG4ucGFyZW50RWxlbWVudCl9fSkpfV9pc0ZvY3VzYWJsZSh0KXtyZXR1cm4gSSR0KHQpfX0sSSR0PXQ9PntpZighdC5wYXJlbnROb2RlKXJldHVybiExO2NvbnN0IGU9LTEhPT1BcnJheS5mcm9tKHQucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKCJbdGFiaW5kZXhdLCBidXR0b24sIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBvYmplY3QsIGlmcmFtZSwgbGFiZWwsIGFbaHJlZl0sIGFyZWFbaHJlZl0iKSkuZmlsdGVyKCh0PT4iY2VsbCBib2R5LWNlbGwiIT09dC5nZXRBdHRyaWJ1dGUoInBhcnQiKSkpLmluZGV4T2YodCk7cmV0dXJuIXQuZGlzYWJsZWQmJmV9LFIkdD10PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue2l0ZW1zOkFycmF5fX1zdGF0aWMgZ2V0IG9ic2VydmVycygpe3JldHVyblsiX2l0ZW1zQ2hhbmdlZChpdGVtcywgaXRlbXMuKiwgaXNBdHRhY2hlZCkiXX1faXRlbXNDaGFuZ2VkKHQsZSxuKXtpZihuKXtpZighQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gbnVsbD09dCYmKHRoaXMuc2l6ZT0wKSx2b2lkKHRoaXMuZGF0YVByb3ZpZGVyPT09dGhpcy5fYXJyYXlEYXRhUHJvdmlkZXImJih0aGlzLmRhdGFQcm92aWRlcj12b2lkIDApKTt0aGlzLnNpemU9dC5sZW5ndGgsdGhpcy5kYXRhUHJvdmlkZXI9dGhpcy5kYXRhUHJvdmlkZXJ8fHRoaXMuX2FycmF5RGF0YVByb3ZpZGVyLHRoaXMuY2xlYXJDYWNoZSgpLHRoaXMuX2Vuc3VyZUZpcnN0UGFnZUxvYWRlZCgpfX1fYXJyYXlEYXRhUHJvdmlkZXIodCxlKXtsZXQgbj0oQXJyYXkuaXNBcnJheSh0aGlzLml0ZW1zKT90aGlzLml0ZW1zOltdKS5zbGljZSgwKTt0aGlzLl9maWx0ZXJzJiZ0aGlzLl9jaGVja1BhdGhzKHRoaXMuX2ZpbHRlcnMsImZpbHRlcmluZyIsbikmJihuPXRoaXMuX2ZpbHRlcihuKSksdGhpcy5zaXplPW4ubGVuZ3RoLHQuc29ydE9yZGVycy5sZW5ndGgmJnRoaXMuX2NoZWNrUGF0aHModGhpcy5fc29ydGVycywic29ydGluZyIsbikmJihuPW4uc29ydCh0aGlzLl9tdWx0aVNvcnQuYmluZCh0aGlzKSkpO2NvbnN0IGk9dC5wYWdlKnQucGFnZVNpemU7ZShuLnNsaWNlKGksaSt0LnBhZ2VTaXplKSxuLmxlbmd0aCl9X2NoZWNrUGF0aHModCxlLG4pe2lmKCFuLmxlbmd0aClyZXR1cm4hMTtsZXQgaT0hMDtmb3IobGV0IHIgaW4gdCl7Y29uc3Qgbz10W3JdLnBhdGg7aWYoIW98fC0xPT09by5pbmRleE9mKCIuIikpY29udGludWU7Y29uc3QgYT1vLnJlcGxhY2UoL1wuW14uXSokLywiIik7dm9pZCAwPT09Zm8uZ2V0KGEsblswXSkmJihjb25zb2xlLndhcm4oYFBhdGggIiR7b30iIHVzZWQgZm9yICR7ZX0gZG9lcyBub3QgZXhpc3QgaW4gYWxsIG9mIHRoZSBpdGVtcywgJHtlfSBpcyBkaXNhYmxlZC5gKSxpPSExKX1yZXR1cm4gaX1fbXVsdGlTb3J0KHQsZSl7cmV0dXJuIHRoaXMuX3NvcnRlcnMubWFwKChuPT4iYXNjIj09PW4uZGlyZWN0aW9uP3RoaXMuX2NvbXBhcmUoZm8uZ2V0KG4ucGF0aCx0KSxmby5nZXQobi5wYXRoLGUpKToiZGVzYyI9PT1uLmRpcmVjdGlvbj90aGlzLl9jb21wYXJlKGZvLmdldChuLnBhdGgsZSksZm8uZ2V0KG4ucGF0aCx0KSk6MCkpLnJlZHVjZSgoKHQsZSk9PnR8fGUpLDApfV9ub3JtYWxpemVFbXB0eVZhbHVlKHQpe3JldHVyblt2b2lkIDAsbnVsbF0uaW5kZXhPZih0KT49MD8iIjppc05hTih0KT90LnRvU3RyaW5nKCk6dH1fY29tcGFyZSh0LGUpe3JldHVybih0PXRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUodCkpPChlPXRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUoZSkpPy0xOnQ+ZT8xOjB9X2ZpbHRlcih0KXtyZXR1cm4gdC5maWx0ZXIoKHQ9PjA9PT10aGlzLl9maWx0ZXJzLmZpbHRlcigoZT0+e2NvbnN0IG49dGhpcy5fbm9ybWFsaXplRW1wdHlWYWx1ZShmby5nZXQoZS5wYXRoLHQpKSxpPXRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUoZS52YWx1ZSkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO3JldHVybi0xPT09bi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihpKX0pKS5sZW5ndGgpKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovLE8kdD10PT5jbGFzcyBleHRlbmRzKHBpKHQpKXtyZWFkeSgpe3N1cGVyLnJlYWR5KCk7Y29uc3QgdD10aGlzLiQuc2Nyb2xsZXI7aWkodCwidHJhY2siLHRoaXMuX29uSGVhZGVyVHJhY2suYmluZCh0aGlzKSksdC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLChlPT50Lmhhc0F0dHJpYnV0ZSgiY29sdW1uLXJlc2l6aW5nIikmJmUucHJldmVudERlZmF1bHQoKSkpLHQuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCh0PT4icmVzaXplLWhhbmRsZSI9PXQudGFyZ2V0LmdldEF0dHJpYnV0ZSgicGFydCIpJiZ0LnByZXZlbnREZWZhdWx0KCkpKSx0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsKHQ9PiJyZXNpemUtaGFuZGxlIj09PXQudGFyZ2V0LmdldEF0dHJpYnV0ZSgicGFydCIpJiZ0LnByZXZlbnREZWZhdWx0KCkpKX1fb25IZWFkZXJUcmFjayh0KXtjb25zdCBlPXQudGFyZ2V0O2lmKCJyZXNpemUtaGFuZGxlIj09PWUuZ2V0QXR0cmlidXRlKCJwYXJ0Iikpe2xldCBuPWUucGFyZW50RWxlbWVudC5fY29sdW1uO2Zvcih0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImNvbHVtbi1yZXNpemluZyIsITAsdGhpcy4kLnNjcm9sbGVyKTsidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PW4ubG9jYWxOYW1lOyluPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG4uX2NoaWxkQ29sdW1ucywwKS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9vcmRlci1lLl9vcmRlcn0pKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiF0LmhpZGRlbn0pKS5wb3AoKTtjb25zdCBpPUFycmF5LmZyb20odGhpcy4kLmhlYWRlci5xdWVyeVNlbGVjdG9yQWxsKCdbcGFydH49InJvdyJdOmxhc3QtY2hpbGQgW3BhcnR+PSJjZWxsIl0nKSkscj1pLmZpbHRlcigodD0+dC5fY29sdW1uPT09bikpWzBdO2lmKHIub2Zmc2V0V2lkdGgpe2NvbnN0IGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUociksaT0xMCtwYXJzZUludChlLnBhZGRpbmdMZWZ0KStwYXJzZUludChlLnBhZGRpbmdSaWdodCkrcGFyc2VJbnQoZS5ib3JkZXJMZWZ0V2lkdGgpK3BhcnNlSW50KGUuYm9yZGVyUmlnaHRXaWR0aCkrcGFyc2VJbnQoZS5tYXJnaW5MZWZ0KStwYXJzZUludChlLm1hcmdpblJpZ2h0KSxvPXIub2Zmc2V0V2lkdGgrKHRoaXMuX19pc1JUTD9yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtdC5kZXRhaWwueDp0LmRldGFpbC54LXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQpO24ud2lkdGg9TWF0aC5tYXgoaSxvKSsicHgiLG4uZmxleEdyb3c9MH1pLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX2NvbHVtbi5fb3JkZXItZS5fY29sdW1uLl9vcmRlcn0pKS5mb3JFYWNoKChmdW5jdGlvbih0LGUsbil7ZTxuLmluZGV4T2YocikmJih0Ll9jb2x1bW4ud2lkdGg9dC5vZmZzZXRXaWR0aCsicHgiLHQuX2NvbHVtbi5mbGV4R3Jvdz0wKX0pKSwiZW5kIj09PXQuZGV0YWlsLnN0YXRlJiYodGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJjb2x1bW4tcmVzaXppbmciLCExLHRoaXMuJC5zY3JvbGxlciksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY29sdW1uLXJlc2l6ZSIse2RldGFpbDp7cmVzaXplZENvbHVtbjpufX0pKSksdGhpcy5fcmVzaXplSGFuZGxlcigpfX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovLHokdD1jbGFzcyB0e2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLmdyaWQ9dCx0aGlzLnBhcmVudENhY2hlPWUsdGhpcy5wYXJlbnRJdGVtPW4sdGhpcy5pdGVtQ2FjaGVzPXt9LHRoaXMuaXRlbXM9e30sdGhpcy5lZmZlY3RpdmVTaXplPTAsdGhpcy5zaXplPTAsdGhpcy5wZW5kaW5nUmVxdWVzdHM9e319aXNMb2FkaW5nKCl7cmV0dXJuIEJvb2xlYW4oT2JqZWN0LmtleXModGhpcy5wZW5kaW5nUmVxdWVzdHMpLmxlbmd0aHx8T2JqZWN0LmtleXModGhpcy5pdGVtQ2FjaGVzKS5maWx0ZXIoKHQ9PnRoaXMuaXRlbUNhY2hlc1t0XS5pc0xvYWRpbmcoKSkpWzBdKX1nZXRJdGVtRm9ySW5kZXgodCl7Y29uc3R7Y2FjaGU6ZSxzY2FsZWRJbmRleDpufT10aGlzLmdldENhY2hlQW5kSW5kZXgodCk7cmV0dXJuIGUuaXRlbXNbbl19dXBkYXRlU2l6ZSgpe3RoaXMuZWZmZWN0aXZlU2l6ZT0hdGhpcy5wYXJlbnRJdGVtfHx0aGlzLmdyaWQuX2lzRXhwYW5kZWQodGhpcy5wYXJlbnRJdGVtKT90aGlzLnNpemUrT2JqZWN0LmtleXModGhpcy5pdGVtQ2FjaGVzKS5yZWR1Y2UoKCh0LGUpPT57Y29uc3Qgbj10aGlzLml0ZW1DYWNoZXNbZV07cmV0dXJuIG4udXBkYXRlU2l6ZSgpLHQrbi5lZmZlY3RpdmVTaXplfSksMCk6MH1lbnN1cmVTdWJDYWNoZUZvclNjYWxlZEluZGV4KGUpe2lmKCF0aGlzLml0ZW1DYWNoZXNbZV0pe2NvbnN0IG49bmV3IHQodGhpcy5ncmlkLHRoaXMsdGhpcy5pdGVtc1tlXSk7dGhpcy5pdGVtQ2FjaGVzW2VdPW4sdGhpcy5ncmlkLl9sb2FkUGFnZSgwLG4pfX1nZXRDYWNoZUFuZEluZGV4KHQpe2xldCBlPXQ7Y29uc3Qgbj1PYmplY3Qua2V5cyh0aGlzLml0ZW1DYWNoZXMpO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKXtjb25zdCBpPU51bWJlcihuW3RdKSxyPXRoaXMuaXRlbUNhY2hlc1tpXTtpZihlPD1pKXJldHVybntjYWNoZTp0aGlzLHNjYWxlZEluZGV4OmV9O2lmKGU8PWkrci5lZmZlY3RpdmVTaXplKXJldHVybiByLmdldENhY2hlQW5kSW5kZXgoZS1pLTEpO2UtPXIuZWZmZWN0aXZlU2l6ZX1yZXR1cm57Y2FjaGU6dGhpcyxzY2FsZWRJbmRleDplfX19LEQkdD10PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue3BhZ2VTaXplOnt0eXBlOk51bWJlcix2YWx1ZTo1MCxvYnNlcnZlcjoiX3BhZ2VTaXplQ2hhbmdlZCJ9LGRhdGFQcm92aWRlcjp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLG9ic2VydmVyOiJfZGF0YVByb3ZpZGVyQ2hhbmdlZCJ9LGxvYWRpbmc6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAscmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfY2FjaGU6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB6JHQodGhpcyl9fSxpdGVtSWRQYXRoOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxleHBhbmRlZEl0ZW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsdmFsdWU6KCk9PltdfX19c3RhdGljIGdldCBvYnNlcnZlcnMoKXtyZXR1cm5bIl9zaXplQ2hhbmdlZChzaXplKSIsIl9pdGVtSWRQYXRoQ2hhbmdlZChpdGVtSWRQYXRoKSIsIl9leHBhbmRlZEl0ZW1zQ2hhbmdlZChleHBhbmRlZEl0ZW1zLiopIl19X3NpemVDaGFuZ2VkKHQpe2NvbnN0IGU9dC10aGlzLl9jYWNoZS5zaXplO3RoaXMuX2NhY2hlLnNpemUrPWUsdGhpcy5fY2FjaGUuZWZmZWN0aXZlU2l6ZSs9ZSx0aGlzLl9lZmZlY3RpdmVTaXplPXRoaXMuX2NhY2hlLmVmZmVjdGl2ZVNpemUsdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoMCksdGhpcy5fZGVib3VuY2VJbmNyZWFzZVBvb2wmJnRoaXMuX2RlYm91bmNlSW5jcmVhc2VQb29sLmZsdXNoKCl9X2dldEl0ZW0odCxlKXtpZih0Pj10aGlzLl9lZmZlY3RpdmVTaXplKXJldHVybjtlLmluZGV4PXQ7Y29uc3R7Y2FjaGU6bixzY2FsZWRJbmRleDppfT10aGlzLl9jYWNoZS5nZXRDYWNoZUFuZEluZGV4KHQpLHI9bi5pdGVtc1tpXTtyPyh0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImxvYWRpbmciLCExLGUpLHRoaXMuX3VwZGF0ZUl0ZW0oZSxyKSx0aGlzLl9pc0V4cGFuZGVkKHIpJiZuLmVuc3VyZVN1YkNhY2hlRm9yU2NhbGVkSW5kZXgoaSkpOih0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImxvYWRpbmciLCEwLGUpLHRoaXMuX2xvYWRQYWdlKHRoaXMuX2dldFBhZ2VGb3JJbmRleChpKSxuKSl9X2V4cGFuZGVkSW5zdGFuY2VDaGFuZ2VkQ2FsbGJhY2sodCxlKXt2b2lkIDAhPT10Lml0ZW0mJihlP3RoaXMuZXhwYW5kSXRlbSh0Lml0ZW0pOnRoaXMuY29sbGFwc2VJdGVtKHQuaXRlbSkpfWdldEl0ZW1JZCh0KXtyZXR1cm4gdGhpcy5pdGVtSWRQYXRoP3RoaXMuZ2V0KHRoaXMuaXRlbUlkUGF0aCx0KTp0fV9pc0V4cGFuZGVkKHQpe3JldHVybiB0aGlzLl9fZXhwYW5kZWRLZXlzLmhhcyh0aGlzLmdldEl0ZW1JZCh0KSl9X2V4cGFuZGVkSXRlbXNDaGFuZ2VkKCl7dGhpcy5fX2NhY2hlRXhwYW5kZWRLZXlzKCksdGhpcy5fY2FjaGUudXBkYXRlU2l6ZSgpLHRoaXMuX2VmZmVjdGl2ZVNpemU9dGhpcy5fY2FjaGUuZWZmZWN0aXZlU2l6ZSx0aGlzLl9hc3NpZ25Nb2RlbHMoKX1faXRlbUlkUGF0aENoYW5nZWQoKXt0aGlzLl9fY2FjaGVFeHBhbmRlZEtleXMoKX1fX2NhY2hlRXhwYW5kZWRLZXlzKCl7dGhpcy5leHBhbmRlZEl0ZW1zJiYodGhpcy5fX2V4cGFuZGVkS2V5cz1uZXcgU2V0LHRoaXMuZXhwYW5kZWRJdGVtcy5mb3JFYWNoKCh0PT57dGhpcy5fX2V4cGFuZGVkS2V5cy5hZGQodGhpcy5nZXRJdGVtSWQodCkpfSkpKX1leHBhbmRJdGVtKHQpe3RoaXMuX2lzRXhwYW5kZWQodCl8fCh0aGlzLmV4cGFuZGVkSXRlbXM9Wy4uLnRoaXMuZXhwYW5kZWRJdGVtcyx0XSl9Y29sbGFwc2VJdGVtKHQpe3RoaXMuX2lzRXhwYW5kZWQodCkmJih0aGlzLmV4cGFuZGVkSXRlbXM9dGhpcy5leHBhbmRlZEl0ZW1zLmZpbHRlcigoZT0+IXRoaXMuX2l0ZW1zRXF1YWwoZSx0KSkpKX1fZ2V0SW5kZXhMZXZlbCh0KXtsZXR7Y2FjaGU6ZX09dGhpcy5fY2FjaGUuZ2V0Q2FjaGVBbmRJbmRleCh0KSxuPTA7Zm9yKDtlLnBhcmVudENhY2hlOyllPWUucGFyZW50Q2FjaGUsbisrO3JldHVybiBufV9jYW5Qb3B1bGF0ZSgpe3JldHVybiBCb29sZWFuKHRoaXMuX2hhc0RhdGEmJnRoaXMuX2NvbHVtblRyZWUpfV9sb2FkUGFnZSh0LGUpe2lmKCFlLnBlbmRpbmdSZXF1ZXN0c1t0XSYmdGhpcy5kYXRhUHJvdmlkZXIpe3RoaXMuX3NldExvYWRpbmcoITApLGUucGVuZGluZ1JlcXVlc3RzW3RdPSEwO2NvbnN0IG49e3BhZ2U6dCxwYWdlU2l6ZTp0aGlzLnBhZ2VTaXplLHNvcnRPcmRlcnM6dGhpcy5fbWFwU29ydGVycygpLGZpbHRlcnM6dGhpcy5fbWFwRmlsdGVycygpLHBhcmVudEl0ZW06ZS5wYXJlbnRJdGVtfTt0aGlzLl9kZWJvdW5jZUluY3JlYXNlUG9vbCYmdGhpcy5fZGVib3VuY2VJbmNyZWFzZVBvb2wuZmx1c2goKSx0aGlzLmRhdGFQcm92aWRlcihuLCgoaSxyKT0+e3ZvaWQgMCE9PXI/ZS5zaXplPXI6bi5wYXJlbnRJdGVtJiYoZS5zaXplPWkubGVuZ3RoKTtjb25zdCBvPUFycmF5LmZyb20odGhpcy4kLml0ZW1zLmNoaWxkcmVuKS5tYXAoKHQ9PnQuX2l0ZW0pKTtpLmZvckVhY2goKChuLGkpPT57Y29uc3Qgcj10KnRoaXMucGFnZVNpemUraTtlLml0ZW1zW3JdPW4sdGhpcy5faXNFeHBhbmRlZChuKSYmby5pbmRleE9mKG4pPi0xJiZlLmVuc3VyZVN1YkNhY2hlRm9yU2NhbGVkSW5kZXgocil9KSksdGhpcy5faGFzRGF0YT0hMCxkZWxldGUgZS5wZW5kaW5nUmVxdWVzdHNbdF0sdGhpcy5fZGVib3VuY2VyQXBwbHlDYWNoZWREYXRhPVRuLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlckFwcGx5Q2FjaGVkRGF0YSxndC5hZnRlcigwKSwoKCk9Pnt0aGlzLl9zZXRMb2FkaW5nKCExKSx0aGlzLl9jYWNoZS51cGRhdGVTaXplKCksdGhpcy5fZWZmZWN0aXZlU2l6ZT10aGlzLl9jYWNoZS5lZmZlY3RpdmVTaXplLEFycmF5LmZyb20odGhpcy4kLml0ZW1zLmNoaWxkcmVuKS5maWx0ZXIoKHQ9PiF0LmhpZGRlbikpLmZvckVhY2goKHQ9Pnt0aGlzLl9jYWNoZS5nZXRJdGVtRm9ySW5kZXgodC5pbmRleCkmJnRoaXMuX2dldEl0ZW0odC5pbmRleCx0KX0pKSx0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgwKSx0aGlzLl9fc2Nyb2xsVG9QZW5kaW5nSW5kZXgoKX0pKSx0aGlzLl9jYWNoZS5pc0xvYWRpbmcoKXx8dGhpcy5fZGVib3VuY2VyQXBwbHlDYWNoZWREYXRhLmZsdXNoKCksdGhpcy5fX2l0ZW1zUmVjZWl2ZWQoKX0pKX19X2dldFBhZ2VGb3JJbmRleCh0KXtyZXR1cm4gTWF0aC5mbG9vcih0L3RoaXMucGFnZVNpemUpfWNsZWFyQ2FjaGUoKXt0aGlzLl9jYWNoZT1uZXcgeiR0KHRoaXMpLEFycmF5LmZyb20odGhpcy4kLml0ZW1zLmNoaWxkcmVuKS5mb3JFYWNoKCh0PT57QXJyYXkuZnJvbSh0LmNoaWxkcmVuKS5mb3JFYWNoKCh0PT57dC5faW5zdGFuY2UmJnQuX2luc3RhbmNlLl9zZXRQZW5kaW5nUHJvcGVydHkoIml0ZW0iLHt9LCExKX0pKX0pKSx0aGlzLl9jYWNoZS5zaXplPXRoaXMuc2l6ZXx8MCx0aGlzLl9jYWNoZS51cGRhdGVTaXplKCksdGhpcy5faGFzRGF0YT0hMSx0aGlzLl9hc3NpZ25Nb2RlbHMoKSx0aGlzLl9lZmZlY3RpdmVTaXplJiZ0aGlzLl9pbml0aWFsUG9vbENyZWF0ZWR8fHRoaXMuX2xvYWRQYWdlKDAsdGhpcy5fY2FjaGUpfV9wYWdlU2l6ZUNoYW5nZWQodCxlKXt2b2lkIDAhPT1lJiZ0IT09ZSYmdGhpcy5jbGVhckNhY2hlKCl9X2NoZWNrU2l6ZSgpe3ZvaWQgMD09PXRoaXMuc2l6ZSYmMD09PXRoaXMuX2VmZmVjdGl2ZVNpemUmJmNvbnNvbGUud2FybigiVGhlIDx2YWFkaW4tZ3JpZD4gbmVlZHMgdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBpbiBvcmRlciB0byBkaXNwbGF5IHJvd3MuIFNldCB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIHRvIHRoZSBgc2l6ZWAgcHJvcGVydHksIG9yIHByb3ZpZGUgdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIHRoZSBgZGF0YVByb3ZpZGVyYOKAmXMgYGNhbGxiYWNrYCBjYWxsLiIpfV9kYXRhUHJvdmlkZXJDaGFuZ2VkKHQsZSl7dm9pZCAwIT09ZSYmdGhpcy5jbGVhckNhY2hlKCksdCYmdGhpcy5pdGVtcyYmdGhpcy5pdGVtcy5sZW5ndGgmJnRoaXMuX3Njcm9sbFRvSW5kZXgodGhpcy5fZmlyc3RWaXNpYmxlSW5kZXgpLHRoaXMuX2Vuc3VyZUZpcnN0UGFnZUxvYWRlZCgpLHRoaXMuX2RlYm91bmNlckNoZWNrU2l6ZT1Ubi5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZXJDaGVja1NpemUsZ3QuYWZ0ZXIoMmUzKSx0aGlzLl9jaGVja1NpemUuYmluZCh0aGlzKSksdGhpcy5fc2Nyb2xsSGFuZGxlcigpfV9lbnN1cmVGaXJzdFBhZ2VMb2FkZWQoKXt0aGlzLl9oYXNEYXRhfHx0aGlzLl9sb2FkUGFnZSgwLHRoaXMuX2NhY2hlKX1faXRlbXNFcXVhbCh0LGUpe3JldHVybiB0aGlzLmdldEl0ZW1JZCh0KT09PXRoaXMuZ2V0SXRlbUlkKGUpfV9nZXRJdGVtSW5kZXhJbkFycmF5KHQsZSl7bGV0IG49LTE7cmV0dXJuIGUuZm9yRWFjaCgoKGUsaSk9Pnt0aGlzLl9pdGVtc0VxdWFsKGUsdCkmJihuPWkpfSkpLG59c2Nyb2xsVG9JbmRleCh0KXtzdXBlci5zY3JvbGxUb0luZGV4KHQpLGlzTmFOKHQpfHwhdGhpcy5fY2FjaGUuaXNMb2FkaW5nKCkmJnRoaXMuY2xpZW50SGVpZ2h0fHwodGhpcy5fX3BlbmRpbmdTY3JvbGxUb0luZGV4PXQpfV9fc2Nyb2xsVG9QZW5kaW5nSW5kZXgoKXtpZih0aGlzLl9fcGVuZGluZ1Njcm9sbFRvSW5kZXgmJnRoaXMuJC5pdGVtcy5jaGlsZHJlbi5sZW5ndGgpe2NvbnN0IHQ9dGhpcy5fX3BlbmRpbmdTY3JvbGxUb0luZGV4O2RlbGV0ZSB0aGlzLl9fcGVuZGluZ1Njcm9sbFRvSW5kZXgsdGhpcy5fZGVib3VuY2VJbmNyZWFzZVBvb2wmJnRoaXMuX2RlYm91bmNlSW5jcmVhc2VQb29sLmZsdXNoKCksdGhpcy5zY3JvbGxUb0luZGV4KHQpfX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovLEIkdD10PT5jbGFzcyBleHRlbmRzIHR7cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMuX2FkZE5vZGVPYnNlcnZlcigpfV9oYXNDb2x1bW5Hcm91cHModCl7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspaWYoInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCI9PT10W2VdLmxvY2FsTmFtZSlyZXR1cm4hMDtyZXR1cm4hMX1fZ2V0Q2hpbGRDb2x1bW5zKHQpe3JldHVybiB6aS5nZXRGbGF0dGVuZWROb2Rlcyh0KS5maWx0ZXIodGhpcy5faXNDb2x1bW5FbGVtZW50KX1fZmxhdHRlbkNvbHVtbkdyb3Vwcyh0KXtyZXR1cm4gdC5tYXAoKHQ9PiJ2YWFkaW4tZ3JpZC1jb2x1bW4tZ3JvdXAiPT09dC5sb2NhbE5hbWU/dGhpcy5fZ2V0Q2hpbGRDb2x1bW5zKHQpOlt0XSkpLnJlZHVjZSgoKHQsZSk9PnQuY29uY2F0KGUpKSxbXSl9X2dldENvbHVtblRyZWUoKXtjb25zdCB0PVtdO2ZvcihsZXQgZT16aS5nZXRGbGF0dGVuZWROb2Rlcyh0aGlzKS5maWx0ZXIodGhpcy5faXNDb2x1bW5FbGVtZW50KTt0LnB1c2goZSksdGhpcy5faGFzQ29sdW1uR3JvdXBzKGUpOyllPXRoaXMuX2ZsYXR0ZW5Db2x1bW5Hcm91cHMoZSk7cmV0dXJuIHR9X3VwZGF0ZUNvbHVtblRyZWUoKXtjb25zdCB0PXRoaXMuX2dldENvbHVtblRyZWUoKTt0aGlzLl9hcnJheUVxdWFscyh0LHRoaXMuX2NvbHVtblRyZWUpfHwodGhpcy5fY29sdW1uVHJlZT10KX1fYWRkTm9kZU9ic2VydmVyKCl7dGhpcy5fb2JzZXJ2ZXI9bmV3IHppKHRoaXMsKHQ9Pntjb25zdCBlPXQuYWRkZWROb2Rlcy5maWx0ZXIoKHQ9PiJ0ZW1wbGF0ZSI9PT10LmxvY2FsTmFtZSYmdC5jbGFzc0xpc3QuY29udGFpbnMoInJvdy1kZXRhaWxzIikpKVswXTtlJiZ0aGlzLl9yb3dEZXRhaWxzVGVtcGxhdGUhPT1lJiYodGhpcy5fcm93RGV0YWlsc1RlbXBsYXRlPWUpO2NvbnN0IG49dD0+dC5maWx0ZXIodGhpcy5faXNDb2x1bW5FbGVtZW50KS5sZW5ndGg+MDtpZihuKHQuYWRkZWROb2Rlcyl8fG4odC5yZW1vdmVkTm9kZXMpKXtjb25zdCBlPXQucmVtb3ZlZE5vZGVzLmZsYXRNYXAoKHQ9PnQuX2FsbENlbGxzKSksbj10PT5lLmZpbHRlcigoZT0+ZS5fY29udGVudC5jb250YWlucyh0KSkpLmxlbmd0aDt0aGlzLl9fcmVtb3ZlU29ydGVycyh0aGlzLl9zb3J0ZXJzLmZpbHRlcihuKSksdGhpcy5fX3JlbW92ZUZpbHRlcnModGhpcy5fZmlsdGVycy5maWx0ZXIobikpLHRoaXMuX3VwZGF0ZUNvbHVtblRyZWUoKX10aGlzLl9kZWJvdW5jZXJDaGVja0ltcG9ydHM9VG4uZGVib3VuY2UodGhpcy5fZGVib3VuY2VyQ2hlY2tJbXBvcnRzLGd0LmFmdGVyKDJlMyksdGhpcy5fY2hlY2tJbXBvcnRzLmJpbmQodGhpcykpLHRoaXMuX2Vuc3VyZUZpcnN0UGFnZUxvYWRlZCgpfSkpfV9hcnJheUVxdWFscyh0LGUpe2lmKCF0fHwhZXx8dC5sZW5ndGghPWUubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgbj0wLGk9dC5sZW5ndGg7bjxpO24rKylpZih0W25daW5zdGFuY2VvZiBBcnJheSYmZVtuXWluc3RhbmNlb2YgQXJyYXkpe2lmKCF0aGlzLl9hcnJheUVxdWFscyh0W25dLGVbbl0pKXJldHVybiExfWVsc2UgaWYodFtuXSE9ZVtuXSlyZXR1cm4hMTtyZXR1cm4hMH1fY2hlY2tJbXBvcnRzKCl7WyJ2YWFkaW4tZ3JpZC1jb2x1bW4tZ3JvdXAiLCJ2YWFkaW4tZ3JpZC1maWx0ZXIiLCJ2YWFkaW4tZ3JpZC1maWx0ZXItY29sdW1uIiwidmFhZGluLWdyaWQtdHJlZS10b2dnbGUiLCJ2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tY29sdW1uIiwidmFhZGluLWdyaWQtc29ydC1jb2x1bW4iLCJ2YWFkaW4tZ3JpZC1zb3J0ZXIiXS5mb3JFYWNoKCh0PT57Y29uc3QgZT10aGlzLnF1ZXJ5U2VsZWN0b3IodCk7IWV8fGUgaW5zdGFuY2VvZiB5ZXx8Y29uc29sZS53YXJuKGBNYWtlIHN1cmUgeW91IGhhdmUgaW1wb3J0ZWQgdGhlIHJlcXVpcmVkIG1vZHVsZSBmb3IgPCR7dH0+IGVsZW1lbnQuYCl9KSl9X3VwZGF0ZUZpcnN0QW5kTGFzdENvbHVtbigpe0FycmF5LmZyb20odGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRyIikpLmZvckVhY2goKHQ9PnRoaXMuX3VwZGF0ZUZpcnN0QW5kTGFzdENvbHVtbkZvclJvdyh0KSkpfV91cGRhdGVGaXJzdEFuZExhc3RDb2x1bW5Gb3JSb3codCl7QXJyYXkuZnJvbSh0LnF1ZXJ5U2VsZWN0b3JBbGwoJ1twYXJ0fj0iY2VsbCJdOm5vdChbcGFydH49ImRldGFpbHMtY2VsbCJdKScpKS5zb3J0KCgodCxlKT0+dC5fY29sdW1uLl9vcmRlci1lLl9jb2x1bW4uX29yZGVyKSkuZm9yRWFjaCgoKHQsZSxuKT0+e3RoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgiZmlyc3QtY29sdW1uIiwwPT09ZSx0KSx0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImxhc3QtY29sdW1uIixlPT09bi5sZW5ndGgtMSx0KX0pKX1faXNDb2x1bW5FbGVtZW50KHQpe3JldHVybiB0Lm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJi9cYmNvbHVtblxiLy50ZXN0KHQubG9jYWxOYW1lKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovLEgkdD10PT5jbGFzcyBleHRlbmRzIHR7Z2V0RXZlbnRDb250ZXh0KHQpe2NvbnN0IGU9e30sbj10LmNvbXBvc2VkUGF0aCgpLGk9bltuLmluZGV4T2YodGhpcy4kLnRhYmxlKS0zXTtyZXR1cm4gaT8oZS5zZWN0aW9uPVsiYm9keSIsImhlYWRlciIsImZvb3RlciIsImRldGFpbHMiXS5maWx0ZXIoKHQ9PmkuZ2V0QXR0cmlidXRlKCJwYXJ0IikuaW5kZXhPZih0KT4tMSkpWzBdLGkuX2NvbHVtbiYmKGUuY29sdW1uPWkuX2NvbHVtbiksImJvZHkiIT09ZS5zZWN0aW9uJiYiZGV0YWlscyIhPT1lLnNlY3Rpb258fE9iamVjdC5hc3NpZ24oZSx0aGlzLl9fZ2V0Um93TW9kZWwoaS5wYXJlbnRFbGVtZW50KSksZSk6ZX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovLEYkdD10PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue19maWx0ZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX19cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZmlsdGVyLWNoYW5nZWQiLHRoaXMuX2ZpbHRlckNoYW5nZWQuYmluZCh0aGlzKSl9X2ZpbHRlckNoYW5nZWQodCl7dC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLl9fYWRkRmlsdGVyKHQudGFyZ2V0KSx0aGlzLl9fYXBwbHlGaWx0ZXJzKCl9X19yZW1vdmVGaWx0ZXJzKHQpezAhPXQubGVuZ3RoJiYodGhpcy5fZmlsdGVycz10aGlzLl9maWx0ZXJzLmZpbHRlcigoZT0+dC5pbmRleE9mKGUpPDApKSx0aGlzLl9fYXBwbHlGaWx0ZXJzKCkpfV9fYWRkRmlsdGVyKHQpey0xPT09dGhpcy5fZmlsdGVycy5pbmRleE9mKHQpJiZ0aGlzLl9maWx0ZXJzLnB1c2godCl9X19hcHBseUZpbHRlcnMoKXt0aGlzLmRhdGFQcm92aWRlciYmdGhpcy5pc0F0dGFjaGVkJiZ0aGlzLmNsZWFyQ2FjaGUoKX1fbWFwRmlsdGVycygpe3JldHVybiB0aGlzLl9maWx0ZXJzLm1hcCgodD0+KHtwYXRoOnQucGF0aCx2YWx1ZTp0LnZhbHVlfSkpKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovO2NsYXNzIFYkdCBleHRlbmRzIHlle3N0YXRpYyBnZXQgaXMoKXtyZXR1cm4idmFhZGluLWdyaWQtdGVtcGxhdGl6ZXIifXN0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntkYXRhSG9zdDpPYmplY3QsdGVtcGxhdGU6T2JqZWN0LF90ZW1wbGF0ZUluc3RhbmNlczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX3BhcmVudFBhdGhWYWx1ZXM6e3ZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fSxfZ3JpZDpPYmplY3R9fXN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCl7cmV0dXJuWyJfdGVtcGxhdGVJbnN0YW5jZXNDaGFuZ2VkKF90ZW1wbGF0ZUluc3RhbmNlcy4qLCBfcGFyZW50UGF0aFZhbHVlcy4qKSJdfWNvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9pbnN0YW5jZVByb3BzPXtkZXRhaWxzT3BlbmVkOiEwLGluZGV4OiEwLGl0ZW06ITAsc2VsZWN0ZWQ6ITAsZXhwYW5kZWQ6ITAsbGV2ZWw6ITB9fWNyZWF0ZUluc3RhbmNlKCl7dGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKTtjb25zdCB0PW5ldyB0aGlzLl9UZW1wbGF0ZUNsYXNzKHt9KTtyZXR1cm4gdGhpcy5hZGRJbnN0YW5jZSh0KSx0fWFkZEluc3RhbmNlKHQpey0xPT09dGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMuaW5kZXhPZih0KSYmKHRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLnB1c2godCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+dGhpcy5ub3RpZnlQYXRoKCJfdGVtcGxhdGVJbnN0YW5jZXMuKiIsdGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMpKSkpfXJlbW92ZUluc3RhbmNlKHQpe2NvbnN0IGU9dGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMuaW5kZXhPZih0KTt0aGlzLnNwbGljZSgiX3RlbXBsYXRlSW5zdGFuY2VzIixlLDEpfV9lbnN1cmVUZW1wbGF0aXplZCgpe3RoaXMuX1RlbXBsYXRlQ2xhc3N8fCh0aGlzLl9UZW1wbGF0ZUNsYXNzPSRyKHRoaXMudGVtcGxhdGUsdGhpcyx7aW5zdGFuY2VQcm9wczp0aGlzLl9pbnN0YW5jZVByb3BzLHBhcmVudE1vZGVsOiEwLGZvcndhcmRIb3N0UHJvcDpmdW5jdGlvbih0LGUpe3RoaXMuX2ZvcndhcmRQYXJlbnRQcm9wKHQsZSksdGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMmJnRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmZvckVhY2goKG49Pm4ubm90aWZ5UGF0aCh0LGUpKSl9LG5vdGlmeUluc3RhbmNlUHJvcDpmdW5jdGlvbih0LGUsbil7aWYoImluZGV4Ij09PWV8fCJpdGVtIj09PWUpcmV0dXJuO2NvbnN0IGk9YF9fJHtlfV9fYDtpZih0W2ldPT09bilyZXR1cm47dFtpXT1uO2NvbnN0IHI9QXJyYXkuZnJvbSh0aGlzLl9ncmlkLiQuaXRlbXMuY2hpbGRyZW4pLmZpbHRlcigoZT0+dGhpcy5fZ3JpZC5faXRlbXNFcXVhbChlLl9pdGVtLHQuaXRlbSkpKVswXTtyJiZBcnJheS5mcm9tKHIuY2hpbGRyZW4pLmZvckVhY2goKHQ9Pnt0Ll9pbnN0YW5jZSYmKHQuX2luc3RhbmNlW2ldPW4sdC5faW5zdGFuY2Uubm90aWZ5UGF0aChlLG4pKX0pKTtjb25zdCBvPSJpdGVtLiI7aWYoQXJyYXkuaXNBcnJheSh0aGlzLl9ncmlkLml0ZW1zKSYmMD09PWUuaW5kZXhPZihvKSl7Y29uc3QgaT10aGlzLl9ncmlkLml0ZW1zLmluZGV4T2YodC5pdGVtKSxyPWUuc2xpY2Uoby5sZW5ndGgpO3RoaXMuX2dyaWQubm90aWZ5UGF0aChgaXRlbXMuJHtpfS4ke3J9YCxuKX1jb25zdCBhPWBfJHtlfUluc3RhbmNlQ2hhbmdlZENhbGxiYWNrYDt0aGlzLl9ncmlkJiZ0aGlzLl9ncmlkW2FdJiZ0aGlzLl9ncmlkW2FdKHQsbil9fSkpfV9mb3J3YXJkUGFyZW50UHJvcCh0LGUpe3RoaXMuX3BhcmVudFBhdGhWYWx1ZXNbdF09ZSx0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5mb3JFYWNoKChuPT5uLm5vdGlmeVBhdGgodCxlKSkpfV90ZW1wbGF0ZUluc3RhbmNlc0NoYW5nZWQodCl7bGV0IGUsbjtpZigiX3RlbXBsYXRlSW5zdGFuY2VzIj09PXQucGF0aCllPTAsbj10aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5sZW5ndGg7ZWxzZXtpZigiX3RlbXBsYXRlSW5zdGFuY2VzLnNwbGljZXMiIT09dC5wYXRoKXJldHVybjtlPXQudmFsdWUuaW5kZXgsbj10LnZhbHVlLmFkZGVkQ291bnR9T2JqZWN0LmtleXModGhpcy5fcGFyZW50UGF0aFZhbHVlc3x8e30pLmZvckVhY2goKHQ9Pntmb3IobGV0IGk9ZTtpPGUrbjtpKyspdGhpcy5fdGVtcGxhdGVJbnN0YW5jZXNbaV0uc2V0KHQsdGhpcy5fcGFyZW50UGF0aFZhbHVlc1t0XSl9KSl9fWN1c3RvbUVsZW1lbnRzLmRlZmluZShWJHQuaXMsViR0KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi8KY29uc3QgVSR0PXQ9PmNsYXNzIGV4dGVuZHMgdHtzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKXtyZXR1cm57ZGV0YWlsc09wZW5lZEl0ZW1zOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxfcm93RGV0YWlsc1RlbXBsYXRlOk9iamVjdCxyb3dEZXRhaWxzUmVuZGVyZXI6RnVuY3Rpb24sX2RldGFpbHNDZWxsczp7dHlwZTpBcnJheX19fXN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCl7cmV0dXJuWyJfZGV0YWlsc09wZW5lZEl0ZW1zQ2hhbmdlZChkZXRhaWxzT3BlbmVkSXRlbXMuKiwgX3Jvd0RldGFpbHNUZW1wbGF0ZSwgcm93RGV0YWlsc1JlbmRlcmVyKSIsIl9yb3dEZXRhaWxzVGVtcGxhdGVPclJlbmRlcmVyQ2hhbmdlZChfcm93RGV0YWlsc1RlbXBsYXRlLCByb3dEZXRhaWxzUmVuZGVyZXIpIl19X3Jvd0RldGFpbHNUZW1wbGF0ZU9yUmVuZGVyZXJDaGFuZ2VkKHQsZSl7aWYodCYmZSl0aHJvdyBuZXcgRXJyb3IoIllvdSBzaG91bGQgb25seSB1c2UgZWl0aGVyIGEgcmVuZGVyZXIgb3IgYSB0ZW1wbGF0ZSBmb3Igcm93IGRldGFpbHMiKTtpZih0fHxlKXtpZih0JiYhdC50ZW1wbGF0aXplcil7Y29uc3QgZT1uZXcgViR0O2UuX2dyaWQ9dGhpcyxlLmRhdGFIb3N0PXRoaXMuZGF0YUhvc3QsZS50ZW1wbGF0ZT10LHQudGVtcGxhdGl6ZXI9ZX10aGlzLl9jb2x1bW5UcmVlJiZBcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZm9yRWFjaCgodD0+e3QucXVlcnlTZWxlY3RvcigiW3BhcnR+PWRldGFpbHMtY2VsbF0iKXx8KHRoaXMuX3VwZGF0ZVJvdyh0LHRoaXMuX2NvbHVtblRyZWVbdGhpcy5fY29sdW1uVHJlZS5sZW5ndGgtMV0pLHRoaXMuX2ExMXlVcGRhdGVSb3dEZXRhaWxzT3BlbmVkKHQsITEpKSxkZWxldGUgdC5xdWVyeVNlbGVjdG9yKCJbcGFydH49ZGV0YWlscy1jZWxsXSIpLl9pbnN0YW5jZX0pKSx0aGlzLmRldGFpbHNPcGVuZWRJdGVtcy5sZW5ndGgmJihBcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZm9yRWFjaCh0aGlzLl90b2dnbGVEZXRhaWxzQ2VsbCx0aGlzKSx0aGlzLl91cGRhdGUoKSl9fV9kZXRhaWxzT3BlbmVkSXRlbXNDaGFuZ2VkKHQpeyJkZXRhaWxzT3BlbmVkSXRlbXMubGVuZ3RoIiE9PXQucGF0aCYmdC52YWx1ZSYmQXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pLmZvckVhY2goKHQ9Pnt0aGlzLl90b2dnbGVEZXRhaWxzQ2VsbCh0LHQuX2l0ZW0pLHRoaXMuX2ExMXlVcGRhdGVSb3dEZXRhaWxzT3BlbmVkKHQsdGhpcy5faXNEZXRhaWxzT3BlbmVkKHQuX2l0ZW0pKSx0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImRldGFpbHMtb3BlbmVkIix0aGlzLl9pc0RldGFpbHNPcGVuZWQodC5faXRlbSksdCl9KSl9X2NvbmZpZ3VyZURldGFpbHNDZWxsKHQpe3Quc2V0QXR0cmlidXRlKCJwYXJ0IiwiY2VsbCBkZXRhaWxzLWNlbGwiKSx0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImZyb3plbiIsITAsdCl9X3RvZ2dsZURldGFpbHNDZWxsKHQsZSl7Y29uc3Qgbj10LnF1ZXJ5U2VsZWN0b3IoJ1twYXJ0fj0iZGV0YWlscy1jZWxsIl0nKTtpZighbilyZXR1cm47Y29uc3QgaT0hdGhpcy5faXNEZXRhaWxzT3BlbmVkKGUpLHI9ISFuLmhpZGRlbiE9PWk7KG4uX2luc3RhbmNlfHxuLl9yZW5kZXJlcikmJm4uaGlkZGVuPT09aXx8KG4uaGlkZGVuPWksaT90LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJwYWRkaW5nLWJvdHRvbSIpOih0aGlzLnJvd0RldGFpbHNSZW5kZXJlcj8obi5fcmVuZGVyZXI9dGhpcy5yb3dEZXRhaWxzUmVuZGVyZXIsbi5fcmVuZGVyZXIuY2FsbCh0aGlzLG4uX2NvbnRlbnQsdGhpcyx7aW5kZXg6dC5pbmRleCxpdGVtOmV9KSk6dGhpcy5fcm93RGV0YWlsc1RlbXBsYXRlJiYhbi5faW5zdGFuY2UmJihuLl9pbnN0YW5jZT10aGlzLl9yb3dEZXRhaWxzVGVtcGxhdGUudGVtcGxhdGl6ZXIuY3JlYXRlSW5zdGFuY2UoKSxuLl9jb250ZW50LmlubmVySFRNTD0iIixuLl9jb250ZW50LmFwcGVuZENoaWxkKG4uX2luc3RhbmNlLnJvb3QpLHRoaXMuX3VwZGF0ZUl0ZW0odCxlKSksRGkoKSx0LnN0eWxlLnNldFByb3BlcnR5KCJwYWRkaW5nLWJvdHRvbSIsYCR7bi5vZmZzZXRIZWlnaHR9cHhgKSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT50aGlzLm5vdGlmeVJlc2l6ZSgpKSkpKSxyJiYodGhpcy5fdXBkYXRlTWV0cmljcygpLHRoaXMuX3Bvc2l0aW9uSXRlbXMoKSl9X3VwZGF0ZURldGFpbHNDZWxsSGVpZ2h0cygpe0FycmF5LmZyb20odGhpcy4kLml0ZW1zLnF1ZXJ5U2VsZWN0b3JBbGwoJ1twYXJ0fj0iZGV0YWlscy1jZWxsIl06bm90KFtoaWRkZW5dKScpKS5mb3JFYWNoKCh0PT57dC5wYXJlbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCJwYWRkaW5nLWJvdHRvbSIsYCR7dC5vZmZzZXRIZWlnaHR9cHhgKX0pKX1faXNEZXRhaWxzT3BlbmVkKHQpe3JldHVybiB0aGlzLmRldGFpbHNPcGVuZWRJdGVtcyYmLTEhPT10aGlzLl9nZXRJdGVtSW5kZXhJbkFycmF5KHQsdGhpcy5kZXRhaWxzT3BlbmVkSXRlbXMpfW9wZW5JdGVtRGV0YWlscyh0KXt0aGlzLl9pc0RldGFpbHNPcGVuZWQodCl8fCh0aGlzLmRldGFpbHNPcGVuZWRJdGVtcz1bLi4udGhpcy5kZXRhaWxzT3BlbmVkSXRlbXMsdF0pfWNsb3NlSXRlbURldGFpbHModCl7dGhpcy5faXNEZXRhaWxzT3BlbmVkKHQpJiYodGhpcy5kZXRhaWxzT3BlbmVkSXRlbXM9dGhpcy5kZXRhaWxzT3BlbmVkSXRlbXMuZmlsdGVyKChlPT4hdGhpcy5faXRlbXNFcXVhbChlLHQpKSkpfV9kZXRhaWxzT3BlbmVkSW5zdGFuY2VDaGFuZ2VkQ2FsbGJhY2sodCxlKXtlP3RoaXMub3Blbkl0ZW1EZXRhaWxzKHQuaXRlbSk6dGhpcy5jbG9zZUl0ZW1EZXRhaWxzKHQuaXRlbSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLyxqJHQ9dD0+Y2xhc3MgZXh0ZW5kcyB0e3N0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntfZnJvemVuQ2VsbHM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxfcm93V2l0aEZvY3VzZWRFbGVtZW50OkVsZW1lbnQsX2RlbHRhWUFjYzp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3VzZVN0aWNreTp7dHlwZTpCb29sZWFuLHZhbHVlOndpbmRvdy5DU1MmJndpbmRvdy5DU1Muc3VwcG9ydHMmJih3aW5kb3cuQ1NTLnN1cHBvcnRzKCJwb3NpdGlvbiIsInN0aWNreSIpfHx3aW5kb3cuQ1NTLnN1cHBvcnRzKCJwb3NpdGlvbiIsIi13ZWJraXQtc3RpY2t5IikpfX19c3RhdGljIGdldCBvYnNlcnZlcnMoKXtyZXR1cm5bIl9zY3JvbGxWaWV3cG9ydEhlaWdodFVwZGF0ZWQoX3ZpZXdwb3J0SGVpZ2h0KSJdfXNldCBfc2Nyb2xsVG9wKHQpe3RoaXMuJC50YWJsZS5zY3JvbGxUb3A9dH1nZXQgX3Njcm9sbFRvcCgpe3JldHVybiB0aGlzLiQudGFibGUuc2Nyb2xsVG9wfWNvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9zY3JvbGxMaW5lSGVpZ2h0PXRoaXMuX2dldFNjcm9sbExpbmVIZWlnaHQoKX1fZ2V0U2Nyb2xsTGluZUhlaWdodCgpe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5zdHlsZS5mb250U2l6ZT0iaW5pdGlhbCIsdC5zdHlsZS5kaXNwbGF5PSJub25lIixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHQpO2NvbnN0IGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUodCkuZm9udFNpemU7cmV0dXJuIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodCksZT93aW5kb3cucGFyc2VJbnQoZSk6dm9pZCAwfV9zY3JvbGxWaWV3cG9ydEhlaWdodFVwZGF0ZWQodCl7dGhpcy5fc2Nyb2xsUGFnZUhlaWdodD10LXRoaXMuJC5oZWFkZXIuY2xpZW50SGVpZ2h0LXRoaXMuJC5mb290ZXIuY2xpZW50SGVpZ2h0LXRoaXMuX3Njcm9sbExpbmVIZWlnaHR9cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMuJC5vdXRlcnNjcm9sbGVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuc2Nyb2xsVGFyZ2V0PXRoaXMuJC50YWJsZSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoIndoZWVsIix0aGlzLl9vbldoZWVsKSx0aGlzLiQuaXRlbXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXNpbiIsKHQ9Pntjb25zdCBlPXQuY29tcG9zZWRQYXRoKCkuaW5kZXhPZih0aGlzLiQuaXRlbXMpO3RoaXMuX3Jvd1dpdGhGb2N1c2VkRWxlbWVudD10LmNvbXBvc2VkUGF0aCgpW2UtMV19KSksdGhpcy4kLml0ZW1zLmFkZEV2ZW50TGlzdGVuZXIoImZvY3Vzb3V0IiwoKCk9PnRoaXMuX3Jvd1dpdGhGb2N1c2VkRWxlbWVudD12b2lkIDApKSx0aGlzLnNjcm9sbFRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLCgoKT0+dGhpcy5fX21vdXNlRG93bj0hMCkpLHRoaXMuc2Nyb2xsVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCgoKT0+e3RoaXMuX19tb3VzZURvd249ITEsdGhpcy5fX3BlbmRpbmdSZW9yZGVyJiYodGhpcy5fX3BlbmRpbmdSZW9yZGVyPSExLHNldFRpbWVvdXQoKCgpPT50aGlzLl9yZW9yZGVyUm93cygpKSw1MDApKX0pKX1zY3JvbGxUb0luZGV4KHQpe3RoaXMuX2FjY2Vzc0lyb25MaXN0QVBJKCgoKT0+c3VwZXIuc2Nyb2xsVG9JbmRleCh0KSkpfV9vbldoZWVsKHQpe2lmKHQuY3RybEtleXx8dGhpcy5faGFzU2Nyb2xsZWRBbmNlc3Rvcih0LnRhcmdldCx0LmRlbHRhWCx0LmRlbHRhWSkpcmV0dXJuO2NvbnN0IGU9dGhpcy4kLnRhYmxlO2xldCBuPXQuZGVsdGFZO2lmKHQuZGVsdGFNb2RlPT09V2hlZWxFdmVudC5ET01fREVMVEFfTElORT9uKj10aGlzLl9zY3JvbGxMaW5lSGVpZ2h0OnQuZGVsdGFNb2RlPT09V2hlZWxFdmVudC5ET01fREVMVEFfUEFHRSYmKG4qPXRoaXMuX3Njcm9sbFBhZ2VIZWlnaHQpLHRoaXMuX3doZWVsQW5pbWF0aW9uRnJhbWUpcmV0dXJuIHRoaXMuX2RlbHRhWUFjYys9bix2b2lkIHQucHJldmVudERlZmF1bHQoKTtuKz10aGlzLl9kZWx0YVlBY2MsdGhpcy5fZGVsdGFZQWNjPTAsdGhpcy5fd2hlZWxBbmltYXRpb25GcmFtZT0hMCx0aGlzLl9kZWJvdW5jZXJXaGVlbEFuaW1hdGlvbkZyYW1lPVRuLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlcldoZWVsQW5pbWF0aW9uRnJhbWUsX3QsKCgpPT50aGlzLl93aGVlbEFuaW1hdGlvbkZyYW1lPSExKSk7Y29uc3QgaT1NYXRoLmFicyh0LmRlbHRhWCkrTWF0aC5hYnMobik7dGhpcy5fY2FuU2Nyb2xsKGUsdC5kZWx0YVgsbik/KHQucHJldmVudERlZmF1bHQoKSxlLnNjcm9sbFRvcCs9bixlLnNjcm9sbExlZnQrPXQuZGVsdGFYLHRoaXMuX3Njcm9sbEhhbmRsZXIoKSx0aGlzLl9oYXNSZXNpZHVhbE1vbWVudHVtPSEwLHRoaXMuX2lnbm9yZU5ld1doZWVsPSEwLHRoaXMuX2RlYm91bmNlcklnbm9yZU5ld1doZWVsPVRuLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlcklnbm9yZU5ld1doZWVsLGd0LmFmdGVyKDUwMCksKCgpPT50aGlzLl9pZ25vcmVOZXdXaGVlbD0hMSkpKTp0aGlzLl9oYXNSZXNpZHVhbE1vbWVudHVtJiZpPD10aGlzLl9wcmV2aW91c01vbWVudHVtfHx0aGlzLl9pZ25vcmVOZXdXaGVlbD90LnByZXZlbnREZWZhdWx0KCk6aT50aGlzLl9wcmV2aW91c01vbWVudHVtJiYodGhpcy5faGFzUmVzaWR1YWxNb21lbnR1bT0hMSksdGhpcy5fcHJldmlvdXNNb21lbnR1bT1pfV9oYXNTY3JvbGxlZEFuY2VzdG9yKHQsZSxuKXtyZXR1cm4idmFhZGluLWdyaWQtY2VsbC1jb250ZW50IiE9PXQubG9jYWxOYW1lJiYoISghdGhpcy5fY2FuU2Nyb2xsKHQsZSxuKXx8LTE9PT1bImF1dG8iLCJzY3JvbGwiXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUodCkub3ZlcmZsb3cpKXx8KHQhPT10aGlzJiZ0LnBhcmVudEVsZW1lbnQ/dGhpcy5faGFzU2Nyb2xsZWRBbmNlc3Rvcih0LnBhcmVudEVsZW1lbnQsZSxuKTp2b2lkIDApKX1fY2FuU2Nyb2xsKHQsZSxuKXtyZXR1cm4gbj4wJiZ0LnNjcm9sbFRvcDx0LnNjcm9sbEhlaWdodC10Lm9mZnNldEhlaWdodHx8bjwwJiZ0LnNjcm9sbFRvcD4wfHxlPjAmJnQuc2Nyb2xsTGVmdDx0LnNjcm9sbFdpZHRoLXQub2Zmc2V0V2lkdGh8fGU8MCYmdC5zY3JvbGxMZWZ0PjB9X3NjaGVkdWxlU2Nyb2xsaW5nKCl7dGhpcy5fc2Nyb2xsaW5nRnJhbWV8fCh0aGlzLl9zY3JvbGxpbmdGcmFtZT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT50aGlzLl90b2dnbGVBdHRyaWJ1dGUoInNjcm9sbGluZyIsITAsdGhpcy4kLnNjcm9sbGVyKSkpKSx0aGlzLl9kZWJvdW5jZVNjcm9sbGluZz1Ubi5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZVNjcm9sbGluZyxndC5hZnRlcig1MDApLCgoKT0+e2NhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3Njcm9sbGluZ0ZyYW1lKSxkZWxldGUgdGhpcy5fc2Nyb2xsaW5nRnJhbWUsdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJzY3JvbGxpbmciLCExLHRoaXMuJC5zY3JvbGxlciksdGhpcy5fcmVvcmRlclJvd3MoKX0pKX1fYWZ0ZXJTY3JvbGwoKXt0aGlzLl90cmFuc2xhdGVTdGF0aW9uYXJ5RWxlbWVudHMoKSx0aGlzLmhhc0F0dHJpYnV0ZSgicmVvcmRlcmluZyIpfHx0aGlzLl9zY2hlZHVsZVNjcm9sbGluZygpLHRoaXMuX3VwZGF0ZU92ZXJmbG93KCl9X3VwZGF0ZU92ZXJmbG93KCl7bGV0IHQ9IiI7Y29uc3QgZT10aGlzLiQudGFibGU7ZS5zY3JvbGxUb3A8ZS5zY3JvbGxIZWlnaHQtZS5jbGllbnRIZWlnaHQmJih0Kz0iIGJvdHRvbSIpLGUuc2Nyb2xsVG9wPjAmJih0Kz0iIHRvcCIpLGUuc2Nyb2xsTGVmdDxlLnNjcm9sbFdpZHRoLWUuY2xpZW50V2lkdGgmJih0Kz0iIHJpZ2h0IiksZS5zY3JvbGxMZWZ0PjAmJih0Kz0iIGxlZnQiKSx0aGlzLl9kZWJvdW5jZU92ZXJmbG93PVRuLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlT3ZlcmZsb3csX3QsKCgpPT57Y29uc3QgZT10LnRyaW0oKTtlLmxlbmd0aD4wJiZ0aGlzLmdldEF0dHJpYnV0ZSgib3ZlcmZsb3ciKSE9PWU/dGhpcy5zZXRBdHRyaWJ1dGUoIm92ZXJmbG93IixlKTowPT1lLmxlbmd0aCYmdGhpcy5oYXNBdHRyaWJ1dGUoIm92ZXJmbG93IikmJnRoaXMucmVtb3ZlQXR0cmlidXRlKCJvdmVyZmxvdyIpfSkpfV9yZW9yZGVyUm93cygpe2lmKHRoaXMuX19tb3VzZURvd24pcmV0dXJuIHZvaWQodGhpcy5fX3BlbmRpbmdSZW9yZGVyPSEwKTtjb25zdCB0PXRoaXMuJC5pdGVtcyxlPXQucXVlcnlTZWxlY3RvckFsbCgidHIiKTtpZighZS5sZW5ndGgpcmV0dXJuO2NvbnN0IG49dGhpcy5fdmlydHVhbFN0YXJ0K3RoaXMuX3ZpZHhPZmZzZXQsaT10aGlzLl9yb3dXaXRoRm9jdXNlZEVsZW1lbnR8fEFycmF5LmZyb20oZSkuZmlsdGVyKCh0PT4hdC5oaWRkZW4pKVswXTtpZighaSlyZXR1cm47Y29uc3Qgcj1pLmluZGV4LW4sbz1BcnJheS5mcm9tKGUpLmluZGV4T2YoaSktcjtpZihvPjApZm9yKGxldCBuPTA7bjxvO24rKyl0LmFwcGVuZENoaWxkKGVbbl0pO2Vsc2UgaWYobzwwKWZvcihsZXQgbj1lLmxlbmd0aCtvO248ZS5sZW5ndGg7bisrKXQuaW5zZXJ0QmVmb3JlKGVbbl0sZVswXSk7aWYodGhpcy5fc2FmYXJpKXtjb25zdHt0cmFuc2Zvcm06dH09dGhpcy4kLmhlYWRlci5zdHlsZTt0aGlzLiQuaGVhZGVyLnN0eWxlLnRyYW5zZm9ybT0iIixzZXRUaW1lb3V0KCgoKT0+dGhpcy4kLmhlYWRlci5zdHlsZS50cmFuc2Zvcm09dCkpfX1fZnJvemVuQ2VsbHNDaGFuZ2VkKCl7dGhpcy5fZGVib3VuY2VyQ2FjaGVFbGVtZW50cz1Ubi5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZXJDYWNoZUVsZW1lbnRzLHZ0LCgoKT0+e0FycmF5LmZyb20odGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ1twYXJ0fj0iY2VsbCJdJykpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3Quc3R5bGUudHJhbnNmb3JtPSIifSkpLHRoaXMuX2Zyb3plbkNlbGxzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuJC50YWJsZS5xdWVyeVNlbGVjdG9yQWxsKCJbZnJvemVuXSIpKSx0aGlzLl91cGRhdGVTY3JvbGxlck1lYXN1cmVtZW50cygpLHRoaXMuX3RyYW5zbGF0ZVN0YXRpb25hcnlFbGVtZW50cygpfSkpLHRoaXMuX3VwZGF0ZUxhc3RGcm96ZW4oKX1fdXBkYXRlU2Nyb2xsZXJNZWFzdXJlbWVudHMoKXt0aGlzLl9mcm96ZW5DZWxscy5sZW5ndGg+MCYmdGhpcy5fX2lzUlRMJiYodGhpcy5fX3Njcm9sbGVyTWV0cmljcz17c2Nyb2xsV2lkdGg6dGhpcy4kLnRhYmxlLnNjcm9sbFdpZHRoLGNsaWVudFdpZHRoOnRoaXMuJC50YWJsZS5jbGllbnRXaWR0aH0pfV91cGRhdGVMYXN0RnJvemVuKCl7aWYoIXRoaXMuX2NvbHVtblRyZWUpcmV0dXJuO2NvbnN0IHQ9dGhpcy5fY29sdW1uVHJlZVt0aGlzLl9jb2x1bW5UcmVlLmxlbmd0aC0xXS5zbGljZSgwKTt0LnNvcnQoKCh0LGUpPT50Ll9vcmRlci1lLl9vcmRlcikpO2NvbnN0IGU9dC5yZWR1Y2UoKCh0LGUsbik9PihlLl9sYXN0RnJvemVuPSExLGUuZnJvemVuJiYhZS5oaWRkZW4/bjp0KSksdm9pZCAwKTt2b2lkIDAhPT1lJiYodFtlXS5fbGFzdEZyb3plbj0hMCl9X3RyYW5zbGF0ZVN0YXRpb25hcnlFbGVtZW50cygpe2NvbnN0IHQ9TWF0aC5tYXgoMCx0aGlzLl9zY3JvbGxMZWZ0KSxlPU1hdGgubWF4KDAsdGhpcy5fc2Nyb2xsVG9wKTtsZXQgbj0wLGk9MCxyPTA7aWYodGhpcy5fdXNlU3RpY2t5fHwobj10LGk9ZSxyPXRoaXMuJC50YWJsZS5jbGllbnRIZWlnaHQtdGhpcy4kLmZvb3Rlci5vZmZzZXRIZWlnaHQtdGhpcy4kLmZvb3Rlci5vZmZzZXRUb3ApLHRoaXMuJC5oZWFkZXIuc3R5bGUudHJhbnNmb3JtPXRoaXMuX2dldFRyYW5zbGF0ZSgtdCtuLGkpLHRoaXMuJC5mb290ZXIuc3R5bGUudHJhbnNmb3JtPXRoaXMuX2dldFRyYW5zbGF0ZSgtdCtuLGkrciksdGhpcy4kLml0ZW1zLnN0eWxlLnRyYW5zZm9ybT10aGlzLl9nZXRUcmFuc2xhdGUoLXQrbiwwKSx0aGlzLl9mcm96ZW5DZWxscy5sZW5ndGg+MCl7Y29uc3QgdD10aGlzLl9faXNSVEw/dGhpcy5fX2dldE5vcm1hbGl6ZWRTY3JvbGxMZWZ0KHRoaXMuJC50YWJsZSkrdGhpcy5fX3Njcm9sbGVyTWV0cmljcy5jbGllbnRXaWR0aC10aGlzLl9fc2Nyb2xsZXJNZXRyaWNzLnNjcm9sbFdpZHRoOnRoaXMuX3Njcm9sbExlZnQsZT10aGlzLl9nZXRUcmFuc2xhdGUodCwwKTtmb3IobGV0IHQ9MDt0PHRoaXMuX2Zyb3plbkNlbGxzLmxlbmd0aDt0KyspdGhpcy5fZnJvemVuQ2VsbHNbdF0uc3R5bGUudHJhbnNmb3JtPWV9fV9nZXRUcmFuc2xhdGUodCxlKXtyZXR1cm5gdHJhbnNsYXRlKCR7dH1weCwgJHtlfXB4KWB9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLyxHJHQ9dD0+Y2xhc3MgZXh0ZW5kcyB0e3N0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntzZWxlY3RlZEl0ZW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsdmFsdWU6KCk9PltdfX19c3RhdGljIGdldCBvYnNlcnZlcnMoKXtyZXR1cm5bIl9zZWxlY3RlZEl0ZW1zQ2hhbmdlZChzZWxlY3RlZEl0ZW1zLiopIl19X2lzU2VsZWN0ZWQodCl7cmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtcyYmdGhpcy5fZ2V0SXRlbUluZGV4SW5BcnJheSh0LHRoaXMuc2VsZWN0ZWRJdGVtcyk+LTF9c2VsZWN0SXRlbSh0KXt0aGlzLl9pc1NlbGVjdGVkKHQpfHwodGhpcy5zZWxlY3RlZEl0ZW1zPVsuLi50aGlzLnNlbGVjdGVkSXRlbXMsdF0pfWRlc2VsZWN0SXRlbSh0KXt0aGlzLl9pc1NlbGVjdGVkKHQpJiYodGhpcy5zZWxlY3RlZEl0ZW1zPXRoaXMuc2VsZWN0ZWRJdGVtcy5maWx0ZXIoKGU9PiF0aGlzLl9pdGVtc0VxdWFsKGUsdCkpKSl9X3RvZ2dsZUl0ZW0odCl7LTE9PT10aGlzLl9nZXRJdGVtSW5kZXhJbkFycmF5KHQsdGhpcy5zZWxlY3RlZEl0ZW1zKT90aGlzLnNlbGVjdEl0ZW0odCk6dGhpcy5kZXNlbGVjdEl0ZW0odCl9X3NlbGVjdGVkSXRlbXNDaGFuZ2VkKHQpeyF0aGlzLiQuaXRlbXMuY2hpbGRyZW4ubGVuZ3RofHwic2VsZWN0ZWRJdGVtcyIhPT10LnBhdGgmJiJzZWxlY3RlZEl0ZW1zLnNwbGljZXMiIT09dC5wYXRofHxBcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZm9yRWFjaCgodD0+e3RoaXMuX3VwZGF0ZUl0ZW0odCx0Ll9pdGVtKX0pKX1fc2VsZWN0ZWRJbnN0YW5jZUNoYW5nZWRDYWxsYmFjayh0LGUpe2U/dGhpcy5zZWxlY3RJdGVtKHQuaXRlbSk6dGhpcy5kZXNlbGVjdEl0ZW0odC5pdGVtKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovLFckdD10PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue211bHRpU29ydDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfc29ydGVyczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX3ByZXZpb3VzU29ydGVyczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19fXJlYWR5KCl7c3VwZXIucmVhZHkoKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoInNvcnRlci1jaGFuZ2VkIix0aGlzLl9vblNvcnRlckNoYW5nZWQpfV9vblNvcnRlckNoYW5nZWQodCl7Y29uc3QgZT10LnRhcmdldDt0LnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuX191cGRhdGVTb3J0ZXIoZSksdGhpcy5fX2FwcGx5U29ydGVycygpfV9fcmVtb3ZlU29ydGVycyh0KXswIT10Lmxlbmd0aCYmKHRoaXMuX3NvcnRlcnM9dGhpcy5fc29ydGVycy5maWx0ZXIoKGU9PnQuaW5kZXhPZihlKTwwKSksdGhpcy5tdWx0aVNvcnQmJnRoaXMuX191cGRhdGVTb3J0T3JkZXJzKCksdGhpcy5fX2FwcGx5U29ydGVycygpKX1fX3VwZGF0ZVNvcnRPcmRlcnMoKXt0aGlzLl9zb3J0ZXJzLmZvckVhY2goKCh0LGUpPT50Ll9vcmRlcj10aGlzLl9zb3J0ZXJzLmxlbmd0aD4xP2U6bnVsbCksdGhpcyl9X191cGRhdGVTb3J0ZXIodCl7aWYodC5kaXJlY3Rpb258fC0xIT09dGhpcy5fc29ydGVycy5pbmRleE9mKHQpKWlmKHQuX29yZGVyPW51bGwsdGhpcy5tdWx0aVNvcnQpdGhpcy5fcmVtb3ZlQXJyYXlJdGVtKHRoaXMuX3NvcnRlcnMsdCksdC5kaXJlY3Rpb24mJnRoaXMuX3NvcnRlcnMudW5zaGlmdCh0KSx0aGlzLl9fdXBkYXRlU29ydE9yZGVycygpO2Vsc2UgaWYodC5kaXJlY3Rpb24pe2NvbnN0IGU9dGhpcy5fc29ydGVycy5maWx0ZXIoKGU9PmUhPXQpKTt0aGlzLl9zb3J0ZXJzPVt0XSxlLmZvckVhY2goKHQ9Pnt0Ll9vcmRlcj1udWxsLHQuZGlyZWN0aW9uPW51bGx9KSl9fV9fYXBwbHlTb3J0ZXJzKCl7dGhpcy5kYXRhUHJvdmlkZXImJnRoaXMuaXNBdHRhY2hlZCYmSlNPTi5zdHJpbmdpZnkodGhpcy5fcHJldmlvdXNTb3J0ZXJzKSE9PUpTT04uc3RyaW5naWZ5KHRoaXMuX21hcFNvcnRlcnMoKSkmJnRoaXMuY2xlYXJDYWNoZSgpLHRoaXMuX2ExMXlVcGRhdGVTb3J0ZXJzKCksdGhpcy5fcHJldmlvdXNTb3J0ZXJzPXRoaXMuX21hcFNvcnRlcnMoKX1fbWFwU29ydGVycygpe3JldHVybiB0aGlzLl9zb3J0ZXJzLm1hcCgodD0+KHtwYXRoOnQucGF0aCxkaXJlY3Rpb246dC5kaXJlY3Rpb259KSkpfV9yZW1vdmVBcnJheUl0ZW0odCxlKXtjb25zdCBuPXQuaW5kZXhPZihlKTtuPi0xJiZ0LnNwbGljZShuLDEpfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi8scSR0PXQ9PmNsYXNzIGV4dGVuZHMgdHtzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKXtyZXR1cm57Y2VsbENsYXNzTmFtZUdlbmVyYXRvcjpGdW5jdGlvbn19c3RhdGljIGdldCBvYnNlcnZlcnMoKXtyZXR1cm5bIl9fY2VsbENsYXNzTmFtZUdlbmVyYXRvckNoYW5nZWQoY2VsbENsYXNzTmFtZUdlbmVyYXRvcikiXX1fX2NlbGxDbGFzc05hbWVHZW5lcmF0b3JDaGFuZ2VkKCl7dGhpcy5nZW5lcmF0ZUNlbGxDbGFzc05hbWVzKCl9Z2VuZXJhdGVDZWxsQ2xhc3NOYW1lcygpe0FycmF5LmZyb20odGhpcy4kLml0ZW1zLmNoaWxkcmVuKS5maWx0ZXIoKHQ9PiF0LmhpZGRlbikpLmZvckVhY2goKHQ9PnRoaXMuX2dlbmVyYXRlQ2VsbENsYXNzTmFtZXModCx0aGlzLl9fZ2V0Um93TW9kZWwodCkpKSl9X2dlbmVyYXRlQ2VsbENsYXNzTmFtZXModCxlKXtBcnJheS5mcm9tKHQuY2hpbGRyZW4pLmZvckVhY2goKHQ9PntpZih0Ll9fZ2VuZXJhdGVkQ2xhc3NlcyYmdC5fX2dlbmVyYXRlZENsYXNzZXMuZm9yRWFjaCgoZT0+dC5jbGFzc0xpc3QucmVtb3ZlKGUpKSksdGhpcy5jZWxsQ2xhc3NOYW1lR2VuZXJhdG9yKXtjb25zdCBuPXRoaXMuY2VsbENsYXNzTmFtZUdlbmVyYXRvcih0Ll9jb2x1bW4sZSk7dC5fX2dlbmVyYXRlZENsYXNzZXM9biYmbi5zcGxpdCgiICIpLmZpbHRlcigodD0+dC5sZW5ndGg+MCkpLHQuX19nZW5lcmF0ZWRDbGFzc2VzJiZ0Ll9fZ2VuZXJhdGVkQ2xhc3Nlcy5mb3JFYWNoKChlPT50LmNsYXNzTGlzdC5hZGQoZSkpKX19KSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLyxZJHQ9ImJldHdlZW4iLFgkdD0ib24tdG9wLW9yLWJldHdlZW4iLCQkdD0iYWJvdmUiLEskdD0iYmVsb3ciLFokdD0iZW1wdHkiLEokdD10PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue2Ryb3BNb2RlOlN0cmluZyxyb3dzRHJhZ2dhYmxlOkJvb2xlYW4sZHJhZ0ZpbHRlcjpGdW5jdGlvbixkcm9wRmlsdGVyOkZ1bmN0aW9uLF9fZG5kQXV0b1Njcm9sbFRocmVzaG9sZDp7dmFsdWU6NTB9fX1zdGF0aWMgZ2V0IG9ic2VydmVycygpe3JldHVyblsiX2RyYWdEcm9wQWNjZXNzQ2hhbmdlZChyb3dzRHJhZ2dhYmxlLCBkcm9wTW9kZSwgZHJhZ0ZpbHRlciwgZHJvcEZpbHRlcikiXX1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy4kLnRhYmxlLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdzdGFydCIsdGhpcy5fb25EcmFnU3RhcnQuYmluZCh0aGlzKSksdGhpcy4kLnRhYmxlLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdlbmQiLHRoaXMuX29uRHJhZ0VuZC5iaW5kKHRoaXMpKSx0aGlzLiQudGFibGUuYWRkRXZlbnRMaXN0ZW5lcigiZHJhZ292ZXIiLHRoaXMuX29uRHJhZ092ZXIuYmluZCh0aGlzKSksdGhpcy4kLnRhYmxlLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdsZWF2ZSIsdGhpcy5fb25EcmFnTGVhdmUuYmluZCh0aGlzKSksdGhpcy4kLnRhYmxlLmFkZEV2ZW50TGlzdGVuZXIoImRyb3AiLHRoaXMuX29uRHJvcC5iaW5kKHRoaXMpKSx0aGlzLiQudGFibGUuYWRkRXZlbnRMaXN0ZW5lcigiZHJhZ2VudGVyIiwodD0+e3RoaXMuZHJvcE1vZGUmJih0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSl9KSl9X29uRHJhZ1N0YXJ0KHQpe2lmKHRoaXMucm93c0RyYWdnYWJsZSl7bGV0IGU9dC50YXJnZXQ7aWYoInZhYWRpbi1ncmlkLWNlbGwtY29udGVudCI9PT1lLmxvY2FsTmFtZSYmKGU9ZS5hc3NpZ25lZFNsb3QucGFyZW50Tm9kZS5wYXJlbnROb2RlKSxlLnBhcmVudE5vZGUhPT10aGlzLiQuaXRlbXMpcmV0dXJuO2lmKHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJkcmFnZ2luZy1yb3dzIiwhMCx0aGlzKSx0aGlzLl9zYWZhcmkpe2NvbnN0IHQ9ZS5zdHlsZS50cmFuc2Zvcm07ZS5zdHlsZS50b3A9L3RyYW5zbGF0ZVlcKCguKilcKS8uZXhlYyh0KVsxXSxlLnN0eWxlLnRyYW5zZm9ybT0ibm9uZSIscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+e2Uuc3R5bGUudG9wPSIiLGUuc3R5bGUudHJhbnNmb3JtPXR9KSl9Y29uc3Qgbj1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMuX2lvcz90LmRhdGFUcmFuc2Zlci5zZXREcmFnSW1hZ2UoZSk6dC5kYXRhVHJhbnNmZXIuc2V0RHJhZ0ltYWdlKGUsdC5jbGllbnRYLW4ubGVmdCx0LmNsaWVudFktbi50b3ApO2xldCBpPVtlXTt0aGlzLl9pc1NlbGVjdGVkKGUuX2l0ZW0pJiYoaT10aGlzLl9fZ2V0Vmlld3BvcnRSb3dzKCkuZmlsdGVyKCh0PT50aGlzLl9pc1NlbGVjdGVkKHQuX2l0ZW0pKSkuZmlsdGVyKCh0PT4hdGhpcy5kcmFnRmlsdGVyfHx0aGlzLmRyYWdGaWx0ZXIodGhpcy5fX2dldFJvd01vZGVsKHQpKSkpKSx0LmRhdGFUcmFuc2Zlci5zZXREYXRhKCJ0ZXh0Iix0aGlzLl9fZm9ybWF0RGVmYXVsdFRyYW5zZmVyRGF0YShpKSksZS5zZXRBdHRyaWJ1dGUoImRyYWdzdGFydCIsaS5sZW5ndGg+MT9pLmxlbmd0aDoiIiksdGhpcy51cGRhdGVTdHlsZXMoeyItLV9ncmlkLWRyYWctc3RhcnQteCI6dC5jbGllbnRYLW4ubGVmdCsyMCsicHgiLCItLV9ncmlkLWRyYWctc3RhcnQteSI6dC5jbGllbnRZLW4udG9wKzEwKyJweCJ9KSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT57ZS5yZW1vdmVBdHRyaWJ1dGUoImRyYWdzdGFydCIpLHRoaXMudXBkYXRlU3R5bGVzKHsiLS1fZ3JpZC1kcmFnLXN0YXJ0LXgiOiIiLCItLV9ncmlkLWRyYWctc3RhcnQteSI6IiJ9KX0pKTtjb25zdCByPW5ldyBDdXN0b21FdmVudCgiZ3JpZC1kcmFnc3RhcnQiLHtkZXRhaWw6e2RyYWdnZWRJdGVtczppLm1hcCgodD0+dC5faXRlbSkpLHNldERyYWdEYXRhOihlLG4pPT50LmRhdGFUcmFuc2Zlci5zZXREYXRhKGUsbiksc2V0RHJhZ2dlZEl0ZW1zQ291bnQ6dD0+ZS5zZXRBdHRyaWJ1dGUoImRyYWdzdGFydCIsdCl9fSk7ci5vcmlnaW5hbEV2ZW50PXQsdGhpcy5kaXNwYXRjaEV2ZW50KHIpfX1fb25EcmFnRW5kKHQpe3RoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgiZHJhZ2dpbmctcm93cyIsITEsdGhpcyksdC5zdG9wUHJvcGFnYXRpb24oKTtjb25zdCBlPW5ldyBDdXN0b21FdmVudCgiZ3JpZC1kcmFnZW5kIik7ZS5vcmlnaW5hbEV2ZW50PXQsdGhpcy5kaXNwYXRjaEV2ZW50KGUpfV9vbkRyYWdMZWF2ZSh0KXt0LnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuX2NsZWFyRHJhZ1N0eWxlcygpfV9vbkRyYWdPdmVyKHQpe2lmKHRoaXMuZHJvcE1vZGUpe2lmKHRoaXMuX2Ryb3BMb2NhdGlvbj12b2lkIDAsdGhpcy5fZHJhZ092ZXJJdGVtPXZvaWQgMCx0aGlzLl9fZG5kQXV0b1Njcm9sbCh0LmNsaWVudFkpKXJldHVybiB2b2lkIHRoaXMuX2NsZWFyRHJhZ1N0eWxlcygpO2xldCBlPXQuY29tcG9zZWRQYXRoKCkuZmlsdGVyKCh0PT4idHIiPT09dC5sb2NhbE5hbWUpKVswXTtpZih0aGlzLl9lZmZlY3RpdmVTaXplJiYib24tZ3JpZCIhPT10aGlzLmRyb3BNb2RlKWlmKGUmJmUucGFyZW50Tm9kZT09PXRoaXMuJC5pdGVtcyl7Y29uc3Qgbj1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMuX2Ryb3BMb2NhdGlvbj0ib24tdG9wIix0aGlzLmRyb3BNb2RlPT09WSR0P3RoaXMuX2Ryb3BMb2NhdGlvbj10LmNsaWVudFktbi50b3A8bi5ib3R0b20tdC5jbGllbnRZPyQkdDpLJHQ6dGhpcy5kcm9wTW9kZT09PVgkdCYmKHQuY2xpZW50WS1uLnRvcDxuLmhlaWdodC8zP3RoaXMuX2Ryb3BMb2NhdGlvbj0kJHQ6dC5jbGllbnRZLW4udG9wPm4uaGVpZ2h0LzMqMiYmKHRoaXMuX2Ryb3BMb2NhdGlvbj1LJHQpKX1lbHNle2lmKGUpcmV0dXJuO2lmKHRoaXMuZHJvcE1vZGUhPT1ZJHQmJnRoaXMuZHJvcE1vZGUhPT1YJHQpcmV0dXJuO2U9QXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pLmZpbHRlcigodD0+IXQuaGlkZGVuKSkucG9wKCksdGhpcy5fZHJvcExvY2F0aW9uPUskdH1lbHNlIHRoaXMuX2Ryb3BMb2NhdGlvbj1aJHQ7aWYoZSYmZS5oYXNBdHRyaWJ1dGUoImRyb3AtZGlzYWJsZWQiKSlyZXR1cm4gdm9pZCh0aGlzLl9kcm9wTG9jYXRpb249dm9pZCAwKTt0LnN0b3BQcm9wYWdhdGlvbigpLHQucHJldmVudERlZmF1bHQoKSx0aGlzLl9kcm9wTG9jYXRpb249PT1aJHQ/dGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJkcmFnb3ZlciIsITAsdGhpcyk6ZT8odGhpcy5fZHJhZ092ZXJJdGVtPWUuX2l0ZW0sZS5nZXRBdHRyaWJ1dGUoImRyYWdvdmVyIikhPT10aGlzLl9kcm9wTG9jYXRpb24mJmUuc2V0QXR0cmlidXRlKCJkcmFnb3ZlciIsdGhpcy5fZHJvcExvY2F0aW9uKSk6dGhpcy5fY2xlYXJEcmFnU3R5bGVzKCl9fV9fZG5kQXV0b1Njcm9sbCh0KXtpZih0aGlzLl9fZG5kQXV0b1Njcm9sbGluZylyZXR1cm4hMDtjb25zdCBlPXRoaXMuJC5oZWFkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tLG49dGhpcy4kLmZvb3Rlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AsaT1lLXQrdGhpcy5fX2RuZEF1dG9TY3JvbGxUaHJlc2hvbGQscj10LW4rdGhpcy5fX2RuZEF1dG9TY3JvbGxUaHJlc2hvbGQ7bGV0IG89MDtpZihyPjA/bz0yKnI6aT4wJiYobz0yKi1pKSxvKXtjb25zdCB0PXRoaXMuJC50YWJsZS5zY3JvbGxUb3A7aWYodGhpcy4kLnRhYmxlLnNjcm9sbFRvcCs9byx0IT09dGhpcy4kLnRhYmxlLnNjcm9sbFRvcClyZXR1cm4gdGhpcy5fX2RuZEF1dG9TY3JvbGxpbmc9ITAsc2V0VGltZW91dCgoKCk9PnRoaXMuX19kbmRBdXRvU2Nyb2xsaW5nPSExKSwyMCksdGhpcy5fc2Nyb2xsSGFuZGxlcigpLCEwfX1fX2dldFZpZXdwb3J0Um93cygpe2NvbnN0IHQ9dGhpcy4kLmhlYWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20sZT10aGlzLiQuZm9vdGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pLmZpbHRlcigobj0+e2NvbnN0IGk9bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4gaS5ib3R0b20+dCYmaS50b3A8ZX0pKX1fY2xlYXJEcmFnU3R5bGVzKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImRyYWdvdmVyIiksQXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pLmZvckVhY2goKHQ9PnQucmVtb3ZlQXR0cmlidXRlKCJkcmFnb3ZlciIpKSl9X29uRHJvcCh0KXtpZih0aGlzLmRyb3BNb2RlKXt0LnN0b3BQcm9wYWdhdGlvbigpLHQucHJldmVudERlZmF1bHQoKTtjb25zdCBlPXQuZGF0YVRyYW5zZmVyLnR5cGVzJiZBcnJheS5mcm9tKHQuZGF0YVRyYW5zZmVyLnR5cGVzKS5tYXAoKGU9Pih7dHlwZTplLGRhdGE6dC5kYXRhVHJhbnNmZXIuZ2V0RGF0YShlKX0pKSk7dGhpcy5fY2xlYXJEcmFnU3R5bGVzKCk7Y29uc3Qgbj1uZXcgQ3VzdG9tRXZlbnQoImdyaWQtZHJvcCIse2J1YmJsZXM6dC5idWJibGVzLGNhbmNlbGFibGU6dC5jYW5jZWxhYmxlLGRldGFpbDp7ZHJvcFRhcmdldEl0ZW06dGhpcy5fZHJhZ092ZXJJdGVtLGRyb3BMb2NhdGlvbjp0aGlzLl9kcm9wTG9jYXRpb24sZHJhZ0RhdGE6ZX19KTtuLm9yaWdpbmFsRXZlbnQ9dCx0aGlzLmRpc3BhdGNoRXZlbnQobil9fV9fZm9ybWF0RGVmYXVsdFRyYW5zZmVyRGF0YSh0KXtyZXR1cm4gdC5tYXAoKHQ9PkFycmF5LmZyb20odC5jaGlsZHJlbikuZmlsdGVyKCh0PT4hdC5oaWRkZW4mJi0xPT09dC5nZXRBdHRyaWJ1dGUoInBhcnQiKS5pbmRleE9mKCJkZXRhaWxzLWNlbGwiKSkpLnNvcnQoKCh0LGUpPT50Ll9jb2x1bW4uX29yZGVyPmUuX2NvbHVtbi5fb3JkZXI/MTotMSkpLm1hcCgodD0+dC5fY29udGVudC50ZXh0Q29udGVudC50cmltKCkpKS5maWx0ZXIoKHQ9PnQpKS5qb2luKCJcdCIpKSkuam9pbigiXG4iKX1fZHJhZ0Ryb3BBY2Nlc3NDaGFuZ2VkKCl7dGhpcy5maWx0ZXJEcmFnQW5kRHJvcCgpfWZpbHRlckRyYWdBbmREcm9wKCl7QXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pLmZpbHRlcigodD0+IXQuaGlkZGVuKSkuZm9yRWFjaCgodD0+e3RoaXMuX2ZpbHRlckRyYWdBbmREcm9wKHQsdGhpcy5fX2dldFJvd01vZGVsKHQpKX0pKX1fZmlsdGVyRHJhZ0FuZERyb3AodCxlKXtjb25zdCBuPSF0aGlzLnJvd3NEcmFnZ2FibGV8fHRoaXMuZHJhZ0ZpbHRlciYmIXRoaXMuZHJhZ0ZpbHRlcihlKSxpPSF0aGlzLmRyb3BNb2RlfHx0aGlzLmRyb3BGaWx0ZXImJiF0aGlzLmRyb3BGaWx0ZXIoZSk7QXJyYXkuZnJvbSh0LmNoaWxkcmVuKS5tYXAoKHQ9PnQuX2NvbnRlbnQpKS5mb3JFYWNoKCh0PT57bj90LnJlbW92ZUF0dHJpYnV0ZSgiZHJhZ2dhYmxlIik6dC5zZXRBdHRyaWJ1dGUoImRyYWdnYWJsZSIsITApfSkpLHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgiZHJhZy1kaXNhYmxlZCIsbix0KSx0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImRyb3AtZGlzYWJsZWQiLGksdCl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLyxRJHQ9dD0+Y2xhc3MgZXh0ZW5kcyB0e3N0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntfaGVhZGVyRm9jdXNhYmxlOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX2ZvY3VzYWJsZUNoYW5nZWQifSxfaXRlbXNGb2N1c2FibGU6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfZm9jdXNhYmxlQ2hhbmdlZCJ9LF9mb290ZXJGb2N1c2FibGU6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfZm9jdXNhYmxlQ2hhbmdlZCJ9LF9uYXZpZ2F0aW5nSXNIaWRkZW46Qm9vbGVhbixfZm9jdXNlZEl0ZW1JbmRleDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX2ZvY3VzZWRDb2x1bW5PcmRlcjpOdW1iZXIsaW50ZXJhY3Rpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAscmVhZE9ubHk6ITAsb2JzZXJ2ZXI6Il9pbnRlcmFjdGluZ0NoYW5nZWQifX19cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMuX2lvc3x8dGhpcy5fYW5kcm9pZHx8KHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5fb25LZXlEb3duKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIix0aGlzLl9vbktleVVwKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzaW4iLHRoaXMuX29uRm9jdXNJbiksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJmb2N1c291dCIsdGhpcy5fb25Gb2N1c091dCksdGhpcy4kLnRhYmxlLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzaW4iLHRoaXMuX29uQ2VsbEZvY3VzSW4uYmluZCh0aGlzKSksdGhpcy4kLnRhYmxlLmFkZEV2ZW50TGlzdGVuZXIoImZvY3Vzb3V0Iix0aGlzLl9vbkNlbGxGb2N1c091dC5iaW5kKHRoaXMpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsKCgpPT57dGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJuYXZpZ2F0aW5nIiwhMSx0aGlzKSx0aGlzLl9pc01vdXNlZG93bj0hMH0pKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLCgoKT0+dGhpcy5faXNNb3VzZWRvd249ITEpKSl9X2ZvY3VzYWJsZUNoYW5nZWQodCxlKXtlJiZlLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCItMSIpLHQmJnRoaXMuX3VwZGF0ZUdyaWRTZWN0aW9uRm9jdXNUYXJnZXQodCl9X2ludGVyYWN0aW5nQ2hhbmdlZCgpe3RoaXMuX3VwZGF0ZUdyaWRTZWN0aW9uRm9jdXNUYXJnZXQodGhpcy5faGVhZGVyRm9jdXNhYmxlKSx0aGlzLl91cGRhdGVHcmlkU2VjdGlvbkZvY3VzVGFyZ2V0KHRoaXMuX2l0ZW1zRm9jdXNhYmxlKSx0aGlzLl91cGRhdGVHcmlkU2VjdGlvbkZvY3VzVGFyZ2V0KHRoaXMuX2Zvb3RlckZvY3VzYWJsZSl9X29uS2V5RG93bih0KXtjb25zdCBlPXQua2V5O2xldCBuO3N3aXRjaChlKXtjYXNlIkFycm93VXAiOmNhc2UiQXJyb3dEb3duIjpjYXNlIkFycm93TGVmdCI6Y2FzZSJBcnJvd1JpZ2h0IjpjYXNlIlBhZ2VVcCI6Y2FzZSJQYWdlRG93biI6Y2FzZSJIb21lIjpjYXNlIkVuZCI6bj0iTmF2aWdhdGlvbiI7YnJlYWs7Y2FzZSJFbnRlciI6Y2FzZSJFc2NhcGUiOmNhc2UiRjIiOm49IkludGVyYWN0aW9uIjticmVhaztjYXNlIlRhYiI6bj0iVGFiIjticmVhaztjYXNlIiAiOm49IlNwYWNlIn10aGlzLl9kZXRlY3RJbnRlcmFjdGluZyh0KSx0aGlzLmludGVyYWN0aW5nJiYiSW50ZXJhY3Rpb24iIT09biYmKG49dm9pZCAwKSxuJiZ0aGlzW2Bfb24ke259S2V5RG93bmBdKHQsZSl9X2Vuc3VyZVNjcm9sbGVkVG9JbmRleCh0KXtBcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZmlsdGVyKChlPT5lLmluZGV4PT09dCkpWzBdfHx0aGlzLl9zY3JvbGxUb0luZGV4KHQpfV9vbk5hdmlnYXRpb25LZXlEb3duKHQsZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0LnBhcmVudE5vZGUuY2hpbGRyZW4sdCl9dGhpcy5fc2Nyb2xsSGFuZGxlcigpLHQucHJldmVudERlZmF1bHQoKTtjb25zdCBpPXRoaXMuX2xhc3RWaXNpYmxlSW5kZXgtdGhpcy5fZmlyc3RWaXNpYmxlSW5kZXgtMTtsZXQgcj0wLG89MDtzd2l0Y2goZSl7Y2FzZSJBcnJvd1JpZ2h0IjpyPXRoaXMuX19pc1JUTD8tMToxO2JyZWFrO2Nhc2UiQXJyb3dMZWZ0IjpyPXRoaXMuX19pc1JUTD8xOi0xO2JyZWFrO2Nhc2UiSG9tZSI6cj0tMS8wLHQuY3RybEtleSYmKG89LTEvMCk7YnJlYWs7Y2FzZSJFbmQiOnI9MS8wLHQuY3RybEtleSYmKG89MS8wKTticmVhaztjYXNlIkFycm93RG93biI6bz0xO2JyZWFrO2Nhc2UiQXJyb3dVcCI6bz0tMTticmVhaztjYXNlIlBhZ2VEb3duIjpvPWk7YnJlYWs7Y2FzZSJQYWdlVXAiOm89LWl9Y29uc3QgYT10LmNvbXBvc2VkUGF0aCgpWzBdLHM9bihhKSxsPXRoaXMuX2VsZW1lbnRNYXRjaGVzKGEsJ1twYXJ0fj0iZGV0YWlscy1jZWxsIl0nKSxjPWEucGFyZW50Tm9kZSx1PWMucGFyZW50Tm9kZSxoPSh1PT09dGhpcy4kLml0ZW1zP3RoaXMuX2VmZmVjdGl2ZVNpemU6dS5jaGlsZHJlbi5sZW5ndGgpLTEsZD11PT09dGhpcy4kLml0ZW1zP3ZvaWQgMCE9PXRoaXMuX2ZvY3VzZWRJdGVtSW5kZXg/dGhpcy5fZm9jdXNlZEl0ZW1JbmRleDpjLmluZGV4Om4oYyk7bGV0IHA9TWF0aC5tYXgoMCxNYXRoLm1pbihkK28saCkpLGY9ITE7aWYodT09PXRoaXMuJC5pdGVtcyl7Y29uc3QgdD1jLl9pdGVtLGU9dGhpcy5fY2FjaGUuZ2V0SXRlbUZvckluZGV4KHApO2Y9bD8wPT09bzoxPT09byYmdGhpcy5faXNEZXRhaWxzT3BlbmVkKHQpfHwtMT09PW8mJnAhPT1kJiZ0aGlzLl9pc0RldGFpbHNPcGVuZWQoZSksZiE9PWwmJigxPT09byYmZnx8LTE9PT1vJiYhZikmJihwPWQpfWlmKHUhPT10aGlzLiQuaXRlbXMpaWYocD5kKWZvcig7cDxoJiZ1LmNoaWxkcmVuW3BdLmhpZGRlbjspcCsrO2Vsc2UgaWYocDxkKWZvcig7cD4wJiZ1LmNoaWxkcmVuW3BdLmhpZGRlbjspcC0tO3ZvaWQgMD09PXRoaXMuX2ZvY3VzZWRDb2x1bW5PcmRlciYmKHRoaXMuX2ZvY3VzZWRDb2x1bW5PcmRlcj1sPzA6dGhpcy5fZ2V0Q29sdW1ucyh1LGQpLmZpbHRlcigodD0+IXQuaGlkZGVuKSlbc10uX29yZGVyKTtjb25zdCBtPXRoaXMuX2dldENvbHVtbnModSxwKS5maWx0ZXIoKHQ9PiF0LmhpZGRlbikpLGc9bS5tYXAoKHQ9PnQuX29yZGVyKSkuc29ydCgoKHQsZSk9PnQtZSkpLF89Zy5sZW5ndGgtMSx5PWcuaW5kZXhPZihnLnNsaWNlKDApLnNvcnQoKCh0LGUpPT5NYXRoLmFicyh0LXRoaXMuX2ZvY3VzZWRDb2x1bW5PcmRlciktTWF0aC5hYnMoZS10aGlzLl9mb2N1c2VkQ29sdW1uT3JkZXIpKSlbMF0pLHY9MD09PW8mJmw/eTpNYXRoLm1heCgwLE1hdGgubWluKHkrcixfKSk7diE9PXkmJih0aGlzLl9mb2N1c2VkQ29sdW1uT3JkZXI9dm9pZCAwKSx1PT09dGhpcy4kLml0ZW1zJiZ0aGlzLl9lbnN1cmVTY3JvbGxlZFRvSW5kZXgocCksdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJuYXZpZ2F0aW5nIiwhMCx0aGlzKTtjb25zdCBiPW0ucmVkdWNlKCgodCxlLG4pPT4odFtlLl9vcmRlcl09bix0KSkse30pW2dbdl1dLHg9dT09PXRoaXMuJC5pdGVtcz9BcnJheS5mcm9tKHUuY2hpbGRyZW4pLmZpbHRlcigodD0+dC5pbmRleD09PXApKVswXTp1LmNoaWxkcmVuW3BdO2lmKCF4KXJldHVybjtjb25zdCB3PWY/QXJyYXkuZnJvbSh4LmNoaWxkcmVuKS5maWx0ZXIoKHQ9PnRoaXMuX2VsZW1lbnRNYXRjaGVzKHQsJ1twYXJ0fj0iZGV0YWlscy1jZWxsIl0nKSkpWzBdOnguY2hpbGRyZW5bYl07aWYodGhpcy5fc2Nyb2xsSG9yaXpvbnRhbGx5VG9DZWxsKHcpLHU9PT10aGlzLiQuaXRlbXMmJih0aGlzLl9mb2N1c2VkSXRlbUluZGV4PXApLHU9PT10aGlzLiQuaXRlbXMpe2NvbnN0IHQ9dy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxlPXRoaXMuJC5mb290ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLG49dGhpcy4kLmhlYWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b207dC5ib3R0b20+ZT8odGhpcy4kLnRhYmxlLnNjcm9sbFRvcCs9dC5ib3R0b20tZSx0aGlzLl9zY3JvbGxIYW5kbGVyKCkpOnQudG9wPG4mJih0aGlzLiQudGFibGUuc2Nyb2xsVG9wLT1uLXQudG9wLHRoaXMuX3Njcm9sbEhhbmRsZXIoKSl9dy5mb2N1cygpfV9vbkludGVyYWN0aW9uS2V5RG93bih0LGUpe2NvbnN0IG49dC5jb21wb3NlZFBhdGgoKVswXSxpPSJpbnB1dCI9PT1uLmxvY2FsTmFtZSYmIS9eKGJ1dHRvbnxjaGVja2JveHxjb2xvcnxmaWxlfGltYWdlfHJhZGlvfHJhbmdlfHJlc2V0fHN1Ym1pdCkkL2kudGVzdChuLnR5cGUpO2xldCByO3N3aXRjaChlKXtjYXNlIkVudGVyIjpyPSF0aGlzLmludGVyYWN0aW5nfHwhaTticmVhaztjYXNlIkVzY2FwZSI6cj0hMTticmVhaztjYXNlIkYyIjpyPSF0aGlzLmludGVyYWN0aW5nfWNvbnN0e2NlbGw6b309dGhpcy5fZ2V0R3JpZEV2ZW50TG9jYXRpb24odCk7aWYodGhpcy5pbnRlcmFjdGluZyE9PXImJm51bGwhPT1vKWlmKHIpe2NvbnN0IGU9by5fY29udGVudC5xdWVyeVNlbGVjdG9yKCJbZm9jdXMtdGFyZ2V0XSIpfHxvLl9jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO2UmJih0LnByZXZlbnREZWZhdWx0KCksZS5mb2N1cygpLHRoaXMuX3NldEludGVyYWN0aW5nKCEwKSx0aGlzLl90b2dnbGVBdHRyaWJ1dGUoIm5hdmlnYXRpbmciLCExLHRoaXMpKX1lbHNlIHQucHJldmVudERlZmF1bHQoKSx0aGlzLl9mb2N1c2VkQ29sdW1uT3JkZXI9dm9pZCAwLG8uZm9jdXMoKSx0aGlzLl9zZXRJbnRlcmFjdGluZyghMSksdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJuYXZpZ2F0aW5nIiwhMCx0aGlzKX1fcHJlZGljdEZvY3VzU3RlcFRhcmdldCh0LGUpe2NvbnN0IG49W3RoaXMuJC50YWJsZSx0aGlzLl9oZWFkZXJGb2N1c2FibGUsdGhpcy5faXRlbXNGb2N1c2FibGUsdGhpcy5fZm9vdGVyRm9jdXNhYmxlLHRoaXMuJC5mb2N1c2V4aXRdO2xldCBpPW4uaW5kZXhPZih0KTtmb3IoaSs9ZTtpPj0wJiZpPD1uLmxlbmd0aC0xJiYoIW5baV18fG5baV0ucGFyZW50Tm9kZS5oaWRkZW4pOylpKz1lO3JldHVybiBuW2ldfV9vblRhYktleURvd24odCl7Y29uc3QgZT10aGlzLl9wcmVkaWN0Rm9jdXNTdGVwVGFyZ2V0KHQuY29tcG9zZWRQYXRoKClbMF0sdC5zaGlmdEtleT8tMToxKTtpZihlPT09dGhpcy4kLnRhYmxlKXRoaXMuJC50YWJsZS5mb2N1cygpO2Vsc2UgaWYoZT09PXRoaXMuJC5mb2N1c2V4aXQpdGhpcy4kLmZvY3VzZXhpdC5mb2N1cygpO2Vsc2UgaWYoZT09PXRoaXMuX2l0ZW1zRm9jdXNhYmxlKXtsZXQgbj1lO2NvbnN0IGk9dGhpcy5faXRlbXNGb2N1c2FibGUucGFyZW50Tm9kZTtpZih0aGlzLl9lbnN1cmVTY3JvbGxlZFRvSW5kZXgodGhpcy5fZm9jdXNlZEl0ZW1JbmRleCksaS5pbmRleCE9PXRoaXMuX2ZvY3VzZWRJdGVtSW5kZXgpe2NvbnN0IHQ9QXJyYXkuZnJvbShpLmNoaWxkcmVuKS5pbmRleE9mKHRoaXMuX2l0ZW1zRm9jdXNhYmxlKSxlPUFycmF5LmZyb20odGhpcy4kLml0ZW1zLmNoaWxkcmVuKS5maWx0ZXIoKHQ9PnQuaW5kZXg9PT10aGlzLl9mb2N1c2VkSXRlbUluZGV4KSlbMF07ZSYmKG49ZS5jaGlsZHJlblt0XSl9dC5wcmV2ZW50RGVmYXVsdCgpLG4uZm9jdXMoKX1lbHNlIHQucHJldmVudERlZmF1bHQoKSxlLmZvY3VzKCk7dGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJuYXZpZ2F0aW5nIiwhMCx0aGlzKX1fb25TcGFjZUtleURvd24odCl7dC5wcmV2ZW50RGVmYXVsdCgpO2NvbnN0IGU9dC5jb21wb3NlZFBhdGgoKVswXTtlLl9jb250ZW50JiZlLl9jb250ZW50LmZpcnN0RWxlbWVudENoaWxkfHx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjZWxsLWFjdGl2YXRlIix7ZGV0YWlsOnttb2RlbDp0aGlzLl9fZ2V0Um93TW9kZWwoZS5wYXJlbnRFbGVtZW50KX19KSl9X29uS2V5VXAodCl7aWYoIS9eKCB8U3BhY2VCYXIpJC8udGVzdCh0LmtleSkpcmV0dXJuO3QucHJldmVudERlZmF1bHQoKTtjb25zdCBlPXQuY29tcG9zZWRQYXRoKClbMF07aWYoZS5fY29udGVudCYmZS5fY29udGVudC5maXJzdEVsZW1lbnRDaGlsZCl7Y29uc3QgdD10aGlzLmhhc0F0dHJpYnV0ZSgibmF2aWdhdGluZyIpO2UuX2NvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQuY2xpY2soKSx0aGlzLl90b2dnbGVBdHRyaWJ1dGUoIm5hdmlnYXRpbmciLHQsdGhpcyl9fV9vbkZvY3VzSW4odCl7dGhpcy5faXNNb3VzZWRvd258fHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgibmF2aWdhdGluZyIsITAsdGhpcyk7Y29uc3QgZT10LmNvbXBvc2VkUGF0aCgpWzBdO2U9PT10aGlzLiQudGFibGV8fGU9PT10aGlzLiQuZm9jdXNleGl0Pyh0aGlzLl9wcmVkaWN0Rm9jdXNTdGVwVGFyZ2V0KGUsZT09PXRoaXMuJC50YWJsZT8xOi0xKS5mb2N1cygpLHRoaXMuX3NldEludGVyYWN0aW5nKCExKSk6dGhpcy5fZGV0ZWN0SW50ZXJhY3RpbmcodCl9X29uRm9jdXNPdXQodCl7dGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJuYXZpZ2F0aW5nIiwhMSx0aGlzKSx0aGlzLl9kZXRlY3RJbnRlcmFjdGluZyh0KX1fb25DZWxsRm9jdXNJbih0KXtjb25zdHtzZWN0aW9uOmUsY2VsbDpufT10aGlzLl9nZXRHcmlkRXZlbnRMb2NhdGlvbih0KTt0aGlzLl9kZXRlY3RJbnRlcmFjdGluZyh0KSxlJiZuJiYodGhpcy5fYWN0aXZlUm93R3JvdXA9ZSx0aGlzLiQuaGVhZGVyPT09ZT90aGlzLl9oZWFkZXJGb2N1c2FibGU9bjp0aGlzLiQuaXRlbXM9PT1lP3RoaXMuX2l0ZW1zRm9jdXNhYmxlPW46dGhpcy4kLmZvb3Rlcj09PWUmJih0aGlzLl9mb290ZXJGb2N1c2FibGU9biksbi5fY29udGVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY2VsbC1mb2N1c2luIix7YnViYmxlczohMX0pKSxuLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjZWxsLWZvY3VzIix7YnViYmxlczohMCxjb21wb3NlZDohMH0pKSksdGhpcy5fZGV0ZWN0Rm9jdXNlZEl0ZW1JbmRleCh0KX1fb25DZWxsRm9jdXNPdXQodCl7Mz09PXQuY29tcG9zZWRQYXRoKCkuaW5kZXhPZih0aGlzLiQudGFibGUpJiZ0LmNvbXBvc2VkUGF0aCgpWzBdLl9jb250ZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjZWxsLWZvY3Vzb3V0Iix7YnViYmxlczohMX0pKX1fZGV0ZWN0SW50ZXJhY3RpbmcodCl7Y29uc3QgZT10LmNvbXBvc2VkUGF0aCgpLnNvbWUoKHQ9PiJ2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQiPT09dC5sb2NhbE5hbWUpKTt0aGlzLl9zZXRJbnRlcmFjdGluZyhlKX1fZGV0ZWN0Rm9jdXNlZEl0ZW1JbmRleCh0KXtjb25zdHtzZWN0aW9uOmUscm93Om59PXRoaXMuX2dldEdyaWRFdmVudExvY2F0aW9uKHQpO2U9PT10aGlzLiQuaXRlbXMmJih0aGlzLl9mb2N1c2VkSXRlbUluZGV4PW4uaW5kZXgpfV91cGRhdGVHcmlkU2VjdGlvbkZvY3VzVGFyZ2V0KHQpe2lmKCF0KXJldHVybjtjb25zdCBlPXRoaXMuX2dldEdyaWRTZWN0aW9uRnJvbUZvY3VzVGFyZ2V0KHQpO3QudGFiSW5kZXg9dGhpcy5pbnRlcmFjdGluZyYmZT09PXRoaXMuX2FjdGl2ZVJvd0dyb3VwPy0xOjB9X3ByZXZlbnRTY3JvbGxlclJvdGF0aW5nQ2VsbEZvY3VzKHQsZSl7dC5pbmRleD09PXRoaXMuX2ZvY3VzZWRJdGVtSW5kZXgmJnRoaXMuaGFzQXR0cmlidXRlKCJuYXZpZ2F0aW5nIikmJnRoaXMuX2FjdGl2ZVJvd0dyb3VwPT09dGhpcy4kLml0ZW1zJiYodGhpcy5fbmF2aWdhdGluZ0lzSGlkZGVuPSEwLHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgibmF2aWdhdGluZyIsITEsdGhpcykpLGU9PT10aGlzLl9mb2N1c2VkSXRlbUluZGV4JiZ0aGlzLl9uYXZpZ2F0aW5nSXNIaWRkZW4mJih0aGlzLl9uYXZpZ2F0aW5nSXNIaWRkZW49ITEsdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJuYXZpZ2F0aW5nIiwhMCx0aGlzKSl9X2dldENvbHVtbnModCxlKXtsZXQgbj10aGlzLl9jb2x1bW5UcmVlLmxlbmd0aC0xO3JldHVybiB0PT09dGhpcy4kLmhlYWRlcj9uPWU6dD09PXRoaXMuJC5mb290ZXImJihuPXRoaXMuX2NvbHVtblRyZWUubGVuZ3RoLTEtZSksdGhpcy5fY29sdW1uVHJlZVtuXX1fcmVzZXRLZXlib2FyZE5hdmlnYXRpb24oKXtpZih0aGlzLiQuaGVhZGVyLmZpcnN0RWxlbWVudENoaWxkJiYodGhpcy5faGVhZGVyRm9jdXNhYmxlPUFycmF5LmZyb20odGhpcy4kLmhlYWRlci5maXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbikuZmlsdGVyKCh0PT4hdC5oaWRkZW4pKVswXSksdGhpcy4kLml0ZW1zLmZpcnN0RWxlbWVudENoaWxkKXtjb25zdCB0PXRoaXMuX2l0ZXJhdGVJdGVtcygoKHQsZSk9PntpZih0aGlzLl9maXJzdFZpc2libGVJbmRleD09PWUpcmV0dXJuIHRoaXMuJC5pdGVtcy5jaGlsZHJlblt0XX0pKTt0JiYodGhpcy5faXRlbXNGb2N1c2FibGU9QXJyYXkuZnJvbSh0LmNoaWxkcmVuKS5maWx0ZXIoKHQ9PiF0LmhpZGRlbikpWzBdKX10aGlzLiQuZm9vdGVyLmZpcnN0RWxlbWVudENoaWxkJiYodGhpcy5fZm9vdGVyRm9jdXNhYmxlPUFycmF5LmZyb20odGhpcy4kLmZvb3Rlci5maXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbikuZmlsdGVyKCh0PT4hdC5oaWRkZW4pKVswXSl9X3Njcm9sbEhvcml6b250YWxseVRvQ2VsbCh0KXtpZih0Lmhhc0F0dHJpYnV0ZSgiZnJvemVuIil8fHRoaXMuX2VsZW1lbnRNYXRjaGVzKHQsJ1twYXJ0fj0iZGV0YWlscy1jZWxsIl0nKSlyZXR1cm47Y29uc3QgZT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49dC5wYXJlbnROb2RlLGk9QXJyYXkuZnJvbShuLmNoaWxkcmVuKS5pbmRleE9mKHQpLHI9dGhpcy4kLnRhYmxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2xldCBvPXIubGVmdCxhPXIucmlnaHQ7Zm9yKGxldCB0PWktMTt0Pj0wO3QtLSl7Y29uc3QgZT1uLmNoaWxkcmVuW3RdO2lmKCFlLmhhc0F0dHJpYnV0ZSgiaGlkZGVuIikmJiF0aGlzLl9lbGVtZW50TWF0Y2hlcyhlLCdbcGFydH49ImRldGFpbHMtY2VsbCJdJykmJmUuaGFzQXR0cmlidXRlKCJmcm96ZW4iKSl7bz1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0O2JyZWFrfX1mb3IobGV0IHQ9aSsxO3Q8bi5jaGlsZHJlbi5sZW5ndGg7dCsrKXtjb25zdCBlPW4uY2hpbGRyZW5bdF07aWYoIWUuaGFzQXR0cmlidXRlKCJoaWRkZW4iKSYmIXRoaXMuX2VsZW1lbnRNYXRjaGVzKGUsJ1twYXJ0fj0iZGV0YWlscy1jZWxsIl0nKSYmZS5oYXNBdHRyaWJ1dGUoImZyb3plbiIpKXthPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDticmVha319ZS5sZWZ0PG8mJih0aGlzLiQudGFibGUuc2Nyb2xsTGVmdCs9TWF0aC5yb3VuZChlLmxlZnQtbykpLGUucmlnaHQ+YSYmKHRoaXMuJC50YWJsZS5zY3JvbGxMZWZ0Kz1NYXRoLnJvdW5kKGUucmlnaHQtYSkpfV9lbGVtZW50TWF0Y2hlcyh0LGUpe3JldHVybiB0Lm1hdGNoZXM/dC5tYXRjaGVzKGUpOi0xIT09QXJyYXkuZnJvbSh0LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbChlKSkuaW5kZXhPZih0KX1fZ2V0R3JpZEV2ZW50TG9jYXRpb24odCl7Y29uc3QgZT10LmNvbXBvc2VkUGF0aCgpLG49ZS5pbmRleE9mKHRoaXMuJC50YWJsZSk7cmV0dXJue3NlY3Rpb246bj49MT9lW24tMV06bnVsbCxyb3c6bj49Mj9lW24tMl06bnVsbCxjZWxsOm4+PTM/ZVtuLTNdOm51bGx9fV9nZXRHcmlkU2VjdGlvbkZyb21Gb2N1c1RhcmdldCh0KXtyZXR1cm4gdD09PXRoaXMuX2hlYWRlckZvY3VzYWJsZT90aGlzLiQuaGVhZGVyOnQ9PT10aGlzLl9pdGVtc0ZvY3VzYWJsZT90aGlzLiQuaXRlbXM6dD09PXRoaXMuX2Zvb3RlckZvY3VzYWJsZT90aGlzLiQuZm9vdGVyOm51bGx9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLyx0S3Q9dD0+Y2xhc3MgZXh0ZW5kcyhwaSh0KSl7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue2NvbHVtblJlb3JkZXJpbmdBbGxvd2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9vcmRlckJhc2VTY29wZTp7dHlwZTpOdW1iZXIsdmFsdWU6MWU3fX19c3RhdGljIGdldCBvYnNlcnZlcnMoKXtyZXR1cm5bIl91cGRhdGVPcmRlcnMoX2NvbHVtblRyZWUsIF9jb2x1bW5UcmVlLiopIl19cmVhZHkoKXtzdXBlci5yZWFkeSgpLGlpKHRoaXMsInRyYWNrIix0aGlzLl9vblRyYWNrRXZlbnQpLHRoaXMuX3Jlb3JkZXJHaG9zdD10aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignW3BhcnQ9InJlb3JkZXItZ2hvc3QiXScpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5fb25Ub3VjaFN0YXJ0LmJpbmQodGhpcykpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIix0aGlzLl9vblRvdWNoTW92ZS5iaW5kKHRoaXMpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix0aGlzLl9vblRvdWNoRW5kLmJpbmQodGhpcykpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLHRoaXMuX29uQ29udGV4dE1lbnUuYmluZCh0aGlzKSl9X29uQ29udGV4dE1lbnUodCl7dGhpcy5oYXNBdHRyaWJ1dGUoInJlb3JkZXJpbmciKSYmdC5wcmV2ZW50RGVmYXVsdCgpfV9vblRvdWNoU3RhcnQodCl7dGhpcy5fc3RhcnRUb3VjaFJlb3JkZXJUaW1lb3V0PXNldFRpbWVvdXQoKCgpPT57dGhpcy5fb25UcmFja1N0YXJ0KHtkZXRhaWw6e3g6dC50b3VjaGVzWzBdLmNsaWVudFgseTp0LnRvdWNoZXNbMF0uY2xpZW50WX19KX0pLDEwMCl9X29uVG91Y2hNb3ZlKHQpe3RoaXMuX2RyYWdnZWRDb2x1bW4mJnQucHJldmVudERlZmF1bHQoKSxjbGVhclRpbWVvdXQodGhpcy5fc3RhcnRUb3VjaFJlb3JkZXJUaW1lb3V0KX1fb25Ub3VjaEVuZCgpe2NsZWFyVGltZW91dCh0aGlzLl9zdGFydFRvdWNoUmVvcmRlclRpbWVvdXQpLHRoaXMuX29uVHJhY2tFbmQoKX1fb25UcmFja0V2ZW50KHQpe2lmKCJzdGFydCI9PT10LmRldGFpbC5zdGF0ZSl7Y29uc3QgZT10LmNvbXBvc2VkUGF0aCgpLG49ZVtlLmluZGV4T2YodGhpcy4kLmhlYWRlciktMl07aWYoIW58fCFuLl9jb250ZW50KXJldHVybjtpZihuLl9jb250ZW50LmNvbnRhaW5zKHRoaXMuZ2V0Um9vdE5vZGUoKS5hY3RpdmVFbGVtZW50KSlyZXR1cm47aWYodGhpcy4kLnNjcm9sbGVyLmhhc0F0dHJpYnV0ZSgiY29sdW1uLXJlc2l6aW5nIikpcmV0dXJuO3RoaXMuX3RvdWNoRGV2aWNlfHx0aGlzLl9vblRyYWNrU3RhcnQodCl9ZWxzZSJ0cmFjayI9PT10LmRldGFpbC5zdGF0ZT90aGlzLl9vblRyYWNrKHQpOiJlbmQiPT09dC5kZXRhaWwuc3RhdGUmJnRoaXMuX29uVHJhY2tFbmQodCl9X29uVHJhY2tTdGFydCh0KXtpZighdGhpcy5jb2x1bW5SZW9yZGVyaW5nQWxsb3dlZClyZXR1cm47Y29uc3QgZT10LmNvbXBvc2VkUGF0aCYmdC5jb21wb3NlZFBhdGgoKTtpZihlJiZlLmZpbHRlcigodD0+dC5oYXNBdHRyaWJ1dGUmJnQuaGFzQXR0cmlidXRlKCJkcmFnZ2FibGUiKSkpWzBdKXJldHVybjtjb25zdCBuPXRoaXMuX2NlbGxGcm9tUG9pbnQodC5kZXRhaWwueCx0LmRldGFpbC55KTtpZihuJiYtMSE9PW4uZ2V0QXR0cmlidXRlKCJwYXJ0IikuaW5kZXhPZigiaGVhZGVyLWNlbGwiKSl7Zm9yKHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgicmVvcmRlcmluZyIsITAsdGhpcyksdGhpcy5fZHJhZ2dlZENvbHVtbj1uLl9jb2x1bW47MT09PXRoaXMuX2RyYWdnZWRDb2x1bW4ucGFyZW50RWxlbWVudC5jaGlsZEVsZW1lbnRDb3VudDspdGhpcy5fZHJhZ2dlZENvbHVtbj10aGlzLl9kcmFnZ2VkQ29sdW1uLnBhcmVudEVsZW1lbnQ7dGhpcy5fc2V0U2libGluZ3NSZW9yZGVyU3RhdHVzKHRoaXMuX2RyYWdnZWRDb2x1bW4sImFsbG93ZWQiKSx0aGlzLl9kcmFnZ2VkQ29sdW1uLl9yZW9yZGVyU3RhdHVzPSJkcmFnZ2luZyIsdGhpcy5fdXBkYXRlR2hvc3QobiksdGhpcy5fcmVvcmRlckdob3N0LnN0eWxlLnZpc2liaWxpdHk9InZpc2libGUiLHRoaXMuX3VwZGF0ZUdob3N0UG9zaXRpb24odC5kZXRhaWwueCx0aGlzLl90b3VjaERldmljZT90LmRldGFpbC55LTUwOnQuZGV0YWlsLnkpLHRoaXMuX2F1dG9TY3JvbGxlcigpfX1fb25UcmFjayh0KXtpZighdGhpcy5fZHJhZ2dlZENvbHVtbilyZXR1cm47Y29uc3QgZT10aGlzLl9jZWxsRnJvbVBvaW50KHQuZGV0YWlsLngsdC5kZXRhaWwueSk7aWYoIWUpcmV0dXJuO2NvbnN0IG49dGhpcy5fZ2V0VGFyZ2V0Q29sdW1uKGUsdGhpcy5fZHJhZ2dlZENvbHVtbik7dGhpcy5faXNTd2FwQWxsb3dlZCh0aGlzLl9kcmFnZ2VkQ29sdW1uLG4pJiZ0aGlzLl9pc1N3YXBwYWJsZUJ5UG9zaXRpb24obix0LmRldGFpbC54KSYmdGhpcy5fc3dhcENvbHVtbk9yZGVycyh0aGlzLl9kcmFnZ2VkQ29sdW1uLG4pLHRoaXMuX3VwZGF0ZUdob3N0UG9zaXRpb24odC5kZXRhaWwueCx0aGlzLl90b3VjaERldmljZT90LmRldGFpbC55LTUwOnQuZGV0YWlsLnkpLHRoaXMuX2xhc3REcmFnQ2xpZW50WD10LmRldGFpbC54fV9vblRyYWNrRW5kKCl7dGhpcy5fZHJhZ2dlZENvbHVtbiYmKHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgicmVvcmRlcmluZyIsITEsdGhpcyksdGhpcy5fZHJhZ2dlZENvbHVtbi5fcmVvcmRlclN0YXR1cz0iIix0aGlzLl9zZXRTaWJsaW5nc1Jlb3JkZXJTdGF0dXModGhpcy5fZHJhZ2dlZENvbHVtbiwiIiksdGhpcy5fZHJhZ2dlZENvbHVtbj1udWxsLHRoaXMuX2xhc3REcmFnQ2xpZW50WD1udWxsLHRoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4iLHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImNvbHVtbi1yZW9yZGVyIix7ZGV0YWlsOntjb2x1bW5zOnRoaXMuX2dldENvbHVtbnNJbk9yZGVyKCl9fSkpKX1fZ2V0Q29sdW1uc0luT3JkZXIoKXtyZXR1cm4gdGhpcy5fY29sdW1uVHJlZS5zbGljZSgwKS5wb3AoKS5maWx0ZXIoKHQ9PiF0LmhpZGRlbikpLnNvcnQoKCh0LGUpPT50Ll9vcmRlci1lLl9vcmRlcikpfV9jZWxsRnJvbVBvaW50KHQsZSl7dD10fHwwLGU9ZXx8MCx0aGlzLl9kcmFnZ2VkQ29sdW1ufHx0aGlzLl90b2dnbGVBdHRyaWJ1dGUoIm5vLWNvbnRlbnQtcG9pbnRlci1ldmVudHMiLCEwLHRoaXMuJC5zY3JvbGxlcik7Y29uc3Qgbj10aGlzLnNoYWRvd1Jvb3QuZWxlbWVudEZyb21Qb2ludCh0LGUpO2lmKHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgibm8tY29udGVudC1wb2ludGVyLWV2ZW50cyIsITEsdGhpcy4kLnNjcm9sbGVyKSxuJiZuLl9jb2x1bW4pcmV0dXJuIG59X3VwZGF0ZUdob3N0UG9zaXRpb24odCxlKXtjb25zdCBuPXRoaXMuX3Jlb3JkZXJHaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxpPXQtbi53aWR0aC8yLHI9ZS1uLmhlaWdodC8yLG89cGFyc2VJbnQodGhpcy5fcmVvcmRlckdob3N0Ll9sZWZ0fHwwKSxhPXBhcnNlSW50KHRoaXMuX3Jlb3JkZXJHaG9zdC5fdG9wfHwwKTt0aGlzLl9yZW9yZGVyR2hvc3QuX2xlZnQ9by0obi5sZWZ0LWkpLHRoaXMuX3Jlb3JkZXJHaG9zdC5fdG9wPWEtKG4udG9wLXIpLHRoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS50cmFuc2Zvcm09YHRyYW5zbGF0ZSgke3RoaXMuX3Jlb3JkZXJHaG9zdC5fbGVmdH1weCwgJHt0aGlzLl9yZW9yZGVyR2hvc3QuX3RvcH1weClgfV91cGRhdGVHaG9zdCh0KXtjb25zdCBlPXRoaXMuX3Jlb3JkZXJHaG9zdDtlLnRleHRDb250ZW50PXQuX2NvbnRlbnQuaW5uZXJUZXh0O2NvbnN0IG49d2luZG93LmdldENvbXB1dGVkU3R5bGUodCk7cmV0dXJuWyJib3hTaXppbmciLCJkaXNwbGF5Iiwid2lkdGgiLCJoZWlnaHQiLCJiYWNrZ3JvdW5kIiwiYWxpZ25JdGVtcyIsInBhZGRpbmciLCJib3JkZXIiLCJmbGV4LWRpcmVjdGlvbiIsIm92ZXJmbG93Il0uZm9yRWFjaCgodD0+ZS5zdHlsZVt0XT1uW3RdKSksZX1fdXBkYXRlT3JkZXJzKHQsZSl7dm9pZCAwIT09dCYmdm9pZCAwIT09ZSYmKHRbMF0uZm9yRWFjaCgodD0+dC5fb3JkZXI9MCkpLChmdW5jdGlvbiBuKHQsZSxpKXtsZXQgcj0xO3QuZm9yRWFjaCgodD0+e3IlMTA9PTAmJnIrKyx0Ll9vcmRlcj1pK3IqZSxyKyt9KSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovKSh0WzBdLHRoaXMuX29yZGVyQmFzZVNjb3BlLDApKX1fc2V0U2libGluZ3NSZW9yZGVyU3RhdHVzKHQsZSl7QXJyYXkuZnJvbSh0LnBhcmVudE5vZGUuY2hpbGRyZW4pLmZpbHRlcigoZT0+L2NvbHVtbi8udGVzdChlLmxvY2FsTmFtZSkmJnRoaXMuX2lzU3dhcEFsbG93ZWQoZSx0KSkpLmZvckVhY2goKHQ9PnQuX3Jlb3JkZXJTdGF0dXM9ZSkpfV9hdXRvU2Nyb2xsZXIoKXtpZih0aGlzLl9sYXN0RHJhZ0NsaWVudFgpe2NvbnN0IHQ9dGhpcy5fbGFzdERyYWdDbGllbnRYLXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQrNTAsZT10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtdGhpcy5fbGFzdERyYWdDbGllbnRYKzUwO3Q+MD90aGlzLiQudGFibGUuc2Nyb2xsTGVmdCs9dC8xMDplPjAmJih0aGlzLiQudGFibGUuc2Nyb2xsTGVmdC09ZS8xMCksdGhpcy5fc2Nyb2xsSGFuZGxlcigpfXRoaXMuX2RyYWdnZWRDb2x1bW4mJnRoaXMuYXN5bmModGhpcy5fYXV0b1Njcm9sbGVyLDEwKX1faXNTd2FwQWxsb3dlZCh0LGUpe2lmKHQmJmUpe2NvbnN0IG49dC5wYXJlbnRFbGVtZW50PT09ZS5wYXJlbnRFbGVtZW50LGk9dC5mcm96ZW49PT1lLmZyb3plbjtyZXR1cm4gdCE9PWUmJm4mJml9fV9pc1N3YXBwYWJsZUJ5UG9zaXRpb24odCxlKXtjb25zdCBuPUFycmF5LmZyb20odGhpcy4kLmhlYWRlci5xdWVyeVNlbGVjdG9yQWxsKCd0cjpub3QoW2hpZGRlbl0pIFtwYXJ0fj0iY2VsbCJdJykpLmZpbHRlcigoZT0+dC5jb250YWlucyhlLl9jb2x1bW4pKSlbMF0saT10aGlzLiQuaGVhZGVyLnF1ZXJ5U2VsZWN0b3IoInRyOm5vdChbaGlkZGVuXSkgW3Jlb3JkZXItc3RhdHVzPWRyYWdnaW5nXSIpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHI9bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4gci5sZWZ0PmkubGVmdD9lPnIucmlnaHQtaS53aWR0aDplPHIubGVmdCtpLndpZHRofV9zd2FwQ29sdW1uT3JkZXJzKHQsZSl7Y29uc3Qgbj10Ll9vcmRlcjt0Ll9vcmRlcj1lLl9vcmRlcixlLl9vcmRlcj1uLHRoaXMuX3VwZGF0ZUxhc3RGcm96ZW4oKSx0aGlzLl91cGRhdGVGaXJzdEFuZExhc3RDb2x1bW4oKX1fZ2V0VGFyZ2V0Q29sdW1uKHQsZSl7aWYodCYmZSl7bGV0IG49dC5fY29sdW1uO2Zvcig7bi5wYXJlbnRFbGVtZW50IT09ZS5wYXJlbnRFbGVtZW50JiZuIT09dGhpczspbj1uLnBhcmVudEVsZW1lbnQ7cmV0dXJuIG4ucGFyZW50RWxlbWVudD09PWUucGFyZW50RWxlbWVudD9uOnQuX2NvbHVtbn19fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLyxlS3Q9dD0+Y2xhc3MgZXh0ZW5kcyB0e3N0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntyZXNpemFibGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTpmdW5jdGlvbigpe2lmKCJ2YWFkaW4tZ3JpZC1jb2x1bW4tZ3JvdXAiPT09dGhpcy5sb2NhbE5hbWUpcmV0dXJuO2NvbnN0IHQ9dGhpcy5wYXJlbnROb2RlO3JldHVybiB0JiYidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PXQubG9jYWxOYW1lJiZ0LnJlc2l6YWJsZXx8ITF9fSxfaGVhZGVyVGVtcGxhdGU6e3R5cGU6T2JqZWN0fSxfZm9vdGVyVGVtcGxhdGU6e3R5cGU6T2JqZWN0fSxmcm96ZW46e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0saGlkZGVuOnt0eXBlOkJvb2xlYW59LGhlYWRlcjp7dHlwZTpTdHJpbmd9LHRleHRBbGlnbjp7dHlwZTpTdHJpbmd9LF9sYXN0RnJvemVuOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9vcmRlcjpOdW1iZXIsX3Jlb3JkZXJTdGF0dXM6Qm9vbGVhbixfZW1wdHlDZWxsczpBcnJheSxfaGVhZGVyQ2VsbDpPYmplY3QsX2Zvb3RlckNlbGw6T2JqZWN0LF9ncmlkOk9iamVjdCxoZWFkZXJSZW5kZXJlcjpGdW5jdGlvbixmb290ZXJSZW5kZXJlcjpGdW5jdGlvbn19c3RhdGljIGdldCBvYnNlcnZlcnMoKXtyZXR1cm5bIl93aWR0aENoYW5nZWQod2lkdGgsIF9oZWFkZXJDZWxsLCBfZm9vdGVyQ2VsbCwgX2NlbGxzLiopIiwiX2Zyb3plbkNoYW5nZWQoZnJvemVuLCBfaGVhZGVyQ2VsbCwgX2Zvb3RlckNlbGwsIF9jZWxscy4qKSIsIl9mbGV4R3Jvd0NoYW5nZWQoZmxleEdyb3csIF9oZWFkZXJDZWxsLCBfZm9vdGVyQ2VsbCwgX2NlbGxzLiopIiwiX3BhdGhPckhlYWRlckNoYW5nZWQocGF0aCwgaGVhZGVyLCBfaGVhZGVyQ2VsbCwgX2Zvb3RlckNlbGwsIF9jZWxscy4qLCByZW5kZXJlciwgaGVhZGVyUmVuZGVyZXIsIF9ib2R5VGVtcGxhdGUsIF9oZWFkZXJUZW1wbGF0ZSkiLCJfdGV4dEFsaWduQ2hhbmdlZCh0ZXh0QWxpZ24sIF9jZWxscy4qLCBfaGVhZGVyQ2VsbCwgX2Zvb3RlckNlbGwpIiwiX29yZGVyQ2hhbmdlZChfb3JkZXIsIF9oZWFkZXJDZWxsLCBfZm9vdGVyQ2VsbCwgX2NlbGxzLiopIiwiX2xhc3RGcm96ZW5DaGFuZ2VkKF9sYXN0RnJvemVuKSIsIl9zZXRCb2R5VGVtcGxhdGVPclJlbmRlcmVyKF9ib2R5VGVtcGxhdGUsIHJlbmRlcmVyLCBfY2VsbHMsIF9jZWxscy4qKSIsIl9zZXRIZWFkZXJUZW1wbGF0ZU9yUmVuZGVyZXIoX2hlYWRlclRlbXBsYXRlLCBoZWFkZXJSZW5kZXJlciwgX2hlYWRlckNlbGwpIiwiX3NldEZvb3RlclRlbXBsYXRlT3JSZW5kZXJlcihfZm9vdGVyVGVtcGxhdGUsIGZvb3RlclJlbmRlcmVyLCBfZm9vdGVyQ2VsbCkiLCJfcmVzaXphYmxlQ2hhbmdlZChyZXNpemFibGUsIF9oZWFkZXJDZWxsKSIsIl9yZW9yZGVyU3RhdHVzQ2hhbmdlZChfcmVvcmRlclN0YXR1cywgX2hlYWRlckNlbGwsIF9mb290ZXJDZWxsLCBfY2VsbHMuKikiLCJfaGlkZGVuQ2hhbmdlZChoaWRkZW4sIF9oZWFkZXJDZWxsLCBfZm9vdGVyQ2VsbCwgX2NlbGxzLiopIl19Y29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLHRoaXMuX2JvZHlUZW1wbGF0ZSYmKHRoaXMuX2JvZHlUZW1wbGF0ZS50ZW1wbGF0aXplci5fZ3JpZD10aGlzLl9ncmlkKSx0aGlzLl9oZWFkZXJUZW1wbGF0ZSYmKHRoaXMuX2hlYWRlclRlbXBsYXRlLnRlbXBsYXRpemVyLl9ncmlkPXRoaXMuX2dyaWQpLHRoaXMuX2Zvb3RlclRlbXBsYXRlJiYodGhpcy5fZm9vdGVyVGVtcGxhdGUudGVtcGxhdGl6ZXIuX2dyaWQ9dGhpcy5fZ3JpZCksdGhpcy5fdGVtcGxhdGVPYnNlcnZlci5mbHVzaCgpLHRoaXMuX2JvZHlUZW1wbGF0ZXx8dGhpcy5fdGVtcGxhdGVPYnNlcnZlci5jYWxsYmFjaygpLHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKCk9Pnt0aGlzLl9hbGxDZWxscy5mb3JFYWNoKCh0PT57dC5fY29udGVudC5wYXJlbnROb2RlfHx0aGlzLl9ncmlkJiZ0aGlzLl9ncmlkLmFwcGVuZENoaWxkKHQuX2NvbnRlbnQpfSkpfSkpfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT57dGhpcy5fZmluZEhvc3RHcmlkKCl8fHRoaXMuX2FsbENlbGxzLmZvckVhY2goKHQ9Pnt0Ll9jb250ZW50LnBhcmVudE5vZGUmJnQuX2NvbnRlbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0Ll9jb250ZW50KX0pKX0pKSx0aGlzLl9ncmlkVmFsdWU9dm9pZCAwfV9maW5kSG9zdEdyaWQoKXtsZXQgdD10aGlzO2Zvcig7dCYmIS9edmFhZGluLipncmlkKC1wcm8pPyQvLnRlc3QodC5sb2NhbE5hbWUpOyl0PXQuYXNzaWduZWRTbG90P3QuYXNzaWduZWRTbG90LnBhcmVudE5vZGU6dC5wYXJlbnROb2RlO3JldHVybiB0fHx2b2lkIDB9Z2V0IF9ncmlkKCl7cmV0dXJuIHRoaXMuX2dyaWRWYWx1ZXx8KHRoaXMuX2dyaWRWYWx1ZT10aGlzLl9maW5kSG9zdEdyaWQoKSksdGhpcy5fZ3JpZFZhbHVlfWdldCBfYWxsQ2VsbHMoKXtyZXR1cm5bXS5jb25jYXQodGhpcy5fY2VsbHN8fFtdKS5jb25jYXQodGhpcy5fZW1wdHlDZWxsc3x8W10pLmNvbmNhdCh0aGlzLl9oZWFkZXJDZWxsKS5jb25jYXQodGhpcy5fZm9vdGVyQ2VsbCkuZmlsdGVyKCh0PT50KSl9Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX3RlbXBsYXRlT2JzZXJ2ZXI9bmV3IHppKHRoaXMsKCgpPT57dGhpcy5faGVhZGVyVGVtcGxhdGU9dGhpcy5fcHJlcGFyZUhlYWRlclRlbXBsYXRlKCksdGhpcy5fZm9vdGVyVGVtcGxhdGU9dGhpcy5fcHJlcGFyZUZvb3RlclRlbXBsYXRlKCksdGhpcy5fYm9keVRlbXBsYXRlPXRoaXMuX3ByZXBhcmVCb2R5VGVtcGxhdGUoKX0pKX1fcHJlcGFyZUhlYWRlclRlbXBsYXRlKCl7cmV0dXJuIHRoaXMuX3ByZXBhcmVUZW1wbGF0aXplcih0aGlzLl9maW5kVGVtcGxhdGUoITApfHxudWxsLHt9KX1fcHJlcGFyZUZvb3RlclRlbXBsYXRlKCl7cmV0dXJuIHRoaXMuX3ByZXBhcmVUZW1wbGF0aXplcih0aGlzLl9maW5kVGVtcGxhdGUoITEsITApfHxudWxsLHt9KX1fcHJlcGFyZUJvZHlUZW1wbGF0ZSgpe3JldHVybiB0aGlzLl9wcmVwYXJlVGVtcGxhdGl6ZXIodGhpcy5fZmluZFRlbXBsYXRlKCl8fG51bGwpfV9wcmVwYXJlVGVtcGxhdGl6ZXIodCxlKXtpZih0JiYhdC50ZW1wbGF0aXplcil7Y29uc3Qgbj1uZXcgViR0O24uX2dyaWQ9dGhpcy5fZ3JpZCxuLmRhdGFIb3N0PXRoaXMuZGF0YUhvc3Qsbi5faW5zdGFuY2VQcm9wcz1lfHxuLl9pbnN0YW5jZVByb3BzLG4udGVtcGxhdGU9dCx0LnRlbXBsYXRpemVyPW59cmV0dXJuIHR9X3JlbmRlckhlYWRlckFuZEZvb3Rlcigpe3RoaXMuaGVhZGVyUmVuZGVyZXImJnRoaXMuX2hlYWRlckNlbGwmJnRoaXMuX19ydW5SZW5kZXJlcih0aGlzLmhlYWRlclJlbmRlcmVyLHRoaXMuX2hlYWRlckNlbGwpLHRoaXMuZm9vdGVyUmVuZGVyZXImJnRoaXMuX2Zvb3RlckNlbGwmJnRoaXMuX19ydW5SZW5kZXJlcih0aGlzLmZvb3RlclJlbmRlcmVyLHRoaXMuX2Zvb3RlckNlbGwpfV9fcnVuUmVuZGVyZXIodCxlLG4pe2NvbnN0IGk9W2UuX2NvbnRlbnQsdGhpc107biYmbi5pdGVtJiZpLnB1c2gobiksdC5hcHBseSh0aGlzLGkpfV9fc2V0Q29sdW1uVGVtcGxhdGVPclJlbmRlcmVyKHQsZSxuKXtpZighdGhpcy5oaWRkZW4pe2lmKHQmJmUpdGhyb3cgbmV3IEVycm9yKCJZb3Ugc2hvdWxkIG9ubHkgdXNlIGVpdGhlciBhIHJlbmRlcmVyIG9yIGEgdGVtcGxhdGUiKTtuLmZvckVhY2goKG49Pntjb25zdCBpPXRoaXMuX2dyaWQuX19nZXRSb3dNb2RlbChuLnBhcmVudEVsZW1lbnQpO2lmKGUpbi5fcmVuZGVyZXI9ZSwoaS5pdGVtfHxlPT09dGhpcy5oZWFkZXJSZW5kZXJlcnx8ZT09PXRoaXMuZm9vdGVyUmVuZGVyZXIpJiZ0aGlzLl9fcnVuUmVuZGVyZXIoZSxuLGkpO2Vsc2UgaWYobi5fdGVtcGxhdGUhPT10KXtuLl90ZW1wbGF0ZT10LG4uX2NvbnRlbnQuaW5uZXJIVE1MPSIiLHQudGVtcGxhdGl6ZXIuX2dyaWQ9dC50ZW1wbGF0aXplci5fZ3JpZHx8dGhpcy5fZ3JpZDtjb25zdCBlPXQudGVtcGxhdGl6ZXIuY3JlYXRlSW5zdGFuY2UoKTtuLl9jb250ZW50LmFwcGVuZENoaWxkKGUucm9vdCksbi5faW5zdGFuY2U9ZSxpLml0ZW0mJm4uX2luc3RhbmNlLnNldFByb3BlcnRpZXMoaSl9fSkpfX1fc2V0Qm9keVRlbXBsYXRlT3JSZW5kZXJlcih0LGUsbil7KHR8fGUpJiZuJiZ0aGlzLl9fc2V0Q29sdW1uVGVtcGxhdGVPclJlbmRlcmVyKHQsZSxuKX1fc2V0SGVhZGVyVGVtcGxhdGVPclJlbmRlcmVyKHQsZSxuKXsodHx8ZSkmJm4mJnRoaXMuX19zZXRDb2x1bW5UZW1wbGF0ZU9yUmVuZGVyZXIodCxlLFtuXSl9X3NldEZvb3RlclRlbXBsYXRlT3JSZW5kZXJlcih0LGUsbil7KHR8fGUpJiZuJiYodGhpcy5fX3NldENvbHVtblRlbXBsYXRlT3JSZW5kZXJlcih0LGUsW25dKSx0aGlzLl9ncmlkLl9fdXBkYXRlSGVhZGVyRm9vdGVyUm93VmlzaWJpbGl0eShuLnBhcmVudEVsZW1lbnQpKX1fc2VsZWN0Rmlyc3RUZW1wbGF0ZSh0PSExLGU9ITEpe3JldHVybiB6aS5nZXRGbGF0dGVuZWROb2Rlcyh0aGlzKS5maWx0ZXIoKG49PiJ0ZW1wbGF0ZSI9PT1uLmxvY2FsTmFtZSYmbi5jbGFzc0xpc3QuY29udGFpbnMoImhlYWRlciIpPT09dCYmbi5jbGFzc0xpc3QuY29udGFpbnMoImZvb3RlciIpPT09ZSkpWzBdfV9maW5kVGVtcGxhdGUodCxlKXtjb25zdCBuPXRoaXMuX3NlbGVjdEZpcnN0VGVtcGxhdGUodCxlKTtyZXR1cm4gbiYmdGhpcy5kYXRhSG9zdCYmKG4uX3Jvb3REYXRhSG9zdD10aGlzLmRhdGFIb3N0Ll9yb290RGF0YUhvc3R8fHRoaXMuZGF0YUhvc3QpLG59X2ZsZXhHcm93Q2hhbmdlZCh0KXt0aGlzLnBhcmVudEVsZW1lbnQmJnRoaXMucGFyZW50RWxlbWVudC5fY29sdW1uUHJvcENoYW5nZWQmJnRoaXMucGFyZW50RWxlbWVudC5fY29sdW1uUHJvcENoYW5nZWQoImZsZXhHcm93IiksdGhpcy5fYWxsQ2VsbHMuZm9yRWFjaCgoZT0+ZS5zdHlsZS5mbGV4R3Jvdz10KSl9X29yZGVyQ2hhbmdlZCh0KXt0aGlzLl9hbGxDZWxscy5mb3JFYWNoKChlPT5lLnN0eWxlLm9yZGVyPXQpKX1fd2lkdGhDaGFuZ2VkKHQpe3RoaXMucGFyZW50RWxlbWVudCYmdGhpcy5wYXJlbnRFbGVtZW50Ll9jb2x1bW5Qcm9wQ2hhbmdlZCYmdGhpcy5wYXJlbnRFbGVtZW50Ll9jb2x1bW5Qcm9wQ2hhbmdlZCgid2lkdGgiKSx0aGlzLl9hbGxDZWxscy5mb3JFYWNoKChlPT5lLnN0eWxlLndpZHRoPXQpKSx0aGlzLl9ncmlkJiZ0aGlzLl9ncmlkLl9fZm9yY2VSZWZsb3cmJnRoaXMuX2dyaWQuX19mb3JjZVJlZmxvdygpfV9mcm96ZW5DaGFuZ2VkKHQpe3RoaXMucGFyZW50RWxlbWVudCYmdGhpcy5wYXJlbnRFbGVtZW50Ll9jb2x1bW5Qcm9wQ2hhbmdlZCYmdGhpcy5wYXJlbnRFbGVtZW50Ll9jb2x1bW5Qcm9wQ2hhbmdlZCgiZnJvemVuIix0KSx0aGlzLl9hbGxDZWxscy5mb3JFYWNoKChlPT50aGlzLl90b2dnbGVBdHRyaWJ1dGUoImZyb3plbiIsdCxlKSkpLHRoaXMuX2dyaWQmJnRoaXMuX2dyaWQuX2Zyb3plbkNlbGxzQ2hhbmdlZCYmdGhpcy5fZ3JpZC5fZnJvemVuQ2VsbHNDaGFuZ2VkKCl9X2xhc3RGcm96ZW5DaGFuZ2VkKHQpe3RoaXMuX2FsbENlbGxzLmZvckVhY2goKGU9PnRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgibGFzdC1mcm96ZW4iLHQsZSkpKSx0aGlzLnBhcmVudEVsZW1lbnQmJnRoaXMucGFyZW50RWxlbWVudC5fY29sdW1uUHJvcENoYW5nZWQmJih0aGlzLnBhcmVudEVsZW1lbnQuX2xhc3RGcm96ZW49dCl9X3BhdGhPckhlYWRlckNoYW5nZWQodCxlLG4saSxyLG8sYSxzLGwpe2NvbnN0IGM9dm9pZCAwIT09ZTshYSYmIWwmJmMmJm4mJnRoaXMuX19zZXRUZXh0Q29udGVudChuLl9jb250ZW50LGUpLHQmJnIudmFsdWUmJihvfHxzfHx0aGlzLl9fc2V0Q29sdW1uVGVtcGxhdGVPclJlbmRlcmVyKHZvaWQgMCwoKGUsbix7aXRlbTppfSk9PnRoaXMuX19zZXRUZXh0Q29udGVudChlLHRoaXMuZ2V0KHQsaSkpKSxyLnZhbHVlKSxhfHxsfHxjfHwhbnx8bnVsbD09PWV8fHRoaXMuX19zZXRUZXh0Q29udGVudChuLl9jb250ZW50LHRoaXMuX2dlbmVyYXRlSGVhZGVyKHQpKSksbiYmdGhpcy5fZ3JpZC5fX3VwZGF0ZUhlYWRlckZvb3RlclJvd1Zpc2liaWxpdHkobi5wYXJlbnRFbGVtZW50KX1fX3NldFRleHRDb250ZW50KHQsZSl7dC50ZXh0Q29udGVudCE9PWUmJih0LnRleHRDb250ZW50PWUpfV9nZW5lcmF0ZUhlYWRlcih0KXtyZXR1cm4gdC5zdWJzdHIodC5sYXN0SW5kZXhPZigiLiIpKzEpLnJlcGxhY2UoLyhbQS1aXSkvZywiLSQxIikudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8tL2csIiAiKS5yZXBsYWNlKC9eLi8sKHQ9PnQudG9VcHBlckNhc2UoKSkpfV90b2dnbGVBdHRyaWJ1dGUodCxlLG4pe24uaGFzQXR0cmlidXRlKHQpPT09IWUmJihlP24uc2V0QXR0cmlidXRlKHQsIiIpOm4ucmVtb3ZlQXR0cmlidXRlKHQpKX1fcmVvcmRlclN0YXR1c0NoYW5nZWQodCl7dGhpcy5fYWxsQ2VsbHMuZm9yRWFjaCgoZT0+ZS5zZXRBdHRyaWJ1dGUoInJlb3JkZXItc3RhdHVzIix0KSkpfV9yZXNpemFibGVDaGFuZ2VkKHQsZSl7dm9pZCAwIT09dCYmdm9pZCAwIT09ZSYmZSYmW2VdLmNvbmNhdCh0aGlzLl9lbXB0eUNlbGxzKS5mb3JFYWNoKChlPT57aWYoZSl7Y29uc3Qgbj1lLnF1ZXJ5U2VsZWN0b3IoJ1twYXJ0fj0icmVzaXplLWhhbmRsZSJdJyk7aWYobiYmZS5yZW1vdmVDaGlsZChuKSx0KXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3Quc2V0QXR0cmlidXRlKCJwYXJ0IiwicmVzaXplLWhhbmRsZSIpLGUuYXBwZW5kQ2hpbGQodCl9fX0pKX1fdGV4dEFsaWduQ2hhbmdlZCh0KXtpZih2b2lkIDA9PT10KXJldHVybjtpZigtMT09PVsic3RhcnQiLCJlbmQiLCJjZW50ZXIiXS5pbmRleE9mKHQpKXJldHVybiB2b2lkIGNvbnNvbGUud2FybigndGV4dEFsaWduIGNhbiBvbmx5IGJlIHNldCBhcyAic3RhcnQiLCAiZW5kIiBvciAiY2VudGVyIicpO2xldCBlOyJsdHIiPT09Z2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9ncmlkKS5kaXJlY3Rpb24/InN0YXJ0Ij09PXQ/ZT0ibGVmdCI6ImVuZCI9PT10JiYoZT0icmlnaHQiKToic3RhcnQiPT09dD9lPSJyaWdodCI6ImVuZCI9PT10JiYoZT0ibGVmdCIpLHRoaXMuX2FsbENlbGxzLmZvckVhY2goKG49PntuLl9jb250ZW50LnN0eWxlLnRleHRBbGlnbj10LGdldENvbXB1dGVkU3R5bGUobi5fY29udGVudCkudGV4dEFsaWduIT09dCYmKG4uX2NvbnRlbnQuc3R5bGUudGV4dEFsaWduPWUpfSkpfV9oaWRkZW5DaGFuZ2VkKHQpe3RoaXMucGFyZW50RWxlbWVudCYmdGhpcy5wYXJlbnRFbGVtZW50Ll9jb2x1bW5Qcm9wQ2hhbmdlZCYmdGhpcy5wYXJlbnRFbGVtZW50Ll9jb2x1bW5Qcm9wQ2hhbmdlZCgiaGlkZGVuIix0KSwhIXQhPSEhdGhpcy5fcHJldmlvdXNIaWRkZW4mJnRoaXMuX2dyaWQmJighMD09PXQmJnRoaXMuX2FsbENlbGxzLmZvckVhY2goKHQ9Pnt0Ll9jb250ZW50LnBhcmVudE5vZGUmJnQuX2NvbnRlbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0Ll9jb250ZW50KX0pKSx0aGlzLl9ncmlkLl9kZWJvdW5jZXJIaWRkZW5DaGFuZ2VkPVRuLmRlYm91bmNlKHRoaXMuX2dyaWQuX2RlYm91bmNlckhpZGRlbkNoYW5nZWQsX3QsKCgpPT57dGhpcy5fZ3JpZCYmdGhpcy5fZ3JpZC5fcmVuZGVyQ29sdW1uVHJlZSYmdGhpcy5fZ3JpZC5fcmVuZGVyQ29sdW1uVHJlZSh0aGlzLl9ncmlkLl9jb2x1bW5UcmVlKX0pKSx0aGlzLl9ncmlkLl91cGRhdGVMYXN0RnJvemVuJiZ0aGlzLl9ncmlkLl91cGRhdGVMYXN0RnJvemVuKCksdGhpcy5fZ3JpZC5ub3RpZnlSZXNpemUmJnRoaXMuX2dyaWQubm90aWZ5UmVzaXplKCksdGhpcy5fZ3JpZC5fcmVzZXRLZXlib2FyZE5hdmlnYXRpb24mJnRoaXMuX2dyaWQuX3Jlc2V0S2V5Ym9hcmROYXZpZ2F0aW9uKCkpLHRoaXMuX3ByZXZpb3VzSGlkZGVuPXR9fTtjbGFzcyBuS3QgZXh0ZW5kcyhlS3QodyR0KHllKSkpe3N0YXRpYyBnZXQgaXMoKXtyZXR1cm4idmFhZGluLWdyaWQtY29sdW1uIn1zdGF0aWMgZ2V0IHByb3BlcnRpZXMoKXtyZXR1cm57d2lkdGg6e3R5cGU6U3RyaW5nLHZhbHVlOiIxMDBweCJ9LGZsZXhHcm93Ont0eXBlOk51bWJlcix2YWx1ZToxfSxyZW5kZXJlcjpGdW5jdGlvbixwYXRoOnt0eXBlOlN0cmluZ30sYXV0b1dpZHRoOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9ib2R5VGVtcGxhdGU6e3R5cGU6T2JqZWN0fSxfY2VsbHM6QXJyYXl9fX1jdXN0b21FbGVtZW50cy5kZWZpbmUobkt0LmlzLG5LdCksCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovCiRYdCgidmFhZGluLWdyaWQiLEdYdGAKICAgIEBrZXlmcmFtZXMgdmFhZGluLWdyaWQtYXBwZWFyIHsKICAgICAgdG8gewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KICAgIH0KCiAgICA6aG9zdCB7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICBhbmltYXRpb246IDFtcyB2YWFkaW4tZ3JpZC1hcHBlYXI7CiAgICAgIGhlaWdodDogNDAwcHg7CiAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICBhbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB9CgogICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgfQoKICAgICNzY3JvbGxlciB7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgIHdpZHRoOiBhdXRvOwogICAgICBoZWlnaHQ6IGF1dG87CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgdG9wOiAwOwogICAgICByaWdodDogMDsKICAgICAgYm90dG9tOiAwOwogICAgICBsZWZ0OiAwOwogICAgfQoKICAgIDpob3N0KFtoZWlnaHQtYnktcm93c10pIHsKICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgfQoKICAgIDpob3N0KFtoZWlnaHQtYnktcm93c10pICNzY3JvbGxlciB7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIH0KCiAgICAjdGFibGUgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB3aWR0aDogMTAwJTsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICBvdXRsaW5lOiBub25lOwogICAgICAvKiBXb3JrYXJvdW5kIGZvciBhIERlc2t0b3AgU2FmYXJpIGJ1ZzogbmV3IHN0YWNraW5nIGNvbnRleHQgaGVyZSBwcmV2ZW50cyB0aGUgc2Nyb2xsYmFyIGZyb20gZ2V0dGluZyBoaWRkZW4gKi8KICAgICAgei1pbmRleDogMDsKICAgIH0KCiAgICAjaGVhZGVyLAogICAgI2Zvb3RlciB7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICBwb3NpdGlvbjogLXdlYmtpdC1zdGlja3k7CiAgICAgIHBvc2l0aW9uOiBzdGlja3k7CiAgICAgIGxlZnQ6IDA7CiAgICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgICB3aWR0aDogMTAwJTsKICAgICAgei1pbmRleDogMTsKICAgIH0KCiAgICAjaGVhZGVyIHsKICAgICAgdG9wOiAwOwogICAgfQoKICAgIHRoIHsKICAgICAgdGV4dC1hbGlnbjogaW5oZXJpdDsKICAgIH0KCiAgICAvKiBTYWZhcmkgZG9lc24ndCB3b3JrIHdpdGggImluaGVyaXQiICovCiAgICBbc2FmYXJpXSB0aCB7CiAgICAgIHRleHQtYWxpZ246IGluaXRpYWw7CiAgICB9CgogICAgI2Zvb3RlciB7CiAgICAgIGJvdHRvbTogMDsKICAgIH0KCiAgICAjaXRlbXMgewogICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgcG9zaXRpb246IC13ZWJraXQtc3RpY2t5OwogICAgICBwb3NpdGlvbjogc3RpY2t5OwogICAgICB3aWR0aDogMTAwJTsKICAgICAgbGVmdDogMDsKICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICB9CgogICAgW3BhcnR+PSdyb3cnXSB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICBtYXJnaW46IDA7CiAgICB9CgogICAgW3BhcnR+PSdyb3cnXVtsb2FkaW5nXSBbcGFydH49J2JvZHktY2VsbCddIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgb3BhY2l0eTogMDsKICAgIH0KCiAgICAjaXRlbXMgW3BhcnR+PSdyb3cnXSB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIH0KCiAgICAjaXRlbXMgW3BhcnR+PSdyb3cnXTplbXB0eSB7CiAgICAgIGhlaWdodDogMWVtOwogICAgfQoKICAgIFtwYXJ0fj0nY2VsbCddOm5vdChbcGFydH49J2RldGFpbHMtY2VsbCddKSB7CiAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIHBhZGRpbmc6IDA7CiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB9CgogICAgW3BhcnR+PSdkZXRhaWxzLWNlbGwnXSB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgYm90dG9tOiAwOwogICAgICB3aWR0aDogMTAwJTsKICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgcGFkZGluZzogMDsKICAgIH0KCiAgICBbcGFydH49J2NlbGwnXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB3aWR0aDogMTAwJTsKICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB9CgogICAgW2hpZGRlbl0gewogICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICB9CgogICAgW2Zyb3plbl0gewogICAgICB6LWluZGV4OiAyOwogICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgfQoKICAgIFtuby1zY3JvbGxiYXJzXVtzYWZhcmldICN0YWJsZSwKICAgIFtuby1zY3JvbGxiYXJzXVtmaXJlZm94XSAjdGFibGUgewogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgfQoKICAgIC8qIFJlb3JkZXJpbmcgc3R5bGVzICovCiAgICA6aG9zdChbcmVvcmRlcmluZ10pIFtwYXJ0fj0nY2VsbCddIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpLAogICAgOmhvc3QoW3Jlb3JkZXJpbmddKSBbcGFydH49J3Jlc2l6ZS1oYW5kbGUnXSwKICAgICNzY3JvbGxlcltuby1jb250ZW50LXBvaW50ZXItZXZlbnRzXSBbcGFydH49J2NlbGwnXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgfQoKICAgIFtwYXJ0fj0ncmVvcmRlci1naG9zdCddIHsKICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICBvcGFjaXR5OiAwLjU7CgogICAgICAvKiBQcmV2ZW50IG92ZXJmbG93aW5nIHRoZSBncmlkIGluIEZpcmVmb3ggKi8KICAgICAgdG9wOiAwOwogICAgICBsZWZ0OiAwOwogICAgfQoKICAgIDpob3N0KFtyZW9yZGVyaW5nXSkgewogICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIH0KCiAgICAvKiBSZXNpemluZyBzdHlsZXMgKi8KICAgIFtwYXJ0fj0ncmVzaXplLWhhbmRsZSddIHsKICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB0b3A6IDA7CiAgICAgIHJpZ2h0OiAwOwogICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgei1pbmRleDogMTsKICAgIH0KCiAgICBbcGFydH49J3Jlc2l6ZS1oYW5kbGUnXTo6YmVmb3JlIHsKICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICBjb250ZW50OiAnJzsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB3aWR0aDogMzVweDsKICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgfQoKICAgIFtsYXN0LWNvbHVtbl0gW3BhcnR+PSdyZXNpemUtaGFuZGxlJ106OmJlZm9yZSwKICAgIFtsYXN0LWZyb3plbl0gW3BhcnR+PSdyZXNpemUtaGFuZGxlJ106OmJlZm9yZSB7CiAgICAgIHdpZHRoOiAxOHB4OwogICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgIHJpZ2h0OiAwOwogICAgfQoKICAgICNzY3JvbGxlcltjb2x1bW4tcmVzaXppbmddIHsKICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIH0KCiAgICAvKiBTaXplciBzdHlsZXMgKi8KICAgICNzaXplciB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgfQoKICAgICNzaXplciBbcGFydH49J2RldGFpbHMtY2VsbCddIHsKICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgfQoKICAgICNzaXplciBbcGFydH49J2NlbGwnXVtoaWRkZW5dIHsKICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgfQoKICAgICNzaXplciBbcGFydH49J2NlbGwnXSB7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICBmbGV4LXNocmluazogMDsKICAgICAgbGluZS1oZWlnaHQ6IDA7CiAgICAgIGhlaWdodDogMCAhaW1wb3J0YW50OwogICAgICBtaW4taGVpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICAgIG1heC1oZWlnaHQ6IDAgIWltcG9ydGFudDsKICAgICAgcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgIH0KCiAgICAjc2l6ZXIgW3BhcnR+PSdjZWxsJ106OmJlZm9yZSB7CiAgICAgIGNvbnRlbnQ6ICctJzsKICAgIH0KCiAgICAjc2l6ZXIgW3BhcnR+PSdjZWxsJ10gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLyogUlRMIHNwZWNpZmljIHN0eWxlcyAqLwoKICAgIDpob3N0KFtkaXI9J3J0bCddKSAjaXRlbXMsCiAgICA6aG9zdChbZGlyPSdydGwnXSkgI2hlYWRlciwKICAgIDpob3N0KFtkaXI9J3J0bCddKSAjZm9vdGVyIHsKICAgICAgbGVmdDogYXV0bzsKICAgIH0KCiAgICA6aG9zdChbZGlyPSdydGwnXSkgW3BhcnR+PSdyZW9yZGVyLWdob3N0J10gewogICAgICBsZWZ0OiBhdXRvOwogICAgICByaWdodDogMDsKICAgIH0KCiAgICA6aG9zdChbZGlyPSdydGwnXSkgW3BhcnR+PSdyZXNpemUtaGFuZGxlJ10gewogICAgICBsZWZ0OiAwOwogICAgICByaWdodDogYXV0bzsKICAgIH0KCiAgICA6aG9zdChbZGlyPSdydGwnXSkgW3BhcnR+PSdyZXNpemUtaGFuZGxlJ106OmJlZm9yZSB7CiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg1MCUpOwogICAgfQoKICAgIDpob3N0KFtkaXI9J3J0bCddKSBbbGFzdC1jb2x1bW5dIFtwYXJ0fj0ncmVzaXplLWhhbmRsZSddOjpiZWZvcmUsCiAgICA6aG9zdChbZGlyPSdydGwnXSkgW2xhc3QtZnJvemVuXSBbcGFydH49J3Jlc2l6ZS1oYW5kbGUnXTo6YmVmb3JlIHsKICAgICAgbGVmdDogMDsKICAgICAgcmlnaHQ6IGF1dG87CiAgICB9CiAgYCx7bW9kdWxlSWQ6InZhYWRpbi1ncmlkLXN0eWxlcyJ9KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi8KY29uc3QgaUt0PSgoKT0+e3RyeXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRXZlbnQoIlRvdWNoRXZlbnQiKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KSgpO2NsYXNzIHJLdCBleHRlbmRzKEUkdChjJHQoRCR0KFIkdChCJHQoTiR0KGokdChHJHQoVyR0KFUkdChRJHQoUCR0KEYkdCh0S3QoTyR0KEgkdChKJHQocSR0KEwkdCkpKSkpKSkpKSkpKSkpKSkpKSl7c3RhdGljIGdldCB0ZW1wbGF0ZSgpe3JldHVybiBfZWAKICAgICAgPGRpdgogICAgICAgIGlkPSJzY3JvbGxlciIKICAgICAgICBzYWZhcmkkPSJbW19zYWZhcmldXSIKICAgICAgICBpb3MkPSJbW19pb3NdXSIKICAgICAgICBsb2FkaW5nJD0iW1tsb2FkaW5nXV0iCiAgICAgICAgY29sdW1uLXJlb3JkZXJpbmctYWxsb3dlZCQ9IltbY29sdW1uUmVvcmRlcmluZ0FsbG93ZWRdXSIKICAgICAgPgogICAgICAgIDx0YWJsZSBpZD0idGFibGUiIHJvbGU9ImdyaWQiIGFyaWEtbXVsdGlzZWxlY3RhYmxlPSJ0cnVlIiB0YWJpbmRleD0iMCI+CiAgICAgICAgICA8Y2FwdGlvbiBpZD0ic2l6ZXIiIHBhcnQ9InJvdyI+PC9jYXB0aW9uPgogICAgICAgICAgPHRoZWFkIGlkPSJoZWFkZXIiIHJvbGU9InJvd2dyb3VwIj48L3RoZWFkPgogICAgICAgICAgPHRib2R5IGlkPSJpdGVtcyIgcm9sZT0icm93Z3JvdXAiPjwvdGJvZHk+CiAgICAgICAgICA8dGZvb3QgaWQ9ImZvb3RlciIgcm9sZT0icm93Z3JvdXAiPjwvdGZvb3Q+CiAgICAgICAgPC90YWJsZT4KCiAgICAgICAgPGRpdiBwYXJ0PSJyZW9yZGVyLWdob3N0Ij48L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGlkPSJmb2N1c2V4aXQiIHRhYmluZGV4PSIwIj48L2Rpdj4KICAgIGB9c3RhdGljIGdldCBpcygpe3JldHVybiJ2YWFkaW4tZ3JpZCJ9c3RhdGljIGdldCB2ZXJzaW9uKCl7cmV0dXJuIjIwLjAuMiJ9c3RhdGljIGdldCBvYnNlcnZlcnMoKXtyZXR1cm5bIl9jb2x1bW5UcmVlQ2hhbmdlZChfY29sdW1uVHJlZSwgX2NvbHVtblRyZWUuKikiXX1zdGF0aWMgZ2V0IHByb3BlcnRpZXMoKXtyZXR1cm57X3NhZmFyaTp7dHlwZTpCb29sZWFuLHZhbHVlOi9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl9LF9pb3M6e3R5cGU6Qm9vbGVhbix2YWx1ZTovaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmIXdpbmRvdy5NU1N0cmVhbXx8Ik1hY0ludGVsIj09PW5hdmlnYXRvci5wbGF0Zm9ybSYmbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzPjF9LF9maXJlZm94Ont0eXBlOkJvb2xlYW4sdmFsdWU6bmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImZpcmVmb3giKT4tMX0sX2FuZHJvaWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTovYW5kcm9pZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl9LF90b3VjaERldmljZTp7dHlwZTpCb29sZWFuLHZhbHVlOmlLdH0saGVpZ2h0QnlSb3dzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLG9ic2VydmVyOiJfaGVpZ2h0QnlSb3dzQ2hhbmdlZCJ9LF9yZWNhbGN1bGF0ZUNvbHVtbldpZHRoT25jZUxvYWRpbmdGaW5pc2hlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfX19Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uZW5kIix0aGlzLl9vbkFuaW1hdGlvbkVuZCl9Y29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLHRoaXMucmVjYWxjdWxhdGVDb2x1bW5XaWR0aHMoKX1hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodCxlLG4pe3N1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0LGUsbiksImRpciI9PT10JiYodGhpcy5fX2lzUlRMPSJydGwiPT09bix0aGlzLl91cGRhdGVTY3JvbGxlck1lYXN1cmVtZW50cygpKX1fX2hhc1Jvd3NXaXRoQ2xpZW50SGVpZ2h0KCl7cmV0dXJuISFBcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZmlsdGVyKCh0PT50LmNsaWVudEhlaWdodCkpLmxlbmd0aH1fX2l0ZW1zUmVjZWl2ZWQoKXt0aGlzLl9yZWNhbGN1bGF0ZUNvbHVtbldpZHRoT25jZUxvYWRpbmdGaW5pc2hlZCYmIXRoaXMuX2NhY2hlLmlzTG9hZGluZygpJiZ0aGlzLl9faGFzUm93c1dpdGhDbGllbnRIZWlnaHQoKSYmKHRoaXMuX3JlY2FsY3VsYXRlQ29sdW1uV2lkdGhPbmNlTG9hZGluZ0ZpbmlzaGVkPSExLHRoaXMucmVjYWxjdWxhdGVDb2x1bW5XaWR0aHMoKSl9X3JlY2FsY3VsYXRlQ29sdW1uV2lkdGhzKHQpe3QuZm9yRWFjaCgodD0+e3Qud2lkdGg9ImF1dG8iLHQuX29yaWdGbGV4R3Jvdz10LmZsZXhHcm93LHQuZmxleEdyb3c9MH0pKSx0LmZvckVhY2goKHQ9Pnt0Ll9jdXJyZW50V2lkdGg9MCx0Ll9hbGxDZWxscy5mb3JFYWNoKChlPT57dC5fY3VycmVudFdpZHRoPU1hdGgubWF4KHQuX2N1cnJlbnRXaWR0aCxlLm9mZnNldFdpZHRoKzEpfSkpfSkpLHQuZm9yRWFjaCgodD0+e3Qud2lkdGg9YCR7dC5fY3VycmVudFdpZHRofXB4YCx0LmZsZXhHcm93PXQuX29yaWdGbGV4R3Jvdyx0Ll9jdXJyZW50V2lkdGg9dm9pZCAwLHQuX29yaWdGbGV4R3Jvdz12b2lkIDB9KSl9cmVjYWxjdWxhdGVDb2x1bW5XaWR0aHMoKXtpZih0aGlzLl9jb2x1bW5UcmVlKWlmKHRoaXMuX2NhY2hlLmlzTG9hZGluZygpKXRoaXMuX3JlY2FsY3VsYXRlQ29sdW1uV2lkdGhPbmNlTG9hZGluZ0ZpbmlzaGVkPSEwO2Vsc2V7Y29uc3QgdD10aGlzLl9nZXRDb2x1bW5zKCkuZmlsdGVyKCh0PT4hdC5oaWRkZW4mJnQuYXV0b1dpZHRoKSk7dGhpcy5fcmVjYWxjdWxhdGVDb2x1bW5XaWR0aHModCl9fV9jcmVhdGVTY3JvbGxlclJvd3ModCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPHQ7bisrKXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7dC5zZXRBdHRyaWJ1dGUoInBhcnQiLCJyb3ciKSx0LnNldEF0dHJpYnV0ZSgicm9sZSIsInJvdyIpLHRoaXMuX2NvbHVtblRyZWUmJnRoaXMuX3VwZGF0ZVJvdyh0LHRoaXMuX2NvbHVtblRyZWVbdGhpcy5fY29sdW1uVHJlZS5sZW5ndGgtMV0sImJvZHkiLCExLCEwKSxlLnB1c2godCl9cmV0dXJuIHRoaXMuX2NvbHVtblRyZWUmJnRoaXMuX2NvbHVtblRyZWVbdGhpcy5fY29sdW1uVHJlZS5sZW5ndGgtMV0uZm9yRWFjaCgodD0+dC5pc0Nvbm5lY3RlZCYmdC5ub3RpZnlQYXRoJiZ0Lm5vdGlmeVBhdGgoIl9jZWxscy4qIix0Ll9jZWxscykpKSwoZnVuY3Rpb24gbih0LGUsaSl7RWl8fEFpKCksVGkucHVzaChbdCxlLGldKX0pKHRoaXMsKCgpPT57dGhpcy5fdXBkYXRlRmlyc3RBbmRMYXN0Q29sdW1uKCksdGhpcy5fcmVzZXRLZXlib2FyZE5hdmlnYXRpb24oKX0pKSxlfV9nZXRSb3dUYXJnZXQoKXtyZXR1cm4gdGhpcy4kLml0ZW1zfV9jcmVhdGVDZWxsKHQpe2NvbnN0IGU9InZhYWRpbi1ncmlkLWNlbGwtY29udGVudC0iKyh0aGlzLl9jb250ZW50SW5kZXg9dGhpcy5fY29udGVudEluZGV4KzF8fDApLG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtY2VsbC1jb250ZW50Iik7bi5zZXRBdHRyaWJ1dGUoInNsb3QiLGUpO2NvbnN0IGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0KTtpLmlkPWUucmVwbGFjZSgiLWNvbnRlbnQtIiwiLSIpLGkuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIi0xIiksaS5zZXRBdHRyaWJ1dGUoInJvbGUiLCJ0ZCI9PT10PyJncmlkY2VsbCI6ImNvbHVtbmhlYWRlciIpO2NvbnN0IHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2xvdCIpO3JldHVybiByLnNldEF0dHJpYnV0ZSgibmFtZSIsZSksaS5hcHBlbmRDaGlsZChyKSxpLl9jb250ZW50PW4sbi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLCgoKT0+e2lmKHdpbmRvdy5jaHJvbWUpe2NvbnN0IHQ9KCk9PntuLmNvbnRhaW5zKHRoaXMuZ2V0Um9vdE5vZGUoKS5hY3RpdmVFbGVtZW50KXx8aS5mb2N1cygpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHQsITApfTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0LCEwKX1lbHNlIHNldFRpbWVvdXQoKCgpPT57bi5jb250YWlucyh0aGlzLmdldFJvb3ROb2RlKCkuYWN0aXZlRWxlbWVudCl8fGkuZm9jdXMoKX0pKX0pKSxpfV91cGRhdGVSb3codCxlLG4saSxyKXtuPW58fCJib2R5Ijtjb25zdCBvPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtBcnJheS5mcm9tKHQuY2hpbGRyZW4pLmZvckVhY2goKHQ9PnQuX3ZhY2FudD0hMCkpLHQuaW5uZXJIVE1MPSIiLCJzaXplciIhPT10LmlkJiYodC5oaWRkZW49ITApLGUuZmlsdGVyKCh0PT4hdC5oaWRkZW4pKS5mb3JFYWNoKCgoZSxhLHMpPT57bGV0IGw7aWYoImJvZHkiPT09bil7aWYoZS5fY2VsbHM9ZS5fY2VsbHN8fFtdLGw9ZS5fY2VsbHMuZmlsdGVyKCh0PT50Ll92YWNhbnQpKVswXSxsfHwobD10aGlzLl9jcmVhdGVDZWxsKCJ0ZCIpLGUuX2NlbGxzLnB1c2gobCkpLGwuc2V0QXR0cmlidXRlKCJwYXJ0IiwiY2VsbCBib2R5LWNlbGwiKSx0LmFwcGVuZENoaWxkKGwpLGE9PT1zLmxlbmd0aC0xJiYodGhpcy5fcm93RGV0YWlsc1RlbXBsYXRlfHx0aGlzLnJvd0RldGFpbHNSZW5kZXJlcikpe3RoaXMuX2RldGFpbHNDZWxscz10aGlzLl9kZXRhaWxzQ2VsbHN8fFtdO2NvbnN0IGU9dGhpcy5fZGV0YWlsc0NlbGxzLmZpbHRlcigodD0+dC5fdmFjYW50KSlbMF18fHRoaXMuX2NyZWF0ZUNlbGwoInRkIik7LTE9PT10aGlzLl9kZXRhaWxzQ2VsbHMuaW5kZXhPZihlKSYmdGhpcy5fZGV0YWlsc0NlbGxzLnB1c2goZSksZS5fY29udGVudC5wYXJlbnRFbGVtZW50fHxvLmFwcGVuZENoaWxkKGUuX2NvbnRlbnQpLHRoaXMuX2NvbmZpZ3VyZURldGFpbHNDZWxsKGUpLHQuYXBwZW5kQ2hpbGQoZSksdGhpcy5fYTExeVNldFJvd0RldGFpbHNDZWxsKHQsZSksZS5fdmFjYW50PSExfWUubm90aWZ5UGF0aCYmIXImJmUubm90aWZ5UGF0aCgiX2NlbGxzLioiLGUuX2NlbGxzKX1lbHNle2NvbnN0IHI9ImhlYWRlciI9PT1uPyJ0aCI6InRkIjtpfHwidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWUubG9jYWxOYW1lPyhsPWVbYF8ke259Q2VsbGBdfHx0aGlzLl9jcmVhdGVDZWxsKHIpLGwuX2NvbHVtbj1lLHQuYXBwZW5kQ2hpbGQobCksZVtgXyR7bn1DZWxsYF09bCk6KGUuX2VtcHR5Q2VsbHM9ZS5fZW1wdHlDZWxsc3x8W10sbD1lLl9lbXB0eUNlbGxzLmZpbHRlcigodD0+dC5fdmFjYW50KSlbMF18fHRoaXMuX2NyZWF0ZUNlbGwociksbC5fY29sdW1uPWUsdC5hcHBlbmRDaGlsZChsKSwtMT09PWUuX2VtcHR5Q2VsbHMuaW5kZXhPZihsKSYmZS5fZW1wdHlDZWxscy5wdXNoKGwpKSxsLnNldEF0dHJpYnV0ZSgicGFydCIsYGNlbGwgJHtufS1jZWxsYCksdGhpcy5fX3VwZGF0ZUhlYWRlckZvb3RlclJvd1Zpc2liaWxpdHkodCl9bC5fY29udGVudC5wYXJlbnRFbGVtZW50fHxvLmFwcGVuZENoaWxkKGwuX2NvbnRlbnQpLGwuX3ZhY2FudD0hMSxsLl9jb2x1bW49ZX0pKSx0aGlzLmFwcGVuZENoaWxkKG8pLHRoaXMuX2Zyb3plbkNlbGxzQ2hhbmdlZCgpLHRoaXMuX3VwZGF0ZUZpcnN0QW5kTGFzdENvbHVtbkZvclJvdyh0KX1fX3VwZGF0ZUhlYWRlckZvb3RlclJvd1Zpc2liaWxpdHkodCl7aWYoIXQpcmV0dXJuO2NvbnN0IGU9QXJyYXkuZnJvbSh0LmNoaWxkcmVuKS5maWx0ZXIoKGU9Pntjb25zdCBuPWUuX2NvbHVtbjtpZihuLl9lbXB0eUNlbGxzJiZuLl9lbXB0eUNlbGxzLmluZGV4T2YoZSk+LTEpcmV0dXJuITE7aWYodC5wYXJlbnRFbGVtZW50PT09dGhpcy4kLmhlYWRlcil7aWYobi5oZWFkZXJSZW5kZXJlcnx8bi5faGVhZGVyVGVtcGxhdGUpcmV0dXJuITA7aWYobnVsbD09PW4uaGVhZGVyKXJldHVybiExO2lmKG4ucGF0aHx8dm9pZCAwIT09bi5oZWFkZXIpcmV0dXJuITB9ZWxzZSBpZihuLmZvb3RlclJlbmRlcmVyfHxuLl9mb290ZXJUZW1wbGF0ZSlyZXR1cm4hMH0pKTt0LmhpZGRlbiE9PSFlLmxlbmd0aCYmKHQuaGlkZGVuPSFlLmxlbmd0aCx0aGlzLm5vdGlmeVJlc2l6ZSgpKX1fdXBkYXRlU2Nyb2xsZXJJdGVtKHQsZSl7dGhpcy5fcHJldmVudFNjcm9sbGVyUm90YXRpbmdDZWxsRm9jdXModCxlKSx0aGlzLl9jb2x1bW5UcmVlJiYodGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJmaXJzdCIsMD09PWUsdCksdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJvZGQiLGUlMix0KSx0aGlzLl9hMTF5VXBkYXRlUm93Um93aW5kZXgodCxlKSx0aGlzLl9nZXRJdGVtKGUsdCkpfV9jb2x1bW5UcmVlQ2hhbmdlZCh0KXt0aGlzLl9yZW5kZXJDb2x1bW5UcmVlKHQpLHRoaXMucmVjYWxjdWxhdGVDb2x1bW5XaWR0aHMoKX1fcmVuZGVyQ29sdW1uVHJlZSh0KXtmb3IoQXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pLmZvckVhY2goKGU9PnRoaXMuX3VwZGF0ZVJvdyhlLHRbdC5sZW5ndGgtMV0sbnVsbCwhMSwhMCkpKTt0aGlzLiQuaGVhZGVyLmNoaWxkcmVuLmxlbmd0aDx0Lmxlbmd0aDspe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTt0LnNldEF0dHJpYnV0ZSgicGFydCIsInJvdyIpLHQuc2V0QXR0cmlidXRlKCJyb2xlIiwicm93IiksdGhpcy4kLmhlYWRlci5hcHBlbmRDaGlsZCh0KTtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7ZS5zZXRBdHRyaWJ1dGUoInBhcnQiLCJyb3ciKSxlLnNldEF0dHJpYnV0ZSgicm9sZSIsInJvdyIpLHRoaXMuJC5mb290ZXIuYXBwZW5kQ2hpbGQoZSl9Zm9yKDt0aGlzLiQuaGVhZGVyLmNoaWxkcmVuLmxlbmd0aD50Lmxlbmd0aDspdGhpcy4kLmhlYWRlci5yZW1vdmVDaGlsZCh0aGlzLiQuaGVhZGVyLmZpcnN0RWxlbWVudENoaWxkKSx0aGlzLiQuZm9vdGVyLnJlbW92ZUNoaWxkKHRoaXMuJC5mb290ZXIuZmlyc3RFbGVtZW50Q2hpbGQpO0FycmF5LmZyb20odGhpcy4kLmhlYWRlci5jaGlsZHJlbikuZm9yRWFjaCgoKGUsbik9PnRoaXMuX3VwZGF0ZVJvdyhlLHRbbl0sImhlYWRlciIsbj09PXQubGVuZ3RoLTEpKSksQXJyYXkuZnJvbSh0aGlzLiQuZm9vdGVyLmNoaWxkcmVuKS5mb3JFYWNoKCgoZSxuKT0+dGhpcy5fdXBkYXRlUm93KGUsdFt0Lmxlbmd0aC0xLW5dLCJmb290ZXIiLDA9PT1uKSkpLHRoaXMuX3VwZGF0ZVJvdyh0aGlzLiQuc2l6ZXIsdFt0Lmxlbmd0aC0xXSksdGhpcy5fcmVzaXplSGFuZGxlcigpLHRoaXMuX2Zyb3plbkNlbGxzQ2hhbmdlZCgpLHRoaXMuX3VwZGF0ZUZpcnN0QW5kTGFzdENvbHVtbigpLHRoaXMuX3Jlc2V0S2V5Ym9hcmROYXZpZ2F0aW9uKCksdGhpcy5fYTExeVVwZGF0ZUhlYWRlclJvd3MoKSx0aGlzLl9hMTF5VXBkYXRlRm9vdGVyUm93cygpLHRoaXMuX191cGRhdGVGb290ZXJQb3NpdGlvbmluZygpfV9fdXBkYXRlRm9vdGVyUG9zaXRpb25pbmcoKXt0aGlzLl9maXJlZm94JiYodGhpcy4kLml0ZW1zLnN0eWxlLnBhZGRpbmdCb3R0b209MCx0aGlzLmhlaWdodEJ5Um93c3x8KHRoaXMuJC5pdGVtcy5zdHlsZS5wYWRkaW5nQm90dG9tPWAke3RoaXMuJC5mb290ZXIub2Zmc2V0SGVpZ2h0fXB4YCkpLHRoaXMuX2lvcyYmIXdpbmRvdy5DU1Muc3VwcG9ydHMoInBvc2l0aW9uIiwic3RpY2t5IikmJih0aGlzLiQudGFibGUuc3R5bGUuaGVpZ2h0PSIiLHRoaXMuJC50YWJsZS5zdHlsZS5taW5IZWlnaHQ9IjEwMCUiLHRoaXMuJC50YWJsZS5zdHlsZS5tYXhIZWlnaHQ9IjEwMCUiLHNldFRpbWVvdXQoKCgpPT50aGlzLiQudGFibGUuc3R5bGUuaGVpZ2h0PWAke3RoaXMuJC5zY3JvbGxlci5vZmZzZXRIZWlnaHR9cHhgKSkpfV91cGRhdGVJdGVtKHQsZSl7dC5faXRlbT1lO2NvbnN0IG49dGhpcy5fX2dldFJvd01vZGVsKHQpO3RoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgic2VsZWN0ZWQiLG4uc2VsZWN0ZWQsdCksdGhpcy5fYTExeVVwZGF0ZVJvd1NlbGVjdGVkKHQsbi5zZWxlY3RlZCksdGhpcy5fYTExeVVwZGF0ZVJvd0xldmVsKHQsbi5sZXZlbCksdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJleHBhbmRlZCIsbi5leHBhbmRlZCx0KSx0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImRldGFpbHMtb3BlbmVkIix0aGlzLl9pc0RldGFpbHNPcGVuZWQoZSksdCksKHRoaXMuX3Jvd0RldGFpbHNUZW1wbGF0ZXx8dGhpcy5yb3dEZXRhaWxzUmVuZGVyZXIpJiZ0aGlzLl90b2dnbGVEZXRhaWxzQ2VsbCh0LGUpLHRoaXMuX2dlbmVyYXRlQ2VsbENsYXNzTmFtZXModCxuKSx0aGlzLl9maWx0ZXJEcmFnQW5kRHJvcCh0LG4pLEFycmF5LmZyb20odC5jaGlsZHJlbikuZm9yRWFjaCgodD0+e2lmKHQuX3JlbmRlcmVyKXtjb25zdCBlPXQuX2NvbHVtbnx8dGhpczt0Ll9yZW5kZXJlci5jYWxsKGUsdC5fY29udGVudCxlLG4pfWVsc2UgdC5faW5zdGFuY2UmJih0Ll9pbnN0YW5jZS5fX2RldGFpbHNPcGVuZWRfXz1uLmRldGFpbHNPcGVuZWQsdC5faW5zdGFuY2UuX19zZWxlY3RlZF9fPW4uc2VsZWN0ZWQsdC5faW5zdGFuY2UuX19sZXZlbF9fPW4ubGV2ZWwsdC5faW5zdGFuY2UuX19leHBhbmRlZF9fPW4uZXhwYW5kZWQsdC5faW5zdGFuY2Uuc2V0UHJvcGVydGllcyhuKSl9KSksdGhpcy5fZGVib3VuY2VyVXBkYXRlSGVpZ2h0cz1Ubi5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZXJVcGRhdGVIZWlnaHRzLGd0LmFmdGVyKDEpLCgoKT0+e3RoaXMuX3VwZGF0ZU1ldHJpY3MoKSx0aGlzLl9wb3NpdGlvbkl0ZW1zKCksdGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCl9KSl9X3Jlc2l6ZUhhbmRsZXIoKXt0aGlzLl91cGRhdGVEZXRhaWxzQ2VsbEhlaWdodHMoKSx0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSShzdXBlci5fcmVzaXplSGFuZGxlciwhMCksdGhpcy5fdXBkYXRlU2Nyb2xsZXJNZWFzdXJlbWVudHMoKSx0aGlzLl9fdXBkYXRlRm9vdGVyUG9zaXRpb25pbmcoKX1fb25BbmltYXRpb25FbmQodCl7MD09PXQuYW5pbWF0aW9uTmFtZS5pbmRleE9mKCJ2YWFkaW4tZ3JpZC1hcHBlYXIiKSYmKHRoaXMuX3JlbmRlcigpLHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5ub3RpZnlSZXNpemUoKSx0aGlzLl9faXRlbXNSZWNlaXZlZCgpLHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKCk9Pnt0aGlzLl9fc2Nyb2xsVG9QZW5kaW5nSW5kZXgoKSx0aGlzLiQudGFibGUuc3R5bGUud2Via2l0T3ZlcmZsb3dTY3JvbGxpbmc9InRvdWNoIn0pKSl9X3RvZ2dsZUF0dHJpYnV0ZSh0LGUsbil7bi5oYXNBdHRyaWJ1dGUodCk9PT0hZSYmKGU/bi5zZXRBdHRyaWJ1dGUodCwiIik6bi5yZW1vdmVBdHRyaWJ1dGUodCkpfV9fZ2V0Um93TW9kZWwodCl7cmV0dXJue2luZGV4OnQuaW5kZXgsaXRlbTp0Ll9pdGVtLGxldmVsOnRoaXMuX2dldEluZGV4TGV2ZWwodC5pbmRleCksZXhwYW5kZWQ6dGhpcy5faXNFeHBhbmRlZCh0Ll9pdGVtKSxzZWxlY3RlZDp0aGlzLl9pc1NlbGVjdGVkKHQuX2l0ZW0pLGRldGFpbHNPcGVuZWQ6ISghdGhpcy5fcm93RGV0YWlsc1RlbXBsYXRlJiYhdGhpcy5yb3dEZXRhaWxzUmVuZGVyZXIpJiZ0aGlzLl9pc0RldGFpbHNPcGVuZWQodC5faXRlbSl9fXJlbmRlcigpe3RoaXMuX2NvbHVtblRyZWUmJih0aGlzLl9jb2x1bW5UcmVlLmZvckVhY2goKHQ9Pnt0LmZvckVhY2goKHQ9PnQuX3JlbmRlckhlYWRlckFuZEZvb3RlcigpKSl9KSksdGhpcy5fdXBkYXRlKCkpfW5vdGlmeVJlc2l6ZSgpe3N1cGVyLm5vdGlmeVJlc2l6ZSgpfV9oZWlnaHRCeVJvd3NDaGFuZ2VkKHQsZSl7KHR8fGUpJiZ0aGlzLm5vdGlmeVJlc2l6ZSgpfV9fZm9yY2VSZWZsb3coKXt0aGlzLl9kZWJvdW5jZXJGb3JjZVJlZmxvdz1Ubi5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZXJGb3JjZVJlZmxvdyxfdCwoKCk9Pnt0aGlzLiQuc2Nyb2xsZXIuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsc2V0VGltZW91dCgoKCk9PnRoaXMuJC5zY3JvbGxlci5zdHlsZS5vdmVyZmxvdz0iIikpfSkpfX1jdXN0b21FbGVtZW50cy5kZWZpbmUockt0LmlzLHJLdCk7bGV0IG9LdD1jbGFzcyBleHRlbmRzIHlle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9ydW49IiJ9X2NzdlVybCh0LGUsbil7cmV0dXJuIGU/aU8obih0LGUpLHtmb3JtYXQ6ImNzdiJ9KToiIn1fanNvblVybCh0LGUsbil7cmV0dXJuIGU/bih0LGUpOiIifV9jc3ZOYW1lKHQsZSl7cmV0dXJuIGU/YHJ1bi0ke2V9LXRhZy0ke3R9LmNzdmA6IiJ9X2pzb25OYW1lKHQsZSl7cmV0dXJuIGU/YHJ1bi0ke2V9LXRhZy0ke3R9Lmpzb25gOiIifX07b0t0LnRlbXBsYXRlPV9lYAogICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUKICAgICAgbm8tbGFiZWwtZmxvYXQ9InRydWUiCiAgICAgIGxhYmVsPSJydW4gdG8gZG93bmxvYWQiCiAgICAgIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X3J1bn19IgogICAgPgogICAgICA8cGFwZXItbGlzdGJveCBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW3J1bnNdXSI+CiAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+W1tpdGVtXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19ydW5dXSI+CiAgICAgIDxhIGRvd25sb2FkPSJbW19jc3ZOYW1lKHRhZywgX3J1bildXSIgaHJlZj0iW1tfY3N2VXJsKHRhZywgX3J1biwgdXJsRm4pXV0iCiAgICAgICAgPkNTVjwvYQogICAgICA+PCEtLQogICAgICAtLT48YQogICAgICAgIGRvd25sb2FkPSJbW19qc29uTmFtZSh0YWcsIF9ydW4pXV0iCiAgICAgICAgaHJlZj0iW1tfanNvblVybCh0YWcsIF9ydW4sIHVybEZuKV1dIgogICAgICAgID5KU09OPC9hCiAgICAgID4KICAgIDwvdGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICB9CiAgICAgIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgfQogICAgICBhIHsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbWFyZ2luOiAwIDAuMmVtOwogICAgICB9CiAgICAgIHBhcGVyLWlucHV0IHsKICAgICAgICBmb250LXNpemU6IDIycHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxvS3QucHJvdG90eXBlLCJfcnVuIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxvS3QucHJvdG90eXBlLCJydW5zIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLG9LdC5wcm90b3R5cGUsInRhZyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxvS3QucHJvdG90eXBlLCJ1cmxGbiIsdm9pZCAwKSxvS3Q9dChbaSgidGYtZG93bmxvYWRlciIpXSxvS3QpLG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7bGV0IGFLdD1jbGFzcyBleHRlbmRzIHlle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvbG9yU2NhbGU9bnVsbCx0aGlzLl9sb2FkRGF0YUNhbGxiYWNrPSh0LGUsbik9PntpZihudWxsPT1uKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBsb2FkIGRhdGEgZm9yOiIsZSk7Y29uc3QgaT1uLm1hcCgodD0+KHt3YWxsX3RpbWU6bmV3IERhdGUoMWUzKnRbMF0pLHN0ZXA6dFsxXSxzY2FsYXI6dFsyXX0pKSkscj10aGlzLl9nZXRTZXJpZXNOYW1lRnJvbURhdHVtKGUpO3Quc2V0U2VyaWVzTWV0YWRhdGEocixlKSx0LnNldFNlcmllc0RhdGEocixpKX0sdGhpcy5nZXREYXRhTG9hZFVybD0oe3RhZzp0LHJ1bjplfSk9Pl9yKCkucGx1Z2luUm91dGUoInNjYWxhcnMiLCIvc2NhbGFycyIsbmV3IFVSTFNlYXJjaFBhcmFtcyh7dGFnOnQscnVuOmV9KSksdGhpcy5fZG93bmxvYWRVcmxGbj0odCxlKT0+dGhpcy5nZXREYXRhTG9hZFVybCh7dGFnOnQscnVuOmV9KSx0aGlzLnJlcXVlc3REYXRhPSh0LGUsbik9PnRoaXMuaW5Db2xhYj90aGlzLl9yZXF1ZXN0RGF0YUdldCh0LGUsbik6dGhpcy5fcmVxdWVzdERhdGFQb3N0KHQsZSxuKSx0aGlzLl9yZXF1ZXN0RGF0YUdldD0odCxlLG4pPT57Y29uc3QgaT1fcigpLnBsdWdpblJvdXRlKCJzY2FsYXJzIiwiL3NjYWxhcnMiKTtQcm9taXNlLmFsbCh0Lm1hcCgodD0+e2NvbnN0IG49aU8oaSx7dGFnOnQudGFnLHJ1bjp0LnJ1bn0pO3JldHVybiB0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QobikudGhlbigobj0+e2Uoe2l0ZW06dCxkYXRhOm59KX0pKX0pKSkuZmluYWxseSgoKCk9PntuKCl9KSl9LHRoaXMuX3JlcXVlc3REYXRhUG9zdD0odCxlLG4pPT57dmFyIGk7Y29uc3Qgcj1fcigpLnBsdWdpblJvdXRlKCJzY2FsYXJzIiwiL3NjYWxhcnNfbXVsdGlydW4iKSxvPW5ldyBNYXA7Zm9yKGNvbnN0e3RhZzplLHJ1bjpufW9mIHQpe2xldCB0PW8uZ2V0KGUpO251bGw9PXQmJm8uc2V0KGUsdD1bXSksdC5wdXNoKG4pfWNvbnN0IGE9bnVsbCE9PShpPXRoaXMuYmF0Y2hTaXplKSYmdm9pZCAwIT09aT9pOjY0LHM9W107Zm9yKGNvbnN0W3QsZV1vZiBvKWZvcihsZXQgbj0wO248ZS5sZW5ndGg7bis9YSlzLnB1c2goe3RhZzp0LHJ1bnM6ZS5zbGljZShuLG4rYSl9KTtQcm9taXNlLmFsbChzLm1hcCgoKHt0YWc6dCxydW5zOm59KT0+dGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHIse3RhZzp0LHJ1bnM6bn0pLnRoZW4oKGk9Pntmb3IoY29uc3QgciBvZiBuKXtjb25zdCBuPXt0YWc6dCxydW46cn07T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGkscik/ZSh7aXRlbTpuLGRhdGE6aVtyXX0pOmUoe2l0ZW06bixkYXRhOm51bGx9KX19KSkpKSkuZmluYWxseSgoKCk9PntuKCl9KSl9LHRoaXMuX2dldERhdGFMb2FkTmFtZT10PT50aGlzLl9nZXRTZXJpZXNOYW1lRnJvbURhdHVtKHQpLHRoaXMuX2V4cGFuZGVkPSExLHRoaXMuX3Rvb2x0aXBDb2x1bW5zPSgoKT0+e2NvbnN0IHQ9cEN0LnNsaWNlKCksZT10LmZpbmRJbmRleCgodD0+Ik5hbWUiPT10LnRpdGxlKSk7cmV0dXJuIHQuc3BsaWNlKGUsMSx7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOnQ9Pntjb25zdCBlPXQuZGF0YXNldC5tZXRhZGF0YSgpLm1ldGE7cmV0dXJuIHRoaXMuX2dldFNlcmllc0Rpc3BsYXlOYW1lRnJvbURhdHVtKGUpfX0pLHR9KSgpfV9nZXRDaGFydERhdGFMb2FkZXIoKXtyZXR1cm4gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKX1yZWxvYWQoKXt0aGlzLl9nZXRDaGFydERhdGFMb2FkZXIoKS5yZWxvYWQoKX1yZWRyYXcoKXt0aGlzLl9nZXRDaGFydERhdGFMb2FkZXIoKS5yZWRyYXcoKX1fdG9nZ2xlRXhwYW5kZWQodCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKSx0aGlzLnJlZHJhdygpfV90b2dnbGVMb2dTY2FsZSgpe3RoaXMuc2V0KCJfbG9nU2NhbGVBY3RpdmUiLCF0aGlzLl9sb2dTY2FsZUFjdGl2ZSl9X3Jlc2V0RG9tYWluKCl7Y29uc3QgdD10aGlzLl9nZXRDaGFydERhdGFMb2FkZXIoKTt0JiZ0LnJlc2V0RG9tYWluKCl9X3VwZGF0ZURvd25sb2FkTGluaygpe2NvbnN0IHQ9dGhpcy5fZ2V0Q2hhcnREYXRhTG9hZGVyKCkuZXhwb3J0QXNTdmdTdHJpbmcoKTt0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiI3N2Z0xpbmsiKS5ocmVmPWBkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCR7YnRvYSh0KX1gfV9ydW5zRnJvbURhdGEodCl7cmV0dXJuIHQubWFwKCh0PT50LnJ1bikpfV9nZXREYXRhU2VyaWVzKCl7cmV0dXJuIHRoaXMuZGF0YVRvTG9hZC5tYXAoKHQ9PnRoaXMuX2dldFNlcmllc05hbWVGcm9tRGF0dW0odCkpKX1fZ2V0U2VyaWVzTmFtZUZyb21EYXR1bSh7cnVuOnQsZXhwZXJpbWVudDplPXtuYW1lOiJfZGVmYXVsdCJ9fSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KFtlLm5hbWUsdF0pfV9nZXRTZXJpZXNEaXNwbGF5TmFtZUZyb21EYXR1bSh0KXtyZXR1cm4gdC5ydW59X2dldENvbG9yU2NhbGUoKXtyZXR1cm4gbnVsbCE9PXRoaXMuY29sb3JTY2FsZT90aGlzLmNvbG9yU2NhbGU6e3NjYWxlOnQ9Pntjb25zdFssZV09SlNPTi5wYXJzZSh0KTtyZXR1cm4gR1IoZSl9fX19O2FLdC50ZW1wbGF0ZT1fZWAKICAgIDx0Zi1jYXJkLWhlYWRpbmcKICAgICAgdGFnPSJbW3RhZ11dIgogICAgICBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIKICAgICAgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSIKICAgID48L3RmLWNhcmQtaGVhZGluZz4KICAgIDxkaXYgaWQ9InRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIj4KICAgICAgPHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIKICAgICAgICBhY3RpdmU9IltbYWN0aXZlXV0iCiAgICAgICAgY29sb3Itc2NhbGU9IltbX2dldENvbG9yU2NhbGUoY29sb3JTY2FsZSldXSIKICAgICAgICBkYXRhLXNlcmllcz0iW1tfZ2V0RGF0YVNlcmllcyhkYXRhVG9Mb2FkLiopXV0iCiAgICAgICAgZGF0YS10by1sb2FkPSJbW2RhdGFUb0xvYWRdXSIKICAgICAgICBnZXQtZGF0YS1sb2FkLW5hbWU9IltbX2dldERhdGFMb2FkTmFtZV1dIgogICAgICAgIGdldC1kYXRhLWxvYWQtdXJsPSJbW2dldERhdGFMb2FkVXJsXV0iCiAgICAgICAgcmVxdWVzdC1kYXRhPSJbW3JlcXVlc3REYXRhXV0iCiAgICAgICAgaWdub3JlLXktb3V0bGllcnM9IltbaWdub3JlWU91dGxpZXJzXV0iCiAgICAgICAgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19sb2FkRGF0YUNhbGxiYWNrXV0iCiAgICAgICAgbG9hZC1rZXk9IltbdGFnXV0iCiAgICAgICAgbG9nLXNjYWxlLWFjdGl2ZT0iW1tfbG9nU2NhbGVBY3RpdmVdXSIKICAgICAgICByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgICBzbW9vdGhpbmctZW5hYmxlZD0iW1tzbW9vdGhpbmdFbmFibGVkXV0iCiAgICAgICAgc21vb3RoaW5nLXdlaWdodD0iW1tzbW9vdGhpbmdXZWlnaHRdXSIKICAgICAgICB0YWctbWV0YWRhdGE9IltbdGFnTWV0YWRhdGFdXSIKICAgICAgICB0b29sdGlwLWNvbHVtbnM9IltbX3Rvb2x0aXBDb2x1bW5zXV0iCiAgICAgICAgdG9vbHRpcC1wb3NpdGlvbj0iYXV0byIKICAgICAgICB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iCiAgICAgICAgeC10eXBlPSJbW3hUeXBlXV0iCiAgICAgID4KICAgICAgPC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJidXR0b25zIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIgogICAgICAgIGljb249ImZ1bGxzY3JlZW4iCiAgICAgICAgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiCiAgICAgID48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICBzZWxlY3RlZCQ9IltbX2xvZ1NjYWxlQWN0aXZlXV0iCiAgICAgICAgaWNvbj0ibGluZS13ZWlnaHQiCiAgICAgICAgb24tdGFwPSJfdG9nZ2xlTG9nU2NhbGUiCiAgICAgICAgdGl0bGU9IlRvZ2dsZSB5LWF4aXMgbG9nIHNjYWxlIgogICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgaWNvbj0ic2V0dGluZ3Mtb3ZlcnNjYW4iCiAgICAgICAgb24tdGFwPSJfcmVzZXREb21haW4iCiAgICAgICAgdGl0bGU9IkZpdCBkb21haW4gdG8gZGF0YSIKICAgICAgPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93RG93bmxvYWRMaW5rc11dIj4KICAgICAgICA8cGFwZXItbWVudS1idXR0b24gb24tcGFwZXItZHJvcGRvd24tb3Blbj0iX3VwZGF0ZURvd25sb2FkTGluayI+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICAgICAgY2xhc3M9ImRyb3Bkb3duLXRyaWdnZXIiCiAgICAgICAgICAgIHNsb3Q9ImRyb3Bkb3duLXRyaWdnZXIiCiAgICAgICAgICAgIGljb249ImZpbGUtZG93bmxvYWQiCiAgICAgICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPGEgaWQ9InN2Z0xpbmsiIGRvd25sb2FkPSJbW3RhZ11dLnN2ZyI+CiAgICAgICAgICAgICAgICBEb3dubG9hZCBDdXJyZW50IENoYXJ0IGFzIFNWRwogICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgPC9wYXBlci1pdGVtPgogICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgIDwvcGFwZXItbWVudS1idXR0b24+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxzcGFuIHN0eWxlPSJmbGV4LWdyb3c6IDEiPjwvc3Bhbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dEb3dubG9hZExpbmtzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImRvd25sb2FkLWxpbmtzIj4KICAgICAgICAgIDx0Zi1kb3dubG9hZGVyCiAgICAgICAgICAgIHJ1bnM9IltbX3J1bnNGcm9tRGF0YShkYXRhVG9Mb2FkKV1dIgogICAgICAgICAgICB0YWc9IltbdGFnXV0iCiAgICAgICAgICAgIHVybC1mbj0iW1tfZG93bmxvYWRVcmxGbl1dIgogICAgICAgICAgPjwvdGYtZG93bmxvYWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgbWFyZ2luOiA1cHg7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDMzMHB4OwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgI3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICB9CgogICAgICAjdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjAwcHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHRmLWNhcmQtaGVhZGluZyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgfQoKICAgICAgI2J1dHRvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgYSB7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBtYXJnaW46IDJweDsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgfQoKICAgICAgcGFwZXItbWVudS1idXR0b24gewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KICAgICAgcGFwZXItaXRlbSBhIHsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGFLdC5wcm90b3R5cGUsInRhZyIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sYUt0LnByb3RvdHlwZSwiZGF0YVRvTG9hZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxhS3QucHJvdG90eXBlLCJ4VHlwZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGFLdC5wcm90b3R5cGUsImFjdGl2ZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGFLdC5wcm90b3R5cGUsImlnbm9yZVlPdXRsaWVycyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixkcildLGFLdC5wcm90b3R5cGUsInJlcXVlc3RNYW5hZ2VyIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sYUt0LnByb3RvdHlwZSwic2hvd0Rvd25MaW5rcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGFLdC5wcm90b3R5cGUsInNtb290aGluZ0VuYWJsZWQiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sYUt0LnByb3RvdHlwZSwic21vb3RoaW5nV2VpZ2h0Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGFLdC5wcm90b3R5cGUsInRhZ01ldGFkYXRhIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGFLdC5wcm90b3R5cGUsImNvbG9yU2NhbGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sYUt0LnByb3RvdHlwZSwidG9vbHRpcFNvcnRpbmdNZXRob2QiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sYUt0LnByb3RvdHlwZSwiYmF0Y2hTaXplIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxhS3QucHJvdG90eXBlLCJpbkNvbGFiIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGFLdC5wcm90b3R5cGUsIl9sb2FkRGF0YUNhbGxiYWNrIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKV0sYUt0LnByb3RvdHlwZSwiZ2V0RGF0YUxvYWRVcmwiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sYUt0LnByb3RvdHlwZSwiX2Rvd25sb2FkVXJsRm4iLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pXSxhS3QucHJvdG90eXBlLCJyZXF1ZXN0RGF0YSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxhS3QucHJvdG90eXBlLCJfZ2V0RGF0YUxvYWROYW1lIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGFLdC5wcm90b3R5cGUsIl9leHBhbmRlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGFLdC5wcm90b3R5cGUsIl9sb2dTY2FsZUFjdGl2ZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sYUt0LnByb3RvdHlwZSwiX3Rvb2x0aXBDb2x1bW5zIix2b2lkIDApLGFLdD10KFtpKCJ0Zi1zY2FsYXItY2FyZCIpXSxhS3QpO2xldCBzS3Q9Y2xhc3MgZXh0ZW5kcygoZnVuY3Rpb24gdChlLG4pe3JldHVybihmdW5jdGlvbiBpKHQsZSl7cmV0dXJuIE5yKHt9LGVyKGUpLHQpfSkoZSxuKX0pKFtfb10seWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5zZXNzaW9uR3JvdXA9bnVsbCx0aGlzLl94VHlwZT14VHQuU1RFUCx0aGlzLl9ub011bHRpRXhwZXJpbWVudHM9ITEsdGhpcy5fcmVxdWVzdERhdGE9KHQsZSxuKT0+e1Byb21pc2UuYWxsKHQubWFwKCh0PT50aGlzLmJhY2tlbmQubGlzdE1ldHJpY0V2YWxzKHtleHBlcmltZW50TmFtZTp0aGlzLmV4cGVyaW1lbnROYW1lLHNlc3Npb25OYW1lOnQucnVuLG1ldHJpY05hbWU6dC50YWd9KS50aGVuKChuPT57ZSh7aXRlbTp0LGRhdGE6bn0pfSkpKSkpLmZpbmFsbHkoKCgpPT57bigpfSkpfSx0aGlzLl9jb2xvclNjYWxlPXtzY2FsZTp0PT57Y29uc3QgZT1KU09OLnBhcnNlKHQpWzFdLG49dGhpcy5faW5kZXhPZlNlc3Npb24uZ2V0KGUpO3JldHVybiBIUlsodGhpcy5fc2Vzc2lvbkdyb3VwTmFtZUhhc2grbiklSFIubGVuZ3RoXX19fWNvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImlyb24tcmVzaXplIix0aGlzLnJlZHJhdy5iaW5kKHRoaXMpKX1yZWRyYXcoKXt0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtc2NhbGFyLWNhcmQiKS5mb3JFYWNoKCh0PT50LnJlZHJhdygpKSl9X3Nlc3Npb25Hcm91cENoYW5nZWQoKXt0aGlzLnNlc3Npb25Hcm91cCYmMCE9T2JqZWN0LmtleXModGhpcy5zZXNzaW9uR3JvdXApLmxlbmd0aD8odGhpcy5faW5kZXhPZlNlc3Npb249bmV3IE1hcCh0aGlzLnNlc3Npb25Hcm91cC5zZXNzaW9ucy5tYXAoKCh0LGUpPT5bdC5uYW1lLGVdKSkpLHRoaXMuX3Nlc3Npb25Hcm91cE5hbWVIYXNoPVlZdCh0aGlzLnNlc3Npb25Hcm91cC5uYW1lKSk6KHRoaXMuX2luZGV4T2ZTZXNzaW9uPW5ldyBNYXAsdGhpcy5fc2Vzc2lvbkdyb3VwTmFtZUhhc2g9MCksdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLXNjYWxhci1jYXJkIikuZm9yRWFjaCgodD0+e2NvbnN0IGU9dCxuPWUuZ2V0KCJ0YWciKTtlLnNldCgidGFnIiwiIiksZS5zZXQoInRhZyIsbil9KSl9X2hhdmVNZXRyaWNzKCl7cmV0dXJuIHRoaXMudmlzaWJsZVNjaGVtYSYmQXJyYXkuaXNBcnJheSh0aGlzLnZpc2libGVTY2hlbWEubWV0cmljSW5mb3MpJiZ0aGlzLnZpc2libGVTY2hlbWEubWV0cmljSW5mb3MubGVuZ3RoPjB9X2hhdmVNZXRyaWNzQW5kU2Vzc2lvbkdyb3VwKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbkdyb3VwJiZ0aGlzLl9oYXZlTWV0cmljcygpfV9jb21wdXRlU2VyaWVzRm9yU2Vzc2lvbkdyb3VwTWV0cmljKHQsZSl7cmV0dXJuIG51bGw9PT10fHwwPT1PYmplY3Qua2V5cyh0KS5sZW5ndGh8fG51bGw9PT1lP1tdOnQuc2Vzc2lvbnMuZmlsdGVyKCh0PT52b2lkIDAhPT1BWXQodC5tZXRyaWNWYWx1ZXMsZS5uYW1lKSkpLm1hcCgodD0+KHt0YWc6ZS5uYW1lLHJ1bjp0Lm5hbWV9KSkpfV9jb21wdXRlVGFnTWV0YWRhdGEodCl7cmV0dXJue2Rpc3BsYXlOYW1lOndZdCh0KSxkZXNjcmlwdGlvbjp0LmRlc2NyaXB0aW9ufHwiIn19fTtzS3QudGVtcGxhdGU9X2VgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIXNlc3Npb25Hcm91cF1dIj4KICAgICAgPGRpdj4KICAgICAgICA8aDM+Tm8gc2Vzc2lvbiBncm91cCBzZWxlY3RlZDwvaDM+CiAgICAgICAgPHA+UGxlYXNlIHNlbGVjdCBhIHNlc3Npb24gZ3JvdXAgdG8gc2VlIGl0cyBtZXRyaWMtZ3JhcGhzIGhlcmUuPC9wPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9oYXZlTWV0cmljcyh2aXNpYmxlU2NoZW1hLiopXV0iPgogICAgICA8ZGl2PgogICAgICAgIDxoMz5ObyBtZXRyaWNzIGFyZSBlbmFibGVkPC9oMz4KICAgICAgICA8cD5QbGVhc2UgZW5hYmxlIHNvbWUgbWV0cmljcyB0byBzZWUgY29udGVudCBoZXJlLjwvcD4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0ibGF5b3V0IGhvcml6b250YWwgd3JhcCBzZXNzaW9uLWdyb3VwLWRldGFpbHMiPgogICAgICA8dGVtcGxhdGUKICAgICAgICBpcz0iZG9tLWlmIgogICAgICAgIGlmPSJbW19oYXZlTWV0cmljc0FuZFNlc3Npb25Hcm91cCh2aXNpYmxlU2NoZW1hLiosIHNlc3Npb25Hcm91cCldXSIKICAgICAgPgogICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgICBpdGVtcz0iW1t2aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zXV0iCiAgICAgICAgICBhcz0ibWV0cmljSW5mbyIKICAgICAgICA+CiAgICAgICAgICA8IS0tIE5vdGUgdGhhdCB3ZSBkbyBub3QgcHJvdmlkZSBhIHJlcXVlc3QtbWFuYWdlciBhdHRyaWJ1dGUgc2luY2UKICAgICAgICAgICAgICAgd2UgcHJvdmlkZSBhIGZ1bmN0aW9uIGluIHJlcXVlc3QtZGF0YSBmb3IgY2FsbGluZyB0aGUgYmFja2VuZAogICAgICAgICAgICAgICB0byBnZXQgdGhlIG1ldHJpY3MgZGF0YS4KICAgICAgICAgICAgLS0+CiAgICAgICAgICA8dGYtc2NhbGFyLWNhcmQKICAgICAgICAgICAgY2xhc3M9InNjYWxhci1jYXJkIgogICAgICAgICAgICBjb2xvci1zY2FsZT0iW1tfY29sb3JTY2FsZV1dIgogICAgICAgICAgICBkYXRhLXRvLWxvYWQ9IltbX2NvbXB1dGVTZXJpZXNGb3JTZXNzaW9uR3JvdXBNZXRyaWMoc2Vzc2lvbkdyb3VwLCBtZXRyaWNJbmZvKV1dIgogICAgICAgICAgICB0YWc9IltbbWV0cmljSW5mby5uYW1lLnRhZ11dIgogICAgICAgICAgICB0YWctbWV0YWRhdGE9IltbX2NvbXB1dGVUYWdNZXRhZGF0YShtZXRyaWNJbmZvKV1dIgogICAgICAgICAgICB4LXR5cGU9IltbX3hUeXBlXV0iCiAgICAgICAgICAgIG11bHRpLWV4cGVyaW1lbnRzPSJbW19ub011bHRpRXhwZXJpbWVudHNdXSIKICAgICAgICAgICAgcmVxdWVzdC1kYXRhPSJbW19yZXF1ZXN0RGF0YV1dIgogICAgICAgICAgICBhY3RpdmUKICAgICAgICAgID4KICAgICAgICAgIDwvdGYtc2NhbGFyLWNhcmQ+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPCEtLSAiaXJvbi1mbGV4IiBpcyBuZWVkZWQgdG8gdXNlIHRoZSBsYXlvdXQgY2xhc3NlcyBpbiB0aGUgZGl2IGFib3ZlIC0tPgogICAgPHN0eWxlIGluY2x1ZGU9Imlyb24tZmxleCI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHNLdC5wcm90b3R5cGUsImJhY2tlbmQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sc0t0LnByb3RvdHlwZSwiZXhwZXJpbWVudE5hbWUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sc0t0LnByb3RvdHlwZSwidmlzaWJsZVNjaGVtYSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxzS3QucHJvdG90eXBlLCJzZXNzaW9uR3JvdXAiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sc0t0LnByb3RvdHlwZSwiX3hUeXBlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sc0t0LnByb3RvdHlwZSwiX25vTXVsdGlFeHBlcmltZW50cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxzS3QucHJvdG90eXBlLCJfaW5kZXhPZlNlc3Npb24iLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sc0t0LnByb3RvdHlwZSwiX3Nlc3Npb25Hcm91cE5hbWVIYXNoIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKV0sc0t0LnByb3RvdHlwZSwiX3JlcXVlc3REYXRhIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHNLdC5wcm90b3R5cGUsIl9jb2xvclNjYWxlIix2b2lkIDApLHQoW2EoInNlc3Npb25Hcm91cC4qIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxzS3QucHJvdG90eXBlLCJfc2Vzc2lvbkdyb3VwQ2hhbmdlZCIsbnVsbCksc0t0PXQoW2koInRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzIildLHNLdCk7bGV0IGxLdD1jbGFzcyBleHRlbmRzKGVyKGlsKHllKSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9ocGFyYW1OYW1lPXhZdCx0aGlzLl9tZXRyaWNOYW1lPXdZdH1fdmlzaWJsZVNjaGVtYU9yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQoKXtjb25zdCB0PXRoaXMuJC5zZXNzaW9uR3JvdXBzVGFibGUuZ2V0KCJkZXRhaWxzT3BlbmVkSXRlbXMiKTt0aGlzLiQuc2Vzc2lvbkdyb3Vwc1RhYmxlLnNldCgiZGV0YWlsc09wZW5lZEl0ZW1zIixbXSksRGkoKTtjb25zdCBlPW5ldyBNYXA7dGhpcy5zZXNzaW9uR3JvdXBzLmZvckVhY2goKHQ9PntlLnNldCh0Lm5hbWUsdCl9KSksdGhpcy4kLnNlc3Npb25Hcm91cHNUYWJsZS5zZXQoImRldGFpbHNPcGVuZWRJdGVtcyIsdC5tYXAoKHQ9PmUuZ2V0KHQubmFtZSkpKS5maWx0ZXIoQm9vbGVhbikpfV9zZXNzaW9uR3JvdXBIUGFyYW0odCxlKXtyZXR1cm4gbnVsbCE9dCYmMCE9T2JqZWN0LmtleXModCkubGVuZ3RoJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodC5ocGFyYW1zLGUpP1ZZdCh0LmhwYXJhbXNbZV0pOiIifV9zZXNzaW9uR3JvdXBNZXRyaWModCxlKXtpZihudWxsPT10fHwwPT1PYmplY3Qua2V5cyh0KS5sZW5ndGgpcmV0dXJuIiI7Zm9yKGxldCBuPTA7bjx0Lm1ldHJpY1ZhbHVlcy5sZW5ndGg7KytuKXtsZXQgaT10Lm1ldHJpY1ZhbHVlc1tuXTtpZihpLm5hbWUuZ3JvdXA9PT1lLmdyb3VwJiZpLm5hbWUudGFnPT1lLnRhZylyZXR1cm4gVll0KGkudmFsdWUpfXJldHVybiIifV9yb3dOdW1iZXIodCl7cmV0dXJuIHQrMX19O2xLdC50ZW1wbGF0ZT1fZWAKICAgIDx2YWFkaW4tZ3JpZAogICAgICBjbGFzcz0ic2Vzc2lvbi1ncm91cC10YWJsZSIKICAgICAgaWQ9InNlc3Npb25Hcm91cHNUYWJsZSIKICAgICAgY29sdW1uLXJlb3JkZXJpbmctYWxsb3dlZD0iIgogICAgICBpdGVtcz0iW1tzZXNzaW9uR3JvdXBzXV0iCiAgICA+CiAgICAgIDx2YWFkaW4tZ3JpZC1jb2x1bW4gZmxleC1ncm93PSIwIiB3aWR0aD0iMTBlbSIgcmVzaXphYmxlPSIiPgogICAgICAgIDx0ZW1wbGF0ZSBjbGFzcz0iaGVhZGVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj5UcmlhbCBJRDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY2VsbCI+W1tpdGVtLm5hbWVdXTwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvdmFhZGluLWdyaWQtY29sdW1uPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbZW5hYmxlU2hvd01ldHJpY3NdXSI+CiAgICAgICAgPHZhYWRpbi1ncmlkLWNvbHVtbiBmbGV4LWdyb3c9IjAiIGF1dG9XaWR0aD0iIiByZXNpemFibGU9IiI+CiAgICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj5TaG93IE1ldHJpY3M8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjbGFzcz0idGFibGUtY2VsbCIgY2hlY2tlZD0ie3tkZXRhaWxzT3BlbmVkfX0iPgogICAgICAgICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlCiAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgaXRlbXM9IltbdmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvc11dIgogICAgICAgIGFzPSJocGFyYW1JbmZvIgogICAgICAgIGluZGV4LWFzPSJocGFyYW1JbmRleCIKICAgICAgPgogICAgICAgIDx2YWFkaW4tZ3JpZC1jb2x1bW4gZmxleC1ncm93PSIyIiB3aWR0aD0iMTBlbSIgcmVzaXphYmxlPSIiPgogICAgICAgICAgPHRlbXBsYXRlIGNsYXNzPSJoZWFkZXIiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXIgdGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgW1tfaHBhcmFtTmFtZShocGFyYW1JbmZvKV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgW1tfc2Vzc2lvbkdyb3VwSFBhcmFtKGl0ZW0sIGhwYXJhbUluZm8ubmFtZSldXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC92YWFkaW4tZ3JpZC1jb2x1bW4+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZQogICAgICAgIGlzPSJkb20tcmVwZWF0IgogICAgICAgIGl0ZW1zPSJ7e3Zpc2libGVTY2hlbWEubWV0cmljSW5mb3N9fSIKICAgICAgICBhcz0ibWV0cmljSW5mbyIKICAgICAgICBpbmRleC1hcz0ibWV0cmljSW5kZXgiCiAgICAgID4KICAgICAgICA8dmFhZGluLWdyaWQtY29sdW1uIGZsZXgtZ3Jvdz0iMiIgd2lkdGg9IjEwZW0iIHJlc2l6YWJsZT0iIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBjbGFzcz0iaGVhZGVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIHRhYmxlLWNlbGwiPgogICAgICAgICAgICAgIFtbX21ldHJpY05hbWUobWV0cmljSW5mbyldXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNlbGwiPgogICAgICAgICAgICAgIFtbX3Nlc3Npb25Hcm91cE1ldHJpYyhpdGVtLCBtZXRyaWNJbmZvLm5hbWUpXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdmFhZGluLWdyaWQtY29sdW1uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgY2xhc3M9InJvdy1kZXRhaWxzIj4KICAgICAgICA8dGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHMKICAgICAgICAgIGJhY2tlbmQ9IltbYmFja2VuZF1dIgogICAgICAgICAgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iCiAgICAgICAgICBzZXNzaW9uLWdyb3VwPSJbW2l0ZW1dXSIKICAgICAgICAgIHZpc2libGUtc2NoZW1hPSJbW3Zpc2libGVTY2hlbWFdXSIKICAgICAgICAgIGNsYXNzPSJzZXNzaW9uLWdyb3VwLWRldGFpbHMiCiAgICAgICAgPgogICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHM+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3ZhYWRpbi1ncmlkPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmRhcmstbW9kZSkgewogICAgICAgIC0tbHVtby1iYXNlLWNvbG9yOiAjMzAzMDMwOwogICAgICAgIC0tbHVtby1ib2R5LXRleHQtY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgIDpob3N0KC5kYXJrLW1vZGUpIHZhYWRpbi1ncmlkIHsKICAgICAgICAtLV9sdW1vLWdyaWQtc2Vjb25kYXJ5LWJvcmRlci1jb2xvcjogIzUwNTA1MDsKICAgICAgfQoKICAgICAgLnRhYmxlLWNlbGwgewogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAudGFibGUtaGVhZGVyIHsKICAgICAgICAvKiBsaW5lLWJyZWFrIG92ZXJmbG93aW5nIGNvbHVtbiBoZWFkZXJzICovCiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIC5zZXNzaW9uLWdyb3VwLXRhYmxlIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlc3Npb24tZ3JvdXAtZGV0YWlscyB7CiAgICAgICAgaGVpZ2h0OiAzNjBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sbEt0LnByb3RvdHlwZSwidmlzaWJsZVNjaGVtYSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sbEt0LnByb3RvdHlwZSwic2Vzc2lvbkdyb3VwcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGxLdC5wcm90b3R5cGUsImVuYWJsZVNob3dNZXRyaWNzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGxLdC5wcm90b3R5cGUsImJhY2tlbmQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sbEt0LnByb3RvdHlwZSwiZXhwZXJpbWVudE5hbWUiLHZvaWQgMCksdChbYSgidmlzaWJsZVNjaGVtYS4qIiwic2Vzc2lvbkdyb3Vwcy4qIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxsS3QucHJvdG90eXBlLCJfdmlzaWJsZVNjaGVtYU9yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQiLG51bGwpLGxLdD10KFtpKCJ0Zi1ocGFyYW1zLXRhYmxlLXZpZXciKV0sbEt0KTtsZXQgY0t0PWNsYXNzIGV4dGVuZHMgeWV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuc2Vzc2lvbkdyb3VwPW51bGwsdGhpcy52aXNpYmxlU2NoZW1hPW51bGx9X3Byb3BlcnRpZXNBcmVQb3B1bGF0ZWQodCxlKXtyZXR1cm4gbnVsbCE9dCYmbnVsbCE9ZX1fc2luZ2xldG9uU2Vzc2lvbkdyb3Vwcyh0KXtyZXR1cm4gbnVsbD09dD9bXTpbdF19fTtmdW5jdGlvbiB1S3QodCxlLG4pe2Z1bmN0aW9uIGkoKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuWzEsMl07Y29uc3RbZSxuXT1MbCh0KTtyZXR1cm4gZSE9PW4/W2Usbl06ZT4wP1suNSplLDEuNSplXTplPDA/WzEuNSplLC41KmVdOlstMSwxXX1pZigiTElORUFSIj09PW4pcmV0dXJuIFZNKCkuZG9tYWluKGkoKSkucmFuZ2UoW2UsMF0pO2lmKCJMT0ciPT09bil7Y29uc3Qgbj1pKCk7cmV0dXJuIG5bMF08PTAmJm5bMV0+PTA/dUt0KHQsZSwiTElORUFSIik6S00oKS5kb21haW4obikucmFuZ2UoW2UsMF0pfWlmKCJRVUFOVElMRSI9PT1uKXtjb25zdCBuPTIwLGk9emwobikubWFwKCh0PT5lLXQqZS8obi0xKSkpO3JldHVybiAwPT09dC5sZW5ndGgmJih0PVsxXSksb0UoKS5kb21haW4oU2UuZXhwb3J0cy51bmlxKHQpKS5yYW5nZShpKX1pZigiTk9OX05VTUVSSUMiPT09bilyZXR1cm4gQU0oKS5kb21haW4oU2UuZXhwb3J0cy51bmlxKHQuc29ydCgpKSkucmFuZ2UoW2UsMF0pLnBhZGRpbmcoLjEpO3Rocm93IFJhbmdlRXJyb3IoIlVua25vd24gc2NhbGU6ICIrbil9dmFyIGhLdCxkS3Q7Y0t0LnRlbXBsYXRlPV9lYAogICAgPCEtLSBJZiBzZXNzaW9uR3JvdXAgb3IgdmlzaWJsZVNjaGVtYSBhcmUgbm90IHBvcHVsYXRlZCwgZG8gbm90IGRpc3BsYXkKICAgICAgICAgYW55dGhpbmcuCiAgICAgIC0tPgogICAgPHRlbXBsYXRlCiAgICAgIGlzPSJkb20taWYiCiAgICAgIGlmPSJbW19wcm9wZXJ0aWVzQXJlUG9wdWxhdGVkKHZpc2libGVTY2hlbWEsIHNlc3Npb25Hcm91cCldXSIKICAgID4KICAgICAgPCEtLSBEaXNwbGF5IG9uZSByb3cgd2l0aG91dCBhICJzaG93LW1ldHJpY3MiIGNvbHVtbiAtLT4KICAgICAgPHRmLWhwYXJhbXMtdGFibGUtdmlldwogICAgICAgIHZpc2libGUtc2NoZW1hPSJbW3Zpc2libGVTY2hlbWFdXSIKICAgICAgICBzZXNzaW9uLWdyb3Vwcz0iW1tfc2luZ2xldG9uU2Vzc2lvbkdyb3VwcyhzZXNzaW9uR3JvdXApXV0iCiAgICAgID4KICAgICAgPC90Zi1ocGFyYW1zLXRhYmxlLXZpZXc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlCiAgICAgIGlzPSJkb20taWYiCiAgICAgIGlmPSJbWyFfcHJvcGVydGllc0FyZVBvcHVsYXRlZCh2aXNpYmxlU2NoZW1hLCBzZXNzaW9uR3JvdXApXV0iCiAgICA+CiAgICAgIDxkaXY+Q2xpY2sgb3IgaG92ZXIgb3ZlciBhIHNlc3Npb24gZ3JvdXAgdG8gZGlzcGxheSBpdHMgdmFsdWVzIGhlcmUuPC9kaXY+CiAgICA8L3RlbXBsYXRlPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sY0t0LnByb3RvdHlwZSwic2Vzc2lvbkdyb3VwIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGNLdC5wcm90b3R5cGUsInZpc2libGVTY2hlbWEiLHZvaWQgMCksY0t0PXQoW2koInRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMiKV0sY0t0KSwoZnVuY3Rpb24odCl7dC5MSU5FQVI9IkxJTkVBUiIsdC5MT0c9IkxPRyIsdC5RVUFOVElMRT0iUVVBTlRJTEUiLHQuTk9OX05VTUVSSUM9Ik5PTl9OVU1FUklDIn0pKGhLdHx8KGhLdD17fSkpO2NsYXNzIHBLdHtpc1Bhc3NpbmcodCl7cmV0dXJuITB9fWNsYXNzIGZLdHtjb25zdHJ1Y3Rvcih0LGUsbixpKXt0aGlzLl9sb3dlcj10LHRoaXMuX3VwcGVyPWUsdGhpcy5fbG93ZXJPcGVuPW4sdGhpcy5fdXBwZXJPcGVuPWl9aXNQYXNzaW5nKHQpe2NvbnN0IGU9dDtyZXR1cm4gdGhpcy5fYmVmb3JlKHRoaXMuX2xvd2VyLGUsIXRoaXMuX2xvd2VyT3BlbikmJnRoaXMuX2JlZm9yZShlLHRoaXMuX3VwcGVyLCF0aGlzLl91cHBlck9wZW4pfV9iZWZvcmUodCxlLG4pe3JldHVybiBuP3Q8PWU6dDxlfX1jbGFzcyBtS3R7Y29uc3RydWN0b3IodCl7dGhpcy5fZG9tYWluU2V0PXR9aXNQYXNzaW5nKHQpe3JldHVybi0xIT09dGhpcy5fZG9tYWluU2V0LmZpbmRJbmRleCgoZT0+ZT09PXQpKX19Y2xhc3MgZ0t0e2NvbnN0cnVjdG9yKHQsZSxuLGkpe3RoaXMuX3N2Z1Byb3BzPXQsdGhpcy5fc2NoZW1hPWUsdGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyPW4sdGhpcy5fY29sSW5kZXg9aSx0aGlzLl9pc0Rpc3BsYXllZD0hMSx0aGlzLl95U2NhbGU9bnVsbCx0aGlzLl9zY2FsZVR5cGU9bnVsbCx0aGlzLnNldEJydXNoU2VsZWN0aW9uKG51bGwpfWNvbEluZGV4KCl7cmV0dXJuIHRoaXMuX2NvbEluZGV4fXlTY2FsZSgpe3JldHVybiB0aGlzLl95U2NhbGV9c2NhbGVUeXBlKCl7cmV0dXJuIHRoaXMuX3NjYWxlVHlwZX1icnVzaFNlbGVjdGlvbigpe3JldHVybiB0aGlzLl9icnVzaFNlbGVjdGlvbn1pc0Rpc3BsYXllZCgpe3JldHVybiB0aGlzLl9pc0Rpc3BsYXllZH1zZXRCcnVzaFNlbGVjdGlvbih0KXt0aGlzLl9icnVzaFNlbGVjdGlvbj10LHRoaXMuX2JydXNoRmlsdGVyPXRoaXMuX2J1aWxkQnJ1c2hGaWx0ZXIodGhpcy5icnVzaFNlbGVjdGlvbigpLHRoaXMuc2NhbGVUeXBlKCksdGhpcy55U2NhbGUoKSl9c2V0RG9tYWluQW5kU2NhbGUodCxlKXt0aGlzLl9zY2FsZVR5cGU9ZSx0aGlzLl95U2NhbGU9dUt0KHQuc2xpY2UoKSx0aGlzLl9zdmdQcm9wcy5oZWlnaHQsdGhpcy5zY2FsZVR5cGUoKSksdGhpcy5fYnJ1c2hGaWx0ZXI9dGhpcy5fYnVpbGRCcnVzaEZpbHRlcih0aGlzLmJydXNoU2VsZWN0aW9uKCksdGhpcy5zY2FsZVR5cGUoKSx0aGlzLnlTY2FsZSgpKX1icnVzaEZpbHRlcigpe3JldHVybiB0aGlzLl9icnVzaEZpbHRlcn11cGRhdGVET00odCl7bGV0IGU9YWModGhpcy55U2NhbGUoKSk7dGhpcy5zY2FsZVR5cGUoKT09PWhLdC5RVUFOVElMRSYmKGU9ZS50aWNrVmFsdWVzKHRoaXMueVNjYWxlKCkucXVhbnRpbGVzKCkpLnRpY2tGb3JtYXQobXkoIi0uNmciKSkpO2NvbnN0IG49U3UodCk7bi5zZWxlY3RBbGwoImciKS5yZW1vdmUoKSxuLmFwcGVuZCgiZyIpLmNsYXNzZWQoImF4aXMiLCEwKS5jYWxsKGUpLmFwcGVuZCgidGV4dCIpLmNsYXNzZWQoImF4aXMtdGl0bGUiLCEwKS5zdHlsZSgiY3Vyc29yIiwibW92ZSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLmF0dHIoInkiLC05KS50ZXh0KCh0PT5TWXQodGhpcy5fc2NoZW1hLHQpKSksbi5jYWxsKHZoKCkub24oInN0YXJ0IiwoKCk9Pnt0LnNldEF0dHJpYnV0ZSgiaXMtZHJhZ2dpbmciLCIiKSx0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25EcmFnU3RhcnQodGhpcy5jb2xJbmRleCgpKX0pKS5vbigiZHJhZyIsKCgpPT50aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25EcmFnKHV1LngpKSkub24oImVuZCIsKCgpPT57dGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uRHJhZ0VuZCgpLHQucmVtb3ZlQXR0cmlidXRlKCJpcy1kcmFnZ2luZyIpfSkpKTtjb25zdCBpPVptKCkuZXh0ZW50KFtbLTgsMF0sWzgsdGhpcy5fc3ZnUHJvcHMuaGVpZ2h0KzFdXSkub24oInN0YXJ0IiwoKCk9Pnt5S3QodXUpJiYodC5zZXRBdHRyaWJ1dGUoImlzLWJydXNoaW5nIiwiIiksdGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uQnJ1c2hDaGFuZ2VkKHRoaXMuY29sSW5kZXgoKSx1dS5zZWxlY3Rpb24pKX0pKS5vbigiYnJ1c2giLCgoKT0+e3lLdCh1dSkmJnRoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkJydXNoQ2hhbmdlZCh0aGlzLmNvbEluZGV4KCksdXUuc2VsZWN0aW9uKX0pKS5vbigiZW5kIiwoKCk9Pnt5S3QodXUpJiYodGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uQnJ1c2hDaGFuZ2VkKHRoaXMuY29sSW5kZXgoKSx1dS5zZWxlY3Rpb24pLHQucmVtb3ZlQXR0cmlidXRlKCJpcy1icnVzaGluZyIpKX0pKSxyPVN1KHQpLmFwcGVuZCgiZyIpLmNsYXNzZWQoImJydXNoIiwhMCk7ci5jYWxsKGkpLGkubW92ZShyLHRoaXMuYnJ1c2hTZWxlY3Rpb24oKSl9c2V0RGlzcGxheWVkKHQpe3RoaXMuX2lzRGlzcGxheWVkPXR9X2J1aWxkQnJ1c2hGaWx0ZXIodCxlLG4pe2lmKG51bGw9PT10KXJldHVybiBuZXcgcEt0O2lmKG51bGw9PT1lKXJldHVybiBjb25zb2xlLmVycm9yKCJTY2FsZSB0eXBlIGlzIG51bGwsIGJ1dCBicnVzaFNlbGVjdGlvbiBpc24ndDogIix0KSxuZXcgcEt0O3N3aXRjaChlKXtjYXNlIGhLdC5MSU5FQVI6Y2FzZSBoS3QuTE9HOntjb25zdFtlLGldPShmdW5jdGlvbiByKHQsZSxuKXtyZXR1cm5bdC5pbnZlcnQoZSksdC5pbnZlcnQobildLnNvcnQoKCh0LGUpPT50LWUpKX0pKG4sdFswXSx0WzFdKTtyZXR1cm4gbmV3IGZLdChlLGksITEsITEpfWNhc2UgaEt0LlFVQU5USUxFOntjb25zdFtlLGldPShmdW5jdGlvbiByKHQsZSxuKXtjb25zdCBpPXQucmFuZ2UoKSxyPWkuZmlsdGVyKCh0PT5lPD10JiZ0PD1uKSkubWFwKChlPT57Y29uc3Qgbj10LmludmVydEV4dGVudChlKTtyZXR1cm4gZT09PWlbaS5sZW5ndGgtMV0/W25bMF0sblsxXSsxXTpufSkpO3JldHVybiAwPT1yLmxlbmd0aD9bMCwwXTpMbChxbChyKSl9KShuLHRbMF0sdFsxXSk7cmV0dXJuIG5ldyBmS3QoZSxpLCExLCEwKX1jYXNlIGhLdC5OT05fTlVNRVJJQzpyZXR1cm4gbmV3IG1LdCgoZnVuY3Rpb24gZSh0LG4saSl7cmV0dXJuIHQuZG9tYWluKCkuZmlsdGVyKChlPT57Y29uc3Qgcj10KGUpO3JldHVybiBuPD1yJiZyPD1pfSkpfSkobix0WzBdLHRbMV0pKX1yZXR1cm4gY29uc29sZS5lcnJvcigiVW5rbm93biBzY2FsZSB0eXBlOiAiLGUpLG5ldyBwS3R9fWNsYXNzIF9LdHtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5fc3ZnUHJvcHM9dCx0aGlzLl9zY2hlbWE9ZSx0aGlzLl9heGVzPXRoaXMuX2NyZWF0ZUF4ZXMobiksdGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnM9QU0oKS5yYW5nZShbMSx0aGlzLl9zdmdQcm9wcy53aWR0aC0xXSkucGFkZGluZyguNSksdGhpcy5fZHJhZ2dlZEF4aXM9bnVsbCx0aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgiZy5heGlzLXBhcmVudCIpLnJlbW92ZSgpLHRoaXMuX3BhcmVudHNTZWw9dGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoIi5heGlzLXBhcmVudCIpfXVwZGF0ZUF4ZXModCxlKXtjb25zb2xlLmFzc2VydCghdGhpcy5pc0F4aXNEcmFnZ2luZygpKTtjb25zdCBuPW5ldyBTZXQ7dC5jb2x1bW5zLmZvckVhY2goKHQ9Pntjb25zdCBpPXQuYWJzb2x1dGVJbmRleDtsZXQgcj10aGlzLl9heGVzW2ldO3Iuc2V0RGlzcGxheWVkKCEwKTtjb25zdCBvPWUubWFwKCh0PT5QWXQodGhpcy5fc2NoZW1hLHQsaSkpKTtyLnNldERvbWFpbkFuZFNjYWxlKG8sdC5zY2FsZSksbi5hZGQoaSl9KSksdGhpcy5fYXhlcy5mb3JFYWNoKCh0PT57bi5oYXModC5jb2xJbmRleCgpKXx8dC5zZXREaXNwbGF5ZWQoITEpfSkpLHRoaXMuX3VwZGF0ZVN0YXRpb25hcnlBeGVzUG9zaXRpb25zKG4pLHRoaXMuX3BhcmVudHNTZWw9dGhpcy5fcGFyZW50c1NlbC5kYXRhKEFycmF5LmZyb20obiksKHQ9PnQpKSx0aGlzLl9wYXJlbnRzU2VsLmV4aXQoKS5yZW1vdmUoKSx0aGlzLl9wYXJlbnRzU2VsPXRoaXMuX3BhcmVudHNTZWwuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJheGlzLXBhcmVudCIsITApLm1lcmdlKHRoaXMuX3BhcmVudHNTZWwpO2NvbnN0IGk9dGhpczt0aGlzLl9wYXJlbnRzU2VsLmNhbGwoKHQ9PnRoaXMuX3VwZGF0ZUF4ZXNQb3NpdGlvbnNJbkRPTSh0KSkpLmVhY2goKGZ1bmN0aW9uKHQpe2kuX2F4ZXNbdF0udXBkYXRlRE9NKHRoaXMpfSkpfW1hcFZpc2libGVBeGVzKHQpe3JldHVybiB0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4oKS5tYXAoKGU9PnQodGhpcy5nZXRBeGlzUG9zaXRpb24oZSksdGhpcy5fYXhlc1tlXSkpKX1hbGxWaXNpYmxlQXhlc1NhdGlzZnkodCl7cmV0dXJuIHRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbigpLmV2ZXJ5KChlPT50KHRoaXMuZ2V0QXhpc1Bvc2l0aW9uKGUpLHRoaXMuX2F4ZXNbZV0pKSl9Z2V0QXhpc0ZvckNvbEluZGV4KHQpe3JldHVybiB0aGlzLl9heGVzW3RdfWRyYWdTdGFydCh0KXtjb25zb2xlLmFzc2VydCghdGhpcy5pc0F4aXNEcmFnZ2luZygpKSxjb25zb2xlLmFzc2VydCh0aGlzLl9heGVzW3RdLmlzRGlzcGxheWVkKCkpLHRoaXMuX2RyYWdnZWRBeGlzPXRoaXMuX2F4ZXNbdF0sdGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbj10aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucyh0KX1kcmFnKHQpe3Q9TWF0aC5taW4oTWF0aC5tYXgodCwwKSx0aGlzLl9zdmdQcm9wcy53aWR0aCksdGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbj10O2xldCBlPXRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbigpO2Uuc29ydCgoKHQsZSk9PnRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHQpLXRoaXMuZ2V0QXhpc1Bvc2l0aW9uKGUpKSksdGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKGUpLHRoaXMuX3VwZGF0ZUF4ZXNQb3NpdGlvbnNJbkRPTSh0aGlzLl9wYXJlbnRzU2VsKX1kcmFnRW5kKHQpe2NvbnNvbGUuYXNzZXJ0KHRoaXMuaXNBeGlzRHJhZ2dpbmcoKSksdGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbj1udWxsLHRoaXMuX2RyYWdnZWRBeGlzPW51bGwsdGhpcy5fdXBkYXRlQXhlc1Bvc2l0aW9uc0luRE9NKHRoaXMuX3BhcmVudHNTZWwudHJhbnNpdGlvbigpLmR1cmF0aW9uKHQpKX1pc0F4aXNEcmFnZ2luZygpe3JldHVybiBudWxsIT09dGhpcy5fZHJhZ2dlZEF4aXN9Z2V0QXhpc1Bvc2l0aW9uKHQpe3JldHVybiBudWxsIT09dGhpcy5fZHJhZ2dlZEF4aXMmJnRoaXMuX2RyYWdnZWRBeGlzLmNvbEluZGV4KCk9PT10P3RoaXMuX2RyYWdnZWRBeGlzUG9zaXRpb246dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnModCl9X3VwZGF0ZVN0YXRpb25hcnlBeGVzUG9zaXRpb25zKHQpe2NvbnN0IGU9dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKCkuZmlsdGVyKChlPT50LmhhcyhlKSkpLG49QXJyYXkuZnJvbShuZXcgU2V0KFsuLi5lLC4uLkFycmF5LmZyb20odCldKSk7dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKG4pfV91cGRhdGVBeGVzUG9zaXRpb25zSW5ET00odCl7dC5hdHRyKCJ0cmFuc2Zvcm0iLCh0PT5XWXQodGhpcy5nZXRBeGlzUG9zaXRpb24odCkpKSl9X2NyZWF0ZUF4ZXModCl7cmV0dXJuIHpsKFRZdCh0aGlzLl9zY2hlbWEpKS5tYXAoKGU9Pm5ldyBnS3QodGhpcy5fc3ZnUHJvcHMsdGhpcy5fc2NoZW1hLHQsZSkpKX19ZnVuY3Rpb24geUt0KHQpe3JldHVybiBudWxsIT09dC5zb3VyY2VFdmVudH0hKGZ1bmN0aW9uKHQpe3RbdC5GT1JFR1JPVU5EPTBdPSJGT1JFR1JPVU5EIix0W3QuQkFDS0dST1VORD0xXT0iQkFDS0dST1VORCJ9KShkS3R8fChkS3Q9e30pKTtjbGFzcyB2S3R7Y29uc3RydWN0b3IodCl7dm9pZCAwPT09dCYmKHQ9c2gobnVsbCkpLGNvbnNvbGUuYXNzZXJ0KHQuc2l6ZSgpPD0xKSx0aGlzLl9zZXNzaW9uR3JvdXBTZWw9dH1zZXNzaW9uR3JvdXAoKXtyZXR1cm4gMT09PXRoaXMuX3Nlc3Npb25Hcm91cFNlbC5zaXplKCk/dGhpcy5fc2Vzc2lvbkdyb3VwU2VsLmRhdHVtKCk6bnVsbH1pc051bGwoKXtyZXR1cm4gbnVsbD09PXRoaXMuc2Vzc2lvbkdyb3VwKCl9c2VsZWN0aW9uKCl7cmV0dXJuIHRoaXMuX3Nlc3Npb25Hcm91cFNlbH1lcXVhbHNUbyh0KXtyZXR1cm4gdGhpcy5pc051bGwoKT90LmlzTnVsbCgpOiF0LmlzTnVsbCgpJiZ0LnNlc3Npb25Hcm91cCgpLm5hbWU9PXRoaXMuc2Vzc2lvbkdyb3VwKCkubmFtZX19Y2xhc3MgYkt0e2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLl9zdmdQcm9wcz10LHRoaXMuX3NjaGVtYT1lLHRoaXMuX2F4ZXNDb2xsZWN0aW9uPW4sdGhpcy5fc2Vzc2lvbkdyb3Vwcz1bXSx0aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgiZy5iYWNrZ3JvdW5kIikucmVtb3ZlKCksdGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoImcuZm9yZWdyb3VuZCIpLnJlbW92ZSgpLHRoaXMuX2JnUGF0aHNTZWw9dGhpcy5fc3ZnUHJvcHMuc3ZnRy5hcHBlbmQoImciKS5jbGFzc2VkKCJiYWNrZ3JvdW5kIiwhMCkuc2VsZWN0QWxsKCJwYXRoIiksdGhpcy5fZmdQYXRoc1NlbD10aGlzLl9zdmdQcm9wcy5zdmdHLmFwcGVuZCgiZyIpLmNsYXNzZWQoImZvcmVncm91bmQiLCEwKS5zZWxlY3RBbGwoInBhdGgiKSx0aGlzLl91cGRhdGVWaXNpYmxlRmdQYXRoc1NlbCgpLHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cEhhbmRsZT1uZXcgdkt0LHRoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlPW5ldyB2S3QsdGhpcy5fZDNsaW5lPXVMKCkuY3VydmUoc0wpfWdldFNlc3Npb25Hcm91cEhhbmRsZSh0KXtyZXR1cm4gbnVsbD09dD9uZXcgdkt0Om5ldyB2S3QodGhpcy5fZmdQYXRoc1NlbC5maWx0ZXIoKGU9PmUubmFtZT09PXQubmFtZSkpKX1oaWRlQmFja2dyb3VuZExpbmVzKCl7dGhpcy5fYmdQYXRoc1NlbC5hdHRyKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9c2hvd0JhY2tncm91bmRMaW5lcygpe3RoaXMuX2JnUGF0aHNTZWwuYXR0cigidmlzaWJpbGl0eSIsbnVsbCl9cGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCl7cmV0dXJuIHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cEhhbmRsZX1zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpe3JldHVybiB0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZX1yZWNvbXB1dGVDb250cm9sUG9pbnRzKHQsZT0wKXsodD09PWRLdC5GT1JFR1JPVU5EP3RoaXMuX2ZnUGF0aHNTZWw6dGhpcy5fYmdQYXRoc1NlbCkudHJhbnNpdGlvbigpLmR1cmF0aW9uKGUpLmF0dHIoImQiLCh0PT50aGlzLl9wYXRoREF0dHJpYnV0ZSh0KSkpLHQ9PT1kS3QuRk9SRUdST1VORCYmd2luZG93LnNldFRpbWVvdXQoKCgpPT57Y29uc3QgdD10aGlzO3RoaXMuX2ZnUGF0aHNTZWwuZWFjaCgoZnVuY3Rpb24oZSl7dC5fc2V0Q29udHJvbFBvaW50c1Byb3BlcnR5KHRoaXMsZSl9KSl9KSl9cmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpe3RoaXMuX2ZnUGF0aHNTZWwuY2xhc3NlZCgiaW52aXNpYmxlLXBhdGgiLCh0PT4hdGhpcy5fYXhlc0NvbGxlY3Rpb24uYWxsVmlzaWJsZUF4ZXNTYXRpc2Z5KCgoZSxuKT0+bi5icnVzaEZpbHRlcigpLmlzUGFzc2luZyhQWXQodGhpcy5fc2NoZW1hLHQsbi5jb2xJbmRleCgpKSkpKSkpLHRoaXMuX3VwZGF0ZVZpc2libGVGZ1BhdGhzU2VsKCl9c2V0Rm9yZWdyb3VuZExpbmVzQ29sb3IodCxlLG4pe2NvbnN0IGk9dGhpcy5fY3JlYXRlTGluZUNvbG9yRnVuY3Rpb24odCxlLG4pO3RoaXMuX2ZnUGF0aHNTZWwuYXR0cigic3Ryb2tlIixpKX1yZWRyYXcodCxlLG4saSl7Y29uc3Qgcj10aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2Vzc2lvbkdyb3VwKCksbz10aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZS5zZXNzaW9uR3JvdXAoKTt0aGlzLl9zZXNzaW9uR3JvdXBzPXQsdGhpcy5fZmdQYXRoc1NlbD10aGlzLl9yZWNvbXB1dGVQYXRoU2VsZWN0aW9uKHRoaXMuX2ZnUGF0aHNTZWwpLHRoaXMuX2JnUGF0aHNTZWw9dGhpcy5fcmVjb21wdXRlUGF0aFNlbGVjdGlvbih0aGlzLl9iZ1BhdGhzU2VsKSx0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGU9dGhpcy5nZXRTZXNzaW9uR3JvdXBIYW5kbGUociksdGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGU9dGhpcy5nZXRTZXNzaW9uR3JvdXBIYW5kbGUobyksdGhpcy5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGRLdC5GT1JFR1JPVU5EKSx0aGlzLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoZEt0LkJBQ0tHUk9VTkQpLHRoaXMucmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpLHRoaXMuc2V0Rm9yZWdyb3VuZExpbmVzQ29sb3IoZSxuLGkpfXVwZGF0ZVBlYWtlZFNlc3Npb25Hcm91cCh0KXt0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgicGVha2VkLXBhdGgiLCExKSx0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGU9dCx0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgicGVha2VkLXBhdGgiLCEwKX1jbGVhclBlYWtlZFNlc3Npb25Hcm91cCgpe3RoaXMudXBkYXRlUGVha2VkU2Vzc2lvbkdyb3VwKG5ldyB2S3QpfXVwZGF0ZVNlbGVjdGVkU2Vzc2lvbkdyb3VwKHQpe3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInNlbGVjdGVkLXBhdGgiLCExKSx0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZT10LHRoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInNlbGVjdGVkLXBhdGgiLCEwKX1maW5kQ2xvc2VzdFNlc3Npb25Hcm91cCh0LGUpe2NvbnN0IG49dGhpcy5fYXhlc0NvbGxlY3Rpb24ubWFwVmlzaWJsZUF4ZXMoKCh0LGUpPT50KSksaT0oZnVuY3Rpb24gcih0LGUsbixpKXtpZihlLmxlbmd0aDwyKXJldHVybiBjb25zb2xlLmVycm9yKCJMZXNzIHRoYW4gdHdvIGF4ZXMgaW4gcGFyYWxsZWwgY29vcmRpbmF0ZXMgcGxvdC4iKSxudWxsO2NvbnN0IHI9blswXSxvPW5bMV07aWYocjw9ZVswXXx8cj49ZVtlLmxlbmd0aC0xXSlyZXR1cm4gbnVsbDtjb25zdCBhPVNlLmV4cG9ydHMuc29ydGVkSW5kZXgoZSxyKTtjb25zb2xlLmFzc2VydChhPjApLGNvbnNvbGUuYXNzZXJ0KGE8ZS5sZW5ndGgpO2NvbnN0IHM9YS0xO2xldCBsPW51bGwsYz1udWxsO3JldHVybiB0LmZvckVhY2goKHQ9Pntjb25zdCBlPShmdW5jdGlvbiBuKHQsZSxpLGEpe2NvbnN0IHM9dC1pLGw9ZS1hLGM9ci1pLHU9by1hLGg9KHMqYytsKnUpLyhzKnMrbCpsKTtyZXR1cm4gaDw9MD9VWXQoYyx1KTpoPj0xP1VZdCh0LXIsZS1vKTpVWXQoYy1oKnMsdS1oKmwpfSkodC5jb250cm9sUG9pbnRzW3NdWzBdLHQuY29udHJvbFBvaW50c1tzXVsxXSx0LmNvbnRyb2xQb2ludHNbYV1bMF0sdC5jb250cm9sUG9pbnRzW2FdWzFdKTtlPml8fChudWxsPT09bHx8ZTxsKSYmKGw9ZSxjPXQpfSkpLGN9KSh0aGlzLl92aXNpYmxlRmdQYXRoc1NlbC5ub2RlcygpLG4sW3QsZV0sMTAwKTtyZXR1cm4gbnVsbD09PWk/bmV3IHZLdDpuZXcgdkt0KFN1KGkpKX1fY3JlYXRlTGluZUNvbG9yRnVuY3Rpb24odCxlLG4pe2lmKG51bGw9PT10KXJldHVybigpPT4icmVkIjtjb25zdCBpPVZNKCkuZG9tYWluKE5ZdCh0aGlzLl9zY2hlbWEsdGhpcy5fc2Vzc2lvbkdyb3Vwcyx0KSkucmFuZ2UoW2Usbl0pLmludGVycG9sYXRlKGNwKTtyZXR1cm4gZT0+aShQWXQodGhpcy5fc2NoZW1hLGUsdCkpfV9yZWNvbXB1dGVQYXRoU2VsZWN0aW9uKHQpe3JldHVybih0PXQuZGF0YSh0aGlzLl9zZXNzaW9uR3JvdXBzLCh0PT50Lm5hbWUpKSkuZXhpdCgpLnJlbW92ZSgpLHQuZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5tZXJnZSh0KX1fc2V0Q29udHJvbFBvaW50c1Byb3BlcnR5KHQsZSl7dC5jb250cm9sUG9pbnRzPXRoaXMuX2NvbXB1dGVDb250cm9sUG9pbnRzKGUpfV9jb21wdXRlQ29udHJvbFBvaW50cyh0KXtyZXR1cm4gdGhpcy5fYXhlc0NvbGxlY3Rpb24ubWFwVmlzaWJsZUF4ZXMoKChlLG4pPT5bZSxuLnlTY2FsZSgpKFBZdCh0aGlzLl9zY2hlbWEsdCxuLmNvbEluZGV4KCkpKV0pKX1fcGF0aERBdHRyaWJ1dGUodCl7cmV0dXJuIHRoaXMuX2QzbGluZSh0aGlzLl9jb21wdXRlQ29udHJvbFBvaW50cyh0KSl9X3VwZGF0ZVZpc2libGVGZ1BhdGhzU2VsKCl7dGhpcy5fdmlzaWJsZUZnUGF0aHNTZWw9dGhpcy5fZmdQYXRoc1NlbC5maWx0ZXIoIjpub3QoLmludmlzaWJsZS1wYXRoKSIpfX1jbGFzcyB4S3R7Y29uc3RydWN0b3IodCxlKXt0aGlzLnN2Zz1TdSh0KTtjb25zdCBuPTEwMCplKzEwKzEwO3RoaXMuc3ZnLmF0dHIoInZpZXdCb3giLGAwIDAgJHtufSAyNDBgKSx0aGlzLnN2Zy5hdHRyKCJwcmVzZXJ2ZUFzcGVjdFJhdGlvIiwieE1pZFlNaWQiKSx0aGlzLnN2Zy5zdHlsZSgibWluLXdpZHRoIixuKyJweCIpLHRoaXMuc3ZnLnN0eWxlKCJtaW4taGVpZ2h0IiwiMjQwcHgiKSx0aGlzLndpZHRoPW4tMTAtMTAsdGhpcy5oZWlnaHQ9MjAwLHRoaXMuc3ZnRz10aGlzLnN2Zy5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLFdZdCgxMCwzMCkpfX1jbGFzcyB3S3R7Y29uc3RydWN0b3IodCxlLG4saSl7dGhpcy5fc3ZnUHJvcHM9dCx0aGlzLl9zY2hlbWE9ZSx0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ0I9bix0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWRDQj1pLHRoaXMuX2F4ZXNDb2xsZWN0aW9uPW5ldyBfS3QodCxlLHRoaXMpLHRoaXMuX2xpbmVzQ29sbGVjdGlvbj1uZXcgYkt0KHQsZSx0aGlzLl9heGVzQ29sbGVjdGlvbiksdGhpcy5fc3ZnUHJvcHMuc3ZnLm9uKCJjbGljayIsKCgpPT50aGlzLm9uQ2xpY2soKSkpLm9uKCJtb3VzZW1vdmUgbW91c2VlbnRlciIsKCgpPT57Y29uc3RbdCxlXT1haCh0aGlzLl9zdmdQcm9wcy5zdmdHLm5vZGUoKSk7dGhpcy5vbk1vdXNlTW92ZWQodCxlKX0pKS5vbigibW91c2VsZWF2ZSIsKCgpPT50aGlzLm9uTW91c2VMZWF2ZSgpKSl9b25EcmFnU3RhcnQodCl7dGhpcy5fYXhlc0NvbGxlY3Rpb24uZHJhZ1N0YXJ0KHQpLHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5oaWRlQmFja2dyb3VuZExpbmVzKCl9b25EcmFnKHQpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmRyYWcodCksdGhpcy5fbGluZXNDb2xsZWN0aW9uLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoZEt0LkZPUkVHUk9VTkQpfW9uRHJhZ0VuZCgpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmRyYWdFbmQoNTAwKSx0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVjb21wdXRlQ29udHJvbFBvaW50cyhkS3QuRk9SRUdST1VORCw1MDApLHdpbmRvdy5zZXRUaW1lb3V0KCgoKT0+e3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGRLdC5CQUNLR1JPVU5EKSx0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2hvd0JhY2tncm91bmRMaW5lcygpfSksNTAwKX1vbkJydXNoQ2hhbmdlZCh0LGUpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmdldEF4aXNGb3JDb2xJbmRleCh0KS5zZXRCcnVzaFNlbGVjdGlvbihlKSx0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpfW9uTW91c2VNb3ZlZCh0LGUpe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi51cGRhdGVQZWFrZWRTZXNzaW9uR3JvdXAodGhpcy5fbGluZXNDb2xsZWN0aW9uLmZpbmRDbG9zZXN0U2Vzc2lvbkdyb3VwKHQsZSkpLHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCkpfW9uTW91c2VMZWF2ZSgpe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5pc051bGwoKXx8KHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5jbGVhclBlYWtlZFNlc3Npb25Hcm91cCgpLHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQihudWxsKSl9b25DbGljaygpe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKT09PXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpLnNlc3Npb25Hcm91cCgpP3RoaXMuX2xpbmVzQ29sbGVjdGlvbi51cGRhdGVTZWxlY3RlZFNlc3Npb25Hcm91cChuZXcgdkt0KTp0aGlzLl9saW5lc0NvbGxlY3Rpb24udXBkYXRlU2VsZWN0ZWRTZXNzaW9uR3JvdXAodGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpKSx0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSl9b25PcHRpb25zT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZCh0LGUpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLnVwZGF0ZUF4ZXModCxlKTtjb25zdCBuPXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSxpPXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWRyYXcoZSx2b2lkIDAhPT10LmNvbG9yQnlDb2x1bW5JbmRleD90LmNvbHVtbnNbdC5jb2xvckJ5Q29sdW1uSW5kZXhdLmFic29sdXRlSW5kZXg6bnVsbCx0Lm1pbkNvbG9yLHQubWF4Q29sb3IpLG4uZXF1YWxzVG8odGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpKXx8dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSksaS5lcXVhbHNUbyh0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSl8fHRoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpLnNlc3Npb25Hcm91cCgpKX1zY2hlbWEoKXtyZXR1cm4gdGhpcy5fc2NoZW1hfX1sZXQgU0t0PWNsYXNzIGV4dGVuZHMoZXIoaWwoeWUpKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXA9bnVsbCx0aGlzLmNsb3Nlc3RTZXNzaW9uR3JvdXA9bnVsbCx0aGlzLnJlZHJhd0NvdW50PTB9X29wdGlvbnNPclNlc3Npb25Hcm91cHNDaGFuZ2VkKCl7dmFyIHQ7aWYoIXRoaXMub3B0aW9ucylyZXR1cm47Y29uc3R7Y29uZmlndXJhdGlvbjplfT1udWxsIT09KHQ9dGhpcy5fcHJldk9wdGlvbnMpJiZ2b2lkIDAhPT10P3Q6e30se2NvbmZpZ3VyYXRpb246bn09dGhpcy5vcHRpb25zO2lmKHZvaWQgMD09PXRoaXMuX2ludGVyYWN0aW9uTWFuYWdlcnx8IVNlLmV4cG9ydHMuaXNFcXVhbChlLnNjaGVtYSxuLnNjaGVtYSl8fCFTZS5leHBvcnRzLmlzRXF1YWwoZS5jb2x1bW5zVmlzaWJpbGl0eSxuLmNvbHVtbnNWaXNpYmlsaXR5KSl7U3UodGhpcy4kLnN2Zykuc2VsZWN0QWxsKCIqIikucmVtb3ZlKCk7Y29uc3QgdD1uZXcgeEt0KHRoaXMuJC5zdmcsbi5jb2x1bW5zVmlzaWJpbGl0eS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoKTt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuc3ZnLCEwKSx0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXI9bmV3IHdLdCh0LG4uc2NoZW1hLCh0PT50aGlzLmNsb3Nlc3RTZXNzaW9uR3JvdXBDaGFuZ2VkKHQpKSwodD0+dGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWQodCkpKX10aGlzLl9jb21wdXRlVmFsaWRTZXNzaW9uR3JvdXBzKCksdGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uT3B0aW9uc09yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQodGhpcy5vcHRpb25zLHRoaXMuX3ZhbGlkU2Vzc2lvbkdyb3VwcyksdGhpcy5yZWRyYXdDb3VudCsrLHRoaXMuX3ByZXZPcHRpb25zPXRoaXMub3B0aW9uc31jbG9zZXN0U2Vzc2lvbkdyb3VwQ2hhbmdlZCh0KXt0aGlzLmNsb3Nlc3RTZXNzaW9uR3JvdXA9dH1zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWQodCl7dGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cD10fV9jb21wdXRlVmFsaWRTZXNzaW9uR3JvdXBzKCl7Y29uc3QgdD1YWXQ7aWYodm9pZCAwPT09dGhpcy5zZXNzaW9uR3JvdXBzKXJldHVybiB2b2lkKHRoaXMuX3ZhbGlkU2Vzc2lvbkdyb3Vwcz12b2lkIDApO2NvbnN0IGU9dGhpcy5vcHRpb25zLmNvbmZpZ3VyYXRpb24uc2NoZW1hO3RoaXMuX3ZhbGlkU2Vzc2lvbkdyb3Vwcz10aGlzLnNlc3Npb25Hcm91cHMuZmlsdGVyKChuPT57Zm9yKGxldCBpPTA7aTx0Lm51bUNvbHVtbnMoZSk7KytpKWlmKHRoaXMub3B0aW9ucy5jb25maWd1cmF0aW9uLmNvbHVtbnNWaXNpYmlsaXR5W2ldJiZ2b2lkIDA9PT10LmNvbHVtblZhbHVlQnlJbmRleChlLG4saSkpcmV0dXJuITE7cmV0dXJuITB9KSl9fTtTS3QudGVtcGxhdGU9X2VgCiAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICA8c3ZnIGlkPSJzdmciPjwvc3ZnPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAtLXRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QtYXhpcy1zaGFkb3c6IDAgMXB4IDAgI2ZmZiwKICAgICAgICAgIDFweCAwIDAgI2ZmZiwgMCAtMXB4IDAgI2ZmZiwgLTFweCAwIDAgI2ZmZjsKICAgICAgfQogICAgICA6aG9zdCguZGFyay1tb2RlKSB7CiAgICAgICAgLS10Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90LWF4aXMtc2hhZG93OiAwIDFweCAwICMwMDAsCiAgICAgICAgICAxcHggMCAwICMwMDAsIDAgLTFweCAwICMwMDAsIC0xcHggMCAwICMwMDA7CiAgICAgIH0KICAgICAgc3ZnIHsKICAgICAgICBmb250OiAxMHB4IHNhbnMtc2VyaWY7CiAgICAgIH0KCiAgICAgIC5iYWNrZ3JvdW5kIHBhdGggewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjZGRkOwogICAgICAgIHNoYXBlLXJlbmRlcmluZzogY3Jpc3BFZGdlczsKICAgICAgfQoKICAgICAgLmZvcmVncm91bmQgcGF0aCB7CiAgICAgICAgZmlsbDogbm9uZTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMC43OwogICAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgfQoKICAgICAgLyogV2lsbCBiZSBzZXQgb24gZm9yZWdyb3VuZCBwYXRocyB0aGF0IGFyZSBub3QgImNvbnRhaW5lZCIgaW4gdGhlIGN1cnJlbnQKICAgICAgICAgYXhlcyBicnVzaGVzLiBJZiBubyBicnVzaGVzIGFyZSBzZXQsIG5vIHBhdGggd2lsbCBoYXZlIHRoaXMgY2xhc3MuICovCiAgICAgIC5mb3JlZ3JvdW5kIC5pbnZpc2libGUtcGF0aCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLyogU3R5bGUgZm9yIHRoZSBwYXRoIGNsb3Nlc3QgdG8gdGhlIG1vdXNlIHBvaW50ZXIgKHR5cGljYWxseSB3aWxsIGJlY29tZQogICAgICB0aGUgc2VsZWN0ZWQgcGF0aCB3aGVuIHRoZSB1c2VyIGNsaWNrcykuICovCiAgICAgIC5mb3JlZ3JvdW5kIC5wZWFrZWQtcGF0aCB7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAzOwogICAgICB9CgogICAgICAvKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHBhdGggY2xhc3MuIFdlIHVzZSAhaW1wb3J0YW50IHRvIG92ZXJyaWRlIHRoZQogICAgICAgICBpbmxpbmUgc3R5bGUgdGhhdCBzZXRzIHRoZSByZWd1bGFyIGNvbG9yIG9mIGEgcGF0aC4gKi8KICAgICAgLmZvcmVncm91bmQgLnNlbGVjdGVkLXBhdGggewogICAgICAgIHN0cm9rZS13aWR0aDogMyAhaW1wb3J0YW50OwogICAgICAgIHN0cm9rZTogIzBmMCAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAjY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAuYXhpcyB0ZXh0IHsKICAgICAgICB0ZXh0LXNoYWRvdzogdmFyKC0tdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtcGxvdC1heGlzLXNoYWRvdyk7CiAgICAgICAgZmlsbDogY3VycmVudENvbG9yOwogICAgICAgIGN1cnNvcjogbW92ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxTS3QucHJvdG90eXBlLCJzZXNzaW9uR3JvdXBzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFNLdC5wcm90b3R5cGUsIm9wdGlvbnMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFNLdC5wcm90b3R5cGUsInNlbGVjdGVkU2Vzc2lvbkdyb3VwIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxTS3QucHJvdG90eXBlLCJjbG9zZXN0U2Vzc2lvbkdyb3VwIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLFNLdC5wcm90b3R5cGUsInJlZHJhd0NvdW50Iix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxTS3QucHJvdG90eXBlLCJfdmFsaWRTZXNzaW9uR3JvdXBzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFNLdC5wcm90b3R5cGUsIl9pbnRlcmFjdGlvbk1hbmFnZXIiLHZvaWQgMCksdChbYSgib3B0aW9ucy4qIiwic2Vzc2lvbkdyb3Vwcy4qIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxTS3QucHJvdG90eXBlLCJfb3B0aW9uc09yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQiLG51bGwpLFNLdD10KFtpKCJ0Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90IildLFNLdCk7bGV0IE1LdD1jbGFzcyBleHRlbmRzIHlle19jbG9zZXN0T3JTZWxlY3RlZCh0LGUpe3JldHVybiBudWxsIT09dD90OmV9fTtNS3QudGVtcGxhdGU9X2VgCiAgICA8IS0tIENvbnRyb2xzIGJlaGF2aW9yIG9mIHBhcmFsbGVsIGNvb3JkaW5hdGVzIHBsb3QKICAgICAgICAgb3V0cHV0cyBzZXQgb3B0aW9ucyB0byB0aGUgX29wdGlvbnMgcHJvcGVydHkuCiAgICAgIC0tPgogICAgPGhwYXJhbXMtc3BsaXQtbGF5b3V0IG9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CiAgICAgIDwhLS0gVGhlIHNjYWxlIGFuZCBjb2xvciBjb250cm9scy4gLS0+CiAgICAgIDx0Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scwogICAgICAgIGlkPSJjb250cm9scyIKICAgICAgICBzbG90PSJjb250ZW50IgogICAgICAgIGNsYXNzPSJzZWN0aW9uIgogICAgICAgIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIgogICAgICAgIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIKICAgICAgICBvcHRpb25zPSJ7e19vcHRpb25zfX0iCiAgICAgID4KICAgICAgPC90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scz4KICAgICAgPCEtLSBUaGUgYWN0dWFsIHBhcmFsbGVsIGNvb3JkaW5hdGVzIHBsb3QgLS0+CiAgICAgIDx0Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90CiAgICAgICAgaWQ9InBsb3QiCiAgICAgICAgc2xvdD0iY29udGVudCIKICAgICAgICBjbGFzcz0ic2VjdGlvbiIKICAgICAgICBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iCiAgICAgICAgc2VsZWN0ZWQtc2Vzc2lvbi1ncm91cD0ie3tfc2VsZWN0ZWRHcm91cH19IgogICAgICAgIGNsb3Nlc3Qtc2Vzc2lvbi1ncm91cD0ie3tfY2xvc2VzdEdyb3VwfX0iCiAgICAgICAgb3B0aW9ucz0iW1tfb3B0aW9uc11dIgogICAgICA+CiAgICAgIDwvdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtcGxvdD4KICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMKICAgICAgICBpZD0idmFsdWVzIgogICAgICAgIHNsb3Q9ImNvbnRlbnQiCiAgICAgICAgY2xhc3M9InNlY3Rpb24iCiAgICAgICAgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iCiAgICAgICAgc2Vzc2lvbi1ncm91cD0iW1tfY2xvc2VzdE9yU2VsZWN0ZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Nsb3Nlc3RHcm91cCwgX3NlbGVjdGVkR3JvdXApXV0iCiAgICAgID4KICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtdmFsdWVzPgogICAgICA8dGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHMKICAgICAgICBpZD0iZGV0YWlscyIKICAgICAgICBzbG90PSJjb250ZW50IgogICAgICAgIGNsYXNzPSJzZWN0aW9uIgogICAgICAgIGJhY2tlbmQ9IltbYmFja2VuZF1dIgogICAgICAgIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIgogICAgICAgIHNlc3Npb24tZ3JvdXA9IltbX3NlbGVjdGVkR3JvdXBdXSIKICAgICAgICB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSIKICAgICAgPgogICAgICA8L3RmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzPgogICAgPC9ocGFyYW1zLXNwbGl0LWxheW91dD4KCiAgICA8c3R5bGU+CiAgICAgIC5zZWN0aW9uIHsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICB9CiAgICAgICN2YWx1ZXMgewogICAgICAgIGhlaWdodDogMTE1cHg7CiAgICAgIH0KICAgICAgI2RldGFpbHMgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLE1LdC5wcm90b3R5cGUsImJhY2tlbmQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sTUt0LnByb3RvdHlwZSwiZXhwZXJpbWVudE5hbWUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTUt0LnByb3RvdHlwZSwiY29uZmlndXJhdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sTUt0LnByb3RvdHlwZSwic2Vzc2lvbkdyb3VwcyIsdm9pZCAwKSxNS3Q9dChbaSgidGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldyIpXSxNS3QpO2xldCBFS3Q9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwPW51bGwsdGhpcy5jbG9zZXN0U2Vzc2lvbkdyb3VwPW51bGwsdGhpcy5fY29udGFpbmVyPW51bGwsdGhpcy5fc3ZnPW51bGwsdGhpcy53aWR0aD0wLHRoaXMuaGVpZ2h0PTAsdGhpcy5fYnJ1c2hlZENlbGxJbmRleD1udWxsLHRoaXMuX2JydXNoU2VsZWN0aW9uPW51bGx9cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMuX2NvbnRhaW5lcj10aGlzLiQuY29udGFpbmVyLHRoaXMuX3N2Zz1TdSh0aGlzLiQuc3ZnKSx0aGlzLl9yZWRyYXcoKX1fc2Vzc2lvbkdyb3Vwc0NoYW5nZWQoKXtudWxsIT09dGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cCYmKHRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXA9RFl0KHRoaXMuc2Vzc2lvbkdyb3Vwcyx0aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwLm5hbWUpfHxudWxsKSx0aGlzLl9yZWRyYXcoKX1fdmlzaWJsZVNjaGVtYUNoYW5nZWQoKXt0aGlzLl9icnVzaGVkQ2VsbEluZGV4PW51bGwsdGhpcy5fYnJ1c2hTZWxlY3Rpb249bnVsbCx0aGlzLl9yZWRyYXcoKX1fcmVkcmF3KCl7dGhpcy5kZWJvdW5jZSgiX3JlZHJhdyIsKCgpPT57Y29uc3QgdD1YWXQ7dGhpcy53aWR0aD1NYXRoLm1heCgxNTAqdC5udW1WaXNpYmxlQ29sdW1ucyh0aGlzLnZpc2libGVTY2hlbWEpLDEyMDApLHRoaXMuaGVpZ2h0PU1hdGgubWF4KDExMi41KnQubnVtVmlzaWJsZU1ldHJpY3ModGhpcy52aXNpYmxlU2NoZW1hKSw0ODApLHRoaXMuX2NvbnRhaW5lci5zdHlsZS53aWR0aD10aGlzLndpZHRoKyJweCIsdGhpcy5fY29udGFpbmVyLnN0eWxlLmhlaWdodD10aGlzLmhlaWdodCsicHgiLHRoaXMuX3N2Zy5hdHRyKCJ3aWR0aCIsdGhpcy53aWR0aCkuYXR0cigiaGVpZ2h0Iix0aGlzLmhlaWdodCksdGhpcy5fc3ZnLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpLHRoaXMuX2RyYXcoKX0pLDEwMCl9X2RyYXcoKXtjb25zdCB0PVhZdCxlPXRoaXM7aWYoIXRoaXMuc2Vzc2lvbkdyb3Vwc3x8MD09dGhpcy5zZXNzaW9uR3JvdXBzLmxlbmd0aHx8IXRoaXMudmlzaWJsZVNjaGVtYXx8MD09dGhpcy52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zLmxlbmd0aClyZXR1cm47Y29uc3Qgbj16bCh0Lm51bVZpc2libGVDb2x1bW5zKGUudmlzaWJsZVNjaGVtYSkpLGk9emwodC5udW1WaXNpYmxlTWV0cmljcyhlLnZpc2libGVTY2hlbWEpKSxyPVRNKCkuZG9tYWluKG4pLnJhbmdlKFs4NSx0aGlzLndpZHRoLTEtNV0pLnBhZGRpbmdJbm5lciguMSksbz1UTSgpLmRvbWFpbihpKS5yYW5nZShbdGhpcy5oZWlnaHQtMS01LTUwLDVdKS5wYWRkaW5nSW5uZXIoLjEpLGE9ci5iYW5kd2lkdGgoKSxzPW8uYmFuZHdpZHRoKCksbD1uLm1hcCgodD0+ZS5fY2VsbFNjYWxlKHQsWzAsYS0xXSkpKSxjPWkubWFwKChuPT5lLl9jZWxsU2NhbGUobit0Lm51bVZpc2libGVIUGFyYW1zKGUudmlzaWJsZVNjaGVtYSksW3MtMSwwXSkpKSx1PXRoaXMuX3N2Zy5zZWxlY3RBbGwoIi54LWF4aXMiKS5kYXRhKG4pLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgieC1heGlzIiwhMCkuYXR0cigidHJhbnNmb3JtIiwoZT0+dC50cmFuc2xhdGVTdHIocihlKSwwKSkpO2Z1bmN0aW9uIGgodCl7cmV0dXJuIngtYXhpcy1jbGlwLXBhdGgtIit0fWZ1bmN0aW9uIGQodCl7cmV0dXJuIngtbGFiZWwtY2xpcC1wYXRoLSIrdH11LmFwcGVuZCgiY2xpcFBhdGgiKS5hdHRyKCJpZCIsaCkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLTUpLmF0dHIoInkiLDApLmF0dHIoIndpZHRoIixhKzEwKS5hdHRyKCJoZWlnaHQiLGUuaGVpZ2h0LTI1KSx1LmFwcGVuZCgiY2xpcFBhdGgiKS5hdHRyKCJpZCIsZCkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsMCkuYXR0cigieSIsZS5oZWlnaHQtMjUpLmF0dHIoIndpZHRoIixhKS5hdHRyKCJoZWlnaHQiLDI1KSx1LmFwcGVuZCgiZyIpLmF0dHIoImNsaXAtcGF0aCIsKHQ9PiJ1cmwoIyIraCh0KSsiKSIpKS5lYWNoKChmdW5jdGlvbih0KXtTdSh0aGlzKS5jYWxsKGcsb2MobFt0XSkudGlja1NpemUoZS5oZWlnaHQtNTApLGEsNDAsZS5vcHRpb25zLmNvbHVtbnNbdF0uc2NhbGUpfSkpLHUuYXBwZW5kKCJnIikuY2xhc3NlZCgieC1heGlzLWxhYmVsIiwhMCkuYXR0cigiY2xpcC1wYXRoIiwodD0+InVybCgjIitkKHQpKyIpIikpLmFwcGVuZCgidGV4dCIpLmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigieCIsYS8yKS5hdHRyKCJ5IixlLmhlaWdodC0xLTEyLjUpLnRleHQoKG49PnQuc2NoZW1hVmlzaWJsZUNvbHVtbk5hbWUoZS52aXNpYmxlU2NoZW1hLG4pKSkuYXBwZW5kKCJ0aXRsZSIpLnRleHQoKG49PnQuc2NoZW1hVmlzaWJsZUNvbHVtbk5hbWUoZS52aXNpYmxlU2NoZW1hLG4pKSk7Y29uc3QgcD10aGlzLl9zdmcuc2VsZWN0QWxsKCIueS1heGlzIikuZGF0YShpKS5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoInktYXhpcyIsITApLmF0dHIoInRyYW5zZm9ybSIsKG49PnQudHJhbnNsYXRlU3RyKGUud2lkdGgtMSxvKG4pKSkpO2Z1bmN0aW9uIGYodCl7cmV0dXJuInktYXhpcy1jbGlwLXBhdGgtIit0fWZ1bmN0aW9uIG0odCl7cmV0dXJuInktbGFiZWwtY2xpcC1wYXRoLSIrdH1mdW5jdGlvbiBnKHQsZSxuLGkscil7Y29uc3Qgbz1NYXRoLmZsb29yKG4vaSksYT1lLnNjYWxlKCk7aWYoIlFVQU5USUxFIj09PXIpe2xldCB0PWEucXVhbnRpbGVzKCk7Y29uc3Qgbj1NYXRoLmNlaWwodC5sZW5ndGgvbyk7dD16bCgwLHQubGVuZ3RoLG4pLm1hcCgoZT0+dFtlXSkpLGUudGlja1ZhbHVlcyh0KS50aWNrRm9ybWF0KG15KCItLjJnIikpfSJMSU5FQVIiIT09ciYmIkxPRyIhPT1yfHxlLnRpY2tzKG8pLHQuY2FsbChlKSx0LnNlbGVjdEFsbCgiLmRvbWFpbiIpLnJlbW92ZSgpLHQuc2VsZWN0QWxsKCIudGljayBsaW5lIikuYXR0cigic3Ryb2tlIiwiI2RkZCIpfXAuYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImlkIixmKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtKGUud2lkdGgtNDAtMSkpLmF0dHIoInkiLC01KS5hdHRyKCJ3aWR0aCIsZS53aWR0aC00MCkuYXR0cigiaGVpZ2h0IixzKzEwKSxwLmFwcGVuZCgiY2xpcFBhdGgiKS5hdHRyKCJpZCIsbSkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLShlLndpZHRoLTEpKS5hdHRyKCJ5IiwwKS5hdHRyKCJ3aWR0aCIsNDApLmF0dHIoImhlaWdodCIscykscC5hcHBlbmQoImciKS5hdHRyKCJjbGlwLXBhdGgiLCh0PT4idXJsKCMiK2YodCkrIikiKSkuZWFjaCgoZnVuY3Rpb24obil7U3UodGhpcykuY2FsbChnLGFjKGNbbl0pLnRpY2tTaXplKGUud2lkdGgtODApLHMsMjAsZS5vcHRpb25zLmNvbHVtbnNbbit0Lm51bVZpc2libGVIUGFyYW1zKGUudmlzaWJsZVNjaGVtYSldLnNjYWxlKX0pKSxwLmFwcGVuZCgiZyIpLmNsYXNzZWQoInktYXhpcy1sYWJlbCIsITApLmF0dHIoImNsaXAtcGF0aCIsKHQ9PiJ1cmwoIyIrbSh0KSsiKSIpKS5hcHBlbmQoInRleHQiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLmF0dHIoIngiLC0oZS53aWR0aC0yMC0xKSkuYXR0cigieSIscy8yKS5hdHRyKCJ0cmFuc2Zvcm0iLHQucm90YXRlU3RyKDkwLC0oZS53aWR0aC0yMC0xKSxzLzIpKS50ZXh0KChuPT50Lm1ldHJpY05hbWUoZS52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zW25dKSkpLmFwcGVuZCgidGl0bGUiKS50ZXh0KChuPT50Lm1ldHJpY05hbWUoZS52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zW25dKSkpO2NvbnN0IF89dGhpcy5fc3ZnLnNlbGVjdEFsbCgiLmNlbGwiKS5kYXRhKFRsKG4saSkpLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgiY2VsbCIsITApLmF0dHIoInRyYW5zZm9ybSIsKChbZSxuXSk9PnQudHJhbnNsYXRlU3RyKHIoZSksbyhuKSkpKTtfLmFwcGVuZCgiZyIpLmNsYXNzZWQoImZyYW1lIiwhMCkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLTUpLmF0dHIoInkiLC01KS5hdHRyKCJ3aWR0aCIsYSsxMCkuYXR0cigiaGVpZ2h0IixzKzEwKS5hdHRyKCJzdHJva2UiLCIjMDAwIikuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIik7bGV0IHk9bnVsbDt2b2lkIDAhPT1lLm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4JiYoeT1WTSgpLmRvbWFpbih0aGlzLl9jb2xFeHRlbnQodGhpcy5vcHRpb25zLmNvbG9yQnlDb2x1bW5JbmRleCkpLnJhbmdlKFt0aGlzLm9wdGlvbnMubWluQ29sb3IsdGhpcy5vcHRpb25zLm1heENvbG9yXSkuaW50ZXJwb2xhdGUoY3ApKTtjb25zdCB2PXZvaWQgMD09PWUub3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXg/KCk9PiJyZWQiOih7c2Vzc2lvbkdyb3VwOnR9KT0+eSh0aGlzLl9jb2xWYWx1ZSh0LGUub3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgpKTtmdW5jdGlvbiBiKHQsbil7cmV0dXJuIGxbbl0oZS5fY29sVmFsdWUodCxuKSl9ZnVuY3Rpb24geCh0LG4pe3JldHVybiBjW25dKGUuX21ldHJpY1ZhbHVlKHQsbikpfWNvbnN0W3csUyxNXT0oZnVuY3Rpb24gRSh0LHIpe2NvbnN0IG89dC5zZWxlY3RBbGwoIi5kYXRhLW1hcmtlciIpLmRhdGEoKChbdCxuXSk9PmUuc2Vzc2lvbkdyb3Vwcy5maWx0ZXIoKGk9PnZvaWQgMCE9PWUuX2NvbFZhbHVlKGksdCkmJnZvaWQgMCE9PWUuX21ldHJpY1ZhbHVlKGksbikpKS5tYXAoKGU9Pih7Y29sOnQsbWV0cmljOm4sc2Vzc2lvbkdyb3VwOmUseDpiKGUsdCkseTp4KGUsbiksc2Vzc2lvbkdyb3VwTWFya2VyczpudWxsfSkpKSkpLmVudGVyKCkuYXBwZW5kKCJjaXJjbGUiKS5jbGFzc2VkKCJkYXRhLW1hcmtlciIsITApLmF0dHIoImN4IiwoKHt4OnR9KT0+dCkpLmF0dHIoImN5IiwoKHt5OnR9KT0+dCkpLmF0dHIoInIiLDIpLmF0dHIoImZpbGwiLHIpLGE9bmV3IE1hcDtlLnNlc3Npb25Hcm91cHMuZm9yRWFjaCgodD0+e2Euc2V0KHQsW10pfSkpLG8uZWFjaCgoZnVuY3Rpb24odCl7YS5nZXQodC5zZXNzaW9uR3JvdXApLnB1c2godGhpcyl9KSksby5lYWNoKCh0PT57Y29uc3QgZT1hLmdldCh0LnNlc3Npb25Hcm91cCk7dC5zZXNzaW9uR3JvdXBNYXJrZXJzPW5ldyBTZXQoZSl9KSk7Y29uc3Qgcz1uLm1hcCgodD0+aS5tYXAoKGU9Pm8uZmlsdGVyKChuPT5uLmNvbD09dCYmbi5tZXRyaWM9PWUpKSkpKSk7cmV0dXJuW28scyxhXX0pKF8uYXBwZW5kKCJnIiksdiksVD1uLm1hcCgodD0+aS5tYXAoKGU9PihmdW5jdGlvbiBuKHQsZSl7Y29uc3Qgbj1bXTtyZXR1cm4gU1t0XVtlXS5lYWNoKChmdW5jdGlvbigpe24ucHVzaCh0aGlzKX0pKSxOXygpLngoKHQ9PlN1KHQpLmRhdHVtKCkueCkpLnkoKHQ9PlN1KHQpLmRhdHVtKCkueSkpLmFkZEFsbChuKX0pKHQsZSkpKSkpO2xldCBDPW51bGw7TigpJiYoQz1fLmZpbHRlcigodD0+U2UuZXhwb3J0cy5pc0VxdWFsKHQsZS5fYnJ1c2hlZENlbGxJbmRleCkpKSxjb25zb2xlLmFzc2VydCgxPT1DLnNpemUoKSxDKSk7bGV0IEE9bmV3IFNldCh3Lm5vZGVzKCkpO2Z1bmN0aW9uIGsoKXtsZXQgbj1uZXcgU2V0KHcubm9kZXMoKSk7KGZ1bmN0aW9uIGkoKXtyZXR1cm4hTigpfHxlLl9icnVzaFNlbGVjdGlvblswXVswXT09PWUuX2JydXNoU2VsZWN0aW9uWzFdWzBdfHxlLl9icnVzaFNlbGVjdGlvblswXVsxXT09PWUuX2JydXNoU2VsZWN0aW9uWzFdWzFdfSkoKXx8KG49KGZ1bmN0aW9uIHIoZSxuKXtjb25zb2xlLmFzc2VydChudWxsIT09ZSksY29uc29sZS5hc3NlcnQobnVsbCE9PW4pO2NvbnN0W2kscl09ZSxvPW5ldyBTZXQ7cmV0dXJuIHQucXVhZFRyZWVWaXNpdFBvaW50c0luUmVjdChUW2ldW3JdLG5bMF1bMF0sblswXVsxXSxuWzFdWzBdLG5bMV1bMV0sKHQ9PntTdSh0KS5kYXR1bSgpLnNlc3Npb25Hcm91cE1hcmtlcnMuZm9yRWFjaCgodD0+e28uYWRkKHQpfSkpfSkpLG99KShlLl9icnVzaGVkQ2VsbEluZGV4LGUuX2JydXNoU2VsZWN0aW9uKSksc2goQXJyYXkuZnJvbSh0LmZpbHRlclNldChuLCh0PT4hQS5oYXModCkpKSkpLmF0dHIoImZpbGwiLHYpLHNoKEFycmF5LmZyb20odC5maWx0ZXJTZXQoQSwodD0+IW4uaGFzKHQpKSkpKS5hdHRyKCJmaWxsIiwiI2RkZCIpLEE9bn1rKCk7Y29uc3QgTD1KbSgpLmV4dGVudChbWy00LC00XSxbYS0xKzUtMSxzLTErNS0xXV0pLm9uKCJzdGFydCIsKGZ1bmN0aW9uKCl7TigpJiZDLm5vZGUoKSE9dGhpcyYmTC5tb3ZlKEMsbnVsbCksUCh0aGlzKX0pKS5vbigiYnJ1c2giLChmdW5jdGlvbigpe1AodGhpcyl9KSkub24oImVuZCIsKGZ1bmN0aW9uKCl7UCh0aGlzKX0pKTtmdW5jdGlvbiBQKHQpe2NvbnN0IG49S20odCk7IU4oKSYmbnVsbD09PW58fE4oKSYmdD09PUMubm9kZSgpJiZTZS5leHBvcnRzLmlzRXF1YWwobixlLl9icnVzaFNlbGVjdGlvbil8fChlLl9icnVzaFNlbGVjdGlvbj1uLG51bGwhPT1uPyhDPVN1KHQpLGUuX2JydXNoZWRDZWxsSW5kZXg9Qy5kYXR1bSgpKTooQz1udWxsLGUuX2JydXNoZWRDZWxsSW5kZXg9bnVsbCksaygpKX1mdW5jdGlvbiBOKCl7cmV0dXJuIG51bGwhPT1lLl9icnVzaGVkQ2VsbEluZGV4JiZudWxsIT09ZS5fYnJ1c2hTZWxlY3Rpb259Xy5jYWxsKEwpLE4oKSYmTC5tb3ZlKEMsZS5fYnJ1c2hTZWxlY3Rpb24pO2xldCBJPW51bGwsUj1udWxsO251bGwhPT10aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwJiYoUj1zaChNLmdldCh0aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwKSkuY2xhc3NlZCgic2VsZWN0ZWQtbWFya2VyIiwhMCkpLF8ub24oImNsaWNrIiwoZnVuY3Rpb24oKXtjb25zdCB0PUk9PT1SP251bGw6STtpZih0PT09UilyZXR1cm47bnVsbCE9PVImJlIuY2xhc3NlZCgic2VsZWN0ZWQtbWFya2VyIiwhMSksUj10LG51bGwhPT1SJiZSLmNsYXNzZWQoInNlbGVjdGVkLW1hcmtlciIsITApO2NvbnN0IG49bnVsbD09PVI/bnVsbDpSLmRhdHVtKCkuc2Vzc2lvbkdyb3VwO2Uuc2VsZWN0ZWRTZXNzaW9uR3JvdXA9bn0pKS5vbigibW91c2Vtb3ZlIG1vdXNlZW50ZXIiLChmdW5jdGlvbihbbixpXSl7Y29uc3RbcixvXT1haCh0aGlzKSxhPShmdW5jdGlvbiBzKGUsbixpLHIsbyl7bGV0IGE9MS8wLHM9bnVsbDtyZXR1cm4gdC5xdWFkVHJlZVZpc2l0UG9pbnRzSW5EaXNrKFRbZV1bbl0saSxyLG8sKCh0LGUpPT57aWYoQS5oYXModCkmJmU8YSl7Y29uc3Qgbj1TdSh0KS5kYXR1bSgpO2E9ZSxzPW4uc2Vzc2lvbkdyb3VwfX0pKSxudWxsPT09cz9udWxsOnNoKE0uZ2V0KHMpKX0pKG4saSxyLG8sMjApO0khPT1hJiYobnVsbCE9PUkmJkkuY2xhc3NlZCgiY2xvc2VzdC1tYXJrZXIiLCExKSxJPWEsbnVsbCE9PUk/KEkuY2xhc3NlZCgiY2xvc2VzdC1tYXJrZXIiLCEwKSxlLmNsb3Nlc3RTZXNzaW9uR3JvdXA9SS5kYXR1bSgpLnNlc3Npb25Hcm91cCk6ZS5jbG9zZXN0U2Vzc2lvbkdyb3VwPW51bGwpfSkpLm9uKCJtb3VzZWxlYXZlIiwoZnVuY3Rpb24oW3Qsbl0pe251bGwhPT1JJiYoSS5jbGFzc2VkKCJjbG9zZXN0LW1hcmtlciIsITEpLEk9bnVsbCxlLmNsb3Nlc3RTZXNzaW9uR3JvdXA9bnVsbCl9KSksdGhpcy5fc3ZnLnNlbGVjdEFsbCgiKiIpLmNsYXNzZWQoInRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90IiwhMCl9X2NlbGxTY2FsZSh0LGUpe2NvbnN0IG49dGhpcy5fY29sRXh0ZW50KHQpLGk9Vk0oKS5kb21haW4obikucmFuZ2UoZSk7aWYoIkxJTkVBUiI9PT10aGlzLm9wdGlvbnMuY29sdW1uc1t0XS5zY2FsZSlyZXR1cm4gaTtpZigiTE9HIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW3RdLnNjYWxlKXJldHVybiBuWzBdPD0wJiZuWzFdPj0wP2k6S00oKS5kb21haW4obikucmFuZ2UoZSk7aWYoIlFVQU5USUxFIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW3RdLnNjYWxlKXtjb25zdCBuPShlWzFdLWVbMF0pLzE5LGk9emwoMjApLm1hcCgodD0+ZVswXStuKnQpKTtyZXR1cm4gb0UoKS5kb21haW4oU2UuZXhwb3J0cy51bmlxKHRoaXMuc2Vzc2lvbkdyb3Vwcy5tYXAoKGU9PnRoaXMuX2NvbFZhbHVlKGUsdCkpKSkpLnJhbmdlKGkpfWlmKCJOT05fTlVNRVJJQyI9PT10aGlzLm9wdGlvbnMuY29sdW1uc1t0XS5zY2FsZSlyZXR1cm4gQU0oKS5kb21haW4oU2UuZXhwb3J0cy51bmlxKHRoaXMuc2Vzc2lvbkdyb3Vwcy5tYXAoKGU9PnRoaXMuX2NvbFZhbHVlKGUsdCkpKS5zb3J0KCkpKS5yYW5nZShlKS5wYWRkaW5nKC4xKTt0aHJvdyJVbmtub3duIHNjYWxlIGZvciBjb2x1bW46ICIrdCsiLiBvcHRpb25zOiAiK3RoaXMub3B0aW9uc31fY29sVmFsdWUodCxlKXtyZXR1cm4gRll0KHRoaXMudmlzaWJsZVNjaGVtYSx0LGUpfV9tZXRyaWNWYWx1ZSh0LGUpe3JldHVybiBIWXQodGhpcy52aXNpYmxlU2NoZW1hLHQsZSl9X2NvbEV4dGVudCh0KXtyZXR1cm4gell0KHRoaXMudmlzaWJsZVNjaGVtYSx0aGlzLnNlc3Npb25Hcm91cHMsdCl9fTtFS3QudGVtcGxhdGU9X2VgCiAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICA8c3ZnIGlkPSJzdmciPjwvc3ZnPgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgc3ZnIHsKICAgICAgICBmb250OiAxMHB4IHNhbnMtc2VyaWY7CiAgICAgIH0KCiAgICAgIHRleHQgewogICAgICAgIGZpbGw6IGN1cnJlbnRDb2xvcjsKICAgICAgfQoKICAgICAgLmZyYW1lIHJlY3QgewogICAgICAgIHN0cm9rZTogY3VycmVudENvbG9yOwogICAgICB9CgogICAgICAvKiBUaGUgY2xvc2VzdCBkYXRhIHBvaW50IG1hcmtlciB0byB0aGUgbW91c2UgcG9pbnRlci4gV2UgdXNlICFpbXBvcnRhbnQKICAgICAgICAgdG8gb3ZlcnJpZGUgdGhlIGlubGluZSBzdHlsZSB0aGF0IHNldHMgdGhlIHJlZ3VsYXIgc3R5bGUgb2YgYSBtYXJrZXIuCiAgICAgICovCiAgICAgIC5jbG9zZXN0LW1hcmtlciB7CiAgICAgICAgcjogNiAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAvKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGRhdGEgcG9pbnQgbWFya2VyLiBXZSB1c2UgIWltcG9ydGFudCB0bwogICAgICAgICBvdmVycmlkZSB0aGUgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBzdHlsZSBvZiBhIG1hcmtlci4gKi8KICAgICAgLnNlbGVjdGVkLW1hcmtlciB7CiAgICAgICAgcjogNiAhaW1wb3J0YW50OwogICAgICAgIGZpbGw6ICMwZjAgIWltcG9ydGFudDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEVLdC5wcm90b3R5cGUsInZpc2libGVTY2hlbWEiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLEVLdC5wcm90b3R5cGUsInNlc3Npb25Hcm91cHMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sRUt0LnByb3RvdHlwZSwib3B0aW9ucyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sRUt0LnByb3RvdHlwZSwic2VsZWN0ZWRTZXNzaW9uR3JvdXAiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEVLdC5wcm90b3R5cGUsImNsb3Nlc3RTZXNzaW9uR3JvdXAiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsSFRNTEVsZW1lbnQpXSxFS3QucHJvdG90eXBlLCJfY29udGFpbmVyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEVLdC5wcm90b3R5cGUsIl9zdmciLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sRUt0LnByb3RvdHlwZSwid2lkdGgiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sRUt0LnByb3RvdHlwZSwiaGVpZ2h0Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEVLdC5wcm90b3R5cGUsIl9icnVzaGVkQ2VsbEluZGV4Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEVLdC5wcm90b3R5cGUsIl9icnVzaFNlbGVjdGlvbiIsdm9pZCAwKSx0KFthKCJzZXNzaW9uR3JvdXBzLioiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLEVLdC5wcm90b3R5cGUsIl9zZXNzaW9uR3JvdXBzQ2hhbmdlZCIsbnVsbCksdChbYSgidmlzaWJsZVNjaGVtYS4qIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxFS3QucHJvdG90eXBlLCJfdmlzaWJsZVNjaGVtYUNoYW5nZWQiLG51bGwpLHQoW2EoIm9wdGlvbnMuKiIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sRUt0LnByb3RvdHlwZSwiX3JlZHJhdyIsbnVsbCksRUt0PXQoW2koInRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90IildLEVLdCk7bGV0IFRLdD1jbGFzcyBleHRlbmRzIHlle19jbG9zZXN0T3JTZWxlY3RlZCh0LGUpe3JldHVybiBudWxsIT09dD90OmV9fTtUS3QudGVtcGxhdGU9X2VgCiAgICA8aHBhcmFtcy1zcGxpdC1sYXlvdXQgb3JpZW50YXRpb249InZlcnRpY2FsIj4KICAgICAgPCEtLSBDb250cm9scyBiZWhhdmlvciBvZiB0aGUgc2NhdHRlciBwbG90IG1hdHJpeAogICAgICAgICAgICAgb3V0cHV0cyB0aGUgY29uZmlndXJlZCBvcHRpb25zIHRvIHRoZSBfb3B0aW9ucyBwcm9wZXJ0eS4gLS0+CiAgICAgIDx0Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scwogICAgICAgIHNsb3Q9ImNvbnRlbnQiCiAgICAgICAgY2xhc3M9InNlY3Rpb24iCiAgICAgICAgaWQ9ImNvbnRyb2xzIgogICAgICAgIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIgogICAgICAgIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIKICAgICAgICBvcHRpb25zPSJ7e19vcHRpb25zfX0iCiAgICAgID4KICAgICAgPC90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scz4KICAgICAgPCEtLSBUaGUgYWN0dWFsIHNjYXR0ZXIgcGxvdCBtYXRyaXggLS0+CiAgICAgIDx0Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtcGxvdAogICAgICAgIHNsb3Q9ImNvbnRlbnQiCiAgICAgICAgY2xhc3M9InNlY3Rpb24iCiAgICAgICAgaWQ9InBsb3QiCiAgICAgICAgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iCiAgICAgICAgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIgogICAgICAgIHNlbGVjdGVkLXNlc3Npb24tZ3JvdXA9Int7X3NlbGVjdGVkR3JvdXB9fSIKICAgICAgICBjbG9zZXN0LXNlc3Npb24tZ3JvdXA9Int7X2Nsb3Nlc3RHcm91cH19IgogICAgICAgIG9wdGlvbnM9IltbX29wdGlvbnNdXSIKICAgICAgPgogICAgICA8L3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90PgogICAgICA8dGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcwogICAgICAgIHNsb3Q9ImNvbnRlbnQiCiAgICAgICAgY2xhc3M9InNlY3Rpb24iCiAgICAgICAgaWQ9InZhbHVlcyIKICAgICAgICB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSIKICAgICAgICBzZXNzaW9uLWdyb3VwPSJbW19jbG9zZXN0T3JTZWxlY3RlZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Nsb3Nlc3RHcm91cCwgX3NlbGVjdGVkR3JvdXApXV0iCiAgICAgID4KICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtdmFsdWVzPgogICAgICA8IS0tIFNob3dzIHNlc3Npb24gZ3JvdXAgZGV0YWlscyBmb3IgdGhlIGNsaWNrZWQgbWFya2VyLiAtLT4KICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzCiAgICAgICAgc2xvdD0iY29udGVudCIKICAgICAgICBjbGFzcz0ic2VjdGlvbiIKICAgICAgICBpZD0iZGV0YWlscyIKICAgICAgICBiYWNrZW5kPSJbW2JhY2tlbmRdXSIKICAgICAgICBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIKICAgICAgICBzZXNzaW9uLWdyb3VwPSJbW19zZWxlY3RlZEdyb3VwXV0iCiAgICAgICAgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iCiAgICAgID4KICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscz4KICAgIDwvaHBhcmFtcy1zcGxpdC1sYXlvdXQ+CiAgICA8c3R5bGU+CiAgICAgIC5zZWN0aW9uIHsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICB9CiAgICAgICNjb250cm9scyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgI3Bsb3QgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICN2YWx1ZXMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogMTE1cHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjZGV0YWlscyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sVEt0LnByb3RvdHlwZSwiYmFja2VuZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxUS3QucHJvdG90eXBlLCJleHBlcmltZW50TmFtZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxUS3QucHJvdG90eXBlLCJjb25maWd1cmF0aW9uIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxUS3QucHJvdG90eXBlLCJzZXNzaW9uR3JvdXBzIix2b2lkIDApLFRLdD10KFtpKCJ0Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldyIpXSxUS3QpO2xldCBDS3Q9Y2xhc3MgZXh0ZW5kcyB5ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fc2VsZWN0ZWRUYWI9MH19O0NLdC50ZW1wbGF0ZT1fZWAKICAgIDxwYXBlci1oZWFkZXItcGFuZWw+CiAgICAgIDxwYXBlci10b29sYmFyIHNsb3Q9ImhlYWRlciIgY2xhc3M9InRhYi1iYXIiPgogICAgICAgIDxwYXBlci10YWJzIHNlbGVjdGVkPSJ7e19zZWxlY3RlZFRhYn19IiBzbG90PSJ0b3AiPgogICAgICAgICAgPCEtLSB2aWV3LWlkIGNhbiBiZSB1c2VkIGJ5IGludGVncmF0aW9uIHRlc3RzIHRvIGxvY2F0ZSBhIHRhYi4KICAgICAgICAgICAgICAgSXQgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSByb290IGVsZW1lbnQgaW1wbGVtZW50aW5nIHRoZSB2aWV3CiAgICAgICAgICAgICAgIHdpdGhvdXQgdGhlICd0Zi1ocGFyYW1zLScgcHJlZml4LiAtLT4KICAgICAgICAgIDxwYXBlci10YWIgdmlldy1pZD0idGFibGUtdmlldyI+IFRBQkxFIFZJRVcgPC9wYXBlci10YWI+CiAgICAgICAgICA8cGFwZXItdGFiIHZpZXctaWQ9InBhcmFsbGVsLWNvb3Jkcy12aWV3Ij4KICAgICAgICAgICAgUEFSQUxMRUwgQ09PUkRJTkFURVMgVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8cGFwZXItdGFiIHZpZXctaWQ9InNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldyI+CiAgICAgICAgICAgIFNDQVRURVIgUExPVCBNQVRSSVggVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWxwLWFuZC1mZWVkYmFjayI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tidWdSZXBvcnRVcmxdXSI+CiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWYkPSJbW2J1Z1JlcG9ydFVybF1dIgogICAgICAgICAgICAgICAgdGFyZ2V0PSJfYmxhbmsiCiAgICAgICAgICAgICAgICByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbgogICAgICAgICAgICAgICAgICBpZD0iYnVnLXJlcG9ydCIKICAgICAgICAgICAgICAgICAgcmFpc2VkCiAgICAgICAgICAgICAgICAgIHRpdGxlPSJTZW5kIGEgYnVnIHJlcG9ydCBvciBmZWF0dXJlIHJlcXVlc3QiCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIEJ1ZyBSZXBvcnQgLyBGZWF0dXJlIFJlcXVlc3QKICAgICAgICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hlbHBVcmxdXSI+CiAgICAgICAgICAgICAgPGEgaHJlZiQ9IltbaGVscFVybF1dIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIj4KICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgICAgICAgICAgICBpY29uPSJoZWxwLW91dGxpbmUiCiAgICAgICAgICAgICAgICAgIHRpdGxlPSJWaWV3IGRvY3VtZW50YXRpb24iCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvcGFwZXItdGFicz4KICAgICAgPC9wYXBlci10b29sYmFyPgogICAgICA8aXJvbi1wYWdlcyBzZWxlY3RlZD0iW1tfc2VsZWN0ZWRUYWJdXSIgY2xhc3M9ImZpdCB0YWItdmlldyI+CiAgICAgICAgPGRpdiBpZD0iMCIgY2xhc3M9InRhYiI+CiAgICAgICAgICA8dGYtaHBhcmFtcy10YWJsZS12aWV3CiAgICAgICAgICAgIGJhY2tlbmQ9IltbYmFja2VuZF1dIgogICAgICAgICAgICBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIKICAgICAgICAgICAgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iCiAgICAgICAgICAgIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIKICAgICAgICAgICAgZW5hYmxlLXNob3ctbWV0cmljcwogICAgICAgICAgPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXRhYmxlLXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iMSIgY2xhc3M9InRhYiI+CiAgICAgICAgICA8dGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldwogICAgICAgICAgICBiYWNrZW5kPSJbW2JhY2tlbmRdXSIKICAgICAgICAgICAgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iCiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIgogICAgICAgICAgICBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iCiAgICAgICAgICA+CiAgICAgICAgICA8L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iMiIgY2xhc3M9InRhYiI+CiAgICAgICAgICA8dGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXZpZXcKICAgICAgICAgICAgYmFja2VuZD0iW1tiYWNrZW5kXV0iCiAgICAgICAgICAgIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIgogICAgICAgICAgICBjb25maWd1cmF0aW9uPSJbW2NvbmZpZ3VyYXRpb25dXSIKICAgICAgICAgICAgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIgogICAgICAgICAgPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldz4KICAgICAgICA8L2Rpdj4KICAgICAgPC9pcm9uLXBhZ2VzPgogICAgPC9wYXBlci1oZWFkZXItcGFuZWw+CgogICAgPHN0eWxlPgogICAgICAudGFiLXZpZXcgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAudGFiLWJhciB7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKAogICAgICAgICAgLS10Yi10b29sYmFyLWJhY2tncm91bmQtY29sb3IsCiAgICAgICAgICB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKQogICAgICAgICk7CiAgICAgIH0KICAgICAgLnRhYiB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIHBhcGVyLXRhYnMgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgLS1wYXBlci10YWJzLXNlbGVjdGlvbi1iYXItY29sb3I6IHdoaXRlOwogICAgICAgIC0tcGFwZXItdGFicy1jb250ZW50OiB7CiAgICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGYtaHBhcmFtcy10YWJsZS12aWV3IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLmhlbHAtYW5kLWZlZWRiYWNrIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsgLyogRW5zdXJlIHRoYXQgaWNvbnMgc3RheSBhbGlnbmVkICovCiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQogICAgICAjYnVnLXJlcG9ydCB7CiAgICAgICAgYm9yZGVyOiBzb2xpZCBibGFjazsKICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkczsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgbWF4LXdpZHRoOiAxNTBweDsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CiAgICAgIC5oZWxwLWFuZC1mZWVkYmFjayBhIHsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sQ0t0LnByb3RvdHlwZSwiYmFja2VuZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxDS3QucHJvdG90eXBlLCJoZWxwVXJsIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLENLdC5wcm90b3R5cGUsImJ1Z1JlcG9ydFVybCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxDS3QucHJvdG90eXBlLCJleHBlcmltZW50TmFtZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxDS3QucHJvdG90eXBlLCJjb25maWd1cmF0aW9uIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxDS3QucHJvdG90eXBlLCJzZXNzaW9uR3JvdXBzIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLENLdC5wcm90b3R5cGUsIl9zZWxlY3RlZFRhYiIsdm9pZCAwKSxDS3Q9dChbaSgidGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lIildLENLdCk7Y2xhc3MgQUt0e2NvbnN0cnVjdG9yKHQsZSxuPSEwKXt0aGlzLl9hcGlVcmw9dCx0aGlzLl9yZXF1ZXN0TWFuYWdlcj1lLHRoaXMuX3VzZUh0dHBHZXQ9bn1nZXRFeHBlcmltZW50KHQpe3JldHVybiB0aGlzLl9zZW5kUmVxdWVzdCgiZXhwZXJpbWVudCIsdCl9Z2V0RG93bmxvYWRVcmwodCxlLG4pe3JldHVybiB0aGlzLl9hcGlVcmwrIi9kb3dubG9hZF9kYXRhPyIrbmV3IFVSTFNlYXJjaFBhcmFtcyh7Zm9ybWF0OnQsY29sdW1uc1Zpc2liaWxpdHk6SlNPTi5zdHJpbmdpZnkobikscmVxdWVzdDpKU09OLnN0cmluZ2lmeShlKX0pfWxpc3RTZXNzaW9uR3JvdXBzKHQpe3JldHVybiB0aGlzLl9zZW5kUmVxdWVzdCgic2Vzc2lvbl9ncm91cHMiLHQpfWxpc3RNZXRyaWNFdmFscyh0KXtyZXR1cm4gdGhpcy5fc2VuZFJlcXVlc3QoIm1ldHJpY19ldmFscyIsdCl9X3NlbmRSZXF1ZXN0KHQsZSl7aWYodGhpcy5fdXNlSHR0cEdldCl7Y29uc3Qgbj1lbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoZSkpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHRoaXMuX2FwaVVybCsiLyIrdCsiP3JlcXVlc3Q9IituKX1jb25zdCBuPW5ldyBocjtyZXR1cm4gbi53aXRoQ3JlZGVudGlhbHM9ITAsbi5tZXRob2RUeXBlPXVyLlBPU1Qsbi5jb250ZW50VHlwZT0idGV4dC9wbGFpbiIsbi5ib2R5PUpTT04uc3RyaW5naWZ5KGUpLHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3RXaXRoT3B0aW9ucyh0aGlzLl9hcGlVcmwrIi8iK3Qsbil9fWxldCBrS3Q9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe3JlbG9hZCgpe3RoaXMuJFsicXVlcnktcGFuZSJdLnJlbG9hZCgpfX07a0t0LnRlbXBsYXRlPV9lYAogICAgPGhwYXJhbXMtc3BsaXQtbGF5b3V0PgogICAgICA8ZGl2IHNsb3Q9ImNvbnRlbnQiIGNsYXNzPSJzaWRlYmFyIj4KICAgICAgICA8dGYtaHBhcmFtcy1xdWVyeS1wYW5lCiAgICAgICAgICBpZD0icXVlcnktcGFuZSIKICAgICAgICAgIGJhY2tlbmQ9IltbYmFja2VuZF1dIgogICAgICAgICAgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iCiAgICAgICAgICBjb25maWd1cmF0aW9uPSJ7e19jb25maWd1cmF0aW9ufX0iCiAgICAgICAgICBzZXNzaW9uLWdyb3Vwcz0ie3tfc2Vzc2lvbkdyb3Vwc319IgogICAgICAgICAgZGF0YS1sb2FkZWQtd2l0aC1ub24tZW1wdHktaHBhcmFtcz0ie3tfZGF0YUxvYWRlZFdpdGhOb25FbXB0eUhwYXJhbXN9fSIKICAgICAgICAgIGRhdGEtbG9hZGVkLXdpdGgtZW1wdHktaHBhcmFtcz0ie3tfZGF0YUxvYWRlZFdpdGhFbXB0eUhwYXJhbXN9fSIKICAgICAgICA+CiAgICAgICAgPC90Zi1ocGFyYW1zLXF1ZXJ5LXBhbmU+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IHNsb3Q9ImNvbnRlbnQiIGNsYXNzPSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YUxvYWRlZFdpdGhFbXB0eUhwYXJhbXNdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gaHBhcmFtcyBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6PC9wPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgaHBhcmFtcyBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBFdmVudCBmaWxlcyBhcmUgc3RpbGwgYmVpbmcgbG9hZGVkICh0cnkgcmVsb2FkaW5nIHRoaXMgcGFnZSkuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIKICAgICAgICAgICAgICAgID5SRUFETUU8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiCiAgICAgICAgICAgICAgICA+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2EKICAgICAgICAgICAgICA+LgogICAgICAgICAgICA8L3A+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIgogICAgICAgICAgICAgICAgPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YUxvYWRlZFdpdGhOb25FbXB0eUhwYXJhbXNdXSI+CiAgICAgICAgICA8dGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lCiAgICAgICAgICAgIGlkPSJzZXNzaW9ucy1wYW5lIgogICAgICAgICAgICBiYWNrZW5kPSJbW2JhY2tlbmRdXSIKICAgICAgICAgICAgaGVscC11cmw9IltbaGVscFVybF1dIgogICAgICAgICAgICBidWctcmVwb3J0LXVybD0iW1tidWdSZXBvcnRVcmxdXSIKICAgICAgICAgICAgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iCiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb249IltbX2NvbmZpZ3VyYXRpb25dXSIKICAgICAgICAgICAgc2Vzc2lvbi1ncm91cHM9IltbX3Nlc3Npb25Hcm91cHNdXSIKICAgICAgICAgID4KICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC9ocGFyYW1zLXNwbGl0LWxheW91dD4KICAgIDxzdHlsZT4KICAgICAgaHBhcmFtcy1zcGxpdC1sYXlvdXQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuc2lkZWJhciB7CiAgICAgICAgd2lkdGg6IDIwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIG1pbi13aWR0aDogMTAlOwogICAgICB9CgogICAgICAuY2VudGVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgd2lkdGg6IDgwJTsKICAgICAgfQoKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CgogICAgICBhIHsKICAgICAgICBjb2xvcjogdmFyKC0tdGItbGluayk7CiAgICAgIH0KCiAgICAgIGE6dmlzaXRlZCB7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLWxpbmstdmlzaXRlZCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixBS3QpXSxrS3QucHJvdG90eXBlLCJiYWNrZW5kIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGtLdC5wcm90b3R5cGUsImV4cGVyaW1lbnROYW1lIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGtLdC5wcm90b3R5cGUsImhlbHBVcmwiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sa0t0LnByb3RvdHlwZSwiYnVnUmVwb3J0VXJsIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGtLdC5wcm90b3R5cGUsIl9jb25maWd1cmF0aW9uIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxrS3QucHJvdG90eXBlLCJfc2Vzc2lvbkdyb3VwcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGtLdC5wcm90b3R5cGUsIl9kYXRhTG9hZGVkV2l0aE5vbkVtcHR5SHBhcmFtcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGtLdC5wcm90b3R5cGUsIl9kYXRhTG9hZGVkV2l0aEVtcHR5SHBhcmFtcyIsdm9pZCAwKSxrS3Q9dChbaSgidGYtaHBhcmFtcy1tYWluIildLGtLdCk7Y29uc3QgTEt0PSJ0cnVlIj09PW5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KCJ0ZW5zb3Jib2FyZENvbGFiIik7bGV0IFBLdD1jbGFzcyBleHRlbmRzKGVyKHllKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX2JhY2tlbmQ9bmV3IEFLdChfcigpLnBsdWdpblJvdXRlKCJocGFyYW1zIiwiIiksbmV3IGRyLExLdCl9cmVsb2FkKCl7dGhpcy4kWyJocGFyYW1zLW1haW4iXS5yZWxvYWQoKX19O1BLdC50ZW1wbGF0ZT1fZWAKICAgIDwhLS0gVGVuc29yQm9hcmQgZG9lcyBub3Qgc3BlY2lmeSBhbiBleHBlcmltZW50TmFtZS4gQ3VycmVudGx5IGl0IG9ubHkKICAgICAgICAgc3VwcG9ydHMgb25lIGV4cGVyaW1lbnQgcGVyIGludm9jYXRpb24uIC0tPgogICAgPHRmLWhwYXJhbXMtbWFpbgogICAgICBpZD0iaHBhcmFtcy1tYWluIgogICAgICBiYWNrZW5kPSJbW19iYWNrZW5kXV0iCiAgICAgIGV4cGVyaW1lbnQtbmFtZT0iIgogICAgPgogICAgPC90Zi1ocGFyYW1zLW1haW4+CiAgYCx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxQS3QucHJvdG90eXBlLCJfYmFja2VuZCIsdm9pZCAwKSxQS3Q9dChbaSgidGYtaHBhcmFtcy1kYXNoYm9hcmQiKV0sUEt0KTtsZXQgTkt0PWNsYXNzIGV4dGVuZHMoZXIoeWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5hY3R1YWxTaXplPSExLHRoaXMuYnJpZ2h0bmVzc0FkanVzdG1lbnQ9LjUsdGhpcy5jb250cmFzdFBlcmNlbnRhZ2U9MCx0aGlzLl9tZXRhZGF0YUNhbmNlbGxlcj1uZXcgWFIsdGhpcy5faW1hZ2VDYW5jZWxsZXI9bmV3IFhSLHRoaXMuX3N0ZXBzPVtdLHRoaXMuX2lzSW1hZ2VMb2FkaW5nPSExfWdldCBfcnVuQ29sb3IoKXtyZXR1cm4gR1IodGhpcy5ydW4pfWdldCBfaGFzQXRMZWFzdE9uZVN0ZXAoKXt2YXIgdD10aGlzLl9zdGVwcztyZXR1cm4hIXQmJnQubGVuZ3RoPjB9Z2V0IF9oYXNNdWx0aXBsZVN0ZXBzKCl7dmFyIHQ9dGhpcy5fc3RlcHM7cmV0dXJuISF0JiZ0Lmxlbmd0aD4xfWdldCBfY3VycmVudFN0ZXAoKXtyZXR1cm4gdGhpcy5fc3RlcHNbdGhpcy5fc3RlcEluZGV4XXx8bnVsbH1nZXQgX3N0ZXBWYWx1ZSgpe3ZhciB0PXRoaXMuX2N1cnJlbnRTdGVwO3JldHVybiB0P3Quc3RlcDowfWdldCBfY3VycmVudFdhbGxUaW1lKCl7dmFyIHQ9dGhpcy5fY3VycmVudFN0ZXA7cmV0dXJuIHQ/S1IodC53YWxsX3RpbWUpOiIifWdldCBfbWF4U3RlcEluZGV4KCl7cmV0dXJuIHRoaXMuX3N0ZXBzLmxlbmd0aC0xfWdldCBfc2FtcGxlVGV4dCgpe3JldHVybmAke3RoaXMuc2FtcGxlKzF9YH1nZXQgX2hhc011bHRpcGxlU2FtcGxlcygpe3JldHVybiB0aGlzLm9mU2FtcGxlcz4xfV9nZXRBcmlhRXhwYW5kZWQoKXtyZXR1cm4gdGhpcy5hY3R1YWxTaXplPyJ0cnVlIjoiZmFsc2UifWF0dGFjaGVkKCl7dGhpcy5yZWxvYWQoKX1yZWxvYWQoKXtpZighdGhpcy5pc0F0dGFjaGVkKXJldHVybjt0aGlzLl9tZXRhZGF0YUNhbmNlbGxlci5jYW5jZWxBbGwoKTtjb25zdCB0PWlPKF9yKCkucGx1Z2luUm91dGUoImltYWdlcyIsIi9pbWFnZXMiKSx7dGFnOnRoaXMudGFnLHJ1bjp0aGlzLnJ1bixzYW1wbGU6dGhpcy5zYW1wbGV9KSxlPXRoaXMuX21ldGFkYXRhQ2FuY2VsbGVyLmNhbmNlbGxhYmxlKCh0PT57aWYodC5jYW5jZWxsZWQpcmV0dXJuO2NvbnN0IGU9dC52YWx1ZS5tYXAodGhpcy5fY3JlYXRlU3RlcERhdHVtLmJpbmQodGhpcykpO3RoaXMuc2V0KCJfc3RlcHMiLGUpLHRoaXMuc2V0KCJfc3RlcEluZGV4IixlLmxlbmd0aC0xKX0pKTt0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodCkudGhlbihlKX1fY3JlYXRlU3RlcERhdHVtKHQpe2xldCBlPV9yKCkucGx1Z2luUm91dGUoImltYWdlcyIsIi9pbmRpdmlkdWFsSW1hZ2UiKTtyZXR1cm4gZT1pTyhlLHt0czp0LndhbGxfdGltZX0pLGUrPSImIit0LnF1ZXJ5LHt3YWxsX3RpbWU6bmV3IERhdGUoMWUzKnQud2FsbF90aW1lKSxzdGVwOnQuc3RlcCx1cmw6ZX19X3VwZGF0ZUltYWdlVXJsKCl7dmFyIHQ9dGhpcy5fY3VycmVudFN0ZXAsZT10aGlzLmJyaWdodG5lc3NBZGp1c3RtZW50LG49dGhpcy5jb250cmFzdFBlcmNlbnRhZ2U7aWYoIXQpcmV0dXJuO2NvbnN0IGk9bmV3IEltYWdlO3RoaXMuX2ltYWdlQ2FuY2VsbGVyLmNhbmNlbEFsbCgpLGkub25sb2FkPWkub25lcnJvcj10aGlzLl9pbWFnZUNhbmNlbGxlci5jYW5jZWxsYWJsZSgodD0+e2lmKHQuY2FuY2VsbGVkKXJldHVybjtjb25zdCBlPXRoaXMuJCQoIiNtYWluLWltYWdlLWNvbnRhaW5lciIpO2UudGV4dENvbnRlbnQ9IiIsWWkoZSkuYXBwZW5kQ2hpbGQoaSksdGhpcy5zZXQoIl9pc0ltYWdlTG9hZGluZyIsITEpfSkpLmJpbmQodGhpcyksaS5zdHlsZS5maWx0ZXI9YGNvbnRyYXN0KCR7bn0lKSBgLGkuc3R5bGUuZmlsdGVyKz1gYnJpZ2h0bmVzcygke2V9KWAsdGhpcy5zZXQoIl9pc0ltYWdlTG9hZGluZyIsITApLGkuc3JjPXQudXJsfV9oYW5kbGVUYXAodCl7dGhpcy5zZXQoImFjdHVhbFNpemUiLCF0aGlzLmFjdHVhbFNpemUpfV90b0xvY2FsZVN0cmluZyh0KXtyZXR1cm4gdC50b0xvY2FsZVN0cmluZygpfX07Tkt0LnRlbXBsYXRlPV9lYAogICAgPHRmLWNhcmQtaGVhZGluZwogICAgICB0YWc9IltbdGFnXV0iCiAgICAgIHJ1bj0iW1tydW5dXSIKICAgICAgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iCiAgICAgIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iCiAgICAgIGNvbG9yPSJbW19ydW5Db2xvcl1dIgogICAgPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU2FtcGxlc11dIj4KICAgICAgICA8ZGl2PnNhbXBsZTogW1tfc2FtcGxlVGV4dF1dIG9mIFtbb2ZTYW1wbGVzXV08L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNBdExlYXN0T25lU3RlcF1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgc3RlcAogICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiCiAgICAgICAgICAgICAgPltbX3RvTG9jYWxlU3RyaW5nKF9zdGVwVmFsdWUpXV08L3NwYW4KICAgICAgICAgICAgPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIGhlYWRpbmctcmlnaHQgZGF0ZXRpbWUiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2N1cnJlbnRXYWxsVGltZV1dIj4KICAgICAgICAgICAgICBbW19jdXJyZW50V2FsbFRpbWVdXQogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCByaWdodCI+CiAgICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlIGhpZGRlbiQ9IltbIV9pc0ltYWdlTG9hZGluZ11dIj4KICAgICAgICAgICAgPC9wYXBlci1zcGlubmVyLWxpdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVN0ZXBzXV0iPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItc2xpZGVyCiAgICAgICAgICAgIGlkPSJzdGVwcyIKICAgICAgICAgICAgaW1tZWRpYXRlLXZhbHVlPSJ7e19zdGVwSW5kZXh9fSIKICAgICAgICAgICAgbWF4PSJbW19tYXhTdGVwSW5kZXhdXSIKICAgICAgICAgICAgbWF4LW1hcmtlcnM9IltbX21heFN0ZXBJbmRleF1dIgogICAgICAgICAgICBzbmFwcwogICAgICAgICAgICBzdGVwPSIxIgogICAgICAgICAgICB2YWx1ZT0ie3tfc3RlcEluZGV4fX0iCiAgICAgICAgICA+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KCiAgICA8IS0tIFNlbWFudGljYWxseSBhIGJ1dHRvbiBidXQgPGltZz4gaW5zaWRlIGEgPGJ1dHRvbj4gZGlzYWxsb3dzIHVzZXIgdG8gZG8KICAgIGFuIGludGVyZXN0aW5nIG9wZXJhdGlvbiBsaWtlICJDb3B5IEltYWdlIiBpbiBub24tQ2hyb21pdW0gYnJvd3NlcnMuIC0tPgogICAgPGEKICAgICAgaWQ9Im1haW4taW1hZ2UtY29udGFpbmVyIgogICAgICByb2xlPSJidXR0b24iCiAgICAgIGFyaWEtbGFiZWw9IlRvZ2dsZSBhY3R1YWwgc2l6ZSIKICAgICAgYXJpYS1leHBhbmRlZCQ9IltbX2dldEFyaWFFeHBhbmRlZChhY3R1YWxTaXplKV1dIgogICAgICBvbi10YXA9Il9oYW5kbGVUYXAiCiAgICA+PC9hPgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1jYXJkLWhlYWRpbmctc3R5bGUiPgogICAgICAvKiogTWFrZSBidXR0b24gYSBkaXYuICovCiAgICAgIGJ1dHRvbiB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLyoqIEZpcmVmb3g6IEdldCByaWQgb2YgZG90dGVkIGxpbmUgaW5zaWRlIGJ1dHRvbi4gKi8KICAgICAgYnV0dG9uOjotbW96LWZvY3VzLWlubmVyIHsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLyoqIEZpcmVmb3g6IFNpbXVsYXRlIENocm9tZSdzIG91dGVyIGdsb3cgb24gYnV0dG9uIHdoZW4gZm9jdXNlZC4gKi8KICAgICAgYnV0dG9uOi1tb3otZm9jdXNyaW5nIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJveC1zaGFkb3c6IDBweCAwcHggMXB4IDJweCBIaWdobGlnaHQ7CiAgICAgIH0KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMzUwcHg7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtYXJnaW46IDAgMTVweCA0MHB4IDA7CiAgICAgICAgb3ZlcmZsb3cteDogYXV0bzsKICAgICAgfQoKICAgICAgLyoqIFdoZW4gYWN0dWFsIHNpemUgc2hvd24gaXMgb24sIHVzZSB0aGUgYWN0dWFsIGltYWdlIHdpZHRoLiAqLwogICAgICA6aG9zdChbYWN0dWFsLXNpemVdKSB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIHdpZHRoOiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbYWN0dWFsLXNpemVdKSAjbWFpbi1pbWFnZS1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IG5vbmU7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgIH0KCiAgICAgIDpob3N0KFthY3R1YWwtc2l6ZV0pICNtYWluLWltYWdlLWNvbnRhaW5lciBpbWcgewogICAgICAgIHdpZHRoOiBhdXRvOwogICAgICB9CgogICAgICBwYXBlci1zcGlubmVyLWxpdGUgewogICAgICAgIHdpZHRoOiAxNHB4OwogICAgICAgIGhlaWdodDogMTRweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC1ib3R0b207CiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgfQoKICAgICAgI3N0ZXBzIHsKICAgICAgICBoZWlnaHQ6IDE1cHg7CiAgICAgICAgbWFyZ2luOiAwIDAgMCAtMTVweDsKICAgICAgICAvKgogICAgICAgICAqIDMxIGNvbWVzIGZyb20gYWRkaW5nIGEgcGFkZGluZyBvZiAxNXB4IGZyb20gYm90aCBzaWRlcyBvZiB0aGUKICAgICAgICAgKiBwYXBlci1zbGlkZXIsIHN1YnRyYWN0aW5nIDFweCBzbyB0aGF0IHRoZSBzbGlkZXIgd2lkdGggYWxpZ25zCiAgICAgICAgICogd2l0aCB0aGUgaW1hZ2UgKHRoZSBsYXN0IHNsaWRlciBtYXJrZXIgdGFrZXMgdXAgMXB4KSwgYW5kCiAgICAgICAgICogYWRkaW5nIDJweCB0byBhY2NvdW50IGZvciBhIGJvcmRlciBvZiAxcHggb24gYm90aCBzaWRlcyBvZgogICAgICAgICAqIHRoZSBpbWFnZS4gMzAgLSAxICsgMi4KICAgICAgICAgKi8KICAgICAgICB3aWR0aDogY2FsYygxMDAlICsgMzFweCk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICB9CgogICAgICAjbWFpbi1pbWFnZS1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IDEwMjRweDsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQoKICAgICAgI21haW4taW1hZ2UtY29udGFpbmVyIGltZyB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGltYWdlLXJlbmRlcmluZzogLW1vei1jcmlzcC1lZGdlczsKICAgICAgICBpbWFnZS1yZW5kZXJpbmc6IHBpeGVsYXRlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CiAgICAgIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sTkt0LnByb3RvdHlwZSwicnVuIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLE5LdC5wcm90b3R5cGUsInRhZyIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxOS3QucHJvdG90eXBlLCJzYW1wbGUiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sTkt0LnByb3RvdHlwZSwib2ZTYW1wbGVzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLE5LdC5wcm90b3R5cGUsInRhZ01ldGFkYXRhIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLE5LdC5wcm90b3R5cGUsImFjdHVhbFNpemUiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sTkt0LnByb3RvdHlwZSwiYnJpZ2h0bmVzc0FkanVzdG1lbnQiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sTkt0LnByb3RvdHlwZSwiY29udHJhc3RQZXJjZW50YWdlIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLGRyKV0sTkt0LnByb3RvdHlwZSwicmVxdWVzdE1hbmFnZXIiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTkt0LnByb3RvdHlwZSwiX21ldGFkYXRhQ2FuY2VsbGVyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLE5LdC5wcm90b3R5cGUsIl9pbWFnZUNhbmNlbGxlciIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLE5LdC5wcm90b3R5cGUsIl9zdGVwcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcixub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sTkt0LnByb3RvdHlwZSwiX3N0ZXBJbmRleCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLE5LdC5wcm90b3R5cGUsIl9pc0ltYWdlTG9hZGluZyIsdm9pZCAwKSx0KFtzKCJydW4iKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxOS3QucHJvdG90eXBlLCJfcnVuQ29sb3IiLG51bGwpLHQoW3MoIl9zdGVwcyIpLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxOS3QucHJvdG90eXBlLCJfaGFzQXRMZWFzdE9uZVN0ZXAiLG51bGwpLHQoW3MoIl9zdGVwcyIpLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxOS3QucHJvdG90eXBlLCJfaGFzTXVsdGlwbGVTdGVwcyIsbnVsbCksdChbcygiX3N0ZXBzIiwiX3N0ZXBJbmRleCIpLGUoImRlc2lnbjp0eXBlIixPYmplY3QpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLE5LdC5wcm90b3R5cGUsIl9jdXJyZW50U3RlcCIsbnVsbCksdChbcygiX2N1cnJlbnRTdGVwIiksZSgiZGVzaWduOnR5cGUiLE51bWJlciksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sTkt0LnByb3RvdHlwZSwiX3N0ZXBWYWx1ZSIsbnVsbCksdChbcygiX2N1cnJlbnRTdGVwIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sTkt0LnByb3RvdHlwZSwiX2N1cnJlbnRXYWxsVGltZSIsbnVsbCksdChbcygiX3N0ZXBzIiksZSgiZGVzaWduOnR5cGUiLE51bWJlciksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sTkt0LnByb3RvdHlwZSwiX21heFN0ZXBJbmRleCIsbnVsbCksdChbcygic2FtcGxlIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sTkt0LnByb3RvdHlwZSwiX3NhbXBsZVRleHQiLG51bGwpLHQoW3MoIm9mU2FtcGxlcyIpLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxOS3QucHJvdG90eXBlLCJfaGFzTXVsdGlwbGVTYW1wbGVzIixudWxsKSx0KFthKCJydW4iLCJ0YWciKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLE5LdC5wcm90b3R5cGUsInJlbG9hZCIsbnVsbCksdChbYSgiX2N1cnJlbnRTdGVwIiwiYnJpZ2h0bmVzc0FkanVzdG1lbnQiLCJjb250cmFzdFBlcmNlbnRhZ2UiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLE5LdC5wcm90b3R5cGUsIl91cGRhdGVJbWFnZVVybCIsbnVsbCksTkt0PXQoW2koInRmLWltYWdlLWxvYWRlciIpXSxOS3QpO2xldCBJS3Q9Y2xhc3MgZXh0ZW5kcyhlcih5ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnJlbG9hZE9uUmVhZHk9ITAsdGhpcy5fZGVmYXVsdEJyaWdodG5lc3NBZGp1c3RtZW50PTEsdGhpcy5fZGVmYXVsdENvbnRyYXN0UGVyY2VudGFnZT0xMDAsdGhpcy5fYnJpZ2h0bmVzc0FkanVzdG1lbnQ9MSx0aGlzLl9jb250cmFzdFBlcmNlbnRhZ2U9MTAwLHRoaXMuX3JlcXVlc3RNYW5hZ2VyPW5ldyBkcn1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5yZWxvYWRPblJlYWR5JiZ0aGlzLnJlbG9hZCgpfXJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCgpPT57dGhpcy5fcmVsb2FkSW1hZ2VzKCl9KSl9X2ZldGNoVGFncygpe2NvbnN0IHQ9X3IoKS5wbHVnaW5Sb3V0ZSgiaW1hZ2VzIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0KS50aGVuKCh0PT57aWYoU2UuZXhwb3J0cy5pc0VxdWFsKHQsdGhpcy5fcnVuVG9UYWdJbmZvKSlyZXR1cm47Y29uc3QgZT1hcihTZS5leHBvcnRzLm1hcFZhbHVlcyh0LCh0PT5PYmplY3Qua2V5cyh0KSkpKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWUubGVuZ3RoKSx0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsdCksdGhpcy5hc3luYygoKCk9Pnt0aGlzLnNldCgiX2NhdGVnb3JpZXNEb21SZWFkeSIsITApfSkpfSkpfV9yZWxvYWRJbWFnZXMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtaW1hZ2UtbG9hZGVyIikuZm9yRWFjaCgodD0+e3QucmVsb2FkKCl9KSl9X3Nob3VsZE9wZW4odCl7cmV0dXJuIHQ8PTJ9X3Jlc2V0QnJpZ2h0bmVzcygpe3RoaXMuX2JyaWdodG5lc3NBZGp1c3RtZW50PXRoaXMuX2RlZmF1bHRCcmlnaHRuZXNzQWRqdXN0bWVudH1fcmVzZXRDb250cmFzdCgpe3RoaXMuX2NvbnRyYXN0UGVyY2VudGFnZT10aGlzLl9kZWZhdWx0Q29udHJhc3RQZXJjZW50YWdlfWdldCBfYnJpZ2h0bmVzc0lzRGVmYXVsdCgpe3JldHVybiB0aGlzLl9icmlnaHRuZXNzQWRqdXN0bWVudD09PXRoaXMuX2RlZmF1bHRCcmlnaHRuZXNzQWRqdXN0bWVudH1nZXQgX2NvbnRyYXN0SXNEZWZhdWx0KCl7cmV0dXJuIHRoaXMuX2NvbnRyYXN0UGVyY2VudGFnZT09PXRoaXMuX2RlZmF1bHRDb250cmFzdFBlcmNlbnRhZ2V9Z2V0IF9jYXRlZ29yaWVzKCl7dmFyIHQ9dGhpcy5fcnVuVG9UYWdJbmZvLGU9dGhpcy5fc2VsZWN0ZWRSdW5zLG49dGhpcy5fdGFnRmlsdGVyO2Z1bmN0aW9uIGkoZSl7Y29uc3Qgbj10W2UucnVuXVtlLnRhZ10uc2FtcGxlcztyZXR1cm4gU2UuZXhwb3J0cy5yYW5nZShuKS5tYXAoKHQ9Pk9iamVjdC5hc3NpZ24oe30sZSx7c2FtcGxlOnQsb2ZTYW1wbGVzOm59KSkpfXJldHVybiBNcihTZS5leHBvcnRzLm1hcFZhbHVlcyh0LCh0PT5PYmplY3Qua2V5cyh0KSkpLGUsbikubWFwKCh0PT5PYmplY3QuYXNzaWduKHt9LHQse2l0ZW1zOltdLmNvbmNhdC5hcHBseShbXSx0Lml0ZW1zLm1hcChpKSl9KSkpfV90YWdNZXRhZGF0YSh0LGUsbil7cmV0dXJuIHRbZV1bbl19fTt2YXIgUkt0LE9LdCx6S3Q7SUt0LnRlbXBsYXRlPV9lYAogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxpbmUtaXRlbSI+CiAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7X2FjdHVhbFNpemV9fSIKICAgICAgICAgICAgICAgID5TaG93IGFjdHVhbCBpbWFnZSBzaXplPC9wYXBlci1jaGVja2JveAogICAgICAgICAgICAgID4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxoMyBjbGFzcz0idG9vbHRpcC1jb250YWluZXIiPkJyaWdodG5lc3MgYWRqdXN0bWVudDwvaDM+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgPHBhcGVyLXNsaWRlcgogICAgICAgICAgICAgICAgbWluPSIwIgogICAgICAgICAgICAgICAgbWF4PSIyIgogICAgICAgICAgICAgICAgc25hcHMKICAgICAgICAgICAgICAgIHBpbgogICAgICAgICAgICAgICAgc3RlcD0iMC4wMSIKICAgICAgICAgICAgICAgIHZhbHVlPSJ7e19icmlnaHRuZXNzQWRqdXN0bWVudH19IgogICAgICAgICAgICAgICAgaW1tZWRpYXRlLXZhbHVlPSJ7e19icmlnaHRuZXNzQWRqdXN0bWVudH19IgogICAgICAgICAgICAgID48L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgICBjbGFzcz0ieC1idXR0b24iCiAgICAgICAgICAgICAgICBvbi10YXA9Il9yZXNldEJyaWdodG5lc3MiCiAgICAgICAgICAgICAgICBkaXNhYmxlZD0iW1tfYnJpZ2h0bmVzc0lzRGVmYXVsdF1dIgogICAgICAgICAgICAgICAgPlJlc2V0PC9wYXBlci1idXR0b24KICAgICAgICAgICAgICA+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8aDMgY2xhc3M9InRvb2x0aXAtY29udGFpbmVyIj5Db250cmFzdCBhZGp1c3RtZW50PC9oMz4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIj4KICAgICAgICAgICAgICA8cGFwZXItc2xpZGVyCiAgICAgICAgICAgICAgICBtaW49IjAiCiAgICAgICAgICAgICAgICBtYXg9IjUwMCIKICAgICAgICAgICAgICAgIHNuYXBzCiAgICAgICAgICAgICAgICBwaW4KICAgICAgICAgICAgICAgIHN0ZXA9IjEiCiAgICAgICAgICAgICAgICB2YWx1ZT0ie3tfY29udHJhc3RQZXJjZW50YWdlfX0iCiAgICAgICAgICAgICAgICBpbW1lZGlhdGUtdmFsdWU9Int7X2NvbnRyYXN0UGVyY2VudGFnZX19IgogICAgICAgICAgICAgID48L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgICBjbGFzcz0ieC1idXR0b24iCiAgICAgICAgICAgICAgICBvbi10YXA9Il9yZXNldENvbnRyYXN0IgogICAgICAgICAgICAgICAgZGlzYWJsZWQ9IltbX2NvbnRyYXN0SXNEZWZhdWx0XV0iCiAgICAgICAgICAgICAgICA+UmVzZXQ8L3BhcGVyLWJ1dHRvbgogICAgICAgICAgICAgID4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24gcnVucy1zZWxlY3RvciI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvcgogICAgICAgICAgICBpZD0icnVucy1zZWxlY3RvciIKICAgICAgICAgICAgc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iCiAgICAgICAgICA+PC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGltYWdlIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczo8L3A+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBpbWFnZSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIKICAgICAgICAgICAgICAgID5SRUFETUU8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiCiAgICAgICAgICAgICAgICA+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2EKICAgICAgICAgICAgICA+LgogICAgICAgICAgICA8L3A+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIgogICAgICAgICAgICAgICAgPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldwogICAgICAgICAgICAgIGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iCiAgICAgICAgICAgICAgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtaW1hZ2UtbG9hZGVyCiAgICAgICAgICAgICAgICAgIGFjdGl2ZT0iW1thY3RpdmVdXSIKICAgICAgICAgICAgICAgICAgcnVuPSJbW2l0ZW0ucnVuXV0iCiAgICAgICAgICAgICAgICAgIHRhZz0iW1tpdGVtLnRhZ11dIgogICAgICAgICAgICAgICAgICBzYW1wbGU9IltbaXRlbS5zYW1wbGVdXSIKICAgICAgICAgICAgICAgICAgb2Ytc2FtcGxlcz0iW1tpdGVtLm9mU2FtcGxlc11dIgogICAgICAgICAgICAgICAgICB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVuLCBpdGVtLnRhZyldXSIKICAgICAgICAgICAgICAgICAgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIgogICAgICAgICAgICAgICAgICBhY3R1YWwtc2l6ZT0iW1tfYWN0dWFsU2l6ZV1dIgogICAgICAgICAgICAgICAgICBicmlnaHRuZXNzLWFkanVzdG1lbnQ9IltbX2JyaWdodG5lc3NBZGp1c3RtZW50XV0iCiAgICAgICAgICAgICAgICAgIGNvbnRyYXN0LXBlcmNlbnRhZ2U9IltbX2NvbnRyYXN0UGVyY2VudGFnZV1dIgogICAgICAgICAgICAgICAgPjwvdGYtaW1hZ2UtbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLnJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAucmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIHBhcGVyLXNsaWRlciB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICAgIC5yZXNldHRhYmxlLXNsaWRlci1jb250YWluZXIgcGFwZXItYnV0dG9uIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgLnJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciBwYXBlci1idXR0b25bZGlzYWJsZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB1bnNldDsKICAgICAgfQogICAgICAueC1idXR0b24gewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgIH0KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgICAgcGFwZXItc2xpZGVyIHsKICAgICAgICAtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1tYXJrZXJzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLElLdC5wcm90b3R5cGUsInJlbG9hZE9uUmVhZHkiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLElLdC5wcm90b3R5cGUsIl9zZWxlY3RlZFJ1bnMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sSUt0LnByb3RvdHlwZSwiX3J1blRvVGFnSW5mbyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLElLdC5wcm90b3R5cGUsIl9kYXRhTm90Rm91bmQiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxJS3QucHJvdG90eXBlLCJfYWN0dWFsU2l6ZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxJS3QucHJvdG90eXBlLCJfZGVmYXVsdEJyaWdodG5lc3NBZGp1c3RtZW50Iix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLElLdC5wcm90b3R5cGUsIl9kZWZhdWx0Q29udHJhc3RQZXJjZW50YWdlIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLElLdC5wcm90b3R5cGUsIl9icmlnaHRuZXNzQWRqdXN0bWVudCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxJS3QucHJvdG90eXBlLCJfY29udHJhc3RQZXJjZW50YWdlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLElLdC5wcm90b3R5cGUsIl90YWdGaWx0ZXIiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxJS3QucHJvdG90eXBlLCJfY2F0ZWdvcmllc0RvbVJlYWR5Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLElLdC5wcm90b3R5cGUsIl9yZXF1ZXN0TWFuYWdlciIsdm9pZCAwKSx0KFtzKCJfYnJpZ2h0bmVzc0FkanVzdG1lbnQiKSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sSUt0LnByb3RvdHlwZSwiX2JyaWdodG5lc3NJc0RlZmF1bHQiLG51bGwpLHQoW3MoIl9jb250cmFzdFBlcmNlbnRhZ2UiKSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sSUt0LnByb3RvdHlwZSwiX2NvbnRyYXN0SXNEZWZhdWx0IixudWxsKSx0KFtzKCJfcnVuVG9UYWdJbmZvIiwiX3NlbGVjdGVkUnVucyIsIl90YWdGaWx0ZXIiLCJfY2F0ZWdvcmllc0RvbVJlYWR5IiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxJS3QucHJvdG90eXBlLCJfY2F0ZWdvcmllcyIsbnVsbCksSUt0PXQoW2koInRmLWltYWdlLWRhc2hib2FyZCIpXSxJS3QpLChmdW5jdGlvbih0KXt0W3QuQ0FOQ0VMTEVEPTFdPSJDQU5DRUxMRUQifSkoUkt0fHwoUkt0PXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5WRVJURVg9MV09IlZFUlRFWCIsdFt0LkZBQ0U9Ml09IkZBQ0UiLHRbdC5DT0xPUj0zXT0iQ09MT1IifSkoT0t0fHwoT0t0PXt9KSksKGZ1bmN0aW9uKHQpe3QuVkVSVEVYPSJmbG9hdDMyIix0LkZBQ0U9ImludDMyIix0LkNPTE9SPSJ1aW50OCJ9KSh6S3R8fCh6S3Q9e30pKTtjbGFzcyBES3R7Y29uc3RydWN0b3IodCl7dGhpcy5fY2FuY2VsbGVyPW5ldyBYUix0aGlzLl9yZXF1ZXN0TWFuYWdlcj10fXJlbG9hZCh0LGUsbil7cmV0dXJuIHRoaXMuX2NhbmNlbGxlci5jYW5jZWxBbGwoKSx0aGlzLl9mZXRjaE1ldGFkYXRhKHQsZSxuKX1fZmV0Y2hEYXRhQnlTdGVwKHQsZSxuLGkscixvKXtjb25zdCBhPV9yKCkucGx1Z2luUm91dGUoIm1lc2giLCIvZGF0YSIsbmV3IFVSTFNlYXJjaFBhcmFtcyh7dGFnOmUscnVuOnQsY29udGVudF90eXBlOm4sc2FtcGxlOlN0cmluZyhpKSxzdGVwOlN0cmluZyhyKX0pKSxzPWZ1bmN0aW9uKHQpe2xldCBlPVtdO2ZvcihsZXQgbj0wO248dC5sZW5ndGgvMztuKyspe2xldCBpPVtdO2ZvcihsZXQgZT0wO2U8MztlKyspaS5wdXNoKHRbMypuK2VdKTtlLnB1c2goaSl9cmV0dXJuIGV9LGw9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKCh0PT57aWYodC5jYW5jZWxsZWQpcmV0dXJuIFByb21pc2UucmVqZWN0KHtjb2RlOlJLdC5DQU5DRUxMRUQsbWVzc2FnZToiUmVzcG9uc2Ugd2FzIGludmFsaWRhdGVkLiJ9KTtsZXQgZT10LnZhbHVlO3N3aXRjaChuKXtjYXNlIlZFUlRFWCI6by52ZXJ0aWNlcz1zKG5ldyBGbG9hdDMyQXJyYXkoZSkpO2JyZWFrO2Nhc2UiRkFDRSI6by5mYWNlcz1zKG5ldyBJbnQzMkFycmF5KGUpKTticmVhaztjYXNlIkNPTE9SIjpvLmNvbG9ycz1zKG5ldyBVaW50OEFycmF5KGUpKX1yZXR1cm4gb30pKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIuZmV0Y2goYSx7bWV0aG9kOiJHRVQiLGhlYWRlcnM6e3Jlc3BvbnNlVHlwZToiYXJyYXlidWZmZXIiLGNvbnRlbnRUeXBlOnpLdFtuXX19KS50aGVuKCh0PT50LmFycmF5QnVmZmVyKCkpKS50aGVuKGwpfWZldGNoRGF0YSh0LGUsbixpKXtsZXQgcj1bXSxvPW5ldyBNYXA7cmV0dXJuIE9iamVjdC5rZXlzKE9LdCkuZm9yRWFjaCgoYT0+e3QuY29tcG9uZW50cyYxPDxPS3RbYV0mJnIucHVzaCh0aGlzLl9mZXRjaERhdGFCeVN0ZXAoZSxuLGEsaSx0LnN0ZXAsbykpfSkpLFByb21pc2UuYWxsKHIpfV9mZXRjaE1ldGFkYXRhKHQsZSxuKXt0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7Y29uc3QgaT1fcigpLnBsdWdpblJvdXRlKCJtZXNoIiwiL21lc2hlcyIsbmV3IFVSTFNlYXJjaFBhcmFtcyh7dGFnOmUscnVuOnQsc2FtcGxlOm59KSkscj10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoKHQ9PnQuY2FuY2VsbGVkP1Byb21pc2UucmVqZWN0KHtjb2RlOlJLdC5DQU5DRUxMRUQsbWVzc2FnZToiUmVzcG9uc2Ugd2FzIGludmFsaWRhdGVkLiJ9KTp0LnZhbHVlKSk7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLmZldGNoKGkpLnRoZW4oKHQ9PnQuanNvbigpKSkudGhlbihyKS50aGVuKHRoaXMuX3Byb2Nlc3NNZXRhZGF0YS5iaW5kKHRoaXMpKX1fcHJvY2Vzc01ldGFkYXRhKHQpe2lmKCF0KXJldHVybjtjb25zdCBlPW5ldyBNYXA7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2xldCBpPXRbbl07ZS5oYXMoaS5zdGVwKXx8ZS5zZXQoaS5zdGVwLFtdKSxlLmdldChpLnN0ZXApLnB1c2goaSl9bGV0IG49W107cmV0dXJuIGUuZm9yRWFjaCgodD0+e2xldCBlPXRoaXMuX2NyZWF0ZVN0ZXBEYXR1bSh0WzBdKTtuLnB1c2goZSl9KSksbn1fY3JlYXRlU3RlcERhdHVtKHQpe3JldHVybnt3YWxsX3RpbWU6bmV3IERhdGUoMWUzKnQud2FsbF90aW1lKSxzdGVwOnQuc3RlcCxjb25maWc6dC5jb25maWcsY29udGVudF90eXBlOnQuY29udGVudF90eXBlLGNvbXBvbmVudHM6dC5jb21wb25lbnRzfX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAyMDEwLTIwMjEgVGhyZWUuanMgQXV0aG9ycwogICAgICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAogICAgICovY29uc3QgQkt0PSIxMzEiLEhLdD17TEVGVDowLE1JRERMRToxLFJJR0hUOjIsUk9UQVRFOjAsRE9MTFk6MSxQQU46Mn0sRkt0PXtST1RBVEU6MCxQQU46MSxET0xMWV9QQU46MixET0xMWV9ST1RBVEU6M30sVkt0PTEwMCxVS3Q9MzAwLGpLdD0zMDEsR0t0PTMwMixXS3Q9MzAzLHFLdD0zMDQsWUt0PTMwNixYS3Q9MzA3LCRLdD0xZTMsS0t0PTEwMDEsWkt0PTEwMDIsSkt0PTEwMDMsUUt0PTEwMDQsdFp0PTEwMDUsZVp0PTEwMDYsblp0PTEwMDcsaVp0PTEwMDgsclp0PTEwMDksb1p0PTEwMTIsYVp0PTEwMTQsc1p0PTEwMTUsbFp0PTEwMTYsY1p0PTEwMjAsdVp0PTEwMjIsaFp0PTEwMjMsZFp0PTEwMjYscFp0PTEwMjcsZlp0PTMzNzc2LG1adD0zMzc3NyxnWnQ9MzM3NzgsX1p0PTMzNzc5LHladD0zNTg0MCx2WnQ9MzU4NDEsYlp0PTM1ODQyLHhadD0zNTg0Myx3WnQ9Mzc0OTIsU1p0PTM3NDk2LE1adD0yMzAwLEVadD0yMzAxLFRadD0yMzAyLENadD0yNDAwLEFadD0yNDAxLGtadD0yNDAyLExadD0yNTAwLFBadD0yNTAxLE5adD0zZTMsSVp0PTMwMDEsUlp0PTMwMDcsT1p0PTMwMDIselp0PTMwMDQsRFp0PTMwMDUsQlp0PTMwMDYsSFp0PTc2ODAsRlp0PTM1MDQ0LFZadD0zNTA0OCxVWnQ9IjMwMCBlcyI7Y2xhc3Mgalp0e2FkZEV2ZW50TGlzdGVuZXIodCxlKXt2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMmJih0aGlzLl9saXN0ZW5lcnM9e30pO2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzO3ZvaWQgMD09PW5bdF0mJihuW3RdPVtdKSwtMT09PW5bdF0uaW5kZXhPZihlKSYmblt0XS5wdXNoKGUpfWhhc0V2ZW50TGlzdGVuZXIodCxlKXtpZih2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMpcmV0dXJuITE7Y29uc3Qgbj10aGlzLl9saXN0ZW5lcnM7cmV0dXJuIHZvaWQgMCE9PW5bdF0mJi0xIT09blt0XS5pbmRleE9mKGUpfXJlbW92ZUV2ZW50TGlzdGVuZXIodCxlKXtpZih2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMpcmV0dXJuO2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzW3RdO2lmKHZvaWQgMCE9PW4pe2NvbnN0IHQ9bi5pbmRleE9mKGUpOy0xIT09dCYmbi5zcGxpY2UodCwxKX19ZGlzcGF0Y2hFdmVudCh0KXtpZih2b2lkIDA9PT10aGlzLl9saXN0ZW5lcnMpcmV0dXJuO2NvbnN0IGU9dGhpcy5fbGlzdGVuZXJzW3QudHlwZV07aWYodm9pZCAwIT09ZSl7dC50YXJnZXQ9dGhpcztjb25zdCBuPWUuc2xpY2UoMCk7Zm9yKGxldCBlPTAsaT1uLmxlbmd0aDtlPGk7ZSsrKW5bZV0uY2FsbCh0aGlzLHQpO3QudGFyZ2V0PW51bGx9fX1jb25zdCBHWnQ9W107Zm9yKGxldCB0PTA7dDwyNTY7dCsrKUdadFt0XT0odDwxNj8iMCI6IiIpK3QudG9TdHJpbmcoMTYpO2xldCBXWnQ9MTIzNDU2Nztjb25zdCBxWnQ9TWF0aC5QSS8xODAsWVp0PTE4MC9NYXRoLlBJO2Z1bmN0aW9uIFhadCgpe2NvbnN0IHQ9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAsZT00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxuPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLGk9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDA7cmV0dXJuKEdadFsyNTUmdF0rR1p0W3Q+PjgmMjU1XStHWnRbdD4+MTYmMjU1XStHWnRbdD4+MjQmMjU1XSsiLSIrR1p0WzI1NSZlXStHWnRbZT4+OCYyNTVdKyItIitHWnRbZT4+MTYmMTV8NjRdK0dadFtlPj4yNCYyNTVdKyItIitHWnRbNjMmbnwxMjhdK0dadFtuPj44JjI1NV0rIi0iK0dadFtuPj4xNiYyNTVdK0dadFtuPj4yNCYyNTVdK0dadFsyNTUmaV0rR1p0W2k+PjgmMjU1XStHWnRbaT4+MTYmMjU1XStHWnRbaT4+MjQmMjU1XSkudG9VcHBlckNhc2UoKX1mdW5jdGlvbiAkWnQodCxlLG4pe3JldHVybiBNYXRoLm1heChlLE1hdGgubWluKG4sdCkpfWZ1bmN0aW9uIEtadCh0LGUpe3JldHVybih0JWUrZSklZX1mdW5jdGlvbiBaWnQodCxlLG4pe3JldHVybigxLW4pKnQrbiplfWZ1bmN0aW9uIEpadCh0KXtyZXR1cm4gMD09KHQmdC0xKSYmMCE9PXR9ZnVuY3Rpb24gUVp0KHQpe3JldHVybiBNYXRoLnBvdygyLE1hdGguY2VpbChNYXRoLmxvZyh0KS9NYXRoLkxOMikpfWZ1bmN0aW9uIHRKdCh0KXtyZXR1cm4gTWF0aC5wb3coMixNYXRoLmZsb29yKE1hdGgubG9nKHQpL01hdGguTE4yKSl9dmFyIGVKdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxERUcyUkFEOnFadCxSQUQyREVHOlladCxnZW5lcmF0ZVVVSUQ6WFp0LGNsYW1wOiRadCxldWNsaWRlYW5Nb2R1bG86S1p0LG1hcExpbmVhcjpmdW5jdGlvbiBuSnQodCxlLG4saSxyKXtyZXR1cm4gaSsodC1lKSooci1pKS8obi1lKX0saW52ZXJzZUxlcnA6ZnVuY3Rpb24gaUp0KHQsZSxuKXtyZXR1cm4gdCE9PWU/KG4tdCkvKGUtdCk6MH0sbGVycDpaWnQsZGFtcDpmdW5jdGlvbiBySnQodCxlLG4saSl7cmV0dXJuIFpadCh0LGUsMS1NYXRoLmV4cCgtbippKSl9LHBpbmdwb25nOmZ1bmN0aW9uIG9KdCh0LGU9MSl7cmV0dXJuIGUtTWF0aC5hYnMoS1p0KHQsMiplKS1lKX0sc21vb3Roc3RlcDpmdW5jdGlvbiBhSnQodCxlLG4pe3JldHVybiB0PD1lPzA6dD49bj8xOih0PSh0LWUpLyhuLWUpKSp0KigzLTIqdCl9LHNtb290aGVyc3RlcDpmdW5jdGlvbiBzSnQodCxlLG4pe3JldHVybiB0PD1lPzA6dD49bj8xOih0PSh0LWUpLyhuLWUpKSp0KnQqKHQqKDYqdC0xNSkrMTApfSxyYW5kSW50OmZ1bmN0aW9uIGxKdCh0LGUpe3JldHVybiB0K01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSooZS10KzEpKX0scmFuZEZsb2F0OmZ1bmN0aW9uIGNKdCh0LGUpe3JldHVybiB0K01hdGgucmFuZG9tKCkqKGUtdCl9LHJhbmRGbG9hdFNwcmVhZDpmdW5jdGlvbiB1SnQodCl7cmV0dXJuIHQqKC41LU1hdGgucmFuZG9tKCkpfSxzZWVkZWRSYW5kb206ZnVuY3Rpb24gaEp0KHQpe3JldHVybiB2b2lkIDAhPT10JiYoV1p0PXQlMjE0NzQ4MzY0NyksV1p0PTE2ODA3KldadCUyMTQ3NDgzNjQ3LChXWnQtMSkvMjE0NzQ4MzY0Nn0sZGVnVG9SYWQ6ZnVuY3Rpb24gZEp0KHQpe3JldHVybiB0KnFadH0scmFkVG9EZWc6ZnVuY3Rpb24gcEp0KHQpe3JldHVybiB0KlladH0saXNQb3dlck9mVHdvOkpadCxjZWlsUG93ZXJPZlR3bzpRWnQsZmxvb3JQb3dlck9mVHdvOnRKdCxzZXRRdWF0ZXJuaW9uRnJvbVByb3BlckV1bGVyOmZ1bmN0aW9uIGZKdCh0LGUsbixpLHIpe2NvbnN0IG89TWF0aC5jb3MsYT1NYXRoLnNpbixzPW8obi8yKSxsPWEobi8yKSxjPW8oKGUraSkvMiksdT1hKChlK2kpLzIpLGg9bygoZS1pKS8yKSxkPWEoKGUtaSkvMikscD1vKChpLWUpLzIpLGY9YSgoaS1lKS8yKTtzd2l0Y2gocil7Y2FzZSJYWVgiOnQuc2V0KHMqdSxsKmgsbCpkLHMqYyk7YnJlYWs7Y2FzZSJZWlkiOnQuc2V0KGwqZCxzKnUsbCpoLHMqYyk7YnJlYWs7Y2FzZSJaWFoiOnQuc2V0KGwqaCxsKmQscyp1LHMqYyk7YnJlYWs7Y2FzZSJYWlgiOnQuc2V0KHMqdSxsKmYsbCpwLHMqYyk7YnJlYWs7Y2FzZSJZWFkiOnQuc2V0KGwqcCxzKnUsbCpmLHMqYyk7YnJlYWs7Y2FzZSJaWVoiOnQuc2V0KGwqZixsKnAscyp1LHMqYyk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLk1hdGhVdGlsczogLnNldFF1YXRlcm5pb25Gcm9tUHJvcGVyRXVsZXIoKSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIG9yZGVyOiAiK3IpfX19KTtjbGFzcyBtSnR7Y29uc3RydWN0b3IodD0wLGU9MCl7dGhpcy54PXQsdGhpcy55PWV9Z2V0IHdpZHRoKCl7cmV0dXJuIHRoaXMueH1zZXQgd2lkdGgodCl7dGhpcy54PXR9Z2V0IGhlaWdodCgpe3JldHVybiB0aGlzLnl9c2V0IGhlaWdodCh0KXt0aGlzLnk9dH1zZXQodCxlKXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PWUsdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMueD10LHRoaXMueT10LHRoaXN9c2V0WCh0KXtyZXR1cm4gdGhpcy54PXQsdGhpc31zZXRZKHQpe3JldHVybiB0aGlzLnk9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9cmV0dXJuIHRoaXN9Z2V0Q29tcG9uZW50KHQpe3N3aXRjaCh0KXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpc31hZGQodCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5hZGRWZWN0b3JzKHQsZSkpOih0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzKX1hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzfXN1Yih0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLnN1YlZlY3RvcnModCxlKSk6KHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXMpfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnksaT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9aVswXSplK2lbM10qbitpWzZdLHRoaXMueT1pWzFdKmUraVs0XSpuK2lbN10sdGhpc31taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodC54LE1hdGgubWluKGUueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodC55LE1hdGgubWluKGUueSx0aGlzLnkpKSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnkpKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heCh0LE1hdGgubWluKGUsbikpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9dGhpcy54PDA/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT10aGlzLnk8MD9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueX1jcm9zcyh0KXtyZXR1cm4gdGhpcy54KnQueS10aGlzLnkqdC54fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueX1sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9YW5nbGUoKXtyZXR1cm4gTWF0aC5hdGFuMigtdGhpcy55LC10aGlzLngpK01hdGguUEl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnk7cmV0dXJuIGUqZStuKm59bWFuaGF0dGFuRGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5hYnModGhpcy54LXQueCkrTWF0aC5hYnModGhpcy55LXQueSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlLG4pe3JldHVybiB2b2lkIDAhPT1uJiZjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKSx0aGlzLng9dC5nZXRYKGUpLHRoaXMueT10LmdldFkoZSksdGhpc31yb3RhdGVBcm91bmQodCxlKXtjb25zdCBuPU1hdGguY29zKGUpLGk9TWF0aC5zaW4oZSkscj10aGlzLngtdC54LG89dGhpcy55LXQueTtyZXR1cm4gdGhpcy54PXIqbi1vKmkrdC54LHRoaXMueT1yKmkrbypuK3QueSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzfX1tSnQucHJvdG90eXBlLmlzVmVjdG9yMj0hMDtjbGFzcyBnSnR7Y29uc3RydWN0b3IoKXt0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDEsMCwwLDAsMV0sYXJndW1lbnRzLmxlbmd0aD4wJiZjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXgzOiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLiIpfXNldCh0LGUsbixpLHIsbyxhLHMsbCl7Y29uc3QgYz10aGlzLmVsZW1lbnRzO3JldHVybiBjWzBdPXQsY1sxXT1pLGNbMl09YSxjWzNdPWUsY1s0XT1yLGNbNV09cyxjWzZdPW4sY1s3XT1vLGNbOF09bCx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMSwwLDAsMCwxKSx0aGlzfWNvcHkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVswXT1uWzBdLGVbMV09blsxXSxlWzJdPW5bMl0sZVszXT1uWzNdLGVbNF09bls0XSxlWzVdPW5bNV0sZVs2XT1uWzZdLGVbN109bls3XSxlWzhdPW5bOF0sdGhpc31leHRyYWN0QmFzaXModCxlLG4pe3JldHVybiB0LnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMCksZS5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDEpLG4uc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywyKSx0aGlzfXNldEZyb21NYXRyaXg0KHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5zZXQoZVswXSxlWzRdLGVbOF0sZVsxXSxlWzVdLGVbOV0sZVsyXSxlWzZdLGVbMTBdKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHQsdGhpcyl9bXVsdGlwbHlNYXRyaWNlcyh0LGUpe2NvbnN0IG49dC5lbGVtZW50cyxpPWUuZWxlbWVudHMscj10aGlzLmVsZW1lbnRzLG89blswXSxhPW5bM10scz1uWzZdLGw9blsxXSxjPW5bNF0sdT1uWzddLGg9blsyXSxkPW5bNV0scD1uWzhdLGY9aVswXSxtPWlbM10sZz1pWzZdLF89aVsxXSx5PWlbNF0sdj1pWzddLGI9aVsyXSx4PWlbNV0sdz1pWzhdO3JldHVybiByWzBdPW8qZithKl8rcypiLHJbM109byptK2EqeStzKngscls2XT1vKmcrYSp2K3MqdyxyWzFdPWwqZitjKl8rdSpiLHJbNF09bCptK2MqeSt1Kngscls3XT1sKmcrYyp2K3UqdyxyWzJdPWgqZitkKl8rcCpiLHJbNV09aCptK2QqeStwKngscls4XT1oKmcrZCp2K3Aqdyx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gZVswXSo9dCxlWzNdKj10LGVbNl0qPXQsZVsxXSo9dCxlWzRdKj10LGVbN10qPXQsZVsyXSo9dCxlWzVdKj10LGVbOF0qPXQsdGhpc31kZXRlcm1pbmFudCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLGk9dFsyXSxyPXRbM10sbz10WzRdLGE9dFs1XSxzPXRbNl0sbD10WzddLGM9dFs4XTtyZXR1cm4gZSpvKmMtZSphKmwtbipyKmMrbiphKnMraSpyKmwtaSpvKnN9aW52ZXJ0KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbMV0saT10WzJdLHI9dFszXSxvPXRbNF0sYT10WzVdLHM9dFs2XSxsPXRbN10sYz10WzhdLHU9YypvLWEqbCxoPWEqcy1jKnIsZD1sKnItbypzLHA9ZSp1K24qaCtpKmQ7aWYoMD09PXApcmV0dXJuIHRoaXMuc2V0KDAsMCwwLDAsMCwwLDAsMCwwKTtjb25zdCBmPTEvcDtyZXR1cm4gdFswXT11KmYsdFsxXT0oaSpsLWMqbikqZix0WzJdPShhKm4taSpvKSpmLHRbM109aCpmLHRbNF09KGMqZS1pKnMpKmYsdFs1XT0oaSpyLWEqZSkqZix0WzZdPWQqZix0WzddPShuKnMtbCplKSpmLHRbOF09KG8qZS1uKnIpKmYsdGhpc310cmFuc3Bvc2UoKXtsZXQgdDtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQ9ZVsxXSxlWzFdPWVbM10sZVszXT10LHQ9ZVsyXSxlWzJdPWVbNl0sZVs2XT10LHQ9ZVs1XSxlWzVdPWVbN10sZVs3XT10LHRoaXN9Z2V0Tm9ybWFsTWF0cml4KHQpe3JldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KHQpLmludmVydCgpLnRyYW5zcG9zZSgpfXRyYW5zcG9zZUludG9BcnJheSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbM10sdFsyXT1lWzZdLHRbM109ZVsxXSx0WzRdPWVbNF0sdFs1XT1lWzddLHRbNl09ZVsyXSx0WzddPWVbNV0sdFs4XT1lWzhdLHRoaXN9c2V0VXZUcmFuc2Zvcm0odCxlLG4saSxyLG8sYSl7Y29uc3Qgcz1NYXRoLmNvcyhyKSxsPU1hdGguc2luKHIpO3JldHVybiB0aGlzLnNldChuKnMsbipsLC1uKihzKm8rbCphKStvK3QsLWkqbCxpKnMsLWkqKC1sKm8rcyphKSthK2UsMCwwLDEpLHRoaXN9c2NhbGUodCxlKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIG5bMF0qPXQsblszXSo9dCxuWzZdKj10LG5bMV0qPWUsbls0XSo9ZSxuWzddKj1lLHRoaXN9cm90YXRlKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KSxpPXRoaXMuZWxlbWVudHMscj1pWzBdLG89aVszXSxhPWlbNl0scz1pWzFdLGw9aVs0XSxjPWlbN107cmV0dXJuIGlbMF09ZSpyK24qcyxpWzNdPWUqbytuKmwsaVs2XT1lKmErbipjLGlbMV09LW4qcitlKnMsaVs0XT0tbipvK2UqbCxpWzddPS1uKmErZSpjLHRoaXN9dHJhbnNsYXRlKHQsZSl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO3JldHVybiBuWzBdKz10Km5bMl0sblszXSs9dCpuWzVdLG5bNl0rPXQqbls4XSxuWzFdKz1lKm5bMl0sbls0XSs9ZSpuWzVdLG5bN10rPWUqbls4XSx0aGlzfWVxdWFscyh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO2ZvcihsZXQgdD0wO3Q8OTt0KyspaWYoZVt0XSE9PW5bdF0pcmV0dXJuITE7cmV0dXJuITB9ZnJvbUFycmF5KHQsZT0wKXtmb3IobGV0IG49MDtuPDk7bisrKXRoaXMuZWxlbWVudHNbbl09dFtuK2VdO3JldHVybiB0aGlzfXRvQXJyYXkodD1bXSxlPTApe2NvbnN0IG49dGhpcy5lbGVtZW50cztyZXR1cm4gdFtlXT1uWzBdLHRbZSsxXT1uWzFdLHRbZSsyXT1uWzJdLHRbZSszXT1uWzNdLHRbZSs0XT1uWzRdLHRbZSs1XT1uWzVdLHRbZSs2XT1uWzZdLHRbZSs3XT1uWzddLHRbZSs4XT1uWzhdLHR9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmZyb21BcnJheSh0aGlzLmVsZW1lbnRzKX19bGV0IF9KdDtnSnQucHJvdG90eXBlLmlzTWF0cml4Mz0hMDtjbGFzcyB5SnR7c3RhdGljIGdldERhdGFVUkwodCl7aWYoL15kYXRhOi9pLnRlc3QodC5zcmMpKXJldHVybiB0LnNyYztpZigidW5kZWZpbmVkIj09dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50KXJldHVybiB0LnNyYztsZXQgZTtpZih0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpZT10O2Vsc2V7dm9pZCAwPT09X0p0JiYoX0p0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsImNhbnZhcyIpKSxfSnQud2lkdGg9dC53aWR0aCxfSnQuaGVpZ2h0PXQuaGVpZ2h0O2NvbnN0IG49X0p0LmdldENvbnRleHQoIjJkIik7dCBpbnN0YW5jZW9mIEltYWdlRGF0YT9uLnB1dEltYWdlRGF0YSh0LDAsMCk6bi5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCksZT1fSnR9cmV0dXJuIGUud2lkdGg+MjA0OHx8ZS5oZWlnaHQ+MjA0OD8oY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLmdldERhdGFVUkw6IEltYWdlIGNvbnZlcnRlZCB0byBqcGcgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMiLHQpLGUudG9EYXRhVVJMKCJpbWFnZS9qcGVnIiwuNikpOmUudG9EYXRhVVJMKCJpbWFnZS9wbmciKX19bGV0IHZKdD0wO2NsYXNzIGJKdCBleHRlbmRzIGpadHtjb25zdHJ1Y3Rvcih0PWJKdC5ERUZBVUxUX0lNQUdFLGU9Ykp0LkRFRkFVTFRfTUFQUElORyxuPTEwMDEsaT0xMDAxLHI9MTAwNixvPTEwMDgsYT0xMDIzLHM9MTAwOSxsPTEsYz0zZTMpe3N1cGVyKCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6dkp0Kyt9KSx0aGlzLnV1aWQ9WFp0KCksdGhpcy5uYW1lPSIiLHRoaXMuaW1hZ2U9dCx0aGlzLm1pcG1hcHM9W10sdGhpcy5tYXBwaW5nPWUsdGhpcy53cmFwUz1uLHRoaXMud3JhcFQ9aSx0aGlzLm1hZ0ZpbHRlcj1yLHRoaXMubWluRmlsdGVyPW8sdGhpcy5hbmlzb3Ryb3B5PWwsdGhpcy5mb3JtYXQ9YSx0aGlzLmludGVybmFsRm9ybWF0PW51bGwsdGhpcy50eXBlPXMsdGhpcy5vZmZzZXQ9bmV3IG1KdCgwLDApLHRoaXMucmVwZWF0PW5ldyBtSnQoMSwxKSx0aGlzLmNlbnRlcj1uZXcgbUp0KDAsMCksdGhpcy5yb3RhdGlvbj0wLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMCx0aGlzLm1hdHJpeD1uZXcgZ0p0LHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSEwLHRoaXMucHJlbXVsdGlwbHlBbHBoYT0hMSx0aGlzLmZsaXBZPSEwLHRoaXMudW5wYWNrQWxpZ25tZW50PTQsdGhpcy5lbmNvZGluZz1jLHRoaXMudmVyc2lvbj0wLHRoaXMub25VcGRhdGU9bnVsbCx0aGlzLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMX11cGRhdGVNYXRyaXgoKXt0aGlzLm1hdHJpeC5zZXRVdlRyYW5zZm9ybSh0aGlzLm9mZnNldC54LHRoaXMub2Zmc2V0LnksdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55LHRoaXMucm90YXRpb24sdGhpcy5jZW50ZXIueCx0aGlzLmNlbnRlci55KX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLm5hbWU9dC5uYW1lLHRoaXMuaW1hZ2U9dC5pbWFnZSx0aGlzLm1pcG1hcHM9dC5taXBtYXBzLnNsaWNlKDApLHRoaXMubWFwcGluZz10Lm1hcHBpbmcsdGhpcy53cmFwUz10LndyYXBTLHRoaXMud3JhcFQ9dC53cmFwVCx0aGlzLm1hZ0ZpbHRlcj10Lm1hZ0ZpbHRlcix0aGlzLm1pbkZpbHRlcj10Lm1pbkZpbHRlcix0aGlzLmFuaXNvdHJvcHk9dC5hbmlzb3Ryb3B5LHRoaXMuZm9ybWF0PXQuZm9ybWF0LHRoaXMuaW50ZXJuYWxGb3JtYXQ9dC5pbnRlcm5hbEZvcm1hdCx0aGlzLnR5cGU9dC50eXBlLHRoaXMub2Zmc2V0LmNvcHkodC5vZmZzZXQpLHRoaXMucmVwZWF0LmNvcHkodC5yZXBlYXQpLHRoaXMuY2VudGVyLmNvcHkodC5jZW50ZXIpLHRoaXMucm90YXRpb249dC5yb3RhdGlvbix0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlLHRoaXMubWF0cml4LmNvcHkodC5tYXRyaXgpLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPXQuZ2VuZXJhdGVNaXBtYXBzLHRoaXMucHJlbXVsdGlwbHlBbHBoYT10LnByZW11bHRpcGx5QWxwaGEsdGhpcy5mbGlwWT10LmZsaXBZLHRoaXMudW5wYWNrQWxpZ25tZW50PXQudW5wYWNrQWxpZ25tZW50LHRoaXMuZW5jb2Rpbmc9dC5lbmNvZGluZyx0aGlzfXRvSlNPTih0KXtjb25zdCBlPXZvaWQgMD09PXR8fCJzdHJpbmciPT10eXBlb2YgdDtpZighZSYmdm9pZCAwIT09dC50ZXh0dXJlc1t0aGlzLnV1aWRdKXJldHVybiB0LnRleHR1cmVzW3RoaXMudXVpZF07Y29uc3Qgbj17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6IlRleHR1cmUiLGdlbmVyYXRvcjoiVGV4dHVyZS50b0pTT04ifSx1dWlkOnRoaXMudXVpZCxuYW1lOnRoaXMubmFtZSxtYXBwaW5nOnRoaXMubWFwcGluZyxyZXBlYXQ6W3RoaXMucmVwZWF0LngsdGhpcy5yZXBlYXQueV0sb2Zmc2V0Olt0aGlzLm9mZnNldC54LHRoaXMub2Zmc2V0LnldLGNlbnRlcjpbdGhpcy5jZW50ZXIueCx0aGlzLmNlbnRlci55XSxyb3RhdGlvbjp0aGlzLnJvdGF0aW9uLHdyYXA6W3RoaXMud3JhcFMsdGhpcy53cmFwVF0sZm9ybWF0OnRoaXMuZm9ybWF0LHR5cGU6dGhpcy50eXBlLGVuY29kaW5nOnRoaXMuZW5jb2RpbmcsbWluRmlsdGVyOnRoaXMubWluRmlsdGVyLG1hZ0ZpbHRlcjp0aGlzLm1hZ0ZpbHRlcixhbmlzb3Ryb3B5OnRoaXMuYW5pc290cm9weSxmbGlwWTp0aGlzLmZsaXBZLHByZW11bHRpcGx5QWxwaGE6dGhpcy5wcmVtdWx0aXBseUFscGhhLHVucGFja0FsaWdubWVudDp0aGlzLnVucGFja0FsaWdubWVudH07aWYodm9pZCAwIT09dGhpcy5pbWFnZSl7Y29uc3QgaT10aGlzLmltYWdlO2lmKHZvaWQgMD09PWkudXVpZCYmKGkudXVpZD1YWnQoKSksIWUmJnZvaWQgMD09PXQuaW1hZ2VzW2kudXVpZF0pe2xldCBlO2lmKEFycmF5LmlzQXJyYXkoaSkpe2U9W107Zm9yKGxldCB0PTAsbj1pLmxlbmd0aDt0PG47dCsrKWUucHVzaCh4SnQoaVt0XS5pc0RhdGFUZXh0dXJlP2lbdF0uaW1hZ2U6aVt0XSkpfWVsc2UgZT14SnQoaSk7dC5pbWFnZXNbaS51dWlkXT17dXVpZDppLnV1aWQsdXJsOmV9fW4uaW1hZ2U9aS51dWlkfXJldHVybiBlfHwodC50ZXh0dXJlc1t0aGlzLnV1aWRdPW4pLG59ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX10cmFuc2Zvcm1Vdih0KXtpZih0aGlzLm1hcHBpbmchPT1VS3QpcmV0dXJuIHQ7aWYodC5hcHBseU1hdHJpeDModGhpcy5tYXRyaXgpLHQueDwwfHx0Lng+MSlzd2l0Y2godGhpcy53cmFwUyl7Y2FzZSAkS3Q6dC54PXQueC1NYXRoLmZsb29yKHQueCk7YnJlYWs7Y2FzZSBLS3Q6dC54PXQueDwwPzA6MTticmVhaztjYXNlIFpLdDp0Lng9MT09PU1hdGguYWJzKE1hdGguZmxvb3IodC54KSUyKT9NYXRoLmNlaWwodC54KS10Lng6dC54LU1hdGguZmxvb3IodC54KX1pZih0Lnk8MHx8dC55PjEpc3dpdGNoKHRoaXMud3JhcFQpe2Nhc2UgJEt0OnQueT10LnktTWF0aC5mbG9vcih0LnkpO2JyZWFrO2Nhc2UgS0t0OnQueT10Lnk8MD8wOjE7YnJlYWs7Y2FzZSBaS3Q6dC55PTE9PT1NYXRoLmFicyhNYXRoLmZsb29yKHQueSklMik/TWF0aC5jZWlsKHQueSktdC55OnQueS1NYXRoLmZsb29yKHQueSl9cmV0dXJuIHRoaXMuZmxpcFkmJih0Lnk9MS10LnkpLHR9c2V0IG5lZWRzVXBkYXRlKHQpeyEwPT09dCYmdGhpcy52ZXJzaW9uKyt9fWZ1bmN0aW9uIHhKdCh0KXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHwidW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50JiZ0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fCJ1bmRlZmluZWQiIT10eXBlb2YgSW1hZ2VCaXRtYXAmJnQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcD95SnQuZ2V0RGF0YVVSTCh0KTp0LmRhdGE/e2RhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodC5kYXRhKSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodCx0eXBlOnQuZGF0YS5jb25zdHJ1Y3Rvci5uYW1lfTooY29uc29sZS53YXJuKCJUSFJFRS5UZXh0dXJlOiBVbmFibGUgdG8gc2VyaWFsaXplIFRleHR1cmUuIikse30pfWJKdC5ERUZBVUxUX0lNQUdFPXZvaWQgMCxiSnQuREVGQVVMVF9NQVBQSU5HPVVLdCxiSnQucHJvdG90eXBlLmlzVGV4dHVyZT0hMDtjbGFzcyB3SnR7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAsaT0xKXt0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzLnc9aX1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpcy56fXNldCB3aWR0aCh0KXt0aGlzLno9dH1nZXQgaGVpZ2h0KCl7cmV0dXJuIHRoaXMud31zZXQgaGVpZ2h0KHQpe3RoaXMudz10fXNldCh0LGUsbixpKXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PW4sdGhpcy53PWksdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMueD10LHRoaXMueT10LHRoaXMuej10LHRoaXMudz10LHRoaXN9c2V0WCh0KXtyZXR1cm4gdGhpcy54PXQsdGhpc31zZXRZKHQpe3JldHVybiB0aGlzLnk9dCx0aGlzfXNldFoodCl7cmV0dXJuIHRoaXMuej10LHRoaXN9c2V0Vyh0KXtyZXR1cm4gdGhpcy53PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztjYXNlIDI6dGhpcy56PWU7YnJlYWs7Y2FzZSAzOnRoaXMudz1lO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9cmV0dXJuIHRoaXN9Z2V0Q29tcG9uZW50KHQpe3N3aXRjaCh0KXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtjYXNlIDI6cmV0dXJuIHRoaXMuejtjYXNlIDM6cmV0dXJuIHRoaXMudztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55LHRoaXMueix0aGlzLncpfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzLno9dC56LHRoaXMudz12b2lkIDAhPT10Lnc/dC53OjEsdGhpc31hZGQodCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3I0OiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5hZGRWZWN0b3JzKHQsZSkpOih0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzLnorPXQueix0aGlzLncrPXQudyx0aGlzKX1hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXMudys9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpcy56PXQueitlLnosdGhpcy53PXQudytlLncsdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXMueis9dC56KmUsdGhpcy53Kz10LncqZSx0aGlzfXN1Yih0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLnN1YlZlY3RvcnModCxlKSk6KHRoaXMueC09dC54LHRoaXMueS09dC55LHRoaXMuei09dC56LHRoaXMudy09dC53LHRoaXMpfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzLnotPXQsdGhpcy53LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzLnc9dC53LWUudyx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzLnoqPXQueix0aGlzLncqPXQudyx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXMueio9dCx0aGlzLncqPXQsdGhpc31hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnksaT10aGlzLnoscj10aGlzLncsbz10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9b1swXSplK29bNF0qbitvWzhdKmkrb1sxMl0qcix0aGlzLnk9b1sxXSplK29bNV0qbitvWzldKmkrb1sxM10qcix0aGlzLno9b1syXSplK29bNl0qbitvWzEwXSppK29bMTRdKnIsdGhpcy53PW9bM10qZStvWzddKm4rb1sxMV0qaStvWzE1XSpyLHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9c2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb24odCl7dGhpcy53PTIqTWF0aC5hY29zKHQudyk7Y29uc3QgZT1NYXRoLnNxcnQoMS10LncqdC53KTtyZXR1cm4gZTwxZS00Pyh0aGlzLng9MSx0aGlzLnk9MCx0aGlzLno9MCk6KHRoaXMueD10LngvZSx0aGlzLnk9dC55L2UsdGhpcy56PXQuei9lKSx0aGlzfXNldEF4aXNBbmdsZUZyb21Sb3RhdGlvbk1hdHJpeCh0KXtsZXQgZSxuLGkscjtjb25zdCBvPS4wMSxhPS4xLHM9dC5lbGVtZW50cyxsPXNbMF0sYz1zWzRdLHU9c1s4XSxoPXNbMV0sZD1zWzVdLHA9c1s5XSxmPXNbMl0sbT1zWzZdLGc9c1sxMF07aWYoTWF0aC5hYnMoYy1oKTxvJiZNYXRoLmFicyh1LWYpPG8mJk1hdGguYWJzKHAtbSk8byl7aWYoTWF0aC5hYnMoYytoKTxhJiZNYXRoLmFicyh1K2YpPGEmJk1hdGguYWJzKHArbSk8YSYmTWF0aC5hYnMobCtkK2ctMyk8YSlyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCksdGhpcztlPU1hdGguUEk7Y29uc3QgdD0obCsxKS8yLHM9KGQrMSkvMixfPShnKzEpLzIseT0oYytoKS80LHY9KHUrZikvNCxiPShwK20pLzQ7cmV0dXJuIHQ+cyYmdD5fP3Q8bz8obj0wLGk9LjcwNzEwNjc4MSxyPS43MDcxMDY3ODEpOihuPU1hdGguc3FydCh0KSxpPXkvbixyPXYvbik6cz5fP3M8bz8obj0uNzA3MTA2NzgxLGk9MCxyPS43MDcxMDY3ODEpOihpPU1hdGguc3FydChzKSxuPXkvaSxyPWIvaSk6XzxvPyhuPS43MDcxMDY3ODEsaT0uNzA3MTA2NzgxLHI9MCk6KHI9TWF0aC5zcXJ0KF8pLG49di9yLGk9Yi9yKSx0aGlzLnNldChuLGkscixlKSx0aGlzfWxldCBfPU1hdGguc3FydCgobS1wKSoobS1wKSsodS1mKSoodS1mKSsoaC1jKSooaC1jKSk7cmV0dXJuIE1hdGguYWJzKF8pPC4wMDEmJihfPTEpLHRoaXMueD0obS1wKS9fLHRoaXMueT0odS1mKS9fLHRoaXMuej0oaC1jKS9fLHRoaXMudz1NYXRoLmFjb3MoKGwrZCtnLTEpLzIpLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5taW4odGhpcy53LHQudyksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpcy56PU1hdGgubWF4KHRoaXMueix0LnopLHRoaXMudz1NYXRoLm1heCh0aGlzLncsdC53KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LngsTWF0aC5taW4oZS54LHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LnksTWF0aC5taW4oZS55LHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LnosTWF0aC5taW4oZS56LHRoaXMueikpLHRoaXMudz1NYXRoLm1heCh0LncsTWF0aC5taW4oZS53LHRoaXMudykpLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy56KSksdGhpcy53PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLncpKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heCh0LE1hdGgubWluKGUsbikpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpcy56PU1hdGguZmxvb3IodGhpcy56KSx0aGlzLnc9TWF0aC5mbG9vcih0aGlzLncpLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzLnc9TWF0aC5jZWlsKHRoaXMudyksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpcy56PU1hdGgucm91bmQodGhpcy56KSx0aGlzLnc9TWF0aC5yb3VuZCh0aGlzLncpLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PXRoaXMueDwwP01hdGguY2VpbCh0aGlzLngpOk1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9dGhpcy55PDA/TWF0aC5jZWlsKHRoaXMueSk6TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej10aGlzLno8MD9NYXRoLmNlaWwodGhpcy56KTpNYXRoLmZsb29yKHRoaXMueiksdGhpcy53PXRoaXMudzwwP01hdGguY2VpbCh0aGlzLncpOk1hdGguZmxvb3IodGhpcy53KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzLno9LXRoaXMueix0aGlzLnc9LXRoaXMudyx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55K3RoaXMueip0LnordGhpcy53KnQud31sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMudyl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopK01hdGguYWJzKHRoaXMudyl9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzLnorPSh0LnotdGhpcy56KSplLHRoaXMudys9KHQudy10aGlzLncpKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzLno9dC56KyhlLnotdC56KSpuLHRoaXMudz10LncrKGUudy10LncpKm4sdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55JiZ0Lno9PT10aGlzLnomJnQudz09PXRoaXMud31mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLng9dFtlXSx0aGlzLnk9dFtlKzFdLHRoaXMuej10W2UrMl0sdGhpcy53PXRbZSszXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHRbZSsyXT10aGlzLnosdFtlKzNdPXRoaXMudyx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlLG4pe3JldHVybiB2b2lkIDAhPT1uJiZjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKSx0aGlzLng9dC5nZXRYKGUpLHRoaXMueT10LmdldFkoZSksdGhpcy56PXQuZ2V0WihlKSx0aGlzLnc9dC5nZXRXKGUpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXMudz1NYXRoLnJhbmRvbSgpLHRoaXN9fXdKdC5wcm90b3R5cGUuaXNWZWN0b3I0PSEwO2NsYXNzIFNKdCBleHRlbmRzIGpadHtjb25zdHJ1Y3Rvcih0LGUsbj17fSl7c3VwZXIoKSx0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9ZSx0aGlzLmRlcHRoPTEsdGhpcy5zY2lzc29yPW5ldyB3SnQoMCwwLHQsZSksdGhpcy5zY2lzc29yVGVzdD0hMSx0aGlzLnZpZXdwb3J0PW5ldyB3SnQoMCwwLHQsZSksdGhpcy50ZXh0dXJlPW5ldyBiSnQodm9pZCAwLG4ubWFwcGluZyxuLndyYXBTLG4ud3JhcFQsbi5tYWdGaWx0ZXIsbi5taW5GaWx0ZXIsbi5mb3JtYXQsbi50eXBlLG4uYW5pc290cm9weSxuLmVuY29kaW5nKSx0aGlzLnRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSEwLHRoaXMudGV4dHVyZS5pbWFnZT17d2lkdGg6dCxoZWlnaHQ6ZSxkZXB0aDoxfSx0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPXZvaWQgMCE9PW4uZ2VuZXJhdGVNaXBtYXBzJiZuLmdlbmVyYXRlTWlwbWFwcyx0aGlzLnRleHR1cmUubWluRmlsdGVyPXZvaWQgMCE9PW4ubWluRmlsdGVyP24ubWluRmlsdGVyOmVadCx0aGlzLmRlcHRoQnVmZmVyPXZvaWQgMD09PW4uZGVwdGhCdWZmZXJ8fG4uZGVwdGhCdWZmZXIsdGhpcy5zdGVuY2lsQnVmZmVyPXZvaWQgMCE9PW4uc3RlbmNpbEJ1ZmZlciYmbi5zdGVuY2lsQnVmZmVyLHRoaXMuZGVwdGhUZXh0dXJlPXZvaWQgMCE9PW4uZGVwdGhUZXh0dXJlP24uZGVwdGhUZXh0dXJlOm51bGx9c2V0VGV4dHVyZSh0KXt0LmltYWdlPXt3aWR0aDp0aGlzLndpZHRoLGhlaWdodDp0aGlzLmhlaWdodCxkZXB0aDp0aGlzLmRlcHRofSx0aGlzLnRleHR1cmU9dH1zZXRTaXplKHQsZSxuPTEpe3RoaXMud2lkdGg9PT10JiZ0aGlzLmhlaWdodD09PWUmJnRoaXMuZGVwdGg9PT1ufHwodGhpcy53aWR0aD10LHRoaXMuaGVpZ2h0PWUsdGhpcy5kZXB0aD1uLHRoaXMudGV4dHVyZS5pbWFnZS53aWR0aD10LHRoaXMudGV4dHVyZS5pbWFnZS5oZWlnaHQ9ZSx0aGlzLnRleHR1cmUuaW1hZ2UuZGVwdGg9bix0aGlzLmRpc3Bvc2UoKSksdGhpcy52aWV3cG9ydC5zZXQoMCwwLHQsZSksdGhpcy5zY2lzc29yLnNldCgwLDAsdCxlKX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLndpZHRoPXQud2lkdGgsdGhpcy5oZWlnaHQ9dC5oZWlnaHQsdGhpcy5kZXB0aD10LmRlcHRoLHRoaXMudmlld3BvcnQuY29weSh0LnZpZXdwb3J0KSx0aGlzLnRleHR1cmU9dC50ZXh0dXJlLmNsb25lKCksdGhpcy50ZXh0dXJlLmltYWdlPXsuLi50aGlzLnRleHR1cmUuaW1hZ2V9LHRoaXMuZGVwdGhCdWZmZXI9dC5kZXB0aEJ1ZmZlcix0aGlzLnN0ZW5jaWxCdWZmZXI9dC5zdGVuY2lsQnVmZmVyLHRoaXMuZGVwdGhUZXh0dXJlPXQuZGVwdGhUZXh0dXJlLHRoaXN9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19U0p0LnByb3RvdHlwZS5pc1dlYkdMUmVuZGVyVGFyZ2V0PSEwO2NsYXNzIE1KdCBleHRlbmRzIFNKdHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodCxlKTtjb25zdCBpPXRoaXMudGV4dHVyZTt0aGlzLnRleHR1cmU9W107Zm9yKGxldCB0PTA7dDxuO3QrKyl0aGlzLnRleHR1cmVbdF09aS5jbG9uZSgpfXNldFNpemUodCxlLG49MSl7aWYodGhpcy53aWR0aCE9PXR8fHRoaXMuaGVpZ2h0IT09ZXx8dGhpcy5kZXB0aCE9PW4pe3RoaXMud2lkdGg9dCx0aGlzLmhlaWdodD1lLHRoaXMuZGVwdGg9bjtmb3IobGV0IGk9MCxyPXRoaXMudGV4dHVyZS5sZW5ndGg7aTxyO2krKyl0aGlzLnRleHR1cmVbaV0uaW1hZ2Uud2lkdGg9dCx0aGlzLnRleHR1cmVbaV0uaW1hZ2UuaGVpZ2h0PWUsdGhpcy50ZXh0dXJlW2ldLmltYWdlLmRlcHRoPW47dGhpcy5kaXNwb3NlKCl9cmV0dXJuIHRoaXMudmlld3BvcnQuc2V0KDAsMCx0LGUpLHRoaXMuc2Npc3Nvci5zZXQoMCwwLHQsZSksdGhpc31jb3B5KHQpe3RoaXMuZGlzcG9zZSgpLHRoaXMud2lkdGg9dC53aWR0aCx0aGlzLmhlaWdodD10LmhlaWdodCx0aGlzLmRlcHRoPXQuZGVwdGgsdGhpcy52aWV3cG9ydC5zZXQoMCwwLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLHRoaXMuc2Npc3Nvci5zZXQoMCwwLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLHRoaXMuZGVwdGhCdWZmZXI9dC5kZXB0aEJ1ZmZlcix0aGlzLnN0ZW5jaWxCdWZmZXI9dC5zdGVuY2lsQnVmZmVyLHRoaXMuZGVwdGhUZXh0dXJlPXQuZGVwdGhUZXh0dXJlLHRoaXMudGV4dHVyZS5sZW5ndGg9MDtmb3IobGV0IGU9MCxuPXQudGV4dHVyZS5sZW5ndGg7ZTxuO2UrKyl0aGlzLnRleHR1cmVbZV09dC50ZXh0dXJlW2VdLmNsb25lKCk7cmV0dXJuIHRoaXN9fU1KdC5wcm90b3R5cGUuaXNXZWJHTE11bHRpcGxlUmVuZGVyVGFyZ2V0cz0hMDtjbGFzcyBFSnQgZXh0ZW5kcyBTSnR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHQsZSxuKSx0aGlzLnNhbXBsZXM9NH1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5LmNhbGwodGhpcyx0KSx0aGlzLnNhbXBsZXM9dC5zYW1wbGVzLHRoaXN9fUVKdC5wcm90b3R5cGUuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0PSEwO2NsYXNzIFRKdHtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCxpPTEpe3RoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX3c9aX1zdGF0aWMgc2xlcnAodCxlLG4saSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogU3RhdGljIC5zbGVycCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBxbS5zbGVycFF1YXRlcm5pb25zKCBxYSwgcWIsIHQgKSBpbnN0ZWFkLiIpLG4uc2xlcnBRdWF0ZXJuaW9ucyh0LGUsaSl9c3RhdGljIHNsZXJwRmxhdCh0LGUsbixpLHIsbyxhKXtsZXQgcz1uW2krMF0sbD1uW2krMV0sYz1uW2krMl0sdT1uW2krM107Y29uc3QgaD1yW28rMF0sZD1yW28rMV0scD1yW28rMl0sZj1yW28rM107aWYoMD09PWEpcmV0dXJuIHRbZSswXT1zLHRbZSsxXT1sLHRbZSsyXT1jLHZvaWQodFtlKzNdPXUpO2lmKDE9PT1hKXJldHVybiB0W2UrMF09aCx0W2UrMV09ZCx0W2UrMl09cCx2b2lkKHRbZSszXT1mKTtpZih1IT09Znx8cyE9PWh8fGwhPT1kfHxjIT09cCl7bGV0IHQ9MS1hO2NvbnN0IGU9cypoK2wqZCtjKnArdSpmLG49ZT49MD8xOi0xLGk9MS1lKmU7aWYoaT5OdW1iZXIuRVBTSUxPTil7Y29uc3Qgcj1NYXRoLnNxcnQoaSksbz1NYXRoLmF0YW4yKHIsZSpuKTt0PU1hdGguc2luKHQqbykvcixhPU1hdGguc2luKGEqbykvcn1jb25zdCByPWEqbjtpZihzPXMqdCtoKnIsbD1sKnQrZCpyLGM9Yyp0K3Aqcix1PXUqdCtmKnIsdD09PTEtYSl7Y29uc3QgdD0xL01hdGguc3FydChzKnMrbCpsK2MqYyt1KnUpO3MqPXQsbCo9dCxjKj10LHUqPXR9fXRbZV09cyx0W2UrMV09bCx0W2UrMl09Yyx0W2UrM109dX1zdGF0aWMgbXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQodCxlLG4saSxyLG8pe2NvbnN0IGE9bltpXSxzPW5baSsxXSxsPW5baSsyXSxjPW5baSszXSx1PXJbb10saD1yW28rMV0sZD1yW28rMl0scD1yW28rM107cmV0dXJuIHRbZV09YSpwK2MqdStzKmQtbCpoLHRbZSsxXT1zKnArYypoK2wqdS1hKmQsdFtlKzJdPWwqcCtjKmQrYSpoLXMqdSx0W2UrM109YypwLWEqdS1zKmgtbCpkLHR9Z2V0IHgoKXtyZXR1cm4gdGhpcy5feH1zZXQgeCh0KXt0aGlzLl94PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3l9c2V0IHkodCl7dGhpcy5feT10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeigpe3JldHVybiB0aGlzLl96fXNldCB6KHQpe3RoaXMuX3o9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHcoKXtyZXR1cm4gdGhpcy5fd31zZXQgdyh0KXt0aGlzLl93PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldCh0LGUsbixpKXtyZXR1cm4gdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PW4sdGhpcy5fdz1pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX3cpfWNvcHkodCl7cmV0dXJuIHRoaXMuX3g9dC54LHRoaXMuX3k9dC55LHRoaXMuX3o9dC56LHRoaXMuX3c9dC53LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21FdWxlcih0LGUpe2lmKCF0fHwhdC5pc0V1bGVyKXRocm93IG5ldyBFcnJvcigiVEhSRUUuUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIG5vdyBleHBlY3RzIGFuIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuIik7Y29uc3Qgbj10Ll94LGk9dC5feSxyPXQuX3osbz10Ll9vcmRlcixhPU1hdGguY29zLHM9TWF0aC5zaW4sbD1hKG4vMiksYz1hKGkvMiksdT1hKHIvMiksaD1zKG4vMiksZD1zKGkvMikscD1zKHIvMik7c3dpdGNoKG8pe2Nhc2UiWFlaIjp0aGlzLl94PWgqYyp1K2wqZCpwLHRoaXMuX3k9bCpkKnUtaCpjKnAsdGhpcy5fej1sKmMqcCtoKmQqdSx0aGlzLl93PWwqYyp1LWgqZCpwO2JyZWFrO2Nhc2UiWVhaIjp0aGlzLl94PWgqYyp1K2wqZCpwLHRoaXMuX3k9bCpkKnUtaCpjKnAsdGhpcy5fej1sKmMqcC1oKmQqdSx0aGlzLl93PWwqYyp1K2gqZCpwO2JyZWFrO2Nhc2UiWlhZIjp0aGlzLl94PWgqYyp1LWwqZCpwLHRoaXMuX3k9bCpkKnUraCpjKnAsdGhpcy5fej1sKmMqcCtoKmQqdSx0aGlzLl93PWwqYyp1LWgqZCpwO2JyZWFrO2Nhc2UiWllYIjp0aGlzLl94PWgqYyp1LWwqZCpwLHRoaXMuX3k9bCpkKnUraCpjKnAsdGhpcy5fej1sKmMqcC1oKmQqdSx0aGlzLl93PWwqYyp1K2gqZCpwO2JyZWFrO2Nhc2UiWVpYIjp0aGlzLl94PWgqYyp1K2wqZCpwLHRoaXMuX3k9bCpkKnUraCpjKnAsdGhpcy5fej1sKmMqcC1oKmQqdSx0aGlzLl93PWwqYyp1LWgqZCpwO2JyZWFrO2Nhc2UiWFpZIjp0aGlzLl94PWgqYyp1LWwqZCpwLHRoaXMuX3k9bCpkKnUtaCpjKnAsdGhpcy5fej1sKmMqcCtoKmQqdSx0aGlzLl93PWwqYyp1K2gqZCpwO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiAuc2V0RnJvbUV1bGVyKCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogIitvKX1yZXR1cm4hMSE9PWUmJnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21BeGlzQW5nbGUodCxlKXtjb25zdCBuPWUvMixpPU1hdGguc2luKG4pO3JldHVybiB0aGlzLl94PXQueCppLHRoaXMuX3k9dC55KmksdGhpcy5fej10LnoqaSx0aGlzLl93PU1hdGguY29zKG4pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Sb3RhdGlvbk1hdHJpeCh0KXtjb25zdCBlPXQuZWxlbWVudHMsbj1lWzBdLGk9ZVs0XSxyPWVbOF0sbz1lWzFdLGE9ZVs1XSxzPWVbOV0sbD1lWzJdLGM9ZVs2XSx1PWVbMTBdLGg9bithK3U7aWYoaD4wKXtjb25zdCB0PS41L01hdGguc3FydChoKzEpO3RoaXMuX3c9LjI1L3QsdGhpcy5feD0oYy1zKSp0LHRoaXMuX3k9KHItbCkqdCx0aGlzLl96PShvLWkpKnR9ZWxzZSBpZihuPmEmJm4+dSl7Y29uc3QgdD0yKk1hdGguc3FydCgxK24tYS11KTt0aGlzLl93PShjLXMpL3QsdGhpcy5feD0uMjUqdCx0aGlzLl95PShpK28pL3QsdGhpcy5fej0ocitsKS90fWVsc2UgaWYoYT51KXtjb25zdCB0PTIqTWF0aC5zcXJ0KDErYS1uLXUpO3RoaXMuX3c9KHItbCkvdCx0aGlzLl94PShpK28pL3QsdGhpcy5feT0uMjUqdCx0aGlzLl96PShzK2MpL3R9ZWxzZXtjb25zdCB0PTIqTWF0aC5zcXJ0KDErdS1uLWEpO3RoaXMuX3c9KG8taSkvdCx0aGlzLl94PShyK2wpL3QsdGhpcy5feT0ocytjKS90LHRoaXMuX3o9LjI1KnR9cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Vbml0VmVjdG9ycyh0LGUpe2xldCBuPXQuZG90KGUpKzE7cmV0dXJuIG48TnVtYmVyLkVQU0lMT04/KG49MCxNYXRoLmFicyh0LngpPk1hdGguYWJzKHQueik/KHRoaXMuX3g9LXQueSx0aGlzLl95PXQueCx0aGlzLl96PTAsdGhpcy5fdz1uKToodGhpcy5feD0wLHRoaXMuX3k9LXQueix0aGlzLl96PXQueSx0aGlzLl93PW4pKToodGhpcy5feD10LnkqZS56LXQueiplLnksdGhpcy5feT10LnoqZS54LXQueCplLnosdGhpcy5fej10LngqZS55LXQueSplLngsdGhpcy5fdz1uKSx0aGlzLm5vcm1hbGl6ZSgpfWFuZ2xlVG8odCl7cmV0dXJuIDIqTWF0aC5hY29zKE1hdGguYWJzKCRadCh0aGlzLmRvdCh0KSwtMSwxKSkpfXJvdGF0ZVRvd2FyZHModCxlKXtjb25zdCBuPXRoaXMuYW5nbGVUbyh0KTtpZigwPT09bilyZXR1cm4gdGhpcztjb25zdCBpPU1hdGgubWluKDEsZS9uKTtyZXR1cm4gdGhpcy5zbGVycCh0LGkpLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMSl9aW52ZXJ0KCl7cmV0dXJuIHRoaXMuY29uanVnYXRlKCl9Y29uanVnYXRlKCl7cmV0dXJuIHRoaXMuX3gqPS0xLHRoaXMuX3kqPS0xLHRoaXMuX3oqPS0xLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy5feCp0Ll94K3RoaXMuX3kqdC5feSt0aGlzLl96KnQuX3ordGhpcy5fdyp0Ll93fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fd31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fdyl9bm9ybWFsaXplKCl7bGV0IHQ9dGhpcy5sZW5ndGgoKTtyZXR1cm4gMD09PXQ/KHRoaXMuX3g9MCx0aGlzLl95PTAsdGhpcy5fej0wLHRoaXMuX3c9MSk6KHQ9MS90LHRoaXMuX3g9dGhpcy5feCp0LHRoaXMuX3k9dGhpcy5feSp0LHRoaXMuX3o9dGhpcy5feip0LHRoaXMuX3c9dGhpcy5fdyp0KSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31tdWx0aXBseSh0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlF1YXRlcm5pb246IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5UXVhdGVybmlvbnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0LGUpKTp0aGlzLm11bHRpcGx5UXVhdGVybmlvbnModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHQsdGhpcyl9bXVsdGlwbHlRdWF0ZXJuaW9ucyh0LGUpe2NvbnN0IG49dC5feCxpPXQuX3kscj10Ll96LG89dC5fdyxhPWUuX3gscz1lLl95LGw9ZS5feixjPWUuX3c7cmV0dXJuIHRoaXMuX3g9bipjK28qYStpKmwtcipzLHRoaXMuX3k9aSpjK28qcytyKmEtbipsLHRoaXMuX3o9cipjK28qbCtuKnMtaSphLHRoaXMuX3c9bypjLW4qYS1pKnMtcipsLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwKHQsZSl7aWYoMD09PWUpcmV0dXJuIHRoaXM7aWYoMT09PWUpcmV0dXJuIHRoaXMuY29weSh0KTtjb25zdCBuPXRoaXMuX3gsaT10aGlzLl95LHI9dGhpcy5feixvPXRoaXMuX3c7bGV0IGE9byp0Ll93K24qdC5feCtpKnQuX3krcip0Ll96O2lmKGE8MD8odGhpcy5fdz0tdC5fdyx0aGlzLl94PS10Ll94LHRoaXMuX3k9LXQuX3ksdGhpcy5fej0tdC5feixhPS1hKTp0aGlzLmNvcHkodCksYT49MSlyZXR1cm4gdGhpcy5fdz1vLHRoaXMuX3g9bix0aGlzLl95PWksdGhpcy5fej1yLHRoaXM7Y29uc3Qgcz0xLWEqYTtpZihzPD1OdW1iZXIuRVBTSUxPTil7Y29uc3QgdD0xLWU7cmV0dXJuIHRoaXMuX3c9dCpvK2UqdGhpcy5fdyx0aGlzLl94PXQqbitlKnRoaXMuX3gsdGhpcy5feT10KmkrZSp0aGlzLl95LHRoaXMuX3o9dCpyK2UqdGhpcy5feix0aGlzLm5vcm1hbGl6ZSgpLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNvbnN0IGw9TWF0aC5zcXJ0KHMpLGM9TWF0aC5hdGFuMihsLGEpLHU9TWF0aC5zaW4oKDEtZSkqYykvbCxoPU1hdGguc2luKGUqYykvbDtyZXR1cm4gdGhpcy5fdz1vKnUrdGhpcy5fdypoLHRoaXMuX3g9bip1K3RoaXMuX3gqaCx0aGlzLl95PWkqdSt0aGlzLl95KmgsdGhpcy5fej1yKnUrdGhpcy5feipoLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNsZXJwUXVhdGVybmlvbnModCxlLG4pe3RoaXMuY29weSh0KS5zbGVycChlLG4pfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fdz09PXRoaXMuX3d9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5feD10W2VdLHRoaXMuX3k9dFtlKzFdLHRoaXMuX3o9dFtlKzJdLHRoaXMuX3c9dFtlKzNdLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX3csdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuX3g9dC5nZXRYKGUpLHRoaXMuX3k9dC5nZXRZKGUpLHRoaXMuX3o9dC5nZXRaKGUpLHRoaXMuX3c9dC5nZXRXKGUpLHRoaXN9X29uQ2hhbmdlKHQpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPXQsdGhpc31fb25DaGFuZ2VDYWxsYmFjaygpe319VEp0LnByb3RvdHlwZS5pc1F1YXRlcm5pb249ITA7Y2xhc3MgQ0p0e2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0wKXt0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bn1zZXQodCxlLG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj10aGlzLnopLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzLno9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRaKHQpe3JldHVybiB0aGlzLno9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnopfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzLno9dC56LHRoaXN9YWRkKHQsZSl7cmV0dXJuIHZvaWQgMCE9PWU/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuYWRkVmVjdG9ycyh0LGUpKToodGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpcyl9YWRkU2NhbGFyKHQpe3JldHVybiB0aGlzLngrPXQsdGhpcy55Kz10LHRoaXMueis9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpcy56PXQueitlLnosdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXMueis9dC56KmUsdGhpc31zdWIodCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5zdWJWZWN0b3JzKHQsZSkpOih0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzLnotPXQueix0aGlzKX1zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzfW11bHRpcGx5KHQsZSl7cmV0dXJuIHZvaWQgMCE9PWU/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5VmVjdG9ycyh0LGUpKToodGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpcy56Kj10LnosdGhpcyl9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpcy56Kj10LHRoaXN9bXVsdGlwbHlWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngqZS54LHRoaXMueT10LnkqZS55LHRoaXMuej10LnoqZS56LHRoaXN9YXBwbHlFdWxlcih0KXtyZXR1cm4gdCYmdC5pc0V1bGVyfHxjb25zb2xlLmVycm9yKCJUSFJFRS5WZWN0b3IzOiAuYXBwbHlFdWxlcigpIG5vdyBleHBlY3RzIGFuIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuIiksdGhpcy5hcHBseVF1YXRlcm5pb24oa0p0LnNldEZyb21FdWxlcih0KSl9YXBwbHlBeGlzQW5nbGUodCxlKXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oa0p0LnNldEZyb21BeGlzQW5nbGUodCxlKSl9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LGk9dGhpcy56LHI9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PXJbMF0qZStyWzNdKm4rcls2XSppLHRoaXMueT1yWzFdKmUrcls0XSpuK3JbN10qaSx0aGlzLno9clsyXSplK3JbNV0qbityWzhdKmksdGhpc31hcHBseU5vcm1hbE1hdHJpeCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDModCkubm9ybWFsaXplKCl9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LGk9dGhpcy56LHI9dC5lbGVtZW50cyxvPTEvKHJbM10qZStyWzddKm4rclsxMV0qaStyWzE1XSk7cmV0dXJuIHRoaXMueD0oclswXSplK3JbNF0qbityWzhdKmkrclsxMl0pKm8sdGhpcy55PShyWzFdKmUrcls1XSpuK3JbOV0qaStyWzEzXSkqbyx0aGlzLno9KHJbMl0qZStyWzZdKm4rclsxMF0qaStyWzE0XSkqbyx0aGlzfWFwcGx5UXVhdGVybmlvbih0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxpPXRoaXMueixyPXQueCxvPXQueSxhPXQueixzPXQudyxsPXMqZStvKmktYSpuLGM9cypuK2EqZS1yKmksdT1zKmkrcipuLW8qZSxoPS1yKmUtbypuLWEqaTtyZXR1cm4gdGhpcy54PWwqcytoKi1yK2MqLWEtdSotbyx0aGlzLnk9YypzK2gqLW8rdSotci1sKi1hLHRoaXMuej11KnMraCotYStsKi1vLWMqLXIsdGhpc31wcm9qZWN0KHQpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkSW52ZXJzZSkuYXBwbHlNYXRyaXg0KHQucHJvamVjdGlvbk1hdHJpeCl9dW5wcm9qZWN0KHQpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4NCh0LnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKS5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCl9dHJhbnNmb3JtRGlyZWN0aW9uKHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LGk9dGhpcy56LHI9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PXJbMF0qZStyWzRdKm4rcls4XSppLHRoaXMueT1yWzFdKmUrcls1XSpuK3JbOV0qaSx0aGlzLno9clsyXSplK3JbNl0qbityWzEwXSppLHRoaXMubm9ybWFsaXplKCl9ZGl2aWRlKHQpe3JldHVybiB0aGlzLngvPXQueCx0aGlzLnkvPXQueSx0aGlzLnovPXQueix0aGlzfWRpdmlkZVNjYWxhcih0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigxL3QpfW1pbih0KXtyZXR1cm4gdGhpcy54PU1hdGgubWluKHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1pbih0aGlzLnksdC55KSx0aGlzLno9TWF0aC5taW4odGhpcy56LHQueiksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpcy56PU1hdGgubWF4KHRoaXMueix0LnopLHRoaXN9Y2xhbXAodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQueCxNYXRoLm1pbihlLngsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQueSxNYXRoLm1pbihlLnksdGhpcy55KSksdGhpcy56PU1hdGgubWF4KHQueixNYXRoLm1pbihlLnosdGhpcy56KSksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy55KSksdGhpcy56PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnopKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heCh0LE1hdGgubWluKGUsbikpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpcy56PU1hdGguZmxvb3IodGhpcy56KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzLno9TWF0aC5jZWlsKHRoaXMueiksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpcy56PU1hdGgucm91bmQodGhpcy56KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD10aGlzLng8MD9NYXRoLmNlaWwodGhpcy54KTpNYXRoLmZsb29yKHRoaXMueCksdGhpcy55PXRoaXMueTwwP01hdGguY2VpbCh0aGlzLnkpOk1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9dGhpcy56PDA/TWF0aC5jZWlsKHRoaXMueik6TWF0aC5mbG9vcih0aGlzLnopLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXMuej0tdGhpcy56LHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLngqdC54K3RoaXMueSp0LnkrdGhpcy56KnQuen1sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMuen1sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56KX1tYW5oYXR0YW5MZW5ndGgoKXtyZXR1cm4gTWF0aC5hYnModGhpcy54KStNYXRoLmFicyh0aGlzLnkpK01hdGguYWJzKHRoaXMueil9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzLnorPSh0LnotdGhpcy56KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpcy56PXQueisoZS56LXQueikqbix0aGlzfWNyb3NzKHQsZSl7cmV0dXJuIHZvaWQgMCE9PWU/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmNyb3NzKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuY3Jvc3NWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmNyb3NzVmVjdG9ycyh0LGUpKTp0aGlzLmNyb3NzVmVjdG9ycyh0aGlzLHQpfWNyb3NzVmVjdG9ycyh0LGUpe2NvbnN0IG49dC54LGk9dC55LHI9dC56LG89ZS54LGE9ZS55LHM9ZS56O3JldHVybiB0aGlzLng9aSpzLXIqYSx0aGlzLnk9cipvLW4qcyx0aGlzLno9biphLWkqbyx0aGlzfXByb2plY3RPblZlY3Rvcih0KXtjb25zdCBlPXQubGVuZ3RoU3EoKTtpZigwPT09ZSlyZXR1cm4gdGhpcy5zZXQoMCwwLDApO2NvbnN0IG49dC5kb3QodGhpcykvZTtyZXR1cm4gdGhpcy5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKG4pfXByb2plY3RPblBsYW5lKHQpe3JldHVybiBBSnQuY29weSh0aGlzKS5wcm9qZWN0T25WZWN0b3IodCksdGhpcy5zdWIoQUp0KX1yZWZsZWN0KHQpe3JldHVybiB0aGlzLnN1YihBSnQuY29weSh0KS5tdWx0aXBseVNjYWxhcigyKnRoaXMuZG90KHQpKSl9YW5nbGVUbyh0KXtjb25zdCBlPU1hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqdC5sZW5ndGhTcSgpKTtpZigwPT09ZSlyZXR1cm4gTWF0aC5QSS8yO2NvbnN0IG49dGhpcy5kb3QodCkvZTtyZXR1cm4gTWF0aC5hY29zKCRadChuLC0xLDEpKX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LG49dGhpcy55LXQueSxpPXRoaXMuei10Lno7cmV0dXJuIGUqZStuKm4raSppfW1hbmhhdHRhbkRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC10LngpK01hdGguYWJzKHRoaXMueS10LnkpK01hdGguYWJzKHRoaXMuei10LnopfXNldEZyb21TcGhlcmljYWwodCl7cmV0dXJuIHRoaXMuc2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnBoaSx0LnRoZXRhKX1zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKHQsZSxuKXtjb25zdCBpPU1hdGguc2luKGUpKnQ7cmV0dXJuIHRoaXMueD1pKk1hdGguc2luKG4pLHRoaXMueT1NYXRoLmNvcyhlKSp0LHRoaXMuej1pKk1hdGguY29zKG4pLHRoaXN9c2V0RnJvbUN5bGluZHJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LnJhZGl1cyx0LnRoZXRhLHQueSl9c2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQqTWF0aC5zaW4oZSksdGhpcy55PW4sdGhpcy56PXQqTWF0aC5jb3MoZSksdGhpc31zZXRGcm9tTWF0cml4UG9zaXRpb24odCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9ZVsxMl0sdGhpcy55PWVbMTNdLHRoaXMuej1lWzE0XSx0aGlzfXNldEZyb21NYXRyaXhTY2FsZSh0KXtjb25zdCBlPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLG49dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMSkubGVuZ3RoKCksaT10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gdGhpcy54PWUsdGhpcy55PW4sdGhpcy56PWksdGhpc31zZXRGcm9tTWF0cml4Q29sdW1uKHQsZSl7cmV0dXJuIHRoaXMuZnJvbUFycmF5KHQuZWxlbWVudHMsNCplKX1zZXRGcm9tTWF0cml4M0NvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLDMqZSl9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueSYmdC56PT09dGhpcy56fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpcy56PXRbZSsyXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHRbZSsyXT10aGlzLnosdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSxuKXtyZXR1cm4gdm9pZCAwIT09biYmY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuIiksdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXMuej10LmdldFooZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpc319Q0p0LnByb3RvdHlwZS5pc1ZlY3RvcjM9ITA7Y29uc3QgQUp0PW5ldyBDSnQsa0p0PW5ldyBUSnQ7Y2xhc3MgTEp0e2NvbnN0cnVjdG9yKHQ9bmV3IENKdCgxLzAsMS8wLDEvMCksZT1uZXcgQ0p0KC0xLzAsLTEvMCwtMS8wKSl7dGhpcy5taW49dCx0aGlzLm1heD1lfXNldCh0LGUpe3JldHVybiB0aGlzLm1pbi5jb3B5KHQpLHRoaXMubWF4LmNvcHkoZSksdGhpc31zZXRGcm9tQXJyYXkodCl7bGV0IGU9MS8wLG49MS8wLGk9MS8wLHI9LTEvMCxvPS0xLzAsYT0tMS8wO2ZvcihsZXQgcz0wLGw9dC5sZW5ndGg7czxsO3MrPTMpe2NvbnN0IGw9dFtzXSxjPXRbcysxXSx1PXRbcysyXTtsPGUmJihlPWwpLGM8biYmKG49YyksdTxpJiYoaT11KSxsPnImJihyPWwpLGM+byYmKG89YyksdT5hJiYoYT11KX1yZXR1cm4gdGhpcy5taW4uc2V0KGUsbixpKSx0aGlzLm1heC5zZXQocixvLGEpLHRoaXN9c2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KXtsZXQgZT0xLzAsbj0xLzAsaT0xLzAscj0tMS8wLG89LTEvMCxhPS0xLzA7Zm9yKGxldCBzPTAsbD10LmNvdW50O3M8bDtzKyspe2NvbnN0IGw9dC5nZXRYKHMpLGM9dC5nZXRZKHMpLHU9dC5nZXRaKHMpO2w8ZSYmKGU9bCksYzxuJiYobj1jKSx1PGkmJihpPXUpLGw+ciYmKHI9bCksYz5vJiYobz1jKSx1PmEmJihhPXUpfXJldHVybiB0aGlzLm1pbi5zZXQoZSxuLGkpLHRoaXMubWF4LnNldChyLG8sYSksdGhpc31zZXRGcm9tUG9pbnRzKHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXRoaXMuZXhwYW5kQnlQb2ludCh0W2VdKTtyZXR1cm4gdGhpc31zZXRGcm9tQ2VudGVyQW5kU2l6ZSh0LGUpe2NvbnN0IG49Tkp0LmNvcHkoZSkubXVsdGlwbHlTY2FsYXIoLjUpO3JldHVybiB0aGlzLm1pbi5jb3B5KHQpLnN1YihuKSx0aGlzLm1heC5jb3B5KHQpLmFkZChuKSx0aGlzfXNldEZyb21PYmplY3QodCl7cmV0dXJuIHRoaXMubWFrZUVtcHR5KCksdGhpcy5leHBhbmRCeU9iamVjdCh0KX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLm1pbi5jb3B5KHQubWluKSx0aGlzLm1heC5jb3B5KHQubWF4KSx0aGlzfW1ha2VFbXB0eSgpe3JldHVybiB0aGlzLm1pbi54PXRoaXMubWluLnk9dGhpcy5taW4uej0xLzAsdGhpcy5tYXgueD10aGlzLm1heC55PXRoaXMubWF4Lno9LTEvMCx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5tYXgueDx0aGlzLm1pbi54fHx0aGlzLm1heC55PHRoaXMubWluLnl8fHRoaXMubWF4Lno8dGhpcy5taW4uen1nZXRDZW50ZXIodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3Quc2V0KDAsMCwwKTp0LmFkZFZlY3RvcnModGhpcy5taW4sdGhpcy5tYXgpLm11bHRpcGx5U2NhbGFyKC41KX1nZXRTaXplKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDAsMCk6dC5zdWJWZWN0b3JzKHRoaXMubWF4LHRoaXMubWluKX1leHBhbmRCeVBvaW50KHQpe3JldHVybiB0aGlzLm1pbi5taW4odCksdGhpcy5tYXgubWF4KHQpLHRoaXN9ZXhwYW5kQnlWZWN0b3IodCl7cmV0dXJuIHRoaXMubWluLnN1Yih0KSx0aGlzLm1heC5hZGQodCksdGhpc31leHBhbmRCeVNjYWxhcih0KXtyZXR1cm4gdGhpcy5taW4uYWRkU2NhbGFyKC10KSx0aGlzLm1heC5hZGRTY2FsYXIodCksdGhpc31leHBhbmRCeU9iamVjdCh0KXt0LnVwZGF0ZVdvcmxkTWF0cml4KCExLCExKTtjb25zdCBlPXQuZ2VvbWV0cnk7dm9pZCAwIT09ZSYmKG51bGw9PT1lLmJvdW5kaW5nQm94JiZlLmNvbXB1dGVCb3VuZGluZ0JveCgpLElKdC5jb3B5KGUuYm91bmRpbmdCb3gpLElKdC5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy51bmlvbihJSnQpKTtjb25zdCBuPXQuY2hpbGRyZW47Zm9yKGxldCB0PTAsZT1uLmxlbmd0aDt0PGU7dCsrKXRoaXMuZXhwYW5kQnlPYmplY3Qoblt0XSk7cmV0dXJuIHRoaXN9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4hKHQueDx0aGlzLm1pbi54fHx0Lng+dGhpcy5tYXgueHx8dC55PHRoaXMubWluLnl8fHQueT50aGlzLm1heC55fHx0Lno8dGhpcy5taW4uenx8dC56PnRoaXMubWF4LnopfWNvbnRhaW5zQm94KHQpe3JldHVybiB0aGlzLm1pbi54PD10Lm1pbi54JiZ0Lm1heC54PD10aGlzLm1heC54JiZ0aGlzLm1pbi55PD10Lm1pbi55JiZ0Lm1heC55PD10aGlzLm1heC55JiZ0aGlzLm1pbi56PD10Lm1pbi56JiZ0Lm1heC56PD10aGlzLm1heC56fWdldFBhcmFtZXRlcih0LGUpe3JldHVybiBlLnNldCgodC54LXRoaXMubWluLngpLyh0aGlzLm1heC54LXRoaXMubWluLngpLCh0LnktdGhpcy5taW4ueSkvKHRoaXMubWF4LnktdGhpcy5taW4ueSksKHQuei10aGlzLm1pbi56KS8odGhpcy5tYXguei10aGlzLm1pbi56KSl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4hKHQubWF4Lng8dGhpcy5taW4ueHx8dC5taW4ueD50aGlzLm1heC54fHx0Lm1heC55PHRoaXMubWluLnl8fHQubWluLnk+dGhpcy5tYXgueXx8dC5tYXguejx0aGlzLm1pbi56fHx0Lm1pbi56PnRoaXMubWF4LnopfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHRoaXMuY2xhbXBQb2ludCh0LmNlbnRlcixOSnQpLE5KdC5kaXN0YW5jZVRvU3F1YXJlZCh0LmNlbnRlcik8PXQucmFkaXVzKnQucmFkaXVzfWludGVyc2VjdHNQbGFuZSh0KXtsZXQgZSxuO3JldHVybiB0Lm5vcm1hbC54PjA/KGU9dC5ub3JtYWwueCp0aGlzLm1pbi54LG49dC5ub3JtYWwueCp0aGlzLm1heC54KTooZT10Lm5vcm1hbC54KnRoaXMubWF4Lngsbj10Lm5vcm1hbC54KnRoaXMubWluLngpLHQubm9ybWFsLnk+MD8oZSs9dC5ub3JtYWwueSp0aGlzLm1pbi55LG4rPXQubm9ybWFsLnkqdGhpcy5tYXgueSk6KGUrPXQubm9ybWFsLnkqdGhpcy5tYXgueSxuKz10Lm5vcm1hbC55KnRoaXMubWluLnkpLHQubm9ybWFsLno+MD8oZSs9dC5ub3JtYWwueip0aGlzLm1pbi56LG4rPXQubm9ybWFsLnoqdGhpcy5tYXgueik6KGUrPXQubm9ybWFsLnoqdGhpcy5tYXgueixuKz10Lm5vcm1hbC56KnRoaXMubWluLnopLGU8PS10LmNvbnN0YW50JiZuPj0tdC5jb25zdGFudH1pbnRlcnNlY3RzVHJpYW5nbGUodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuITE7dGhpcy5nZXRDZW50ZXIoRkp0KSxWSnQuc3ViVmVjdG9ycyh0aGlzLm1heCxGSnQpLFJKdC5zdWJWZWN0b3JzKHQuYSxGSnQpLE9KdC5zdWJWZWN0b3JzKHQuYixGSnQpLHpKdC5zdWJWZWN0b3JzKHQuYyxGSnQpLERKdC5zdWJWZWN0b3JzKE9KdCxSSnQpLEJKdC5zdWJWZWN0b3JzKHpKdCxPSnQpLEhKdC5zdWJWZWN0b3JzKFJKdCx6SnQpO2xldCBlPVswLC1ESnQueixESnQueSwwLC1CSnQueixCSnQueSwwLC1ISnQueixISnQueSxESnQueiwwLC1ESnQueCxCSnQueiwwLC1CSnQueCxISnQueiwwLC1ISnQueCwtREp0LnksREp0LngsMCwtQkp0LnksQkp0LngsMCwtSEp0LnksSEp0LngsMF07cmV0dXJuISFHSnQoZSxSSnQsT0p0LHpKdCxWSnQpJiYoZT1bMSwwLDAsMCwxLDAsMCwwLDFdLCEhR0p0KGUsUkp0LE9KdCx6SnQsVkp0KSYmKFVKdC5jcm9zc1ZlY3RvcnMoREp0LEJKdCksZT1bVUp0LngsVUp0LnksVUp0LnpdLEdKdChlLFJKdCxPSnQsekp0LFZKdCkpKX1jbGFtcFBvaW50KHQsZSl7cmV0dXJuIGUuY29weSh0KS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCl9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiBOSnQuY29weSh0KS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCkuc3ViKHQpLmxlbmd0aCgpfWdldEJvdW5kaW5nU3BoZXJlKHQpe3JldHVybiB0aGlzLmdldENlbnRlcih0LmNlbnRlciksdC5yYWRpdXM9LjUqdGhpcy5nZXRTaXplKE5KdCkubGVuZ3RoKCksdH1pbnRlcnNlY3QodCl7cmV0dXJuIHRoaXMubWluLm1heCh0Lm1pbiksdGhpcy5tYXgubWluKHQubWF4KSx0aGlzLmlzRW1wdHkoKSYmdGhpcy5tYWtlRW1wdHkoKSx0aGlzfXVuaW9uKHQpe3JldHVybiB0aGlzLm1pbi5taW4odC5taW4pLHRoaXMubWF4Lm1heCh0Lm1heCksdGhpc31hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpfHwoUEp0WzBdLnNldCh0aGlzLm1pbi54LHRoaXMubWluLnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLFBKdFsxXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSxQSnRbMl0uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksUEp0WzNdLnNldCh0aGlzLm1pbi54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLFBKdFs0XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxQSnRbNV0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksUEp0WzZdLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLFBKdFs3XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx0aGlzLnNldEZyb21Qb2ludHMoUEp0KSksdGhpc310cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMubWluLmFkZCh0KSx0aGlzLm1heC5hZGQodCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQubWluLmVxdWFscyh0aGlzLm1pbikmJnQubWF4LmVxdWFscyh0aGlzLm1heCl9fUxKdC5wcm90b3R5cGUuaXNCb3gzPSEwO2NvbnN0IFBKdD1bbmV3IENKdCxuZXcgQ0p0LG5ldyBDSnQsbmV3IENKdCxuZXcgQ0p0LG5ldyBDSnQsbmV3IENKdCxuZXcgQ0p0XSxOSnQ9bmV3IENKdCxJSnQ9bmV3IExKdCxSSnQ9bmV3IENKdCxPSnQ9bmV3IENKdCx6SnQ9bmV3IENKdCxESnQ9bmV3IENKdCxCSnQ9bmV3IENKdCxISnQ9bmV3IENKdCxGSnQ9bmV3IENKdCxWSnQ9bmV3IENKdCxVSnQ9bmV3IENKdCxqSnQ9bmV3IENKdDtmdW5jdGlvbiBHSnQodCxlLG4saSxyKXtmb3IobGV0IG89MCxhPXQubGVuZ3RoLTM7bzw9YTtvKz0zKXtqSnQuZnJvbUFycmF5KHQsbyk7Y29uc3QgYT1yLngqTWF0aC5hYnMoakp0LngpK3IueSpNYXRoLmFicyhqSnQueSkrci56Kk1hdGguYWJzKGpKdC56KSxzPWUuZG90KGpKdCksbD1uLmRvdChqSnQpLGM9aS5kb3Qoakp0KTtpZihNYXRoLm1heCgtTWF0aC5tYXgocyxsLGMpLE1hdGgubWluKHMsbCxjKSk+YSlyZXR1cm4hMX1yZXR1cm4hMH1jb25zdCBXSnQ9bmV3IExKdCxxSnQ9bmV3IENKdCxZSnQ9bmV3IENKdCxYSnQ9bmV3IENKdDtjbGFzcyAkSnR7Y29uc3RydWN0b3IodD1uZXcgQ0p0LGU9LTEpe3RoaXMuY2VudGVyPXQsdGhpcy5yYWRpdXM9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0KSx0aGlzLnJhZGl1cz1lLHRoaXN9c2V0RnJvbVBvaW50cyh0LGUpe2NvbnN0IG49dGhpcy5jZW50ZXI7dm9pZCAwIT09ZT9uLmNvcHkoZSk6V0p0LnNldEZyb21Qb2ludHModCkuZ2V0Q2VudGVyKG4pO2xldCBpPTA7Zm9yKGxldCBlPTAscj10Lmxlbmd0aDtlPHI7ZSsrKWk9TWF0aC5tYXgoaSxuLmRpc3RhbmNlVG9TcXVhcmVkKHRbZV0pKTtyZXR1cm4gdGhpcy5yYWRpdXM9TWF0aC5zcXJ0KGkpLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5yYWRpdXM9dC5yYWRpdXMsdGhpc31pc0VtcHR5KCl7cmV0dXJuIHRoaXMucmFkaXVzPDB9bWFrZUVtcHR5KCl7cmV0dXJuIHRoaXMuY2VudGVyLnNldCgwLDAsMCksdGhpcy5yYWRpdXM9LTEsdGhpc31jb250YWluc1BvaW50KHQpe3JldHVybiB0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXN9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiB0LmRpc3RhbmNlVG8odGhpcy5jZW50ZXIpLXRoaXMucmFkaXVzfWludGVyc2VjdHNTcGhlcmUodCl7Y29uc3QgZT10aGlzLnJhZGl1cyt0LnJhZGl1cztyZXR1cm4gdC5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD1lKmV9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzU3BoZXJlKHRoaXMpfWludGVyc2VjdHNQbGFuZSh0KXtyZXR1cm4gTWF0aC5hYnModC5kaXN0YW5jZVRvUG9pbnQodGhpcy5jZW50ZXIpKTw9dGhpcy5yYWRpdXN9Y2xhbXBQb2ludCh0LGUpe2NvbnN0IG49dGhpcy5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodCk7cmV0dXJuIGUuY29weSh0KSxuPnRoaXMucmFkaXVzKnRoaXMucmFkaXVzJiYoZS5zdWIodGhpcy5jZW50ZXIpLm5vcm1hbGl6ZSgpLGUubXVsdGlwbHlTY2FsYXIodGhpcy5yYWRpdXMpLmFkZCh0aGlzLmNlbnRlcikpLGV9Z2V0Qm91bmRpbmdCb3godCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpPyh0Lm1ha2VFbXB0eSgpLHQpOih0LnNldCh0aGlzLmNlbnRlcix0aGlzLmNlbnRlciksdC5leHBhbmRCeVNjYWxhcih0aGlzLnJhZGl1cyksdCl9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLmNlbnRlci5hcHBseU1hdHJpeDQodCksdGhpcy5yYWRpdXM9dGhpcy5yYWRpdXMqdC5nZXRNYXhTY2FsZU9uQXhpcygpLHRoaXN9dHJhbnNsYXRlKHQpe3JldHVybiB0aGlzLmNlbnRlci5hZGQodCksdGhpc31leHBhbmRCeVBvaW50KHQpe1hKdC5zdWJWZWN0b3JzKHQsdGhpcy5jZW50ZXIpO2NvbnN0IGU9WEp0Lmxlbmd0aFNxKCk7aWYoZT50aGlzLnJhZGl1cyp0aGlzLnJhZGl1cyl7Y29uc3QgdD1NYXRoLnNxcnQoZSksbj0uNSoodC10aGlzLnJhZGl1cyk7dGhpcy5jZW50ZXIuYWRkKFhKdC5tdWx0aXBseVNjYWxhcihuL3QpKSx0aGlzLnJhZGl1cys9bn1yZXR1cm4gdGhpc311bmlvbih0KXtyZXR1cm4gWUp0LnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5jZW50ZXIpLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQucmFkaXVzKSx0aGlzLmV4cGFuZEJ5UG9pbnQocUp0LmNvcHkodC5jZW50ZXIpLmFkZChZSnQpKSx0aGlzLmV4cGFuZEJ5UG9pbnQocUp0LmNvcHkodC5jZW50ZXIpLnN1YihZSnQpKSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5jZW50ZXIuZXF1YWxzKHRoaXMuY2VudGVyKSYmdC5yYWRpdXM9PT10aGlzLnJhZGl1c31jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19Y29uc3QgS0p0PW5ldyBDSnQsWkp0PW5ldyBDSnQsSkp0PW5ldyBDSnQsUUp0PW5ldyBDSnQsdFF0PW5ldyBDSnQsZVF0PW5ldyBDSnQsblF0PW5ldyBDSnQ7Y2xhc3MgaVF0e2NvbnN0cnVjdG9yKHQ9bmV3IENKdCxlPW5ldyBDSnQoMCwwLC0xKSl7dGhpcy5vcmlnaW49dCx0aGlzLmRpcmVjdGlvbj1lfXNldCh0LGUpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQpLHRoaXMuZGlyZWN0aW9uLmNvcHkoZSksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHQub3JpZ2luKSx0aGlzLmRpcmVjdGlvbi5jb3B5KHQuZGlyZWN0aW9uKSx0aGlzfWF0KHQsZSl7cmV0dXJuIGUuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIodCkuYWRkKHRoaXMub3JpZ2luKX1sb29rQXQodCl7cmV0dXJuIHRoaXMuZGlyZWN0aW9uLmNvcHkodCkuc3ViKHRoaXMub3JpZ2luKS5ub3JtYWxpemUoKSx0aGlzfXJlY2FzdCh0KXtyZXR1cm4gdGhpcy5vcmlnaW4uY29weSh0aGlzLmF0KHQsS0p0KSksdGhpc31jbG9zZXN0UG9pbnRUb1BvaW50KHQsZSl7ZS5zdWJWZWN0b3JzKHQsdGhpcy5vcmlnaW4pO2NvbnN0IG49ZS5kb3QodGhpcy5kaXJlY3Rpb24pO3JldHVybiBuPDA/ZS5jb3B5KHRoaXMub3JpZ2luKTplLmNvcHkodGhpcy5kaXJlY3Rpb24pLm11bHRpcGx5U2NhbGFyKG4pLmFkZCh0aGlzLm9yaWdpbil9ZGlzdGFuY2VUb1BvaW50KHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVNxVG9Qb2ludCh0KSl9ZGlzdGFuY2VTcVRvUG9pbnQodCl7Y29uc3QgZT1LSnQuc3ViVmVjdG9ycyh0LHRoaXMub3JpZ2luKS5kb3QodGhpcy5kaXJlY3Rpb24pO3JldHVybiBlPDA/dGhpcy5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQodCk6KEtKdC5jb3B5KHRoaXMuZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcihlKS5hZGQodGhpcy5vcmlnaW4pLEtKdC5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VTcVRvU2VnbWVudCh0LGUsbixpKXtaSnQuY29weSh0KS5hZGQoZSkubXVsdGlwbHlTY2FsYXIoLjUpLEpKdC5jb3B5KGUpLnN1Yih0KS5ub3JtYWxpemUoKSxRSnQuY29weSh0aGlzLm9yaWdpbikuc3ViKFpKdCk7Y29uc3Qgcj0uNSp0LmRpc3RhbmNlVG8oZSksbz0tdGhpcy5kaXJlY3Rpb24uZG90KEpKdCksYT1RSnQuZG90KHRoaXMuZGlyZWN0aW9uKSxzPS1RSnQuZG90KEpKdCksbD1RSnQubGVuZ3RoU3EoKSxjPU1hdGguYWJzKDEtbypvKTtsZXQgdSxoLGQscDtpZihjPjApaWYodT1vKnMtYSxoPW8qYS1zLHA9cipjLHU+PTApaWYoaD49LXApaWYoaDw9cCl7Y29uc3QgdD0xL2M7dSo9dCxoKj10LGQ9dSoodStvKmgrMiphKStoKihvKnUraCsyKnMpK2x9ZWxzZSBoPXIsdT1NYXRoLm1heCgwLC0obypoK2EpKSxkPS11KnUraCooaCsyKnMpK2w7ZWxzZSBoPS1yLHU9TWF0aC5tYXgoMCwtKG8qaCthKSksZD0tdSp1K2gqKGgrMipzKStsO2Vsc2UgaDw9LXA/KHU9TWF0aC5tYXgoMCwtKC1vKnIrYSkpLGg9dT4wPy1yOk1hdGgubWluKE1hdGgubWF4KC1yLC1zKSxyKSxkPS11KnUraCooaCsyKnMpK2wpOmg8PXA/KHU9MCxoPU1hdGgubWluKE1hdGgubWF4KC1yLC1zKSxyKSxkPWgqKGgrMipzKStsKToodT1NYXRoLm1heCgwLC0obypyK2EpKSxoPXU+MD9yOk1hdGgubWluKE1hdGgubWF4KC1yLC1zKSxyKSxkPS11KnUraCooaCsyKnMpK2wpO2Vsc2UgaD1vPjA/LXI6cix1PU1hdGgubWF4KDAsLShvKmgrYSkpLGQ9LXUqdStoKihoKzIqcykrbDtyZXR1cm4gbiYmbi5jb3B5KHRoaXMuZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcih1KS5hZGQodGhpcy5vcmlnaW4pLGkmJmkuY29weShKSnQpLm11bHRpcGx5U2NhbGFyKGgpLmFkZChaSnQpLGR9aW50ZXJzZWN0U3BoZXJlKHQsZSl7S0p0LnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5vcmlnaW4pO2NvbnN0IG49S0p0LmRvdCh0aGlzLmRpcmVjdGlvbiksaT1LSnQuZG90KEtKdCktbipuLHI9dC5yYWRpdXMqdC5yYWRpdXM7aWYoaT5yKXJldHVybiBudWxsO2NvbnN0IG89TWF0aC5zcXJ0KHItaSksYT1uLW8scz1uK287cmV0dXJuIGE8MCYmczwwP251bGw6dGhpcy5hdChhPDA/czphLGUpfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31kaXN0YW5jZVRvUGxhbmUodCl7Y29uc3QgZT10Lm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKDA9PT1lKXJldHVybiAwPT09dC5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pPzA6bnVsbDtjb25zdCBuPS0odGhpcy5vcmlnaW4uZG90KHQubm9ybWFsKSt0LmNvbnN0YW50KS9lO3JldHVybiBuPj0wP246bnVsbH1pbnRlcnNlY3RQbGFuZSh0LGUpe2NvbnN0IG49dGhpcy5kaXN0YW5jZVRvUGxhbmUodCk7cmV0dXJuIG51bGw9PT1uP251bGw6dGhpcy5hdChuLGUpfWludGVyc2VjdHNQbGFuZSh0KXtjb25zdCBlPXQuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKTtyZXR1cm4gMD09PWV8fHQubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbikqZTwwfWludGVyc2VjdEJveCh0LGUpe2xldCBuLGkscixvLGEscztjb25zdCBsPTEvdGhpcy5kaXJlY3Rpb24ueCxjPTEvdGhpcy5kaXJlY3Rpb24ueSx1PTEvdGhpcy5kaXJlY3Rpb24ueixoPXRoaXMub3JpZ2luO3JldHVybiBsPj0wPyhuPSh0Lm1pbi54LWgueCkqbCxpPSh0Lm1heC54LWgueCkqbCk6KG49KHQubWF4LngtaC54KSpsLGk9KHQubWluLngtaC54KSpsKSxjPj0wPyhyPSh0Lm1pbi55LWgueSkqYyxvPSh0Lm1heC55LWgueSkqYyk6KHI9KHQubWF4LnktaC55KSpjLG89KHQubWluLnktaC55KSpjKSxuPm98fHI+aT9udWxsOigocj5ufHxuIT1uKSYmKG49ciksKG88aXx8aSE9aSkmJihpPW8pLHU+PTA/KGE9KHQubWluLnotaC56KSp1LHM9KHQubWF4LnotaC56KSp1KTooYT0odC5tYXguei1oLnopKnUscz0odC5taW4uei1oLnopKnUpLG4+c3x8YT5pP251bGw6KChhPm58fG4hPW4pJiYobj1hKSwoczxpfHxpIT1pKSYmKGk9cyksaTwwP251bGw6dGhpcy5hdChuPj0wP246aSxlKSkpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIG51bGwhPT10aGlzLmludGVyc2VjdEJveCh0LEtKdCl9aW50ZXJzZWN0VHJpYW5nbGUodCxlLG4saSxyKXt0UXQuc3ViVmVjdG9ycyhlLHQpLGVRdC5zdWJWZWN0b3JzKG4sdCksblF0LmNyb3NzVmVjdG9ycyh0UXQsZVF0KTtsZXQgbyxhPXRoaXMuZGlyZWN0aW9uLmRvdChuUXQpO2lmKGE+MCl7aWYoaSlyZXR1cm4gbnVsbDtvPTF9ZWxzZXtpZighKGE8MCkpcmV0dXJuIG51bGw7bz0tMSxhPS1hfVFKdC5zdWJWZWN0b3JzKHRoaXMub3JpZ2luLHQpO2NvbnN0IHM9byp0aGlzLmRpcmVjdGlvbi5kb3QoZVF0LmNyb3NzVmVjdG9ycyhRSnQsZVF0KSk7aWYoczwwKXJldHVybiBudWxsO2NvbnN0IGw9byp0aGlzLmRpcmVjdGlvbi5kb3QodFF0LmNyb3NzKFFKdCkpO2lmKGw8MClyZXR1cm4gbnVsbDtpZihzK2w+YSlyZXR1cm4gbnVsbDtjb25zdCBjPS1vKlFKdC5kb3QoblF0KTtyZXR1cm4gYzwwP251bGw6dGhpcy5hdChjL2Escil9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLm9yaWdpbi5hcHBseU1hdHJpeDQodCksdGhpcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKHQpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm9yaWdpbi5lcXVhbHModGhpcy5vcmlnaW4pJiZ0LmRpcmVjdGlvbi5lcXVhbHModGhpcy5kaXJlY3Rpb24pfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfX1jbGFzcyByUXR7Y29uc3RydWN0b3IoKXt0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSxhcmd1bWVudHMubGVuZ3RoPjAmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuIil9c2V0KHQsZSxuLGkscixvLGEscyxsLGMsdSxoLGQscCxmLG0pe2NvbnN0IGc9dGhpcy5lbGVtZW50cztyZXR1cm4gZ1swXT10LGdbNF09ZSxnWzhdPW4sZ1sxMl09aSxnWzFdPXIsZ1s1XT1vLGdbOV09YSxnWzEzXT1zLGdbMl09bCxnWzZdPWMsZ1sxMF09dSxnWzE0XT1oLGdbM109ZCxnWzddPXAsZ1sxMV09ZixnWzE1XT1tLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31jbG9uZSgpe3JldHVybihuZXcgclF0KS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9Y29weSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO3JldHVybiBlWzBdPW5bMF0sZVsxXT1uWzFdLGVbMl09blsyXSxlWzNdPW5bM10sZVs0XT1uWzRdLGVbNV09bls1XSxlWzZdPW5bNl0sZVs3XT1uWzddLGVbOF09bls4XSxlWzldPW5bOV0sZVsxMF09blsxMF0sZVsxMV09blsxMV0sZVsxMl09blsxMl0sZVsxM109blsxM10sZVsxNF09blsxNF0sZVsxNV09blsxNV0sdGhpc31jb3B5UG9zaXRpb24odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVsxMl09blsxMl0sZVsxM109blsxM10sZVsxNF09blsxNF0sdGhpc31zZXRGcm9tTWF0cml4Myh0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMuc2V0KGVbMF0sZVszXSxlWzZdLDAsZVsxXSxlWzRdLGVbN10sMCxlWzJdLGVbNV0sZVs4XSwwLDAsMCwwLDEpLHRoaXN9ZXh0cmFjdEJhc2lzKHQsZSxuKXtyZXR1cm4gdC5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMCksZS5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMSksbi5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMiksdGhpc31tYWtlQmFzaXModCxlLG4pe3JldHVybiB0aGlzLnNldCh0LngsZS54LG4ueCwwLHQueSxlLnksbi55LDAsdC56LGUueixuLnosMCwwLDAsMCwxKSx0aGlzfWV4dHJhY3RSb3RhdGlvbih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzLGk9MS9vUXQuc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLHI9MS9vUXQuc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLG89MS9vUXQuc2V0RnJvbU1hdHJpeENvbHVtbih0LDIpLmxlbmd0aCgpO3JldHVybiBlWzBdPW5bMF0qaSxlWzFdPW5bMV0qaSxlWzJdPW5bMl0qaSxlWzNdPTAsZVs0XT1uWzRdKnIsZVs1XT1uWzVdKnIsZVs2XT1uWzZdKnIsZVs3XT0wLGVbOF09bls4XSpvLGVbOV09bls5XSpvLGVbMTBdPW5bMTBdKm8sZVsxMV09MCxlWzEyXT0wLGVbMTNdPTAsZVsxNF09MCxlWzE1XT0xLHRoaXN9bWFrZVJvdGF0aW9uRnJvbUV1bGVyKHQpe3QmJnQuaXNFdWxlcnx8Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLm1ha2VSb3RhdGlvbkZyb21FdWxlcigpIG5vdyBleHBlY3RzIGEgRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4iKTtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LngsaT10Lnkscj10Lnosbz1NYXRoLmNvcyhuKSxhPU1hdGguc2luKG4pLHM9TWF0aC5jb3MoaSksbD1NYXRoLnNpbihpKSxjPU1hdGguY29zKHIpLHU9TWF0aC5zaW4ocik7aWYoIlhZWiI9PT10Lm9yZGVyKXtjb25zdCB0PW8qYyxuPW8qdSxpPWEqYyxyPWEqdTtlWzBdPXMqYyxlWzRdPS1zKnUsZVs4XT1sLGVbMV09bitpKmwsZVs1XT10LXIqbCxlWzldPS1hKnMsZVsyXT1yLXQqbCxlWzZdPWkrbipsLGVbMTBdPW8qc31lbHNlIGlmKCJZWFoiPT09dC5vcmRlcil7Y29uc3QgdD1zKmMsbj1zKnUsaT1sKmMscj1sKnU7ZVswXT10K3IqYSxlWzRdPWkqYS1uLGVbOF09bypsLGVbMV09byp1LGVbNV09bypjLGVbOV09LWEsZVsyXT1uKmEtaSxlWzZdPXIrdCphLGVbMTBdPW8qc31lbHNlIGlmKCJaWFkiPT09dC5vcmRlcil7Y29uc3QgdD1zKmMsbj1zKnUsaT1sKmMscj1sKnU7ZVswXT10LXIqYSxlWzRdPS1vKnUsZVs4XT1pK24qYSxlWzFdPW4raSphLGVbNV09bypjLGVbOV09ci10KmEsZVsyXT0tbypsLGVbNl09YSxlWzEwXT1vKnN9ZWxzZSBpZigiWllYIj09PXQub3JkZXIpe2NvbnN0IHQ9bypjLG49byp1LGk9YSpjLHI9YSp1O2VbMF09cypjLGVbNF09aSpsLW4sZVs4XT10KmwrcixlWzFdPXMqdSxlWzVdPXIqbCt0LGVbOV09bipsLWksZVsyXT0tbCxlWzZdPWEqcyxlWzEwXT1vKnN9ZWxzZSBpZigiWVpYIj09PXQub3JkZXIpe2NvbnN0IHQ9bypzLG49bypsLGk9YSpzLHI9YSpsO2VbMF09cypjLGVbNF09ci10KnUsZVs4XT1pKnUrbixlWzFdPXUsZVs1XT1vKmMsZVs5XT0tYSpjLGVbMl09LWwqYyxlWzZdPW4qdStpLGVbMTBdPXQtcip1fWVsc2UgaWYoIlhaWSI9PT10Lm9yZGVyKXtjb25zdCB0PW8qcyxuPW8qbCxpPWEqcyxyPWEqbDtlWzBdPXMqYyxlWzRdPS11LGVbOF09bCpjLGVbMV09dCp1K3IsZVs1XT1vKmMsZVs5XT1uKnUtaSxlWzJdPWkqdS1uLGVbNl09YSpjLGVbMTBdPXIqdSt0fXJldHVybiBlWzNdPTAsZVs3XT0wLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLmNvbXBvc2Uoc1F0LHQsbFF0KX1sb29rQXQodCxlLG4pe2NvbnN0IGk9dGhpcy5lbGVtZW50cztyZXR1cm4gaFF0LnN1YlZlY3RvcnModCxlKSwwPT09aFF0Lmxlbmd0aFNxKCkmJihoUXQuej0xKSxoUXQubm9ybWFsaXplKCksY1F0LmNyb3NzVmVjdG9ycyhuLGhRdCksMD09PWNRdC5sZW5ndGhTcSgpJiYoMT09PU1hdGguYWJzKG4ueik/aFF0LngrPTFlLTQ6aFF0LnorPTFlLTQsaFF0Lm5vcm1hbGl6ZSgpLGNRdC5jcm9zc1ZlY3RvcnMobixoUXQpKSxjUXQubm9ybWFsaXplKCksdVF0LmNyb3NzVmVjdG9ycyhoUXQsY1F0KSxpWzBdPWNRdC54LGlbNF09dVF0LngsaVs4XT1oUXQueCxpWzFdPWNRdC55LGlbNV09dVF0LnksaVs5XT1oUXQueSxpWzJdPWNRdC56LGlbNl09dVF0LnosaVsxMF09aFF0LnosdGhpc31tdWx0aXBseSh0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5TWF0cmljZXMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LGUpKTp0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHQsdGhpcyl9bXVsdGlwbHlNYXRyaWNlcyh0LGUpe2NvbnN0IG49dC5lbGVtZW50cyxpPWUuZWxlbWVudHMscj10aGlzLmVsZW1lbnRzLG89blswXSxhPW5bNF0scz1uWzhdLGw9blsxMl0sYz1uWzFdLHU9bls1XSxoPW5bOV0sZD1uWzEzXSxwPW5bMl0sZj1uWzZdLG09blsxMF0sZz1uWzE0XSxfPW5bM10seT1uWzddLHY9blsxMV0sYj1uWzE1XSx4PWlbMF0sdz1pWzRdLFM9aVs4XSxNPWlbMTJdLEU9aVsxXSxUPWlbNV0sQz1pWzldLEE9aVsxM10saz1pWzJdLEw9aVs2XSxQPWlbMTBdLE49aVsxNF0sST1pWzNdLFI9aVs3XSxPPWlbMTFdLHo9aVsxNV07cmV0dXJuIHJbMF09byp4K2EqRStzKmsrbCpJLHJbNF09byp3K2EqVCtzKkwrbCpSLHJbOF09bypTK2EqQytzKlArbCpPLHJbMTJdPW8qTSthKkErcypOK2wqeixyWzFdPWMqeCt1KkUraCprK2QqSSxyWzVdPWMqdyt1KlQraCpMK2QqUixyWzldPWMqUyt1KkMraCpQK2QqTyxyWzEzXT1jKk0rdSpBK2gqTitkKnosclsyXT1wKngrZipFK20qaytnKkkscls2XT1wKncrZipUK20qTCtnKlIsclsxMF09cCpTK2YqQyttKlArZypPLHJbMTRdPXAqTStmKkErbSpOK2cqeixyWzNdPV8qeCt5KkUrdiprK2IqSSxyWzddPV8qdyt5KlQrdipMK2IqUixyWzExXT1fKlMreSpDK3YqUCtiKk8sclsxNV09XypNK3kqQSt2Kk4rYip6LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbNF0qPXQsZVs4XSo9dCxlWzEyXSo9dCxlWzFdKj10LGVbNV0qPXQsZVs5XSo9dCxlWzEzXSo9dCxlWzJdKj10LGVbNl0qPXQsZVsxMF0qPXQsZVsxNF0qPXQsZVszXSo9dCxlWzddKj10LGVbMTFdKj10LGVbMTVdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFs0XSxpPXRbOF0scj10WzEyXSxvPXRbMV0sYT10WzVdLHM9dFs5XSxsPXRbMTNdLGM9dFsyXSx1PXRbNl0saD10WzEwXSxkPXRbMTRdO3JldHVybiB0WzNdKigrcipzKnUtaSpsKnUtciphKmgrbipsKmgraSphKmQtbipzKmQpK3RbN10qKCtlKnMqZC1lKmwqaCtyKm8qaC1pKm8qZCtpKmwqYy1yKnMqYykrdFsxMV0qKCtlKmwqdS1lKmEqZC1yKm8qdStuKm8qZCtyKmEqYy1uKmwqYykrdFsxNV0qKC1pKmEqYy1lKnMqdStlKmEqaCtpKm8qdS1uKm8qaCtuKnMqYyl9dHJhbnNwb3NlKCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzO2xldCBlO3JldHVybiBlPXRbMV0sdFsxXT10WzRdLHRbNF09ZSxlPXRbMl0sdFsyXT10WzhdLHRbOF09ZSxlPXRbNl0sdFs2XT10WzldLHRbOV09ZSxlPXRbM10sdFszXT10WzEyXSx0WzEyXT1lLGU9dFs3XSx0WzddPXRbMTNdLHRbMTNdPWUsZT10WzExXSx0WzExXT10WzE0XSx0WzE0XT1lLHRoaXN9c2V0UG9zaXRpb24odCxlLG4pe2NvbnN0IGk9dGhpcy5lbGVtZW50cztyZXR1cm4gdC5pc1ZlY3RvcjM/KGlbMTJdPXQueCxpWzEzXT10LnksaVsxNF09dC56KTooaVsxMl09dCxpWzEzXT1lLGlbMTRdPW4pLHRoaXN9aW52ZXJ0KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbMV0saT10WzJdLHI9dFszXSxvPXRbNF0sYT10WzVdLHM9dFs2XSxsPXRbN10sYz10WzhdLHU9dFs5XSxoPXRbMTBdLGQ9dFsxMV0scD10WzEyXSxmPXRbMTNdLG09dFsxNF0sZz10WzE1XSxfPXUqbSpsLWYqaCpsK2YqcypkLWEqbSpkLXUqcypnK2EqaCpnLHk9cCpoKmwtYyptKmwtcCpzKmQrbyptKmQrYypzKmctbypoKmcsdj1jKmYqbC1wKnUqbCtwKmEqZC1vKmYqZC1jKmEqZytvKnUqZyxiPXAqdSpzLWMqZipzLXAqYSpoK28qZipoK2MqYSptLW8qdSptLHg9ZSpfK24qeStpKnYrcipiO2lmKDA9PT14KXJldHVybiB0aGlzLnNldCgwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwKTtjb25zdCB3PTEveDtyZXR1cm4gdFswXT1fKncsdFsxXT0oZipoKnItdSptKnItZippKmQrbiptKmQrdSppKmctbipoKmcpKncsdFsyXT0oYSptKnItZipzKnIrZippKmwtbiptKmwtYSppKmcrbipzKmcpKncsdFszXT0odSpzKnItYSpoKnItdSppKmwrbipoKmwrYSppKmQtbipzKmQpKncsdFs0XT15KncsdFs1XT0oYyptKnItcCpoKnIrcCppKmQtZSptKmQtYyppKmcrZSpoKmcpKncsdFs2XT0ocCpzKnItbyptKnItcCppKmwrZSptKmwrbyppKmctZSpzKmcpKncsdFs3XT0obypoKnItYypzKnIrYyppKmwtZSpoKmwtbyppKmQrZSpzKmQpKncsdFs4XT12KncsdFs5XT0ocCp1KnItYypmKnItcCpuKmQrZSpmKmQrYypuKmctZSp1KmcpKncsdFsxMF09KG8qZipyLXAqYSpyK3AqbipsLWUqZipsLW8qbipnK2UqYSpnKSp3LHRbMTFdPShjKmEqci1vKnUqci1jKm4qbCtlKnUqbCtvKm4qZC1lKmEqZCkqdyx0WzEyXT1iKncsdFsxM109KGMqZippLXAqdSppK3AqbipoLWUqZipoLWMqbiptK2UqdSptKSp3LHRbMTRdPShwKmEqaS1vKmYqaS1wKm4qcytlKmYqcytvKm4qbS1lKmEqbSkqdyx0WzE1XT0obyp1KmktYyphKmkrYypuKnMtZSp1KnMtbypuKmgrZSphKmgpKncsdGhpc31zY2FsZSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LngsaT10Lnkscj10Lno7cmV0dXJuIGVbMF0qPW4sZVs0XSo9aSxlWzhdKj1yLGVbMV0qPW4sZVs1XSo9aSxlWzldKj1yLGVbMl0qPW4sZVs2XSo9aSxlWzEwXSo9cixlWzNdKj1uLGVbN10qPWksZVsxMV0qPXIsdGhpc31nZXRNYXhTY2FsZU9uQXhpcygpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cztyZXR1cm4gTWF0aC5zcXJ0KE1hdGgubWF4KHRbMF0qdFswXSt0WzFdKnRbMV0rdFsyXSp0WzJdLHRbNF0qdFs0XSt0WzVdKnRbNV0rdFs2XSp0WzZdLHRbOF0qdFs4XSt0WzldKnRbOV0rdFsxMF0qdFsxMF0pKX1tYWtlVHJhbnNsYXRpb24odCxlLG4pe3JldHVybiB0aGlzLnNldCgxLDAsMCx0LDAsMSwwLGUsMCwwLDEsbiwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvblgodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDAsZSwtbiwwLDAsbixlLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25ZKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoZSwwLG4sMCwwLDEsMCwwLC1uLDAsZSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWih0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsLW4sMCwwLG4sZSwwLDAsMCwwLDEsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbkF4aXModCxlKXtjb25zdCBuPU1hdGguY29zKGUpLGk9TWF0aC5zaW4oZSkscj0xLW4sbz10LngsYT10Lnkscz10LnosbD1yKm8sYz1yKmE7cmV0dXJuIHRoaXMuc2V0KGwqbytuLGwqYS1pKnMsbCpzK2kqYSwwLGwqYStpKnMsYyphK24sYypzLWkqbywwLGwqcy1pKmEsYypzK2kqbyxyKnMqcytuLDAsMCwwLDAsMSksdGhpc31tYWtlU2NhbGUodCxlLG4pe3JldHVybiB0aGlzLnNldCh0LDAsMCwwLDAsZSwwLDAsMCwwLG4sMCwwLDAsMCwxKSx0aGlzfW1ha2VTaGVhcih0LGUsbixpLHIsbyl7cmV0dXJuIHRoaXMuc2V0KDEsbixyLDAsdCwxLG8sMCxlLGksMSwwLDAsMCwwLDEpLHRoaXN9Y29tcG9zZSh0LGUsbil7Y29uc3QgaT10aGlzLmVsZW1lbnRzLHI9ZS5feCxvPWUuX3ksYT1lLl96LHM9ZS5fdyxsPXIrcixjPW8rbyx1PWErYSxoPXIqbCxkPXIqYyxwPXIqdSxmPW8qYyxtPW8qdSxnPWEqdSxfPXMqbCx5PXMqYyx2PXMqdSxiPW4ueCx4PW4ueSx3PW4uejtyZXR1cm4gaVswXT0oMS0oZitnKSkqYixpWzFdPShkK3YpKmIsaVsyXT0ocC15KSpiLGlbM109MCxpWzRdPShkLXYpKngsaVs1XT0oMS0oaCtnKSkqeCxpWzZdPShtK18pKngsaVs3XT0wLGlbOF09KHAreSkqdyxpWzldPShtLV8pKncsaVsxMF09KDEtKGgrZikpKncsaVsxMV09MCxpWzEyXT10LngsaVsxM109dC55LGlbMTRdPXQueixpWzE1XT0xLHRoaXN9ZGVjb21wb3NlKHQsZSxuKXtjb25zdCBpPXRoaXMuZWxlbWVudHM7bGV0IHI9b1F0LnNldChpWzBdLGlbMV0saVsyXSkubGVuZ3RoKCk7Y29uc3Qgbz1vUXQuc2V0KGlbNF0saVs1XSxpWzZdKS5sZW5ndGgoKSxhPW9RdC5zZXQoaVs4XSxpWzldLGlbMTBdKS5sZW5ndGgoKTt0aGlzLmRldGVybWluYW50KCk8MCYmKHI9LXIpLHQueD1pWzEyXSx0Lnk9aVsxM10sdC56PWlbMTRdLGFRdC5jb3B5KHRoaXMpO2NvbnN0IHM9MS9yLGw9MS9vLGM9MS9hO3JldHVybiBhUXQuZWxlbWVudHNbMF0qPXMsYVF0LmVsZW1lbnRzWzFdKj1zLGFRdC5lbGVtZW50c1syXSo9cyxhUXQuZWxlbWVudHNbNF0qPWwsYVF0LmVsZW1lbnRzWzVdKj1sLGFRdC5lbGVtZW50c1s2XSo9bCxhUXQuZWxlbWVudHNbOF0qPWMsYVF0LmVsZW1lbnRzWzldKj1jLGFRdC5lbGVtZW50c1sxMF0qPWMsZS5zZXRGcm9tUm90YXRpb25NYXRyaXgoYVF0KSxuLng9cixuLnk9byxuLno9YSx0aGlzfW1ha2VQZXJzcGVjdGl2ZSh0LGUsbixpLHIsbyl7dm9pZCAwPT09byYmY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubWFrZVBlcnNwZWN0aXZlKCkgaGFzIGJlZW4gcmVkZWZpbmVkIGFuZCBoYXMgYSBuZXcgc2lnbmF0dXJlLiBQbGVhc2UgY2hlY2sgdGhlIGRvY3MuIik7Y29uc3QgYT10aGlzLmVsZW1lbnRzLHM9MipyLyhuLWkpLGw9KGUrdCkvKGUtdCksYz0obitpKS8obi1pKSx1PS0obytyKS8oby1yKSxoPS0yKm8qci8oby1yKTtyZXR1cm4gYVswXT0yKnIvKGUtdCksYVs0XT0wLGFbOF09bCxhWzEyXT0wLGFbMV09MCxhWzVdPXMsYVs5XT1jLGFbMTNdPTAsYVsyXT0wLGFbNl09MCxhWzEwXT11LGFbMTRdPWgsYVszXT0wLGFbN109MCxhWzExXT0tMSxhWzE1XT0wLHRoaXN9bWFrZU9ydGhvZ3JhcGhpYyh0LGUsbixpLHIsbyl7Y29uc3QgYT10aGlzLmVsZW1lbnRzLHM9MS8oZS10KSxsPTEvKG4taSksYz0xLyhvLXIpLHU9KGUrdCkqcyxoPShuK2kpKmwsZD0obytyKSpjO3JldHVybiBhWzBdPTIqcyxhWzRdPTAsYVs4XT0wLGFbMTJdPS11LGFbMV09MCxhWzVdPTIqbCxhWzldPTAsYVsxM109LWgsYVsyXT0wLGFbNl09MCxhWzEwXT0tMipjLGFbMTRdPS1kLGFbM109MCxhWzddPTAsYVsxMV09MCxhWzE1XT0xLHRoaXN9ZXF1YWxzKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7Zm9yKGxldCB0PTA7dDwxNjt0KyspaWYoZVt0XSE9PW5bdF0pcmV0dXJuITE7cmV0dXJuITB9ZnJvbUFycmF5KHQsZT0wKXtmb3IobGV0IG49MDtuPDE2O24rKyl0aGlzLmVsZW1lbnRzW25dPXRbbitlXTtyZXR1cm4gdGhpc310b0FycmF5KHQ9W10sZT0wKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbZV09blswXSx0W2UrMV09blsxXSx0W2UrMl09blsyXSx0W2UrM109blszXSx0W2UrNF09bls0XSx0W2UrNV09bls1XSx0W2UrNl09bls2XSx0W2UrN109bls3XSx0W2UrOF09bls4XSx0W2UrOV09bls5XSx0W2UrMTBdPW5bMTBdLHRbZSsxMV09blsxMV0sdFtlKzEyXT1uWzEyXSx0W2UrMTNdPW5bMTNdLHRbZSsxNF09blsxNF0sdFtlKzE1XT1uWzE1XSx0fX1yUXQucHJvdG90eXBlLmlzTWF0cml4ND0hMDtjb25zdCBvUXQ9bmV3IENKdCxhUXQ9bmV3IHJRdCxzUXQ9bmV3IENKdCgwLDAsMCksbFF0PW5ldyBDSnQoMSwxLDEpLGNRdD1uZXcgQ0p0LHVRdD1uZXcgQ0p0LGhRdD1uZXcgQ0p0LGRRdD1uZXcgclF0LHBRdD1uZXcgVEp0O2NsYXNzIGZRdHtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCxpPWZRdC5EZWZhdWx0T3JkZXIpe3RoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX29yZGVyPWl9Z2V0IHgoKXtyZXR1cm4gdGhpcy5feH1zZXQgeCh0KXt0aGlzLl94PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3l9c2V0IHkodCl7dGhpcy5feT10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeigpe3JldHVybiB0aGlzLl96fXNldCB6KHQpe3RoaXMuX3o9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IG9yZGVyKCl7cmV0dXJuIHRoaXMuX29yZGVyfXNldCBvcmRlcih0KXt0aGlzLl9vcmRlcj10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1zZXQodCxlLG4saT10aGlzLl9vcmRlcil7cmV0dXJuIHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX29yZGVyPWksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3osdGhpcy5fb3JkZXIpfWNvcHkodCl7cmV0dXJuIHRoaXMuX3g9dC5feCx0aGlzLl95PXQuX3ksdGhpcy5fej10Ll96LHRoaXMuX29yZGVyPXQuX29yZGVyLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Sb3RhdGlvbk1hdHJpeCh0LGU9dGhpcy5fb3JkZXIsbj0hMCl7Y29uc3QgaT10LmVsZW1lbnRzLHI9aVswXSxvPWlbNF0sYT1pWzhdLHM9aVsxXSxsPWlbNV0sYz1pWzldLHU9aVsyXSxoPWlbNl0sZD1pWzEwXTtzd2l0Y2goZSl7Y2FzZSJYWVoiOnRoaXMuX3k9TWF0aC5hc2luKCRadChhLC0xLDEpKSxNYXRoLmFicyhhKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1jLGQpLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxyKSk6KHRoaXMuX3g9TWF0aC5hdGFuMihoLGwpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJZWFoiOnRoaXMuX3g9TWF0aC5hc2luKC0kWnQoYywtMSwxKSksTWF0aC5hYnMoYyk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMihhLGQpLHRoaXMuX3o9TWF0aC5hdGFuMihzLGwpKToodGhpcy5feT1NYXRoLmF0YW4yKC11LHIpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9TWF0aC5hc2luKCRadChoLC0xLDEpKSxNYXRoLmFicyhoKTwuOTk5OTk5OT8odGhpcy5feT1NYXRoLmF0YW4yKC11LGQpLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxsKSk6KHRoaXMuX3k9MCx0aGlzLl96PU1hdGguYXRhbjIocyxyKSk7YnJlYWs7Y2FzZSJaWVgiOnRoaXMuX3k9TWF0aC5hc2luKC0kWnQodSwtMSwxKSksTWF0aC5hYnModSk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMihoLGQpLHRoaXMuX3o9TWF0aC5hdGFuMihzLHIpKToodGhpcy5feD0wLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxsKSk7YnJlYWs7Y2FzZSJZWlgiOnRoaXMuX3o9TWF0aC5hc2luKCRadChzLC0xLDEpKSxNYXRoLmFicyhzKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1jLGwpLHRoaXMuX3k9TWF0aC5hdGFuMigtdSxyKSk6KHRoaXMuX3g9MCx0aGlzLl95PU1hdGguYXRhbjIoYSxkKSk7YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3o9TWF0aC5hc2luKC0kWnQobywtMSwxKSksTWF0aC5hYnMobyk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMihoLGwpLHRoaXMuX3k9TWF0aC5hdGFuMihhLHIpKToodGhpcy5feD1NYXRoLmF0YW4yKC1jLGQpLHRoaXMuX3k9MCk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLkV1bGVyOiAuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogIitlKX1yZXR1cm4gdGhpcy5fb3JkZXI9ZSwhMD09PW4mJnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21RdWF0ZXJuaW9uKHQsZSxuKXtyZXR1cm4gZFF0Lm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KGRRdCxlLG4pfXNldEZyb21WZWN0b3IzKHQsZT10aGlzLl9vcmRlcil7cmV0dXJuIHRoaXMuc2V0KHQueCx0LnksdC56LGUpfXJlb3JkZXIodCl7cmV0dXJuIHBRdC5zZXRGcm9tRXVsZXIodGhpcyksdGhpcy5zZXRGcm9tUXVhdGVybmlvbihwUXQsdCl9ZXF1YWxzKHQpe3JldHVybiB0Ll94PT09dGhpcy5feCYmdC5feT09PXRoaXMuX3kmJnQuX3o9PT10aGlzLl96JiZ0Ll9vcmRlcj09PXRoaXMuX29yZGVyfWZyb21BcnJheSh0KXtyZXR1cm4gdGhpcy5feD10WzBdLHRoaXMuX3k9dFsxXSx0aGlzLl96PXRbMl0sdm9pZCAwIT09dFszXSYmKHRoaXMuX29yZGVyPXRbM10pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX29yZGVyLHR9dG9WZWN0b3IzKHQpe3JldHVybiB0P3Quc2V0KHRoaXMuX3gsdGhpcy5feSx0aGlzLl96KTpuZXcgQ0p0KHRoaXMuX3gsdGhpcy5feSx0aGlzLl96KX1fb25DaGFuZ2UodCl7cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9dCx0aGlzfV9vbkNoYW5nZUNhbGxiYWNrKCl7fX1mUXQucHJvdG90eXBlLmlzRXVsZXI9ITAsZlF0LkRlZmF1bHRPcmRlcj0iWFlaIixmUXQuUm90YXRpb25PcmRlcnM9WyJYWVoiLCJZWlgiLCJaWFkiLCJYWlkiLCJZWFoiLCJaWVgiXTtjbGFzcyBtUXR7Y29uc3RydWN0b3IoKXt0aGlzLm1hc2s9MX1zZXQodCl7dGhpcy5tYXNrPTE8PHR8MH1lbmFibGUodCl7dGhpcy5tYXNrfD0xPDx0fDB9ZW5hYmxlQWxsKCl7dGhpcy5tYXNrPS0xfXRvZ2dsZSh0KXt0aGlzLm1hc2tePTE8PHR8MH1kaXNhYmxlKHQpe3RoaXMubWFzayY9figxPDx0fDApfWRpc2FibGVBbGwoKXt0aGlzLm1hc2s9MH10ZXN0KHQpe3JldHVybiAwIT0odGhpcy5tYXNrJnQubWFzayl9fWxldCBnUXQ9MDtjb25zdCBfUXQ9bmV3IENKdCx5UXQ9bmV3IFRKdCx2UXQ9bmV3IHJRdCxiUXQ9bmV3IENKdCx4UXQ9bmV3IENKdCx3UXQ9bmV3IENKdCxTUXQ9bmV3IFRKdCxNUXQ9bmV3IENKdCgxLDAsMCksRVF0PW5ldyBDSnQoMCwxLDApLFRRdD1uZXcgQ0p0KDAsMCwxKSxDUXQ9e3R5cGU6ImFkZGVkIn0sQVF0PXt0eXBlOiJyZW1vdmVkIn07Y2xhc3Mga1F0IGV4dGVuZHMgalp0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpnUXQrK30pLHRoaXMudXVpZD1YWnQoKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJPYmplY3QzRCIsdGhpcy5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuPVtdLHRoaXMudXA9a1F0LkRlZmF1bHRVcC5jbG9uZSgpO2NvbnN0IHQ9bmV3IENKdCxlPW5ldyBmUXQsbj1uZXcgVEp0LGk9bmV3IENKdCgxLDEsMSk7ZS5fb25DaGFuZ2UoKGZ1bmN0aW9uIHIoKXtuLnNldEZyb21FdWxlcihlLCExKX0pKSxuLl9vbkNoYW5nZSgoZnVuY3Rpb24gbygpe2Uuc2V0RnJvbVF1YXRlcm5pb24obix2b2lkIDAsITEpfSkpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3Bvc2l0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTp0fSxyb3RhdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZX0scXVhdGVybmlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bn0sc2NhbGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOml9LG1vZGVsVmlld01hdHJpeDp7dmFsdWU6bmV3IHJRdH0sbm9ybWFsTWF0cml4Ont2YWx1ZTpuZXcgZ0p0fX0pLHRoaXMubWF0cml4PW5ldyByUXQsdGhpcy5tYXRyaXhXb3JsZD1uZXcgclF0LHRoaXMubWF0cml4QXV0b1VwZGF0ZT1rUXQuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGUsdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLHRoaXMubGF5ZXJzPW5ldyBtUXQsdGhpcy52aXNpYmxlPSEwLHRoaXMuY2FzdFNoYWRvdz0hMSx0aGlzLnJlY2VpdmVTaGFkb3c9ITEsdGhpcy5mcnVzdHVtQ3VsbGVkPSEwLHRoaXMucmVuZGVyT3JkZXI9MCx0aGlzLmFuaW1hdGlvbnM9W10sdGhpcy51c2VyRGF0YT17fX1vbkJlZm9yZVJlbmRlcigpe31vbkFmdGVyUmVuZGVyKCl7fWFwcGx5TWF0cml4NCh0KXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5tYXRyaXgucHJlbXVsdGlwbHkodCksdGhpcy5tYXRyaXguZGVjb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpfWFwcGx5UXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KHQpLHRoaXN9c2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlKHQsZSl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUodCxlKX1zZXRSb3RhdGlvbkZyb21FdWxlcih0KXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKHQsITApfXNldFJvdGF0aW9uRnJvbU1hdHJpeCh0KXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KHQpfXNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCl7dGhpcy5xdWF0ZXJuaW9uLmNvcHkodCl9cm90YXRlT25BeGlzKHQsZSl7cmV0dXJuIHlRdC5zZXRGcm9tQXhpc0FuZ2xlKHQsZSksdGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KHlRdCksdGhpc31yb3RhdGVPbldvcmxkQXhpcyh0LGUpe3JldHVybiB5UXQuc2V0RnJvbUF4aXNBbmdsZSh0LGUpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSh5UXQpLHRoaXN9cm90YXRlWCh0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoTVF0LHQpfXJvdGF0ZVkodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKEVRdCx0KX1yb3RhdGVaKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhUUXQsdCl9dHJhbnNsYXRlT25BeGlzKHQsZSl7cmV0dXJuIF9RdC5jb3B5KHQpLmFwcGx5UXVhdGVybmlvbih0aGlzLnF1YXRlcm5pb24pLHRoaXMucG9zaXRpb24uYWRkKF9RdC5tdWx0aXBseVNjYWxhcihlKSksdGhpc310cmFuc2xhdGVYKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhNUXQsdCl9dHJhbnNsYXRlWSh0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoRVF0LHQpfXRyYW5zbGF0ZVoodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKFRRdCx0KX1sb2NhbFRvV29ybGQodCl7cmV0dXJuIHQuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpfXdvcmxkVG9Mb2NhbCh0KXtyZXR1cm4gdC5hcHBseU1hdHJpeDQodlF0LmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkpfWxvb2tBdCh0LGUsbil7dC5pc1ZlY3RvcjM/YlF0LmNvcHkodCk6YlF0LnNldCh0LGUsbik7Y29uc3QgaT10aGlzLnBhcmVudDt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx4UXQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpLHRoaXMuaXNDYW1lcmF8fHRoaXMuaXNMaWdodD92UXQubG9va0F0KHhRdCxiUXQsdGhpcy51cCk6dlF0Lmxvb2tBdChiUXQseFF0LHRoaXMudXApLHRoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgodlF0KSxpJiYodlF0LmV4dHJhY3RSb3RhdGlvbihpLm1hdHJpeFdvcmxkKSx5UXQuc2V0RnJvbVJvdGF0aW9uTWF0cml4KHZRdCksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KHlRdC5pbnZlcnQoKSkpfWFkZCh0KXtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2ZvcihsZXQgdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspdGhpcy5hZGQoYXJndW1lbnRzW3RdKTtyZXR1cm4gdGhpc31yZXR1cm4gdD09PXRoaXM/KGNvbnNvbGUuZXJyb3IoIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IGNhbid0IGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgaXRzZWxmLiIsdCksdGhpcyk6KHQmJnQuaXNPYmplY3QzRD8obnVsbCE9PXQucGFyZW50JiZ0LnBhcmVudC5yZW1vdmUodCksdC5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkcmVuLnB1c2godCksdC5kaXNwYXRjaEV2ZW50KENRdCkpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC4iLHQpLHRoaXMpfXJlbW92ZSh0KXtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2ZvcihsZXQgdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspdGhpcy5yZW1vdmUoYXJndW1lbnRzW3RdKTtyZXR1cm4gdGhpc31jb25zdCBlPXRoaXMuY2hpbGRyZW4uaW5kZXhPZih0KTtyZXR1cm4tMSE9PWUmJih0LnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW4uc3BsaWNlKGUsMSksdC5kaXNwYXRjaEV2ZW50KEFRdCkpLHRoaXN9cmVtb3ZlRnJvbVBhcmVudCgpe2NvbnN0IHQ9dGhpcy5wYXJlbnQ7cmV0dXJuIG51bGwhPT10JiZ0LnJlbW92ZSh0aGlzKSx0aGlzfWNsZWFyKCl7Zm9yKGxldCB0PTA7dDx0aGlzLmNoaWxkcmVuLmxlbmd0aDt0Kyspe2NvbnN0IGU9dGhpcy5jaGlsZHJlblt0XTtlLnBhcmVudD1udWxsLGUuZGlzcGF0Y2hFdmVudChBUXQpfXJldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aD0wLHRoaXN9YXR0YWNoKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx2UXQuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSxudWxsIT09dC5wYXJlbnQmJih0LnBhcmVudC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdlF0Lm11bHRpcGx5KHQucGFyZW50Lm1hdHJpeFdvcmxkKSksdC5hcHBseU1hdHJpeDQodlF0KSx0aGlzLmFkZCh0KSx0LnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKSx0aGlzfWdldE9iamVjdEJ5SWQodCl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgiaWQiLHQpfWdldE9iamVjdEJ5TmFtZSh0KXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJuYW1lIix0KX1nZXRPYmplY3RCeVByb3BlcnR5KHQsZSl7aWYodGhpc1t0XT09PWUpcmV0dXJuIHRoaXM7Zm9yKGxldCBuPTAsaT10aGlzLmNoaWxkcmVuLmxlbmd0aDtuPGk7bisrKXtjb25zdCBpPXRoaXMuY2hpbGRyZW5bbl0uZ2V0T2JqZWN0QnlQcm9wZXJ0eSh0LGUpO2lmKHZvaWQgMCE9PWkpcmV0dXJuIGl9fWdldFdvcmxkUG9zaXRpb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpfWdldFdvcmxkUXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoeFF0LHQsd1F0KSx0fWdldFdvcmxkU2NhbGUodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKHhRdCxTUXQsdCksdH1nZXRXb3JsZERpcmVjdGlvbih0KXt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTtjb25zdCBlPXRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7cmV0dXJuIHQuc2V0KGVbOF0sZVs5XSxlWzEwXSkubm9ybWFsaXplKCl9cmF5Y2FzdCgpe310cmF2ZXJzZSh0KXt0KHRoaXMpO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxpPWUubGVuZ3RoO248aTtuKyspZVtuXS50cmF2ZXJzZSh0KX10cmF2ZXJzZVZpc2libGUodCl7aWYoITE9PT10aGlzLnZpc2libGUpcmV0dXJuO3QodGhpcyk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLGk9ZS5sZW5ndGg7bjxpO24rKyllW25dLnRyYXZlcnNlVmlzaWJsZSh0KX10cmF2ZXJzZUFuY2VzdG9ycyh0KXtjb25zdCBlPXRoaXMucGFyZW50O251bGwhPT1lJiYodChlKSxlLnRyYXZlcnNlQW5jZXN0b3JzKHQpKX11cGRhdGVNYXRyaXgoKXt0aGlzLm1hdHJpeC5jb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH11cGRhdGVNYXRyaXhXb3JsZCh0KXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksKHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZXx8dCkmJihudWxsPT09dGhpcy5wYXJlbnQ/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSx0PSEwKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAsaT1lLmxlbmd0aDtuPGk7bisrKWVbbl0udXBkYXRlTWF0cml4V29ybGQodCl9dXBkYXRlV29ybGRNYXRyaXgodCxlKXtjb25zdCBuPXRoaXMucGFyZW50O2lmKCEwPT09dCYmbnVsbCE9PW4mJm4udXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSxudWxsPT09dGhpcy5wYXJlbnQ/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpLCEwPT09ZSl7Y29uc3QgdD10aGlzLmNoaWxkcmVuO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl0W2VdLnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKX19dG9KU09OKHQpe2NvbnN0IGU9dm9pZCAwPT09dHx8InN0cmluZyI9PXR5cGVvZiB0LG49e307ZSYmKHQ9e2dlb21ldHJpZXM6e30sbWF0ZXJpYWxzOnt9LHRleHR1cmVzOnt9LGltYWdlczp7fSxzaGFwZXM6e30sc2tlbGV0b25zOnt9LGFuaW1hdGlvbnM6e319LG4ubWV0YWRhdGE9e3ZlcnNpb246NC41LHR5cGU6Ik9iamVjdCIsZ2VuZXJhdG9yOiJPYmplY3QzRC50b0pTT04ifSk7Y29uc3QgaT17fTtmdW5jdGlvbiByKGUsbil7cmV0dXJuIHZvaWQgMD09PWVbbi51dWlkXSYmKGVbbi51dWlkXT1uLnRvSlNPTih0KSksbi51dWlkfWlmKGkudXVpZD10aGlzLnV1aWQsaS50eXBlPXRoaXMudHlwZSwiIiE9PXRoaXMubmFtZSYmKGkubmFtZT10aGlzLm5hbWUpLCEwPT09dGhpcy5jYXN0U2hhZG93JiYoaS5jYXN0U2hhZG93PSEwKSwhMD09PXRoaXMucmVjZWl2ZVNoYWRvdyYmKGkucmVjZWl2ZVNoYWRvdz0hMCksITE9PT10aGlzLnZpc2libGUmJihpLnZpc2libGU9ITEpLCExPT09dGhpcy5mcnVzdHVtQ3VsbGVkJiYoaS5mcnVzdHVtQ3VsbGVkPSExKSwwIT09dGhpcy5yZW5kZXJPcmRlciYmKGkucmVuZGVyT3JkZXI9dGhpcy5yZW5kZXJPcmRlciksInt9IiE9PUpTT04uc3RyaW5naWZ5KHRoaXMudXNlckRhdGEpJiYoaS51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSxpLmxheWVycz10aGlzLmxheWVycy5tYXNrLGkubWF0cml4PXRoaXMubWF0cml4LnRvQXJyYXkoKSwhMT09PXRoaXMubWF0cml4QXV0b1VwZGF0ZSYmKGkubWF0cml4QXV0b1VwZGF0ZT0hMSksdGhpcy5pc0luc3RhbmNlZE1lc2gmJihpLnR5cGU9Ikluc3RhbmNlZE1lc2giLGkuY291bnQ9dGhpcy5jb3VudCxpLmluc3RhbmNlTWF0cml4PXRoaXMuaW5zdGFuY2VNYXRyaXgudG9KU09OKCksbnVsbCE9PXRoaXMuaW5zdGFuY2VDb2xvciYmKGkuaW5zdGFuY2VDb2xvcj10aGlzLmluc3RhbmNlQ29sb3IudG9KU09OKCkpKSx0aGlzLmlzU2NlbmUpdGhpcy5iYWNrZ3JvdW5kJiYodGhpcy5iYWNrZ3JvdW5kLmlzQ29sb3I/aS5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04oKTp0aGlzLmJhY2tncm91bmQuaXNUZXh0dXJlJiYoaS5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04odCkudXVpZCkpLHRoaXMuZW52aXJvbm1lbnQmJnRoaXMuZW52aXJvbm1lbnQuaXNUZXh0dXJlJiYoaS5lbnZpcm9ubWVudD10aGlzLmVudmlyb25tZW50LnRvSlNPTih0KS51dWlkKTtlbHNlIGlmKHRoaXMuaXNNZXNofHx0aGlzLmlzTGluZXx8dGhpcy5pc1BvaW50cyl7aS5nZW9tZXRyeT1yKHQuZ2VvbWV0cmllcyx0aGlzLmdlb21ldHJ5KTtjb25zdCBlPXRoaXMuZ2VvbWV0cnkucGFyYW1ldGVycztpZih2b2lkIDAhPT1lJiZ2b2lkIDAhPT1lLnNoYXBlcyl7Y29uc3Qgbj1lLnNoYXBlcztpZihBcnJheS5pc0FycmF5KG4pKWZvcihsZXQgZT0wLGk9bi5sZW5ndGg7ZTxpO2UrKylyKHQuc2hhcGVzLG5bZV0pO2Vsc2Ugcih0LnNoYXBlcyxuKX19aWYodGhpcy5pc1NraW5uZWRNZXNoJiYoaS5iaW5kTW9kZT10aGlzLmJpbmRNb2RlLGkuYmluZE1hdHJpeD10aGlzLmJpbmRNYXRyaXgudG9BcnJheSgpLHZvaWQgMCE9PXRoaXMuc2tlbGV0b24mJihyKHQuc2tlbGV0b25zLHRoaXMuc2tlbGV0b24pLGkuc2tlbGV0b249dGhpcy5za2VsZXRvbi51dWlkKSksdm9pZCAwIT09dGhpcy5tYXRlcmlhbClpZihBcnJheS5pc0FycmF5KHRoaXMubWF0ZXJpYWwpKXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wLGk9dGhpcy5tYXRlcmlhbC5sZW5ndGg7bjxpO24rKyllLnB1c2gocih0Lm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsW25dKSk7aS5tYXRlcmlhbD1lfWVsc2UgaS5tYXRlcmlhbD1yKHQubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWwpO2lmKHRoaXMuY2hpbGRyZW4ubGVuZ3RoPjApe2kuY2hpbGRyZW49W107Zm9yKGxldCBlPTA7ZTx0aGlzLmNoaWxkcmVuLmxlbmd0aDtlKyspaS5jaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5bZV0udG9KU09OKHQpLm9iamVjdCl9aWYodGhpcy5hbmltYXRpb25zLmxlbmd0aD4wKXtpLmFuaW1hdGlvbnM9W107Zm9yKGxldCBlPTA7ZTx0aGlzLmFuaW1hdGlvbnMubGVuZ3RoO2UrKylpLmFuaW1hdGlvbnMucHVzaChyKHQuYW5pbWF0aW9ucyx0aGlzLmFuaW1hdGlvbnNbZV0pKX1pZihlKXtjb25zdCBlPW8odC5nZW9tZXRyaWVzKSxpPW8odC5tYXRlcmlhbHMpLHI9byh0LnRleHR1cmVzKSxhPW8odC5pbWFnZXMpLHM9byh0LnNoYXBlcyksbD1vKHQuc2tlbGV0b25zKSxjPW8odC5hbmltYXRpb25zKTtlLmxlbmd0aD4wJiYobi5nZW9tZXRyaWVzPWUpLGkubGVuZ3RoPjAmJihuLm1hdGVyaWFscz1pKSxyLmxlbmd0aD4wJiYobi50ZXh0dXJlcz1yKSxhLmxlbmd0aD4wJiYobi5pbWFnZXM9YSkscy5sZW5ndGg+MCYmKG4uc2hhcGVzPXMpLGwubGVuZ3RoPjAmJihuLnNrZWxldG9ucz1sKSxjLmxlbmd0aD4wJiYobi5hbmltYXRpb25zPWMpfXJldHVybiBuLm9iamVjdD1pLG47ZnVuY3Rpb24gbyh0KXtjb25zdCBlPVtdO2Zvcihjb25zdCBuIGluIHQpe2NvbnN0IGk9dFtuXTtkZWxldGUgaS5tZXRhZGF0YSxlLnB1c2goaSl9cmV0dXJuIGV9fWNsb25lKHQpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzLHQpfWNvcHkodCxlPSEwKXtpZih0aGlzLm5hbWU9dC5uYW1lLHRoaXMudXAuY29weSh0LnVwKSx0aGlzLnBvc2l0aW9uLmNvcHkodC5wb3NpdGlvbiksdGhpcy5yb3RhdGlvbi5vcmRlcj10LnJvdGF0aW9uLm9yZGVyLHRoaXMucXVhdGVybmlvbi5jb3B5KHQucXVhdGVybmlvbiksdGhpcy5zY2FsZS5jb3B5KHQuc2NhbGUpLHRoaXMubWF0cml4LmNvcHkodC5tYXRyaXgpLHRoaXMubWF0cml4V29ybGQuY29weSh0Lm1hdHJpeFdvcmxkKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT10Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUsdGhpcy5sYXllcnMubWFzaz10LmxheWVycy5tYXNrLHRoaXMudmlzaWJsZT10LnZpc2libGUsdGhpcy5jYXN0U2hhZG93PXQuY2FzdFNoYWRvdyx0aGlzLnJlY2VpdmVTaGFkb3c9dC5yZWNlaXZlU2hhZG93LHRoaXMuZnJ1c3R1bUN1bGxlZD10LmZydXN0dW1DdWxsZWQsdGhpcy5yZW5kZXJPcmRlcj10LnJlbmRlck9yZGVyLHRoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnVzZXJEYXRhKSksITA9PT1lKWZvcihsZXQgZT0wO2U8dC5jaGlsZHJlbi5sZW5ndGg7ZSsrKXRoaXMuYWRkKHQuY2hpbGRyZW5bZV0uY2xvbmUoKSk7cmV0dXJuIHRoaXN9fWtRdC5EZWZhdWx0VXA9bmV3IENKdCgwLDEsMCksa1F0LkRlZmF1bHRNYXRyaXhBdXRvVXBkYXRlPSEwLGtRdC5wcm90b3R5cGUuaXNPYmplY3QzRD0hMDtjb25zdCBMUXQ9bmV3IENKdCxQUXQ9bmV3IENKdCxOUXQ9bmV3IENKdCxJUXQ9bmV3IENKdCxSUXQ9bmV3IENKdCxPUXQ9bmV3IENKdCx6UXQ9bmV3IENKdCxEUXQ9bmV3IENKdCxCUXQ9bmV3IENKdCxIUXQ9bmV3IENKdDtjbGFzcyBGUXR7Y29uc3RydWN0b3IodD1uZXcgQ0p0LGU9bmV3IENKdCxuPW5ldyBDSnQpe3RoaXMuYT10LHRoaXMuYj1lLHRoaXMuYz1ufXN0YXRpYyBnZXROb3JtYWwodCxlLG4saSl7aS5zdWJWZWN0b3JzKG4sZSksTFF0LnN1YlZlY3RvcnModCxlKSxpLmNyb3NzKExRdCk7Y29uc3Qgcj1pLmxlbmd0aFNxKCk7cmV0dXJuIHI+MD9pLm11bHRpcGx5U2NhbGFyKDEvTWF0aC5zcXJ0KHIpKTppLnNldCgwLDAsMCl9c3RhdGljIGdldEJhcnljb29yZCh0LGUsbixpLHIpe0xRdC5zdWJWZWN0b3JzKGksZSksUFF0LnN1YlZlY3RvcnMobixlKSxOUXQuc3ViVmVjdG9ycyh0LGUpO2NvbnN0IG89TFF0LmRvdChMUXQpLGE9TFF0LmRvdChQUXQpLHM9TFF0LmRvdChOUXQpLGw9UFF0LmRvdChQUXQpLGM9UFF0LmRvdChOUXQpLHU9bypsLWEqYTtpZigwPT09dSlyZXR1cm4gci5zZXQoLTIsLTEsLTEpO2NvbnN0IGg9MS91LGQ9KGwqcy1hKmMpKmgscD0obypjLWEqcykqaDtyZXR1cm4gci5zZXQoMS1kLXAscCxkKX1zdGF0aWMgY29udGFpbnNQb2ludCh0LGUsbixpKXtyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQodCxlLG4saSxJUXQpLElRdC54Pj0wJiZJUXQueT49MCYmSVF0LngrSVF0Lnk8PTF9c3RhdGljIGdldFVWKHQsZSxuLGkscixvLGEscyl7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKHQsZSxuLGksSVF0KSxzLnNldCgwLDApLHMuYWRkU2NhbGVkVmVjdG9yKHIsSVF0LngpLHMuYWRkU2NhbGVkVmVjdG9yKG8sSVF0LnkpLHMuYWRkU2NhbGVkVmVjdG9yKGEsSVF0LnopLHN9c3RhdGljIGlzRnJvbnRGYWNpbmcodCxlLG4saSl7cmV0dXJuIExRdC5zdWJWZWN0b3JzKG4sZSksUFF0LnN1YlZlY3RvcnModCxlKSxMUXQuY3Jvc3MoUFF0KS5kb3QoaSk8MH1zZXQodCxlLG4pe3JldHVybiB0aGlzLmEuY29weSh0KSx0aGlzLmIuY29weShlKSx0aGlzLmMuY29weShuKSx0aGlzfXNldEZyb21Qb2ludHNBbmRJbmRpY2VzKHQsZSxuLGkpe3JldHVybiB0aGlzLmEuY29weSh0W2VdKSx0aGlzLmIuY29weSh0W25dKSx0aGlzLmMuY29weSh0W2ldKSx0aGlzfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMuYS5jb3B5KHQuYSksdGhpcy5iLmNvcHkodC5iKSx0aGlzLmMuY29weSh0LmMpLHRoaXN9Z2V0QXJlYSgpe3JldHVybiBMUXQuc3ViVmVjdG9ycyh0aGlzLmMsdGhpcy5iKSxQUXQuc3ViVmVjdG9ycyh0aGlzLmEsdGhpcy5iKSwuNSpMUXQuY3Jvc3MoUFF0KS5sZW5ndGgoKX1nZXRNaWRwb2ludCh0KXtyZXR1cm4gdC5hZGRWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLmFkZCh0aGlzLmMpLm11bHRpcGx5U2NhbGFyKDEvMyl9Z2V0Tm9ybWFsKHQpe3JldHVybiBGUXQuZ2V0Tm9ybWFsKHRoaXMuYSx0aGlzLmIsdGhpcy5jLHQpfWdldFBsYW5lKHQpe3JldHVybiB0LnNldEZyb21Db3BsYW5hclBvaW50cyh0aGlzLmEsdGhpcy5iLHRoaXMuYyl9Z2V0QmFyeWNvb3JkKHQsZSl7cmV0dXJuIEZRdC5nZXRCYXJ5Y29vcmQodCx0aGlzLmEsdGhpcy5iLHRoaXMuYyxlKX1nZXRVVih0LGUsbixpLHIpe3JldHVybiBGUXQuZ2V0VVYodCx0aGlzLmEsdGhpcy5iLHRoaXMuYyxlLG4saSxyKX1jb250YWluc1BvaW50KHQpe3JldHVybiBGUXQuY29udGFpbnNQb2ludCh0LHRoaXMuYSx0aGlzLmIsdGhpcy5jKX1pc0Zyb250RmFjaW5nKHQpe3JldHVybiBGUXQuaXNGcm9udEZhY2luZyh0aGlzLmEsdGhpcy5iLHRoaXMuYyx0KX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNUcmlhbmdsZSh0aGlzKX1jbG9zZXN0UG9pbnRUb1BvaW50KHQsZSl7Y29uc3Qgbj10aGlzLmEsaT10aGlzLmIscj10aGlzLmM7bGV0IG8sYTtSUXQuc3ViVmVjdG9ycyhpLG4pLE9RdC5zdWJWZWN0b3JzKHIsbiksRFF0LnN1YlZlY3RvcnModCxuKTtjb25zdCBzPVJRdC5kb3QoRFF0KSxsPU9RdC5kb3QoRFF0KTtpZihzPD0wJiZsPD0wKXJldHVybiBlLmNvcHkobik7QlF0LnN1YlZlY3RvcnModCxpKTtjb25zdCBjPVJRdC5kb3QoQlF0KSx1PU9RdC5kb3QoQlF0KTtpZihjPj0wJiZ1PD1jKXJldHVybiBlLmNvcHkoaSk7Y29uc3QgaD1zKnUtYypsO2lmKGg8PTAmJnM+PTAmJmM8PTApcmV0dXJuIG89cy8ocy1jKSxlLmNvcHkobikuYWRkU2NhbGVkVmVjdG9yKFJRdCxvKTtIUXQuc3ViVmVjdG9ycyh0LHIpO2NvbnN0IGQ9UlF0LmRvdChIUXQpLHA9T1F0LmRvdChIUXQpO2lmKHA+PTAmJmQ8PXApcmV0dXJuIGUuY29weShyKTtjb25zdCBmPWQqbC1zKnA7aWYoZjw9MCYmbD49MCYmcDw9MClyZXR1cm4gYT1sLyhsLXApLGUuY29weShuKS5hZGRTY2FsZWRWZWN0b3IoT1F0LGEpO2NvbnN0IG09YypwLWQqdTtpZihtPD0wJiZ1LWM+PTAmJmQtcD49MClyZXR1cm4gelF0LnN1YlZlY3RvcnMocixpKSxhPSh1LWMpLyh1LWMrKGQtcCkpLGUuY29weShpKS5hZGRTY2FsZWRWZWN0b3IoelF0LGEpO2NvbnN0IGc9MS8obStmK2gpO3JldHVybiBvPWYqZyxhPWgqZyxlLmNvcHkobikuYWRkU2NhbGVkVmVjdG9yKFJRdCxvKS5hZGRTY2FsZWRWZWN0b3IoT1F0LGEpfWVxdWFscyh0KXtyZXR1cm4gdC5hLmVxdWFscyh0aGlzLmEpJiZ0LmIuZXF1YWxzKHRoaXMuYikmJnQuYy5lcXVhbHModGhpcy5jKX19bGV0IFZRdD0wO2NsYXNzIFVRdCBleHRlbmRzIGpadHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6VlF0Kyt9KSx0aGlzLnV1aWQ9WFp0KCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iTWF0ZXJpYWwiLHRoaXMuZm9nPSEwLHRoaXMuYmxlbmRpbmc9MSx0aGlzLnNpZGU9MCx0aGlzLnZlcnRleENvbG9ycz0hMSx0aGlzLm9wYWNpdHk9MSx0aGlzLnRyYW5zcGFyZW50PSExLHRoaXMuYmxlbmRTcmM9MjA0LHRoaXMuYmxlbmREc3Q9MjA1LHRoaXMuYmxlbmRFcXVhdGlvbj1WS3QsdGhpcy5ibGVuZFNyY0FscGhhPW51bGwsdGhpcy5ibGVuZERzdEFscGhhPW51bGwsdGhpcy5ibGVuZEVxdWF0aW9uQWxwaGE9bnVsbCx0aGlzLmRlcHRoRnVuYz0zLHRoaXMuZGVwdGhUZXN0PSEwLHRoaXMuZGVwdGhXcml0ZT0hMCx0aGlzLnN0ZW5jaWxXcml0ZU1hc2s9MjU1LHRoaXMuc3RlbmNpbEZ1bmM9NTE5LHRoaXMuc3RlbmNpbFJlZj0wLHRoaXMuc3RlbmNpbEZ1bmNNYXNrPTI1NSx0aGlzLnN0ZW5jaWxGYWlsPUhadCx0aGlzLnN0ZW5jaWxaRmFpbD1IWnQsdGhpcy5zdGVuY2lsWlBhc3M9SFp0LHRoaXMuc3RlbmNpbFdyaXRlPSExLHRoaXMuY2xpcHBpbmdQbGFuZXM9bnVsbCx0aGlzLmNsaXBJbnRlcnNlY3Rpb249ITEsdGhpcy5jbGlwU2hhZG93cz0hMSx0aGlzLnNoYWRvd1NpZGU9bnVsbCx0aGlzLmNvbG9yV3JpdGU9ITAsdGhpcy5wcmVjaXNpb249bnVsbCx0aGlzLnBvbHlnb25PZmZzZXQ9ITEsdGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yPTAsdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHM9MCx0aGlzLmRpdGhlcmluZz0hMSx0aGlzLmFscGhhVGVzdD0wLHRoaXMuYWxwaGFUb0NvdmVyYWdlPSExLHRoaXMucHJlbXVsdGlwbGllZEFscGhhPSExLHRoaXMudmlzaWJsZT0hMCx0aGlzLnRvbmVNYXBwZWQ9ITAsdGhpcy51c2VyRGF0YT17fSx0aGlzLnZlcnNpb249MH1vbkJ1aWxkKCl7fW9uQmVmb3JlQ29tcGlsZSgpe31jdXN0b21Qcm9ncmFtQ2FjaGVLZXkoKXtyZXR1cm4gdGhpcy5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKX1zZXRWYWx1ZXModCl7aWYodm9pZCAwIT09dClmb3IoY29uc3QgZSBpbiB0KXtjb25zdCBuPXRbZV07aWYodm9pZCAwPT09bil7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbDogJyIrZSsiJyBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkLiIpO2NvbnRpbnVlfWlmKCJzaGFkaW5nIj09PWUpe2NvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLiIpLHRoaXMuZmxhdFNoYWRpbmc9MT09PW47Y29udGludWV9Y29uc3QgaT10aGlzW2VdO3ZvaWQgMCE9PWk/aSYmaS5pc0NvbG9yP2kuc2V0KG4pOmkmJmkuaXNWZWN0b3IzJiZuJiZuLmlzVmVjdG9yMz9pLmNvcHkobik6dGhpc1tlXT1uOmNvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogJyIrZSsiJyBpcyBub3QgYSBwcm9wZXJ0eSBvZiB0aGlzIG1hdGVyaWFsLiIpfX10b0pTT04odCl7Y29uc3QgZT12b2lkIDA9PT10fHwic3RyaW5nIj09dHlwZW9mIHQ7ZSYmKHQ9e3RleHR1cmVzOnt9LGltYWdlczp7fX0pO2NvbnN0IG49e21ldGFkYXRhOnt2ZXJzaW9uOjQuNSx0eXBlOiJNYXRlcmlhbCIsZ2VuZXJhdG9yOiJNYXRlcmlhbC50b0pTT04ifX07ZnVuY3Rpb24gaSh0KXtjb25zdCBlPVtdO2Zvcihjb25zdCBuIGluIHQpe2NvbnN0IGk9dFtuXTtkZWxldGUgaS5tZXRhZGF0YSxlLnB1c2goaSl9cmV0dXJuIGV9aWYobi51dWlkPXRoaXMudXVpZCxuLnR5cGU9dGhpcy50eXBlLCIiIT09dGhpcy5uYW1lJiYobi5uYW1lPXRoaXMubmFtZSksdGhpcy5jb2xvciYmdGhpcy5jb2xvci5pc0NvbG9yJiYobi5jb2xvcj10aGlzLmNvbG9yLmdldEhleCgpKSx2b2lkIDAhPT10aGlzLnJvdWdobmVzcyYmKG4ucm91Z2huZXNzPXRoaXMucm91Z2huZXNzKSx2b2lkIDAhPT10aGlzLm1ldGFsbmVzcyYmKG4ubWV0YWxuZXNzPXRoaXMubWV0YWxuZXNzKSx0aGlzLnNoZWVuJiZ0aGlzLnNoZWVuLmlzQ29sb3ImJihuLnNoZWVuPXRoaXMuc2hlZW4uZ2V0SGV4KCkpLHRoaXMuZW1pc3NpdmUmJnRoaXMuZW1pc3NpdmUuaXNDb2xvciYmKG4uZW1pc3NpdmU9dGhpcy5lbWlzc2l2ZS5nZXRIZXgoKSksdGhpcy5lbWlzc2l2ZUludGVuc2l0eSYmMSE9PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkmJihuLmVtaXNzaXZlSW50ZW5zaXR5PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkpLHRoaXMuc3BlY3VsYXImJnRoaXMuc3BlY3VsYXIuaXNDb2xvciYmKG4uc3BlY3VsYXI9dGhpcy5zcGVjdWxhci5nZXRIZXgoKSksdm9pZCAwIT09dGhpcy5zcGVjdWxhckludGVuc2l0eSYmKG4uc3BlY3VsYXJJbnRlbnNpdHk9dGhpcy5zcGVjdWxhckludGVuc2l0eSksdGhpcy5zcGVjdWxhclRpbnQmJnRoaXMuc3BlY3VsYXJUaW50LmlzQ29sb3ImJihuLnNwZWN1bGFyVGludD10aGlzLnNwZWN1bGFyVGludC5nZXRIZXgoKSksdm9pZCAwIT09dGhpcy5zaGluaW5lc3MmJihuLnNoaW5pbmVzcz10aGlzLnNoaW5pbmVzcyksdm9pZCAwIT09dGhpcy5jbGVhcmNvYXQmJihuLmNsZWFyY29hdD10aGlzLmNsZWFyY29hdCksdm9pZCAwIT09dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MmJihuLmNsZWFyY29hdFJvdWdobmVzcz10aGlzLmNsZWFyY29hdFJvdWdobmVzcyksdGhpcy5jbGVhcmNvYXRNYXAmJnRoaXMuY2xlYXJjb2F0TWFwLmlzVGV4dHVyZSYmKG4uY2xlYXJjb2F0TWFwPXRoaXMuY2xlYXJjb2F0TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcCYmdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAuaXNUZXh0dXJlJiYobi5jbGVhcmNvYXRSb3VnaG5lc3NNYXA9dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwJiZ0aGlzLmNsZWFyY29hdE5vcm1hbE1hcC5pc1RleHR1cmUmJihuLmNsZWFyY29hdE5vcm1hbE1hcD10aGlzLmNsZWFyY29hdE5vcm1hbE1hcC50b0pTT04odCkudXVpZCxuLmNsZWFyY29hdE5vcm1hbFNjYWxlPXRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudG9BcnJheSgpKSx0aGlzLm1hcCYmdGhpcy5tYXAuaXNUZXh0dXJlJiYobi5tYXA9dGhpcy5tYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubWF0Y2FwJiZ0aGlzLm1hdGNhcC5pc1RleHR1cmUmJihuLm1hdGNhcD10aGlzLm1hdGNhcC50b0pTT04odCkudXVpZCksdGhpcy5hbHBoYU1hcCYmdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUmJihuLmFscGhhTWFwPXRoaXMuYWxwaGFNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubGlnaHRNYXAmJnRoaXMubGlnaHRNYXAuaXNUZXh0dXJlJiYobi5saWdodE1hcD10aGlzLmxpZ2h0TWFwLnRvSlNPTih0KS51dWlkLG4ubGlnaHRNYXBJbnRlbnNpdHk9dGhpcy5saWdodE1hcEludGVuc2l0eSksdGhpcy5hb01hcCYmdGhpcy5hb01hcC5pc1RleHR1cmUmJihuLmFvTWFwPXRoaXMuYW9NYXAudG9KU09OKHQpLnV1aWQsbi5hb01hcEludGVuc2l0eT10aGlzLmFvTWFwSW50ZW5zaXR5KSx0aGlzLmJ1bXBNYXAmJnRoaXMuYnVtcE1hcC5pc1RleHR1cmUmJihuLmJ1bXBNYXA9dGhpcy5idW1wTWFwLnRvSlNPTih0KS51dWlkLG4uYnVtcFNjYWxlPXRoaXMuYnVtcFNjYWxlKSx0aGlzLm5vcm1hbE1hcCYmdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlJiYobi5ub3JtYWxNYXA9dGhpcy5ub3JtYWxNYXAudG9KU09OKHQpLnV1aWQsbi5ub3JtYWxNYXBUeXBlPXRoaXMubm9ybWFsTWFwVHlwZSxuLm5vcm1hbFNjYWxlPXRoaXMubm9ybWFsU2NhbGUudG9BcnJheSgpKSx0aGlzLmRpc3BsYWNlbWVudE1hcCYmdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlJiYobi5kaXNwbGFjZW1lbnRNYXA9dGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKHQpLnV1aWQsbi5kaXNwbGFjZW1lbnRTY2FsZT10aGlzLmRpc3BsYWNlbWVudFNjYWxlLG4uZGlzcGxhY2VtZW50Qmlhcz10aGlzLmRpc3BsYWNlbWVudEJpYXMpLHRoaXMucm91Z2huZXNzTWFwJiZ0aGlzLnJvdWdobmVzc01hcC5pc1RleHR1cmUmJihuLnJvdWdobmVzc01hcD10aGlzLnJvdWdobmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5tZXRhbG5lc3NNYXAmJnRoaXMubWV0YWxuZXNzTWFwLmlzVGV4dHVyZSYmKG4ubWV0YWxuZXNzTWFwPXRoaXMubWV0YWxuZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVtaXNzaXZlTWFwJiZ0aGlzLmVtaXNzaXZlTWFwLmlzVGV4dHVyZSYmKG4uZW1pc3NpdmVNYXA9dGhpcy5lbWlzc2l2ZU1hcC50b0pTT04odCkudXVpZCksdGhpcy5zcGVjdWxhck1hcCYmdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFyTWFwPXRoaXMuc3BlY3VsYXJNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAmJnRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAuaXNUZXh0dXJlJiYobi5zcGVjdWxhckludGVuc2l0eU1hcD10aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnNwZWN1bGFyVGludE1hcCYmdGhpcy5zcGVjdWxhclRpbnRNYXAuaXNUZXh0dXJlJiYobi5zcGVjdWxhclRpbnRNYXA9dGhpcy5zcGVjdWxhclRpbnRNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuZW52TWFwJiZ0aGlzLmVudk1hcC5pc1RleHR1cmUmJihuLmVudk1hcD10aGlzLmVudk1hcC50b0pTT04odCkudXVpZCx2b2lkIDAhPT10aGlzLmNvbWJpbmUmJihuLmNvbWJpbmU9dGhpcy5jb21iaW5lKSksdm9pZCAwIT09dGhpcy5lbnZNYXBJbnRlbnNpdHkmJihuLmVudk1hcEludGVuc2l0eT10aGlzLmVudk1hcEludGVuc2l0eSksdm9pZCAwIT09dGhpcy5yZWZsZWN0aXZpdHkmJihuLnJlZmxlY3Rpdml0eT10aGlzLnJlZmxlY3Rpdml0eSksdm9pZCAwIT09dGhpcy5yZWZyYWN0aW9uUmF0aW8mJihuLnJlZnJhY3Rpb25SYXRpbz10aGlzLnJlZnJhY3Rpb25SYXRpbyksdGhpcy5ncmFkaWVudE1hcCYmdGhpcy5ncmFkaWVudE1hcC5pc1RleHR1cmUmJihuLmdyYWRpZW50TWFwPXRoaXMuZ3JhZGllbnRNYXAudG9KU09OKHQpLnV1aWQpLHZvaWQgMCE9PXRoaXMudHJhbnNtaXNzaW9uJiYobi50cmFuc21pc3Npb249dGhpcy50cmFuc21pc3Npb24pLHRoaXMudHJhbnNtaXNzaW9uTWFwJiZ0aGlzLnRyYW5zbWlzc2lvbk1hcC5pc1RleHR1cmUmJihuLnRyYW5zbWlzc2lvbk1hcD10aGlzLnRyYW5zbWlzc2lvbk1hcC50b0pTT04odCkudXVpZCksdm9pZCAwIT09dGhpcy50aGlja25lc3MmJihuLnRoaWNrbmVzcz10aGlzLnRoaWNrbmVzcyksdGhpcy50aGlja25lc3NNYXAmJnRoaXMudGhpY2tuZXNzTWFwLmlzVGV4dHVyZSYmKG4udGhpY2tuZXNzTWFwPXRoaXMudGhpY2tuZXNzTWFwLnRvSlNPTih0KS51dWlkKSx2b2lkIDAhPT10aGlzLmF0dGVudWF0aW9uRGlzdGFuY2UmJihuLmF0dGVudWF0aW9uRGlzdGFuY2U9dGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlKSx2b2lkIDAhPT10aGlzLmF0dGVudWF0aW9uVGludCYmKG4uYXR0ZW51YXRpb25UaW50PXRoaXMuYXR0ZW51YXRpb25UaW50LmdldEhleCgpKSx2b2lkIDAhPT10aGlzLnNpemUmJihuLnNpemU9dGhpcy5zaXplKSxudWxsIT09dGhpcy5zaGFkb3dTaWRlJiYobi5zaGFkb3dTaWRlPXRoaXMuc2hhZG93U2lkZSksdm9pZCAwIT09dGhpcy5zaXplQXR0ZW51YXRpb24mJihuLnNpemVBdHRlbnVhdGlvbj10aGlzLnNpemVBdHRlbnVhdGlvbiksMSE9PXRoaXMuYmxlbmRpbmcmJihuLmJsZW5kaW5nPXRoaXMuYmxlbmRpbmcpLDAhPT10aGlzLnNpZGUmJihuLnNpZGU9dGhpcy5zaWRlKSx0aGlzLnZlcnRleENvbG9ycyYmKG4udmVydGV4Q29sb3JzPSEwKSx0aGlzLm9wYWNpdHk8MSYmKG4ub3BhY2l0eT10aGlzLm9wYWNpdHkpLCEwPT09dGhpcy50cmFuc3BhcmVudCYmKG4udHJhbnNwYXJlbnQ9dGhpcy50cmFuc3BhcmVudCksbi5kZXB0aEZ1bmM9dGhpcy5kZXB0aEZ1bmMsbi5kZXB0aFRlc3Q9dGhpcy5kZXB0aFRlc3Qsbi5kZXB0aFdyaXRlPXRoaXMuZGVwdGhXcml0ZSxuLmNvbG9yV3JpdGU9dGhpcy5jb2xvcldyaXRlLG4uc3RlbmNpbFdyaXRlPXRoaXMuc3RlbmNpbFdyaXRlLG4uc3RlbmNpbFdyaXRlTWFzaz10aGlzLnN0ZW5jaWxXcml0ZU1hc2ssbi5zdGVuY2lsRnVuYz10aGlzLnN0ZW5jaWxGdW5jLG4uc3RlbmNpbFJlZj10aGlzLnN0ZW5jaWxSZWYsbi5zdGVuY2lsRnVuY01hc2s9dGhpcy5zdGVuY2lsRnVuY01hc2ssbi5zdGVuY2lsRmFpbD10aGlzLnN0ZW5jaWxGYWlsLG4uc3RlbmNpbFpGYWlsPXRoaXMuc3RlbmNpbFpGYWlsLG4uc3RlbmNpbFpQYXNzPXRoaXMuc3RlbmNpbFpQYXNzLHRoaXMucm90YXRpb24mJjAhPT10aGlzLnJvdGF0aW9uJiYobi5yb3RhdGlvbj10aGlzLnJvdGF0aW9uKSwhMD09PXRoaXMucG9seWdvbk9mZnNldCYmKG4ucG9seWdvbk9mZnNldD0hMCksMCE9PXRoaXMucG9seWdvbk9mZnNldEZhY3RvciYmKG4ucG9seWdvbk9mZnNldEZhY3Rvcj10aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IpLDAhPT10aGlzLnBvbHlnb25PZmZzZXRVbml0cyYmKG4ucG9seWdvbk9mZnNldFVuaXRzPXRoaXMucG9seWdvbk9mZnNldFVuaXRzKSx0aGlzLmxpbmV3aWR0aCYmMSE9PXRoaXMubGluZXdpZHRoJiYobi5saW5ld2lkdGg9dGhpcy5saW5ld2lkdGgpLHZvaWQgMCE9PXRoaXMuZGFzaFNpemUmJihuLmRhc2hTaXplPXRoaXMuZGFzaFNpemUpLHZvaWQgMCE9PXRoaXMuZ2FwU2l6ZSYmKG4uZ2FwU2l6ZT10aGlzLmdhcFNpemUpLHZvaWQgMCE9PXRoaXMuc2NhbGUmJihuLnNjYWxlPXRoaXMuc2NhbGUpLCEwPT09dGhpcy5kaXRoZXJpbmcmJihuLmRpdGhlcmluZz0hMCksdGhpcy5hbHBoYVRlc3Q+MCYmKG4uYWxwaGFUZXN0PXRoaXMuYWxwaGFUZXN0KSwhMD09PXRoaXMuYWxwaGFUb0NvdmVyYWdlJiYobi5hbHBoYVRvQ292ZXJhZ2U9dGhpcy5hbHBoYVRvQ292ZXJhZ2UpLCEwPT09dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEmJihuLnByZW11bHRpcGxpZWRBbHBoYT10aGlzLnByZW11bHRpcGxpZWRBbHBoYSksITA9PT10aGlzLndpcmVmcmFtZSYmKG4ud2lyZWZyYW1lPXRoaXMud2lyZWZyYW1lKSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD4xJiYobi53aXJlZnJhbWVMaW5ld2lkdGg9dGhpcy53aXJlZnJhbWVMaW5ld2lkdGgpLCJyb3VuZCIhPT10aGlzLndpcmVmcmFtZUxpbmVjYXAmJihuLndpcmVmcmFtZUxpbmVjYXA9dGhpcy53aXJlZnJhbWVMaW5lY2FwKSwicm91bmQiIT09dGhpcy53aXJlZnJhbWVMaW5lam9pbiYmKG4ud2lyZWZyYW1lTGluZWpvaW49dGhpcy53aXJlZnJhbWVMaW5lam9pbiksITA9PT10aGlzLmZsYXRTaGFkaW5nJiYobi5mbGF0U2hhZGluZz10aGlzLmZsYXRTaGFkaW5nKSwhMT09PXRoaXMudmlzaWJsZSYmKG4udmlzaWJsZT0hMSksITE9PT10aGlzLnRvbmVNYXBwZWQmJihuLnRvbmVNYXBwZWQ9ITEpLCJ7fSIhPT1KU09OLnN0cmluZ2lmeSh0aGlzLnVzZXJEYXRhKSYmKG4udXNlckRhdGE9dGhpcy51c2VyRGF0YSksZSl7Y29uc3QgZT1pKHQudGV4dHVyZXMpLHI9aSh0LmltYWdlcyk7ZS5sZW5ndGg+MCYmKG4udGV4dHVyZXM9ZSksci5sZW5ndGg+MCYmKG4uaW1hZ2VzPXIpfXJldHVybiBufWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfWNvcHkodCl7dGhpcy5uYW1lPXQubmFtZSx0aGlzLmZvZz10LmZvZyx0aGlzLmJsZW5kaW5nPXQuYmxlbmRpbmcsdGhpcy5zaWRlPXQuc2lkZSx0aGlzLnZlcnRleENvbG9ycz10LnZlcnRleENvbG9ycyx0aGlzLm9wYWNpdHk9dC5vcGFjaXR5LHRoaXMudHJhbnNwYXJlbnQ9dC50cmFuc3BhcmVudCx0aGlzLmJsZW5kU3JjPXQuYmxlbmRTcmMsdGhpcy5ibGVuZERzdD10LmJsZW5kRHN0LHRoaXMuYmxlbmRFcXVhdGlvbj10LmJsZW5kRXF1YXRpb24sdGhpcy5ibGVuZFNyY0FscGhhPXQuYmxlbmRTcmNBbHBoYSx0aGlzLmJsZW5kRHN0QWxwaGE9dC5ibGVuZERzdEFscGhhLHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhPXQuYmxlbmRFcXVhdGlvbkFscGhhLHRoaXMuZGVwdGhGdW5jPXQuZGVwdGhGdW5jLHRoaXMuZGVwdGhUZXN0PXQuZGVwdGhUZXN0LHRoaXMuZGVwdGhXcml0ZT10LmRlcHRoV3JpdGUsdGhpcy5zdGVuY2lsV3JpdGVNYXNrPXQuc3RlbmNpbFdyaXRlTWFzayx0aGlzLnN0ZW5jaWxGdW5jPXQuc3RlbmNpbEZ1bmMsdGhpcy5zdGVuY2lsUmVmPXQuc3RlbmNpbFJlZix0aGlzLnN0ZW5jaWxGdW5jTWFzaz10LnN0ZW5jaWxGdW5jTWFzayx0aGlzLnN0ZW5jaWxGYWlsPXQuc3RlbmNpbEZhaWwsdGhpcy5zdGVuY2lsWkZhaWw9dC5zdGVuY2lsWkZhaWwsdGhpcy5zdGVuY2lsWlBhc3M9dC5zdGVuY2lsWlBhc3MsdGhpcy5zdGVuY2lsV3JpdGU9dC5zdGVuY2lsV3JpdGU7Y29uc3QgZT10LmNsaXBwaW5nUGxhbmVzO2xldCBuPW51bGw7aWYobnVsbCE9PWUpe2NvbnN0IHQ9ZS5sZW5ndGg7bj1uZXcgQXJyYXkodCk7Zm9yKGxldCBpPTA7aSE9PXQ7KytpKW5baV09ZVtpXS5jbG9uZSgpfXJldHVybiB0aGlzLmNsaXBwaW5nUGxhbmVzPW4sdGhpcy5jbGlwSW50ZXJzZWN0aW9uPXQuY2xpcEludGVyc2VjdGlvbix0aGlzLmNsaXBTaGFkb3dzPXQuY2xpcFNoYWRvd3MsdGhpcy5zaGFkb3dTaWRlPXQuc2hhZG93U2lkZSx0aGlzLmNvbG9yV3JpdGU9dC5jb2xvcldyaXRlLHRoaXMucHJlY2lzaW9uPXQucHJlY2lzaW9uLHRoaXMucG9seWdvbk9mZnNldD10LnBvbHlnb25PZmZzZXQsdGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yPXQucG9seWdvbk9mZnNldEZhY3Rvcix0aGlzLnBvbHlnb25PZmZzZXRVbml0cz10LnBvbHlnb25PZmZzZXRVbml0cyx0aGlzLmRpdGhlcmluZz10LmRpdGhlcmluZyx0aGlzLmFscGhhVGVzdD10LmFscGhhVGVzdCx0aGlzLmFscGhhVG9Db3ZlcmFnZT10LmFscGhhVG9Db3ZlcmFnZSx0aGlzLnByZW11bHRpcGxpZWRBbHBoYT10LnByZW11bHRpcGxpZWRBbHBoYSx0aGlzLnZpc2libGU9dC52aXNpYmxlLHRoaXMudG9uZU1hcHBlZD10LnRvbmVNYXBwZWQsdGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQudXNlckRhdGEpKSx0aGlzfWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9c2V0IG5lZWRzVXBkYXRlKHQpeyEwPT09dCYmdGhpcy52ZXJzaW9uKyt9fVVRdC5wcm90b3R5cGUuaXNNYXRlcmlhbD0hMDtjb25zdCBqUXQ9e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH0sR1F0PXtoOjAsczowLGw6MH0sV1F0PXtoOjAsczowLGw6MH07ZnVuY3Rpb24gcVF0KHQsZSxuKXtyZXR1cm4gbjwwJiYobis9MSksbj4xJiYobi09MSksbjwxLzY/dCs2KihlLXQpKm46bjwuNT9lOm48Mi8zP3QrNiooZS10KSooMi8zLW4pOnR9ZnVuY3Rpb24gWVF0KHQpe3JldHVybiB0PC4wNDA0NT8uMDc3Mzk5MzgwOCp0Ok1hdGgucG93KC45NDc4NjcyOTg2KnQrLjA1MjEzMjcwMTQsMi40KX1mdW5jdGlvbiBYUXQodCl7cmV0dXJuIHQ8LjAwMzEzMDg/MTIuOTIqdDoxLjA1NSpNYXRoLnBvdyh0LC40MTY2NiktLjA1NX1jbGFzcyAkUXR7Y29uc3RydWN0b3IodCxlLG4pe3JldHVybiB2b2lkIDA9PT1lJiZ2b2lkIDA9PT1uP3RoaXMuc2V0KHQpOnRoaXMuc2V0UkdCKHQsZSxuKX1zZXQodCl7cmV0dXJuIHQmJnQuaXNDb2xvcj90aGlzLmNvcHkodCk6Im51bWJlciI9PXR5cGVvZiB0P3RoaXMuc2V0SGV4KHQpOiJzdHJpbmciPT10eXBlb2YgdCYmdGhpcy5zZXRTdHlsZSh0KSx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy5yPXQsdGhpcy5nPXQsdGhpcy5iPXQsdGhpc31zZXRIZXgodCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSx0aGlzLnI9KHQ+PjE2JjI1NSkvMjU1LHRoaXMuZz0odD4+OCYyNTUpLzI1NSx0aGlzLmI9KDI1NSZ0KS8yNTUsdGhpc31zZXRSR0IodCxlLG4pe3JldHVybiB0aGlzLnI9dCx0aGlzLmc9ZSx0aGlzLmI9bix0aGlzfXNldEhTTCh0LGUsbil7aWYodD1LWnQodCwxKSxlPSRadChlLDAsMSksbj0kWnQobiwwLDEpLDA9PT1lKXRoaXMucj10aGlzLmc9dGhpcy5iPW47ZWxzZXtjb25zdCBpPW48PS41P24qKDErZSk6bitlLW4qZSxyPTIqbi1pO3RoaXMucj1xUXQocixpLHQrMS8zKSx0aGlzLmc9cVF0KHIsaSx0KSx0aGlzLmI9cVF0KHIsaSx0LTEvMyl9cmV0dXJuIHRoaXN9c2V0U3R5bGUodCl7ZnVuY3Rpb24gZShlKXt2b2lkIDAhPT1lJiZwYXJzZUZsb2F0KGUpPDEmJmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAiK3QrIiB3aWxsIGJlIGlnbm9yZWQuIil9bGV0IG47aWYobj0vXigoPzpyZ2J8aHNsKWE/KVwoKFteXCldKilcKS8uZXhlYyh0KSl7bGV0IHQ7Y29uc3QgaT1uWzJdO3N3aXRjaChuWzFdKXtjYXNlInJnYiI6Y2FzZSJyZ2JhIjppZih0PS9eXHMqKFxkKylccyosXHMqKFxkKylccyosXHMqKFxkKylccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoaSkpcmV0dXJuIHRoaXMucj1NYXRoLm1pbigyNTUscGFyc2VJbnQodFsxXSwxMCkpLzI1NSx0aGlzLmc9TWF0aC5taW4oMjU1LHBhcnNlSW50KHRbMl0sMTApKS8yNTUsdGhpcy5iPU1hdGgubWluKDI1NSxwYXJzZUludCh0WzNdLDEwKSkvMjU1LGUodFs0XSksdGhpcztpZih0PS9eXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqLFxzKihcZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoaSkpcmV0dXJuIHRoaXMucj1NYXRoLm1pbigxMDAscGFyc2VJbnQodFsxXSwxMCkpLzEwMCx0aGlzLmc9TWF0aC5taW4oMTAwLHBhcnNlSW50KHRbMl0sMTApKS8xMDAsdGhpcy5iPU1hdGgubWluKDEwMCxwYXJzZUludCh0WzNdLDEwKSkvMTAwLGUodFs0XSksdGhpczticmVhaztjYXNlImhzbCI6Y2FzZSJoc2xhIjppZih0PS9eXHMqKFxkKlwuP1xkKylccyosXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKGkpKXtjb25zdCBuPXBhcnNlRmxvYXQodFsxXSkvMzYwLGk9cGFyc2VJbnQodFsyXSwxMCkvMTAwLHI9cGFyc2VJbnQodFszXSwxMCkvMTAwO3JldHVybiBlKHRbNF0pLHRoaXMuc2V0SFNMKG4saSxyKX19fWVsc2UgaWYobj0vXlwjKFtBLUZhLWZcZF0rKSQvLmV4ZWModCkpe2NvbnN0IHQ9blsxXSxlPXQubGVuZ3RoO2lmKDM9PT1lKXJldHVybiB0aGlzLnI9cGFyc2VJbnQodC5jaGFyQXQoMCkrdC5jaGFyQXQoMCksMTYpLzI1NSx0aGlzLmc9cGFyc2VJbnQodC5jaGFyQXQoMSkrdC5jaGFyQXQoMSksMTYpLzI1NSx0aGlzLmI9cGFyc2VJbnQodC5jaGFyQXQoMikrdC5jaGFyQXQoMiksMTYpLzI1NSx0aGlzO2lmKDY9PT1lKXJldHVybiB0aGlzLnI9cGFyc2VJbnQodC5jaGFyQXQoMCkrdC5jaGFyQXQoMSksMTYpLzI1NSx0aGlzLmc9cGFyc2VJbnQodC5jaGFyQXQoMikrdC5jaGFyQXQoMyksMTYpLzI1NSx0aGlzLmI9cGFyc2VJbnQodC5jaGFyQXQoNCkrdC5jaGFyQXQoNSksMTYpLzI1NSx0aGlzfXJldHVybiB0JiZ0Lmxlbmd0aD4wP3RoaXMuc2V0Q29sb3JOYW1lKHQpOnRoaXN9c2V0Q29sb3JOYW1lKHQpe2NvbnN0IGU9alF0W3QudG9Mb3dlckNhc2UoKV07cmV0dXJuIHZvaWQgMCE9PWU/dGhpcy5zZXRIZXgoZSk6Y29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAiK3QpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5yLHRoaXMuZyx0aGlzLmIpfWNvcHkodCl7cmV0dXJuIHRoaXMucj10LnIsdGhpcy5nPXQuZyx0aGlzLmI9dC5iLHRoaXN9Y29weUdhbW1hVG9MaW5lYXIodCxlPTIpe3JldHVybiB0aGlzLnI9TWF0aC5wb3codC5yLGUpLHRoaXMuZz1NYXRoLnBvdyh0LmcsZSksdGhpcy5iPU1hdGgucG93KHQuYixlKSx0aGlzfWNvcHlMaW5lYXJUb0dhbW1hKHQsZT0yKXtjb25zdCBuPWU+MD8xL2U6MTtyZXR1cm4gdGhpcy5yPU1hdGgucG93KHQucixuKSx0aGlzLmc9TWF0aC5wb3codC5nLG4pLHRoaXMuYj1NYXRoLnBvdyh0LmIsbiksdGhpc31jb252ZXJ0R2FtbWFUb0xpbmVhcih0KXtyZXR1cm4gdGhpcy5jb3B5R2FtbWFUb0xpbmVhcih0aGlzLHQpLHRoaXN9Y29udmVydExpbmVhclRvR2FtbWEodCl7cmV0dXJuIHRoaXMuY29weUxpbmVhclRvR2FtbWEodGhpcyx0KSx0aGlzfWNvcHlTUkdCVG9MaW5lYXIodCl7cmV0dXJuIHRoaXMucj1ZUXQodC5yKSx0aGlzLmc9WVF0KHQuZyksdGhpcy5iPVlRdCh0LmIpLHRoaXN9Y29weUxpbmVhclRvU1JHQih0KXtyZXR1cm4gdGhpcy5yPVhRdCh0LnIpLHRoaXMuZz1YUXQodC5nKSx0aGlzLmI9WFF0KHQuYiksdGhpc31jb252ZXJ0U1JHQlRvTGluZWFyKCl7cmV0dXJuIHRoaXMuY29weVNSR0JUb0xpbmVhcih0aGlzKSx0aGlzfWNvbnZlcnRMaW5lYXJUb1NSR0IoKXtyZXR1cm4gdGhpcy5jb3B5TGluZWFyVG9TUkdCKHRoaXMpLHRoaXN9Z2V0SGV4KCl7cmV0dXJuIDI1NSp0aGlzLnI8PDE2XjI1NSp0aGlzLmc8PDheMjU1KnRoaXMuYjw8MH1nZXRIZXhTdHJpbmcoKXtyZXR1cm4oIjAwMDAwMCIrdGhpcy5nZXRIZXgoKS50b1N0cmluZygxNikpLnNsaWNlKC02KX1nZXRIU0wodCl7Y29uc3QgZT10aGlzLnIsbj10aGlzLmcsaT10aGlzLmIscj1NYXRoLm1heChlLG4saSksbz1NYXRoLm1pbihlLG4saSk7bGV0IGEscztjb25zdCBsPShvK3IpLzI7aWYobz09PXIpYT0wLHM9MDtlbHNle2NvbnN0IHQ9ci1vO3N3aXRjaChzPWw8PS41P3QvKHIrbyk6dC8oMi1yLW8pLHIpe2Nhc2UgZTphPShuLWkpL3QrKG48aT82OjApO2JyZWFrO2Nhc2UgbjphPShpLWUpL3QrMjticmVhaztjYXNlIGk6YT0oZS1uKS90KzR9YS89Nn1yZXR1cm4gdC5oPWEsdC5zPXMsdC5sPWwsdH1nZXRTdHlsZSgpe3JldHVybiJyZ2IoIisoMjU1KnRoaXMucnwwKSsiLCIrKDI1NSp0aGlzLmd8MCkrIiwiKygyNTUqdGhpcy5ifDApKyIpIn1vZmZzZXRIU0wodCxlLG4pe3JldHVybiB0aGlzLmdldEhTTChHUXQpLEdRdC5oKz10LEdRdC5zKz1lLEdRdC5sKz1uLHRoaXMuc2V0SFNMKEdRdC5oLEdRdC5zLEdRdC5sKSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy5yKz10LnIsdGhpcy5nKz10LmcsdGhpcy5iKz10LmIsdGhpc31hZGRDb2xvcnModCxlKXtyZXR1cm4gdGhpcy5yPXQucitlLnIsdGhpcy5nPXQuZytlLmcsdGhpcy5iPXQuYitlLmIsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMucis9dCx0aGlzLmcrPXQsdGhpcy5iKz10LHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLnI9TWF0aC5tYXgoMCx0aGlzLnItdC5yKSx0aGlzLmc9TWF0aC5tYXgoMCx0aGlzLmctdC5nKSx0aGlzLmI9TWF0aC5tYXgoMCx0aGlzLmItdC5iKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLnIqPXQucix0aGlzLmcqPXQuZyx0aGlzLmIqPXQuYix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLnIqPXQsdGhpcy5nKj10LHRoaXMuYio9dCx0aGlzfWxlcnAodCxlKXtyZXR1cm4gdGhpcy5yKz0odC5yLXRoaXMucikqZSx0aGlzLmcrPSh0LmctdGhpcy5nKSplLHRoaXMuYis9KHQuYi10aGlzLmIpKmUsdGhpc31sZXJwQ29sb3JzKHQsZSxuKXtyZXR1cm4gdGhpcy5yPXQucisoZS5yLXQucikqbix0aGlzLmc9dC5nKyhlLmctdC5nKSpuLHRoaXMuYj10LmIrKGUuYi10LmIpKm4sdGhpc31sZXJwSFNMKHQsZSl7dGhpcy5nZXRIU0woR1F0KSx0LmdldEhTTChXUXQpO2NvbnN0IG49Wlp0KEdRdC5oLFdRdC5oLGUpLGk9Wlp0KEdRdC5zLFdRdC5zLGUpLHI9Wlp0KEdRdC5sLFdRdC5sLGUpO3JldHVybiB0aGlzLnNldEhTTChuLGksciksdGhpc31lcXVhbHModCl7cmV0dXJuIHQucj09PXRoaXMuciYmdC5nPT09dGhpcy5nJiZ0LmI9PT10aGlzLmJ9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5yPXRbZV0sdGhpcy5nPXRbZSsxXSx0aGlzLmI9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy5yLHRbZSsxXT10aGlzLmcsdFtlKzJdPXRoaXMuYix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5yPXQuZ2V0WChlKSx0aGlzLmc9dC5nZXRZKGUpLHRoaXMuYj10LmdldFooZSksITA9PT10Lm5vcm1hbGl6ZWQmJih0aGlzLnIvPTI1NSx0aGlzLmcvPTI1NSx0aGlzLmIvPTI1NSksdGhpc310b0pTT04oKXtyZXR1cm4gdGhpcy5nZXRIZXgoKX19JFF0Lk5BTUVTPWpRdCwkUXQucHJvdG90eXBlLmlzQ29sb3I9ITAsJFF0LnByb3RvdHlwZS5yPTEsJFF0LnByb3RvdHlwZS5nPTEsJFF0LnByb3RvdHlwZS5iPTE7Y2xhc3MgS1F0IGV4dGVuZHMgVVF0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy50eXBlPSJNZXNoQmFzaWNNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgJFF0KDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLnNwZWN1bGFyTWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZW52TWFwPW51bGwsdGhpcy5jb21iaW5lPTAsdGhpcy5yZWZsZWN0aXZpdHk9MSx0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTgsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIix0aGlzLndpcmVmcmFtZUxpbmVqb2luPSJyb3VuZCIsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXA9dC5tYXAsdGhpcy5saWdodE1hcD10LmxpZ2h0TWFwLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9dC5saWdodE1hcEludGVuc2l0eSx0aGlzLmFvTWFwPXQuYW9NYXAsdGhpcy5hb01hcEludGVuc2l0eT10LmFvTWFwSW50ZW5zaXR5LHRoaXMuc3BlY3VsYXJNYXA9dC5zcGVjdWxhck1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5lbnZNYXA9dC5lbnZNYXAsdGhpcy5jb21iaW5lPXQuY29tYmluZSx0aGlzLnJlZmxlY3Rpdml0eT10LnJlZmxlY3Rpdml0eSx0aGlzLnJlZnJhY3Rpb25SYXRpbz10LnJlZnJhY3Rpb25SYXRpbyx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbix0aGlzfX1LUXQucHJvdG90eXBlLmlzTWVzaEJhc2ljTWF0ZXJpYWw9ITA7Y29uc3QgWlF0PW5ldyBDSnQsSlF0PW5ldyBtSnQ7Y2xhc3MgUVF0e2NvbnN0cnVjdG9yKHQsZSxuKXtpZihBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuIik7dGhpcy5uYW1lPSIiLHRoaXMuYXJyYXk9dCx0aGlzLml0ZW1TaXplPWUsdGhpcy5jb3VudD12b2lkIDAhPT10P3QubGVuZ3RoL2U6MCx0aGlzLm5vcm1hbGl6ZWQ9ITA9PT1uLHRoaXMudXNhZ2U9Rlp0LHRoaXMudXBkYXRlUmFuZ2U9e29mZnNldDowLGNvdW50Oi0xfSx0aGlzLnZlcnNpb249MH1vblVwbG9hZENhbGxiYWNrKCl7fXNldCBuZWVkc1VwZGF0ZSh0KXshMD09PXQmJnRoaXMudmVyc2lvbisrfXNldFVzYWdlKHQpe3JldHVybiB0aGlzLnVzYWdlPXQsdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm5hbWU9dC5uYW1lLHRoaXMuYXJyYXk9bmV3IHQuYXJyYXkuY29uc3RydWN0b3IodC5hcnJheSksdGhpcy5pdGVtU2l6ZT10Lml0ZW1TaXplLHRoaXMuY291bnQ9dC5jb3VudCx0aGlzLm5vcm1hbGl6ZWQ9dC5ub3JtYWxpemVkLHRoaXMudXNhZ2U9dC51c2FnZSx0aGlzfWNvcHlBdCh0LGUsbil7dCo9dGhpcy5pdGVtU2l6ZSxuKj1lLml0ZW1TaXplO2ZvcihsZXQgaT0wLHI9dGhpcy5pdGVtU2l6ZTtpPHI7aSsrKXRoaXMuYXJyYXlbdCtpXT1lLmFycmF5W24raV07cmV0dXJuIHRoaXN9Y29weUFycmF5KHQpe3JldHVybiB0aGlzLmFycmF5LnNldCh0KSx0aGlzfWNvcHlDb2xvcnNBcnJheSh0KXtjb25zdCBlPXRoaXMuYXJyYXk7bGV0IG49MDtmb3IobGV0IGk9MCxyPXQubGVuZ3RoO2k8cjtpKyspe2xldCByPXRbaV07dm9pZCAwPT09ciYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlDb2xvcnNBcnJheSgpOiBjb2xvciBpcyB1bmRlZmluZWQiLGkpLHI9bmV3ICRRdCksZVtuKytdPXIucixlW24rK109ci5nLGVbbisrXT1yLmJ9cmV0dXJuIHRoaXN9Y29weVZlY3RvcjJzQXJyYXkodCl7Y29uc3QgZT10aGlzLmFycmF5O2xldCBuPTA7Zm9yKGxldCBpPTAscj10Lmxlbmd0aDtpPHI7aSsrKXtsZXQgcj10W2ldO3ZvaWQgMD09PXImJihjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yMnNBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkIixpKSxyPW5ldyBtSnQpLGVbbisrXT1yLngsZVtuKytdPXIueX1yZXR1cm4gdGhpc31jb3B5VmVjdG9yM3NBcnJheSh0KXtjb25zdCBlPXRoaXMuYXJyYXk7bGV0IG49MDtmb3IobGV0IGk9MCxyPXQubGVuZ3RoO2k8cjtpKyspe2xldCByPXRbaV07dm9pZCAwPT09ciYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQiLGkpLHI9bmV3IENKdCksZVtuKytdPXIueCxlW24rK109ci55LGVbbisrXT1yLnp9cmV0dXJuIHRoaXN9Y29weVZlY3RvcjRzQXJyYXkodCl7Y29uc3QgZT10aGlzLmFycmF5O2xldCBuPTA7Zm9yKGxldCBpPTAscj10Lmxlbmd0aDtpPHI7aSsrKXtsZXQgcj10W2ldO3ZvaWQgMD09PXImJihjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yNHNBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkIixpKSxyPW5ldyB3SnQpLGVbbisrXT1yLngsZVtuKytdPXIueSxlW24rK109ci56LGVbbisrXT1yLnd9cmV0dXJuIHRoaXN9YXBwbHlNYXRyaXgzKHQpe2lmKDI9PT10aGlzLml0ZW1TaXplKWZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKUpRdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksSlF0LmFwcGx5TWF0cml4Myh0KSx0aGlzLnNldFhZKGUsSlF0LngsSlF0LnkpO2Vsc2UgaWYoMz09PXRoaXMuaXRlbVNpemUpZm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspWlF0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxaUXQuYXBwbHlNYXRyaXgzKHQpLHRoaXMuc2V0WFlaKGUsWlF0LngsWlF0LnksWlF0LnopO3JldHVybiB0aGlzfWFwcGx5TWF0cml4NCh0KXtmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylaUXQueD10aGlzLmdldFgoZSksWlF0Lnk9dGhpcy5nZXRZKGUpLFpRdC56PXRoaXMuZ2V0WihlKSxaUXQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0WFlaKGUsWlF0LngsWlF0LnksWlF0LnopO3JldHVybiB0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKVpRdC54PXRoaXMuZ2V0WChlKSxaUXQueT10aGlzLmdldFkoZSksWlF0Lno9dGhpcy5nZXRaKGUpLFpRdC5hcHBseU5vcm1hbE1hdHJpeCh0KSx0aGlzLnNldFhZWihlLFpRdC54LFpRdC55LFpRdC56KTtyZXR1cm4gdGhpc310cmFuc2Zvcm1EaXJlY3Rpb24odCl7Zm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspWlF0Lng9dGhpcy5nZXRYKGUpLFpRdC55PXRoaXMuZ2V0WShlKSxaUXQuej10aGlzLmdldFooZSksWlF0LnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzLnNldFhZWihlLFpRdC54LFpRdC55LFpRdC56KTtyZXR1cm4gdGhpc31zZXQodCxlPTApe3JldHVybiB0aGlzLmFycmF5LnNldCh0LGUpLHRoaXN9Z2V0WCh0KXtyZXR1cm4gdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemVdfXNldFgodCxlKXtyZXR1cm4gdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemVdPWUsdGhpc31nZXRZKHQpe3JldHVybiB0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsxXX1zZXRZKHQsZSl7cmV0dXJuIHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzFdPWUsdGhpc31nZXRaKHQpe3JldHVybiB0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsyXX1zZXRaKHQsZSl7cmV0dXJuIHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzJdPWUsdGhpc31nZXRXKHQpe3JldHVybiB0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSszXX1zZXRXKHQsZSl7cmV0dXJuIHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzNdPWUsdGhpc31zZXRYWSh0LGUsbil7cmV0dXJuIHRoaXMuYXJyYXlbMCsodCo9dGhpcy5pdGVtU2l6ZSldPWUsdGhpcy5hcnJheVt0KzFdPW4sdGhpc31zZXRYWVoodCxlLG4saSl7cmV0dXJuIHRoaXMuYXJyYXlbMCsodCo9dGhpcy5pdGVtU2l6ZSldPWUsdGhpcy5hcnJheVt0KzFdPW4sdGhpcy5hcnJheVt0KzJdPWksdGhpc31zZXRYWVpXKHQsZSxuLGkscil7cmV0dXJuIHRoaXMuYXJyYXlbMCsodCo9dGhpcy5pdGVtU2l6ZSldPWUsdGhpcy5hcnJheVt0KzFdPW4sdGhpcy5hcnJheVt0KzJdPWksdGhpcy5hcnJheVt0KzNdPXIsdGhpc31vblVwbG9hZCh0KXtyZXR1cm4gdGhpcy5vblVwbG9hZENhbGxiYWNrPXQsdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmFycmF5LHRoaXMuaXRlbVNpemUpLmNvcHkodGhpcyl9dG9KU09OKCl7Y29uc3QgdD17aXRlbVNpemU6dGhpcy5pdGVtU2l6ZSx0eXBlOnRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLmFycmF5KSxub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH07cmV0dXJuIiIhPT10aGlzLm5hbWUmJih0Lm5hbWU9dGhpcy5uYW1lKSx0aGlzLnVzYWdlIT09Rlp0JiYodC51c2FnZT10aGlzLnVzYWdlKSwwPT09dGhpcy51cGRhdGVSYW5nZS5vZmZzZXQmJi0xPT09dGhpcy51cGRhdGVSYW5nZS5jb3VudHx8KHQudXBkYXRlUmFuZ2U9dGhpcy51cGRhdGVSYW5nZSksdH19UVF0LnByb3RvdHlwZS5pc0J1ZmZlckF0dHJpYnV0ZT0hMDtjbGFzcyB0MXQgZXh0ZW5kcyBRUXR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBJbnQ4QXJyYXkodCksZSxuKX19Y2xhc3MgZTF0IGV4dGVuZHMgUVF0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgVWludDhBcnJheSh0KSxlLG4pfX1jbGFzcyBuMXQgZXh0ZW5kcyBRUXR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBVaW50OENsYW1wZWRBcnJheSh0KSxlLG4pfX1jbGFzcyBpMXQgZXh0ZW5kcyBRUXR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBJbnQxNkFycmF5KHQpLGUsbil9fWNsYXNzIHIxdCBleHRlbmRzIFFRdHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQxNkFycmF5KHQpLGUsbil9fWNsYXNzIG8xdCBleHRlbmRzIFFRdHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IEludDMyQXJyYXkodCksZSxuKX19Y2xhc3MgYTF0IGV4dGVuZHMgUVF0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgVWludDMyQXJyYXkodCksZSxuKX19Y2xhc3MgczF0IGV4dGVuZHMgUVF0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgVWludDE2QXJyYXkodCksZSxuKX19czF0LnByb3RvdHlwZS5pc0Zsb2F0MTZCdWZmZXJBdHRyaWJ1dGU9ITA7Y2xhc3MgbDF0IGV4dGVuZHMgUVF0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgRmxvYXQzMkFycmF5KHQpLGUsbil9fWNsYXNzIGMxdCBleHRlbmRzIFFRdHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IEZsb2F0NjRBcnJheSh0KSxlLG4pfX1mdW5jdGlvbiB1MXQodCl7aWYoMD09PXQubGVuZ3RoKXJldHVybi0xLzA7bGV0IGU9dFswXTtmb3IobGV0IG49MSxpPXQubGVuZ3RoO248aTsrK24pdFtuXT5lJiYoZT10W25dKTtyZXR1cm4gZX1jb25zdCBoMXQ9e0ludDhBcnJheTpJbnQ4QXJyYXksVWludDhBcnJheTpVaW50OEFycmF5LFVpbnQ4Q2xhbXBlZEFycmF5OlVpbnQ4Q2xhbXBlZEFycmF5LEludDE2QXJyYXk6SW50MTZBcnJheSxVaW50MTZBcnJheTpVaW50MTZBcnJheSxJbnQzMkFycmF5OkludDMyQXJyYXksVWludDMyQXJyYXk6VWludDMyQXJyYXksRmxvYXQzMkFycmF5OkZsb2F0MzJBcnJheSxGbG9hdDY0QXJyYXk6RmxvYXQ2NEFycmF5fTtmdW5jdGlvbiBkMXQodCxlKXtyZXR1cm4gbmV3IGgxdFt0XShlKX1sZXQgcDF0PTA7Y29uc3QgZjF0PW5ldyByUXQsbTF0PW5ldyBrUXQsZzF0PW5ldyBDSnQsXzF0PW5ldyBMSnQseTF0PW5ldyBMSnQsdjF0PW5ldyBDSnQ7Y2xhc3MgYjF0IGV4dGVuZHMgalp0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpwMXQrK30pLHRoaXMudXVpZD1YWnQoKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJCdWZmZXJHZW9tZXRyeSIsdGhpcy5pbmRleD1udWxsLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPSExLHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGwsdGhpcy5kcmF3UmFuZ2U9e3N0YXJ0OjAsY291bnQ6MS8wfSx0aGlzLnVzZXJEYXRhPXt9fWdldEluZGV4KCl7cmV0dXJuIHRoaXMuaW5kZXh9c2V0SW5kZXgodCl7cmV0dXJuIHRoaXMuaW5kZXg9QXJyYXkuaXNBcnJheSh0KT9uZXcodTF0KHQpPjY1NTM1P2ExdDpyMXQpKHQsMSk6dCx0aGlzfWdldEF0dHJpYnV0ZSh0KXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW3RdfXNldEF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF09ZSx0aGlzfWRlbGV0ZUF0dHJpYnV0ZSh0KXtyZXR1cm4gZGVsZXRlIHRoaXMuYXR0cmlidXRlc1t0XSx0aGlzfWhhc0F0dHJpYnV0ZSh0KXtyZXR1cm4gdm9pZCAwIT09dGhpcy5hdHRyaWJ1dGVzW3RdfWFkZEdyb3VwKHQsZSxuPTApe3RoaXMuZ3JvdXBzLnB1c2goe3N0YXJ0OnQsY291bnQ6ZSxtYXRlcmlhbEluZGV4Om59KX1jbGVhckdyb3Vwcygpe3RoaXMuZ3JvdXBzPVtdfXNldERyYXdSYW5nZSh0LGUpe3RoaXMuZHJhd1JhbmdlLnN0YXJ0PXQsdGhpcy5kcmF3UmFuZ2UuY291bnQ9ZX1hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247dm9pZCAwIT09ZSYmKGUuYXBwbHlNYXRyaXg0KHQpLGUubmVlZHNVcGRhdGU9ITApO2NvbnN0IG49dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtpZih2b2lkIDAhPT1uKXtjb25zdCBlPShuZXcgZ0p0KS5nZXROb3JtYWxNYXRyaXgodCk7bi5hcHBseU5vcm1hbE1hdHJpeChlKSxuLm5lZWRzVXBkYXRlPSEwfWNvbnN0IGk9dGhpcy5hdHRyaWJ1dGVzLnRhbmdlbnQ7cmV0dXJuIHZvaWQgMCE9PWkmJihpLnRyYW5zZm9ybURpcmVjdGlvbih0KSxpLm5lZWRzVXBkYXRlPSEwKSxudWxsIT09dGhpcy5ib3VuZGluZ0JveCYmdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKSxudWxsIT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSx0aGlzfWFwcGx5UXVhdGVybmlvbih0KXtyZXR1cm4gZjF0Lm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuYXBwbHlNYXRyaXg0KGYxdCksdGhpc31yb3RhdGVYKHQpe3JldHVybiBmMXQubWFrZVJvdGF0aW9uWCh0KSx0aGlzLmFwcGx5TWF0cml4NChmMXQpLHRoaXN9cm90YXRlWSh0KXtyZXR1cm4gZjF0Lm1ha2VSb3RhdGlvblkodCksdGhpcy5hcHBseU1hdHJpeDQoZjF0KSx0aGlzfXJvdGF0ZVoodCl7cmV0dXJuIGYxdC5tYWtlUm90YXRpb25aKHQpLHRoaXMuYXBwbHlNYXRyaXg0KGYxdCksdGhpc310cmFuc2xhdGUodCxlLG4pe3JldHVybiBmMXQubWFrZVRyYW5zbGF0aW9uKHQsZSxuKSx0aGlzLmFwcGx5TWF0cml4NChmMXQpLHRoaXN9c2NhbGUodCxlLG4pe3JldHVybiBmMXQubWFrZVNjYWxlKHQsZSxuKSx0aGlzLmFwcGx5TWF0cml4NChmMXQpLHRoaXN9bG9va0F0KHQpe3JldHVybiBtMXQubG9va0F0KHQpLG0xdC51cGRhdGVNYXRyaXgoKSx0aGlzLmFwcGx5TWF0cml4NChtMXQubWF0cml4KSx0aGlzfWNlbnRlcigpe3JldHVybiB0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpLHRoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKGcxdCkubmVnYXRlKCksdGhpcy50cmFuc2xhdGUoZzF0LngsZzF0LnksZzF0LnopLHRoaXN9c2V0RnJvbVBvaW50cyh0KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wLGk9dC5sZW5ndGg7bjxpO24rKyl7Y29uc3QgaT10W25dO2UucHVzaChpLngsaS55LGkuenx8MCl9cmV0dXJuIHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGwxdChlLDMpKSx0aGlzfWNvbXB1dGVCb3VuZGluZ0JveCgpe251bGw9PT10aGlzLmJvdW5kaW5nQm94JiYodGhpcy5ib3VuZGluZ0JveD1uZXcgTEp0KTtjb25zdCB0PXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbixlPXRoaXMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKHQmJnQuaXNHTEJ1ZmZlckF0dHJpYnV0ZSlyZXR1cm4gY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk6IEdMQnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIGEgbWFudWFsIGJvdW5kaW5nIGJveC4gQWx0ZXJuYXRpdmVseSBzZXQgIm1lc2guZnJ1c3R1bUN1bGxlZCIgdG8gImZhbHNlIi4nLHRoaXMpLHZvaWQgdGhpcy5ib3VuZGluZ0JveC5zZXQobmV3IENKdCgtMS8wLC0xLzAsLTEvMCksbmV3IENKdCgxLzAsMS8wLDEvMCkpO2lmKHZvaWQgMCE9PXQpe2lmKHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KSxlKWZvcihsZXQgdD0wLG49ZS5sZW5ndGg7dDxuO3QrKylfMXQuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShlW3RdKSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPyh2MXQuYWRkVmVjdG9ycyh0aGlzLmJvdW5kaW5nQm94Lm1pbixfMXQubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQodjF0KSx2MXQuYWRkVmVjdG9ycyh0aGlzLmJvdW5kaW5nQm94Lm1heCxfMXQubWF4KSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQodjF0KSk6KHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChfMXQubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoXzF0Lm1heCkpfWVsc2UgdGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTsoaXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueCl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnkpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi56KSkmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBDb21wdXRlZCBtaW4vbWF4IGhhdmUgTmFOIHZhbHVlcy4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX1jb21wdXRlQm91bmRpbmdTcGhlcmUoKXtudWxsPT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9bmV3ICRKdCk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBzcGhlcmUuIEFsdGVybmF0aXZlbHkgc2V0ICJtZXNoLmZydXN0dW1DdWxsZWQiIHRvICJmYWxzZSIuJyx0aGlzKSx2b2lkIHRoaXMuYm91bmRpbmdTcGhlcmUuc2V0KG5ldyBDSnQsMS8wKTtpZih0KXtjb25zdCBuPXRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO2lmKF8xdC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpLGUpZm9yKGxldCB0PTAsbj1lLmxlbmd0aDt0PG47dCsrKXkxdC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKGVbdF0pLHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU/KHYxdC5hZGRWZWN0b3JzKF8xdC5taW4seTF0Lm1pbiksXzF0LmV4cGFuZEJ5UG9pbnQodjF0KSx2MXQuYWRkVmVjdG9ycyhfMXQubWF4LHkxdC5tYXgpLF8xdC5leHBhbmRCeVBvaW50KHYxdCkpOihfMXQuZXhwYW5kQnlQb2ludCh5MXQubWluKSxfMXQuZXhwYW5kQnlQb2ludCh5MXQubWF4KSk7XzF0LmdldENlbnRlcihuKTtsZXQgaT0wO2ZvcihsZXQgZT0wLHI9dC5jb3VudDtlPHI7ZSsrKXYxdC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksaT1NYXRoLm1heChpLG4uZGlzdGFuY2VUb1NxdWFyZWQodjF0KSk7aWYoZSlmb3IobGV0IHI9MCxvPWUubGVuZ3RoO3I8bztyKyspe2NvbnN0IG89ZVtyXSxhPXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7Zm9yKGxldCBlPTAscj1vLmNvdW50O2U8cjtlKyspdjF0LmZyb21CdWZmZXJBdHRyaWJ1dGUobyxlKSxhJiYoZzF0LmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSx2MXQuYWRkKGcxdCkpLGk9TWF0aC5tYXgoaSxuLmRpc3RhbmNlVG9TcXVhcmVkKHYxdCkpfXRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzPU1hdGguc3FydChpKSxpc05hTih0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cykmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBDb21wdXRlZCByYWRpdXMgaXMgTmFOLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLHRoaXMpfX1jb21wdXRlRmFjZU5vcm1hbHMoKXt9Y29tcHV0ZVRhbmdlbnRzKCl7Y29uc3QgdD10aGlzLmluZGV4LGU9dGhpcy5hdHRyaWJ1dGVzO2lmKG51bGw9PT10fHx2b2lkIDA9PT1lLnBvc2l0aW9ufHx2b2lkIDA9PT1lLm5vcm1hbHx8dm9pZCAwPT09ZS51dilyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGZhaWxlZC4gTWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzIChpbmRleCwgcG9zaXRpb24sIG5vcm1hbCBvciB1dikiKTtjb25zdCBuPXQuYXJyYXksaT1lLnBvc2l0aW9uLmFycmF5LHI9ZS5ub3JtYWwuYXJyYXksbz1lLnV2LmFycmF5LGE9aS5sZW5ndGgvMzt2b2lkIDA9PT1lLnRhbmdlbnQmJnRoaXMuc2V0QXR0cmlidXRlKCJ0YW5nZW50IixuZXcgUVF0KG5ldyBGbG9hdDMyQXJyYXkoNCphKSw0KSk7Y29uc3Qgcz1lLnRhbmdlbnQuYXJyYXksbD1bXSxjPVtdO2ZvcihsZXQgdD0wO3Q8YTt0KyspbFt0XT1uZXcgQ0p0LGNbdF09bmV3IENKdDtjb25zdCB1PW5ldyBDSnQsaD1uZXcgQ0p0LGQ9bmV3IENKdCxwPW5ldyBtSnQsZj1uZXcgbUp0LG09bmV3IG1KdCxnPW5ldyBDSnQsXz1uZXcgQ0p0O2Z1bmN0aW9uIHkodCxlLG4pe3UuZnJvbUFycmF5KGksMyp0KSxoLmZyb21BcnJheShpLDMqZSksZC5mcm9tQXJyYXkoaSwzKm4pLHAuZnJvbUFycmF5KG8sMip0KSxmLmZyb21BcnJheShvLDIqZSksbS5mcm9tQXJyYXkobywyKm4pLGguc3ViKHUpLGQuc3ViKHUpLGYuc3ViKHApLG0uc3ViKHApO2NvbnN0IHI9MS8oZi54Km0ueS1tLngqZi55KTtpc0Zpbml0ZShyKSYmKGcuY29weShoKS5tdWx0aXBseVNjYWxhcihtLnkpLmFkZFNjYWxlZFZlY3RvcihkLC1mLnkpLm11bHRpcGx5U2NhbGFyKHIpLF8uY29weShkKS5tdWx0aXBseVNjYWxhcihmLngpLmFkZFNjYWxlZFZlY3RvcihoLC1tLngpLm11bHRpcGx5U2NhbGFyKHIpLGxbdF0uYWRkKGcpLGxbZV0uYWRkKGcpLGxbbl0uYWRkKGcpLGNbdF0uYWRkKF8pLGNbZV0uYWRkKF8pLGNbbl0uYWRkKF8pKX1sZXQgdj10aGlzLmdyb3VwczswPT09di5sZW5ndGgmJih2PVt7c3RhcnQ6MCxjb3VudDpuLmxlbmd0aH1dKTtmb3IobGV0IHQ9MCxlPXYubGVuZ3RoO3Q8ZTsrK3Qpe2NvbnN0IGU9dlt0XSxpPWUuc3RhcnQ7Zm9yKGxldCB0PWkscj1pK2UuY291bnQ7dDxyO3QrPTMpeShuW3QrMF0sblt0KzFdLG5bdCsyXSl9Y29uc3QgYj1uZXcgQ0p0LHg9bmV3IENKdCx3PW5ldyBDSnQsUz1uZXcgQ0p0O2Z1bmN0aW9uIE0odCl7dy5mcm9tQXJyYXkociwzKnQpLFMuY29weSh3KTtjb25zdCBlPWxbdF07Yi5jb3B5KGUpLGIuc3ViKHcubXVsdGlwbHlTY2FsYXIody5kb3QoZSkpKS5ub3JtYWxpemUoKSx4LmNyb3NzVmVjdG9ycyhTLGUpO2NvbnN0IG49eC5kb3QoY1t0XSk8MD8tMToxO3NbNCp0XT1iLngsc1s0KnQrMV09Yi55LHNbNCp0KzJdPWIueixzWzQqdCszXT1ufWZvcihsZXQgdD0wLGU9di5sZW5ndGg7dDxlOysrdCl7Y29uc3QgZT12W3RdLGk9ZS5zdGFydDtmb3IobGV0IHQ9aSxyPWkrZS5jb3VudDt0PHI7dCs9MylNKG5bdCswXSksTShuW3QrMV0pLE0oblt0KzJdKX19Y29tcHV0ZVZlcnRleE5vcm1hbHMoKXtjb25zdCB0PXRoaXMuaW5kZXgsZT10aGlzLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtpZih2b2lkIDAhPT1lKXtsZXQgbj10aGlzLmdldEF0dHJpYnV0ZSgibm9ybWFsIik7aWYodm9pZCAwPT09biluPW5ldyBRUXQobmV3IEZsb2F0MzJBcnJheSgzKmUuY291bnQpLDMpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG4pO2Vsc2UgZm9yKGxldCB0PTAsZT1uLmNvdW50O3Q8ZTt0Kyspbi5zZXRYWVoodCwwLDAsMCk7Y29uc3QgaT1uZXcgQ0p0LHI9bmV3IENKdCxvPW5ldyBDSnQsYT1uZXcgQ0p0LHM9bmV3IENKdCxsPW5ldyBDSnQsYz1uZXcgQ0p0LHU9bmV3IENKdDtpZih0KWZvcihsZXQgaD0wLGQ9dC5jb3VudDtoPGQ7aCs9Myl7Y29uc3QgZD10LmdldFgoaCswKSxwPXQuZ2V0WChoKzEpLGY9dC5nZXRYKGgrMik7aS5mcm9tQnVmZmVyQXR0cmlidXRlKGUsZCksci5mcm9tQnVmZmVyQXR0cmlidXRlKGUscCksby5mcm9tQnVmZmVyQXR0cmlidXRlKGUsZiksYy5zdWJWZWN0b3JzKG8sciksdS5zdWJWZWN0b3JzKGksciksYy5jcm9zcyh1KSxhLmZyb21CdWZmZXJBdHRyaWJ1dGUobixkKSxzLmZyb21CdWZmZXJBdHRyaWJ1dGUobixwKSxsLmZyb21CdWZmZXJBdHRyaWJ1dGUobixmKSxhLmFkZChjKSxzLmFkZChjKSxsLmFkZChjKSxuLnNldFhZWihkLGEueCxhLnksYS56KSxuLnNldFhZWihwLHMueCxzLnkscy56KSxuLnNldFhZWihmLGwueCxsLnksbC56KX1lbHNlIGZvcihsZXQgdD0wLGE9ZS5jb3VudDt0PGE7dCs9MylpLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSx0KzApLHIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHQrMSksby5mcm9tQnVmZmVyQXR0cmlidXRlKGUsdCsyKSxjLnN1YlZlY3RvcnMobyxyKSx1LnN1YlZlY3RvcnMoaSxyKSxjLmNyb3NzKHUpLG4uc2V0WFlaKHQrMCxjLngsYy55LGMueiksbi5zZXRYWVoodCsxLGMueCxjLnksYy56KSxuLnNldFhZWih0KzIsYy54LGMueSxjLnopO3RoaXMubm9ybWFsaXplTm9ybWFscygpLG4ubmVlZHNVcGRhdGU9ITB9fW1lcmdlKHQsZSl7aWYoIXR8fCF0LmlzQnVmZmVyR2VvbWV0cnkpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkJ1ZmZlckdlb21ldHJ5LiIsdCk7dm9pZCAwPT09ZSYmKGU9MCxjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IE92ZXJ3cml0aW5nIG9yaWdpbmFsIGdlb21ldHJ5LCBzdGFydGluZyBhdCBvZmZzZXQ9MC4gVXNlIEJ1ZmZlckdlb21ldHJ5VXRpbHMubWVyZ2VCdWZmZXJHZW9tZXRyaWVzKCkgZm9yIGxvc3NsZXNzIG1lcmdlLiIpKTtjb25zdCBuPXRoaXMuYXR0cmlidXRlcztmb3IoY29uc3QgaSBpbiBuKXtpZih2b2lkIDA9PT10LmF0dHJpYnV0ZXNbaV0pY29udGludWU7Y29uc3Qgcj1uW2ldLmFycmF5LG89dC5hdHRyaWJ1dGVzW2ldLGE9by5hcnJheSxzPW8uaXRlbVNpemUqZSxsPU1hdGgubWluKGEubGVuZ3RoLHIubGVuZ3RoLXMpO2ZvcihsZXQgdD0wLGU9czt0PGw7dCsrLGUrKylyW2VdPWFbdF19cmV0dXJuIHRoaXN9bm9ybWFsaXplTm9ybWFscygpe2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtmb3IobGV0IGU9MCxuPXQuY291bnQ7ZTxuO2UrKyl2MXQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpLHYxdC5ub3JtYWxpemUoKSx0LnNldFhZWihlLHYxdC54LHYxdC55LHYxdC56KX10b05vbkluZGV4ZWQoKXtmdW5jdGlvbiB0KHQsZSl7Y29uc3Qgbj10LmFycmF5LGk9dC5pdGVtU2l6ZSxyPXQubm9ybWFsaXplZCxvPW5ldyBuLmNvbnN0cnVjdG9yKGUubGVuZ3RoKmkpO2xldCBhPTAscz0wO2ZvcihsZXQgcj0wLGw9ZS5sZW5ndGg7cjxsO3IrKyl7YT10LmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU/ZVtyXSp0LmRhdGEuc3RyaWRlK3Qub2Zmc2V0OmVbcl0qaTtmb3IobGV0IHQ9MDt0PGk7dCsrKW9bcysrXT1uW2ErK119cmV0dXJuIG5ldyBRUXQobyxpLHIpfWlmKG51bGw9PT10aGlzLmluZGV4KXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBCdWZmZXJHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLiIpLHRoaXM7Y29uc3QgZT1uZXcgYjF0LG49dGhpcy5pbmRleC5hcnJheSxpPXRoaXMuYXR0cmlidXRlcztmb3IoY29uc3QgciBpbiBpKXtjb25zdCBvPXQoaVtyXSxuKTtlLnNldEF0dHJpYnV0ZShyLG8pfWNvbnN0IHI9dGhpcy5tb3JwaEF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGkgaW4gcil7Y29uc3Qgbz1bXSxhPXJbaV07Zm9yKGxldCBlPTAsaT1hLmxlbmd0aDtlPGk7ZSsrKXtjb25zdCBpPXQoYVtlXSxuKTtvLnB1c2goaSl9ZS5tb3JwaEF0dHJpYnV0ZXNbaV09b31lLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7Y29uc3Qgbz10aGlzLmdyb3Vwcztmb3IobGV0IHQ9MCxuPW8ubGVuZ3RoO3Q8bjt0Kyspe2NvbnN0IG49b1t0XTtlLmFkZEdyb3VwKG4uc3RhcnQsbi5jb3VudCxuLm1hdGVyaWFsSW5kZXgpfXJldHVybiBlfXRvSlNPTigpe2NvbnN0IHQ9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNSx0eXBlOiJCdWZmZXJHZW9tZXRyeSIsZ2VuZXJhdG9yOiJCdWZmZXJHZW9tZXRyeS50b0pTT04ifX07aWYodC51dWlkPXRoaXMudXVpZCx0LnR5cGU9dGhpcy50eXBlLCIiIT09dGhpcy5uYW1lJiYodC5uYW1lPXRoaXMubmFtZSksT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJih0LnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLHZvaWQgMCE9PXRoaXMucGFyYW1ldGVycyl7Y29uc3QgZT10aGlzLnBhcmFtZXRlcnM7Zm9yKGNvbnN0IG4gaW4gZSl2b2lkIDAhPT1lW25dJiYodFtuXT1lW25dKTtyZXR1cm4gdH10LmRhdGE9e2F0dHJpYnV0ZXM6e319O2NvbnN0IGU9dGhpcy5pbmRleDtudWxsIT09ZSYmKHQuZGF0YS5pbmRleD17dHlwZTplLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5hcnJheSl9KTtjb25zdCBuPXRoaXMuYXR0cmlidXRlcztmb3IoY29uc3QgZSBpbiBuKXQuZGF0YS5hdHRyaWJ1dGVzW2VdPW5bZV0udG9KU09OKHQuZGF0YSk7Y29uc3QgaT17fTtsZXQgcj0hMTtmb3IoY29uc3QgZSBpbiB0aGlzLm1vcnBoQXR0cmlidXRlcyl7Y29uc3Qgbj10aGlzLm1vcnBoQXR0cmlidXRlc1tlXSxvPVtdO2ZvcihsZXQgZT0wLGk9bi5sZW5ndGg7ZTxpO2UrKylvLnB1c2gobltlXS50b0pTT04odC5kYXRhKSk7by5sZW5ndGg+MCYmKGlbZV09byxyPSEwKX1yJiYodC5kYXRhLm1vcnBoQXR0cmlidXRlcz1pLHQuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlKTtjb25zdCBvPXRoaXMuZ3JvdXBzO28ubGVuZ3RoPjAmJih0LmRhdGEuZ3JvdXBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobykpKTtjb25zdCBhPXRoaXMuYm91bmRpbmdTcGhlcmU7cmV0dXJuIG51bGwhPT1hJiYodC5kYXRhLmJvdW5kaW5nU3BoZXJlPXtjZW50ZXI6YS5jZW50ZXIudG9BcnJheSgpLHJhZGl1czphLnJhZGl1c30pLHR9Y2xvbmUoKXtyZXR1cm4obmV3IGIxdCkuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMuaW5kZXg9bnVsbCx0aGlzLmF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaEF0dHJpYnV0ZXM9e30sdGhpcy5ncm91cHM9W10sdGhpcy5ib3VuZGluZ0JveD1udWxsLHRoaXMuYm91bmRpbmdTcGhlcmU9bnVsbDtjb25zdCBlPXt9O3RoaXMubmFtZT10Lm5hbWU7Y29uc3Qgbj10LmluZGV4O251bGwhPT1uJiZ0aGlzLnNldEluZGV4KG4uY2xvbmUoZSkpO2NvbnN0IGk9dC5hdHRyaWJ1dGVzO2Zvcihjb25zdCB0IGluIGkpdGhpcy5zZXRBdHRyaWJ1dGUodCxpW3RdLmNsb25lKGUpKTtjb25zdCByPXQubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCB0IGluIHIpe2NvbnN0IG49W10saT1yW3RdO2ZvcihsZXQgdD0wLHI9aS5sZW5ndGg7dDxyO3QrKyluLnB1c2goaVt0XS5jbG9uZShlKSk7dGhpcy5tb3JwaEF0dHJpYnV0ZXNbdF09bn10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPXQubW9ycGhUYXJnZXRzUmVsYXRpdmU7Y29uc3Qgbz10Lmdyb3Vwcztmb3IobGV0IHQ9MCxlPW8ubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9b1t0XTt0aGlzLmFkZEdyb3VwKGUuc3RhcnQsZS5jb3VudCxlLm1hdGVyaWFsSW5kZXgpfWNvbnN0IGE9dC5ib3VuZGluZ0JveDtudWxsIT09YSYmKHRoaXMuYm91bmRpbmdCb3g9YS5jbG9uZSgpKTtjb25zdCBzPXQuYm91bmRpbmdTcGhlcmU7cmV0dXJuIG51bGwhPT1zJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1zLmNsb25lKCkpLHRoaXMuZHJhd1JhbmdlLnN0YXJ0PXQuZHJhd1JhbmdlLnN0YXJ0LHRoaXMuZHJhd1JhbmdlLmNvdW50PXQuZHJhd1JhbmdlLmNvdW50LHRoaXMudXNlckRhdGE9dC51c2VyRGF0YSx0aGlzfWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fWIxdC5wcm90b3R5cGUuaXNCdWZmZXJHZW9tZXRyeT0hMDtjb25zdCB4MXQ9bmV3IHJRdCx3MXQ9bmV3IGlRdCxTMXQ9bmV3ICRKdCxNMXQ9bmV3IENKdCxFMXQ9bmV3IENKdCxUMXQ9bmV3IENKdCxDMXQ9bmV3IENKdCxBMXQ9bmV3IENKdCxrMXQ9bmV3IENKdCxMMXQ9bmV3IENKdCxQMXQ9bmV3IENKdCxOMXQ9bmV3IENKdCxJMXQ9bmV3IG1KdCxSMXQ9bmV3IG1KdCxPMXQ9bmV3IG1KdCx6MXQ9bmV3IENKdCxEMXQ9bmV3IENKdDtjbGFzcyBCMXQgZXh0ZW5kcyBrUXR7Y29uc3RydWN0b3IodD1uZXcgYjF0LGU9bmV3IEtRdCl7c3VwZXIoKSx0aGlzLnR5cGU9Ik1lc2giLHRoaXMuZ2VvbWV0cnk9dCx0aGlzLm1hdGVyaWFsPWUsdGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHZvaWQgMCE9PXQubW9ycGhUYXJnZXRJbmZsdWVuY2VzJiYodGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9dC5tb3JwaFRhcmdldEluZmx1ZW5jZXMuc2xpY2UoKSksdm9pZCAwIT09dC5tb3JwaFRhcmdldERpY3Rpb25hcnkmJih0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT1PYmplY3QuYXNzaWduKHt9LHQubW9ycGhUYXJnZXREaWN0aW9uYXJ5KSksdGhpcy5tYXRlcmlhbD10Lm1hdGVyaWFsLHRoaXMuZ2VvbWV0cnk9dC5nZW9tZXRyeSx0aGlzfXVwZGF0ZU1vcnBoVGFyZ2V0cygpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeTtpZih0LmlzQnVmZmVyR2VvbWV0cnkpe2NvbnN0IGU9dC5tb3JwaEF0dHJpYnV0ZXMsbj1PYmplY3Qua2V5cyhlKTtpZihuLmxlbmd0aD4wKXtjb25zdCB0PWVbblswXV07aWYodm9pZCAwIT09dCl7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9W10sdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9e307Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXtjb25zdCBuPXRbZV0ubmFtZXx8U3RyaW5nKGUpO3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goMCksdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbbl09ZX19fX1lbHNle2NvbnN0IGU9dC5tb3JwaFRhcmdldHM7dm9pZCAwIT09ZSYmZS5sZW5ndGg+MCYmY29uc29sZS5lcnJvcigiVEhSRUUuTWVzaC51cGRhdGVNb3JwaFRhcmdldHMoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpfX1yYXljYXN0KHQsZSl7Y29uc3Qgbj10aGlzLmdlb21ldHJ5LGk9dGhpcy5tYXRlcmlhbCxyPXRoaXMubWF0cml4V29ybGQ7aWYodm9pZCAwPT09aSlyZXR1cm47aWYobnVsbD09PW4uYm91bmRpbmdTcGhlcmUmJm4uY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksUzF0LmNvcHkobi5ib3VuZGluZ1NwaGVyZSksUzF0LmFwcGx5TWF0cml4NChyKSwhMT09PXQucmF5LmludGVyc2VjdHNTcGhlcmUoUzF0KSlyZXR1cm47aWYoeDF0LmNvcHkocikuaW52ZXJ0KCksdzF0LmNvcHkodC5yYXkpLmFwcGx5TWF0cml4NCh4MXQpLG51bGwhPT1uLmJvdW5kaW5nQm94JiYhMT09PXcxdC5pbnRlcnNlY3RzQm94KG4uYm91bmRpbmdCb3gpKXJldHVybjtsZXQgbztpZihuLmlzQnVmZmVyR2VvbWV0cnkpe2NvbnN0IHI9bi5pbmRleCxhPW4uYXR0cmlidXRlcy5wb3NpdGlvbixzPW4ubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLGw9bi5tb3JwaFRhcmdldHNSZWxhdGl2ZSxjPW4uYXR0cmlidXRlcy51dix1PW4uYXR0cmlidXRlcy51djIsaD1uLmdyb3VwcyxkPW4uZHJhd1JhbmdlO2lmKG51bGwhPT1yKWlmKEFycmF5LmlzQXJyYXkoaSkpZm9yKGxldCBuPTAscD1oLmxlbmd0aDtuPHA7bisrKXtjb25zdCBwPWhbbl0sZj1pW3AubWF0ZXJpYWxJbmRleF07Zm9yKGxldCBuPU1hdGgubWF4KHAuc3RhcnQsZC5zdGFydCksaT1NYXRoLm1pbihwLnN0YXJ0K3AuY291bnQsZC5zdGFydCtkLmNvdW50KTtuPGk7bis9Myl7Y29uc3QgaT1yLmdldFgobiksaD1yLmdldFgobisxKSxkPXIuZ2V0WChuKzIpO289SDF0KHRoaXMsZix0LHcxdCxhLHMsbCxjLHUsaSxoLGQpLG8mJihvLmZhY2VJbmRleD1NYXRoLmZsb29yKG4vMyksby5mYWNlLm1hdGVyaWFsSW5kZXg9cC5tYXRlcmlhbEluZGV4LGUucHVzaChvKSl9fWVsc2UgZm9yKGxldCBuPU1hdGgubWF4KDAsZC5zdGFydCksaD1NYXRoLm1pbihyLmNvdW50LGQuc3RhcnQrZC5jb3VudCk7bjxoO24rPTMpe2NvbnN0IGg9ci5nZXRYKG4pLGQ9ci5nZXRYKG4rMSkscD1yLmdldFgobisyKTtvPUgxdCh0aGlzLGksdCx3MXQsYSxzLGwsYyx1LGgsZCxwKSxvJiYoby5mYWNlSW5kZXg9TWF0aC5mbG9vcihuLzMpLGUucHVzaChvKSl9ZWxzZSBpZih2b2lkIDAhPT1hKWlmKEFycmF5LmlzQXJyYXkoaSkpZm9yKGxldCBuPTAscj1oLmxlbmd0aDtuPHI7bisrKXtjb25zdCByPWhbbl0scD1pW3IubWF0ZXJpYWxJbmRleF07Zm9yKGxldCBuPU1hdGgubWF4KHIuc3RhcnQsZC5zdGFydCksaT1NYXRoLm1pbihyLnN0YXJ0K3IuY291bnQsZC5zdGFydCtkLmNvdW50KTtuPGk7bis9MylvPUgxdCh0aGlzLHAsdCx3MXQsYSxzLGwsYyx1LG4sbisxLG4rMiksbyYmKG8uZmFjZUluZGV4PU1hdGguZmxvb3Iobi8zKSxvLmZhY2UubWF0ZXJpYWxJbmRleD1yLm1hdGVyaWFsSW5kZXgsZS5wdXNoKG8pKX1lbHNlIGZvcihsZXQgbj1NYXRoLm1heCgwLGQuc3RhcnQpLHI9TWF0aC5taW4oYS5jb3VudCxkLnN0YXJ0K2QuY291bnQpO248cjtuKz0zKW89SDF0KHRoaXMsaSx0LHcxdCxhLHMsbCxjLHUsbixuKzEsbisyKSxvJiYoby5mYWNlSW5kZXg9TWF0aC5mbG9vcihuLzMpLGUucHVzaChvKSl9ZWxzZSBuLmlzR2VvbWV0cnkmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1lc2gucmF5Y2FzdCgpIG5vIGxvbmdlciBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIil9fWZ1bmN0aW9uIEgxdCh0LGUsbixpLHIsbyxhLHMsbCxjLHUsaCl7TTF0LmZyb21CdWZmZXJBdHRyaWJ1dGUocixjKSxFMXQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLHUpLFQxdC5mcm9tQnVmZmVyQXR0cmlidXRlKHIsaCk7Y29uc3QgZD10Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztpZihvJiZkKXtMMXQuc2V0KDAsMCwwKSxQMXQuc2V0KDAsMCwwKSxOMXQuc2V0KDAsMCwwKTtmb3IobGV0IHQ9MCxlPW8ubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9ZFt0XSxuPW9bdF07MCE9PWUmJihDMXQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLGMpLEExdC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sdSksazF0LmZyb21CdWZmZXJBdHRyaWJ1dGUobixoKSxhPyhMMXQuYWRkU2NhbGVkVmVjdG9yKEMxdCxlKSxQMXQuYWRkU2NhbGVkVmVjdG9yKEExdCxlKSxOMXQuYWRkU2NhbGVkVmVjdG9yKGsxdCxlKSk6KEwxdC5hZGRTY2FsZWRWZWN0b3IoQzF0LnN1YihNMXQpLGUpLFAxdC5hZGRTY2FsZWRWZWN0b3IoQTF0LnN1YihFMXQpLGUpLE4xdC5hZGRTY2FsZWRWZWN0b3IoazF0LnN1YihUMXQpLGUpKSl9TTF0LmFkZChMMXQpLEUxdC5hZGQoUDF0KSxUMXQuYWRkKE4xdCl9dC5pc1NraW5uZWRNZXNoJiYodC5ib25lVHJhbnNmb3JtKGMsTTF0KSx0LmJvbmVUcmFuc2Zvcm0odSxFMXQpLHQuYm9uZVRyYW5zZm9ybShoLFQxdCkpO2NvbnN0IHA9KGZ1bmN0aW9uIGYodCxlLG4saSxyLG8sYSxzKXtsZXQgbDtpZihsPTE9PT1lLnNpZGU/aS5pbnRlcnNlY3RUcmlhbmdsZShhLG8sciwhMCxzKTppLmludGVyc2VjdFRyaWFuZ2xlKHIsbyxhLDIhPT1lLnNpZGUscyksbnVsbD09PWwpcmV0dXJuIG51bGw7RDF0LmNvcHkocyksRDF0LmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKTtjb25zdCBjPW4ucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKEQxdCk7cmV0dXJuIGM8bi5uZWFyfHxjPm4uZmFyP251bGw6e2Rpc3RhbmNlOmMscG9pbnQ6RDF0LmNsb25lKCksb2JqZWN0OnR9fSkodCxlLG4saSxNMXQsRTF0LFQxdCx6MXQpO2lmKHApe3MmJihJMXQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLGMpLFIxdC5mcm9tQnVmZmVyQXR0cmlidXRlKHMsdSksTzF0LmZyb21CdWZmZXJBdHRyaWJ1dGUocyxoKSxwLnV2PUZRdC5nZXRVVih6MXQsTTF0LEUxdCxUMXQsSTF0LFIxdCxPMXQsbmV3IG1KdCkpLGwmJihJMXQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShsLGMpLFIxdC5mcm9tQnVmZmVyQXR0cmlidXRlKGwsdSksTzF0LmZyb21CdWZmZXJBdHRyaWJ1dGUobCxoKSxwLnV2Mj1GUXQuZ2V0VVYoejF0LE0xdCxFMXQsVDF0LEkxdCxSMXQsTzF0LG5ldyBtSnQpKTtjb25zdCB0PXthOmMsYjp1LGM6aCxub3JtYWw6bmV3IENKdCxtYXRlcmlhbEluZGV4OjB9O0ZRdC5nZXROb3JtYWwoTTF0LEUxdCxUMXQsdC5ub3JtYWwpLHAuZmFjZT10fXJldHVybiBwfUIxdC5wcm90b3R5cGUuaXNNZXNoPSEwO2NsYXNzIEYxdCBleHRlbmRzIGIxdHtjb25zdHJ1Y3Rvcih0PTEsZT0xLG49MSxpPTEscj0xLG89MSl7c3VwZXIoKSx0aGlzLnR5cGU9IkJveEdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOnQsaGVpZ2h0OmUsZGVwdGg6bix3aWR0aFNlZ21lbnRzOmksaGVpZ2h0U2VnbWVudHM6cixkZXB0aFNlZ21lbnRzOm99O2NvbnN0IGE9dGhpcztpPU1hdGguZmxvb3IoaSkscj1NYXRoLmZsb29yKHIpLG89TWF0aC5mbG9vcihvKTtjb25zdCBzPVtdLGw9W10sYz1bXSx1PVtdO2xldCBoPTAsZD0wO2Z1bmN0aW9uIHAodCxlLG4saSxyLG8scCxmLG0sZyxfKXtjb25zdCB5PW8vbSx2PXAvZyxiPW8vMix4PXAvMix3PWYvMixTPW0rMSxNPWcrMTtsZXQgRT0wLFQ9MDtjb25zdCBDPW5ldyBDSnQ7Zm9yKGxldCBvPTA7bzxNO28rKyl7Y29uc3QgYT1vKnYteDtmb3IobGV0IHM9MDtzPFM7cysrKUNbdF09KHMqeS1iKSppLENbZV09YSpyLENbbl09dyxsLnB1c2goQy54LEMueSxDLnopLENbdF09MCxDW2VdPTAsQ1tuXT1mPjA/MTotMSxjLnB1c2goQy54LEMueSxDLnopLHUucHVzaChzL20pLHUucHVzaCgxLW8vZyksRSs9MX1mb3IobGV0IHQ9MDt0PGc7dCsrKWZvcihsZXQgZT0wO2U8bTtlKyspe2NvbnN0IG49aCtlK1MqKHQrMSksaT1oKyhlKzEpK1MqKHQrMSkscj1oKyhlKzEpK1MqdDtzLnB1c2goaCtlK1MqdCxuLHIpLHMucHVzaChuLGksciksVCs9Nn1hLmFkZEdyb3VwKGQsVCxfKSxkKz1ULGgrPUV9cCgieiIsInkiLCJ4IiwtMSwtMSxuLGUsdCxvLHIsMCkscCgieiIsInkiLCJ4IiwxLC0xLG4sZSwtdCxvLHIsMSkscCgieCIsInoiLCJ5IiwxLDEsdCxuLGUsaSxvLDIpLHAoIngiLCJ6IiwieSIsMSwtMSx0LG4sLWUsaSxvLDMpLHAoIngiLCJ5IiwieiIsMSwtMSx0LGUsbixpLHIsNCkscCgieCIsInkiLCJ6IiwtMSwtMSx0LGUsLW4saSxyLDUpLHRoaXMuc2V0SW5kZXgocyksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KGwsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBsMXQoYywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgbDF0KHUsMikpfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IEYxdCh0LndpZHRoLHQuaGVpZ2h0LHQuZGVwdGgsdC53aWR0aFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMsdC5kZXB0aFNlZ21lbnRzKX19ZnVuY3Rpb24gVjF0KHQpe2NvbnN0IGU9e307Zm9yKGNvbnN0IG4gaW4gdCl7ZVtuXT17fTtmb3IoY29uc3QgaSBpbiB0W25dKXtjb25zdCByPXRbbl1baV07ZVtuXVtpXT1yJiYoci5pc0NvbG9yfHxyLmlzTWF0cml4M3x8ci5pc01hdHJpeDR8fHIuaXNWZWN0b3IyfHxyLmlzVmVjdG9yM3x8ci5pc1ZlY3RvcjR8fHIuaXNUZXh0dXJlfHxyLmlzUXVhdGVybmlvbik/ci5jbG9uZSgpOkFycmF5LmlzQXJyYXkocik/ci5zbGljZSgpOnJ9fXJldHVybiBlfWZ1bmN0aW9uIFUxdCh0KXtjb25zdCBlPXt9O2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCBpPVYxdCh0W25dKTtmb3IoY29uc3QgdCBpbiBpKWVbdF09aVt0XX1yZXR1cm4gZX1jb25zdCBqMXQ9e2Nsb25lOlYxdCxtZXJnZTpVMXR9O2NsYXNzIEcxdCBleHRlbmRzIFVRdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iU2hhZGVyTWF0ZXJpYWwiLHRoaXMuZGVmaW5lcz17fSx0aGlzLnVuaWZvcm1zPXt9LHRoaXMudmVydGV4U2hhZGVyPSJ2b2lkIG1haW4oKSB7XG5cdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcbn0iLHRoaXMuZnJhZ21lbnRTaGFkZXI9InZvaWQgbWFpbigpIHtcblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggMS4wLCAwLjAsIDAuMCwgMS4wICk7XG59Iix0aGlzLmxpbmV3aWR0aD0xLHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy5mb2c9ITEsdGhpcy5saWdodHM9ITEsdGhpcy5jbGlwcGluZz0hMSx0aGlzLmV4dGVuc2lvbnM9e2Rlcml2YXRpdmVzOiExLGZyYWdEZXB0aDohMSxkcmF3QnVmZmVyczohMSxzaGFkZXJUZXh0dXJlTE9EOiExfSx0aGlzLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM9e2NvbG9yOlsxLDEsMV0sdXY6WzAsMF0sdXYyOlswLDBdfSx0aGlzLmluZGV4MEF0dHJpYnV0ZU5hbWU9dm9pZCAwLHRoaXMudW5pZm9ybXNOZWVkVXBkYXRlPSExLHRoaXMuZ2xzbFZlcnNpb249bnVsbCx2b2lkIDAhPT10JiYodm9pZCAwIT09dC5hdHRyaWJ1dGVzJiZjb25zb2xlLmVycm9yKCJUSFJFRS5TaGFkZXJNYXRlcmlhbDogYXR0cmlidXRlcyBzaG91bGQgbm93IGJlIGRlZmluZWQgaW4gVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKSx0aGlzLnNldFZhbHVlcyh0KSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmZyYWdtZW50U2hhZGVyPXQuZnJhZ21lbnRTaGFkZXIsdGhpcy52ZXJ0ZXhTaGFkZXI9dC52ZXJ0ZXhTaGFkZXIsdGhpcy51bmlmb3Jtcz1WMXQodC51bmlmb3JtcyksdGhpcy5kZWZpbmVzPU9iamVjdC5hc3NpZ24oe30sdC5kZWZpbmVzKSx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLmxpZ2h0cz10LmxpZ2h0cyx0aGlzLmNsaXBwaW5nPXQuY2xpcHBpbmcsdGhpcy5leHRlbnNpb25zPU9iamVjdC5hc3NpZ24oe30sdC5leHRlbnNpb25zKSx0aGlzLmdsc2xWZXJzaW9uPXQuZ2xzbFZlcnNpb24sdGhpc310b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7ZS5nbHNsVmVyc2lvbj10aGlzLmdsc2xWZXJzaW9uLGUudW5pZm9ybXM9e307Zm9yKGNvbnN0IG4gaW4gdGhpcy51bmlmb3Jtcyl7Y29uc3QgaT10aGlzLnVuaWZvcm1zW25dLnZhbHVlO2UudW5pZm9ybXNbbl09aSYmaS5pc1RleHR1cmU/e3R5cGU6InQiLHZhbHVlOmkudG9KU09OKHQpLnV1aWR9OmkmJmkuaXNDb2xvcj97dHlwZToiYyIsdmFsdWU6aS5nZXRIZXgoKX06aSYmaS5pc1ZlY3RvcjI/e3R5cGU6InYyIix2YWx1ZTppLnRvQXJyYXkoKX06aSYmaS5pc1ZlY3RvcjM/e3R5cGU6InYzIix2YWx1ZTppLnRvQXJyYXkoKX06aSYmaS5pc1ZlY3RvcjQ/e3R5cGU6InY0Iix2YWx1ZTppLnRvQXJyYXkoKX06aSYmaS5pc01hdHJpeDM/e3R5cGU6Im0zIix2YWx1ZTppLnRvQXJyYXkoKX06aSYmaS5pc01hdHJpeDQ/e3R5cGU6Im00Iix2YWx1ZTppLnRvQXJyYXkoKX06e3ZhbHVlOml9fU9iamVjdC5rZXlzKHRoaXMuZGVmaW5lcykubGVuZ3RoPjAmJihlLmRlZmluZXM9dGhpcy5kZWZpbmVzKSxlLnZlcnRleFNoYWRlcj10aGlzLnZlcnRleFNoYWRlcixlLmZyYWdtZW50U2hhZGVyPXRoaXMuZnJhZ21lbnRTaGFkZXI7Y29uc3Qgbj17fTtmb3IoY29uc3QgdCBpbiB0aGlzLmV4dGVuc2lvbnMpITA9PT10aGlzLmV4dGVuc2lvbnNbdF0mJihuW3RdPSEwKTtyZXR1cm4gT2JqZWN0LmtleXMobikubGVuZ3RoPjAmJihlLmV4dGVuc2lvbnM9biksZX19RzF0LnByb3RvdHlwZS5pc1NoYWRlck1hdGVyaWFsPSEwO2NsYXNzIFcxdCBleHRlbmRzIGtRdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy50eXBlPSJDYW1lcmEiLHRoaXMubWF0cml4V29ybGRJbnZlcnNlPW5ldyByUXQsdGhpcy5wcm9qZWN0aW9uTWF0cml4PW5ldyByUXQsdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZT1uZXcgclF0fWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkodC5tYXRyaXhXb3JsZEludmVyc2UpLHRoaXMucHJvamVjdGlvbk1hdHJpeC5jb3B5KHQucHJvamVjdGlvbk1hdHJpeCksdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHQucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLHRoaXN9Z2V0V29ybGREaXJlY3Rpb24odCl7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSk7Y29uc3QgZT10aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO3JldHVybiB0LnNldCgtZVs4XSwtZVs5XSwtZVsxMF0pLm5vcm1hbGl6ZSgpfXVwZGF0ZU1hdHJpeFdvcmxkKHQpe3N1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKHQpLHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCl9dXBkYXRlV29ybGRNYXRyaXgodCxlKXtzdXBlci51cGRhdGVXb3JsZE1hdHJpeCh0LGUpLHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCl9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fVcxdC5wcm90b3R5cGUuaXNDYW1lcmE9ITA7Y2xhc3MgcTF0IGV4dGVuZHMgVzF0e2NvbnN0cnVjdG9yKHQ9NTAsZT0xLG49LjEsaT0yZTMpe3N1cGVyKCksdGhpcy50eXBlPSJQZXJzcGVjdGl2ZUNhbWVyYSIsdGhpcy5mb3Y9dCx0aGlzLnpvb209MSx0aGlzLm5lYXI9bix0aGlzLmZhcj1pLHRoaXMuZm9jdXM9MTAsdGhpcy5hc3BlY3Q9ZSx0aGlzLnZpZXc9bnVsbCx0aGlzLmZpbG1HYXVnZT0zNSx0aGlzLmZpbG1PZmZzZXQ9MCx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0aGlzLmZvdj10LmZvdix0aGlzLnpvb209dC56b29tLHRoaXMubmVhcj10Lm5lYXIsdGhpcy5mYXI9dC5mYXIsdGhpcy5mb2N1cz10LmZvY3VzLHRoaXMuYXNwZWN0PXQuYXNwZWN0LHRoaXMudmlldz1udWxsPT09dC52aWV3P251bGw6T2JqZWN0LmFzc2lnbih7fSx0LnZpZXcpLHRoaXMuZmlsbUdhdWdlPXQuZmlsbUdhdWdlLHRoaXMuZmlsbU9mZnNldD10LmZpbG1PZmZzZXQsdGhpc31zZXRGb2NhbExlbmd0aCh0KXtjb25zdCBlPS41KnRoaXMuZ2V0RmlsbUhlaWdodCgpL3Q7dGhpcy5mb3Y9MipZWnQqTWF0aC5hdGFuKGUpLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfWdldEZvY2FsTGVuZ3RoKCl7Y29uc3QgdD1NYXRoLnRhbiguNSpxWnQqdGhpcy5mb3YpO3JldHVybi41KnRoaXMuZ2V0RmlsbUhlaWdodCgpL3R9Z2V0RWZmZWN0aXZlRk9WKCl7cmV0dXJuIDIqWVp0Kk1hdGguYXRhbihNYXRoLnRhbiguNSpxWnQqdGhpcy5mb3YpL3RoaXMuem9vbSl9Z2V0RmlsbVdpZHRoKCl7cmV0dXJuIHRoaXMuZmlsbUdhdWdlKk1hdGgubWluKHRoaXMuYXNwZWN0LDEpfWdldEZpbG1IZWlnaHQoKXtyZXR1cm4gdGhpcy5maWxtR2F1Z2UvTWF0aC5tYXgodGhpcy5hc3BlY3QsMSl9c2V0Vmlld09mZnNldCh0LGUsbixpLHIsbyl7dGhpcy5hc3BlY3Q9dC9lLG51bGw9PT10aGlzLnZpZXcmJih0aGlzLnZpZXc9e2VuYWJsZWQ6ITAsZnVsbFdpZHRoOjEsZnVsbEhlaWdodDoxLG9mZnNldFg6MCxvZmZzZXRZOjAsd2lkdGg6MSxoZWlnaHQ6MX0pLHRoaXMudmlldy5lbmFibGVkPSEwLHRoaXMudmlldy5mdWxsV2lkdGg9dCx0aGlzLnZpZXcuZnVsbEhlaWdodD1lLHRoaXMudmlldy5vZmZzZXRYPW4sdGhpcy52aWV3Lm9mZnNldFk9aSx0aGlzLnZpZXcud2lkdGg9cix0aGlzLnZpZXcuaGVpZ2h0PW8sdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Y2xlYXJWaWV3T2Zmc2V0KCl7bnVsbCE9PXRoaXMudmlldyYmKHRoaXMudmlldy5lbmFibGVkPSExKSx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX11cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl7Y29uc3QgdD10aGlzLm5lYXI7bGV0IGU9dCpNYXRoLnRhbiguNSpxWnQqdGhpcy5mb3YpL3RoaXMuem9vbSxuPTIqZSxpPXRoaXMuYXNwZWN0Km4scj0tLjUqaTtjb25zdCBvPXRoaXMudmlldztpZihudWxsIT09dGhpcy52aWV3JiZ0aGlzLnZpZXcuZW5hYmxlZCl7Y29uc3QgdD1vLmZ1bGxXaWR0aCxhPW8uZnVsbEhlaWdodDtyKz1vLm9mZnNldFgqaS90LGUtPW8ub2Zmc2V0WSpuL2EsaSo9by53aWR0aC90LG4qPW8uaGVpZ2h0L2F9Y29uc3QgYT10aGlzLmZpbG1PZmZzZXQ7MCE9PWEmJihyKz10KmEvdGhpcy5nZXRGaWxtV2lkdGgoKSksdGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZShyLHIraSxlLGUtbix0LHRoaXMuZmFyKSx0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5wcm9qZWN0aW9uTWF0cml4KS5pbnZlcnQoKX10b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUub2JqZWN0LmZvdj10aGlzLmZvdixlLm9iamVjdC56b29tPXRoaXMuem9vbSxlLm9iamVjdC5uZWFyPXRoaXMubmVhcixlLm9iamVjdC5mYXI9dGhpcy5mYXIsZS5vYmplY3QuZm9jdXM9dGhpcy5mb2N1cyxlLm9iamVjdC5hc3BlY3Q9dGhpcy5hc3BlY3QsbnVsbCE9PXRoaXMudmlldyYmKGUub2JqZWN0LnZpZXc9T2JqZWN0LmFzc2lnbih7fSx0aGlzLnZpZXcpKSxlLm9iamVjdC5maWxtR2F1Z2U9dGhpcy5maWxtR2F1Z2UsZS5vYmplY3QuZmlsbU9mZnNldD10aGlzLmZpbG1PZmZzZXQsZX19cTF0LnByb3RvdHlwZS5pc1BlcnNwZWN0aXZlQ2FtZXJhPSEwO2NvbnN0IFkxdD05MDtjbGFzcyBYMXQgZXh0ZW5kcyBrUXR7Y29uc3RydWN0b3IodCxlLG4pe2lmKHN1cGVyKCksdGhpcy50eXBlPSJDdWJlQ2FtZXJhIiwhMCE9PW4uaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuQ3ViZUNhbWVyYTogVGhlIGNvbnN0cnVjdG9yIG5vdyBleHBlY3RzIGFuIGluc3RhbmNlIG9mIFdlYkdMQ3ViZVJlbmRlclRhcmdldCBhcyB0aGlyZCBwYXJhbWV0ZXIuIik7dGhpcy5yZW5kZXJUYXJnZXQ9bjtjb25zdCBpPW5ldyBxMXQoWTF0LDEsdCxlKTtpLmxheWVycz10aGlzLmxheWVycyxpLnVwLnNldCgwLC0xLDApLGkubG9va0F0KG5ldyBDSnQoMSwwLDApKSx0aGlzLmFkZChpKTtjb25zdCByPW5ldyBxMXQoWTF0LDEsdCxlKTtyLmxheWVycz10aGlzLmxheWVycyxyLnVwLnNldCgwLC0xLDApLHIubG9va0F0KG5ldyBDSnQoLTEsMCwwKSksdGhpcy5hZGQocik7Y29uc3Qgbz1uZXcgcTF0KFkxdCwxLHQsZSk7by5sYXllcnM9dGhpcy5sYXllcnMsby51cC5zZXQoMCwwLDEpLG8ubG9va0F0KG5ldyBDSnQoMCwxLDApKSx0aGlzLmFkZChvKTtjb25zdCBhPW5ldyBxMXQoWTF0LDEsdCxlKTthLmxheWVycz10aGlzLmxheWVycyxhLnVwLnNldCgwLDAsLTEpLGEubG9va0F0KG5ldyBDSnQoMCwtMSwwKSksdGhpcy5hZGQoYSk7Y29uc3Qgcz1uZXcgcTF0KFkxdCwxLHQsZSk7cy5sYXllcnM9dGhpcy5sYXllcnMscy51cC5zZXQoMCwtMSwwKSxzLmxvb2tBdChuZXcgQ0p0KDAsMCwxKSksdGhpcy5hZGQocyk7Y29uc3QgbD1uZXcgcTF0KFkxdCwxLHQsZSk7bC5sYXllcnM9dGhpcy5sYXllcnMsbC51cC5zZXQoMCwtMSwwKSxsLmxvb2tBdChuZXcgQ0p0KDAsMCwtMSkpLHRoaXMuYWRkKGwpfXVwZGF0ZSh0LGUpe251bGw9PT10aGlzLnBhcmVudCYmdGhpcy51cGRhdGVNYXRyaXhXb3JsZCgpO2NvbnN0IG49dGhpcy5yZW5kZXJUYXJnZXQsW2kscixvLGEscyxsXT10aGlzLmNoaWxkcmVuLGM9dC54ci5lbmFibGVkLHU9dC5nZXRSZW5kZXJUYXJnZXQoKTt0LnhyLmVuYWJsZWQ9ITE7Y29uc3QgaD1uLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzO24udGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9ITEsdC5zZXRSZW5kZXJUYXJnZXQobiwwKSx0LnJlbmRlcihlLGkpLHQuc2V0UmVuZGVyVGFyZ2V0KG4sMSksdC5yZW5kZXIoZSxyKSx0LnNldFJlbmRlclRhcmdldChuLDIpLHQucmVuZGVyKGUsbyksdC5zZXRSZW5kZXJUYXJnZXQobiwzKSx0LnJlbmRlcihlLGEpLHQuc2V0UmVuZGVyVGFyZ2V0KG4sNCksdC5yZW5kZXIoZSxzKSxuLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPWgsdC5zZXRSZW5kZXJUYXJnZXQobiw1KSx0LnJlbmRlcihlLGwpLHQuc2V0UmVuZGVyVGFyZ2V0KHUpLHQueHIuZW5hYmxlZD1jfX1jbGFzcyAkMXQgZXh0ZW5kcyBiSnR7Y29uc3RydWN0b3IodCxlLG4saSxyLG8sYSxzLGwsYyl7c3VwZXIodD12b2lkIDAhPT10P3Q6W10sZT12b2lkIDAhPT1lP2U6akt0LG4saSxyLG8sYT12b2lkIDAhPT1hP2E6dVp0LHMsbCxjKSx0aGlzLmZsaXBZPSExfWdldCBpbWFnZXMoKXtyZXR1cm4gdGhpcy5pbWFnZX1zZXQgaW1hZ2VzKHQpe3RoaXMuaW1hZ2U9dH19JDF0LnByb3RvdHlwZS5pc0N1YmVUZXh0dXJlPSEwO2NsYXNzIEsxdCBleHRlbmRzIFNKdHtjb25zdHJ1Y3Rvcih0LGUsbil7TnVtYmVyLmlzSW50ZWdlcihlKSYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xDdWJlUmVuZGVyVGFyZ2V0OiBjb25zdHJ1Y3RvciBzaWduYXR1cmUgaXMgbm93IFdlYkdMQ3ViZVJlbmRlclRhcmdldCggc2l6ZSwgb3B0aW9ucyApIiksZT1uKSxzdXBlcih0LHQsZSksdGhpcy50ZXh0dXJlPW5ldyAkMXQodm9pZCAwLChlPWV8fHt9KS5tYXBwaW5nLGUud3JhcFMsZS53cmFwVCxlLm1hZ0ZpbHRlcixlLm1pbkZpbHRlcixlLmZvcm1hdCxlLnR5cGUsZS5hbmlzb3Ryb3B5LGUuZW5jb2RpbmcpLHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITAsdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz12b2lkIDAhPT1lLmdlbmVyYXRlTWlwbWFwcyYmZS5nZW5lcmF0ZU1pcG1hcHMsdGhpcy50ZXh0dXJlLm1pbkZpbHRlcj12b2lkIDAhPT1lLm1pbkZpbHRlcj9lLm1pbkZpbHRlcjplWnQsdGhpcy50ZXh0dXJlLl9uZWVkc0ZsaXBFbnZNYXA9ITF9ZnJvbUVxdWlyZWN0YW5ndWxhclRleHR1cmUodCxlKXt0aGlzLnRleHR1cmUudHlwZT1lLnR5cGUsdGhpcy50ZXh0dXJlLmZvcm1hdD1oWnQsdGhpcy50ZXh0dXJlLmVuY29kaW5nPWUuZW5jb2RpbmcsdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz1lLmdlbmVyYXRlTWlwbWFwcyx0aGlzLnRleHR1cmUubWluRmlsdGVyPWUubWluRmlsdGVyLHRoaXMudGV4dHVyZS5tYWdGaWx0ZXI9ZS5tYWdGaWx0ZXI7Y29uc3Qgbj1uZXcgRjF0KDUsNSw1KSxpPW5ldyBHMXQoe25hbWU6IkN1YmVtYXBGcm9tRXF1aXJlY3QiLHVuaWZvcm1zOlYxdCh7dEVxdWlyZWN0Ont2YWx1ZTpudWxsfX0pLHZlcnRleFNoYWRlcjoiXG5cblx0XHRcdFx0dmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcblxuXHRcdFx0XHR2ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIG5vcm1hbGl6ZSggKCBtYXRyaXggKiB2ZWM0KCBkaXIsIDAuMCApICkueHl6ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZvaWQgbWFpbigpIHtcblxuXHRcdFx0XHRcdHZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cblx0XHRcdFx0XHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHRcdFx0XHRcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblxuXHRcdFx0XHR9XG5cdFx0XHQiLGZyYWdtZW50U2hhZGVyOiJcblxuXHRcdFx0XHR1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7XG5cblx0XHRcdFx0dmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcblxuXHRcdFx0XHQjaW5jbHVkZSA8Y29tbW9uPlxuXG5cdFx0XHRcdHZvaWQgbWFpbigpIHtcblxuXHRcdFx0XHRcdHZlYzMgZGlyZWN0aW9uID0gbm9ybWFsaXplKCB2V29ybGREaXJlY3Rpb24gKTtcblxuXHRcdFx0XHRcdHZlYzIgc2FtcGxlVVYgPSBlcXVpcmVjdFV2KCBkaXJlY3Rpb24gKTtcblxuXHRcdFx0XHRcdGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCggdEVxdWlyZWN0LCBzYW1wbGVVViApO1xuXG5cdFx0XHRcdH1cblx0XHRcdCIsc2lkZToxLGJsZW5kaW5nOjB9KTtpLnVuaWZvcm1zLnRFcXVpcmVjdC52YWx1ZT1lO2NvbnN0IHI9bmV3IEIxdChuLGkpLG89ZS5taW5GaWx0ZXI7cmV0dXJuIGUubWluRmlsdGVyPT09aVp0JiYoZS5taW5GaWx0ZXI9ZVp0KSxuZXcgWDF0KDEsMTAsdGhpcykudXBkYXRlKHQsciksZS5taW5GaWx0ZXI9byxyLmdlb21ldHJ5LmRpc3Bvc2UoKSxyLm1hdGVyaWFsLmRpc3Bvc2UoKSx0aGlzfWNsZWFyKHQsZSxuLGkpe2NvbnN0IHI9dC5nZXRSZW5kZXJUYXJnZXQoKTtmb3IobGV0IHI9MDtyPDY7cisrKXQuc2V0UmVuZGVyVGFyZ2V0KHRoaXMsciksdC5jbGVhcihlLG4saSk7dC5zZXRSZW5kZXJUYXJnZXQocil9fUsxdC5wcm90b3R5cGUuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQ9ITA7Y29uc3QgWjF0PW5ldyBDSnQsSjF0PW5ldyBDSnQsUTF0PW5ldyBnSnQ7Y2xhc3MgdDB0e2NvbnN0cnVjdG9yKHQ9bmV3IENKdCgxLDAsMCksZT0wKXt0aGlzLm5vcm1hbD10LHRoaXMuY29uc3RhbnQ9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWwuY29weSh0KSx0aGlzLmNvbnN0YW50PWUsdGhpc31zZXRDb21wb25lbnRzKHQsZSxuLGkpe3JldHVybiB0aGlzLm5vcm1hbC5zZXQodCxlLG4pLHRoaXMuY29uc3RhbnQ9aSx0aGlzfXNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodCksdGhpcy5jb25zdGFudD0tZS5kb3QodGhpcy5ub3JtYWwpLHRoaXN9c2V0RnJvbUNvcGxhbmFyUG9pbnRzKHQsZSxuKXtjb25zdCBpPVoxdC5zdWJWZWN0b3JzKG4sZSkuY3Jvc3MoSjF0LnN1YlZlY3RvcnModCxlKSkubm9ybWFsaXplKCk7cmV0dXJuIHRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoaSx0KSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodC5ub3JtYWwpLHRoaXMuY29uc3RhbnQ9dC5jb25zdGFudCx0aGlzfW5vcm1hbGl6ZSgpe2NvbnN0IHQ9MS90aGlzLm5vcm1hbC5sZW5ndGgoKTtyZXR1cm4gdGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIodCksdGhpcy5jb25zdGFudCo9dCx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLmNvbnN0YW50Kj0tMSx0aGlzLm5vcm1hbC5uZWdhdGUoKSx0aGlzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5ub3JtYWwuZG90KHQpK3RoaXMuY29uc3RhbnR9ZGlzdGFuY2VUb1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQodC5jZW50ZXIpLXQucmFkaXVzfXByb2plY3RQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmRpc3RhbmNlVG9Qb2ludCh0KSkuYWRkKHQpfWludGVyc2VjdExpbmUodCxlKXtjb25zdCBuPXQuZGVsdGEoWjF0KSxpPXRoaXMubm9ybWFsLmRvdChuKTtpZigwPT09aSlyZXR1cm4gMD09PXRoaXMuZGlzdGFuY2VUb1BvaW50KHQuc3RhcnQpP2UuY29weSh0LnN0YXJ0KTpudWxsO2NvbnN0IHI9LSh0LnN0YXJ0LmRvdCh0aGlzLm5vcm1hbCkrdGhpcy5jb25zdGFudCkvaTtyZXR1cm4gcjwwfHxyPjE/bnVsbDplLmNvcHkobikubXVsdGlwbHlTY2FsYXIocikuYWRkKHQuc3RhcnQpfWludGVyc2VjdHNMaW5lKHQpe2NvbnN0IGU9dGhpcy5kaXN0YW5jZVRvUG9pbnQodC5zdGFydCksbj10aGlzLmRpc3RhbmNlVG9Qb2ludCh0LmVuZCk7cmV0dXJuIGU8MCYmbj4wfHxuPDAmJmU+MH1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1jb3BsYW5hclBvaW50KHQpe3JldHVybiB0LmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX1hcHBseU1hdHJpeDQodCxlKXtjb25zdCBuPWV8fFExdC5nZXROb3JtYWxNYXRyaXgodCksaT10aGlzLmNvcGxhbmFyUG9pbnQoWjF0KS5hcHBseU1hdHJpeDQodCkscj10aGlzLm5vcm1hbC5hcHBseU1hdHJpeDMobikubm9ybWFsaXplKCk7cmV0dXJuIHRoaXMuY29uc3RhbnQ9LWkuZG90KHIpLHRoaXN9dHJhbnNsYXRlKHQpe3JldHVybiB0aGlzLmNvbnN0YW50LT10LmRvdCh0aGlzLm5vcm1hbCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQubm9ybWFsLmVxdWFscyh0aGlzLm5vcm1hbCkmJnQuY29uc3RhbnQ9PT10aGlzLmNvbnN0YW50fWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfX10MHQucHJvdG90eXBlLmlzUGxhbmU9ITA7Y29uc3QgZTB0PW5ldyAkSnQsbjB0PW5ldyBDSnQ7Y2xhc3MgaTB0e2NvbnN0cnVjdG9yKHQ9bmV3IHQwdCxlPW5ldyB0MHQsbj1uZXcgdDB0LGk9bmV3IHQwdCxyPW5ldyB0MHQsbz1uZXcgdDB0KXt0aGlzLnBsYW5lcz1bdCxlLG4saSxyLG9dfXNldCh0LGUsbixpLHIsbyl7Y29uc3QgYT10aGlzLnBsYW5lcztyZXR1cm4gYVswXS5jb3B5KHQpLGFbMV0uY29weShlKSxhWzJdLmNvcHkobiksYVszXS5jb3B5KGkpLGFbNF0uY29weShyKSxhWzVdLmNvcHkobyksdGhpc31jb3B5KHQpe2NvbnN0IGU9dGhpcy5wbGFuZXM7Zm9yKGxldCBuPTA7bjw2O24rKyllW25dLmNvcHkodC5wbGFuZXNbbl0pO3JldHVybiB0aGlzfXNldEZyb21Qcm9qZWN0aW9uTWF0cml4KHQpe2NvbnN0IGU9dGhpcy5wbGFuZXMsbj10LmVsZW1lbnRzLGk9blswXSxyPW5bMV0sbz1uWzJdLGE9blszXSxzPW5bNF0sbD1uWzVdLGM9bls2XSx1PW5bN10saD1uWzhdLGQ9bls5XSxwPW5bMTBdLGY9blsxMV0sbT1uWzEyXSxnPW5bMTNdLF89blsxNF0seT1uWzE1XTtyZXR1cm4gZVswXS5zZXRDb21wb25lbnRzKGEtaSx1LXMsZi1oLHktbSkubm9ybWFsaXplKCksZVsxXS5zZXRDb21wb25lbnRzKGEraSx1K3MsZitoLHkrbSkubm9ybWFsaXplKCksZVsyXS5zZXRDb21wb25lbnRzKGErcix1K2wsZitkLHkrZykubm9ybWFsaXplKCksZVszXS5zZXRDb21wb25lbnRzKGEtcix1LWwsZi1kLHktZykubm9ybWFsaXplKCksZVs0XS5zZXRDb21wb25lbnRzKGEtbyx1LWMsZi1wLHktXykubm9ybWFsaXplKCksZVs1XS5zZXRDb21wb25lbnRzKGErbyx1K2MsZitwLHkrXykubm9ybWFsaXplKCksdGhpc31pbnRlcnNlY3RzT2JqZWN0KHQpe2NvbnN0IGU9dC5nZW9tZXRyeTtyZXR1cm4gbnVsbD09PWUuYm91bmRpbmdTcGhlcmUmJmUuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksZTB0LmNvcHkoZS5ib3VuZGluZ1NwaGVyZSkuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMuaW50ZXJzZWN0c1NwaGVyZShlMHQpfWludGVyc2VjdHNTcHJpdGUodCl7cmV0dXJuIGUwdC5jZW50ZXIuc2V0KDAsMCwwKSxlMHQucmFkaXVzPS43MDcxMDY3ODExODY1NDc2LGUwdC5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy5pbnRlcnNlY3RzU3BoZXJlKGUwdCl9aW50ZXJzZWN0c1NwaGVyZSh0KXtjb25zdCBlPXRoaXMucGxhbmVzLG49dC5jZW50ZXIsaT0tdC5yYWRpdXM7Zm9yKGxldCB0PTA7dDw2O3QrKylpZihlW3RdLmRpc3RhbmNlVG9Qb2ludChuKTxpKXJldHVybiExO3JldHVybiEwfWludGVyc2VjdHNCb3godCl7Y29uc3QgZT10aGlzLnBsYW5lcztmb3IobGV0IG49MDtuPDY7bisrKXtjb25zdCBpPWVbbl07aWYobjB0Lng9aS5ub3JtYWwueD4wP3QubWF4Lng6dC5taW4ueCxuMHQueT1pLm5vcm1hbC55PjA/dC5tYXgueTp0Lm1pbi55LG4wdC56PWkubm9ybWFsLno+MD90Lm1heC56OnQubWluLnosaS5kaXN0YW5jZVRvUG9pbnQobjB0KTwwKXJldHVybiExfXJldHVybiEwfWNvbnRhaW5zUG9pbnQodCl7Y29uc3QgZT10aGlzLnBsYW5lcztmb3IobGV0IG49MDtuPDY7bisrKWlmKGVbbl0uZGlzdGFuY2VUb1BvaW50KHQpPDApcmV0dXJuITE7cmV0dXJuITB9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fWZ1bmN0aW9uIHIwdCgpe2xldCB0PW51bGwsZT0hMSxuPW51bGwsaT1udWxsO2Z1bmN0aW9uIHIoZSxvKXtuKGUsbyksaT10LnJlcXVlc3RBbmltYXRpb25GcmFtZShyKX1yZXR1cm57c3RhcnQ6ZnVuY3Rpb24oKXshMCE9PWUmJm51bGwhPT1uJiYoaT10LnJlcXVlc3RBbmltYXRpb25GcmFtZShyKSxlPSEwKX0sc3RvcDpmdW5jdGlvbigpe3QuY2FuY2VsQW5pbWF0aW9uRnJhbWUoaSksZT0hMX0sc2V0QW5pbWF0aW9uTG9vcDpmdW5jdGlvbih0KXtuPXR9LHNldENvbnRleHQ6ZnVuY3Rpb24oZSl7dD1lfX19ZnVuY3Rpb24gbzB0KHQsZSl7Y29uc3Qgbj1lLmlzV2ViR0wyLGk9bmV3IFdlYWtNYXA7cmV0dXJue2dldDpmdW5jdGlvbiByKHQpe3JldHVybiB0LmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJih0PXQuZGF0YSksaS5nZXQodCl9LHJlbW92ZTpmdW5jdGlvbiBvKGUpe2UuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKGU9ZS5kYXRhKTtjb25zdCBuPWkuZ2V0KGUpO24mJih0LmRlbGV0ZUJ1ZmZlcihuLmJ1ZmZlciksaS5kZWxldGUoZSkpfSx1cGRhdGU6ZnVuY3Rpb24gYShlLHIpe2lmKGUuaXNHTEJ1ZmZlckF0dHJpYnV0ZSl7Y29uc3QgdD1pLmdldChlKTtyZXR1cm4gdm9pZCgoIXR8fHQudmVyc2lvbjxlLnZlcnNpb24pJiZpLnNldChlLHtidWZmZXI6ZS5idWZmZXIsdHlwZTplLnR5cGUsYnl0ZXNQZXJFbGVtZW50OmUuZWxlbWVudFNpemUsdmVyc2lvbjplLnZlcnNpb259KSl9ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYoZT1lLmRhdGEpO2NvbnN0IG89aS5nZXQoZSk7dm9pZCAwPT09bz9pLnNldChlLChmdW5jdGlvbiBhKGUsaSl7Y29uc3Qgcj1lLmFycmF5LG89ZS51c2FnZSxhPXQuY3JlYXRlQnVmZmVyKCk7dC5iaW5kQnVmZmVyKGksYSksdC5idWZmZXJEYXRhKGkscixvKSxlLm9uVXBsb2FkQ2FsbGJhY2soKTtsZXQgcz01MTI2O3JldHVybiByIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5P3M9NTEyNjpyIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5P2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xBdHRyaWJ1dGVzOiBVbnN1cHBvcnRlZCBkYXRhIGJ1ZmZlciBmb3JtYXQ6IEZsb2F0NjRBcnJheS4iKTpyIGluc3RhbmNlb2YgVWludDE2QXJyYXk/ZS5pc0Zsb2F0MTZCdWZmZXJBdHRyaWJ1dGU/bj9zPTUxMzE6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTEF0dHJpYnV0ZXM6IFVzYWdlIG9mIEZsb2F0MTZCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgV2ViR0wyLiIpOnM9NTEyMzpyIGluc3RhbmNlb2YgSW50MTZBcnJheT9zPTUxMjI6ciBpbnN0YW5jZW9mIFVpbnQzMkFycmF5P3M9NTEyNTpyIGluc3RhbmNlb2YgSW50MzJBcnJheT9zPTUxMjQ6ciBpbnN0YW5jZW9mIEludDhBcnJheT9zPTUxMjA6KHIgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxyIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkpJiYocz01MTIxKSx7YnVmZmVyOmEsdHlwZTpzLGJ5dGVzUGVyRWxlbWVudDpyLkJZVEVTX1BFUl9FTEVNRU5ULHZlcnNpb246ZS52ZXJzaW9ufX0pKGUscikpOm8udmVyc2lvbjxlLnZlcnNpb24mJigoZnVuY3Rpb24gcyhlLGkscil7Y29uc3Qgbz1pLmFycmF5LGE9aS51cGRhdGVSYW5nZTt0LmJpbmRCdWZmZXIocixlKSwtMT09PWEuY291bnQ/dC5idWZmZXJTdWJEYXRhKHIsMCxvKToobj90LmJ1ZmZlclN1YkRhdGEocixhLm9mZnNldCpvLkJZVEVTX1BFUl9FTEVNRU5ULG8sYS5vZmZzZXQsYS5jb3VudCk6dC5idWZmZXJTdWJEYXRhKHIsYS5vZmZzZXQqby5CWVRFU19QRVJfRUxFTUVOVCxvLnN1YmFycmF5KGEub2Zmc2V0LGEub2Zmc2V0K2EuY291bnQpKSxhLmNvdW50PS0xKX0pKG8uYnVmZmVyLGUsciksby52ZXJzaW9uPWUudmVyc2lvbil9fX1jbGFzcyBhMHQgZXh0ZW5kcyBiMXR7Y29uc3RydWN0b3IodD0xLGU9MSxuPTEsaT0xKXtzdXBlcigpLHRoaXMudHlwZT0iUGxhbmVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXt3aWR0aDp0LGhlaWdodDplLHdpZHRoU2VnbWVudHM6bixoZWlnaHRTZWdtZW50czppfTtjb25zdCByPXQvMixvPWUvMixhPU1hdGguZmxvb3Iobikscz1NYXRoLmZsb29yKGkpLGw9YSsxLGM9cysxLHU9dC9hLGg9ZS9zLGQ9W10scD1bXSxmPVtdLG09W107Zm9yKGxldCB0PTA7dDxjO3QrKyl7Y29uc3QgZT10Kmgtbztmb3IobGV0IG49MDtuPGw7bisrKXAucHVzaChuKnUtciwtZSwwKSxmLnB1c2goMCwwLDEpLG0ucHVzaChuL2EpLG0ucHVzaCgxLXQvcyl9Zm9yKGxldCB0PTA7dDxzO3QrKylmb3IobGV0IGU9MDtlPGE7ZSsrKXtjb25zdCBuPWUrbCoodCsxKSxpPWUrMStsKih0KzEpLHI9ZSsxK2wqdDtkLnB1c2goZStsKnQsbixyKSxkLnB1c2gobixpLHIpfXRoaXMuc2V0SW5kZXgoZCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KHAsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBsMXQoZiwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgbDF0KG0sMikpfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IGEwdCh0LndpZHRoLHQuaGVpZ2h0LHQud2lkdGhTZWdtZW50cyx0LmhlaWdodFNlZ21lbnRzKX19Y29uc3QgczB0PXthbHBoYW1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9BTFBIQU1BUFxuXHRkaWZmdXNlQ29sb3IuYSAqPSB0ZXh0dXJlMkQoIGFscGhhTWFwLCB2VXYgKS5nO1xuI2VuZGlmIixhbHBoYW1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0FMUEhBTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwO1xuI2VuZGlmIixhbHBoYXRlc3RfZnJhZ21lbnQ6IiNpZmRlZiBBTFBIQVRFU1Rcblx0aWYgKCBkaWZmdXNlQ29sb3IuYSA8IEFMUEhBVEVTVCApIGRpc2NhcmQ7XG4jZW5kaWYiLGFvbWFwX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0FPTUFQXG5cdGZsb2F0IGFtYmllbnRPY2NsdXNpb24gPSAoIHRleHR1cmUyRCggYW9NYXAsIHZVdjIgKS5yIC0gMS4wICkgKiBhb01hcEludGVuc2l0eSArIDEuMDtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICo9IGFtYmllbnRPY2NsdXNpb247XG5cdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggU1RBTkRBUkQgKVxuXHRcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICo9IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggZG90TlYsIGFtYmllbnRPY2NsdXNpb24sIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzICk7XG5cdCNlbmRpZlxuI2VuZGlmIixhb21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0FPTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGFvTWFwO1xuXHR1bmlmb3JtIGZsb2F0IGFvTWFwSW50ZW5zaXR5O1xuI2VuZGlmIixiZWdpbl92ZXJ0ZXg6InZlYzMgdHJhbnNmb3JtZWQgPSB2ZWMzKCBwb3NpdGlvbiApOyIsYmVnaW5ub3JtYWxfdmVydGV4OiJ2ZWMzIG9iamVjdE5vcm1hbCA9IHZlYzMoIG5vcm1hbCApO1xuI2lmZGVmIFVTRV9UQU5HRU5UXG5cdHZlYzMgb2JqZWN0VGFuZ2VudCA9IHZlYzMoIHRhbmdlbnQueHl6ICk7XG4jZW5kaWYiLGJzZGZzOiJ2ZWMyIGludGVncmF0ZVNwZWN1bGFyQlJERiggY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0Y29uc3QgdmVjNCBjMCA9IHZlYzQoIC0gMSwgLSAwLjAyNzUsIC0gMC41NzIsIDAuMDIyICk7XG5cdGNvbnN0IHZlYzQgYzEgPSB2ZWM0KCAxLCAwLjA0MjUsIDEuMDQsIC0gMC4wNCApO1xuXHR2ZWM0IHIgPSByb3VnaG5lc3MgKiBjMCArIGMxO1xuXHRmbG9hdCBhMDA0ID0gbWluKCByLnggKiByLngsIGV4cDIoIC0gOS4yOCAqIGRvdE5WICkgKSAqIHIueCArIHIueTtcblx0cmV0dXJuIHZlYzIoIC0xLjA0LCAxLjA0ICkgKiBhMDA0ICsgci56dztcbn1cbmZsb2F0IHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGNvbnN0IGluIGZsb2F0IGxpZ2h0RGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGN1dG9mZkRpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBkZWNheUV4cG9uZW50ICkge1xuI2lmIGRlZmluZWQgKCBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTIClcblx0ZmxvYXQgZGlzdGFuY2VGYWxsb2ZmID0gMS4wIC8gbWF4KCBwb3coIGxpZ2h0RGlzdGFuY2UsIGRlY2F5RXhwb25lbnQgKSwgMC4wMSApO1xuXHRpZiggY3V0b2ZmRGlzdGFuY2UgPiAwLjAgKSB7XG5cdFx0ZGlzdGFuY2VGYWxsb2ZmICo9IHBvdzIoIHNhdHVyYXRlKCAxLjAgLSBwb3c0KCBsaWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKSApICk7XG5cdH1cblx0cmV0dXJuIGRpc3RhbmNlRmFsbG9mZjtcbiNlbHNlXG5cdGlmKCBjdXRvZmZEaXN0YW5jZSA+IDAuMCAmJiBkZWNheUV4cG9uZW50ID4gMC4wICkge1xuXHRcdHJldHVybiBwb3coIHNhdHVyYXRlKCAtbGlnaHREaXN0YW5jZSAvIGN1dG9mZkRpc3RhbmNlICsgMS4wICksIGRlY2F5RXhwb25lbnQgKTtcblx0fVxuXHRyZXR1cm4gMS4wO1xuI2VuZGlmXG59XG52ZWMzIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBjb25zdCBpbiB2ZWMzIGRpZmZ1c2VDb2xvciApIHtcblx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBkaWZmdXNlQ29sb3I7XG59XG52ZWMzIEZfU2NobGljayggY29uc3QgaW4gdmVjMyBmMCwgY29uc3QgaW4gdmVjMyBmOTAsIGNvbnN0IGluIGZsb2F0IGRvdFZIICkge1xuXHRmbG9hdCBmcmVzbmVsID0gZXhwMiggKCAtNS41NTQ3MyAqIGRvdFZIIC0gNi45ODMxNiApICogZG90VkggKTtcblx0cmV0dXJuICggZjkwIC0gZjAgKSAqIGZyZXNuZWwgKyBmMDtcbn1cbnZlYzMgRl9TY2hsaWNrX1JvdWdobmVzc0RlcGVuZGVudCggY29uc3QgaW4gdmVjMyBGMCwgY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0ZmxvYXQgZnJlc25lbCA9IGV4cDIoICggLTUuNTU0NzMgKiBkb3ROViAtIDYuOTgzMTYgKSAqIGRvdE5WICk7XG5cdHZlYzMgRnIgPSBtYXgoIHZlYzMoIDEuMCAtIHJvdWdobmVzcyApLCBGMCApIC0gRjA7XG5cdHJldHVybiBGciAqIGZyZXNuZWwgKyBGMDtcbn1cbmZsb2F0IEdfR0dYX1NtaXRoKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xuXHRmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGdsID0gZG90TkwgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTtcblx0ZmxvYXQgZ3YgPSBkb3ROViArIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xuXHRyZXR1cm4gMS4wIC8gKCBnbCAqIGd2ICk7XG59XG5mbG9hdCBHX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XG5cdGZsb2F0IGEyID0gcG93MiggYWxwaGEgKTtcblx0ZmxvYXQgZ3YgPSBkb3ROTCAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xuXHRmbG9hdCBnbCA9IGRvdE5WICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XG5cdHJldHVybiAwLjUgLyBtYXgoIGd2ICsgZ2wsIEVQU0lMT04gKTtcbn1cbmZsb2F0IERfR0dYKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7XG5cdGZsb2F0IGEyID0gcG93MiggYWxwaGEgKTtcblx0ZmxvYXQgZGVub20gPSBwb3cyKCBkb3ROSCApICogKCBhMiAtIDEuMCApICsgMS4wO1xuXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGEyIC8gcG93MiggZGVub20gKTtcbn1cbnZlYzMgQlJERl9TcGVjdWxhcl9HR1goIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBmMCwgY29uc3QgaW4gdmVjMyBmOTAsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0ZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTtcblx0dmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiArIHZpZXdEaXIgKTtcblx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApO1xuXHRmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgaGFsZkRpciApICk7XG5cdGZsb2F0IGRvdExIID0gc2F0dXJhdGUoIGRvdCggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24sIGhhbGZEaXIgKSApO1xuXHR2ZWMzIEYgPSBGX1NjaGxpY2soIGYwLCBmOTAsIGRvdExIICk7XG5cdGZsb2F0IEcgPSBHX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGFscGhhLCBkb3ROTCwgZG90TlYgKTtcblx0ZmxvYXQgRCA9IERfR0dYKCBhbHBoYSwgZG90TkggKTtcblx0cmV0dXJuIEYgKiAoIEcgKiBEICk7XG59XG52ZWMyIExUQ19VdiggY29uc3QgaW4gdmVjMyBOLCBjb25zdCBpbiB2ZWMzIFYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0Y29uc3QgZmxvYXQgTFVUX1NJWkUgPSA2NC4wO1xuXHRjb25zdCBmbG9hdCBMVVRfU0NBTEUgPSAoIExVVF9TSVpFIC0gMS4wICkgLyBMVVRfU0laRTtcblx0Y29uc3QgZmxvYXQgTFVUX0JJQVMgPSAwLjUgLyBMVVRfU0laRTtcblx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBOLCBWICkgKTtcblx0dmVjMiB1diA9IHZlYzIoIHJvdWdobmVzcywgc3FydCggMS4wIC0gZG90TlYgKSApO1xuXHR1diA9IHV2ICogTFVUX1NDQUxFICsgTFVUX0JJQVM7XG5cdHJldHVybiB1djtcbn1cbmZsb2F0IExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyBmICkge1xuXHRmbG9hdCBsID0gbGVuZ3RoKCBmICk7XG5cdHJldHVybiBtYXgoICggbCAqIGwgKyBmLnogKSAvICggbCArIDEuMCApLCAwLjAgKTtcbn1cbnZlYzMgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIHYxLCBjb25zdCBpbiB2ZWMzIHYyICkge1xuXHRmbG9hdCB4ID0gZG90KCB2MSwgdjIgKTtcblx0ZmxvYXQgeSA9IGFicyggeCApO1xuXHRmbG9hdCBhID0gMC44NTQzOTg1ICsgKCAwLjQ5NjUxNTUgKyAwLjAxNDUyMDYgKiB5ICkgKiB5O1xuXHRmbG9hdCBiID0gMy40MTc1OTQwICsgKCA0LjE2MTY3MjQgKyB5ICkgKiB5O1xuXHRmbG9hdCB2ID0gYSAvIGI7XG5cdGZsb2F0IHRoZXRhX3NpbnRoZXRhID0gKCB4ID4gMC4wICkgPyB2IDogMC41ICogaW52ZXJzZXNxcnQoIG1heCggMS4wIC0geCAqIHgsIDFlLTcgKSApIC0gdjtcblx0cmV0dXJuIGNyb3NzKCB2MSwgdjIgKSAqIHRoZXRhX3NpbnRoZXRhO1xufVxudmVjMyBMVENfRXZhbHVhdGUoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiB2ZWMzIFAsIGNvbnN0IGluIG1hdDMgbUludiwgY29uc3QgaW4gdmVjMyByZWN0Q29vcmRzWyA0IF0gKSB7XG5cdHZlYzMgdjEgPSByZWN0Q29vcmRzWyAxIF0gLSByZWN0Q29vcmRzWyAwIF07XG5cdHZlYzMgdjIgPSByZWN0Q29vcmRzWyAzIF0gLSByZWN0Q29vcmRzWyAwIF07XG5cdHZlYzMgbGlnaHROb3JtYWwgPSBjcm9zcyggdjEsIHYyICk7XG5cdGlmKCBkb3QoIGxpZ2h0Tm9ybWFsLCBQIC0gcmVjdENvb3Jkc1sgMCBdICkgPCAwLjAgKSByZXR1cm4gdmVjMyggMC4wICk7XG5cdHZlYzMgVDEsIFQyO1xuXHRUMSA9IG5vcm1hbGl6ZSggViAtIE4gKiBkb3QoIFYsIE4gKSApO1xuXHRUMiA9IC0gY3Jvc3MoIE4sIFQxICk7XG5cdG1hdDMgbWF0ID0gbUludiAqIHRyYW5zcG9zZU1hdDMoIG1hdDMoIFQxLCBUMiwgTiApICk7XG5cdHZlYzMgY29vcmRzWyA0IF07XG5cdGNvb3Jkc1sgMCBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAwIF0gLSBQICk7XG5cdGNvb3Jkc1sgMSBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAxIF0gLSBQICk7XG5cdGNvb3Jkc1sgMiBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAyIF0gLSBQICk7XG5cdGNvb3Jkc1sgMyBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAzIF0gLSBQICk7XG5cdGNvb3Jkc1sgMCBdID0gbm9ybWFsaXplKCBjb29yZHNbIDAgXSApO1xuXHRjb29yZHNbIDEgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAxIF0gKTtcblx0Y29vcmRzWyAyIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMiBdICk7XG5cdGNvb3Jkc1sgMyBdID0gbm9ybWFsaXplKCBjb29yZHNbIDMgXSApO1xuXHR2ZWMzIHZlY3RvckZvcm1GYWN0b3IgPSB2ZWMzKCAwLjAgKTtcblx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMCBdLCBjb29yZHNbIDEgXSApO1xuXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAxIF0sIGNvb3Jkc1sgMiBdICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDIgXSwgY29vcmRzWyAzIF0gKTtcblx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMyBdLCBjb29yZHNbIDAgXSApO1xuXHRmbG9hdCByZXN1bHQgPSBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIHZlY3RvckZvcm1GYWN0b3IgKTtcblx0cmV0dXJuIHZlYzMoIHJlc3VsdCApO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX0dHWF9FbnZpcm9ubWVudCggY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTtcblx0dmVjMiBicmRmID0gaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBkb3ROViwgcm91Z2huZXNzICk7XG5cdHJldHVybiBzcGVjdWxhckNvbG9yICogYnJkZi54ICsgYnJkZi55O1xufVxudm9pZCBCUkRGX1NwZWN1bGFyX011bHRpc2NhdHRlcmluZ19FbnZpcm9ubWVudCggY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGlub3V0IHZlYzMgc2luZ2xlU2NhdHRlciwgaW5vdXQgdmVjMyBtdWx0aVNjYXR0ZXIgKSB7XG5cdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0dmVjMyBGID0gRl9TY2hsaWNrX1JvdWdobmVzc0RlcGVuZGVudCggc3BlY3VsYXJDb2xvciwgZG90TlYsIHJvdWdobmVzcyApO1xuXHR2ZWMyIGJyZGYgPSBpbnRlZ3JhdGVTcGVjdWxhckJSREYoIGRvdE5WLCByb3VnaG5lc3MgKTtcblx0dmVjMyBGc3NFc3MgPSBGICogYnJkZi54ICsgYnJkZi55O1xuXHRmbG9hdCBFc3MgPSBicmRmLnggKyBicmRmLnk7XG5cdGZsb2F0IEVtcyA9IDEuMCAtIEVzcztcblx0dmVjMyBGYXZnID0gc3BlY3VsYXJDb2xvciArICggMS4wIC0gc3BlY3VsYXJDb2xvciApICogMC4wNDc2MTk7XHR2ZWMzIEZtcyA9IEZzc0VzcyAqIEZhdmcgLyAoIDEuMCAtIEVtcyAqIEZhdmcgKTtcblx0c2luZ2xlU2NhdHRlciArPSBGc3NFc3M7XG5cdG11bHRpU2NhdHRlciArPSBGbXMgKiBFbXM7XG59XG5mbG9hdCBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICkge1xuXHRyZXR1cm4gMC4yNTtcbn1cbmZsb2F0IERfQmxpbm5QaG9uZyggY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHtcblx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiAoIHNoaW5pbmVzcyAqIDAuNSArIDEuMCApICogcG93KCBkb3ROSCwgc2hpbmluZXNzICk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBpbmNpZGVudExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcyApIHtcblx0dmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiArIGdlb21ldHJ5LnZpZXdEaXIgKTtcblx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhhbGZEaXIgKSApO1xuXHRmbG9hdCBkb3RMSCA9IHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcblx0dmVjMyBGID0gRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCB2ZWMzKCAxLjAgKSwgZG90TEggKTtcblx0ZmxvYXQgRyA9IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKTtcblx0ZmxvYXQgRCA9IERfQmxpbm5QaG9uZyggc2hpbmluZXNzLCBkb3ROSCApO1xuXHRyZXR1cm4gRiAqICggRyAqIEQgKTtcbn1cbmZsb2F0IEdHWFJvdWdobmVzc1RvQmxpbm5FeHBvbmVudCggY29uc3QgaW4gZmxvYXQgZ2d4Um91Z2huZXNzICkge1xuXHRyZXR1cm4gKCAyLjAgLyBwb3cyKCBnZ3hSb3VnaG5lc3MgKyAwLjAwMDEgKSAtIDIuMCApO1xufVxuZmxvYXQgQmxpbm5FeHBvbmVudFRvR0dYUm91Z2huZXNzKCBjb25zdCBpbiBmbG9hdCBibGlubkV4cG9uZW50ICkge1xuXHRyZXR1cm4gc3FydCggMi4wIC8gKCBibGlubkV4cG9uZW50ICsgMi4wICkgKTtcbn1cbiNpZiBkZWZpbmVkKCBVU0VfU0hFRU4gKVxuZmxvYXQgRF9DaGFybGllKGZsb2F0IHJvdWdobmVzcywgZmxvYXQgTm9IKSB7XG5cdGZsb2F0IGludkFscGhhID0gMS4wIC8gcm91Z2huZXNzO1xuXHRmbG9hdCBjb3MyaCA9IE5vSCAqIE5vSDtcblx0ZmxvYXQgc2luMmggPSBtYXgoMS4wIC0gY29zMmgsIDAuMDA3ODEyNSk7XHRyZXR1cm4gKDIuMCArIGludkFscGhhKSAqIHBvdyhzaW4yaCwgaW52QWxwaGEgKiAwLjUpIC8gKDIuMCAqIFBJKTtcbn1cbmZsb2F0IFZfTmV1YmVsdChmbG9hdCBOb1YsIGZsb2F0IE5vTCkge1xuXHRyZXR1cm4gc2F0dXJhdGUoMS4wIC8gKDQuMCAqIChOb0wgKyBOb1YgLSBOb0wgKiBOb1YpKSk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfU2hlZW4oIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gdmVjMyBMLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCB2ZWMzIHNwZWN1bGFyQ29sb3IgKSB7XG5cdHZlYzMgTiA9IGdlb21ldHJ5Lm5vcm1hbDtcblx0dmVjMyBWID0gZ2VvbWV0cnkudmlld0Rpcjtcblx0dmVjMyBIID0gbm9ybWFsaXplKCBWICsgTCApO1xuXHRmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIE4sIEggKSApO1xuXHRyZXR1cm4gc3BlY3VsYXJDb2xvciAqIERfQ2hhcmxpZSggcm91Z2huZXNzLCBkb3ROSCApICogVl9OZXViZWx0KCBkb3QoTiwgViksIGRvdChOLCBMKSApO1xufVxuI2VuZGlmIixidW1wbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQlVNUE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBidW1wTWFwO1xuXHR1bmlmb3JtIGZsb2F0IGJ1bXBTY2FsZTtcblx0dmVjMiBkSGR4eV9md2QoKSB7XG5cdFx0dmVjMiBkU1RkeCA9IGRGZHgoIHZVdiApO1xuXHRcdHZlYzIgZFNUZHkgPSBkRmR5KCB2VXYgKTtcblx0XHRmbG9hdCBIbGwgPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiApLng7XG5cdFx0ZmxvYXQgZEJ4ID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKyBkU1RkeCApLnggLSBIbGw7XG5cdFx0ZmxvYXQgZEJ5ID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKyBkU1RkeSApLnggLSBIbGw7XG5cdFx0cmV0dXJuIHZlYzIoIGRCeCwgZEJ5ICk7XG5cdH1cblx0dmVjMyBwZXJ0dXJiTm9ybWFsQXJiKCB2ZWMzIHN1cmZfcG9zLCB2ZWMzIHN1cmZfbm9ybSwgdmVjMiBkSGR4eSwgZmxvYXQgZmFjZURpcmVjdGlvbiApIHtcblx0XHR2ZWMzIHZTaWdtYVggPSB2ZWMzKCBkRmR4KCBzdXJmX3Bvcy54ICksIGRGZHgoIHN1cmZfcG9zLnkgKSwgZEZkeCggc3VyZl9wb3MueiApICk7XG5cdFx0dmVjMyB2U2lnbWFZID0gdmVjMyggZEZkeSggc3VyZl9wb3MueCApLCBkRmR5KCBzdXJmX3Bvcy55ICksIGRGZHkoIHN1cmZfcG9zLnogKSApO1xuXHRcdHZlYzMgdk4gPSBzdXJmX25vcm07XG5cdFx0dmVjMyBSMSA9IGNyb3NzKCB2U2lnbWFZLCB2TiApO1xuXHRcdHZlYzMgUjIgPSBjcm9zcyggdk4sIHZTaWdtYVggKTtcblx0XHRmbG9hdCBmRGV0ID0gZG90KCB2U2lnbWFYLCBSMSApICogZmFjZURpcmVjdGlvbjtcblx0XHR2ZWMzIHZHcmFkID0gc2lnbiggZkRldCApICogKCBkSGR4eS54ICogUjEgKyBkSGR4eS55ICogUjIgKTtcblx0XHRyZXR1cm4gbm9ybWFsaXplKCBhYnMoIGZEZXQgKSAqIHN1cmZfbm9ybSAtIHZHcmFkICk7XG5cdH1cbiNlbmRpZiIsY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50OiIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcblx0dmVjNCBwbGFuZTtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBVTklPTl9DTElQUElOR19QTEFORVM7IGkgKysgKSB7XG5cdFx0cGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdO1xuXHRcdGlmICggZG90KCB2Q2xpcFBvc2l0aW9uLCBwbGFuZS54eXogKSA+IHBsYW5lLncgKSBkaXNjYXJkO1xuXHR9XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG5cdCNpZiBVTklPTl9DTElQUElOR19QTEFORVMgPCBOVU1fQ0xJUFBJTkdfUExBTkVTXG5cdFx0Ym9vbCBjbGlwcGVkID0gdHJ1ZTtcblx0XHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdFx0Zm9yICggaW50IGkgPSBVTklPTl9DTElQUElOR19QTEFORVM7IGkgPCBOVU1fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkge1xuXHRcdFx0cGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdO1xuXHRcdFx0Y2xpcHBlZCA9ICggZG90KCB2Q2xpcFBvc2l0aW9uLCBwbGFuZS54eXogKSA+IHBsYW5lLncgKSAmJiBjbGlwcGVkO1xuXHRcdH1cblx0XHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuXHRcdGlmICggY2xpcHBlZCApIGRpc2NhcmQ7XG5cdCNlbmRpZlxuI2VuZGlmIixjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudDoiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXG5cdHZhcnlpbmcgdmVjMyB2Q2xpcFBvc2l0aW9uO1xuXHR1bmlmb3JtIHZlYzQgY2xpcHBpbmdQbGFuZXNbIE5VTV9DTElQUElOR19QTEFORVMgXTtcbiNlbmRpZiIsY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4OiIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcblx0dmFyeWluZyB2ZWMzIHZDbGlwUG9zaXRpb247XG4jZW5kaWYiLGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMFxuXHR2Q2xpcFBvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcbiNlbmRpZiIsY29sb3JfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKVxuXHRkaWZmdXNlQ29sb3IgKj0gdkNvbG9yO1xuI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SIClcblx0ZGlmZnVzZUNvbG9yLnJnYiAqPSB2Q29sb3I7XG4jZW5kaWYiLGNvbG9yX3BhcnNfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKVxuXHR2YXJ5aW5nIHZlYzQgdkNvbG9yO1xuI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SIClcblx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcbiNlbmRpZiIsY29sb3JfcGFyc192ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKVxuXHR2YXJ5aW5nIHZlYzQgdkNvbG9yO1xuI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SICkgfHwgZGVmaW5lZCggVVNFX0lOU1RBTkNJTkdfQ09MT1IgKVxuXHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xuI2VuZGlmIixjb2xvcl92ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKVxuXHR2Q29sb3IgPSB2ZWM0KCAxLjAgKTtcbiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApIHx8IGRlZmluZWQoIFVTRV9JTlNUQU5DSU5HX0NPTE9SIClcblx0dkNvbG9yID0gdmVjMyggMS4wICk7XG4jZW5kaWZcbiNpZmRlZiBVU0VfQ09MT1Jcblx0dkNvbG9yICo9IGNvbG9yO1xuI2VuZGlmXG4jaWZkZWYgVVNFX0lOU1RBTkNJTkdfQ09MT1Jcblx0dkNvbG9yLnh5eiAqPSBpbnN0YW5jZUNvbG9yLnh5ejtcbiNlbmRpZiIsY29tbW9uOiIjZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTg5NzkzXG4jZGVmaW5lIFBJMiA2LjI4MzE4NTMwNzE3OTU4NlxuI2RlZmluZSBQSV9IQUxGIDEuNTcwNzk2MzI2Nzk0ODk2NlxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2MTgzNzkwN1xuI2RlZmluZSBSRUNJUFJPQ0FMX1BJMiAwLjE1OTE1NDk0MzA5MTg5NTM1XG4jZGVmaW5lIEVQU0lMT04gMWUtNlxuI2lmbmRlZiBzYXR1cmF0ZVxuI2RlZmluZSBzYXR1cmF0ZShhKSBjbGFtcCggYSwgMC4wLCAxLjAgKVxuI2VuZGlmXG4jZGVmaW5lIHdoaXRlQ29tcGxlbWVudChhKSAoIDEuMCAtIHNhdHVyYXRlKCBhICkgKVxuZmxvYXQgcG93MiggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeDsgfVxuZmxvYXQgcG93MyggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeCp4OyB9XG5mbG9hdCBwb3c0KCBjb25zdCBpbiBmbG9hdCB4ICkgeyBmbG9hdCB4MiA9IHgqeDsgcmV0dXJuIHgyKngyOyB9XG5mbG9hdCBhdmVyYWdlKCBjb25zdCBpbiB2ZWMzIGNvbG9yICkgeyByZXR1cm4gZG90KCBjb2xvciwgdmVjMyggMC4zMzMzICkgKTsgfVxuaGlnaHAgZmxvYXQgcmFuZCggY29uc3QgaW4gdmVjMiB1diApIHtcblx0Y29uc3QgaGlnaHAgZmxvYXQgYSA9IDEyLjk4OTgsIGIgPSA3OC4yMzMsIGMgPSA0Mzc1OC41NDUzO1xuXHRoaWdocCBmbG9hdCBkdCA9IGRvdCggdXYueHksIHZlYzIoIGEsYiApICksIHNuID0gbW9kKCBkdCwgUEkgKTtcblx0cmV0dXJuIGZyYWN0KHNpbihzbikgKiBjKTtcbn1cbiNpZmRlZiBISUdIX1BSRUNJU0lPTlxuXHRmbG9hdCBwcmVjaXNpb25TYWZlTGVuZ3RoKCB2ZWMzIHYgKSB7IHJldHVybiBsZW5ndGgoIHYgKTsgfVxuI2Vsc2Vcblx0ZmxvYXQgbWF4MyggdmVjMyB2ICkgeyByZXR1cm4gbWF4KCBtYXgoIHYueCwgdi55ICksIHYueiApOyB9XG5cdGZsb2F0IHByZWNpc2lvblNhZmVMZW5ndGgoIHZlYzMgdiApIHtcblx0XHRmbG9hdCBtYXhDb21wb25lbnQgPSBtYXgzKCBhYnMoIHYgKSApO1xuXHRcdHJldHVybiBsZW5ndGgoIHYgLyBtYXhDb21wb25lbnQgKSAqIG1heENvbXBvbmVudDtcblx0fVxuI2VuZGlmXG5zdHJ1Y3QgSW5jaWRlbnRMaWdodCB7XG5cdHZlYzMgY29sb3I7XG5cdHZlYzMgZGlyZWN0aW9uO1xuXHRib29sIHZpc2libGU7XG59O1xuc3RydWN0IFJlZmxlY3RlZExpZ2h0IHtcblx0dmVjMyBkaXJlY3REaWZmdXNlO1xuXHR2ZWMzIGRpcmVjdFNwZWN1bGFyO1xuXHR2ZWMzIGluZGlyZWN0RGlmZnVzZTtcblx0dmVjMyBpbmRpcmVjdFNwZWN1bGFyO1xufTtcbnN0cnVjdCBHZW9tZXRyaWNDb250ZXh0IHtcblx0dmVjMyBwb3NpdGlvbjtcblx0dmVjMyBub3JtYWw7XG5cdHZlYzMgdmlld0RpcjtcbiNpZmRlZiBDTEVBUkNPQVRcblx0dmVjMyBjbGVhcmNvYXROb3JtYWw7XG4jZW5kaWZcbn07XG52ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTtcbn1cbnZlYzMgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQoIGRpciwgMC4wICkgKiBtYXRyaXggKS54eXogKTtcbn1cbnZlYzMgcHJvamVjdE9uUGxhbmUoaW4gdmVjMyBwb2ludCwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XG5cdGZsb2F0IGRpc3RhbmNlID0gZG90KCBwbGFuZU5vcm1hbCwgcG9pbnQgLSBwb2ludE9uUGxhbmUgKTtcblx0cmV0dXJuIC0gZGlzdGFuY2UgKiBwbGFuZU5vcm1hbCArIHBvaW50O1xufVxuZmxvYXQgc2lkZU9mUGxhbmUoIGluIHZlYzMgcG9pbnQsIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xuXHRyZXR1cm4gc2lnbiggZG90KCBwb2ludCAtIHBvaW50T25QbGFuZSwgcGxhbmVOb3JtYWwgKSApO1xufVxudmVjMyBsaW5lUGxhbmVJbnRlcnNlY3QoIGluIHZlYzMgcG9pbnRPbkxpbmUsIGluIHZlYzMgbGluZURpcmVjdGlvbiwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XG5cdHJldHVybiBsaW5lRGlyZWN0aW9uICogKCBkb3QoIHBsYW5lTm9ybWFsLCBwb2ludE9uUGxhbmUgLSBwb2ludE9uTGluZSApIC8gZG90KCBwbGFuZU5vcm1hbCwgbGluZURpcmVjdGlvbiApICkgKyBwb2ludE9uTGluZTtcbn1cbm1hdDMgdHJhbnNwb3NlTWF0MyggY29uc3QgaW4gbWF0MyBtICkge1xuXHRtYXQzIHRtcDtcblx0dG1wWyAwIF0gPSB2ZWMzKCBtWyAwIF0ueCwgbVsgMSBdLngsIG1bIDIgXS54ICk7XG5cdHRtcFsgMSBdID0gdmVjMyggbVsgMCBdLnksIG1bIDEgXS55LCBtWyAyIF0ueSApO1xuXHR0bXBbIDIgXSA9IHZlYzMoIG1bIDAgXS56LCBtWyAxIF0ueiwgbVsgMiBdLnogKTtcblx0cmV0dXJuIHRtcDtcbn1cbmZsb2F0IGxpbmVhclRvUmVsYXRpdmVMdW1pbmFuY2UoIGNvbnN0IGluIHZlYzMgY29sb3IgKSB7XG5cdHZlYzMgd2VpZ2h0cyA9IHZlYzMoIDAuMjEyNiwgMC43MTUyLCAwLjA3MjIgKTtcblx0cmV0dXJuIGRvdCggd2VpZ2h0cywgY29sb3IucmdiICk7XG59XG5ib29sIGlzUGVyc3BlY3RpdmVNYXRyaXgoIG1hdDQgbSApIHtcblx0cmV0dXJuIG1bIDIgXVsgMyBdID09IC0gMS4wO1xufVxudmVjMiBlcXVpcmVjdFV2KCBpbiB2ZWMzIGRpciApIHtcblx0ZmxvYXQgdSA9IGF0YW4oIGRpci56LCBkaXIueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XG5cdGZsb2F0IHYgPSBhc2luKCBjbGFtcCggZGlyLnksIC0gMS4wLCAxLjAgKSApICogUkVDSVBST0NBTF9QSSArIDAuNTtcblx0cmV0dXJuIHZlYzIoIHUsIHYgKTtcbn0iLGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudDoiI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVZcblx0I2RlZmluZSBjdWJlVVZfbWF4TWlwTGV2ZWwgOC4wXG5cdCNkZWZpbmUgY3ViZVVWX21pbk1pcExldmVsIDQuMFxuXHQjZGVmaW5lIGN1YmVVVl9tYXhUaWxlU2l6ZSAyNTYuMFxuXHQjZGVmaW5lIGN1YmVVVl9taW5UaWxlU2l6ZSAxNi4wXG5cdGZsb2F0IGdldEZhY2UoIHZlYzMgZGlyZWN0aW9uICkge1xuXHRcdHZlYzMgYWJzRGlyZWN0aW9uID0gYWJzKCBkaXJlY3Rpb24gKTtcblx0XHRmbG9hdCBmYWNlID0gLSAxLjA7XG5cdFx0aWYgKCBhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi56ICkge1xuXHRcdFx0aWYgKCBhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi55IClcblx0XHRcdFx0ZmFjZSA9IGRpcmVjdGlvbi54ID4gMC4wID8gMC4wIDogMy4wO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRmYWNlID0gZGlyZWN0aW9uLnkgPiAwLjAgPyAxLjAgOiA0LjA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICggYWJzRGlyZWN0aW9uLnogPiBhYnNEaXJlY3Rpb24ueSApXG5cdFx0XHRcdGZhY2UgPSBkaXJlY3Rpb24ueiA+IDAuMCA/IDIuMCA6IDUuMDtcblx0XHRcdGVsc2Vcblx0XHRcdFx0ZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMS4wIDogNC4wO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFjZTtcblx0fVxuXHR2ZWMyIGdldFVWKCB2ZWMzIGRpcmVjdGlvbiwgZmxvYXQgZmFjZSApIHtcblx0XHR2ZWMyIHV2O1xuXHRcdGlmICggZmFjZSA9PSAwLjAgKSB7XG5cdFx0XHR1diA9IHZlYzIoIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueCApO1xuXHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMS4wICkge1xuXHRcdFx0dXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi54LCAtIGRpcmVjdGlvbi56ICkgLyBhYnMoIGRpcmVjdGlvbi55ICk7XG5cdFx0fSBlbHNlIGlmICggZmFjZSA9PSAyLjAgKSB7XG5cdFx0XHR1diA9IHZlYzIoIC0gZGlyZWN0aW9uLngsIGRpcmVjdGlvbi55ICkgLyBhYnMoIGRpcmVjdGlvbi56ICk7XG5cdFx0fSBlbHNlIGlmICggZmFjZSA9PSAzLjAgKSB7XG5cdFx0XHR1diA9IHZlYzIoIC0gZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55ICkgLyBhYnMoIGRpcmVjdGlvbi54ICk7XG5cdFx0fSBlbHNlIGlmICggZmFjZSA9PSA0LjAgKSB7XG5cdFx0XHR1diA9IHZlYzIoIC0gZGlyZWN0aW9uLngsIGRpcmVjdGlvbi56ICkgLyBhYnMoIGRpcmVjdGlvbi55ICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHV2ID0gdmVjMiggZGlyZWN0aW9uLngsIGRpcmVjdGlvbi55ICkgLyBhYnMoIGRpcmVjdGlvbi56ICk7XG5cdFx0fVxuXHRcdHJldHVybiAwLjUgKiAoIHV2ICsgMS4wICk7XG5cdH1cblx0dmVjMyBiaWxpbmVhckN1YmVVViggc2FtcGxlcjJEIGVudk1hcCwgdmVjMyBkaXJlY3Rpb24sIGZsb2F0IG1pcEludCApIHtcblx0XHRmbG9hdCBmYWNlID0gZ2V0RmFjZSggZGlyZWN0aW9uICk7XG5cdFx0ZmxvYXQgZmlsdGVySW50ID0gbWF4KCBjdWJlVVZfbWluTWlwTGV2ZWwgLSBtaXBJbnQsIDAuMCApO1xuXHRcdG1pcEludCA9IG1heCggbWlwSW50LCBjdWJlVVZfbWluTWlwTGV2ZWwgKTtcblx0XHRmbG9hdCBmYWNlU2l6ZSA9IGV4cDIoIG1pcEludCApO1xuXHRcdGZsb2F0IHRleGVsU2l6ZSA9IDEuMCAvICggMy4wICogY3ViZVVWX21heFRpbGVTaXplICk7XG5cdFx0dmVjMiB1diA9IGdldFVWKCBkaXJlY3Rpb24sIGZhY2UgKSAqICggZmFjZVNpemUgLSAxLjAgKTtcblx0XHR2ZWMyIGYgPSBmcmFjdCggdXYgKTtcblx0XHR1diArPSAwLjUgLSBmO1xuXHRcdGlmICggZmFjZSA+IDIuMCApIHtcblx0XHRcdHV2LnkgKz0gZmFjZVNpemU7XG5cdFx0XHRmYWNlIC09IDMuMDtcblx0XHR9XG5cdFx0dXYueCArPSBmYWNlICogZmFjZVNpemU7XG5cdFx0aWYgKCBtaXBJbnQgPCBjdWJlVVZfbWF4TWlwTGV2ZWwgKSB7XG5cdFx0XHR1di55ICs9IDIuMCAqIGN1YmVVVl9tYXhUaWxlU2l6ZTtcblx0XHR9XG5cdFx0dXYueSArPSBmaWx0ZXJJbnQgKiAyLjAgKiBjdWJlVVZfbWluVGlsZVNpemU7XG5cdFx0dXYueCArPSAzLjAgKiBtYXgoIDAuMCwgY3ViZVVWX21heFRpbGVTaXplIC0gMi4wICogZmFjZVNpemUgKTtcblx0XHR1diAqPSB0ZXhlbFNpemU7XG5cdFx0dmVjMyB0bCA9IGVudk1hcFRleGVsVG9MaW5lYXIoIHRleHR1cmUyRCggZW52TWFwLCB1diApICkucmdiO1xuXHRcdHV2LnggKz0gdGV4ZWxTaXplO1xuXHRcdHZlYzMgdHIgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCB0ZXh0dXJlMkQoIGVudk1hcCwgdXYgKSApLnJnYjtcblx0XHR1di55ICs9IHRleGVsU2l6ZTtcblx0XHR2ZWMzIGJyID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEKCBlbnZNYXAsIHV2ICkgKS5yZ2I7XG5cdFx0dXYueCAtPSB0ZXhlbFNpemU7XG5cdFx0dmVjMyBibCA9IGVudk1hcFRleGVsVG9MaW5lYXIoIHRleHR1cmUyRCggZW52TWFwLCB1diApICkucmdiO1xuXHRcdHZlYzMgdG0gPSBtaXgoIHRsLCB0ciwgZi54ICk7XG5cdFx0dmVjMyBibSA9IG1peCggYmwsIGJyLCBmLnggKTtcblx0XHRyZXR1cm4gbWl4KCB0bSwgYm0sIGYueSApO1xuXHR9XG5cdCNkZWZpbmUgcjAgMS4wXG5cdCNkZWZpbmUgdjAgMC4zMzlcblx0I2RlZmluZSBtMCAtIDIuMFxuXHQjZGVmaW5lIHIxIDAuOFxuXHQjZGVmaW5lIHYxIDAuMjc2XG5cdCNkZWZpbmUgbTEgLSAxLjBcblx0I2RlZmluZSByNCAwLjRcblx0I2RlZmluZSB2NCAwLjA0NlxuXHQjZGVmaW5lIG00IDIuMFxuXHQjZGVmaW5lIHI1IDAuMzA1XG5cdCNkZWZpbmUgdjUgMC4wMTZcblx0I2RlZmluZSBtNSAzLjBcblx0I2RlZmluZSByNiAwLjIxXG5cdCNkZWZpbmUgdjYgMC4wMDM4XG5cdCNkZWZpbmUgbTYgNC4wXG5cdGZsb2F0IHJvdWdobmVzc1RvTWlwKCBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdFx0ZmxvYXQgbWlwID0gMC4wO1xuXHRcdGlmICggcm91Z2huZXNzID49IHIxICkge1xuXHRcdFx0bWlwID0gKCByMCAtIHJvdWdobmVzcyApICogKCBtMSAtIG0wICkgLyAoIHIwIC0gcjEgKSArIG0wO1xuXHRcdH0gZWxzZSBpZiAoIHJvdWdobmVzcyA+PSByNCApIHtcblx0XHRcdG1pcCA9ICggcjEgLSByb3VnaG5lc3MgKSAqICggbTQgLSBtMSApIC8gKCByMSAtIHI0ICkgKyBtMTtcblx0XHR9IGVsc2UgaWYgKCByb3VnaG5lc3MgPj0gcjUgKSB7XG5cdFx0XHRtaXAgPSAoIHI0IC0gcm91Z2huZXNzICkgKiAoIG01IC0gbTQgKSAvICggcjQgLSByNSApICsgbTQ7XG5cdFx0fSBlbHNlIGlmICggcm91Z2huZXNzID49IHI2ICkge1xuXHRcdFx0bWlwID0gKCByNSAtIHJvdWdobmVzcyApICogKCBtNiAtIG01ICkgLyAoIHI1IC0gcjYgKSArIG01O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtaXAgPSAtIDIuMCAqIGxvZzIoIDEuMTYgKiByb3VnaG5lc3MgKTtcdFx0fVxuXHRcdHJldHVybiBtaXA7XG5cdH1cblx0dmVjNCB0ZXh0dXJlQ3ViZVVWKCBzYW1wbGVyMkQgZW52TWFwLCB2ZWMzIHNhbXBsZURpciwgZmxvYXQgcm91Z2huZXNzICkge1xuXHRcdGZsb2F0IG1pcCA9IGNsYW1wKCByb3VnaG5lc3NUb01pcCggcm91Z2huZXNzICksIG0wLCBjdWJlVVZfbWF4TWlwTGV2ZWwgKTtcblx0XHRmbG9hdCBtaXBGID0gZnJhY3QoIG1pcCApO1xuXHRcdGZsb2F0IG1pcEludCA9IGZsb29yKCBtaXAgKTtcblx0XHR2ZWMzIGNvbG9yMCA9IGJpbGluZWFyQ3ViZVVWKCBlbnZNYXAsIHNhbXBsZURpciwgbWlwSW50ICk7XG5cdFx0aWYgKCBtaXBGID09IDAuMCApIHtcblx0XHRcdHJldHVybiB2ZWM0KCBjb2xvcjAsIDEuMCApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2ZWMzIGNvbG9yMSA9IGJpbGluZWFyQ3ViZVVWKCBlbnZNYXAsIHNhbXBsZURpciwgbWlwSW50ICsgMS4wICk7XG5cdFx0XHRyZXR1cm4gdmVjNCggbWl4KCBjb2xvcjAsIGNvbG9yMSwgbWlwRiApLCAxLjAgKTtcblx0XHR9XG5cdH1cbiNlbmRpZiIsZGVmYXVsdG5vcm1hbF92ZXJ0ZXg6InZlYzMgdHJhbnNmb3JtZWROb3JtYWwgPSBvYmplY3ROb3JtYWw7XG4jaWZkZWYgVVNFX0lOU1RBTkNJTkdcblx0bWF0MyBtID0gbWF0MyggaW5zdGFuY2VNYXRyaXggKTtcblx0dHJhbnNmb3JtZWROb3JtYWwgLz0gdmVjMyggZG90KCBtWyAwIF0sIG1bIDAgXSApLCBkb3QoIG1bIDEgXSwgbVsgMSBdICksIGRvdCggbVsgMiBdLCBtWyAyIF0gKSApO1xuXHR0cmFuc2Zvcm1lZE5vcm1hbCA9IG0gKiB0cmFuc2Zvcm1lZE5vcm1hbDtcbiNlbmRpZlxudHJhbnNmb3JtZWROb3JtYWwgPSBub3JtYWxNYXRyaXggKiB0cmFuc2Zvcm1lZE5vcm1hbDtcbiNpZmRlZiBGTElQX1NJREVEXG5cdHRyYW5zZm9ybWVkTm9ybWFsID0gLSB0cmFuc2Zvcm1lZE5vcm1hbDtcbiNlbmRpZlxuI2lmZGVmIFVTRV9UQU5HRU5UXG5cdHZlYzMgdHJhbnNmb3JtZWRUYW5nZW50ID0gKCBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBvYmplY3RUYW5nZW50LCAwLjAgKSApLnh5ejtcblx0I2lmZGVmIEZMSVBfU0lERURcblx0XHR0cmFuc2Zvcm1lZFRhbmdlbnQgPSAtIHRyYW5zZm9ybWVkVGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWYiLGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgZGlzcGxhY2VtZW50TWFwO1xuXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudFNjYWxlO1xuXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudEJpYXM7XG4jZW5kaWYiLGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg6IiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5cdHRyYW5zZm9ybWVkICs9IG5vcm1hbGl6ZSggb2JqZWN0Tm9ybWFsICkgKiAoIHRleHR1cmUyRCggZGlzcGxhY2VtZW50TWFwLCB2VXYgKS54ICogZGlzcGxhY2VtZW50U2NhbGUgKyBkaXNwbGFjZW1lbnRCaWFzICk7XG4jZW5kaWYiLGVtaXNzaXZlbWFwX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXG5cdHZlYzQgZW1pc3NpdmVDb2xvciA9IHRleHR1cmUyRCggZW1pc3NpdmVNYXAsIHZVdiApO1xuXHRlbWlzc2l2ZUNvbG9yLnJnYiA9IGVtaXNzaXZlTWFwVGV4ZWxUb0xpbmVhciggZW1pc3NpdmVDb2xvciApLnJnYjtcblx0dG90YWxFbWlzc2l2ZVJhZGlhbmNlICo9IGVtaXNzaXZlQ29sb3IucmdiO1xuI2VuZGlmIixlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGVtaXNzaXZlTWFwO1xuI2VuZGlmIixlbmNvZGluZ3NfZnJhZ21lbnQ6ImdsX0ZyYWdDb2xvciA9IGxpbmVhclRvT3V0cHV0VGV4ZWwoIGdsX0ZyYWdDb2xvciApOyIsZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ6IlxudmVjNCBMaW5lYXJUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZhbHVlO1xufVxudmVjNCBHYW1tYVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBnYW1tYUZhY3RvciApIHtcblx0cmV0dXJuIHZlYzQoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCBnYW1tYUZhY3RvciApICksIHZhbHVlLmEgKTtcbn1cbnZlYzQgTGluZWFyVG9HYW1tYSggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XG5cdHJldHVybiB2ZWM0KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMS4wIC8gZ2FtbWFGYWN0b3IgKSApLCB2YWx1ZS5hICk7XG59XG52ZWM0IHNSR0JUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZlYzQoIG1peCggcG93KCB2YWx1ZS5yZ2IgKiAwLjk0Nzg2NzI5ODYgKyB2ZWMzKCAwLjA1MjEzMjcwMTQgKSwgdmVjMyggMi40ICkgKSwgdmFsdWUucmdiICogMC4wNzczOTkzODA4LCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDQwNDUgKSApICkgKSwgdmFsdWUuYSApO1xufVxudmVjNCBMaW5lYXJUb3NSR0IoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCAwLjQxNjY2ICkgKSAqIDEuMDU1IC0gdmVjMyggMC4wNTUgKSwgdmFsdWUucmdiICogMTIuOTIsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wMDMxMzA4ICkgKSApICksIHZhbHVlLmEgKTtcbn1cbnZlYzQgUkdCRVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogZXhwMiggdmFsdWUuYSAqIDI1NS4wIC0gMTI4LjAgKSwgMS4wICk7XG59XG52ZWM0IExpbmVhclRvUkdCRSggaW4gdmVjNCB2YWx1ZSApIHtcblx0ZmxvYXQgbWF4Q29tcG9uZW50ID0gbWF4KCBtYXgoIHZhbHVlLnIsIHZhbHVlLmcgKSwgdmFsdWUuYiApO1xuXHRmbG9hdCBmRXhwID0gY2xhbXAoIGNlaWwoIGxvZzIoIG1heENvbXBvbmVudCApICksIC0xMjguMCwgMTI3LjAgKTtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvIGV4cDIoIGZFeHAgKSwgKCBmRXhwICsgMTI4LjAgKSAvIDI1NS4wICk7XG59XG52ZWM0IFJHQk1Ub0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiB2YWx1ZS5hICogbWF4UmFuZ2UsIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQk0oIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRmbG9hdCBtYXhSR0IgPSBtYXgoIHZhbHVlLnIsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XG5cdGZsb2F0IE0gPSBjbGFtcCggbWF4UkdCIC8gbWF4UmFuZ2UsIDAuMCwgMS4wICk7XG5cdE0gPSBjZWlsKCBNICogMjU1LjAgKSAvIDI1NS4wO1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiIC8gKCBNICogbWF4UmFuZ2UgKSwgTSApO1xufVxudmVjNCBSR0JEVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCAoIG1heFJhbmdlIC8gMjU1LjAgKSAvIHZhbHVlLmEgKSwgMS4wICk7XG59XG52ZWM0IExpbmVhclRvUkdCRCggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XG5cdGZsb2F0IG1heFJHQiA9IG1heCggdmFsdWUuciwgbWF4KCB2YWx1ZS5nLCB2YWx1ZS5iICkgKTtcblx0ZmxvYXQgRCA9IG1heCggbWF4UmFuZ2UgLyBtYXhSR0IsIDEuMCApO1xuXHREID0gY2xhbXAoIGZsb29yKCBEICkgLyAyNTUuMCwgMC4wLCAxLjAgKTtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICggRCAqICggMjU1LjAgLyBtYXhSYW5nZSApICksIEQgKTtcbn1cbmNvbnN0IG1hdDMgY0xvZ0x1dk0gPSBtYXQzKCAwLjIyMDksIDAuMzM5MCwgMC40MTg0LCAwLjExMzgsIDAuNjc4MCwgMC43MzE5LCAwLjAxMDIsIDAuMTEzMCwgMC4yOTY5ICk7XG52ZWM0IExpbmVhclRvTG9nTHV2KCBpbiB2ZWM0IHZhbHVlICkge1xuXHR2ZWMzIFhwX1lfWFlacCA9IGNMb2dMdXZNICogdmFsdWUucmdiO1xuXHRYcF9ZX1hZWnAgPSBtYXgoIFhwX1lfWFlacCwgdmVjMyggMWUtNiwgMWUtNiwgMWUtNiApICk7XG5cdHZlYzQgdlJlc3VsdDtcblx0dlJlc3VsdC54eSA9IFhwX1lfWFlacC54eSAvIFhwX1lfWFlacC56O1xuXHRmbG9hdCBMZSA9IDIuMCAqIGxvZzIoWHBfWV9YWVpwLnkpICsgMTI3LjA7XG5cdHZSZXN1bHQudyA9IGZyYWN0KCBMZSApO1xuXHR2UmVzdWx0LnogPSAoIExlIC0gKCBmbG9vciggdlJlc3VsdC53ICogMjU1LjAgKSApIC8gMjU1LjAgKSAvIDI1NS4wO1xuXHRyZXR1cm4gdlJlc3VsdDtcbn1cbmNvbnN0IG1hdDMgY0xvZ0x1dkludmVyc2VNID0gbWF0MyggNi4wMDE0LCAtMi43MDA4LCAtMS43OTk2LCAtMS4zMzIwLCAzLjEwMjksIC01Ljc3MjEsIDAuMzAwOCwgLTEuMDg4MiwgNS42MjY4ICk7XG52ZWM0IExvZ0x1dlRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRmbG9hdCBMZSA9IHZhbHVlLnogKiAyNTUuMCArIHZhbHVlLnc7XG5cdHZlYzMgWHBfWV9YWVpwO1xuXHRYcF9ZX1hZWnAueSA9IGV4cDIoICggTGUgLSAxMjcuMCApIC8gMi4wICk7XG5cdFhwX1lfWFlacC56ID0gWHBfWV9YWVpwLnkgLyB2YWx1ZS55O1xuXHRYcF9ZX1hZWnAueCA9IHZhbHVlLnggKiBYcF9ZX1hZWnAuejtcblx0dmVjMyB2UkdCID0gY0xvZ0x1dkludmVyc2VNICogWHBfWV9YWVpwLnJnYjtcblx0cmV0dXJuIHZlYzQoIG1heCggdlJHQiwgMC4wICksIDEuMCApO1xufSIsZW52bWFwX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VOVk1BUFxuXHQjaWZkZWYgRU5WX1dPUkxEUE9TXG5cdFx0dmVjMyBjYW1lcmFUb0ZyYWc7XG5cdFx0aWYgKCBpc09ydGhvZ3JhcGhpYyApIHtcblx0XHRcdGNhbWVyYVRvRnJhZyA9IG5vcm1hbGl6ZSggdmVjMyggLSB2aWV3TWF0cml4WyAwIF1bIDIgXSwgLSB2aWV3TWF0cml4WyAxIF1bIDIgXSwgLSB2aWV3TWF0cml4WyAyIF1bIDIgXSApICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNhbWVyYVRvRnJhZyA9IG5vcm1hbGl6ZSggdldvcmxkUG9zaXRpb24gLSBjYW1lcmFQb3NpdGlvbiApO1xuXHRcdH1cblx0XHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cblx0XHRcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZmxlY3QoIGNhbWVyYVRvRnJhZywgd29ybGROb3JtYWwgKTtcblx0XHQjZWxzZVxuXHRcdFx0dmVjMyByZWZsZWN0VmVjID0gcmVmcmFjdCggY2FtZXJhVG9GcmFnLCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XG5cdFx0I2VuZGlmXG5cdCNlbHNlXG5cdFx0dmVjMyByZWZsZWN0VmVjID0gdlJlZmxlY3Q7XG5cdCNlbmRpZlxuXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxuXHRcdHZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICkgKTtcblx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXG5cdFx0dmVjNCBlbnZDb2xvciA9IHRleHR1cmVDdWJlVVYoIGVudk1hcCwgcmVmbGVjdFZlYywgMC4wICk7XG5cdCNlbHNlXG5cdFx0dmVjNCBlbnZDb2xvciA9IHZlYzQoIDAuMCApO1xuXHQjZW5kaWZcblx0I2lmbmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWXG5cdFx0ZW52Q29sb3IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZDb2xvciApO1xuXHQjZW5kaWZcblx0I2lmZGVmIEVOVk1BUF9CTEVORElOR19NVUxUSVBMWVxuXHRcdG91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIG91dGdvaW5nTGlnaHQgKiBlbnZDb2xvci54eXosIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHkgKTtcblx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX0JMRU5ESU5HX01JWCApXG5cdFx0b3V0Z29pbmdMaWdodCA9IG1peCggb3V0Z29pbmdMaWdodCwgZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19BREQgKVxuXHRcdG91dGdvaW5nTGlnaHQgKz0gZW52Q29sb3IueHl6ICogc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eTtcblx0I2VuZGlmXG4jZW5kaWYiLGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0dW5pZm9ybSBmbG9hdCBlbnZNYXBJbnRlbnNpdHk7XG5cdHVuaWZvcm0gZmxvYXQgZmxpcEVudk1hcDtcblx0dW5pZm9ybSBpbnQgbWF4TWlwTGV2ZWw7XG5cdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0dW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZNYXA7XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgZW52TWFwO1xuXHQjZW5kaWZcblx0XG4jZW5kaWYiLGVudm1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VOVk1BUFxuXHR1bmlmb3JtIGZsb2F0IHJlZmxlY3Rpdml0eTtcblx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HIClcblx0XHQjZGVmaW5lIEVOVl9XT1JMRFBPU1xuXHQjZW5kaWZcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcblx0XHR1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbztcblx0I2Vsc2Vcblx0XHR2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7XG5cdCNlbmRpZlxuI2VuZGlmIixlbnZtYXBfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fGRlZmluZWQoIFBIT05HIClcblx0XHQjZGVmaW5lIEVOVl9XT1JMRFBPU1xuXHQjZW5kaWZcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdFxuXHRcdHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcblx0I2Vsc2Vcblx0XHR2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7XG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbmRpZlxuI2VuZGlmIixlbnZtYXBfcGh5c2ljYWxfcGFyc19mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKVxuXHQjaWZkZWYgRU5WTUFQX01PREVfUkVGUkFDVElPTlxuXHRcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xuXHQjZW5kaWZcblx0dmVjMyBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGdlb21ldHJ5Lm5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0XHR2ZWMzIHF1ZXJ5VmVjID0gdmVjMyggZmxpcEVudk1hcCAqIHdvcmxkTm9ybWFsLngsIHdvcmxkTm9ybWFsLnl6ICk7XG5cdFx0XHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZUxvZEVYVCggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcblx0XHRcdCNlbHNlXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcblx0XHRcdCNlbmRpZlxuXHRcdFx0ZW52TWFwQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XG5cdFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVViggZW52TWFwLCB3b3JsZE5vcm1hbCwgMS4wICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZlYzQgZW52TWFwQ29sb3IgPSB2ZWM0KCAwLjAgKTtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gUEkgKiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7XG5cdH1cblx0ZmxvYXQgZ2V0U3BlY3VsYXJNSVBMZXZlbCggY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XG5cdFx0ZmxvYXQgbWF4TUlQTGV2ZWxTY2FsYXIgPSBmbG9hdCggbWF4TUlQTGV2ZWwgKTtcblx0XHRmbG9hdCBzaWdtYSA9IFBJICogcm91Z2huZXNzICogcm91Z2huZXNzIC8gKCAxLjAgKyByb3VnaG5lc3MgKTtcblx0XHRmbG9hdCBkZXNpcmVkTUlQTGV2ZWwgPSBtYXhNSVBMZXZlbFNjYWxhciArIGxvZzIoIHNpZ21hICk7XG5cdFx0cmV0dXJuIGNsYW1wKCBkZXNpcmVkTUlQTGV2ZWwsIDAuMCwgbWF4TUlQTGV2ZWxTY2FsYXIgKTtcblx0fVxuXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcblx0XHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxuXHRcdFx0dmVjMyByZWZsZWN0VmVjID0gcmVmbGVjdCggLXZpZXdEaXIsIG5vcm1hbCApO1xuXHRcdFx0cmVmbGVjdFZlYyA9IG5vcm1hbGl6ZSggbWl4KCByZWZsZWN0VmVjLCBub3JtYWwsIHJvdWdobmVzcyAqIHJvdWdobmVzcykgKTtcblx0XHQjZWxzZVxuXHRcdFx0dmVjMyByZWZsZWN0VmVjID0gcmVmcmFjdCggLXZpZXdEaXIsIG5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XG5cdFx0I2VuZGlmXG5cdFx0cmVmbGVjdFZlYyA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHJlZmxlY3RWZWMsIHZpZXdNYXRyaXggKTtcblx0XHRmbG9hdCBzcGVjdWxhck1JUExldmVsID0gZ2V0U3BlY3VsYXJNSVBMZXZlbCggcm91Z2huZXNzLCBtYXhNSVBMZXZlbCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0XHR2ZWMzIHF1ZXJ5UmVmbGVjdFZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlTG9kRVhUKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIHJlZmxlY3RWZWMsIHJvdWdobmVzcyApO1xuXHRcdCNlbmRpZlxuXHRcdHJldHVybiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7XG5cdH1cbiNlbmRpZiIsZW52bWFwX3ZlcnRleDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdHZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbi54eXo7XG5cdCNlbHNlXG5cdFx0dmVjMyBjYW1lcmFUb1ZlcnRleDtcblx0XHRpZiAoIGlzT3J0aG9ncmFwaGljICkge1xuXHRcdFx0Y2FtZXJhVG9WZXJ0ZXggPSBub3JtYWxpemUoIHZlYzMoIC0gdmlld01hdHJpeFsgMCBdWyAyIF0sIC0gdmlld01hdHJpeFsgMSBdWyAyIF0sIC0gdmlld01hdHJpeFsgMiBdWyAyIF0gKSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjYW1lcmFUb1ZlcnRleCA9IG5vcm1hbGl6ZSggd29ybGRQb3NpdGlvbi54eXogLSBjYW1lcmFQb3NpdGlvbiApO1xuXHRcdH1cblx0XHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggdHJhbnNmb3JtZWROb3JtYWwsIHZpZXdNYXRyaXggKTtcblx0XHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxuXHRcdFx0dlJlZmxlY3QgPSByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTtcblx0XHQjZWxzZVxuXHRcdFx0dlJlZmxlY3QgPSByZWZyYWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xuXHRcdCNlbmRpZlxuXHQjZW5kaWZcbiNlbmRpZiIsZm9nX3ZlcnRleDoiI2lmZGVmIFVTRV9GT0dcblx0Zm9nRGVwdGggPSAtIG12UG9zaXRpb24uejtcbiNlbmRpZiIsZm9nX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX0ZPR1xuXHR2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoO1xuI2VuZGlmIixmb2dfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRk9HXG5cdCNpZmRlZiBGT0dfRVhQMlxuXHRcdGZsb2F0IGZvZ0ZhY3RvciA9IDEuMCAtIGV4cCggLSBmb2dEZW5zaXR5ICogZm9nRGVuc2l0eSAqIGZvZ0RlcHRoICogZm9nRGVwdGggKTtcblx0I2Vsc2Vcblx0XHRmbG9hdCBmb2dGYWN0b3IgPSBzbW9vdGhzdGVwKCBmb2dOZWFyLCBmb2dGYXIsIGZvZ0RlcHRoICk7XG5cdCNlbmRpZlxuXHRnbF9GcmFnQ29sb3IucmdiID0gbWl4KCBnbF9GcmFnQ29sb3IucmdiLCBmb2dDb2xvciwgZm9nRmFjdG9yICk7XG4jZW5kaWYiLGZvZ19wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0ZPR1xuXHR1bmlmb3JtIHZlYzMgZm9nQ29sb3I7XG5cdHZhcnlpbmcgZmxvYXQgZm9nRGVwdGg7XG5cdCNpZmRlZiBGT0dfRVhQMlxuXHRcdHVuaWZvcm0gZmxvYXQgZm9nRGVuc2l0eTtcblx0I2Vsc2Vcblx0XHR1bmlmb3JtIGZsb2F0IGZvZ05lYXI7XG5cdFx0dW5pZm9ybSBmbG9hdCBmb2dGYXI7XG5cdCNlbmRpZlxuI2VuZGlmIixncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0dSQURJRU5UTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGdyYWRpZW50TWFwO1xuI2VuZGlmXG52ZWMzIGdldEdyYWRpZW50SXJyYWRpYW5jZSggdmVjMyBub3JtYWwsIHZlYzMgbGlnaHREaXJlY3Rpb24gKSB7XG5cdGZsb2F0IGRvdE5MID0gZG90KCBub3JtYWwsIGxpZ2h0RGlyZWN0aW9uICk7XG5cdHZlYzIgY29vcmQgPSB2ZWMyKCBkb3ROTCAqIDAuNSArIDAuNSwgMC4wICk7XG5cdCNpZmRlZiBVU0VfR1JBRElFTlRNQVBcblx0XHRyZXR1cm4gdGV4dHVyZTJEKCBncmFkaWVudE1hcCwgY29vcmQgKS5yZ2I7XG5cdCNlbHNlXG5cdFx0cmV0dXJuICggY29vcmQueCA8IDAuNyApID8gdmVjMyggMC43ICkgOiB2ZWMzKCAxLjAgKTtcblx0I2VuZGlmXG59IixsaWdodG1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9MSUdIVE1BUFxuXHR2ZWM0IGxpZ2h0TWFwVGV4ZWw9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKTtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IFBJICogbGlnaHRNYXBUZXhlbFRvTGluZWFyKCBsaWdodE1hcFRleGVsICkucmdiICogbGlnaHRNYXBJbnRlbnNpdHk7XG4jZW5kaWYiLGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTElHSFRNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbGlnaHRNYXA7XG5cdHVuaWZvcm0gZmxvYXQgbGlnaHRNYXBJbnRlbnNpdHk7XG4jZW5kaWYiLGxpZ2h0c19sYW1iZXJ0X3ZlcnRleDoidmVjMyBkaWZmdXNlID0gdmVjMyggMS4wICk7XG5HZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5O1xuZ2VvbWV0cnkucG9zaXRpb24gPSBtdlBvc2l0aW9uLnh5ejtcbmdlb21ldHJ5Lm5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcbmdlb21ldHJ5LnZpZXdEaXIgPSAoIGlzT3J0aG9ncmFwaGljICkgPyB2ZWMzKCAwLCAwLCAxICkgOiBub3JtYWxpemUoIC1tdlBvc2l0aW9uLnh5eiApO1xuR2VvbWV0cmljQ29udGV4dCBiYWNrR2VvbWV0cnk7XG5iYWNrR2VvbWV0cnkucG9zaXRpb24gPSBnZW9tZXRyeS5wb3NpdGlvbjtcbmJhY2tHZW9tZXRyeS5ub3JtYWwgPSAtZ2VvbWV0cnkubm9ybWFsO1xuYmFja0dlb21ldHJ5LnZpZXdEaXIgPSBnZW9tZXRyeS52aWV3RGlyO1xudkxpZ2h0RnJvbnQgPSB2ZWMzKCAwLjAgKTtcbnZJbmRpcmVjdEZyb250ID0gdmVjMyggMC4wICk7XG4jaWZkZWYgRE9VQkxFX1NJREVEXG5cdHZMaWdodEJhY2sgPSB2ZWMzKCAwLjAgKTtcblx0dkluZGlyZWN0QmFjayA9IHZlYzMoIDAuMCApO1xuI2VuZGlmXG5JbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0O1xuZmxvYXQgZG90Tkw7XG52ZWMzIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcbnZJbmRpcmVjdEZyb250ICs9IGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7XG52SW5kaXJlY3RGcm9udCArPSBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggbGlnaHRQcm9iZSwgZ2VvbWV0cnkgKTtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dkluZGlyZWN0QmFjayArPSBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xuXHR2SW5kaXJlY3RCYWNrICs9IGdldExpZ2h0UHJvYmVJcnJhZGlhbmNlKCBsaWdodFByb2JlLCBiYWNrR2VvbWV0cnkgKTtcbiNlbmRpZlxuI2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggcG9pbnRMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0ZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHR2TGlnaHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2TGlnaHRCYWNrICs9IHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjZW5kaWZcblx0fVxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuI2VuZGlmXG4jaWYgTlVNX1NQT1RfTElHSFRTID4gMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSA9IFBJICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0dkxpZ2h0RnJvbnQgKz0gc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2VuZGlmXG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcbiNlbmRpZlxuI2lmIE5VTV9ESVJfTElHSFRTID4gMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xuXHRcdGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHRkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgPSBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdHZMaWdodEZyb250ICs9IHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZMaWdodEJhY2sgKz0gc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNlbmRpZlxuXHR9XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG4jZW5kaWZcbiNpZiBOVU1fSEVNSV9MSUdIVFMgPiAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xuXHRcdHZJbmRpcmVjdEZyb250ICs9IGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkgKTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2SW5kaXJlY3RCYWNrICs9IGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgYmFja0dlb21ldHJ5ICk7XG5cdFx0I2VuZGlmXG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcbiNlbmRpZiIsbGlnaHRzX3BhcnNfYmVnaW46InVuaWZvcm0gYm9vbCByZWNlaXZlU2hhZG93O1xudW5pZm9ybSB2ZWMzIGFtYmllbnRMaWdodENvbG9yO1xudW5pZm9ybSB2ZWMzIGxpZ2h0UHJvYmVbIDkgXTtcbnZlYzMgc2hHZXRJcnJhZGlhbmNlQXQoIGluIHZlYzMgbm9ybWFsLCBpbiB2ZWMzIHNoQ29lZmZpY2llbnRzWyA5IF0gKSB7XG5cdGZsb2F0IHggPSBub3JtYWwueCwgeSA9IG5vcm1hbC55LCB6ID0gbm9ybWFsLno7XG5cdHZlYzMgcmVzdWx0ID0gc2hDb2VmZmljaWVudHNbIDAgXSAqIDAuODg2MjI3O1xuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDEgXSAqIDIuMCAqIDAuNTExNjY0ICogeTtcblx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyAyIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHo7XG5cdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgMyBdICogMi4wICogMC41MTE2NjQgKiB4O1xuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDQgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHk7XG5cdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNSBdICogMi4wICogMC40MjkwNDMgKiB5ICogejtcblx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA2IF0gKiAoIDAuNzQzMTI1ICogeiAqIHogLSAwLjI0NzcwOCApO1xuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDcgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHo7XG5cdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgOCBdICogMC40MjkwNDMgKiAoIHggKiB4IC0geSAqIHkgKTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cbnZlYzMgZ2V0TGlnaHRQcm9iZUlycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgbGlnaHRQcm9iZVsgOSBdLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5ICkge1xuXHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggZ2VvbWV0cnkubm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdHZlYzMgaXJyYWRpYW5jZSA9IHNoR2V0SXJyYWRpYW5jZUF0KCB3b3JsZE5vcm1hbCwgbGlnaHRQcm9iZSApO1xuXHRyZXR1cm4gaXJyYWRpYW5jZTtcbn1cbnZlYzMgZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBhbWJpZW50TGlnaHRDb2xvciApIHtcblx0dmVjMyBpcnJhZGlhbmNlID0gYW1iaWVudExpZ2h0Q29sb3I7XG5cdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdGlycmFkaWFuY2UgKj0gUEk7XG5cdCNlbmRpZlxuXHRyZXR1cm4gaXJyYWRpYW5jZTtcbn1cbiNpZiBOVU1fRElSX0xJR0hUUyA+IDBcblx0c3RydWN0IERpcmVjdGlvbmFsTGlnaHQge1xuXHRcdHZlYzMgZGlyZWN0aW9uO1xuXHRcdHZlYzMgY29sb3I7XG5cdH07XG5cdHVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0c1sgTlVNX0RJUl9MSUdIVFMgXTtcblx0dm9pZCBnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gRGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCApIHtcblx0XHRkaXJlY3RMaWdodC5jb2xvciA9IGRpcmVjdGlvbmFsTGlnaHQuY29sb3I7XG5cdFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gZGlyZWN0aW9uYWxMaWdodC5kaXJlY3Rpb247XG5cdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9IHRydWU7XG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXG5cdHN0cnVjdCBQb2ludExpZ2h0IHtcblx0XHR2ZWMzIHBvc2l0aW9uO1xuXHRcdHZlYzMgY29sb3I7XG5cdFx0ZmxvYXQgZGlzdGFuY2U7XG5cdFx0ZmxvYXQgZGVjYXk7XG5cdH07XG5cdHVuaWZvcm0gUG9pbnRMaWdodCBwb2ludExpZ2h0c1sgTlVNX1BPSU5UX0xJR0hUUyBdO1xuXHR2b2lkIGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBQb2ludExpZ2h0IHBvaW50TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICkge1xuXHRcdHZlYzMgbFZlY3RvciA9IHBvaW50TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeS5wb3NpdGlvbjtcblx0XHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUoIGxWZWN0b3IgKTtcblx0XHRmbG9hdCBsaWdodERpc3RhbmNlID0gbGVuZ3RoKCBsVmVjdG9yICk7XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBwb2ludExpZ2h0LmNvbG9yO1xuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICo9IHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGxpZ2h0RGlzdGFuY2UsIHBvaW50TGlnaHQuZGlzdGFuY2UsIHBvaW50TGlnaHQuZGVjYXkgKTtcblx0XHRkaXJlY3RMaWdodC52aXNpYmxlID0gKCBkaXJlY3RMaWdodC5jb2xvciAhPSB2ZWMzKCAwLjAgKSApO1xuXHR9XG4jZW5kaWZcbiNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXG5cdHN0cnVjdCBTcG90TGlnaHQge1xuXHRcdHZlYzMgcG9zaXRpb247XG5cdFx0dmVjMyBkaXJlY3Rpb247XG5cdFx0dmVjMyBjb2xvcjtcblx0XHRmbG9hdCBkaXN0YW5jZTtcblx0XHRmbG9hdCBkZWNheTtcblx0XHRmbG9hdCBjb25lQ29zO1xuXHRcdGZsb2F0IHBlbnVtYnJhQ29zO1xuXHR9O1xuXHR1bmlmb3JtIFNwb3RMaWdodCBzcG90TGlnaHRzWyBOVU1fU1BPVF9MSUdIVFMgXTtcblx0dm9pZCBnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBTcG90TGlnaHQgc3BvdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCApIHtcblx0XHR2ZWMzIGxWZWN0b3IgPSBzcG90TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeS5wb3NpdGlvbjtcblx0XHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUoIGxWZWN0b3IgKTtcblx0XHRmbG9hdCBsaWdodERpc3RhbmNlID0gbGVuZ3RoKCBsVmVjdG9yICk7XG5cdFx0ZmxvYXQgYW5nbGVDb3MgPSBkb3QoIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgc3BvdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGlmICggYW5nbGVDb3MgPiBzcG90TGlnaHQuY29uZUNvcyApIHtcblx0XHRcdGZsb2F0IHNwb3RFZmZlY3QgPSBzbW9vdGhzdGVwKCBzcG90TGlnaHQuY29uZUNvcywgc3BvdExpZ2h0LnBlbnVtYnJhQ29zLCBhbmdsZUNvcyApO1xuXHRcdFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBzcG90TGlnaHQuY29sb3I7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciAqPSBzcG90RWZmZWN0ICogcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggbGlnaHREaXN0YW5jZSwgc3BvdExpZ2h0LmRpc3RhbmNlLCBzcG90TGlnaHQuZGVjYXkgKTtcblx0XHRcdGRpcmVjdExpZ2h0LnZpc2libGUgPSB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciA9IHZlYzMoIDAuMCApO1xuXHRcdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9IGZhbHNlO1xuXHRcdH1cblx0fVxuI2VuZGlmXG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwXG5cdHN0cnVjdCBSZWN0QXJlYUxpZ2h0IHtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdHZlYzMgcG9zaXRpb247XG5cdFx0dmVjMyBoYWxmV2lkdGg7XG5cdFx0dmVjMyBoYWxmSGVpZ2h0O1xuXHR9O1xuXHR1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMTtcdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18yO1xuXHR1bmlmb3JtIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodHNbIE5VTV9SRUNUX0FSRUFfTElHSFRTIF07XG4jZW5kaWZcbiNpZiBOVU1fSEVNSV9MSUdIVFMgPiAwXG5cdHN0cnVjdCBIZW1pc3BoZXJlTGlnaHQge1xuXHRcdHZlYzMgZGlyZWN0aW9uO1xuXHRcdHZlYzMgc2t5Q29sb3I7XG5cdFx0dmVjMyBncm91bmRDb2xvcjtcblx0fTtcblx0dW5pZm9ybSBIZW1pc3BoZXJlTGlnaHQgaGVtaXNwaGVyZUxpZ2h0c1sgTlVNX0hFTUlfTElHSFRTIF07XG5cdHZlYzMgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gSGVtaXNwaGVyZUxpZ2h0IGhlbWlMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSApIHtcblx0XHRmbG9hdCBkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoZW1pTGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZmxvYXQgaGVtaURpZmZ1c2VXZWlnaHQgPSAwLjUgKiBkb3ROTCArIDAuNTtcblx0XHR2ZWMzIGlycmFkaWFuY2UgPSBtaXgoIGhlbWlMaWdodC5ncm91bmRDb2xvciwgaGVtaUxpZ2h0LnNreUNvbG9yLCBoZW1pRGlmZnVzZVdlaWdodCApO1xuXHRcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdFx0aXJyYWRpYW5jZSAqPSBQSTtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gaXJyYWRpYW5jZTtcblx0fVxuI2VuZGlmIixsaWdodHNfdG9vbl9mcmFnbWVudDoiVG9vbk1hdGVyaWFsIG1hdGVyaWFsO1xubWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYjsiLGxpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQ6InZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuc3RydWN0IFRvb25NYXRlcmlhbCB7XG5cdHZlYzMgZGlmZnVzZUNvbG9yO1xufTtcbnZvaWQgUkVfRGlyZWN0X1Rvb24oIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFRvb25NYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdHZlYzMgaXJyYWRpYW5jZSA9IGdldEdyYWRpZW50SXJyYWRpYW5jZSggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRpcnJhZGlhbmNlICo9IFBJO1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xufVxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfVG9vbiggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBUb29uTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbiNkZWZpbmUgUkVfRGlyZWN0XHRcdFx0XHRSRV9EaXJlY3RfVG9vblxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcdFx0UkVfSW5kaXJlY3REaWZmdXNlX1Rvb25cbiNkZWZpbmUgTWF0ZXJpYWxfTGlnaHRQcm9iZUxPRCggbWF0ZXJpYWwgKVx0KDApIixsaWdodHNfcGhvbmdfZnJhZ21lbnQ6IkJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbDtcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2I7XG5tYXRlcmlhbC5zcGVjdWxhckNvbG9yID0gc3BlY3VsYXI7XG5tYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyA9IHNoaW5pbmVzcztcbm1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGggPSBzcGVjdWxhclN0cmVuZ3RoOyIsbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQ6InZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuc3RydWN0IEJsaW5uUGhvbmdNYXRlcmlhbCB7XG5cdHZlYzMgZGlmZnVzZUNvbG9yO1xuXHR2ZWMzIHNwZWN1bGFyQ29sb3I7XG5cdGZsb2F0IHNwZWN1bGFyU2hpbmluZXNzO1xuXHRmbG9hdCBzcGVjdWxhclN0cmVuZ3RoO1xufTtcbnZvaWQgUkVfRGlyZWN0X0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xuXHR2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRpcnJhZGlhbmNlICo9IFBJO1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9CbGlublBob25nKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzICkgKiBtYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoO1xufVxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfQmxpbm5QaG9uZyggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbiNkZWZpbmUgUkVfRGlyZWN0XHRcdFx0XHRSRV9EaXJlY3RfQmxpbm5QaG9uZ1xuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcdFx0UkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmdcbiNkZWZpbmUgTWF0ZXJpYWxfTGlnaHRQcm9iZUxPRCggbWF0ZXJpYWwgKVx0KDApIixsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQ6IlBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWw7XG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiICogKCAxLjAgLSBtZXRhbG5lc3NGYWN0b3IgKTtcbnZlYzMgZHh5ID0gbWF4KCBhYnMoIGRGZHgoIGdlb21ldHJ5Tm9ybWFsICkgKSwgYWJzKCBkRmR5KCBnZW9tZXRyeU5vcm1hbCApICkgKTtcbmZsb2F0IGdlb21ldHJ5Um91Z2huZXNzID0gbWF4KCBtYXgoIGR4eS54LCBkeHkueSApLCBkeHkueiApO1xubWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgPSBtYXgoIHJvdWdobmVzc0ZhY3RvciwgMC4wNTI1ICk7bWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgKz0gZ2VvbWV0cnlSb3VnaG5lc3M7XG5tYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyA9IG1pbiggbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MsIDEuMCApO1xuI2lmZGVmIFJFRkxFQ1RJVklUWVxuXHQjaWZkZWYgU1BFQ1VMQVJcblx0XHR2ZWMzIHNwZWN1bGFySW50ZW5zaXR5RmFjdG9yID0gdmVjMyggc3BlY3VsYXJJbnRlbnNpdHkgKTtcblx0XHR2ZWMzIHNwZWN1bGFyVGludEZhY3RvciA9IHNwZWN1bGFyVGludDtcblx0XHQjaWZkZWYgVVNFX1NQRUNVTEFSSU5URU5TSVRZTUFQXG5cdFx0XHRzcGVjdWxhckludGVuc2l0eUZhY3RvciAqPSB0ZXh0dXJlMkQoIHNwZWN1bGFySW50ZW5zaXR5TWFwLCB2VXYgKS5hO1xuXHRcdCNlbmRpZlxuXHRcdCNpZmRlZiBVU0VfU1BFQ1VMQVJUSU5UTUFQXG5cdFx0XHRzcGVjdWxhclRpbnRGYWN0b3IgKj0gc3BlY3VsYXJUaW50TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEKCBzcGVjdWxhclRpbnRNYXAsIHZVdiApICkucmdiO1xuXHRcdCNlbmRpZlxuXHRcdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3JGOTAgPSBtaXgoIHNwZWN1bGFySW50ZW5zaXR5RmFjdG9yLCB2ZWMzKCAxLjAgKSwgbWV0YWxuZXNzRmFjdG9yICk7XG5cdCNlbHNlXG5cdFx0dmVjMyBzcGVjdWxhckludGVuc2l0eUZhY3RvciA9IHZlYzMoIDEuMCApO1xuXHRcdHZlYzMgc3BlY3VsYXJUaW50RmFjdG9yID0gdmVjMyggMS4wICk7XG5cdFx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvckY5MCA9IHZlYzMoIDEuMCApO1xuXHQjZW5kaWZcblx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IG1peCggbWluKCB2ZWMzKCBNQVhJTVVNX1NQRUNVTEFSX0NPRUZGSUNJRU5UICogcG93MiggcmVmbGVjdGl2aXR5ICkgKSAqIHNwZWN1bGFyVGludEZhY3RvciwgdmVjMyggMS4wICkgKSAqIHNwZWN1bGFySW50ZW5zaXR5RmFjdG9yLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcbiNlbHNlXG5cdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7XG5cdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3JGOTAgPSB2ZWMzKCAxLjAgKTtcbiNlbmRpZlxuI2lmZGVmIENMRUFSQ09BVFxuXHRtYXRlcmlhbC5jbGVhcmNvYXQgPSBjbGVhcmNvYXQ7XG5cdG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IGNsZWFyY29hdFJvdWdobmVzcztcblx0I2lmZGVmIFVTRV9DTEVBUkNPQVRNQVBcblx0XHRtYXRlcmlhbC5jbGVhcmNvYXQgKj0gdGV4dHVyZTJEKCBjbGVhcmNvYXRNYXAsIHZVdiApLng7XG5cdCNlbmRpZlxuXHQjaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVBcblx0XHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKj0gdGV4dHVyZTJEKCBjbGVhcmNvYXRSb3VnaG5lc3NNYXAsIHZVdiApLnk7XG5cdCNlbmRpZlxuXHRtYXRlcmlhbC5jbGVhcmNvYXQgPSBzYXR1cmF0ZSggbWF0ZXJpYWwuY2xlYXJjb2F0ICk7XHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgPSBtYXgoIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgMC4wNTI1ICk7XG5cdG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyArPSBnZW9tZXRyeVJvdWdobmVzcztcblx0bWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzID0gbWluKCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIDEuMCApO1xuI2VuZGlmXG4jaWZkZWYgVVNFX1NIRUVOXG5cdG1hdGVyaWFsLnNoZWVuQ29sb3IgPSBzaGVlbjtcbiNlbmRpZiIsbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ6InN0cnVjdCBQaHlzaWNhbE1hdGVyaWFsIHtcblx0dmVjMyBkaWZmdXNlQ29sb3I7XG5cdGZsb2F0IHNwZWN1bGFyUm91Z2huZXNzO1xuXHR2ZWMzIHNwZWN1bGFyQ29sb3I7XG5cdHZlYzMgc3BlY3VsYXJDb2xvckY5MDtcbiNpZmRlZiBDTEVBUkNPQVRcblx0ZmxvYXQgY2xlYXJjb2F0O1xuXHRmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7XG4jZW5kaWZcbiNpZmRlZiBVU0VfU0hFRU5cblx0dmVjMyBzaGVlbkNvbG9yO1xuI2VuZGlmXG59O1xuI2RlZmluZSBNQVhJTVVNX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMTZcbiNkZWZpbmUgREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCAwLjA0XG5mbG9hdCBjbGVhcmNvYXRESFJBcHByb3goIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkwgKSB7XG5cdHJldHVybiBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICsgKCAxLjAgLSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICkgKiAoIHBvdyggMS4wIC0gZG90TkwsIDUuMCApICogcG93KCAxLjAgLSByb3VnaG5lc3MsIDIuMCApICk7XG59XG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwXG5cdHZvaWQgUkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsKCBjb25zdCBpbiBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRcdHZlYzMgbm9ybWFsID0gZ2VvbWV0cnkubm9ybWFsO1xuXHRcdHZlYzMgdmlld0RpciA9IGdlb21ldHJ5LnZpZXdEaXI7XG5cdFx0dmVjMyBwb3NpdGlvbiA9IGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdHZlYzMgbGlnaHRQb3MgPSByZWN0QXJlYUxpZ2h0LnBvc2l0aW9uO1xuXHRcdHZlYzMgaGFsZldpZHRoID0gcmVjdEFyZWFMaWdodC5oYWxmV2lkdGg7XG5cdFx0dmVjMyBoYWxmSGVpZ2h0ID0gcmVjdEFyZWFMaWdodC5oYWxmSGVpZ2h0O1xuXHRcdHZlYzMgbGlnaHRDb2xvciA9IHJlY3RBcmVhTGlnaHQuY29sb3I7XG5cdFx0ZmxvYXQgcm91Z2huZXNzID0gbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3M7XG5cdFx0dmVjMyByZWN0Q29vcmRzWyA0IF07XG5cdFx0cmVjdENvb3Jkc1sgMCBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1x0XHRyZWN0Q29vcmRzWyAxIF0gPSBsaWdodFBvcyAtIGhhbGZXaWR0aCAtIGhhbGZIZWlnaHQ7XG5cdFx0cmVjdENvb3Jkc1sgMiBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xuXHRcdHJlY3RDb29yZHNbIDMgXSA9IGxpZ2h0UG9zICsgaGFsZldpZHRoICsgaGFsZkhlaWdodDtcblx0XHR2ZWMyIHV2ID0gTFRDX1V2KCBub3JtYWwsIHZpZXdEaXIsIHJvdWdobmVzcyApO1xuXHRcdHZlYzQgdDEgPSB0ZXh0dXJlMkQoIGx0Y18xLCB1diApO1xuXHRcdHZlYzQgdDIgPSB0ZXh0dXJlMkQoIGx0Y18yLCB1diApO1xuXHRcdG1hdDMgbUludiA9IG1hdDMoXG5cdFx0XHR2ZWMzKCB0MS54LCAwLCB0MS55ICksXG5cdFx0XHR2ZWMzKCAgICAwLCAxLCAgICAwICksXG5cdFx0XHR2ZWMzKCB0MS56LCAwLCB0MS53IClcblx0XHQpO1xuXHRcdHZlYzMgZnJlc25lbCA9ICggbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciAqIHQyLnggKyAoIHZlYzMoIDEuMCApIC0gbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciApICogdDIueSApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGxpZ2h0Q29sb3IgKiBmcmVzbmVsICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtSW52LCByZWN0Q29vcmRzICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBsaWdodENvbG9yICogbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtYXQzKCAxLjAgKSwgcmVjdENvb3JkcyApO1xuXHR9XG4jZW5kaWZcbnZvaWQgUkVfRGlyZWN0X1BoeXNpY2FsKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdHZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdGlycmFkaWFuY2UgKj0gUEk7XG5cdCNlbmRpZlxuXHQjaWZkZWYgQ0xFQVJDT0FUXG5cdFx0ZmxvYXQgY2NEb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0XHR2ZWMzIGNjSXJyYWRpYW5jZSA9IGNjRG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRcdGNjSXJyYWRpYW5jZSAqPSBQSTtcblx0XHQjZW5kaWZcblx0XHRmbG9hdCBjbGVhcmNvYXRESFIgPSBtYXRlcmlhbC5jbGVhcmNvYXQgKiBjbGVhcmNvYXRESFJBcHByb3goIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgY2NEb3ROTCApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGNjSXJyYWRpYW5jZSAqIG1hdGVyaWFsLmNsZWFyY29hdCAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIHZlYzMoIDEuMCApLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTtcblx0I2Vsc2Vcblx0XHRmbG9hdCBjbGVhcmNvYXRESFIgPSAwLjA7XG5cdCNlbmRpZlxuXHQjaWZkZWYgVVNFX1NIRUVOXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gKCAxLjAgLSBjbGVhcmNvYXRESFIgKSAqIGlycmFkaWFuY2UgKiBCUkRGX1NwZWN1bGFyX1NoZWVuKFxuXHRcdFx0bWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MsXG5cdFx0XHRkaXJlY3RMaWdodC5kaXJlY3Rpb24sXG5cdFx0XHRnZW9tZXRyeSxcblx0XHRcdG1hdGVyaWFsLnNoZWVuQ29sb3Jcblx0XHQpO1xuXHQjZWxzZVxuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9ICggMS4wIC0gY2xlYXJjb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9HR1goIGRpcmVjdExpZ2h0LCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5ub3JtYWwsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3JGOTAsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzKTtcblx0I2VuZGlmXG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gKCAxLjAgLSBjbGVhcmNvYXRESFIgKSAqIGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG59XG52b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG59XG52b2lkIFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgcmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBjbGVhcmNvYXRSYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQpIHtcblx0I2lmZGVmIENMRUFSQ09BVFxuXHRcdGZsb2F0IGNjRG90TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIgKSApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gY2xlYXJjb2F0UmFkaWFuY2UgKiBtYXRlcmlhbC5jbGVhcmNvYXQgKiBCUkRGX1NwZWN1bGFyX0dHWF9FbnZpcm9ubWVudCggZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyApO1xuXHRcdGZsb2F0IGNjRG90TkwgPSBjY0RvdE5WO1xuXHRcdGZsb2F0IGNsZWFyY29hdERIUiA9IG1hdGVyaWFsLmNsZWFyY29hdCAqIGNsZWFyY29hdERIUkFwcHJveCggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCBjY0RvdE5MICk7XG5cdCNlbHNlXG5cdFx0ZmxvYXQgY2xlYXJjb2F0REhSID0gMC4wO1xuXHQjZW5kaWZcblx0ZmxvYXQgY2xlYXJjb2F0SW52ID0gMS4wIC0gY2xlYXJjb2F0REhSO1xuXHR2ZWMzIHNpbmdsZVNjYXR0ZXJpbmcgPSB2ZWMzKCAwLjAgKTtcblx0dmVjMyBtdWx0aVNjYXR0ZXJpbmcgPSB2ZWMzKCAwLjAgKTtcblx0dmVjMyBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2UgPSBpcnJhZGlhbmNlICogUkVDSVBST0NBTF9QSTtcblx0QlJERl9TcGVjdWxhcl9NdWx0aXNjYXR0ZXJpbmdfRW52aXJvbm1lbnQoIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcywgc2luZ2xlU2NhdHRlcmluZywgbXVsdGlTY2F0dGVyaW5nICk7XG5cdHZlYzMgZGlmZnVzZSA9IG1hdGVyaWFsLmRpZmZ1c2VDb2xvciAqICggMS4wIC0gKCBzaW5nbGVTY2F0dGVyaW5nICsgbXVsdGlTY2F0dGVyaW5nICkgKTtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArPSBjbGVhcmNvYXRJbnYgKiByYWRpYW5jZSAqIHNpbmdsZVNjYXR0ZXJpbmc7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gbXVsdGlTY2F0dGVyaW5nICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlO1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gZGlmZnVzZSAqIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZTtcbn1cbiNkZWZpbmUgUkVfRGlyZWN0XHRcdFx0XHRSRV9EaXJlY3RfUGh5c2ljYWxcbiNkZWZpbmUgUkVfRGlyZWN0X1JlY3RBcmVhXHRcdFJFX0RpcmVjdF9SZWN0QXJlYV9QaHlzaWNhbFxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcdFx0UkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsXG4jZGVmaW5lIFJFX0luZGlyZWN0U3BlY3VsYXJcdFx0UkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbFxuZmxvYXQgY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgYW1iaWVudE9jY2x1c2lvbiwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRyZXR1cm4gc2F0dXJhdGUoIHBvdyggZG90TlYgKyBhbWJpZW50T2NjbHVzaW9uLCBleHAyKCAtIDE2LjAgKiByb3VnaG5lc3MgLSAxLjAgKSApIC0gMS4wICsgYW1iaWVudE9jY2x1c2lvbiApO1xufSIsbGlnaHRzX2ZyYWdtZW50X2JlZ2luOiJcbkdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnk7XG5nZW9tZXRyeS5wb3NpdGlvbiA9IC0gdlZpZXdQb3NpdGlvbjtcbmdlb21ldHJ5Lm5vcm1hbCA9IG5vcm1hbDtcbmdlb21ldHJ5LnZpZXdEaXIgPSAoIGlzT3J0aG9ncmFwaGljICkgPyB2ZWMzKCAwLCAwLCAxICkgOiBub3JtYWxpemUoIHZWaWV3UG9zaXRpb24gKTtcbiNpZmRlZiBDTEVBUkNPQVRcblx0Z2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsID0gY2xlYXJjb2F0Tm9ybWFsO1xuI2VuZGlmXG5JbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0O1xuI2lmICggTlVNX1BPSU5UX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxuXHRQb2ludExpZ2h0IHBvaW50TGlnaHQ7XG5cdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwXG5cdFBvaW50TGlnaHRTaGFkb3cgcG9pbnRMaWdodFNoYWRvdztcblx0I2VuZGlmXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcblx0XHRwb2ludExpZ2h0ID0gcG9pbnRMaWdodHNbIGkgXTtcblx0XHRnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggcG9pbnRMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyApXG5cdFx0cG9pbnRMaWdodFNoYWRvdyA9IHBvaW50TGlnaHRTaGFkb3dzWyBpIF07XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggZGlyZWN0TGlnaHQudmlzaWJsZSwgcmVjZWl2ZVNoYWRvdyApICkgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd0JpYXMsIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7XG5cdFx0I2VuZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG4jZW5kaWZcbiNpZiAoIE5VTV9TUE9UX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxuXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xuXHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwXG5cdFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHRTaGFkb3c7XG5cdCNlbmRpZlxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHRzcG90TGlnaHQgPSBzcG90TGlnaHRzWyBpIF07XG5cdFx0Z2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggc3BvdExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKVxuXHRcdHNwb3RMaWdodFNoYWRvdyA9IHNwb3RMaWdodFNoYWRvd3NbIGkgXTtcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqPSBhbGwoIGJ2ZWMyKCBkaXJlY3RMaWdodC52aXNpYmxlLCByZWNlaXZlU2hhZG93ICkgKSA/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBzcG90TGlnaHRTaGFkb3cuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0U2hhZG93LnNoYWRvd0JpYXMsIHNwb3RMaWdodFNoYWRvdy5zaGFkb3dSYWRpdXMsIHZTcG90U2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xuXHRcdCNlbmRpZlxuXHRcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcblx0fVxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuI2VuZGlmXG4jaWYgKCBOVU1fRElSX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxuXHREaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQ7XG5cdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMFxuXHREaXJlY3Rpb25hbExpZ2h0U2hhZG93IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3c7XG5cdCNlbmRpZlxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xuXHRcdGRpcmVjdGlvbmFsTGlnaHQgPSBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdO1xuXHRcdGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBkaXJlY3Rpb25hbExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9ESVJfTElHSFRfU0hBRE9XUyApXG5cdFx0ZGlyZWN0aW9uYWxMaWdodFNoYWRvdyA9IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzWyBpIF07XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggZGlyZWN0TGlnaHQudmlzaWJsZSwgcmVjZWl2ZVNoYWRvdyApICkgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3cuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodFNoYWRvdy5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xuXHRcdCNlbmRpZlxuXHRcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcblx0fVxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuI2VuZGlmXG4jaWYgKCBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3RfUmVjdEFyZWEgKVxuXHRSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1JFQ1RfQVJFQV9MSUdIVFM7IGkgKysgKSB7XG5cdFx0cmVjdEFyZWFMaWdodCA9IHJlY3RBcmVhTGlnaHRzWyBpIF07XG5cdFx0UkVfRGlyZWN0X1JlY3RBcmVhKCByZWN0QXJlYUxpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXG5cdHZlYzMgaWJsSXJyYWRpYW5jZSA9IHZlYzMoIDAuMCApO1xuXHR2ZWMzIGlycmFkaWFuY2UgPSBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xuXHRpcnJhZGlhbmNlICs9IGdldExpZ2h0UHJvYmVJcnJhZGlhbmNlKCBsaWdodFByb2JlLCBnZW9tZXRyeSApO1xuXHQjaWYgKCBOVU1fSEVNSV9MSUdIVFMgPiAwIClcblx0XHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xuXHRcdFx0aXJyYWRpYW5jZSArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5ICk7XG5cdFx0fVxuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG5cdCNlbmRpZlxuI2VuZGlmXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXG5cdHZlYzMgcmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTtcblx0dmVjMyBjbGVhcmNvYXRSYWRpYW5jZSA9IHZlYzMoIDAuMCApO1xuI2VuZGlmIixsaWdodHNfZnJhZ21lbnRfbWFwczoiI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXG5cdCNpZmRlZiBVU0VfTElHSFRNQVBcblx0XHR2ZWM0IGxpZ2h0TWFwVGV4ZWw9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKTtcblx0XHR2ZWMzIGxpZ2h0TWFwSXJyYWRpYW5jZSA9IGxpZ2h0TWFwVGV4ZWxUb0xpbmVhciggbGlnaHRNYXBUZXhlbCApLnJnYiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xuXHRcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdFx0bGlnaHRNYXBJcnJhZGlhbmNlICo9IFBJO1xuXHRcdCNlbmRpZlxuXHRcdGlycmFkaWFuY2UgKz0gbGlnaHRNYXBJcnJhZGlhbmNlO1xuXHQjZW5kaWZcblx0I2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBTVEFOREFSRCApICYmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxuXHRcdGlibElycmFkaWFuY2UgKz0gZ2V0TGlnaHRQcm9iZUluZGlyZWN0SXJyYWRpYW5jZSggZ2VvbWV0cnksIG1heE1pcExldmVsICk7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxuXHRyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcywgbWF4TWlwTGV2ZWwgKTtcblx0I2lmZGVmIENMRUFSQ09BVFxuXHRcdGNsZWFyY29hdFJhZGlhbmNlICs9IGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgbWF4TWlwTGV2ZWwgKTtcblx0I2VuZGlmXG4jZW5kaWYiLGxpZ2h0c19mcmFnbWVudF9lbmQ6IiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHRSRV9JbmRpcmVjdERpZmZ1c2UoIGlycmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxuXHRSRV9JbmRpcmVjdFNwZWN1bGFyKCByYWRpYW5jZSwgaWJsSXJyYWRpYW5jZSwgY2xlYXJjb2F0UmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcbiNlbmRpZiIsbG9nZGVwdGhidWZfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUYgKSAmJiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUZfRVhUIClcblx0Z2xfRnJhZ0RlcHRoRVhUID0gdklzUGVyc3BlY3RpdmUgPT0gMC4wID8gZ2xfRnJhZ0Nvb3JkLnogOiBsb2cyKCB2RnJhZ0RlcHRoICkgKiBsb2dEZXB0aEJ1ZkZDICogMC41O1xuI2VuZGlmIixsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGICkgJiYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGX0VYVCApXG5cdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcblx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xuXHR2YXJ5aW5nIGZsb2F0IHZJc1BlcnNwZWN0aXZlO1xuI2VuZGlmIixsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxuXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxuXHRcdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDtcblx0XHR2YXJ5aW5nIGZsb2F0IHZJc1BlcnNwZWN0aXZlO1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcblx0I2VuZGlmXG4jZW5kaWYiLGxvZ2RlcHRoYnVmX3ZlcnRleDoiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxuXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxuXHRcdHZGcmFnRGVwdGggPSAxLjAgKyBnbF9Qb3NpdGlvbi53O1xuXHRcdHZJc1BlcnNwZWN0aXZlID0gZmxvYXQoIGlzUGVyc3BlY3RpdmVNYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKSApO1xuXHQjZWxzZVxuXHRcdGlmICggaXNQZXJzcGVjdGl2ZU1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApICkge1xuXHRcdFx0Z2xfUG9zaXRpb24ueiA9IGxvZzIoIG1heCggRVBTSUxPTiwgZ2xfUG9zaXRpb24udyArIDEuMCApICkgKiBsb2dEZXB0aEJ1ZkZDIC0gMS4wO1xuXHRcdFx0Z2xfUG9zaXRpb24ueiAqPSBnbF9Qb3NpdGlvbi53O1xuXHRcdH1cblx0I2VuZGlmXG4jZW5kaWYiLG1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dmVjNCB0ZXhlbENvbG9yID0gdGV4dHVyZTJEKCBtYXAsIHZVdiApO1xuXHR0ZXhlbENvbG9yID0gbWFwVGV4ZWxUb0xpbmVhciggdGV4ZWxDb2xvciApO1xuXHRkaWZmdXNlQ29sb3IgKj0gdGV4ZWxDb2xvcjtcbiNlbmRpZiIsbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIG1hcDtcbiNlbmRpZiIsbWFwX3BhcnRpY2xlX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApXG5cdHZlYzIgdXYgPSAoIHV2VHJhbnNmb3JtICogdmVjMyggZ2xfUG9pbnRDb29yZC54LCAxLjAgLSBnbF9Qb2ludENvb3JkLnksIDEgKSApLnh5O1xuI2VuZGlmXG4jaWZkZWYgVVNFX01BUFxuXHR2ZWM0IG1hcFRleGVsID0gdGV4dHVyZTJEKCBtYXAsIHV2ICk7XG5cdGRpZmZ1c2VDb2xvciAqPSBtYXBUZXhlbFRvTGluZWFyKCBtYXBUZXhlbCApO1xuI2VuZGlmXG4jaWZkZWYgVVNFX0FMUEhBTUFQXG5cdGRpZmZ1c2VDb2xvci5hICo9IHRleHR1cmUyRCggYWxwaGFNYXAsIHV2ICkuZztcbiNlbmRpZiIsbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQIClcblx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xuI2VuZGlmXG4jaWZkZWYgVVNFX01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XG4jZW5kaWZcbiNpZmRlZiBVU0VfQUxQSEFNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgYWxwaGFNYXA7XG4jZW5kaWYiLG1ldGFsbmVzc21hcF9mcmFnbWVudDoiZmxvYXQgbWV0YWxuZXNzRmFjdG9yID0gbWV0YWxuZXNzO1xuI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcblx0dmVjNCB0ZXhlbE1ldGFsbmVzcyA9IHRleHR1cmUyRCggbWV0YWxuZXNzTWFwLCB2VXYgKTtcblx0bWV0YWxuZXNzRmFjdG9yICo9IHRleGVsTWV0YWxuZXNzLmI7XG4jZW5kaWYiLG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX01FVEFMTkVTU01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBtZXRhbG5lc3NNYXA7XG4jZW5kaWYiLG1vcnBobm9ybWFsX3ZlcnRleDoiI2lmZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0b2JqZWN0Tm9ybWFsICo9IG1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZTtcblx0b2JqZWN0Tm9ybWFsICs9IG1vcnBoTm9ybWFsMCAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xuXHRvYmplY3ROb3JtYWwgKz0gbW9ycGhOb3JtYWwxICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAxIF07XG5cdG9iamVjdE5vcm1hbCArPSBtb3JwaE5vcm1hbDIgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcblx0b2JqZWN0Tm9ybWFsICs9IG1vcnBoTm9ybWFsMyAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMyBdO1xuI2VuZGlmIixtb3JwaHRhcmdldF9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcblx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7XG5cdCNpZm5kZWYgVVNFX01PUlBITk9STUFMU1xuXHRcdHVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA4IF07XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcblx0I2VuZGlmXG4jZW5kaWYiLG1vcnBodGFyZ2V0X3ZlcnRleDoiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcblx0dHJhbnNmb3JtZWQgKj0gbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlO1xuXHR0cmFuc2Zvcm1lZCArPSBtb3JwaFRhcmdldDAgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTtcblx0dHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQxICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAxIF07XG5cdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0MiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMiBdO1xuXHR0cmFuc2Zvcm1lZCArPSBtb3JwaFRhcmdldDMgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDMgXTtcblx0I2lmbmRlZiBVU0VfTU9SUEhOT1JNQUxTXG5cdFx0dHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQ0ICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA0IF07XG5cdFx0dHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQ1ICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA1IF07XG5cdFx0dHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQ2ICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA2IF07XG5cdFx0dHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQ3ICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA3IF07XG5cdCNlbmRpZlxuI2VuZGlmIixub3JtYWxfZnJhZ21lbnRfYmVnaW46ImZsb2F0IGZhY2VEaXJlY3Rpb24gPSBnbF9Gcm9udEZhY2luZyA/IDEuMCA6IC0gMS4wO1xuI2lmZGVmIEZMQVRfU0hBREVEXG5cdHZlYzMgZmR4ID0gdmVjMyggZEZkeCggdlZpZXdQb3NpdGlvbi54ICksIGRGZHgoIHZWaWV3UG9zaXRpb24ueSApLCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnogKSApO1xuXHR2ZWMzIGZkeSA9IHZlYzMoIGRGZHkoIHZWaWV3UG9zaXRpb24ueCApLCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnkgKSwgZEZkeSggdlZpZXdQb3NpdGlvbi56ICkgKTtcblx0dmVjMyBub3JtYWwgPSBub3JtYWxpemUoIGNyb3NzKCBmZHgsIGZkeSApICk7XG4jZWxzZVxuXHR2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSggdk5vcm1hbCApO1xuXHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0bm9ybWFsID0gbm9ybWFsICogZmFjZURpcmVjdGlvbjtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZlYzMgdGFuZ2VudCA9IG5vcm1hbGl6ZSggdlRhbmdlbnQgKTtcblx0XHR2ZWMzIGJpdGFuZ2VudCA9IG5vcm1hbGl6ZSggdkJpdGFuZ2VudCApO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHRhbmdlbnQgPSB0YW5nZW50ICogZmFjZURpcmVjdGlvbjtcblx0XHRcdGJpdGFuZ2VudCA9IGJpdGFuZ2VudCAqIGZhY2VEaXJlY3Rpb247XG5cdFx0I2VuZGlmXG5cdFx0I2lmIGRlZmluZWQoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCApXG5cdFx0XHRtYXQzIHZUQk4gPSBtYXQzKCB0YW5nZW50LCBiaXRhbmdlbnQsIG5vcm1hbCApO1xuXHRcdCNlbmRpZlxuXHQjZW5kaWZcbiNlbmRpZlxudmVjMyBnZW9tZXRyeU5vcm1hbCA9IG5vcm1hbDsiLG5vcm1hbF9mcmFnbWVudF9tYXBzOiIjaWZkZWYgT0JKRUNUU1BBQ0VfTk9STUFMTUFQXG5cdG5vcm1hbCA9IHRleHR1cmUyRCggbm9ybWFsTWFwLCB2VXYgKS54eXogKiAyLjAgLSAxLjA7XG5cdCNpZmRlZiBGTElQX1NJREVEXG5cdFx0bm9ybWFsID0gLSBub3JtYWw7XG5cdCNlbmRpZlxuXHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0bm9ybWFsID0gbm9ybWFsICogZmFjZURpcmVjdGlvbjtcblx0I2VuZGlmXG5cdG5vcm1hbCA9IG5vcm1hbGl6ZSggbm9ybWFsTWF0cml4ICogbm9ybWFsICk7XG4jZWxpZiBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0dmVjMyBtYXBOID0gdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcblx0bWFwTi54eSAqPSBub3JtYWxTY2FsZTtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0bm9ybWFsID0gbm9ybWFsaXplKCB2VEJOICogbWFwTiApO1xuXHQjZWxzZVxuXHRcdG5vcm1hbCA9IHBlcnR1cmJOb3JtYWwyQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBtYXBOLCBmYWNlRGlyZWN0aW9uICk7XG5cdCNlbmRpZlxuI2VsaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKVxuXHRub3JtYWwgPSBwZXJ0dXJiTm9ybWFsQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBkSGR4eV9md2QoKSwgZmFjZURpcmVjdGlvbiApO1xuI2VuZGlmIixub3JtYWxtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9OT1JNQUxNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbm9ybWFsTWFwO1xuXHR1bmlmb3JtIHZlYzIgbm9ybWFsU2NhbGU7XG4jZW5kaWZcbiNpZmRlZiBPQkpFQ1RTUEFDRV9OT1JNQUxNQVBcblx0dW5pZm9ybSBtYXQzIG5vcm1hbE1hdHJpeDtcbiNlbmRpZlxuI2lmICEgZGVmaW5lZCAoIFVTRV9UQU5HRU5UICkgJiYgKCBkZWZpbmVkICggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQgKCBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCApIClcblx0dmVjMyBwZXJ0dXJiTm9ybWFsMkFyYiggdmVjMyBleWVfcG9zLCB2ZWMzIHN1cmZfbm9ybSwgdmVjMyBtYXBOLCBmbG9hdCBmYWNlRGlyZWN0aW9uICkge1xuXHRcdHZlYzMgcTAgPSB2ZWMzKCBkRmR4KCBleWVfcG9zLnggKSwgZEZkeCggZXllX3Bvcy55ICksIGRGZHgoIGV5ZV9wb3MueiApICk7XG5cdFx0dmVjMyBxMSA9IHZlYzMoIGRGZHkoIGV5ZV9wb3MueCApLCBkRmR5KCBleWVfcG9zLnkgKSwgZEZkeSggZXllX3Bvcy56ICkgKTtcblx0XHR2ZWMyIHN0MCA9IGRGZHgoIHZVdi5zdCApO1xuXHRcdHZlYzIgc3QxID0gZEZkeSggdlV2LnN0ICk7XG5cdFx0dmVjMyBOID0gc3VyZl9ub3JtO1xuXHRcdHZlYzMgcTFwZXJwID0gY3Jvc3MoIHExLCBOICk7XG5cdFx0dmVjMyBxMHBlcnAgPSBjcm9zcyggTiwgcTAgKTtcblx0XHR2ZWMzIFQgPSBxMXBlcnAgKiBzdDAueCArIHEwcGVycCAqIHN0MS54O1xuXHRcdHZlYzMgQiA9IHExcGVycCAqIHN0MC55ICsgcTBwZXJwICogc3QxLnk7XG5cdFx0ZmxvYXQgZGV0ID0gbWF4KCBkb3QoIFQsIFQgKSwgZG90KCBCLCBCICkgKTtcblx0XHRmbG9hdCBzY2FsZSA9ICggZGV0ID09IDAuMCApID8gMC4wIDogZmFjZURpcmVjdGlvbiAqIGludmVyc2VzcXJ0KCBkZXQgKTtcblx0XHRyZXR1cm4gbm9ybWFsaXplKCBUICogKCBtYXBOLnggKiBzY2FsZSApICsgQiAqICggbWFwTi55ICogc2NhbGUgKSArIE4gKiBtYXBOLnogKTtcblx0fVxuI2VuZGlmIixjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luOiIjaWZkZWYgQ0xFQVJDT0FUXG5cdHZlYzMgY2xlYXJjb2F0Tm9ybWFsID0gZ2VvbWV0cnlOb3JtYWw7XG4jZW5kaWYiLGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwczoiI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQXG5cdHZlYzMgY2xlYXJjb2F0TWFwTiA9IHRleHR1cmUyRCggY2xlYXJjb2F0Tm9ybWFsTWFwLCB2VXYgKS54eXogKiAyLjAgLSAxLjA7XG5cdGNsZWFyY29hdE1hcE4ueHkgKj0gY2xlYXJjb2F0Tm9ybWFsU2NhbGU7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdGNsZWFyY29hdE5vcm1hbCA9IG5vcm1hbGl6ZSggdlRCTiAqIGNsZWFyY29hdE1hcE4gKTtcblx0I2Vsc2Vcblx0XHRjbGVhcmNvYXROb3JtYWwgPSBwZXJ0dXJiTm9ybWFsMkFyYiggLSB2Vmlld1Bvc2l0aW9uLCBjbGVhcmNvYXROb3JtYWwsIGNsZWFyY29hdE1hcE4sIGZhY2VEaXJlY3Rpb24gKTtcblx0I2VuZGlmXG4jZW5kaWYiLGNsZWFyY29hdF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0NMRUFSQ09BVE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXRNYXA7XG4jZW5kaWZcbiNpZmRlZiBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXRSb3VnaG5lc3NNYXA7XG4jZW5kaWZcbiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXROb3JtYWxNYXA7XG5cdHVuaWZvcm0gdmVjMiBjbGVhcmNvYXROb3JtYWxTY2FsZTtcbiNlbmRpZiIscGFja2luZzoidmVjMyBwYWNrTm9ybWFsVG9SR0IoIGNvbnN0IGluIHZlYzMgbm9ybWFsICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCBub3JtYWwgKSAqIDAuNSArIDAuNTtcbn1cbnZlYzMgdW5wYWNrUkdCVG9Ob3JtYWwoIGNvbnN0IGluIHZlYzMgcmdiICkge1xuXHRyZXR1cm4gMi4wICogcmdiLnh5eiAtIDEuMDtcbn1cbmNvbnN0IGZsb2F0IFBhY2tVcHNjYWxlID0gMjU2LiAvIDI1NS47Y29uc3QgZmxvYXQgVW5wYWNrRG93bnNjYWxlID0gMjU1LiAvIDI1Ni47XG5jb25zdCB2ZWMzIFBhY2tGYWN0b3JzID0gdmVjMyggMjU2LiAqIDI1Ni4gKiAyNTYuLCAyNTYuICogMjU2LiwgMjU2LiApO1xuY29uc3QgdmVjNCBVbnBhY2tGYWN0b3JzID0gVW5wYWNrRG93bnNjYWxlIC8gdmVjNCggUGFja0ZhY3RvcnMsIDEuICk7XG5jb25zdCBmbG9hdCBTaGlmdFJpZ2h0OCA9IDEuIC8gMjU2LjtcbnZlYzQgcGFja0RlcHRoVG9SR0JBKCBjb25zdCBpbiBmbG9hdCB2ICkge1xuXHR2ZWM0IHIgPSB2ZWM0KCBmcmFjdCggdiAqIFBhY2tGYWN0b3JzICksIHYgKTtcblx0ci55encgLT0gci54eXogKiBTaGlmdFJpZ2h0ODtcdHJldHVybiByICogUGFja1Vwc2NhbGU7XG59XG5mbG9hdCB1bnBhY2tSR0JBVG9EZXB0aCggY29uc3QgaW4gdmVjNCB2ICkge1xuXHRyZXR1cm4gZG90KCB2LCBVbnBhY2tGYWN0b3JzICk7XG59XG52ZWM0IHBhY2sySGFsZlRvUkdCQSggdmVjMiB2ICkge1xuXHR2ZWM0IHIgPSB2ZWM0KCB2LngsIGZyYWN0KCB2LnggKiAyNTUuMCApLCB2LnksIGZyYWN0KCB2LnkgKiAyNTUuMCApKTtcblx0cmV0dXJuIHZlYzQoIHIueCAtIHIueSAvIDI1NS4wLCByLnksIHIueiAtIHIudyAvIDI1NS4wLCByLncpO1xufVxudmVjMiB1bnBhY2tSR0JBVG8ySGFsZiggdmVjNCB2ICkge1xuXHRyZXR1cm4gdmVjMiggdi54ICsgKCB2LnkgLyAyNTUuMCApLCB2LnogKyAoIHYudyAvIDI1NS4wICkgKTtcbn1cbmZsb2F0IHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuICggdmlld1ogKyBuZWFyICkgLyAoIG5lYXIgLSBmYXIgKTtcbn1cbmZsb2F0IG9ydGhvZ3JhcGhpY0RlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgbGluZWFyQ2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuIGxpbmVhckNsaXBaICogKCBuZWFyIC0gZmFyICkgLSBuZWFyO1xufVxuZmxvYXQgdmlld1pUb1BlcnNwZWN0aXZlRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiAoKCBuZWFyICsgdmlld1ogKSAqIGZhciApIC8gKCggZmFyIC0gbmVhciApICogdmlld1ogKTtcbn1cbmZsb2F0IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBpbnZDbGlwWiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xuXHRyZXR1cm4gKCBuZWFyICogZmFyICkgLyAoICggZmFyIC0gbmVhciApICogaW52Q2xpcFogLSBmYXIgKTtcbn0iLHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ6IiNpZmRlZiBQUkVNVUxUSVBMSUVEX0FMUEhBXG5cdGdsX0ZyYWdDb2xvci5yZ2IgKj0gZ2xfRnJhZ0NvbG9yLmE7XG4jZW5kaWYiLHByb2plY3RfdmVydGV4OiJ2ZWM0IG12UG9zaXRpb24gPSB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XG4jaWZkZWYgVVNFX0lOU1RBTkNJTkdcblx0bXZQb3NpdGlvbiA9IGluc3RhbmNlTWF0cml4ICogbXZQb3NpdGlvbjtcbiNlbmRpZlxubXZQb3NpdGlvbiA9IG1vZGVsVmlld01hdHJpeCAqIG12UG9zaXRpb247XG5nbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uOyIsZGl0aGVyaW5nX2ZyYWdtZW50OiIjaWZkZWYgRElUSEVSSU5HXG5cdGdsX0ZyYWdDb2xvci5yZ2IgPSBkaXRoZXJpbmcoIGdsX0ZyYWdDb2xvci5yZ2IgKTtcbiNlbmRpZiIsZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBESVRIRVJJTkdcblx0dmVjMyBkaXRoZXJpbmcoIHZlYzMgY29sb3IgKSB7XG5cdFx0ZmxvYXQgZ3JpZF9wb3NpdGlvbiA9IHJhbmQoIGdsX0ZyYWdDb29yZC54eSApO1xuXHRcdHZlYzMgZGl0aGVyX3NoaWZ0X1JHQiA9IHZlYzMoIDAuMjUgLyAyNTUuMCwgLTAuMjUgLyAyNTUuMCwgMC4yNSAvIDI1NS4wICk7XG5cdFx0ZGl0aGVyX3NoaWZ0X1JHQiA9IG1peCggMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgLTIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIGdyaWRfcG9zaXRpb24gKTtcblx0XHRyZXR1cm4gY29sb3IgKyBkaXRoZXJfc2hpZnRfUkdCO1xuXHR9XG4jZW5kaWYiLHJvdWdobmVzc21hcF9mcmFnbWVudDoiZmxvYXQgcm91Z2huZXNzRmFjdG9yID0gcm91Z2huZXNzO1xuI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcblx0dmVjNCB0ZXhlbFJvdWdobmVzcyA9IHRleHR1cmUyRCggcm91Z2huZXNzTWFwLCB2VXYgKTtcblx0cm91Z2huZXNzRmFjdG9yICo9IHRleGVsUm91Z2huZXNzLmc7XG4jZW5kaWYiLHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1JPVUdITkVTU01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCByb3VnaG5lc3NNYXA7XG4jZW5kaWYiLHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMFxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0U2hhZG93IHtcblx0XHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0XHRmbG9hdCBzaGFkb3dOb3JtYWxCaWFzO1xuXHRcdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHRcdH07XG5cdFx0dW5pZm9ybSBEaXJlY3Rpb25hbExpZ2h0U2hhZG93IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMFxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIHNwb3RTaGFkb3dNYXBbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlNwb3RTaGFkb3dDb29yZFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHN0cnVjdCBTcG90TGlnaHRTaGFkb3cge1xuXHRcdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRcdGZsb2F0IHNoYWRvd05vcm1hbEJpYXM7XG5cdFx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0XHR2ZWMyIHNoYWRvd01hcFNpemU7XG5cdFx0fTtcblx0XHR1bmlmb3JtIFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHRTaGFkb3dzWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgcG9pbnRTaGFkb3dNYXBbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHN0cnVjdCBQb2ludExpZ2h0U2hhZG93IHtcblx0XHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0XHRmbG9hdCBzaGFkb3dOb3JtYWxCaWFzO1xuXHRcdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHRcdFx0ZmxvYXQgc2hhZG93Q2FtZXJhTmVhcjtcblx0XHRcdGZsb2F0IHNoYWRvd0NhbWVyYUZhcjtcblx0XHR9O1xuXHRcdHVuaWZvcm0gUG9pbnRMaWdodFNoYWRvdyBwb2ludExpZ2h0U2hhZG93c1sgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG5cdGZsb2F0IHRleHR1cmUyRENvbXBhcmUoIHNhbXBsZXIyRCBkZXB0aHMsIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKSB7XG5cdFx0cmV0dXJuIHN0ZXAoIGNvbXBhcmUsIHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIGRlcHRocywgdXYgKSApICk7XG5cdH1cblx0dmVjMiB0ZXh0dXJlMkREaXN0cmlidXRpb24oIHNhbXBsZXIyRCBzaGFkb3csIHZlYzIgdXYgKSB7XG5cdFx0cmV0dXJuIHVucGFja1JHQkFUbzJIYWxmKCB0ZXh0dXJlMkQoIHNoYWRvdywgdXYgKSApO1xuXHR9XG5cdGZsb2F0IFZTTVNoYWRvdyAoc2FtcGxlcjJEIHNoYWRvdywgdmVjMiB1diwgZmxvYXQgY29tcGFyZSApe1xuXHRcdGZsb2F0IG9jY2x1c2lvbiA9IDEuMDtcblx0XHR2ZWMyIGRpc3RyaWJ1dGlvbiA9IHRleHR1cmUyRERpc3RyaWJ1dGlvbiggc2hhZG93LCB1diApO1xuXHRcdGZsb2F0IGhhcmRfc2hhZG93ID0gc3RlcCggY29tcGFyZSAsIGRpc3RyaWJ1dGlvbi54ICk7XG5cdFx0aWYgKGhhcmRfc2hhZG93ICE9IDEuMCApIHtcblx0XHRcdGZsb2F0IGRpc3RhbmNlID0gY29tcGFyZSAtIGRpc3RyaWJ1dGlvbi54IDtcblx0XHRcdGZsb2F0IHZhcmlhbmNlID0gbWF4KCAwLjAwMDAwLCBkaXN0cmlidXRpb24ueSAqIGRpc3RyaWJ1dGlvbi55ICk7XG5cdFx0XHRmbG9hdCBzb2Z0bmVzc19wcm9iYWJpbGl0eSA9IHZhcmlhbmNlIC8gKHZhcmlhbmNlICsgZGlzdGFuY2UgKiBkaXN0YW5jZSApO1x0XHRcdHNvZnRuZXNzX3Byb2JhYmlsaXR5ID0gY2xhbXAoICggc29mdG5lc3NfcHJvYmFiaWxpdHkgLSAwLjMgKSAvICggMC45NSAtIDAuMyApLCAwLjAsIDEuMCApO1x0XHRcdG9jY2x1c2lvbiA9IGNsYW1wKCBtYXgoIGhhcmRfc2hhZG93LCBzb2Z0bmVzc19wcm9iYWJpbGl0eSApLCAwLjAsIDEuMCApO1xuXHRcdH1cblx0XHRyZXR1cm4gb2NjbHVzaW9uO1xuXHR9XG5cdGZsb2F0IGdldFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQgKSB7XG5cdFx0ZmxvYXQgc2hhZG93ID0gMS4wO1xuXHRcdHNoYWRvd0Nvb3JkLnh5eiAvPSBzaGFkb3dDb29yZC53O1xuXHRcdHNoYWRvd0Nvb3JkLnogKz0gc2hhZG93Qmlhcztcblx0XHRidmVjNCBpbkZydXN0dW1WZWMgPSBidmVjNCAoIHNoYWRvd0Nvb3JkLnggPj0gMC4wLCBzaGFkb3dDb29yZC54IDw9IDEuMCwgc2hhZG93Q29vcmQueSA+PSAwLjAsIHNoYWRvd0Nvb3JkLnkgPD0gMS4wICk7XG5cdFx0Ym9vbCBpbkZydXN0dW0gPSBhbGwoIGluRnJ1c3R1bVZlYyApO1xuXHRcdGJ2ZWMyIGZydXN0dW1UZXN0VmVjID0gYnZlYzIoIGluRnJ1c3R1bSwgc2hhZG93Q29vcmQueiA8PSAxLjAgKTtcblx0XHRib29sIGZydXN0dW1UZXN0ID0gYWxsKCBmcnVzdHVtVGVzdFZlYyApO1xuXHRcdGlmICggZnJ1c3R1bVRlc3QgKSB7XG5cdFx0I2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApXG5cdFx0XHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcblx0XHRcdGZsb2F0IGR4MCA9IC0gdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTAgPSAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHgxID0gKyB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR5MSA9ICsgdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeDIgPSBkeDAgLyAyLjA7XG5cdFx0XHRmbG9hdCBkeTIgPSBkeTAgLyAyLjA7XG5cdFx0XHRmbG9hdCBkeDMgPSBkeDEgLyAyLjA7XG5cdFx0XHRmbG9hdCBkeTMgPSBkeTEgLyAyLjA7XG5cdFx0XHRzaGFkb3cgPSAoXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDIsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MSApLCBzaGFkb3dDb29yZC56IClcblx0XHRcdCkgKiAoIDEuMCAvIDE3LjAgKTtcblx0XHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApXG5cdFx0XHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcblx0XHRcdGZsb2F0IGR4ID0gdGV4ZWxTaXplLng7XG5cdFx0XHRmbG9hdCBkeSA9IHRleGVsU2l6ZS55O1xuXHRcdFx0dmVjMiB1diA9IHNoYWRvd0Nvb3JkLnh5O1xuXHRcdFx0dmVjMiBmID0gZnJhY3QoIHV2ICogc2hhZG93TWFwU2l6ZSArIDAuNSApO1xuXHRcdFx0dXYgLT0gZiAqIHRleGVsU2l6ZTtcblx0XHRcdHNoYWRvdyA9IChcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIGR4LCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDAuMCwgZHkgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHRleGVsU2l6ZSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0bWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCAwLjAgKSwgc2hhZG93Q29vcmQueiApLCBcblx0XHRcdFx0XHQgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCAwLjAgKSwgc2hhZG93Q29vcmQueiApLFxuXHRcdFx0XHRcdCBmLnggKSArXG5cdFx0XHRcdG1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIC1keCwgZHkgKSwgc2hhZG93Q29vcmQueiApLCBcblx0XHRcdFx0XHQgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCBkeSApLCBzaGFkb3dDb29yZC56ICksXG5cdFx0XHRcdFx0IGYueCApICtcblx0XHRcdFx0bWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMC4wLCAtZHkgKSwgc2hhZG93Q29vcmQueiApLCBcblx0XHRcdFx0XHQgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDAuMCwgMi4wICogZHkgKSwgc2hhZG93Q29vcmQueiApLFxuXHRcdFx0XHRcdCBmLnkgKSArXG5cdFx0XHRcdG1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIGR4LCAtZHkgKSwgc2hhZG93Q29vcmQueiApLCBcblx0XHRcdFx0XHQgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIGR4LCAyLjAgKiBkeSApLCBzaGFkb3dDb29yZC56ICksXG5cdFx0XHRcdFx0IGYueSApICtcblx0XHRcdFx0bWl4KCBtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIC1keSApLCBzaGFkb3dDb29yZC56ICksIFxuXHRcdFx0XHRcdFx0ICB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIC1keSApLCBzaGFkb3dDb29yZC56ICksXG5cdFx0XHRcdFx0XHQgIGYueCApLFxuXHRcdFx0XHRcdCBtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwgXG5cdFx0XHRcdFx0XHQgIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAyLjAgKiBkeCwgMi4wICogZHkgKSwgc2hhZG93Q29vcmQueiApLFxuXHRcdFx0XHRcdFx0ICBmLnggKSxcblx0XHRcdFx0XHQgZi55IClcblx0XHRcdCkgKiAoIDEuMCAvIDkuMCApO1xuXHRcdCNlbGlmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1ZTTSApXG5cdFx0XHRzaGFkb3cgPSBWU01TaGFkb3coIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKTtcblx0XHQjZWxzZVxuXHRcdFx0c2hhZG93ID0gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApO1xuXHRcdCNlbmRpZlxuXHRcdH1cblx0XHRyZXR1cm4gc2hhZG93O1xuXHR9XG5cdHZlYzIgY3ViZVRvVVYoIHZlYzMgdiwgZmxvYXQgdGV4ZWxTaXplWSApIHtcblx0XHR2ZWMzIGFic1YgPSBhYnMoIHYgKTtcblx0XHRmbG9hdCBzY2FsZVRvQ3ViZSA9IDEuMCAvIG1heCggYWJzVi54LCBtYXgoIGFic1YueSwgYWJzVi56ICkgKTtcblx0XHRhYnNWICo9IHNjYWxlVG9DdWJlO1xuXHRcdHYgKj0gc2NhbGVUb0N1YmUgKiAoIDEuMCAtIDIuMCAqIHRleGVsU2l6ZVkgKTtcblx0XHR2ZWMyIHBsYW5hciA9IHYueHk7XG5cdFx0ZmxvYXQgYWxtb3N0QVRleGVsID0gMS41ICogdGV4ZWxTaXplWTtcblx0XHRmbG9hdCBhbG1vc3RPbmUgPSAxLjAgLSBhbG1vc3RBVGV4ZWw7XG5cdFx0aWYgKCBhYnNWLnogPj0gYWxtb3N0T25lICkge1xuXHRcdFx0aWYgKCB2LnogPiAwLjAgKVxuXHRcdFx0XHRwbGFuYXIueCA9IDQuMCAtIHYueDtcblx0XHR9IGVsc2UgaWYgKCBhYnNWLnggPj0gYWxtb3N0T25lICkge1xuXHRcdFx0ZmxvYXQgc2lnblggPSBzaWduKCB2LnggKTtcblx0XHRcdHBsYW5hci54ID0gdi56ICogc2lnblggKyAyLjAgKiBzaWduWDtcblx0XHR9IGVsc2UgaWYgKCBhYnNWLnkgPj0gYWxtb3N0T25lICkge1xuXHRcdFx0ZmxvYXQgc2lnblkgPSBzaWduKCB2LnkgKTtcblx0XHRcdHBsYW5hci54ID0gdi54ICsgMi4wICogc2lnblkgKyAyLjA7XG5cdFx0XHRwbGFuYXIueSA9IHYueiAqIHNpZ25ZIC0gMi4wO1xuXHRcdH1cblx0XHRyZXR1cm4gdmVjMiggMC4xMjUsIDAuMjUgKSAqIHBsYW5hciArIHZlYzIoIDAuMzc1LCAwLjc1ICk7XG5cdH1cblx0ZmxvYXQgZ2V0UG9pbnRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkLCBmbG9hdCBzaGFkb3dDYW1lcmFOZWFyLCBmbG9hdCBzaGFkb3dDYW1lcmFGYXIgKSB7XG5cdFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvICggc2hhZG93TWFwU2l6ZSAqIHZlYzIoIDQuMCwgMi4wICkgKTtcblx0XHR2ZWMzIGxpZ2h0VG9Qb3NpdGlvbiA9IHNoYWRvd0Nvb3JkLnh5ejtcblx0XHRmbG9hdCBkcCA9ICggbGVuZ3RoKCBsaWdodFRvUG9zaXRpb24gKSAtIHNoYWRvd0NhbWVyYU5lYXIgKSAvICggc2hhZG93Q2FtZXJhRmFyIC0gc2hhZG93Q2FtZXJhTmVhciApO1x0XHRkcCArPSBzaGFkb3dCaWFzO1xuXHRcdHZlYzMgYmQzRCA9IG5vcm1hbGl6ZSggbGlnaHRUb1Bvc2l0aW9uICk7XG5cdFx0I2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApIHx8IGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRl9TT0ZUICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfVlNNIClcblx0XHRcdHZlYzIgb2Zmc2V0ID0gdmVjMiggLSAxLCAxICkgKiBzaGFkb3dSYWRpdXMgKiB0ZXhlbFNpemUueTtcblx0XHRcdHJldHVybiAoXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl5LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eXksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh5eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh5LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXh4LCB0ZXhlbFNpemUueSApLCBkcCApXG5cdFx0XHQpICogKCAxLjAgLyA5LjAgKTtcblx0XHQjZWxzZVxuXHRcdFx0cmV0dXJuIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICk7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZiIsc2hhZG93bWFwX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMFxuXHRcdHVuaWZvcm0gbWF0NCBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0XHRzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodFNoYWRvdyB7XG5cdFx0XHRmbG9hdCBzaGFkb3dCaWFzO1xuXHRcdFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcblx0XHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcblx0XHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0XHR9O1xuXHRcdHVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDBcblx0XHR1bmlmb3JtIG1hdDQgc3BvdFNoYWRvd01hdHJpeFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2U3BvdFNoYWRvd0Nvb3JkWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0c3RydWN0IFNwb3RMaWdodFNoYWRvdyB7XG5cdFx0XHRmbG9hdCBzaGFkb3dCaWFzO1xuXHRcdFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcblx0XHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcblx0XHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0XHR9O1xuXHRcdHVuaWZvcm0gU3BvdExpZ2h0U2hhZG93IHNwb3RMaWdodFNoYWRvd3NbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcblx0XHR1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHN0cnVjdCBQb2ludExpZ2h0U2hhZG93IHtcblx0XHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0XHRmbG9hdCBzaGFkb3dOb3JtYWxCaWFzO1xuXHRcdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHRcdFx0ZmxvYXQgc2hhZG93Q2FtZXJhTmVhcjtcblx0XHRcdGZsb2F0IHNoYWRvd0NhbWVyYUZhcjtcblx0XHR9O1xuXHRcdHVuaWZvcm0gUG9pbnRMaWdodFNoYWRvdyBwb2ludExpZ2h0U2hhZG93c1sgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG4jZW5kaWYiLHNoYWRvd21hcF92ZXJ0ZXg6IiNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwIHx8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwIHx8IE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxuXHRcdHZlYzMgc2hhZG93V29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCB0cmFuc2Zvcm1lZE5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdHZlYzQgc2hhZG93V29ybGRQb3NpdGlvbjtcblx0I2VuZGlmXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHNoYWRvd1dvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uICsgdmVjNCggc2hhZG93V29ybGROb3JtYWwgKiBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgaSBdLnNoYWRvd05vcm1hbEJpYXMsIDAgKTtcblx0XHR2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdID0gZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIGkgXSAqIHNoYWRvd1dvcmxkUG9zaXRpb247XG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0c2hhZG93V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24gKyB2ZWM0KCBzaGFkb3dXb3JsZE5vcm1hbCAqIHNwb3RMaWdodFNoYWRvd3NbIGkgXS5zaGFkb3dOb3JtYWxCaWFzLCAwICk7XG5cdFx0dlNwb3RTaGFkb3dDb29yZFsgaSBdID0gc3BvdFNoYWRvd01hdHJpeFsgaSBdICogc2hhZG93V29ybGRQb3NpdGlvbjtcblx0fVxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuXHQjZW5kaWZcblx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHNoYWRvd1dvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uICsgdmVjNCggc2hhZG93V29ybGROb3JtYWwgKiBwb2ludExpZ2h0U2hhZG93c1sgaSBdLnNoYWRvd05vcm1hbEJpYXMsIDAgKTtcblx0XHR2UG9pbnRTaGFkb3dDb29yZFsgaSBdID0gcG9pbnRTaGFkb3dNYXRyaXhbIGkgXSAqIHNoYWRvd1dvcmxkUG9zaXRpb247XG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcblx0I2VuZGlmXG4jZW5kaWYiLHNoYWRvd21hc2tfcGFyc19mcmFnbWVudDoiZmxvYXQgZ2V0U2hhZG93TWFzaygpIHtcblx0ZmxvYXQgc2hhZG93ID0gMS4wO1xuXHQjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMFxuXHREaXJlY3Rpb25hbExpZ2h0U2hhZG93IGRpcmVjdGlvbmFsTGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdGRpcmVjdGlvbmFsTGlnaHQgPSBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgaSBdO1xuXHRcdHNoYWRvdyAqPSByZWNlaXZlU2hhZG93ID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93QmlhcywgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dSYWRpdXMsIHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0fVxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwXG5cdFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHRzcG90TGlnaHQgPSBzcG90TGlnaHRTaGFkb3dzWyBpIF07XG5cdFx0c2hhZG93ICo9IHJlY2VpdmVTaGFkb3cgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFkb3dCaWFzLCBzcG90TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0fVxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuXHQjZW5kaWZcblx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxuXHRQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0cG9pbnRMaWdodCA9IHBvaW50TGlnaHRTaGFkb3dzWyBpIF07XG5cdFx0c2hhZG93ICo9IHJlY2VpdmVTaGFkb3cgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7XG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcblx0I2VuZGlmXG5cdCNlbmRpZlxuXHRyZXR1cm4gc2hhZG93O1xufSIsc2tpbmJhc2VfdmVydGV4OiIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdG1hdDQgYm9uZU1hdFggPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueCApO1xuXHRtYXQ0IGJvbmVNYXRZID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnkgKTtcblx0bWF0NCBib25lTWF0WiA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC56ICk7XG5cdG1hdDQgYm9uZU1hdFcgPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgudyApO1xuI2VuZGlmIixza2lubmluZ19wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHR1bmlmb3JtIG1hdDQgYmluZE1hdHJpeDtcblx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXhJbnZlcnNlO1xuXHQjaWZkZWYgQk9ORV9URVhUVVJFXG5cdFx0dW5pZm9ybSBoaWdocCBzYW1wbGVyMkQgYm9uZVRleHR1cmU7XG5cdFx0dW5pZm9ybSBpbnQgYm9uZVRleHR1cmVTaXplO1xuXHRcdG1hdDQgZ2V0Qm9uZU1hdHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHtcblx0XHRcdGZsb2F0IGogPSBpICogNC4wO1xuXHRcdFx0ZmxvYXQgeCA9IG1vZCggaiwgZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XG5cdFx0XHRmbG9hdCB5ID0gZmxvb3IoIGogLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICkgKTtcblx0XHRcdGZsb2F0IGR4ID0gMS4wIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xuXHRcdFx0ZmxvYXQgZHkgPSAxLjAgLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICk7XG5cdFx0XHR5ID0gZHkgKiAoIHkgKyAwLjUgKTtcblx0XHRcdHZlYzQgdjEgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDAuNSApLCB5ICkgKTtcblx0XHRcdHZlYzQgdjIgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDEuNSApLCB5ICkgKTtcblx0XHRcdHZlYzQgdjMgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDIuNSApLCB5ICkgKTtcblx0XHRcdHZlYzQgdjQgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDMuNSApLCB5ICkgKTtcblx0XHRcdG1hdDQgYm9uZSA9IG1hdDQoIHYxLCB2MiwgdjMsIHY0ICk7XG5cdFx0XHRyZXR1cm4gYm9uZTtcblx0XHR9XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBtYXQ0IGJvbmVNYXRyaWNlc1sgTUFYX0JPTkVTIF07XG5cdFx0bWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xuXHRcdFx0bWF0NCBib25lID0gYm9uZU1hdHJpY2VzWyBpbnQoaSkgXTtcblx0XHRcdHJldHVybiBib25lO1xuXHRcdH1cblx0I2VuZGlmXG4jZW5kaWYiLHNraW5uaW5nX3ZlcnRleDoiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHR2ZWM0IHNraW5WZXJ0ZXggPSBiaW5kTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuXHR2ZWM0IHNraW5uZWQgPSB2ZWM0KCAwLjAgKTtcblx0c2tpbm5lZCArPSBib25lTWF0WCAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lng7XG5cdHNraW5uZWQgKz0gYm9uZU1hdFkgKiBza2luVmVydGV4ICogc2tpbldlaWdodC55O1xuXHRza2lubmVkICs9IGJvbmVNYXRaICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQuejtcblx0c2tpbm5lZCArPSBib25lTWF0VyAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnc7XG5cdHRyYW5zZm9ybWVkID0gKCBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5uZWQgKS54eXo7XG4jZW5kaWYiLHNraW5ub3JtYWxfdmVydGV4OiIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdG1hdDQgc2tpbk1hdHJpeCA9IG1hdDQoIDAuMCApO1xuXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQueCAqIGJvbmVNYXRYO1xuXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQueSAqIGJvbmVNYXRZO1xuXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQueiAqIGJvbmVNYXRaO1xuXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQudyAqIGJvbmVNYXRXO1xuXHRza2luTWF0cml4ID0gYmluZE1hdHJpeEludmVyc2UgKiBza2luTWF0cml4ICogYmluZE1hdHJpeDtcblx0b2JqZWN0Tm9ybWFsID0gdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdE5vcm1hbCwgMC4wICkgKS54eXo7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdG9iamVjdFRhbmdlbnQgPSB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0VGFuZ2VudCwgMC4wICkgKS54eXo7XG5cdCNlbmRpZlxuI2VuZGlmIixzcGVjdWxhcm1hcF9mcmFnbWVudDoiZmxvYXQgc3BlY3VsYXJTdHJlbmd0aDtcbiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcblx0dmVjNCB0ZXhlbFNwZWN1bGFyID0gdGV4dHVyZTJEKCBzcGVjdWxhck1hcCwgdlV2ICk7XG5cdHNwZWN1bGFyU3RyZW5ndGggPSB0ZXhlbFNwZWN1bGFyLnI7XG4jZWxzZVxuXHRzcGVjdWxhclN0cmVuZ3RoID0gMS4wO1xuI2VuZGlmIixzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1NQRUNVTEFSTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIHNwZWN1bGFyTWFwO1xuI2VuZGlmIix0b25lbWFwcGluZ19mcmFnbWVudDoiI2lmIGRlZmluZWQoIFRPTkVfTUFQUElORyApXG5cdGdsX0ZyYWdDb2xvci5yZ2IgPSB0b25lTWFwcGluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xuI2VuZGlmIix0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50OiIjaWZuZGVmIHNhdHVyYXRlXG4jZGVmaW5lIHNhdHVyYXRlKGEpIGNsYW1wKCBhLCAwLjAsIDEuMCApXG4jZW5kaWZcbnVuaWZvcm0gZmxvYXQgdG9uZU1hcHBpbmdFeHBvc3VyZTtcbnZlYzMgTGluZWFyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdHJldHVybiB0b25lTWFwcGluZ0V4cG9zdXJlICogY29sb3I7XG59XG52ZWMzIFJlaW5oYXJkVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggY29sb3IgLyAoIHZlYzMoIDEuMCApICsgY29sb3IgKSApO1xufVxudmVjMyBPcHRpbWl6ZWRDaW5lb25Ub25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0Y29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTtcblx0Y29sb3IgPSBtYXgoIHZlYzMoIDAuMCApLCBjb2xvciAtIDAuMDA0ICk7XG5cdHJldHVybiBwb3coICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMC41ICkgKSAvICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMS43ICkgKyAwLjA2ICksIHZlYzMoIDIuMiApICk7XG59XG52ZWMzIFJSVEFuZE9EVEZpdCggdmVjMyB2ICkge1xuXHR2ZWMzIGEgPSB2ICogKCB2ICsgMC4wMjQ1Nzg2ICkgLSAwLjAwMDA5MDUzNztcblx0dmVjMyBiID0gdiAqICggMC45ODM3MjkgKiB2ICsgMC40MzI5NTEwICkgKyAwLjIzODA4MTtcblx0cmV0dXJuIGEgLyBiO1xufVxudmVjMyBBQ0VTRmlsbWljVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbnN0IG1hdDMgQUNFU0lucHV0TWF0ID0gbWF0Myhcblx0XHR2ZWMzKCAwLjU5NzE5LCAwLjA3NjAwLCAwLjAyODQwICksXHRcdHZlYzMoIDAuMzU0NTgsIDAuOTA4MzQsIDAuMTMzODMgKSxcblx0XHR2ZWMzKCAwLjA0ODIzLCAwLjAxNTY2LCAwLjgzNzc3IClcblx0KTtcblx0Y29uc3QgbWF0MyBBQ0VTT3V0cHV0TWF0ID0gbWF0Myhcblx0XHR2ZWMzKCAgMS42MDQ3NSwgLTAuMTAyMDgsIC0wLjAwMzI3ICksXHRcdHZlYzMoIC0wLjUzMTA4LCAgMS4xMDgxMywgLTAuMDcyNzYgKSxcblx0XHR2ZWMzKCAtMC4wNzM2NywgLTAuMDA2MDUsICAxLjA3NjAyIClcblx0KTtcblx0Y29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZSAvIDAuNjtcblx0Y29sb3IgPSBBQ0VTSW5wdXRNYXQgKiBjb2xvcjtcblx0Y29sb3IgPSBSUlRBbmRPRFRGaXQoIGNvbG9yICk7XG5cdGNvbG9yID0gQUNFU091dHB1dE1hdCAqIGNvbG9yO1xuXHRyZXR1cm4gc2F0dXJhdGUoIGNvbG9yICk7XG59XG52ZWMzIEN1c3RvbVRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkgeyByZXR1cm4gY29sb3I7IH0iLHRyYW5zbWlzc2lvbl9mcmFnbWVudDoiI2lmZGVmIFVTRV9UUkFOU01JU1NJT05cblx0ZmxvYXQgdHJhbnNtaXNzaW9uRmFjdG9yID0gdHJhbnNtaXNzaW9uO1xuXHRmbG9hdCB0aGlja25lc3NGYWN0b3IgPSB0aGlja25lc3M7XG5cdCNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OTUFQXG5cdFx0dHJhbnNtaXNzaW9uRmFjdG9yICo9IHRleHR1cmUyRCggdHJhbnNtaXNzaW9uTWFwLCB2VXYgKS5yO1xuXHQjZW5kaWZcblx0I2lmZGVmIFVTRV9USElDS05FU1NNQVBcblx0XHR0aGlja25lc3NGYWN0b3IgKj0gdGV4dHVyZTJEKCB0aGlja25lc3NNYXAsIHZVdiApLmc7XG5cdCNlbmRpZlxuXHR2ZWMzIHBvcyA9IHZXb3JsZFBvc2l0aW9uLnh5eiAvIHZXb3JsZFBvc2l0aW9uLnc7XG5cdHZlYzMgdiA9IG5vcm1hbGl6ZSggY2FtZXJhUG9zaXRpb24gLSBwb3MgKTtcblx0dmVjMyBuID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdGZsb2F0IGlvciA9ICggMS4wICsgMC40ICogcmVmbGVjdGl2aXR5ICkgLyAoIDEuMCAtIDAuNCAqIHJlZmxlY3Rpdml0eSApO1xuXHR2ZWMzIHRyYW5zbWlzc2lvbiA9IHRyYW5zbWlzc2lvbkZhY3RvciAqIGdldElCTFZvbHVtZVJlZnJhY3Rpb24oXG5cdFx0biwgdiwgcm91Z2huZXNzRmFjdG9yLCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsXG5cdFx0cG9zLCBtb2RlbE1hdHJpeCwgdmlld01hdHJpeCwgcHJvamVjdGlvbk1hdHJpeCwgaW9yLCB0aGlja25lc3NGYWN0b3IsXG5cdFx0YXR0ZW51YXRpb25UaW50LCBhdHRlbnVhdGlvbkRpc3RhbmNlICk7XG5cdHRvdGFsRGlmZnVzZSA9IG1peCggdG90YWxEaWZmdXNlLCB0cmFuc21pc3Npb24sIHRyYW5zbWlzc2lvbkZhY3RvciApO1xuI2VuZGlmIix0cmFuc21pc3Npb25fcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9UUkFOU01JU1NJT05cblx0I2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCB0cmFuc21pc3Npb25NYXA7XG5cdCNlbmRpZlxuXHQjaWZkZWYgVVNFX1RISUNLTkVTU01BUFxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIHRoaWNrbmVzc01hcDtcblx0I2VuZGlmXG5cdHVuaWZvcm0gdmVjMiB0cmFuc21pc3Npb25TYW1wbGVyU2l6ZTtcblx0dW5pZm9ybSBzYW1wbGVyMkQgdHJhbnNtaXNzaW9uU2FtcGxlck1hcDtcblx0dW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4O1xuXHR1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDtcblx0dmFyeWluZyB2ZWM0IHZXb3JsZFBvc2l0aW9uO1xuXHR2ZWMzIGdldFZvbHVtZVRyYW5zbWlzc2lvblJheSh2ZWMzIG4sIHZlYzMgdiwgZmxvYXQgdGhpY2tuZXNzLCBmbG9hdCBpb3IsIG1hdDQgbW9kZWxNYXRyaXgpIHtcblx0XHR2ZWMzIHJlZnJhY3Rpb25WZWN0b3IgPSByZWZyYWN0KC12LCBub3JtYWxpemUobiksIDEuMCAvIGlvcik7XG5cdFx0dmVjMyBtb2RlbFNjYWxlO1xuXHRcdG1vZGVsU2NhbGUueCA9IGxlbmd0aCh2ZWMzKG1vZGVsTWF0cml4WzBdLnh5eikpO1xuXHRcdG1vZGVsU2NhbGUueSA9IGxlbmd0aCh2ZWMzKG1vZGVsTWF0cml4WzFdLnh5eikpO1xuXHRcdG1vZGVsU2NhbGUueiA9IGxlbmd0aCh2ZWMzKG1vZGVsTWF0cml4WzJdLnh5eikpO1xuXHRcdHJldHVybiBub3JtYWxpemUocmVmcmFjdGlvblZlY3RvcikgKiB0aGlja25lc3MgKiBtb2RlbFNjYWxlO1xuXHR9XG5cdGZsb2F0IGFwcGx5SW9yVG9Sb3VnaG5lc3MoZmxvYXQgcm91Z2huZXNzLCBmbG9hdCBpb3IpIHtcblx0XHRyZXR1cm4gcm91Z2huZXNzICogY2xhbXAoaW9yICogMi4wIC0gMi4wLCAwLjAsIDEuMCk7XG5cdH1cblx0dmVjMyBnZXRUcmFuc21pc3Npb25TYW1wbGUodmVjMiBmcmFnQ29vcmQsIGZsb2F0IHJvdWdobmVzcywgZmxvYXQgaW9yKSB7XG5cdFx0ZmxvYXQgZnJhbWVidWZmZXJMb2QgPSBsb2cyKHRyYW5zbWlzc2lvblNhbXBsZXJTaXplLngpICogYXBwbHlJb3JUb1JvdWdobmVzcyhyb3VnaG5lc3MsIGlvcik7XG5cdFx0cmV0dXJuIHRleHR1cmUyRExvZEVYVCh0cmFuc21pc3Npb25TYW1wbGVyTWFwLCBmcmFnQ29vcmQueHksIGZyYW1lYnVmZmVyTG9kKS5yZ2I7XG5cdH1cblx0dmVjMyBhcHBseVZvbHVtZUF0dGVudWF0aW9uKHZlYzMgcmFkaWFuY2UsIGZsb2F0IHRyYW5zbWlzc2lvbkRpc3RhbmNlLCB2ZWMzIGF0dGVudWF0aW9uQ29sb3IsIGZsb2F0IGF0dGVudWF0aW9uRGlzdGFuY2UpIHtcblx0XHRpZiAoYXR0ZW51YXRpb25EaXN0YW5jZSA9PSAwLjApIHtcblx0XHRcdHJldHVybiByYWRpYW5jZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmVjMyBhdHRlbnVhdGlvbkNvZWZmaWNpZW50ID0gLWxvZyhhdHRlbnVhdGlvbkNvbG9yKSAvIGF0dGVudWF0aW9uRGlzdGFuY2U7XG5cdFx0XHR2ZWMzIHRyYW5zbWl0dGFuY2UgPSBleHAoLWF0dGVudWF0aW9uQ29lZmZpY2llbnQgKiB0cmFuc21pc3Npb25EaXN0YW5jZSk7XHRcdFx0cmV0dXJuIHRyYW5zbWl0dGFuY2UgKiByYWRpYW5jZTtcblx0XHR9XG5cdH1cblx0dmVjMyBnZXRJQkxWb2x1bWVSZWZyYWN0aW9uKHZlYzMgbiwgdmVjMyB2LCBmbG9hdCBwZXJjZXB0dWFsUm91Z2huZXNzLCB2ZWMzIGJhc2VDb2xvciwgdmVjMyBzcGVjdWxhckNvbG9yLFxuXHRcdHZlYzMgcG9zaXRpb24sIG1hdDQgbW9kZWxNYXRyaXgsIG1hdDQgdmlld01hdHJpeCwgbWF0NCBwcm9qTWF0cml4LCBmbG9hdCBpb3IsIGZsb2F0IHRoaWNrbmVzcyxcblx0XHR2ZWMzIGF0dGVudWF0aW9uQ29sb3IsIGZsb2F0IGF0dGVudWF0aW9uRGlzdGFuY2UpIHtcblx0XHR2ZWMzIHRyYW5zbWlzc2lvblJheSA9IGdldFZvbHVtZVRyYW5zbWlzc2lvblJheShuLCB2LCB0aGlja25lc3MsIGlvciwgbW9kZWxNYXRyaXgpO1xuXHRcdHZlYzMgcmVmcmFjdGVkUmF5RXhpdCA9IHBvc2l0aW9uICsgdHJhbnNtaXNzaW9uUmF5O1xuXHRcdHZlYzQgbmRjUG9zID0gcHJvak1hdHJpeCAqIHZpZXdNYXRyaXggKiB2ZWM0KHJlZnJhY3RlZFJheUV4aXQsIDEuMCk7XG5cdFx0dmVjMiByZWZyYWN0aW9uQ29vcmRzID0gbmRjUG9zLnh5IC8gbmRjUG9zLnc7XG5cdFx0cmVmcmFjdGlvbkNvb3JkcyArPSAxLjA7XG5cdFx0cmVmcmFjdGlvbkNvb3JkcyAvPSAyLjA7XG5cdFx0dmVjMyB0cmFuc21pdHRlZExpZ2h0ID0gZ2V0VHJhbnNtaXNzaW9uU2FtcGxlKHJlZnJhY3Rpb25Db29yZHMsIHBlcmNlcHR1YWxSb3VnaG5lc3MsIGlvcik7XG5cdFx0dmVjMyBhdHRlbnVhdGVkQ29sb3IgPSBhcHBseVZvbHVtZUF0dGVudWF0aW9uKHRyYW5zbWl0dGVkTGlnaHQsIGxlbmd0aCh0cmFuc21pc3Npb25SYXkpLCBhdHRlbnVhdGlvbkNvbG9yLCBhdHRlbnVhdGlvbkRpc3RhbmNlKTtcblx0XHRyZXR1cm4gKDEuMCAtIHNwZWN1bGFyQ29sb3IpICogYXR0ZW51YXRlZENvbG9yICogYmFzZUNvbG9yO1xuXHR9XG4jZW5kaWYiLHV2X3BhcnNfZnJhZ21lbnQ6IiNpZiAoIGRlZmluZWQoIFVTRV9VViApICYmICEgZGVmaW5lZCggVVZTX1ZFUlRFWF9PTkxZICkgKVxuXHR2YXJ5aW5nIHZlYzIgdlV2O1xuI2VuZGlmIix1dl9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9VVlxuXHQjaWZkZWYgVVZTX1ZFUlRFWF9PTkxZXG5cdFx0dmVjMiB2VXY7XG5cdCNlbHNlXG5cdFx0dmFyeWluZyB2ZWMyIHZVdjtcblx0I2VuZGlmXG5cdHVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcbiNlbmRpZiIsdXZfdmVydGV4OiIjaWZkZWYgVVNFX1VWXG5cdHZVdiA9ICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XG4jZW5kaWYiLHV2Ml9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcblx0dmFyeWluZyB2ZWMyIHZVdjI7XG4jZW5kaWYiLHV2Ml9wYXJzX3ZlcnRleDoiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXG5cdGF0dHJpYnV0ZSB2ZWMyIHV2Mjtcblx0dmFyeWluZyB2ZWMyIHZVdjI7XG5cdHVuaWZvcm0gbWF0MyB1djJUcmFuc2Zvcm07XG4jZW5kaWYiLHV2Ml92ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxuXHR2VXYyID0gKCB1djJUcmFuc2Zvcm0gKiB2ZWMzKCB1djIsIDEgKSApLnh5O1xuI2VuZGlmIix3b3JsZHBvc192ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgfHwgZGVmaW5lZCggRElTVEFOQ0UgKSB8fCBkZWZpbmVkICggVVNFX1NIQURPV01BUCApIHx8IGRlZmluZWQgKCBVU0VfVFJBTlNNSVNTSU9OIClcblx0dmVjNCB3b3JsZFBvc2l0aW9uID0gdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuXHQjaWZkZWYgVVNFX0lOU1RBTkNJTkdcblx0XHR3b3JsZFBvc2l0aW9uID0gaW5zdGFuY2VNYXRyaXggKiB3b3JsZFBvc2l0aW9uO1xuXHQjZW5kaWZcblx0d29ybGRQb3NpdGlvbiA9IG1vZGVsTWF0cml4ICogd29ybGRQb3NpdGlvbjtcbiNlbmRpZiIsYmFja2dyb3VuZF9mcmFnOiJ1bmlmb3JtIHNhbXBsZXIyRCB0MkQ7XG52YXJ5aW5nIHZlYzIgdlV2O1xudm9pZCBtYWluKCkge1xuXHR2ZWM0IHRleENvbG9yID0gdGV4dHVyZTJEKCB0MkQsIHZVdiApO1xuXHRnbF9GcmFnQ29sb3IgPSBtYXBUZXhlbFRvTGluZWFyKCB0ZXhDb2xvciApO1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG59IixiYWNrZ3JvdW5kX3ZlcnQ6InZhcnlpbmcgdmVjMiB2VXY7XG51bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XG52b2lkIG1haW4oKSB7XG5cdHZVdiA9ICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XG5cdGdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24ueHksIDEuMCwgMS4wICk7XG59IixjdWJlX2ZyYWc6IiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG52YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0dmVjMyB2UmVmbGVjdCA9IHZXb3JsZERpcmVjdGlvbjtcblx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cblx0Z2xfRnJhZ0NvbG9yID0gZW52Q29sb3I7XG5cdGdsX0ZyYWdDb2xvci5hICo9IG9wYWNpdHk7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cbn0iLGN1YmVfdmVydDoidmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIDxjb21tb24+XG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0Z2xfUG9zaXRpb24ueiA9IGdsX1Bvc2l0aW9uLnc7XG59IixkZXB0aF9mcmFnOiIjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXG5cdHVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxwYWNraW5nPlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxudmFyeWluZyB2ZWMyIHZIaWdoUHJlY2lzaW9uWlc7XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggMS4wICk7XG5cdCNpZiBERVBUSF9QQUNLSU5HID09IDMyMDBcblx0XHRkaWZmdXNlQ29sb3IuYSA9IG9wYWNpdHk7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0ZmxvYXQgZnJhZ0Nvb3JkWiA9IDAuNSAqIHZIaWdoUHJlY2lzaW9uWldbMF0gLyB2SGlnaFByZWNpc2lvblpXWzFdICsgMC41O1xuXHQjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXG5cdFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggdmVjMyggMS4wIC0gZnJhZ0Nvb3JkWiApLCBvcGFjaXR5ICk7XG5cdCNlbGlmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMVxuXHRcdGdsX0ZyYWdDb2xvciA9IHBhY2tEZXB0aFRvUkdCQSggZnJhZ0Nvb3JkWiApO1xuXHQjZW5kaWZcbn0iLGRlcHRoX3ZlcnQ6IiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZhcnlpbmcgdmVjMiB2SGlnaFByZWNpc2lvblpXO1xudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHRcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cblx0XHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0dkhpZ2hQcmVjaXNpb25aVyA9IGdsX1Bvc2l0aW9uLnp3O1xufSIsZGlzdGFuY2VSR0JBX2ZyYWc6IiNkZWZpbmUgRElTVEFOQ0VcbnVuaWZvcm0gdmVjMyByZWZlcmVuY2VQb3NpdGlvbjtcbnVuaWZvcm0gZmxvYXQgbmVhckRpc3RhbmNlO1xudW5pZm9ybSBmbG9hdCBmYXJEaXN0YW5jZTtcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4gKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApO1xuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdGZsb2F0IGRpc3QgPSBsZW5ndGgoIHZXb3JsZFBvc2l0aW9uIC0gcmVmZXJlbmNlUG9zaXRpb24gKTtcblx0ZGlzdCA9ICggZGlzdCAtIG5lYXJEaXN0YW5jZSApIC8gKCBmYXJEaXN0YW5jZSAtIG5lYXJEaXN0YW5jZSApO1xuXHRkaXN0ID0gc2F0dXJhdGUoIGRpc3QgKTtcblx0Z2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBkaXN0ICk7XG59IixkaXN0YW5jZVJHQkFfdmVydDoiI2RlZmluZSBESVNUQU5DRVxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHRcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cblx0XHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0dldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uLnh5ejtcbn0iLGVxdWlyZWN0X2ZyYWc6InVuaWZvcm0gc2FtcGxlcjJEIHRFcXVpcmVjdDtcbnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG4jaW5jbHVkZSA8Y29tbW9uPlxudm9pZCBtYWluKCkge1xuXHR2ZWMzIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdldvcmxkRGlyZWN0aW9uICk7XG5cdHZlYzIgc2FtcGxlVVYgPSBlcXVpcmVjdFV2KCBkaXJlY3Rpb24gKTtcblx0dmVjNCB0ZXhDb2xvciA9IHRleHR1cmUyRCggdEVxdWlyZWN0LCBzYW1wbGVVViApO1xuXHRnbF9GcmFnQ29sb3IgPSBtYXBUZXhlbFRvTGluZWFyKCB0ZXhDb2xvciApO1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG59IixlcXVpcmVjdF92ZXJ0OiJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2luY2x1ZGUgPGNvbW1vbj5cbnZvaWQgbWFpbigpIHtcblx0dldvcmxkRGlyZWN0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxufSIsbGluZWRhc2hlZF9mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnVuaWZvcm0gZmxvYXQgZGFzaFNpemU7XG51bmlmb3JtIGZsb2F0IHRvdGFsU2l6ZTtcbnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHRpZiAoIG1vZCggdkxpbmVEaXN0YW5jZSwgdG90YWxTaXplICkgPiBkYXNoU2l6ZSApIHtcblx0XHRkaXNjYXJkO1xuXHR9XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApO1xuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XG5cdG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiO1xuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxufSIsbGluZWRhc2hlZF92ZXJ0OiJ1bmlmb3JtIGZsb2F0IHNjYWxlO1xuYXR0cmlidXRlIGZsb2F0IGxpbmVEaXN0YW5jZTtcbnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0dkxpbmVEaXN0YW5jZSA9IHNjYWxlICogbGluZURpc3RhbmNlO1xuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn0iLG1lc2hiYXNpY19mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHQjaWZkZWYgVVNFX0xJR0hUTUFQXG5cdFxuXHRcdHZlYzQgbGlnaHRNYXBUZXhlbD0gdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBsaWdodE1hcFRleGVsVG9MaW5lYXIoIGxpZ2h0TWFwVGV4ZWwgKS5yZ2IgKiBsaWdodE1hcEludGVuc2l0eTtcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gdmVjMyggMS4wICk7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBkaWZmdXNlQ29sb3IucmdiO1xuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2U7XG5cdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XG59IixtZXNoYmFzaWNfdmVydDoiI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx1djJfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxuXHQjaWYgZGVmaW5lZCAoIFVTRV9FTlZNQVAgKSB8fCBkZWZpbmVkICggVVNFX1NLSU5OSU5HIClcblx0XHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHRcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cblx0XHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuXHQjZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufSIsbWVzaGxhbWJlcnRfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XG52YXJ5aW5nIHZlYzMgdkluZGlyZWN0RnJvbnQ7XG4jaWZkZWYgRE9VQkxFX1NJREVEXG5cdHZhcnlpbmcgdmVjMyB2TGlnaHRCYWNrO1xuXHR2YXJ5aW5nIHZlYzMgdkluZGlyZWN0QmFjaztcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxwYWNraW5nPlxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YnNkZnM+XG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFza19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlID0gZW1pc3NpdmU7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxuXHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9ICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZJbmRpcmVjdEZyb250IDogdkluZGlyZWN0QmFjaztcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gdkluZGlyZWN0RnJvbnQ7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8bGlnaHRtYXBfZnJhZ21lbnQ+XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBCUkRGX0RpZmZ1c2VfTGFtYmVydCggZGlmZnVzZUNvbG9yLnJnYiApO1xuXHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSA9ICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZMaWdodEZyb250IDogdkxpZ2h0QmFjaztcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlID0gdkxpZ2h0RnJvbnQ7XG5cdCNlbmRpZlxuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICo9IEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBkaWZmdXNlQ29sb3IucmdiICkgKiBnZXRTaGFkb3dNYXNrKCk7XG5cdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcblx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cbn0iLG1lc2hsYW1iZXJ0X3ZlcnQ6IiNkZWZpbmUgTEFNQkVSVFxudmFyeWluZyB2ZWMzIHZMaWdodEZyb250O1xudmFyeWluZyB2ZWMzIHZJbmRpcmVjdEZyb250O1xuI2lmZGVmIERPVUJMRV9TSURFRFxuXHR2YXJ5aW5nIHZlYzMgdkxpZ2h0QmFjaztcblx0dmFyeWluZyB2ZWMzIHZJbmRpcmVjdEJhY2s7XG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxic2Rmcz5cbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPGxpZ2h0c19sYW1iZXJ0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufSIsbWVzaG1hdGNhcF9mcmFnOiIjZGVmaW5lIE1BVENBUFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG51bmlmb3JtIHNhbXBsZXIyRCBtYXRjYXA7XG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPlxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XG5cdHZlYzMgdmlld0RpciA9IG5vcm1hbGl6ZSggdlZpZXdQb3NpdGlvbiApO1xuXHR2ZWMzIHggPSBub3JtYWxpemUoIHZlYzMoIHZpZXdEaXIueiwgMC4wLCAtIHZpZXdEaXIueCApICk7XG5cdHZlYzMgeSA9IGNyb3NzKCB2aWV3RGlyLCB4ICk7XG5cdHZlYzIgdXYgPSB2ZWMyKCBkb3QoIHgsIG5vcm1hbCApLCBkb3QoIHksIG5vcm1hbCApICkgKiAwLjQ5NSArIDAuNTtcblx0I2lmZGVmIFVTRV9NQVRDQVBcblx0XHR2ZWM0IG1hdGNhcENvbG9yID0gdGV4dHVyZTJEKCBtYXRjYXAsIHV2ICk7XG5cdFx0bWF0Y2FwQ29sb3IgPSBtYXRjYXBUZXhlbFRvTGluZWFyKCBtYXRjYXBDb2xvciApO1xuXHQjZWxzZVxuXHRcdHZlYzQgbWF0Y2FwQ29sb3IgPSB2ZWM0KCAxLjAgKTtcblx0I2VuZGlmXG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2IgKiBtYXRjYXBDb2xvci5yZ2I7XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XG59IixtZXNobWF0Y2FwX3ZlcnQ6IiNkZWZpbmUgTUFUQ0FQXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuXHQjaWZuZGVmIEZMQVRfU0hBREVEXG5cdFx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcblx0XHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHRcdHZUYW5nZW50ID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZFRhbmdlbnQgKTtcblx0XHRcdHZCaXRhbmdlbnQgPSBub3JtYWxpemUoIGNyb3NzKCB2Tm9ybWFsLCB2VGFuZ2VudCApICogdGFuZ2VudC53ICk7XG5cdFx0I2VuZGlmXG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XG5cdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xufSIsbWVzaHRvb25fZnJhZzoiI2RlZmluZSBUT09OXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJzZGZzPlxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxuI2luY2x1ZGUgPGxpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPlxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XG5cdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGxpZ2h0c190b29uX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+XG5cdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPlxuXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XG59IixtZXNodG9vbl92ZXJ0OiIjZGVmaW5lIFRPT05cbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG4jZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XG59IixtZXNocGhvbmdfZnJhZzoiI2RlZmluZSBQSE9OR1xudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XG51bmlmb3JtIHZlYzMgc3BlY3VsYXI7XG51bmlmb3JtIGZsb2F0IHNoaW5pbmVzcztcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJzZGZzPlxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxuI2luY2x1ZGUgPGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz5cblx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bGlnaHRzX3Bob25nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+XG5cdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPlxuXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5cdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XG59IixtZXNocGhvbmdfdmVydDoiI2RlZmluZSBQSE9OR1xudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG4jZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufSIsbWVzaHBoeXNpY2FsX2ZyYWc6IiNkZWZpbmUgU1RBTkRBUkRcbiNpZmRlZiBQSFlTSUNBTFxuXHQjZGVmaW5lIFJFRkxFQ1RJVklUWVxuXHQjZGVmaW5lIENMRUFSQ09BVFxuXHQjZGVmaW5lIFNQRUNVTEFSXG4jZW5kaWZcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xudW5pZm9ybSBmbG9hdCByb3VnaG5lc3M7XG51bmlmb3JtIGZsb2F0IG1ldGFsbmVzcztcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OXG5cdHVuaWZvcm0gZmxvYXQgdHJhbnNtaXNzaW9uO1xuXHR1bmlmb3JtIGZsb2F0IHRoaWNrbmVzcztcblx0dW5pZm9ybSBmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlO1xuXHR1bmlmb3JtIHZlYzMgYXR0ZW51YXRpb25UaW50O1xuI2VuZGlmXG4jaWZkZWYgUkVGTEVDVElWSVRZXG5cdHVuaWZvcm0gZmxvYXQgcmVmbGVjdGl2aXR5O1xuI2VuZGlmXG4jaWZkZWYgU1BFQ1VMQVJcblx0dW5pZm9ybSBmbG9hdCBzcGVjdWxhckludGVuc2l0eTtcblx0dW5pZm9ybSB2ZWMzIHNwZWN1bGFyVGludDtcblx0I2lmZGVmIFVTRV9TUEVDVUxBUklOVEVOU0lUWU1BUFxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIHNwZWN1bGFySW50ZW5zaXR5TWFwO1xuXHQjZW5kaWZcblx0I2lmZGVmIFVTRV9TUEVDVUxBUlRJTlRNQVBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhclRpbnRNYXA7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaWZkZWYgQ0xFQVJDT0FUXG5cdHVuaWZvcm0gZmxvYXQgY2xlYXJjb2F0O1xuXHR1bmlmb3JtIGZsb2F0IGNsZWFyY29hdFJvdWdobmVzcztcbiNlbmRpZlxuI2lmZGVmIFVTRV9TSEVFTlxuXHR1bmlmb3JtIHZlYzMgc2hlZW47XG4jZW5kaWZcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxwYWNraW5nPlxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJzZGZzPlxuI2luY2x1ZGUgPHRyYW5zbWlzc2lvbl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cbiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XG4jaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsZWFyY29hdF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8cm91Z2huZXNzbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWV0YWxuZXNzbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPlxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XG5cdCNpbmNsdWRlIDxjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luPlxuXHQjaW5jbHVkZSA8Y2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzPlxuXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+XG5cdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfbWFwcz5cblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+XG5cdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cblx0dmVjMyB0b3RhbERpZmZ1c2UgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlO1xuXHR2ZWMzIHRvdGFsU3BlY3VsYXIgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXI7XG5cdCNpbmNsdWRlIDx0cmFuc21pc3Npb25fZnJhZ21lbnQ+XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHRvdGFsRGlmZnVzZSArIHRvdGFsU3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XG59IixtZXNocGh5c2ljYWxfdmVydDoiI2RlZmluZSBTVEFOREFSRFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaWZkZWYgVVNFX1RSQU5TTUlTU0lPTlxuXHR2YXJ5aW5nIHZlYzQgdldvcmxkUG9zaXRpb247XG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2VGFuZ2VudCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWRUYW5nZW50ICk7XG5cdFx0dkJpdGFuZ2VudCA9IG5vcm1hbGl6ZSggY3Jvc3MoIHZOb3JtYWwsIHZUYW5nZW50ICkgKiB0YW5nZW50LncgKTtcblx0I2VuZGlmXG4jZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XG4jaWZkZWYgVVNFX1RSQU5TTUlTU0lPTlxuXHR2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb247XG4jZW5kaWZcbn0iLG5vcm1hbF9mcmFnOiIjZGVmaW5lIE5PUk1BTFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jZW5kaWZcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIDxwYWNraW5nPlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBwYWNrTm9ybWFsVG9SR0IoIG5vcm1hbCApLCBvcGFjaXR5ICk7XG59Iixub3JtYWxfdmVydDoiI2RlZmluZSBOT1JNQUxcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2VGFuZ2VudCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWRUYW5nZW50ICk7XG5cdFx0dkJpdGFuZ2VudCA9IG5vcm1hbGl6ZSggY3Jvc3MoIHZOb3JtYWwsIHZUYW5nZW50ICkgKiB0YW5nZW50LncgKTtcblx0I2VuZGlmXG4jZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKVxuXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcbiNlbmRpZlxufSIscG9pbnRzX2ZyYWc6InVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApO1xuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWFwX3BhcnRpY2xlX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiO1xuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxufSIscG9pbnRzX3ZlcnQ6InVuaWZvcm0gZmxvYXQgc2l6ZTtcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0Z2xfUG9pbnRTaXplID0gc2l6ZTtcblx0I2lmZGVmIFVTRV9TSVpFQVRURU5VQVRJT05cblx0XHRib29sIGlzUGVyc3BlY3RpdmUgPSBpc1BlcnNwZWN0aXZlTWF0cml4KCBwcm9qZWN0aW9uTWF0cml4ICk7XG5cdFx0aWYgKCBpc1BlcnNwZWN0aXZlICkgZ2xfUG9pbnRTaXplICo9ICggc2NhbGUgLyAtIG12UG9zaXRpb24ueiApO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufSIsc2hhZG93X2ZyYWc6InVuaWZvcm0gdmVjMyBjb2xvcjtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxic2Rmcz5cbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIGNvbG9yLCBvcGFjaXR5ICogKCAxLjAgLSBnZXRTaGFkb3dNYXNrKCkgKSApO1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG59IixzaGFkb3dfdmVydDoiI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XG59IixzcHJpdGVfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTtcblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHRvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxufSIsc3ByaXRlX3ZlcnQ6InVuaWZvcm0gZmxvYXQgcm90YXRpb247XG51bmlmb3JtIHZlYzIgY2VudGVyO1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHR2ZWM0IG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTtcblx0dmVjMiBzY2FsZTtcblx0c2NhbGUueCA9IGxlbmd0aCggdmVjMyggbW9kZWxNYXRyaXhbIDAgXS54LCBtb2RlbE1hdHJpeFsgMCBdLnksIG1vZGVsTWF0cml4WyAwIF0ueiApICk7XG5cdHNjYWxlLnkgPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAxIF0ueCwgbW9kZWxNYXRyaXhbIDEgXS55LCBtb2RlbE1hdHJpeFsgMSBdLnogKSApO1xuXHQjaWZuZGVmIFVTRV9TSVpFQVRURU5VQVRJT05cblx0XHRib29sIGlzUGVyc3BlY3RpdmUgPSBpc1BlcnNwZWN0aXZlTWF0cml4KCBwcm9qZWN0aW9uTWF0cml4ICk7XG5cdFx0aWYgKCBpc1BlcnNwZWN0aXZlICkgc2NhbGUgKj0gLSBtdlBvc2l0aW9uLno7XG5cdCNlbmRpZlxuXHR2ZWMyIGFsaWduZWRQb3NpdGlvbiA9ICggcG9zaXRpb24ueHkgLSAoIGNlbnRlciAtIHZlYzIoIDAuNSApICkgKSAqIHNjYWxlO1xuXHR2ZWMyIHJvdGF0ZWRQb3NpdGlvbjtcblx0cm90YXRlZFBvc2l0aW9uLnggPSBjb3MoIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCAtIHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55O1xuXHRyb3RhdGVkUG9zaXRpb24ueSA9IHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54ICsgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7XG5cdG12UG9zaXRpb24ueHkgKz0gcm90YXRlZFBvc2l0aW9uO1xuXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XG59In0sbDB0PXtjb21tb246e2RpZmZ1c2U6e3ZhbHVlOm5ldyAkUXQoMTY3NzcyMTUpfSxvcGFjaXR5Ont2YWx1ZToxfSxtYXA6e3ZhbHVlOm51bGx9LHV2VHJhbnNmb3JtOnt2YWx1ZTpuZXcgZ0p0fSx1djJUcmFuc2Zvcm06e3ZhbHVlOm5ldyBnSnR9LGFscGhhTWFwOnt2YWx1ZTpudWxsfX0sc3BlY3VsYXJtYXA6e3NwZWN1bGFyTWFwOnt2YWx1ZTpudWxsfX0sZW52bWFwOntlbnZNYXA6e3ZhbHVlOm51bGx9LGZsaXBFbnZNYXA6e3ZhbHVlOi0xfSxyZWZsZWN0aXZpdHk6e3ZhbHVlOjF9LHJlZnJhY3Rpb25SYXRpbzp7dmFsdWU6Ljk4fSxtYXhNaXBMZXZlbDp7dmFsdWU6MH19LGFvbWFwOnthb01hcDp7dmFsdWU6bnVsbH0sYW9NYXBJbnRlbnNpdHk6e3ZhbHVlOjF9fSxsaWdodG1hcDp7bGlnaHRNYXA6e3ZhbHVlOm51bGx9LGxpZ2h0TWFwSW50ZW5zaXR5Ont2YWx1ZToxfX0sZW1pc3NpdmVtYXA6e2VtaXNzaXZlTWFwOnt2YWx1ZTpudWxsfX0sYnVtcG1hcDp7YnVtcE1hcDp7dmFsdWU6bnVsbH0sYnVtcFNjYWxlOnt2YWx1ZToxfX0sbm9ybWFsbWFwOntub3JtYWxNYXA6e3ZhbHVlOm51bGx9LG5vcm1hbFNjYWxlOnt2YWx1ZTpuZXcgbUp0KDEsMSl9fSxkaXNwbGFjZW1lbnRtYXA6e2Rpc3BsYWNlbWVudE1hcDp7dmFsdWU6bnVsbH0sZGlzcGxhY2VtZW50U2NhbGU6e3ZhbHVlOjF9LGRpc3BsYWNlbWVudEJpYXM6e3ZhbHVlOjB9fSxyb3VnaG5lc3NtYXA6e3JvdWdobmVzc01hcDp7dmFsdWU6bnVsbH19LG1ldGFsbmVzc21hcDp7bWV0YWxuZXNzTWFwOnt2YWx1ZTpudWxsfX0sZ3JhZGllbnRtYXA6e2dyYWRpZW50TWFwOnt2YWx1ZTpudWxsfX0sZm9nOntmb2dEZW5zaXR5Ont2YWx1ZToyNWUtNX0sZm9nTmVhcjp7dmFsdWU6MX0sZm9nRmFyOnt2YWx1ZToyZTN9LGZvZ0NvbG9yOnt2YWx1ZTpuZXcgJFF0KDE2Nzc3MjE1KX19LGxpZ2h0czp7YW1iaWVudExpZ2h0Q29sb3I6e3ZhbHVlOltdfSxsaWdodFByb2JlOnt2YWx1ZTpbXX0sZGlyZWN0aW9uYWxMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2RpcmVjdGlvbjp7fSxjb2xvcjp7fX19LGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntzaGFkb3dCaWFzOnt9LHNoYWRvd05vcm1hbEJpYXM6e30sc2hhZG93UmFkaXVzOnt9LHNoYWRvd01hcFNpemU6e319fSxkaXJlY3Rpb25hbFNoYWRvd01hcDp7dmFsdWU6W119LGRpcmVjdGlvbmFsU2hhZG93TWF0cml4Ont2YWx1ZTpbXX0sc3BvdExpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7Y29sb3I6e30scG9zaXRpb246e30sZGlyZWN0aW9uOnt9LGRpc3RhbmNlOnt9LGNvbmVDb3M6e30scGVudW1icmFDb3M6e30sZGVjYXk6e319fSxzcG90TGlnaHRTaGFkb3dzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntzaGFkb3dCaWFzOnt9LHNoYWRvd05vcm1hbEJpYXM6e30sc2hhZG93UmFkaXVzOnt9LHNoYWRvd01hcFNpemU6e319fSxzcG90U2hhZG93TWFwOnt2YWx1ZTpbXX0sc3BvdFNoYWRvd01hdHJpeDp7dmFsdWU6W119LHBvaW50TGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSxwb3NpdGlvbjp7fSxkZWNheTp7fSxkaXN0YW5jZTp7fX19LHBvaW50TGlnaHRTaGFkb3dzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntzaGFkb3dCaWFzOnt9LHNoYWRvd05vcm1hbEJpYXM6e30sc2hhZG93UmFkaXVzOnt9LHNoYWRvd01hcFNpemU6e30sc2hhZG93Q2FtZXJhTmVhcjp7fSxzaGFkb3dDYW1lcmFGYXI6e319fSxwb2ludFNoYWRvd01hcDp7dmFsdWU6W119LHBvaW50U2hhZG93TWF0cml4Ont2YWx1ZTpbXX0saGVtaXNwaGVyZUxpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7ZGlyZWN0aW9uOnt9LHNreUNvbG9yOnt9LGdyb3VuZENvbG9yOnt9fX0scmVjdEFyZWFMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2NvbG9yOnt9LHBvc2l0aW9uOnt9LHdpZHRoOnt9LGhlaWdodDp7fX19LGx0Y18xOnt2YWx1ZTpudWxsfSxsdGNfMjp7dmFsdWU6bnVsbH19LHBvaW50czp7ZGlmZnVzZTp7dmFsdWU6bmV3ICRRdCgxNjc3NzIxNSl9LG9wYWNpdHk6e3ZhbHVlOjF9LHNpemU6e3ZhbHVlOjF9LHNjYWxlOnt2YWx1ZToxfSxtYXA6e3ZhbHVlOm51bGx9LGFscGhhTWFwOnt2YWx1ZTpudWxsfSx1dlRyYW5zZm9ybTp7dmFsdWU6bmV3IGdKdH19LHNwcml0ZTp7ZGlmZnVzZTp7dmFsdWU6bmV3ICRRdCgxNjc3NzIxNSl9LG9wYWNpdHk6e3ZhbHVlOjF9LGNlbnRlcjp7dmFsdWU6bmV3IG1KdCguNSwuNSl9LHJvdGF0aW9uOnt2YWx1ZTowfSxtYXA6e3ZhbHVlOm51bGx9LGFscGhhTWFwOnt2YWx1ZTpudWxsfSx1dlRyYW5zZm9ybTp7dmFsdWU6bmV3IGdKdH19fSxjMHQ9e2Jhc2ljOnt1bmlmb3JtczpVMXQoW2wwdC5jb21tb24sbDB0LnNwZWN1bGFybWFwLGwwdC5lbnZtYXAsbDB0LmFvbWFwLGwwdC5saWdodG1hcCxsMHQuZm9nXSksdmVydGV4U2hhZGVyOnMwdC5tZXNoYmFzaWNfdmVydCxmcmFnbWVudFNoYWRlcjpzMHQubWVzaGJhc2ljX2ZyYWd9LGxhbWJlcnQ6e3VuaWZvcm1zOlUxdChbbDB0LmNvbW1vbixsMHQuc3BlY3VsYXJtYXAsbDB0LmVudm1hcCxsMHQuYW9tYXAsbDB0LmxpZ2h0bWFwLGwwdC5lbWlzc2l2ZW1hcCxsMHQuZm9nLGwwdC5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgJFF0KDApfX1dKSx2ZXJ0ZXhTaGFkZXI6czB0Lm1lc2hsYW1iZXJ0X3ZlcnQsZnJhZ21lbnRTaGFkZXI6czB0Lm1lc2hsYW1iZXJ0X2ZyYWd9LHBob25nOnt1bmlmb3JtczpVMXQoW2wwdC5jb21tb24sbDB0LnNwZWN1bGFybWFwLGwwdC5lbnZtYXAsbDB0LmFvbWFwLGwwdC5saWdodG1hcCxsMHQuZW1pc3NpdmVtYXAsbDB0LmJ1bXBtYXAsbDB0Lm5vcm1hbG1hcCxsMHQuZGlzcGxhY2VtZW50bWFwLGwwdC5mb2csbDB0LmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyAkUXQoMCl9LHNwZWN1bGFyOnt2YWx1ZTpuZXcgJFF0KDExMTg0ODEpfSxzaGluaW5lc3M6e3ZhbHVlOjMwfX1dKSx2ZXJ0ZXhTaGFkZXI6czB0Lm1lc2hwaG9uZ192ZXJ0LGZyYWdtZW50U2hhZGVyOnMwdC5tZXNocGhvbmdfZnJhZ30sc3RhbmRhcmQ6e3VuaWZvcm1zOlUxdChbbDB0LmNvbW1vbixsMHQuZW52bWFwLGwwdC5hb21hcCxsMHQubGlnaHRtYXAsbDB0LmVtaXNzaXZlbWFwLGwwdC5idW1wbWFwLGwwdC5ub3JtYWxtYXAsbDB0LmRpc3BsYWNlbWVudG1hcCxsMHQucm91Z2huZXNzbWFwLGwwdC5tZXRhbG5lc3NtYXAsbDB0LmZvZyxsMHQubGlnaHRzLHtlbWlzc2l2ZTp7dmFsdWU6bmV3ICRRdCgwKX0scm91Z2huZXNzOnt2YWx1ZToxfSxtZXRhbG5lc3M6e3ZhbHVlOjB9LGVudk1hcEludGVuc2l0eTp7dmFsdWU6MX19XSksdmVydGV4U2hhZGVyOnMwdC5tZXNocGh5c2ljYWxfdmVydCxmcmFnbWVudFNoYWRlcjpzMHQubWVzaHBoeXNpY2FsX2ZyYWd9LHRvb246e3VuaWZvcm1zOlUxdChbbDB0LmNvbW1vbixsMHQuYW9tYXAsbDB0LmxpZ2h0bWFwLGwwdC5lbWlzc2l2ZW1hcCxsMHQuYnVtcG1hcCxsMHQubm9ybWFsbWFwLGwwdC5kaXNwbGFjZW1lbnRtYXAsbDB0LmdyYWRpZW50bWFwLGwwdC5mb2csbDB0LmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyAkUXQoMCl9fV0pLHZlcnRleFNoYWRlcjpzMHQubWVzaHRvb25fdmVydCxmcmFnbWVudFNoYWRlcjpzMHQubWVzaHRvb25fZnJhZ30sbWF0Y2FwOnt1bmlmb3JtczpVMXQoW2wwdC5jb21tb24sbDB0LmJ1bXBtYXAsbDB0Lm5vcm1hbG1hcCxsMHQuZGlzcGxhY2VtZW50bWFwLGwwdC5mb2cse21hdGNhcDp7dmFsdWU6bnVsbH19XSksdmVydGV4U2hhZGVyOnMwdC5tZXNobWF0Y2FwX3ZlcnQsZnJhZ21lbnRTaGFkZXI6czB0Lm1lc2htYXRjYXBfZnJhZ30scG9pbnRzOnt1bmlmb3JtczpVMXQoW2wwdC5wb2ludHMsbDB0LmZvZ10pLHZlcnRleFNoYWRlcjpzMHQucG9pbnRzX3ZlcnQsZnJhZ21lbnRTaGFkZXI6czB0LnBvaW50c19mcmFnfSxkYXNoZWQ6e3VuaWZvcm1zOlUxdChbbDB0LmNvbW1vbixsMHQuZm9nLHtzY2FsZTp7dmFsdWU6MX0sZGFzaFNpemU6e3ZhbHVlOjF9LHRvdGFsU2l6ZTp7dmFsdWU6Mn19XSksdmVydGV4U2hhZGVyOnMwdC5saW5lZGFzaGVkX3ZlcnQsZnJhZ21lbnRTaGFkZXI6czB0LmxpbmVkYXNoZWRfZnJhZ30sZGVwdGg6e3VuaWZvcm1zOlUxdChbbDB0LmNvbW1vbixsMHQuZGlzcGxhY2VtZW50bWFwXSksdmVydGV4U2hhZGVyOnMwdC5kZXB0aF92ZXJ0LGZyYWdtZW50U2hhZGVyOnMwdC5kZXB0aF9mcmFnfSxub3JtYWw6e3VuaWZvcm1zOlUxdChbbDB0LmNvbW1vbixsMHQuYnVtcG1hcCxsMHQubm9ybWFsbWFwLGwwdC5kaXNwbGFjZW1lbnRtYXAse29wYWNpdHk6e3ZhbHVlOjF9fV0pLHZlcnRleFNoYWRlcjpzMHQubm9ybWFsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6czB0Lm5vcm1hbF9mcmFnfSxzcHJpdGU6e3VuaWZvcm1zOlUxdChbbDB0LnNwcml0ZSxsMHQuZm9nXSksdmVydGV4U2hhZGVyOnMwdC5zcHJpdGVfdmVydCxmcmFnbWVudFNoYWRlcjpzMHQuc3ByaXRlX2ZyYWd9LGJhY2tncm91bmQ6e3VuaWZvcm1zOnt1dlRyYW5zZm9ybTp7dmFsdWU6bmV3IGdKdH0sdDJEOnt2YWx1ZTpudWxsfX0sdmVydGV4U2hhZGVyOnMwdC5iYWNrZ3JvdW5kX3ZlcnQsZnJhZ21lbnRTaGFkZXI6czB0LmJhY2tncm91bmRfZnJhZ30sY3ViZTp7dW5pZm9ybXM6VTF0KFtsMHQuZW52bWFwLHtvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6czB0LmN1YmVfdmVydCxmcmFnbWVudFNoYWRlcjpzMHQuY3ViZV9mcmFnfSxlcXVpcmVjdDp7dW5pZm9ybXM6e3RFcXVpcmVjdDp7dmFsdWU6bnVsbH19LHZlcnRleFNoYWRlcjpzMHQuZXF1aXJlY3RfdmVydCxmcmFnbWVudFNoYWRlcjpzMHQuZXF1aXJlY3RfZnJhZ30sZGlzdGFuY2VSR0JBOnt1bmlmb3JtczpVMXQoW2wwdC5jb21tb24sbDB0LmRpc3BsYWNlbWVudG1hcCx7cmVmZXJlbmNlUG9zaXRpb246e3ZhbHVlOm5ldyBDSnR9LG5lYXJEaXN0YW5jZTp7dmFsdWU6MX0sZmFyRGlzdGFuY2U6e3ZhbHVlOjFlM319XSksdmVydGV4U2hhZGVyOnMwdC5kaXN0YW5jZVJHQkFfdmVydCxmcmFnbWVudFNoYWRlcjpzMHQuZGlzdGFuY2VSR0JBX2ZyYWd9LHNoYWRvdzp7dW5pZm9ybXM6VTF0KFtsMHQubGlnaHRzLGwwdC5mb2cse2NvbG9yOnt2YWx1ZTpuZXcgJFF0KDApfSxvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6czB0LnNoYWRvd192ZXJ0LGZyYWdtZW50U2hhZGVyOnMwdC5zaGFkb3dfZnJhZ319O2Z1bmN0aW9uIHUwdCh0LGUsbixpLHIpe2NvbnN0IG89bmV3ICRRdCgwKTtsZXQgYSxzLGw9MCxjPW51bGwsdT0wLGg9bnVsbDtmdW5jdGlvbiBkKHQsZSl7bi5idWZmZXJzLmNvbG9yLnNldENsZWFyKHQucix0LmcsdC5iLGUscil9cmV0dXJue2dldENsZWFyQ29sb3I6ZnVuY3Rpb24oKXtyZXR1cm4gb30sc2V0Q2xlYXJDb2xvcjpmdW5jdGlvbih0LGU9MSl7by5zZXQodCksbD1lLGQobyxsKX0sZ2V0Q2xlYXJBbHBoYTpmdW5jdGlvbigpe3JldHVybiBsfSxzZXRDbGVhckFscGhhOmZ1bmN0aW9uKHQpe2w9dCxkKG8sbCl9LHJlbmRlcjpmdW5jdGlvbiBwKG4scil7bGV0IHA9ITEsZj0hMD09PXIuaXNTY2VuZT9yLmJhY2tncm91bmQ6bnVsbDtmJiZmLmlzVGV4dHVyZSYmKGY9ZS5nZXQoZikpO2NvbnN0IG09dC54cixnPW0uZ2V0U2Vzc2lvbiYmbS5nZXRTZXNzaW9uKCk7ZyYmImFkZGl0aXZlIj09PWcuZW52aXJvbm1lbnRCbGVuZE1vZGUmJihmPW51bGwpLG51bGw9PT1mP2QobyxsKTpmJiZmLmlzQ29sb3ImJihkKGYsMSkscD0hMCksKHQuYXV0b0NsZWFyfHxwKSYmdC5jbGVhcih0LmF1dG9DbGVhckNvbG9yLHQuYXV0b0NsZWFyRGVwdGgsdC5hdXRvQ2xlYXJTdGVuY2lsKSxmJiYoZi5pc0N1YmVUZXh0dXJlfHxmLm1hcHBpbmc9PT1ZS3QpPyh2b2lkIDA9PT1zJiYocz1uZXcgQjF0KG5ldyBGMXQoMSwxLDEpLG5ldyBHMXQoe25hbWU6IkJhY2tncm91bmRDdWJlTWF0ZXJpYWwiLHVuaWZvcm1zOlYxdChjMHQuY3ViZS51bmlmb3JtcyksdmVydGV4U2hhZGVyOmMwdC5jdWJlLnZlcnRleFNoYWRlcixmcmFnbWVudFNoYWRlcjpjMHQuY3ViZS5mcmFnbWVudFNoYWRlcixzaWRlOjEsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsZm9nOiExfSkpLHMuZ2VvbWV0cnkuZGVsZXRlQXR0cmlidXRlKCJub3JtYWwiKSxzLmdlb21ldHJ5LmRlbGV0ZUF0dHJpYnV0ZSgidXYiKSxzLm9uQmVmb3JlUmVuZGVyPWZ1bmN0aW9uKHQsZSxuKXt0aGlzLm1hdHJpeFdvcmxkLmNvcHlQb3NpdGlvbihuLm1hdHJpeFdvcmxkKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHMubWF0ZXJpYWwsImVudk1hcCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVuaWZvcm1zLmVudk1hcC52YWx1ZX19KSxpLnVwZGF0ZShzKSkscy5tYXRlcmlhbC51bmlmb3Jtcy5lbnZNYXAudmFsdWU9ZixzLm1hdGVyaWFsLnVuaWZvcm1zLmZsaXBFbnZNYXAudmFsdWU9Zi5pc0N1YmVUZXh0dXJlJiYhMT09PWYuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPy0xOjEsYz09PWYmJnU9PT1mLnZlcnNpb24mJmg9PT10LnRvbmVNYXBwaW5nfHwocy5tYXRlcmlhbC5uZWVkc1VwZGF0ZT0hMCxjPWYsdT1mLnZlcnNpb24saD10LnRvbmVNYXBwaW5nKSxuLnVuc2hpZnQocyxzLmdlb21ldHJ5LHMubWF0ZXJpYWwsMCwwLG51bGwpKTpmJiZmLmlzVGV4dHVyZSYmKHZvaWQgMD09PWEmJihhPW5ldyBCMXQobmV3IGEwdCgyLDIpLG5ldyBHMXQoe25hbWU6IkJhY2tncm91bmRNYXRlcmlhbCIsdW5pZm9ybXM6VjF0KGMwdC5iYWNrZ3JvdW5kLnVuaWZvcm1zKSx2ZXJ0ZXhTaGFkZXI6YzB0LmJhY2tncm91bmQudmVydGV4U2hhZGVyLGZyYWdtZW50U2hhZGVyOmMwdC5iYWNrZ3JvdW5kLmZyYWdtZW50U2hhZGVyLHNpZGU6MCxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSxmb2c6ITF9KSksYS5nZW9tZXRyeS5kZWxldGVBdHRyaWJ1dGUoIm5vcm1hbCIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLm1hdGVyaWFsLCJtYXAiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy50MkQudmFsdWV9fSksaS51cGRhdGUoYSkpLGEubWF0ZXJpYWwudW5pZm9ybXMudDJELnZhbHVlPWYsITA9PT1mLm1hdHJpeEF1dG9VcGRhdGUmJmYudXBkYXRlTWF0cml4KCksYS5tYXRlcmlhbC51bmlmb3Jtcy51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KGYubWF0cml4KSxjPT09ZiYmdT09PWYudmVyc2lvbiYmaD09PXQudG9uZU1hcHBpbmd8fChhLm1hdGVyaWFsLm5lZWRzVXBkYXRlPSEwLGM9Zix1PWYudmVyc2lvbixoPXQudG9uZU1hcHBpbmcpLG4udW5zaGlmdChhLGEuZ2VvbWV0cnksYS5tYXRlcmlhbCwwLDAsbnVsbCkpfX19ZnVuY3Rpb24gaDB0KHQsZSxuLGkpe2NvbnN0IHI9dC5nZXRQYXJhbWV0ZXIoMzQ5MjEpLG89aS5pc1dlYkdMMj9udWxsOmUuZ2V0KCJPRVNfdmVydGV4X2FycmF5X29iamVjdCIpLGE9aS5pc1dlYkdMMnx8bnVsbCE9PW8scz17fSxsPWQobnVsbCk7bGV0IGM9bDtmdW5jdGlvbiB1KGUpe3JldHVybiBpLmlzV2ViR0wyP3QuYmluZFZlcnRleEFycmF5KGUpOm8uYmluZFZlcnRleEFycmF5T0VTKGUpfWZ1bmN0aW9uIGgoZSl7cmV0dXJuIGkuaXNXZWJHTDI/dC5kZWxldGVWZXJ0ZXhBcnJheShlKTpvLmRlbGV0ZVZlcnRleEFycmF5T0VTKGUpfWZ1bmN0aW9uIGQodCl7Y29uc3QgZT1bXSxuPVtdLGk9W107Zm9yKGxldCB0PTA7dDxyO3QrKyllW3RdPTAsblt0XT0wLGlbdF09MDtyZXR1cm57Z2VvbWV0cnk6bnVsbCxwcm9ncmFtOm51bGwsd2lyZWZyYW1lOiExLG5ld0F0dHJpYnV0ZXM6ZSxlbmFibGVkQXR0cmlidXRlczpuLGF0dHJpYnV0ZURpdmlzb3JzOmksb2JqZWN0OnQsYXR0cmlidXRlczp7fSxpbmRleDpudWxsfX1mdW5jdGlvbiBwKCl7Y29uc3QgdD1jLm5ld0F0dHJpYnV0ZXM7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXRbZV09MH1mdW5jdGlvbiBmKHQpe20odCwwKX1mdW5jdGlvbiBtKG4scil7Y29uc3Qgbz1jLmVuYWJsZWRBdHRyaWJ1dGVzLGE9Yy5hdHRyaWJ1dGVEaXZpc29ycztjLm5ld0F0dHJpYnV0ZXNbbl09MSwwPT09b1tuXSYmKHQuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobiksb1tuXT0xKSxhW25dIT09ciYmKChpLmlzV2ViR0wyP3Q6ZS5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSlbaS5pc1dlYkdMMj8idmVydGV4QXR0cmliRGl2aXNvciI6InZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRSJdKG4sciksYVtuXT1yKX1mdW5jdGlvbiBnKCl7Y29uc3QgZT1jLm5ld0F0dHJpYnV0ZXMsbj1jLmVuYWJsZWRBdHRyaWJ1dGVzO2ZvcihsZXQgaT0wLHI9bi5sZW5ndGg7aTxyO2krKyluW2ldIT09ZVtpXSYmKHQuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGkpLG5baV09MCl9ZnVuY3Rpb24gXyhlLG4scixvLGEscyl7ITAhPT1pLmlzV2ViR0wyfHw1MTI0IT09ciYmNTEyNSE9PXI/dC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUsbixyLG8sYSxzKTp0LnZlcnRleEF0dHJpYklQb2ludGVyKGUsbixyLGEscyl9ZnVuY3Rpb24geSgpe3YoKSxjIT09bCYmKGM9bCx1KGMub2JqZWN0KSl9ZnVuY3Rpb24gdigpe2wuZ2VvbWV0cnk9bnVsbCxsLnByb2dyYW09bnVsbCxsLndpcmVmcmFtZT0hMX1yZXR1cm57c2V0dXA6ZnVuY3Rpb24gYihyLGwsaCx5LHYpe2xldCBiPSExO2lmKGEpe2NvbnN0IGU9KGZ1bmN0aW9uIHgoZSxuLHIpe2NvbnN0IGE9ITA9PT1yLndpcmVmcmFtZTtsZXQgbD1zW2UuaWRdO3ZvaWQgMD09PWwmJihsPXt9LHNbZS5pZF09bCk7bGV0IGM9bFtuLmlkXTt2b2lkIDA9PT1jJiYoYz17fSxsW24uaWRdPWMpO2xldCB1PWNbYV07cmV0dXJuIHZvaWQgMD09PXUmJih1PWQoKGZ1bmN0aW9uIGgoKXtyZXR1cm4gaS5pc1dlYkdMMj90LmNyZWF0ZVZlcnRleEFycmF5KCk6by5jcmVhdGVWZXJ0ZXhBcnJheU9FUygpfSkoKSksY1thXT11KSx1fSkoeSxoLGwpO2MhPT1lJiYoYz1lLHUoYy5vYmplY3QpKSxiPShmdW5jdGlvbiB3KHQsZSl7Y29uc3Qgbj1jLmF0dHJpYnV0ZXMsaT10LmF0dHJpYnV0ZXM7bGV0IHI9MDtmb3IoY29uc3QgdCBpbiBpKXtjb25zdCBlPW5bdF0sbz1pW3RdO2lmKHZvaWQgMD09PWUpcmV0dXJuITA7aWYoZS5hdHRyaWJ1dGUhPT1vKXJldHVybiEwO2lmKGUuZGF0YSE9PW8uZGF0YSlyZXR1cm4hMDtyKyt9cmV0dXJuIGMuYXR0cmlidXRlc051bSE9PXJ8fGMuaW5kZXghPT1lfSkoeSx2KSxiJiYoZnVuY3Rpb24gUyh0LGUpe2NvbnN0IG49e30saT10LmF0dHJpYnV0ZXM7bGV0IHI9MDtmb3IoY29uc3QgdCBpbiBpKXtjb25zdCBlPWlbdF0sbz17fTtvLmF0dHJpYnV0ZT1lLGUuZGF0YSYmKG8uZGF0YT1lLmRhdGEpLG5bdF09byxyKyt9Yy5hdHRyaWJ1dGVzPW4sYy5hdHRyaWJ1dGVzTnVtPXIsYy5pbmRleD1lfSkoeSx2KX1lbHNle2NvbnN0IHQ9ITA9PT1sLndpcmVmcmFtZTtjLmdlb21ldHJ5PT09eS5pZCYmYy5wcm9ncmFtPT09aC5pZCYmYy53aXJlZnJhbWU9PT10fHwoYy5nZW9tZXRyeT15LmlkLGMucHJvZ3JhbT1oLmlkLGMud2lyZWZyYW1lPXQsYj0hMCl9ITA9PT1yLmlzSW5zdGFuY2VkTWVzaCYmKGI9ITApLG51bGwhPT12JiZuLnVwZGF0ZSh2LDM0OTYzKSxiJiYoKGZ1bmN0aW9uIE0ocixvLGEscyl7aWYoITE9PT1pLmlzV2ViR0wyJiYoci5pc0luc3RhbmNlZE1lc2h8fHMuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSkmJm51bGw9PT1lLmdldCgiQU5HTEVfaW5zdGFuY2VkX2FycmF5cyIpKXJldHVybjtwKCk7Y29uc3QgbD1zLmF0dHJpYnV0ZXMsYz1hLmdldEF0dHJpYnV0ZXMoKSx1PW8uZGVmYXVsdEF0dHJpYnV0ZVZhbHVlcztmb3IoY29uc3QgZSBpbiBjKXtjb25zdCBpPWNbZV07aWYoaT49MCl7Y29uc3Qgbz1sW2VdO2lmKHZvaWQgMCE9PW8pe2NvbnN0IGU9by5ub3JtYWxpemVkLHI9by5pdGVtU2l6ZSxhPW4uZ2V0KG8pO2lmKHZvaWQgMD09PWEpY29udGludWU7Y29uc3QgbD1hLmJ1ZmZlcixjPWEudHlwZSx1PWEuYnl0ZXNQZXJFbGVtZW50O2lmKG8uaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSl7Y29uc3Qgbj1vLmRhdGEsYT1uLnN0cmlkZSxoPW8ub2Zmc2V0O24mJm4uaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcj8obShpLG4ubWVzaFBlckF0dHJpYnV0ZSksdm9pZCAwPT09cy5fbWF4SW5zdGFuY2VDb3VudCYmKHMuX21heEluc3RhbmNlQ291bnQ9bi5tZXNoUGVyQXR0cmlidXRlKm4uY291bnQpKTpmKGkpLHQuYmluZEJ1ZmZlcigzNDk2MixsKSxfKGkscixjLGUsYSp1LGgqdSl9ZWxzZSBvLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlPyhtKGksby5tZXNoUGVyQXR0cmlidXRlKSx2b2lkIDA9PT1zLl9tYXhJbnN0YW5jZUNvdW50JiYocy5fbWF4SW5zdGFuY2VDb3VudD1vLm1lc2hQZXJBdHRyaWJ1dGUqby5jb3VudCkpOmYoaSksdC5iaW5kQnVmZmVyKDM0OTYyLGwpLF8oaSxyLGMsZSwwLDApfWVsc2UgaWYoImluc3RhbmNlTWF0cml4Ij09PWUpe2NvbnN0IGU9bi5nZXQoci5pbnN0YW5jZU1hdHJpeCk7aWYodm9pZCAwPT09ZSljb250aW51ZTtjb25zdCBvPWUuYnVmZmVyLGE9ZS50eXBlO20oaSswLDEpLG0oaSsxLDEpLG0oaSsyLDEpLG0oaSszLDEpLHQuYmluZEJ1ZmZlcigzNDk2MixvKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIoaSswLDQsYSwhMSw2NCwwKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIoaSsxLDQsYSwhMSw2NCwxNiksdC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGkrMiw0LGEsITEsNjQsMzIpLHQudmVydGV4QXR0cmliUG9pbnRlcihpKzMsNCxhLCExLDY0LDQ4KX1lbHNlIGlmKCJpbnN0YW5jZUNvbG9yIj09PWUpe2NvbnN0IGU9bi5nZXQoci5pbnN0YW5jZUNvbG9yKTtpZih2b2lkIDA9PT1lKWNvbnRpbnVlO2NvbnN0IG89ZS5idWZmZXIsYT1lLnR5cGU7bShpLDEpLHQuYmluZEJ1ZmZlcigzNDk2MixvKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIoaSwzLGEsITEsMTIsMCl9ZWxzZSBpZih2b2lkIDAhPT11KXtjb25zdCBuPXVbZV07aWYodm9pZCAwIT09bilzd2l0Y2gobi5sZW5ndGgpe2Nhc2UgMjp0LnZlcnRleEF0dHJpYjJmdihpLG4pO2JyZWFrO2Nhc2UgMzp0LnZlcnRleEF0dHJpYjNmdihpLG4pO2JyZWFrO2Nhc2UgNDp0LnZlcnRleEF0dHJpYjRmdihpLG4pO2JyZWFrO2RlZmF1bHQ6dC52ZXJ0ZXhBdHRyaWIxZnYoaSxuKX19fX1nKCl9KShyLGwsaCx5KSxudWxsIT09diYmdC5iaW5kQnVmZmVyKDM0OTYzLG4uZ2V0KHYpLmJ1ZmZlcikpfSxyZXNldDp5LHJlc2V0RGVmYXVsdFN0YXRlOnYsZGlzcG9zZTpmdW5jdGlvbiB4KCl7eSgpO2Zvcihjb25zdCB0IGluIHMpe2NvbnN0IGU9c1t0XTtmb3IoY29uc3QgdCBpbiBlKXtjb25zdCBuPWVbdF07Zm9yKGNvbnN0IHQgaW4gbiloKG5bdF0ub2JqZWN0KSxkZWxldGUgblt0XTtkZWxldGUgZVt0XX1kZWxldGUgc1t0XX19LHJlbGVhc2VTdGF0ZXNPZkdlb21ldHJ5OmZ1bmN0aW9uIHcodCl7aWYodm9pZCAwPT09c1t0LmlkXSlyZXR1cm47Y29uc3QgZT1zW3QuaWRdO2Zvcihjb25zdCB0IGluIGUpe2NvbnN0IG49ZVt0XTtmb3IoY29uc3QgdCBpbiBuKWgoblt0XS5vYmplY3QpLGRlbGV0ZSBuW3RdO2RlbGV0ZSBlW3RdfWRlbGV0ZSBzW3QuaWRdfSxyZWxlYXNlU3RhdGVzT2ZQcm9ncmFtOmZ1bmN0aW9uIFModCl7Zm9yKGNvbnN0IGUgaW4gcyl7Y29uc3Qgbj1zW2VdO2lmKHZvaWQgMD09PW5bdC5pZF0pY29udGludWU7Y29uc3QgaT1uW3QuaWRdO2Zvcihjb25zdCB0IGluIGkpaChpW3RdLm9iamVjdCksZGVsZXRlIGlbdF07ZGVsZXRlIG5bdC5pZF19fSxpbml0QXR0cmlidXRlczpwLGVuYWJsZUF0dHJpYnV0ZTpmLGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzOmd9fWZ1bmN0aW9uIGQwdCh0LGUsbixpKXtjb25zdCByPWkuaXNXZWJHTDI7bGV0IG87dGhpcy5zZXRNb2RlPWZ1bmN0aW9uIGEodCl7bz10fSx0aGlzLnJlbmRlcj1mdW5jdGlvbiBzKGUsaSl7dC5kcmF3QXJyYXlzKG8sZSxpKSxuLnVwZGF0ZShpLG8sMSl9LHRoaXMucmVuZGVySW5zdGFuY2VzPWZ1bmN0aW9uIGwoaSxhLHMpe2lmKDA9PT1zKXJldHVybjtsZXQgbCxjO2lmKHIpbD10LGM9ImRyYXdBcnJheXNJbnN0YW5jZWQiO2Vsc2UgaWYobD1lLmdldCgiQU5HTEVfaW5zdGFuY2VkX2FycmF5cyIpLGM9ImRyYXdBcnJheXNJbnN0YW5jZWRBTkdMRSIsbnVsbD09PWwpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7bFtjXShvLGksYSxzKSxuLnVwZGF0ZShhLG8scyl9fWZ1bmN0aW9uIHAwdCh0LGUsbil7bGV0IGk7ZnVuY3Rpb24gcihlKXtpZigiaGlnaHAiPT09ZSl7aWYodC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoMzU2MzMsMzYzMzgpLnByZWNpc2lvbj4wJiZ0LmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCgzNTYzMiwzNjMzOCkucHJlY2lzaW9uPjApcmV0dXJuImhpZ2hwIjtlPSJtZWRpdW1wIn1yZXR1cm4ibWVkaXVtcCI9PT1lJiZ0LmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCgzNTYzMywzNjMzNykucHJlY2lzaW9uPjAmJnQuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMyLDM2MzM3KS5wcmVjaXNpb24+MD8ibWVkaXVtcCI6Imxvd3AifWNvbnN0IG89InVuZGVmaW5lZCIhPXR5cGVvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0JiZ0IGluc3RhbmNlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dHx8InVuZGVmaW5lZCIhPXR5cGVvZiBXZWJHTDJDb21wdXRlUmVuZGVyaW5nQ29udGV4dCYmdCBpbnN0YW5jZW9mIFdlYkdMMkNvbXB1dGVSZW5kZXJpbmdDb250ZXh0O2xldCBhPXZvaWQgMCE9PW4ucHJlY2lzaW9uP24ucHJlY2lzaW9uOiJoaWdocCI7Y29uc3Qgcz1yKGEpO3MhPT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiIsYSwibm90IHN1cHBvcnRlZCwgdXNpbmciLHMsImluc3RlYWQuIiksYT1zKTtjb25zdCBsPW98fGUuaGFzKCJXRUJHTF9kcmF3X2J1ZmZlcnMiKSxjPSEwPT09bi5sb2dhcml0aG1pY0RlcHRoQnVmZmVyLHU9dC5nZXRQYXJhbWV0ZXIoMzQ5MzApLGg9dC5nZXRQYXJhbWV0ZXIoMzU2NjApLGQ9dC5nZXRQYXJhbWV0ZXIoMzM3OSkscD10LmdldFBhcmFtZXRlcigzNDA3NiksZj10LmdldFBhcmFtZXRlcigzNDkyMSksbT10LmdldFBhcmFtZXRlcigzNjM0NyksZz10LmdldFBhcmFtZXRlcigzNjM0OCksXz10LmdldFBhcmFtZXRlcigzNjM0OSkseT1oPjAsdj1vfHxlLmhhcygiT0VTX3RleHR1cmVfZmxvYXQiKTtyZXR1cm57aXNXZWJHTDI6byxkcmF3QnVmZmVyczpsLGdldE1heEFuaXNvdHJvcHk6ZnVuY3Rpb24gYigpe2lmKHZvaWQgMCE9PWkpcmV0dXJuIGk7aWYoITA9PT1lLmhhcygiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIikpe2NvbnN0IG49ZS5nZXQoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpO2k9dC5nZXRQYXJhbWV0ZXIobi5NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQpfWVsc2UgaT0wO3JldHVybiBpfSxnZXRNYXhQcmVjaXNpb246cixwcmVjaXNpb246YSxsb2dhcml0aG1pY0RlcHRoQnVmZmVyOmMsbWF4VGV4dHVyZXM6dSxtYXhWZXJ0ZXhUZXh0dXJlczpoLG1heFRleHR1cmVTaXplOmQsbWF4Q3ViZW1hcFNpemU6cCxtYXhBdHRyaWJ1dGVzOmYsbWF4VmVydGV4VW5pZm9ybXM6bSxtYXhWYXJ5aW5nczpnLG1heEZyYWdtZW50VW5pZm9ybXM6Xyx2ZXJ0ZXhUZXh0dXJlczp5LGZsb2F0RnJhZ21lbnRUZXh0dXJlczp2LGZsb2F0VmVydGV4VGV4dHVyZXM6eSYmdixtYXhTYW1wbGVzOm8/dC5nZXRQYXJhbWV0ZXIoMzYxODMpOjB9fWZ1bmN0aW9uIGYwdCh0KXtjb25zdCBlPXRoaXM7bGV0IG49bnVsbCxpPTAscj0hMSxvPSExO2NvbnN0IGE9bmV3IHQwdCxzPW5ldyBnSnQsbD17dmFsdWU6bnVsbCxuZWVkc1VwZGF0ZTohMX07ZnVuY3Rpb24gYygpe2wudmFsdWUhPT1uJiYobC52YWx1ZT1uLGwubmVlZHNVcGRhdGU9aT4wKSxlLm51bVBsYW5lcz1pLGUubnVtSW50ZXJzZWN0aW9uPTB9ZnVuY3Rpb24gdSh0LG4saSxyKXtjb25zdCBvPW51bGwhPT10P3QubGVuZ3RoOjA7bGV0IGM9bnVsbDtpZigwIT09byl7aWYoYz1sLnZhbHVlLCEwIT09cnx8bnVsbD09PWMpe2NvbnN0IGU9aSs0Km8scj1uLm1hdHJpeFdvcmxkSW52ZXJzZTtzLmdldE5vcm1hbE1hdHJpeChyKSwobnVsbD09PWN8fGMubGVuZ3RoPGUpJiYoYz1uZXcgRmxvYXQzMkFycmF5KGUpKTtmb3IobGV0IGU9MCxuPWk7ZSE9PW87KytlLG4rPTQpYS5jb3B5KHRbZV0pLmFwcGx5TWF0cml4NChyLHMpLGEubm9ybWFsLnRvQXJyYXkoYyxuKSxjW24rM109YS5jb25zdGFudH1sLnZhbHVlPWMsbC5uZWVkc1VwZGF0ZT0hMH1yZXR1cm4gZS5udW1QbGFuZXM9byxlLm51bUludGVyc2VjdGlvbj0wLGN9dGhpcy51bmlmb3JtPWwsdGhpcy5udW1QbGFuZXM9MCx0aGlzLm51bUludGVyc2VjdGlvbj0wLHRoaXMuaW5pdD1mdW5jdGlvbih0LGUsbyl7Y29uc3QgYT0wIT09dC5sZW5ndGh8fGV8fDAhPT1pfHxyO3JldHVybiByPWUsbj11KHQsbywwKSxpPXQubGVuZ3RoLGF9LHRoaXMuYmVnaW5TaGFkb3dzPWZ1bmN0aW9uKCl7bz0hMCx1KG51bGwpfSx0aGlzLmVuZFNoYWRvd3M9ZnVuY3Rpb24oKXtvPSExLGMoKX0sdGhpcy5zZXRTdGF0ZT1mdW5jdGlvbihlLGEscyl7Y29uc3QgaD1lLmNsaXBwaW5nUGxhbmVzLGQ9ZS5jbGlwSW50ZXJzZWN0aW9uLHA9ZS5jbGlwU2hhZG93cyxmPXQuZ2V0KGUpO2lmKCFyfHxudWxsPT09aHx8MD09PWgubGVuZ3RofHxvJiYhcClvP3UobnVsbCk6YygpO2Vsc2V7Y29uc3QgdD1vPzA6aSxlPTQqdDtsZXQgcj1mLmNsaXBwaW5nU3RhdGV8fG51bGw7bC52YWx1ZT1yLHI9dShoLGEsZSxzKTtmb3IobGV0IHQ9MDt0IT09ZTsrK3Qpclt0XT1uW3RdO2YuY2xpcHBpbmdTdGF0ZT1yLHRoaXMubnVtSW50ZXJzZWN0aW9uPWQ/dGhpcy5udW1QbGFuZXM6MCx0aGlzLm51bVBsYW5lcys9dH19fWZ1bmN0aW9uIG0wdCh0KXtsZXQgZT1uZXcgV2Vha01hcDtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGU9PT1XS3Q/dC5tYXBwaW5nPWpLdDplPT09cUt0JiYodC5tYXBwaW5nPUdLdCksdH1mdW5jdGlvbiBpKHQpe2NvbnN0IG49dC50YXJnZXQ7bi5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixpKTtjb25zdCByPWUuZ2V0KG4pO3ZvaWQgMCE9PXImJihlLmRlbGV0ZShuKSxyLmRpc3Bvc2UoKSl9cmV0dXJue2dldDpmdW5jdGlvbiByKG8pe2lmKG8mJm8uaXNUZXh0dXJlJiYhMT09PW8uaXNSZW5kZXJUYXJnZXRUZXh0dXJlKXtjb25zdCByPW8ubWFwcGluZztpZihyPT09V0t0fHxyPT09cUt0KXtpZihlLmhhcyhvKSlyZXR1cm4gbihlLmdldChvKS50ZXh0dXJlLG8ubWFwcGluZyk7e2NvbnN0IHI9by5pbWFnZTtpZihyJiZyLmhlaWdodD4wKXtjb25zdCBhPXQuZ2V0UmVuZGVyVGFyZ2V0KCkscz1uZXcgSzF0KHIuaGVpZ2h0LzIpO3JldHVybiBzLmZyb21FcXVpcmVjdGFuZ3VsYXJUZXh0dXJlKHQsbyksZS5zZXQobyxzKSx0LnNldFJlbmRlclRhcmdldChhKSxvLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGkpLG4ocy50ZXh0dXJlLG8ubWFwcGluZyl9cmV0dXJuIG51bGx9fX1yZXR1cm4gb30sZGlzcG9zZTpmdW5jdGlvbiBvKCl7ZT1uZXcgV2Vha01hcH19fWMwdC5waHlzaWNhbD17dW5pZm9ybXM6VTF0KFtjMHQuc3RhbmRhcmQudW5pZm9ybXMse2NsZWFyY29hdDp7dmFsdWU6MH0sY2xlYXJjb2F0TWFwOnt2YWx1ZTpudWxsfSxjbGVhcmNvYXRSb3VnaG5lc3M6e3ZhbHVlOjB9LGNsZWFyY29hdFJvdWdobmVzc01hcDp7dmFsdWU6bnVsbH0sY2xlYXJjb2F0Tm9ybWFsU2NhbGU6e3ZhbHVlOm5ldyBtSnQoMSwxKX0sY2xlYXJjb2F0Tm9ybWFsTWFwOnt2YWx1ZTpudWxsfSxzaGVlbjp7dmFsdWU6bmV3ICRRdCgwKX0sdHJhbnNtaXNzaW9uOnt2YWx1ZTowfSx0cmFuc21pc3Npb25NYXA6e3ZhbHVlOm51bGx9LHRyYW5zbWlzc2lvblNhbXBsZXJTaXplOnt2YWx1ZTpuZXcgbUp0fSx0cmFuc21pc3Npb25TYW1wbGVyTWFwOnt2YWx1ZTpudWxsfSx0aGlja25lc3M6e3ZhbHVlOjB9LHRoaWNrbmVzc01hcDp7dmFsdWU6bnVsbH0sYXR0ZW51YXRpb25EaXN0YW5jZTp7dmFsdWU6MH0sYXR0ZW51YXRpb25UaW50Ont2YWx1ZTpuZXcgJFF0KDApfSxzcGVjdWxhckludGVuc2l0eTp7dmFsdWU6MH0sc3BlY3VsYXJJbnRlbnNpdHlNYXA6e3ZhbHVlOm51bGx9LHNwZWN1bGFyVGludDp7dmFsdWU6bmV3ICRRdCgxLDEsMSl9LHNwZWN1bGFyVGludE1hcDp7dmFsdWU6bnVsbH19XSksdmVydGV4U2hhZGVyOnMwdC5tZXNocGh5c2ljYWxfdmVydCxmcmFnbWVudFNoYWRlcjpzMHQubWVzaHBoeXNpY2FsX2ZyYWd9O2NsYXNzIGcwdCBleHRlbmRzIFcxdHtjb25zdHJ1Y3Rvcih0PS0xLGU9MSxuPTEsaT0tMSxyPS4xLG89MmUzKXtzdXBlcigpLHRoaXMudHlwZT0iT3J0aG9ncmFwaGljQ2FtZXJhIix0aGlzLnpvb209MSx0aGlzLnZpZXc9bnVsbCx0aGlzLmxlZnQ9dCx0aGlzLnJpZ2h0PWUsdGhpcy50b3A9bix0aGlzLmJvdHRvbT1pLHRoaXMubmVhcj1yLHRoaXMuZmFyPW8sdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5sZWZ0PXQubGVmdCx0aGlzLnJpZ2h0PXQucmlnaHQsdGhpcy50b3A9dC50b3AsdGhpcy5ib3R0b209dC5ib3R0b20sdGhpcy5uZWFyPXQubmVhcix0aGlzLmZhcj10LmZhcix0aGlzLnpvb209dC56b29tLHRoaXMudmlldz1udWxsPT09dC52aWV3P251bGw6T2JqZWN0LmFzc2lnbih7fSx0LnZpZXcpLHRoaXN9c2V0Vmlld09mZnNldCh0LGUsbixpLHIsbyl7bnVsbD09PXRoaXMudmlldyYmKHRoaXMudmlldz17ZW5hYmxlZDohMCxmdWxsV2lkdGg6MSxmdWxsSGVpZ2h0OjEsb2Zmc2V0WDowLG9mZnNldFk6MCx3aWR0aDoxLGhlaWdodDoxfSksdGhpcy52aWV3LmVuYWJsZWQ9ITAsdGhpcy52aWV3LmZ1bGxXaWR0aD10LHRoaXMudmlldy5mdWxsSGVpZ2h0PWUsdGhpcy52aWV3Lm9mZnNldFg9bix0aGlzLnZpZXcub2Zmc2V0WT1pLHRoaXMudmlldy53aWR0aD1yLHRoaXMudmlldy5oZWlnaHQ9byx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1jbGVhclZpZXdPZmZzZXQoKXtudWxsIT09dGhpcy52aWV3JiYodGhpcy52aWV3LmVuYWJsZWQ9ITEpLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfXVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKXtjb25zdCB0PSh0aGlzLnJpZ2h0LXRoaXMubGVmdCkvKDIqdGhpcy56b29tKSxlPSh0aGlzLnRvcC10aGlzLmJvdHRvbSkvKDIqdGhpcy56b29tKSxuPSh0aGlzLnJpZ2h0K3RoaXMubGVmdCkvMixpPSh0aGlzLnRvcCt0aGlzLmJvdHRvbSkvMjtsZXQgcj1uLXQsbz1uK3QsYT1pK2Uscz1pLWU7aWYobnVsbCE9PXRoaXMudmlldyYmdGhpcy52aWV3LmVuYWJsZWQpe2NvbnN0IHQ9KHRoaXMucmlnaHQtdGhpcy5sZWZ0KS90aGlzLnZpZXcuZnVsbFdpZHRoL3RoaXMuem9vbSxlPSh0aGlzLnRvcC10aGlzLmJvdHRvbSkvdGhpcy52aWV3LmZ1bGxIZWlnaHQvdGhpcy56b29tO3IrPXQqdGhpcy52aWV3Lm9mZnNldFgsbz1yK3QqdGhpcy52aWV3LndpZHRoLGEtPWUqdGhpcy52aWV3Lm9mZnNldFkscz1hLWUqdGhpcy52aWV3LmhlaWdodH10aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZU9ydGhvZ3JhcGhpYyhyLG8sYSxzLHRoaXMubmVhcix0aGlzLmZhciksdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMucHJvamVjdGlvbk1hdHJpeCkuaW52ZXJ0KCl9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO3JldHVybiBlLm9iamVjdC56b29tPXRoaXMuem9vbSxlLm9iamVjdC5sZWZ0PXRoaXMubGVmdCxlLm9iamVjdC5yaWdodD10aGlzLnJpZ2h0LGUub2JqZWN0LnRvcD10aGlzLnRvcCxlLm9iamVjdC5ib3R0b209dGhpcy5ib3R0b20sZS5vYmplY3QubmVhcj10aGlzLm5lYXIsZS5vYmplY3QuZmFyPXRoaXMuZmFyLG51bGwhPT10aGlzLnZpZXcmJihlLm9iamVjdC52aWV3PU9iamVjdC5hc3NpZ24oe30sdGhpcy52aWV3KSksZX19ZzB0LnByb3RvdHlwZS5pc09ydGhvZ3JhcGhpY0NhbWVyYT0hMDtjbGFzcyBfMHQgZXh0ZW5kcyBHMXR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy50eXBlPSJSYXdTaGFkZXJNYXRlcmlhbCJ9fV8wdC5wcm90b3R5cGUuaXNSYXdTaGFkZXJNYXRlcmlhbD0hMDtjb25zdCB5MHQ9TWF0aC5wb3coMiw4KSx2MHQ9Wy4xMjUsLjIxNSwuMzUsLjQ0NiwuNTI2LC41ODJdLGIwdD01K3YwdC5sZW5ndGgseDB0PXtbTlp0XTowLFtJWnRdOjEsW09adF06Mixbelp0XTozLFtEWnRdOjQsW0JadF06NSxbUlp0XTo2fSx3MHQ9bmV3IEtRdCh7c2lkZToxLGRlcHRoV3JpdGU6ITEsZGVwdGhUZXN0OiExfSksUzB0PW5ldyBCMXQobmV3IEYxdCx3MHQpLE0wdD1uZXcgZzB0LHtfbG9kUGxhbmVzOkUwdCxfc2l6ZUxvZHM6VDB0LF9zaWdtYXM6QzB0fT16MHQoKSxBMHQ9bmV3ICRRdDtsZXQgazB0PW51bGw7Y29uc3QgTDB0PSgxK01hdGguc3FydCg1KSkvMixQMHQ9MS9MMHQsTjB0PVtuZXcgQ0p0KDEsMSwxKSxuZXcgQ0p0KC0xLDEsMSksbmV3IENKdCgxLDEsLTEpLG5ldyBDSnQoLTEsMSwtMSksbmV3IENKdCgwLEwwdCxQMHQpLG5ldyBDSnQoMCxMMHQsLVAwdCksbmV3IENKdChQMHQsMCxMMHQpLG5ldyBDSnQoLVAwdCwwLEwwdCksbmV3IENKdChMMHQsUDB0LDApLG5ldyBDSnQoLUwwdCxQMHQsMCldO2Z1bmN0aW9uIEkwdCh0KXtjb25zdCBlPU1hdGgubWF4KHQucix0LmcsdC5iKSxuPU1hdGgubWluKE1hdGgubWF4KE1hdGguY2VpbChNYXRoLmxvZzIoZSkpLC0xMjgpLDEyNyk7cmV0dXJuIHQubXVsdGlwbHlTY2FsYXIoTWF0aC5wb3coMiwtbikpLChuKzEyOCkvMjU1fWNsYXNzIFIwdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9yZW5kZXJlcj10LHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0PW51bGwsdGhpcy5fYmx1ck1hdGVyaWFsPShmdW5jdGlvbiBlKHQpe2NvbnN0IGU9bmV3IEZsb2F0MzJBcnJheSh0KSxuPW5ldyBDSnQoMCwxLDApO3JldHVybiBuZXcgXzB0KHtuYW1lOiJTcGhlcmljYWxHYXVzc2lhbkJsdXIiLGRlZmluZXM6e246dH0sdW5pZm9ybXM6e2Vudk1hcDp7dmFsdWU6bnVsbH0sc2FtcGxlczp7dmFsdWU6MX0sd2VpZ2h0czp7dmFsdWU6ZX0sbGF0aXR1ZGluYWw6e3ZhbHVlOiExfSxkVGhldGE6e3ZhbHVlOjB9LG1pcEludDp7dmFsdWU6MH0scG9sZUF4aXM6e3ZhbHVlOm59LGlucHV0RW5jb2Rpbmc6e3ZhbHVlOngwdFszZTNdfSxvdXRwdXRFbmNvZGluZzp7dmFsdWU6eDB0WzNlM119fSx2ZXJ0ZXhTaGFkZXI6IlxuXG5cdFx0cHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cdFx0cHJlY2lzaW9uIG1lZGl1bXAgaW50O1xuXG5cdFx0YXR0cmlidXRlIHZlYzMgcG9zaXRpb247XG5cdFx0YXR0cmlidXRlIHZlYzIgdXY7XG5cdFx0YXR0cmlidXRlIGZsb2F0IGZhY2VJbmRleDtcblxuXHRcdHZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uO1xuXG5cdFx0Ly8gUkggY29vcmRpbmF0ZSBzeXN0ZW07IFBNUkVNIGZhY2UtaW5kZXhpbmcgY29udmVudGlvblxuXHRcdHZlYzMgZ2V0RGlyZWN0aW9uKCB2ZWMyIHV2LCBmbG9hdCBmYWNlICkge1xuXG5cdFx0XHR1diA9IDIuMCAqIHV2IC0gMS4wO1xuXG5cdFx0XHR2ZWMzIGRpcmVjdGlvbiA9IHZlYzMoIHV2LCAxLjAgKTtcblxuXHRcdFx0aWYgKCBmYWNlID09IDAuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24uenl4OyAvLyAoIDEsIHYsIHUgKSBwb3MgeFxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDEuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24ueHp5O1xuXHRcdFx0XHRkaXJlY3Rpb24ueHogKj0gLTEuMDsgLy8gKCAtdSwgMSwgLXYgKSBwb3MgeVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDIuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24ueCAqPSAtMS4wOyAvLyAoIC11LCB2LCAxICkgcG9zIHpcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSAzLjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnp5eDtcblx0XHRcdFx0ZGlyZWN0aW9uLnh6ICo9IC0xLjA7IC8vICggLTEsIHYsIC11ICkgbmVnIHhcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSA0LjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnh6eTtcblx0XHRcdFx0ZGlyZWN0aW9uLnh5ICo9IC0xLjA7IC8vICggLXUsIC0xLCB2ICkgbmVnIHlcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSA1LjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uLnogKj0gLTEuMDsgLy8gKCB1LCB2LCAtMSApIG5lZyB6XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRpcmVjdGlvbjtcblxuXHRcdH1cblxuXHRcdHZvaWQgbWFpbigpIHtcblxuXHRcdFx0dk91dHB1dERpcmVjdGlvbiA9IGdldERpcmVjdGlvbiggdXYsIGZhY2VJbmRleCApO1xuXHRcdFx0Z2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XG5cblx0XHR9XG5cdCIsZnJhZ21lbnRTaGFkZXI6IlxuXG5cdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblx0XHRcdHByZWNpc2lvbiBtZWRpdW1wIGludDtcblxuXHRcdFx0dmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247XG5cblx0XHRcdHVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDtcblx0XHRcdHVuaWZvcm0gaW50IHNhbXBsZXM7XG5cdFx0XHR1bmlmb3JtIGZsb2F0IHdlaWdodHNbIG4gXTtcblx0XHRcdHVuaWZvcm0gYm9vbCBsYXRpdHVkaW5hbDtcblx0XHRcdHVuaWZvcm0gZmxvYXQgZFRoZXRhO1xuXHRcdFx0dW5pZm9ybSBmbG9hdCBtaXBJbnQ7XG5cdFx0XHR1bmlmb3JtIHZlYzMgcG9sZUF4aXM7XG5cblx0XHRcdFxuXG5cdFx0dW5pZm9ybSBpbnQgaW5wdXRFbmNvZGluZztcblx0XHR1bmlmb3JtIGludCBvdXRwdXRFbmNvZGluZztcblxuXHRcdCNpbmNsdWRlIDxlbmNvZGluZ3NfcGFyc19mcmFnbWVudD5cblxuXHRcdHZlYzQgaW5wdXRUZXhlbFRvTGluZWFyKCB2ZWM0IHZhbHVlICkge1xuXG5cdFx0XHRpZiAoIGlucHV0RW5jb2RpbmcgPT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gMSApIHtcblxuXHRcdFx0XHRyZXR1cm4gc1JHQlRvTGluZWFyKCB2YWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDIgKSB7XG5cblx0XHRcdFx0cmV0dXJuIFJHQkVUb0xpbmVhciggdmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW5wdXRFbmNvZGluZyA9PSAzICkge1xuXG5cdFx0XHRcdHJldHVybiBSR0JNVG9MaW5lYXIoIHZhbHVlLCA3LjAgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW5wdXRFbmNvZGluZyA9PSA0ICkge1xuXG5cdFx0XHRcdHJldHVybiBSR0JNVG9MaW5lYXIoIHZhbHVlLCAxNi4wICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gNSApIHtcblxuXHRcdFx0XHRyZXR1cm4gUkdCRFRvTGluZWFyKCB2YWx1ZSwgMjU2LjAgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZXR1cm4gR2FtbWFUb0xpbmVhciggdmFsdWUsIDIuMiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2ZWM0IGxpbmVhclRvT3V0cHV0VGV4ZWwoIHZlYzQgdmFsdWUgKSB7XG5cblx0XHRcdGlmICggb3V0cHV0RW5jb2RpbmcgPT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDEgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvc1JHQiggdmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gMiApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9SR0JFKCB2YWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvdXRwdXRFbmNvZGluZyA9PSAzICkge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb1JHQk0oIHZhbHVlLCA3LjAgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gNCApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9SR0JNKCB2YWx1ZSwgMTYuMCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvdXRwdXRFbmNvZGluZyA9PSA1ICkge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb1JHQkQoIHZhbHVlLCAyNTYuMCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb0dhbW1hKCB2YWx1ZSwgMi4yICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZlYzQgZW52TWFwVGV4ZWxUb0xpbmVhciggdmVjNCBjb2xvciApIHtcblxuXHRcdFx0cmV0dXJuIGlucHV0VGV4ZWxUb0xpbmVhciggY29sb3IgKTtcblxuXHRcdH1cblx0XG5cblx0XHRcdCNkZWZpbmUgRU5WTUFQX1RZUEVfQ1VCRV9VVlxuXHRcdFx0I2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cblxuXHRcdFx0dmVjMyBnZXRTYW1wbGUoIGZsb2F0IHRoZXRhLCB2ZWMzIGF4aXMgKSB7XG5cblx0XHRcdFx0ZmxvYXQgY29zVGhldGEgPSBjb3MoIHRoZXRhICk7XG5cdFx0XHRcdC8vIFJvZHJpZ3VlcycgYXhpcy1hbmdsZSByb3RhdGlvblxuXHRcdFx0XHR2ZWMzIHNhbXBsZURpcmVjdGlvbiA9IHZPdXRwdXREaXJlY3Rpb24gKiBjb3NUaGV0YVxuXHRcdFx0XHRcdCsgY3Jvc3MoIGF4aXMsIHZPdXRwdXREaXJlY3Rpb24gKSAqIHNpbiggdGhldGEgKVxuXHRcdFx0XHRcdCsgYXhpcyAqIGRvdCggYXhpcywgdk91dHB1dERpcmVjdGlvbiApICogKCAxLjAgLSBjb3NUaGV0YSApO1xuXG5cdFx0XHRcdHJldHVybiBiaWxpbmVhckN1YmVVViggZW52TWFwLCBzYW1wbGVEaXJlY3Rpb24sIG1pcEludCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZvaWQgbWFpbigpIHtcblxuXHRcdFx0XHR2ZWMzIGF4aXMgPSBsYXRpdHVkaW5hbCA/IHBvbGVBeGlzIDogY3Jvc3MoIHBvbGVBeGlzLCB2T3V0cHV0RGlyZWN0aW9uICk7XG5cblx0XHRcdFx0aWYgKCBhbGwoIGVxdWFsKCBheGlzLCB2ZWMzKCAwLjAgKSApICkgKSB7XG5cblx0XHRcdFx0XHRheGlzID0gdmVjMyggdk91dHB1dERpcmVjdGlvbi56LCAwLjAsIC0gdk91dHB1dERpcmVjdGlvbi54ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF4aXMgPSBub3JtYWxpemUoIGF4aXMgKTtcblxuXHRcdFx0XHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTtcblx0XHRcdFx0Z2xfRnJhZ0NvbG9yLnJnYiArPSB3ZWlnaHRzWyAwIF0gKiBnZXRTYW1wbGUoIDAuMCwgYXhpcyApO1xuXG5cdFx0XHRcdGZvciAoIGludCBpID0gMTsgaSA8IG47IGkrKyApIHtcblxuXHRcdFx0XHRcdGlmICggaSA+PSBzYW1wbGVzICkge1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGZsb2F0IHRoZXRhID0gZFRoZXRhICogZmxvYXQoIGkgKTtcblx0XHRcdFx0XHRnbF9GcmFnQ29sb3IucmdiICs9IHdlaWdodHNbIGkgXSAqIGdldFNhbXBsZSggLTEuMCAqIHRoZXRhLCBheGlzICk7XG5cdFx0XHRcdFx0Z2xfRnJhZ0NvbG9yLnJnYiArPSB3ZWlnaHRzWyBpIF0gKiBnZXRTYW1wbGUoIHRoZXRhLCBheGlzICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGdsX0ZyYWdDb2xvciA9IGxpbmVhclRvT3V0cHV0VGV4ZWwoIGdsX0ZyYWdDb2xvciApO1xuXG5cdFx0XHR9XG5cdFx0IixibGVuZGluZzowLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExfSl9KSgyMCksdGhpcy5fZXF1aXJlY3RTaGFkZXI9bnVsbCx0aGlzLl9jdWJlbWFwU2hhZGVyPW51bGwsdGhpcy5fY29tcGlsZU1hdGVyaWFsKHRoaXMuX2JsdXJNYXRlcmlhbCl9ZnJvbVNjZW5lKHQsZT0wLG49LjEsaT0xMDApe2swdD10aGlzLl9yZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtjb25zdCByPXRoaXMuX2FsbG9jYXRlVGFyZ2V0cygpO3JldHVybiB0aGlzLl9zY2VuZVRvQ3ViZVVWKHQsbixpLHIpLGU+MCYmdGhpcy5fYmx1cihyLDAsMCxlKSx0aGlzLl9hcHBseVBNUkVNKHIpLHRoaXMuX2NsZWFudXAocikscn1mcm9tRXF1aXJlY3Rhbmd1bGFyKHQpe3JldHVybiB0aGlzLl9mcm9tVGV4dHVyZSh0KX1mcm9tQ3ViZW1hcCh0KXtyZXR1cm4gdGhpcy5fZnJvbVRleHR1cmUodCl9Y29tcGlsZUN1YmVtYXBTaGFkZXIoKXtudWxsPT09dGhpcy5fY3ViZW1hcFNoYWRlciYmKHRoaXMuX2N1YmVtYXBTaGFkZXI9RjB0KCksdGhpcy5fY29tcGlsZU1hdGVyaWFsKHRoaXMuX2N1YmVtYXBTaGFkZXIpKX1jb21waWxlRXF1aXJlY3Rhbmd1bGFyU2hhZGVyKCl7bnVsbD09PXRoaXMuX2VxdWlyZWN0U2hhZGVyJiYodGhpcy5fZXF1aXJlY3RTaGFkZXI9SDB0KCksdGhpcy5fY29tcGlsZU1hdGVyaWFsKHRoaXMuX2VxdWlyZWN0U2hhZGVyKSl9ZGlzcG9zZSgpe3RoaXMuX2JsdXJNYXRlcmlhbC5kaXNwb3NlKCksbnVsbCE9PXRoaXMuX2N1YmVtYXBTaGFkZXImJnRoaXMuX2N1YmVtYXBTaGFkZXIuZGlzcG9zZSgpLG51bGwhPT10aGlzLl9lcXVpcmVjdFNoYWRlciYmdGhpcy5fZXF1aXJlY3RTaGFkZXIuZGlzcG9zZSgpO2ZvcihsZXQgdD0wO3Q8RTB0Lmxlbmd0aDt0KyspRTB0W3RdLmRpc3Bvc2UoKX1fY2xlYW51cCh0KXt0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldC5kaXNwb3NlKCksdGhpcy5fcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KGswdCksdC5zY2lzc29yVGVzdD0hMSxCMHQodCwwLDAsdC53aWR0aCx0LmhlaWdodCl9X2Zyb21UZXh0dXJlKHQpe2swdD10aGlzLl9yZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtjb25zdCBlPXRoaXMuX2FsbG9jYXRlVGFyZ2V0cyh0KTtyZXR1cm4gdGhpcy5fdGV4dHVyZVRvQ3ViZVVWKHQsZSksdGhpcy5fYXBwbHlQTVJFTShlKSx0aGlzLl9jbGVhbnVwKGUpLGV9X2FsbG9jYXRlVGFyZ2V0cyh0KXtjb25zdCBlPXttYWdGaWx0ZXI6Skt0LG1pbkZpbHRlcjpKS3QsZ2VuZXJhdGVNaXBtYXBzOiExLHR5cGU6clp0LGZvcm1hdDoxMDIzLGVuY29kaW5nOk8wdCh0KT90LmVuY29kaW5nOk9adCxkZXB0aEJ1ZmZlcjohMX0sbj1EMHQoZSk7cmV0dXJuIG4uZGVwdGhCdWZmZXI9IXQsdGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQ9RDB0KGUpLG59X2NvbXBpbGVNYXRlcmlhbCh0KXtjb25zdCBlPW5ldyBCMXQoRTB0WzBdLHQpO3RoaXMuX3JlbmRlcmVyLmNvbXBpbGUoZSxNMHQpfV9zY2VuZVRvQ3ViZVVWKHQsZSxuLGkpe2NvbnN0IHI9bmV3IHExdCg5MCwxLGUsbiksbz1bMSwtMSwxLDEsMSwxXSxhPVsxLDEsMSwtMSwtMSwtMV0scz10aGlzLl9yZW5kZXJlcixsPXMuYXV0b0NsZWFyLGM9cy5vdXRwdXRFbmNvZGluZyx1PXMudG9uZU1hcHBpbmc7cy5nZXRDbGVhckNvbG9yKEEwdCkscy50b25lTWFwcGluZz0wLHMub3V0cHV0RW5jb2Rpbmc9Tlp0LHMuYXV0b0NsZWFyPSExO2xldCBoPSExO2NvbnN0IGQ9dC5iYWNrZ3JvdW5kO2lmKGQpe2lmKGQuaXNDb2xvcil7dzB0LmNvbG9yLmNvcHkoZCkuY29udmVydFNSR0JUb0xpbmVhcigpLHQuYmFja2dyb3VuZD1udWxsO2NvbnN0IGU9STB0KHcwdC5jb2xvcik7dzB0Lm9wYWNpdHk9ZSxoPSEwfX1lbHNle3cwdC5jb2xvci5jb3B5KEEwdCkuY29udmVydFNSR0JUb0xpbmVhcigpO2NvbnN0IHQ9STB0KHcwdC5jb2xvcik7dzB0Lm9wYWNpdHk9dCxoPSEwfWZvcihsZXQgZT0wO2U8NjtlKyspe2NvbnN0IG49ZSUzOzA9PW4/KHIudXAuc2V0KDAsb1tlXSwwKSxyLmxvb2tBdChhW2VdLDAsMCkpOjE9PW4/KHIudXAuc2V0KDAsMCxvW2VdKSxyLmxvb2tBdCgwLGFbZV0sMCkpOihyLnVwLnNldCgwLG9bZV0sMCksci5sb29rQXQoMCwwLGFbZV0pKSxCMHQoaSxuKnkwdCxlPjI/eTB0OjAseTB0LHkwdCkscy5zZXRSZW5kZXJUYXJnZXQoaSksaCYmcy5yZW5kZXIoUzB0LHIpLHMucmVuZGVyKHQscil9cy50b25lTWFwcGluZz11LHMub3V0cHV0RW5jb2Rpbmc9YyxzLmF1dG9DbGVhcj1sfV90ZXh0dXJlVG9DdWJlVVYodCxlKXtjb25zdCBuPXRoaXMuX3JlbmRlcmVyO3QuaXNDdWJlVGV4dHVyZT9udWxsPT10aGlzLl9jdWJlbWFwU2hhZGVyJiYodGhpcy5fY3ViZW1hcFNoYWRlcj1GMHQoKSk6bnVsbD09dGhpcy5fZXF1aXJlY3RTaGFkZXImJih0aGlzLl9lcXVpcmVjdFNoYWRlcj1IMHQoKSk7Y29uc3QgaT10LmlzQ3ViZVRleHR1cmU/dGhpcy5fY3ViZW1hcFNoYWRlcjp0aGlzLl9lcXVpcmVjdFNoYWRlcixyPW5ldyBCMXQoRTB0WzBdLGkpLG89aS51bmlmb3JtcztvLmVudk1hcC52YWx1ZT10LHQuaXNDdWJlVGV4dHVyZXx8by50ZXhlbFNpemUudmFsdWUuc2V0KDEvdC5pbWFnZS53aWR0aCwxL3QuaW1hZ2UuaGVpZ2h0KSxvLmlucHV0RW5jb2RpbmcudmFsdWU9eDB0W3QuZW5jb2RpbmddLG8ub3V0cHV0RW5jb2RpbmcudmFsdWU9eDB0W2UudGV4dHVyZS5lbmNvZGluZ10sQjB0KGUsMCwwLDMqeTB0LDIqeTB0KSxuLnNldFJlbmRlclRhcmdldChlKSxuLnJlbmRlcihyLE0wdCl9X2FwcGx5UE1SRU0odCl7Y29uc3QgZT10aGlzLl9yZW5kZXJlcixuPWUuYXV0b0NsZWFyO2UuYXV0b0NsZWFyPSExO2ZvcihsZXQgZT0xO2U8YjB0O2UrKyl7Y29uc3Qgbj1NYXRoLnNxcnQoQzB0W2VdKkMwdFtlXS1DMHRbZS0xXSpDMHRbZS0xXSk7dGhpcy5fYmx1cih0LGUtMSxlLG4sTjB0WyhlLTEpJU4wdC5sZW5ndGhdKX1lLmF1dG9DbGVhcj1ufV9ibHVyKHQsZSxuLGkscil7Y29uc3Qgbz10aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldDt0aGlzLl9oYWxmQmx1cih0LG8sZSxuLGksImxhdGl0dWRpbmFsIixyKSx0aGlzLl9oYWxmQmx1cihvLHQsbixuLGksImxvbmdpdHVkaW5hbCIscil9X2hhbGZCbHVyKHQsZSxuLGkscixvLGEpe2NvbnN0IHM9dGhpcy5fcmVuZGVyZXIsbD10aGlzLl9ibHVyTWF0ZXJpYWw7ImxhdGl0dWRpbmFsIiE9PW8mJiJsb25naXR1ZGluYWwiIT09byYmY29uc29sZS5lcnJvcigiYmx1ciBkaXJlY3Rpb24gbXVzdCBiZSBlaXRoZXIgbGF0aXR1ZGluYWwgb3IgbG9uZ2l0dWRpbmFsISIpO2NvbnN0IGM9bmV3IEIxdChFMHRbaV0sbCksdT1sLnVuaWZvcm1zLGg9VDB0W25dLTEsZD1pc0Zpbml0ZShyKT9NYXRoLlBJLygyKmgpOjIqTWF0aC5QSS8zOSxwPXIvZCxmPWlzRmluaXRlKHIpPzErTWF0aC5mbG9vcigzKnApOjIwO2Y+MjAmJmNvbnNvbGUud2Fybihgc2lnbWFSYWRpYW5zLCAke3J9LCBpcyB0b28gbGFyZ2UgYW5kIHdpbGwgY2xpcCwgYXMgaXQgcmVxdWVzdGVkICR7Zn0gc2FtcGxlcyB3aGVuIHRoZSBtYXhpbXVtIGlzIHNldCB0byAyMGApO2NvbnN0IG09W107bGV0IGc9MDtmb3IobGV0IHQ9MDt0PDIwOysrdCl7Y29uc3QgZT10L3Asbj1NYXRoLmV4cCgtZSplLzIpO20ucHVzaChuKSwwPT10P2crPW46dDxmJiYoZys9MipuKX1mb3IobGV0IHQ9MDt0PG0ubGVuZ3RoO3QrKyltW3RdPW1bdF0vZzt1LmVudk1hcC52YWx1ZT10LnRleHR1cmUsdS5zYW1wbGVzLnZhbHVlPWYsdS53ZWlnaHRzLnZhbHVlPW0sdS5sYXRpdHVkaW5hbC52YWx1ZT0ibGF0aXR1ZGluYWwiPT09byxhJiYodS5wb2xlQXhpcy52YWx1ZT1hKSx1LmRUaGV0YS52YWx1ZT1kLHUubWlwSW50LnZhbHVlPTgtbix1LmlucHV0RW5jb2RpbmcudmFsdWU9eDB0W3QudGV4dHVyZS5lbmNvZGluZ10sdS5vdXRwdXRFbmNvZGluZy52YWx1ZT14MHRbdC50ZXh0dXJlLmVuY29kaW5nXTtjb25zdCBfPVQwdFtpXTtCMHQoZSwzKk1hdGgubWF4KDAseTB0LTIqXyksKDA9PT1pPzA6Mip5MHQpKzIqXyooaT40P2ktOCs0OjApLDMqXywyKl8pLHMuc2V0UmVuZGVyVGFyZ2V0KGUpLHMucmVuZGVyKGMsTTB0KX19ZnVuY3Rpb24gTzB0KHQpe3JldHVybiB2b2lkIDAhPT10JiZ0LnR5cGU9PT1yWnQmJih0LmVuY29kaW5nPT09Tlp0fHx0LmVuY29kaW5nPT09SVp0fHx0LmVuY29kaW5nPT09Ulp0KX1mdW5jdGlvbiB6MHQoKXtjb25zdCB0PVtdLGU9W10sbj1bXTtsZXQgaT04O2ZvcihsZXQgcj0wO3I8YjB0O3IrKyl7Y29uc3Qgbz1NYXRoLnBvdygyLGkpO2UucHVzaChvKTtsZXQgYT0xL287cj40P2E9djB0W3ItOCs0LTFdOjA9PXImJihhPTApLG4ucHVzaChhKTtjb25zdCBzPTEvKG8tMSksbD0tcy8yLGM9MStzLzIsdT1bbCxsLGMsbCxjLGMsbCxsLGMsYyxsLGNdLGg9NixkPTYscD0zLGY9MixtPTEsZz1uZXcgRmxvYXQzMkFycmF5KHAqZCpoKSxfPW5ldyBGbG9hdDMyQXJyYXkoZipkKmgpLHk9bmV3IEZsb2F0MzJBcnJheShtKmQqaCk7Zm9yKGxldCB0PTA7dDxoO3QrKyl7Y29uc3QgZT10JTMqMi8zLTEsbj10PjI/MDotMTtnLnNldChbZSxuLDAsZSsyLzMsbiwwLGUrMi8zLG4rMSwwLGUsbiwwLGUrMi8zLG4rMSwwLGUsbisxLDBdLHAqZCp0KSxfLnNldCh1LGYqZCp0KSx5LnNldChbdCx0LHQsdCx0LHRdLG0qZCp0KX1jb25zdCB2PW5ldyBiMXQ7di5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgUVF0KGcscCkpLHYuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFFRdChfLGYpKSx2LnNldEF0dHJpYnV0ZSgiZmFjZUluZGV4IixuZXcgUVF0KHksbSkpLHQucHVzaCh2KSxpPjQmJmktLX1yZXR1cm57X2xvZFBsYW5lczp0LF9zaXplTG9kczplLF9zaWdtYXM6bn19ZnVuY3Rpb24gRDB0KHQpe2NvbnN0IGU9bmV3IFNKdCgzKnkwdCwzKnkwdCx0KTtyZXR1cm4gZS50ZXh0dXJlLm1hcHBpbmc9WUt0LGUudGV4dHVyZS5uYW1lPSJQTVJFTS5jdWJlVXYiLGUuc2Npc3NvclRlc3Q9ITAsZX1mdW5jdGlvbiBCMHQodCxlLG4saSxyKXt0LnZpZXdwb3J0LnNldChlLG4saSxyKSx0LnNjaXNzb3Iuc2V0KGUsbixpLHIpfWZ1bmN0aW9uIEgwdCgpe2NvbnN0IHQ9bmV3IG1KdCgxLDEpO3JldHVybiBuZXcgXzB0KHtuYW1lOiJFcXVpcmVjdGFuZ3VsYXJUb0N1YmVVViIsdW5pZm9ybXM6e2Vudk1hcDp7dmFsdWU6bnVsbH0sdGV4ZWxTaXplOnt2YWx1ZTp0fSxpbnB1dEVuY29kaW5nOnt2YWx1ZTp4MHRbM2UzXX0sb3V0cHV0RW5jb2Rpbmc6e3ZhbHVlOngwdFszZTNdfX0sdmVydGV4U2hhZGVyOiJcblxuXHRcdHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXHRcdHByZWNpc2lvbiBtZWRpdW1wIGludDtcblxuXHRcdGF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uO1xuXHRcdGF0dHJpYnV0ZSB2ZWMyIHV2O1xuXHRcdGF0dHJpYnV0ZSBmbG9hdCBmYWNlSW5kZXg7XG5cblx0XHR2YXJ5aW5nIHZlYzMgdk91dHB1dERpcmVjdGlvbjtcblxuXHRcdC8vIFJIIGNvb3JkaW5hdGUgc3lzdGVtOyBQTVJFTSBmYWNlLWluZGV4aW5nIGNvbnZlbnRpb25cblx0XHR2ZWMzIGdldERpcmVjdGlvbiggdmVjMiB1diwgZmxvYXQgZmFjZSApIHtcblxuXHRcdFx0dXYgPSAyLjAgKiB1diAtIDEuMDtcblxuXHRcdFx0dmVjMyBkaXJlY3Rpb24gPSB2ZWMzKCB1diwgMS4wICk7XG5cblx0XHRcdGlmICggZmFjZSA9PSAwLjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnp5eDsgLy8gKCAxLCB2LCB1ICkgcG9zIHhcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSAxLjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnh6eTtcblx0XHRcdFx0ZGlyZWN0aW9uLnh6ICo9IC0xLjA7IC8vICggLXUsIDEsIC12ICkgcG9zIHlcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSAyLjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uLnggKj0gLTEuMDsgLy8gKCAtdSwgdiwgMSApIHBvcyB6XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMy4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi56eXg7XG5cdFx0XHRcdGRpcmVjdGlvbi54eiAqPSAtMS4wOyAvLyAoIC0xLCB2LCAtdSApIG5lZyB4XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gNC4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi54enk7XG5cdFx0XHRcdGRpcmVjdGlvbi54eSAqPSAtMS4wOyAvLyAoIC11LCAtMSwgdiApIG5lZyB5XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gNS4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbi56ICo9IC0xLjA7IC8vICggdSwgdiwgLTEgKSBuZWcgelxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkaXJlY3Rpb247XG5cblx0XHR9XG5cblx0XHR2b2lkIG1haW4oKSB7XG5cblx0XHRcdHZPdXRwdXREaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oIHV2LCBmYWNlSW5kZXggKTtcblx0XHRcdGdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24sIDEuMCApO1xuXG5cdFx0fVxuXHQiLGZyYWdtZW50U2hhZGVyOiJcblxuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBpbnQ7XG5cblx0XHRcdHZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uO1xuXG5cdFx0XHR1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7XG5cdFx0XHR1bmlmb3JtIHZlYzIgdGV4ZWxTaXplO1xuXG5cdFx0XHRcblxuXHRcdHVuaWZvcm0gaW50IGlucHV0RW5jb2Rpbmc7XG5cdFx0dW5pZm9ybSBpbnQgb3V0cHV0RW5jb2Rpbmc7XG5cblx0XHQjaW5jbHVkZSA8ZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ+XG5cblx0XHR2ZWM0IGlucHV0VGV4ZWxUb0xpbmVhciggdmVjNCB2YWx1ZSApIHtcblxuXHRcdFx0aWYgKCBpbnB1dEVuY29kaW5nID09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDEgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHNSR0JUb0xpbmVhciggdmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW5wdXRFbmNvZGluZyA9PSAyICkge1xuXG5cdFx0XHRcdHJldHVybiBSR0JFVG9MaW5lYXIoIHZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gMyApIHtcblxuXHRcdFx0XHRyZXR1cm4gUkdCTVRvTGluZWFyKCB2YWx1ZSwgNy4wICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gNCApIHtcblxuXHRcdFx0XHRyZXR1cm4gUkdCTVRvTGluZWFyKCB2YWx1ZSwgMTYuMCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIFJHQkRUb0xpbmVhciggdmFsdWUsIDI1Ni4wICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIEdhbW1hVG9MaW5lYXIoIHZhbHVlLCAyLjIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmVjNCBsaW5lYXJUb091dHB1dFRleGVsKCB2ZWM0IHZhbHVlICkge1xuXG5cdFx0XHRpZiAoIG91dHB1dEVuY29kaW5nID09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvdXRwdXRFbmNvZGluZyA9PSAxICkge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb3NSR0IoIHZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDIgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvUkdCRSggdmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gMyApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9SR0JNKCB2YWx1ZSwgNy4wICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvUkdCTSggdmFsdWUsIDE2LjAgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gNSApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9SR0JEKCB2YWx1ZSwgMjU2LjAgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9HYW1tYSggdmFsdWUsIDIuMiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2ZWM0IGVudk1hcFRleGVsVG9MaW5lYXIoIHZlYzQgY29sb3IgKSB7XG5cblx0XHRcdHJldHVybiBpbnB1dFRleGVsVG9MaW5lYXIoIGNvbG9yICk7XG5cblx0XHR9XG5cdFxuXG5cdFx0XHQjaW5jbHVkZSA8Y29tbW9uPlxuXG5cdFx0XHR2b2lkIG1haW4oKSB7XG5cblx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7XG5cblx0XHRcdFx0dmVjMyBvdXRwdXREaXJlY3Rpb24gPSBub3JtYWxpemUoIHZPdXRwdXREaXJlY3Rpb24gKTtcblx0XHRcdFx0dmVjMiB1diA9IGVxdWlyZWN0VXYoIG91dHB1dERpcmVjdGlvbiApO1xuXG5cdFx0XHRcdHZlYzIgZiA9IGZyYWN0KCB1diAvIHRleGVsU2l6ZSAtIDAuNSApO1xuXHRcdFx0XHR1diAtPSBmICogdGV4ZWxTaXplO1xuXHRcdFx0XHR2ZWMzIHRsID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEICggZW52TWFwLCB1diApICkucmdiO1xuXHRcdFx0XHR1di54ICs9IHRleGVsU2l6ZS54O1xuXHRcdFx0XHR2ZWMzIHRyID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEICggZW52TWFwLCB1diApICkucmdiO1xuXHRcdFx0XHR1di55ICs9IHRleGVsU2l6ZS55O1xuXHRcdFx0XHR2ZWMzIGJyID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEICggZW52TWFwLCB1diApICkucmdiO1xuXHRcdFx0XHR1di54IC09IHRleGVsU2l6ZS54O1xuXHRcdFx0XHR2ZWMzIGJsID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEICggZW52TWFwLCB1diApICkucmdiO1xuXG5cdFx0XHRcdHZlYzMgdG0gPSBtaXgoIHRsLCB0ciwgZi54ICk7XG5cdFx0XHRcdHZlYzMgYm0gPSBtaXgoIGJsLCBiciwgZi54ICk7XG5cdFx0XHRcdGdsX0ZyYWdDb2xvci5yZ2IgPSBtaXgoIHRtLCBibSwgZi55ICk7XG5cblx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbCggZ2xfRnJhZ0NvbG9yICk7XG5cblx0XHRcdH1cblx0XHQiLGJsZW5kaW5nOjAsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITF9KX1mdW5jdGlvbiBGMHQoKXtyZXR1cm4gbmV3IF8wdCh7bmFtZToiQ3ViZW1hcFRvQ3ViZVVWIix1bmlmb3Jtczp7ZW52TWFwOnt2YWx1ZTpudWxsfSxpbnB1dEVuY29kaW5nOnt2YWx1ZTp4MHRbM2UzXX0sb3V0cHV0RW5jb2Rpbmc6e3ZhbHVlOngwdFszZTNdfX0sdmVydGV4U2hhZGVyOiJcblxuXHRcdHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXHRcdHByZWNpc2lvbiBtZWRpdW1wIGludDtcblxuXHRcdGF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uO1xuXHRcdGF0dHJpYnV0ZSB2ZWMyIHV2O1xuXHRcdGF0dHJpYnV0ZSBmbG9hdCBmYWNlSW5kZXg7XG5cblx0XHR2YXJ5aW5nIHZlYzMgdk91dHB1dERpcmVjdGlvbjtcblxuXHRcdC8vIFJIIGNvb3JkaW5hdGUgc3lzdGVtOyBQTVJFTSBmYWNlLWluZGV4aW5nIGNvbnZlbnRpb25cblx0XHR2ZWMzIGdldERpcmVjdGlvbiggdmVjMiB1diwgZmxvYXQgZmFjZSApIHtcblxuXHRcdFx0dXYgPSAyLjAgKiB1diAtIDEuMDtcblxuXHRcdFx0dmVjMyBkaXJlY3Rpb24gPSB2ZWMzKCB1diwgMS4wICk7XG5cblx0XHRcdGlmICggZmFjZSA9PSAwLjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnp5eDsgLy8gKCAxLCB2LCB1ICkgcG9zIHhcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSAxLjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnh6eTtcblx0XHRcdFx0ZGlyZWN0aW9uLnh6ICo9IC0xLjA7IC8vICggLXUsIDEsIC12ICkgcG9zIHlcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSAyLjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uLnggKj0gLTEuMDsgLy8gKCAtdSwgdiwgMSApIHBvcyB6XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMy4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi56eXg7XG5cdFx0XHRcdGRpcmVjdGlvbi54eiAqPSAtMS4wOyAvLyAoIC0xLCB2LCAtdSApIG5lZyB4XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gNC4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi54enk7XG5cdFx0XHRcdGRpcmVjdGlvbi54eSAqPSAtMS4wOyAvLyAoIC11LCAtMSwgdiApIG5lZyB5XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gNS4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbi56ICo9IC0xLjA7IC8vICggdSwgdiwgLTEgKSBuZWcgelxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkaXJlY3Rpb247XG5cblx0XHR9XG5cblx0XHR2b2lkIG1haW4oKSB7XG5cblx0XHRcdHZPdXRwdXREaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oIHV2LCBmYWNlSW5kZXggKTtcblx0XHRcdGdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24sIDEuMCApO1xuXG5cdFx0fVxuXHQiLGZyYWdtZW50U2hhZGVyOiJcblxuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBpbnQ7XG5cblx0XHRcdHZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uO1xuXG5cdFx0XHR1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcblxuXHRcdFx0XG5cblx0XHR1bmlmb3JtIGludCBpbnB1dEVuY29kaW5nO1xuXHRcdHVuaWZvcm0gaW50IG91dHB1dEVuY29kaW5nO1xuXG5cdFx0I2luY2x1ZGUgPGVuY29kaW5nc19wYXJzX2ZyYWdtZW50PlxuXG5cdFx0dmVjNCBpbnB1dFRleGVsVG9MaW5lYXIoIHZlYzQgdmFsdWUgKSB7XG5cblx0XHRcdGlmICggaW5wdXRFbmNvZGluZyA9PSAwICkge1xuXG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW5wdXRFbmNvZGluZyA9PSAxICkge1xuXG5cdFx0XHRcdHJldHVybiBzUkdCVG9MaW5lYXIoIHZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gMiApIHtcblxuXHRcdFx0XHRyZXR1cm4gUkdCRVRvTGluZWFyKCB2YWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDMgKSB7XG5cblx0XHRcdFx0cmV0dXJuIFJHQk1Ub0xpbmVhciggdmFsdWUsIDcuMCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIFJHQk1Ub0xpbmVhciggdmFsdWUsIDE2LjAgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW5wdXRFbmNvZGluZyA9PSA1ICkge1xuXG5cdFx0XHRcdHJldHVybiBSR0JEVG9MaW5lYXIoIHZhbHVlLCAyNTYuMCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBHYW1tYVRvTGluZWFyKCB2YWx1ZSwgMi4yICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZlYzQgbGluZWFyVG9PdXRwdXRUZXhlbCggdmVjNCB2YWx1ZSApIHtcblxuXHRcdFx0aWYgKCBvdXRwdXRFbmNvZGluZyA9PSAwICkge1xuXG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gMSApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9zUkdCKCB2YWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvdXRwdXRFbmNvZGluZyA9PSAyICkge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb1JHQkUoIHZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDMgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvUkdCTSggdmFsdWUsIDcuMCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvdXRwdXRFbmNvZGluZyA9PSA0ICkge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb1JHQk0oIHZhbHVlLCAxNi4wICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvUkdCRCggdmFsdWUsIDI1Ni4wICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvR2FtbWEoIHZhbHVlLCAyLjIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmVjNCBlbnZNYXBUZXhlbFRvTGluZWFyKCB2ZWM0IGNvbG9yICkge1xuXG5cdFx0XHRyZXR1cm4gaW5wdXRUZXhlbFRvTGluZWFyKCBjb2xvciApO1xuXG5cdFx0fVxuXHRcblxuXHRcdFx0dm9pZCBtYWluKCkge1xuXG5cdFx0XHRcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIDAuMCwgMC4wLCAwLjAsIDEuMCApO1xuXHRcdFx0XHRnbF9GcmFnQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZUN1YmUoIGVudk1hcCwgdmVjMyggLSB2T3V0cHV0RGlyZWN0aW9uLngsIHZPdXRwdXREaXJlY3Rpb24ueXogKSApICkucmdiO1xuXHRcdFx0XHRnbF9GcmFnQ29sb3IgPSBsaW5lYXJUb091dHB1dFRleGVsKCBnbF9GcmFnQ29sb3IgKTtcblxuXHRcdFx0fVxuXHRcdCIsYmxlbmRpbmc6MCxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMX0pfWZ1bmN0aW9uIFYwdCh0KXtsZXQgZT1uZXcgV2Vha01hcCxuPW51bGw7ZnVuY3Rpb24gaSh0KXtjb25zdCBuPXQudGFyZ2V0O24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsaSk7Y29uc3Qgcj1lLmdldChuKTt2b2lkIDAhPT1yJiYoci5kZWxldGUobiksci5kaXNwb3NlKCkpfXJldHVybntnZXQ6ZnVuY3Rpb24gcihvKXtpZihvJiZvLmlzVGV4dHVyZSYmITE9PT1vLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSl7Y29uc3Qgcj1vLm1hcHBpbmcsYT1yPT09V0t0fHxyPT09cUt0LHM9cj09PWpLdHx8cj09PUdLdDtpZihhfHxzKXtpZihlLmhhcyhvKSlyZXR1cm4gZS5nZXQobykudGV4dHVyZTt7Y29uc3Qgcj1vLmltYWdlO2lmKGEmJnImJnIuaGVpZ2h0PjB8fHMmJnImJihmdW5jdGlvbiBhKHQpe2xldCBlPTA7Zm9yKGxldCBuPTA7bjw2O24rKyl2b2lkIDAhPT10W25dJiZlKys7cmV0dXJuIDY9PT1lfSkocikpe2NvbnN0IHI9dC5nZXRSZW5kZXJUYXJnZXQoKTtudWxsPT09biYmKG49bmV3IFIwdCh0KSk7Y29uc3Qgcz1hP24uZnJvbUVxdWlyZWN0YW5ndWxhcihvKTpuLmZyb21DdWJlbWFwKG8pO3JldHVybiBlLnNldChvLHMpLHQuc2V0UmVuZGVyVGFyZ2V0KHIpLG8uYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsaSkscy50ZXh0dXJlfXJldHVybiBudWxsfX19cmV0dXJuIG99LGRpc3Bvc2U6ZnVuY3Rpb24gbygpe2U9bmV3IFdlYWtNYXAsbnVsbCE9PW4mJihuLmRpc3Bvc2UoKSxuPW51bGwpfX19ZnVuY3Rpb24gVTB0KHQpe2NvbnN0IGU9e307ZnVuY3Rpb24gbihuKXtpZih2b2lkIDAhPT1lW25dKXJldHVybiBlW25dO2xldCBpO3N3aXRjaChuKXtjYXNlIldFQkdMX2RlcHRoX3RleHR1cmUiOmk9dC5nZXRFeHRlbnNpb24oIldFQkdMX2RlcHRoX3RleHR1cmUiKXx8dC5nZXRFeHRlbnNpb24oIk1PWl9XRUJHTF9kZXB0aF90ZXh0dXJlIil8fHQuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfV0VCR0xfZGVwdGhfdGV4dHVyZSIpO2JyZWFrO2Nhc2UiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIjppPXQuZ2V0RXh0ZW5zaW9uKCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKXx8dC5nZXRFeHRlbnNpb24oIk1PWl9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKXx8dC5nZXRFeHRlbnNpb24oIldFQktJVF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTticmVhaztjYXNlIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIjppPXQuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpfHx0LmdldEV4dGVuc2lvbigiTU9aX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fHQuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKTticmVhaztjYXNlIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyI6aT10LmdldEV4dGVuc2lvbigiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIil8fHQuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIik7YnJlYWs7ZGVmYXVsdDppPXQuZ2V0RXh0ZW5zaW9uKG4pfXJldHVybiBlW25dPWksaX1yZXR1cm57aGFzOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09bih0KX0saW5pdDpmdW5jdGlvbih0KXt0LmlzV2ViR0wyP24oIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKToobigiV0VCR0xfZGVwdGhfdGV4dHVyZSIpLG4oIk9FU190ZXh0dXJlX2Zsb2F0IiksbigiT0VTX3RleHR1cmVfaGFsZl9mbG9hdCIpLG4oIk9FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyIiksbigiT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIiksbigiT0VTX2VsZW1lbnRfaW5kZXhfdWludCIpLG4oIk9FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0IiksbigiQU5HTEVfaW5zdGFuY2VkX2FycmF5cyIpKSxuKCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKSxuKCJFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQiKX0sZ2V0OmZ1bmN0aW9uKHQpe2NvbnN0IGU9bih0KTtyZXR1cm4gbnVsbD09PWUmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogIit0KyIgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQuIiksZX19fWZ1bmN0aW9uIGowdCh0LGUsbixpKXtjb25zdCByPXt9LG89bmV3IFdlYWtNYXA7ZnVuY3Rpb24gYSh0KXtjb25zdCBzPXQudGFyZ2V0O251bGwhPT1zLmluZGV4JiZlLnJlbW92ZShzLmluZGV4KTtmb3IoY29uc3QgdCBpbiBzLmF0dHJpYnV0ZXMpZS5yZW1vdmUocy5hdHRyaWJ1dGVzW3RdKTtzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGEpLGRlbGV0ZSByW3MuaWRdO2NvbnN0IGw9by5nZXQocyk7bCYmKGUucmVtb3ZlKGwpLG8uZGVsZXRlKHMpKSxpLnJlbGVhc2VTdGF0ZXNPZkdlb21ldHJ5KHMpLCEwPT09cy5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5JiZkZWxldGUgcy5fbWF4SW5zdGFuY2VDb3VudCxuLm1lbW9yeS5nZW9tZXRyaWVzLS19ZnVuY3Rpb24gcyh0KXtjb25zdCBuPVtdLGk9dC5pbmRleCxyPXQuYXR0cmlidXRlcy5wb3NpdGlvbjtsZXQgYT0wO2lmKG51bGwhPT1pKXtjb25zdCB0PWkuYXJyYXk7YT1pLnZlcnNpb247Zm9yKGxldCBlPTAsaT10Lmxlbmd0aDtlPGk7ZSs9Myl7Y29uc3QgaT10W2UrMF0scj10W2UrMV0sbz10W2UrMl07bi5wdXNoKGkscixyLG8sbyxpKX19ZWxzZXthPXIudmVyc2lvbjtmb3IobGV0IHQ9MCxlPXIuYXJyYXkubGVuZ3RoLzMtMTt0PGU7dCs9Myl7Y29uc3QgZT10KzAsaT10KzEscj10KzI7bi5wdXNoKGUsaSxpLHIscixlKX19Y29uc3Qgcz1uZXcodTF0KG4pPjY1NTM1P2ExdDpyMXQpKG4sMSk7cy52ZXJzaW9uPWE7Y29uc3QgbD1vLmdldCh0KTtsJiZlLnJlbW92ZShsKSxvLnNldCh0LHMpfXJldHVybntnZXQ6ZnVuY3Rpb24gbCh0LGUpe3JldHVybiEwPT09cltlLmlkXXx8KGUuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYSkscltlLmlkXT0hMCxuLm1lbW9yeS5nZW9tZXRyaWVzKyspLGV9LHVwZGF0ZTpmdW5jdGlvbiBjKHQpe2NvbnN0IG49dC5hdHRyaWJ1dGVzO2Zvcihjb25zdCB0IGluIG4pZS51cGRhdGUoblt0XSwzNDk2Mik7Y29uc3QgaT10Lm1vcnBoQXR0cmlidXRlcztmb3IoY29uc3QgdCBpbiBpKXtjb25zdCBuPWlbdF07Zm9yKGxldCB0PTAsaT1uLmxlbmd0aDt0PGk7dCsrKWUudXBkYXRlKG5bdF0sMzQ5NjIpfX0sZ2V0V2lyZWZyYW1lQXR0cmlidXRlOmZ1bmN0aW9uIHUodCl7Y29uc3QgZT1vLmdldCh0KTtpZihlKXtjb25zdCBuPXQuaW5kZXg7bnVsbCE9PW4mJmUudmVyc2lvbjxuLnZlcnNpb24mJnModCl9ZWxzZSBzKHQpO3JldHVybiBvLmdldCh0KX19fWZ1bmN0aW9uIEcwdCh0LGUsbixpKXtjb25zdCByPWkuaXNXZWJHTDI7bGV0IG8sYSxzO3RoaXMuc2V0TW9kZT1mdW5jdGlvbiBsKHQpe289dH0sdGhpcy5zZXRJbmRleD1mdW5jdGlvbiBjKHQpe2E9dC50eXBlLHM9dC5ieXRlc1BlckVsZW1lbnR9LHRoaXMucmVuZGVyPWZ1bmN0aW9uIHUoZSxpKXt0LmRyYXdFbGVtZW50cyhvLGksYSxlKnMpLG4udXBkYXRlKGksbywxKX0sdGhpcy5yZW5kZXJJbnN0YW5jZXM9ZnVuY3Rpb24gaChpLGwsYyl7aWYoMD09PWMpcmV0dXJuO2xldCB1LGg7aWYocil1PXQsaD0iZHJhd0VsZW1lbnRzSW5zdGFuY2VkIjtlbHNlIGlmKHU9ZS5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSxoPSJkcmF3RWxlbWVudHNJbnN0YW5jZWRBTkdMRSIsbnVsbD09PXUpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLiIpO3VbaF0obyxsLGEsaSpzLGMpLG4udXBkYXRlKGwsbyxjKX19ZnVuY3Rpb24gVzB0KHQpe2NvbnN0IGU9e2ZyYW1lOjAsY2FsbHM6MCx0cmlhbmdsZXM6MCxwb2ludHM6MCxsaW5lczowfTtyZXR1cm57bWVtb3J5OntnZW9tZXRyaWVzOjAsdGV4dHVyZXM6MH0scmVuZGVyOmUscHJvZ3JhbXM6bnVsbCxhdXRvUmVzZXQ6ITAscmVzZXQ6ZnVuY3Rpb24gbigpe2UuZnJhbWUrKyxlLmNhbGxzPTAsZS50cmlhbmdsZXM9MCxlLnBvaW50cz0wLGUubGluZXM9MH0sdXBkYXRlOmZ1bmN0aW9uIGkodCxuLHIpe3N3aXRjaChlLmNhbGxzKyssbil7Y2FzZSA0OmUudHJpYW5nbGVzKz1yKih0LzMpO2JyZWFrO2Nhc2UgMTplLmxpbmVzKz1yKih0LzIpO2JyZWFrO2Nhc2UgMzplLmxpbmVzKz1yKih0LTEpO2JyZWFrO2Nhc2UgMjplLmxpbmVzKz1yKnQ7YnJlYWs7Y2FzZSAwOmUucG9pbnRzKz1yKnQ7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTEluZm86IFVua25vd24gZHJhdyBtb2RlOiIsbil9fX19ZnVuY3Rpb24gcTB0KHQsZSl7cmV0dXJuIHRbMF0tZVswXX1mdW5jdGlvbiBZMHQodCxlKXtyZXR1cm4gTWF0aC5hYnMoZVsxXSktTWF0aC5hYnModFsxXSl9ZnVuY3Rpb24gWDB0KHQpe2NvbnN0IGU9e30sbj1uZXcgRmxvYXQzMkFycmF5KDgpLGk9W107Zm9yKGxldCB0PTA7dDw4O3QrKylpW3RdPVt0LDBdO3JldHVybnt1cGRhdGU6ZnVuY3Rpb24gcihvLGEscyxsKXtjb25zdCBjPW8ubW9ycGhUYXJnZXRJbmZsdWVuY2VzLHU9dm9pZCAwPT09Yz8wOmMubGVuZ3RoO2xldCBoPWVbYS5pZF07aWYodm9pZCAwPT09aHx8aC5sZW5ndGghPT11KXtoPVtdO2ZvcihsZXQgdD0wO3Q8dTt0KyspaFt0XT1bdCwwXTtlW2EuaWRdPWh9Zm9yKGxldCB0PTA7dDx1O3QrKyl7Y29uc3QgZT1oW3RdO2VbMF09dCxlWzFdPWNbdF19aC5zb3J0KFkwdCk7Zm9yKGxldCB0PTA7dDw4O3QrKyl0PHUmJmhbdF1bMV0/KGlbdF1bMF09aFt0XVswXSxpW3RdWzFdPWhbdF1bMV0pOihpW3RdWzBdPU51bWJlci5NQVhfU0FGRV9JTlRFR0VSLGlbdF1bMV09MCk7aS5zb3J0KHEwdCk7Y29uc3QgZD1hLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixwPWEubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbDtsZXQgZj0wO2ZvcihsZXQgdD0wO3Q8ODt0Kyspe2NvbnN0IGU9aVt0XSxyPWVbMF0sbz1lWzFdO3IhPT1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUiYmbz8oZCYmYS5nZXRBdHRyaWJ1dGUoIm1vcnBoVGFyZ2V0Iit0KSE9PWRbcl0mJmEuc2V0QXR0cmlidXRlKCJtb3JwaFRhcmdldCIrdCxkW3JdKSxwJiZhLmdldEF0dHJpYnV0ZSgibW9ycGhOb3JtYWwiK3QpIT09cFtyXSYmYS5zZXRBdHRyaWJ1dGUoIm1vcnBoTm9ybWFsIit0LHBbcl0pLG5bdF09byxmKz1vKTooZCYmITA9PT1hLmhhc0F0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK3QpJiZhLmRlbGV0ZUF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK3QpLHAmJiEwPT09YS5oYXNBdHRyaWJ1dGUoIm1vcnBoTm9ybWFsIit0KSYmYS5kZWxldGVBdHRyaWJ1dGUoIm1vcnBoTm9ybWFsIit0KSxuW3RdPTApfWNvbnN0IG09YS5tb3JwaFRhcmdldHNSZWxhdGl2ZT8xOjEtZjtsLmdldFVuaWZvcm1zKCkuc2V0VmFsdWUodCwibW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlIixtKSxsLmdldFVuaWZvcm1zKCkuc2V0VmFsdWUodCwibW9ycGhUYXJnZXRJbmZsdWVuY2VzIixuKX19fWZ1bmN0aW9uICQwdCh0LGUsbixpKXtsZXQgcj1uZXcgV2Vha01hcDtmdW5jdGlvbiBvKHQpe2NvbnN0IGU9dC50YXJnZXQ7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixvKSxuLnJlbW92ZShlLmluc3RhbmNlTWF0cml4KSxudWxsIT09ZS5pbnN0YW5jZUNvbG9yJiZuLnJlbW92ZShlLmluc3RhbmNlQ29sb3IpfXJldHVybnt1cGRhdGU6ZnVuY3Rpb24gYSh0KXtjb25zdCBhPWkucmVuZGVyLmZyYW1lLHM9ZS5nZXQodCx0Lmdlb21ldHJ5KTtyZXR1cm4gci5nZXQocykhPT1hJiYoZS51cGRhdGUocyksci5zZXQocyxhKSksdC5pc0luc3RhbmNlZE1lc2gmJighMT09PXQuaGFzRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsbykmJnQuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsbyksbi51cGRhdGUodC5pbnN0YW5jZU1hdHJpeCwzNDk2MiksbnVsbCE9PXQuaW5zdGFuY2VDb2xvciYmbi51cGRhdGUodC5pbnN0YW5jZUNvbG9yLDM0OTYyKSksc30sZGlzcG9zZTpmdW5jdGlvbiBzKCl7cj1uZXcgV2Vha01hcH19fWNsYXNzIEswdCBleHRlbmRzIGJKdHtjb25zdHJ1Y3Rvcih0PW51bGwsZT0xLG49MSxpPTEpe3N1cGVyKG51bGwpLHRoaXMuaW1hZ2U9e2RhdGE6dCx3aWR0aDplLGhlaWdodDpuLGRlcHRoOml9LHRoaXMubWFnRmlsdGVyPUpLdCx0aGlzLm1pbkZpbHRlcj1KS3QsdGhpcy53cmFwUj1LS3QsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITEsdGhpcy5mbGlwWT0hMSx0aGlzLnVucGFja0FsaWdubWVudD0xLHRoaXMubmVlZHNVcGRhdGU9ITB9fUswdC5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZTJEQXJyYXk9ITA7Y2xhc3MgWjB0IGV4dGVuZHMgYkp0e2NvbnN0cnVjdG9yKHQ9bnVsbCxlPTEsbj0xLGk9MSl7c3VwZXIobnVsbCksdGhpcy5pbWFnZT17ZGF0YTp0LHdpZHRoOmUsaGVpZ2h0Om4sZGVwdGg6aX0sdGhpcy5tYWdGaWx0ZXI9Skt0LHRoaXMubWluRmlsdGVyPUpLdCx0aGlzLndyYXBSPUtLdCx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMSx0aGlzLmZsaXBZPSExLHRoaXMudW5wYWNrQWxpZ25tZW50PTEsdGhpcy5uZWVkc1VwZGF0ZT0hMH19WjB0LnByb3RvdHlwZS5pc0RhdGFUZXh0dXJlM0Q9ITA7Y29uc3QgSjB0PW5ldyBiSnQsUTB0PW5ldyBLMHQsdDJ0PW5ldyBaMHQsZTJ0PW5ldyAkMXQsbjJ0PVtdLGkydD1bXSxyMnQ9bmV3IEZsb2F0MzJBcnJheSgxNiksbzJ0PW5ldyBGbG9hdDMyQXJyYXkoOSksYTJ0PW5ldyBGbG9hdDMyQXJyYXkoNCk7ZnVuY3Rpb24gczJ0KHQsZSxuKXtjb25zdCBpPXRbMF07aWYoaTw9MHx8aT4wKXJldHVybiB0O2NvbnN0IHI9ZSpuO2xldCBvPW4ydFtyXTtpZih2b2lkIDA9PT1vJiYobz1uZXcgRmxvYXQzMkFycmF5KHIpLG4ydFtyXT1vKSwwIT09ZSl7aS50b0FycmF5KG8sMCk7Zm9yKGxldCBpPTEscj0wO2khPT1lOysraSlyKz1uLHRbaV0udG9BcnJheShvLHIpfXJldHVybiBvfWZ1bmN0aW9uIGwydCh0LGUpe2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCBuPTAsaT10Lmxlbmd0aDtuPGk7bisrKWlmKHRbbl0hPT1lW25dKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGMydCh0LGUpe2ZvcihsZXQgbj0wLGk9ZS5sZW5ndGg7bjxpO24rKyl0W25dPWVbbl19ZnVuY3Rpb24gdTJ0KHQsZSl7bGV0IG49aTJ0W2VdO3ZvaWQgMD09PW4mJihuPW5ldyBJbnQzMkFycmF5KGUpLGkydFtlXT1uKTtmb3IobGV0IGk9MDtpIT09ZTsrK2kpbltpXT10LmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtyZXR1cm4gbn1mdW5jdGlvbiBoMnQodCxlKXtjb25zdCBuPXRoaXMuY2FjaGU7blswXSE9PWUmJih0LnVuaWZvcm0xZih0aGlzLmFkZHIsZSksblswXT1lKX1mdW5jdGlvbiBkMnQodCxlKXtjb25zdCBuPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09ZS54KW5bMF09PT1lLngmJm5bMV09PT1lLnl8fCh0LnVuaWZvcm0yZih0aGlzLmFkZHIsZS54LGUueSksblswXT1lLngsblsxXT1lLnkpO2Vsc2V7aWYobDJ0KG4sZSkpcmV0dXJuO3QudW5pZm9ybTJmdih0aGlzLmFkZHIsZSksYzJ0KG4sZSl9fWZ1bmN0aW9uIHAydCh0LGUpe2NvbnN0IG49dGhpcy5jYWNoZTtpZih2b2lkIDAhPT1lLngpblswXT09PWUueCYmblsxXT09PWUueSYmblsyXT09PWUuenx8KHQudW5pZm9ybTNmKHRoaXMuYWRkcixlLngsZS55LGUueiksblswXT1lLngsblsxXT1lLnksblsyXT1lLnopO2Vsc2UgaWYodm9pZCAwIT09ZS5yKW5bMF09PT1lLnImJm5bMV09PT1lLmcmJm5bMl09PT1lLmJ8fCh0LnVuaWZvcm0zZih0aGlzLmFkZHIsZS5yLGUuZyxlLmIpLG5bMF09ZS5yLG5bMV09ZS5nLG5bMl09ZS5iKTtlbHNle2lmKGwydChuLGUpKXJldHVybjt0LnVuaWZvcm0zZnYodGhpcy5hZGRyLGUpLGMydChuLGUpfX1mdW5jdGlvbiBmMnQodCxlKXtjb25zdCBuPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09ZS54KW5bMF09PT1lLngmJm5bMV09PT1lLnkmJm5bMl09PT1lLnomJm5bM109PT1lLnd8fCh0LnVuaWZvcm00Zih0aGlzLmFkZHIsZS54LGUueSxlLnosZS53KSxuWzBdPWUueCxuWzFdPWUueSxuWzJdPWUueixuWzNdPWUudyk7ZWxzZXtpZihsMnQobixlKSlyZXR1cm47dC51bmlmb3JtNGZ2KHRoaXMuYWRkcixlKSxjMnQobixlKX19ZnVuY3Rpb24gbTJ0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlLGk9ZS5lbGVtZW50cztpZih2b2lkIDA9PT1pKXtpZihsMnQobixlKSlyZXR1cm47dC51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxlKSxjMnQobixlKX1lbHNle2lmKGwydChuLGkpKXJldHVybjthMnQuc2V0KGkpLHQudW5pZm9ybU1hdHJpeDJmdih0aGlzLmFkZHIsITEsYTJ0KSxjMnQobixpKX19ZnVuY3Rpb24gZzJ0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlLGk9ZS5lbGVtZW50cztpZih2b2lkIDA9PT1pKXtpZihsMnQobixlKSlyZXR1cm47dC51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxlKSxjMnQobixlKX1lbHNle2lmKGwydChuLGkpKXJldHVybjtvMnQuc2V0KGkpLHQudW5pZm9ybU1hdHJpeDNmdih0aGlzLmFkZHIsITEsbzJ0KSxjMnQobixpKX19ZnVuY3Rpb24gXzJ0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlLGk9ZS5lbGVtZW50cztpZih2b2lkIDA9PT1pKXtpZihsMnQobixlKSlyZXR1cm47dC51bmlmb3JtTWF0cml4NGZ2KHRoaXMuYWRkciwhMSxlKSxjMnQobixlKX1lbHNle2lmKGwydChuLGkpKXJldHVybjtyMnQuc2V0KGkpLHQudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsITEscjJ0KSxjMnQobixpKX19ZnVuY3Rpb24geTJ0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlO25bMF0hPT1lJiYodC51bmlmb3JtMWkodGhpcy5hZGRyLGUpLG5bMF09ZSl9ZnVuY3Rpb24gdjJ0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlO2wydChuLGUpfHwodC51bmlmb3JtMml2KHRoaXMuYWRkcixlKSxjMnQobixlKSl9ZnVuY3Rpb24gYjJ0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlO2wydChuLGUpfHwodC51bmlmb3JtM2l2KHRoaXMuYWRkcixlKSxjMnQobixlKSl9ZnVuY3Rpb24geDJ0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlO2wydChuLGUpfHwodC51bmlmb3JtNGl2KHRoaXMuYWRkcixlKSxjMnQobixlKSl9ZnVuY3Rpb24gdzJ0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlO25bMF0hPT1lJiYodC51bmlmb3JtMXVpKHRoaXMuYWRkcixlKSxuWzBdPWUpfWZ1bmN0aW9uIFMydCh0LGUpe2NvbnN0IG49dGhpcy5jYWNoZTtsMnQobixlKXx8KHQudW5pZm9ybTJ1aXYodGhpcy5hZGRyLGUpLGMydChuLGUpKX1mdW5jdGlvbiBNMnQodCxlKXtjb25zdCBuPXRoaXMuY2FjaGU7bDJ0KG4sZSl8fCh0LnVuaWZvcm0zdWl2KHRoaXMuYWRkcixlKSxjMnQobixlKSl9ZnVuY3Rpb24gRTJ0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlO2wydChuLGUpfHwodC51bmlmb3JtNHVpdih0aGlzLmFkZHIsZSksYzJ0KG4sZSkpfWZ1bmN0aW9uIFQydCh0LGUsbil7Y29uc3QgaT10aGlzLmNhY2hlLHI9bi5hbGxvY2F0ZVRleHR1cmVVbml0KCk7aVswXSE9PXImJih0LnVuaWZvcm0xaSh0aGlzLmFkZHIsciksaVswXT1yKSxuLnNhZmVTZXRUZXh0dXJlMkQoZXx8SjB0LHIpfWZ1bmN0aW9uIEMydCh0LGUsbil7Y29uc3QgaT10aGlzLmNhY2hlLHI9bi5hbGxvY2F0ZVRleHR1cmVVbml0KCk7aVswXSE9PXImJih0LnVuaWZvcm0xaSh0aGlzLmFkZHIsciksaVswXT1yKSxuLnNldFRleHR1cmUzRChlfHx0MnQscil9ZnVuY3Rpb24gQTJ0KHQsZSxuKXtjb25zdCBpPXRoaXMuY2FjaGUscj1uLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtpWzBdIT09ciYmKHQudW5pZm9ybTFpKHRoaXMuYWRkcixyKSxpWzBdPXIpLG4uc2FmZVNldFRleHR1cmVDdWJlKGV8fGUydCxyKX1mdW5jdGlvbiBrMnQodCxlLG4pe2NvbnN0IGk9dGhpcy5jYWNoZSxyPW4uYWxsb2NhdGVUZXh0dXJlVW5pdCgpO2lbMF0hPT1yJiYodC51bmlmb3JtMWkodGhpcy5hZGRyLHIpLGlbMF09ciksbi5zZXRUZXh0dXJlMkRBcnJheShlfHxRMHQscil9ZnVuY3Rpb24gTDJ0KHQsZSl7dC51bmlmb3JtMWZ2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBQMnQodCxlKXtjb25zdCBuPXMydChlLHRoaXMuc2l6ZSwyKTt0LnVuaWZvcm0yZnYodGhpcy5hZGRyLG4pfWZ1bmN0aW9uIE4ydCh0LGUpe2NvbnN0IG49czJ0KGUsdGhpcy5zaXplLDMpO3QudW5pZm9ybTNmdih0aGlzLmFkZHIsbil9ZnVuY3Rpb24gSTJ0KHQsZSl7Y29uc3Qgbj1zMnQoZSx0aGlzLnNpemUsNCk7dC51bmlmb3JtNGZ2KHRoaXMuYWRkcixuKX1mdW5jdGlvbiBSMnQodCxlKXtjb25zdCBuPXMydChlLHRoaXMuc2l6ZSw0KTt0LnVuaWZvcm1NYXRyaXgyZnYodGhpcy5hZGRyLCExLG4pfWZ1bmN0aW9uIE8ydCh0LGUpe2NvbnN0IG49czJ0KGUsdGhpcy5zaXplLDkpO3QudW5pZm9ybU1hdHJpeDNmdih0aGlzLmFkZHIsITEsbil9ZnVuY3Rpb24gejJ0KHQsZSl7Y29uc3Qgbj1zMnQoZSx0aGlzLnNpemUsMTYpO3QudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsITEsbil9ZnVuY3Rpb24gRDJ0KHQsZSl7dC51bmlmb3JtMWl2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBCMnQodCxlKXt0LnVuaWZvcm0yaXYodGhpcy5hZGRyLGUpfWZ1bmN0aW9uIEgydCh0LGUpe3QudW5pZm9ybTNpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gRjJ0KHQsZSl7dC51bmlmb3JtNGl2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBWMnQodCxlKXt0LnVuaWZvcm0xdWl2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBVMnQodCxlKXt0LnVuaWZvcm0ydWl2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBqMnQodCxlKXt0LnVuaWZvcm0zdWl2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBHMnQodCxlKXt0LnVuaWZvcm00dWl2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBXMnQodCxlLG4pe2NvbnN0IGk9ZS5sZW5ndGgscj11MnQobixpKTt0LnVuaWZvcm0xaXYodGhpcy5hZGRyLHIpO2ZvcihsZXQgdD0wO3QhPT1pOysrdCluLnNhZmVTZXRUZXh0dXJlMkQoZVt0XXx8SjB0LHJbdF0pfWZ1bmN0aW9uIHEydCh0LGUsbil7Y29uc3QgaT1lLmxlbmd0aCxyPXUydChuLGkpO3QudW5pZm9ybTFpdih0aGlzLmFkZHIscik7Zm9yKGxldCB0PTA7dCE9PWk7Kyt0KW4uc2FmZVNldFRleHR1cmVDdWJlKGVbdF18fGUydCxyW3RdKX1mdW5jdGlvbiBZMnQodCxlLG4pe3RoaXMuaWQ9dCx0aGlzLmFkZHI9bix0aGlzLmNhY2hlPVtdLHRoaXMuc2V0VmFsdWU9KGZ1bmN0aW9uIGkodCl7c3dpdGNoKHQpe2Nhc2UgNTEyNjpyZXR1cm4gaDJ0O2Nhc2UgMzU2NjQ6cmV0dXJuIGQydDtjYXNlIDM1NjY1OnJldHVybiBwMnQ7Y2FzZSAzNTY2NjpyZXR1cm4gZjJ0O2Nhc2UgMzU2NzQ6cmV0dXJuIG0ydDtjYXNlIDM1Njc1OnJldHVybiBnMnQ7Y2FzZSAzNTY3NjpyZXR1cm4gXzJ0O2Nhc2UgNTEyNDpjYXNlIDM1NjcwOnJldHVybiB5MnQ7Y2FzZSAzNTY2NzpjYXNlIDM1NjcxOnJldHVybiB2MnQ7Y2FzZSAzNTY2ODpjYXNlIDM1NjcyOnJldHVybiBiMnQ7Y2FzZSAzNTY2OTpjYXNlIDM1NjczOnJldHVybiB4MnQ7Y2FzZSA1MTI1OnJldHVybiB3MnQ7Y2FzZSAzNjI5NDpyZXR1cm4gUzJ0O2Nhc2UgMzYyOTU6cmV0dXJuIE0ydDtjYXNlIDM2Mjk2OnJldHVybiBFMnQ7Y2FzZSAzNTY3ODpjYXNlIDM2MTk4OmNhc2UgMzYyOTg6Y2FzZSAzNjMwNjpjYXNlIDM1NjgyOnJldHVybiBUMnQ7Y2FzZSAzNTY3OTpjYXNlIDM2Mjk5OmNhc2UgMzYzMDc6cmV0dXJuIEMydDtjYXNlIDM1NjgwOmNhc2UgMzYzMDA6Y2FzZSAzNjMwODpjYXNlIDM2MjkzOnJldHVybiBBMnQ7Y2FzZSAzNjI4OTpjYXNlIDM2MzAzOmNhc2UgMzYzMTE6Y2FzZSAzNjI5MjpyZXR1cm4gazJ0fX0pKGUudHlwZSl9ZnVuY3Rpb24gWDJ0KHQsZSxuKXt0aGlzLmlkPXQsdGhpcy5hZGRyPW4sdGhpcy5jYWNoZT1bXSx0aGlzLnNpemU9ZS5zaXplLHRoaXMuc2V0VmFsdWU9KGZ1bmN0aW9uIGkodCl7c3dpdGNoKHQpe2Nhc2UgNTEyNjpyZXR1cm4gTDJ0O2Nhc2UgMzU2NjQ6cmV0dXJuIFAydDtjYXNlIDM1NjY1OnJldHVybiBOMnQ7Y2FzZSAzNTY2NjpyZXR1cm4gSTJ0O2Nhc2UgMzU2NzQ6cmV0dXJuIFIydDtjYXNlIDM1Njc1OnJldHVybiBPMnQ7Y2FzZSAzNTY3NjpyZXR1cm4gejJ0O2Nhc2UgNTEyNDpjYXNlIDM1NjcwOnJldHVybiBEMnQ7Y2FzZSAzNTY2NzpjYXNlIDM1NjcxOnJldHVybiBCMnQ7Y2FzZSAzNTY2ODpjYXNlIDM1NjcyOnJldHVybiBIMnQ7Y2FzZSAzNTY2OTpjYXNlIDM1NjczOnJldHVybiBGMnQ7Y2FzZSA1MTI1OnJldHVybiBWMnQ7Y2FzZSAzNjI5NDpyZXR1cm4gVTJ0O2Nhc2UgMzYyOTU6cmV0dXJuIGoydDtjYXNlIDM2Mjk2OnJldHVybiBHMnQ7Y2FzZSAzNTY3ODpjYXNlIDM2MTk4OmNhc2UgMzYyOTg6Y2FzZSAzNjMwNjpjYXNlIDM1NjgyOnJldHVybiBXMnQ7Y2FzZSAzNTY4MDpjYXNlIDM2MzAwOmNhc2UgMzYzMDg6Y2FzZSAzNjI5MzpyZXR1cm4gcTJ0fX0pKGUudHlwZSl9ZnVuY3Rpb24gJDJ0KHQpe3RoaXMuaWQ9dCx0aGlzLnNlcT1bXSx0aGlzLm1hcD17fX1YMnQucHJvdG90eXBlLnVwZGF0ZUNhY2hlPWZ1bmN0aW9uKHQpe2NvbnN0IGU9dGhpcy5jYWNoZTt0IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5JiZlLmxlbmd0aCE9PXQubGVuZ3RoJiYodGhpcy5jYWNoZT1uZXcgRmxvYXQzMkFycmF5KHQubGVuZ3RoKSksYzJ0KGUsdCl9LCQydC5wcm90b3R5cGUuc2V0VmFsdWU9ZnVuY3Rpb24odCxlLG4pe2NvbnN0IGk9dGhpcy5zZXE7Zm9yKGxldCByPTAsbz1pLmxlbmd0aDtyIT09bzsrK3Ipe2NvbnN0IG89aVtyXTtvLnNldFZhbHVlKHQsZVtvLmlkXSxuKX19O2NvbnN0IEsydD0vKFx3KykoXF0pPyhcW3xcLik/L2c7ZnVuY3Rpb24gWjJ0KHQsZSl7dC5zZXEucHVzaChlKSx0Lm1hcFtlLmlkXT1lfWZ1bmN0aW9uIEoydCh0LGUsbil7Y29uc3QgaT10Lm5hbWUscj1pLmxlbmd0aDtmb3IoSzJ0Lmxhc3RJbmRleD0wOzspe2NvbnN0IG89SzJ0LmV4ZWMoaSksYT1LMnQubGFzdEluZGV4O2xldCBzPW9bMV07Y29uc3QgbD1vWzNdO2lmKCJdIj09PW9bMl0mJihzfD0wKSx2b2lkIDA9PT1sfHwiWyI9PT1sJiZhKzI9PT1yKXtaMnQobix2b2lkIDA9PT1sP25ldyBZMnQocyx0LGUpOm5ldyBYMnQocyx0LGUpKTticmVha317bGV0IHQ9bi5tYXBbc107dm9pZCAwPT09dCYmKHQ9bmV3ICQydChzKSxaMnQobix0KSksbj10fX19ZnVuY3Rpb24gUTJ0KHQsZSl7dGhpcy5zZXE9W10sdGhpcy5tYXA9e307Y29uc3Qgbj10LmdldFByb2dyYW1QYXJhbWV0ZXIoZSwzNTcxOCk7Zm9yKGxldCBpPTA7aTxuOysraSl7Y29uc3Qgbj10LmdldEFjdGl2ZVVuaWZvcm0oZSxpKTtKMnQobix0LmdldFVuaWZvcm1Mb2NhdGlvbihlLG4ubmFtZSksdGhpcyl9fWZ1bmN0aW9uIHQ1dCh0LGUsbil7Y29uc3QgaT10LmNyZWF0ZVNoYWRlcihlKTtyZXR1cm4gdC5zaGFkZXJTb3VyY2UoaSxuKSx0LmNvbXBpbGVTaGFkZXIoaSksaX1RMnQucHJvdG90eXBlLnNldFZhbHVlPWZ1bmN0aW9uKHQsZSxuLGkpe2NvbnN0IHI9dGhpcy5tYXBbZV07dm9pZCAwIT09ciYmci5zZXRWYWx1ZSh0LG4saSl9LFEydC5wcm90b3R5cGUuc2V0T3B0aW9uYWw9ZnVuY3Rpb24odCxlLG4pe2NvbnN0IGk9ZVtuXTt2b2lkIDAhPT1pJiZ0aGlzLnNldFZhbHVlKHQsbixpKX0sUTJ0LnVwbG9hZD1mdW5jdGlvbih0LGUsbixpKXtmb3IobGV0IHI9MCxvPWUubGVuZ3RoO3IhPT1vOysrcil7Y29uc3Qgbz1lW3JdLGE9bltvLmlkXTshMSE9PWEubmVlZHNVcGRhdGUmJm8uc2V0VmFsdWUodCxhLnZhbHVlLGkpfX0sUTJ0LnNlcVdpdGhWYWx1ZT1mdW5jdGlvbih0LGUpe2NvbnN0IG49W107Zm9yKGxldCBpPTAscj10Lmxlbmd0aDtpIT09cjsrK2kpe2NvbnN0IHI9dFtpXTtyLmlkIGluIGUmJm4ucHVzaChyKX1yZXR1cm4gbn07bGV0IGU1dD0wO2Z1bmN0aW9uIG41dCh0KXtzd2l0Y2godCl7Y2FzZSBOWnQ6cmV0dXJuWyJMaW5lYXIiLCIoIHZhbHVlICkiXTtjYXNlIEladDpyZXR1cm5bInNSR0IiLCIoIHZhbHVlICkiXTtjYXNlIE9adDpyZXR1cm5bIlJHQkUiLCIoIHZhbHVlICkiXTtjYXNlIHpadDpyZXR1cm5bIlJHQk0iLCIoIHZhbHVlLCA3LjAgKSJdO2Nhc2UgRFp0OnJldHVyblsiUkdCTSIsIiggdmFsdWUsIDE2LjAgKSJdO2Nhc2UgQlp0OnJldHVyblsiUkdCRCIsIiggdmFsdWUsIDI1Ni4wICkiXTtjYXNlIFJadDpyZXR1cm5bIkdhbW1hIiwiKCB2YWx1ZSwgZmxvYXQoIEdBTU1BX0ZBQ1RPUiApICkiXTtjYXNlIDMwMDM6cmV0dXJuWyJMb2dMdXYiLCIoIHZhbHVlICkiXTtkZWZhdWx0OnJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUHJvZ3JhbTogVW5zdXBwb3J0ZWQgZW5jb2Rpbmc6Iix0KSxbIkxpbmVhciIsIiggdmFsdWUgKSJdfX1mdW5jdGlvbiBpNXQodCxlLG4pe2NvbnN0IGk9dC5nZXRTaGFkZXJQYXJhbWV0ZXIoZSwzNTcxMykscj10LmdldFNoYWRlckluZm9Mb2coZSkudHJpbSgpO3JldHVybiBpJiYiIj09PXI/IiI6IlRIUkVFLldlYkdMU2hhZGVyOiBnbC5nZXRTaGFkZXJJbmZvTG9nKCkgIituKyJcbiIrcisoZnVuY3Rpb24gbyh0KXtjb25zdCBlPXQuc3BsaXQoIlxuIik7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XT10KzErIjogIitlW3RdO3JldHVybiBlLmpvaW4oIlxuIil9KSh0LmdldFNoYWRlclNvdXJjZShlKSl9ZnVuY3Rpb24gcjV0KHQsZSl7Y29uc3Qgbj1uNXQoZSk7cmV0dXJuInZlYzQgIit0KyIoIHZlYzQgdmFsdWUgKSB7IHJldHVybiAiK25bMF0rIlRvTGluZWFyIituWzFdKyI7IH0ifWZ1bmN0aW9uIG81dCh0LGUpe2NvbnN0IG49bjV0KGUpO3JldHVybiJ2ZWM0ICIrdCsiKCB2ZWM0IHZhbHVlICkgeyByZXR1cm4gTGluZWFyVG8iK25bMF0rblsxXSsiOyB9In1mdW5jdGlvbiBhNXQodCxlKXtsZXQgbjtzd2l0Y2goZSl7Y2FzZSAxOm49IkxpbmVhciI7YnJlYWs7Y2FzZSAyOm49IlJlaW5oYXJkIjticmVhaztjYXNlIDM6bj0iT3B0aW1pemVkQ2luZW9uIjticmVhaztjYXNlIDQ6bj0iQUNFU0ZpbG1pYyI7YnJlYWs7Y2FzZSA1Om49IkN1c3RvbSI7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUHJvZ3JhbTogVW5zdXBwb3J0ZWQgdG9uZU1hcHBpbmc6IixlKSxuPSJMaW5lYXIifXJldHVybiJ2ZWMzICIrdCsiKCB2ZWMzIGNvbG9yICkgeyByZXR1cm4gIituKyJUb25lTWFwcGluZyggY29sb3IgKTsgfSJ9ZnVuY3Rpb24gczV0KHQpe3JldHVybiIiIT09dH1mdW5jdGlvbiBsNXQodCxlKXtyZXR1cm4gdC5yZXBsYWNlKC9OVU1fRElSX0xJR0hUUy9nLGUubnVtRGlyTGlnaHRzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVFMvZyxlLm51bVNwb3RMaWdodHMpLnJlcGxhY2UoL05VTV9SRUNUX0FSRUFfTElHSFRTL2csZS5udW1SZWN0QXJlYUxpZ2h0cykucmVwbGFjZSgvTlVNX1BPSU5UX0xJR0hUUy9nLGUubnVtUG9pbnRMaWdodHMpLnJlcGxhY2UoL05VTV9IRU1JX0xJR0hUUy9nLGUubnVtSGVtaUxpZ2h0cykucmVwbGFjZSgvTlVNX0RJUl9MSUdIVF9TSEFET1dTL2csZS5udW1EaXJMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUX1NIQURPV1MvZyxlLm51bVNwb3RMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9QT0lOVF9MSUdIVF9TSEFET1dTL2csZS5udW1Qb2ludExpZ2h0U2hhZG93cyl9ZnVuY3Rpb24gYzV0KHQsZSl7cmV0dXJuIHQucmVwbGFjZSgvTlVNX0NMSVBQSU5HX1BMQU5FUy9nLGUubnVtQ2xpcHBpbmdQbGFuZXMpLnJlcGxhY2UoL1VOSU9OX0NMSVBQSU5HX1BMQU5FUy9nLGUubnVtQ2xpcHBpbmdQbGFuZXMtZS5udW1DbGlwSW50ZXJzZWN0aW9uKX1jb25zdCB1NXQ9L15bIFx0XSojaW5jbHVkZSArPChbXHdcZC4vXSspPi9nbTtmdW5jdGlvbiBoNXQodCl7cmV0dXJuIHQucmVwbGFjZSh1NXQsZDV0KX1mdW5jdGlvbiBkNXQodCxlKXtjb25zdCBuPXMwdFtlXTtpZih2b2lkIDA9PT1uKXRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCByZXNvbHZlICNpbmNsdWRlIDwiK2UrIj4iKTtyZXR1cm4gaDV0KG4pfWNvbnN0IHA1dD0vI3ByYWdtYSB1bnJvbGxfbG9vcFtcc10rP2ZvciBcKCBpbnQgaSBcPSAoXGQrKVw7IGkgPCAoXGQrKVw7IGkgXCtcKyBcKSBceyhbXHNcU10rPykoPz1cfSlcfS9nLGY1dD0vI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxzK2ZvclxzKlwoXHMqaW50XHMraVxzKj1ccyooXGQrKVxzKjtccyppXHMqPFxzKihcZCspXHMqO1xzKmlccypcK1wrXHMqXClccyp7KFtcc1xTXSs/KX1ccysjcHJhZ21hIHVucm9sbF9sb29wX2VuZC9nO2Z1bmN0aW9uIG01dCh0KXtyZXR1cm4gdC5yZXBsYWNlKGY1dCxfNXQpLnJlcGxhY2UocDV0LGc1dCl9ZnVuY3Rpb24gZzV0KHQsZSxuLGkpe3JldHVybiBjb25zb2xlLndhcm4oIldlYkdMUHJvZ3JhbTogI3ByYWdtYSB1bnJvbGxfbG9vcCBzaGFkZXIgc3ludGF4IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydCBzeW50YXggaW5zdGVhZC4iKSxfNXQoMCxlLG4saSl9ZnVuY3Rpb24gXzV0KHQsZSxuLGkpe2xldCByPSIiO2ZvcihsZXQgdD1wYXJzZUludChlKTt0PHBhcnNlSW50KG4pO3QrKylyKz1pLnJlcGxhY2UoL1xbXHMqaVxzKlxdL2csIlsgIit0KyIgXSIpLnJlcGxhY2UoL1VOUk9MTEVEX0xPT1BfSU5ERVgvZyx0KTtyZXR1cm4gcn1mdW5jdGlvbiB5NXQodCl7bGV0IGU9InByZWNpc2lvbiAiK3QucHJlY2lzaW9uKyIgZmxvYXQ7XG5wcmVjaXNpb24gIit0LnByZWNpc2lvbisiIGludDsiO3JldHVybiJoaWdocCI9PT10LnByZWNpc2lvbj9lKz0iXG4jZGVmaW5lIEhJR0hfUFJFQ0lTSU9OIjoibWVkaXVtcCI9PT10LnByZWNpc2lvbj9lKz0iXG4jZGVmaW5lIE1FRElVTV9QUkVDSVNJT04iOiJsb3dwIj09PXQucHJlY2lzaW9uJiYoZSs9IlxuI2RlZmluZSBMT1dfUFJFQ0lTSU9OIiksZX1mdW5jdGlvbiB2NXQodCxlLG4saSl7Y29uc3Qgcj10LmdldENvbnRleHQoKSxvPW4uZGVmaW5lcztsZXQgYT1uLnZlcnRleFNoYWRlcixzPW4uZnJhZ21lbnRTaGFkZXI7Y29uc3QgbD0oZnVuY3Rpb24gYyh0KXtsZXQgZT0iU0hBRE9XTUFQX1RZUEVfQkFTSUMiO3JldHVybiAxPT09dC5zaGFkb3dNYXBUeXBlP2U9IlNIQURPV01BUF9UWVBFX1BDRiI6Mj09PXQuc2hhZG93TWFwVHlwZT9lPSJTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCI6Mz09PXQuc2hhZG93TWFwVHlwZSYmKGU9IlNIQURPV01BUF9UWVBFX1ZTTSIpLGV9KShuKSx1PShmdW5jdGlvbiBoKHQpe2xldCBlPSJFTlZNQVBfVFlQRV9DVUJFIjtpZih0LmVudk1hcClzd2l0Y2godC5lbnZNYXBNb2RlKXtjYXNlIGpLdDpjYXNlIEdLdDplPSJFTlZNQVBfVFlQRV9DVUJFIjticmVhaztjYXNlIFlLdDpjYXNlIFhLdDplPSJFTlZNQVBfVFlQRV9DVUJFX1VWIn1yZXR1cm4gZX0pKG4pLGQ9KGZ1bmN0aW9uIHAodCl7bGV0IGU9IkVOVk1BUF9NT0RFX1JFRkxFQ1RJT04iO2lmKHQuZW52TWFwKXN3aXRjaCh0LmVudk1hcE1vZGUpe2Nhc2UgR0t0OmNhc2UgWEt0OmU9IkVOVk1BUF9NT0RFX1JFRlJBQ1RJT04ifXJldHVybiBlfSkobiksZj0oZnVuY3Rpb24gbSh0KXtsZXQgZT0iRU5WTUFQX0JMRU5ESU5HX05PTkUiO2lmKHQuZW52TWFwKXN3aXRjaCh0LmNvbWJpbmUpe2Nhc2UgMDplPSJFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFkiO2JyZWFrO2Nhc2UgMTplPSJFTlZNQVBfQkxFTkRJTkdfTUlYIjticmVhaztjYXNlIDI6ZT0iRU5WTUFQX0JMRU5ESU5HX0FERCJ9cmV0dXJuIGV9KShuKSxnPXQuZ2FtbWFGYWN0b3I+MD90LmdhbW1hRmFjdG9yOjEsXz1uLmlzV2ViR0wyPyIiOihmdW5jdGlvbiB5KHQpe3JldHVyblt0LmV4dGVuc2lvbkRlcml2YXRpdmVzfHx0LmVudk1hcEN1YmVVVnx8dC5idW1wTWFwfHx0LnRhbmdlbnRTcGFjZU5vcm1hbE1hcHx8dC5jbGVhcmNvYXROb3JtYWxNYXB8fHQuZmxhdFNoYWRpbmd8fCJwaHlzaWNhbCI9PT10LnNoYWRlcklEPyIjZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IGVuYWJsZSI6IiIsKHQuZXh0ZW5zaW9uRnJhZ0RlcHRofHx0LmxvZ2FyaXRobWljRGVwdGhCdWZmZXIpJiZ0LnJlbmRlcmVyRXh0ZW5zaW9uRnJhZ0RlcHRoPyIjZXh0ZW5zaW9uIEdMX0VYVF9mcmFnX2RlcHRoIDogZW5hYmxlIjoiIix0LmV4dGVuc2lvbkRyYXdCdWZmZXJzJiZ0LnJlbmRlcmVyRXh0ZW5zaW9uRHJhd0J1ZmZlcnM/IiNleHRlbnNpb24gR0xfRVhUX2RyYXdfYnVmZmVycyA6IHJlcXVpcmUiOiIiLCh0LmV4dGVuc2lvblNoYWRlclRleHR1cmVMT0R8fHQuZW52TWFwfHx0LnRyYW5zbWlzc2lvbj4wKSYmdC5yZW5kZXJlckV4dGVuc2lvblNoYWRlclRleHR1cmVMb2Q/IiNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IGVuYWJsZSI6IiJdLmZpbHRlcihzNXQpLmpvaW4oIlxuIil9KShuKSx2PShmdW5jdGlvbiBiKHQpe2NvbnN0IGU9W107Zm9yKGNvbnN0IG4gaW4gdCl7Y29uc3QgaT10W25dOyExIT09aSYmZS5wdXNoKCIjZGVmaW5lICIrbisiICIraSl9cmV0dXJuIGUuam9pbigiXG4iKX0pKG8pLHg9ci5jcmVhdGVQcm9ncmFtKCk7bGV0IHcsUyxNPW4uZ2xzbFZlcnNpb24/IiN2ZXJzaW9uICIrbi5nbHNsVmVyc2lvbisiXG4iOiIiO24uaXNSYXdTaGFkZXJNYXRlcmlhbD8odz1bdl0uZmlsdGVyKHM1dCkuam9pbigiXG4iKSx3Lmxlbmd0aD4wJiYodys9IlxuIiksUz1bXyx2XS5maWx0ZXIoczV0KS5qb2luKCJcbiIpLFMubGVuZ3RoPjAmJihTKz0iXG4iKSk6KHc9W3k1dChuKSwiI2RlZmluZSBTSEFERVJfTkFNRSAiK24uc2hhZGVyTmFtZSx2LG4uaW5zdGFuY2luZz8iI2RlZmluZSBVU0VfSU5TVEFOQ0lORyI6IiIsbi5pbnN0YW5jaW5nQ29sb3I/IiNkZWZpbmUgVVNFX0lOU1RBTkNJTkdfQ09MT1IiOiIiLG4uc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcz8iI2RlZmluZSBWRVJURVhfVEVYVFVSRVMiOiIiLCIjZGVmaW5lIEdBTU1BX0ZBQ1RPUiAiK2csIiNkZWZpbmUgTUFYX0JPTkVTICIrbi5tYXhCb25lcyxuLnVzZUZvZyYmbi5mb2c/IiNkZWZpbmUgVVNFX0ZPRyI6IiIsbi51c2VGb2cmJm4uZm9nRXhwMj8iI2RlZmluZSBGT0dfRVhQMiI6IiIsbi5tYXA/IiNkZWZpbmUgVVNFX01BUCI6IiIsbi5lbnZNYXA/IiNkZWZpbmUgVVNFX0VOVk1BUCI6IiIsbi5lbnZNYXA/IiNkZWZpbmUgIitkOiIiLG4ubGlnaHRNYXA/IiNkZWZpbmUgVVNFX0xJR0hUTUFQIjoiIixuLmFvTWFwPyIjZGVmaW5lIFVTRV9BT01BUCI6IiIsbi5lbWlzc2l2ZU1hcD8iI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAiOiIiLG4uYnVtcE1hcD8iI2RlZmluZSBVU0VfQlVNUE1BUCI6IiIsbi5ub3JtYWxNYXA/IiNkZWZpbmUgVVNFX05PUk1BTE1BUCI6IiIsbi5ub3JtYWxNYXAmJm4ub2JqZWN0U3BhY2VOb3JtYWxNYXA/IiNkZWZpbmUgT0JKRUNUU1BBQ0VfTk9STUFMTUFQIjoiIixuLm5vcm1hbE1hcCYmbi50YW5nZW50U3BhY2VOb3JtYWxNYXA/IiNkZWZpbmUgVEFOR0VOVFNQQUNFX05PUk1BTE1BUCI6IiIsbi5jbGVhcmNvYXRNYXA/IiNkZWZpbmUgVVNFX0NMRUFSQ09BVE1BUCI6IiIsbi5jbGVhcmNvYXRSb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAiOiIiLG4uY2xlYXJjb2F0Tm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQIjoiIixuLmRpc3BsYWNlbWVudE1hcCYmbi5zdXBwb3J0c1ZlcnRleFRleHR1cmVzPyIjZGVmaW5lIFVTRV9ESVNQTEFDRU1FTlRNQVAiOiIiLG4uc3BlY3VsYXJNYXA/IiNkZWZpbmUgVVNFX1NQRUNVTEFSTUFQIjoiIixuLnNwZWN1bGFySW50ZW5zaXR5TWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUklOVEVOU0lUWU1BUCI6IiIsbi5zcGVjdWxhclRpbnRNYXA/IiNkZWZpbmUgVVNFX1NQRUNVTEFSVElOVE1BUCI6IiIsbi5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6IiIsbi5tZXRhbG5lc3NNYXA/IiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCI6IiIsbi5hbHBoYU1hcD8iI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLG4udHJhbnNtaXNzaW9uPyIjZGVmaW5lIFVTRV9UUkFOU01JU1NJT04iOiIiLG4udHJhbnNtaXNzaW9uTWFwPyIjZGVmaW5lIFVTRV9UUkFOU01JU1NJT05NQVAiOiIiLG4udGhpY2tuZXNzTWFwPyIjZGVmaW5lIFVTRV9USElDS05FU1NNQVAiOiIiLG4udmVydGV4VGFuZ2VudHM/IiNkZWZpbmUgVVNFX1RBTkdFTlQiOiIiLG4udmVydGV4Q29sb3JzPyIjZGVmaW5lIFVTRV9DT0xPUiI6IiIsbi52ZXJ0ZXhBbHBoYXM/IiNkZWZpbmUgVVNFX0NPTE9SX0FMUEhBIjoiIixuLnZlcnRleFV2cz8iI2RlZmluZSBVU0VfVVYiOiIiLG4udXZzVmVydGV4T25seT8iI2RlZmluZSBVVlNfVkVSVEVYX09OTFkiOiIiLG4uZmxhdFNoYWRpbmc/IiNkZWZpbmUgRkxBVF9TSEFERUQiOiIiLG4uc2tpbm5pbmc/IiNkZWZpbmUgVVNFX1NLSU5OSU5HIjoiIixuLnVzZVZlcnRleFRleHR1cmU/IiNkZWZpbmUgQk9ORV9URVhUVVJFIjoiIixuLm1vcnBoVGFyZ2V0cz8iI2RlZmluZSBVU0VfTU9SUEhUQVJHRVRTIjoiIixuLm1vcnBoTm9ybWFscyYmITE9PT1uLmZsYXRTaGFkaW5nPyIjZGVmaW5lIFVTRV9NT1JQSE5PUk1BTFMiOiIiLG4uZG91YmxlU2lkZWQ/IiNkZWZpbmUgRE9VQkxFX1NJREVEIjoiIixuLmZsaXBTaWRlZD8iI2RlZmluZSBGTElQX1NJREVEIjoiIixuLnNoYWRvd01hcEVuYWJsZWQ/IiNkZWZpbmUgVVNFX1NIQURPV01BUCI6IiIsbi5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lICIrbDoiIixuLnNpemVBdHRlbnVhdGlvbj8iI2RlZmluZSBVU0VfU0laRUFUVEVOVUFUSU9OIjoiIixuLmxvZ2FyaXRobWljRGVwdGhCdWZmZXI/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGIjoiIixuLmxvZ2FyaXRobWljRGVwdGhCdWZmZXImJm4ucmVuZGVyZXJFeHRlbnNpb25GcmFnRGVwdGg/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGX0VYVCI6IiIsInVuaWZvcm0gbWF0NCBtb2RlbE1hdHJpeDsiLCJ1bmlmb3JtIG1hdDQgbW9kZWxWaWV3TWF0cml4OyIsInVuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4OyIsInVuaWZvcm0gbWF0NCB2aWV3TWF0cml4OyIsInVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7IiwidW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOyIsInVuaWZvcm0gYm9vbCBpc09ydGhvZ3JhcGhpYzsiLCIjaWZkZWYgVVNFX0lOU1RBTkNJTkciLCJcdGF0dHJpYnV0ZSBtYXQ0IGluc3RhbmNlTWF0cml4OyIsIiNlbmRpZiIsIiNpZmRlZiBVU0VfSU5TVEFOQ0lOR19DT0xPUiIsIlx0YXR0cmlidXRlIHZlYzMgaW5zdGFuY2VDb2xvcjsiLCIjZW5kaWYiLCJhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjsiLCJhdHRyaWJ1dGUgdmVjMyBub3JtYWw7IiwiYXR0cmlidXRlIHZlYzIgdXY7IiwiI2lmZGVmIFVTRV9UQU5HRU5UIiwiXHRhdHRyaWJ1dGUgdmVjNCB0YW5nZW50OyIsIiNlbmRpZiIsIiNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKSIsIlx0YXR0cmlidXRlIHZlYzQgY29sb3I7IiwiI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SICkiLCJcdGF0dHJpYnV0ZSB2ZWMzIGNvbG9yOyIsIiNlbmRpZiIsIiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTIiwiXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDA7IiwiXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDE7IiwiXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDI7IiwiXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDM7IiwiXHQjaWZkZWYgVVNFX01PUlBITk9STUFMUyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDA7IiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMTsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwyOyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDM7IiwiXHQjZWxzZSIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDQ7IiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NTsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ2OyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDc7IiwiXHQjZW5kaWYiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX1NLSU5OSU5HIiwiXHRhdHRyaWJ1dGUgdmVjNCBza2luSW5kZXg7IiwiXHRhdHRyaWJ1dGUgdmVjNCBza2luV2VpZ2h0OyIsIiNlbmRpZiIsIlxuIl0uZmlsdGVyKHM1dCkuam9pbigiXG4iKSxTPVtfLHk1dChuKSwiI2RlZmluZSBTSEFERVJfTkFNRSAiK24uc2hhZGVyTmFtZSx2LG4uYWxwaGFUZXN0PyIjZGVmaW5lIEFMUEhBVEVTVCAiK24uYWxwaGFUZXN0KyhuLmFscGhhVGVzdCUxPyIiOiIuMCIpOiIiLCIjZGVmaW5lIEdBTU1BX0ZBQ1RPUiAiK2csbi51c2VGb2cmJm4uZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLG4udXNlRm9nJiZuLmZvZ0V4cDI/IiNkZWZpbmUgRk9HX0VYUDIiOiIiLG4ubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLG4ubWF0Y2FwPyIjZGVmaW5lIFVTRV9NQVRDQVAiOiIiLG4uZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLG4uZW52TWFwPyIjZGVmaW5lICIrdToiIixuLmVudk1hcD8iI2RlZmluZSAiK2Q6IiIsbi5lbnZNYXA/IiNkZWZpbmUgIitmOiIiLG4ubGlnaHRNYXA/IiNkZWZpbmUgVVNFX0xJR0hUTUFQIjoiIixuLmFvTWFwPyIjZGVmaW5lIFVTRV9BT01BUCI6IiIsbi5lbWlzc2l2ZU1hcD8iI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAiOiIiLG4uYnVtcE1hcD8iI2RlZmluZSBVU0VfQlVNUE1BUCI6IiIsbi5ub3JtYWxNYXA/IiNkZWZpbmUgVVNFX05PUk1BTE1BUCI6IiIsbi5ub3JtYWxNYXAmJm4ub2JqZWN0U3BhY2VOb3JtYWxNYXA/IiNkZWZpbmUgT0JKRUNUU1BBQ0VfTk9STUFMTUFQIjoiIixuLm5vcm1hbE1hcCYmbi50YW5nZW50U3BhY2VOb3JtYWxNYXA/IiNkZWZpbmUgVEFOR0VOVFNQQUNFX05PUk1BTE1BUCI6IiIsbi5jbGVhcmNvYXRNYXA/IiNkZWZpbmUgVVNFX0NMRUFSQ09BVE1BUCI6IiIsbi5jbGVhcmNvYXRSb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAiOiIiLG4uY2xlYXJjb2F0Tm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQIjoiIixuLnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsbi5zcGVjdWxhckludGVuc2l0eU1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJJTlRFTlNJVFlNQVAiOiIiLG4uc3BlY3VsYXJUaW50TWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUlRJTlRNQVAiOiIiLG4ucm91Z2huZXNzTWFwPyIjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAiOiIiLG4ubWV0YWxuZXNzTWFwPyIjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAiOiIiLG4uYWxwaGFNYXA/IiNkZWZpbmUgVVNFX0FMUEhBTUFQIjoiIixuLnNoZWVuPyIjZGVmaW5lIFVTRV9TSEVFTiI6IiIsbi50cmFuc21pc3Npb24/IiNkZWZpbmUgVVNFX1RSQU5TTUlTU0lPTiI6IiIsbi50cmFuc21pc3Npb25NYXA/IiNkZWZpbmUgVVNFX1RSQU5TTUlTU0lPTk1BUCI6IiIsbi50aGlja25lc3NNYXA/IiNkZWZpbmUgVVNFX1RISUNLTkVTU01BUCI6IiIsbi52ZXJ0ZXhUYW5nZW50cz8iI2RlZmluZSBVU0VfVEFOR0VOVCI6IiIsbi52ZXJ0ZXhDb2xvcnN8fG4uaW5zdGFuY2luZ0NvbG9yPyIjZGVmaW5lIFVTRV9DT0xPUiI6IiIsbi52ZXJ0ZXhBbHBoYXM/IiNkZWZpbmUgVVNFX0NPTE9SX0FMUEhBIjoiIixuLnZlcnRleFV2cz8iI2RlZmluZSBVU0VfVVYiOiIiLG4udXZzVmVydGV4T25seT8iI2RlZmluZSBVVlNfVkVSVEVYX09OTFkiOiIiLG4uZ3JhZGllbnRNYXA/IiNkZWZpbmUgVVNFX0dSQURJRU5UTUFQIjoiIixuLmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIixuLmRvdWJsZVNpZGVkPyIjZGVmaW5lIERPVUJMRV9TSURFRCI6IiIsbi5mbGlwU2lkZWQ/IiNkZWZpbmUgRkxJUF9TSURFRCI6IiIsbi5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lIFVTRV9TSEFET1dNQVAiOiIiLG4uc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSAiK2w6IiIsbi5wcmVtdWx0aXBsaWVkQWxwaGE/IiNkZWZpbmUgUFJFTVVMVElQTElFRF9BTFBIQSI6IiIsbi5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cz8iI2RlZmluZSBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTIjoiIixuLmxvZ2FyaXRobWljRGVwdGhCdWZmZXI/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGIjoiIixuLmxvZ2FyaXRobWljRGVwdGhCdWZmZXImJm4ucmVuZGVyZXJFeHRlbnNpb25GcmFnRGVwdGg/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGX0VYVCI6IiIsKG4uZXh0ZW5zaW9uU2hhZGVyVGV4dHVyZUxPRHx8bi5lbnZNYXApJiZuLnJlbmRlcmVyRXh0ZW5zaW9uU2hhZGVyVGV4dHVyZUxvZD8iI2RlZmluZSBURVhUVVJFX0xPRF9FWFQiOiIiLCJ1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsiLCJ1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247IiwidW5pZm9ybSBib29sIGlzT3J0aG9ncmFwaGljOyIsMCE9PW4udG9uZU1hcHBpbmc/IiNkZWZpbmUgVE9ORV9NQVBQSU5HIjoiIiwwIT09bi50b25lTWFwcGluZz9zMHQudG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudDoiIiwwIT09bi50b25lTWFwcGluZz9hNXQoInRvbmVNYXBwaW5nIixuLnRvbmVNYXBwaW5nKToiIixuLmRpdGhlcmluZz8iI2RlZmluZSBESVRIRVJJTkciOiIiLHMwdC5lbmNvZGluZ3NfcGFyc19mcmFnbWVudCxuLm1hcD9yNXQoIm1hcFRleGVsVG9MaW5lYXIiLG4ubWFwRW5jb2RpbmcpOiIiLG4ubWF0Y2FwP3I1dCgibWF0Y2FwVGV4ZWxUb0xpbmVhciIsbi5tYXRjYXBFbmNvZGluZyk6IiIsbi5lbnZNYXA/cjV0KCJlbnZNYXBUZXhlbFRvTGluZWFyIixuLmVudk1hcEVuY29kaW5nKToiIixuLmVtaXNzaXZlTWFwP3I1dCgiZW1pc3NpdmVNYXBUZXhlbFRvTGluZWFyIixuLmVtaXNzaXZlTWFwRW5jb2RpbmcpOiIiLG4uc3BlY3VsYXJUaW50TWFwP3I1dCgic3BlY3VsYXJUaW50TWFwVGV4ZWxUb0xpbmVhciIsbi5zcGVjdWxhclRpbnRNYXBFbmNvZGluZyk6IiIsbi5saWdodE1hcD9yNXQoImxpZ2h0TWFwVGV4ZWxUb0xpbmVhciIsbi5saWdodE1hcEVuY29kaW5nKToiIixvNXQoImxpbmVhclRvT3V0cHV0VGV4ZWwiLG4ub3V0cHV0RW5jb2RpbmcpLG4uZGVwdGhQYWNraW5nPyIjZGVmaW5lIERFUFRIX1BBQ0tJTkcgIituLmRlcHRoUGFja2luZzoiIiwiXG4iXS5maWx0ZXIoczV0KS5qb2luKCJcbiIpKSxhPWg1dChhKSxhPWw1dChhLG4pLGE9YzV0KGEsbikscz1oNXQocykscz1sNXQocyxuKSxzPWM1dChzLG4pLGE9bTV0KGEpLHM9bTV0KHMpLG4uaXNXZWJHTDImJiEwIT09bi5pc1Jhd1NoYWRlck1hdGVyaWFsJiYoTT0iI3ZlcnNpb24gMzAwIGVzXG4iLHc9WyIjZGVmaW5lIGF0dHJpYnV0ZSBpbiIsIiNkZWZpbmUgdmFyeWluZyBvdXQiLCIjZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlIl0uam9pbigiXG4iKSsiXG4iK3csUz1bIiNkZWZpbmUgdmFyeWluZyBpbiIsbi5nbHNsVmVyc2lvbj09PVVadD8iIjoib3V0IGhpZ2hwIHZlYzQgcGNfZnJhZ0NvbG9yOyIsbi5nbHNsVmVyc2lvbj09PVVadD8iIjoiI2RlZmluZSBnbF9GcmFnQ29sb3IgcGNfZnJhZ0NvbG9yIiwiI2RlZmluZSBnbF9GcmFnRGVwdGhFWFQgZ2xfRnJhZ0RlcHRoIiwiI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZSIsIiNkZWZpbmUgdGV4dHVyZUN1YmUgdGV4dHVyZSIsIiNkZWZpbmUgdGV4dHVyZTJEUHJvaiB0ZXh0dXJlUHJvaiIsIiNkZWZpbmUgdGV4dHVyZTJETG9kRVhUIHRleHR1cmVMb2QiLCIjZGVmaW5lIHRleHR1cmUyRFByb2pMb2RFWFQgdGV4dHVyZVByb2pMb2QiLCIjZGVmaW5lIHRleHR1cmVDdWJlTG9kRVhUIHRleHR1cmVMb2QiLCIjZGVmaW5lIHRleHR1cmUyREdyYWRFWFQgdGV4dHVyZUdyYWQiLCIjZGVmaW5lIHRleHR1cmUyRFByb2pHcmFkRVhUIHRleHR1cmVQcm9qR3JhZCIsIiNkZWZpbmUgdGV4dHVyZUN1YmVHcmFkRVhUIHRleHR1cmVHcmFkIl0uam9pbigiXG4iKSsiXG4iK1MpO2NvbnN0IEU9TStTK3MsVD10NXQociwzNTYzMyxNK3crYSksQz10NXQociwzNTYzMixFKTtpZihyLmF0dGFjaFNoYWRlcih4LFQpLHIuYXR0YWNoU2hhZGVyKHgsQyksdm9pZCAwIT09bi5pbmRleDBBdHRyaWJ1dGVOYW1lP3IuYmluZEF0dHJpYkxvY2F0aW9uKHgsMCxuLmluZGV4MEF0dHJpYnV0ZU5hbWUpOiEwPT09bi5tb3JwaFRhcmdldHMmJnIuYmluZEF0dHJpYkxvY2F0aW9uKHgsMCwicG9zaXRpb24iKSxyLmxpbmtQcm9ncmFtKHgpLHQuZGVidWcuY2hlY2tTaGFkZXJFcnJvcnMpe2NvbnN0IHQ9ci5nZXRQcm9ncmFtSW5mb0xvZyh4KS50cmltKCksZT1yLmdldFNoYWRlckluZm9Mb2coVCkudHJpbSgpLG49ci5nZXRTaGFkZXJJbmZvTG9nKEMpLnRyaW0oKTtsZXQgaT0hMCxvPSEwO2lmKCExPT09ci5nZXRQcm9ncmFtUGFyYW1ldGVyKHgsMzU3MTQpKXtpPSExO2NvbnN0IGU9aTV0KHIsVCwidmVydGV4Iiksbj1pNXQocixDLCJmcmFnbWVudCIpO2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUHJvZ3JhbTogc2hhZGVyIGVycm9yOiAiLHIuZ2V0RXJyb3IoKSwiMzU3MTUiLHIuZ2V0UHJvZ3JhbVBhcmFtZXRlcih4LDM1NzE1KSwiZ2wuZ2V0UHJvZ3JhbUluZm9Mb2ciLHQsZSxuKX1lbHNlIiIhPT10P2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtOiBnbC5nZXRQcm9ncmFtSW5mb0xvZygpIix0KToiIiE9PWUmJiIiIT09bnx8KG89ITEpO28mJih0aGlzLmRpYWdub3N0aWNzPXtydW5uYWJsZTppLHByb2dyYW1Mb2c6dCx2ZXJ0ZXhTaGFkZXI6e2xvZzplLHByZWZpeDp3fSxmcmFnbWVudFNoYWRlcjp7bG9nOm4scHJlZml4OlN9fSl9bGV0IEEsaztyZXR1cm4gci5kZWxldGVTaGFkZXIoVCksci5kZWxldGVTaGFkZXIoQyksdGhpcy5nZXRVbmlmb3Jtcz1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1BJiYoQT1uZXcgUTJ0KHIseCkpLEF9LHRoaXMuZ2V0QXR0cmlidXRlcz1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1rJiYoaz0oZnVuY3Rpb24gdChlLG4pe2NvbnN0IGk9e30scj1lLmdldFByb2dyYW1QYXJhbWV0ZXIobiwzNTcyMSk7Zm9yKGxldCB0PTA7dDxyO3QrKyl7Y29uc3Qgcj1lLmdldEFjdGl2ZUF0dHJpYihuLHQpLm5hbWU7aVtyXT1lLmdldEF0dHJpYkxvY2F0aW9uKG4scil9cmV0dXJuIGl9KShyLHgpKSxrfSx0aGlzLmRlc3Ryb3k9ZnVuY3Rpb24oKXtpLnJlbGVhc2VTdGF0ZXNPZlByb2dyYW0odGhpcyksci5kZWxldGVQcm9ncmFtKHgpLHRoaXMucHJvZ3JhbT12b2lkIDB9LHRoaXMubmFtZT1uLnNoYWRlck5hbWUsdGhpcy5pZD1lNXQrKyx0aGlzLmNhY2hlS2V5PWUsdGhpcy51c2VkVGltZXM9MSx0aGlzLnByb2dyYW09eCx0aGlzLnZlcnRleFNoYWRlcj1ULHRoaXMuZnJhZ21lbnRTaGFkZXI9Qyx0aGlzfWZ1bmN0aW9uIGI1dCh0LGUsbixpLHIsbyxhKXtjb25zdCBzPVtdLGw9ci5pc1dlYkdMMixjPXIubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcix1PXIuZmxvYXRWZXJ0ZXhUZXh0dXJlcyxoPXIubWF4VmVydGV4VW5pZm9ybXMsZD1yLnZlcnRleFRleHR1cmVzO2xldCBwPXIucHJlY2lzaW9uO2NvbnN0IGY9e01lc2hEZXB0aE1hdGVyaWFsOiJkZXB0aCIsTWVzaERpc3RhbmNlTWF0ZXJpYWw6ImRpc3RhbmNlUkdCQSIsTWVzaE5vcm1hbE1hdGVyaWFsOiJub3JtYWwiLE1lc2hCYXNpY01hdGVyaWFsOiJiYXNpYyIsTWVzaExhbWJlcnRNYXRlcmlhbDoibGFtYmVydCIsTWVzaFBob25nTWF0ZXJpYWw6InBob25nIixNZXNoVG9vbk1hdGVyaWFsOiJ0b29uIixNZXNoU3RhbmRhcmRNYXRlcmlhbDoicGh5c2ljYWwiLE1lc2hQaHlzaWNhbE1hdGVyaWFsOiJwaHlzaWNhbCIsTWVzaE1hdGNhcE1hdGVyaWFsOiJtYXRjYXAiLExpbmVCYXNpY01hdGVyaWFsOiJiYXNpYyIsTGluZURhc2hlZE1hdGVyaWFsOiJkYXNoZWQiLFBvaW50c01hdGVyaWFsOiJwb2ludHMiLFNoYWRvd01hdGVyaWFsOiJzaGFkb3ciLFNwcml0ZU1hdGVyaWFsOiJzcHJpdGUifSxtPVsicHJlY2lzaW9uIiwiaXNXZWJHTDIiLCJzdXBwb3J0c1ZlcnRleFRleHR1cmVzIiwib3V0cHV0RW5jb2RpbmciLCJpbnN0YW5jaW5nIiwiaW5zdGFuY2luZ0NvbG9yIiwibWFwIiwibWFwRW5jb2RpbmciLCJtYXRjYXAiLCJtYXRjYXBFbmNvZGluZyIsImVudk1hcCIsImVudk1hcE1vZGUiLCJlbnZNYXBFbmNvZGluZyIsImVudk1hcEN1YmVVViIsImxpZ2h0TWFwIiwibGlnaHRNYXBFbmNvZGluZyIsImFvTWFwIiwiZW1pc3NpdmVNYXAiLCJlbWlzc2l2ZU1hcEVuY29kaW5nIiwiYnVtcE1hcCIsIm5vcm1hbE1hcCIsIm9iamVjdFNwYWNlTm9ybWFsTWFwIiwidGFuZ2VudFNwYWNlTm9ybWFsTWFwIiwiY2xlYXJjb2F0TWFwIiwiY2xlYXJjb2F0Um91Z2huZXNzTWFwIiwiY2xlYXJjb2F0Tm9ybWFsTWFwIiwiZGlzcGxhY2VtZW50TWFwIiwic3BlY3VsYXJNYXAiLCJzcGVjdWxhckludGVuc2l0eU1hcCIsInNwZWN1bGFyVGludE1hcCIsInNwZWN1bGFyVGludE1hcEVuY29kaW5nIiwicm91Z2huZXNzTWFwIiwibWV0YWxuZXNzTWFwIiwiZ3JhZGllbnRNYXAiLCJhbHBoYU1hcCIsImNvbWJpbmUiLCJ2ZXJ0ZXhDb2xvcnMiLCJ2ZXJ0ZXhBbHBoYXMiLCJ2ZXJ0ZXhUYW5nZW50cyIsInZlcnRleFV2cyIsInV2c1ZlcnRleE9ubHkiLCJmb2ciLCJ1c2VGb2ciLCJmb2dFeHAyIiwiZmxhdFNoYWRpbmciLCJzaXplQXR0ZW51YXRpb24iLCJsb2dhcml0aG1pY0RlcHRoQnVmZmVyIiwic2tpbm5pbmciLCJtYXhCb25lcyIsInVzZVZlcnRleFRleHR1cmUiLCJtb3JwaFRhcmdldHMiLCJtb3JwaE5vcm1hbHMiLCJwcmVtdWx0aXBsaWVkQWxwaGEiLCJudW1EaXJMaWdodHMiLCJudW1Qb2ludExpZ2h0cyIsIm51bVNwb3RMaWdodHMiLCJudW1IZW1pTGlnaHRzIiwibnVtUmVjdEFyZWFMaWdodHMiLCJudW1EaXJMaWdodFNoYWRvd3MiLCJudW1Qb2ludExpZ2h0U2hhZG93cyIsIm51bVNwb3RMaWdodFNoYWRvd3MiLCJzaGFkb3dNYXBFbmFibGVkIiwic2hhZG93TWFwVHlwZSIsInRvbmVNYXBwaW5nIiwicGh5c2ljYWxseUNvcnJlY3RMaWdodHMiLCJhbHBoYVRlc3QiLCJkb3VibGVTaWRlZCIsImZsaXBTaWRlZCIsIm51bUNsaXBwaW5nUGxhbmVzIiwibnVtQ2xpcEludGVyc2VjdGlvbiIsImRlcHRoUGFja2luZyIsImRpdGhlcmluZyIsInNoZWVuIiwidHJhbnNtaXNzaW9uIiwidHJhbnNtaXNzaW9uTWFwIiwidGhpY2tuZXNzTWFwIl07ZnVuY3Rpb24gZyh0KXtsZXQgZTtyZXR1cm4gdCYmdC5pc1RleHR1cmU/ZT10LmVuY29kaW5nOnQmJnQuaXNXZWJHTFJlbmRlclRhcmdldD8oY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW1zLmdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXA6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksZT10LnRleHR1cmUuZW5jb2RpbmcpOmU9Tlp0LGV9cmV0dXJue2dldFBhcmFtZXRlcnM6ZnVuY3Rpb24gXyhvLHMsbSx5LHYpe2NvbnN0IGI9eS5mb2cseD0oby5pc01lc2hTdGFuZGFyZE1hdGVyaWFsP246ZSkuZ2V0KG8uZW52TWFwfHwoby5pc01lc2hTdGFuZGFyZE1hdGVyaWFsP3kuZW52aXJvbm1lbnQ6bnVsbCkpLHc9ZltvLnR5cGVdLFM9di5pc1NraW5uZWRNZXNoPyhmdW5jdGlvbiBNKHQpe2NvbnN0IGU9dC5za2VsZXRvbi5ib25lcztpZih1KXJldHVybiAxMDI0O3tjb25zdCB0PU1hdGguZmxvb3IoKGgtMjApLzQpLG49TWF0aC5taW4odCxlLmxlbmd0aCk7cmV0dXJuIG48ZS5sZW5ndGg/KGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogU2tlbGV0b24gaGFzICIrZS5sZW5ndGgrIiBib25lcy4gVGhpcyBHUFUgc3VwcG9ydHMgIituKyIuIiksMCk6bn19KSh2KTowO2xldCBFLFQ7aWYobnVsbCE9PW8ucHJlY2lzaW9uJiYocD1yLmdldE1heFByZWNpc2lvbihvLnByZWNpc2lvbikscCE9PW8ucHJlY2lzaW9uJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUHJvZ3JhbS5nZXRQYXJhbWV0ZXJzOiIsby5wcmVjaXNpb24sIm5vdCBzdXBwb3J0ZWQsIHVzaW5nIixwLCJpbnN0ZWFkLiIpKSx3KXtjb25zdCB0PWMwdFt3XTtFPXQudmVydGV4U2hhZGVyLFQ9dC5mcmFnbWVudFNoYWRlcn1lbHNlIEU9by52ZXJ0ZXhTaGFkZXIsVD1vLmZyYWdtZW50U2hhZGVyO2NvbnN0IEM9dC5nZXRSZW5kZXJUYXJnZXQoKTtyZXR1cm57aXNXZWJHTDI6bCxzaGFkZXJJRDp3LHNoYWRlck5hbWU6by50eXBlLHZlcnRleFNoYWRlcjpFLGZyYWdtZW50U2hhZGVyOlQsZGVmaW5lczpvLmRlZmluZXMsaXNSYXdTaGFkZXJNYXRlcmlhbDohMD09PW8uaXNSYXdTaGFkZXJNYXRlcmlhbCxnbHNsVmVyc2lvbjpvLmdsc2xWZXJzaW9uLHByZWNpc2lvbjpwLGluc3RhbmNpbmc6ITA9PT12LmlzSW5zdGFuY2VkTWVzaCxpbnN0YW5jaW5nQ29sb3I6ITA9PT12LmlzSW5zdGFuY2VkTWVzaCYmbnVsbCE9PXYuaW5zdGFuY2VDb2xvcixzdXBwb3J0c1ZlcnRleFRleHR1cmVzOmQsb3V0cHV0RW5jb2Rpbmc6bnVsbCE9PUM/ZyhDLnRleHR1cmUpOnQub3V0cHV0RW5jb2RpbmcsbWFwOiEhby5tYXAsbWFwRW5jb2Rpbmc6ZyhvLm1hcCksbWF0Y2FwOiEhby5tYXRjYXAsbWF0Y2FwRW5jb2Rpbmc6ZyhvLm1hdGNhcCksZW52TWFwOiEheCxlbnZNYXBNb2RlOngmJngubWFwcGluZyxlbnZNYXBFbmNvZGluZzpnKHgpLGVudk1hcEN1YmVVVjohIXgmJih4Lm1hcHBpbmc9PT1ZS3R8fHgubWFwcGluZz09PVhLdCksbGlnaHRNYXA6ISFvLmxpZ2h0TWFwLGxpZ2h0TWFwRW5jb2Rpbmc6ZyhvLmxpZ2h0TWFwKSxhb01hcDohIW8uYW9NYXAsZW1pc3NpdmVNYXA6ISFvLmVtaXNzaXZlTWFwLGVtaXNzaXZlTWFwRW5jb2Rpbmc6ZyhvLmVtaXNzaXZlTWFwKSxidW1wTWFwOiEhby5idW1wTWFwLG5vcm1hbE1hcDohIW8ubm9ybWFsTWFwLG9iamVjdFNwYWNlTm9ybWFsTWFwOjE9PT1vLm5vcm1hbE1hcFR5cGUsdGFuZ2VudFNwYWNlTm9ybWFsTWFwOjA9PT1vLm5vcm1hbE1hcFR5cGUsY2xlYXJjb2F0TWFwOiEhby5jbGVhcmNvYXRNYXAsY2xlYXJjb2F0Um91Z2huZXNzTWFwOiEhby5jbGVhcmNvYXRSb3VnaG5lc3NNYXAsY2xlYXJjb2F0Tm9ybWFsTWFwOiEhby5jbGVhcmNvYXROb3JtYWxNYXAsZGlzcGxhY2VtZW50TWFwOiEhby5kaXNwbGFjZW1lbnRNYXAscm91Z2huZXNzTWFwOiEhby5yb3VnaG5lc3NNYXAsbWV0YWxuZXNzTWFwOiEhby5tZXRhbG5lc3NNYXAsc3BlY3VsYXJNYXA6ISFvLnNwZWN1bGFyTWFwLHNwZWN1bGFySW50ZW5zaXR5TWFwOiEhby5zcGVjdWxhckludGVuc2l0eU1hcCxzcGVjdWxhclRpbnRNYXA6ISFvLnNwZWN1bGFyVGludE1hcCxzcGVjdWxhclRpbnRNYXBFbmNvZGluZzpnKG8uc3BlY3VsYXJUaW50TWFwKSxhbHBoYU1hcDohIW8uYWxwaGFNYXAsZ3JhZGllbnRNYXA6ISFvLmdyYWRpZW50TWFwLHNoZWVuOiEhby5zaGVlbix0cmFuc21pc3Npb246ISFvLnRyYW5zbWlzc2lvbix0cmFuc21pc3Npb25NYXA6ISFvLnRyYW5zbWlzc2lvbk1hcCx0aGlja25lc3NNYXA6ISFvLnRoaWNrbmVzc01hcCxjb21iaW5lOm8uY29tYmluZSx2ZXJ0ZXhUYW5nZW50czohIW8ubm9ybWFsTWFwJiYhIXYuZ2VvbWV0cnkmJiEhdi5nZW9tZXRyeS5hdHRyaWJ1dGVzLnRhbmdlbnQsdmVydGV4Q29sb3JzOm8udmVydGV4Q29sb3JzLHZlcnRleEFscGhhczohMD09PW8udmVydGV4Q29sb3JzJiYhIXYuZ2VvbWV0cnkmJiEhdi5nZW9tZXRyeS5hdHRyaWJ1dGVzLmNvbG9yJiY0PT09di5nZW9tZXRyeS5hdHRyaWJ1dGVzLmNvbG9yLml0ZW1TaXplLHZlcnRleFV2czohIShvLm1hcHx8by5idW1wTWFwfHxvLm5vcm1hbE1hcHx8by5zcGVjdWxhck1hcHx8by5hbHBoYU1hcHx8by5lbWlzc2l2ZU1hcHx8by5yb3VnaG5lc3NNYXB8fG8ubWV0YWxuZXNzTWFwfHxvLmNsZWFyY29hdE1hcHx8by5jbGVhcmNvYXRSb3VnaG5lc3NNYXB8fG8uY2xlYXJjb2F0Tm9ybWFsTWFwfHxvLmRpc3BsYWNlbWVudE1hcHx8by50cmFuc21pc3Npb25NYXB8fG8udGhpY2tuZXNzTWFwfHxvLnNwZWN1bGFySW50ZW5zaXR5TWFwfHxvLnNwZWN1bGFyVGludE1hcCksdXZzVmVydGV4T25seTohKG8ubWFwfHxvLmJ1bXBNYXB8fG8ubm9ybWFsTWFwfHxvLnNwZWN1bGFyTWFwfHxvLmFscGhhTWFwfHxvLmVtaXNzaXZlTWFwfHxvLnJvdWdobmVzc01hcHx8by5tZXRhbG5lc3NNYXB8fG8uY2xlYXJjb2F0Tm9ybWFsTWFwfHxvLnRyYW5zbWlzc2lvbnx8by50cmFuc21pc3Npb25NYXB8fG8udGhpY2tuZXNzTWFwfHxvLnNwZWN1bGFySW50ZW5zaXR5TWFwfHxvLnNwZWN1bGFyVGludE1hcHx8IW8uZGlzcGxhY2VtZW50TWFwKSxmb2c6ISFiLHVzZUZvZzpvLmZvZyxmb2dFeHAyOmImJmIuaXNGb2dFeHAyLGZsYXRTaGFkaW5nOiEhby5mbGF0U2hhZGluZyxzaXplQXR0ZW51YXRpb246by5zaXplQXR0ZW51YXRpb24sbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjpjLHNraW5uaW5nOiEwPT09di5pc1NraW5uZWRNZXNoJiZTPjAsbWF4Qm9uZXM6Uyx1c2VWZXJ0ZXhUZXh0dXJlOnUsbW9ycGhUYXJnZXRzOiEhdi5nZW9tZXRyeSYmISF2Lmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixtb3JwaE5vcm1hbHM6ISF2Lmdlb21ldHJ5JiYhIXYuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCxudW1EaXJMaWdodHM6cy5kaXJlY3Rpb25hbC5sZW5ndGgsbnVtUG9pbnRMaWdodHM6cy5wb2ludC5sZW5ndGgsbnVtU3BvdExpZ2h0czpzLnNwb3QubGVuZ3RoLG51bVJlY3RBcmVhTGlnaHRzOnMucmVjdEFyZWEubGVuZ3RoLG51bUhlbWlMaWdodHM6cy5oZW1pLmxlbmd0aCxudW1EaXJMaWdodFNoYWRvd3M6cy5kaXJlY3Rpb25hbFNoYWRvd01hcC5sZW5ndGgsbnVtUG9pbnRMaWdodFNoYWRvd3M6cy5wb2ludFNoYWRvd01hcC5sZW5ndGgsbnVtU3BvdExpZ2h0U2hhZG93czpzLnNwb3RTaGFkb3dNYXAubGVuZ3RoLG51bUNsaXBwaW5nUGxhbmVzOmEubnVtUGxhbmVzLG51bUNsaXBJbnRlcnNlY3Rpb246YS5udW1JbnRlcnNlY3Rpb24sZGl0aGVyaW5nOm8uZGl0aGVyaW5nLHNoYWRvd01hcEVuYWJsZWQ6dC5zaGFkb3dNYXAuZW5hYmxlZCYmbS5sZW5ndGg+MCxzaGFkb3dNYXBUeXBlOnQuc2hhZG93TWFwLnR5cGUsdG9uZU1hcHBpbmc6by50b25lTWFwcGVkP3QudG9uZU1hcHBpbmc6MCxwaHlzaWNhbGx5Q29ycmVjdExpZ2h0czp0LnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzLHByZW11bHRpcGxpZWRBbHBoYTpvLnByZW11bHRpcGxpZWRBbHBoYSxhbHBoYVRlc3Q6by5hbHBoYVRlc3QsZG91YmxlU2lkZWQ6Mj09PW8uc2lkZSxmbGlwU2lkZWQ6MT09PW8uc2lkZSxkZXB0aFBhY2tpbmc6dm9pZCAwIT09by5kZXB0aFBhY2tpbmcmJm8uZGVwdGhQYWNraW5nLGluZGV4MEF0dHJpYnV0ZU5hbWU6by5pbmRleDBBdHRyaWJ1dGVOYW1lLGV4dGVuc2lvbkRlcml2YXRpdmVzOm8uZXh0ZW5zaW9ucyYmby5leHRlbnNpb25zLmRlcml2YXRpdmVzLGV4dGVuc2lvbkZyYWdEZXB0aDpvLmV4dGVuc2lvbnMmJm8uZXh0ZW5zaW9ucy5mcmFnRGVwdGgsZXh0ZW5zaW9uRHJhd0J1ZmZlcnM6by5leHRlbnNpb25zJiZvLmV4dGVuc2lvbnMuZHJhd0J1ZmZlcnMsZXh0ZW5zaW9uU2hhZGVyVGV4dHVyZUxPRDpvLmV4dGVuc2lvbnMmJm8uZXh0ZW5zaW9ucy5zaGFkZXJUZXh0dXJlTE9ELHJlbmRlcmVyRXh0ZW5zaW9uRnJhZ0RlcHRoOmx8fGkuaGFzKCJFWFRfZnJhZ19kZXB0aCIpLHJlbmRlcmVyRXh0ZW5zaW9uRHJhd0J1ZmZlcnM6bHx8aS5oYXMoIldFQkdMX2RyYXdfYnVmZmVycyIpLHJlbmRlcmVyRXh0ZW5zaW9uU2hhZGVyVGV4dHVyZUxvZDpsfHxpLmhhcygiRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCIpLGN1c3RvbVByb2dyYW1DYWNoZUtleTpvLmN1c3RvbVByb2dyYW1DYWNoZUtleSgpfX0sZ2V0UHJvZ3JhbUNhY2hlS2V5OmZ1bmN0aW9uIHkoZSl7Y29uc3Qgbj1bXTtpZihlLnNoYWRlcklEP24ucHVzaChlLnNoYWRlcklEKToobi5wdXNoKGUuZnJhZ21lbnRTaGFkZXIpLG4ucHVzaChlLnZlcnRleFNoYWRlcikpLHZvaWQgMCE9PWUuZGVmaW5lcylmb3IoY29uc3QgdCBpbiBlLmRlZmluZXMpbi5wdXNoKHQpLG4ucHVzaChlLmRlZmluZXNbdF0pO2lmKCExPT09ZS5pc1Jhd1NoYWRlck1hdGVyaWFsKXtmb3IobGV0IHQ9MDt0PG0ubGVuZ3RoO3QrKyluLnB1c2goZVttW3RdXSk7bi5wdXNoKHQub3V0cHV0RW5jb2RpbmcpLG4ucHVzaCh0LmdhbW1hRmFjdG9yKX1yZXR1cm4gbi5wdXNoKGUuY3VzdG9tUHJvZ3JhbUNhY2hlS2V5KSxuLmpvaW4oKX0sZ2V0VW5pZm9ybXM6ZnVuY3Rpb24gdih0KXtjb25zdCBlPWZbdC50eXBlXTtsZXQgbjtyZXR1cm4gbj1lP2oxdC5jbG9uZShjMHRbZV0udW5pZm9ybXMpOnQudW5pZm9ybXMsbn0sYWNxdWlyZVByb2dyYW06ZnVuY3Rpb24gYihlLG4pe2xldCBpO2ZvcihsZXQgdD0wLGU9cy5sZW5ndGg7dDxlO3QrKyl7Y29uc3QgZT1zW3RdO2lmKGUuY2FjaGVLZXk9PT1uKXtpPWUsKytpLnVzZWRUaW1lczticmVha319cmV0dXJuIHZvaWQgMD09PWkmJihpPW5ldyB2NXQodCxuLGUsbykscy5wdXNoKGkpKSxpfSxyZWxlYXNlUHJvZ3JhbTpmdW5jdGlvbiB4KHQpe2lmKDA9PS0tdC51c2VkVGltZXMpe2NvbnN0IGU9cy5pbmRleE9mKHQpO3NbZV09c1tzLmxlbmd0aC0xXSxzLnBvcCgpLHQuZGVzdHJveSgpfX0scHJvZ3JhbXM6c319ZnVuY3Rpb24geDV0KCl7bGV0IHQ9bmV3IFdlYWtNYXA7cmV0dXJue2dldDpmdW5jdGlvbiBlKG4pe2xldCBpPXQuZ2V0KG4pO3JldHVybiB2b2lkIDA9PT1pJiYoaT17fSx0LnNldChuLGkpKSxpfSxyZW1vdmU6ZnVuY3Rpb24gbihlKXt0LmRlbGV0ZShlKX0sdXBkYXRlOmZ1bmN0aW9uIGkoZSxuLHIpe3QuZ2V0KGUpW25dPXJ9LGRpc3Bvc2U6ZnVuY3Rpb24gcigpe3Q9bmV3IFdlYWtNYXB9fX1mdW5jdGlvbiB3NXQodCxlKXtyZXR1cm4gdC5ncm91cE9yZGVyIT09ZS5ncm91cE9yZGVyP3QuZ3JvdXBPcmRlci1lLmdyb3VwT3JkZXI6dC5yZW5kZXJPcmRlciE9PWUucmVuZGVyT3JkZXI/dC5yZW5kZXJPcmRlci1lLnJlbmRlck9yZGVyOnQucHJvZ3JhbSE9PWUucHJvZ3JhbT90LnByb2dyYW0uaWQtZS5wcm9ncmFtLmlkOnQubWF0ZXJpYWwuaWQhPT1lLm1hdGVyaWFsLmlkP3QubWF0ZXJpYWwuaWQtZS5tYXRlcmlhbC5pZDp0LnohPT1lLno/dC56LWUuejp0LmlkLWUuaWR9ZnVuY3Rpb24gUzV0KHQsZSl7cmV0dXJuIHQuZ3JvdXBPcmRlciE9PWUuZ3JvdXBPcmRlcj90Lmdyb3VwT3JkZXItZS5ncm91cE9yZGVyOnQucmVuZGVyT3JkZXIhPT1lLnJlbmRlck9yZGVyP3QucmVuZGVyT3JkZXItZS5yZW5kZXJPcmRlcjp0LnohPT1lLno/ZS56LXQuejp0LmlkLWUuaWR9ZnVuY3Rpb24gTTV0KHQpe2NvbnN0IGU9W107bGV0IG49MDtjb25zdCBpPVtdLHI9W10sbz1bXSxhPXtpZDotMX07ZnVuY3Rpb24gcyhpLHIsbyxzLGwsYyl7bGV0IHU9ZVtuXTtjb25zdCBoPXQuZ2V0KG8pO3JldHVybiB2b2lkIDA9PT11Pyh1PXtpZDppLmlkLG9iamVjdDppLGdlb21ldHJ5OnIsbWF0ZXJpYWw6byxwcm9ncmFtOmgucHJvZ3JhbXx8YSxncm91cE9yZGVyOnMscmVuZGVyT3JkZXI6aS5yZW5kZXJPcmRlcix6OmwsZ3JvdXA6Y30sZVtuXT11KToodS5pZD1pLmlkLHUub2JqZWN0PWksdS5nZW9tZXRyeT1yLHUubWF0ZXJpYWw9byx1LnByb2dyYW09aC5wcm9ncmFtfHxhLHUuZ3JvdXBPcmRlcj1zLHUucmVuZGVyT3JkZXI9aS5yZW5kZXJPcmRlcix1Lno9bCx1Lmdyb3VwPWMpLG4rKyx1fXJldHVybntvcGFxdWU6aSx0cmFuc21pc3NpdmU6cix0cmFuc3BhcmVudDpvLGluaXQ6ZnVuY3Rpb24gbCgpe249MCxpLmxlbmd0aD0wLHIubGVuZ3RoPTAsby5sZW5ndGg9MH0scHVzaDpmdW5jdGlvbiBjKHQsZSxuLGEsbCx1KXtjb25zdCBoPXModCxlLG4sYSxsLHUpO24udHJhbnNtaXNzaW9uPjA/ci5wdXNoKGgpOiEwPT09bi50cmFuc3BhcmVudD9vLnB1c2goaCk6aS5wdXNoKGgpfSx1bnNoaWZ0OmZ1bmN0aW9uIHUodCxlLG4sYSxsLGMpe2NvbnN0IHU9cyh0LGUsbixhLGwsYyk7bi50cmFuc21pc3Npb24+MD9yLnVuc2hpZnQodSk6ITA9PT1uLnRyYW5zcGFyZW50P28udW5zaGlmdCh1KTppLnVuc2hpZnQodSl9LGZpbmlzaDpmdW5jdGlvbiBoKCl7Zm9yKGxldCB0PW4saT1lLmxlbmd0aDt0PGk7dCsrKXtjb25zdCBuPWVbdF07aWYobnVsbD09PW4uaWQpYnJlYWs7bi5pZD1udWxsLG4ub2JqZWN0PW51bGwsbi5nZW9tZXRyeT1udWxsLG4ubWF0ZXJpYWw9bnVsbCxuLnByb2dyYW09bnVsbCxuLmdyb3VwPW51bGx9fSxzb3J0OmZ1bmN0aW9uIGQodCxlKXtpLmxlbmd0aD4xJiZpLnNvcnQodHx8dzV0KSxyLmxlbmd0aD4xJiZyLnNvcnQoZXx8UzV0KSxvLmxlbmd0aD4xJiZvLnNvcnQoZXx8UzV0KX19fWZ1bmN0aW9uIEU1dCh0KXtsZXQgZT1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uIG4oaSxyKXtsZXQgbztyZXR1cm4hMT09PWUuaGFzKGkpPyhvPW5ldyBNNXQodCksZS5zZXQoaSxbb10pKTpyPj1lLmdldChpKS5sZW5ndGg/KG89bmV3IE01dCh0KSxlLmdldChpKS5wdXNoKG8pKTpvPWUuZ2V0KGkpW3JdLG99LGRpc3Bvc2U6ZnVuY3Rpb24gaSgpe2U9bmV3IFdlYWtNYXB9fX1mdW5jdGlvbiBUNXQoKXtjb25zdCB0PXt9O3JldHVybntnZXQ6ZnVuY3Rpb24oZSl7aWYodm9pZCAwIT09dFtlLmlkXSlyZXR1cm4gdFtlLmlkXTtsZXQgbjtzd2l0Y2goZS50eXBlKXtjYXNlIkRpcmVjdGlvbmFsTGlnaHQiOm49e2RpcmVjdGlvbjpuZXcgQ0p0LGNvbG9yOm5ldyAkUXR9O2JyZWFrO2Nhc2UiU3BvdExpZ2h0IjpuPXtwb3NpdGlvbjpuZXcgQ0p0LGRpcmVjdGlvbjpuZXcgQ0p0LGNvbG9yOm5ldyAkUXQsZGlzdGFuY2U6MCxjb25lQ29zOjAscGVudW1icmFDb3M6MCxkZWNheTowfTticmVhaztjYXNlIlBvaW50TGlnaHQiOm49e3Bvc2l0aW9uOm5ldyBDSnQsY29sb3I6bmV3ICRRdCxkaXN0YW5jZTowLGRlY2F5OjB9O2JyZWFrO2Nhc2UiSGVtaXNwaGVyZUxpZ2h0IjpuPXtkaXJlY3Rpb246bmV3IENKdCxza3lDb2xvcjpuZXcgJFF0LGdyb3VuZENvbG9yOm5ldyAkUXR9O2JyZWFrO2Nhc2UiUmVjdEFyZWFMaWdodCI6bj17Y29sb3I6bmV3ICRRdCxwb3NpdGlvbjpuZXcgQ0p0LGhhbGZXaWR0aDpuZXcgQ0p0LGhhbGZIZWlnaHQ6bmV3IENKdH19cmV0dXJuIHRbZS5pZF09bixufX19bGV0IEM1dD0wO2Z1bmN0aW9uIEE1dCh0LGUpe3JldHVybihlLmNhc3RTaGFkb3c/MTowKS0odC5jYXN0U2hhZG93PzE6MCl9ZnVuY3Rpb24gazV0KHQsZSl7Y29uc3Qgbj1uZXcgVDV0LGk9KGZ1bmN0aW9uIHIoKXtjb25zdCB0PXt9O3JldHVybntnZXQ6ZnVuY3Rpb24oZSl7aWYodm9pZCAwIT09dFtlLmlkXSlyZXR1cm4gdFtlLmlkXTtsZXQgbjtzd2l0Y2goZS50eXBlKXtjYXNlIkRpcmVjdGlvbmFsTGlnaHQiOmNhc2UiU3BvdExpZ2h0IjpuPXtzaGFkb3dCaWFzOjAsc2hhZG93Tm9ybWFsQmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IG1KdH07YnJlYWs7Y2FzZSJQb2ludExpZ2h0IjpuPXtzaGFkb3dCaWFzOjAsc2hhZG93Tm9ybWFsQmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IG1KdCxzaGFkb3dDYW1lcmFOZWFyOjEsc2hhZG93Q2FtZXJhRmFyOjFlM319cmV0dXJuIHRbZS5pZF09bixufX19KSgpLG89e3ZlcnNpb246MCxoYXNoOntkaXJlY3Rpb25hbExlbmd0aDotMSxwb2ludExlbmd0aDotMSxzcG90TGVuZ3RoOi0xLHJlY3RBcmVhTGVuZ3RoOi0xLGhlbWlMZW5ndGg6LTEsbnVtRGlyZWN0aW9uYWxTaGFkb3dzOi0xLG51bVBvaW50U2hhZG93czotMSxudW1TcG90U2hhZG93czotMX0sYW1iaWVudDpbMCwwLDBdLHByb2JlOltdLGRpcmVjdGlvbmFsOltdLGRpcmVjdGlvbmFsU2hhZG93OltdLGRpcmVjdGlvbmFsU2hhZG93TWFwOltdLGRpcmVjdGlvbmFsU2hhZG93TWF0cml4OltdLHNwb3Q6W10sc3BvdFNoYWRvdzpbXSxzcG90U2hhZG93TWFwOltdLHNwb3RTaGFkb3dNYXRyaXg6W10scmVjdEFyZWE6W10scmVjdEFyZWFMVEMxOm51bGwscmVjdEFyZWFMVEMyOm51bGwscG9pbnQ6W10scG9pbnRTaGFkb3c6W10scG9pbnRTaGFkb3dNYXA6W10scG9pbnRTaGFkb3dNYXRyaXg6W10saGVtaTpbXX07Zm9yKGxldCB0PTA7dDw5O3QrKylvLnByb2JlLnB1c2gobmV3IENKdCk7Y29uc3QgYT1uZXcgQ0p0LHM9bmV3IHJRdCxsPW5ldyByUXQ7cmV0dXJue3NldHVwOmZ1bmN0aW9uIGMocil7bGV0IGE9MCxzPTAsbD0wO2ZvcihsZXQgdD0wO3Q8OTt0Kyspby5wcm9iZVt0XS5zZXQoMCwwLDApO2xldCBjPTAsdT0wLGg9MCxkPTAscD0wLGY9MCxtPTAsZz0wO3Iuc29ydChBNXQpO2ZvcihsZXQgdD0wLGU9ci5sZW5ndGg7dDxlO3QrKyl7Y29uc3QgZT1yW3RdLF89ZS5jb2xvcix5PWUuaW50ZW5zaXR5LHY9ZS5kaXN0YW5jZSxiPWUuc2hhZG93JiZlLnNoYWRvdy5tYXA/ZS5zaGFkb3cubWFwLnRleHR1cmU6bnVsbDtpZihlLmlzQW1iaWVudExpZ2h0KWErPV8ucip5LHMrPV8uZyp5LGwrPV8uYip5O2Vsc2UgaWYoZS5pc0xpZ2h0UHJvYmUpZm9yKGxldCB0PTA7dDw5O3QrKylvLnByb2JlW3RdLmFkZFNjYWxlZFZlY3RvcihlLnNoLmNvZWZmaWNpZW50c1t0XSx5KTtlbHNlIGlmKGUuaXNEaXJlY3Rpb25hbExpZ2h0KXtjb25zdCB0PW4uZ2V0KGUpO2lmKHQuY29sb3IuY29weShlLmNvbG9yKS5tdWx0aXBseVNjYWxhcihlLmludGVuc2l0eSksZS5jYXN0U2hhZG93KXtjb25zdCB0PWUuc2hhZG93LG49aS5nZXQoZSk7bi5zaGFkb3dCaWFzPXQuYmlhcyxuLnNoYWRvd05vcm1hbEJpYXM9dC5ub3JtYWxCaWFzLG4uc2hhZG93UmFkaXVzPXQucmFkaXVzLG4uc2hhZG93TWFwU2l6ZT10Lm1hcFNpemUsby5kaXJlY3Rpb25hbFNoYWRvd1tjXT1uLG8uZGlyZWN0aW9uYWxTaGFkb3dNYXBbY109YixvLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4W2NdPWUuc2hhZG93Lm1hdHJpeCxmKyt9by5kaXJlY3Rpb25hbFtjXT10LGMrK31lbHNlIGlmKGUuaXNTcG90TGlnaHQpe2NvbnN0IHQ9bi5nZXQoZSk7aWYodC5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oZS5tYXRyaXhXb3JsZCksdC5jb2xvci5jb3B5KF8pLm11bHRpcGx5U2NhbGFyKHkpLHQuZGlzdGFuY2U9dix0LmNvbmVDb3M9TWF0aC5jb3MoZS5hbmdsZSksdC5wZW51bWJyYUNvcz1NYXRoLmNvcyhlLmFuZ2xlKigxLWUucGVudW1icmEpKSx0LmRlY2F5PWUuZGVjYXksZS5jYXN0U2hhZG93KXtjb25zdCB0PWUuc2hhZG93LG49aS5nZXQoZSk7bi5zaGFkb3dCaWFzPXQuYmlhcyxuLnNoYWRvd05vcm1hbEJpYXM9dC5ub3JtYWxCaWFzLG4uc2hhZG93UmFkaXVzPXQucmFkaXVzLG4uc2hhZG93TWFwU2l6ZT10Lm1hcFNpemUsby5zcG90U2hhZG93W2hdPW4sby5zcG90U2hhZG93TWFwW2hdPWIsby5zcG90U2hhZG93TWF0cml4W2hdPWUuc2hhZG93Lm1hdHJpeCxnKyt9by5zcG90W2hdPXQsaCsrfWVsc2UgaWYoZS5pc1JlY3RBcmVhTGlnaHQpe2NvbnN0IHQ9bi5nZXQoZSk7dC5jb2xvci5jb3B5KF8pLm11bHRpcGx5U2NhbGFyKHkpLHQuaGFsZldpZHRoLnNldCguNSplLndpZHRoLDAsMCksdC5oYWxmSGVpZ2h0LnNldCgwLC41KmUuaGVpZ2h0LDApLG8ucmVjdEFyZWFbZF09dCxkKyt9ZWxzZSBpZihlLmlzUG9pbnRMaWdodCl7Y29uc3QgdD1uLmdldChlKTtpZih0LmNvbG9yLmNvcHkoZS5jb2xvcikubXVsdGlwbHlTY2FsYXIoZS5pbnRlbnNpdHkpLHQuZGlzdGFuY2U9ZS5kaXN0YW5jZSx0LmRlY2F5PWUuZGVjYXksZS5jYXN0U2hhZG93KXtjb25zdCB0PWUuc2hhZG93LG49aS5nZXQoZSk7bi5zaGFkb3dCaWFzPXQuYmlhcyxuLnNoYWRvd05vcm1hbEJpYXM9dC5ub3JtYWxCaWFzLG4uc2hhZG93UmFkaXVzPXQucmFkaXVzLG4uc2hhZG93TWFwU2l6ZT10Lm1hcFNpemUsbi5zaGFkb3dDYW1lcmFOZWFyPXQuY2FtZXJhLm5lYXIsbi5zaGFkb3dDYW1lcmFGYXI9dC5jYW1lcmEuZmFyLG8ucG9pbnRTaGFkb3dbdV09bixvLnBvaW50U2hhZG93TWFwW3VdPWIsby5wb2ludFNoYWRvd01hdHJpeFt1XT1lLnNoYWRvdy5tYXRyaXgsbSsrfW8ucG9pbnRbdV09dCx1Kyt9ZWxzZSBpZihlLmlzSGVtaXNwaGVyZUxpZ2h0KXtjb25zdCB0PW4uZ2V0KGUpO3Quc2t5Q29sb3IuY29weShlLmNvbG9yKS5tdWx0aXBseVNjYWxhcih5KSx0Lmdyb3VuZENvbG9yLmNvcHkoZS5ncm91bmRDb2xvcikubXVsdGlwbHlTY2FsYXIoeSksby5oZW1pW3BdPXQscCsrfX1kPjAmJihlLmlzV2ViR0wyfHwhMD09PXQuaGFzKCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKT8oby5yZWN0QXJlYUxUQzE9bDB0LkxUQ19GTE9BVF8xLG8ucmVjdEFyZWFMVEMyPWwwdC5MVENfRkxPQVRfMik6ITA9PT10LmhhcygiT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXIiKT8oby5yZWN0QXJlYUxUQzE9bDB0LkxUQ19IQUxGXzEsby5yZWN0QXJlYUxUQzI9bDB0LkxUQ19IQUxGXzIpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVuYWJsZSB0byB1c2UgUmVjdEFyZWFMaWdodC4gTWlzc2luZyBXZWJHTCBleHRlbnNpb25zLiIpKSxvLmFtYmllbnRbMF09YSxvLmFtYmllbnRbMV09cyxvLmFtYmllbnRbMl09bDtjb25zdCBfPW8uaGFzaDtfLmRpcmVjdGlvbmFsTGVuZ3RoPT09YyYmXy5wb2ludExlbmd0aD09PXUmJl8uc3BvdExlbmd0aD09PWgmJl8ucmVjdEFyZWFMZW5ndGg9PT1kJiZfLmhlbWlMZW5ndGg9PT1wJiZfLm51bURpcmVjdGlvbmFsU2hhZG93cz09PWYmJl8ubnVtUG9pbnRTaGFkb3dzPT09bSYmXy5udW1TcG90U2hhZG93cz09PWd8fChvLmRpcmVjdGlvbmFsLmxlbmd0aD1jLG8uc3BvdC5sZW5ndGg9aCxvLnJlY3RBcmVhLmxlbmd0aD1kLG8ucG9pbnQubGVuZ3RoPXUsby5oZW1pLmxlbmd0aD1wLG8uZGlyZWN0aW9uYWxTaGFkb3cubGVuZ3RoPWYsby5kaXJlY3Rpb25hbFNoYWRvd01hcC5sZW5ndGg9ZixvLnBvaW50U2hhZG93Lmxlbmd0aD1tLG8ucG9pbnRTaGFkb3dNYXAubGVuZ3RoPW0sby5zcG90U2hhZG93Lmxlbmd0aD1nLG8uc3BvdFNoYWRvd01hcC5sZW5ndGg9ZyxvLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4Lmxlbmd0aD1mLG8ucG9pbnRTaGFkb3dNYXRyaXgubGVuZ3RoPW0sby5zcG90U2hhZG93TWF0cml4Lmxlbmd0aD1nLF8uZGlyZWN0aW9uYWxMZW5ndGg9YyxfLnBvaW50TGVuZ3RoPXUsXy5zcG90TGVuZ3RoPWgsXy5yZWN0QXJlYUxlbmd0aD1kLF8uaGVtaUxlbmd0aD1wLF8ubnVtRGlyZWN0aW9uYWxTaGFkb3dzPWYsXy5udW1Qb2ludFNoYWRvd3M9bSxfLm51bVNwb3RTaGFkb3dzPWcsby52ZXJzaW9uPUM1dCsrKX0sc2V0dXBWaWV3OmZ1bmN0aW9uIHUodCxlKXtsZXQgbj0wLGk9MCxyPTAsYz0wLHU9MDtjb25zdCBoPWUubWF0cml4V29ybGRJbnZlcnNlO2ZvcihsZXQgZT0wLGQ9dC5sZW5ndGg7ZTxkO2UrKyl7Y29uc3QgZD10W2VdO2lmKGQuaXNEaXJlY3Rpb25hbExpZ2h0KXtjb25zdCB0PW8uZGlyZWN0aW9uYWxbbl07dC5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGQubWF0cml4V29ybGQpLGEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGQudGFyZ2V0Lm1hdHJpeFdvcmxkKSx0LmRpcmVjdGlvbi5zdWIoYSksdC5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKGgpLG4rK31lbHNlIGlmKGQuaXNTcG90TGlnaHQpe2NvbnN0IHQ9by5zcG90W3JdO3QucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGQubWF0cml4V29ybGQpLHQucG9zaXRpb24uYXBwbHlNYXRyaXg0KGgpLHQuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihkLm1hdHJpeFdvcmxkKSxhLnNldEZyb21NYXRyaXhQb3NpdGlvbihkLnRhcmdldC5tYXRyaXhXb3JsZCksdC5kaXJlY3Rpb24uc3ViKGEpLHQuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihoKSxyKyt9ZWxzZSBpZihkLmlzUmVjdEFyZWFMaWdodCl7Y29uc3QgdD1vLnJlY3RBcmVhW2NdO3QucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGQubWF0cml4V29ybGQpLHQucG9zaXRpb24uYXBwbHlNYXRyaXg0KGgpLGwuaWRlbnRpdHkoKSxzLmNvcHkoZC5tYXRyaXhXb3JsZCkscy5wcmVtdWx0aXBseShoKSxsLmV4dHJhY3RSb3RhdGlvbihzKSx0LmhhbGZXaWR0aC5zZXQoLjUqZC53aWR0aCwwLDApLHQuaGFsZkhlaWdodC5zZXQoMCwuNSpkLmhlaWdodCwwKSx0LmhhbGZXaWR0aC5hcHBseU1hdHJpeDQobCksdC5oYWxmSGVpZ2h0LmFwcGx5TWF0cml4NChsKSxjKyt9ZWxzZSBpZihkLmlzUG9pbnRMaWdodCl7Y29uc3QgdD1vLnBvaW50W2ldO3QucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGQubWF0cml4V29ybGQpLHQucG9zaXRpb24uYXBwbHlNYXRyaXg0KGgpLGkrK31lbHNlIGlmKGQuaXNIZW1pc3BoZXJlTGlnaHQpe2NvbnN0IHQ9by5oZW1pW3VdO3QuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihkLm1hdHJpeFdvcmxkKSx0LmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oaCksdC5kaXJlY3Rpb24ubm9ybWFsaXplKCksdSsrfX19LHN0YXRlOm99fWZ1bmN0aW9uIEw1dCh0LGUpe2NvbnN0IG49bmV3IGs1dCh0LGUpLGk9W10scj1bXTtyZXR1cm57aW5pdDpmdW5jdGlvbiBvKCl7aS5sZW5ndGg9MCxyLmxlbmd0aD0wfSxzdGF0ZTp7bGlnaHRzQXJyYXk6aSxzaGFkb3dzQXJyYXk6cixsaWdodHM6bn0sc2V0dXBMaWdodHM6ZnVuY3Rpb24gYSgpe24uc2V0dXAoaSl9LHNldHVwTGlnaHRzVmlldzpmdW5jdGlvbiBzKHQpe24uc2V0dXBWaWV3KGksdCl9LHB1c2hMaWdodDpmdW5jdGlvbiBsKHQpe2kucHVzaCh0KX0scHVzaFNoYWRvdzpmdW5jdGlvbiBjKHQpe3IucHVzaCh0KX19fWZ1bmN0aW9uIFA1dCh0LGUpe2xldCBuPW5ldyBXZWFrTWFwO3JldHVybntnZXQ6ZnVuY3Rpb24gaShyLG89MCl7bGV0IGE7cmV0dXJuITE9PT1uLmhhcyhyKT8oYT1uZXcgTDV0KHQsZSksbi5zZXQocixbYV0pKTpvPj1uLmdldChyKS5sZW5ndGg/KGE9bmV3IEw1dCh0LGUpLG4uZ2V0KHIpLnB1c2goYSkpOmE9bi5nZXQocilbb10sYX0sZGlzcG9zZTpmdW5jdGlvbiByKCl7bj1uZXcgV2Vha01hcH19fWNsYXNzIE41dCBleHRlbmRzIFVRdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iTWVzaERlcHRoTWF0ZXJpYWwiLHRoaXMuZGVwdGhQYWNraW5nPTMyMDAsdGhpcy5tYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLmZvZz0hMSx0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuZGVwdGhQYWNraW5nPXQuZGVwdGhQYWNraW5nLHRoaXMubWFwPXQubWFwLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLmRpc3BsYWNlbWVudE1hcD10LmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPXQuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPXQuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzfX1ONXQucHJvdG90eXBlLmlzTWVzaERlcHRoTWF0ZXJpYWw9ITA7Y2xhc3MgSTV0IGV4dGVuZHMgVVF0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy50eXBlPSJNZXNoRGlzdGFuY2VNYXRlcmlhbCIsdGhpcy5yZWZlcmVuY2VQb3NpdGlvbj1uZXcgQ0p0LHRoaXMubmVhckRpc3RhbmNlPTEsdGhpcy5mYXJEaXN0YW5jZT0xZTMsdGhpcy5tYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy5mb2c9ITEsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnJlZmVyZW5jZVBvc2l0aW9uLmNvcHkodC5yZWZlcmVuY2VQb3NpdGlvbiksdGhpcy5uZWFyRGlzdGFuY2U9dC5uZWFyRGlzdGFuY2UsdGhpcy5mYXJEaXN0YW5jZT10LmZhckRpc3RhbmNlLHRoaXMubWFwPXQubWFwLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLmRpc3BsYWNlbWVudE1hcD10LmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPXQuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPXQuZGlzcGxhY2VtZW50Qmlhcyx0aGlzfX1mdW5jdGlvbiBSNXQodCxlLG4pe2xldCBpPW5ldyBpMHQ7Y29uc3Qgcj1uZXcgbUp0LG89bmV3IG1KdCxhPW5ldyB3SnQscz1uZXcgTjV0KHtkZXB0aFBhY2tpbmc6MzIwMX0pLGw9bmV3IEk1dCxjPXt9LHU9bi5tYXhUZXh0dXJlU2l6ZSxoPXswOjEsMTowLDI6Mn0sZD1uZXcgRzF0KHtkZWZpbmVzOntTQU1QTEVfUkFURToyLzgsSEFMRl9TQU1QTEVfUkFURToxLzh9LHVuaWZvcm1zOntzaGFkb3dfcGFzczp7dmFsdWU6bnVsbH0scmVzb2x1dGlvbjp7dmFsdWU6bmV3IG1KdH0scmFkaXVzOnt2YWx1ZTo0fX0sdmVydGV4U2hhZGVyOiJ2b2lkIG1haW4oKSB7XG5cdGdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24sIDEuMCApO1xufSIsZnJhZ21lbnRTaGFkZXI6InVuaWZvcm0gc2FtcGxlcjJEIHNoYWRvd19wYXNzO1xudW5pZm9ybSB2ZWMyIHJlc29sdXRpb247XG51bmlmb3JtIGZsb2F0IHJhZGl1cztcbiNpbmNsdWRlIDxwYWNraW5nPlxudm9pZCBtYWluKCkge1xuXHRmbG9hdCBtZWFuID0gMC4wO1xuXHRmbG9hdCBzcXVhcmVkX21lYW4gPSAwLjA7XG5cdGZsb2F0IGRlcHRoID0gdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggc2hhZG93X3Bhc3MsICggZ2xfRnJhZ0Nvb3JkLnh5ICkgLyByZXNvbHV0aW9uICkgKTtcblx0Zm9yICggZmxvYXQgaSA9IC0xLjA7IGkgPCAxLjAgOyBpICs9IFNBTVBMRV9SQVRFKSB7XG5cdFx0I2lmZGVmIEhPUklaT05UQUxfUEFTU1xuXHRcdFx0dmVjMiBkaXN0cmlidXRpb24gPSB1bnBhY2tSR0JBVG8ySGFsZiggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCBpLCAwLjAgKSAqIHJhZGl1cyApIC8gcmVzb2x1dGlvbiApICk7XG5cdFx0XHRtZWFuICs9IGRpc3RyaWJ1dGlvbi54O1xuXHRcdFx0c3F1YXJlZF9tZWFuICs9IGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKyBkaXN0cmlidXRpb24ueCAqIGRpc3RyaWJ1dGlvbi54O1xuXHRcdCNlbHNlXG5cdFx0XHRmbG9hdCBkZXB0aCA9IHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIHNoYWRvd19wYXNzLCAoIGdsX0ZyYWdDb29yZC54eSArIHZlYzIoIDAuMCwgaSApICogcmFkaXVzICkgLyByZXNvbHV0aW9uICkgKTtcblx0XHRcdG1lYW4gKz0gZGVwdGg7XG5cdFx0XHRzcXVhcmVkX21lYW4gKz0gZGVwdGggKiBkZXB0aDtcblx0XHQjZW5kaWZcblx0fVxuXHRtZWFuID0gbWVhbiAqIEhBTEZfU0FNUExFX1JBVEU7XG5cdHNxdWFyZWRfbWVhbiA9IHNxdWFyZWRfbWVhbiAqIEhBTEZfU0FNUExFX1JBVEU7XG5cdGZsb2F0IHN0ZF9kZXYgPSBzcXJ0KCBzcXVhcmVkX21lYW4gLSBtZWFuICogbWVhbiApO1xuXHRnbF9GcmFnQ29sb3IgPSBwYWNrMkhhbGZUb1JHQkEoIHZlYzIoIG1lYW4sIHN0ZF9kZXYgKSApO1xufSJ9KSxwPWQuY2xvbmUoKTtwLmRlZmluZXMuSE9SSVpPTlRBTF9QQVNTPTE7Y29uc3QgZj1uZXcgYjF0O2Yuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFFRdChuZXcgRmxvYXQzMkFycmF5KFstMSwtMSwuNSwzLC0xLC41LC0xLDMsLjVdKSwzKSk7Y29uc3QgbT1uZXcgQjF0KGYsZCksZz10aGlzO2Z1bmN0aW9uIF8obixpKXtjb25zdCByPWUudXBkYXRlKG0pO2QudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWU9bi5tYXAudGV4dHVyZSxkLnVuaWZvcm1zLnJlc29sdXRpb24udmFsdWU9bi5tYXBTaXplLGQudW5pZm9ybXMucmFkaXVzLnZhbHVlPW4ucmFkaXVzLHQuc2V0UmVuZGVyVGFyZ2V0KG4ubWFwUGFzcyksdC5jbGVhcigpLHQucmVuZGVyQnVmZmVyRGlyZWN0KGksbnVsbCxyLGQsbSxudWxsKSxwLnVuaWZvcm1zLnNoYWRvd19wYXNzLnZhbHVlPW4ubWFwUGFzcy50ZXh0dXJlLHAudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZT1uLm1hcFNpemUscC51bmlmb3Jtcy5yYWRpdXMudmFsdWU9bi5yYWRpdXMsdC5zZXRSZW5kZXJUYXJnZXQobi5tYXApLHQuY2xlYXIoKSx0LnJlbmRlckJ1ZmZlckRpcmVjdChpLG51bGwscixwLG0sbnVsbCl9ZnVuY3Rpb24geShlLG4saSxyLG8sYSx1KXtsZXQgZD1udWxsO2NvbnN0IHA9ITA9PT1yLmlzUG9pbnRMaWdodD9lLmN1c3RvbURpc3RhbmNlTWF0ZXJpYWw6ZS5jdXN0b21EZXB0aE1hdGVyaWFsO2lmKGQ9dm9pZCAwIT09cD9wOiEwPT09ci5pc1BvaW50TGlnaHQ/bDpzLHQubG9jYWxDbGlwcGluZ0VuYWJsZWQmJiEwPT09aS5jbGlwU2hhZG93cyYmMCE9PWkuY2xpcHBpbmdQbGFuZXMubGVuZ3RoKXtjb25zdCB0PWQudXVpZCxlPWkudXVpZDtsZXQgbj1jW3RdO3ZvaWQgMD09PW4mJihuPXt9LGNbdF09bik7bGV0IHI9bltlXTt2b2lkIDA9PT1yJiYocj1kLmNsb25lKCksbltlXT1yKSxkPXJ9cmV0dXJuIGQudmlzaWJsZT1pLnZpc2libGUsZC53aXJlZnJhbWU9aS53aXJlZnJhbWUsZC5zaWRlPTM9PT11P251bGwhPT1pLnNoYWRvd1NpZGU/aS5zaGFkb3dTaWRlOmkuc2lkZTpudWxsIT09aS5zaGFkb3dTaWRlP2kuc2hhZG93U2lkZTpoW2kuc2lkZV0sZC5jbGlwU2hhZG93cz1pLmNsaXBTaGFkb3dzLGQuY2xpcHBpbmdQbGFuZXM9aS5jbGlwcGluZ1BsYW5lcyxkLmNsaXBJbnRlcnNlY3Rpb249aS5jbGlwSW50ZXJzZWN0aW9uLGQud2lyZWZyYW1lTGluZXdpZHRoPWkud2lyZWZyYW1lTGluZXdpZHRoLGQubGluZXdpZHRoPWkubGluZXdpZHRoLCEwPT09ci5pc1BvaW50TGlnaHQmJiEwPT09ZC5pc01lc2hEaXN0YW5jZU1hdGVyaWFsJiYoZC5yZWZlcmVuY2VQb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oci5tYXRyaXhXb3JsZCksZC5uZWFyRGlzdGFuY2U9byxkLmZhckRpc3RhbmNlPWEpLGR9ZnVuY3Rpb24gdihuLHIsbyxhLHMpe2lmKCExPT09bi52aXNpYmxlKXJldHVybjtpZihuLmxheWVycy50ZXN0KHIubGF5ZXJzKSYmKG4uaXNNZXNofHxuLmlzTGluZXx8bi5pc1BvaW50cykmJihuLmNhc3RTaGFkb3d8fG4ucmVjZWl2ZVNoYWRvdyYmMz09PXMpJiYoIW4uZnJ1c3R1bUN1bGxlZHx8aS5pbnRlcnNlY3RzT2JqZWN0KG4pKSl7bi5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyhvLm1hdHJpeFdvcmxkSW52ZXJzZSxuLm1hdHJpeFdvcmxkKTtjb25zdCBpPWUudXBkYXRlKG4pLHI9bi5tYXRlcmlhbDtpZihBcnJheS5pc0FycmF5KHIpKXtjb25zdCBlPWkuZ3JvdXBzO2ZvcihsZXQgbD0wLGM9ZS5sZW5ndGg7bDxjO2wrKyl7Y29uc3QgYz1lW2xdLHU9cltjLm1hdGVyaWFsSW5kZXhdO2lmKHUmJnUudmlzaWJsZSl7Y29uc3QgZT15KG4sMCx1LGEsby5uZWFyLG8uZmFyLHMpO3QucmVuZGVyQnVmZmVyRGlyZWN0KG8sbnVsbCxpLGUsbixjKX19fWVsc2UgaWYoci52aXNpYmxlKXtjb25zdCBlPXkobiwwLHIsYSxvLm5lYXIsby5mYXIscyk7dC5yZW5kZXJCdWZmZXJEaXJlY3QobyxudWxsLGksZSxuLG51bGwpfX1jb25zdCBsPW4uY2hpbGRyZW47Zm9yKGxldCB0PTAsZT1sLmxlbmd0aDt0PGU7dCsrKXYobFt0XSxyLG8sYSxzKX10aGlzLmVuYWJsZWQ9ITEsdGhpcy5hdXRvVXBkYXRlPSEwLHRoaXMubmVlZHNVcGRhdGU9ITEsdGhpcy50eXBlPTEsdGhpcy5yZW5kZXI9ZnVuY3Rpb24oZSxuLHMpe2lmKCExPT09Zy5lbmFibGVkKXJldHVybjtpZighMT09PWcuYXV0b1VwZGF0ZSYmITE9PT1nLm5lZWRzVXBkYXRlKXJldHVybjtpZigwPT09ZS5sZW5ndGgpcmV0dXJuO2NvbnN0IGw9dC5nZXRSZW5kZXJUYXJnZXQoKSxjPXQuZ2V0QWN0aXZlQ3ViZUZhY2UoKSxoPXQuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKSxkPXQuc3RhdGU7ZC5zZXRCbGVuZGluZygwKSxkLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoMSwxLDEsMSksZC5idWZmZXJzLmRlcHRoLnNldFRlc3QoITApLGQuc2V0U2Npc3NvclRlc3QoITEpO2ZvcihsZXQgbD0wLGM9ZS5sZW5ndGg7bDxjO2wrKyl7Y29uc3QgYz1lW2xdLGg9Yy5zaGFkb3c7aWYodm9pZCAwPT09aCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFNoYWRvd01hcDoiLGMsImhhcyBubyBzaGFkb3cuIik7Y29udGludWV9aWYoITE9PT1oLmF1dG9VcGRhdGUmJiExPT09aC5uZWVkc1VwZGF0ZSljb250aW51ZTtyLmNvcHkoaC5tYXBTaXplKTtjb25zdCBwPWguZ2V0RnJhbWVFeHRlbnRzKCk7aWYoci5tdWx0aXBseShwKSxvLmNvcHkoaC5tYXBTaXplKSwoci54PnV8fHIueT51KSYmKHIueD51JiYoby54PU1hdGguZmxvb3IodS9wLngpLHIueD1vLngqcC54LGgubWFwU2l6ZS54PW8ueCksci55PnUmJihvLnk9TWF0aC5mbG9vcih1L3AueSksci55PW8ueSpwLnksaC5tYXBTaXplLnk9by55KSksbnVsbD09PWgubWFwJiYhaC5pc1BvaW50TGlnaHRTaGFkb3cmJjM9PT10aGlzLnR5cGUpe2NvbnN0IHQ9e21pbkZpbHRlcjplWnQsbWFnRmlsdGVyOmVadCxmb3JtYXQ6aFp0fTtoLm1hcD1uZXcgU0p0KHIueCxyLnksdCksaC5tYXAudGV4dHVyZS5uYW1lPWMubmFtZSsiLnNoYWRvd01hcCIsaC5tYXBQYXNzPW5ldyBTSnQoci54LHIueSx0KSxoLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9bnVsbD09PWgubWFwJiYoaC5tYXA9bmV3IFNKdChyLngsci55LHttaW5GaWx0ZXI6Skt0LG1hZ0ZpbHRlcjpKS3QsZm9ybWF0OmhadH0pLGgubWFwLnRleHR1cmUubmFtZT1jLm5hbWUrIi5zaGFkb3dNYXAiLGguY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSksdC5zZXRSZW5kZXJUYXJnZXQoaC5tYXApLHQuY2xlYXIoKTtjb25zdCBmPWguZ2V0Vmlld3BvcnRDb3VudCgpO2ZvcihsZXQgdD0wO3Q8Zjt0Kyspe2NvbnN0IGU9aC5nZXRWaWV3cG9ydCh0KTthLnNldChvLngqZS54LG8ueSplLnksby54KmUueixvLnkqZS53KSxkLnZpZXdwb3J0KGEpLGgudXBkYXRlTWF0cmljZXMoYyx0KSxpPWguZ2V0RnJ1c3R1bSgpLHYobixzLGguY2FtZXJhLGMsdGhpcy50eXBlKX1oLmlzUG9pbnRMaWdodFNoYWRvd3x8MyE9PXRoaXMudHlwZXx8XyhoLHMpLGgubmVlZHNVcGRhdGU9ITF9Zy5uZWVkc1VwZGF0ZT0hMSx0LnNldFJlbmRlclRhcmdldChsLGMsaCl9fWZ1bmN0aW9uIE81dCh0LGUsbil7Y29uc3QgaT1uLmlzV2ViR0wyLHI9bmV3KGZ1bmN0aW9uIG8oKXtsZXQgZT0hMTtjb25zdCBuPW5ldyB3SnQ7bGV0IGk9bnVsbDtjb25zdCByPW5ldyB3SnQoMCwwLDAsMCk7cmV0dXJue3NldE1hc2s6ZnVuY3Rpb24obil7aT09PW58fGV8fCh0LmNvbG9yTWFzayhuLG4sbixuKSxpPW4pfSxzZXRMb2NrZWQ6ZnVuY3Rpb24odCl7ZT10fSxzZXRDbGVhcjpmdW5jdGlvbihlLGksbyxhLHMpeyEwPT09cyYmKGUqPWEsaSo9YSxvKj1hKSxuLnNldChlLGksbyxhKSwhMT09PXIuZXF1YWxzKG4pJiYodC5jbGVhckNvbG9yKGUsaSxvLGEpLHIuY29weShuKSl9LHJlc2V0OmZ1bmN0aW9uKCl7ZT0hMSxpPW51bGwsci5zZXQoLTEsMCwwLDApfX19KSxhPW5ldyhmdW5jdGlvbiBzKCl7bGV0IGU9ITEsbj1udWxsLGk9bnVsbCxyPW51bGw7cmV0dXJue3NldFRlc3Q6ZnVuY3Rpb24odCl7dD9GKDI5MjkpOlYoMjkyOSl9LHNldE1hc2s6ZnVuY3Rpb24oaSl7bj09PWl8fGV8fCh0LmRlcHRoTWFzayhpKSxuPWkpfSxzZXRGdW5jOmZ1bmN0aW9uKGUpe2lmKGkhPT1lKXtpZihlKXN3aXRjaChlKXtjYXNlIDA6dC5kZXB0aEZ1bmMoNTEyKTticmVhaztjYXNlIDE6dC5kZXB0aEZ1bmMoNTE5KTticmVhaztjYXNlIDI6dC5kZXB0aEZ1bmMoNTEzKTticmVhaztjYXNlIDM6dC5kZXB0aEZ1bmMoNTE1KTticmVhaztjYXNlIDQ6dC5kZXB0aEZ1bmMoNTE0KTticmVhaztjYXNlIDU6dC5kZXB0aEZ1bmMoNTE4KTticmVhaztjYXNlIDY6dC5kZXB0aEZ1bmMoNTE2KTticmVhaztjYXNlIDc6dC5kZXB0aEZ1bmMoNTE3KTticmVhaztkZWZhdWx0OnQuZGVwdGhGdW5jKDUxNSl9ZWxzZSB0LmRlcHRoRnVuYyg1MTUpO2k9ZX19LHNldExvY2tlZDpmdW5jdGlvbih0KXtlPXR9LHNldENsZWFyOmZ1bmN0aW9uKGUpe3IhPT1lJiYodC5jbGVhckRlcHRoKGUpLHI9ZSl9LHJlc2V0OmZ1bmN0aW9uKCl7ZT0hMSxuPW51bGwsaT1udWxsLHI9bnVsbH19fSksbD1uZXcoZnVuY3Rpb24gYygpe2xldCBlPSExLG49bnVsbCxpPW51bGwscj1udWxsLG89bnVsbCxhPW51bGwscz1udWxsLGw9bnVsbCxjPW51bGw7cmV0dXJue3NldFRlc3Q6ZnVuY3Rpb24odCl7ZXx8KHQ/RigyOTYwKTpWKDI5NjApKX0sc2V0TWFzazpmdW5jdGlvbihpKXtuPT09aXx8ZXx8KHQuc3RlbmNpbE1hc2soaSksbj1pKX0sc2V0RnVuYzpmdW5jdGlvbihlLG4sYSl7aT09PWUmJnI9PT1uJiZvPT09YXx8KHQuc3RlbmNpbEZ1bmMoZSxuLGEpLGk9ZSxyPW4sbz1hKX0sc2V0T3A6ZnVuY3Rpb24oZSxuLGkpe2E9PT1lJiZzPT09biYmbD09PWl8fCh0LnN0ZW5jaWxPcChlLG4saSksYT1lLHM9bixsPWkpfSxzZXRMb2NrZWQ6ZnVuY3Rpb24odCl7ZT10fSxzZXRDbGVhcjpmdW5jdGlvbihlKXtjIT09ZSYmKHQuY2xlYXJTdGVuY2lsKGUpLGM9ZSl9LHJlc2V0OmZ1bmN0aW9uKCl7ZT0hMSxuPW51bGwsaT1udWxsLHI9bnVsbCxvPW51bGwsYT1udWxsLHM9bnVsbCxsPW51bGwsYz1udWxsfX19KTtsZXQgdT17fSxoPW51bGwsZD17fSxwPW51bGwsZj0hMSxtPW51bGwsZz1udWxsLF89bnVsbCx5PW51bGwsdj1udWxsLGI9bnVsbCx4PW51bGwsdz0hMSxTPW51bGwsTT1udWxsLEU9bnVsbCxUPW51bGwsQz1udWxsO2NvbnN0IEE9dC5nZXRQYXJhbWV0ZXIoMzU2NjEpO2xldCBrPSExLEw9MDtjb25zdCBQPXQuZ2V0UGFyYW1ldGVyKDc5MzgpOy0xIT09UC5pbmRleE9mKCJXZWJHTCIpPyhMPXBhcnNlRmxvYXQoL15XZWJHTCAoXGQpLy5leGVjKFApWzFdKSxrPUw+PTEpOi0xIT09UC5pbmRleE9mKCJPcGVuR0wgRVMiKSYmKEw9cGFyc2VGbG9hdCgvXk9wZW5HTCBFUyAoXGQpLy5leGVjKFApWzFdKSxrPUw+PTIpO2xldCBOPW51bGwsST17fTtjb25zdCBSPXQuZ2V0UGFyYW1ldGVyKDMwODgpLE89dC5nZXRQYXJhbWV0ZXIoMjk3OCksej0obmV3IHdKdCkuZnJvbUFycmF5KFIpLEQ9KG5ldyB3SnQpLmZyb21BcnJheShPKTtmdW5jdGlvbiBCKGUsbixpKXtjb25zdCByPW5ldyBVaW50OEFycmF5KDQpLG89dC5jcmVhdGVUZXh0dXJlKCk7dC5iaW5kVGV4dHVyZShlLG8pLHQudGV4UGFyYW1ldGVyaShlLDEwMjQxLDk3MjgpLHQudGV4UGFyYW1ldGVyaShlLDEwMjQwLDk3MjgpO2ZvcihsZXQgZT0wO2U8aTtlKyspdC50ZXhJbWFnZTJEKG4rZSwwLDY0MDgsMSwxLDAsNjQwOCw1MTIxLHIpO3JldHVybiBvfWNvbnN0IEg9e307ZnVuY3Rpb24gRihlKXshMCE9PXVbZV0mJih0LmVuYWJsZShlKSx1W2VdPSEwKX1mdW5jdGlvbiBWKGUpeyExIT09dVtlXSYmKHQuZGlzYWJsZShlKSx1W2VdPSExKX1IWzM1NTNdPUIoMzU1MywzNTUzLDEpLEhbMzQwNjddPUIoMzQwNjcsMzQwNjksNiksci5zZXRDbGVhcigwLDAsMCwxKSxhLnNldENsZWFyKDEpLGwuc2V0Q2xlYXIoMCksRigyOTI5KSxhLnNldEZ1bmMoMyksVyghMSkscSgxKSxGKDI4ODQpLEcoMCk7Y29uc3QgVT17W1ZLdF06MzI3NzQsMTAxOjMyNzc4LDEwMjozMjc3OX07aWYoaSlVWzEwM109MzI3NzUsVVsxMDRdPTMyNzc2O2Vsc2V7Y29uc3QgdD1lLmdldCgiRVhUX2JsZW5kX21pbm1heCIpO251bGwhPT10JiYoVVsxMDNdPXQuTUlOX0VYVCxVWzEwNF09dC5NQVhfRVhUKX1jb25zdCBqPXsyMDA6MCwyMDE6MSwyMDI6NzY4LDIwNDo3NzAsMjEwOjc3NiwyMDg6Nzc0LDIwNjo3NzIsMjAzOjc2OSwyMDU6NzcxLDIwOTo3NzUsMjA3Ojc3M307ZnVuY3Rpb24gRyhlLG4saSxyLG8sYSxzLGwpe2lmKDAhPT1lKXtpZighMT09PWYmJihGKDMwNDIpLGY9ITApLDU9PT1lKW89b3x8bixhPWF8fGkscz1zfHxyLG49PT1nJiZvPT09dnx8KHQuYmxlbmRFcXVhdGlvblNlcGFyYXRlKFVbbl0sVVtvXSksZz1uLHY9byksaT09PV8mJnI9PT15JiZhPT09YiYmcz09PXh8fCh0LmJsZW5kRnVuY1NlcGFyYXRlKGpbaV0saltyXSxqW2FdLGpbc10pLF89aSx5PXIsYj1hLHg9cyksbT1lLHc9bnVsbDtlbHNlIGlmKGUhPT1tfHxsIT09dyl7aWYoZz09PVZLdCYmdj09PVZLdHx8KHQuYmxlbmRFcXVhdGlvbigzMjc3NCksZz1WS3Qsdj1WS3QpLGwpc3dpdGNoKGUpe2Nhc2UgMTp0LmJsZW5kRnVuY1NlcGFyYXRlKDEsNzcxLDEsNzcxKTticmVhaztjYXNlIDI6dC5ibGVuZEZ1bmMoMSwxKTticmVhaztjYXNlIDM6dC5ibGVuZEZ1bmNTZXBhcmF0ZSgwLDAsNzY5LDc3MSk7YnJlYWs7Y2FzZSA0OnQuYmxlbmRGdW5jU2VwYXJhdGUoMCw3NjgsMCw3NzApO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZTogSW52YWxpZCBibGVuZGluZzogIixlKX1lbHNlIHN3aXRjaChlKXtjYXNlIDE6dC5ibGVuZEZ1bmNTZXBhcmF0ZSg3NzAsNzcxLDEsNzcxKTticmVhaztjYXNlIDI6dC5ibGVuZEZ1bmMoNzcwLDEpO2JyZWFrO2Nhc2UgMzp0LmJsZW5kRnVuYygwLDc2OSk7YnJlYWs7Y2FzZSA0OnQuYmxlbmRGdW5jKDAsNzY4KTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICIsZSl9Xz1udWxsLHk9bnVsbCxiPW51bGwseD1udWxsLG09ZSx3PWx9fWVsc2UhMD09PWYmJihWKDMwNDIpLGY9ITEpfWZ1bmN0aW9uIFcoZSl7UyE9PWUmJih0LmZyb250RmFjZShlPzIzMDQ6MjMwNSksUz1lKX1mdW5jdGlvbiBxKGUpezAhPT1lPyhGKDI4ODQpLGUhPT1NJiZ0LmN1bGxGYWNlKDE9PT1lPzEwMjk6Mj09PWU/MTAyODoxMDMyKSk6VigyODg0KSxNPWV9ZnVuY3Rpb24gWShlLG4saSl7ZT8oRigzMjgyMyksVD09PW4mJkM9PT1pfHwodC5wb2x5Z29uT2Zmc2V0KG4saSksVD1uLEM9aSkpOlYoMzI4MjMpfWZ1bmN0aW9uIFgoZSl7dm9pZCAwPT09ZSYmKGU9MzM5ODQrQS0xKSxOIT09ZSYmKHQuYWN0aXZlVGV4dHVyZShlKSxOPWUpfXJldHVybntidWZmZXJzOntjb2xvcjpyLGRlcHRoOmEsc3RlbmNpbDpsfSxlbmFibGU6RixkaXNhYmxlOlYsYmluZEZyYW1lYnVmZmVyOmZ1bmN0aW9uICQoZSxuKXtyZXR1cm4gbnVsbD09PW4mJm51bGwhPT1oJiYobj1oKSxkW2VdIT09biYmKHQuYmluZEZyYW1lYnVmZmVyKGUsbiksZFtlXT1uLGkmJigzNjAwOT09PWUmJihkWzM2MTYwXT1uKSwzNjE2MD09PWUmJihkWzM2MDA5XT1uKSksITApfSxiaW5kWFJGcmFtZWJ1ZmZlcjpmdW5jdGlvbiBLKGUpe2UhPT1oJiYodC5iaW5kRnJhbWVidWZmZXIoMzYxNjAsZSksaD1lKX0sdXNlUHJvZ3JhbTpmdW5jdGlvbiBaKGUpe3JldHVybiBwIT09ZSYmKHQudXNlUHJvZ3JhbShlKSxwPWUsITApfSxzZXRCbGVuZGluZzpHLHNldE1hdGVyaWFsOmZ1bmN0aW9uIEoodCxlKXsyPT09dC5zaWRlP1YoMjg4NCk6RigyODg0KTtsZXQgbj0xPT09dC5zaWRlO2UmJihuPSFuKSxXKG4pLDE9PT10LmJsZW5kaW5nJiYhMT09PXQudHJhbnNwYXJlbnQ/RygwKTpHKHQuYmxlbmRpbmcsdC5ibGVuZEVxdWF0aW9uLHQuYmxlbmRTcmMsdC5ibGVuZERzdCx0LmJsZW5kRXF1YXRpb25BbHBoYSx0LmJsZW5kU3JjQWxwaGEsdC5ibGVuZERzdEFscGhhLHQucHJlbXVsdGlwbGllZEFscGhhKSxhLnNldEZ1bmModC5kZXB0aEZ1bmMpLGEuc2V0VGVzdCh0LmRlcHRoVGVzdCksYS5zZXRNYXNrKHQuZGVwdGhXcml0ZSksci5zZXRNYXNrKHQuY29sb3JXcml0ZSk7Y29uc3QgaT10LnN0ZW5jaWxXcml0ZTtsLnNldFRlc3QoaSksaSYmKGwuc2V0TWFzayh0LnN0ZW5jaWxXcml0ZU1hc2spLGwuc2V0RnVuYyh0LnN0ZW5jaWxGdW5jLHQuc3RlbmNpbFJlZix0LnN0ZW5jaWxGdW5jTWFzayksbC5zZXRPcCh0LnN0ZW5jaWxGYWlsLHQuc3RlbmNpbFpGYWlsLHQuc3RlbmNpbFpQYXNzKSksWSh0LnBvbHlnb25PZmZzZXQsdC5wb2x5Z29uT2Zmc2V0RmFjdG9yLHQucG9seWdvbk9mZnNldFVuaXRzKSwhMD09PXQuYWxwaGFUb0NvdmVyYWdlP0YoMzI5MjYpOlYoMzI5MjYpfSxzZXRGbGlwU2lkZWQ6VyxzZXRDdWxsRmFjZTpxLHNldExpbmVXaWR0aDpmdW5jdGlvbiBRKGUpe2UhPT1FJiYoayYmdC5saW5lV2lkdGgoZSksRT1lKX0sc2V0UG9seWdvbk9mZnNldDpZLHNldFNjaXNzb3JUZXN0OmZ1bmN0aW9uIHR0KHQpe3Q/RigzMDg5KTpWKDMwODkpfSxhY3RpdmVUZXh0dXJlOlgsYmluZFRleHR1cmU6ZnVuY3Rpb24gZXQoZSxuKXtudWxsPT09TiYmWCgpO2xldCBpPUlbTl07dm9pZCAwPT09aSYmKGk9e3R5cGU6dm9pZCAwLHRleHR1cmU6dm9pZCAwfSxJW05dPWkpLGkudHlwZT09PWUmJmkudGV4dHVyZT09PW58fCh0LmJpbmRUZXh0dXJlKGUsbnx8SFtlXSksaS50eXBlPWUsaS50ZXh0dXJlPW4pfSx1bmJpbmRUZXh0dXJlOmZ1bmN0aW9uIG50KCl7Y29uc3QgZT1JW05dO3ZvaWQgMCE9PWUmJnZvaWQgMCE9PWUudHlwZSYmKHQuYmluZFRleHR1cmUoZS50eXBlLG51bGwpLGUudHlwZT12b2lkIDAsZS50ZXh0dXJlPXZvaWQgMCl9LGNvbXByZXNzZWRUZXhJbWFnZTJEOmZ1bmN0aW9uIGl0KCl7dHJ5e3QuY29tcHJlc3NlZFRleEltYWdlMkQuYXBwbHkodCxhcmd1bWVudHMpfWNhdGNoKHQpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6Iix0KX19LHRleEltYWdlMkQ6ZnVuY3Rpb24gcnQoKXt0cnl7dC50ZXhJbWFnZTJELmFwcGx5KHQsYXJndW1lbnRzKX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIsdCl9fSx0ZXhJbWFnZTNEOmZ1bmN0aW9uIG90KCl7dHJ5e3QudGV4SW1hZ2UzRC5hcHBseSh0LGFyZ3VtZW50cyl9Y2F0Y2godCl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLHQpfX0sc2Npc3NvcjpmdW5jdGlvbiBhdChlKXshMT09PXouZXF1YWxzKGUpJiYodC5zY2lzc29yKGUueCxlLnksZS56LGUudyksei5jb3B5KGUpKX0sdmlld3BvcnQ6ZnVuY3Rpb24gc3QoZSl7ITE9PT1ELmVxdWFscyhlKSYmKHQudmlld3BvcnQoZS54LGUueSxlLnosZS53KSxELmNvcHkoZSkpfSxyZXNldDpmdW5jdGlvbiBsdCgpe3QuZGlzYWJsZSgzMDQyKSx0LmRpc2FibGUoMjg4NCksdC5kaXNhYmxlKDI5MjkpLHQuZGlzYWJsZSgzMjgyMyksdC5kaXNhYmxlKDMwODkpLHQuZGlzYWJsZSgyOTYwKSx0LmRpc2FibGUoMzI5MjYpLHQuYmxlbmRFcXVhdGlvbigzMjc3NCksdC5ibGVuZEZ1bmMoMSwwKSx0LmJsZW5kRnVuY1NlcGFyYXRlKDEsMCwxLDApLHQuY29sb3JNYXNrKCEwLCEwLCEwLCEwKSx0LmNsZWFyQ29sb3IoMCwwLDAsMCksdC5kZXB0aE1hc2soITApLHQuZGVwdGhGdW5jKDUxMyksdC5jbGVhckRlcHRoKDEpLHQuc3RlbmNpbE1hc2soNDI5NDk2NzI5NSksdC5zdGVuY2lsRnVuYyg1MTksMCw0Mjk0OTY3Mjk1KSx0LnN0ZW5jaWxPcCg3NjgwLDc2ODAsNzY4MCksdC5jbGVhclN0ZW5jaWwoMCksdC5jdWxsRmFjZSgxMDI5KSx0LmZyb250RmFjZSgyMzA1KSx0LnBvbHlnb25PZmZzZXQoMCwwKSx0LmFjdGl2ZVRleHR1cmUoMzM5ODQpLHQuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpLCEwPT09aSYmKHQuYmluZEZyYW1lYnVmZmVyKDM2MDA5LG51bGwpLHQuYmluZEZyYW1lYnVmZmVyKDM2MDA4LG51bGwpKSx0LnVzZVByb2dyYW0obnVsbCksdC5saW5lV2lkdGgoMSksdC5zY2lzc29yKDAsMCx0LmNhbnZhcy53aWR0aCx0LmNhbnZhcy5oZWlnaHQpLHQudmlld3BvcnQoMCwwLHQuY2FudmFzLndpZHRoLHQuY2FudmFzLmhlaWdodCksdT17fSxOPW51bGwsST17fSxoPW51bGwsZD17fSxwPW51bGwsZj0hMSxtPW51bGwsZz1udWxsLF89bnVsbCx5PW51bGwsdj1udWxsLGI9bnVsbCx4PW51bGwsdz0hMSxTPW51bGwsTT1udWxsLEU9bnVsbCxUPW51bGwsQz1udWxsLHouc2V0KDAsMCx0LmNhbnZhcy53aWR0aCx0LmNhbnZhcy5oZWlnaHQpLEQuc2V0KDAsMCx0LmNhbnZhcy53aWR0aCx0LmNhbnZhcy5oZWlnaHQpLHIucmVzZXQoKSxhLnJlc2V0KCksbC5yZXNldCgpfX19ZnVuY3Rpb24gejV0KHQsZSxuLGkscixvLGEpe2NvbnN0IHM9ci5pc1dlYkdMMixsPXIubWF4VGV4dHVyZXMsYz1yLm1heEN1YmVtYXBTaXplLHU9ci5tYXhUZXh0dXJlU2l6ZSxoPXIubWF4U2FtcGxlcyxkPW5ldyBXZWFrTWFwO2xldCBwLGY9ITE7dHJ5e2Y9InVuZGVmaW5lZCIhPXR5cGVvZiBPZmZzY3JlZW5DYW52YXMmJm51bGwhPT1uZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSkuZ2V0Q29udGV4dCgiMmQiKX1jYXRjaCh0KXt9ZnVuY3Rpb24gbSh0LGUpe3JldHVybiBmP25ldyBPZmZzY3JlZW5DYW52YXModCxlKTpkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJjYW52YXMiKX1mdW5jdGlvbiBnKHQsZSxuLGkpe2xldCByPTE7aWYoKHQud2lkdGg+aXx8dC5oZWlnaHQ+aSkmJihyPWkvTWF0aC5tYXgodC53aWR0aCx0LmhlaWdodCkpLHI8MXx8ITA9PT1lKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHwidW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50JiZ0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fCJ1bmRlZmluZWQiIT10eXBlb2YgSW1hZ2VCaXRtYXAmJnQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCl7Y29uc3QgaT1lP3RKdDpNYXRoLmZsb29yLG89aShyKnQud2lkdGgpLGE9aShyKnQuaGVpZ2h0KTt2b2lkIDA9PT1wJiYocD1tKG8sYSkpO2NvbnN0IHM9bj9tKG8sYSk6cDtyZXR1cm4gcy53aWR0aD1vLHMuaGVpZ2h0PWEscy5nZXRDb250ZXh0KCIyZCIpLmRyYXdJbWFnZSh0LDAsMCxvLGEpLGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBoYXMgYmVlbiByZXNpemVkIGZyb20gKCIrdC53aWR0aCsieCIrdC5oZWlnaHQrIikgdG8gKCIrbysieCIrYSsiKS4iKSxzfXJldHVybiJkYXRhImluIHQmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogSW1hZ2UgaW4gRGF0YVRleHR1cmUgaXMgdG9vIGJpZyAoIit0LndpZHRoKyJ4Iit0LmhlaWdodCsiKS4iKSx0fXJldHVybiB0fWZ1bmN0aW9uIF8odCl7cmV0dXJuIEpadCh0LndpZHRoKSYmSlp0KHQuaGVpZ2h0KX1mdW5jdGlvbiB5KHQsZSl7cmV0dXJuIHQuZ2VuZXJhdGVNaXBtYXBzJiZlJiZ0Lm1pbkZpbHRlciE9PUpLdCYmdC5taW5GaWx0ZXIhPT1lWnR9ZnVuY3Rpb24gdihlLG4scixvLGE9MSl7dC5nZW5lcmF0ZU1pcG1hcChlKSxpLmdldChuKS5fX21heE1pcExldmVsPU1hdGgubG9nMihNYXRoLm1heChyLG8sYSkpfWZ1bmN0aW9uIGIobixpLHIpe2lmKCExPT09cylyZXR1cm4gaTtpZihudWxsIT09bil7aWYodm9pZCAwIT09dFtuXSlyZXR1cm4gdFtuXTtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gdXNlIG5vbi1leGlzdGluZyBXZWJHTCBpbnRlcm5hbCBmb3JtYXQgJyIrbisiJyIpfWxldCBvPWk7cmV0dXJuIDY0MDM9PT1pJiYoNTEyNj09PXImJihvPTMzMzI2KSw1MTMxPT09ciYmKG89MzMzMjUpLDUxMjE9PT1yJiYobz0zMzMyMSkpLDY0MDc9PT1pJiYoNTEyNj09PXImJihvPTM0ODM3KSw1MTMxPT09ciYmKG89MzQ4NDMpLDUxMjE9PT1yJiYobz0zMjg0OSkpLDY0MDg9PT1pJiYoNTEyNj09PXImJihvPTM0ODM2KSw1MTMxPT09ciYmKG89MzQ4NDIpLDUxMjE9PT1yJiYobz0zMjg1NikpLDMzMzI1IT09byYmMzMzMjYhPT1vJiYzNDg0MiE9PW8mJjM0ODM2IT09b3x8ZS5nZXQoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKSxvfWZ1bmN0aW9uIHgodCl7cmV0dXJuIHQ9PT1KS3R8fHQ9PT1RS3R8fHQ9PT10WnQ/OTcyODo5NzI5fWZ1bmN0aW9uIHcoZSl7Y29uc3Qgbj1lLnRhcmdldDtuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHcpLChmdW5jdGlvbiByKGUpe2NvbnN0IG49aS5nZXQoZSk7dm9pZCAwIT09bi5fX3dlYmdsSW5pdCYmKHQuZGVsZXRlVGV4dHVyZShuLl9fd2ViZ2xUZXh0dXJlKSxpLnJlbW92ZShlKSl9KShuKSxuLmlzVmlkZW9UZXh0dXJlJiZkLmRlbGV0ZShuKSxhLm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIFMoZSl7Y29uc3Qgbj1lLnRhcmdldDtuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLFMpLChmdW5jdGlvbiByKGUpe2NvbnN0IG49ZS50ZXh0dXJlLHI9aS5nZXQoZSksbz1pLmdldChuKTtpZihlKXtpZih2b2lkIDAhPT1vLl9fd2ViZ2xUZXh0dXJlJiYodC5kZWxldGVUZXh0dXJlKG8uX193ZWJnbFRleHR1cmUpLGEubWVtb3J5LnRleHR1cmVzLS0pLGUuZGVwdGhUZXh0dXJlJiZlLmRlcHRoVGV4dHVyZS5kaXNwb3NlKCksZS5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldClmb3IobGV0IGU9MDtlPDY7ZSsrKXQuZGVsZXRlRnJhbWVidWZmZXIoci5fX3dlYmdsRnJhbWVidWZmZXJbZV0pLHIuX193ZWJnbERlcHRoYnVmZmVyJiZ0LmRlbGV0ZVJlbmRlcmJ1ZmZlcihyLl9fd2ViZ2xEZXB0aGJ1ZmZlcltlXSk7ZWxzZSB0LmRlbGV0ZUZyYW1lYnVmZmVyKHIuX193ZWJnbEZyYW1lYnVmZmVyKSxyLl9fd2ViZ2xEZXB0aGJ1ZmZlciYmdC5kZWxldGVSZW5kZXJidWZmZXIoci5fX3dlYmdsRGVwdGhidWZmZXIpLHIuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyJiZ0LmRlbGV0ZUZyYW1lYnVmZmVyKHIuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKSxyLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlciYmdC5kZWxldGVSZW5kZXJidWZmZXIoci5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIpLHIuX193ZWJnbERlcHRoUmVuZGVyYnVmZmVyJiZ0LmRlbGV0ZVJlbmRlcmJ1ZmZlcihyLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcik7aWYoZS5pc1dlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzKWZvcihsZXQgZT0wLHI9bi5sZW5ndGg7ZTxyO2UrKyl7Y29uc3Qgcj1pLmdldChuW2VdKTtyLl9fd2ViZ2xUZXh0dXJlJiYodC5kZWxldGVUZXh0dXJlKHIuX193ZWJnbFRleHR1cmUpLGEubWVtb3J5LnRleHR1cmVzLS0pLGkucmVtb3ZlKG5bZV0pfWkucmVtb3ZlKG4pLGkucmVtb3ZlKGUpfX0pKG4pfWxldCBNPTA7ZnVuY3Rpb24gRSh0LGUpe2NvbnN0IHI9aS5nZXQodCk7aWYodC5pc1ZpZGVvVGV4dHVyZSYmKGZ1bmN0aW9uIG8odCl7Y29uc3QgZT1hLnJlbmRlci5mcmFtZTtkLmdldCh0KSE9PWUmJihkLnNldCh0LGUpLHQudXBkYXRlKCkpfSkodCksdC52ZXJzaW9uPjAmJnIuX192ZXJzaW9uIT09dC52ZXJzaW9uKXtjb25zdCBuPXQuaW1hZ2U7aWYodm9pZCAwPT09biljb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIHVuZGVmaW5lZCIpO2Vsc2V7aWYoITEhPT1uLmNvbXBsZXRlKXJldHVybiB2b2lkIFAocix0LGUpO2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgaW5jb21wbGV0ZSIpfX1uLmFjdGl2ZVRleHR1cmUoMzM5ODQrZSksbi5iaW5kVGV4dHVyZSgzNTUzLHIuX193ZWJnbFRleHR1cmUpfWZ1bmN0aW9uIFQoZSxyKXtjb25zdCBhPWkuZ2V0KGUpO2UudmVyc2lvbj4wJiZhLl9fdmVyc2lvbiE9PWUudmVyc2lvbj8oZnVuY3Rpb24gbChlLGkscil7aWYoNiE9PWkuaW1hZ2UubGVuZ3RoKXJldHVybjtMKGUsaSksbi5hY3RpdmVUZXh0dXJlKDMzOTg0K3IpLG4uYmluZFRleHR1cmUoMzQwNjcsZS5fX3dlYmdsVGV4dHVyZSksdC5waXhlbFN0b3JlaSgzNzQ0MCxpLmZsaXBZKSx0LnBpeGVsU3RvcmVpKDM3NDQxLGkucHJlbXVsdGlwbHlBbHBoYSksdC5waXhlbFN0b3JlaSgzMzE3LGkudW5wYWNrQWxpZ25tZW50KSx0LnBpeGVsU3RvcmVpKDM3NDQzLDApO2NvbnN0IGE9aSYmKGkuaXNDb21wcmVzc2VkVGV4dHVyZXx8aS5pbWFnZVswXS5pc0NvbXByZXNzZWRUZXh0dXJlKSxsPWkuaW1hZ2VbMF0mJmkuaW1hZ2VbMF0uaXNEYXRhVGV4dHVyZSx1PVtdO2ZvcihsZXQgdD0wO3Q8Njt0KyspdVt0XT1hfHxsP2w/aS5pbWFnZVt0XS5pbWFnZTppLmltYWdlW3RdOmcoaS5pbWFnZVt0XSwhMSwhMCxjKTtjb25zdCBoPXVbMF0sZD1fKGgpfHxzLHA9by5jb252ZXJ0KGkuZm9ybWF0KSxmPW8uY29udmVydChpLnR5cGUpLG09YihpLmludGVybmFsRm9ybWF0LHAsZik7bGV0IHg7aWYoaygzNDA2NyxpLGQpLGEpe2ZvcihsZXQgdD0wO3Q8Njt0Kyspe3g9dVt0XS5taXBtYXBzO2ZvcihsZXQgZT0wO2U8eC5sZW5ndGg7ZSsrKXtjb25zdCByPXhbZV07aS5mb3JtYXQhPT1oWnQmJmkuZm9ybWF0IT09dVp0P251bGwhPT1wP24uY29tcHJlc3NlZFRleEltYWdlMkQoMzQwNjkrdCxlLG0sci53aWR0aCxyLmhlaWdodCwwLHIuZGF0YSk6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAuc2V0VGV4dHVyZUN1YmUoKSIpOm4udGV4SW1hZ2UyRCgzNDA2OSt0LGUsbSxyLndpZHRoLHIuaGVpZ2h0LDAscCxmLHIuZGF0YSl9fWUuX19tYXhNaXBMZXZlbD14Lmxlbmd0aC0xfWVsc2V7eD1pLm1pcG1hcHM7Zm9yKGxldCB0PTA7dDw2O3QrKylpZihsKXtuLnRleEltYWdlMkQoMzQwNjkrdCwwLG0sdVt0XS53aWR0aCx1W3RdLmhlaWdodCwwLHAsZix1W3RdLmRhdGEpO2ZvcihsZXQgZT0wO2U8eC5sZW5ndGg7ZSsrKXtjb25zdCBpPXhbZV0uaW1hZ2VbdF0uaW1hZ2U7bi50ZXhJbWFnZTJEKDM0MDY5K3QsZSsxLG0saS53aWR0aCxpLmhlaWdodCwwLHAsZixpLmRhdGEpfX1lbHNle24udGV4SW1hZ2UyRCgzNDA2OSt0LDAsbSxwLGYsdVt0XSk7Zm9yKGxldCBlPTA7ZTx4Lmxlbmd0aDtlKyspbi50ZXhJbWFnZTJEKDM0MDY5K3QsZSsxLG0scCxmLHhbZV0uaW1hZ2VbdF0pfWUuX19tYXhNaXBMZXZlbD14Lmxlbmd0aH15KGksZCkmJnYoMzQwNjcsaSxoLndpZHRoLGguaGVpZ2h0KSxlLl9fdmVyc2lvbj1pLnZlcnNpb24saS5vblVwZGF0ZSYmaS5vblVwZGF0ZShpKX0pKGEsZSxyKToobi5hY3RpdmVUZXh0dXJlKDMzOTg0K3IpLG4uYmluZFRleHR1cmUoMzQwNjcsYS5fX3dlYmdsVGV4dHVyZSkpfWNvbnN0IEM9e1skS3RdOjEwNDk3LFtLS3RdOjMzMDcxLFtaS3RdOjMzNjQ4fSxBPXtbSkt0XTo5NzI4LFtRS3RdOjk5ODQsW3RadF06OTk4NixbZVp0XTo5NzI5LFtuWnRdOjk5ODUsW2ladF06OTk4N307ZnVuY3Rpb24gayhuLG8sYSl7aWYoYT8odC50ZXhQYXJhbWV0ZXJpKG4sMTAyNDIsQ1tvLndyYXBTXSksdC50ZXhQYXJhbWV0ZXJpKG4sMTAyNDMsQ1tvLndyYXBUXSksMzI4NzkhPT1uJiYzNTg2NiE9PW58fHQudGV4UGFyYW1ldGVyaShuLDMyODgyLENbby53cmFwUl0pLHQudGV4UGFyYW1ldGVyaShuLDEwMjQwLEFbby5tYWdGaWx0ZXJdKSx0LnRleFBhcmFtZXRlcmkobiwxMDI0MSxBW28ubWluRmlsdGVyXSkpOih0LnRleFBhcmFtZXRlcmkobiwxMDI0MiwzMzA3MSksdC50ZXhQYXJhbWV0ZXJpKG4sMTAyNDMsMzMwNzEpLDMyODc5IT09biYmMzU4NjYhPT1ufHx0LnRleFBhcmFtZXRlcmkobiwzMjg4MiwzMzA3MSksby53cmFwUz09PUtLdCYmby53cmFwVD09PUtLdHx8Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLiIpLHQudGV4UGFyYW1ldGVyaShuLDEwMjQwLHgoby5tYWdGaWx0ZXIpKSx0LnRleFBhcmFtZXRlcmkobiwxMDI0MSx4KG8ubWluRmlsdGVyKSksby5taW5GaWx0ZXIhPT1KS3QmJm8ubWluRmlsdGVyIT09ZVp0JiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgaXMgbm90IHBvd2VyIG9mIHR3by4gVGV4dHVyZS5taW5GaWx0ZXIgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5OZWFyZXN0RmlsdGVyIG9yIFRIUkVFLkxpbmVhckZpbHRlci4iKSksITA9PT1lLmhhcygiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIikpe2NvbnN0IGE9ZS5nZXQoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpO2lmKG8udHlwZT09PXNadCYmITE9PT1lLmhhcygiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIikpcmV0dXJuO2lmKCExPT09cyYmby50eXBlPT09bFp0JiYhMT09PWUuaGFzKCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhciIpKXJldHVybjsoby5hbmlzb3Ryb3B5PjF8fGkuZ2V0KG8pLl9fY3VycmVudEFuaXNvdHJvcHkpJiYodC50ZXhQYXJhbWV0ZXJmKG4sYS5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCxNYXRoLm1pbihvLmFuaXNvdHJvcHksci5nZXRNYXhBbmlzb3Ryb3B5KCkpKSxpLmdldChvKS5fX2N1cnJlbnRBbmlzb3Ryb3B5PW8uYW5pc290cm9weSl9fWZ1bmN0aW9uIEwoZSxuKXt2b2lkIDA9PT1lLl9fd2ViZ2xJbml0JiYoZS5fX3dlYmdsSW5pdD0hMCxuLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHcpLGUuX193ZWJnbFRleHR1cmU9dC5jcmVhdGVUZXh0dXJlKCksYS5tZW1vcnkudGV4dHVyZXMrKyl9ZnVuY3Rpb24gUChlLGkscil7bGV0IGE9MzU1MztpLmlzRGF0YVRleHR1cmUyREFycmF5JiYoYT0zNTg2NiksaS5pc0RhdGFUZXh0dXJlM0QmJihhPTMyODc5KSxMKGUsaSksbi5hY3RpdmVUZXh0dXJlKDMzOTg0K3IpLG4uYmluZFRleHR1cmUoYSxlLl9fd2ViZ2xUZXh0dXJlKSx0LnBpeGVsU3RvcmVpKDM3NDQwLGkuZmxpcFkpLHQucGl4ZWxTdG9yZWkoMzc0NDEsaS5wcmVtdWx0aXBseUFscGhhKSx0LnBpeGVsU3RvcmVpKDMzMTcsaS51bnBhY2tBbGlnbm1lbnQpLHQucGl4ZWxTdG9yZWkoMzc0NDMsMCk7Y29uc3QgbD0oZnVuY3Rpb24gYyh0KXtyZXR1cm4hcyYmKHQud3JhcFMhPT1LS3R8fHQud3JhcFQhPT1LS3R8fHQubWluRmlsdGVyIT09Skt0JiZ0Lm1pbkZpbHRlciE9PWVadCl9KShpKSYmITE9PT1fKGkuaW1hZ2UpLGg9ZyhpLmltYWdlLGwsITEsdSksZD1fKGgpfHxzLHA9by5jb252ZXJ0KGkuZm9ybWF0KTtsZXQgZixtPW8uY29udmVydChpLnR5cGUpLHg9YihpLmludGVybmFsRm9ybWF0LHAsbSk7ayhhLGksZCk7Y29uc3Qgdz1pLm1pcG1hcHM7aWYoaS5pc0RlcHRoVGV4dHVyZSl4PTY0MDIscz94PWkudHlwZT09PXNadD8zNjAxMjppLnR5cGU9PT1hWnQ/MzMxOTA6aS50eXBlPT09Y1p0PzM1MDU2OjMzMTg5OmkudHlwZT09PXNadCYmY29uc29sZS5lcnJvcigiV2ViR0xSZW5kZXJlcjogRmxvYXRpbmcgcG9pbnQgZGVwdGggdGV4dHVyZSByZXF1aXJlcyBXZWJHTDIuIiksaS5mb3JtYXQ9PT1kWnQmJjY0MDI9PT14JiZpLnR5cGUhPT1vWnQmJmkudHlwZSE9PWFadCYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVXNlIFVuc2lnbmVkU2hvcnRUeXBlIG9yIFVuc2lnbmVkSW50VHlwZSBmb3IgRGVwdGhGb3JtYXQgRGVwdGhUZXh0dXJlLiIpLGkudHlwZT1vWnQsbT1vLmNvbnZlcnQoaS50eXBlKSksaS5mb3JtYXQ9PT1wWnQmJjY0MDI9PT14JiYoeD0zNDA0MSxpLnR5cGUhPT1jWnQmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERlcHRoU3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuIiksaS50eXBlPWNadCxtPW8uY29udmVydChpLnR5cGUpKSksbi50ZXhJbWFnZTJEKDM1NTMsMCx4LGgud2lkdGgsaC5oZWlnaHQsMCxwLG0sbnVsbCk7ZWxzZSBpZihpLmlzRGF0YVRleHR1cmUpaWYody5sZW5ndGg+MCYmZCl7Zm9yKGxldCB0PTAsZT13Lmxlbmd0aDt0PGU7dCsrKWY9d1t0XSxuLnRleEltYWdlMkQoMzU1Myx0LHgsZi53aWR0aCxmLmhlaWdodCwwLHAsbSxmLmRhdGEpO2kuZ2VuZXJhdGVNaXBtYXBzPSExLGUuX19tYXhNaXBMZXZlbD13Lmxlbmd0aC0xfWVsc2Ugbi50ZXhJbWFnZTJEKDM1NTMsMCx4LGgud2lkdGgsaC5oZWlnaHQsMCxwLG0saC5kYXRhKSxlLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKGkuaXNDb21wcmVzc2VkVGV4dHVyZSl7Zm9yKGxldCB0PTAsZT13Lmxlbmd0aDt0PGU7dCsrKWY9d1t0XSxpLmZvcm1hdCE9PWhadCYmaS5mb3JtYXQhPT11WnQ/bnVsbCE9PXA/bi5jb21wcmVzc2VkVGV4SW1hZ2UyRCgzNTUzLHQseCxmLndpZHRoLGYuaGVpZ2h0LDAsZi5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC51cGxvYWRUZXh0dXJlKCkiKTpuLnRleEltYWdlMkQoMzU1Myx0LHgsZi53aWR0aCxmLmhlaWdodCwwLHAsbSxmLmRhdGEpO2UuX19tYXhNaXBMZXZlbD13Lmxlbmd0aC0xfWVsc2UgaWYoaS5pc0RhdGFUZXh0dXJlMkRBcnJheSluLnRleEltYWdlM0QoMzU4NjYsMCx4LGgud2lkdGgsaC5oZWlnaHQsaC5kZXB0aCwwLHAsbSxoLmRhdGEpLGUuX19tYXhNaXBMZXZlbD0wO2Vsc2UgaWYoaS5pc0RhdGFUZXh0dXJlM0Qpbi50ZXhJbWFnZTNEKDMyODc5LDAseCxoLndpZHRoLGguaGVpZ2h0LGguZGVwdGgsMCxwLG0saC5kYXRhKSxlLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKHcubGVuZ3RoPjAmJmQpe2ZvcihsZXQgdD0wLGU9dy5sZW5ndGg7dDxlO3QrKylmPXdbdF0sbi50ZXhJbWFnZTJEKDM1NTMsdCx4LHAsbSxmKTtpLmdlbmVyYXRlTWlwbWFwcz0hMSxlLl9fbWF4TWlwTGV2ZWw9dy5sZW5ndGgtMX1lbHNlIG4udGV4SW1hZ2UyRCgzNTUzLDAseCxwLG0saCksZS5fX21heE1pcExldmVsPTA7eShpLGQpJiZ2KGEsaSxoLndpZHRoLGguaGVpZ2h0KSxlLl9fdmVyc2lvbj1pLnZlcnNpb24saS5vblVwZGF0ZSYmaS5vblVwZGF0ZShpKX1mdW5jdGlvbiBOKGUscixhLHMsbCl7Y29uc3QgYz1vLmNvbnZlcnQoYS5mb3JtYXQpLHU9by5jb252ZXJ0KGEudHlwZSksaD1iKGEuaW50ZXJuYWxGb3JtYXQsYyx1KTszMjg3OT09PWx8fDM1ODY2PT09bD9uLnRleEltYWdlM0QobCwwLGgsci53aWR0aCxyLmhlaWdodCxyLmRlcHRoLDAsYyx1LG51bGwpOm4udGV4SW1hZ2UyRChsLDAsaCxyLndpZHRoLHIuaGVpZ2h0LDAsYyx1LG51bGwpLG4uYmluZEZyYW1lYnVmZmVyKDM2MTYwLGUpLHQuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAscyxsLGkuZ2V0KGEpLl9fd2ViZ2xUZXh0dXJlLDApLG4uYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWZ1bmN0aW9uIEkoZSxuLGkpe2lmKHQuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxlKSxuLmRlcHRoQnVmZmVyJiYhbi5zdGVuY2lsQnVmZmVyKXtsZXQgcj0zMzE4OTtpZihpKXtjb25zdCBlPW4uZGVwdGhUZXh0dXJlO2UmJmUuaXNEZXB0aFRleHR1cmUmJihlLnR5cGU9PT1zWnQ/cj0zNjAxMjplLnR5cGU9PT1hWnQmJihyPTMzMTkwKSk7Y29uc3QgaT1SKG4pO3QucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLGkscixuLndpZHRoLG4uaGVpZ2h0KX1lbHNlIHQucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSxyLG4ud2lkdGgsbi5oZWlnaHQpO3QuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoMzYxNjAsMzYwOTYsMzYxNjEsZSl9ZWxzZSBpZihuLmRlcHRoQnVmZmVyJiZuLnN0ZW5jaWxCdWZmZXIpe2lmKGkpe2NvbnN0IGU9UihuKTt0LnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSxlLDM1MDU2LG4ud2lkdGgsbi5oZWlnaHQpfWVsc2UgdC5yZW5kZXJidWZmZXJTdG9yYWdlKDM2MTYxLDM0MDQxLG4ud2lkdGgsbi5oZWlnaHQpO3QuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoMzYxNjAsMzMzMDYsMzYxNjEsZSl9ZWxzZXtjb25zdCBlPSEwPT09bi5pc1dlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzP24udGV4dHVyZVswXTpuLnRleHR1cmUscj1vLmNvbnZlcnQoZS5mb3JtYXQpLGE9by5jb252ZXJ0KGUudHlwZSkscz1iKGUuaW50ZXJuYWxGb3JtYXQscixhKTtpZihpKXtjb25zdCBlPVIobik7dC5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoMzYxNjEsZSxzLG4ud2lkdGgsbi5oZWlnaHQpfWVsc2UgdC5yZW5kZXJidWZmZXJTdG9yYWdlKDM2MTYxLHMsbi53aWR0aCxuLmhlaWdodCl9dC5iaW5kUmVuZGVyYnVmZmVyKDM2MTYxLG51bGwpfWZ1bmN0aW9uIFIodCl7cmV0dXJuIHMmJnQuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0P01hdGgubWluKGgsdC5zYW1wbGVzKTowfWxldCBPPSExLHo9ITE7dGhpcy5hbGxvY2F0ZVRleHR1cmVVbml0PWZ1bmN0aW9uIEQoKXtjb25zdCB0PU07cmV0dXJuIHQ+PWwmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlczogVHJ5aW5nIHRvIHVzZSAiK3QrIiB0ZXh0dXJlIHVuaXRzIHdoaWxlIHRoaXMgR1BVIHN1cHBvcnRzIG9ubHkgIitsKSxNKz0xLHR9LHRoaXMucmVzZXRUZXh0dXJlVW5pdHM9ZnVuY3Rpb24gQigpe009MH0sdGhpcy5zZXRUZXh0dXJlMkQ9RSx0aGlzLnNldFRleHR1cmUyREFycmF5PWZ1bmN0aW9uIEgodCxlKXtjb25zdCByPWkuZ2V0KHQpO3QudmVyc2lvbj4wJiZyLl9fdmVyc2lvbiE9PXQudmVyc2lvbj9QKHIsdCxlKToobi5hY3RpdmVUZXh0dXJlKDMzOTg0K2UpLG4uYmluZFRleHR1cmUoMzU4NjYsci5fX3dlYmdsVGV4dHVyZSkpfSx0aGlzLnNldFRleHR1cmUzRD1mdW5jdGlvbiBGKHQsZSl7Y29uc3Qgcj1pLmdldCh0KTt0LnZlcnNpb24+MCYmci5fX3ZlcnNpb24hPT10LnZlcnNpb24/UChyLHQsZSk6KG4uYWN0aXZlVGV4dHVyZSgzMzk4NCtlKSxuLmJpbmRUZXh0dXJlKDMyODc5LHIuX193ZWJnbFRleHR1cmUpKX0sdGhpcy5zZXRUZXh0dXJlQ3ViZT1ULHRoaXMuc2V0dXBSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24gVihlKXtjb25zdCBsPWUudGV4dHVyZSxjPWkuZ2V0KGUpLHU9aS5nZXQobCk7ZS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixTKSwhMCE9PWUuaXNXZWJHTE11bHRpcGxlUmVuZGVyVGFyZ2V0cyYmKHUuX193ZWJnbFRleHR1cmU9dC5jcmVhdGVUZXh0dXJlKCksdS5fX3ZlcnNpb249bC52ZXJzaW9uLGEubWVtb3J5LnRleHR1cmVzKyspO2NvbnN0IGg9ITA9PT1lLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0LGQ9ITA9PT1lLmlzV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHMscD0hMD09PWUuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0LGY9bC5pc0RhdGFUZXh0dXJlM0R8fGwuaXNEYXRhVGV4dHVyZTJEQXJyYXksbT1fKGUpfHxzO2lmKCFzfHxsLmZvcm1hdCE9PXVadHx8bC50eXBlIT09c1p0JiZsLnR5cGUhPT1sWnR8fChsLmZvcm1hdD1oWnQsY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBSZW5kZXJpbmcgdG8gdGV4dHVyZXMgd2l0aCBSR0IgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuIFVzaW5nIFJHQkEgZm9ybWF0IGluc3RlYWQuIikpLGgpe2MuX193ZWJnbEZyYW1lYnVmZmVyPVtdO2ZvcihsZXQgZT0wO2U8NjtlKyspYy5fX3dlYmdsRnJhbWVidWZmZXJbZV09dC5jcmVhdGVGcmFtZWJ1ZmZlcigpfWVsc2UgaWYoYy5fX3dlYmdsRnJhbWVidWZmZXI9dC5jcmVhdGVGcmFtZWJ1ZmZlcigpLGQpaWYoci5kcmF3QnVmZmVycyl7Y29uc3Qgbj1lLnRleHR1cmU7Zm9yKGxldCBlPTAscj1uLmxlbmd0aDtlPHI7ZSsrKXtjb25zdCByPWkuZ2V0KG5bZV0pO3ZvaWQgMD09PXIuX193ZWJnbFRleHR1cmUmJihyLl9fd2ViZ2xUZXh0dXJlPXQuY3JlYXRlVGV4dHVyZSgpLGEubWVtb3J5LnRleHR1cmVzKyspfX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHMgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFdlYkdMMiBvciBXRUJHTF9kcmF3X2J1ZmZlcnMgZXh0ZW5zaW9uLiIpO2Vsc2UgaWYocClpZihzKXtjLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcj10LmNyZWF0ZUZyYW1lYnVmZmVyKCksYy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXI9dC5jcmVhdGVSZW5kZXJidWZmZXIoKSx0LmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsYy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIpO2NvbnN0IGk9by5jb252ZXJ0KGwuZm9ybWF0KSxyPW8uY29udmVydChsLnR5cGUpLGE9YihsLmludGVybmFsRm9ybWF0LGkscikscz1SKGUpO3QucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLHMsYSxlLndpZHRoLGUuaGVpZ2h0KSxuLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxjLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciksdC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzNjA2NCwzNjE2MSxjLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlciksdC5iaW5kUmVuZGVyYnVmZmVyKDM2MTYxLG51bGwpLGUuZGVwdGhCdWZmZXImJihjLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcj10LmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLEkoYy5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIsZSwhMCkpLG4uYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIik7aWYoaCl7bi5iaW5kVGV4dHVyZSgzNDA2Nyx1Ll9fd2ViZ2xUZXh0dXJlKSxrKDM0MDY3LGwsbSk7Zm9yKGxldCB0PTA7dDw2O3QrKylOKGMuX193ZWJnbEZyYW1lYnVmZmVyW3RdLGUsbCwzNjA2NCwzNDA2OSt0KTt5KGwsbSkmJnYoMzQwNjcsbCxlLndpZHRoLGUuaGVpZ2h0KSxuLmJpbmRUZXh0dXJlKDM0MDY3LG51bGwpfWVsc2UgaWYoZCl7Y29uc3QgdD1lLnRleHR1cmU7Zm9yKGxldCByPTAsbz10Lmxlbmd0aDtyPG87cisrKXtjb25zdCBvPXRbcl0sYT1pLmdldChvKTtuLmJpbmRUZXh0dXJlKDM1NTMsYS5fX3dlYmdsVGV4dHVyZSksaygzNTUzLG8sbSksTihjLl9fd2ViZ2xGcmFtZWJ1ZmZlcixlLG8sMzYwNjQrciwzNTUzKSx5KG8sbSkmJnYoMzU1MyxvLGUud2lkdGgsZS5oZWlnaHQpfW4uYmluZFRleHR1cmUoMzU1MyxudWxsKX1lbHNle2xldCB0PTM1NTM7ZiYmKHM/dD1sLmlzRGF0YVRleHR1cmUzRD8zMjg3OTozNTg2Njpjb25zb2xlLndhcm4oIlRIUkVFLkRhdGFUZXh0dXJlM0QgYW5kIFRIUkVFLkRhdGFUZXh0dXJlMkRBcnJheSBvbmx5IHN1cHBvcnRlZCB3aXRoIFdlYkdMMi4iKSksbi5iaW5kVGV4dHVyZSh0LHUuX193ZWJnbFRleHR1cmUpLGsodCxsLG0pLE4oYy5fX3dlYmdsRnJhbWVidWZmZXIsZSxsLDM2MDY0LHQpLHkobCxtKSYmdih0LGwsZS53aWR0aCxlLmhlaWdodCxlLmRlcHRoKSxuLmJpbmRUZXh0dXJlKHQsbnVsbCl9ZS5kZXB0aEJ1ZmZlciYmKGZ1bmN0aW9uIGcoZSl7Y29uc3Qgcj1pLmdldChlKSxvPSEwPT09ZS5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldDtpZihlLmRlcHRoVGV4dHVyZSl7aWYobyl0aHJvdyBuZXcgRXJyb3IoInRhcmdldC5kZXB0aFRleHR1cmUgbm90IHN1cHBvcnRlZCBpbiBDdWJlIHJlbmRlciB0YXJnZXRzIik7IShmdW5jdGlvbiBhKGUscil7aWYociYmci5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCl0aHJvdyBuZXcgRXJyb3IoIkRlcHRoIFRleHR1cmUgd2l0aCBjdWJlIHJlbmRlciB0YXJnZXRzIGlzIG5vdCBzdXBwb3J0ZWQiKTtpZihuLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxlKSwhci5kZXB0aFRleHR1cmV8fCFyLmRlcHRoVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSl0aHJvdyBuZXcgRXJyb3IoInJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBUSFJFRS5EZXB0aFRleHR1cmUiKTtpLmdldChyLmRlcHRoVGV4dHVyZSkuX193ZWJnbFRleHR1cmUmJnIuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoPT09ci53aWR0aCYmci5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0PT09ci5oZWlnaHR8fChyLmRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aD1yLndpZHRoLHIuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodD1yLmhlaWdodCxyLmRlcHRoVGV4dHVyZS5uZWVkc1VwZGF0ZT0hMCksRShyLmRlcHRoVGV4dHVyZSwwKTtjb25zdCBvPWkuZ2V0KHIuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZTtpZihyLmRlcHRoVGV4dHVyZS5mb3JtYXQ9PT1kWnQpdC5mcmFtZWJ1ZmZlclRleHR1cmUyRCgzNjE2MCwzNjA5NiwzNTUzLG8sMCk7ZWxzZXtpZihyLmRlcHRoVGV4dHVyZS5mb3JtYXQhPT1wWnQpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGRlcHRoVGV4dHVyZSBmb3JtYXQiKTt0LmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDMzMzA2LDM1NTMsbywwKX19KShyLl9fd2ViZ2xGcmFtZWJ1ZmZlcixlKX1lbHNlIGlmKG8pe3IuX193ZWJnbERlcHRoYnVmZmVyPVtdO2ZvcihsZXQgaT0wO2k8NjtpKyspbi5iaW5kRnJhbWVidWZmZXIoMzYxNjAsci5fX3dlYmdsRnJhbWVidWZmZXJbaV0pLHIuX193ZWJnbERlcHRoYnVmZmVyW2ldPXQuY3JlYXRlUmVuZGVyYnVmZmVyKCksSShyLl9fd2ViZ2xEZXB0aGJ1ZmZlcltpXSxlLCExKX1lbHNlIG4uYmluZEZyYW1lYnVmZmVyKDM2MTYwLHIuX193ZWJnbEZyYW1lYnVmZmVyKSxyLl9fd2ViZ2xEZXB0aGJ1ZmZlcj10LmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLEkoci5fX3dlYmdsRGVwdGhidWZmZXIsZSwhMSk7bi5iaW5kRnJhbWVidWZmZXIoMzYxNjAsbnVsbCl9KShlKX0sdGhpcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA9ZnVuY3Rpb24gVSh0KXtjb25zdCBlPV8odCl8fHMscj0hMD09PXQuaXNXZWJHTE11bHRpcGxlUmVuZGVyVGFyZ2V0cz90LnRleHR1cmU6W3QudGV4dHVyZV07Zm9yKGxldCBvPTAsYT1yLmxlbmd0aDtvPGE7bysrKXtjb25zdCBhPXJbb107aWYoeShhLGUpKXtjb25zdCBlPXQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQ/MzQwNjc6MzU1MyxyPWkuZ2V0KGEpLl9fd2ViZ2xUZXh0dXJlO24uYmluZFRleHR1cmUoZSxyKSx2KGUsYSx0LndpZHRoLHQuaGVpZ2h0KSxuLmJpbmRUZXh0dXJlKGUsbnVsbCl9fX0sdGhpcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldD1mdW5jdGlvbiBqKGUpe2lmKGUuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KWlmKHMpe2NvbnN0IHI9ZS53aWR0aCxvPWUuaGVpZ2h0O2xldCBhPTE2Mzg0O2UuZGVwdGhCdWZmZXImJihhfD0yNTYpLGUuc3RlbmNpbEJ1ZmZlciYmKGF8PTEwMjQpO2NvbnN0IHM9aS5nZXQoZSk7bi5iaW5kRnJhbWVidWZmZXIoMzYwMDgscy5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIpLG4uYmluZEZyYW1lYnVmZmVyKDM2MDA5LHMuX193ZWJnbEZyYW1lYnVmZmVyKSx0LmJsaXRGcmFtZWJ1ZmZlcigwLDAscixvLDAsMCxyLG8sYSw5NzI4KSxuLmJpbmRGcmFtZWJ1ZmZlcigzNjAwOCxudWxsKSxuLmJpbmRGcmFtZWJ1ZmZlcigzNjAwOSxzLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcil9ZWxzZSBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFdlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFdlYkdMMi4iKX0sdGhpcy5zYWZlU2V0VGV4dHVyZTJEPWZ1bmN0aW9uIEcodCxlKXt0JiZ0LmlzV2ViR0xSZW5kZXJUYXJnZXQmJighMT09PU8mJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMVGV4dHVyZXMuc2FmZVNldFRleHR1cmUyRDogZG9uJ3QgdXNlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC4iKSxPPSEwKSx0PXQudGV4dHVyZSksRSh0LGUpfSx0aGlzLnNhZmVTZXRUZXh0dXJlQ3ViZT1mdW5jdGlvbiBXKHQsZSl7dCYmdC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCYmKCExPT09eiYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlcy5zYWZlU2V0VGV4dHVyZUN1YmU6IGRvbid0IHVzZSBjdWJlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC4iKSx6PSEwKSx0PXQudGV4dHVyZSksVCh0LGUpfX1mdW5jdGlvbiBENXQodCxlLG4pe2NvbnN0IGk9bi5pc1dlYkdMMjtyZXR1cm57Y29udmVydDpmdW5jdGlvbiByKHQpe2xldCBuO2lmKHQ9PT1yWnQpcmV0dXJuIDUxMjE7aWYoMTAxNz09PXQpcmV0dXJuIDMyODE5O2lmKDEwMTg9PT10KXJldHVybiAzMjgyMDtpZigxMDE5PT09dClyZXR1cm4gMzM2MzU7aWYoMTAxMD09PXQpcmV0dXJuIDUxMjA7aWYoMTAxMT09PXQpcmV0dXJuIDUxMjI7aWYodD09PW9adClyZXR1cm4gNTEyMztpZigxMDEzPT09dClyZXR1cm4gNTEyNDtpZih0PT09YVp0KXJldHVybiA1MTI1O2lmKHQ9PT1zWnQpcmV0dXJuIDUxMjY7aWYodD09PWxadClyZXR1cm4gaT81MTMxOihuPWUuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IiksbnVsbCE9PW4/bi5IQUxGX0ZMT0FUX09FUzpudWxsKTtpZigxMDIxPT09dClyZXR1cm4gNjQwNjtpZih0PT09dVp0KXJldHVybiA2NDA3O2lmKHQ9PT1oWnQpcmV0dXJuIDY0MDg7aWYoMTAyND09PXQpcmV0dXJuIDY0MDk7aWYoMTAyNT09PXQpcmV0dXJuIDY0MTA7aWYodD09PWRadClyZXR1cm4gNjQwMjtpZih0PT09cFp0KXJldHVybiAzNDA0MTtpZigxMDI4PT09dClyZXR1cm4gNjQwMztpZigxMDI5PT09dClyZXR1cm4gMzYyNDQ7aWYoMTAzMD09PXQpcmV0dXJuIDMzMzE5O2lmKDEwMzE9PT10KXJldHVybiAzMzMyMDtpZigxMDMyPT09dClyZXR1cm4gMzYyNDg7aWYoMTAzMz09PXQpcmV0dXJuIDM2MjQ5O2lmKHQ9PT1mWnR8fHQ9PT1tWnR8fHQ9PT1nWnR8fHQ9PT1fWnQpe2lmKG49ZS5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIiksbnVsbD09PW4pcmV0dXJuIG51bGw7aWYodD09PWZadClyZXR1cm4gbi5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUO2lmKHQ9PT1tWnQpcmV0dXJuIG4uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ7aWYodD09PWdadClyZXR1cm4gbi5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDtpZih0PT09X1p0KXJldHVybiBuLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUfWlmKHQ9PT15WnR8fHQ9PT12WnR8fHQ9PT1iWnR8fHQ9PT14WnQpe2lmKG49ZS5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpLG51bGw9PT1uKXJldHVybiBudWxsO2lmKHQ9PT15WnQpcmV0dXJuIG4uQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRztpZih0PT09dlp0KXJldHVybiBuLkNPTVBSRVNTRURfUkdCX1BWUlRDXzJCUFBWMV9JTUc7aWYodD09PWJadClyZXR1cm4gbi5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRztpZih0PT09eFp0KXJldHVybiBuLkNPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HfWlmKDM2MTk2PT09dClyZXR1cm4gbj1lLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEiKSxudWxsIT09bj9uLkNPTVBSRVNTRURfUkdCX0VUQzFfV0VCR0w6bnVsbDtpZigodD09PXdadHx8dD09PVNadCkmJihuPWUuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjIiksbnVsbCE9PW4pKXtpZih0PT09d1p0KXJldHVybiBuLkNPTVBSRVNTRURfUkdCOF9FVEMyO2lmKHQ9PT1TWnQpcmV0dXJuIG4uQ09NUFJFU1NFRF9SR0JBOF9FVEMyX0VBQ31yZXR1cm4gMzc4MDg9PT10fHwzNzgwOT09PXR8fDM3ODEwPT09dHx8Mzc4MTE9PT10fHwzNzgxMj09PXR8fDM3ODEzPT09dHx8Mzc4MTQ9PT10fHwzNzgxNT09PXR8fDM3ODE2PT09dHx8Mzc4MTc9PT10fHwzNzgxOD09PXR8fDM3ODE5PT09dHx8Mzc4MjA9PT10fHwzNzgyMT09PXR8fDM3ODQwPT09dHx8Mzc4NDE9PT10fHwzNzg0Mj09PXR8fDM3ODQzPT09dHx8Mzc4NDQ9PT10fHwzNzg0NT09PXR8fDM3ODQ2PT09dHx8Mzc4NDc9PT10fHwzNzg0OD09PXR8fDM3ODQ5PT09dHx8Mzc4NTA9PT10fHwzNzg1MT09PXR8fDM3ODUyPT09dHx8Mzc4NTM9PT10PyhuPWUuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfYXN0YyIpLG51bGwhPT1uP3Q6bnVsbCk6MzY0OTI9PT10PyhuPWUuZ2V0KCJFWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9icHRjIiksbnVsbCE9PW4/dDpudWxsKTp0PT09Y1p0P2k/MzQwNDI6KG49ZS5nZXQoIldFQkdMX2RlcHRoX3RleHR1cmUiKSxudWxsIT09bj9uLlVOU0lHTkVEX0lOVF8yNF84X1dFQkdMOm51bGwpOnZvaWQgMH19fUk1dC5wcm90b3R5cGUuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbD0hMDtjbGFzcyBCNXQgZXh0ZW5kcyBxMXR7Y29uc3RydWN0b3IodD1bXSl7c3VwZXIoKSx0aGlzLmNhbWVyYXM9dH19QjV0LnByb3RvdHlwZS5pc0FycmF5Q2FtZXJhPSEwO2NsYXNzIEg1dCBleHRlbmRzIGtRdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy50eXBlPSJHcm91cCJ9fUg1dC5wcm90b3R5cGUuaXNHcm91cD0hMDtjb25zdCBGNXQ9e3R5cGU6Im1vdmUifTtjbGFzcyBWNXR7Y29uc3RydWN0b3IoKXt0aGlzLl90YXJnZXRSYXk9bnVsbCx0aGlzLl9ncmlwPW51bGwsdGhpcy5faGFuZD1udWxsfWdldEhhbmRTcGFjZSgpe3JldHVybiBudWxsPT09dGhpcy5faGFuZCYmKHRoaXMuX2hhbmQ9bmV3IEg1dCx0aGlzLl9oYW5kLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5faGFuZC52aXNpYmxlPSExLHRoaXMuX2hhbmQuam9pbnRzPXt9LHRoaXMuX2hhbmQuaW5wdXRTdGF0ZT17cGluY2hpbmc6ITF9KSx0aGlzLl9oYW5kfWdldFRhcmdldFJheVNwYWNlKCl7cmV0dXJuIG51bGw9PT10aGlzLl90YXJnZXRSYXkmJih0aGlzLl90YXJnZXRSYXk9bmV3IEg1dCx0aGlzLl90YXJnZXRSYXkubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLl90YXJnZXRSYXkudmlzaWJsZT0hMSx0aGlzLl90YXJnZXRSYXkuaGFzTGluZWFyVmVsb2NpdHk9ITEsdGhpcy5fdGFyZ2V0UmF5LmxpbmVhclZlbG9jaXR5PW5ldyBDSnQsdGhpcy5fdGFyZ2V0UmF5Lmhhc0FuZ3VsYXJWZWxvY2l0eT0hMSx0aGlzLl90YXJnZXRSYXkuYW5ndWxhclZlbG9jaXR5PW5ldyBDSnQpLHRoaXMuX3RhcmdldFJheX1nZXRHcmlwU3BhY2UoKXtyZXR1cm4gbnVsbD09PXRoaXMuX2dyaXAmJih0aGlzLl9ncmlwPW5ldyBINXQsdGhpcy5fZ3JpcC5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuX2dyaXAudmlzaWJsZT0hMSx0aGlzLl9ncmlwLmhhc0xpbmVhclZlbG9jaXR5PSExLHRoaXMuX2dyaXAubGluZWFyVmVsb2NpdHk9bmV3IENKdCx0aGlzLl9ncmlwLmhhc0FuZ3VsYXJWZWxvY2l0eT0hMSx0aGlzLl9ncmlwLmFuZ3VsYXJWZWxvY2l0eT1uZXcgQ0p0KSx0aGlzLl9ncmlwfWRpc3BhdGNoRXZlbnQodCl7cmV0dXJuIG51bGwhPT10aGlzLl90YXJnZXRSYXkmJnRoaXMuX3RhcmdldFJheS5kaXNwYXRjaEV2ZW50KHQpLG51bGwhPT10aGlzLl9ncmlwJiZ0aGlzLl9ncmlwLmRpc3BhdGNoRXZlbnQodCksbnVsbCE9PXRoaXMuX2hhbmQmJnRoaXMuX2hhbmQuZGlzcGF0Y2hFdmVudCh0KSx0aGlzfWRpc2Nvbm5lY3QodCl7cmV0dXJuIHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzY29ubmVjdGVkIixkYXRhOnR9KSxudWxsIT09dGhpcy5fdGFyZ2V0UmF5JiYodGhpcy5fdGFyZ2V0UmF5LnZpc2libGU9ITEpLG51bGwhPT10aGlzLl9ncmlwJiYodGhpcy5fZ3JpcC52aXNpYmxlPSExKSxudWxsIT09dGhpcy5faGFuZCYmKHRoaXMuX2hhbmQudmlzaWJsZT0hMSksdGhpc311cGRhdGUodCxlLG4pe2xldCBpPW51bGwscj1udWxsLG89bnVsbDtjb25zdCBhPXRoaXMuX3RhcmdldFJheSxzPXRoaXMuX2dyaXAsbD10aGlzLl9oYW5kO2lmKHQmJiJ2aXNpYmxlLWJsdXJyZWQiIT09ZS5zZXNzaW9uLnZpc2liaWxpdHlTdGF0ZSlpZihudWxsIT09YSYmKGk9ZS5nZXRQb3NlKHQudGFyZ2V0UmF5U3BhY2UsbiksbnVsbCE9PWkmJihhLm1hdHJpeC5mcm9tQXJyYXkoaS50cmFuc2Zvcm0ubWF0cml4KSxhLm1hdHJpeC5kZWNvbXBvc2UoYS5wb3NpdGlvbixhLnJvdGF0aW9uLGEuc2NhbGUpLGkubGluZWFyVmVsb2NpdHk/KGEuaGFzTGluZWFyVmVsb2NpdHk9ITAsYS5saW5lYXJWZWxvY2l0eS5jb3B5KGkubGluZWFyVmVsb2NpdHkpKTphLmhhc0xpbmVhclZlbG9jaXR5PSExLGkuYW5ndWxhclZlbG9jaXR5PyhhLmhhc0FuZ3VsYXJWZWxvY2l0eT0hMCxhLmFuZ3VsYXJWZWxvY2l0eS5jb3B5KGkuYW5ndWxhclZlbG9jaXR5KSk6YS5oYXNBbmd1bGFyVmVsb2NpdHk9ITEsdGhpcy5kaXNwYXRjaEV2ZW50KEY1dCkpKSxsJiZ0LmhhbmQpe289ITA7Zm9yKGNvbnN0IGkgb2YgdC5oYW5kLnZhbHVlcygpKXtjb25zdCB0PWUuZ2V0Sm9pbnRQb3NlKGksbik7aWYodm9pZCAwPT09bC5qb2ludHNbaS5qb2ludE5hbWVdKXtjb25zdCB0PW5ldyBINXQ7dC5tYXRyaXhBdXRvVXBkYXRlPSExLHQudmlzaWJsZT0hMSxsLmpvaW50c1tpLmpvaW50TmFtZV09dCxsLmFkZCh0KX1jb25zdCByPWwuam9pbnRzW2kuam9pbnROYW1lXTtudWxsIT09dCYmKHIubWF0cml4LmZyb21BcnJheSh0LnRyYW5zZm9ybS5tYXRyaXgpLHIubWF0cml4LmRlY29tcG9zZShyLnBvc2l0aW9uLHIucm90YXRpb24sci5zY2FsZSksci5qb2ludFJhZGl1cz10LnJhZGl1cyksci52aXNpYmxlPW51bGwhPT10fWNvbnN0IGk9bC5qb2ludHNbImluZGV4LWZpbmdlci10aXAiXS5wb3NpdGlvbi5kaXN0YW5jZVRvKGwuam9pbnRzWyJ0aHVtYi10aXAiXS5wb3NpdGlvbikscj0uMDIsYT0uMDA1O2wuaW5wdXRTdGF0ZS5waW5jaGluZyYmaT5yK2E/KGwuaW5wdXRTdGF0ZS5waW5jaGluZz0hMSx0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6InBpbmNoZW5kIixoYW5kZWRuZXNzOnQuaGFuZGVkbmVzcyx0YXJnZXQ6dGhpc30pKTohbC5pbnB1dFN0YXRlLnBpbmNoaW5nJiZpPD1yLWEmJihsLmlucHV0U3RhdGUucGluY2hpbmc9ITAsdGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJwaW5jaHN0YXJ0IixoYW5kZWRuZXNzOnQuaGFuZGVkbmVzcyx0YXJnZXQ6dGhpc30pKX1lbHNlIG51bGwhPT1zJiZ0LmdyaXBTcGFjZSYmKHI9ZS5nZXRQb3NlKHQuZ3JpcFNwYWNlLG4pLG51bGwhPT1yJiYocy5tYXRyaXguZnJvbUFycmF5KHIudHJhbnNmb3JtLm1hdHJpeCkscy5tYXRyaXguZGVjb21wb3NlKHMucG9zaXRpb24scy5yb3RhdGlvbixzLnNjYWxlKSxyLmxpbmVhclZlbG9jaXR5PyhzLmhhc0xpbmVhclZlbG9jaXR5PSEwLHMubGluZWFyVmVsb2NpdHkuY29weShyLmxpbmVhclZlbG9jaXR5KSk6cy5oYXNMaW5lYXJWZWxvY2l0eT0hMSxyLmFuZ3VsYXJWZWxvY2l0eT8ocy5oYXNBbmd1bGFyVmVsb2NpdHk9ITAscy5hbmd1bGFyVmVsb2NpdHkuY29weShyLmFuZ3VsYXJWZWxvY2l0eSkpOnMuaGFzQW5ndWxhclZlbG9jaXR5PSExKSk7cmV0dXJuIG51bGwhPT1hJiYoYS52aXNpYmxlPW51bGwhPT1pKSxudWxsIT09cyYmKHMudmlzaWJsZT1udWxsIT09ciksbnVsbCE9PWwmJihsLnZpc2libGU9bnVsbCE9PW8pLHRoaXN9fWNsYXNzIFU1dCBleHRlbmRzIGpadHtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCk7Y29uc3Qgbj10aGlzLGk9dC5zdGF0ZTtsZXQgcj1udWxsLG89MSxhPW51bGwscz0ibG9jYWwtZmxvb3IiLGw9bnVsbCxjPW51bGwsdT1udWxsLGg9bnVsbCxkPW51bGw7Y29uc3QgcD1bXSxmPW5ldyBNYXAsbT1uZXcgcTF0O20ubGF5ZXJzLmVuYWJsZSgxKSxtLnZpZXdwb3J0PW5ldyB3SnQ7Y29uc3QgZz1uZXcgcTF0O2cubGF5ZXJzLmVuYWJsZSgyKSxnLnZpZXdwb3J0PW5ldyB3SnQ7Y29uc3QgXz1bbSxnXSx5PW5ldyBCNXQ7eS5sYXllcnMuZW5hYmxlKDEpLHkubGF5ZXJzLmVuYWJsZSgyKTtsZXQgdj1udWxsLGI9bnVsbDtmdW5jdGlvbiB4KHQpe2NvbnN0IGU9Zi5nZXQodC5pbnB1dFNvdXJjZSk7ZSYmZS5kaXNwYXRjaEV2ZW50KHt0eXBlOnQudHlwZSxkYXRhOnQuaW5wdXRTb3VyY2V9KX1mdW5jdGlvbiB3KCl7Zi5mb3JFYWNoKChmdW5jdGlvbih0LGUpe3QuZGlzY29ubmVjdChlKX0pKSxmLmNsZWFyKCksdj1udWxsLGI9bnVsbCxpLmJpbmRYUkZyYW1lYnVmZmVyKG51bGwpLHQuc2V0UmVuZGVyVGFyZ2V0KHQuZ2V0UmVuZGVyVGFyZ2V0KCkpLEEuc3RvcCgpLG4uaXNQcmVzZW50aW5nPSExLG4uZGlzcGF0Y2hFdmVudCh7dHlwZToic2Vzc2lvbmVuZCJ9KX1mdW5jdGlvbiBTKHQpe2NvbnN0IGU9ci5pbnB1dFNvdXJjZXM7Zm9yKGxldCB0PTA7dDxwLmxlbmd0aDt0KyspZi5zZXQoZVt0XSxwW3RdKTtmb3IobGV0IGU9MDtlPHQucmVtb3ZlZC5sZW5ndGg7ZSsrKXtjb25zdCBuPXQucmVtb3ZlZFtlXSxpPWYuZ2V0KG4pO2kmJihpLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc2Nvbm5lY3RlZCIsZGF0YTpufSksZi5kZWxldGUobikpfWZvcihsZXQgZT0wO2U8dC5hZGRlZC5sZW5ndGg7ZSsrKXtjb25zdCBuPXQuYWRkZWRbZV0saT1mLmdldChuKTtpJiZpLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImNvbm5lY3RlZCIsZGF0YTpufSl9fXRoaXMuY2FtZXJhQXV0b1VwZGF0ZT0hMCx0aGlzLmVuYWJsZWQ9ITEsdGhpcy5pc1ByZXNlbnRpbmc9ITEsdGhpcy5nZXRDb250cm9sbGVyPWZ1bmN0aW9uKHQpe2xldCBlPXBbdF07cmV0dXJuIHZvaWQgMD09PWUmJihlPW5ldyBWNXQscFt0XT1lKSxlLmdldFRhcmdldFJheVNwYWNlKCl9LHRoaXMuZ2V0Q29udHJvbGxlckdyaXA9ZnVuY3Rpb24odCl7bGV0IGU9cFt0XTtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9bmV3IFY1dCxwW3RdPWUpLGUuZ2V0R3JpcFNwYWNlKCl9LHRoaXMuZ2V0SGFuZD1mdW5jdGlvbih0KXtsZXQgZT1wW3RdO3JldHVybiB2b2lkIDA9PT1lJiYoZT1uZXcgVjV0LHBbdF09ZSksZS5nZXRIYW5kU3BhY2UoKX0sdGhpcy5zZXRGcmFtZWJ1ZmZlclNjYWxlRmFjdG9yPWZ1bmN0aW9uKHQpe289dCwhMD09PW4uaXNQcmVzZW50aW5nJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYlhSTWFuYWdlcjogQ2Fubm90IGNoYW5nZSBmcmFtZWJ1ZmZlciBzY2FsZSB3aGlsZSBwcmVzZW50aW5nLiIpfSx0aGlzLnNldFJlZmVyZW5jZVNwYWNlVHlwZT1mdW5jdGlvbih0KXtzPXQsITA9PT1uLmlzUHJlc2VudGluZyYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IENhbm5vdCBjaGFuZ2UgcmVmZXJlbmNlIHNwYWNlIHR5cGUgd2hpbGUgcHJlc2VudGluZy4iKX0sdGhpcy5nZXRSZWZlcmVuY2VTcGFjZT1mdW5jdGlvbigpe3JldHVybiBhfSx0aGlzLmdldFNlc3Npb249ZnVuY3Rpb24oKXtyZXR1cm4gcn0sdGhpcy5zZXRTZXNzaW9uPWFzeW5jIGZ1bmN0aW9uKHQpe2lmKHI9dCxudWxsIT09cil7ci5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3QiLHgpLHIuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0c3RhcnQiLHgpLHIuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0ZW5kIix4KSxyLmFkZEV2ZW50TGlzdGVuZXIoInNxdWVlemUiLHgpLHIuYWRkRXZlbnRMaXN0ZW5lcigic3F1ZWV6ZXN0YXJ0Iix4KSxyLmFkZEV2ZW50TGlzdGVuZXIoInNxdWVlemVlbmQiLHgpLHIuYWRkRXZlbnRMaXN0ZW5lcigiZW5kIix3KSxyLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0c291cmNlc2NoYW5nZSIsUyk7Y29uc3QgdD1lLmdldENvbnRleHRBdHRyaWJ1dGVzKCk7aWYoITAhPT10LnhyQ29tcGF0aWJsZSYmYXdhaXQgZS5tYWtlWFJDb21wYXRpYmxlKCksdm9pZCAwPT09ci5yZW5kZXJTdGF0ZS5sYXllcnMpZD1uZXcgWFJXZWJHTExheWVyKHIsZSx7YW50aWFsaWFzOnQuYW50aWFsaWFzLGFscGhhOnQuYWxwaGEsZGVwdGg6dC5kZXB0aCxzdGVuY2lsOnQuc3RlbmNpbCxmcmFtZWJ1ZmZlclNjYWxlRmFjdG9yOm99KSxyLnVwZGF0ZVJlbmRlclN0YXRlKHtiYXNlTGF5ZXI6ZH0pO2Vsc2V7bGV0IG49MDtpZih0LmFudGlhbGlhcylkPW5ldyBYUldlYkdMTGF5ZXIocixlLHthbnRpYWxpYXM6ITAsYWxwaGE6dC5hbHBoYSxkZXB0aDp0LmRlcHRoLHN0ZW5jaWw6dC5zdGVuY2lsLGZyYW1lYnVmZmVyU2NhbGVGYWN0b3I6b30pLHIudXBkYXRlUmVuZGVyU3RhdGUoe2xheWVyczpbZF19KTtlbHNle3QuZGVwdGgmJihuPXQuc3RlbmNpbD8zNDA0MTo2NDAyKTtjb25zdCBpPXtjb2xvckZvcm1hdDp0LmFscGhhPzY0MDg6NjQwNyxkZXB0aEZvcm1hdDpuLHNjYWxlRmFjdG9yOm99O2M9bmV3IFhSV2ViR0xCaW5kaW5nKHIsZSksaD1jLmNyZWF0ZVByb2plY3Rpb25MYXllcihpKSx1PWUuY3JlYXRlRnJhbWVidWZmZXIoKSxyLnVwZGF0ZVJlbmRlclN0YXRlKHtsYXllcnM6W2hdfSl9fWE9YXdhaXQgci5yZXF1ZXN0UmVmZXJlbmNlU3BhY2UocyksQS5zZXRDb250ZXh0KHIpLEEuc3RhcnQoKSxuLmlzUHJlc2VudGluZz0hMCxuLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25zdGFydCJ9KX19O2NvbnN0IE09bmV3IENKdCxFPW5ldyBDSnQ7ZnVuY3Rpb24gVCh0LGUpe251bGw9PT1lP3QubWF0cml4V29ybGQuY29weSh0Lm1hdHJpeCk6dC5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKGUubWF0cml4V29ybGQsdC5tYXRyaXgpLHQubWF0cml4V29ybGRJbnZlcnNlLmNvcHkodC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCl9dGhpcy51cGRhdGVDYW1lcmE9ZnVuY3Rpb24odCl7aWYobnVsbD09PXIpcmV0dXJuO3kubmVhcj1nLm5lYXI9bS5uZWFyPXQubmVhcix5LmZhcj1nLmZhcj1tLmZhcj10LmZhcix2PT09eS5uZWFyJiZiPT09eS5mYXJ8fChyLnVwZGF0ZVJlbmRlclN0YXRlKHtkZXB0aE5lYXI6eS5uZWFyLGRlcHRoRmFyOnkuZmFyfSksdj15Lm5lYXIsYj15LmZhcik7Y29uc3QgZT10LnBhcmVudCxuPXkuY2FtZXJhcztUKHksZSk7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0KyspVChuW3RdLGUpO3kubWF0cml4V29ybGQuZGVjb21wb3NlKHkucG9zaXRpb24seS5xdWF0ZXJuaW9uLHkuc2NhbGUpLHQucG9zaXRpb24uY29weSh5LnBvc2l0aW9uKSx0LnF1YXRlcm5pb24uY29weSh5LnF1YXRlcm5pb24pLHQuc2NhbGUuY29weSh5LnNjYWxlKSx0Lm1hdHJpeC5jb3B5KHkubWF0cml4KSx0Lm1hdHJpeFdvcmxkLmNvcHkoeS5tYXRyaXhXb3JsZCk7Y29uc3QgaT10LmNoaWxkcmVuO2ZvcihsZXQgdD0wLGU9aS5sZW5ndGg7dDxlO3QrKylpW3RdLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTsyPT09bi5sZW5ndGg/KGZ1bmN0aW9uIG8odCxlLG4pe00uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGUubWF0cml4V29ybGQpLEUuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG4ubWF0cml4V29ybGQpO2NvbnN0IGk9TS5kaXN0YW5jZVRvKEUpLHI9ZS5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzLG89bi5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzLGE9clsxNF0vKHJbMTBdLTEpLHM9clsxNF0vKHJbMTBdKzEpLGw9KHJbOV0rMSkvcls1XSxjPShyWzldLTEpL3JbNV0sdT0ocls4XS0xKS9yWzBdLGg9KG9bOF0rMSkvb1swXSxkPWEqdSxwPWEqaCxmPWkvKC11K2gpLG09ZiotdTtlLm1hdHJpeFdvcmxkLmRlY29tcG9zZSh0LnBvc2l0aW9uLHQucXVhdGVybmlvbix0LnNjYWxlKSx0LnRyYW5zbGF0ZVgobSksdC50cmFuc2xhdGVaKGYpLHQubWF0cml4V29ybGQuY29tcG9zZSh0LnBvc2l0aW9uLHQucXVhdGVybmlvbix0LnNjYWxlKSx0Lm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KHQubWF0cml4V29ybGQpLmludmVydCgpO2NvbnN0IGc9YStmLF89cytmO3QucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUoZC1tLHArKGktbSksbCpzL18qZyxjKnMvXypnLGcsXyl9KSh5LG0sZyk6eS5wcm9qZWN0aW9uTWF0cml4LmNvcHkobS5wcm9qZWN0aW9uTWF0cml4KX0sdGhpcy5nZXRDYW1lcmE9ZnVuY3Rpb24oKXtyZXR1cm4geX0sdGhpcy5nZXRGb3ZlYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PWg/aC5maXhlZEZvdmVhdGlvbjpudWxsIT09ZD9kLmZpeGVkRm92ZWF0aW9uOnZvaWQgMH0sdGhpcy5zZXRGb3ZlYXRpb249ZnVuY3Rpb24odCl7bnVsbCE9PWgmJihoLmZpeGVkRm92ZWF0aW9uPXQpLG51bGwhPT1kJiZ2b2lkIDAhPT1kLmZpeGVkRm92ZWF0aW9uJiYoZC5maXhlZEZvdmVhdGlvbj10KX07bGV0IEM9bnVsbDtjb25zdCBBPW5ldyByMHQ7QS5zZXRBbmltYXRpb25Mb29wKChmdW5jdGlvbiBrKHQsbil7aWYobD1uLmdldFZpZXdlclBvc2UoYSksbnVsbCE9PWwpe2NvbnN0IHQ9bC52aWV3cztudWxsIT09ZCYmaS5iaW5kWFJGcmFtZWJ1ZmZlcihkLmZyYW1lYnVmZmVyKTtsZXQgbj0hMTt0Lmxlbmd0aCE9PXkuY2FtZXJhcy5sZW5ndGgmJih5LmNhbWVyYXMubGVuZ3RoPTAsbj0hMCk7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspe2NvbnN0IG89dFtyXTtsZXQgYT1udWxsO2lmKG51bGwhPT1kKWE9ZC5nZXRWaWV3cG9ydChvKTtlbHNle2NvbnN0IHQ9Yy5nZXRWaWV3U3ViSW1hZ2UoaCxvKTtpLmJpbmRYUkZyYW1lYnVmZmVyKHUpLHZvaWQgMCE9PXQuZGVwdGhTdGVuY2lsVGV4dHVyZSYmZS5mcmFtZWJ1ZmZlclRleHR1cmUyRCgzNjE2MCwzNjA5NiwzNTUzLHQuZGVwdGhTdGVuY2lsVGV4dHVyZSwwKSxlLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDM2MDY0LDM1NTMsdC5jb2xvclRleHR1cmUsMCksYT10LnZpZXdwb3J0fWNvbnN0IHM9X1tyXTtzLm1hdHJpeC5mcm9tQXJyYXkoby50cmFuc2Zvcm0ubWF0cml4KSxzLnByb2plY3Rpb25NYXRyaXguZnJvbUFycmF5KG8ucHJvamVjdGlvbk1hdHJpeCkscy52aWV3cG9ydC5zZXQoYS54LGEueSxhLndpZHRoLGEuaGVpZ2h0KSwwPT09ciYmeS5tYXRyaXguY29weShzLm1hdHJpeCksITA9PT1uJiZ5LmNhbWVyYXMucHVzaChzKX19Y29uc3Qgbz1yLmlucHV0U291cmNlcztmb3IobGV0IHQ9MDt0PHAubGVuZ3RoO3QrKylwW3RdLnVwZGF0ZShvW3RdLG4sYSk7QyYmQyh0LG4pfSkpLHRoaXMuc2V0QW5pbWF0aW9uTG9vcD1mdW5jdGlvbih0KXtDPXR9LHRoaXMuZGlzcG9zZT1mdW5jdGlvbigpe319fWZ1bmN0aW9uIGo1dCh0KXtmdW5jdGlvbiBlKGUsbil7ZS5vcGFjaXR5LnZhbHVlPW4ub3BhY2l0eSxuLmNvbG9yJiZlLmRpZmZ1c2UudmFsdWUuY29weShuLmNvbG9yKSxuLmVtaXNzaXZlJiZlLmVtaXNzaXZlLnZhbHVlLmNvcHkobi5lbWlzc2l2ZSkubXVsdGlwbHlTY2FsYXIobi5lbWlzc2l2ZUludGVuc2l0eSksbi5tYXAmJihlLm1hcC52YWx1ZT1uLm1hcCksbi5hbHBoYU1hcCYmKGUuYWxwaGFNYXAudmFsdWU9bi5hbHBoYU1hcCksbi5zcGVjdWxhck1hcCYmKGUuc3BlY3VsYXJNYXAudmFsdWU9bi5zcGVjdWxhck1hcCk7Y29uc3QgaT10LmdldChuKS5lbnZNYXA7aWYoaSl7ZS5lbnZNYXAudmFsdWU9aSxlLmZsaXBFbnZNYXAudmFsdWU9aS5pc0N1YmVUZXh0dXJlJiYhMT09PWkuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPy0xOjEsZS5yZWZsZWN0aXZpdHkudmFsdWU9bi5yZWZsZWN0aXZpdHksZS5yZWZyYWN0aW9uUmF0aW8udmFsdWU9bi5yZWZyYWN0aW9uUmF0aW87Y29uc3Qgcj10LmdldChpKS5fX21heE1pcExldmVsO3ZvaWQgMCE9PXImJihlLm1heE1pcExldmVsLnZhbHVlPXIpfWxldCByLG87bi5saWdodE1hcCYmKGUubGlnaHRNYXAudmFsdWU9bi5saWdodE1hcCxlLmxpZ2h0TWFwSW50ZW5zaXR5LnZhbHVlPW4ubGlnaHRNYXBJbnRlbnNpdHkpLG4uYW9NYXAmJihlLmFvTWFwLnZhbHVlPW4uYW9NYXAsZS5hb01hcEludGVuc2l0eS52YWx1ZT1uLmFvTWFwSW50ZW5zaXR5KSxuLm1hcD9yPW4ubWFwOm4uc3BlY3VsYXJNYXA/cj1uLnNwZWN1bGFyTWFwOm4uZGlzcGxhY2VtZW50TWFwP3I9bi5kaXNwbGFjZW1lbnRNYXA6bi5ub3JtYWxNYXA/cj1uLm5vcm1hbE1hcDpuLmJ1bXBNYXA/cj1uLmJ1bXBNYXA6bi5yb3VnaG5lc3NNYXA/cj1uLnJvdWdobmVzc01hcDpuLm1ldGFsbmVzc01hcD9yPW4ubWV0YWxuZXNzTWFwOm4uYWxwaGFNYXA/cj1uLmFscGhhTWFwOm4uZW1pc3NpdmVNYXA/cj1uLmVtaXNzaXZlTWFwOm4uY2xlYXJjb2F0TWFwP3I9bi5jbGVhcmNvYXRNYXA6bi5jbGVhcmNvYXROb3JtYWxNYXA/cj1uLmNsZWFyY29hdE5vcm1hbE1hcDpuLmNsZWFyY29hdFJvdWdobmVzc01hcD9yPW4uY2xlYXJjb2F0Um91Z2huZXNzTWFwOm4uc3BlY3VsYXJJbnRlbnNpdHlNYXA/cj1uLnNwZWN1bGFySW50ZW5zaXR5TWFwOm4uc3BlY3VsYXJUaW50TWFwJiYocj1uLnNwZWN1bGFyVGludE1hcCksdm9pZCAwIT09ciYmKHIuaXNXZWJHTFJlbmRlclRhcmdldCYmKHI9ci50ZXh0dXJlKSwhMD09PXIubWF0cml4QXV0b1VwZGF0ZSYmci51cGRhdGVNYXRyaXgoKSxlLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoci5tYXRyaXgpKSxuLmFvTWFwP289bi5hb01hcDpuLmxpZ2h0TWFwJiYobz1uLmxpZ2h0TWFwKSx2b2lkIDAhPT1vJiYoby5pc1dlYkdMUmVuZGVyVGFyZ2V0JiYobz1vLnRleHR1cmUpLCEwPT09by5tYXRyaXhBdXRvVXBkYXRlJiZvLnVwZGF0ZU1hdHJpeCgpLGUudXYyVHJhbnNmb3JtLnZhbHVlLmNvcHkoby5tYXRyaXgpKX1mdW5jdGlvbiBuKGUsbil7ZS5yb3VnaG5lc3MudmFsdWU9bi5yb3VnaG5lc3MsZS5tZXRhbG5lc3MudmFsdWU9bi5tZXRhbG5lc3Msbi5yb3VnaG5lc3NNYXAmJihlLnJvdWdobmVzc01hcC52YWx1ZT1uLnJvdWdobmVzc01hcCksbi5tZXRhbG5lc3NNYXAmJihlLm1ldGFsbmVzc01hcC52YWx1ZT1uLm1ldGFsbmVzc01hcCksbi5lbWlzc2l2ZU1hcCYmKGUuZW1pc3NpdmVNYXAudmFsdWU9bi5lbWlzc2l2ZU1hcCksbi5idW1wTWFwJiYoZS5idW1wTWFwLnZhbHVlPW4uYnVtcE1hcCxlLmJ1bXBTY2FsZS52YWx1ZT1uLmJ1bXBTY2FsZSwxPT09bi5zaWRlJiYoZS5idW1wU2NhbGUudmFsdWUqPS0xKSksbi5ub3JtYWxNYXAmJihlLm5vcm1hbE1hcC52YWx1ZT1uLm5vcm1hbE1hcCxlLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkobi5ub3JtYWxTY2FsZSksMT09PW4uc2lkZSYmZS5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKSksbi5kaXNwbGFjZW1lbnRNYXAmJihlLmRpc3BsYWNlbWVudE1hcC52YWx1ZT1uLmRpc3BsYWNlbWVudE1hcCxlLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPW4uZGlzcGxhY2VtZW50U2NhbGUsZS5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPW4uZGlzcGxhY2VtZW50QmlhcyksdC5nZXQobikuZW52TWFwJiYoZS5lbnZNYXBJbnRlbnNpdHkudmFsdWU9bi5lbnZNYXBJbnRlbnNpdHkpfXJldHVybntyZWZyZXNoRm9nVW5pZm9ybXM6ZnVuY3Rpb24gaSh0LGUpe3QuZm9nQ29sb3IudmFsdWUuY29weShlLmNvbG9yKSxlLmlzRm9nPyh0LmZvZ05lYXIudmFsdWU9ZS5uZWFyLHQuZm9nRmFyLnZhbHVlPWUuZmFyKTplLmlzRm9nRXhwMiYmKHQuZm9nRGVuc2l0eS52YWx1ZT1lLmRlbnNpdHkpfSxyZWZyZXNoTWF0ZXJpYWxVbmlmb3JtczpmdW5jdGlvbiByKHQsaSxvLGEscyl7aS5pc01lc2hCYXNpY01hdGVyaWFsP2UodCxpKTppLmlzTWVzaExhbWJlcnRNYXRlcmlhbD8oZSh0LGkpLChmdW5jdGlvbiBsKHQsZSl7ZS5lbWlzc2l2ZU1hcCYmKHQuZW1pc3NpdmVNYXAudmFsdWU9ZS5lbWlzc2l2ZU1hcCl9KSh0LGkpKTppLmlzTWVzaFRvb25NYXRlcmlhbD8oZSh0LGkpLChmdW5jdGlvbiBjKHQsZSl7ZS5ncmFkaWVudE1hcCYmKHQuZ3JhZGllbnRNYXAudmFsdWU9ZS5ncmFkaWVudE1hcCksZS5lbWlzc2l2ZU1hcCYmKHQuZW1pc3NpdmVNYXAudmFsdWU9ZS5lbWlzc2l2ZU1hcCksZS5idW1wTWFwJiYodC5idW1wTWFwLnZhbHVlPWUuYnVtcE1hcCx0LmJ1bXBTY2FsZS52YWx1ZT1lLmJ1bXBTY2FsZSwxPT09ZS5zaWRlJiYodC5idW1wU2NhbGUudmFsdWUqPS0xKSksZS5ub3JtYWxNYXAmJih0Lm5vcm1hbE1hcC52YWx1ZT1lLm5vcm1hbE1hcCx0Lm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoZS5ub3JtYWxTY2FsZSksMT09PWUuc2lkZSYmdC5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKSksZS5kaXNwbGFjZW1lbnRNYXAmJih0LmRpc3BsYWNlbWVudE1hcC52YWx1ZT1lLmRpc3BsYWNlbWVudE1hcCx0LmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWUuZGlzcGxhY2VtZW50U2NhbGUsdC5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPWUuZGlzcGxhY2VtZW50Qmlhcyl9KSh0LGkpKTppLmlzTWVzaFBob25nTWF0ZXJpYWw/KGUodCxpKSwoZnVuY3Rpb24gdSh0LGUpe3Quc3BlY3VsYXIudmFsdWUuY29weShlLnNwZWN1bGFyKSx0LnNoaW5pbmVzcy52YWx1ZT1NYXRoLm1heChlLnNoaW5pbmVzcywxZS00KSxlLmVtaXNzaXZlTWFwJiYodC5lbWlzc2l2ZU1hcC52YWx1ZT1lLmVtaXNzaXZlTWFwKSxlLmJ1bXBNYXAmJih0LmJ1bXBNYXAudmFsdWU9ZS5idW1wTWFwLHQuYnVtcFNjYWxlLnZhbHVlPWUuYnVtcFNjYWxlLDE9PT1lLnNpZGUmJih0LmJ1bXBTY2FsZS52YWx1ZSo9LTEpKSxlLm5vcm1hbE1hcCYmKHQubm9ybWFsTWFwLnZhbHVlPWUubm9ybWFsTWFwLHQubm9ybWFsU2NhbGUudmFsdWUuY29weShlLm5vcm1hbFNjYWxlKSwxPT09ZS5zaWRlJiZ0Lm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKSxlLmRpc3BsYWNlbWVudE1hcCYmKHQuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWUuZGlzcGxhY2VtZW50TWFwLHQuZGlzcGxhY2VtZW50U2NhbGUudmFsdWU9ZS5kaXNwbGFjZW1lbnRTY2FsZSx0LmRpc3BsYWNlbWVudEJpYXMudmFsdWU9ZS5kaXNwbGFjZW1lbnRCaWFzKX0pKHQsaSkpOmkuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD8oZSh0LGkpLGkuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbD8oZnVuY3Rpb24gaCh0LGUsaSl7bih0LGUpLHQucmVmbGVjdGl2aXR5LnZhbHVlPWUucmVmbGVjdGl2aXR5LHQuY2xlYXJjb2F0LnZhbHVlPWUuY2xlYXJjb2F0LHQuY2xlYXJjb2F0Um91Z2huZXNzLnZhbHVlPWUuY2xlYXJjb2F0Um91Z2huZXNzLGUuc2hlZW4mJnQuc2hlZW4udmFsdWUuY29weShlLnNoZWVuKSxlLmNsZWFyY29hdE1hcCYmKHQuY2xlYXJjb2F0TWFwLnZhbHVlPWUuY2xlYXJjb2F0TWFwKSxlLmNsZWFyY29hdFJvdWdobmVzc01hcCYmKHQuY2xlYXJjb2F0Um91Z2huZXNzTWFwLnZhbHVlPWUuY2xlYXJjb2F0Um91Z2huZXNzTWFwKSxlLmNsZWFyY29hdE5vcm1hbE1hcCYmKHQuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudmFsdWUuY29weShlLmNsZWFyY29hdE5vcm1hbFNjYWxlKSx0LmNsZWFyY29hdE5vcm1hbE1hcC52YWx1ZT1lLmNsZWFyY29hdE5vcm1hbE1hcCwxPT09ZS5zaWRlJiZ0LmNsZWFyY29hdE5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKSx0LnRyYW5zbWlzc2lvbi52YWx1ZT1lLnRyYW5zbWlzc2lvbixlLnRyYW5zbWlzc2lvbk1hcCYmKHQudHJhbnNtaXNzaW9uTWFwLnZhbHVlPWUudHJhbnNtaXNzaW9uTWFwKSxlLnRyYW5zbWlzc2lvbj4wJiYodC50cmFuc21pc3Npb25TYW1wbGVyTWFwLnZhbHVlPWkudGV4dHVyZSx0LnRyYW5zbWlzc2lvblNhbXBsZXJTaXplLnZhbHVlLnNldChpLndpZHRoLGkuaGVpZ2h0KSksdC50aGlja25lc3MudmFsdWU9ZS50aGlja25lc3MsZS50aGlja25lc3NNYXAmJih0LnRoaWNrbmVzc01hcC52YWx1ZT1lLnRoaWNrbmVzc01hcCksdC5hdHRlbnVhdGlvbkRpc3RhbmNlLnZhbHVlPWUuYXR0ZW51YXRpb25EaXN0YW5jZSx0LmF0dGVudWF0aW9uVGludC52YWx1ZS5jb3B5KGUuYXR0ZW51YXRpb25UaW50KSx0LnNwZWN1bGFySW50ZW5zaXR5LnZhbHVlPWUuc3BlY3VsYXJJbnRlbnNpdHksdC5zcGVjdWxhclRpbnQudmFsdWUuY29weShlLnNwZWN1bGFyVGludCksZS5zcGVjdWxhckludGVuc2l0eU1hcCYmKHQuc3BlY3VsYXJJbnRlbnNpdHlNYXAudmFsdWU9ZS5zcGVjdWxhckludGVuc2l0eU1hcCksZS5zcGVjdWxhclRpbnRNYXAmJih0LnNwZWN1bGFyVGludE1hcC52YWx1ZT1lLnNwZWN1bGFyVGludE1hcCl9KSh0LGkscyk6bih0LGkpKTppLmlzTWVzaE1hdGNhcE1hdGVyaWFsPyhlKHQsaSksKGZ1bmN0aW9uIGQodCxlKXtlLm1hdGNhcCYmKHQubWF0Y2FwLnZhbHVlPWUubWF0Y2FwKSxlLmJ1bXBNYXAmJih0LmJ1bXBNYXAudmFsdWU9ZS5idW1wTWFwLHQuYnVtcFNjYWxlLnZhbHVlPWUuYnVtcFNjYWxlLDE9PT1lLnNpZGUmJih0LmJ1bXBTY2FsZS52YWx1ZSo9LTEpKSxlLm5vcm1hbE1hcCYmKHQubm9ybWFsTWFwLnZhbHVlPWUubm9ybWFsTWFwLHQubm9ybWFsU2NhbGUudmFsdWUuY29weShlLm5vcm1hbFNjYWxlKSwxPT09ZS5zaWRlJiZ0Lm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKSxlLmRpc3BsYWNlbWVudE1hcCYmKHQuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWUuZGlzcGxhY2VtZW50TWFwLHQuZGlzcGxhY2VtZW50U2NhbGUudmFsdWU9ZS5kaXNwbGFjZW1lbnRTY2FsZSx0LmRpc3BsYWNlbWVudEJpYXMudmFsdWU9ZS5kaXNwbGFjZW1lbnRCaWFzKX0pKHQsaSkpOmkuaXNNZXNoRGVwdGhNYXRlcmlhbD8oZSh0LGkpLChmdW5jdGlvbiBwKHQsZSl7ZS5kaXNwbGFjZW1lbnRNYXAmJih0LmRpc3BsYWNlbWVudE1hcC52YWx1ZT1lLmRpc3BsYWNlbWVudE1hcCx0LmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWUuZGlzcGxhY2VtZW50U2NhbGUsdC5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPWUuZGlzcGxhY2VtZW50Qmlhcyl9KSh0LGkpKTppLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWw/KGUodCxpKSwoZnVuY3Rpb24gZih0LGUpe2UuZGlzcGxhY2VtZW50TWFwJiYodC5kaXNwbGFjZW1lbnRNYXAudmFsdWU9ZS5kaXNwbGFjZW1lbnRNYXAsdC5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1lLmRpc3BsYWNlbWVudFNjYWxlLHQuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1lLmRpc3BsYWNlbWVudEJpYXMpLHQucmVmZXJlbmNlUG9zaXRpb24udmFsdWUuY29weShlLnJlZmVyZW5jZVBvc2l0aW9uKSx0Lm5lYXJEaXN0YW5jZS52YWx1ZT1lLm5lYXJEaXN0YW5jZSx0LmZhckRpc3RhbmNlLnZhbHVlPWUuZmFyRGlzdGFuY2V9KSh0LGkpKTppLmlzTWVzaE5vcm1hbE1hdGVyaWFsPyhlKHQsaSksKGZ1bmN0aW9uIG0odCxlKXtlLmJ1bXBNYXAmJih0LmJ1bXBNYXAudmFsdWU9ZS5idW1wTWFwLHQuYnVtcFNjYWxlLnZhbHVlPWUuYnVtcFNjYWxlLDE9PT1lLnNpZGUmJih0LmJ1bXBTY2FsZS52YWx1ZSo9LTEpKSxlLm5vcm1hbE1hcCYmKHQubm9ybWFsTWFwLnZhbHVlPWUubm9ybWFsTWFwLHQubm9ybWFsU2NhbGUudmFsdWUuY29weShlLm5vcm1hbFNjYWxlKSwxPT09ZS5zaWRlJiZ0Lm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKSxlLmRpc3BsYWNlbWVudE1hcCYmKHQuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWUuZGlzcGxhY2VtZW50TWFwLHQuZGlzcGxhY2VtZW50U2NhbGUudmFsdWU9ZS5kaXNwbGFjZW1lbnRTY2FsZSx0LmRpc3BsYWNlbWVudEJpYXMudmFsdWU9ZS5kaXNwbGFjZW1lbnRCaWFzKX0pKHQsaSkpOmkuaXNMaW5lQmFzaWNNYXRlcmlhbD8oKGZ1bmN0aW9uIGcodCxlKXt0LmRpZmZ1c2UudmFsdWUuY29weShlLmNvbG9yKSx0Lm9wYWNpdHkudmFsdWU9ZS5vcGFjaXR5fSkodCxpKSxpLmlzTGluZURhc2hlZE1hdGVyaWFsJiYoZnVuY3Rpb24gXyh0LGUpe3QuZGFzaFNpemUudmFsdWU9ZS5kYXNoU2l6ZSx0LnRvdGFsU2l6ZS52YWx1ZT1lLmRhc2hTaXplK2UuZ2FwU2l6ZSx0LnNjYWxlLnZhbHVlPWUuc2NhbGV9KSh0LGkpKTppLmlzUG9pbnRzTWF0ZXJpYWw/KGZ1bmN0aW9uIHkodCxlLG4saSl7bGV0IHI7dC5kaWZmdXNlLnZhbHVlLmNvcHkoZS5jb2xvciksdC5vcGFjaXR5LnZhbHVlPWUub3BhY2l0eSx0LnNpemUudmFsdWU9ZS5zaXplKm4sdC5zY2FsZS52YWx1ZT0uNSppLGUubWFwJiYodC5tYXAudmFsdWU9ZS5tYXApLGUuYWxwaGFNYXAmJih0LmFscGhhTWFwLnZhbHVlPWUuYWxwaGFNYXApLGUubWFwP3I9ZS5tYXA6ZS5hbHBoYU1hcCYmKHI9ZS5hbHBoYU1hcCksdm9pZCAwIT09ciYmKCEwPT09ci5tYXRyaXhBdXRvVXBkYXRlJiZyLnVwZGF0ZU1hdHJpeCgpLHQudXZUcmFuc2Zvcm0udmFsdWUuY29weShyLm1hdHJpeCkpfSkodCxpLG8sYSk6aS5pc1Nwcml0ZU1hdGVyaWFsPyhmdW5jdGlvbiB2KHQsZSl7bGV0IG47dC5kaWZmdXNlLnZhbHVlLmNvcHkoZS5jb2xvciksdC5vcGFjaXR5LnZhbHVlPWUub3BhY2l0eSx0LnJvdGF0aW9uLnZhbHVlPWUucm90YXRpb24sZS5tYXAmJih0Lm1hcC52YWx1ZT1lLm1hcCksZS5hbHBoYU1hcCYmKHQuYWxwaGFNYXAudmFsdWU9ZS5hbHBoYU1hcCksZS5tYXA/bj1lLm1hcDplLmFscGhhTWFwJiYobj1lLmFscGhhTWFwKSx2b2lkIDAhPT1uJiYoITA9PT1uLm1hdHJpeEF1dG9VcGRhdGUmJm4udXBkYXRlTWF0cml4KCksdC51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KG4ubWF0cml4KSl9KSh0LGkpOmkuaXNTaGFkb3dNYXRlcmlhbD8odC5jb2xvci52YWx1ZS5jb3B5KGkuY29sb3IpLHQub3BhY2l0eS52YWx1ZT1pLm9wYWNpdHkpOmkuaXNTaGFkZXJNYXRlcmlhbCYmKGkudW5pZm9ybXNOZWVkVXBkYXRlPSExKX19fWZ1bmN0aW9uIEc1dCh0PXt9KXtjb25zdCBlPXZvaWQgMCE9PXQuY2FudmFzP3QuY2FudmFzOihmdW5jdGlvbiBuKCl7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJjYW52YXMiKTtyZXR1cm4gdC5zdHlsZS5kaXNwbGF5PSJibG9jayIsdH0pKCksaT12b2lkIDAhPT10LmNvbnRleHQ/dC5jb250ZXh0Om51bGwscj12b2lkIDAhPT10LmFscGhhJiZ0LmFscGhhLG89dm9pZCAwPT09dC5kZXB0aHx8dC5kZXB0aCxhPXZvaWQgMD09PXQuc3RlbmNpbHx8dC5zdGVuY2lsLHM9dm9pZCAwIT09dC5hbnRpYWxpYXMmJnQuYW50aWFsaWFzLGw9dm9pZCAwPT09dC5wcmVtdWx0aXBsaWVkQWxwaGF8fHQucHJlbXVsdGlwbGllZEFscGhhLGM9dm9pZCAwIT09dC5wcmVzZXJ2ZURyYXdpbmdCdWZmZXImJnQucHJlc2VydmVEcmF3aW5nQnVmZmVyLHU9dm9pZCAwIT09dC5wb3dlclByZWZlcmVuY2U/dC5wb3dlclByZWZlcmVuY2U6ImRlZmF1bHQiLGg9dm9pZCAwIT09dC5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0JiZ0LmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ7bGV0IGQ9bnVsbCxwPW51bGw7Y29uc3QgZj1bXSxtPVtdO3RoaXMuZG9tRWxlbWVudD1lLHRoaXMuZGVidWc9e2NoZWNrU2hhZGVyRXJyb3JzOiEwfSx0aGlzLmF1dG9DbGVhcj0hMCx0aGlzLmF1dG9DbGVhckNvbG9yPSEwLHRoaXMuYXV0b0NsZWFyRGVwdGg9ITAsdGhpcy5hdXRvQ2xlYXJTdGVuY2lsPSEwLHRoaXMuc29ydE9iamVjdHM9ITAsdGhpcy5jbGlwcGluZ1BsYW5lcz1bXSx0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkPSExLHRoaXMuZ2FtbWFGYWN0b3I9Mix0aGlzLm91dHB1dEVuY29kaW5nPU5adCx0aGlzLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzPSExLHRoaXMudG9uZU1hcHBpbmc9MCx0aGlzLnRvbmVNYXBwaW5nRXhwb3N1cmU9MTtjb25zdCBnPXRoaXM7bGV0IF89ITEseT0wLHY9MCxiPW51bGwseD0tMSx3PW51bGw7Y29uc3QgUz1uZXcgd0p0LE09bmV3IHdKdDtsZXQgRT1udWxsLFQ9ZS53aWR0aCxDPWUuaGVpZ2h0LEE9MSxrPW51bGwsTD1udWxsO2NvbnN0IFA9bmV3IHdKdCgwLDAsVCxDKSxOPW5ldyB3SnQoMCwwLFQsQyk7bGV0IEk9ITE7Y29uc3QgUj1bXSxPPW5ldyBpMHQ7bGV0IHo9ITEsRD0hMSxCPW51bGw7Y29uc3QgSD1uZXcgclF0LEY9bmV3IENKdCxWPXtiYWNrZ3JvdW5kOm51bGwsZm9nOm51bGwsZW52aXJvbm1lbnQ6bnVsbCxvdmVycmlkZU1hdGVyaWFsOm51bGwsaXNTY2VuZTohMH07ZnVuY3Rpb24gVSgpe3JldHVybiBudWxsPT09Yj9BOjF9bGV0IGosRyxXLHEsWSxYLCQsSyxaLEosUSx0dCxldCxudCxpdCxydCxvdCxhdCxzdCxsdCxjdCx1dCxodCxkdD1pO2Z1bmN0aW9uIHB0KHQsbil7Zm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspe2NvbnN0IHI9ZS5nZXRDb250ZXh0KHRbaV0sbik7aWYobnVsbCE9PXIpcmV0dXJuIHJ9cmV0dXJuIG51bGx9dHJ5e2NvbnN0IHQ9e2FscGhhOnIsZGVwdGg6byxzdGVuY2lsOmEsYW50aWFsaWFzOnMscHJlbXVsdGlwbGllZEFscGhhOmwscHJlc2VydmVEcmF3aW5nQnVmZmVyOmMscG93ZXJQcmVmZXJlbmNlOnUsZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDpofTtpZihlLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLGd0LCExKSxlLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIixfdCwhMSksbnVsbD09PWR0KXtjb25zdCBlPVsid2ViZ2wyIiwid2ViZ2wiLCJleHBlcmltZW50YWwtd2ViZ2wiXTtpZighMD09PWcuaXNXZWJHTDFSZW5kZXJlciYmZS5zaGlmdCgpLGR0PXB0KGUsdCksbnVsbD09PWR0KXRocm93IHB0KGUpP25ldyBFcnJvcigiRXJyb3IgY3JlYXRpbmcgV2ViR0wgY29udGV4dCB3aXRoIHlvdXIgc2VsZWN0ZWQgYXR0cmlidXRlcy4iKTpuZXcgRXJyb3IoIkVycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQuIil9dm9pZCAwPT09ZHQuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0JiYoZHQuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJue3JhbmdlTWluOjEscmFuZ2VNYXg6MSxwcmVjaXNpb246MX19KX1jYXRjaCh0KXt0aHJvdyBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAiK3QubWVzc2FnZSksdH1mdW5jdGlvbiBmdCgpe2o9bmV3IFUwdChkdCksRz1uZXcgcDB0KGR0LGosdCksai5pbml0KEcpLHV0PW5ldyBENXQoZHQsaixHKSxXPW5ldyBPNXQoZHQsaixHKSxSWzBdPTEwMjkscT1uZXcgVzB0KGR0KSxZPW5ldyB4NXQsWD1uZXcgejV0KGR0LGosVyxZLEcsdXQscSksJD1uZXcgbTB0KGcpLEs9bmV3IFYwdChnKSxaPW5ldyBvMHQoZHQsRyksaHQ9bmV3IGgwdChkdCxqLFosRyksSj1uZXcgajB0KGR0LFoscSxodCksUT1uZXcgJDB0KGR0LEosWixxKSxzdD1uZXcgWDB0KGR0KSxydD1uZXcgZjB0KFkpLHR0PW5ldyBiNXQoZywkLEssaixHLGh0LHJ0KSxldD1uZXcgajV0KFkpLG50PW5ldyBFNXQoWSksaXQ9bmV3IFA1dChqLEcpLGF0PW5ldyB1MHQoZywkLFcsUSxsKSxvdD1uZXcgUjV0KGcsUSxHKSxsdD1uZXcgZDB0KGR0LGoscSxHKSxjdD1uZXcgRzB0KGR0LGoscSxHKSxxLnByb2dyYW1zPXR0LnByb2dyYW1zLGcuY2FwYWJpbGl0aWVzPUcsZy5leHRlbnNpb25zPWosZy5wcm9wZXJ0aWVzPVksZy5yZW5kZXJMaXN0cz1udCxnLnNoYWRvd01hcD1vdCxnLnN0YXRlPVcsZy5pbmZvPXF9ZnQoKTtjb25zdCBtdD1uZXcgVTV0KGcsZHQpO2Z1bmN0aW9uIGd0KHQpe3QucHJldmVudERlZmF1bHQoKSxjb25zb2xlLmxvZygiVEhSRUUuV2ViR0xSZW5kZXJlcjogQ29udGV4dCBMb3N0LiIpLF89ITB9ZnVuY3Rpb24gX3QoKXtjb25zb2xlLmxvZygiVEhSRUUuV2ViR0xSZW5kZXJlcjogQ29udGV4dCBSZXN0b3JlZC4iKSxfPSExO2NvbnN0IHQ9cS5hdXRvUmVzZXQsZT1vdC5lbmFibGVkLG49b3QuYXV0b1VwZGF0ZSxpPW90Lm5lZWRzVXBkYXRlLHI9b3QudHlwZTtmdCgpLHEuYXV0b1Jlc2V0PXQsb3QuZW5hYmxlZD1lLG90LmF1dG9VcGRhdGU9bixvdC5uZWVkc1VwZGF0ZT1pLG90LnR5cGU9cn1mdW5jdGlvbiB5dCh0KXtjb25zdCBlPXQudGFyZ2V0O2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIseXQpLChmdW5jdGlvbiBuKHQpeyhmdW5jdGlvbiBlKHQpe2NvbnN0IGU9WS5nZXQodCkucHJvZ3JhbXM7dm9pZCAwIT09ZSYmZS5mb3JFYWNoKChmdW5jdGlvbih0KXt0dC5yZWxlYXNlUHJvZ3JhbSh0KX0pKX0pKHQpLFkucmVtb3ZlKHQpfSkoZSl9dGhpcy54cj1tdCx0aGlzLmdldENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gZHR9LHRoaXMuZ2V0Q29udGV4dEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gZHQuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKX0sdGhpcy5mb3JjZUNvbnRleHRMb3NzPWZ1bmN0aW9uKCl7Y29uc3QgdD1qLmdldCgiV0VCR0xfbG9zZV9jb250ZXh0Iik7dCYmdC5sb3NlQ29udGV4dCgpfSx0aGlzLmZvcmNlQ29udGV4dFJlc3RvcmU9ZnVuY3Rpb24oKXtjb25zdCB0PWouZ2V0KCJXRUJHTF9sb3NlX2NvbnRleHQiKTt0JiZ0LnJlc3RvcmVDb250ZXh0KCl9LHRoaXMuZ2V0UGl4ZWxSYXRpbz1mdW5jdGlvbigpe3JldHVybiBBfSx0aGlzLnNldFBpeGVsUmF0aW89ZnVuY3Rpb24odCl7dm9pZCAwIT09dCYmKEE9dCx0aGlzLnNldFNpemUoVCxDLCExKSl9LHRoaXMuZ2V0U2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5zZXQoVCxDKX0sdGhpcy5zZXRTaXplPWZ1bmN0aW9uKHQsbixpKXttdC5pc1ByZXNlbnRpbmc/Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDYW4ndCBjaGFuZ2Ugc2l6ZSB3aGlsZSBWUiBkZXZpY2UgaXMgcHJlc2VudGluZy4iKTooVD10LEM9bixlLndpZHRoPU1hdGguZmxvb3IodCpBKSxlLmhlaWdodD1NYXRoLmZsb29yKG4qQSksITEhPT1pJiYoZS5zdHlsZS53aWR0aD10KyJweCIsZS5zdHlsZS5oZWlnaHQ9bisicHgiKSx0aGlzLnNldFZpZXdwb3J0KDAsMCx0LG4pKX0sdGhpcy5nZXREcmF3aW5nQnVmZmVyU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5zZXQoVCpBLEMqQSkuZmxvb3IoKX0sdGhpcy5zZXREcmF3aW5nQnVmZmVyU2l6ZT1mdW5jdGlvbih0LG4saSl7VD10LEM9bixBPWksZS53aWR0aD1NYXRoLmZsb29yKHQqaSksZS5oZWlnaHQ9TWF0aC5mbG9vcihuKmkpLHRoaXMuc2V0Vmlld3BvcnQoMCwwLHQsbil9LHRoaXMuZ2V0Q3VycmVudFZpZXdwb3J0PWZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoUyl9LHRoaXMuZ2V0Vmlld3BvcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weShQKX0sdGhpcy5zZXRWaWV3cG9ydD1mdW5jdGlvbih0LGUsbixpKXt0LmlzVmVjdG9yND9QLnNldCh0LngsdC55LHQueix0LncpOlAuc2V0KHQsZSxuLGkpLFcudmlld3BvcnQoUy5jb3B5KFApLm11bHRpcGx5U2NhbGFyKEEpLmZsb29yKCkpfSx0aGlzLmdldFNjaXNzb3I9ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weShOKX0sdGhpcy5zZXRTY2lzc29yPWZ1bmN0aW9uKHQsZSxuLGkpe3QuaXNWZWN0b3I0P04uc2V0KHQueCx0LnksdC56LHQudyk6Ti5zZXQodCxlLG4saSksVy5zY2lzc29yKE0uY29weShOKS5tdWx0aXBseVNjYWxhcihBKS5mbG9vcigpKX0sdGhpcy5nZXRTY2lzc29yVGVzdD1mdW5jdGlvbigpe3JldHVybiBJfSx0aGlzLnNldFNjaXNzb3JUZXN0PWZ1bmN0aW9uKHQpe1cuc2V0U2Npc3NvclRlc3QoST10KX0sdGhpcy5zZXRPcGFxdWVTb3J0PWZ1bmN0aW9uKHQpe2s9dH0sdGhpcy5zZXRUcmFuc3BhcmVudFNvcnQ9ZnVuY3Rpb24odCl7TD10fSx0aGlzLmdldENsZWFyQ29sb3I9ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weShhdC5nZXRDbGVhckNvbG9yKCkpfSx0aGlzLnNldENsZWFyQ29sb3I9ZnVuY3Rpb24oKXthdC5zZXRDbGVhckNvbG9yLmFwcGx5KGF0LGFyZ3VtZW50cyl9LHRoaXMuZ2V0Q2xlYXJBbHBoYT1mdW5jdGlvbigpe3JldHVybiBhdC5nZXRDbGVhckFscGhhKCl9LHRoaXMuc2V0Q2xlYXJBbHBoYT1mdW5jdGlvbigpe2F0LnNldENsZWFyQWxwaGEuYXBwbHkoYXQsYXJndW1lbnRzKX0sdGhpcy5jbGVhcj1mdW5jdGlvbih0LGUsbil7bGV0IGk9MDsodm9pZCAwPT09dHx8dCkmJihpfD0xNjM4NCksKHZvaWQgMD09PWV8fGUpJiYoaXw9MjU2KSwodm9pZCAwPT09bnx8bikmJihpfD0xMDI0KSxkdC5jbGVhcihpKX0sdGhpcy5jbGVhckNvbG9yPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMCwhMSwhMSl9LHRoaXMuY2xlYXJEZXB0aD1mdW5jdGlvbigpe3RoaXMuY2xlYXIoITEsITAsITEpfSx0aGlzLmNsZWFyU3RlbmNpbD1mdW5jdGlvbigpe3RoaXMuY2xlYXIoITEsITEsITApfSx0aGlzLmRpc3Bvc2U9ZnVuY3Rpb24oKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLGd0LCExKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIixfdCwhMSksbnQuZGlzcG9zZSgpLGl0LmRpc3Bvc2UoKSxZLmRpc3Bvc2UoKSwkLmRpc3Bvc2UoKSxLLmRpc3Bvc2UoKSxRLmRpc3Bvc2UoKSxodC5kaXNwb3NlKCksbXQuZGlzcG9zZSgpLG10LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlc3Npb25zdGFydCIsYnQpLG10LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlc3Npb25lbmQiLHh0KSxCJiYoQi5kaXNwb3NlKCksQj1udWxsKSx3dC5zdG9wKCl9LHRoaXMucmVuZGVyQnVmZmVySW1tZWRpYXRlPWZ1bmN0aW9uKHQsZSl7aHQuaW5pdEF0dHJpYnV0ZXMoKTtjb25zdCBuPVkuZ2V0KHQpO3QuaGFzUG9zaXRpb25zJiYhbi5wb3NpdGlvbiYmKG4ucG9zaXRpb249ZHQuY3JlYXRlQnVmZmVyKCkpLHQuaGFzTm9ybWFscyYmIW4ubm9ybWFsJiYobi5ub3JtYWw9ZHQuY3JlYXRlQnVmZmVyKCkpLHQuaGFzVXZzJiYhbi51diYmKG4udXY9ZHQuY3JlYXRlQnVmZmVyKCkpLHQuaGFzQ29sb3JzJiYhbi5jb2xvciYmKG4uY29sb3I9ZHQuY3JlYXRlQnVmZmVyKCkpO2NvbnN0IGk9ZS5nZXRBdHRyaWJ1dGVzKCk7dC5oYXNQb3NpdGlvbnMmJihkdC5iaW5kQnVmZmVyKDM0OTYyLG4ucG9zaXRpb24pLGR0LmJ1ZmZlckRhdGEoMzQ5NjIsdC5wb3NpdGlvbkFycmF5LDM1MDQ4KSxodC5lbmFibGVBdHRyaWJ1dGUoaS5wb3NpdGlvbiksZHQudmVydGV4QXR0cmliUG9pbnRlcihpLnBvc2l0aW9uLDMsNTEyNiwhMSwwLDApKSx0Lmhhc05vcm1hbHMmJihkdC5iaW5kQnVmZmVyKDM0OTYyLG4ubm9ybWFsKSxkdC5idWZmZXJEYXRhKDM0OTYyLHQubm9ybWFsQXJyYXksMzUwNDgpLGh0LmVuYWJsZUF0dHJpYnV0ZShpLm5vcm1hbCksZHQudmVydGV4QXR0cmliUG9pbnRlcihpLm5vcm1hbCwzLDUxMjYsITEsMCwwKSksdC5oYXNVdnMmJihkdC5iaW5kQnVmZmVyKDM0OTYyLG4udXYpLGR0LmJ1ZmZlckRhdGEoMzQ5NjIsdC51dkFycmF5LDM1MDQ4KSxodC5lbmFibGVBdHRyaWJ1dGUoaS51diksZHQudmVydGV4QXR0cmliUG9pbnRlcihpLnV2LDIsNTEyNiwhMSwwLDApKSx0Lmhhc0NvbG9ycyYmKGR0LmJpbmRCdWZmZXIoMzQ5NjIsbi5jb2xvciksZHQuYnVmZmVyRGF0YSgzNDk2Mix0LmNvbG9yQXJyYXksMzUwNDgpLGh0LmVuYWJsZUF0dHJpYnV0ZShpLmNvbG9yKSxkdC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGkuY29sb3IsMyw1MTI2LCExLDAsMCkpLGh0LmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCksZHQuZHJhd0FycmF5cyg0LDAsdC5jb3VudCksdC5jb3VudD0wfSx0aGlzLnJlbmRlckJ1ZmZlckRpcmVjdD1mdW5jdGlvbih0LGUsbixpLHIsbyl7bnVsbD09PWUmJihlPVYpO2NvbnN0IGE9ci5pc01lc2gmJnIubWF0cml4V29ybGQuZGV0ZXJtaW5hbnQoKTwwLHM9QXQodCxlLGkscik7Vy5zZXRNYXRlcmlhbChpLGEpO2xldCBsPW4uaW5kZXg7Y29uc3QgYz1uLmF0dHJpYnV0ZXMucG9zaXRpb247aWYobnVsbD09PWwpe2lmKHZvaWQgMD09PWN8fDA9PT1jLmNvdW50KXJldHVybn1lbHNlIGlmKDA9PT1sLmNvdW50KXJldHVybjtsZXQgdSxoPTE7ITA9PT1pLndpcmVmcmFtZSYmKGw9Si5nZXRXaXJlZnJhbWVBdHRyaWJ1dGUobiksaD0yKSx2b2lkIDA9PT1uLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiYmdm9pZCAwPT09bi5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsfHxzdC51cGRhdGUocixuLGkscyksaHQuc2V0dXAocixpLHMsbixsKTtsZXQgZD1sdDtudWxsIT09bCYmKHU9Wi5nZXQobCksZD1jdCxkLnNldEluZGV4KHUpKTtjb25zdCBwPW51bGwhPT1sP2wuY291bnQ6Yy5jb3VudCxmPW4uZHJhd1JhbmdlLnN0YXJ0KmgsbT1uLmRyYXdSYW5nZS5jb3VudCpoLGc9bnVsbCE9PW8/by5zdGFydCpoOjAsXz1udWxsIT09bz9vLmNvdW50Kmg6MS8wLHk9TWF0aC5tYXgoZixnKSx2PU1hdGgubWluKHAsZittLGcrXyktMSxiPU1hdGgubWF4KDAsdi15KzEpO2lmKDAhPT1iKXtpZihyLmlzTWVzaCkhMD09PWkud2lyZWZyYW1lPyhXLnNldExpbmVXaWR0aChpLndpcmVmcmFtZUxpbmV3aWR0aCpVKCkpLGQuc2V0TW9kZSgxKSk6ZC5zZXRNb2RlKDQpO2Vsc2UgaWYoci5pc0xpbmUpe2xldCB0PWkubGluZXdpZHRoO3ZvaWQgMD09PXQmJih0PTEpLFcuc2V0TGluZVdpZHRoKHQqVSgpKSxkLnNldE1vZGUoci5pc0xpbmVTZWdtZW50cz8xOnIuaXNMaW5lTG9vcD8yOjMpfWVsc2Ugci5pc1BvaW50cz9kLnNldE1vZGUoMCk6ci5pc1Nwcml0ZSYmZC5zZXRNb2RlKDQpO2lmKHIuaXNJbnN0YW5jZWRNZXNoKWQucmVuZGVySW5zdGFuY2VzKHksYixyLmNvdW50KTtlbHNlIGlmKG4uaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSl7Y29uc3QgdD1NYXRoLm1pbihuLmluc3RhbmNlQ291bnQsbi5fbWF4SW5zdGFuY2VDb3VudCk7ZC5yZW5kZXJJbnN0YW5jZXMoeSxiLHQpfWVsc2UgZC5yZW5kZXIoeSxiKX19LHRoaXMuY29tcGlsZT1mdW5jdGlvbih0LGUpe3A9aXQuZ2V0KHQpLHAuaW5pdCgpLG0ucHVzaChwKSx0LnRyYXZlcnNlVmlzaWJsZSgoZnVuY3Rpb24odCl7dC5pc0xpZ2h0JiZ0LmxheWVycy50ZXN0KGUubGF5ZXJzKSYmKHAucHVzaExpZ2h0KHQpLHQuY2FzdFNoYWRvdyYmcC5wdXNoU2hhZG93KHQpKX0pKSxwLnNldHVwTGlnaHRzKCksdC50cmF2ZXJzZSgoZnVuY3Rpb24oZSl7Y29uc3Qgbj1lLm1hdGVyaWFsO2lmKG4paWYoQXJyYXkuaXNBcnJheShuKSlmb3IobGV0IGk9MDtpPG4ubGVuZ3RoO2krKylUdChuW2ldLHQsZSk7ZWxzZSBUdChuLHQsZSl9KSksbS5wb3AoKSxwPW51bGx9O2xldCB2dD1udWxsO2Z1bmN0aW9uIGJ0KCl7d3Quc3RvcCgpfWZ1bmN0aW9uIHh0KCl7d3Quc3RhcnQoKX1jb25zdCB3dD1uZXcgcjB0O2Z1bmN0aW9uIFN0KHQsZSxuLGkpe2lmKCExPT09dC52aXNpYmxlKXJldHVybjtpZih0LmxheWVycy50ZXN0KGUubGF5ZXJzKSlpZih0LmlzR3JvdXApbj10LnJlbmRlck9yZGVyO2Vsc2UgaWYodC5pc0xPRCkhMD09PXQuYXV0b1VwZGF0ZSYmdC51cGRhdGUoZSk7ZWxzZSBpZih0LmlzTGlnaHQpcC5wdXNoTGlnaHQodCksdC5jYXN0U2hhZG93JiZwLnB1c2hTaGFkb3codCk7ZWxzZSBpZih0LmlzU3ByaXRlKXtpZighdC5mcnVzdHVtQ3VsbGVkfHxPLmludGVyc2VjdHNTcHJpdGUodCkpe2kmJkYuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQubWF0cml4V29ybGQpLmFwcGx5TWF0cml4NChIKTtjb25zdCBlPVEudXBkYXRlKHQpLHI9dC5tYXRlcmlhbDtyLnZpc2libGUmJmQucHVzaCh0LGUscixuLEYueixudWxsKX19ZWxzZSBpZih0LmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0KWkmJkYuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQubWF0cml4V29ybGQpLmFwcGx5TWF0cml4NChIKSxkLnB1c2godCxudWxsLHQubWF0ZXJpYWwsbixGLnosbnVsbCk7ZWxzZSBpZigodC5pc01lc2h8fHQuaXNMaW5lfHx0LmlzUG9pbnRzKSYmKHQuaXNTa2lubmVkTWVzaCYmdC5za2VsZXRvbi5mcmFtZSE9PXEucmVuZGVyLmZyYW1lJiYodC5za2VsZXRvbi51cGRhdGUoKSx0LnNrZWxldG9uLmZyYW1lPXEucmVuZGVyLmZyYW1lKSwhdC5mcnVzdHVtQ3VsbGVkfHxPLmludGVyc2VjdHNPYmplY3QodCkpKXtpJiZGLnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKS5hcHBseU1hdHJpeDQoSCk7Y29uc3QgZT1RLnVwZGF0ZSh0KSxyPXQubWF0ZXJpYWw7aWYoQXJyYXkuaXNBcnJheShyKSl7Y29uc3QgaT1lLmdyb3Vwcztmb3IobGV0IG89MCxhPWkubGVuZ3RoO288YTtvKyspe2NvbnN0IGE9aVtvXSxzPXJbYS5tYXRlcmlhbEluZGV4XTtzJiZzLnZpc2libGUmJmQucHVzaCh0LGUscyxuLEYueixhKX19ZWxzZSByLnZpc2libGUmJmQucHVzaCh0LGUscixuLEYueixudWxsKX1jb25zdCByPXQuY2hpbGRyZW47Zm9yKGxldCB0PTAsbz1yLmxlbmd0aDt0PG87dCsrKVN0KHJbdF0sZSxuLGkpfWZ1bmN0aW9uIE10KHQsZSxuKXtjb25zdCBpPSEwPT09ZS5pc1NjZW5lP2Uub3ZlcnJpZGVNYXRlcmlhbDpudWxsO2lmKG4uaXNBcnJheUNhbWVyYSl7Y29uc3Qgcj1uLmNhbWVyYXM7Zm9yKGxldCBuPTAsbz1yLmxlbmd0aDtuPG87bisrKXtjb25zdCBvPXJbbl07Vy52aWV3cG9ydChTLmNvcHkoby52aWV3cG9ydCkpLHAuc2V0dXBMaWdodHNWaWV3KG8pO2ZvcihsZXQgbj0wLHI9dC5sZW5ndGg7bjxyO24rKyl7Y29uc3Qgcj10W25dLGE9ci5vYmplY3Qscz1yLmdlb21ldHJ5LGw9bnVsbD09PWk/ci5tYXRlcmlhbDppLGM9ci5ncm91cDthLmxheWVycy50ZXN0KG8ubGF5ZXJzKSYmRXQoYSxlLG8scyxsLGMpfX19ZWxzZSBmb3IobGV0IHI9MCxvPXQubGVuZ3RoO3I8bztyKyspe2NvbnN0IG89dFtyXTtFdChvLm9iamVjdCxlLG4sby5nZW9tZXRyeSxudWxsPT09aT9vLm1hdGVyaWFsOmksby5ncm91cCl9fWZ1bmN0aW9uIEV0KHQsZSxuLGkscixvKXtpZih0Lm9uQmVmb3JlUmVuZGVyKGcsZSxuLGkscixvKSx0Lm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKG4ubWF0cml4V29ybGRJbnZlcnNlLHQubWF0cml4V29ybGQpLHQubm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCh0Lm1vZGVsVmlld01hdHJpeCksdC5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdCl7Y29uc3QgaT1BdChuLGUscix0KTtXLnNldE1hdGVyaWFsKHIpLGh0LnJlc2V0KCksKGZ1bmN0aW9uIGEodCxlKXt0LnJlbmRlcigoZnVuY3Rpb24odCl7Zy5yZW5kZXJCdWZmZXJJbW1lZGlhdGUodCxlKX0pKX0pKHQsaSl9ZWxzZSEwPT09ci50cmFuc3BhcmVudCYmMj09PXIuc2lkZT8oci5zaWRlPTEsci5uZWVkc1VwZGF0ZT0hMCxnLnJlbmRlckJ1ZmZlckRpcmVjdChuLGUsaSxyLHQsbyksci5zaWRlPTAsci5uZWVkc1VwZGF0ZT0hMCxnLnJlbmRlckJ1ZmZlckRpcmVjdChuLGUsaSxyLHQsbyksci5zaWRlPTIpOmcucmVuZGVyQnVmZmVyRGlyZWN0KG4sZSxpLHIsdCxvKTt0Lm9uQWZ0ZXJSZW5kZXIoZyxlLG4saSxyLG8pfWZ1bmN0aW9uIFR0KHQsZSxuKXshMCE9PWUuaXNTY2VuZSYmKGU9Vik7Y29uc3QgaT1ZLmdldCh0KSxyPXAuc3RhdGUubGlnaHRzLG89ci5zdGF0ZS52ZXJzaW9uLGE9dHQuZ2V0UGFyYW1ldGVycyh0LHIuc3RhdGUscC5zdGF0ZS5zaGFkb3dzQXJyYXksZSxuKSxzPXR0LmdldFByb2dyYW1DYWNoZUtleShhKTtsZXQgbD1pLnByb2dyYW1zO2kuZW52aXJvbm1lbnQ9dC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsP2UuZW52aXJvbm1lbnQ6bnVsbCxpLmZvZz1lLmZvZyxpLmVudk1hcD0odC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsP0s6JCkuZ2V0KHQuZW52TWFwfHxpLmVudmlyb25tZW50KSx2b2lkIDA9PT1sJiYodC5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIix5dCksbD1uZXcgTWFwLGkucHJvZ3JhbXM9bCk7bGV0IGM9bC5nZXQocyk7aWYodm9pZCAwIT09Yyl7aWYoaS5jdXJyZW50UHJvZ3JhbT09PWMmJmkubGlnaHRzU3RhdGVWZXJzaW9uPT09bylyZXR1cm4gQ3QodCxhKSxjfWVsc2UgYS51bmlmb3Jtcz10dC5nZXRVbmlmb3Jtcyh0KSx0Lm9uQnVpbGQoYSxnKSx0Lm9uQmVmb3JlQ29tcGlsZShhLGcpLGM9dHQuYWNxdWlyZVByb2dyYW0oYSxzKSxsLnNldChzLGMpLGkudW5pZm9ybXM9YS51bmlmb3Jtcztjb25zdCB1PWkudW5pZm9ybXM7KHQuaXNTaGFkZXJNYXRlcmlhbHx8dC5pc1Jhd1NoYWRlck1hdGVyaWFsKSYmITAhPT10LmNsaXBwaW5nfHwodS5jbGlwcGluZ1BsYW5lcz1ydC51bmlmb3JtKSxDdCh0LGEpLGkubmVlZHNMaWdodHM9KGZ1bmN0aW9uIGgodCl7cmV0dXJuIHQuaXNNZXNoTGFtYmVydE1hdGVyaWFsfHx0LmlzTWVzaFRvb25NYXRlcmlhbHx8dC5pc01lc2hQaG9uZ01hdGVyaWFsfHx0LmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWx8fHQuaXNTaGFkb3dNYXRlcmlhbHx8dC5pc1NoYWRlck1hdGVyaWFsJiYhMD09PXQubGlnaHRzfSkodCksaS5saWdodHNTdGF0ZVZlcnNpb249byxpLm5lZWRzTGlnaHRzJiYodS5hbWJpZW50TGlnaHRDb2xvci52YWx1ZT1yLnN0YXRlLmFtYmllbnQsdS5saWdodFByb2JlLnZhbHVlPXIuc3RhdGUucHJvYmUsdS5kaXJlY3Rpb25hbExpZ2h0cy52YWx1ZT1yLnN0YXRlLmRpcmVjdGlvbmFsLHUuZGlyZWN0aW9uYWxMaWdodFNoYWRvd3MudmFsdWU9ci5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvdyx1LnNwb3RMaWdodHMudmFsdWU9ci5zdGF0ZS5zcG90LHUuc3BvdExpZ2h0U2hhZG93cy52YWx1ZT1yLnN0YXRlLnNwb3RTaGFkb3csdS5yZWN0QXJlYUxpZ2h0cy52YWx1ZT1yLnN0YXRlLnJlY3RBcmVhLHUubHRjXzEudmFsdWU9ci5zdGF0ZS5yZWN0QXJlYUxUQzEsdS5sdGNfMi52YWx1ZT1yLnN0YXRlLnJlY3RBcmVhTFRDMix1LnBvaW50TGlnaHRzLnZhbHVlPXIuc3RhdGUucG9pbnQsdS5wb2ludExpZ2h0U2hhZG93cy52YWx1ZT1yLnN0YXRlLnBvaW50U2hhZG93LHUuaGVtaXNwaGVyZUxpZ2h0cy52YWx1ZT1yLnN0YXRlLmhlbWksdS5kaXJlY3Rpb25hbFNoYWRvd01hcC52YWx1ZT1yLnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWFwLHUuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgudmFsdWU9ci5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeCx1LnNwb3RTaGFkb3dNYXAudmFsdWU9ci5zdGF0ZS5zcG90U2hhZG93TWFwLHUuc3BvdFNoYWRvd01hdHJpeC52YWx1ZT1yLnN0YXRlLnNwb3RTaGFkb3dNYXRyaXgsdS5wb2ludFNoYWRvd01hcC52YWx1ZT1yLnN0YXRlLnBvaW50U2hhZG93TWFwLHUucG9pbnRTaGFkb3dNYXRyaXgudmFsdWU9ci5zdGF0ZS5wb2ludFNoYWRvd01hdHJpeCk7Y29uc3QgZD1jLmdldFVuaWZvcm1zKCksZj1RMnQuc2VxV2l0aFZhbHVlKGQuc2VxLHUpO3JldHVybiBpLmN1cnJlbnRQcm9ncmFtPWMsaS51bmlmb3Jtc0xpc3Q9ZixjfWZ1bmN0aW9uIEN0KHQsZSl7Y29uc3Qgbj1ZLmdldCh0KTtuLm91dHB1dEVuY29kaW5nPWUub3V0cHV0RW5jb2Rpbmcsbi5pbnN0YW5jaW5nPWUuaW5zdGFuY2luZyxuLnNraW5uaW5nPWUuc2tpbm5pbmcsbi5tb3JwaFRhcmdldHM9ZS5tb3JwaFRhcmdldHMsbi5tb3JwaE5vcm1hbHM9ZS5tb3JwaE5vcm1hbHMsbi5udW1DbGlwcGluZ1BsYW5lcz1lLm51bUNsaXBwaW5nUGxhbmVzLG4ubnVtSW50ZXJzZWN0aW9uPWUubnVtQ2xpcEludGVyc2VjdGlvbixuLnZlcnRleEFscGhhcz1lLnZlcnRleEFscGhhcyxuLnZlcnRleFRhbmdlbnRzPWUudmVydGV4VGFuZ2VudHN9ZnVuY3Rpb24gQXQodCxlLG4saSl7ITAhPT1lLmlzU2NlbmUmJihlPVYpLFgucmVzZXRUZXh0dXJlVW5pdHMoKTtjb25zdCByPWUuZm9nLG89bnVsbD09PWI/Zy5vdXRwdXRFbmNvZGluZzpiLnRleHR1cmUuZW5jb2RpbmcsYT0obi5pc01lc2hTdGFuZGFyZE1hdGVyaWFsP0s6JCkuZ2V0KG4uZW52TWFwfHwobi5pc01lc2hTdGFuZGFyZE1hdGVyaWFsP2UuZW52aXJvbm1lbnQ6bnVsbCkpLHM9ITA9PT1uLnZlcnRleENvbG9ycyYmISFpLmdlb21ldHJ5JiYhIWkuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvciYmND09PWkuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvci5pdGVtU2l6ZSxsPSEhaS5nZW9tZXRyeSYmISFpLmdlb21ldHJ5LmF0dHJpYnV0ZXMudGFuZ2VudCxjPSEhaS5nZW9tZXRyeSYmISFpLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbix1PSEhaS5nZW9tZXRyeSYmISFpLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5ub3JtYWwsaD1ZLmdldChuKSxkPXAuc3RhdGUubGlnaHRzOyEwIT09enx8ITAhPT1EJiZ0PT09d3x8cnQuc2V0U3RhdGUobix0LHQ9PT13JiZuLmlkPT09eCk7bGV0IGY9ITE7bi52ZXJzaW9uPT09aC5fX3ZlcnNpb24/aC5uZWVkc0xpZ2h0cyYmaC5saWdodHNTdGF0ZVZlcnNpb24hPT1kLnN0YXRlLnZlcnNpb258fGgub3V0cHV0RW5jb2RpbmchPT1vfHxpLmlzSW5zdGFuY2VkTWVzaCYmITE9PT1oLmluc3RhbmNpbmc/Zj0hMDppLmlzSW5zdGFuY2VkTWVzaHx8ITAhPT1oLmluc3RhbmNpbmc/aS5pc1NraW5uZWRNZXNoJiYhMT09PWguc2tpbm5pbmc/Zj0hMDppLmlzU2tpbm5lZE1lc2h8fCEwIT09aC5za2lubmluZz9oLmVudk1hcCE9PWF8fG4uZm9nJiZoLmZvZyE9PXI/Zj0hMDp2b2lkIDA9PT1oLm51bUNsaXBwaW5nUGxhbmVzfHxoLm51bUNsaXBwaW5nUGxhbmVzPT09cnQubnVtUGxhbmVzJiZoLm51bUludGVyc2VjdGlvbj09PXJ0Lm51bUludGVyc2VjdGlvbj8oaC52ZXJ0ZXhBbHBoYXMhPT1zfHxoLnZlcnRleFRhbmdlbnRzIT09bHx8aC5tb3JwaFRhcmdldHMhPT1jfHxoLm1vcnBoTm9ybWFscyE9PXUpJiYoZj0hMCk6Zj0hMDpmPSEwOmY9ITA6KGY9ITAsaC5fX3ZlcnNpb249bi52ZXJzaW9uKTtsZXQgbT1oLmN1cnJlbnRQcm9ncmFtOyEwPT09ZiYmKG09VHQobixlLGkpKTtsZXQgXz0hMSx5PSExLHY9ITE7Y29uc3QgUz1tLmdldFVuaWZvcm1zKCksTT1oLnVuaWZvcm1zO2lmKFcudXNlUHJvZ3JhbShtLnByb2dyYW0pJiYoXz0hMCx5PSEwLHY9ITApLG4uaWQhPT14JiYoeD1uLmlkLHk9ITApLF98fHchPT10KXtpZihTLnNldFZhbHVlKGR0LCJwcm9qZWN0aW9uTWF0cml4Iix0LnByb2plY3Rpb25NYXRyaXgpLEcubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciYmUy5zZXRWYWx1ZShkdCwibG9nRGVwdGhCdWZGQyIsMi8oTWF0aC5sb2codC5mYXIrMSkvTWF0aC5MTjIpKSx3IT09dCYmKHc9dCx5PSEwLHY9ITApLG4uaXNTaGFkZXJNYXRlcmlhbHx8bi5pc01lc2hQaG9uZ01hdGVyaWFsfHxuLmlzTWVzaFRvb25NYXRlcmlhbHx8bi5pc01lc2hTdGFuZGFyZE1hdGVyaWFsfHxuLmVudk1hcCl7Y29uc3QgZT1TLm1hcC5jYW1lcmFQb3NpdGlvbjt2b2lkIDAhPT1lJiZlLnNldFZhbHVlKGR0LEYuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQubWF0cml4V29ybGQpKX0obi5pc01lc2hQaG9uZ01hdGVyaWFsfHxuLmlzTWVzaFRvb25NYXRlcmlhbHx8bi5pc01lc2hMYW1iZXJ0TWF0ZXJpYWx8fG4uaXNNZXNoQmFzaWNNYXRlcmlhbHx8bi5pc01lc2hTdGFuZGFyZE1hdGVyaWFsfHxuLmlzU2hhZGVyTWF0ZXJpYWwpJiZTLnNldFZhbHVlKGR0LCJpc09ydGhvZ3JhcGhpYyIsITA9PT10LmlzT3J0aG9ncmFwaGljQ2FtZXJhKSwobi5pc01lc2hQaG9uZ01hdGVyaWFsfHxuLmlzTWVzaFRvb25NYXRlcmlhbHx8bi5pc01lc2hMYW1iZXJ0TWF0ZXJpYWx8fG4uaXNNZXNoQmFzaWNNYXRlcmlhbHx8bi5pc01lc2hTdGFuZGFyZE1hdGVyaWFsfHxuLmlzU2hhZGVyTWF0ZXJpYWx8fG4uaXNTaGFkb3dNYXRlcmlhbHx8aS5pc1NraW5uZWRNZXNoKSYmUy5zZXRWYWx1ZShkdCwidmlld01hdHJpeCIsdC5tYXRyaXhXb3JsZEludmVyc2UpfWlmKGkuaXNTa2lubmVkTWVzaCl7Uy5zZXRPcHRpb25hbChkdCxpLCJiaW5kTWF0cml4IiksUy5zZXRPcHRpb25hbChkdCxpLCJiaW5kTWF0cml4SW52ZXJzZSIpO2NvbnN0IHQ9aS5za2VsZXRvbjt0JiYoRy5mbG9hdFZlcnRleFRleHR1cmVzPyhudWxsPT09dC5ib25lVGV4dHVyZSYmdC5jb21wdXRlQm9uZVRleHR1cmUoKSxTLnNldFZhbHVlKGR0LCJib25lVGV4dHVyZSIsdC5ib25lVGV4dHVyZSxYKSxTLnNldFZhbHVlKGR0LCJib25lVGV4dHVyZVNpemUiLHQuYm9uZVRleHR1cmVTaXplKSk6Uy5zZXRPcHRpb25hbChkdCx0LCJib25lTWF0cmljZXMiKSl9cmV0dXJuKHl8fGgucmVjZWl2ZVNoYWRvdyE9PWkucmVjZWl2ZVNoYWRvdykmJihoLnJlY2VpdmVTaGFkb3c9aS5yZWNlaXZlU2hhZG93LFMuc2V0VmFsdWUoZHQsInJlY2VpdmVTaGFkb3ciLGkucmVjZWl2ZVNoYWRvdykpLHkmJihTLnNldFZhbHVlKGR0LCJ0b25lTWFwcGluZ0V4cG9zdXJlIixnLnRvbmVNYXBwaW5nRXhwb3N1cmUpLGgubmVlZHNMaWdodHMmJihmdW5jdGlvbiBFKHQsZSl7dC5hbWJpZW50TGlnaHRDb2xvci5uZWVkc1VwZGF0ZT1lLHQubGlnaHRQcm9iZS5uZWVkc1VwZGF0ZT1lLHQuZGlyZWN0aW9uYWxMaWdodHMubmVlZHNVcGRhdGU9ZSx0LmRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzLm5lZWRzVXBkYXRlPWUsdC5wb2ludExpZ2h0cy5uZWVkc1VwZGF0ZT1lLHQucG9pbnRMaWdodFNoYWRvd3MubmVlZHNVcGRhdGU9ZSx0LnNwb3RMaWdodHMubmVlZHNVcGRhdGU9ZSx0LnNwb3RMaWdodFNoYWRvd3MubmVlZHNVcGRhdGU9ZSx0LnJlY3RBcmVhTGlnaHRzLm5lZWRzVXBkYXRlPWUsdC5oZW1pc3BoZXJlTGlnaHRzLm5lZWRzVXBkYXRlPWV9KShNLHYpLHImJm4uZm9nJiZldC5yZWZyZXNoRm9nVW5pZm9ybXMoTSxyKSxldC5yZWZyZXNoTWF0ZXJpYWxVbmlmb3JtcyhNLG4sQSxDLEIpLFEydC51cGxvYWQoZHQsaC51bmlmb3Jtc0xpc3QsTSxYKSksbi5pc1NoYWRlck1hdGVyaWFsJiYhMD09PW4udW5pZm9ybXNOZWVkVXBkYXRlJiYoUTJ0LnVwbG9hZChkdCxoLnVuaWZvcm1zTGlzdCxNLFgpLG4udW5pZm9ybXNOZWVkVXBkYXRlPSExKSxuLmlzU3ByaXRlTWF0ZXJpYWwmJlMuc2V0VmFsdWUoZHQsImNlbnRlciIsaS5jZW50ZXIpLFMuc2V0VmFsdWUoZHQsIm1vZGVsVmlld01hdHJpeCIsaS5tb2RlbFZpZXdNYXRyaXgpLFMuc2V0VmFsdWUoZHQsIm5vcm1hbE1hdHJpeCIsaS5ub3JtYWxNYXRyaXgpLFMuc2V0VmFsdWUoZHQsIm1vZGVsTWF0cml4IixpLm1hdHJpeFdvcmxkKSxtfXd0LnNldEFuaW1hdGlvbkxvb3AoKGZ1bmN0aW9uIGt0KHQpe3Z0JiZ2dCh0KX0pKSwidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd3Quc2V0Q29udGV4dCh3aW5kb3cpLHRoaXMuc2V0QW5pbWF0aW9uTG9vcD1mdW5jdGlvbih0KXt2dD10LG10LnNldEFuaW1hdGlvbkxvb3AodCksbnVsbD09PXQ/d3Quc3RvcCgpOnd0LnN0YXJ0KCl9LG10LmFkZEV2ZW50TGlzdGVuZXIoInNlc3Npb25zdGFydCIsYnQpLG10LmFkZEV2ZW50TGlzdGVuZXIoInNlc3Npb25lbmQiLHh0KSx0aGlzLnJlbmRlcj1mdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PWUmJiEwIT09ZS5pc0NhbWVyYSlyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlbmRlcjogY2FtZXJhIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5DYW1lcmEuIik7aWYoITA9PT1fKXJldHVybjshMD09PXQuYXV0b1VwZGF0ZSYmdC51cGRhdGVNYXRyaXhXb3JsZCgpLG51bGw9PT1lLnBhcmVudCYmZS51cGRhdGVNYXRyaXhXb3JsZCgpLCEwPT09bXQuZW5hYmxlZCYmITA9PT1tdC5pc1ByZXNlbnRpbmcmJighMD09PW10LmNhbWVyYUF1dG9VcGRhdGUmJm10LnVwZGF0ZUNhbWVyYShlKSxlPW10LmdldENhbWVyYSgpKSwhMD09PXQuaXNTY2VuZSYmdC5vbkJlZm9yZVJlbmRlcihnLHQsZSxiKSxwPWl0LmdldCh0LG0ubGVuZ3RoKSxwLmluaXQoKSxtLnB1c2gocCksSC5tdWx0aXBseU1hdHJpY2VzKGUucHJvamVjdGlvbk1hdHJpeCxlLm1hdHJpeFdvcmxkSW52ZXJzZSksTy5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChIKSxEPXRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQsej1ydC5pbml0KHRoaXMuY2xpcHBpbmdQbGFuZXMsRCxlKSxkPW50LmdldCh0LGYubGVuZ3RoKSxkLmluaXQoKSxmLnB1c2goZCksU3QodCxlLDAsZy5zb3J0T2JqZWN0cyksZC5maW5pc2goKSwhMD09PWcuc29ydE9iamVjdHMmJmQuc29ydChrLEwpLCEwPT09eiYmcnQuYmVnaW5TaGFkb3dzKCksb3QucmVuZGVyKHAuc3RhdGUuc2hhZG93c0FycmF5LHQsZSkscC5zZXR1cExpZ2h0cygpLHAuc2V0dXBMaWdodHNWaWV3KGUpLCEwPT09eiYmcnQuZW5kU2hhZG93cygpLCEwPT09dGhpcy5pbmZvLmF1dG9SZXNldCYmdGhpcy5pbmZvLnJlc2V0KCksYXQucmVuZGVyKGQsdCk7Y29uc3Qgbj1kLm9wYXF1ZSxpPWQudHJhbnNtaXNzaXZlLHI9ZC50cmFuc3BhcmVudDtuLmxlbmd0aD4wJiZNdChuLHQsZSksaS5sZW5ndGg+MCYmKGZ1bmN0aW9uIG8odCxlLG4saSl7bnVsbD09PUImJihCPW5ldyghMD09PXMmJiEwPT09Ry5pc1dlYkdMMj9FSnQ6U0p0KSgxMDI0LDEwMjQse2dlbmVyYXRlTWlwbWFwczohMCx0eXBlOm51bGwhPT11dC5jb252ZXJ0KGxadCk/bFp0OnJadCxtaW5GaWx0ZXI6aVp0LG1hZ0ZpbHRlcjpKS3Qsd3JhcFM6S0t0LHdyYXBUOktLdH0pKTtjb25zdCByPWcuZ2V0UmVuZGVyVGFyZ2V0KCk7Zy5zZXRSZW5kZXJUYXJnZXQoQiksZy5jbGVhcigpO2NvbnN0IG89Zy50b25lTWFwcGluZztnLnRvbmVNYXBwaW5nPTAsTXQodCxuLGkpLGcudG9uZU1hcHBpbmc9byxYLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KEIpLFgudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKEIpLGcuc2V0UmVuZGVyVGFyZ2V0KHIpLE10KGUsbixpKX0pKG4saSx0LGUpLHIubGVuZ3RoPjAmJk10KHIsdCxlKSxudWxsIT09YiYmKFgudXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQoYiksWC51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoYikpLCEwPT09dC5pc1NjZW5lJiZ0Lm9uQWZ0ZXJSZW5kZXIoZyx0LGUpLFcuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCEwKSxXLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayghMCksVy5idWZmZXJzLmNvbG9yLnNldE1hc2soITApLFcuc2V0UG9seWdvbk9mZnNldCghMSksaHQucmVzZXREZWZhdWx0U3RhdGUoKSx4PS0xLHc9bnVsbCxtLnBvcCgpLHA9bS5sZW5ndGg+MD9tW20ubGVuZ3RoLTFdOm51bGwsZi5wb3AoKSxkPWYubGVuZ3RoPjA/ZltmLmxlbmd0aC0xXTpudWxsfSx0aGlzLmdldEFjdGl2ZUN1YmVGYWNlPWZ1bmN0aW9uKCl7cmV0dXJuIHl9LHRoaXMuZ2V0QWN0aXZlTWlwbWFwTGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdn0sdGhpcy5nZXRSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gYn0sdGhpcy5zZXRSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24odCxlPTAsbj0wKXtiPXQseT1lLHY9bix0JiZ2b2lkIDA9PT1ZLmdldCh0KS5fX3dlYmdsRnJhbWVidWZmZXImJlguc2V0dXBSZW5kZXJUYXJnZXQodCk7bGV0IGk9bnVsbCxyPSExLG89ITE7aWYodCl7Y29uc3Qgbj10LnRleHR1cmU7KG4uaXNEYXRhVGV4dHVyZTNEfHxuLmlzRGF0YVRleHR1cmUyREFycmF5KSYmKG89ITApO2NvbnN0IGE9WS5nZXQodCkuX193ZWJnbEZyYW1lYnVmZmVyO3QuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQ/KGk9YVtlXSxyPSEwKTppPXQuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0P1kuZ2V0KHQpLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcjphLFMuY29weSh0LnZpZXdwb3J0KSxNLmNvcHkodC5zY2lzc29yKSxFPXQuc2Npc3NvclRlc3R9ZWxzZSBTLmNvcHkoUCkubXVsdGlwbHlTY2FsYXIoQSkuZmxvb3IoKSxNLmNvcHkoTikubXVsdGlwbHlTY2FsYXIoQSkuZmxvb3IoKSxFPUk7aWYoVy5iaW5kRnJhbWVidWZmZXIoMzYxNjAsaSkmJkcuZHJhd0J1ZmZlcnMpe2xldCBlPSExO2lmKHQpaWYodC5pc1dlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzKXtjb25zdCBuPXQudGV4dHVyZTtpZihSLmxlbmd0aCE9PW4ubGVuZ3RofHwzNjA2NCE9PVJbMF0pe2ZvcihsZXQgdD0wLGU9bi5sZW5ndGg7dDxlO3QrKylSW3RdPTM2MDY0K3Q7Ui5sZW5ndGg9bi5sZW5ndGgsZT0hMH19ZWxzZSAxPT09Ui5sZW5ndGgmJjM2MDY0PT09UlswXXx8KFJbMF09MzYwNjQsUi5sZW5ndGg9MSxlPSEwKTtlbHNlIDE9PT1SLmxlbmd0aCYmMTAyOT09PVJbMF18fChSWzBdPTEwMjksUi5sZW5ndGg9MSxlPSEwKTtlJiYoRy5pc1dlYkdMMj9kdC5kcmF3QnVmZmVycyhSKTpqLmdldCgiV0VCR0xfZHJhd19idWZmZXJzIikuZHJhd0J1ZmZlcnNXRUJHTChSKSl9aWYoVy52aWV3cG9ydChTKSxXLnNjaXNzb3IoTSksVy5zZXRTY2lzc29yVGVzdChFKSxyKXtjb25zdCBpPVkuZ2V0KHQudGV4dHVyZSk7ZHQuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsMzYwNjQsMzQwNjkrZSxpLl9fd2ViZ2xUZXh0dXJlLG4pfWVsc2UgaWYobyl7Y29uc3QgaT1ZLmdldCh0LnRleHR1cmUpO2R0LmZyYW1lYnVmZmVyVGV4dHVyZUxheWVyKDM2MTYwLDM2MDY0LGkuX193ZWJnbFRleHR1cmUsbnx8MCxlfHwwKX19LHRoaXMucmVhZFJlbmRlclRhcmdldFBpeGVscz1mdW5jdGlvbih0LGUsbixpLHIsbyxhKXtpZighdHx8IXQuaXNXZWJHTFJlbmRlclRhcmdldClyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQuIik7bGV0IHM9WS5nZXQodCkuX193ZWJnbEZyYW1lYnVmZmVyO2lmKHQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQmJnZvaWQgMCE9PWEmJihzPXNbYV0pLHMpe1cuYmluZEZyYW1lYnVmZmVyKDM2MTYwLHMpO3RyeXtjb25zdCBhPXQudGV4dHVyZSxzPWEuZm9ybWF0LGw9YS50eXBlO2lmKHMhPT1oWnQmJnV0LmNvbnZlcnQocykhPT1kdC5nZXRQYXJhbWV0ZXIoMzU3MzkpKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBSR0JBIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgZm9ybWF0LiIpO2NvbnN0IGM9bD09PWxadCYmKGouaGFzKCJFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQiKXx8Ry5pc1dlYkdMMiYmai5oYXMoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKSk7aWYoIShsPT09clp0fHx1dC5jb252ZXJ0KGwpPT09ZHQuZ2V0UGFyYW1ldGVyKDM1NzM4KXx8bD09PXNadCYmKEcuaXNXZWJHTDJ8fGouaGFzKCJPRVNfdGV4dHVyZV9mbG9hdCIpfHxqLmhhcygiV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0IikpfHxjKSlyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gVW5zaWduZWRCeXRlVHlwZSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHR5cGUuIik7MzYwNTM9PT1kdC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKDM2MTYwKT9lPj0wJiZlPD10LndpZHRoLWkmJm4+PTAmJm48PXQuaGVpZ2h0LXImJmR0LnJlYWRQaXhlbHMoZSxuLGkscix1dC5jb252ZXJ0KHMpLHV0LmNvbnZlcnQobCksbyk6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZWFkUGl4ZWxzIGZyb20gcmVuZGVyVGFyZ2V0IGZhaWxlZC4gRnJhbWVidWZmZXIgbm90IGNvbXBsZXRlLiIpfWZpbmFsbHl7Y29uc3QgdD1udWxsIT09Yj9ZLmdldChiKS5fX3dlYmdsRnJhbWVidWZmZXI6bnVsbDtXLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCx0KX19fSx0aGlzLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZT1mdW5jdGlvbih0LGUsbj0wKXtjb25zdCBpPU1hdGgucG93KDIsLW4pLHI9TWF0aC5mbG9vcihlLmltYWdlLndpZHRoKmkpLG89TWF0aC5mbG9vcihlLmltYWdlLmhlaWdodCppKTtsZXQgYT11dC5jb252ZXJ0KGUuZm9ybWF0KTtHLmlzV2ViR0wyJiYoNjQwNz09PWEmJihhPTMyODQ5KSw2NDA4PT09YSYmKGE9MzI4NTYpKSxYLnNldFRleHR1cmUyRChlLDApLGR0LmNvcHlUZXhJbWFnZTJEKDM1NTMsbixhLHQueCx0LnkscixvLDApLFcudW5iaW5kVGV4dHVyZSgpfSx0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlPWZ1bmN0aW9uKHQsZSxuLGk9MCl7Y29uc3Qgcj1lLmltYWdlLndpZHRoLG89ZS5pbWFnZS5oZWlnaHQsYT11dC5jb252ZXJ0KG4uZm9ybWF0KSxzPXV0LmNvbnZlcnQobi50eXBlKTtYLnNldFRleHR1cmUyRChuLDApLGR0LnBpeGVsU3RvcmVpKDM3NDQwLG4uZmxpcFkpLGR0LnBpeGVsU3RvcmVpKDM3NDQxLG4ucHJlbXVsdGlwbHlBbHBoYSksZHQucGl4ZWxTdG9yZWkoMzMxNyxuLnVucGFja0FsaWdubWVudCksZS5pc0RhdGFUZXh0dXJlP2R0LnRleFN1YkltYWdlMkQoMzU1MyxpLHQueCx0LnkscixvLGEscyxlLmltYWdlLmRhdGEpOmUuaXNDb21wcmVzc2VkVGV4dHVyZT9kdC5jb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCgzNTUzLGksdC54LHQueSxlLm1pcG1hcHNbMF0ud2lkdGgsZS5taXBtYXBzWzBdLmhlaWdodCxhLGUubWlwbWFwc1swXS5kYXRhKTpkdC50ZXhTdWJJbWFnZTJEKDM1NTMsaSx0LngsdC55LGEscyxlLmltYWdlKSwwPT09aSYmbi5nZW5lcmF0ZU1pcG1hcHMmJmR0LmdlbmVyYXRlTWlwbWFwKDM1NTMpLFcudW5iaW5kVGV4dHVyZSgpfSx0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlM0Q9ZnVuY3Rpb24odCxlLG4saSxyPTApe2lmKGcuaXNXZWJHTDFSZW5kZXJlcilyZXR1cm4gdm9pZCBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXIuY29weVRleHR1cmVUb1RleHR1cmUzRDogY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFdlYkdMMi4iKTtjb25zdCBvPXQubWF4LngtdC5taW4ueCsxLGE9dC5tYXgueS10Lm1pbi55KzEscz10Lm1heC56LXQubWluLnorMSxsPXV0LmNvbnZlcnQoaS5mb3JtYXQpLGM9dXQuY29udmVydChpLnR5cGUpO2xldCB1O2lmKGkuaXNEYXRhVGV4dHVyZTNEKVguc2V0VGV4dHVyZTNEKGksMCksdT0zMjg3OTtlbHNle2lmKCFpLmlzRGF0YVRleHR1cmUyREFycmF5KXJldHVybiB2b2lkIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlci5jb3B5VGV4dHVyZVRvVGV4dHVyZTNEOiBvbmx5IHN1cHBvcnRzIFRIUkVFLkRhdGFUZXh0dXJlM0QgYW5kIFRIUkVFLkRhdGFUZXh0dXJlMkRBcnJheS4iKTtYLnNldFRleHR1cmUyREFycmF5KGksMCksdT0zNTg2Nn1kdC5waXhlbFN0b3JlaSgzNzQ0MCxpLmZsaXBZKSxkdC5waXhlbFN0b3JlaSgzNzQ0MSxpLnByZW11bHRpcGx5QWxwaGEpLGR0LnBpeGVsU3RvcmVpKDMzMTcsaS51bnBhY2tBbGlnbm1lbnQpO2NvbnN0IGg9ZHQuZ2V0UGFyYW1ldGVyKDMzMTQpLGQ9ZHQuZ2V0UGFyYW1ldGVyKDMyODc4KSxwPWR0LmdldFBhcmFtZXRlcigzMzE2KSxmPWR0LmdldFBhcmFtZXRlcigzMzE1KSxtPWR0LmdldFBhcmFtZXRlcigzMjg3NyksXz1uLmlzQ29tcHJlc3NlZFRleHR1cmU/bi5taXBtYXBzWzBdOm4uaW1hZ2U7ZHQucGl4ZWxTdG9yZWkoMzMxNCxfLndpZHRoKSxkdC5waXhlbFN0b3JlaSgzMjg3OCxfLmhlaWdodCksZHQucGl4ZWxTdG9yZWkoMzMxNix0Lm1pbi54KSxkdC5waXhlbFN0b3JlaSgzMzE1LHQubWluLnkpLGR0LnBpeGVsU3RvcmVpKDMyODc3LHQubWluLnopLG4uaXNEYXRhVGV4dHVyZXx8bi5pc0RhdGFUZXh0dXJlM0Q/ZHQudGV4U3ViSW1hZ2UzRCh1LHIsZS54LGUueSxlLnosbyxhLHMsbCxjLF8uZGF0YSk6bi5pc0NvbXByZXNzZWRUZXh0dXJlPyhjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXIuY29weVRleHR1cmVUb1RleHR1cmUzRDogdW50ZXN0ZWQgc3VwcG9ydCBmb3IgY29tcHJlc3NlZCBzcmNUZXh0dXJlLiIpLGR0LmNvbXByZXNzZWRUZXhTdWJJbWFnZTNEKHUscixlLngsZS55LGUueixvLGEscyxsLF8uZGF0YSkpOmR0LnRleFN1YkltYWdlM0QodSxyLGUueCxlLnksZS56LG8sYSxzLGwsYyxfKSxkdC5waXhlbFN0b3JlaSgzMzE0LGgpLGR0LnBpeGVsU3RvcmVpKDMyODc4LGQpLGR0LnBpeGVsU3RvcmVpKDMzMTYscCksZHQucGl4ZWxTdG9yZWkoMzMxNSxmKSxkdC5waXhlbFN0b3JlaSgzMjg3NyxtKSwwPT09ciYmaS5nZW5lcmF0ZU1pcG1hcHMmJmR0LmdlbmVyYXRlTWlwbWFwKHUpLFcudW5iaW5kVGV4dHVyZSgpfSx0aGlzLmluaXRUZXh0dXJlPWZ1bmN0aW9uKHQpe1guc2V0VGV4dHVyZTJEKHQsMCksVy51bmJpbmRUZXh0dXJlKCl9LHRoaXMucmVzZXRTdGF0ZT1mdW5jdGlvbigpe3k9MCx2PTAsYj1udWxsLFcucmVzZXQoKSxodC5yZXNldCgpfSwidW5kZWZpbmVkIiE9dHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyYmX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJvYnNlcnZlIix7ZGV0YWlsOnRoaXN9KSl9Y2xhc3MgVzV0IGV4dGVuZHMgRzV0e31XNXQucHJvdG90eXBlLmlzV2ViR0wxUmVuZGVyZXI9ITA7Y2xhc3MgcTV0e2NvbnN0cnVjdG9yKHQsZT0yNWUtNSl7dGhpcy5uYW1lPSIiLHRoaXMuY29sb3I9bmV3ICRRdCh0KSx0aGlzLmRlbnNpdHk9ZX1jbG9uZSgpe3JldHVybiBuZXcgcTV0KHRoaXMuY29sb3IsdGhpcy5kZW5zaXR5KX10b0pTT04oKXtyZXR1cm57dHlwZToiRm9nRXhwMiIsY29sb3I6dGhpcy5jb2xvci5nZXRIZXgoKSxkZW5zaXR5OnRoaXMuZGVuc2l0eX19fXE1dC5wcm90b3R5cGUuaXNGb2dFeHAyPSEwO2NsYXNzIFk1dHtjb25zdHJ1Y3Rvcih0LGU9MSxuPTFlMyl7dGhpcy5uYW1lPSIiLHRoaXMuY29sb3I9bmV3ICRRdCh0KSx0aGlzLm5lYXI9ZSx0aGlzLmZhcj1ufWNsb25lKCl7cmV0dXJuIG5ldyBZNXQodGhpcy5jb2xvcix0aGlzLm5lYXIsdGhpcy5mYXIpfXRvSlNPTigpe3JldHVybnt0eXBlOiJGb2ciLGNvbG9yOnRoaXMuY29sb3IuZ2V0SGV4KCksbmVhcjp0aGlzLm5lYXIsZmFyOnRoaXMuZmFyfX19WTV0LnByb3RvdHlwZS5pc0ZvZz0hMDtjbGFzcyBYNXQgZXh0ZW5kcyBrUXR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudHlwZT0iU2NlbmUiLHRoaXMuYmFja2dyb3VuZD1udWxsLHRoaXMuZW52aXJvbm1lbnQ9bnVsbCx0aGlzLmZvZz1udWxsLHRoaXMub3ZlcnJpZGVNYXRlcmlhbD1udWxsLHRoaXMuYXV0b1VwZGF0ZT0hMCwidW5kZWZpbmVkIiE9dHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyYmX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJvYnNlcnZlIix7ZGV0YWlsOnRoaXN9KSl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksbnVsbCE9PXQuYmFja2dyb3VuZCYmKHRoaXMuYmFja2dyb3VuZD10LmJhY2tncm91bmQuY2xvbmUoKSksbnVsbCE9PXQuZW52aXJvbm1lbnQmJih0aGlzLmVudmlyb25tZW50PXQuZW52aXJvbm1lbnQuY2xvbmUoKSksbnVsbCE9PXQuZm9nJiYodGhpcy5mb2c9dC5mb2cuY2xvbmUoKSksbnVsbCE9PXQub3ZlcnJpZGVNYXRlcmlhbCYmKHRoaXMub3ZlcnJpZGVNYXRlcmlhbD10Lm92ZXJyaWRlTWF0ZXJpYWwuY2xvbmUoKSksdGhpcy5hdXRvVXBkYXRlPXQuYXV0b1VwZGF0ZSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlLHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO3JldHVybiBudWxsIT09dGhpcy5mb2cmJihlLm9iamVjdC5mb2c9dGhpcy5mb2cudG9KU09OKCkpLGV9fVg1dC5wcm90b3R5cGUuaXNTY2VuZT0hMDtjbGFzcyAkNXR7Y29uc3RydWN0b3IodCxlKXt0aGlzLmFycmF5PXQsdGhpcy5zdHJpZGU9ZSx0aGlzLmNvdW50PXZvaWQgMCE9PXQ/dC5sZW5ndGgvZTowLHRoaXMudXNhZ2U9Rlp0LHRoaXMudXBkYXRlUmFuZ2U9e29mZnNldDowLGNvdW50Oi0xfSx0aGlzLnZlcnNpb249MCx0aGlzLnV1aWQ9WFp0KCl9b25VcGxvYWRDYWxsYmFjaygpe31zZXQgbmVlZHNVcGRhdGUodCl7ITA9PT10JiZ0aGlzLnZlcnNpb24rK31zZXRVc2FnZSh0KXtyZXR1cm4gdGhpcy51c2FnZT10LHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5hcnJheT1uZXcgdC5hcnJheS5jb25zdHJ1Y3Rvcih0LmFycmF5KSx0aGlzLmNvdW50PXQuY291bnQsdGhpcy5zdHJpZGU9dC5zdHJpZGUsdGhpcy51c2FnZT10LnVzYWdlLHRoaXN9Y29weUF0KHQsZSxuKXt0Kj10aGlzLnN0cmlkZSxuKj1lLnN0cmlkZTtmb3IobGV0IGk9MCxyPXRoaXMuc3RyaWRlO2k8cjtpKyspdGhpcy5hcnJheVt0K2ldPWUuYXJyYXlbbitpXTtyZXR1cm4gdGhpc31zZXQodCxlPTApe3JldHVybiB0aGlzLmFycmF5LnNldCh0LGUpLHRoaXN9Y2xvbmUodCl7dm9pZCAwPT09dC5hcnJheUJ1ZmZlcnMmJih0LmFycmF5QnVmZmVycz17fSksdm9pZCAwPT09dGhpcy5hcnJheS5idWZmZXIuX3V1aWQmJih0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZD1YWnQoKSksdm9pZCAwPT09dC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdJiYodC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPXRoaXMuYXJyYXkuc2xpY2UoMCkuYnVmZmVyKTtjb25zdCBlPW5ldyB0aGlzLmFycmF5LmNvbnN0cnVjdG9yKHQuYXJyYXlCdWZmZXJzW3RoaXMuYXJyYXkuYnVmZmVyLl91dWlkXSksbj1uZXcgdGhpcy5jb25zdHJ1Y3RvcihlLHRoaXMuc3RyaWRlKTtyZXR1cm4gbi5zZXRVc2FnZSh0aGlzLnVzYWdlKSxufW9uVXBsb2FkKHQpe3JldHVybiB0aGlzLm9uVXBsb2FkQ2FsbGJhY2s9dCx0aGlzfXRvSlNPTih0KXtyZXR1cm4gdm9pZCAwPT09dC5hcnJheUJ1ZmZlcnMmJih0LmFycmF5QnVmZmVycz17fSksdm9pZCAwPT09dGhpcy5hcnJheS5idWZmZXIuX3V1aWQmJih0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZD1YWnQoKSksdm9pZCAwPT09dC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdJiYodC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5LmJ1ZmZlcikpKSx7dXVpZDp0aGlzLnV1aWQsYnVmZmVyOnRoaXMuYXJyYXkuYnVmZmVyLl91dWlkLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLHN0cmlkZTp0aGlzLnN0cmlkZX19fSQ1dC5wcm90b3R5cGUuaXNJbnRlcmxlYXZlZEJ1ZmZlcj0hMDtjb25zdCBLNXQ9bmV3IENKdDtjbGFzcyBaNXR7Y29uc3RydWN0b3IodCxlLG4saT0hMSl7dGhpcy5uYW1lPSIiLHRoaXMuZGF0YT10LHRoaXMuaXRlbVNpemU9ZSx0aGlzLm9mZnNldD1uLHRoaXMubm9ybWFsaXplZD0hMD09PWl9Z2V0IGNvdW50KCl7cmV0dXJuIHRoaXMuZGF0YS5jb3VudH1nZXQgYXJyYXkoKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5fXNldCBuZWVkc1VwZGF0ZSh0KXt0aGlzLmRhdGEubmVlZHNVcGRhdGU9dH1hcHBseU1hdHJpeDQodCl7Zm9yKGxldCBlPTAsbj10aGlzLmRhdGEuY291bnQ7ZTxuO2UrKylLNXQueD10aGlzLmdldFgoZSksSzV0Lnk9dGhpcy5nZXRZKGUpLEs1dC56PXRoaXMuZ2V0WihlKSxLNXQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0WFlaKGUsSzV0LngsSzV0LnksSzV0LnopO3JldHVybiB0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKUs1dC54PXRoaXMuZ2V0WChlKSxLNXQueT10aGlzLmdldFkoZSksSzV0Lno9dGhpcy5nZXRaKGUpLEs1dC5hcHBseU5vcm1hbE1hdHJpeCh0KSx0aGlzLnNldFhZWihlLEs1dC54LEs1dC55LEs1dC56KTtyZXR1cm4gdGhpc310cmFuc2Zvcm1EaXJlY3Rpb24odCl7Zm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspSzV0Lng9dGhpcy5nZXRYKGUpLEs1dC55PXRoaXMuZ2V0WShlKSxLNXQuej10aGlzLmdldFooZSksSzV0LnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzLnNldFhZWihlLEs1dC54LEs1dC55LEs1dC56KTtyZXR1cm4gdGhpc31zZXRYKHQsZSl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXRdPWUsdGhpc31zZXRZKHQsZSl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMV09ZSx0aGlzfXNldFoodCxlKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCsyXT1lLHRoaXN9c2V0Vyh0LGUpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzNdPWUsdGhpc31nZXRYKHQpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0XX1nZXRZKHQpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzFdfWdldFoodCl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMl19Z2V0Vyh0KXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCszXX1zZXRYWSh0LGUsbil7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsodD10KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQpKzBdPWUsdGhpcy5kYXRhLmFycmF5W3QrMV09bix0aGlzfXNldFhZWih0LGUsbixpKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5Wyh0PXQqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCkrMF09ZSx0aGlzLmRhdGEuYXJyYXlbdCsxXT1uLHRoaXMuZGF0YS5hcnJheVt0KzJdPWksdGhpc31zZXRYWVpXKHQsZSxuLGkscil7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsodD10KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQpKzBdPWUsdGhpcy5kYXRhLmFycmF5W3QrMV09bix0aGlzLmRhdGEuYXJyYXlbdCsyXT1pLHRoaXMuZGF0YS5hcnJheVt0KzNdPXIsdGhpc31jbG9uZSh0KXtpZih2b2lkIDA9PT10KXtjb25zb2xlLmxvZygiVEhSRUUuSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUuY2xvbmUoKTogQ2xvbmluZyBhbiBpbnRlcmxhdmVkIGJ1ZmZlciBhdHRyaWJ1dGUgd2lsbCBkZWludGVybGVhdmUgYnVmZmVyIGRhdGEuIik7Y29uc3QgdD1bXTtmb3IobGV0IGU9MDtlPHRoaXMuY291bnQ7ZSsrKXtjb25zdCBuPWUqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldDtmb3IobGV0IGU9MDtlPHRoaXMuaXRlbVNpemU7ZSsrKXQucHVzaCh0aGlzLmRhdGEuYXJyYXlbbitlXSl9cmV0dXJuIG5ldyBRUXQobmV3IHRoaXMuYXJyYXkuY29uc3RydWN0b3IodCksdGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQpfXJldHVybiB2b2lkIDA9PT10LmludGVybGVhdmVkQnVmZmVycyYmKHQuaW50ZXJsZWF2ZWRCdWZmZXJzPXt9KSx2b2lkIDA9PT10LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF0mJih0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF09dGhpcy5kYXRhLmNsb25lKHQpKSxuZXcgWjV0KHQuaW50ZXJsZWF2ZWRCdWZmZXJzW3RoaXMuZGF0YS51dWlkXSx0aGlzLml0ZW1TaXplLHRoaXMub2Zmc2V0LHRoaXMubm9ybWFsaXplZCl9dG9KU09OKHQpe2lmKHZvaWQgMD09PXQpe2NvbnNvbGUubG9nKCJUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS50b0pTT04oKTogU2VyaWFsaXppbmcgYW4gaW50ZXJsYXZlZCBidWZmZXIgYXR0cmlidXRlIHdpbGwgZGVpbnRlcmxlYXZlIGJ1ZmZlciBkYXRhLiIpO2NvbnN0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLmNvdW50O2UrKyl7Y29uc3Qgbj1lKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQ7Zm9yKGxldCBlPTA7ZTx0aGlzLml0ZW1TaXplO2UrKyl0LnB1c2godGhpcy5kYXRhLmFycmF5W24rZV0pfXJldHVybntpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OnQsbm9ybWFsaXplZDp0aGlzLm5vcm1hbGl6ZWR9fXJldHVybiB2b2lkIDA9PT10LmludGVybGVhdmVkQnVmZmVycyYmKHQuaW50ZXJsZWF2ZWRCdWZmZXJzPXt9KSx2b2lkIDA9PT10LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF0mJih0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF09dGhpcy5kYXRhLnRvSlNPTih0KSkse2lzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6ITAsaXRlbVNpemU6dGhpcy5pdGVtU2l6ZSxkYXRhOnRoaXMuZGF0YS51dWlkLG9mZnNldDp0aGlzLm9mZnNldCxub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH19fVo1dC5wcm90b3R5cGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZT0hMDtjbGFzcyBKNXQgZXh0ZW5kcyBVUXR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9IlNwcml0ZU1hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyAkUXQoMTY3NzcyMTUpLHRoaXMubWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMucm90YXRpb249MCx0aGlzLnNpemVBdHRlbnVhdGlvbj0hMCx0aGlzLnRyYW5zcGFyZW50PSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubWFwPXQubWFwLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLnJvdGF0aW9uPXQucm90YXRpb24sdGhpcy5zaXplQXR0ZW51YXRpb249dC5zaXplQXR0ZW51YXRpb24sdGhpc319bGV0IFE1dDtKNXQucHJvdG90eXBlLmlzU3ByaXRlTWF0ZXJpYWw9ITA7Y29uc3QgdDN0PW5ldyBDSnQsZTN0PW5ldyBDSnQsbjN0PW5ldyBDSnQsaTN0PW5ldyBtSnQscjN0PW5ldyBtSnQsbzN0PW5ldyByUXQsYTN0PW5ldyBDSnQsczN0PW5ldyBDSnQsbDN0PW5ldyBDSnQsYzN0PW5ldyBtSnQsdTN0PW5ldyBtSnQsaDN0PW5ldyBtSnQ7Y2xhc3MgZDN0IGV4dGVuZHMga1F0e2NvbnN0cnVjdG9yKHQpe2lmKHN1cGVyKCksdGhpcy50eXBlPSJTcHJpdGUiLHZvaWQgMD09PVE1dCl7UTV0PW5ldyBiMXQ7Y29uc3QgdD1uZXcgRmxvYXQzMkFycmF5KFstLjUsLS41LDAsMCwwLC41LC0uNSwwLDEsMCwuNSwuNSwwLDEsMSwtLjUsLjUsMCwwLDFdKSxlPW5ldyAkNXQodCw1KTtRNXQuc2V0SW5kZXgoWzAsMSwyLDAsMiwzXSksUTV0LnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBaNXQoZSwzLDAsITEpKSxRNXQuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFo1dChlLDIsMywhMSkpfXRoaXMuZ2VvbWV0cnk9UTV0LHRoaXMubWF0ZXJpYWw9dm9pZCAwIT09dD90Om5ldyBKNXQsdGhpcy5jZW50ZXI9bmV3IG1KdCguNSwuNSl9cmF5Y2FzdCh0LGUpe251bGw9PT10LmNhbWVyYSYmY29uc29sZS5lcnJvcignVEhSRUUuU3ByaXRlOiAiUmF5Y2FzdGVyLmNhbWVyYSIgbmVlZHMgdG8gYmUgc2V0IGluIG9yZGVyIHRvIHJheWNhc3QgYWdhaW5zdCBzcHJpdGVzLicpLGUzdC5zZXRGcm9tTWF0cml4U2NhbGUodGhpcy5tYXRyaXhXb3JsZCksbzN0LmNvcHkodC5jYW1lcmEubWF0cml4V29ybGQpLHRoaXMubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXModC5jYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLHRoaXMubWF0cml4V29ybGQpLG4zdC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tb2RlbFZpZXdNYXRyaXgpLHQuY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEmJiExPT09dGhpcy5tYXRlcmlhbC5zaXplQXR0ZW51YXRpb24mJmUzdC5tdWx0aXBseVNjYWxhcigtbjN0LnopO2NvbnN0IG49dGhpcy5tYXRlcmlhbC5yb3RhdGlvbjtsZXQgaSxyOzAhPT1uJiYocj1NYXRoLmNvcyhuKSxpPU1hdGguc2luKG4pKTtjb25zdCBvPXRoaXMuY2VudGVyO3AzdChhM3Quc2V0KC0uNSwtLjUsMCksbjN0LG8sZTN0LGkscikscDN0KHMzdC5zZXQoLjUsLS41LDApLG4zdCxvLGUzdCxpLHIpLHAzdChsM3Quc2V0KC41LC41LDApLG4zdCxvLGUzdCxpLHIpLGMzdC5zZXQoMCwwKSx1M3Quc2V0KDEsMCksaDN0LnNldCgxLDEpO2xldCBhPXQucmF5LmludGVyc2VjdFRyaWFuZ2xlKGEzdCxzM3QsbDN0LCExLHQzdCk7aWYobnVsbD09PWEmJihwM3QoczN0LnNldCgtLjUsLjUsMCksbjN0LG8sZTN0LGksciksdTN0LnNldCgwLDEpLGE9dC5yYXkuaW50ZXJzZWN0VHJpYW5nbGUoYTN0LGwzdCxzM3QsITEsdDN0KSxudWxsPT09YSkpcmV0dXJuO2NvbnN0IHM9dC5yYXkub3JpZ2luLmRpc3RhbmNlVG8odDN0KTtzPHQubmVhcnx8cz50LmZhcnx8ZS5wdXNoKHtkaXN0YW5jZTpzLHBvaW50OnQzdC5jbG9uZSgpLHV2OkZRdC5nZXRVVih0M3QsYTN0LHMzdCxsM3QsYzN0LHUzdCxoM3QsbmV3IG1KdCksZmFjZTpudWxsLG9iamVjdDp0aGlzfSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx2b2lkIDAhPT10LmNlbnRlciYmdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5tYXRlcmlhbD10Lm1hdGVyaWFsLHRoaXN9fWZ1bmN0aW9uIHAzdCh0LGUsbixpLHIsbyl7aTN0LnN1YlZlY3RvcnModCxuKS5hZGRTY2FsYXIoLjUpLm11bHRpcGx5KGkpLHZvaWQgMCE9PXI/KHIzdC54PW8qaTN0LngtcippM3QueSxyM3QueT1yKmkzdC54K28qaTN0LnkpOnIzdC5jb3B5KGkzdCksdC5jb3B5KGUpLHQueCs9cjN0LngsdC55Kz1yM3QueSx0LmFwcGx5TWF0cml4NChvM3QpfWQzdC5wcm90b3R5cGUuaXNTcHJpdGU9ITA7Y29uc3QgZjN0PW5ldyBDSnQsbTN0PW5ldyBDSnQ7Y2xhc3MgZzN0IGV4dGVuZHMga1F0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9jdXJyZW50TGV2ZWw9MCx0aGlzLnR5cGU9IkxPRCIsT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7bGV2ZWxzOntlbnVtZXJhYmxlOiEwLHZhbHVlOltdfSxpc0xPRDp7dmFsdWU6ITB9fSksdGhpcy5hdXRvVXBkYXRlPSEwfWNvcHkodCl7c3VwZXIuY29weSh0LCExKTtjb25zdCBlPXQubGV2ZWxzO2ZvcihsZXQgdD0wLG49ZS5sZW5ndGg7dDxuO3QrKyl7Y29uc3Qgbj1lW3RdO3RoaXMuYWRkTGV2ZWwobi5vYmplY3QuY2xvbmUoKSxuLmRpc3RhbmNlKX1yZXR1cm4gdGhpcy5hdXRvVXBkYXRlPXQuYXV0b1VwZGF0ZSx0aGlzfWFkZExldmVsKHQsZT0wKXtlPU1hdGguYWJzKGUpO2NvbnN0IG49dGhpcy5sZXZlbHM7bGV0IGk7Zm9yKGk9MDtpPG4ubGVuZ3RoJiYhKGU8bltpXS5kaXN0YW5jZSk7aSsrKTtyZXR1cm4gbi5zcGxpY2UoaSwwLHtkaXN0YW5jZTplLG9iamVjdDp0fSksdGhpcy5hZGQodCksdGhpc31nZXRDdXJyZW50TGV2ZWwoKXtyZXR1cm4gdGhpcy5fY3VycmVudExldmVsfWdldE9iamVjdEZvckRpc3RhbmNlKHQpe2NvbnN0IGU9dGhpcy5sZXZlbHM7aWYoZS5sZW5ndGg+MCl7bGV0IG4saTtmb3Iobj0xLGk9ZS5sZW5ndGg7bjxpJiYhKHQ8ZVtuXS5kaXN0YW5jZSk7bisrKTtyZXR1cm4gZVtuLTFdLm9iamVjdH1yZXR1cm4gbnVsbH1yYXljYXN0KHQsZSl7aWYodGhpcy5sZXZlbHMubGVuZ3RoPjApe2YzdC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7Y29uc3Qgbj10LnJheS5vcmlnaW4uZGlzdGFuY2VUbyhmM3QpO3RoaXMuZ2V0T2JqZWN0Rm9yRGlzdGFuY2UobikucmF5Y2FzdCh0LGUpfX11cGRhdGUodCl7Y29uc3QgZT10aGlzLmxldmVscztpZihlLmxlbmd0aD4xKXtmM3Quc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQubWF0cml4V29ybGQpLG0zdC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7Y29uc3Qgbj1mM3QuZGlzdGFuY2VUbyhtM3QpL3Quem9vbTtsZXQgaSxyO2ZvcihlWzBdLm9iamVjdC52aXNpYmxlPSEwLGk9MSxyPWUubGVuZ3RoO2k8ciYmbj49ZVtpXS5kaXN0YW5jZTtpKyspZVtpLTFdLm9iamVjdC52aXNpYmxlPSExLGVbaV0ub2JqZWN0LnZpc2libGU9ITA7Zm9yKHRoaXMuX2N1cnJlbnRMZXZlbD1pLTE7aTxyO2krKyllW2ldLm9iamVjdC52aXNpYmxlPSExfX10b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7ITE9PT10aGlzLmF1dG9VcGRhdGUmJihlLm9iamVjdC5hdXRvVXBkYXRlPSExKSxlLm9iamVjdC5sZXZlbHM9W107Y29uc3Qgbj10aGlzLmxldmVscztmb3IobGV0IHQ9MCxpPW4ubGVuZ3RoO3Q8aTt0Kyspe2NvbnN0IGk9blt0XTtlLm9iamVjdC5sZXZlbHMucHVzaCh7b2JqZWN0Omkub2JqZWN0LnV1aWQsZGlzdGFuY2U6aS5kaXN0YW5jZX0pfXJldHVybiBlfX1jb25zdCBfM3Q9bmV3IENKdCx5M3Q9bmV3IHdKdCx2M3Q9bmV3IHdKdCxiM3Q9bmV3IENKdCx4M3Q9bmV3IHJRdDtjbGFzcyB3M3QgZXh0ZW5kcyBCMXR7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpLHRoaXMudHlwZT0iU2tpbm5lZE1lc2giLHRoaXMuYmluZE1vZGU9ImF0dGFjaGVkIix0aGlzLmJpbmRNYXRyaXg9bmV3IHJRdCx0aGlzLmJpbmRNYXRyaXhJbnZlcnNlPW5ldyByUXR9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmJpbmRNb2RlPXQuYmluZE1vZGUsdGhpcy5iaW5kTWF0cml4LmNvcHkodC5iaW5kTWF0cml4KSx0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkodC5iaW5kTWF0cml4SW52ZXJzZSksdGhpcy5za2VsZXRvbj10LnNrZWxldG9uLHRoaXN9YmluZCh0LGUpe3RoaXMuc2tlbGV0b249dCx2b2lkIDA9PT1lJiYodGhpcy51cGRhdGVNYXRyaXhXb3JsZCghMCksdGhpcy5za2VsZXRvbi5jYWxjdWxhdGVJbnZlcnNlcygpLGU9dGhpcy5tYXRyaXhXb3JsZCksdGhpcy5iaW5kTWF0cml4LmNvcHkoZSksdGhpcy5iaW5kTWF0cml4SW52ZXJzZS5jb3B5KGUpLmludmVydCgpfXBvc2UoKXt0aGlzLnNrZWxldG9uLnBvc2UoKX1ub3JtYWxpemVTa2luV2VpZ2h0cygpe2NvbnN0IHQ9bmV3IHdKdCxlPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0O2ZvcihsZXQgbj0wLGk9ZS5jb3VudDtuPGk7bisrKXt0Lng9ZS5nZXRYKG4pLHQueT1lLmdldFkobiksdC56PWUuZ2V0WihuKSx0Lnc9ZS5nZXRXKG4pO2NvbnN0IGk9MS90Lm1hbmhhdHRhbkxlbmd0aCgpO2khPT0xLzA/dC5tdWx0aXBseVNjYWxhcihpKTp0LnNldCgxLDAsMCwwKSxlLnNldFhZWlcobix0LngsdC55LHQueix0LncpfX11cGRhdGVNYXRyaXhXb3JsZCh0KXtzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KSwiYXR0YWNoZWQiPT09dGhpcy5iaW5kTW9kZT90aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCk6ImRldGFjaGVkIj09PXRoaXMuYmluZE1vZGU/dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMuYmluZE1hdHJpeCkuaW52ZXJ0KCk6Y29uc29sZS53YXJuKCJUSFJFRS5Ta2lubmVkTWVzaDogVW5yZWNvZ25pemVkIGJpbmRNb2RlOiAiK3RoaXMuYmluZE1vZGUpfWJvbmVUcmFuc2Zvcm0odCxlKXtjb25zdCBuPXRoaXMuc2tlbGV0b24saT10aGlzLmdlb21ldHJ5O3kzdC5mcm9tQnVmZmVyQXR0cmlidXRlKGkuYXR0cmlidXRlcy5za2luSW5kZXgsdCksdjN0LmZyb21CdWZmZXJBdHRyaWJ1dGUoaS5hdHRyaWJ1dGVzLnNraW5XZWlnaHQsdCksXzN0LmZyb21CdWZmZXJBdHRyaWJ1dGUoaS5hdHRyaWJ1dGVzLnBvc2l0aW9uLHQpLmFwcGx5TWF0cml4NCh0aGlzLmJpbmRNYXRyaXgpLGUuc2V0KDAsMCwwKTtmb3IobGV0IHQ9MDt0PDQ7dCsrKXtjb25zdCBpPXYzdC5nZXRDb21wb25lbnQodCk7aWYoMCE9PWkpe2NvbnN0IHI9eTN0LmdldENvbXBvbmVudCh0KTt4M3QubXVsdGlwbHlNYXRyaWNlcyhuLmJvbmVzW3JdLm1hdHJpeFdvcmxkLG4uYm9uZUludmVyc2VzW3JdKSxlLmFkZFNjYWxlZFZlY3RvcihiM3QuY29weShfM3QpLmFwcGx5TWF0cml4NCh4M3QpLGkpfX1yZXR1cm4gZS5hcHBseU1hdHJpeDQodGhpcy5iaW5kTWF0cml4SW52ZXJzZSl9fXczdC5wcm90b3R5cGUuaXNTa2lubmVkTWVzaD0hMDtjbGFzcyBTM3QgZXh0ZW5kcyBrUXR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudHlwZT0iQm9uZSJ9fVMzdC5wcm90b3R5cGUuaXNCb25lPSEwO2NsYXNzIE0zdCBleHRlbmRzIGJKdHtjb25zdHJ1Y3Rvcih0PW51bGwsZT0xLG49MSxpLHIsbyxhLHMsbD0xMDAzLGM9MTAwMyx1LGgpe3N1cGVyKG51bGwsbyxhLHMsbCxjLGkscix1LGgpLHRoaXMuaW1hZ2U9e2RhdGE6dCx3aWR0aDplLGhlaWdodDpufSx0aGlzLm1hZ0ZpbHRlcj1sLHRoaXMubWluRmlsdGVyPWMsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITEsdGhpcy5mbGlwWT0hMSx0aGlzLnVucGFja0FsaWdubWVudD0xLHRoaXMubmVlZHNVcGRhdGU9ITB9fU0zdC5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZT0hMDtjb25zdCBFM3Q9bmV3IHJRdCxUM3Q9bmV3IHJRdDtjbGFzcyBDM3R7Y29uc3RydWN0b3IodD1bXSxlPVtdKXt0aGlzLnV1aWQ9WFp0KCksdGhpcy5ib25lcz10LnNsaWNlKDApLHRoaXMuYm9uZUludmVyc2VzPWUsdGhpcy5ib25lTWF0cmljZXM9bnVsbCx0aGlzLmJvbmVUZXh0dXJlPW51bGwsdGhpcy5ib25lVGV4dHVyZVNpemU9MCx0aGlzLmZyYW1lPS0xLHRoaXMuaW5pdCgpfWluaXQoKXtjb25zdCB0PXRoaXMuYm9uZXMsZT10aGlzLmJvbmVJbnZlcnNlcztpZih0aGlzLmJvbmVNYXRyaWNlcz1uZXcgRmxvYXQzMkFycmF5KDE2KnQubGVuZ3RoKSwwPT09ZS5sZW5ndGgpdGhpcy5jYWxjdWxhdGVJbnZlcnNlcygpO2Vsc2UgaWYodC5sZW5ndGghPT1lLmxlbmd0aCl7Y29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbjogTnVtYmVyIG9mIGludmVyc2UgYm9uZSBtYXRyaWNlcyBkb2VzIG5vdCBtYXRjaCBhbW91bnQgb2YgYm9uZXMuIiksdGhpcy5ib25lSW52ZXJzZXM9W107Zm9yKGxldCB0PTAsZT10aGlzLmJvbmVzLmxlbmd0aDt0PGU7dCsrKXRoaXMuYm9uZUludmVyc2VzLnB1c2gobmV3IHJRdCl9fWNhbGN1bGF0ZUludmVyc2VzKCl7dGhpcy5ib25lSW52ZXJzZXMubGVuZ3RoPTA7Zm9yKGxldCB0PTAsZT10aGlzLmJvbmVzLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPW5ldyByUXQ7dGhpcy5ib25lc1t0XSYmZS5jb3B5KHRoaXMuYm9uZXNbdF0ubWF0cml4V29ybGQpLmludmVydCgpLHRoaXMuYm9uZUludmVyc2VzLnB1c2goZSl9fXBvc2UoKXtmb3IobGV0IHQ9MCxlPXRoaXMuYm9uZXMubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9dGhpcy5ib25lc1t0XTtlJiZlLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5ib25lSW52ZXJzZXNbdF0pLmludmVydCgpfWZvcihsZXQgdD0wLGU9dGhpcy5ib25lcy5sZW5ndGg7dDxlO3QrKyl7Y29uc3QgZT10aGlzLmJvbmVzW3RdO2UmJihlLnBhcmVudCYmZS5wYXJlbnQuaXNCb25lPyhlLm1hdHJpeC5jb3B5KGUucGFyZW50Lm1hdHJpeFdvcmxkKS5pbnZlcnQoKSxlLm1hdHJpeC5tdWx0aXBseShlLm1hdHJpeFdvcmxkKSk6ZS5tYXRyaXguY29weShlLm1hdHJpeFdvcmxkKSxlLm1hdHJpeC5kZWNvbXBvc2UoZS5wb3NpdGlvbixlLnF1YXRlcm5pb24sZS5zY2FsZSkpfX11cGRhdGUoKXtjb25zdCB0PXRoaXMuYm9uZXMsZT10aGlzLmJvbmVJbnZlcnNlcyxuPXRoaXMuYm9uZU1hdHJpY2VzLGk9dGhpcy5ib25lVGV4dHVyZTtmb3IobGV0IGk9MCxyPXQubGVuZ3RoO2k8cjtpKyspRTN0Lm11bHRpcGx5TWF0cmljZXModFtpXT90W2ldLm1hdHJpeFdvcmxkOlQzdCxlW2ldKSxFM3QudG9BcnJheShuLDE2KmkpO251bGwhPT1pJiYoaS5uZWVkc1VwZGF0ZT0hMCl9Y2xvbmUoKXtyZXR1cm4gbmV3IEMzdCh0aGlzLmJvbmVzLHRoaXMuYm9uZUludmVyc2VzKX1jb21wdXRlQm9uZVRleHR1cmUoKXtsZXQgdD1NYXRoLnNxcnQoNCp0aGlzLmJvbmVzLmxlbmd0aCk7dD1RWnQodCksdD1NYXRoLm1heCh0LDQpO2NvbnN0IGU9bmV3IEZsb2F0MzJBcnJheSh0KnQqNCk7ZS5zZXQodGhpcy5ib25lTWF0cmljZXMpO2NvbnN0IG49bmV3IE0zdChlLHQsdCxoWnQsc1p0KTtyZXR1cm4gdGhpcy5ib25lTWF0cmljZXM9ZSx0aGlzLmJvbmVUZXh0dXJlPW4sdGhpcy5ib25lVGV4dHVyZVNpemU9dCx0aGlzfWdldEJvbmVCeU5hbWUodCl7Zm9yKGxldCBlPTAsbj10aGlzLmJvbmVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBuPXRoaXMuYm9uZXNbZV07aWYobi5uYW1lPT09dClyZXR1cm4gbn19ZGlzcG9zZSgpe251bGwhPT10aGlzLmJvbmVUZXh0dXJlJiYodGhpcy5ib25lVGV4dHVyZS5kaXNwb3NlKCksdGhpcy5ib25lVGV4dHVyZT1udWxsKX1mcm9tSlNPTih0LGUpe3RoaXMudXVpZD10LnV1aWQ7Zm9yKGxldCBuPTAsaT10LmJvbmVzLmxlbmd0aDtuPGk7bisrKXtjb25zdCBpPXQuYm9uZXNbbl07bGV0IHI9ZVtpXTt2b2lkIDA9PT1yJiYoY29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbjogTm8gYm9uZSBmb3VuZCB3aXRoIFVVSUQ6IixpKSxyPW5ldyBTM3QpLHRoaXMuYm9uZXMucHVzaChyKSx0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKChuZXcgclF0KS5mcm9tQXJyYXkodC5ib25lSW52ZXJzZXNbbl0pKX1yZXR1cm4gdGhpcy5pbml0KCksdGhpc310b0pTT04oKXtjb25zdCB0PXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiU2tlbGV0b24iLGdlbmVyYXRvcjoiU2tlbGV0b24udG9KU09OIn0sYm9uZXM6W10sYm9uZUludmVyc2VzOltdfTt0LnV1aWQ9dGhpcy51dWlkO2NvbnN0IGU9dGhpcy5ib25lcyxuPXRoaXMuYm9uZUludmVyc2VzO2ZvcihsZXQgaT0wLHI9ZS5sZW5ndGg7aTxyO2krKyl0LmJvbmVzLnB1c2goZVtpXS51dWlkKSx0LmJvbmVJbnZlcnNlcy5wdXNoKG5baV0udG9BcnJheSgpKTtyZXR1cm4gdH19Y29uc3QgQTN0PW5ldyByUXQsazN0PW5ldyByUXQsTDN0PVtdLFAzdD1uZXcgQjF0O2NsYXNzIE4zdCBleHRlbmRzIEIxdHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodCxlKSx0aGlzLmluc3RhbmNlTWF0cml4PW5ldyBRUXQobmV3IEZsb2F0MzJBcnJheSgxNipuKSwxNiksdGhpcy5pbnN0YW5jZUNvbG9yPW51bGwsdGhpcy5jb3VudD1uLHRoaXMuZnJ1c3R1bUN1bGxlZD0hMX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuaW5zdGFuY2VNYXRyaXguY29weSh0Lmluc3RhbmNlTWF0cml4KSxudWxsIT09dC5pbnN0YW5jZUNvbG9yJiYodGhpcy5pbnN0YW5jZUNvbG9yPXQuaW5zdGFuY2VDb2xvci5jbG9uZSgpKSx0aGlzLmNvdW50PXQuY291bnQsdGhpc31nZXRDb2xvckF0KHQsZSl7ZS5mcm9tQXJyYXkodGhpcy5pbnN0YW5jZUNvbG9yLmFycmF5LDMqdCl9Z2V0TWF0cml4QXQodCxlKXtlLmZyb21BcnJheSh0aGlzLmluc3RhbmNlTWF0cml4LmFycmF5LDE2KnQpfXJheWNhc3QodCxlKXtjb25zdCBuPXRoaXMubWF0cml4V29ybGQsaT10aGlzLmNvdW50O2lmKFAzdC5nZW9tZXRyeT10aGlzLmdlb21ldHJ5LFAzdC5tYXRlcmlhbD10aGlzLm1hdGVyaWFsLHZvaWQgMCE9PVAzdC5tYXRlcmlhbClmb3IobGV0IHI9MDtyPGk7cisrKXt0aGlzLmdldE1hdHJpeEF0KHIsQTN0KSxrM3QubXVsdGlwbHlNYXRyaWNlcyhuLEEzdCksUDN0Lm1hdHJpeFdvcmxkPWszdCxQM3QucmF5Y2FzdCh0LEwzdCk7Zm9yKGxldCB0PTAsbj1MM3QubGVuZ3RoO3Q8bjt0Kyspe2NvbnN0IG49TDN0W3RdO24uaW5zdGFuY2VJZD1yLG4ub2JqZWN0PXRoaXMsZS5wdXNoKG4pfUwzdC5sZW5ndGg9MH19c2V0Q29sb3JBdCh0LGUpe251bGw9PT10aGlzLmluc3RhbmNlQ29sb3ImJih0aGlzLmluc3RhbmNlQ29sb3I9bmV3IFFRdChuZXcgRmxvYXQzMkFycmF5KDMqdGhpcy5pbnN0YW5jZU1hdHJpeC5jb3VudCksMykpLGUudG9BcnJheSh0aGlzLmluc3RhbmNlQ29sb3IuYXJyYXksMyp0KX1zZXRNYXRyaXhBdCh0LGUpe2UudG9BcnJheSh0aGlzLmluc3RhbmNlTWF0cml4LmFycmF5LDE2KnQpfXVwZGF0ZU1vcnBoVGFyZ2V0cygpe31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX1OM3QucHJvdG90eXBlLmlzSW5zdGFuY2VkTWVzaD0hMDtjbGFzcyBJM3QgZXh0ZW5kcyBVUXR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9IkxpbmVCYXNpY01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyAkUXQoMTY3NzcyMTUpLHRoaXMubGluZXdpZHRoPTEsdGhpcy5saW5lY2FwPSJyb3VuZCIsdGhpcy5saW5lam9pbj0icm91bmQiLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubGluZXdpZHRoPXQubGluZXdpZHRoLHRoaXMubGluZWNhcD10LmxpbmVjYXAsdGhpcy5saW5lam9pbj10LmxpbmVqb2luLHRoaXN9fUkzdC5wcm90b3R5cGUuaXNMaW5lQmFzaWNNYXRlcmlhbD0hMDtjb25zdCBSM3Q9bmV3IENKdCxPM3Q9bmV3IENKdCx6M3Q9bmV3IHJRdCxEM3Q9bmV3IGlRdCxCM3Q9bmV3ICRKdDtjbGFzcyBIM3QgZXh0ZW5kcyBrUXR7Y29uc3RydWN0b3IodD1uZXcgYjF0LGU9bmV3IEkzdCl7c3VwZXIoKSx0aGlzLnR5cGU9IkxpbmUiLHRoaXMuZ2VvbWV0cnk9dCx0aGlzLm1hdGVyaWFsPWUsdGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMubWF0ZXJpYWw9dC5tYXRlcmlhbCx0aGlzLmdlb21ldHJ5PXQuZ2VvbWV0cnksdGhpc31jb21wdXRlTGluZURpc3RhbmNlcygpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeTtpZih0LmlzQnVmZmVyR2VvbWV0cnkpaWYobnVsbD09PXQuaW5kZXgpe2NvbnN0IGU9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLG49WzBdO2ZvcihsZXQgdD0xLGk9ZS5jb3VudDt0PGk7dCsrKVIzdC5mcm9tQnVmZmVyQXR0cmlidXRlKGUsdC0xKSxPM3QuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHQpLG5bdF09blt0LTFdLG5bdF0rPVIzdC5kaXN0YW5jZVRvKE8zdCk7dC5zZXRBdHRyaWJ1dGUoImxpbmVEaXN0YW5jZSIsbmV3IGwxdChuLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuIik7ZWxzZSB0LmlzR2VvbWV0cnkmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzfXJheWNhc3QodCxlKXtjb25zdCBuPXRoaXMuZ2VvbWV0cnksaT10aGlzLm1hdHJpeFdvcmxkLHI9dC5wYXJhbXMuTGluZS50aHJlc2hvbGQsbz1uLmRyYXdSYW5nZTtpZihudWxsPT09bi5ib3VuZGluZ1NwaGVyZSYmbi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxCM3QuY29weShuLmJvdW5kaW5nU3BoZXJlKSxCM3QuYXBwbHlNYXRyaXg0KGkpLEIzdC5yYWRpdXMrPXIsITE9PT10LnJheS5pbnRlcnNlY3RzU3BoZXJlKEIzdCkpcmV0dXJuO3ozdC5jb3B5KGkpLmludmVydCgpLEQzdC5jb3B5KHQucmF5KS5hcHBseU1hdHJpeDQoejN0KTtjb25zdCBhPXIvKCh0aGlzLnNjYWxlLngrdGhpcy5zY2FsZS55K3RoaXMuc2NhbGUueikvMykscz1hKmEsbD1uZXcgQ0p0LGM9bmV3IENKdCx1PW5ldyBDSnQsaD1uZXcgQ0p0LGQ9dGhpcy5pc0xpbmVTZWdtZW50cz8yOjE7aWYobi5pc0J1ZmZlckdlb21ldHJ5KXtjb25zdCBpPW4uaW5kZXgscj1uLmF0dHJpYnV0ZXMucG9zaXRpb247aWYobnVsbCE9PWkpZm9yKGxldCBuPU1hdGgubWF4KDAsby5zdGFydCksYT1NYXRoLm1pbihpLmNvdW50LG8uc3RhcnQrby5jb3VudCktMTtuPGE7bis9ZCl7Y29uc3Qgbz1pLmdldFgobiksYT1pLmdldFgobisxKTtpZihsLmZyb21CdWZmZXJBdHRyaWJ1dGUocixvKSxjLmZyb21CdWZmZXJBdHRyaWJ1dGUocixhKSxEM3QuZGlzdGFuY2VTcVRvU2VnbWVudChsLGMsaCx1KT5zKWNvbnRpbnVlO2guYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpO2NvbnN0IGQ9dC5yYXkub3JpZ2luLmRpc3RhbmNlVG8oaCk7ZDx0Lm5lYXJ8fGQ+dC5mYXJ8fGUucHVzaCh7ZGlzdGFuY2U6ZCxwb2ludDp1LmNsb25lKCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLGluZGV4Om4sZmFjZTpudWxsLGZhY2VJbmRleDpudWxsLG9iamVjdDp0aGlzfSl9ZWxzZSBmb3IobGV0IG49TWF0aC5tYXgoMCxvLnN0YXJ0KSxpPU1hdGgubWluKHIuY291bnQsby5zdGFydCtvLmNvdW50KS0xO248aTtuKz1kKXtpZihsLmZyb21CdWZmZXJBdHRyaWJ1dGUocixuKSxjLmZyb21CdWZmZXJBdHRyaWJ1dGUocixuKzEpLEQzdC5kaXN0YW5jZVNxVG9TZWdtZW50KGwsYyxoLHUpPnMpY29udGludWU7aC5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCk7Y29uc3QgaT10LnJheS5vcmlnaW4uZGlzdGFuY2VUbyhoKTtpPHQubmVhcnx8aT50LmZhcnx8ZS5wdXNoKHtkaXN0YW5jZTppLHBvaW50OnUuY2xvbmUoKS5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCksaW5kZXg6bixmYWNlOm51bGwsZmFjZUluZGV4Om51bGwsb2JqZWN0OnRoaXN9KX19ZWxzZSBuLmlzR2VvbWV0cnkmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLkxpbmUucmF5Y2FzdCgpIG5vIGxvbmdlciBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIil9dXBkYXRlTW9ycGhUYXJnZXRzKCl7Y29uc3QgdD10aGlzLmdlb21ldHJ5O2lmKHQuaXNCdWZmZXJHZW9tZXRyeSl7Y29uc3QgZT10Lm1vcnBoQXR0cmlidXRlcyxuPU9iamVjdC5rZXlzKGUpO2lmKG4ubGVuZ3RoPjApe2NvbnN0IHQ9ZVtuWzBdXTtpZih2b2lkIDAhPT10KXt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1bXSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT17fTtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspe2NvbnN0IG49dFtlXS5uYW1lfHxTdHJpbmcoZSk7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCgwKSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVtuXT1lfX19fWVsc2V7Y29uc3QgZT10Lm1vcnBoVGFyZ2V0czt2b2lkIDAhPT1lJiZlLmxlbmd0aD4wJiZjb25zb2xlLmVycm9yKCJUSFJFRS5MaW5lLnVwZGF0ZU1vcnBoVGFyZ2V0cygpIGRvZXMgbm90IHN1cHBvcnQgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpfX19SDN0LnByb3RvdHlwZS5pc0xpbmU9ITA7Y29uc3QgRjN0PW5ldyBDSnQsVjN0PW5ldyBDSnQ7Y2xhc3MgVTN0IGV4dGVuZHMgSDN0e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLnR5cGU9IkxpbmVTZWdtZW50cyJ9Y29tcHV0ZUxpbmVEaXN0YW5jZXMoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnk7aWYodC5pc0J1ZmZlckdlb21ldHJ5KWlmKG51bGw9PT10LmluZGV4KXtjb25zdCBlPXQuYXR0cmlidXRlcy5wb3NpdGlvbixuPVtdO2ZvcihsZXQgdD0wLGk9ZS5jb3VudDt0PGk7dCs9MilGM3QuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHQpLFYzdC5mcm9tQnVmZmVyQXR0cmlidXRlKGUsdCsxKSxuW3RdPTA9PT10PzA6blt0LTFdLG5bdCsxXT1uW3RdK0YzdC5kaXN0YW5jZVRvKFYzdCk7dC5zZXRBdHRyaWJ1dGUoImxpbmVEaXN0YW5jZSIsbmV3IGwxdChuLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZVNlZ21lbnRzLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4iKTtlbHNlIHQuaXNHZW9tZXRyeSYmY29uc29sZS5lcnJvcigiVEhSRUUuTGluZVNlZ21lbnRzLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCkgbm8gbG9uZ2VyIHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpc319VTN0LnByb3RvdHlwZS5pc0xpbmVTZWdtZW50cz0hMDtjbGFzcyBqM3QgZXh0ZW5kcyBIM3R7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpLHRoaXMudHlwZT0iTGluZUxvb3AifX1qM3QucHJvdG90eXBlLmlzTGluZUxvb3A9ITA7Y2xhc3MgRzN0IGV4dGVuZHMgVVF0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy50eXBlPSJQb2ludHNNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgJFF0KDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLnNpemU9MSx0aGlzLnNpemVBdHRlbnVhdGlvbj0hMCx0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSx0aGlzLm1hcD10Lm1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5zaXplPXQuc2l6ZSx0aGlzLnNpemVBdHRlbnVhdGlvbj10LnNpemVBdHRlbnVhdGlvbix0aGlzfX1HM3QucHJvdG90eXBlLmlzUG9pbnRzTWF0ZXJpYWw9ITA7Y29uc3QgVzN0PW5ldyByUXQscTN0PW5ldyBpUXQsWTN0PW5ldyAkSnQsWDN0PW5ldyBDSnQ7Y2xhc3MgJDN0IGV4dGVuZHMga1F0e2NvbnN0cnVjdG9yKHQ9bmV3IGIxdCxlPW5ldyBHM3Qpe3N1cGVyKCksdGhpcy50eXBlPSJQb2ludHMiLHRoaXMuZ2VvbWV0cnk9dCx0aGlzLm1hdGVyaWFsPWUsdGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMubWF0ZXJpYWw9dC5tYXRlcmlhbCx0aGlzLmdlb21ldHJ5PXQuZ2VvbWV0cnksdGhpc31yYXljYXN0KHQsZSl7Y29uc3Qgbj10aGlzLmdlb21ldHJ5LGk9dGhpcy5tYXRyaXhXb3JsZCxyPXQucGFyYW1zLlBvaW50cy50aHJlc2hvbGQsbz1uLmRyYXdSYW5nZTtpZihudWxsPT09bi5ib3VuZGluZ1NwaGVyZSYmbi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxZM3QuY29weShuLmJvdW5kaW5nU3BoZXJlKSxZM3QuYXBwbHlNYXRyaXg0KGkpLFkzdC5yYWRpdXMrPXIsITE9PT10LnJheS5pbnRlcnNlY3RzU3BoZXJlKFkzdCkpcmV0dXJuO1czdC5jb3B5KGkpLmludmVydCgpLHEzdC5jb3B5KHQucmF5KS5hcHBseU1hdHJpeDQoVzN0KTtjb25zdCBhPXIvKCh0aGlzLnNjYWxlLngrdGhpcy5zY2FsZS55K3RoaXMuc2NhbGUueikvMykscz1hKmE7aWYobi5pc0J1ZmZlckdlb21ldHJ5KXtjb25zdCByPW4uaW5kZXgsYT1uLmF0dHJpYnV0ZXMucG9zaXRpb247aWYobnVsbCE9PXIpZm9yKGxldCBuPU1hdGgubWF4KDAsby5zdGFydCksbD1NYXRoLm1pbihyLmNvdW50LG8uc3RhcnQrby5jb3VudCk7bjxsO24rKyl7Y29uc3Qgbz1yLmdldFgobik7WDN0LmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxvKSxLM3QoWDN0LG8scyxpLHQsZSx0aGlzKX1lbHNlIGZvcihsZXQgbj1NYXRoLm1heCgwLG8uc3RhcnQpLHI9TWF0aC5taW4oYS5jb3VudCxvLnN0YXJ0K28uY291bnQpO248cjtuKyspWDN0LmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxuKSxLM3QoWDN0LG4scyxpLHQsZSx0aGlzKX1lbHNlIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlBvaW50cy5yYXljYXN0KCkgbm8gbG9uZ2VyIHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKX11cGRhdGVNb3JwaFRhcmdldHMoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnk7aWYodC5pc0J1ZmZlckdlb21ldHJ5KXtjb25zdCBlPXQubW9ycGhBdHRyaWJ1dGVzLG49T2JqZWN0LmtleXMoZSk7aWYobi5sZW5ndGg+MCl7Y29uc3QgdD1lW25bMF1dO2lmKHZvaWQgMCE9PXQpe3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPVtdLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXt9O2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgbj10W2VdLm5hbWV8fFN0cmluZyhlKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W25dPWV9fX19ZWxzZXtjb25zdCBlPXQubW9ycGhUYXJnZXRzO3ZvaWQgMCE9PWUmJmUubGVuZ3RoPjAmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLlBvaW50cy51cGRhdGVNb3JwaFRhcmdldHMoKSBkb2VzIG5vdCBzdXBwb3J0IFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKX19fWZ1bmN0aW9uIEszdCh0LGUsbixpLHIsbyxhKXtjb25zdCBzPXEzdC5kaXN0YW5jZVNxVG9Qb2ludCh0KTtpZihzPG4pe2NvbnN0IG49bmV3IENKdDtxM3QuY2xvc2VzdFBvaW50VG9Qb2ludCh0LG4pLG4uYXBwbHlNYXRyaXg0KGkpO2NvbnN0IGw9ci5yYXkub3JpZ2luLmRpc3RhbmNlVG8obik7aWYobDxyLm5lYXJ8fGw+ci5mYXIpcmV0dXJuO28ucHVzaCh7ZGlzdGFuY2U6bCxkaXN0YW5jZVRvUmF5Ok1hdGguc3FydChzKSxwb2ludDpuLGluZGV4OmUsZmFjZTpudWxsLG9iamVjdDphfSl9fSQzdC5wcm90b3R5cGUuaXNQb2ludHM9ITA7Y2xhc3MgWjN0IGV4dGVuZHMgYkp0e2NvbnN0cnVjdG9yKHQsZSxuLGkscixvLGEscyxsKXtzdXBlcih0LGUsbixpLHIsbyxhLHMsbCksdGhpcy5mb3JtYXQ9dm9pZCAwIT09YT9hOnVadCx0aGlzLm1pbkZpbHRlcj12b2lkIDAhPT1vP286ZVp0LHRoaXMubWFnRmlsdGVyPXZvaWQgMCE9PXI/cjplWnQsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITE7Y29uc3QgYz10aGlzOyJyZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrImluIHQmJnQucmVxdWVzdFZpZGVvRnJhbWVDYWxsYmFjaygoZnVuY3Rpb24gZSgpe2MubmVlZHNVcGRhdGU9ITAsdC5yZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrKGUpfSkpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuaW1hZ2UpLmNvcHkodGhpcyl9dXBkYXRlKCl7Y29uc3QgdD10aGlzLmltYWdlOzA9PSJyZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrImluIHQmJnQucmVhZHlTdGF0ZT49dC5IQVZFX0NVUlJFTlRfREFUQSYmKHRoaXMubmVlZHNVcGRhdGU9ITApfX1aM3QucHJvdG90eXBlLmlzVmlkZW9UZXh0dXJlPSEwO2NsYXNzIEozdCBleHRlbmRzIGJKdHtjb25zdHJ1Y3Rvcih0LGUsbixpLHIsbyxhLHMsbCxjLHUsaCl7c3VwZXIobnVsbCxvLGEscyxsLGMsaSxyLHUsaCksdGhpcy5pbWFnZT17d2lkdGg6ZSxoZWlnaHQ6bn0sdGhpcy5taXBtYXBzPXQsdGhpcy5mbGlwWT0hMSx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX19SjN0LnByb3RvdHlwZS5pc0NvbXByZXNzZWRUZXh0dXJlPSEwO2NsYXNzIFEzdCBleHRlbmRzIGJKdHtjb25zdHJ1Y3Rvcih0LGUsbixpLHIsbyxhLHMsbCl7c3VwZXIodCxlLG4saSxyLG8sYSxzLGwpLHRoaXMubmVlZHNVcGRhdGU9ITB9fVEzdC5wcm90b3R5cGUuaXNDYW52YXNUZXh0dXJlPSEwO2NsYXNzIHQ0dCBleHRlbmRzIGJKdHtjb25zdHJ1Y3Rvcih0LGUsbixpLHIsbyxhLHMsbCxjKXtpZigoYz12b2lkIDAhPT1jP2M6ZFp0KSE9PWRadCYmYyE9PXBadCl0aHJvdyBuZXcgRXJyb3IoIkRlcHRoVGV4dHVyZSBmb3JtYXQgbXVzdCBiZSBlaXRoZXIgVEhSRUUuRGVwdGhGb3JtYXQgb3IgVEhSRUUuRGVwdGhTdGVuY2lsRm9ybWF0Iik7dm9pZCAwPT09biYmYz09PWRadCYmKG49b1p0KSx2b2lkIDA9PT1uJiZjPT09cFp0JiYobj1jWnQpLHN1cGVyKG51bGwsaSxyLG8sYSxzLGMsbixsKSx0aGlzLmltYWdlPXt3aWR0aDp0LGhlaWdodDplfSx0aGlzLm1hZ0ZpbHRlcj12b2lkIDAhPT1hP2E6Skt0LHRoaXMubWluRmlsdGVyPXZvaWQgMCE9PXM/czpKS3QsdGhpcy5mbGlwWT0hMSx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX19dDR0LnByb3RvdHlwZS5pc0RlcHRoVGV4dHVyZT0hMDtjbGFzcyBlNHQgZXh0ZW5kcyBiMXR7Y29uc3RydWN0b3IodD0xLGU9OCxuPTAsaT0yKk1hdGguUEkpe3N1cGVyKCksdGhpcy50eXBlPSJDaXJjbGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6dCxzZWdtZW50czplLHRoZXRhU3RhcnQ6bix0aGV0YUxlbmd0aDppfSxlPU1hdGgubWF4KDMsZSk7Y29uc3Qgcj1bXSxvPVtdLGE9W10scz1bXSxsPW5ldyBDSnQsYz1uZXcgbUp0O28ucHVzaCgwLDAsMCksYS5wdXNoKDAsMCwxKSxzLnB1c2goLjUsLjUpO2ZvcihsZXQgcj0wLHU9MztyPD1lO3IrKyx1Kz0zKXtjb25zdCBoPW4rci9lKmk7bC54PXQqTWF0aC5jb3MoaCksbC55PXQqTWF0aC5zaW4oaCksby5wdXNoKGwueCxsLnksbC56KSxhLnB1c2goMCwwLDEpLGMueD0ob1t1XS90KzEpLzIsYy55PShvW3UrMV0vdCsxKS8yLHMucHVzaChjLngsYy55KX1mb3IobGV0IHQ9MTt0PD1lO3QrKylyLnB1c2godCx0KzEsMCk7dGhpcy5zZXRJbmRleChyKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBsMXQobywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGwxdChhLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBsMXQocywyKSl9c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgZTR0KHQucmFkaXVzLHQuc2VnbWVudHMsdC50aGV0YVN0YXJ0LHQudGhldGFMZW5ndGgpfX1jbGFzcyBuNHQgZXh0ZW5kcyBiMXR7Y29uc3RydWN0b3IodD0xLGU9MSxuPTEsaT04LHI9MSxvPSExLGE9MCxzPTIqTWF0aC5QSSl7c3VwZXIoKSx0aGlzLnR5cGU9IkN5bGluZGVyR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzVG9wOnQscmFkaXVzQm90dG9tOmUsaGVpZ2h0Om4scmFkaWFsU2VnbWVudHM6aSxoZWlnaHRTZWdtZW50czpyLG9wZW5FbmRlZDpvLHRoZXRhU3RhcnQ6YSx0aGV0YUxlbmd0aDpzfTtjb25zdCBsPXRoaXM7aT1NYXRoLmZsb29yKGkpLHI9TWF0aC5mbG9vcihyKTtjb25zdCBjPVtdLHU9W10saD1bXSxkPVtdO2xldCBwPTA7Y29uc3QgZj1bXSxtPW4vMjtsZXQgZz0wO2Z1bmN0aW9uIF8obil7Y29uc3Qgcj1wLG89bmV3IG1KdCxmPW5ldyBDSnQ7bGV0IF89MDtjb25zdCB5PSEwPT09bj90OmUsdj0hMD09PW4/MTotMTtmb3IobGV0IHQ9MTt0PD1pO3QrKyl1LnB1c2goMCxtKnYsMCksaC5wdXNoKDAsdiwwKSxkLnB1c2goLjUsLjUpLHArKztjb25zdCBiPXA7Zm9yKGxldCB0PTA7dDw9aTt0Kyspe2NvbnN0IGU9dC9pKnMrYSxuPU1hdGguY29zKGUpLHI9TWF0aC5zaW4oZSk7Zi54PXkqcixmLnk9bSp2LGYuej15Km4sdS5wdXNoKGYueCxmLnksZi56KSxoLnB1c2goMCx2LDApLG8ueD0uNSpuKy41LG8ueT0uNSpyKnYrLjUsZC5wdXNoKG8ueCxvLnkpLHArK31mb3IobGV0IHQ9MDt0PGk7dCsrKXtjb25zdCBlPXIrdCxpPWIrdDshMD09PW4/Yy5wdXNoKGksaSsxLGUpOmMucHVzaChpKzEsaSxlKSxfKz0zfWwuYWRkR3JvdXAoZyxfLCEwPT09bj8xOjIpLGcrPV99IShmdW5jdGlvbiB5KCl7Y29uc3Qgbz1uZXcgQ0p0LF89bmV3IENKdDtsZXQgeT0wO2NvbnN0IHY9KGUtdCkvbjtmb3IobGV0IGw9MDtsPD1yO2wrKyl7Y29uc3QgYz1bXSxnPWwvcix5PWcqKGUtdCkrdDtmb3IobGV0IHQ9MDt0PD1pO3QrKyl7Y29uc3QgZT10L2kscj1lKnMrYSxsPU1hdGguc2luKHIpLGY9TWF0aC5jb3Mocik7Xy54PXkqbCxfLnk9LWcqbittLF8uej15KmYsdS5wdXNoKF8ueCxfLnksXy56KSxvLnNldChsLHYsZikubm9ybWFsaXplKCksaC5wdXNoKG8ueCxvLnksby56KSxkLnB1c2goZSwxLWcpLGMucHVzaChwKyspfWYucHVzaChjKX1mb3IobGV0IHQ9MDt0PGk7dCsrKWZvcihsZXQgZT0wO2U8cjtlKyspe2NvbnN0IG49ZltlKzFdW3RdLGk9ZltlKzFdW3QrMV0scj1mW2VdW3QrMV07Yy5wdXNoKGZbZV1bdF0sbixyKSxjLnB1c2gobixpLHIpLHkrPTZ9bC5hZGRHcm91cChnLHksMCksZys9eX0pKCksITE9PT1vJiYodD4wJiZfKCEwKSxlPjAmJl8oITEpKSx0aGlzLnNldEluZGV4KGMpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGwxdCh1LDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgbDF0KGgsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IGwxdChkLDIpKX1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBuNHQodC5yYWRpdXNUb3AsdC5yYWRpdXNCb3R0b20sdC5oZWlnaHQsdC5yYWRpYWxTZWdtZW50cyx0LmhlaWdodFNlZ21lbnRzLHQub3BlbkVuZGVkLHQudGhldGFTdGFydCx0LnRoZXRhTGVuZ3RoKX19Y2xhc3MgaTR0IGV4dGVuZHMgbjR0e2NvbnN0cnVjdG9yKHQ9MSxlPTEsbj04LGk9MSxyPSExLG89MCxhPTIqTWF0aC5QSSl7c3VwZXIoMCx0LGUsbixpLHIsbyxhKSx0aGlzLnR5cGU9IkNvbmVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6dCxoZWlnaHQ6ZSxyYWRpYWxTZWdtZW50czpuLGhlaWdodFNlZ21lbnRzOmksb3BlbkVuZGVkOnIsdGhldGFTdGFydDpvLHRoZXRhTGVuZ3RoOmF9fXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IGk0dCh0LnJhZGl1cyx0LmhlaWdodCx0LnJhZGlhbFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMsdC5vcGVuRW5kZWQsdC50aGV0YVN0YXJ0LHQudGhldGFMZW5ndGgpfX1jbGFzcyByNHQgZXh0ZW5kcyBiMXR7Y29uc3RydWN0b3IodCxlLG49MSxpPTApe3N1cGVyKCksdGhpcy50eXBlPSJQb2x5aGVkcm9uR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17dmVydGljZXM6dCxpbmRpY2VzOmUscmFkaXVzOm4sZGV0YWlsOml9O2NvbnN0IHI9W10sbz1bXTtmdW5jdGlvbiBhKHQsZSxuLGkpe2NvbnN0IHI9aSsxLG89W107Zm9yKGxldCBpPTA7aTw9cjtpKyspe29baV09W107Y29uc3QgYT10LmNsb25lKCkubGVycChuLGkvcikscz1lLmNsb25lKCkubGVycChuLGkvciksbD1yLWk7Zm9yKGxldCB0PTA7dDw9bDt0Kyspb1tpXVt0XT0wPT09dCYmaT09PXI/YTphLmNsb25lKCkubGVycChzLHQvbCl9Zm9yKGxldCB0PTA7dDxyO3QrKylmb3IobGV0IGU9MDtlPDIqKHItdCktMTtlKyspe2NvbnN0IG49TWF0aC5mbG9vcihlLzIpO2UlMj09MD8ocyhvW3RdW24rMV0pLHMob1t0KzFdW25dKSxzKG9bdF1bbl0pKToocyhvW3RdW24rMV0pLHMob1t0KzFdW24rMV0pLHMob1t0KzFdW25dKSl9fWZ1bmN0aW9uIHModCl7ci5wdXNoKHQueCx0LnksdC56KX1mdW5jdGlvbiBsKGUsbil7Y29uc3QgaT0zKmU7bi54PXRbaSswXSxuLnk9dFtpKzFdLG4uej10W2krMl19ZnVuY3Rpb24gYyh0LGUsbixpKXtpPDAmJjE9PT10LngmJihvW2VdPXQueC0xKSwwPT09bi54JiYwPT09bi56JiYob1tlXT1pLzIvTWF0aC5QSSsuNSl9ZnVuY3Rpb24gdSh0KXtyZXR1cm4gTWF0aC5hdGFuMih0LnosLXQueCl9IShmdW5jdGlvbiBoKHQpe2NvbnN0IG49bmV3IENKdCxpPW5ldyBDSnQscj1uZXcgQ0p0O2ZvcihsZXQgbz0wO288ZS5sZW5ndGg7bys9MylsKGVbbyswXSxuKSxsKGVbbysxXSxpKSxsKGVbbysyXSxyKSxhKG4saSxyLHQpfSkoaSksKGZ1bmN0aW9uIGQodCl7Y29uc3QgZT1uZXcgQ0p0O2ZvcihsZXQgbj0wO248ci5sZW5ndGg7bis9MyllLng9cltuKzBdLGUueT1yW24rMV0sZS56PXJbbisyXSxlLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpLHJbbiswXT1lLngscltuKzFdPWUueSxyW24rMl09ZS56fSkobiksKGZ1bmN0aW9uIHAoKXtjb25zdCB0PW5ldyBDSnQ7Zm9yKGxldCBuPTA7bjxyLmxlbmd0aDtuKz0zKXt0Lng9cltuKzBdLHQueT1yW24rMV0sdC56PXJbbisyXTtjb25zdCBpPXUodCkvMi9NYXRoLlBJKy41LGE9KGU9dCxNYXRoLmF0YW4yKC1lLnksTWF0aC5zcXJ0KGUueCplLngrZS56KmUueikpL01hdGguUEkrLjUpO28ucHVzaChpLDEtYSl9dmFyIGU7KGZ1bmN0aW9uIG4oKXtjb25zdCB0PW5ldyBDSnQsZT1uZXcgQ0p0LG49bmV3IENKdCxpPW5ldyBDSnQsYT1uZXcgbUp0LHM9bmV3IG1KdCxsPW5ldyBtSnQ7Zm9yKGxldCBoPTAsZD0wO2g8ci5sZW5ndGg7aCs9OSxkKz02KXt0LnNldChyW2grMF0scltoKzFdLHJbaCsyXSksZS5zZXQocltoKzNdLHJbaCs0XSxyW2grNV0pLG4uc2V0KHJbaCs2XSxyW2grN10scltoKzhdKSxhLnNldChvW2QrMF0sb1tkKzFdKSxzLnNldChvW2QrMl0sb1tkKzNdKSxsLnNldChvW2QrNF0sb1tkKzVdKSxpLmNvcHkodCkuYWRkKGUpLmFkZChuKS5kaXZpZGVTY2FsYXIoMyk7Y29uc3QgcD11KGkpO2MoYSxkKzAsdCxwKSxjKHMsZCsyLGUscCksYyhsLGQrNCxuLHApfX0pKCksKGZ1bmN0aW9uIGkoKXtmb3IobGV0IHQ9MDt0PG8ubGVuZ3RoO3QrPTYpe2NvbnN0IGU9b1t0KzBdLG49b1t0KzJdLGk9b1t0KzRdLHI9TWF0aC5tYXgoZSxuLGkpLGE9TWF0aC5taW4oZSxuLGkpO3I+LjkmJmE8LjEmJihlPC4yJiYob1t0KzBdKz0xKSxuPC4yJiYob1t0KzJdKz0xKSxpPC4yJiYob1t0KzRdKz0xKSl9fSkoKX0pKCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KHIsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBsMXQoci5zbGljZSgpLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBsMXQobywyKSksMD09PWk/dGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpOnRoaXMubm9ybWFsaXplTm9ybWFscygpfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IHI0dCh0LnZlcnRpY2VzLHQuaW5kaWNlcyx0LnJhZGl1cyx0LmRldGFpbHMpfX1jbGFzcyBvNHQgZXh0ZW5kcyByNHR7Y29uc3RydWN0b3IodD0xLGU9MCl7Y29uc3Qgbj0oMStNYXRoLnNxcnQoNSkpLzIsaT0xL247c3VwZXIoWy0xLC0xLC0xLC0xLC0xLDEsLTEsMSwtMSwtMSwxLDEsMSwtMSwtMSwxLC0xLDEsMSwxLC0xLDEsMSwxLDAsLWksLW4sMCwtaSxuLDAsaSwtbiwwLGksbiwtaSwtbiwwLC1pLG4sMCxpLC1uLDAsaSxuLDAsLW4sMCwtaSxuLDAsLWksLW4sMCxpLG4sMCxpXSxbMywxMSw3LDMsNywxNSwzLDE1LDEzLDcsMTksMTcsNywxNyw2LDcsNiwxNSwxNyw0LDgsMTcsOCwxMCwxNywxMCw2LDgsMCwxNiw4LDE2LDIsOCwyLDEwLDAsMTIsMSwwLDEsMTgsMCwxOCwxNiw2LDEwLDIsNiwyLDEzLDYsMTMsMTUsMiwxNiwxOCwyLDE4LDMsMiwzLDEzLDE4LDEsOSwxOCw5LDExLDE4LDExLDMsNCwxNCwxMiw0LDEyLDAsNCwwLDgsMTEsOSw1LDExLDUsMTksMTEsMTksNywxOSw1LDE0LDE5LDE0LDQsMTksNCwxNywxLDEyLDE0LDEsMTQsNSwxLDUsOV0sdCxlKSx0aGlzLnR5cGU9IkRvZGVjYWhlZHJvbkdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czp0LGRldGFpbDplfX1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBvNHQodC5yYWRpdXMsdC5kZXRhaWwpfX1jb25zdCBhNHQ9bmV3IENKdCxzNHQ9bmV3IENKdCxsNHQ9bmV3IENKdCxjNHQ9bmV3IEZRdDtjbGFzcyB1NHQgZXh0ZW5kcyBiMXR7Y29uc3RydWN0b3IodCxlKXtpZihzdXBlcigpLHRoaXMudHlwZT0iRWRnZXNHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXt0aHJlc2hvbGRBbmdsZTplfSxlPXZvaWQgMCE9PWU/ZToxLCEwPT09dC5pc0dlb21ldHJ5KXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkVkZ2VzR2VvbWV0cnkgbm8gbG9uZ2VyIHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKTtjb25zdCBuPU1hdGguY29zKHFadCplKSxpPXQuZ2V0SW5kZXgoKSxyPXQuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLG89aT9pLmNvdW50OnIuY291bnQsYT1bMCwwLDBdLHM9WyJhIiwiYiIsImMiXSxsPW5ldyBBcnJheSgzKSxjPXt9LHU9W107Zm9yKGxldCB0PTA7dDxvO3QrPTMpe2k/KGFbMF09aS5nZXRYKHQpLGFbMV09aS5nZXRYKHQrMSksYVsyXT1pLmdldFgodCsyKSk6KGFbMF09dCxhWzFdPXQrMSxhWzJdPXQrMik7Y29uc3R7YTplLGI6byxjOmh9PWM0dDtpZihlLmZyb21CdWZmZXJBdHRyaWJ1dGUocixhWzBdKSxvLmZyb21CdWZmZXJBdHRyaWJ1dGUocixhWzFdKSxoLmZyb21CdWZmZXJBdHRyaWJ1dGUocixhWzJdKSxjNHQuZ2V0Tm9ybWFsKGw0dCksbFswXT1gJHtlLnh9LCR7ZS55fSwke2Uuen1gLGxbMV09YCR7by54fSwke28ueX0sJHtvLnp9YCxsWzJdPWAke2gueH0sJHtoLnl9LCR7aC56fWAsbFswXSE9PWxbMV0mJmxbMV0hPT1sWzJdJiZsWzJdIT09bFswXSlmb3IobGV0IHQ9MDt0PDM7dCsrKXtjb25zdCBlPSh0KzEpJTMsaT1sW3RdLHI9bFtlXSxvPWM0dFtzW3RdXSxoPWM0dFtzW2VdXSxkPWAke2l9XyR7cn1gLHA9YCR7cn1fJHtpfWA7cCBpbiBjJiZjW3BdPyhsNHQuZG90KGNbcF0ubm9ybWFsKTw9biYmKHUucHVzaChvLngsby55LG8ueiksdS5wdXNoKGgueCxoLnksaC56KSksY1twXT1udWxsKTpkIGluIGN8fChjW2RdPXtpbmRleDA6YVt0XSxpbmRleDE6YVtlXSxub3JtYWw6bDR0LmNsb25lKCl9KX19Zm9yKGNvbnN0IHQgaW4gYylpZihjW3RdKXtjb25zdHtpbmRleDA6ZSxpbmRleDE6bn09Y1t0XTthNHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLGUpLHM0dC5mcm9tQnVmZmVyQXR0cmlidXRlKHIsbiksdS5wdXNoKGE0dC54LGE0dC55LGE0dC56KSx1LnB1c2goczR0LngsczR0LnksczR0LnopfXRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGwxdCh1LDMpKX19Y2xhc3MgaDR0e2NvbnN0cnVjdG9yKCl7dGhpcy50eXBlPSJDdXJ2ZSIsdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9MjAwfWdldFBvaW50KCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRlZC4iKSxudWxsfWdldFBvaW50QXQodCxlKXtjb25zdCBuPXRoaXMuZ2V0VXRvVG1hcHBpbmcodCk7cmV0dXJuIHRoaXMuZ2V0UG9pbnQobixlKX1nZXRQb2ludHModD01KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248PXQ7bisrKWUucHVzaCh0aGlzLmdldFBvaW50KG4vdCkpO3JldHVybiBlfWdldFNwYWNlZFBvaW50cyh0PTUpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjw9dDtuKyspZS5wdXNoKHRoaXMuZ2V0UG9pbnRBdChuL3QpKTtyZXR1cm4gZX1nZXRMZW5ndGgoKXtjb25zdCB0PXRoaXMuZ2V0TGVuZ3RocygpO3JldHVybiB0W3QubGVuZ3RoLTFdfWdldExlbmd0aHModD10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyl7aWYodGhpcy5jYWNoZUFyY0xlbmd0aHMmJnRoaXMuY2FjaGVBcmNMZW5ndGhzLmxlbmd0aD09PXQrMSYmIXRoaXMubmVlZHNVcGRhdGUpcmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzO3RoaXMubmVlZHNVcGRhdGU9ITE7Y29uc3QgZT1bXTtsZXQgbixpPXRoaXMuZ2V0UG9pbnQoMCkscj0wO2UucHVzaCgwKTtmb3IobGV0IG89MTtvPD10O28rKyluPXRoaXMuZ2V0UG9pbnQoby90KSxyKz1uLmRpc3RhbmNlVG8oaSksZS5wdXNoKHIpLGk9bjtyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM9ZSxlfXVwZGF0ZUFyY0xlbmd0aHMoKXt0aGlzLm5lZWRzVXBkYXRlPSEwLHRoaXMuZ2V0TGVuZ3RocygpfWdldFV0b1RtYXBwaW5nKHQsZSl7Y29uc3Qgbj10aGlzLmdldExlbmd0aHMoKTtsZXQgaT0wO2NvbnN0IHI9bi5sZW5ndGg7bGV0IG87bz1lfHx0Km5bci0xXTtsZXQgYSxzPTAsbD1yLTE7Zm9yKDtzPD1sOylpZihpPU1hdGguZmxvb3IocysobC1zKS8yKSxhPW5baV0tbyxhPDApcz1pKzE7ZWxzZXtpZighKGE+MCkpe2w9aTticmVha31sPWktMX1pZihpPWwsbltpXT09PW8pcmV0dXJuIGkvKHItMSk7Y29uc3QgYz1uW2ldO3JldHVybihpKyhvLWMpLyhuW2krMV0tYykpLyhyLTEpfWdldFRhbmdlbnQodCxlKXtjb25zdCBuPTFlLTQ7bGV0IGk9dC1uLHI9dCtuO2k8MCYmKGk9MCkscj4xJiYocj0xKTtjb25zdCBvPXRoaXMuZ2V0UG9pbnQoaSksYT10aGlzLmdldFBvaW50KHIpLHM9ZXx8KG8uaXNWZWN0b3IyP25ldyBtSnQ6bmV3IENKdCk7cmV0dXJuIHMuY29weShhKS5zdWIobykubm9ybWFsaXplKCksc31nZXRUYW5nZW50QXQodCxlKXtjb25zdCBuPXRoaXMuZ2V0VXRvVG1hcHBpbmcodCk7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudChuLGUpfWNvbXB1dGVGcmVuZXRGcmFtZXModCxlKXtjb25zdCBuPW5ldyBDSnQsaT1bXSxyPVtdLG89W10sYT1uZXcgQ0p0LHM9bmV3IHJRdDtmb3IobGV0IGU9MDtlPD10O2UrKylpW2VdPXRoaXMuZ2V0VGFuZ2VudEF0KGUvdCxuZXcgQ0p0KSxpW2VdLm5vcm1hbGl6ZSgpO3JbMF09bmV3IENKdCxvWzBdPW5ldyBDSnQ7bGV0IGw9TnVtYmVyLk1BWF9WQUxVRTtjb25zdCBjPU1hdGguYWJzKGlbMF0ueCksdT1NYXRoLmFicyhpWzBdLnkpLGg9TWF0aC5hYnMoaVswXS56KTtjPD1sJiYobD1jLG4uc2V0KDEsMCwwKSksdTw9bCYmKGw9dSxuLnNldCgwLDEsMCkpLGg8PWwmJm4uc2V0KDAsMCwxKSxhLmNyb3NzVmVjdG9ycyhpWzBdLG4pLm5vcm1hbGl6ZSgpLHJbMF0uY3Jvc3NWZWN0b3JzKGlbMF0sYSksb1swXS5jcm9zc1ZlY3RvcnMoaVswXSxyWzBdKTtmb3IobGV0IGU9MTtlPD10O2UrKyl7aWYocltlXT1yW2UtMV0uY2xvbmUoKSxvW2VdPW9bZS0xXS5jbG9uZSgpLGEuY3Jvc3NWZWN0b3JzKGlbZS0xXSxpW2VdKSxhLmxlbmd0aCgpPk51bWJlci5FUFNJTE9OKXthLm5vcm1hbGl6ZSgpO2NvbnN0IHQ9TWF0aC5hY29zKCRadChpW2UtMV0uZG90KGlbZV0pLC0xLDEpKTtyW2VdLmFwcGx5TWF0cml4NChzLm1ha2VSb3RhdGlvbkF4aXMoYSx0KSl9b1tlXS5jcm9zc1ZlY3RvcnMoaVtlXSxyW2VdKX1pZighMD09PWUpe2xldCBlPU1hdGguYWNvcygkWnQoclswXS5kb3Qoclt0XSksLTEsMSkpO2UvPXQsaVswXS5kb3QoYS5jcm9zc1ZlY3RvcnMoclswXSxyW3RdKSk+MCYmKGU9LWUpO2ZvcihsZXQgbj0xO248PXQ7bisrKXJbbl0uYXBwbHlNYXRyaXg0KHMubWFrZVJvdGF0aW9uQXhpcyhpW25dLGUqbikpLG9bbl0uY3Jvc3NWZWN0b3JzKGlbbl0scltuXSl9cmV0dXJue3RhbmdlbnRzOmksbm9ybWFsczpyLGJpbm9ybWFsczpvfX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz10LmFyY0xlbmd0aERpdmlzaW9ucyx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNSx0eXBlOiJDdXJ2ZSIsZ2VuZXJhdG9yOiJDdXJ2ZS50b0pTT04ifX07cmV0dXJuIHQuYXJjTGVuZ3RoRGl2aXNpb25zPXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zLHQudHlwZT10aGlzLnR5cGUsdH1mcm9tSlNPTih0KXtyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9dC5hcmNMZW5ndGhEaXZpc2lvbnMsdGhpc319Y2xhc3MgZDR0IGV4dGVuZHMgaDR0e2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0xLGk9MSxyPTAsbz0yKk1hdGguUEksYT0hMSxzPTApe3N1cGVyKCksdGhpcy50eXBlPSJFbGxpcHNlQ3VydmUiLHRoaXMuYVg9dCx0aGlzLmFZPWUsdGhpcy54UmFkaXVzPW4sdGhpcy55UmFkaXVzPWksdGhpcy5hU3RhcnRBbmdsZT1yLHRoaXMuYUVuZEFuZ2xlPW8sdGhpcy5hQ2xvY2t3aXNlPWEsdGhpcy5hUm90YXRpb249c31nZXRQb2ludCh0LGUpe2NvbnN0IG49ZXx8bmV3IG1KdCxpPTIqTWF0aC5QSTtsZXQgcj10aGlzLmFFbmRBbmdsZS10aGlzLmFTdGFydEFuZ2xlO2NvbnN0IG89TWF0aC5hYnMocik8TnVtYmVyLkVQU0lMT047Zm9yKDtyPDA7KXIrPWk7Zm9yKDtyPmk7KXItPWk7cjxOdW1iZXIuRVBTSUxPTiYmKHI9bz8wOmkpLCEwIT09dGhpcy5hQ2xvY2t3aXNlfHxvfHwocj09PWk/cj0taTpyLT1pKTtjb25zdCBhPXRoaXMuYVN0YXJ0QW5nbGUrdCpyO2xldCBzPXRoaXMuYVgrdGhpcy54UmFkaXVzKk1hdGguY29zKGEpLGw9dGhpcy5hWSt0aGlzLnlSYWRpdXMqTWF0aC5zaW4oYSk7aWYoMCE9PXRoaXMuYVJvdGF0aW9uKXtjb25zdCB0PU1hdGguY29zKHRoaXMuYVJvdGF0aW9uKSxlPU1hdGguc2luKHRoaXMuYVJvdGF0aW9uKSxuPXMtdGhpcy5hWCxpPWwtdGhpcy5hWTtzPW4qdC1pKmUrdGhpcy5hWCxsPW4qZStpKnQrdGhpcy5hWX1yZXR1cm4gbi5zZXQocyxsKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuYVg9dC5hWCx0aGlzLmFZPXQuYVksdGhpcy54UmFkaXVzPXQueFJhZGl1cyx0aGlzLnlSYWRpdXM9dC55UmFkaXVzLHRoaXMuYVN0YXJ0QW5nbGU9dC5hU3RhcnRBbmdsZSx0aGlzLmFFbmRBbmdsZT10LmFFbmRBbmdsZSx0aGlzLmFDbG9ja3dpc2U9dC5hQ2xvY2t3aXNlLHRoaXMuYVJvdGF0aW9uPXQuYVJvdGF0aW9uLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5hWD10aGlzLmFYLHQuYVk9dGhpcy5hWSx0LnhSYWRpdXM9dGhpcy54UmFkaXVzLHQueVJhZGl1cz10aGlzLnlSYWRpdXMsdC5hU3RhcnRBbmdsZT10aGlzLmFTdGFydEFuZ2xlLHQuYUVuZEFuZ2xlPXRoaXMuYUVuZEFuZ2xlLHQuYUNsb2Nrd2lzZT10aGlzLmFDbG9ja3dpc2UsdC5hUm90YXRpb249dGhpcy5hUm90YXRpb24sdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy5hWD10LmFYLHRoaXMuYVk9dC5hWSx0aGlzLnhSYWRpdXM9dC54UmFkaXVzLHRoaXMueVJhZGl1cz10LnlSYWRpdXMsdGhpcy5hU3RhcnRBbmdsZT10LmFTdGFydEFuZ2xlLHRoaXMuYUVuZEFuZ2xlPXQuYUVuZEFuZ2xlLHRoaXMuYUNsb2Nrd2lzZT10LmFDbG9ja3dpc2UsdGhpcy5hUm90YXRpb249dC5hUm90YXRpb24sdGhpc319ZDR0LnByb3RvdHlwZS5pc0VsbGlwc2VDdXJ2ZT0hMDtjbGFzcyBwNHQgZXh0ZW5kcyBkNHR7Y29uc3RydWN0b3IodCxlLG4saSxyLG8pe3N1cGVyKHQsZSxuLG4saSxyLG8pLHRoaXMudHlwZT0iQXJjQ3VydmUifX1mdW5jdGlvbiBmNHQoKXtsZXQgdD0wLGU9MCxuPTAsaT0wO2Z1bmN0aW9uIHIocixvLGEscyl7dD1yLGU9YSxuPS0zKnIrMypvLTIqYS1zLGk9MipyLTIqbythK3N9cmV0dXJue2luaXRDYXRtdWxsUm9tOmZ1bmN0aW9uKHQsZSxuLGksbyl7cihlLG4sbyoobi10KSxvKihpLWUpKX0saW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tOmZ1bmN0aW9uKHQsZSxuLGksbyxhLHMpe2xldCBsPShlLXQpL28tKG4tdCkvKG8rYSkrKG4tZSkvYSxjPShuLWUpL2EtKGktZSkvKGErcykrKGktbikvcztsKj1hLGMqPWEscihlLG4sbCxjKX0sY2FsYzpmdW5jdGlvbihyKXtjb25zdCBvPXIqcjtyZXR1cm4gdCtlKnIrbipvK2kqKG8qcil9fX1wNHQucHJvdG90eXBlLmlzQXJjQ3VydmU9ITA7Y29uc3QgbTR0PW5ldyBDSnQsZzR0PW5ldyBmNHQsXzR0PW5ldyBmNHQseTR0PW5ldyBmNHQ7Y2xhc3MgdjR0IGV4dGVuZHMgaDR0e2NvbnN0cnVjdG9yKHQ9W10sZT0hMSxuPSJjZW50cmlwZXRhbCIsaT0uNSl7c3VwZXIoKSx0aGlzLnR5cGU9IkNhdG11bGxSb21DdXJ2ZTMiLHRoaXMucG9pbnRzPXQsdGhpcy5jbG9zZWQ9ZSx0aGlzLmN1cnZlVHlwZT1uLHRoaXMudGVuc2lvbj1pfWdldFBvaW50KHQsZT1uZXcgQ0p0KXtjb25zdCBuPWUsaT10aGlzLnBvaW50cyxyPWkubGVuZ3RoLG89KHItKHRoaXMuY2xvc2VkPzA6MSkpKnQ7bGV0IGEscyxsPU1hdGguZmxvb3IobyksYz1vLWw7dGhpcy5jbG9zZWQ/bCs9bD4wPzA6KE1hdGguZmxvb3IoTWF0aC5hYnMobCkvcikrMSkqcjowPT09YyYmbD09PXItMSYmKGw9ci0yLGM9MSksdGhpcy5jbG9zZWR8fGw+MD9hPWlbKGwtMSklcl06KG00dC5zdWJWZWN0b3JzKGlbMF0saVsxXSkuYWRkKGlbMF0pLGE9bTR0KTtjb25zdCB1PWlbbCVyXSxoPWlbKGwrMSklcl07aWYodGhpcy5jbG9zZWR8fGwrMjxyP3M9aVsobCsyKSVyXToobTR0LnN1YlZlY3RvcnMoaVtyLTFdLGlbci0yXSkuYWRkKGlbci0xXSkscz1tNHQpLCJjZW50cmlwZXRhbCI9PT10aGlzLmN1cnZlVHlwZXx8ImNob3JkYWwiPT09dGhpcy5jdXJ2ZVR5cGUpe2NvbnN0IHQ9ImNob3JkYWwiPT09dGhpcy5jdXJ2ZVR5cGU/LjU6LjI1O2xldCBlPU1hdGgucG93KGEuZGlzdGFuY2VUb1NxdWFyZWQodSksdCksbj1NYXRoLnBvdyh1LmRpc3RhbmNlVG9TcXVhcmVkKGgpLHQpLGk9TWF0aC5wb3coaC5kaXN0YW5jZVRvU3F1YXJlZChzKSx0KTtuPDFlLTQmJihuPTEpLGU8MWUtNCYmKGU9biksaTwxZS00JiYoaT1uKSxnNHQuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKGEueCx1LngsaC54LHMueCxlLG4saSksXzR0LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShhLnksdS55LGgueSxzLnksZSxuLGkpLHk0dC5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oYS56LHUueixoLnoscy56LGUsbixpKX1lbHNlImNhdG11bGxyb20iPT09dGhpcy5jdXJ2ZVR5cGUmJihnNHQuaW5pdENhdG11bGxSb20oYS54LHUueCxoLngscy54LHRoaXMudGVuc2lvbiksXzR0LmluaXRDYXRtdWxsUm9tKGEueSx1LnksaC55LHMueSx0aGlzLnRlbnNpb24pLHk0dC5pbml0Q2F0bXVsbFJvbShhLnosdS56LGgueixzLnosdGhpcy50ZW5zaW9uKSk7cmV0dXJuIG4uc2V0KGc0dC5jYWxjKGMpLF80dC5jYWxjKGMpLHk0dC5jYWxjKGMpKSxufWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXRoaXMucG9pbnRzLnB1c2godC5wb2ludHNbZV0uY2xvbmUoKSk7cmV0dXJuIHRoaXMuY2xvc2VkPXQuY2xvc2VkLHRoaXMuY3VydmVUeXBlPXQuY3VydmVUeXBlLHRoaXMudGVuc2lvbj10LnRlbnNpb24sdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5wb2ludHMubGVuZ3RoO2U8bjtlKyspdC5wb2ludHMucHVzaCh0aGlzLnBvaW50c1tlXS50b0FycmF5KCkpO3JldHVybiB0LmNsb3NlZD10aGlzLmNsb3NlZCx0LmN1cnZlVHlwZT10aGlzLmN1cnZlVHlwZSx0LnRlbnNpb249dGhpcy50ZW5zaW9uLHR9ZnJvbUpTT04odCl7c3VwZXIuZnJvbUpTT04odCksdGhpcy5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10LnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgbj10LnBvaW50c1tlXTt0aGlzLnBvaW50cy5wdXNoKChuZXcgQ0p0KS5mcm9tQXJyYXkobikpfXJldHVybiB0aGlzLmNsb3NlZD10LmNsb3NlZCx0aGlzLmN1cnZlVHlwZT10LmN1cnZlVHlwZSx0aGlzLnRlbnNpb249dC50ZW5zaW9uLHRoaXN9fWZ1bmN0aW9uIGI0dCh0LGUsbixpLHIpe2NvbnN0IG89LjUqKGktZSksYT0uNSooci1uKSxzPXQqdDtyZXR1cm4oMipuLTIqaStvK2EpKih0KnMpKygtMypuKzMqaS0yKm8tYSkqcytvKnQrbn1mdW5jdGlvbiB4NHQodCxlLG4saSl7cmV0dXJuKGZ1bmN0aW9uIHIodCxlKXtjb25zdCBuPTEtdDtyZXR1cm4gbipuKmV9KSh0LGUpKyhmdW5jdGlvbiBvKHQsZSl7cmV0dXJuIDIqKDEtdCkqdCplfSkodCxuKSsoZnVuY3Rpb24gYSh0LGUpe3JldHVybiB0KnQqZX0pKHQsaSl9ZnVuY3Rpb24gdzR0KHQsZSxuLGkscil7cmV0dXJuKGZ1bmN0aW9uIG8odCxlKXtjb25zdCBuPTEtdDtyZXR1cm4gbipuKm4qZX0pKHQsZSkrKGZ1bmN0aW9uIGEodCxlKXtjb25zdCBuPTEtdDtyZXR1cm4gMypuKm4qdCplfSkodCxuKSsoZnVuY3Rpb24gcyh0LGUpe3JldHVybiAzKigxLXQpKnQqdCplfSkodCxpKSsoZnVuY3Rpb24gbCh0LGUpe3JldHVybiB0KnQqdCplfSkodCxyKX12NHQucHJvdG90eXBlLmlzQ2F0bXVsbFJvbUN1cnZlMz0hMDtjbGFzcyBTNHQgZXh0ZW5kcyBoNHR7Y29uc3RydWN0b3IodD1uZXcgbUp0LGU9bmV3IG1KdCxuPW5ldyBtSnQsaT1uZXcgbUp0KXtzdXBlcigpLHRoaXMudHlwZT0iQ3ViaWNCZXppZXJDdXJ2ZSIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW4sdGhpcy52Mz1pfWdldFBvaW50KHQsZT1uZXcgbUp0KXtjb25zdCBuPWUsaT10aGlzLnYwLHI9dGhpcy52MSxvPXRoaXMudjIsYT10aGlzLnYzO3JldHVybiBuLnNldCh3NHQodCxpLngsci54LG8ueCxhLngpLHc0dCh0LGkueSxyLnksby55LGEueSkpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYwLmNvcHkodC52MCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzLnYzLmNvcHkodC52MyksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0LnYzPXRoaXMudjMudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjAuZnJvbUFycmF5KHQudjApLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXMudjMuZnJvbUFycmF5KHQudjMpLHRoaXN9fVM0dC5wcm90b3R5cGUuaXNDdWJpY0JlemllckN1cnZlPSEwO2NsYXNzIE00dCBleHRlbmRzIGg0dHtjb25zdHJ1Y3Rvcih0PW5ldyBDSnQsZT1uZXcgQ0p0LG49bmV3IENKdCxpPW5ldyBDSnQpe3N1cGVyKCksdGhpcy50eXBlPSJDdWJpY0JlemllckN1cnZlMyIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW4sdGhpcy52Mz1pfWdldFBvaW50KHQsZT1uZXcgQ0p0KXtjb25zdCBuPWUsaT10aGlzLnYwLHI9dGhpcy52MSxvPXRoaXMudjIsYT10aGlzLnYzO3JldHVybiBuLnNldCh3NHQodCxpLngsci54LG8ueCxhLngpLHc0dCh0LGkueSxyLnksby55LGEueSksdzR0KHQsaS56LHIueixvLnosYS56KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXMudjMuY29weSh0LnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHQudjM9dGhpcy52My50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpcy52My5mcm9tQXJyYXkodC52MyksdGhpc319TTR0LnByb3RvdHlwZS5pc0N1YmljQmV6aWVyQ3VydmUzPSEwO2NsYXNzIEU0dCBleHRlbmRzIGg0dHtjb25zdHJ1Y3Rvcih0PW5ldyBtSnQsZT1uZXcgbUp0KXtzdXBlcigpLHRoaXMudHlwZT0iTGluZUN1cnZlIix0aGlzLnYxPXQsdGhpcy52Mj1lfWdldFBvaW50KHQsZT1uZXcgbUp0KXtjb25zdCBuPWU7cmV0dXJuIDE9PT10P24uY29weSh0aGlzLnYyKToobi5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSxuLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnYxKSksbn1nZXRQb2ludEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQodCxlKX1nZXRUYW5nZW50KHQsZSl7Y29uc3Qgbj1lfHxuZXcgbUp0O3JldHVybiBuLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLm5vcm1hbGl6ZSgpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXN9fUU0dC5wcm90b3R5cGUuaXNMaW5lQ3VydmU9ITA7Y2xhc3MgVDR0IGV4dGVuZHMgaDR0e2NvbnN0cnVjdG9yKHQ9bmV3IENKdCxlPW5ldyBDSnQpe3N1cGVyKCksdGhpcy50eXBlPSJMaW5lQ3VydmUzIix0aGlzLmlzTGluZUN1cnZlMz0hMCx0aGlzLnYxPXQsdGhpcy52Mj1lfWdldFBvaW50KHQsZT1uZXcgQ0p0KXtjb25zdCBuPWU7cmV0dXJuIDE9PT10P24uY29weSh0aGlzLnYyKToobi5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSxuLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnYxKSksbn1nZXRQb2ludEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQodCxlKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpc319Y2xhc3MgQzR0IGV4dGVuZHMgaDR0e2NvbnN0cnVjdG9yKHQ9bmV3IG1KdCxlPW5ldyBtSnQsbj1uZXcgbUp0KXtzdXBlcigpLHRoaXMudHlwZT0iUXVhZHJhdGljQmV6aWVyQ3VydmUiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1ufWdldFBvaW50KHQsZT1uZXcgbUp0KXtjb25zdCBuPWUsaT10aGlzLnYwLHI9dGhpcy52MSxvPXRoaXMudjI7cmV0dXJuIG4uc2V0KHg0dCh0LGkueCxyLngsby54KSx4NHQodCxpLnksci55LG8ueSkpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYwLmNvcHkodC52MCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjAuZnJvbUFycmF5KHQudjApLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXN9fUM0dC5wcm90b3R5cGUuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZT0hMDtjbGFzcyBBNHQgZXh0ZW5kcyBoNHR7Y29uc3RydWN0b3IodD1uZXcgQ0p0LGU9bmV3IENKdCxuPW5ldyBDSnQpe3N1cGVyKCksdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1ufWdldFBvaW50KHQsZT1uZXcgQ0p0KXtjb25zdCBuPWUsaT10aGlzLnYwLHI9dGhpcy52MSxvPXRoaXMudjI7cmV0dXJuIG4uc2V0KHg0dCh0LGkueCxyLngsby54KSx4NHQodCxpLnksci55LG8ueSkseDR0KHQsaS56LHIueixvLnopKSxufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MC5jb3B5KHQudjApLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYwLmZyb21BcnJheSh0LnYwKSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX1BNHQucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUzPSEwO2NsYXNzIGs0dCBleHRlbmRzIGg0dHtjb25zdHJ1Y3Rvcih0PVtdKXtzdXBlcigpLHRoaXMudHlwZT0iU3BsaW5lQ3VydmUiLHRoaXMucG9pbnRzPXR9Z2V0UG9pbnQodCxlPW5ldyBtSnQpe2NvbnN0IG49ZSxpPXRoaXMucG9pbnRzLHI9KGkubGVuZ3RoLTEpKnQsbz1NYXRoLmZsb29yKHIpLGE9ci1vLHM9aVswPT09bz9vOm8tMV0sbD1pW29dLGM9aVtvPmkubGVuZ3RoLTI/aS5sZW5ndGgtMTpvKzFdLHU9aVtvPmkubGVuZ3RoLTM/aS5sZW5ndGgtMTpvKzJdO3JldHVybiBuLnNldChiNHQoYSxzLngsbC54LGMueCx1LngpLGI0dChhLHMueSxsLnksYy55LHUueSkpLG59Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspdGhpcy5wb2ludHMucHVzaCh0LnBvaW50c1tlXS5jbG9uZSgpKTtyZXR1cm4gdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5wb2ludHMubGVuZ3RoO2U8bjtlKyspdC5wb2ludHMucHVzaCh0aGlzLnBvaW50c1tlXS50b0FycmF5KCkpO3JldHVybiB0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IG49dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaCgobmV3IG1KdCkuZnJvbUFycmF5KG4pKX1yZXR1cm4gdGhpc319azR0LnByb3RvdHlwZS5pc1NwbGluZUN1cnZlPSEwO3ZhciBMNHQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQXJjQ3VydmU6cDR0LENhdG11bGxSb21DdXJ2ZTM6djR0LEN1YmljQmV6aWVyQ3VydmU6UzR0LEN1YmljQmV6aWVyQ3VydmUzOk00dCxFbGxpcHNlQ3VydmU6ZDR0LExpbmVDdXJ2ZTpFNHQsTGluZUN1cnZlMzpUNHQsUXVhZHJhdGljQmV6aWVyQ3VydmU6QzR0LFF1YWRyYXRpY0JlemllckN1cnZlMzpBNHQsU3BsaW5lQ3VydmU6azR0fSk7ZnVuY3Rpb24gUDR0KHQsZSxuLGkscil7bGV0IG8sYTtpZihyPT09KGZ1bmN0aW9uIHModCxlLG4saSl7bGV0IHI9MDtmb3IobGV0IG89ZSxhPW4taTtvPG47bys9aSlyKz0odFthXS10W29dKSoodFtvKzFdK3RbYSsxXSksYT1vO3JldHVybiByfSkodCxlLG4saSk+MClmb3Iobz1lO288bjtvKz1pKWE9SjR0KG8sdFtvXSx0W28rMV0sYSk7ZWxzZSBmb3Iobz1uLWk7bz49ZTtvLT1pKWE9SjR0KG8sdFtvXSx0W28rMV0sYSk7cmV0dXJuIGEmJnE0dChhLGEubmV4dCkmJihRNHQoYSksYT1hLm5leHQpLGF9ZnVuY3Rpb24gTjR0KHQsZSl7aWYoIXQpcmV0dXJuIHQ7ZXx8KGU9dCk7bGV0IG4saT10O2Rve2lmKG49ITEsaS5zdGVpbmVyfHwhcTR0KGksaS5uZXh0KSYmMCE9PVc0dChpLnByZXYsaSxpLm5leHQpKWk9aS5uZXh0O2Vsc2V7aWYoUTR0KGkpLGk9ZT1pLnByZXYsaT09PWkubmV4dClicmVhaztuPSEwfX13aGlsZShufHxpIT09ZSk7cmV0dXJuIGV9ZnVuY3Rpb24gSTR0KHQsZSxuLGkscixvLGEpe2lmKCF0KXJldHVybjshYSYmbyYmKGZ1bmN0aW9uIHModCxlLG4saSl7bGV0IHI9dDtkb3tudWxsPT09ci56JiYoci56PVY0dChyLngsci55LGUsbixpKSksci5wcmV2Wj1yLnByZXYsci5uZXh0Wj1yLm5leHQscj1yLm5leHR9d2hpbGUociE9PXQpO3IucHJldloubmV4dFo9bnVsbCxyLnByZXZaPW51bGwsKGZ1bmN0aW9uIG8odCl7bGV0IGUsbixpLHIsbyxhLHMsbCxjPTE7ZG97Zm9yKG49dCx0PW51bGwsbz1udWxsLGE9MDtuOyl7Zm9yKGErKyxpPW4scz0wLGU9MDtlPGMmJihzKyssaT1pLm5leHRaLGkpO2UrKyk7Zm9yKGw9YztzPjB8fGw+MCYmaTspMCE9PXMmJigwPT09bHx8IWl8fG4uejw9aS56KT8ocj1uLG49bi5uZXh0WixzLS0pOihyPWksaT1pLm5leHRaLGwtLSksbz9vLm5leHRaPXI6dD1yLHIucHJldlo9byxvPXI7bj1pfW8ubmV4dFo9bnVsbCxjKj0yfXdoaWxlKGE+MSl9KShyKX0pKHQsaSxyLG8pO2xldCBsLGMsdT10O2Zvcig7dC5wcmV2IT09dC5uZXh0OylpZihsPXQucHJldixjPXQubmV4dCxvP080dCh0LGkscixvKTpSNHQodCkpZS5wdXNoKGwuaS9uKSxlLnB1c2godC5pL24pLGUucHVzaChjLmkvbiksUTR0KHQpLHQ9Yy5uZXh0LHU9Yy5uZXh0O2Vsc2UgaWYoKHQ9Yyk9PT11KXthPzE9PT1hP0k0dCh0PXo0dChONHQodCksZSxuKSxlLG4saSxyLG8sMik6Mj09PWEmJkQ0dCh0LGUsbixpLHIsbyk6STR0KE40dCh0KSxlLG4saSxyLG8sMSk7YnJlYWt9fWZ1bmN0aW9uIFI0dCh0KXtjb25zdCBlPXQucHJldixuPXQsaT10Lm5leHQ7aWYoVzR0KGUsbixpKT49MClyZXR1cm4hMTtsZXQgcj10Lm5leHQubmV4dDtmb3IoO3IhPT10LnByZXY7KXtpZihqNHQoZS54LGUueSxuLngsbi55LGkueCxpLnksci54LHIueSkmJlc0dChyLnByZXYscixyLm5leHQpPj0wKXJldHVybiExO3I9ci5uZXh0fXJldHVybiEwfWZ1bmN0aW9uIE80dCh0LGUsbixpKXtjb25zdCByPXQucHJldixvPXQsYT10Lm5leHQ7aWYoVzR0KHIsbyxhKT49MClyZXR1cm4hMTtjb25zdCBzPXIueD5vLng/ci54PmEueD9yLng6YS54Om8ueD5hLng/by54OmEueCxsPXIueT5vLnk/ci55PmEueT9yLnk6YS55Om8ueT5hLnk/by55OmEueSxjPVY0dChyLng8by54P3IueDxhLng/ci54OmEueDpvLng8YS54P28ueDphLngsci55PG8ueT9yLnk8YS55P3IueTphLnk6by55PGEueT9vLnk6YS55LGUsbixpKSx1PVY0dChzLGwsZSxuLGkpO2xldCBoPXQucHJldlosZD10Lm5leHRaO2Zvcig7aCYmaC56Pj1jJiZkJiZkLno8PXU7KXtpZihoIT09dC5wcmV2JiZoIT09dC5uZXh0JiZqNHQoci54LHIueSxvLngsby55LGEueCxhLnksaC54LGgueSkmJlc0dChoLnByZXYsaCxoLm5leHQpPj0wKXJldHVybiExO2lmKGg9aC5wcmV2WixkIT09dC5wcmV2JiZkIT09dC5uZXh0JiZqNHQoci54LHIueSxvLngsby55LGEueCxhLnksZC54LGQueSkmJlc0dChkLnByZXYsZCxkLm5leHQpPj0wKXJldHVybiExO2Q9ZC5uZXh0Wn1mb3IoO2gmJmguej49Yzspe2lmKGghPT10LnByZXYmJmghPT10Lm5leHQmJmo0dChyLngsci55LG8ueCxvLnksYS54LGEueSxoLngsaC55KSYmVzR0KGgucHJldixoLGgubmV4dCk+PTApcmV0dXJuITE7aD1oLnByZXZafWZvcig7ZCYmZC56PD11Oyl7aWYoZCE9PXQucHJldiYmZCE9PXQubmV4dCYmajR0KHIueCxyLnksby54LG8ueSxhLngsYS55LGQueCxkLnkpJiZXNHQoZC5wcmV2LGQsZC5uZXh0KT49MClyZXR1cm4hMTtkPWQubmV4dFp9cmV0dXJuITB9ZnVuY3Rpb24gejR0KHQsZSxuKXtsZXQgaT10O2Rve2NvbnN0IHI9aS5wcmV2LG89aS5uZXh0Lm5leHQ7IXE0dChyLG8pJiZZNHQocixpLGkubmV4dCxvKSYmSzR0KHIsbykmJks0dChvLHIpJiYoZS5wdXNoKHIuaS9uKSxlLnB1c2goaS5pL24pLGUucHVzaChvLmkvbiksUTR0KGkpLFE0dChpLm5leHQpLGk9dD1vKSxpPWkubmV4dH13aGlsZShpIT09dCk7cmV0dXJuIE40dChpKX1mdW5jdGlvbiBENHQodCxlLG4saSxyLG8pe2xldCBhPXQ7ZG97bGV0IHQ9YS5uZXh0Lm5leHQ7Zm9yKDt0IT09YS5wcmV2Oyl7aWYoYS5pIT09dC5pJiZHNHQoYSx0KSl7bGV0IHM9WjR0KGEsdCk7cmV0dXJuIGE9TjR0KGEsYS5uZXh0KSxzPU40dChzLHMubmV4dCksSTR0KGEsZSxuLGkscixvKSx2b2lkIEk0dChzLGUsbixpLHIsbyl9dD10Lm5leHR9YT1hLm5leHR9d2hpbGUoYSE9PXQpfWZ1bmN0aW9uIEI0dCh0LGUpe3JldHVybiB0LngtZS54fWZ1bmN0aW9uIEg0dCh0LGUpe2lmKGU9KGZ1bmN0aW9uIG4odCxlKXtsZXQgbj1lO2NvbnN0IGk9dC54LHI9dC55O2xldCBvLGE9LTEvMDtkb3tpZihyPD1uLnkmJnI+PW4ubmV4dC55JiZuLm5leHQueSE9PW4ueSl7Y29uc3QgdD1uLngrKHItbi55KSoobi5uZXh0Lngtbi54KS8obi5uZXh0Lnktbi55KTtpZih0PD1pJiZ0PmEpe2lmKGE9dCx0PT09aSl7aWYocj09PW4ueSlyZXR1cm4gbjtpZihyPT09bi5uZXh0LnkpcmV0dXJuIG4ubmV4dH1vPW4ueDxuLm5leHQueD9uOm4ubmV4dH19bj1uLm5leHR9d2hpbGUobiE9PWUpO2lmKCFvKXJldHVybiBudWxsO2lmKGk9PT1hKXJldHVybiBvO2NvbnN0IHM9byxsPW8ueCxjPW8ueTtsZXQgdSxoPTEvMDtuPW87ZG97aT49bi54JiZuLng+PWwmJmkhPT1uLngmJmo0dChyPGM/aTphLHIsbCxjLHI8Yz9hOmkscixuLngsbi55KSYmKHU9TWF0aC5hYnMoci1uLnkpLyhpLW4ueCksSzR0KG4sdCkmJih1PGh8fHU9PT1oJiYobi54Pm8ueHx8bi54PT09by54JiZGNHQobyxuKSkpJiYobz1uLGg9dSkpLG49bi5uZXh0fXdoaWxlKG4hPT1zKTtyZXR1cm4gb30pKHQsZSkpe2NvbnN0IG49WjR0KGUsdCk7TjR0KGUsZS5uZXh0KSxONHQobixuLm5leHQpfX1mdW5jdGlvbiBGNHQodCxlKXtyZXR1cm4gVzR0KHQucHJldix0LGUucHJldik8MCYmVzR0KGUubmV4dCx0LHQubmV4dCk8MH1mdW5jdGlvbiBWNHQodCxlLG4saSxyKXtyZXR1cm4odD0xNDMxNjU1NzY1JigodD04NTg5OTM0NTkmKCh0PTI1MjY0NTEzNSYoKHQ9MTY3MTE5MzUmKCh0PTMyNzY3Kih0LW4pKnIpfHQ8PDgpKXx0PDw0KSl8dDw8MikpfHQ8PDEpKXwoZT0xNDMxNjU1NzY1JigoZT04NTg5OTM0NTkmKChlPTI1MjY0NTEzNSYoKGU9MTY3MTE5MzUmKChlPTMyNzY3KihlLWkpKnIpfGU8PDgpKXxlPDw0KSl8ZTw8MikpfGU8PDEpKTw8MX1mdW5jdGlvbiBVNHQodCl7bGV0IGU9dCxuPXQ7ZG97KGUueDxuLnh8fGUueD09PW4ueCYmZS55PG4ueSkmJihuPWUpLGU9ZS5uZXh0fXdoaWxlKGUhPT10KTtyZXR1cm4gbn1mdW5jdGlvbiBqNHQodCxlLG4saSxyLG8sYSxzKXtyZXR1cm4oci1hKSooZS1zKS0odC1hKSooby1zKT49MCYmKHQtYSkqKGktcyktKG4tYSkqKGUtcyk+PTAmJihuLWEpKihvLXMpLShyLWEpKihpLXMpPj0wfWZ1bmN0aW9uIEc0dCh0LGUpe3JldHVybiB0Lm5leHQuaSE9PWUuaSYmdC5wcmV2LmkhPT1lLmkmJiEoZnVuY3Rpb24gbih0LGUpe2xldCBuPXQ7ZG97aWYobi5pIT09dC5pJiZuLm5leHQuaSE9PXQuaSYmbi5pIT09ZS5pJiZuLm5leHQuaSE9PWUuaSYmWTR0KG4sbi5uZXh0LHQsZSkpcmV0dXJuITA7bj1uLm5leHR9d2hpbGUobiE9PXQpO3JldHVybiExfSkodCxlKSYmKEs0dCh0LGUpJiZLNHQoZSx0KSYmKGZ1bmN0aW9uIGkodCxlKXtsZXQgbj10LGk9ITE7Y29uc3Qgcj0odC54K2UueCkvMixvPSh0LnkrZS55KS8yO2Rve24ueT5vIT1uLm5leHQueT5vJiZuLm5leHQueSE9PW4ueSYmcjwobi5uZXh0Lngtbi54KSooby1uLnkpLyhuLm5leHQueS1uLnkpK24ueCYmKGk9IWkpLG49bi5uZXh0fXdoaWxlKG4hPT10KTtyZXR1cm4gaX0pKHQsZSkmJihXNHQodC5wcmV2LHQsZS5wcmV2KXx8VzR0KHQsZS5wcmV2LGUpKXx8cTR0KHQsZSkmJlc0dCh0LnByZXYsdCx0Lm5leHQpPjAmJlc0dChlLnByZXYsZSxlLm5leHQpPjApfWZ1bmN0aW9uIFc0dCh0LGUsbil7cmV0dXJuKGUueS10LnkpKihuLngtZS54KS0oZS54LXQueCkqKG4ueS1lLnkpfWZ1bmN0aW9uIHE0dCh0LGUpe3JldHVybiB0Lng9PT1lLngmJnQueT09PWUueX1mdW5jdGlvbiBZNHQodCxlLG4saSl7Y29uc3Qgcj0kNHQoVzR0KHQsZSxuKSksbz0kNHQoVzR0KHQsZSxpKSksYT0kNHQoVzR0KG4saSx0KSkscz0kNHQoVzR0KG4saSxlKSk7cmV0dXJuIHIhPT1vJiZhIT09c3x8ISgwIT09cnx8IVg0dCh0LG4sZSkpfHwhKDAhPT1vfHwhWDR0KHQsaSxlKSl8fCEoMCE9PWF8fCFYNHQobix0LGkpKXx8ISgwIT09c3x8IVg0dChuLGUsaSkpfWZ1bmN0aW9uIFg0dCh0LGUsbil7cmV0dXJuIGUueDw9TWF0aC5tYXgodC54LG4ueCkmJmUueD49TWF0aC5taW4odC54LG4ueCkmJmUueTw9TWF0aC5tYXgodC55LG4ueSkmJmUueT49TWF0aC5taW4odC55LG4ueSl9ZnVuY3Rpb24gJDR0KHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH1mdW5jdGlvbiBLNHQodCxlKXtyZXR1cm4gVzR0KHQucHJldix0LHQubmV4dCk8MD9XNHQodCxlLHQubmV4dCk+PTAmJlc0dCh0LHQucHJldixlKT49MDpXNHQodCxlLHQucHJldik8MHx8VzR0KHQsdC5uZXh0LGUpPDB9ZnVuY3Rpb24gWjR0KHQsZSl7Y29uc3Qgbj1uZXcgdDZ0KHQuaSx0LngsdC55KSxpPW5ldyB0NnQoZS5pLGUueCxlLnkpLHI9dC5uZXh0LG89ZS5wcmV2O3JldHVybiB0Lm5leHQ9ZSxlLnByZXY9dCxuLm5leHQ9cixyLnByZXY9bixpLm5leHQ9bixuLnByZXY9aSxvLm5leHQ9aSxpLnByZXY9byxpfWZ1bmN0aW9uIEo0dCh0LGUsbixpKXtjb25zdCByPW5ldyB0NnQodCxlLG4pO3JldHVybiBpPyhyLm5leHQ9aS5uZXh0LHIucHJldj1pLGkubmV4dC5wcmV2PXIsaS5uZXh0PXIpOihyLnByZXY9cixyLm5leHQ9cikscn1mdW5jdGlvbiBRNHQodCl7dC5uZXh0LnByZXY9dC5wcmV2LHQucHJldi5uZXh0PXQubmV4dCx0LnByZXZaJiYodC5wcmV2Wi5uZXh0Wj10Lm5leHRaKSx0Lm5leHRaJiYodC5uZXh0Wi5wcmV2Wj10LnByZXZaKX1mdW5jdGlvbiB0NnQodCxlLG4pe3RoaXMuaT10LHRoaXMueD1lLHRoaXMueT1uLHRoaXMucHJldj1udWxsLHRoaXMubmV4dD1udWxsLHRoaXMuej1udWxsLHRoaXMucHJldlo9bnVsbCx0aGlzLm5leHRaPW51bGwsdGhpcy5zdGVpbmVyPSExfWNsYXNzIGU2dHtzdGF0aWMgYXJlYSh0KXtjb25zdCBlPXQubGVuZ3RoO2xldCBuPTA7Zm9yKGxldCBpPWUtMSxyPTA7cjxlO2k9cisrKW4rPXRbaV0ueCp0W3JdLnktdFtyXS54KnRbaV0ueTtyZXR1cm4uNSpufXN0YXRpYyBpc0Nsb2NrV2lzZSh0KXtyZXR1cm4gZTZ0LmFyZWEodCk8MH1zdGF0aWMgdHJpYW5ndWxhdGVTaGFwZSh0LGUpe2NvbnN0IG49W10saT1bXSxyPVtdO242dCh0KSxpNnQobix0KTtsZXQgbz10Lmxlbmd0aDtlLmZvckVhY2gobjZ0KTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKylpLnB1c2gobyksbys9ZVt0XS5sZW5ndGgsaTZ0KG4sZVt0XSk7Y29uc3QgYT0oZnVuY3Rpb24odCxlLG49Mil7Y29uc3QgaT1lJiZlLmxlbmd0aCxyPWk/ZVswXSpuOnQubGVuZ3RoO2xldCBvPVA0dCh0LDAscixuLCEwKTtjb25zdCBhPVtdO2lmKCFvfHxvLm5leHQ9PT1vLnByZXYpcmV0dXJuIGE7bGV0IHMsbCxjLHUsaCxkLHA7aWYoaSYmKG89KGZ1bmN0aW9uIGYodCxlLG4saSl7Y29uc3Qgcj1bXTtsZXQgbyxhLHMsbCxjO2ZvcihvPTAsYT1lLmxlbmd0aDtvPGE7bysrKXM9ZVtvXSppLGw9bzxhLTE/ZVtvKzFdKmk6dC5sZW5ndGgsYz1QNHQodCxzLGwsaSwhMSksYz09PWMubmV4dCYmKGMuc3RlaW5lcj0hMCksci5wdXNoKFU0dChjKSk7Zm9yKHIuc29ydChCNHQpLG89MDtvPHIubGVuZ3RoO28rKylINHQocltvXSxuKSxuPU40dChuLG4ubmV4dCk7cmV0dXJuIG59KSh0LGUsbyxuKSksdC5sZW5ndGg+ODAqbil7cz1jPXRbMF0sbD11PXRbMV07Zm9yKGxldCBlPW47ZTxyO2UrPW4paD10W2VdLGQ9dFtlKzFdLGg8cyYmKHM9aCksZDxsJiYobD1kKSxoPmMmJihjPWgpLGQ+dSYmKHU9ZCk7cD1NYXRoLm1heChjLXMsdS1sKSxwPTAhPT1wPzEvcDowfXJldHVybiBJNHQobyxhLG4scyxsLHApLGF9KShuLGkpO2ZvcihsZXQgdD0wO3Q8YS5sZW5ndGg7dCs9MylyLnB1c2goYS5zbGljZSh0LHQrMykpO3JldHVybiByfX1mdW5jdGlvbiBuNnQodCl7Y29uc3QgZT10Lmxlbmd0aDtlPjImJnRbZS0xXS5lcXVhbHModFswXSkmJnQucG9wKCl9ZnVuY3Rpb24gaTZ0KHQsZSl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspdC5wdXNoKGVbbl0ueCksdC5wdXNoKGVbbl0ueSl9Y2xhc3MgcjZ0IGV4dGVuZHMgYjF0e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoKSx0aGlzLnR5cGU9IkV4dHJ1ZGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6dCxvcHRpb25zOmV9LHQ9QXJyYXkuaXNBcnJheSh0KT90Olt0XTtjb25zdCBuPXRoaXMsaT1bXSxyPVtdO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKylvKHRbZV0pO2Z1bmN0aW9uIG8odCl7Y29uc3Qgbz1bXSxhPXZvaWQgMCE9PWUuY3VydmVTZWdtZW50cz9lLmN1cnZlU2VnbWVudHM6MTIscz12b2lkIDAhPT1lLnN0ZXBzP2Uuc3RlcHM6MTtsZXQgbD12b2lkIDAhPT1lLmRlcHRoP2UuZGVwdGg6MTAwLGM9dm9pZCAwPT09ZS5iZXZlbEVuYWJsZWR8fGUuYmV2ZWxFbmFibGVkLHU9dm9pZCAwIT09ZS5iZXZlbFRoaWNrbmVzcz9lLmJldmVsVGhpY2tuZXNzOjYsaD12b2lkIDAhPT1lLmJldmVsU2l6ZT9lLmJldmVsU2l6ZTp1LTIsZD12b2lkIDAhPT1lLmJldmVsT2Zmc2V0P2UuYmV2ZWxPZmZzZXQ6MCxwPXZvaWQgMCE9PWUuYmV2ZWxTZWdtZW50cz9lLmJldmVsU2VnbWVudHM6Mztjb25zdCBmPWUuZXh0cnVkZVBhdGgsbT12b2lkIDAhPT1lLlVWR2VuZXJhdG9yP2UuVVZHZW5lcmF0b3I6bzZ0O3ZvaWQgMCE9PWUuYW1vdW50JiYoY29uc29sZS53YXJuKCJUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IGFtb3VudCBoYXMgYmVlbiByZW5hbWVkIHRvIGRlcHRoLiIpLGw9ZS5hbW91bnQpO2xldCBnLF8seSx2LGIseD0hMTtmJiYoZz1mLmdldFNwYWNlZFBvaW50cyhzKSx4PSEwLGM9ITEsXz1mLmNvbXB1dGVGcmVuZXRGcmFtZXMocywhMSkseT1uZXcgQ0p0LHY9bmV3IENKdCxiPW5ldyBDSnQpLGN8fChwPTAsdT0wLGg9MCxkPTApO2NvbnN0IHc9dC5leHRyYWN0UG9pbnRzKGEpO2xldCBTPXcuc2hhcGU7Y29uc3QgTT13LmhvbGVzO2lmKCFlNnQuaXNDbG9ja1dpc2UoUykpe1M9Uy5yZXZlcnNlKCk7Zm9yKGxldCB0PTAsZT1NLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPU1bdF07ZTZ0LmlzQ2xvY2tXaXNlKGUpJiYoTVt0XT1lLnJldmVyc2UoKSl9fWNvbnN0IEU9ZTZ0LnRyaWFuZ3VsYXRlU2hhcGUoUyxNKSxUPVM7Zm9yKGxldCB0PTAsZT1NLmxlbmd0aDt0PGU7dCsrKVM9Uy5jb25jYXQoTVt0XSk7ZnVuY3Rpb24gQyh0LGUsbil7cmV0dXJuIGV8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0IiksZS5jbG9uZSgpLm11bHRpcGx5U2NhbGFyKG4pLmFkZCh0KX1jb25zdCBBPVMubGVuZ3RoLGs9RS5sZW5ndGg7ZnVuY3Rpb24gTCh0LGUsbil7bGV0IGkscixvO2NvbnN0IGE9dC54LWUueCxzPXQueS1lLnksbD1uLngtdC54LGM9bi55LXQueSx1PWEqYStzKnM7aWYoTWF0aC5hYnMoYSpjLXMqbCk+TnVtYmVyLkVQU0lMT04pe2NvbnN0IGg9TWF0aC5zcXJ0KHUpLGQ9TWF0aC5zcXJ0KGwqbCtjKmMpLHA9ZS54LXMvaCxmPWUueSthL2gsbT0oKG4ueC1jL2QtcCkqYy0obi55K2wvZC1mKSpsKS8oYSpjLXMqbCk7aT1wK2EqbS10Lngscj1mK3MqbS10Lnk7Y29uc3QgZz1pKmkrcipyO2lmKGc8PTIpcmV0dXJuIG5ldyBtSnQoaSxyKTtvPU1hdGguc3FydChnLzIpfWVsc2V7bGV0IHQ9ITE7YT5OdW1iZXIuRVBTSUxPTj9sPk51bWJlci5FUFNJTE9OJiYodD0hMCk6YTwtTnVtYmVyLkVQU0lMT04/bDwtTnVtYmVyLkVQU0lMT04mJih0PSEwKTpNYXRoLnNpZ24ocyk9PT1NYXRoLnNpZ24oYykmJih0PSEwKSx0PyhpPS1zLHI9YSxvPU1hdGguc3FydCh1KSk6KGk9YSxyPXMsbz1NYXRoLnNxcnQodS8yKSl9cmV0dXJuIG5ldyBtSnQoaS9vLHIvbyl9Y29uc3QgUD1bXTtmb3IobGV0IHQ9MCxlPVQubGVuZ3RoLG49ZS0xLGk9dCsxO3Q8ZTt0KyssbisrLGkrKyluPT09ZSYmKG49MCksaT09PWUmJihpPTApLFBbdF09TChUW3RdLFRbbl0sVFtpXSk7Y29uc3QgTj1bXTtsZXQgSSxSPVAuY29uY2F0KCk7Zm9yKGxldCB0PTAsZT1NLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPU1bdF07ST1bXTtmb3IobGV0IHQ9MCxuPWUubGVuZ3RoLGk9bi0xLHI9dCsxO3Q8bjt0KyssaSsrLHIrKylpPT09biYmKGk9MCkscj09PW4mJihyPTApLElbdF09TChlW3RdLGVbaV0sZVtyXSk7Ti5wdXNoKEkpLFI9Ui5jb25jYXQoSSl9Zm9yKGxldCB0PTA7dDxwO3QrKyl7Y29uc3QgZT10L3Asbj11Kk1hdGguY29zKGUqTWF0aC5QSS8yKSxpPWgqTWF0aC5zaW4oZSpNYXRoLlBJLzIpK2Q7Zm9yKGxldCB0PTAsZT1ULmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPUMoVFt0XSxQW3RdLGkpO0QoZS54LGUueSwtbil9Zm9yKGxldCB0PTAsZT1NLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPU1bdF07ST1OW3RdO2ZvcihsZXQgdD0wLHI9ZS5sZW5ndGg7dDxyO3QrKyl7Y29uc3Qgcj1DKGVbdF0sSVt0XSxpKTtEKHIueCxyLnksLW4pfX19Y29uc3QgTz1oK2Q7Zm9yKGxldCB0PTA7dDxBO3QrKyl7Y29uc3QgZT1jP0MoU1t0XSxSW3RdLE8pOlNbdF07eD8odi5jb3B5KF8ubm9ybWFsc1swXSkubXVsdGlwbHlTY2FsYXIoZS54KSx5LmNvcHkoXy5iaW5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKGUueSksYi5jb3B5KGdbMF0pLmFkZCh2KS5hZGQoeSksRChiLngsYi55LGIueikpOkQoZS54LGUueSwwKX1mb3IobGV0IHQ9MTt0PD1zO3QrKylmb3IobGV0IGU9MDtlPEE7ZSsrKXtjb25zdCBuPWM/QyhTW2VdLFJbZV0sTyk6U1tlXTt4Pyh2LmNvcHkoXy5ub3JtYWxzW3RdKS5tdWx0aXBseVNjYWxhcihuLngpLHkuY29weShfLmJpbm9ybWFsc1t0XSkubXVsdGlwbHlTY2FsYXIobi55KSxiLmNvcHkoZ1t0XSkuYWRkKHYpLmFkZCh5KSxEKGIueCxiLnksYi56KSk6RChuLngsbi55LGwvcyp0KX1mb3IobGV0IHQ9cC0xO3Q+PTA7dC0tKXtjb25zdCBlPXQvcCxuPXUqTWF0aC5jb3MoZSpNYXRoLlBJLzIpLGk9aCpNYXRoLnNpbihlKk1hdGguUEkvMikrZDtmb3IobGV0IHQ9MCxlPVQubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9QyhUW3RdLFBbdF0saSk7RChlLngsZS55LGwrbil9Zm9yKGxldCB0PTAsZT1NLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPU1bdF07ST1OW3RdO2ZvcihsZXQgdD0wLHI9ZS5sZW5ndGg7dDxyO3QrKyl7Y29uc3Qgcj1DKGVbdF0sSVt0XSxpKTt4P0Qoci54LHIueStnW3MtMV0ueSxnW3MtMV0ueCtuKTpEKHIueCxyLnksbCtuKX19fWZ1bmN0aW9uIHoodCxlKXtsZXQgbj10Lmxlbmd0aDtmb3IoOy0tbj49MDspe2NvbnN0IGk9bjtsZXQgcj1uLTE7cjwwJiYocj10Lmxlbmd0aC0xKTtmb3IobGV0IHQ9MCxuPXMrMipwO3Q8bjt0Kyspe2NvbnN0IG49QSp0LG89QSoodCsxKTtIKGUraStuLGUrcituLGUrcitvLGUraStvKX19fWZ1bmN0aW9uIEQodCxlLG4pe28ucHVzaCh0KSxvLnB1c2goZSksby5wdXNoKG4pfWZ1bmN0aW9uIEIodCxlLHIpe0YodCksRihlKSxGKHIpO2NvbnN0IG89aS5sZW5ndGgvMyxhPW0uZ2VuZXJhdGVUb3BVVihuLGksby0zLG8tMixvLTEpO1YoYVswXSksVihhWzFdKSxWKGFbMl0pfWZ1bmN0aW9uIEgodCxlLHIsbyl7Rih0KSxGKGUpLEYobyksRihlKSxGKHIpLEYobyk7Y29uc3QgYT1pLmxlbmd0aC8zLHM9bS5nZW5lcmF0ZVNpZGVXYWxsVVYobixpLGEtNixhLTMsYS0yLGEtMSk7VihzWzBdKSxWKHNbMV0pLFYoc1szXSksVihzWzFdKSxWKHNbMl0pLFYoc1szXSl9ZnVuY3Rpb24gRih0KXtpLnB1c2gob1szKnQrMF0pLGkucHVzaChvWzMqdCsxXSksaS5wdXNoKG9bMyp0KzJdKX1mdW5jdGlvbiBWKHQpe3IucHVzaCh0LngpLHIucHVzaCh0LnkpfSEoZnVuY3Rpb24gVSgpe2NvbnN0IHQ9aS5sZW5ndGgvMztpZihjKXtsZXQgdD0wLGU9QSp0O2ZvcihsZXQgdD0wO3Q8azt0Kyspe2NvbnN0IG49RVt0XTtCKG5bMl0rZSxuWzFdK2UsblswXStlKX10PXMrMipwLGU9QSp0O2ZvcihsZXQgdD0wO3Q8azt0Kyspe2NvbnN0IG49RVt0XTtCKG5bMF0rZSxuWzFdK2UsblsyXStlKX19ZWxzZXtmb3IobGV0IHQ9MDt0PGs7dCsrKXtjb25zdCBlPUVbdF07QihlWzJdLGVbMV0sZVswXSl9Zm9yKGxldCB0PTA7dDxrO3QrKyl7Y29uc3QgZT1FW3RdO0IoZVswXStBKnMsZVsxXStBKnMsZVsyXStBKnMpfX1uLmFkZEdyb3VwKHQsaS5sZW5ndGgvMy10LDApfSkoKSwoZnVuY3Rpb24gaigpe2NvbnN0IHQ9aS5sZW5ndGgvMztsZXQgZT0wO3ooVCxlKSxlKz1ULmxlbmd0aDtmb3IobGV0IHQ9MCxuPU0ubGVuZ3RoO3Q8bjt0Kyspe2NvbnN0IG49TVt0XTt6KG4sZSksZSs9bi5sZW5ndGh9bi5hZGRHcm91cCh0LGkubGVuZ3RoLzMtdCwxKX0pKCl9dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KGksMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IGwxdChyLDIpKSx0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCl9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4oZnVuY3Rpb24gZSh0LG4saSl7aWYoaS5zaGFwZXM9W10sQXJyYXkuaXNBcnJheSh0KSlmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspaS5zaGFwZXMucHVzaCh0W2VdLnV1aWQpO2Vsc2UgaS5zaGFwZXMucHVzaCh0LnV1aWQpO3JldHVybiB2b2lkIDAhPT1uLmV4dHJ1ZGVQYXRoJiYoaS5vcHRpb25zLmV4dHJ1ZGVQYXRoPW4uZXh0cnVkZVBhdGgudG9KU09OKCkpLGl9KSh0aGlzLnBhcmFtZXRlcnMuc2hhcGVzLHRoaXMucGFyYW1ldGVycy5vcHRpb25zLHQpfXN0YXRpYyBmcm9tSlNPTih0LGUpe2NvbnN0IG49W107Zm9yKGxldCBpPTAscj10LnNoYXBlcy5sZW5ndGg7aTxyO2krKyluLnB1c2goZVt0LnNoYXBlc1tpXV0pO2NvbnN0IGk9dC5vcHRpb25zLmV4dHJ1ZGVQYXRoO3JldHVybiB2b2lkIDAhPT1pJiYodC5vcHRpb25zLmV4dHJ1ZGVQYXRoPShuZXcgTDR0W2kudHlwZV0pLmZyb21KU09OKGkpKSxuZXcgcjZ0KG4sdC5vcHRpb25zKX19Y29uc3QgbzZ0PXtnZW5lcmF0ZVRvcFVWOmZ1bmN0aW9uKHQsZSxuLGkscil7Y29uc3Qgbz1lWzMqaV0sYT1lWzMqaSsxXSxzPWVbMypyXSxsPWVbMypyKzFdO3JldHVybltuZXcgbUp0KGVbMypuXSxlWzMqbisxXSksbmV3IG1KdChvLGEpLG5ldyBtSnQocyxsKV19LGdlbmVyYXRlU2lkZVdhbGxVVjpmdW5jdGlvbih0LGUsbixpLHIsbyl7Y29uc3QgYT1lWzMqbl0scz1lWzMqbisxXSxsPWVbMypuKzJdLGM9ZVszKmldLHU9ZVszKmkrMV0saD1lWzMqaSsyXSxkPWVbMypyXSxwPWVbMypyKzFdLGY9ZVszKnIrMl0sbT1lWzMqb10sZz1lWzMqbysxXSxfPWVbMypvKzJdO3JldHVybiBNYXRoLmFicyhzLXUpPE1hdGguYWJzKGEtYyk/W25ldyBtSnQoYSwxLWwpLG5ldyBtSnQoYywxLWgpLG5ldyBtSnQoZCwxLWYpLG5ldyBtSnQobSwxLV8pXTpbbmV3IG1KdChzLDEtbCksbmV3IG1KdCh1LDEtaCksbmV3IG1KdChwLDEtZiksbmV3IG1KdChnLDEtXyldfX07Y2xhc3MgYTZ0IGV4dGVuZHMgcjR0e2NvbnN0cnVjdG9yKHQ9MSxlPTApe2NvbnN0IG49KDErTWF0aC5zcXJ0KDUpKS8yO3N1cGVyKFstMSxuLDAsMSxuLDAsLTEsLW4sMCwxLC1uLDAsMCwtMSxuLDAsMSxuLDAsLTEsLW4sMCwxLC1uLG4sMCwtMSxuLDAsMSwtbiwwLC0xLC1uLDAsMV0sWzAsMTEsNSwwLDUsMSwwLDEsNywwLDcsMTAsMCwxMCwxMSwxLDUsOSw1LDExLDQsMTEsMTAsMiwxMCw3LDYsNywxLDgsMyw5LDQsMyw0LDIsMywyLDYsMyw2LDgsMyw4LDksNCw5LDUsMiw0LDExLDYsMiwxMCw4LDYsNyw5LDgsMV0sdCxlKSx0aGlzLnR5cGU9Ikljb3NhaGVkcm9uR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOnQsZGV0YWlsOmV9fXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IGE2dCh0LnJhZGl1cyx0LmRldGFpbCl9fWNsYXNzIHM2dCBleHRlbmRzIGIxdHtjb25zdHJ1Y3Rvcih0LGU9MTIsbj0wLGk9MipNYXRoLlBJKXtzdXBlcigpLHRoaXMudHlwZT0iTGF0aGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtwb2ludHM6dCxzZWdtZW50czplLHBoaVN0YXJ0Om4scGhpTGVuZ3RoOml9LGU9TWF0aC5mbG9vcihlKSxpPSRadChpLDAsMipNYXRoLlBJKTtjb25zdCByPVtdLG89W10sYT1bXSxzPTEvZSxsPW5ldyBDSnQsYz1uZXcgbUp0O2ZvcihsZXQgcj0wO3I8PWU7cisrKXtjb25zdCB1PW4rcipzKmksaD1NYXRoLnNpbih1KSxkPU1hdGguY29zKHUpO2ZvcihsZXQgbj0wO248PXQubGVuZ3RoLTE7bisrKWwueD10W25dLngqaCxsLnk9dFtuXS55LGwuej10W25dLngqZCxvLnB1c2gobC54LGwueSxsLnopLGMueD1yL2UsYy55PW4vKHQubGVuZ3RoLTEpLGEucHVzaChjLngsYy55KX1mb3IobGV0IG49MDtuPGU7bisrKWZvcihsZXQgZT0wO2U8dC5sZW5ndGgtMTtlKyspe2NvbnN0IGk9ZStuKnQubGVuZ3RoLG89aSt0Lmxlbmd0aCxhPWkrdC5sZW5ndGgrMSxzPWkrMTtyLnB1c2goaSxvLHMpLHIucHVzaChvLGEscyl9aWYodGhpcy5zZXRJbmRleChyKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBsMXQobywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgbDF0KGEsMikpLHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKSxpPT09MipNYXRoLlBJKXtjb25zdCBuPXRoaXMuYXR0cmlidXRlcy5ub3JtYWwuYXJyYXksaT1uZXcgQ0p0LHI9bmV3IENKdCxvPW5ldyBDSnQsYT1lKnQubGVuZ3RoKjM7Zm9yKGxldCBlPTAscz0wO2U8dC5sZW5ndGg7ZSsrLHMrPTMpaS54PW5bcyswXSxpLnk9bltzKzFdLGkuej1uW3MrMl0sci54PW5bYStzKzBdLHIueT1uW2ErcysxXSxyLno9blthK3MrMl0sby5hZGRWZWN0b3JzKGkscikubm9ybWFsaXplKCksbltzKzBdPW5bYStzKzBdPW8ueCxuW3MrMV09blthK3MrMV09by55LG5bcysyXT1uW2ErcysyXT1vLnp9fXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IHM2dCh0LnBvaW50cyx0LnNlZ21lbnRzLHQucGhpU3RhcnQsdC5waGlMZW5ndGgpfX1jbGFzcyBsNnQgZXh0ZW5kcyByNHR7Y29uc3RydWN0b3IodD0xLGU9MCl7c3VwZXIoWzEsMCwwLC0xLDAsMCwwLDEsMCwwLC0xLDAsMCwwLDEsMCwwLC0xXSxbMCwyLDQsMCw0LDMsMCwzLDUsMCw1LDIsMSwyLDUsMSw1LDMsMSwzLDQsMSw0LDJdLHQsZSksdGhpcy50eXBlPSJPY3RhaGVkcm9uR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOnQsZGV0YWlsOmV9fXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IGw2dCh0LnJhZGl1cyx0LmRldGFpbCl9fWNsYXNzIGM2dCBleHRlbmRzIGIxdHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIoKSx0aGlzLnR5cGU9IlBhcmFtZXRyaWNHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtmdW5jOnQsc2xpY2VzOmUsc3RhY2tzOm59O2NvbnN0IGk9W10scj1bXSxvPVtdLGE9W10scz0xZS01LGw9bmV3IENKdCxjPW5ldyBDSnQsdT1uZXcgQ0p0LGg9bmV3IENKdCxkPW5ldyBDSnQ7dC5sZW5ndGg8MyYmY29uc29sZS5lcnJvcigiVEhSRUUuUGFyYW1ldHJpY0dlb21ldHJ5OiBGdW5jdGlvbiBtdXN0IG5vdyBtb2RpZnkgYSBWZWN0b3IzIGFzIHRoaXJkIHBhcmFtZXRlci4iKTtjb25zdCBwPWUrMTtmb3IobGV0IGk9MDtpPD1uO2krKyl7Y29uc3QgcD1pL247Zm9yKGxldCBuPTA7bjw9ZTtuKyspe2NvbnN0IGk9bi9lO3QoaSxwLGMpLHIucHVzaChjLngsYy55LGMueiksaS1zPj0wPyh0KGktcyxwLHUpLGguc3ViVmVjdG9ycyhjLHUpKToodChpK3MscCx1KSxoLnN1YlZlY3RvcnModSxjKSkscC1zPj0wPyh0KGkscC1zLHUpLGQuc3ViVmVjdG9ycyhjLHUpKToodChpLHArcyx1KSxkLnN1YlZlY3RvcnModSxjKSksbC5jcm9zc1ZlY3RvcnMoaCxkKS5ub3JtYWxpemUoKSxvLnB1c2gobC54LGwueSxsLnopLGEucHVzaChpLHApfX1mb3IobGV0IHQ9MDt0PG47dCsrKWZvcihsZXQgbj0wO248ZTtuKyspe2NvbnN0IGU9dCpwK24rMSxyPSh0KzEpKnArbisxLG89KHQrMSkqcCtuO2kucHVzaCh0KnArbixlLG8pLGkucHVzaChlLHIsbyl9dGhpcy5zZXRJbmRleChpKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBsMXQociwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGwxdChvLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBsMXQoYSwyKSl9fWNsYXNzIHU2dCBleHRlbmRzIGIxdHtjb25zdHJ1Y3Rvcih0PS41LGU9MSxuPTgsaT0xLHI9MCxvPTIqTWF0aC5QSSl7c3VwZXIoKSx0aGlzLnR5cGU9IlJpbmdHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtpbm5lclJhZGl1czp0LG91dGVyUmFkaXVzOmUsdGhldGFTZWdtZW50czpuLHBoaVNlZ21lbnRzOmksdGhldGFTdGFydDpyLHRoZXRhTGVuZ3RoOm99LG49TWF0aC5tYXgoMyxuKTtjb25zdCBhPVtdLHM9W10sbD1bXSxjPVtdO2xldCB1PXQ7Y29uc3QgaD0oZS10KS8oaT1NYXRoLm1heCgxLGkpKSxkPW5ldyBDSnQscD1uZXcgbUp0O2ZvcihsZXQgdD0wO3Q8PWk7dCsrKXtmb3IobGV0IHQ9MDt0PD1uO3QrKyl7Y29uc3QgaT1yK3QvbipvO2QueD11Kk1hdGguY29zKGkpLGQueT11Kk1hdGguc2luKGkpLHMucHVzaChkLngsZC55LGQueiksbC5wdXNoKDAsMCwxKSxwLng9KGQueC9lKzEpLzIscC55PShkLnkvZSsxKS8yLGMucHVzaChwLngscC55KX11Kz1ofWZvcihsZXQgdD0wO3Q8aTt0Kyspe2NvbnN0IGU9dCoobisxKTtmb3IobGV0IHQ9MDt0PG47dCsrKXtjb25zdCBpPXQrZSxyPWkrbisxLG89aStuKzIscz1pKzE7YS5wdXNoKGkscixzKSxhLnB1c2gocixvLHMpfX10aGlzLnNldEluZGV4KGEpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGwxdChzLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgbDF0KGwsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IGwxdChjLDIpKX1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyB1NnQodC5pbm5lclJhZGl1cyx0Lm91dGVyUmFkaXVzLHQudGhldGFTZWdtZW50cyx0LnBoaVNlZ21lbnRzLHQudGhldGFTdGFydCx0LnRoZXRhTGVuZ3RoKX19Y2xhc3MgaDZ0IGV4dGVuZHMgYjF0e2NvbnN0cnVjdG9yKHQsZT0xMil7c3VwZXIoKSx0aGlzLnR5cGU9IlNoYXBlR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17c2hhcGVzOnQsY3VydmVTZWdtZW50czplfTtjb25zdCBuPVtdLGk9W10scj1bXSxvPVtdO2xldCBhPTAscz0wO2lmKCExPT09QXJyYXkuaXNBcnJheSh0KSlsKHQpO2Vsc2UgZm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspbCh0W2VdKSx0aGlzLmFkZEdyb3VwKGEscyxlKSxhKz1zLHM9MDtmdW5jdGlvbiBsKHQpe2NvbnN0IGE9aS5sZW5ndGgvMyxsPXQuZXh0cmFjdFBvaW50cyhlKTtsZXQgYz1sLnNoYXBlO2NvbnN0IHU9bC5ob2xlczshMT09PWU2dC5pc0Nsb2NrV2lzZShjKSYmKGM9Yy5yZXZlcnNlKCkpO2ZvcihsZXQgdD0wLGU9dS5sZW5ndGg7dDxlO3QrKyl7Y29uc3QgZT11W3RdOyEwPT09ZTZ0LmlzQ2xvY2tXaXNlKGUpJiYodVt0XT1lLnJldmVyc2UoKSl9Y29uc3QgaD1lNnQudHJpYW5ndWxhdGVTaGFwZShjLHUpO2ZvcihsZXQgdD0wLGU9dS5sZW5ndGg7dDxlO3QrKyljPWMuY29uY2F0KHVbdF0pO2ZvcihsZXQgdD0wLGU9Yy5sZW5ndGg7dDxlO3QrKyl7Y29uc3QgZT1jW3RdO2kucHVzaChlLngsZS55LDApLHIucHVzaCgwLDAsMSksby5wdXNoKGUueCxlLnkpfWZvcihsZXQgdD0wLGU9aC5sZW5ndGg7dDxlO3QrKyl7Y29uc3QgZT1oW3RdO24ucHVzaChlWzBdK2EsZVsxXSthLGVbMl0rYSkscys9M319dGhpcy5zZXRJbmRleChuKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBsMXQoaSwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGwxdChyLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBsMXQobywyKSl9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4oZnVuY3Rpb24gZSh0LG4pe2lmKG4uc2hhcGVzPVtdLEFycmF5LmlzQXJyYXkodCkpZm9yKGxldCBlPTAsaT10Lmxlbmd0aDtlPGk7ZSsrKW4uc2hhcGVzLnB1c2godFtlXS51dWlkKTtlbHNlIG4uc2hhcGVzLnB1c2godC51dWlkKTtyZXR1cm4gbn0pKHRoaXMucGFyYW1ldGVycy5zaGFwZXMsdCl9c3RhdGljIGZyb21KU09OKHQsZSl7Y29uc3Qgbj1bXTtmb3IobGV0IGk9MCxyPXQuc2hhcGVzLmxlbmd0aDtpPHI7aSsrKW4ucHVzaChlW3Quc2hhcGVzW2ldXSk7cmV0dXJuIG5ldyBoNnQobix0LmN1cnZlU2VnbWVudHMpfX1jbGFzcyBkNnQgZXh0ZW5kcyBiMXR7Y29uc3RydWN0b3IodD0xLGU9MzIsbj0xNixpPTAscj0yKk1hdGguUEksbz0wLGE9TWF0aC5QSSl7c3VwZXIoKSx0aGlzLnR5cGU9IlNwaGVyZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czp0LHdpZHRoU2VnbWVudHM6ZSxoZWlnaHRTZWdtZW50czpuLHBoaVN0YXJ0OmkscGhpTGVuZ3RoOnIsdGhldGFTdGFydDpvLHRoZXRhTGVuZ3RoOmF9LGU9TWF0aC5tYXgoMyxNYXRoLmZsb29yKGUpKSxuPU1hdGgubWF4KDIsTWF0aC5mbG9vcihuKSk7Y29uc3Qgcz1NYXRoLm1pbihvK2EsTWF0aC5QSSk7bGV0IGw9MDtjb25zdCBjPVtdLHU9bmV3IENKdCxoPW5ldyBDSnQsZD1bXSxwPVtdLGY9W10sbT1bXTtmb3IobGV0IGQ9MDtkPD1uO2QrKyl7Y29uc3QgZz1bXSxfPWQvbjtsZXQgeT0wOzA9PWQmJjA9PW8/eT0uNS9lOmQ9PW4mJnM9PU1hdGguUEkmJih5PS0uNS9lKTtmb3IobGV0IG49MDtuPD1lO24rKyl7Y29uc3Qgcz1uL2U7dS54PS10Kk1hdGguY29zKGkrcypyKSpNYXRoLnNpbihvK18qYSksdS55PXQqTWF0aC5jb3MobytfKmEpLHUuej10Kk1hdGguc2luKGkrcypyKSpNYXRoLnNpbihvK18qYSkscC5wdXNoKHUueCx1LnksdS56KSxoLmNvcHkodSkubm9ybWFsaXplKCksZi5wdXNoKGgueCxoLnksaC56KSxtLnB1c2gocyt5LDEtXyksZy5wdXNoKGwrKyl9Yy5wdXNoKGcpfWZvcihsZXQgdD0wO3Q8bjt0KyspZm9yKGxldCBpPTA7aTxlO2krKyl7Y29uc3QgZT1jW3RdW2krMV0scj1jW3RdW2ldLGE9Y1t0KzFdW2ldLGw9Y1t0KzFdW2krMV07KDAhPT10fHxvPjApJiZkLnB1c2goZSxyLGwpLCh0IT09bi0xfHxzPE1hdGguUEkpJiZkLnB1c2gocixhLGwpfXRoaXMuc2V0SW5kZXgoZCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KHAsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBsMXQoZiwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgbDF0KG0sMikpfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IGQ2dCh0LnJhZGl1cyx0LndpZHRoU2VnbWVudHMsdC5oZWlnaHRTZWdtZW50cyx0LnBoaVN0YXJ0LHQucGhpTGVuZ3RoLHQudGhldGFTdGFydCx0LnRoZXRhTGVuZ3RoKX19Y2xhc3MgcDZ0IGV4dGVuZHMgcjR0e2NvbnN0cnVjdG9yKHQ9MSxlPTApe3N1cGVyKFsxLDEsMSwtMSwtMSwxLC0xLDEsLTEsMSwtMSwtMV0sWzIsMSwwLDAsMywyLDEsMywwLDIsMywxXSx0LGUpLHRoaXMudHlwZT0iVGV0cmFoZWRyb25HZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6dCxkZXRhaWw6ZX19c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgcDZ0KHQucmFkaXVzLHQuZGV0YWlsKX19Y2xhc3MgZjZ0IGV4dGVuZHMgcjZ0e2NvbnN0cnVjdG9yKHQsZT17fSl7Y29uc3Qgbj1lLmZvbnQ7aWYoIW58fCFuLmlzRm9udClyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuVGV4dEdlb21ldHJ5OiBmb250IHBhcmFtZXRlciBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuRm9udC4iKSxuZXcgYjF0O2NvbnN0IGk9bi5nZW5lcmF0ZVNoYXBlcyh0LGUuc2l6ZSk7ZS5kZXB0aD12b2lkIDAhPT1lLmhlaWdodD9lLmhlaWdodDo1MCx2b2lkIDA9PT1lLmJldmVsVGhpY2tuZXNzJiYoZS5iZXZlbFRoaWNrbmVzcz0xMCksdm9pZCAwPT09ZS5iZXZlbFNpemUmJihlLmJldmVsU2l6ZT04KSx2b2lkIDA9PT1lLmJldmVsRW5hYmxlZCYmKGUuYmV2ZWxFbmFibGVkPSExKSxzdXBlcihpLGUpLHRoaXMudHlwZT0iVGV4dEdlb21ldHJ5In19Y2xhc3MgbTZ0IGV4dGVuZHMgYjF0e2NvbnN0cnVjdG9yKHQ9MSxlPS40LG49OCxpPTYscj0yKk1hdGguUEkpe3N1cGVyKCksdGhpcy50eXBlPSJUb3J1c0dlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czp0LHR1YmU6ZSxyYWRpYWxTZWdtZW50czpuLHR1YnVsYXJTZWdtZW50czppLGFyYzpyfSxuPU1hdGguZmxvb3IobiksaT1NYXRoLmZsb29yKGkpO2NvbnN0IG89W10sYT1bXSxzPVtdLGw9W10sYz1uZXcgQ0p0LHU9bmV3IENKdCxoPW5ldyBDSnQ7Zm9yKGxldCBvPTA7bzw9bjtvKyspZm9yKGxldCBkPTA7ZDw9aTtkKyspe2NvbnN0IHA9ZC9pKnIsZj1vL24qTWF0aC5QSSoyO3UueD0odCtlKk1hdGguY29zKGYpKSpNYXRoLmNvcyhwKSx1Lnk9KHQrZSpNYXRoLmNvcyhmKSkqTWF0aC5zaW4ocCksdS56PWUqTWF0aC5zaW4oZiksYS5wdXNoKHUueCx1LnksdS56KSxjLng9dCpNYXRoLmNvcyhwKSxjLnk9dCpNYXRoLnNpbihwKSxoLnN1YlZlY3RvcnModSxjKS5ub3JtYWxpemUoKSxzLnB1c2goaC54LGgueSxoLnopLGwucHVzaChkL2kpLGwucHVzaChvL24pfWZvcihsZXQgdD0xO3Q8PW47dCsrKWZvcihsZXQgZT0xO2U8PWk7ZSsrKXtjb25zdCBuPShpKzEpKih0LTEpK2UtMSxyPShpKzEpKih0LTEpK2UsYT0oaSsxKSp0K2U7by5wdXNoKChpKzEpKnQrZS0xLG4sYSksby5wdXNoKG4scixhKX10aGlzLnNldEluZGV4KG8pLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGwxdChhLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgbDF0KHMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IGwxdChsLDIpKX1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBtNnQodC5yYWRpdXMsdC50dWJlLHQucmFkaWFsU2VnbWVudHMsdC50dWJ1bGFyU2VnbWVudHMsdC5hcmMpfX1jbGFzcyBnNnQgZXh0ZW5kcyBiMXR7Y29uc3RydWN0b3IodD0xLGU9LjQsbj02NCxpPTgscj0yLG89Myl7c3VwZXIoKSx0aGlzLnR5cGU9IlRvcnVzS25vdEdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czp0LHR1YmU6ZSx0dWJ1bGFyU2VnbWVudHM6bixyYWRpYWxTZWdtZW50czppLHA6cixxOm99LG49TWF0aC5mbG9vcihuKSxpPU1hdGguZmxvb3IoaSk7Y29uc3QgYT1bXSxzPVtdLGw9W10sYz1bXSx1PW5ldyBDSnQsaD1uZXcgQ0p0LGQ9bmV3IENKdCxwPW5ldyBDSnQsZj1uZXcgQ0p0LG09bmV3IENKdCxnPW5ldyBDSnQ7Zm9yKGxldCBhPTA7YTw9bjsrK2Epe2NvbnN0IHk9YS9uKnIqTWF0aC5QSSoyO18oeSxyLG8sdCxkKSxfKHkrLjAxLHIsbyx0LHApLG0uc3ViVmVjdG9ycyhwLGQpLGcuYWRkVmVjdG9ycyhwLGQpLGYuY3Jvc3NWZWN0b3JzKG0sZyksZy5jcm9zc1ZlY3RvcnMoZixtKSxmLm5vcm1hbGl6ZSgpLGcubm9ybWFsaXplKCk7Zm9yKGxldCB0PTA7dDw9aTsrK3Qpe2NvbnN0IHI9dC9pKk1hdGguUEkqMixvPS1lKk1hdGguY29zKHIpLHA9ZSpNYXRoLnNpbihyKTt1Lng9ZC54KyhvKmcueCtwKmYueCksdS55PWQueSsobypnLnkrcCpmLnkpLHUuej1kLnorKG8qZy56K3AqZi56KSxzLnB1c2godS54LHUueSx1LnopLGguc3ViVmVjdG9ycyh1LGQpLm5vcm1hbGl6ZSgpLGwucHVzaChoLngsaC55LGgueiksYy5wdXNoKGEvbiksYy5wdXNoKHQvaSl9fWZvcihsZXQgdD0xO3Q8PW47dCsrKWZvcihsZXQgZT0xO2U8PWk7ZSsrKXtjb25zdCBuPShpKzEpKnQrKGUtMSkscj0oaSsxKSp0K2Usbz0oaSsxKSoodC0xKStlO2EucHVzaCgoaSsxKSoodC0xKSsoZS0xKSxuLG8pLGEucHVzaChuLHIsbyl9ZnVuY3Rpb24gXyh0LGUsbixpLHIpe2NvbnN0IG89TWF0aC5jb3ModCksYT1NYXRoLnNpbih0KSxzPW4vZSp0LGw9TWF0aC5jb3Mocyk7ci54PWkqKDIrbCkqLjUqbyxyLnk9aSooMitsKSphKi41LHIuej1pKk1hdGguc2luKHMpKi41fXRoaXMuc2V0SW5kZXgoYSksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KHMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBsMXQobCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgbDF0KGMsMikpfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IGc2dCh0LnJhZGl1cyx0LnR1YmUsdC50dWJ1bGFyU2VnbWVudHMsdC5yYWRpYWxTZWdtZW50cyx0LnAsdC5xKX19Y2xhc3MgXzZ0IGV4dGVuZHMgYjF0e2NvbnN0cnVjdG9yKHQsZT02NCxuPTEsaT04LHI9ITEpe3N1cGVyKCksdGhpcy50eXBlPSJUdWJlR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cGF0aDp0LHR1YnVsYXJTZWdtZW50czplLHJhZGl1czpuLHJhZGlhbFNlZ21lbnRzOmksY2xvc2VkOnJ9O2NvbnN0IG89dC5jb21wdXRlRnJlbmV0RnJhbWVzKGUscik7dGhpcy50YW5nZW50cz1vLnRhbmdlbnRzLHRoaXMubm9ybWFscz1vLm5vcm1hbHMsdGhpcy5iaW5vcm1hbHM9by5iaW5vcm1hbHM7Y29uc3QgYT1uZXcgQ0p0LHM9bmV3IENKdCxsPW5ldyBtSnQ7bGV0IGM9bmV3IENKdDtjb25zdCB1PVtdLGg9W10sZD1bXSxwPVtdO2Z1bmN0aW9uIGYocil7Yz10LmdldFBvaW50QXQoci9lLGMpO2NvbnN0IGw9by5ub3JtYWxzW3JdLGQ9by5iaW5vcm1hbHNbcl07Zm9yKGxldCB0PTA7dDw9aTt0Kyspe2NvbnN0IGU9dC9pKk1hdGguUEkqMixyPU1hdGguc2luKGUpLG89LU1hdGguY29zKGUpO3MueD1vKmwueCtyKmQueCxzLnk9bypsLnkrcipkLnkscy56PW8qbC56K3IqZC56LHMubm9ybWFsaXplKCksaC5wdXNoKHMueCxzLnkscy56KSxhLng9Yy54K24qcy54LGEueT1jLnkrbipzLnksYS56PWMueituKnMueix1LnB1c2goYS54LGEueSxhLnopfX0hKGZ1bmN0aW9uIG0oKXtmb3IobGV0IHQ9MDt0PGU7dCsrKWYodCk7ZighMT09PXI/ZTowKSwoZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8PWU7dCsrKWZvcihsZXQgbj0wO248PWk7bisrKWwueD10L2UsbC55PW4vaSxkLnB1c2gobC54LGwueSl9KSgpLChmdW5jdGlvbiBuKCl7Zm9yKGxldCB0PTE7dDw9ZTt0KyspZm9yKGxldCBlPTE7ZTw9aTtlKyspe2NvbnN0IG49KGkrMSkqdCsoZS0xKSxyPShpKzEpKnQrZSxvPShpKzEpKih0LTEpK2U7cC5wdXNoKChpKzEpKih0LTEpKyhlLTEpLG4sbykscC5wdXNoKG4scixvKX19KSgpfSkoKSx0aGlzLnNldEluZGV4KHApLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGwxdCh1LDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgbDF0KGgsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IGwxdChkLDIpKX10b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnBhdGg9dGhpcy5wYXJhbWV0ZXJzLnBhdGgudG9KU09OKCksdH1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBfNnQoKG5ldyBMNHRbdC5wYXRoLnR5cGVdKS5mcm9tSlNPTih0LnBhdGgpLHQudHVidWxhclNlZ21lbnRzLHQucmFkaXVzLHQucmFkaWFsU2VnbWVudHMsdC5jbG9zZWQpfX1jbGFzcyB5NnQgZXh0ZW5kcyBiMXR7Y29uc3RydWN0b3IodCl7aWYoc3VwZXIoKSx0aGlzLnR5cGU9IldpcmVmcmFtZUdlb21ldHJ5IiwhMD09PXQuaXNHZW9tZXRyeSlyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5XaXJlZnJhbWVHZW9tZXRyeSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpO2NvbnN0IGU9W10sbj1uZXcgU2V0LGk9bmV3IENKdCxyPW5ldyBDSnQ7aWYobnVsbCE9PXQuaW5kZXgpe2NvbnN0IG89dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLGE9dC5pbmRleDtsZXQgcz10Lmdyb3VwczswPT09cy5sZW5ndGgmJihzPVt7c3RhcnQ6MCxjb3VudDphLmNvdW50LG1hdGVyaWFsSW5kZXg6MH1dKTtmb3IobGV0IHQ9MCxsPXMubGVuZ3RoO3Q8bDsrK3Qpe2NvbnN0IGw9c1t0XSxjPWwuc3RhcnQ7Zm9yKGxldCB0PWMscz1jK2wuY291bnQ7dDxzO3QrPTMpZm9yKGxldCBzPTA7czwzO3MrKyl7Y29uc3QgbD1hLmdldFgodCtzKSxjPWEuZ2V0WCh0KyhzKzEpJTMpO2kuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLGwpLHIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLGMpLCEwPT09djZ0KGkscixuKSYmKGUucHVzaChpLngsaS55LGkueiksZS5wdXNoKHIueCxyLnksci56KSl9fX1lbHNle2NvbnN0IG89dC5hdHRyaWJ1dGVzLnBvc2l0aW9uO2ZvcihsZXQgdD0wLGE9by5jb3VudC8zO3Q8YTt0KyspZm9yKGxldCBhPTA7YTwzO2ErKyl7Y29uc3Qgcz0zKnQrKGErMSklMztpLmZyb21CdWZmZXJBdHRyaWJ1dGUobywzKnQrYSksci5mcm9tQnVmZmVyQXR0cmlidXRlKG8scyksITA9PT12NnQoaSxyLG4pJiYoZS5wdXNoKGkueCxpLnksaS56KSxlLnB1c2goci54LHIueSxyLnopKX19dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KGUsMykpfX1mdW5jdGlvbiB2NnQodCxlLG4pe2NvbnN0IGk9YCR7dC54fSwke3QueX0sJHt0Lnp9LSR7ZS54fSwke2UueX0sJHtlLnp9YCxyPWAke2UueH0sJHtlLnl9LCR7ZS56fS0ke3QueH0sJHt0Lnl9LCR7dC56fWA7cmV0dXJuITAhPT1uLmhhcyhpKSYmITAhPT1uLmhhcyhyKSYmKG4uYWRkKGksciksITApfXZhciBiNnQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQm94R2VvbWV0cnk6RjF0LEJveEJ1ZmZlckdlb21ldHJ5OkYxdCxDaXJjbGVHZW9tZXRyeTplNHQsQ2lyY2xlQnVmZmVyR2VvbWV0cnk6ZTR0LENvbmVHZW9tZXRyeTppNHQsQ29uZUJ1ZmZlckdlb21ldHJ5Omk0dCxDeWxpbmRlckdlb21ldHJ5Om40dCxDeWxpbmRlckJ1ZmZlckdlb21ldHJ5Om40dCxEb2RlY2FoZWRyb25HZW9tZXRyeTpvNHQsRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnk6bzR0LEVkZ2VzR2VvbWV0cnk6dTR0LEV4dHJ1ZGVHZW9tZXRyeTpyNnQsRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OnI2dCxJY29zYWhlZHJvbkdlb21ldHJ5OmE2dCxJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OmE2dCxMYXRoZUdlb21ldHJ5OnM2dCxMYXRoZUJ1ZmZlckdlb21ldHJ5OnM2dCxPY3RhaGVkcm9uR2VvbWV0cnk6bDZ0LE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeTpsNnQsUGFyYW1ldHJpY0dlb21ldHJ5OmM2dCxQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnk6YzZ0LFBsYW5lR2VvbWV0cnk6YTB0LFBsYW5lQnVmZmVyR2VvbWV0cnk6YTB0LFBvbHloZWRyb25HZW9tZXRyeTpyNHQsUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5OnI0dCxSaW5nR2VvbWV0cnk6dTZ0LFJpbmdCdWZmZXJHZW9tZXRyeTp1NnQsU2hhcGVHZW9tZXRyeTpoNnQsU2hhcGVCdWZmZXJHZW9tZXRyeTpoNnQsU3BoZXJlR2VvbWV0cnk6ZDZ0LFNwaGVyZUJ1ZmZlckdlb21ldHJ5OmQ2dCxUZXRyYWhlZHJvbkdlb21ldHJ5OnA2dCxUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OnA2dCxUZXh0R2VvbWV0cnk6ZjZ0LFRleHRCdWZmZXJHZW9tZXRyeTpmNnQsVG9ydXNHZW9tZXRyeTptNnQsVG9ydXNCdWZmZXJHZW9tZXRyeTptNnQsVG9ydXNLbm90R2VvbWV0cnk6ZzZ0LFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5Omc2dCxUdWJlR2VvbWV0cnk6XzZ0LFR1YmVCdWZmZXJHZW9tZXRyeTpfNnQsV2lyZWZyYW1lR2VvbWV0cnk6eTZ0fSk7Y2xhc3MgeDZ0IGV4dGVuZHMgVVF0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy50eXBlPSJTaGFkb3dNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgJFF0KDApLHRoaXMudHJhbnNwYXJlbnQ9ITAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpc319eDZ0LnByb3RvdHlwZS5pc1NoYWRvd01hdGVyaWFsPSEwO2NsYXNzIHc2dCBleHRlbmRzIFVRdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuZGVmaW5lcz17U1RBTkRBUkQ6IiJ9LHRoaXMudHlwZT0iTWVzaFN0YW5kYXJkTWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3ICRRdCgxNjc3NzIxNSksdGhpcy5yb3VnaG5lc3M9MSx0aGlzLm1ldGFsbmVzcz0wLHRoaXMubWFwPW51bGwsdGhpcy5saWdodE1hcD1udWxsLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9MSx0aGlzLmFvTWFwPW51bGwsdGhpcy5hb01hcEludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmU9bmV3ICRRdCgwKSx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZU1hcD1udWxsLHRoaXMuYnVtcE1hcD1udWxsLHRoaXMuYnVtcFNjYWxlPTEsdGhpcy5ub3JtYWxNYXA9bnVsbCx0aGlzLm5vcm1hbE1hcFR5cGU9MCx0aGlzLm5vcm1hbFNjYWxlPW5ldyBtSnQoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLnJvdWdobmVzc01hcD1udWxsLHRoaXMubWV0YWxuZXNzTWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZW52TWFwPW51bGwsdGhpcy5lbnZNYXBJbnRlbnNpdHk9MSx0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTgsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIix0aGlzLndpcmVmcmFtZUxpbmVqb2luPSJyb3VuZCIsdGhpcy5mbGF0U2hhZGluZz0hMSx0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuZGVmaW5lcz17U1RBTkRBUkQ6IiJ9LHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSx0aGlzLnJvdWdobmVzcz10LnJvdWdobmVzcyx0aGlzLm1ldGFsbmVzcz10Lm1ldGFsbmVzcyx0aGlzLm1hcD10Lm1hcCx0aGlzLmxpZ2h0TWFwPXQubGlnaHRNYXAsdGhpcy5saWdodE1hcEludGVuc2l0eT10LmxpZ2h0TWFwSW50ZW5zaXR5LHRoaXMuYW9NYXA9dC5hb01hcCx0aGlzLmFvTWFwSW50ZW5zaXR5PXQuYW9NYXBJbnRlbnNpdHksdGhpcy5lbWlzc2l2ZS5jb3B5KHQuZW1pc3NpdmUpLHRoaXMuZW1pc3NpdmVNYXA9dC5lbWlzc2l2ZU1hcCx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PXQuZW1pc3NpdmVJbnRlbnNpdHksdGhpcy5idW1wTWFwPXQuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT10LmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD10Lm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9dC5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weSh0Lm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD10LmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPXQuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPXQuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLnJvdWdobmVzc01hcD10LnJvdWdobmVzc01hcCx0aGlzLm1ldGFsbmVzc01hcD10Lm1ldGFsbmVzc01hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5lbnZNYXA9dC5lbnZNYXAsdGhpcy5lbnZNYXBJbnRlbnNpdHk9dC5lbnZNYXBJbnRlbnNpdHksdGhpcy5yZWZyYWN0aW9uUmF0aW89dC5yZWZyYWN0aW9uUmF0aW8sdGhpcy53aXJlZnJhbWU9dC53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy53aXJlZnJhbWVMaW5lY2FwPXQud2lyZWZyYW1lTGluZWNhcCx0aGlzLndpcmVmcmFtZUxpbmVqb2luPXQud2lyZWZyYW1lTGluZWpvaW4sdGhpcy5mbGF0U2hhZGluZz10LmZsYXRTaGFkaW5nLHRoaXN9fXc2dC5wcm90b3R5cGUuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD0hMDtjbGFzcyBTNnQgZXh0ZW5kcyB3NnR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIiLFBIWVNJQ0FMOiIifSx0aGlzLnR5cGU9Ik1lc2hQaHlzaWNhbE1hdGVyaWFsIix0aGlzLmNsZWFyY29hdD0wLHRoaXMuY2xlYXJjb2F0TWFwPW51bGwsdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3M9MCx0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcD1udWxsLHRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGU9bmV3IG1KdCgxLDEpLHRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwPW51bGwsdGhpcy5yZWZsZWN0aXZpdHk9LjUsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlvciIse2dldDpmdW5jdGlvbigpe3JldHVybigxKy40KnRoaXMucmVmbGVjdGl2aXR5KS8oMS0uNCp0aGlzLnJlZmxlY3Rpdml0eSl9LHNldDpmdW5jdGlvbih0KXt0aGlzLnJlZmxlY3Rpdml0eT0kWnQoMi41Kih0LTEpLyh0KzEpLDAsMSl9fSksdGhpcy5zaGVlbj1udWxsLHRoaXMudHJhbnNtaXNzaW9uPTAsdGhpcy50cmFuc21pc3Npb25NYXA9bnVsbCx0aGlzLnRoaWNrbmVzcz0uMDEsdGhpcy50aGlja25lc3NNYXA9bnVsbCx0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2U9MCx0aGlzLmF0dGVudWF0aW9uVGludD1uZXcgJFF0KDEsMSwxKSx0aGlzLnNwZWN1bGFySW50ZW5zaXR5PTEsdGhpcy5zcGVjdWxhckludGVuc2l0eU1hcD1udWxsLHRoaXMuc3BlY3VsYXJUaW50PW5ldyAkUXQoMSwxLDEpLHRoaXMuc3BlY3VsYXJUaW50TWFwPW51bGwsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIiLFBIWVNJQ0FMOiIifSx0aGlzLmNsZWFyY29hdD10LmNsZWFyY29hdCx0aGlzLmNsZWFyY29hdE1hcD10LmNsZWFyY29hdE1hcCx0aGlzLmNsZWFyY29hdFJvdWdobmVzcz10LmNsZWFyY29hdFJvdWdobmVzcyx0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcD10LmNsZWFyY29hdFJvdWdobmVzc01hcCx0aGlzLmNsZWFyY29hdE5vcm1hbE1hcD10LmNsZWFyY29hdE5vcm1hbE1hcCx0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLmNvcHkodC5jbGVhcmNvYXROb3JtYWxTY2FsZSksdGhpcy5yZWZsZWN0aXZpdHk9dC5yZWZsZWN0aXZpdHksdGhpcy5zaGVlbj10LnNoZWVuPyh0aGlzLnNoZWVufHxuZXcgJFF0KS5jb3B5KHQuc2hlZW4pOm51bGwsdGhpcy50cmFuc21pc3Npb249dC50cmFuc21pc3Npb24sdGhpcy50cmFuc21pc3Npb25NYXA9dC50cmFuc21pc3Npb25NYXAsdGhpcy50aGlja25lc3M9dC50aGlja25lc3MsdGhpcy50aGlja25lc3NNYXA9dC50aGlja25lc3NNYXAsdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlPXQuYXR0ZW51YXRpb25EaXN0YW5jZSx0aGlzLmF0dGVudWF0aW9uVGludC5jb3B5KHQuYXR0ZW51YXRpb25UaW50KSx0aGlzLnNwZWN1bGFySW50ZW5zaXR5PXQuc3BlY3VsYXJJbnRlbnNpdHksdGhpcy5zcGVjdWxhckludGVuc2l0eU1hcD10LnNwZWN1bGFySW50ZW5zaXR5TWFwLHRoaXMuc3BlY3VsYXJUaW50LmNvcHkodC5zcGVjdWxhclRpbnQpLHRoaXMuc3BlY3VsYXJUaW50TWFwPXQuc3BlY3VsYXJUaW50TWFwLHRoaXN9fVM2dC5wcm90b3R5cGUuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbD0hMDtjbGFzcyBNNnQgZXh0ZW5kcyBVUXR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9Ik1lc2hQaG9uZ01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyAkUXQoMTY3NzcyMTUpLHRoaXMuc3BlY3VsYXI9bmV3ICRRdCgxMTE4NDgxKSx0aGlzLnNoaW5pbmVzcz0zMCx0aGlzLm1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlPW5ldyAkUXQoMCksdGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmVNYXA9bnVsbCx0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPTAsdGhpcy5ub3JtYWxTY2FsZT1uZXcgbUp0KDEsMSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy5zcGVjdWxhck1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmVudk1hcD1udWxsLHRoaXMuY29tYmluZT0wLHRoaXMucmVmbGVjdGl2aXR5PTEsdGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4LHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuZmxhdFNoYWRpbmc9ITEsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5zcGVjdWxhci5jb3B5KHQuc3BlY3VsYXIpLHRoaXMuc2hpbmluZXNzPXQuc2hpbmluZXNzLHRoaXMubWFwPXQubWFwLHRoaXMubGlnaHRNYXA9dC5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD10LmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSx0aGlzLmVtaXNzaXZlLmNvcHkodC5lbWlzc2l2ZSksdGhpcy5lbWlzc2l2ZU1hcD10LmVtaXNzaXZlTWFwLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9dC5lbWlzc2l2ZUludGVuc2l0eSx0aGlzLmJ1bXBNYXA9dC5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPXQuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPXQubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMuc3BlY3VsYXJNYXA9dC5zcGVjdWxhck1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5lbnZNYXA9dC5lbnZNYXAsdGhpcy5jb21iaW5lPXQuY29tYmluZSx0aGlzLnJlZmxlY3Rpdml0eT10LnJlZmxlY3Rpdml0eSx0aGlzLnJlZnJhY3Rpb25SYXRpbz10LnJlZnJhY3Rpb25SYXRpbyx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbix0aGlzLmZsYXRTaGFkaW5nPXQuZmxhdFNoYWRpbmcsdGhpc319TTZ0LnByb3RvdHlwZS5pc01lc2hQaG9uZ01hdGVyaWFsPSEwO2NsYXNzIEU2dCBleHRlbmRzIFVRdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuZGVmaW5lcz17VE9PTjoiIn0sdGhpcy50eXBlPSJNZXNoVG9vbk1hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyAkUXQoMTY3NzcyMTUpLHRoaXMubWFwPW51bGwsdGhpcy5ncmFkaWVudE1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlPW5ldyAkUXQoMCksdGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmVNYXA9bnVsbCx0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPTAsdGhpcy5ub3JtYWxTY2FsZT1uZXcgbUp0KDEsMSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubWFwPXQubWFwLHRoaXMuZ3JhZGllbnRNYXA9dC5ncmFkaWVudE1hcCx0aGlzLmxpZ2h0TWFwPXQubGlnaHRNYXAsdGhpcy5saWdodE1hcEludGVuc2l0eT10LmxpZ2h0TWFwSW50ZW5zaXR5LHRoaXMuYW9NYXA9dC5hb01hcCx0aGlzLmFvTWFwSW50ZW5zaXR5PXQuYW9NYXBJbnRlbnNpdHksdGhpcy5lbWlzc2l2ZS5jb3B5KHQuZW1pc3NpdmUpLHRoaXMuZW1pc3NpdmVNYXA9dC5lbWlzc2l2ZU1hcCx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PXQuZW1pc3NpdmVJbnRlbnNpdHksdGhpcy5idW1wTWFwPXQuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT10LmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD10Lm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9dC5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weSh0Lm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD10LmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPXQuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPXQuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy53aXJlZnJhbWU9dC53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy53aXJlZnJhbWVMaW5lY2FwPXQud2lyZWZyYW1lTGluZWNhcCx0aGlzLndpcmVmcmFtZUxpbmVqb2luPXQud2lyZWZyYW1lTGluZWpvaW4sdGhpc319RTZ0LnByb3RvdHlwZS5pc01lc2hUb29uTWF0ZXJpYWw9ITA7Y2xhc3MgVDZ0IGV4dGVuZHMgVVF0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy50eXBlPSJNZXNoTm9ybWFsTWF0ZXJpYWwiLHRoaXMuYnVtcE1hcD1udWxsLHRoaXMuYnVtcFNjYWxlPTEsdGhpcy5ub3JtYWxNYXA9bnVsbCx0aGlzLm5vcm1hbE1hcFR5cGU9MCx0aGlzLm5vcm1hbFNjYWxlPW5ldyBtSnQoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMuZm9nPSExLHRoaXMuZmxhdFNoYWRpbmc9ITEsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmJ1bXBNYXA9dC5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPXQuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPXQubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMud2lyZWZyYW1lPXQud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoLHRoaXMuZmxhdFNoYWRpbmc9dC5mbGF0U2hhZGluZyx0aGlzfX1UNnQucHJvdG90eXBlLmlzTWVzaE5vcm1hbE1hdGVyaWFsPSEwO2NsYXNzIEM2dCBleHRlbmRzIFVRdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iTWVzaExhbWJlcnRNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgJFF0KDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlPW5ldyAkUXQoMCksdGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmVNYXA9bnVsbCx0aGlzLnNwZWN1bGFyTWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZW52TWFwPW51bGwsdGhpcy5jb21iaW5lPTAsdGhpcy5yZWZsZWN0aXZpdHk9MSx0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTgsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIix0aGlzLndpcmVmcmFtZUxpbmVqb2luPSJyb3VuZCIsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXA9dC5tYXAsdGhpcy5saWdodE1hcD10LmxpZ2h0TWFwLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9dC5saWdodE1hcEludGVuc2l0eSx0aGlzLmFvTWFwPXQuYW9NYXAsdGhpcy5hb01hcEludGVuc2l0eT10LmFvTWFwSW50ZW5zaXR5LHRoaXMuZW1pc3NpdmUuY29weSh0LmVtaXNzaXZlKSx0aGlzLmVtaXNzaXZlTWFwPXQuZW1pc3NpdmVNYXAsdGhpcy5lbWlzc2l2ZUludGVuc2l0eT10LmVtaXNzaXZlSW50ZW5zaXR5LHRoaXMuc3BlY3VsYXJNYXA9dC5zcGVjdWxhck1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5lbnZNYXA9dC5lbnZNYXAsdGhpcy5jb21iaW5lPXQuY29tYmluZSx0aGlzLnJlZmxlY3Rpdml0eT10LnJlZmxlY3Rpdml0eSx0aGlzLnJlZnJhY3Rpb25SYXRpbz10LnJlZnJhY3Rpb25SYXRpbyx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbix0aGlzfX1DNnQucHJvdG90eXBlLmlzTWVzaExhbWJlcnRNYXRlcmlhbD0hMDtjbGFzcyBBNnQgZXh0ZW5kcyBVUXR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmRlZmluZXM9e01BVENBUDoiIn0sdGhpcy50eXBlPSJNZXNoTWF0Y2FwTWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3ICRRdCgxNjc3NzIxNSksdGhpcy5tYXRjYXA9bnVsbCx0aGlzLm1hcD1udWxsLHRoaXMuYnVtcE1hcD1udWxsLHRoaXMuYnVtcFNjYWxlPTEsdGhpcy5ub3JtYWxNYXA9bnVsbCx0aGlzLm5vcm1hbE1hcFR5cGU9MCx0aGlzLm5vcm1hbFNjYWxlPW5ldyBtSnQoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5mbGF0U2hhZGluZz0hMSx0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuZGVmaW5lcz17TUFUQ0FQOiIifSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXRjYXA9dC5tYXRjYXAsdGhpcy5tYXA9dC5tYXAsdGhpcy5idW1wTWFwPXQuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT10LmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD10Lm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9dC5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weSh0Lm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD10LmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPXQuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPXQuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5mbGF0U2hhZGluZz10LmZsYXRTaGFkaW5nLHRoaXN9fUE2dC5wcm90b3R5cGUuaXNNZXNoTWF0Y2FwTWF0ZXJpYWw9ITA7Y2xhc3MgazZ0IGV4dGVuZHMgSTN0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy50eXBlPSJMaW5lRGFzaGVkTWF0ZXJpYWwiLHRoaXMuc2NhbGU9MSx0aGlzLmRhc2hTaXplPTMsdGhpcy5nYXBTaXplPTEsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnNjYWxlPXQuc2NhbGUsdGhpcy5kYXNoU2l6ZT10LmRhc2hTaXplLHRoaXMuZ2FwU2l6ZT10LmdhcFNpemUsdGhpc319azZ0LnByb3RvdHlwZS5pc0xpbmVEYXNoZWRNYXRlcmlhbD0hMDt2YXIgTDZ0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLFNoYWRvd01hdGVyaWFsOng2dCxTcHJpdGVNYXRlcmlhbDpKNXQsUmF3U2hhZGVyTWF0ZXJpYWw6XzB0LFNoYWRlck1hdGVyaWFsOkcxdCxQb2ludHNNYXRlcmlhbDpHM3QsTWVzaFBoeXNpY2FsTWF0ZXJpYWw6UzZ0LE1lc2hTdGFuZGFyZE1hdGVyaWFsOnc2dCxNZXNoUGhvbmdNYXRlcmlhbDpNNnQsTWVzaFRvb25NYXRlcmlhbDpFNnQsTWVzaE5vcm1hbE1hdGVyaWFsOlQ2dCxNZXNoTGFtYmVydE1hdGVyaWFsOkM2dCxNZXNoRGVwdGhNYXRlcmlhbDpONXQsTWVzaERpc3RhbmNlTWF0ZXJpYWw6STV0LE1lc2hCYXNpY01hdGVyaWFsOktRdCxNZXNoTWF0Y2FwTWF0ZXJpYWw6QTZ0LExpbmVEYXNoZWRNYXRlcmlhbDprNnQsTGluZUJhc2ljTWF0ZXJpYWw6STN0LE1hdGVyaWFsOlVRdH0pO2NvbnN0IFA2dD17YXJyYXlTbGljZTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIFA2dC5pc1R5cGVkQXJyYXkodCk/bmV3IHQuY29uc3RydWN0b3IodC5zdWJhcnJheShlLHZvaWQgMCE9PW4/bjp0Lmxlbmd0aCkpOnQuc2xpY2UoZSxuKX0sY29udmVydEFycmF5OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4hdHx8IW4mJnQuY29uc3RydWN0b3I9PT1lP3Q6Im51bWJlciI9PXR5cGVvZiBlLkJZVEVTX1BFUl9FTEVNRU5UP25ldyBlKHQpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQpfSxpc1R5cGVkQXJyYXk6ZnVuY3Rpb24odCl7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyh0KSYmISh0IGluc3RhbmNlb2YgRGF0YVZpZXcpfSxnZXRLZXlmcmFtZU9yZGVyOmZ1bmN0aW9uKHQpe2NvbnN0IGU9dC5sZW5ndGgsbj1uZXcgQXJyYXkoZSk7Zm9yKGxldCB0PTA7dCE9PWU7Kyt0KW5bdF09dDtyZXR1cm4gbi5zb3J0KChmdW5jdGlvbiBpKGUsbil7cmV0dXJuIHRbZV0tdFtuXX0pKSxufSxzb3J0ZWRBcnJheTpmdW5jdGlvbih0LGUsbil7Y29uc3QgaT10Lmxlbmd0aCxyPW5ldyB0LmNvbnN0cnVjdG9yKGkpO2ZvcihsZXQgbz0wLGE9MDthIT09aTsrK28pe2NvbnN0IGk9bltvXSplO2ZvcihsZXQgbj0wO24hPT1lOysrbilyW2ErK109dFtpK25dfXJldHVybiByfSxmbGF0dGVuSlNPTjpmdW5jdGlvbih0LGUsbixpKXtsZXQgcj0xLG89dFswXTtmb3IoO3ZvaWQgMCE9PW8mJnZvaWQgMD09PW9baV07KW89dFtyKytdO2lmKHZvaWQgMD09PW8pcmV0dXJuO2xldCBhPW9baV07aWYodm9pZCAwIT09YSlpZihBcnJheS5pc0FycmF5KGEpKWRve2E9b1tpXSx2b2lkIDAhPT1hJiYoZS5wdXNoKG8udGltZSksbi5wdXNoLmFwcGx5KG4sYSkpLG89dFtyKytdfXdoaWxlKHZvaWQgMCE9PW8pO2Vsc2UgaWYodm9pZCAwIT09YS50b0FycmF5KWRve2E9b1tpXSx2b2lkIDAhPT1hJiYoZS5wdXNoKG8udGltZSksYS50b0FycmF5KG4sbi5sZW5ndGgpKSxvPXRbcisrXX13aGlsZSh2b2lkIDAhPT1vKTtlbHNlIGRve2E9b1tpXSx2b2lkIDAhPT1hJiYoZS5wdXNoKG8udGltZSksbi5wdXNoKGEpKSxvPXRbcisrXX13aGlsZSh2b2lkIDAhPT1vKX0sc3ViY2xpcDpmdW5jdGlvbih0LGUsbixpLHI9MzApe2NvbnN0IG89dC5jbG9uZSgpO28ubmFtZT1lO2NvbnN0IGE9W107Zm9yKGxldCB0PTA7dDxvLnRyYWNrcy5sZW5ndGg7Kyt0KXtjb25zdCBlPW8udHJhY2tzW3RdLHM9ZS5nZXRWYWx1ZVNpemUoKSxsPVtdLGM9W107Zm9yKGxldCB0PTA7dDxlLnRpbWVzLmxlbmd0aDsrK3Qpe2NvbnN0IG89ZS50aW1lc1t0XSpyO2lmKCEobzxufHxvPj1pKSl7bC5wdXNoKGUudGltZXNbdF0pO2ZvcihsZXQgbj0wO248czsrK24pYy5wdXNoKGUudmFsdWVzW3QqcytuXSl9fTAhPT1sLmxlbmd0aCYmKGUudGltZXM9UDZ0LmNvbnZlcnRBcnJheShsLGUudGltZXMuY29uc3RydWN0b3IpLGUudmFsdWVzPVA2dC5jb252ZXJ0QXJyYXkoYyxlLnZhbHVlcy5jb25zdHJ1Y3RvciksYS5wdXNoKGUpKX1vLnRyYWNrcz1hO2xldCBzPTEvMDtmb3IobGV0IHQ9MDt0PG8udHJhY2tzLmxlbmd0aDsrK3Qpcz5vLnRyYWNrc1t0XS50aW1lc1swXSYmKHM9by50cmFja3NbdF0udGltZXNbMF0pO2ZvcihsZXQgdD0wO3Q8by50cmFja3MubGVuZ3RoOysrdClvLnRyYWNrc1t0XS5zaGlmdCgtMSpzKTtyZXR1cm4gby5yZXNldER1cmF0aW9uKCksb30sbWFrZUNsaXBBZGRpdGl2ZTpmdW5jdGlvbih0LGU9MCxuPXQsaT0zMCl7aTw9MCYmKGk9MzApO2NvbnN0IHI9bi50cmFja3MubGVuZ3RoLG89ZS9pO2ZvcihsZXQgZT0wO2U8cjsrK2Upe2NvbnN0IGk9bi50cmFja3NbZV0scj1pLlZhbHVlVHlwZU5hbWU7aWYoImJvb2wiPT09cnx8InN0cmluZyI9PT1yKWNvbnRpbnVlO2NvbnN0IGE9dC50cmFja3MuZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuIHQubmFtZT09PWkubmFtZSYmdC5WYWx1ZVR5cGVOYW1lPT09cn0pKTtpZih2b2lkIDA9PT1hKWNvbnRpbnVlO2xldCBzPTA7Y29uc3QgbD1pLmdldFZhbHVlU2l6ZSgpO2kuY3JlYXRlSW50ZXJwb2xhbnQuaXNJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RHTFRGQ3ViaWNTcGxpbmUmJihzPWwvMyk7bGV0IGM9MDtjb25zdCB1PWEuZ2V0VmFsdWVTaXplKCk7YS5jcmVhdGVJbnRlcnBvbGFudC5pc0ludGVycG9sYW50RmFjdG9yeU1ldGhvZEdMVEZDdWJpY1NwbGluZSYmKGM9dS8zKTtjb25zdCBoPWkudGltZXMubGVuZ3RoLTE7bGV0IGQ7aWYobzw9aS50aW1lc1swXSlkPVA2dC5hcnJheVNsaWNlKGkudmFsdWVzLHMsbC1zKTtlbHNlIGlmKG8+PWkudGltZXNbaF0pe2NvbnN0IHQ9aCpsK3M7ZD1QNnQuYXJyYXlTbGljZShpLnZhbHVlcyx0LHQrbC1zKX1lbHNle2NvbnN0IHQ9aS5jcmVhdGVJbnRlcnBvbGFudCgpLGU9cyxuPWwtczt0LmV2YWx1YXRlKG8pLGQ9UDZ0LmFycmF5U2xpY2UodC5yZXN1bHRCdWZmZXIsZSxuKX0icXVhdGVybmlvbiI9PT1yJiYobmV3IFRKdCkuZnJvbUFycmF5KGQpLm5vcm1hbGl6ZSgpLmNvbmp1Z2F0ZSgpLnRvQXJyYXkoZCk7Y29uc3QgcD1hLnRpbWVzLmxlbmd0aDtmb3IobGV0IHQ9MDt0PHA7Kyt0KXtjb25zdCBlPXQqdStjO2lmKCJxdWF0ZXJuaW9uIj09PXIpVEp0Lm11bHRpcGx5UXVhdGVybmlvbnNGbGF0KGEudmFsdWVzLGUsZCwwLGEudmFsdWVzLGUpO2Vsc2V7Y29uc3QgdD11LTIqYztmb3IobGV0IG49MDtuPHQ7KytuKWEudmFsdWVzW2Urbl0tPWRbbl19fX1yZXR1cm4gdC5ibGVuZE1vZGU9UFp0LHR9fTtjbGFzcyBONnR7Y29uc3RydWN0b3IodCxlLG4saSl7dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnM9dCx0aGlzLl9jYWNoZWRJbmRleD0wLHRoaXMucmVzdWx0QnVmZmVyPXZvaWQgMCE9PWk/aTpuZXcgZS5jb25zdHJ1Y3RvcihuKSx0aGlzLnNhbXBsZVZhbHVlcz1lLHRoaXMudmFsdWVTaXplPW4sdGhpcy5zZXR0aW5ncz1udWxsLHRoaXMuRGVmYXVsdFNldHRpbmdzXz17fX1ldmFsdWF0ZSh0KXtjb25zdCBlPXRoaXMucGFyYW1ldGVyUG9zaXRpb25zO2xldCBuPXRoaXMuX2NhY2hlZEluZGV4LGk9ZVtuXSxyPWVbbi0xXTt0OntlOntsZXQgbztuOntpOmlmKCEodDxpKSl7Zm9yKGxldCBvPW4rMjs7KXtpZih2b2lkIDA9PT1pKXtpZih0PHIpYnJlYWsgaTtyZXR1cm4gbj1lLmxlbmd0aCx0aGlzLl9jYWNoZWRJbmRleD1uLHRoaXMuYWZ0ZXJFbmRfKG4tMSx0LHIpfWlmKG49PT1vKWJyZWFrO2lmKHI9aSxpPWVbKytuXSx0PGkpYnJlYWsgZX1vPWUubGVuZ3RoO2JyZWFrIG59aWYodD49cilicmVhayB0O3tjb25zdCBhPWVbMV07dDxhJiYobj0yLHI9YSk7Zm9yKGxldCBvPW4tMjs7KXtpZih2b2lkIDA9PT1yKXJldHVybiB0aGlzLl9jYWNoZWRJbmRleD0wLHRoaXMuYmVmb3JlU3RhcnRfKDAsdCxpKTtpZihuPT09bylicmVhaztpZihpPXIscj1lWy0tbi0xXSx0Pj1yKWJyZWFrIGV9bz1uLG49MH19Zm9yKDtuPG87KXtjb25zdCBpPW4rbz4+PjE7dDxlW2ldP289aTpuPWkrMX1pZihpPWVbbl0scj1lW24tMV0sdm9pZCAwPT09cilyZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXg9MCx0aGlzLmJlZm9yZVN0YXJ0XygwLHQsaSk7aWYodm9pZCAwPT09aSlyZXR1cm4gbj1lLmxlbmd0aCx0aGlzLl9jYWNoZWRJbmRleD1uLHRoaXMuYWZ0ZXJFbmRfKG4tMSxyLHQpfXRoaXMuX2NhY2hlZEluZGV4PW4sdGhpcy5pbnRlcnZhbENoYW5nZWRfKG4scixpKX1yZXR1cm4gdGhpcy5pbnRlcnBvbGF0ZV8obixyLHQsaSl9Z2V0U2V0dGluZ3NfKCl7cmV0dXJuIHRoaXMuc2V0dGluZ3N8fHRoaXMuRGVmYXVsdFNldHRpbmdzX31jb3B5U2FtcGxlVmFsdWVfKHQpe2NvbnN0IGU9dGhpcy5yZXN1bHRCdWZmZXIsbj10aGlzLnNhbXBsZVZhbHVlcyxpPXRoaXMudmFsdWVTaXplLHI9dCppO2ZvcihsZXQgdD0wO3QhPT1pOysrdCllW3RdPW5bcit0XTtyZXR1cm4gZX1pbnRlcnBvbGF0ZV8oKXt0aHJvdyBuZXcgRXJyb3IoImNhbGwgdG8gYWJzdHJhY3QgbWV0aG9kIil9aW50ZXJ2YWxDaGFuZ2VkXygpe319TjZ0LnByb3RvdHlwZS5iZWZvcmVTdGFydF89TjZ0LnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVfLE42dC5wcm90b3R5cGUuYWZ0ZXJFbmRfPU42dC5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXztjbGFzcyBJNnQgZXh0ZW5kcyBONnR7Y29uc3RydWN0b3IodCxlLG4saSl7c3VwZXIodCxlLG4saSksdGhpcy5fd2VpZ2h0UHJldj0tMCx0aGlzLl9vZmZzZXRQcmV2PS0wLHRoaXMuX3dlaWdodE5leHQ9LTAsdGhpcy5fb2Zmc2V0TmV4dD0tMCx0aGlzLkRlZmF1bHRTZXR0aW5nc189e2VuZGluZ1N0YXJ0OkNadCxlbmRpbmdFbmQ6Q1p0fX1pbnRlcnZhbENoYW5nZWRfKHQsZSxuKXtjb25zdCBpPXRoaXMucGFyYW1ldGVyUG9zaXRpb25zO2xldCByPXQtMixvPXQrMSxhPWlbcl0scz1pW29dO2lmKHZvaWQgMD09PWEpc3dpdGNoKHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nU3RhcnQpe2Nhc2UgQVp0OnI9dCxhPTIqZS1uO2JyZWFrO2Nhc2Uga1p0OnI9aS5sZW5ndGgtMixhPWUraVtyXS1pW3IrMV07YnJlYWs7ZGVmYXVsdDpyPXQsYT1ufWlmKHZvaWQgMD09PXMpc3dpdGNoKHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nRW5kKXtjYXNlIEFadDpvPXQscz0yKm4tZTticmVhaztjYXNlIGtadDpvPTEscz1uK2lbMV0taVswXTticmVhaztkZWZhdWx0Om89dC0xLHM9ZX1jb25zdCBsPS41KihuLWUpLGM9dGhpcy52YWx1ZVNpemU7dGhpcy5fd2VpZ2h0UHJldj1sLyhlLWEpLHRoaXMuX3dlaWdodE5leHQ9bC8ocy1uKSx0aGlzLl9vZmZzZXRQcmV2PXIqYyx0aGlzLl9vZmZzZXROZXh0PW8qY31pbnRlcnBvbGF0ZV8odCxlLG4saSl7Y29uc3Qgcj10aGlzLnJlc3VsdEJ1ZmZlcixvPXRoaXMuc2FtcGxlVmFsdWVzLGE9dGhpcy52YWx1ZVNpemUscz10KmEsbD1zLWEsYz10aGlzLl9vZmZzZXRQcmV2LHU9dGhpcy5fb2Zmc2V0TmV4dCxoPXRoaXMuX3dlaWdodFByZXYsZD10aGlzLl93ZWlnaHROZXh0LHA9KG4tZSkvKGktZSksZj1wKnAsbT1mKnAsZz0taCptKzIqaCpmLWgqcCxfPSgxK2gpKm0rKC0xLjUtMipoKSpmKygtLjUraCkqcCsxLHk9KC0xLWQpKm0rKDEuNStkKSpmKy41KnAsdj1kKm0tZCpmO2ZvcihsZXQgdD0wO3QhPT1hOysrdClyW3RdPWcqb1tjK3RdK18qb1tsK3RdK3kqb1tzK3RdK3Yqb1t1K3RdO3JldHVybiByfX1jbGFzcyBSNnQgZXh0ZW5kcyBONnR7Y29uc3RydWN0b3IodCxlLG4saSl7c3VwZXIodCxlLG4saSl9aW50ZXJwb2xhdGVfKHQsZSxuLGkpe2NvbnN0IHI9dGhpcy5yZXN1bHRCdWZmZXIsbz10aGlzLnNhbXBsZVZhbHVlcyxhPXRoaXMudmFsdWVTaXplLHM9dCphLGw9cy1hLGM9KG4tZSkvKGktZSksdT0xLWM7Zm9yKGxldCB0PTA7dCE9PWE7Kyt0KXJbdF09b1tsK3RdKnUrb1tzK3RdKmM7cmV0dXJuIHJ9fWNsYXNzIE82dCBleHRlbmRzIE42dHtjb25zdHJ1Y3Rvcih0LGUsbixpKXtzdXBlcih0LGUsbixpKX1pbnRlcnBvbGF0ZV8odCl7cmV0dXJuIHRoaXMuY29weVNhbXBsZVZhbHVlXyh0LTEpfX1jbGFzcyB6NnR7Y29uc3RydWN0b3IodCxlLG4saSl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIG5hbWUgaXMgdW5kZWZpbmVkIik7aWYodm9pZCAwPT09ZXx8MD09PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogbm8ga2V5ZnJhbWVzIGluIHRyYWNrIG5hbWVkICIrdCk7dGhpcy5uYW1lPXQsdGhpcy50aW1lcz1QNnQuY29udmVydEFycmF5KGUsdGhpcy5UaW1lQnVmZmVyVHlwZSksdGhpcy52YWx1ZXM9UDZ0LmNvbnZlcnRBcnJheShuLHRoaXMuVmFsdWVCdWZmZXJUeXBlKSx0aGlzLnNldEludGVycG9sYXRpb24oaXx8dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil9c3RhdGljIHRvSlNPTih0KXtjb25zdCBlPXQuY29uc3RydWN0b3I7bGV0IG47aWYoZS50b0pTT04hPT10aGlzLnRvSlNPTiluPWUudG9KU09OKHQpO2Vsc2V7bj17bmFtZTp0Lm5hbWUsdGltZXM6UDZ0LmNvbnZlcnRBcnJheSh0LnRpbWVzLEFycmF5KSx2YWx1ZXM6UDZ0LmNvbnZlcnRBcnJheSh0LnZhbHVlcyxBcnJheSl9O2NvbnN0IGU9dC5nZXRJbnRlcnBvbGF0aW9uKCk7ZSE9PXQuRGVmYXVsdEludGVycG9sYXRpb24mJihuLmludGVycG9sYXRpb249ZSl9cmV0dXJuIG4udHlwZT10LlZhbHVlVHlwZU5hbWUsbn1JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZSh0KXtyZXR1cm4gbmV3IE82dCh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksdCl9SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyKHQpe3JldHVybiBuZXcgUjZ0KHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSx0KX1JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGgodCl7cmV0dXJuIG5ldyBJNnQodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLHQpfXNldEludGVycG9sYXRpb24odCl7bGV0IGU7c3dpdGNoKHQpe2Nhc2UgTVp0OmU9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTticmVhaztjYXNlIEVadDplPXRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyO2JyZWFrO2Nhc2UgVFp0OmU9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGh9aWYodm9pZCAwPT09ZSl7Y29uc3QgZT0idW5zdXBwb3J0ZWQgaW50ZXJwb2xhdGlvbiBmb3IgIit0aGlzLlZhbHVlVHlwZU5hbWUrIiBrZXlmcmFtZSB0cmFjayBuYW1lZCAiK3RoaXMubmFtZTtpZih2b2lkIDA9PT10aGlzLmNyZWF0ZUludGVycG9sYW50KXtpZih0PT09dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil0aHJvdyBuZXcgRXJyb3IoZSk7dGhpcy5zZXRJbnRlcnBvbGF0aW9uKHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pfXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLktleWZyYW1lVHJhY2s6IixlKSx0aGlzfXJldHVybiB0aGlzLmNyZWF0ZUludGVycG9sYW50PWUsdGhpc31nZXRJbnRlcnBvbGF0aW9uKCl7c3dpdGNoKHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQpe2Nhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTpyZXR1cm4gTVp0O2Nhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6cmV0dXJuIEVadDtjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOnJldHVybiBUWnR9fWdldFZhbHVlU2l6ZSgpe3JldHVybiB0aGlzLnZhbHVlcy5sZW5ndGgvdGhpcy50aW1lcy5sZW5ndGh9c2hpZnQodCl7aWYoMCE9PXQpe2NvbnN0IGU9dGhpcy50aW1lcztmb3IobGV0IG49MCxpPWUubGVuZ3RoO24hPT1pOysrbillW25dKz10fXJldHVybiB0aGlzfXNjYWxlKHQpe2lmKDEhPT10KXtjb25zdCBlPXRoaXMudGltZXM7Zm9yKGxldCBuPTAsaT1lLmxlbmd0aDtuIT09aTsrK24pZVtuXSo9dH1yZXR1cm4gdGhpc310cmltKHQsZSl7Y29uc3Qgbj10aGlzLnRpbWVzLGk9bi5sZW5ndGg7bGV0IHI9MCxvPWktMTtmb3IoO3IhPT1pJiZuW3JdPHQ7KSsrcjtmb3IoOy0xIT09byYmbltvXT5lOyktLW87aWYoKytvLDAhPT1yfHxvIT09aSl7cj49byYmKG89TWF0aC5tYXgobywxKSxyPW8tMSk7Y29uc3QgdD10aGlzLmdldFZhbHVlU2l6ZSgpO3RoaXMudGltZXM9UDZ0LmFycmF5U2xpY2UobixyLG8pLHRoaXMudmFsdWVzPVA2dC5hcnJheVNsaWNlKHRoaXMudmFsdWVzLHIqdCxvKnQpfXJldHVybiB0aGlzfXZhbGlkYXRlKCl7bGV0IHQ9ITA7Y29uc3QgZT10aGlzLmdldFZhbHVlU2l6ZSgpO2UtTWF0aC5mbG9vcihlKSE9MCYmKGNvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IEludmFsaWQgdmFsdWUgc2l6ZSBpbiB0cmFjay4iLHRoaXMpLHQ9ITEpO2NvbnN0IG49dGhpcy50aW1lcyxpPXRoaXMudmFsdWVzLHI9bi5sZW5ndGg7MD09PXImJihjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBUcmFjayBpcyBlbXB0eS4iLHRoaXMpLHQ9ITEpO2xldCBvPW51bGw7Zm9yKGxldCBlPTA7ZSE9PXI7ZSsrKXtjb25zdCBpPW5bZV07aWYoIm51bWJlciI9PXR5cGVvZiBpJiZpc05hTihpKSl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVGltZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuIix0aGlzLGUsaSksdD0hMTticmVha31pZihudWxsIT09byYmbz5pKXtjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBPdXQgb2Ygb3JkZXIga2V5cy4iLHRoaXMsZSxpLG8pLHQ9ITE7YnJlYWt9bz1pfWlmKHZvaWQgMCE9PWkmJlA2dC5pc1R5cGVkQXJyYXkoaSkpZm9yKGxldCBlPTAsbj1pLmxlbmd0aDtlIT09bjsrK2Upe2NvbnN0IG49aVtlXTtpZihpc05hTihuKSl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVmFsdWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLiIsdGhpcyxlLG4pLHQ9ITE7YnJlYWt9fXJldHVybiB0fW9wdGltaXplKCl7Y29uc3QgdD1QNnQuYXJyYXlTbGljZSh0aGlzLnRpbWVzKSxlPVA2dC5hcnJheVNsaWNlKHRoaXMudmFsdWVzKSxuPXRoaXMuZ2V0VmFsdWVTaXplKCksaT10aGlzLmdldEludGVycG9sYXRpb24oKT09PVRadCxyPXQubGVuZ3RoLTE7bGV0IG89MTtmb3IobGV0IGE9MTthPHI7KythKXtsZXQgcj0hMTtjb25zdCBzPXRbYV07aWYocyE9PXRbYSsxXSYmKDEhPT1hfHxzIT09dFswXSkpaWYoaSlyPSEwO2Vsc2V7Y29uc3QgdD1hKm4saT10LW4sbz10K247Zm9yKGxldCBhPTA7YSE9PW47KythKXtjb25zdCBuPWVbdCthXTtpZihuIT09ZVtpK2FdfHxuIT09ZVtvK2FdKXtyPSEwO2JyZWFrfX19aWYocil7aWYoYSE9PW8pe3Rbb109dFthXTtjb25zdCBpPWEqbixyPW8qbjtmb3IobGV0IHQ9MDt0IT09bjsrK3QpZVtyK3RdPWVbaSt0XX0rK299fWlmKHI+MCl7dFtvXT10W3JdO2ZvcihsZXQgdD1yKm4saT1vKm4sYT0wO2EhPT1uOysrYSllW2krYV09ZVt0K2FdOysrb31yZXR1cm4gbyE9PXQubGVuZ3RoPyh0aGlzLnRpbWVzPVA2dC5hcnJheVNsaWNlKHQsMCxvKSx0aGlzLnZhbHVlcz1QNnQuYXJyYXlTbGljZShlLDAsbypuKSk6KHRoaXMudGltZXM9dCx0aGlzLnZhbHVlcz1lKSx0aGlzfWNsb25lKCl7Y29uc3QgdD1QNnQuYXJyYXlTbGljZSh0aGlzLnRpbWVzLDApLGU9UDZ0LmFycmF5U2xpY2UodGhpcy52YWx1ZXMsMCksbj1uZXcoMCx0aGlzLmNvbnN0cnVjdG9yKSh0aGlzLm5hbWUsdCxlKTtyZXR1cm4gbi5jcmVhdGVJbnRlcnBvbGFudD10aGlzLmNyZWF0ZUludGVycG9sYW50LG59fXo2dC5wcm90b3R5cGUuVGltZUJ1ZmZlclR5cGU9RmxvYXQzMkFycmF5LHo2dC5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlPUZsb2F0MzJBcnJheSx6NnQucHJvdG90eXBlLkRlZmF1bHRJbnRlcnBvbGF0aW9uPUVadDtjbGFzcyBENnQgZXh0ZW5kcyB6NnR7fUQ2dC5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0iYm9vbCIsRDZ0LnByb3RvdHlwZS5WYWx1ZUJ1ZmZlclR5cGU9QXJyYXksRDZ0LnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbj1NWnQsRDZ0LnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI9dm9pZCAwLEQ2dC5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoPXZvaWQgMDtjbGFzcyBCNnQgZXh0ZW5kcyB6NnR7fUI2dC5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0iY29sb3IiO2NsYXNzIEg2dCBleHRlbmRzIHo2dHt9SDZ0LnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lPSJudW1iZXIiO2NsYXNzIEY2dCBleHRlbmRzIE42dHtjb25zdHJ1Y3Rvcih0LGUsbixpKXtzdXBlcih0LGUsbixpKX1pbnRlcnBvbGF0ZV8odCxlLG4saSl7Y29uc3Qgcj10aGlzLnJlc3VsdEJ1ZmZlcixvPXRoaXMuc2FtcGxlVmFsdWVzLGE9dGhpcy52YWx1ZVNpemUscz0obi1lKS8oaS1lKTtsZXQgbD10KmE7Zm9yKGxldCB0PWwrYTtsIT09dDtsKz00KVRKdC5zbGVycEZsYXQociwwLG8sbC1hLG8sbCxzKTtyZXR1cm4gcn19Y2xhc3MgVjZ0IGV4dGVuZHMgejZ0e0ludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcih0KXtyZXR1cm4gbmV3IEY2dCh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksdCl9fVY2dC5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0icXVhdGVybmlvbiIsVjZ0LnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbj1FWnQsVjZ0LnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg9dm9pZCAwO2NsYXNzIFU2dCBleHRlbmRzIHo2dHt9VTZ0LnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lPSJzdHJpbmciLFU2dC5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlPUFycmF5LFU2dC5wcm90b3R5cGUuRGVmYXVsdEludGVycG9sYXRpb249TVp0LFU2dC5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyPXZvaWQgMCxVNnQucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aD12b2lkIDA7Y2xhc3MgajZ0IGV4dGVuZHMgejZ0e31qNnQucHJvdG90eXBlLlZhbHVlVHlwZU5hbWU9InZlY3RvciI7Y2xhc3MgRzZ0e2NvbnN0cnVjdG9yKHQsZT0tMSxuLGk9MjUwMCl7dGhpcy5uYW1lPXQsdGhpcy50cmFja3M9bix0aGlzLmR1cmF0aW9uPWUsdGhpcy5ibGVuZE1vZGU9aSx0aGlzLnV1aWQ9WFp0KCksdGhpcy5kdXJhdGlvbjwwJiZ0aGlzLnJlc2V0RHVyYXRpb24oKX1zdGF0aWMgcGFyc2UodCl7Y29uc3QgZT1bXSxuPXQudHJhY2tzLGk9MS8odC5mcHN8fDEpO2ZvcihsZXQgdD0wLHI9bi5sZW5ndGg7dCE9PXI7Kyt0KWUucHVzaChXNnQoblt0XSkuc2NhbGUoaSkpO2NvbnN0IHI9bmV3IHRoaXModC5uYW1lLHQuZHVyYXRpb24sZSx0LmJsZW5kTW9kZSk7cmV0dXJuIHIudXVpZD10LnV1aWQscn1zdGF0aWMgdG9KU09OKHQpe2NvbnN0IGU9W10sbj10LnRyYWNrcyxpPXtuYW1lOnQubmFtZSxkdXJhdGlvbjp0LmR1cmF0aW9uLHRyYWNrczplLHV1aWQ6dC51dWlkLGJsZW5kTW9kZTp0LmJsZW5kTW9kZX07Zm9yKGxldCB0PTAsaT1uLmxlbmd0aDt0IT09aTsrK3QpZS5wdXNoKHo2dC50b0pTT04oblt0XSkpO3JldHVybiBpfXN0YXRpYyBDcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZSh0LGUsbixpKXtjb25zdCByPWUubGVuZ3RoLG89W107Zm9yKGxldCB0PTA7dDxyO3QrKyl7bGV0IGE9W10scz1bXTthLnB1c2goKHQrci0xKSVyLHQsKHQrMSklcikscy5wdXNoKDAsMSwwKTtjb25zdCBsPVA2dC5nZXRLZXlmcmFtZU9yZGVyKGEpO2E9UDZ0LnNvcnRlZEFycmF5KGEsMSxsKSxzPVA2dC5zb3J0ZWRBcnJheShzLDEsbCksaXx8MCE9PWFbMF18fChhLnB1c2gocikscy5wdXNoKHNbMF0pKSxvLnB1c2gobmV3IEg2dCgiLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1siK2VbdF0ubmFtZSsiXSIsYSxzKS5zY2FsZSgxL24pKX1yZXR1cm4gbmV3IHRoaXModCwtMSxvKX1zdGF0aWMgZmluZEJ5TmFtZSh0LGUpe2xldCBuPXQ7aWYoIUFycmF5LmlzQXJyYXkodCkpe2NvbnN0IGU9dDtuPWUuZ2VvbWV0cnkmJmUuZ2VvbWV0cnkuYW5pbWF0aW9uc3x8ZS5hbmltYXRpb25zfWZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKWlmKG5bdF0ubmFtZT09PWUpcmV0dXJuIG5bdF07cmV0dXJuIG51bGx9c3RhdGljIENyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2VzKHQsZSxuKXtjb25zdCBpPXt9LHI9L14oW1x3LV0qPykoW1xkXSspJC87Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXtjb25zdCBuPXRbZV0sbz1uLm5hbWUubWF0Y2gocik7aWYobyYmby5sZW5ndGg+MSl7Y29uc3QgdD1vWzFdO2xldCBlPWlbdF07ZXx8KGlbdF09ZT1bXSksZS5wdXNoKG4pfX1jb25zdCBvPVtdO2Zvcihjb25zdCB0IGluIGkpby5wdXNoKHRoaXMuQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UodCxpW3RdLGUsbikpO3JldHVybiBvfXN0YXRpYyBwYXJzZUFuaW1hdGlvbih0LGUpe2lmKCF0KXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5BbmltYXRpb25DbGlwOiBObyBhbmltYXRpb24gaW4gSlNPTkxvYWRlciBkYXRhLiIpLG51bGw7Y29uc3Qgbj1mdW5jdGlvbih0LGUsbixpLHIpe2lmKDAhPT1uLmxlbmd0aCl7Y29uc3Qgbz1bXSxhPVtdO1A2dC5mbGF0dGVuSlNPTihuLG8sYSxpKSwwIT09by5sZW5ndGgmJnIucHVzaChuZXcgdChlLG8sYSkpfX0saT1bXSxyPXQubmFtZXx8ImRlZmF1bHQiLG89dC5mcHN8fDMwLGE9dC5ibGVuZE1vZGU7bGV0IHM9dC5sZW5ndGh8fC0xO2NvbnN0IGw9dC5oaWVyYXJjaHl8fFtdO2ZvcihsZXQgdD0wO3Q8bC5sZW5ndGg7dCsrKXtjb25zdCByPWxbdF0ua2V5cztpZihyJiYwIT09ci5sZW5ndGgpaWYoclswXS5tb3JwaFRhcmdldHMpe2NvbnN0IHQ9e307bGV0IGU7Zm9yKGU9MDtlPHIubGVuZ3RoO2UrKylpZihyW2VdLm1vcnBoVGFyZ2V0cylmb3IobGV0IG49MDtuPHJbZV0ubW9ycGhUYXJnZXRzLmxlbmd0aDtuKyspdFtyW2VdLm1vcnBoVGFyZ2V0c1tuXV09LTE7Zm9yKGNvbnN0IG4gaW4gdCl7Y29uc3QgdD1bXSxvPVtdO2ZvcihsZXQgaT0wO2khPT1yW2VdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7KytpKXtjb25zdCBpPXJbZV07dC5wdXNoKGkudGltZSksby5wdXNoKGkubW9ycGhUYXJnZXQ9PT1uPzE6MCl9aS5wdXNoKG5ldyBINnQoIi5tb3JwaFRhcmdldEluZmx1ZW5jZVsiK24rIl0iLHQsbykpfXM9dC5sZW5ndGgqKG98fDEpfWVsc2V7Y29uc3Qgbz0iLmJvbmVzWyIrZVt0XS5uYW1lKyJdIjtuKGo2dCxvKyIucG9zaXRpb24iLHIsInBvcyIsaSksbihWNnQsbysiLnF1YXRlcm5pb24iLHIsInJvdCIsaSksbihqNnQsbysiLnNjYWxlIixyLCJzY2wiLGkpfX1yZXR1cm4gMD09PWkubGVuZ3RoP251bGw6bmV3IHRoaXMocixzLGksYSl9cmVzZXREdXJhdGlvbigpe2xldCB0PTA7Zm9yKGxldCBlPTAsbj10aGlzLnRyYWNrcy5sZW5ndGg7ZSE9PW47KytlKXtjb25zdCBuPXRoaXMudHJhY2tzW2VdO3Q9TWF0aC5tYXgodCxuLnRpbWVzW24udGltZXMubGVuZ3RoLTFdKX1yZXR1cm4gdGhpcy5kdXJhdGlvbj10LHRoaXN9dHJpbSgpe2ZvcihsZXQgdD0wO3Q8dGhpcy50cmFja3MubGVuZ3RoO3QrKyl0aGlzLnRyYWNrc1t0XS50cmltKDAsdGhpcy5kdXJhdGlvbik7cmV0dXJuIHRoaXN9dmFsaWRhdGUoKXtsZXQgdD0hMDtmb3IobGV0IGU9MDtlPHRoaXMudHJhY2tzLmxlbmd0aDtlKyspdD10JiZ0aGlzLnRyYWNrc1tlXS52YWxpZGF0ZSgpO3JldHVybiB0fW9wdGltaXplKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnRyYWNrcy5sZW5ndGg7dCsrKXRoaXMudHJhY2tzW3RdLm9wdGltaXplKCk7cmV0dXJuIHRoaXN9Y2xvbmUoKXtjb25zdCB0PVtdO2ZvcihsZXQgZT0wO2U8dGhpcy50cmFja3MubGVuZ3RoO2UrKyl0LnB1c2godGhpcy50cmFja3NbZV0uY2xvbmUoKSk7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMubmFtZSx0aGlzLmR1cmF0aW9uLHQsdGhpcy5ibGVuZE1vZGUpfXRvSlNPTigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvSlNPTih0aGlzKX19ZnVuY3Rpb24gVzZ0KHQpe2lmKHZvaWQgMD09PXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIHR5cGUgdW5kZWZpbmVkLCBjYW4gbm90IHBhcnNlIik7Y29uc3QgZT0oZnVuY3Rpb24gbih0KXtzd2l0Y2godC50b0xvd2VyQ2FzZSgpKXtjYXNlInNjYWxhciI6Y2FzZSJkb3VibGUiOmNhc2UiZmxvYXQiOmNhc2UibnVtYmVyIjpjYXNlImludGVnZXIiOnJldHVybiBINnQ7Y2FzZSJ2ZWN0b3IiOmNhc2UidmVjdG9yMiI6Y2FzZSJ2ZWN0b3IzIjpjYXNlInZlY3RvcjQiOnJldHVybiBqNnQ7Y2FzZSJjb2xvciI6cmV0dXJuIEI2dDtjYXNlInF1YXRlcm5pb24iOnJldHVybiBWNnQ7Y2FzZSJib29sIjpjYXNlImJvb2xlYW4iOnJldHVybiBENnQ7Y2FzZSJzdHJpbmciOnJldHVybiBVNnR9dGhyb3cgbmV3IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBVbnN1cHBvcnRlZCB0eXBlTmFtZTogIit0KX0pKHQudHlwZSk7aWYodm9pZCAwPT09dC50aW1lcyl7Y29uc3QgZT1bXSxuPVtdO1A2dC5mbGF0dGVuSlNPTih0LmtleXMsZSxuLCJ2YWx1ZSIpLHQudGltZXM9ZSx0LnZhbHVlcz1ufXJldHVybiB2b2lkIDAhPT1lLnBhcnNlP2UucGFyc2UodCk6bmV3IGUodC5uYW1lLHQudGltZXMsdC52YWx1ZXMsdC5pbnRlcnBvbGF0aW9uKX1jb25zdCBxNnQ9e2VuYWJsZWQ6ITEsZmlsZXM6e30sYWRkOmZ1bmN0aW9uKHQsZSl7ITEhPT10aGlzLmVuYWJsZWQmJih0aGlzLmZpbGVzW3RdPWUpfSxnZXQ6ZnVuY3Rpb24odCl7aWYoITEhPT10aGlzLmVuYWJsZWQpcmV0dXJuIHRoaXMuZmlsZXNbdF19LHJlbW92ZTpmdW5jdGlvbih0KXtkZWxldGUgdGhpcy5maWxlc1t0XX0sY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLmZpbGVzPXt9fX07Y2xhc3MgWTZ0e2NvbnN0cnVjdG9yKHQsZSxuKXtjb25zdCBpPXRoaXM7bGV0IHIsbz0hMSxhPTAscz0wO2NvbnN0IGw9W107dGhpcy5vblN0YXJ0PXZvaWQgMCx0aGlzLm9uTG9hZD10LHRoaXMub25Qcm9ncmVzcz1lLHRoaXMub25FcnJvcj1uLHRoaXMuaXRlbVN0YXJ0PWZ1bmN0aW9uKHQpe3MrKywhMT09PW8mJnZvaWQgMCE9PWkub25TdGFydCYmaS5vblN0YXJ0KHQsYSxzKSxvPSEwfSx0aGlzLml0ZW1FbmQ9ZnVuY3Rpb24odCl7YSsrLHZvaWQgMCE9PWkub25Qcm9ncmVzcyYmaS5vblByb2dyZXNzKHQsYSxzKSxhPT09cyYmKG89ITEsdm9pZCAwIT09aS5vbkxvYWQmJmkub25Mb2FkKCkpfSx0aGlzLml0ZW1FcnJvcj1mdW5jdGlvbih0KXt2b2lkIDAhPT1pLm9uRXJyb3ImJmkub25FcnJvcih0KX0sdGhpcy5yZXNvbHZlVVJMPWZ1bmN0aW9uKHQpe3JldHVybiByP3IodCk6dH0sdGhpcy5zZXRVUkxNb2RpZmllcj1mdW5jdGlvbih0KXtyZXR1cm4gcj10LHRoaXN9LHRoaXMuYWRkSGFuZGxlcj1mdW5jdGlvbih0LGUpe3JldHVybiBsLnB1c2godCxlKSx0aGlzfSx0aGlzLnJlbW92ZUhhbmRsZXI9ZnVuY3Rpb24odCl7Y29uc3QgZT1sLmluZGV4T2YodCk7cmV0dXJuLTEhPT1lJiZsLnNwbGljZShlLDIpLHRoaXN9LHRoaXMuZ2V0SGFuZGxlcj1mdW5jdGlvbih0KXtmb3IobGV0IGU9MCxuPWwubGVuZ3RoO2U8bjtlKz0yKXtjb25zdCBuPWxbZV0saT1sW2UrMV07aWYobi5nbG9iYWwmJihuLmxhc3RJbmRleD0wKSxuLnRlc3QodCkpcmV0dXJuIGl9cmV0dXJuIG51bGx9fX1jb25zdCBYNnQ9bmV3IFk2dDtjbGFzcyAkNnR7Y29uc3RydWN0b3IodCl7dGhpcy5tYW5hZ2VyPXZvaWQgMCE9PXQ/dDpYNnQsdGhpcy5jcm9zc09yaWdpbj0iYW5vbnltb3VzIix0aGlzLndpdGhDcmVkZW50aWFscz0hMSx0aGlzLnBhdGg9IiIsdGhpcy5yZXNvdXJjZVBhdGg9IiIsdGhpcy5yZXF1ZXN0SGVhZGVyPXt9fWxvYWQoKXt9bG9hZEFzeW5jKHQsZSl7Y29uc3Qgbj10aGlzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oaSxyKXtuLmxvYWQodCxpLGUscil9KSl9cGFyc2UoKXt9c2V0Q3Jvc3NPcmlnaW4odCl7cmV0dXJuIHRoaXMuY3Jvc3NPcmlnaW49dCx0aGlzfXNldFdpdGhDcmVkZW50aWFscyh0KXtyZXR1cm4gdGhpcy53aXRoQ3JlZGVudGlhbHM9dCx0aGlzfXNldFBhdGgodCl7cmV0dXJuIHRoaXMucGF0aD10LHRoaXN9c2V0UmVzb3VyY2VQYXRoKHQpe3JldHVybiB0aGlzLnJlc291cmNlUGF0aD10LHRoaXN9c2V0UmVxdWVzdEhlYWRlcih0KXtyZXR1cm4gdGhpcy5yZXF1ZXN0SGVhZGVyPXQsdGhpc319Y29uc3QgSzZ0PXt9O2NsYXNzIFo2dCBleHRlbmRzICQ2dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxuLGkpe3ZvaWQgMD09PXQmJih0PSIiKSx2b2lkIDAhPT10aGlzLnBhdGgmJih0PXRoaXMucGF0aCt0KSx0PXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKHQpO2NvbnN0IHI9dGhpcyxvPXE2dC5nZXQodCk7aWYodm9pZCAwIT09bylyZXR1cm4gci5tYW5hZ2VyLml0ZW1TdGFydCh0KSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2UmJmUobyksci5tYW5hZ2VyLml0ZW1FbmQodCl9KSwwKSxvO2lmKHZvaWQgMCE9PUs2dFt0XSlyZXR1cm4gdm9pZCBLNnRbdF0ucHVzaCh7b25Mb2FkOmUsb25Qcm9ncmVzczpuLG9uRXJyb3I6aX0pO2NvbnN0IGE9dC5tYXRjaCgvXmRhdGE6KC4qPykoO2Jhc2U2NCk/LCguKikkLyk7bGV0IHM7aWYoYSl7Y29uc3Qgbj1hWzFdLG89ISFhWzJdO2xldCBzPWFbM107cz1kZWNvZGVVUklDb21wb25lbnQocyksbyYmKHM9YXRvYihzKSk7dHJ5e2xldCBpO2NvbnN0IG89KHRoaXMucmVzcG9uc2VUeXBlfHwiIikudG9Mb3dlckNhc2UoKTtzd2l0Y2gobyl7Y2FzZSJhcnJheWJ1ZmZlciI6Y2FzZSJibG9iIjpjb25zdCB0PW5ldyBVaW50OEFycmF5KHMubGVuZ3RoKTtmb3IobGV0IGU9MDtlPHMubGVuZ3RoO2UrKyl0W2VdPXMuY2hhckNvZGVBdChlKTtpPSJibG9iIj09PW8/bmV3IEJsb2IoW3QuYnVmZmVyXSx7dHlwZTpufSk6dC5idWZmZXI7YnJlYWs7Y2FzZSJkb2N1bWVudCI6Y29uc3QgZT1uZXcgRE9NUGFyc2VyO2k9ZS5wYXJzZUZyb21TdHJpbmcocyxuKTticmVhaztjYXNlImpzb24iOmk9SlNPTi5wYXJzZShzKTticmVhaztkZWZhdWx0Omk9c31zZXRUaW1lb3V0KChmdW5jdGlvbigpe2UmJmUoaSksci5tYW5hZ2VyLml0ZW1FbmQodCl9KSwwKX1jYXRjaChlKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe2kmJmkoZSksci5tYW5hZ2VyLml0ZW1FcnJvcih0KSxyLm1hbmFnZXIuaXRlbUVuZCh0KX0pLDApfX1lbHNle0s2dFt0XT1bXSxLNnRbdF0ucHVzaCh7b25Mb2FkOmUsb25Qcm9ncmVzczpuLG9uRXJyb3I6aX0pLHM9bmV3IFhNTEh0dHBSZXF1ZXN0LHMub3BlbigiR0VUIix0LCEwKSxzLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbihlKXtjb25zdCBuPXRoaXMucmVzcG9uc2UsaT1LNnRbdF07aWYoZGVsZXRlIEs2dFt0XSwyMDA9PT10aGlzLnN0YXR1c3x8MD09PXRoaXMuc3RhdHVzKXswPT09dGhpcy5zdGF0dXMmJmNvbnNvbGUud2FybigiVEhSRUUuRmlsZUxvYWRlcjogSFRUUCBTdGF0dXMgMCByZWNlaXZlZC4iKSxxNnQuYWRkKHQsbik7Zm9yKGxldCB0PTAsZT1pLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPWlbdF07ZS5vbkxvYWQmJmUub25Mb2FkKG4pfXIubWFuYWdlci5pdGVtRW5kKHQpfWVsc2V7Zm9yKGxldCB0PTAsbj1pLmxlbmd0aDt0PG47dCsrKXtjb25zdCBuPWlbdF07bi5vbkVycm9yJiZuLm9uRXJyb3IoZSl9ci5tYW5hZ2VyLml0ZW1FcnJvcih0KSxyLm1hbmFnZXIuaXRlbUVuZCh0KX19KSwhMSkscy5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsKGZ1bmN0aW9uKGUpe2NvbnN0IG49SzZ0W3RdO2ZvcihsZXQgdD0wLGk9bi5sZW5ndGg7dDxpO3QrKyl7Y29uc3QgaT1uW3RdO2kub25Qcm9ncmVzcyYmaS5vblByb2dyZXNzKGUpfX0pLCExKSxzLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwoZnVuY3Rpb24oZSl7Y29uc3Qgbj1LNnRbdF07ZGVsZXRlIEs2dFt0XTtmb3IobGV0IHQ9MCxpPW4ubGVuZ3RoO3Q8aTt0Kyspe2NvbnN0IGk9blt0XTtpLm9uRXJyb3ImJmkub25FcnJvcihlKX1yLm1hbmFnZXIuaXRlbUVycm9yKHQpLHIubWFuYWdlci5pdGVtRW5kKHQpfSksITEpLHMuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLChmdW5jdGlvbihlKXtjb25zdCBuPUs2dFt0XTtkZWxldGUgSzZ0W3RdO2ZvcihsZXQgdD0wLGk9bi5sZW5ndGg7dDxpO3QrKyl7Y29uc3QgaT1uW3RdO2kub25FcnJvciYmaS5vbkVycm9yKGUpfXIubWFuYWdlci5pdGVtRXJyb3IodCksci5tYW5hZ2VyLml0ZW1FbmQodCl9KSwhMSksdm9pZCAwIT09dGhpcy5yZXNwb25zZVR5cGUmJihzLnJlc3BvbnNlVHlwZT10aGlzLnJlc3BvbnNlVHlwZSksdm9pZCAwIT09dGhpcy53aXRoQ3JlZGVudGlhbHMmJihzLndpdGhDcmVkZW50aWFscz10aGlzLndpdGhDcmVkZW50aWFscykscy5vdmVycmlkZU1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUodm9pZCAwIT09dGhpcy5taW1lVHlwZT90aGlzLm1pbWVUeXBlOiJ0ZXh0L3BsYWluIik7Zm9yKGNvbnN0IHQgaW4gdGhpcy5yZXF1ZXN0SGVhZGVyKXMuc2V0UmVxdWVzdEhlYWRlcih0LHRoaXMucmVxdWVzdEhlYWRlclt0XSk7cy5zZW5kKG51bGwpfXJldHVybiByLm1hbmFnZXIuaXRlbVN0YXJ0KHQpLHN9c2V0UmVzcG9uc2VUeXBlKHQpe3JldHVybiB0aGlzLnJlc3BvbnNlVHlwZT10LHRoaXN9c2V0TWltZVR5cGUodCl7cmV0dXJuIHRoaXMubWltZVR5cGU9dCx0aGlzfX1jbGFzcyBKNnQgZXh0ZW5kcyAkNnR7Y29uc3RydWN0b3IodCl7c3VwZXIodCl9bG9hZCh0LGUsbixpKXt2b2lkIDAhPT10aGlzLnBhdGgmJih0PXRoaXMucGF0aCt0KSx0PXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKHQpO2NvbnN0IHI9dGhpcyxvPXE2dC5nZXQodCk7aWYodm9pZCAwIT09bylyZXR1cm4gci5tYW5hZ2VyLml0ZW1TdGFydCh0KSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2UmJmUobyksci5tYW5hZ2VyLml0ZW1FbmQodCl9KSwwKSxvO2NvbnN0IGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiaW1nIik7ZnVuY3Rpb24gcygpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIscywhMSksYS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsbCwhMSkscTZ0LmFkZCh0LHRoaXMpLGUmJmUodGhpcyksci5tYW5hZ2VyLml0ZW1FbmQodCl9ZnVuY3Rpb24gbChlKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLHMsITEpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGwsITEpLGkmJmkoZSksci5tYW5hZ2VyLml0ZW1FcnJvcih0KSxyLm1hbmFnZXIuaXRlbUVuZCh0KX1yZXR1cm4gYS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixzLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixsLCExKSwiZGF0YToiIT09dC5zdWJzdHIoMCw1KSYmdm9pZCAwIT09dGhpcy5jcm9zc09yaWdpbiYmKGEuY3Jvc3NPcmlnaW49dGhpcy5jcm9zc09yaWdpbiksci5tYW5hZ2VyLml0ZW1TdGFydCh0KSxhLnNyYz10LGF9fWNsYXNzIFE2dCBleHRlbmRzICQ2dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxuLGkpe2NvbnN0IHI9bmV3ICQxdCxvPW5ldyBKNnQodGhpcy5tYW5hZ2VyKTtvLnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pLG8uc2V0UGF0aCh0aGlzLnBhdGgpO2xldCBhPTA7ZnVuY3Rpb24gcyhuKXtvLmxvYWQodFtuXSwoZnVuY3Rpb24odCl7ci5pbWFnZXNbbl09dCxhKyssNj09PWEmJihyLm5lZWRzVXBkYXRlPSEwLGUmJmUocikpfSksdm9pZCAwLGkpfWZvcihsZXQgZT0wO2U8dC5sZW5ndGg7KytlKXMoZSk7cmV0dXJuIHJ9fWNsYXNzIHQ5dCBleHRlbmRzICQ2dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxuLGkpe2NvbnN0IHI9dGhpcyxvPW5ldyBNM3QsYT1uZXcgWjZ0KHRoaXMubWFuYWdlcik7cmV0dXJuIGEuc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpLGEuc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLGEuc2V0UGF0aCh0aGlzLnBhdGgpLGEuc2V0V2l0aENyZWRlbnRpYWxzKHIud2l0aENyZWRlbnRpYWxzKSxhLmxvYWQodCwoZnVuY3Rpb24odCl7Y29uc3Qgbj1yLnBhcnNlKHQpO24mJih2b2lkIDAhPT1uLmltYWdlP28uaW1hZ2U9bi5pbWFnZTp2b2lkIDAhPT1uLmRhdGEmJihvLmltYWdlLndpZHRoPW4ud2lkdGgsby5pbWFnZS5oZWlnaHQ9bi5oZWlnaHQsby5pbWFnZS5kYXRhPW4uZGF0YSksby53cmFwUz12b2lkIDAhPT1uLndyYXBTP24ud3JhcFM6S0t0LG8ud3JhcFQ9dm9pZCAwIT09bi53cmFwVD9uLndyYXBUOktLdCxvLm1hZ0ZpbHRlcj12b2lkIDAhPT1uLm1hZ0ZpbHRlcj9uLm1hZ0ZpbHRlcjplWnQsby5taW5GaWx0ZXI9dm9pZCAwIT09bi5taW5GaWx0ZXI/bi5taW5GaWx0ZXI6ZVp0LG8uYW5pc290cm9weT12b2lkIDAhPT1uLmFuaXNvdHJvcHk/bi5hbmlzb3Ryb3B5OjEsdm9pZCAwIT09bi5lbmNvZGluZyYmKG8uZW5jb2Rpbmc9bi5lbmNvZGluZyksdm9pZCAwIT09bi5mbGlwWSYmKG8uZmxpcFk9bi5mbGlwWSksdm9pZCAwIT09bi5mb3JtYXQmJihvLmZvcm1hdD1uLmZvcm1hdCksdm9pZCAwIT09bi50eXBlJiYoby50eXBlPW4udHlwZSksdm9pZCAwIT09bi5taXBtYXBzJiYoby5taXBtYXBzPW4ubWlwbWFwcyxvLm1pbkZpbHRlcj1pWnQpLDE9PT1uLm1pcG1hcENvdW50JiYoby5taW5GaWx0ZXI9ZVp0KSx2b2lkIDAhPT1uLmdlbmVyYXRlTWlwbWFwcyYmKG8uZ2VuZXJhdGVNaXBtYXBzPW4uZ2VuZXJhdGVNaXBtYXBzKSxvLm5lZWRzVXBkYXRlPSEwLGUmJmUobyxuKSl9KSxuLGkpLG99fWNsYXNzIGU5dCBleHRlbmRzICQ2dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxuLGkpe2NvbnN0IHI9bmV3IGJKdCxvPW5ldyBKNnQodGhpcy5tYW5hZ2VyKTtyZXR1cm4gby5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKSxvLnNldFBhdGgodGhpcy5wYXRoKSxvLmxvYWQodCwoZnVuY3Rpb24obil7ci5pbWFnZT1uO2NvbnN0IGk9dC5zZWFyY2goL1wuanBlP2coJHxcPykvaSk+MHx8MD09PXQuc2VhcmNoKC9eZGF0YVw6aW1hZ2VcL2pwZWcvKTtyLmZvcm1hdD1pP3VadDpoWnQsci5uZWVkc1VwZGF0ZT0hMCx2b2lkIDAhPT1lJiZlKHIpfSksbixpKSxyfX1jbGFzcyBuOXQgZXh0ZW5kcyBoNHR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudHlwZT0iQ3VydmVQYXRoIix0aGlzLmN1cnZlcz1bXSx0aGlzLmF1dG9DbG9zZT0hMX1hZGQodCl7dGhpcy5jdXJ2ZXMucHVzaCh0KX1jbG9zZVBhdGgoKXtjb25zdCB0PXRoaXMuY3VydmVzWzBdLmdldFBvaW50KDApLGU9dGhpcy5jdXJ2ZXNbdGhpcy5jdXJ2ZXMubGVuZ3RoLTFdLmdldFBvaW50KDEpO3QuZXF1YWxzKGUpfHx0aGlzLmN1cnZlcy5wdXNoKG5ldyBFNHQoZSx0KSl9Z2V0UG9pbnQodCl7Y29uc3QgZT10KnRoaXMuZ2V0TGVuZ3RoKCksbj10aGlzLmdldEN1cnZlTGVuZ3RocygpO2xldCBpPTA7Zm9yKDtpPG4ubGVuZ3RoOyl7aWYobltpXT49ZSl7Y29uc3QgdD1uW2ldLWUscj10aGlzLmN1cnZlc1tpXSxvPXIuZ2V0TGVuZ3RoKCk7cmV0dXJuIHIuZ2V0UG9pbnRBdCgwPT09bz8wOjEtdC9vKX1pKyt9cmV0dXJuIG51bGx9Z2V0TGVuZ3RoKCl7Y29uc3QgdD10aGlzLmdldEN1cnZlTGVuZ3RocygpO3JldHVybiB0W3QubGVuZ3RoLTFdfXVwZGF0ZUFyY0xlbmd0aHMoKXt0aGlzLm5lZWRzVXBkYXRlPSEwLHRoaXMuY2FjaGVMZW5ndGhzPW51bGwsdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKX1nZXRDdXJ2ZUxlbmd0aHMoKXtpZih0aGlzLmNhY2hlTGVuZ3RocyYmdGhpcy5jYWNoZUxlbmd0aHMubGVuZ3RoPT09dGhpcy5jdXJ2ZXMubGVuZ3RoKXJldHVybiB0aGlzLmNhY2hlTGVuZ3Rocztjb25zdCB0PVtdO2xldCBlPTA7Zm9yKGxldCBuPTAsaT10aGlzLmN1cnZlcy5sZW5ndGg7bjxpO24rKyllKz10aGlzLmN1cnZlc1tuXS5nZXRMZW5ndGgoKSx0LnB1c2goZSk7cmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzPXQsdH1nZXRTcGFjZWRQb2ludHModD00MCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPD10O24rKyllLnB1c2godGhpcy5nZXRQb2ludChuL3QpKTtyZXR1cm4gdGhpcy5hdXRvQ2xvc2UmJmUucHVzaChlWzBdKSxlfWdldFBvaW50cyh0PTEyKXtjb25zdCBlPVtdO2xldCBuO2ZvcihsZXQgaT0wLHI9dGhpcy5jdXJ2ZXM7aTxyLmxlbmd0aDtpKyspe2NvbnN0IG89cltpXSxhPW8uZ2V0UG9pbnRzKG8mJm8uaXNFbGxpcHNlQ3VydmU/Mip0Om8mJihvLmlzTGluZUN1cnZlfHxvLmlzTGluZUN1cnZlMyk/MTpvJiZvLmlzU3BsaW5lQ3VydmU/dCpvLnBvaW50cy5sZW5ndGg6dCk7Zm9yKGxldCB0PTA7dDxhLmxlbmd0aDt0Kyspe2NvbnN0IGk9YVt0XTtuJiZuLmVxdWFscyhpKXx8KGUucHVzaChpKSxuPWkpfX1yZXR1cm4gdGhpcy5hdXRvQ2xvc2UmJmUubGVuZ3RoPjEmJiFlW2UubGVuZ3RoLTFdLmVxdWFscyhlWzBdKSYmZS5wdXNoKGVbMF0pLGV9Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMuY3VydmVzPVtdO2ZvcihsZXQgZT0wLG49dC5jdXJ2ZXMubGVuZ3RoO2U8bjtlKyspdGhpcy5jdXJ2ZXMucHVzaCh0LmN1cnZlc1tlXS5jbG9uZSgpKTtyZXR1cm4gdGhpcy5hdXRvQ2xvc2U9dC5hdXRvQ2xvc2UsdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QuYXV0b0Nsb3NlPXRoaXMuYXV0b0Nsb3NlLHQuY3VydmVzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5jdXJ2ZXMubGVuZ3RoO2U8bjtlKyspdC5jdXJ2ZXMucHVzaCh0aGlzLmN1cnZlc1tlXS50b0pTT04oKSk7cmV0dXJuIHR9ZnJvbUpTT04odCl7c3VwZXIuZnJvbUpTT04odCksdGhpcy5hdXRvQ2xvc2U9dC5hdXRvQ2xvc2UsdGhpcy5jdXJ2ZXM9W107Zm9yKGxldCBlPTAsbj10LmN1cnZlcy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgbj10LmN1cnZlc1tlXTt0aGlzLmN1cnZlcy5wdXNoKChuZXcgTDR0W24udHlwZV0pLmZyb21KU09OKG4pKX1yZXR1cm4gdGhpc319Y2xhc3MgaTl0IGV4dGVuZHMgbjl0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy50eXBlPSJQYXRoIix0aGlzLmN1cnJlbnRQb2ludD1uZXcgbUp0LHQmJnRoaXMuc2V0RnJvbVBvaW50cyh0KX1zZXRGcm9tUG9pbnRzKHQpe3RoaXMubW92ZVRvKHRbMF0ueCx0WzBdLnkpO2ZvcihsZXQgZT0xLG49dC5sZW5ndGg7ZTxuO2UrKyl0aGlzLmxpbmVUbyh0W2VdLngsdFtlXS55KTtyZXR1cm4gdGhpc31tb3ZlVG8odCxlKXtyZXR1cm4gdGhpcy5jdXJyZW50UG9pbnQuc2V0KHQsZSksdGhpc31saW5lVG8odCxlKXtjb25zdCBuPW5ldyBFNHQodGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgbUp0KHQsZSkpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKG4pLHRoaXMuY3VycmVudFBvaW50LnNldCh0LGUpLHRoaXN9cXVhZHJhdGljQ3VydmVUbyh0LGUsbixpKXtjb25zdCByPW5ldyBDNHQodGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgbUp0KHQsZSksbmV3IG1KdChuLGkpKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChyKSx0aGlzLmN1cnJlbnRQb2ludC5zZXQobixpKSx0aGlzfWJlemllckN1cnZlVG8odCxlLG4saSxyLG8pe2NvbnN0IGE9bmV3IFM0dCh0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBtSnQodCxlKSxuZXcgbUp0KG4saSksbmV3IG1KdChyLG8pKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChhKSx0aGlzLmN1cnJlbnRQb2ludC5zZXQocixvKSx0aGlzfXNwbGluZVRocnUodCl7Y29uc3QgZT1bdGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKV0uY29uY2F0KHQpLG49bmV3IGs0dChlKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChuKSx0aGlzLmN1cnJlbnRQb2ludC5jb3B5KHRbdC5sZW5ndGgtMV0pLHRoaXN9YXJjKHQsZSxuLGkscixvKXtyZXR1cm4gdGhpcy5hYnNhcmModCt0aGlzLmN1cnJlbnRQb2ludC54LGUrdGhpcy5jdXJyZW50UG9pbnQueSxuLGkscixvKSx0aGlzfWFic2FyYyh0LGUsbixpLHIsbyl7cmV0dXJuIHRoaXMuYWJzZWxsaXBzZSh0LGUsbixuLGkscixvKSx0aGlzfWVsbGlwc2UodCxlLG4saSxyLG8sYSxzKXtyZXR1cm4gdGhpcy5hYnNlbGxpcHNlKHQrdGhpcy5jdXJyZW50UG9pbnQueCxlK3RoaXMuY3VycmVudFBvaW50LnksbixpLHIsbyxhLHMpLHRoaXN9YWJzZWxsaXBzZSh0LGUsbixpLHIsbyxhLHMpe2NvbnN0IGw9bmV3IGQ0dCh0LGUsbixpLHIsbyxhLHMpO2lmKHRoaXMuY3VydmVzLmxlbmd0aD4wKXtjb25zdCB0PWwuZ2V0UG9pbnQoMCk7dC5lcXVhbHModGhpcy5jdXJyZW50UG9pbnQpfHx0aGlzLmxpbmVUbyh0LngsdC55KX10aGlzLmN1cnZlcy5wdXNoKGwpO2NvbnN0IGM9bC5nZXRQb2ludCgxKTtyZXR1cm4gdGhpcy5jdXJyZW50UG9pbnQuY29weShjKSx0aGlzfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jdXJyZW50UG9pbnQuY29weSh0LmN1cnJlbnRQb2ludCksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LmN1cnJlbnRQb2ludD10aGlzLmN1cnJlbnRQb2ludC50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KHQuY3VycmVudFBvaW50KSx0aGlzfX1jbGFzcyByOXQgZXh0ZW5kcyBpOXR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy51dWlkPVhadCgpLHRoaXMudHlwZT0iU2hhcGUiLHRoaXMuaG9sZXM9W119Z2V0UG9pbnRzSG9sZXModCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MCxpPXRoaXMuaG9sZXMubGVuZ3RoO248aTtuKyspZVtuXT10aGlzLmhvbGVzW25dLmdldFBvaW50cyh0KTtyZXR1cm4gZX1leHRyYWN0UG9pbnRzKHQpe3JldHVybntzaGFwZTp0aGlzLmdldFBvaW50cyh0KSxob2xlczp0aGlzLmdldFBvaW50c0hvbGVzKHQpfX1jb3B5KHQpe3N1cGVyLmNvcHkodCksdGhpcy5ob2xlcz1bXTtmb3IobGV0IGU9MCxuPXQuaG9sZXMubGVuZ3RoO2U8bjtlKyspdGhpcy5ob2xlcy5wdXNoKHQuaG9sZXNbZV0uY2xvbmUoKSk7cmV0dXJuIHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTt0LnV1aWQ9dGhpcy51dWlkLHQuaG9sZXM9W107Zm9yKGxldCBlPTAsbj10aGlzLmhvbGVzLmxlbmd0aDtlPG47ZSsrKXQuaG9sZXMucHVzaCh0aGlzLmhvbGVzW2VdLnRvSlNPTigpKTtyZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLnV1aWQ9dC51dWlkLHRoaXMuaG9sZXM9W107Zm9yKGxldCBlPTAsbj10LmhvbGVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBuPXQuaG9sZXNbZV07dGhpcy5ob2xlcy5wdXNoKChuZXcgaTl0KS5mcm9tSlNPTihuKSl9cmV0dXJuIHRoaXN9fWNsYXNzIG85dCBleHRlbmRzIGtRdHtjb25zdHJ1Y3Rvcih0LGU9MSl7c3VwZXIoKSx0aGlzLnR5cGU9IkxpZ2h0Iix0aGlzLmNvbG9yPW5ldyAkUXQodCksdGhpcy5pbnRlbnNpdHk9ZX1kaXNwb3NlKCl7fWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMuaW50ZW5zaXR5PXQuaW50ZW5zaXR5LHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO3JldHVybiBlLm9iamVjdC5jb2xvcj10aGlzLmNvbG9yLmdldEhleCgpLGUub2JqZWN0LmludGVuc2l0eT10aGlzLmludGVuc2l0eSx2b2lkIDAhPT10aGlzLmdyb3VuZENvbG9yJiYoZS5vYmplY3QuZ3JvdW5kQ29sb3I9dGhpcy5ncm91bmRDb2xvci5nZXRIZXgoKSksdm9pZCAwIT09dGhpcy5kaXN0YW5jZSYmKGUub2JqZWN0LmRpc3RhbmNlPXRoaXMuZGlzdGFuY2UpLHZvaWQgMCE9PXRoaXMuYW5nbGUmJihlLm9iamVjdC5hbmdsZT10aGlzLmFuZ2xlKSx2b2lkIDAhPT10aGlzLmRlY2F5JiYoZS5vYmplY3QuZGVjYXk9dGhpcy5kZWNheSksdm9pZCAwIT09dGhpcy5wZW51bWJyYSYmKGUub2JqZWN0LnBlbnVtYnJhPXRoaXMucGVudW1icmEpLHZvaWQgMCE9PXRoaXMuc2hhZG93JiYoZS5vYmplY3Quc2hhZG93PXRoaXMuc2hhZG93LnRvSlNPTigpKSxlfX1vOXQucHJvdG90eXBlLmlzTGlnaHQ9ITA7Y2xhc3MgYTl0IGV4dGVuZHMgbzl0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcih0LG4pLHRoaXMudHlwZT0iSGVtaXNwaGVyZUxpZ2h0Iix0aGlzLnBvc2l0aW9uLmNvcHkoa1F0LkRlZmF1bHRVcCksdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLmdyb3VuZENvbG9yPW5ldyAkUXQoZSl9Y29weSh0KXtyZXR1cm4gbzl0LnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyx0KSx0aGlzLmdyb3VuZENvbG9yLmNvcHkodC5ncm91bmRDb2xvciksdGhpc319YTl0LnByb3RvdHlwZS5pc0hlbWlzcGhlcmVMaWdodD0hMDtjb25zdCBzOXQ9bmV3IHJRdCxsOXQ9bmV3IENKdCxjOXQ9bmV3IENKdDtjbGFzcyB1OXR7Y29uc3RydWN0b3IodCl7dGhpcy5jYW1lcmE9dCx0aGlzLmJpYXM9MCx0aGlzLm5vcm1hbEJpYXM9MCx0aGlzLnJhZGl1cz0xLHRoaXMubWFwU2l6ZT1uZXcgbUp0KDUxMiw1MTIpLHRoaXMubWFwPW51bGwsdGhpcy5tYXBQYXNzPW51bGwsdGhpcy5tYXRyaXg9bmV3IHJRdCx0aGlzLmF1dG9VcGRhdGU9ITAsdGhpcy5uZWVkc1VwZGF0ZT0hMSx0aGlzLl9mcnVzdHVtPW5ldyBpMHQsdGhpcy5fZnJhbWVFeHRlbnRzPW5ldyBtSnQoMSwxKSx0aGlzLl92aWV3cG9ydENvdW50PTEsdGhpcy5fdmlld3BvcnRzPVtuZXcgd0p0KDAsMCwxLDEpXX1nZXRWaWV3cG9ydENvdW50KCl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0Q291bnR9Z2V0RnJ1c3R1bSgpe3JldHVybiB0aGlzLl9mcnVzdHVtfXVwZGF0ZU1hdHJpY2VzKHQpe2NvbnN0IGU9dGhpcy5jYW1lcmEsbj10aGlzLm1hdHJpeDtsOXQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQubWF0cml4V29ybGQpLGUucG9zaXRpb24uY29weShsOXQpLGM5dC5zZXRGcm9tTWF0cml4UG9zaXRpb24odC50YXJnZXQubWF0cml4V29ybGQpLGUubG9va0F0KGM5dCksZS51cGRhdGVNYXRyaXhXb3JsZCgpLHM5dC5tdWx0aXBseU1hdHJpY2VzKGUucHJvamVjdGlvbk1hdHJpeCxlLm1hdHJpeFdvcmxkSW52ZXJzZSksdGhpcy5fZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChzOXQpLG4uc2V0KC41LDAsMCwuNSwwLC41LDAsLjUsMCwwLC41LC41LDAsMCwwLDEpLG4ubXVsdGlwbHkoZS5wcm9qZWN0aW9uTWF0cml4KSxuLm11bHRpcGx5KGUubWF0cml4V29ybGRJbnZlcnNlKX1nZXRWaWV3cG9ydCh0KXtyZXR1cm4gdGhpcy5fdmlld3BvcnRzW3RdfWdldEZyYW1lRXh0ZW50cygpe3JldHVybiB0aGlzLl9mcmFtZUV4dGVudHN9ZGlzcG9zZSgpe3RoaXMubWFwJiZ0aGlzLm1hcC5kaXNwb3NlKCksdGhpcy5tYXBQYXNzJiZ0aGlzLm1hcFBhc3MuZGlzcG9zZSgpfWNvcHkodCl7cmV0dXJuIHRoaXMuY2FtZXJhPXQuY2FtZXJhLmNsb25lKCksdGhpcy5iaWFzPXQuYmlhcyx0aGlzLnJhZGl1cz10LnJhZGl1cyx0aGlzLm1hcFNpemUuY29weSh0Lm1hcFNpemUpLHRoaXN9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9dG9KU09OKCl7Y29uc3QgdD17fTtyZXR1cm4gMCE9PXRoaXMuYmlhcyYmKHQuYmlhcz10aGlzLmJpYXMpLDAhPT10aGlzLm5vcm1hbEJpYXMmJih0Lm5vcm1hbEJpYXM9dGhpcy5ub3JtYWxCaWFzKSwxIT09dGhpcy5yYWRpdXMmJih0LnJhZGl1cz10aGlzLnJhZGl1cyksNTEyPT09dGhpcy5tYXBTaXplLngmJjUxMj09PXRoaXMubWFwU2l6ZS55fHwodC5tYXBTaXplPXRoaXMubWFwU2l6ZS50b0FycmF5KCkpLHQuY2FtZXJhPXRoaXMuY2FtZXJhLnRvSlNPTighMSkub2JqZWN0LGRlbGV0ZSB0LmNhbWVyYS5tYXRyaXgsdH19Y2xhc3MgaDl0IGV4dGVuZHMgdTl0e2NvbnN0cnVjdG9yKCl7c3VwZXIobmV3IHExdCg1MCwxLC41LDUwMCkpLHRoaXMuZm9jdXM9MX11cGRhdGVNYXRyaWNlcyh0KXtjb25zdCBlPXRoaXMuY2FtZXJhLG49MipZWnQqdC5hbmdsZSp0aGlzLmZvY3VzLGk9dGhpcy5tYXBTaXplLndpZHRoL3RoaXMubWFwU2l6ZS5oZWlnaHQscj10LmRpc3RhbmNlfHxlLmZhcjtuPT09ZS5mb3YmJmk9PT1lLmFzcGVjdCYmcj09PWUuZmFyfHwoZS5mb3Y9bixlLmFzcGVjdD1pLGUuZmFyPXIsZS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCkpLHN1cGVyLnVwZGF0ZU1hdHJpY2VzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5mb2N1cz10LmZvY3VzLHRoaXN9fWg5dC5wcm90b3R5cGUuaXNTcG90TGlnaHRTaGFkb3c9ITA7Y2xhc3MgZDl0IGV4dGVuZHMgbzl0e2NvbnN0cnVjdG9yKHQsZSxuPTAsaT1NYXRoLlBJLzMscj0wLG89MSl7c3VwZXIodCxlKSx0aGlzLnR5cGU9IlNwb3RMaWdodCIsdGhpcy5wb3NpdGlvbi5jb3B5KGtRdC5EZWZhdWx0VXApLHRoaXMudXBkYXRlTWF0cml4KCksdGhpcy50YXJnZXQ9bmV3IGtRdCx0aGlzLmRpc3RhbmNlPW4sdGhpcy5hbmdsZT1pLHRoaXMucGVudW1icmE9cix0aGlzLmRlY2F5PW8sdGhpcy5zaGFkb3c9bmV3IGg5dH1nZXQgcG93ZXIoKXtyZXR1cm4gdGhpcy5pbnRlbnNpdHkqTWF0aC5QSX1zZXQgcG93ZXIodCl7dGhpcy5pbnRlbnNpdHk9dC9NYXRoLlBJfWRpc3Bvc2UoKXt0aGlzLnNoYWRvdy5kaXNwb3NlKCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmRpc3RhbmNlPXQuZGlzdGFuY2UsdGhpcy5hbmdsZT10LmFuZ2xlLHRoaXMucGVudW1icmE9dC5wZW51bWJyYSx0aGlzLmRlY2F5PXQuZGVjYXksdGhpcy50YXJnZXQ9dC50YXJnZXQuY2xvbmUoKSx0aGlzLnNoYWRvdz10LnNoYWRvdy5jbG9uZSgpLHRoaXN9fWQ5dC5wcm90b3R5cGUuaXNTcG90TGlnaHQ9ITA7Y29uc3QgcDl0PW5ldyByUXQsZjl0PW5ldyBDSnQsbTl0PW5ldyBDSnQ7Y2xhc3MgZzl0IGV4dGVuZHMgdTl0e2NvbnN0cnVjdG9yKCl7c3VwZXIobmV3IHExdCg5MCwxLC41LDUwMCkpLHRoaXMuX2ZyYW1lRXh0ZW50cz1uZXcgbUp0KDQsMiksdGhpcy5fdmlld3BvcnRDb3VudD02LHRoaXMuX3ZpZXdwb3J0cz1bbmV3IHdKdCgyLDEsMSwxKSxuZXcgd0p0KDAsMSwxLDEpLG5ldyB3SnQoMywxLDEsMSksbmV3IHdKdCgxLDEsMSwxKSxuZXcgd0p0KDMsMCwxLDEpLG5ldyB3SnQoMSwwLDEsMSldLHRoaXMuX2N1YmVEaXJlY3Rpb25zPVtuZXcgQ0p0KDEsMCwwKSxuZXcgQ0p0KC0xLDAsMCksbmV3IENKdCgwLDAsMSksbmV3IENKdCgwLDAsLTEpLG5ldyBDSnQoMCwxLDApLG5ldyBDSnQoMCwtMSwwKV0sdGhpcy5fY3ViZVVwcz1bbmV3IENKdCgwLDEsMCksbmV3IENKdCgwLDEsMCksbmV3IENKdCgwLDEsMCksbmV3IENKdCgwLDEsMCksbmV3IENKdCgwLDAsMSksbmV3IENKdCgwLDAsLTEpXX11cGRhdGVNYXRyaWNlcyh0LGU9MCl7Y29uc3Qgbj10aGlzLmNhbWVyYSxpPXRoaXMubWF0cml4LHI9dC5kaXN0YW5jZXx8bi5mYXI7ciE9PW4uZmFyJiYobi5mYXI9cixuLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSksZjl0LnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKSxuLnBvc2l0aW9uLmNvcHkoZjl0KSxtOXQuY29weShuLnBvc2l0aW9uKSxtOXQuYWRkKHRoaXMuX2N1YmVEaXJlY3Rpb25zW2VdKSxuLnVwLmNvcHkodGhpcy5fY3ViZVVwc1tlXSksbi5sb29rQXQobTl0KSxuLnVwZGF0ZU1hdHJpeFdvcmxkKCksaS5tYWtlVHJhbnNsYXRpb24oLWY5dC54LC1mOXQueSwtZjl0LnopLHA5dC5tdWx0aXBseU1hdHJpY2VzKG4ucHJvamVjdGlvbk1hdHJpeCxuLm1hdHJpeFdvcmxkSW52ZXJzZSksdGhpcy5fZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChwOXQpfX1nOXQucHJvdG90eXBlLmlzUG9pbnRMaWdodFNoYWRvdz0hMDtjbGFzcyBfOXQgZXh0ZW5kcyBvOXR7Y29uc3RydWN0b3IodCxlLG49MCxpPTEpe3N1cGVyKHQsZSksdGhpcy50eXBlPSJQb2ludExpZ2h0Iix0aGlzLmRpc3RhbmNlPW4sdGhpcy5kZWNheT1pLHRoaXMuc2hhZG93PW5ldyBnOXR9Z2V0IHBvd2VyKCl7cmV0dXJuIDQqdGhpcy5pbnRlbnNpdHkqTWF0aC5QSX1zZXQgcG93ZXIodCl7dGhpcy5pbnRlbnNpdHk9dC8oNCpNYXRoLlBJKX1kaXNwb3NlKCl7dGhpcy5zaGFkb3cuZGlzcG9zZSgpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5kaXN0YW5jZT10LmRpc3RhbmNlLHRoaXMuZGVjYXk9dC5kZWNheSx0aGlzLnNoYWRvdz10LnNoYWRvdy5jbG9uZSgpLHRoaXN9fV85dC5wcm90b3R5cGUuaXNQb2ludExpZ2h0PSEwO2NsYXNzIHk5dCBleHRlbmRzIHU5dHtjb25zdHJ1Y3Rvcigpe3N1cGVyKG5ldyBnMHQoLTUsNSw1LC01LC41LDUwMCkpfX15OXQucHJvdG90eXBlLmlzRGlyZWN0aW9uYWxMaWdodFNoYWRvdz0hMDtjbGFzcyB2OXQgZXh0ZW5kcyBvOXR7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpLHRoaXMudHlwZT0iRGlyZWN0aW9uYWxMaWdodCIsdGhpcy5wb3NpdGlvbi5jb3B5KGtRdC5EZWZhdWx0VXApLHRoaXMudXBkYXRlTWF0cml4KCksdGhpcy50YXJnZXQ9bmV3IGtRdCx0aGlzLnNoYWRvdz1uZXcgeTl0fWRpc3Bvc2UoKXt0aGlzLnNoYWRvdy5kaXNwb3NlKCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnRhcmdldD10LnRhcmdldC5jbG9uZSgpLHRoaXMuc2hhZG93PXQuc2hhZG93LmNsb25lKCksdGhpc319djl0LnByb3RvdHlwZS5pc0RpcmVjdGlvbmFsTGlnaHQ9ITA7Y2xhc3MgYjl0IGV4dGVuZHMgbzl0e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLnR5cGU9IkFtYmllbnRMaWdodCJ9fWI5dC5wcm90b3R5cGUuaXNBbWJpZW50TGlnaHQ9ITA7Y2xhc3MgeDl0IGV4dGVuZHMgbzl0e2NvbnN0cnVjdG9yKHQsZSxuPTEwLGk9MTApe3N1cGVyKHQsZSksdGhpcy50eXBlPSJSZWN0QXJlYUxpZ2h0Iix0aGlzLndpZHRoPW4sdGhpcy5oZWlnaHQ9aX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMud2lkdGg9dC53aWR0aCx0aGlzLmhlaWdodD10LmhlaWdodCx0aGlzfXRvSlNPTih0KXtjb25zdCBlPXN1cGVyLnRvSlNPTih0KTtyZXR1cm4gZS5vYmplY3Qud2lkdGg9dGhpcy53aWR0aCxlLm9iamVjdC5oZWlnaHQ9dGhpcy5oZWlnaHQsZX19eDl0LnByb3RvdHlwZS5pc1JlY3RBcmVhTGlnaHQ9ITA7Y2xhc3Mgdzl0e2NvbnN0cnVjdG9yKCl7dGhpcy5jb2VmZmljaWVudHM9W107Zm9yKGxldCB0PTA7dDw5O3QrKyl0aGlzLmNvZWZmaWNpZW50cy5wdXNoKG5ldyBDSnQpfXNldCh0KXtmb3IobGV0IGU9MDtlPDk7ZSsrKXRoaXMuY29lZmZpY2llbnRzW2VdLmNvcHkodFtlXSk7cmV0dXJuIHRoaXN9emVybygpe2ZvcihsZXQgdD0wO3Q8OTt0KyspdGhpcy5jb2VmZmljaWVudHNbdF0uc2V0KDAsMCwwKTtyZXR1cm4gdGhpc31nZXRBdCh0LGUpe2NvbnN0IG49dC54LGk9dC55LHI9dC56LG89dGhpcy5jb2VmZmljaWVudHM7cmV0dXJuIGUuY29weShvWzBdKS5tdWx0aXBseVNjYWxhciguMjgyMDk1KSxlLmFkZFNjYWxlZFZlY3RvcihvWzFdLC40ODg2MDMqaSksZS5hZGRTY2FsZWRWZWN0b3Iob1syXSwuNDg4NjAzKnIpLGUuYWRkU2NhbGVkVmVjdG9yKG9bM10sLjQ4ODYwMypuKSxlLmFkZFNjYWxlZFZlY3RvcihvWzRdLG4qaSoxLjA5MjU0OCksZS5hZGRTY2FsZWRWZWN0b3Iob1s1XSxpKnIqMS4wOTI1NDgpLGUuYWRkU2NhbGVkVmVjdG9yKG9bNl0sLjMxNTM5MiooMypyKnItMSkpLGUuYWRkU2NhbGVkVmVjdG9yKG9bN10sbipyKjEuMDkyNTQ4KSxlLmFkZFNjYWxlZFZlY3RvcihvWzhdLC41NDYyNzQqKG4qbi1pKmkpKSxlfWdldElycmFkaWFuY2VBdCh0LGUpe2NvbnN0IG49dC54LGk9dC55LHI9dC56LG89dGhpcy5jb2VmZmljaWVudHM7cmV0dXJuIGUuY29weShvWzBdKS5tdWx0aXBseVNjYWxhciguODg2MjI3KSxlLmFkZFNjYWxlZFZlY3RvcihvWzFdLDEuMDIzMzI4KmkpLGUuYWRkU2NhbGVkVmVjdG9yKG9bMl0sMS4wMjMzMjgqciksZS5hZGRTY2FsZWRWZWN0b3Iob1szXSwxLjAyMzMyOCpuKSxlLmFkZFNjYWxlZFZlY3RvcihvWzRdLC44NTgwODYqbippKSxlLmFkZFNjYWxlZFZlY3RvcihvWzVdLC44NTgwODYqaSpyKSxlLmFkZFNjYWxlZFZlY3RvcihvWzZdLC43NDMxMjUqcipyLS4yNDc3MDgpLGUuYWRkU2NhbGVkVmVjdG9yKG9bN10sLjg1ODA4NipuKnIpLGUuYWRkU2NhbGVkVmVjdG9yKG9bOF0sLjQyOTA0MyoobipuLWkqaSkpLGV9YWRkKHQpe2ZvcihsZXQgZT0wO2U8OTtlKyspdGhpcy5jb2VmZmljaWVudHNbZV0uYWRkKHQuY29lZmZpY2llbnRzW2VdKTtyZXR1cm4gdGhpc31hZGRTY2FsZWRTSCh0LGUpe2ZvcihsZXQgbj0wO248OTtuKyspdGhpcy5jb2VmZmljaWVudHNbbl0uYWRkU2NhbGVkVmVjdG9yKHQuY29lZmZpY2llbnRzW25dLGUpO3JldHVybiB0aGlzfXNjYWxlKHQpe2ZvcihsZXQgZT0wO2U8OTtlKyspdGhpcy5jb2VmZmljaWVudHNbZV0ubXVsdGlwbHlTY2FsYXIodCk7cmV0dXJuIHRoaXN9bGVycCh0LGUpe2ZvcihsZXQgbj0wO248OTtuKyspdGhpcy5jb2VmZmljaWVudHNbbl0ubGVycCh0LmNvZWZmaWNpZW50c1tuXSxlKTtyZXR1cm4gdGhpc31lcXVhbHModCl7Zm9yKGxldCBlPTA7ZTw5O2UrKylpZighdGhpcy5jb2VmZmljaWVudHNbZV0uZXF1YWxzKHQuY29lZmZpY2llbnRzW2VdKSlyZXR1cm4hMTtyZXR1cm4hMH1jb3B5KHQpe3JldHVybiB0aGlzLnNldCh0LmNvZWZmaWNpZW50cyl9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9ZnJvbUFycmF5KHQsZT0wKXtjb25zdCBuPXRoaXMuY29lZmZpY2llbnRzO2ZvcihsZXQgaT0wO2k8OTtpKyspbltpXS5mcm9tQXJyYXkodCxlKzMqaSk7cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgbj10aGlzLmNvZWZmaWNpZW50cztmb3IobGV0IGk9MDtpPDk7aSsrKW5baV0udG9BcnJheSh0LGUrMyppKTtyZXR1cm4gdH1zdGF0aWMgZ2V0QmFzaXNBdCh0LGUpe2NvbnN0IG49dC54LGk9dC55LHI9dC56O2VbMF09LjI4MjA5NSxlWzFdPS40ODg2MDMqaSxlWzJdPS40ODg2MDMqcixlWzNdPS40ODg2MDMqbixlWzRdPTEuMDkyNTQ4Km4qaSxlWzVdPTEuMDkyNTQ4KmkqcixlWzZdPS4zMTUzOTIqKDMqcipyLTEpLGVbN109MS4wOTI1NDgqbipyLGVbOF09LjU0NjI3NCoobipuLWkqaSl9fXc5dC5wcm90b3R5cGUuaXNTcGhlcmljYWxIYXJtb25pY3MzPSEwO2NsYXNzIFM5dCBleHRlbmRzIG85dHtjb25zdHJ1Y3Rvcih0PW5ldyB3OXQsZT0xKXtzdXBlcih2b2lkIDAsZSksdGhpcy5zaD10fWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5zaC5jb3B5KHQuc2gpLHRoaXN9ZnJvbUpTT04odCl7cmV0dXJuIHRoaXMuaW50ZW5zaXR5PXQuaW50ZW5zaXR5LHRoaXMuc2guZnJvbUFycmF5KHQuc2gpLHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO3JldHVybiBlLm9iamVjdC5zaD10aGlzLnNoLnRvQXJyYXkoKSxlfX1TOXQucHJvdG90eXBlLmlzTGlnaHRQcm9iZT0hMDtjbGFzcyBNOXQgZXh0ZW5kcyAkNnR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy50ZXh0dXJlcz17fX1sb2FkKHQsZSxuLGkpe2NvbnN0IHI9dGhpcyxvPW5ldyBaNnQoci5tYW5hZ2VyKTtvLnNldFBhdGgoci5wYXRoKSxvLnNldFJlcXVlc3RIZWFkZXIoci5yZXF1ZXN0SGVhZGVyKSxvLnNldFdpdGhDcmVkZW50aWFscyhyLndpdGhDcmVkZW50aWFscyksby5sb2FkKHQsKGZ1bmN0aW9uKG4pe3RyeXtlKHIucGFyc2UoSlNPTi5wYXJzZShuKSkpfWNhdGNoKGUpe2k/aShlKTpjb25zb2xlLmVycm9yKGUpLHIubWFuYWdlci5pdGVtRXJyb3IodCl9fSksbixpKX1wYXJzZSh0KXtjb25zdCBlPXRoaXMudGV4dHVyZXM7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdm9pZCAwPT09ZVt0XSYmY29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbExvYWRlcjogVW5kZWZpbmVkIHRleHR1cmUiLHQpLGVbdF19Y29uc3QgaT1uZXcgTDZ0W3QudHlwZV07aWYodm9pZCAwIT09dC51dWlkJiYoaS51dWlkPXQudXVpZCksdm9pZCAwIT09dC5uYW1lJiYoaS5uYW1lPXQubmFtZSksdm9pZCAwIT09dC5jb2xvciYmdm9pZCAwIT09aS5jb2xvciYmaS5jb2xvci5zZXRIZXgodC5jb2xvciksdm9pZCAwIT09dC5yb3VnaG5lc3MmJihpLnJvdWdobmVzcz10LnJvdWdobmVzcyksdm9pZCAwIT09dC5tZXRhbG5lc3MmJihpLm1ldGFsbmVzcz10Lm1ldGFsbmVzcyksdm9pZCAwIT09dC5zaGVlbiYmKGkuc2hlZW49KG5ldyAkUXQpLnNldEhleCh0LnNoZWVuKSksdm9pZCAwIT09dC5lbWlzc2l2ZSYmdm9pZCAwIT09aS5lbWlzc2l2ZSYmaS5lbWlzc2l2ZS5zZXRIZXgodC5lbWlzc2l2ZSksdm9pZCAwIT09dC5zcGVjdWxhciYmdm9pZCAwIT09aS5zcGVjdWxhciYmaS5zcGVjdWxhci5zZXRIZXgodC5zcGVjdWxhciksdm9pZCAwIT09dC5zcGVjdWxhckludGVuc2l0eSYmKGkuc3BlY3VsYXJJbnRlbnNpdHk9dC5zcGVjdWxhckludGVuc2l0eSksdm9pZCAwIT09dC5zcGVjdWxhclRpbnQmJnZvaWQgMCE9PWkuc3BlY3VsYXJUaW50JiZpLnNwZWN1bGFyVGludC5zZXRIZXgodC5zcGVjdWxhclRpbnQpLHZvaWQgMCE9PXQuc2hpbmluZXNzJiYoaS5zaGluaW5lc3M9dC5zaGluaW5lc3MpLHZvaWQgMCE9PXQuY2xlYXJjb2F0JiYoaS5jbGVhcmNvYXQ9dC5jbGVhcmNvYXQpLHZvaWQgMCE9PXQuY2xlYXJjb2F0Um91Z2huZXNzJiYoaS5jbGVhcmNvYXRSb3VnaG5lc3M9dC5jbGVhcmNvYXRSb3VnaG5lc3MpLHZvaWQgMCE9PXQudHJhbnNtaXNzaW9uJiYoaS50cmFuc21pc3Npb249dC50cmFuc21pc3Npb24pLHZvaWQgMCE9PXQudGhpY2tuZXNzJiYoaS50aGlja25lc3M9dC50aGlja25lc3MpLHZvaWQgMCE9PXQuYXR0ZW51YXRpb25EaXN0YW5jZSYmKGkuYXR0ZW51YXRpb25EaXN0YW5jZT10LmF0dGVudWF0aW9uRGlzdGFuY2UpLHZvaWQgMCE9PXQuYXR0ZW51YXRpb25UaW50JiZ2b2lkIDAhPT1pLmF0dGVudWF0aW9uVGludCYmaS5hdHRlbnVhdGlvblRpbnQuc2V0SGV4KHQuYXR0ZW51YXRpb25UaW50KSx2b2lkIDAhPT10LmZvZyYmKGkuZm9nPXQuZm9nKSx2b2lkIDAhPT10LmZsYXRTaGFkaW5nJiYoaS5mbGF0U2hhZGluZz10LmZsYXRTaGFkaW5nKSx2b2lkIDAhPT10LmJsZW5kaW5nJiYoaS5ibGVuZGluZz10LmJsZW5kaW5nKSx2b2lkIDAhPT10LmNvbWJpbmUmJihpLmNvbWJpbmU9dC5jb21iaW5lKSx2b2lkIDAhPT10LnNpZGUmJihpLnNpZGU9dC5zaWRlKSx2b2lkIDAhPT10LnNoYWRvd1NpZGUmJihpLnNoYWRvd1NpZGU9dC5zaGFkb3dTaWRlKSx2b2lkIDAhPT10Lm9wYWNpdHkmJihpLm9wYWNpdHk9dC5vcGFjaXR5KSx2b2lkIDAhPT10LnRyYW5zcGFyZW50JiYoaS50cmFuc3BhcmVudD10LnRyYW5zcGFyZW50KSx2b2lkIDAhPT10LmFscGhhVGVzdCYmKGkuYWxwaGFUZXN0PXQuYWxwaGFUZXN0KSx2b2lkIDAhPT10LmRlcHRoVGVzdCYmKGkuZGVwdGhUZXN0PXQuZGVwdGhUZXN0KSx2b2lkIDAhPT10LmRlcHRoV3JpdGUmJihpLmRlcHRoV3JpdGU9dC5kZXB0aFdyaXRlKSx2b2lkIDAhPT10LmNvbG9yV3JpdGUmJihpLmNvbG9yV3JpdGU9dC5jb2xvcldyaXRlKSx2b2lkIDAhPT10LnN0ZW5jaWxXcml0ZSYmKGkuc3RlbmNpbFdyaXRlPXQuc3RlbmNpbFdyaXRlKSx2b2lkIDAhPT10LnN0ZW5jaWxXcml0ZU1hc2smJihpLnN0ZW5jaWxXcml0ZU1hc2s9dC5zdGVuY2lsV3JpdGVNYXNrKSx2b2lkIDAhPT10LnN0ZW5jaWxGdW5jJiYoaS5zdGVuY2lsRnVuYz10LnN0ZW5jaWxGdW5jKSx2b2lkIDAhPT10LnN0ZW5jaWxSZWYmJihpLnN0ZW5jaWxSZWY9dC5zdGVuY2lsUmVmKSx2b2lkIDAhPT10LnN0ZW5jaWxGdW5jTWFzayYmKGkuc3RlbmNpbEZ1bmNNYXNrPXQuc3RlbmNpbEZ1bmNNYXNrKSx2b2lkIDAhPT10LnN0ZW5jaWxGYWlsJiYoaS5zdGVuY2lsRmFpbD10LnN0ZW5jaWxGYWlsKSx2b2lkIDAhPT10LnN0ZW5jaWxaRmFpbCYmKGkuc3RlbmNpbFpGYWlsPXQuc3RlbmNpbFpGYWlsKSx2b2lkIDAhPT10LnN0ZW5jaWxaUGFzcyYmKGkuc3RlbmNpbFpQYXNzPXQuc3RlbmNpbFpQYXNzKSx2b2lkIDAhPT10LndpcmVmcmFtZSYmKGkud2lyZWZyYW1lPXQud2lyZWZyYW1lKSx2b2lkIDAhPT10LndpcmVmcmFtZUxpbmV3aWR0aCYmKGkud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoKSx2b2lkIDAhPT10LndpcmVmcmFtZUxpbmVjYXAmJihpLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwKSx2b2lkIDAhPT10LndpcmVmcmFtZUxpbmVqb2luJiYoaS53aXJlZnJhbWVMaW5lam9pbj10LndpcmVmcmFtZUxpbmVqb2luKSx2b2lkIDAhPT10LnJvdGF0aW9uJiYoaS5yb3RhdGlvbj10LnJvdGF0aW9uKSwxIT09dC5saW5ld2lkdGgmJihpLmxpbmV3aWR0aD10LmxpbmV3aWR0aCksdm9pZCAwIT09dC5kYXNoU2l6ZSYmKGkuZGFzaFNpemU9dC5kYXNoU2l6ZSksdm9pZCAwIT09dC5nYXBTaXplJiYoaS5nYXBTaXplPXQuZ2FwU2l6ZSksdm9pZCAwIT09dC5zY2FsZSYmKGkuc2NhbGU9dC5zY2FsZSksdm9pZCAwIT09dC5wb2x5Z29uT2Zmc2V0JiYoaS5wb2x5Z29uT2Zmc2V0PXQucG9seWdvbk9mZnNldCksdm9pZCAwIT09dC5wb2x5Z29uT2Zmc2V0RmFjdG9yJiYoaS5wb2x5Z29uT2Zmc2V0RmFjdG9yPXQucG9seWdvbk9mZnNldEZhY3Rvciksdm9pZCAwIT09dC5wb2x5Z29uT2Zmc2V0VW5pdHMmJihpLnBvbHlnb25PZmZzZXRVbml0cz10LnBvbHlnb25PZmZzZXRVbml0cyksdm9pZCAwIT09dC5kaXRoZXJpbmcmJihpLmRpdGhlcmluZz10LmRpdGhlcmluZyksdm9pZCAwIT09dC5hbHBoYVRvQ292ZXJhZ2UmJihpLmFscGhhVG9Db3ZlcmFnZT10LmFscGhhVG9Db3ZlcmFnZSksdm9pZCAwIT09dC5wcmVtdWx0aXBsaWVkQWxwaGEmJihpLnByZW11bHRpcGxpZWRBbHBoYT10LnByZW11bHRpcGxpZWRBbHBoYSksdm9pZCAwIT09dC52aXNpYmxlJiYoaS52aXNpYmxlPXQudmlzaWJsZSksdm9pZCAwIT09dC50b25lTWFwcGVkJiYoaS50b25lTWFwcGVkPXQudG9uZU1hcHBlZCksdm9pZCAwIT09dC51c2VyRGF0YSYmKGkudXNlckRhdGE9dC51c2VyRGF0YSksdm9pZCAwIT09dC52ZXJ0ZXhDb2xvcnMmJihpLnZlcnRleENvbG9ycz0ibnVtYmVyIj09dHlwZW9mIHQudmVydGV4Q29sb3JzP3QudmVydGV4Q29sb3JzPjA6dC52ZXJ0ZXhDb2xvcnMpLHZvaWQgMCE9PXQudW5pZm9ybXMpZm9yKGNvbnN0IGUgaW4gdC51bmlmb3Jtcyl7Y29uc3Qgcj10LnVuaWZvcm1zW2VdO3N3aXRjaChpLnVuaWZvcm1zW2VdPXt9LHIudHlwZSl7Y2FzZSJ0IjppLnVuaWZvcm1zW2VdLnZhbHVlPW4oci52YWx1ZSk7YnJlYWs7Y2FzZSJjIjppLnVuaWZvcm1zW2VdLnZhbHVlPShuZXcgJFF0KS5zZXRIZXgoci52YWx1ZSk7YnJlYWs7Y2FzZSJ2MiI6aS51bmlmb3Jtc1tlXS52YWx1ZT0obmV3IG1KdCkuZnJvbUFycmF5KHIudmFsdWUpO2JyZWFrO2Nhc2UidjMiOmkudW5pZm9ybXNbZV0udmFsdWU9KG5ldyBDSnQpLmZyb21BcnJheShyLnZhbHVlKTticmVhaztjYXNlInY0IjppLnVuaWZvcm1zW2VdLnZhbHVlPShuZXcgd0p0KS5mcm9tQXJyYXkoci52YWx1ZSk7YnJlYWs7Y2FzZSJtMyI6aS51bmlmb3Jtc1tlXS52YWx1ZT0obmV3IGdKdCkuZnJvbUFycmF5KHIudmFsdWUpO2JyZWFrO2Nhc2UibTQiOmkudW5pZm9ybXNbZV0udmFsdWU9KG5ldyByUXQpLmZyb21BcnJheShyLnZhbHVlKTticmVhaztkZWZhdWx0OmkudW5pZm9ybXNbZV0udmFsdWU9ci52YWx1ZX19aWYodm9pZCAwIT09dC5kZWZpbmVzJiYoaS5kZWZpbmVzPXQuZGVmaW5lcyksdm9pZCAwIT09dC52ZXJ0ZXhTaGFkZXImJihpLnZlcnRleFNoYWRlcj10LnZlcnRleFNoYWRlciksdm9pZCAwIT09dC5mcmFnbWVudFNoYWRlciYmKGkuZnJhZ21lbnRTaGFkZXI9dC5mcmFnbWVudFNoYWRlciksdm9pZCAwIT09dC5leHRlbnNpb25zKWZvcihjb25zdCBlIGluIHQuZXh0ZW5zaW9ucylpLmV4dGVuc2lvbnNbZV09dC5leHRlbnNpb25zW2VdO2lmKHZvaWQgMCE9PXQuc2hhZGluZyYmKGkuZmxhdFNoYWRpbmc9MT09PXQuc2hhZGluZyksdm9pZCAwIT09dC5zaXplJiYoaS5zaXplPXQuc2l6ZSksdm9pZCAwIT09dC5zaXplQXR0ZW51YXRpb24mJihpLnNpemVBdHRlbnVhdGlvbj10LnNpemVBdHRlbnVhdGlvbiksdm9pZCAwIT09dC5tYXAmJihpLm1hcD1uKHQubWFwKSksdm9pZCAwIT09dC5tYXRjYXAmJihpLm1hdGNhcD1uKHQubWF0Y2FwKSksdm9pZCAwIT09dC5hbHBoYU1hcCYmKGkuYWxwaGFNYXA9bih0LmFscGhhTWFwKSksdm9pZCAwIT09dC5idW1wTWFwJiYoaS5idW1wTWFwPW4odC5idW1wTWFwKSksdm9pZCAwIT09dC5idW1wU2NhbGUmJihpLmJ1bXBTY2FsZT10LmJ1bXBTY2FsZSksdm9pZCAwIT09dC5ub3JtYWxNYXAmJihpLm5vcm1hbE1hcD1uKHQubm9ybWFsTWFwKSksdm9pZCAwIT09dC5ub3JtYWxNYXBUeXBlJiYoaS5ub3JtYWxNYXBUeXBlPXQubm9ybWFsTWFwVHlwZSksdm9pZCAwIT09dC5ub3JtYWxTY2FsZSl7bGV0IGU9dC5ub3JtYWxTY2FsZTshMT09PUFycmF5LmlzQXJyYXkoZSkmJihlPVtlLGVdKSxpLm5vcm1hbFNjYWxlPShuZXcgbUp0KS5mcm9tQXJyYXkoZSl9cmV0dXJuIHZvaWQgMCE9PXQuZGlzcGxhY2VtZW50TWFwJiYoaS5kaXNwbGFjZW1lbnRNYXA9bih0LmRpc3BsYWNlbWVudE1hcCkpLHZvaWQgMCE9PXQuZGlzcGxhY2VtZW50U2NhbGUmJihpLmRpc3BsYWNlbWVudFNjYWxlPXQuZGlzcGxhY2VtZW50U2NhbGUpLHZvaWQgMCE9PXQuZGlzcGxhY2VtZW50QmlhcyYmKGkuZGlzcGxhY2VtZW50Qmlhcz10LmRpc3BsYWNlbWVudEJpYXMpLHZvaWQgMCE9PXQucm91Z2huZXNzTWFwJiYoaS5yb3VnaG5lc3NNYXA9bih0LnJvdWdobmVzc01hcCkpLHZvaWQgMCE9PXQubWV0YWxuZXNzTWFwJiYoaS5tZXRhbG5lc3NNYXA9bih0Lm1ldGFsbmVzc01hcCkpLHZvaWQgMCE9PXQuZW1pc3NpdmVNYXAmJihpLmVtaXNzaXZlTWFwPW4odC5lbWlzc2l2ZU1hcCkpLHZvaWQgMCE9PXQuZW1pc3NpdmVJbnRlbnNpdHkmJihpLmVtaXNzaXZlSW50ZW5zaXR5PXQuZW1pc3NpdmVJbnRlbnNpdHkpLHZvaWQgMCE9PXQuc3BlY3VsYXJNYXAmJihpLnNwZWN1bGFyTWFwPW4odC5zcGVjdWxhck1hcCkpLHZvaWQgMCE9PXQuc3BlY3VsYXJJbnRlbnNpdHlNYXAmJihpLnNwZWN1bGFySW50ZW5zaXR5TWFwPW4odC5zcGVjdWxhckludGVuc2l0eU1hcCkpLHZvaWQgMCE9PXQuc3BlY3VsYXJUaW50TWFwJiYoaS5zcGVjdWxhclRpbnRNYXA9bih0LnNwZWN1bGFyVGludE1hcCkpLHZvaWQgMCE9PXQuZW52TWFwJiYoaS5lbnZNYXA9bih0LmVudk1hcCkpLHZvaWQgMCE9PXQuZW52TWFwSW50ZW5zaXR5JiYoaS5lbnZNYXBJbnRlbnNpdHk9dC5lbnZNYXBJbnRlbnNpdHkpLHZvaWQgMCE9PXQucmVmbGVjdGl2aXR5JiYoaS5yZWZsZWN0aXZpdHk9dC5yZWZsZWN0aXZpdHkpLHZvaWQgMCE9PXQucmVmcmFjdGlvblJhdGlvJiYoaS5yZWZyYWN0aW9uUmF0aW89dC5yZWZyYWN0aW9uUmF0aW8pLHZvaWQgMCE9PXQubGlnaHRNYXAmJihpLmxpZ2h0TWFwPW4odC5saWdodE1hcCkpLHZvaWQgMCE9PXQubGlnaHRNYXBJbnRlbnNpdHkmJihpLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHkpLHZvaWQgMCE9PXQuYW9NYXAmJihpLmFvTWFwPW4odC5hb01hcCkpLHZvaWQgMCE9PXQuYW9NYXBJbnRlbnNpdHkmJihpLmFvTWFwSW50ZW5zaXR5PXQuYW9NYXBJbnRlbnNpdHkpLHZvaWQgMCE9PXQuZ3JhZGllbnRNYXAmJihpLmdyYWRpZW50TWFwPW4odC5ncmFkaWVudE1hcCkpLHZvaWQgMCE9PXQuY2xlYXJjb2F0TWFwJiYoaS5jbGVhcmNvYXRNYXA9bih0LmNsZWFyY29hdE1hcCkpLHZvaWQgMCE9PXQuY2xlYXJjb2F0Um91Z2huZXNzTWFwJiYoaS5jbGVhcmNvYXRSb3VnaG5lc3NNYXA9bih0LmNsZWFyY29hdFJvdWdobmVzc01hcCkpLHZvaWQgMCE9PXQuY2xlYXJjb2F0Tm9ybWFsTWFwJiYoaS5jbGVhcmNvYXROb3JtYWxNYXA9bih0LmNsZWFyY29hdE5vcm1hbE1hcCkpLHZvaWQgMCE9PXQuY2xlYXJjb2F0Tm9ybWFsU2NhbGUmJihpLmNsZWFyY29hdE5vcm1hbFNjYWxlPShuZXcgbUp0KS5mcm9tQXJyYXkodC5jbGVhcmNvYXROb3JtYWxTY2FsZSkpLHZvaWQgMCE9PXQudHJhbnNtaXNzaW9uTWFwJiYoaS50cmFuc21pc3Npb25NYXA9bih0LnRyYW5zbWlzc2lvbk1hcCkpLHZvaWQgMCE9PXQudGhpY2tuZXNzTWFwJiYoaS50aGlja25lc3NNYXA9bih0LnRoaWNrbmVzc01hcCkpLGl9c2V0VGV4dHVyZXModCl7cmV0dXJuIHRoaXMudGV4dHVyZXM9dCx0aGlzfX1jbGFzcyBFOXR7c3RhdGljIGRlY29kZVRleHQodCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBUZXh0RGVjb2RlcilyZXR1cm4obmV3IFRleHREZWNvZGVyKS5kZWNvZGUodCk7bGV0IGU9IiI7Zm9yKGxldCBuPTAsaT10Lmxlbmd0aDtuPGk7bisrKWUrPVN0cmluZy5mcm9tQ2hhckNvZGUodFtuXSk7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGUpKX1jYXRjaCh0KXtyZXR1cm4gZX19c3RhdGljIGV4dHJhY3RVcmxCYXNlKHQpe2NvbnN0IGU9dC5sYXN0SW5kZXhPZigiLyIpO3JldHVybi0xPT09ZT8iLi8iOnQuc3Vic3RyKDAsZSsxKX19Y2xhc3MgVDl0IGV4dGVuZHMgYjF0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnR5cGU9Ikluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5Iix0aGlzLmluc3RhbmNlQ291bnQ9MS8wfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5pbnN0YW5jZUNvdW50PXQuaW5zdGFuY2VDb3VudCx0aGlzfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKHRoaXMpO3JldHVybiB0Lmluc3RhbmNlQ291bnQ9dGhpcy5pbnN0YW5jZUNvdW50LHQuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT0hMCx0fX1UOXQucHJvdG90eXBlLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk9ITA7Y2xhc3MgQzl0IGV4dGVuZHMgUVF0e2NvbnN0cnVjdG9yKHQsZSxuLGk9MSl7Im51bWJlciI9PXR5cGVvZiBuJiYoaT1uLG49ITEsY29uc29sZS5lcnJvcigiVEhSRUUuSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlOiBUaGUgY29uc3RydWN0b3Igbm93IGV4cGVjdHMgbm9ybWFsaXplZCBhcyB0aGUgdGhpcmQgYXJndW1lbnQuIikpLHN1cGVyKHQsZSxuKSx0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9aX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMubWVzaFBlckF0dHJpYnV0ZT10Lm1lc2hQZXJBdHRyaWJ1dGUsdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0Lm1lc2hQZXJBdHRyaWJ1dGU9dGhpcy5tZXNoUGVyQXR0cmlidXRlLHQuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU9ITAsdH19Qzl0LnByb3RvdHlwZS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZT0hMDtjbGFzcyBBOXQgZXh0ZW5kcyAkNnR7Y29uc3RydWN0b3IodCl7c3VwZXIodCl9bG9hZCh0LGUsbixpKXtjb25zdCByPXRoaXMsbz1uZXcgWjZ0KHIubWFuYWdlcik7by5zZXRQYXRoKHIucGF0aCksby5zZXRSZXF1ZXN0SGVhZGVyKHIucmVxdWVzdEhlYWRlciksby5zZXRXaXRoQ3JlZGVudGlhbHMoci53aXRoQ3JlZGVudGlhbHMpLG8ubG9hZCh0LChmdW5jdGlvbihuKXt0cnl7ZShyLnBhcnNlKEpTT04ucGFyc2UobikpKX1jYXRjaChlKXtpP2koZSk6Y29uc29sZS5lcnJvcihlKSxyLm1hbmFnZXIuaXRlbUVycm9yKHQpfX0pLG4saSl9cGFyc2UodCl7Y29uc3QgZT17fSxuPXt9O2Z1bmN0aW9uIGkodCxpKXtpZih2b2lkIDAhPT1lW2ldKXJldHVybiBlW2ldO2NvbnN0IHI9dC5pbnRlcmxlYXZlZEJ1ZmZlcnNbaV0sbz0oZnVuY3Rpb24gYSh0LGUpe2lmKHZvaWQgMCE9PW5bZV0pcmV0dXJuIG5bZV07Y29uc3QgaT1uZXcgVWludDMyQXJyYXkodC5hcnJheUJ1ZmZlcnNbZV0pLmJ1ZmZlcjtyZXR1cm4gbltlXT1pLGl9KSh0LHIuYnVmZmVyKSxzPWQxdChyLnR5cGUsbyksbD1uZXcgJDV0KHMsci5zdHJpZGUpO3JldHVybiBsLnV1aWQ9ci51dWlkLGVbaV09bCxsfWNvbnN0IHI9dC5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5P25ldyBUOXQ6bmV3IGIxdCxvPXQuZGF0YS5pbmRleDtpZih2b2lkIDAhPT1vKXtjb25zdCB0PWQxdChvLnR5cGUsby5hcnJheSk7ci5zZXRJbmRleChuZXcgUVF0KHQsMSkpfWNvbnN0IGE9dC5kYXRhLmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGUgaW4gYSl7Y29uc3Qgbj1hW2VdO2xldCBvO2lmKG4uaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSl7Y29uc3QgZT1pKHQuZGF0YSxuLmRhdGEpO289bmV3IFo1dChlLG4uaXRlbVNpemUsbi5vZmZzZXQsbi5ub3JtYWxpemVkKX1lbHNle2NvbnN0IHQ9ZDF0KG4udHlwZSxuLmFycmF5KTtvPW5ldyhuLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlP0M5dDpRUXQpKHQsbi5pdGVtU2l6ZSxuLm5vcm1hbGl6ZWQpfXZvaWQgMCE9PW4ubmFtZSYmKG8ubmFtZT1uLm5hbWUpLHZvaWQgMCE9PW4udXNhZ2UmJm8uc2V0VXNhZ2Uobi51c2FnZSksdm9pZCAwIT09bi51cGRhdGVSYW5nZSYmKG8udXBkYXRlUmFuZ2Uub2Zmc2V0PW4udXBkYXRlUmFuZ2Uub2Zmc2V0LG8udXBkYXRlUmFuZ2UuY291bnQ9bi51cGRhdGVSYW5nZS5jb3VudCksci5zZXRBdHRyaWJ1dGUoZSxvKX1jb25zdCBzPXQuZGF0YS5tb3JwaEF0dHJpYnV0ZXM7aWYocylmb3IoY29uc3QgZSBpbiBzKXtjb25zdCBuPXNbZV0sbz1bXTtmb3IobGV0IGU9MCxyPW4ubGVuZ3RoO2U8cjtlKyspe2NvbnN0IHI9bltlXTtsZXQgYTtpZihyLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IGU9aSh0LmRhdGEsci5kYXRhKTthPW5ldyBaNXQoZSxyLml0ZW1TaXplLHIub2Zmc2V0LHIubm9ybWFsaXplZCl9ZWxzZXtjb25zdCB0PWQxdChyLnR5cGUsci5hcnJheSk7YT1uZXcgUVF0KHQsci5pdGVtU2l6ZSxyLm5vcm1hbGl6ZWQpfXZvaWQgMCE9PXIubmFtZSYmKGEubmFtZT1yLm5hbWUpLG8ucHVzaChhKX1yLm1vcnBoQXR0cmlidXRlc1tlXT1vfXQuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZSYmKHIubW9ycGhUYXJnZXRzUmVsYXRpdmU9ITApO2NvbnN0IGw9dC5kYXRhLmdyb3Vwc3x8dC5kYXRhLmRyYXdjYWxsc3x8dC5kYXRhLm9mZnNldHM7aWYodm9pZCAwIT09bClmb3IobGV0IHQ9MCxlPWwubGVuZ3RoO3QhPT1lOysrdCl7Y29uc3QgZT1sW3RdO3IuYWRkR3JvdXAoZS5zdGFydCxlLmNvdW50LGUubWF0ZXJpYWxJbmRleCl9Y29uc3QgYz10LmRhdGEuYm91bmRpbmdTcGhlcmU7aWYodm9pZCAwIT09Yyl7Y29uc3QgdD1uZXcgQ0p0O3ZvaWQgMCE9PWMuY2VudGVyJiZ0LmZyb21BcnJheShjLmNlbnRlciksci5ib3VuZGluZ1NwaGVyZT1uZXcgJEp0KHQsYy5yYWRpdXMpfXJldHVybiB0Lm5hbWUmJihyLm5hbWU9dC5uYW1lKSx0LnVzZXJEYXRhJiYoci51c2VyRGF0YT10LnVzZXJEYXRhKSxyfX1jb25zdCBrOXQ9e1VWTWFwcGluZzpVS3QsQ3ViZVJlZmxlY3Rpb25NYXBwaW5nOmpLdCxDdWJlUmVmcmFjdGlvbk1hcHBpbmc6R0t0LEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOldLdCxFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzpxS3QsQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc6WUt0LEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOlhLdH0sTDl0PXtSZXBlYXRXcmFwcGluZzokS3QsQ2xhbXBUb0VkZ2VXcmFwcGluZzpLS3QsTWlycm9yZWRSZXBlYXRXcmFwcGluZzpaS3R9LFA5dD17TmVhcmVzdEZpbHRlcjpKS3QsTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXI6UUt0LE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXI6dFp0LExpbmVhckZpbHRlcjplWnQsTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcjpuWnQsTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyOmladH07Y2xhc3MgTjl0IGV4dGVuZHMgJDZ0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLCJ1bmRlZmluZWQiPT10eXBlb2YgY3JlYXRlSW1hZ2VCaXRtYXAmJmNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGNyZWF0ZUltYWdlQml0bWFwKCkgbm90IHN1cHBvcnRlZC4iKSwidW5kZWZpbmVkIj09dHlwZW9mIGZldGNoJiZjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlQml0bWFwTG9hZGVyOiBmZXRjaCgpIG5vdCBzdXBwb3J0ZWQuIiksdGhpcy5vcHRpb25zPXtwcmVtdWx0aXBseUFscGhhOiJub25lIn19c2V0T3B0aW9ucyh0KXtyZXR1cm4gdGhpcy5vcHRpb25zPXQsdGhpc31sb2FkKHQsZSxuLGkpe3ZvaWQgMD09PXQmJih0PSIiKSx2b2lkIDAhPT10aGlzLnBhdGgmJih0PXRoaXMucGF0aCt0KSx0PXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKHQpO2NvbnN0IHI9dGhpcyxvPXE2dC5nZXQodCk7aWYodm9pZCAwIT09bylyZXR1cm4gci5tYW5hZ2VyLml0ZW1TdGFydCh0KSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2UmJmUobyksci5tYW5hZ2VyLml0ZW1FbmQodCl9KSwwKSxvO2NvbnN0IGE9e307YS5jcmVkZW50aWFscz0iYW5vbnltb3VzIj09PXRoaXMuY3Jvc3NPcmlnaW4/InNhbWUtb3JpZ2luIjoiaW5jbHVkZSIsYS5oZWFkZXJzPXRoaXMucmVxdWVzdEhlYWRlcixmZXRjaCh0LGEpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiB0LmJsb2IoKX0pKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAodCxPYmplY3QuYXNzaWduKHIub3B0aW9ucyx7Y29sb3JTcGFjZUNvbnZlcnNpb246Im5vbmUifSkpfSkpLnRoZW4oKGZ1bmN0aW9uKG4pe3E2dC5hZGQodCxuKSxlJiZlKG4pLHIubWFuYWdlci5pdGVtRW5kKHQpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtpJiZpKGUpLHIubWFuYWdlci5pdGVtRXJyb3IodCksci5tYW5hZ2VyLml0ZW1FbmQodCl9KSksci5tYW5hZ2VyLml0ZW1TdGFydCh0KX19Tjl0LnByb3RvdHlwZS5pc0ltYWdlQml0bWFwTG9hZGVyPSEwO2NsYXNzIEk5dHtjb25zdHJ1Y3Rvcigpe3RoaXMudHlwZT0iU2hhcGVQYXRoIix0aGlzLmNvbG9yPW5ldyAkUXQsdGhpcy5zdWJQYXRocz1bXSx0aGlzLmN1cnJlbnRQYXRoPW51bGx9bW92ZVRvKHQsZSl7cmV0dXJuIHRoaXMuY3VycmVudFBhdGg9bmV3IGk5dCx0aGlzLnN1YlBhdGhzLnB1c2godGhpcy5jdXJyZW50UGF0aCksdGhpcy5jdXJyZW50UGF0aC5tb3ZlVG8odCxlKSx0aGlzfWxpbmVUbyh0LGUpe3JldHVybiB0aGlzLmN1cnJlbnRQYXRoLmxpbmVUbyh0LGUpLHRoaXN9cXVhZHJhdGljQ3VydmVUbyh0LGUsbixpKXtyZXR1cm4gdGhpcy5jdXJyZW50UGF0aC5xdWFkcmF0aWNDdXJ2ZVRvKHQsZSxuLGkpLHRoaXN9YmV6aWVyQ3VydmVUbyh0LGUsbixpLHIsbyl7cmV0dXJuIHRoaXMuY3VycmVudFBhdGguYmV6aWVyQ3VydmVUbyh0LGUsbixpLHIsbyksdGhpc31zcGxpbmVUaHJ1KHQpe3JldHVybiB0aGlzLmN1cnJlbnRQYXRoLnNwbGluZVRocnUodCksdGhpc310b1NoYXBlcyh0LGUpe2Z1bmN0aW9uIG4odCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MCxpPXQubGVuZ3RoO248aTtuKyspe2NvbnN0IGk9dFtuXSxyPW5ldyByOXQ7ci5jdXJ2ZXM9aS5jdXJ2ZXMsZS5wdXNoKHIpfXJldHVybiBlfWZ1bmN0aW9uIGkodCxlKXtjb25zdCBuPWUubGVuZ3RoO2xldCBpPSExO2ZvcihsZXQgcj1uLTEsbz0wO288bjtyPW8rKyl7bGV0IG49ZVtyXSxhPWVbb10scz1hLngtbi54LGw9YS55LW4ueTtpZihNYXRoLmFicyhsKT5OdW1iZXIuRVBTSUxPTil7aWYobDwwJiYobj1lW29dLHM9LXMsYT1lW3JdLGw9LWwpLHQueTxuLnl8fHQueT5hLnkpY29udGludWU7aWYodC55PT09bi55KXtpZih0Lng9PT1uLngpcmV0dXJuITB9ZWxzZXtjb25zdCBlPWwqKHQueC1uLngpLXMqKHQueS1uLnkpO2lmKDA9PT1lKXJldHVybiEwO2lmKGU8MCljb250aW51ZTtpPSFpfX1lbHNle2lmKHQueSE9PW4ueSljb250aW51ZTtpZihhLng8PXQueCYmdC54PD1uLnh8fG4ueDw9dC54JiZ0Lng8PWEueClyZXR1cm4hMH19cmV0dXJuIGl9Y29uc3Qgcj1lNnQuaXNDbG9ja1dpc2Usbz10aGlzLnN1YlBhdGhzO2lmKDA9PT1vLmxlbmd0aClyZXR1cm5bXTtpZighMD09PWUpcmV0dXJuIG4obyk7bGV0IGEscyxsO2NvbnN0IGM9W107aWYoMT09PW8ubGVuZ3RoKXJldHVybiBzPW9bMF0sbD1uZXcgcjl0LGwuY3VydmVzPXMuY3VydmVzLGMucHVzaChsKSxjO2xldCB1PSFyKG9bMF0uZ2V0UG9pbnRzKCkpO3U9dD8hdTp1O2NvbnN0IGg9W10sZD1bXTtsZXQgcCxmLG09W10sZz0wO2RbZ109dm9pZCAwLG1bZ109W107Zm9yKGxldCBlPTAsbj1vLmxlbmd0aDtlPG47ZSsrKXM9b1tlXSxwPXMuZ2V0UG9pbnRzKCksYT1yKHApLGE9dD8hYTphLGE/KCF1JiZkW2ddJiZnKyssZFtnXT17czpuZXcgcjl0LHA6cH0sZFtnXS5zLmN1cnZlcz1zLmN1cnZlcyx1JiZnKyssbVtnXT1bXSk6bVtnXS5wdXNoKHtoOnMscDpwWzBdfSk7aWYoIWRbMF0pcmV0dXJuIG4obyk7aWYoZC5sZW5ndGg+MSl7bGV0IHQ9ITE7Y29uc3QgZT1bXTtmb3IobGV0IHQ9MCxlPWQubGVuZ3RoO3Q8ZTt0KyspaFt0XT1bXTtmb3IobGV0IG49MCxyPWQubGVuZ3RoO248cjtuKyspe2NvbnN0IHI9bVtuXTtmb3IobGV0IG89MDtvPHIubGVuZ3RoO28rKyl7Y29uc3QgYT1yW29dO2xldCBzPSEwO2ZvcihsZXQgcj0wO3I8ZC5sZW5ndGg7cisrKWkoYS5wLGRbcl0ucCkmJihuIT09ciYmZS5wdXNoKHtmcm9tczpuLHRvczpyLGhvbGU6b30pLHM/KHM9ITEsaFtyXS5wdXNoKGEpKTp0PSEwKTtzJiZoW25dLnB1c2goYSl9fWUubGVuZ3RoPjAmJih0fHwobT1oKSl9Zm9yKGxldCB0PTAsZT1kLmxlbmd0aDt0PGU7dCsrKXtsPWRbdF0ucyxjLnB1c2gobCksZj1tW3RdO2ZvcihsZXQgdD0wLGU9Zi5sZW5ndGg7dDxlO3QrKylsLmhvbGVzLnB1c2goZlt0XS5oKX1yZXR1cm4gY319Y2xhc3MgUjl0e2NvbnN0cnVjdG9yKHQpe3RoaXMudHlwZT0iRm9udCIsdGhpcy5kYXRhPXR9Z2VuZXJhdGVTaGFwZXModCxlPTEwMCl7Y29uc3Qgbj1bXSxpPShmdW5jdGlvbiByKHQsZSxuKXtjb25zdCBpPUFycmF5LmZyb20odCkscj1lL24ucmVzb2x1dGlvbixvPShuLmJvdW5kaW5nQm94LnlNYXgtbi5ib3VuZGluZ0JveC55TWluK24udW5kZXJsaW5lVGhpY2tuZXNzKSpyLGE9W107bGV0IHM9MCxsPTA7Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0Kyspe2NvbnN0IGU9aVt0XTtpZigiXG4iPT09ZSlzPTAsbC09bztlbHNle2NvbnN0IHQ9Tzl0KGUscixzLGwsbik7cys9dC5vZmZzZXRYLGEucHVzaCh0LnBhdGgpfX1yZXR1cm4gYX0pKHQsZSx0aGlzLmRhdGEpO2ZvcihsZXQgdD0wLGU9aS5sZW5ndGg7dDxlO3QrKylBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShuLGlbdF0udG9TaGFwZXMoKSk7cmV0dXJuIG59fWZ1bmN0aW9uIE85dCh0LGUsbixpLHIpe2NvbnN0IG89ci5nbHlwaHNbdF18fHIuZ2x5cGhzWyI/Il07aWYoIW8pcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcignVEhSRUUuRm9udDogY2hhcmFjdGVyICInK3QrJyIgZG9lcyBub3QgZXhpc3RzIGluIGZvbnQgZmFtaWx5ICcrci5mYW1pbHlOYW1lKyIuIik7Y29uc3QgYT1uZXcgSTl0O2xldCBzLGwsYyx1LGgsZCxwLGY7aWYoby5vKXtjb25zdCB0PW8uX2NhY2hlZE91dGxpbmV8fChvLl9jYWNoZWRPdXRsaW5lPW8uby5zcGxpdCgiICIpKTtmb3IobGV0IHI9MCxvPXQubGVuZ3RoO3I8bzspc3dpdGNoKHRbcisrXSl7Y2FzZSJtIjpzPXRbcisrXSplK24sbD10W3IrK10qZStpLGEubW92ZVRvKHMsbCk7YnJlYWs7Y2FzZSJsIjpzPXRbcisrXSplK24sbD10W3IrK10qZStpLGEubGluZVRvKHMsbCk7YnJlYWs7Y2FzZSJxIjpjPXRbcisrXSplK24sdT10W3IrK10qZStpLGg9dFtyKytdKmUrbixkPXRbcisrXSplK2ksYS5xdWFkcmF0aWNDdXJ2ZVRvKGgsZCxjLHUpO2JyZWFrO2Nhc2UiYiI6Yz10W3IrK10qZStuLHU9dFtyKytdKmUraSxoPXRbcisrXSplK24sZD10W3IrK10qZStpLHA9dFtyKytdKmUrbixmPXRbcisrXSplK2ksYS5iZXppZXJDdXJ2ZVRvKGgsZCxwLGYsYyx1KX19cmV0dXJue29mZnNldFg6by5oYSplLHBhdGg6YX19bGV0IHo5dDtSOXQucHJvdG90eXBlLmlzRm9udD0hMDtjb25zdCBEOXQ9e2dldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09ejl0JiYoejl0PW5ldyh3aW5kb3cuQXVkaW9Db250ZXh0fHx3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0KSksejl0fSxzZXRDb250ZXh0OmZ1bmN0aW9uKHQpe3o5dD10fX07Y2xhc3MgQjl0IGV4dGVuZHMgJDZ0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4saSl7Y29uc3Qgcj10aGlzLG89bmV3IFo2dCh0aGlzLm1hbmFnZXIpO28uc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpLG8uc2V0UGF0aCh0aGlzLnBhdGgpLG8uc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLG8uc2V0V2l0aENyZWRlbnRpYWxzKHRoaXMud2l0aENyZWRlbnRpYWxzKSxvLmxvYWQodCwoZnVuY3Rpb24obil7dHJ5e2NvbnN0IHQ9bi5zbGljZSgwKTtEOXQuZ2V0Q29udGV4dCgpLmRlY29kZUF1ZGlvRGF0YSh0LChmdW5jdGlvbih0KXtlKHQpfSkpfWNhdGNoKGUpe2k/aShlKTpjb25zb2xlLmVycm9yKGUpLHIubWFuYWdlci5pdGVtRXJyb3IodCl9fSksbixpKX19Y2xhc3MgSDl0IGV4dGVuZHMgUzl0e2NvbnN0cnVjdG9yKHQsZSxuPTEpe3N1cGVyKHZvaWQgMCxuKTtjb25zdCBpPShuZXcgJFF0KS5zZXQodCkscj0obmV3ICRRdCkuc2V0KGUpLG89bmV3IENKdChpLnIsaS5nLGkuYiksYT1uZXcgQ0p0KHIucixyLmcsci5iKSxzPU1hdGguc3FydChNYXRoLlBJKSxsPXMqTWF0aC5zcXJ0KC43NSk7dGhpcy5zaC5jb2VmZmljaWVudHNbMF0uY29weShvKS5hZGQoYSkubXVsdGlwbHlTY2FsYXIocyksdGhpcy5zaC5jb2VmZmljaWVudHNbMV0uY29weShvKS5zdWIoYSkubXVsdGlwbHlTY2FsYXIobCl9fUg5dC5wcm90b3R5cGUuaXNIZW1pc3BoZXJlTGlnaHRQcm9iZT0hMDtjbGFzcyBGOXQgZXh0ZW5kcyBTOXR7Y29uc3RydWN0b3IodCxlPTEpe3N1cGVyKHZvaWQgMCxlKTtjb25zdCBuPShuZXcgJFF0KS5zZXQodCk7dGhpcy5zaC5jb2VmZmljaWVudHNbMF0uc2V0KG4ucixuLmcsbi5iKS5tdWx0aXBseVNjYWxhcigyKk1hdGguc3FydChNYXRoLlBJKSl9fUY5dC5wcm90b3R5cGUuaXNBbWJpZW50TGlnaHRQcm9iZT0hMDtjb25zdCBWOXQ9bmV3IHJRdCxVOXQ9bmV3IHJRdDtjbGFzcyBqOXR7Y29uc3RydWN0b3IodD0hMCl7dGhpcy5hdXRvU3RhcnQ9dCx0aGlzLnN0YXJ0VGltZT0wLHRoaXMub2xkVGltZT0wLHRoaXMuZWxhcHNlZFRpbWU9MCx0aGlzLnJ1bm5pbmc9ITF9c3RhcnQoKXt0aGlzLnN0YXJ0VGltZT1HOXQoKSx0aGlzLm9sZFRpbWU9dGhpcy5zdGFydFRpbWUsdGhpcy5lbGFwc2VkVGltZT0wLHRoaXMucnVubmluZz0hMH1zdG9wKCl7dGhpcy5nZXRFbGFwc2VkVGltZSgpLHRoaXMucnVubmluZz0hMSx0aGlzLmF1dG9TdGFydD0hMX1nZXRFbGFwc2VkVGltZSgpe3JldHVybiB0aGlzLmdldERlbHRhKCksdGhpcy5lbGFwc2VkVGltZX1nZXREZWx0YSgpe2xldCB0PTA7aWYodGhpcy5hdXRvU3RhcnQmJiF0aGlzLnJ1bm5pbmcpcmV0dXJuIHRoaXMuc3RhcnQoKSwwO2lmKHRoaXMucnVubmluZyl7Y29uc3QgZT1HOXQoKTt0PShlLXRoaXMub2xkVGltZSkvMWUzLHRoaXMub2xkVGltZT1lLHRoaXMuZWxhcHNlZFRpbWUrPXR9cmV0dXJuIHR9fWZ1bmN0aW9uIEc5dCgpe3JldHVybigidW5kZWZpbmVkIj09dHlwZW9mIHBlcmZvcm1hbmNlP0RhdGU6cGVyZm9ybWFuY2UpLm5vdygpfWNvbnN0IFc5dD1uZXcgQ0p0LHE5dD1uZXcgVEp0LFk5dD1uZXcgQ0p0LFg5dD1uZXcgQ0p0O2NsYXNzICQ5dCBleHRlbmRzIGtRdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iQXVkaW8iLHRoaXMubGlzdGVuZXI9dCx0aGlzLmNvbnRleHQ9dC5jb250ZXh0LHRoaXMuZ2Fpbj10aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpLHRoaXMuZ2Fpbi5jb25uZWN0KHQuZ2V0SW5wdXQoKSksdGhpcy5hdXRvcGxheT0hMSx0aGlzLmJ1ZmZlcj1udWxsLHRoaXMuZGV0dW5lPTAsdGhpcy5sb29wPSExLHRoaXMubG9vcFN0YXJ0PTAsdGhpcy5sb29wRW5kPTAsdGhpcy5vZmZzZXQ9MCx0aGlzLmR1cmF0aW9uPXZvaWQgMCx0aGlzLnBsYXliYWNrUmF0ZT0xLHRoaXMuaXNQbGF5aW5nPSExLHRoaXMuaGFzUGxheWJhY2tDb250cm9sPSEwLHRoaXMuc291cmNlPW51bGwsdGhpcy5zb3VyY2VUeXBlPSJlbXB0eSIsdGhpcy5fc3RhcnRlZEF0PTAsdGhpcy5fcHJvZ3Jlc3M9MCx0aGlzLl9jb25uZWN0ZWQ9ITEsdGhpcy5maWx0ZXJzPVtdfWdldE91dHB1dCgpe3JldHVybiB0aGlzLmdhaW59c2V0Tm9kZVNvdXJjZSh0KXtyZXR1cm4gdGhpcy5oYXNQbGF5YmFja0NvbnRyb2w9ITEsdGhpcy5zb3VyY2VUeXBlPSJhdWRpb05vZGUiLHRoaXMuc291cmNlPXQsdGhpcy5jb25uZWN0KCksdGhpc31zZXRNZWRpYUVsZW1lbnRTb3VyY2UodCl7cmV0dXJuIHRoaXMuaGFzUGxheWJhY2tDb250cm9sPSExLHRoaXMuc291cmNlVHlwZT0ibWVkaWFOb2RlIix0aGlzLnNvdXJjZT10aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFFbGVtZW50U291cmNlKHQpLHRoaXMuY29ubmVjdCgpLHRoaXN9c2V0TWVkaWFTdHJlYW1Tb3VyY2UodCl7cmV0dXJuIHRoaXMuaGFzUGxheWJhY2tDb250cm9sPSExLHRoaXMuc291cmNlVHlwZT0ibWVkaWFTdHJlYW1Ob2RlIix0aGlzLnNvdXJjZT10aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFTdHJlYW1Tb3VyY2UodCksdGhpcy5jb25uZWN0KCksdGhpc31zZXRCdWZmZXIodCl7cmV0dXJuIHRoaXMuYnVmZmVyPXQsdGhpcy5zb3VyY2VUeXBlPSJidWZmZXIiLHRoaXMuYXV0b3BsYXkmJnRoaXMucGxheSgpLHRoaXN9cGxheSh0PTApe2lmKCEwPT09dGhpcy5pc1BsYXlpbmcpcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogQXVkaW8gaXMgYWxyZWFkeSBwbGF5aW5nLiIpO2lmKCExPT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wpcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTt0aGlzLl9zdGFydGVkQXQ9dGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lK3Q7Y29uc3QgZT10aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7cmV0dXJuIGUuYnVmZmVyPXRoaXMuYnVmZmVyLGUubG9vcD10aGlzLmxvb3AsZS5sb29wU3RhcnQ9dGhpcy5sb29wU3RhcnQsZS5sb29wRW5kPXRoaXMubG9vcEVuZCxlLm9uZW5kZWQ9dGhpcy5vbkVuZGVkLmJpbmQodGhpcyksZS5zdGFydCh0aGlzLl9zdGFydGVkQXQsdGhpcy5fcHJvZ3Jlc3MrdGhpcy5vZmZzZXQsdGhpcy5kdXJhdGlvbiksdGhpcy5pc1BsYXlpbmc9ITAsdGhpcy5zb3VyY2U9ZSx0aGlzLnNldERldHVuZSh0aGlzLmRldHVuZSksdGhpcy5zZXRQbGF5YmFja1JhdGUodGhpcy5wbGF5YmFja1JhdGUpLHRoaXMuY29ubmVjdCgpfXBhdXNlKCl7aWYoITEhPT10aGlzLmhhc1BsYXliYWNrQ29udHJvbClyZXR1cm4hMD09PXRoaXMuaXNQbGF5aW5nJiYodGhpcy5fcHJvZ3Jlc3MrPU1hdGgubWF4KHRoaXMuY29udGV4dC5jdXJyZW50VGltZS10aGlzLl9zdGFydGVkQXQsMCkqdGhpcy5wbGF5YmFja1JhdGUsITA9PT10aGlzLmxvb3AmJih0aGlzLl9wcm9ncmVzcz10aGlzLl9wcm9ncmVzcyUodGhpcy5kdXJhdGlvbnx8dGhpcy5idWZmZXIuZHVyYXRpb24pKSx0aGlzLnNvdXJjZS5zdG9wKCksdGhpcy5zb3VyY2Uub25lbmRlZD1udWxsLHRoaXMuaXNQbGF5aW5nPSExKSx0aGlzO2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIil9c3RvcCgpe2lmKCExIT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wpcmV0dXJuIHRoaXMuX3Byb2dyZXNzPTAsdGhpcy5zb3VyY2Uuc3RvcCgpLHRoaXMuc291cmNlLm9uZW5kZWQ9bnVsbCx0aGlzLmlzUGxheWluZz0hMSx0aGlzO2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIil9Y29ubmVjdCgpe2lmKHRoaXMuZmlsdGVycy5sZW5ndGg+MCl7dGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pO2ZvcihsZXQgdD0xLGU9dGhpcy5maWx0ZXJzLmxlbmd0aDt0PGU7dCsrKXRoaXMuZmlsdGVyc1t0LTFdLmNvbm5lY3QodGhpcy5maWx0ZXJzW3RdKTt0aGlzLmZpbHRlcnNbdGhpcy5maWx0ZXJzLmxlbmd0aC0xXS5jb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpfWVsc2UgdGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKTtyZXR1cm4gdGhpcy5fY29ubmVjdGVkPSEwLHRoaXN9ZGlzY29ubmVjdCgpe2lmKHRoaXMuZmlsdGVycy5sZW5ndGg+MCl7dGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pO2ZvcihsZXQgdD0xLGU9dGhpcy5maWx0ZXJzLmxlbmd0aDt0PGU7dCsrKXRoaXMuZmlsdGVyc1t0LTFdLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXJzW3RdKTt0aGlzLmZpbHRlcnNbdGhpcy5maWx0ZXJzLmxlbmd0aC0xXS5kaXNjb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpfWVsc2UgdGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKTtyZXR1cm4gdGhpcy5fY29ubmVjdGVkPSExLHRoaXN9Z2V0RmlsdGVycygpe3JldHVybiB0aGlzLmZpbHRlcnN9c2V0RmlsdGVycyh0KXtyZXR1cm4gdHx8KHQ9W10pLCEwPT09dGhpcy5fY29ubmVjdGVkPyh0aGlzLmRpc2Nvbm5lY3QoKSx0aGlzLmZpbHRlcnM9dC5zbGljZSgpLHRoaXMuY29ubmVjdCgpKTp0aGlzLmZpbHRlcnM9dC5zbGljZSgpLHRoaXN9c2V0RGV0dW5lKHQpe2lmKHRoaXMuZGV0dW5lPXQsdm9pZCAwIT09dGhpcy5zb3VyY2UuZGV0dW5lKXJldHVybiEwPT09dGhpcy5pc1BsYXlpbmcmJnRoaXMuc291cmNlLmRldHVuZS5zZXRUYXJnZXRBdFRpbWUodGhpcy5kZXR1bmUsdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLC4wMSksdGhpc31nZXREZXR1bmUoKXtyZXR1cm4gdGhpcy5kZXR1bmV9Z2V0RmlsdGVyKCl7cmV0dXJuIHRoaXMuZ2V0RmlsdGVycygpWzBdfXNldEZpbHRlcih0KXtyZXR1cm4gdGhpcy5zZXRGaWx0ZXJzKHQ/W3RdOltdKX1zZXRQbGF5YmFja1JhdGUodCl7aWYoITEhPT10aGlzLmhhc1BsYXliYWNrQ29udHJvbClyZXR1cm4gdGhpcy5wbGF5YmFja1JhdGU9dCwhMD09PXRoaXMuaXNQbGF5aW5nJiZ0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VGFyZ2V0QXRUaW1lKHRoaXMucGxheWJhY2tSYXRlLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXM7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKX1nZXRQbGF5YmFja1JhdGUoKXtyZXR1cm4gdGhpcy5wbGF5YmFja1JhdGV9b25FbmRlZCgpe3RoaXMuaXNQbGF5aW5nPSExfWdldExvb3AoKXtyZXR1cm4hMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sPyhjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpLCExKTp0aGlzLmxvb3B9c2V0TG9vcCh0KXtpZighMSE9PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKXJldHVybiB0aGlzLmxvb3A9dCwhMD09PXRoaXMuaXNQbGF5aW5nJiYodGhpcy5zb3VyY2UubG9vcD10aGlzLmxvb3ApLHRoaXM7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKX1zZXRMb29wU3RhcnQodCl7cmV0dXJuIHRoaXMubG9vcFN0YXJ0PXQsdGhpc31zZXRMb29wRW5kKHQpe3JldHVybiB0aGlzLmxvb3BFbmQ9dCx0aGlzfWdldFZvbHVtZSgpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZX1zZXRWb2x1bWUodCl7cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSh0LHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXN9fWNvbnN0IEs5dD1uZXcgQ0p0LFo5dD1uZXcgVEp0LEo5dD1uZXcgQ0p0LFE5dD1uZXcgQ0p0O2NsYXNzIHQ4dHtjb25zdHJ1Y3Rvcih0LGU9MjA0OCl7dGhpcy5hbmFseXNlcj10LmNvbnRleHQuY3JlYXRlQW5hbHlzZXIoKSx0aGlzLmFuYWx5c2VyLmZmdFNpemU9ZSx0aGlzLmRhdGE9bmV3IFVpbnQ4QXJyYXkodGhpcy5hbmFseXNlci5mcmVxdWVuY3lCaW5Db3VudCksdC5nZXRPdXRwdXQoKS5jb25uZWN0KHRoaXMuYW5hbHlzZXIpfWdldEZyZXF1ZW5jeURhdGEoKXtyZXR1cm4gdGhpcy5hbmFseXNlci5nZXRCeXRlRnJlcXVlbmN5RGF0YSh0aGlzLmRhdGEpLHRoaXMuZGF0YX1nZXRBdmVyYWdlRnJlcXVlbmN5KCl7bGV0IHQ9MDtjb25zdCBlPXRoaXMuZ2V0RnJlcXVlbmN5RGF0YSgpO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXQrPWVbbl07cmV0dXJuIHQvZS5sZW5ndGh9fWNsYXNzIGU4dHtjb25zdHJ1Y3Rvcih0LGUsbil7bGV0IGkscixvO3N3aXRjaCh0aGlzLmJpbmRpbmc9dCx0aGlzLnZhbHVlU2l6ZT1uLGUpe2Nhc2UicXVhdGVybmlvbiI6aT10aGlzLl9zbGVycCxyPXRoaXMuX3NsZXJwQWRkaXRpdmUsbz10aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5UXVhdGVybmlvbix0aGlzLmJ1ZmZlcj1uZXcgRmxvYXQ2NEFycmF5KDYqbiksdGhpcy5fd29ya0luZGV4PTU7YnJlYWs7Y2FzZSJzdHJpbmciOmNhc2UiYm9vbCI6aT10aGlzLl9zZWxlY3Qscj10aGlzLl9zZWxlY3Qsbz10aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5T3RoZXIsdGhpcy5idWZmZXI9bmV3IEFycmF5KDUqbik7YnJlYWs7ZGVmYXVsdDppPXRoaXMuX2xlcnAscj10aGlzLl9sZXJwQWRkaXRpdmUsbz10aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYyx0aGlzLmJ1ZmZlcj1uZXcgRmxvYXQ2NEFycmF5KDUqbil9dGhpcy5fbWl4QnVmZmVyUmVnaW9uPWksdGhpcy5fbWl4QnVmZmVyUmVnaW9uQWRkaXRpdmU9cix0aGlzLl9zZXRJZGVudGl0eT1vLHRoaXMuX29yaWdJbmRleD0zLHRoaXMuX2FkZEluZGV4PTQsdGhpcy5jdW11bGF0aXZlV2VpZ2h0PTAsdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmU9MCx0aGlzLnVzZUNvdW50PTAsdGhpcy5yZWZlcmVuY2VDb3VudD0wfWFjY3VtdWxhdGUodCxlKXtjb25zdCBuPXRoaXMuYnVmZmVyLGk9dGhpcy52YWx1ZVNpemUscj10KmkraTtsZXQgbz10aGlzLmN1bXVsYXRpdmVXZWlnaHQ7aWYoMD09PW8pe2ZvcihsZXQgdD0wO3QhPT1pOysrdCluW3IrdF09blt0XTtvPWV9ZWxzZSBvKz1lLHRoaXMuX21peEJ1ZmZlclJlZ2lvbihuLHIsMCxlL28saSk7dGhpcy5jdW11bGF0aXZlV2VpZ2h0PW99YWNjdW11bGF0ZUFkZGl0aXZlKHQpe2NvbnN0IGU9dGhpcy5idWZmZXIsbj10aGlzLnZhbHVlU2l6ZSxpPW4qdGhpcy5fYWRkSW5kZXg7MD09PXRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlJiZ0aGlzLl9zZXRJZGVudGl0eSgpLHRoaXMuX21peEJ1ZmZlclJlZ2lvbkFkZGl0aXZlKGUsaSwwLHQsbiksdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUrPXR9YXBwbHkodCl7Y29uc3QgZT10aGlzLnZhbHVlU2l6ZSxuPXRoaXMuYnVmZmVyLGk9dCplK2Uscj10aGlzLmN1bXVsYXRpdmVXZWlnaHQsbz10aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSxhPXRoaXMuYmluZGluZzt0aGlzLmN1bXVsYXRpdmVXZWlnaHQ9MCx0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZT0wLHI8MSYmdGhpcy5fbWl4QnVmZmVyUmVnaW9uKG4saSxlKnRoaXMuX29yaWdJbmRleCwxLXIsZSksbz4wJiZ0aGlzLl9taXhCdWZmZXJSZWdpb25BZGRpdGl2ZShuLGksdGhpcy5fYWRkSW5kZXgqZSwxLGUpO2ZvcihsZXQgdD1lLHI9ZStlO3QhPT1yOysrdClpZihuW3RdIT09blt0K2VdKXthLnNldFZhbHVlKG4saSk7YnJlYWt9fXNhdmVPcmlnaW5hbFN0YXRlKCl7Y29uc3QgdD10aGlzLmJ1ZmZlcixlPXRoaXMudmFsdWVTaXplLG49ZSp0aGlzLl9vcmlnSW5kZXg7dGhpcy5iaW5kaW5nLmdldFZhbHVlKHQsbik7Zm9yKGxldCBpPWUscj1uO2khPT1yOysraSl0W2ldPXRbbitpJWVdO3RoaXMuX3NldElkZW50aXR5KCksdGhpcy5jdW11bGF0aXZlV2VpZ2h0PTAsdGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmU9MH1yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpe3RoaXMuYmluZGluZy5zZXRWYWx1ZSh0aGlzLmJ1ZmZlciwzKnRoaXMudmFsdWVTaXplKX1fc2V0QWRkaXRpdmVJZGVudGl0eU51bWVyaWMoKXtjb25zdCB0PXRoaXMuX2FkZEluZGV4KnRoaXMudmFsdWVTaXplLGU9dCt0aGlzLnZhbHVlU2l6ZTtmb3IobGV0IG49dDtuPGU7bisrKXRoaXMuYnVmZmVyW25dPTB9X3NldEFkZGl0aXZlSWRlbnRpdHlRdWF0ZXJuaW9uKCl7dGhpcy5fc2V0QWRkaXRpdmVJZGVudGl0eU51bWVyaWMoKSx0aGlzLmJ1ZmZlclt0aGlzLl9hZGRJbmRleCp0aGlzLnZhbHVlU2l6ZSszXT0xfV9zZXRBZGRpdGl2ZUlkZW50aXR5T3RoZXIoKXtjb25zdCB0PXRoaXMuX29yaWdJbmRleCp0aGlzLnZhbHVlU2l6ZSxlPXRoaXMuX2FkZEluZGV4KnRoaXMudmFsdWVTaXplO2ZvcihsZXQgbj0wO248dGhpcy52YWx1ZVNpemU7bisrKXRoaXMuYnVmZmVyW2Urbl09dGhpcy5idWZmZXJbdCtuXX1fc2VsZWN0KHQsZSxuLGkscil7aWYoaT49LjUpZm9yKGxldCBpPTA7aSE9PXI7KytpKXRbZStpXT10W24raV19X3NsZXJwKHQsZSxuLGkpe1RKdC5zbGVycEZsYXQodCxlLHQsZSx0LG4saSl9X3NsZXJwQWRkaXRpdmUodCxlLG4saSxyKXtjb25zdCBvPXRoaXMuX3dvcmtJbmRleCpyO1RKdC5tdWx0aXBseVF1YXRlcm5pb25zRmxhdCh0LG8sdCxlLHQsbiksVEp0LnNsZXJwRmxhdCh0LGUsdCxlLHQsbyxpKX1fbGVycCh0LGUsbixpLHIpe2NvbnN0IG89MS1pO2ZvcihsZXQgYT0wO2EhPT1yOysrYSl7Y29uc3Qgcj1lK2E7dFtyXT10W3JdKm8rdFtuK2FdKml9fV9sZXJwQWRkaXRpdmUodCxlLG4saSxyKXtmb3IobGV0IG89MDtvIT09cjsrK28pe2NvbnN0IHI9ZStvO3Rbcl09dFtyXSt0W24rb10qaX19fWNvbnN0IG44dD1uZXcgUmVnRXhwKCJbXFxbXFxdXFwuOlxcL10iLCJnIiksaTh0PSJbXlxcW1xcXVxcLjpcXC9dIixyOHQ9IlteIisiXFxbXFxdXFwuOlxcLyIucmVwbGFjZSgiXFwuIiwiIikrIl0iLG84dD0vKCg/OldDK1tcLzpdKSopLy5zb3VyY2UucmVwbGFjZSgiV0MiLGk4dCksYTh0PS8oV0NPRCspPy8uc291cmNlLnJlcGxhY2UoIldDT0QiLHI4dCksczh0PS8oPzpcLihXQyspKD86XFsoLispXF0pPyk/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLGk4dCksbDh0PS9cLihXQyspKD86XFsoLispXF0pPy8uc291cmNlLnJlcGxhY2UoIldDIixpOHQpLGM4dD1uZXcgUmVnRXhwKCJeIitvOHQrYTh0K3M4dCtsOHQrIiQiKSx1OHQ9WyJtYXRlcmlhbCIsIm1hdGVyaWFscyIsImJvbmVzIl07Y2xhc3MgaDh0e2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLnBhdGg9ZSx0aGlzLnBhcnNlZFBhdGg9bnx8aDh0LnBhcnNlVHJhY2tOYW1lKGUpLHRoaXMubm9kZT1oOHQuZmluZE5vZGUodCx0aGlzLnBhcnNlZFBhdGgubm9kZU5hbWUpfHx0LHRoaXMucm9vdE5vZGU9dCx0aGlzLmdldFZhbHVlPXRoaXMuX2dldFZhbHVlX3VuYm91bmQsdGhpcy5zZXRWYWx1ZT10aGlzLl9zZXRWYWx1ZV91bmJvdW5kfXN0YXRpYyBjcmVhdGUodCxlLG4pe3JldHVybiB0JiZ0LmlzQW5pbWF0aW9uT2JqZWN0R3JvdXA/bmV3IGg4dC5Db21wb3NpdGUodCxlLG4pOm5ldyBoOHQodCxlLG4pfXN0YXRpYyBzYW5pdGl6ZU5vZGVOYW1lKHQpe3JldHVybiB0LnJlcGxhY2UoL1xzL2csIl8iKS5yZXBsYWNlKG44dCwiIil9c3RhdGljIHBhcnNlVHJhY2tOYW1lKHQpe2NvbnN0IGU9Yzh0LmV4ZWModCk7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJQcm9wZXJ0eUJpbmRpbmc6IENhbm5vdCBwYXJzZSB0cmFja05hbWU6ICIrdCk7Y29uc3Qgbj17bm9kZU5hbWU6ZVsyXSxvYmplY3ROYW1lOmVbM10sb2JqZWN0SW5kZXg6ZVs0XSxwcm9wZXJ0eU5hbWU6ZVs1XSxwcm9wZXJ0eUluZGV4OmVbNl19LGk9bi5ub2RlTmFtZSYmbi5ub2RlTmFtZS5sYXN0SW5kZXhPZigiLiIpO2lmKHZvaWQgMCE9PWkmJi0xIT09aSl7Y29uc3QgdD1uLm5vZGVOYW1lLnN1YnN0cmluZyhpKzEpOy0xIT09dTh0LmluZGV4T2YodCkmJihuLm5vZGVOYW1lPW4ubm9kZU5hbWUuc3Vic3RyaW5nKDAsaSksbi5vYmplY3ROYW1lPXQpfWlmKG51bGw9PT1uLnByb3BlcnR5TmFtZXx8MD09PW4ucHJvcGVydHlOYW1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlByb3BlcnR5QmluZGluZzogY2FuIG5vdCBwYXJzZSBwcm9wZXJ0eU5hbWUgZnJvbSB0cmFja05hbWU6ICIrdCk7cmV0dXJuIG59c3RhdGljIGZpbmROb2RlKHQsZSl7aWYoIWV8fCIiPT09ZXx8Ii4iPT09ZXx8LTE9PT1lfHxlPT09dC5uYW1lfHxlPT09dC51dWlkKXJldHVybiB0O2lmKHQuc2tlbGV0b24pe2NvbnN0IG49dC5za2VsZXRvbi5nZXRCb25lQnlOYW1lKGUpO2lmKHZvaWQgMCE9PW4pcmV0dXJuIG59aWYodC5jaGlsZHJlbil7Y29uc3Qgbj1mdW5jdGlvbih0KXtmb3IobGV0IGk9MDtpPHQubGVuZ3RoO2krKyl7Y29uc3Qgcj10W2ldO2lmKHIubmFtZT09PWV8fHIudXVpZD09PWUpcmV0dXJuIHI7Y29uc3Qgbz1uKHIuY2hpbGRyZW4pO2lmKG8pcmV0dXJuIG99cmV0dXJuIG51bGx9LGk9bih0LmNoaWxkcmVuKTtpZihpKXJldHVybiBpfXJldHVybiBudWxsfV9nZXRWYWx1ZV91bmF2YWlsYWJsZSgpe31fc2V0VmFsdWVfdW5hdmFpbGFibGUoKXt9X2dldFZhbHVlX2RpcmVjdCh0LGUpe3RbZV09dGhpcy5ub2RlW3RoaXMucHJvcGVydHlOYW1lXX1fZ2V0VmFsdWVfYXJyYXkodCxlKXtjb25zdCBuPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtmb3IobGV0IGk9MCxyPW4ubGVuZ3RoO2khPT1yOysraSl0W2UrK109bltpXX1fZ2V0VmFsdWVfYXJyYXlFbGVtZW50KHQsZSl7dFtlXT10aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XX1fZ2V0VmFsdWVfdG9BcnJheSh0LGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS50b0FycmF5KHQsZSl9X3NldFZhbHVlX2RpcmVjdCh0LGUpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT10W2VdfV9zZXRWYWx1ZV9kaXJlY3Rfc2V0TmVlZHNVcGRhdGUodCxlKXt0aGlzLnRhcmdldE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV09dFtlXSx0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH1fc2V0VmFsdWVfZGlyZWN0X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUodCxlKXt0aGlzLnRhcmdldE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV09dFtlXSx0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9hcnJheSh0LGUpe2NvbnN0IG49dGhpcy5yZXNvbHZlZFByb3BlcnR5O2ZvcihsZXQgaT0wLHI9bi5sZW5ndGg7aSE9PXI7KytpKW5baV09dFtlKytdfV9zZXRWYWx1ZV9hcnJheV9zZXROZWVkc1VwZGF0ZSh0LGUpe2NvbnN0IG49dGhpcy5yZXNvbHZlZFByb3BlcnR5O2ZvcihsZXQgaT0wLHI9bi5sZW5ndGg7aSE9PXI7KytpKW5baV09dFtlKytdO3RoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9hcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKHQsZSl7Y29uc3Qgbj10aGlzLnJlc29sdmVkUHJvcGVydHk7Zm9yKGxldCBpPTAscj1uLmxlbmd0aDtpIT09cjsrK2kpbltpXT10W2UrK107dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1fc2V0VmFsdWVfYXJyYXlFbGVtZW50KHQsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5W3RoaXMucHJvcGVydHlJbmRleF09dFtlXX1fc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE5lZWRzVXBkYXRlKHQsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5W3RoaXMucHJvcGVydHlJbmRleF09dFtlXSx0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH1fc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUodCxlKXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT10W2VdLHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2Zyb21BcnJheSh0LGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkodCxlKX1fc2V0VmFsdWVfZnJvbUFycmF5X3NldE5lZWRzVXBkYXRlKHQsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSh0LGUpLHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSh0LGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkodCxlKSx0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV9nZXRWYWx1ZV91bmJvdW5kKHQsZSl7dGhpcy5iaW5kKCksdGhpcy5nZXRWYWx1ZSh0LGUpfV9zZXRWYWx1ZV91bmJvdW5kKHQsZSl7dGhpcy5iaW5kKCksdGhpcy5zZXRWYWx1ZSh0LGUpfWJpbmQoKXtsZXQgdD10aGlzLm5vZGU7Y29uc3QgZT10aGlzLnBhcnNlZFBhdGgsbj1lLm9iamVjdE5hbWUsaT1lLnByb3BlcnR5TmFtZTtsZXQgcj1lLnByb3BlcnR5SW5kZXg7aWYodHx8KHQ9aDh0LmZpbmROb2RlKHRoaXMucm9vdE5vZGUsZS5ub2RlTmFtZSl8fHRoaXMucm9vdE5vZGUsdGhpcy5ub2RlPXQpLHRoaXMuZ2V0VmFsdWU9dGhpcy5fZ2V0VmFsdWVfdW5hdmFpbGFibGUsdGhpcy5zZXRWYWx1ZT10aGlzLl9zZXRWYWx1ZV91bmF2YWlsYWJsZSwhdClyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byB1cGRhdGUgbm9kZSBmb3IgdHJhY2s6ICIrdGhpcy5wYXRoKyIgYnV0IGl0IHdhc24ndCBmb3VuZC4iKTtpZihuKXtsZXQgaT1lLm9iamVjdEluZGV4O3N3aXRjaChuKXtjYXNlIm1hdGVyaWFscyI6aWYoIXQubWF0ZXJpYWwpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWwuIix0aGlzKTtpZighdC5tYXRlcmlhbC5tYXRlcmlhbHMpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwubWF0ZXJpYWxzIGFzIG5vZGUubWF0ZXJpYWwgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFscyBhcnJheS4iLHRoaXMpO3Q9dC5tYXRlcmlhbC5tYXRlcmlhbHM7YnJlYWs7Y2FzZSJib25lcyI6aWYoIXQuc2tlbGV0b24pcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gYm9uZXMgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgc2tlbGV0b24uIix0aGlzKTt0PXQuc2tlbGV0b24uYm9uZXM7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspaWYodFtlXS5uYW1lPT09aSl7aT1lO2JyZWFrfWJyZWFrO2RlZmF1bHQ6aWYodm9pZCAwPT09dFtuXSlyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBvYmplY3ROYW1lIG9mIG5vZGUgdW5kZWZpbmVkLiIsdGhpcyk7dD10W25dfWlmKHZvaWQgMCE9PWkpe2lmKHZvaWQgMD09PXRbaV0pcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gYmluZCB0byBvYmplY3RJbmRleCBvZiBvYmplY3ROYW1lLCBidXQgaXMgdW5kZWZpbmVkLiIsdGhpcyx0KTt0PXRbaV19fWNvbnN0IG89dFtpXTtpZih2b2lkIDA9PT1vKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIHVwZGF0ZSBwcm9wZXJ0eSBmb3IgdHJhY2s6ICIrZS5ub2RlTmFtZSsiLiIraSsiIGJ1dCBpdCB3YXNuJ3QgZm91bmQuIix0KTtsZXQgYT10aGlzLlZlcnNpb25pbmcuTm9uZTt0aGlzLnRhcmdldE9iamVjdD10LHZvaWQgMCE9PXQubmVlZHNVcGRhdGU/YT10aGlzLlZlcnNpb25pbmcuTmVlZHNVcGRhdGU6dm9pZCAwIT09dC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlJiYoYT10aGlzLlZlcnNpb25pbmcuTWF0cml4V29ybGROZWVkc1VwZGF0ZSk7bGV0IHM9dGhpcy5CaW5kaW5nVHlwZS5EaXJlY3Q7aWYodm9pZCAwIT09cil7aWYoIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyI9PT1pKXtpZighdC5nZW9tZXRyeSlyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS4iLHRoaXMpO2lmKCF0Lmdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIG9uIFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iLHRoaXMpO2lmKCF0Lmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcylyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuIix0aGlzKTt2b2lkIDAhPT10Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeVtyXSYmKHI9dC5tb3JwaFRhcmdldERpY3Rpb25hcnlbcl0pfXM9dGhpcy5CaW5kaW5nVHlwZS5BcnJheUVsZW1lbnQsdGhpcy5yZXNvbHZlZFByb3BlcnR5PW8sdGhpcy5wcm9wZXJ0eUluZGV4PXJ9ZWxzZSB2b2lkIDAhPT1vLmZyb21BcnJheSYmdm9pZCAwIT09by50b0FycmF5PyhzPXRoaXMuQmluZGluZ1R5cGUuSGFzRnJvbVRvQXJyYXksdGhpcy5yZXNvbHZlZFByb3BlcnR5PW8pOkFycmF5LmlzQXJyYXkobyk/KHM9dGhpcy5CaW5kaW5nVHlwZS5FbnRpcmVBcnJheSx0aGlzLnJlc29sdmVkUHJvcGVydHk9byk6dGhpcy5wcm9wZXJ0eU5hbWU9aTt0aGlzLmdldFZhbHVlPXRoaXMuR2V0dGVyQnlCaW5kaW5nVHlwZVtzXSx0aGlzLnNldFZhbHVlPXRoaXMuU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmdbc11bYV19dW5iaW5kKCl7dGhpcy5ub2RlPW51bGwsdGhpcy5nZXRWYWx1ZT10aGlzLl9nZXRWYWx1ZV91bmJvdW5kLHRoaXMuc2V0VmFsdWU9dGhpcy5fc2V0VmFsdWVfdW5ib3VuZH19aDh0LkNvbXBvc2l0ZT1jbGFzc3tjb25zdHJ1Y3Rvcih0LGUsbil7Y29uc3QgaT1ufHxoOHQucGFyc2VUcmFja05hbWUoZSk7dGhpcy5fdGFyZ2V0R3JvdXA9dCx0aGlzLl9iaW5kaW5ncz10LnN1YnNjcmliZV8oZSxpKX1nZXRWYWx1ZSh0LGUpe3RoaXMuYmluZCgpO2NvbnN0IG49dGhpcy5fYmluZGluZ3NbdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfXTt2b2lkIDAhPT1uJiZuLmdldFZhbHVlKHQsZSl9c2V0VmFsdWUodCxlKXtjb25zdCBuPXRoaXMuX2JpbmRpbmdzO2ZvcihsZXQgaT10aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18scj1uLmxlbmd0aDtpIT09cjsrK2kpbltpXS5zZXRWYWx1ZSh0LGUpfWJpbmQoKXtjb25zdCB0PXRoaXMuX2JpbmRpbmdzO2ZvcihsZXQgZT10aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sbj10Lmxlbmd0aDtlIT09bjsrK2UpdFtlXS5iaW5kKCl9dW5iaW5kKCl7Y29uc3QgdD10aGlzLl9iaW5kaW5ncztmb3IobGV0IGU9dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLG49dC5sZW5ndGg7ZSE9PW47KytlKXRbZV0udW5iaW5kKCl9fSxoOHQucHJvdG90eXBlLkJpbmRpbmdUeXBlPXtEaXJlY3Q6MCxFbnRpcmVBcnJheToxLEFycmF5RWxlbWVudDoyLEhhc0Zyb21Ub0FycmF5OjN9LGg4dC5wcm90b3R5cGUuVmVyc2lvbmluZz17Tm9uZTowLE5lZWRzVXBkYXRlOjEsTWF0cml4V29ybGROZWVkc1VwZGF0ZToyfSxoOHQucHJvdG90eXBlLkdldHRlckJ5QmluZGluZ1R5cGU9W2g4dC5wcm90b3R5cGUuX2dldFZhbHVlX2RpcmVjdCxoOHQucHJvdG90eXBlLl9nZXRWYWx1ZV9hcnJheSxoOHQucHJvdG90eXBlLl9nZXRWYWx1ZV9hcnJheUVsZW1lbnQsaDh0LnByb3RvdHlwZS5fZ2V0VmFsdWVfdG9BcnJheV0saDh0LnByb3RvdHlwZS5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZz1bW2g4dC5wcm90b3R5cGUuX3NldFZhbHVlX2RpcmVjdCxoOHQucHJvdG90eXBlLl9zZXRWYWx1ZV9kaXJlY3Rfc2V0TmVlZHNVcGRhdGUsaDh0LnByb3RvdHlwZS5fc2V0VmFsdWVfZGlyZWN0X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGVdLFtoOHQucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheSxoOHQucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheV9zZXROZWVkc1VwZGF0ZSxoOHQucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlXSxbaDh0LnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlFbGVtZW50LGg4dC5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5RWxlbWVudF9zZXROZWVkc1VwZGF0ZSxoOHQucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZV0sW2g4dC5wcm90b3R5cGUuX3NldFZhbHVlX2Zyb21BcnJheSxoOHQucHJvdG90eXBlLl9zZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TmVlZHNVcGRhdGUsaDh0LnByb3RvdHlwZS5fc2V0VmFsdWVfZnJvbUFycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGVdXTtjbGFzcyBkOHR7Y29uc3RydWN0b3IoKXt0aGlzLnV1aWQ9WFp0KCksdGhpcy5fb2JqZWN0cz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLHRoaXMubkNhY2hlZE9iamVjdHNfPTA7Y29uc3QgdD17fTt0aGlzLl9pbmRpY2VzQnlVVUlEPXQ7Zm9yKGxldCBlPTAsbj1hcmd1bWVudHMubGVuZ3RoO2UhPT1uOysrZSl0W2FyZ3VtZW50c1tlXS51dWlkXT1lO3RoaXMuX3BhdGhzPVtdLHRoaXMuX3BhcnNlZFBhdGhzPVtdLHRoaXMuX2JpbmRpbmdzPVtdLHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aD17fTtjb25zdCBlPXRoaXM7dGhpcy5zdGF0cz17b2JqZWN0czp7Z2V0IHRvdGFsKCl7cmV0dXJuIGUuX29iamVjdHMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gdGhpcy50b3RhbC1lLm5DYWNoZWRPYmplY3RzX319LGdldCBiaW5kaW5nc1Blck9iamVjdCgpe3JldHVybiBlLl9iaW5kaW5ncy5sZW5ndGh9fX1hZGQoKXtjb25zdCB0PXRoaXMuX29iamVjdHMsZT10aGlzLl9pbmRpY2VzQnlVVUlELG49dGhpcy5fcGF0aHMsaT10aGlzLl9wYXJzZWRQYXRocyxyPXRoaXMuX2JpbmRpbmdzLG89ci5sZW5ndGg7bGV0IGEscz10Lmxlbmd0aCxsPXRoaXMubkNhY2hlZE9iamVjdHNfO2ZvcihsZXQgYz0wLHU9YXJndW1lbnRzLmxlbmd0aDtjIT09dTsrK2Mpe2NvbnN0IHU9YXJndW1lbnRzW2NdLGg9dS51dWlkO2xldCBkPWVbaF07aWYodm9pZCAwPT09ZCl7ZD1zKyssZVtoXT1kLHQucHVzaCh1KTtmb3IobGV0IHQ9MCxlPW87dCE9PWU7Kyt0KXJbdF0ucHVzaChuZXcgaDh0KHUsblt0XSxpW3RdKSl9ZWxzZSBpZihkPGwpe2E9dFtkXTtjb25zdCBzPS0tbCxjPXRbc107ZVtjLnV1aWRdPWQsdFtkXT1jLGVbaF09cyx0W3NdPXU7Zm9yKGxldCB0PTAsZT1vO3QhPT1lOysrdCl7Y29uc3QgZT1yW3RdO2xldCBvPWVbZF07ZVtkXT1lW3NdLHZvaWQgMD09PW8mJihvPW5ldyBoOHQodSxuW3RdLGlbdF0pKSxlW3NdPW99fWVsc2UgdFtkXSE9PWEmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLkFuaW1hdGlvbk9iamVjdEdyb3VwOiBEaWZmZXJlbnQgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIFVVSUQgZGV0ZWN0ZWQuIENsZWFuIHRoZSBjYWNoZXMgb3IgcmVjcmVhdGUgeW91ciBpbmZyYXN0cnVjdHVyZSB3aGVuIHJlbG9hZGluZyBzY2VuZXMuIil9dGhpcy5uQ2FjaGVkT2JqZWN0c189bH1yZW1vdmUoKXtjb25zdCB0PXRoaXMuX29iamVjdHMsZT10aGlzLl9pbmRpY2VzQnlVVUlELG49dGhpcy5fYmluZGluZ3MsaT1uLmxlbmd0aDtsZXQgcj10aGlzLm5DYWNoZWRPYmplY3RzXztmb3IobGV0IG89MCxhPWFyZ3VtZW50cy5sZW5ndGg7byE9PWE7KytvKXtjb25zdCBhPWFyZ3VtZW50c1tvXSxzPWEudXVpZCxsPWVbc107aWYodm9pZCAwIT09bCYmbD49cil7Y29uc3Qgbz1yKyssYz10W29dO2VbYy51dWlkXT1sLHRbbF09YyxlW3NdPW8sdFtvXT1hO2ZvcihsZXQgdD0wLGU9aTt0IT09ZTsrK3Qpe2NvbnN0IGU9blt0XSxpPWVbbF07ZVtsXT1lW29dLGVbb109aX19fXRoaXMubkNhY2hlZE9iamVjdHNfPXJ9dW5jYWNoZSgpe2NvbnN0IHQ9dGhpcy5fb2JqZWN0cyxlPXRoaXMuX2luZGljZXNCeVVVSUQsbj10aGlzLl9iaW5kaW5ncyxpPW4ubGVuZ3RoO2xldCByPXRoaXMubkNhY2hlZE9iamVjdHNfLG89dC5sZW5ndGg7Zm9yKGxldCBhPTAscz1hcmd1bWVudHMubGVuZ3RoO2EhPT1zOysrYSl7Y29uc3Qgcz1hcmd1bWVudHNbYV0udXVpZCxsPWVbc107aWYodm9pZCAwIT09bClpZihkZWxldGUgZVtzXSxsPHIpe2NvbnN0IGE9LS1yLHM9dFthXSxjPS0tbyx1PXRbY107ZVtzLnV1aWRdPWwsdFtsXT1zLGVbdS51dWlkXT1hLHRbYV09dSx0LnBvcCgpO2ZvcihsZXQgdD0wLGU9aTt0IT09ZTsrK3Qpe2NvbnN0IGU9blt0XSxpPWVbY107ZVtsXT1lW2FdLGVbYV09aSxlLnBvcCgpfX1lbHNle2NvbnN0IHI9LS1vLGE9dFtyXTtyPjAmJihlW2EudXVpZF09bCksdFtsXT1hLHQucG9wKCk7Zm9yKGxldCB0PTAsZT1pO3QhPT1lOysrdCl7Y29uc3QgZT1uW3RdO2VbbF09ZVtyXSxlLnBvcCgpfX19dGhpcy5uQ2FjaGVkT2JqZWN0c189cn1zdWJzY3JpYmVfKHQsZSl7Y29uc3Qgbj10aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGg7bGV0IGk9blt0XTtjb25zdCByPXRoaXMuX2JpbmRpbmdzO2lmKHZvaWQgMCE9PWkpcmV0dXJuIHJbaV07Y29uc3Qgbz10aGlzLl9wYXRocyxhPXRoaXMuX3BhcnNlZFBhdGhzLHM9dGhpcy5fb2JqZWN0cyxsPXRoaXMubkNhY2hlZE9iamVjdHNfLGM9bmV3IEFycmF5KHMubGVuZ3RoKTtpPXIubGVuZ3RoLG5bdF09aSxvLnB1c2godCksYS5wdXNoKGUpLHIucHVzaChjKTtmb3IobGV0IG49bCxpPXMubGVuZ3RoO24hPT1pOysrbiljW25dPW5ldyBoOHQoc1tuXSx0LGUpO3JldHVybiBjfXVuc3Vic2NyaWJlXyh0KXtjb25zdCBlPXRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCxuPWVbdF07aWYodm9pZCAwIT09bil7Y29uc3QgaT10aGlzLl9wYXRocyxyPXRoaXMuX3BhcnNlZFBhdGhzLG89dGhpcy5fYmluZGluZ3MsYT1vLmxlbmd0aC0xLHM9b1thXTtlW3RbYV1dPW4sb1tuXT1zLG8ucG9wKCkscltuXT1yW2FdLHIucG9wKCksaVtuXT1pW2FdLGkucG9wKCl9fX1kOHQucHJvdG90eXBlLmlzQW5pbWF0aW9uT2JqZWN0R3JvdXA9ITA7Y2xhc3MgcDh0e2NvbnN0cnVjdG9yKHQsZSxuPW51bGwsaT1lLmJsZW5kTW9kZSl7dGhpcy5fbWl4ZXI9dCx0aGlzLl9jbGlwPWUsdGhpcy5fbG9jYWxSb290PW4sdGhpcy5ibGVuZE1vZGU9aTtjb25zdCByPWUudHJhY2tzLG89ci5sZW5ndGgsYT1uZXcgQXJyYXkobykscz17ZW5kaW5nU3RhcnQ6Q1p0LGVuZGluZ0VuZDpDWnR9O2ZvcihsZXQgdD0wO3QhPT1vOysrdCl7Y29uc3QgZT1yW3RdLmNyZWF0ZUludGVycG9sYW50KG51bGwpO2FbdF09ZSxlLnNldHRpbmdzPXN9dGhpcy5faW50ZXJwb2xhbnRTZXR0aW5ncz1zLHRoaXMuX2ludGVycG9sYW50cz1hLHRoaXMuX3Byb3BlcnR5QmluZGluZ3M9bmV3IEFycmF5KG8pLHRoaXMuX2NhY2hlSW5kZXg9bnVsbCx0aGlzLl9ieUNsaXBDYWNoZUluZGV4PW51bGwsdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ9bnVsbCx0aGlzLl93ZWlnaHRJbnRlcnBvbGFudD1udWxsLHRoaXMubG9vcD0yMjAxLHRoaXMuX2xvb3BDb3VudD0tMSx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLnRpbWU9MCx0aGlzLnRpbWVTY2FsZT0xLHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT0xLHRoaXMud2VpZ2h0PTEsdGhpcy5fZWZmZWN0aXZlV2VpZ2h0PTEsdGhpcy5yZXBldGl0aW9ucz0xLzAsdGhpcy5wYXVzZWQ9ITEsdGhpcy5lbmFibGVkPSEwLHRoaXMuY2xhbXBXaGVuRmluaXNoZWQ9ITEsdGhpcy56ZXJvU2xvcGVBdFN0YXJ0PSEwLHRoaXMuemVyb1Nsb3BlQXRFbmQ9ITB9cGxheSgpe3JldHVybiB0aGlzLl9taXhlci5fYWN0aXZhdGVBY3Rpb24odGhpcyksdGhpc31zdG9wKCl7cmV0dXJuIHRoaXMuX21peGVyLl9kZWFjdGl2YXRlQWN0aW9uKHRoaXMpLHRoaXMucmVzZXQoKX1yZXNldCgpe3JldHVybiB0aGlzLnBhdXNlZD0hMSx0aGlzLmVuYWJsZWQ9ITAsdGhpcy50aW1lPTAsdGhpcy5fbG9vcENvdW50PS0xLHRoaXMuX3N0YXJ0VGltZT1udWxsLHRoaXMuc3RvcEZhZGluZygpLnN0b3BXYXJwaW5nKCl9aXNSdW5uaW5nKCl7cmV0dXJuIHRoaXMuZW5hYmxlZCYmIXRoaXMucGF1c2VkJiYwIT09dGhpcy50aW1lU2NhbGUmJm51bGw9PT10aGlzLl9zdGFydFRpbWUmJnRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbih0aGlzKX1pc1NjaGVkdWxlZCgpe3JldHVybiB0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24odGhpcyl9c3RhcnRBdCh0KXtyZXR1cm4gdGhpcy5fc3RhcnRUaW1lPXQsdGhpc31zZXRMb29wKHQsZSl7cmV0dXJuIHRoaXMubG9vcD10LHRoaXMucmVwZXRpdGlvbnM9ZSx0aGlzfXNldEVmZmVjdGl2ZVdlaWdodCh0KXtyZXR1cm4gdGhpcy53ZWlnaHQ9dCx0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9dGhpcy5lbmFibGVkP3Q6MCx0aGlzLnN0b3BGYWRpbmcoKX1nZXRFZmZlY3RpdmVXZWlnaHQoKXtyZXR1cm4gdGhpcy5fZWZmZWN0aXZlV2VpZ2h0fWZhZGVJbih0KXtyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcodCwwLDEpfWZhZGVPdXQodCl7cmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKHQsMSwwKX1jcm9zc0ZhZGVGcm9tKHQsZSxuKXtpZih0LmZhZGVPdXQoZSksdGhpcy5mYWRlSW4oZSksbil7Y29uc3Qgbj10aGlzLl9jbGlwLmR1cmF0aW9uLGk9dC5fY2xpcC5kdXJhdGlvbixyPW4vaTt0LndhcnAoMSxpL24sZSksdGhpcy53YXJwKHIsMSxlKX1yZXR1cm4gdGhpc31jcm9zc0ZhZGVUbyh0LGUsbil7cmV0dXJuIHQuY3Jvc3NGYWRlRnJvbSh0aGlzLGUsbil9c3RvcEZhZGluZygpe2NvbnN0IHQ9dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7cmV0dXJuIG51bGwhPT10JiYodGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9bnVsbCx0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQodCkpLHRoaXN9c2V0RWZmZWN0aXZlVGltZVNjYWxlKHQpe3JldHVybiB0aGlzLnRpbWVTY2FsZT10LHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT10aGlzLnBhdXNlZD8wOnQsdGhpcy5zdG9wV2FycGluZygpfWdldEVmZmVjdGl2ZVRpbWVTY2FsZSgpe3JldHVybiB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGV9c2V0RHVyYXRpb24odCl7cmV0dXJuIHRoaXMudGltZVNjYWxlPXRoaXMuX2NsaXAuZHVyYXRpb24vdCx0aGlzLnN0b3BXYXJwaW5nKCl9c3luY1dpdGgodCl7cmV0dXJuIHRoaXMudGltZT10LnRpbWUsdGhpcy50aW1lU2NhbGU9dC50aW1lU2NhbGUsdGhpcy5zdG9wV2FycGluZygpfWhhbHQodCl7cmV0dXJuIHRoaXMud2FycCh0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUsMCx0KX13YXJwKHQsZSxuKXtjb25zdCBpPXRoaXMuX21peGVyLHI9aS50aW1lLG89dGhpcy50aW1lU2NhbGU7bGV0IGE9dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7bnVsbD09PWEmJihhPWkuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKSx0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudD1hKTtjb25zdCBzPWEucGFyYW1ldGVyUG9zaXRpb25zLGw9YS5zYW1wbGVWYWx1ZXM7cmV0dXJuIHNbMF09cixzWzFdPXIrbixsWzBdPXQvbyxsWzFdPWUvbyx0aGlzfXN0b3BXYXJwaW5nKCl7Y29uc3QgdD10aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtyZXR1cm4gbnVsbCE9PXQmJih0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudD1udWxsLHRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCh0KSksdGhpc31nZXRNaXhlcigpe3JldHVybiB0aGlzLl9taXhlcn1nZXRDbGlwKCl7cmV0dXJuIHRoaXMuX2NsaXB9Z2V0Um9vdCgpe3JldHVybiB0aGlzLl9sb2NhbFJvb3R8fHRoaXMuX21peGVyLl9yb290fV91cGRhdGUodCxlLG4saSl7aWYoIXRoaXMuZW5hYmxlZClyZXR1cm4gdm9pZCB0aGlzLl91cGRhdGVXZWlnaHQodCk7Y29uc3Qgcj10aGlzLl9zdGFydFRpbWU7aWYobnVsbCE9PXIpe2NvbnN0IGk9KHQtcikqbjtpZihpPDB8fDA9PT1uKXJldHVybjt0aGlzLl9zdGFydFRpbWU9bnVsbCxlPW4qaX1lKj10aGlzLl91cGRhdGVUaW1lU2NhbGUodCk7Y29uc3Qgbz10aGlzLl91cGRhdGVUaW1lKGUpLGE9dGhpcy5fdXBkYXRlV2VpZ2h0KHQpO2lmKGE+MCl7Y29uc3QgdD10aGlzLl9pbnRlcnBvbGFudHMsZT10aGlzLl9wcm9wZXJ0eUJpbmRpbmdzO3N3aXRjaCh0aGlzLmJsZW5kTW9kZSl7Y2FzZSBQWnQ6Zm9yKGxldCBuPTAsaT10Lmxlbmd0aDtuIT09aTsrK24pdFtuXS5ldmFsdWF0ZShvKSxlW25dLmFjY3VtdWxhdGVBZGRpdGl2ZShhKTticmVhaztjYXNlIExadDpkZWZhdWx0OmZvcihsZXQgbj0wLHI9dC5sZW5ndGg7biE9PXI7KytuKXRbbl0uZXZhbHVhdGUobyksZVtuXS5hY2N1bXVsYXRlKGksYSl9fX1fdXBkYXRlV2VpZ2h0KHQpe2xldCBlPTA7aWYodGhpcy5lbmFibGVkKXtlPXRoaXMud2VpZ2h0O2NvbnN0IG49dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7aWYobnVsbCE9PW4pe2NvbnN0IGk9bi5ldmFsdWF0ZSh0KVswXTtlKj1pLHQ+bi5wYXJhbWV0ZXJQb3NpdGlvbnNbMV0mJih0aGlzLnN0b3BGYWRpbmcoKSwwPT09aSYmKHRoaXMuZW5hYmxlZD0hMSkpfX1yZXR1cm4gdGhpcy5fZWZmZWN0aXZlV2VpZ2h0PWUsZX1fdXBkYXRlVGltZVNjYWxlKHQpe2xldCBlPTA7aWYoIXRoaXMucGF1c2VkKXtlPXRoaXMudGltZVNjYWxlO2NvbnN0IG49dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7bnVsbCE9PW4mJihlKj1uLmV2YWx1YXRlKHQpWzBdLHQ+bi5wYXJhbWV0ZXJQb3NpdGlvbnNbMV0mJih0aGlzLnN0b3BXYXJwaW5nKCksMD09PWU/dGhpcy5wYXVzZWQ9ITA6dGhpcy50aW1lU2NhbGU9ZSkpfXJldHVybiB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU9ZSxlfV91cGRhdGVUaW1lKHQpe2NvbnN0IGU9dGhpcy5fY2xpcC5kdXJhdGlvbixuPXRoaXMubG9vcDtsZXQgaT10aGlzLnRpbWUrdCxyPXRoaXMuX2xvb3BDb3VudDtjb25zdCBvPTIyMDI9PT1uO2lmKDA9PT10KXJldHVybi0xPT09cj9pOm8mJjE9PSgxJnIpP2UtaTppO2lmKDIyMDA9PT1uKXstMT09PXImJih0aGlzLl9sb29wQ291bnQ9MCx0aGlzLl9zZXRFbmRpbmdzKCEwLCEwLCExKSk7dDp7aWYoaT49ZSlpPWU7ZWxzZXtpZighKGk8MCkpe3RoaXMudGltZT1pO2JyZWFrIHR9aT0wfXRoaXMuY2xhbXBXaGVuRmluaXNoZWQ/dGhpcy5wYXVzZWQ9ITA6dGhpcy5lbmFibGVkPSExLHRoaXMudGltZT1pLHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImZpbmlzaGVkIixhY3Rpb246dGhpcyxkaXJlY3Rpb246dDwwPy0xOjF9KX19ZWxzZXtpZigtMT09PXImJih0Pj0wPyhyPTAsdGhpcy5fc2V0RW5kaW5ncyghMCwwPT09dGhpcy5yZXBldGl0aW9ucyxvKSk6dGhpcy5fc2V0RW5kaW5ncygwPT09dGhpcy5yZXBldGl0aW9ucywhMCxvKSksaT49ZXx8aTwwKXtjb25zdCBuPU1hdGguZmxvb3IoaS9lKTtpLT1lKm4scis9TWF0aC5hYnMobik7Y29uc3QgYT10aGlzLnJlcGV0aXRpb25zLXI7aWYoYTw9MCl0aGlzLmNsYW1wV2hlbkZpbmlzaGVkP3RoaXMucGF1c2VkPSEwOnRoaXMuZW5hYmxlZD0hMSxpPXQ+MD9lOjAsdGhpcy50aW1lPWksdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7dHlwZToiZmluaXNoZWQiLGFjdGlvbjp0aGlzLGRpcmVjdGlvbjp0PjA/MTotMX0pO2Vsc2V7aWYoMT09PWEpe2NvbnN0IGU9dDwwO3RoaXMuX3NldEVuZGluZ3MoZSwhZSxvKX1lbHNlIHRoaXMuX3NldEVuZGluZ3MoITEsITEsbyk7dGhpcy5fbG9vcENvdW50PXIsdGhpcy50aW1lPWksdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7dHlwZToibG9vcCIsYWN0aW9uOnRoaXMsbG9vcERlbHRhOm59KX19ZWxzZSB0aGlzLnRpbWU9aTtpZihvJiYxPT0oMSZyKSlyZXR1cm4gZS1pfXJldHVybiBpfV9zZXRFbmRpbmdzKHQsZSxuKXtjb25zdCBpPXRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M7bj8oaS5lbmRpbmdTdGFydD1BWnQsaS5lbmRpbmdFbmQ9QVp0KTooaS5lbmRpbmdTdGFydD10P3RoaXMuemVyb1Nsb3BlQXRTdGFydD9BWnQ6Q1p0OmtadCxpLmVuZGluZ0VuZD1lP3RoaXMuemVyb1Nsb3BlQXRFbmQ/QVp0OkNadDprWnQpfV9zY2hlZHVsZUZhZGluZyh0LGUsbil7Y29uc3QgaT10aGlzLl9taXhlcixyPWkudGltZTtsZXQgbz10aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtudWxsPT09byYmKG89aS5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpLHRoaXMuX3dlaWdodEludGVycG9sYW50PW8pO2NvbnN0IGE9by5wYXJhbWV0ZXJQb3NpdGlvbnMscz1vLnNhbXBsZVZhbHVlcztyZXR1cm4gYVswXT1yLHNbMF09ZSxhWzFdPXIrdCxzWzFdPW4sdGhpc319Y2xhc3MgZjh0IGV4dGVuZHMgalp0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5fcm9vdD10LHRoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCksdGhpcy5fYWNjdUluZGV4PTAsdGhpcy50aW1lPTAsdGhpcy50aW1lU2NhbGU9MX1fYmluZEFjdGlvbih0LGUpe2NvbnN0IG49dC5fbG9jYWxSb290fHx0aGlzLl9yb290LGk9dC5fY2xpcC50cmFja3Mscj1pLmxlbmd0aCxvPXQuX3Byb3BlcnR5QmluZGluZ3MsYT10Ll9pbnRlcnBvbGFudHMscz1uLnV1aWQsbD10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWU7bGV0IGM9bFtzXTt2b2lkIDA9PT1jJiYoYz17fSxsW3NdPWMpO2ZvcihsZXQgdD0wO3QhPT1yOysrdCl7Y29uc3Qgcj1pW3RdLGw9ci5uYW1lO2xldCB1PWNbbF07aWYodm9pZCAwIT09dSlvW3RdPXU7ZWxzZXtpZih1PW9bdF0sdm9pZCAwIT09dSl7bnVsbD09PXUuX2NhY2hlSW5kZXgmJigrK3UucmVmZXJlbmNlQ291bnQsdGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKHUscyxsKSk7Y29udGludWV9dT1uZXcgZTh0KGg4dC5jcmVhdGUobixsLGUmJmUuX3Byb3BlcnR5QmluZGluZ3NbdF0uYmluZGluZy5wYXJzZWRQYXRoKSxyLlZhbHVlVHlwZU5hbWUsci5nZXRWYWx1ZVNpemUoKSksKyt1LnJlZmVyZW5jZUNvdW50LHRoaXMuX2FkZEluYWN0aXZlQmluZGluZyh1LHMsbCksb1t0XT11fWFbdF0ucmVzdWx0QnVmZmVyPXUuYnVmZmVyfX1fYWN0aXZhdGVBY3Rpb24odCl7aWYoIXRoaXMuX2lzQWN0aXZlQWN0aW9uKHQpKXtpZihudWxsPT09dC5fY2FjaGVJbmRleCl7Y29uc3QgZT0odC5fbG9jYWxSb290fHx0aGlzLl9yb290KS51dWlkLG49dC5fY2xpcC51dWlkLGk9dGhpcy5fYWN0aW9uc0J5Q2xpcFtuXTt0aGlzLl9iaW5kQWN0aW9uKHQsaSYmaS5rbm93bkFjdGlvbnNbMF0pLHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKHQsbixlKX1jb25zdCBlPXQuX3Byb3BlcnR5QmluZGluZ3M7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aDt0IT09bjsrK3Qpe2NvbnN0IG49ZVt0XTswPT1uLnVzZUNvdW50KysmJih0aGlzLl9sZW5kQmluZGluZyhuKSxuLnNhdmVPcmlnaW5hbFN0YXRlKCkpfXRoaXMuX2xlbmRBY3Rpb24odCl9fV9kZWFjdGl2YXRlQWN0aW9uKHQpe2lmKHRoaXMuX2lzQWN0aXZlQWN0aW9uKHQpKXtjb25zdCBlPXQuX3Byb3BlcnR5QmluZGluZ3M7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aDt0IT09bjsrK3Qpe2NvbnN0IG49ZVt0XTswPT0tLW4udXNlQ291bnQmJihuLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCksdGhpcy5fdGFrZUJhY2tCaW5kaW5nKG4pKX10aGlzLl90YWtlQmFja0FjdGlvbih0KX19X2luaXRNZW1vcnlNYW5hZ2VyKCl7dGhpcy5fYWN0aW9ucz1bXSx0aGlzLl9uQWN0aXZlQWN0aW9ucz0wLHRoaXMuX2FjdGlvbnNCeUNsaXA9e30sdGhpcy5fYmluZGluZ3M9W10sdGhpcy5fbkFjdGl2ZUJpbmRpbmdzPTAsdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lPXt9LHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHM9W10sdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHM9MDtjb25zdCB0PXRoaXM7dGhpcy5zdGF0cz17YWN0aW9uczp7Z2V0IHRvdGFsKCl7cmV0dXJuIHQuX2FjdGlvbnMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gdC5fbkFjdGl2ZUFjdGlvbnN9fSxiaW5kaW5nczp7Z2V0IHRvdGFsKCl7cmV0dXJuIHQuX2JpbmRpbmdzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIHQuX25BY3RpdmVCaW5kaW5nc319LGNvbnRyb2xJbnRlcnBvbGFudHM6e2dldCB0b3RhbCgpe3JldHVybiB0Ll9jb250cm9sSW50ZXJwb2xhbnRzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIHQuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzfX19fV9pc0FjdGl2ZUFjdGlvbih0KXtjb25zdCBlPXQuX2NhY2hlSW5kZXg7cmV0dXJuIG51bGwhPT1lJiZlPHRoaXMuX25BY3RpdmVBY3Rpb25zfV9hZGRJbmFjdGl2ZUFjdGlvbih0LGUsbil7Y29uc3QgaT10aGlzLl9hY3Rpb25zLHI9dGhpcy5fYWN0aW9uc0J5Q2xpcDtsZXQgbz1yW2VdO2lmKHZvaWQgMD09PW8pbz17a25vd25BY3Rpb25zOlt0XSxhY3Rpb25CeVJvb3Q6e319LHQuX2J5Q2xpcENhY2hlSW5kZXg9MCxyW2VdPW87ZWxzZXtjb25zdCBlPW8ua25vd25BY3Rpb25zO3QuX2J5Q2xpcENhY2hlSW5kZXg9ZS5sZW5ndGgsZS5wdXNoKHQpfXQuX2NhY2hlSW5kZXg9aS5sZW5ndGgsaS5wdXNoKHQpLG8uYWN0aW9uQnlSb290W25dPXR9X3JlbW92ZUluYWN0aXZlQWN0aW9uKHQpe2NvbnN0IGU9dGhpcy5fYWN0aW9ucyxuPWVbZS5sZW5ndGgtMV0saT10Ll9jYWNoZUluZGV4O24uX2NhY2hlSW5kZXg9aSxlW2ldPW4sZS5wb3AoKSx0Ll9jYWNoZUluZGV4PW51bGw7Y29uc3Qgcj10Ll9jbGlwLnV1aWQsbz10aGlzLl9hY3Rpb25zQnlDbGlwLGE9b1tyXSxzPWEua25vd25BY3Rpb25zLGw9c1tzLmxlbmd0aC0xXSxjPXQuX2J5Q2xpcENhY2hlSW5kZXg7bC5fYnlDbGlwQ2FjaGVJbmRleD1jLHNbY109bCxzLnBvcCgpLHQuX2J5Q2xpcENhY2hlSW5kZXg9bnVsbCxkZWxldGUgYS5hY3Rpb25CeVJvb3RbKHQuX2xvY2FsUm9vdHx8dGhpcy5fcm9vdCkudXVpZF0sMD09PXMubGVuZ3RoJiZkZWxldGUgb1tyXSx0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKHQpfV9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKHQpe2NvbnN0IGU9dC5fcHJvcGVydHlCaW5kaW5ncztmb3IobGV0IHQ9MCxuPWUubGVuZ3RoO3QhPT1uOysrdCl7Y29uc3Qgbj1lW3RdOzA9PS0tbi5yZWZlcmVuY2VDb3VudCYmdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKG4pfX1fbGVuZEFjdGlvbih0KXtjb25zdCBlPXRoaXMuX2FjdGlvbnMsbj10Ll9jYWNoZUluZGV4LGk9dGhpcy5fbkFjdGl2ZUFjdGlvbnMrKyxyPWVbaV07dC5fY2FjaGVJbmRleD1pLGVbaV09dCxyLl9jYWNoZUluZGV4PW4sZVtuXT1yfV90YWtlQmFja0FjdGlvbih0KXtjb25zdCBlPXRoaXMuX2FjdGlvbnMsbj10Ll9jYWNoZUluZGV4LGk9LS10aGlzLl9uQWN0aXZlQWN0aW9ucyxyPWVbaV07dC5fY2FjaGVJbmRleD1pLGVbaV09dCxyLl9jYWNoZUluZGV4PW4sZVtuXT1yfV9hZGRJbmFjdGl2ZUJpbmRpbmcodCxlLG4pe2NvbnN0IGk9dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLHI9dGhpcy5fYmluZGluZ3M7bGV0IG89aVtlXTt2b2lkIDA9PT1vJiYobz17fSxpW2VdPW8pLG9bbl09dCx0Ll9jYWNoZUluZGV4PXIubGVuZ3RoLHIucHVzaCh0KX1fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKHQpe2NvbnN0IGU9dGhpcy5fYmluZGluZ3Msbj10LmJpbmRpbmcsaT1uLnJvb3ROb2RlLnV1aWQscj1uLnBhdGgsbz10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsYT1vW2ldLHM9ZVtlLmxlbmd0aC0xXSxsPXQuX2NhY2hlSW5kZXg7cy5fY2FjaGVJbmRleD1sLGVbbF09cyxlLnBvcCgpLGRlbGV0ZSBhW3JdLDA9PT1PYmplY3Qua2V5cyhhKS5sZW5ndGgmJmRlbGV0ZSBvW2ldfV9sZW5kQmluZGluZyh0KXtjb25zdCBlPXRoaXMuX2JpbmRpbmdzLG49dC5fY2FjaGVJbmRleCxpPXRoaXMuX25BY3RpdmVCaW5kaW5ncysrLHI9ZVtpXTt0Ll9jYWNoZUluZGV4PWksZVtpXT10LHIuX2NhY2hlSW5kZXg9bixlW25dPXJ9X3Rha2VCYWNrQmluZGluZyh0KXtjb25zdCBlPXRoaXMuX2JpbmRpbmdzLG49dC5fY2FjaGVJbmRleCxpPS0tdGhpcy5fbkFjdGl2ZUJpbmRpbmdzLHI9ZVtpXTt0Ll9jYWNoZUluZGV4PWksZVtpXT10LHIuX2NhY2hlSW5kZXg9bixlW25dPXJ9X2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKXtjb25zdCB0PXRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsZT10aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cysrO2xldCBuPXRbZV07cmV0dXJuIHZvaWQgMD09PW4mJihuPW5ldyBSNnQobmV3IEZsb2F0MzJBcnJheSgyKSxuZXcgRmxvYXQzMkFycmF5KDIpLDEsdGhpcy5fY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlciksbi5fX2NhY2hlSW5kZXg9ZSx0W2VdPW4pLG59X3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KHQpe2NvbnN0IGU9dGhpcy5fY29udHJvbEludGVycG9sYW50cyxuPXQuX19jYWNoZUluZGV4LGk9LS10aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyxyPWVbaV07dC5fX2NhY2hlSW5kZXg9aSxlW2ldPXQsci5fX2NhY2hlSW5kZXg9bixlW25dPXJ9Y2xpcEFjdGlvbih0LGUsbil7Y29uc3QgaT1lfHx0aGlzLl9yb290LHI9aS51dWlkO2xldCBvPSJzdHJpbmciPT10eXBlb2YgdD9HNnQuZmluZEJ5TmFtZShpLHQpOnQ7Y29uc3QgYT1udWxsIT09bz9vLnV1aWQ6dCxzPXRoaXMuX2FjdGlvbnNCeUNsaXBbYV07bGV0IGw9bnVsbDtpZih2b2lkIDA9PT1uJiYobj1udWxsIT09bz9vLmJsZW5kTW9kZTpMWnQpLHZvaWQgMCE9PXMpe2NvbnN0IHQ9cy5hY3Rpb25CeVJvb3Rbcl07aWYodm9pZCAwIT09dCYmdC5ibGVuZE1vZGU9PT1uKXJldHVybiB0O2w9cy5rbm93bkFjdGlvbnNbMF0sbnVsbD09PW8mJihvPWwuX2NsaXApfWlmKG51bGw9PT1vKXJldHVybiBudWxsO2NvbnN0IGM9bmV3IHA4dCh0aGlzLG8sZSxuKTtyZXR1cm4gdGhpcy5fYmluZEFjdGlvbihjLGwpLHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKGMsYSxyKSxjfWV4aXN0aW5nQWN0aW9uKHQsZSl7Y29uc3Qgbj1lfHx0aGlzLl9yb290LGk9bi51dWlkLHI9InN0cmluZyI9PXR5cGVvZiB0P0c2dC5maW5kQnlOYW1lKG4sdCk6dCxvPXRoaXMuX2FjdGlvbnNCeUNsaXBbcj9yLnV1aWQ6dF07cmV0dXJuIHZvaWQgMCE9PW8mJm8uYWN0aW9uQnlSb290W2ldfHxudWxsfXN0b3BBbGxBY3Rpb24oKXtjb25zdCB0PXRoaXMuX2FjdGlvbnM7Zm9yKGxldCBlPXRoaXMuX25BY3RpdmVBY3Rpb25zLTE7ZT49MDstLWUpdFtlXS5zdG9wKCk7cmV0dXJuIHRoaXN9dXBkYXRlKHQpe2NvbnN0IGU9dGhpcy5fYWN0aW9ucyxuPXRoaXMuX25BY3RpdmVBY3Rpb25zLGk9dGhpcy50aW1lKz10Kj10aGlzLnRpbWVTY2FsZSxyPU1hdGguc2lnbih0KSxvPXRoaXMuX2FjY3VJbmRleF49MTtmb3IobGV0IGE9MDthIT09bjsrK2EpZVthXS5fdXBkYXRlKGksdCxyLG8pO2NvbnN0IGE9dGhpcy5fYmluZGluZ3Mscz10aGlzLl9uQWN0aXZlQmluZGluZ3M7Zm9yKGxldCB0PTA7dCE9PXM7Kyt0KWFbdF0uYXBwbHkobyk7cmV0dXJuIHRoaXN9c2V0VGltZSh0KXt0aGlzLnRpbWU9MDtmb3IobGV0IHQ9MDt0PHRoaXMuX2FjdGlvbnMubGVuZ3RoO3QrKyl0aGlzLl9hY3Rpb25zW3RdLnRpbWU9MDtyZXR1cm4gdGhpcy51cGRhdGUodCl9Z2V0Um9vdCgpe3JldHVybiB0aGlzLl9yb290fXVuY2FjaGVDbGlwKHQpe2NvbnN0IGU9dGhpcy5fYWN0aW9ucyxuPXQudXVpZCxpPXRoaXMuX2FjdGlvbnNCeUNsaXAscj1pW25dO2lmKHZvaWQgMCE9PXIpe2NvbnN0IHQ9ci5rbm93bkFjdGlvbnM7Zm9yKGxldCBuPTAsaT10Lmxlbmd0aDtuIT09aTsrK24pe2NvbnN0IGk9dFtuXTt0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKGkpO2NvbnN0IHI9aS5fY2FjaGVJbmRleCxvPWVbZS5sZW5ndGgtMV07aS5fY2FjaGVJbmRleD1udWxsLGkuX2J5Q2xpcENhY2hlSW5kZXg9bnVsbCxvLl9jYWNoZUluZGV4PXIsZVtyXT1vLGUucG9wKCksdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbihpKX1kZWxldGUgaVtuXX19dW5jYWNoZVJvb3QodCl7Y29uc3QgZT10LnV1aWQsbj10aGlzLl9hY3Rpb25zQnlDbGlwO2Zvcihjb25zdCB0IGluIG4pe2NvbnN0IGk9blt0XS5hY3Rpb25CeVJvb3RbZV07dm9pZCAwIT09aSYmKHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oaSksdGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oaSkpfWNvbnN0IGk9dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lW2VdO2lmKHZvaWQgMCE9PWkpZm9yKGNvbnN0IHQgaW4gaSl7Y29uc3QgZT1pW3RdO2UucmVzdG9yZU9yaWdpbmFsU3RhdGUoKSx0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcoZSl9fXVuY2FjaGVBY3Rpb24odCxlKXtjb25zdCBuPXRoaXMuZXhpc3RpbmdBY3Rpb24odCxlKTtudWxsIT09biYmKHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24obiksdGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24obikpfX1mOHQucHJvdG90eXBlLl9jb250cm9sSW50ZXJwb2xhbnRzUmVzdWx0QnVmZmVyPW5ldyBGbG9hdDMyQXJyYXkoMSk7Y2xhc3MgbTh0e2NvbnN0cnVjdG9yKHQpeyJzdHJpbmciPT10eXBlb2YgdCYmKGNvbnNvbGUud2FybigiVEhSRUUuVW5pZm9ybTogVHlwZSBwYXJhbWV0ZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4iKSx0PWFyZ3VtZW50c1sxXSksdGhpcy52YWx1ZT10fWNsb25lKCl7cmV0dXJuIG5ldyBtOHQodm9pZCAwPT09dGhpcy52YWx1ZS5jbG9uZT90aGlzLnZhbHVlOnRoaXMudmFsdWUuY2xvbmUoKSl9fWNsYXNzIGc4dCBleHRlbmRzICQ1dHtjb25zdHJ1Y3Rvcih0LGUsbj0xKXtzdXBlcih0LGUpLHRoaXMubWVzaFBlckF0dHJpYnV0ZT1ufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5tZXNoUGVyQXR0cmlidXRlPXQubWVzaFBlckF0dHJpYnV0ZSx0aGlzfWNsb25lKHQpe2NvbnN0IGU9c3VwZXIuY2xvbmUodCk7cmV0dXJuIGUubWVzaFBlckF0dHJpYnV0ZT10aGlzLm1lc2hQZXJBdHRyaWJ1dGUsZX10b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcj0hMCxlLm1lc2hQZXJBdHRyaWJ1dGU9dGhpcy5tZXNoUGVyQXR0cmlidXRlLGV9fWc4dC5wcm90b3R5cGUuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcj0hMDtjbGFzcyBfOHR7Y29uc3RydWN0b3IodCxlLG4saSxyKXt0aGlzLmJ1ZmZlcj10LHRoaXMudHlwZT1lLHRoaXMuaXRlbVNpemU9bix0aGlzLmVsZW1lbnRTaXplPWksdGhpcy5jb3VudD1yLHRoaXMudmVyc2lvbj0wfXNldCBuZWVkc1VwZGF0ZSh0KXshMD09PXQmJnRoaXMudmVyc2lvbisrfXNldEJ1ZmZlcih0KXtyZXR1cm4gdGhpcy5idWZmZXI9dCx0aGlzfXNldFR5cGUodCxlKXtyZXR1cm4gdGhpcy50eXBlPXQsdGhpcy5lbGVtZW50U2l6ZT1lLHRoaXN9c2V0SXRlbVNpemUodCl7cmV0dXJuIHRoaXMuaXRlbVNpemU9dCx0aGlzfXNldENvdW50KHQpe3JldHVybiB0aGlzLmNvdW50PXQsdGhpc319ZnVuY3Rpb24geTh0KHQsZSl7cmV0dXJuIHQuZGlzdGFuY2UtZS5kaXN0YW5jZX1mdW5jdGlvbiB2OHQodCxlLG4saSl7aWYodC5sYXllcnMudGVzdChlLmxheWVycykmJnQucmF5Y2FzdChlLG4pLCEwPT09aSl7Y29uc3QgaT10LmNoaWxkcmVuO2ZvcihsZXQgdD0wLHI9aS5sZW5ndGg7dDxyO3QrKyl2OHQoaVt0XSxlLG4sITApfX1fOHQucHJvdG90eXBlLmlzR0xCdWZmZXJBdHRyaWJ1dGU9ITA7Y2xhc3MgYjh0e2NvbnN0cnVjdG9yKHQ9MSxlPTAsbj0wKXtyZXR1cm4gdGhpcy5yYWRpdXM9dCx0aGlzLnBoaT1lLHRoaXMudGhldGE9bix0aGlzfXNldCh0LGUsbil7cmV0dXJuIHRoaXMucmFkaXVzPXQsdGhpcy5waGk9ZSx0aGlzLnRoZXRhPW4sdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLnJhZGl1cz10LnJhZGl1cyx0aGlzLnBoaT10LnBoaSx0aGlzLnRoZXRhPXQudGhldGEsdGhpc31tYWtlU2FmZSgpe2NvbnN0IHQ9MWUtNjtyZXR1cm4gdGhpcy5waGk9TWF0aC5tYXgodCxNYXRoLm1pbihNYXRoLlBJLXQsdGhpcy5waGkpKSx0aGlzfXNldEZyb21WZWN0b3IzKHQpe3JldHVybiB0aGlzLnNldEZyb21DYXJ0ZXNpYW5Db29yZHModC54LHQueSx0LnopfXNldEZyb21DYXJ0ZXNpYW5Db29yZHModCxlLG4pe3JldHVybiB0aGlzLnJhZGl1cz1NYXRoLnNxcnQodCp0K2UqZStuKm4pLDA9PT10aGlzLnJhZGl1cz8odGhpcy50aGV0YT0wLHRoaXMucGhpPTApOih0aGlzLnRoZXRhPU1hdGguYXRhbjIodCxuKSx0aGlzLnBoaT1NYXRoLmFjb3MoJFp0KGUvdGhpcy5yYWRpdXMsLTEsMSkpKSx0aGlzfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfX1jb25zdCB4OHQ9bmV3IG1KdDtjbGFzcyB3OHR7Y29uc3RydWN0b3IodD1uZXcgbUp0KDEvMCwxLzApLGU9bmV3IG1KdCgtMS8wLC0xLzApKXt0aGlzLm1pbj10LHRoaXMubWF4PWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMubWluLmNvcHkodCksdGhpcy5tYXguY29weShlKSx0aGlzfXNldEZyb21Qb2ludHModCl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspdGhpcy5leHBhbmRCeVBvaW50KHRbZV0pO3JldHVybiB0aGlzfXNldEZyb21DZW50ZXJBbmRTaXplKHQsZSl7Y29uc3Qgbj14OHQuY29weShlKS5tdWx0aXBseVNjYWxhciguNSk7cmV0dXJuIHRoaXMubWluLmNvcHkodCkuc3ViKG4pLHRoaXMubWF4LmNvcHkodCkuYWRkKG4pLHRoaXN9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpc31tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5taW4ueD10aGlzLm1pbi55PTEvMCx0aGlzLm1heC54PXRoaXMubWF4Lnk9LTEvMCx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5tYXgueDx0aGlzLm1pbi54fHx0aGlzLm1heC55PHRoaXMubWluLnl9Z2V0Q2VudGVyKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDApOnQuYWRkVmVjdG9ycyh0aGlzLm1pbix0aGlzLm1heCkubXVsdGlwbHlTY2FsYXIoLjUpfWdldFNpemUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3Quc2V0KDAsMCk6dC5zdWJWZWN0b3JzKHRoaXMubWF4LHRoaXMubWluKX1leHBhbmRCeVBvaW50KHQpe3JldHVybiB0aGlzLm1pbi5taW4odCksdGhpcy5tYXgubWF4KHQpLHRoaXN9ZXhwYW5kQnlWZWN0b3IodCl7cmV0dXJuIHRoaXMubWluLnN1Yih0KSx0aGlzLm1heC5hZGQodCksdGhpc31leHBhbmRCeVNjYWxhcih0KXtyZXR1cm4gdGhpcy5taW4uYWRkU2NhbGFyKC10KSx0aGlzLm1heC5hZGRTY2FsYXIodCksdGhpc31jb250YWluc1BvaW50KHQpe3JldHVybiEodC54PHRoaXMubWluLnh8fHQueD50aGlzLm1heC54fHx0Lnk8dGhpcy5taW4ueXx8dC55PnRoaXMubWF4LnkpfWNvbnRhaW5zQm94KHQpe3JldHVybiB0aGlzLm1pbi54PD10Lm1pbi54JiZ0Lm1heC54PD10aGlzLm1heC54JiZ0aGlzLm1pbi55PD10Lm1pbi55JiZ0Lm1heC55PD10aGlzLm1heC55fWdldFBhcmFtZXRlcih0LGUpe3JldHVybiBlLnNldCgodC54LXRoaXMubWluLngpLyh0aGlzLm1heC54LXRoaXMubWluLngpLCh0LnktdGhpcy5taW4ueSkvKHRoaXMubWF4LnktdGhpcy5taW4ueSkpfWludGVyc2VjdHNCb3godCl7cmV0dXJuISh0Lm1heC54PHRoaXMubWluLnh8fHQubWluLng+dGhpcy5tYXgueHx8dC5tYXgueTx0aGlzLm1pbi55fHx0Lm1pbi55PnRoaXMubWF4LnkpfWNsYW1wUG9pbnQodCxlKXtyZXR1cm4gZS5jb3B5KHQpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KX1kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHg4dC5jb3B5KHQpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KS5zdWIodCkubGVuZ3RoKCl9aW50ZXJzZWN0KHQpe3JldHVybiB0aGlzLm1pbi5tYXgodC5taW4pLHRoaXMubWF4Lm1pbih0Lm1heCksdGhpc311bmlvbih0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQubWluKSx0aGlzLm1heC5tYXgodC5tYXgpLHRoaXN9dHJhbnNsYXRlKHQpe3JldHVybiB0aGlzLm1pbi5hZGQodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm1pbi5lcXVhbHModGhpcy5taW4pJiZ0Lm1heC5lcXVhbHModGhpcy5tYXgpfX13OHQucHJvdG90eXBlLmlzQm94Mj0hMDtjb25zdCBTOHQ9bmV3IENKdCxNOHQ9bmV3IENKdDtjbGFzcyBFOHR7Y29uc3RydWN0b3IodD1uZXcgQ0p0LGU9bmV3IENKdCl7dGhpcy5zdGFydD10LHRoaXMuZW5kPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMuc3RhcnQuY29weSh0KSx0aGlzLmVuZC5jb3B5KGUpLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5zdGFydC5jb3B5KHQuc3RhcnQpLHRoaXMuZW5kLmNvcHkodC5lbmQpLHRoaXN9Z2V0Q2VudGVyKHQpe3JldHVybiB0LmFkZFZlY3RvcnModGhpcy5zdGFydCx0aGlzLmVuZCkubXVsdGlwbHlTY2FsYXIoLjUpfWRlbHRhKHQpe3JldHVybiB0LnN1YlZlY3RvcnModGhpcy5lbmQsdGhpcy5zdGFydCl9ZGlzdGFuY2VTcSgpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuZW5kKX1kaXN0YW5jZSgpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG8odGhpcy5lbmQpfWF0KHQsZSl7cmV0dXJuIHRoaXMuZGVsdGEoZSkubXVsdGlwbHlTY2FsYXIodCkuYWRkKHRoaXMuc3RhcnQpfWNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIodCxlKXtTOHQuc3ViVmVjdG9ycyh0LHRoaXMuc3RhcnQpLE04dC5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpO2NvbnN0IG49TTh0LmRvdChNOHQpO2xldCBpPU04dC5kb3QoUzh0KS9uO3JldHVybiBlJiYoaT0kWnQoaSwwLDEpKSxpfWNsb3Nlc3RQb2ludFRvUG9pbnQodCxlLG4pe2NvbnN0IGk9dGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKHQsZSk7cmV0dXJuIHRoaXMuZGVsdGEobikubXVsdGlwbHlTY2FsYXIoaSkuYWRkKHRoaXMuc3RhcnQpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5zdGFydC5hcHBseU1hdHJpeDQodCksdGhpcy5lbmQuYXBwbHlNYXRyaXg0KHQpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0LnN0YXJ0LmVxdWFscyh0aGlzLnN0YXJ0KSYmdC5lbmQuZXF1YWxzKHRoaXMuZW5kKX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19Y2xhc3MgVDh0IGV4dGVuZHMga1F0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5tYXRlcmlhbD10LHRoaXMucmVuZGVyPWZ1bmN0aW9uKCl7fSx0aGlzLmhhc1Bvc2l0aW9ucz0hMSx0aGlzLmhhc05vcm1hbHM9ITEsdGhpcy5oYXNDb2xvcnM9ITEsdGhpcy5oYXNVdnM9ITEsdGhpcy5wb3NpdGlvbkFycmF5PW51bGwsdGhpcy5ub3JtYWxBcnJheT1udWxsLHRoaXMuY29sb3JBcnJheT1udWxsLHRoaXMudXZBcnJheT1udWxsLHRoaXMuY291bnQ9MH19VDh0LnByb3RvdHlwZS5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdD0hMDtjb25zdCBDOHQ9bmV3IENKdCxBOHQ9bmV3IENKdCxrOHQ9bmV3IHJRdCxMOHQ9bmV3IHJRdDtjbGFzcyBQOHQgZXh0ZW5kcyBVM3R7Y29uc3RydWN0b3IodCl7Y29uc3QgZT1OOHQodCksbj1uZXcgYjF0LGk9W10scj1bXSxvPW5ldyAkUXQoMCwwLDEpLGE9bmV3ICRRdCgwLDEsMCk7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2NvbnN0IG49ZVt0XTtuLnBhcmVudCYmbi5wYXJlbnQuaXNCb25lJiYoaS5wdXNoKDAsMCwwKSxpLnB1c2goMCwwLDApLHIucHVzaChvLnIsby5nLG8uYiksci5wdXNoKGEucixhLmcsYS5iKSl9bi5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KGksMykpLG4uc2V0QXR0cmlidXRlKCJjb2xvciIsbmV3IGwxdChyLDMpKSxzdXBlcihuLG5ldyBJM3Qoe3ZlcnRleENvbG9yczohMCxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSx0b25lTWFwcGVkOiExLHRyYW5zcGFyZW50OiEwfSkpLHRoaXMudHlwZT0iU2tlbGV0b25IZWxwZXIiLHRoaXMuaXNTa2VsZXRvbkhlbHBlcj0hMCx0aGlzLnJvb3Q9dCx0aGlzLmJvbmVzPWUsdGhpcy5tYXRyaXg9dC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITF9dXBkYXRlTWF0cml4V29ybGQodCl7Y29uc3QgZT10aGlzLmJvbmVzLG49dGhpcy5nZW9tZXRyeSxpPW4uZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO0w4dC5jb3B5KHRoaXMucm9vdC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCk7Zm9yKGxldCB0PTAsbj0wO3Q8ZS5sZW5ndGg7dCsrKXtjb25zdCByPWVbdF07ci5wYXJlbnQmJnIucGFyZW50LmlzQm9uZSYmKGs4dC5tdWx0aXBseU1hdHJpY2VzKEw4dCxyLm1hdHJpeFdvcmxkKSxBOHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGs4dCksaS5zZXRYWVoobixBOHQueCxBOHQueSxBOHQueiksazh0Lm11bHRpcGx5TWF0cmljZXMoTDh0LHIucGFyZW50Lm1hdHJpeFdvcmxkKSxBOHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGs4dCksaS5zZXRYWVoobisxLEE4dC54LEE4dC55LEE4dC56KSxuKz0yKX1uLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKS5uZWVkc1VwZGF0ZT0hMCxzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KX19ZnVuY3Rpb24gTjh0KHQpe2NvbnN0IGU9W107dCYmdC5pc0JvbmUmJmUucHVzaCh0KTtmb3IobGV0IG49MDtuPHQuY2hpbGRyZW4ubGVuZ3RoO24rKyllLnB1c2guYXBwbHkoZSxOOHQodC5jaGlsZHJlbltuXSkpO3JldHVybiBlfWNvbnN0IEk4dD1uZXcgQ0p0LFI4dD1uZXcgJFF0LE84dD1uZXcgJFF0O2NsYXNzIHo4dCBleHRlbmRzIFUzdHtjb25zdHJ1Y3Rvcih0PTEwLGU9MTAsbj00NDczOTI0LGk9ODk0Nzg0OCl7bj1uZXcgJFF0KG4pLGk9bmV3ICRRdChpKTtjb25zdCByPWUvMixvPXQvZSxhPXQvMixzPVtdLGw9W107Zm9yKGxldCB0PTAsYz0wLHU9LWE7dDw9ZTt0KyssdSs9byl7cy5wdXNoKC1hLDAsdSxhLDAsdSkscy5wdXNoKHUsMCwtYSx1LDAsYSk7Y29uc3QgZT10PT09cj9uOmk7ZS50b0FycmF5KGwsYyksYys9MyxlLnRvQXJyYXkobCxjKSxjKz0zLGUudG9BcnJheShsLGMpLGMrPTMsZS50b0FycmF5KGwsYyksYys9M31jb25zdCBjPW5ldyBiMXQ7Yy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KHMsMykpLGMuc2V0QXR0cmlidXRlKCJjb2xvciIsbmV3IGwxdChsLDMpKSxzdXBlcihjLG5ldyBJM3Qoe3ZlcnRleENvbG9yczohMCx0b25lTWFwcGVkOiExfSkpLHRoaXMudHlwZT0iR3JpZEhlbHBlciJ9fWNvbnN0IEQ4dD1uZXcgQ0p0LEI4dD1uZXcgQ0p0LEg4dD1uZXcgQ0p0LEY4dD1uZXcgQ0p0LFY4dD1uZXcgVzF0O2Z1bmN0aW9uIFU4dCh0LGUsbixpLHIsbyxhKXtGOHQuc2V0KHIsbyxhKS51bnByb2plY3QoaSk7Y29uc3Qgcz1lW3RdO2lmKHZvaWQgMCE9PXMpe2NvbnN0IHQ9bi5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7Zm9yKGxldCBlPTAsbj1zLmxlbmd0aDtlPG47ZSsrKXQuc2V0WFlaKHNbZV0sRjh0LngsRjh0LnksRjh0LnopfX1jb25zdCBqOHQ9bmV3IExKdDtjbGFzcyBHOHQgZXh0ZW5kcyBVM3R7Y29uc3RydWN0b3IodCxlPTE2Nzc2OTYwKXtjb25zdCBuPW5ldyBVaW50MTZBcnJheShbMCwxLDEsMiwyLDMsMywwLDQsNSw1LDYsNiw3LDcsNCwwLDQsMSw1LDIsNiwzLDddKSxpPW5ldyBGbG9hdDMyQXJyYXkoMjQpLHI9bmV3IGIxdDtyLnNldEluZGV4KG5ldyBRUXQobiwxKSksci5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgUVF0KGksMykpLHN1cGVyKHIsbmV3IEkzdCh7Y29sb3I6ZSx0b25lTWFwcGVkOiExfSkpLHRoaXMub2JqZWN0PXQsdGhpcy50eXBlPSJCb3hIZWxwZXIiLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLnVwZGF0ZSgpfXVwZGF0ZSh0KXtpZih2b2lkIDAhPT10JiZjb25zb2xlLndhcm4oIlRIUkVFLkJveEhlbHBlcjogLnVwZGF0ZSgpIGhhcyBubyBsb25nZXIgYXJndW1lbnRzLiIpLHZvaWQgMCE9PXRoaXMub2JqZWN0JiZqOHQuc2V0RnJvbU9iamVjdCh0aGlzLm9iamVjdCksajh0LmlzRW1wdHkoKSlyZXR1cm47Y29uc3QgZT1qOHQubWluLG49ajh0Lm1heCxpPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbixyPWkuYXJyYXk7clswXT1uLngsclsxXT1uLnksclsyXT1uLnosclszXT1lLngscls0XT1uLnkscls1XT1uLnoscls2XT1lLngscls3XT1lLnkscls4XT1uLnoscls5XT1uLngsclsxMF09ZS55LHJbMTFdPW4ueixyWzEyXT1uLngsclsxM109bi55LHJbMTRdPWUueixyWzE1XT1lLngsclsxNl09bi55LHJbMTddPWUueixyWzE4XT1lLngsclsxOV09ZS55LHJbMjBdPWUueixyWzIxXT1uLngsclsyMl09ZS55LHJbMjNdPWUueixpLm5lZWRzVXBkYXRlPSEwLHRoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl9c2V0RnJvbU9iamVjdCh0KXtyZXR1cm4gdGhpcy5vYmplY3Q9dCx0aGlzLnVwZGF0ZSgpLHRoaXN9Y29weSh0KXtyZXR1cm4gVTN0LnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyx0KSx0aGlzLm9iamVjdD10Lm9iamVjdCx0aGlzfX1jb25zdCBXOHQ9bmV3IENKdDtsZXQgcTh0LFk4dDtjbGFzcyBYOHQgZXh0ZW5kcyBVM3R7Y29uc3RydWN0b3IodD0xKXtjb25zdCBlPVswLDAsMCx0LDAsMCwwLDAsMCwwLHQsMCwwLDAsMCwwLDAsdF0sbj1uZXcgYjF0O24uc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGwxdChlLDMpKSxuLnNldEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBsMXQoWzEsMCwwLDEsLjYsMCwwLDEsMCwuNiwxLDAsMCwwLDEsMCwuNiwxXSwzKSksc3VwZXIobixuZXcgSTN0KHt2ZXJ0ZXhDb2xvcnM6ITAsdG9uZU1hcHBlZDohMX0pKSx0aGlzLnR5cGU9IkF4ZXNIZWxwZXIifXNldENvbG9ycyh0LGUsbil7Y29uc3QgaT1uZXcgJFF0LHI9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLmNvbG9yLmFycmF5O3JldHVybiBpLnNldCh0KSxpLnRvQXJyYXkociwwKSxpLnRvQXJyYXkociwzKSxpLnNldChlKSxpLnRvQXJyYXkociw2KSxpLnRvQXJyYXkociw5KSxpLnNldChuKSxpLnRvQXJyYXkociwxMiksaS50b0FycmF5KHIsMTUpLHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvci5uZWVkc1VwZGF0ZT0hMCx0aGlzfWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX19Y29uc3QgJDh0PW5ldyBGbG9hdDMyQXJyYXkoMSksSzh0PW5ldyBJbnQzMkFycmF5KCQ4dC5idWZmZXIpO2g0dC5jcmVhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gY29uc29sZS5sb2coIlRIUkVFLkN1cnZlLmNyZWF0ZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQiKSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGg0dC5wcm90b3R5cGUpLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXQsdC5wcm90b3R5cGUuZ2V0UG9pbnQ9ZSx0fSxpOXQucHJvdG90eXBlLmZyb21Qb2ludHM9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUGF0aDogLmZyb21Qb2ludHMoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tUG9pbnRzKCkuIiksdGhpcy5zZXRGcm9tUG9pbnRzKHQpfSx6OHQucHJvdG90eXBlLnNldENvbG9ycz1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkdyaWRIZWxwZXI6IHNldENvbG9ycygpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHBhc3MgdGhlbSBpbiB0aGUgY29uc3RydWN0b3IgaW5zdGVhZC4iKX0sUDh0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Ta2VsZXRvbkhlbHBlcjogdXBkYXRlKCkgbm8gbG9uZ2VyIG5lZWRzIHRvIGJlIGNhbGxlZC4iKX0sJDZ0LnByb3RvdHlwZS5leHRyYWN0VXJsQmFzZT1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5Mb2FkZXI6IC5leHRyYWN0VXJsQmFzZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5Mb2FkZXJVdGlscy5leHRyYWN0VXJsQmFzZSgpIGluc3RlYWQuIiksRTl0LmV4dHJhY3RVcmxCYXNlKHQpfSwkNnQuSGFuZGxlcnM9e2FkZDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkxvYWRlcjogSGFuZGxlcnMuYWRkKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIExvYWRpbmdNYW5hZ2VyLmFkZEhhbmRsZXIoKSBpbnN0ZWFkLiIpfSxnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Mb2FkZXI6IEhhbmRsZXJzLmdldCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBMb2FkaW5nTWFuYWdlci5nZXRIYW5kbGVyKCkgaW5zdGVhZC4iKX19LHc4dC5wcm90b3R5cGUuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4iKSx0aGlzLmdldENlbnRlcih0KX0sdzh0LnByb3RvdHlwZS5lbXB0eT1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5lbXB0eSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmlzRW1wdHkoKS4iKSx0aGlzLmlzRW1wdHkoKX0sdzh0LnByb3RvdHlwZS5pc0ludGVyc2VjdGlvbkJveD1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuIiksdGhpcy5pbnRlcnNlY3RzQm94KHQpfSx3OHQucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQm94MjogLnNpemUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRTaXplKCkuIiksdGhpcy5nZXRTaXplKHQpfSxMSnQucHJvdG90eXBlLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuIiksdGhpcy5nZXRDZW50ZXIodCl9LExKdC5wcm90b3R5cGUuZW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuIiksdGhpcy5pc0VtcHR5KCl9LExKdC5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb25Cb3g9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLiIpLHRoaXMuaW50ZXJzZWN0c0JveCh0KX0sTEp0LnByb3RvdHlwZS5pc0ludGVyc2VjdGlvblNwaGVyZT1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuaXNJbnRlcnNlY3Rpb25TcGhlcmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzU3BoZXJlKCkuIiksdGhpcy5pbnRlcnNlY3RzU3BoZXJlKHQpfSxMSnQucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQm94MzogLnNpemUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRTaXplKCkuIiksdGhpcy5nZXRTaXplKHQpfSwkSnQucHJvdG90eXBlLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuU3BoZXJlOiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuIiksdGhpcy5pc0VtcHR5KCl9LGkwdC5wcm90b3R5cGUuc2V0RnJvbU1hdHJpeD1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5GcnVzdHVtOiAuc2V0RnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21Qcm9qZWN0aW9uTWF0cml4KCkuIiksdGhpcy5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeCh0KX0sRTh0LnByb3RvdHlwZS5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuTGluZTM6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4iKSx0aGlzLmdldENlbnRlcih0KX0sZ0p0LnByb3RvdHlwZS5mbGF0dGVuVG9BcnJheU9mZnNldD1mdW5jdGlvbih0LGUpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDM6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuIiksdGhpcy50b0FycmF5KHQsZSl9LGdKdC5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4MyggbWF0cml4ICkgaW5zdGVhZC4iKSx0LmFwcGx5TWF0cml4Myh0aGlzKX0sZ0p0LnByb3RvdHlwZS5tdWx0aXBseVZlY3RvcjNBcnJheT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGdKdC5wcm90b3R5cGUuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZT1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXgzOiAuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBhdHRyaWJ1dGUuYXBwbHlNYXRyaXgzKCBtYXRyaXggKSBpbnN0ZWFkLiIpLHQuYXBwbHlNYXRyaXgzKHRoaXMpfSxnSnQucHJvdG90eXBlLmFwcGx5VG9WZWN0b3IzQXJyYXk9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXgzOiAuYXBwbHlUb1ZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGdKdC5wcm90b3R5cGUuZ2V0SW52ZXJzZT1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXgzOiAuZ2V0SW52ZXJzZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBtYXRyaXhJbnYuY29weSggbWF0cml4ICkuaW52ZXJ0KCk7IGluc3RlYWQuIiksdGhpcy5jb3B5KHQpLmludmVydCgpfSxyUXQucHJvdG90eXBlLmV4dHJhY3RQb3NpdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuZXh0cmFjdFBvc2l0aW9uKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY29weVBvc2l0aW9uKCkuIiksdGhpcy5jb3B5UG9zaXRpb24odCl9LHJRdC5wcm90b3R5cGUuZmxhdHRlblRvQXJyYXlPZmZzZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuZmxhdHRlblRvQXJyYXlPZmZzZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnRvQXJyYXkoKSBpbnN0ZWFkLiIpLHRoaXMudG9BcnJheSh0LGUpfSxyUXQucHJvdG90eXBlLmdldFBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmdldFBvc2l0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLiIpLChuZXcgQ0p0KS5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMyl9LHJRdC5wcm90b3R5cGUuc2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbj1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuc2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCkuIiksdGhpcy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KX0sclF0LnByb3RvdHlwZS5tdWx0aXBseVRvQXJyYXk9ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVRvQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyUXQucHJvdG90eXBlLm11bHRpcGx5VmVjdG9yMz1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuIiksdC5hcHBseU1hdHJpeDQodGhpcyl9LHJRdC5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3I0PWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjQoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4NCggbWF0cml4ICkgaW5zdGVhZC4iKSx0LmFwcGx5TWF0cml4NCh0aGlzKX0sclF0LnByb3RvdHlwZS5tdWx0aXBseVZlY3RvcjNBcnJheT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHJRdC5wcm90b3R5cGUucm90YXRlQXhpcz1mdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMudHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLiIpLHQudHJhbnNmb3JtRGlyZWN0aW9uKHRoaXMpfSxyUXQucHJvdG90eXBlLmNyb3NzVmVjdG9yPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5jcm9zc1ZlY3RvcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLiIpLHQuYXBwbHlNYXRyaXg0KHRoaXMpfSxyUXQucHJvdG90eXBlLnRyYW5zbGF0ZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyUXQucHJvdG90eXBlLnJvdGF0ZVg9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlWCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHJRdC5wcm90b3R5cGUucm90YXRlWT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVZKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sclF0LnByb3RvdHlwZS5yb3RhdGVaPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLnJvdGF0ZVooKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyUXQucHJvdG90eXBlLnJvdGF0ZUJ5QXhpcz1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVCeUF4aXMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyUXQucHJvdG90eXBlLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGU9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYXR0cmlidXRlLmFwcGx5TWF0cml4NCggbWF0cml4ICkgaW5zdGVhZC4iKSx0LmFwcGx5TWF0cml4NCh0aGlzKX0sclF0LnByb3RvdHlwZS5hcHBseVRvVmVjdG9yM0FycmF5PWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLmFwcGx5VG9WZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyUXQucHJvdG90eXBlLm1ha2VGcnVzdHVtPWZ1bmN0aW9uKHQsZSxuLGkscixvKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubWFrZUZydXN0dW0oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSBpbnN0ZWFkLiIpLHRoaXMubWFrZVBlcnNwZWN0aXZlKHQsZSxpLG4scixvKX0sclF0LnByb3RvdHlwZS5nZXRJbnZlcnNlPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5nZXRJbnZlcnNlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG1hdHJpeEludi5jb3B5KCBtYXRyaXggKS5pbnZlcnQoKTsgaW5zdGVhZC4iKSx0aGlzLmNvcHkodCkuaW52ZXJ0KCl9LHQwdC5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb25MaW5lPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlBsYW5lOiAuaXNJbnRlcnNlY3Rpb25MaW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0xpbmUoKS4iKSx0aGlzLmludGVyc2VjdHNMaW5lKHQpfSxUSnQucHJvdG90eXBlLm11bHRpcGx5VmVjdG9yMz1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGlzIG5vdyB2ZWN0b3IuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICkgaW5zdGVhZC4iKSx0LmFwcGx5UXVhdGVybmlvbih0aGlzKX0sVEp0LnByb3RvdHlwZS5pbnZlcnNlPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLmludmVyc2UoKSBoYXMgYmVlbiByZW5hbWVkIHRvIGludmVydCgpLiIpLHRoaXMuaW52ZXJ0KCl9LGlRdC5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb25Cb3g9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuIiksdGhpcy5pbnRlcnNlY3RzQm94KHQpfSxpUXQucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uUGxhbmU9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25QbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNQbGFuZSgpLiIpLHRoaXMuaW50ZXJzZWN0c1BsYW5lKHQpfSxpUXQucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uU3BoZXJlPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1NwaGVyZSgpLiIpLHRoaXMuaW50ZXJzZWN0c1NwaGVyZSh0KX0sRlF0LnByb3RvdHlwZS5hcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5hcmVhKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QXJlYSgpLiIpLHRoaXMuZ2V0QXJlYSgpfSxGUXQucHJvdG90eXBlLmJhcnljb29yZEZyb21Qb2ludD1mdW5jdGlvbih0LGUpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAuYmFyeWNvb3JkRnJvbVBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QmFyeWNvb3JkKCkuIiksdGhpcy5nZXRCYXJ5Y29vcmQodCxlKX0sRlF0LnByb3RvdHlwZS5taWRwb2ludD1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLm1pZHBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0TWlkcG9pbnQoKS4iKSx0aGlzLmdldE1pZHBvaW50KHQpfSxGUXQucHJvdG90eXBlbm9ybWFsPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAubm9ybWFsKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Tm9ybWFsKCkuIiksdGhpcy5nZXROb3JtYWwodCl9LEZRdC5wcm90b3R5cGUucGxhbmU9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5wbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFBsYW5lKCkuIiksdGhpcy5nZXRQbGFuZSh0KX0sRlF0LmJhcnljb29yZEZyb21Qb2ludD1mdW5jdGlvbih0LGUsbixpLHIpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAuYmFyeWNvb3JkRnJvbVBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QmFyeWNvb3JkKCkuIiksRlF0LmdldEJhcnljb29yZCh0LGUsbixpLHIpfSxGUXQubm9ybWFsPWZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAubm9ybWFsKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Tm9ybWFsKCkuIiksRlF0LmdldE5vcm1hbCh0LGUsbixpKX0scjl0LnByb3RvdHlwZS5leHRyYWN0QWxsUG9pbnRzPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlNoYXBlOiAuZXh0cmFjdEFsbFBvaW50cygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuZXh0cmFjdFBvaW50cygpIGluc3RlYWQuIiksdGhpcy5leHRyYWN0UG9pbnRzKHQpfSxyOXQucHJvdG90eXBlLmV4dHJ1ZGU9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuU2hhcGU6IC5leHRydWRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEV4dHJ1ZGVHZW9tZXRyeSgpIGluc3RlYWQuIiksbmV3IHI2dCh0aGlzLHQpfSxyOXQucHJvdG90eXBlLm1ha2VHZW9tZXRyeT1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5TaGFwZTogLm1ha2VHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBTaGFwZUdlb21ldHJ5KCkgaW5zdGVhZC4iKSxuZXcgaDZ0KHRoaXMsdCl9LG1KdC5wcm90b3R5cGUuZnJvbUF0dHJpYnV0ZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuIiksdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSxuKX0sbUp0LnByb3RvdHlwZS5kaXN0YW5jZVRvTWFuaGF0dGFuPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5kaXN0YW5jZVRvTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuRGlzdGFuY2VUbygpLiIpLHRoaXMubWFuaGF0dGFuRGlzdGFuY2VUbyh0KX0sbUp0LnByb3RvdHlwZS5sZW5ndGhNYW5oYXR0YW49ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiAubGVuZ3RoTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuTGVuZ3RoKCkuIiksdGhpcy5tYW5oYXR0YW5MZW5ndGgoKX0sQ0p0LnByb3RvdHlwZS5zZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeD1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlZlY3RvcjM6IC5zZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBpbnN0ZWFkLiIpfSxDSnQucHJvdG90eXBlLnNldEV1bGVyRnJvbVF1YXRlcm5pb249ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5WZWN0b3IzOiAuc2V0RXVsZXJGcm9tUXVhdGVybmlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUXVhdGVybmlvbigpIGluc3RlYWQuIil9LENKdC5wcm90b3R5cGUuZ2V0UG9zaXRpb25Gcm9tTWF0cml4PWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5nZXRQb3NpdGlvbkZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4UG9zaXRpb24oKS4iKSx0aGlzLnNldEZyb21NYXRyaXhQb3NpdGlvbih0KX0sQ0p0LnByb3RvdHlwZS5nZXRTY2FsZUZyb21NYXRyaXg9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmdldFNjYWxlRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhTY2FsZSgpLiIpLHRoaXMuc2V0RnJvbU1hdHJpeFNjYWxlKHQpfSxDSnQucHJvdG90eXBlLmdldENvbHVtbkZyb21NYXRyaXg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZ2V0Q29sdW1uRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhDb2x1bW4oKS4iKSx0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oZSx0KX0sQ0p0LnByb3RvdHlwZS5hcHBseVByb2plY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmFwcGx5UHJvamVjdGlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuYXBwbHlNYXRyaXg0KCBtICkgaW5zdGVhZC4iKSx0aGlzLmFwcGx5TWF0cml4NCh0KX0sQ0p0LnByb3RvdHlwZS5mcm9tQXR0cmlidXRlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKSx0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlLG4pfSxDSnQucHJvdG90eXBlLmRpc3RhbmNlVG9NYW5oYXR0YW49ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmRpc3RhbmNlVG9NYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5EaXN0YW5jZVRvKCkuIiksdGhpcy5tYW5oYXR0YW5EaXN0YW5jZVRvKHQpfSxDSnQucHJvdG90eXBlLmxlbmd0aE1hbmhhdHRhbj1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4iKSx0aGlzLm1hbmhhdHRhbkxlbmd0aCgpfSx3SnQucHJvdG90eXBlLmZyb21BdHRyaWJ1dGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpLHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUsbil9LHdKdC5wcm90b3R5cGUubGVuZ3RoTWFuaGF0dGFuPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yNDogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLiIpLHRoaXMubWFuaGF0dGFuTGVuZ3RoKCl9LGtRdC5wcm90b3R5cGUuZ2V0Q2hpbGRCeU5hbWU9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5nZXRDaGlsZEJ5TmFtZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE9iamVjdEJ5TmFtZSgpLiIpLHRoaXMuZ2V0T2JqZWN0QnlOYW1lKHQpfSxrUXQucHJvdG90eXBlLnJlbmRlckRlcHRoPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnJlbmRlckRlcHRoIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAucmVuZGVyT3JkZXIsIGluc3RlYWQuIil9LGtRdC5wcm90b3R5cGUudHJhbnNsYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKSBpbnN0ZWFkLiIpLHRoaXMudHJhbnNsYXRlT25BeGlzKGUsdCl9LGtRdC5wcm90b3R5cGUuZ2V0V29ybGRSb3RhdGlvbj1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRSb3RhdGlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5PYmplY3QzRC5nZXRXb3JsZFF1YXRlcm5pb24oIHRhcmdldCApIGluc3RlYWQuIil9LGtRdC5wcm90b3R5cGUuYXBwbHlNYXRyaXg9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5hcHBseU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmFwcGx5TWF0cml4NCgpLiIpLHRoaXMuYXBwbHlNYXRyaXg0KHQpfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhrUXQucHJvdG90eXBlLHtldWxlck9yZGVyOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmV1bGVyT3JkZXIgaXMgbm93IC5yb3RhdGlvbi5vcmRlci4iKSx0aGlzLnJvdGF0aW9uLm9yZGVyfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmV1bGVyT3JkZXIgaXMgbm93IC5yb3RhdGlvbi5vcmRlci4iKSx0aGlzLnJvdGF0aW9uLm9yZGVyPXR9fSx1c2VRdWF0ZXJuaW9uOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAudXNlUXVhdGVybmlvbiBoYXMgYmVlbiByZW1vdmVkLiBUaGUgbGlicmFyeSBub3cgdXNlcyBxdWF0ZXJuaW9ucyBieSBkZWZhdWx0LiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAudXNlUXVhdGVybmlvbiBoYXMgYmVlbiByZW1vdmVkLiBUaGUgbGlicmFyeSBub3cgdXNlcyBxdWF0ZXJuaW9ucyBieSBkZWZhdWx0LiIpfX19KSxCMXQucHJvdG90eXBlLnNldERyYXdNb2RlPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWVzaDogLnNldERyYXdNb2RlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIHJlbmRlcmVyIG5vdyBhbHdheXMgYXNzdW1lcyBUSFJFRS5UcmlhbmdsZXNEcmF3TW9kZS4gVHJhbnNmb3JtIHlvdXIgZ2VvbWV0cnkgdmlhIEJ1ZmZlckdlb21ldHJ5VXRpbHMudG9UcmlhbmdsZXNEcmF3TW9kZSgpIGlmIG5lY2Vzc2FyeS4iKX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQjF0LnByb3RvdHlwZSx7ZHJhd01vZGU6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5NZXNoOiAuZHJhd01vZGUgaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIHJlbmRlcmVyIG5vdyBhbHdheXMgYXNzdW1lcyBUSFJFRS5UcmlhbmdsZXNEcmF3TW9kZS4iKSwwfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NZXNoOiAuZHJhd01vZGUgaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIHJlbmRlcmVyIG5vdyBhbHdheXMgYXNzdW1lcyBUSFJFRS5UcmlhbmdsZXNEcmF3TW9kZS4gVHJhbnNmb3JtIHlvdXIgZ2VvbWV0cnkgdmlhIEJ1ZmZlckdlb21ldHJ5VXRpbHMudG9UcmlhbmdsZXNEcmF3TW9kZSgpIGlmIG5lY2Vzc2FyeS4iKX19fSksdzN0LnByb3RvdHlwZS5pbml0Qm9uZXM9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Ta2lubmVkTWVzaDogaW5pdEJvbmVzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0scTF0LnByb3RvdHlwZS5zZXRMZW5zPWZ1bmN0aW9uKHQsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYS5zZXRMZW5zIGlzIGRlcHJlY2F0ZWQuIFVzZSAuc2V0Rm9jYWxMZW5ndGggYW5kIC5maWxtR2F1Z2UgZm9yIGEgcGhvdG9ncmFwaGljIHNldHVwLiIpLHZvaWQgMCE9PWUmJih0aGlzLmZpbG1HYXVnZT1lKSx0aGlzLnNldEZvY2FsTGVuZ3RoKHQpfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvOXQucHJvdG90eXBlLHtvbmx5U2hhZG93OntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAub25seVNoYWRvdyBoYXMgYmVlbiByZW1vdmVkLiIpfX0sc2hhZG93Q2FtZXJhRm92OntzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUZvdiBpcyBub3cgLnNoYWRvdy5jYW1lcmEuZm92LiIpLHRoaXMuc2hhZG93LmNhbWVyYS5mb3Y9dH19LHNoYWRvd0NhbWVyYUxlZnQ6e3NldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhTGVmdCBpcyBub3cgLnNoYWRvdy5jYW1lcmEubGVmdC4iKSx0aGlzLnNoYWRvdy5jYW1lcmEubGVmdD10fX0sc2hhZG93Q2FtZXJhUmlnaHQ6e3NldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhUmlnaHQgaXMgbm93IC5zaGFkb3cuY2FtZXJhLnJpZ2h0LiIpLHRoaXMuc2hhZG93LmNhbWVyYS5yaWdodD10fX0sc2hhZG93Q2FtZXJhVG9wOntzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVRvcCBpcyBub3cgLnNoYWRvdy5jYW1lcmEudG9wLiIpLHRoaXMuc2hhZG93LmNhbWVyYS50b3A9dH19LHNoYWRvd0NhbWVyYUJvdHRvbTp7c2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFCb3R0b20gaXMgbm93IC5zaGFkb3cuY2FtZXJhLmJvdHRvbS4iKSx0aGlzLnNoYWRvdy5jYW1lcmEuYm90dG9tPXR9fSxzaGFkb3dDYW1lcmFOZWFyOntzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYU5lYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLm5lYXIuIiksdGhpcy5zaGFkb3cuY2FtZXJhLm5lYXI9dH19LHNoYWRvd0NhbWVyYUZhcjp7c2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZhci4iKSx0aGlzLnNoYWRvdy5jYW1lcmEuZmFyPXR9fSxzaGFkb3dDYW1lcmFWaXNpYmxlOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVmlzaWJsZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkNhbWVyYUhlbHBlciggbGlnaHQuc2hhZG93LmNhbWVyYSApIGluc3RlYWQuIil9fSxzaGFkb3dCaWFzOntzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0JpYXMgaXMgbm93IC5zaGFkb3cuYmlhcy4iKSx0aGlzLnNoYWRvdy5iaWFzPXR9fSxzaGFkb3dEYXJrbmVzczp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0RhcmtuZXNzIGhhcyBiZWVuIHJlbW92ZWQuIil9fSxzaGFkb3dNYXBXaWR0aDp7c2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBXaWR0aCBpcyBub3cgLnNoYWRvdy5tYXBTaXplLndpZHRoLiIpLHRoaXMuc2hhZG93Lm1hcFNpemUud2lkdGg9dH19LHNoYWRvd01hcEhlaWdodDp7c2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBIZWlnaHQgaXMgbm93IC5zaGFkb3cubWFwU2l6ZS5oZWlnaHQuIiksdGhpcy5zaGFkb3cubWFwU2l6ZS5oZWlnaHQ9dH19fSksT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUVF0LnByb3RvdHlwZSx7bGVuZ3RoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5sZW5ndGggaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5jb3VudCBpbnN0ZWFkLiIpLHRoaXMuYXJyYXkubGVuZ3RofX0sZHluYW1pYzp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAuZHluYW1pYyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnVzYWdlIGluc3RlYWQuIiksdGhpcy51c2FnZT09PVZadH0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5keW5hbWljIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudXNhZ2UgaW5zdGVhZC4iKSx0aGlzLnNldFVzYWdlKFZadCl9fX0pLFFRdC5wcm90b3R5cGUuc2V0RHluYW1pYz1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5zZXREeW5hbWljKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5zZXRVc2FnZSgpIGluc3RlYWQuIiksdGhpcy5zZXRVc2FnZSghMD09PXQ/Vlp0OkZadCksdGhpc30sUVF0LnByb3RvdHlwZS5jb3B5SW5kaWNlc0FycmF5PWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAuY29weUluZGljZXNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LFFRdC5wcm90b3R5cGUuc2V0QXJyYXk9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5zZXRBcnJheSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgQnVmZmVyR2VvbWV0cnkgLnNldEF0dHJpYnV0ZSB0byByZXBsYWNlL3Jlc2l6ZSBhdHRyaWJ1dGUgYnVmZmVycyIpfSxiMXQucHJvdG90eXBlLmFkZEluZGV4PWZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRJbmRleCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEluZGV4KCkuIiksdGhpcy5zZXRJbmRleCh0KX0sYjF0LnByb3RvdHlwZS5hZGRBdHRyaWJ1dGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZEF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEF0dHJpYnV0ZSgpLiIpLGUmJmUuaXNCdWZmZXJBdHRyaWJ1dGV8fGUmJmUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZT8iaW5kZXgiPT09dD8oY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS5hZGRBdHRyaWJ1dGU6IFVzZSAuc2V0SW5kZXgoKSBmb3IgaW5kZXggYXR0cmlidXRlLiIpLHRoaXMuc2V0SW5kZXgoZSksdGhpcyk6dGhpcy5zZXRBdHRyaWJ1dGUodCxlKTooY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZEF0dHJpYnV0ZSgpIG5vdyBleHBlY3RzICggbmFtZSwgYXR0cmlidXRlICkuIiksdGhpcy5zZXRBdHRyaWJ1dGUodCxuZXcgUVF0KGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pKSl9LGIxdC5wcm90b3R5cGUuYWRkRHJhd0NhbGw9ZnVuY3Rpb24odCxlLG4pe3ZvaWQgMCE9PW4mJmNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGREcmF3Q2FsbCgpIG5vIGxvbmdlciBzdXBwb3J0cyBpbmRleE9mZnNldC4iKSxjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkRHJhd0NhbGwoKSBpcyBub3cgLmFkZEdyb3VwKCkuIiksdGhpcy5hZGRHcm91cCh0LGUpfSxiMXQucHJvdG90eXBlLmNsZWFyRHJhd0NhbGxzPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNsZWFyRHJhd0NhbGxzKCkgaXMgbm93IC5jbGVhckdyb3VwcygpLiIpLHRoaXMuY2xlYXJHcm91cHMoKX0sYjF0LnByb3RvdHlwZS5jb21wdXRlT2Zmc2V0cz1mdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlT2Zmc2V0cygpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGIxdC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAucmVtb3ZlQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZGVsZXRlQXR0cmlidXRlKCkuIiksdGhpcy5kZWxldGVBdHRyaWJ1dGUodCl9LGIxdC5wcm90b3R5cGUuYXBwbHlNYXRyaXg9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hcHBseU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmFwcGx5TWF0cml4NCgpLiIpLHRoaXMuYXBwbHlNYXRyaXg0KHQpfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhiMXQucHJvdG90eXBlLHtkcmF3Y2FsbHM6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmRyYXdjYWxscyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuIiksdGhpcy5ncm91cHN9fSxvZmZzZXRzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLm9mZnNldHMgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ3JvdXBzLiIpLHRoaXMuZ3JvdXBzfX19KSwkNXQucHJvdG90eXBlLnNldER5bmFtaWM9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuSW50ZXJsZWF2ZWRCdWZmZXI6IC5zZXREeW5hbWljKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5zZXRVc2FnZSgpIGluc3RlYWQuIiksdGhpcy5zZXRVc2FnZSghMD09PXQ/Vlp0OkZadCksdGhpc30sJDV0LnByb3RvdHlwZS5zZXRBcnJheT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkludGVybGVhdmVkQnVmZmVyOiAuc2V0QXJyYXkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEJ1ZmZlckdlb21ldHJ5IC5zZXRBdHRyaWJ1dGUgdG8gcmVwbGFjZS9yZXNpemUgYXR0cmlidXRlIGJ1ZmZlcnMiKX0scjZ0LnByb3RvdHlwZS5nZXRBcnJheXM9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlR2VvbWV0cnk6IC5nZXRBcnJheXMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyNnQucHJvdG90eXBlLmFkZFNoYXBlTGlzdD1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogLmFkZFNoYXBlTGlzdCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHI2dC5wcm90b3R5cGUuYWRkU2hhcGU9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlR2VvbWV0cnk6IC5hZGRTaGFwZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LFg1dC5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNjZW5lOiAuZGlzcG9zZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LG04dC5wcm90b3R5cGUub25VcGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5Vbmlmb3JtOiAub25VcGRhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4iKSx0aGlzfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhVUXQucHJvdG90eXBlLHt3cmFwQXJvdW5kOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLiIpfX0sb3ZlcmRyYXc6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6IC5vdmVyZHJhdyBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAub3ZlcmRyYXcgaGFzIGJlZW4gcmVtb3ZlZC4iKX19LHdyYXBSR0I6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcFJHQiBoYXMgYmVlbiByZW1vdmVkLiIpLG5ldyAkUXR9fSxzaGFkaW5nOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS4iK3RoaXMudHlwZSsiOiAuc2hhZGluZyBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdGhlIGJvb2xlYW4gLmZsYXRTaGFkaW5nIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLiIrdGhpcy50eXBlKyI6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4iKSx0aGlzLmZsYXRTaGFkaW5nPTE9PT10fX0sc3RlbmNpbE1hc2s6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLiIrdGhpcy50eXBlKyI6IC5zdGVuY2lsTWFzayBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnN0ZW5jaWxGdW5jTWFzayBpbnN0ZWFkLiIpLHRoaXMuc3RlbmNpbEZ1bmNNYXNrfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS4iK3RoaXMudHlwZSsiOiAuc3RlbmNpbE1hc2sgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5zdGVuY2lsRnVuY01hc2sgaW5zdGVhZC4iKSx0aGlzLnN0ZW5jaWxGdW5jTWFzaz10fX0sdmVydGV4VGFuZ2VudHM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnZlcnRleFRhbmdlbnRzIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnZlcnRleFRhbmdlbnRzIGhhcyBiZWVuIHJlbW92ZWQuIil9fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEcxdC5wcm90b3R5cGUse2Rlcml2YXRpdmVzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5TaGFkZXJNYXRlcmlhbDogLmRlcml2YXRpdmVzIGhhcyBiZWVuIG1vdmVkIHRvIC5leHRlbnNpb25zLmRlcml2YXRpdmVzLiIpLHRoaXMuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlc30sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuIFNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuIiksdGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzPXR9fX0pLEc1dC5wcm90b3R5cGUuY2xlYXJUYXJnZXQ9ZnVuY3Rpb24odCxlLG4saSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuY2xlYXJUYXJnZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnNldFJlbmRlclRhcmdldCgpIGFuZCAuY2xlYXIoKSBpbnN0ZWFkLiIpLHRoaXMuc2V0UmVuZGVyVGFyZ2V0KHQpLHRoaXMuY2xlYXIoZSxuLGkpfSxHNXQucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYW5pbWF0ZSgpIGlzIG5vdyAuc2V0QW5pbWF0aW9uTG9vcCgpLiIpLHRoaXMuc2V0QW5pbWF0aW9uTG9vcCh0KX0sRzV0LnByb3RvdHlwZS5nZXRDdXJyZW50UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldEN1cnJlbnRSZW5kZXJUYXJnZXQoKSBpcyBub3cgLmdldFJlbmRlclRhcmdldCgpLiIpLHRoaXMuZ2V0UmVuZGVyVGFyZ2V0KCl9LEc1dC5wcm90b3R5cGUuZ2V0TWF4QW5pc290cm9weT1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRNYXhBbmlzb3Ryb3B5KCkgaXMgbm93IC5jYXBhYmlsaXRpZXMuZ2V0TWF4QW5pc290cm9weSgpLiIpLHRoaXMuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKX0sRzV0LnByb3RvdHlwZS5nZXRQcmVjaXNpb249ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0UHJlY2lzaW9uKCkgaXMgbm93IC5jYXBhYmlsaXRpZXMucHJlY2lzaW9uLiIpLHRoaXMuY2FwYWJpbGl0aWVzLnByZWNpc2lvbn0sRzV0LnByb3RvdHlwZS5yZXNldEdMU3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAucmVzZXRHTFN0YXRlKCkgaXMgbm93IC5zdGF0ZS5yZXNldCgpLiIpLHRoaXMuc3RhdGUucmVzZXQoKX0sRzV0LnByb3RvdHlwZS5zdXBwb3J0c0Zsb2F0VGV4dHVyZXM9ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApLiIpLHRoaXMuZXh0ZW5zaW9ucy5nZXQoIk9FU190ZXh0dXJlX2Zsb2F0Iil9LEc1dC5wcm90b3R5cGUuc3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlcz1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0hhbGZGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnICkuIiksdGhpcy5leHRlbnNpb25zLmdldCgiT0VTX3RleHR1cmVfaGFsZl9mbG9hdCIpfSxHNXQucHJvdG90eXBlLnN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlcz1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyApLiIpLHRoaXMuZXh0ZW5zaW9ucy5nZXQoIk9FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyIpfSxHNXQucHJvdG90eXBlLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApLiIpLHRoaXMuZXh0ZW5zaW9ucy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil9LEc1dC5wcm90b3R5cGUuc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICkuIiksdGhpcy5leHRlbnNpb25zLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIil9LEc1dC5wcm90b3R5cGUuc3VwcG9ydHNCbGVuZE1pbk1heD1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0JsZW5kTWluTWF4KCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICkuIiksdGhpcy5leHRlbnNpb25zLmdldCgiRVhUX2JsZW5kX21pbm1heCIpfSxHNXQucHJvdG90eXBlLnN1cHBvcnRzVmVydGV4VGV4dHVyZXM9ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcygpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzLiIpLHRoaXMuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzfSxHNXQucHJvdG90eXBlLnN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICkuIiksdGhpcy5leHRlbnNpb25zLmdldCgiQU5HTEVfaW5zdGFuY2VkX2FycmF5cyIpfSxHNXQucHJvdG90eXBlLmVuYWJsZVNjaXNzb3JUZXN0PWZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmVuYWJsZVNjaXNzb3JUZXN0KCkgaXMgbm93IC5zZXRTY2lzc29yVGVzdCgpLiIpLHRoaXMuc2V0U2Npc3NvclRlc3QodCl9LEc1dC5wcm90b3R5cGUuaW5pdE1hdGVyaWFsPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuaW5pdE1hdGVyaWFsKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sRzV0LnByb3RvdHlwZS5hZGRQcmVQbHVnaW49ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQcmVQbHVnaW4oKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxHNXQucHJvdG90eXBlLmFkZFBvc3RQbHVnaW49ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQb3N0UGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sRzV0LnByb3RvdHlwZS51cGRhdGVTaGFkb3dNYXA9ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC51cGRhdGVTaGFkb3dNYXAoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxHNXQucHJvdG90eXBlLnNldEZhY2VDdWxsaW5nPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0RmFjZUN1bGxpbmcoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxHNXQucHJvdG90eXBlLmFsbG9jVGV4dHVyZVVuaXQ9ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5hbGxvY1RleHR1cmVVbml0KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sRzV0LnByb3RvdHlwZS5zZXRUZXh0dXJlPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LEc1dC5wcm90b3R5cGUuc2V0VGV4dHVyZTJEPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZTJEKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sRzV0LnByb3RvdHlwZS5zZXRUZXh0dXJlQ3ViZT1mdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldFRleHR1cmVDdWJlKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sRzV0LnByb3RvdHlwZS5nZXRBY3RpdmVNaXBNYXBMZXZlbD1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRBY3RpdmVNaXBNYXBMZXZlbCgpIGlzIG5vdyAuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKS4iKSx0aGlzLmdldEFjdGl2ZU1pcG1hcExldmVsKCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEc1dC5wcm90b3R5cGUse3NoYWRvd01hcEVuYWJsZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNoYWRvd01hcC5lbmFibGVkfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwRW5hYmxlZCBpcyBub3cgLnNoYWRvd01hcC5lbmFibGVkLiIpLHRoaXMuc2hhZG93TWFwLmVuYWJsZWQ9dH19LHNoYWRvd01hcFR5cGU6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNoYWRvd01hcC50eXBlfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwVHlwZSBpcyBub3cgLnNoYWRvd01hcC50eXBlLiIpLHRoaXMuc2hhZG93TWFwLnR5cGU9dH19LHNoYWRvd01hcEN1bGxGYWNlOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBDdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBDdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX0sY29udGV4dDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmNvbnRleHQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5nZXRDb250ZXh0KCkgaW5zdGVhZC4iKSx0aGlzLmdldENvbnRleHQoKX19LHZyOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAudnIgaGFzIGJlZW4gcmVuYW1lZCB0byAueHIiKSx0aGlzLnhyfX0sZ2FtbWFJbnB1dDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdhbW1hSW5wdXQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IHRoZSBlbmNvZGluZyBmb3IgdGV4dHVyZXMgdmlhIFRleHR1cmUuZW5jb2RpbmcgaW5zdGVhZC4iKSwhMX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2FtbWFJbnB1dCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgdGhlIGVuY29kaW5nIGZvciB0ZXh0dXJlcyB2aWEgVGV4dHVyZS5lbmNvZGluZyBpbnN0ZWFkLiIpfX0sZ2FtbWFPdXRwdXQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5nYW1tYU91dHB1dCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgV2ViR0xSZW5kZXJlci5vdXRwdXRFbmNvZGluZyBpbnN0ZWFkLiIpLCExfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2FtbWFPdXRwdXQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IFdlYkdMUmVuZGVyZXIub3V0cHV0RW5jb2RpbmcgaW5zdGVhZC4iKSx0aGlzLm91dHB1dEVuY29kaW5nPSEwPT09dD9JWnQ6Tlp0fX0sdG9uZU1hcHBpbmdXaGl0ZVBvaW50OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAudG9uZU1hcHBpbmdXaGl0ZVBvaW50IGhhcyBiZWVuIHJlbW92ZWQuIiksMX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAudG9uZU1hcHBpbmdXaGl0ZVBvaW50IGhhcyBiZWVuIHJlbW92ZWQuIil9fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFI1dC5wcm90b3R5cGUse2N1bGxGYWNlOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAuY3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9fSxyZW5kZXJSZXZlcnNlU2lkZWQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclJldmVyc2VTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX0scmVuZGVyU2luZ2xlU2lkZWQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJTaW5nbGVTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyU2luZ2xlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX19fSksT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoU0p0LnByb3RvdHlwZSx7d3JhcFM6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLiIpLHRoaXMudGV4dHVyZS53cmFwU30sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwUyBpcyBub3cgLnRleHR1cmUud3JhcFMuIiksdGhpcy50ZXh0dXJlLndyYXBTPXR9fSx3cmFwVDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwVCBpcyBub3cgLnRleHR1cmUud3JhcFQuIiksdGhpcy50ZXh0dXJlLndyYXBUfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBUIGlzIG5vdyAudGV4dHVyZS53cmFwVC4iKSx0aGlzLnRleHR1cmUud3JhcFQ9dH19LG1hZ0ZpbHRlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5tYWdGaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1hZ0ZpbHRlci4iKSx0aGlzLnRleHR1cmUubWFnRmlsdGVyfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLiIpLHRoaXMudGV4dHVyZS5tYWdGaWx0ZXI9dH19LG1pbkZpbHRlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4iKSx0aGlzLnRleHR1cmUubWluRmlsdGVyfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1pbkZpbHRlciBpcyBub3cgLnRleHR1cmUubWluRmlsdGVyLiIpLHRoaXMudGV4dHVyZS5taW5GaWx0ZXI9dH19LGFuaXNvdHJvcHk6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4iKSx0aGlzLnRleHR1cmUuYW5pc290cm9weX0sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LiIpLHRoaXMudGV4dHVyZS5hbmlzb3Ryb3B5PXR9fSxvZmZzZXQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuIiksdGhpcy50ZXh0dXJlLm9mZnNldH0sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4iKSx0aGlzLnRleHR1cmUub2Zmc2V0PXR9fSxyZXBlYXQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuIiksdGhpcy50ZXh0dXJlLnJlcGVhdH0sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5yZXBlYXQgaXMgbm93IC50ZXh0dXJlLnJlcGVhdC4iKSx0aGlzLnRleHR1cmUucmVwZWF0PXR9fSxmb3JtYXQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZm9ybWF0IGlzIG5vdyAudGV4dHVyZS5mb3JtYXQuIiksdGhpcy50ZXh0dXJlLmZvcm1hdH0sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5mb3JtYXQgaXMgbm93IC50ZXh0dXJlLmZvcm1hdC4iKSx0aGlzLnRleHR1cmUuZm9ybWF0PXR9fSx0eXBlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnR5cGUgaXMgbm93IC50ZXh0dXJlLnR5cGUuIiksdGhpcy50ZXh0dXJlLnR5cGV9LHNldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4iKSx0aGlzLnRleHR1cmUudHlwZT10fX0sZ2VuZXJhdGVNaXBtYXBzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmdlbmVyYXRlTWlwbWFwcyBpcyBub3cgLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzLiIpLHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHN9LHNldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZ2VuZXJhdGVNaXBtYXBzIGlzIG5vdyAudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMuIiksdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz10fX19KSwkOXQucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogLmxvYWQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkF1ZGlvTG9hZGVyIGluc3RlYWQuIik7Y29uc3QgZT10aGlzO3JldHVybihuZXcgQjl0KS5sb2FkKHQsKGZ1bmN0aW9uKHQpe2Uuc2V0QnVmZmVyKHQpfSkpLHRoaXN9LHQ4dC5wcm90b3R5cGUuZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvQW5hbHlzZXI6IC5nZXREYXRhKCkgaXMgbm93IC5nZXRGcmVxdWVuY3lEYXRhKCkuIiksdGhpcy5nZXRGcmVxdWVuY3lEYXRhKCl9LFgxdC5wcm90b3R5cGUudXBkYXRlQ3ViZU1hcD1mdW5jdGlvbih0LGUpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkN1YmVDYW1lcmE6IC51cGRhdGVDdWJlTWFwKCkgaXMgbm93IC51cGRhdGUoKS4iKSx0aGlzLnVwZGF0ZSh0LGUpfSxYMXQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkN1YmVDYW1lcmE6IC5jbGVhcigpIGlzIG5vdyAucmVuZGVyVGFyZ2V0LmNsZWFyKCkuIiksdGhpcy5yZW5kZXJUYXJnZXQuY2xlYXIodCxlLG4saSl9LHlKdC5jcm9zc09yaWdpbj12b2lkIDAseUp0LmxvYWRUZXh0dXJlPWZ1bmN0aW9uKHQsZSxuLGkpe2NvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuVGV4dHVyZUxvYWRlcigpIGluc3RlYWQuIik7Y29uc3Qgcj1uZXcgZTl0O3Iuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7Y29uc3Qgbz1yLmxvYWQodCxuLHZvaWQgMCxpKTtyZXR1cm4gZSYmKG8ubWFwcGluZz1lKSxvfSx5SnQubG9hZFRleHR1cmVDdWJlPWZ1bmN0aW9uKHQsZSxuLGkpe2NvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZUN1YmUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkN1YmVUZXh0dXJlTG9hZGVyKCkgaW5zdGVhZC4iKTtjb25zdCByPW5ldyBRNnQ7ci5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTtjb25zdCBvPXIubG9hZCh0LG4sdm9pZCAwLGkpO3JldHVybiBlJiYoby5tYXBwaW5nPWUpLG99LHlKdC5sb2FkQ29tcHJlc3NlZFRleHR1cmU9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRERTTG9hZGVyIGluc3RlYWQuIil9LHlKdC5sb2FkQ29tcHJlc3NlZFRleHR1cmVDdWJlPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuSW1hZ2VVdGlscy5sb2FkQ29tcHJlc3NlZFRleHR1cmVDdWJlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5ERFNMb2FkZXIgaW5zdGVhZC4iKX07Y29uc3QgWjh0PXtjcmVhdGVNdWx0aU1hdGVyaWFsT2JqZWN0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2NlbmVVdGlscyBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanNtL3V0aWxzL1NjZW5lVXRpbHMuanMiKX0sZGV0YWNoOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2NlbmVVdGlscyBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanNtL3V0aWxzL1NjZW5lVXRpbHMuanMiKX0sYXR0YWNoOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2NlbmVVdGlscyBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanNtL3V0aWxzL1NjZW5lVXRpbHMuanMiKX19OyJ1bmRlZmluZWQiIT10eXBlb2YgX19USFJFRV9ERVZUT09MU19fJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInJlZ2lzdGVyIix7ZGV0YWlsOntyZXZpc2lvbjpCS3R9fSkpLCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYod2luZG93Ll9fVEhSRUVfXz9jb25zb2xlLndhcm4oIldBUk5JTkc6IE11bHRpcGxlIGluc3RhbmNlcyBvZiBUaHJlZS5qcyBiZWluZyBpbXBvcnRlZC4iKTp3aW5kb3cuX19USFJFRV9fPUJLdCk7dmFyIEo4dD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxBQ0VTRmlsbWljVG9uZU1hcHBpbmc6NCxBZGRFcXVhdGlvbjpWS3QsQWRkT3BlcmF0aW9uOjIsQWRkaXRpdmVBbmltYXRpb25CbGVuZE1vZGU6UFp0LEFkZGl0aXZlQmxlbmRpbmc6MixBbHBoYUZvcm1hdDoxMDIxLEFsd2F5c0RlcHRoOjEsQWx3YXlzU3RlbmNpbEZ1bmM6NTE5LEFtYmllbnRMaWdodDpiOXQsQW1iaWVudExpZ2h0UHJvYmU6Rjl0LEFuaW1hdGlvbkNsaXA6RzZ0LEFuaW1hdGlvbkxvYWRlcjpjbGFzcyBleHRlbmRzICQ2dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxuLGkpe2NvbnN0IHI9dGhpcyxvPW5ldyBaNnQodGhpcy5tYW5hZ2VyKTtvLnNldFBhdGgodGhpcy5wYXRoKSxvLnNldFJlcXVlc3RIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVyKSxvLnNldFdpdGhDcmVkZW50aWFscyh0aGlzLndpdGhDcmVkZW50aWFscyksby5sb2FkKHQsKGZ1bmN0aW9uKG4pe3RyeXtlKHIucGFyc2UoSlNPTi5wYXJzZShuKSkpfWNhdGNoKGUpe2k/aShlKTpjb25zb2xlLmVycm9yKGUpLHIubWFuYWdlci5pdGVtRXJyb3IodCl9fSksbixpKX1wYXJzZSh0KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCBpPUc2dC5wYXJzZSh0W25dKTtlLnB1c2goaSl9cmV0dXJuIGV9fSxBbmltYXRpb25NaXhlcjpmOHQsQW5pbWF0aW9uT2JqZWN0R3JvdXA6ZDh0LEFuaW1hdGlvblV0aWxzOlA2dCxBcmNDdXJ2ZTpwNHQsQXJyYXlDYW1lcmE6QjV0LEFycm93SGVscGVyOmNsYXNzIGV4dGVuZHMga1F0e2NvbnN0cnVjdG9yKHQ9bmV3IENKdCgwLDAsMSksZT1uZXcgQ0p0KDAsMCwwKSxuPTEsaT0xNjc3Njk2MCxyPS4yKm4sbz0uMipyKXtzdXBlcigpLHRoaXMudHlwZT0iQXJyb3dIZWxwZXIiLHZvaWQgMD09PXE4dCYmKHE4dD1uZXcgYjF0LHE4dC5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KFswLDAsMCwwLDEsMF0sMykpLFk4dD1uZXcgbjR0KDAsLjUsMSw1LDEpLFk4dC50cmFuc2xhdGUoMCwtLjUsMCkpLHRoaXMucG9zaXRpb24uY29weShlKSx0aGlzLmxpbmU9bmV3IEgzdChxOHQsbmV3IEkzdCh7Y29sb3I6aSx0b25lTWFwcGVkOiExfSkpLHRoaXMubGluZS5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuYWRkKHRoaXMubGluZSksdGhpcy5jb25lPW5ldyBCMXQoWTh0LG5ldyBLUXQoe2NvbG9yOmksdG9uZU1hcHBlZDohMX0pKSx0aGlzLmNvbmUubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLmFkZCh0aGlzLmNvbmUpLHRoaXMuc2V0RGlyZWN0aW9uKHQpLHRoaXMuc2V0TGVuZ3RoKG4scixvKX1zZXREaXJlY3Rpb24odCl7aWYodC55Pi45OTk5OSl0aGlzLnF1YXRlcm5pb24uc2V0KDAsMCwwLDEpO2Vsc2UgaWYodC55PC0uOTk5OTkpdGhpcy5xdWF0ZXJuaW9uLnNldCgxLDAsMCwwKTtlbHNle1c4dC5zZXQodC56LDAsLXQueCkubm9ybWFsaXplKCk7Y29uc3QgZT1NYXRoLmFjb3ModC55KTt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZShXOHQsZSl9fXNldExlbmd0aCh0LGU9LjIqdCxuPS4yKmUpe3RoaXMubGluZS5zY2FsZS5zZXQoMSxNYXRoLm1heCgxZS00LHQtZSksMSksdGhpcy5saW5lLnVwZGF0ZU1hdHJpeCgpLHRoaXMuY29uZS5zY2FsZS5zZXQobixlLG4pLHRoaXMuY29uZS5wb3NpdGlvbi55PXQsdGhpcy5jb25lLnVwZGF0ZU1hdHJpeCgpfXNldENvbG9yKHQpe3RoaXMubGluZS5tYXRlcmlhbC5jb2xvci5zZXQodCksdGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldCh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQsITEpLHRoaXMubGluZS5jb3B5KHQubGluZSksdGhpcy5jb25lLmNvcHkodC5jb25lKSx0aGlzfX0sQXVkaW86JDl0LEF1ZGlvQW5hbHlzZXI6dDh0LEF1ZGlvQ29udGV4dDpEOXQsQXVkaW9MaXN0ZW5lcjpjbGFzcyBleHRlbmRzIGtRdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy50eXBlPSJBdWRpb0xpc3RlbmVyIix0aGlzLmNvbnRleHQ9RDl0LmdldENvbnRleHQoKSx0aGlzLmdhaW49dGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKSx0aGlzLmdhaW4uY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZmlsdGVyPW51bGwsdGhpcy50aW1lRGVsdGE9MCx0aGlzLl9jbG9jaz1uZXcgajl0fWdldElucHV0KCl7cmV0dXJuIHRoaXMuZ2Fpbn1yZW1vdmVGaWx0ZXIoKXtyZXR1cm4gbnVsbCE9PXRoaXMuZmlsdGVyJiYodGhpcy5nYWluLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXIpLHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzLmdhaW4uY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZmlsdGVyPW51bGwpLHRoaXN9Z2V0RmlsdGVyKCl7cmV0dXJuIHRoaXMuZmlsdGVyfXNldEZpbHRlcih0KXtyZXR1cm4gbnVsbCE9PXRoaXMuZmlsdGVyPyh0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmZpbHRlciksdGhpcy5maWx0ZXIuZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pKTp0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZmlsdGVyPXQsdGhpcy5nYWluLmNvbm5lY3QodGhpcy5maWx0ZXIpLHRoaXMuZmlsdGVyLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzfWdldE1hc3RlclZvbHVtZSgpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZX1zZXRNYXN0ZXJWb2x1bWUodCl7cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSh0LHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXN9dXBkYXRlTWF0cml4V29ybGQodCl7c3VwZXIudXBkYXRlTWF0cml4V29ybGQodCk7Y29uc3QgZT10aGlzLmNvbnRleHQubGlzdGVuZXIsbj10aGlzLnVwO2lmKHRoaXMudGltZURlbHRhPXRoaXMuX2Nsb2NrLmdldERlbHRhKCksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoVzl0LHE5dCxZOXQpLFg5dC5zZXQoMCwwLC0xKS5hcHBseVF1YXRlcm5pb24ocTl0KSxlLnBvc2l0aW9uWCl7Y29uc3QgdD10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdGhpcy50aW1lRGVsdGE7ZS5wb3NpdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoVzl0LngsdCksZS5wb3NpdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoVzl0LnksdCksZS5wb3NpdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoVzl0LnosdCksZS5mb3J3YXJkWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShYOXQueCx0KSxlLmZvcndhcmRZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKFg5dC55LHQpLGUuZm9yd2FyZFoubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoWDl0LnosdCksZS51cFgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobi54LHQpLGUudXBZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKG4ueSx0KSxlLnVwWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShuLnosdCl9ZWxzZSBlLnNldFBvc2l0aW9uKFc5dC54LFc5dC55LFc5dC56KSxlLnNldE9yaWVudGF0aW9uKFg5dC54LFg5dC55LFg5dC56LG4ueCxuLnksbi56KX19LEF1ZGlvTG9hZGVyOkI5dCxBeGVzSGVscGVyOlg4dCxBeGlzSGVscGVyOmZ1bmN0aW9uIFE4dCh0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5BeGlzSGVscGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuQXhlc0hlbHBlci4iKSxuZXcgWDh0KHQpfSxCYWNrU2lkZToxLEJhc2ljRGVwdGhQYWNraW5nOjMyMDAsQmFzaWNTaGFkb3dNYXA6MCxCaW5hcnlUZXh0dXJlTG9hZGVyOmZ1bmN0aW9uIHQ3dCh0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CaW5hcnlUZXh0dXJlTG9hZGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuRGF0YVRleHR1cmVMb2FkZXIuIiksbmV3IHQ5dCh0KX0sQm9uZTpTM3QsQm9vbGVhbktleWZyYW1lVHJhY2s6RDZ0LEJvdW5kaW5nQm94SGVscGVyOmZ1bmN0aW9uIGU3dCh0LGUpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJvdW5kaW5nQm94SGVscGVyIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIENyZWF0aW5nIGEgVEhSRUUuQm94SGVscGVyIGluc3RlYWQuIiksbmV3IEc4dCh0LGUpfSxCb3gyOnc4dCxCb3gzOkxKdCxCb3gzSGVscGVyOmNsYXNzIGV4dGVuZHMgVTN0e2NvbnN0cnVjdG9yKHQsZT0xNjc3Njk2MCl7Y29uc3Qgbj1uZXcgVWludDE2QXJyYXkoWzAsMSwxLDIsMiwzLDMsMCw0LDUsNSw2LDYsNyw3LDQsMCw0LDEsNSwyLDYsMyw3XSksaT1uZXcgYjF0O2kuc2V0SW5kZXgobmV3IFFRdChuLDEpKSxpLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBsMXQoWzEsMSwxLC0xLDEsMSwtMSwtMSwxLDEsLTEsMSwxLDEsLTEsLTEsMSwtMSwtMSwtMSwtMSwxLC0xLC0xXSwzKSksc3VwZXIoaSxuZXcgSTN0KHtjb2xvcjplLHRvbmVNYXBwZWQ6ITF9KSksdGhpcy5ib3g9dCx0aGlzLnR5cGU9IkJveDNIZWxwZXIiLHRoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl9dXBkYXRlTWF0cml4V29ybGQodCl7Y29uc3QgZT10aGlzLmJveDtlLmlzRW1wdHkoKXx8KGUuZ2V0Q2VudGVyKHRoaXMucG9zaXRpb24pLGUuZ2V0U2l6ZSh0aGlzLnNjYWxlKSx0aGlzLnNjYWxlLm11bHRpcGx5U2NhbGFyKC41KSxzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KSl9fSxCb3hCdWZmZXJHZW9tZXRyeTpGMXQsQm94R2VvbWV0cnk6RjF0LEJveEhlbHBlcjpHOHQsQnVmZmVyQXR0cmlidXRlOlFRdCxCdWZmZXJHZW9tZXRyeTpiMXQsQnVmZmVyR2VvbWV0cnlMb2FkZXI6QTl0LEJ5dGVUeXBlOjEwMTAsQ2FjaGU6cTZ0LENhbWVyYTpXMXQsQ2FtZXJhSGVscGVyOmNsYXNzIGV4dGVuZHMgVTN0e2NvbnN0cnVjdG9yKHQpe2NvbnN0IGU9bmV3IGIxdCxuPW5ldyBJM3Qoe2NvbG9yOjE2Nzc3MjE1LHZlcnRleENvbG9yczohMCx0b25lTWFwcGVkOiExfSksaT1bXSxyPVtdLG89e30sYT1uZXcgJFF0KDE2NzU1MjAwKSxzPW5ldyAkUXQoMTY3MTE2ODApLGw9bmV3ICRRdCg0Mzc3NSksYz1uZXcgJFF0KDE2Nzc3MjE1KSx1PW5ldyAkUXQoMzM1NTQ0Myk7ZnVuY3Rpb24gaCh0LGUsbil7ZCh0LG4pLGQoZSxuKX1mdW5jdGlvbiBkKHQsZSl7aS5wdXNoKDAsMCwwKSxyLnB1c2goZS5yLGUuZyxlLmIpLHZvaWQgMD09PW9bdF0mJihvW3RdPVtdKSxvW3RdLnB1c2goaS5sZW5ndGgvMy0xKX1oKCJuMSIsIm4yIixhKSxoKCJuMiIsIm40IixhKSxoKCJuNCIsIm4zIixhKSxoKCJuMyIsIm4xIixhKSxoKCJmMSIsImYyIixhKSxoKCJmMiIsImY0IixhKSxoKCJmNCIsImYzIixhKSxoKCJmMyIsImYxIixhKSxoKCJuMSIsImYxIixhKSxoKCJuMiIsImYyIixhKSxoKCJuMyIsImYzIixhKSxoKCJuNCIsImY0IixhKSxoKCJwIiwibjEiLHMpLGgoInAiLCJuMiIscyksaCgicCIsIm4zIixzKSxoKCJwIiwibjQiLHMpLGgoInUxIiwidTIiLGwpLGgoInUyIiwidTMiLGwpLGgoInUzIiwidTEiLGwpLGgoImMiLCJ0IixjKSxoKCJwIiwiYyIsdSksaCgiY24xIiwiY24yIix1KSxoKCJjbjMiLCJjbjQiLHUpLGgoImNmMSIsImNmMiIsdSksaCgiY2YzIiwiY2Y0Iix1KSxlLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBsMXQoaSwzKSksZS5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgbDF0KHIsMykpLHN1cGVyKGUsbiksdGhpcy50eXBlPSJDYW1lcmFIZWxwZXIiLHRoaXMuY2FtZXJhPXQsdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCYmdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpLHRoaXMubWF0cml4PXQubWF0cml4V29ybGQsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMucG9pbnRNYXA9byx0aGlzLnVwZGF0ZSgpfXVwZGF0ZSgpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeSxlPXRoaXMucG9pbnRNYXA7Vjh0LnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5jYW1lcmEucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLFU4dCgiYyIsZSx0LFY4dCwwLDAsLTEpLFU4dCgidCIsZSx0LFY4dCwwLDAsMSksVTh0KCJuMSIsZSx0LFY4dCwtMSwtMSwtMSksVTh0KCJuMiIsZSx0LFY4dCwxLC0xLC0xKSxVOHQoIm4zIixlLHQsVjh0LC0xLDEsLTEpLFU4dCgibjQiLGUsdCxWOHQsMSwxLC0xKSxVOHQoImYxIixlLHQsVjh0LC0xLC0xLDEpLFU4dCgiZjIiLGUsdCxWOHQsMSwtMSwxKSxVOHQoImYzIixlLHQsVjh0LC0xLDEsMSksVTh0KCJmNCIsZSx0LFY4dCwxLDEsMSksVTh0KCJ1MSIsZSx0LFY4dCwuNywxLjEsLTEpLFU4dCgidTIiLGUsdCxWOHQsLS43LDEuMSwtMSksVTh0KCJ1MyIsZSx0LFY4dCwwLDIsLTEpLFU4dCgiY2YxIixlLHQsVjh0LC0xLDAsMSksVTh0KCJjZjIiLGUsdCxWOHQsMSwwLDEpLFU4dCgiY2YzIixlLHQsVjh0LDAsLTEsMSksVTh0KCJjZjQiLGUsdCxWOHQsMCwxLDEpLFU4dCgiY24xIixlLHQsVjh0LC0xLDAsLTEpLFU4dCgiY24yIixlLHQsVjh0LDEsMCwtMSksVTh0KCJjbjMiLGUsdCxWOHQsMCwtMSwtMSksVTh0KCJjbjQiLGUsdCxWOHQsMCwxLC0xKSx0LmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKS5uZWVkc1VwZGF0ZT0hMH1kaXNwb3NlKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9fSxDYW52YXNSZW5kZXJlcjpmdW5jdGlvbiBuN3QoKXtjb25zb2xlLmVycm9yKCJUSFJFRS5DYW52YXNSZW5kZXJlciBoYXMgYmVlbiByZW1vdmVkIil9LENhbnZhc1RleHR1cmU6UTN0LENhdG11bGxSb21DdXJ2ZTM6djR0LENpbmVvblRvbmVNYXBwaW5nOjMsQ2lyY2xlQnVmZmVyR2VvbWV0cnk6ZTR0LENpcmNsZUdlb21ldHJ5OmU0dCxDbGFtcFRvRWRnZVdyYXBwaW5nOktLdCxDbG9jazpqOXQsQ29sb3I6JFF0LENvbG9yS2V5ZnJhbWVUcmFjazpCNnQsQ29tcHJlc3NlZFRleHR1cmU6SjN0LENvbXByZXNzZWRUZXh0dXJlTG9hZGVyOmNsYXNzIGV4dGVuZHMgJDZ0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4saSl7Y29uc3Qgcj10aGlzLG89W10sYT1uZXcgSjN0LHM9bmV3IFo2dCh0aGlzLm1hbmFnZXIpO3Muc2V0UGF0aCh0aGlzLnBhdGgpLHMuc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpLHMuc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLHMuc2V0V2l0aENyZWRlbnRpYWxzKHIud2l0aENyZWRlbnRpYWxzKTtsZXQgbD0wO2Z1bmN0aW9uIGMoYyl7cy5sb2FkKHRbY10sKGZ1bmN0aW9uKHQpe2NvbnN0IG49ci5wYXJzZSh0LCEwKTtvW2NdPXt3aWR0aDpuLndpZHRoLGhlaWdodDpuLmhlaWdodCxmb3JtYXQ6bi5mb3JtYXQsbWlwbWFwczpuLm1pcG1hcHN9LGwrPTEsNj09PWwmJigxPT09bi5taXBtYXBDb3VudCYmKGEubWluRmlsdGVyPWVadCksYS5pbWFnZT1vLGEuZm9ybWF0PW4uZm9ybWF0LGEubmVlZHNVcGRhdGU9ITAsZSYmZShhKSl9KSxuLGkpfWlmKEFycmF5LmlzQXJyYXkodCkpZm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47KytlKWMoZSk7ZWxzZSBzLmxvYWQodCwoZnVuY3Rpb24odCl7Y29uc3Qgbj1yLnBhcnNlKHQsITApO2lmKG4uaXNDdWJlbWFwKXtjb25zdCB0PW4ubWlwbWFwcy5sZW5ndGgvbi5taXBtYXBDb3VudDtmb3IobGV0IGU9MDtlPHQ7ZSsrKXtvW2VdPXttaXBtYXBzOltdfTtmb3IobGV0IHQ9MDt0PG4ubWlwbWFwQ291bnQ7dCsrKW9bZV0ubWlwbWFwcy5wdXNoKG4ubWlwbWFwc1tlKm4ubWlwbWFwQ291bnQrdF0pLG9bZV0uZm9ybWF0PW4uZm9ybWF0LG9bZV0ud2lkdGg9bi53aWR0aCxvW2VdLmhlaWdodD1uLmhlaWdodH1hLmltYWdlPW99ZWxzZSBhLmltYWdlLndpZHRoPW4ud2lkdGgsYS5pbWFnZS5oZWlnaHQ9bi5oZWlnaHQsYS5taXBtYXBzPW4ubWlwbWFwczsxPT09bi5taXBtYXBDb3VudCYmKGEubWluRmlsdGVyPWVadCksYS5mb3JtYXQ9bi5mb3JtYXQsYS5uZWVkc1VwZGF0ZT0hMCxlJiZlKGEpfSksbixpKTtyZXR1cm4gYX19LENvbmVCdWZmZXJHZW9tZXRyeTppNHQsQ29uZUdlb21ldHJ5Omk0dCxDdWJlQ2FtZXJhOlgxdCxDdWJlUmVmbGVjdGlvbk1hcHBpbmc6akt0LEN1YmVSZWZyYWN0aW9uTWFwcGluZzpHS3QsQ3ViZVRleHR1cmU6JDF0LEN1YmVUZXh0dXJlTG9hZGVyOlE2dCxDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzpZS3QsQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmc6WEt0LEN1YmljQmV6aWVyQ3VydmU6UzR0LEN1YmljQmV6aWVyQ3VydmUzOk00dCxDdWJpY0ludGVycG9sYW50Okk2dCxDdWxsRmFjZUJhY2s6MSxDdWxsRmFjZUZyb250OjIsQ3VsbEZhY2VGcm9udEJhY2s6MyxDdWxsRmFjZU5vbmU6MCxDdXJ2ZTpoNHQsQ3VydmVQYXRoOm45dCxDdXN0b21CbGVuZGluZzo1LEN1c3RvbVRvbmVNYXBwaW5nOjUsQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeTpuNHQsQ3lsaW5kZXJHZW9tZXRyeTpuNHQsQ3lsaW5kcmljYWw6Y2xhc3N7Y29uc3RydWN0b3IodD0xLGU9MCxuPTApe3JldHVybiB0aGlzLnJhZGl1cz10LHRoaXMudGhldGE9ZSx0aGlzLnk9bix0aGlzfXNldCh0LGUsbil7cmV0dXJuIHRoaXMucmFkaXVzPXQsdGhpcy50aGV0YT1lLHRoaXMueT1uLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5yYWRpdXM9dC5yYWRpdXMsdGhpcy50aGV0YT10LnRoZXRhLHRoaXMueT10LnksdGhpc31zZXRGcm9tVmVjdG9yMyh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKHQueCx0LnksdC56KX1zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKHQsZSxuKXtyZXR1cm4gdGhpcy5yYWRpdXM9TWF0aC5zcXJ0KHQqdCtuKm4pLHRoaXMudGhldGE9TWF0aC5hdGFuMih0LG4pLHRoaXMueT1lLHRoaXN9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fSxEYXRhVGV4dHVyZTpNM3QsRGF0YVRleHR1cmUyREFycmF5OkswdCxEYXRhVGV4dHVyZTNEOlowdCxEYXRhVGV4dHVyZUxvYWRlcjp0OXQsRGF0YVV0aWxzOmNsYXNze3N0YXRpYyB0b0hhbGZGbG9hdCh0KXskOHRbMF09dDtjb25zdCBlPUs4dFswXTtsZXQgbj1lPj4xNiYzMjc2OCxpPWU+PjEyJjIwNDc7Y29uc3Qgcj1lPj4yMyYyNTU7cmV0dXJuIHI8MTAzP246cj4xNDI/KG58PTMxNzQ0LG58PSgyNTU9PXI/MDoxKSYmODM4ODYwNyZlLG4pOnI8MTEzPyhpfD0yMDQ4LG58PShpPj4xMTQtcikrKGk+PjExMy1yJjEpLG4pOihufD1yLTExMjw8MTB8aT4+MSxuKz0xJmksbil9fSxEZWNyZW1lbnRTdGVuY2lsT3A6NzY4MyxEZWNyZW1lbnRXcmFwU3RlbmNpbE9wOjM0MDU2LERlZmF1bHRMb2FkaW5nTWFuYWdlcjpYNnQsRGVwdGhGb3JtYXQ6ZFp0LERlcHRoU3RlbmNpbEZvcm1hdDpwWnQsRGVwdGhUZXh0dXJlOnQ0dCxEaXJlY3Rpb25hbExpZ2h0OnY5dCxEaXJlY3Rpb25hbExpZ2h0SGVscGVyOmNsYXNzIGV4dGVuZHMga1F0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcigpLHRoaXMubGlnaHQ9dCx0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCksdGhpcy5tYXRyaXg9dC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5jb2xvcj1uLHZvaWQgMD09PWUmJihlPTEpO2xldCBpPW5ldyBiMXQ7aS5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KFstZSxlLDAsZSxlLDAsZSwtZSwwLC1lLC1lLDAsLWUsZSwwXSwzKSk7Y29uc3Qgcj1uZXcgSTN0KHtmb2c6ITEsdG9uZU1hcHBlZDohMX0pO3RoaXMubGlnaHRQbGFuZT1uZXcgSDN0KGksciksdGhpcy5hZGQodGhpcy5saWdodFBsYW5lKSxpPW5ldyBiMXQsaS5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KFswLDAsMCwwLDAsMV0sMykpLHRoaXMudGFyZ2V0TGluZT1uZXcgSDN0KGksciksdGhpcy5hZGQodGhpcy50YXJnZXRMaW5lKSx0aGlzLnVwZGF0ZSgpfWRpc3Bvc2UoKXt0aGlzLmxpZ2h0UGxhbmUuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5kaXNwb3NlKCksdGhpcy50YXJnZXRMaW5lLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuZGlzcG9zZSgpfXVwZGF0ZSgpe0Q4dC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC5tYXRyaXhXb3JsZCksQjh0LnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCksSDh0LnN1YlZlY3RvcnMoQjh0LEQ4dCksdGhpcy5saWdodFBsYW5lLmxvb2tBdChCOHQpLHZvaWQgMCE9PXRoaXMuY29sb3I/KHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvciksdGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKSk6KHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpLHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpKSx0aGlzLnRhcmdldExpbmUubG9va0F0KEI4dCksdGhpcy50YXJnZXRMaW5lLnNjYWxlLno9SDh0Lmxlbmd0aCgpfX0sRGlzY3JldGVJbnRlcnBvbGFudDpPNnQsRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnk6bzR0LERvZGVjYWhlZHJvbkdlb21ldHJ5Om80dCxEb3VibGVTaWRlOjIsRHN0QWxwaGFGYWN0b3I6MjA2LERzdENvbG9yRmFjdG9yOjIwOCxEeW5hbWljQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uIGk3dCh0LGUpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkR5bmFtaWNCdWZmZXJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUoKS5zZXRVc2FnZSggVEhSRUUuRHluYW1pY0RyYXdVc2FnZSApIGluc3RlYWQuIiksbmV3IFFRdCh0LGUpLnNldFVzYWdlKFZadCl9LER5bmFtaWNDb3B5VXNhZ2U6MzUwNTAsRHluYW1pY0RyYXdVc2FnZTpWWnQsRHluYW1pY1JlYWRVc2FnZTozNTA0OSxFZGdlc0dlb21ldHJ5OnU0dCxFZGdlc0hlbHBlcjpmdW5jdGlvbiByN3QodCxlKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5FZGdlc0hlbHBlciBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRWRnZXNHZW9tZXRyeSBpbnN0ZWFkLiIpLG5ldyBVM3QobmV3IHU0dCh0Lmdlb21ldHJ5KSxuZXcgSTN0KHtjb2xvcjp2b2lkIDAhPT1lP2U6MTY3NzcyMTV9KSl9LEVsbGlwc2VDdXJ2ZTpkNHQsRXF1YWxEZXB0aDo0LEVxdWFsU3RlbmNpbEZ1bmM6NTE0LEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOldLdCxFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzpxS3QsRXVsZXI6ZlF0LEV2ZW50RGlzcGF0Y2hlcjpqWnQsRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OnI2dCxFeHRydWRlR2VvbWV0cnk6cjZ0LEZhY2VDb2xvcnM6MSxGaWxlTG9hZGVyOlo2dCxGbGF0U2hhZGluZzoxLEZsb2F0MTZCdWZmZXJBdHRyaWJ1dGU6czF0LEZsb2F0MzJBdHRyaWJ1dGU6ZnVuY3Rpb24gbzd0KHQsZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuRmxvYXQzMkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpLG5ldyBsMXQodCxlKX0sRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZTpsMXQsRmxvYXQ2NEF0dHJpYnV0ZTpmdW5jdGlvbiBhN3QodCxlKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5GbG9hdDY0QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIiksbmV3IGMxdCh0LGUpfSxGbG9hdDY0QnVmZmVyQXR0cmlidXRlOmMxdCxGbG9hdFR5cGU6c1p0LEZvZzpZNXQsRm9nRXhwMjpxNXQsRm9udDpSOXQsRm9udExvYWRlcjpjbGFzcyBleHRlbmRzICQ2dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxuLGkpe2NvbnN0IHI9dGhpcyxvPW5ldyBaNnQodGhpcy5tYW5hZ2VyKTtvLnNldFBhdGgodGhpcy5wYXRoKSxvLnNldFJlcXVlc3RIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVyKSxvLnNldFdpdGhDcmVkZW50aWFscyhyLndpdGhDcmVkZW50aWFscyksby5sb2FkKHQsKGZ1bmN0aW9uKHQpe2xldCBuO3RyeXtuPUpTT04ucGFyc2UodCl9Y2F0Y2goZSl7Y29uc29sZS53YXJuKCJUSFJFRS5Gb250TG9hZGVyOiB0eXBlZmFjZS5qcyBzdXBwb3J0IGlzIGJlaW5nIGRlcHJlY2F0ZWQuIFVzZSB0eXBlZmFjZS5qc29uIGluc3RlYWQuIiksbj1KU09OLnBhcnNlKHQuc3Vic3RyaW5nKDY1LHQubGVuZ3RoLTIpKX1jb25zdCBpPXIucGFyc2Uobik7ZSYmZShpKX0pLG4saSl9cGFyc2UodCl7cmV0dXJuIG5ldyBSOXQodCl9fSxGcm9udFNpZGU6MCxGcnVzdHVtOmkwdCxHTEJ1ZmZlckF0dHJpYnV0ZTpfOHQsR0xTTDE6IjEwMCIsR0xTTDM6VVp0LEdhbW1hRW5jb2Rpbmc6Ulp0LEdyZWF0ZXJEZXB0aDo2LEdyZWF0ZXJFcXVhbERlcHRoOjUsR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmM6NTE4LEdyZWF0ZXJTdGVuY2lsRnVuYzo1MTYsR3JpZEhlbHBlcjp6OHQsR3JvdXA6SDV0LEhhbGZGbG9hdFR5cGU6bFp0LEhlbWlzcGhlcmVMaWdodDphOXQsSGVtaXNwaGVyZUxpZ2h0SGVscGVyOmNsYXNzIGV4dGVuZHMga1F0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcigpLHRoaXMubGlnaHQ9dCx0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCksdGhpcy5tYXRyaXg9dC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5jb2xvcj1uO2NvbnN0IGk9bmV3IGw2dChlKTtpLnJvdGF0ZVkoLjUqTWF0aC5QSSksdGhpcy5tYXRlcmlhbD1uZXcgS1F0KHt3aXJlZnJhbWU6ITAsZm9nOiExLHRvbmVNYXBwZWQ6ITF9KSx2b2lkIDA9PT10aGlzLmNvbG9yJiYodGhpcy5tYXRlcmlhbC52ZXJ0ZXhDb2xvcnM9ITApO2NvbnN0IHI9aS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiksbz1uZXcgRmxvYXQzMkFycmF5KDMqci5jb3VudCk7aS5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgUVF0KG8sMykpLHRoaXMuYWRkKG5ldyBCMXQoaSx0aGlzLm1hdGVyaWFsKSksdGhpcy51cGRhdGUoKX1kaXNwb3NlKCl7dGhpcy5jaGlsZHJlblswXS5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5kaXNwb3NlKCl9dXBkYXRlKCl7Y29uc3QgdD10aGlzLmNoaWxkcmVuWzBdO2lmKHZvaWQgMCE9PXRoaXMuY29sb3IpdGhpcy5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik7ZWxzZXtjb25zdCBlPXQuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJjb2xvciIpO1I4dC5jb3B5KHRoaXMubGlnaHQuY29sb3IpLE84dC5jb3B5KHRoaXMubGlnaHQuZ3JvdW5kQ29sb3IpO2ZvcihsZXQgdD0wLG49ZS5jb3VudDt0PG47dCsrKXtjb25zdCBpPXQ8bi8yP1I4dDpPOHQ7ZS5zZXRYWVoodCxpLnIsaS5nLGkuYil9ZS5uZWVkc1VwZGF0ZT0hMH10Lmxvb2tBdChJOHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQubWF0cml4V29ybGQpLm5lZ2F0ZSgpKX19LEhlbWlzcGhlcmVMaWdodFByb2JlOkg5dCxJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OmE2dCxJY29zYWhlZHJvbkdlb21ldHJ5OmE2dCxJbWFnZUJpdG1hcExvYWRlcjpOOXQsSW1hZ2VMb2FkZXI6SjZ0LEltYWdlVXRpbHM6eUp0LEltbWVkaWF0ZVJlbmRlck9iamVjdDpUOHQsSW5jcmVtZW50U3RlbmNpbE9wOjc2ODIsSW5jcmVtZW50V3JhcFN0ZW5jaWxPcDozNDA1NSxJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6Qzl0LEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5OlQ5dCxJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcjpnOHQsSW5zdGFuY2VkTWVzaDpOM3QsSW50MTZBdHRyaWJ1dGU6ZnVuY3Rpb24gczd0KHQsZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuSW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQxNkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIiksbmV3IGkxdCh0LGUpfSxJbnQxNkJ1ZmZlckF0dHJpYnV0ZTppMXQsSW50MzJBdHRyaWJ1dGU6ZnVuY3Rpb24gbDd0KHQsZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuSW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIiksbmV3IG8xdCh0LGUpfSxJbnQzMkJ1ZmZlckF0dHJpYnV0ZTpvMXQsSW50OEF0dHJpYnV0ZTpmdW5jdGlvbiBjN3QodCxlKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5JbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIiksbmV3IHQxdCh0LGUpfSxJbnQ4QnVmZmVyQXR0cmlidXRlOnQxdCxJbnRUeXBlOjEwMTMsSW50ZXJsZWF2ZWRCdWZmZXI6JDV0LEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlOlo1dCxJbnRlcnBvbGFudDpONnQsSW50ZXJwb2xhdGVEaXNjcmV0ZTpNWnQsSW50ZXJwb2xhdGVMaW5lYXI6RVp0LEludGVycG9sYXRlU21vb3RoOlRadCxJbnZlcnRTdGVuY2lsT3A6NTM4NixKU09OTG9hZGVyOmZ1bmN0aW9uIHU3dCgpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkpTT05Mb2FkZXIgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sS2VlcFN0ZW5jaWxPcDpIWnQsS2V5ZnJhbWVUcmFjazp6NnQsTE9EOmczdCxMYXRoZUJ1ZmZlckdlb21ldHJ5OnM2dCxMYXRoZUdlb21ldHJ5OnM2dCxMYXllcnM6bVF0LExlbnNGbGFyZTpmdW5jdGlvbiBoN3QoKXtjb25zb2xlLmVycm9yKCJUSFJFRS5MZW5zRmxhcmUgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzbS9vYmplY3RzL0xlbnNmbGFyZS5qcyIpfSxMZXNzRGVwdGg6MixMZXNzRXF1YWxEZXB0aDozLExlc3NFcXVhbFN0ZW5jaWxGdW5jOjUxNSxMZXNzU3RlbmNpbEZ1bmM6NTEzLExpZ2h0Om85dCxMaWdodFByb2JlOlM5dCxMaW5lOkgzdCxMaW5lMzpFOHQsTGluZUJhc2ljTWF0ZXJpYWw6STN0LExpbmVDdXJ2ZTpFNHQsTGluZUN1cnZlMzpUNHQsTGluZURhc2hlZE1hdGVyaWFsOms2dCxMaW5lTG9vcDpqM3QsTGluZVBpZWNlczoxLExpbmVTZWdtZW50czpVM3QsTGluZVN0cmlwOjAsTGluZWFyRW5jb2Rpbmc6Tlp0LExpbmVhckZpbHRlcjplWnQsTGluZWFySW50ZXJwb2xhbnQ6UjZ0LExpbmVhck1pcE1hcExpbmVhckZpbHRlcjoxMDA4LExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXI6MTAwNyxMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXI6aVp0LExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXI6blp0LExpbmVhclRvbmVNYXBwaW5nOjEsTG9hZGVyOiQ2dCxMb2FkZXJVdGlsczpFOXQsTG9hZGluZ01hbmFnZXI6WTZ0LExvZ0x1dkVuY29kaW5nOjMwMDMsTG9vcE9uY2U6MjIwMCxMb29wUGluZ1Bvbmc6MjIwMixMb29wUmVwZWF0OjIyMDEsTHVtaW5hbmNlQWxwaGFGb3JtYXQ6MTAyNSxMdW1pbmFuY2VGb3JtYXQ6MTAyNCxNT1VTRTpIS3QsTWF0ZXJpYWw6VVF0LE1hdGVyaWFsTG9hZGVyOk05dCxNYXRoOmVKdCxNYXRoVXRpbHM6ZUp0LE1hdHJpeDM6Z0p0LE1hdHJpeDQ6clF0LE1heEVxdWF0aW9uOjEwNCxNZXNoOkIxdCxNZXNoQmFzaWNNYXRlcmlhbDpLUXQsTWVzaERlcHRoTWF0ZXJpYWw6TjV0LE1lc2hEaXN0YW5jZU1hdGVyaWFsOkk1dCxNZXNoRmFjZU1hdGVyaWFsOmZ1bmN0aW9uIGQ3dCh0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NZXNoRmFjZU1hdGVyaWFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBhbiBBcnJheSBpbnN0ZWFkLiIpLHR9LE1lc2hMYW1iZXJ0TWF0ZXJpYWw6QzZ0LE1lc2hNYXRjYXBNYXRlcmlhbDpBNnQsTWVzaE5vcm1hbE1hdGVyaWFsOlQ2dCxNZXNoUGhvbmdNYXRlcmlhbDpNNnQsTWVzaFBoeXNpY2FsTWF0ZXJpYWw6UzZ0LE1lc2hTdGFuZGFyZE1hdGVyaWFsOnc2dCxNZXNoVG9vbk1hdGVyaWFsOkU2dCxNaW5FcXVhdGlvbjoxMDMsTWlycm9yZWRSZXBlYXRXcmFwcGluZzpaS3QsTWl4T3BlcmF0aW9uOjEsTXVsdGlNYXRlcmlhbDpmdW5jdGlvbiBwN3QodD1bXSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuTXVsdGlNYXRlcmlhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4iKSx0LmlzTXVsdGlNYXRlcmlhbD0hMCx0Lm1hdGVyaWFscz10LHQuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdC5zbGljZSgpfSx0fSxNdWx0aXBseUJsZW5kaW5nOjQsTXVsdGlwbHlPcGVyYXRpb246MCxOZWFyZXN0RmlsdGVyOkpLdCxOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyOjEwMDUsTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXI6MTAwNCxOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyOnRadCxOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcjpRS3QsTmV2ZXJEZXB0aDowLE5ldmVyU3RlbmNpbEZ1bmM6NTEyLE5vQmxlbmRpbmc6MCxOb0NvbG9yczowLE5vVG9uZU1hcHBpbmc6MCxOb3JtYWxBbmltYXRpb25CbGVuZE1vZGU6TFp0LE5vcm1hbEJsZW5kaW5nOjEsTm90RXF1YWxEZXB0aDo3LE5vdEVxdWFsU3RlbmNpbEZ1bmM6NTE3LE51bWJlcktleWZyYW1lVHJhY2s6SDZ0LE9iamVjdDNEOmtRdCxPYmplY3RMb2FkZXI6Y2xhc3MgZXh0ZW5kcyAkNnR7Y29uc3RydWN0b3IodCl7c3VwZXIodCl9bG9hZCh0LGUsbixpKXtjb25zdCByPXRoaXMsbz0iIj09PXRoaXMucGF0aD9FOXQuZXh0cmFjdFVybEJhc2UodCk6dGhpcy5wYXRoO3RoaXMucmVzb3VyY2VQYXRoPXRoaXMucmVzb3VyY2VQYXRofHxvO2NvbnN0IGE9bmV3IFo2dCh0aGlzLm1hbmFnZXIpO2Euc2V0UGF0aCh0aGlzLnBhdGgpLGEuc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLGEuc2V0V2l0aENyZWRlbnRpYWxzKHRoaXMud2l0aENyZWRlbnRpYWxzKSxhLmxvYWQodCwoZnVuY3Rpb24obil7bGV0IG89bnVsbDt0cnl7bz1KU09OLnBhcnNlKG4pfWNhdGNoKGUpe3JldHVybiB2b2lkIDAhPT1pJiZpKGUpLHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUU6T2JqZWN0TG9hZGVyOiBDYW4ndCBwYXJzZSAiK3QrIi4iLGUubWVzc2FnZSl9Y29uc3QgYT1vLm1ldGFkYXRhO3ZvaWQgMCE9PWEmJnZvaWQgMCE9PWEudHlwZSYmImdlb21ldHJ5IiE9PWEudHlwZS50b0xvd2VyQ2FzZSgpP3IucGFyc2UobyxlKTpjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3RMb2FkZXI6IENhbid0IGxvYWQgIit0KX0pLG4saSl9YXN5bmMgbG9hZEFzeW5jKHQsZSl7Y29uc3Qgbj0iIj09PXRoaXMucGF0aD9FOXQuZXh0cmFjdFVybEJhc2UodCk6dGhpcy5wYXRoO3RoaXMucmVzb3VyY2VQYXRoPXRoaXMucmVzb3VyY2VQYXRofHxuO2NvbnN0IGk9bmV3IFo2dCh0aGlzLm1hbmFnZXIpO2kuc2V0UGF0aCh0aGlzLnBhdGgpLGkuc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLGkuc2V0V2l0aENyZWRlbnRpYWxzKHRoaXMud2l0aENyZWRlbnRpYWxzKTtjb25zdCByPWF3YWl0IGkubG9hZEFzeW5jKHQsZSksbz1KU09OLnBhcnNlKHIpLGE9by5tZXRhZGF0YTtpZih2b2lkIDA9PT1hfHx2b2lkIDA9PT1hLnR5cGV8fCJnZW9tZXRyeSI9PT1hLnR5cGUudG9Mb3dlckNhc2UoKSl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk9iamVjdExvYWRlcjogQ2FuJ3QgbG9hZCAiK3QpO3JldHVybiBhd2FpdCB0aGlzLnBhcnNlQXN5bmMobyl9cGFyc2UodCxlKXtjb25zdCBuPXRoaXMucGFyc2VBbmltYXRpb25zKHQuYW5pbWF0aW9ucyksaT10aGlzLnBhcnNlU2hhcGVzKHQuc2hhcGVzKSxyPXRoaXMucGFyc2VHZW9tZXRyaWVzKHQuZ2VvbWV0cmllcyxpKSxvPXRoaXMucGFyc2VJbWFnZXModC5pbWFnZXMsKGZ1bmN0aW9uKCl7dm9pZCAwIT09ZSYmZShsKX0pKSxhPXRoaXMucGFyc2VUZXh0dXJlcyh0LnRleHR1cmVzLG8pLHM9dGhpcy5wYXJzZU1hdGVyaWFscyh0Lm1hdGVyaWFscyxhKSxsPXRoaXMucGFyc2VPYmplY3QodC5vYmplY3QscixzLGEsbiksYz10aGlzLnBhcnNlU2tlbGV0b25zKHQuc2tlbGV0b25zLGwpO2lmKHRoaXMuYmluZFNrZWxldG9ucyhsLGMpLHZvaWQgMCE9PWUpe2xldCB0PSExO2Zvcihjb25zdCBlIGluIG8paWYob1tlXWluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCl7dD0hMDticmVha30hMT09PXQmJmUobCl9cmV0dXJuIGx9YXN5bmMgcGFyc2VBc3luYyh0KXtjb25zdCBlPXRoaXMucGFyc2VBbmltYXRpb25zKHQuYW5pbWF0aW9ucyksbj10aGlzLnBhcnNlU2hhcGVzKHQuc2hhcGVzKSxpPXRoaXMucGFyc2VHZW9tZXRyaWVzKHQuZ2VvbWV0cmllcyxuKSxyPWF3YWl0IHRoaXMucGFyc2VJbWFnZXNBc3luYyh0LmltYWdlcyksbz10aGlzLnBhcnNlVGV4dHVyZXModC50ZXh0dXJlcyxyKSxhPXRoaXMucGFyc2VNYXRlcmlhbHModC5tYXRlcmlhbHMsbykscz10aGlzLnBhcnNlT2JqZWN0KHQub2JqZWN0LGksYSxvLGUpLGw9dGhpcy5wYXJzZVNrZWxldG9ucyh0LnNrZWxldG9ucyxzKTtyZXR1cm4gdGhpcy5iaW5kU2tlbGV0b25zKHMsbCksc31wYXJzZVNoYXBlcyh0KXtjb25zdCBlPXt9O2lmKHZvaWQgMCE9PXQpZm9yKGxldCBuPTAsaT10Lmxlbmd0aDtuPGk7bisrKXtjb25zdCBpPShuZXcgcjl0KS5mcm9tSlNPTih0W25dKTtlW2kudXVpZF09aX1yZXR1cm4gZX1wYXJzZVNrZWxldG9ucyh0LGUpe2NvbnN0IG49e30saT17fTtpZihlLnRyYXZlcnNlKChmdW5jdGlvbih0KXt0LmlzQm9uZSYmKGlbdC51dWlkXT10KX0pKSx2b2lkIDAhPT10KWZvcihsZXQgZT0wLHI9dC5sZW5ndGg7ZTxyO2UrKyl7Y29uc3Qgcj0obmV3IEMzdCkuZnJvbUpTT04odFtlXSxpKTtuW3IudXVpZF09cn1yZXR1cm4gbn1wYXJzZUdlb21ldHJpZXModCxlKXtjb25zdCBuPXt9O2lmKHZvaWQgMCE9PXQpe2NvbnN0IGk9bmV3IEE5dDtmb3IobGV0IHI9MCxvPXQubGVuZ3RoO3I8bztyKyspe2xldCBvO2NvbnN0IGE9dFtyXTtzd2l0Y2goYS50eXBlKXtjYXNlIkJ1ZmZlckdlb21ldHJ5IjpjYXNlIkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IjpvPWkucGFyc2UoYSk7YnJlYWs7Y2FzZSJHZW9tZXRyeSI6Y29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0TG9hZGVyOiBUaGUgbGVnYWN5IEdlb21ldHJ5IHR5cGUgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4iKTticmVhaztkZWZhdWx0OmEudHlwZSBpbiBiNnQ/bz1iNnRbYS50eXBlXS5mcm9tSlNPTihhLGUpOmNvbnNvbGUud2FybihgVEhSRUUuT2JqZWN0TG9hZGVyOiBVbnN1cHBvcnRlZCBnZW9tZXRyeSB0eXBlICIke2EudHlwZX0iYCl9by51dWlkPWEudXVpZCx2b2lkIDAhPT1hLm5hbWUmJihvLm5hbWU9YS5uYW1lKSwhMD09PW8uaXNCdWZmZXJHZW9tZXRyeSYmdm9pZCAwIT09YS51c2VyRGF0YSYmKG8udXNlckRhdGE9YS51c2VyRGF0YSksblthLnV1aWRdPW99fXJldHVybiBufXBhcnNlTWF0ZXJpYWxzKHQsZSl7Y29uc3Qgbj17fSxpPXt9O2lmKHZvaWQgMCE9PXQpe2NvbnN0IHI9bmV3IE05dDtyLnNldFRleHR1cmVzKGUpO2ZvcihsZXQgZT0wLG89dC5sZW5ndGg7ZTxvO2UrKyl7Y29uc3Qgbz10W2VdO2lmKCJNdWx0aU1hdGVyaWFsIj09PW8udHlwZSl7Y29uc3QgdD1bXTtmb3IobGV0IGU9MDtlPG8ubWF0ZXJpYWxzLmxlbmd0aDtlKyspe2NvbnN0IGk9by5tYXRlcmlhbHNbZV07dm9pZCAwPT09bltpLnV1aWRdJiYobltpLnV1aWRdPXIucGFyc2UoaSkpLHQucHVzaChuW2kudXVpZF0pfWlbby51dWlkXT10fWVsc2Ugdm9pZCAwPT09bltvLnV1aWRdJiYobltvLnV1aWRdPXIucGFyc2UobykpLGlbby51dWlkXT1uW28udXVpZF19fXJldHVybiBpfXBhcnNlQW5pbWF0aW9ucyh0KXtjb25zdCBlPXt9O2lmKHZvaWQgMCE9PXQpZm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IGk9RzZ0LnBhcnNlKHRbbl0pO2VbaS51dWlkXT1pfXJldHVybiBlfXBhcnNlSW1hZ2VzKHQsZSl7Y29uc3Qgbj10aGlzLGk9e307bGV0IHI7ZnVuY3Rpb24gbyh0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2NvbnN0IGU9dDtyZXR1cm4oZnVuY3Rpb24gaSh0KXtyZXR1cm4gbi5tYW5hZ2VyLml0ZW1TdGFydCh0KSxyLmxvYWQodCwoZnVuY3Rpb24oKXtuLm1hbmFnZXIuaXRlbUVuZCh0KX0pLHZvaWQgMCwoZnVuY3Rpb24oKXtuLm1hbmFnZXIuaXRlbUVycm9yKHQpLG4ubWFuYWdlci5pdGVtRW5kKHQpfSkpfSkoL14oXC9cLyl8KFthLXpdKzooXC9cLyk/KS9pLnRlc3QoZSk/ZTpuLnJlc291cmNlUGF0aCtlKX1yZXR1cm4gdC5kYXRhP3tkYXRhOmQxdCh0LnR5cGUsdC5kYXRhKSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodH06bnVsbH1pZih2b2lkIDAhPT10JiZ0Lmxlbmd0aD4wKXtjb25zdCBuPW5ldyBZNnQoZSk7cj1uZXcgSjZ0KG4pLHIuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXtjb25zdCBuPXRbZV0scj1uLnVybDtpZihBcnJheS5pc0FycmF5KHIpKXtpW24udXVpZF09W107Zm9yKGxldCB0PTAsZT1yLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPW8oclt0XSk7bnVsbCE9PWUmJihlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudD9pW24udXVpZF0ucHVzaChlKTppW24udXVpZF0ucHVzaChuZXcgTTN0KGUuZGF0YSxlLndpZHRoLGUuaGVpZ2h0KSkpfX1lbHNle2NvbnN0IHQ9byhuLnVybCk7bnVsbCE9PXQmJihpW24udXVpZF09dCl9fX1yZXR1cm4gaX1hc3luYyBwYXJzZUltYWdlc0FzeW5jKHQpe2NvbnN0IGU9dGhpcyxuPXt9O2xldCBpO2FzeW5jIGZ1bmN0aW9uIHIodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtjb25zdCBuPXQscj0vXihcL1wvKXwoW2Etel0rOihcL1wvKT8pL2kudGVzdChuKT9uOmUucmVzb3VyY2VQYXRoK247cmV0dXJuIGF3YWl0IGkubG9hZEFzeW5jKHIpfXJldHVybiB0LmRhdGE/e2RhdGE6ZDF0KHQudHlwZSx0LmRhdGEpLHdpZHRoOnQud2lkdGgsaGVpZ2h0OnQuaGVpZ2h0fTpudWxsfWlmKHZvaWQgMCE9PXQmJnQubGVuZ3RoPjApe2k9bmV3IEo2dCh0aGlzLm1hbmFnZXIpLGkuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7Zm9yKGxldCBlPTAsaT10Lmxlbmd0aDtlPGk7ZSsrKXtjb25zdCBpPXRbZV0sbz1pLnVybDtpZihBcnJheS5pc0FycmF5KG8pKXtuW2kudXVpZF09W107Zm9yKGxldCB0PTAsZT1vLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPW9bdF0sYT1hd2FpdCByKGUpO251bGwhPT1hJiYoYSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQ/bltpLnV1aWRdLnB1c2goYSk6bltpLnV1aWRdLnB1c2gobmV3IE0zdChhLmRhdGEsYS53aWR0aCxhLmhlaWdodCkpKX19ZWxzZXtjb25zdCB0PWF3YWl0IHIoaS51cmwpO251bGwhPT10JiYobltpLnV1aWRdPXQpfX19cmV0dXJuIG59cGFyc2VUZXh0dXJlcyh0LGUpe2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ/dDooY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VUZXh0dXJlOiBDb25zdGFudCBzaG91bGQgYmUgaW4gbnVtZXJpYyBmb3JtLiIsdCksZVt0XSl9Y29uc3QgaT17fTtpZih2b2lkIDAhPT10KWZvcihsZXQgcj0wLG89dC5sZW5ndGg7cjxvO3IrKyl7Y29uc3Qgbz10W3JdO2xldCBhO3ZvaWQgMD09PW8uaW1hZ2UmJmNvbnNvbGUud2FybignVEhSRUUuT2JqZWN0TG9hZGVyOiBObyAiaW1hZ2UiIHNwZWNpZmllZCBmb3InLG8udXVpZCksdm9pZCAwPT09ZVtvLmltYWdlXSYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBpbWFnZSIsby5pbWFnZSk7Y29uc3Qgcz1lW28uaW1hZ2VdO0FycmF5LmlzQXJyYXkocyk/KGE9bmV3ICQxdChzKSw2PT09cy5sZW5ndGgmJihhLm5lZWRzVXBkYXRlPSEwKSk6KGE9cyYmcy5kYXRhP25ldyBNM3Qocy5kYXRhLHMud2lkdGgscy5oZWlnaHQpOm5ldyBiSnQocykscyYmKGEubmVlZHNVcGRhdGU9ITApKSxhLnV1aWQ9by51dWlkLHZvaWQgMCE9PW8ubmFtZSYmKGEubmFtZT1vLm5hbWUpLHZvaWQgMCE9PW8ubWFwcGluZyYmKGEubWFwcGluZz1uKG8ubWFwcGluZyxrOXQpKSx2b2lkIDAhPT1vLm9mZnNldCYmYS5vZmZzZXQuZnJvbUFycmF5KG8ub2Zmc2V0KSx2b2lkIDAhPT1vLnJlcGVhdCYmYS5yZXBlYXQuZnJvbUFycmF5KG8ucmVwZWF0KSx2b2lkIDAhPT1vLmNlbnRlciYmYS5jZW50ZXIuZnJvbUFycmF5KG8uY2VudGVyKSx2b2lkIDAhPT1vLnJvdGF0aW9uJiYoYS5yb3RhdGlvbj1vLnJvdGF0aW9uKSx2b2lkIDAhPT1vLndyYXAmJihhLndyYXBTPW4oby53cmFwWzBdLEw5dCksYS53cmFwVD1uKG8ud3JhcFsxXSxMOXQpKSx2b2lkIDAhPT1vLmZvcm1hdCYmKGEuZm9ybWF0PW8uZm9ybWF0KSx2b2lkIDAhPT1vLnR5cGUmJihhLnR5cGU9by50eXBlKSx2b2lkIDAhPT1vLmVuY29kaW5nJiYoYS5lbmNvZGluZz1vLmVuY29kaW5nKSx2b2lkIDAhPT1vLm1pbkZpbHRlciYmKGEubWluRmlsdGVyPW4oby5taW5GaWx0ZXIsUDl0KSksdm9pZCAwIT09by5tYWdGaWx0ZXImJihhLm1hZ0ZpbHRlcj1uKG8ubWFnRmlsdGVyLFA5dCkpLHZvaWQgMCE9PW8uYW5pc290cm9weSYmKGEuYW5pc290cm9weT1vLmFuaXNvdHJvcHkpLHZvaWQgMCE9PW8uZmxpcFkmJihhLmZsaXBZPW8uZmxpcFkpLHZvaWQgMCE9PW8ucHJlbXVsdGlwbHlBbHBoYSYmKGEucHJlbXVsdGlwbHlBbHBoYT1vLnByZW11bHRpcGx5QWxwaGEpLHZvaWQgMCE9PW8udW5wYWNrQWxpZ25tZW50JiYoYS51bnBhY2tBbGlnbm1lbnQ9by51bnBhY2tBbGlnbm1lbnQpLGlbby51dWlkXT1hfXJldHVybiBpfXBhcnNlT2JqZWN0KHQsZSxuLGkscil7bGV0IG8sYSxzO2Z1bmN0aW9uIGwodCl7cmV0dXJuIHZvaWQgMD09PWVbdF0mJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgZ2VvbWV0cnkiLHQpLGVbdF19ZnVuY3Rpb24gYyh0KXtpZih2b2lkIDAhPT10KXtpZihBcnJheS5pc0FycmF5KHQpKXtjb25zdCBlPVtdO2ZvcihsZXQgaT0wLHI9dC5sZW5ndGg7aTxyO2krKyl7Y29uc3Qgcj10W2ldO3ZvaWQgMD09PW5bcl0mJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwiLHIpLGUucHVzaChuW3JdKX1yZXR1cm4gZX1yZXR1cm4gdm9pZCAwPT09blt0XSYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBtYXRlcmlhbCIsdCksblt0XX19ZnVuY3Rpb24gdSh0KXtyZXR1cm4gdm9pZCAwPT09aVt0XSYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlIix0KSxpW3RdfXN3aXRjaCh0LnR5cGUpe2Nhc2UiU2NlbmUiOm89bmV3IFg1dCx2b2lkIDAhPT10LmJhY2tncm91bmQmJihvLmJhY2tncm91bmQ9TnVtYmVyLmlzSW50ZWdlcih0LmJhY2tncm91bmQpP25ldyAkUXQodC5iYWNrZ3JvdW5kKTp1KHQuYmFja2dyb3VuZCkpLHZvaWQgMCE9PXQuZW52aXJvbm1lbnQmJihvLmVudmlyb25tZW50PXUodC5lbnZpcm9ubWVudCkpLHZvaWQgMCE9PXQuZm9nJiYoIkZvZyI9PT10LmZvZy50eXBlP28uZm9nPW5ldyBZNXQodC5mb2cuY29sb3IsdC5mb2cubmVhcix0LmZvZy5mYXIpOiJGb2dFeHAyIj09PXQuZm9nLnR5cGUmJihvLmZvZz1uZXcgcTV0KHQuZm9nLmNvbG9yLHQuZm9nLmRlbnNpdHkpKSk7YnJlYWs7Y2FzZSJQZXJzcGVjdGl2ZUNhbWVyYSI6bz1uZXcgcTF0KHQuZm92LHQuYXNwZWN0LHQubmVhcix0LmZhciksdm9pZCAwIT09dC5mb2N1cyYmKG8uZm9jdXM9dC5mb2N1cyksdm9pZCAwIT09dC56b29tJiYoby56b29tPXQuem9vbSksdm9pZCAwIT09dC5maWxtR2F1Z2UmJihvLmZpbG1HYXVnZT10LmZpbG1HYXVnZSksdm9pZCAwIT09dC5maWxtT2Zmc2V0JiYoby5maWxtT2Zmc2V0PXQuZmlsbU9mZnNldCksdm9pZCAwIT09dC52aWV3JiYoby52aWV3PU9iamVjdC5hc3NpZ24oe30sdC52aWV3KSk7YnJlYWs7Y2FzZSJPcnRob2dyYXBoaWNDYW1lcmEiOm89bmV3IGcwdCh0LmxlZnQsdC5yaWdodCx0LnRvcCx0LmJvdHRvbSx0Lm5lYXIsdC5mYXIpLHZvaWQgMCE9PXQuem9vbSYmKG8uem9vbT10Lnpvb20pLHZvaWQgMCE9PXQudmlldyYmKG8udmlldz1PYmplY3QuYXNzaWduKHt9LHQudmlldykpO2JyZWFrO2Nhc2UiQW1iaWVudExpZ2h0IjpvPW5ldyBiOXQodC5jb2xvcix0LmludGVuc2l0eSk7YnJlYWs7Y2FzZSJEaXJlY3Rpb25hbExpZ2h0IjpvPW5ldyB2OXQodC5jb2xvcix0LmludGVuc2l0eSk7YnJlYWs7Y2FzZSJQb2ludExpZ2h0IjpvPW5ldyBfOXQodC5jb2xvcix0LmludGVuc2l0eSx0LmRpc3RhbmNlLHQuZGVjYXkpO2JyZWFrO2Nhc2UiUmVjdEFyZWFMaWdodCI6bz1uZXcgeDl0KHQuY29sb3IsdC5pbnRlbnNpdHksdC53aWR0aCx0LmhlaWdodCk7YnJlYWs7Y2FzZSJTcG90TGlnaHQiOm89bmV3IGQ5dCh0LmNvbG9yLHQuaW50ZW5zaXR5LHQuZGlzdGFuY2UsdC5hbmdsZSx0LnBlbnVtYnJhLHQuZGVjYXkpO2JyZWFrO2Nhc2UiSGVtaXNwaGVyZUxpZ2h0IjpvPW5ldyBhOXQodC5jb2xvcix0Lmdyb3VuZENvbG9yLHQuaW50ZW5zaXR5KTticmVhaztjYXNlIkxpZ2h0UHJvYmUiOm89KG5ldyBTOXQpLmZyb21KU09OKHQpO2JyZWFrO2Nhc2UiU2tpbm5lZE1lc2giOmE9bCh0Lmdlb21ldHJ5KSxzPWModC5tYXRlcmlhbCksbz1uZXcgdzN0KGEscyksdm9pZCAwIT09dC5iaW5kTW9kZSYmKG8uYmluZE1vZGU9dC5iaW5kTW9kZSksdm9pZCAwIT09dC5iaW5kTWF0cml4JiZvLmJpbmRNYXRyaXguZnJvbUFycmF5KHQuYmluZE1hdHJpeCksdm9pZCAwIT09dC5za2VsZXRvbiYmKG8uc2tlbGV0b249dC5za2VsZXRvbik7YnJlYWs7Y2FzZSJNZXNoIjphPWwodC5nZW9tZXRyeSkscz1jKHQubWF0ZXJpYWwpLG89bmV3IEIxdChhLHMpO2JyZWFrO2Nhc2UiSW5zdGFuY2VkTWVzaCI6YT1sKHQuZ2VvbWV0cnkpLHM9Yyh0Lm1hdGVyaWFsKTtjb25zdCBlPXQuaW5zdGFuY2VNYXRyaXgsbj10Lmluc3RhbmNlQ29sb3I7bz1uZXcgTjN0KGEscyx0LmNvdW50KSxvLmluc3RhbmNlTWF0cml4PW5ldyBRUXQobmV3IEZsb2F0MzJBcnJheShlLmFycmF5KSwxNiksdm9pZCAwIT09biYmKG8uaW5zdGFuY2VDb2xvcj1uZXcgUVF0KG5ldyBGbG9hdDMyQXJyYXkobi5hcnJheSksbi5pdGVtU2l6ZSkpO2JyZWFrO2Nhc2UiTE9EIjpvPW5ldyBnM3Q7YnJlYWs7Y2FzZSJMaW5lIjpvPW5ldyBIM3QobCh0Lmdlb21ldHJ5KSxjKHQubWF0ZXJpYWwpKTticmVhaztjYXNlIkxpbmVMb29wIjpvPW5ldyBqM3QobCh0Lmdlb21ldHJ5KSxjKHQubWF0ZXJpYWwpKTticmVhaztjYXNlIkxpbmVTZWdtZW50cyI6bz1uZXcgVTN0KGwodC5nZW9tZXRyeSksYyh0Lm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSJQb2ludENsb3VkIjpjYXNlIlBvaW50cyI6bz1uZXcgJDN0KGwodC5nZW9tZXRyeSksYyh0Lm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSJTcHJpdGUiOm89bmV3IGQzdChjKHQubWF0ZXJpYWwpKTticmVhaztjYXNlIkdyb3VwIjpvPW5ldyBINXQ7YnJlYWs7Y2FzZSJCb25lIjpvPW5ldyBTM3Q7YnJlYWs7ZGVmYXVsdDpvPW5ldyBrUXR9aWYoby51dWlkPXQudXVpZCx2b2lkIDAhPT10Lm5hbWUmJihvLm5hbWU9dC5uYW1lKSx2b2lkIDAhPT10Lm1hdHJpeD8oby5tYXRyaXguZnJvbUFycmF5KHQubWF0cml4KSx2b2lkIDAhPT10Lm1hdHJpeEF1dG9VcGRhdGUmJihvLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlKSxvLm1hdHJpeEF1dG9VcGRhdGUmJm8ubWF0cml4LmRlY29tcG9zZShvLnBvc2l0aW9uLG8ucXVhdGVybmlvbixvLnNjYWxlKSk6KHZvaWQgMCE9PXQucG9zaXRpb24mJm8ucG9zaXRpb24uZnJvbUFycmF5KHQucG9zaXRpb24pLHZvaWQgMCE9PXQucm90YXRpb24mJm8ucm90YXRpb24uZnJvbUFycmF5KHQucm90YXRpb24pLHZvaWQgMCE9PXQucXVhdGVybmlvbiYmby5xdWF0ZXJuaW9uLmZyb21BcnJheSh0LnF1YXRlcm5pb24pLHZvaWQgMCE9PXQuc2NhbGUmJm8uc2NhbGUuZnJvbUFycmF5KHQuc2NhbGUpKSx2b2lkIDAhPT10LmNhc3RTaGFkb3cmJihvLmNhc3RTaGFkb3c9dC5jYXN0U2hhZG93KSx2b2lkIDAhPT10LnJlY2VpdmVTaGFkb3cmJihvLnJlY2VpdmVTaGFkb3c9dC5yZWNlaXZlU2hhZG93KSx0LnNoYWRvdyYmKHZvaWQgMCE9PXQuc2hhZG93LmJpYXMmJihvLnNoYWRvdy5iaWFzPXQuc2hhZG93LmJpYXMpLHZvaWQgMCE9PXQuc2hhZG93Lm5vcm1hbEJpYXMmJihvLnNoYWRvdy5ub3JtYWxCaWFzPXQuc2hhZG93Lm5vcm1hbEJpYXMpLHZvaWQgMCE9PXQuc2hhZG93LnJhZGl1cyYmKG8uc2hhZG93LnJhZGl1cz10LnNoYWRvdy5yYWRpdXMpLHZvaWQgMCE9PXQuc2hhZG93Lm1hcFNpemUmJm8uc2hhZG93Lm1hcFNpemUuZnJvbUFycmF5KHQuc2hhZG93Lm1hcFNpemUpLHZvaWQgMCE9PXQuc2hhZG93LmNhbWVyYSYmKG8uc2hhZG93LmNhbWVyYT10aGlzLnBhcnNlT2JqZWN0KHQuc2hhZG93LmNhbWVyYSkpKSx2b2lkIDAhPT10LnZpc2libGUmJihvLnZpc2libGU9dC52aXNpYmxlKSx2b2lkIDAhPT10LmZydXN0dW1DdWxsZWQmJihvLmZydXN0dW1DdWxsZWQ9dC5mcnVzdHVtQ3VsbGVkKSx2b2lkIDAhPT10LnJlbmRlck9yZGVyJiYoby5yZW5kZXJPcmRlcj10LnJlbmRlck9yZGVyKSx2b2lkIDAhPT10LnVzZXJEYXRhJiYoby51c2VyRGF0YT10LnVzZXJEYXRhKSx2b2lkIDAhPT10LmxheWVycyYmKG8ubGF5ZXJzLm1hc2s9dC5sYXllcnMpLHZvaWQgMCE9PXQuY2hpbGRyZW4pe2NvbnN0IGE9dC5jaGlsZHJlbjtmb3IobGV0IHQ9MDt0PGEubGVuZ3RoO3QrKylvLmFkZCh0aGlzLnBhcnNlT2JqZWN0KGFbdF0sZSxuLGkscikpfWlmKHZvaWQgMCE9PXQuYW5pbWF0aW9ucyl7Y29uc3QgZT10LmFuaW1hdGlvbnM7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspby5hbmltYXRpb25zLnB1c2gocltlW3RdXSl9aWYoIkxPRCI9PT10LnR5cGUpe3ZvaWQgMCE9PXQuYXV0b1VwZGF0ZSYmKG8uYXV0b1VwZGF0ZT10LmF1dG9VcGRhdGUpO2NvbnN0IGU9dC5sZXZlbHM7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2NvbnN0IG49ZVt0XSxpPW8uZ2V0T2JqZWN0QnlQcm9wZXJ0eSgidXVpZCIsbi5vYmplY3QpO3ZvaWQgMCE9PWkmJm8uYWRkTGV2ZWwoaSxuLmRpc3RhbmNlKX19cmV0dXJuIG99YmluZFNrZWxldG9ucyh0LGUpezAhPT1PYmplY3Qua2V5cyhlKS5sZW5ndGgmJnQudHJhdmVyc2UoKGZ1bmN0aW9uKHQpe2lmKCEwPT09dC5pc1NraW5uZWRNZXNoJiZ2b2lkIDAhPT10LnNrZWxldG9uKXtjb25zdCBuPWVbdC5za2VsZXRvbl07dm9pZCAwPT09bj9jb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogTm8gc2tlbGV0b24gZm91bmQgd2l0aCBVVUlEOiIsdC5za2VsZXRvbik6dC5iaW5kKG4sdC5iaW5kTWF0cml4KX19KSl9c2V0VGV4dHVyZVBhdGgodCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiAuc2V0VGV4dHVyZVBhdGgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRSZXNvdXJjZVBhdGgoKS4iKSx0aGlzLnNldFJlc291cmNlUGF0aCh0KX19LE9iamVjdFNwYWNlTm9ybWFsTWFwOjEsT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5Omw2dCxPY3RhaGVkcm9uR2VvbWV0cnk6bDZ0LE9uZUZhY3RvcjoyMDEsT25lTWludXNEc3RBbHBoYUZhY3RvcjoyMDcsT25lTWludXNEc3RDb2xvckZhY3RvcjoyMDksT25lTWludXNTcmNBbHBoYUZhY3RvcjoyMDUsT25lTWludXNTcmNDb2xvckZhY3RvcjoyMDMsT3J0aG9ncmFwaGljQ2FtZXJhOmcwdCxQQ0ZTaGFkb3dNYXA6MSxQQ0ZTb2Z0U2hhZG93TWFwOjIsUE1SRU1HZW5lcmF0b3I6UjB0LFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeTpjNnQsUGFyYW1ldHJpY0dlb21ldHJ5OmM2dCxQYXJ0aWNsZTpmdW5jdGlvbiBmN3QodCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUGFydGljbGUgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5TcHJpdGUuIiksbmV3IGQzdCh0KX0sUGFydGljbGVCYXNpY01hdGVyaWFsOmZ1bmN0aW9uIG03dCh0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZUJhc2ljTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4iKSxuZXcgRzN0KHQpfSxQYXJ0aWNsZVN5c3RlbTpmdW5jdGlvbiBnN3QodCxlKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZVN5c3RlbSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50cy4iKSxuZXcgJDN0KHQsZSl9LFBhcnRpY2xlU3lzdGVtTWF0ZXJpYWw6ZnVuY3Rpb24gXzd0KHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlBhcnRpY2xlU3lzdGVtTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4iKSxuZXcgRzN0KHQpfSxQYXRoOmk5dCxQZXJzcGVjdGl2ZUNhbWVyYTpxMXQsUGxhbmU6dDB0LFBsYW5lQnVmZmVyR2VvbWV0cnk6YTB0LFBsYW5lR2VvbWV0cnk6YTB0LFBsYW5lSGVscGVyOmNsYXNzIGV4dGVuZHMgSDN0e2NvbnN0cnVjdG9yKHQsZT0xLG49MTY3NzY5NjApe2NvbnN0IGk9bixyPW5ldyBiMXQ7ci5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KFsxLC0xLDEsLTEsMSwxLC0xLC0xLDEsMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwtMSwxLDEsMSwxLDAsMCwxLDAsMCwwXSwzKSksci5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxzdXBlcihyLG5ldyBJM3Qoe2NvbG9yOmksdG9uZU1hcHBlZDohMX0pKSx0aGlzLnR5cGU9IlBsYW5lSGVscGVyIix0aGlzLnBsYW5lPXQsdGhpcy5zaXplPWU7Y29uc3Qgbz1uZXcgYjF0O28uc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGwxdChbMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwxLDEsLTEsLTEsMSwxLC0xLDFdLDMpKSxvLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHRoaXMuYWRkKG5ldyBCMXQobyxuZXcgS1F0KHtjb2xvcjppLG9wYWNpdHk6LjIsdHJhbnNwYXJlbnQ6ITAsZGVwdGhXcml0ZTohMSx0b25lTWFwcGVkOiExfSkpKX11cGRhdGVNYXRyaXhXb3JsZCh0KXtsZXQgZT0tdGhpcy5wbGFuZS5jb25zdGFudDtNYXRoLmFicyhlKTwxZS04JiYoZT0xZS04KSx0aGlzLnNjYWxlLnNldCguNSp0aGlzLnNpemUsLjUqdGhpcy5zaXplLGUpLHRoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuc2lkZT1lPDA/MTowLHRoaXMubG9va0F0KHRoaXMucGxhbmUubm9ybWFsKSxzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KX19LFBvaW50Q2xvdWQ6ZnVuY3Rpb24geTd0KHQsZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUG9pbnRDbG91ZCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50cy4iKSxuZXcgJDN0KHQsZSl9LFBvaW50Q2xvdWRNYXRlcmlhbDpmdW5jdGlvbiB2N3QodCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUG9pbnRDbG91ZE1hdGVyaWFsIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzTWF0ZXJpYWwuIiksbmV3IEczdCh0KX0sUG9pbnRMaWdodDpfOXQsUG9pbnRMaWdodEhlbHBlcjpjbGFzcyBleHRlbmRzIEIxdHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IGQ2dChlLDQsMiksbmV3IEtRdCh7d2lyZWZyYW1lOiEwLGZvZzohMSx0b25lTWFwcGVkOiExfSkpLHRoaXMubGlnaHQ9dCx0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCksdGhpcy5jb2xvcj1uLHRoaXMudHlwZT0iUG9pbnRMaWdodEhlbHBlciIsdGhpcy5tYXRyaXg9dGhpcy5saWdodC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy51cGRhdGUoKX1kaXNwb3NlKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9dXBkYXRlKCl7dm9pZCAwIT09dGhpcy5jb2xvcj90aGlzLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKTp0aGlzLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcil9fSxQb2ludHM6JDN0LFBvaW50c01hdGVyaWFsOkczdCxQb2xhckdyaWRIZWxwZXI6Y2xhc3MgZXh0ZW5kcyBVM3R7Y29uc3RydWN0b3IodD0xMCxlPTE2LG49OCxpPTY0LHI9NDQ3MzkyNCxvPTg5NDc4NDgpe3I9bmV3ICRRdChyKSxvPW5ldyAkUXQobyk7Y29uc3QgYT1bXSxzPVtdO2ZvcihsZXQgbj0wO248PWU7bisrKXtjb25zdCBpPW4vZSooMipNYXRoLlBJKSxsPU1hdGguc2luKGkpKnQsYz1NYXRoLmNvcyhpKSp0O2EucHVzaCgwLDAsMCksYS5wdXNoKGwsMCxjKTtjb25zdCB1PTEmbj9yOm87cy5wdXNoKHUucix1LmcsdS5iKSxzLnB1c2godS5yLHUuZyx1LmIpfWZvcihsZXQgZT0wO2U8PW47ZSsrKXtjb25zdCBsPTEmZT9yOm8sYz10LXQvbiplO2ZvcihsZXQgdD0wO3Q8aTt0Kyspe2xldCBlPXQvaSooMipNYXRoLlBJKSxuPU1hdGguc2luKGUpKmMscj1NYXRoLmNvcyhlKSpjO2EucHVzaChuLDAscikscy5wdXNoKGwucixsLmcsbC5iKSxlPSh0KzEpL2kqKDIqTWF0aC5QSSksbj1NYXRoLnNpbihlKSpjLHI9TWF0aC5jb3MoZSkqYyxhLnB1c2gobiwwLHIpLHMucHVzaChsLnIsbC5nLGwuYil9fWNvbnN0IGw9bmV3IGIxdDtsLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBsMXQoYSwzKSksbC5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgbDF0KHMsMykpLHN1cGVyKGwsbmV3IEkzdCh7dmVydGV4Q29sb3JzOiEwLHRvbmVNYXBwZWQ6ITF9KSksdGhpcy50eXBlPSJQb2xhckdyaWRIZWxwZXIifX0sUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5OnI0dCxQb2x5aGVkcm9uR2VvbWV0cnk6cjR0LFBvc2l0aW9uYWxBdWRpbzpjbGFzcyBleHRlbmRzICQ5dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLnBhbm5lcj10aGlzLmNvbnRleHQuY3JlYXRlUGFubmVyKCksdGhpcy5wYW5uZXIucGFubmluZ01vZGVsPSJIUlRGIix0aGlzLnBhbm5lci5jb25uZWN0KHRoaXMuZ2Fpbil9Z2V0T3V0cHV0KCl7cmV0dXJuIHRoaXMucGFubmVyfWdldFJlZkRpc3RhbmNlKCl7cmV0dXJuIHRoaXMucGFubmVyLnJlZkRpc3RhbmNlfXNldFJlZkRpc3RhbmNlKHQpe3JldHVybiB0aGlzLnBhbm5lci5yZWZEaXN0YW5jZT10LHRoaXN9Z2V0Um9sbG9mZkZhY3Rvcigpe3JldHVybiB0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yfXNldFJvbGxvZmZGYWN0b3IodCl7cmV0dXJuIHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3I9dCx0aGlzfWdldERpc3RhbmNlTW9kZWwoKXtyZXR1cm4gdGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbH1zZXREaXN0YW5jZU1vZGVsKHQpe3JldHVybiB0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsPXQsdGhpc31nZXRNYXhEaXN0YW5jZSgpe3JldHVybiB0aGlzLnBhbm5lci5tYXhEaXN0YW5jZX1zZXRNYXhEaXN0YW5jZSh0KXtyZXR1cm4gdGhpcy5wYW5uZXIubWF4RGlzdGFuY2U9dCx0aGlzfXNldERpcmVjdGlvbmFsQ29uZSh0LGUsbil7cmV0dXJuIHRoaXMucGFubmVyLmNvbmVJbm5lckFuZ2xlPXQsdGhpcy5wYW5uZXIuY29uZU91dGVyQW5nbGU9ZSx0aGlzLnBhbm5lci5jb25lT3V0ZXJHYWluPW4sdGhpc311cGRhdGVNYXRyaXhXb3JsZCh0KXtpZihzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KSwhMD09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sJiYhMT09PXRoaXMuaXNQbGF5aW5nKXJldHVybjt0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShLOXQsWjl0LEo5dCksUTl0LnNldCgwLDAsMSkuYXBwbHlRdWF0ZXJuaW9uKFo5dCk7Y29uc3QgZT10aGlzLnBhbm5lcjtpZihlLnBvc2l0aW9uWCl7Y29uc3QgdD10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdGhpcy5saXN0ZW5lci50aW1lRGVsdGE7ZS5wb3NpdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoSzl0LngsdCksZS5wb3NpdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoSzl0LnksdCksZS5wb3NpdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoSzl0LnosdCksZS5vcmllbnRhdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoUTl0LngsdCksZS5vcmllbnRhdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoUTl0LnksdCksZS5vcmllbnRhdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoUTl0LnosdCl9ZWxzZSBlLnNldFBvc2l0aW9uKEs5dC54LEs5dC55LEs5dC56KSxlLnNldE9yaWVudGF0aW9uKFE5dC54LFE5dC55LFE5dC56KX19LFByb3BlcnR5QmluZGluZzpoOHQsUHJvcGVydHlNaXhlcjplOHQsUXVhZHJhdGljQmV6aWVyQ3VydmU6QzR0LFF1YWRyYXRpY0JlemllckN1cnZlMzpBNHQsUXVhdGVybmlvbjpUSnQsUXVhdGVybmlvbktleWZyYW1lVHJhY2s6VjZ0LFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudDpGNnQsUkVWSVNJT046Qkt0LFJHQkFEZXB0aFBhY2tpbmc6MzIwMSxSR0JBRm9ybWF0OmhadCxSR0JBSW50ZWdlckZvcm1hdDoxMDMzLFJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQ6Mzc4MTksUkdCQV9BU1RDXzEweDVfRm9ybWF0OjM3ODE2LFJHQkFfQVNUQ18xMHg2X0Zvcm1hdDozNzgxNyxSR0JBX0FTVENfMTB4OF9Gb3JtYXQ6Mzc4MTgsUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdDozNzgyMCxSR0JBX0FTVENfMTJ4MTJfRm9ybWF0OjM3ODIxLFJHQkFfQVNUQ180eDRfRm9ybWF0OjM3ODA4LFJHQkFfQVNUQ181eDRfRm9ybWF0OjM3ODA5LFJHQkFfQVNUQ181eDVfRm9ybWF0OjM3ODEwLFJHQkFfQVNUQ182eDVfRm9ybWF0OjM3ODExLFJHQkFfQVNUQ182eDZfRm9ybWF0OjM3ODEyLFJHQkFfQVNUQ184eDVfRm9ybWF0OjM3ODEzLFJHQkFfQVNUQ184eDZfRm9ybWF0OjM3ODE0LFJHQkFfQVNUQ184eDhfRm9ybWF0OjM3ODE1LFJHQkFfQlBUQ19Gb3JtYXQ6MzY0OTIsUkdCQV9FVEMyX0VBQ19Gb3JtYXQ6U1p0LFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdDp4WnQsUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0OmJadCxSR0JBX1MzVENfRFhUMV9Gb3JtYXQ6bVp0LFJHQkFfUzNUQ19EWFQzX0Zvcm1hdDpnWnQsUkdCQV9TM1RDX0RYVDVfRm9ybWF0Ol9adCxSR0JERW5jb2Rpbmc6Qlp0LFJHQkVFbmNvZGluZzpPWnQsUkdCRUZvcm1hdDoxMDIzLFJHQkZvcm1hdDp1WnQsUkdCSW50ZWdlckZvcm1hdDoxMDMyLFJHQk0xNkVuY29kaW5nOkRadCxSR0JNN0VuY29kaW5nOnpadCxSR0JfRVRDMV9Gb3JtYXQ6MzYxOTYsUkdCX0VUQzJfRm9ybWF0OndadCxSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdDp2WnQsUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQ6eVp0LFJHQl9TM1RDX0RYVDFfRm9ybWF0OmZadCxSR0Zvcm1hdDoxMDMwLFJHSW50ZWdlckZvcm1hdDoxMDMxLFJhd1NoYWRlck1hdGVyaWFsOl8wdCxSYXk6aVF0LFJheWNhc3RlcjpjbGFzc3tjb25zdHJ1Y3Rvcih0LGUsbj0wLGk9MS8wKXt0aGlzLnJheT1uZXcgaVF0KHQsZSksdGhpcy5uZWFyPW4sdGhpcy5mYXI9aSx0aGlzLmNhbWVyYT1udWxsLHRoaXMubGF5ZXJzPW5ldyBtUXQsdGhpcy5wYXJhbXM9e01lc2g6e30sTGluZTp7dGhyZXNob2xkOjF9LExPRDp7fSxQb2ludHM6e3RocmVzaG9sZDoxfSxTcHJpdGU6e319fXNldCh0LGUpe3RoaXMucmF5LnNldCh0LGUpfXNldEZyb21DYW1lcmEodCxlKXtlJiZlLmlzUGVyc3BlY3RpdmVDYW1lcmE/KHRoaXMucmF5Lm9yaWdpbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oZS5tYXRyaXhXb3JsZCksdGhpcy5yYXkuZGlyZWN0aW9uLnNldCh0LngsdC55LC41KS51bnByb2plY3QoZSkuc3ViKHRoaXMucmF5Lm9yaWdpbikubm9ybWFsaXplKCksdGhpcy5jYW1lcmE9ZSk6ZSYmZS5pc09ydGhvZ3JhcGhpY0NhbWVyYT8odGhpcy5yYXkub3JpZ2luLnNldCh0LngsdC55LChlLm5lYXIrZS5mYXIpLyhlLm5lYXItZS5mYXIpKS51bnByb2plY3QoZSksdGhpcy5yYXkuZGlyZWN0aW9uLnNldCgwLDAsLTEpLnRyYW5zZm9ybURpcmVjdGlvbihlLm1hdHJpeFdvcmxkKSx0aGlzLmNhbWVyYT1lKTpjb25zb2xlLmVycm9yKCJUSFJFRS5SYXljYXN0ZXI6IFVuc3VwcG9ydGVkIGNhbWVyYSB0eXBlOiAiK2UudHlwZSl9aW50ZXJzZWN0T2JqZWN0KHQsZT0hMSxuPVtdKXtyZXR1cm4gdjh0KHQsdGhpcyxuLGUpLG4uc29ydCh5OHQpLG59aW50ZXJzZWN0T2JqZWN0cyh0LGU9ITEsbj1bXSl7Zm9yKGxldCBpPTAscj10Lmxlbmd0aDtpPHI7aSsrKXY4dCh0W2ldLHRoaXMsbixlKTtyZXR1cm4gbi5zb3J0KHk4dCksbn19LFJlY3RBcmVhTGlnaHQ6eDl0LFJlZEZvcm1hdDoxMDI4LFJlZEludGVnZXJGb3JtYXQ6MTAyOSxSZWluaGFyZFRvbmVNYXBwaW5nOjIsUmVwZWF0V3JhcHBpbmc6JEt0LFJlcGxhY2VTdGVuY2lsT3A6NzY4MSxSZXZlcnNlU3VidHJhY3RFcXVhdGlvbjoxMDIsUmluZ0J1ZmZlckdlb21ldHJ5OnU2dCxSaW5nR2VvbWV0cnk6dTZ0LFNSR0I4X0FMUEhBOF9BU1RDXzEweDEwX0Zvcm1hdDozNzg1MSxTUkdCOF9BTFBIQThfQVNUQ18xMHg1X0Zvcm1hdDozNzg0OCxTUkdCOF9BTFBIQThfQVNUQ18xMHg2X0Zvcm1hdDozNzg0OSxTUkdCOF9BTFBIQThfQVNUQ18xMHg4X0Zvcm1hdDozNzg1MCxTUkdCOF9BTFBIQThfQVNUQ18xMngxMF9Gb3JtYXQ6Mzc4NTIsU1JHQjhfQUxQSEE4X0FTVENfMTJ4MTJfRm9ybWF0OjM3ODUzLFNSR0I4X0FMUEhBOF9BU1RDXzR4NF9Gb3JtYXQ6Mzc4NDAsU1JHQjhfQUxQSEE4X0FTVENfNXg0X0Zvcm1hdDozNzg0MSxTUkdCOF9BTFBIQThfQVNUQ181eDVfRm9ybWF0OjM3ODQyLFNSR0I4X0FMUEhBOF9BU1RDXzZ4NV9Gb3JtYXQ6Mzc4NDMsU1JHQjhfQUxQSEE4X0FTVENfNng2X0Zvcm1hdDozNzg0NCxTUkdCOF9BTFBIQThfQVNUQ184eDVfRm9ybWF0OjM3ODQ1LFNSR0I4X0FMUEhBOF9BU1RDXzh4Nl9Gb3JtYXQ6Mzc4NDYsU1JHQjhfQUxQSEE4X0FTVENfOHg4X0Zvcm1hdDozNzg0NyxTY2VuZTpYNXQsU2NlbmVVdGlsczpaOHQsU2hhZGVyQ2h1bms6czB0LFNoYWRlckxpYjpjMHQsU2hhZGVyTWF0ZXJpYWw6RzF0LFNoYWRvd01hdGVyaWFsOng2dCxTaGFwZTpyOXQsU2hhcGVCdWZmZXJHZW9tZXRyeTpoNnQsU2hhcGVHZW9tZXRyeTpoNnQsU2hhcGVQYXRoOkk5dCxTaGFwZVV0aWxzOmU2dCxTaG9ydFR5cGU6MTAxMSxTa2VsZXRvbjpDM3QsU2tlbGV0b25IZWxwZXI6UDh0LFNraW5uZWRNZXNoOnczdCxTbW9vdGhTaGFkaW5nOjIsU3BoZXJlOiRKdCxTcGhlcmVCdWZmZXJHZW9tZXRyeTpkNnQsU3BoZXJlR2VvbWV0cnk6ZDZ0LFNwaGVyaWNhbDpiOHQsU3BoZXJpY2FsSGFybW9uaWNzMzp3OXQsU3BsaW5lQ3VydmU6azR0LFNwb3RMaWdodDpkOXQsU3BvdExpZ2h0SGVscGVyOmNsYXNzIGV4dGVuZHMga1F0e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoKSx0aGlzLmxpZ2h0PXQsdGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpLHRoaXMubWF0cml4PXQubWF0cml4V29ybGQsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuY29sb3I9ZTtjb25zdCBuPW5ldyBiMXQsaT1bMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsLTEsMCwxLDAsMCwwLDAsMSwxLDAsMCwwLDAsLTEsMV07Zm9yKGxldCB0PTAsZT0xLG49MzI7dDxuO3QrKyxlKyspe2NvbnN0IHI9dC9uKk1hdGguUEkqMixvPWUvbipNYXRoLlBJKjI7aS5wdXNoKE1hdGguY29zKHIpLE1hdGguc2luKHIpLDEsTWF0aC5jb3MobyksTWF0aC5zaW4obyksMSl9bi5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgbDF0KGksMykpO2NvbnN0IHI9bmV3IEkzdCh7Zm9nOiExLHRvbmVNYXBwZWQ6ITF9KTt0aGlzLmNvbmU9bmV3IFUzdChuLHIpLHRoaXMuYWRkKHRoaXMuY29uZSksdGhpcy51cGRhdGUoKX1kaXNwb3NlKCl7dGhpcy5jb25lLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLmNvbmUubWF0ZXJpYWwuZGlzcG9zZSgpfXVwZGF0ZSgpe3RoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTtjb25zdCB0PXRoaXMubGlnaHQuZGlzdGFuY2U/dGhpcy5saWdodC5kaXN0YW5jZToxZTMsZT10Kk1hdGgudGFuKHRoaXMubGlnaHQuYW5nbGUpO3RoaXMuY29uZS5zY2FsZS5zZXQoZSxlLHQpLEM4dC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC50YXJnZXQubWF0cml4V29ybGQpLHRoaXMuY29uZS5sb29rQXQoQzh0KSx2b2lkIDAhPT10aGlzLmNvbG9yP3RoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik6dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcil9fSxTcHJpdGU6ZDN0LFNwcml0ZU1hdGVyaWFsOko1dCxTcmNBbHBoYUZhY3RvcjoyMDQsU3JjQWxwaGFTYXR1cmF0ZUZhY3RvcjoyMTAsU3JjQ29sb3JGYWN0b3I6MjAyLFN0YXRpY0NvcHlVc2FnZTozNTA0NixTdGF0aWNEcmF3VXNhZ2U6Rlp0LFN0YXRpY1JlYWRVc2FnZTozNTA0NSxTdGVyZW9DYW1lcmE6Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLnR5cGU9IlN0ZXJlb0NhbWVyYSIsdGhpcy5hc3BlY3Q9MSx0aGlzLmV5ZVNlcD0uMDY0LHRoaXMuY2FtZXJhTD1uZXcgcTF0LHRoaXMuY2FtZXJhTC5sYXllcnMuZW5hYmxlKDEpLHRoaXMuY2FtZXJhTC5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuY2FtZXJhUj1uZXcgcTF0LHRoaXMuY2FtZXJhUi5sYXllcnMuZW5hYmxlKDIpLHRoaXMuY2FtZXJhUi5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuX2NhY2hlPXtmb2N1czpudWxsLGZvdjpudWxsLGFzcGVjdDpudWxsLG5lYXI6bnVsbCxmYXI6bnVsbCx6b29tOm51bGwsZXllU2VwOm51bGx9fXVwZGF0ZSh0KXtjb25zdCBlPXRoaXMuX2NhY2hlO2lmKGUuZm9jdXMhPT10LmZvY3VzfHxlLmZvdiE9PXQuZm92fHxlLmFzcGVjdCE9PXQuYXNwZWN0KnRoaXMuYXNwZWN0fHxlLm5lYXIhPT10Lm5lYXJ8fGUuZmFyIT09dC5mYXJ8fGUuem9vbSE9PXQuem9vbXx8ZS5leWVTZXAhPT10aGlzLmV5ZVNlcCl7ZS5mb2N1cz10LmZvY3VzLGUuZm92PXQuZm92LGUuYXNwZWN0PXQuYXNwZWN0KnRoaXMuYXNwZWN0LGUubmVhcj10Lm5lYXIsZS5mYXI9dC5mYXIsZS56b29tPXQuem9vbSxlLmV5ZVNlcD10aGlzLmV5ZVNlcDtjb25zdCBuPXQucHJvamVjdGlvbk1hdHJpeC5jbG9uZSgpLGk9ZS5leWVTZXAvMixyPWkqZS5uZWFyL2UuZm9jdXMsbz1lLm5lYXIqTWF0aC50YW4ocVp0KmUuZm92Ki41KS9lLnpvb207bGV0IGEscztVOXQuZWxlbWVudHNbMTJdPS1pLFY5dC5lbGVtZW50c1sxMl09aSxhPS1vKmUuYXNwZWN0K3Iscz1vKmUuYXNwZWN0K3Isbi5lbGVtZW50c1swXT0yKmUubmVhci8ocy1hKSxuLmVsZW1lbnRzWzhdPShzK2EpLyhzLWEpLHRoaXMuY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4LmNvcHkobiksYT0tbyplLmFzcGVjdC1yLHM9byplLmFzcGVjdC1yLG4uZWxlbWVudHNbMF09MiplLm5lYXIvKHMtYSksbi5lbGVtZW50c1s4XT0ocythKS8ocy1hKSx0aGlzLmNhbWVyYVIucHJvamVjdGlvbk1hdHJpeC5jb3B5KG4pfXRoaXMuY2FtZXJhTC5tYXRyaXhXb3JsZC5jb3B5KHQubWF0cml4V29ybGQpLm11bHRpcGx5KFU5dCksdGhpcy5jYW1lcmFSLm1hdHJpeFdvcmxkLmNvcHkodC5tYXRyaXhXb3JsZCkubXVsdGlwbHkoVjl0KX19LFN0cmVhbUNvcHlVc2FnZTozNTA0MixTdHJlYW1EcmF3VXNhZ2U6MzUwNDAsU3RyZWFtUmVhZFVzYWdlOjM1MDQxLFN0cmluZ0tleWZyYW1lVHJhY2s6VTZ0LFN1YnRyYWN0RXF1YXRpb246MTAxLFN1YnRyYWN0aXZlQmxlbmRpbmc6MyxUT1VDSDpGS3QsVGFuZ2VudFNwYWNlTm9ybWFsTWFwOjAsVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeTpwNnQsVGV0cmFoZWRyb25HZW9tZXRyeTpwNnQsVGV4dEJ1ZmZlckdlb21ldHJ5OmY2dCxUZXh0R2VvbWV0cnk6ZjZ0LFRleHR1cmU6Ykp0LFRleHR1cmVMb2FkZXI6ZTl0LFRvcnVzQnVmZmVyR2VvbWV0cnk6bTZ0LFRvcnVzR2VvbWV0cnk6bTZ0LFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5Omc2dCxUb3J1c0tub3RHZW9tZXRyeTpnNnQsVHJpYW5nbGU6RlF0LFRyaWFuZ2xlRmFuRHJhd01vZGU6MixUcmlhbmdsZVN0cmlwRHJhd01vZGU6MSxUcmlhbmdsZXNEcmF3TW9kZTowLFR1YmVCdWZmZXJHZW9tZXRyeTpfNnQsVHViZUdlb21ldHJ5Ol82dCxVVk1hcHBpbmc6VUt0LFVpbnQxNkF0dHJpYnV0ZTpmdW5jdGlvbiBiN3QodCxlKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5VaW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpLG5ldyByMXQodCxlKX0sVWludDE2QnVmZmVyQXR0cmlidXRlOnIxdCxVaW50MzJBdHRyaWJ1dGU6ZnVuY3Rpb24geDd0KHQsZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVWludDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKSxuZXcgYTF0KHQsZSl9LFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZTphMXQsVWludDhBdHRyaWJ1dGU6ZnVuY3Rpb24gdzd0KHQsZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVWludDhBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIiksbmV3IGUxdCh0LGUpfSxVaW50OEJ1ZmZlckF0dHJpYnV0ZTplMXQsVWludDhDbGFtcGVkQXR0cmlidXRlOmZ1bmN0aW9uIFM3dCh0LGUpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlVpbnQ4Q2xhbXBlZEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIiksbmV3IG4xdCh0LGUpfSxVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU6bjF0LFVuaWZvcm06bTh0LFVuaWZvcm1zTGliOmwwdCxVbmlmb3Jtc1V0aWxzOmoxdCxVbnNpZ25lZEJ5dGVUeXBlOnJadCxVbnNpZ25lZEludDI0OFR5cGU6Y1p0LFVuc2lnbmVkSW50VHlwZTphWnQsVW5zaWduZWRTaG9ydDQ0NDRUeXBlOjEwMTcsVW5zaWduZWRTaG9ydDU1NTFUeXBlOjEwMTgsVW5zaWduZWRTaG9ydDU2NVR5cGU6MTAxOSxVbnNpZ25lZFNob3J0VHlwZTpvWnQsVlNNU2hhZG93TWFwOjMsVmVjdG9yMjptSnQsVmVjdG9yMzpDSnQsVmVjdG9yNDp3SnQsVmVjdG9yS2V5ZnJhbWVUcmFjazpqNnQsVmVydGV4OmZ1bmN0aW9uIE03dCh0LGUsbil7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVydGV4IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5WZWN0b3IzIGluc3RlYWQuIiksbmV3IENKdCh0LGUsbil9LFZlcnRleENvbG9yczoyLFZpZGVvVGV4dHVyZTpaM3QsV2ViR0wxUmVuZGVyZXI6VzV0LFdlYkdMQ3ViZVJlbmRlclRhcmdldDpLMXQsV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHM6TUp0LFdlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQ6RUp0LFdlYkdMUmVuZGVyVGFyZ2V0OlNKdCxXZWJHTFJlbmRlclRhcmdldEN1YmU6ZnVuY3Rpb24gRTd0KHQsZSxuKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldEN1YmUoIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKSBpcyBub3cgV2ViR0xDdWJlUmVuZGVyVGFyZ2V0KCBzaXplLCBvcHRpb25zICkuIiksbmV3IEsxdCh0LG4pfSxXZWJHTFJlbmRlcmVyOkc1dCxXZWJHTFV0aWxzOkQ1dCxXaXJlZnJhbWVHZW9tZXRyeTp5NnQsV2lyZWZyYW1lSGVscGVyOmZ1bmN0aW9uIFQ3dCh0LGUpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldpcmVmcmFtZUhlbHBlciBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuV2lyZWZyYW1lR2VvbWV0cnkgaW5zdGVhZC4iKSxuZXcgVTN0KG5ldyB5NnQodC5nZW9tZXRyeSksbmV3IEkzdCh7Y29sb3I6dm9pZCAwIT09ZT9lOjE2Nzc3MjE1fSkpfSxXcmFwQXJvdW5kRW5kaW5nOmtadCxYSFJMb2FkZXI6ZnVuY3Rpb24gQzd0KHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlhIUkxvYWRlciBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkZpbGVMb2FkZXIuIiksbmV3IFo2dCh0KX0sWmVyb0N1cnZhdHVyZUVuZGluZzpDWnQsWmVyb0ZhY3RvcjoyMDAsWmVyb1Nsb3BlRW5kaW5nOkFadCxaZXJvU3RlbmNpbE9wOjAsc1JHQkVuY29kaW5nOkladH0pO2NvbnN0IEE3dD17dHlwZToiY2hhbmdlIn0sazd0PXt0eXBlOiJzdGFydCJ9LEw3dD17dHlwZToiZW5kIn07Y2xhc3MgUDd0IGV4dGVuZHMgalp0e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoKSx2b2lkIDA9PT1lJiZjb25zb2xlLndhcm4oJ1RIUkVFLk9yYml0Q29udHJvbHM6IFRoZSBzZWNvbmQgcGFyYW1ldGVyICJkb21FbGVtZW50IiBpcyBub3cgbWFuZGF0b3J5LicpLGU9PT1kb2N1bWVudCYmY29uc29sZS5lcnJvcignVEhSRUUuT3JiaXRDb250cm9sczogImRvY3VtZW50IiBzaG91bGQgbm90IGJlIHVzZWQgYXMgdGhlIHRhcmdldCAiZG9tRWxlbWVudCIuIFBsZWFzZSB1c2UgInJlbmRlcmVyLmRvbUVsZW1lbnQiIGluc3RlYWQuJyksdGhpcy5vYmplY3Q9dCx0aGlzLmRvbUVsZW1lbnQ9ZSx0aGlzLmRvbUVsZW1lbnQuc3R5bGUudG91Y2hBY3Rpb249Im5vbmUiLHRoaXMuZW5hYmxlZD0hMCx0aGlzLnRhcmdldD1uZXcgQ0p0LHRoaXMubWluRGlzdGFuY2U9MCx0aGlzLm1heERpc3RhbmNlPTEvMCx0aGlzLm1pblpvb209MCx0aGlzLm1heFpvb209MS8wLHRoaXMubWluUG9sYXJBbmdsZT0wLHRoaXMubWF4UG9sYXJBbmdsZT1NYXRoLlBJLHRoaXMubWluQXppbXV0aEFuZ2xlPS0xLzAsdGhpcy5tYXhBemltdXRoQW5nbGU9MS8wLHRoaXMuZW5hYmxlRGFtcGluZz0hMSx0aGlzLmRhbXBpbmdGYWN0b3I9LjA1LHRoaXMuZW5hYmxlWm9vbT0hMCx0aGlzLnpvb21TcGVlZD0xLHRoaXMuZW5hYmxlUm90YXRlPSEwLHRoaXMucm90YXRlU3BlZWQ9MSx0aGlzLmVuYWJsZVBhbj0hMCx0aGlzLnBhblNwZWVkPTEsdGhpcy5zY3JlZW5TcGFjZVBhbm5pbmc9ITAsdGhpcy5rZXlQYW5TcGVlZD03LHRoaXMuYXV0b1JvdGF0ZT0hMSx0aGlzLmF1dG9Sb3RhdGVTcGVlZD0yLHRoaXMua2V5cz17TEVGVDoiQXJyb3dMZWZ0IixVUDoiQXJyb3dVcCIsUklHSFQ6IkFycm93UmlnaHQiLEJPVFRPTToiQXJyb3dEb3duIn0sdGhpcy5tb3VzZUJ1dHRvbnM9e0xFRlQ6SEt0LlJPVEFURSxNSURETEU6SEt0LkRPTExZLFJJR0hUOkhLdC5QQU59LHRoaXMudG91Y2hlcz17T05FOkZLdC5ST1RBVEUsVFdPOkZLdC5ET0xMWV9QQU59LHRoaXMudGFyZ2V0MD10aGlzLnRhcmdldC5jbG9uZSgpLHRoaXMucG9zaXRpb24wPXRoaXMub2JqZWN0LnBvc2l0aW9uLmNsb25lKCksdGhpcy56b29tMD10aGlzLm9iamVjdC56b29tLHRoaXMuX2RvbUVsZW1lbnRLZXlFdmVudHM9bnVsbCx0aGlzLmdldFBvbGFyQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5waGl9LHRoaXMuZ2V0QXppbXV0aGFsQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gYS50aGV0YX0sdGhpcy5nZXREaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9iamVjdC5wb3NpdGlvbi5kaXN0YW5jZVRvKHRoaXMudGFyZ2V0KX0sdGhpcy5saXN0ZW5Ub0tleUV2ZW50cz1mdW5jdGlvbih0KXt0LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGopLHRoaXMuX2RvbUVsZW1lbnRLZXlFdmVudHM9dH0sdGhpcy5zYXZlU3RhdGU9ZnVuY3Rpb24oKXtuLnRhcmdldDAuY29weShuLnRhcmdldCksbi5wb3NpdGlvbjAuY29weShuLm9iamVjdC5wb3NpdGlvbiksbi56b29tMD1uLm9iamVjdC56b29tfSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7bi50YXJnZXQuY29weShuLnRhcmdldDApLG4ub2JqZWN0LnBvc2l0aW9uLmNvcHkobi5wb3NpdGlvbjApLG4ub2JqZWN0Lnpvb209bi56b29tMCxuLm9iamVjdC51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCksbi5kaXNwYXRjaEV2ZW50KEE3dCksbi51cGRhdGUoKSxyPWkuTk9ORX0sdGhpcy51cGRhdGU9KGZ1bmN0aW9uKCl7Y29uc3QgZT1uZXcgQ0p0LGg9KG5ldyBUSnQpLnNldEZyb21Vbml0VmVjdG9ycyh0LnVwLG5ldyBDSnQoMCwxLDApKSxkPWguY2xvbmUoKS5pbnZlcnQoKSxwPW5ldyBDSnQsZj1uZXcgVEp0LG09MipNYXRoLlBJO3JldHVybiBmdW5jdGlvbiB0KCl7Y29uc3QgZz1uLm9iamVjdC5wb3NpdGlvbjtlLmNvcHkoZykuc3ViKG4udGFyZ2V0KSxlLmFwcGx5UXVhdGVybmlvbihoKSxhLnNldEZyb21WZWN0b3IzKGUpLG4uYXV0b1JvdGF0ZSYmcj09PWkuTk9ORSYmUygoZnVuY3Rpb24gXygpe3JldHVybiAyKk1hdGguUEkvNjAvNjAqbi5hdXRvUm90YXRlU3BlZWR9KSgpKSxuLmVuYWJsZURhbXBpbmc/KGEudGhldGErPXMudGhldGEqbi5kYW1waW5nRmFjdG9yLGEucGhpKz1zLnBoaSpuLmRhbXBpbmdGYWN0b3IpOihhLnRoZXRhKz1zLnRoZXRhLGEucGhpKz1zLnBoaSk7bGV0IHk9bi5taW5BemltdXRoQW5nbGUsdj1uLm1heEF6aW11dGhBbmdsZTtyZXR1cm4gaXNGaW5pdGUoeSkmJmlzRmluaXRlKHYpJiYoeTwtTWF0aC5QST95Kz1tOnk+TWF0aC5QSSYmKHktPW0pLHY8LU1hdGguUEk/dis9bTp2Pk1hdGguUEkmJih2LT1tKSxhLnRoZXRhPXk8PXY/TWF0aC5tYXgoeSxNYXRoLm1pbih2LGEudGhldGEpKTphLnRoZXRhPih5K3YpLzI/TWF0aC5tYXgoeSxhLnRoZXRhKTpNYXRoLm1pbih2LGEudGhldGEpKSxhLnBoaT1NYXRoLm1heChuLm1pblBvbGFyQW5nbGUsTWF0aC5taW4obi5tYXhQb2xhckFuZ2xlLGEucGhpKSksYS5tYWtlU2FmZSgpLGEucmFkaXVzKj1sLGEucmFkaXVzPU1hdGgubWF4KG4ubWluRGlzdGFuY2UsTWF0aC5taW4obi5tYXhEaXN0YW5jZSxhLnJhZGl1cykpLCEwPT09bi5lbmFibGVEYW1waW5nP24udGFyZ2V0LmFkZFNjYWxlZFZlY3RvcihjLG4uZGFtcGluZ0ZhY3Rvcik6bi50YXJnZXQuYWRkKGMpLGUuc2V0RnJvbVNwaGVyaWNhbChhKSxlLmFwcGx5UXVhdGVybmlvbihkKSxnLmNvcHkobi50YXJnZXQpLmFkZChlKSxuLm9iamVjdC5sb29rQXQobi50YXJnZXQpLCEwPT09bi5lbmFibGVEYW1waW5nPyhzLnRoZXRhKj0xLW4uZGFtcGluZ0ZhY3RvcixzLnBoaSo9MS1uLmRhbXBpbmdGYWN0b3IsYy5tdWx0aXBseVNjYWxhcigxLW4uZGFtcGluZ0ZhY3RvcikpOihzLnNldCgwLDAsMCksYy5zZXQoMCwwLDApKSxsPTEsISEodXx8cC5kaXN0YW5jZVRvU3F1YXJlZChuLm9iamVjdC5wb3NpdGlvbik+b3x8OCooMS1mLmRvdChuLm9iamVjdC5xdWF0ZXJuaW9uKSk+bykmJihuLmRpc3BhdGNoRXZlbnQoQTd0KSxwLmNvcHkobi5vYmplY3QucG9zaXRpb24pLGYuY29weShuLm9iamVjdC5xdWF0ZXJuaW9uKSx1PSExLCEwKX19KSgpLHRoaXMuZGlzcG9zZT1mdW5jdGlvbigpe24uZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsRyksbi5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIixCKSxuLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcmNhbmNlbCIsViksbi5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIndoZWVsIixVKSxuLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLEgpLG4uZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLEYpLG51bGwhPT1uLl9kb21FbGVtZW50S2V5RXZlbnRzJiZuLl9kb21FbGVtZW50S2V5RXZlbnRzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLGopfTtjb25zdCBuPXRoaXMsaT17Tk9ORTotMSxST1RBVEU6MCxET0xMWToxLFBBTjoyLFRPVUNIX1JPVEFURTozLFRPVUNIX1BBTjo0LFRPVUNIX0RPTExZX1BBTjo1LFRPVUNIX0RPTExZX1JPVEFURTo2fTtsZXQgcj1pLk5PTkU7Y29uc3Qgbz0xZS02LGE9bmV3IGI4dCxzPW5ldyBiOHQ7bGV0IGw9MTtjb25zdCBjPW5ldyBDSnQ7bGV0IHU9ITE7Y29uc3QgaD1uZXcgbUp0LGQ9bmV3IG1KdCxwPW5ldyBtSnQsZj1uZXcgbUp0LG09bmV3IG1KdCxnPW5ldyBtSnQsXz1uZXcgbUp0LHk9bmV3IG1KdCx2PW5ldyBtSnQsYj1bXSx4PXt9O2Z1bmN0aW9uIHcoKXtyZXR1cm4gTWF0aC5wb3coLjk1LG4uem9vbVNwZWVkKX1mdW5jdGlvbiBTKHQpe3MudGhldGEtPXR9ZnVuY3Rpb24gTSh0KXtzLnBoaS09dH1jb25zdCBFPShmdW5jdGlvbigpe2NvbnN0IHQ9bmV3IENKdDtyZXR1cm4gZnVuY3Rpb24gZShuLGkpe3Quc2V0RnJvbU1hdHJpeENvbHVtbihpLDApLHQubXVsdGlwbHlTY2FsYXIoLW4pLGMuYWRkKHQpfX0pKCksVD0oZnVuY3Rpb24oKXtjb25zdCB0PW5ldyBDSnQ7cmV0dXJuIGZ1bmN0aW9uIGUoaSxyKXshMD09PW4uc2NyZWVuU3BhY2VQYW5uaW5nP3Quc2V0RnJvbU1hdHJpeENvbHVtbihyLDEpOih0LnNldEZyb21NYXRyaXhDb2x1bW4ociwwKSx0LmNyb3NzVmVjdG9ycyhuLm9iamVjdC51cCx0KSksdC5tdWx0aXBseVNjYWxhcihpKSxjLmFkZCh0KX19KSgpLEM9KGZ1bmN0aW9uKCl7Y29uc3QgdD1uZXcgQ0p0O3JldHVybiBmdW5jdGlvbiBlKGkscil7Y29uc3Qgbz1uLmRvbUVsZW1lbnQ7aWYobi5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYSl7dC5jb3B5KG4ub2JqZWN0LnBvc2l0aW9uKS5zdWIobi50YXJnZXQpO2xldCBlPXQubGVuZ3RoKCk7ZSo9TWF0aC50YW4obi5vYmplY3QuZm92LzIqTWF0aC5QSS8xODApLEUoMippKmUvby5jbGllbnRIZWlnaHQsbi5vYmplY3QubWF0cml4KSxUKDIqciplL28uY2xpZW50SGVpZ2h0LG4ub2JqZWN0Lm1hdHJpeCl9ZWxzZSBuLm9iamVjdC5pc09ydGhvZ3JhcGhpY0NhbWVyYT8oRShpKihuLm9iamVjdC5yaWdodC1uLm9iamVjdC5sZWZ0KS9uLm9iamVjdC56b29tL28uY2xpZW50V2lkdGgsbi5vYmplY3QubWF0cml4KSxUKHIqKG4ub2JqZWN0LnRvcC1uLm9iamVjdC5ib3R0b20pL24ub2JqZWN0Lnpvb20vby5jbGllbnRIZWlnaHQsbi5vYmplY3QubWF0cml4KSk6KGNvbnNvbGUud2FybigiV0FSTklORzogT3JiaXRDb250cm9scy5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gcGFuIGRpc2FibGVkLiIpLG4uZW5hYmxlUGFuPSExKX19KSgpO2Z1bmN0aW9uIEEodCl7bi5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYT9sLz10Om4ub2JqZWN0LmlzT3J0aG9ncmFwaGljQ2FtZXJhPyhuLm9iamVjdC56b29tPU1hdGgubWF4KG4ubWluWm9vbSxNYXRoLm1pbihuLm1heFpvb20sbi5vYmplY3Quem9vbSp0KSksbi5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpLHU9ITApOihjb25zb2xlLndhcm4oIldBUk5JTkc6IE9yYml0Q29udHJvbHMuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93biBjYW1lcmEgdHlwZSAtIGRvbGx5L3pvb20gZGlzYWJsZWQuIiksbi5lbmFibGVab29tPSExKX1mdW5jdGlvbiBrKHQpe24ub2JqZWN0LmlzUGVyc3BlY3RpdmVDYW1lcmE/bCo9dDpuLm9iamVjdC5pc09ydGhvZ3JhcGhpY0NhbWVyYT8obi5vYmplY3Quem9vbT1NYXRoLm1heChuLm1pblpvb20sTWF0aC5taW4obi5tYXhab29tLG4ub2JqZWN0Lnpvb20vdCkpLG4ub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSx1PSEwKTooY29uc29sZS53YXJuKCJXQVJOSU5HOiBPcmJpdENvbnRyb2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBkb2xseS96b29tIGRpc2FibGVkLiIpLG4uZW5hYmxlWm9vbT0hMSl9ZnVuY3Rpb24gTCh0KXtoLnNldCh0LmNsaWVudFgsdC5jbGllbnRZKX1mdW5jdGlvbiBQKHQpe2Yuc2V0KHQuY2xpZW50WCx0LmNsaWVudFkpfWZ1bmN0aW9uIE4oKXsxPT09Yi5sZW5ndGg/aC5zZXQoYlswXS5wYWdlWCxiWzBdLnBhZ2VZKTpoLnNldCguNSooYlswXS5wYWdlWCtiWzFdLnBhZ2VYKSwuNSooYlswXS5wYWdlWStiWzFdLnBhZ2VZKSl9ZnVuY3Rpb24gSSgpezE9PT1iLmxlbmd0aD9mLnNldChiWzBdLnBhZ2VYLGJbMF0ucGFnZVkpOmYuc2V0KC41KihiWzBdLnBhZ2VYK2JbMV0ucGFnZVgpLC41KihiWzBdLnBhZ2VZK2JbMV0ucGFnZVkpKX1mdW5jdGlvbiBSKCl7Y29uc3QgdD1iWzBdLnBhZ2VYLWJbMV0ucGFnZVgsZT1iWzBdLnBhZ2VZLWJbMV0ucGFnZVksbj1NYXRoLnNxcnQodCp0K2UqZSk7Xy5zZXQoMCxuKX1mdW5jdGlvbiBPKHQpe2lmKDE9PWIubGVuZ3RoKWQuc2V0KHQucGFnZVgsdC5wYWdlWSk7ZWxzZXtjb25zdCBlPVkodCk7ZC5zZXQoLjUqKHQucGFnZVgrZS54KSwuNSoodC5wYWdlWStlLnkpKX1wLnN1YlZlY3RvcnMoZCxoKS5tdWx0aXBseVNjYWxhcihuLnJvdGF0ZVNwZWVkKTtjb25zdCBlPW4uZG9tRWxlbWVudDtTKDIqTWF0aC5QSSpwLngvZS5jbGllbnRIZWlnaHQpLE0oMipNYXRoLlBJKnAueS9lLmNsaWVudEhlaWdodCksaC5jb3B5KGQpfWZ1bmN0aW9uIHoodCl7aWYoMT09PWIubGVuZ3RoKW0uc2V0KHQucGFnZVgsdC5wYWdlWSk7ZWxzZXtjb25zdCBlPVkodCk7bS5zZXQoLjUqKHQucGFnZVgrZS54KSwuNSoodC5wYWdlWStlLnkpKX1nLnN1YlZlY3RvcnMobSxmKS5tdWx0aXBseVNjYWxhcihuLnBhblNwZWVkKSxDKGcueCxnLnkpLGYuY29weShtKX1mdW5jdGlvbiBEKHQpe2NvbnN0IGU9WSh0KSxpPXQucGFnZVgtZS54LHI9dC5wYWdlWS1lLnksbz1NYXRoLnNxcnQoaSppK3Iqcik7eS5zZXQoMCxvKSx2LnNldCgwLE1hdGgucG93KHkueS9fLnksbi56b29tU3BlZWQpKSxBKHYueSksXy5jb3B5KHkpfWZ1bmN0aW9uIEIodCl7ITEhPT1uLmVuYWJsZWQmJigwPT09Yi5sZW5ndGgmJihuLmRvbUVsZW1lbnQuc2V0UG9pbnRlckNhcHR1cmUodC5wb2ludGVySWQpLG4uZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsSCksbi5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsRikpLChmdW5jdGlvbiBlKHQpe2IucHVzaCh0KX0pKHQpLCJ0b3VjaCI9PT10LnBvaW50ZXJUeXBlPyhmdW5jdGlvbiBvKHQpe3N3aXRjaChxKHQpLGIubGVuZ3RoKXtjYXNlIDE6c3dpdGNoKG4udG91Y2hlcy5PTkUpe2Nhc2UgRkt0LlJPVEFURTppZighMT09PW4uZW5hYmxlUm90YXRlKXJldHVybjtOKCkscj1pLlRPVUNIX1JPVEFURTticmVhaztjYXNlIEZLdC5QQU46aWYoITE9PT1uLmVuYWJsZVBhbilyZXR1cm47SSgpLHI9aS5UT1VDSF9QQU47YnJlYWs7ZGVmYXVsdDpyPWkuTk9ORX1icmVhaztjYXNlIDI6c3dpdGNoKG4udG91Y2hlcy5UV08pe2Nhc2UgRkt0LkRPTExZX1BBTjppZighMT09PW4uZW5hYmxlWm9vbSYmITE9PT1uLmVuYWJsZVBhbilyZXR1cm47IShmdW5jdGlvbiB0KCl7bi5lbmFibGVab29tJiZSKCksbi5lbmFibGVQYW4mJkkoKX0pKCkscj1pLlRPVUNIX0RPTExZX1BBTjticmVhaztjYXNlIEZLdC5ET0xMWV9ST1RBVEU6aWYoITE9PT1uLmVuYWJsZVpvb20mJiExPT09bi5lbmFibGVSb3RhdGUpcmV0dXJuOyEoZnVuY3Rpb24gZSgpe24uZW5hYmxlWm9vbSYmUigpLG4uZW5hYmxlUm90YXRlJiZOKCl9KSgpLHI9aS5UT1VDSF9ET0xMWV9ST1RBVEU7YnJlYWs7ZGVmYXVsdDpyPWkuTk9ORX1icmVhaztkZWZhdWx0OnI9aS5OT05FfXIhPT1pLk5PTkUmJm4uZGlzcGF0Y2hFdmVudChrN3QpfSkodCk6KGZ1bmN0aW9uIGEodCl7bGV0IGU7c3dpdGNoKHQuYnV0dG9uKXtjYXNlIDA6ZT1uLm1vdXNlQnV0dG9ucy5MRUZUO2JyZWFrO2Nhc2UgMTplPW4ubW91c2VCdXR0b25zLk1JRERMRTticmVhaztjYXNlIDI6ZT1uLm1vdXNlQnV0dG9ucy5SSUdIVDticmVhaztkZWZhdWx0OmU9LTF9c3dpdGNoKGUpe2Nhc2UgSEt0LkRPTExZOmlmKCExPT09bi5lbmFibGVab29tKXJldHVybjshKGZ1bmN0aW9uIGUodCl7Xy5zZXQodC5jbGllbnRYLHQuY2xpZW50WSl9KSh0KSxyPWkuRE9MTFk7YnJlYWs7Y2FzZSBIS3QuUk9UQVRFOmlmKHQuY3RybEtleXx8dC5tZXRhS2V5fHx0LnNoaWZ0S2V5KXtpZighMT09PW4uZW5hYmxlUGFuKXJldHVybjtQKHQpLHI9aS5QQU59ZWxzZXtpZighMT09PW4uZW5hYmxlUm90YXRlKXJldHVybjtMKHQpLHI9aS5ST1RBVEV9YnJlYWs7Y2FzZSBIS3QuUEFOOmlmKHQuY3RybEtleXx8dC5tZXRhS2V5fHx0LnNoaWZ0S2V5KXtpZighMT09PW4uZW5hYmxlUm90YXRlKXJldHVybjtMKHQpLHI9aS5ST1RBVEV9ZWxzZXtpZighMT09PW4uZW5hYmxlUGFuKXJldHVybjtQKHQpLHI9aS5QQU59YnJlYWs7ZGVmYXVsdDpyPWkuTk9ORX1yIT09aS5OT05FJiZuLmRpc3BhdGNoRXZlbnQoazd0KX0pKHQpKX1mdW5jdGlvbiBIKHQpeyExIT09bi5lbmFibGVkJiYoInRvdWNoIj09PXQucG9pbnRlclR5cGU/KGZ1bmN0aW9uIGUodCl7c3dpdGNoKHEodCkscil7Y2FzZSBpLlRPVUNIX1JPVEFURTppZighMT09PW4uZW5hYmxlUm90YXRlKXJldHVybjtPKHQpLG4udXBkYXRlKCk7YnJlYWs7Y2FzZSBpLlRPVUNIX1BBTjppZighMT09PW4uZW5hYmxlUGFuKXJldHVybjt6KHQpLG4udXBkYXRlKCk7YnJlYWs7Y2FzZSBpLlRPVUNIX0RPTExZX1BBTjppZighMT09PW4uZW5hYmxlWm9vbSYmITE9PT1uLmVuYWJsZVBhbilyZXR1cm47IShmdW5jdGlvbiBlKHQpe24uZW5hYmxlWm9vbSYmRCh0KSxuLmVuYWJsZVBhbiYmeih0KX0pKHQpLG4udXBkYXRlKCk7YnJlYWs7Y2FzZSBpLlRPVUNIX0RPTExZX1JPVEFURTppZighMT09PW4uZW5hYmxlWm9vbSYmITE9PT1uLmVuYWJsZVJvdGF0ZSlyZXR1cm47IShmdW5jdGlvbiBvKHQpe24uZW5hYmxlWm9vbSYmRCh0KSxuLmVuYWJsZVJvdGF0ZSYmTyh0KX0pKHQpLG4udXBkYXRlKCk7YnJlYWs7ZGVmYXVsdDpyPWkuTk9ORX19KSh0KTooZnVuY3Rpb24gbyh0KXtpZighMSE9PW4uZW5hYmxlZClzd2l0Y2gocil7Y2FzZSBpLlJPVEFURTppZighMT09PW4uZW5hYmxlUm90YXRlKXJldHVybjshKGZ1bmN0aW9uIGUodCl7ZC5zZXQodC5jbGllbnRYLHQuY2xpZW50WSkscC5zdWJWZWN0b3JzKGQsaCkubXVsdGlwbHlTY2FsYXIobi5yb3RhdGVTcGVlZCk7Y29uc3QgZT1uLmRvbUVsZW1lbnQ7UygyKk1hdGguUEkqcC54L2UuY2xpZW50SGVpZ2h0KSxNKDIqTWF0aC5QSSpwLnkvZS5jbGllbnRIZWlnaHQpLGguY29weShkKSxuLnVwZGF0ZSgpfSkodCk7YnJlYWs7Y2FzZSBpLkRPTExZOmlmKCExPT09bi5lbmFibGVab29tKXJldHVybjshKGZ1bmN0aW9uIHIodCl7eS5zZXQodC5jbGllbnRYLHQuY2xpZW50WSksdi5zdWJWZWN0b3JzKHksXyksdi55PjA/QSh3KCkpOnYueTwwJiZrKHcoKSksXy5jb3B5KHkpLG4udXBkYXRlKCl9KSh0KTticmVhaztjYXNlIGkuUEFOOmlmKCExPT09bi5lbmFibGVQYW4pcmV0dXJuOyEoZnVuY3Rpb24gbyh0KXttLnNldCh0LmNsaWVudFgsdC5jbGllbnRZKSxnLnN1YlZlY3RvcnMobSxmKS5tdWx0aXBseVNjYWxhcihuLnBhblNwZWVkKSxDKGcueCxnLnkpLGYuY29weShtKSxuLnVwZGF0ZSgpfSkodCl9fSkodCkpfWZ1bmN0aW9uIEYodCl7ITEhPT1uLmVuYWJsZWQmJigidG91Y2giPT09dC5wb2ludGVyVHlwZT8oZnVuY3Rpb24gZSh0KXtuLmRpc3BhdGNoRXZlbnQoTDd0KSxyPWkuTk9ORX0pKCk6KGZ1bmN0aW9uIG8odCl7bi5kaXNwYXRjaEV2ZW50KEw3dCkscj1pLk5PTkV9KSgpLFcodCksMD09PWIubGVuZ3RoJiYobi5kb21FbGVtZW50LnJlbGVhc2VQb2ludGVyQ2FwdHVyZSh0LnBvaW50ZXJJZCksbi5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIixIKSxuLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIixGKSkpfWZ1bmN0aW9uIFYodCl7Vyh0KX1mdW5jdGlvbiBVKHQpeyExPT09bi5lbmFibGVkfHwhMT09PW4uZW5hYmxlWm9vbXx8ciE9PWkuTk9ORSYmciE9PWkuUk9UQVRFfHwodC5wcmV2ZW50RGVmYXVsdCgpLG4uZGlzcGF0Y2hFdmVudChrN3QpLChmdW5jdGlvbiBlKHQpe3QuZGVsdGFZPDA/ayh3KCkpOnQuZGVsdGFZPjAmJkEodygpKSxuLnVwZGF0ZSgpfSkodCksbi5kaXNwYXRjaEV2ZW50KEw3dCkpfWZ1bmN0aW9uIGoodCl7ITEhPT1uLmVuYWJsZWQmJiExIT09bi5lbmFibGVQYW4mJihmdW5jdGlvbiBlKHQpe2xldCBlPSExO3N3aXRjaCh0LmNvZGUpe2Nhc2Ugbi5rZXlzLlVQOkMoMCxuLmtleVBhblNwZWVkKSxlPSEwO2JyZWFrO2Nhc2Ugbi5rZXlzLkJPVFRPTTpDKDAsLW4ua2V5UGFuU3BlZWQpLGU9ITA7YnJlYWs7Y2FzZSBuLmtleXMuTEVGVDpDKG4ua2V5UGFuU3BlZWQsMCksZT0hMDticmVhaztjYXNlIG4ua2V5cy5SSUdIVDpDKC1uLmtleVBhblNwZWVkLDApLGU9ITB9ZSYmKHQucHJldmVudERlZmF1bHQoKSxuLnVwZGF0ZSgpKX0pKHQpfWZ1bmN0aW9uIEcodCl7ITEhPT1uLmVuYWJsZWQmJnQucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBXKHQpe2RlbGV0ZSB4W3QucG9pbnRlcklkXTtmb3IobGV0IGU9MDtlPGIubGVuZ3RoO2UrKylpZihiW2VdLnBvaW50ZXJJZD09dC5wb2ludGVySWQpcmV0dXJuIHZvaWQgYi5zcGxpY2UoZSwxKX1mdW5jdGlvbiBxKHQpe2xldCBlPXhbdC5wb2ludGVySWRdO3ZvaWQgMD09PWUmJihlPW5ldyBtSnQseFt0LnBvaW50ZXJJZF09ZSksZS5zZXQodC5wYWdlWCx0LnBhZ2VZKX1mdW5jdGlvbiBZKHQpe3JldHVybiB4Wyh0LnBvaW50ZXJJZD09PWJbMF0ucG9pbnRlcklkP2JbMV06YlswXSkucG9pbnRlcklkXX1uLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLEcpLG4uZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsQiksbi5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJjYW5jZWwiLFYpLG4uZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsVSx7cGFzc2l2ZTohMX0pLHRoaXMudXBkYXRlKCl9fWNsYXNzIE43dCBleHRlbmRzIGpadHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuX2xhc3RNZXNoPW51bGwsdGhpcy5fY2xvY2s9bmV3IGo5dCx0aGlzLl9jYW52YXNTaXplPW51bGwsdGhpcy5fbGF5ZXJzQ29uZmlnPW51bGwsdGhpcy5fcnVuQ29sb3I9dH1faXNPYmplY3QodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT10JiYhQXJyYXkuaXNBcnJheSh0KX1fYXBwbHlEZWZhdWx0cyh0LGUpe2xldCBuPXt9O2NvbnN0IGk9W3QsZV07Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0Kyspe2NvbnN0IGU9aVt0XTtmb3IobGV0IHQgaW4gZSl7Y29uc3QgaT10IGluIG47dGhpcy5faXNPYmplY3QoZVt0XSk/blt0XT10aGlzLl9hcHBseURlZmF1bHRzKG5bdF18fHt9LGVbdF0pOml8fChuW3RdPWVbdF0pfX1yZXR1cm4gbn1fY3JlYXRlTGF5ZXJzKCl7aWYodGhpcy5fbGF5ZXJzQ29uZmlnJiZ0aGlzLl9zY2VuZSYmdGhpcy5fbGFzdE1lc2gpe2lmKHRoaXMuX2xheWVyc0NvbmZpZy5zaG93Qm91bmRpbmdCb3gpe3ZhciB0PW5ldyBHOHQodGhpcy5fbGFzdE1lc2gsbmV3ICRRdCgicmdiKDAsIDAsIDI1NSkiKSk7dGhpcy5fc2NlbmUuYWRkKHQpfWlmKHRoaXMuX2xheWVyc0NvbmZpZy5zaG93QXhlcyl7dmFyIGU9bmV3IFg4dCg1KTt0aGlzLl9zY2VuZS5hZGQoZSl9fX1zZXRMYXllcnNDb25maWcodCl7dGhpcy5fbGF5ZXJzQ29uZmlnPXRoaXMuX2FwcGx5RGVmYXVsdHModCx0aGlzLl9sYXllcnNDb25maWd8fHt9KX1fY3JlYXRlV29ybGQodCxlKXtpZih0aGlzLmlzUmVhZHkoKSlyZXR1cm47dGhpcy5fc2NlbmU9bmV3IFg1dDt2YXIgbj1uZXcgSjh0W3QuY2FtZXJhLmNsc10odC5jYW1lcmEuZm92LHRoaXMuX2NhbnZhc1NpemUud2lkdGgvdGhpcy5fY2FudmFzU2l6ZS5oZWlnaHQsdC5jYW1lcmEubmVhcix0LmNhbWVyYS5mYXIpO3RoaXMuX2NhbWVyYT1uO3ZhciBpPW5ldyBQN3QobixlKTtjb25zdCByPWk7ci5sb29rU3BlZWQ9LjQsci5tb3ZlbWVudFNwZWVkPTIwLHIubm9GbHk9ITAsci5sb29rVmVydGljYWw9ITAsci5jb25zdHJhaW5WZXJ0aWNhbD0hMCxyLnZlcnRpY2FsTWluPTEsci52ZXJ0aWNhbE1heD0yLHIuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLl9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlLmJpbmQodGhpcykpLHRoaXMuX2NhbWVyYUNvbnRyb2xzPWksdGhpcy5fcmVuZGVyZXI9bmV3IEc1dCh7YW50aWFsaWFzOiEwfSksdGhpcy5fcmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyksdGhpcy5fcmVuZGVyZXIuc2V0U2l6ZSh0aGlzLl9jYW52YXNTaXplLndpZHRoLHRoaXMuX2NhbnZhc1NpemUuaGVpZ2h0KSx0aGlzLl9yZW5kZXJlci5zZXRDbGVhckNvbG9yKDE2Nzc3MjE1LDEpfV9jbGVhclNjZW5lKCl7Zm9yKDt0aGlzLl9zY2VuZS5jaGlsZHJlbi5sZW5ndGg+MDspdGhpcy5fc2NlbmUucmVtb3ZlKHRoaXMuX3NjZW5lLmNoaWxkcmVuWzBdKX1nZXRSZW5kZXJlcigpe3JldHVybiB0aGlzLl9yZW5kZXJlcn1nZXRDYW1lcmFDb250cm9scygpe3JldHVybiB0aGlzLl9jYW1lcmFDb250cm9sc31pc1JlYWR5KCl7cmV0dXJuISF0aGlzLl9jYW1lcmEmJiEhdGhpcy5fY2FtZXJhQ29udHJvbHN9Z2V0Q2FtZXJhUG9zaXRpb24oKXtyZXR1cm57ZmFyOnRoaXMuX2NhbWVyYS5mYXIscG9zaXRpb246dGhpcy5fY2FtZXJhLnBvc2l0aW9uLmNsb25lKCksdGFyZ2V0OnRoaXMuX2NhbWVyYUNvbnRyb2xzLnRhcmdldC5jbG9uZSgpfX1zZXRDYW52YXNTaXplKHQpe3RoaXMuX2NhbnZhc1NpemU9dH1kcmF3KCl7dGhpcy5fYW5pbWF0aW9uRnJhbWVJbmRleCYmY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fYW5pbWF0aW9uRnJhbWVJbmRleCksdGhpcy5fY2FtZXJhLmFzcGVjdD10aGlzLl9jYW52YXNTaXplLndpZHRoL3RoaXMuX2NhbnZhc1NpemUuaGVpZ2h0LHRoaXMuX2NhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCksdGhpcy5fcmVuZGVyZXIuc2V0U2l6ZSh0aGlzLl9jYW52YXNTaXplLndpZHRoLHRoaXMuX2NhbnZhc1NpemUuaGVpZ2h0KTtjb25zdCB0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fY2xvY2suZ2V0RGVsdGEoKTt0aGlzLl9jYW1lcmFDb250cm9scy51cGRhdGUoZSksdGhpcy5fYW5pbWF0aW9uRnJhbWVJbmRleD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodCksdGhpcy5fcmVuZGVyZXIucmVuZGVyKHRoaXMuX3NjZW5lLHRoaXMuX2NhbWVyYSl9LmJpbmQodGhpcyk7dCgpfXVwZGF0ZVNjZW5lKHQsZSl7bGV0IG49e307ImNvbmZpZyJpbiB0JiZ0LmNvbmZpZyYmKG49SlNPTi5wYXJzZSh0LmNvbmZpZykpLHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiYmVmb3JlVXBkYXRlU2NlbmUifSksbj10aGlzLl9hcHBseURlZmF1bHRzKG4se2NhbWVyYTp7Y2xzOiJQZXJzcGVjdGl2ZUNhbWVyYSIsZm92Ojc1LG5lYXI6LjEsZmFyOjFlM30sbGlnaHRzOlt7Y2xzOiJBbWJpZW50TGlnaHQiLGNvbG9yOiIjZmZmZmZmIixpbnRlbnNpdHk6Ljc1fSx7Y2xzOiJEaXJlY3Rpb25hbExpZ2h0Iixjb2xvcjoiI2ZmZmZmZiIsaW50ZW5zaXR5Oi43NSxwb3NpdGlvbjpbMCwtMSwyXX1dfSksdGhpcy5fY3JlYXRlV29ybGQobixlKSx0aGlzLl9jbGVhclNjZW5lKCksdGhpcy5fY3JlYXRlTGlnaHRzKHRoaXMuX3NjZW5lLG4pLHRoaXMuX2NyZWF0ZUdlb21ldHJ5KHQsbiksdGhpcy5fY3JlYXRlTGF5ZXJzKCksdGhpcy5kcmF3KCl9cmVzZXRWaWV3KHQpe2lmKCF0aGlzLmlzUmVhZHkoKSlyZXR1cm47bGV0IGU7dGhpcy5fY2FtZXJhQ29udHJvbHMucmVzZXQoKSwhdCYmdGhpcy5fbGFzdE1lc2gmJihlPXRoaXMuX2xhc3RNZXNoKSxlJiYodGhpcy5fZml0T2JqZWN0VG9WaWV3cG9ydChlKSx0aGlzLl9sYXN0TWVzaD1lKSx0aGlzLl9jYW1lcmFDb250cm9scy51cGRhdGUoKX1fY3JlYXRlR2VvbWV0cnkodCxlKXtjb25zdCBuPXQubWVzaDtuLnZlcnRpY2VzJiZuLmZhY2VzJiZuLmZhY2VzLmxlbmd0aD90aGlzLl9jcmVhdGVNZXNoKG4sZSk6dGhpcy5fY3JlYXRlUG9pbnRDbG91ZChuLGUpfV9jcmVhdGVQb2ludENsb3VkKHQsZSl7Y29uc3Qgbj10LnZlcnRpY2VzLGk9dC5jb2xvcnM7bGV0IHI9e21hdGVyaWFsOntjbHM6IlBvaW50c01hdGVyaWFsIixzaXplOi4wMDV9fTtpJiZpLmxlbmd0aD09bi5sZW5ndGg/ci5tYXRlcmlhbC52ZXJ0ZXhDb2xvcnM9ITA6ci5tYXRlcmlhbC5jb2xvcj10aGlzLl9ydW5Db2xvcjtjb25zdCBvPXRoaXMuX2FwcGx5RGVmYXVsdHMoZSxyKSxhPW5ldyBiMXQscz1uZXcgRmxvYXQzMkFycmF5KG4uZmxhdCgpKTtpZihhLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBRUXQocywzKSksaSYmaS5sZW5ndGg9PW4ubGVuZ3RoKXtjb25zdCB0PW5ldyBGbG9hdDMyQXJyYXkoaS5mbGF0KCkpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXRbZV09dFtlXS8yNTU7YS5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgUVF0KHQsMykpfXZhciBsPW5ldyBKOHRbby5tYXRlcmlhbC5jbHNdKG8ubWF0ZXJpYWwpLGM9bmV3ICQzdChhLGwpO3RoaXMuX3NjZW5lLmFkZChjKSx0aGlzLl9sYXN0TWVzaD1jfXNldENhbWVyYVZpZXdwb2ludCh0LGUsbil7dGhpcy5fc2lsZW50PSEwLHRoaXMuX2NhbWVyYS5mYXI9ZSx0aGlzLl9jYW1lcmEucG9zaXRpb24uc2V0KHQueCx0LnksdC56KSx0aGlzLl9jYW1lcmEubG9va0F0KG4uY2xvbmUoKSksdGhpcy5fY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSx0aGlzLl9jYW1lcmFDb250cm9scy50YXJnZXQ9bi5jbG9uZSgpLHRoaXMuX2NhbWVyYUNvbnRyb2xzLnVwZGF0ZSgpLHRoaXMuX3NpbGVudD0hMX1fb25DYW1lcmFQb3NpdGlvbkNoYW5nZSh0KXt0aGlzLl9zaWxlbnR8fHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiY2FtZXJhUG9zaXRpb25DaGFuZ2UiLGV2ZW50OnR9KX1fZml0T2JqZWN0VG9WaWV3cG9ydCh0KXtjb25zdCBlPW5ldyBMSnQsbj1uZXcgQ0p0LGk9bmV3IENKdDtlLnNldEZyb21PYmplY3QodCksZS5nZXRDZW50ZXIobiksZS5nZXRTaXplKGkpO2NvbnN0IHI9TWF0aC5tYXgoaS54LGkueSxpLnopLG89dGhpcy5fY2FtZXJhLmZvdiooTWF0aC5QSS8xODApO2xldCBhPTEuMjUqTWF0aC5hYnMoci8oMipNYXRoLnRhbihvLzIpKSk7Y29uc3Qgcz1lLm1pbi56O3RoaXMuc2V0Q2FtZXJhVmlld3BvaW50KHt4Om4ueCx5Om4ueSx6OmF9LDMqKHM8MD8tcythOmEtcyksbil9X2NyZWF0ZU1lc2godCxlKXtjb25zdCBuPXQudmVydGljZXMsaT10LmZhY2VzLHI9dC5jb2xvcnMsbz10aGlzLl9hcHBseURlZmF1bHRzKGUse21hdGVyaWFsOntjbHM6Ik1lc2hTdGFuZGFyZE1hdGVyaWFsIixjb2xvcjoiI2EwYTBhMCIscm91Z2huZXNzOjEsbWV0YWxuZXNzOjB9fSksYT1uZXcgYjF0LHM9bmV3IEZsb2F0MzJBcnJheShuLmZsYXQoKSk7YS5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgUVF0KHMsMykpO2NvbnN0IGw9bmV3IFVpbnQxNkFycmF5KGkuZmxhdCgpKTtpZihyJiZyLmxlbmd0aCl7Y29uc3QgdD1yLmZsYXQoKTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdPXRbZV0vMjU1O2Euc2V0QXR0cmlidXRlKCJjb2xvciIsbmV3IFFRdChuZXcgRmxvYXQzMkFycmF5KHQpLDMpKSxvLm1hdGVyaWFsPW8ubWF0ZXJpYWx8fHt9LG8ubWF0ZXJpYWwudmVydGV4Q29sb3JzPSEwfWEuY2VudGVyKCksYS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxhLnNldEluZGV4KG5ldyBRUXQobCwxKSksYS5jb21wdXRlVmVydGV4Tm9ybWFscygpO2xldCBjPW5ldyBKOHRbby5tYXRlcmlhbC5jbHNdKG8ubWF0ZXJpYWwpLHU9bmV3IEIxdChhLGMpO3UuY2FzdFNoYWRvdz0hMCx1LnJlY2VpdmVTaGFkb3c9ITAsdGhpcy5fc2NlbmUuYWRkKHUpLHRoaXMuX2xhc3RNZXNoPXV9X2NyZWF0ZUxpZ2h0cyh0LGUpe2ZvcihsZXQgbj0wO248ZS5saWdodHMubGVuZ3RoO24rKyl7Y29uc3QgaT1lLmxpZ2h0c1tuXTtsZXQgcj1uZXcgSjh0W2kuY2xzXShpLmNvbG9yLGkuaW50ZW5zaXR5KTtpLnBvc2l0aW9uJiZyLnBvc2l0aW9uLnNldChpLnBvc2l0aW9uWzBdLGkucG9zaXRpb25bMV0saS5wb3NpdGlvblsyXSksdC5hZGQocil9fX1sZXQgSTd0PWNsYXNzIGV4dGVuZHMoZXIoeWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5zZWxlY3RlZFZpZXc9ImFsbCIsdGhpcy5hY3RpdmU9ITEsdGhpcy5fY29sb3JTY2FsZUZ1bmN0aW9uPUdSLHRoaXMuX3N0ZXBzPVtdLHRoaXMuX21lc2hWaWV3ZXJBdHRhY2hlZD0hMSx0aGlzLl9jYW1lcmFQb3NpdGlvbkluaXRpYWxpemVkPSExLHRoaXMuX2lzTWVzaExvYWRpbmc9ITF9Z2V0IF9ydW5Db2xvcigpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlRnVuY3Rpb24odGhpcy5ydW4pfWNvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLl9kYXRhUHJvdmlkZXI9bmV3IERLdCh0aGlzLnJlcXVlc3RNYW5hZ2VyKTtjb25zdCB0PW5ldyBON3QodGhpcy5fcnVuQ29sb3IpO3QuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JlVXBkYXRlU2NlbmUiLHRoaXMuX3VwZGF0ZUNhbnZhc1NpemUuYmluZCh0aGlzKSksdC5hZGRFdmVudExpc3RlbmVyKCJjYW1lcmFQb3NpdGlvbkNoYW5nZSIsdGhpcy5fb25DYW1lcmFQb3NpdGlvbkNoYW5nZS5iaW5kKHRoaXMpKSx0aGlzLl9tZXNoVmlld2VyPXR9cmVsb2FkKCl7dGhpcy5hY3RpdmUmJnRoaXMuX2RhdGFQcm92aWRlciYmKHRoaXMuX2lzTWVzaExvYWRpbmc9ITAsdGhpcy5fZGF0YVByb3ZpZGVyLnJlbG9hZCh0aGlzLnJ1bix0aGlzLnRhZyx0aGlzLnNhbXBsZSkudGhlbigodD0+e3QmJih0aGlzLl9zdGVwcz10LHRoaXMuX3N0ZXBJbmRleD10Lmxlbmd0aC0xKX0pKS5jYXRjaCgodD0+e2lmKCF0fHwhdC5jb2RlfHx0LmNvZGUhPVJLdC5DQU5DRUxMRUQpdGhyb3cgdD10fHwiUmVzcG9uc2UgcHJvY2Vzc2luZyBmYWlsZWQuIixuZXcgRXJyb3IodCl9KSkpfV91cGRhdGVTY2VuZSgpe2NvbnN0IHQ9dGhpcy5fY3VycmVudFN0ZXA7dCYmdC5tZXNoJiYodGhpcy5fbWVzaFZpZXdlci51cGRhdGVTY2VuZSh0LHRoaXMpLHRoaXMuX2NhbWVyYVBvc2l0aW9uSW5pdGlhbGl6ZWR8fCh0aGlzLl9tZXNoVmlld2VyLnJlc2V0VmlldygpLHRoaXMuX2NhbWVyYVBvc2l0aW9uSW5pdGlhbGl6ZWQ9ITApLHRoaXMuX21lc2hWaWV3ZXJBdHRhY2hlZHx8KHRoaXMuc2hhZG93Um9vdC5hcHBlbmRDaGlsZCh0aGlzLl9tZXNoVmlld2VyLmdldFJlbmRlcmVyKCkuZG9tRWxlbWVudCksdGhpcy5fbWVzaFZpZXdlckF0dGFjaGVkPSEwKSl9X2RlYm91bmNlZEZldGNoTWVzaCgpe3RoaXMuZGVib3VuY2UoImZldGNoTWVzaCIsKCgpPT50aGlzLl9tYXliZUZldGNoTWVzaCgpKSwxMDApfV9tYXliZUZldGNoTWVzaCgpe3JldHVybiBuKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD10aGlzLl9jdXJyZW50U3RlcDtpZih0JiYhdC5tZXNoJiYhdC5tZXNoRmV0Y2hpbmcpe3QubWVzaEZldGNoaW5nPSEwLHRoaXMuX2lzTWVzaExvYWRpbmc9ITA7dHJ5e2NvbnN0IGU9eWllbGQgdGhpcy5fZGF0YVByb3ZpZGVyLmZldGNoRGF0YSh0LHRoaXMucnVuLHRoaXMudGFnLHRoaXMuc2FtcGxlKTt0Lm1lc2g9ZVswXSx0aGlzLm5vdGlmeVBhdGgoIl9jdXJyZW50U3RlcC5tZXNoIil9Y2F0Y2godCl7aWYoIXR8fCF0LmNvZGV8fHQuY29kZSE9Ukt0LkNBTkNFTExFRCl0aHJvdyB0PXR8fCJSZXNwb25zZSBwcm9jZXNzaW5nIGZhaWxlZC4iLG5ldyBFcnJvcih0KX1maW5hbGx5e3RoaXMuX2lzTWVzaExvYWRpbmc9ITEsdC5tZXNoRmV0Y2hpbmc9ITF9fX0pKX1fb25DYW1lcmFQb3NpdGlvbkNoYW5nZSgpe2lmKCF0aGlzLl9tZXNoVmlld2VyLmlzUmVhZHkoKSlyZXR1cm47Y29uc3QgdD1uZXcgQ3VzdG9tRXZlbnQoImNhbWVyYS1wb3NpdGlvbi1jaGFuZ2UiLHtkZXRhaWw6dGhpcy5fbWVzaFZpZXdlci5nZXRDYW1lcmFQb3NpdGlvbigpfSk7dGhpcy5kaXNwYXRjaEV2ZW50KHQpfXNldENhbWVyYVZpZXdwb2ludCh0LGUsbil7dGhpcy5fbWVzaFZpZXdlci5zZXRDYW1lcmFWaWV3cG9pbnQodCxlLG4pfV91cGRhdGVDYW52YXNTaXplKCl7Y29uc3QgdD10aGlzLm9mZnNldFdpZHRoLGU9dCxuPXRoaXMuJCQoIi50Zi1tZXNoLWxvYWRlci1oZWFkZXIiKS5vZmZzZXRIZWlnaHQ7dGhpcy5fbWVzaFZpZXdlci5zZXRDYW52YXNTaXplKHt3aWR0aDp0LGhlaWdodDplLW59KX1yZWRyYXcoKXt0aGlzLl91cGRhdGVDYW52YXNTaXplKCksdGhpcy5pc0Nvbm5lY3RlZCYmdGhpcy5fbWVzaFZpZXdlci5kcmF3KCl9X2hhc0F0TGVhc3RPbmVTdGVwKHQpe3JldHVybiEhdCYmdC5sZW5ndGg+MH1faGFzTXVsdGlwbGVTdGVwcyh0KXtyZXR1cm4hIXQmJnQubGVuZ3RoPjF9Z2V0IF9jdXJyZW50U3RlcCgpe3JldHVybiB0aGlzLl9zdGVwc1t0aGlzLl9zdGVwSW5kZXhdfHxudWxsfWdldCBfc3RlcFZhbHVlKCl7Y29uc3QgdD10aGlzLl9jdXJyZW50U3RlcDtyZXR1cm4gdD90LnN0ZXA6MH1nZXQgX2N1cnJlbnRXYWxsVGltZSgpe2NvbnN0IHQ9dGhpcy5fY3VycmVudFN0ZXA7cmV0dXJuIHQ/S1IodC53YWxsX3RpbWUpOiIifV9nZXRNYXhTdGVwSW5kZXgodCl7cmV0dXJuIHQubGVuZ3RoLTF9X2dldFNhbXBsZVRleHQodCl7cmV0dXJuIFN0cmluZyh0KzEpfV9oYXNNdWx0aXBsZVNhbXBsZXModCl7cmV0dXJuIHQ+MX1fdXBkYXRlVmlldygpe3RoaXMuX21lc2hWaWV3ZXImJiJhbGwiPT10aGlzLnNlbGVjdGVkVmlldyYmdGhpcy5fbWVzaFZpZXdlci5yZXNldFZpZXcoKX10b0xvY2FsZVN0cmluZ18odCl7cmV0dXJuIHQudG9Mb2NhbGVTdHJpbmcoKX19O0k3dC50ZW1wbGF0ZT1fZWAKICAgIDx0Zi1jYXJkLWhlYWRpbmcgY29sb3I9IltbX3J1bkNvbG9yXV0iIGNsYXNzPSJ0Zi1tZXNoLWxvYWRlci1oZWFkZXIiPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU2FtcGxlcyhvZlNhbXBsZXMpXV0iPgogICAgICAgIDxkaXY+c2FtcGxlOiBbW19nZXRTYW1wbGVUZXh0KHNhbXBsZSldXSBvZiBbW29mU2FtcGxlc11dPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXAoX3N0ZXBzKV1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgc3RlcAogICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiCiAgICAgICAgICAgICAgPltbdG9Mb2NhbGVTdHJpbmdfKF9zdGVwVmFsdWUpXV08L3NwYW4KICAgICAgICAgICAgPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIGhlYWRpbmctcmlnaHQiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2N1cnJlbnRXYWxsVGltZV1dIj4KICAgICAgICAgICAgICBbW19jdXJyZW50V2FsbFRpbWVdXQogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCByaWdodCI+CiAgICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlIGhpZGRlbiQ9IltbIV9pc01lc2hMb2FkaW5nXV0iPgogICAgICAgICAgICA8L3BhcGVyLXNwaW5uZXItbGl0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU3RlcHMoX3N0ZXBzKV1dIj4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLXNsaWRlcgogICAgICAgICAgICBpZD0ic3RlcHMiCiAgICAgICAgICAgIGltbWVkaWF0ZS12YWx1ZT0ie3tfc3RlcEluZGV4fX0iCiAgICAgICAgICAgIG1heD0iW1tfZ2V0TWF4U3RlcEluZGV4KF9zdGVwcyldXSIKICAgICAgICAgICAgbWF4LW1hcmtlcnM9IltbX2dldE1heFN0ZXBJbmRleChfc3RlcHMpXV0iCiAgICAgICAgICAgIHNuYXBzCiAgICAgICAgICAgIHN0ZXA9IjEiCiAgICAgICAgICAgIHZhbHVlPSJ7e19zdGVwSW5kZXh9fSIKICAgICAgICAgID48L3BhcGVyLXNsaWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdGYtY2FyZC1oZWFkaW5nPgogICAgPHN0eWxlPgogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAxcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxcHg7CiAgICAgIH0KICAgICAgLnRmLW1lc2gtbG9hZGVyLWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDVweDsKICAgICAgfQogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLEk3dC5wcm90b3R5cGUsInJ1biIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxJN3QucHJvdG90eXBlLCJ0YWciLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sSTd0LnByb3RvdHlwZSwic2FtcGxlIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLEk3dC5wcm90b3R5cGUsIm9mU2FtcGxlcyIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxJN3QucHJvdG90eXBlLCJzZWxlY3RlZFZpZXciLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxJN3QucHJvdG90eXBlLCJhY3RpdmUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsZHIpXSxJN3QucHJvdG90eXBlLCJyZXF1ZXN0TWFuYWdlciIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixON3QpXSxJN3QucHJvdG90eXBlLCJfbWVzaFZpZXdlciIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixES3QpXSxJN3QucHJvdG90eXBlLCJfZGF0YVByb3ZpZGVyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEk3dC5wcm90b3R5cGUsIl9jb2xvclNjYWxlRnVuY3Rpb24iLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheSxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxJN3QucHJvdG90eXBlLCJfc3RlcHMiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLEk3dC5wcm90b3R5cGUsIl9zdGVwSW5kZXgiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxJN3QucHJvdG90eXBlLCJfbWVzaFZpZXdlckF0dGFjaGVkIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sSTd0LnByb3RvdHlwZSwiX2NhbWVyYVBvc2l0aW9uSW5pdGlhbGl6ZWQiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxJN3QucHJvdG90eXBlLCJfaXNNZXNoTG9hZGluZyIsdm9pZCAwKSx0KFtzKCJydW4iKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxJN3QucHJvdG90eXBlLCJfcnVuQ29sb3IiLG51bGwpLHQoW2EoInJ1biIsInRhZyIsImFjdGl2ZSIsIl9kYXRhUHJvdmlkZXIiLCJfbWVzaFZpZXdlciIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sSTd0LnByb3RvdHlwZSwicmVsb2FkIixudWxsKSx0KFthKCJfY3VycmVudFN0ZXAuKiIsIl9tZXNoVmlld2VyIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxJN3QucHJvdG90eXBlLCJfdXBkYXRlU2NlbmUiLG51bGwpLHQoW2EoIl9jdXJyZW50U3RlcCIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sSTd0LnByb3RvdHlwZSwiX2RlYm91bmNlZEZldGNoTWVzaCIsbnVsbCksdChbcygiX3N0ZXBzIiwiX3N0ZXBJbmRleCIpLGUoImRlc2lnbjp0eXBlIixPYmplY3QpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLEk3dC5wcm90b3R5cGUsIl9jdXJyZW50U3RlcCIsbnVsbCksdChbcygiX2N1cnJlbnRTdGVwIiksZSgiZGVzaWduOnR5cGUiLE51bWJlciksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sSTd0LnByb3RvdHlwZSwiX3N0ZXBWYWx1ZSIsbnVsbCksdChbcygiX2N1cnJlbnRTdGVwIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sSTd0LnByb3RvdHlwZSwiX2N1cnJlbnRXYWxsVGltZSIsbnVsbCksdChbYSgic2VsZWN0ZWRWaWV3IiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxJN3QucHJvdG90eXBlLCJfdXBkYXRlVmlldyIsbnVsbCksSTd0PXQoW2koInRmLW1lc2gtbG9hZGVyIildLEk3dCk7bGV0IFI3dD1jbGFzcyBleHRlbmRzIHlle2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnJlbG9hZE9uUmVhZHk9ITAsdGhpcy5fdGFnRmlsdGVyPSIuKiIsdGhpcy5fc2VsZWN0ZWRWaWV3PSJhbGwiLHRoaXMuX3JlcXVlc3RNYW5hZ2VyPW5ldyBkcix3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIiwoKCk9Pnt0aGlzLl9oYW5kbGVXaW5kb3dSZXNpemUoKX0pLCExKSx0aGlzLnJlbG9hZE9uUmVhZHkmJnRoaXMucmVsb2FkKCl9X2dldEFsbENoaWxkcmVuKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLW1lc2gtbG9hZGVyIikpfV9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlZCh0KXsic2hhcmUiPT10aGlzLl9zZWxlY3RlZFZpZXcmJnRoaXMuX2dldEFsbENoaWxkcmVuKCkuZm9yRWFjaCgoZT0+e3QudGFyZ2V0IT1lJiZlLnNldENhbWVyYVZpZXdwb2ludCh0LmRldGFpbC5wb3NpdGlvbix0LmRldGFpbC5mYXIsdC5kZXRhaWwudGFyZ2V0KX0pKX1fc2hvdWxkT3Blbih0KXtyZXR1cm4gdDw9Mn1yZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKHRoaXMuX3JlbG9hZE1lc2hlcy5iaW5kKHRoaXMpKX1faGFuZGxlV2luZG93UmVzaXplKCl7dGhpcy5fZ2V0QWxsQ2hpbGRyZW4oKS5mb3JFYWNoKCh0PT57dC5yZWRyYXcoKX0pKX1fZmV0Y2hUYWdzKCl7Y29uc3QgdD1fcigpLnBsdWdpblJvdXRlKCJtZXNoIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0KS50aGVuKCh0PT57aWYoU2UuZXhwb3J0cy5pc0VxdWFsKHQsdGhpcy5fcnVuVG9UYWdJbmZvKSlyZXR1cm47Y29uc3QgZT1hcihTZS5leHBvcnRzLm1hcFZhbHVlcyh0LCh0PT5PYmplY3Qua2V5cyh0KSkpKTt0aGlzLl9kYXRhTm90Rm91bmQ9MD09PWUubGVuZ3RoLHRoaXMuX3J1blRvVGFnSW5mbz10fSkpfV9yZWxvYWRNZXNoZXMoKXt0aGlzLl9nZXRBbGxDaGlsZHJlbigpLmZvckVhY2goKHQ9Pnt0LnJlbG9hZCgpfSkpfWdldCBfY2F0ZWdvcmllcygpe3ZhciB0PXRoaXMuX3J1blRvVGFnSW5mbyxlPXRoaXMuX3NlbGVjdGVkUnVucyxuPXRoaXMuX3RhZ0ZpbHRlcjtmdW5jdGlvbiBpKGUpe2NvbnN0IG49dFtlLnJ1bl1bZS50YWddLnNhbXBsZXM7cmV0dXJuIFNlLmV4cG9ydHMucmFuZ2UobikubWFwKCh0PT5PYmplY3QuYXNzaWduKHt9LGUse3NhbXBsZTp0LG9mU2FtcGxlczpufSkpKX1yZXR1cm4gTXIoU2UuZXhwb3J0cy5tYXBWYWx1ZXModCwodD0+T2JqZWN0LmtleXModCkpKSxlLG4pLm1hcCgodD0+T2JqZWN0LmFzc2lnbih7fSx0LHtpdGVtczpbXS5jb25jYXQuYXBwbHkoW10sdC5pdGVtcy5tYXAoaSkpfSkpKX19O1I3dC50ZW1wbGF0ZT1fZWAKICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IHNsb3Q9InNpZGViYXIiIGNsYXNzPSJhbGwtY29udHJvbHMiPgogICAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiB2aWV3LWNvbnRyb2wiPgogICAgICAgICAgICA8aDMgY2xhc3M9InRpdGxlIj5Qb2ludCBvZiB2aWV3PC9oMz4KICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tZ3JvdXAKICAgICAgICAgICAgICAgIGlkPSJ2aWV3LXJhZGlvLWdyb3VwIgogICAgICAgICAgICAgICAgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkVmlld319IgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9ImFsbC1yYWRpby1idXR0b24iIG5hbWU9ImFsbCI+CiAgICAgICAgICAgICAgICAgIERpc3BsYXkgYWxsIHBvaW50cwogICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcAogICAgICAgICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgICAgICAgIGZvcj0iYWxsLXJhZGlvLWJ1dHRvbiIKICAgICAgICAgICAgICAgICAgcG9zaXRpb249InJpZ2h0IgogICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIFpvb20gYW5kIGNlbnRlciBjYW1lcmEgdG8gZGlzcGxheSBhbGwgcG9pbnRzIGF0IG9uY2UuIE5vdGUsCiAgICAgICAgICAgICAgICAgIHRoYXQgc29tZSBwb2ludHMgY291bGQgYmUgdG9vIGZhciAoaS5lLiB0b28gc21hbGwpIHRvIGJlCiAgICAgICAgICAgICAgICAgIHZpc2libGUuCiAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJ1c2VyLXJhZGlvLWJ1dHRvbiIgbmFtZT0idXNlciI+CiAgICAgICAgICAgICAgICAgIEN1cnJlbnQgdmlldwogICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcAogICAgICAgICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgICAgICAgIGZvcj0idXNlci1yYWRpby1idXR0b24iCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICBLZWVwIGN1cnJlbnQgY2FtZXJhIHBvc2l0aW9uIGFuZCB6b29tIGxldmVsLgogICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ic2hhcmUtcmFkaW8tYnV0dG9uIiBuYW1lPSJzaGFyZSI+CiAgICAgICAgICAgICAgICAgIFNoYXJlIHZpZXdwb2ludAogICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcAogICAgICAgICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgICAgICAgIGZvcj0ic2hhcmUtcmFkaW8tYnV0dG9uIgogICAgICAgICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgU2hhcmUgdmlld3BvaW50IGFtb25nIGFsbCBjYW1lcmFzLgogICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHBvaW50IGNsb3VkIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczo8L3A+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IHBvaW50IGNsb3VkIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy4KICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIgogICAgICAgICAgICAgICAgPlJFQURNRTwvYQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCIKICAgICAgICAgICAgICAgID5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYQogICAgICAgICAgICAgID4uCiAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciCiAgICAgICAgICAgICAgICA+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3CiAgICAgICAgICAgICAgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIKICAgICAgICAgICAgICBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1tZXNoLWxvYWRlcgogICAgICAgICAgICAgICAgICBhY3RpdmU9IltbYWN0aXZlXV0iCiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLXZpZXc9IltbX3NlbGVjdGVkVmlld11dIgogICAgICAgICAgICAgICAgICBydW49IltbaXRlbS5ydW5dXSIKICAgICAgICAgICAgICAgICAgdGFnPSJbW2l0ZW0udGFnXV0iCiAgICAgICAgICAgICAgICAgIHNhbXBsZT0iW1tpdGVtLnNhbXBsZV1dIgogICAgICAgICAgICAgICAgICBvZi1zYW1wbGVzPSJbW2l0ZW0ub2ZTYW1wbGVzXV0iCiAgICAgICAgICAgICAgICAgIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgICAgICAgICAgICAgY2xhc3M9InRmLW1lc2gtbG9hZGVyLWNvbnRhaW5lciIKICAgICAgICAgICAgICAgICAgb24tY2FtZXJhLXBvc2l0aW9uLWNoYW5nZT0iX29uQ2FtZXJhUG9zaXRpb25DaGFuZ2VkIgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPC90Zi1tZXNoLWxvYWRlcj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDVweDsKICAgICAgfQogICAgICAuc2lkZWJhci1zZWN0aW9uIGgzIHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICB9CgogICAgICAucnVucy1zZWxlY3RvciB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CgogICAgICB0Zi1ydW5zLXNlbGVjdG9yIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAudmlldy1jb250cm9sIHsKICAgICAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAudmlldy1jb250cm9sIGgzLnRpdGxlIHsKICAgICAgICBwYWRkaW5nLXRvcDogMTZweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTZweDsKICAgICAgfQoKICAgICAgLmFsbGNvbnRyb2xzIC52aWV3LWNvbnRyb2wgcGFwZXItcmFkaW8tZ3JvdXAgewogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQogICAgICAvKiBMYXlvdXQgbXVzdCBiZSBob3Jpem9udGFsLCBpLmUuIGl0ZW1zIGFycmFuZ2VkIGluIGEgcm93LiBJZiBpdGVtcyBjYW5ub3QgZml0IGluIGEgcm93LAogICAgICAgKiB0aGV5IHNob3VsZCBiZSBtb3ZlZCB0byBuZXh0IGxpbmUuIEFsbCBpdGVtcyBtdXN0IGJlIHNxdWFyZSBhdCBhbGwgdGltZXMuIE1pbmltdW0gc2l6ZSBvZgogICAgICAgKiB0aGUgaXRlbSBpcyA0ODBweC4gVGhpcyBtZWFucyB0aGF0IG1heGltdW0gc2l6ZSBvZiB0aGUgaXRlbSBtdXN0IGJlIDQ4MHB4ICsgNDc5cHggPSA5NTlweC4KICAgICAgICogKi8KICAgICAgLmhvcml6b250YWwgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KICAgICAgdGYtbWVzaC1sb2FkZXIgewogICAgICAgIHdpZHRoOiA0ODBweDsKICAgICAgICBmbGV4LWJhc2lzOiA0ODBweDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFI3dC5wcm90b3R5cGUsInJlbG9hZE9uUmVhZHkiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLFI3dC5wcm90b3R5cGUsIl9zZWxlY3RlZFJ1bnMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sUjd0LnByb3RvdHlwZSwiX3J1blRvVGFnSW5mbyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFI3dC5wcm90b3R5cGUsIl9kYXRhTm90Rm91bmQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sUjd0LnByb3RvdHlwZSwiX3RhZ0ZpbHRlciIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sUjd0LnByb3RvdHlwZSwiX3NlbGVjdGVkVmlldyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxSN3QucHJvdG90eXBlLCJfcmVxdWVzdE1hbmFnZXIiLHZvaWQgMCksdChbcygiX3J1blRvVGFnSW5mbyIsIl9zZWxlY3RlZFJ1bnMiLCJfdGFnRmlsdGVyIiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxSN3QucHJvdG90eXBlLCJfY2F0ZWdvcmllcyIsbnVsbCksUjd0PXQoW2koIm1lc2gtZGFzaGJvYXJkIiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sUjd0KTtsZXQgTzd0PWNsYXNzIGV4dGVuZHMgeWV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX2V4cGFuZGVkPSExLHRoaXMuX3J1blRvUHJDdXJ2ZUVudHJ5PXt9LHRoaXMuX3ByZXZpb3VzUnVuVG9QckN1cnZlRW50cnk9e30sdGhpcy5fY29sb3JTY2FsZUZ1bmN0aW9uPXtzY2FsZTpHUn0sdGhpcy5fY2FuY2VsbGVyPW5ldyBYUix0aGlzLl94Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kPSgpPT57Y29uc3QgdD1uZXcgck8uU2NhbGVzLkxpbmVhcjtyZXR1cm57c2NhbGU6dCxheGlzOm5ldyByTy5BeGVzLk51bWVyaWModCwiYm90dG9tIiksYWNjZXNzb3I6dD0+dC5yZWNhbGx9fSx0aGlzLl95VmFsdWVBY2Nlc3Nvcj10PT50LnByZWNpc2lvbix0aGlzLl90b29sdGlwQ29sdW1ucz0oKCk9Pntjb25zdCB0PXdUdCg0KSxlPWU9PmlzTmFOKGUpPyJOYU4iOnQoZSk7cmV0dXJuW3t0aXRsZToiUnVuIixldmFsdWF0ZTp0PT50LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfSx7dGl0bGU6IlRocmVzaG9sZCIsZXZhbHVhdGU6dD0+ZSh0LmRhdHVtLnRocmVzaG9sZHMpfSx7dGl0bGU6IlByZWNpc2lvbiIsZXZhbHVhdGU6dD0+ZSh0LmRhdHVtLnByZWNpc2lvbil9LHt0aXRsZToiUmVjYWxsIixldmFsdWF0ZTp0PT5lKHQuZGF0dW0ucmVjYWxsKX0se3RpdGxlOiJUUCIsZXZhbHVhdGU6dD0+dC5kYXR1bS50cnVlX3Bvc2l0aXZlc30se3RpdGxlOiJGUCIsZXZhbHVhdGU6dD0+dC5kYXR1bS5mYWxzZV9wb3NpdGl2ZXN9LHt0aXRsZToiVE4iLGV2YWx1YXRlOnQ9PnQuZGF0dW0udHJ1ZV9uZWdhdGl2ZXN9LHt0aXRsZToiRk4iLGV2YWx1YXRlOnQ9PnQuZGF0dW0uZmFsc2VfbmVnYXRpdmVzfV19KSgpLHRoaXMuX3Nlcmllc0RhdGFGaWVsZHM9WyJ0aHJlc2hvbGRzIiwicHJlY2lzaW9uIiwicmVjYWxsIiwidHJ1ZV9wb3NpdGl2ZXMiLCJmYWxzZV9wb3NpdGl2ZXMiLCJ0cnVlX25lZ2F0aXZlcyIsImZhbHNlX25lZ2F0aXZlcyJdLHRoaXMuX2RlZmF1bHRYUmFuZ2U9Wy0uMDUsMS4wNV0sdGhpcy5fZGVmYXVsdFlSYW5nZT1bLS4wNSwxLjA1XSx0aGlzLl9yZXF1ZXN0RGF0YT0odCxlLG4pPT57Y29uc3QgaT1fcigpLnBsdWdpblJvdXRlKCJwcl9jdXJ2ZXMiLCIvcHJfY3VydmVzIik7UHJvbWlzZS5hbGwodC5tYXAoKHQ9Pntjb25zdCBuPWlPKGkse3RhZzp0aGlzLnRhZyxydW46dH0pO3JldHVybiB0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QobikudGhlbigobj0+e2Uoe2l0ZW06dCxkYXRhOm59KX0pKX0pKSkuZmluYWxseSgoKCk9PntuKCl9KSl9LHRoaXMuX3Ntb290aGluZ0VuYWJsZWQ9ITF9X2NyZWF0ZVByb2Nlc3NEYXRhRnVuY3Rpb24oKXtyZXR1cm4odCxlLG4pPT57dGhpcy5zZXQoIl9ydW5Ub0RhdGFPdmVyVGltZSIsT2JqZWN0LmFzc2lnbih7fSx0aGlzLl9ydW5Ub0RhdGFPdmVyVGltZSxuKSl9fV9jb21wdXRlUnVuQ29sb3IodCl7cmV0dXJuIEdSKHQpfWNvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLl9hdHRhY2hlZD0hMCx0aGlzLnJlbG9hZCgpfV9nZXRDaGFydERhdGFMb2FkZXIoKXtyZXR1cm4gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKX1yZWxvYWQoKXt0aGlzLl9hdHRhY2hlZCYmKDAhPT10aGlzLnJ1bnMubGVuZ3RoP3RoaXMuX2dldENoYXJ0RGF0YUxvYWRlcigpLnJlbG9hZCgpOnRoaXMuc2V0KCJfcnVuVG9EYXRhT3ZlclRpbWUiLHt9KSl9X3NldENoYXJ0RGF0YSgpe3ZhciB0PXRoaXMuX3J1blRvUHJDdXJ2ZUVudHJ5LGU9dGhpcy5fcHJldmlvdXNSdW5Ub1ByQ3VydmVFbnRyeSxuPXRoaXMuX3NldE9mUmVsZXZhbnRSdW5zO1NlLmV4cG9ydHMuZm9yT3duKHQsKChpLHIpPT57Y29uc3Qgbz1lW3JdO28mJnRbcl0uc3RlcD09PW8uc3RlcHx8KG5bcl0/dGhpcy5fdXBkYXRlU2VyaWVzRGF0YUZvclJ1bihyLGkpOnRoaXMuX2NsZWFyU2VyaWVzRGF0YShyKSl9KSl9X3VwZGF0ZVNlcmllc0RhdGFGb3JSdW4odCxlKXtjb25zdCBuPVNlLmV4cG9ydHMucmVkdWNlKHRoaXMuX3Nlcmllc0RhdGFGaWVsZHMsKCh0LG4pPT4odFtuXT1lW25dLnNsaWNlKCkucmV2ZXJzZSgpLHQpKSx7fSksaT1uZXcgQXJyYXkoblt0aGlzLl9zZXJpZXNEYXRhRmllbGRzWzBdXS5sZW5ndGgpO2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7dCsrKWlbdF09U2UuZXhwb3J0cy5tYXBWYWx1ZXMobiwoZT0+ZVt0XSkpO2NvbnN0IHI9dGhpcy5fZ2V0Q2hhcnREYXRhTG9hZGVyKCk7ci5zZXRTZXJpZXNEYXRhKHQsaSksci5jb21taXRDaGFuZ2VzKCl9X2NsZWFyU2VyaWVzRGF0YSh0KXtjb25zdCBlPXRoaXMuX2dldENoYXJ0RGF0YUxvYWRlcigpO2Uuc2V0U2VyaWVzRGF0YSh0LFtdKSxlLmNvbW1pdENoYW5nZXMoKX1fdXBkYXRlUnVuVG9QckN1cnZlRW50cnkoKXt2YXIgdD10aGlzLnJ1blRvU3RlcENhcDtjb25zdCBlPXt9O1NlLmV4cG9ydHMuZm9yT3duKHRoaXMuX3J1blRvRGF0YU92ZXJUaW1lLCgobixpKT0+e24mJm4ubGVuZ3RoJiYoZVtpXT10aGlzLl9jb21wdXRlRW50cnlDbG9zZXN0T3JFcXVhbFRvU3RlcENhcCh0W2ldLG4pKX0pKSx0aGlzLnNldCgiX3ByZXZpb3VzUnVuVG9QckN1cnZlRW50cnkiLHRoaXMuX3J1blRvUHJDdXJ2ZUVudHJ5KSx0aGlzLnNldCgiX3J1blRvUHJDdXJ2ZUVudHJ5IixlKX1fbm90aWZ5RGF0YUNoYW5nZSgpe3RoaXMub25EYXRhQ2hhbmdlJiZ0aGlzLm9uRGF0YUNoYW5nZSh0aGlzLl9ydW5Ub0RhdGFPdmVyVGltZSl9X2NvbXB1dGVFbnRyeUNsb3Nlc3RPckVxdWFsVG9TdGVwQ2FwKHQsZSl7Y29uc3Qgbj1NYXRoLm1pbihTZS5leHBvcnRzLnNvcnRlZEluZGV4KGUubWFwKCh0PT50LnN0ZXApKSx0KSxlLmxlbmd0aC0xKTtyZXR1cm4gZVtuXX1nZXQgX3J1bnNXaXRoU3RlcEF2YWlsYWJsZSgpe3ZhciB0PXRoaXMuX3J1blRvUHJDdXJ2ZUVudHJ5O3JldHVybiBTZS5leHBvcnRzLmZpbHRlcih0aGlzLnJ1bnMsKGU9PnRbZV0pKS5zb3J0KCl9Z2V0IF9zZXRPZlJlbGV2YW50UnVucygpe2NvbnN0IHQ9e307cmV0dXJuIFNlLmV4cG9ydHMuZm9yRWFjaCh0aGlzLl9ydW5zV2l0aFN0ZXBBdmFpbGFibGUsKGU9Pnt0W2VdPSEwfSkpLHR9X2NvbXB1dGVDdXJyZW50U3RlcEZvclJ1bih0LGUpe2NvbnN0IG49dFtlXTtyZXR1cm4gbj9uLnN0ZXA6bnVsbH1fY29tcHV0ZUN1cnJlbnRXYWxsVGltZUZvclJ1bih0LGUpe2NvbnN0IG49dFtlXTtyZXR1cm4gbj9uZXcgRGF0ZSgxZTMqbi53YWxsX3RpbWUpLnRvU3RyaW5nKCk6bnVsbH1fdG9nZ2xlRXhwYW5kZWQodCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKSx0aGlzLnJlZHJhdygpfV9yZXNldERvbWFpbigpe3RoaXMuX2dldENoYXJ0RGF0YUxvYWRlcigpLnJlc2V0RG9tYWluKCl9cmVkcmF3KCl7dGhpcy5fZ2V0Q2hhcnREYXRhTG9hZGVyKCkucmVkcmF3KCl9fTtPN3QudGVtcGxhdGU9X2VgCiAgICA8dGYtY2FyZC1oZWFkaW5nCiAgICAgIHRhZz0iW1t0YWddXSIKICAgICAgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iCiAgICAgIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iCiAgICA+PC90Zi1jYXJkLWhlYWRpbmc+CgogICAgPHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIKICAgICAgeC1jb21wb25lbnRzLWNyZWF0aW9uLW1ldGhvZD0iW1tfeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZF1dIgogICAgICB5LXZhbHVlLWFjY2Vzc29yPSJbW195VmFsdWVBY2Nlc3Nvcl1dIgogICAgICB0b29sdGlwLWNvbHVtbnM9IltbX3Rvb2x0aXBDb2x1bW5zXV0iCiAgICAgIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlRnVuY3Rpb25dXSIKICAgICAgZGVmYXVsdC14LXJhbmdlPSJbW19kZWZhdWx0WFJhbmdlXV0iCiAgICAgIGRlZmF1bHQteS1yYW5nZT0iW1tfZGVmYXVsdFlSYW5nZV1dIgogICAgICBzbW9vdGhpbmctZW5hYmxlZD0iW1tfc21vb3RoaW5nRW5hYmxlZF1dIgogICAgICByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgZGF0YS10by1sb2FkPSJbW3J1bnNdXSIKICAgICAgZGF0YS1zZXJpZXM9IltbcnVuc11dIgogICAgICBsb2FkLWtleT0iW1t0YWddXSIKICAgICAgcmVxdWVzdC1kYXRhPSJbW19yZXF1ZXN0RGF0YV1dIgogICAgICBsb2FkLWRhdGEtY2FsbGJhY2s9IltbX2NyZWF0ZVByb2Nlc3NEYXRhRnVuY3Rpb24oKV1dIgogICAgICBhY3RpdmU9IltbYWN0aXZlXV0iCiAgICA+PC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgoKICAgIDxkaXYgaWQ9ImJ1dHRvbnMtcm93Ij4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIgogICAgICAgIGljb249ImZ1bGxzY3JlZW4iCiAgICAgICAgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiCiAgICAgID48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICBpY29uPSJzZXR0aW5ncy1vdmVyc2NhbiIKICAgICAgICBvbi10YXA9Il9yZXNldERvbWFpbiIKICAgICAgICB0aXRsZT0iUmVzZXQgYXhlcyB0byBbMCwgMV0uIgogICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9InN0ZXAtbGVnZW5kIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfcnVuc1dpdGhTdGVwQXZhaWxhYmxlXV0iIGFzPSJydW4iPgogICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1yb3ciPgogICAgICAgICAgPGRpdgogICAgICAgICAgICBjbGFzcz0iY29sb3ItYm94IgogICAgICAgICAgICBzdHlsZT0iYmFja2dyb3VuZDogW1tfY29tcHV0ZVJ1bkNvbG9yKHJ1bildXTsiCiAgICAgICAgICA+PC9kaXY+CiAgICAgICAgICBbW3J1bl1dIGlzIGF0CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic3RlcC1sYWJlbC10ZXh0Ij4KICAgICAgICAgICAgc3RlcCBbW19jb21wdXRlQ3VycmVudFN0ZXBGb3JSdW4oX3J1blRvUHJDdXJ2ZUVudHJ5LCBydW4pXV0gPC9zcGFuCiAgICAgICAgICA+PGJyIC8+CiAgICAgICAgICA8c3BhbiBjbGFzcz0id2FsbC10aW1lLWxhYmVsLXRleHQiPgogICAgICAgICAgICAoW1tfY29tcHV0ZUN1cnJlbnRXYWxsVGltZUZvclJ1bihfcnVuVG9QckN1cnZlRW50cnksIHJ1bildXSkKICAgICAgICAgIDwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB3aWR0aDogNTAwcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDI1cHg7CiAgICAgIH0KICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICB0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIHsKICAgICAgICBoZWlnaHQ6IDMwMHB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciB7CiAgICAgICAgaGVpZ2h0OiA2MDBweDsKICAgICAgfQogICAgICAjYnV0dG9ucy1yb3cgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQogICAgICAjYnV0dG9ucy1yb3cgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQogICAgICAjYnV0dG9ucy1yb3cgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CiAgICAgICNzdGVwLWxlZ2VuZCB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBmb250LXNpemU6IDAuOGVtOwogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgcGFkZGluZzogMCAwIDAgMTBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAubGVnZW5kLXJvdyB7CiAgICAgICAgbWFyZ2luOiA1cHggMCA1cHggMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuY29sb3ItYm94IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMXB4OwogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICAgIGhlaWdodDogMTBweDsKICAgICAgfQogICAgICAuc3RlcC1sYWJlbC10ZXh0IHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAud2FsbC10aW1lLWxhYmVsLXRleHQgewogICAgICAgIGNvbG9yOiAjODg4OwogICAgICAgIGZvbnQtc2l6ZTogMC44ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sTzd0LnByb3RvdHlwZSwicnVucyIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxPN3QucHJvdG90eXBlLCJ0YWciLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTzd0LnByb3RvdHlwZSwidGFnTWV0YWRhdGEiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTzd0LnByb3RvdHlwZSwicnVuVG9TdGVwQ2FwIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLGRyKV0sTzd0LnByb3RvdHlwZSwicmVxdWVzdE1hbmFnZXIiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxPN3QucHJvdG90eXBlLCJhY3RpdmUiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sTzd0LnByb3RvdHlwZSwiX2V4cGFuZGVkIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLE83dC5wcm90b3R5cGUsIl9ydW5Ub1ByQ3VydmVFbnRyeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxPN3QucHJvdG90eXBlLCJfcHJldmlvdXNSdW5Ub1ByQ3VydmVFbnRyeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxPN3QucHJvdG90eXBlLCJfcnVuVG9EYXRhT3ZlclRpbWUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pXSxPN3QucHJvdG90eXBlLCJvbkRhdGFDaGFuZ2UiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTzd0LnByb3RvdHlwZSwiX2NvbG9yU2NhbGVGdW5jdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixYUildLE83dC5wcm90b3R5cGUsIl9jYW5jZWxsZXIiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxPN3QucHJvdG90eXBlLCJfYXR0YWNoZWQiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTzd0LnByb3RvdHlwZSwiX3hDb21wb25lbnRzQ3JlYXRpb25NZXRob2QiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTzd0LnByb3RvdHlwZSwiX3lWYWx1ZUFjY2Vzc29yIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxPN3QucHJvdG90eXBlLCJfdG9vbHRpcENvbHVtbnMiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLE83dC5wcm90b3R5cGUsIl9zZXJpZXNEYXRhRmllbGRzIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxPN3QucHJvdG90eXBlLCJfZGVmYXVsdFhSYW5nZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sTzd0LnByb3RvdHlwZSwiX2RlZmF1bHRZUmFuZ2UiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pXSxPN3QucHJvdG90eXBlLCJfcmVxdWVzdERhdGEiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxPN3QucHJvdG90eXBlLCJfc21vb3RoaW5nRW5hYmxlZCIsdm9pZCAwKSx0KFthKCJydW5zIiwidGFnIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxPN3QucHJvdG90eXBlLCJyZWxvYWQiLG51bGwpLHQoW2EoIl9ydW5Ub1ByQ3VydmVFbnRyeSIsIl9wcmV2aW91c1J1blRvUHJDdXJ2ZUVudHJ5IiwiX3NldE9mUmVsZXZhbnRSdW5zIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxPN3QucHJvdG90eXBlLCJfc2V0Q2hhcnREYXRhIixudWxsKSx0KFthKCJfcnVuVG9EYXRhT3ZlclRpbWUiLCJydW5Ub1N0ZXBDYXAiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLE83dC5wcm90b3R5cGUsIl91cGRhdGVSdW5Ub1ByQ3VydmVFbnRyeSIsbnVsbCksdChbYSgiX3J1blRvRGF0YU92ZXJUaW1lIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxPN3QucHJvdG90eXBlLCJfbm90aWZ5RGF0YUNoYW5nZSIsbnVsbCksdChbcygicnVucyIsIl9ydW5Ub1ByQ3VydmVFbnRyeSIpLGUoImRlc2lnbjp0eXBlIixBcnJheSksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sTzd0LnByb3RvdHlwZSwiX3J1bnNXaXRoU3RlcEF2YWlsYWJsZSIsbnVsbCksdChbcygiX3J1bnNXaXRoU3RlcEF2YWlsYWJsZSIpLGUoImRlc2lnbjp0eXBlIixPYmplY3QpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLE83dC5wcm90b3R5cGUsIl9zZXRPZlJlbGV2YW50UnVucyIsbnVsbCksTzd0PXQoW2koInRmLXByLWN1cnZlLWNhcmQiKV0sTzd0KTtsZXQgejd0PWNsYXNzIGV4dGVuZHMgeWV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX3J1blRvU3RlcEluZGV4PXt9fV9jb21wdXRlQ29sb3JGb3JSdW4odCl7cmV0dXJuIEdSKHQpfV9jb21wdXRlVGltZVRleHRGb3JSdW4odCxlLG4saSl7Y29uc3Qgcj1lW25dO2lmKCFTZS5leHBvcnRzLmlzTnVtYmVyKHIpKXJldHVybiIiO2NvbnN0IG89dFtuXTtpZighbylyZXR1cm4iIjtjb25zdCBhPW9bcl1baV07aWYoInN0ZXAiPT09aSlyZXR1cm5gc3RlcCAke2F9YDtpZigicmVsYXRpdmUiPT09aSlyZXR1cm4gYTwxP2AkeygxZTMqYSkudG9GaXhlZCgyKX0gbXNgOmAke2EudG9GaXhlZCgyKX0gc2A7aWYoIndhbGxfdGltZSI9PT1pKXJldHVybiBuZXcgRGF0ZSgxZTMqYSkudG9TdHJpbmcoKTt0aHJvdyBuZXcgRXJyb3IoYFRoZSBkaXNwbGF5IHR5cGUgb2YgJHtpfSBpcyBub3QgcmVjb2duaXplZC5gKX1fc2xpZGVyVmFsdWVDaGFuZ2VkKHQpe2NvbnN0IGU9dC50YXJnZXQuZGF0YXNldC5ydW4sbj10LnRhcmdldC5pbW1lZGlhdGVWYWx1ZSxpPU9iamVjdC5hc3NpZ24oe30sdGhpcy5fcnVuVG9TdGVwSW5kZXgpO2lzTmFOKG4pP2RlbGV0ZSBpW2VdOmlbZV09dC50YXJnZXQuaW1tZWRpYXRlVmFsdWUsdGhpcy5fcnVuVG9TdGVwSW5kZXg9aX1fY29tcHV0ZU1heFN0ZXBJbmRleEZvclJ1bih0LGUpe2NvbnN0IG49dFtlXTtyZXR1cm4gbiYmbi5sZW5ndGg/bi5sZW5ndGgtMTowfV91cGRhdGVTdGVwc0Zvck5ld1J1bnMoKXt2YXIgdD10aGlzLnJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXM7Y29uc3QgZT1PYmplY3QuYXNzaWduKHt9LHRoaXMuX3J1blRvU3RlcEluZGV4KTtTZS5leHBvcnRzLmZvck93bih0LCgodCxuKT0+e1NlLmV4cG9ydHMuaXNOdW1iZXIoZVtuXSl8fChlW25dPXQubGVuZ3RoLTEpfSkpLHRoaXMuX3J1blRvU3RlcEluZGV4PWV9X2dldFN0ZXAodCxlKXtyZXR1cm4gdGhpcy5fcnVuVG9TdGVwSW5kZXg/dGhpcy5fcnVuVG9TdGVwSW5kZXhbZV06MH1fY29tcHV0ZVJ1blRvU3RlcCh0LGUpe2NvbnN0IG49e307cmV0dXJuIFNlLmV4cG9ydHMuZm9yT3duKGUsKChlLGkpPT57Y29uc3Qgcj10W2ldO3ImJihuW2ldPXJbZV0uc3RlcCl9KSksbn1nZXQgX3J1bnNXaXRoU2xpZGVycygpe3ZhciB0PXRoaXMucnVuVG9BdmFpbGFibGVUaW1lRW50cmllcztyZXR1cm4gdGhpcy5ydW5zLmZpbHRlcigoZT0+dFtlXSkpfX07ejd0LnRlbXBsYXRlPV9lYAogICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfcnVuc1dpdGhTbGlkZXJzXV0iIGFzPSJydW4iPgogICAgICA8ZGl2IGNsYXNzPSJydW4td2lkZ2V0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJydW4tZGlzcGxheS1jb250YWluZXIiPgogICAgICAgICAgPGRpdgogICAgICAgICAgICBjbGFzcz0icnVuLWNvbG9yLWJveCIKICAgICAgICAgICAgc3R5bGU9ImJhY2tncm91bmQ6W1tfY29tcHV0ZUNvbG9yRm9yUnVuKHJ1bildXTsiCiAgICAgICAgICA+PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJydW4tdGV4dCI+W1tydW5dXTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InN0ZXAtZGlzcGxheS1jb250YWluZXIiPgogICAgICAgICAgW1tfY29tcHV0ZVRpbWVUZXh0Rm9yUnVuKHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMsIF9ydW5Ub1N0ZXBJbmRleCwKICAgICAgICAgIHJ1biwgdGltZURpc3BsYXlUeXBlKV1dCiAgICAgICAgPC9kaXY+CiAgICAgICAgPHBhcGVyLXNsaWRlcgogICAgICAgICAgZGF0YS1ydW4kPSJbW3J1bl1dIgogICAgICAgICAgc3RlcD0iMSIKICAgICAgICAgIHR5cGU9Im51bWJlciIKICAgICAgICAgIG1pbj0iMCIKICAgICAgICAgIG1heD0iW1tfY29tcHV0ZU1heFN0ZXBJbmRleEZvclJ1bihydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzLCBydW4pXV0iCiAgICAgICAgICB2YWx1ZT0iW1tfZ2V0U3RlcChfcnVuVG9TdGVwSW5kZXgsIHJ1bildXSIKICAgICAgICAgIG9uLWltbWVkaWF0ZS12YWx1ZS1jaGFuZ2VkPSJfc2xpZGVyVmFsdWVDaGFuZ2VkIgogICAgICAgID48L3BhcGVyLXNsaWRlcj4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAucnVuLXdpZGdldCB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgMCAwOwogICAgICB9CiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgbWFyZ2luOiAtOHB4IDAgMCAtMTVweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuc3RlcC1kaXNwbGF5LWNvbnRhaW5lciB7CiAgICAgICAgZm9udC1zaXplOiAwLjllbTsKICAgICAgICBtYXJnaW46IDAgMTVweCAwIDA7CiAgICAgIH0KICAgICAgLnJ1bi10ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgLnJ1bi1jb2xvci1ib3ggewogICAgICAgIHdpZHRoOiAxMnB4OwogICAgICAgIGhlaWdodDogMTJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLHo3dC5wcm90b3R5cGUsInJ1bnMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sejd0LnByb3RvdHlwZSwicnVuVG9BdmFpbGFibGVUaW1lRW50cmllcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxub3RpZnk6ITAsY29tcHV0ZWQ6Il9jb21wdXRlUnVuVG9TdGVwKHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMsIF9ydW5Ub1N0ZXBJbmRleCkifSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHo3dC5wcm90b3R5cGUsInJ1blRvU3RlcCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx6N3QucHJvdG90eXBlLCJ0aW1lRGlzcGxheVR5cGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sejd0LnByb3RvdHlwZSwiX3J1blRvU3RlcEluZGV4Iix2b2lkIDApLHQoW2EoInJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLHo3dC5wcm90b3R5cGUsIl91cGRhdGVTdGVwc0Zvck5ld1J1bnMiLG51bGwpLHQoW3MoInJ1bnMiLCJydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzIiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSx6N3QucHJvdG90eXBlLCJfcnVuc1dpdGhTbGlkZXJzIixudWxsKSx6N3Q9dChbaSgidGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3IiKV0sejd0KTtsZXQgRDd0PWNsYXNzIGV4dGVuZHMoZXIoeWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5yZWxvYWRPblJlYWR5PSEwLHRoaXMuX3RpbWVEaXNwbGF5VHlwZT0ic3RlcCIsdGhpcy5fc2VsZWN0ZWRSdW5zPVtdLHRoaXMuX3J1blRvVGFnSW5mbz17fSx0aGlzLl90YWdUb1J1blRvRGF0YT17fSx0aGlzLl9nZXRDYXRlZ29yeUl0ZW1LZXk9dD0+dC50YWcsdGhpcy5fcmVxdWVzdE1hbmFnZXI9bmV3IGRyLHRoaXMuX3N0ZXA9MH1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5yZWxvYWRPblJlYWR5JiZ0aGlzLnJlbG9hZCgpfXJlbG9hZCgpe1Byb21pc2UuYWxsKFt0aGlzLl9mZXRjaFRhZ3MoKV0pLnRoZW4oKCgpPT57dGhpcy5fcmVsb2FkQ2FyZHMoKX0pKX1fc2hvdWxkT3Blbih0KXtyZXR1cm4gdDw9Mn1fZmV0Y2hUYWdzKCl7Y29uc3QgdD1fcigpLnBsdWdpblJvdXRlKCJwcl9jdXJ2ZXMiLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHQpLnRoZW4oKHQ9PntpZihTZS5leHBvcnRzLmlzRXF1YWwodCx0aGlzLl9ydW5Ub1RhZ0luZm8pKXJldHVybjtjb25zdCBlPWFyKFNlLmV4cG9ydHMubWFwVmFsdWVzKHQsKHQ9PlNlLmV4cG9ydHMua2V5cyh0KSkpKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWUubGVuZ3RoKSx0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsdCksdGhpcy5hc3luYygoKCk9Pnt0aGlzLnNldCgiX2NhdGVnb3JpZXNEb21SZWFkeSIsITApfSkpfSkpfV9yZWxvYWRDYXJkcygpe1NlLmV4cG9ydHMuZm9yRWFjaCh0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtcHItY3VydmUtY2FyZCIpLCh0PT57dC5yZWxvYWQoKX0pKX1nZXQgX2NhdGVnb3JpZXMoKXt2YXIgdD10aGlzLl9zZWxlY3RlZFJ1bnMsZT10aGlzLl90YWdGaWx0ZXI7cmV0dXJuIHdyKFNlLmV4cG9ydHMubWFwVmFsdWVzKHRoaXMuX3J1blRvVGFnSW5mbywodD0+T2JqZWN0LmtleXModCkpKSx0LGUpfWdldCBfcmVsZXZhbnRTZWxlY3RlZFJ1bnMoKXt2YXIgdD10aGlzLl9ydW5Ub1RhZ0luZm87cmV0dXJuIHRoaXMuX3NlbGVjdGVkUnVucy5maWx0ZXIoKGU9PnRbZV0pKX1fdGFnTWV0YWRhdGEodCxlLG4pe2NvbnN0IGk9e307ZS5mb3JFYWNoKChlPT57aVtlXT10W2VdW25dfSkpO2NvbnN0IHI9bi5yZXBsYWNlKC9cL3ByX2N1cnZlcyQvLCIiKTtyZXR1cm4gZU8oaSxyKX1fY3JlYXRlRGF0YUNoYW5nZUNhbGxiYWNrKHQpe3JldHVybiBlPT57dGhpcy5zZXQoIl90YWdUb1J1blRvRGF0YSIsT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHRoaXMuX3RhZ1RvUnVuVG9EYXRhKSx7W3RdOmV9KSl9fWdldCBfcnVuVG9BdmFpbGFibGVUaW1lRW50cmllcygpe3ZhciB0PXRoaXMuX3RhZ1RvUnVuVG9EYXRhO2NvbnN0IGU9e307Zm9yKGNvbnN0W24saV1vZiBPYmplY3QuZW50cmllcyh0KSlmb3IoY29uc3RbdF1vZiBPYmplY3QuZW50cmllcyhpKSkobnVsbD09ZVt0XXx8bjxlW3RdKSYmKGVbdF09bik7Y29uc3Qgbj17fTtmb3IoY29uc3RbaSxyXW9mIE9iamVjdC5lbnRyaWVzKGUpKXtjb25zdCBlPXRbcl1baV07bltpXT1lLm1hcCgodD0+KHtzdGVwOnQuc3RlcCx3YWxsX3RpbWU6dC53YWxsX3RpbWUscmVsYXRpdmU6dC53YWxsX3RpbWUtZVswXS53YWxsX3RpbWV9KSkpfXJldHVybiBufX07RDd0LnRlbXBsYXRlPV9lYAogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IKICAgICAgICAgICAgICBpZD0idGltZS10eXBlLXNlbGVjdG9yIgogICAgICAgICAgICAgIG5hbWU9IlRpbWUgRGlzcGxheSBUeXBlIgogICAgICAgICAgICAgIHNlbGVjdGVkLWlkPSJ7e190aW1lRGlzcGxheVR5cGV9fSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InN0ZXAiPnN0ZXA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8IS0tCiAgICAgICAgICAgIC0tPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDwhLS0KICAgICAgICAgICAgLS0+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3J1blRvQXZhaWxhYmxlVGltZUVudHJpZXNdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiIgaWQ9InN0ZXBzLXNlbGVjdG9yLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgPHRmLXByLWN1cnZlLXN0ZXBzLXNlbGVjdG9yCiAgICAgICAgICAgICAgICBydW5zPSJbW19yZWxldmFudFNlbGVjdGVkUnVuc11dIgogICAgICAgICAgICAgICAgcnVuLXRvLXN0ZXA9Int7X3J1blRvU3RlcH19IgogICAgICAgICAgICAgICAgcnVuLXRvLWF2YWlsYWJsZS10aW1lLWVudHJpZXM9IltbX3J1blRvQXZhaWxhYmxlVGltZUVudHJpZXNdXSIKICAgICAgICAgICAgICAgIHRpbWUtZGlzcGxheS10eXBlPSJbW190aW1lRGlzcGxheVR5cGVdXSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgPC90Zi1wci1jdXJ2ZS1zdGVwcy1zZWxlY3Rvcj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBydW5zLXNlbGVjdG9yIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBwcmVjaXNpb27igJNyZWNhbGwgY3VydmUgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIFlvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgcHJlY2lzaW9u4oCTcmVjYWxsIGRhdGEgdG8geW91ciBldmVudAogICAgICAgICAgICAgICAgZmlsZXMuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIgogICAgICAgICAgICAgICAgPlJFQURNRTwvYQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCIKICAgICAgICAgICAgICAgID5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYQogICAgICAgICAgICAgID4uCiAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciCiAgICAgICAgICAgICAgICA+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3CiAgICAgICAgICAgICAgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIKICAgICAgICAgICAgICBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSIKICAgICAgICAgICAgICBnZXQtY2F0ZWdvcnktaXRlbS1rZXk9IltbX2dldENhdGVnb3J5SXRlbUtleV1dIgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLXByLWN1cnZlLWNhcmQKICAgICAgICAgICAgICAgICAgYWN0aXZlPSJbW2FjdGl2ZV1dIgogICAgICAgICAgICAgICAgICBydW5zPSJbW2l0ZW0ucnVuc11dIgogICAgICAgICAgICAgICAgICB0YWc9IltbaXRlbS50YWddXSIKICAgICAgICAgICAgICAgICAgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1bnMsIGl0ZW0udGFnKV1dIgogICAgICAgICAgICAgICAgICByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iCiAgICAgICAgICAgICAgICAgIHJ1bi10by1zdGVwLWNhcD0iW1tfcnVuVG9TdGVwXV0iCiAgICAgICAgICAgICAgICAgIG9uLWRhdGEtY2hhbmdlPSJbW19jcmVhdGVEYXRhQ2hhbmdlQ2FsbGJhY2soaXRlbS50YWcpXV0iCiAgICAgICAgICAgICAgICA+PC90Zi1wci1jdXJ2ZS1jYXJkPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CgogICAgICAvKiogRG8gbm90IGxldCB0aGUgc3RlcHMgc2VsZWN0b3Igb2NjbHVkZSB0aGUgcnVuIHNlbGVjdG9yLiAqLwogICAgICAjc3RlcHMtc2VsZWN0b3ItY29udGFpbmVyIHsKICAgICAgICBtYXgtaGVpZ2h0OiA2MCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sRDd0LnByb3RvdHlwZSwicmVsb2FkT25SZWFkeSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxEN3QucHJvdG90eXBlLCJfdGltZURpc3BsYXlUeXBlIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxEN3QucHJvdG90eXBlLCJfc2VsZWN0ZWRSdW5zIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEQ3dC5wcm90b3R5cGUsIl9ydW5Ub1RhZ0luZm8iLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sRDd0LnByb3RvdHlwZSwiX3RhZ1RvUnVuVG9EYXRhIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxEN3QucHJvdG90eXBlLCJfcnVuVG9TdGVwIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sRDd0LnByb3RvdHlwZSwiX2RhdGFOb3RGb3VuZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxEN3QucHJvdG90eXBlLCJfdGFnRmlsdGVyIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sRDd0LnByb3RvdHlwZSwiX2NhdGVnb3JpZXNEb21SZWFkeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxEN3QucHJvdG90eXBlLCJfZ2V0Q2F0ZWdvcnlJdGVtS2V5Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLGRyKV0sRDd0LnByb3RvdHlwZSwiX3JlcXVlc3RNYW5hZ2VyIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxEN3QucHJvdG90eXBlLCJfc3RlcCIsdm9pZCAwKSx0KFtzKCJfcnVuVG9UYWdJbmZvIiwiX3NlbGVjdGVkUnVucyIsIl90YWdGaWx0ZXIiLCJfY2F0ZWdvcmllc0RvbVJlYWR5IiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxEN3QucHJvdG90eXBlLCJfY2F0ZWdvcmllcyIsbnVsbCksdChbcygiX3NlbGVjdGVkUnVucyIsIl9ydW5Ub1RhZ0luZm8iKSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLEQ3dC5wcm90b3R5cGUsIl9yZWxldmFudFNlbGVjdGVkUnVucyIsbnVsbCksdChbcygiX3RhZ1RvUnVuVG9EYXRhIiksZSgiZGVzaWduOnR5cGUiLE9iamVjdCksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sRDd0LnByb3RvdHlwZSwiX3J1blRvQXZhaWxhYmxlVGltZUVudHJpZXMiLG51bGwpLEQ3dD10KFtpKCJ0Zi1wci1jdXJ2ZS1kYXNoYm9hcmQiKV0sRDd0KTtsZXQgQjd0PWNsYXNzIGV4dGVuZHMoZXIoeWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5faW5zdGFsbENvbW1hbmQ9InBpcCBpbnN0YWxsIC1VIHRlbnNvcmJvYXJkLXBsdWdpbi1wcm9maWxlIn1fY29weUluc3RhbGxDb21tYW5kKCl7cmV0dXJuIG4odGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PSgpPT5uKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dGhpcy4kLmNvbW1hbmRUZXh0YXJlYS5zZWxlY3QoKTt0cnl7eWllbGQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGhpcy5faW5zdGFsbENvbW1hbmQpfWNhdGNoKHQpe2lmKCFkb2N1bWVudC5leGVjQ29tbWFuZCgiY29weSIpKXJldHVybiBQcm9taXNlLnJlamVjdCgpfX0pKSxlPXRoaXMuJC5jb3BpZWRNZXNzYWdlO3RyeXt5aWVsZCB0KCksZS5pbm5lclRleHQ9IkNvcGllZC4ifWNhdGNoKHQpe2UuaW5uZXJUZXh0PSJGYWlsZWQgdG8gY29weSB0byBjbGlwYm9hcmQuIn19KSl9X3JlbW92ZUNvcGllZE1lc3NhZ2UoKXt0aGlzLiQuY29waWVkTWVzc2FnZS5pbm5lclRleHQ9IiJ9fTtCN3QudGVtcGxhdGU9X2VgCiAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj4KICAgICAgPGgzPlRoZSBwcm9maWxlIHBsdWdpbiBoYXMgbW92ZWQuPC9oMz4KICAgICAgPHA+CiAgICAgICAgUGxlYXNlIGluc3RhbGwgdGhlIG5ldyB2ZXJzaW9uIG9mIHRoZSBwcm9maWxlIHBsdWdpbiBmcm9tIFB5UEkgYnkKICAgICAgICBydW5uaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBmcm9tIHRoZSBtYWNoaW5lIHJ1bm5pbmcgVGVuc29yQm9hcmQ6CiAgICAgIDwvcD4KICAgICAgPHRleHRhcmVhCiAgICAgICAgaWQ9ImNvbW1hbmRUZXh0YXJlYSIKICAgICAgICByZWFkb25seT0iIgogICAgICAgIHJvd3M9IjEiCiAgICAgICAgb24tYmx1cj0iX3JlbW92ZUNvcGllZE1lc3NhZ2UiCiAgICAgID4KW1tfaW5zdGFsbENvbW1hbmRdXTwvdGV4dGFyZWEKICAgICAgPgogICAgICA8ZGl2IGlkPSJjb3B5Q29udGFpbmVyIj4KICAgICAgICA8c3BhbiBpZD0iY29waWVkTWVzc2FnZSI+PC9zcGFuPgogICAgICAgIDxwYXBlci1idXR0b24gcmFpc2VkPSIiIG9uLXRhcD0iX2NvcHlJbnN0YWxsQ29tbWFuZCIKICAgICAgICAgID5Db3B5IHRvIGNsaXBib2FyZDwvcGFwZXItYnV0dG9uCiAgICAgICAgPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIC5tZXNzYWdlIHsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgfQogICAgICAjY29tbWFuZFRleHRhcmVhIHsKICAgICAgICBtYXJnaW4tdG9wOiAxZXg7CiAgICAgICAgcGFkZGluZzogMWV4IDFlbTsKICAgICAgICByZXNpemU6IHZlcnRpY2FsOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICAgICNjb3B5Q29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CiAgICAgICNjb3BpZWRNZXNzYWdlIHsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxZW07CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxCN3QucHJvdG90eXBlLCJfaW5zdGFsbENvbW1hbmQiLHZvaWQgMCksQjd0PXQoW2koInRmLXByb2ZpbGUtcmVkaXJlY3QtZGFzaGJvYXJkIildLEI3dCk7bGV0IEg3dD1jbGFzcyBleHRlbmRzKGVyKGhsKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMucmVsb2FkT25SZWFkeT0hMCx0aGlzLl9zaG93RG93bmxvYWRMaW5rcz1IcygiX3Nob3dEb3dubG9hZExpbmtzIix7ZGVmYXVsdFZhbHVlOiExLHVzZUxvY2FsU3RvcmFnZTohMH0pLmNhbGwodGhpcyksdGhpcy5fc21vb3RoaW5nV2VpZ2h0PUdzKCJfc21vb3RoaW5nV2VpZ2h0Iix7ZGVmYXVsdFZhbHVlOi42fSkuY2FsbCh0aGlzKSx0aGlzLl9pZ25vcmVZT3V0bGllcnM9SHMoIl9pZ25vcmVZT3V0bGllcnMiLHtkZWZhdWx0VmFsdWU6ITAsdXNlTG9jYWxTdG9yYWdlOiEwfSkuY2FsbCh0aGlzKSx0aGlzLl94VHlwZT14VHQuU1RFUCx0aGlzLl9zZWxlY3RlZFJ1bnM9W10sdGhpcy5fdGFnRmlsdGVyPSIiLHRoaXMuX2NhdGVnb3JpZXM9W10sdGhpcy5fZ2V0Q2F0ZWdvcnlJdGVtS2V5PXQ9PnQudGFnLHRoaXMuX3JlcXVlc3RNYW5hZ2VyPW5ldyBkcig1MCksdGhpcy5fc2hvd0Rvd25sb2FkTGlua3NPYnNlcnZlcj1GcygiX3Nob3dEb3dubG9hZExpbmtzIix7ZGVmYXVsdFZhbHVlOiExLHVzZUxvY2FsU3RvcmFnZTohMH0pLHRoaXMuX3Ntb290aGluZ1dlaWdodE9ic2VydmVyPVdzKCJfc21vb3RoaW5nV2VpZ2h0Iix7ZGVmYXVsdFZhbHVlOi42fSksdGhpcy5faWdub3JlWU91dGxpZXJzT2JzZXJ2ZXI9RnMoIl9pZ25vcmVZT3V0bGllcnMiLHtkZWZhdWx0VmFsdWU6ITAsdXNlTG9jYWxTdG9yYWdlOiEwfSl9Z2V0IF9zbW9vdGhpbmdFbmFibGVkKCl7cmV0dXJuIHRoaXMuX3Ntb290aGluZ1dlaWdodD4wfV9nZXRDYXRlZ29yeUtleSh0KXtyZXR1cm4gdC5tZXRhZGF0YS50eXBlPT1ici5TRUFSQ0hfUkVTVUxUUz8iIjp0Lm5hbWV9X3Nob3VsZE9wZW4odCl7cmV0dXJuIHQ8PTJ9cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMucmVsb2FkT25SZWFkeSYmdGhpcy5yZWxvYWQoKX1yZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgoKT0+e3RoaXMuX3JlbG9hZENoYXJ0cygpfSkpfV9mZXRjaFRhZ3MoKXtjb25zdCB0PV9yKCkucGx1Z2luUm91dGUoInNjYWxhcnMiLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHQpLnRoZW4oKHQ9PntpZihTZS5leHBvcnRzLmlzRXF1YWwodCx0aGlzLl9ydW5Ub1RhZ0luZm8pKXJldHVybjtjb25zdCBlPWFyKFNlLmV4cG9ydHMubWFwVmFsdWVzKHQsKHQ9Pk9iamVjdC5rZXlzKHQpKSkpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09ZS5sZW5ndGgpLHRoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIix0KSx0aGlzLmFzeW5jKCgoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KSl9KSl9X3JlbG9hZENoYXJ0cygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1zY2FsYXItY2FyZCIpLmZvckVhY2goKHQ9Pnt0LnJlbG9hZCgpfSkpfV91cGRhdGVDYXRlZ29yaWVzKCl7dmFyIHQ9dGhpcy5fc2VsZWN0ZWRSdW5zO2xldCBlLG49dGhpcy5fdGFnRmlsdGVyO2U9d3IoU2UuZXhwb3J0cy5tYXBWYWx1ZXModGhpcy5fcnVuVG9UYWdJbmZvLCh0PT5PYmplY3Qua2V5cyh0KSkpLHQsbiksZS5mb3JFYWNoKCh0PT57dC5pdGVtcz10Lml0ZW1zLm1hcCgodD0+KHt0YWc6dC50YWcsc2VyaWVzOnQucnVucy5tYXAoKGU9Pih7cnVuOmUsdGFnOnQudGFnfSkpKX0pKSl9KSksdGhpcy51cGRhdGVBcnJheVByb3AoIl9jYXRlZ29yaWVzIixlLHRoaXMuX2dldENhdGVnb3J5S2V5KX1fdGFnTWV0YWRhdGEodCxlLG4pe2NvbnN0IGk9dC5uYW1lLHI9bi50YWcsbz17fTtuLnNlcmllcy5mb3JFYWNoKCgoe3J1bjp0fSk9PntvW3RdPWVbdF1bcl19KSk7Y29uc3QgYT1yLnJlcGxhY2UoL1wvc2NhbGFyX3N1bW1hcnkkLywiIik7bGV0e2Rlc2NyaXB0aW9uOnMsZGlzcGxheU5hbWU6bH09ZU8obyxhKTtyZXR1cm4gdC5tZXRhZGF0YS50eXBlPT1ici5QUkVGSVhfR1JPVVAmJmwuc3RhcnRzV2l0aChpKyIvIikmJihsPWwuc2xpY2UoaS5sZW5ndGgrMSkpLHtkZXNjcmlwdGlvbjpzLGRpc3BsYXlOYW1lOmx9fX07SDd0LnRlbXBsYXRlPV9lYAogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxpbmUtaXRlbSI+CiAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94CiAgICAgICAgICAgICAgICBpZD0ic2hvdy1kb3dubG9hZC1saW5rcyIKICAgICAgICAgICAgICAgIGNoZWNrZWQ9Int7X3Nob3dEb3dubG9hZExpbmtzfX0iCiAgICAgICAgICAgICAgICA+U2hvdyBkYXRhIGRvd25sb2FkIGxpbmtzPC9wYXBlci1jaGVja2JveAogICAgICAgICAgICAgID4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxpbmUtaXRlbSI+CiAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94CiAgICAgICAgICAgICAgICBpZD0iaWdub3JlLXktb3V0bGllciIKICAgICAgICAgICAgICAgIGNoZWNrZWQ9Int7X2lnbm9yZVlPdXRsaWVyc319IgogICAgICAgICAgICAgICAgPklnbm9yZSBvdXRsaWVycyBpbiBjaGFydCBzY2FsaW5nPC9wYXBlci1jaGVja2JveAogICAgICAgICAgICAgID4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZyI+CiAgICAgICAgICAgICAgPGRpdj5Ub29sdGlwIHNvcnRpbmcgbWV0aG9kOjwvZGl2PgogICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51CiAgICAgICAgICAgICAgICBuby1sYWJlbC1mbG9hdAogICAgICAgICAgICAgICAgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfdG9vbHRpcFNvcnRpbmdNZXRob2R9fSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveAogICAgICAgICAgICAgICAgICBjbGFzcz0iZHJvcGRvd24tY29udGVudCIKICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ9IjAiCiAgICAgICAgICAgICAgICAgIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlZmF1bHQ8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlc2NlbmRpbmc8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmFzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bmVhcmVzdDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8dGYtc21vb3RoaW5nLWlucHV0CiAgICAgICAgICAgICAgd2VpZ2h0PSJ7e19zbW9vdGhpbmdXZWlnaHR9fSIKICAgICAgICAgICAgICBzdGVwPSIwLjAwMSIKICAgICAgICAgICAgICBtaW49IjAiCiAgICAgICAgICAgICAgbWF4PSIwLjk5OSIKICAgICAgICAgICAgPjwvdGYtc21vb3RoaW5nLWlucHV0PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yCiAgICAgICAgICAgICAgaWQ9IngtdHlwZS1zZWxlY3RvciIKICAgICAgICAgICAgICBuYW1lPSJIb3Jpem9udGFsIEF4aXMiCiAgICAgICAgICAgICAgc2VsZWN0ZWQtaWQ9Int7X3hUeXBlfX0iCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24KICAgICAgICAgICAgICA+PCEtLQogICAgICAgICAgICAtLT48cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbgogICAgICAgICAgICAgID48IS0tCiAgICAgICAgICAgIC0tPjxwYXBlci1idXR0b24gaWQ9IndhbGxfdGltZSI+d2FsbDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBydW5zLXNlbGVjdG9yIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBzY2FsYXIgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IHNjYWxhciBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIKICAgICAgICAgICAgICAgID5SRUFETUU8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiCiAgICAgICAgICAgICAgICA+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2EKICAgICAgICAgICAgICA+LgogICAgICAgICAgICA8L3A+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIgogICAgICAgICAgICAgICAgPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldwogICAgICAgICAgICAgIGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iCiAgICAgICAgICAgICAgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iCiAgICAgICAgICAgICAgZ2V0LWNhdGVnb3J5LWl0ZW0ta2V5PSJbW19nZXRDYXRlZ29yeUl0ZW1LZXldXSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1zY2FsYXItY2FyZAogICAgICAgICAgICAgICAgICBhY3RpdmU9IltbYWN0aXZlXV0iCiAgICAgICAgICAgICAgICAgIGRhdGEtdG8tbG9hZD0iW1tpdGVtLnNlcmllc11dIgogICAgICAgICAgICAgICAgICBpZ25vcmUteS1vdXRsaWVycz0iW1tfaWdub3JlWU91dGxpZXJzXV0iCiAgICAgICAgICAgICAgICAgIG11bHRpLWV4cGVyaW1lbnRzPSJbW19nZXRNdWx0aUV4cGVyaW1lbnRzKGRhdGFTZWxlY3Rpb24pXV0iCiAgICAgICAgICAgICAgICAgIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgICAgICAgICAgICAgc2hvdy1kb3dubG9hZC1saW5rcz0iW1tfc2hvd0Rvd25sb2FkTGlua3NdXSIKICAgICAgICAgICAgICAgICAgc21vb3RoaW5nLWVuYWJsZWQ9IltbX3Ntb290aGluZ0VuYWJsZWRdXSIKICAgICAgICAgICAgICAgICAgc21vb3RoaW5nLXdlaWdodD0iW1tfc21vb3RoaW5nV2VpZ2h0XV0iCiAgICAgICAgICAgICAgICAgIHRhZy1tZXRhZGF0YT0iW1tfdGFnTWV0YWRhdGEoY2F0ZWdvcnksIF9ydW5Ub1RhZ0luZm8sIGl0ZW0pXV0iCiAgICAgICAgICAgICAgICAgIHRhZz0iW1tpdGVtLnRhZ11dIgogICAgICAgICAgICAgICAgICB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW190b29sdGlwU29ydGluZ01ldGhvZF1dIgogICAgICAgICAgICAgICAgICB4LXR5cGU9IltbX3hUeXBlXV0iCiAgICAgICAgICAgICAgICAgIGJhdGNoLXNpemU9IltbZmVhdHVyZUZsYWdzLnNjYWxhcnNCYXRjaFNpemVdXSIKICAgICAgICAgICAgICAgICAgaW4tY29sYWI9IltbZmVhdHVyZUZsYWdzLmluQ29sYWJdXSIKICAgICAgICAgICAgICAgID48L3RmLXNjYWxhci1jYXJkPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgICN0b29sdGlwLXNvcnRpbmcgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogMTVweDsKICAgICAgfQoKICAgICAgI3Rvb2x0aXAtc29ydGluZyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CgogICAgICAubGluZS1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nLXRvcDogNXB4OwogICAgICB9CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICAgIC5jZW50ZXIgewogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sSDd0LnByb3RvdHlwZSwicmVsb2FkT25SZWFkeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxIN3QucHJvdG90eXBlLCJmZWF0dXJlRmxhZ3MiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFuLG5vdGlmeTohMCxvYnNlcnZlcjoiX3Nob3dEb3dubG9hZExpbmtzT2JzZXJ2ZXIifSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxIN3QucHJvdG90eXBlLCJfc2hvd0Rvd25sb2FkTGlua3MiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXIsbm90aWZ5OiEwLG9ic2VydmVyOiJfc21vb3RoaW5nV2VpZ2h0T2JzZXJ2ZXIifSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLEg3dC5wcm90b3R5cGUsIl9zbW9vdGhpbmdXZWlnaHQiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfaWdub3JlWU91dGxpZXJzT2JzZXJ2ZXIifSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxIN3QucHJvdG90eXBlLCJfaWdub3JlWU91dGxpZXJzIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLEg3dC5wcm90b3R5cGUsIl94VHlwZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sSDd0LnByb3RvdHlwZSwiX3NlbGVjdGVkUnVucyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxIN3QucHJvdG90eXBlLCJfcnVuVG9UYWdJbmZvIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sSDd0LnByb3RvdHlwZSwiX2RhdGFOb3RGb3VuZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxIN3QucHJvdG90eXBlLCJfdGFnRmlsdGVyIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sSDd0LnByb3RvdHlwZSwiX2NhdGVnb3JpZXNEb21SZWFkeSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sSDd0LnByb3RvdHlwZSwiX2NhdGVnb3JpZXMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sSDd0LnByb3RvdHlwZSwiX2dldENhdGVnb3J5SXRlbUtleSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixkcildLEg3dC5wcm90b3R5cGUsIl9yZXF1ZXN0TWFuYWdlciIsdm9pZCAwKSx0KFtzKCJfc21vb3RoaW5nV2VpZ2h0IiksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLEg3dC5wcm90b3R5cGUsIl9zbW9vdGhpbmdFbmFibGVkIixudWxsKSx0KFthKCJfcnVuVG9UYWdJbmZvIiwiX3NlbGVjdGVkUnVucyIsIl90YWdGaWx0ZXIiLCJfY2F0ZWdvcmllc0RvbVJlYWR5IiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxIN3QucHJvdG90eXBlLCJfdXBkYXRlQ2F0ZWdvcmllcyIsbnVsbCksSDd0PXQoW2koInRmLXNjYWxhci1kYXNoYm9hcmQiKV0sSDd0KTtsZXQgRjd0PWNsYXNzIGV4dGVuZHMoZXIoeWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fdGV4dHM9W10sdGhpcy5fY2FuY2VsbGVyPW5ldyBYUn1nZXQgX3J1bkNvbG9yKCl7cmV0dXJuIEdSKHRoaXMucnVuKX1fY2hhbmdlUnVuQ29sb3IoKXt0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tdGItdGV4dC1sb2FkZXItb3V0bGluZSI6dGhpcy5fcnVuQ29sb3J9KX1hdHRhY2hlZCgpe3RoaXMucmVsb2FkKCl9cmVsb2FkKCl7aWYoIXRoaXMuaXNBdHRhY2hlZClyZXR1cm47dGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO2NvbnN0IHQ9aU8oX3IoKS5wbHVnaW5Sb3V0ZSgidGV4dCIsIi90ZXh0Iikse3RhZzp0aGlzLnRhZyxydW46dGhpcy5ydW59KSxlPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZSgodD0+e2lmKHQuY2FuY2VsbGVkKXJldHVybjtjb25zdCBlPXQudmFsdWUubWFwKCh0PT4oe3dhbGxfdGltZTpuZXcgRGF0ZSgxZTMqdC53YWxsX3RpbWUpLHN0ZXA6dC5zdGVwLHRleHQ6dC50ZXh0fSkpKTt0aGlzLnNldCgiX3RleHRzIixlLnNsaWNlKCkucmV2ZXJzZSgpKX0pKTt0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodCkudGhlbihlKX1fZm9ybWF0U3RlcCh0KXtyZXR1cm4gbXkoIiwiKSh0KX19O0Y3dC50ZW1wbGF0ZT1fZWAKICAgIDx0Zi1jYXJkLWhlYWRpbmcgcnVuPSJbW3J1bl1dIiB0YWc9IltbdGFnXV0iIGNvbG9yPSJbW19ydW5Db2xvcl1dIj4KICAgIDwvdGYtY2FyZC1oZWFkaW5nPgogICAgPHBhcGVyLW1hdGVyaWFsCiAgICAgIGVsZXZhdGlvbj0iMSIKICAgICAgaWQ9InN0ZXBzLWNvbnRhaW5lciIKICAgICAgY2xhc3M9ImNvbnRhaW5lciBzY3JvbGxiYXIiCiAgICA+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3RleHRzXV0iPgogICAgICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGNsYXNzPSJzdGVwLWNvbnRhaW5lciI+CiAgICAgICAgICBzdGVwIDxzcGFuIGNsYXNzPSJzdGVwLXZhbHVlIj5bW19mb3JtYXRTdGVwKGl0ZW0uc3RlcCldXTwvc3Bhbj4KICAgICAgICA8L3BhcGVyLW1hdGVyaWFsPgogICAgICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGNsYXNzPSJ0ZXh0Ij4KICAgICAgICAgIDx0Zi1tYXJrZG93bi12aWV3IGh0bWw9IltbaXRlbS50ZXh0XV0iPjwvdGYtbWFya2Rvd24tdmlldz4KICAgICAgICA8L3BhcGVyLW1hdGVyaWFsPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9wYXBlci1tYXRlcmlhbD4KICAgIDxzdHlsZSBpbmNsdWRlPSJzY3JvbGxiYXItc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICAgIC5zY3JvbGxiYXIgewogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KICAgICAgI3N0ZXBzLWNvbnRhaW5lciB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIC8qIGNvbG9yIGNvbXB1dGVkIGFuZCBzZXQgYXMgaW5saW5lIHN0eWxlICovOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1heC1oZWlnaHQ6IDUwMHB4OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IDEwcHg7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS10Yi10ZXh0LWxvYWRlci1vdXRsaW5lKTsKICAgICAgfQogICAgICAudGV4dCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDsKICAgICAgICBib3JkZXItcmFkaXVzOiAwIDNweCAzcHggM3B4OwogICAgICAgIHBhZGRpbmc6IDVweDsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIC5zdGVwLWNvbnRhaW5lciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgICBib3JkZXItYm90dG9tOiBub25lOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweCAzcHggMCAwOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXRiLXVpLWJvcmRlcik7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7IC8qIHRvIGNvcnJlY3QgZm9yIGJvcmRlciAqLwogICAgICAgIHBhZGRpbmc6IDNweDsKICAgICAgfQogICAgICAuc3RlcC1jb250YWluZXI6bm90KDpmaXJzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi10b3A6IDE1cHg7CiAgICAgIH0KCiAgICAgIHRmLWNhcmQtaGVhZGluZyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLEY3dC5wcm90b3R5cGUsInJ1biIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxGN3QucHJvdG90eXBlLCJ0YWciLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLEY3dC5wcm90b3R5cGUsIl90ZXh0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixkcildLEY3dC5wcm90b3R5cGUsInJlcXVlc3RNYW5hZ2VyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLFhSKV0sRjd0LnByb3RvdHlwZSwiX2NhbmNlbGxlciIsdm9pZCAwKSx0KFtzKCJydW4iKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxGN3QucHJvdG90eXBlLCJfcnVuQ29sb3IiLG51bGwpLHQoW2EoIl9ydW5Db2xvciIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sRjd0LnByb3RvdHlwZSwiX2NoYW5nZVJ1bkNvbG9yIixudWxsKSxGN3Q9dChbaSgidGYtdGV4dC1sb2FkZXIiKV0sRjd0KTtsZXQgVjd0PWNsYXNzIGV4dGVuZHMoZXIoeWUpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5yZWxvYWRPblJlYWR5PSEwLHRoaXMuX3JlcXVlc3RNYW5hZ2VyPW5ldyBkcn1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5yZWxvYWRPblJlYWR5JiZ0aGlzLnJlbG9hZCgpfXJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCgpPT57dGhpcy5fcmVsb2FkVGV4dHMoKX0pKX1fc2hvdWxkT3Blbih0KXtyZXR1cm4gdDw9Mn1fZmV0Y2hUYWdzKCl7Y29uc3QgdD1fcigpLnBsdWdpblJvdXRlKCJ0ZXh0IiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0KS50aGVuKCh0PT57aWYoU2UuZXhwb3J0cy5pc0VxdWFsKHQsdGhpcy5fcnVuVG9UYWcpKXJldHVybjtjb25zdCBlPWFyKHQpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09ZS5sZW5ndGgpLHRoaXMuc2V0KCJfcnVuVG9UYWciLHQpLHRoaXMuYXN5bmMoKCgpPT57dGhpcy5zZXQoIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCEwKX0pKX0pKX1fcmVsb2FkVGV4dHMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtdGV4dC1sb2FkZXIiKS5mb3JFYWNoKCh0PT57dC5yZWxvYWQoKX0pKX1nZXQgX2NhdGVnb3JpZXMoKXtyZXR1cm4gTXIodGhpcy5fcnVuVG9UYWcsdGhpcy5fc2VsZWN0ZWRSdW5zLHRoaXMuX3RhZ0ZpbHRlcil9fTtWN3QudGVtcGxhdGU9X2VgCiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHRleHQgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IHRleHQgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiCiAgICAgICAgICAgICAgICA+UkVBRE1FPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIgogICAgICAgICAgICAgICAgPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hCiAgICAgICAgICAgICAgPi4KICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyIKICAgICAgICAgICAgICAgID50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcKICAgICAgICAgICAgICBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIgogICAgICAgICAgICAgIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLXRleHQtbG9hZGVyCiAgICAgICAgICAgICAgICAgIGFjdGl2ZT0iW1thY3RpdmVdXSIKICAgICAgICAgICAgICAgICAgdGFnPSJbW2l0ZW0udGFnXV0iCiAgICAgICAgICAgICAgICAgIHJ1bj0iW1tpdGVtLnJ1bl1dIgogICAgICAgICAgICAgICAgICByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iCiAgICAgICAgICAgICAgICA+PC90Zi10ZXh0LWxvYWRlcj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxWN3QucHJvdG90eXBlLCJyZWxvYWRPblJlYWR5Iix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxWN3QucHJvdG90eXBlLCJfc2VsZWN0ZWRSdW5zIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFY3dC5wcm90b3R5cGUsIl9ydW5Ub1RhZyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFY3dC5wcm90b3R5cGUsIl9kYXRhTm90Rm91bmQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sVjd0LnByb3RvdHlwZSwiX3RhZ0ZpbHRlciIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFY3dC5wcm90b3R5cGUsIl9jYXRlZ29yaWVzRG9tUmVhZHkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sVjd0LnByb3RvdHlwZSwiX3JlcXVlc3RNYW5hZ2VyIix2b2lkIDApLHQoW3MoIl9ydW5Ub1RhZyIsIl9zZWxlY3RlZFJ1bnMiLCJfdGFnRmlsdGVyIiwiX2NhdGVnb3JpZXNEb21SZWFkeSIpLGUoImRlc2lnbjp0eXBlIixBcnJheSksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sVjd0LnByb3RvdHlwZSwiX2NhdGVnb3JpZXMiLG51bGwpLFY3dD10KFtpKCJ0Zi10ZXh0LWRhc2hib2FyZCIpXSxWN3QpO2xldCBVN3Q9Y2xhc3MgZXh0ZW5kcyB5ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fdGVtcGxhdGU9bnVsbCx0aGlzLnRmX2JhY2tlbmQ9U0N0fX07VTd0PXQoW2koInRmLWJhY2tlbmQiKV0sVTd0KTtsZXQgajd0PWNsYXNzIGV4dGVuZHMgeWV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX3RlbXBsYXRlPW51bGwsdGhpcy50Zl9nbG9iYWxzPUVzfX07ajd0PXQoW2koInRmLWdsb2JhbHMiKV0sajd0KTtsZXQgRzd0PWNsYXNzIGV4dGVuZHMgeWV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX3RlbXBsYXRlPW51bGwsdGhpcy50Zl9zdG9yYWdlPUlDdH19O0c3dD10KFtpKCJ0Zi1zdG9yYWdlIildLEc3dCk7dmFyIFc3dD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxhZGRMaW1pdExpc3RlbmVyOmxsLHJlbW92ZUxpbWl0TGlzdGVuZXI6Y2wsZ2V0TGltaXQ6dWwsc2V0TGltaXQ6ZnVuY3Rpb24gcTd0KHQpe2lmKHQhPT1NYXRoLmZsb29yKHQpKXRocm93IG5ldyBFcnJvcihgbGltaXQgbXVzdCBiZSBhbiBpbnRlZ2VyLCBidXQgZ290OiAke3R9YCk7aWYodDw9MCl0aHJvdyBuZXcgRXJyb3IoYGxpbWl0IG11c3QgYmUgcG9zaXRpdmUsIGJ1dCBnb3Q6ICR7dH1gKTt0IT09YWwmJihhbD10LGpzKG9sLGFsLHt1c2VMb2NhbFN0b3JhZ2U6ITB9KSxzbC5mb3JFYWNoKCh0PT57dCgpfSkpKX0sVGZEb21SZXBlYXQ6ZGx9KTtsZXQgWTd0PWNsYXNzIGV4dGVuZHMgeWV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX3RlbXBsYXRlPW51bGwsdGhpcy50Zl9wYWdpbmF0ZWRfdmlldz1XN3R9fTtZN3Q9dChbaSgidGYtcGFnaW5hdGVkLXZpZXctc3RvcmUiKV0sWTd0KTtsZXQgWDd0PWNsYXNzIGV4dGVuZHMgeWV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX3RlbXBsYXRlPW51bGwsdGhpcy5ydW5zQ29sb3JTY2FsZT1HUn19O1g3dD10KFtpKCJ0Zi1jb2xvci1zY2FsZSIpXSxYN3QpfSkoKTsKCiEoZnVuY3Rpb24oKXsKLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4KCiAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKICAgIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC4KCiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSAogICAgUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCiAgICBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsCiAgICBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00KICAgIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCiAgICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAgICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KdmFyIHQ9ZnVuY3Rpb24oZSxuKXtyZXR1cm4odD1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSYmKHRbbl09ZVtuXSl9KShlLG4pfTtmdW5jdGlvbiBlKGUsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4mJm51bGwhPT1uKXRocm93IG5ldyBUeXBlRXJyb3IoIkNsYXNzIGV4dGVuZHMgdmFsdWUgIitTdHJpbmcobikrIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsIik7ZnVuY3Rpb24gbygpe3RoaXMuY29uc3RydWN0b3I9ZX10KGUsbiksZS5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKTooby5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IG8pfWZ1bmN0aW9uIG4odCxlKXt2YXIgbixvLGksYSxyPXtsYWJlbDowLHNlbnQ6ZnVuY3Rpb24oKXtpZigxJmlbMF0pdGhyb3cgaVsxXTtyZXR1cm4gaVsxXX0sdHJ5czpbXSxvcHM6W119O3JldHVybiBhPXtuZXh0OnMoMCksdGhyb3c6cygxKSxyZXR1cm46cygyKX0sImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKGFbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSksYTtmdW5jdGlvbiBzKGEpe3JldHVybiBmdW5jdGlvbihzKXtyZXR1cm4oZnVuY3Rpb24gbChhKXtpZihuKXRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4iKTtmb3IoO3I7KXRyeXtpZihuPTEsbyYmKGk9MiZhWzBdP28ucmV0dXJuOmFbMF0/by50aHJvd3x8KChpPW8ucmV0dXJuKSYmaS5jYWxsKG8pLDApOm8ubmV4dCkmJiEoaT1pLmNhbGwobyxhWzFdKSkuZG9uZSlyZXR1cm4gaTtzd2l0Y2gobz0wLGkmJihhPVsyJmFbMF0saS52YWx1ZV0pLGFbMF0pe2Nhc2UgMDpjYXNlIDE6aT1hO2JyZWFrO2Nhc2UgNDpyZXR1cm4gci5sYWJlbCsrLHt2YWx1ZTphWzFdLGRvbmU6ITF9O2Nhc2UgNTpyLmxhYmVsKyssbz1hWzFdLGE9WzBdO2NvbnRpbnVlO2Nhc2UgNzphPXIub3BzLnBvcCgpLHIudHJ5cy5wb3AoKTtjb250aW51ZTtkZWZhdWx0OmlmKCEoKGk9KGk9ci50cnlzKS5sZW5ndGg+MCYmaVtpLmxlbmd0aC0xXSl8fDYhPT1hWzBdJiYyIT09YVswXSkpe3I9MDtjb250aW51ZX1pZigzPT09YVswXSYmKCFpfHxhWzFdPmlbMF0mJmFbMV08aVszXSkpe3IubGFiZWw9YVsxXTticmVha31pZig2PT09YVswXSYmci5sYWJlbDxpWzFdKXtyLmxhYmVsPWlbMV0saT1hO2JyZWFrfWlmKGkmJnIubGFiZWw8aVsyXSl7ci5sYWJlbD1pWzJdLHIub3BzLnB1c2goYSk7YnJlYWt9aVsyXSYmci5vcHMucG9wKCksci50cnlzLnBvcCgpO2NvbnRpbnVlfWE9ZS5jYWxsKHQscil9Y2F0Y2godCl7YT1bNix0XSxvPTB9ZmluYWxseXtuPWk9MH1pZig1JmFbMF0pdGhyb3cgYVsxXTtyZXR1cm57dmFsdWU6YVswXT9hWzFdOnZvaWQgMCxkb25lOiEwfX0pKFthLHNdKX19fWZ1bmN0aW9uIG8odCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yLG49ZSYmdFtlXSxvPTA7aWYobilyZXR1cm4gbi5jYWxsKHQpO2lmKHQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgpcmV0dXJue25leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdCYmbz49dC5sZW5ndGgmJih0PXZvaWQgMCkse3ZhbHVlOnQmJnRbbysrXSxkb25lOiF0fX19O3Rocm93IG5ldyBUeXBlRXJyb3IoZT8iT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS4iOiJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuIil9ZnVuY3Rpb24gaSh0LGUpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnRbU3ltYm9sLml0ZXJhdG9yXTtpZighbilyZXR1cm4gdDt2YXIgbyxpLGE9bi5jYWxsKHQpLHI9W107dHJ5e2Zvcig7KHZvaWQgMD09PWV8fGUtLSA+MCkmJiEobz1hLm5leHQoKSkuZG9uZTspci5wdXNoKG8udmFsdWUpfWNhdGNoKHQpe2k9e2Vycm9yOnR9fWZpbmFsbHl7dHJ5e28mJiFvLmRvbmUmJihuPWEucmV0dXJuKSYmbi5jYWxsKGEpfWZpbmFsbHl7aWYoaSl0aHJvdyBpLmVycm9yfX1yZXR1cm4gcn1mdW5jdGlvbiBhKHQsZSl7Zm9yKHZhciBuPTAsbz1lLmxlbmd0aCxpPXQubGVuZ3RoO248bztuKyssaSsrKXRbaV09ZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiByKHQpe3JldHVybiB0aGlzIGluc3RhbmNlb2Ygcj8odGhpcy52PXQsdGhpcyk6bmV3IHIodCl9ZnVuY3Rpb24gcyh0LGUsbil7aWYoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpO3ZhciBvLGk9bi5hcHBseSh0LGV8fFtdKSxhPVtdO3JldHVybiBvPXt9LHMoIm5leHQiKSxzKCJ0aHJvdyIpLHMoInJldHVybiIpLG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LG87ZnVuY3Rpb24gcyh0KXtpW3RdJiYob1t0XT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG4sbyl7YS5wdXNoKFt0LGUsbixvXSk+MXx8bCh0LGUpfSkpfSl9ZnVuY3Rpb24gbCh0LGUpe3RyeXshKGZ1bmN0aW9uIG4odCl7dC52YWx1ZSBpbnN0YW5jZW9mIHI/UHJvbWlzZS5yZXNvbHZlKHQudmFsdWUudikudGhlbihjLGQpOnAoYVswXVsyXSx0KX0pKGlbdF0oZSkpfWNhdGNoKHQpe3AoYVswXVszXSx0KX19ZnVuY3Rpb24gYyh0KXtsKCJuZXh0Iix0KX1mdW5jdGlvbiBkKHQpe2woInRocm93Iix0KX1mdW5jdGlvbiBwKHQsZSl7dChlKSxhLnNoaWZ0KCksYS5sZW5ndGgmJmwoYVswXVswXSxhWzBdWzFdKX19ZnVuY3Rpb24gbCh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH1mdW5jdGlvbiBjKHQpe3ZhciBlPXQoKGZ1bmN0aW9uKHQpe0Vycm9yLmNhbGwodCksdC5zdGFjaz0obmV3IEVycm9yKS5zdGFja30pKTtyZXR1cm4gZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZX12YXIgZD1jKChmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24gZShuKXt0KHRoaXMpLHRoaXMubWVzc2FnZT1uP24ubGVuZ3RoKyIgZXJyb3JzIG9jY3VycmVkIGR1cmluZyB1bnN1YnNjcmlwdGlvbjpcbiIrbi5tYXAoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUrMSsiKSAiK3QudG9TdHJpbmcoKX0pKS5qb2luKCJcbiAgIik6IiIsdGhpcy5uYW1lPSJVbnN1YnNjcmlwdGlvbkVycm9yIix0aGlzLmVycm9ycz1ufX0pKTtmdW5jdGlvbiBwKHQsZSl7aWYodCl7dmFyIG49dC5pbmRleE9mKGUpOzA8PW4mJnQuc3BsaWNlKG4sMSl9fXZhciBtPShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5pbml0aWFsVGVhcmRvd249dCx0aGlzLmNsb3NlZD0hMSx0aGlzLl9wYXJlbnRhZ2U9bnVsbCx0aGlzLl90ZWFyZG93bnM9bnVsbH1yZXR1cm4gdC5wcm90b3R5cGUudW5zdWJzY3JpYmU9ZnVuY3Rpb24oKXt2YXIgdCxlLG4scixzO2lmKCF0aGlzLmNsb3NlZCl7dGhpcy5jbG9zZWQ9ITA7dmFyIGM9dGhpcy5fcGFyZW50YWdlO2lmKGMpaWYodGhpcy5fcGFyZW50YWdlPW51bGwsQXJyYXkuaXNBcnJheShjKSl0cnl7Zm9yKHZhciBwPW8oYyksbT1wLm5leHQoKTshbS5kb25lO209cC5uZXh0KCkpbS52YWx1ZS5yZW1vdmUodGhpcyl9Y2F0Y2goZSl7dD17ZXJyb3I6ZX19ZmluYWxseXt0cnl7bSYmIW0uZG9uZSYmKGU9cC5yZXR1cm4pJiZlLmNhbGwocCl9ZmluYWxseXtpZih0KXRocm93IHQuZXJyb3J9fWVsc2UgYy5yZW1vdmUodGhpcyk7dmFyIHU9dGhpcy5pbml0aWFsVGVhcmRvd247aWYobCh1KSl0cnl7dSgpfWNhdGNoKHQpe3M9dCBpbnN0YW5jZW9mIGQ/dC5lcnJvcnM6W3RdfXZhciBmPXRoaXMuX3RlYXJkb3ducztpZihmKXt0aGlzLl90ZWFyZG93bnM9bnVsbDt0cnl7Zm9yKHZhciBoPW8oZiksYj1oLm5leHQoKTshYi5kb25lO2I9aC5uZXh0KCkpe3ZhciB5PWIudmFsdWU7dHJ5e2coeSl9Y2F0Y2godCl7cz1udWxsIT1zP3M6W10sdCBpbnN0YW5jZW9mIGQ/cz1hKGEoW10saShzKSksaSh0LmVycm9ycykpOnMucHVzaCh0KX19fWNhdGNoKHQpe249e2Vycm9yOnR9fWZpbmFsbHl7dHJ5e2ImJiFiLmRvbmUmJihyPWgucmV0dXJuKSYmci5jYWxsKGgpfWZpbmFsbHl7aWYobil0aHJvdyBuLmVycm9yfX19aWYocyl0aHJvdyBuZXcgZChzKX19LHQucHJvdG90eXBlLmFkZD1mdW5jdGlvbihlKXt2YXIgbjtpZihlJiZlIT09dGhpcylpZih0aGlzLmNsb3NlZClnKGUpO2Vsc2V7aWYoZSBpbnN0YW5jZW9mIHQpe2lmKGUuY2xvc2VkfHxlLl9oYXNQYXJlbnQodGhpcykpcmV0dXJuO2UuX2FkZFBhcmVudCh0aGlzKX0odGhpcy5fdGVhcmRvd25zPW51bGwhPT0obj10aGlzLl90ZWFyZG93bnMpJiZ2b2lkIDAhPT1uP246W10pLnB1c2goZSl9fSx0LnByb3RvdHlwZS5faGFzUGFyZW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3BhcmVudGFnZTtyZXR1cm4gZT09PXR8fEFycmF5LmlzQXJyYXkoZSkmJmUuaW5jbHVkZXModCl9LHQucHJvdG90eXBlLl9hZGRQYXJlbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcGFyZW50YWdlO3RoaXMuX3BhcmVudGFnZT1BcnJheS5pc0FycmF5KGUpPyhlLnB1c2godCksZSk6ZT9bZSx0XTp0fSx0LnByb3RvdHlwZS5fcmVtb3ZlUGFyZW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3BhcmVudGFnZTtlPT09dD90aGlzLl9wYXJlbnRhZ2U9bnVsbDpBcnJheS5pc0FycmF5KGUpJiZwKGUsdCl9LHQucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihlKXt2YXIgbj10aGlzLl90ZWFyZG93bnM7biYmcChuLGUpLGUgaW5zdGFuY2VvZiB0JiZlLl9yZW1vdmVQYXJlbnQodGhpcyl9LHQuRU1QVFk9KGZ1bmN0aW9uKCl7dmFyIGU9bmV3IHQ7cmV0dXJuIGUuY2xvc2VkPSEwLGV9KSgpLHR9KSgpLHU9bS5FTVBUWTtmdW5jdGlvbiBmKHQpe3JldHVybiB0IGluc3RhbmNlb2YgbXx8dCYmImNsb3NlZCJpbiB0JiZsKHQucmVtb3ZlKSYmbCh0LmFkZCkmJmwodC51bnN1YnNjcmliZSl9ZnVuY3Rpb24gZyh0KXtsKHQpP3QoKTp0LnVuc3Vic2NyaWJlKCl9dmFyIGg9e3NldFRpbWVvdXQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07dmFyIG49aC5kZWxlZ2F0ZTtyZXR1cm4oKG51bGw9PW4/dm9pZCAwOm4uc2V0VGltZW91dCl8fHNldFRpbWVvdXQpLmFwcGx5KHZvaWQgMCxhKFtdLGkodCkpKX0sY2xlYXJUaW1lb3V0OmZ1bmN0aW9uKHQpe3ZhciBlPWguZGVsZWdhdGU7cmV0dXJuKChudWxsPT1lP3ZvaWQgMDplLmNsZWFyVGltZW91dCl8fGNsZWFyVGltZW91dCkodCl9LGRlbGVnYXRlOnZvaWQgMH07ZnVuY3Rpb24gYih0KXtoLnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dGhyb3cgdH0pKX1mdW5jdGlvbiB5KCl7fWZ1bmN0aW9uIF8odCl7dCgpfXZhciBDPShmdW5jdGlvbih0KXtmdW5jdGlvbiBuKGUpe3ZhciBuPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gbi5pc1N0b3BwZWQ9ITEsZT8obi5kZXN0aW5hdGlvbj1lLGYoZSkmJmUuYWRkKG4pKTpuLmRlc3RpbmF0aW9uPU8sbn1yZXR1cm4gZShuLHQpLG4uY3JlYXRlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbmV3IE0odCxlLG4pfSxuLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKHQpe3RoaXMuaXNTdG9wcGVkfHx0aGlzLl9uZXh0KHQpfSxuLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbih0KXt0aGlzLmlzU3RvcHBlZHx8KHRoaXMuaXNTdG9wcGVkPSEwLHRoaXMuX2Vycm9yKHQpKX0sbi5wcm90b3R5cGUuY29tcGxldGU9ZnVuY3Rpb24oKXt0aGlzLmlzU3RvcHBlZHx8KHRoaXMuaXNTdG9wcGVkPSEwLHRoaXMuX2NvbXBsZXRlKCkpfSxuLnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbigpe3RoaXMuY2xvc2VkfHwodGhpcy5pc1N0b3BwZWQ9ITAsdC5wcm90b3R5cGUudW5zdWJzY3JpYmUuY2FsbCh0aGlzKSx0aGlzLmRlc3RpbmF0aW9uPW51bGwpfSxuLnByb3RvdHlwZS5fbmV4dD1mdW5jdGlvbih0KXt0aGlzLmRlc3RpbmF0aW9uLm5leHQodCl9LG4ucHJvdG90eXBlLl9lcnJvcj1mdW5jdGlvbih0KXt0cnl7dGhpcy5kZXN0aW5hdGlvbi5lcnJvcih0KX1maW5hbGx5e3RoaXMudW5zdWJzY3JpYmUoKX19LG4ucHJvdG90eXBlLl9jb21wbGV0ZT1mdW5jdGlvbigpe3RyeXt0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCl9ZmluYWxseXt0aGlzLnVuc3Vic2NyaWJlKCl9fSxufSkobSksTT0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlLG4sbyl7dmFyIGksYT10LmNhbGwodGhpcyl8fHRoaXM7aWYobChlKSlpPWU7ZWxzZSBpZihlKXt2YXIgcjtuPWUuZXJyb3Isbz1lLmNvbXBsZXRlLHI9ZSxpPW51bGw9PShpPWUubmV4dCk/dm9pZCAwOmkuYmluZChyKSxuPW51bGw9PW4/dm9pZCAwOm4uYmluZChyKSxvPW51bGw9PW8/dm9pZCAwOm8uYmluZChyKX1yZXR1cm4gYS5kZXN0aW5hdGlvbj17bmV4dDppP3YoaSk6eSxlcnJvcjp2KG51bGwhPW4/bjp4KSxjb21wbGV0ZTpvP3Yobyk6eX0sYX1yZXR1cm4gZShuLHQpLG59KShDKTtmdW5jdGlvbiB2KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWVbbl09YXJndW1lbnRzW25dO3RyeXt0LmFwcGx5KHZvaWQgMCxhKFtdLGkoZSkpKX1jYXRjaCh0KXtiKHQpfX19ZnVuY3Rpb24geCh0KXt0aHJvdyB0fXZhciBPPXtjbG9zZWQ6ITAsbmV4dDp5LGVycm9yOngsY29tcGxldGU6eX0sUD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wub2JzZXJ2YWJsZXx8IkBAb2JzZXJ2YWJsZSI7ZnVuY3Rpb24gdyh0KXtyZXR1cm4gdH1mdW5jdGlvbiBrKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3JldHVybiBTKHQpfWZ1bmN0aW9uIFModCl7cmV0dXJuIDA9PT10Lmxlbmd0aD93OjE9PT10Lmxlbmd0aD90WzBdOmZ1bmN0aW9uIGUobil7cmV0dXJuIHQucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBlKHQpfSksbil9fXZhciBEPShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dCYmKHRoaXMuX3N1YnNjcmliZT10KX1yZXR1cm4gdC5wcm90b3R5cGUubGlmdD1mdW5jdGlvbihlKXt2YXIgbj1uZXcgdDtyZXR1cm4gbi5zb3VyY2U9dGhpcyxuLm9wZXJhdG9yPWUsbn0sdC5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgbz10aGlzLGk9KGZ1bmN0aW9uIGEodCl7cmV0dXJuIHQmJnQgaW5zdGFuY2VvZiBDfHwoZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCYmbCh0Lm5leHQpJiZsKHQuZXJyb3IpJiZsKHQuY29tcGxldGUpfSkodCkmJmYodCl9KSh0KT90Om5ldyBNKHQsZSxuKTtyZXR1cm4gXygoZnVuY3Rpb24oKXt2YXIgdD1vLm9wZXJhdG9yLGU9by5zb3VyY2U7aS5hZGQodD90LmNhbGwoaSxlKTplP28uX3N1YnNjcmliZShpKTpvLl90cnlTdWJzY3JpYmUoaSkpfSkpLGl9LHQucHJvdG90eXBlLl90cnlTdWJzY3JpYmU9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiB0aGlzLl9zdWJzY3JpYmUodCl9Y2F0Y2goZSl7dC5lcnJvcihlKX19LHQucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3JldHVybiBuZXcoZT1FKGUpKSgoZnVuY3Rpb24oZSxvKXt2YXIgaTtpPW4uc3Vic2NyaWJlKChmdW5jdGlvbihlKXt0cnl7dChlKX1jYXRjaCh0KXtvKHQpLG51bGw9PWl8fGkudW5zdWJzY3JpYmUoKX19KSxvLGUpfSkpfSx0LnByb3RvdHlwZS5fc3Vic2NyaWJlPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiBudWxsPT09KGU9dGhpcy5zb3VyY2UpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnN1YnNjcmliZSh0KX0sdC5wcm90b3R5cGVbUF09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUucGlwZT1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTtyZXR1cm4gUyh0KSh0aGlzKX0sdC5wcm90b3R5cGUudG9Qcm9taXNlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7cmV0dXJuIG5ldyh0PUUodCkpKChmdW5jdGlvbih0LG4pe3ZhciBvO2Uuc3Vic2NyaWJlKChmdW5jdGlvbih0KXtyZXR1cm4gbz10fSksKGZ1bmN0aW9uKHQpe3JldHVybiBuKHQpfSksKGZ1bmN0aW9uKCl7cmV0dXJuIHQobyl9KSl9KSl9LHQuY3JlYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdChlKX0sdH0pKCk7ZnVuY3Rpb24gRSh0KXt2YXIgZTtyZXR1cm4gbnVsbCE9PShlPW51bGwhPXQ/dDp1bmRlZmluZWQpJiZ2b2lkIDAhPT1lP2U6UHJvbWlzZX1mdW5jdGlvbiBSKHQpe3JldHVybiBmdW5jdGlvbihlKXtpZigoZnVuY3Rpb24gbih0KXtyZXR1cm4gbChudWxsPT10P3ZvaWQgMDp0LmxpZnQpfSkoZSkpcmV0dXJuIGUubGlmdCgoZnVuY3Rpb24oZSl7dHJ5e3JldHVybiB0KGUsdGhpcyl9Y2F0Y2godCl7dGhpcy5lcnJvcih0KX19KSk7dGhyb3cgbmV3IFR5cGVFcnJvcigiVW5hYmxlIHRvIGxpZnQgdW5rbm93biBPYnNlcnZhYmxlIHR5cGUiKX19dmFyIEEsVD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlLG4sbyxpLGEpe3ZhciByPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiByLm9uRmluYWxpemU9YSxyLl9uZXh0PW4/ZnVuY3Rpb24odCl7dHJ5e24odCl9Y2F0Y2godCl7ZS5lcnJvcih0KX19OnQucHJvdG90eXBlLl9uZXh0LHIuX2Vycm9yPWk/ZnVuY3Rpb24odCl7dHJ5e2kodCl9Y2F0Y2godCl7ZS5lcnJvcih0KX1maW5hbGx5e3RoaXMudW5zdWJzY3JpYmUoKX19OnQucHJvdG90eXBlLl9lcnJvcixyLl9jb21wbGV0ZT1vP2Z1bmN0aW9uKCl7dHJ5e28oKX1jYXRjaCh0KXtlLmVycm9yKHQpfWZpbmFsbHl7dGhpcy51bnN1YnNjcmliZSgpfX06dC5wcm90b3R5cGUuX2NvbXBsZXRlLHJ9cmV0dXJuIGUobix0KSxuLnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbigpe3ZhciBlLG49dGhpcy5jbG9zZWQ7dC5wcm90b3R5cGUudW5zdWJzY3JpYmUuY2FsbCh0aGlzKSwhbiYmKG51bGw9PT0oZT10aGlzLm9uRmluYWxpemUpfHx2b2lkIDA9PT1lfHxlLmNhbGwodGhpcykpfSxufSkoQyksTj17c2NoZWR1bGU6ZnVuY3Rpb24odCl7dmFyIGU9cmVxdWVzdEFuaW1hdGlvbkZyYW1lLG49Y2FuY2VsQW5pbWF0aW9uRnJhbWUsbz1OLmRlbGVnYXRlO28mJihlPW8ucmVxdWVzdEFuaW1hdGlvbkZyYW1lLG49by5jYW5jZWxBbmltYXRpb25GcmFtZSk7dmFyIGk9ZSgoZnVuY3Rpb24oZSl7bj12b2lkIDAsdChlKX0pKTtyZXR1cm4gbmV3IG0oKGZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PW4/dm9pZCAwOm4oaSl9KSl9LHJlcXVlc3RBbmltYXRpb25GcmFtZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTt2YXIgbj1OLmRlbGVnYXRlO3JldHVybigobnVsbD09bj92b2lkIDA6bi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpfHxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUpLmFwcGx5KHZvaWQgMCxhKFtdLGkodCkpKX0sY2FuY2VsQW5pbWF0aW9uRnJhbWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07dmFyIG49Ti5kZWxlZ2F0ZTtyZXR1cm4oKG51bGw9PW4/dm9pZCAwOm4uY2FuY2VsQW5pbWF0aW9uRnJhbWUpfHxjYW5jZWxBbmltYXRpb25GcmFtZSkuYXBwbHkodm9pZCAwLGEoW10saSh0KSkpfSxkZWxlZ2F0ZTp2b2lkIDB9LHo9YygoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uIGUoKXt0KHRoaXMpLHRoaXMubmFtZT0iT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IiLHRoaXMubWVzc2FnZT0ib2JqZWN0IHVuc3Vic2NyaWJlZCJ9fSkpLEk9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4oKXt2YXIgZT10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIGUuY2xvc2VkPSExLGUub2JzZXJ2ZXJzPVtdLGUuaXNTdG9wcGVkPSExLGUuaGFzRXJyb3I9ITEsZS50aHJvd25FcnJvcj1udWxsLGV9cmV0dXJuIGUobix0KSxuLnByb3RvdHlwZS5saWZ0PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBIKHRoaXMsdGhpcyk7cmV0dXJuIGUub3BlcmF0b3I9dCxlfSxuLnByb3RvdHlwZS5fdGhyb3dJZkNsb3NlZD1mdW5jdGlvbigpe2lmKHRoaXMuY2xvc2VkKXRocm93IG5ldyB6fSxuLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7XygoZnVuY3Rpb24oKXt2YXIgbixpO2lmKGUuX3Rocm93SWZDbG9zZWQoKSwhZS5pc1N0b3BwZWQpe3ZhciBhPWUub2JzZXJ2ZXJzLnNsaWNlKCk7dHJ5e2Zvcih2YXIgcj1vKGEpLHM9ci5uZXh0KCk7IXMuZG9uZTtzPXIubmV4dCgpKXMudmFsdWUubmV4dCh0KX1jYXRjaCh0KXtuPXtlcnJvcjp0fX1maW5hbGx5e3RyeXtzJiYhcy5kb25lJiYoaT1yLnJldHVybikmJmkuY2FsbChyKX1maW5hbGx5e2lmKG4pdGhyb3cgbi5lcnJvcn19fX0pKX0sbi5wcm90b3R5cGUuZXJyb3I9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztfKChmdW5jdGlvbigpe2lmKGUuX3Rocm93SWZDbG9zZWQoKSwhZS5pc1N0b3BwZWQpe2UuaGFzRXJyb3I9ZS5pc1N0b3BwZWQ9ITAsZS50aHJvd25FcnJvcj10O2Zvcih2YXIgbj1lLm9ic2VydmVycztuLmxlbmd0aDspbi5zaGlmdCgpLmVycm9yKHQpfX0pKX0sbi5wcm90b3R5cGUuY29tcGxldGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO18oKGZ1bmN0aW9uKCl7aWYodC5fdGhyb3dJZkNsb3NlZCgpLCF0LmlzU3RvcHBlZCl7dC5pc1N0b3BwZWQ9ITA7Zm9yKHZhciBlPXQub2JzZXJ2ZXJzO2UubGVuZ3RoOyllLnNoaWZ0KCkuY29tcGxldGUoKX19KSl9LG4ucHJvdG90eXBlLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKCl7dGhpcy5pc1N0b3BwZWQ9dGhpcy5jbG9zZWQ9ITAsdGhpcy5vYnNlcnZlcnM9bnVsbH0sT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLCJvYnNlcnZlZCIse2dldDpmdW5jdGlvbigpe3ZhciB0O3JldHVybihudWxsPT09KHQ9dGhpcy5vYnNlcnZlcnMpfHx2b2lkIDA9PT10P3ZvaWQgMDp0Lmxlbmd0aCk+MH0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxuLnByb3RvdHlwZS5fdHJ5U3Vic2NyaWJlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl90aHJvd0lmQ2xvc2VkKCksdC5wcm90b3R5cGUuX3RyeVN1YnNjcmliZS5jYWxsKHRoaXMsZSl9LG4ucHJvdG90eXBlLl9zdWJzY3JpYmU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3Rocm93SWZDbG9zZWQoKSx0aGlzLl9jaGVja0ZpbmFsaXplZFN0YXR1c2VzKHQpLHRoaXMuX2lubmVyU3Vic2NyaWJlKHQpfSxuLnByb3RvdHlwZS5faW5uZXJTdWJzY3JpYmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWUub2JzZXJ2ZXJzO3JldHVybiBlLmhhc0Vycm9yfHxlLmlzU3RvcHBlZD91OihuLnB1c2godCksbmV3IG0oKGZ1bmN0aW9uKCl7cmV0dXJuIHAobix0KX0pKSl9LG4ucHJvdG90eXBlLl9jaGVja0ZpbmFsaXplZFN0YXR1c2VzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1lLmlzU3RvcHBlZDtlLmhhc0Vycm9yP3QuZXJyb3IoZS50aHJvd25FcnJvcik6biYmdC5jb21wbGV0ZSgpfSxuLnByb3RvdHlwZS5hc09ic2VydmFibGU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgRDtyZXR1cm4gdC5zb3VyY2U9dGhpcyx0fSxuLmNyZWF0ZT1mdW5jdGlvbih0LGUpe3JldHVybiBuZXcgSCh0LGUpfSxufSkoRCksSD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlLG4pe3ZhciBvPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gby5kZXN0aW5hdGlvbj1lLG8uc291cmNlPW4sb31yZXR1cm4gZShuLHQpLG4ucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24odCl7dmFyIGUsbjtudWxsPT09KG49bnVsbD09PShlPXRoaXMuZGVzdGluYXRpb24pfHx2b2lkIDA9PT1lP3ZvaWQgMDplLm5leHQpfHx2b2lkIDA9PT1ufHxuLmNhbGwoZSx0KX0sbi5wcm90b3R5cGUuZXJyb3I9ZnVuY3Rpb24odCl7dmFyIGUsbjtudWxsPT09KG49bnVsbD09PShlPXRoaXMuZGVzdGluYXRpb24pfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmVycm9yKXx8dm9pZCAwPT09bnx8bi5jYWxsKGUsdCl9LG4ucHJvdG90eXBlLmNvbXBsZXRlPWZ1bmN0aW9uKCl7dmFyIHQsZTtudWxsPT09KGU9bnVsbD09PSh0PXRoaXMuZGVzdGluYXRpb24pfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmNvbXBsZXRlKXx8dm9pZCAwPT09ZXx8ZS5jYWxsKHQpfSxuLnByb3RvdHlwZS5fc3Vic2NyaWJlPWZ1bmN0aW9uKHQpe3ZhciBlLG47cmV0dXJuIG51bGwhPT0obj1udWxsPT09KGU9dGhpcy5zb3VyY2UpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnN1YnNjcmliZSh0KSkmJnZvaWQgMCE9PW4/bjp1fSxufSkoSSksRj0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlKXt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4uX3ZhbHVlPWUsbn1yZXR1cm4gZShuLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSwidmFsdWUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRWYWx1ZSgpfSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLG4ucHJvdG90eXBlLl9zdWJzY3JpYmU9ZnVuY3Rpb24oZSl7dmFyIG49dC5wcm90b3R5cGUuX3N1YnNjcmliZS5jYWxsKHRoaXMsZSk7cmV0dXJuIW4uY2xvc2VkJiZlLm5leHQodGhpcy5fdmFsdWUpLG59LG4ucHJvdG90eXBlLmdldFZhbHVlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXQuX3ZhbHVlO2lmKHQuaGFzRXJyb3IpdGhyb3cgdC50aHJvd25FcnJvcjtyZXR1cm4gdGhpcy5fdGhyb3dJZkNsb3NlZCgpLGV9LG4ucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUubmV4dC5jYWxsKHRoaXMsdGhpcy5fdmFsdWU9ZSl9LG59KShJKSxMPXtub3c6ZnVuY3Rpb24oKXtyZXR1cm4oTC5kZWxlZ2F0ZXx8RGF0ZSkubm93KCl9LGRlbGVnYXRlOnZvaWQgMH0sQj0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlLG4sbyl7dm9pZCAwPT09ZSYmKGU9MS8wKSx2b2lkIDA9PT1uJiYobj0xLzApLHZvaWQgMD09PW8mJihvPUwpO3ZhciBpPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gaS5fYnVmZmVyU2l6ZT1lLGkuX3dpbmRvd1RpbWU9bixpLl90aW1lc3RhbXBQcm92aWRlcj1vLGkuX2J1ZmZlcj1bXSxpLl9pbmZpbml0ZVRpbWVXaW5kb3c9ITAsaS5faW5maW5pdGVUaW1lV2luZG93PW49PT0xLzAsaS5fYnVmZmVyU2l6ZT1NYXRoLm1heCgxLGUpLGkuX3dpbmRvd1RpbWU9TWF0aC5tYXgoMSxuKSxpfXJldHVybiBlKG4sdCksbi5wcm90b3R5cGUubmV4dD1mdW5jdGlvbihlKXt2YXIgbj10aGlzLG89bi5fYnVmZmVyLGk9bi5faW5maW5pdGVUaW1lV2luZG93LGE9bi5fdGltZXN0YW1wUHJvdmlkZXIscj1uLl93aW5kb3dUaW1lO24uaXNTdG9wcGVkfHwoby5wdXNoKGUpLCFpJiZvLnB1c2goYS5ub3coKStyKSksdGhpcy5fdHJpbUJ1ZmZlcigpLHQucHJvdG90eXBlLm5leHQuY2FsbCh0aGlzLGUpfSxuLnByb3RvdHlwZS5fc3Vic2NyaWJlPWZ1bmN0aW9uKHQpe3RoaXMuX3Rocm93SWZDbG9zZWQoKSx0aGlzLl90cmltQnVmZmVyKCk7Zm9yKHZhciBlPXRoaXMuX2lubmVyU3Vic2NyaWJlKHQpLG49dGhpcy5faW5maW5pdGVUaW1lV2luZG93LG89dGhpcy5fYnVmZmVyLnNsaWNlKCksaT0wO2k8by5sZW5ndGgmJiF0LmNsb3NlZDtpKz1uPzE6Mil0Lm5leHQob1tpXSk7cmV0dXJuIHRoaXMuX2NoZWNrRmluYWxpemVkU3RhdHVzZXModCksZX0sbi5wcm90b3R5cGUuX3RyaW1CdWZmZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dC5fYnVmZmVyU2l6ZSxuPXQuX3RpbWVzdGFtcFByb3ZpZGVyLG89dC5fYnVmZmVyLGk9dC5faW5maW5pdGVUaW1lV2luZG93LGE9KGk/MToyKSplO2lmKGU8MS8wJiZhPG8ubGVuZ3RoJiZvLnNwbGljZSgwLG8ubGVuZ3RoLWEpLCFpKXtmb3IodmFyIHI9bi5ub3coKSxzPTAsbD0xO2w8by5sZW5ndGgmJm9bbF08PXI7bCs9MilzPWw7cyYmby5zcGxpY2UoMCxzKzEpfX0sbn0pKEkpLFY9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4oZSxuKXtyZXR1cm4gdC5jYWxsKHRoaXMpfHx0aGlzfXJldHVybiBlKG4sdCksbi5wcm90b3R5cGUuc2NoZWR1bGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpc30sbn0pKG0pLGo9e3NldEludGVydmFsOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3ZhciBuPWouZGVsZWdhdGU7cmV0dXJuKChudWxsPT1uP3ZvaWQgMDpuLnNldEludGVydmFsKXx8c2V0SW50ZXJ2YWwpLmFwcGx5KHZvaWQgMCxhKFtdLGkodCkpKX0sY2xlYXJJbnRlcnZhbDpmdW5jdGlvbih0KXt2YXIgZT1qLmRlbGVnYXRlO3JldHVybigobnVsbD09ZT92b2lkIDA6ZS5jbGVhckludGVydmFsKXx8Y2xlYXJJbnRlcnZhbCkodCl9LGRlbGVnYXRlOnZvaWQgMH0sVT0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlLG4pe3ZhciBvPXQuY2FsbCh0aGlzLGUsbil8fHRoaXM7cmV0dXJuIG8uc2NoZWR1bGVyPWUsby53b3JrPW4sby5wZW5kaW5nPSExLG99cmV0dXJuIGUobix0KSxuLnByb3RvdHlwZS5zY2hlZHVsZT1mdW5jdGlvbih0LGUpe2lmKHZvaWQgMD09PWUmJihlPTApLHRoaXMuY2xvc2VkKXJldHVybiB0aGlzO3RoaXMuc3RhdGU9dDt2YXIgbj10aGlzLmlkLG89dGhpcy5zY2hlZHVsZXI7cmV0dXJuIG51bGwhPW4mJih0aGlzLmlkPXRoaXMucmVjeWNsZUFzeW5jSWQobyxuLGUpKSx0aGlzLnBlbmRpbmc9ITAsdGhpcy5kZWxheT1lLHRoaXMuaWQ9dGhpcy5pZHx8dGhpcy5yZXF1ZXN0QXN5bmNJZChvLHRoaXMuaWQsZSksdGhpc30sbi5wcm90b3R5cGUucmVxdWVzdEFzeW5jSWQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj0wKSxqLnNldEludGVydmFsKHQuZmx1c2guYmluZCh0LHRoaXMpLG4pfSxuLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZD1mdW5jdGlvbih0LGUsbil7aWYodm9pZCAwPT09biYmKG49MCksbnVsbCE9biYmdGhpcy5kZWxheT09PW4mJiExPT09dGhpcy5wZW5kaW5nKXJldHVybiBlO2ouY2xlYXJJbnRlcnZhbChlKX0sbi5wcm90b3R5cGUuZXhlY3V0ZT1mdW5jdGlvbih0LGUpe2lmKHRoaXMuY2xvc2VkKXJldHVybiBuZXcgRXJyb3IoImV4ZWN1dGluZyBhIGNhbmNlbGxlZCBhY3Rpb24iKTt0aGlzLnBlbmRpbmc9ITE7dmFyIG49dGhpcy5fZXhlY3V0ZSh0LGUpO2lmKG4pcmV0dXJuIG47ITE9PT10aGlzLnBlbmRpbmcmJm51bGwhPXRoaXMuaWQmJih0aGlzLmlkPXRoaXMucmVjeWNsZUFzeW5jSWQodGhpcy5zY2hlZHVsZXIsdGhpcy5pZCxudWxsKSl9LG4ucHJvdG90eXBlLl9leGVjdXRlPWZ1bmN0aW9uKHQsZSl7dmFyIG4sbz0hMTt0cnl7dGhpcy53b3JrKHQpfWNhdGNoKHQpe289ITAsbj0hIXQmJnR8fG5ldyBFcnJvcih0KX1pZihvKXJldHVybiB0aGlzLnVuc3Vic2NyaWJlKCksbn0sbi5wcm90b3R5cGUudW5zdWJzY3JpYmU9ZnVuY3Rpb24oKXtpZighdGhpcy5jbG9zZWQpe3ZhciBlPXRoaXMuaWQsbj10aGlzLnNjaGVkdWxlcixvPW4uYWN0aW9uczt0aGlzLndvcms9dGhpcy5zdGF0ZT10aGlzLnNjaGVkdWxlcj1udWxsLHRoaXMucGVuZGluZz0hMSxwKG8sdGhpcyksbnVsbCE9ZSYmKHRoaXMuaWQ9dGhpcy5yZWN5Y2xlQXN5bmNJZChuLGUsbnVsbCkpLHRoaXMuZGVsYXk9bnVsbCx0LnByb3RvdHlwZS51bnN1YnNjcmliZS5jYWxsKHRoaXMpfX0sbn0pKFYpLEc9MSxXPXt9O2Z1bmN0aW9uIFkodCl7cmV0dXJuIHQgaW4gVyYmKGRlbGV0ZSBXW3RdLCEwKX12YXIgcT1mdW5jdGlvbih0KXt2YXIgZT1HKys7cmV0dXJuIFdbZV09ITAsQXx8KEE9UHJvbWlzZS5yZXNvbHZlKCkpLEEudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gWShlKSYmdCgpfSkpLGV9LFo9ZnVuY3Rpb24odCl7WSh0KX0sWD17c2V0SW1tZWRpYXRlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3ZhciBuPVguZGVsZWdhdGU7cmV0dXJuKChudWxsPT1uP3ZvaWQgMDpuLnNldEltbWVkaWF0ZSl8fHEpLmFwcGx5KHZvaWQgMCxhKFtdLGkodCkpKX0sY2xlYXJJbW1lZGlhdGU6ZnVuY3Rpb24odCl7dmFyIGU9WC5kZWxlZ2F0ZTtyZXR1cm4oKG51bGw9PWU/dm9pZCAwOmUuY2xlYXJJbW1lZGlhdGUpfHxaKSh0KX0sZGVsZWdhdGU6dm9pZCAwfSxLPShmdW5jdGlvbih0KXtmdW5jdGlvbiBuKGUsbil7dmFyIG89dC5jYWxsKHRoaXMsZSxuKXx8dGhpcztyZXR1cm4gby5zY2hlZHVsZXI9ZSxvLndvcms9bixvfXJldHVybiBlKG4sdCksbi5wcm90b3R5cGUucmVxdWVzdEFzeW5jSWQ9ZnVuY3Rpb24oZSxuLG8pe3JldHVybiB2b2lkIDA9PT1vJiYobz0wKSxudWxsIT09byYmbz4wP3QucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkLmNhbGwodGhpcyxlLG4sbyk6KGUuYWN0aW9ucy5wdXNoKHRoaXMpLGUuX3NjaGVkdWxlZHx8KGUuX3NjaGVkdWxlZD1YLnNldEltbWVkaWF0ZShlLmZsdXNoLmJpbmQoZSx2b2lkIDApKSkpfSxuLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZD1mdW5jdGlvbihlLG4sbyl7aWYodm9pZCAwPT09byYmKG89MCksbnVsbCE9byYmbz4wfHxudWxsPT1vJiZ0aGlzLmRlbGF5PjApcmV0dXJuIHQucHJvdG90eXBlLnJlY3ljbGVBc3luY0lkLmNhbGwodGhpcyxlLG4sbyk7MD09PWUuYWN0aW9ucy5sZW5ndGgmJihYLmNsZWFySW1tZWRpYXRlKG4pLGUuX3NjaGVkdWxlZD12b2lkIDApfSxufSkoVSksSj0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbil7dm9pZCAwPT09biYmKG49dC5ub3cpLHRoaXMuc2NoZWR1bGVyQWN0aW9uQ3Rvcj1lLHRoaXMubm93PW59cmV0dXJuIHQucHJvdG90eXBlLnNjaGVkdWxlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9MCksbmV3IHRoaXMuc2NoZWR1bGVyQWN0aW9uQ3Rvcih0aGlzLHQpLnNjaGVkdWxlKG4sZSl9LHQubm93PUwubm93LHR9KSgpLFE9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4oZSxuKXt2b2lkIDA9PT1uJiYobj1KLm5vdyk7dmFyIG89dC5jYWxsKHRoaXMsZSxuKXx8dGhpcztyZXR1cm4gby5hY3Rpb25zPVtdLG8uX2FjdGl2ZT0hMSxvLl9zY2hlZHVsZWQ9dm9pZCAwLG99cmV0dXJuIGUobix0KSxuLnByb3RvdHlwZS5mbHVzaD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmFjdGlvbnM7aWYodGhpcy5fYWN0aXZlKWUucHVzaCh0KTtlbHNle3ZhciBuO3RoaXMuX2FjdGl2ZT0hMDtkb3tpZihuPXQuZXhlY3V0ZSh0LnN0YXRlLHQuZGVsYXkpKWJyZWFrfXdoaWxlKHQ9ZS5zaGlmdCgpKTtpZih0aGlzLl9hY3RpdmU9ITEsbil7Zm9yKDt0PWUuc2hpZnQoKTspdC51bnN1YnNjcmliZSgpO3Rocm93IG59fX0sbn0pKEopLCQ9bmV3KChmdW5jdGlvbih0KXtmdW5jdGlvbiBuKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gZShuLHQpLG4ucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKHQpe3RoaXMuX2FjdGl2ZT0hMCx0aGlzLl9zY2hlZHVsZWQ9dm9pZCAwO3ZhciBlLG49dGhpcy5hY3Rpb25zLG89LTE7dD10fHxuLnNoaWZ0KCk7dmFyIGk9bi5sZW5ndGg7ZG97aWYoZT10LmV4ZWN1dGUodC5zdGF0ZSx0LmRlbGF5KSlicmVha313aGlsZSgrK288aSYmKHQ9bi5zaGlmdCgpKSk7aWYodGhpcy5fYWN0aXZlPSExLGUpe2Zvcig7KytvPGkmJih0PW4uc2hpZnQoKSk7KXQudW5zdWJzY3JpYmUoKTt0aHJvdyBlfX0sbn0pKFEpKShLKSx0dD1uZXcgUShVKSxldD10dCxudD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlLG4pe3ZhciBvPXQuY2FsbCh0aGlzLGUsbil8fHRoaXM7cmV0dXJuIG8uc2NoZWR1bGVyPWUsby53b3JrPW4sb31yZXR1cm4gZShuLHQpLG4ucHJvdG90eXBlLnNjaGVkdWxlPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHZvaWQgMD09PW4mJihuPTApLG4+MD90LnByb3RvdHlwZS5zY2hlZHVsZS5jYWxsKHRoaXMsZSxuKToodGhpcy5kZWxheT1uLHRoaXMuc3RhdGU9ZSx0aGlzLnNjaGVkdWxlci5mbHVzaCh0aGlzKSx0aGlzKX0sbi5wcm90b3R5cGUuZXhlY3V0ZT1mdW5jdGlvbihlLG4pe3JldHVybiBuPjB8fHRoaXMuY2xvc2VkP3QucHJvdG90eXBlLmV4ZWN1dGUuY2FsbCh0aGlzLGUsbik6dGhpcy5fZXhlY3V0ZShlLG4pfSxuLnByb3RvdHlwZS5yZXF1ZXN0QXN5bmNJZD1mdW5jdGlvbihlLG4sbyl7cmV0dXJuIHZvaWQgMD09PW8mJihvPTApLG51bGwhPW8mJm8+MHx8bnVsbD09byYmdGhpcy5kZWxheT4wP3QucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkLmNhbGwodGhpcyxlLG4sbyk6ZS5mbHVzaCh0aGlzKX0sbn0pKFUpLG90PW5ldygoZnVuY3Rpb24odCl7ZnVuY3Rpb24gbigpe3JldHVybiBudWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9cmV0dXJuIGUobix0KSxufSkoUSkpKG50KSxpdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlLG4pe3ZhciBvPXQuY2FsbCh0aGlzLGUsbil8fHRoaXM7cmV0dXJuIG8uc2NoZWR1bGVyPWUsby53b3JrPW4sb31yZXR1cm4gZShuLHQpLG4ucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkPWZ1bmN0aW9uKGUsbixvKXtyZXR1cm4gdm9pZCAwPT09byYmKG89MCksbnVsbCE9PW8mJm8+MD90LnByb3RvdHlwZS5yZXF1ZXN0QXN5bmNJZC5jYWxsKHRoaXMsZSxuLG8pOihlLmFjdGlvbnMucHVzaCh0aGlzKSxlLl9zY2hlZHVsZWR8fChlLl9zY2hlZHVsZWQ9Ti5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uKCl7cmV0dXJuIGUuZmx1c2godm9pZCAwKX0pKSkpfSxuLnByb3RvdHlwZS5yZWN5Y2xlQXN5bmNJZD1mdW5jdGlvbihlLG4sbyl7aWYodm9pZCAwPT09byYmKG89MCksbnVsbCE9byYmbz4wfHxudWxsPT1vJiZ0aGlzLmRlbGF5PjApcmV0dXJuIHQucHJvdG90eXBlLnJlY3ljbGVBc3luY0lkLmNhbGwodGhpcyxlLG4sbyk7MD09PWUuYWN0aW9ucy5sZW5ndGgmJihOLmNhbmNlbEFuaW1hdGlvbkZyYW1lKG4pLGUuX3NjaGVkdWxlZD12b2lkIDApfSxufSkoVSksYXQ9bmV3KChmdW5jdGlvbih0KXtmdW5jdGlvbiBuKCl7cmV0dXJuIG51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31yZXR1cm4gZShuLHQpLG4ucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKHQpe3RoaXMuX2FjdGl2ZT0hMCx0aGlzLl9zY2hlZHVsZWQ9dm9pZCAwO3ZhciBlLG49dGhpcy5hY3Rpb25zLG89LTE7dD10fHxuLnNoaWZ0KCk7dmFyIGk9bi5sZW5ndGg7ZG97aWYoZT10LmV4ZWN1dGUodC5zdGF0ZSx0LmRlbGF5KSlicmVha313aGlsZSgrK288aSYmKHQ9bi5zaGlmdCgpKSk7aWYodGhpcy5fYWN0aXZlPSExLGUpe2Zvcig7KytvPGkmJih0PW4uc2hpZnQoKSk7KXQudW5zdWJzY3JpYmUoKTt0aHJvdyBlfX0sbn0pKFEpKShpdCkscnQ9bmV3IEQoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNvbXBsZXRlKCl9KSk7ZnVuY3Rpb24gc3QodCxlKXtyZXR1cm4gbmV3IEQoKGZ1bmN0aW9uKG4pe3ZhciBvPTA7cmV0dXJuIGUuc2NoZWR1bGUoKGZ1bmN0aW9uKCl7bz09PXQubGVuZ3RoP24uY29tcGxldGUoKToobi5uZXh0KHRbbysrXSksbi5jbG9zZWR8fHRoaXMuc2NoZWR1bGUoKSl9KSl9KSl9dmFyIGx0PWZ1bmN0aW9uKHQpe3JldHVybiB0JiYibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoJiYiZnVuY3Rpb24iIT10eXBlb2YgdH07ZnVuY3Rpb24gY3QodCl7cmV0dXJuIGwobnVsbD09dD92b2lkIDA6dC50aGVuKX12YXIgZHQscHQ9KGZ1bmN0aW9uIG10KCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yP1N5bWJvbC5pdGVyYXRvcjoiQEBpdGVyYXRvciJ9KSgpO2Z1bmN0aW9uIHV0KHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCJJdGVyYWJsZSBjYW5ub3QgYmUgbnVsbCIpO3JldHVybiBuZXcgRCgoZnVuY3Rpb24obil7dmFyIG89bmV3IG07cmV0dXJuIG8uYWRkKGUuc2NoZWR1bGUoKGZ1bmN0aW9uKCl7dmFyIGk9dFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtvLmFkZChlLnNjaGVkdWxlKChmdW5jdGlvbigpe3ZhciB0PXRoaXM7aS5uZXh0KCkudGhlbigoZnVuY3Rpb24oZSl7ZS5kb25lP24uY29tcGxldGUoKToobi5uZXh0KGUudmFsdWUpLHQuc2NoZWR1bGUoKSl9KSl9KSkpfSkpKSxvfSkpfWZ1bmN0aW9uIGZ0KHQpe3JldHVybiBsKHRbUF0pfWZ1bmN0aW9uIGd0KHQpe3JldHVybiBsKG51bGw9PXQ/dm9pZCAwOnRbcHRdKX1mdW5jdGlvbiBodCh0KXtyZXR1cm4gU3ltYm9sLmFzeW5jSXRlcmF0b3ImJmwobnVsbD09dD92b2lkIDA6dFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0pfWZ1bmN0aW9uIGJ0KHQpe3JldHVybiBuZXcgVHlwZUVycm9yKCJZb3UgcHJvdmlkZWQgIisobnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdD8iYW4gaW52YWxpZCBvYmplY3QiOiInIit0KyInIikrIiB3aGVyZSBhIHN0cmVhbSB3YXMgZXhwZWN0ZWQuIFlvdSBjYW4gcHJvdmlkZSBhbiBPYnNlcnZhYmxlLCBQcm9taXNlLCBSZWFkYWJsZVN0cmVhbSwgQXJyYXksIEFzeW5jSXRlcmFibGUsIG9yIEl0ZXJhYmxlLiIpfWZ1bmN0aW9uIHl0KHQpe3JldHVybiBzKHRoaXMsYXJndW1lbnRzLChmdW5jdGlvbiBlKCl7dmFyIG8saSxhO3JldHVybiBuKHRoaXMsKGZ1bmN0aW9uKGUpe3N3aXRjaChlLmxhYmVsKXtjYXNlIDA6bz10LmdldFJlYWRlcigpLGUubGFiZWw9MTtjYXNlIDE6ZS50cnlzLnB1c2goWzEsLDksMTBdKSxlLmxhYmVsPTI7Y2FzZSAyOnJldHVybls0LHIoby5yZWFkKCkpXTtjYXNlIDM6cmV0dXJuIGk9ZS5zZW50KCksYT1pLnZhbHVlLGkuZG9uZT9bNCxyKHZvaWQgMCldOlszLDVdO2Nhc2UgNDpyZXR1cm5bMixlLnNlbnQoKV07Y2FzZSA1OnJldHVybls0LHIoYSldO2Nhc2UgNjpyZXR1cm5bNCxlLnNlbnQoKV07Y2FzZSA3OnJldHVybiBlLnNlbnQoKSxbMywyXTtjYXNlIDg6cmV0dXJuWzMsMTBdO2Nhc2UgOTpyZXR1cm4gby5yZWxlYXNlTG9jaygpLFs3XTtjYXNlIDEwOnJldHVyblsyXX19KSl9KSl9ZnVuY3Rpb24gX3QodCl7cmV0dXJuIGwobnVsbD09dD92b2lkIDA6dC5nZXRSZWFkZXIpfWZ1bmN0aW9uIEN0KHQsZSl7cmV0dXJuIGU/KGZ1bmN0aW9uIG4odCxlKXtpZihudWxsIT10KXtpZihmdCh0KSlyZXR1cm4oZnVuY3Rpb24gbih0LGUpe3JldHVybiBuZXcgRCgoZnVuY3Rpb24obil7dmFyIG89bmV3IG07cmV0dXJuIG8uYWRkKGUuc2NoZWR1bGUoKGZ1bmN0aW9uKCl7dmFyIGk9dFtQXSgpO28uYWRkKGkuc3Vic2NyaWJlKHtuZXh0OmZ1bmN0aW9uKHQpe28uYWRkKGUuc2NoZWR1bGUoKGZ1bmN0aW9uKCl7cmV0dXJuIG4ubmV4dCh0KX0pKSl9LGVycm9yOmZ1bmN0aW9uKHQpe28uYWRkKGUuc2NoZWR1bGUoKGZ1bmN0aW9uKCl7cmV0dXJuIG4uZXJyb3IodCl9KSkpfSxjb21wbGV0ZTpmdW5jdGlvbigpe28uYWRkKGUuc2NoZWR1bGUoKGZ1bmN0aW9uKCl7cmV0dXJuIG4uY29tcGxldGUoKX0pKSl9fSkpfSkpKSxvfSkpfSkodCxlKTtpZihsdCh0KSlyZXR1cm4gc3QodCxlKTtpZihjdCh0KSlyZXR1cm4oZnVuY3Rpb24gbyh0LGUpe3JldHVybiBuZXcgRCgoZnVuY3Rpb24obil7cmV0dXJuIGUuc2NoZWR1bGUoKGZ1bmN0aW9uKCl7cmV0dXJuIHQudGhlbigoZnVuY3Rpb24odCl7bi5hZGQoZS5zY2hlZHVsZSgoZnVuY3Rpb24oKXtuLm5leHQodCksbi5hZGQoZS5zY2hlZHVsZSgoZnVuY3Rpb24oKXtyZXR1cm4gbi5jb21wbGV0ZSgpfSkpKX0pKSl9KSwoZnVuY3Rpb24odCl7bi5hZGQoZS5zY2hlZHVsZSgoZnVuY3Rpb24oKXtyZXR1cm4gbi5lcnJvcih0KX0pKSl9KSl9KSl9KSl9KSh0LGUpO2lmKGh0KHQpKXJldHVybiB1dCh0LGUpO2lmKGd0KHQpKXJldHVybihmdW5jdGlvbiBpKHQsZSl7cmV0dXJuIG5ldyBEKChmdW5jdGlvbihuKXt2YXIgbztyZXR1cm4gbi5hZGQoZS5zY2hlZHVsZSgoZnVuY3Rpb24oKXtvPXRbcHRdKCksKGZ1bmN0aW9uIGkodCxlLG4sbyl7dm9pZCAwPT09byYmKG89MCk7dmFyIGk9ZS5zY2hlZHVsZSgoZnVuY3Rpb24oKXt0cnl7bi5jYWxsKHRoaXMpfWNhdGNoKGUpe3QuZXJyb3IoZSl9fSksbyk7dC5hZGQoaSl9KShuLGUsKGZ1bmN0aW9uKCl7dmFyIHQ9by5uZXh0KCksZT10LnZhbHVlO3QuZG9uZT9uLmNvbXBsZXRlKCk6KG4ubmV4dChlKSx0aGlzLnNjaGVkdWxlKCkpfSkpfSkpKSxmdW5jdGlvbigpe3JldHVybiBsKG51bGw9PW8/dm9pZCAwOm8ucmV0dXJuKSYmby5yZXR1cm4oKX19KSl9KSh0LGUpO2lmKF90KHQpKXJldHVybihmdW5jdGlvbiBhKHQsZSl7cmV0dXJuIHV0KHl0KHQpLGUpfSkodCxlKX10aHJvdyBidCh0KX0pKHQsZSk6TXQodCl9ZnVuY3Rpb24gTXQodCl7aWYodCBpbnN0YW5jZW9mIEQpcmV0dXJuIHQ7aWYobnVsbCE9dCl7aWYoZnQodCkpcmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyBEKChmdW5jdGlvbihlKXt2YXIgbj10W1BdKCk7aWYobChuLnN1YnNjcmliZSkpcmV0dXJuIG4uc3Vic2NyaWJlKGUpO3Rocm93IG5ldyBUeXBlRXJyb3IoIlByb3ZpZGVkIG9iamVjdCBkb2VzIG5vdCBjb3JyZWN0bHkgaW1wbGVtZW50IFN5bWJvbC5vYnNlcnZhYmxlIil9KSl9KSh0KTtpZihsdCh0KSlyZXR1cm4gdnQodCk7aWYoY3QodCkpcmV0dXJuKGZ1bmN0aW9uIG4odCl7cmV0dXJuIG5ldyBEKChmdW5jdGlvbihlKXt0LnRoZW4oKGZ1bmN0aW9uKHQpe2UuY2xvc2VkfHwoZS5uZXh0KHQpLGUuY29tcGxldGUoKSl9KSwoZnVuY3Rpb24odCl7cmV0dXJuIGUuZXJyb3IodCl9KSkudGhlbihudWxsLGIpfSkpfSkodCk7aWYoaHQodCkpcmV0dXJuIHh0KHQpO2lmKGd0KHQpKXJldHVybihmdW5jdGlvbiBpKHQpe3JldHVybiBuZXcgRCgoZnVuY3Rpb24oZSl7dmFyIG4saTt0cnl7Zm9yKHZhciBhPW8odCkscj1hLm5leHQoKTshci5kb25lO3I9YS5uZXh0KCkpaWYoZS5uZXh0KHIudmFsdWUpLGUuY2xvc2VkKXJldHVybn1jYXRjaCh0KXtuPXtlcnJvcjp0fX1maW5hbGx5e3RyeXtyJiYhci5kb25lJiYoaT1hLnJldHVybikmJmkuY2FsbChhKX1maW5hbGx5e2lmKG4pdGhyb3cgbi5lcnJvcn19ZS5jb21wbGV0ZSgpfSkpfSkodCk7aWYoX3QodCkpcmV0dXJuKGZ1bmN0aW9uIGEodCl7cmV0dXJuIHh0KHl0KHQpKX0pKHQpfXRocm93IGJ0KHQpfWZ1bmN0aW9uIHZ0KHQpe3JldHVybiBuZXcgRCgoZnVuY3Rpb24oZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aCYmIWUuY2xvc2VkO24rKyllLm5leHQodFtuXSk7ZS5jb21wbGV0ZSgpfSkpfWZ1bmN0aW9uIHh0KHQpe3JldHVybiBuZXcgRCgoZnVuY3Rpb24oZSl7KGZ1bmN0aW9uIGkodCxlKXt2YXIgaSxhLHIscztyZXR1cm4oZnVuY3Rpb24gbCh0LGUsbixvKXtyZXR1cm4gbmV3KG58fChuPVByb21pc2UpKSgoZnVuY3Rpb24oaSxhKXtmdW5jdGlvbiByKHQpe3RyeXtsKG8ubmV4dCh0KSl9Y2F0Y2godCl7YSh0KX19ZnVuY3Rpb24gcyh0KXt0cnl7bChvLnRocm93KHQpKX1jYXRjaCh0KXthKHQpfX1mdW5jdGlvbiBsKHQpe3QuZG9uZT9pKHQudmFsdWUpOihmdW5jdGlvbiBlKHQpe3JldHVybiB0IGluc3RhbmNlb2Ygbj90Om5ldyBuKChmdW5jdGlvbihlKXtlKHQpfSkpfSkodC52YWx1ZSkudGhlbihyLHMpfWwoKG89by5hcHBseSh0LGV8fFtdKSkubmV4dCgpKX0pKX0pKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24oKXt2YXIgbDtyZXR1cm4gbih0aGlzLChmdW5jdGlvbihuKXtzd2l0Y2gobi5sYWJlbCl7Y2FzZSAwOm4udHJ5cy5wdXNoKFswLDUsNiwxMV0pLGk9KGZ1bmN0aW9uIGModCl7aWYoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpO3ZhciBlLG49dFtTeW1ib2wuYXN5bmNJdGVyYXRvcl07cmV0dXJuIG4/bi5jYWxsKHQpOih0PW8odCksZT17fSxpKCJuZXh0IiksaSgidGhyb3ciKSxpKCJyZXR1cm4iKSxlW1N5bWJvbC5hc3luY0l0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxlKTtmdW5jdGlvbiBpKG4pe2Vbbl09dFtuXSYmZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGkpeyEoZnVuY3Rpb24gYSh0LGUsbixvKXtQcm9taXNlLnJlc29sdmUobykudGhlbigoZnVuY3Rpb24oZSl7dCh7dmFsdWU6ZSxkb25lOm59KX0pLGUpfSkobyxpLChlPXRbbl0oZSkpLmRvbmUsZS52YWx1ZSl9KSl9fX0pKHQpLG4ubGFiZWw9MTtjYXNlIDE6cmV0dXJuWzQsaS5uZXh0KCldO2Nhc2UgMjppZigoYT1uLnNlbnQoKSkuZG9uZSlyZXR1cm5bMyw0XTtpZihlLm5leHQoYS52YWx1ZSksZS5jbG9zZWQpcmV0dXJuWzJdO24ubGFiZWw9MztjYXNlIDM6cmV0dXJuWzMsMV07Y2FzZSA0OnJldHVyblszLDExXTtjYXNlIDU6cmV0dXJuIGw9bi5zZW50KCkscj17ZXJyb3I6bH0sWzMsMTFdO2Nhc2UgNjpyZXR1cm4gbi50cnlzLnB1c2goWzYsLDksMTBdKSxhJiYhYS5kb25lJiYocz1pLnJldHVybik/WzQscy5jYWxsKGkpXTpbMyw4XTtjYXNlIDc6bi5zZW50KCksbi5sYWJlbD04O2Nhc2UgODpyZXR1cm5bMywxMF07Y2FzZSA5OmlmKHIpdGhyb3cgci5lcnJvcjtyZXR1cm5bN107Y2FzZSAxMDpyZXR1cm5bN107Y2FzZSAxMTpyZXR1cm4gZS5jb21wbGV0ZSgpLFsyXX19KSl9KSl9KSh0LGUpLmNhdGNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5lcnJvcih0KX0pKX0pKX1mdW5jdGlvbiBPdCh0LGUpe3JldHVybiBlP3N0KHQsZSk6dnQodCl9ZnVuY3Rpb24gUHQodCl7cmV0dXJuIHQmJmwodC5zY2hlZHVsZSl9ZnVuY3Rpb24gd3QodCl7cmV0dXJuIHRbdC5sZW5ndGgtMV19ZnVuY3Rpb24ga3QodCl7cmV0dXJuIGwod3QodCkpP3QucG9wKCk6dm9pZCAwfWZ1bmN0aW9uIFN0KHQpe3JldHVybiBQdCh3dCh0KSk/dC5wb3AoKTp2b2lkIDB9ZnVuY3Rpb24gRHQodCxlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHd0KHQpP3QucG9wKCk6ZX1mdW5jdGlvbiBFdCgpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTt2YXIgbj1TdCh0KTtyZXR1cm4gbj9zdCh0LG4pOk90KHQpfWZ1bmN0aW9uIFJ0KHQsZSl7dmFyIG49bCh0KT90OmZ1bmN0aW9uKCl7cmV0dXJuIHR9LG89ZnVuY3Rpb24odCl7cmV0dXJuIHQuZXJyb3IobigpKX07cmV0dXJuIG5ldyBEKGU/ZnVuY3Rpb24odCl7cmV0dXJuIGUuc2NoZWR1bGUobywwLHQpfTpvKX0hKGZ1bmN0aW9uKHQpe3QuTkVYVD0iTiIsdC5FUlJPUj0iRSIsdC5DT01QTEVURT0iQyJ9KShkdHx8KGR0PXt9KSk7dmFyIEF0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4pe3RoaXMua2luZD10LHRoaXMudmFsdWU9ZSx0aGlzLmVycm9yPW4sdGhpcy5oYXNWYWx1ZT0iTiI9PT10fXJldHVybiB0LnByb3RvdHlwZS5vYnNlcnZlPWZ1bmN0aW9uKHQpe3JldHVybiBUdCh0aGlzLHQpfSx0LnByb3RvdHlwZS5kbz1mdW5jdGlvbih0LGUsbil7dmFyIG89dGhpcyxpPW8ua2luZCxhPW8uZXJyb3I7cmV0dXJuIk4iPT09aT9udWxsPT10P3ZvaWQgMDp0KG8udmFsdWUpOiJFIj09PWk/bnVsbD09ZT92b2lkIDA6ZShhKTpudWxsPT1uP3ZvaWQgMDpuKCl9LHQucHJvdG90eXBlLmFjY2VwdD1mdW5jdGlvbih0LGUsbil7dmFyIG87cmV0dXJuIGwobnVsbD09PShvPXQpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLm5leHQpP3RoaXMub2JzZXJ2ZSh0KTp0aGlzLmRvKHQsZSxuKX0sdC5wcm90b3R5cGUudG9PYnNlcnZhYmxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXQua2luZCxuPXQuZXJyb3Isbz0iTiI9PT1lP0V0KHQudmFsdWUpOiJFIj09PWU/UnQoKGZ1bmN0aW9uKCl7cmV0dXJuIG59KSk6IkMiPT09ZT9ydDowO2lmKCFvKXRocm93IG5ldyBUeXBlRXJyb3IoIlVuZXhwZWN0ZWQgbm90aWZpY2F0aW9uIGtpbmQgIitlKTtyZXR1cm4gb30sdC5jcmVhdGVOZXh0PWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdCgiTiIsZSl9LHQuY3JlYXRlRXJyb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB0KCJFIix2b2lkIDAsZSl9LHQuY3JlYXRlQ29tcGxldGU9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb21wbGV0ZU5vdGlmaWNhdGlvbn0sdC5jb21wbGV0ZU5vdGlmaWNhdGlvbj1uZXcgdCgiQyIpLHR9KSgpO2Z1bmN0aW9uIFR0KHQsZSl7dmFyIG4sbyxpLGE9dC5raW5kLHI9dC52YWx1ZSxzPXQuZXJyb3I7aWYoInN0cmluZyIhPXR5cGVvZiBhKXRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm90aWZpY2F0aW9uLCBtaXNzaW5nICJraW5kIicpOyJOIj09PWE/bnVsbD09PShuPWUubmV4dCl8fHZvaWQgMD09PW58fG4uY2FsbChlLHIpOiJFIj09PWE/bnVsbD09PShvPWUuZXJyb3IpfHx2b2lkIDA9PT1vfHxvLmNhbGwoZSxzKTpudWxsPT09KGk9ZS5jb21wbGV0ZSl8fHZvaWQgMD09PWl8fGkuY2FsbChlKX1mdW5jdGlvbiBOdCh0KXtyZXR1cm4hIXQmJih0IGluc3RhbmNlb2YgRHx8bCh0LmxpZnQpJiZsKHQuc3Vic2NyaWJlKSl9dmFyIHp0PWMoKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiBlKCl7dCh0aGlzKSx0aGlzLm5hbWU9IkVtcHR5RXJyb3IiLHRoaXMubWVzc2FnZT0ibm8gZWxlbWVudHMgaW4gc2VxdWVuY2UifX0pKTtmdW5jdGlvbiBJdCh0LGUpe3JldHVybiBSKChmdW5jdGlvbihuLG8pe3ZhciBpPTA7bi5zdWJzY3JpYmUobmV3IFQobywoZnVuY3Rpb24obil7by5uZXh0KHQuY2FsbChlLG4saSsrKSl9KSkpfSkpfXZhciBIdD1BcnJheS5pc0FycmF5O2Z1bmN0aW9uIEZ0KHQpe3JldHVybiBJdCgoZnVuY3Rpb24oZSl7cmV0dXJuKGZ1bmN0aW9uIG4odCxlKXtyZXR1cm4gSHQoZSk/dC5hcHBseSh2b2lkIDAsYShbXSxpKGUpKSk6dChlKX0pKHQsZSl9KSl9dmFyIEx0PUFycmF5LmlzQXJyYXksQnQ9T2JqZWN0LmdldFByb3RvdHlwZU9mLFZ0PU9iamVjdC5wcm90b3R5cGUsanQ9T2JqZWN0LmtleXM7ZnVuY3Rpb24gVXQodCl7aWYoMT09PXQubGVuZ3RoKXt2YXIgZT10WzBdO2lmKEx0KGUpKXJldHVybnthcmdzOmUsa2V5czpudWxsfTtpZigoZnVuY3Rpb24gbih0KXtyZXR1cm4gdCYmIm9iamVjdCI9PXR5cGVvZiB0JiZCdCh0KT09PVZ0fSkoZSkpe3ZhciBvPWp0KGUpO3JldHVybnthcmdzOm8ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0pKSxrZXlzOm99fX1yZXR1cm57YXJnczp0LGtleXM6bnVsbH19ZnVuY3Rpb24gR3QodCxlKXtyZXR1cm4gdC5yZWR1Y2UoKGZ1bmN0aW9uKHQsbixvKXtyZXR1cm4gdFtuXT1lW29dLHR9KSx7fSl9ZnVuY3Rpb24gV3QoKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07dmFyIG49U3QodCksbz1rdCh0KSxpPVV0KHQpLGE9aS5hcmdzLHI9aS5rZXlzO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gQ3QoW10sbik7dmFyIHM9bmV3IEQoWXQoYSxuLHI/ZnVuY3Rpb24odCl7cmV0dXJuIEd0KHIsdCl9OncpKTtyZXR1cm4gbz9zLnBpcGUoRnQobykpOnN9ZnVuY3Rpb24gWXQodCxlLG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj13KSxmdW5jdGlvbihvKXtxdChlLChmdW5jdGlvbigpe2Zvcih2YXIgaT10Lmxlbmd0aCxhPW5ldyBBcnJheShpKSxyPWkscz1pLGw9ZnVuY3Rpb24oaSl7cXQoZSwoZnVuY3Rpb24oKXt2YXIgbD1DdCh0W2ldLGUpLGM9ITE7bC5zdWJzY3JpYmUobmV3IFQobywoZnVuY3Rpb24odCl7YVtpXT10LGN8fChjPSEwLHMtLSksc3x8by5uZXh0KG4oYS5zbGljZSgpKSl9KSwoZnVuY3Rpb24oKXstLXJ8fG8uY29tcGxldGUoKX0pKSl9KSxvKX0sYz0wO2M8aTtjKyspbChjKX0pLG8pfX1mdW5jdGlvbiBxdCh0LGUsbil7dD9uLmFkZCh0LnNjaGVkdWxlKGUpKTplKCl9ZnVuY3Rpb24gWnQodCxlLG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj0xLzApLGwoZSk/WnQoKGZ1bmN0aW9uKG4sbyl7cmV0dXJuIEl0KChmdW5jdGlvbih0LGkpe3JldHVybiBlKG4sdCxvLGkpfSkpKE10KHQobixvKSkpfSksbik6KCJudW1iZXIiPT10eXBlb2YgZSYmKG49ZSksUigoZnVuY3Rpb24oZSxvKXtyZXR1cm4oZnVuY3Rpb24gaSh0LGUsbixvLGEscixzLGwpe3ZhciBjPVtdLGQ9MCxwPTAsbT0hMSx1PWZ1bmN0aW9uKCl7IW18fGMubGVuZ3RofHxkfHxlLmNvbXBsZXRlKCl9LGY9ZnVuY3Rpb24odCl7cmV0dXJuIGQ8bz9nKHQpOmMucHVzaCh0KX0sZz1mdW5jdGlvbih0KXtyJiZlLm5leHQodCksZCsrO3ZhciBpPSExO010KG4odCxwKyspKS5zdWJzY3JpYmUobmV3IFQoZSwoZnVuY3Rpb24odCl7bnVsbD09YXx8YSh0KSxyP2YodCk6ZS5uZXh0KHQpfSksKGZ1bmN0aW9uKCl7aT0hMH0pLHZvaWQgMCwoZnVuY3Rpb24oKXtpZihpKXRyeXtkLS07Zm9yKHZhciB0PWZ1bmN0aW9uKCl7dmFyIHQ9Yy5zaGlmdCgpO3M/ZS5hZGQocy5zY2hlZHVsZSgoZnVuY3Rpb24oKXtyZXR1cm4gZyh0KX0pKSk6Zyh0KX07Yy5sZW5ndGgmJmQ8bzspdCgpO3UoKX1jYXRjaCh0KXtlLmVycm9yKHQpfX0pKSl9O3JldHVybiB0LnN1YnNjcmliZShuZXcgVChlLGYsKGZ1bmN0aW9uKCl7bT0hMCx1KCl9KSkpLGZ1bmN0aW9uKCl7bnVsbD09bHx8bCgpfX0pKGUsbyx0LG4pfSkpKX1mdW5jdGlvbiBYdCh0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9MS8wKSxadCh3LHQpfWZ1bmN0aW9uIEt0KCl7cmV0dXJuIFh0KDEpfWZ1bmN0aW9uIEp0KCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3JldHVybiBLdCgpKE90KHQsU3QodCkpKX1mdW5jdGlvbiBRdCh0KXtyZXR1cm4gbmV3IEQoKGZ1bmN0aW9uKGUpe010KHQoKSkuc3Vic2NyaWJlKGUpfSkpfWZ1bmN0aW9uICR0KCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3ZhciBuPWt0KHQpLG89VXQodCksaT1vLmFyZ3MsYT1vLmtleXMscj1uZXcgRCgoZnVuY3Rpb24odCl7dmFyIGU9aS5sZW5ndGg7aWYoZSlmb3IodmFyIG49bmV3IEFycmF5KGUpLG89ZSxyPWUscz1mdW5jdGlvbihlKXt2YXIgcz0hMTtNdChpW2VdKS5zdWJzY3JpYmUobmV3IFQodCwoZnVuY3Rpb24odCl7c3x8KHM9ITAsci0tKSxuW2VdPXR9KSwoZnVuY3Rpb24oKXstLW8mJnN8fChyfHx0Lm5leHQoYT9HdChhLG4pOm4pLHQuY29tcGxldGUoKSl9KSkpfSxsPTA7bDxlO2wrKylzKGwpO2Vsc2UgdC5jb21wbGV0ZSgpfSkpO3JldHVybiBuP3IucGlwZShGdChuKSk6cn12YXIgdGU9WyJhZGRMaXN0ZW5lciIsInJlbW92ZUxpc3RlbmVyIl0sZWU9WyJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciJdLG5lPVsib24iLCJvZmYiXTtmdW5jdGlvbiBvZSh0LGUsbixvKXtpZihsKG4pJiYobz1uLG49dm9pZCAwKSxvKXJldHVybiBvZSh0LGUsbikucGlwZShGdChvKSk7dmFyIGE9aSgoZnVuY3Rpb24gcih0KXtyZXR1cm4gbCh0LmFkZEV2ZW50TGlzdGVuZXIpJiZsKHQucmVtb3ZlRXZlbnRMaXN0ZW5lcil9KSh0KT9lZS5tYXAoKGZ1bmN0aW9uKG8pe3JldHVybiBmdW5jdGlvbihpKXtyZXR1cm4gdFtvXShlLGksbil9fSkpOihmdW5jdGlvbiBzKHQpe3JldHVybiBsKHQuYWRkTGlzdGVuZXIpJiZsKHQucmVtb3ZlTGlzdGVuZXIpfSkodCk/dGUubWFwKGllKHQsZSkpOihmdW5jdGlvbiBjKHQpe3JldHVybiBsKHQub24pJiZsKHQub2ZmKX0pKHQpP25lLm1hcChpZSh0LGUpKTpbXSwyKSxkPWFbMF0scD1hWzFdO2lmKCFkJiZsdCh0KSlyZXR1cm4gWnQoKGZ1bmN0aW9uKHQpe3JldHVybiBvZSh0LGUsbil9KSkoT3QodCkpO2lmKCFkKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgZXZlbnQgdGFyZ2V0Iik7cmV0dXJuIG5ldyBEKChmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSxuPTA7bjxhcmd1bWVudHMubGVuZ3RoO24rKyllW25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdC5uZXh0KDE8ZS5sZW5ndGg/ZTplWzBdKX07cmV0dXJuIGQoZSksZnVuY3Rpb24oKXtyZXR1cm4gcChlKX19KSl9ZnVuY3Rpb24gaWUodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGZ1bmN0aW9uKG8pe3JldHVybiB0W25dKGUsbyl9fX1mdW5jdGlvbiBhZSh0LGUsbil7dm9pZCAwPT09dCYmKHQ9MCksdm9pZCAwPT09biYmKG49ZXQpO3ZhciBvPS0xO3JldHVybiBudWxsIT1lJiYoUHQoZSk/bj1lOm89ZSksbmV3IEQoKGZ1bmN0aW9uKGUpe3ZhciBpPShmdW5jdGlvbiBhKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZSYmIWlzTmFOKHQpfSkodCk/K3Qtbi5ub3coKTp0O2k8MCYmKGk9MCk7dmFyIHI9MDtyZXR1cm4gbi5zY2hlZHVsZSgoZnVuY3Rpb24oKXtlLmNsb3NlZHx8KGUubmV4dChyKyspLDA8PW8/dGhpcy5zY2hlZHVsZSh2b2lkIDAsbyk6ZS5jb21wbGV0ZSgpKX0pLGkpfSkpfWZ1bmN0aW9uIHJlKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO3ZhciBuPVN0KHQpLG89RHQodCwxLzApLGk9dDtyZXR1cm4gaS5sZW5ndGg/MT09PWkubGVuZ3RoP010KGlbMF0pOlh0KG8pKE90KGksbikpOnJ0fXZhciBzZT1BcnJheS5pc0FycmF5O2Z1bmN0aW9uIGxlKHQpe3JldHVybiAxPT09dC5sZW5ndGgmJnNlKHRbMF0pP3RbMF06dH1mdW5jdGlvbiBjZSh0LGUpe3JldHVybiBSKChmdW5jdGlvbihuLG8pe3ZhciBpPTA7bi5zdWJzY3JpYmUobmV3IFQobywoZnVuY3Rpb24obil7cmV0dXJuIHQuY2FsbChlLG4saSsrKSYmby5uZXh0KG4pfSkpKX0pKX1mdW5jdGlvbiBkZSh0LGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1ldCksKGZ1bmN0aW9uIG4odCl7cmV0dXJuIFIoKGZ1bmN0aW9uKGUsbil7dmFyIG89ITEsaT1udWxsLGE9bnVsbCxyPSExLHM9ZnVuY3Rpb24oKXtpZihudWxsPT1hfHxhLnVuc3Vic2NyaWJlKCksYT1udWxsLG8pe289ITE7dmFyIHQ9aTtpPW51bGwsbi5uZXh0KHQpfXImJm4uY29tcGxldGUoKX0sbD1mdW5jdGlvbigpe2E9bnVsbCxyJiZuLmNvbXBsZXRlKCl9O2Uuc3Vic2NyaWJlKG5ldyBUKG4sKGZ1bmN0aW9uKGUpe289ITAsaT1lLGF8fE10KHQoZSkpLnN1YnNjcmliZShhPW5ldyBUKG4scyxsKSl9KSwoZnVuY3Rpb24oKXtyPSEwLCghb3x8IWF8fGEuY2xvc2VkKSYmbi5jb21wbGV0ZSgpfSkpKX0pKX0pKChmdW5jdGlvbigpe3JldHVybiBhZSh0LGUpfSkpfWZ1bmN0aW9uIHBlKHQpe3JldHVybiBSKChmdW5jdGlvbihlLG4pe3ZhciBvLGk9bnVsbCxhPSExO2k9ZS5zdWJzY3JpYmUobmV3IFQobix2b2lkIDAsdm9pZCAwLChmdW5jdGlvbihyKXtvPU10KHQocixwZSh0KShlKSkpLGk/KGkudW5zdWJzY3JpYmUoKSxpPW51bGwsby5zdWJzY3JpYmUobikpOmE9ITB9KSkpLGEmJihpLnVuc3Vic2NyaWJlKCksaT1udWxsLG8uc3Vic2NyaWJlKG4pKX0pKX1mdW5jdGlvbiBtZSh0LGUsbixvLGkpe3JldHVybiBmdW5jdGlvbihhLHIpe3ZhciBzPW4sbD1lLGM9MDthLnN1YnNjcmliZShuZXcgVChyLChmdW5jdGlvbihlKXt2YXIgbj1jKys7bD1zP3QobCxlLG4pOihzPSEwLGUpLG8mJnIubmV4dChsKX0pLGkmJmZ1bmN0aW9uKCl7cyYmci5uZXh0KGwpLHIuY29tcGxldGUoKX0pKX19ZnVuY3Rpb24gdWUoKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07dmFyIG49a3QodCk7cmV0dXJuIG4/ayh1ZS5hcHBseSh2b2lkIDAsYShbXSxpKHQpKSksRnQobikpOlIoKGZ1bmN0aW9uKGUsbil7WXQoYShbZV0saShsZSh0KSkpKShuKX0pKX1mdW5jdGlvbiBmZSgpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTtyZXR1cm4gdWUuYXBwbHkodm9pZCAwLGEoW10saSh0KSkpfWZ1bmN0aW9uIGdlKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXR0KSxSKChmdW5jdGlvbihuLG8pe3ZhciBpPW51bGwsYT1udWxsLHI9bnVsbCxzPWZ1bmN0aW9uKCl7aWYoaSl7aS51bnN1YnNjcmliZSgpLGk9bnVsbDt2YXIgdD1hO2E9bnVsbCxvLm5leHQodCl9fTtmdW5jdGlvbiBsKCl7dmFyIG49cit0LGE9ZS5ub3coKTtpZihhPG4pcmV0dXJuIGk9dGhpcy5zY2hlZHVsZSh2b2lkIDAsbi1hKSx2b2lkIG8uYWRkKGkpO3MoKX1uLnN1YnNjcmliZShuZXcgVChvLChmdW5jdGlvbihuKXthPW4scj1lLm5vdygpLGl8fChpPWUuc2NoZWR1bGUobCx0KSxvLmFkZChpKSl9KSwoZnVuY3Rpb24oKXtzKCksby5jb21wbGV0ZSgpfSksdm9pZCAwLChmdW5jdGlvbigpe2E9aT1udWxsfSkpKX0pKX1mdW5jdGlvbiBoZSh0KXtyZXR1cm4gUigoZnVuY3Rpb24oZSxuKXt2YXIgbz0hMTtlLnN1YnNjcmliZShuZXcgVChuLChmdW5jdGlvbih0KXtvPSEwLG4ubmV4dCh0KX0pLChmdW5jdGlvbigpe298fG4ubmV4dCh0KSxuLmNvbXBsZXRlKCl9KSkpfSkpfWZ1bmN0aW9uIGJlKHQpe3JldHVybiB0PD0wP2Z1bmN0aW9uKCl7cmV0dXJuIHJ0fTpSKChmdW5jdGlvbihlLG4pe3ZhciBvPTA7ZS5zdWJzY3JpYmUobmV3IFQobiwoZnVuY3Rpb24oZSl7KytvPD10JiYobi5uZXh0KGUpLHQ8PW8mJm4uY29tcGxldGUoKSl9KSkpfSkpfWZ1bmN0aW9uIHllKCl7cmV0dXJuIFIoKGZ1bmN0aW9uKHQsZSl7dC5zdWJzY3JpYmUobmV3IFQoZSx5KSl9KSl9ZnVuY3Rpb24gX2UodCxlKXtyZXR1cm4gZT9mdW5jdGlvbihuKXtyZXR1cm4gSnQoZS5waXBlKGJlKDEpLHllKCkpLG4ucGlwZShfZSh0KSkpfTpadCgoZnVuY3Rpb24oZSxuKXtyZXR1cm4gdChlLG4pLnBpcGUoYmUoMSksKGZ1bmN0aW9uIG8odCl7cmV0dXJuIEl0KChmdW5jdGlvbigpe3JldHVybiB0fSkpfSkoZSkpfSkpfWZ1bmN0aW9uIENlKHQsZSl7dm9pZCAwPT09ZSYmKGU9dHQpO3ZhciBuPWFlKHQsZSk7cmV0dXJuIF9lKChmdW5jdGlvbigpe3JldHVybiBufSkpfWZ1bmN0aW9uIE1lKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXcpLHQ9bnVsbCE9dD90OnZlLFIoKGZ1bmN0aW9uKG4sbyl7dmFyIGksYT0hMDtuLnN1YnNjcmliZShuZXcgVChvLChmdW5jdGlvbihuKXt2YXIgcj1lKG4pOyFhJiZ0KGkscil8fChhPSExLGk9cixvLm5leHQobikpfSkpKX0pKX1mdW5jdGlvbiB2ZSh0LGUpe3JldHVybiB0PT09ZX1mdW5jdGlvbiB4ZSh0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9T2UpLFIoKGZ1bmN0aW9uKGUsbil7dmFyIG89ITE7ZS5zdWJzY3JpYmUobmV3IFQobiwoZnVuY3Rpb24odCl7bz0hMCxuLm5leHQodCl9KSwoZnVuY3Rpb24oKXtyZXR1cm4gbz9uLmNvbXBsZXRlKCk6bi5lcnJvcih0KCkpfSkpKX0pKX1mdW5jdGlvbiBPZSgpe3JldHVybiBuZXcgenR9ZnVuY3Rpb24gUGUodCxlKXtyZXR1cm4gZT9mdW5jdGlvbihuKXtyZXR1cm4gbi5waXBlKFBlKChmdW5jdGlvbihuLG8pe3JldHVybiBNdCh0KG4sbykpLnBpcGUoSXQoKGZ1bmN0aW9uKHQsaSl7cmV0dXJuIGUobix0LG8saSl9KSkpfSkpKX06UigoZnVuY3Rpb24oZSxuKXt2YXIgbz0wLGk9bnVsbCxhPSExO2Uuc3Vic2NyaWJlKG5ldyBUKG4sKGZ1bmN0aW9uKGUpe2l8fChpPW5ldyBUKG4sdm9pZCAwLChmdW5jdGlvbigpe2k9bnVsbCxhJiZuLmNvbXBsZXRlKCl9KSksTXQodChlLG8rKykpLnN1YnNjcmliZShpKSl9KSwoZnVuY3Rpb24oKXthPSEwLCFpJiZuLmNvbXBsZXRlKCl9KSkpfSkpfWZ1bmN0aW9uIHdlKHQsZSxuLG8pe3JldHVybiBSKChmdW5jdGlvbihpLGEpe3ZhciByO2UmJiJmdW5jdGlvbiIhPXR5cGVvZiBlPyhuPWUuZHVyYXRpb24scj1lLmVsZW1lbnQsbz1lLmNvbm5lY3Rvcik6cj1lO3ZhciBzPW5ldyBNYXAsbD1mdW5jdGlvbih0KXtzLmZvckVhY2godCksdChhKX0sYz1mdW5jdGlvbih0KXtyZXR1cm4gbCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZXJyb3IodCl9KSl9LGQ9bmV3IGtlKGEsKGZ1bmN0aW9uKGUpe3RyeXt2YXIgaT10KGUpLGw9cy5nZXQoaSk7aWYoIWwpe3Muc2V0KGksbD1vP28oKTpuZXcgSSk7dmFyIHA9KGZ1bmN0aW9uIG0odCxlKXt2YXIgbj1uZXcgRCgoZnVuY3Rpb24odCl7ZC5hY3RpdmVHcm91cHMrKzt2YXIgbj1lLnN1YnNjcmliZSh0KTtyZXR1cm4gZnVuY3Rpb24oKXtuLnVuc3Vic2NyaWJlKCksMD09LS1kLmFjdGl2ZUdyb3VwcyYmZC50ZWFyZG93bkF0dGVtcHRlZCYmZC51bnN1YnNjcmliZSgpfX0pKTtyZXR1cm4gbi5rZXk9dCxufSkoaSxsKTtpZihhLm5leHQocCksbil7dmFyIHU9bmV3IFQobCwoZnVuY3Rpb24oKXtsLmNvbXBsZXRlKCksbnVsbD09dXx8dS51bnN1YnNjcmliZSgpfSksdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24oKXtyZXR1cm4gcy5kZWxldGUoaSl9KSk7ZC5hZGQoTXQobihwKSkuc3Vic2NyaWJlKHUpKX19bC5uZXh0KHI/cihlKTplKX1jYXRjaCh0KXtjKHQpfX0pLChmdW5jdGlvbigpe3JldHVybiBsKChmdW5jdGlvbih0KXtyZXR1cm4gdC5jb21wbGV0ZSgpfSkpfSksYywoZnVuY3Rpb24oKXtyZXR1cm4gcy5jbGVhcigpfSkpO2kuc3Vic2NyaWJlKGQpfSkpfXZhciBrZT0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gbigpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5hY3RpdmVHcm91cHM9MCxlLnRlYXJkb3duQXR0ZW1wdGVkPSExLGV9cmV0dXJuIGUobix0KSxuLnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbigpe3RoaXMudGVhcmRvd25BdHRlbXB0ZWQ9ITAsMD09PXRoaXMuYWN0aXZlR3JvdXBzJiZ0LnByb3RvdHlwZS51bnN1YnNjcmliZS5jYWxsKHRoaXMpfSxufSkoVCk7ZnVuY3Rpb24gU2UodCl7cmV0dXJuIHQ8PTA/ZnVuY3Rpb24oKXtyZXR1cm4gcnR9OlIoKGZ1bmN0aW9uKGUsbil7dmFyIGk9W107ZS5zdWJzY3JpYmUobmV3IFQobiwoZnVuY3Rpb24oZSl7aS5wdXNoKGUpLHQ8aS5sZW5ndGgmJmkuc2hpZnQoKX0pLChmdW5jdGlvbigpe3ZhciB0LGU7dHJ5e2Zvcih2YXIgYT1vKGkpLHI9YS5uZXh0KCk7IXIuZG9uZTtyPWEubmV4dCgpKW4ubmV4dChyLnZhbHVlKX1jYXRjaChlKXt0PXtlcnJvcjplfX1maW5hbGx5e3RyeXtyJiYhci5kb25lJiYoZT1hLnJldHVybikmJmUuY2FsbChhKX1maW5hbGx5e2lmKHQpdGhyb3cgdC5lcnJvcn19bi5jb21wbGV0ZSgpfSksdm9pZCAwLChmdW5jdGlvbigpe2k9bnVsbH0pKSl9KSl9ZnVuY3Rpb24gRGUoKXtyZXR1cm4gUigoZnVuY3Rpb24odCxlKXt2YXIgbixvPSExO3Quc3Vic2NyaWJlKG5ldyBUKGUsKGZ1bmN0aW9uKHQpe3ZhciBpPW47bj10LG8mJmUubmV4dChbaSx0XSksbz0hMH0pKSl9KSl9ZnVuY3Rpb24gRWUodCl7dm9pZCAwPT09dCYmKHQ9e30pO3ZhciBlPXQuY29ubmVjdG9yLG49dm9pZCAwPT09ZT9mdW5jdGlvbigpe3JldHVybiBuZXcgSX06ZSxvPXQucmVzZXRPbkVycm9yLGk9dm9pZCAwPT09b3x8byxhPXQucmVzZXRPbkNvbXBsZXRlLHI9dm9pZCAwPT09YXx8YSxzPXQucmVzZXRPblJlZkNvdW50WmVybyxsPXZvaWQgMD09PXN8fHM7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPW51bGwsbz1udWxsLGE9bnVsbCxzPTAsYz0hMSxkPSExLHA9ZnVuY3Rpb24oKXtudWxsPT1vfHxvLnVuc3Vic2NyaWJlKCksbz1udWxsfSxtPWZ1bmN0aW9uKCl7cCgpLGU9YT1udWxsLGM9ZD0hMX0sdT1mdW5jdGlvbigpe3ZhciB0PWU7bSgpLG51bGw9PXR8fHQudW5zdWJzY3JpYmUoKX07cmV0dXJuIFIoKGZ1bmN0aW9uKHQsZil7cysrLGR8fGN8fHAoKTt2YXIgZz1hPW51bGwhPWE/YTpuKCk7Zi5hZGQoKGZ1bmN0aW9uKCl7MCE9LS1zfHxkfHxjfHwobz1SZSh1LGwpKX0pKSxnLnN1YnNjcmliZShmKSxlfHwoZT1uZXcgTSh7bmV4dDpmdW5jdGlvbih0KXtyZXR1cm4gZy5uZXh0KHQpfSxlcnJvcjpmdW5jdGlvbih0KXtkPSEwLHAoKSxvPVJlKG0saSx0KSxnLmVycm9yKHQpfSxjb21wbGV0ZTpmdW5jdGlvbigpe2M9ITAscCgpLG89UmUobSxyKSxnLmNvbXBsZXRlKCl9fSksQ3QodCkuc3Vic2NyaWJlKGUpKX0pKSh0KX19ZnVuY3Rpb24gUmUodCxlKXtmb3IodmFyIG49W10sbz0yO288YXJndW1lbnRzLmxlbmd0aDtvKyspbltvLTJdPWFyZ3VtZW50c1tvXTtyZXR1cm4hMD09PWU/KHQoKSxudWxsKTohMT09PWU/bnVsbDplLmFwcGx5KHZvaWQgMCxhKFtdLGkobikpKS5waXBlKGJlKDEpKS5zdWJzY3JpYmUoKGZ1bmN0aW9uKCl7cmV0dXJuIHQoKX0pKX1mdW5jdGlvbiBBZSh0LGUsbil7dmFyIG8saSxhLHI9ITE7cmV0dXJuIHQmJiJvYmplY3QiPT10eXBlb2YgdD8oYT1udWxsIT09KG89dC5idWZmZXJTaXplKSYmdm9pZCAwIT09bz9vOjEvMCxlPW51bGwhPT0oaT10LndpbmRvd1RpbWUpJiZ2b2lkIDAhPT1pP2k6MS8wLHI9ISF0LnJlZkNvdW50LG49dC5zY2hlZHVsZXIpOmE9bnVsbCE9dD90OjEvMCxFZSh7Y29ubmVjdG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBCKGEsZSxuKX0scmVzZXRPbkVycm9yOiEwLHJlc2V0T25Db21wbGV0ZTohMSxyZXNldE9uUmVmQ291bnRaZXJvOnJ9KX1mdW5jdGlvbiBUZSh0KXtyZXR1cm4gY2UoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQ8PW59KSl9ZnVuY3Rpb24gTmUoKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07dmFyIG49U3QodCk7cmV0dXJuIFIoKGZ1bmN0aW9uKGUsbyl7KG4/SnQodCxlLG4pOkp0KHQsZSkpLnN1YnNjcmliZShvKX0pKX1mdW5jdGlvbiB6ZSh0LGUpe3JldHVybiBSKChmdW5jdGlvbihuLG8pe3ZhciBpPW51bGwsYT0wLHI9ITEscz1mdW5jdGlvbigpe3JldHVybiByJiYhaSYmby5jb21wbGV0ZSgpfTtuLnN1YnNjcmliZShuZXcgVChvLChmdW5jdGlvbihuKXtudWxsPT1pfHxpLnVuc3Vic2NyaWJlKCk7dmFyIHI9MCxsPWErKztNdCh0KG4sbCkpLnN1YnNjcmliZShpPW5ldyBUKG8sKGZ1bmN0aW9uKHQpe3JldHVybiBvLm5leHQoZT9lKG4sdCxsLHIrKyk6dCl9KSwoZnVuY3Rpb24oKXtpPW51bGwscygpfSkpKX0pLChmdW5jdGlvbigpe3I9ITAscygpfSkpKX0pKX1mdW5jdGlvbiBJZSh0KXtyZXR1cm4gUigoZnVuY3Rpb24oZSxuKXtNdCh0KS5zdWJzY3JpYmUobmV3IFQobiwoZnVuY3Rpb24oKXtyZXR1cm4gbi5jb21wbGV0ZSgpfSkseSkpLCFuLmNsb3NlZCYmZS5zdWJzY3JpYmUobil9KSl9ZnVuY3Rpb24gSGUodCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9ITEpLFIoKGZ1bmN0aW9uKG4sbyl7dmFyIGk9MDtuLnN1YnNjcmliZShuZXcgVChvLChmdW5jdGlvbihuKXt2YXIgYT10KG4saSsrKTsoYXx8ZSkmJm8ubmV4dChuKSwhYSYmby5jb21wbGV0ZSgpfSkpKX0pKX1mdW5jdGlvbiBGZSh0LGUsbil7dmFyIG89bCh0KXx8ZXx8bj97bmV4dDp0LGVycm9yOmUsY29tcGxldGU6bn06dDtyZXR1cm4gbz9SKChmdW5jdGlvbih0LGUpe3ZhciBuO251bGw9PT0obj1vLnN1YnNjcmliZSl8fHZvaWQgMD09PW58fG4uY2FsbChvKTt2YXIgaT0hMDt0LnN1YnNjcmliZShuZXcgVChlLChmdW5jdGlvbih0KXt2YXIgbjtudWxsPT09KG49by5uZXh0KXx8dm9pZCAwPT09bnx8bi5jYWxsKG8sdCksZS5uZXh0KHQpfSksKGZ1bmN0aW9uKCl7dmFyIHQ7aT0hMSxudWxsPT09KHQ9by5jb21wbGV0ZSl8fHZvaWQgMD09PXR8fHQuY2FsbChvKSxlLmNvbXBsZXRlKCl9KSwoZnVuY3Rpb24odCl7dmFyIG47aT0hMSxudWxsPT09KG49by5lcnJvcil8fHZvaWQgMD09PW58fG4uY2FsbChvLHQpLGUuZXJyb3IodCl9KSwoZnVuY3Rpb24oKXt2YXIgdCxlO2kmJihudWxsPT09KHQ9by51bnN1YnNjcmliZSl8fHZvaWQgMD09PXR8fHQuY2FsbChvKSksbnVsbD09PShlPW8uZmluYWxpemUpfHx2b2lkIDA9PT1lfHxlLmNhbGwobyl9KSkpfSkpOnd9dmFyIExlPXtsZWFkaW5nOiEwLHRyYWlsaW5nOiExfTtmdW5jdGlvbiBCZSh0LGUsbil7dm9pZCAwPT09ZSYmKGU9dHQpLHZvaWQgMD09PW4mJihuPUxlKTt2YXIgbz1hZSh0LGUpO3JldHVybihmdW5jdGlvbiBpKHQsZSl7dmFyIG49dm9pZCAwPT09ZT9MZTplLG89bi5sZWFkaW5nLGk9bi50cmFpbGluZztyZXR1cm4gUigoZnVuY3Rpb24oZSxuKXt2YXIgYT0hMSxyPW51bGwscz1udWxsLGw9ITEsYz1mdW5jdGlvbigpe251bGw9PXN8fHMudW5zdWJzY3JpYmUoKSxzPW51bGwsaSYmKG0oKSxsJiZuLmNvbXBsZXRlKCkpfSxkPWZ1bmN0aW9uKCl7cz1udWxsLGwmJm4uY29tcGxldGUoKX0scD1mdW5jdGlvbihlKXtyZXR1cm4gcz1NdCh0KGUpKS5zdWJzY3JpYmUobmV3IFQobixjLGQpKX0sbT1mdW5jdGlvbigpe2lmKGEpe2E9ITE7dmFyIHQ9cjtyPW51bGwsbi5uZXh0KHQpLCFsJiZwKHQpfX07ZS5zdWJzY3JpYmUobmV3IFQobiwoZnVuY3Rpb24odCl7YT0hMCxyPXQsKCFzfHxzLmNsb3NlZCkmJihvP20oKTpwKHQpKX0pLChmdW5jdGlvbigpe2w9ITAsKCEoaSYmYSYmcyl8fHMuY2xvc2VkKSYmbi5jb21wbGV0ZSgpfSkpKX0pKX0pKChmdW5jdGlvbigpe3JldHVybiBvfSksbil9ZnVuY3Rpb24gVmUoKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07dmFyIG49a3QodCk7cmV0dXJuIFIoKGZ1bmN0aW9uKGUsbyl7Zm9yKHZhciByPXQubGVuZ3RoLHM9bmV3IEFycmF5KHIpLGw9dC5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuITF9KSksYz0hMSxkPWZ1bmN0aW9uKGUpe010KHRbZV0pLnN1YnNjcmliZShuZXcgVChvLChmdW5jdGlvbih0KXtzW2VdPXQsY3x8bFtlXXx8KGxbZV09ITAsKGM9bC5ldmVyeSh3KSkmJihsPW51bGwpKX0pLHkpKX0scD0wO3A8cjtwKyspZChwKTtlLnN1YnNjcmliZShuZXcgVChvLChmdW5jdGlvbih0KXtpZihjKXt2YXIgZT1hKFt0XSxpKHMpKTtvLm5leHQobj9uLmFwcGx5KHZvaWQgMCxhKFtdLGkoZSkpKTplKX19KSkpfSkpfQovKioKICAgICAqIEBsaWNlbnNlIEFuZ3VsYXIgdjEyLjIuMQogICAgICogKGMpIDIwMTAtMjAyMSBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vCiAgICAgKiBMaWNlbnNlOiBNSVQKICAgICAqLwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBqZSh0KXtmb3IobGV0IGUgaW4gdClpZih0W2VdPT09amUpcmV0dXJuIGU7dGhyb3cgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIHJlbmFtZWQgcHJvcGVydHkgb24gdGFyZ2V0IG9iamVjdC4iKX1mdW5jdGlvbiBVZSh0LGUpe2Zvcihjb25zdCBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmIXQuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBHZSh0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4iWyIrdC5tYXAoR2UpLmpvaW4oIiwgIikrIl0iO2lmKG51bGw9PXQpcmV0dXJuIiIrdDtpZih0Lm92ZXJyaWRkZW5OYW1lKXJldHVybmAke3Qub3ZlcnJpZGRlbk5hbWV9YDtpZih0Lm5hbWUpcmV0dXJuYCR7dC5uYW1lfWA7Y29uc3QgZT10LnRvU3RyaW5nKCk7aWYobnVsbD09ZSlyZXR1cm4iIitlO2NvbnN0IG49ZS5pbmRleE9mKCJcbiIpO3JldHVybi0xPT09bj9lOmUuc3Vic3RyaW5nKDAsbil9ZnVuY3Rpb24gV2UodCxlKXtyZXR1cm4gbnVsbD09dHx8IiI9PT10P251bGw9PT1lPyIiOmU6bnVsbD09ZXx8IiI9PT1lP3Q6dCsiICIrZX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3QgWWU9amUoe19fZm9yd2FyZF9yZWZfXzpqZX0pO2Z1bmN0aW9uIHFlKHQpe3JldHVybiB0Ll9fZm9yd2FyZF9yZWZfXz1xZSx0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIEdlKHRoaXMoKSl9LHR9ZnVuY3Rpb24gWmUodCl7cmV0dXJuIFhlKHQpP3QoKTp0fWZ1bmN0aW9uIFhlKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0Lmhhc093blByb3BlcnR5KFllKSYmdC5fX2ZvcndhcmRfcmVmX189PT1xZX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgS2UgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKFFlKHQsZSkpLHRoaXMuY29kZT10fX1jb25zdCBKZT1uZXcgU2V0KFsiMTAwIiwiMjAwIiwiMjAxIiwiMzAwIiwiMzAxIiwiMzAyIl0pO2Z1bmN0aW9uIFFlKHQsZSl7bGV0IG49YCR7dD9gTkcwJHt0fTogYDoiIn0ke2V9YDtyZXR1cm4gbmdEZXZNb2RlJiZKZS5oYXModCkmJihuPWAke259LiBGaW5kIG1vcmUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2Vycm9ycy9ORzAke3R9YCksbn0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gJGUodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P3Q6bnVsbD09dD8iIjpTdHJpbmcodCl9ZnVuY3Rpb24gdG4odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dC5uYW1lfHx0LnRvU3RyaW5nKCk6Im9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT10JiYiZnVuY3Rpb24iPT10eXBlb2YgdC50eXBlP3QudHlwZS5uYW1lfHx0LnR5cGUudG9TdHJpbmcoKTokZSh0KX1mdW5jdGlvbiBlbih0LGUpe2NvbnN0IG49ZT9gLiBEZXBlbmRlbmN5IHBhdGg6ICR7ZS5qb2luKCIgPiAiKX0gPiAke3R9YDoiIjt0aHJvdyBuZXcgS2UoIjIwMCIsYENpcmN1bGFyIGRlcGVuZGVuY3kgaW4gREkgZGV0ZWN0ZWQgZm9yICR7dH0ke259YCl9ZnVuY3Rpb24gbm4oKXt0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBtaXggbXVsdGkgcHJvdmlkZXJzIGFuZCByZWd1bGFyIHByb3ZpZGVycyIpfWZ1bmN0aW9uIG9uKHQsZSl7Y29uc3Qgbj1lP2AgaW4gJHtlfWA6IiI7dGhyb3cgbmV3IEtlKCIyMDEiLGBObyBwcm92aWRlciBmb3IgJHt0bih0KX0gZm91bmQke259YCl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIGFuKHQsZSl7Im51bWJlciIhPXR5cGVvZiB0JiZibihlLHR5cGVvZiB0LCJudW1iZXIiLCI9PT0iKX1mdW5jdGlvbiBybih0LGUsbil7YW4odCwiRXhwZWN0ZWQgYSBudW1iZXIiKSx1bih0LG4sIkV4cGVjdGVkIG51bWJlciB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8iKSxnbih0LGUsIkV4cGVjdGVkIG51bWJlciB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8iKX1mdW5jdGlvbiBzbih0LGUpeyJzdHJpbmciIT10eXBlb2YgdCYmYm4oZSxudWxsPT09dD8ibnVsbCI6dHlwZW9mIHQsInN0cmluZyIsIj09PSIpfWZ1bmN0aW9uIGxuKHQsZSxuKXt0IT1lJiZibihuLHQsZSwiPT0iKX1mdW5jdGlvbiBjbih0LGUsbil7dD09ZSYmYm4obix0LGUsIiE9Iil9ZnVuY3Rpb24gZG4odCxlLG4pe3QhPT1lJiZibihuLHQsZSwiPT09Iil9ZnVuY3Rpb24gcG4odCxlLG4pe3Q9PT1lJiZibihuLHQsZSwiIT09Iil9ZnVuY3Rpb24gbW4odCxlLG4pe3Q8ZXx8Ym4obix0LGUsIjwiKX1mdW5jdGlvbiB1bih0LGUsbil7dDw9ZXx8Ym4obix0LGUsIjw9Iil9ZnVuY3Rpb24gZm4odCxlLG4pe3Q+ZXx8Ym4obix0LGUsIj4iKX1mdW5jdGlvbiBnbih0LGUsbil7dD49ZXx8Ym4obix0LGUsIj49Iil9ZnVuY3Rpb24gaG4odCxlKXtudWxsPT10JiZibihlLHQsbnVsbCwiIT0iKX1mdW5jdGlvbiBibih0LGUsbixvKXt0aHJvdyBuZXcgRXJyb3IoYEFTU0VSVElPTiBFUlJPUjogJHt0fWArKG51bGw9PW8/IiI6YCBbRXhwZWN0ZWQ9PiAke259ICR7b30gJHtlfSA8PUFjdHVhbF1gKSl9ZnVuY3Rpb24geW4odCl7InVuZGVmaW5lZCIhPXR5cGVvZiBOb2RlJiZ0IGluc3RhbmNlb2YgTm9kZXx8Im9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT10JiYiV2ViV29ya2VyUmVuZGVyTm9kZSI9PT10LmNvbnN0cnVjdG9yLm5hbWV8fGJuKGBUaGUgcHJvdmlkZWQgdmFsdWUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBhIERPTSBOb2RlIGJ1dCBnb3QgJHtHZSh0KX1gKX1mdW5jdGlvbiBfbih0LGUpe2huKHQsIkFycmF5IG11c3QgYmUgZGVmaW5lZC4iKTtjb25zdCBuPXQubGVuZ3RoOyhlPDB8fGU+PW4pJiZibihgSW5kZXggZXhwZWN0ZWQgdG8gYmUgbGVzcyB0aGFuICR7bn0gYnV0IGdvdCAke2V9YCl9ZnVuY3Rpb24gQ24odCwuLi5lKXtpZigtMSE9PWUuaW5kZXhPZih0KSlyZXR1cm4hMDtibihgRXhwZWN0ZWQgdmFsdWUgdG8gYmUgb25lIG9mICR7SlNPTi5zdHJpbmdpZnkoZSl9IGJ1dCB3YXMgJHtKU09OLnN0cmluZ2lmeSh0KX0uYCl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIE1uKHQpe3JldHVybnt0b2tlbjp0LnRva2VuLHByb3ZpZGVkSW46dC5wcm92aWRlZElufHxudWxsLGZhY3Rvcnk6dC5mYWN0b3J5LHZhbHVlOnZvaWQgMH19ZnVuY3Rpb24gdm4odCl7cmV0dXJue3Byb3ZpZGVyczp0LnByb3ZpZGVyc3x8W10saW1wb3J0czp0LmltcG9ydHN8fFtdfX1mdW5jdGlvbiB4bih0KXtyZXR1cm4gT24odCx3bil8fE9uKHQsU24pfWZ1bmN0aW9uIE9uKHQsZSl7cmV0dXJuIHQuaGFzT3duUHJvcGVydHkoZSk/dFtlXTpudWxsfWZ1bmN0aW9uIFBuKHQpe3JldHVybiB0JiYodC5oYXNPd25Qcm9wZXJ0eShrbil8fHQuaGFzT3duUHJvcGVydHkoRG4pKT90W2tuXTpudWxsfWNvbnN0IHduPWplKHsiybVwcm92IjpqZX0pLGtuPWplKHsiybVpbmoiOmplfSksU249amUoe25nSW5qZWN0YWJsZURlZjpqZX0pLERuPWplKHtuZ0luamVjdG9yRGVmOmplfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwp2YXIgRW47Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpsZXQgUm47ZnVuY3Rpb24gQW4odCl7Y29uc3QgZT1SbjtyZXR1cm4gUm49dCxlfWZ1bmN0aW9uIFRuKHQsZSxuKXtjb25zdCBvPXhuKHQpO3JldHVybiBvJiYicm9vdCI9PW8ucHJvdmlkZWRJbj92b2lkIDA9PT1vLnZhbHVlP28udmFsdWU9by5mYWN0b3J5KCk6by52YWx1ZTpuJkVuLk9wdGlvbmFsP251bGw6dm9pZCAwIT09ZT9lOnZvaWQgb24oR2UodCksIkluamVjdG9yIil9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBObih0KXtyZXR1cm57dG9TdHJpbmc6dH0udG9TdHJpbmcoKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovdmFyIHpuLEluLEhuOyEoZnVuY3Rpb24odCl7dFt0LkRlZmF1bHQ9MF09IkRlZmF1bHQiLHRbdC5Ib3N0PTFdPSJIb3N0Iix0W3QuU2VsZj0yXT0iU2VsZiIsdFt0LlNraXBTZWxmPTRdPSJTa2lwU2VsZiIsdFt0Lk9wdGlvbmFsPThdPSJPcHRpb25hbCJ9KShFbnx8KEVuPXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5PblB1c2g9MF09Ik9uUHVzaCIsdFt0LkRlZmF1bHQ9MV09IkRlZmF1bHQifSkoem58fCh6bj17fSkpLChmdW5jdGlvbih0KXt0W3QuQ2hlY2tPbmNlPTBdPSJDaGVja09uY2UiLHRbdC5DaGVja2VkPTFdPSJDaGVja2VkIix0W3QuQ2hlY2tBbHdheXM9Ml09IkNoZWNrQWx3YXlzIix0W3QuRGV0YWNoZWQ9M109IkRldGFjaGVkIix0W3QuRXJyb3JlZD00XT0iRXJyb3JlZCIsdFt0LkRlc3Ryb3llZD01XT0iRGVzdHJveWVkIn0pKElufHwoSW49e30pKSwoZnVuY3Rpb24odCl7dFt0LkVtdWxhdGVkPTBdPSJFbXVsYXRlZCIsdFt0Lk5vbmU9Ml09Ik5vbmUiLHRbdC5TaGFkb3dEb209M109IlNoYWRvd0RvbSJ9KShIbnx8KEhuPXt9KSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBGbj0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXMmJmdsb2JhbFRoaXMsTG49InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdyxCbj0idW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYmJiJ1bmRlZmluZWQiIT10eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUmJnNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSYmc2VsZixWbj0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbCYmZ2xvYmFsLGpuPUZufHxWbnx8TG58fEJuO2Z1bmN0aW9uIFVuKCl7cmV0dXJuISgidW5kZWZpbmVkIiE9dHlwZW9mIG5nRGV2TW9kZSYmIW5nRGV2TW9kZXx8KCJvYmplY3QiIT10eXBlb2YgbmdEZXZNb2RlJiYoCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiB0KCl7Y29uc3QgdD0idW5kZWZpbmVkIiE9dHlwZW9mIGxvY2F0aW9uP2xvY2F0aW9uLnRvU3RyaW5nKCk6IiIsZT17bmFtZWRDb25zdHJ1Y3RvcnM6LTEhPXQuaW5kZXhPZigibmdEZXZNb2RlPW5hbWVkQ29uc3RydWN0b3JzIiksZmlyc3RDcmVhdGVQYXNzOjAsdE5vZGU6MCx0VmlldzowLHJlbmRlcmVyQ3JlYXRlVGV4dE5vZGU6MCxyZW5kZXJlclNldFRleHQ6MCxyZW5kZXJlckNyZWF0ZUVsZW1lbnQ6MCxyZW5kZXJlckFkZEV2ZW50TGlzdGVuZXI6MCxyZW5kZXJlclNldEF0dHJpYnV0ZTowLHJlbmRlcmVyUmVtb3ZlQXR0cmlidXRlOjAscmVuZGVyZXJTZXRQcm9wZXJ0eTowLHJlbmRlcmVyU2V0Q2xhc3NOYW1lOjAscmVuZGVyZXJBZGRDbGFzczowLHJlbmRlcmVyUmVtb3ZlQ2xhc3M6MCxyZW5kZXJlclNldFN0eWxlOjAscmVuZGVyZXJSZW1vdmVTdHlsZTowLHJlbmRlcmVyRGVzdHJveTowLHJlbmRlcmVyRGVzdHJveU5vZGU6MCxyZW5kZXJlck1vdmVOb2RlOjAscmVuZGVyZXJSZW1vdmVOb2RlOjAscmVuZGVyZXJBcHBlbmRDaGlsZDowLHJlbmRlcmVySW5zZXJ0QmVmb3JlOjAscmVuZGVyZXJDcmVhdGVDb21tZW50OjB9LG49LTE9PT10LmluZGV4T2YoIm5nRGV2TW9kZT1mYWxzZSIpO2puLm5nRGV2TW9kZT1uJiZlfSkoKSwidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8IW5nRGV2TW9kZSkpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCBHbj17fSxXbj1bXTsoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJlVuKCkmJihPYmplY3QuZnJlZXplKEduKSxPYmplY3QuZnJlZXplKFduKSkKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovO2NvbnN0IFluPWplKHsiybVjbXAiOmplfSkscW49amUoeyLJtWRpciI6amV9KSxabj1qZSh7Ism1cGlwZSI6amV9KSxYbj1qZSh7Ism1bW9kIjpqZX0pLEtuPWplKHsiybVsb2MiOmplfSksSm49amUoeyLJtWZhYyI6amV9KSxRbj1qZSh7X19OR19FTEVNRU5UX0lEX186amV9KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmxldCAkbj0wO2Z1bmN0aW9uIHRvKHQpe3JldHVybiBObigoKCk9PnsoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJlVuKCk7Y29uc3QgZT17fSxuPXt0eXBlOnQudHlwZSxwcm92aWRlcnNSZXNvbHZlcjpudWxsLGRlY2xzOnQuZGVjbHMsdmFyczp0LnZhcnMsZmFjdG9yeTpudWxsLHRlbXBsYXRlOnQudGVtcGxhdGV8fG51bGwsY29uc3RzOnQuY29uc3RzfHxudWxsLG5nQ29udGVudFNlbGVjdG9yczp0Lm5nQ29udGVudFNlbGVjdG9ycyxob3N0QmluZGluZ3M6dC5ob3N0QmluZGluZ3N8fG51bGwsaG9zdFZhcnM6dC5ob3N0VmFyc3x8MCxob3N0QXR0cnM6dC5ob3N0QXR0cnN8fG51bGwsY29udGVudFF1ZXJpZXM6dC5jb250ZW50UXVlcmllc3x8bnVsbCxkZWNsYXJlZElucHV0czplLGlucHV0czpudWxsLG91dHB1dHM6bnVsbCxleHBvcnRBczp0LmV4cG9ydEFzfHxudWxsLG9uUHVzaDp0LmNoYW5nZURldGVjdGlvbj09PXpuLk9uUHVzaCxkaXJlY3RpdmVEZWZzOm51bGwscGlwZURlZnM6bnVsbCxzZWxlY3RvcnM6dC5zZWxlY3RvcnN8fFduLHZpZXdRdWVyeTp0LnZpZXdRdWVyeXx8bnVsbCxmZWF0dXJlczp0LmZlYXR1cmVzfHxudWxsLGRhdGE6dC5kYXRhfHx7fSxlbmNhcHN1bGF0aW9uOnQuZW5jYXBzdWxhdGlvbnx8SG4uRW11bGF0ZWQsaWQ6ImMiLHN0eWxlczp0LnN0eWxlc3x8V24sXzpudWxsLHNldElucHV0Om51bGwsc2NoZW1hczp0LnNjaGVtYXN8fG51bGwsdFZpZXc6bnVsbH0sbz10LmRpcmVjdGl2ZXMsaT10LmZlYXR1cmVzLGE9dC5waXBlcztyZXR1cm4gbi5pZCs9JG4rKyxuLmlucHV0cz1zbyh0LmlucHV0cyxlKSxuLm91dHB1dHM9c28odC5vdXRwdXRzKSxpJiZpLmZvckVhY2goKHQ9PnQobikpKSxuLmRpcmVjdGl2ZURlZnM9bz8oKT0+KCJmdW5jdGlvbiI9PXR5cGVvZiBvP28oKTpvKS5tYXAobm8pOm51bGwsbi5waXBlRGVmcz1hPygpPT4oImZ1bmN0aW9uIj09dHlwZW9mIGE/YSgpOmEpLm1hcChvbyk6bnVsbCxufSkpfWZ1bmN0aW9uIGVvKHQsZSxuKXtjb25zdCBvPXQuybVjbXA7by5kaXJlY3RpdmVEZWZzPSgpPT5lLm1hcChubyksby5waXBlRGVmcz0oKT0+bi5tYXAob28pfWZ1bmN0aW9uIG5vKHQpe2NvbnN0IGU9cG8odCl8fG1vKHQpO2lmKG5nRGV2TW9kZSYmIWUpdGhyb3cgbmV3IEVycm9yKGAnJHt0Lm5hbWV9JyBpcyBuZWl0aGVyICdDb21wb25lbnRUeXBlJyBvciAnRGlyZWN0aXZlVHlwZScuYCk7cmV0dXJuIGV9ZnVuY3Rpb24gb28odCl7Y29uc3QgZT11byh0KTtpZihuZ0Rldk1vZGUmJiFlKXRocm93IG5ldyBFcnJvcihgJyR7dC5uYW1lfScgaXMgbm90IGEgJ1BpcGVUeXBlJy5gKTtyZXR1cm4gZX1jb25zdCBpbz17fTtmdW5jdGlvbiBhbyh0KXtyZXR1cm4gTm4oKCgpPT57Y29uc3QgZT17dHlwZTp0LnR5cGUsYm9vdHN0cmFwOnQuYm9vdHN0cmFwfHxXbixkZWNsYXJhdGlvbnM6dC5kZWNsYXJhdGlvbnN8fFduLGltcG9ydHM6dC5pbXBvcnRzfHxXbixleHBvcnRzOnQuZXhwb3J0c3x8V24sdHJhbnNpdGl2ZUNvbXBpbGVTY29wZXM6bnVsbCxzY2hlbWFzOnQuc2NoZW1hc3x8bnVsbCxpZDp0LmlkfHxudWxsfTtyZXR1cm4gbnVsbCE9dC5pZCYmKGlvW3QuaWRdPXQudHlwZSksZX0pKX1mdW5jdGlvbiBybyh0LGUpe3JldHVybiBObigoKCk9Pntjb25zdCBuPWZvKHQsITApO24uZGVjbGFyYXRpb25zPWUuZGVjbGFyYXRpb25zfHxXbixuLmltcG9ydHM9ZS5pbXBvcnRzfHxXbixuLmV4cG9ydHM9ZS5leHBvcnRzfHxXbn0pKX1mdW5jdGlvbiBzbyh0LGUpe2lmKG51bGw9PXQpcmV0dXJuIEduO2NvbnN0IG49e307Zm9yKGNvbnN0IG8gaW4gdClpZih0Lmhhc093blByb3BlcnR5KG8pKXtsZXQgaT10W29dLGE9aTtBcnJheS5pc0FycmF5KGkpJiYoYT1pWzFdLGk9aVswXSksbltpXT1vLGUmJihlW2ldPWEpfXJldHVybiBufWNvbnN0IGxvPXRvO2Z1bmN0aW9uIGNvKHQpe3JldHVybnt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSxmYWN0b3J5Om51bGwscHVyZTohMSE9PXQucHVyZSxvbkRlc3Ryb3k6dC50eXBlLnByb3RvdHlwZS5uZ09uRGVzdHJveXx8bnVsbH19ZnVuY3Rpb24gcG8odCl7cmV0dXJuIHRbWW5dfHxudWxsfWZ1bmN0aW9uIG1vKHQpe3JldHVybiB0W3FuXXx8bnVsbH1mdW5jdGlvbiB1byh0KXtyZXR1cm4gdFtabl18fG51bGx9ZnVuY3Rpb24gZm8odCxlKXtjb25zdCBuPXRbWG5dfHxudWxsO2lmKCFuJiYhMD09PWUpdGhyb3cgbmV3IEVycm9yKGBUeXBlICR7R2UodCl9IGRvZXMgbm90IGhhdmUgJ8m1bW9kJyBwcm9wZXJ0eS5gKTtyZXR1cm4gbn0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IGdvPTIwLGhvPVsiUm9vdCIsIkNvbXBvbmVudCIsIkVtYmVkZGVkIl0sYm89MTA7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiB5byh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmIm9iamVjdCI9PXR5cGVvZiB0WzFdfWZ1bmN0aW9uIF9vKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpJiYhMD09PXRbMV19ZnVuY3Rpb24gQ28odCl7cmV0dXJuIDAhPSg4JnQuZmxhZ3MpfWZ1bmN0aW9uIE1vKHQpe3JldHVybiAyPT0oMiZ0LmZsYWdzKX1mdW5jdGlvbiB2byh0KXtyZXR1cm4gMT09KDEmdC5mbGFncyl9ZnVuY3Rpb24geG8odCl7cmV0dXJuIG51bGwhPT10LnRlbXBsYXRlfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KZnVuY3Rpb24gT28odCxlKXtQbyh0LGVbMV0pfWZ1bmN0aW9uIFBvKHQsZSl7d28odCksdC5oYXNPd25Qcm9wZXJ0eSgidFZpZXdfIikmJmxuKHQudFZpZXdfLGUsIlRoaXMgVE5vZGUgZG9lcyBub3QgYmVsb25nIHRvIHRoaXMgVFZpZXcuIil9ZnVuY3Rpb24gd28odCl7aG4odCwiVE5vZGUgbXVzdCBiZSBkZWZpbmVkIiksdCYmIm9iamVjdCI9PXR5cGVvZiB0JiZ0Lmhhc093blByb3BlcnR5KCJkaXJlY3RpdmVTdHlsaW5nTGFzdCIpfHxibigiTm90IG9mIHR5cGUgVE5vZGUsIGdvdDogIit0KX1mdW5jdGlvbiBrbyh0KXtobih0LCJFeHBlY3RlZCBUSWN1IHRvIGJlIGRlZmluZWQiKSwibnVtYmVyIiE9dHlwZW9mIHQuY3VycmVudENhc2VMVmlld0luZGV4JiZibigiT2JqZWN0IGlzIG5vdCBvZiBUSWN1IHR5cGUuIil9ZnVuY3Rpb24gU28odCl7aG4odCwiY3VycmVudFROb2RlIHNob3VsZCBleGlzdCEiKSxobih0LnBhcmVudCwiY3VycmVudFROb2RlIHNob3VsZCBoYXZlIGEgcGFyZW50Iil9ZnVuY3Rpb24gRG8odCl7aG4odCwiTENvbnRhaW5lciBtdXN0IGJlIGRlZmluZWQiKSxsbihfbyh0KSwhMCwiRXhwZWN0aW5nIExDb250YWluZXIiKX1mdW5jdGlvbiBFbyh0KXt0JiZsbih5byh0KSwhMCwiRXhwZWN0aW5nIExWaWV3IG9yIHVuZGVmaW5lZCBvciBudWxsIil9ZnVuY3Rpb24gUm8odCl7aG4odCwiTFZpZXcgbXVzdCBiZSBkZWZpbmVkIiksbG4oeW8odCksITAsIkV4cGVjdGluZyBMVmlldyIpfWZ1bmN0aW9uIEFvKHQsZSl7bG4odC5maXJzdENyZWF0ZVBhc3MsITAsZXx8IlNob3VsZCBvbmx5IGJlIGNhbGxlZCBpbiBmaXJzdCBjcmVhdGUgcGFzcy4iKX1mdW5jdGlvbiBUbyh0LGUpe2xuKHQuZmlyc3RVcGRhdGVQYXNzLCEwLGV8fCJTaG91bGQgb25seSBiZSBjYWxsZWQgaW4gZmlyc3QgdXBkYXRlIHBhc3MuIil9ZnVuY3Rpb24gTm8odCxlKXt6byh0WzFdLmV4cGFuZG9TdGFydEluZGV4LHQubGVuZ3RoLGUpfWZ1bmN0aW9uIHpvKHQsZSxuKXt0PD1uJiZuPGV8fGJuKGBJbmRleCBvdXQgb2YgcmFuZ2UgKGV4cGVjdGluZyAke3R9IDw9ICR7bn0gPCAke2V9KWApfWZ1bmN0aW9uIElvKHQsZSl7aG4odCxlfHwiQ29tcG9uZW50IHZpZXdzIHNob3VsZCBhbHdheXMgaGF2ZSBhIHBhcmVudCB2aWV3IChjb21wb25lbnQncyBob3N0IHZpZXcpIil9ZnVuY3Rpb24gSG8odCxlKXtObyh0LGUpLE5vKHQsZSs4KSxhbih0W2UrMF0sImluamVjdG9ySW5kZXggc2hvdWxkIHBvaW50IHRvIGEgYmxvb20gZmlsdGVyIiksYW4odFtlKzFdLCJpbmplY3RvckluZGV4IHNob3VsZCBwb2ludCB0byBhIGJsb29tIGZpbHRlciIpLGFuKHRbZSsyXSwiaW5qZWN0b3JJbmRleCBzaG91bGQgcG9pbnQgdG8gYSBibG9vbSBmaWx0ZXIiKSxhbih0W2UrM10sImluamVjdG9ySW5kZXggc2hvdWxkIHBvaW50IHRvIGEgYmxvb20gZmlsdGVyIiksYW4odFtlKzRdLCJpbmplY3RvckluZGV4IHNob3VsZCBwb2ludCB0byBhIGJsb29tIGZpbHRlciIpLGFuKHRbZSs1XSwiaW5qZWN0b3JJbmRleCBzaG91bGQgcG9pbnQgdG8gYSBibG9vbSBmaWx0ZXIiKSxhbih0W2UrNl0sImluamVjdG9ySW5kZXggc2hvdWxkIHBvaW50IHRvIGEgYmxvb20gZmlsdGVyIiksYW4odFtlKzddLCJpbmplY3RvckluZGV4IHNob3VsZCBwb2ludCB0byBhIGJsb29tIGZpbHRlciIpLGFuKHRbZSs4XSwiaW5qZWN0b3JJbmRleCBzaG91bGQgcG9pbnQgdG8gcGFyZW50IGluamVjdG9yIil9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIEZvKHQsZSl7Y29uc3Qgbj10Lmhhc093blByb3BlcnR5KEpuKTtpZighbiYmITA9PT1lJiZuZ0Rldk1vZGUpdGhyb3cgbmV3IEVycm9yKGBUeXBlICR7R2UodCl9IGRvZXMgbm90IGhhdmUgJ8m1ZmFjJyBwcm9wZXJ0eS5gKTtyZXR1cm4gbj90W0puXTpudWxsfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBMb3tjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5wcmV2aW91c1ZhbHVlPXQsdGhpcy5jdXJyZW50VmFsdWU9ZSx0aGlzLmZpcnN0Q2hhbmdlPW59aXNGaXJzdENoYW5nZSgpe3JldHVybiB0aGlzLmZpcnN0Q2hhbmdlfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gQm8oKXtyZXR1cm4gVm99ZnVuY3Rpb24gVm8odCl7cmV0dXJuIHQudHlwZS5wcm90b3R5cGUubmdPbkNoYW5nZXMmJih0LnNldElucHV0PVVvKSxqb31mdW5jdGlvbiBqbygpe2NvbnN0IHQ9R28odGhpcyksZT1udWxsPT10P3ZvaWQgMDp0LmN1cnJlbnQ7aWYoZSl7Y29uc3Qgbj10LnByZXZpb3VzO2lmKG49PT1Hbil0LnByZXZpb3VzPWU7ZWxzZSBmb3IobGV0IHQgaW4gZSluW3RdPWVbdF07dC5jdXJyZW50PW51bGwsdGhpcy5uZ09uQ2hhbmdlcyhlKX19ZnVuY3Rpb24gVW8odCxlLG4sbyl7Y29uc3QgaT1Hbyh0KXx8KGZ1bmN0aW9uIGEodCxlKXtyZXR1cm4gdC5fX25nU2ltcGxlQ2hhbmdlc19fPWV9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLykodCx7cHJldmlvdXM6R24sY3VycmVudDpudWxsfSkscj1pLmN1cnJlbnR8fChpLmN1cnJlbnQ9e30pLHM9aS5wcmV2aW91cyxsPXRoaXMuZGVjbGFyZWRJbnB1dHNbbl0sYz1zW2xdO3JbbF09bmV3IExvKGMmJmMuY3VycmVudFZhbHVlLGUscz09PUduKSx0W29dPWV9ZnVuY3Rpb24gR28odCl7cmV0dXJuIHQuX19uZ1NpbXBsZUNoYW5nZXNfX3x8bnVsbH1Cby5uZ0luaGVyaXQ9ITA7bGV0IFdvPW51bGw7Y29uc3QgWW89dD0+e1dvPXR9LHFvPWZ1bmN0aW9uKHQsZSxuKXtudWxsIT1XbyYmV28odCxlLG4pfSxabz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLFhvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGhNTC8iOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KbGV0IEtvO2Z1bmN0aW9uIEpvKCl7cmV0dXJuIHZvaWQgMCE9PUtvP0tvOiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQ/ZG9jdW1lbnQ6dm9pZCAwfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi92YXIgUW87ZnVuY3Rpb24gJG8odCl7cmV0dXJuISF0Lmxpc3Rlbn0hKGZ1bmN0aW9uKHQpe3RbdC5JbXBvcnRhbnQ9MV09IkltcG9ydGFudCIsdFt0LkRhc2hDYXNlPTJdPSJEYXNoQ2FzZSJ9KShRb3x8KFFvPXt9KSk7Y29uc3QgdGk9e2NyZWF0ZVJlbmRlcmVyOih0LGUpPT5KbygpfTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmZ1bmN0aW9uIGVpKHQpe2Zvcig7QXJyYXkuaXNBcnJheSh0KTspdD10WzBdO3JldHVybiB0fWZ1bmN0aW9uIG5pKHQsZSl7cmV0dXJuIG5nRGV2TW9kZSYmX24oZSx0KSxuZ0Rldk1vZGUmJmduKHQsZ28sIkV4cGVjdGVkIHRvIGJlIHBhc3QgSEVBREVSX09GRlNFVCIpLGVpKGVbdF0pfWZ1bmN0aW9uIG9pKHQsZSl7bmdEZXZNb2RlJiZPbyh0LGUpLG5nRGV2TW9kZSYmX24oZSx0LmluZGV4KTtjb25zdCBuPWVpKGVbdC5pbmRleF0pO3JldHVybiBuZ0Rldk1vZGUmJiEkbyhlWzExXSkmJnluKG4pLG59ZnVuY3Rpb24gaWkodCxlKXtuZ0Rldk1vZGUmJmZuKGUsLTEsIndyb25nIGluZGV4IGZvciBUTm9kZSIpLG5nRGV2TW9kZSYmbW4oZSx0LmRhdGEubGVuZ3RoLCJ3cm9uZyBpbmRleCBmb3IgVE5vZGUiKTtjb25zdCBuPXQuZGF0YVtlXTtyZXR1cm4gbmdEZXZNb2RlJiZudWxsIT09biYmd28obiksbn1mdW5jdGlvbiBhaSh0LGUpe3JldHVybiBuZ0Rldk1vZGUmJl9uKHQsZSksdFtlXX1mdW5jdGlvbiByaSh0LGUpe25nRGV2TW9kZSYmX24oZSx0KTtjb25zdCBuPWVbdF07cmV0dXJuIHlvKG4pP246blswXX1mdW5jdGlvbiBzaSh0KXtyZXR1cm4gND09KDQmdFsyXSl9ZnVuY3Rpb24gbGkodCl7cmV0dXJuIDEyOD09KDEyOCZ0WzJdKX1mdW5jdGlvbiBjaSh0LGUpe3JldHVybiBudWxsPT1lP251bGw6KG5nRGV2TW9kZSYmX24odCxlKSx0W2VdKX1mdW5jdGlvbiBkaSh0KXt0WzE4XT0wfWZ1bmN0aW9uIHBpKHQsZSl7dFs1XSs9ZTtsZXQgbj10LG89dFszXTtmb3IoO251bGwhPT1vJiYoMT09PWUmJjE9PT1uWzVdfHwtMT09PWUmJjA9PT1uWzVdKTspb1s1XSs9ZSxuPW8sbz1vWzNdfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCBtaT17bEZyYW1lOkJpKG51bGwpLGJpbmRpbmdzRW5hYmxlZDohMCxpc0luQ2hlY2tOb0NoYW5nZXNNb2RlOiExfTtmdW5jdGlvbiB1aSgpe3JldHVybiBtaS5iaW5kaW5nc0VuYWJsZWR9ZnVuY3Rpb24gZmkoKXtyZXR1cm4gbWkubEZyYW1lLmxWaWV3fWZ1bmN0aW9uIGdpKCl7cmV0dXJuIG1pLmxGcmFtZS50Vmlld31mdW5jdGlvbiBoaSh0KXtyZXR1cm4gbWkubEZyYW1lLmNvbnRleHRMVmlldz10LHRbOF19ZnVuY3Rpb24gYmkoKXtsZXQgdD15aSgpO2Zvcig7bnVsbCE9PXQmJjY0PT09dC50eXBlOyl0PXQucGFyZW50O3JldHVybiB0fWZ1bmN0aW9uIHlpKCl7cmV0dXJuIG1pLmxGcmFtZS5jdXJyZW50VE5vZGV9ZnVuY3Rpb24gX2koKXtjb25zdCB0PW1pLmxGcmFtZSxlPXQuY3VycmVudFROb2RlO3JldHVybiB0LmlzUGFyZW50P2U6ZS5wYXJlbnR9ZnVuY3Rpb24gQ2kodCxlKXtuZ0Rldk1vZGUmJnQmJlBvKHQsbWkubEZyYW1lLnRWaWV3KTtjb25zdCBuPW1pLmxGcmFtZTtuLmN1cnJlbnRUTm9kZT10LG4uaXNQYXJlbnQ9ZX1mdW5jdGlvbiBNaSgpe3JldHVybiBtaS5sRnJhbWUuaXNQYXJlbnR9ZnVuY3Rpb24gdmkoKXttaS5sRnJhbWUuaXNQYXJlbnQ9ITF9ZnVuY3Rpb24geGkoKXtyZXR1cm4gbWkuaXNJbkNoZWNrTm9DaGFuZ2VzTW9kZX1mdW5jdGlvbiBPaSh0KXttaS5pc0luQ2hlY2tOb0NoYW5nZXNNb2RlPXR9ZnVuY3Rpb24gUGkoKXtjb25zdCB0PW1pLmxGcmFtZTtsZXQgZT10LmJpbmRpbmdSb290SW5kZXg7cmV0dXJuLTE9PT1lJiYoZT10LmJpbmRpbmdSb290SW5kZXg9dC50Vmlldy5iaW5kaW5nU3RhcnRJbmRleCksZX1mdW5jdGlvbiB3aSgpe3JldHVybiBtaS5sRnJhbWUuYmluZGluZ0luZGV4fWZ1bmN0aW9uIGtpKHQpe3JldHVybiBtaS5sRnJhbWUuYmluZGluZ0luZGV4PXR9ZnVuY3Rpb24gU2koKXtyZXR1cm4gbWkubEZyYW1lLmJpbmRpbmdJbmRleCsrfWZ1bmN0aW9uIERpKHQpe2NvbnN0IGU9bWkubEZyYW1lLG49ZS5iaW5kaW5nSW5kZXg7cmV0dXJuIGUuYmluZGluZ0luZGV4PWUuYmluZGluZ0luZGV4K3Qsbn1mdW5jdGlvbiBFaSh0KXttaS5sRnJhbWUuaW5JMThuPXR9ZnVuY3Rpb24gUmkodCxlKXtjb25zdCBuPW1pLmxGcmFtZTtuLmJpbmRpbmdJbmRleD1uLmJpbmRpbmdSb290SW5kZXg9dCxBaShlKX1mdW5jdGlvbiBBaSh0KXttaS5sRnJhbWUuY3VycmVudERpcmVjdGl2ZUluZGV4PXR9ZnVuY3Rpb24gVGkodCl7Y29uc3QgZT1taS5sRnJhbWUuY3VycmVudERpcmVjdGl2ZUluZGV4O3JldHVybi0xPT09ZT9udWxsOnRbZV19ZnVuY3Rpb24gTmkoKXtyZXR1cm4gbWkubEZyYW1lLmN1cnJlbnRRdWVyeUluZGV4fWZ1bmN0aW9uIHppKHQpe21pLmxGcmFtZS5jdXJyZW50UXVlcnlJbmRleD10fWZ1bmN0aW9uIElpKHQpe2NvbnN0IGU9dFsxXTtyZXR1cm4gMj09PWUudHlwZT8obmdEZXZNb2RlJiZobihlLmRlY2xUTm9kZSwiRW1iZWRkZWQgVE5vZGVzIHNob3VsZCBoYXZlIGRlY2xhcmF0aW9uIHBhcmVudHMuIiksZS5kZWNsVE5vZGUpOjE9PT1lLnR5cGU/dFs2XTpudWxsfWZ1bmN0aW9uIEhpKHQsZSxuKXtpZihuZ0Rldk1vZGUmJkVvKHQpLG4mRW4uU2tpcFNlbGYpe25nRGV2TW9kZSYmUG8oZSx0WzFdKTtsZXQgbz1lLGk9dDtmb3IoO25nRGV2TW9kZSYmaG4obywiUGFyZW50IFROb2RlIHNob3VsZCBiZSBkZWZpbmVkIiksbz1vLnBhcmVudCwhKG51bGwhPT1vfHxuJkVuLkhvc3R8fChvPUlpKGkpLG51bGw9PT1vKXx8KG5nRGV2TW9kZSYmaG4oaSwiUGFyZW50IExWaWV3IHNob3VsZCBiZSBkZWZpbmVkIiksaT1pWzE1XSwxMCZvLnR5cGUpKTspO2lmKG51bGw9PT1vKXJldHVybiExO2U9byx0PWl9bmdEZXZNb2RlJiZPbyhlLHQpO2NvbnN0IG89bWkubEZyYW1lPUxpKCk7cmV0dXJuIG8uY3VycmVudFROb2RlPWUsby5sVmlldz10LCEwfWZ1bmN0aW9uIEZpKHQpe25nRGV2TW9kZSYmY24odFswXSx0WzFdLCI/Pz8/IiksbmdEZXZNb2RlJiZFbyh0KTtjb25zdCBlPUxpKCk7bmdEZXZNb2RlJiYobG4oZS5pc1BhcmVudCwhMCwiRXhwZWN0ZWQgY2xlYW4gTEZyYW1lIiksbG4oZS5sVmlldyxudWxsLCJFeHBlY3RlZCBjbGVhbiBMRnJhbWUiKSxsbihlLnRWaWV3LG51bGwsIkV4cGVjdGVkIGNsZWFuIExGcmFtZSIpLGxuKGUuc2VsZWN0ZWRJbmRleCwtMSwiRXhwZWN0ZWQgY2xlYW4gTEZyYW1lIiksbG4oZS5lbGVtZW50RGVwdGhDb3VudCwwLCJFeHBlY3RlZCBjbGVhbiBMRnJhbWUiKSxsbihlLmN1cnJlbnREaXJlY3RpdmVJbmRleCwtMSwiRXhwZWN0ZWQgY2xlYW4gTEZyYW1lIiksbG4oZS5jdXJyZW50TmFtZXNwYWNlLG51bGwsIkV4cGVjdGVkIGNsZWFuIExGcmFtZSIpLGxuKGUuYmluZGluZ1Jvb3RJbmRleCwtMSwiRXhwZWN0ZWQgY2xlYW4gTEZyYW1lIiksbG4oZS5jdXJyZW50UXVlcnlJbmRleCwwLCJFeHBlY3RlZCBjbGVhbiBMRnJhbWUiKSk7Y29uc3Qgbj10WzFdO21pLmxGcmFtZT1lLG5nRGV2TW9kZSYmbi5maXJzdENoaWxkJiZQbyhuLmZpcnN0Q2hpbGQsbiksZS5jdXJyZW50VE5vZGU9bi5maXJzdENoaWxkLGUubFZpZXc9dCxlLnRWaWV3PW4sZS5jb250ZXh0TFZpZXc9dCxlLmJpbmRpbmdJbmRleD1uLmJpbmRpbmdTdGFydEluZGV4LGUuaW5JMThuPSExfWZ1bmN0aW9uIExpKCl7Y29uc3QgdD1taS5sRnJhbWUsZT1udWxsPT09dD9udWxsOnQuY2hpbGQ7cmV0dXJuIG51bGw9PT1lP0JpKHQpOmV9ZnVuY3Rpb24gQmkodCl7Y29uc3QgZT17Y3VycmVudFROb2RlOm51bGwsaXNQYXJlbnQ6ITAsbFZpZXc6bnVsbCx0VmlldzpudWxsLHNlbGVjdGVkSW5kZXg6LTEsY29udGV4dExWaWV3Om51bGwsZWxlbWVudERlcHRoQ291bnQ6MCxjdXJyZW50TmFtZXNwYWNlOm51bGwsY3VycmVudERpcmVjdGl2ZUluZGV4Oi0xLGJpbmRpbmdSb290SW5kZXg6LTEsYmluZGluZ0luZGV4Oi0xLGN1cnJlbnRRdWVyeUluZGV4OjAscGFyZW50OnQsY2hpbGQ6bnVsbCxpbkkxOG46ITF9O3JldHVybiBudWxsIT09dCYmKHQuY2hpbGQ9ZSksZX1mdW5jdGlvbiBWaSgpe2NvbnN0IHQ9bWkubEZyYW1lO3JldHVybiBtaS5sRnJhbWU9dC5wYXJlbnQsdC5jdXJyZW50VE5vZGU9bnVsbCx0LmxWaWV3PW51bGwsdH1jb25zdCBqaT1WaTtmdW5jdGlvbiBVaSgpe2NvbnN0IHQ9VmkoKTt0LmlzUGFyZW50PSEwLHQudFZpZXc9bnVsbCx0LnNlbGVjdGVkSW5kZXg9LTEsdC5jb250ZXh0TFZpZXc9bnVsbCx0LmVsZW1lbnREZXB0aENvdW50PTAsdC5jdXJyZW50RGlyZWN0aXZlSW5kZXg9LTEsdC5jdXJyZW50TmFtZXNwYWNlPW51bGwsdC5iaW5kaW5nUm9vdEluZGV4PS0xLHQuYmluZGluZ0luZGV4PS0xLHQuY3VycmVudFF1ZXJ5SW5kZXg9MH1mdW5jdGlvbiBHaSgpe3JldHVybiBtaS5sRnJhbWUuc2VsZWN0ZWRJbmRleH1mdW5jdGlvbiBXaSh0KXtuZ0Rldk1vZGUmJi0xIT09dCYmZ24odCxnbywiSW5kZXggbXVzdCBiZSBwYXN0IEhFQURFUl9PRkZTRVQgKG9yIC0xKS4iKSxuZ0Rldk1vZGUmJm1uKHQsbWkubEZyYW1lLmxWaWV3Lmxlbmd0aCwiQ2FuJ3Qgc2V0IGluZGV4IHBhc3NlZCBlbmQgb2YgTFZpZXciKSxtaS5sRnJhbWUuc2VsZWN0ZWRJbmRleD10fWZ1bmN0aW9uIFlpKCl7Y29uc3QgdD1taS5sRnJhbWU7cmV0dXJuIGlpKHQudFZpZXcsdC5zZWxlY3RlZEluZGV4KX1mdW5jdGlvbiBxaSgpe21pLmxGcmFtZS5jdXJyZW50TmFtZXNwYWNlPVpvfWZ1bmN0aW9uIFppKCl7IShmdW5jdGlvbiB0KCl7bWkubEZyYW1lLmN1cnJlbnROYW1lc3BhY2U9bnVsbH0pKCl9ZnVuY3Rpb24gWGkodCxlKXtuZ0Rldk1vZGUmJkFvKHQpO2ZvcihsZXQgbj1lLmRpcmVjdGl2ZVN0YXJ0LG89ZS5kaXJlY3RpdmVFbmQ7bjxvO24rKyl7Y29uc3QgZT10LmRhdGFbbl07bmdEZXZNb2RlJiZobihlLCJFeHBlY3RpbmcgRGlyZWN0aXZlRGVmIik7Y29uc3Qgbz1lLnR5cGUucHJvdG90eXBlLHtuZ0FmdGVyQ29udGVudEluaXQ6aSxuZ0FmdGVyQ29udGVudENoZWNrZWQ6YSxuZ0FmdGVyVmlld0luaXQ6cixuZ0FmdGVyVmlld0NoZWNrZWQ6cyxuZ09uRGVzdHJveTpsfT1vO2kmJih0LmNvbnRlbnRIb29rc3x8KHQuY29udGVudEhvb2tzPVtdKSkucHVzaCgtbixpKSxhJiYoKHQuY29udGVudEhvb2tzfHwodC5jb250ZW50SG9va3M9W10pKS5wdXNoKG4sYSksKHQuY29udGVudENoZWNrSG9va3N8fCh0LmNvbnRlbnRDaGVja0hvb2tzPVtdKSkucHVzaChuLGEpKSxyJiYodC52aWV3SG9va3N8fCh0LnZpZXdIb29rcz1bXSkpLnB1c2goLW4scikscyYmKCh0LnZpZXdIb29rc3x8KHQudmlld0hvb2tzPVtdKSkucHVzaChuLHMpLCh0LnZpZXdDaGVja0hvb2tzfHwodC52aWV3Q2hlY2tIb29rcz1bXSkpLnB1c2gobixzKSksbnVsbCE9bCYmKHQuZGVzdHJveUhvb2tzfHwodC5kZXN0cm95SG9va3M9W10pKS5wdXNoKG4sbCl9fWZ1bmN0aW9uIEtpKHQsZSxuKXskaSh0LGUsMyxuKX1mdW5jdGlvbiBKaSh0LGUsbixvKXtuZ0Rldk1vZGUmJmNuKG4sMywiSW5pdCBwcmUtb3JkZXIgaG9va3Mgc2hvdWxkIG5vdCBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UiKSwoMyZ0WzJdKT09PW4mJiRpKHQsZSxuLG8pfWZ1bmN0aW9uIFFpKHQsZSl7bmdEZXZNb2RlJiZjbihlLDMsIkluaXQgaG9va3MgcGhhc2Ugc2hvdWxkIG5vdCBiZSBpbmNyZW1lbnRlZCBhZnRlciBhbGwgaW5pdCBob29rcyBoYXZlIGJlZW4gcnVuLiIpO2xldCBuPXRbMl07KDMmbik9PT1lJiYobiY9MjA0NyxuKz0xLHRbMl09bil9ZnVuY3Rpb24gJGkodCxlLG4sbyl7bmdEZXZNb2RlJiZsbih4aSgpLCExLCJIb29rcyBzaG91bGQgbmV2ZXIgYmUgcnVuIHdoZW4gaW4gY2hlY2sgbm8gY2hhbmdlcyBtb2RlLiIpO2NvbnN0IGk9bnVsbCE9bz9vOi0xLGE9ZS5sZW5ndGgtMTtsZXQgcj0wO2ZvcihsZXQgcz12b2lkIDAhPT1vPzY1NTM1JnRbMThdOjA7czxhO3MrKylpZigibnVtYmVyIj09dHlwZW9mIGVbcysxXSl7aWYocj1lW3NdLG51bGwhPW8mJnI+PW8pYnJlYWt9ZWxzZSBlW3NdPDAmJih0WzE4XSs9NjU1MzYpLChyPGl8fC0xPT1pKSYmKHRhKHQsbixlLHMpLHRbMThdPSg0Mjk0OTAxNzYwJnRbMThdKStzKzIpLHMrK31mdW5jdGlvbiB0YSh0LGUsbixvKXtjb25zdCBpPW5bb108MCxhPW5bbysxXSxyPXRbaT8tbltvXTpuW29dXTtpZihpKXtpZih0WzJdPj4xMTx0WzE4XT4+MTYmJigzJnRbMl0pPT09ZSl7dFsyXSs9MjA0OCxxbyg0LHIsYSk7dHJ5e2EuY2FsbChyKX1maW5hbGx5e3FvKDUscixhKX19fWVsc2V7cW8oNCxyLGEpO3RyeXthLmNhbGwocil9ZmluYWxseXtxbyg1LHIsYSl9fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3QgZWE9LTE7Y2xhc3MgbmF7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuZmFjdG9yeT10LHRoaXMucmVzb2x2aW5nPSExLG5nRGV2TW9kZSYmaG4odCwiRmFjdG9yeSBub3Qgc3BlY2lmaWVkIiksbmdEZXZNb2RlJiZsbih0eXBlb2YgdCwiZnVuY3Rpb24iLCJFeHBlY3RlZCBmYWN0b3J5IGZ1bmN0aW9uLiIpLHRoaXMuY2FuU2VlVmlld1Byb3ZpZGVycz1lLHRoaXMuaW5qZWN0SW1wbD1ufX1mdW5jdGlvbiBvYSh0KXtsZXQgZT0iIjtyZXR1cm4gMSZ0JiYoZSs9InxUZXh0IiksMiZ0JiYoZSs9InxFbGVtZW50IiksNCZ0JiYoZSs9InxDb250YWluZXIiKSw4JnQmJihlKz0ifEVsZW1lbnRDb250YWluZXIiKSwxNiZ0JiYoZSs9InxQcm9qZWN0aW9uIiksMzImdCYmKGUrPSJ8SWN1Q29udGFpbmVyIiksNjQmdCYmKGUrPSJ8UGxhY2Vob2xkZXIiKSxlLmxlbmd0aD4wP2Uuc3Vic3RyaW5nKDEpOmV9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBpYSh0LGUsbil7aG4odCwic2hvdWxkIGJlIGNhbGxlZCB3aXRoIGEgVE5vZGUiKSwwPT0odC50eXBlJmUpJiZibihufHxgRXhwZWN0ZWQgWyR7b2EoZSl9XSBidXQgZ290ICR7b2EodC50eXBlKX0uYCl9ZnVuY3Rpb24gYWEodCxlLG4pe2NvbnN0IG89JG8odCk7bGV0IGk9MDtmb3IoO2k8bi5sZW5ndGg7KXtjb25zdCBhPW5baV07aWYoIm51bWJlciI9PXR5cGVvZiBhKXtpZigwIT09YSlicmVhaztpKys7Y29uc3Qgcj1uW2krK10scz1uW2krK10sbD1uW2krK107bmdEZXZNb2RlJiZuZ0Rldk1vZGUucmVuZGVyZXJTZXRBdHRyaWJ1dGUrKyxvP3Quc2V0QXR0cmlidXRlKGUscyxsLHIpOmUuc2V0QXR0cmlidXRlTlMocixzLGwpfWVsc2V7Y29uc3Qgcj1hLHM9blsrK2ldO25nRGV2TW9kZSYmbmdEZXZNb2RlLnJlbmRlcmVyU2V0QXR0cmlidXRlKyssc2Eocik/byYmdC5zZXRQcm9wZXJ0eShlLHIscyk6bz90LnNldEF0dHJpYnV0ZShlLHIscyk6ZS5zZXRBdHRyaWJ1dGUocixzKSxpKyt9fXJldHVybiBpfWZ1bmN0aW9uIHJhKHQpe3JldHVybiAzPT09dHx8ND09PXR8fDY9PT10fWZ1bmN0aW9uIHNhKHQpe3JldHVybiA2ND09PXQuY2hhckNvZGVBdCgwKX1mdW5jdGlvbiBsYSh0LGUpe2lmKG51bGw9PT1lfHwwPT09ZS5sZW5ndGgpO2Vsc2UgaWYobnVsbD09PXR8fDA9PT10Lmxlbmd0aCl0PWUuc2xpY2UoKTtlbHNle2xldCBuPS0xO2ZvcihsZXQgbz0wO288ZS5sZW5ndGg7bysrKXtjb25zdCBpPWVbb107Im51bWJlciI9PXR5cGVvZiBpP249aTowPT09bnx8Y2EodCxuLGksbnVsbCwtMT09PW58fDI9PT1uP2VbKytvXTpudWxsKX19cmV0dXJuIHR9ZnVuY3Rpb24gY2EodCxlLG4sbyxpKXtsZXQgYT0wLHI9dC5sZW5ndGg7aWYoLTE9PT1lKXI9LTE7ZWxzZSBmb3IoO2E8dC5sZW5ndGg7KXtjb25zdCBuPXRbYSsrXTtpZigibnVtYmVyIj09dHlwZW9mIG4pe2lmKG49PT1lKXtyPS0xO2JyZWFrfWlmKG4+ZSl7cj1hLTE7YnJlYWt9fX1mb3IoO2E8dC5sZW5ndGg7KXtjb25zdCBlPXRbYV07aWYoIm51bWJlciI9PXR5cGVvZiBlKWJyZWFrO2lmKGU9PT1uKXtpZihudWxsPT09bylyZXR1cm4gdm9pZChudWxsIT09aSYmKHRbYSsxXT1pKSk7aWYobz09PXRbYSsxXSlyZXR1cm4gdm9pZCh0W2ErMl09aSl9YSsrLG51bGwhPT1vJiZhKyssbnVsbCE9PWkmJmErK30tMSE9PXImJih0LnNwbGljZShyLDAsZSksYT1yKzEpLHQuc3BsaWNlKGErKywwLG4pLG51bGwhPT1vJiZ0LnNwbGljZShhKyssMCxvKSxudWxsIT09aSYmdC5zcGxpY2UoYSsrLDAsaSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIGRhKHQpe3JldHVybiB0IT09ZWF9ZnVuY3Rpb24gcGEodCl7cmV0dXJuIG5nRGV2TW9kZSYmYW4odCwiTnVtYmVyIGV4cGVjdGVkIiksbmdEZXZNb2RlJiZjbih0LC0xLCJOb3QgYSB2YWxpZCBzdGF0ZS4iKSxuZ0Rldk1vZGUmJmZuKDMyNzY3JnQsZ28sIlBhcmVudCBpbmplY3RvciBtdXN0IGJlIHBvaW50aW5nIHBhc3QgSEVBREVSX09GRlNFVC4iKSwzMjc2NyZ0fWZ1bmN0aW9uIG1hKHQsZSl7bGV0IG49KGZ1bmN0aW9uIG8odCl7cmV0dXJuIHQ+PjE2fSkodCksaT1lO2Zvcig7bj4wOylpPWlbMTVdLG4tLTtyZXR1cm4gaX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovbGV0IHVhPSEwO2Z1bmN0aW9uIGZhKHQpe2NvbnN0IGU9dWE7cmV0dXJuIHVhPXQsZX1sZXQgZ2E9MDtmdW5jdGlvbiBoYSh0LGUpe2NvbnN0IG49eWEodCxlKTtpZigtMSE9PW4pcmV0dXJuIG47Y29uc3Qgbz1lWzFdO28uZmlyc3RDcmVhdGVQYXNzJiYodC5pbmplY3RvckluZGV4PWUubGVuZ3RoLGJhKG8uZGF0YSx0KSxiYShlLG51bGwpLGJhKG8uYmx1ZXByaW50LG51bGwpKTtjb25zdCBpPV9hKHQsZSksYT10LmluamVjdG9ySW5kZXg7aWYoZGEoaSkpe2NvbnN0IHQ9cGEoaSksbj1tYShpLGUpLG89blsxXS5kYXRhO2ZvcihsZXQgaT0wO2k8ODtpKyspZVthK2ldPW5bdCtpXXxvW3QraV19cmV0dXJuIGVbYSs4XT1pLGF9ZnVuY3Rpb24gYmEodCxlKXt0LnB1c2goMCwwLDAsMCwwLDAsMCwwLGUpfWZ1bmN0aW9uIHlhKHQsZSl7cmV0dXJuLTE9PT10LmluamVjdG9ySW5kZXh8fHQucGFyZW50JiZ0LnBhcmVudC5pbmplY3RvckluZGV4PT09dC5pbmplY3RvckluZGV4fHxudWxsPT09ZVt0LmluamVjdG9ySW5kZXgrOF0/LTE6KG5nRGV2TW9kZSYmX24oZSx0LmluamVjdG9ySW5kZXgpLHQuaW5qZWN0b3JJbmRleCl9ZnVuY3Rpb24gX2EodCxlKXtpZih0LnBhcmVudCYmLTEhPT10LnBhcmVudC5pbmplY3RvckluZGV4KXJldHVybiB0LnBhcmVudC5pbmplY3RvckluZGV4O2xldCBuPTAsbz1udWxsLGk9ZTtmb3IoO251bGwhPT1pOyl7Y29uc3QgdD1pWzFdLGU9dC50eXBlO2lmKDI9PT1lPyhuZ0Rldk1vZGUmJmhuKHQuZGVjbFROb2RlLCJFbWJlZGRlZCBUTm9kZXMgc2hvdWxkIGhhdmUgZGVjbGFyYXRpb24gcGFyZW50cy4iKSxvPXQuZGVjbFROb2RlKToxPT09ZT9vPWlbNl06KG5nRGV2TW9kZSYmbG4odC50eXBlLDAsIlJvb3QgdHlwZSBleHBlY3RlZCIpLG89bnVsbCksbnVsbD09PW8pcmV0dXJuIGVhO2lmKG5nRGV2TW9kZSYmbyYmT28obyxpWzE1XSksbisrLGk9aVsxNV0sLTEhPT1vLmluamVjdG9ySW5kZXgpcmV0dXJuIG8uaW5qZWN0b3JJbmRleHxuPDwxNn1yZXR1cm4gZWF9ZnVuY3Rpb24gQ2EodCxlLG4peyEoZnVuY3Rpb24gbyh0LGUsbil7bGV0IG87bmdEZXZNb2RlJiZsbihlLmZpcnN0Q3JlYXRlUGFzcywhMCwiZXhwZWN0ZWQgZmlyc3RDcmVhdGVQYXNzIHRvIGJlIHRydWUiKSwic3RyaW5nIj09dHlwZW9mIG4/bz1uLmNoYXJDb2RlQXQoMCl8fDA6bi5oYXNPd25Qcm9wZXJ0eShRbikmJihvPW5bUW5dKSxudWxsPT1vJiYobz1uW1FuXT1nYSsrKTtjb25zdCBpPTI1NSZvO2UuZGF0YVt0KyhpPj41KV18PTE8PGl9KSh0LGUsbil9ZnVuY3Rpb24gTWEodCxlLG4pe2lmKG4mRW4uT3B0aW9uYWwpcmV0dXJuIHQ7b24oZSwiTm9kZUluamVjdG9yIil9ZnVuY3Rpb24gdmEodCxlLG4sbyl7aWYobiZFbi5PcHRpb25hbCYmdm9pZCAwPT09byYmKG89bnVsbCksMD09KG4mKEVuLlNlbGZ8RW4uSG9zdCkpKXtjb25zdCBpPXRbOV0sYT1Bbih2b2lkIDApO3RyeXtyZXR1cm4gaT9pLmdldChlLG8sbiZFbi5PcHRpb25hbCk6VG4oZSxvLG4mRW4uT3B0aW9uYWwpfWZpbmFsbHl7QW4oYSl9fXJldHVybiBNYShvLGUsbil9ZnVuY3Rpb24geGEodCxlLG4sbz1Fbi5EZWZhdWx0LGkpe2lmKG51bGwhPT10KXtjb25zdCBhPShmdW5jdGlvbiBhKHQpe2lmKG5nRGV2TW9kZSYmaG4odCwidG9rZW4gbXVzdCBiZSBkZWZpbmVkIiksInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiB0LmNoYXJDb2RlQXQoMCl8fDA7Y29uc3QgZT10Lmhhc093blByb3BlcnR5KFFuKT90W1FuXTp2b2lkIDA7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlP2U+PTA/MjU1JmU6KG5nRGV2TW9kZSYmbG4oZSwtMSwiRXhwZWN0aW5nIHRvIGdldCBTcGVjaWFsIEluamVjdG9yIElkIiksUGEpOmV9KShuKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl7aWYoIUhpKGUsdCxvKSlyZXR1cm4gbyZFbi5Ib3N0P01hKGksbixvKTp2YShlLG4sbyxpKTt0cnl7Y29uc3QgdD1hKG8pO2lmKG51bGwhPXR8fG8mRW4uT3B0aW9uYWwpcmV0dXJuIHQ7b24obil9ZmluYWxseXtqaSgpfX1lbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgYSl7bGV0IGk9bnVsbCxyPXlhKHQsZSkscz1lYSxsPW8mRW4uSG9zdD9lWzE2XVs2XTpudWxsO2ZvcigoLTE9PT1yfHxvJkVuLlNraXBTZWxmKSYmKHM9LTE9PT1yP19hKHQsZSk6ZVtyKzhdLHMhPT1lYSYmRWEobywhMSk/KGk9ZVsxXSxyPXBhKHMpLGU9bWEocyxlKSk6cj0tMSk7LTEhPT1yOyl7bmdEZXZNb2RlJiZIbyhlLHIpO2NvbnN0IHQ9ZVsxXTtpZihuZ0Rldk1vZGUmJk9vKHQuZGF0YVtyKzhdLGUpLERhKGEscix0LmRhdGEpKXtjb25zdCB0PXdhKHIsZSxuLGksbyxsKTtpZih0IT09T2EpcmV0dXJuIHR9cz1lW3IrOF0scyE9PWVhJiZFYShvLGVbMV0uZGF0YVtyKzhdPT09bCkmJkRhKGEscixlKT8oaT10LHI9cGEocyksZT1tYShzLGUpKTpyPS0xfX19cmV0dXJuIHZhKGUsbixvLGkpfWNvbnN0IE9hPXt9O2Z1bmN0aW9uIFBhKCl7cmV0dXJuIG5ldyBSYShiaSgpLGZpKCkpfWZ1bmN0aW9uIHdhKHQsZSxuLG8saSxhKXtjb25zdCByPWVbMV0scz1yLmRhdGFbdCs4XSxsPWthKHMscixuLG51bGw9PW8/TW8ocykmJnVhOm8hPXImJjAhPSgzJnMudHlwZSksaSZFbi5Ib3N0JiZhPT09cyk7cmV0dXJuIG51bGwhPT1sP1NhKGUscixsLHMpOk9hfWZ1bmN0aW9uIGthKHQsZSxuLG8saSl7Y29uc3QgYT10LnByb3ZpZGVySW5kZXhlcyxyPWUuZGF0YSxzPTEwNDg1NzUmYSxsPXQuZGlyZWN0aXZlU3RhcnQsYz1hPj4yMCxkPWk/cytjOnQuZGlyZWN0aXZlRW5kO2ZvcihsZXQgdD1vP3M6cytjO3Q8ZDt0Kyspe2NvbnN0IGU9clt0XTtpZih0PGwmJm49PT1lfHx0Pj1sJiZlLnR5cGU9PT1uKXJldHVybiB0fWlmKGkpe2NvbnN0IHQ9cltsXTtpZih0JiZ4byh0KSYmdC50eXBlPT09bilyZXR1cm4gbH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBTYSh0LGUsbixvKXtsZXQgaT10W25dO2NvbnN0IGE9ZS5kYXRhO2lmKChmdW5jdGlvbiByKHQpe3JldHVybiB0IGluc3RhbmNlb2YgbmF9KShpKSl7Y29uc3Qgcj1pO3IucmVzb2x2aW5nJiZlbih0bihhW25dKSk7Y29uc3Qgcz1mYShyLmNhblNlZVZpZXdQcm92aWRlcnMpO3IucmVzb2x2aW5nPSEwO2NvbnN0IGw9ci5pbmplY3RJbXBsP0FuKHIuaW5qZWN0SW1wbCk6bnVsbCxjPUhpKHQsbyxFbi5EZWZhdWx0KTtuZ0Rldk1vZGUmJmxuKGMsITAsIkJlY2F1c2UgZmxhZ3MgZG8gbm90IGNvbnRhaW4gYFNraXBTZWxmJyB3ZSBleHBlY3QgdGhpcyB0byBhbHdheXMgc3VjY2VlZC4iKTt0cnl7aT10W25dPXIuZmFjdG9yeSh2b2lkIDAsYSx0LG8pLGUuZmlyc3RDcmVhdGVQYXNzJiZuPj1vLmRpcmVjdGl2ZVN0YXJ0JiYobmdEZXZNb2RlJiYoZnVuY3Rpb24gcyh0KXt2b2lkIDAhPT10LnR5cGUmJm51bGwhPXQuc2VsZWN0b3JzJiZ2b2lkIDAhPT10LmlucHV0c3x8Ym4oIkV4cGVjdGVkIGEgRGlyZWN0aXZlRGVmL0NvbXBvbmVudERlZiBhbmQgdGhpcyBvYmplY3QgZG9lcyBub3Qgc2VlbSB0byBoYXZlIHRoZSBleHBlY3RlZCBzaGFwZS4iKX0pKGFbbl0pLCgKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmZ1bmN0aW9uIGwodCxlLG4pe25nRGV2TW9kZSYmQW8obik7Y29uc3R7bmdPbkNoYW5nZXM6byxuZ09uSW5pdDppLG5nRG9DaGVjazphfT1lLnR5cGUucHJvdG90eXBlO2lmKG8pe2NvbnN0IG89Vm8oZSk7KG4ucHJlT3JkZXJIb29rc3x8KG4ucHJlT3JkZXJIb29rcz1bXSkpLnB1c2godCxvKSwobi5wcmVPcmRlckNoZWNrSG9va3N8fChuLnByZU9yZGVyQ2hlY2tIb29rcz1bXSkpLnB1c2godCxvKX1pJiYobi5wcmVPcmRlckhvb2tzfHwobi5wcmVPcmRlckhvb2tzPVtdKSkucHVzaCgwLXQsaSksYSYmKChuLnByZU9yZGVySG9va3N8fChuLnByZU9yZGVySG9va3M9W10pKS5wdXNoKHQsYSksKG4ucHJlT3JkZXJDaGVja0hvb2tzfHwobi5wcmVPcmRlckNoZWNrSG9va3M9W10pKS5wdXNoKHQsYSkpfSkobixhW25dLGUpKX1maW5hbGx5e251bGwhPT1sJiZBbihsKSxmYShzKSxyLnJlc29sdmluZz0hMSxqaSgpfX1yZXR1cm4gaX1mdW5jdGlvbiBEYSh0LGUsbil7cmV0dXJuISEobltlKyh0Pj41KV0mMTw8dCl9ZnVuY3Rpb24gRWEodCxlKXtyZXR1cm4hKHQmRW4uU2VsZnx8dCZFbi5Ib3N0JiZlKX1jbGFzcyBSYXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX3ROb2RlPXQsdGhpcy5fbFZpZXc9ZX1nZXQodCxlKXtyZXR1cm4geGEodGhpcy5fdE5vZGUsdGhpcy5fbFZpZXcsdCx2b2lkIDAsZSl9fWZ1bmN0aW9uIEFhKHQpe3JldHVybiBObigoKCk9Pntjb25zdCBlPXQucHJvdG90eXBlLmNvbnN0cnVjdG9yLG49ZVtKbl18fFRhKGUpLG89T2JqZWN0LnByb3RvdHlwZTtsZXQgaT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodC5wcm90b3R5cGUpLmNvbnN0cnVjdG9yO2Zvcig7aSYmaSE9PW87KXtjb25zdCB0PWlbSm5dfHxUYShpKTtpZih0JiZ0IT09bilyZXR1cm4gdDtpPU9iamVjdC5nZXRQcm90b3R5cGVPZihpKX1yZXR1cm4gdD0+bmV3IHR9KSl9ZnVuY3Rpb24gVGEodCl7cmV0dXJuIFhlKHQpPygpPT57Y29uc3QgZT1UYShaZSh0KSk7cmV0dXJuIGUmJmUoKX06Rm8odCl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIE5hKHQpe3JldHVybihmdW5jdGlvbiBlKHQsbil7aWYobmdEZXZNb2RlJiZpYSh0LDE1KSxuZ0Rldk1vZGUmJmhuKHQsImV4cGVjdGluZyB0Tm9kZSIpLCJjbGFzcyI9PT1uKXJldHVybiB0LmNsYXNzZXM7aWYoInN0eWxlIj09PW4pcmV0dXJuIHQuc3R5bGVzO2NvbnN0IG89dC5hdHRycztpZihvKXtjb25zdCB0PW8ubGVuZ3RoO2xldCBlPTA7Zm9yKDtlPHQ7KXtjb25zdCBpPW9bZV07aWYocmEoaSkpYnJlYWs7aWYoMD09PWkpZSs9MjtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgaSlmb3IoZSsrO2U8dCYmInN0cmluZyI9PXR5cGVvZiBvW2VdOyllKys7ZWxzZXtpZihpPT09bilyZXR1cm4gb1tlKzFdO2UrPTJ9fX1yZXR1cm4gbnVsbH0pKGJpKCksdCl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NvbnN0IHphPSJfX2Fubm90YXRpb25zX18iLElhPSJfX3BhcmFtZXRlcnNfXyIsSGE9Il9fcHJvcF9fbWV0YWRhdGFfXyI7ZnVuY3Rpb24gRmEodCxlLG4sbyxpKXtyZXR1cm4gTm4oKCgpPT57Y29uc3QgYT1MYShlKTtmdW5jdGlvbiByKC4uLnQpe2lmKHRoaXMgaW5zdGFuY2VvZiByKXJldHVybiBhLmNhbGwodGhpcywuLi50KSx0aGlzO2NvbnN0IGU9bmV3IHIoLi4udCk7cmV0dXJuIGZ1bmN0aW9uIG4oYSl7cmV0dXJuIGkmJmkoYSwuLi50KSwoYS5oYXNPd25Qcm9wZXJ0eSh6YSk/YVt6YV06T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsemEse3ZhbHVlOltdfSlbemFdKS5wdXNoKGUpLG8mJm8oYSksYX19cmV0dXJuIG4mJihyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSksci5wcm90b3R5cGUubmdNZXRhZGF0YU5hbWU9dCxyLmFubm90YXRpb25DbHM9cixyfSkpfWZ1bmN0aW9uIExhKHQpe3JldHVybiBmdW5jdGlvbiBlKC4uLm4pe2lmKHQpe2NvbnN0IGU9dCguLi5uKTtmb3IoY29uc3QgdCBpbiBlKXRoaXNbdF09ZVt0XX19fWZ1bmN0aW9uIEJhKHQsZSxuKXtyZXR1cm4gTm4oKCgpPT57Y29uc3Qgbz1MYShlKTtmdW5jdGlvbiBpKC4uLnQpe2lmKHRoaXMgaW5zdGFuY2VvZiBpKXJldHVybiBvLmFwcGx5KHRoaXMsdCksdGhpcztjb25zdCBlPW5ldyBpKC4uLnQpO3JldHVybiBuLmFubm90YXRpb249ZSxuO2Z1bmN0aW9uIG4odCxuLG8pe2NvbnN0IGk9dC5oYXNPd25Qcm9wZXJ0eShJYSk/dFtJYV06T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsSWEse3ZhbHVlOltdfSlbSWFdO2Zvcig7aS5sZW5ndGg8PW87KWkucHVzaChudWxsKTtyZXR1cm4oaVtvXT1pW29dfHxbXSkucHVzaChlKSx0fX1yZXR1cm4gbiYmKGkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKSxpLnByb3RvdHlwZS5uZ01ldGFkYXRhTmFtZT10LGkuYW5ub3RhdGlvbkNscz1pLGl9KSl9ZnVuY3Rpb24gVmEodCxlLG4sbyl7cmV0dXJuIE5uKCgoKT0+e2NvbnN0IGk9TGEoZSk7ZnVuY3Rpb24gYSguLi50KXtpZih0aGlzIGluc3RhbmNlb2YgYSlyZXR1cm4gaS5hcHBseSh0aGlzLHQpLHRoaXM7Y29uc3QgZT1uZXcgYSguLi50KTtyZXR1cm4gZnVuY3Rpb24gbihpLGEpe2NvbnN0IHI9aS5jb25zdHJ1Y3RvcixzPXIuaGFzT3duUHJvcGVydHkoSGEpP3JbSGFdOk9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLEhhLHt2YWx1ZTp7fX0pW0hhXTtzW2FdPXMuaGFzT3duUHJvcGVydHkoYSkmJnNbYV18fFtdLHNbYV0udW5zaGlmdChlKSxvJiZvKGksYSwuLi50KX19cmV0dXJuIG4mJihhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSksYS5wcm90b3R5cGUubmdNZXRhZGF0YU5hbWU9dCxhLmFubm90YXRpb25DbHM9YSxhfSkpfWNvbnN0IGphPShmdW5jdGlvbiBVYSgpe3JldHVybiBCYSgiQXR0cmlidXRlIiwodD0+KHthdHRyaWJ1dGVOYW1lOnQsX19OR19FTEVNRU5UX0lEX186KCk9Pk5hKHQpfSkpKX0pKCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBHYXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX2Rlc2M9dCx0aGlzLm5nTWV0YWRhdGFOYW1lPSJJbmplY3Rpb25Ub2tlbiIsdGhpcy7JtXByb3Y9dm9pZCAwLCJudW1iZXIiPT10eXBlb2YgZT8oKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZtbihlLDAsIk9ubHkgbmVnYXRpdmUgbnVtYmVycyBhcmUgc3VwcG9ydGVkIGhlcmUiKSx0aGlzLl9fTkdfRUxFTUVOVF9JRF9fPWUpOnZvaWQgMCE9PWUmJih0aGlzLsm1cHJvdj1Nbih7dG9rZW46dGhpcyxwcm92aWRlZEluOmUucHJvdmlkZWRJbnx8InJvb3QiLGZhY3Rvcnk6ZS5mYWN0b3J5fSkpfXRvU3RyaW5nKCl7cmV0dXJuYEluamVjdGlvblRva2VuICR7dGhpcy5fZGVzY31gfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovbmV3IEdhKCJBbmFseXplRm9yRW50cnlDb21wb25lbnRzIik7Y2xhc3MgV2F7fWNvbnN0IFlhPVZhKCJDb250ZW50Q2hpbGRyZW4iLCgodCxlPXt9KT0+T2JqZWN0LmFzc2lnbih7c2VsZWN0b3I6dCxmaXJzdDohMSxpc1ZpZXdRdWVyeTohMSxkZXNjZW5kYW50czohMSxlbWl0RGlzdGluY3RDaGFuZ2VzT25seTohMH0sZSkpLFdhKSxxYT1WYSgiQ29udGVudENoaWxkIiwoKHQsZT17fSk9Pk9iamVjdC5hc3NpZ24oe3NlbGVjdG9yOnQsZmlyc3Q6ITAsaXNWaWV3UXVlcnk6ITEsZGVzY2VuZGFudHM6ITB9LGUpKSxXYSk7VmEoIlZpZXdDaGlsZHJlbiIsKCh0LGU9e30pPT5PYmplY3QuYXNzaWduKHtzZWxlY3Rvcjp0LGZpcnN0OiExLGlzVmlld1F1ZXJ5OiEwLGRlc2NlbmRhbnRzOiEwLGVtaXREaXN0aW5jdENoYW5nZXNPbmx5OiEwfSxlKSksV2EpO2NvbnN0IFphPVZhKCJWaWV3Q2hpbGQiLCgodCxlKT0+T2JqZWN0LmFzc2lnbih7c2VsZWN0b3I6dCxmaXJzdDohMCxpc1ZpZXdRdWVyeTohMCxkZXNjZW5kYW50czohMH0sZSkpLFdhKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCnZhciBYYSxLYTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmZ1bmN0aW9uIEphKHQpe2NvbnN0IGU9am4ubmc7aWYoZSYmZS7JtWNvbXBpbGVyRmFjYWRlKXJldHVybiBlLsm1Y29tcGlsZXJGYWNhZGU7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSl7Y29uc29sZS5lcnJvcihgSklUIGNvbXBpbGF0aW9uIGZhaWxlZCBmb3IgJHt0LmtpbmR9YCx0LnR5cGUpO2xldCBlPWBUaGUgJHt0LmtpbmR9ICcke3QudHlwZS5uYW1lfScgbmVlZHMgdG8gYmUgY29tcGlsZWQgdXNpbmcgdGhlIEpJVCBjb21waWxlciwgYnV0ICdAYW5ndWxhci9jb21waWxlcicgaXMgbm90IGF2YWlsYWJsZS5cblxuYDt0aHJvdyAxPT09dC51c2FnZT8oZSs9YFRoZSAke3Qua2luZH0gaXMgcGFydCBvZiBhIGxpYnJhcnkgdGhhdCBoYXMgYmVlbiBwYXJ0aWFsbHkgY29tcGlsZWQuXG5gLGUrPSJIb3dldmVyLCB0aGUgQW5ndWxhciBMaW5rZXIgaGFzIG5vdCBwcm9jZXNzZWQgdGhlIGxpYnJhcnkgc3VjaCB0aGF0IEpJVCBjb21waWxhdGlvbiBpcyB1c2VkIGFzIGZhbGxiYWNrLlxuIixlKz0iXG4iLGUrPSJJZGVhbGx5LCB0aGUgbGlicmFyeSBpcyBwcm9jZXNzZWQgdXNpbmcgdGhlIEFuZ3VsYXIgTGlua2VyIHRvIGJlY29tZSBmdWxseSBBT1QgY29tcGlsZWQuXG4iKTplKz0iSklUIGNvbXBpbGF0aW9uIGlzIGRpc2NvdXJhZ2VkIGZvciBwcm9kdWN0aW9uIHVzZS1jYXNlcyEgQ29uc2lkZXIgdXNpbmcgQU9UIG1vZGUgaW5zdGVhZC5cbiIsZSs9IkFsdGVybmF0aXZlbHksIHRoZSBKSVQgY29tcGlsZXIgc2hvdWxkIGJlIGxvYWRlZCBieSBib290c3RyYXBwaW5nIHVzaW5nICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyLWR5bmFtaWMnIG9yICdAYW5ndWxhci9wbGF0Zm9ybS1zZXJ2ZXInLFxuIixlKz0ib3IgbWFudWFsbHkgcHJvdmlkZSB0aGUgY29tcGlsZXIgd2l0aCAnaW1wb3J0IFwiQGFuZ3VsYXIvY29tcGlsZXJcIjsnIGJlZm9yZSBib290c3RyYXBwaW5nLiIsbmV3IEVycm9yKGUpfXRocm93IG5ldyBFcnJvcigiSklUIGNvbXBpbGVyIHVuYXZhaWxhYmxlIil9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLyEoZnVuY3Rpb24odCl7dFt0LkRpcmVjdGl2ZT0wXT0iRGlyZWN0aXZlIix0W3QuQ29tcG9uZW50PTFdPSJDb21wb25lbnQiLHRbdC5JbmplY3RhYmxlPTJdPSJJbmplY3RhYmxlIix0W3QuUGlwZT0zXT0iUGlwZSIsdFt0Lk5nTW9kdWxlPTRdPSJOZ01vZHVsZSJ9KShYYXx8KFhhPXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5FbXVsYXRlZD0wXT0iRW11bGF0ZWQiLHRbdC5Ob25lPTJdPSJOb25lIix0W3QuU2hhZG93RG9tPTNdPSJTaGFkb3dEb20ifSkoS2F8fChLYT17fSkpO2NvbnN0IFFhPUZ1bmN0aW9uO2Z1bmN0aW9uICRhKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIHRyKHQsZSl7dm9pZCAwPT09ZSYmKGU9dCk7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2xldCBvPXRbbl07QXJyYXkuaXNBcnJheShvKT8oZT09PXQmJihlPXQuc2xpY2UoMCxuKSksdHIobyxlKSk6ZSE9PXQmJmUucHVzaChvKX1yZXR1cm4gZX1mdW5jdGlvbiBlcih0LGUpe3QuZm9yRWFjaCgodD0+QXJyYXkuaXNBcnJheSh0KT9lcih0LGUpOmUodCkpKX1mdW5jdGlvbiBucih0LGUsbil7ZT49dC5sZW5ndGg/dC5wdXNoKG4pOnQuc3BsaWNlKGUsMCxuKX1mdW5jdGlvbiBvcih0LGUpe3JldHVybiBlPj10Lmxlbmd0aC0xP3QucG9wKCk6dC5zcGxpY2UoZSwxKVswXX1mdW5jdGlvbiBpcih0LGUpe2NvbnN0IG49W107Zm9yKGxldCBvPTA7bzx0O28rKyluLnB1c2goZSk7cmV0dXJuIG59ZnVuY3Rpb24gYXIodCxlLG4pe2xldCBvPXNyKHQsZSk7cmV0dXJuIG8+PTA/dFsxfG9dPW46KG89fm8sKGZ1bmN0aW9uIGkodCxlLG4sbyl7bmdEZXZNb2RlJiZ1bihlLHQubGVuZ3RoLCJDYW4ndCBpbnNlcnQgcGFzdCBhcnJheSBlbmQuIik7bGV0IGk9dC5sZW5ndGg7aWYoaT09ZSl0LnB1c2gobixvKTtlbHNlIGlmKDE9PT1pKXQucHVzaChvLHRbMF0pLHRbMF09bjtlbHNle2ZvcihpLS0sdC5wdXNoKHRbaS0xXSx0W2ldKTtpPmU7KXRbaV09dFtpLTJdLGktLTt0W2VdPW4sdFtlKzFdPW99fSkodCxvLGUsbikpLG99ZnVuY3Rpb24gcnIodCxlKXtjb25zdCBuPXNyKHQsZSk7aWYobj49MClyZXR1cm4gdFsxfG5dfWZ1bmN0aW9uIHNyKHQsZSl7cmV0dXJuKGZ1bmN0aW9uIG4odCxlLG8pe25nRGV2TW9kZSYmbG4oQXJyYXkuaXNBcnJheSh0KSwhMCwiRXhwZWN0aW5nIGFuIGFycmF5Iik7bGV0IGk9MCxhPXQubGVuZ3RoPj5vO2Zvcig7YSE9PWk7KXtjb25zdCBuPWkrKGEtaT4+MSkscj10W248PG9dO2lmKGU9PT1yKXJldHVybiBuPDxvO3I+ZT9hPW46aT1uKzF9cmV0dXJufihhPDxvKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKSh0LGUsMSl9Y29uc3QgbHI9L15mdW5jdGlvblxzK1xTK1woXClccyp7W1xzXFNdK1wuYXBwbHlcKHRoaXMsXHMqKGFyZ3VtZW50c3woPzpbXigpXStcKFxbXF0sKT9bXigpXStcKGFyZ3VtZW50c1wpKVwpLyxjcj0vXmNsYXNzXHMrW0EtWmEtelxkJF9dKlxzKmV4dGVuZHNccytbXntdK3svLGRyPS9eY2xhc3NccytbQS1aYS16XGQkX10qXHMqZXh0ZW5kc1xzK1tee10re1tcc1xTXSpjb25zdHJ1Y3RvclxzKlwoLyxwcj0vXmNsYXNzXHMrW0EtWmEtelxkJF9dKlxzKmV4dGVuZHNccytbXntdK3tbXHNcU10qY29uc3RydWN0b3JccypcKFwpXHMqe1xzKnN1cGVyXChcLlwuXC5hcmd1bWVudHNcKS87Y2xhc3MgbXJ7Y29uc3RydWN0b3IodCl7dGhpcy5fcmVmbGVjdD10fHxqbi5SZWZsZWN0fWlzUmVmbGVjdGlvbkVuYWJsZWQoKXtyZXR1cm4hMH1mYWN0b3J5KHQpe3JldHVybiguLi5lKT0+bmV3IHQoLi4uZSl9X3ppcFR5cGVzQW5kQW5ub3RhdGlvbnModCxlKXtsZXQgbjtuPWlyKHZvaWQgMD09PXQ/ZS5sZW5ndGg6dC5sZW5ndGgpO2ZvcihsZXQgbz0wO288bi5sZW5ndGg7bysrKW5bb109dm9pZCAwPT09dD9bXTp0W29dJiZ0W29dIT1PYmplY3Q/W3Rbb11dOltdLGUmJm51bGwhPWVbb10mJihuW29dPW5bb10uY29uY2F0KGVbb10pKTtyZXR1cm4gbn1fb3duUGFyYW1ldGVycyh0LGUpe2lmKChmdW5jdGlvbiBuKHQpe3JldHVybiBsci50ZXN0KHQpfHxwci50ZXN0KHQpfHxjci50ZXN0KHQpJiYhZHIudGVzdCh0KX0pKHQudG9TdHJpbmcoKSkpcmV0dXJuIG51bGw7aWYodC5wYXJhbWV0ZXJzJiZ0LnBhcmFtZXRlcnMhPT1lLnBhcmFtZXRlcnMpcmV0dXJuIHQucGFyYW1ldGVycztjb25zdCBvPXQuY3RvclBhcmFtZXRlcnM7aWYobyYmbyE9PWUuY3RvclBhcmFtZXRlcnMpe2NvbnN0IHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG8/bygpOm8sZT10Lm1hcCgodD0+dCYmdC50eXBlKSksbj10Lm1hcCgodD0+dCYmdXIodC5kZWNvcmF0b3JzKSkpO3JldHVybiB0aGlzLl96aXBUeXBlc0FuZEFubm90YXRpb25zKGUsbil9Y29uc3QgaT10Lmhhc093blByb3BlcnR5KElhKSYmdFtJYV0sYT10aGlzLl9yZWZsZWN0JiZ0aGlzLl9yZWZsZWN0LmdldE93bk1ldGFkYXRhJiZ0aGlzLl9yZWZsZWN0LmdldE93bk1ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsdCk7cmV0dXJuIGF8fGk/dGhpcy5femlwVHlwZXNBbmRBbm5vdGF0aW9ucyhhLGkpOmlyKHQubGVuZ3RoKX1wYXJhbWV0ZXJzKHQpe2lmKCEkYSh0KSlyZXR1cm5bXTtjb25zdCBlPWZyKHQpO2xldCBuPXRoaXMuX293blBhcmFtZXRlcnModCxlKTtyZXR1cm4gbnx8ZT09PU9iamVjdHx8KG49dGhpcy5wYXJhbWV0ZXJzKGUpKSxufHxbXX1fb3duQW5ub3RhdGlvbnModCxlKXtpZih0LmFubm90YXRpb25zJiZ0LmFubm90YXRpb25zIT09ZS5hbm5vdGF0aW9ucyl7bGV0IGU9dC5hbm5vdGF0aW9ucztyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmZS5hbm5vdGF0aW9ucyYmKGU9ZS5hbm5vdGF0aW9ucyksZX1yZXR1cm4gdC5kZWNvcmF0b3JzJiZ0LmRlY29yYXRvcnMhPT1lLmRlY29yYXRvcnM/dXIodC5kZWNvcmF0b3JzKTp0Lmhhc093blByb3BlcnR5KHphKT90W3phXTpudWxsfWFubm90YXRpb25zKHQpe2lmKCEkYSh0KSlyZXR1cm5bXTtjb25zdCBlPWZyKHQpLG49dGhpcy5fb3duQW5ub3RhdGlvbnModCxlKXx8W107cmV0dXJuKGUhPT1PYmplY3Q/dGhpcy5hbm5vdGF0aW9ucyhlKTpbXSkuY29uY2F0KG4pfV9vd25Qcm9wTWV0YWRhdGEodCxlKXtpZih0LnByb3BNZXRhZGF0YSYmdC5wcm9wTWV0YWRhdGEhPT1lLnByb3BNZXRhZGF0YSl7bGV0IGU9dC5wcm9wTWV0YWRhdGE7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUucHJvcE1ldGFkYXRhJiYoZT1lLnByb3BNZXRhZGF0YSksZX1pZih0LnByb3BEZWNvcmF0b3JzJiZ0LnByb3BEZWNvcmF0b3JzIT09ZS5wcm9wRGVjb3JhdG9ycyl7Y29uc3QgZT10LnByb3BEZWNvcmF0b3JzLG49e307cmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKHQ9PntuW3RdPXVyKGVbdF0pfSkpLG59cmV0dXJuIHQuaGFzT3duUHJvcGVydHkoSGEpP3RbSGFdOm51bGx9cHJvcE1ldGFkYXRhKHQpe2lmKCEkYSh0KSlyZXR1cm57fTtjb25zdCBlPWZyKHQpLG49e307aWYoZSE9PU9iamVjdCl7Y29uc3QgdD10aGlzLnByb3BNZXRhZGF0YShlKTtPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChlPT57bltlXT10W2VdfSkpfWNvbnN0IG89dGhpcy5fb3duUHJvcE1ldGFkYXRhKHQsZSk7cmV0dXJuIG8mJk9iamVjdC5rZXlzKG8pLmZvckVhY2goKHQ9Pntjb25zdCBlPVtdO24uaGFzT3duUHJvcGVydHkodCkmJmUucHVzaCguLi5uW3RdKSxlLnB1c2goLi4ub1t0XSksblt0XT1lfSkpLG59b3duUHJvcE1ldGFkYXRhKHQpe3JldHVybiAkYSh0KSYmdGhpcy5fb3duUHJvcE1ldGFkYXRhKHQsZnIodCkpfHx7fX1oYXNMaWZlY3ljbGVIb29rKHQsZSl7cmV0dXJuIHQgaW5zdGFuY2VvZiBRYSYmZSBpbiB0LnByb3RvdHlwZX1ndWFyZHModCl7cmV0dXJue319Z2V0dGVyKHQpe3JldHVybiBuZXcgRnVuY3Rpb24oIm8iLCJyZXR1cm4gby4iK3QrIjsiKX1zZXR0ZXIodCl7cmV0dXJuIG5ldyBGdW5jdGlvbigibyIsInYiLCJyZXR1cm4gby4iK3QrIiA9IHY7Iil9bWV0aG9kKHQpe3JldHVybiBuZXcgRnVuY3Rpb24oIm8iLCJhcmdzIixgaWYgKCFvLiR7dH0pIHRocm93IG5ldyBFcnJvcignIiR7dH0iIGlzIHVuZGVmaW5lZCcpO1xuICAgICAgICByZXR1cm4gby4ke3R9LmFwcGx5KG8sIGFyZ3MpO2ApfWltcG9ydFVyaSh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJnQuZmlsZVBhdGg/dC5maWxlUGF0aDpgLi8ke0dlKHQpfWB9cmVzb3VyY2VVcmkodCl7cmV0dXJuYC4vJHtHZSh0KX1gfXJlc29sdmVJZGVudGlmaWVyKHQsZSxuLG8pe3JldHVybiBvfXJlc29sdmVFbnVtKHQsZSl7cmV0dXJuIHRbZV19fWZ1bmN0aW9uIHVyKHQpe3JldHVybiB0P3QubWFwKCh0PT5uZXcoMCx0LnR5cGUuYW5ub3RhdGlvbkNscykoLi4udC5hcmdzP3QuYXJnczpbXSkpKTpbXX1mdW5jdGlvbiBmcih0KXtjb25zdCBlPXQucHJvdG90eXBlP09iamVjdC5nZXRQcm90b3R5cGVPZih0LnByb3RvdHlwZSk6bnVsbDtyZXR1cm4oZT9lLmNvbnN0cnVjdG9yOm51bGwpfHxPYmplY3R9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NvbnN0IGdyPXt9LGhyPS9cbi9nbSxicj0iX19zb3VyY2UiLHlyPWplKHtwcm92aWRlOlN0cmluZyx1c2VWYWx1ZTpqZX0pO2xldCBfcjtmdW5jdGlvbiBDcih0KXtjb25zdCBlPV9yO3JldHVybiBfcj10LGV9ZnVuY3Rpb24gTXIodCxlPUVuLkRlZmF1bHQpe2lmKHZvaWQgMD09PV9yKXRocm93IG5ldyBFcnJvcigiaW5qZWN0KCkgbXVzdCBiZSBjYWxsZWQgZnJvbSBhbiBpbmplY3Rpb24gY29udGV4dCIpO3JldHVybiBudWxsPT09X3I/VG4odCx2b2lkIDAsZSk6X3IuZ2V0KHQsZSZFbi5PcHRpb25hbD9udWxsOnZvaWQgMCxlKX1mdW5jdGlvbiB2cih0LGU9RW4uRGVmYXVsdCl7cmV0dXJuKChmdW5jdGlvbiBuKCl7cmV0dXJuIFJufSkoKXx8TXIpKFplKHQpLGUpfWZ1bmN0aW9uIHhyKHQpe2NvbnN0IGU9bmdEZXZNb2RlP2BUaGlzIGNvbnN0cnVjdG9yIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggQW5ndWxhciBEZXBlbmRlbmN5IEluamVjdGlvbiBiZWNhdXNlIGl0cyBkZXBlbmRlbmN5IGF0IGluZGV4ICR7dH0gb2YgdGhlIHBhcmFtZXRlciBsaXN0IGlzIGludmFsaWQuXG5UaGlzIGNhbiBoYXBwZW4gaWYgdGhlIGRlcGVuZGVuY3kgdHlwZSBpcyBhIHByaW1pdGl2ZSBsaWtlIGEgc3RyaW5nIG9yIGlmIGFuIGFuY2VzdG9yIG9mIHRoaXMgY2xhc3MgaXMgbWlzc2luZyBhbiBBbmd1bGFyIGRlY29yYXRvci5cblxuUGxlYXNlIGNoZWNrIHRoYXQgMSkgdGhlIHR5cGUgZm9yIHRoZSBwYXJhbWV0ZXIgYXQgaW5kZXggJHt0fSBpcyBjb3JyZWN0IGFuZCAyKSB0aGUgY29ycmVjdCBBbmd1bGFyIGRlY29yYXRvcnMgYXJlIGRlZmluZWQgZm9yIHRoaXMgY2xhc3MgYW5kIGl0cyBhbmNlc3RvcnMuYDoiaW52YWxpZCI7dGhyb3cgbmV3IEVycm9yKGUpfWNvbnN0IE9yPXZyO2Z1bmN0aW9uIFByKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IG89WmUodFtuXSk7aWYoQXJyYXkuaXNBcnJheShvKSl7aWYoMD09PW8ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQXJndW1lbnRzIGFycmF5IG11c3QgaGF2ZSBhcmd1bWVudHMuIik7bGV0IHQsbj1Fbi5EZWZhdWx0O2ZvcihsZXQgZT0wO2U8by5sZW5ndGg7ZSsrKXtjb25zdCBpPW9bZV0sYT1pLl9fTkdfRElfRkxBR19fOyJudW1iZXIiPT10eXBlb2YgYT8tMT09PWE/dD1pLnRva2VuOm58PWE6dD1pfWUucHVzaCh2cih0LG4pKX1lbHNlIGUucHVzaCh2cihvKSl9cmV0dXJuIGV9ZnVuY3Rpb24gd3IodCxlKXtyZXR1cm4gdC5fX05HX0RJX0ZMQUdfXz1lLHQucHJvdG90eXBlLl9fTkdfRElfRkxBR19fPWUsdH0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IGtyPXdyKEJhKCJJbmplY3QiLCh0PT4oe3Rva2VuOnR9KSkpLC0xKSxTcj13cihCYSgiT3B0aW9uYWwiKSw4KSxEcj13cihCYSgiU2VsZiIpLDIpLEVyPXdyKEJhKCJTa2lwU2VsZiIpLDQpLFJyPXdyKEJhKCJIb3N0IiksMSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpsZXQgQXI9bnVsbDtmdW5jdGlvbiBUcigpe3JldHVybiBBcj1Bcnx8bmV3IG1yfWZ1bmN0aW9uIE5yKHQpe3JldHVybiB6cihUcigpLnBhcmFtZXRlcnModCkpfWZ1bmN0aW9uIHpyKHQpe3JldHVybiB0Lm1hcCgodD0+KGZ1bmN0aW9uIGUodCl7Y29uc3QgZT17dG9rZW46bnVsbCxhdHRyaWJ1dGU6bnVsbCxob3N0OiExLG9wdGlvbmFsOiExLHNlbGY6ITEsc2tpcFNlbGY6ITF9O2lmKEFycmF5LmlzQXJyYXkodCkmJnQubGVuZ3RoPjApZm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IG89dFtuXTtpZih2b2lkIDA9PT1vKWNvbnRpbnVlO2NvbnN0IGk9T2JqZWN0LmdldFByb3RvdHlwZU9mKG8pO2lmKG8gaW5zdGFuY2VvZiBTcnx8Ik9wdGlvbmFsIj09PWkubmdNZXRhZGF0YU5hbWUpZS5vcHRpb25hbD0hMDtlbHNlIGlmKG8gaW5zdGFuY2VvZiBFcnx8IlNraXBTZWxmIj09PWkubmdNZXRhZGF0YU5hbWUpZS5za2lwU2VsZj0hMDtlbHNlIGlmKG8gaW5zdGFuY2VvZiBEcnx8IlNlbGYiPT09aS5uZ01ldGFkYXRhTmFtZSllLnNlbGY9ITA7ZWxzZSBpZihvIGluc3RhbmNlb2YgUnJ8fCJIb3N0Ij09PWkubmdNZXRhZGF0YU5hbWUpZS5ob3N0PSEwO2Vsc2UgaWYobyBpbnN0YW5jZW9mIGtyKWUudG9rZW49by50b2tlbjtlbHNlIGlmKG8gaW5zdGFuY2VvZiBqYSl7aWYodm9pZCAwPT09by5hdHRyaWJ1dGVOYW1lKXRocm93IG5ldyBFcnJvcigiQXR0cmlidXRlIG5hbWUgbXVzdCBiZSBkZWZpbmVkLiIpO2UuYXR0cmlidXRlPW8uYXR0cmlidXRlTmFtZX1lbHNlIGUudG9rZW49b31lbHNlIGUudG9rZW49dm9pZCAwPT09dHx8QXJyYXkuaXNBcnJheSh0KSYmMD09PXQubGVuZ3RoP251bGw6dDtyZXR1cm4gZX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKSh0KSkpfWxldCBJcj1uZXcgTWFwO2NvbnN0IEhyPW5ldyBTZXQ7ZnVuY3Rpb24gRnIodCl7cmV0dXJuISEodC50ZW1wbGF0ZVVybCYmIXQuaGFzT3duUHJvcGVydHkoInRlbXBsYXRlIil8fHQuc3R5bGVVcmxzJiZ0LnN0eWxlVXJscy5sZW5ndGgpfWZ1bmN0aW9uIExyKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90OnQudGV4dCgpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KbGV0IEJyLFZyO2Z1bmN0aW9uIGpyKCl7aWYodm9pZCAwPT09QnImJihCcj1udWxsLGpuLnRydXN0ZWRUeXBlcykpdHJ5e0JyPWpuLnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koImFuZ3VsYXIiLHtjcmVhdGVIVE1MOnQ9PnQsY3JlYXRlU2NyaXB0OnQ9PnQsY3JlYXRlU2NyaXB0VVJMOnQ9PnR9KX1jYXRjaCh0KXt9cmV0dXJuIEJyfWZ1bmN0aW9uIFVyKHQpe3ZhciBlO3JldHVybihudWxsPT09KGU9anIoKSl8fHZvaWQgMD09PWU/dm9pZCAwOmUuY3JlYXRlSFRNTCh0KSl8fHR9ZnVuY3Rpb24gR3IoKXtpZih2b2lkIDA9PT1WciYmKFZyPW51bGwsam4udHJ1c3RlZFR5cGVzKSl0cnl7VnI9am4udHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeSgiYW5ndWxhciN1bnNhZmUtYnlwYXNzIix7Y3JlYXRlSFRNTDp0PT50LGNyZWF0ZVNjcmlwdDp0PT50LGNyZWF0ZVNjcmlwdFVSTDp0PT50fSl9Y2F0Y2godCl7fXJldHVybiBWcn1mdW5jdGlvbiBXcih0KXt2YXIgZTtyZXR1cm4obnVsbD09PShlPUdyKCkpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmNyZWF0ZUhUTUwodCkpfHx0fWZ1bmN0aW9uIFlyKHQpe3ZhciBlO3JldHVybihudWxsPT09KGU9R3IoKSl8fHZvaWQgMD09PWU/dm9pZCAwOmUuY3JlYXRlU2NyaXB0KHQpKXx8dH1mdW5jdGlvbiBxcih0KXt2YXIgZTtyZXR1cm4obnVsbD09PShlPUdyKCkpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmNyZWF0ZVNjcmlwdFVSTCh0KSl8fHR9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIFpye2NvbnN0cnVjdG9yKHQpe3RoaXMuY2hhbmdpbmdUaGlzQnJlYWtzQXBwbGljYXRpb25TZWN1cml0eT10fXRvU3RyaW5nKCl7cmV0dXJuYFNhZmVWYWx1ZSBtdXN0IHVzZSBbcHJvcGVydHldPWJpbmRpbmc6ICR7dGhpcy5jaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5fSAoc2VlIGh0dHBzOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpYH19Y2xhc3MgWHIgZXh0ZW5kcyBacntnZXRUeXBlTmFtZSgpe3JldHVybiJIVE1MIn19Y2xhc3MgS3IgZXh0ZW5kcyBacntnZXRUeXBlTmFtZSgpe3JldHVybiJTdHlsZSJ9fWNsYXNzIEpyIGV4dGVuZHMgWnJ7Z2V0VHlwZU5hbWUoKXtyZXR1cm4iU2NyaXB0In19Y2xhc3MgUXIgZXh0ZW5kcyBacntnZXRUeXBlTmFtZSgpe3JldHVybiJVUkwifX1jbGFzcyAkciBleHRlbmRzIFpye2dldFR5cGVOYW1lKCl7cmV0dXJuIlJlc291cmNlVVJMIn19ZnVuY3Rpb24gdHModCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBacj90LmNoYW5naW5nVGhpc0JyZWFrc0FwcGxpY2F0aW9uU2VjdXJpdHk6dH1mdW5jdGlvbiBlcyh0LGUpe2NvbnN0IG49bnModCk7aWYobnVsbCE9biYmbiE9PWUpe2lmKCJSZXNvdXJjZVVSTCI9PT1uJiYiVVJMIj09PWUpcmV0dXJuITA7dGhyb3cgbmV3IEVycm9yKGBSZXF1aXJlZCBhIHNhZmUgJHtlfSwgZ290IGEgJHtufSAoc2VlIGh0dHBzOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpYCl9cmV0dXJuIG49PT1lfWZ1bmN0aW9uIG5zKHQpe3JldHVybiB0IGluc3RhbmNlb2YgWnImJnQuZ2V0VHlwZU5hbWUoKXx8bnVsbH0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmZ1bmN0aW9uIG9zKHQpe2NvbnN0IGU9bmV3IGFzKHQpO3JldHVybihmdW5jdGlvbiBuKCl7dHJ5e3JldHVybiEhKG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoVXIoIiIpLCJ0ZXh0L2h0bWwiKX1jYXRjaCh0KXtyZXR1cm4hMX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLykoKT9uZXcgaXMoZSk6ZX1jbGFzcyBpc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmluZXJ0RG9jdW1lbnRIZWxwZXI9dH1nZXRJbmVydEJvZHlFbGVtZW50KHQpe3Q9Ijxib2R5PjxyZW1vdmU+PC9yZW1vdmU+Iit0O3RyeXtjb25zdCBlPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKFVyKHQpLCJ0ZXh0L2h0bWwiKS5ib2R5O3JldHVybiBudWxsPT09ZT90aGlzLmluZXJ0RG9jdW1lbnRIZWxwZXIuZ2V0SW5lcnRCb2R5RWxlbWVudCh0KTooZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpLGUpfWNhdGNoKHQpe3JldHVybiBudWxsfX19Y2xhc3MgYXN7Y29uc3RydWN0b3IodCl7aWYodGhpcy5kZWZhdWx0RG9jPXQsdGhpcy5pbmVydERvY3VtZW50PXRoaXMuZGVmYXVsdERvYy5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoInNhbml0aXphdGlvbi1pbmVydCIpLG51bGw9PXRoaXMuaW5lcnREb2N1bWVudC5ib2R5KXtjb25zdCB0PXRoaXMuaW5lcnREb2N1bWVudC5jcmVhdGVFbGVtZW50KCJodG1sIik7dGhpcy5pbmVydERvY3VtZW50LmFwcGVuZENoaWxkKHQpO2NvbnN0IGU9dGhpcy5pbmVydERvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJvZHkiKTt0LmFwcGVuZENoaWxkKGUpfX1nZXRJbmVydEJvZHlFbGVtZW50KHQpe2NvbnN0IGU9dGhpcy5pbmVydERvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7aWYoImNvbnRlbnQiaW4gZSlyZXR1cm4gZS5pbm5lckhUTUw9VXIodCksZTtjb25zdCBuPXRoaXMuaW5lcnREb2N1bWVudC5jcmVhdGVFbGVtZW50KCJib2R5Iik7cmV0dXJuIG4uaW5uZXJIVE1MPVVyKHQpLHRoaXMuZGVmYXVsdERvYy5kb2N1bWVudE1vZGUmJnRoaXMuc3RyaXBDdXN0b21Oc0F0dHJzKG4pLG59c3RyaXBDdXN0b21Oc0F0dHJzKHQpe2NvbnN0IGU9dC5hdHRyaWJ1dGVzO2ZvcihsZXQgbj1lLmxlbmd0aC0xOzA8bjtuLS0pe2NvbnN0IG89ZS5pdGVtKG4pLm5hbWU7InhtbG5zOm5zMSIhPT1vJiYwIT09by5pbmRleE9mKCJuczE6Iil8fHQucmVtb3ZlQXR0cmlidXRlKG8pfWxldCBuPXQuZmlyc3RDaGlsZDtmb3IoO247KW4ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmdGhpcy5zdHJpcEN1c3RvbU5zQXR0cnMobiksbj1uLm5leHRTaWJsaW5nfX1jb25zdCBycz0vXig/Oig/Omh0dHBzP3xtYWlsdG98ZnRwfHRlbHxmaWxlfHNtcyk6fFteJjovPyNdKig/OlsvPyNdfCQpKS9naSxzcz0vXmRhdGE6KD86aW1hZ2VcLyg/OmJtcHxnaWZ8anBlZ3xqcGd8cG5nfHRpZmZ8d2VicCl8dmlkZW9cLyg/Om1wZWd8bXA0fG9nZ3x3ZWJtKXxhdWRpb1wvKD86bXAzfG9nYXxvZ2d8b3B1cykpO2Jhc2U2NCxbYS16MC05K1wvXSs9KiQvaTtmdW5jdGlvbiBscyh0KXtyZXR1cm4odD1TdHJpbmcodCkpLm1hdGNoKHJzKXx8dC5tYXRjaChzcyk/dDooKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZjb25zb2xlLndhcm4oYFdBUk5JTkc6IHNhbml0aXppbmcgdW5zYWZlIFVSTCB2YWx1ZSAke3R9IChzZWUgaHR0cHM6Ly9nLmNvL25nL3NlY3VyaXR5I3hzcylgKSwidW5zYWZlOiIrdCl9ZnVuY3Rpb24gY3ModCl7cmV0dXJuKHQ9U3RyaW5nKHQpKS5zcGxpdCgiLCIpLm1hcCgodD0+bHModC50cmltKCkpKSkuam9pbigiLCAiKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gZHModCl7Y29uc3QgZT17fTtmb3IoY29uc3QgbiBvZiB0LnNwbGl0KCIsIikpZVtuXT0hMDtyZXR1cm4gZX1mdW5jdGlvbiBwcyguLi50KXtjb25zdCBlPXt9O2Zvcihjb25zdCBuIG9mIHQpZm9yKGNvbnN0IHQgaW4gbiluLmhhc093blByb3BlcnR5KHQpJiYoZVt0XT0hMCk7cmV0dXJuIGV9Y29uc3QgbXM9ZHMoImFyZWEsYnIsY29sLGhyLGltZyx3YnIiKSx1cz1kcygiY29sZ3JvdXAsZGQsZHQsbGkscCx0Ym9keSx0ZCx0Zm9vdCx0aCx0aGVhZCx0ciIpLGZzPWRzKCJycCxydCIpLGdzPXBzKGZzLHVzKSxocz1wcyh1cyxkcygiYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGJsb2NrcXVvdGUsY2FwdGlvbixjZW50ZXIsZGVsLGRldGFpbHMsZGlhbG9nLGRpcixkaXYsZGwsZmlndXJlLGZpZ2NhcHRpb24sZm9vdGVyLGgxLGgyLGgzLGg0LGg1LGg2LGhlYWRlcixoZ3JvdXAsaHIsaW5zLG1haW4sbWFwLG1lbnUsbmF2LG9sLHByZSxzZWN0aW9uLHN1bW1hcnksdGFibGUsdWwiKSksYnM9cHMoZnMsZHMoImEsYWJicixhY3JvbnltLGF1ZGlvLGIsYmRpLGJkbyxiaWcsYnIsY2l0ZSxjb2RlLGRlbCxkZm4sZW0sZm9udCxpLGltZyxpbnMsa2JkLGxhYmVsLG1hcCxtYXJrLHBpY3R1cmUscSxydWJ5LHJwLHJ0LHMsc2FtcCxzbWFsbCxzb3VyY2Usc3BhbixzdHJpa2Usc3Ryb25nLHN1YixzdXAsdGltZSx0cmFjayx0dCx1LHZhcix2aWRlbyIpKSx5cz1wcyhtcyxocyxicyxncyksX3M9ZHMoImJhY2tncm91bmQsY2l0ZSxocmVmLGl0ZW10eXBlLGxvbmdkZXNjLHBvc3RlcixzcmMseGxpbms6aHJlZiIpLENzPWRzKCJzcmNzZXQiKSxNcz1kcygiYWJicixhY2Nlc3NrZXksYWxpZ24sYWx0LGF1dG9wbGF5LGF4aXMsYmdjb2xvcixib3JkZXIsY2VsbHBhZGRpbmcsY2VsbHNwYWNpbmcsY2xhc3MsY2xlYXIsY29sb3IsY29scyxjb2xzcGFuLGNvbXBhY3QsY29udHJvbHMsY29vcmRzLGRhdGV0aW1lLGRlZmF1bHQsZGlyLGRvd25sb2FkLGZhY2UsaGVhZGVycyxoZWlnaHQsaGlkZGVuLGhyZWZsYW5nLGhzcGFjZSxpc21hcCxpdGVtc2NvcGUsaXRlbXByb3Asa2luZCxsYWJlbCxsYW5nLGxhbmd1YWdlLGxvb3AsbWVkaWEsbXV0ZWQsbm9ocmVmLG5vd3JhcCxvcGVuLHByZWxvYWQscmVsLHJldixyb2xlLHJvd3Mscm93c3BhbixydWxlcyxzY29wZSxzY3JvbGxpbmcsc2hhcGUsc2l6ZSxzaXplcyxzcGFuLHNyY2xhbmcsc3RhcnQsc3VtbWFyeSx0YWJpbmRleCx0YXJnZXQsdGl0bGUsdHJhbnNsYXRlLHR5cGUsdXNlbWFwLHZhbGlnbix2YWx1ZSx2c3BhY2Usd2lkdGgiKSx2cz1kcygiYXJpYS1hY3RpdmVkZXNjZW5kYW50LGFyaWEtYXRvbWljLGFyaWEtYXV0b2NvbXBsZXRlLGFyaWEtYnVzeSxhcmlhLWNoZWNrZWQsYXJpYS1jb2xjb3VudCxhcmlhLWNvbGluZGV4LGFyaWEtY29sc3BhbixhcmlhLWNvbnRyb2xzLGFyaWEtY3VycmVudCxhcmlhLWRlc2NyaWJlZGJ5LGFyaWEtZGV0YWlscyxhcmlhLWRpc2FibGVkLGFyaWEtZHJvcGVmZmVjdCxhcmlhLWVycm9ybWVzc2FnZSxhcmlhLWV4cGFuZGVkLGFyaWEtZmxvd3RvLGFyaWEtZ3JhYmJlZCxhcmlhLWhhc3BvcHVwLGFyaWEtaGlkZGVuLGFyaWEtaW52YWxpZCxhcmlhLWtleXNob3J0Y3V0cyxhcmlhLWxhYmVsLGFyaWEtbGFiZWxsZWRieSxhcmlhLWxldmVsLGFyaWEtbGl2ZSxhcmlhLW1vZGFsLGFyaWEtbXVsdGlsaW5lLGFyaWEtbXVsdGlzZWxlY3RhYmxlLGFyaWEtb3JpZW50YXRpb24sYXJpYS1vd25zLGFyaWEtcGxhY2Vob2xkZXIsYXJpYS1wb3NpbnNldCxhcmlhLXByZXNzZWQsYXJpYS1yZWFkb25seSxhcmlhLXJlbGV2YW50LGFyaWEtcmVxdWlyZWQsYXJpYS1yb2xlZGVzY3JpcHRpb24sYXJpYS1yb3djb3VudCxhcmlhLXJvd2luZGV4LGFyaWEtcm93c3BhbixhcmlhLXNlbGVjdGVkLGFyaWEtc2V0c2l6ZSxhcmlhLXNvcnQsYXJpYS12YWx1ZW1heCxhcmlhLXZhbHVlbWluLGFyaWEtdmFsdWVub3csYXJpYS12YWx1ZXRleHQiKSx4cz1wcyhfcyxDcyxNcyx2cyksT3M9ZHMoInNjcmlwdCxzdHlsZSx0ZW1wbGF0ZSIpO2NsYXNzIFBze2NvbnN0cnVjdG9yKCl7dGhpcy5zYW5pdGl6ZWRTb21ldGhpbmc9ITEsdGhpcy5idWY9W119c2FuaXRpemVDaGlsZHJlbih0KXtsZXQgZT10LmZpcnN0Q2hpbGQsbj0hMDtmb3IoO2U7KWlmKGUubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERT9uPXRoaXMuc3RhcnRFbGVtZW50KGUpOmUubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERT90aGlzLmNoYXJzKGUubm9kZVZhbHVlKTp0aGlzLnNhbml0aXplZFNvbWV0aGluZz0hMCxuJiZlLmZpcnN0Q2hpbGQpZT1lLmZpcnN0Q2hpbGQ7ZWxzZSBmb3IoO2U7KXtlLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJnRoaXMuZW5kRWxlbWVudChlKTtsZXQgdD10aGlzLmNoZWNrQ2xvYmJlcmVkRWxlbWVudChlLGUubmV4dFNpYmxpbmcpO2lmKHQpe2U9dDticmVha31lPXRoaXMuY2hlY2tDbG9iYmVyZWRFbGVtZW50KGUsZS5wYXJlbnROb2RlKX1yZXR1cm4gdGhpcy5idWYuam9pbigiIil9c3RhcnRFbGVtZW50KHQpe2NvbnN0IGU9dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2lmKCF5cy5oYXNPd25Qcm9wZXJ0eShlKSlyZXR1cm4gdGhpcy5zYW5pdGl6ZWRTb21ldGhpbmc9ITAsIU9zLmhhc093blByb3BlcnR5KGUpO3RoaXMuYnVmLnB1c2goIjwiKSx0aGlzLmJ1Zi5wdXNoKGUpO2NvbnN0IG49dC5hdHRyaWJ1dGVzO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKXtjb25zdCBlPW4uaXRlbSh0KSxvPWUubmFtZSxpPW8udG9Mb3dlckNhc2UoKTtpZigheHMuaGFzT3duUHJvcGVydHkoaSkpe3RoaXMuc2FuaXRpemVkU29tZXRoaW5nPSEwO2NvbnRpbnVlfWxldCBhPWUudmFsdWU7X3NbaV0mJihhPWxzKGEpKSxDc1tpXSYmKGE9Y3MoYSkpLHRoaXMuYnVmLnB1c2goIiAiLG8sJz0iJyxTcyhhKSwnIicpfXJldHVybiB0aGlzLmJ1Zi5wdXNoKCI+IiksITB9ZW5kRWxlbWVudCh0KXtjb25zdCBlPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTt5cy5oYXNPd25Qcm9wZXJ0eShlKSYmIW1zLmhhc093blByb3BlcnR5KGUpJiYodGhpcy5idWYucHVzaCgiPC8iKSx0aGlzLmJ1Zi5wdXNoKGUpLHRoaXMuYnVmLnB1c2goIj4iKSl9Y2hhcnModCl7dGhpcy5idWYucHVzaChTcyh0KSl9Y2hlY2tDbG9iYmVyZWRFbGVtZW50KHQsZSl7aWYoZSYmKHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZSkmTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkpPT09Tm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkpdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc2FuaXRpemUgaHRtbCBiZWNhdXNlIHRoZSBlbGVtZW50IGlzIGNsb2JiZXJlZDogJHt0Lm91dGVySFRNTH1gKTtyZXR1cm4gZX19Y29uc3Qgd3M9L1tcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXS9nLGtzPS8oW15cIy1+IHwhXSkvZztmdW5jdGlvbiBTcyh0KXtyZXR1cm4gdC5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSh3cywoZnVuY3Rpb24odCl7cmV0dXJuIiYjIisoMTAyNCoodC5jaGFyQ29kZUF0KDApLTU1Mjk2KSsodC5jaGFyQ29kZUF0KDEpLTU2MzIwKSs2NTUzNikrIjsifSkpLnJlcGxhY2Uoa3MsKGZ1bmN0aW9uKHQpe3JldHVybiImIyIrdC5jaGFyQ29kZUF0KDApKyI7In0pKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKX1sZXQgRHM7ZnVuY3Rpb24gRXModCxlKXtsZXQgbj1udWxsO3RyeXtEcz1Ec3x8b3ModCk7bGV0IG89ZT9TdHJpbmcoZSk6IiI7bj1Ecy5nZXRJbmVydEJvZHlFbGVtZW50KG8pO2xldCBpPTUsYT1vO2Rve2lmKDA9PT1pKXRocm93IG5ldyBFcnJvcigiRmFpbGVkIHRvIHNhbml0aXplIGh0bWwgYmVjYXVzZSB0aGUgaW5wdXQgaXMgdW5zdGFibGUiKTtpLS0sbz1hLGE9bi5pbm5lckhUTUwsbj1Ecy5nZXRJbmVydEJvZHlFbGVtZW50KG8pfXdoaWxlKG8hPT1hKTtjb25zdCByPW5ldyBQcyxzPXIuc2FuaXRpemVDaGlsZHJlbihScyhuKXx8bik7cmV0dXJuKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZyLnNhbml0aXplZFNvbWV0aGluZyYmY29uc29sZS53YXJuKCJXQVJOSU5HOiBzYW5pdGl6aW5nIEhUTUwgc3RyaXBwZWQgc29tZSBjb250ZW50LCBzZWUgaHR0cHM6Ly9nLmNvL25nL3NlY3VyaXR5I3hzcyIpLFVyKHMpfWZpbmFsbHl7aWYobil7Y29uc3QgdD1ScyhuKXx8bjtmb3IoO3QuZmlyc3RDaGlsZDspdC5yZW1vdmVDaGlsZCh0LmZpcnN0Q2hpbGQpfX19ZnVuY3Rpb24gUnModCl7cmV0dXJuImNvbnRlbnQiaW4gdCYmKGZ1bmN0aW9uIGUodCl7cmV0dXJuIHQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmIlRFTVBMQVRFIj09PXQubm9kZU5hbWV9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLykodCk/dC5jb250ZW50Om51bGx9dmFyIEFzO2Z1bmN0aW9uIFRzKHQpe2NvbnN0IGU9enMoKTtyZXR1cm4gZT9lLnNhbml0aXplKEFzLlVSTCx0KXx8IiI6ZXModCwiVVJMIik/dHModCk6bHMoJGUodCkpfWZ1bmN0aW9uIE5zKHQpe2NvbnN0IGU9enMoKTtpZihlKXJldHVybiBxcihlLnNhbml0aXplKEFzLlJFU09VUkNFX1VSTCx0KXx8IiIpO2lmKGVzKHQsIlJlc291cmNlVVJMIikpcmV0dXJuIHFyKHRzKHQpKTt0aHJvdyBuZXcgRXJyb3IoInVuc2FmZSB2YWx1ZSB1c2VkIGluIGEgcmVzb3VyY2UgVVJMIGNvbnRleHQgKHNlZSBodHRwczovL2cuY28vbmcvc2VjdXJpdHkjeHNzKSIpfWZ1bmN0aW9uIHpzKCl7Y29uc3QgdD1maSgpO3JldHVybiB0JiZ0WzEyXX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gSXModCl7bGV0IGU9QnModCk7aWYoZSl7aWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3Qgbj1lO2xldCBvLGksYTtpZigoZnVuY3Rpb24gbih0KXtyZXR1cm4gdCYmdC5jb25zdHJ1Y3RvciYmdC5jb25zdHJ1Y3Rvci7JtWNtcH0pKHQpKXtpZihvPUdzKG4sdCksLTE9PW8pdGhyb3cgbmV3IEVycm9yKCJUaGUgcHJvdmlkZWQgY29tcG9uZW50IHdhcyBub3QgZm91bmQgaW4gdGhlIGFwcGxpY2F0aW9uIik7aT10fWVsc2UgaWYoKGZ1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuY29uc3RydWN0b3ImJnQuY29uc3RydWN0b3IuybVkaXJ9KSh0KSl7aWYobz0oZnVuY3Rpb24gaSh0LGUpe2xldCBuPXRbMV0uZmlyc3RDaGlsZDtmb3IoO247KXtjb25zdCBvPW4uZGlyZWN0aXZlRW5kO2ZvcihsZXQgaT1uLmRpcmVjdGl2ZVN0YXJ0O2k8bztpKyspaWYodFtpXT09PWUpcmV0dXJuIG4uaW5kZXg7bj1VcyhuKX1yZXR1cm4tMX0pKG4sdCksLTE9PW8pdGhyb3cgbmV3IEVycm9yKCJUaGUgcHJvdmlkZWQgZGlyZWN0aXZlIHdhcyBub3QgZm91bmQgaW4gdGhlIGFwcGxpY2F0aW9uIik7YT1XcyhvLG4sITEpfWVsc2UgaWYobz1qcyhuLHQpLC0xPT1vKXJldHVybiBudWxsO2NvbnN0IHI9ZWkobltvXSkscz1CcyhyKSxsPXMmJiFBcnJheS5pc0FycmF5KHMpP3M6SHMobixvLHIpO2lmKGkmJnZvaWQgMD09PWwuY29tcG9uZW50JiYobC5jb21wb25lbnQ9aSxMcyhsLmNvbXBvbmVudCxsKSksYSYmdm9pZCAwPT09bC5kaXJlY3RpdmVzKXtsLmRpcmVjdGl2ZXM9YTtmb3IobGV0IHQ9MDt0PGEubGVuZ3RoO3QrKylMcyhhW3RdLGwpfUxzKGwubmF0aXZlLGwpLGU9bH19ZWxzZXtjb25zdCBuPXQ7bmdEZXZNb2RlJiZ5bihuKTtsZXQgbz1uO2Zvcig7bz1vLnBhcmVudE5vZGU7KXtjb25zdCB0PUJzKG8pO2lmKHQpe2xldCBvO2lmKG89QXJyYXkuaXNBcnJheSh0KT90OnQubFZpZXcsIW8pcmV0dXJuIG51bGw7Y29uc3QgaT1qcyhvLG4pO2lmKGk+PTApe2NvbnN0IHQ9ZWkob1tpXSksbj1IcyhvLGksdCk7THModCxuKSxlPW47YnJlYWt9fX19cmV0dXJuIGV8fG51bGx9ZnVuY3Rpb24gSHModCxlLG4pe3JldHVybntsVmlldzp0LG5vZGVJbmRleDplLG5hdGl2ZTpuLGNvbXBvbmVudDp2b2lkIDAsZGlyZWN0aXZlczp2b2lkIDAsbG9jYWxSZWZzOnZvaWQgMH19ZnVuY3Rpb24gRnModCl7bGV0IGUsbj1Ccyh0KTtpZihBcnJheS5pc0FycmF5KG4pKXtjb25zdCBvPUdzKG4sdCk7ZT1yaShvLG4pO2NvbnN0IGk9SHMobixvLGVbMF0pO2kuY29tcG9uZW50PXQsTHModCxpKSxMcyhpLm5hdGl2ZSxpKX1lbHNlIGU9cmkobi5ub2RlSW5kZXgsbi5sVmlldyk7cmV0dXJuIGV9ZnVuY3Rpb24gTHModCxlKXtuZ0Rldk1vZGUmJmhuKHQsIlRhcmdldCBleHBlY3RlZCIpLHQuX19uZ0NvbnRleHRfXz1lfWZ1bmN0aW9uIEJzKHQpe3JldHVybiBuZ0Rldk1vZGUmJmhuKHQsIlRhcmdldCBleHBlY3RlZCIpLHQuX19uZ0NvbnRleHRfX3x8bnVsbH1mdW5jdGlvbiBWcyh0KXtjb25zdCBlPUJzKHQpO3JldHVybiBlP0FycmF5LmlzQXJyYXkoZSk/ZTplLmxWaWV3Om51bGx9ZnVuY3Rpb24ganModCxlKXtjb25zdCBuPXRbMV07Zm9yKGxldCBvPWdvO288bi5iaW5kaW5nU3RhcnRJbmRleDtvKyspaWYoZWkodFtvXSk9PT1lKXJldHVybiBvO3JldHVybi0xfWZ1bmN0aW9uIFVzKHQpe2lmKHQuY2hpbGQpcmV0dXJuIHQuY2hpbGQ7aWYodC5uZXh0KXJldHVybiB0Lm5leHQ7Zm9yKDt0LnBhcmVudCYmIXQucGFyZW50Lm5leHQ7KXQ9dC5wYXJlbnQ7cmV0dXJuIHQucGFyZW50JiZ0LnBhcmVudC5uZXh0fWZ1bmN0aW9uIEdzKHQsZSl7Y29uc3Qgbj10WzFdLmNvbXBvbmVudHM7aWYobilmb3IobGV0IG89MDtvPG4ubGVuZ3RoO28rKyl7Y29uc3QgaT1uW29dO2lmKHJpKGksdClbOF09PT1lKXJldHVybiBpfWVsc2UgaWYocmkoZ28sdClbOF09PT1lKXJldHVybiBnbztyZXR1cm4tMX1mdW5jdGlvbiBXcyh0LGUsbil7Y29uc3Qgbz1lWzFdLmRhdGFbdF07bGV0IGk9by5kaXJlY3RpdmVTdGFydDtyZXR1cm4gMD09aT9XbjooIW4mJjImby5mbGFncyYmaSsrLGUuc2xpY2UoaSxvLmRpcmVjdGl2ZUVuZCkpfWZ1bmN0aW9uIFlzKHQpe3JldHVybiB0Lm5nT3JpZ2luYWxFcnJvcn1mdW5jdGlvbiBxcyh0LC4uLmUpe3QuZXJyb3IoLi4uZSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLyEoZnVuY3Rpb24odCl7dFt0Lk5PTkU9MF09Ik5PTkUiLHRbdC5IVE1MPTFdPSJIVE1MIix0W3QuU1RZTEU9Ml09IlNUWUxFIix0W3QuU0NSSVBUPTNdPSJTQ1JJUFQiLHRbdC5VUkw9NF09IlVSTCIsdFt0LlJFU09VUkNFX1VSTD01XT0iUkVTT1VSQ0VfVVJMIn0pKEFzfHwoQXM9e30pKTtjbGFzcyBac3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2NvbnNvbGU9Y29uc29sZX1oYW5kbGVFcnJvcih0KXtjb25zdCBlPXRoaXMuX2ZpbmRPcmlnaW5hbEVycm9yKHQpLG49dGhpcy5fZmluZENvbnRleHQodCksbz0oZnVuY3Rpb24gaSh0KXtyZXR1cm4gdCYmdC5uZ0Vycm9yTG9nZ2VyfHxxc30pKHQpO28odGhpcy5fY29uc29sZSwiRVJST1IiLHQpLGUmJm8odGhpcy5fY29uc29sZSwiT1JJR0lOQUwgRVJST1IiLGUpLG4mJm8odGhpcy5fY29uc29sZSwiRVJST1IgQ09OVEVYVCIsbil9X2ZpbmRDb250ZXh0KHQpe3JldHVybiB0PyhmdW5jdGlvbiBlKHQpe3JldHVybiB0Lm5nRGVidWdDb250ZXh0fSkodCl8fHRoaXMuX2ZpbmRDb250ZXh0KFlzKHQpKTpudWxsfV9maW5kT3JpZ2luYWxFcnJvcih0KXtsZXQgZT10JiZZcyh0KTtmb3IoO2UmJllzKGUpOyllPVlzKGUpO3JldHVybiBlfHxudWxsfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3QgWHM9e25hbWU6ImN1c3RvbS1lbGVtZW50cyJ9LEtzPXtuYW1lOiJuby1lcnJvcnMtc2NoZW1hIn0sSnM9L14+fF4tPnw8IS0tfC0tPnwtLSE+fDwhLSQvZyxRcz0vKDx8PikvO2Z1bmN0aW9uICRzKHQpe3JldHVybiB0LnJlcGxhY2UoSnMsKHQ9PnQucmVwbGFjZShRcywi4oCLJDHigIsiKSkpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiB0bCh0KXtpZighbmdEZXZNb2RlKXRocm93IG5ldyBFcnJvcigiTG9va3MgbGlrZSB3ZSBhcmUgaW4gJ3Byb2QgbW9kZScsIGJ1dCB3ZSBhcmUgY3JlYXRpbmcgYSBuYW1lZCBBcnJheSB0eXBlLCB3aGljaCBpcyB3cm9uZyEgQ2hlY2sgeW91ciBjb2RlIik7dHJ5e3JldHVybihmdW5jdGlvbiBlKC4uLnQpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlKXRocm93IG5ldyBFcnJvcigibmV3VHJ1c3RlZEZ1bmN0aW9uRm9yRGV2IHNob3VsZCBuZXZlciBiZSBjYWxsZWQgaW4gcHJvZHVjdGlvbiIpO2lmKCFqbi50cnVzdGVkVHlwZXMpcmV0dXJuIG5ldyBGdW5jdGlvbiguLi50KTtjb25zdCBlPWAoZnVuY3Rpb24gYW5vbnltb3VzKCR7dC5zbGljZSgwLC0xKS5qb2luKCIsIil9XG4pIHsgJHt0W3QubGVuZ3RoLTFdfVxufSlgLG49am4uZXZhbCgoZnVuY3Rpb24gbyh0KXt2YXIgZTtyZXR1cm4obnVsbD09PShlPWpyKCkpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmNyZWF0ZVNjcmlwdCh0KSl8fHR9KShlKSk7cmV0dXJuIHZvaWQgMD09PW4uYmluZD9uZXcgRnVuY3Rpb24oLi4udCk6KG4udG9TdHJpbmc9KCk9PmUsbi5iaW5kKGpuKSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLykoIkFycmF5IixgcmV0dXJuIGNsYXNzICR7dH0gZXh0ZW5kcyBBcnJheXt9YCkoQXJyYXkpfWNhdGNoKHQpe3JldHVybiBBcnJheX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NvbnN0IGVsPS8oW0EtWl0pL2csbmw9KCJ1bmRlZmluZWQiIT10eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lJiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHNldFRpbWVvdXQpLmJpbmQoam4pO2Z1bmN0aW9uIG9sKHQpe3JldHVybiB0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd9ZnVuY3Rpb24gaWwodCl7cmV0dXJuIHQub3duZXJEb2N1bWVudH1jb25zdCBhbD0i77+9IjtmdW5jdGlvbiBybCh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIEZ1bmN0aW9uP3QoKTp0fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBzbCh0KXt0aHJvdyBuZXcgS2UoIjMwMCIsYE11bHRpcGxlIGNvbXBvbmVudHMgbWF0Y2ggbm9kZSB3aXRoIHRhZ25hbWUgJHt0LnZhbHVlfWApfWZ1bmN0aW9uIGxsKHQsZSxuLG8saSl7Y29uc3RbYSxyLC4uLnNdPW8uc3BsaXQoYWwpO2xldCBsPXIsYz1yO2ZvcihsZXQgbz0wO288cy5sZW5ndGg7bysrKXtjb25zdCBhPWUrbztsKz1gJHt0W2FdfSR7c1tvXX1gLGMrPWAke2E9PT1uP2k6dFthXX0ke3Nbb119YH1yZXR1cm57cHJvcE5hbWU6YSxvbGRWYWx1ZTpsLG5ld1ZhbHVlOmN9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KdmFyIGNsOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KbGV0IGRsO2Z1bmN0aW9uIHBsKHQsZSl7cmV0dXJuIGRsKHQsZSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBtbCh0KXtuZ0Rldk1vZGUmJlJvKHQpO2NvbnN0IGU9dFszXTtyZXR1cm4gX28oZSk/ZVszXTplfWZ1bmN0aW9uIHVsKHQpe2NvbnN0IGU9KGZ1bmN0aW9uIG4odCl7bmdEZXZNb2RlJiZobih0LCJjb21wb25lbnQiKTtsZXQgZT15byh0KT90OlZzKHQpO2Zvcig7ZSYmISg1MTImZVsyXSk7KWU9bWwoZSk7cmV0dXJuIG5nRGV2TW9kZSYmUm8oZSksZX0pKHQpO3JldHVybiBuZ0Rldk1vZGUmJmhuKGVbOF0sIlJvb3RWaWV3IGhhcyBubyBjb250ZXh0LiBQZXJoYXBzIGl0IGlzIGRpc2Nvbm5lY3RlZD8iKSxlWzhdfWZ1bmN0aW9uIGZsKHQpe3JldHVybiBobCh0WzEzXSl9ZnVuY3Rpb24gZ2wodCl7cmV0dXJuIGhsKHRbNF0pfWZ1bmN0aW9uIGhsKHQpe2Zvcig7bnVsbCE9PXQmJiFfbyh0KTspdD10WzRdO3JldHVybiB0fWZ1bmN0aW9uIGJsKHQsZSxuLG8saSl7aWYobnVsbCE9byl7bGV0IGEscj0hMTtfbyhvKT9hPW86eW8obykmJihyPSEwLG5nRGV2TW9kZSYmaG4ob1swXSwiSE9TVCBtdXN0IGJlIGRlZmluZWQgZm9yIGEgY29tcG9uZW50IExWaWV3Iiksbz1vWzBdKTtjb25zdCBzPWVpKG8pO25nRGV2TW9kZSYmISRvKGUpJiZ5bihzKSwwPT09dCYmbnVsbCE9PW4/bnVsbD09aT9EbChlLG4scyk6U2woZSxuLHMsaXx8bnVsbCwhMCk6MT09PXQmJm51bGwhPT1uP1NsKGUsbixzLGl8fG51bGwsITApOjI9PT10P1ZsKGUscyxyKTozPT09dCYmKG5nRGV2TW9kZSYmbmdEZXZNb2RlLnJlbmRlcmVyRGVzdHJveU5vZGUrKyxlLmRlc3Ryb3lOb2RlKHMpKSxudWxsIT1hJiYoZnVuY3Rpb24gYSh0LGUsbixvLGkpe25nRGV2TW9kZSYmRG8obik7Y29uc3QgYT1uWzddO2EhPT1laShuKSYmYmwoZSx0LG8sYSxpKTtmb3IobGV0IGk9Ym87aTxuLmxlbmd0aDtpKyspe2NvbnN0IHI9bltpXTtVbChyWzFdLHIsdCxlLG8sYSl9fSkoZSx0LGEsbixpKX19ZnVuY3Rpb24geWwodCxlKXtyZXR1cm4gbmdEZXZNb2RlJiZuZ0Rldk1vZGUucmVuZGVyZXJDcmVhdGVUZXh0Tm9kZSsrLG5nRGV2TW9kZSYmbmdEZXZNb2RlLnJlbmRlcmVyU2V0VGV4dCsrLCRvKHQpP3QuY3JlYXRlVGV4dChlKTp0LmNyZWF0ZVRleHROb2RlKGUpfWZ1bmN0aW9uIF9sKHQsZSxuKXtuZ0Rldk1vZGUmJm5nRGV2TW9kZS5yZW5kZXJlclNldFRleHQrKywkbyh0KT90LnNldFZhbHVlKGUsbik6ZS50ZXh0Q29udGVudD1ufWZ1bmN0aW9uIENsKHQsZSl7cmV0dXJuIG5nRGV2TW9kZSYmbmdEZXZNb2RlLnJlbmRlcmVyQ3JlYXRlQ29tbWVudCsrLHQuY3JlYXRlQ29tbWVudCgkcyhlKSl9ZnVuY3Rpb24gTWwodCxlLG4pe3JldHVybiBuZ0Rldk1vZGUmJm5nRGV2TW9kZS5yZW5kZXJlckNyZWF0ZUVsZW1lbnQrKywkbyh0KT90LmNyZWF0ZUVsZW1lbnQoZSxuKTpudWxsPT09bj90LmNyZWF0ZUVsZW1lbnQoZSk6dC5jcmVhdGVFbGVtZW50TlMobixlKX1mdW5jdGlvbiB2bCh0LGUpe25nRGV2TW9kZSYmRG8odCksbmdEZXZNb2RlJiZobih0WzldLCJBIHByb2plY3RlZCB2aWV3IHNob3VsZCBiZWxvbmcgdG8gYSBub24tZW1wdHkgcHJvamVjdGVkIHZpZXdzIGNvbGxlY3Rpb24iKTtjb25zdCBuPXRbOV0sbz1uLmluZGV4T2YoZSksaT1lWzNdO25nRGV2TW9kZSYmRG8oaSksMTAyNCZlWzJdJiYoZVsyXSY9LTEwMjUscGkoaSwtMSkpLG4uc3BsaWNlKG8sMSl9ZnVuY3Rpb24geGwodCxlKXtpZih0Lmxlbmd0aDw9Ym8pcmV0dXJuO2NvbnN0IG49Ym8rZSxvPXRbbl07aWYobyl7Y29uc3QgaT1vWzE3XTtudWxsIT09aSYmaSE9PXQmJnZsKGksbyksZT4wJiYodFtuLTFdWzRdPW9bNF0pO2NvbnN0IGE9b3IodCxibytlKTshKGZ1bmN0aW9uIGkodCxlKXtVbCh0LGUsZVsxMV0sMixudWxsLG51bGwpLGVbMF09bnVsbCxlWzZdPW51bGx9KShvWzFdLG8pO2NvbnN0IHI9YVsxOV07bnVsbCE9PXImJnIuZGV0YWNoVmlldyhhWzFdKSxvWzNdPW51bGwsb1s0XT1udWxsLG9bMl0mPS0xMjl9cmV0dXJuIG99ZnVuY3Rpb24gT2wodCxlKXtpZighKDI1NiZlWzJdKSl7Y29uc3Qgbj1lWzExXTskbyhuKSYmbi5kZXN0cm95Tm9kZSYmVWwodCxlLG4sMyxudWxsLG51bGwpLChmdW5jdGlvbiBuKHQpe2xldCBlPXRbMTNdO2lmKCFlKXJldHVybiBQbCh0WzFdLHQpO2Zvcig7ZTspe2xldCBuPW51bGw7aWYoeW8oZSkpbj1lWzEzXTtlbHNle25nRGV2TW9kZSYmRG8oZSk7Y29uc3QgdD1lWzEwXTt0JiYobj10KX1pZighbil7Zm9yKDtlJiYhZVs0XSYmZSE9PXQ7KXlvKGUpJiZQbChlWzFdLGUpLGU9ZVszXTtudWxsPT09ZSYmKGU9dCkseW8oZSkmJlBsKGVbMV0sZSksbj1lJiZlWzRdfWU9bn19KShlKX19ZnVuY3Rpb24gUGwodCxlKXtpZighKDI1NiZlWzJdKSl7ZVsyXSY9LTEyOSxlWzJdfD0yNTYsKGZ1bmN0aW9uIG4odCxlKXtsZXQgbjtpZihudWxsIT10JiZudWxsIT0obj10LmRlc3Ryb3lIb29rcykpZm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0Kz0yKXtjb25zdCBvPWVbblt0XV07aWYoIShvIGluc3RhbmNlb2YgbmEpKXtjb25zdCBlPW5bdCsxXTtpZihBcnJheS5pc0FycmF5KGUpKWZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCs9Mil7Y29uc3Qgbj1vW2VbdF1dLGk9ZVt0KzFdO3FvKDQsbixpKTt0cnl7aS5jYWxsKG4pfWZpbmFsbHl7cW8oNSxuLGkpfX1lbHNle3FvKDQsbyxlKTt0cnl7ZS5jYWxsKG8pfWZpbmFsbHl7cW8oNSxvLGUpfX19fX0pKHQsZSksKGZ1bmN0aW9uIG8odCxlKXtjb25zdCBuPXQuY2xlYW51cCxvPWVbN107bGV0IGk9LTE7aWYobnVsbCE9PW4pZm9yKGxldCB0PTA7dDxuLmxlbmd0aC0xO3QrPTIpaWYoInN0cmluZyI9PXR5cGVvZiBuW3RdKXtjb25zdCBhPW5bdCsxXSxyPSJmdW5jdGlvbiI9PXR5cGVvZiBhP2EoZSk6ZWkoZVthXSkscz1vW2k9blt0KzJdXSxsPW5bdCszXTsiYm9vbGVhbiI9PXR5cGVvZiBsP3IucmVtb3ZlRXZlbnRMaXN0ZW5lcihuW3RdLHMsbCk6bD49MD9vW2k9bF0oKTpvW2k9LWxdLnVuc3Vic2NyaWJlKCksdCs9Mn1lbHNle2NvbnN0IGU9b1tpPW5bdCsxXV07blt0XS5jYWxsKGUpfWlmKG51bGwhPT1vKXtmb3IobGV0IHQ9aSsxO3Q8by5sZW5ndGg7dCsrKXtjb25zdCBlPW9bdF07bmdEZXZNb2RlJiYoIkV4cGVjdGluZyBpbnN0YW5jZSBjbGVhbnVwIGZ1bmN0aW9uLiIsImZ1bmN0aW9uIiE9dHlwZW9mKGE9ZSkmJmJuKCJFeHBlY3RpbmcgaW5zdGFuY2UgY2xlYW51cCBmdW5jdGlvbi4iLG51bGw9PT1hPyJudWxsIjp0eXBlb2YgYSwiZnVuY3Rpb24iLCI9PT0iKSksZSgpfWVbN109bnVsbH12YXIgYX0pKHQsZSksMT09PWVbMV0udHlwZSYmJG8oZVsxMV0pJiYobmdEZXZNb2RlJiZuZ0Rldk1vZGUucmVuZGVyZXJEZXN0cm95KyssZVsxMV0uZGVzdHJveSgpKTtjb25zdCBuPWVbMTddO2lmKG51bGwhPT1uJiZfbyhlWzNdKSl7biE9PWVbM10mJnZsKG4sZSk7Y29uc3Qgbz1lWzE5XTtudWxsIT09byYmby5kZXRhY2hWaWV3KHQpfX19ZnVuY3Rpb24gd2wodCxlLG4pe3JldHVybiBrbCh0LGUucGFyZW50LG4pfWZ1bmN0aW9uIGtsKHQsZSxuKXtsZXQgbz1lO2Zvcig7bnVsbCE9PW8mJjQwJm8udHlwZTspbz0oZT1vKS5wYXJlbnQ7aWYobnVsbD09PW8pcmV0dXJuIG5bMF07aWYobmdEZXZNb2RlJiZpYShvLDcpLDImby5mbGFncyl7bmdEZXZNb2RlJiZPbyhvLG4pO2NvbnN0IGU9dC5kYXRhW28uZGlyZWN0aXZlU3RhcnRdLmVuY2Fwc3VsYXRpb247aWYoZT09PUhuLk5vbmV8fGU9PT1Ibi5FbXVsYXRlZClyZXR1cm4gbnVsbH1yZXR1cm4gb2kobyxuKX1mdW5jdGlvbiBTbCh0LGUsbixvLGkpe25nRGV2TW9kZSYmbmdEZXZNb2RlLnJlbmRlcmVySW5zZXJ0QmVmb3JlKyssJG8odCk/dC5pbnNlcnRCZWZvcmUoZSxuLG8saSk6ZS5pbnNlcnRCZWZvcmUobixvLGkpfWZ1bmN0aW9uIERsKHQsZSxuKXtuZ0Rldk1vZGUmJm5nRGV2TW9kZS5yZW5kZXJlckFwcGVuZENoaWxkKyssbmdEZXZNb2RlJiZobihlLCJwYXJlbnQgbm9kZSBtdXN0IGJlIGRlZmluZWQiKSwkbyh0KT90LmFwcGVuZENoaWxkKGUsbik6ZS5hcHBlbmRDaGlsZChuKX1mdW5jdGlvbiBFbCh0LGUsbixvLGkpe251bGwhPT1vP1NsKHQsZSxuLG8saSk6RGwodCxlLG4pfWZ1bmN0aW9uIFJsKHQsZSl7cmV0dXJuICRvKHQpP3QucGFyZW50Tm9kZShlKTplLnBhcmVudE5vZGV9ZnVuY3Rpb24gQWwodCxlLG4pe3JldHVybiB6bCh0LGUsbil9ZnVuY3Rpb24gVGwodCxlLG4pe3JldHVybiA0MCZ0LnR5cGU/b2kodCxuKTpudWxsfSEoZnVuY3Rpb24odCl7dFt0LkltcG9ydGFudD0xXT0iSW1wb3J0YW50Iix0W3QuRGFzaENhc2U9Ml09IkRhc2hDYXNlIn0pKGNsfHwoY2w9e30pKTtsZXQgTmwsemw9VGw7ZnVuY3Rpb24gSWwodCxlKXt6bD10LE5sPWV9ZnVuY3Rpb24gSGwodCxlLG4sbyl7Y29uc3QgaT13bCh0LG8sZSksYT1lWzExXSxyPUFsKG8ucGFyZW50fHxlWzZdLG8sZSk7aWYobnVsbCE9aSlpZihBcnJheS5pc0FycmF5KG4pKWZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKUVsKGEsaSxuW3RdLHIsITEpO2Vsc2UgRWwoYSxpLG4sciwhMSk7dm9pZCAwIT09TmwmJk5sKGEsbyxlLG4saSl9ZnVuY3Rpb24gRmwodCxlKXtpZihudWxsIT09ZSl7bmdEZXZNb2RlJiZpYShlLDYzKTtjb25zdCBuPWUudHlwZTtpZigzJm4pcmV0dXJuIG9pKGUsdCk7aWYoNCZuKXJldHVybiBCbCgtMSx0W2UuaW5kZXhdKTtpZig4Jm4pe2NvbnN0IG49ZS5jaGlsZDtpZihudWxsIT09bilyZXR1cm4gRmwodCxuKTt7Y29uc3Qgbj10W2UuaW5kZXhdO3JldHVybiBfbyhuKT9CbCgtMSxuKTplaShuKX19aWYoMzImbilyZXR1cm4gcGwoZSx0KSgpfHxlaSh0W2UuaW5kZXhdKTt7Y29uc3Qgbj1MbCh0LGUpO2lmKG51bGwhPT1uKXtpZihBcnJheS5pc0FycmF5KG4pKXJldHVybiBuWzBdO2NvbnN0IGU9bWwodFsxNl0pO3JldHVybiBuZ0Rldk1vZGUmJklvKGUpLEZsKGUsbil9cmV0dXJuIEZsKHQsZS5uZXh0KX19cmV0dXJuIG51bGx9ZnVuY3Rpb24gTGwodCxlKXtpZihudWxsIT09ZSl7Y29uc3Qgbj10WzE2XVs2XSxvPWUucHJvamVjdGlvbjtyZXR1cm4gbmdEZXZNb2RlJiYoZnVuY3Rpb24gbih0LGUpe2huKHRbMTZdLCJDb21wb25lbnQgdmlld3Mgc2hvdWxkIGV4aXN0LiIpLGhuKHRbMTZdWzZdLnByb2plY3Rpb24sZXx8IkNvbXBvbmVudHMgd2l0aCBwcm9qZWN0aW9uIG5vZGVzICg8bmctY29udGVudD4pIG11c3QgaGF2ZSBwcm9qZWN0aW9uIHNsb3RzIGRlZmluZWQuIil9KSh0KSxuLnByb2plY3Rpb25bb119cmV0dXJuIG51bGx9ZnVuY3Rpb24gQmwodCxlKXtjb25zdCBuPWJvK3QrMTtpZihuPGUubGVuZ3RoKXtjb25zdCB0PWVbbl0sbz10WzFdLmZpcnN0Q2hpbGQ7aWYobnVsbCE9PW8pcmV0dXJuIEZsKHQsbyl9cmV0dXJuIGVbN119ZnVuY3Rpb24gVmwodCxlLG4pe25nRGV2TW9kZSYmbmdEZXZNb2RlLnJlbmRlcmVyUmVtb3ZlTm9kZSsrO2NvbnN0IG89UmwodCxlKTtvJiYoZnVuY3Rpb24gaSh0LGUsbixvKXskbyh0KT90LnJlbW92ZUNoaWxkKGUsbixvKTplLnJlbW92ZUNoaWxkKG4pfSkodCxvLGUsbil9ZnVuY3Rpb24gamwodCxlLG4sbyxpLGEscil7Zm9yKDtudWxsIT1uOyl7bmdEZXZNb2RlJiZPbyhuLG8pLG5nRGV2TW9kZSYmaWEobiw2Myk7Y29uc3Qgcz1vW24uaW5kZXhdLGw9bi50eXBlO2lmKHImJjA9PT1lJiYocyYmTHMoZWkocyksbyksbi5mbGFnc3w9NCksNjQhPSg2NCZuLmZsYWdzKSlpZig4JmwpamwodCxlLG4uY2hpbGQsbyxpLGEsITEpLGJsKGUsdCxpLHMsYSk7ZWxzZSBpZigzMiZsKXtjb25zdCByPXBsKG4sbyk7bGV0IGw7Zm9yKDtsPXIoKTspYmwoZSx0LGksbCxhKTtibChlLHQsaSxzLGEpfWVsc2UgMTYmbD9HbCh0LGUsbyxuLGksYSk6KG5nRGV2TW9kZSYmaWEobiw3KSxibChlLHQsaSxzLGEpKTtuPXI/bi5wcm9qZWN0aW9uTmV4dDpuLm5leHR9fWZ1bmN0aW9uIFVsKHQsZSxuLG8saSxhKXtqbChuLG8sdC5maXJzdENoaWxkLGUsaSxhLCExKX1mdW5jdGlvbiBHbCh0LGUsbixvLGksYSl7Y29uc3Qgcj1uWzE2XSxzPXJbNl07bmdEZXZNb2RlJiZsbih0eXBlb2Ygby5wcm9qZWN0aW9uLCJudW1iZXIiLCJleHBlY3RpbmcgcHJvamVjdGlvbiBpbmRleCIpO2NvbnN0IGw9cy5wcm9qZWN0aW9uW28ucHJvamVjdGlvbl07aWYoQXJyYXkuaXNBcnJheShsKSlmb3IobGV0IG49MDtuPGwubGVuZ3RoO24rKylibChlLHQsaSxsW25dLGEpO2Vsc2UgamwodCxlLGwsclszXSxpLGEsITApfWZ1bmN0aW9uIFdsKHQsZSxuKXtuZ0Rldk1vZGUmJnNuKG4sIiduZXdWYWx1ZScgc2hvdWxkIGJlIGEgc3RyaW5nIiksJG8odCk/dC5zZXRBdHRyaWJ1dGUoZSwic3R5bGUiLG4pOmUuc3R5bGUuY3NzVGV4dD1uLG5nRGV2TW9kZSYmbmdEZXZNb2RlLnJlbmRlcmVyU2V0U3R5bGUrK31mdW5jdGlvbiBZbCh0LGUsbil7bmdEZXZNb2RlJiZzbihuLCInbmV3VmFsdWUnIHNob3VsZCBiZSBhIHN0cmluZyIpLCRvKHQpPyIiPT09bj90LnJlbW92ZUF0dHJpYnV0ZShlLCJjbGFzcyIpOnQuc2V0QXR0cmlidXRlKGUsImNsYXNzIixuKTplLmNsYXNzTmFtZT1uLG5nRGV2TW9kZSYmbmdEZXZNb2RlLnJlbmRlcmVyU2V0Q2xhc3NOYW1lKyt9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIHFsKHQsZSxuKXtuZ0Rldk1vZGUmJmNuKGUsIiIsJ2NhbiBub3QgbG9vayBmb3IgIiIgc3RyaW5nLicpO2xldCBvPXQubGVuZ3RoO2Zvcig7Oyl7Y29uc3QgaT10LmluZGV4T2YoZSxuKTtpZigtMT09PWkpcmV0dXJuIGk7aWYoMD09PWl8fHQuY2hhckNvZGVBdChpLTEpPD0zMil7Y29uc3Qgbj1lLmxlbmd0aDtpZihpK249PT1vfHx0LmNoYXJDb2RlQXQoaStuKTw9MzIpcmV0dXJuIGl9bj1pKzF9fWNvbnN0IFpsPSJuZy10ZW1wbGF0ZSI7ZnVuY3Rpb24gWGwodCxlLG4pe25nRGV2TW9kZSYmbG4oZSxlLnRvTG93ZXJDYXNlKCksIkNsYXNzIG5hbWUgZXhwZWN0ZWQgdG8gYmUgbG93ZXJjYXNlLiIpO2xldCBvPTA7Zm9yKDtvPHQubGVuZ3RoOyl7bGV0IGk9dFtvKytdO2lmKG4mJiJjbGFzcyI9PT1pKXtpZihpPXRbb10sLTEhPT1xbChpLnRvTG93ZXJDYXNlKCksZSwwKSlyZXR1cm4hMH1lbHNlIGlmKDE9PT1pKXtmb3IoO288dC5sZW5ndGgmJiJzdHJpbmciPT10eXBlb2YoaT10W28rK10pOylpZihpLnRvTG93ZXJDYXNlKCk9PT1lKXJldHVybiEwO3JldHVybiExfX1yZXR1cm4hMX1mdW5jdGlvbiBLbCh0KXtyZXR1cm4gND09PXQudHlwZSYmdC52YWx1ZSE9PVpsfWZ1bmN0aW9uIEpsKHQsZSxuKXtyZXR1cm4gZT09PSg0IT09dC50eXBlfHxuP3QudmFsdWU6WmwpfWZ1bmN0aW9uIFFsKHQsZSxuKXtuZ0Rldk1vZGUmJmhuKGVbMF0sIlNlbGVjdG9yIHNob3VsZCBoYXZlIGEgdGFnIG5hbWUiKTtsZXQgbz00O2NvbnN0IGk9dC5hdHRyc3x8W10sYT0oZnVuY3Rpb24gcih0KXtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKylpZihyYSh0W2VdKSlyZXR1cm4gZTtyZXR1cm4gdC5sZW5ndGh9KShpKTtsZXQgcz0hMTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKyl7Y29uc3QgbD1lW3JdO2lmKCJudW1iZXIiIT10eXBlb2YgbCl7aWYoIXMpaWYoNCZvKXtpZihvPTJ8MSZvLCIiIT09bCYmIUpsKHQsbCxuKXx8IiI9PT1sJiYxPT09ZS5sZW5ndGgpe2lmKCRsKG8pKXJldHVybiExO3M9ITB9fWVsc2V7Y29uc3QgYz04Jm8/bDplWysrcl07aWYoOCZvJiZudWxsIT09dC5hdHRycyl7aWYoIVhsKHQuYXR0cnMsYyxuKSl7aWYoJGwobykpcmV0dXJuITE7cz0hMH1jb250aW51ZX1jb25zdCBkPXRjKDgmbz8iY2xhc3MiOmwsaSxLbCh0KSxuKTtpZigtMT09PWQpe2lmKCRsKG8pKXJldHVybiExO3M9ITA7Y29udGludWV9aWYoIiIhPT1jKXtsZXQgdDtkPmE/dD0iIjoobmdEZXZNb2RlJiZjbihpW2RdLDAsIldlIGRvIG5vdCBtYXRjaCBkaXJlY3RpdmVzIG9uIG5hbWVzcGFjZWQgYXR0cmlidXRlcyIpLHQ9aVtkKzFdLnRvTG93ZXJDYXNlKCkpO2NvbnN0IGU9OCZvP3Q6bnVsbDtpZihlJiYtMSE9PXFsKGUsYywwKXx8MiZvJiZjIT09dCl7aWYoJGwobykpcmV0dXJuITE7cz0hMH19fX1lbHNle2lmKCFzJiYhJGwobykmJiEkbChsKSlyZXR1cm4hMTtpZihzJiYkbChsKSljb250aW51ZTtzPSExLG89bHwxJm99fXJldHVybiAkbChvKXx8c31mdW5jdGlvbiAkbCh0KXtyZXR1cm4gMD09KDEmdCl9ZnVuY3Rpb24gdGModCxlLG4sbyl7aWYobnVsbD09PWUpcmV0dXJuLTE7bGV0IGk9MDtpZihvfHwhbil7bGV0IG49ITE7Zm9yKDtpPGUubGVuZ3RoOyl7Y29uc3Qgbz1lW2ldO2lmKG89PT10KXJldHVybiBpO2lmKDM9PT1vfHw2PT09byluPSEwO2Vsc2V7aWYoMT09PW98fDI9PT1vKXtsZXQgdD1lWysraV07Zm9yKDsic3RyaW5nIj09dHlwZW9mIHQ7KXQ9ZVsrK2ldO2NvbnRpbnVlfWlmKDQ9PT1vKWJyZWFrO2lmKDA9PT1vKXtpKz00O2NvbnRpbnVlfX1pKz1uPzE6Mn1yZXR1cm4tMX1yZXR1cm4oZnVuY3Rpb24gYSh0LGUpe2xldCBuPXQuaW5kZXhPZig0KTtpZihuPi0xKWZvcihuKys7bjx0Lmxlbmd0aDspe2NvbnN0IG89dFtuXTtpZigibnVtYmVyIj09dHlwZW9mIG8pcmV0dXJuLTE7aWYobz09PWUpcmV0dXJuIG47bisrfXJldHVybi0xfSkoZSx0KX1mdW5jdGlvbiBlYyh0LGUsbj0hMSl7Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDtvKyspaWYoUWwodCxlW29dLG4pKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIG5jKHQsZSl7dDpmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7Y29uc3Qgbz1lW25dO2lmKHQubGVuZ3RoPT09by5sZW5ndGgpe2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKHRbZV0hPT1vW2VdKWNvbnRpbnVlIHQ7cmV0dXJuITB9fXJldHVybiExfWZ1bmN0aW9uIG9jKHQsZSl7cmV0dXJuIHQ/Ijpub3QoIitlLnRyaW0oKSsiKSI6ZX1mdW5jdGlvbiBpYyh0KXtsZXQgZT10WzBdLG49MSxvPTIsaT0iIixhPSExO2Zvcig7bjx0Lmxlbmd0aDspe2xldCByPXRbbl07aWYoInN0cmluZyI9PXR5cGVvZiByKWlmKDImbyl7Y29uc3QgZT10Wysrbl07aSs9IlsiK3IrKGUubGVuZ3RoPjA/Jz0iJytlKyciJzoiIikrIl0ifWVsc2UgOCZvP2krPSIuIityOjQmbyYmKGkrPSIgIityKTtlbHNlIiI9PT1pfHwkbChyKXx8KGUrPW9jKGEsaSksaT0iIiksbz1yLGE9YXx8ISRsKG8pO24rK31yZXR1cm4iIiE9PWkmJihlKz1vYyhhLGkpKSxlfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgYWM9InVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZT97X19icmFuZF9fOiJOT19DSEFOR0UifTp7fTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gcmModCl7bmdEZXZNb2RlJiZmbih0LDAsIkNhbiBvbmx5IGFkdmFuY2UgZm9yd2FyZCIpLHNjKGdpKCksZmkoKSxHaSgpK3QseGkoKSl9ZnVuY3Rpb24gc2ModCxlLG4sbyl7aWYobmdEZXZNb2RlJiYoZnVuY3Rpb24gaSh0LGUpe3pvKGdvLHRbMV0uYmluZGluZ1N0YXJ0SW5kZXgsZSl9KShlLG4pLCFvKWlmKDM9PSgzJmVbMl0pKXtjb25zdCBvPXQucHJlT3JkZXJDaGVja0hvb2tzO251bGwhPT1vJiZLaShlLG8sbil9ZWxzZXtjb25zdCBvPXQucHJlT3JkZXJIb29rcztudWxsIT09byYmSmkoZSxvLDAsbil9V2kobil9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIGxjKHQsZSl7cmV0dXJuIG5nRGV2TW9kZSYmcm4odCwwLDMyNzY3KSxuZ0Rldk1vZGUmJnJuKGUsMCwzMjc2NyksdDw8MTd8ZTw8Mn1mdW5jdGlvbiBjYyh0KXtyZXR1cm4gbmdEZXZNb2RlJiZhbih0LCJleHBlY3RlZCBudW1iZXIiKSx0Pj4xNyYzMjc2N31mdW5jdGlvbiBkYyh0KXtyZXR1cm4gbmdEZXZNb2RlJiZhbih0LCJleHBlY3RlZCBudW1iZXIiKSwyPT0oMiZ0KX1mdW5jdGlvbiBwYyh0KXtyZXR1cm4gbmdEZXZNb2RlJiZhbih0LCJleHBlY3RlZCBudW1iZXIiKSwyfHR9ZnVuY3Rpb24gbWModCl7cmV0dXJuIG5nRGV2TW9kZSYmYW4odCwiZXhwZWN0ZWQgbnVtYmVyIiksKDEzMTA2OCZ0KT4+Mn1mdW5jdGlvbiB1Yyh0LGUpe3JldHVybiBuZ0Rldk1vZGUmJmFuKHQsImV4cGVjdGVkIG51bWJlciIpLG5nRGV2TW9kZSYmcm4oZSwwLDMyNzY3KSwtMTMxMDY5JnR8ZTw8Mn1mdW5jdGlvbiBmYyh0KXtyZXR1cm4gbmdEZXZNb2RlJiZhbih0LCJleHBlY3RlZCBudW1iZXIiKSwxPT0oMSZ0KX1mdW5jdGlvbiBnYyh0KXtyZXR1cm4gbmdEZXZNb2RlJiZhbih0LCJleHBlY3RlZCBudW1iZXIiKSwxfHR9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIGhjKHQsZSl7aWYoIW5nRGV2TW9kZSl0aHJvdyBuZXcgRXJyb3IoIlRoaXMgbWV0aG9kIHNob3VsZCBiZSBndWFyZGVkIHdpdGggYG5nRGV2TW9kZWAgc28gdGhhdCBpdCBjYW4gYmUgdHJlZSBzaGFrZW4gaW4gcHJvZHVjdGlvbiEiKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiZGVidWciLHt2YWx1ZTplLGVudW1lcmFibGU6ITF9KX1mdW5jdGlvbiBiYyh0LGUpe2lmKCFuZ0Rldk1vZGUpdGhyb3cgbmV3IEVycm9yKCJUaGlzIG1ldGhvZCBzaG91bGQgYmUgZ3VhcmRlZCB3aXRoIGBuZ0Rldk1vZGVgIHNvIHRoYXQgaXQgY2FuIGJlIHRyZWUgc2hha2VuIGluIHByb2R1Y3Rpb24hIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImRlYnVnIix7Z2V0OmUsZW51bWVyYWJsZTohMX0pfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCB5Yz0oInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fCEhbmdEZXZNb2RlKSYmVW4oKTtsZXQgX2MsQ2MsTWM7ZnVuY3Rpb24gdmModCl7aWYobnVsbD09dClyZXR1cm4iIjtjb25zdCBlPXQubGFzdEluZGV4T2YoIl9UZW1wbGF0ZSIpO3JldHVybiJfIisoLTE9PT1lP3Q6dC5zdWJzdHIoMCxlKSl9ZnVuY3Rpb24geGModCxlKXtjb25zdCBuPXQudFZpZXdfLmRhdGEsbz1bXSxpPWU/dC5jbGFzc0JpbmRpbmdzOnQuc3R5bGVCaW5kaW5ncyxhPWNjKGkpLHI9bWMoaSk7bGV0IHM9MCE9PXIsbD1zP3I6YTtmb3IoOzAhPT1sOyl7Y29uc3QgdD1uW2wrMV07by51bnNoaWZ0KHtrZXk6bltsXSxpbmRleDpsLGlzVGVtcGxhdGU6cyxwcmV2RHVwbGljYXRlOmRjKHQpLG5leHREdXBsaWNhdGU6ZmModCksbmV4dEluZGV4Om1jKHQpLHByZXZJbmRleDpjYyh0KX0pLGw9PT1hJiYocz0hMSksbD1jYyh0KX1yZXR1cm4gby5wdXNoKChlP3QucmVzaWR1YWxDbGFzc2VzOnQucmVzaWR1YWxTdHlsZXMpfHxudWxsKSxvfWZ1bmN0aW9uIE9jKHQsZSl7Zm9yKDt0OyllLnB1c2godC50ZW1wbGF0ZV8pLHQ9dC5uZXh0fWNvbnN0IFBjPXljJiZ0bCgiVFZpZXdEYXRhIil8fG51bGw7bGV0IHdjO2NvbnN0IGtjPXljJiZ0bCgiTFZpZXdCbHVlcHJpbnQiKXx8bnVsbCxTYz15YyYmdGwoIk1hdGNoZXNBcnJheSIpfHxudWxsLERjPXljJiZ0bCgiVFZpZXdDb21wb25lbnRzIil8fG51bGwsRWM9eWMmJnRsKCJUTm9kZUxvY2FsTmFtZXMiKXx8bnVsbCxSYz15YyYmdGwoIlROb2RlSW5pdGlhbElucHV0cyIpfHxudWxsO3ljJiZ0bCgiVE5vZGVJbml0aWFsRGF0YSIpO2NvbnN0IEFjPXljJiZ0bCgiTENsZWFudXAiKXx8bnVsbCxUYz15YyYmdGwoIlRDbGVhbnVwIil8fG51bGw7ZnVuY3Rpb24gTmModCl7aWYodCl7Y29uc3QgZT10LmRlYnVnO3JldHVybiBobihlLCJPYmplY3QgZG9lcyBub3QgaGF2ZSBhIGRlYnVnIHJlcHJlc2VudGF0aW9uLiIpLGV9cmV0dXJuIHR9ZnVuY3Rpb24gemModCxlPSExKXtjb25zdCBuPWVpKHQpO2lmKG4pc3dpdGNoKG4ubm9kZVR5cGUpe2Nhc2UgTm9kZS5URVhUX05PREU6cmV0dXJuIG4udGV4dENvbnRlbnQ7Y2FzZSBOb2RlLkNPTU1FTlRfTk9ERTpyZXR1cm5gXHgzYyEtLSR7bi50ZXh0Q29udGVudH0tLVx4M2VgO2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Y29uc3QgdD1uLm91dGVySFRNTDtyZXR1cm4gZT90OnQuc3BsaXQoIj4iK24uaW5uZXJIVE1MKyI8IilbMF0rIj4ifXJldHVybiBudWxsfWNsYXNzIElje2NvbnN0cnVjdG9yKHQpe3RoaXMuX3Jhd19sVmlldz10fWdldCBmbGFncygpe2NvbnN0IHQ9dGhpcy5fcmF3X2xWaWV3WzJdO3JldHVybntfX3Jhd19fZmxhZ3NfXzp0LGluaXRQaGFzZVN0YXRlOjMmdCxjcmVhdGlvbk1vZGU6ISEoNCZ0KSxmaXJzdFZpZXdQYXNzOiEhKDgmdCksY2hlY2tBbHdheXM6ISEoMTYmdCksZGlydHk6ISEoNjQmdCksYXR0YWNoZWQ6ISEoMTI4JnQpLGRlc3Ryb3llZDohISgyNTYmdCksaXNSb290OiEhKDUxMiZ0KSxpbmRleFdpdGhpbkluaXRQaGFzZTp0Pj4xMX19Z2V0IHBhcmVudCgpe3JldHVybiBOYyh0aGlzLl9yYXdfbFZpZXdbM10pfWdldCBob3N0SFRNTCgpe3JldHVybiB6Yyh0aGlzLl9yYXdfbFZpZXdbMF0sITApfWdldCBodG1sKCl7cmV0dXJuKHRoaXMubm9kZXN8fFtdKS5tYXAoSGMpLmpvaW4oIiIpfWdldCBjb250ZXh0KCl7cmV0dXJuIHRoaXMuX3Jhd19sVmlld1s4XX1nZXQgbm9kZXMoKXtjb25zdCB0PXRoaXMuX3Jhd19sVmlldztyZXR1cm4gTGModFsxXS5maXJzdENoaWxkLHQpfWdldCB0ZW1wbGF0ZSgpe3JldHVybiB0aGlzLnRWaWV3LnRlbXBsYXRlX31nZXQgdFZpZXcoKXtyZXR1cm4gdGhpcy5fcmF3X2xWaWV3WzFdfWdldCBjbGVhbnVwKCl7cmV0dXJuIHRoaXMuX3Jhd19sVmlld1s3XX1nZXQgaW5qZWN0b3IoKXtyZXR1cm4gdGhpcy5fcmF3X2xWaWV3WzldfWdldCByZW5kZXJlckZhY3RvcnkoKXtyZXR1cm4gdGhpcy5fcmF3X2xWaWV3WzEwXX1nZXQgcmVuZGVyZXIoKXtyZXR1cm4gdGhpcy5fcmF3X2xWaWV3WzExXX1nZXQgc2FuaXRpemVyKCl7cmV0dXJuIHRoaXMuX3Jhd19sVmlld1sxMl19Z2V0IGNoaWxkSGVhZCgpe3JldHVybiBOYyh0aGlzLl9yYXdfbFZpZXdbMTNdKX1nZXQgbmV4dCgpe3JldHVybiBOYyh0aGlzLl9yYXdfbFZpZXdbNF0pfWdldCBjaGlsZFRhaWwoKXtyZXR1cm4gTmModGhpcy5fcmF3X2xWaWV3WzE0XSl9Z2V0IGRlY2xhcmF0aW9uVmlldygpe3JldHVybiBOYyh0aGlzLl9yYXdfbFZpZXdbMTVdKX1nZXQgcXVlcmllcygpe3JldHVybiB0aGlzLl9yYXdfbFZpZXdbMTldfWdldCB0SG9zdCgpe3JldHVybiB0aGlzLl9yYXdfbFZpZXdbNl19Z2V0IGRlY2xzKCl7cmV0dXJuIEZjKHRoaXMudFZpZXcsdGhpcy5fcmF3X2xWaWV3LGdvLHRoaXMudFZpZXcuYmluZGluZ1N0YXJ0SW5kZXgpfWdldCB2YXJzKCl7cmV0dXJuIEZjKHRoaXMudFZpZXcsdGhpcy5fcmF3X2xWaWV3LHRoaXMudFZpZXcuYmluZGluZ1N0YXJ0SW5kZXgsdGhpcy50Vmlldy5leHBhbmRvU3RhcnRJbmRleCl9Z2V0IGV4cGFuZG8oKXtyZXR1cm4gRmModGhpcy50Vmlldyx0aGlzLl9yYXdfbFZpZXcsdGhpcy50Vmlldy5leHBhbmRvU3RhcnRJbmRleCx0aGlzLl9yYXdfbFZpZXcubGVuZ3RoKX1nZXQgY2hpbGRWaWV3cygpe2NvbnN0IHQ9W107bGV0IGU9dGhpcy5jaGlsZEhlYWQ7Zm9yKDtlOyl0LnB1c2goZSksZT1lLm5leHQ7cmV0dXJuIHR9fWZ1bmN0aW9uIEhjKHQpe2lmKCJFbGVtZW50Q29udGFpbmVyIj09PXQudHlwZSlyZXR1cm4odC5jaGlsZHJlbnx8W10pLm1hcChIYykuam9pbigiIik7aWYoIkljdUNvbnRhaW5lciI9PT10LnR5cGUpdGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQiKTtyZXR1cm4gemModC5uYXRpdmUsITApfHwiIn1mdW5jdGlvbiBGYyh0LGUsbixvKXtsZXQgaT1bXTtmb3IobGV0IGE9bjthPG87YSsrKWkucHVzaCh7aW5kZXg6YSx0OnQuZGF0YVthXSxsOmVbYV19KTtyZXR1cm57c3RhcnQ6bixlbmQ6byxsZW5ndGg6by1uLGNvbnRlbnQ6aX19ZnVuY3Rpb24gTGModCxlKXtpZih0KXtjb25zdCBuPVtdO2xldCBvPXQ7Zm9yKDtvOyluLnB1c2goQmMobyxlKSksbz1vLm5leHQ7cmV0dXJuIG59cmV0dXJuW119ZnVuY3Rpb24gQmModCxlKXtjb25zdCBuPWVpKGVbdC5pbmRleF0pLG89W10saT1bXSxhPWVbMV07Zm9yKGxldCBuPXQuZGlyZWN0aXZlU3RhcnQ7bjx0LmRpcmVjdGl2ZUVuZDtuKyspby5wdXNoKGEuZGF0YVtuXS50eXBlKSxpLnB1c2goZVtuXSk7cmV0dXJue2h0bWw6emMobiksdHlwZTpvYSh0LnR5cGUpLHROb2RlOnQsbmF0aXZlOm4sY2hpbGRyZW46TGModC5jaGlsZCxlKSxmYWN0b3JpZXM6byxpbnN0YW5jZXM6aSxpbmplY3RvcjpWYyh0LGEsZSksZ2V0IGluamVjdG9yUmVzb2x1dGlvblBhdGgoKXtyZXR1cm4gdC5kZWJ1Z05vZGVJbmplY3RvclBhdGgoZSl9fX1mdW5jdGlvbiBWYyh0LGUsbil7Y29uc3Qgbz1bXTtmb3IobGV0IG49dC5wcm92aWRlckluZGV4U3RhcnRfO248dC5wcm92aWRlckluZGV4RW5kXztuKyspby5wdXNoKGUuZGF0YVtuXSk7Y29uc3QgaT1bXTtmb3IobGV0IG49dC5wcm92aWRlckluZGV4RW5kXztuPHQuZGlyZWN0aXZlRW5kO24rKylpLnB1c2goZS5kYXRhW25dKTtyZXR1cm57Ymxvb206VWMobix0LmluamVjdG9ySW5kZXgpLGN1bXVsYXRpdmVCbG9vbTpVYyhlLmRhdGEsdC5pbmplY3RvckluZGV4KSxwcm92aWRlcnM6aSx2aWV3UHJvdmlkZXJzOm8scGFyZW50SW5qZWN0b3JJbmRleDpuW3QucHJvdmlkZXJJbmRleFN0YXJ0Xy0xXX19ZnVuY3Rpb24gamModCxlKXtjb25zdCBuPXRbZV07aWYoIm51bWJlciIhPXR5cGVvZiBuKXJldHVybiI/Pz8/Pz8/PyI7Y29uc3Qgbz0iMDAwMDAwMDAiK24udG9TdHJpbmcoMik7cmV0dXJuIG8uc3Vic3RyaW5nKG8ubGVuZ3RoLTgpfWZ1bmN0aW9uIFVjKHQsZSl7cmV0dXJuIGU8MD8iTk9fTk9ERV9JTkpFQ1RPUiI6YCR7amModCxlKzcpfV8ke2pjKHQsZSs2KX1fJHtqYyh0LGUrNSl9XyR7amModCxlKzQpfV8ke2pjKHQsZSszKX1fJHtqYyh0LGUrMil9XyR7amModCxlKzEpfV8ke2pjKHQsZSswKX1gfWNsYXNzIEdje2NvbnN0cnVjdG9yKHQpe3RoaXMuX3Jhd19sQ29udGFpbmVyPXR9Z2V0IGhhc1RyYW5zcGxhbnRlZFZpZXdzKCl7cmV0dXJuIHRoaXMuX3Jhd19sQ29udGFpbmVyWzJdfWdldCB2aWV3cygpe3JldHVybiB0aGlzLl9yYXdfbENvbnRhaW5lci5zbGljZShibykubWFwKE5jKX1nZXQgcGFyZW50KCl7cmV0dXJuIE5jKHRoaXMuX3Jhd19sQ29udGFpbmVyWzNdKX1nZXQgbW92ZWRWaWV3cygpe3JldHVybiB0aGlzLl9yYXdfbENvbnRhaW5lcls5XX1nZXQgaG9zdCgpe3JldHVybiB0aGlzLl9yYXdfbENvbnRhaW5lclswXX1nZXQgbmF0aXZlKCl7cmV0dXJuIHRoaXMuX3Jhd19sQ29udGFpbmVyWzddfWdldCBuZXh0KCl7cmV0dXJuIE5jKHRoaXMuX3Jhd19sQ29udGFpbmVyWzRdKX19Y29uc3QgV2M9UHJvbWlzZS5yZXNvbHZlKG51bGwpO2Z1bmN0aW9uIFljKHQsZSl7Y29uc3Qgbj10LmNvbnRlbnRRdWVyaWVzO2lmKG51bGwhPT1uKWZvcihsZXQgbz0wO288bi5sZW5ndGg7bys9Mil7Y29uc3QgaT1uW29dLGE9bltvKzFdO2lmKC0xIT09YSl7Y29uc3Qgbj10LmRhdGFbYV07bmdEZXZNb2RlJiZobihuLCJEaXJlY3RpdmVEZWYgbm90IGZvdW5kLiIpLG5nRGV2TW9kZSYmaG4obi5jb250ZW50UXVlcmllcywiY29udGVudFF1ZXJpZXMgZnVuY3Rpb24gc2hvdWxkIGJlIGRlZmluZWQiKSx6aShpKSxuLmNvbnRlbnRRdWVyaWVzKDIsZVthXSxhKX19fWZ1bmN0aW9uIHFjKHQsZSxuLG8saSxhLHIscyxsLGMpe2NvbnN0IGQ9bmdEZXZNb2RlPyhmdW5jdGlvbiBwKHQpe3JldHVybihmdW5jdGlvbiBlKHQsbil7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdm9pZCAwPT09TWMmJihNYz1uZXcodGwoIkxSb290VmlldyIpKSksTWM7Y2FzZSAxOnZvaWQgMD09PV9jJiYoX2M9bmV3IE1hcCk7bGV0IHQ9X2MuZ2V0KG4pO3JldHVybiB2b2lkIDA9PT10JiYodD1uZXcodGwoIkxDb21wb25lbnRWaWV3Iit2YyhuKSkpLF9jLnNldChuLHQpKSx0O2Nhc2UgMjp2b2lkIDA9PT1DYyYmKENjPW5ldyBNYXApO2xldCBlPUNjLmdldChuKTtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9bmV3KHRsKCJMRW1iZWRkZWRWaWV3Iit2YyhuKSkpLENjLnNldChuLGUpKSxlfX0pKHQudHlwZSx0LnRlbXBsYXRlJiZ0LnRlbXBsYXRlLm5hbWUpLmNvbmNhdCh0LmJsdWVwcmludCl9KShlKTplLmJsdWVwcmludC5zbGljZSgpO3JldHVybiBkWzBdPWksZFsyXT0xNDB8byxkaShkKSxuZ0Rldk1vZGUmJmUuZGVjbFROb2RlJiZ0JiZPbyhlLmRlY2xUTm9kZSx0KSxkWzNdPWRbMTVdPXQsZFs4XT1uLGRbMTBdPXJ8fHQmJnRbMTBdLG5nRGV2TW9kZSYmaG4oZFsxMF0sIlJlbmRlcmVyRmFjdG9yeSBpcyByZXF1aXJlZCIpLGRbMTFdPXN8fHQmJnRbMTFdLG5nRGV2TW9kZSYmaG4oZFsxMV0sIlJlbmRlcmVyIGlzIHJlcXVpcmVkIiksZFsxMl09bHx8dCYmdFsxMl18fG51bGwsZFs5XT1jfHx0JiZ0WzldfHxudWxsLGRbNl09YSxuZ0Rldk1vZGUmJmxuKDIhPWUudHlwZXx8bnVsbCE9PXQsITAsIkVtYmVkZGVkIHZpZXdzIG11c3QgaGF2ZSBwYXJlbnRMVmlldyIpLGRbMTZdPTI9PWUudHlwZT90WzE2XTpkLG5nRGV2TW9kZSYmKGZ1bmN0aW9uIG0odCl7aGModCxuZXcgSWModCkpfSkoZCksZH1mdW5jdGlvbiBaYyh0LGUsbixvLGkpe25nRGV2TW9kZSYmMCE9PWUmJmduKGUsZ28sIlROb2RlcyBjYW4ndCBiZSBpbiB0aGUgTFZpZXcgaGVhZGVyLiIpLG5nRGV2TW9kZSYmKGZ1bmN0aW9uIGEodCl7MiE9PXQmJjEhPT10JiY0IT09dCYmOCE9PXQmJjMyIT09dCYmMTYhPT10JiY2NCE9PXQmJmJuKGBFeHBlY3RlZCBUTm9kZVR5cGUgdG8gaGF2ZSBvbmx5IGEgc2luZ2xlIHR5cGUgc2VsZWN0ZWQsIGJ1dCBnb3QgJHtvYSh0KX0uYCl9KShuKTtsZXQgcj10LmRhdGFbZV07aWYobnVsbD09PXIpcj1YYyh0LGUsbixvLGkpLChmdW5jdGlvbiBzKCl7cmV0dXJuIG1pLmxGcmFtZS5pbkkxOG59KSgpJiYoci5mbGFnc3w9NjQpO2Vsc2UgaWYoNjQmci50eXBlKXtyLnR5cGU9bixyLnZhbHVlPW8sci5hdHRycz1pO2NvbnN0IGE9X2koKTtyLmluamVjdG9ySW5kZXg9bnVsbD09PWE/LTE6YS5pbmplY3RvckluZGV4LG5nRGV2TW9kZSYmUG8ocix0KSxuZ0Rldk1vZGUmJmxuKGUsci5pbmRleCwiRXhwZWN0aW5nIHNhbWUgaW5kZXgiKX1yZXR1cm4gQ2kociwhMCkscn1mdW5jdGlvbiBYYyh0LGUsbixvLGkpe2NvbnN0IGE9eWkoKSxyPU1pKCkscz10LmRhdGFbZV09KGZ1bmN0aW9uIGwodCxlLG4sbyxpLGEpe25nRGV2TW9kZSYmMCE9PW8mJmduKG8sZ28sIlROb2RlcyBjYW4ndCBiZSBpbiB0aGUgTFZpZXcgaGVhZGVyLiIpLG5nRGV2TW9kZSYmcG4oYSx2b2lkIDAsIid1bmRlZmluZWQnIGlzIG5vdCB2YWxpZCB2YWx1ZSBmb3IgJ2F0dHJzJyIpLG5nRGV2TW9kZSYmbmdEZXZNb2RlLnROb2RlKyssbmdEZXZNb2RlJiZlJiZQbyhlLHQpO2xldCByPWU/ZS5pbmplY3RvckluZGV4Oi0xO2NvbnN0IHM9bmdEZXZNb2RlP25ldyBjbGFzc3tjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZixnLGgsYix5LF8sQyxNLHYseCxPLFAsdyxrLFMsRCxFLFIpe3RoaXMudFZpZXdfPXQsdGhpcy50eXBlPWUsdGhpcy5pbmRleD1uLHRoaXMuaW5zZXJ0QmVmb3JlSW5kZXg9byx0aGlzLmluamVjdG9ySW5kZXg9aSx0aGlzLmRpcmVjdGl2ZVN0YXJ0PWEsdGhpcy5kaXJlY3RpdmVFbmQ9cix0aGlzLmRpcmVjdGl2ZVN0eWxpbmdMYXN0PXMsdGhpcy5wcm9wZXJ0eUJpbmRpbmdzPWwsdGhpcy5mbGFncz1jLHRoaXMucHJvdmlkZXJJbmRleGVzPWQsdGhpcy52YWx1ZT1wLHRoaXMuYXR0cnM9bSx0aGlzLm1lcmdlZEF0dHJzPXUsdGhpcy5sb2NhbE5hbWVzPWYsdGhpcy5pbml0aWFsSW5wdXRzPWcsdGhpcy5pbnB1dHM9aCx0aGlzLm91dHB1dHM9Yix0aGlzLnRWaWV3cz15LHRoaXMubmV4dD1fLHRoaXMucHJvamVjdGlvbk5leHQ9Qyx0aGlzLmNoaWxkPU0sdGhpcy5wYXJlbnQ9dix0aGlzLnByb2plY3Rpb249eCx0aGlzLnN0eWxlcz1PLHRoaXMuc3R5bGVzV2l0aG91dEhvc3Q9UCx0aGlzLnJlc2lkdWFsU3R5bGVzPXcsdGhpcy5jbGFzc2VzPWssdGhpcy5jbGFzc2VzV2l0aG91dEhvc3Q9Uyx0aGlzLnJlc2lkdWFsQ2xhc3Nlcz1ELHRoaXMuY2xhc3NCaW5kaW5ncz1FLHRoaXMuc3R5bGVCaW5kaW5ncz1SfWRlYnVnTm9kZUluamVjdG9yUGF0aCh0KXtjb25zdCBlPVtdO2xldCBuPXlhKHRoaXMsdCk7aWYoLTE9PT1uKXtjb25zdCBlPV9hKHRoaXMsdCk7ZSE9PWVhJiYobj1wYShlKSx0PW1hKGUsdCkpfWZvcig7LTEhPT1uOyl7bmdEZXZNb2RlJiZIbyh0LG4pLGUucHVzaChCYyh0WzFdLmRhdGFbbis4XSx0KSk7Y29uc3Qgbz10W24rOF07bz09PWVhP249LTE6KG49cGEobyksdD1tYShvLHQpKX1yZXR1cm4gZX1nZXQgdHlwZV8oKXtyZXR1cm4gb2EodGhpcy50eXBlKXx8YFROb2RlVHlwZS4/JHt0aGlzLnR5cGV9P2B9Z2V0IGZsYWdzXygpe2NvbnN0IHQ9W107cmV0dXJuIDE2JnRoaXMuZmxhZ3MmJnQucHVzaCgiVE5vZGVGbGFncy5oYXNDbGFzc0lucHV0IiksOCZ0aGlzLmZsYWdzJiZ0LnB1c2goIlROb2RlRmxhZ3MuaGFzQ29udGVudFF1ZXJ5IiksMzImdGhpcy5mbGFncyYmdC5wdXNoKCJUTm9kZUZsYWdzLmhhc1N0eWxlSW5wdXQiKSwxMjgmdGhpcy5mbGFncyYmdC5wdXNoKCJUTm9kZUZsYWdzLmhhc0hvc3RCaW5kaW5ncyIpLDImdGhpcy5mbGFncyYmdC5wdXNoKCJUTm9kZUZsYWdzLmlzQ29tcG9uZW50SG9zdCIpLDEmdGhpcy5mbGFncyYmdC5wdXNoKCJUTm9kZUZsYWdzLmlzRGlyZWN0aXZlSG9zdCIpLDY0JnRoaXMuZmxhZ3MmJnQucHVzaCgiVE5vZGVGbGFncy5pc0RldGFjaGVkIiksNCZ0aGlzLmZsYWdzJiZ0LnB1c2goIlROb2RlRmxhZ3MuaXNQcm9qZWN0ZWQiKSx0LmpvaW4oInwiKX1nZXQgdGVtcGxhdGVfKCl7aWYoMSZ0aGlzLnR5cGUpcmV0dXJuIHRoaXMudmFsdWU7Y29uc3QgdD1bXSxlPSJzdHJpbmciPT10eXBlb2YgdGhpcy52YWx1ZSYmdGhpcy52YWx1ZXx8dGhpcy50eXBlXztpZih0LnB1c2goIjwiLGUpLHRoaXMuZmxhZ3MmJnQucHVzaCgiICIsdGhpcy5mbGFnc18pLHRoaXMuYXR0cnMpZm9yKGxldCBlPTA7ZTx0aGlzLmF0dHJzLmxlbmd0aDspe2NvbnN0IG49dGhpcy5hdHRyc1tlKytdO2lmKCJudW1iZXIiPT10eXBlb2YgbilicmVhaztjb25zdCBvPXRoaXMuYXR0cnNbZSsrXTt0LnB1c2goIiAiLG4sJz0iJyxvLCciJyl9cmV0dXJuIHQucHVzaCgiPiIpLE9jKHRoaXMuY2hpbGQsdCksdC5wdXNoKCI8LyIsZSwiPiIpLHQuam9pbigiIil9Z2V0IHN0eWxlQmluZGluZ3NfKCl7cmV0dXJuIHhjKHRoaXMsITEpfWdldCBjbGFzc0JpbmRpbmdzXygpe3JldHVybiB4Yyh0aGlzLCEwKX1nZXQgcHJvdmlkZXJJbmRleFN0YXJ0Xygpe3JldHVybiAxMDQ4NTc1JnRoaXMucHJvdmlkZXJJbmRleGVzfWdldCBwcm92aWRlckluZGV4RW5kXygpe3JldHVybiB0aGlzLnByb3ZpZGVySW5kZXhTdGFydF8rKHRoaXMucHJvdmlkZXJJbmRleGVzPj4+MjApfX0odCxuLG8sbnVsbCxyLC0xLC0xLC0xLG51bGwsMCwwLGksYSxudWxsLG51bGwsdm9pZCAwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLGUsbnVsbCxudWxsLG51bGwsdm9pZCAwLG51bGwsbnVsbCx2b2lkIDAsMCwwKTp7dHlwZTpuLGluZGV4Om8saW5zZXJ0QmVmb3JlSW5kZXg6bnVsbCxpbmplY3RvckluZGV4OnIsZGlyZWN0aXZlU3RhcnQ6LTEsZGlyZWN0aXZlRW5kOi0xLGRpcmVjdGl2ZVN0eWxpbmdMYXN0Oi0xLHByb3BlcnR5QmluZGluZ3M6bnVsbCxmbGFnczowLHByb3ZpZGVySW5kZXhlczowLHZhbHVlOmksYXR0cnM6YSxtZXJnZWRBdHRyczpudWxsLGxvY2FsTmFtZXM6bnVsbCxpbml0aWFsSW5wdXRzOnZvaWQgMCxpbnB1dHM6bnVsbCxvdXRwdXRzOm51bGwsdFZpZXdzOm51bGwsbmV4dDpudWxsLHByb2plY3Rpb25OZXh0Om51bGwsY2hpbGQ6bnVsbCxwYXJlbnQ6ZSxwcm9qZWN0aW9uOm51bGwsc3R5bGVzOm51bGwsc3R5bGVzV2l0aG91dEhvc3Q6bnVsbCxyZXNpZHVhbFN0eWxlczp2b2lkIDAsY2xhc3NlczpudWxsLGNsYXNzZXNXaXRob3V0SG9zdDpudWxsLHJlc2lkdWFsQ2xhc3Nlczp2b2lkIDAsY2xhc3NCaW5kaW5nczowLHN0eWxlQmluZGluZ3M6MH07cmV0dXJuIG5nRGV2TW9kZSYmT2JqZWN0LnNlYWwocyksc30pKHQscj9hOmEmJmEucGFyZW50LG4sZSxvLGkpO3JldHVybiBudWxsPT09dC5maXJzdENoaWxkJiYodC5maXJzdENoaWxkPXMpLG51bGwhPT1hJiYocj9udWxsPT1hLmNoaWxkJiZudWxsIT09cy5wYXJlbnQmJihhLmNoaWxkPXMpOm51bGw9PT1hLm5leHQmJihhLm5leHQ9cykpLHN9ZnVuY3Rpb24gS2ModCxlLG4sbyl7aWYoMD09PW4pcmV0dXJuLTE7bmdEZXZNb2RlJiYoQW8odCksZG4odCxlWzFdLCJgTFZpZXdgIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGBUVmlld2AhIiksbG4odC5kYXRhLmxlbmd0aCxlLmxlbmd0aCwiRXhwZWN0aW5nIExWaWV3IHRvIGJlIHNhbWUgc2l6ZSBhcyBUVmlldyIpLGxuKHQuZGF0YS5sZW5ndGgsdC5ibHVlcHJpbnQubGVuZ3RoLCJFeHBlY3RpbmcgQmx1ZXByaW50IHRvIGJlIHNhbWUgc2l6ZSBhcyBUVmlldyIpLFRvKHQpKTtjb25zdCBpPWUubGVuZ3RoO2ZvcihsZXQgaT0wO2k8bjtpKyspZS5wdXNoKG8pLHQuYmx1ZXByaW50LnB1c2gobyksdC5kYXRhLnB1c2gobnVsbCk7cmV0dXJuIGl9ZnVuY3Rpb24gSmModCxlLG4pe25nRGV2TW9kZSYmbG4oc2koZSksITAsIlNob3VsZCBiZSBydW4gaW4gY3JlYXRpb24gbW9kZSIpLEZpKGUpO3RyeXtjb25zdCBvPXQudmlld1F1ZXJ5O251bGwhPT1vJiZOZCgxLG8sbik7Y29uc3QgaT10LnRlbXBsYXRlO251bGwhPT1pJiZ0ZCh0LGUsaSwxLG4pLHQuZmlyc3RDcmVhdGVQYXNzJiYodC5maXJzdENyZWF0ZVBhc3M9ITEpLHQuc3RhdGljQ29udGVudFF1ZXJpZXMmJlljKHQsZSksdC5zdGF0aWNWaWV3UXVlcmllcyYmTmQoMix0LnZpZXdRdWVyeSxuKTtjb25zdCBhPXQuY29tcG9uZW50cztudWxsIT09YSYmKGZ1bmN0aW9uIG8odCxlKXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKylTZCh0LGVbbl0pfSkoZSxhKX1jYXRjaChlKXt0aHJvdyB0LmZpcnN0Q3JlYXRlUGFzcyYmKHQuaW5jb21wbGV0ZUZpcnN0UGFzcz0hMCx0LmZpcnN0Q3JlYXRlUGFzcz0hMSksZX1maW5hbGx5e2VbMl0mPS01LFVpKCl9fWZ1bmN0aW9uIFFjKHQsZSxuLG8pe25nRGV2TW9kZSYmbG4oc2koZSksITEsIlNob3VsZCBiZSBydW4gaW4gdXBkYXRlIG1vZGUiKTtjb25zdCBpPWVbMl07aWYoMjU2PT0oMjU2JmkpKXJldHVybjtGaShlKTtjb25zdCBhPXhpKCk7dHJ5e2RpKGUpLGtpKHQuYmluZGluZ1N0YXJ0SW5kZXgpLG51bGwhPT1uJiZ0ZCh0LGUsbiwyLG8pO2NvbnN0IHI9Mz09KDMmaSk7aWYoIWEpaWYocil7Y29uc3Qgbj10LnByZU9yZGVyQ2hlY2tIb29rcztudWxsIT09biYmS2koZSxuLG51bGwpfWVsc2V7Y29uc3Qgbj10LnByZU9yZGVySG9va3M7bnVsbCE9PW4mJkppKGUsbiwwLG51bGwpLFFpKGUsMCl9aWYoKGZ1bmN0aW9uIHIodCl7Zm9yKGxldCBlPWZsKHQpO251bGwhPT1lO2U9Z2woZSkpe2lmKCFlWzJdKWNvbnRpbnVlO2NvbnN0IHQ9ZVs5XTtuZ0Rldk1vZGUmJmhuKHQsIlRyYW5zcGxhbnRlZCBWaWV3IGZsYWdzIHNldCBidXQgbWlzc2luZyBNT1ZFRF9WSUVXUyIpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtjb25zdCBuPXRbZV0sbz1uWzNdO25nRGV2TW9kZSYmRG8obyksMD09KDEwMjQmblsyXSkmJnBpKG8sMSksblsyXXw9MTAyNH19fSkoZSksKGZ1bmN0aW9uIHModCl7Zm9yKGxldCBlPWZsKHQpO251bGwhPT1lO2U9Z2woZSkpZm9yKGxldCB0PWJvO3Q8ZS5sZW5ndGg7dCsrKXtjb25zdCBuPWVbdF0sbz1uWzFdO25nRGV2TW9kZSYmaG4obywiVFZpZXcgbXVzdCBiZSBhbGxvY2F0ZWQiKSxsaShuKSYmUWMobyxuLG8udGVtcGxhdGUsbls4XSl9fSkoZSksbnVsbCE9PXQuY29udGVudFF1ZXJpZXMmJlljKHQsZSksIWEpaWYocil7Y29uc3Qgbj10LmNvbnRlbnRDaGVja0hvb2tzO251bGwhPT1uJiZLaShlLG4pfWVsc2V7Y29uc3Qgbj10LmNvbnRlbnRIb29rcztudWxsIT09biYmSmkoZSxuLDEpLFFpKGUsMSl9IShmdW5jdGlvbiBsKHQsZSl7Y29uc3Qgbj10Lmhvc3RCaW5kaW5nT3BDb2RlcztpZihudWxsIT09bil0cnl7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0Kyspe2NvbnN0IG89blt0XTtpZihvPDApV2kofm8pO2Vsc2V7Y29uc3QgaT1vLGE9blsrK3RdLHI9blsrK3RdO1JpKGEsaSkscigyLGVbaV0pfX19ZmluYWxseXtXaSgtMSl9fSkodCxlKTtjb25zdCBzPXQuY29tcG9uZW50cztudWxsIT09cyYmKGZ1bmN0aW9uIGModCxlKXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl3ZCh0LGVbbl0pfSkoZSxzKTtjb25zdCBsPXQudmlld1F1ZXJ5O2lmKG51bGwhPT1sJiZOZCgyLGwsbyksIWEpaWYocil7Y29uc3Qgbj10LnZpZXdDaGVja0hvb2tzO251bGwhPT1uJiZLaShlLG4pfWVsc2V7Y29uc3Qgbj10LnZpZXdIb29rcztudWxsIT09biYmSmkoZSxuLDIpLFFpKGUsMil9ITA9PT10LmZpcnN0VXBkYXRlUGFzcyYmKHQuZmlyc3RVcGRhdGVQYXNzPSExKSxhfHwoZVsyXSY9LTczKSwxMDI0JmVbMl0mJihlWzJdJj0tMTAyNSxwaShlWzNdLC0xKSl9ZmluYWxseXtVaSgpfX1mdW5jdGlvbiAkYyh0LGUsbixvKXtjb25zdCBpPWVbMTBdLGE9IXhpKCkscj1zaShlKTt0cnl7YSYmIXImJmkuYmVnaW4mJmkuYmVnaW4oKSxyJiZKYyh0LGUsbyksUWModCxlLG4sbyl9ZmluYWxseXthJiYhciYmaS5lbmQmJmkuZW5kKCl9fWZ1bmN0aW9uIHRkKHQsZSxuLG8saSl7Y29uc3QgYT1HaSgpLHI9MiZvO3RyeXtXaSgtMSksciYmZS5sZW5ndGg+Z28mJnNjKHQsZSxnbyx4aSgpKSxxbyhyPzI6MCxpKSxuKG8saSl9ZmluYWxseXtXaShhKSxxbyhyPzM6MSxpKX19ZnVuY3Rpb24gZWQodCxlLG4pe2lmKENvKGUpKXtjb25zdCBvPWUuZGlyZWN0aXZlRW5kO2ZvcihsZXQgaT1lLmRpcmVjdGl2ZVN0YXJ0O2k8bztpKyspe2NvbnN0IGU9dC5kYXRhW2ldO2UuY29udGVudFF1ZXJpZXMmJmUuY29udGVudFF1ZXJpZXMoMSxuW2ldLGkpfX19ZnVuY3Rpb24gbmQodCxlLG4pe3VpKCkmJigoZnVuY3Rpb24gbyh0LGUsbixpKXtjb25zdCBhPW4uZGlyZWN0aXZlU3RhcnQscj1uLmRpcmVjdGl2ZUVuZDt0LmZpcnN0Q3JlYXRlUGFzc3x8aGEobixlKSxMcyhpLGUpO2NvbnN0IHM9bi5pbml0aWFsSW5wdXRzO2ZvcihsZXQgbz1hO288cjtvKyspe2NvbnN0IGk9dC5kYXRhW29dLHI9eG8oaSk7ciYmKG5nRGV2TW9kZSYmaWEobiwzKSxfZChlLG4saSkpO2NvbnN0IGw9U2EoZSx0LG8sbik7THMobCxlKSxudWxsIT09cyYmdmQoZSxvLWEsbCxpLG4scyksciYmKHJpKG4uaW5kZXgsZSlbOF09bCl9fSkodCxlLG4sb2kobixlKSksMTI4PT0oMTI4Jm4uZmxhZ3MpJiYoZnVuY3Rpb24gaSh0LGUsbil7Y29uc3Qgbz1uLmRpcmVjdGl2ZVN0YXJ0LGk9bi5kaXJlY3RpdmVFbmQsYT1uLmluZGV4LHI9KGZ1bmN0aW9uIHMoKXtyZXR1cm4gbWkubEZyYW1lLmN1cnJlbnREaXJlY3RpdmVJbmRleH0pKCk7dHJ5e1dpKGEpO2ZvcihsZXQgbj1vO248aTtuKyspe2NvbnN0IG89dC5kYXRhW25dLGk9ZVtuXTtBaShuKSxudWxsPT09by5ob3N0QmluZGluZ3MmJjA9PT1vLmhvc3RWYXJzJiZudWxsPT09by5ob3N0QXR0cnN8fGZkKG8saSl9fWZpbmFsbHl7V2koLTEpLEFpKHIpfX0pKHQsZSxuKSl9ZnVuY3Rpb24gb2QodCxlLG49b2kpe2NvbnN0IG89ZS5sb2NhbE5hbWVzO2lmKG51bGwhPT1vKXtsZXQgaT1lLmluZGV4KzE7Zm9yKGxldCBhPTA7YTxvLmxlbmd0aDthKz0yKXtjb25zdCByPW9bYSsxXSxzPS0xPT09cj9uKGUsdCk6dFtyXTt0W2krK109c319fWZ1bmN0aW9uIGlkKHQpe2NvbnN0IGU9dC50VmlldztyZXR1cm4gbnVsbD09PWV8fGUuaW5jb21wbGV0ZUZpcnN0UGFzcz90LnRWaWV3PWFkKDEsbnVsbCx0LnRlbXBsYXRlLHQuZGVjbHMsdC52YXJzLHQuZGlyZWN0aXZlRGVmcyx0LnBpcGVEZWZzLHQudmlld1F1ZXJ5LHQuc2NoZW1hcyx0LmNvbnN0cyk6ZX1mdW5jdGlvbiBhZCh0LGUsbixvLGksYSxyLHMsbCxjKXtuZ0Rldk1vZGUmJm5nRGV2TW9kZS50VmlldysrO2NvbnN0IGQ9Z28rbyxwPWQraSxtPShmdW5jdGlvbiB1KHQsZSl7Y29uc3Qgbj1uZ0Rldk1vZGU/bmV3IGtjOltdO2ZvcihsZXQgbz0wO288ZTtvKyspbi5wdXNoKG88dD9udWxsOmFjKTtyZXR1cm4gbn0pKGQscCksZj0iZnVuY3Rpb24iPT10eXBlb2YgYz9jKCk6YyxnPW1bMV09bmdEZXZNb2RlP25ldyBjbGFzc3tjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZixnLGgsYix5LF8sQyxNLHYseCxPLFAsdyxrLFMsRCxFLFIpe3RoaXMudHlwZT10LHRoaXMuYmx1ZXByaW50PWUsdGhpcy50ZW1wbGF0ZT1uLHRoaXMucXVlcmllcz1vLHRoaXMudmlld1F1ZXJ5PWksdGhpcy5kZWNsVE5vZGU9YSx0aGlzLmRhdGE9cix0aGlzLmJpbmRpbmdTdGFydEluZGV4PXMsdGhpcy5leHBhbmRvU3RhcnRJbmRleD1sLHRoaXMuaG9zdEJpbmRpbmdPcENvZGVzPWMsdGhpcy5maXJzdENyZWF0ZVBhc3M9ZCx0aGlzLmZpcnN0VXBkYXRlUGFzcz1wLHRoaXMuc3RhdGljVmlld1F1ZXJpZXM9bSx0aGlzLnN0YXRpY0NvbnRlbnRRdWVyaWVzPXUsdGhpcy5wcmVPcmRlckhvb2tzPWYsdGhpcy5wcmVPcmRlckNoZWNrSG9va3M9Zyx0aGlzLmNvbnRlbnRIb29rcz1oLHRoaXMuY29udGVudENoZWNrSG9va3M9Yix0aGlzLnZpZXdIb29rcz15LHRoaXMudmlld0NoZWNrSG9va3M9Xyx0aGlzLmRlc3Ryb3lIb29rcz1DLHRoaXMuY2xlYW51cD1NLHRoaXMuY29udGVudFF1ZXJpZXM9dix0aGlzLmNvbXBvbmVudHM9eCx0aGlzLmRpcmVjdGl2ZVJlZ2lzdHJ5PU8sdGhpcy5waXBlUmVnaXN0cnk9UCx0aGlzLmZpcnN0Q2hpbGQ9dyx0aGlzLnNjaGVtYXM9ayx0aGlzLmNvbnN0cz1TLHRoaXMuaW5jb21wbGV0ZUZpcnN0UGFzcz1ELHRoaXMuX2RlY2xzPUUsdGhpcy5fdmFycz1SfWdldCB0ZW1wbGF0ZV8oKXtjb25zdCB0PVtdO3JldHVybiBPYyh0aGlzLmZpcnN0Q2hpbGQsdCksdC5qb2luKCIiKX1nZXQgdHlwZV8oKXtyZXR1cm4gaG9bdGhpcy50eXBlXXx8YFRWaWV3VHlwZS4/JHt0aGlzLnR5cGV9P2B9fSh0LG0sbixudWxsLHMsZSwoZnVuY3Rpb24gaCh0KXtyZXR1cm4gdm9pZCAwPT09d2MmJih3Yz1uZXcgUGMpLHdjLmNvbmNhdCh0KX0pKG0pLmZpbGwobnVsbCxkKSxkLHAsbnVsbCwhMCwhMCwhMSwhMSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLCJmdW5jdGlvbiI9PXR5cGVvZiBhP2EoKTphLCJmdW5jdGlvbiI9PXR5cGVvZiByP3IoKTpyLG51bGwsbCxmLCExLG8saSk6e3R5cGU6dCxibHVlcHJpbnQ6bSx0ZW1wbGF0ZTpuLHF1ZXJpZXM6bnVsbCx2aWV3UXVlcnk6cyxkZWNsVE5vZGU6ZSxkYXRhOm0uc2xpY2UoKS5maWxsKG51bGwsZCksYmluZGluZ1N0YXJ0SW5kZXg6ZCxleHBhbmRvU3RhcnRJbmRleDpwLGhvc3RCaW5kaW5nT3BDb2RlczpudWxsLGZpcnN0Q3JlYXRlUGFzczohMCxmaXJzdFVwZGF0ZVBhc3M6ITAsc3RhdGljVmlld1F1ZXJpZXM6ITEsc3RhdGljQ29udGVudFF1ZXJpZXM6ITEscHJlT3JkZXJIb29rczpudWxsLHByZU9yZGVyQ2hlY2tIb29rczpudWxsLGNvbnRlbnRIb29rczpudWxsLGNvbnRlbnRDaGVja0hvb2tzOm51bGwsdmlld0hvb2tzOm51bGwsdmlld0NoZWNrSG9va3M6bnVsbCxkZXN0cm95SG9va3M6bnVsbCxjbGVhbnVwOm51bGwsY29udGVudFF1ZXJpZXM6bnVsbCxjb21wb25lbnRzOm51bGwsZGlyZWN0aXZlUmVnaXN0cnk6ImZ1bmN0aW9uIj09dHlwZW9mIGE/YSgpOmEscGlwZVJlZ2lzdHJ5OiJmdW5jdGlvbiI9PXR5cGVvZiByP3IoKTpyLGZpcnN0Q2hpbGQ6bnVsbCxzY2hlbWFzOmwsY29uc3RzOmYsaW5jb21wbGV0ZUZpcnN0UGFzczohMX07cmV0dXJuIG5nRGV2TW9kZSYmT2JqZWN0LnNlYWwoZyksZ31mdW5jdGlvbiByZCh0LGUsbixvKXtjb25zdCBpPUhkKGUpO251bGw9PT1uPyhuZ0Rldk1vZGUmJk9iamVjdC5mcmVlemUoRmQodCkpLGkucHVzaChvKSk6KGkucHVzaChuKSx0LmZpcnN0Q3JlYXRlUGFzcyYmRmQodCkucHVzaChvLGkubGVuZ3RoLTEpKX1mdW5jdGlvbiBzZCh0LGUsbil7Zm9yKGxldCBvIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShvKSl7Y29uc3QgaT10W29dOyhuPW51bGw9PT1uP3t9Om4pLmhhc093blByb3BlcnR5KG8pP25bb10ucHVzaChlLGkpOm5bb109W2UsaV19cmV0dXJuIG59ZnVuY3Rpb24gbGQodCxlLG4sbyxpLGEscixzKXtuZ0Rldk1vZGUmJnBuKGksYWMsIkluY29taW5nIHZhbHVlIHNob3VsZCBuZXZlciBiZSBOT19DSEFOR0UuIik7Y29uc3QgbD1vaShlLG4pO2xldCBjLGQ9ZS5pbnB1dHM7aWYoIXMmJm51bGwhPWQmJihjPWRbb10pKVZkKHQsbixjLG8saSksTW8oZSkmJihmdW5jdGlvbiBwKHQsZSl7bmdEZXZNb2RlJiZSbyh0KTtjb25zdCBuPXJpKGUsdCk7MTYmblsyXXx8KG5bMl18PTY0KX0pKG4sZS5pbmRleCksbmdEZXZNb2RlJiYoZnVuY3Rpb24gbSh0LGUsbixvLGkpe2lmKDcmbilmb3IobGV0IGE9MDthPG8ubGVuZ3RoO2ErPTIpY2QodCxlLG4sb1thKzFdLGkpfSkobixsLGUudHlwZSxjLGkpO2Vsc2UgaWYoMyZlLnR5cGUpe2lmKG89KGZ1bmN0aW9uIHUodCl7cmV0dXJuImNsYXNzIj09PXQ/ImNsYXNzTmFtZSI6ImZvciI9PT10PyJodG1sRm9yIjoiZm9ybWFjdGlvbiI9PT10PyJmb3JtQWN0aW9uIjoiaW5uZXJIdG1sIj09PXQ/ImlubmVySFRNTCI6InJlYWRvbmx5Ij09PXQ/InJlYWRPbmx5IjoidGFiaW5kZXgiPT09dD8idGFiSW5kZXgiOnR9KShvKSxuZ0Rldk1vZGUpe2lmKChmdW5jdGlvbiBmKHQpe2lmKHQudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJvbiIpKXtjb25zdCBlPWBCaW5kaW5nIHRvIGV2ZW50IHByb3BlcnR5ICcke3R9JyBpcyBkaXNhbGxvd2VkIGZvciBzZWN1cml0eSByZWFzb25zLCBwbGVhc2UgdXNlICgke3Quc2xpY2UoMil9KT0uLi5cbklmICcke3R9JyBpcyBhIGRpcmVjdGl2ZSBpbnB1dCwgbWFrZSBzdXJlIHRoZSBkaXJlY3RpdmUgaXMgaW1wb3J0ZWQgYnkgdGhlIGN1cnJlbnQgbW9kdWxlLmA7dGhyb3cgbmV3IEVycm9yKGUpfX0pKG8pLCEoZnVuY3Rpb24gZyh0LGUsbixvKXtyZXR1cm4hKG51bGwhPT10LnNjaGVtYXMmJiEoZGQodCxvLnZhbHVlKXx8biBpbiBlfHxzYShuKSkmJiJ1bmRlZmluZWQiIT10eXBlb2YgTm9kZSYmbnVsbCE9PU5vZGUmJmUgaW5zdGFuY2VvZiBOb2RlKX0pKHQsbCxvLGUpKXJldHVybiB2b2lkIHBkKG8sZSk7bmdEZXZNb2RlLnJlbmRlcmVyU2V0UHJvcGVydHkrK31pPW51bGwhPXI/cihpLGUudmFsdWV8fCIiLG8pOmksJG8oYSk/YS5zZXRQcm9wZXJ0eShsLG8saSk6c2Eobyl8fChsLnNldFByb3BlcnR5P2wuc2V0UHJvcGVydHkobyxpKTpsW29dPWkpfWVsc2UgMTImZS50eXBlJiZuZ0Rldk1vZGUmJiFkZCh0LGUudmFsdWUpJiZwZChvLGUpfWZ1bmN0aW9uIGNkKHQsZSxuLG8saSl7Y29uc3QgYT10WzExXTtvPShmdW5jdGlvbiByKHQpe3JldHVybmBuZy1yZWZsZWN0LSR7dD0oZnVuY3Rpb24gZSh0KXtyZXR1cm4gdC5yZXBsYWNlKGVsLCgoLi4udCk9PiItIit0WzFdLnRvTG93ZXJDYXNlKCkpKX0pKHQucmVwbGFjZSgvWyRAXS9nLCJfIikpfWB9KShvKTtjb25zdCBzPShmdW5jdGlvbiBsKHQpe3RyeXtyZXR1cm4gbnVsbCE9dD90LnRvU3RyaW5nKCkuc2xpY2UoMCwzMCk6dH1jYXRjaCh0KXtyZXR1cm4iW0VSUk9SXSBFeGNlcHRpb24gd2hpbGUgdHJ5aW5nIHRvIHNlcmlhbGl6ZSB0aGUgdmFsdWUifX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKShpKTtpZigzJm4pbnVsbD09aT8kbyhhKT9hLnJlbW92ZUF0dHJpYnV0ZShlLG8pOmUucmVtb3ZlQXR0cmlidXRlKG8pOiRvKGEpP2Euc2V0QXR0cmlidXRlKGUsbyxzKTplLnNldEF0dHJpYnV0ZShvLHMpO2Vsc2V7Y29uc3QgdD0kcyhgYmluZGluZ3M9JHtKU09OLnN0cmluZ2lmeSh7W29dOnN9LG51bGwsMil9YCk7JG8oYSk/YS5zZXRWYWx1ZShlLHQpOmUudGV4dENvbnRlbnQ9dH19ZnVuY3Rpb24gZGQodCxlKXtjb25zdCBuPXQuc2NoZW1hcztpZihudWxsIT09bilmb3IobGV0IHQ9MDt0PG4ubGVuZ3RoO3QrKyl7Y29uc3Qgbz1uW3RdO2lmKG89PT1Lc3x8bz09PVhzJiZlJiZlLmluZGV4T2YoIi0iKT4tMSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBwZCh0LGUpe2NvbnNvbGUuZXJyb3IoUWUoIjMwMyIsYENhbid0IGJpbmQgdG8gJyR7dH0nIHNpbmNlIGl0IGlzbid0IGEga25vd24gcHJvcGVydHkgb2YgJyR7ZS52YWx1ZX0nLmApKX1mdW5jdGlvbiBtZCh0LGUsbixvKXtuZ0Rldk1vZGUmJkFvKHQpO2xldCBpPSExO2lmKHVpKCkpe2NvbnN0IGE9KGZ1bmN0aW9uIGEodCxlLG4pe25nRGV2TW9kZSYmQW8odCksbmdEZXZNb2RlJiZpYShuLDE1KTtjb25zdCBvPXQuZGlyZWN0aXZlUmVnaXN0cnk7bGV0IGk9bnVsbDtpZihvKWZvcihsZXQgYT0wO2E8by5sZW5ndGg7YSsrKXtjb25zdCByPW9bYV07ZWMobixyLnNlbGVjdG9ycywhMSkmJihpfHwoaT1uZ0Rldk1vZGU/bmV3IFNjOltdKSxDYShoYShuLGUpLHQsci50eXBlKSx4byhyKT8obmdEZXZNb2RlJiYoaWEobiwyLGAiJHtuLnZhbHVlfSIgdGFncyBjYW5ub3QgYmUgdXNlZCBhcyBjb21wb25lbnQgaG9zdHMuIFBsZWFzZSB1c2UgYSBkaWZmZXJlbnQgdGFnIHRvIGFjdGl2YXRlIHRoZSAke0dlKHIudHlwZSl9IGNvbXBvbmVudC5gKSwyJm4uZmxhZ3MmJnNsKG4pKSxnZCh0LG4pLGkudW5zaGlmdChyKSk6aS5wdXNoKHIpKX1yZXR1cm4gaX0pKHQsZSxuKSxyPW51bGw9PT1vP251bGw6eyIiOi0xfTtpZihudWxsIT09YSl7aT0hMCxiZChuLHQuZGF0YS5sZW5ndGgsYS5sZW5ndGgpO2ZvcihsZXQgdD0wO3Q8YS5sZW5ndGg7dCsrKXtjb25zdCBlPWFbdF07ZS5wcm92aWRlcnNSZXNvbHZlciYmZS5wcm92aWRlcnNSZXNvbHZlcihlKX1sZXQgbz0hMSxzPSExLGw9S2ModCxlLGEubGVuZ3RoLG51bGwpO25nRGV2TW9kZSYmZG4obCxuLmRpcmVjdGl2ZVN0YXJ0LCJUTm9kZS5kaXJlY3RpdmVTdGFydCBzaG91bGQgcG9pbnQgdG8ganVzdCBhbGxvY2F0ZWQgc3BhY2UiKTtmb3IobGV0IGk9MDtpPGEubGVuZ3RoO2krKyl7Y29uc3QgYz1hW2ldO24ubWVyZ2VkQXR0cnM9bGEobi5tZXJnZWRBdHRycyxjLmhvc3RBdHRycykseWQodCxuLGUsbCxjKSxoZChsLGMsciksbnVsbCE9PWMuY29udGVudFF1ZXJpZXMmJihuLmZsYWdzfD04KSxudWxsPT09Yy5ob3N0QmluZGluZ3MmJm51bGw9PT1jLmhvc3RBdHRycyYmMD09PWMuaG9zdFZhcnN8fChuLmZsYWdzfD0xMjgpO2NvbnN0IGQ9Yy50eXBlLnByb3RvdHlwZTshbyYmKGQubmdPbkNoYW5nZXN8fGQubmdPbkluaXR8fGQubmdEb0NoZWNrKSYmKCh0LnByZU9yZGVySG9va3N8fCh0LnByZU9yZGVySG9va3M9W10pKS5wdXNoKG4uaW5kZXgpLG89ITApLHN8fCFkLm5nT25DaGFuZ2VzJiYhZC5uZ0RvQ2hlY2t8fCgodC5wcmVPcmRlckNoZWNrSG9va3N8fCh0LnByZU9yZGVyQ2hlY2tIb29rcz1bXSkpLnB1c2gobi5pbmRleCkscz0hMCksbCsrfSEoZnVuY3Rpb24gcih0LGUpe25nRGV2TW9kZSYmQW8odCk7Y29uc3Qgbj1lLmRpcmVjdGl2ZVN0YXJ0LG89ZS5kaXJlY3RpdmVFbmQsaT10LmRhdGEsYT1lLmF0dHJzLHI9bmdEZXZNb2RlP25ldyBSYzpbXTtsZXQgcz1udWxsLGw9bnVsbDtmb3IobGV0IHQ9bjt0PG87dCsrKXtjb25zdCBuPWlbdF0sbz1uLmlucHV0cyxjPW51bGw9PT1hfHxLbChlKT9udWxsOnhkKG8sYSk7ci5wdXNoKGMpLHM9c2Qobyx0LHMpLGw9c2Qobi5vdXRwdXRzLHQsbCl9bnVsbCE9PXMmJihzLmhhc093blByb3BlcnR5KCJjbGFzcyIpJiYoZS5mbGFnc3w9MTYpLHMuaGFzT3duUHJvcGVydHkoInN0eWxlIikmJihlLmZsYWdzfD0zMikpLGUuaW5pdGlhbElucHV0cz1yLGUuaW5wdXRzPXMsZS5vdXRwdXRzPWx9KSh0LG4pfXImJihmdW5jdGlvbiBzKHQsZSxuKXtpZihlKXtjb25zdCBvPXQubG9jYWxOYW1lcz1uZ0Rldk1vZGU/bmV3IEVjOltdO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCs9Mil7Y29uc3QgaT1uW2VbdCsxXV07aWYobnVsbD09aSl0aHJvdyBuZXcgS2UoIjMwMSIsYEV4cG9ydCBvZiBuYW1lICcke2VbdCsxXX0nIG5vdCBmb3VuZCFgKTtvLnB1c2goZVt0XSxpKX19fSkobixvLHIpfXJldHVybiBuLm1lcmdlZEF0dHJzPWxhKG4ubWVyZ2VkQXR0cnMsbi5hdHRycyksaX1mdW5jdGlvbiB1ZCh0LGUsbixvLGksYSl7bmdEZXZNb2RlJiZBbyh0KTtjb25zdCByPWEuaG9zdEJpbmRpbmdzO2lmKHIpe2xldCBuPXQuaG9zdEJpbmRpbmdPcENvZGVzO251bGw9PT1uJiYobj10Lmhvc3RCaW5kaW5nT3BDb2Rlcz1bXSk7Y29uc3QgYT1+ZS5pbmRleDsoZnVuY3Rpb24gcyh0KXtsZXQgZT10Lmxlbmd0aDtmb3IoO2U+MDspe2NvbnN0IG49dFstLWVdO2lmKCJudW1iZXIiPT10eXBlb2YgbiYmbjwwKXJldHVybiBufXJldHVybiAwfSkobikhPWEmJm4ucHVzaChhKSxuLnB1c2gobyxpLHIpfX1mdW5jdGlvbiBmZCh0LGUpe251bGwhPT10Lmhvc3RCaW5kaW5ncyYmdC5ob3N0QmluZGluZ3MoMSxlKX1mdW5jdGlvbiBnZCh0LGUpe25nRGV2TW9kZSYmQW8odCksZS5mbGFnc3w9MiwodC5jb21wb25lbnRzfHwodC5jb21wb25lbnRzPW5nRGV2TW9kZT9uZXcgRGM6W10pKS5wdXNoKGUuaW5kZXgpfWZ1bmN0aW9uIGhkKHQsZSxuKXtpZihuKXtpZihlLmV4cG9ydEFzKWZvcihsZXQgbz0wO288ZS5leHBvcnRBcy5sZW5ndGg7bysrKW5bZS5leHBvcnRBc1tvXV09dDt4byhlKSYmKG5bIiJdPXQpfX1mdW5jdGlvbiBiZCh0LGUsbil7bmdEZXZNb2RlJiZjbihuLHQuZGlyZWN0aXZlRW5kLXQuZGlyZWN0aXZlU3RhcnQsIlJlYWNoZWQgdGhlIG1heCBudW1iZXIgb2YgZGlyZWN0aXZlcyIpLHQuZmxhZ3N8PTEsdC5kaXJlY3RpdmVTdGFydD1lLHQuZGlyZWN0aXZlRW5kPWUrbix0LnByb3ZpZGVySW5kZXhlcz1lfWZ1bmN0aW9uIHlkKHQsZSxuLG8saSl7bmdEZXZNb2RlJiZnbihvLGdvLCJNdXN0IGJlIGluIEV4cGFuZG8gc2VjdGlvbiIpLHQuZGF0YVtvXT1pO2NvbnN0IGE9aS5mYWN0b3J5fHwoaS5mYWN0b3J5PUZvKGkudHlwZSwhMCkpLHI9bmV3IG5hKGEseG8oaSksbnVsbCk7dC5ibHVlcHJpbnRbb109cixuW29dPXIsdWQodCxlLDAsbyxLYyh0LG4saS5ob3N0VmFycyxhYyksaSl9ZnVuY3Rpb24gX2QodCxlLG4pe2NvbnN0IG89b2koZSx0KSxpPWlkKG4pLGE9dFsxMF0scj1EZCh0LHFjKHQsaSxudWxsLG4ub25QdXNoPzY0OjE2LG8sZSxhLGEuY3JlYXRlUmVuZGVyZXIobyxuKSxudWxsLG51bGwpKTt0W2UuaW5kZXhdPXJ9ZnVuY3Rpb24gQ2QodCxlLG4sbyxpLGEpe25nRGV2TW9kZSYmKHBuKG8sYWMsIkluY29taW5nIHZhbHVlIHNob3VsZCBuZXZlciBiZSBOT19DSEFOR0UuIiksKGZ1bmN0aW9uIHIodCl7aWYodC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoIm9uIikpe2NvbnN0IGU9YEJpbmRpbmcgdG8gZXZlbnQgYXR0cmlidXRlICcke3R9JyBpcyBkaXNhbGxvd2VkIGZvciBzZWN1cml0eSByZWFzb25zLCBwbGVhc2UgdXNlICgke3Quc2xpY2UoMil9KT0uLi5gO3Rocm93IG5ldyBFcnJvcihlKX19KShuKSxpYSh0LDIsYEF0dGVtcHRlZCB0byBzZXQgYXR0cmlidXRlIFxgJHtufVxgIG9uIGEgY29udGFpbmVyIG5vZGUuIEhvc3QgYmluZGluZ3MgYXJlIG5vdCB2YWxpZCBvbiBuZy1jb250YWluZXIgb3IgbmctdGVtcGxhdGUuYCkpO2NvbnN0IHM9b2kodCxlKTtNZChlWzExXSxzLGEsdC52YWx1ZSxuLG8saSl9ZnVuY3Rpb24gTWQodCxlLG4sbyxpLGEscil7aWYobnVsbD09YSluZ0Rldk1vZGUmJm5nRGV2TW9kZS5yZW5kZXJlclJlbW92ZUF0dHJpYnV0ZSsrLCRvKHQpP3QucmVtb3ZlQXR0cmlidXRlKGUsaSxuKTplLnJlbW92ZUF0dHJpYnV0ZShpKTtlbHNle25nRGV2TW9kZSYmbmdEZXZNb2RlLnJlbmRlcmVyU2V0QXR0cmlidXRlKys7Y29uc3Qgcz1udWxsPT1yPyRlKGEpOnIoYSxvfHwiIixpKTskbyh0KT90LnNldEF0dHJpYnV0ZShlLGkscyxuKTpuP2Uuc2V0QXR0cmlidXRlTlMobixpLHMpOmUuc2V0QXR0cmlidXRlKGkscyl9fWZ1bmN0aW9uIHZkKHQsZSxuLG8saSxhKXtjb25zdCByPWFbZV07aWYobnVsbCE9PXIpe2NvbnN0IGU9by5zZXRJbnB1dDtmb3IobGV0IGE9MDthPHIubGVuZ3RoOyl7Y29uc3Qgcz1yW2ErK10sbD1yW2ErK10sYz1yW2ErK107bnVsbCE9PWU/by5zZXRJbnB1dChuLGMscyxsKTpuW2xdPWMsbmdEZXZNb2RlJiZjZCh0LG9pKGksdCksaS50eXBlLGwsYyl9fX1mdW5jdGlvbiB4ZCh0LGUpe2xldCBuPW51bGwsbz0wO2Zvcig7bzxlLmxlbmd0aDspe2NvbnN0IGk9ZVtvXTtpZigwIT09aSlpZig1IT09aSl7aWYoIm51bWJlciI9PXR5cGVvZiBpKWJyZWFrO3QuaGFzT3duUHJvcGVydHkoaSkmJihudWxsPT09biYmKG49W10pLG4ucHVzaChpLHRbaV0sZVtvKzFdKSksbys9Mn1lbHNlIG8rPTI7ZWxzZSBvKz00fXJldHVybiBufWNvbnN0IE9kPSgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmVW4oKSYmdGwoIkxDb250YWluZXIiKTtmdW5jdGlvbiBQZCh0LGUsbixvKXtuZ0Rldk1vZGUmJlJvKGUpLG5nRGV2TW9kZSYmISRvKGVbMTFdKSYmeW4obik7Y29uc3QgaT1uZXcobmdEZXZNb2RlP09kOkFycmF5KSh0LCEwLCExLGUsbnVsbCwwLG8sbixudWxsLG51bGwpO3JldHVybiBuZ0Rldk1vZGUmJmxuKGkubGVuZ3RoLGJvLCJTaG91bGQgYWxsb2NhdGUgY29ycmVjdCBudW1iZXIgb2Ygc2xvdHMgZm9yIExDb250YWluZXIgaGVhZGVyLiIpLG5nRGV2TW9kZSYmKGZ1bmN0aW9uIGEodCl7aGModCxuZXcgR2ModCkpfSkoaSksaX1mdW5jdGlvbiB3ZCh0LGUpe25nRGV2TW9kZSYmbG4oc2kodCksITEsIlNob3VsZCBiZSBydW4gaW4gdXBkYXRlIG1vZGUiKTtjb25zdCBuPXJpKGUsdCk7aWYobGkobikpe2NvbnN0IHQ9blsxXTs4MCZuWzJdP1FjKHQsbix0LnRlbXBsYXRlLG5bOF0pOm5bNV0+MCYma2Qobil9fWZ1bmN0aW9uIGtkKHQpe2ZvcihsZXQgZT1mbCh0KTtudWxsIT09ZTtlPWdsKGUpKWZvcihsZXQgdD1ibzt0PGUubGVuZ3RoO3QrKyl7Y29uc3Qgbj1lW3RdO2lmKDEwMjQmblsyXSl7Y29uc3QgdD1uWzFdO25nRGV2TW9kZSYmaG4odCwiVFZpZXcgbXVzdCBiZSBhbGxvY2F0ZWQiKSxRYyh0LG4sdC50ZW1wbGF0ZSxuWzhdKX1lbHNlIG5bNV0+MCYma2Qobil9Y29uc3QgZT10WzFdLmNvbXBvbmVudHM7aWYobnVsbCE9PWUpZm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2NvbnN0IG89cmkoZVtuXSx0KTtsaShvKSYmb1s1XT4wJiZrZChvKX19ZnVuY3Rpb24gU2QodCxlKXtuZ0Rldk1vZGUmJmxuKHNpKHQpLCEwLCJTaG91bGQgYmUgcnVuIGluIGNyZWF0aW9uIG1vZGUiKTtjb25zdCBuPXJpKGUsdCksbz1uWzFdOyEoZnVuY3Rpb24gaSh0LGUpe2ZvcihsZXQgbj1lLmxlbmd0aDtuPHQuYmx1ZXByaW50Lmxlbmd0aDtuKyspZS5wdXNoKHQuYmx1ZXByaW50W25dKX0pKG8sbiksSmMobyxuLG5bOF0pfWZ1bmN0aW9uIERkKHQsZSl7cmV0dXJuIHRbMTNdP3RbMTRdWzRdPWU6dFsxM109ZSx0WzE0XT1lLGV9ZnVuY3Rpb24gRWQodCl7Zm9yKDt0Oyl7dFsyXXw9NjQ7Y29uc3QgZT1tbCh0KTtpZigwIT0oNTEyJnRbMl0pJiYhZSlyZXR1cm4gdDt0PWV9cmV0dXJuIG51bGx9ZnVuY3Rpb24gUmQodCl7Zm9yKGxldCBlPTA7ZTx0LmNvbXBvbmVudHMubGVuZ3RoO2UrKyl7Y29uc3Qgbj10LmNvbXBvbmVudHNbZV0sbz1WcyhuKSxpPW9bMV07JGMoaSxvLGkudGVtcGxhdGUsbil9fWZ1bmN0aW9uIEFkKHQsZSxuKXtjb25zdCBvPWVbMTBdO28uYmVnaW4mJm8uYmVnaW4oKTt0cnl7UWModCxlLHQudGVtcGxhdGUsbil9Y2F0Y2godCl7dGhyb3cgQmQoZSx0KSx0fWZpbmFsbHl7by5lbmQmJm8uZW5kKCl9fWZ1bmN0aW9uIFRkKHQpe1JkKHRbOF0pfWZ1bmN0aW9uIE5kKHQsZSxuKXtuZ0Rldk1vZGUmJmhuKGUsIlZpZXcgcXVlcmllcyBmdW5jdGlvbiB0byBleGVjdXRlIG11c3QgYmUgZGVmaW5lZC4iKSx6aSgwKSxlKHQsbil9ZnVuY3Rpb24gemQodCxlLG4sbywuLi5pKXtpZihudWxsPT09dFtvXSYmKG51bGw9PWUuaW5wdXRzfHwhZS5pbnB1dHNbbl0pKXsoZS5wcm9wZXJ0eUJpbmRpbmdzfHwoZS5wcm9wZXJ0eUJpbmRpbmdzPVtdKSkucHVzaChvKTtsZXQgYT1uO2kubGVuZ3RoPjAmJihhKz1hbCtpLmpvaW4oYWwpKSx0W29dPWF9fWNvbnN0IElkPVdjO2Z1bmN0aW9uIEhkKHQpe3JldHVybiB0WzddfHwodFs3XT1uZ0Rldk1vZGU/bmV3IEFjOltdKX1mdW5jdGlvbiBGZCh0KXtyZXR1cm4gdC5jbGVhbnVwfHwodC5jbGVhbnVwPW5nRGV2TW9kZT9uZXcgVGM6W10pfWZ1bmN0aW9uIExkKHQsZSxuKXtyZXR1cm4obnVsbD09PXR8fHhvKHQpKSYmKG49KGZ1bmN0aW9uIG8odCl7Zm9yKDtBcnJheS5pc0FycmF5KHQpOyl7aWYoIm9iamVjdCI9PXR5cGVvZiB0WzFdKXJldHVybiB0O3Q9dFswXX1yZXR1cm4gbnVsbH0pKG5bZS5pbmRleF0pKSxuWzExXX1mdW5jdGlvbiBCZCh0LGUpe2NvbnN0IG49dFs5XSxvPW4/bi5nZXQoWnMsbnVsbCk6bnVsbDtvJiZvLmhhbmRsZUVycm9yKGUpfWZ1bmN0aW9uIFZkKHQsZSxuLG8saSl7Zm9yKGxldCBhPTA7YTxuLmxlbmd0aDspe2NvbnN0IHI9blthKytdLHM9blthKytdLGw9ZVtyXTtuZ0Rldk1vZGUmJl9uKGUscik7Y29uc3QgYz10LmRhdGFbcl07bnVsbCE9PWMuc2V0SW5wdXQ/Yy5zZXRJbnB1dChsLGksbyxzKTpsW3NdPWl9fWZ1bmN0aW9uIGpkKHQsZSxuKXtuZ0Rldk1vZGUmJnNuKG4sIlZhbHVlIHNob3VsZCBiZSBhIHN0cmluZyIpLG5nRGV2TW9kZSYmcG4obixhYywidmFsdWUgc2hvdWxkIG5vdCBiZSBOT19DSEFOR0UiKSxuZ0Rldk1vZGUmJl9uKHQsZSk7Y29uc3Qgbz1uaShlLHQpO25nRGV2TW9kZSYmaG4obywibmF0aXZlIGVsZW1lbnQgc2hvdWxkIGV4aXN0IiksX2wodFsxMV0sbyxuKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gVWQodCxlLG4pe25nRGV2TW9kZSYmQW8oZ2koKSwiRXhwZWN0aW5nIHRvIGJlIGNhbGxlZCBpbiBmaXJzdCB0ZW1wbGF0ZSBwYXNzIG9ubHkiKTtsZXQgbz1uP3Quc3R5bGVzOm51bGwsaT1uP3QuY2xhc3NlczpudWxsLGE9MDtpZihudWxsIT09ZSlmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7Y29uc3Qgbj1lW3RdOyJudW1iZXIiPT10eXBlb2Ygbj9hPW46MT09YT9pPVdlKGksbik6Mj09YSYmKG89V2UobyxuKyI6ICIrZVsrK3RdKyI7IikpfW4/dC5zdHlsZXM9bzp0LnN0eWxlc1dpdGhvdXRIb3N0PW8sbj90LmNsYXNzZXM9aTp0LmNsYXNzZXNXaXRob3V0SG9zdD1pfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IEdkPW5ldyBHYSgiSU5KRUNUT1IiLC0xKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgV2R7Z2V0KHQsZT1ncil7aWYoZT09PWdyKXtjb25zdCBlPW5ldyBFcnJvcihgTnVsbEluamVjdG9yRXJyb3I6IE5vIHByb3ZpZGVyIGZvciAke0dlKHQpfSFgKTt0aHJvdyBlLm5hbWU9Ik51bGxJbmplY3RvckVycm9yIixlfXJldHVybiBlfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3QgWWQ9bmV3IEdhKCJTZXQgSW5qZWN0b3Igc2NvcGUuIikscWQ9e30sWmQ9e307Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2xldCBYZDtmdW5jdGlvbiBLZCgpe3JldHVybiB2b2lkIDA9PT1YZCYmKFhkPW5ldyBXZCksWGR9ZnVuY3Rpb24gSmQodCxlPW51bGwsbj1udWxsLG8pe3JldHVybiBuZXcgUWQodCxuLGV8fEtkKCksbyl9Y2xhc3MgUWR7Y29uc3RydWN0b3IodCxlLG4sbz1udWxsKXt0aGlzLnBhcmVudD1uLHRoaXMucmVjb3Jkcz1uZXcgTWFwLHRoaXMuaW5qZWN0b3JEZWZUeXBlcz1uZXcgU2V0LHRoaXMub25EZXN0cm95PW5ldyBTZXQsdGhpcy5fZGVzdHJveWVkPSExO2NvbnN0IGk9W107ZSYmZXIoZSwobj0+dGhpcy5wcm9jZXNzUHJvdmlkZXIobix0LGUpKSksZXIoW3RdLCh0PT50aGlzLnByb2Nlc3NJbmplY3RvclR5cGUodCxbXSxpKSkpLHRoaXMucmVjb3Jkcy5zZXQoR2QsZXAodm9pZCAwLHRoaXMpKTtjb25zdCBhPXRoaXMucmVjb3Jkcy5nZXQoWWQpO3RoaXMuc2NvcGU9bnVsbCE9YT9hLnZhbHVlOm51bGwsdGhpcy5zb3VyY2U9b3x8KCJvYmplY3QiPT10eXBlb2YgdD9udWxsOkdlKHQpKX1nZXQgZGVzdHJveWVkKCl7cmV0dXJuIHRoaXMuX2Rlc3Ryb3llZH1kZXN0cm95KCl7dGhpcy5hc3NlcnROb3REZXN0cm95ZWQoKSx0aGlzLl9kZXN0cm95ZWQ9ITA7dHJ5e3RoaXMub25EZXN0cm95LmZvckVhY2goKHQ9PnQubmdPbkRlc3Ryb3koKSkpfWZpbmFsbHl7dGhpcy5yZWNvcmRzLmNsZWFyKCksdGhpcy5vbkRlc3Ryb3kuY2xlYXIoKSx0aGlzLmluamVjdG9yRGVmVHlwZXMuY2xlYXIoKX19Z2V0KHQsZT1ncixuPUVuLkRlZmF1bHQpe3RoaXMuYXNzZXJ0Tm90RGVzdHJveWVkKCk7Y29uc3Qgbz1Dcih0aGlzKSxpPUFuKHZvaWQgMCk7dHJ5e2lmKCEobiZFbi5Ta2lwU2VsZikpe2xldCBlPXRoaXMucmVjb3Jkcy5nZXQodCk7aWYodm9pZCAwPT09ZSl7Y29uc3Qgbj0oZnVuY3Rpb24gbyh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdHx8Im9iamVjdCI9PXR5cGVvZiB0JiZ0IGluc3RhbmNlb2YgR2F9KSh0KSYmeG4odCk7ZT1uJiZ0aGlzLmluamVjdGFibGVEZWZJblNjb3BlKG4pP2VwKCRkKHQpLHFkKTpudWxsLHRoaXMucmVjb3Jkcy5zZXQodCxlKX1pZihudWxsIT1lKXJldHVybiB0aGlzLmh5ZHJhdGUodCxlKX1yZXR1cm4obiZFbi5TZWxmP0tkKCk6dGhpcy5wYXJlbnQpLmdldCh0LGU9biZFbi5PcHRpb25hbCYmZT09PWdyP251bGw6ZSl9Y2F0Y2goZSl7aWYoIk51bGxJbmplY3RvckVycm9yIj09PWUubmFtZSl7aWYoKGUubmdUZW1wVG9rZW5QYXRoPWUubmdUZW1wVG9rZW5QYXRofHxbXSkudW5zaGlmdChHZSh0KSksbyl0aHJvdyBlO3JldHVybihmdW5jdGlvbiBuKHQsZSxvLGkpe2NvbnN0IGE9dC5uZ1RlbXBUb2tlblBhdGg7dGhyb3cgZVticl0mJmEudW5zaGlmdChlW2JyXSksdC5tZXNzYWdlPShmdW5jdGlvbiByKHQsZSxuLG89bnVsbCl7dD10JiYiXG4iPT09dC5jaGFyQXQoMCkmJiLJtSI9PXQuY2hhckF0KDEpP3Quc3Vic3RyKDIpOnQ7bGV0IGk9R2UoZSk7aWYoQXJyYXkuaXNBcnJheShlKSlpPWUubWFwKEdlKS5qb2luKCIgLT4gIik7ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIGUpe2xldCB0PVtdO2ZvcihsZXQgbiBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkobikpe2xldCBvPWVbbl07dC5wdXNoKG4rIjoiKygic3RyaW5nIj09dHlwZW9mIG8/SlNPTi5zdHJpbmdpZnkobyk6R2UobykpKX1pPWB7JHt0LmpvaW4oIiwgIil9fWB9cmV0dXJuYCR7bn0ke28/IigiK28rIikiOiIifVske2l9XTogJHt0LnJlcGxhY2UoaHIsIlxuICAiKX1gfSkoIlxuIit0Lm1lc3NhZ2UsYSxvLGkpLHQubmdUb2tlblBhdGg9YSx0Lm5nVGVtcFRva2VuUGF0aD1udWxsLHR9KShlLHQsIlIzSW5qZWN0b3JFcnJvciIsdGhpcy5zb3VyY2UpfXRocm93IGV9ZmluYWxseXtBbihpKSxDcihvKX19X3Jlc29sdmVJbmplY3RvckRlZlR5cGVzKCl7dGhpcy5pbmplY3RvckRlZlR5cGVzLmZvckVhY2goKHQ9PnRoaXMuZ2V0KHQpKSl9dG9TdHJpbmcoKXtjb25zdCB0PVtdO3JldHVybiB0aGlzLnJlY29yZHMuZm9yRWFjaCgoKGUsbik9PnQucHVzaChHZShuKSkpKSxgUjNJbmplY3Rvclske3Quam9pbigiLCAiKX1dYH1hc3NlcnROb3REZXN0cm95ZWQoKXtpZih0aGlzLl9kZXN0cm95ZWQpdGhyb3cgbmV3IEVycm9yKCJJbmplY3RvciBoYXMgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZC4iKX1wcm9jZXNzSW5qZWN0b3JUeXBlKHQsZSxuKXtpZighKHQ9WmUodCkpKXJldHVybiExO2xldCBvPVBuKHQpO2NvbnN0IGk9bnVsbD09byYmdC5uZ01vZHVsZXx8dm9pZCAwLGE9dm9pZCAwPT09aT90Omk7bmdEZXZNb2RlJiYtMSE9PWUuaW5kZXhPZihhKSYmZW4oR2UoYSksZS5tYXAoR2UpKTtjb25zdCByPS0xIT09bi5pbmRleE9mKGEpO2lmKHZvaWQgMCE9PWkmJihvPVBuKGkpKSxudWxsPT1vKXJldHVybiExO2lmKG51bGwhPW8uaW1wb3J0cyYmIXIpe2xldCB0O25nRGV2TW9kZSYmZS5wdXNoKGEpLG4ucHVzaChhKTt0cnl7ZXIoby5pbXBvcnRzLChvPT57dGhpcy5wcm9jZXNzSW5qZWN0b3JUeXBlKG8sZSxuKSYmKHZvaWQgMD09PXQmJih0PVtdKSx0LnB1c2gobykpfSkpfWZpbmFsbHl7bmdEZXZNb2RlJiZlLnBvcCgpfWlmKHZvaWQgMCE9PXQpZm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2NvbnN0e25nTW9kdWxlOm4scHJvdmlkZXJzOm99PXRbZV07ZXIobywodD0+dGhpcy5wcm9jZXNzUHJvdmlkZXIodCxuLG98fFduKSkpfX10aGlzLmluamVjdG9yRGVmVHlwZXMuYWRkKGEpO2NvbnN0IHM9Rm8oYSl8fCgoKT0+bmV3IGEpO3RoaXMucmVjb3Jkcy5zZXQoYSxlcChzLHFkKSk7Y29uc3QgbD1vLnByb3ZpZGVycztpZihudWxsIT1sJiYhcil7Y29uc3QgZT10O2VyKGwsKHQ9PnRoaXMucHJvY2Vzc1Byb3ZpZGVyKHQsZSxsKSkpfXJldHVybiB2b2lkIDAhPT1pJiZ2b2lkIDAhPT10LnByb3ZpZGVyc31wcm9jZXNzUHJvdmlkZXIodCxlLG4pe2xldCBvPW9wKHQ9WmUodCkpP3Q6WmUodCYmdC5wcm92aWRlKTtjb25zdCBpPShmdW5jdGlvbiBhKHQsZSxuKXtyZXR1cm4gbnAodCk/ZXAodm9pZCAwLHQudXNlVmFsdWUpOmVwKHRwKHQsZSxuKSxxZCl9KSh0LGUsbik7aWYob3AodCl8fCEwIT09dC5tdWx0aSl7Y29uc3QgdD10aGlzLnJlY29yZHMuZ2V0KG8pO25nRGV2TW9kZSYmdCYmdm9pZCAwIT09dC5tdWx0aSYmbm4oKX1lbHNle2xldCBlPXRoaXMucmVjb3Jkcy5nZXQobyk7ZT9uZ0Rldk1vZGUmJnZvaWQgMD09PWUubXVsdGkmJm5uKCk6KGU9ZXAodm9pZCAwLHFkLCEwKSxlLmZhY3Rvcnk9KCk9PlByKGUubXVsdGkpLHRoaXMucmVjb3Jkcy5zZXQobyxlKSksbz10LGUubXVsdGkucHVzaCh0KX10aGlzLnJlY29yZHMuc2V0KG8saSl9aHlkcmF0ZSh0LGUpe3JldHVybiBuZ0Rldk1vZGUmJmUudmFsdWU9PT1aZD9lbihHZSh0KSk6ZS52YWx1ZT09PXFkJiYoZS52YWx1ZT1aZCxlLnZhbHVlPWUuZmFjdG9yeSgpKSwib2JqZWN0Ij09dHlwZW9mIGUudmFsdWUmJmUudmFsdWUmJihmdW5jdGlvbiBuKHQpe3JldHVybiBudWxsIT09dCYmIm9iamVjdCI9PXR5cGVvZiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5uZ09uRGVzdHJveX0pKGUudmFsdWUpJiZ0aGlzLm9uRGVzdHJveS5hZGQoZS52YWx1ZSksZS52YWx1ZX1pbmplY3RhYmxlRGVmSW5TY29wZSh0KXtpZighdC5wcm92aWRlZEluKXJldHVybiExO2NvbnN0IGU9WmUodC5wcm92aWRlZEluKTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/ImFueSI9PT1lfHxlPT09dGhpcy5zY29wZTp0aGlzLmluamVjdG9yRGVmVHlwZXMuaGFzKGUpfX1mdW5jdGlvbiAkZCh0KXtjb25zdCBlPXhuKHQpLG49bnVsbCE9PWU/ZS5mYWN0b3J5OkZvKHQpO2lmKG51bGwhPT1uKXJldHVybiBuO2lmKHQgaW5zdGFuY2VvZiBHYSl0aHJvdyBuZXcgRXJyb3IoYFRva2VuICR7R2UodCl9IGlzIG1pc3NpbmcgYSDJtXByb3YgZGVmaW5pdGlvbi5gKTtpZih0IGluc3RhbmNlb2YgRnVuY3Rpb24pcmV0dXJuKGZ1bmN0aW9uIG8odCl7Y29uc3QgZT10Lmxlbmd0aDtpZihlPjApe2NvbnN0IG49aXIoZSwiPyIpO3Rocm93IG5ldyBFcnJvcihgQ2FuJ3QgcmVzb2x2ZSBhbGwgcGFyYW1ldGVycyBmb3IgJHtHZSh0KX06ICgke24uam9pbigiLCAiKX0pLmApfWNvbnN0IG49KGZ1bmN0aW9uIG8odCl7Y29uc3QgZT10JiYodFt3bl18fHRbU25dKTtpZihlKXtjb25zdCBuPShmdW5jdGlvbiBuKHQpe2lmKHQuaGFzT3duUHJvcGVydHkoIm5hbWUiKSlyZXR1cm4gdC5uYW1lO2NvbnN0IGU9KCIiK3QpLm1hdGNoKC9eZnVuY3Rpb25ccyooW15ccyhdKykvKTtyZXR1cm4gbnVsbD09PWU/IiI6ZVsxXX0pKHQpO3JldHVybiBjb25zb2xlLndhcm4oYERFUFJFQ0FURUQ6IERJIGlzIGluc3RhbnRpYXRpbmcgYSB0b2tlbiAiJHtufSIgdGhhdCBpbmhlcml0cyBpdHMgQEluamVjdGFibGUgZGVjb3JhdG9yIGJ1dCBkb2VzIG5vdCBwcm92aWRlIG9uZSBpdHNlbGYuXG5UaGlzIHdpbGwgYmVjb21lIGFuIGVycm9yIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgQW5ndWxhci4gUGxlYXNlIGFkZCBASW5qZWN0YWJsZSgpIHRvIHRoZSAiJHtufSIgY2xhc3MuYCksZX1yZXR1cm4gbnVsbH0pKHQpO3JldHVybiBudWxsIT09bj8oKT0+bi5mYWN0b3J5KHQpOigpPT5uZXcgdH0pKHQpO3Rocm93IG5ldyBFcnJvcigidW5yZWFjaGFibGUiKX1mdW5jdGlvbiB0cCh0LGUsbil7bGV0IG87aWYob3AodCkpe2NvbnN0IGU9WmUodCk7cmV0dXJuIEZvKGUpfHwkZChlKX1pZihucCh0KSlvPSgpPT5aZSh0LnVzZVZhbHVlKTtlbHNlIGlmKChmdW5jdGlvbiBpKHQpe3JldHVybiEoIXR8fCF0LnVzZUZhY3RvcnkpfSkodCkpbz0oKT0+dC51c2VGYWN0b3J5KC4uLlByKHQuZGVwc3x8W10pKTtlbHNlIGlmKChmdW5jdGlvbiBhKHQpe3JldHVybiEoIXR8fCF0LnVzZUV4aXN0aW5nKX0pKHQpKW89KCk9PnZyKFplKHQudXNlRXhpc3RpbmcpKTtlbHNle2NvbnN0IGk9WmUodCYmKHQudXNlQ2xhc3N8fHQucHJvdmlkZSkpO2lmKG5nRGV2TW9kZSYmIWkmJihmdW5jdGlvbiByKHQsZSxuKXtsZXQgbz0iIjt0aHJvdyB0JiZlJiYobz1gIC0gb25seSBpbnN0YW5jZXMgb2YgUHJvdmlkZXIgYW5kIFR5cGUgYXJlIGFsbG93ZWQsIGdvdDogWyR7ZS5tYXAoKHQ9PnQ9PW4/Ij8iK24rIj8iOiIuLi4iKSkuam9pbigiLCAiKX1dYCksbmV3IEVycm9yKGBJbnZhbGlkIHByb3ZpZGVyIGZvciB0aGUgTmdNb2R1bGUgJyR7R2UodCl9J2Arbyl9KShlLG4sdCksIShmdW5jdGlvbiBzKHQpe3JldHVybiEhdC5kZXBzfSkodCkpcmV0dXJuIEZvKGkpfHwkZChpKTtvPSgpPT5uZXcgaSguLi5Qcih0LmRlcHMpKX1yZXR1cm4gb31mdW5jdGlvbiBlcCh0LGUsbj0hMSl7cmV0dXJue2ZhY3Rvcnk6dCx2YWx1ZTplLG11bHRpOm4/W106dm9pZCAwfX1mdW5jdGlvbiBucCh0KXtyZXR1cm4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdCYmeXIgaW4gdH1mdW5jdGlvbiBvcCh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH1jb25zdCBpcD1mdW5jdGlvbiBhcCh0LGUsbil7cmV0dXJuKGZ1bmN0aW9uIG8odCxlPW51bGwsbj1udWxsLGkpe2NvbnN0IGE9SmQodCxlLG4saSk7cmV0dXJuIGEuX3Jlc29sdmVJbmplY3RvckRlZlR5cGVzKCksYX0pKHtuYW1lOm59LGUsdCxuKX07Y2xhc3MgcnB7c3RhdGljIGNyZWF0ZSh0LGUpe3JldHVybiBBcnJheS5pc0FycmF5KHQpP2lwKHQsZSwiIik6aXAodC5wcm92aWRlcnMsdC5wYXJlbnQsdC5uYW1lfHwiIil9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KZnVuY3Rpb24gc3AodCl7YnAodCk7Y29uc3QgZT1Jcyh0KTtyZXR1cm4gbnVsbD09PWU/bnVsbDoodm9pZCAwPT09ZS5jb21wb25lbnQmJihlLmNvbXBvbmVudD0oZnVuY3Rpb24gbih0LGUpe2NvbnN0IG49ZVsxXS5kYXRhW3RdO3JldHVybiAyJm4uZmxhZ3M/ZVtuLmRpcmVjdGl2ZVN0YXJ0XTpudWxsfSkoZS5ub2RlSW5kZXgsZS5sVmlldykpLGUuY29tcG9uZW50KX1mdW5jdGlvbiBscCh0KXticCh0KTtjb25zdCBlPUlzKHQpO3JldHVybiBudWxsPT09ZT9udWxsOmUubFZpZXdbOF19ZnVuY3Rpb24gY3AodCl7Y29uc3QgZT1Jcyh0KTtpZihudWxsPT09ZSlyZXR1cm4gbnVsbDtsZXQgbixvPWUubFZpZXc7Zm9yKG5nRGV2TW9kZSYmUm8obyk7Mj09PW9bMV0udHlwZSYmKG49bWwobykpOylvPW47cmV0dXJuIDUxMiZvWzJdP251bGw6b1s4XX1mdW5jdGlvbiBkcCh0KXtyZXR1cm5bLi4udWwodCkuY29tcG9uZW50c119ZnVuY3Rpb24gcHAodCl7Y29uc3QgZT1Jcyh0KTtyZXR1cm4gbnVsbD09PWU/cnAuTlVMTDpuZXcgUmEoZS5sVmlld1sxXS5kYXRhW2Uubm9kZUluZGV4XSxlLmxWaWV3KX1mdW5jdGlvbiBtcCh0KXtpZih0IGluc3RhbmNlb2YgVGV4dClyZXR1cm5bXTtjb25zdCBlPUlzKHQpO2lmKG51bGw9PT1lKXJldHVybltdO2NvbnN0IG49ZS5sVmlldyxvPW5bMV0saT1lLm5vZGVJbmRleDtyZXR1cm4obnVsbD09bz92b2lkIDA6by5kYXRhW2ldKT8odm9pZCAwPT09ZS5kaXJlY3RpdmVzJiYoZS5kaXJlY3RpdmVzPVdzKGksbiwhMSkpLG51bGw9PT1lLmRpcmVjdGl2ZXM/W106Wy4uLmUuZGlyZWN0aXZlc10pOltdfWZ1bmN0aW9uIHVwKHQpe2NvbnN0e2NvbnN0cnVjdG9yOmV9PXQ7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gZmluZCB0aGUgaW5zdGFuY2UgY29uc3RydWN0b3IiKTtjb25zdCBuPXBvKGUpO2lmKG4pcmV0dXJue2lucHV0czpuLmlucHV0cyxvdXRwdXRzOm4ub3V0cHV0cyxlbmNhcHN1bGF0aW9uOm4uZW5jYXBzdWxhdGlvbixjaGFuZ2VEZXRlY3Rpb246bi5vblB1c2g/em4uT25QdXNoOnpuLkRlZmF1bHR9O2NvbnN0IG89bW8oZSk7cmV0dXJuIG8/e2lucHV0czpvLmlucHV0cyxvdXRwdXRzOm8ub3V0cHV0c306bnVsbH1mdW5jdGlvbiBmcCh0KXtyZXR1cm4gSXModCkubmF0aXZlfWZ1bmN0aW9uIGdwKHQpe2JwKHQpO2NvbnN0IGU9SXModCk7aWYobnVsbD09PWUpcmV0dXJuW107Y29uc3Qgbj1lLmxWaWV3LG89bls3XSxpPW5bMV0uY2xlYW51cCxhPVtdO2lmKGkmJm8pZm9yKGxldCBlPTA7ZTxpLmxlbmd0aDspe2NvbnN0IHI9aVtlKytdLHM9aVtlKytdO2lmKCJzdHJpbmciPT10eXBlb2Ygcil7Y29uc3QgbD1yLGM9ZWkobltzXSksZD1vW2lbZSsrXV0scD1pW2UrK10sbT0iYm9vbGVhbiI9PXR5cGVvZiBwfHxwPj0wPyJkb20iOiJvdXRwdXQiLHU9ImJvb2xlYW4iPT10eXBlb2YgcCYmcDt0PT1jJiZhLnB1c2goe2VsZW1lbnQ6dCxuYW1lOmwsY2FsbGJhY2s6ZCx1c2VDYXB0dXJlOnUsdHlwZTptfSl9fXJldHVybiBhLnNvcnQoaHApLGF9ZnVuY3Rpb24gaHAodCxlKXtyZXR1cm4gdC5uYW1lPT1lLm5hbWU/MDp0Lm5hbWU8ZS5uYW1lPy0xOjF9ZnVuY3Rpb24gYnAodCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBFbGVtZW50JiYhKHQgaW5zdGFuY2VvZiBFbGVtZW50KSl0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGluZyBpbnN0YW5jZSBvZiBET00gRWxlbWVudCIpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiB5cCh0KXsoZnVuY3Rpb24gZSh0KXtuZ0Rldk1vZGUmJmhuKHQsImNvbXBvbmVudCIpO2NvbnN0IGU9RWQoRnModCkpO25nRGV2TW9kZSYmaG4oZVs4XSwicm9vdENvbnRleHQgc2hvdWxkIGJlIGRlZmluZWQiKSwoZnVuY3Rpb24gbih0LGUpe2lmKDA9PT10LmZsYWdzJiZ0LmNsZWFuPT1XYyl7bGV0IG47dC5mbGFnc3w9ZSx0LmNsZWFuPW5ldyBQcm9taXNlKCh0PT5uPXQpKSx0LnNjaGVkdWxlcigoKCk9PntpZigxJnQuZmxhZ3MmJih0LmZsYWdzJj0tMixSZCh0KSksMiZ0LmZsYWdzKXt0LmZsYWdzJj0tMztjb25zdCBlPXQucGxheWVySGFuZGxlcjtlJiZlLmZsdXNoUGxheWVycygpfXQuY2xlYW49V2MsbihudWxsKX0pKX19KShlWzhdLDEpfSkodCksZHAodCkuZm9yRWFjaCgodD0+KGZ1bmN0aW9uIGUodCl7Y29uc3QgZT1Gcyh0KTtBZChlWzFdLGUsdCl9KSh0KSkpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9ycC5USFJPV19JRl9OT1RfRk9VTkQ9Z3IscnAuTlVMTD1uZXcgV2QscnAuybVwcm92PU1uKHt0b2tlbjpycCxwcm92aWRlZEluOiJhbnkiLGZhY3Rvcnk6KCk9PnZyKEdkKX0pLHJwLl9fTkdfRUxFTUVOVF9JRF9fPS0xO2xldCBfcD0hMTtmdW5jdGlvbiBDcCh0LGUpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgQ09NUElMRUR8fCFDT01QSUxFRCl7Y29uc3Qgbj1qbjtpZihuZ0Rldk1vZGUmJmhuKGUsImZ1bmN0aW9uIG5vdCBkZWZpbmVkIiksbil7bGV0IG89bi5uZztvfHwobz1uLm5nPXt9KSxvW3RdPWV9fX1mdW5jdGlvbiBNcCh0LGUpe2NvbnN0IG49VnModCk7bmdEZXZNb2RlJiZobihuLCJMVmlldyBpcyByZXF1aXJlZCIpO2NvbnN0IG89blsxXSxpPWJpKCk7bmdEZXZNb2RlJiZobihpLCJUTm9kZSBpcyByZXF1aXJlZCIpLFhpKG8saSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIHZwKHQpe3JldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodC5wcm90b3R5cGUpLmNvbnN0cnVjdG9yfWZ1bmN0aW9uIHhwKHQpe2xldCBlPXZwKHQudHlwZSksbj0hMDtjb25zdCBvPVt0XTtmb3IoO2U7KXtsZXQgaTtpZih4byh0KSlpPWUuybVjbXB8fGUuybVkaXI7ZWxzZXtpZihlLsm1Y21wKXRocm93IG5ldyBFcnJvcigiRGlyZWN0aXZlcyBjYW5ub3QgaW5oZXJpdCBDb21wb25lbnRzIik7aT1lLsm1ZGlyfWlmKGkpe2lmKG4pe28ucHVzaChpKTtjb25zdCBlPXQ7ZS5pbnB1dHM9T3AodC5pbnB1dHMpLGUuZGVjbGFyZWRJbnB1dHM9T3AodC5kZWNsYXJlZElucHV0cyksZS5vdXRwdXRzPU9wKHQub3V0cHV0cyk7Y29uc3Qgbj1pLmhvc3RCaW5kaW5ncztuJiZrcCh0LG4pO2NvbnN0IGE9aS52aWV3UXVlcnkscj1pLmNvbnRlbnRRdWVyaWVzO2lmKGEmJlBwKHQsYSksciYmd3AodCxyKSxVZSh0LmlucHV0cyxpLmlucHV0cyksVWUodC5kZWNsYXJlZElucHV0cyxpLmRlY2xhcmVkSW5wdXRzKSxVZSh0Lm91dHB1dHMsaS5vdXRwdXRzKSx4byhpKSYmaS5kYXRhLmFuaW1hdGlvbil7Y29uc3QgZT10LmRhdGE7ZS5hbmltYXRpb249KGUuYW5pbWF0aW9ufHxbXSkuY29uY2F0KGkuZGF0YS5hbmltYXRpb24pfX1jb25zdCBlPWkuZmVhdHVyZXM7aWYoZSlmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rKyl7Y29uc3QgaT1lW29dO2kmJmkubmdJbmhlcml0JiZpKHQpLGk9PT14cCYmKG49ITEpfX1lPU9iamVjdC5nZXRQcm90b3R5cGVPZihlKX0hKGZ1bmN0aW9uIGkodCl7bGV0IGU9MCxuPW51bGw7Zm9yKGxldCBvPXQubGVuZ3RoLTE7bz49MDtvLS0pe2NvbnN0IGk9dFtvXTtpLmhvc3RWYXJzPWUrPWkuaG9zdFZhcnMsaS5ob3N0QXR0cnM9bGEoaS5ob3N0QXR0cnMsbj1sYShuLGkuaG9zdEF0dHJzKSl9fSkobyl9ZnVuY3Rpb24gT3AodCl7cmV0dXJuIHQ9PT1Hbj97fTp0PT09V24/W106dH1mdW5jdGlvbiBQcCh0LGUpe2NvbnN0IG49dC52aWV3UXVlcnk7dC52aWV3UXVlcnk9bj8odCxvKT0+e2UodCxvKSxuKHQsbyl9OmV9ZnVuY3Rpb24gd3AodCxlKXtjb25zdCBuPXQuY29udGVudFF1ZXJpZXM7dC5jb250ZW50UXVlcmllcz1uPyh0LG8saSk9PntlKHQsbyxpKSxuKHQsbyxpKX06ZX1mdW5jdGlvbiBrcCh0LGUpe2NvbnN0IG49dC5ob3N0QmluZGluZ3M7dC5ob3N0QmluZGluZ3M9bj8odCxvKT0+e2UodCxvKSxuKHQsbyl9OmV9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NvbnN0IFNwPVsicHJvdmlkZXJzUmVzb2x2ZXIiXSxEcD1bInRlbXBsYXRlIiwiZGVjbHMiLCJjb25zdHMiLCJ2YXJzIiwib25QdXNoIiwibmdDb250ZW50U2VsZWN0b3JzIiwic3R5bGVzIiwiZW5jYXBzdWxhdGlvbiIsInNjaGVtYXMiXTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmxldCBFcD1udWxsO2Z1bmN0aW9uIFJwKCl7aWYoIUVwKXtjb25zdCB0PWpuLlN5bWJvbDtpZih0JiZ0Lml0ZXJhdG9yKUVwPXQuaXRlcmF0b3I7ZWxzZXtjb25zdCB0PU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE1hcC5wcm90b3R5cGUpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7KytlKXtjb25zdCBuPXRbZV07ImVudHJpZXMiIT09biYmInNpemUiIT09biYmTWFwLnByb3RvdHlwZVtuXT09PU1hcC5wcm90b3R5cGUuZW50cmllcyYmKEVwPW4pfX19cmV0dXJuIEVwfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBBcCh0LGUpe2NvbnN0IG49TnAodCksbz1OcChlKTtpZihuJiZvKXJldHVybihmdW5jdGlvbiBpKHQsZSxuKXtjb25zdCBvPXRbUnAoKV0oKSxpPWVbUnAoKV0oKTtmb3IoOzspe2NvbnN0IHQ9by5uZXh0KCksZT1pLm5leHQoKTtpZih0LmRvbmUmJmUuZG9uZSlyZXR1cm4hMDtpZih0LmRvbmV8fGUuZG9uZSlyZXR1cm4hMTtpZighbih0LnZhbHVlLGUudmFsdWUpKXJldHVybiExfX0pKHQsZSxBcCk7e2NvbnN0IGk9dCYmKCJvYmplY3QiPT10eXBlb2YgdHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQpLGE9ZSYmKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUpO3JldHVybiEobnx8IWl8fG98fCFhKXx8T2JqZWN0LmlzKHQsZSl9fWNsYXNzIFRwe2NvbnN0cnVjdG9yKHQpe3RoaXMud3JhcHBlZD10fXN0YXRpYyB3cmFwKHQpe3JldHVybiBuZXcgVHAodCl9c3RhdGljIHVud3JhcCh0KXtyZXR1cm4gVHAuaXNXcmFwcGVkKHQpP3Qud3JhcHBlZDp0fXN0YXRpYyBpc1dyYXBwZWQodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBUcH19ZnVuY3Rpb24gTnAodCl7cmV0dXJuISF6cCh0KSYmKEFycmF5LmlzQXJyYXkodCl8fCEodCBpbnN0YW5jZW9mIE1hcCkmJlJwKClpbiB0KX1mdW5jdGlvbiB6cCh0KXtyZXR1cm4gbnVsbCE9PXQmJigiZnVuY3Rpb24iPT10eXBlb2YgdHx8Im9iamVjdCI9PXR5cGVvZiB0KX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gSXAodCxlLG4pe3JldHVybiB0W2VdPW59ZnVuY3Rpb24gSHAodCxlKXtyZXR1cm4gbmdEZXZNb2RlJiZfbih0LGUpLG5nRGV2TW9kZSYmcG4odFtlXSxhYywiU3RvcmVkIHZhbHVlIHNob3VsZCBuZXZlciBiZSBOT19DSEFOR0UuIiksdFtlXX1mdW5jdGlvbiBGcCh0LGUsbil7bmdEZXZNb2RlJiZwbihuLGFjLCJJbmNvbWluZyB2YWx1ZSBzaG91bGQgbmV2ZXIgYmUgTk9fQ0hBTkdFLiIpLG5nRGV2TW9kZSYmbW4oZSx0Lmxlbmd0aCwiU2xvdCBzaG91bGQgaGF2ZSBiZWVuIGluaXRpYWxpemVkIHRvIE5PX0NIQU5HRSIpO2NvbnN0IG89dFtlXTtpZihPYmplY3QuaXMobyxuKSlyZXR1cm4hMTtpZihuZ0Rldk1vZGUmJnhpKCkpe2NvbnN0IGk9byE9PWFjP286dm9pZCAwO2lmKCFBcChpLG4pKXtjb25zdCBhPShmdW5jdGlvbiBpKHQsZSxuLG8pe2NvbnN0IGk9dFsxXS5kYXRhLGE9aVtlXTtpZigic3RyaW5nIj09dHlwZW9mIGEpcmV0dXJuIGEuaW5kZXhPZihhbCk+LTE/bGwodCxlLGUsYSxvKTp7cHJvcE5hbWU6YSxvbGRWYWx1ZTpuLG5ld1ZhbHVlOm99O2lmKG51bGw9PT1hKXtsZXQgbj1lLTE7Zm9yKDsic3RyaW5nIiE9dHlwZW9mIGlbbl0mJm51bGw9PT1pW24rMV07KW4tLTtjb25zdCBhPWlbbl07aWYoInN0cmluZyI9PXR5cGVvZiBhKXtjb25zdCBpPWEubWF0Y2gobmV3IFJlZ0V4cChhbCwiZyIpKTtpZihpJiZpLmxlbmd0aC0xPmUtbilyZXR1cm4gbGwodCxuLGUsYSxvKX19cmV0dXJue3Byb3BOYW1lOnZvaWQgMCxvbGRWYWx1ZTpuLG5ld1ZhbHVlOm99fSkodCxlLGksbik7IShmdW5jdGlvbiBhKHQsZSxuLG8pe2xldCBpPWBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yOiBFeHByZXNzaW9uIGhhcyBjaGFuZ2VkIGFmdGVyIGl0IHdhcyBjaGVja2VkLiBQcmV2aW91cyB2YWx1ZSR7bz9gIGZvciAnJHtvfSdgOiIifTogJyR7ZX0nLiBDdXJyZW50IHZhbHVlOiAnJHtufScuYDt0aHJvdyB0JiYoaSs9IiBJdCBzZWVtcyBsaWtlIHRoZSB2aWV3IGhhcyBiZWVuIGNyZWF0ZWQgYWZ0ZXIgaXRzIHBhcmVudCBhbmQgaXRzIGNoaWxkcmVuIGhhdmUgYmVlbiBkaXJ0eSBjaGVja2VkLiBIYXMgaXQgYmVlbiBjcmVhdGVkIGluIGEgY2hhbmdlIGRldGVjdGlvbiBob29rPyIpLG5ldyBLZSgiMTAwIixpKX0pKG89PT1hYyxhLm9sZFZhbHVlLGEubmV3VmFsdWUsYS5wcm9wTmFtZSl9cmV0dXJuITF9cmV0dXJuIHRbZV09biwhMH1mdW5jdGlvbiBMcCh0LGUsbixvKXtjb25zdCBpPUZwKHQsZSxuKTtyZXR1cm4gRnAodCxlKzEsbyl8fGl9ZnVuY3Rpb24gQnAodCxlLG4sbyxpKXtjb25zdCBhPUxwKHQsZSxuLG8pO3JldHVybiBGcCh0LGUrMixpKXx8YX1mdW5jdGlvbiBWcCh0LGUsbixvLGksYSl7Y29uc3Qgcj1McCh0LGUsbixvKTtyZXR1cm4gTHAodCxlKzIsaSxhKXx8cn0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24ganAodCxlLG4sbyl7Y29uc3QgaT1maSgpLGE9U2koKTtpZihGcChpLGEsZSkpe2NvbnN0IHI9Z2koKSxzPVlpKCk7Q2QocyxpLHQsZSxuLG8pLG5nRGV2TW9kZSYmemQoci5kYXRhLHMsImF0dHIuIit0LGEpfXJldHVybiBqcH0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gVXAodCxlKXtuZ0Rldk1vZGUmJm1uKDIsZS5sZW5ndGgsInNob3VsZCBoYXZlIGF0IGxlYXN0IDMgdmFsdWVzIiksbmdEZXZNb2RlJiZsbihlLmxlbmd0aCUyLDEsInNob3VsZCBoYXZlIGFuIG9kZCBudW1iZXIgb2YgdmFsdWVzIik7bGV0IG49ITEsbz13aSgpO2ZvcihsZXQgaT0xO2k8ZS5sZW5ndGg7aSs9MiluPUZwKHQsbysrLGVbaV0pfHxuO2lmKGtpKG8pLCFuKXJldHVybiBhYztsZXQgaT1lWzBdO2ZvcihsZXQgdD0xO3Q8ZS5sZW5ndGg7dCs9MilpKz0kZShlW3RdKStlW3QrMV07cmV0dXJuIGl9ZnVuY3Rpb24gR3AodCxlLG4sbyl7cmV0dXJuIEZwKHQsU2koKSxuKT9lKyRlKG4pK286YWN9ZnVuY3Rpb24gV3AodCxlLG4sbyxpLGEpe2NvbnN0IHI9THAodCx3aSgpLG4saSk7cmV0dXJuIERpKDIpLHI/ZSskZShuKStvKyRlKGkpK2E6YWN9ZnVuY3Rpb24gWXAodCxlLG4sbyxpLGEscixzKXtjb25zdCBsPUJwKHQsd2koKSxuLGkscik7cmV0dXJuIERpKDMpLGw/ZSskZShuKStvKyRlKGkpK2ErJGUocikrczphY31mdW5jdGlvbiBxcCh0LGUsbixvLGksYSxyLHMsbCxjKXtjb25zdCBkPVZwKHQsd2koKSxuLGkscixsKTtyZXR1cm4gRGkoNCksZD9lKyRlKG4pK28rJGUoaSkrYSskZShyKStzKyRlKGwpK2M6YWN9ZnVuY3Rpb24gWnAodCxlLG4sbyxpLGEscixzLGwsYyxkLHApe2NvbnN0IG09d2koKTtsZXQgdT1WcCh0LG0sbixpLHIsbCk7cmV0dXJuIHU9RnAodCxtKzQsZCl8fHUsRGkoNSksdT9lKyRlKG4pK28rJGUoaSkrYSskZShyKStzKyRlKGwpK2MrJGUoZCkrcDphY31mdW5jdGlvbiBYcCh0LGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUpe2NvbnN0IGY9d2koKTtsZXQgZz1WcCh0LGYsbixpLHIsbCk7cmV0dXJuIGc9THAodCxmKzQsZCxtKXx8ZyxEaSg2KSxnP2UrJGUobikrbyskZShpKSthKyRlKHIpK3MrJGUobCkrYyskZShkKStwKyRlKG0pK3U6YWN9ZnVuY3Rpb24gS3AodCxlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYsZyl7Y29uc3QgaD13aSgpO2xldCBiPVZwKHQsaCxuLGkscixsKTtyZXR1cm4gYj1CcCh0LGgrNCxkLG0sZil8fGIsRGkoNyksYj9lKyRlKG4pK28rJGUoaSkrYSskZShyKStzKyRlKGwpK2MrJGUoZCkrcCskZShtKSt1KyRlKGYpK2c6YWN9ZnVuY3Rpb24gSnAodCxlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYsZyxoLGIpe2NvbnN0IHk9d2koKTtsZXQgXz1WcCh0LHksbixpLHIsbCk7cmV0dXJuIF89VnAodCx5KzQsZCxtLGYsaCl8fF8sRGkoOCksXz9lKyRlKG4pK28rJGUoaSkrYSskZShyKStzKyRlKGwpK2MrJGUoZCkrcCskZShtKSt1KyRlKGYpK2crJGUoaCkrYjphY31mdW5jdGlvbiBRcCh0LGUsbixvLGksYSxyLHMpe2NvbnN0IGw9ZmkoKSxjPWdpKCksZD10K2dvLHA9Yy5maXJzdENyZWF0ZVBhc3M/KAovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KZnVuY3Rpb24gbSh0LGUsbixvLGksYSxyLHMsbCl7bmdEZXZNb2RlJiZBbyhlKSxuZ0Rldk1vZGUmJm5nRGV2TW9kZS5maXJzdENyZWF0ZVBhc3MrKztjb25zdCBjPWUuY29uc3RzLGQ9WmMoZSx0LDQscnx8bnVsbCxjaShjLHMpKTttZChlLG4sZCxjaShjLGwpKSxYaShlLGQpO2NvbnN0IHA9ZC50Vmlld3M9YWQoMixkLG8saSxhLGUuZGlyZWN0aXZlUmVnaXN0cnksZS5waXBlUmVnaXN0cnksbnVsbCxlLnNjaGVtYXMsYyk7cmV0dXJuIG51bGwhPT1lLnF1ZXJpZXMmJihlLnF1ZXJpZXMudGVtcGxhdGUoZSxkKSxwLnF1ZXJpZXM9ZS5xdWVyaWVzLmVtYmVkZGVkVFZpZXcoZCkpLGR9KShkLGMsbCxlLG4sbyxpLGEscik6Yy5kYXRhW2RdO0NpKHAsITEpO2NvbnN0IHU9bFsxMV0uY3JlYXRlQ29tbWVudChuZ0Rldk1vZGU/ImNvbnRhaW5lciI6IiIpO0hsKGMsbCx1LHApLExzKHUsbCksRGQobCxsW2RdPVBkKHUsbCx1LHApKSx2byhwKSYmbmQoYyxsLHApLG51bGwhPXImJm9kKGwscCxzKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gJHAodCl7cmV0dXJuIGFpKChmdW5jdGlvbiBlKCl7cmV0dXJuIG1pLmxGcmFtZS5jb250ZXh0TFZpZXd9KSgpLGdvK3QpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCB0bT17Ism1ybVkZWZpbmVJbmplY3RhYmxlIjpNbiwiybXJtWRlZmluZUluamVjdG9yIjp2biwiybXJtWluamVjdCI6dnIsIsm1ybVpbnZhbGlkRmFjdG9yeURlcCI6eHIscmVzb2x2ZUZvcndhcmRSZWY6WmV9LGVtPWplKHtwcm92aWRlOlN0cmluZyx1c2VWYWx1ZTpqZX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBubSh0KXtyZXR1cm4gdm9pZCAwIT09dC51c2VDbGFzc31mdW5jdGlvbiBvbSh0KXtyZXR1cm4gdm9pZCAwIT09dC51c2VGYWN0b3J5fWplKHtwcm92aWRlOlN0cmluZyx1c2VWYWx1ZTpqZX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgaW09RmEoIkluamVjdGFibGUiLHZvaWQgMCx2b2lkIDAsdm9pZCAwLCgodCxlKT0+YW0odCxlKSkpLGFtPWZ1bmN0aW9uIHJtKHQsZSl7bGV0IG49bnVsbCxvPW51bGw7dC5oYXNPd25Qcm9wZXJ0eSh3bil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHduLHtnZXQ6KCk9PntpZihudWxsPT09bil7Y29uc3Qgbz1KYSh7dXNhZ2U6MCxraW5kOiJpbmplY3RhYmxlIix0eXBlOnR9KTtuPW8uY29tcGlsZUluamVjdGFibGUodG0sYG5nOi8vLyR7dC5uYW1lfS/JtXByb3YuanNgLChmdW5jdGlvbiBvKHQsZSl7Y29uc3Qgbj1lfHx7cHJvdmlkZWRJbjpudWxsfSxvPXtuYW1lOnQubmFtZSx0eXBlOnQsdHlwZUFyZ3VtZW50Q291bnQ6MCxwcm92aWRlZEluOm4ucHJvdmlkZWRJbn07cmV0dXJuKG5tKG4pfHxvbShuKSkmJnZvaWQgMCE9PW4uZGVwcyYmKG8uZGVwcz16cihuLmRlcHMpKSxubShuKT9vLnVzZUNsYXNzPW4udXNlQ2xhc3M6KGZ1bmN0aW9uIGkodCl7cmV0dXJuIGVtIGluIHR9KShuKT9vLnVzZVZhbHVlPW4udXNlVmFsdWU6b20obik/by51c2VGYWN0b3J5PW4udXNlRmFjdG9yeTooZnVuY3Rpb24gYSh0KXtyZXR1cm4gdm9pZCAwIT09dC51c2VFeGlzdGluZ30pKG4pJiYoby51c2VFeGlzdGluZz1uLnVzZUV4aXN0aW5nKSxvfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8pKHQsZSkpfXJldHVybiBufX0pLHQuaGFzT3duUHJvcGVydHkoSm4pfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxKbix7Z2V0OigpPT57aWYobnVsbD09PW8pe2NvbnN0IGU9SmEoe3VzYWdlOjAsa2luZDoiaW5qZWN0YWJsZSIsdHlwZTp0fSk7bz1lLmNvbXBpbGVGYWN0b3J5KHRtLGBuZzovLy8ke3QubmFtZX0vybVmYWMuanNgLHtuYW1lOnQubmFtZSx0eXBlOnQsdHlwZUFyZ3VtZW50Q291bnQ6MCxkZXBzOk5yKHQpLHRhcmdldDplLkZhY3RvcnlUYXJnZXQuSW5qZWN0YWJsZX0pfXJldHVybiBvfSxjb25maWd1cmFibGU6ITB9KX07ZnVuY3Rpb24gc20odCl7cmV0dXJuIHQubGVuZ3RoPjE/IiAoIisoCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBlKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDsrK24pe2lmKGUuaW5kZXhPZih0W25dKT4tMSlyZXR1cm4gZS5wdXNoKHRbbl0pLGU7ZS5wdXNoKHRbbl0pfXJldHVybiBlfSkodC5zbGljZSgpLnJldmVyc2UoKSkubWFwKCh0PT5HZSh0LnRva2VuKSkpLmpvaW4oIiAtPiAiKSsiKSI6IiJ9ZnVuY3Rpb24gbG0odCxlLG4sbyl7Y29uc3QgaT1bZV0sYT1uKGkpLHI9bz8oZnVuY3Rpb24gcyh0LGUpe2NvbnN0IG49YCR7dH0gY2F1c2VkIGJ5OiAke2UgaW5zdGFuY2VvZiBFcnJvcj9lLm1lc3NhZ2U6ZX1gLG89RXJyb3Iobik7cmV0dXJuIG8ubmdPcmlnaW5hbEVycm9yPWUsb30pKGEsbyk6RXJyb3IoYSk7cmV0dXJuIHIuYWRkS2V5PWNtLHIua2V5cz1pLHIuaW5qZWN0b3JzPVt0XSxyLmNvbnN0cnVjdFJlc29sdmluZ01lc3NhZ2U9bixyLm5nT3JpZ2luYWxFcnJvcj1vLHJ9ZnVuY3Rpb24gY20odCxlKXt0aGlzLmluamVjdG9ycy5wdXNoKHQpLHRoaXMua2V5cy5wdXNoKGUpLHRoaXMubWVzc2FnZT10aGlzLmNvbnN0cnVjdFJlc29sdmluZ01lc3NhZ2UodGhpcy5rZXlzKX1mdW5jdGlvbiBkbSh0LGUpe2NvbnN0IG49W107Zm9yKGxldCB0PTAsbz1lLmxlbmd0aDt0PG87dCsrKXtjb25zdCBvPWVbdF07bi5wdXNoKG8mJjAhPW8ubGVuZ3RoP28ubWFwKEdlKS5qb2luKCIgIik6Ij8iKX1yZXR1cm4gRXJyb3IoIkNhbm5vdCByZXNvbHZlIGFsbCBwYXJhbWV0ZXJzIGZvciAnIitHZSh0KSsiJygiK24uam9pbigiLCAiKSsiKS4gTWFrZSBzdXJlIHRoYXQgYWxsIHRoZSBwYXJhbWV0ZXJzIGFyZSBkZWNvcmF0ZWQgd2l0aCBJbmplY3Qgb3IgaGF2ZSB2YWxpZCB0eXBlIGFubm90YXRpb25zIGFuZCB0aGF0ICciK0dlKHQpKyInIGlzIGRlY29yYXRlZCB3aXRoIEluamVjdGFibGUuIil9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBwbXtjb25zdHJ1Y3Rvcih0LGUpe2lmKHRoaXMudG9rZW49dCx0aGlzLmlkPWUsIXQpdGhyb3cgbmV3IEVycm9yKCJUb2tlbiBtdXN0IGJlIGRlZmluZWQhIik7dGhpcy5kaXNwbGF5TmFtZT1HZSh0aGlzLnRva2VuKX1zdGF0aWMgZ2V0KHQpe3JldHVybiBtbS5nZXQoWmUodCkpfXN0YXRpYyBnZXQgbnVtYmVyT2ZLZXlzKCl7cmV0dXJuIG1tLm51bWJlck9mS2V5c319Y29uc3QgbW09bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5fYWxsS2V5cz1uZXcgTWFwfWdldCh0KXtpZih0IGluc3RhbmNlb2YgcG0pcmV0dXJuIHQ7aWYodGhpcy5fYWxsS2V5cy5oYXModCkpcmV0dXJuIHRoaXMuX2FsbEtleXMuZ2V0KHQpO2NvbnN0IGU9bmV3IHBtKHQscG0ubnVtYmVyT2ZLZXlzKTtyZXR1cm4gdGhpcy5fYWxsS2V5cy5zZXQodCxlKSxlfWdldCBudW1iZXJPZktleXMoKXtyZXR1cm4gdGhpcy5fYWxsS2V5cy5zaXplfX0sdW09bmV3Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXM9dH11cGRhdGVDYXBhYmlsaXRpZXModCl7dGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzPXR9ZmFjdG9yeSh0KXtyZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmZhY3RvcnkodCl9cGFyYW1ldGVycyh0KXtyZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnBhcmFtZXRlcnModCl9YW5ub3RhdGlvbnModCl7cmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5hbm5vdGF0aW9ucyh0KX1wcm9wTWV0YWRhdGEodCl7cmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5wcm9wTWV0YWRhdGEodCl9aGFzTGlmZWN5Y2xlSG9vayh0LGUpe3JldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMuaGFzTGlmZWN5Y2xlSG9vayh0LGUpfWdldHRlcih0KXtyZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmdldHRlcih0KX1zZXR0ZXIodCl7cmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5zZXR0ZXIodCl9bWV0aG9kKHQpe3JldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMubWV0aG9kKHQpfWltcG9ydFVyaSh0KXtyZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmltcG9ydFVyaSh0KX1yZXNvdXJjZVVyaSh0KXtyZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnJlc291cmNlVXJpKHQpfXJlc29sdmVJZGVudGlmaWVyKHQsZSxuLG8pe3JldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucmVzb2x2ZUlkZW50aWZpZXIodCxlLG4sbyl9cmVzb2x2ZUVudW0odCxlKXtyZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnJlc29sdmVFbnVtKHQsZSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8obmV3IG1yKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIGZte2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLmtleT10LHRoaXMub3B0aW9uYWw9ZSx0aGlzLnZpc2liaWxpdHk9bn1zdGF0aWMgZnJvbUtleSh0KXtyZXR1cm4gbmV3IGZtKHQsITEsbnVsbCl9fWNvbnN0IGdtPVtdO2NsYXNzIGhte2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLmtleT10LHRoaXMucmVzb2x2ZWRGYWN0b3JpZXM9ZSx0aGlzLm11bHRpUHJvdmlkZXI9bix0aGlzLnJlc29sdmVkRmFjdG9yeT10aGlzLnJlc29sdmVkRmFjdG9yaWVzWzBdfX1jbGFzcyBibXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuZmFjdG9yeT10LHRoaXMuZGVwZW5kZW5jaWVzPWV9fWZ1bmN0aW9uIHltKHQpe2xldCBlLG47aWYodC51c2VDbGFzcyl7Y29uc3Qgbz1aZSh0LnVzZUNsYXNzKTtlPXVtLmZhY3Rvcnkobyksbj12bShvKX1lbHNlIHQudXNlRXhpc3Rpbmc/KGU9dD0+dCxuPVtmbS5mcm9tS2V5KHBtLmdldCh0LnVzZUV4aXN0aW5nKSldKTp0LnVzZUZhY3Rvcnk/KGU9dC51c2VGYWN0b3J5LG49KGZ1bmN0aW9uIG8odCxlKXtpZihlKXtjb25zdCBuPWUubWFwKCh0PT5bdF0pKTtyZXR1cm4gZS5tYXAoKGU9PnhtKHQsZSxuKSkpfXJldHVybiB2bSh0KX0pKHQudXNlRmFjdG9yeSx0LmRlcHMpKTooZT0oKT0+dC51c2VWYWx1ZSxuPWdtKTtyZXR1cm4gbmV3IGJtKGUsbil9ZnVuY3Rpb24gX20odCl7cmV0dXJuIG5ldyBobShwbS5nZXQodC5wcm92aWRlKSxbeW0odCldLHQubXVsdGl8fCExKX1mdW5jdGlvbiBDbSh0KXtjb25zdCBlPShmdW5jdGlvbiBuKHQsZSl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IG89dFtuXSxpPWUuZ2V0KG8ua2V5LmlkKTtpZihpKXtpZihvLm11bHRpUHJvdmlkZXIhPT1pLm11bHRpUHJvdmlkZXIpdGhyb3cgRXJyb3IoYENhbm5vdCBtaXggbXVsdGkgcHJvdmlkZXJzIGFuZCByZWd1bGFyIHByb3ZpZGVycywgZ290OiAke2l9ICR7b31gKTtpZihvLm11bHRpUHJvdmlkZXIpZm9yKGxldCB0PTA7dDxvLnJlc29sdmVkRmFjdG9yaWVzLmxlbmd0aDt0KyspaS5yZXNvbHZlZEZhY3Rvcmllcy5wdXNoKG8ucmVzb2x2ZWRGYWN0b3JpZXNbdF0pO2Vsc2UgZS5zZXQoby5rZXkuaWQsbyl9ZWxzZXtsZXQgdDt0PW8ubXVsdGlQcm92aWRlcj9uZXcgaG0oby5rZXksby5yZXNvbHZlZEZhY3Rvcmllcy5zbGljZSgpLG8ubXVsdGlQcm92aWRlcik6byxlLnNldChvLmtleS5pZCx0KX19cmV0dXJuIGV9KShNbSh0LFtdKS5tYXAoX20pLG5ldyBNYXApO3JldHVybiBBcnJheS5mcm9tKGUudmFsdWVzKCkpfWZ1bmN0aW9uIE1tKHQsZSl7cmV0dXJuIHQuZm9yRWFjaCgodD0+e2lmKHQgaW5zdGFuY2VvZiBRYSllLnB1c2goe3Byb3ZpZGU6dCx1c2VDbGFzczp0fSk7ZWxzZSBpZih0JiYib2JqZWN0Ij09dHlwZW9mIHQmJnZvaWQgMCE9PXQucHJvdmlkZSllLnB1c2godCk7ZWxzZXtpZighQXJyYXkuaXNBcnJheSh0KSl0aHJvdyhmdW5jdGlvbiBuKHQpe3JldHVybiBFcnJvcihgSW52YWxpZCBwcm92aWRlciAtIG9ubHkgaW5zdGFuY2VzIG9mIFByb3ZpZGVyIGFuZCBUeXBlIGFyZSBhbGxvd2VkLCBnb3Q6ICR7dH1gKX0pKHQpO01tKHQsZSl9fSkpLGV9ZnVuY3Rpb24gdm0odCl7Y29uc3QgZT11bS5wYXJhbWV0ZXJzKHQpO2lmKCFlKXJldHVybltdO2lmKGUuc29tZSgodD0+bnVsbD09dCkpKXRocm93IGRtKHQsZSk7cmV0dXJuIGUubWFwKChuPT54bSh0LG4sZSkpKX1mdW5jdGlvbiB4bSh0LGUsbil7bGV0IG89bnVsbCxpPSExO2lmKCFBcnJheS5pc0FycmF5KGUpKXJldHVybiBPbShlIGluc3RhbmNlb2Yga3I/ZS50b2tlbjplLGksbnVsbCk7bGV0IGE9bnVsbDtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoOysrdCl7Y29uc3Qgbj1lW3RdO24gaW5zdGFuY2VvZiBRYT9vPW46biBpbnN0YW5jZW9mIGtyP289bi50b2tlbjpuIGluc3RhbmNlb2YgU3I/aT0hMDpuIGluc3RhbmNlb2YgRHJ8fG4gaW5zdGFuY2VvZiBFcj9hPW46biBpbnN0YW5jZW9mIEdhJiYobz1uKX1pZihvPVplKG8pLG51bGwhPW8pcmV0dXJuIE9tKG8saSxhKTt0aHJvdyBkbSh0LG4pfWZ1bmN0aW9uIE9tKHQsZSxuKXtyZXR1cm4gbmV3IGZtKHBtLmdldCh0KSxlLG4pfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCBQbT17fTtjbGFzcyB3bXtzdGF0aWMgcmVzb2x2ZSh0KXtyZXR1cm4gQ20odCl9c3RhdGljIHJlc29sdmVBbmRDcmVhdGUodCxlKXtjb25zdCBuPXdtLnJlc29sdmUodCk7cmV0dXJuIHdtLmZyb21SZXNvbHZlZFByb3ZpZGVycyhuLGUpfXN0YXRpYyBmcm9tUmVzb2x2ZWRQcm92aWRlcnModCxlKXtyZXR1cm4gbmV3IGttKHQsZSl9fWNsYXNzIGtte2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fY29uc3RydWN0aW9uQ291bnRlcj0wLHRoaXMuX3Byb3ZpZGVycz10LHRoaXMucGFyZW50PWV8fG51bGw7Y29uc3Qgbj10Lmxlbmd0aDt0aGlzLmtleUlkcz1bXSx0aGlzLm9ianM9W107Zm9yKGxldCBlPTA7ZTxuO2UrKyl0aGlzLmtleUlkc1tlXT10W2VdLmtleS5pZCx0aGlzLm9ianNbZV09UG19Z2V0KHQsZT1ncil7cmV0dXJuIHRoaXMuX2dldEJ5S2V5KHBtLmdldCh0KSxudWxsLGUpfXJlc29sdmVBbmRDcmVhdGVDaGlsZCh0KXtjb25zdCBlPXdtLnJlc29sdmUodCk7cmV0dXJuIHRoaXMuY3JlYXRlQ2hpbGRGcm9tUmVzb2x2ZWQoZSl9Y3JlYXRlQ2hpbGRGcm9tUmVzb2x2ZWQodCl7Y29uc3QgZT1uZXcga20odCk7cmV0dXJuIGUucGFyZW50PXRoaXMsZX1yZXNvbHZlQW5kSW5zdGFudGlhdGUodCl7cmV0dXJuIHRoaXMuaW5zdGFudGlhdGVSZXNvbHZlZCh3bS5yZXNvbHZlKFt0XSlbMF0pfWluc3RhbnRpYXRlUmVzb2x2ZWQodCl7cmV0dXJuIHRoaXMuX2luc3RhbnRpYXRlUHJvdmlkZXIodCl9Z2V0UHJvdmlkZXJBdEluZGV4KHQpe2lmKHQ8MHx8dD49dGhpcy5fcHJvdmlkZXJzLmxlbmd0aCl0aHJvdyhmdW5jdGlvbiBlKHQpe3JldHVybiBFcnJvcihgSW5kZXggJHt0fSBpcyBvdXQtb2YtYm91bmRzLmApfSkodCk7cmV0dXJuIHRoaXMuX3Byb3ZpZGVyc1t0XX1fbmV3KHQpe2lmKHRoaXMuX2NvbnN0cnVjdGlvbkNvdW50ZXIrKz50aGlzLl9nZXRNYXhOdW1iZXJPZk9iamVjdHMoKSl0aHJvdyhmdW5jdGlvbiBlKHQsbil7cmV0dXJuIGxtKHQsbiwoZnVuY3Rpb24odCl7cmV0dXJuYENhbm5vdCBpbnN0YW50aWF0ZSBjeWNsaWMgZGVwZW5kZW5jeSEke3NtKHQpfWB9KSl9KSh0aGlzLHQua2V5KTtyZXR1cm4gdGhpcy5faW5zdGFudGlhdGVQcm92aWRlcih0KX1fZ2V0TWF4TnVtYmVyT2ZPYmplY3RzKCl7cmV0dXJuIHRoaXMub2Jqcy5sZW5ndGh9X2luc3RhbnRpYXRlUHJvdmlkZXIodCl7aWYodC5tdWx0aVByb3ZpZGVyKXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248dC5yZXNvbHZlZEZhY3Rvcmllcy5sZW5ndGg7KytuKWVbbl09dGhpcy5faW5zdGFudGlhdGUodCx0LnJlc29sdmVkRmFjdG9yaWVzW25dKTtyZXR1cm4gZX1yZXR1cm4gdGhpcy5faW5zdGFudGlhdGUodCx0LnJlc29sdmVkRmFjdG9yaWVzWzBdKX1faW5zdGFudGlhdGUodCxlKXtjb25zdCBuPWUuZmFjdG9yeTtsZXQgbyxpO3RyeXtvPWUuZGVwZW5kZW5jaWVzLm1hcCgodD0+dGhpcy5fZ2V0QnlSZWZsZWN0aXZlRGVwZW5kZW5jeSh0KSkpfWNhdGNoKGUpe3Rocm93IGUuYWRkS2V5JiZlLmFkZEtleSh0aGlzLHQua2V5KSxlfXRyeXtpPW4oLi4ubyl9Y2F0Y2goZSl7dGhyb3coZnVuY3Rpb24gbih0LGUsbyxpKXtyZXR1cm4gbG0odCxpLChmdW5jdGlvbih0KXtjb25zdCBuPUdlKHRbMF0udG9rZW4pO3JldHVybmAke2UubWVzc2FnZX06IEVycm9yIGR1cmluZyBpbnN0YW50aWF0aW9uIG9mICR7bn0hJHtzbSh0KX0uYH0pLGUpfSkodGhpcyxlLDAsdC5rZXkpfXJldHVybiBpfV9nZXRCeVJlZmxlY3RpdmVEZXBlbmRlbmN5KHQpe3JldHVybiB0aGlzLl9nZXRCeUtleSh0LmtleSx0LnZpc2liaWxpdHksdC5vcHRpb25hbD9udWxsOmdyKX1fZ2V0QnlLZXkodCxlLG4pe3JldHVybiB0PT09a20uSU5KRUNUT1JfS0VZP3RoaXM6ZSBpbnN0YW5jZW9mIERyP3RoaXMuX2dldEJ5S2V5U2VsZih0LG4pOnRoaXMuX2dldEJ5S2V5RGVmYXVsdCh0LG4sZSl9X2dldE9iakJ5S2V5SWQodCl7Zm9yKGxldCBlPTA7ZTx0aGlzLmtleUlkcy5sZW5ndGg7ZSsrKWlmKHRoaXMua2V5SWRzW2VdPT09dClyZXR1cm4gdGhpcy5vYmpzW2VdPT09UG0mJih0aGlzLm9ianNbZV09dGhpcy5fbmV3KHRoaXMuX3Byb3ZpZGVyc1tlXSkpLHRoaXMub2Jqc1tlXTtyZXR1cm4gUG19X3Rocm93T3JOdWxsKHQsZSl7aWYoZSE9PWdyKXJldHVybiBlO3Rocm93KGZ1bmN0aW9uIG4odCxlKXtyZXR1cm4gbG0odCxlLChmdW5jdGlvbih0KXtyZXR1cm5gTm8gcHJvdmlkZXIgZm9yICR7R2UodFswXS50b2tlbil9ISR7c20odCl9YH0pKX0pKHRoaXMsdCl9X2dldEJ5S2V5U2VsZih0LGUpe2NvbnN0IG49dGhpcy5fZ2V0T2JqQnlLZXlJZCh0LmlkKTtyZXR1cm4gbiE9PVBtP246dGhpcy5fdGhyb3dPck51bGwodCxlKX1fZ2V0QnlLZXlEZWZhdWx0KHQsZSxuKXtsZXQgbztmb3Iobz1uIGluc3RhbmNlb2YgRXI/dGhpcy5wYXJlbnQ6dGhpcztvIGluc3RhbmNlb2Yga207KXtjb25zdCBlPW8sbj1lLl9nZXRPYmpCeUtleUlkKHQuaWQpO2lmKG4hPT1QbSlyZXR1cm4gbjtvPWUucGFyZW50fXJldHVybiBudWxsIT09bz9vLmdldCh0LnRva2VuLGUpOnRoaXMuX3Rocm93T3JOdWxsKHQsZSl9Z2V0IGRpc3BsYXlOYW1lKCl7cmV0dXJuYFJlZmxlY3RpdmVJbmplY3Rvcihwcm92aWRlcnM6IFskeyhmdW5jdGlvbiB0KGUsbil7Y29uc3Qgbz1bXTtmb3IobGV0IHQ9MDt0PGUuX3Byb3ZpZGVycy5sZW5ndGg7Kyt0KW9bdF09bihlLmdldFByb3ZpZGVyQXRJbmRleCh0KSk7cmV0dXJuIG99Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKSh0aGlzLCh0PT4nICInK3Qua2V5LmRpc3BsYXlOYW1lKyciICcpKS5qb2luKCIsICIpfV0pYH10b1N0cmluZygpe3JldHVybiB0aGlzLmRpc3BsYXlOYW1lfX1mdW5jdGlvbiBTbSh0LGU9RW4uRGVmYXVsdCl7Y29uc3Qgbj1maSgpO3JldHVybiBudWxsPT09bj8obmdEZXZNb2RlJiYoZnVuY3Rpb24gbyh0KXtuZ0Rldk1vZGUmJmNuKFJuLHQsIkNhbGxpbmcgybXJtWluamVjdCB3b3VsZCBjYXVzZSBpbmZpbml0ZSByZWN1cnNpb24iKX0pKFNtKSx2cih0LGUpKTp4YShiaSgpLG4sWmUodCksZSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBEbSh0LGUsbil7Y29uc3Qgbz1maSgpLGk9U2koKTtpZihGcChvLGksZSkpe2NvbnN0IGE9Z2koKSxyPVlpKCk7bGQoYSxyLG8sdCxlLG9bMTFdLG4sITEpLG5nRGV2TW9kZSYmemQoYS5kYXRhLHIsdCxpKX1yZXR1cm4gRG19ZnVuY3Rpb24gRW0odCxlLG4sbyxpKXtjb25zdCBhPWk/ImNsYXNzIjoic3R5bGUiO1ZkKHQsbixlLmlucHV0c1thXSxhLG8pfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBSbSh0LGUsbixvKXtjb25zdCBpPWZpKCksYT1naSgpLHI9Z28rdDtuZ0Rldk1vZGUmJmxuKHdpKCksYS5iaW5kaW5nU3RhcnRJbmRleCwiZWxlbWVudHMgc2hvdWxkIGJlIGNyZWF0ZWQgYmVmb3JlIGFueSBiaW5kaW5ncyIpLG5nRGV2TW9kZSYmX24oaSxyKTtjb25zdCBzPWlbMTFdLGw9aVtyXT1NbChzLGUsKGZ1bmN0aW9uIGMoKXtyZXR1cm4gbWkubEZyYW1lLmN1cnJlbnROYW1lc3BhY2V9KSgpKSxkPWEuZmlyc3RDcmVhdGVQYXNzPyhmdW5jdGlvbiBwKHQsZSxuLG8saSxhLHIpe25nRGV2TW9kZSYmQW8oZSksbmdEZXZNb2RlJiZuZ0Rldk1vZGUuZmlyc3RDcmVhdGVQYXNzKys7Y29uc3Qgcz1lLmNvbnN0cyxsPVpjKGUsdCwyLGksY2kocyxhKSksYz1tZChlLG4sbCxjaShzLHIpKTtyZXR1cm4gbmdEZXZNb2RlJiYoZnVuY3Rpb24gZCh0LGUsbixvKXtpZihudWxsPT09dC5zY2hlbWFzKXJldHVybjtjb25zdCBpPW4udmFsdWU7aWYoIW8mJm51bGwhPT1pJiYoInVuZGVmaW5lZCIhPXR5cGVvZiBIVE1MVW5rbm93bkVsZW1lbnQmJkhUTUxVbmtub3duRWxlbWVudCYmZSBpbnN0YW5jZW9mIEhUTUxVbmtub3duRWxlbWVudHx8InVuZGVmaW5lZCIhPXR5cGVvZiBjdXN0b21FbGVtZW50cyYmaS5pbmRleE9mKCItIik+LTEmJiFjdXN0b21FbGVtZW50cy5nZXQoaSkpJiYhZGQodCxpKSl7bGV0IHQ9YCcke2l9JyBpcyBub3QgYSBrbm93biBlbGVtZW50OlxuYDt0Kz1gMS4gSWYgJyR7aX0nIGlzIGFuIEFuZ3VsYXIgY29tcG9uZW50LCB0aGVuIHZlcmlmeSB0aGF0IGl0IGlzIHBhcnQgb2YgdGhpcyBtb2R1bGUuXG5gLGkmJmkuaW5kZXhPZigiLSIpPi0xP3QrPWAyLiBJZiAnJHtpfScgaXMgYSBXZWIgQ29tcG9uZW50IHRoZW4gYWRkICdDVVNUT01fRUxFTUVOVFNfU0NIRU1BJyB0byB0aGUgJ0BOZ01vZHVsZS5zY2hlbWFzJyBvZiB0aGlzIGNvbXBvbmVudCB0byBzdXBwcmVzcyB0aGlzIG1lc3NhZ2UuYDp0Kz0iMi4gVG8gYWxsb3cgYW55IGVsZW1lbnQgYWRkICdOT19FUlJPUlNfU0NIRU1BJyB0byB0aGUgJ0BOZ01vZHVsZS5zY2hlbWFzJyBvZiB0aGlzIGNvbXBvbmVudC4iLGNvbnNvbGUuZXJyb3IoUWUoIjMwNCIsdCkpfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKShlLG8sbCxjKSxudWxsIT09bC5hdHRycyYmVWQobCxsLmF0dHJzLCExKSxudWxsIT09bC5tZXJnZWRBdHRycyYmVWQobCxsLm1lcmdlZEF0dHJzLCEwKSxudWxsIT09ZS5xdWVyaWVzJiZlLnF1ZXJpZXMuZWxlbWVudFN0YXJ0KGUsbCksbH0pKHIsYSxpLGwsZSxuLG8pOmEuZGF0YVtyXTtDaShkLCEwKTtjb25zdCBtPWQubWVyZ2VkQXR0cnM7bnVsbCE9PW0mJmFhKHMsbCxtKTtjb25zdCB1PWQuY2xhc3NlcztudWxsIT09dSYmWWwocyxsLHUpO2NvbnN0IGY9ZC5zdHlsZXM7bnVsbCE9PWYmJldsKHMsbCxmKSw2NCE9KDY0JmQuZmxhZ3MpJiZIbChhLGksbCxkKSwwPT09KGZ1bmN0aW9uIGcoKXtyZXR1cm4gbWkubEZyYW1lLmVsZW1lbnREZXB0aENvdW50fSkoKSYmTHMobCxpKSwoZnVuY3Rpb24gaCgpe21pLmxGcmFtZS5lbGVtZW50RGVwdGhDb3VudCsrfSkoKSx2byhkKSYmKG5kKGEsaSxkKSxlZChhLGQsaSkpLG51bGwhPT1vJiZvZChpLGQpfWZ1bmN0aW9uIEFtKCl7bGV0IHQ9YmkoKTtuZ0Rldk1vZGUmJmhuKHQsIk5vIHBhcmVudCBub2RlIHRvIGNsb3NlLiIpLE1pKCk/dmkoKToobmdEZXZNb2RlJiZTbyhiaSgpKSx0PXQucGFyZW50LENpKHQsITEpKTtjb25zdCBlPXQ7bmdEZXZNb2RlJiZpYShlLDMpLChmdW5jdGlvbiBuKCl7bWkubEZyYW1lLmVsZW1lbnREZXB0aENvdW50LS19KSgpO2NvbnN0IG89Z2koKTtvLmZpcnN0Q3JlYXRlUGFzcyYmKFhpKG8sdCksQ28odCkmJm8ucXVlcmllcy5lbGVtZW50RW5kKHQpKSxudWxsIT1lLmNsYXNzZXNXaXRob3V0SG9zdCYmKGZ1bmN0aW9uIGkodCl7cmV0dXJuIDAhPSgxNiZ0LmZsYWdzKX0pKGUpJiZFbShvLGUsZmkoKSxlLmNsYXNzZXNXaXRob3V0SG9zdCwhMCksbnVsbCE9ZS5zdHlsZXNXaXRob3V0SG9zdCYmKGZ1bmN0aW9uIGEodCl7cmV0dXJuIDAhPSgzMiZ0LmZsYWdzKX0pKGUpJiZFbShvLGUsZmkoKSxlLnN0eWxlc1dpdGhvdXRIb3N0LCExKX1mdW5jdGlvbiBUbSh0LGUsbixvKXtSbSh0LGUsbixvKSxBbSgpfWZ1bmN0aW9uIE5tKHQsZSxuKXtjb25zdCBvPWZpKCksaT1naSgpLGE9dCtnbztuZ0Rldk1vZGUmJl9uKG8sYSksbmdEZXZNb2RlJiZsbih3aSgpLGkuYmluZGluZ1N0YXJ0SW5kZXgsImVsZW1lbnQgY29udGFpbmVycyBzaG91bGQgYmUgY3JlYXRlZCBiZWZvcmUgYW55IGJpbmRpbmdzIik7Y29uc3Qgcj1pLmZpcnN0Q3JlYXRlUGFzcz8oZnVuY3Rpb24gcyh0LGUsbixvLGkpe25nRGV2TW9kZSYmbmdEZXZNb2RlLmZpcnN0Q3JlYXRlUGFzcysrO2NvbnN0IGE9ZS5jb25zdHMscj1jaShhLG8pLHM9WmMoZSx0LDgsIm5nLWNvbnRhaW5lciIscik7cmV0dXJuIG51bGwhPT1yJiZVZChzLHIsITApLG1kKGUsbixzLGNpKGEsaSkpLG51bGwhPT1lLnF1ZXJpZXMmJmUucXVlcmllcy5lbGVtZW50U3RhcnQoZSxzKSxzfSkoYSxpLG8sZSxuKTppLmRhdGFbYV07Q2kociwhMCksbmdEZXZNb2RlJiZuZ0Rldk1vZGUucmVuZGVyZXJDcmVhdGVDb21tZW50Kys7Y29uc3QgbD1vW2FdPW9bMTFdLmNyZWF0ZUNvbW1lbnQobmdEZXZNb2RlPyJuZy1jb250YWluZXIiOiIiKTtIbChpLG8sbCxyKSxMcyhsLG8pLHZvKHIpJiYobmQoaSxvLHIpLGVkKGkscixvKSksbnVsbCE9biYmb2QobyxyKX1mdW5jdGlvbiB6bSgpe2xldCB0PWJpKCk7Y29uc3QgZT1naSgpO01pKCk/dmkoKToobmdEZXZNb2RlJiZTbyh0KSx0PXQucGFyZW50LENpKHQsITEpKSxuZ0Rldk1vZGUmJmlhKHQsOCksZS5maXJzdENyZWF0ZVBhc3MmJihYaShlLHQpLENvKHQpJiZlLnF1ZXJpZXMuZWxlbWVudEVuZCh0KSl9ZnVuY3Rpb24gSW0odCxlLG4pe05tKHQsZSxuKSx6bSgpfWZ1bmN0aW9uIEhtKCl7cmV0dXJuIGZpKCl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIEZtKHQpe3JldHVybiEhdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQudGhlbn1mdW5jdGlvbiBMbSh0KXtyZXR1cm4hIXQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnN1YnNjcmliZX1rbS5JTkpFQ1RPUl9LRVk9cG0uZ2V0KHJwKTtjb25zdCBCbT1MbTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gVm0odCxlLG4sbyl7Y29uc3QgaT1maSgpLGE9Z2koKSxyPWJpKCk7cmV0dXJuIFVtKGEsaSxpWzExXSxyLHQsZSwhIW4sbyksVm19ZnVuY3Rpb24gam0odCxlKXtjb25zdCBuPWJpKCksbz1maSgpLGk9Z2koKTtyZXR1cm4gVW0oaSxvLExkKFRpKGkuZGF0YSksbixvKSxuLHQsZSwhMSksam19ZnVuY3Rpb24gVW0odCxlLG4sbyxpLGEscixzKXtjb25zdCBsPXZvKG8pLGM9dC5maXJzdENyZWF0ZVBhc3MmJkZkKHQpLGQ9ZVs4XSxwPUhkKGUpO25nRGV2TW9kZSYmaWEobywxNSk7bGV0IG09ITA7aWYoMyZvLnR5cGV8fHMpe2NvbnN0IHU9b2kobyxlKSxmPXM/cyh1KTp1LGc9cC5sZW5ndGgsaD1zP3Q9PnMoZWkodFtvLmluZGV4XSkpOm8uaW5kZXg7aWYoJG8obikpe2xldCByPW51bGw7aWYoIXMmJmwmJihyPShmdW5jdGlvbiB1KHQsZSxuLG8pe2NvbnN0IGk9dC5jbGVhbnVwO2lmKG51bGwhPWkpZm9yKGxldCB0PTA7dDxpLmxlbmd0aC0xO3QrPTIpe2NvbnN0IGE9aVt0XTtpZihhPT09biYmaVt0KzFdPT09byl7Y29uc3Qgbj1lWzddLG89aVt0KzJdO3JldHVybiBuLmxlbmd0aD5vP25bb106bnVsbH0ic3RyaW5nIj09dHlwZW9mIGEmJih0Kz0yKX1yZXR1cm4gbnVsbH0pKHQsZSxpLG8uaW5kZXgpKSxudWxsIT09cikoci5fX25nTGFzdExpc3RlbmVyRm5fX3x8cikuX19uZ05leHRMaXN0ZW5lckZuX189YSxyLl9fbmdMYXN0TGlzdGVuZXJGbl9fPWEsbT0hMTtlbHNle2E9V20obyxlLGQsYSwhMSk7Y29uc3QgdD1uLmxpc3RlbihmLGksYSk7bmdEZXZNb2RlJiZuZ0Rldk1vZGUucmVuZGVyZXJBZGRFdmVudExpc3RlbmVyKysscC5wdXNoKGEsdCksYyYmYy5wdXNoKGksaCxnLGcrMSl9fWVsc2UgYT1XbShvLGUsZCxhLCEwKSxmLmFkZEV2ZW50TGlzdGVuZXIoaSxhLHIpLG5nRGV2TW9kZSYmbmdEZXZNb2RlLnJlbmRlcmVyQWRkRXZlbnRMaXN0ZW5lcisrLHAucHVzaChhKSxjJiZjLnB1c2goaSxoLGcscil9ZWxzZSBhPVdtKG8sZSxkLGEsITEpO2NvbnN0IGY9by5vdXRwdXRzO2xldCBnO2lmKG0mJm51bGwhPT1mJiYoZz1mW2ldKSl7Y29uc3QgdD1nLmxlbmd0aDtpZih0KWZvcihsZXQgbj0wO248dDtuKz0yKXtjb25zdCB0PWdbbl07bmdEZXZNb2RlJiZfbihlLHQpO2NvbnN0IHI9Z1tuKzFdLHM9ZVt0XSxsPXNbcl07aWYobmdEZXZNb2RlJiYhQm0obCkpdGhyb3cgbmV3IEVycm9yKGBAT3V0cHV0ICR7cn0gbm90IGluaXRpYWxpemVkIGluICcke3MuY29uc3RydWN0b3IubmFtZX0nLmApO2NvbnN0IGQ9bC5zdWJzY3JpYmUoYSksbT1wLmxlbmd0aDtwLnB1c2goYSxkKSxjJiZjLnB1c2goaSxvLmluZGV4LG0sLShtKzEpKX19fWZ1bmN0aW9uIEdtKHQsZSxuLG8pe3RyeXtyZXR1cm4gcW8oNixlLG4pLCExIT09bihvKX1jYXRjaChlKXtyZXR1cm4gQmQodCxlKSwhMX1maW5hbGx5e3FvKDcsZSxuKX19ZnVuY3Rpb24gV20odCxlLG4sbyxpKXtyZXR1cm4gZnVuY3Rpb24gYShyKXtpZihyPT09RnVuY3Rpb24pcmV0dXJuIG87Y29uc3Qgcz0yJnQuZmxhZ3M/cmkodC5pbmRleCxlKTplOzA9PSgzMiZlWzJdKSYmRWQocyk7bGV0IGw9R20oZSxuLG8sciksYz1hLl9fbmdOZXh0TGlzdGVuZXJGbl9fO2Zvcig7YzspbD1HbShlLG4sYyxyKSYmbCxjPWMuX19uZ05leHRMaXN0ZW5lckZuX187cmV0dXJuIGkmJiExPT09bCYmKHIucHJldmVudERlZmF1bHQoKSxyLnJldHVyblZhbHVlPSExKSxsfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIFltKHQ9MSl7cmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJuKG1pLmxGcmFtZS5jb250ZXh0TFZpZXc9KGZ1bmN0aW9uIGUodCxuKXtmb3IoO3Q+MDspbmdEZXZNb2RlJiZobihuWzE1XSwiRGVjbGFyYXRpb24gdmlldyBzaG91bGQgYmUgZGVmaW5lZCBpZiBuZXN0aW5nIGxldmVsIGlzIGdyZWF0ZXIgdGhhbiAwLiIpLG49blsxNV0sdC0tO3JldHVybiBufSkodCxtaS5sRnJhbWUuY29udGV4dExWaWV3KSlbOF19KSh0KX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gcW0odCxlKXtsZXQgbj1udWxsO2NvbnN0IG89KGZ1bmN0aW9uIGkodCl7Y29uc3QgZT10LmF0dHJzO2lmKG51bGwhPWUpe2NvbnN0IHQ9ZS5pbmRleE9mKDUpO2lmKDA9PSgxJnQpKXJldHVybiBlW3QrMV19cmV0dXJuIG51bGx9KSh0KTtmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKyl7Y29uc3QgYT1lW2ldO2lmKCIqIiE9PWEpe2lmKG51bGw9PT1vP2VjKHQsYSwhMCk6bmMobyxhKSlyZXR1cm4gaX1lbHNlIG49aX1yZXR1cm4gbn1mdW5jdGlvbiBabSh0KXtjb25zdCBlPWZpKClbMTZdWzZdO2lmKCFlLnByb2plY3Rpb24pe2NvbnN0IG49ZS5wcm9qZWN0aW9uPWlyKHQ/dC5sZW5ndGg6MSxudWxsKSxvPW4uc2xpY2UoKTtsZXQgaT1lLmNoaWxkO2Zvcig7bnVsbCE9PWk7KXtjb25zdCBlPXQ/cW0oaSx0KTowO251bGwhPT1lJiYob1tlXT9vW2VdLnByb2plY3Rpb25OZXh0PWk6bltlXT1pLG9bZV09aSksaT1pLm5leHR9fX1mdW5jdGlvbiBYbSh0LGU9MCxuKXtjb25zdCBvPWZpKCksaT1naSgpLGE9WmMoaSxnbyt0LDE2LG51bGwsbnx8bnVsbCk7bnVsbD09PWEucHJvamVjdGlvbiYmKGEucHJvamVjdGlvbj1lKSx2aSgpLDY0IT0oNjQmYS5mbGFncykmJihmdW5jdGlvbiByKHQsZSxuKXtHbChlWzExXSwwLGUsbix3bCh0LG4sZSksQWwobi5wYXJlbnR8fGVbNl0sbixlKSl9KShpLG8sYSl9ZnVuY3Rpb24gS20odCxlLG4pe3JldHVybiBKbSh0LCIiLGUsIiIsbiksS219ZnVuY3Rpb24gSm0odCxlLG4sbyxpKXtjb25zdCBhPWZpKCkscj1HcChhLGUsbixvKTtpZihyIT09YWMpe2NvbnN0IG49Z2koKSxzPVlpKCk7bGQobixzLGEsdCxyLGFbMTFdLGksITEpLG5nRGV2TW9kZSYmemQobi5kYXRhLHMsdCx3aSgpLTEsZSxvKX1yZXR1cm4gSm19ZnVuY3Rpb24gUW0odCxlLG4sbyxpKXtjb25zdCBhPXRbbisxXSxyPW51bGw9PT1lO2xldCBzPW8/Y2MoYSk6bWMoYSksbD0hMTtmb3IoOzAhPT1zJiYoITE9PT1sfHxyKTspe25nRGV2TW9kZSYmX24odCxzKTtjb25zdCBuPXRbcysxXTskbSh0W3NdLGUpJiYobD0hMCx0W3MrMV09bz9nYyhuKTpwYyhuKSkscz1vP2NjKG4pOm1jKG4pfWwmJih0W24rMV09bz9wYyhhKTpnYyhhKSl9ZnVuY3Rpb24gJG0odCxlKXtyZXR1cm4gbmdEZXZNb2RlJiZjbihBcnJheS5pc0FycmF5KGUpLCEwLCJFeHBlY3RlZCB0aGF0ICd0U3R5bGluZ0tleScgaGFzIGJlZW4gdW53cmFwcGVkIiksbnVsbD09PXR8fG51bGw9PWV8fChBcnJheS5pc0FycmF5KHQpP3RbMV06dCk9PT1lfHwhKCFBcnJheS5pc0FycmF5KHQpfHwic3RyaW5nIiE9dHlwZW9mIGUpJiZzcih0LGUpPj0wfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCB0dT17dGV4dEVuZDowLGtleTowLGtleUVuZDowLHZhbHVlOjAsdmFsdWVFbmQ6MH07ZnVuY3Rpb24gZXUodCl7cmV0dXJuIHQuc3Vic3RyaW5nKHR1LmtleSx0dS5rZXlFbmQpfWZ1bmN0aW9uIG51KHQpe3JldHVybiB0LnN1YnN0cmluZyh0dS52YWx1ZSx0dS52YWx1ZUVuZCl9ZnVuY3Rpb24gb3UodCxlKXtjb25zdCBuPXR1LnRleHRFbmQ7cmV0dXJuIG49PT1lPy0xOihlPXR1LmtleUVuZD0oZnVuY3Rpb24gbyh0LGUsbil7Zm9yKDtlPG4mJnQuY2hhckNvZGVBdChlKT4zMjspZSsrO3JldHVybiBlfSkodCx0dS5rZXk9ZSxuKSxydSh0LGUsbikpfWZ1bmN0aW9uIGl1KHQsZSl7Y29uc3Qgbj10dS50ZXh0RW5kO2xldCBvPXR1LmtleT1ydSh0LGUsbik7cmV0dXJuIG49PT1vPy0xOihvPXR1LmtleUVuZD0oZnVuY3Rpb24gaSh0LGUsbil7bGV0IG87Zm9yKDtlPG4mJig0NT09PShvPXQuY2hhckNvZGVBdChlKSl8fDk1PT09b3x8KC0zMyZvKT49NjUmJigtMzMmbyk8PTkwfHxvPj00OCYmbzw9NTcpOyllKys7cmV0dXJuIGV9KSh0LG8sbiksbz1zdSh0LG8sbiw1OCksbz10dS52YWx1ZT1ydSh0LG8sbiksbz10dS52YWx1ZUVuZD0oZnVuY3Rpb24gYSh0LGUsbil7bGV0IG89LTEsaT0tMSxhPS0xLHI9ZSxzPXI7Zm9yKDtyPG47KXtjb25zdCBsPXQuY2hhckNvZGVBdChyKyspO2lmKDU5PT09bClyZXR1cm4gczszND09PWx8fDM5PT09bD9zPXI9bHUodCxsLHIsbik6ZT09PXItNCYmODU9PT1hJiY4Mj09PWkmJjc2PT09byYmNDA9PT1sP3M9cj1sdSh0LDQxLHIsbik6bD4zMiYmKHM9ciksYT1pLGk9byxvPS0zMyZsfXJldHVybiBzfSkodCxvLG4pLHN1KHQsbyxuLDU5KSl9ZnVuY3Rpb24gYXUodCl7dHUua2V5PTAsdHUua2V5RW5kPTAsdHUudmFsdWU9MCx0dS52YWx1ZUVuZD0wLHR1LnRleHRFbmQ9dC5sZW5ndGh9ZnVuY3Rpb24gcnUodCxlLG4pe2Zvcig7ZTxuJiZ0LmNoYXJDb2RlQXQoZSk8PTMyOyllKys7cmV0dXJuIGV9ZnVuY3Rpb24gc3UodCxlLG4sbyl7cmV0dXJuKGU9cnUodCxlLG4pKTxuJiYobmdEZXZNb2RlJiZ0LmNoYXJDb2RlQXQoZSkhPT1vJiZjdSh0LFN0cmluZy5mcm9tQ2hhckNvZGUobyksZSksZSsrKSxlfWZ1bmN0aW9uIGx1KHQsZSxuLG8pe2xldCBpPS0xLGE9bjtmb3IoO2E8bzspe2NvbnN0IG49dC5jaGFyQ29kZUF0KGErKyk7aWYobj09ZSYmOTIhPT1pKXJldHVybiBhO2k9OTI9PW4mJjkyPT09aT8wOm59dGhyb3cgbmdEZXZNb2RlP2N1KHQsU3RyaW5nLmZyb21DaGFyQ29kZShlKSxvKTpuZXcgRXJyb3J9ZnVuY3Rpb24gY3UodCxlLG4pe3Rocm93IG5nRGV2TW9kZSYmbG4oInN0cmluZyI9PXR5cGVvZiB0LCEwLCJTdHJpbmcgZXhwZWN0ZWQgaGVyZSIpLGJuKGBNYWxmb3JtZWQgc3R5bGUgYXQgbG9jYXRpb24gJHtufSBpbiBzdHJpbmcgJ2ArdC5zdWJzdHJpbmcoMCxuKSsiWz4+Iit0LnN1YnN0cmluZyhuLG4rMSkrIjw8XSIrdC5zdWJzdHIobisxKStgJy4gRXhwZWN0aW5nICcke2V9Jy5gKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gZHUodCxlLG4pe3JldHVybiBodSh0LGUsbiwhMSksZHV9ZnVuY3Rpb24gcHUodCxlKXtyZXR1cm4gaHUodCxlLG51bGwsITApLHB1fWZ1bmN0aW9uIG11KHQpe2J1KHZ1LHV1LHQsITEpfWZ1bmN0aW9uIHV1KHQsZSl7Zm9yKGxldCBuPShmdW5jdGlvbiBuKHQpe3JldHVybiBhdSh0KSxpdSh0LHJ1KHQsMCx0dS50ZXh0RW5kKSl9KShlKTtuPj0wO249aXUoZSxuKSl2dSh0LGV1KGUpLG51KGUpKX1mdW5jdGlvbiBmdSh0KXtidShhcixndSx0LCEwKX1mdW5jdGlvbiBndSh0LGUpe2ZvcihsZXQgbj0oZnVuY3Rpb24gbih0KXtyZXR1cm4gYXUodCksb3UodCxydSh0LDAsdHUudGV4dEVuZCkpfSkoZSk7bj49MDtuPW91KGUsbikpYXIodCxldShlKSwhMCl9ZnVuY3Rpb24gaHUodCxlLG4sbyl7Y29uc3QgaT1maSgpLGE9Z2koKSxyPURpKDIpO2EuZmlyc3RVcGRhdGVQYXNzJiZfdShhLHQscixvKSxlIT09YWMmJkZwKGkscixlKSYmeHUoYSxhLmRhdGFbR2koKV0saSxpWzExXSx0LGlbcisxXT0oZnVuY3Rpb24gcyh0LGUpe3JldHVybiBudWxsPT10fHwoInN0cmluZyI9PXR5cGVvZiBlP3QrPWU6Im9iamVjdCI9PXR5cGVvZiB0JiYodD1HZSh0cyh0KSkpKSx0fSkoZSxuKSxvLHIpfWZ1bmN0aW9uIGJ1KHQsZSxuLG8pe2NvbnN0IGk9Z2koKSxhPURpKDIpO2kuZmlyc3RVcGRhdGVQYXNzJiZfdShpLG51bGwsYSxvKTtjb25zdCByPWZpKCk7aWYobiE9PWFjJiZGcChyLGEsbikpe2NvbnN0IHM9aS5kYXRhW0dpKCldO2lmKHd1KHMsbykmJiF5dShpLGEpKXtpZihuZ0Rldk1vZGUpe2NvbnN0IHQ9aS5kYXRhW2FdO2xuKEFycmF5LmlzQXJyYXkodCk/dFsxXTp0LCExLCJTdHlsaW5nIGxpbmtlZCBsaXN0IHNoYWRvdyBpbnB1dCBzaG91bGQgYmUgbWFya2VkIGFzICdmYWxzZSciKX1sZXQgdD1vP3MuY2xhc3Nlc1dpdGhvdXRIb3N0OnMuc3R5bGVzV2l0aG91dEhvc3Q7bmdEZXZNb2RlJiYhMT09PW8mJm51bGwhPT10JiZsbih0LmVuZHNXaXRoKCI7IiksITAsIkV4cGVjdGluZyBzdGF0aWMgcG9ydGlvbiB0byBlbmQgd2l0aCAnOyciKSxudWxsIT09dCYmKG49V2UodCxufHwiIikpLEVtKGkscyxyLG4sbyl9ZWxzZSEoZnVuY3Rpb24gbCh0LGUsbixvLGksYSxyLHMpe2k9PT1hYyYmKGk9V24pO2xldCBsPTAsYz0wLGQ9MDxpLmxlbmd0aD9pWzBdOm51bGwscD0wPGEubGVuZ3RoP2FbMF06bnVsbDtmb3IoO251bGwhPT1kfHxudWxsIT09cDspe25nRGV2TW9kZSYmbW4obCw5OTksIkFyZSB3ZSBzdHVjayBpbiBpbmZpbml0ZSBsb29wPyIpLG5nRGV2TW9kZSYmbW4oYyw5OTksIkFyZSB3ZSBzdHVjayBpbiBpbmZpbml0ZSBsb29wPyIpO2NvbnN0IG09bDxpLmxlbmd0aD9pW2wrMV06dm9pZCAwLHU9YzxhLmxlbmd0aD9hW2MrMV06dm9pZCAwO2xldCBmLGc9bnVsbDtkPT09cD8obCs9MixjKz0yLG0hPT11JiYoZz1wLGY9dSkpOm51bGw9PT1wfHxudWxsIT09ZCYmZDxwPyhsKz0yLGc9ZCk6KG5nRGV2TW9kZSYmaG4ocCwiRXhwZWN0aW5nIHRvIGhhdmUgYSB2YWxpZCBrZXkiKSxjKz0yLGc9cCxmPXUpLG51bGwhPT1nJiZ4dSh0LGUsbixvLGcsZixyLHMpLGQ9bDxpLmxlbmd0aD9pW2xdOm51bGwscD1jPGEubGVuZ3RoP2FbY106bnVsbH19KShpLHMscixyWzExXSxyW2ErMV0sclthKzFdPShmdW5jdGlvbiBzKHQsZSxuKXtpZihudWxsPT1ufHwiIj09PW4pcmV0dXJuIFduO2NvbnN0IG89W10saT10cyhuKTtpZihBcnJheS5pc0FycmF5KGkpKWZvcihsZXQgZT0wO2U8aS5sZW5ndGg7ZSsrKXQobyxpW2VdLCEwKTtlbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgaSlmb3IoY29uc3QgZSBpbiBpKWkuaGFzT3duUHJvcGVydHkoZSkmJnQobyxlLGlbZV0pO2Vsc2Uic3RyaW5nIj09dHlwZW9mIGk/ZShvLGkpOm5nRGV2TW9kZSYmYm4oIlVuc3VwcG9ydGVkIHN0eWxpbmcgdHlwZSAiK3R5cGVvZiBpKyI6ICIraSk7cmV0dXJuIG99KSh0LGUsbiksbyxhKX19ZnVuY3Rpb24geXUodCxlKXtyZXR1cm4gZT49dC5leHBhbmRvU3RhcnRJbmRleH1mdW5jdGlvbiBfdSh0LGUsbixvKXtuZ0Rldk1vZGUmJlRvKHQpO2NvbnN0IGk9dC5kYXRhO2lmKG51bGw9PT1pW24rMV0pe2NvbnN0IGE9aVtHaSgpXTtuZ0Rldk1vZGUmJmhuKGEsIlROb2RlIGV4cGVjdGVkIik7Y29uc3Qgcj15dSh0LG4pO3d1KGEsbykmJm51bGw9PT1lJiYhciYmKGU9ITEpLGU9KGZ1bmN0aW9uIGEodCxlLG4sbyl7Y29uc3QgaT1UaSh0KTtsZXQgYT1vP2UucmVzaWR1YWxDbGFzc2VzOmUucmVzaWR1YWxTdHlsZXM7aWYobnVsbD09PWkpMD09PShvP2UuY2xhc3NCaW5kaW5nczplLnN0eWxlQmluZGluZ3MpJiYobj1NdShuPUN1KG51bGwsdCxlLG4sbyksZS5hdHRycyxvKSxhPW51bGwpO2Vsc2V7Y29uc3Qgcj1lLmRpcmVjdGl2ZVN0eWxpbmdMYXN0O2lmKC0xPT09cnx8dFtyXSE9PWkpaWYobj1DdShpLHQsZSxuLG8pLG51bGw9PT1hKXtsZXQgbj0oZnVuY3Rpb24gcih0LGUsbil7Y29uc3Qgbz1uP2UuY2xhc3NCaW5kaW5nczplLnN0eWxlQmluZGluZ3M7aWYoMCE9PW1jKG8pKXJldHVybiB0W2NjKG8pXX0pKHQsZSxvKTt2b2lkIDAhPT1uJiZBcnJheS5pc0FycmF5KG4pJiYobj1DdShudWxsLHQsZSxuWzFdLG8pLG49TXUobixlLmF0dHJzLG8pLChmdW5jdGlvbiBzKHQsZSxuLG8pe2NvbnN0IGk9bj9lLmNsYXNzQmluZGluZ3M6ZS5zdHlsZUJpbmRpbmdzO25nRGV2TW9kZSYmY24obWMoaSksMCwiRXhwZWN0aW5nIHRvIGhhdmUgYXQgbGVhc3Qgb25lIHRlbXBsYXRlIHN0eWxpbmcgYmluZGluZy4iKSx0W2NjKGkpXT1vfSkodCxlLG8sbikpfWVsc2UgYT0oZnVuY3Rpb24gbCh0LGUsbil7bGV0IG87Y29uc3QgaT1lLmRpcmVjdGl2ZUVuZDtuZ0Rldk1vZGUmJmNuKGUuZGlyZWN0aXZlU3R5bGluZ0xhc3QsLTEsIkJ5IHRoZSB0aW1lIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgYXQgbGVhc3Qgb25lIGhvc3RCaW5kaW5ncy1ub2RlIHN0eWxpbmcgaW5zdHJ1Y3Rpb24gbXVzdCBoYXZlIGV4ZWN1dGVkLiIpO2ZvcihsZXQgYT0xK2UuZGlyZWN0aXZlU3R5bGluZ0xhc3Q7YTxpO2ErKylvPU11KG8sdFthXS5ob3N0QXR0cnMsbik7cmV0dXJuIE11KG8sZS5hdHRycyxuKX0pKHQsZSxvKX1yZXR1cm4gdm9pZCAwIT09YSYmKG8/ZS5yZXNpZHVhbENsYXNzZXM9YTplLnJlc2lkdWFsU3R5bGVzPWEpLG59KShpLGEsZSxvKSwoZnVuY3Rpb24gcih0LGUsbixvLGksYSl7bmdEZXZNb2RlJiZUbyhnaSgpKTtsZXQgcj1hP2UuY2xhc3NCaW5kaW5nczplLnN0eWxlQmluZGluZ3Mscz1jYyhyKSxsPW1jKHIpO3Rbb109bjtsZXQgYyxkPSExO2lmKEFycmF5LmlzQXJyYXkobikpe2NvbnN0IHQ9bjtjPXRbMV0sKG51bGw9PT1jfHxzcih0LGMpPjApJiYoZD0hMCl9ZWxzZSBjPW47aWYoaSlpZigwIT09bCl7Y29uc3QgZT1jYyh0W3MrMV0pO3RbbysxXT1sYyhlLHMpLDAhPT1lJiYodFtlKzFdPXVjKHRbZSsxXSxvKSksdFtzKzFdPShmdW5jdGlvbiBwKHQsZSl7cmV0dXJuIG5nRGV2TW9kZSYmYW4odCwiZXhwZWN0ZWQgbnVtYmVyIiksbmdEZXZNb2RlJiZybihlLDAsMzI3NjcpLDEzMTA3MSZ0fGU8PDE3fSkodFtzKzFdLG8pfWVsc2UgdFtvKzFdPWxjKHMsMCksMCE9PXMmJih0W3MrMV09dWModFtzKzFdLG8pKSxzPW87ZWxzZSB0W28rMV09bGMobCwwKSxuZ0Rldk1vZGUmJmxuKDAhPT1zJiYwPT09bCwhMSwiQWRkaW5nIHRlbXBsYXRlIGJpbmRpbmdzIGFmdGVyIGhvc3RCaW5kaW5ncyBpcyBub3QgYWxsb3dlZC4iKSwwPT09cz9zPW86dFtsKzFdPXVjKHRbbCsxXSxvKSxsPW87ZCYmKHRbbysxXT1wYyh0W28rMV0pKSxRbSh0LGMsbywhMCksUW0odCxjLG8sITEpLChmdW5jdGlvbiBtKHQsZSxuLG8saSl7Y29uc3QgYT1pP3QucmVzaWR1YWxDbGFzc2VzOnQucmVzaWR1YWxTdHlsZXM7bnVsbCE9YSYmInN0cmluZyI9PXR5cGVvZiBlJiZzcihhLGUpPj0wJiYobltvKzFdPWdjKG5bbysxXSkpfSkoZSxjLHQsbyxhKSxyPWxjKHMsbCksYT9lLmNsYXNzQmluZGluZ3M9cjplLnN0eWxlQmluZGluZ3M9cn0pKGksYSxlLG4scixvKX19ZnVuY3Rpb24gQ3UodCxlLG4sbyxpKXtsZXQgYT1udWxsO2NvbnN0IHI9bi5kaXJlY3RpdmVFbmQ7bGV0IHM9bi5kaXJlY3RpdmVTdHlsaW5nTGFzdDtmb3IoLTE9PT1zP3M9bi5kaXJlY3RpdmVTdGFydDpzKys7czxyJiYoYT1lW3NdLG5nRGV2TW9kZSYmaG4oYSwiZXhwZWN0ZWQgdG8gYmUgZGVmaW5lZCIpLG89TXUobyxhLmhvc3RBdHRycyxpKSxhIT09dCk7KXMrKztyZXR1cm4gbnVsbCE9PXQmJihuLmRpcmVjdGl2ZVN0eWxpbmdMYXN0PXMpLG99ZnVuY3Rpb24gTXUodCxlLG4pe2NvbnN0IG89bj8xOjI7bGV0IGk9LTE7aWYobnVsbCE9PWUpZm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKyspe2NvbnN0IHI9ZVthXTsibnVtYmVyIj09dHlwZW9mIHI/aT1yOmk9PT1vJiYoQXJyYXkuaXNBcnJheSh0KXx8KHQ9dm9pZCAwPT09dD9bXTpbIiIsdF0pLGFyKHQsciwhIW58fGVbKythXSkpfXJldHVybiB2b2lkIDA9PT10P251bGw6dH1mdW5jdGlvbiB2dSh0LGUsbil7YXIodCxlLHRzKG4pKX1mdW5jdGlvbiB4dSh0LGUsbixvLGksYSxyLHMpe2lmKCEoMyZlLnR5cGUpKXJldHVybjtjb25zdCBsPXQuZGF0YSxjPWxbcysxXTtQdShmYyhjKT9PdShsLGUsbixpLG1jKGMpLHIpOnZvaWQgMCl8fChQdShhKXx8ZGMoYykmJihhPU91KGwsbnVsbCxuLGkscyxyKSksKGZ1bmN0aW9uIGQodCxlLG4sbyxpKXtjb25zdCBhPSRvKHQpO2lmKGUpaT8obmdEZXZNb2RlJiZuZ0Rldk1vZGUucmVuZGVyZXJBZGRDbGFzcysrLGE/dC5hZGRDbGFzcyhuLG8pOihuZ0Rldk1vZGUmJmhuKG4uY2xhc3NMaXN0LCJIVE1MRWxlbWVudCBleHBlY3RlZCIpLG4uY2xhc3NMaXN0LmFkZChvKSkpOihuZ0Rldk1vZGUmJm5nRGV2TW9kZS5yZW5kZXJlclJlbW92ZUNsYXNzKyssYT90LnJlbW92ZUNsYXNzKG4sbyk6bi5jbGFzc0xpc3QucmVtb3ZlKG8pKTtlbHNle2xldCBlPS0xPT09by5pbmRleE9mKCItIik/dm9pZCAwOmNsLkRhc2hDYXNlO2lmKG51bGw9PWkpbmdEZXZNb2RlJiZuZ0Rldk1vZGUucmVuZGVyZXJSZW1vdmVTdHlsZSsrLGE/dC5yZW1vdmVTdHlsZShuLG8sZSk6bi5zdHlsZS5yZW1vdmVQcm9wZXJ0eShvKTtlbHNle2NvbnN0IHI9InN0cmluZyI9PXR5cGVvZiBpJiZpLmVuZHNXaXRoKCIhaW1wb3J0YW50Iik7ciYmKGk9aS5zbGljZSgwLC0xMCksZXw9Y2wuSW1wb3J0YW50KSxuZ0Rldk1vZGUmJm5nRGV2TW9kZS5yZW5kZXJlclNldFN0eWxlKyssYT90LnNldFN0eWxlKG4sbyxpLGUpOihuZ0Rldk1vZGUmJmhuKG4uc3R5bGUsIkhUTUxFbGVtZW50IGV4cGVjdGVkIiksbi5zdHlsZS5zZXRQcm9wZXJ0eShvLGkscj8iaW1wb3J0YW50IjoiIikpfX19KShvLHIsbmkoR2koKSxuKSxpLGEpKX1mdW5jdGlvbiBPdSh0LGUsbixvLGksYSl7Y29uc3Qgcj1udWxsPT09ZTtsZXQgcztmb3IoO2k+MDspe2NvbnN0IGU9dFtpXSxhPUFycmF5LmlzQXJyYXkoZSksbD1hP2VbMV06ZSxjPW51bGw9PT1sO2xldCBkPW5baSsxXTtkPT09YWMmJihkPWM/V246dm9pZCAwKTtsZXQgcD1jP3JyKGQsbyk6bD09PW8/ZDp2b2lkIDA7aWYoYSYmIVB1KHApJiYocD1ycihlLG8pKSxQdShwKSYmKHM9cCxyKSlyZXR1cm4gcztjb25zdCBtPXRbaSsxXTtpPXI/Y2MobSk6bWMobSl9aWYobnVsbCE9PWUpe2xldCB0PWE/ZS5yZXNpZHVhbENsYXNzZXM6ZS5yZXNpZHVhbFN0eWxlcztudWxsIT10JiYocz1ycih0LG8pKX1yZXR1cm4gc31mdW5jdGlvbiBQdSh0KXtyZXR1cm4gdm9pZCAwIT09dH1mdW5jdGlvbiB3dSh0LGUpe3JldHVybiAwIT0odC5mbGFncyYoZT8xNjozMikpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBrdSh0LGU9IiIpe2NvbnN0IG49ZmkoKSxvPWdpKCksaT10K2dvO25nRGV2TW9kZSYmbG4od2koKSxvLmJpbmRpbmdTdGFydEluZGV4LCJ0ZXh0IG5vZGVzIHNob3VsZCBiZSBjcmVhdGVkIGJlZm9yZSBhbnkgYmluZGluZ3MiKSxuZ0Rldk1vZGUmJl9uKG4saSk7Y29uc3QgYT1vLmZpcnN0Q3JlYXRlUGFzcz9aYyhvLGksMSxlLG51bGwpOm8uZGF0YVtpXSxyPW5baV09eWwoblsxMV0sZSk7SGwobyxuLHIsYSksQ2koYSwhMSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIFN1KHQpe3JldHVybiBEdSgiIix0LCIiKSxTdX1mdW5jdGlvbiBEdSh0LGUsbil7Y29uc3Qgbz1maSgpLGk9R3Aobyx0LGUsbik7cmV0dXJuIGkhPT1hYyYmamQobyxHaSgpLGkpLER1fWZ1bmN0aW9uIEV1KHQsZSxuLG8saSl7Y29uc3QgYT1maSgpLHI9V3AoYSx0LGUsbixvLGkpO3JldHVybiByIT09YWMmJmpkKGEsR2koKSxyKSxFdX1mdW5jdGlvbiBSdSh0LGUsbixvLGksYSxyKXtjb25zdCBzPWZpKCksbD1ZcChzLHQsZSxuLG8saSxhLHIpO3JldHVybiBsIT09YWMmJmpkKHMsR2koKSxsKSxSdX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmZ1bmN0aW9uIEF1KHQsZSxuKXtidShhcixndSxHcChmaSgpLHQsZSxuKSwhMCl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBUdSh0LGUsbil7Y29uc3Qgbz1maSgpLGk9U2koKTtpZihGcChvLGksZSkpe2NvbnN0IGE9Z2koKSxyPVlpKCk7bGQoYSxyLG8sdCxlLG9bMTFdLG4sITApLG5nRGV2TW9kZSYmemQoYS5kYXRhLHIsdCxpKX1yZXR1cm4gVHV9ZnVuY3Rpb24gTnUodCxlLG4pe2NvbnN0IG89ZmkoKSxpPVNpKCk7aWYoRnAobyxpLGUpKXtjb25zdCBhPWdpKCkscj1ZaSgpO2xkKGEscixvLHQsZSxMZChUaShhLmRhdGEpLHIsbyksbiwhMCksbmdEZXZNb2RlJiZ6ZChhLmRhdGEscix0LGkpfXJldHVybiBOdX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSYmKGpuLm5nSTE4bkNsb3N1cmVNb2RlPSJ1bmRlZmluZWQiIT10eXBlb2YgZ29vZyYmImZ1bmN0aW9uIj09dHlwZW9mIGdvb2cuZ2V0TXNnKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3QgenU9dm9pZCAwO3ZhciBJdT1bImVuIixbWyJhIiwicCJdLFsiQU0iLCJQTSJdLHp1XSxbWyJBTSIsIlBNIl0senUsenVdLFtbIlMiLCJNIiwiVCIsIlciLCJUIiwiRiIsIlMiXSxbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLFsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxbIlN1IiwiTW8iLCJUdSIsIldlIiwiVGgiLCJGciIsIlNhIl1dLHp1LFtbIkoiLCJGIiwiTSIsIkEiLCJNIiwiSiIsIkoiLCJBIiwiUyIsIk8iLCJOIiwiRCJdLFsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl0sWyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdXSx6dSxbWyJCIiwiQSJdLFsiQkMiLCJBRCJdLFsiQmVmb3JlIENocmlzdCIsIkFubm8gRG9taW5pIl1dLDAsWzYsMF0sWyJNL2QveXkiLCJNTU0gZCwgeSIsIk1NTU0gZCwgeSIsIkVFRUUsIE1NTU0gZCwgeSJdLFsiaDptbSBhIiwiaDptbTpzcyBhIiwiaDptbTpzcyBhIHoiLCJoOm1tOnNzIGEgenp6eiJdLFsiezF9LCB7MH0iLHp1LCJ7MX0gJ2F0JyB7MH0iLHp1XSxbIi4iLCIsIiwiOyIsIiUiLCIrIiwiLSIsIkUiLCLDlyIsIuKAsCIsIuKIniIsIk5hTiIsIjoiXSxbIiMsIyMwLiMjIyIsIiMsIyMwJSIsIsKkIywjIzAuMDAiLCIjRTAiXSwiVVNEIiwiJCIsIlVTIERvbGxhciIse30sImx0ciIsZnVuY3Rpb24gSHUodCl7Y29uc3QgZT1NYXRoLmZsb29yKE1hdGguYWJzKHQpKSxuPXQudG9TdHJpbmcoKS5yZXBsYWNlKC9eW14uXSpcLj8vLCIiKS5sZW5ndGg7cmV0dXJuIDE9PT1lJiYwPT09bj8xOjV9XTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovbGV0IEZ1PXt9O2Z1bmN0aW9uIEx1KHQpe2NvbnN0IGU9KGZ1bmN0aW9uIG4odCl7cmV0dXJuIHQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csIi0iKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKSh0KTtsZXQgbz1WdShlKTtpZihvKXJldHVybiBvO2NvbnN0IGk9ZS5zcGxpdCgiLSIpWzBdO2lmKG89VnUoaSksbylyZXR1cm4gbztpZigiZW4iPT09aSlyZXR1cm4gSXU7dGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGxvY2FsZSBkYXRhIGZvciB0aGUgbG9jYWxlICIke3R9Ii5gKX1mdW5jdGlvbiBCdSh0KXtyZXR1cm4gTHUodClbanUuUGx1cmFsQ2FzZV19ZnVuY3Rpb24gVnUodCl7cmV0dXJuIHQgaW4gRnV8fChGdVt0XT1qbi5uZyYmam4ubmcuY29tbW9uJiZqbi5uZy5jb21tb24ubG9jYWxlcyYmam4ubmcuY29tbW9uLmxvY2FsZXNbdF0pLEZ1W3RdfXZhciBqdTshKGZ1bmN0aW9uKHQpe3RbdC5Mb2NhbGVJZD0wXT0iTG9jYWxlSWQiLHRbdC5EYXlQZXJpb2RzRm9ybWF0PTFdPSJEYXlQZXJpb2RzRm9ybWF0Iix0W3QuRGF5UGVyaW9kc1N0YW5kYWxvbmU9Ml09IkRheVBlcmlvZHNTdGFuZGFsb25lIix0W3QuRGF5c0Zvcm1hdD0zXT0iRGF5c0Zvcm1hdCIsdFt0LkRheXNTdGFuZGFsb25lPTRdPSJEYXlzU3RhbmRhbG9uZSIsdFt0Lk1vbnRoc0Zvcm1hdD01XT0iTW9udGhzRm9ybWF0Iix0W3QuTW9udGhzU3RhbmRhbG9uZT02XT0iTW9udGhzU3RhbmRhbG9uZSIsdFt0LkVyYXM9N109IkVyYXMiLHRbdC5GaXJzdERheU9mV2Vlaz04XT0iRmlyc3REYXlPZldlZWsiLHRbdC5XZWVrZW5kUmFuZ2U9OV09IldlZWtlbmRSYW5nZSIsdFt0LkRhdGVGb3JtYXQ9MTBdPSJEYXRlRm9ybWF0Iix0W3QuVGltZUZvcm1hdD0xMV09IlRpbWVGb3JtYXQiLHRbdC5EYXRlVGltZUZvcm1hdD0xMl09IkRhdGVUaW1lRm9ybWF0Iix0W3QuTnVtYmVyU3ltYm9scz0xM109Ik51bWJlclN5bWJvbHMiLHRbdC5OdW1iZXJGb3JtYXRzPTE0XT0iTnVtYmVyRm9ybWF0cyIsdFt0LkN1cnJlbmN5Q29kZT0xNV09IkN1cnJlbmN5Q29kZSIsdFt0LkN1cnJlbmN5U3ltYm9sPTE2XT0iQ3VycmVuY3lTeW1ib2wiLHRbdC5DdXJyZW5jeU5hbWU9MTddPSJDdXJyZW5jeU5hbWUiLHRbdC5DdXJyZW5jaWVzPTE4XT0iQ3VycmVuY2llcyIsdFt0LkRpcmVjdGlvbmFsaXR5PTE5XT0iRGlyZWN0aW9uYWxpdHkiLHRbdC5QbHVyYWxDYXNlPTIwXT0iUGx1cmFsQ2FzZSIsdFt0LkV4dHJhRGF0YT0yMV09IkV4dHJhRGF0YSJ9KShqdXx8KGp1PXt9KSk7Y29uc3QgVXU9WyJ6ZXJvIiwib25lIiwidHdvIiwiZmV3IiwibWFueSJdLEd1PSJlbi1VUyIsV3U9e21hcmtlcjoiZWxlbWVudCJ9LFl1PXttYXJrZXI6IklDVSJ9O3ZhciBxdTshKGZ1bmN0aW9uKHQpe3RbdC5TSElGVD0yXT0iU0hJRlQiLHRbdC5BUFBFTkRfRUFHRVJMWT0xXT0iQVBQRU5EX0VBR0VSTFkiLHRbdC5DT01NRU5UPTJdPSJDT01NRU5UIn0pKHF1fHwocXU9e30pKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmxldCBadT1HdTtmdW5jdGlvbiBYdSh0KXtobih0LCJFeHBlY3RlZCBsb2NhbGVJZCB0byBiZSBkZWZpbmVkIiksInN0cmluZyI9PXR5cGVvZiB0JiYoWnU9dC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL18vZywiLSIpKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmZ1bmN0aW9uIEt1KHQsZSxuKXtjb25zdCBvPWUuaW5zZXJ0QmVmb3JlSW5kZXgsaT1BcnJheS5pc0FycmF5KG8pP29bMF06bztyZXR1cm4gbnVsbD09PWk/VGwodCwwLG4pOihuZ0Rldk1vZGUmJl9uKG4saSksZWkobltpXSkpfWZ1bmN0aW9uIEp1KHQsZSxuLG8saSl7Y29uc3QgYT1lLmluc2VydEJlZm9yZUluZGV4O2lmKEFycmF5LmlzQXJyYXkoYSkpe25nRGV2TW9kZSYmeW4obyk7bGV0IHI9byxzPW51bGw7aWYoMyZlLnR5cGV8fChzPXIscj1pKSxudWxsIT09ciYmMD09KDImZS5mbGFncykpZm9yKGxldCBlPTE7ZTxhLmxlbmd0aDtlKyspU2wodCxyLG5bYVtlXV0scywhMSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBRdSh0LGUpe2lmKG5nRGV2TW9kZSYmbG4oZS5pbnNlcnRCZWZvcmVJbmRleCxudWxsLCJXZSBleHBlY3QgdGhhdCBpbnNlcnRCZWZvcmVJbmRleCBpcyBub3Qgc2V0IiksdC5wdXNoKGUpLHQubGVuZ3RoPjEpZm9yKGxldCBuPXQubGVuZ3RoLTI7bj49MDtuLS0pe2NvbnN0IG89dFtuXTskdShvKXx8dGYobyxlKSYmbnVsbD09PWVmKG8pJiZuZihvLGUuaW5kZXgpfX1mdW5jdGlvbiAkdSh0KXtyZXR1cm4hKDY0JnQudHlwZSl9ZnVuY3Rpb24gdGYodCxlKXtyZXR1cm4gJHUoZSl8fHQuaW5kZXg+ZS5pbmRleH1mdW5jdGlvbiBlZih0KXtjb25zdCBlPXQuaW5zZXJ0QmVmb3JlSW5kZXg7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZVswXTplfWZ1bmN0aW9uIG5mKHQsZSl7Y29uc3Qgbj10Lmluc2VydEJlZm9yZUluZGV4O0FycmF5LmlzQXJyYXkobik/blswXT1lOihJbChLdSxKdSksdC5pbnNlcnRCZWZvcmVJbmRleD1lKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gb2YodCxlKXtjb25zdCBuPXQuZGF0YVtlXTtpZihudWxsPT09bnx8InN0cmluZyI9PXR5cGVvZiBuKXJldHVybiBudWxsOyFuZ0Rldk1vZGV8fG4uaGFzT3duUHJvcGVydHkoInRWaWV3cyIpfHxuLmhhc093blByb3BlcnR5KCJjdXJyZW50Q2FzZUxWaWV3SW5kZXgiKXx8Ym4oIldlIGV4cGVjdCB0byBnZXQgJ251bGwnfCdUSWN1J3wnVEljdUNvbnRhaW5lcicsIGJ1dCBnb3Q6ICIrbik7Y29uc3Qgbz1uLmhhc093blByb3BlcnR5KCJjdXJyZW50Q2FzZUxWaWV3SW5kZXgiKT9uOm4udmFsdWU7cmV0dXJuIG5nRGV2TW9kZSYma28obyksb31mdW5jdGlvbiBhZih0LGUsbil7Y29uc3Qgbz1YYyh0LG4sNjQsbnVsbCxudWxsKTtyZXR1cm4gUXUoZSxvKSxvfWZ1bmN0aW9uIHJmKHQsZSl7Y29uc3Qgbj1lW3QuY3VycmVudENhc2VMVmlld0luZGV4XTtyZXR1cm4gbnVsbD09PW4/bjpuPDA/fm46bn1mdW5jdGlvbiBzZih0KXtyZXR1cm4gdD4+PjE3fWZ1bmN0aW9uIGxmKHQpe3JldHVybigxMzEwNzAmdCk+Pj4xfWZ1bmN0aW9uIGNmKHQpe3JldHVybiAxJnR9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpsZXQgZGY9MCxwZj0wO2Z1bmN0aW9uIG1mKHQsZSxuLG8pe25nRGV2TW9kZSYmeW4obyk7Y29uc3QgaT1uWzExXTtsZXQgYSxyPW51bGw7Zm9yKGxldCBzPTA7czxlLmxlbmd0aDtzKyspe2NvbnN0IGw9ZVtzXTtpZigic3RyaW5nIj09dHlwZW9mIGwpe2NvbnN0IHQ9ZVsrK3NdO251bGw9PT1uW3RdJiYobmdEZXZNb2RlJiZuZ0Rldk1vZGUucmVuZGVyZXJDcmVhdGVUZXh0Tm9kZSsrLG5nRGV2TW9kZSYmX24obix0KSxuW3RdPXlsKGksbCkpfWVsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBsKXN3aXRjaCgxJmwpe2Nhc2UgMDpjb25zdCBjPXNmKGwpO2xldCBkLHA7aWYobnVsbD09PXImJihyPWMsYT1SbChpLG8pKSxjPT09cj8oZD1vLHA9YSk6KGQ9bnVsbCxwPWVpKG5bY10pKSxudWxsIT09cCl7bmdEZXZNb2RlJiZ5bihwKTtjb25zdCBlPWxmKGwpO25nRGV2TW9kZSYmZm4oZSxnbywiTWlzc2luZyByZWYiKTtjb25zdCBvPW5bZV07bmdEZXZNb2RlJiZ5bihvKSxTbChpLHAsbyxkLCExKTtjb25zdCBhPW9mKHQsZSk7aWYobnVsbCE9PWEmJiJvYmplY3QiPT10eXBlb2YgYSl7bmdEZXZNb2RlJiZrbyhhKTtjb25zdCBlPXJmKGEsbik7bnVsbCE9PWUmJm1mKHQsYS5jcmVhdGVbZV0sbixuW2EuYW5jaG9ySWR4XSl9fWJyZWFrO2Nhc2UgMTpjb25zdCBtPWVbKytzXSx1PWVbKytzXTtNZChpLG5pKGw+Pj4xLG4pLG51bGwsbnVsbCxtLHUsbnVsbCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgbXV0YXRlIG9wZXJhdGlvbiBmb3IgIiR7bH0iYCl9ZWxzZSBzd2l0Y2gobCl7Y2FzZSBZdTpjb25zdCB0PWVbKytzXSxvPWVbKytzXTtudWxsPT09bltvXSYmKG5nRGV2TW9kZSYmbG4odHlwZW9mIHQsInN0cmluZyIsYEV4cGVjdGVkICIke3R9IiB0byBiZSBhIGNvbW1lbnQgbm9kZSB2YWx1ZWApLG5nRGV2TW9kZSYmbmdEZXZNb2RlLnJlbmRlcmVyQ3JlYXRlQ29tbWVudCsrLG5nRGV2TW9kZSYmTm8obixvKSxMcyhuW29dPUNsKGksdCksbikpO2JyZWFrO2Nhc2UgV3U6Y29uc3QgYT1lWysrc10scj1lWysrc107bnVsbD09PW5bcl0mJihuZ0Rldk1vZGUmJmxuKHR5cGVvZiBhLCJzdHJpbmciLGBFeHBlY3RlZCAiJHthfSIgdG8gYmUgYW4gZWxlbWVudCBub2RlIHRhZyBuYW1lYCksbmdEZXZNb2RlJiZuZ0Rldk1vZGUucmVuZGVyZXJDcmVhdGVFbGVtZW50KyssbmdEZXZNb2RlJiZObyhuLHIpLExzKG5bcl09TWwoaSxhLG51bGwpLG4pKTticmVhaztkZWZhdWx0Om5nRGV2TW9kZSYmYm4oYFVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgbXV0YXRlIG9wZXJhdGlvbiBmb3IgIiR7bH0iYCl9fX1mdW5jdGlvbiB1Zih0LGUsbixvLGkpe2ZvcihsZXQgYT0wO2E8bi5sZW5ndGg7YSsrKXtjb25zdCByPW5bYV0scz1uWysrYV07aWYociZpKXtsZXQgaT0iIjtmb3IobGV0IHI9YSsxO3I8PWErcztyKyspe2NvbnN0IGE9bltyXTtpZigic3RyaW5nIj09dHlwZW9mIGEpaSs9YTtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgYSlpZihhPDApaSs9JGUoZVtvLWFdKTtlbHNle2NvbnN0IHM9YT4+PjI7c3dpdGNoKDMmYSl7Y2FzZSAxOmNvbnN0IGE9blsrK3JdLGw9blsrK3JdLGM9dC5kYXRhW3NdO25nRGV2TW9kZSYmaG4oYywiRXhwZXJ0aW5nIFROb2RlIG9yIHN0cmluZyIpLCJzdHJpbmciPT10eXBlb2YgYz9NZChlWzExXSxlW3NdLG51bGwsYyxhLGksbCk6bGQodCxjLGUsYSxpLGVbMTFdLGwsITEpO2JyZWFrO2Nhc2UgMDpjb25zdCBkPWVbc107bnVsbCE9PWQmJl9sKGVbMTFdLGQsaSk7YnJlYWs7Y2FzZSAyOmdmKHQsb2YodCxzKSxlLGkpO2JyZWFrO2Nhc2UgMzpmZih0LG9mKHQscyksbyxlKX19fX1lbHNle2NvbnN0IGk9blthKzFdO2lmKGk+MCYmMz09KDMmaSkpe2NvbnN0IG49b2YodCxpPj4+Mik7ZVtuLmN1cnJlbnRDYXNlTFZpZXdJbmRleF08MCYmZmYodCxuLG8sZSl9fWErPXN9fWZ1bmN0aW9uIGZmKHQsZSxuLG8pe25nRGV2TW9kZSYmX24obyxlLmN1cnJlbnRDYXNlTFZpZXdJbmRleCk7bGV0IGk9b1tlLmN1cnJlbnRDYXNlTFZpZXdJbmRleF07aWYobnVsbCE9PWkpe2xldCBhPWRmO2k8MCYmKGk9b1tlLmN1cnJlbnRDYXNlTFZpZXdJbmRleF09fmksYT0tMSksdWYodCxvLGUudXBkYXRlW2ldLG4sYSl9fWZ1bmN0aW9uIGdmKHQsZSxuLG8pe2NvbnN0IGk9KGZ1bmN0aW9uIGEodCxlKXtsZXQgbj10LmNhc2VzLmluZGV4T2YoZSk7aWYoLTE9PT1uKXN3aXRjaCh0LnR5cGUpe2Nhc2UgMTp7Y29uc3Qgbz0oZnVuY3Rpb24gaSh0LGUpe2NvbnN0IG49QnUoZSkocGFyc2VJbnQodCwxMCkpLG89VXVbbl07cmV0dXJuIHZvaWQgMCE9PW8/bzoib3RoZXIifSkoZSwoZnVuY3Rpb24gbygpe3JldHVybiBadX0pKCkpO249dC5jYXNlcy5pbmRleE9mKG8pLC0xPT09biYmIm90aGVyIiE9PW8mJihuPXQuY2FzZXMuaW5kZXhPZigib3RoZXIiKSk7YnJlYWt9Y2FzZSAwOm49dC5jYXNlcy5pbmRleE9mKCJvdGhlciIpfXJldHVybi0xPT09bj9udWxsOm59Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLykoZSxvKTtpZihyZihlLG4pIT09aSYmKGhmKHQsZSxuKSxuW2UuY3VycmVudENhc2VMVmlld0luZGV4XT1udWxsPT09aT9udWxsOn5pLG51bGwhPT1pKSl7Y29uc3Qgbz1uW2UuYW5jaG9ySWR4XTtvJiYobmdEZXZNb2RlJiZ5bihvKSxtZih0LGUuY3JlYXRlW2ldLG4sbykpfX1mdW5jdGlvbiBoZih0LGUsbil7bGV0IG89cmYoZSxuKTtpZihudWxsIT09byl7Y29uc3QgaT1lLnJlbW92ZVtvXTtmb3IobGV0IGU9MDtlPGkubGVuZ3RoO2UrKyl7Y29uc3Qgbz1pW2VdO2lmKG8+MCl7Y29uc3QgdD1uaShvLG4pO251bGwhPT10JiZWbChuWzExXSx0KX1lbHNlIGhmKHQsb2YodCx+byksbil9fX1mdW5jdGlvbiBiZigpe2NvbnN0IHQ9W107bGV0IGUsbixvPS0xO2Z1bmN0aW9uIGkodCxlKXtvPTA7Y29uc3QgaT1yZih0LGUpO251bGwhPT1pPyhuZ0Rldk1vZGUmJnJuKGksMCx0LmNhc2VzLmxlbmd0aC0xKSxuPXQucmVtb3ZlW2ldKTpuPVdufWZ1bmN0aW9uIGEoKXtpZihvPG4ubGVuZ3RoKXtjb25zdCByPW5bbysrXTtpZihuZ0Rldk1vZGUmJmFuKHIsIkV4cGVjdGluZyBPcENvZGUgbnVtYmVyIikscj4wKXtjb25zdCB0PWVbcl07cmV0dXJuIG5nRGV2TW9kZSYmeW4odCksdH17dC5wdXNoKG8sbik7Y29uc3Qgcz1lWzFdLmRhdGFbfnJdO3JldHVybiBuZ0Rldk1vZGUmJmtvKHMpLGkocyxlKSxhKCl9fXJldHVybiAwPT09dC5sZW5ndGg/bnVsbDoobj10LnBvcCgpLG89dC5wb3AoKSxhKCkpfXJldHVybiBmdW5jdGlvbiByKG4sbyl7Zm9yKGU9bzt0Lmxlbmd0aDspdC5wb3AoKTtyZXR1cm4gbmdEZXZNb2RlJiZPbyhuLG8pLGkobi52YWx1ZSxvKSxhfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24geWYodCl7Y29uc3QgZT10fHwoQXJyYXkuaXNBcnJheSh0aGlzKT90aGlzOltdKTtsZXQgbj1bXTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7Y29uc3Qgbz1lW3QrK10saT0obyZxdS5BUFBFTkRfRUFHRVJMWSk9PT1xdS5BUFBFTkRfRUFHRVJMWSxhPW8+Pj5xdS5TSElGVDtuLnB1c2goYGxWaWV3WyR7YX1dID0gZG9jdW1lbnQuJHsobyZxdS5DT01NRU5UKT09PXF1LkNPTU1FTlQ/ImNyZWF0ZUNvbW1lbnQiOiJjcmVhdGVUZXh0In0oJHtKU09OLnN0cmluZ2lmeShlW3RdKX0pO2ApLGkmJm4ucHVzaChgcGFyZW50LmFwcGVuZENoaWxkKGxWaWV3WyR7YX1dKTtgKX1yZXR1cm4gbn1mdW5jdGlvbiBfZih0KXtjb25zdCBlPW5ldyB2Zih0fHwoQXJyYXkuaXNBcnJheSh0aGlzKT90aGlzOltdKSk7bGV0IG49W107ZnVuY3Rpb24gbyh0KXtjb25zdCBuPXQ+Pj4yO3N3aXRjaCgzJnQpe2Nhc2UgMDpyZXR1cm5gKGxWaWV3WyR7bn1dIGFzIFRleHQpLnRleHRDb250ZW50ID0gJCQkYDtjYXNlIDE6Y29uc3QgdD1lLmNvbnN1bWVTdHJpbmcoKSxvPWUuY29uc3VtZUZ1bmN0aW9uKCk7cmV0dXJuYChsVmlld1ske259XSBhcyBFbGVtZW50KS5zZXRBdHRyaWJ1dGUoJyR7dH0nLCAke28/YCgke299KSgkJCQpYDoiJCQkIn0pYDtjYXNlIDI6cmV0dXJuYGljdVN3aXRjaENhc2UoJHtufSwgJCQkKWA7Y2FzZSAzOnJldHVybmBpY3VVcGRhdGVDYXNlKCR7bn0pYH10aHJvdyBuZXcgRXJyb3IoInVuZXhwZWN0ZWQgT3BDb2RlIil9Zm9yKDtlLmhhc01vcmUoKTspe2xldCB0PWUuY29uc3VtZU51bWJlcigpLGk9ZS5jb25zdW1lTnVtYmVyKCk7Y29uc3QgYT1lLmkraSxyPVtdO2xldCBzPSIiO2Zvcig7ZS5pPGE7KXtsZXQgdD1lLmNvbnN1bWVOdW1iZXJPclN0cmluZygpO2lmKCJzdHJpbmciPT10eXBlb2YgdClzKz10O2Vsc2UgaWYodDwwKXMrPSIke2xWaWV3W2kiK3QrIl19IjtlbHNle2NvbnN0IGU9byh0KTtyLnB1c2goZS5yZXBsYWNlKCIkJCQiLCJgIitzKyJgIikrIjsiKSxzPSIifX1uLnB1c2goYGlmIChtYXNrICYgMGIke3QudG9TdHJpbmcoMil9KSB7ICR7ci5qb2luKCIgIil9IH1gKX1yZXR1cm4gbn1mdW5jdGlvbiBDZih0KXtjb25zdCBlPW5ldyB2Zih0fHwoQXJyYXkuaXNBcnJheSh0aGlzKT90aGlzOltdKSk7bGV0IG49W107ZnVuY3Rpb24gbyh0KXtjb25zdCBuPXNmKHQpLG89bGYodCk7c3dpdGNoKGNmKHQpKXtjYXNlIDA6cmV0dXJuYChsVmlld1ske259XSBhcyBFbGVtZW50KS5hcHBlbmRDaGlsZChsVmlld1ske2l9XSlgO2Nhc2UgMTpyZXR1cm5gKGxWaWV3WyR7b31dIGFzIEVsZW1lbnQpLnNldEF0dHJpYnV0ZSgiJHtlLmNvbnN1bWVTdHJpbmcoKX0iLCAiJHtlLmNvbnN1bWVTdHJpbmcoKX0iKWB9dGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIE9wQ29kZTogIitjZih0KSl9bGV0IGk9LTE7Zm9yKDtlLmhhc01vcmUoKTspe2xldCB0PWUuY29uc3VtZU51bWJlclN0cmluZ09yTWFya2VyKCk7aWYodD09PVl1KXtjb25zdCB0PWUuY29uc3VtZVN0cmluZygpO2k9ZS5jb25zdW1lTnVtYmVyKCksbi5wdXNoKGBsVmlld1ske2l9XSA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoIiR7dH0iKWApfWVsc2UgaWYodD09PVd1KXtjb25zdCB0PWUuY29uc3VtZVN0cmluZygpO2k9ZS5jb25zdW1lTnVtYmVyKCksbi5wdXNoKGBsVmlld1ske2l9XSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIiR7dH0iKWApfWVsc2UgaWYoInN0cmluZyI9PXR5cGVvZiB0KWk9ZS5jb25zdW1lTnVtYmVyKCksbi5wdXNoKGBsVmlld1ske2l9XSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIke3R9IilgKTtlbHNle2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgdmFsdWUiKTt7Y29uc3QgZT1vKHQpO2UmJm4ucHVzaChlKX19fXJldHVybiBufWZ1bmN0aW9uIE1mKHQpe2NvbnN0IGU9dHx8KEFycmF5LmlzQXJyYXkodGhpcyk/dGhpczpbXSk7bGV0IG49W107Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2NvbnN0IG89ZVt0XTtuLnB1c2gobz4wP2ByZW1vdmUobFZpZXdbJHtvfV0pYDpgcmVtb3ZlTmVzdGVkSUNVKCR7fm99KWApfXJldHVybiBufWNsYXNzIHZme2NvbnN0cnVjdG9yKHQpe3RoaXMuaT0wLHRoaXMuY29kZXM9dH1oYXNNb3JlKCl7cmV0dXJuIHRoaXMuaTx0aGlzLmNvZGVzLmxlbmd0aH1jb25zdW1lTnVtYmVyKCl7bGV0IHQ9dGhpcy5jb2Rlc1t0aGlzLmkrK107cmV0dXJuIGFuKHQsImV4cGVjdGluZyBudW1iZXIgaW4gT3BDb2RlIiksdH1jb25zdW1lU3RyaW5nKCl7bGV0IHQ9dGhpcy5jb2Rlc1t0aGlzLmkrK107cmV0dXJuIHNuKHQsImV4cGVjdGluZyBzdHJpbmcgaW4gT3BDb2RlIiksdH1jb25zdW1lRnVuY3Rpb24oKXtsZXQgdD10aGlzLmNvZGVzW3RoaXMuaSsrXTtpZihudWxsPT09dHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQpcmV0dXJuIHQ7dGhyb3cgbmV3IEVycm9yKCJleHBlY3RpbmcgZnVuY3Rpb24gaW4gT3BDb2RlIil9Y29uc3VtZU51bWJlck9yU3RyaW5nKCl7bGV0IHQ9dGhpcy5jb2Rlc1t0aGlzLmkrK107cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHxhbih0LCJleHBlY3RpbmcgbnVtYmVyIG9yIHN0cmluZyBpbiBPcENvZGUiKSx0fWNvbnN1bWVOdW1iZXJTdHJpbmdPck1hcmtlcigpe2xldCB0PXRoaXMuY29kZXNbdGhpcy5pKytdO3JldHVybiJzdHJpbmciPT10eXBlb2YgdHx8Im51bWJlciI9PXR5cGVvZiB0fHx0PT1ZdXx8dD09V3V8fGFuKHQsImV4cGVjdGluZyBudW1iZXIsIHN0cmluZywgSUNVX01BUktFUiBvciBFTEVNRU5UX01BUktFUiBpbiBPcENvZGUiKSx0fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3QgeGY9L++/vShcZCspOj9cZCrvv70vZ2ksT2Y9Lyh7XHMq77+9XGQrOj9cZCrvv71ccyosXHMqXFN7Nn1ccyosW1xzXFNdKn0pL2dpLFBmPS/vv70oXGQrKe+/vS8sd2Y9L15ccyoo77+9XGQrOj9cZCrvv70pXHMqLFxzKihzZWxlY3R8cGx1cmFsKVxzKiwvLGtmPS/vv71cLz9cKihcZCs6XGQrKe+/vS9naSxTZj0v77+9KFwvP1sjKl1cZCspOj9cZCrvv70vZ2ksRGY9L1x1RTUwMC9nO2Z1bmN0aW9uIEVmKHQsZSxuLG8saSxhLHIpe2NvbnN0IHM9S2ModCxvLDEsbnVsbCk7bGV0IGw9czw8cXUuU0hJRlQsYz1faSgpO2U9PT1jJiYoYz1udWxsKSxudWxsPT09YyYmKGx8PXF1LkFQUEVORF9FQUdFUkxZKSxyJiYobHw9cXUuQ09NTUVOVCwoZnVuY3Rpb24gZCh0KXt2b2lkIDA9PT1kbCYmKGRsPXQoKSl9KShiZikpLGkucHVzaChsLG51bGw9PT1hPyIiOmEpO2NvbnN0IHA9WGModCxzLHI/MzI6MSxudWxsPT09YT9uZ0Rldk1vZGU/Int7P319IjoiIjphLG51bGwpO1F1KG4scCk7Y29uc3QgbT1wLmluZGV4O3JldHVybiBDaShwLCExKSxudWxsIT09YyYmZSE9PWMmJihmdW5jdGlvbiB1KHQsZSl7bmdEZXZNb2RlJiZ3byh0KTtsZXQgbj10Lmluc2VydEJlZm9yZUluZGV4O251bGw9PT1uPyhJbChLdSxKdSksbj10Lmluc2VydEJlZm9yZUluZGV4PVtudWxsLGVdKToobG4oQXJyYXkuaXNBcnJheShuKSwhMCwiRXhwZWN0aW5nIGFycmF5IGhlcmUiKSxuLnB1c2goZSkpfSkoYyxtKSxwfWZ1bmN0aW9uIFJmKHQsZSxuLG8saSxhLHIpe2NvbnN0IHM9ci5tYXRjaCh4ZiksbD1FZih0LGUsbixhLG8scz9udWxsOnIsITEpO3MmJkFmKGkscixsLmluZGV4LG51bGwsMCxudWxsKX1mdW5jdGlvbiBBZih0LGUsbixvLGksYSl7bmdEZXZNb2RlJiZnbihuLGdvLCJJbmRleCBtdXN0IGJlIGluIGFic29sdXRlIExWaWV3IG9mZnNldCIpO2NvbnN0IHI9dC5sZW5ndGgscz1yKzE7dC5wdXNoKG51bGwsbnVsbCk7Y29uc3QgbD1yKzI7bmdEZXZNb2RlJiZiYyh0LF9mKTtjb25zdCBjPWUuc3BsaXQoeGYpO2xldCBkPTA7Zm9yKGxldCBlPTA7ZTxjLmxlbmd0aDtlKyspe2NvbnN0IG49Y1tlXTtpZigxJmUpe2NvbnN0IGU9aStwYXJzZUludChuLDEwKTt0LnB1c2goLTEtZSksZHw9TmYoZSl9ZWxzZSIiIT09biYmdC5wdXNoKG4pfXJldHVybiB0LnB1c2gobjw8Mnwobz8xOjApKSxvJiZ0LnB1c2gobyxhKSx0W3JdPWQsdFtzXT10Lmxlbmd0aC1sLGR9ZnVuY3Rpb24gVGYodCl7bGV0IGU9MDtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3Qgbz10W25dOyJudW1iZXIiPT10eXBlb2YgbyYmbzwwJiZlKyt9cmV0dXJuIGV9ZnVuY3Rpb24gTmYodCl7cmV0dXJuIDE8PE1hdGgubWluKHQsMzEpfWZ1bmN0aW9uIHpmKHQpe2xldCBlLG4sbz0iIixpPTAsYT0hMTtmb3IoO251bGwhPT0oZT1rZi5leGVjKHQpKTspYT9lWzBdPT09YO+/vS8qJHtufe+/vWAmJihpPWUuaW5kZXgsYT0hMSk6KG8rPXQuc3Vic3RyaW5nKGksZS5pbmRleCtlWzBdLmxlbmd0aCksbj1lWzFdLGE9ITApO3JldHVybiBuZ0Rldk1vZGUmJmxuKGEsITEsYFRhZyBtaXNtYXRjaDogdW5hYmxlIHRvIGZpbmQgdGhlIGVuZCBvZiB0aGUgc3ViLXRlbXBsYXRlIGluIHRoZSB0cmFuc2xhdGlvbiAiJHt0fSJgKSxvKz10LnN1YnN0cihpKSxvfWZ1bmN0aW9uIElmKHQsZSxuLG8saSxhKXtuZ0Rldk1vZGUmJmhuKGksIklDVSBleHByZXNzaW9uIG11c3QgYmUgZGVmaW5lZCIpO2xldCByPTA7Y29uc3Qgcz17dHlwZTppLnR5cGUsY3VycmVudENhc2VMVmlld0luZGV4OktjKHQsZSwxLG51bGwpLGFuY2hvcklkeDphLGNhc2VzOltdLGNyZWF0ZTpbXSxyZW1vdmU6W10sdXBkYXRlOltdfTshKGZ1bmN0aW9uIGwodCxlLG4pe3QucHVzaChOZihlLm1haW5CaW5kaW5nKSwyLC0xLWUubWFpbkJpbmRpbmcsbjw8MnwyKX0pKG4saSxhKSwoZnVuY3Rpb24gYyh0LGUsbil7Y29uc3Qgbz10LmRhdGFbZV07bmdEZXZNb2RlJiZsbihudWxsPT09b3x8by5oYXNPd25Qcm9wZXJ0eSgidFZpZXdzIiksITAsIldlIGV4cGVjdCB0byBnZXQgJ251bGwnfCdUSWN1Q29udGFpbmVyJyIpLG51bGw9PT1vP3QuZGF0YVtlXT1uOihuZ0Rldk1vZGUmJmlhKG8sMzIpLG8udmFsdWU9bil9KSh0LGEscyk7Y29uc3QgZD1pLnZhbHVlcztmb3IobGV0IGE9MDthPGQubGVuZ3RoO2ErKyl7Y29uc3QgbD1kW2FdLGM9W107Zm9yKGxldCB0PTA7dDxsLmxlbmd0aDt0Kyspe2NvbnN0IGU9bFt0XTtpZigic3RyaW5nIiE9dHlwZW9mIGUpe2NvbnN0IG49Yy5wdXNoKGUpLTE7bFt0XT1gXHgzYyEtLe+/vSR7bn3vv70tLVx4M2VgfX1yPUxmKHQscyxlLG4sbyxpLmNhc2VzW2FdLGwuam9pbigiIiksYyl8cn1yJiYoZnVuY3Rpb24gcCh0LGUsbil7dC5wdXNoKGUsMSxuPDwyfDMpfSkobixyLGEpfWZ1bmN0aW9uIEhmKHQpe2NvbnN0IGU9W10sbj1bXTtsZXQgbz0xLGk9MDtjb25zdCBhPUZmKHQ9dC5yZXBsYWNlKHdmLChmdW5jdGlvbih0LGUsbil7cmV0dXJuIG89InNlbGVjdCI9PT1uPzA6MSxpPXBhcnNlSW50KGUuc3Vic3RyKDEpLDEwKSwiIn0pKSk7Zm9yKGxldCB0PTA7dDxhLmxlbmd0aDspe2xldCBpPWFbdCsrXS50cmltKCk7MT09PW8mJihpPWkucmVwbGFjZSgvXHMqKD86PSk/KFx3KylccyovLCIkMSIpKSxpLmxlbmd0aCYmZS5wdXNoKGkpO2NvbnN0IHI9RmYoYVt0KytdKTtlLmxlbmd0aD5uLmxlbmd0aCYmbi5wdXNoKHIpfXJldHVybnt0eXBlOm8sbWFpbkJpbmRpbmc6aSxjYXNlczplLHZhbHVlczpufX1mdW5jdGlvbiBGZih0KXtpZighdClyZXR1cm5bXTtsZXQgZT0wO2NvbnN0IG49W10sbz1bXSxpPS9be31dL2c7bGV0IGE7Zm9yKGkubGFzdEluZGV4PTA7YT1pLmV4ZWModCk7KXtjb25zdCBpPWEuaW5kZXg7aWYoIn0iPT1hWzBdKXtpZihuLnBvcCgpLDA9PW4ubGVuZ3RoKXtjb25zdCBuPXQuc3Vic3RyaW5nKGUsaSk7d2YudGVzdChuKT9vLnB1c2goSGYobikpOm8ucHVzaChuKSxlPWkrMX19ZWxzZXtpZigwPT1uLmxlbmd0aCl7Y29uc3Qgbj10LnN1YnN0cmluZyhlLGkpO28ucHVzaChuKSxlPWkrMX1uLnB1c2goInsiKX19Y29uc3Qgcj10LnN1YnN0cmluZyhlKTtyZXR1cm4gby5wdXNoKHIpLG99ZnVuY3Rpb24gTGYodCxlLG4sbyxpLGEscixzKXtjb25zdCBsPVtdLGM9W10sZD1bXTtuZ0Rldk1vZGUmJihiYyhsLENmKSxiYyhjLE1mKSxiYyhkLF9mKSksZS5jYXNlcy5wdXNoKGEpLGUuY3JlYXRlLnB1c2gobCksZS5yZW1vdmUucHVzaChjKSxlLnVwZGF0ZS5wdXNoKGQpO2NvbnN0IHA9b3MoSm8oKSkuZ2V0SW5lcnRCb2R5RWxlbWVudChyKTtuZ0Rldk1vZGUmJmhuKHAsIlVuYWJsZSB0byBnZW5lcmF0ZSBpbmVydCBib2R5IGVsZW1lbnQiKTtjb25zdCBtPVJzKHApfHxwO3JldHVybiBtP0JmKHQsZSxuLG8sbCxjLGQsbSxpLHMsMCk6MH1mdW5jdGlvbiBCZih0LGUsbixvLGksYSxyLHMsbCxjLGQpe2xldCBwPTAsbT1zLmZpcnN0Q2hpbGQ7Zm9yKDttOyl7Y29uc3Qgcz1LYyh0LG4sMSxudWxsKTtzd2l0Y2gobS5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpjb25zdCB1PW0sZj11LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtpZih5cy5oYXNPd25Qcm9wZXJ0eShmKSl7VWYoaSxXdSxmLGwscyksdC5kYXRhW3NdPWY7Y29uc3QgZz11LmF0dHJpYnV0ZXM7Zm9yKGxldCB0PTA7dDxnLmxlbmd0aDt0Kyspe2NvbnN0IGU9Zy5pdGVtKHQpLG49ZS5uYW1lLnRvTG93ZXJDYXNlKCk7ZS52YWx1ZS5tYXRjaCh4Zik/eHMuaGFzT3duUHJvcGVydHkobik/QWYocixlLnZhbHVlLHMsZS5uYW1lLDAsX3Nbbl0/bHM6Q3Nbbl0/Y3M6bnVsbCk6bmdEZXZNb2RlJiZjb25zb2xlLndhcm4oYFdBUk5JTkc6IGlnbm9yaW5nIHVuc2FmZSBhdHRyaWJ1dGUgdmFsdWUgJHtufSBvbiBlbGVtZW50ICR7Zn0gKHNlZSBodHRwczovL2cuY28vbmcvc2VjdXJpdHkjeHNzKWApOkdmKGkscyxlKX1wPUJmKHQsZSxuLG8saSxhLHIsbSxzLGMsZCsxKXxwLFZmKGEscyxkKX1icmVhaztjYXNlIE5vZGUuVEVYVF9OT0RFOmNvbnN0IGc9bS50ZXh0Q29udGVudHx8IiIsaD1nLm1hdGNoKHhmKTtVZihpLG51bGwsaD8iIjpnLGwscyksVmYoYSxzLGQpLGgmJihwPUFmKHIsZyxzLG51bGwsMCxudWxsKXxwKTticmVhaztjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOmNvbnN0IGI9UGYuZXhlYyhtLnRleHRDb250ZW50fHwiIik7aWYoYil7Y29uc3QgZT1wYXJzZUludChiWzFdLDEwKSxyPWNbZV07VWYoaSxZdSxuZ0Rldk1vZGU/YG5lc3RlZCBJQ1UgJHtlfWA6IiIsbCxzKSxJZih0LG4sbyxsLHIscyksamYoYSxzLGQpfX1tPW0ubmV4dFNpYmxpbmd9cmV0dXJuIHB9ZnVuY3Rpb24gVmYodCxlLG4pezA9PT1uJiZ0LnB1c2goZSl9ZnVuY3Rpb24gamYodCxlLG4pezA9PT1uJiYodC5wdXNoKH5lKSx0LnB1c2goZSkpfWZ1bmN0aW9uIFVmKHQsZSxuLG8saSl7bnVsbCE9PWUmJnQucHVzaChlKSx0LnB1c2gobixpLChmdW5jdGlvbiBhKHQsZSxuKXtyZXR1cm4gbmdEZXZNb2RlJiZnbihlLDAsIk1pc3NpbmcgcGFyZW50IGluZGV4IiksbmdEZXZNb2RlJiZmbihuLDAsIk1pc3NpbmcgcmVmIGluZGV4IiksdHxlPDwxN3xuPDwxfSkoMCxvLGkpKX1mdW5jdGlvbiBHZih0LGUsbil7dC5wdXNoKGU8PDF8MSxuLm5hbWUsbi52YWx1ZSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NvbnN0IFdmPS9cWyjvv70uKz/vv70/KVxdLyxZZj0vXFso77+9Lis/77+9PylcXXwo77+9XC8/XCpcZCs6XGQr77+9KS9nLHFmPS8oe1xzKikoVkFSXyhQTFVSQUx8U0VMRUNUKShfXGQrKT8pKFxzKiwpL2csWmY9L3soW0EtWjAtOV9dKyl9L2csWGY9L++/vUkxOE5fRVhQXyhJQ1UoX1xkKyk/Ke+/vS9nLEtmPS9cL1wqLyxKZj0vXGQrXDooXGQrKS87Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBRZih0LGUsbj0tMSl7Y29uc3Qgbz1naSgpLGk9ZmkoKSxhPWdvK3Q7bmdEZXZNb2RlJiZobihvLCJ0VmlldyBzaG91bGQgYmUgZGVmaW5lZCIpO2NvbnN0IHI9Y2koby5jb25zdHMsZSkscz1faSgpO28uZmlyc3RDcmVhdGVQYXNzJiYoZnVuY3Rpb24gbCh0LGUsbixvLGksYSl7Y29uc3Qgcj1faSgpLHM9W10sbD1bXSxjPVtbXV07bmdEZXZNb2RlJiYoYmMocyx5ZiksYmMobCxfZikpO2NvbnN0IGQ9KGZ1bmN0aW9uIG0odCl7cmV0dXJuIHQucmVwbGFjZShEZiwiICIpfSkoaT0oZnVuY3Rpb24gcCh0LGUpe2lmKChmdW5jdGlvbiBuKHQpe3JldHVybi0xPT09dH0pKGUpKXJldHVybiB6Zih0KTt7Y29uc3Qgbj10LmluZGV4T2YoYDoke2V977+9YCkrMitlLnRvU3RyaW5nKCkubGVuZ3RoLG89dC5zZWFyY2gobmV3IFJlZ0V4cChg77+9XFwvXFwqXFxkKzoke2V977+9YCkpO3JldHVybiB6Zih0LnN1YnN0cmluZyhuLG8pKX19KShpLGEpKS5zcGxpdChTZik7Zm9yKGxldCBhPTA7YTxkLmxlbmd0aDthKyspe2xldCBwPWRbYV07aWYoMD09KDEmYSkpe2NvbnN0IGE9RmYocCk7Zm9yKGxldCBkPTA7ZDxhLmxlbmd0aDtkKyspe2xldCBwPWFbZF07aWYoMD09KDEmZCkpe2NvbnN0IGU9cDtuZ0Rldk1vZGUmJnNuKGUsIlBhcnNlZCBJQ1UgcGFydCBzaG91bGQgYmUgc3RyaW5nIiksIiIhPT1lJiZSZih0LHIsY1swXSxzLGwsbixlKX1lbHNle2NvbnN0IGE9cDtpZigib2JqZWN0IiE9dHlwZW9mIGEpdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgSUNVIGV4cHJlc3Npb24gaW4gIiR7aX0iIG1lc3NhZ2UuYCk7Y29uc3QgZD1FZih0LHIsY1swXSxuLHMsbmdEZXZNb2RlP2BJQ1UgJHtvfToke2EubWFpbkJpbmRpbmd9YDoiIiwhMCkuaW5kZXg7bmdEZXZNb2RlJiZnbihkLGdvLCJJbmRleCBtdXN0IGJlIGluIGFic29sdXRlIExWaWV3IG9mZnNldCIpLElmKHQsbixsLGUsYSxkKX19fWVsc2V7Y29uc3QgZT00Nz09PXAuY2hhckNvZGVBdCgwKSxuPXAuY2hhckNvZGVBdChlPzE6MCk7bmdEZXZNb2RlJiZDbihuLDQyLDM1KTtjb25zdCBvPWdvK051bWJlci5wYXJzZUludChwLnN1YnN0cmluZyhlPzI6MSkpO2lmKGUpYy5zaGlmdCgpLENpKF9pKCksITEpO2Vsc2V7Y29uc3QgZT1hZih0LGNbMF0sbyk7Yy51bnNoaWZ0KFtdKSxDaShlLCEwKX19fXQuZGF0YVtvXT17Y3JlYXRlOnMsdXBkYXRlOmx9fSkobyxudWxsPT09cz8wOnMuaW5kZXgsaSxhLHIsbik7Y29uc3QgYz1vLmRhdGFbYV0sZD1rbChvLHM9PT1pWzZdP251bGw6cyxpKTshKGZ1bmN0aW9uIHAodCxlLG4sbyl7Y29uc3QgaT10WzExXTtmb3IobGV0IGE9MDthPGUubGVuZ3RoO2ErKyl7Y29uc3Qgcj1lW2ErK10scz1lW2FdLGw9KHImcXUuQ09NTUVOVCk9PT1xdS5DT01NRU5ULGM9KHImcXUuQVBQRU5EX0VBR0VSTFkpPT09cXUuQVBQRU5EX0VBR0VSTFksZD1yPj4+cXUuU0hJRlQ7bGV0IHA9dFtkXTtudWxsPT09cCYmKHA9dFtkXT1sP2kuY3JlYXRlQ29tbWVudChzKTp5bChpLHMpKSxjJiZudWxsIT09biYmU2woaSxuLHAsbywhMSl9fSkoaSxjLmNyZWF0ZSxkLHMmJjgmcy50eXBlP2lbcy5pbmRleF06bnVsbCksRWkoITApfWZ1bmN0aW9uICRmKCl7RWkoITEpfWZ1bmN0aW9uIHRnKHQsZSxuKXtRZih0LGUsbiksJGYoKX1mdW5jdGlvbiBlZyh0KXtyZXR1cm4oZnVuY3Rpb24gZSh0KXt0JiYoZGZ8PTE8PE1hdGgubWluKHBmLDMxKSkscGYrK30pKEZwKGZpKCksU2koKSx0KSksZWd9ZnVuY3Rpb24gbmcodCl7IShmdW5jdGlvbiBlKHQsbixvKXtpZihwZj4wKXtuZ0Rldk1vZGUmJmhuKHQsInRWaWV3IHNob3VsZCBiZSBkZWZpbmVkIik7Y29uc3QgZT10LmRhdGFbb107dWYodCxuLEFycmF5LmlzQXJyYXkoZSk/ZTplLnVwZGF0ZSx3aSgpLXBmLTEsZGYpfWRmPTAscGY9MH0pKGdpKCksZmkoKSx0K2dvKX1mdW5jdGlvbiBvZyh0LGU9e30pe3JldHVybihmdW5jdGlvbiBuKHQsZT17fSl7bGV0IG49dDtpZihXZi50ZXN0KHQpKXtjb25zdCB0PXt9LGU9WzBdO249bi5yZXBsYWNlKFlmLCgobixvLGkpPT57Y29uc3QgYT1vfHxpLHI9dFthXXx8W107aWYoci5sZW5ndGh8fChhLnNwbGl0KCJ8IikuZm9yRWFjaCgodD0+e2NvbnN0IGU9dC5tYXRjaChKZiksbj1lP3BhcnNlSW50KGVbMV0sMTApOjAsbz1LZi50ZXN0KHQpO3IucHVzaChbbixvLHRdKX0pKSx0W2FdPXIpLCFyLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYGkxOG4gcG9zdHByb2Nlc3M6IHVubWF0Y2hlZCBwbGFjZWhvbGRlciAtICR7YX1gKTtjb25zdCBzPWVbZS5sZW5ndGgtMV07bGV0IGw9MDtmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrKylpZihyW3RdWzBdPT09cyl7bD10O2JyZWFrfWNvbnN0W2MsZCxwXT1yW2xdO3JldHVybiBkP2UucG9wKCk6cyE9PWMmJmUucHVzaChjKSxyLnNwbGljZShsLDEpLHB9KSl9cmV0dXJuIE9iamVjdC5rZXlzKGUpLmxlbmd0aD8obj1uLnJlcGxhY2UocWYsKCh0LG4sbyxpLGEscik9PmUuaGFzT3duUHJvcGVydHkobyk/YCR7bn0ke2Vbb119JHtyfWA6dCkpLG49bi5yZXBsYWNlKFpmLCgodCxuKT0+ZS5oYXNPd25Qcm9wZXJ0eShuKT9lW25dOnQpKSxuPW4ucmVwbGFjZShYZiwoKHQsbik9PntpZihlLmhhc093blByb3BlcnR5KG4pKXtjb25zdCBvPWVbbl07aWYoIW8ubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgaTE4biBwb3N0cHJvY2VzczogdW5tYXRjaGVkIElDVSAtICR7dH0gd2l0aCBrZXk6ICR7bn1gKTtyZXR1cm4gby5zaGlmdCgpfXJldHVybiB0fSkpLG4pOm59KSh0LGUpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gaWcodCxlLG4sbyxpKXtpZih0PVplKHQpLEFycmF5LmlzQXJyYXkodCkpZm9yKGxldCBhPTA7YTx0Lmxlbmd0aDthKyspaWcodFthXSxlLG4sbyxpKTtlbHNle2NvbnN0IGE9Z2koKSxyPWZpKCk7bGV0IHM9b3AodCk/dDpaZSh0LnByb3ZpZGUpLGw9dHAodCk7Y29uc3QgYz1iaSgpLGQ9MTA0ODU3NSZjLnByb3ZpZGVySW5kZXhlcyxwPWMuZGlyZWN0aXZlU3RhcnQsbT1jLnByb3ZpZGVySW5kZXhlcz4+MjA7aWYob3AodCl8fCF0Lm11bHRpKXtjb25zdCBvPW5ldyBuYShsLGksU20pLHU9c2cocyxlLGk/ZDpkK20scCk7LTE9PT11PyhDYShoYShjLHIpLGEscyksYWcoYSx0LGUubGVuZ3RoKSxlLnB1c2gocyksYy5kaXJlY3RpdmVTdGFydCsrLGMuZGlyZWN0aXZlRW5kKyssaSYmKGMucHJvdmlkZXJJbmRleGVzKz0xMDQ4NTc2KSxuLnB1c2gobyksci5wdXNoKG8pKTooblt1XT1vLHJbdV09byl9ZWxzZXtjb25zdCB1PXNnKHMsZSxkK20scCksZj1zZyhzLGUsZCxkK20pLGc9dT49MCYmblt1XSxoPWY+PTAmJm5bZl07aWYoaSYmIWh8fCFpJiYhZyl7Q2EoaGEoYyxyKSxhLHMpO2NvbnN0IGQ9KGZ1bmN0aW9uIGEodCxlLG4sbyxpKXtjb25zdCBhPW5ldyBuYSh0LG4sU20pO3JldHVybiBhLm11bHRpPVtdLGEuaW5kZXg9ZSxhLmNvbXBvbmVudFByb3ZpZGVycz0wLHJnKGEsaSxvJiYhbiksYX0pKGk/Y2c6bGcsbi5sZW5ndGgsaSxvLGwpOyFpJiZoJiYobltmXS5wcm92aWRlckZhY3Rvcnk9ZCksYWcoYSx0LGUubGVuZ3RoLDApLGUucHVzaChzKSxjLmRpcmVjdGl2ZVN0YXJ0KyssYy5kaXJlY3RpdmVFbmQrKyxpJiYoYy5wcm92aWRlckluZGV4ZXMrPTEwNDg1NzYpLG4ucHVzaChkKSxyLnB1c2goZCl9ZWxzZSBhZyhhLHQsdT4tMT91OmYscmcobltpP2Y6dV0sbCwhaSYmbykpOyFpJiZvJiZoJiZuW2ZdLmNvbXBvbmVudFByb3ZpZGVycysrfX19ZnVuY3Rpb24gYWcodCxlLG4sbyl7Y29uc3QgaT1vcChlKTtpZihpfHwoZnVuY3Rpb24gYSh0KXtyZXR1cm4hIXQudXNlQ2xhc3N9KShlKSl7Y29uc3QgYT0oZS51c2VDbGFzc3x8ZSkucHJvdG90eXBlLm5nT25EZXN0cm95O2lmKGEpe2NvbnN0IHI9dC5kZXN0cm95SG9va3N8fCh0LmRlc3Ryb3lIb29rcz1bXSk7aWYoIWkmJmUubXVsdGkpe25nRGV2TW9kZSYmaG4obywiaW5kZXhJbkZhY3Rvcnkgd2hlbiByZWdpc3RlcmluZyBtdWx0aSBmYWN0b3J5IGRlc3Ryb3kgaG9vayIpO2NvbnN0IHQ9ci5pbmRleE9mKG4pOy0xPT09dD9yLnB1c2gobixbbyxhXSk6clt0KzFdLnB1c2gobyxhKX1lbHNlIHIucHVzaChuLGEpfX19ZnVuY3Rpb24gcmcodCxlLG4pe3JldHVybiBuJiZ0LmNvbXBvbmVudFByb3ZpZGVycysrLHQubXVsdGkucHVzaChlKS0xfWZ1bmN0aW9uIHNnKHQsZSxuLG8pe2ZvcihsZXQgaT1uO2k8bztpKyspaWYoZVtpXT09PXQpcmV0dXJuIGk7cmV0dXJuLTF9ZnVuY3Rpb24gbGcodCxlLG4sbyl7cmV0dXJuIGRnKHRoaXMubXVsdGksW10pfWZ1bmN0aW9uIGNnKHQsZSxuLG8pe2NvbnN0IGk9dGhpcy5tdWx0aTtsZXQgYTtpZih0aGlzLnByb3ZpZGVyRmFjdG9yeSl7Y29uc3QgdD10aGlzLnByb3ZpZGVyRmFjdG9yeS5jb21wb25lbnRQcm92aWRlcnMsZT1TYShuLG5bMV0sdGhpcy5wcm92aWRlckZhY3RvcnkuaW5kZXgsbyk7YT1lLnNsaWNlKDAsdCksZGcoaSxhKTtmb3IobGV0IG49dDtuPGUubGVuZ3RoO24rKylhLnB1c2goZVtuXSl9ZWxzZSBhPVtdLGRnKGksYSk7cmV0dXJuIGF9ZnVuY3Rpb24gZGcodCxlKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyllLnB1c2goKDAsdFtuXSkoKSk7cmV0dXJuIGV9ZnVuY3Rpb24gcGcodCxlPVtdKXtyZXR1cm4gbj0+e24ucHJvdmlkZXJzUmVzb2x2ZXI9KG4sbyk9PihmdW5jdGlvbiBpKHQsZSxuKXtjb25zdCBvPWdpKCk7aWYoby5maXJzdENyZWF0ZVBhc3Mpe2NvbnN0IGk9eG8odCk7aWcobixvLmRhdGEsby5ibHVlcHJpbnQsaSwhMCksaWcoZSxvLmRhdGEsby5ibHVlcHJpbnQsaSwhMSl9fSkobixvP28odCk6dCxlKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIG1ne30KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgdWd7fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KZnVuY3Rpb24gZmcoLi4udCl7fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBnZyh0LGUpe3JldHVybiBuZXcgaGcob2kodCxlKSl9dWcuTlVMTD1uZXcgY2xhc3N7cmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkodCl7dGhyb3coZnVuY3Rpb24gZSh0KXtjb25zdCBlPUVycm9yKGBObyBjb21wb25lbnQgZmFjdG9yeSBmb3VuZCBmb3IgJHtHZSh0KX0uIERpZCB5b3UgYWRkIGl0IHRvIEBOZ01vZHVsZS5lbnRyeUNvbXBvbmVudHM/YCk7cmV0dXJuIGUubmdDb21wb25lbnQ9dCxlfSkodCl9fTtjbGFzcyBoZ3tjb25zdHJ1Y3Rvcih0KXt0aGlzLm5hdGl2ZUVsZW1lbnQ9dH19ZnVuY3Rpb24gYmcodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBoZz90Lm5hdGl2ZUVsZW1lbnQ6dH0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovaGcuX19OR19FTEVNRU5UX0lEX189ZnVuY3Rpb24geWcoKXtyZXR1cm4gZ2coYmkoKSxmaSgpKX0sbmV3IEdhKCJSZW5kZXJlcjJJbnRlcmNlcHRvciIpO2NsYXNzIF9ne31jbGFzcyBDZ3t9Q2cuX19OR19FTEVNRU5UX0lEX189KCk9Pk1nKCk7Y29uc3QgTWc9ZnVuY3Rpb24gdmcoKXtjb25zdCB0PWZpKCksZT1yaShiaSgpLmluZGV4LHQpO3JldHVybihmdW5jdGlvbiBuKHQpe2NvbnN0IGU9dFsxMV07aWYobmdEZXZNb2RlJiYhJG8oZSkpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW5qZWN0IFJlbmRlcmVyMiB3aGVuIHRoZSBhcHBsaWNhdGlvbiB1c2VzIFJlbmRlcmVyMyEiKTtyZXR1cm4gZX0pKHlvKGUpP2U6dCl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLztjbGFzcyB4Z3t9eGcuybVwcm92PU1uKHt0b2tlbjp4Zyxwcm92aWRlZEluOiJyb290IixmYWN0b3J5OigpPT5udWxsfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBPZ3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmZ1bGw9dCx0aGlzLm1ham9yPXQuc3BsaXQoIi4iKVswXSx0aGlzLm1pbm9yPXQuc3BsaXQoIi4iKVsxXSx0aGlzLnBhdGNoPXQuc3BsaXQoIi4iKS5zbGljZSgyKS5qb2luKCIuIil9fWNvbnN0IFBnPW5ldyBPZygiMTIuMi4xIik7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIHdne2NvbnN0cnVjdG9yKCl7fXN1cHBvcnRzKHQpe3JldHVybiBOcCh0KX1jcmVhdGUodCl7cmV0dXJuIG5ldyBTZyh0KX19Y29uc3Qga2c9KHQsZSk9PmU7Y2xhc3MgU2d7Y29uc3RydWN0b3IodCl7dGhpcy5sZW5ndGg9MCx0aGlzLl9saW5rZWRSZWNvcmRzPW51bGwsdGhpcy5fdW5saW5rZWRSZWNvcmRzPW51bGwsdGhpcy5fcHJldmlvdXNJdEhlYWQ9bnVsbCx0aGlzLl9pdEhlYWQ9bnVsbCx0aGlzLl9pdFRhaWw9bnVsbCx0aGlzLl9hZGRpdGlvbnNIZWFkPW51bGwsdGhpcy5fYWRkaXRpb25zVGFpbD1udWxsLHRoaXMuX21vdmVzSGVhZD1udWxsLHRoaXMuX21vdmVzVGFpbD1udWxsLHRoaXMuX3JlbW92YWxzSGVhZD1udWxsLHRoaXMuX3JlbW92YWxzVGFpbD1udWxsLHRoaXMuX2lkZW50aXR5Q2hhbmdlc0hlYWQ9bnVsbCx0aGlzLl9pZGVudGl0eUNoYW5nZXNUYWlsPW51bGwsdGhpcy5fdHJhY2tCeUZuPXR8fGtnfWZvckVhY2hJdGVtKHQpe2xldCBlO2ZvcihlPXRoaXMuX2l0SGVhZDtudWxsIT09ZTtlPWUuX25leHQpdChlKX1mb3JFYWNoT3BlcmF0aW9uKHQpe2xldCBlPXRoaXMuX2l0SGVhZCxuPXRoaXMuX3JlbW92YWxzSGVhZCxvPTAsaT1udWxsO2Zvcig7ZXx8bjspe2NvbnN0IGE9IW58fGUmJmUuY3VycmVudEluZGV4PEFnKG4sbyxpKT9lOm4scj1BZyhhLG8saSkscz1hLmN1cnJlbnRJbmRleDtpZihhPT09bilvLS0sbj1uLl9uZXh0UmVtb3ZlZDtlbHNlIGlmKGU9ZS5fbmV4dCxudWxsPT1hLnByZXZpb3VzSW5kZXgpbysrO2Vsc2V7aXx8KGk9W10pO2NvbnN0IHQ9ci1vLGU9cy1vO2lmKHQhPWUpe2ZvcihsZXQgbj0wO248dDtuKyspe2NvbnN0IG89bjxpLmxlbmd0aD9pW25dOmlbbl09MCxhPW8rbjtlPD1hJiZhPHQmJihpW25dPW8rMSl9aVthLnByZXZpb3VzSW5kZXhdPWUtdH19ciE9PXMmJnQoYSxyLHMpfX1mb3JFYWNoUHJldmlvdXNJdGVtKHQpe2xldCBlO2ZvcihlPXRoaXMuX3ByZXZpb3VzSXRIZWFkO251bGwhPT1lO2U9ZS5fbmV4dFByZXZpb3VzKXQoZSl9Zm9yRWFjaEFkZGVkSXRlbSh0KXtsZXQgZTtmb3IoZT10aGlzLl9hZGRpdGlvbnNIZWFkO251bGwhPT1lO2U9ZS5fbmV4dEFkZGVkKXQoZSl9Zm9yRWFjaE1vdmVkSXRlbSh0KXtsZXQgZTtmb3IoZT10aGlzLl9tb3Zlc0hlYWQ7bnVsbCE9PWU7ZT1lLl9uZXh0TW92ZWQpdChlKX1mb3JFYWNoUmVtb3ZlZEl0ZW0odCl7bGV0IGU7Zm9yKGU9dGhpcy5fcmVtb3ZhbHNIZWFkO251bGwhPT1lO2U9ZS5fbmV4dFJlbW92ZWQpdChlKX1mb3JFYWNoSWRlbnRpdHlDaGFuZ2UodCl7bGV0IGU7Zm9yKGU9dGhpcy5faWRlbnRpdHlDaGFuZ2VzSGVhZDtudWxsIT09ZTtlPWUuX25leHRJZGVudGl0eUNoYW5nZSl0KGUpfWRpZmYodCl7aWYobnVsbD09dCYmKHQ9W10pLCFOcCh0KSl0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHRyeWluZyB0byBkaWZmICcke0dlKHQpfScuIE9ubHkgYXJyYXlzIGFuZCBpdGVyYWJsZXMgYXJlIGFsbG93ZWRgKTtyZXR1cm4gdGhpcy5jaGVjayh0KT90aGlzOm51bGx9b25EZXN0cm95KCl7fWNoZWNrKHQpe3RoaXMuX3Jlc2V0KCk7bGV0IGUsbixvLGk9dGhpcy5faXRIZWFkLGE9ITE7aWYoQXJyYXkuaXNBcnJheSh0KSl7dGhpcy5sZW5ndGg9dC5sZW5ndGg7Zm9yKGxldCBlPTA7ZTx0aGlzLmxlbmd0aDtlKyspbj10W2VdLG89dGhpcy5fdHJhY2tCeUZuKGUsbiksbnVsbCE9PWkmJk9iamVjdC5pcyhpLnRyYWNrQnlJZCxvKT8oYSYmKGk9dGhpcy5fdmVyaWZ5UmVpbnNlcnRpb24oaSxuLG8sZSkpLE9iamVjdC5pcyhpLml0ZW0sbil8fHRoaXMuX2FkZElkZW50aXR5Q2hhbmdlKGksbikpOihpPXRoaXMuX21pc21hdGNoKGksbixvLGUpLGE9ITApLGk9aS5fbmV4dH1lbHNlIGU9MCwoZnVuY3Rpb24gcih0LGUpe2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspZSh0W25dKTtlbHNle2NvbnN0IG49dFtScCgpXSgpO2xldCBvO2Zvcig7IShvPW4ubmV4dCgpKS5kb25lOyllKG8udmFsdWUpfX0pKHQsKHQ9PntvPXRoaXMuX3RyYWNrQnlGbihlLHQpLG51bGwhPT1pJiZPYmplY3QuaXMoaS50cmFja0J5SWQsbyk/KGEmJihpPXRoaXMuX3ZlcmlmeVJlaW5zZXJ0aW9uKGksdCxvLGUpKSxPYmplY3QuaXMoaS5pdGVtLHQpfHx0aGlzLl9hZGRJZGVudGl0eUNoYW5nZShpLHQpKTooaT10aGlzLl9taXNtYXRjaChpLHQsbyxlKSxhPSEwKSxpPWkuX25leHQsZSsrfSkpLHRoaXMubGVuZ3RoPWU7cmV0dXJuIHRoaXMuX3RydW5jYXRlKGkpLHRoaXMuY29sbGVjdGlvbj10LHRoaXMuaXNEaXJ0eX1nZXQgaXNEaXJ0eSgpe3JldHVybiBudWxsIT09dGhpcy5fYWRkaXRpb25zSGVhZHx8bnVsbCE9PXRoaXMuX21vdmVzSGVhZHx8bnVsbCE9PXRoaXMuX3JlbW92YWxzSGVhZHx8bnVsbCE9PXRoaXMuX2lkZW50aXR5Q2hhbmdlc0hlYWR9X3Jlc2V0KCl7aWYodGhpcy5pc0RpcnR5KXtsZXQgdDtmb3IodD10aGlzLl9wcmV2aW91c0l0SGVhZD10aGlzLl9pdEhlYWQ7bnVsbCE9PXQ7dD10Ll9uZXh0KXQuX25leHRQcmV2aW91cz10Ll9uZXh0O2Zvcih0PXRoaXMuX2FkZGl0aW9uc0hlYWQ7bnVsbCE9PXQ7dD10Ll9uZXh0QWRkZWQpdC5wcmV2aW91c0luZGV4PXQuY3VycmVudEluZGV4O2Zvcih0aGlzLl9hZGRpdGlvbnNIZWFkPXRoaXMuX2FkZGl0aW9uc1RhaWw9bnVsbCx0PXRoaXMuX21vdmVzSGVhZDtudWxsIT09dDt0PXQuX25leHRNb3ZlZCl0LnByZXZpb3VzSW5kZXg9dC5jdXJyZW50SW5kZXg7dGhpcy5fbW92ZXNIZWFkPXRoaXMuX21vdmVzVGFpbD1udWxsLHRoaXMuX3JlbW92YWxzSGVhZD10aGlzLl9yZW1vdmFsc1RhaWw9bnVsbCx0aGlzLl9pZGVudGl0eUNoYW5nZXNIZWFkPXRoaXMuX2lkZW50aXR5Q2hhbmdlc1RhaWw9bnVsbH19X21pc21hdGNoKHQsZSxuLG8pe2xldCBpO3JldHVybiBudWxsPT09dD9pPXRoaXMuX2l0VGFpbDooaT10Ll9wcmV2LHRoaXMuX3JlbW92ZSh0KSksbnVsbCE9PSh0PW51bGw9PT10aGlzLl91bmxpbmtlZFJlY29yZHM/bnVsbDp0aGlzLl91bmxpbmtlZFJlY29yZHMuZ2V0KG4sbnVsbCkpPyhPYmplY3QuaXModC5pdGVtLGUpfHx0aGlzLl9hZGRJZGVudGl0eUNoYW5nZSh0LGUpLHRoaXMuX3JlaW5zZXJ0QWZ0ZXIodCxpLG8pKTpudWxsIT09KHQ9bnVsbD09PXRoaXMuX2xpbmtlZFJlY29yZHM/bnVsbDp0aGlzLl9saW5rZWRSZWNvcmRzLmdldChuLG8pKT8oT2JqZWN0LmlzKHQuaXRlbSxlKXx8dGhpcy5fYWRkSWRlbnRpdHlDaGFuZ2UodCxlKSx0aGlzLl9tb3ZlQWZ0ZXIodCxpLG8pKTp0PXRoaXMuX2FkZEFmdGVyKG5ldyBEZyhlLG4pLGksbyksdH1fdmVyaWZ5UmVpbnNlcnRpb24odCxlLG4sbyl7bGV0IGk9bnVsbD09PXRoaXMuX3VubGlua2VkUmVjb3Jkcz9udWxsOnRoaXMuX3VubGlua2VkUmVjb3Jkcy5nZXQobixudWxsKTtyZXR1cm4gbnVsbCE9PWk/dD10aGlzLl9yZWluc2VydEFmdGVyKGksdC5fcHJldixvKTp0LmN1cnJlbnRJbmRleCE9byYmKHQuY3VycmVudEluZGV4PW8sdGhpcy5fYWRkVG9Nb3Zlcyh0LG8pKSx0fV90cnVuY2F0ZSh0KXtmb3IoO251bGwhPT10Oyl7Y29uc3QgZT10Ll9uZXh0O3RoaXMuX2FkZFRvUmVtb3ZhbHModGhpcy5fdW5saW5rKHQpKSx0PWV9bnVsbCE9PXRoaXMuX3VubGlua2VkUmVjb3JkcyYmdGhpcy5fdW5saW5rZWRSZWNvcmRzLmNsZWFyKCksbnVsbCE9PXRoaXMuX2FkZGl0aW9uc1RhaWwmJih0aGlzLl9hZGRpdGlvbnNUYWlsLl9uZXh0QWRkZWQ9bnVsbCksbnVsbCE9PXRoaXMuX21vdmVzVGFpbCYmKHRoaXMuX21vdmVzVGFpbC5fbmV4dE1vdmVkPW51bGwpLG51bGwhPT10aGlzLl9pdFRhaWwmJih0aGlzLl9pdFRhaWwuX25leHQ9bnVsbCksbnVsbCE9PXRoaXMuX3JlbW92YWxzVGFpbCYmKHRoaXMuX3JlbW92YWxzVGFpbC5fbmV4dFJlbW92ZWQ9bnVsbCksbnVsbCE9PXRoaXMuX2lkZW50aXR5Q2hhbmdlc1RhaWwmJih0aGlzLl9pZGVudGl0eUNoYW5nZXNUYWlsLl9uZXh0SWRlbnRpdHlDaGFuZ2U9bnVsbCl9X3JlaW5zZXJ0QWZ0ZXIodCxlLG4pe251bGwhPT10aGlzLl91bmxpbmtlZFJlY29yZHMmJnRoaXMuX3VubGlua2VkUmVjb3Jkcy5yZW1vdmUodCk7Y29uc3Qgbz10Ll9wcmV2UmVtb3ZlZCxpPXQuX25leHRSZW1vdmVkO3JldHVybiBudWxsPT09bz90aGlzLl9yZW1vdmFsc0hlYWQ9aTpvLl9uZXh0UmVtb3ZlZD1pLG51bGw9PT1pP3RoaXMuX3JlbW92YWxzVGFpbD1vOmkuX3ByZXZSZW1vdmVkPW8sdGhpcy5faW5zZXJ0QWZ0ZXIodCxlLG4pLHRoaXMuX2FkZFRvTW92ZXModCxuKSx0fV9tb3ZlQWZ0ZXIodCxlLG4pe3JldHVybiB0aGlzLl91bmxpbmsodCksdGhpcy5faW5zZXJ0QWZ0ZXIodCxlLG4pLHRoaXMuX2FkZFRvTW92ZXModCxuKSx0fV9hZGRBZnRlcih0LGUsbil7cmV0dXJuIHRoaXMuX2luc2VydEFmdGVyKHQsZSxuKSx0aGlzLl9hZGRpdGlvbnNUYWlsPW51bGw9PT10aGlzLl9hZGRpdGlvbnNUYWlsP3RoaXMuX2FkZGl0aW9uc0hlYWQ9dDp0aGlzLl9hZGRpdGlvbnNUYWlsLl9uZXh0QWRkZWQ9dCx0fV9pbnNlcnRBZnRlcih0LGUsbil7Y29uc3Qgbz1udWxsPT09ZT90aGlzLl9pdEhlYWQ6ZS5fbmV4dDtyZXR1cm4gdC5fbmV4dD1vLHQuX3ByZXY9ZSxudWxsPT09bz90aGlzLl9pdFRhaWw9dDpvLl9wcmV2PXQsbnVsbD09PWU/dGhpcy5faXRIZWFkPXQ6ZS5fbmV4dD10LG51bGw9PT10aGlzLl9saW5rZWRSZWNvcmRzJiYodGhpcy5fbGlua2VkUmVjb3Jkcz1uZXcgUmcpLHRoaXMuX2xpbmtlZFJlY29yZHMucHV0KHQpLHQuY3VycmVudEluZGV4PW4sdH1fcmVtb3ZlKHQpe3JldHVybiB0aGlzLl9hZGRUb1JlbW92YWxzKHRoaXMuX3VubGluayh0KSl9X3VubGluayh0KXtudWxsIT09dGhpcy5fbGlua2VkUmVjb3JkcyYmdGhpcy5fbGlua2VkUmVjb3Jkcy5yZW1vdmUodCk7Y29uc3QgZT10Ll9wcmV2LG49dC5fbmV4dDtyZXR1cm4gbnVsbD09PWU/dGhpcy5faXRIZWFkPW46ZS5fbmV4dD1uLG51bGw9PT1uP3RoaXMuX2l0VGFpbD1lOm4uX3ByZXY9ZSx0fV9hZGRUb01vdmVzKHQsZSl7cmV0dXJuIHQucHJldmlvdXNJbmRleD09PWV8fCh0aGlzLl9tb3Zlc1RhaWw9bnVsbD09PXRoaXMuX21vdmVzVGFpbD90aGlzLl9tb3Zlc0hlYWQ9dDp0aGlzLl9tb3Zlc1RhaWwuX25leHRNb3ZlZD10KSx0fV9hZGRUb1JlbW92YWxzKHQpe3JldHVybiBudWxsPT09dGhpcy5fdW5saW5rZWRSZWNvcmRzJiYodGhpcy5fdW5saW5rZWRSZWNvcmRzPW5ldyBSZyksdGhpcy5fdW5saW5rZWRSZWNvcmRzLnB1dCh0KSx0LmN1cnJlbnRJbmRleD1udWxsLHQuX25leHRSZW1vdmVkPW51bGwsbnVsbD09PXRoaXMuX3JlbW92YWxzVGFpbD8odGhpcy5fcmVtb3ZhbHNUYWlsPXRoaXMuX3JlbW92YWxzSGVhZD10LHQuX3ByZXZSZW1vdmVkPW51bGwpOih0Ll9wcmV2UmVtb3ZlZD10aGlzLl9yZW1vdmFsc1RhaWwsdGhpcy5fcmVtb3ZhbHNUYWlsPXRoaXMuX3JlbW92YWxzVGFpbC5fbmV4dFJlbW92ZWQ9dCksdH1fYWRkSWRlbnRpdHlDaGFuZ2UodCxlKXtyZXR1cm4gdC5pdGVtPWUsdGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbD1udWxsPT09dGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbD90aGlzLl9pZGVudGl0eUNoYW5nZXNIZWFkPXQ6dGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbC5fbmV4dElkZW50aXR5Q2hhbmdlPXQsdH19Y2xhc3MgRGd7Y29uc3RydWN0b3IodCxlKXt0aGlzLml0ZW09dCx0aGlzLnRyYWNrQnlJZD1lLHRoaXMuY3VycmVudEluZGV4PW51bGwsdGhpcy5wcmV2aW91c0luZGV4PW51bGwsdGhpcy5fbmV4dFByZXZpb3VzPW51bGwsdGhpcy5fcHJldj1udWxsLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wcmV2RHVwPW51bGwsdGhpcy5fbmV4dER1cD1udWxsLHRoaXMuX3ByZXZSZW1vdmVkPW51bGwsdGhpcy5fbmV4dFJlbW92ZWQ9bnVsbCx0aGlzLl9uZXh0QWRkZWQ9bnVsbCx0aGlzLl9uZXh0TW92ZWQ9bnVsbCx0aGlzLl9uZXh0SWRlbnRpdHlDaGFuZ2U9bnVsbH19Y2xhc3MgRWd7Y29uc3RydWN0b3IoKXt0aGlzLl9oZWFkPW51bGwsdGhpcy5fdGFpbD1udWxsfWFkZCh0KXtudWxsPT09dGhpcy5faGVhZD8odGhpcy5faGVhZD10aGlzLl90YWlsPXQsdC5fbmV4dER1cD1udWxsLHQuX3ByZXZEdXA9bnVsbCk6KHRoaXMuX3RhaWwuX25leHREdXA9dCx0Ll9wcmV2RHVwPXRoaXMuX3RhaWwsdC5fbmV4dER1cD1udWxsLHRoaXMuX3RhaWw9dCl9Z2V0KHQsZSl7bGV0IG47Zm9yKG49dGhpcy5faGVhZDtudWxsIT09bjtuPW4uX25leHREdXApaWYoKG51bGw9PT1lfHxlPD1uLmN1cnJlbnRJbmRleCkmJk9iamVjdC5pcyhuLnRyYWNrQnlJZCx0KSlyZXR1cm4gbjtyZXR1cm4gbnVsbH1yZW1vdmUodCl7Y29uc3QgZT10Ll9wcmV2RHVwLG49dC5fbmV4dER1cDtyZXR1cm4gbnVsbD09PWU/dGhpcy5faGVhZD1uOmUuX25leHREdXA9bixudWxsPT09bj90aGlzLl90YWlsPWU6bi5fcHJldkR1cD1lLG51bGw9PT10aGlzLl9oZWFkfX1jbGFzcyBSZ3tjb25zdHJ1Y3Rvcigpe3RoaXMubWFwPW5ldyBNYXB9cHV0KHQpe2NvbnN0IGU9dC50cmFja0J5SWQ7bGV0IG49dGhpcy5tYXAuZ2V0KGUpO258fChuPW5ldyBFZyx0aGlzLm1hcC5zZXQoZSxuKSksbi5hZGQodCl9Z2V0KHQsZSl7Y29uc3Qgbj10aGlzLm1hcC5nZXQodCk7cmV0dXJuIG4/bi5nZXQodCxlKTpudWxsfXJlbW92ZSh0KXtjb25zdCBlPXQudHJhY2tCeUlkO3JldHVybiB0aGlzLm1hcC5nZXQoZSkucmVtb3ZlKHQpJiZ0aGlzLm1hcC5kZWxldGUoZSksdH1nZXQgaXNFbXB0eSgpe3JldHVybiAwPT09dGhpcy5tYXAuc2l6ZX1jbGVhcigpe3RoaXMubWFwLmNsZWFyKCl9fWZ1bmN0aW9uIEFnKHQsZSxuKXtjb25zdCBvPXQucHJldmlvdXNJbmRleDtpZihudWxsPT09bylyZXR1cm4gbztsZXQgaT0wO3JldHVybiBuJiZvPG4ubGVuZ3RoJiYoaT1uW29dKSxvK2UraX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgVGd7Y29uc3RydWN0b3IoKXt9c3VwcG9ydHModCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBNYXB8fHpwKHQpfWNyZWF0ZSgpe3JldHVybiBuZXcgTmd9fWNsYXNzIE5ne2NvbnN0cnVjdG9yKCl7dGhpcy5fcmVjb3Jkcz1uZXcgTWFwLHRoaXMuX21hcEhlYWQ9bnVsbCx0aGlzLl9hcHBlbmRBZnRlcj1udWxsLHRoaXMuX3ByZXZpb3VzTWFwSGVhZD1udWxsLHRoaXMuX2NoYW5nZXNIZWFkPW51bGwsdGhpcy5fY2hhbmdlc1RhaWw9bnVsbCx0aGlzLl9hZGRpdGlvbnNIZWFkPW51bGwsdGhpcy5fYWRkaXRpb25zVGFpbD1udWxsLHRoaXMuX3JlbW92YWxzSGVhZD1udWxsLHRoaXMuX3JlbW92YWxzVGFpbD1udWxsfWdldCBpc0RpcnR5KCl7cmV0dXJuIG51bGwhPT10aGlzLl9hZGRpdGlvbnNIZWFkfHxudWxsIT09dGhpcy5fY2hhbmdlc0hlYWR8fG51bGwhPT10aGlzLl9yZW1vdmFsc0hlYWR9Zm9yRWFjaEl0ZW0odCl7bGV0IGU7Zm9yKGU9dGhpcy5fbWFwSGVhZDtudWxsIT09ZTtlPWUuX25leHQpdChlKX1mb3JFYWNoUHJldmlvdXNJdGVtKHQpe2xldCBlO2ZvcihlPXRoaXMuX3ByZXZpb3VzTWFwSGVhZDtudWxsIT09ZTtlPWUuX25leHRQcmV2aW91cyl0KGUpfWZvckVhY2hDaGFuZ2VkSXRlbSh0KXtsZXQgZTtmb3IoZT10aGlzLl9jaGFuZ2VzSGVhZDtudWxsIT09ZTtlPWUuX25leHRDaGFuZ2VkKXQoZSl9Zm9yRWFjaEFkZGVkSXRlbSh0KXtsZXQgZTtmb3IoZT10aGlzLl9hZGRpdGlvbnNIZWFkO251bGwhPT1lO2U9ZS5fbmV4dEFkZGVkKXQoZSl9Zm9yRWFjaFJlbW92ZWRJdGVtKHQpe2xldCBlO2ZvcihlPXRoaXMuX3JlbW92YWxzSGVhZDtudWxsIT09ZTtlPWUuX25leHRSZW1vdmVkKXQoZSl9ZGlmZih0KXtpZih0KXtpZighKHQgaW5zdGFuY2VvZiBNYXB8fHpwKHQpKSl0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHRyeWluZyB0byBkaWZmICcke0dlKHQpfScuIE9ubHkgbWFwcyBhbmQgb2JqZWN0cyBhcmUgYWxsb3dlZGApfWVsc2UgdD1uZXcgTWFwO3JldHVybiB0aGlzLmNoZWNrKHQpP3RoaXM6bnVsbH1vbkRlc3Ryb3koKXt9Y2hlY2sodCl7dGhpcy5fcmVzZXQoKTtsZXQgZT10aGlzLl9tYXBIZWFkO2lmKHRoaXMuX2FwcGVuZEFmdGVyPW51bGwsdGhpcy5fZm9yRWFjaCh0LCgodCxuKT0+e2lmKGUmJmUua2V5PT09bil0aGlzLl9tYXliZUFkZFRvQ2hhbmdlcyhlLHQpLHRoaXMuX2FwcGVuZEFmdGVyPWUsZT1lLl9uZXh0O2Vsc2V7Y29uc3Qgbz10aGlzLl9nZXRPckNyZWF0ZVJlY29yZEZvcktleShuLHQpO2U9dGhpcy5faW5zZXJ0QmVmb3JlT3JBcHBlbmQoZSxvKX19KSksZSl7ZS5fcHJldiYmKGUuX3ByZXYuX25leHQ9bnVsbCksdGhpcy5fcmVtb3ZhbHNIZWFkPWU7Zm9yKGxldCB0PWU7bnVsbCE9PXQ7dD10Ll9uZXh0UmVtb3ZlZCl0PT09dGhpcy5fbWFwSGVhZCYmKHRoaXMuX21hcEhlYWQ9bnVsbCksdGhpcy5fcmVjb3Jkcy5kZWxldGUodC5rZXkpLHQuX25leHRSZW1vdmVkPXQuX25leHQsdC5wcmV2aW91c1ZhbHVlPXQuY3VycmVudFZhbHVlLHQuY3VycmVudFZhbHVlPW51bGwsdC5fcHJldj1udWxsLHQuX25leHQ9bnVsbH1yZXR1cm4gdGhpcy5fY2hhbmdlc1RhaWwmJih0aGlzLl9jaGFuZ2VzVGFpbC5fbmV4dENoYW5nZWQ9bnVsbCksdGhpcy5fYWRkaXRpb25zVGFpbCYmKHRoaXMuX2FkZGl0aW9uc1RhaWwuX25leHRBZGRlZD1udWxsKSx0aGlzLmlzRGlydHl9X2luc2VydEJlZm9yZU9yQXBwZW5kKHQsZSl7aWYodCl7Y29uc3Qgbj10Ll9wcmV2O3JldHVybiBlLl9uZXh0PXQsZS5fcHJldj1uLHQuX3ByZXY9ZSxuJiYobi5fbmV4dD1lKSx0PT09dGhpcy5fbWFwSGVhZCYmKHRoaXMuX21hcEhlYWQ9ZSksdGhpcy5fYXBwZW5kQWZ0ZXI9dCx0fXJldHVybiB0aGlzLl9hcHBlbmRBZnRlcj8odGhpcy5fYXBwZW5kQWZ0ZXIuX25leHQ9ZSxlLl9wcmV2PXRoaXMuX2FwcGVuZEFmdGVyKTp0aGlzLl9tYXBIZWFkPWUsdGhpcy5fYXBwZW5kQWZ0ZXI9ZSxudWxsfV9nZXRPckNyZWF0ZVJlY29yZEZvcktleSh0LGUpe2lmKHRoaXMuX3JlY29yZHMuaGFzKHQpKXtjb25zdCBuPXRoaXMuX3JlY29yZHMuZ2V0KHQpO3RoaXMuX21heWJlQWRkVG9DaGFuZ2VzKG4sZSk7Y29uc3Qgbz1uLl9wcmV2LGk9bi5fbmV4dDtyZXR1cm4gbyYmKG8uX25leHQ9aSksaSYmKGkuX3ByZXY9byksbi5fbmV4dD1udWxsLG4uX3ByZXY9bnVsbCxufWNvbnN0IG49bmV3IHpnKHQpO3JldHVybiB0aGlzLl9yZWNvcmRzLnNldCh0LG4pLG4uY3VycmVudFZhbHVlPWUsdGhpcy5fYWRkVG9BZGRpdGlvbnMobiksbn1fcmVzZXQoKXtpZih0aGlzLmlzRGlydHkpe2xldCB0O2Zvcih0aGlzLl9wcmV2aW91c01hcEhlYWQ9dGhpcy5fbWFwSGVhZCx0PXRoaXMuX3ByZXZpb3VzTWFwSGVhZDtudWxsIT09dDt0PXQuX25leHQpdC5fbmV4dFByZXZpb3VzPXQuX25leHQ7Zm9yKHQ9dGhpcy5fY2hhbmdlc0hlYWQ7bnVsbCE9PXQ7dD10Ll9uZXh0Q2hhbmdlZCl0LnByZXZpb3VzVmFsdWU9dC5jdXJyZW50VmFsdWU7Zm9yKHQ9dGhpcy5fYWRkaXRpb25zSGVhZDtudWxsIT10O3Q9dC5fbmV4dEFkZGVkKXQucHJldmlvdXNWYWx1ZT10LmN1cnJlbnRWYWx1ZTt0aGlzLl9jaGFuZ2VzSGVhZD10aGlzLl9jaGFuZ2VzVGFpbD1udWxsLHRoaXMuX2FkZGl0aW9uc0hlYWQ9dGhpcy5fYWRkaXRpb25zVGFpbD1udWxsLHRoaXMuX3JlbW92YWxzSGVhZD1udWxsfX1fbWF5YmVBZGRUb0NoYW5nZXModCxlKXtPYmplY3QuaXMoZSx0LmN1cnJlbnRWYWx1ZSl8fCh0LnByZXZpb3VzVmFsdWU9dC5jdXJyZW50VmFsdWUsdC5jdXJyZW50VmFsdWU9ZSx0aGlzLl9hZGRUb0NoYW5nZXModCkpfV9hZGRUb0FkZGl0aW9ucyh0KXtudWxsPT09dGhpcy5fYWRkaXRpb25zSGVhZD90aGlzLl9hZGRpdGlvbnNIZWFkPXRoaXMuX2FkZGl0aW9uc1RhaWw9dDoodGhpcy5fYWRkaXRpb25zVGFpbC5fbmV4dEFkZGVkPXQsdGhpcy5fYWRkaXRpb25zVGFpbD10KX1fYWRkVG9DaGFuZ2VzKHQpe251bGw9PT10aGlzLl9jaGFuZ2VzSGVhZD90aGlzLl9jaGFuZ2VzSGVhZD10aGlzLl9jaGFuZ2VzVGFpbD10Oih0aGlzLl9jaGFuZ2VzVGFpbC5fbmV4dENoYW5nZWQ9dCx0aGlzLl9jaGFuZ2VzVGFpbD10KX1fZm9yRWFjaCh0LGUpe3QgaW5zdGFuY2VvZiBNYXA/dC5mb3JFYWNoKGUpOk9iamVjdC5rZXlzKHQpLmZvckVhY2goKG49PmUodFtuXSxuKSkpfX1jbGFzcyB6Z3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmtleT10LHRoaXMucHJldmlvdXNWYWx1ZT1udWxsLHRoaXMuY3VycmVudFZhbHVlPW51bGwsdGhpcy5fbmV4dFByZXZpb3VzPW51bGwsdGhpcy5fbmV4dD1udWxsLHRoaXMuX3ByZXY9bnVsbCx0aGlzLl9uZXh0QWRkZWQ9bnVsbCx0aGlzLl9uZXh0UmVtb3ZlZD1udWxsLHRoaXMuX25leHRDaGFuZ2VkPW51bGx9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBJZygpe3JldHVybiBuZXcgSGcoW25ldyB3Z10pfWNsYXNzIEhne2NvbnN0cnVjdG9yKHQpe3RoaXMuZmFjdG9yaWVzPXR9c3RhdGljIGNyZWF0ZSh0LGUpe2lmKG51bGwhPWUpe2NvbnN0IG49ZS5mYWN0b3JpZXMuc2xpY2UoKTt0PXQuY29uY2F0KG4pfXJldHVybiBuZXcgSGcodCl9c3RhdGljIGV4dGVuZCh0KXtyZXR1cm57cHJvdmlkZTpIZyx1c2VGYWN0b3J5OmU9PkhnLmNyZWF0ZSh0LGV8fElnKCkpLGRlcHM6W1tIZyxuZXcgRXIsbmV3IFNyXV19fWZpbmQodCl7Y29uc3QgZT10aGlzLmZhY3Rvcmllcy5maW5kKChlPT5lLnN1cHBvcnRzKHQpKSk7aWYobnVsbCE9ZSlyZXR1cm4gZTt0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIGEgZGlmZmVyIHN1cHBvcnRpbmcgb2JqZWN0ICcke3R9JyBvZiB0eXBlICckeyhmdW5jdGlvbiBuKHQpe3JldHVybiB0Lm5hbWV8fHR5cGVvZiB0fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8pKHQpfSdgKX19ZnVuY3Rpb24gRmcoKXtyZXR1cm4gbmV3IExnKFtuZXcgVGddKX1IZy7JtXByb3Y9TW4oe3Rva2VuOkhnLHByb3ZpZGVkSW46InJvb3QiLGZhY3Rvcnk6SWd9KTtjbGFzcyBMZ3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmZhY3Rvcmllcz10fXN0YXRpYyBjcmVhdGUodCxlKXtpZihlKXtjb25zdCBuPWUuZmFjdG9yaWVzLnNsaWNlKCk7dD10LmNvbmNhdChuKX1yZXR1cm4gbmV3IExnKHQpfXN0YXRpYyBleHRlbmQodCl7cmV0dXJue3Byb3ZpZGU6TGcsdXNlRmFjdG9yeTplPT5MZy5jcmVhdGUodCxlfHxGZygpKSxkZXBzOltbTGcsbmV3IEVyLG5ldyBTcl1dfX1maW5kKHQpe2NvbnN0IGU9dGhpcy5mYWN0b3JpZXMuZmluZCgoZT0+ZS5zdXBwb3J0cyh0KSkpO2lmKGUpcmV0dXJuIGU7dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBhIGRpZmZlciBzdXBwb3J0aW5nIG9iamVjdCAnJHt0fSdgKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBCZyh0LGUsbixvLGk9ITEpe2Zvcig7bnVsbCE9PW47KXtuZ0Rldk1vZGUmJmlhKG4sNjMpO2NvbnN0IGE9ZVtuLmluZGV4XTtpZihudWxsIT09YSYmby5wdXNoKGVpKGEpKSxfbyhhKSlmb3IobGV0IHQ9Ym87dDxhLmxlbmd0aDt0Kyspe2NvbnN0IGU9YVt0XSxuPWVbMV0uZmlyc3RDaGlsZDtudWxsIT09biYmQmcoZVsxXSxlLG4sbyl9Y29uc3Qgcj1uLnR5cGU7aWYoOCZyKUJnKHQsZSxuLmNoaWxkLG8pO2Vsc2UgaWYoMzImcil7Y29uc3QgdD1wbChuLGUpO2xldCBpO2Zvcig7aT10KCk7KW8ucHVzaChpKX1lbHNlIGlmKDE2JnIpe2NvbnN0IHQ9TGwoZSxuKTtpZihBcnJheS5pc0FycmF5KHQpKW8ucHVzaCguLi50KTtlbHNle2NvbnN0IG49bWwoZVsxNl0pO25nRGV2TW9kZSYmSW8obiksQmcoblsxXSxuLHQsbywhMCl9fW49aT9uLnByb2plY3Rpb25OZXh0Om4ubmV4dH1yZXR1cm4gb30KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovTGcuybVwcm92PU1uKHt0b2tlbjpMZyxwcm92aWRlZEluOiJyb290IixmYWN0b3J5OkZnfSk7Y2xhc3MgVmd7Y29uc3RydWN0b3IodCxlKXt0aGlzLl9sVmlldz10LHRoaXMuX2NkUmVmSW5qZWN0aW5nVmlldz1lLHRoaXMuX2FwcFJlZj1udWxsLHRoaXMuX2F0dGFjaGVkVG9WaWV3Q29udGFpbmVyPSExfWdldCByb290Tm9kZXMoKXtjb25zdCB0PXRoaXMuX2xWaWV3LGU9dFsxXTtyZXR1cm4gQmcoZSx0LGUuZmlyc3RDaGlsZCxbXSl9Z2V0IGNvbnRleHQoKXtyZXR1cm4gdGhpcy5fbFZpZXdbOF19c2V0IGNvbnRleHQodCl7dGhpcy5fbFZpZXdbOF09dH1nZXQgZGVzdHJveWVkKCl7cmV0dXJuIDI1Nj09KDI1NiZ0aGlzLl9sVmlld1syXSl9ZGVzdHJveSgpe2lmKHRoaXMuX2FwcFJlZil0aGlzLl9hcHBSZWYuZGV0YWNoVmlldyh0aGlzKTtlbHNlIGlmKHRoaXMuX2F0dGFjaGVkVG9WaWV3Q29udGFpbmVyKXtjb25zdCB0PXRoaXMuX2xWaWV3WzNdO2lmKF9vKHQpKXtjb25zdCBlPXRbOF0sbj1lP2UuaW5kZXhPZih0aGlzKTotMTtuPi0xJiYobmdEZXZNb2RlJiZsbihuLHQuaW5kZXhPZih0aGlzLl9sVmlldyktYm8sIkFuIGF0dGFjaGVkIHZpZXcgc2hvdWxkIGJlIGluIHRoZSBzYW1lIHBvc2l0aW9uIHdpdGhpbiBpdHMgY29udGFpbmVyIGFzIGl0cyBWaWV3UmVmIGluIHRoZSBWSUVXX1JFRlMgYXJyYXkuIikseGwodCxuKSxvcihlLG4pKX10aGlzLl9hdHRhY2hlZFRvVmlld0NvbnRhaW5lcj0hMX1PbCh0aGlzLl9sVmlld1sxXSx0aGlzLl9sVmlldyl9b25EZXN0cm95KHQpe3JkKHRoaXMuX2xWaWV3WzFdLHRoaXMuX2xWaWV3LG51bGwsdCl9bWFya0ZvckNoZWNrKCl7RWQodGhpcy5fY2RSZWZJbmplY3RpbmdWaWV3fHx0aGlzLl9sVmlldyl9ZGV0YWNoKCl7dGhpcy5fbFZpZXdbMl0mPS0xMjl9cmVhdHRhY2goKXt0aGlzLl9sVmlld1syXXw9MTI4fWRldGVjdENoYW5nZXMoKXtBZCh0aGlzLl9sVmlld1sxXSx0aGlzLl9sVmlldyx0aGlzLmNvbnRleHQpfWNoZWNrTm9DaGFuZ2VzKCl7IShmdW5jdGlvbiB0KGUsbixvKXtPaSghMCk7dHJ5e0FkKGUsbixvKX1maW5hbGx5e09pKCExKX19KSh0aGlzLl9sVmlld1sxXSx0aGlzLl9sVmlldyx0aGlzLmNvbnRleHQpfWF0dGFjaFRvVmlld0NvbnRhaW5lclJlZigpe2lmKHRoaXMuX2FwcFJlZil0aHJvdyBuZXcgRXJyb3IoIlRoaXMgdmlldyBpcyBhbHJlYWR5IGF0dGFjaGVkIGRpcmVjdGx5IHRvIHRoZSBBcHBsaWNhdGlvblJlZiEiKTt0aGlzLl9hdHRhY2hlZFRvVmlld0NvbnRhaW5lcj0hMH1kZXRhY2hGcm9tQXBwUmVmKCl7dGhpcy5fYXBwUmVmPW51bGwsKGZ1bmN0aW9uIHQoZSxuKXtVbChlLG4sblsxMV0sMixudWxsLG51bGwpfSkodGhpcy5fbFZpZXdbMV0sdGhpcy5fbFZpZXcpfWF0dGFjaFRvQXBwUmVmKHQpe2lmKHRoaXMuX2F0dGFjaGVkVG9WaWV3Q29udGFpbmVyKXRocm93IG5ldyBFcnJvcigiVGhpcyB2aWV3IGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gYSBWaWV3Q29udGFpbmVyISIpO3RoaXMuX2FwcFJlZj10fX1jbGFzcyBqZyBleHRlbmRzIFZne2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuX3ZpZXc9dH1kZXRlY3RDaGFuZ2VzKCl7VGQodGhpcy5fdmlldyl9Y2hlY2tOb0NoYW5nZXMoKXshKGZ1bmN0aW9uIHQoZSl7T2koITApO3RyeXtUZChlKX1maW5hbGx5e09pKCExKX19KSh0aGlzLl92aWV3KX1nZXQgY29udGV4dCgpe3JldHVybiBudWxsfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgVWd7fVVnLl9fTkdfRUxFTUVOVF9JRF9fPWZ1bmN0aW9uIEdnKHQpe3JldHVybihmdW5jdGlvbiBlKHQsbixvKXtpZihNbyh0KSYmIW8pe2NvbnN0IGU9cmkodC5pbmRleCxuKTtyZXR1cm4gbmV3IFZnKGUsZSl9cmV0dXJuIDQ3JnQudHlwZT9uZXcgVmcoblsxNl0sbik6bnVsbH0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKShiaSgpLGZpKCksMTY9PSgxNiZ0KSl9O2NvbnN0IFdnPVtuZXcgVGddLFlnPVtuZXcgd2ddLHFnPW5ldyBIZyhZZyksWmc9bmV3IExnKFdnKTtjbGFzcyBYZ3t9WGcuX19OR19FTEVNRU5UX0lEX189ZnVuY3Rpb24gS2coKXtyZXR1cm4gJGcoYmkoKSxmaSgpKX07Y29uc3QgSmc9WGcsUWc9Y2xhc3MgZXh0ZW5kcyBKZ3tjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIoKSx0aGlzLl9kZWNsYXJhdGlvbkxWaWV3PXQsdGhpcy5fZGVjbGFyYXRpb25UQ29udGFpbmVyPWUsdGhpcy5lbGVtZW50UmVmPW59Y3JlYXRlRW1iZWRkZWRWaWV3KHQpe2NvbnN0IGU9dGhpcy5fZGVjbGFyYXRpb25UQ29udGFpbmVyLnRWaWV3cyxuPXFjKHRoaXMuX2RlY2xhcmF0aW9uTFZpZXcsZSx0LDE2LG51bGwsZS5kZWNsVE5vZGUsbnVsbCxudWxsLG51bGwsbnVsbCksbz10aGlzLl9kZWNsYXJhdGlvbkxWaWV3W3RoaXMuX2RlY2xhcmF0aW9uVENvbnRhaW5lci5pbmRleF07bmdEZXZNb2RlJiZEbyhvKSxuWzE3XT1vO2NvbnN0IGk9dGhpcy5fZGVjbGFyYXRpb25MVmlld1sxOV07cmV0dXJuIG51bGwhPT1pJiYoblsxOV09aS5jcmVhdGVFbWJlZGRlZFZpZXcoZSkpLEpjKGUsbix0KSxuZXcgVmcobil9fTtmdW5jdGlvbiAkZyh0LGUpe3JldHVybiA0JnQudHlwZT8obmdEZXZNb2RlJiZobih0LnRWaWV3cywiVFZpZXcgbXVzdCBiZSBhbGxvY2F0ZWQiKSxuZXcgUWcoZSx0LGdnKHQsZSkpKTpudWxsfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyB0aHt9Y2xhc3MgZWh7fWVoLl9fTkdfRUxFTUVOVF9JRF9fPWZ1bmN0aW9uIG5oKCl7cmV0dXJuIHNoKGJpKCksZmkoKSl9O2NvbnN0IG9oPWVoLGloPWNsYXNzIGV4dGVuZHMgb2h7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKCksdGhpcy5fbENvbnRhaW5lcj10LHRoaXMuX2hvc3RUTm9kZT1lLHRoaXMuX2hvc3RMVmlldz1ufWdldCBlbGVtZW50KCl7cmV0dXJuIGdnKHRoaXMuX2hvc3RUTm9kZSx0aGlzLl9ob3N0TFZpZXcpfWdldCBpbmplY3Rvcigpe3JldHVybiBuZXcgUmEodGhpcy5faG9zdFROb2RlLHRoaXMuX2hvc3RMVmlldyl9Z2V0IHBhcmVudEluamVjdG9yKCl7Y29uc3QgdD1fYSh0aGlzLl9ob3N0VE5vZGUsdGhpcy5faG9zdExWaWV3KTtpZihkYSh0KSl7Y29uc3QgZT1tYSh0LHRoaXMuX2hvc3RMVmlldyksbj1wYSh0KTtyZXR1cm4gbmdEZXZNb2RlJiZIbyhlLG4pLG5ldyBSYShlWzFdLmRhdGFbbis4XSxlKX1yZXR1cm4gbmV3IFJhKG51bGwsdGhpcy5faG9zdExWaWV3KX1jbGVhcigpe2Zvcig7dGhpcy5sZW5ndGg+MDspdGhpcy5yZW1vdmUodGhpcy5sZW5ndGgtMSl9Z2V0KHQpe2NvbnN0IGU9YWgodGhpcy5fbENvbnRhaW5lcik7cmV0dXJuIG51bGwhPT1lJiZlW3RdfHxudWxsfWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5fbENvbnRhaW5lci5sZW5ndGgtYm99Y3JlYXRlRW1iZWRkZWRWaWV3KHQsZSxuKXtjb25zdCBvPXQuY3JlYXRlRW1iZWRkZWRWaWV3KGV8fHt9KTtyZXR1cm4gdGhpcy5pbnNlcnQobyxuKSxvfWNyZWF0ZUNvbXBvbmVudCh0LGUsbixvLGkpe2NvbnN0IGE9bnx8dGhpcy5wYXJlbnRJbmplY3RvcjtpZighaSYmbnVsbD09dC5uZ01vZHVsZSYmYSl7Y29uc3QgdD1hLmdldCh0aCxudWxsKTt0JiYoaT10KX1jb25zdCByPXQuY3JlYXRlKGEsbyx2b2lkIDAsaSk7cmV0dXJuIHRoaXMuaW5zZXJ0KHIuaG9zdFZpZXcsZSkscn1pbnNlcnQodCxlKXtjb25zdCBuPXQuX2xWaWV3LG89blsxXTtpZihuZ0Rldk1vZGUmJnQuZGVzdHJveWVkKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGluc2VydCBhIGRlc3Ryb3llZCBWaWV3IGluIGEgVmlld0NvbnRhaW5lciEiKTtpZigoZnVuY3Rpb24gaSh0KXtyZXR1cm4gX28odFszXSl9KShuKSl7Y29uc3QgZT10aGlzLmluZGV4T2YodCk7aWYoLTEhPT1lKXRoaXMuZGV0YWNoKGUpO2Vsc2V7Y29uc3QgZT1uWzNdO25nRGV2TW9kZSYmbG4oX28oZSksITAsIkFuIGF0dGFjaGVkIHZpZXcgc2hvdWxkIGhhdmUgaXRzIFBBUkVOVCBwb2ludCB0byBhIGNvbnRhaW5lci4iKTtjb25zdCBvPW5ldyBpaChlLGVbNl0sZVszXSk7by5kZXRhY2goby5pbmRleE9mKHQpKX19Y29uc3QgYT10aGlzLl9hZGp1c3RJbmRleChlKSxyPXRoaXMuX2xDb250YWluZXI7IShmdW5jdGlvbiBzKHQsZSxuLG8pe25nRGV2TW9kZSYmUm8oZSksbmdEZXZNb2RlJiZEbyhuKTtjb25zdCBpPWJvK28sYT1uLmxlbmd0aDtvPjAmJihuW2ktMV1bNF09ZSksbzxhLWJvPyhlWzRdPW5baV0sbnIobixibytvLGUpKToobi5wdXNoKGUpLGVbNF09bnVsbCksZVszXT1uO2NvbnN0IHI9ZVsxN107bnVsbCE9PXImJm4hPT1yJiYoZnVuY3Rpb24gcyh0LGUpe25nRGV2TW9kZSYmaG4oZSwiTFZpZXcgcmVxdWlyZWQiKSxuZ0Rldk1vZGUmJkRvKHQpO2NvbnN0IG49dFs5XSxvPWVbM107bmdEZXZNb2RlJiZEbyhvKTtjb25zdCBpPW9bM11bMTZdO25nRGV2TW9kZSYmaG4oaSwiTWlzc2luZyBpbnNlcnRlZENvbXBvbmVudExWaWV3Iik7Y29uc3QgYT1lWzE2XTtuZ0Rldk1vZGUmJmhuKGEsIk1pc3NpbmcgZGVjbGFyZWRDb21wb25lbnRMVmlldyIpLGEhPT1pJiYodFsyXT0hMCksbnVsbD09PW4/dFs5XT1bZV06bi5wdXNoKGUpfSkocixlKTtjb25zdCBsPWVbMTldO251bGwhPT1sJiZsLmluc2VydFZpZXcodCksZVsyXXw9MTI4fSkobyxuLHIsYSk7Y29uc3QgbD1CbChhLHIpLGM9blsxMV0sZD1SbChjLHJbN10pO3JldHVybiBudWxsIT09ZCYmKGZ1bmN0aW9uIHAodCxlLG4sbyxpLGEpe29bMF09aSxvWzZdPWUsVWwodCxvLG4sMSxpLGEpfSkobyxyWzZdLGMsbixkLGwpLHQuYXR0YWNoVG9WaWV3Q29udGFpbmVyUmVmKCksbnIocmgociksYSx0KSx0fW1vdmUodCxlKXtpZihuZ0Rldk1vZGUmJnQuZGVzdHJveWVkKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IG1vdmUgYSBkZXN0cm95ZWQgVmlldyBpbiBhIFZpZXdDb250YWluZXIhIik7cmV0dXJuIHRoaXMuaW5zZXJ0KHQsZSl9aW5kZXhPZih0KXtjb25zdCBlPWFoKHRoaXMuX2xDb250YWluZXIpO3JldHVybiBudWxsIT09ZT9lLmluZGV4T2YodCk6LTF9cmVtb3ZlKHQpe2NvbnN0IGU9dGhpcy5fYWRqdXN0SW5kZXgodCwtMSksbj14bCh0aGlzLl9sQ29udGFpbmVyLGUpO24mJihvcihyaCh0aGlzLl9sQ29udGFpbmVyKSxlKSxPbChuWzFdLG4pKX1kZXRhY2godCl7Y29uc3QgZT10aGlzLl9hZGp1c3RJbmRleCh0LC0xKSxuPXhsKHRoaXMuX2xDb250YWluZXIsZSk7cmV0dXJuIG4mJm51bGwhPW9yKHJoKHRoaXMuX2xDb250YWluZXIpLGUpP25ldyBWZyhuKTpudWxsfV9hZGp1c3RJbmRleCh0LGU9MCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5sZW5ndGgrZToobmdEZXZNb2RlJiYoZm4odCwtMSxgVmlld1JlZiBpbmRleCBtdXN0IGJlIHBvc2l0aXZlLCBnb3QgJHt0fWApLG1uKHQsdGhpcy5sZW5ndGgrMStlLCJpbmRleCIpKSx0KX19O2Z1bmN0aW9uIGFoKHQpe3JldHVybiB0WzhdfWZ1bmN0aW9uIHJoKHQpe3JldHVybiB0WzhdfHwodFs4XT1bXSl9ZnVuY3Rpb24gc2godCxlKXtsZXQgbjtuZ0Rldk1vZGUmJmlhKHQsMTUpO2NvbnN0IG89ZVt0LmluZGV4XTtpZihfbyhvKSluPW87ZWxzZXtsZXQgaTtpZig4JnQudHlwZSlpPWVpKG8pO2Vsc2V7Y29uc3Qgbj1lWzExXTtuZ0Rldk1vZGUmJm5nRGV2TW9kZS5yZW5kZXJlckNyZWF0ZUNvbW1lbnQrKyxpPW4uY3JlYXRlQ29tbWVudChuZ0Rldk1vZGU/ImNvbnRhaW5lciI6IiIpO2NvbnN0IG89b2kodCxlKTtTbChuLFJsKG4sbyksaSwoZnVuY3Rpb24gaSh0LGUpe3JldHVybiAkbyh0KT90Lm5leHRTaWJsaW5nKGUpOmUubmV4dFNpYmxpbmd9KShuLG8pLCExKX1lW3QuaW5kZXhdPW49UGQobyxlLGksdCksRGQoZSxuKX1yZXR1cm4gbmV3IGloKG4sdCxlKX1jb25zdCBsaD1uZXcgTWFwO2Z1bmN0aW9uIGNoKHQpe2xldCBlPWxoLmdldCh0KTtyZXR1cm4gZXx8KGU9R2UodCkrIl8iK2xoLnNpemUsbGguc2V0KHQsZSkpLGV9Y2gocnApLGNoKEdkKSxjaCh0aCksCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjaChDZyksY2goaGcpLGNoKGVoKSxjaChYZyksY2goVWcpLGNoKHJwKSxjaChHZCk7Y29uc3QgZGg9e307Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIHBoIGV4dGVuZHMgdWd7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLm5nTW9kdWxlPXR9cmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkodCl7bmdEZXZNb2RlJiYoZnVuY3Rpb24gZSh0LG49IlR5cGUgcGFzc2VkIGluIGlzIG5vdCBDb21wb25lbnRUeXBlLCBpdCBkb2VzIG5vdCBoYXZlICfJtWNtcCcgcHJvcGVydHkuIil7cG8odCl8fGJuKG4pfSkodCk7Y29uc3Qgbj1wbyh0KTtyZXR1cm4gbmV3IGZoKG4sdGhpcy5uZ01vZHVsZSl9fWZ1bmN0aW9uIG1oKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmZS5wdXNoKHtwcm9wTmFtZTp0W25dLHRlbXBsYXRlTmFtZTpufSk7cmV0dXJuIGV9Y29uc3QgdWg9bmV3IEdhKCJTQ0hFRFVMRVJfVE9LRU4iLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OigpPT5ubH0pO2NsYXNzIGZoIGV4dGVuZHMgbWd7Y29uc3RydWN0b3IodCxlKXtzdXBlcigpLHRoaXMuY29tcG9uZW50RGVmPXQsdGhpcy5uZ01vZHVsZT1lLHRoaXMuY29tcG9uZW50VHlwZT10LnR5cGUsdGhpcy5zZWxlY3Rvcj0oZnVuY3Rpb24gbih0KXtyZXR1cm4gdC5tYXAoaWMpLmpvaW4oIiwiKX0pKHQuc2VsZWN0b3JzKSx0aGlzLm5nQ29udGVudFNlbGVjdG9ycz10Lm5nQ29udGVudFNlbGVjdG9ycz90Lm5nQ29udGVudFNlbGVjdG9yczpbXSx0aGlzLmlzQm91bmRUb01vZHVsZT0hIWV9Z2V0IGlucHV0cygpe3JldHVybiBtaCh0aGlzLmNvbXBvbmVudERlZi5pbnB1dHMpfWdldCBvdXRwdXRzKCl7cmV0dXJuIG1oKHRoaXMuY29tcG9uZW50RGVmLm91dHB1dHMpfWNyZWF0ZSh0LGUsbixvKXtjb25zdCBpPShvPW98fHRoaXMubmdNb2R1bGUpPyhmdW5jdGlvbiBhKHQsZSl7cmV0dXJue2dldDoobixvLGkpPT57Y29uc3QgYT10LmdldChuLGRoLGkpO3JldHVybiBhIT09ZGh8fG89PT1kaD9hOmUuZ2V0KG4sbyxpKX19fSkodCxvLmluamVjdG9yKTp0LHI9aS5nZXQoX2csdGkpLHM9aS5nZXQoeGcsbnVsbCksbD1yLmNyZWF0ZVJlbmRlcmVyKG51bGwsdGhpcy5jb21wb25lbnREZWYpLGM9dGhpcy5jb21wb25lbnREZWYuc2VsZWN0b3JzWzBdWzBdfHwiZGl2IixkPW4/KGZ1bmN0aW9uIHAodCxlLG4pe2lmKCRvKHQpKXJldHVybiB0LnNlbGVjdFJvb3RFbGVtZW50KGUsbj09PUhuLlNoYWRvd0RvbSk7bGV0IG89InN0cmluZyI9PXR5cGVvZiBlP3QucXVlcnlTZWxlY3RvcihlKTplO3JldHVybiBuZ0Rldk1vZGUmJihmdW5jdGlvbiBpKHQsZSl7aWYoIXQpdGhyb3coZnVuY3Rpb24gbih0LGUpe3JldHVybiBuZXcgRXJyb3IoYFJlbmRlcmVyOiAke3R9IFske3RuKGUpfV1gKX0pKCJzdHJpbmciPT10eXBlb2YgZT8iSG9zdCBub2RlIHdpdGggc2VsZWN0b3Igbm90IGZvdW5kOiI6Ikhvc3Qgbm9kZSBpcyByZXF1aXJlZDoiLGUpfSkobyxlKSxvLnRleHRDb250ZW50PSIiLG99KShsLG4sdGhpcy5jb21wb25lbnREZWYuZW5jYXBzdWxhdGlvbik6TWwoci5jcmVhdGVSZW5kZXJlcihudWxsLHRoaXMuY29tcG9uZW50RGVmKSxjLChmdW5jdGlvbiBtKHQpe2NvbnN0IGU9dC50b0xvd2VyQ2FzZSgpO3JldHVybiJzdmciPT09ZT9abzoibWF0aCI9PT1lP1hvOm51bGx9KShjKSksdT10aGlzLmNvbXBvbmVudERlZi5vblB1c2g/NTc2OjUyOCxmPShmdW5jdGlvbiBnKHQsZSl7cmV0dXJue2NvbXBvbmVudHM6W10sc2NoZWR1bGVyOnR8fG5sLGNsZWFuOklkLHBsYXllckhhbmRsZXI6ZXx8bnVsbCxmbGFnczowfX0pKCksaD1hZCgwLG51bGwsbnVsbCwxLDAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSxiPXFjKG51bGwsaCxmLHUsbnVsbCxudWxsLHIsbCxzLGkpO2xldCB5LF87RmkoYik7dHJ5e2NvbnN0IHQ9KGZ1bmN0aW9uIG8odCxlLG4saSxhLHIpe2NvbnN0IHM9blsxXTtuZ0Rldk1vZGUmJl9uKG4sMjApLG5bMjBdPXQ7Y29uc3QgbD1aYyhzLDIwLDIsIiNob3N0IixudWxsKSxjPWwubWVyZ2VkQXR0cnM9ZS5ob3N0QXR0cnM7bnVsbCE9PWMmJihVZChsLGMsITApLG51bGwhPT10JiYoYWEoYSx0LGMpLG51bGwhPT1sLmNsYXNzZXMmJllsKGEsdCxsLmNsYXNzZXMpLG51bGwhPT1sLnN0eWxlcyYmV2woYSx0LGwuc3R5bGVzKSkpO2NvbnN0IGQ9aS5jcmVhdGVSZW5kZXJlcih0LGUpLHA9cWMobixpZChlKSxudWxsLGUub25QdXNoPzY0OjE2LG5bMjBdLGwsaSxkLHJ8fG51bGwsbnVsbCk7cmV0dXJuIHMuZmlyc3RDcmVhdGVQYXNzJiYoQ2EoaGEobCxuKSxzLGUudHlwZSksZ2QocyxsKSxiZChsLG4ubGVuZ3RoLDEpKSxEZChuLHApLG5bMjBdPXB9KShkLHRoaXMuY29tcG9uZW50RGVmLGIscixsKTtpZihkKWlmKG4pYWEobCxkLFsibmctdmVyc2lvbiIsUGcuZnVsbF0pO2Vsc2V7Y29uc3R7YXR0cnM6dCxjbGFzc2VzOmV9PShmdW5jdGlvbiBuKHQpe2NvbnN0IGU9W10sbj1bXTtsZXQgbz0xLGk9Mjtmb3IoO288dC5sZW5ndGg7KXtsZXQgYT10W29dO2lmKCJzdHJpbmciPT10eXBlb2YgYSkyPT09aT8iIiE9PWEmJmUucHVzaChhLHRbKytvXSk6OD09PWkmJm4ucHVzaChhKTtlbHNle2lmKCEkbChpKSlicmVhaztpPWF9bysrfXJldHVybnthdHRyczplLGNsYXNzZXM6bn19KSh0aGlzLmNvbXBvbmVudERlZi5zZWxlY3RvcnNbMF0pO3QmJmFhKGwsZCx0KSxlJiZlLmxlbmd0aD4wJiZZbChsLGQsZS5qb2luKCIgIikpfWlmKF89aWkoaCxnbyksdm9pZCAwIT09ZSl7Y29uc3QgdD1fLnByb2plY3Rpb249W107Zm9yKGxldCBuPTA7bjx0aGlzLm5nQ29udGVudFNlbGVjdG9ycy5sZW5ndGg7bisrKXtjb25zdCBvPWVbbl07dC5wdXNoKG51bGwhPW8/QXJyYXkuZnJvbShvKTpudWxsKX19eT0oZnVuY3Rpb24gaSh0LGUsbixvLGEpe2NvbnN0IHI9blsxXSxzPShmdW5jdGlvbiBsKHQsZSxuKXtjb25zdCBvPWJpKCk7aWYodC5maXJzdENyZWF0ZVBhc3Mpe24ucHJvdmlkZXJzUmVzb2x2ZXImJm4ucHJvdmlkZXJzUmVzb2x2ZXIobik7Y29uc3QgaT1LYyh0LGUsMSxudWxsKTtuZ0Rldk1vZGUmJmxuKGksby5kaXJlY3RpdmVTdGFydCwiQmVjYXVzZSB0aGlzIGlzIGEgcm9vdCBjb21wb25lbnQgdGhlIGFsbG9jYXRlZCBleHBhbmRvIHNob3VsZCBtYXRjaCB0aGUgVE5vZGUgY29tcG9uZW50LiIpLHlkKHQsbyxlLGksbil9Y29uc3QgaT1TYShlLHQsby5kaXJlY3RpdmVTdGFydCxvKTtMcyhpLGUpO2NvbnN0IGE9b2kobyxlKTtyZXR1cm4gYSYmTHMoYSxlKSxpfSkocixuLGUpO2lmKG8uY29tcG9uZW50cy5wdXNoKHMpLHRbOF09cyxhJiZhLmZvckVhY2goKHQ9PnQocyxlKSkpLGUuY29udGVudFF1ZXJpZXMpe2NvbnN0IHQ9YmkoKTtuZ0Rldk1vZGUmJmhuKHQsIlROb2RlIGV4cGVjdGVkIiksZS5jb250ZW50UXVlcmllcygxLHMsdC5kaXJlY3RpdmVTdGFydCl9Y29uc3QgYz1iaSgpO3JldHVybiBuZ0Rldk1vZGUmJmhuKGMsInROb2RlIHNob3VsZCBoYXZlIGJlZW4gYWxyZWFkeSBjcmVhdGVkIiksIXIuZmlyc3RDcmVhdGVQYXNzfHxudWxsPT09ZS5ob3N0QmluZGluZ3MmJm51bGw9PT1lLmhvc3RBdHRyc3x8KFdpKGMuaW5kZXgpLHVkKG5bMV0sYywwLGMuZGlyZWN0aXZlU3RhcnQsYy5kaXJlY3RpdmVFbmQsZSksZmQoZSxzKSksc30pKHQsdGhpcy5jb21wb25lbnREZWYsYixmLFtNcF0pLEpjKGgsYixudWxsKX1maW5hbGx5e1VpKCl9cmV0dXJuIG5ldyBnaCh0aGlzLmNvbXBvbmVudFR5cGUseSxnZyhfLGIpLGIsXyl9fW5ldyBwaDtjbGFzcyBnaCBleHRlbmRzIGNsYXNze317Y29uc3RydWN0b3IodCxlLG4sbyxpKXtzdXBlcigpLHRoaXMubG9jYXRpb249bix0aGlzLl9yb290TFZpZXc9byx0aGlzLl90Tm9kZT1pLHRoaXMuaW5zdGFuY2U9ZSx0aGlzLmhvc3RWaWV3PXRoaXMuY2hhbmdlRGV0ZWN0b3JSZWY9bmV3IGpnKG8pLHRoaXMuY29tcG9uZW50VHlwZT10fWdldCBpbmplY3Rvcigpe3JldHVybiBuZXcgUmEodGhpcy5fdE5vZGUsdGhpcy5fcm9vdExWaWV3KX1kZXN0cm95KCl7dGhpcy5ob3N0Vmlldy5kZXN0cm95KCl9b25EZXN0cm95KHQpe3RoaXMuaG9zdFZpZXcub25EZXN0cm95KHQpfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gaGgodCxlLG4sbyl7cmV0dXJuIE5uKCgoKT0+e2NvbnN0IGk9dDtudWxsIT09ZSYmKGkuaGFzT3duUHJvcGVydHkoImRlY29yYXRvcnMiKSYmdm9pZCAwIT09aS5kZWNvcmF0b3JzP2kuZGVjb3JhdG9ycy5wdXNoKC4uLmUpOmkuZGVjb3JhdG9ycz1lKSxudWxsIT09biYmKGkuY3RvclBhcmFtZXRlcnM9biksbnVsbCE9PW8mJihpLnByb3BEZWNvcmF0b3JzPWkuaGFzT3duUHJvcGVydHkoInByb3BEZWNvcmF0b3JzIikmJnZvaWQgMCE9PWkucHJvcERlY29yYXRvcnM/T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGkucHJvcERlY29yYXRvcnMpLG8pOm8pfSkpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCBiaD1uZXcgTWFwOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgeWggZXh0ZW5kcyB0aHtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5fcGFyZW50PWUsdGhpcy5fYm9vdHN0cmFwQ29tcG9uZW50cz1bXSx0aGlzLmluamVjdG9yPXRoaXMsdGhpcy5kZXN0cm95Q2JzPVtdLHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyPW5ldyBwaCh0aGlzKTtjb25zdCBuPWZvKHQpO25nRGV2TW9kZSYmaG4obixgTmdNb2R1bGUgJyR7R2UodCl9JyBpcyBub3QgYSBzdWJ0eXBlIG9mICdOZ01vZHVsZVR5cGUnLmApO2NvbnN0IG89KGZ1bmN0aW9uIGkodCl7cmV0dXJuIHRbS25dfHxudWxsfSkodCk7byYmWHUobyksdGhpcy5fYm9vdHN0cmFwQ29tcG9uZW50cz1ybChuLmJvb3RzdHJhcCksdGhpcy5fcjNJbmplY3Rvcj1KZCh0LGUsW3twcm92aWRlOnRoLHVzZVZhbHVlOnRoaXN9LHtwcm92aWRlOnVnLHVzZVZhbHVlOnRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyfV0sR2UodCkpLHRoaXMuX3IzSW5qZWN0b3IuX3Jlc29sdmVJbmplY3RvckRlZlR5cGVzKCksdGhpcy5pbnN0YW5jZT10aGlzLmdldCh0KX1nZXQodCxlPXJwLlRIUk9XX0lGX05PVF9GT1VORCxuPUVuLkRlZmF1bHQpe3JldHVybiB0PT09cnB8fHQ9PT10aHx8dD09PUdkP3RoaXM6dGhpcy5fcjNJbmplY3Rvci5nZXQodCxlLG4pfWRlc3Ryb3koKXtuZ0Rldk1vZGUmJmhuKHRoaXMuZGVzdHJveUNicywiTmdNb2R1bGUgYWxyZWFkeSBkZXN0cm95ZWQiKTtjb25zdCB0PXRoaXMuX3IzSW5qZWN0b3I7IXQuZGVzdHJveWVkJiZ0LmRlc3Ryb3koKSx0aGlzLmRlc3Ryb3lDYnMuZm9yRWFjaCgodD0+dCgpKSksdGhpcy5kZXN0cm95Q2JzPW51bGx9b25EZXN0cm95KHQpe25nRGV2TW9kZSYmaG4odGhpcy5kZXN0cm95Q2JzLCJOZ01vZHVsZSBhbHJlYWR5IGRlc3Ryb3llZCIpLHRoaXMuZGVzdHJveUNicy5wdXNoKHQpfX1jbGFzcyBfaCBleHRlbmRzIGNsYXNze30KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICove2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5tb2R1bGVUeXBlPXQsbnVsbCE9PWZvKHQpJiYoZnVuY3Rpb24gZSh0KXtjb25zdCBlPW5ldyBTZXQ7IShmdW5jdGlvbiB0KG4pe2NvbnN0IG89Zm8obiwhMCksaT1vLmlkO251bGwhPT1pJiYoKGZ1bmN0aW9uIGEodCxlLG4pe2lmKGUmJmUhPT1uKXRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIG1vZHVsZSByZWdpc3RlcmVkIGZvciAke3R9IC0gJHtHZShlKX0gdnMgJHtHZShlLm5hbWUpfWApfSkoaSxiaC5nZXQoaSksbiksYmguc2V0KGksbikpO2NvbnN0IHI9cmwoby5pbXBvcnRzKTtmb3IoY29uc3QgbiBvZiByKWUuaGFzKG4pfHwoZS5hZGQobiksdChuKSl9KSh0KX0pKHQpfWNyZWF0ZSh0KXtyZXR1cm4gbmV3IHloKHRoaXMubW9kdWxlVHlwZSx0KX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIENoKHQsZSxuKXtjb25zdCBvPVBpKCkrdCxpPWZpKCk7cmV0dXJuIGlbb109PT1hYz9JcChpLG8sbj9lLmNhbGwobik6ZSgpKTpIcChpLG8pfWZ1bmN0aW9uIE1oKHQsZSxuLG8pe3JldHVybiBraChmaSgpLFBpKCksdCxlLG4sbyl9ZnVuY3Rpb24gdmgodCxlLG4sbyxpKXtyZXR1cm4gU2goZmkoKSxQaSgpLHQsZSxuLG8saSl9ZnVuY3Rpb24geGgodCxlLG4sbyxpLGEpe3JldHVybiBEaChmaSgpLFBpKCksdCxlLG4sbyxpLGEpfWZ1bmN0aW9uIE9oKHQsZSxuLG8saSxhLHIpe3JldHVybiBFaChmaSgpLFBpKCksdCxlLG4sbyxpLGEscil9ZnVuY3Rpb24gUGgodCxlLG4sbyxpLGEscixzKXtjb25zdCBsPVBpKCkrdCxjPWZpKCksZD1WcChjLGwsbixvLGksYSk7cmV0dXJuIEZwKGMsbCs0LHIpfHxkP0lwKGMsbCs1LHM/ZS5jYWxsKHMsbixvLGksYSxyKTplKG4sbyxpLGEscikpOkhwKGMsbCs1KX1mdW5jdGlvbiB3aCh0LGUpe25nRGV2TW9kZSYmX24odCxlKTtjb25zdCBuPXRbZV07cmV0dXJuIG49PT1hYz92b2lkIDA6bn1mdW5jdGlvbiBraCh0LGUsbixvLGksYSl7Y29uc3Qgcj1lK247cmV0dXJuIEZwKHQscixpKT9JcCh0LHIrMSxhP28uY2FsbChhLGkpOm8oaSkpOndoKHQscisxKX1mdW5jdGlvbiBTaCh0LGUsbixvLGksYSxyKXtjb25zdCBzPWUrbjtyZXR1cm4gTHAodCxzLGksYSk/SXAodCxzKzIscj9vLmNhbGwocixpLGEpOm8oaSxhKSk6d2godCxzKzIpfWZ1bmN0aW9uIERoKHQsZSxuLG8saSxhLHIscyl7Y29uc3QgbD1lK247cmV0dXJuIEJwKHQsbCxpLGEscik/SXAodCxsKzMscz9vLmNhbGwocyxpLGEscik6byhpLGEscikpOndoKHQsbCszKX1mdW5jdGlvbiBFaCh0LGUsbixvLGksYSxyLHMsbCl7Y29uc3QgYz1lK247cmV0dXJuIFZwKHQsYyxpLGEscixzKT9JcCh0LGMrNCxsP28uY2FsbChsLGksYSxyLHMpOm8oaSxhLHIscykpOndoKHQsYys0KX1mdW5jdGlvbiBSaCh0LGUsbixvLGksYSl7bGV0IHI9ZStuLHM9ITE7Zm9yKGxldCBlPTA7ZTxpLmxlbmd0aDtlKyspRnAodCxyKyssaVtlXSkmJihzPSEwKTtyZXR1cm4gcz9JcCh0LHIsby5hcHBseShhLGkpKTp3aCh0LHIpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBBaCh0LGUpe2NvbnN0IG49Z2koKTtsZXQgbztjb25zdCBpPXQrZ287bi5maXJzdENyZWF0ZVBhc3M/KG89KGZ1bmN0aW9uIGEodCxlKXtpZihlKWZvcihsZXQgbj1lLmxlbmd0aC0xO24+PTA7bi0tKXtjb25zdCBvPWVbbl07aWYodD09PW8ubmFtZSlyZXR1cm4gb310aHJvdyBuZXcgS2UoIjMwMiIsYFRoZSBwaXBlICcke3R9JyBjb3VsZCBub3QgYmUgZm91bmQhYCl9KShlLG4ucGlwZVJlZ2lzdHJ5KSxuLmRhdGFbaV09byxvLm9uRGVzdHJveSYmKG4uZGVzdHJveUhvb2tzfHwobi5kZXN0cm95SG9va3M9W10pKS5wdXNoKGksby5vbkRlc3Ryb3kpKTpvPW4uZGF0YVtpXTtjb25zdCByPW8uZmFjdG9yeXx8KG8uZmFjdG9yeT1GbyhvLnR5cGUsITApKSxzPUFuKFNtKTt0cnl7Y29uc3QgdD1mYSghMSksZT1yKCk7cmV0dXJuIGZhKHQpLChmdW5jdGlvbiBsKHQsZSxuLG8pe24+PXQuZGF0YS5sZW5ndGgmJih0LmRhdGFbbl09bnVsbCx0LmJsdWVwcmludFtuXT1udWxsKSxlW25dPW99KShuLGZpKCksaSxlKSxlfWZpbmFsbHl7QW4ocyl9fWZ1bmN0aW9uIFRoKHQsZSxuKXtjb25zdCBvPXQrZ28saT1maSgpLGE9YWkoaSxvKTtyZXR1cm4gSGgoaSxJaChpLG8pP2toKGksUGkoKSxlLGEudHJhbnNmb3JtLG4sYSk6YS50cmFuc2Zvcm0obikpfWZ1bmN0aW9uIE5oKHQsZSxuLG8pe2NvbnN0IGk9dCtnbyxhPWZpKCkscj1haShhLGkpO3JldHVybiBIaChhLEloKGEsaSk/U2goYSxQaSgpLGUsci50cmFuc2Zvcm0sbixvLHIpOnIudHJhbnNmb3JtKG4sbykpfWZ1bmN0aW9uIHpoKHQsZSxuLG8saSl7Y29uc3QgYT10K2dvLHI9ZmkoKSxzPWFpKHIsYSk7cmV0dXJuIEhoKHIsSWgocixhKT9EaChyLFBpKCksZSxzLnRyYW5zZm9ybSxuLG8saSxzKTpzLnRyYW5zZm9ybShuLG8saSkpfWZ1bmN0aW9uIEloKHQsZSl7cmV0dXJuIHRbMV0uZGF0YVtlXS5wdXJlfWZ1bmN0aW9uIEhoKHQsZSl7cmV0dXJuIFRwLmlzV3JhcHBlZChlKSYmKGU9VHAudW53cmFwKGUpLHRbd2koKV09YWMpLGV9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIEZoKHQpe3JldHVybiBlPT57c2V0VGltZW91dCh0LHZvaWQgMCxlKX19Y29uc3QgTGg9Y2xhc3MgZXh0ZW5kcyBJe2NvbnN0cnVjdG9yKHQ9ITEpe3N1cGVyKCksdGhpcy5fX2lzQXN5bmM9dH1lbWl0KHQpe3N1cGVyLm5leHQodCl9c3Vic2NyaWJlKHQsZSxuKXt2YXIgbyxpLGE7bGV0IHI9dCxzPWV8fCgoKT0+bnVsbCksbD1uO2lmKHQmJiJvYmplY3QiPT10eXBlb2YgdCl7Y29uc3QgZT10O3I9bnVsbD09PShvPWUubmV4dCl8fHZvaWQgMD09PW8/dm9pZCAwOm8uYmluZChlKSxzPW51bGw9PT0oaT1lLmVycm9yKXx8dm9pZCAwPT09aT92b2lkIDA6aS5iaW5kKGUpLGw9bnVsbD09PShhPWUuY29tcGxldGUpfHx2b2lkIDA9PT1hP3ZvaWQgMDphLmJpbmQoZSl9dGhpcy5fX2lzQXN5bmMmJihzPUZoKHMpLHImJihyPUZoKHIpKSxsJiYobD1GaChsKSkpO2NvbnN0IGM9c3VwZXIuc3Vic2NyaWJlKHtuZXh0OnIsZXJyb3I6cyxjb21wbGV0ZTpsfSk7cmV0dXJuIHQgaW5zdGFuY2VvZiBtJiZ0LmFkZChjKSxjfX07Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIEJoKCl7cmV0dXJuIHRoaXMuX3Jlc3VsdHNbUnAoKV0oKX1jbGFzcyBWaHtjb25zdHJ1Y3Rvcih0PSExKXt0aGlzLl9lbWl0RGlzdGluY3RDaGFuZ2VzT25seT10LHRoaXMuZGlydHk9ITAsdGhpcy5fcmVzdWx0cz1bXSx0aGlzLl9jaGFuZ2VzRGV0ZWN0ZWQ9ITEsdGhpcy5fY2hhbmdlcz1udWxsLHRoaXMubGVuZ3RoPTAsdGhpcy5maXJzdD12b2lkIDAsdGhpcy5sYXN0PXZvaWQgMDtjb25zdCBlPVJwKCksbj1WaC5wcm90b3R5cGU7bltlXXx8KG5bZV09QmgpfWdldCBjaGFuZ2VzKCl7cmV0dXJuIHRoaXMuX2NoYW5nZXN8fCh0aGlzLl9jaGFuZ2VzPW5ldyBMaCl9Z2V0KHQpe3JldHVybiB0aGlzLl9yZXN1bHRzW3RdfW1hcCh0KXtyZXR1cm4gdGhpcy5fcmVzdWx0cy5tYXAodCl9ZmlsdGVyKHQpe3JldHVybiB0aGlzLl9yZXN1bHRzLmZpbHRlcih0KX1maW5kKHQpe3JldHVybiB0aGlzLl9yZXN1bHRzLmZpbmQodCl9cmVkdWNlKHQsZSl7cmV0dXJuIHRoaXMuX3Jlc3VsdHMucmVkdWNlKHQsZSl9Zm9yRWFjaCh0KXt0aGlzLl9yZXN1bHRzLmZvckVhY2godCl9c29tZSh0KXtyZXR1cm4gdGhpcy5fcmVzdWx0cy5zb21lKHQpfXRvQXJyYXkoKXtyZXR1cm4gdGhpcy5fcmVzdWx0cy5zbGljZSgpfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuX3Jlc3VsdHMudG9TdHJpbmcoKX1yZXNldCh0LGUpe2NvbnN0IG49dGhpcztuLmRpcnR5PSExO2NvbnN0IG89dHIodCk7KHRoaXMuX2NoYW5nZXNEZXRlY3RlZD0hKGZ1bmN0aW9uIGkodCxlLG4pe2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2xldCBpPXRbb10sYT1lW29dO2lmKG4mJihpPW4oaSksYT1uKGEpKSxhIT09aSlyZXR1cm4hMX1yZXR1cm4hMH0pKG4uX3Jlc3VsdHMsbyxlKSkmJihuLl9yZXN1bHRzPW8sbi5sZW5ndGg9by5sZW5ndGgsbi5sYXN0PW9bdGhpcy5sZW5ndGgtMV0sbi5maXJzdD1vWzBdKX1ub3RpZnlPbkNoYW5nZXMoKXshdGhpcy5fY2hhbmdlc3x8IXRoaXMuX2NoYW5nZXNEZXRlY3RlZCYmdGhpcy5fZW1pdERpc3RpbmN0Q2hhbmdlc09ubHl8fHRoaXMuX2NoYW5nZXMuZW1pdCh0aGlzKX1zZXREaXJ0eSgpe3RoaXMuZGlydHk9ITB9ZGVzdHJveSgpe3RoaXMuY2hhbmdlcy5jb21wbGV0ZSgpLHRoaXMuY2hhbmdlcy51bnN1YnNjcmliZSgpfX1jbGFzcyBqaHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnF1ZXJ5TGlzdD10LHRoaXMubWF0Y2hlcz1udWxsfWNsb25lKCl7cmV0dXJuIG5ldyBqaCh0aGlzLnF1ZXJ5TGlzdCl9c2V0RGlydHkoKXt0aGlzLnF1ZXJ5TGlzdC5zZXREaXJ0eSgpfX1jbGFzcyBVaHtjb25zdHJ1Y3Rvcih0PVtdKXt0aGlzLnF1ZXJpZXM9dH1jcmVhdGVFbWJlZGRlZFZpZXcodCl7Y29uc3QgZT10LnF1ZXJpZXM7aWYobnVsbCE9PWUpe2NvbnN0IG49bnVsbCE9PXQuY29udGVudFF1ZXJpZXM/dC5jb250ZW50UXVlcmllc1swXTplLmxlbmd0aCxvPVtdO2ZvcihsZXQgdD0wO3Q8bjt0Kyspe2NvbnN0IG49ZS5nZXRCeUluZGV4KHQpO28ucHVzaCh0aGlzLnF1ZXJpZXNbbi5pbmRleEluRGVjbGFyYXRpb25WaWV3XS5jbG9uZSgpKX1yZXR1cm4gbmV3IFVoKG8pfXJldHVybiBudWxsfWluc2VydFZpZXcodCl7dGhpcy5kaXJ0eVF1ZXJpZXNXaXRoTWF0Y2hlcyh0KX1kZXRhY2hWaWV3KHQpe3RoaXMuZGlydHlRdWVyaWVzV2l0aE1hdGNoZXModCl9ZGlydHlRdWVyaWVzV2l0aE1hdGNoZXModCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnF1ZXJpZXMubGVuZ3RoO2UrKyludWxsIT09b2IodCxlKS5tYXRjaGVzJiZ0aGlzLnF1ZXJpZXNbZV0uc2V0RGlydHkoKX19Y2xhc3MgR2h7Y29uc3RydWN0b3IodCxlLG49bnVsbCl7dGhpcy5wcmVkaWNhdGU9dCx0aGlzLmZsYWdzPWUsdGhpcy5yZWFkPW59fWNsYXNzIFdoe2NvbnN0cnVjdG9yKHQ9W10pe3RoaXMucXVlcmllcz10fWVsZW1lbnRTdGFydCh0LGUpe25nRGV2TW9kZSYmQW8odCwiUXVlcmllcyBzaG91bGQgY29sbGVjdCByZXN1bHRzIG9uIHRoZSBmaXJzdCB0ZW1wbGF0ZSBwYXNzIG9ubHkiKTtmb3IobGV0IG49MDtuPHRoaXMucXVlcmllcy5sZW5ndGg7bisrKXRoaXMucXVlcmllc1tuXS5lbGVtZW50U3RhcnQodCxlKX1lbGVtZW50RW5kKHQpe2ZvcihsZXQgZT0wO2U8dGhpcy5xdWVyaWVzLmxlbmd0aDtlKyspdGhpcy5xdWVyaWVzW2VdLmVsZW1lbnRFbmQodCl9ZW1iZWRkZWRUVmlldyh0KXtsZXQgZT1udWxsO2ZvcihsZXQgbj0wO248dGhpcy5sZW5ndGg7bisrKXtjb25zdCBvPW51bGwhPT1lP2UubGVuZ3RoOjAsaT10aGlzLmdldEJ5SW5kZXgobikuZW1iZWRkZWRUVmlldyh0LG8pO2kmJihpLmluZGV4SW5EZWNsYXJhdGlvblZpZXc9bixudWxsIT09ZT9lLnB1c2goaSk6ZT1baV0pfXJldHVybiBudWxsIT09ZT9uZXcgV2goZSk6bnVsbH10ZW1wbGF0ZSh0LGUpe25nRGV2TW9kZSYmQW8odCwiUXVlcmllcyBzaG91bGQgY29sbGVjdCByZXN1bHRzIG9uIHRoZSBmaXJzdCB0ZW1wbGF0ZSBwYXNzIG9ubHkiKTtmb3IobGV0IG49MDtuPHRoaXMucXVlcmllcy5sZW5ndGg7bisrKXRoaXMucXVlcmllc1tuXS50ZW1wbGF0ZSh0LGUpfWdldEJ5SW5kZXgodCl7cmV0dXJuIG5nRGV2TW9kZSYmX24odGhpcy5xdWVyaWVzLHQpLHRoaXMucXVlcmllc1t0XX1nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMucXVlcmllcy5sZW5ndGh9dHJhY2sodCl7dGhpcy5xdWVyaWVzLnB1c2godCl9fWNsYXNzIFloe2NvbnN0cnVjdG9yKHQsZT0tMSl7dGhpcy5tZXRhZGF0YT10LHRoaXMubWF0Y2hlcz1udWxsLHRoaXMuaW5kZXhJbkRlY2xhcmF0aW9uVmlldz0tMSx0aGlzLmNyb3NzZXNOZ1RlbXBsYXRlPSExLHRoaXMuX2FwcGxpZXNUb05leHROb2RlPSEwLHRoaXMuX2RlY2xhcmF0aW9uTm9kZUluZGV4PWV9ZWxlbWVudFN0YXJ0KHQsZSl7dGhpcy5pc0FwcGx5aW5nVG9Ob2RlKGUpJiZ0aGlzLm1hdGNoVE5vZGUodCxlKX1lbGVtZW50RW5kKHQpe3RoaXMuX2RlY2xhcmF0aW9uTm9kZUluZGV4PT09dC5pbmRleCYmKHRoaXMuX2FwcGxpZXNUb05leHROb2RlPSExKX10ZW1wbGF0ZSh0LGUpe3RoaXMuZWxlbWVudFN0YXJ0KHQsZSl9ZW1iZWRkZWRUVmlldyh0LGUpe3JldHVybiB0aGlzLmlzQXBwbHlpbmdUb05vZGUodCk/KHRoaXMuY3Jvc3Nlc05nVGVtcGxhdGU9ITAsdGhpcy5hZGRNYXRjaCgtdC5pbmRleCxlKSxuZXcgWWgodGhpcy5tZXRhZGF0YSkpOm51bGx9aXNBcHBseWluZ1RvTm9kZSh0KXtpZih0aGlzLl9hcHBsaWVzVG9OZXh0Tm9kZSYmMSE9KDEmdGhpcy5tZXRhZGF0YS5mbGFncykpe2NvbnN0IGU9dGhpcy5fZGVjbGFyYXRpb25Ob2RlSW5kZXg7bGV0IG49dC5wYXJlbnQ7Zm9yKDtudWxsIT09biYmOCZuLnR5cGUmJm4uaW5kZXghPT1lOyluPW4ucGFyZW50O3JldHVybiBlPT09KG51bGwhPT1uP24uaW5kZXg6LTEpfXJldHVybiB0aGlzLl9hcHBsaWVzVG9OZXh0Tm9kZX1tYXRjaFROb2RlKHQsZSl7Y29uc3Qgbj10aGlzLm1ldGFkYXRhLnByZWRpY2F0ZTtpZihBcnJheS5pc0FycmF5KG4pKWZvcihsZXQgbz0wO288bi5sZW5ndGg7bysrKXtjb25zdCBpPW5bb107dGhpcy5tYXRjaFROb2RlV2l0aFJlYWRPcHRpb24odCxlLHFoKGUsaSkpLHRoaXMubWF0Y2hUTm9kZVdpdGhSZWFkT3B0aW9uKHQsZSxrYShlLHQsaSwhMSwhMSkpfWVsc2Ugbj09PVhnPzQmZS50eXBlJiZ0aGlzLm1hdGNoVE5vZGVXaXRoUmVhZE9wdGlvbih0LGUsLTEpOnRoaXMubWF0Y2hUTm9kZVdpdGhSZWFkT3B0aW9uKHQsZSxrYShlLHQsbiwhMSwhMSkpfW1hdGNoVE5vZGVXaXRoUmVhZE9wdGlvbih0LGUsbil7aWYobnVsbCE9PW4pe2NvbnN0IG89dGhpcy5tZXRhZGF0YS5yZWFkO2lmKG51bGwhPT1vKWlmKG89PT1oZ3x8bz09PWVofHxvPT09WGcmJjQmZS50eXBlKXRoaXMuYWRkTWF0Y2goZS5pbmRleCwtMik7ZWxzZXtjb25zdCBuPWthKGUsdCxvLCExLCExKTtudWxsIT09biYmdGhpcy5hZGRNYXRjaChlLmluZGV4LG4pfWVsc2UgdGhpcy5hZGRNYXRjaChlLmluZGV4LG4pfX1hZGRNYXRjaCh0LGUpe251bGw9PT10aGlzLm1hdGNoZXM/dGhpcy5tYXRjaGVzPVt0LGVdOnRoaXMubWF0Y2hlcy5wdXNoKHQsZSl9fWZ1bmN0aW9uIHFoKHQsZSl7Y29uc3Qgbj10LmxvY2FsTmFtZXM7aWYobnVsbCE9PW4pZm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0Kz0yKWlmKG5bdF09PT1lKXJldHVybiBuW3QrMV07cmV0dXJuIG51bGx9ZnVuY3Rpb24gWmgodCxlLG4sbyl7cmV0dXJuLTE9PT1uPyhmdW5jdGlvbiBpKHQsZSl7cmV0dXJuIDExJnQudHlwZT9nZyh0LGUpOjQmdC50eXBlPyRnKHQsZSk6bnVsbH0pKGUsdCk6LTI9PT1uPyhmdW5jdGlvbiBhKHQsZSxuKXtyZXR1cm4gbj09PWhnP2dnKGUsdCk6bj09PVhnPyRnKGUsdCk6bj09PWVoPyhuZ0Rldk1vZGUmJmlhKGUsMTUpLHNoKGUsdCkpOnZvaWQobmdEZXZNb2RlJiZibihgU3BlY2lhbCB0b2tlbiB0byByZWFkIHNob3VsZCBiZSBvbmUgb2YgRWxlbWVudFJlZiwgVGVtcGxhdGVSZWYgb3IgVmlld0NvbnRhaW5lclJlZiBidXQgZ290ICR7R2Uobil9LmApKX0pKHQsZSxvKTpTYSh0LHRbMV0sbixlKX1mdW5jdGlvbiBYaCh0LGUsbixvKXtjb25zdCBpPWVbMTldLnF1ZXJpZXNbb107aWYobnVsbD09PWkubWF0Y2hlcyl7Y29uc3Qgbz10LmRhdGEsYT1uLm1hdGNoZXMscj1bXTtmb3IobGV0IHQ9MDt0PGEubGVuZ3RoO3QrPTIpe2NvbnN0IGk9YVt0XTtpPDA/ci5wdXNoKG51bGwpOihuZ0Rldk1vZGUmJl9uKG8saSksci5wdXNoKFpoKGUsb1tpXSxhW3QrMV0sbi5tZXRhZGF0YS5yZWFkKSkpfWkubWF0Y2hlcz1yfXJldHVybiBpLm1hdGNoZXN9ZnVuY3Rpb24gS2godCxlLG4sbyl7Y29uc3QgaT10LnF1ZXJpZXMuZ2V0QnlJbmRleChuKSxhPWkubWF0Y2hlcztpZihudWxsIT09YSl7Y29uc3Qgcj1YaCh0LGUsaSxuKTtmb3IobGV0IHQ9MDt0PGEubGVuZ3RoO3QrPTIpe2NvbnN0IG49YVt0XTtpZihuPjApby5wdXNoKHJbdC8yXSk7ZWxzZXtjb25zdCBpPWFbdCsxXSxyPWVbLW5dO25nRGV2TW9kZSYmRG8ocik7Zm9yKGxldCB0PWJvO3Q8ci5sZW5ndGg7dCsrKXtjb25zdCBlPXJbdF07ZVsxN109PT1lWzNdJiZLaChlWzFdLGUsaSxvKX1pZihudWxsIT09cls5XSl7Y29uc3QgdD1yWzldO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtjb25zdCBuPXRbZV07S2goblsxXSxuLGksbyl9fX19fXJldHVybiBvfWZ1bmN0aW9uIEpoKHQpe2NvbnN0IGU9ZmkoKSxuPWdpKCksbz1OaSgpO3ppKG8rMSk7Y29uc3QgaT1vYihuLG8pO2lmKHQuZGlydHkmJnNpKGUpPT09KDI9PSgyJmkubWV0YWRhdGEuZmxhZ3MpKSl7aWYobnVsbD09PWkubWF0Y2hlcyl0LnJlc2V0KFtdKTtlbHNle2NvbnN0IGE9aS5jcm9zc2VzTmdUZW1wbGF0ZT9LaChuLGUsbyxbXSk6WGgobixlLGksbyk7dC5yZXNldChhLGJnKSx0Lm5vdGlmeU9uQ2hhbmdlcygpfXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIFFoKHQsZSxuKXtuZ0Rldk1vZGUmJmFuKGUsIkV4cGVjdGluZyBmbGFncyIpO2NvbnN0IG89Z2koKTtvLmZpcnN0Q3JlYXRlUGFzcyYmKG5iKG8sbmV3IEdoKHQsZSxuKSwtMSksMj09KDImZSkmJihvLnN0YXRpY1ZpZXdRdWVyaWVzPSEwKSksZWIobyxmaSgpLGUpfWZ1bmN0aW9uICRoKHQsZSxuLG8pe25nRGV2TW9kZSYmYW4obiwiRXhwZWN0aW5nIGZsYWdzIik7Y29uc3QgaT1naSgpO2lmKGkuZmlyc3RDcmVhdGVQYXNzKXtjb25zdCBhPWJpKCk7bmIoaSxuZXcgR2goZSxuLG8pLGEuaW5kZXgpLChmdW5jdGlvbiBhKHQsZSl7Y29uc3Qgbj10LmNvbnRlbnRRdWVyaWVzfHwodC5jb250ZW50UXVlcmllcz1bXSk7ZSE9PShuLmxlbmd0aD9uW24ubGVuZ3RoLTFdOi0xKSYmbi5wdXNoKHQucXVlcmllcy5sZW5ndGgtMSxlKX0pKGksdCksMj09KDImbikmJihpLnN0YXRpY0NvbnRlbnRRdWVyaWVzPSEwKX1lYihpLGZpKCksbil9ZnVuY3Rpb24gdGIoKXtyZXR1cm4oZnVuY3Rpb24gdChlLG4pe3JldHVybiBuZ0Rldk1vZGUmJmhuKGVbMTldLCJMUXVlcmllcyBzaG91bGQgYmUgZGVmaW5lZCB3aGVuIHRyeWluZyB0byBsb2FkIGEgcXVlcnkiKSxuZ0Rldk1vZGUmJl9uKGVbMTldLnF1ZXJpZXMsbiksZVsxOV0ucXVlcmllc1tuXS5xdWVyeUxpc3R9KShmaSgpLE5pKCkpfWZ1bmN0aW9uIGViKHQsZSxuKXtjb25zdCBvPW5ldyBWaCg0PT0oNCZuKSk7cmQodCxlLG8sby5kZXN0cm95KSxudWxsPT09ZVsxOV0mJihlWzE5XT1uZXcgVWgpLGVbMTldLnF1ZXJpZXMucHVzaChuZXcgamgobykpfWZ1bmN0aW9uIG5iKHQsZSxuKXtudWxsPT09dC5xdWVyaWVzJiYodC5xdWVyaWVzPW5ldyBXaCksdC5xdWVyaWVzLnRyYWNrKG5ldyBZaChlLG4pKX1mdW5jdGlvbiBvYih0LGUpe3JldHVybiBuZ0Rldk1vZGUmJmhuKHQucXVlcmllcywiVFF1ZXJpZXMgbXVzdCBiZSBkZWZpbmVkIHRvIHJldHJpZXZlIGEgVFF1ZXJ5IiksdC5xdWVyaWVzLmdldEJ5SW5kZXgoZSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIGliKHQsZSl7cmV0dXJuICRnKHQsZSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCBhYj17Ism1ybVhdHRyaWJ1dGUiOmpwLCLJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGUxIjpmdW5jdGlvbiB0KGUsbixvLGksYSxyKXtjb25zdCBzPWZpKCksbD1HcChzLG4sbyxpKTtpZihsIT09YWMpe2NvbnN0IHQ9WWkoKTtDZCh0LHMsZSxsLGEsciksbmdEZXZNb2RlJiZ6ZChnaSgpLmRhdGEsdCwiYXR0ci4iK2Usd2koKS0xLG4saSl9cmV0dXJuIHR9LCLJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGUyIjpmdW5jdGlvbiB0KGUsbixvLGksYSxyLHMsbCl7Y29uc3QgYz1maSgpLGQ9V3AoYyxuLG8saSxhLHIpO2lmKGQhPT1hYyl7Y29uc3QgdD1ZaSgpO0NkKHQsYyxlLGQscyxsKSxuZ0Rldk1vZGUmJnpkKGdpKCkuZGF0YSx0LCJhdHRyLiIrZSx3aSgpLTIsbixpLHIpfXJldHVybiB0fSwiybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMyI6ZnVuY3Rpb24gdChlLG4sbyxpLGEscixzLGwsYyxkKXtjb25zdCBwPWZpKCksbT1ZcChwLG4sbyxpLGEscixzLGwpO2lmKG0hPT1hYyl7Y29uc3QgdD1ZaSgpO0NkKHQscCxlLG0sYyxkKSxuZ0Rldk1vZGUmJnpkKGdpKCkuZGF0YSx0LCJhdHRyLiIrZSx3aSgpLTMsbixpLHIsbCl9cmV0dXJuIHR9LCLJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU0IjpmdW5jdGlvbiB0KGUsbixvLGksYSxyLHMsbCxjLGQscCxtKXtjb25zdCB1PWZpKCksZj1xcCh1LG4sbyxpLGEscixzLGwsYyxkKTtpZihmIT09YWMpe2NvbnN0IHQ9WWkoKTtDZCh0LHUsZSxmLHAsbSksbmdEZXZNb2RlJiZ6ZChnaSgpLmRhdGEsdCwiYXR0ci4iK2Usd2koKS00LG4saSxyLGwsZCl9cmV0dXJuIHR9LCLJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU1IjpmdW5jdGlvbiB0KGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZil7Y29uc3QgZz1maSgpLGg9WnAoZyxuLG8saSxhLHIscyxsLGMsZCxwLG0pO2lmKGghPT1hYyl7Y29uc3QgdD1ZaSgpO0NkKHQsZyxlLGgsdSxmKSxuZ0Rldk1vZGUmJnpkKGdpKCkuZGF0YSx0LCJhdHRyLiIrZSx3aSgpLTUsbixpLHIsbCxkLG0pfXJldHVybiB0fSwiybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNiI6ZnVuY3Rpb24gdChlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYsZyxoKXtjb25zdCBiPWZpKCkseT1YcChiLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYpO2lmKHkhPT1hYyl7Y29uc3QgdD1ZaSgpO0NkKHQsYixlLHksZyxoKSxuZ0Rldk1vZGUmJnpkKGdpKCkuZGF0YSx0LCJhdHRyLiIrZSx3aSgpLTYsbixpLHIsbCxkLG0sZil9cmV0dXJuIHR9LCLJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU3IjpmdW5jdGlvbiB0KGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZixnLGgsYix5KXtjb25zdCBfPWZpKCksQz1LcChfLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYsZyxoKTtpZihDIT09YWMpe2NvbnN0IHQ9WWkoKTtDZCh0LF8sZSxDLGIseSksbmdEZXZNb2RlJiZ6ZChnaSgpLmRhdGEsdCwiYXR0ci4iK2Usd2koKS03LG4saSxyLGwsZCxtLGYsaCl9cmV0dXJuIHR9LCLJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU4IjpmdW5jdGlvbiB0KGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZixnLGgsYix5LF8sQyl7Y29uc3QgTT1maSgpLHY9SnAoTSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSxmLGcsaCxiLHkpO2lmKHYhPT1hYyl7Y29uc3QgdD1ZaSgpO0NkKHQsTSxlLHYsXyxDKSxuZ0Rldk1vZGUmJnpkKGdpKCkuZGF0YSx0LCJhdHRyLiIrZSx3aSgpLTgsbixpLHIsbCxkLG0sZixoLHkpfXJldHVybiB0fSwiybXJtWF0dHJpYnV0ZUludGVycG9sYXRlViI6ZnVuY3Rpb24gdChlLG4sbyxpKXtjb25zdCBhPWZpKCkscj1VcChhLG4pO2lmKHIhPT1hYyl7Y29uc3QgdD1ZaSgpO2lmKENkKHQsYSxlLHIsbyxpKSxuZ0Rldk1vZGUpe2NvbnN0IG89W25bMF1dO2ZvcihsZXQgdD0yO3Q8bi5sZW5ndGg7dCs9MilvLnB1c2goblt0XSk7emQoZ2koKS5kYXRhLHQsImF0dHIuIitlLHdpKCktby5sZW5ndGgrMSwuLi5vKX19cmV0dXJuIHR9LCLJtcm1ZGVmaW5lQ29tcG9uZW50Ijp0bywiybXJtWRlZmluZURpcmVjdGl2ZSI6bG8sIsm1ybVkZWZpbmVJbmplY3RhYmxlIjpNbiwiybXJtWRlZmluZUluamVjdG9yIjp2biwiybXJtWRlZmluZU5nTW9kdWxlIjphbywiybXJtWRlZmluZVBpcGUiOmNvLCLJtcm1ZGlyZWN0aXZlSW5qZWN0IjpTbSwiybXJtWdldEluaGVyaXRlZEZhY3RvcnkiOkFhLCLJtcm1aW5qZWN0Ijp2ciwiybXJtWluamVjdEF0dHJpYnV0ZSI6TmEsIsm1ybVpbnZhbGlkRmFjdG9yeSI6ZnVuY3Rpb24gcmIoKXtjb25zdCB0PW5nRGV2TW9kZT8iVGhpcyBjb25zdHJ1Y3RvciB3YXMgbm90IGNvbXBhdGlibGUgd2l0aCBEZXBlbmRlbmN5IEluamVjdGlvbi4iOiJpbnZhbGlkIjt0aHJvdyBuZXcgRXJyb3IodCl9LCLJtcm1aW52YWxpZEZhY3RvcnlEZXAiOnhyLCLJtcm1dGVtcGxhdGVSZWZFeHRyYWN0b3IiOmliLCLJtcm1TmdPbkNoYW5nZXNGZWF0dXJlIjpCbywiybXJtVByb3ZpZGVyc0ZlYXR1cmUiOnBnLCLJtcm1Q29weURlZmluaXRpb25GZWF0dXJlIjpmdW5jdGlvbiBzYih0KXtsZXQgZSxuPXZwKHQudHlwZSk7ZT14byh0KT9uLsm1Y21wOm4uybVkaXI7Y29uc3Qgbz10O2Zvcihjb25zdCB0IG9mIFNwKW9bdF09ZVt0XTtpZih4byhlKSlmb3IoY29uc3QgdCBvZiBEcClvW3RdPWVbdF19LCLJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlIjp4cCwiybXJtW5leHRDb250ZXh0IjpZbSwiybXJtW5hbWVzcGFjZUhUTUwiOlppLCLJtcm1bmFtZXNwYWNlTWF0aE1MIjpmdW5jdGlvbiBsYigpe21pLmxGcmFtZS5jdXJyZW50TmFtZXNwYWNlPVhvfSwiybXJtW5hbWVzcGFjZVNWRyI6cWksIsm1ybVlbmFibGVCaW5kaW5ncyI6ZnVuY3Rpb24gY2IoKXttaS5iaW5kaW5nc0VuYWJsZWQ9ITB9LCLJtcm1ZGlzYWJsZUJpbmRpbmdzIjpmdW5jdGlvbiBkYigpe21pLmJpbmRpbmdzRW5hYmxlZD0hMX0sIsm1ybVlbGVtZW50U3RhcnQiOlJtLCLJtcm1ZWxlbWVudEVuZCI6QW0sIsm1ybVlbGVtZW50IjpUbSwiybXJtWVsZW1lbnRDb250YWluZXJTdGFydCI6Tm0sIsm1ybVlbGVtZW50Q29udGFpbmVyRW5kIjp6bSwiybXJtWVsZW1lbnRDb250YWluZXIiOkltLCLJtcm1cHVyZUZ1bmN0aW9uMCI6Q2gsIsm1ybVwdXJlRnVuY3Rpb24xIjpNaCwiybXJtXB1cmVGdW5jdGlvbjIiOnZoLCLJtcm1cHVyZUZ1bmN0aW9uMyI6eGgsIsm1ybVwdXJlRnVuY3Rpb240IjpPaCwiybXJtXB1cmVGdW5jdGlvbjUiOlBoLCLJtcm1cHVyZUZ1bmN0aW9uNiI6ZnVuY3Rpb24gcGIodCxlLG4sbyxpLGEscixzLGwpe2NvbnN0IGM9UGkoKSt0LGQ9ZmkoKSxwPVZwKGQsYyxuLG8saSxhKTtyZXR1cm4gTHAoZCxjKzQscixzKXx8cD9JcChkLGMrNixsP2UuY2FsbChsLG4sbyxpLGEscixzKTplKG4sbyxpLGEscixzKSk6SHAoZCxjKzYpfSwiybXJtXB1cmVGdW5jdGlvbjciOmZ1bmN0aW9uIG1iKHQsZSxuLG8saSxhLHIscyxsLGMpe2NvbnN0IGQ9UGkoKSt0LHA9ZmkoKTtsZXQgbT1WcChwLGQsbixvLGksYSk7cmV0dXJuIEJwKHAsZCs0LHIscyxsKXx8bT9JcChwLGQrNyxjP2UuY2FsbChjLG4sbyxpLGEscixzLGwpOmUobixvLGksYSxyLHMsbCkpOkhwKHAsZCs3KX0sIsm1ybVwdXJlRnVuY3Rpb244IjpmdW5jdGlvbiB1Yih0LGUsbixvLGksYSxyLHMsbCxjLGQpe2NvbnN0IHA9UGkoKSt0LG09ZmkoKSx1PVZwKG0scCxuLG8saSxhKTtyZXR1cm4gVnAobSxwKzQscixzLGwsYyl8fHU/SXAobSxwKzgsZD9lLmNhbGwoZCxuLG8saSxhLHIscyxsLGMpOmUobixvLGksYSxyLHMsbCxjKSk6SHAobSxwKzgpfSwiybXJtXB1cmVGdW5jdGlvblYiOmZ1bmN0aW9uIGZiKHQsZSxuLG8pe3JldHVybiBSaChmaSgpLFBpKCksdCxlLG4sbyl9LCLJtcm1Z2V0Q3VycmVudFZpZXciOkhtLCLJtcm1cmVzdG9yZVZpZXciOmhpLCLJtcm1bGlzdGVuZXIiOlZtLCLJtcm1cHJvamVjdGlvbiI6WG0sIsm1ybVzeW50aGV0aWNIb3N0UHJvcGVydHkiOk51LCLJtcm1c3ludGhldGljSG9zdExpc3RlbmVyIjpqbSwiybXJtXBpcGVCaW5kMSI6VGgsIsm1ybVwaXBlQmluZDIiOk5oLCLJtcm1cGlwZUJpbmQzIjp6aCwiybXJtXBpcGVCaW5kNCI6ZnVuY3Rpb24gZ2IodCxlLG4sbyxpLGEpe2NvbnN0IHI9dCtnbyxzPWZpKCksbD1haShzLHIpO3JldHVybiBIaChzLEloKHMscik/RWgocyxQaSgpLGUsbC50cmFuc2Zvcm0sbixvLGksYSxsKTpsLnRyYW5zZm9ybShuLG8saSxhKSl9LCLJtcm1cGlwZUJpbmRWIjpmdW5jdGlvbiBoYih0LGUsbil7Y29uc3Qgbz10K2dvLGk9ZmkoKSxhPWFpKGksbyk7cmV0dXJuIEhoKGksSWgoaSxvKT9SaChpLFBpKCksZSxhLnRyYW5zZm9ybSxuLGEpOmEudHJhbnNmb3JtLmFwcGx5KGEsbikpfSwiybXJtXByb2plY3Rpb25EZWYiOlptLCLJtcm1aG9zdFByb3BlcnR5IjpUdSwiybXJtXByb3BlcnR5IjpEbSwiybXJtXByb3BlcnR5SW50ZXJwb2xhdGUiOkttLCLJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTEiOkptLCLJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTIiOmZ1bmN0aW9uIHQoZSxuLG8saSxhLHIscyl7Y29uc3QgbD1maSgpLGM9V3AobCxuLG8saSxhLHIpO2lmKGMhPT1hYyl7Y29uc3QgdD1naSgpLG89WWkoKTtsZCh0LG8sbCxlLGMsbFsxMV0scywhMSksbmdEZXZNb2RlJiZ6ZCh0LmRhdGEsbyxlLHdpKCktMixuLGkscil9cmV0dXJuIHR9LCLJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTMiOmZ1bmN0aW9uIHQoZSxuLG8saSxhLHIscyxsLGMpe2NvbnN0IGQ9ZmkoKSxwPVlwKGQsbixvLGksYSxyLHMsbCk7aWYocCE9PWFjKXtjb25zdCB0PWdpKCksbz1ZaSgpO2xkKHQsbyxkLGUscCxkWzExXSxjLCExKSxuZ0Rldk1vZGUmJnpkKHQuZGF0YSxvLGUsd2koKS0zLG4saSxyLGwpfXJldHVybiB0fSwiybXJtXByb3BlcnR5SW50ZXJwb2xhdGU0IjpmdW5jdGlvbiB0KGUsbixvLGksYSxyLHMsbCxjLGQscCl7Y29uc3QgbT1maSgpLHU9cXAobSxuLG8saSxhLHIscyxsLGMsZCk7aWYodSE9PWFjKXtjb25zdCB0PWdpKCksbz1ZaSgpO2xkKHQsbyxtLGUsdSxtWzExXSxwLCExKSxuZ0Rldk1vZGUmJnpkKHQuZGF0YSxvLGUsd2koKS00LG4saSxyLGwsZCl9cmV0dXJuIHR9LCLJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTUiOmZ1bmN0aW9uIHQoZSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSl7Y29uc3QgZj1maSgpLGc9WnAoZixuLG8saSxhLHIscyxsLGMsZCxwLG0pO2lmKGchPT1hYyl7Y29uc3QgdD1naSgpLG89WWkoKTtsZCh0LG8sZixlLGcsZlsxMV0sdSwhMSksbmdEZXZNb2RlJiZ6ZCh0LmRhdGEsbyxlLHdpKCktNSxuLGkscixsLGQsbSl9cmV0dXJuIHR9LCLJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTYiOmZ1bmN0aW9uIHQoZSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSxmLGcpe2NvbnN0IGg9ZmkoKSxiPVhwKGgsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZik7aWYoYiE9PWFjKXtjb25zdCB0PWdpKCksbz1ZaSgpO2xkKHQsbyxoLGUsYixoWzExXSxnLCExKSxuZ0Rldk1vZGUmJnpkKHQuZGF0YSxvLGUsd2koKS02LG4saSxyLGwsZCxtLGYpfXJldHVybiB0fSwiybXJtXByb3BlcnR5SW50ZXJwb2xhdGU3IjpmdW5jdGlvbiB0KGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZixnLGgsYil7Y29uc3QgeT1maSgpLF89S3AoeSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSxmLGcsaCk7aWYoXyE9PWFjKXtjb25zdCB0PWdpKCksbz1ZaSgpO2xkKHQsbyx5LGUsXyx5WzExXSxiLCExKSxuZ0Rldk1vZGUmJnpkKHQuZGF0YSxvLGUsd2koKS03LG4saSxyLGwsZCxtLGYsaCl9cmV0dXJuIHR9LCLJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTgiOmZ1bmN0aW9uIHQoZSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSxmLGcsaCxiLHksXyl7Y29uc3QgQz1maSgpLE09SnAoQyxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSxmLGcsaCxiLHkpO2lmKE0hPT1hYyl7Y29uc3QgdD1naSgpLG89WWkoKTtsZCh0LG8sQyxlLE0sQ1sxMV0sXywhMSksbmdEZXZNb2RlJiZ6ZCh0LmRhdGEsbyxlLHdpKCktOCxuLGkscixsLGQsbSxmLGgseSl9cmV0dXJuIHR9LCLJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZVYiOmZ1bmN0aW9uIHQoZSxuLG8pe2NvbnN0IGk9ZmkoKSxhPVVwKGksbik7aWYoYSE9PWFjKXtjb25zdCB0PWdpKCkscj1ZaSgpO2lmKGxkKHQscixpLGUsYSxpWzExXSxvLCExKSxuZ0Rldk1vZGUpe2NvbnN0IG89W25bMF1dO2ZvcihsZXQgdD0yO3Q8bi5sZW5ndGg7dCs9MilvLnB1c2goblt0XSk7emQodC5kYXRhLHIsZSx3aSgpLW8ubGVuZ3RoKzEsLi4ubyl9fXJldHVybiB0fSwiybXJtXBpcGUiOkFoLCLJtcm1cXVlcnlSZWZyZXNoIjpKaCwiybXJtXZpZXdRdWVyeSI6UWgsIsm1ybVsb2FkUXVlcnkiOnRiLCLJtcm1Y29udGVudFF1ZXJ5IjokaCwiybXJtXJlZmVyZW5jZSI6JHAsIsm1ybVjbGFzc01hcCI6ZnUsIsm1ybVjbGFzc01hcEludGVycG9sYXRlMSI6QXUsIsm1ybVjbGFzc01hcEludGVycG9sYXRlMiI6ZnVuY3Rpb24gYmIodCxlLG4sbyxpKXtidShhcixndSxXcChmaSgpLHQsZSxuLG8saSksITApfSwiybXJtWNsYXNzTWFwSW50ZXJwb2xhdGUzIjpmdW5jdGlvbiB5Yih0LGUsbixvLGksYSxyKXtidShhcixndSxZcChmaSgpLHQsZSxuLG8saSxhLHIpLCEwKX0sIsm1ybVjbGFzc01hcEludGVycG9sYXRlNCI6ZnVuY3Rpb24gX2IodCxlLG4sbyxpLGEscixzLGwpe2J1KGFyLGd1LHFwKGZpKCksdCxlLG4sbyxpLGEscixzLGwpLCEwKX0sIsm1ybVjbGFzc01hcEludGVycG9sYXRlNSI6ZnVuY3Rpb24gQ2IodCxlLG4sbyxpLGEscixzLGwsYyxkKXtidShhcixndSxacChmaSgpLHQsZSxuLG8saSxhLHIscyxsLGMsZCksITApfSwiybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU2IjpmdW5jdGlvbiBNYih0LGUsbixvLGksYSxyLHMsbCxjLGQscCxtKXtidShhcixndSxYcChmaSgpLHQsZSxuLG8saSxhLHIscyxsLGMsZCxwLG0pLCEwKX0sIsm1ybVjbGFzc01hcEludGVycG9sYXRlNyI6ZnVuY3Rpb24gdmIodCxlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYpe2J1KGFyLGd1LEtwKGZpKCksdCxlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYpLCEwKX0sIsm1ybVjbGFzc01hcEludGVycG9sYXRlOCI6ZnVuY3Rpb24geGIodCxlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYsZyxoKXtidShhcixndSxKcChmaSgpLHQsZSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSxmLGcsaCksITApfSwiybXJtWNsYXNzTWFwSW50ZXJwb2xhdGVWIjpmdW5jdGlvbiBPYih0KXtidShhcixndSxVcChmaSgpLHQpLCEwKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovLCLJtcm1c3R5bGVNYXAiOm11LCLJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTEiOmZ1bmN0aW9uIFBiKHQsZSxuKXttdShHcChmaSgpLHQsZSxuKSl9LCLJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTIiOmZ1bmN0aW9uIHdiKHQsZSxuLG8saSl7bXUoV3AoZmkoKSx0LGUsbixvLGkpKX0sIsm1ybVzdHlsZU1hcEludGVycG9sYXRlMyI6ZnVuY3Rpb24ga2IodCxlLG4sbyxpLGEscil7bXUoWXAoZmkoKSx0LGUsbixvLGksYSxyKSl9LCLJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTQiOmZ1bmN0aW9uIFNiKHQsZSxuLG8saSxhLHIscyxsKXttdShxcChmaSgpLHQsZSxuLG8saSxhLHIscyxsKSl9LCLJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTUiOmZ1bmN0aW9uIERiKHQsZSxuLG8saSxhLHIscyxsLGMsZCl7bXUoWnAoZmkoKSx0LGUsbixvLGksYSxyLHMsbCxjLGQpKX0sIsm1ybVzdHlsZU1hcEludGVycG9sYXRlNiI6ZnVuY3Rpb24gRWIodCxlLG4sbyxpLGEscixzLGwsYyxkLHAsbSl7bXUoWHAoZmkoKSx0LGUsbixvLGksYSxyLHMsbCxjLGQscCxtKSl9LCLJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTciOmZ1bmN0aW9uIFJiKHQsZSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSxmKXttdShLcChmaSgpLHQsZSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSxmKSl9LCLJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTgiOmZ1bmN0aW9uIEFiKHQsZSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSxmLGcsaCl7bXUoSnAoZmkoKSx0LGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZixnLGgpKX0sIsm1ybVzdHlsZU1hcEludGVycG9sYXRlViI6ZnVuY3Rpb24gVGIodCl7bXUoVXAoZmkoKSx0KSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLywiybXJtXN0eWxlUHJvcCI6ZHUsIsm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTEiOmZ1bmN0aW9uIHQoZSxuLG8saSxhKXtyZXR1cm4gaHUoZSxHcChmaSgpLG4sbyxpKSxhLCExKSx0fSwiybXJtXN0eWxlUHJvcEludGVycG9sYXRlMiI6ZnVuY3Rpb24gdChlLG4sbyxpLGEscixzKXtyZXR1cm4gaHUoZSxXcChmaSgpLG4sbyxpLGEscikscywhMSksdH0sIsm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTMiOmZ1bmN0aW9uIHQoZSxuLG8saSxhLHIscyxsLGMpe3JldHVybiBodShlLFlwKGZpKCksbixvLGksYSxyLHMsbCksYywhMSksdH0sIsm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTQiOmZ1bmN0aW9uIHQoZSxuLG8saSxhLHIscyxsLGMsZCxwKXtyZXR1cm4gaHUoZSxxcChmaSgpLG4sbyxpLGEscixzLGwsYyxkKSxwLCExKSx0fSwiybXJtXN0eWxlUHJvcEludGVycG9sYXRlNSI6ZnVuY3Rpb24gdChlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1KXtyZXR1cm4gaHUoZSxacChmaSgpLG4sbyxpLGEscixzLGwsYyxkLHAsbSksdSwhMSksdH0sIsm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTYiOmZ1bmN0aW9uIHQoZSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSxmLGcpe3JldHVybiBodShlLFhwKGZpKCksbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZiksZywhMSksdH0sIsm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTciOmZ1bmN0aW9uIHQoZSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSxmLGcsaCxiKXtyZXR1cm4gaHUoZSxLcChmaSgpLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYsZyxoKSxiLCExKSx0fSwiybXJtXN0eWxlUHJvcEludGVycG9sYXRlOCI6ZnVuY3Rpb24gdChlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYsZyxoLGIseSxfKXtyZXR1cm4gaHUoZSxKcChmaSgpLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYsZyxoLGIseSksXywhMSksdH0sIsm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZVYiOmZ1bmN0aW9uIHQoZSxuLG8pe3JldHVybiBodShlLFVwKGZpKCksbiksbywhMSksdH0sIsm1ybVjbGFzc1Byb3AiOnB1LCLJtcm1YWR2YW5jZSI6cmMsIsm1ybV0ZW1wbGF0ZSI6UXAsIsm1ybV0ZXh0IjprdSwiybXJtXRleHRJbnRlcnBvbGF0ZSI6U3UsIsm1ybV0ZXh0SW50ZXJwb2xhdGUxIjpEdSwiybXJtXRleHRJbnRlcnBvbGF0ZTIiOkV1LCLJtcm1dGV4dEludGVycG9sYXRlMyI6UnUsIsm1ybV0ZXh0SW50ZXJwb2xhdGU0IjpmdW5jdGlvbiB0KGUsbixvLGksYSxyLHMsbCxjKXtjb25zdCBkPWZpKCkscD1xcChkLGUsbixvLGksYSxyLHMsbCxjKTtyZXR1cm4gcCE9PWFjJiZqZChkLEdpKCkscCksdH0sIsm1ybV0ZXh0SW50ZXJwb2xhdGU1IjpmdW5jdGlvbiB0KGUsbixvLGksYSxyLHMsbCxjLGQscCl7Y29uc3QgbT1maSgpLHU9WnAobSxlLG4sbyxpLGEscixzLGwsYyxkLHApO3JldHVybiB1IT09YWMmJmpkKG0sR2koKSx1KSx0fSwiybXJtXRleHRJbnRlcnBvbGF0ZTYiOmZ1bmN0aW9uIHQoZSxuLG8saSxhLHIscyxsLGMsZCxwLG0sdSl7Y29uc3QgZj1maSgpLGc9WHAoZixlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1KTtyZXR1cm4gZyE9PWFjJiZqZChmLEdpKCksZyksdH0sIsm1ybV0ZXh0SW50ZXJwb2xhdGU3IjpmdW5jdGlvbiB0KGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZixnKXtjb25zdCBoPWZpKCksYj1LcChoLGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZixnKTtyZXR1cm4gYiE9PWFjJiZqZChoLEdpKCksYiksdH0sIsm1ybV0ZXh0SW50ZXJwb2xhdGU4IjpmdW5jdGlvbiB0KGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZixnLGgsYil7Y29uc3QgeT1maSgpLF89SnAoeSxlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYsZyxoLGIpO3JldHVybiBfIT09YWMmJmpkKHksR2koKSxfKSx0fSwiybXJtXRleHRJbnRlcnBvbGF0ZVYiOmZ1bmN0aW9uIHQoZSl7Y29uc3Qgbj1maSgpLG89VXAobixlKTtyZXR1cm4gbyE9PWFjJiZqZChuLEdpKCksbyksdH0sIsm1ybVpMThuIjp0ZywiybXJtWkxOG5BdHRyaWJ1dGVzIjpmdW5jdGlvbiBOYih0LGUpe2NvbnN0IG49Z2koKTtuZ0Rldk1vZGUmJmhuKG4sInRWaWV3IHNob3VsZCBiZSBkZWZpbmVkIik7Y29uc3Qgbz1jaShuLmNvbnN0cyxlKTshKGZ1bmN0aW9uIGkodCxlLG4pe2NvbnN0IG89YmkoKS5pbmRleCxpPVtdO2lmKG5nRGV2TW9kZSYmYmMoaSxfZiksdC5maXJzdENyZWF0ZVBhc3MmJm51bGw9PT10LmRhdGFbZV0pe2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCs9Mil7Y29uc3QgZT1uW3RdLGE9blt0KzFdO2lmKCIiIT09YSl7aWYoT2YudGVzdChhKSl0aHJvdyBuZXcgRXJyb3IoYElDVSBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZCBpbiBhdHRyaWJ1dGVzLiBNZXNzYWdlOiAiJHthfSIuYCk7QWYoaSxhLG8sZSxUZihpKSxudWxsKX19dC5kYXRhW2VdPWl9fSkobix0K2dvLG8pfSwiybXJtWkxOG5FeHAiOmVnLCLJtcm1aTE4blN0YXJ0IjpRZiwiybXJtWkxOG5FbmQiOiRmLCLJtcm1aTE4bkFwcGx5IjpuZywiybXJtWkxOG5Qb3N0cHJvY2VzcyI6b2csIsm1ybVyZXNvbHZlV2luZG93IjpvbCwiybXJtXJlc29sdmVEb2N1bWVudCI6aWwsIsm1ybVyZXNvbHZlQm9keSI6ZnVuY3Rpb24gemIodCl7cmV0dXJuIHQub3duZXJEb2N1bWVudC5ib2R5fSwiybXJtXNldENvbXBvbmVudFNjb3BlIjplbywiybXJtXNldE5nTW9kdWxlU2NvcGUiOnJvLCLJtcm1c2FuaXRpemVIdG1sIjoKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmZ1bmN0aW9uIEliKHQpe2NvbnN0IGU9enMoKTtyZXR1cm4gZT9XcihlLnNhbml0aXplKEFzLkhUTUwsdCl8fCIiKTplcyh0LCJIVE1MIik/V3IodHModCkpOkVzKEpvKCksJGUodCkpfSwiybXJtXNhbml0aXplU3R5bGUiOmZ1bmN0aW9uIEhiKHQpe2NvbnN0IGU9enMoKTtyZXR1cm4gZT9lLnNhbml0aXplKEFzLlNUWUxFLHQpfHwiIjplcyh0LCJTdHlsZSIpP3RzKHQpOiRlKHQpfSwiybXJtXNhbml0aXplUmVzb3VyY2VVcmwiOk5zLCLJtcm1c2FuaXRpemVTY3JpcHQiOmZ1bmN0aW9uIEZiKHQpe2NvbnN0IGU9enMoKTtpZihlKXJldHVybiBZcihlLnNhbml0aXplKEFzLlNDUklQVCx0KXx8IiIpO2lmKGVzKHQsIlNjcmlwdCIpKXJldHVybiBZcih0cyh0KSk7dGhyb3cgbmV3IEVycm9yKCJ1bnNhZmUgdmFsdWUgdXNlZCBpbiBhIHNjcmlwdCBjb250ZXh0Iil9LCLJtcm1c2FuaXRpemVVcmwiOlRzLCLJtcm1c2FuaXRpemVVcmxPclJlc291cmNlVXJsIjpmdW5jdGlvbiBMYih0LGUsbil7cmV0dXJuKGZ1bmN0aW9uIG8odCxlKXtyZXR1cm4ic3JjIj09PWUmJigiZW1iZWQiPT09dHx8ImZyYW1lIj09PXR8fCJpZnJhbWUiPT09dHx8Im1lZGlhIj09PXR8fCJzY3JpcHQiPT09dCl8fCJocmVmIj09PWUmJigiYmFzZSI9PT10fHwibGluayI9PT10KT9OczpUc30pKGUsbikodCl9LCLJtcm1dHJ1c3RDb25zdGFudEh0bWwiOmZ1bmN0aW9uIEJiKHQpe2lmKG5nRGV2TW9kZSYmKCFBcnJheS5pc0FycmF5KHQpfHwhQXJyYXkuaXNBcnJheSh0LnJhdyl8fDEhPT10Lmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGludGVycG9sYXRpb24gaW4gdHJ1c3RlZCBIVE1MIGNvbnN0YW50OiAke3Quam9pbigiPyIpfWApO3JldHVybiBVcih0WzBdKX0sIsm1ybV0cnVzdENvbnN0YW50UmVzb3VyY2VVcmwiOmZ1bmN0aW9uIFZiKHQpe2lmKG5nRGV2TW9kZSYmKCFBcnJheS5pc0FycmF5KHQpfHwhQXJyYXkuaXNBcnJheSh0LnJhdyl8fDEhPT10Lmxlbmd0aCkpdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGludGVycG9sYXRpb24gaW4gdHJ1c3RlZCBVUkwgY29uc3RhbnQ6ICR7dC5qb2luKCI/Iil9YCk7cmV0dXJuKGZ1bmN0aW9uIGUodCl7dmFyIGU7cmV0dXJuKG51bGw9PT0oZT1qcigpKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5jcmVhdGVTY3JpcHRVUkwodCkpfHx0fSkodFswXSl9LGZvcndhcmRSZWY6cWUscmVzb2x2ZUZvcndhcmRSZWY6WmV9O2xldCBqYj1udWxsOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgVWI9W107bGV0IEdiPSExO2Z1bmN0aW9uIFdiKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpP3QuZXZlcnkoV2IpOiEhWmUodCl9ZnVuY3Rpb24gWWIodCxlLG4pe2lmKEtiLmdldCh0KSlyZXR1cm47bGV0IG87aWYoS2Iuc2V0KHQsITApLHQ9WmUodCksbil7aWYobz1mbyh0KSwhbyl0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgdmFsdWUgJyR7dC5uYW1lfScgaW1wb3J0ZWQgYnkgdGhlIG1vZHVsZSAnJHtuLm5hbWV9Jy4gUGxlYXNlIGFkZCBhbiBATmdNb2R1bGUgYW5ub3RhdGlvbi5gKX1lbHNlIG89Zm8odCwhMCk7Y29uc3QgaT1bXSxhPXJsKG8uZGVjbGFyYXRpb25zKSxyPXJsKG8uaW1wb3J0cyk7dHIocikubWFwKHFiKS5mb3JFYWNoKChlPT57aChlLHQpLFliKGUsITEsdCl9KSk7Y29uc3Qgcz1ybChvLmV4cG9ydHMpO2EuZm9yRWFjaCgoZnVuY3Rpb24gbChlKXtwbyhlPVplKGUpKXx8bW8oZSl8fHVvKGUpfHxpLnB1c2goYFVuZXhwZWN0ZWQgdmFsdWUgJyR7dG4oZSl9JyBkZWNsYXJlZCBieSB0aGUgbW9kdWxlICcke3RuKHQpfScuIFBsZWFzZSBhZGQgYSBAUGlwZS9ARGlyZWN0aXZlL0BDb21wb25lbnQgYW5ub3RhdGlvbi5gKX0pKSxhLmZvckVhY2goKGZ1bmN0aW9uIGModCl7Y29uc3QgZT1tbyh0PVplKHQpKTshcG8odCkmJmUmJjA9PWUuc2VsZWN0b3JzLmxlbmd0aCYmaS5wdXNoKGBEaXJlY3RpdmUgJHt0bih0KX0gaGFzIG5vIHNlbGVjdG9yLCBwbGVhc2UgYWRkIGl0IWApfSkpO2NvbnN0IGQ9Wy4uLmEubWFwKFplKSwuLi50cihyLm1hcChKYikpLm1hcChaZSldO3MuZm9yRWFjaCgoZnVuY3Rpb24gcChlKXtjb25zdCBuPShwbyhlPVplKGUpKT8iY29tcG9uZW50IjptbyhlKSYmImRpcmVjdGl2ZSIpfHx1byhlKSYmInBpcGUiO24mJi0xPT09ZC5sYXN0SW5kZXhPZihlKSYmaS5wdXNoKGBDYW4ndCBleHBvcnQgJHtufSAke3RuKGUpfSBmcm9tICR7dG4odCl9IGFzIGl0IHdhcyBuZWl0aGVyIGRlY2xhcmVkIG5vciBpbXBvcnRlZCFgKX0pKSxhLmZvckVhY2goKG49PihmdW5jdGlvbiBvKGUsbil7ZT1aZShlKTtjb25zdCBvPVhiLmdldChlKTtpZihvJiZvIT09dCl7aWYoIW4pe2NvbnN0IG49W28sdF0ubWFwKHRuKS5zb3J0KCk7aS5wdXNoKGBUeXBlICR7dG4oZSl9IGlzIHBhcnQgb2YgdGhlIGRlY2xhcmF0aW9ucyBvZiAyIG1vZHVsZXM6ICR7blswXX0gYW5kICR7blsxXX0hIFBsZWFzZSBjb25zaWRlciBtb3ZpbmcgJHt0bihlKX0gdG8gYSBoaWdoZXIgbW9kdWxlIHRoYXQgaW1wb3J0cyAke25bMF19IGFuZCAke25bMV19LiBZb3UgY2FuIGFsc28gY3JlYXRlIGEgbmV3IE5nTW9kdWxlIHRoYXQgZXhwb3J0cyBhbmQgaW5jbHVkZXMgJHt0bihlKX0gdGhlbiBpbXBvcnQgdGhhdCBOZ01vZHVsZSBpbiAke25bMF19IGFuZCAke25bMV19LmApfX1lbHNlIFhiLnNldChlLHQpfSkobixlKSkpLGEuZm9yRWFjaCgoZnVuY3Rpb24gbSh0KXtpZihwbyh0PVplKHQpKSl7Y29uc3QgZT1aYih0LCJDb21wb25lbnQiKTtlJiZlLmVudHJ5Q29tcG9uZW50cyYmZXIoZS5lbnRyeUNvbXBvbmVudHMsZyl9fSkpO2NvbnN0IHU9WmIodCwiTmdNb2R1bGUiKTtpZih1JiYodS5pbXBvcnRzJiZ0cih1LmltcG9ydHMpLm1hcChxYikuZm9yRWFjaCgoZT0+e2goZSx0KSxZYihlLCExLHQpfSkpLHUuYm9vdHN0cmFwJiZlcih1LmJvb3RzdHJhcCwoZnVuY3Rpb24gZih0KXtwbyh0PVplKHQpKXx8aS5wdXNoKGAke3RuKHQpfSBjYW5ub3QgYmUgdXNlZCBhcyBhbiBlbnRyeSBjb21wb25lbnQuYCl9KSksdS5ib290c3RyYXAmJmVyKHUuYm9vdHN0cmFwLGcpLHUuZW50cnlDb21wb25lbnRzJiZlcih1LmVudHJ5Q29tcG9uZW50cyxnKSksaS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGkuam9pbigiXG4iKSk7ZnVuY3Rpb24gZyh0KXt0PVplKHQpLFhiLmdldCh0KXx8aS5wdXNoKGBDb21wb25lbnQgJHt0bih0KX0gaXMgbm90IHBhcnQgb2YgYW55IE5nTW9kdWxlIG9yIHRoZSBtb2R1bGUgaGFzIG5vdCBiZWVuIGltcG9ydGVkIGludG8geW91ciBtb2R1bGUuYCl9ZnVuY3Rpb24gaCh0LGUpe2lmKHBvKHQ9WmUodCkpfHxtbyh0KSl0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgZGlyZWN0aXZlICcke3QubmFtZX0nIGltcG9ydGVkIGJ5IHRoZSBtb2R1bGUgJyR7ZS5uYW1lfScuIFBsZWFzZSBhZGQgYW4gQE5nTW9kdWxlIGFubm90YXRpb24uYCk7aWYodW8odCkpdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHBpcGUgJyR7dC5uYW1lfScgaW1wb3J0ZWQgYnkgdGhlIG1vZHVsZSAnJHtlLm5hbWV9Jy4gUGxlYXNlIGFkZCBhbiBATmdNb2R1bGUgYW5ub3RhdGlvbi5gKX19ZnVuY3Rpb24gcWIodCl7cmV0dXJuKHQ9WmUodCkpLm5nTW9kdWxlfHx0fWZ1bmN0aW9uIFpiKHQsZSl7bGV0IG49bnVsbDtyZXR1cm4gbyh0Ll9fYW5ub3RhdGlvbnNfXyksbyh0LmRlY29yYXRvcnMpLG47ZnVuY3Rpb24gbyh0KXt0JiZ0LmZvckVhY2goaSl9ZnVuY3Rpb24gaSh0KXtufHwoT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpLm5nTWV0YWRhdGFOYW1lPT1lP249dDp0LnR5cGUmJk9iamVjdC5nZXRQcm90b3R5cGVPZih0LnR5cGUpLm5nTWV0YWRhdGFOYW1lPT1lJiYobj10LmFyZ3NbMF0pKX19bGV0IFhiPW5ldyBXZWFrTWFwLEtiPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIEpiKHQpe3JldHVyblsuLi50cihybChmbyh0PVplKHQpLCEwKS5leHBvcnRzKS5tYXAoKHQ9PmZvKHQpPyhZYih0LCExKSxKYih0KSk6dCkpKV19ZnVuY3Rpb24gUWIodCxlKXtjb25zdCBuPXRyKGUuZGVjbGFyYXRpb25zfHxXbiksbz10eSh0KTtuLmZvckVhY2goKGU9PntlLmhhc093blByb3BlcnR5KFluKT8kYihwbyhlKSxvKTplLmhhc093blByb3BlcnR5KHFuKXx8ZS5oYXNPd25Qcm9wZXJ0eShabil8fChlLm5nU2VsZWN0b3JTY29wZT10KX0pKX1mdW5jdGlvbiAkYih0LGUpe3QuZGlyZWN0aXZlRGVmcz0oKT0+QXJyYXkuZnJvbShlLmNvbXBpbGF0aW9uLmRpcmVjdGl2ZXMpLm1hcCgodD0+dC5oYXNPd25Qcm9wZXJ0eShZbik/cG8odCk6bW8odCkpKS5maWx0ZXIoKHQ9PiEhdCkpLHQucGlwZURlZnM9KCk9PkFycmF5LmZyb20oZS5jb21waWxhdGlvbi5waXBlcykubWFwKCh0PT51byh0KSkpLHQuc2NoZW1hcz1lLnNjaGVtYXMsdC50Vmlldz1udWxsfWZ1bmN0aW9uIHR5KHQpe2lmKCFueSh0KSl0aHJvdyBuZXcgRXJyb3IoYCR7dC5uYW1lfSBkb2VzIG5vdCBoYXZlIGEgbW9kdWxlIGRlZiAoybVtb2QgcHJvcGVydHkpYCk7Y29uc3QgZT1mbyh0KTtpZihudWxsIT09ZS50cmFuc2l0aXZlQ29tcGlsZVNjb3BlcylyZXR1cm4gZS50cmFuc2l0aXZlQ29tcGlsZVNjb3Blcztjb25zdCBuPXtzY2hlbWFzOmUuc2NoZW1hc3x8bnVsbCxjb21waWxhdGlvbjp7ZGlyZWN0aXZlczpuZXcgU2V0LHBpcGVzOm5ldyBTZXR9LGV4cG9ydGVkOntkaXJlY3RpdmVzOm5ldyBTZXQscGlwZXM6bmV3IFNldH19O3JldHVybiBybChlLmltcG9ydHMpLmZvckVhY2goKHQ9Pntjb25zdCBlPXQ7aWYoIW55KGUpKXRocm93IG5ldyBFcnJvcihgSW1wb3J0aW5nICR7ZS5uYW1lfSB3aGljaCBkb2VzIG5vdCBoYXZlIGEgybVtb2QgcHJvcGVydHlgKTtjb25zdCBvPXR5KGUpO28uZXhwb3J0ZWQuZGlyZWN0aXZlcy5mb3JFYWNoKCh0PT5uLmNvbXBpbGF0aW9uLmRpcmVjdGl2ZXMuYWRkKHQpKSksby5leHBvcnRlZC5waXBlcy5mb3JFYWNoKCh0PT5uLmNvbXBpbGF0aW9uLnBpcGVzLmFkZCh0KSkpfSkpLHJsKGUuZGVjbGFyYXRpb25zKS5mb3JFYWNoKCh0PT57dW8odCk/bi5jb21waWxhdGlvbi5waXBlcy5hZGQodCk6bi5jb21waWxhdGlvbi5kaXJlY3RpdmVzLmFkZCh0KX0pKSxybChlLmV4cG9ydHMpLmZvckVhY2goKHQ9Pntjb25zdCBlPXQ7aWYobnkoZSkpe2NvbnN0IHQ9dHkoZSk7dC5leHBvcnRlZC5kaXJlY3RpdmVzLmZvckVhY2goKHQ9PntuLmNvbXBpbGF0aW9uLmRpcmVjdGl2ZXMuYWRkKHQpLG4uZXhwb3J0ZWQuZGlyZWN0aXZlcy5hZGQodCl9KSksdC5leHBvcnRlZC5waXBlcy5mb3JFYWNoKCh0PT57bi5jb21waWxhdGlvbi5waXBlcy5hZGQodCksbi5leHBvcnRlZC5waXBlcy5hZGQodCl9KSl9ZWxzZSB1byhlKT9uLmV4cG9ydGVkLnBpcGVzLmFkZChlKTpuLmV4cG9ydGVkLmRpcmVjdGl2ZXMuYWRkKGUpfSkpLGUudHJhbnNpdGl2ZUNvbXBpbGVTY29wZXM9bixufWZ1bmN0aW9uIGV5KHQpe3JldHVybihmdW5jdGlvbiBlKHQpe3JldHVybiB2b2lkIDAhPT10Lm5nTW9kdWxlfSkodCk/dC5uZ01vZHVsZTp0fWZ1bmN0aW9uIG55KHQpe3JldHVybiEhZm8odCl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2xldCBveT0wO2Z1bmN0aW9uIGl5KHQsZSl7bGV0IG49bnVsbDtyeSh0LGV8fHt9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxxbix7Z2V0OigpPT57aWYobnVsbD09PW4pe2NvbnN0IG89YXkodCxlfHx7fSksaT1KYSh7dXNhZ2U6MCxraW5kOiJkaXJlY3RpdmUiLHR5cGU6dH0pO249aS5jb21waWxlRGlyZWN0aXZlKGFiLG8uc291cmNlTWFwVXJsLG8ubWV0YWRhdGEpfXJldHVybiBufSxjb25maWd1cmFibGU6ISFuZ0Rldk1vZGV9KX1mdW5jdGlvbiBheSh0LGUpe2NvbnN0IG49dCYmdC5uYW1lLG89YG5nOi8vLyR7bn0vybVkaXIuanNgLGk9SmEoe3VzYWdlOjAsa2luZDoiZGlyZWN0aXZlIix0eXBlOnR9KSxhPWx5KHQsZSk7cmV0dXJuIGEudHlwZVNvdXJjZVNwYW49aS5jcmVhdGVQYXJzZVNvdXJjZVNwYW4oIkRpcmVjdGl2ZSIsbixvKSxhLnVzZXNJbmhlcml0YW5jZSYmY3kodCkse21ldGFkYXRhOmEsc291cmNlTWFwVXJsOm99fWZ1bmN0aW9uIHJ5KHQsZSl7bGV0IG49bnVsbDtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxKbix7Z2V0OigpPT57aWYobnVsbD09PW4pe2NvbnN0IG89YXkodCxlKSxpPUphKHt1c2FnZTowLGtpbmQ6ImRpcmVjdGl2ZSIsdHlwZTp0fSk7bj1pLmNvbXBpbGVGYWN0b3J5KGFiLGBuZzovLy8ke3QubmFtZX0vybVmYWMuanNgLHtuYW1lOm8ubWV0YWRhdGEubmFtZSx0eXBlOm8ubWV0YWRhdGEudHlwZSx0eXBlQXJndW1lbnRDb3VudDowLGRlcHM6TnIodCksdGFyZ2V0OmkuRmFjdG9yeVRhcmdldC5EaXJlY3RpdmV9KX1yZXR1cm4gbn0sY29uZmlndXJhYmxlOiEhbmdEZXZNb2RlfSl9ZnVuY3Rpb24gc3kodCl7cmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZih0LnByb3RvdHlwZSk9PT1PYmplY3QucHJvdG90eXBlfWZ1bmN0aW9uIGx5KHQsZSl7Y29uc3Qgbj1UcigpLG89bi5vd25Qcm9wTWV0YWRhdGEodCk7cmV0dXJue25hbWU6dC5uYW1lLHR5cGU6dCxzZWxlY3Rvcjp2b2lkIDAhPT1lLnNlbGVjdG9yP2Uuc2VsZWN0b3I6bnVsbCxob3N0OmUuaG9zdHx8R24scHJvcE1ldGFkYXRhOm8saW5wdXRzOmUuaW5wdXRzfHxXbixvdXRwdXRzOmUub3V0cHV0c3x8V24scXVlcmllczpteSh0LG8sdXkpLGxpZmVjeWNsZTp7dXNlc09uQ2hhbmdlczpuLmhhc0xpZmVjeWNsZUhvb2sodCwibmdPbkNoYW5nZXMiKX0sdHlwZVNvdXJjZVNwYW46bnVsbCx1c2VzSW5oZXJpdGFuY2U6IXN5KHQpLGV4cG9ydEFzOihpPWUuZXhwb3J0QXMsdm9pZCAwPT09aT9udWxsOmh5KGkpKSxwcm92aWRlcnM6ZS5wcm92aWRlcnN8fG51bGwsdmlld1F1ZXJpZXM6bXkodCxvLGZ5KX07dmFyIGl9ZnVuY3Rpb24gY3kodCl7Y29uc3QgZT1PYmplY3QucHJvdG90eXBlO2xldCBuPU9iamVjdC5nZXRQcm90b3R5cGVPZih0LnByb3RvdHlwZSkuY29uc3RydWN0b3I7Zm9yKDtuJiZuIT09ZTspbW8obil8fHBvKG4pfHwheXkobil8fGl5KG4sbnVsbCksbj1PYmplY3QuZ2V0UHJvdG90eXBlT2Yobil9ZnVuY3Rpb24gZHkodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2h5KHQpOlplKHQpfWZ1bmN0aW9uIHB5KHQsZSl7cmV0dXJue3Byb3BlcnR5TmFtZTp0LHByZWRpY2F0ZTpkeShlLnNlbGVjdG9yKSxkZXNjZW5kYW50czplLmRlc2NlbmRhbnRzLGZpcnN0OmUuZmlyc3QscmVhZDplLnJlYWQ/ZS5yZWFkOm51bGwsc3RhdGljOiEhZS5zdGF0aWMsZW1pdERpc3RpbmN0Q2hhbmdlc09ubHk6ISFlLmVtaXREaXN0aW5jdENoYW5nZXNPbmx5fX1mdW5jdGlvbiBteSh0LGUsbil7Y29uc3Qgbz1bXTtmb3IoY29uc3QgaSBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkoaSkpe2NvbnN0IGE9ZVtpXTthLmZvckVhY2goKGU9PntpZihuKGUpKXtpZighZS5zZWxlY3Rvcil0aHJvdyBuZXcgRXJyb3IoYENhbid0IGNvbnN0cnVjdCBhIHF1ZXJ5IGZvciB0aGUgcHJvcGVydHkgIiR7aX0iIG9mICIke3RuKHQpfSIgc2luY2UgdGhlIHF1ZXJ5IHNlbGVjdG9yIHdhc24ndCBkZWZpbmVkLmApO2lmKGEuc29tZShneSkpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY29tYmluZSBASW5wdXQgZGVjb3JhdG9ycyB3aXRoIHF1ZXJ5IGRlY29yYXRvcnMiKTtvLnB1c2gocHkoaSxlKSl9fSkpfXJldHVybiBvfWZ1bmN0aW9uIHV5KHQpe2NvbnN0IGU9dC5uZ01ldGFkYXRhTmFtZTtyZXR1cm4iQ29udGVudENoaWxkIj09PWV8fCJDb250ZW50Q2hpbGRyZW4iPT09ZX1mdW5jdGlvbiBmeSh0KXtjb25zdCBlPXQubmdNZXRhZGF0YU5hbWU7cmV0dXJuIlZpZXdDaGlsZCI9PT1lfHwiVmlld0NoaWxkcmVuIj09PWV9ZnVuY3Rpb24gZ3kodCl7cmV0dXJuIklucHV0Ij09PXQubmdNZXRhZGF0YU5hbWV9ZnVuY3Rpb24gaHkodCl7cmV0dXJuIHQuc3BsaXQoIiwiKS5tYXAoKHQ9PnQudHJpbSgpKSl9Y29uc3QgYnk9WyJuZ09uQ2hhbmdlcyIsIm5nT25Jbml0IiwibmdPbkRlc3Ryb3kiLCJuZ0RvQ2hlY2siLCJuZ0FmdGVyVmlld0luaXQiLCJuZ0FmdGVyVmlld0NoZWNrZWQiLCJuZ0FmdGVyQ29udGVudEluaXQiLCJuZ0FmdGVyQ29udGVudENoZWNrZWQiXTtmdW5jdGlvbiB5eSh0KXtjb25zdCBlPVRyKCk7aWYoYnkuc29tZSgobj0+ZS5oYXNMaWZlY3ljbGVIb29rKHQsbikpKSlyZXR1cm4hMDtjb25zdCBuPWUucHJvcE1ldGFkYXRhKHQpO2Zvcihjb25zdCB0IGluIG4pe2NvbnN0IGU9blt0XTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7Y29uc3Qgbj1lW3RdLG89bi5uZ01ldGFkYXRhTmFtZTtpZihneShuKXx8dXkobil8fGZ5KG4pfHwiT3V0cHV0Ij09PW98fCJIb3N0QmluZGluZyI9PT1vfHwiSG9zdExpc3RlbmVyIj09PW8pcmV0dXJuITB9fXJldHVybiExfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBfeSh0LGUpe3JldHVybnt0eXBlOnQsbmFtZTp0Lm5hbWUscGlwZU5hbWU6ZS5uYW1lLHB1cmU6dm9pZCAwPT09ZS5wdXJlfHxlLnB1cmV9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCBDeT1GYSgiRGlyZWN0aXZlIiwoKHQ9e30pPT50KSx2b2lkIDAsdm9pZCAwLCgodCxlKT0+RHkodCxlKSkpLE15PUZhKCJDb21wb25lbnQiLCgodD17fSk9Pk9iamVjdC5hc3NpZ24oe2NoYW5nZURldGVjdGlvbjp6bi5EZWZhdWx0fSx0KSksQ3ksdm9pZCAwLCgodCxlKT0+a3kodCxlKSkpLHZ5PUZhKCJQaXBlIiwodD0+T2JqZWN0LmFzc2lnbih7cHVyZTohMH0sdCkpLHZvaWQgMCx2b2lkIDAsKCh0LGUpPT5FeSh0LGUpKSkseHk9VmEoIklucHV0IiwodD0+KHtiaW5kaW5nUHJvcGVydHlOYW1lOnR9KSkpLE95PVZhKCJPdXRwdXQiLCh0PT4oe2JpbmRpbmdQcm9wZXJ0eU5hbWU6dH0pKSksUHk9VmEoIkhvc3RCaW5kaW5nIiwodD0+KHtob3N0UHJvcGVydHlOYW1lOnR9KSkpLHd5PVZhKCJIb3N0TGlzdGVuZXIiLCgodCxlKT0+KHtldmVudE5hbWU6dCxhcmdzOmV9KSkpLGt5PWZ1bmN0aW9uIFN5KHQsZSl7KCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZVbigpO2xldCBuPW51bGw7IShmdW5jdGlvbiBvKHQsZSl7RnIoZSkmJihJci5zZXQodCxlKSxIci5hZGQodCkpfSkodCxlKSxyeSh0LGUpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFluLHtnZXQ6KCk9PntpZihudWxsPT09bil7Y29uc3Qgbz1KYSh7dXNhZ2U6MCxraW5kOiJjb21wb25lbnQiLHR5cGU6dH0pO2lmKEZyKGUpKXtjb25zdCBuPVtgQ29tcG9uZW50ICcke3QubmFtZX0nIGlzIG5vdCByZXNvbHZlZDpgXTt0aHJvdyBlLnRlbXBsYXRlVXJsJiZuLnB1c2goYCAtIHRlbXBsYXRlVXJsOiAke2UudGVtcGxhdGVVcmx9YCksZS5zdHlsZVVybHMmJmUuc3R5bGVVcmxzLmxlbmd0aCYmbi5wdXNoKGAgLSBzdHlsZVVybHM6ICR7SlNPTi5zdHJpbmdpZnkoZS5zdHlsZVVybHMpfWApLG4ucHVzaCgiRGlkIHlvdSBydW4gYW5kIHdhaXQgZm9yICdyZXNvbHZlQ29tcG9uZW50UmVzb3VyY2VzKCknPyIpLG5ldyBFcnJvcihuLmpvaW4oIlxuIikpfWNvbnN0IGk9KGZ1bmN0aW9uIG8oKXtyZXR1cm4gamJ9KSgpO2xldCBhPWUucHJlc2VydmVXaGl0ZXNwYWNlczt2b2lkIDA9PT1hJiYoYT1udWxsIT09aSYmdm9pZCAwIT09aS5wcmVzZXJ2ZVdoaXRlc3BhY2VzJiZpLnByZXNlcnZlV2hpdGVzcGFjZXMpO2xldCByPWUuZW5jYXBzdWxhdGlvbjt2b2lkIDA9PT1yJiYocj1udWxsIT09aSYmdm9pZCAwIT09aS5kZWZhdWx0RW5jYXBzdWxhdGlvbj9pLmRlZmF1bHRFbmNhcHN1bGF0aW9uOkhuLkVtdWxhdGVkKTtjb25zdCBzPWUudGVtcGxhdGVVcmx8fGBuZzovLy8ke3QubmFtZX0vdGVtcGxhdGUuaHRtbGAsbD1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbHkodCxlKSkse3R5cGVTb3VyY2VTcGFuOm8uY3JlYXRlUGFyc2VTb3VyY2VTcGFuKCJDb21wb25lbnQiLHQubmFtZSxzKSx0ZW1wbGF0ZTplLnRlbXBsYXRlfHwiIixwcmVzZXJ2ZVdoaXRlc3BhY2VzOmEsc3R5bGVzOmUuc3R5bGVzfHxXbixhbmltYXRpb25zOmUuYW5pbWF0aW9ucyxkaXJlY3RpdmVzOltdLGNoYW5nZURldGVjdGlvbjplLmNoYW5nZURldGVjdGlvbixwaXBlczpuZXcgTWFwLGVuY2Fwc3VsYXRpb246cixpbnRlcnBvbGF0aW9uOmUuaW50ZXJwb2xhdGlvbix2aWV3UHJvdmlkZXJzOmUudmlld1Byb3ZpZGVyc3x8bnVsbH0pO295Kys7dHJ5e2wudXNlc0luaGVyaXRhbmNlJiZjeSh0KSxuPW8uY29tcGlsZUNvbXBvbmVudChhYixzLGwpfWZpbmFsbHl7b3ktLX1pZigwPT09b3kmJihmdW5jdGlvbiBpKCl7aWYoIUdiKXtHYj0hMDt0cnl7Zm9yKGxldCB0PVViLmxlbmd0aC0xO3Q+PTA7dC0tKXtjb25zdHttb2R1bGVUeXBlOmUsbmdNb2R1bGU6bn09VWJbdF07bi5kZWNsYXJhdGlvbnMmJm4uZGVjbGFyYXRpb25zLmV2ZXJ5KFdiKSYmKFViLnNwbGljZSh0LDEpLFFiKGUsbikpfX1maW5hbGx5e0diPSExfX19KSgpLChmdW5jdGlvbiBhKHQpe3JldHVybiB2b2lkIDAhPT10Lm5nU2VsZWN0b3JTY29wZX0pKHQpKXtjb25zdCBlPXR5KHQubmdTZWxlY3RvclNjb3BlKTskYihuLGUpfX1yZXR1cm4gbn0sY29uZmlndXJhYmxlOiEhbmdEZXZNb2RlfSl9LER5PWl5LEV5PWZ1bmN0aW9uIFJ5KHQsZSl7bGV0IG49bnVsbCxvPW51bGw7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsSm4se2dldDooKT0+e2lmKG51bGw9PT1vKXtjb25zdCBuPV95KHQsZSksaT1KYSh7dXNhZ2U6MCxraW5kOiJwaXBlIix0eXBlOm4udHlwZX0pO289aS5jb21waWxlRmFjdG9yeShhYixgbmc6Ly8vJHtuLm5hbWV9L8m1ZmFjLmpzYCx7bmFtZTpuLm5hbWUsdHlwZTpuLnR5cGUsdHlwZUFyZ3VtZW50Q291bnQ6MCxkZXBzOk5yKHQpLHRhcmdldDppLkZhY3RvcnlUYXJnZXQuUGlwZX0pfXJldHVybiBvfSxjb25maWd1cmFibGU6ISFuZ0Rldk1vZGV9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxabix7Z2V0OigpPT57aWYobnVsbD09PW4pe2NvbnN0IG89X3kodCxlKSxpPUphKHt1c2FnZTowLGtpbmQ6InBpcGUiLHR5cGU6by50eXBlfSk7bj1pLmNvbXBpbGVQaXBlKGFiLGBuZzovLy8ke28ubmFtZX0vybVwaXBlLmpzYCxvKX1yZXR1cm4gbn0sY29uZmlndXJhYmxlOiEhbmdEZXZNb2RlfSl9LEF5PUZhKCJOZ01vZHVsZSIsKHQ9PnQpLHZvaWQgMCx2b2lkIDAsKCh0LGUpPT5UeSh0LGUpKSksVHk9ZnVuY3Rpb24gTnkodCxlPXt9KXshKGZ1bmN0aW9uIG4odCxlLG89ITEpe25nRGV2TW9kZSYmaG4odCwiUmVxdWlyZWQgdmFsdWUgbW9kdWxlVHlwZSIpLG5nRGV2TW9kZSYmaG4oZSwiUmVxdWlyZWQgdmFsdWUgbmdNb2R1bGUiKTtjb25zdCBpPXRyKGUuZGVjbGFyYXRpb25zfHxXbik7bGV0IGE9bnVsbDtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxYbix7Y29uZmlndXJhYmxlOiEwLGdldDooKT0+e2lmKG51bGw9PT1hKXtpZihuZ0Rldk1vZGUmJmUuaW1wb3J0cyYmZS5pbXBvcnRzLmluZGV4T2YodCk+LTEpdGhyb3cgbmV3IEVycm9yKGAnJHt0bih0KX0nIG1vZHVsZSBjYW4ndCBpbXBvcnQgaXRzZWxmYCk7Y29uc3Qgbj1KYSh7dXNhZ2U6MCxraW5kOiJOZ01vZHVsZSIsdHlwZTp0fSk7YT1uLmNvbXBpbGVOZ01vZHVsZShhYixgbmc6Ly8vJHt0Lm5hbWV9L8m1bW9kLmpzYCx7dHlwZTp0LGJvb3RzdHJhcDp0cihlLmJvb3RzdHJhcHx8V24pLm1hcChaZSksZGVjbGFyYXRpb25zOmkubWFwKFplKSxpbXBvcnRzOnRyKGUuaW1wb3J0c3x8V24pLm1hcChaZSkubWFwKGV5KSxleHBvcnRzOnRyKGUuZXhwb3J0c3x8V24pLm1hcChaZSkubWFwKGV5KSxzY2hlbWFzOmUuc2NoZW1hcz90cihlLnNjaGVtYXMpOm51bGwsaWQ6ZS5pZHx8bnVsbH0pLGEuc2NoZW1hc3x8KGEuc2NoZW1hcz1bXSl9cmV0dXJuIGF9fSk7bGV0IHI9bnVsbDtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxKbix7Z2V0OigpPT57aWYobnVsbD09PXIpe2NvbnN0IGU9SmEoe3VzYWdlOjAsa2luZDoiTmdNb2R1bGUiLHR5cGU6dH0pO3I9ZS5jb21waWxlRmFjdG9yeShhYixgbmc6Ly8vJHt0Lm5hbWV9L8m1ZmFjLmpzYCx7bmFtZTp0Lm5hbWUsdHlwZTp0LGRlcHM6TnIodCksdGFyZ2V0OmUuRmFjdG9yeVRhcmdldC5OZ01vZHVsZSx0eXBlQXJndW1lbnRDb3VudDowfSl9cmV0dXJuIHJ9LGNvbmZpZ3VyYWJsZTohIW5nRGV2TW9kZX0pO2xldCBzPW51bGw7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsa24se2dldDooKT0+e2lmKG51bGw9PT1zKXtuZ0Rldk1vZGUmJlliKHQsbyk7Y29uc3Qgbj17bmFtZTp0Lm5hbWUsdHlwZTp0LHByb3ZpZGVyczplLnByb3ZpZGVyc3x8V24saW1wb3J0czpbKGUuaW1wb3J0c3x8V24pLm1hcChaZSksKGUuZXhwb3J0c3x8V24pLm1hcChaZSldfSxpPUphKHt1c2FnZTowLGtpbmQ6Ik5nTW9kdWxlIix0eXBlOnR9KTtzPWkuY29tcGlsZUluamVjdG9yKGFiLGBuZzovLy8ke3QubmFtZX0vybVpbmouanNgLG4pfXJldHVybiBzfSxjb25maWd1cmFibGU6ISFuZ0Rldk1vZGV9KX0pKHQsZSksKGZ1bmN0aW9uIG8odCxlKXtVYi5wdXNoKHttb2R1bGVUeXBlOnQsbmdNb2R1bGU6ZX0pfSkodCxlKX0senk9bmV3IEdhKCJBcHBsaWNhdGlvbiBJbml0aWFsaXplciIpO2NsYXNzIEl5e2NvbnN0cnVjdG9yKHQpe3RoaXMuYXBwSW5pdHM9dCx0aGlzLnJlc29sdmU9ZmcsdGhpcy5yZWplY3Q9ZmcsdGhpcy5pbml0aWFsaXplZD0hMSx0aGlzLmRvbmU9ITEsdGhpcy5kb25lUHJvbWlzZT1uZXcgUHJvbWlzZSgoKHQsZSk9Pnt0aGlzLnJlc29sdmU9dCx0aGlzLnJlamVjdD1lfSkpfXJ1bkluaXRpYWxpemVycygpe2lmKHRoaXMuaW5pdGlhbGl6ZWQpcmV0dXJuO2NvbnN0IHQ9W10sZT0oKT0+e3RoaXMuZG9uZT0hMCx0aGlzLnJlc29sdmUoKX07aWYodGhpcy5hcHBJbml0cylmb3IobGV0IGU9MDtlPHRoaXMuYXBwSW5pdHMubGVuZ3RoO2UrKyl7Y29uc3Qgbj10aGlzLmFwcEluaXRzW2VdKCk7aWYoRm0obikpdC5wdXNoKG4pO2Vsc2UgaWYoQm0obikpe2NvbnN0IGU9bmV3IFByb21pc2UoKCh0LGUpPT57bi5zdWJzY3JpYmUoe2NvbXBsZXRlOnQsZXJyb3I6ZX0pfSkpO3QucHVzaChlKX19UHJvbWlzZS5hbGwodCkudGhlbigoKCk9PntlKCl9KSkuY2F0Y2goKHQ9Pnt0aGlzLnJlamVjdCh0KX0pKSwwPT09dC5sZW5ndGgmJmUoKSx0aGlzLmluaXRpYWxpemVkPSEwfX1JeS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SXkpKHZyKHp5LDgpKX0sSXkuybVwcm92PU1uKHt0b2tlbjpJeSxmYWN0b3J5Okl5Lsm1ZmFjfSksSXkuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbenldfSx7dHlwZTpTcn1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChJeSxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3p5XX0se3R5cGU6U3J9XX1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBIeT1uZXcgR2EoIkFwcElkIiksRnk9e3Byb3ZpZGU6SHksdXNlRmFjdG9yeTpmdW5jdGlvbiBMeSgpe3JldHVybmAke0J5KCl9JHtCeSgpfSR7QnkoKX1gfSxkZXBzOltdfTtmdW5jdGlvbiBCeSgpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKDk3K01hdGguZmxvb3IoMjUqTWF0aC5yYW5kb20oKSkpfWNvbnN0IFZ5PW5ldyBHYSgiUGxhdGZvcm0gSW5pdGlhbGl6ZXIiKSxqeT1uZXcgR2EoIlBsYXRmb3JtIElEIiksVXk9bmV3IEdhKCJhcHBCb290c3RyYXBMaXN0ZW5lciIpO25ldyBHYSgiQXBwbGljYXRpb24gUGFja2FnZXMgUm9vdCBVUkwiKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIEd5e2xvZyh0KXtjb25zb2xlLmxvZyh0KX13YXJuKHQpe2NvbnNvbGUud2Fybih0KX19R3kuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEd5KX0sR3kuybVwcm92PU1uKHt0b2tlbjpHeSxmYWN0b3J5Okd5Lsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChHeSxbe3R5cGU6aW19XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgV3k9bmV3IEdhKCJMb2NhbGVJZCIpLFl5PW5ldyBHYSgiRGVmYXVsdEN1cnJlbmN5Q29kZSIpO3ZhciBxeTtuZXcgR2EoIlRyYW5zbGF0aW9ucyIpLG5ldyBHYSgiVHJhbnNsYXRpb25zRm9ybWF0IiksKGZ1bmN0aW9uKHQpe3RbdC5FcnJvcj0wXT0iRXJyb3IiLHRbdC5XYXJuaW5nPTFdPSJXYXJuaW5nIix0W3QuSWdub3JlPTJdPSJJZ25vcmUifSkocXl8fChxeT17fSkpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgWnl7Y29uc3RydWN0b3IodCxlKXt0aGlzLm5nTW9kdWxlRmFjdG9yeT10LHRoaXMuY29tcG9uZW50RmFjdG9yaWVzPWV9fWNvbnN0IFh5PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgX2godCl9LEt5PVh5LEp5PWZ1bmN0aW9uKHQpe3JldHVybiBQcm9taXNlLnJlc29sdmUoWHkodCkpfSxReT1mdW5jdGlvbih0KXtjb25zdCBlPVh5KHQpLG49cmwoZm8odCkuZGVjbGFyYXRpb25zKS5yZWR1Y2UoKCh0LGUpPT57Y29uc3Qgbj1wbyhlKTtyZXR1cm4gbiYmdC5wdXNoKG5ldyBmaChuKSksdH0pLFtdKTtyZXR1cm4gbmV3IFp5KGUsbil9LCR5PVF5LHRfPWZ1bmN0aW9uKHQpe3JldHVybiBQcm9taXNlLnJlc29sdmUoUXkodCkpfTtjbGFzcyBlX3tjb25zdHJ1Y3Rvcigpe3RoaXMuY29tcGlsZU1vZHVsZVN5bmM9S3ksdGhpcy5jb21waWxlTW9kdWxlQXN5bmM9SnksdGhpcy5jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c1N5bmM9JHksdGhpcy5jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c0FzeW5jPXRffWNsZWFyQ2FjaGUoKXt9Y2xlYXJDYWNoZUZvcih0KXt9Z2V0TW9kdWxlSWQodCl7fX1lXy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8ZV8pfSxlXy7JtXByb3Y9TW4oe3Rva2VuOmVfLGZhY3Rvcnk6ZV8uybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGVfLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVybltdfSksbnVsbCk7Y29uc3Qgbl89bmV3IEdhKCJjb21waWxlck9wdGlvbnMiKSxvXz1Qcm9taXNlLnJlc29sdmUoMCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIGlfKHQpeyJ1bmRlZmluZWQiPT10eXBlb2YgWm9uZT9vXy50aGVuKCgoKT0+e3QmJnQuYXBwbHkobnVsbCxudWxsKX0pKTpab25lLmN1cnJlbnQuc2NoZWR1bGVNaWNyb1Rhc2soInNjaGVkdWxlTWljcm90YXNrIix0KX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBhX3tjb25zdHJ1Y3Rvcih7ZW5hYmxlTG9uZ1N0YWNrVHJhY2U6dD0hMSxzaG91bGRDb2FsZXNjZUV2ZW50Q2hhbmdlRGV0ZWN0aW9uOmU9ITEsc2hvdWxkQ29hbGVzY2VSdW5DaGFuZ2VEZXRlY3Rpb246bj0hMX0pe2lmKHRoaXMuaGFzUGVuZGluZ01hY3JvdGFza3M9ITEsdGhpcy5oYXNQZW5kaW5nTWljcm90YXNrcz0hMSx0aGlzLmlzU3RhYmxlPSEwLHRoaXMub25VbnN0YWJsZT1uZXcgTGgoITEpLHRoaXMub25NaWNyb3Rhc2tFbXB0eT1uZXcgTGgoITEpLHRoaXMub25TdGFibGU9bmV3IExoKCExKSx0aGlzLm9uRXJyb3I9bmV3IExoKCExKSwidW5kZWZpbmVkIj09dHlwZW9mIFpvbmUpdGhyb3cgbmV3IEVycm9yKCJJbiB0aGlzIGNvbmZpZ3VyYXRpb24gQW5ndWxhciByZXF1aXJlcyBab25lLmpzIik7Wm9uZS5hc3NlcnRab25lUGF0Y2hlZCgpO2NvbnN0IG89dGhpcztvLl9uZXN0aW5nPTAsby5fb3V0ZXI9by5faW5uZXI9Wm9uZS5jdXJyZW50LFpvbmUuVGFza1RyYWNraW5nWm9uZVNwZWMmJihvLl9pbm5lcj1vLl9pbm5lci5mb3JrKG5ldyBab25lLlRhc2tUcmFja2luZ1pvbmVTcGVjKSksdCYmWm9uZS5sb25nU3RhY2tUcmFjZVpvbmVTcGVjJiYoby5faW5uZXI9by5faW5uZXIuZm9yayhab25lLmxvbmdTdGFja1RyYWNlWm9uZVNwZWMpKSxvLnNob3VsZENvYWxlc2NlRXZlbnRDaGFuZ2VEZXRlY3Rpb249IW4mJmUsby5zaG91bGRDb2FsZXNjZVJ1bkNoYW5nZURldGVjdGlvbj1uLG8ubGFzdFJlcXVlc3RBbmltYXRpb25GcmFtZUlkPS0xLG8ubmF0aXZlUmVxdWVzdEFuaW1hdGlvbkZyYW1lPShmdW5jdGlvbiBpKCl7bGV0IHQ9am4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lLGU9am4uY2FuY2VsQW5pbWF0aW9uRnJhbWU7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBab25lJiZ0JiZlKXtjb25zdCBuPXRbWm9uZS5fX3N5bWJvbF9fKCJPcmlnaW5hbERlbGVnYXRlIildO24mJih0PW4pO2NvbnN0IG89ZVtab25lLl9fc3ltYm9sX18oIk9yaWdpbmFsRGVsZWdhdGUiKV07byYmKGU9byl9cmV0dXJue25hdGl2ZVJlcXVlc3RBbmltYXRpb25GcmFtZTp0LG5hdGl2ZUNhbmNlbEFuaW1hdGlvbkZyYW1lOmV9fSkoKS5uYXRpdmVSZXF1ZXN0QW5pbWF0aW9uRnJhbWUsKGZ1bmN0aW9uIGEodCl7Y29uc3QgZT0oKT0+eyEoZnVuY3Rpb24gZSh0KXt0LmlzQ2hlY2tTdGFibGVSdW5uaW5nfHwtMSE9PXQubGFzdFJlcXVlc3RBbmltYXRpb25GcmFtZUlkfHwodC5sYXN0UmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQ9dC5uYXRpdmVSZXF1ZXN0QW5pbWF0aW9uRnJhbWUuY2FsbChqbiwoKCk9Pnt0LmZha2VUb3BFdmVudFRhc2t8fCh0LmZha2VUb3BFdmVudFRhc2s9Wm9uZS5yb290LnNjaGVkdWxlRXZlbnRUYXNrKCJmYWtlVG9wRXZlbnRUYXNrIiwoKCk9Pnt0Lmxhc3RSZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZD0tMSxsXyh0KSx0LmlzQ2hlY2tTdGFibGVSdW5uaW5nPSEwLHNfKHQpLHQuaXNDaGVja1N0YWJsZVJ1bm5pbmc9ITF9KSx2b2lkIDAsKCgpPT57fSksKCgpPT57fSkpKSx0LmZha2VUb3BFdmVudFRhc2suaW52b2tlKCl9KSksbF8odCkpfSkodCl9O3QuX2lubmVyPXQuX2lubmVyLmZvcmsoe25hbWU6ImFuZ3VsYXIiLHByb3BlcnRpZXM6e2lzQW5ndWxhclpvbmU6ITB9LG9uSW52b2tlVGFzazoobixvLGksYSxyLHMpPT57dHJ5e3JldHVybiBjXyh0KSxuLmludm9rZVRhc2soaSxhLHIscyl9ZmluYWxseXsodC5zaG91bGRDb2FsZXNjZUV2ZW50Q2hhbmdlRGV0ZWN0aW9uJiYiZXZlbnRUYXNrIj09PWEudHlwZXx8dC5zaG91bGRDb2FsZXNjZVJ1bkNoYW5nZURldGVjdGlvbikmJmUoKSxkXyh0KX19LG9uSW52b2tlOihuLG8saSxhLHIscyxsKT0+e3RyeXtyZXR1cm4gY18odCksbi5pbnZva2UoaSxhLHIscyxsKX1maW5hbGx5e3Quc2hvdWxkQ29hbGVzY2VSdW5DaGFuZ2VEZXRlY3Rpb24mJmUoKSxkXyh0KX19LG9uSGFzVGFzazooZSxuLG8saSk9PntlLmhhc1Rhc2sobyxpKSxuPT09byYmKCJtaWNyb1Rhc2siPT1pLmNoYW5nZT8odC5faGFzUGVuZGluZ01pY3JvdGFza3M9aS5taWNyb1Rhc2ssbF8odCksc18odCkpOiJtYWNyb1Rhc2siPT1pLmNoYW5nZSYmKHQuaGFzUGVuZGluZ01hY3JvdGFza3M9aS5tYWNyb1Rhc2spKX0sb25IYW5kbGVFcnJvcjooZSxuLG8saSk9PihlLmhhbmRsZUVycm9yKG8saSksdC5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PnQub25FcnJvci5lbWl0KGkpKSksITEpfSl9KShvKX1zdGF0aWMgaXNJbkFuZ3VsYXJab25lKCl7cmV0dXJuITA9PT1ab25lLmN1cnJlbnQuZ2V0KCJpc0FuZ3VsYXJab25lIil9c3RhdGljIGFzc2VydEluQW5ndWxhclpvbmUoKXtpZighYV8uaXNJbkFuZ3VsYXJab25lKCkpdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCB0byBiZSBpbiBBbmd1bGFyIFpvbmUsIGJ1dCBpdCBpcyBub3QhIil9c3RhdGljIGFzc2VydE5vdEluQW5ndWxhclpvbmUoKXtpZihhXy5pc0luQW5ndWxhclpvbmUoKSl0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIHRvIG5vdCBiZSBpbiBBbmd1bGFyIFpvbmUsIGJ1dCBpdCBpcyEiKX1ydW4odCxlLG4pe3JldHVybiB0aGlzLl9pbm5lci5ydW4odCxlLG4pfXJ1blRhc2sodCxlLG4sbyl7Y29uc3QgaT10aGlzLl9pbm5lcixhPWkuc2NoZWR1bGVFdmVudFRhc2soIk5nWm9uZUV2ZW50OiAiK28sdCxyXyxmZyxmZyk7dHJ5e3JldHVybiBpLnJ1blRhc2soYSxlLG4pfWZpbmFsbHl7aS5jYW5jZWxUYXNrKGEpfX1ydW5HdWFyZGVkKHQsZSxuKXtyZXR1cm4gdGhpcy5faW5uZXIucnVuR3VhcmRlZCh0LGUsbil9cnVuT3V0c2lkZUFuZ3VsYXIodCl7cmV0dXJuIHRoaXMuX291dGVyLnJ1bih0KX19Y29uc3Qgcl89e307ZnVuY3Rpb24gc18odCl7aWYoMD09dC5fbmVzdGluZyYmIXQuaGFzUGVuZGluZ01pY3JvdGFza3MmJiF0LmlzU3RhYmxlKXRyeXt0Ll9uZXN0aW5nKyssdC5vbk1pY3JvdGFza0VtcHR5LmVtaXQobnVsbCl9ZmluYWxseXtpZih0Ll9uZXN0aW5nLS0sIXQuaGFzUGVuZGluZ01pY3JvdGFza3MpdHJ5e3QucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT50Lm9uU3RhYmxlLmVtaXQobnVsbCkpKX1maW5hbGx5e3QuaXNTdGFibGU9ITB9fX1mdW5jdGlvbiBsXyh0KXt0Lmhhc1BlbmRpbmdNaWNyb3Rhc2tzPSEhKHQuX2hhc1BlbmRpbmdNaWNyb3Rhc2tzfHwodC5zaG91bGRDb2FsZXNjZUV2ZW50Q2hhbmdlRGV0ZWN0aW9ufHx0LnNob3VsZENvYWxlc2NlUnVuQ2hhbmdlRGV0ZWN0aW9uKSYmLTEhPT10Lmxhc3RSZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCl9ZnVuY3Rpb24gY18odCl7dC5fbmVzdGluZysrLHQuaXNTdGFibGUmJih0LmlzU3RhYmxlPSExLHQub25VbnN0YWJsZS5lbWl0KG51bGwpKX1mdW5jdGlvbiBkXyh0KXt0Ll9uZXN0aW5nLS0sc18odCl9Y2xhc3MgcF97Y29uc3RydWN0b3IoKXt0aGlzLmhhc1BlbmRpbmdNaWNyb3Rhc2tzPSExLHRoaXMuaGFzUGVuZGluZ01hY3JvdGFza3M9ITEsdGhpcy5pc1N0YWJsZT0hMCx0aGlzLm9uVW5zdGFibGU9bmV3IExoLHRoaXMub25NaWNyb3Rhc2tFbXB0eT1uZXcgTGgsdGhpcy5vblN0YWJsZT1uZXcgTGgsdGhpcy5vbkVycm9yPW5ldyBMaH1ydW4odCxlLG4pe3JldHVybiB0LmFwcGx5KGUsbil9cnVuR3VhcmRlZCh0LGUsbil7cmV0dXJuIHQuYXBwbHkoZSxuKX1ydW5PdXRzaWRlQW5ndWxhcih0KXtyZXR1cm4gdCgpfXJ1blRhc2sodCxlLG4sbyl7cmV0dXJuIHQuYXBwbHkoZSxuKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIG1fe2NvbnN0cnVjdG9yKHQpe3RoaXMuX25nWm9uZT10LHRoaXMuX3BlbmRpbmdDb3VudD0wLHRoaXMuX2lzWm9uZVN0YWJsZT0hMCx0aGlzLl9kaWRXb3JrPSExLHRoaXMuX2NhbGxiYWNrcz1bXSx0aGlzLnRhc2tUcmFja2luZ1pvbmU9bnVsbCx0aGlzLl93YXRjaEFuZ3VsYXJFdmVudHMoKSx0LnJ1bigoKCk9Pnt0aGlzLnRhc2tUcmFja2luZ1pvbmU9InVuZGVmaW5lZCI9PXR5cGVvZiBab25lP251bGw6Wm9uZS5jdXJyZW50LmdldCgiVGFza1RyYWNraW5nWm9uZSIpfSkpfV93YXRjaEFuZ3VsYXJFdmVudHMoKXt0aGlzLl9uZ1pvbmUub25VbnN0YWJsZS5zdWJzY3JpYmUoe25leHQ6KCk9Pnt0aGlzLl9kaWRXb3JrPSEwLHRoaXMuX2lzWm9uZVN0YWJsZT0hMX19KSx0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT57dGhpcy5fbmdab25lLm9uU3RhYmxlLnN1YnNjcmliZSh7bmV4dDooKT0+e2FfLmFzc2VydE5vdEluQW5ndWxhclpvbmUoKSxpXygoKCk9Pnt0aGlzLl9pc1pvbmVTdGFibGU9ITAsdGhpcy5fcnVuQ2FsbGJhY2tzSWZSZWFkeSgpfSkpfX0pfSkpfWluY3JlYXNlUGVuZGluZ1JlcXVlc3RDb3VudCgpe3JldHVybiB0aGlzLl9wZW5kaW5nQ291bnQrPTEsdGhpcy5fZGlkV29yaz0hMCx0aGlzLl9wZW5kaW5nQ291bnR9ZGVjcmVhc2VQZW5kaW5nUmVxdWVzdENvdW50KCl7aWYodGhpcy5fcGVuZGluZ0NvdW50LT0xLHRoaXMuX3BlbmRpbmdDb3VudDwwKXRocm93IG5ldyBFcnJvcigicGVuZGluZyBhc3luYyByZXF1ZXN0cyBiZWxvdyB6ZXJvIik7cmV0dXJuIHRoaXMuX3J1bkNhbGxiYWNrc0lmUmVhZHkoKSx0aGlzLl9wZW5kaW5nQ291bnR9aXNTdGFibGUoKXtyZXR1cm4gdGhpcy5faXNab25lU3RhYmxlJiYwPT09dGhpcy5fcGVuZGluZ0NvdW50JiYhdGhpcy5fbmdab25lLmhhc1BlbmRpbmdNYWNyb3Rhc2tzfV9ydW5DYWxsYmFja3NJZlJlYWR5KCl7aWYodGhpcy5pc1N0YWJsZSgpKWlfKCgoKT0+e2Zvcig7MCE9PXRoaXMuX2NhbGxiYWNrcy5sZW5ndGg7KXtsZXQgdD10aGlzLl9jYWxsYmFja3MucG9wKCk7Y2xlYXJUaW1lb3V0KHQudGltZW91dElkKSx0LmRvbmVDYih0aGlzLl9kaWRXb3JrKX10aGlzLl9kaWRXb3JrPSExfSkpO2Vsc2V7bGV0IHQ9dGhpcy5nZXRQZW5kaW5nVGFza3MoKTt0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzLmZpbHRlcigoZT0+IWUudXBkYXRlQ2J8fCFlLnVwZGF0ZUNiKHQpfHwoY2xlYXJUaW1lb3V0KGUudGltZW91dElkKSwhMSkpKSx0aGlzLl9kaWRXb3JrPSEwfX1nZXRQZW5kaW5nVGFza3MoKXtyZXR1cm4gdGhpcy50YXNrVHJhY2tpbmdab25lP3RoaXMudGFza1RyYWNraW5nWm9uZS5tYWNyb1Rhc2tzLm1hcCgodD0+KHtzb3VyY2U6dC5zb3VyY2UsY3JlYXRpb25Mb2NhdGlvbjp0LmNyZWF0aW9uTG9jYXRpb24sZGF0YTp0LmRhdGF9KSkpOltdfWFkZENhbGxiYWNrKHQsZSxuKXtsZXQgbz0tMTtlJiZlPjAmJihvPXNldFRpbWVvdXQoKCgpPT57dGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrcy5maWx0ZXIoKHQ9PnQudGltZW91dElkIT09bykpLHQodGhpcy5fZGlkV29yayx0aGlzLmdldFBlbmRpbmdUYXNrcygpKX0pLGUpKSx0aGlzLl9jYWxsYmFja3MucHVzaCh7ZG9uZUNiOnQsdGltZW91dElkOm8sdXBkYXRlQ2I6bn0pfXdoZW5TdGFibGUodCxlLG4pe2lmKG4mJiF0aGlzLnRhc2tUcmFja2luZ1pvbmUpdGhyb3cgbmV3IEVycm9yKCdUYXNrIHRyYWNraW5nIHpvbmUgaXMgcmVxdWlyZWQgd2hlbiBwYXNzaW5nIGFuIHVwZGF0ZSBjYWxsYmFjayB0byB3aGVuU3RhYmxlKCkuIElzICJ6b25lLmpzL3BsdWdpbnMvdGFzay10cmFja2luZyIgbG9hZGVkPycpO3RoaXMuYWRkQ2FsbGJhY2sodCxlLG4pLHRoaXMuX3J1bkNhbGxiYWNrc0lmUmVhZHkoKX1nZXRQZW5kaW5nUmVxdWVzdENvdW50KCl7cmV0dXJuIHRoaXMuX3BlbmRpbmdDb3VudH1maW5kUHJvdmlkZXJzKHQsZSxuKXtyZXR1cm5bXX19bV8uybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fG1fKSh2cihhXykpfSxtXy7JtXByb3Y9TW4oe3Rva2VuOm1fLGZhY3Rvcnk6bV8uybVmYWN9KSxtXy5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmFffV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChtXyxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6YV99XX0pLG51bGwpO2NsYXNzIHVfe2NvbnN0cnVjdG9yKCl7dGhpcy5fYXBwbGljYXRpb25zPW5ldyBNYXAsZ18uYWRkVG9XaW5kb3codGhpcyl9cmVnaXN0ZXJBcHBsaWNhdGlvbih0LGUpe3RoaXMuX2FwcGxpY2F0aW9ucy5zZXQodCxlKX11bnJlZ2lzdGVyQXBwbGljYXRpb24odCl7dGhpcy5fYXBwbGljYXRpb25zLmRlbGV0ZSh0KX11bnJlZ2lzdGVyQWxsQXBwbGljYXRpb25zKCl7dGhpcy5fYXBwbGljYXRpb25zLmNsZWFyKCl9Z2V0VGVzdGFiaWxpdHkodCl7cmV0dXJuIHRoaXMuX2FwcGxpY2F0aW9ucy5nZXQodCl8fG51bGx9Z2V0QWxsVGVzdGFiaWxpdGllcygpe3JldHVybiBBcnJheS5mcm9tKHRoaXMuX2FwcGxpY2F0aW9ucy52YWx1ZXMoKSl9Z2V0QWxsUm9vdEVsZW1lbnRzKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5fYXBwbGljYXRpb25zLmtleXMoKSl9ZmluZFRlc3RhYmlsaXR5SW5UcmVlKHQsZT0hMCl7cmV0dXJuIGdfLmZpbmRUZXN0YWJpbGl0eUluVHJlZSh0aGlzLHQsZSl9fXVfLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx1Xyl9LHVfLsm1cHJvdj1Nbih7dG9rZW46dV8sZmFjdG9yeTp1Xy7JtWZhY30pLHVfLmN0b3JQYXJhbWV0ZXJzPSgpPT5bXSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHVfLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVybltdfSksbnVsbCk7bGV0IGZfLGdfPW5ldyBjbGFzc3thZGRUb1dpbmRvdyh0KXt9ZmluZFRlc3RhYmlsaXR5SW5UcmVlKHQsZSxuKXtyZXR1cm4gbnVsbH19LGhfPSEwLGJfPSExOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiB5Xygpe3JldHVybiBiXz0hMCxoX31jb25zdCBfXz1uZXcgR2EoIkFsbG93TXVsdGlwbGVUb2tlbiIpO2Z1bmN0aW9uIENfKHQsZSxuPVtdKXtjb25zdCBvPWBQbGF0Zm9ybTogJHtlfWAsaT1uZXcgR2Eobyk7cmV0dXJuKGU9W10pPT57bGV0IGE9TV8oKTtpZighYXx8YS5pbmplY3Rvci5nZXQoX18sITEpKWlmKHQpdChuLmNvbmNhdChlKS5jb25jYXQoe3Byb3ZpZGU6aSx1c2VWYWx1ZTohMH0pKTtlbHNle2NvbnN0IHQ9bi5jb25jYXQoZSkuY29uY2F0KHtwcm92aWRlOmksdXNlVmFsdWU6ITB9LHtwcm92aWRlOllkLHVzZVZhbHVlOiJwbGF0Zm9ybSJ9KTshKGZ1bmN0aW9uIHIodCl7aWYoZl8mJiFmXy5kZXN0cm95ZWQmJiFmXy5pbmplY3Rvci5nZXQoX18sITEpKXRocm93IG5ldyBFcnJvcigiVGhlcmUgY2FuIGJlIG9ubHkgb25lIHBsYXRmb3JtLiBEZXN0cm95IHRoZSBwcmV2aW91cyBvbmUgdG8gY3JlYXRlIGEgbmV3IG9uZS4iKTsoZnVuY3Rpb24gZSgpe25nRGV2TW9kZSYmKGZ1bmN0aW9uIHQoKXtfcHx8KF9wPSEwLENwKCLJtXNldFByb2ZpbGVyIixZbyksQ3AoImdldERpcmVjdGl2ZU1ldGFkYXRhIix1cCksQ3AoImdldENvbXBvbmVudCIsc3ApLENwKCJnZXRDb250ZXh0IixscCksQ3AoImdldExpc3RlbmVycyIsZ3ApLENwKCJnZXRPd25pbmdDb21wb25lbnQiLGNwKSxDcCgiZ2V0SG9zdEVsZW1lbnQiLGZwKSxDcCgiZ2V0SW5qZWN0b3IiLHBwKSxDcCgiZ2V0Um9vdENvbXBvbmVudHMiLGRwKSxDcCgiZ2V0RGlyZWN0aXZlcyIsbXApLENwKCJhcHBseUNoYW5nZXMiLHlwKSl9KSgpfSkoKSxmXz10LmdldCh2Xyk7Y29uc3Qgbj10LmdldChWeSxudWxsKTtuJiZuLmZvckVhY2goKHQ9PnQoKSkpfSkocnAuY3JlYXRlKHtwcm92aWRlcnM6dCxuYW1lOm99KSl9cmV0dXJuKGZ1bmN0aW9uIHModCl7Y29uc3QgZT1NXygpO2lmKCFlKXRocm93IG5ldyBFcnJvcigiTm8gcGxhdGZvcm0gZXhpc3RzISIpO2lmKCFlLmluamVjdG9yLmdldCh0LG51bGwpKXRocm93IG5ldyBFcnJvcigiQSBwbGF0Zm9ybSB3aXRoIGEgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gY3JlYXRlZC4gUGxlYXNlIGRlc3Ryb3kgaXQgZmlyc3QuIik7cmV0dXJuIGV9KShpKX19ZnVuY3Rpb24gTV8oKXtyZXR1cm4gZl8mJiFmXy5kZXN0cm95ZWQ/Zl86bnVsbH1jbGFzcyB2X3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl9pbmplY3Rvcj10LHRoaXMuX21vZHVsZXM9W10sdGhpcy5fZGVzdHJveUxpc3RlbmVycz1bXSx0aGlzLl9kZXN0cm95ZWQ9ITF9Ym9vdHN0cmFwTW9kdWxlRmFjdG9yeSh0LGUpe2NvbnN0IG49KGZ1bmN0aW9uIG8odCxlKXtsZXQgbjtyZXR1cm4gbj0ibm9vcCI9PT10P25ldyBwXzooInpvbmUuanMiPT09dD92b2lkIDA6dCl8fG5ldyBhXyh7ZW5hYmxlTG9uZ1N0YWNrVHJhY2U6eV8oKSxzaG91bGRDb2FsZXNjZUV2ZW50Q2hhbmdlRGV0ZWN0aW9uOiEhKG51bGw9PWU/dm9pZCAwOmUubmdab25lRXZlbnRDb2FsZXNjaW5nKSxzaG91bGRDb2FsZXNjZVJ1bkNoYW5nZURldGVjdGlvbjohIShudWxsPT1lP3ZvaWQgMDplLm5nWm9uZVJ1bkNvYWxlc2NpbmcpfSksbn0pKGU/ZS5uZ1pvbmU6dm9pZCAwLHtuZ1pvbmVFdmVudENvYWxlc2Npbmc6ZSYmZS5uZ1pvbmVFdmVudENvYWxlc2Npbmd8fCExLG5nWm9uZVJ1bkNvYWxlc2Npbmc6ZSYmZS5uZ1pvbmVSdW5Db2FsZXNjaW5nfHwhMX0pLGk9W3twcm92aWRlOmFfLHVzZVZhbHVlOm59XTtyZXR1cm4gbi5ydW4oKCgpPT57Y29uc3QgZT1ycC5jcmVhdGUoe3Byb3ZpZGVyczppLHBhcmVudDp0aGlzLmluamVjdG9yLG5hbWU6dC5tb2R1bGVUeXBlLm5hbWV9KSxvPXQuY3JlYXRlKGUpLGE9by5pbmplY3Rvci5nZXQoWnMsbnVsbCk7aWYoIWEpdGhyb3cgbmV3IEVycm9yKCJObyBFcnJvckhhbmRsZXIuIElzIHBsYXRmb3JtIG1vZHVsZSAoQnJvd3Nlck1vZHVsZSkgaW5jbHVkZWQ/Iik7cmV0dXJuIG4ucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT57Y29uc3QgdD1uLm9uRXJyb3Iuc3Vic2NyaWJlKHtuZXh0OnQ9PnthLmhhbmRsZUVycm9yKHQpfX0pO28ub25EZXN0cm95KCgoKT0+e1BfKHRoaXMuX21vZHVsZXMsbyksdC51bnN1YnNjcmliZSgpfSkpfSkpLChmdW5jdGlvbiByKHQsZSxuKXt0cnl7Y29uc3Qgbz1uKCk7cmV0dXJuIEZtKG8pP28uY2F0Y2goKG49Pnt0aHJvdyBlLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+dC5oYW5kbGVFcnJvcihuKSkpLG59KSk6b31jYXRjaChuKXt0aHJvdyBlLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+dC5oYW5kbGVFcnJvcihuKSkpLG59fSkoYSxuLCgoKT0+e2NvbnN0IHQ9by5pbmplY3Rvci5nZXQoSXkpO3JldHVybiB0LnJ1bkluaXRpYWxpemVycygpLHQuZG9uZVByb21pc2UudGhlbigoKCk9PihYdShvLmluamVjdG9yLmdldChXeSxHdSl8fEd1KSx0aGlzLl9tb2R1bGVEb0Jvb3RzdHJhcChvKSxvKSkpfSkpfSkpfWJvb3RzdHJhcE1vZHVsZSh0LGU9W10pe2NvbnN0IG49eF8oe30sZSk7cmV0dXJuKGZ1bmN0aW9uIG8odCxlLG4pe25nRGV2TW9kZSYmKGZ1bmN0aW9uIG8odCxlPSJUeXBlIHBhc3NlZCBpbiBpcyBub3QgTmdNb2R1bGVUeXBlLCBpdCBkb2VzIG5vdCBoYXZlICfJtW1vZCcgcHJvcGVydHkuIil7Zm8odCl8fGJuKGUpfSkobik7Y29uc3QgaT1uZXcgX2gobik7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBuZ0ppdE1vZGUmJiFuZ0ppdE1vZGUpcmV0dXJuIFByb21pc2UucmVzb2x2ZShpKTtjb25zdCBhPXQuZ2V0KG5fLFtdKS5jb25jYXQoZSk7aWYoKGZ1bmN0aW9uIHIodCl7aWYobnVsbCE9PWpiKXtpZih0LmRlZmF1bHRFbmNhcHN1bGF0aW9uIT09amIuZGVmYXVsdEVuY2Fwc3VsYXRpb24pcmV0dXJuIHZvaWQobmdEZXZNb2RlJiZjb25zb2xlLmVycm9yKCJQcm92aWRlZCB2YWx1ZSBmb3IgYGRlZmF1bHRFbmNhcHN1bGF0aW9uYCBjYW4gbm90IGJlIGNoYW5nZWQgb25jZSBpdCBoYXMgYmVlbiBzZXQuIikpO2lmKHQucHJlc2VydmVXaGl0ZXNwYWNlcyE9PWpiLnByZXNlcnZlV2hpdGVzcGFjZXMpcmV0dXJuIHZvaWQobmdEZXZNb2RlJiZjb25zb2xlLmVycm9yKCJQcm92aWRlZCB2YWx1ZSBmb3IgYHByZXNlcnZlV2hpdGVzcGFjZXNgIGNhbiBub3QgYmUgY2hhbmdlZCBvbmNlIGl0IGhhcyBiZWVuIHNldC4iKSl9amI9dH0pKHtkZWZhdWx0RW5jYXBzdWxhdGlvbjp3XyhhLm1hcCgodD0+dC5kZWZhdWx0RW5jYXBzdWxhdGlvbikpKSxwcmVzZXJ2ZVdoaXRlc3BhY2VzOndfKGEubWFwKCh0PT50LnByZXNlcnZlV2hpdGVzcGFjZXMpKSl9KSwoZnVuY3Rpb24gcygpe3JldHVybiAwPT09SXIuc2l6ZX0pKCkpcmV0dXJuIFByb21pc2UucmVzb2x2ZShpKTtjb25zdCBsPShmdW5jdGlvbiBjKHQpe2NvbnN0IGU9W107cmV0dXJuIHQuZm9yRWFjaCgodD0+dCYmZS5wdXNoKC4uLnQpKSksZX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKShhLm1hcCgodD0+dC5wcm92aWRlcnMpKSk7aWYoMD09PWwubGVuZ3RoKXJldHVybiBQcm9taXNlLnJlc29sdmUoaSk7Y29uc3QgZD1KYSh7dXNhZ2U6MCxraW5kOiJOZ01vZHVsZSIsdHlwZTpufSkscD1ycC5jcmVhdGUoe3Byb3ZpZGVyczpsfSkuZ2V0KGQuUmVzb3VyY2VMb2FkZXIpO3JldHVybihmdW5jdGlvbiBtKHQpe2NvbnN0IGU9W10sbj1uZXcgTWFwO2Z1bmN0aW9uIG8oZSl7bGV0IG89bi5nZXQoZSk7aWYoIW8pe2NvbnN0IGk9dChlKTtuLnNldChlLG89aS50aGVuKExyKSl9cmV0dXJuIG99cmV0dXJuIElyLmZvckVhY2goKCh0LG4pPT57Y29uc3QgaT1bXTt0LnRlbXBsYXRlVXJsJiZpLnB1c2gobyh0LnRlbXBsYXRlVXJsKS50aGVuKChlPT57dC50ZW1wbGF0ZT1lfSkpKTtjb25zdCBhPXQuc3R5bGVVcmxzLHI9dC5zdHlsZXN8fCh0LnN0eWxlcz1bXSkscz10LnN0eWxlcy5sZW5ndGg7YSYmYS5mb3JFYWNoKCgoZSxuKT0+e3IucHVzaCgiIiksaS5wdXNoKG8oZSkudGhlbigobz0+e3JbcytuXT1vLGEuc3BsaWNlKGEuaW5kZXhPZihlKSwxKSwwPT1hLmxlbmd0aCYmKHQuc3R5bGVVcmxzPXZvaWQgMCl9KSkpfSkpO2NvbnN0IGw9UHJvbWlzZS5hbGwoaSkudGhlbigoKCk9PihmdW5jdGlvbiB0KGUpe0hyLmRlbGV0ZShlKX0pKG4pKSk7ZS5wdXNoKGwpfSkpLChmdW5jdGlvbiBpKCl7SXI9bmV3IE1hcH0pKCksUHJvbWlzZS5hbGwoZSkudGhlbigoKCk9Pnt9KSl9KSgodD0+UHJvbWlzZS5yZXNvbHZlKHAuZ2V0KHQpKSkpLnRoZW4oKCgpPT5pKSl9KSh0aGlzLmluamVjdG9yLG4sdCkudGhlbigodD0+dGhpcy5ib290c3RyYXBNb2R1bGVGYWN0b3J5KHQsbikpKX1fbW9kdWxlRG9Cb290c3RyYXAodCl7Y29uc3QgZT10LmluamVjdG9yLmdldChPXyk7aWYodC5fYm9vdHN0cmFwQ29tcG9uZW50cy5sZW5ndGg+MCl0Ll9ib290c3RyYXBDb21wb25lbnRzLmZvckVhY2goKHQ9PmUuYm9vdHN0cmFwKHQpKSk7ZWxzZXtpZighdC5pbnN0YW5jZS5uZ0RvQm9vdHN0cmFwKXRocm93IG5ldyBFcnJvcihgVGhlIG1vZHVsZSAke0dlKHQuaW5zdGFuY2UuY29uc3RydWN0b3IpfSB3YXMgYm9vdHN0cmFwcGVkLCBidXQgaXQgZG9lcyBub3QgZGVjbGFyZSAiQE5nTW9kdWxlLmJvb3RzdHJhcCIgY29tcG9uZW50cyBub3IgYSAibmdEb0Jvb3RzdHJhcCIgbWV0aG9kLiBQbGVhc2UgZGVmaW5lIG9uZSBvZiB0aGVzZS5gKTt0Lmluc3RhbmNlLm5nRG9Cb290c3RyYXAoZSl9dGhpcy5fbW9kdWxlcy5wdXNoKHQpfW9uRGVzdHJveSh0KXt0aGlzLl9kZXN0cm95TGlzdGVuZXJzLnB1c2godCl9Z2V0IGluamVjdG9yKCl7cmV0dXJuIHRoaXMuX2luamVjdG9yfWRlc3Ryb3koKXtpZih0aGlzLl9kZXN0cm95ZWQpdGhyb3cgbmV3IEVycm9yKCJUaGUgcGxhdGZvcm0gaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQhIik7dGhpcy5fbW9kdWxlcy5zbGljZSgpLmZvckVhY2goKHQ9PnQuZGVzdHJveSgpKSksdGhpcy5fZGVzdHJveUxpc3RlbmVycy5mb3JFYWNoKCh0PT50KCkpKSx0aGlzLl9kZXN0cm95ZWQ9ITB9Z2V0IGRlc3Ryb3llZCgpe3JldHVybiB0aGlzLl9kZXN0cm95ZWR9fWZ1bmN0aW9uIHhfKHQsZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZS5yZWR1Y2UoeF8sdCk6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLGUpfXZfLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx2XykodnIocnApKX0sdl8uybVwcm92PU1uKHt0b2tlbjp2XyxmYWN0b3J5OnZfLsm1ZmFjfSksdl8uY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpycH1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodl8sW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnJwfV19KSxudWxsKTtjbGFzcyBPX3tjb25zdHJ1Y3Rvcih0LGUsbixvLGkpe3RoaXMuX3pvbmU9dCx0aGlzLl9pbmplY3Rvcj1lLHRoaXMuX2V4Y2VwdGlvbkhhbmRsZXI9bix0aGlzLl9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI9byx0aGlzLl9pbml0U3RhdHVzPWksdGhpcy5fYm9vdHN0cmFwTGlzdGVuZXJzPVtdLHRoaXMuX3ZpZXdzPVtdLHRoaXMuX3J1bm5pbmdUaWNrPSExLHRoaXMuX3N0YWJsZT0hMCx0aGlzLmNvbXBvbmVudFR5cGVzPVtdLHRoaXMuY29tcG9uZW50cz1bXSx0aGlzLl9vbk1pY3JvdGFza0VtcHR5U3Vic2NyaXB0aW9uPXRoaXMuX3pvbmUub25NaWNyb3Rhc2tFbXB0eS5zdWJzY3JpYmUoe25leHQ6KCk9Pnt0aGlzLl96b25lLnJ1bigoKCk9Pnt0aGlzLnRpY2soKX0pKX19KTtjb25zdCBhPW5ldyBEKCh0PT57dGhpcy5fc3RhYmxlPXRoaXMuX3pvbmUuaXNTdGFibGUmJiF0aGlzLl96b25lLmhhc1BlbmRpbmdNYWNyb3Rhc2tzJiYhdGhpcy5fem9uZS5oYXNQZW5kaW5nTWljcm90YXNrcyx0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e3QubmV4dCh0aGlzLl9zdGFibGUpLHQuY29tcGxldGUoKX0pKX0pKSxyPW5ldyBEKCh0PT57bGV0IGU7dGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PntlPXRoaXMuX3pvbmUub25TdGFibGUuc3Vic2NyaWJlKCgoKT0+e2FfLmFzc2VydE5vdEluQW5ndWxhclpvbmUoKSxpXygoKCk9Pnt0aGlzLl9zdGFibGV8fHRoaXMuX3pvbmUuaGFzUGVuZGluZ01hY3JvdGFza3N8fHRoaXMuX3pvbmUuaGFzUGVuZGluZ01pY3JvdGFza3N8fCh0aGlzLl9zdGFibGU9ITAsdC5uZXh0KCEwKSl9KSl9KSl9KSk7Y29uc3Qgbj10aGlzLl96b25lLm9uVW5zdGFibGUuc3Vic2NyaWJlKCgoKT0+e2FfLmFzc2VydEluQW5ndWxhclpvbmUoKSx0aGlzLl9zdGFibGUmJih0aGlzLl9zdGFibGU9ITEsdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9Pnt0Lm5leHQoITEpfSkpKX0pKTtyZXR1cm4oKT0+e2UudW5zdWJzY3JpYmUoKSxuLnVuc3Vic2NyaWJlKCl9fSkpO3RoaXMuaXNTdGFibGU9cmUoYSxyLnBpcGUoRWUoKSkpfWJvb3RzdHJhcCh0LGUpe2lmKCF0aGlzLl9pbml0U3RhdHVzLmRvbmUpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgYm9vdHN0cmFwIGFzIHRoZXJlIGFyZSBzdGlsbCBhc3luY2hyb25vdXMgaW5pdGlhbGl6ZXJzIHJ1bm5pbmcuIEJvb3RzdHJhcCBjb21wb25lbnRzIGluIHRoZSBgbmdEb0Jvb3RzdHJhcGAgbWV0aG9kIG9mIHRoZSByb290IG1vZHVsZS4iKTtsZXQgbjtuPXQgaW5zdGFuY2VvZiBtZz90OnRoaXMuX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeSh0KSx0aGlzLmNvbXBvbmVudFR5cGVzLnB1c2gobi5jb21wb25lbnRUeXBlKTtjb25zdCBvPShmdW5jdGlvbiBpKHQpe3JldHVybiB0LmlzQm91bmRUb01vZHVsZX0pKG4pP3ZvaWQgMDp0aGlzLl9pbmplY3Rvci5nZXQodGgpLGE9bi5jcmVhdGUocnAuTlVMTCxbXSxlfHxuLnNlbGVjdG9yLG8pLHI9YS5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LHM9YS5pbmplY3Rvci5nZXQobV8sbnVsbCksbD1zJiZhLmluamVjdG9yLmdldCh1Xyk7cmV0dXJuIHMmJmwmJmwucmVnaXN0ZXJBcHBsaWNhdGlvbihyLHMpLGEub25EZXN0cm95KCgoKT0+e3RoaXMuZGV0YWNoVmlldyhhLmhvc3RWaWV3KSxQXyh0aGlzLmNvbXBvbmVudHMsYSksbCYmbC51bnJlZ2lzdGVyQXBwbGljYXRpb24ocil9KSksdGhpcy5fbG9hZENvbXBvbmVudChhKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJnlfKCkmJnRoaXMuX2luamVjdG9yLmdldChHeSkubG9nKCJBbmd1bGFyIGlzIHJ1bm5pbmcgaW4gZGV2ZWxvcG1lbnQgbW9kZS4gQ2FsbCBlbmFibGVQcm9kTW9kZSgpIHRvIGVuYWJsZSBwcm9kdWN0aW9uIG1vZGUuIiksYX10aWNrKCl7aWYodGhpcy5fcnVubmluZ1RpY2spdGhyb3cgbmV3IEVycm9yKCJBcHBsaWNhdGlvblJlZi50aWNrIGlzIGNhbGxlZCByZWN1cnNpdmVseSIpO3RyeXt0aGlzLl9ydW5uaW5nVGljaz0hMDtmb3IobGV0IHQgb2YgdGhpcy5fdmlld3MpdC5kZXRlY3RDaGFuZ2VzKCk7aWYoKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZ5XygpKWZvcihsZXQgdCBvZiB0aGlzLl92aWV3cyl0LmNoZWNrTm9DaGFuZ2VzKCl9Y2F0Y2godCl7dGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PnRoaXMuX2V4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlRXJyb3IodCkpKX1maW5hbGx5e3RoaXMuX3J1bm5pbmdUaWNrPSExfX1hdHRhY2hWaWV3KHQpe2NvbnN0IGU9dDt0aGlzLl92aWV3cy5wdXNoKGUpLGUuYXR0YWNoVG9BcHBSZWYodGhpcyl9ZGV0YWNoVmlldyh0KXtjb25zdCBlPXQ7UF8odGhpcy5fdmlld3MsZSksZS5kZXRhY2hGcm9tQXBwUmVmKCl9X2xvYWRDb21wb25lbnQodCl7dGhpcy5hdHRhY2hWaWV3KHQuaG9zdFZpZXcpLHRoaXMudGljaygpLHRoaXMuY29tcG9uZW50cy5wdXNoKHQpLHRoaXMuX2luamVjdG9yLmdldChVeSxbXSkuY29uY2F0KHRoaXMuX2Jvb3RzdHJhcExpc3RlbmVycykuZm9yRWFjaCgoZT0+ZSh0KSkpfW5nT25EZXN0cm95KCl7dGhpcy5fdmlld3Muc2xpY2UoKS5mb3JFYWNoKCh0PT50LmRlc3Ryb3koKSkpLHRoaXMuX29uTWljcm90YXNrRW1wdHlTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKX1nZXQgdmlld0NvdW50KCl7cmV0dXJuIHRoaXMuX3ZpZXdzLmxlbmd0aH19ZnVuY3Rpb24gUF8odCxlKXtjb25zdCBuPXQuaW5kZXhPZihlKTtuPi0xJiZ0LnNwbGljZShuLDEpfWZ1bmN0aW9uIHdfKHQpe2ZvcihsZXQgZT10Lmxlbmd0aC0xO2U+PTA7ZS0tKWlmKHZvaWQgMCE9PXRbZV0pcmV0dXJuIHRbZV19T18uybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fE9fKSh2cihhXyksdnIocnApLHZyKFpzKSx2cih1ZyksdnIoSXkpKX0sT18uybVwcm92PU1uKHt0b2tlbjpPXyxmYWN0b3J5Ok9fLsm1ZmFjfSksT18uY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTphX30se3R5cGU6cnB9LHt0eXBlOlpzfSx7dHlwZTp1Z30se3R5cGU6SXl9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKE9fLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTphX30se3R5cGU6cnB9LHt0eXBlOlpzfSx7dHlwZTp1Z30se3R5cGU6SXl9XX0pLG51bGwpO2NsYXNzIGtfe31jb25zdCBTXz17ZmFjdG9yeVBhdGhQcmVmaXg6IiIsZmFjdG9yeVBhdGhTdWZmaXg6Ii5uZ2ZhY3RvcnkifTtjbGFzcyBEX3tjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX2NvbXBpbGVyPXQsdGhpcy5fY29uZmlnPWV8fFNffWxvYWQodCl7cmV0dXJuIHRoaXMubG9hZEFuZENvbXBpbGUodCl9bG9hZEFuZENvbXBpbGUodCl7bGV0W2Usbl09dC5zcGxpdCgiIyIpO3JldHVybiB2b2lkIDA9PT1uJiYobj0iZGVmYXVsdCIpLFN5c3RlbS5pbXBvcnQoZSkudGhlbigodD0+dFtuXSkpLnRoZW4oKHQ9PkVfKHQsZSxuKSkpLnRoZW4oKHQ9PnRoaXMuX2NvbXBpbGVyLmNvbXBpbGVNb2R1bGVBc3luYyh0KSkpfWxvYWRGYWN0b3J5KHQpe2xldFtlLG5dPXQuc3BsaXQoIiMiKSxvPSJOZ0ZhY3RvcnkiO3JldHVybiB2b2lkIDA9PT1uJiYobj0iZGVmYXVsdCIsbz0iIiksU3lzdGVtLmltcG9ydCh0aGlzLl9jb25maWcuZmFjdG9yeVBhdGhQcmVmaXgrZSt0aGlzLl9jb25maWcuZmFjdG9yeVBhdGhTdWZmaXgpLnRoZW4oKHQ9PnRbbitvXSkpLnRoZW4oKHQ9PkVfKHQsZSxuKSkpfX1mdW5jdGlvbiBFXyh0LGUsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCAnJHtufScgaW4gJyR7ZX0nYCk7cmV0dXJuIHR9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL0RfLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxEXykodnIoZV8pLHZyKGtfLDgpKX0sRF8uybVwcm92PU1uKHt0b2tlbjpEXyxmYWN0b3J5OkRfLsm1ZmFjfSksRF8uY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTplX30se3R5cGU6a18sZGVjb3JhdG9yczpbe3R5cGU6U3J9XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRF8sW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmVffSx7dHlwZTprXyxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfV19KSxudWxsKTtjb25zdCBSXz1DXyhudWxsLCJjb3JlIixbe3Byb3ZpZGU6anksdXNlVmFsdWU6InVua25vd24ifSx7cHJvdmlkZTp2XyxkZXBzOltycF19LHtwcm92aWRlOnVfLGRlcHM6W119LHtwcm92aWRlOkd5LGRlcHM6W119XSksQV89W3twcm92aWRlOk9fLHVzZUNsYXNzOk9fLGRlcHM6W2FfLHJwLFpzLHVnLEl5XX0se3Byb3ZpZGU6dWgsZGVwczpbYV9dLHVzZUZhY3Rvcnk6ZnVuY3Rpb24gVF8odCl7bGV0IGU9W107cmV0dXJuIHQub25TdGFibGUuc3Vic2NyaWJlKCgoKT0+e2Zvcig7ZS5sZW5ndGg7KWUucG9wKCkoKX0pKSxmdW5jdGlvbih0KXtlLnB1c2godCl9fX0se3Byb3ZpZGU6SXksdXNlQ2xhc3M6SXksZGVwczpbW25ldyBTcix6eV1dfSx7cHJvdmlkZTplXyx1c2VDbGFzczplXyxkZXBzOltdfSxGeSx7cHJvdmlkZTpIZyx1c2VGYWN0b3J5OgovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KZnVuY3Rpb24gTl8oKXtyZXR1cm4gcWd9LGRlcHM6W119LHtwcm92aWRlOkxnLHVzZUZhY3Rvcnk6ZnVuY3Rpb24gel8oKXtyZXR1cm4gWmd9LGRlcHM6W119LHtwcm92aWRlOld5LHVzZUZhY3Rvcnk6ZnVuY3Rpb24gSV8odCl7cmV0dXJuIFh1KHQ9dHx8KGZ1bmN0aW9uIGUoKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBnb29nJiYiZW4iIT09Z29vZy5nZXRMb2NhbGUoKT9nb29nLmdldExvY2FsZSgpOiJ1bmRlZmluZWQiIT10eXBlb2YgJGxvY2FsaXplJiYkbG9jYWxpemUubG9jYWxlfHxHdX0pKCkpLHR9LGRlcHM6W1tuZXcga3IoV3kpLG5ldyBTcixuZXcgRXJdXX0se3Byb3ZpZGU6WXksdXNlVmFsdWU6IlVTRCJ9XTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIEhfe2NvbnN0cnVjdG9yKHQpe319dmFyIEZfLExfO0hfLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxIXykodnIoT18pKX0sSF8uybVtb2Q9YW8oe3R5cGU6SF99KSxIXy7JtWluaj12bih7cHJvdmlkZXJzOkFffSksSF8uY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpPX31dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoSF8sW3t0eXBlOkF5LGFyZ3M6W3twcm92aWRlcnM6QV99XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpPX31dfSksbnVsbCksKGZ1bmN0aW9uKHQpe3RbdC5DcmVhdGVWaWV3Tm9kZXM9MF09IkNyZWF0ZVZpZXdOb2RlcyIsdFt0LkNoZWNrTm9DaGFuZ2VzPTFdPSJDaGVja05vQ2hhbmdlcyIsdFt0LkNoZWNrTm9DaGFuZ2VzUHJvamVjdGVkVmlld3M9Ml09IkNoZWNrTm9DaGFuZ2VzUHJvamVjdGVkVmlld3MiLHRbdC5DaGVja0FuZFVwZGF0ZT0zXT0iQ2hlY2tBbmRVcGRhdGUiLHRbdC5DaGVja0FuZFVwZGF0ZVByb2plY3RlZFZpZXdzPTRdPSJDaGVja0FuZFVwZGF0ZVByb2plY3RlZFZpZXdzIix0W3QuRGVzdHJveT01XT0iRGVzdHJveSJ9KShGX3x8KEZfPXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5jcmVhdGU9MF09ImNyZWF0ZSIsdFt0LmRldGVjdENoYW5nZXM9MV09ImRldGVjdENoYW5nZXMiLHRbdC5jaGVja05vQ2hhbmdlcz0yXT0iY2hlY2tOb0NoYW5nZXMiLHRbdC5kZXN0cm95PTNdPSJkZXN0cm95Iix0W3QuaGFuZGxlRXZlbnQ9NF09ImhhbmRsZUV2ZW50In0pKExffHwoTF89e30pKSwKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KInVuZGVmaW5lZCIhPXR5cGVvZiBuZ0Rldk1vZGUmJm5nRGV2TW9kZSYmKGpuLiRsb2NhbGl6ZT1qbi4kbG9jYWxpemV8fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJJdCBsb29rcyBsaWtlIHlvdXIgYXBwbGljYXRpb24gb3Igb25lIG9mIGl0cyBkZXBlbmRlbmNpZXMgaXMgdXNpbmcgaTE4bi5cbkFuZ3VsYXIgOSBpbnRyb2R1Y2VkIGEgZ2xvYmFsIGAkbG9jYWxpemUoKWAgZnVuY3Rpb24gdGhhdCBuZWVkcyB0byBiZSBsb2FkZWQuXG5QbGVhc2UgcnVuIGBuZyBhZGQgQGFuZ3VsYXIvbG9jYWxpemVgIGZyb20gdGhlIEFuZ3VsYXIgQ0xJLlxuKEZvciBub24tQ0xJIHByb2plY3RzLCBhZGQgYGltcG9ydCAnQGFuZ3VsYXIvbG9jYWxpemUvaW5pdCc7YCB0byB5b3VyIGBwb2x5ZmlsbHMudHNgIGZpbGUuXG5Gb3Igc2VydmVyLXNpZGUgcmVuZGVyaW5nIGFwcGxpY2F0aW9ucyBhZGQgdGhlIGltcG9ydCB0byB5b3VyIGBtYWluLnNlcnZlci50c2AgZmlsZS4pIil9KQovKioKICAgICAqIEBsaWNlbnNlIEFuZ3VsYXIgdjEyLjIuMQogICAgICogKGMpIDIwMTAtMjAyMSBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vCiAgICAgKiBMaWNlbnNlOiBNSVQKICAgICAqLwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi87Y29uc3QgQl89InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLFZfPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3csal89InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiYidW5kZWZpbmVkIiE9dHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlJiZzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUmJnNlbGYsVV89InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWwmJmdsb2JhbCxHXz1mdW5jdGlvbih0LC4uLmUpe2lmKEdfLnRyYW5zbGF0ZSl7Y29uc3Qgbj1HXy50cmFuc2xhdGUodCxlKTt0PW5bMF0sZT1uWzFdfWxldCBuPVdfKHRbMF0sdC5yYXdbMF0pO2ZvcihsZXQgbz0xO288dC5sZW5ndGg7bysrKW4rPWVbby0xXStXXyh0W29dLHQucmF3W29dKTtyZXR1cm4gbn07ZnVuY3Rpb24gV18odCxlKXtyZXR1cm4iOiI9PT1lLmNoYXJBdCgwKT90LnN1YnN0cmluZygoZnVuY3Rpb24gbih0LGUpe2ZvcihsZXQgbj0xLG89MTtuPHQubGVuZ3RoO24rKyxvKyspaWYoIlxcIj09PWVbb10pbysrO2Vsc2UgaWYoIjoiPT09dFtuXSlyZXR1cm4gbjt0aHJvdyBuZXcgRXJyb3IoYFVudGVybWluYXRlZCAkbG9jYWxpemUgbWV0YWRhdGEgYmxvY2sgaW4gIiR7ZX0iLmApfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKSh0LGUpKzEpOnR9KEJffHxVX3x8Vl98fGpfKS4kbG9jYWxpemU9R187Ci8qKgogICAgICogQGxpY2Vuc2UgQW5ndWxhciB2MTIuMi4xCiAgICAgKiAoYykgMjAxMC0yMDIxIEdvb2dsZSBMTEMuIGh0dHBzOi8vYW5ndWxhci5pby8KICAgICAqIExpY2Vuc2U6IE1JVAogICAgICovCmxldCBZXz1udWxsO2Z1bmN0aW9uIHFfKCl7cmV0dXJuIFlffQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgWl89bmV3IEdhKCJEb2N1bWVudFRva2VuIik7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIFhfe2hpc3RvcnlHbyh0KXt0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpfX1mdW5jdGlvbiBLXygpe3JldHVybiB2cihKXyl9WF8uybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFhfKX0sWF8uybVwcm92PU1uKHtmYWN0b3J5OktfLHRva2VuOlhfLHByb3ZpZGVkSW46InBsYXRmb3JtIn0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWF8sW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOiJwbGF0Zm9ybSIsdXNlRmFjdG9yeTpLX31dfV0sbnVsbCxudWxsKSxuZXcgR2EoIkxvY2F0aW9uIEluaXRpYWxpemVkIik7Y2xhc3MgSl8gZXh0ZW5kcyBYX3tjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuX2RvYz10LHRoaXMuX2luaXQoKX1faW5pdCgpe3RoaXMubG9jYXRpb249d2luZG93LmxvY2F0aW9uLHRoaXMuX2hpc3Rvcnk9d2luZG93Lmhpc3Rvcnl9Z2V0QmFzZUhyZWZGcm9tRE9NKCl7cmV0dXJuIHFfKCkuZ2V0QmFzZUhyZWYodGhpcy5fZG9jKX1vblBvcFN0YXRlKHQpe2NvbnN0IGU9cV8oKS5nZXRHbG9iYWxFdmVudFRhcmdldCh0aGlzLl9kb2MsIndpbmRvdyIpO3JldHVybiBlLmFkZEV2ZW50TGlzdGVuZXIoInBvcHN0YXRlIix0LCExKSwoKT0+ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJwb3BzdGF0ZSIsdCl9b25IYXNoQ2hhbmdlKHQpe2NvbnN0IGU9cV8oKS5nZXRHbG9iYWxFdmVudFRhcmdldCh0aGlzLl9kb2MsIndpbmRvdyIpO3JldHVybiBlLmFkZEV2ZW50TGlzdGVuZXIoImhhc2hjaGFuZ2UiLHQsITEpLCgpPT5lLnJlbW92ZUV2ZW50TGlzdGVuZXIoImhhc2hjaGFuZ2UiLHQpfWdldCBocmVmKCl7cmV0dXJuIHRoaXMubG9jYXRpb24uaHJlZn1nZXQgcHJvdG9jb2woKXtyZXR1cm4gdGhpcy5sb2NhdGlvbi5wcm90b2NvbH1nZXQgaG9zdG5hbWUoKXtyZXR1cm4gdGhpcy5sb2NhdGlvbi5ob3N0bmFtZX1nZXQgcG9ydCgpe3JldHVybiB0aGlzLmxvY2F0aW9uLnBvcnR9Z2V0IHBhdGhuYW1lKCl7cmV0dXJuIHRoaXMubG9jYXRpb24ucGF0aG5hbWV9Z2V0IHNlYXJjaCgpe3JldHVybiB0aGlzLmxvY2F0aW9uLnNlYXJjaH1nZXQgaGFzaCgpe3JldHVybiB0aGlzLmxvY2F0aW9uLmhhc2h9c2V0IHBhdGhuYW1lKHQpe3RoaXMubG9jYXRpb24ucGF0aG5hbWU9dH1wdXNoU3RhdGUodCxlLG4pe1FfKCk/dGhpcy5faGlzdG9yeS5wdXNoU3RhdGUodCxlLG4pOnRoaXMubG9jYXRpb24uaGFzaD1ufXJlcGxhY2VTdGF0ZSh0LGUsbil7UV8oKT90aGlzLl9oaXN0b3J5LnJlcGxhY2VTdGF0ZSh0LGUsbik6dGhpcy5sb2NhdGlvbi5oYXNoPW59Zm9yd2FyZCgpe3RoaXMuX2hpc3RvcnkuZm9yd2FyZCgpfWJhY2soKXt0aGlzLl9oaXN0b3J5LmJhY2soKX1oaXN0b3J5R28odD0wKXt0aGlzLl9oaXN0b3J5LmdvKHQpfWdldFN0YXRlKCl7cmV0dXJuIHRoaXMuX2hpc3Rvcnkuc3RhdGV9fWZ1bmN0aW9uIFFfKCl7cmV0dXJuISF3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGV9ZnVuY3Rpb24gJF8oKXtyZXR1cm4gbmV3IEpfKHZyKFpfKSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiB0Qyh0LGUpe2lmKDA9PXQubGVuZ3RoKXJldHVybiBlO2lmKDA9PWUubGVuZ3RoKXJldHVybiB0O2xldCBuPTA7cmV0dXJuIHQuZW5kc1dpdGgoIi8iKSYmbisrLGUuc3RhcnRzV2l0aCgiLyIpJiZuKyssMj09bj90K2Uuc3Vic3RyaW5nKDEpOjE9PW4/dCtlOnQrIi8iK2V9ZnVuY3Rpb24gZUModCl7Y29uc3QgZT10Lm1hdGNoKC8jfFw/fCQvKSxuPWUmJmUuaW5kZXh8fHQubGVuZ3RoO3JldHVybiB0LnNsaWNlKDAsbi0oIi8iPT09dFtuLTFdPzE6MCkpK3Quc2xpY2Uobil9ZnVuY3Rpb24gbkModCl7cmV0dXJuIHQmJiI/IiE9PXRbMF0/Ij8iK3Q6dH0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovSl8uybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEpfKSh2cihaXykpfSxKXy7JtXByb3Y9TW4oe2ZhY3Rvcnk6JF8sdG9rZW46Sl8scHJvdmlkZWRJbjoicGxhdGZvcm0ifSksSl8uY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEpfLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicGxhdGZvcm0iLHVzZUZhY3Rvcnk6JF99XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XX0pLG51bGwpO2NsYXNzIG9De2hpc3RvcnlHbyh0KXt0aHJvdyBuZXcgRXJyb3IoIk5vdCBpbXBsZW1lbnRlZCIpfX1mdW5jdGlvbiBpQyh0KXtjb25zdCBlPXZyKFpfKS5sb2NhdGlvbjtyZXR1cm4gbmV3IHJDKHZyKFhfKSxlJiZlLm9yaWdpbnx8IiIpfW9DLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxvQyl9LG9DLsm1cHJvdj1Nbih7ZmFjdG9yeTppQyx0b2tlbjpvQyxwcm92aWRlZEluOiJyb290In0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgob0MsW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOiJyb290Iix1c2VGYWN0b3J5OmlDfV19XSxudWxsLG51bGwpO2NvbnN0IGFDPW5ldyBHYSgiYXBwQmFzZUhyZWYiKTtjbGFzcyByQyBleHRlbmRzIG9De2NvbnN0cnVjdG9yKHQsZSl7aWYoc3VwZXIoKSx0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uPXQsdGhpcy5fcmVtb3ZlTGlzdGVuZXJGbnM9W10sbnVsbD09ZSYmKGU9dGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5nZXRCYXNlSHJlZkZyb21ET00oKSksbnVsbD09ZSl0aHJvdyBuZXcgRXJyb3IoIk5vIGJhc2UgaHJlZiBzZXQuIFBsZWFzZSBwcm92aWRlIGEgdmFsdWUgZm9yIHRoZSBBUFBfQkFTRV9IUkVGIHRva2VuIG9yIGFkZCBhIGJhc2UgZWxlbWVudCB0byB0aGUgZG9jdW1lbnQuIik7dGhpcy5fYmFzZUhyZWY9ZX1uZ09uRGVzdHJveSgpe2Zvcig7dGhpcy5fcmVtb3ZlTGlzdGVuZXJGbnMubGVuZ3RoOyl0aGlzLl9yZW1vdmVMaXN0ZW5lckZucy5wb3AoKSgpfW9uUG9wU3RhdGUodCl7dGhpcy5fcmVtb3ZlTGlzdGVuZXJGbnMucHVzaCh0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLm9uUG9wU3RhdGUodCksdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5vbkhhc2hDaGFuZ2UodCkpfWdldEJhc2VIcmVmKCl7cmV0dXJuIHRoaXMuX2Jhc2VIcmVmfXByZXBhcmVFeHRlcm5hbFVybCh0KXtyZXR1cm4gdEModGhpcy5fYmFzZUhyZWYsdCl9cGF0aCh0PSExKXtjb25zdCBlPXRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucGF0aG5hbWUrbkModGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5zZWFyY2gpLG49dGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5oYXNoO3JldHVybiBuJiZ0P2Ake2V9JHtufWA6ZX1wdXNoU3RhdGUodCxlLG4sbyl7Y29uc3QgaT10aGlzLnByZXBhcmVFeHRlcm5hbFVybChuK25DKG8pKTt0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnB1c2hTdGF0ZSh0LGUsaSl9cmVwbGFjZVN0YXRlKHQsZSxuLG8pe2NvbnN0IGk9dGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwobituQyhvKSk7dGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5yZXBsYWNlU3RhdGUodCxlLGkpfWZvcndhcmQoKXt0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmZvcndhcmQoKX1iYWNrKCl7dGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5iYWNrKCl9aGlzdG9yeUdvKHQ9MCl7dmFyIGUsbjtudWxsPT09KG49KGU9dGhpcy5fcGxhdGZvcm1Mb2NhdGlvbikuaGlzdG9yeUdvKXx8dm9pZCAwPT09bnx8bi5jYWxsKGUsdCl9fXJDLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxyQykodnIoWF8pLHZyKGFDLDgpKX0sckMuybVwcm92PU1uKHt0b2tlbjpyQyxmYWN0b3J5OnJDLsm1ZmFjfSksckMuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpYX30se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOlthQ119XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgockMsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlhffSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W2FDXX1dfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIHNDIGV4dGVuZHMgb0N7Y29uc3RydWN0b3IodCxlKXtzdXBlcigpLHRoaXMuX3BsYXRmb3JtTG9jYXRpb249dCx0aGlzLl9iYXNlSHJlZj0iIix0aGlzLl9yZW1vdmVMaXN0ZW5lckZucz1bXSxudWxsIT1lJiYodGhpcy5fYmFzZUhyZWY9ZSl9bmdPbkRlc3Ryb3koKXtmb3IoO3RoaXMuX3JlbW92ZUxpc3RlbmVyRm5zLmxlbmd0aDspdGhpcy5fcmVtb3ZlTGlzdGVuZXJGbnMucG9wKCkoKX1vblBvcFN0YXRlKHQpe3RoaXMuX3JlbW92ZUxpc3RlbmVyRm5zLnB1c2godGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5vblBvcFN0YXRlKHQpLHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ub25IYXNoQ2hhbmdlKHQpKX1nZXRCYXNlSHJlZigpe3JldHVybiB0aGlzLl9iYXNlSHJlZn1wYXRoKHQ9ITEpe2xldCBlPXRoaXMuX3BsYXRmb3JtTG9jYXRpb24uaGFzaDtyZXR1cm4gbnVsbD09ZSYmKGU9IiMiKSxlLmxlbmd0aD4wP2Uuc3Vic3RyaW5nKDEpOmV9cHJlcGFyZUV4dGVybmFsVXJsKHQpe2NvbnN0IGU9dEModGhpcy5fYmFzZUhyZWYsdCk7cmV0dXJuIGUubGVuZ3RoPjA/IiMiK2U6ZX1wdXNoU3RhdGUodCxlLG4sbyl7bGV0IGk9dGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwobituQyhvKSk7MD09aS5sZW5ndGgmJihpPXRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucGF0aG5hbWUpLHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucHVzaFN0YXRlKHQsZSxpKX1yZXBsYWNlU3RhdGUodCxlLG4sbyl7bGV0IGk9dGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwobituQyhvKSk7MD09aS5sZW5ndGgmJihpPXRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucGF0aG5hbWUpLHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucmVwbGFjZVN0YXRlKHQsZSxpKX1mb3J3YXJkKCl7dGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5mb3J3YXJkKCl9YmFjaygpe3RoaXMuX3BsYXRmb3JtTG9jYXRpb24uYmFjaygpfWhpc3RvcnlHbyh0PTApe3ZhciBlLG47bnVsbD09PShuPShlPXRoaXMuX3BsYXRmb3JtTG9jYXRpb24pLmhpc3RvcnlHbyl8fHZvaWQgMD09PW58fG4uY2FsbChlLHQpfX1zQy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8c0MpKHZyKFhfKSx2cihhQyw4KSl9LHNDLsm1cHJvdj1Nbih7dG9rZW46c0MsZmFjdG9yeTpzQy7JtWZhY30pLHNDLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6WF99LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbYUNdfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHNDLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpYX30se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOlthQ119XX1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBsQ3tjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX3N1YmplY3Q9bmV3IExoLHRoaXMuX3VybENoYW5nZUxpc3RlbmVycz1bXSx0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5PXQ7Y29uc3Qgbj10aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5LmdldEJhc2VIcmVmKCk7dGhpcy5fcGxhdGZvcm1Mb2NhdGlvbj1lLHRoaXMuX2Jhc2VIcmVmPWVDKGRDKG4pKSx0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5Lm9uUG9wU3RhdGUoKHQ9Pnt0aGlzLl9zdWJqZWN0LmVtaXQoe3VybDp0aGlzLnBhdGgoITApLHBvcDohMCxzdGF0ZTp0LnN0YXRlLHR5cGU6dC50eXBlfSl9KSl9cGF0aCh0PSExKXtyZXR1cm4gdGhpcy5ub3JtYWxpemUodGhpcy5fcGxhdGZvcm1TdHJhdGVneS5wYXRoKHQpKX1nZXRTdGF0ZSgpe3JldHVybiB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmdldFN0YXRlKCl9aXNDdXJyZW50UGF0aEVxdWFsVG8odCxlPSIiKXtyZXR1cm4gdGhpcy5wYXRoKCk9PXRoaXMubm9ybWFsaXplKHQrbkMoZSkpfW5vcm1hbGl6ZSh0KXtyZXR1cm4gbEMuc3RyaXBUcmFpbGluZ1NsYXNoKChmdW5jdGlvbiBlKHQsbil7cmV0dXJuIHQmJm4uc3RhcnRzV2l0aCh0KT9uLnN1YnN0cmluZyh0Lmxlbmd0aCk6bn0pKHRoaXMuX2Jhc2VIcmVmLGRDKHQpKSl9cHJlcGFyZUV4dGVybmFsVXJsKHQpe3JldHVybiB0JiYiLyIhPT10WzBdJiYodD0iLyIrdCksdGhpcy5fcGxhdGZvcm1TdHJhdGVneS5wcmVwYXJlRXh0ZXJuYWxVcmwodCl9Z28odCxlPSIiLG49bnVsbCl7dGhpcy5fcGxhdGZvcm1TdHJhdGVneS5wdXNoU3RhdGUobiwiIix0LGUpLHRoaXMuX25vdGlmeVVybENoYW5nZUxpc3RlbmVycyh0aGlzLnByZXBhcmVFeHRlcm5hbFVybCh0K25DKGUpKSxuKX1yZXBsYWNlU3RhdGUodCxlPSIiLG49bnVsbCl7dGhpcy5fcGxhdGZvcm1TdHJhdGVneS5yZXBsYWNlU3RhdGUobiwiIix0LGUpLHRoaXMuX25vdGlmeVVybENoYW5nZUxpc3RlbmVycyh0aGlzLnByZXBhcmVFeHRlcm5hbFVybCh0K25DKGUpKSxuKX1mb3J3YXJkKCl7dGhpcy5fcGxhdGZvcm1TdHJhdGVneS5mb3J3YXJkKCl9YmFjaygpe3RoaXMuX3BsYXRmb3JtU3RyYXRlZ3kuYmFjaygpfWhpc3RvcnlHbyh0PTApe3ZhciBlLG47bnVsbD09PShuPShlPXRoaXMuX3BsYXRmb3JtU3RyYXRlZ3kpLmhpc3RvcnlHbyl8fHZvaWQgMD09PW58fG4uY2FsbChlLHQpfW9uVXJsQ2hhbmdlKHQpe3RoaXMuX3VybENoYW5nZUxpc3RlbmVycy5wdXNoKHQpLHRoaXMuX3VybENoYW5nZVN1YnNjcmlwdGlvbnx8KHRoaXMuX3VybENoYW5nZVN1YnNjcmlwdGlvbj10aGlzLnN1YnNjcmliZSgodD0+e3RoaXMuX25vdGlmeVVybENoYW5nZUxpc3RlbmVycyh0LnVybCx0LnN0YXRlKX0pKSl9X25vdGlmeVVybENoYW5nZUxpc3RlbmVycyh0PSIiLGUpe3RoaXMuX3VybENoYW5nZUxpc3RlbmVycy5mb3JFYWNoKChuPT5uKHQsZSkpKX1zdWJzY3JpYmUodCxlLG4pe3JldHVybiB0aGlzLl9zdWJqZWN0LnN1YnNjcmliZSh7bmV4dDp0LGVycm9yOmUsY29tcGxldGU6bn0pfX1mdW5jdGlvbiBjQygpe3JldHVybiBuZXcgbEModnIob0MpLHZyKFhfKSl9ZnVuY3Rpb24gZEModCl7cmV0dXJuIHQucmVwbGFjZSgvXC9pbmRleC5odG1sJC8sIiIpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovbEMuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGxDKSh2cihvQyksdnIoWF8pKX0sbEMubm9ybWFsaXplUXVlcnlQYXJhbXM9bkMsbEMuam9pbldpdGhTbGFzaD10QyxsQy5zdHJpcFRyYWlsaW5nU2xhc2g9ZUMsbEMuybVwcm92PU1uKHtmYWN0b3J5OmNDLHRva2VuOmxDLHByb3ZpZGVkSW46InJvb3QifSksbEMuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpvQ30se3R5cGU6WF99XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGxDLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCIsdXNlRmFjdG9yeTpjQ31dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOm9DfSx7dHlwZTpYX31dfSksbnVsbCk7Y29uc3QgcEM9e0FEUDpbdm9pZCAwLHZvaWQgMCwwXSxBRk46W3ZvaWQgMCx2b2lkIDAsMF0sQUxMOlt2b2lkIDAsdm9pZCAwLDBdLEFNRDpbdm9pZCAwLHZvaWQgMCwyXSxBT0E6W3ZvaWQgMCwiS3oiXSxBUlM6W3ZvaWQgMCwiJCJdLEFVRDpbIkEkIiwiJCJdLEJBTTpbdm9pZCAwLCJLTSJdLEJCRDpbdm9pZCAwLCIkIl0sQkRUOlt2b2lkIDAsIuCnsyJdLEJIRDpbdm9pZCAwLHZvaWQgMCwzXSxCSUY6W3ZvaWQgMCx2b2lkIDAsMF0sQk1EOlt2b2lkIDAsIiQiXSxCTkQ6W3ZvaWQgMCwiJCJdLEJPQjpbdm9pZCAwLCJCcyJdLEJSTDpbIlIkIl0sQlNEOlt2b2lkIDAsIiQiXSxCV1A6W3ZvaWQgMCwiUCJdLEJZTjpbdm9pZCAwLCLRgC4iLDJdLEJZUjpbdm9pZCAwLHZvaWQgMCwwXSxCWkQ6W3ZvaWQgMCwiJCJdLENBRDpbIkNBJCIsIiQiLDJdLENIRjpbdm9pZCAwLHZvaWQgMCwyXSxDTEY6W3ZvaWQgMCx2b2lkIDAsNF0sQ0xQOlt2b2lkIDAsIiQiLDBdLENOWTpbIkNOwqUiLCLCpSJdLENPUDpbdm9pZCAwLCIkIiwyXSxDUkM6W3ZvaWQgMCwi4oKhIiwyXSxDVUM6W3ZvaWQgMCwiJCJdLENVUDpbdm9pZCAwLCIkIl0sQ1pLOlt2b2lkIDAsIkvEjSIsMl0sREpGOlt2b2lkIDAsdm9pZCAwLDBdLERLSzpbdm9pZCAwLCJrciIsMl0sRE9QOlt2b2lkIDAsIiQiXSxFR1A6W3ZvaWQgMCwiRcKjIl0sRVNQOlt2b2lkIDAsIuKCpyIsMF0sRVVSOlsi4oKsIl0sRkpEOlt2b2lkIDAsIiQiXSxGS1A6W3ZvaWQgMCwiwqMiXSxHQlA6WyLCoyJdLEdFTDpbdm9pZCAwLCLigr4iXSxHSVA6W3ZvaWQgMCwiwqMiXSxHTkY6W3ZvaWQgMCwiRkciLDBdLEdUUTpbdm9pZCAwLCJRIl0sR1lEOlt2b2lkIDAsIiQiLDJdLEhLRDpbIkhLJCIsIiQiXSxITkw6W3ZvaWQgMCwiTCJdLEhSSzpbdm9pZCAwLCJrbiJdLEhVRjpbdm9pZCAwLCJGdCIsMl0sSURSOlt2b2lkIDAsIlJwIiwyXSxJTFM6WyLigqoiXSxJTlI6WyLigrkiXSxJUUQ6W3ZvaWQgMCx2b2lkIDAsMF0sSVJSOlt2b2lkIDAsdm9pZCAwLDBdLElTSzpbdm9pZCAwLCJrciIsMF0sSVRMOlt2b2lkIDAsdm9pZCAwLDBdLEpNRDpbdm9pZCAwLCIkIl0sSk9EOlt2b2lkIDAsdm9pZCAwLDNdLEpQWTpbIsKlIix2b2lkIDAsMF0sS0hSOlt2b2lkIDAsIuGfmyJdLEtNRjpbdm9pZCAwLCJDRiIsMF0sS1BXOlt2b2lkIDAsIuKCqSIsMF0sS1JXOlsi4oKpIix2b2lkIDAsMF0sS1dEOlt2b2lkIDAsdm9pZCAwLDNdLEtZRDpbdm9pZCAwLCIkIl0sS1pUOlt2b2lkIDAsIuKCuCJdLExBSzpbdm9pZCAwLCLigq0iLDBdLExCUDpbdm9pZCAwLCJMwqMiLDBdLExLUjpbdm9pZCAwLCJScyJdLExSRDpbdm9pZCAwLCIkIl0sTFRMOlt2b2lkIDAsIkx0Il0sTFVGOlt2b2lkIDAsdm9pZCAwLDBdLExWTDpbdm9pZCAwLCJMcyJdLExZRDpbdm9pZCAwLHZvaWQgMCwzXSxNR0E6W3ZvaWQgMCwiQXIiLDBdLE1HRjpbdm9pZCAwLHZvaWQgMCwwXSxNTUs6W3ZvaWQgMCwiSyIsMF0sTU5UOlt2b2lkIDAsIuKCriIsMl0sTVJPOlt2b2lkIDAsdm9pZCAwLDBdLE1VUjpbdm9pZCAwLCJScyIsMl0sTVhOOlsiTVgkIiwiJCJdLE1ZUjpbdm9pZCAwLCJSTSJdLE5BRDpbdm9pZCAwLCIkIl0sTkdOOlt2b2lkIDAsIuKCpiJdLE5JTzpbdm9pZCAwLCJDJCJdLE5PSzpbdm9pZCAwLCJrciIsMl0sTlBSOlt2b2lkIDAsIlJzIl0sTlpEOlsiTlokIiwiJCJdLE9NUjpbdm9pZCAwLHZvaWQgMCwzXSxQSFA6W3ZvaWQgMCwi4oKxIl0sUEtSOlt2b2lkIDAsIlJzIiwyXSxQTE46W3ZvaWQgMCwiesWCIl0sUFlHOlt2b2lkIDAsIuKCsiIsMF0sUk9OOlt2b2lkIDAsImxlaSJdLFJTRDpbdm9pZCAwLHZvaWQgMCwwXSxSVUI6W3ZvaWQgMCwi4oK9Il0sUlVSOlt2b2lkIDAsItGALiJdLFJXRjpbdm9pZCAwLCJSRiIsMF0sU0JEOlt2b2lkIDAsIiQiXSxTRUs6W3ZvaWQgMCwia3IiLDJdLFNHRDpbdm9pZCAwLCIkIl0sU0hQOlt2b2lkIDAsIsKjIl0sU0xMOlt2b2lkIDAsdm9pZCAwLDBdLFNPUzpbdm9pZCAwLHZvaWQgMCwwXSxTUkQ6W3ZvaWQgMCwiJCJdLFNTUDpbdm9pZCAwLCLCoyJdLFNURDpbdm9pZCAwLHZvaWQgMCwwXSxTVE46W3ZvaWQgMCwiRGIiXSxTWVA6W3ZvaWQgMCwiwqMiLDBdLFRIQjpbdm9pZCAwLCLguL8iXSxUTU06W3ZvaWQgMCx2b2lkIDAsMF0sVE5EOlt2b2lkIDAsdm9pZCAwLDNdLFRPUDpbdm9pZCAwLCJUJCJdLFRSTDpbdm9pZCAwLHZvaWQgMCwwXSxUUlk6W3ZvaWQgMCwi4oK6Il0sVFREOlt2b2lkIDAsIiQiXSxUV0Q6WyJOVCQiLCIkIiwyXSxUWlM6W3ZvaWQgMCx2b2lkIDAsMl0sVUFIOlt2b2lkIDAsIuKCtCJdLFVHWDpbdm9pZCAwLHZvaWQgMCwwXSxVU0Q6WyIkIl0sVVlJOlt2b2lkIDAsdm9pZCAwLDBdLFVZVTpbdm9pZCAwLCIkIl0sVVlXOlt2b2lkIDAsdm9pZCAwLDRdLFVaUzpbdm9pZCAwLHZvaWQgMCwyXSxWRUY6W3ZvaWQgMCwiQnMiLDJdLFZORDpbIuKCqyIsdm9pZCAwLDBdLFZVVjpbdm9pZCAwLHZvaWQgMCwwXSxYQUY6WyJGQ0ZBIix2b2lkIDAsMF0sWENEOlsiRUMkIiwiJCJdLFhPRjpbIkNGQSIsdm9pZCAwLDBdLFhQRjpbIkNGUEYiLHZvaWQgMCwwXSxYWFg6WyLCpCJdLFlFUjpbdm9pZCAwLHZvaWQgMCwwXSxaQVI6W3ZvaWQgMCwiUiJdLFpNSzpbdm9pZCAwLHZvaWQgMCwwXSxaTVc6W3ZvaWQgMCwiWksiXSxaV0Q6W3ZvaWQgMCx2b2lkIDAsMF19OwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi92YXIgbUMsdUMsZkMsZ0MsaEMsYkMseUM7ZnVuY3Rpb24gX0ModCxlKXtyZXR1cm4gd0MoTHUodClbanUuRGF0ZUZvcm1hdF0sZSl9ZnVuY3Rpb24gQ0ModCxlKXtyZXR1cm4gd0MoTHUodClbanUuVGltZUZvcm1hdF0sZSl9ZnVuY3Rpb24gTUModCxlKXtyZXR1cm4gd0MoTHUodClbanUuRGF0ZVRpbWVGb3JtYXRdLGUpfWZ1bmN0aW9uIHZDKHQsZSl7Y29uc3Qgbj1MdSh0KSxvPW5banUuTnVtYmVyU3ltYm9sc11bZV07aWYodm9pZCAwPT09byl7aWYoZT09PWJDLkN1cnJlbmN5RGVjaW1hbClyZXR1cm4gbltqdS5OdW1iZXJTeW1ib2xzXVtiQy5EZWNpbWFsXTtpZihlPT09YkMuQ3VycmVuY3lHcm91cClyZXR1cm4gbltqdS5OdW1iZXJTeW1ib2xzXVtiQy5Hcm91cF19cmV0dXJuIG99ZnVuY3Rpb24geEModCxlKXtyZXR1cm4gTHUodClbanUuTnVtYmVyRm9ybWF0c11bZV19IShmdW5jdGlvbih0KXt0W3QuRGVjaW1hbD0wXT0iRGVjaW1hbCIsdFt0LlBlcmNlbnQ9MV09IlBlcmNlbnQiLHRbdC5DdXJyZW5jeT0yXT0iQ3VycmVuY3kiLHRbdC5TY2llbnRpZmljPTNdPSJTY2llbnRpZmljIn0pKG1DfHwobUM9e30pKSwoZnVuY3Rpb24odCl7dFt0Llplcm89MF09Ilplcm8iLHRbdC5PbmU9MV09Ik9uZSIsdFt0LlR3bz0yXT0iVHdvIix0W3QuRmV3PTNdPSJGZXciLHRbdC5NYW55PTRdPSJNYW55Iix0W3QuT3RoZXI9NV09Ik90aGVyIn0pKHVDfHwodUM9e30pKSwoZnVuY3Rpb24odCl7dFt0LkZvcm1hdD0wXT0iRm9ybWF0Iix0W3QuU3RhbmRhbG9uZT0xXT0iU3RhbmRhbG9uZSJ9KShmQ3x8KGZDPXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5OYXJyb3c9MF09Ik5hcnJvdyIsdFt0LkFiYnJldmlhdGVkPTFdPSJBYmJyZXZpYXRlZCIsdFt0LldpZGU9Ml09IldpZGUiLHRbdC5TaG9ydD0zXT0iU2hvcnQifSkoZ0N8fChnQz17fSkpLChmdW5jdGlvbih0KXt0W3QuU2hvcnQ9MF09IlNob3J0Iix0W3QuTWVkaXVtPTFdPSJNZWRpdW0iLHRbdC5Mb25nPTJdPSJMb25nIix0W3QuRnVsbD0zXT0iRnVsbCJ9KShoQ3x8KGhDPXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5EZWNpbWFsPTBdPSJEZWNpbWFsIix0W3QuR3JvdXA9MV09Ikdyb3VwIix0W3QuTGlzdD0yXT0iTGlzdCIsdFt0LlBlcmNlbnRTaWduPTNdPSJQZXJjZW50U2lnbiIsdFt0LlBsdXNTaWduPTRdPSJQbHVzU2lnbiIsdFt0Lk1pbnVzU2lnbj01XT0iTWludXNTaWduIix0W3QuRXhwb25lbnRpYWw9Nl09IkV4cG9uZW50aWFsIix0W3QuU3VwZXJzY3JpcHRpbmdFeHBvbmVudD03XT0iU3VwZXJzY3JpcHRpbmdFeHBvbmVudCIsdFt0LlBlck1pbGxlPThdPSJQZXJNaWxsZSIsdFt0WzEvMF09OV09IkluZmluaXR5Iix0W3QuTmFOPTEwXT0iTmFOIix0W3QuVGltZVNlcGFyYXRvcj0xMV09IlRpbWVTZXBhcmF0b3IiLHRbdC5DdXJyZW5jeURlY2ltYWw9MTJdPSJDdXJyZW5jeURlY2ltYWwiLHRbdC5DdXJyZW5jeUdyb3VwPTEzXT0iQ3VycmVuY3lHcm91cCJ9KShiQ3x8KGJDPXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5TdW5kYXk9MF09IlN1bmRheSIsdFt0Lk1vbmRheT0xXT0iTW9uZGF5Iix0W3QuVHVlc2RheT0yXT0iVHVlc2RheSIsdFt0LldlZG5lc2RheT0zXT0iV2VkbmVzZGF5Iix0W3QuVGh1cnNkYXk9NF09IlRodXJzZGF5Iix0W3QuRnJpZGF5PTVdPSJGcmlkYXkiLHRbdC5TYXR1cmRheT02XT0iU2F0dXJkYXkifSkoeUN8fCh5Qz17fSkpO2NvbnN0IE9DPUJ1O2Z1bmN0aW9uIFBDKHQpe2lmKCF0W2p1LkV4dHJhRGF0YV0pdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGV4dHJhIGxvY2FsZSBkYXRhIGZvciB0aGUgbG9jYWxlICIke3RbanUuTG9jYWxlSWRdfSIuIFVzZSAicmVnaXN0ZXJMb2NhbGVEYXRhIiB0byBsb2FkIG5ldyBkYXRhLiBTZWUgdGhlICJJMThuIGd1aWRlIiBvbiBhbmd1bGFyLmlvIHRvIGtub3cgbW9yZS5gKX1mdW5jdGlvbiB3Qyh0LGUpe2ZvcihsZXQgbj1lO24+LTE7bi0tKWlmKHZvaWQgMCE9PXRbbl0pcmV0dXJuIHRbbl07dGhyb3cgbmV3IEVycm9yKCJMb2NhbGUgZGF0YSBBUEk6IGxvY2FsZSBkYXRhIHVuZGVmaW5lZCIpfWZ1bmN0aW9uIGtDKHQpe2NvbnN0W2Usbl09dC5zcGxpdCgiOiIpO3JldHVybntob3VyczorZSxtaW51dGVzOitufX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IFNDPS9eKFxkezR9KS0/KFxkXGQpLT8oXGRcZCkoPzpUKFxkXGQpKD86Oj8oXGRcZCkoPzo6PyhcZFxkKSg/OlwuKFxkKykpPyk/KT8oWnwoWystXSkoXGRcZCk6PyhcZFxkKSk/KT8kLyxEQz17fSxFQz0vKCg/OlteQkVHSExNT1NXWVphYmNkaG1zd3l6J10rKXwoPzonKD86W14nXXwnJykqJyl8KD86R3sxLDV9fHl7MSw0fXxZezEsNH18TXsxLDV9fEx7MSw1fXx3ezEsMn18V3sxfXxkezEsMn18RXsxLDZ9fGN7MSw2fXxhezEsNX18YnsxLDV9fEJ7MSw1fXxoezEsMn18SHsxLDJ9fG17MSwyfXxzezEsMn18U3sxLDN9fHp7MSw0fXxaezEsNX18T3sxLDR9KSkoW1xzXFNdKikvO3ZhciBSQyxBQyxUQztmdW5jdGlvbiBOQyh0LGUsbixvKXtsZXQgaT0oZnVuY3Rpb24gYSh0KXtpZihxQyh0KSlyZXR1cm4gdDtpZigibnVtYmVyIj09dHlwZW9mIHQmJiFpc05hTih0KSlyZXR1cm4gbmV3IERhdGUodCk7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZih0PXQudHJpbSgpLC9eKFxkezR9KC1cZHsxLDJ9KC1cZHsxLDJ9KT8pPykkLy50ZXN0KHQpKXtjb25zdFtlLG49MSxvPTFdPXQuc3BsaXQoIi0iKS5tYXAoKHQ9Pit0KSk7cmV0dXJuIHpDKGUsbi0xLG8pfWNvbnN0IGU9cGFyc2VGbG9hdCh0KTtpZighaXNOYU4odC1lKSlyZXR1cm4gbmV3IERhdGUoZSk7bGV0IG47aWYobj10Lm1hdGNoKFNDKSlyZXR1cm4oZnVuY3Rpb24gZSh0KXtjb25zdCBlPW5ldyBEYXRlKDApO2xldCBuPTAsbz0wO2NvbnN0IGk9dFs4XT9lLnNldFVUQ0Z1bGxZZWFyOmUuc2V0RnVsbFllYXIsYT10WzhdP2Uuc2V0VVRDSG91cnM6ZS5zZXRIb3Vyczt0WzldJiYobj1OdW1iZXIodFs5XSt0WzEwXSksbz1OdW1iZXIodFs5XSt0WzExXSkpLGkuY2FsbChlLE51bWJlcih0WzFdKSxOdW1iZXIodFsyXSktMSxOdW1iZXIodFszXSkpO2NvbnN0IHI9TnVtYmVyKHRbNF18fDApLW4scz1OdW1iZXIodFs1XXx8MCktbyxsPU51bWJlcih0WzZdfHwwKSxjPU1hdGguZmxvb3IoMWUzKnBhcnNlRmxvYXQoIjAuIisodFs3XXx8MCkpKTtyZXR1cm4gYS5jYWxsKGUscixzLGwsYyksZX0pKG4pfWNvbnN0IG49bmV3IERhdGUodCk7aWYoIXFDKG4pKXRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGNvbnZlcnQgIiR7dH0iIGludG8gYSBkYXRlYCk7cmV0dXJuIG59KSh0KTtlPUlDKG4sZSl8fGU7bGV0IHIscz1bXTtmb3IoO2U7KXtpZihyPUVDLmV4ZWMoZSksIXIpe3MucHVzaChlKTticmVha317cz1zLmNvbmNhdChyLnNsaWNlKDEpKTtjb25zdCB0PXMucG9wKCk7aWYoIXQpYnJlYWs7ZT10fX1sZXQgbD1pLmdldFRpbWV6b25lT2Zmc2V0KCk7byYmKGw9WUMobyxsKSxpPShmdW5jdGlvbiBjKHQsZSxuKXtjb25zdCBvPW4/LTE6MSxpPXQuZ2V0VGltZXpvbmVPZmZzZXQoKTtyZXR1cm4oZnVuY3Rpb24gYSh0LGUpe3JldHVybih0PW5ldyBEYXRlKHQuZ2V0VGltZSgpKSkuc2V0TWludXRlcyh0LmdldE1pbnV0ZXMoKStlKSx0fSkodCxvKihZQyhlLGkpLWkpKX0pKGksbywhMCkpO2xldCBkPSIiO3JldHVybiBzLmZvckVhY2goKHQ9Pntjb25zdCBlPShmdW5jdGlvbiBvKHQpe2lmKFdDW3RdKXJldHVybiBXQ1t0XTtsZXQgZTtzd2l0Y2godCl7Y2FzZSJHIjpjYXNlIkdHIjpjYXNlIkdHRyI6ZT1CQyhUQy5FcmFzLGdDLkFiYnJldmlhdGVkKTticmVhaztjYXNlIkdHR0ciOmU9QkMoVEMuRXJhcyxnQy5XaWRlKTticmVhaztjYXNlIkdHR0dHIjplPUJDKFRDLkVyYXMsZ0MuTmFycm93KTticmVhaztjYXNlInkiOmU9TEMoQUMuRnVsbFllYXIsMSwwLCExLCEwKTticmVhaztjYXNlInl5IjplPUxDKEFDLkZ1bGxZZWFyLDIsMCwhMCwhMCk7YnJlYWs7Y2FzZSJ5eXkiOmU9TEMoQUMuRnVsbFllYXIsMywwLCExLCEwKTticmVhaztjYXNlInl5eXkiOmU9TEMoQUMuRnVsbFllYXIsNCwwLCExLCEwKTticmVhaztjYXNlIlkiOmU9R0MoMSk7YnJlYWs7Y2FzZSJZWSI6ZT1HQygyLCEwKTticmVhaztjYXNlIllZWSI6ZT1HQygzKTticmVhaztjYXNlIllZWVkiOmU9R0MoNCk7YnJlYWs7Y2FzZSJNIjpjYXNlIkwiOmU9TEMoQUMuTW9udGgsMSwxKTticmVhaztjYXNlIk1NIjpjYXNlIkxMIjplPUxDKEFDLk1vbnRoLDIsMSk7YnJlYWs7Y2FzZSJNTU0iOmU9QkMoVEMuTW9udGhzLGdDLkFiYnJldmlhdGVkKTticmVhaztjYXNlIk1NTU0iOmU9QkMoVEMuTW9udGhzLGdDLldpZGUpO2JyZWFrO2Nhc2UiTU1NTU0iOmU9QkMoVEMuTW9udGhzLGdDLk5hcnJvdyk7YnJlYWs7Y2FzZSJMTEwiOmU9QkMoVEMuTW9udGhzLGdDLkFiYnJldmlhdGVkLGZDLlN0YW5kYWxvbmUpO2JyZWFrO2Nhc2UiTExMTCI6ZT1CQyhUQy5Nb250aHMsZ0MuV2lkZSxmQy5TdGFuZGFsb25lKTticmVhaztjYXNlIkxMTExMIjplPUJDKFRDLk1vbnRocyxnQy5OYXJyb3csZkMuU3RhbmRhbG9uZSk7YnJlYWs7Y2FzZSJ3IjplPVVDKDEpO2JyZWFrO2Nhc2Uid3ciOmU9VUMoMik7YnJlYWs7Y2FzZSJXIjplPVVDKDEsITApO2JyZWFrO2Nhc2UiZCI6ZT1MQyhBQy5EYXRlLDEpO2JyZWFrO2Nhc2UiZGQiOmU9TEMoQUMuRGF0ZSwyKTticmVhaztjYXNlImMiOmNhc2UiY2MiOmU9TEMoQUMuRGF5LDEpO2JyZWFrO2Nhc2UiY2NjIjplPUJDKFRDLkRheXMsZ0MuQWJicmV2aWF0ZWQsZkMuU3RhbmRhbG9uZSk7YnJlYWs7Y2FzZSJjY2NjIjplPUJDKFRDLkRheXMsZ0MuV2lkZSxmQy5TdGFuZGFsb25lKTticmVhaztjYXNlImNjY2NjIjplPUJDKFRDLkRheXMsZ0MuTmFycm93LGZDLlN0YW5kYWxvbmUpO2JyZWFrO2Nhc2UiY2NjY2NjIjplPUJDKFRDLkRheXMsZ0MuU2hvcnQsZkMuU3RhbmRhbG9uZSk7YnJlYWs7Y2FzZSJFIjpjYXNlIkVFIjpjYXNlIkVFRSI6ZT1CQyhUQy5EYXlzLGdDLkFiYnJldmlhdGVkKTticmVhaztjYXNlIkVFRUUiOmU9QkMoVEMuRGF5cyxnQy5XaWRlKTticmVhaztjYXNlIkVFRUVFIjplPUJDKFRDLkRheXMsZ0MuTmFycm93KTticmVhaztjYXNlIkVFRUVFRSI6ZT1CQyhUQy5EYXlzLGdDLlNob3J0KTticmVhaztjYXNlImEiOmNhc2UiYWEiOmNhc2UiYWFhIjplPUJDKFRDLkRheVBlcmlvZHMsZ0MuQWJicmV2aWF0ZWQpO2JyZWFrO2Nhc2UiYWFhYSI6ZT1CQyhUQy5EYXlQZXJpb2RzLGdDLldpZGUpO2JyZWFrO2Nhc2UiYWFhYWEiOmU9QkMoVEMuRGF5UGVyaW9kcyxnQy5OYXJyb3cpO2JyZWFrO2Nhc2UiYiI6Y2FzZSJiYiI6Y2FzZSJiYmIiOmU9QkMoVEMuRGF5UGVyaW9kcyxnQy5BYmJyZXZpYXRlZCxmQy5TdGFuZGFsb25lLCEwKTticmVhaztjYXNlImJiYmIiOmU9QkMoVEMuRGF5UGVyaW9kcyxnQy5XaWRlLGZDLlN0YW5kYWxvbmUsITApO2JyZWFrO2Nhc2UiYmJiYmIiOmU9QkMoVEMuRGF5UGVyaW9kcyxnQy5OYXJyb3csZkMuU3RhbmRhbG9uZSwhMCk7YnJlYWs7Y2FzZSJCIjpjYXNlIkJCIjpjYXNlIkJCQiI6ZT1CQyhUQy5EYXlQZXJpb2RzLGdDLkFiYnJldmlhdGVkLGZDLkZvcm1hdCwhMCk7YnJlYWs7Y2FzZSJCQkJCIjplPUJDKFRDLkRheVBlcmlvZHMsZ0MuV2lkZSxmQy5Gb3JtYXQsITApO2JyZWFrO2Nhc2UiQkJCQkIiOmU9QkMoVEMuRGF5UGVyaW9kcyxnQy5OYXJyb3csZkMuRm9ybWF0LCEwKTticmVhaztjYXNlImgiOmU9TEMoQUMuSG91cnMsMSwtMTIpO2JyZWFrO2Nhc2UiaGgiOmU9TEMoQUMuSG91cnMsMiwtMTIpO2JyZWFrO2Nhc2UiSCI6ZT1MQyhBQy5Ib3VycywxKTticmVhaztjYXNlIkhIIjplPUxDKEFDLkhvdXJzLDIpO2JyZWFrO2Nhc2UibSI6ZT1MQyhBQy5NaW51dGVzLDEpO2JyZWFrO2Nhc2UibW0iOmU9TEMoQUMuTWludXRlcywyKTticmVhaztjYXNlInMiOmU9TEMoQUMuU2Vjb25kcywxKTticmVhaztjYXNlInNzIjplPUxDKEFDLlNlY29uZHMsMik7YnJlYWs7Y2FzZSJTIjplPUxDKEFDLkZyYWN0aW9uYWxTZWNvbmRzLDEpO2JyZWFrO2Nhc2UiU1MiOmU9TEMoQUMuRnJhY3Rpb25hbFNlY29uZHMsMik7YnJlYWs7Y2FzZSJTU1MiOmU9TEMoQUMuRnJhY3Rpb25hbFNlY29uZHMsMyk7YnJlYWs7Y2FzZSJaIjpjYXNlIlpaIjpjYXNlIlpaWiI6ZT1WQyhSQy5TaG9ydCk7YnJlYWs7Y2FzZSJaWlpaWiI6ZT1WQyhSQy5FeHRlbmRlZCk7YnJlYWs7Y2FzZSJPIjpjYXNlIk9PIjpjYXNlIk9PTyI6Y2FzZSJ6IjpjYXNlInp6IjpjYXNlInp6eiI6ZT1WQyhSQy5TaG9ydEdNVCk7YnJlYWs7Y2FzZSJPT09PIjpjYXNlIlpaWloiOmNhc2Uienp6eiI6ZT1WQyhSQy5Mb25nKTticmVhaztkZWZhdWx0OnJldHVybiBudWxsfXJldHVybiBXQ1t0XT1lLGV9KSh0KTtkKz1lP2UoaSxuLGwpOiInJyI9PT10PyInIjp0LnJlcGxhY2UoLyheJ3wnJCkvZywiIikucmVwbGFjZSgvJycvZywiJyIpfSkpLGR9ZnVuY3Rpb24gekModCxlLG4pe2NvbnN0IG89bmV3IERhdGUoMCk7cmV0dXJuIG8uc2V0RnVsbFllYXIodCxlLG4pLG8uc2V0SG91cnMoMCwwLDApLG99ZnVuY3Rpb24gSUModCxlKXtjb25zdCBuPShmdW5jdGlvbiBvKHQpe3JldHVybiBMdSh0KVtqdS5Mb2NhbGVJZF19KSh0KTtpZihEQ1tuXT1EQ1tuXXx8e30sRENbbl1bZV0pcmV0dXJuIERDW25dW2VdO2xldCBpPSIiO3N3aXRjaChlKXtjYXNlInNob3J0RGF0ZSI6aT1fQyh0LGhDLlNob3J0KTticmVhaztjYXNlIm1lZGl1bURhdGUiOmk9X0ModCxoQy5NZWRpdW0pO2JyZWFrO2Nhc2UibG9uZ0RhdGUiOmk9X0ModCxoQy5Mb25nKTticmVhaztjYXNlImZ1bGxEYXRlIjppPV9DKHQsaEMuRnVsbCk7YnJlYWs7Y2FzZSJzaG9ydFRpbWUiOmk9Q0ModCxoQy5TaG9ydCk7YnJlYWs7Y2FzZSJtZWRpdW1UaW1lIjppPUNDKHQsaEMuTWVkaXVtKTticmVhaztjYXNlImxvbmdUaW1lIjppPUNDKHQsaEMuTG9uZyk7YnJlYWs7Y2FzZSJmdWxsVGltZSI6aT1DQyh0LGhDLkZ1bGwpO2JyZWFrO2Nhc2Uic2hvcnQiOmNvbnN0IGU9SUModCwic2hvcnRUaW1lIiksbj1JQyh0LCJzaG9ydERhdGUiKTtpPUhDKE1DKHQsaEMuU2hvcnQpLFtlLG5dKTticmVhaztjYXNlIm1lZGl1bSI6Y29uc3Qgbz1JQyh0LCJtZWRpdW1UaW1lIiksYT1JQyh0LCJtZWRpdW1EYXRlIik7aT1IQyhNQyh0LGhDLk1lZGl1bSksW28sYV0pO2JyZWFrO2Nhc2UibG9uZyI6Y29uc3Qgcj1JQyh0LCJsb25nVGltZSIpLHM9SUModCwibG9uZ0RhdGUiKTtpPUhDKE1DKHQsaEMuTG9uZyksW3Isc10pO2JyZWFrO2Nhc2UiZnVsbCI6Y29uc3QgbD1JQyh0LCJmdWxsVGltZSIpLGM9SUModCwiZnVsbERhdGUiKTtpPUhDKE1DKHQsaEMuRnVsbCksW2wsY10pfXJldHVybiBpJiYoRENbbl1bZV09aSksaX1mdW5jdGlvbiBIQyh0LGUpe3JldHVybiBlJiYodD10LnJlcGxhY2UoL1x7KFtefV0rKX0vZywoZnVuY3Rpb24odCxuKXtyZXR1cm4gbnVsbCE9ZSYmbiBpbiBlP2Vbbl06dH0pKSksdH1mdW5jdGlvbiBGQyh0LGUsbj0iLSIsbyxpKXtsZXQgYT0iIjsodDwwfHxpJiZ0PD0wKSYmKGk/dD0xLXQ6KHQ9LXQsYT1uKSk7bGV0IHI9U3RyaW5nKHQpO2Zvcig7ci5sZW5ndGg8ZTspcj0iMCIrcjtyZXR1cm4gbyYmKHI9ci5zdWJzdHIoci5sZW5ndGgtZSkpLGErcn1mdW5jdGlvbiBMQyh0LGUsbj0wLG89ITEsaT0hMSl7cmV0dXJuIGZ1bmN0aW9uKGEscil7bGV0IHM9KGZ1bmN0aW9uIGwodCxlKXtzd2l0Y2godCl7Y2FzZSBBQy5GdWxsWWVhcjpyZXR1cm4gZS5nZXRGdWxsWWVhcigpO2Nhc2UgQUMuTW9udGg6cmV0dXJuIGUuZ2V0TW9udGgoKTtjYXNlIEFDLkRhdGU6cmV0dXJuIGUuZ2V0RGF0ZSgpO2Nhc2UgQUMuSG91cnM6cmV0dXJuIGUuZ2V0SG91cnMoKTtjYXNlIEFDLk1pbnV0ZXM6cmV0dXJuIGUuZ2V0TWludXRlcygpO2Nhc2UgQUMuU2Vjb25kczpyZXR1cm4gZS5nZXRTZWNvbmRzKCk7Y2FzZSBBQy5GcmFjdGlvbmFsU2Vjb25kczpyZXR1cm4gZS5nZXRNaWxsaXNlY29uZHMoKTtjYXNlIEFDLkRheTpyZXR1cm4gZS5nZXREYXkoKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5rbm93biBEYXRlVHlwZSB2YWx1ZSAiJHt0fSIuYCl9fSkodCxhKTtpZigobj4wfHxzPi1uKSYmKHMrPW4pLHQ9PT1BQy5Ib3VycykwPT09cyYmLTEyPT09biYmKHM9MTIpO2Vsc2UgaWYodD09PUFDLkZyYWN0aW9uYWxTZWNvbmRzKXJldHVybihmdW5jdGlvbiBjKHQsZSl7cmV0dXJuIEZDKHQsMykuc3Vic3RyKDAsZSl9KShzLGUpO2NvbnN0IGQ9dkMocixiQy5NaW51c1NpZ24pO3JldHVybiBGQyhzLGUsZCxvLGkpfX1mdW5jdGlvbiBCQyh0LGUsbj1mQy5Gb3JtYXQsbz0hMSl7cmV0dXJuIGZ1bmN0aW9uKGksYSl7cmV0dXJuKGZ1bmN0aW9uIHIodCxlLG4sbyxpLGEpe3N3aXRjaChuKXtjYXNlIFRDLk1vbnRoczpyZXR1cm4oZnVuY3Rpb24gcih0LGUsbil7Y29uc3Qgbz1MdSh0KSxpPXdDKFtvW2p1Lk1vbnRoc0Zvcm1hdF0sb1tqdS5Nb250aHNTdGFuZGFsb25lXV0sZSk7cmV0dXJuIHdDKGksbil9KShlLGksbylbdC5nZXRNb250aCgpXTtjYXNlIFRDLkRheXM6cmV0dXJuKGZ1bmN0aW9uIHModCxlLG4pe2NvbnN0IG89THUodCksaT13Qyhbb1tqdS5EYXlzRm9ybWF0XSxvW2p1LkRheXNTdGFuZGFsb25lXV0sZSk7cmV0dXJuIHdDKGksbil9KShlLGksbylbdC5nZXREYXkoKV07Y2FzZSBUQy5EYXlQZXJpb2RzOmNvbnN0IHI9dC5nZXRIb3VycygpLHM9dC5nZXRNaW51dGVzKCk7aWYoYSl7Y29uc3QgdD0oZnVuY3Rpb24gbCh0KXtjb25zdCBlPUx1KHQpO3JldHVybiBQQyhlKSwoZVtqdS5FeHRyYURhdGFdWzJdfHxbXSkubWFwKCh0PT4ic3RyaW5nIj09dHlwZW9mIHQ/a0ModCk6W2tDKHRbMF0pLGtDKHRbMV0pXSkpfSkoZSksbj0oZnVuY3Rpb24gYyh0LGUsbil7Y29uc3Qgbz1MdSh0KTtQQyhvKTtjb25zdCBpPXdDKFtvW2p1LkV4dHJhRGF0YV1bMF0sb1tqdS5FeHRyYURhdGFdWzFdXSxlKXx8W107cmV0dXJuIHdDKGksbil8fFtdfSkoZSxpLG8pLGE9dC5maW5kSW5kZXgoKHQ9PntpZihBcnJheS5pc0FycmF5KHQpKXtjb25zdFtlLG5dPXQsbz1yPj1lLmhvdXJzJiZzPj1lLm1pbnV0ZXMsaT1yPG4uaG91cnN8fHI9PT1uLmhvdXJzJiZzPG4ubWludXRlcztpZihlLmhvdXJzPG4uaG91cnMpe2lmKG8mJmkpcmV0dXJuITB9ZWxzZSBpZihvfHxpKXJldHVybiEwfWVsc2UgaWYodC5ob3Vycz09PXImJnQubWludXRlcz09PXMpcmV0dXJuITA7cmV0dXJuITF9KSk7aWYoLTEhPT1hKXJldHVybiBuW2FdfXJldHVybihmdW5jdGlvbiBkKHQsZSxuKXtjb25zdCBvPUx1KHQpLGk9d0MoW29banUuRGF5UGVyaW9kc0Zvcm1hdF0sb1tqdS5EYXlQZXJpb2RzU3RhbmRhbG9uZV1dLGUpO3JldHVybiB3QyhpLG4pfSkoZSxpLG8pW3I8MTI/MDoxXTtjYXNlIFRDLkVyYXM6cmV0dXJuKGZ1bmN0aW9uIHAodCxlKXtyZXR1cm4gd0MoTHUodClbanUuRXJhc10sZSl9KShlLG8pW3QuZ2V0RnVsbFllYXIoKTw9MD8wOjFdO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIHRyYW5zbGF0aW9uIHR5cGUgJHtufWApfX0pKGksYSx0LGUsbixvKX19ZnVuY3Rpb24gVkModCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixvKXtjb25zdCBpPS0xKm8sYT12QyhuLGJDLk1pbnVzU2lnbikscj1pPjA/TWF0aC5mbG9vcihpLzYwKTpNYXRoLmNlaWwoaS82MCk7c3dpdGNoKHQpe2Nhc2UgUkMuU2hvcnQ6cmV0dXJuKGk+PTA/IisiOiIiKStGQyhyLDIsYSkrRkMoTWF0aC5hYnMoaSU2MCksMixhKTtjYXNlIFJDLlNob3J0R01UOnJldHVybiJHTVQiKyhpPj0wPyIrIjoiIikrRkMociwxLGEpO2Nhc2UgUkMuTG9uZzpyZXR1cm4iR01UIisoaT49MD8iKyI6IiIpK0ZDKHIsMixhKSsiOiIrRkMoTWF0aC5hYnMoaSU2MCksMixhKTtjYXNlIFJDLkV4dGVuZGVkOnJldHVybiAwPT09bz8iWiI6KGk+PTA/IisiOiIiKStGQyhyLDIsYSkrIjoiK0ZDKE1hdGguYWJzKGklNjApLDIsYSk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gem9uZSB3aWR0aCAiJHt0fSJgKX19fWZ1bmN0aW9uIGpDKHQpe3JldHVybiB6Qyh0LmdldEZ1bGxZZWFyKCksdC5nZXRNb250aCgpLHQuZ2V0RGF0ZSgpKyg0LXQuZ2V0RGF5KCkpKX1mdW5jdGlvbiBVQyh0LGU9ITEpe3JldHVybiBmdW5jdGlvbihuLG8pe2xldCBpO2lmKGUpe2NvbnN0IHQ9bmV3IERhdGUobi5nZXRGdWxsWWVhcigpLG4uZ2V0TW9udGgoKSwxKS5nZXREYXkoKS0xLGU9bi5nZXREYXRlKCk7aT0xK01hdGguZmxvb3IoKGUrdCkvNyl9ZWxzZXtjb25zdCB0PWpDKG4pLGU9KGZ1bmN0aW9uIGEodCl7Y29uc3QgZT16Qyh0LDAsMSkuZ2V0RGF5KCk7cmV0dXJuIHpDKHQsMCwxKyhlPD00PzQ6MTEpLWUpfSkodC5nZXRGdWxsWWVhcigpKSxvPXQuZ2V0VGltZSgpLWUuZ2V0VGltZSgpO2k9MStNYXRoLnJvdW5kKG8vNjA0OGU1KX1yZXR1cm4gRkMoaSx0LHZDKG8sYkMuTWludXNTaWduKSl9fWZ1bmN0aW9uIEdDKHQsZT0hMSl7cmV0dXJuIGZ1bmN0aW9uKG4sbyl7cmV0dXJuIEZDKGpDKG4pLmdldEZ1bGxZZWFyKCksdCx2QyhvLGJDLk1pbnVzU2lnbiksZSl9fSEoZnVuY3Rpb24odCl7dFt0LlNob3J0PTBdPSJTaG9ydCIsdFt0LlNob3J0R01UPTFdPSJTaG9ydEdNVCIsdFt0Lkxvbmc9Ml09IkxvbmciLHRbdC5FeHRlbmRlZD0zXT0iRXh0ZW5kZWQifSkoUkN8fChSQz17fSkpLChmdW5jdGlvbih0KXt0W3QuRnVsbFllYXI9MF09IkZ1bGxZZWFyIix0W3QuTW9udGg9MV09Ik1vbnRoIix0W3QuRGF0ZT0yXT0iRGF0ZSIsdFt0LkhvdXJzPTNdPSJIb3VycyIsdFt0Lk1pbnV0ZXM9NF09Ik1pbnV0ZXMiLHRbdC5TZWNvbmRzPTVdPSJTZWNvbmRzIix0W3QuRnJhY3Rpb25hbFNlY29uZHM9Nl09IkZyYWN0aW9uYWxTZWNvbmRzIix0W3QuRGF5PTddPSJEYXkifSkoQUN8fChBQz17fSkpLChmdW5jdGlvbih0KXt0W3QuRGF5UGVyaW9kcz0wXT0iRGF5UGVyaW9kcyIsdFt0LkRheXM9MV09IkRheXMiLHRbdC5Nb250aHM9Ml09Ik1vbnRocyIsdFt0LkVyYXM9M109IkVyYXMifSkoVEN8fChUQz17fSkpO2NvbnN0IFdDPXt9O2Z1bmN0aW9uIFlDKHQsZSl7dD10LnJlcGxhY2UoLzovZywiIik7Y29uc3Qgbj1EYXRlLnBhcnNlKCJKYW4gMDEsIDE5NzAgMDA6MDA6MDAgIit0KS82ZTQ7cmV0dXJuIGlzTmFOKG4pP2U6bn1mdW5jdGlvbiBxQyh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIERhdGUmJiFpc05hTih0LnZhbHVlT2YoKSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NvbnN0IFpDPS9eKFxkKyk/XC4oKFxkKykoLShcZCspKT8pPyQvLFhDPSIuIixLQz0iMCI7ZnVuY3Rpb24gSkModCxlLG4sbyxpLGEscj0hMSl7bGV0IHM9IiIsbD0hMTtpZihpc0Zpbml0ZSh0KSl7bGV0IGM9KGZ1bmN0aW9uIGModCl7bGV0IGUsbixvLGksYSxyPU1hdGguYWJzKHQpKyIiLHM9MDtmb3IoKG49ci5pbmRleE9mKFhDKSk+LTEmJihyPXIucmVwbGFjZShYQywiIikpLChvPXIuc2VhcmNoKC9lL2kpKT4wPyhuPDAmJihuPW8pLG4rPStyLnNsaWNlKG8rMSkscj1yLnN1YnN0cmluZygwLG8pKTpuPDAmJihuPXIubGVuZ3RoKSxvPTA7ci5jaGFyQXQobyk9PT1LQztvKyspO2lmKG89PT0oYT1yLmxlbmd0aCkpZT1bMF0sbj0xO2Vsc2V7Zm9yKGEtLTtyLmNoYXJBdChhKT09PUtDOylhLS07Zm9yKG4tPW8sZT1bXSxpPTA7bzw9YTtvKyssaSsrKWVbaV09TnVtYmVyKHIuY2hhckF0KG8pKX1yZXR1cm4gbj4yMiYmKGU9ZS5zcGxpY2UoMCwyMSkscz1uLTEsbj0xKSx7ZGlnaXRzOmUsZXhwb25lbnQ6cyxpbnRlZ2VyTGVuOm59fSkodCk7ciYmKGM9KGZ1bmN0aW9uIGQodCl7aWYoMD09PXQuZGlnaXRzWzBdKXJldHVybiB0O2NvbnN0IGU9dC5kaWdpdHMubGVuZ3RoLXQuaW50ZWdlckxlbjtyZXR1cm4gdC5leHBvbmVudD90LmV4cG9uZW50Kz0yOigwPT09ZT90LmRpZ2l0cy5wdXNoKDAsMCk6MT09PWUmJnQuZGlnaXRzLnB1c2goMCksdC5pbnRlZ2VyTGVuKz0yKSx0fSkoYykpO2xldCBkPWUubWluSW50LHA9ZS5taW5GcmFjLG09ZS5tYXhGcmFjO2lmKGEpe2NvbnN0IHQ9YS5tYXRjaChaQyk7aWYobnVsbD09PXQpdGhyb3cgbmV3IEVycm9yKGAke2F9IGlzIG5vdCBhIHZhbGlkIGRpZ2l0IGluZm9gKTtjb25zdCBlPXRbMV0sbj10WzNdLG89dFs1XTtudWxsIT1lJiYoZD10TShlKSksbnVsbCE9biYmKHA9dE0obikpLG51bGwhPW8/bT10TShvKTpudWxsIT1uJiZwPm0mJihtPXApfSEoZnVuY3Rpb24gcCh0LGUsbil7aWYoZT5uKXRocm93IG5ldyBFcnJvcihgVGhlIG1pbmltdW0gbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciBmcmFjdGlvbiAoJHtlfSkgaXMgaGlnaGVyIHRoYW4gdGhlIG1heGltdW0gKCR7bn0pLmApO2xldCBvPXQuZGlnaXRzLGk9by5sZW5ndGgtdC5pbnRlZ2VyTGVuO2NvbnN0IGE9TWF0aC5taW4oTWF0aC5tYXgoZSxpKSxuKTtsZXQgcj1hK3QuaW50ZWdlckxlbixzPW9bcl07aWYocj4wKXtvLnNwbGljZShNYXRoLm1heCh0LmludGVnZXJMZW4scikpO2ZvcihsZXQgdD1yO3Q8by5sZW5ndGg7dCsrKW9bdF09MH1lbHNle2k9TWF0aC5tYXgoMCxpKSx0LmludGVnZXJMZW49MSxvLmxlbmd0aD1NYXRoLm1heCgxLHI9YSsxKSxvWzBdPTA7Zm9yKGxldCB0PTE7dDxyO3QrKylvW3RdPTB9aWYocz49NSlpZihyLTE8MCl7Zm9yKGxldCBlPTA7ZT5yO2UtLSlvLnVuc2hpZnQoMCksdC5pbnRlZ2VyTGVuKys7by51bnNoaWZ0KDEpLHQuaW50ZWdlckxlbisrfWVsc2Ugb1tyLTFdKys7Zm9yKDtpPE1hdGgubWF4KDAsYSk7aSsrKW8ucHVzaCgwKTtsZXQgbD0wIT09YTtjb25zdCBjPWUrdC5pbnRlZ2VyTGVuLGQ9by5yZWR1Y2VSaWdodCgoZnVuY3Rpb24odCxlLG4sbyl7cmV0dXJuIG9bbl09KGUrPXQpPDEwP2U6ZS0xMCxsJiYoMD09PW9bbl0mJm4+PWM/by5wb3AoKTpsPSExKSxlPj0xMD8xOjB9KSwwKTtkJiYoby51bnNoaWZ0KGQpLHQuaW50ZWdlckxlbisrKX0pKGMscCxtKTtsZXQgdT1jLmRpZ2l0cyxmPWMuaW50ZWdlckxlbjtjb25zdCBnPWMuZXhwb25lbnQ7bGV0IGg9W107Zm9yKGw9dS5ldmVyeSgodD0+IXQpKTtmPGQ7ZisrKXUudW5zaGlmdCgwKTtmb3IoO2Y8MDtmKyspdS51bnNoaWZ0KDApO2Y+MD9oPXUuc3BsaWNlKGYsdS5sZW5ndGgpOihoPXUsdT1bMF0pO2NvbnN0IGI9W107Zm9yKHUubGVuZ3RoPj1lLmxnU2l6ZSYmYi51bnNoaWZ0KHUuc3BsaWNlKC1lLmxnU2l6ZSx1Lmxlbmd0aCkuam9pbigiIikpO3UubGVuZ3RoPmUuZ1NpemU7KWIudW5zaGlmdCh1LnNwbGljZSgtZS5nU2l6ZSx1Lmxlbmd0aCkuam9pbigiIikpO3UubGVuZ3RoJiZiLnVuc2hpZnQodS5qb2luKCIiKSkscz1iLmpvaW4odkMobixvKSksaC5sZW5ndGgmJihzKz12QyhuLGkpK2guam9pbigiIikpLGcmJihzKz12QyhuLGJDLkV4cG9uZW50aWFsKSsiKyIrZyl9ZWxzZSBzPXZDKG4sYkMuSW5maW5pdHkpO3JldHVybiBzPXQ8MCYmIWw/ZS5uZWdQcmUrcytlLm5lZ1N1ZjplLnBvc1ByZStzK2UucG9zU3VmLHN9ZnVuY3Rpb24gUUModCxlLG4pe3JldHVybiBKQyh0LCRDKHhDKGUsbUMuRGVjaW1hbCksdkMoZSxiQy5NaW51c1NpZ24pKSxlLGJDLkdyb3VwLGJDLkRlY2ltYWwsbil9ZnVuY3Rpb24gJEModCxlPSItIil7Y29uc3Qgbj17bWluSW50OjEsbWluRnJhYzowLG1heEZyYWM6MCxwb3NQcmU6IiIscG9zU3VmOiIiLG5lZ1ByZToiIixuZWdTdWY6IiIsZ1NpemU6MCxsZ1NpemU6MH0sbz10LnNwbGl0KCI7IiksaT1vWzBdLGE9b1sxXSxyPS0xIT09aS5pbmRleE9mKFhDKT9pLnNwbGl0KFhDKTpbaS5zdWJzdHJpbmcoMCxpLmxhc3RJbmRleE9mKEtDKSsxKSxpLnN1YnN0cmluZyhpLmxhc3RJbmRleE9mKEtDKSsxKV0scz1yWzBdLGw9clsxXXx8IiI7bi5wb3NQcmU9cy5zdWJzdHIoMCxzLmluZGV4T2YoIiMiKSk7Zm9yKGxldCB0PTA7dDxsLmxlbmd0aDt0Kyspe2NvbnN0IGU9bC5jaGFyQXQodCk7ZT09PUtDP24ubWluRnJhYz1uLm1heEZyYWM9dCsxOiIjIj09PWU/bi5tYXhGcmFjPXQrMTpuLnBvc1N1Zis9ZX1jb25zdCBjPXMuc3BsaXQoIiwiKTtpZihuLmdTaXplPWNbMV0/Y1sxXS5sZW5ndGg6MCxuLmxnU2l6ZT1jWzJdfHxjWzFdPyhjWzJdfHxjWzFdKS5sZW5ndGg6MCxhKXtjb25zdCB0PWkubGVuZ3RoLW4ucG9zUHJlLmxlbmd0aC1uLnBvc1N1Zi5sZW5ndGgsZT1hLmluZGV4T2YoIiMiKTtuLm5lZ1ByZT1hLnN1YnN0cigwLGUpLnJlcGxhY2UoLycvZywiIiksbi5uZWdTdWY9YS5zdWJzdHIoZSt0KS5yZXBsYWNlKC8nL2csIiIpfWVsc2Ugbi5uZWdQcmU9ZStuLnBvc1ByZSxuLm5lZ1N1Zj1uLnBvc1N1ZjtyZXR1cm4gbn1mdW5jdGlvbiB0TSh0KXtjb25zdCBlPXBhcnNlSW50KHQpO2lmKGlzTmFOKGUpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBpbnRlZ2VyIGxpdGVyYWwgd2hlbiBwYXJzaW5nICIrdCk7cmV0dXJuIGV9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIGVNe31mdW5jdGlvbiBuTSh0LGUsbixvKXtsZXQgaT1gPSR7dH1gO2lmKGUuaW5kZXhPZihpKT4tMSlyZXR1cm4gaTtpZihpPW4uZ2V0UGx1cmFsQ2F0ZWdvcnkodCxvKSxlLmluZGV4T2YoaSk+LTEpcmV0dXJuIGk7aWYoZS5pbmRleE9mKCJvdGhlciIpPi0xKXJldHVybiJvdGhlciI7dGhyb3cgbmV3IEVycm9yKGBObyBwbHVyYWwgbWVzc2FnZSBmb3VuZCBmb3IgdmFsdWUgIiR7dH0iYCl9Y2xhc3Mgb00gZXh0ZW5kcyBlTXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMubG9jYWxlPXR9Z2V0UGx1cmFsQ2F0ZWdvcnkodCxlKXtzd2l0Y2goT0MoZXx8dGhpcy5sb2NhbGUpKHQpKXtjYXNlIHVDLlplcm86cmV0dXJuInplcm8iO2Nhc2UgdUMuT25lOnJldHVybiJvbmUiO2Nhc2UgdUMuVHdvOnJldHVybiJ0d28iO2Nhc2UgdUMuRmV3OnJldHVybiJmZXciO2Nhc2UgdUMuTWFueTpyZXR1cm4ibWFueSI7ZGVmYXVsdDpyZXR1cm4ib3RoZXIifX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBpTSh0LGUpe2U9ZW5jb2RlVVJJQ29tcG9uZW50KGUpO2Zvcihjb25zdCBuIG9mIHQuc3BsaXQoIjsiKSl7Y29uc3QgdD1uLmluZGV4T2YoIj0iKSxbbyxpXT0tMT09dD9bbiwiIl06W24uc2xpY2UoMCx0KSxuLnNsaWNlKHQrMSldO2lmKG8udHJpbSgpPT09ZSlyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGkpfXJldHVybiBudWxsfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9vTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8b00pKHZyKFd5KSl9LG9NLsm1cHJvdj1Nbih7dG9rZW46b00sZmFjdG9yeTpvTS7JtWZhY30pLG9NLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1d5XX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChvTSxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1d5XX1dfV19KSxudWxsKTtjbGFzcyBhTXtjb25zdHJ1Y3Rvcih0LGUsbixvKXt0aGlzLl9pdGVyYWJsZURpZmZlcnM9dCx0aGlzLl9rZXlWYWx1ZURpZmZlcnM9ZSx0aGlzLl9uZ0VsPW4sdGhpcy5fcmVuZGVyZXI9byx0aGlzLl9pdGVyYWJsZURpZmZlcj1udWxsLHRoaXMuX2tleVZhbHVlRGlmZmVyPW51bGwsdGhpcy5faW5pdGlhbENsYXNzZXM9W10sdGhpcy5fcmF3Q2xhc3M9bnVsbH1zZXQga2xhc3ModCl7dGhpcy5fcmVtb3ZlQ2xhc3Nlcyh0aGlzLl9pbml0aWFsQ2xhc3NlcyksdGhpcy5faW5pdGlhbENsYXNzZXM9InN0cmluZyI9PXR5cGVvZiB0P3Quc3BsaXQoL1xzKy8pOltdLHRoaXMuX2FwcGx5Q2xhc3Nlcyh0aGlzLl9pbml0aWFsQ2xhc3NlcyksdGhpcy5fYXBwbHlDbGFzc2VzKHRoaXMuX3Jhd0NsYXNzKX1zZXQgbmdDbGFzcyh0KXt0aGlzLl9yZW1vdmVDbGFzc2VzKHRoaXMuX3Jhd0NsYXNzKSx0aGlzLl9hcHBseUNsYXNzZXModGhpcy5faW5pdGlhbENsYXNzZXMpLHRoaXMuX2l0ZXJhYmxlRGlmZmVyPW51bGwsdGhpcy5fa2V5VmFsdWVEaWZmZXI9bnVsbCx0aGlzLl9yYXdDbGFzcz0ic3RyaW5nIj09dHlwZW9mIHQ/dC5zcGxpdCgvXHMrLyk6dCx0aGlzLl9yYXdDbGFzcyYmKE5wKHRoaXMuX3Jhd0NsYXNzKT90aGlzLl9pdGVyYWJsZURpZmZlcj10aGlzLl9pdGVyYWJsZURpZmZlcnMuZmluZCh0aGlzLl9yYXdDbGFzcykuY3JlYXRlKCk6dGhpcy5fa2V5VmFsdWVEaWZmZXI9dGhpcy5fa2V5VmFsdWVEaWZmZXJzLmZpbmQodGhpcy5fcmF3Q2xhc3MpLmNyZWF0ZSgpKX1uZ0RvQ2hlY2soKXtpZih0aGlzLl9pdGVyYWJsZURpZmZlcil7Y29uc3QgdD10aGlzLl9pdGVyYWJsZURpZmZlci5kaWZmKHRoaXMuX3Jhd0NsYXNzKTt0JiZ0aGlzLl9hcHBseUl0ZXJhYmxlQ2hhbmdlcyh0KX1lbHNlIGlmKHRoaXMuX2tleVZhbHVlRGlmZmVyKXtjb25zdCB0PXRoaXMuX2tleVZhbHVlRGlmZmVyLmRpZmYodGhpcy5fcmF3Q2xhc3MpO3QmJnRoaXMuX2FwcGx5S2V5VmFsdWVDaGFuZ2VzKHQpfX1fYXBwbHlLZXlWYWx1ZUNoYW5nZXModCl7dC5mb3JFYWNoQWRkZWRJdGVtKCh0PT50aGlzLl90b2dnbGVDbGFzcyh0LmtleSx0LmN1cnJlbnRWYWx1ZSkpKSx0LmZvckVhY2hDaGFuZ2VkSXRlbSgodD0+dGhpcy5fdG9nZ2xlQ2xhc3ModC5rZXksdC5jdXJyZW50VmFsdWUpKSksdC5mb3JFYWNoUmVtb3ZlZEl0ZW0oKHQ9Pnt0LnByZXZpb3VzVmFsdWUmJnRoaXMuX3RvZ2dsZUNsYXNzKHQua2V5LCExKX0pKX1fYXBwbHlJdGVyYWJsZUNoYW5nZXModCl7dC5mb3JFYWNoQWRkZWRJdGVtKCh0PT57aWYoInN0cmluZyIhPXR5cGVvZiB0Lml0ZW0pdGhyb3cgbmV3IEVycm9yKGBOZ0NsYXNzIGNhbiBvbmx5IHRvZ2dsZSBDU1MgY2xhc3NlcyBleHByZXNzZWQgYXMgc3RyaW5ncywgZ290ICR7R2UodC5pdGVtKX1gKTt0aGlzLl90b2dnbGVDbGFzcyh0Lml0ZW0sITApfSkpLHQuZm9yRWFjaFJlbW92ZWRJdGVtKCh0PT50aGlzLl90b2dnbGVDbGFzcyh0Lml0ZW0sITEpKSl9X2FwcGx5Q2xhc3Nlcyh0KXt0JiYoQXJyYXkuaXNBcnJheSh0KXx8dCBpbnN0YW5jZW9mIFNldD90LmZvckVhY2goKHQ9PnRoaXMuX3RvZ2dsZUNsYXNzKHQsITApKSk6T2JqZWN0LmtleXModCkuZm9yRWFjaCgoZT0+dGhpcy5fdG9nZ2xlQ2xhc3MoZSwhIXRbZV0pKSkpfV9yZW1vdmVDbGFzc2VzKHQpe3QmJihBcnJheS5pc0FycmF5KHQpfHx0IGluc3RhbmNlb2YgU2V0P3QuZm9yRWFjaCgodD0+dGhpcy5fdG9nZ2xlQ2xhc3ModCwhMSkpKTpPYmplY3Qua2V5cyh0KS5mb3JFYWNoKCh0PT50aGlzLl90b2dnbGVDbGFzcyh0LCExKSkpKX1fdG9nZ2xlQ2xhc3ModCxlKXsodD10LnRyaW0oKSkmJnQuc3BsaXQoL1xzKy9nKS5mb3JFYWNoKCh0PT57ZT90aGlzLl9yZW5kZXJlci5hZGRDbGFzcyh0aGlzLl9uZ0VsLm5hdGl2ZUVsZW1lbnQsdCk6dGhpcy5fcmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5fbmdFbC5uYXRpdmVFbGVtZW50LHQpfSkpfX1hTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8YU0pKFNtKEhnKSxTbShMZyksU20oaGcpLFNtKENnKSl9LGFNLsm1ZGlyPWxvKHt0eXBlOmFNLHNlbGVjdG9yczpbWyIiLCJuZ0NsYXNzIiwiIl1dLGlucHV0czp7a2xhc3M6WyJjbGFzcyIsImtsYXNzIl0sbmdDbGFzczoibmdDbGFzcyJ9fSksYU0uY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpIZ30se3R5cGU6TGd9LHt0eXBlOmhnfSx7dHlwZTpDZ31dLGFNLnByb3BEZWNvcmF0b3JzPXtrbGFzczpbe3R5cGU6eHksYXJnczpbImNsYXNzIl19XSxuZ0NsYXNzOlt7dHlwZTp4eSxhcmdzOlsibmdDbGFzcyJdfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoYU0sW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW25nQ2xhc3NdIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkhnfSx7dHlwZTpMZ30se3R5cGU6aGd9LHt0eXBlOkNnfV19KSx7a2xhc3M6W3t0eXBlOnh5LGFyZ3M6WyJjbGFzcyJdfV0sbmdDbGFzczpbe3R5cGU6eHksYXJnczpbIm5nQ2xhc3MiXX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyByTXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl92aWV3Q29udGFpbmVyUmVmPXQsdGhpcy5fY29tcG9uZW50UmVmPW51bGwsdGhpcy5fbW9kdWxlUmVmPW51bGx9bmdPbkNoYW5nZXModCl7aWYodGhpcy5fdmlld0NvbnRhaW5lclJlZi5jbGVhcigpLHRoaXMuX2NvbXBvbmVudFJlZj1udWxsLHRoaXMubmdDb21wb25lbnRPdXRsZXQpe2NvbnN0IGU9dGhpcy5uZ0NvbXBvbmVudE91dGxldEluamVjdG9yfHx0aGlzLl92aWV3Q29udGFpbmVyUmVmLnBhcmVudEluamVjdG9yO2lmKHQubmdDb21wb25lbnRPdXRsZXROZ01vZHVsZUZhY3RvcnkpaWYodGhpcy5fbW9kdWxlUmVmJiZ0aGlzLl9tb2R1bGVSZWYuZGVzdHJveSgpLHRoaXMubmdDb21wb25lbnRPdXRsZXROZ01vZHVsZUZhY3Rvcnkpe2NvbnN0IHQ9ZS5nZXQodGgpO3RoaXMuX21vZHVsZVJlZj10aGlzLm5nQ29tcG9uZW50T3V0bGV0TmdNb2R1bGVGYWN0b3J5LmNyZWF0ZSh0LmluamVjdG9yKX1lbHNlIHRoaXMuX21vZHVsZVJlZj1udWxsO2NvbnN0IG49KHRoaXMuX21vZHVsZVJlZj90aGlzLl9tb2R1bGVSZWYuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOmUuZ2V0KHVnKSkucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkodGhpcy5uZ0NvbXBvbmVudE91dGxldCk7dGhpcy5fY29tcG9uZW50UmVmPXRoaXMuX3ZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KG4sdGhpcy5fdmlld0NvbnRhaW5lclJlZi5sZW5ndGgsZSx0aGlzLm5nQ29tcG9uZW50T3V0bGV0Q29udGVudCl9fW5nT25EZXN0cm95KCl7dGhpcy5fbW9kdWxlUmVmJiZ0aGlzLl9tb2R1bGVSZWYuZGVzdHJveSgpfX1yTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8ck0pKFNtKGVoKSl9LHJNLsm1ZGlyPWxvKHt0eXBlOnJNLHNlbGVjdG9yczpbWyIiLCJuZ0NvbXBvbmVudE91dGxldCIsIiJdXSxpbnB1dHM6e25nQ29tcG9uZW50T3V0bGV0OiJuZ0NvbXBvbmVudE91dGxldCIsbmdDb21wb25lbnRPdXRsZXRJbmplY3RvcjoibmdDb21wb25lbnRPdXRsZXRJbmplY3RvciIsbmdDb21wb25lbnRPdXRsZXRDb250ZW50OiJuZ0NvbXBvbmVudE91dGxldENvbnRlbnQiLG5nQ29tcG9uZW50T3V0bGV0TmdNb2R1bGVGYWN0b3J5OiJuZ0NvbXBvbmVudE91dGxldE5nTW9kdWxlRmFjdG9yeSJ9LGZlYXR1cmVzOltCb119KSxyTS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmVofV0sck0ucHJvcERlY29yYXRvcnM9e25nQ29tcG9uZW50T3V0bGV0Olt7dHlwZTp4eX1dLG5nQ29tcG9uZW50T3V0bGV0SW5qZWN0b3I6W3t0eXBlOnh5fV0sbmdDb21wb25lbnRPdXRsZXRDb250ZW50Olt7dHlwZTp4eX1dLG5nQ29tcG9uZW50T3V0bGV0TmdNb2R1bGVGYWN0b3J5Olt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHJNLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IltuZ0NvbXBvbmVudE91dGxldF0ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6ZWh9XX0pLHtuZ0NvbXBvbmVudE91dGxldDpbe3R5cGU6eHl9XSxuZ0NvbXBvbmVudE91dGxldEluamVjdG9yOlt7dHlwZTp4eX1dLG5nQ29tcG9uZW50T3V0bGV0Q29udGVudDpbe3R5cGU6eHl9XSxuZ0NvbXBvbmVudE91dGxldE5nTW9kdWxlRmFjdG9yeTpbe3R5cGU6eHl9XX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3Mgc017Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy4kaW1wbGljaXQ9dCx0aGlzLm5nRm9yT2Y9ZSx0aGlzLmluZGV4PW4sdGhpcy5jb3VudD1vfWdldCBmaXJzdCgpe3JldHVybiAwPT09dGhpcy5pbmRleH1nZXQgbGFzdCgpe3JldHVybiB0aGlzLmluZGV4PT09dGhpcy5jb3VudC0xfWdldCBldmVuKCl7cmV0dXJuIHRoaXMuaW5kZXglMj09MH1nZXQgb2RkKCl7cmV0dXJuIXRoaXMuZXZlbn19Y2xhc3MgbE17Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuX3ZpZXdDb250YWluZXI9dCx0aGlzLl90ZW1wbGF0ZT1lLHRoaXMuX2RpZmZlcnM9bix0aGlzLl9uZ0Zvck9mPW51bGwsdGhpcy5fbmdGb3JPZkRpcnR5PSEwLHRoaXMuX2RpZmZlcj1udWxsfXNldCBuZ0Zvck9mKHQpe3RoaXMuX25nRm9yT2Y9dCx0aGlzLl9uZ0Zvck9mRGlydHk9ITB9c2V0IG5nRm9yVHJhY2tCeSh0KXsidW5kZWZpbmVkIiE9dHlwZW9mIG5nRGV2TW9kZSYmIW5nRGV2TW9kZXx8bnVsbD09dHx8ImZ1bmN0aW9uIj09dHlwZW9mIHR8fGNvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKGB0cmFja0J5IG11c3QgYmUgYSBmdW5jdGlvbiwgYnV0IHJlY2VpdmVkICR7SlNPTi5zdHJpbmdpZnkodCl9LiBTZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9jb21tb24vTmdGb3JPZiNjaGFuZ2UtcHJvcGFnYXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uYCksdGhpcy5fdHJhY2tCeUZuPXR9Z2V0IG5nRm9yVHJhY2tCeSgpe3JldHVybiB0aGlzLl90cmFja0J5Rm59c2V0IG5nRm9yVGVtcGxhdGUodCl7dCYmKHRoaXMuX3RlbXBsYXRlPXQpfW5nRG9DaGVjaygpe2lmKHRoaXMuX25nRm9yT2ZEaXJ0eSl7dGhpcy5fbmdGb3JPZkRpcnR5PSExO2NvbnN0IHQ9dGhpcy5fbmdGb3JPZjtpZighdGhpcy5fZGlmZmVyJiZ0KXRyeXt0aGlzLl9kaWZmZXI9dGhpcy5fZGlmZmVycy5maW5kKHQpLmNyZWF0ZSh0aGlzLm5nRm9yVHJhY2tCeSl9Y2F0Y2goZSl7dGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBhIGRpZmZlciBzdXBwb3J0aW5nIG9iamVjdCAnJHt0fScgb2YgdHlwZSAnJHsoZnVuY3Rpb24gbih0KXtyZXR1cm4gdC5uYW1lfHx0eXBlb2YgdH0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKSh0KX0nLiBOZ0ZvciBvbmx5IHN1cHBvcnRzIGJpbmRpbmcgdG8gSXRlcmFibGVzIHN1Y2ggYXMgQXJyYXlzLmApfX1pZih0aGlzLl9kaWZmZXIpe2NvbnN0IHQ9dGhpcy5fZGlmZmVyLmRpZmYodGhpcy5fbmdGb3JPZik7dCYmdGhpcy5fYXBwbHlDaGFuZ2VzKHQpfX1fYXBwbHlDaGFuZ2VzKHQpe2NvbnN0IGU9W107dC5mb3JFYWNoT3BlcmF0aW9uKCgodCxuLG8pPT57aWYobnVsbD09dC5wcmV2aW91c0luZGV4KXtjb25zdCBuPXRoaXMuX3ZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMuX3RlbXBsYXRlLG5ldyBzTShudWxsLHRoaXMuX25nRm9yT2YsLTEsLTEpLG51bGw9PT1vP3ZvaWQgMDpvKSxpPW5ldyBjTSh0LG4pO2UucHVzaChpKX1lbHNlIGlmKG51bGw9PW8pdGhpcy5fdmlld0NvbnRhaW5lci5yZW1vdmUobnVsbD09PW4/dm9pZCAwOm4pO2Vsc2UgaWYobnVsbCE9PW4pe2NvbnN0IGk9dGhpcy5fdmlld0NvbnRhaW5lci5nZXQobik7dGhpcy5fdmlld0NvbnRhaW5lci5tb3ZlKGksbyk7Y29uc3QgYT1uZXcgY00odCxpKTtlLnB1c2goYSl9fSkpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXRoaXMuX3BlclZpZXdDaGFuZ2UoZVt0XS52aWV3LGVbdF0ucmVjb3JkKTtmb3IobGV0IHQ9MCxlPXRoaXMuX3ZpZXdDb250YWluZXIubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IG49dGhpcy5fdmlld0NvbnRhaW5lci5nZXQodCk7bi5jb250ZXh0LmluZGV4PXQsbi5jb250ZXh0LmNvdW50PWUsbi5jb250ZXh0Lm5nRm9yT2Y9dGhpcy5fbmdGb3JPZn10LmZvckVhY2hJZGVudGl0eUNoYW5nZSgodD0+e3RoaXMuX3ZpZXdDb250YWluZXIuZ2V0KHQuY3VycmVudEluZGV4KS5jb250ZXh0LiRpbXBsaWNpdD10Lml0ZW19KSl9X3BlclZpZXdDaGFuZ2UodCxlKXt0LmNvbnRleHQuJGltcGxpY2l0PWUuaXRlbX1zdGF0aWMgbmdUZW1wbGF0ZUNvbnRleHRHdWFyZCh0LGUpe3JldHVybiEwfX1sTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bE0pKFNtKGVoKSxTbShYZyksU20oSGcpKX0sbE0uybVkaXI9bG8oe3R5cGU6bE0sc2VsZWN0b3JzOltbIiIsIm5nRm9yIiwiIiwibmdGb3JPZiIsIiJdXSxpbnB1dHM6e25nRm9yT2Y6Im5nRm9yT2YiLG5nRm9yVHJhY2tCeToibmdGb3JUcmFja0J5IixuZ0ZvclRlbXBsYXRlOiJuZ0ZvclRlbXBsYXRlIn19KSxsTS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmVofSx7dHlwZTpYZ30se3R5cGU6SGd9XSxsTS5wcm9wRGVjb3JhdG9ycz17bmdGb3JPZjpbe3R5cGU6eHl9XSxuZ0ZvclRyYWNrQnk6W3t0eXBlOnh5fV0sbmdGb3JUZW1wbGF0ZTpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChsTSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbmdGb3JdW25nRm9yT2ZdIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmVofSx7dHlwZTpYZ30se3R5cGU6SGd9XX0pLHtuZ0Zvck9mOlt7dHlwZTp4eX1dLG5nRm9yVHJhY2tCeTpbe3R5cGU6eHl9XSxuZ0ZvclRlbXBsYXRlOlt7dHlwZTp4eX1dfSk7Y2xhc3MgY017Y29uc3RydWN0b3IodCxlKXt0aGlzLnJlY29yZD10LHRoaXMudmlldz1lfX1jbGFzcyBkTXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX3ZpZXdDb250YWluZXI9dCx0aGlzLl9jb250ZXh0PW5ldyBwTSx0aGlzLl90aGVuVGVtcGxhdGVSZWY9bnVsbCx0aGlzLl9lbHNlVGVtcGxhdGVSZWY9bnVsbCx0aGlzLl90aGVuVmlld1JlZj1udWxsLHRoaXMuX2Vsc2VWaWV3UmVmPW51bGwsdGhpcy5fdGhlblRlbXBsYXRlUmVmPWV9c2V0IG5nSWYodCl7dGhpcy5fY29udGV4dC4kaW1wbGljaXQ9dGhpcy5fY29udGV4dC5uZ0lmPXQsdGhpcy5fdXBkYXRlVmlldygpfXNldCBuZ0lmVGhlbih0KXttTSgibmdJZlRoZW4iLHQpLHRoaXMuX3RoZW5UZW1wbGF0ZVJlZj10LHRoaXMuX3RoZW5WaWV3UmVmPW51bGwsdGhpcy5fdXBkYXRlVmlldygpfXNldCBuZ0lmRWxzZSh0KXttTSgibmdJZkVsc2UiLHQpLHRoaXMuX2Vsc2VUZW1wbGF0ZVJlZj10LHRoaXMuX2Vsc2VWaWV3UmVmPW51bGwsdGhpcy5fdXBkYXRlVmlldygpfV91cGRhdGVWaWV3KCl7dGhpcy5fY29udGV4dC4kaW1wbGljaXQ/dGhpcy5fdGhlblZpZXdSZWZ8fCh0aGlzLl92aWV3Q29udGFpbmVyLmNsZWFyKCksdGhpcy5fZWxzZVZpZXdSZWY9bnVsbCx0aGlzLl90aGVuVGVtcGxhdGVSZWYmJih0aGlzLl90aGVuVmlld1JlZj10aGlzLl92aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLl90aGVuVGVtcGxhdGVSZWYsdGhpcy5fY29udGV4dCkpKTp0aGlzLl9lbHNlVmlld1JlZnx8KHRoaXMuX3ZpZXdDb250YWluZXIuY2xlYXIoKSx0aGlzLl90aGVuVmlld1JlZj1udWxsLHRoaXMuX2Vsc2VUZW1wbGF0ZVJlZiYmKHRoaXMuX2Vsc2VWaWV3UmVmPXRoaXMuX3ZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMuX2Vsc2VUZW1wbGF0ZVJlZix0aGlzLl9jb250ZXh0KSkpfXN0YXRpYyBuZ1RlbXBsYXRlQ29udGV4dEd1YXJkKHQsZSl7cmV0dXJuITB9fWRNLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxkTSkoU20oZWgpLFNtKFhnKSl9LGRNLsm1ZGlyPWxvKHt0eXBlOmRNLHNlbGVjdG9yczpbWyIiLCJuZ0lmIiwiIl1dLGlucHV0czp7bmdJZjoibmdJZiIsbmdJZlRoZW46Im5nSWZUaGVuIixuZ0lmRWxzZToibmdJZkVsc2UifX0pLGRNLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6ZWh9LHt0eXBlOlhnfV0sZE0ucHJvcERlY29yYXRvcnM9e25nSWY6W3t0eXBlOnh5fV0sbmdJZlRoZW46W3t0eXBlOnh5fV0sbmdJZkVsc2U6W3t0eXBlOnh5fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZE0sW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW25nSWZdIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmVofSx7dHlwZTpYZ31dfSkse25nSWY6W3t0eXBlOnh5fV0sbmdJZlRoZW46W3t0eXBlOnh5fV0sbmdJZkVsc2U6W3t0eXBlOnh5fV19KTtjbGFzcyBwTXtjb25zdHJ1Y3Rvcigpe3RoaXMuJGltcGxpY2l0PW51bGwsdGhpcy5uZ0lmPW51bGx9fWZ1bmN0aW9uIG1NKHQsZSl7aWYoZSYmIWUuY3JlYXRlRW1iZWRkZWRWaWV3KXRocm93IG5ldyBFcnJvcihgJHt0fSBtdXN0IGJlIGEgVGVtcGxhdGVSZWYsIGJ1dCByZWNlaXZlZCAnJHtHZShlKX0nLmApfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyB1TXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX3ZpZXdDb250YWluZXJSZWY9dCx0aGlzLl90ZW1wbGF0ZVJlZj1lLHRoaXMuX2NyZWF0ZWQ9ITF9Y3JlYXRlKCl7dGhpcy5fY3JlYXRlZD0hMCx0aGlzLl92aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLl90ZW1wbGF0ZVJlZil9ZGVzdHJveSgpe3RoaXMuX2NyZWF0ZWQ9ITEsdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jbGVhcigpfWVuZm9yY2VTdGF0ZSh0KXt0JiYhdGhpcy5fY3JlYXRlZD90aGlzLmNyZWF0ZSgpOiF0JiZ0aGlzLl9jcmVhdGVkJiZ0aGlzLmRlc3Ryb3koKX19Y2xhc3MgZk17Y29uc3RydWN0b3IoKXt0aGlzLl9kZWZhdWx0VXNlZD0hMSx0aGlzLl9jYXNlQ291bnQ9MCx0aGlzLl9sYXN0Q2FzZUNoZWNrSW5kZXg9MCx0aGlzLl9sYXN0Q2FzZXNNYXRjaGVkPSExfXNldCBuZ1N3aXRjaCh0KXt0aGlzLl9uZ1N3aXRjaD10LDA9PT10aGlzLl9jYXNlQ291bnQmJnRoaXMuX3VwZGF0ZURlZmF1bHRDYXNlcyghMCl9X2FkZENhc2UoKXtyZXR1cm4gdGhpcy5fY2FzZUNvdW50Kyt9X2FkZERlZmF1bHQodCl7dGhpcy5fZGVmYXVsdFZpZXdzfHwodGhpcy5fZGVmYXVsdFZpZXdzPVtdKSx0aGlzLl9kZWZhdWx0Vmlld3MucHVzaCh0KX1fbWF0Y2hDYXNlKHQpe2NvbnN0IGU9dD09dGhpcy5fbmdTd2l0Y2g7cmV0dXJuIHRoaXMuX2xhc3RDYXNlc01hdGNoZWQ9dGhpcy5fbGFzdENhc2VzTWF0Y2hlZHx8ZSx0aGlzLl9sYXN0Q2FzZUNoZWNrSW5kZXgrKyx0aGlzLl9sYXN0Q2FzZUNoZWNrSW5kZXg9PT10aGlzLl9jYXNlQ291bnQmJih0aGlzLl91cGRhdGVEZWZhdWx0Q2FzZXMoIXRoaXMuX2xhc3RDYXNlc01hdGNoZWQpLHRoaXMuX2xhc3RDYXNlQ2hlY2tJbmRleD0wLHRoaXMuX2xhc3RDYXNlc01hdGNoZWQ9ITEpLGV9X3VwZGF0ZURlZmF1bHRDYXNlcyh0KXtpZih0aGlzLl9kZWZhdWx0Vmlld3MmJnQhPT10aGlzLl9kZWZhdWx0VXNlZCl7dGhpcy5fZGVmYXVsdFVzZWQ9dDtmb3IobGV0IGU9MDtlPHRoaXMuX2RlZmF1bHRWaWV3cy5sZW5ndGg7ZSsrKXRoaXMuX2RlZmF1bHRWaWV3c1tlXS5lbmZvcmNlU3RhdGUodCl9fX1mTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8Zk0pfSxmTS7JtWRpcj1sbyh7dHlwZTpmTSxzZWxlY3RvcnM6W1siIiwibmdTd2l0Y2giLCIiXV0saW5wdXRzOntuZ1N3aXRjaDoibmdTd2l0Y2gifX0pLGZNLnByb3BEZWNvcmF0b3JzPXtuZ1N3aXRjaDpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChmTSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbmdTd2l0Y2hdIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW119KSx7bmdTd2l0Y2g6W3t0eXBlOnh5fV19KTtjbGFzcyBnTXtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5uZ1N3aXRjaD1uLCJ1bmRlZmluZWQiIT10eXBlb2YgbmdEZXZNb2RlJiYhbmdEZXZNb2RlfHxufHxiTSgibmdTd2l0Y2hDYXNlIiwiTmdTd2l0Y2hDYXNlIiksbi5fYWRkQ2FzZSgpLHRoaXMuX3ZpZXc9bmV3IHVNKHQsZSl9bmdEb0NoZWNrKCl7dGhpcy5fdmlldy5lbmZvcmNlU3RhdGUodGhpcy5uZ1N3aXRjaC5fbWF0Y2hDYXNlKHRoaXMubmdTd2l0Y2hDYXNlKSl9fWdNLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxnTSkoU20oZWgpLFNtKFhnKSxTbShmTSw5KSl9LGdNLsm1ZGlyPWxvKHt0eXBlOmdNLHNlbGVjdG9yczpbWyIiLCJuZ1N3aXRjaENhc2UiLCIiXV0saW5wdXRzOntuZ1N3aXRjaENhc2U6Im5nU3dpdGNoQ2FzZSJ9fSksZ00uY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTplaH0se3R5cGU6WGd9LHt0eXBlOmZNLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpScn1dfV0sZ00ucHJvcERlY29yYXRvcnM9e25nU3dpdGNoQ2FzZTpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChnTSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbmdTd2l0Y2hDYXNlXSJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTplaH0se3R5cGU6WGd9LHt0eXBlOmZNLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpScn1dfV19KSx7bmdTd2l0Y2hDYXNlOlt7dHlwZTp4eX1dfSk7Y2xhc3MgaE17Y29uc3RydWN0b3IodCxlLG4peyJ1bmRlZmluZWQiIT10eXBlb2YgbmdEZXZNb2RlJiYhbmdEZXZNb2RlfHxufHxiTSgibmdTd2l0Y2hEZWZhdWx0IiwiTmdTd2l0Y2hEZWZhdWx0Iiksbi5fYWRkRGVmYXVsdChuZXcgdU0odCxlKSl9fWZ1bmN0aW9uIGJNKHQsZSl7dGhyb3cgbmV3IEtlKCIzMDUiLGBBbiBlbGVtZW50IHdpdGggdGhlICIke3R9IiBhdHRyaWJ1dGUgKG1hdGNoaW5nIHRoZSAiJHtlfSIgZGlyZWN0aXZlKSBtdXN0IGJlIGxvY2F0ZWQgaW5zaWRlIGFuIGVsZW1lbnQgd2l0aCB0aGUgIm5nU3dpdGNoIiBhdHRyaWJ1dGUgKG1hdGNoaW5nICJOZ1N3aXRjaCIgZGlyZWN0aXZlKWApfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9oTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8aE0pKFNtKGVoKSxTbShYZyksU20oZk0sOSkpfSxoTS7JtWRpcj1sbyh7dHlwZTpoTSxzZWxlY3RvcnM6W1siIiwibmdTd2l0Y2hEZWZhdWx0IiwiIl1dfSksaE0uY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTplaH0se3R5cGU6WGd9LHt0eXBlOmZNLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpScn1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChoTSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbmdTd2l0Y2hEZWZhdWx0XSJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTplaH0se3R5cGU6WGd9LHt0eXBlOmZNLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpScn1dfV19KSxudWxsKTtjbGFzcyB5TXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9sb2NhbGl6YXRpb249dCx0aGlzLl9jYXNlVmlld3M9e319c2V0IG5nUGx1cmFsKHQpe3RoaXMuX3N3aXRjaFZhbHVlPXQsdGhpcy5fdXBkYXRlVmlldygpfWFkZENhc2UodCxlKXt0aGlzLl9jYXNlVmlld3NbdF09ZX1fdXBkYXRlVmlldygpe3RoaXMuX2NsZWFyVmlld3MoKTtjb25zdCB0PU9iamVjdC5rZXlzKHRoaXMuX2Nhc2VWaWV3cyksZT1uTSh0aGlzLl9zd2l0Y2hWYWx1ZSx0LHRoaXMuX2xvY2FsaXphdGlvbik7dGhpcy5fYWN0aXZhdGVWaWV3KHRoaXMuX2Nhc2VWaWV3c1tlXSl9X2NsZWFyVmlld3MoKXt0aGlzLl9hY3RpdmVWaWV3JiZ0aGlzLl9hY3RpdmVWaWV3LmRlc3Ryb3koKX1fYWN0aXZhdGVWaWV3KHQpe3QmJih0aGlzLl9hY3RpdmVWaWV3PXQsdGhpcy5fYWN0aXZlVmlldy5jcmVhdGUoKSl9fXlNLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx5TSkoU20oZU0pKX0seU0uybVkaXI9bG8oe3R5cGU6eU0sc2VsZWN0b3JzOltbIiIsIm5nUGx1cmFsIiwiIl1dLGlucHV0czp7bmdQbHVyYWw6Im5nUGx1cmFsIn19KSx5TS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmVNfV0seU0ucHJvcERlY29yYXRvcnM9e25nUGx1cmFsOlt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHlNLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IltuZ1BsdXJhbF0ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6ZU19XX0pLHtuZ1BsdXJhbDpbe3R5cGU6eHl9XX0pO2NsYXNzIF9Ne2NvbnN0cnVjdG9yKHQsZSxuLG8pe3RoaXMudmFsdWU9dDtjb25zdCBpPSFpc05hTihOdW1iZXIodCkpO28uYWRkQ2FzZShpP2A9JHt0fWA6dCxuZXcgdU0obixlKSl9fV9NLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxfTSkoTmEoIm5nUGx1cmFsQ2FzZSIpLFNtKFhnKSxTbShlaCksU20oeU0sMSkpfSxfTS7JtWRpcj1sbyh7dHlwZTpfTSxzZWxlY3RvcnM6W1siIiwibmdQbHVyYWxDYXNlIiwiIl1dfSksX00uY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6amEsYXJnczpbIm5nUGx1cmFsQ2FzZSJdfV19LHt0eXBlOlhnfSx7dHlwZTplaH0se3R5cGU6eU0sZGVjb3JhdG9yczpbe3R5cGU6UnJ9XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoX00sW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW25nUGx1cmFsQ2FzZV0ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmphLGFyZ3M6WyJuZ1BsdXJhbENhc2UiXX1dfSx7dHlwZTpYZ30se3R5cGU6ZWh9LHt0eXBlOnlNLGRlY29yYXRvcnM6W3t0eXBlOlJyfV19XX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgQ017Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuX25nRWw9dCx0aGlzLl9kaWZmZXJzPWUsdGhpcy5fcmVuZGVyZXI9bix0aGlzLl9uZ1N0eWxlPW51bGwsdGhpcy5fZGlmZmVyPW51bGx9c2V0IG5nU3R5bGUodCl7dGhpcy5fbmdTdHlsZT10LCF0aGlzLl9kaWZmZXImJnQmJih0aGlzLl9kaWZmZXI9dGhpcy5fZGlmZmVycy5maW5kKHQpLmNyZWF0ZSgpKX1uZ0RvQ2hlY2soKXtpZih0aGlzLl9kaWZmZXIpe2NvbnN0IHQ9dGhpcy5fZGlmZmVyLmRpZmYodGhpcy5fbmdTdHlsZSk7dCYmdGhpcy5fYXBwbHlDaGFuZ2VzKHQpfX1fc2V0U3R5bGUodCxlKXtjb25zdFtuLG9dPXQuc3BsaXQoIi4iKTtudWxsIT0oZT1udWxsIT1lJiZvP2Ake2V9JHtvfWA6ZSk/dGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUodGhpcy5fbmdFbC5uYXRpdmVFbGVtZW50LG4sZSk6dGhpcy5fcmVuZGVyZXIucmVtb3ZlU3R5bGUodGhpcy5fbmdFbC5uYXRpdmVFbGVtZW50LG4pfV9hcHBseUNoYW5nZXModCl7dC5mb3JFYWNoUmVtb3ZlZEl0ZW0oKHQ9PnRoaXMuX3NldFN0eWxlKHQua2V5LG51bGwpKSksdC5mb3JFYWNoQWRkZWRJdGVtKCh0PT50aGlzLl9zZXRTdHlsZSh0LmtleSx0LmN1cnJlbnRWYWx1ZSkpKSx0LmZvckVhY2hDaGFuZ2VkSXRlbSgodD0+dGhpcy5fc2V0U3R5bGUodC5rZXksdC5jdXJyZW50VmFsdWUpKSl9fUNNLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxDTSkoU20oaGcpLFNtKExnKSxTbShDZykpfSxDTS7JtWRpcj1sbyh7dHlwZTpDTSxzZWxlY3RvcnM6W1siIiwibmdTdHlsZSIsIiJdXSxpbnB1dHM6e25nU3R5bGU6Im5nU3R5bGUifX0pLENNLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOkxnfSx7dHlwZTpDZ31dLENNLnByb3BEZWNvcmF0b3JzPXtuZ1N0eWxlOlt7dHlwZTp4eSxhcmdzOlsibmdTdHlsZSJdfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQ00sW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW25nU3R5bGVdIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTpMZ30se3R5cGU6Q2d9XX0pLHtuZ1N0eWxlOlt7dHlwZTp4eSxhcmdzOlsibmdTdHlsZSJdfV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIE1Ne2NvbnN0cnVjdG9yKHQpe3RoaXMuX3ZpZXdDb250YWluZXJSZWY9dCx0aGlzLl92aWV3UmVmPW51bGwsdGhpcy5uZ1RlbXBsYXRlT3V0bGV0Q29udGV4dD1udWxsLHRoaXMubmdUZW1wbGF0ZU91dGxldD1udWxsfW5nT25DaGFuZ2VzKHQpe2lmKHQubmdUZW1wbGF0ZU91dGxldCl7Y29uc3QgdD10aGlzLl92aWV3Q29udGFpbmVyUmVmO3RoaXMuX3ZpZXdSZWYmJnQucmVtb3ZlKHQuaW5kZXhPZih0aGlzLl92aWV3UmVmKSksdGhpcy5fdmlld1JlZj10aGlzLm5nVGVtcGxhdGVPdXRsZXQ/dC5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5uZ1RlbXBsYXRlT3V0bGV0LHRoaXMubmdUZW1wbGF0ZU91dGxldENvbnRleHQpOm51bGx9ZWxzZSB0aGlzLl92aWV3UmVmJiZ0Lm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0JiZ0aGlzLm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0JiYodGhpcy5fdmlld1JlZi5jb250ZXh0PXRoaXMubmdUZW1wbGF0ZU91dGxldENvbnRleHQpfX1NTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8TU0pKFNtKGVoKSl9LE1NLsm1ZGlyPWxvKHt0eXBlOk1NLHNlbGVjdG9yczpbWyIiLCJuZ1RlbXBsYXRlT3V0bGV0IiwiIl1dLGlucHV0czp7bmdUZW1wbGF0ZU91dGxldENvbnRleHQ6Im5nVGVtcGxhdGVPdXRsZXRDb250ZXh0IixuZ1RlbXBsYXRlT3V0bGV0OiJuZ1RlbXBsYXRlT3V0bGV0In0sZmVhdHVyZXM6W0JvXX0pLE1NLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6ZWh9XSxNTS5wcm9wRGVjb3JhdG9ycz17bmdUZW1wbGF0ZU91dGxldENvbnRleHQ6W3t0eXBlOnh5fV0sbmdUZW1wbGF0ZU91dGxldDpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChNTSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbmdUZW1wbGF0ZU91dGxldF0ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6ZWh9XX0pLHtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dDpbe3R5cGU6eHl9XSxuZ1RlbXBsYXRlT3V0bGV0Olt7dHlwZTp4eX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCB2TT1bYU0sck0sbE0sZE0sTU0sQ00sZk0sZ00saE0seU0sX01dOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiB4TSh0LGUpe3JldHVybiBFcnJvcihgSW52YWxpZFBpcGVBcmd1bWVudDogJyR7ZX0nIGZvciBwaXBlICcke0dlKHQpfSdgKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3QgT009bmV3IGNsYXNze2NyZWF0ZVN1YnNjcmlwdGlvbih0LGUpe3JldHVybiB0LnRoZW4oZSwodD0+e3Rocm93IHR9KSl9ZGlzcG9zZSh0KXt9b25EZXN0cm95KHQpe319LFBNPW5ldyBjbGFzc3tjcmVhdGVTdWJzY3JpcHRpb24odCxlKXtyZXR1cm4gdC5zdWJzY3JpYmUoe25leHQ6ZSxlcnJvcjp0PT57dGhyb3cgdH19KX1kaXNwb3NlKHQpe3QudW5zdWJzY3JpYmUoKX1vbkRlc3Ryb3kodCl7dC51bnN1YnNjcmliZSgpfX07Y2xhc3Mgd017Y29uc3RydWN0b3IodCl7dGhpcy5fcmVmPXQsdGhpcy5fbGF0ZXN0VmFsdWU9bnVsbCx0aGlzLl9zdWJzY3JpcHRpb249bnVsbCx0aGlzLl9vYmo9bnVsbCx0aGlzLl9zdHJhdGVneT1udWxsfW5nT25EZXN0cm95KCl7dGhpcy5fc3Vic2NyaXB0aW9uJiZ0aGlzLl9kaXNwb3NlKCl9dHJhbnNmb3JtKHQpe3JldHVybiB0aGlzLl9vYmo/dCE9PXRoaXMuX29iaj8odGhpcy5fZGlzcG9zZSgpLHRoaXMudHJhbnNmb3JtKHQpKTp0aGlzLl9sYXRlc3RWYWx1ZToodCYmdGhpcy5fc3Vic2NyaWJlKHQpLHRoaXMuX2xhdGVzdFZhbHVlKX1fc3Vic2NyaWJlKHQpe3RoaXMuX29iaj10LHRoaXMuX3N0cmF0ZWd5PXRoaXMuX3NlbGVjdFN0cmF0ZWd5KHQpLHRoaXMuX3N1YnNjcmlwdGlvbj10aGlzLl9zdHJhdGVneS5jcmVhdGVTdWJzY3JpcHRpb24odCwoZT0+dGhpcy5fdXBkYXRlTGF0ZXN0VmFsdWUodCxlKSkpfV9zZWxlY3RTdHJhdGVneSh0KXtpZihGbSh0KSlyZXR1cm4gT007aWYoTG0odCkpcmV0dXJuIFBNO3Rocm93IHhNKHdNLHQpfV9kaXNwb3NlKCl7dGhpcy5fc3RyYXRlZ3kuZGlzcG9zZSh0aGlzLl9zdWJzY3JpcHRpb24pLHRoaXMuX2xhdGVzdFZhbHVlPW51bGwsdGhpcy5fc3Vic2NyaXB0aW9uPW51bGwsdGhpcy5fb2JqPW51bGx9X3VwZGF0ZUxhdGVzdFZhbHVlKHQsZSl7dD09PXRoaXMuX29iaiYmKHRoaXMuX2xhdGVzdFZhbHVlPWUsdGhpcy5fcmVmLm1hcmtGb3JDaGVjaygpKX19d00uybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHdNKShTbShVZywxNikpfSx3TS7JtXBpcGU9Y28oe25hbWU6ImFzeW5jIix0eXBlOndNLHB1cmU6ITF9KSx3TS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlVnfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh3TSxbe3R5cGU6dnksYXJnczpbe25hbWU6ImFzeW5jIixwdXJlOiExfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6VWd9XX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3Mga017dHJhbnNmb3JtKHQpe2lmKG51bGw9PXQpcmV0dXJuIG51bGw7aWYoInN0cmluZyIhPXR5cGVvZiB0KXRocm93IHhNKGtNLHQpO3JldHVybiB0LnRvTG93ZXJDYXNlKCl9fWtNLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxrTSl9LGtNLsm1cGlwZT1jbyh7bmFtZToibG93ZXJjYXNlIix0eXBlOmtNLHB1cmU6ITB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGtNLFt7dHlwZTp2eSxhcmdzOlt7bmFtZToibG93ZXJjYXNlIn1dfV0sbnVsbCxudWxsKTtjb25zdCBTTT0vKD86W0EtWmEtelx4QUFceEI1XHhCQVx4QzAtXHhENlx4RDgtXHhGNlx4RjgtXHUwMkMxXHUwMkM2LVx1MDJEMVx1MDJFMC1cdTAyRTRcdTAyRUNcdTAyRUVcdTAzNzAtXHUwMzc0XHUwMzc2XHUwMzc3XHUwMzdBLVx1MDM3RFx1MDM3Rlx1MDM4Nlx1MDM4OC1cdTAzOEFcdTAzOENcdTAzOEUtXHUwM0ExXHUwM0EzLVx1MDNGNVx1MDNGNy1cdTA0ODFcdTA0OEEtXHUwNTJGXHUwNTMxLVx1MDU1Nlx1MDU1OVx1MDU2MS1cdTA1ODdcdTA1RDAtXHUwNUVBXHUwNUYwLVx1MDVGMlx1MDYyMC1cdTA2NEFcdTA2NkVcdTA2NkZcdTA2NzEtXHUwNkQzXHUwNkQ1XHUwNkU1XHUwNkU2XHUwNkVFXHUwNkVGXHUwNkZBLVx1MDZGQ1x1MDZGRlx1MDcxMFx1MDcxMi1cdTA3MkZcdTA3NEQtXHUwN0E1XHUwN0IxXHUwN0NBLVx1MDdFQVx1MDdGNFx1MDdGNVx1MDdGQVx1MDgwMC1cdTA4MTVcdTA4MUFcdTA4MjRcdTA4MjhcdTA4NDAtXHUwODU4XHUwODYwLVx1MDg2QVx1MDhBMC1cdTA4QjRcdTA4QjYtXHUwOEJEXHUwOTA0LVx1MDkzOVx1MDkzRFx1MDk1MFx1MDk1OC1cdTA5NjFcdTA5NzEtXHUwOTgwXHUwOTg1LVx1MDk4Q1x1MDk4Rlx1MDk5MFx1MDk5My1cdTA5QThcdTA5QUEtXHUwOUIwXHUwOUIyXHUwOUI2LVx1MDlCOVx1MDlCRFx1MDlDRVx1MDlEQ1x1MDlERFx1MDlERi1cdTA5RTFcdTA5RjBcdTA5RjFcdTA5RkNcdTBBMDUtXHUwQTBBXHUwQTBGXHUwQTEwXHUwQTEzLVx1MEEyOFx1MEEyQS1cdTBBMzBcdTBBMzJcdTBBMzNcdTBBMzVcdTBBMzZcdTBBMzhcdTBBMzlcdTBBNTktXHUwQTVDXHUwQTVFXHUwQTcyLVx1MEE3NFx1MEE4NS1cdTBBOERcdTBBOEYtXHUwQTkxXHUwQTkzLVx1MEFBOFx1MEFBQS1cdTBBQjBcdTBBQjJcdTBBQjNcdTBBQjUtXHUwQUI5XHUwQUJEXHUwQUQwXHUwQUUwXHUwQUUxXHUwQUY5XHUwQjA1LVx1MEIwQ1x1MEIwRlx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyXHUwQjMzXHUwQjM1LVx1MEIzOVx1MEIzRFx1MEI1Q1x1MEI1RFx1MEI1Ri1cdTBCNjFcdTBCNzFcdTBCODNcdTBCODUtXHUwQjhBXHUwQjhFLVx1MEI5MFx1MEI5Mi1cdTBCOTVcdTBCOTlcdTBCOUFcdTBCOUNcdTBCOUVcdTBCOUZcdTBCQTNcdTBCQTRcdTBCQTgtXHUwQkFBXHUwQkFFLVx1MEJCOVx1MEJEMFx1MEMwNS1cdTBDMENcdTBDMEUtXHUwQzEwXHUwQzEyLVx1MEMyOFx1MEMyQS1cdTBDMzlcdTBDM0RcdTBDNTgtXHUwQzVBXHUwQzYwXHUwQzYxXHUwQzgwXHUwQzg1LVx1MEM4Q1x1MEM4RS1cdTBDOTBcdTBDOTItXHUwQ0E4XHUwQ0FBLVx1MENCM1x1MENCNS1cdTBDQjlcdTBDQkRcdTBDREVcdTBDRTBcdTBDRTFcdTBDRjFcdTBDRjJcdTBEMDUtXHUwRDBDXHUwRDBFLVx1MEQxMFx1MEQxMi1cdTBEM0FcdTBEM0RcdTBENEVcdTBENTQtXHUwRDU2XHUwRDVGLVx1MEQ2MVx1MEQ3QS1cdTBEN0ZcdTBEODUtXHUwRDk2XHUwRDlBLVx1MERCMVx1MERCMy1cdTBEQkJcdTBEQkRcdTBEQzAtXHUwREM2XHUwRTAxLVx1MEUzMFx1MEUzMlx1MEUzM1x1MEU0MC1cdTBFNDZcdTBFODFcdTBFODJcdTBFODRcdTBFODdcdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUFcdTBFQUJcdTBFQUQtXHUwRUIwXHUwRUIyXHUwRUIzXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEVDNlx1MEVEQy1cdTBFREZcdTBGMDBcdTBGNDAtXHUwRjQ3XHUwRjQ5LVx1MEY2Q1x1MEY4OC1cdTBGOENcdTEwMDAtXHUxMDJBXHUxMDNGXHUxMDUwLVx1MTA1NVx1MTA1QS1cdTEwNURcdTEwNjFcdTEwNjVcdTEwNjZcdTEwNkUtXHUxMDcwXHUxMDc1LVx1MTA4MVx1MTA4RVx1MTBBMC1cdTEwQzVcdTEwQzdcdTEwQ0RcdTEwRDAtXHUxMEZBXHUxMEZDLVx1MTI0OFx1MTI0QS1cdTEyNERcdTEyNTAtXHUxMjU2XHUxMjU4XHUxMjVBLVx1MTI1RFx1MTI2MC1cdTEyODhcdTEyOEEtXHUxMjhEXHUxMjkwLVx1MTJCMFx1MTJCMi1cdTEyQjVcdTEyQjgtXHUxMkJFXHUxMkMwXHUxMkMyLVx1MTJDNVx1MTJDOC1cdTEyRDZcdTEyRDgtXHUxMzEwXHUxMzEyLVx1MTMxNVx1MTMxOC1cdTEzNUFcdTEzODAtXHUxMzhGXHUxM0EwLVx1MTNGNVx1MTNGOC1cdTEzRkRcdTE0MDEtXHUxNjZDXHUxNjZGLVx1MTY3Rlx1MTY4MS1cdTE2OUFcdTE2QTAtXHUxNkVBXHUxNkYxLVx1MTZGOFx1MTcwMC1cdTE3MENcdTE3MEUtXHUxNzExXHUxNzIwLVx1MTczMVx1MTc0MC1cdTE3NTFcdTE3NjAtXHUxNzZDXHUxNzZFLVx1MTc3MFx1MTc4MC1cdTE3QjNcdTE3RDdcdTE3RENcdTE4MjAtXHUxODc3XHUxODgwLVx1MTg4NFx1MTg4Ny1cdTE4QThcdTE4QUFcdTE4QjAtXHUxOEY1XHUxOTAwLVx1MTkxRVx1MTk1MC1cdTE5NkRcdTE5NzAtXHUxOTc0XHUxOTgwLVx1MTlBQlx1MTlCMC1cdTE5QzlcdTFBMDAtXHUxQTE2XHUxQTIwLVx1MUE1NFx1MUFBN1x1MUIwNS1cdTFCMzNcdTFCNDUtXHUxQjRCXHUxQjgzLVx1MUJBMFx1MUJBRVx1MUJBRlx1MUJCQS1cdTFCRTVcdTFDMDAtXHUxQzIzXHUxQzRELVx1MUM0Rlx1MUM1QS1cdTFDN0RcdTFDODAtXHUxQzg4XHUxQ0U5LVx1MUNFQ1x1MUNFRS1cdTFDRjFcdTFDRjVcdTFDRjZcdTFEMDAtXHUxREJGXHUxRTAwLVx1MUYxNVx1MUYxOC1cdTFGMURcdTFGMjAtXHUxRjQ1XHUxRjQ4LVx1MUY0RFx1MUY1MC1cdTFGNTdcdTFGNTlcdTFGNUJcdTFGNURcdTFGNUYtXHUxRjdEXHUxRjgwLVx1MUZCNFx1MUZCNi1cdTFGQkNcdTFGQkVcdTFGQzItXHUxRkM0XHUxRkM2LVx1MUZDQ1x1MUZEMC1cdTFGRDNcdTFGRDYtXHUxRkRCXHUxRkUwLVx1MUZFQ1x1MUZGMi1cdTFGRjRcdTFGRjYtXHUxRkZDXHUyMDcxXHUyMDdGXHUyMDkwLVx1MjA5Q1x1MjEwMlx1MjEwN1x1MjEwQS1cdTIxMTNcdTIxMTVcdTIxMTktXHUyMTFEXHUyMTI0XHUyMTI2XHUyMTI4XHUyMTJBLVx1MjEyRFx1MjEyRi1cdTIxMzlcdTIxM0MtXHUyMTNGXHUyMTQ1LVx1MjE0OVx1MjE0RVx1MjE4M1x1MjE4NFx1MkMwMC1cdTJDMkVcdTJDMzAtXHUyQzVFXHUyQzYwLVx1MkNFNFx1MkNFQi1cdTJDRUVcdTJDRjJcdTJDRjNcdTJEMDAtXHUyRDI1XHUyRDI3XHUyRDJEXHUyRDMwLVx1MkQ2N1x1MkQ2Rlx1MkQ4MC1cdTJEOTZcdTJEQTAtXHUyREE2XHUyREE4LVx1MkRBRVx1MkRCMC1cdTJEQjZcdTJEQjgtXHUyREJFXHUyREMwLVx1MkRDNlx1MkRDOC1cdTJEQ0VcdTJERDAtXHUyREQ2XHUyREQ4LVx1MkRERVx1MkUyRlx1MzAwNVx1MzAwNlx1MzAzMS1cdTMwMzVcdTMwM0JcdTMwM0NcdTMwNDEtXHUzMDk2XHUzMDlELVx1MzA5Rlx1MzBBMS1cdTMwRkFcdTMwRkMtXHUzMEZGXHUzMTA1LVx1MzEyRVx1MzEzMS1cdTMxOEVcdTMxQTAtXHUzMUJBXHUzMUYwLVx1MzFGRlx1MzQwMC1cdTREQjVcdTRFMDAtXHU5RkVBXHVBMDAwLVx1QTQ4Q1x1QTREMC1cdUE0RkRcdUE1MDAtXHVBNjBDXHVBNjEwLVx1QTYxRlx1QTYyQVx1QTYyQlx1QTY0MC1cdUE2NkVcdUE2N0YtXHVBNjlEXHVBNkEwLVx1QTZFNVx1QTcxNy1cdUE3MUZcdUE3MjItXHVBNzg4XHVBNzhCLVx1QTdBRVx1QTdCMC1cdUE3QjdcdUE3RjctXHVBODAxXHVBODAzLVx1QTgwNVx1QTgwNy1cdUE4MEFcdUE4MEMtXHVBODIyXHVBODQwLVx1QTg3M1x1QTg4Mi1cdUE4QjNcdUE4RjItXHVBOEY3XHVBOEZCXHVBOEZEXHVBOTBBLVx1QTkyNVx1QTkzMC1cdUE5NDZcdUE5NjAtXHVBOTdDXHVBOTg0LVx1QTlCMlx1QTlDRlx1QTlFMC1cdUE5RTRcdUE5RTYtXHVBOUVGXHVBOUZBLVx1QTlGRVx1QUEwMC1cdUFBMjhcdUFBNDAtXHVBQTQyXHVBQTQ0LVx1QUE0Qlx1QUE2MC1cdUFBNzZcdUFBN0FcdUFBN0UtXHVBQUFGXHVBQUIxXHVBQUI1XHVBQUI2XHVBQUI5LVx1QUFCRFx1QUFDMFx1QUFDMlx1QUFEQi1cdUFBRERcdUFBRTAtXHVBQUVBXHVBQUYyLVx1QUFGNFx1QUIwMS1cdUFCMDZcdUFCMDktXHVBQjBFXHVBQjExLVx1QUIxNlx1QUIyMC1cdUFCMjZcdUFCMjgtXHVBQjJFXHVBQjMwLVx1QUI1QVx1QUI1Qy1cdUFCNjVcdUFCNzAtXHVBQkUyXHVBQzAwLVx1RDdBM1x1RDdCMC1cdUQ3QzZcdUQ3Q0ItXHVEN0ZCXHVGOTAwLVx1RkE2RFx1RkE3MC1cdUZBRDlcdUZCMDAtXHVGQjA2XHVGQjEzLVx1RkIxN1x1RkIxRFx1RkIxRi1cdUZCMjhcdUZCMkEtXHVGQjM2XHVGQjM4LVx1RkIzQ1x1RkIzRVx1RkI0MFx1RkI0MVx1RkI0M1x1RkI0NFx1RkI0Ni1cdUZCQjFcdUZCRDMtXHVGRDNEXHVGRDUwLVx1RkQ4Rlx1RkQ5Mi1cdUZEQzdcdUZERjAtXHVGREZCXHVGRTcwLVx1RkU3NFx1RkU3Ni1cdUZFRkNcdUZGMjEtXHVGRjNBXHVGRjQxLVx1RkY1QVx1RkY2Ni1cdUZGQkVcdUZGQzItXHVGRkM3XHVGRkNBLVx1RkZDRlx1RkZEMi1cdUZGRDdcdUZGREEtXHVGRkRDXXxcdUQ4MDBbXHVEQzAwLVx1REMwQlx1REMwRC1cdURDMjZcdURDMjgtXHVEQzNBXHVEQzNDXHVEQzNEXHVEQzNGLVx1REM0RFx1REM1MC1cdURDNURcdURDODAtXHVEQ0ZBXHVERTgwLVx1REU5Q1x1REVBMC1cdURFRDBcdURGMDAtXHVERjFGXHVERjJELVx1REY0MFx1REY0Mi1cdURGNDlcdURGNTAtXHVERjc1XHVERjgwLVx1REY5RFx1REZBMC1cdURGQzNcdURGQzgtXHVERkNGXXxcdUQ4MDFbXHVEQzAwLVx1REM5RFx1RENCMC1cdURDRDNcdURDRDgtXHVEQ0ZCXHVERDAwLVx1REQyN1x1REQzMC1cdURENjNcdURFMDAtXHVERjM2XHVERjQwLVx1REY1NVx1REY2MC1cdURGNjddfFx1RDgwMltcdURDMDAtXHVEQzA1XHVEQzA4XHVEQzBBLVx1REMzNVx1REMzN1x1REMzOFx1REMzQ1x1REMzRi1cdURDNTVcdURDNjAtXHVEQzc2XHVEQzgwLVx1REM5RVx1RENFMC1cdURDRjJcdURDRjRcdURDRjVcdUREMDAtXHVERDE1XHVERDIwLVx1REQzOVx1REQ4MC1cdUREQjdcdUREQkVcdUREQkZcdURFMDBcdURFMTAtXHVERTEzXHVERTE1LVx1REUxN1x1REUxOS1cdURFMzNcdURFNjAtXHVERTdDXHVERTgwLVx1REU5Q1x1REVDMC1cdURFQzdcdURFQzktXHVERUU0XHVERjAwLVx1REYzNVx1REY0MC1cdURGNTVcdURGNjAtXHVERjcyXHVERjgwLVx1REY5MV18XHVEODAzW1x1REMwMC1cdURDNDhcdURDODAtXHVEQ0IyXHVEQ0MwLVx1RENGMl18XHVEODA0W1x1REMwMy1cdURDMzdcdURDODMtXHVEQ0FGXHVEQ0QwLVx1RENFOFx1REQwMy1cdUREMjZcdURENTAtXHVERDcyXHVERDc2XHVERDgzLVx1RERCMlx1RERDMS1cdUREQzRcdUREREFcdURERENcdURFMDAtXHVERTExXHVERTEzLVx1REUyQlx1REU4MC1cdURFODZcdURFODhcdURFOEEtXHVERThEXHVERThGLVx1REU5RFx1REU5Ri1cdURFQThcdURFQjAtXHVERURFXHVERjA1LVx1REYwQ1x1REYwRlx1REYxMFx1REYxMy1cdURGMjhcdURGMkEtXHVERjMwXHVERjMyXHVERjMzXHVERjM1LVx1REYzOVx1REYzRFx1REY1MFx1REY1RC1cdURGNjFdfFx1RDgwNVtcdURDMDAtXHVEQzM0XHVEQzQ3LVx1REM0QVx1REM4MC1cdURDQUZcdURDQzRcdURDQzVcdURDQzdcdUREODAtXHVEREFFXHVEREQ4LVx1REREQlx1REUwMC1cdURFMkZcdURFNDRcdURFODAtXHVERUFBXHVERjAwLVx1REYxOV18XHVEODA2W1x1RENBMC1cdURDREZcdURDRkZcdURFMDBcdURFMEItXHVERTMyXHVERTNBXHVERTUwXHVERTVDLVx1REU4M1x1REU4Ni1cdURFODlcdURFQzAtXHVERUY4XXxcdUQ4MDdbXHVEQzAwLVx1REMwOFx1REMwQS1cdURDMkVcdURDNDBcdURDNzItXHVEQzhGXHVERDAwLVx1REQwNlx1REQwOFx1REQwOVx1REQwQi1cdUREMzBcdURENDZdfFx1RDgwOFtcdURDMDAtXHVERjk5XXxcdUQ4MDlbXHVEQzgwLVx1REQ0M118W1x1RDgwQ1x1RDgxQy1cdUQ4MjBcdUQ4NDAtXHVEODY4XHVEODZBLVx1RDg2Q1x1RDg2Ri1cdUQ4NzJcdUQ4NzQtXHVEODc5XVtcdURDMDAtXHVERkZGXXxcdUQ4MERbXHVEQzAwLVx1REMyRV18XHVEODExW1x1REMwMC1cdURFNDZdfFx1RDgxQVtcdURDMDAtXHVERTM4XHVERTQwLVx1REU1RVx1REVEMC1cdURFRURcdURGMDAtXHVERjJGXHVERjQwLVx1REY0M1x1REY2My1cdURGNzdcdURGN0QtXHVERjhGXXxcdUQ4MUJbXHVERjAwLVx1REY0NFx1REY1MFx1REY5My1cdURGOUZcdURGRTBcdURGRTFdfFx1RDgyMVtcdURDMDAtXHVERkVDXXxcdUQ4MjJbXHVEQzAwLVx1REVGMl18XHVEODJDW1x1REMwMC1cdUREMUVcdURENzAtXHVERUZCXXxcdUQ4MkZbXHVEQzAwLVx1REM2QVx1REM3MC1cdURDN0NcdURDODAtXHVEQzg4XHVEQzkwLVx1REM5OV18XHVEODM1W1x1REMwMC1cdURDNTRcdURDNTYtXHVEQzlDXHVEQzlFXHVEQzlGXHVEQ0EyXHVEQ0E1XHVEQ0E2XHVEQ0E5LVx1RENBQ1x1RENBRS1cdURDQjlcdURDQkJcdURDQkQtXHVEQ0MzXHVEQ0M1LVx1REQwNVx1REQwNy1cdUREMEFcdUREMEQtXHVERDE0XHVERDE2LVx1REQxQ1x1REQxRS1cdUREMzlcdUREM0ItXHVERDNFXHVERDQwLVx1REQ0NFx1REQ0Nlx1REQ0QS1cdURENTBcdURENTItXHVERUE1XHVERUE4LVx1REVDMFx1REVDMi1cdURFREFcdURFREMtXHVERUZBXHVERUZDLVx1REYxNFx1REYxNi1cdURGMzRcdURGMzYtXHVERjRFXHVERjUwLVx1REY2RVx1REY3MC1cdURGODhcdURGOEEtXHVERkE4XHVERkFBLVx1REZDMlx1REZDNC1cdURGQ0JdfFx1RDgzQVtcdURDMDAtXHVEQ0M0XHVERDAwLVx1REQ0M118XHVEODNCW1x1REUwMC1cdURFMDNcdURFMDUtXHVERTFGXHVERTIxXHVERTIyXHVERTI0XHVERTI3XHVERTI5LVx1REUzMlx1REUzNC1cdURFMzdcdURFMzlcdURFM0JcdURFNDJcdURFNDdcdURFNDlcdURFNEJcdURFNEQtXHVERTRGXHVERTUxXHVERTUyXHVERTU0XHVERTU3XHVERTU5XHVERTVCXHVERTVEXHVERTVGXHVERTYxXHVERTYyXHVERTY0XHVERTY3LVx1REU2QVx1REU2Qy1cdURFNzJcdURFNzQtXHVERTc3XHVERTc5LVx1REU3Q1x1REU3RVx1REU4MC1cdURFODlcdURFOEItXHVERTlCXHVERUExLVx1REVBM1x1REVBNS1cdURFQTlcdURFQUItXHVERUJCXXxcdUQ4NjlbXHVEQzAwLVx1REVENlx1REYwMC1cdURGRkZdfFx1RDg2RFtcdURDMDAtXHVERjM0XHVERjQwLVx1REZGRl18XHVEODZFW1x1REMwMC1cdURDMURcdURDMjAtXHVERkZGXXxcdUQ4NzNbXHVEQzAwLVx1REVBMVx1REVCMC1cdURGRkZdfFx1RDg3QVtcdURDMDAtXHVERkUwXXxcdUQ4N0VbXHVEQzAwLVx1REUxRF0pXFMqL2c7Y2xhc3MgRE17dHJhbnNmb3JtKHQpe2lmKG51bGw9PXQpcmV0dXJuIG51bGw7aWYoInN0cmluZyIhPXR5cGVvZiB0KXRocm93IHhNKERNLHQpO3JldHVybiB0LnJlcGxhY2UoU00sKHQ9PnRbMF0udG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKS50b0xvd2VyQ2FzZSgpKSl9fURNLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxETSl9LERNLsm1cGlwZT1jbyh7bmFtZToidGl0bGVjYXNlIix0eXBlOkRNLHB1cmU6ITB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKERNLFt7dHlwZTp2eSxhcmdzOlt7bmFtZToidGl0bGVjYXNlIn1dfV0sbnVsbCxudWxsKTtjbGFzcyBFTXt0cmFuc2Zvcm0odCl7aWYobnVsbD09dClyZXR1cm4gbnVsbDtpZigic3RyaW5nIiE9dHlwZW9mIHQpdGhyb3cgeE0oRU0sdCk7cmV0dXJuIHQudG9VcHBlckNhc2UoKX19RU0uybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEVNKX0sRU0uybVwaXBlPWNvKHtuYW1lOiJ1cHBlcmNhc2UiLHR5cGU6RU0scHVyZTohMH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRU0sW3t0eXBlOnZ5LGFyZ3M6W3tuYW1lOiJ1cHBlcmNhc2UifV19XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgUk17Y29uc3RydWN0b3IodCl7dGhpcy5sb2NhbGU9dH10cmFuc2Zvcm0odCxlPSJtZWRpdW1EYXRlIixuLG8pe2lmKG51bGw9PXR8fCIiPT09dHx8dCE9dClyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIE5DKHQsZSxvfHx0aGlzLmxvY2FsZSxuKX1jYXRjaCh0KXt0aHJvdyB4TShSTSx0Lm1lc3NhZ2UpfX19Uk0uybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFJNKShTbShXeSwxNikpfSxSTS7JtXBpcGU9Y28oe25hbWU6ImRhdGUiLHR5cGU6Uk0scHVyZTohMH0pLFJNLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1d5XX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChSTSxbe3R5cGU6dnksYXJnczpbe25hbWU6ImRhdGUiLHB1cmU6ITB9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbV3ldfV19XX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgQU09LyMvZztjbGFzcyBUTXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9sb2NhbGl6YXRpb249dH10cmFuc2Zvcm0odCxlLG4pe2lmKG51bGw9PXQpcmV0dXJuIiI7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZSl0aHJvdyB4TShUTSxlKTtyZXR1cm4gZVtuTSh0LE9iamVjdC5rZXlzKGUpLHRoaXMuX2xvY2FsaXphdGlvbixuKV0ucmVwbGFjZShBTSx0LnRvU3RyaW5nKCkpfX1UTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VE0pKFNtKGVNLDE2KSl9LFRNLsm1cGlwZT1jbyh7bmFtZToiaTE4blBsdXJhbCIsdHlwZTpUTSxwdXJlOiEwfSksVE0uY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTplTX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoVE0sW3t0eXBlOnZ5LGFyZ3M6W3tuYW1lOiJpMThuUGx1cmFsIixwdXJlOiEwfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6ZU19XX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgTk17dHJhbnNmb3JtKHQsZSl7aWYobnVsbD09dClyZXR1cm4iIjtpZigib2JqZWN0IiE9dHlwZW9mIGV8fCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyB4TShOTSxlKTtyZXR1cm4gZS5oYXNPd25Qcm9wZXJ0eSh0KT9lW3RdOmUuaGFzT3duUHJvcGVydHkoIm90aGVyIik/ZS5vdGhlcjoiIn19Tk0uybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fE5NKX0sTk0uybVwaXBlPWNvKHtuYW1lOiJpMThuU2VsZWN0Iix0eXBlOk5NLHB1cmU6ITB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKE5NLFt7dHlwZTp2eSxhcmdzOlt7bmFtZToiaTE4blNlbGVjdCIscHVyZTohMH1dfV0sbnVsbCxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIHpNe3RyYW5zZm9ybSh0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodCxudWxsLDIpfX16TS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8ek0pfSx6TS7JtXBpcGU9Y28oe25hbWU6Impzb24iLHR5cGU6ek0scHVyZTohMX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoek0sW3t0eXBlOnZ5LGFyZ3M6W3tuYW1lOiJqc29uIixwdXJlOiExfV19XSxudWxsLG51bGwpO2NsYXNzIElNe2NvbnN0cnVjdG9yKHQpe3RoaXMuZGlmZmVycz10LHRoaXMua2V5VmFsdWVzPVtdLHRoaXMuY29tcGFyZUZuPUhNfXRyYW5zZm9ybSh0LGU9SE0pe2lmKCF0fHwhKHQgaW5zdGFuY2VvZiBNYXApJiYib2JqZWN0IiE9dHlwZW9mIHQpcmV0dXJuIG51bGw7dGhpcy5kaWZmZXJ8fCh0aGlzLmRpZmZlcj10aGlzLmRpZmZlcnMuZmluZCh0KS5jcmVhdGUoKSk7Y29uc3Qgbj10aGlzLmRpZmZlci5kaWZmKHQpLG89ZSE9PXRoaXMuY29tcGFyZUZuO3JldHVybiBuJiYodGhpcy5rZXlWYWx1ZXM9W10sbi5mb3JFYWNoSXRlbSgodD0+e3RoaXMua2V5VmFsdWVzLnB1c2goKAovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KZnVuY3Rpb24gZSh0LG4pe3JldHVybntrZXk6dCx2YWx1ZTpufX0pKHQua2V5LHQuY3VycmVudFZhbHVlKSl9KSkpLChufHxvKSYmKHRoaXMua2V5VmFsdWVzLnNvcnQoZSksdGhpcy5jb21wYXJlRm49ZSksdGhpcy5rZXlWYWx1ZXN9fWZ1bmN0aW9uIEhNKHQsZSl7Y29uc3Qgbj10LmtleSxvPWUua2V5O2lmKG49PT1vKXJldHVybiAwO2lmKHZvaWQgMD09PW4pcmV0dXJuIDE7aWYodm9pZCAwPT09bylyZXR1cm4tMTtpZihudWxsPT09bilyZXR1cm4gMTtpZihudWxsPT09bylyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIG4mJiJzdHJpbmciPT10eXBlb2YgbylyZXR1cm4gbjxvPy0xOjE7aWYoIm51bWJlciI9PXR5cGVvZiBuJiYibnVtYmVyIj09dHlwZW9mIG8pcmV0dXJuIG4tbztpZigiYm9vbGVhbiI9PXR5cGVvZiBuJiYiYm9vbGVhbiI9PXR5cGVvZiBvKXJldHVybiBuPG8/LTE6MTtjb25zdCBpPVN0cmluZyhuKSxhPVN0cmluZyhvKTtyZXR1cm4gaT09YT8wOmk8YT8tMToxfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9JTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SU0pKFNtKExnLDE2KSl9LElNLsm1cGlwZT1jbyh7bmFtZToia2V5dmFsdWUiLHR5cGU6SU0scHVyZTohMX0pLElNLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6TGd9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKElNLFt7dHlwZTp2eSxhcmdzOlt7bmFtZToia2V5dmFsdWUiLHB1cmU6ITF9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpMZ31dfSksbnVsbCk7Y2xhc3MgRk17Y29uc3RydWN0b3IodCl7dGhpcy5fbG9jYWxlPXR9dHJhbnNmb3JtKHQsZSxuKXtpZighVk0odCkpcmV0dXJuIG51bGw7bj1ufHx0aGlzLl9sb2NhbGU7dHJ5e3JldHVybiBRQyhqTSh0KSxuLGUpfWNhdGNoKHQpe3Rocm93IHhNKEZNLHQubWVzc2FnZSl9fX1GTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8Rk0pKFNtKFd5LDE2KSl9LEZNLsm1cGlwZT1jbyh7bmFtZToibnVtYmVyIix0eXBlOkZNLHB1cmU6ITB9KSxGTS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltXeV19XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRk0sW3t0eXBlOnZ5LGFyZ3M6W3tuYW1lOiJudW1iZXIifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1d5XX1dfV19KSxudWxsKTtjbGFzcyBMTXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9sb2NhbGU9dH10cmFuc2Zvcm0odCxlLG4pe2lmKCFWTSh0KSlyZXR1cm4gbnVsbDtuPW58fHRoaXMuX2xvY2FsZTt0cnl7cmV0dXJuKGZ1bmN0aW9uIG8odCxlLG4pe3JldHVybiBKQyh0LCRDKHhDKGUsbUMuUGVyY2VudCksdkMoZSxiQy5NaW51c1NpZ24pKSxlLGJDLkdyb3VwLGJDLkRlY2ltYWwsbiwhMCkucmVwbGFjZShuZXcgUmVnRXhwKCIlIiwiZyIpLHZDKGUsYkMuUGVyY2VudFNpZ24pKX0pKGpNKHQpLG4sZSl9Y2F0Y2godCl7dGhyb3cgeE0oTE0sdC5tZXNzYWdlKX19fUxNLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxMTSkoU20oV3ksMTYpKX0sTE0uybVwaXBlPWNvKHtuYW1lOiJwZXJjZW50Iix0eXBlOkxNLHB1cmU6ITB9KSxMTS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltXeV19XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoTE0sW3t0eXBlOnZ5LGFyZ3M6W3tuYW1lOiJwZXJjZW50In1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltXeV19XX1dfSksbnVsbCk7Y2xhc3MgQk17Y29uc3RydWN0b3IodCxlPSJVU0QiKXt0aGlzLl9sb2NhbGU9dCx0aGlzLl9kZWZhdWx0Q3VycmVuY3lDb2RlPWV9dHJhbnNmb3JtKHQsZT10aGlzLl9kZWZhdWx0Q3VycmVuY3lDb2RlLG49InN5bWJvbCIsbyxpKXtpZighVk0odCkpcmV0dXJuIG51bGw7aT1pfHx0aGlzLl9sb2NhbGUsImJvb2xlYW4iPT10eXBlb2YgbiYmKCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmY29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4oJ1dhcm5pbmc6IHRoZSBjdXJyZW5jeSBwaXBlIGhhcyBiZWVuIGNoYW5nZWQgaW4gQW5ndWxhciB2NS4gVGhlIHN5bWJvbERpc3BsYXkgb3B0aW9uICh0aGlyZCBwYXJhbWV0ZXIpIGlzIG5vdyBhIHN0cmluZyBpbnN0ZWFkIG9mIGEgYm9vbGVhbi4gVGhlIGFjY2VwdGVkIHZhbHVlcyBhcmUgImNvZGUiLCAic3ltYm9sIiBvciAic3ltYm9sLW5hcnJvdyIuJyksbj1uPyJzeW1ib2wiOiJjb2RlIik7bGV0IGE9ZXx8dGhpcy5fZGVmYXVsdEN1cnJlbmN5Q29kZTsiY29kZSIhPT1uJiYoYT0ic3ltYm9sIj09PW58fCJzeW1ib2wtbmFycm93Ij09PW4/KGZ1bmN0aW9uIHIodCxlLG49ImVuIil7Y29uc3Qgbz0oZnVuY3Rpb24gaSh0KXtyZXR1cm4gTHUodClbanUuQ3VycmVuY2llc119KShuKVt0XXx8cENbdF18fFtdLGE9b1sxXTtyZXR1cm4ibmFycm93Ij09PWUmJiJzdHJpbmciPT10eXBlb2YgYT9hOm9bMF18fHR9KShhLCJzeW1ib2wiPT09bj8id2lkZSI6Im5hcnJvdyIsaSk6bik7dHJ5e3JldHVybihmdW5jdGlvbiBuKHQsZSxvLGksYSl7Y29uc3Qgcj0kQyh4QyhlLG1DLkN1cnJlbmN5KSx2QyhlLGJDLk1pbnVzU2lnbikpO3JldHVybiByLm1pbkZyYWM9KGZ1bmN0aW9uIHModCl7bGV0IGU7Y29uc3Qgbj1wQ1t0XTtyZXR1cm4gbiYmKGU9blsyXSksIm51bWJlciI9PXR5cGVvZiBlP2U6Mn0pKGkpLHIubWF4RnJhYz1yLm1pbkZyYWMsSkModCxyLGUsYkMuQ3VycmVuY3lHcm91cCxiQy5DdXJyZW5jeURlY2ltYWwsYSkucmVwbGFjZSgiwqQiLG8pLnJlcGxhY2UoIsKkIiwiIikudHJpbSgpfSkoak0odCksaSxhLGUsbyl9Y2F0Y2godCl7dGhyb3cgeE0oQk0sdC5tZXNzYWdlKX19fWZ1bmN0aW9uIFZNKHQpe3JldHVybiEobnVsbD09dHx8IiI9PT10fHx0IT10KX1mdW5jdGlvbiBqTSh0KXtpZigic3RyaW5nIj09dHlwZW9mIHQmJiFpc05hTihOdW1iZXIodCktcGFyc2VGbG9hdCh0KSkpcmV0dXJuIE51bWJlcih0KTtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKGAke3R9IGlzIG5vdCBhIG51bWJlcmApO3JldHVybiB0fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9CTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8Qk0pKFNtKFd5LDE2KSxTbShZeSwxNikpfSxCTS7JtXBpcGU9Y28oe25hbWU6ImN1cnJlbmN5Iix0eXBlOkJNLHB1cmU6ITB9KSxCTS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltXeV19XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1l5XX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChCTSxbe3R5cGU6dnksYXJnczpbe25hbWU6ImN1cnJlbmN5In1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltXeV19XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1l5XX1dfV19KSxudWxsKTtjbGFzcyBVTXt0cmFuc2Zvcm0odCxlLG4pe2lmKG51bGw9PXQpcmV0dXJuIG51bGw7aWYoIXRoaXMuc3VwcG9ydHModCkpdGhyb3cgeE0oVU0sdCk7cmV0dXJuIHQuc2xpY2UoZSxuKX1zdXBwb3J0cyh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR8fEFycmF5LmlzQXJyYXkodCl9fVVNLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxVTSl9LFVNLsm1cGlwZT1jbyh7bmFtZToic2xpY2UiLHR5cGU6VU0scHVyZTohMX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoVU0sW3t0eXBlOnZ5LGFyZ3M6W3tuYW1lOiJzbGljZSIscHVyZTohMX1dfV0sbnVsbCxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IEdNPVt3TSxFTSxrTSx6TSxVTSxGTSxMTSxETSxCTSxSTSxUTSxOTSxJTV07Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIFdNe31XTS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8V00pfSxXTS7JtW1vZD1hbyh7dHlwZTpXTX0pLFdNLsm1aW5qPXZuKHtwcm92aWRlcnM6W3twcm92aWRlOmVNLHVzZUNsYXNzOm9NfV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFdNLFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOlt2TSxHTV0sZXhwb3J0czpbdk0sR01dLHByb3ZpZGVyczpbe3Byb3ZpZGU6ZU0sdXNlQ2xhc3M6b019XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFdNLHtkZWNsYXJhdGlvbnM6W2FNLHJNLGxNLGRNLE1NLENNLGZNLGdNLGhNLHlNLF9NLHdNLEVNLGtNLHpNLFVNLEZNLExNLERNLEJNLFJNLFRNLE5NLElNXSxleHBvcnRzOlthTSxyTSxsTSxkTSxNTSxDTSxmTSxnTSxoTSx5TSxfTSx3TSxFTSxrTSx6TSxVTSxGTSxMTSxETSxCTSxSTSxUTSxOTSxJTV19KSwKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCm5ldyBPZygiMTIuMi4xIik7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBZTXt9WU0uybVwcm92PU1uKHt0b2tlbjpZTSxwcm92aWRlZEluOiJyb290IixmYWN0b3J5OigpPT5uZXcgcU0odnIoWl8pLHdpbmRvdyl9KTtjbGFzcyBxTXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuZG9jdW1lbnQ9dCx0aGlzLndpbmRvdz1lLHRoaXMub2Zmc2V0PSgpPT5bMCwwXX1zZXRPZmZzZXQodCl7dGhpcy5vZmZzZXQ9QXJyYXkuaXNBcnJheSh0KT8oKT0+dDp0fWdldFNjcm9sbFBvc2l0aW9uKCl7cmV0dXJuIHRoaXMuc3VwcG9ydHNTY3JvbGxpbmcoKT9bdGhpcy53aW5kb3cucGFnZVhPZmZzZXQsdGhpcy53aW5kb3cucGFnZVlPZmZzZXRdOlswLDBdfXNjcm9sbFRvUG9zaXRpb24odCl7dGhpcy5zdXBwb3J0c1Njcm9sbGluZygpJiZ0aGlzLndpbmRvdy5zY3JvbGxUbyh0WzBdLHRbMV0pfXNjcm9sbFRvQW5jaG9yKHQpe2lmKCF0aGlzLnN1cHBvcnRzU2Nyb2xsaW5nKCkpcmV0dXJuO2NvbnN0IGU9KGZ1bmN0aW9uIG4odCxlKXtjb25zdCBuPXQuZ2V0RWxlbWVudEJ5SWQoZSl8fHQuZ2V0RWxlbWVudHNCeU5hbWUoZSlbMF07aWYobilyZXR1cm4gbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgdC5jcmVhdGVUcmVlV2Fsa2VyJiZ0LmJvZHkmJih0LmJvZHkuY3JlYXRlU2hhZG93Um9vdHx8dC5ib2R5LmF0dGFjaFNoYWRvdykpe2NvbnN0IG49dC5jcmVhdGVUcmVlV2Fsa2VyKHQuYm9keSxOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCk7bGV0IG89bi5jdXJyZW50Tm9kZTtmb3IoO287KXtjb25zdCB0PW8uc2hhZG93Um9vdDtpZih0KXtjb25zdCBuPXQuZ2V0RWxlbWVudEJ5SWQoZSl8fHQucXVlcnlTZWxlY3RvcihgW25hbWU9IiR7ZX0iXWApO2lmKG4pcmV0dXJuIG59bz1uLm5leHROb2RlKCl9fXJldHVybiBudWxsfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8pKHRoaXMuZG9jdW1lbnQsdCk7ZSYmKHRoaXMuc2Nyb2xsVG9FbGVtZW50KGUpLHRoaXMuYXR0ZW1wdEZvY3VzKGUpKX1zZXRIaXN0b3J5U2Nyb2xsUmVzdG9yYXRpb24odCl7aWYodGhpcy5zdXBwb3J0U2Nyb2xsUmVzdG9yYXRpb24oKSl7Y29uc3QgZT10aGlzLndpbmRvdy5oaXN0b3J5O2UmJmUuc2Nyb2xsUmVzdG9yYXRpb24mJihlLnNjcm9sbFJlc3RvcmF0aW9uPXQpfX1zY3JvbGxUb0VsZW1lbnQodCl7Y29uc3QgZT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49ZS5sZWZ0K3RoaXMud2luZG93LnBhZ2VYT2Zmc2V0LG89ZS50b3ArdGhpcy53aW5kb3cucGFnZVlPZmZzZXQsaT10aGlzLm9mZnNldCgpO3RoaXMud2luZG93LnNjcm9sbFRvKG4taVswXSxvLWlbMV0pfWF0dGVtcHRGb2N1cyh0KXtyZXR1cm4gdC5mb2N1cygpLHRoaXMuZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PXR9c3VwcG9ydFNjcm9sbFJlc3RvcmF0aW9uKCl7dHJ5e2lmKCF0aGlzLnN1cHBvcnRzU2Nyb2xsaW5nKCkpcmV0dXJuITE7Y29uc3QgdD1aTSh0aGlzLndpbmRvdy5oaXN0b3J5KXx8Wk0oT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMud2luZG93Lmhpc3RvcnkpKTtyZXR1cm4hKCF0fHwhdC53cml0YWJsZSYmIXQuc2V0KX1jYXRjaCh0KXtyZXR1cm4hMX19c3VwcG9ydHNTY3JvbGxpbmcoKXt0cnl7cmV0dXJuISF0aGlzLndpbmRvdyYmISF0aGlzLndpbmRvdy5zY3JvbGxUbyYmInBhZ2VYT2Zmc2V0ImluIHRoaXMud2luZG93fWNhdGNoKHQpe3JldHVybiExfX19ZnVuY3Rpb24gWk0odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwic2Nyb2xsUmVzdG9yYXRpb24iKX1jbGFzcyBYTXt9Ci8qKgogICAgICogQGxpY2Vuc2UgQW5ndWxhciB2MTIuMi4xCiAgICAgKiAoYykgMjAxMC0yMDIxIEdvb2dsZSBMTEMuIGh0dHBzOi8vYW5ndWxhci5pby8KICAgICAqIExpY2Vuc2U6IE1JVAogICAgICovCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgS00gZXh0ZW5kcyBjbGFzcyBleHRlbmRzIGNsYXNze317Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuc3VwcG9ydHNET01FdmVudHM9ITB9fXtzdGF0aWMgbWFrZUN1cnJlbnQoKXshKGZ1bmN0aW9uIHQoZSl7WV98fChZXz1lKX0pKG5ldyBLTSl9b25BbmRDYW5jZWwodCxlLG4pe3JldHVybiB0LmFkZEV2ZW50TGlzdGVuZXIoZSxuLCExKSwoKT0+e3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLG4sITEpfX1kaXNwYXRjaEV2ZW50KHQsZSl7dC5kaXNwYXRjaEV2ZW50KGUpfXJlbW92ZSh0KXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KX1jcmVhdGVFbGVtZW50KHQsZSl7cmV0dXJuKGU9ZXx8dGhpcy5nZXREZWZhdWx0RG9jdW1lbnQoKSkuY3JlYXRlRWxlbWVudCh0KX1jcmVhdGVIdG1sRG9jdW1lbnQoKXtyZXR1cm4gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCJmYWtlVGl0bGUiKX1nZXREZWZhdWx0RG9jdW1lbnQoKXtyZXR1cm4gZG9jdW1lbnR9aXNFbGVtZW50Tm9kZSh0KXtyZXR1cm4gdC5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFfWlzU2hhZG93Um9vdCh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnR9Z2V0R2xvYmFsRXZlbnRUYXJnZXQodCxlKXtyZXR1cm4id2luZG93Ij09PWU/d2luZG93OiJkb2N1bWVudCI9PT1lP3Q6ImJvZHkiPT09ZT90LmJvZHk6bnVsbH1nZXRCYXNlSHJlZih0KXtjb25zdCBlPShmdW5jdGlvbiBuKCl7cmV0dXJuIFFNPVFNfHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJiYXNlIiksUU0/UU0uZ2V0QXR0cmlidXRlKCJocmVmIik6bnVsbH0pKCk7cmV0dXJuIG51bGw9PWU/bnVsbDooZnVuY3Rpb24gbyh0KXtKTT1KTXx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpLEpNLnNldEF0dHJpYnV0ZSgiaHJlZiIsdCk7Y29uc3QgZT1KTS5wYXRobmFtZTtyZXR1cm4iLyI9PT1lLmNoYXJBdCgwKT9lOmAvJHtlfWB9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLykoZSl9cmVzZXRCYXNlRWxlbWVudCgpe1FNPW51bGx9Z2V0VXNlckFnZW50KCl7cmV0dXJuIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50fWdldENvb2tpZSh0KXtyZXR1cm4gaU0oZG9jdW1lbnQuY29va2llLHQpfX1sZXQgSk0sUU09bnVsbDtjb25zdCAkTT1uZXcgR2EoIlRSQU5TSVRJT05fSUQiKSx0dj1be3Byb3ZpZGU6enksdXNlRmFjdG9yeTpmdW5jdGlvbiBldih0LGUsbil7cmV0dXJuKCk9PntuLmdldChJeSkuZG9uZVByb21pc2UudGhlbigoKCk9Pntjb25zdCBuPXFfKCk7QXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGUucXVlcnlTZWxlY3RvckFsbCgic3R5bGVbbmctdHJhbnNpdGlvbl0iKSkuZmlsdGVyKChlPT5lLmdldEF0dHJpYnV0ZSgibmctdHJhbnNpdGlvbiIpPT09dCkpLmZvckVhY2goKHQ9Pm4ucmVtb3ZlKHQpKSl9KSl9fSxkZXBzOlskTSxaXyxycF0sbXVsdGk6ITB9XTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIG52e3N0YXRpYyBpbml0KCl7IShmdW5jdGlvbiB0KGUpe2dfPWV9KShuZXcgbnYpfWFkZFRvV2luZG93KHQpe2puLmdldEFuZ3VsYXJUZXN0YWJpbGl0eT0oZSxuPSEwKT0+e2NvbnN0IG89dC5maW5kVGVzdGFiaWxpdHlJblRyZWUoZSxuKTtpZihudWxsPT1vKXRocm93IG5ldyBFcnJvcigiQ291bGQgbm90IGZpbmQgdGVzdGFiaWxpdHkgZm9yIGVsZW1lbnQuIik7cmV0dXJuIG99LGpuLmdldEFsbEFuZ3VsYXJUZXN0YWJpbGl0aWVzPSgpPT50LmdldEFsbFRlc3RhYmlsaXRpZXMoKSxqbi5nZXRBbGxBbmd1bGFyUm9vdEVsZW1lbnRzPSgpPT50LmdldEFsbFJvb3RFbGVtZW50cygpLGpuLmZyYW1ld29ya1N0YWJpbGl6ZXJzfHwoam4uZnJhbWV3b3JrU3RhYmlsaXplcnM9W10pLGpuLmZyYW1ld29ya1N0YWJpbGl6ZXJzLnB1c2goKHQ9Pntjb25zdCBlPWpuLmdldEFsbEFuZ3VsYXJUZXN0YWJpbGl0aWVzKCk7bGV0IG49ZS5sZW5ndGgsbz0hMTtjb25zdCBpPWZ1bmN0aW9uKGUpe289b3x8ZSxuLS0sMD09biYmdChvKX07ZS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LndoZW5TdGFibGUoaSl9KSl9KSl9ZmluZFRlc3RhYmlsaXR5SW5UcmVlKHQsZSxuKXtpZihudWxsPT1lKXJldHVybiBudWxsO2NvbnN0IG89dC5nZXRUZXN0YWJpbGl0eShlKTtyZXR1cm4gbnVsbCE9bz9vOm4/cV8oKS5pc1NoYWRvd1Jvb3QoZSk/dGhpcy5maW5kVGVzdGFiaWxpdHlJblRyZWUodCxlLmhvc3QsITApOnRoaXMuZmluZFRlc3RhYmlsaXR5SW5UcmVlKHQsZS5wYXJlbnRFbGVtZW50LCEwKTpudWxsfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3Mgb3Z7YnVpbGQoKXtyZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0fX1vdi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8b3YpfSxvdi7JtXByb3Y9TW4oe3Rva2VuOm92LGZhY3Rvcnk6b3YuybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKG92LFt7dHlwZTppbX1dLG51bGwsbnVsbCksbmV3IFNyO2NvbnN0IGl2PW5ldyBHYSgiRXZlbnRNYW5hZ2VyUGx1Z2lucyIpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBhdntjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX3pvbmU9ZSx0aGlzLl9ldmVudE5hbWVUb1BsdWdpbj1uZXcgTWFwLHQuZm9yRWFjaCgodD0+dC5tYW5hZ2VyPXRoaXMpKSx0aGlzLl9wbHVnaW5zPXQuc2xpY2UoKS5yZXZlcnNlKCl9YWRkRXZlbnRMaXN0ZW5lcih0LGUsbil7cmV0dXJuIHRoaXMuX2ZpbmRQbHVnaW5Gb3IoZSkuYWRkRXZlbnRMaXN0ZW5lcih0LGUsbil9YWRkR2xvYmFsRXZlbnRMaXN0ZW5lcih0LGUsbil7cmV0dXJuIHRoaXMuX2ZpbmRQbHVnaW5Gb3IoZSkuYWRkR2xvYmFsRXZlbnRMaXN0ZW5lcih0LGUsbil9Z2V0Wm9uZSgpe3JldHVybiB0aGlzLl96b25lfV9maW5kUGx1Z2luRm9yKHQpe2NvbnN0IGU9dGhpcy5fZXZlbnROYW1lVG9QbHVnaW4uZ2V0KHQpO2lmKGUpcmV0dXJuIGU7Y29uc3Qgbj10aGlzLl9wbHVnaW5zO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSsrKXtjb25zdCBvPW5bZV07aWYoby5zdXBwb3J0cyh0KSlyZXR1cm4gdGhpcy5fZXZlbnROYW1lVG9QbHVnaW4uc2V0KHQsbyksb310aHJvdyBuZXcgRXJyb3IoYE5vIGV2ZW50IG1hbmFnZXIgcGx1Z2luIGZvdW5kIGZvciBldmVudCAke3R9YCl9fWF2Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxhdikodnIoaXYpLHZyKGFfKSl9LGF2Lsm1cHJvdj1Nbih7dG9rZW46YXYsZmFjdG9yeTphdi7JtWZhY30pLGF2LmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbaXZdfV19LHt0eXBlOmFffV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChhdixbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbaXZdfV19LHt0eXBlOmFffV19KSxudWxsKTtjbGFzcyBydntjb25zdHJ1Y3Rvcih0KXt0aGlzLl9kb2M9dH1hZGRHbG9iYWxFdmVudExpc3RlbmVyKHQsZSxuKXtjb25zdCBvPXFfKCkuZ2V0R2xvYmFsRXZlbnRUYXJnZXQodGhpcy5fZG9jLHQpO2lmKCFvKXRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZXZlbnQgdGFyZ2V0ICR7b30gZm9yIGV2ZW50ICR7ZX1gKTtyZXR1cm4gdGhpcy5hZGRFdmVudExpc3RlbmVyKG8sZSxuKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIHN2e2NvbnN0cnVjdG9yKCl7dGhpcy5fc3R5bGVzU2V0PW5ldyBTZXR9YWRkU3R5bGVzKHQpe2NvbnN0IGU9bmV3IFNldDt0LmZvckVhY2goKHQ9Pnt0aGlzLl9zdHlsZXNTZXQuaGFzKHQpfHwodGhpcy5fc3R5bGVzU2V0LmFkZCh0KSxlLmFkZCh0KSl9KSksdGhpcy5vblN0eWxlc0FkZGVkKGUpfW9uU3R5bGVzQWRkZWQodCl7fWdldEFsbFN0eWxlcygpe3JldHVybiBBcnJheS5mcm9tKHRoaXMuX3N0eWxlc1NldCl9fXN2Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxzdil9LHN2Lsm1cHJvdj1Nbih7dG9rZW46c3YsZmFjdG9yeTpzdi7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoc3YsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW119KSxudWxsKTtjbGFzcyBsdiBleHRlbmRzIHN2e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5fZG9jPXQsdGhpcy5faG9zdE5vZGVzPW5ldyBNYXAsdGhpcy5faG9zdE5vZGVzLnNldCh0LmhlYWQsW10pfV9hZGRTdHlsZXNUb0hvc3QodCxlLG4pe3QuZm9yRWFjaCgodD0+e2NvbnN0IG89dGhpcy5fZG9jLmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7by50ZXh0Q29udGVudD10LG4ucHVzaChlLmFwcGVuZENoaWxkKG8pKX0pKX1hZGRIb3N0KHQpe2NvbnN0IGU9W107dGhpcy5fYWRkU3R5bGVzVG9Ib3N0KHRoaXMuX3N0eWxlc1NldCx0LGUpLHRoaXMuX2hvc3ROb2Rlcy5zZXQodCxlKX1yZW1vdmVIb3N0KHQpe2NvbnN0IGU9dGhpcy5faG9zdE5vZGVzLmdldCh0KTtlJiZlLmZvckVhY2goY3YpLHRoaXMuX2hvc3ROb2Rlcy5kZWxldGUodCl9b25TdHlsZXNBZGRlZCh0KXt0aGlzLl9ob3N0Tm9kZXMuZm9yRWFjaCgoKGUsbik9Pnt0aGlzLl9hZGRTdHlsZXNUb0hvc3QodCxuLGUpfSkpfW5nT25EZXN0cm95KCl7dGhpcy5faG9zdE5vZGVzLmZvckVhY2goKHQ9PnQuZm9yRWFjaChjdikpKX19ZnVuY3Rpb24gY3YodCl7cV8oKS5yZW1vdmUodCl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2x2Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxsdikodnIoWl8pKX0sbHYuybVwcm92PU1uKHt0b2tlbjpsdixmYWN0b3J5Omx2Lsm1ZmFjfSksbHYuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGx2LFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XX0pLG51bGwpO2NvbnN0IGR2PXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifSxwdj0vJUNPTVAlL2csbXY9InVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fCEhbmdEZXZNb2RlO2Z1bmN0aW9uIHV2KHQsZSxuKXtmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rKyl7bGV0IGk9ZVtvXTtBcnJheS5pc0FycmF5KGkpP3V2KHQsaSxuKTooaT1pLnJlcGxhY2UocHYsdCksbi5wdXNoKGkpKX1yZXR1cm4gbn1mdW5jdGlvbiBmdih0KXtyZXR1cm4gZT0+e2lmKCJfX25nVW53cmFwX18iPT09ZSlyZXR1cm4gdDshMT09PXQoZSkmJihlLnByZXZlbnREZWZhdWx0KCksZS5yZXR1cm5WYWx1ZT0hMSl9fWxldCBndj0hMTtjbGFzcyBodntjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5ldmVudE1hbmFnZXI9dCx0aGlzLnNoYXJlZFN0eWxlc0hvc3Q9ZSx0aGlzLmFwcElkPW4sdGhpcy5yZW5kZXJlckJ5Q29tcElkPW5ldyBNYXAsdGhpcy5kZWZhdWx0UmVuZGVyZXI9bmV3IGJ2KHQpfWNyZWF0ZVJlbmRlcmVyKHQsZSl7aWYoIXR8fCFlKXJldHVybiB0aGlzLmRlZmF1bHRSZW5kZXJlcjtzd2l0Y2goZS5lbmNhcHN1bGF0aW9uKXtjYXNlIEhuLkVtdWxhdGVkOntsZXQgbj10aGlzLnJlbmRlcmVyQnlDb21wSWQuZ2V0KGUuaWQpO3JldHVybiBufHwobj1uZXcgQ3YodGhpcy5ldmVudE1hbmFnZXIsdGhpcy5zaGFyZWRTdHlsZXNIb3N0LGUsdGhpcy5hcHBJZCksdGhpcy5yZW5kZXJlckJ5Q29tcElkLnNldChlLmlkLG4pKSxuLmFwcGx5VG9Ib3N0KHQpLG59Y2FzZSAxOmNhc2UgSG4uU2hhZG93RG9tOnJldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgbmdEZXZNb2RlJiYhbmdEZXZNb2RlfHxndnx8MSE9PWUuZW5jYXBzdWxhdGlvbnx8KGd2PSEwLGNvbnNvbGUud2FybigiVmlld0VuY2Fwc3VsYXRpb24uTmF0aXZlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIEZhbGxpbmcgYmFjayB0byBWaWV3RW5jYXBzdWxhdGlvbi5TaGFkb3dEb20uIFRoZSBmYWxsYmFjayB3aWxsIGJlIHJlbW92ZWQgaW4gdjEyLiIpKSxuZXcgTXYodGhpcy5ldmVudE1hbmFnZXIsdGhpcy5zaGFyZWRTdHlsZXNIb3N0LHQsZSk7ZGVmYXVsdDppZighdGhpcy5yZW5kZXJlckJ5Q29tcElkLmhhcyhlLmlkKSl7Y29uc3QgdD11dihlLmlkLGUuc3R5bGVzLFtdKTt0aGlzLnNoYXJlZFN0eWxlc0hvc3QuYWRkU3R5bGVzKHQpLHRoaXMucmVuZGVyZXJCeUNvbXBJZC5zZXQoZS5pZCx0aGlzLmRlZmF1bHRSZW5kZXJlcil9cmV0dXJuIHRoaXMuZGVmYXVsdFJlbmRlcmVyfX1iZWdpbigpe31lbmQoKXt9fWh2Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxodikodnIoYXYpLHZyKGx2KSx2cihIeSkpfSxodi7JtXByb3Y9TW4oe3Rva2VuOmh2LGZhY3Rvcnk6aHYuybVmYWN9KSxodi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmF2fSx7dHlwZTpsdn0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W0h5XX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChodixbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6YXZ9LHt0eXBlOmx2fSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbSHldfV19XX0pLG51bGwpO2NsYXNzIGJ2e2NvbnN0cnVjdG9yKHQpe3RoaXMuZXZlbnRNYW5hZ2VyPXQsdGhpcy5kYXRhPU9iamVjdC5jcmVhdGUobnVsbCl9ZGVzdHJveSgpe31jcmVhdGVFbGVtZW50KHQsZSl7cmV0dXJuIGU/ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGR2W2VdfHxlLHQpOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodCl9Y3JlYXRlQ29tbWVudCh0KXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCh0KX1jcmVhdGVUZXh0KHQpe3JldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0KX1hcHBlbmRDaGlsZCh0LGUpe3QuYXBwZW5kQ2hpbGQoZSl9aW5zZXJ0QmVmb3JlKHQsZSxuKXt0JiZ0Lmluc2VydEJlZm9yZShlLG4pfXJlbW92ZUNoaWxkKHQsZSl7dCYmdC5yZW1vdmVDaGlsZChlKX1zZWxlY3RSb290RWxlbWVudCh0LGUpe2xldCBuPSJzdHJpbmciPT10eXBlb2YgdD9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQpOnQ7aWYoIW4pdGhyb3cgbmV3IEVycm9yKGBUaGUgc2VsZWN0b3IgIiR7dH0iIGRpZCBub3QgbWF0Y2ggYW55IGVsZW1lbnRzYCk7cmV0dXJuIGV8fChuLnRleHRDb250ZW50PSIiKSxufXBhcmVudE5vZGUodCl7cmV0dXJuIHQucGFyZW50Tm9kZX1uZXh0U2libGluZyh0KXtyZXR1cm4gdC5uZXh0U2libGluZ31zZXRBdHRyaWJ1dGUodCxlLG4sbyl7aWYobyl7ZT1vKyI6IitlO2NvbnN0IGk9ZHZbb107aT90LnNldEF0dHJpYnV0ZU5TKGksZSxuKTp0LnNldEF0dHJpYnV0ZShlLG4pfWVsc2UgdC5zZXRBdHRyaWJ1dGUoZSxuKX1yZW1vdmVBdHRyaWJ1dGUodCxlLG4pe2lmKG4pe2NvbnN0IG89ZHZbbl07bz90LnJlbW92ZUF0dHJpYnV0ZU5TKG8sZSk6dC5yZW1vdmVBdHRyaWJ1dGUoYCR7bn06JHtlfWApfWVsc2UgdC5yZW1vdmVBdHRyaWJ1dGUoZSl9YWRkQ2xhc3ModCxlKXt0LmNsYXNzTGlzdC5hZGQoZSl9cmVtb3ZlQ2xhc3ModCxlKXt0LmNsYXNzTGlzdC5yZW1vdmUoZSl9c2V0U3R5bGUodCxlLG4sbyl7byYoY2wuRGFzaENhc2V8Y2wuSW1wb3J0YW50KT90LnN0eWxlLnNldFByb3BlcnR5KGUsbixvJmNsLkltcG9ydGFudD8iaW1wb3J0YW50IjoiIik6dC5zdHlsZVtlXT1ufXJlbW92ZVN0eWxlKHQsZSxuKXtuJmNsLkRhc2hDYXNlP3Quc3R5bGUucmVtb3ZlUHJvcGVydHkoZSk6dC5zdHlsZVtlXT0iIn1zZXRQcm9wZXJ0eSh0LGUsbil7bXYmJl92KGUsInByb3BlcnR5IiksdFtlXT1ufXNldFZhbHVlKHQsZSl7dC5ub2RlVmFsdWU9ZX1saXN0ZW4odCxlLG4pe3JldHVybiBtdiYmX3YoZSwibGlzdGVuZXIiKSwic3RyaW5nIj09dHlwZW9mIHQ/dGhpcy5ldmVudE1hbmFnZXIuYWRkR2xvYmFsRXZlbnRMaXN0ZW5lcih0LGUsZnYobikpOnRoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIodCxlLGZ2KG4pKX19Y29uc3QgeXY9IkAiLmNoYXJDb2RlQXQoMCk7ZnVuY3Rpb24gX3YodCxlKXtpZih0LmNoYXJDb2RlQXQoMCk9PT15dil0aHJvdyBuZXcgRXJyb3IoYEZvdW5kIHRoZSBzeW50aGV0aWMgJHtlfSAke3R9LiBQbGVhc2UgaW5jbHVkZSBlaXRoZXIgIkJyb3dzZXJBbmltYXRpb25zTW9kdWxlIiBvciAiTm9vcEFuaW1hdGlvbnNNb2R1bGUiIGluIHlvdXIgYXBwbGljYXRpb24uYCl9Y2xhc3MgQ3YgZXh0ZW5kcyBidntjb25zdHJ1Y3Rvcih0LGUsbixvKXtzdXBlcih0KSx0aGlzLmNvbXBvbmVudD1uO2NvbnN0IGk9dXYobysiLSIrbi5pZCxuLnN0eWxlcyxbXSk7ZS5hZGRTdHlsZXMoaSksdGhpcy5jb250ZW50QXR0cj0oZnVuY3Rpb24gYSh0KXtyZXR1cm4iX25nY29udGVudC0lQ09NUCUiLnJlcGxhY2UocHYsdCl9KShvKyItIituLmlkKSx0aGlzLmhvc3RBdHRyPShmdW5jdGlvbiByKHQpe3JldHVybiJfbmdob3N0LSVDT01QJSIucmVwbGFjZShwdix0KX0pKG8rIi0iK24uaWQpfWFwcGx5VG9Ib3N0KHQpe3N1cGVyLnNldEF0dHJpYnV0ZSh0LHRoaXMuaG9zdEF0dHIsIiIpfWNyZWF0ZUVsZW1lbnQodCxlKXtjb25zdCBuPXN1cGVyLmNyZWF0ZUVsZW1lbnQodCxlKTtyZXR1cm4gc3VwZXIuc2V0QXR0cmlidXRlKG4sdGhpcy5jb250ZW50QXR0ciwiIiksbn19Y2xhc3MgTXYgZXh0ZW5kcyBidntjb25zdHJ1Y3Rvcih0LGUsbixvKXtzdXBlcih0KSx0aGlzLnNoYXJlZFN0eWxlc0hvc3Q9ZSx0aGlzLmhvc3RFbD1uLHRoaXMuc2hhZG93Um9vdD1uLmF0dGFjaFNoYWRvdyh7bW9kZToib3BlbiJ9KSx0aGlzLnNoYXJlZFN0eWxlc0hvc3QuYWRkSG9zdCh0aGlzLnNoYWRvd1Jvb3QpO2NvbnN0IGk9dXYoby5pZCxvLnN0eWxlcyxbXSk7Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0Kyspe2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtlLnRleHRDb250ZW50PWlbdF0sdGhpcy5zaGFkb3dSb290LmFwcGVuZENoaWxkKGUpfX1ub2RlT3JTaGFkb3dSb290KHQpe3JldHVybiB0PT09dGhpcy5ob3N0RWw/dGhpcy5zaGFkb3dSb290OnR9ZGVzdHJveSgpe3RoaXMuc2hhcmVkU3R5bGVzSG9zdC5yZW1vdmVIb3N0KHRoaXMuc2hhZG93Um9vdCl9YXBwZW5kQ2hpbGQodCxlKXtyZXR1cm4gc3VwZXIuYXBwZW5kQ2hpbGQodGhpcy5ub2RlT3JTaGFkb3dSb290KHQpLGUpfWluc2VydEJlZm9yZSh0LGUsbil7cmV0dXJuIHN1cGVyLmluc2VydEJlZm9yZSh0aGlzLm5vZGVPclNoYWRvd1Jvb3QodCksZSxuKX1yZW1vdmVDaGlsZCh0LGUpe3JldHVybiBzdXBlci5yZW1vdmVDaGlsZCh0aGlzLm5vZGVPclNoYWRvd1Jvb3QodCksZSl9cGFyZW50Tm9kZSh0KXtyZXR1cm4gdGhpcy5ub2RlT3JTaGFkb3dSb290KHN1cGVyLnBhcmVudE5vZGUodGhpcy5ub2RlT3JTaGFkb3dSb290KHQpKSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyB2diBleHRlbmRzIHJ2e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfXN1cHBvcnRzKHQpe3JldHVybiEwfWFkZEV2ZW50TGlzdGVuZXIodCxlLG4pe3JldHVybiB0LmFkZEV2ZW50TGlzdGVuZXIoZSxuLCExKSwoKT0+dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHQsZSxuKX1yZW1vdmVFdmVudExpc3RlbmVyKHQsZSxuKXtyZXR1cm4gdC5yZW1vdmVFdmVudExpc3RlbmVyKGUsbil9fXZ2Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx2dikodnIoWl8pKX0sdnYuybVwcm92PU1uKHt0b2tlbjp2dixmYWN0b3J5OnZ2Lsm1ZmFjfSksdnYuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHZ2LFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgeHY9e3BhbjohMCxwYW5zdGFydDohMCxwYW5tb3ZlOiEwLHBhbmVuZDohMCxwYW5jYW5jZWw6ITAscGFubGVmdDohMCxwYW5yaWdodDohMCxwYW51cDohMCxwYW5kb3duOiEwLHBpbmNoOiEwLHBpbmNoc3RhcnQ6ITAscGluY2htb3ZlOiEwLHBpbmNoZW5kOiEwLHBpbmNoY2FuY2VsOiEwLHBpbmNoaW46ITAscGluY2hvdXQ6ITAscHJlc3M6ITAscHJlc3N1cDohMCxyb3RhdGU6ITAscm90YXRlc3RhcnQ6ITAscm90YXRlbW92ZTohMCxyb3RhdGVlbmQ6ITAscm90YXRlY2FuY2VsOiEwLHN3aXBlOiEwLHN3aXBlbGVmdDohMCxzd2lwZXJpZ2h0OiEwLHN3aXBldXA6ITAsc3dpcGVkb3duOiEwLHRhcDohMCxkb3VibGV0YXA6ITB9LE92PW5ldyBHYSgiSGFtbWVyR2VzdHVyZUNvbmZpZyIpLFB2PW5ldyBHYSgiSGFtbWVyTG9hZGVyIik7Y2xhc3Mgd3Z7Y29uc3RydWN0b3IoKXt0aGlzLmV2ZW50cz1bXSx0aGlzLm92ZXJyaWRlcz17fX1idWlsZEhhbW1lcih0KXtjb25zdCBlPW5ldyBIYW1tZXIodCx0aGlzLm9wdGlvbnMpO2UuZ2V0KCJwaW5jaCIpLnNldCh7ZW5hYmxlOiEwfSksZS5nZXQoInJvdGF0ZSIpLnNldCh7ZW5hYmxlOiEwfSk7Zm9yKGNvbnN0IHQgaW4gdGhpcy5vdmVycmlkZXMpZS5nZXQodCkuc2V0KHRoaXMub3ZlcnJpZGVzW3RdKTtyZXR1cm4gZX19d3YuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHd2KX0sd3YuybVwcm92PU1uKHt0b2tlbjp3dixmYWN0b3J5Ond2Lsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh3dixbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5bXX0pLG51bGwpO2NsYXNzIGt2IGV4dGVuZHMgcnZ7Y29uc3RydWN0b3IodCxlLG4sbyl7c3VwZXIodCksdGhpcy5fY29uZmlnPWUsdGhpcy5jb25zb2xlPW4sdGhpcy5sb2FkZXI9byx0aGlzLl9sb2FkZXJQcm9taXNlPW51bGx9c3VwcG9ydHModCl7cmV0dXJuISgheHYuaGFzT3duUHJvcGVydHkodC50b0xvd2VyQ2FzZSgpKSYmIXRoaXMuaXNDdXN0b21FdmVudCh0KXx8IXdpbmRvdy5IYW1tZXImJiF0aGlzLmxvYWRlciYmKCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmdGhpcy5jb25zb2xlLndhcm4oYFRoZSAiJHt0fSIgZXZlbnQgY2Fubm90IGJlIGJvdW5kIGJlY2F1c2UgSGFtbWVyLkpTIGlzIG5vdCBsb2FkZWQgYW5kIG5vIGN1c3RvbSBsb2FkZXIgaGFzIGJlZW4gc3BlY2lmaWVkLmApLDEpKX1hZGRFdmVudExpc3RlbmVyKHQsZSxuKXtjb25zdCBvPXRoaXMubWFuYWdlci5nZXRab25lKCk7aWYoZT1lLnRvTG93ZXJDYXNlKCksIXdpbmRvdy5IYW1tZXImJnRoaXMubG9hZGVyKXt0aGlzLl9sb2FkZXJQcm9taXNlPXRoaXMuX2xvYWRlclByb21pc2V8fHRoaXMubG9hZGVyKCk7bGV0IG89ITEsaT0oKT0+e289ITB9O3JldHVybiB0aGlzLl9sb2FkZXJQcm9taXNlLnRoZW4oKCgpPT57aWYoIXdpbmRvdy5IYW1tZXIpcmV0dXJuKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZ0aGlzLmNvbnNvbGUud2FybigiVGhlIGN1c3RvbSBIQU1NRVJfTE9BREVSIGNvbXBsZXRlZCwgYnV0IEhhbW1lci5KUyBpcyBub3QgcHJlc2VudC4iKSx2b2lkKGk9KCk9Pnt9KTtvfHwoaT10aGlzLmFkZEV2ZW50TGlzdGVuZXIodCxlLG4pKX0pKS5jYXRjaCgoKCk9PnsoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJnRoaXMuY29uc29sZS53YXJuKGBUaGUgIiR7ZX0iIGV2ZW50IGNhbm5vdCBiZSBib3VuZCBiZWNhdXNlIHRoZSBjdXN0b20gSGFtbWVyLkpTIGxvYWRlciBmYWlsZWQuYCksaT0oKT0+e319KSksKCk9PntpKCl9fXJldHVybiBvLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e2NvbnN0IGk9dGhpcy5fY29uZmlnLmJ1aWxkSGFtbWVyKHQpLGE9ZnVuY3Rpb24odCl7by5ydW5HdWFyZGVkKChmdW5jdGlvbigpe24odCl9KSl9O3JldHVybiBpLm9uKGUsYSksKCk9PntpLm9mZihlLGEpLCJmdW5jdGlvbiI9PXR5cGVvZiBpLmRlc3Ryb3kmJmkuZGVzdHJveSgpfX0pKX1pc0N1c3RvbUV2ZW50KHQpe3JldHVybiB0aGlzLl9jb25maWcuZXZlbnRzLmluZGV4T2YodCk+LTF9fWt2Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxrdikodnIoWl8pLHZyKE92KSx2cihHeSksdnIoUHYsOCkpfSxrdi7JtXByb3Y9TW4oe3Rva2VuOmt2LGZhY3Rvcnk6a3YuybVmYWN9KSxrdi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6d3YsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbT3ZdfV19LHt0eXBlOkd5fSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1B2XX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChrdixbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTp3dixkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltPdl19XX0se3R5cGU6R3l9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbUHZdfV19XX0pLG51bGwpO2NvbnN0IFN2PVt7cHJvdmlkZTppdix1c2VDbGFzczprdixtdWx0aTohMCxkZXBzOltaXyxPdixHeSxbbmV3IFNyLFB2XV19LHtwcm92aWRlOk92LHVzZUNsYXNzOnd2LGRlcHM6W119XTtjbGFzcyBEdnt9RHYuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fER2KX0sRHYuybVtb2Q9YW8oe3R5cGU6RHZ9KSxEdi7JtWluaj12bih7cHJvdmlkZXJzOlN2fSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChEdixbe3R5cGU6QXksYXJnczpbe3Byb3ZpZGVyczpTdn1dfV0sbnVsbCxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IEV2PVsiYWx0IiwiY29udHJvbCIsIm1ldGEiLCJzaGlmdCJdLFJ2PXsiXGIiOiJCYWNrc3BhY2UiLCJcdCI6IlRhYiIsIn8iOiJEZWxldGUiLCIbIjoiRXNjYXBlIixEZWw6IkRlbGV0ZSIsRXNjOiJFc2NhcGUiLExlZnQ6IkFycm93TGVmdCIsUmlnaHQ6IkFycm93UmlnaHQiLFVwOiJBcnJvd1VwIixEb3duOiJBcnJvd0Rvd24iLE1lbnU6IkNvbnRleHRNZW51IixTY3JvbGw6IlNjcm9sbExvY2siLFdpbjoiT1MifSxBdj17QToiMSIsQjoiMiIsQzoiMyIsRDoiNCIsRToiNSIsRjoiNiIsRzoiNyIsSDoiOCIsSToiOSIsSjoiKiIsSzoiKyIsTToiLSIsTjoiLiIsTzoiLyIsImAiOiIwIiwiwpAiOiJOdW1Mb2NrIn0sVHY9e2FsdDp0PT50LmFsdEtleSxjb250cm9sOnQ9PnQuY3RybEtleSxtZXRhOnQ9PnQubWV0YUtleSxzaGlmdDp0PT50LnNoaWZ0S2V5fTtjbGFzcyBOdiBleHRlbmRzIHJ2e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfXN1cHBvcnRzKHQpe3JldHVybiBudWxsIT1Odi5wYXJzZUV2ZW50TmFtZSh0KX1hZGRFdmVudExpc3RlbmVyKHQsZSxuKXtjb25zdCBvPU52LnBhcnNlRXZlbnROYW1lKGUpLGk9TnYuZXZlbnRDYWxsYmFjayhvLmZ1bGxLZXksbix0aGlzLm1hbmFnZXIuZ2V0Wm9uZSgpKTtyZXR1cm4gdGhpcy5tYW5hZ2VyLmdldFpvbmUoKS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PnFfKCkub25BbmRDYW5jZWwodCxvLmRvbUV2ZW50TmFtZSxpKSkpfXN0YXRpYyBwYXJzZUV2ZW50TmFtZSh0KXtjb25zdCBlPXQudG9Mb3dlckNhc2UoKS5zcGxpdCgiLiIpLG49ZS5zaGlmdCgpO2lmKDA9PT1lLmxlbmd0aHx8ImtleWRvd24iIT09biYmImtleXVwIiE9PW4pcmV0dXJuIG51bGw7Y29uc3Qgbz1Odi5fbm9ybWFsaXplS2V5KGUucG9wKCkpO2xldCBpPSIiO2lmKEV2LmZvckVhY2goKHQ9Pntjb25zdCBuPWUuaW5kZXhPZih0KTtuPi0xJiYoZS5zcGxpY2UobiwxKSxpKz10KyIuIil9KSksaSs9bywwIT1lLmxlbmd0aHx8MD09PW8ubGVuZ3RoKXJldHVybiBudWxsO2NvbnN0IGE9e307cmV0dXJuIGEuZG9tRXZlbnROYW1lPW4sYS5mdWxsS2V5PWksYX1zdGF0aWMgZ2V0RXZlbnRGdWxsS2V5KHQpe2xldCBlPSIiLG49KGZ1bmN0aW9uIG8odCl7bGV0IGU9dC5rZXk7aWYobnVsbD09ZSl7aWYoZT10LmtleUlkZW50aWZpZXIsbnVsbD09ZSlyZXR1cm4iVW5pZGVudGlmaWVkIjtlLnN0YXJ0c1dpdGgoIlUrIikmJihlPVN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoZS5zdWJzdHJpbmcoMiksMTYpKSwzPT09dC5sb2NhdGlvbiYmQXYuaGFzT3duUHJvcGVydHkoZSkmJihlPUF2W2VdKSl9cmV0dXJuIFJ2W2VdfHxlfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8pKHQpO3JldHVybiBuPW4udG9Mb3dlckNhc2UoKSwiICI9PT1uP249InNwYWNlIjoiLiI9PT1uJiYobj0iZG90IiksRXYuZm9yRWFjaCgobz0+e28hPW4mJigwLFR2W29dKSh0KSYmKGUrPW8rIi4iKX0pKSxlKz1uLGV9c3RhdGljIGV2ZW50Q2FsbGJhY2sodCxlLG4pe3JldHVybiBvPT57TnYuZ2V0RXZlbnRGdWxsS2V5KG8pPT09dCYmbi5ydW5HdWFyZGVkKCgoKT0+ZShvKSkpfX1zdGF0aWMgX25vcm1hbGl6ZUtleSh0KXtzd2l0Y2godCl7Y2FzZSJlc2MiOnJldHVybiJlc2NhcGUiO2RlZmF1bHQ6cmV0dXJuIHR9fX1Odi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8TnYpKHZyKFpfKSl9LE52Lsm1cHJvdj1Nbih7dG9rZW46TnYsZmFjdG9yeTpOdi7JtWZhY30pLE52LmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChOdixbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV19KSxudWxsKTtjbGFzcyB6dnt9ZnVuY3Rpb24gSXYodCl7cmV0dXJuIG5ldyBIdih0LmdldChaXykpfXp2Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx6dil9LHp2Lsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIHZyKEh2KX0sdG9rZW46enYscHJvdmlkZWRJbjoicm9vdCJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHp2LFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCIsdXNlRXhpc3Rpbmc6cWUoKCgpPT5IdikpfV19XSxudWxsLG51bGwpO2NsYXNzIEh2IGV4dGVuZHMgenZ7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLl9kb2M9dH1zYW5pdGl6ZSh0LGUpe2lmKG51bGw9PWUpcmV0dXJuIG51bGw7c3dpdGNoKHQpe2Nhc2UgQXMuTk9ORTpyZXR1cm4gZTtjYXNlIEFzLkhUTUw6cmV0dXJuIGVzKGUsIkhUTUwiKT90cyhlKTpFcyh0aGlzLl9kb2MsU3RyaW5nKGUpKS50b1N0cmluZygpO2Nhc2UgQXMuU1RZTEU6cmV0dXJuIGVzKGUsIlN0eWxlIik/dHMoZSk6ZTtjYXNlIEFzLlNDUklQVDppZihlcyhlLCJTY3JpcHQiKSlyZXR1cm4gdHMoZSk7dGhyb3cgbmV3IEVycm9yKCJ1bnNhZmUgdmFsdWUgdXNlZCBpbiBhIHNjcmlwdCBjb250ZXh0Iik7Y2FzZSBBcy5VUkw6cmV0dXJuIG5zKGUpLGVzKGUsIlVSTCIpP3RzKGUpOmxzKFN0cmluZyhlKSk7Y2FzZSBBcy5SRVNPVVJDRV9VUkw6aWYoZXMoZSwiUmVzb3VyY2VVUkwiKSlyZXR1cm4gdHMoZSk7dGhyb3cgbmV3IEVycm9yKCJ1bnNhZmUgdmFsdWUgdXNlZCBpbiBhIHJlc291cmNlIFVSTCBjb250ZXh0IChzZWUgaHR0cHM6Ly9nLmNvL25nL3NlY3VyaXR5I3hzcykiKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBTZWN1cml0eUNvbnRleHQgJHt0fSAoc2VlIGh0dHBzOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpYCl9fWJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKHQpe3JldHVybihmdW5jdGlvbiBlKHQpe3JldHVybiBuZXcgWHIodCl9KSh0KX1ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUodCl7cmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyBLcih0KX0pKHQpfWJ5cGFzc1NlY3VyaXR5VHJ1c3RTY3JpcHQodCl7cmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyBKcih0KX0pKHQpfWJ5cGFzc1NlY3VyaXR5VHJ1c3RVcmwodCl7cmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyBRcih0KX0pKHQpfWJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCh0KXtyZXR1cm4oZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3ICRyKHQpfSkodCl9fUh2Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxIdikodnIoWl8pKX0sSHYuybVwcm92PU1uKHtmYWN0b3J5OmZ1bmN0aW9uIHQoKXtyZXR1cm4gSXYodnIoR2QpKX0sdG9rZW46SHYscHJvdmlkZWRJbjoicm9vdCJ9KSxIdi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoSHYsW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOiJyb290Iix1c2VGYWN0b3J5Okl2LGRlcHM6W3JwXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSksbnVsbCk7Y29uc3QgRnY9Q18oUl8sImJyb3dzZXIiLFt7cHJvdmlkZTpqeSx1c2VWYWx1ZToiYnJvd3NlciJ9LHtwcm92aWRlOlZ5LHVzZVZhbHVlOgovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KZnVuY3Rpb24gTHYoKXtLTS5tYWtlQ3VycmVudCgpLG52LmluaXQoKX0sbXVsdGk6ITB9LHtwcm92aWRlOlpfLHVzZUZhY3Rvcnk6ZnVuY3Rpb24gQnYoKXtyZXR1cm4oZnVuY3Rpb24gdChlKXtLbz1lfSkoZG9jdW1lbnQpLGRvY3VtZW50fSxkZXBzOltdfV0pLFZ2PVtbXSx7cHJvdmlkZTpZZCx1c2VWYWx1ZToicm9vdCJ9LHtwcm92aWRlOlpzLHVzZUZhY3Rvcnk6ZnVuY3Rpb24ganYoKXtyZXR1cm4gbmV3IFpzfSxkZXBzOltdfSx7cHJvdmlkZTppdix1c2VDbGFzczp2dixtdWx0aTohMCxkZXBzOltaXyxhXyxqeV19LHtwcm92aWRlOml2LHVzZUNsYXNzOk52LG11bHRpOiEwLGRlcHM6W1pfXX0sW10se3Byb3ZpZGU6aHYsdXNlQ2xhc3M6aHYsZGVwczpbYXYsbHYsSHldfSx7cHJvdmlkZTpfZyx1c2VFeGlzdGluZzpodn0se3Byb3ZpZGU6c3YsdXNlRXhpc3Rpbmc6bHZ9LHtwcm92aWRlOmx2LHVzZUNsYXNzOmx2LGRlcHM6W1pfXX0se3Byb3ZpZGU6bV8sdXNlQ2xhc3M6bV8sZGVwczpbYV9dfSx7cHJvdmlkZTphdix1c2VDbGFzczphdixkZXBzOltpdixhX119LHtwcm92aWRlOlhNLHVzZUNsYXNzOm92LGRlcHM6W119LFtdXTtjbGFzcyBVdntjb25zdHJ1Y3Rvcih0KXtpZih0KXRocm93IG5ldyBFcnJvcigiQnJvd3Nlck1vZHVsZSBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZC4gSWYgeW91IG5lZWQgYWNjZXNzIHRvIGNvbW1vbiBkaXJlY3RpdmVzIHN1Y2ggYXMgTmdJZiBhbmQgTmdGb3IgZnJvbSBhIGxhenkgbG9hZGVkIG1vZHVsZSwgaW1wb3J0IENvbW1vbk1vZHVsZSBpbnN0ZWFkLiIpfXN0YXRpYyB3aXRoU2VydmVyVHJhbnNpdGlvbih0KXtyZXR1cm57bmdNb2R1bGU6VXYscHJvdmlkZXJzOlt7cHJvdmlkZTpIeSx1c2VWYWx1ZTp0LmFwcElkfSx7cHJvdmlkZTokTSx1c2VFeGlzdGluZzpIeX0sdHZdfX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBHdigpe3JldHVybiBuZXcgV3YodnIoWl8pKX1Vdi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VXYpKHZyKFV2LDEyKSl9LFV2Lsm1bW9kPWFvKHt0eXBlOlV2fSksVXYuybVpbmo9dm4oe3Byb3ZpZGVyczpWdixpbXBvcnRzOltXTSxIX119KSxVdi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlV2LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpFcn0se3R5cGU6a3IsYXJnczpbVXZdfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFV2LFt7dHlwZTpBeSxhcmdzOlt7cHJvdmlkZXJzOlZ2LGV4cG9ydHM6W1dNLEhfXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlV2LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpFcn0se3R5cGU6a3IsYXJnczpbVXZdfV19XX0pLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oVXYse2V4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bV00sSF9dfX0pO2NsYXNzIFd2e2NvbnN0cnVjdG9yKHQpe3RoaXMuX2RvYz10LHRoaXMuX2RvbT1xXygpfWFkZFRhZyh0LGU9ITEpe3JldHVybiB0P3RoaXMuX2dldE9yQ3JlYXRlRWxlbWVudCh0LGUpOm51bGx9YWRkVGFncyh0LGU9ITEpe3JldHVybiB0P3QucmVkdWNlKCgodCxuKT0+KG4mJnQucHVzaCh0aGlzLl9nZXRPckNyZWF0ZUVsZW1lbnQobixlKSksdCkpLFtdKTpbXX1nZXRUYWcodCl7cmV0dXJuIHQmJnRoaXMuX2RvYy5xdWVyeVNlbGVjdG9yKGBtZXRhWyR7dH1dYCl8fG51bGx9Z2V0VGFncyh0KXtpZighdClyZXR1cm5bXTtjb25zdCBlPXRoaXMuX2RvYy5xdWVyeVNlbGVjdG9yQWxsKGBtZXRhWyR7dH1dYCk7cmV0dXJuIGU/W10uc2xpY2UuY2FsbChlKTpbXX11cGRhdGVUYWcodCxlKXtpZighdClyZXR1cm4gbnVsbDtlPWV8fHRoaXMuX3BhcnNlU2VsZWN0b3IodCk7Y29uc3Qgbj10aGlzLmdldFRhZyhlKTtyZXR1cm4gbj90aGlzLl9zZXRNZXRhRWxlbWVudEF0dHJpYnV0ZXModCxuKTp0aGlzLl9nZXRPckNyZWF0ZUVsZW1lbnQodCwhMCl9cmVtb3ZlVGFnKHQpe3RoaXMucmVtb3ZlVGFnRWxlbWVudCh0aGlzLmdldFRhZyh0KSl9cmVtb3ZlVGFnRWxlbWVudCh0KXt0JiZ0aGlzLl9kb20ucmVtb3ZlKHQpfV9nZXRPckNyZWF0ZUVsZW1lbnQodCxlPSExKXtpZighZSl7Y29uc3QgZT10aGlzLl9wYXJzZVNlbGVjdG9yKHQpLG49dGhpcy5nZXRUYWdzKGUpLmZpbHRlcigoZT0+dGhpcy5fY29udGFpbnNBdHRyaWJ1dGVzKHQsZSkpKVswXTtpZih2b2lkIDAhPT1uKXJldHVybiBufWNvbnN0IG49dGhpcy5fZG9tLmNyZWF0ZUVsZW1lbnQoIm1ldGEiKTtyZXR1cm4gdGhpcy5fc2V0TWV0YUVsZW1lbnRBdHRyaWJ1dGVzKHQsbiksdGhpcy5fZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0uYXBwZW5kQ2hpbGQobiksbn1fc2V0TWV0YUVsZW1lbnRBdHRyaWJ1dGVzKHQsZSl7cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKG49PmUuc2V0QXR0cmlidXRlKHRoaXMuX2dldE1ldGFLZXlNYXAobiksdFtuXSkpKSxlfV9wYXJzZVNlbGVjdG9yKHQpe2NvbnN0IGU9dC5uYW1lPyJuYW1lIjoicHJvcGVydHkiO3JldHVybmAke2V9PSIke3RbZV19ImB9X2NvbnRhaW5zQXR0cmlidXRlcyh0LGUpe3JldHVybiBPYmplY3Qua2V5cyh0KS5ldmVyeSgobj0+ZS5nZXRBdHRyaWJ1dGUodGhpcy5fZ2V0TWV0YUtleU1hcChuKSk9PT10W25dKSl9X2dldE1ldGFLZXlNYXAodCl7cmV0dXJuIFl2W3RdfHx0fX1Xdi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8V3YpKHZyKFpfKSl9LFd2Lsm1cHJvdj1Nbih7ZmFjdG9yeTpHdix0b2tlbjpXdixwcm92aWRlZEluOiJyb290In0pLFd2LmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChXdixbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QiLHVzZUZhY3Rvcnk6R3YsZGVwczpbXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSksbnVsbCk7Y29uc3QgWXY9e2h0dHBFcXVpdjoiaHR0cC1lcXVpdiJ9OwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBxdigpe3JldHVybiBuZXcgWnYodnIoWl8pKX1jbGFzcyBadntjb25zdHJ1Y3Rvcih0KXt0aGlzLl9kb2M9dH1nZXRUaXRsZSgpe3JldHVybiB0aGlzLl9kb2MudGl0bGV9c2V0VGl0bGUodCl7dGhpcy5fZG9jLnRpdGxlPXR8fCIifX1adi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WnYpKHZyKFpfKSl9LFp2Lsm1cHJvdj1Nbih7ZmFjdG9yeTpxdix0b2tlbjpadixwcm92aWRlZEluOiJyb290In0pLFp2LmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChadixbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QiLHVzZUZhY3Rvcnk6cXYsZGVwczpbXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSksbnVsbCk7Y2xhc3MgWHZ7Y29uc3RydWN0b3IoKXt0aGlzLnN0b3JlPXt9LHRoaXMub25TZXJpYWxpemVDYWxsYmFja3M9e319c3RhdGljIGluaXQodCl7Y29uc3QgZT1uZXcgWHY7cmV0dXJuIGUuc3RvcmU9dCxlfWdldCh0LGUpe3JldHVybiB2b2lkIDAhPT10aGlzLnN0b3JlW3RdP3RoaXMuc3RvcmVbdF06ZX1zZXQodCxlKXt0aGlzLnN0b3JlW3RdPWV9cmVtb3ZlKHQpe2RlbGV0ZSB0aGlzLnN0b3JlW3RdfWhhc0tleSh0KXtyZXR1cm4gdGhpcy5zdG9yZS5oYXNPd25Qcm9wZXJ0eSh0KX1vblNlcmlhbGl6ZSh0LGUpe3RoaXMub25TZXJpYWxpemVDYWxsYmFja3NbdF09ZX10b0pzb24oKXtmb3IoY29uc3QgdCBpbiB0aGlzLm9uU2VyaWFsaXplQ2FsbGJhY2tzKWlmKHRoaXMub25TZXJpYWxpemVDYWxsYmFja3MuaGFzT3duUHJvcGVydHkodCkpdHJ5e3RoaXMuc3RvcmVbdF09dGhpcy5vblNlcmlhbGl6ZUNhbGxiYWNrc1t0XSgpfWNhdGNoKHQpe2NvbnNvbGUud2FybigiRXhjZXB0aW9uIGluIG9uU2VyaWFsaXplIGNhbGxiYWNrOiAiLHQpfXJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnN0b3JlKX19ZnVuY3Rpb24gS3YodCxlKXtjb25zdCBuPXQuZ2V0RWxlbWVudEJ5SWQoZSsiLXN0YXRlIik7bGV0IG89e307aWYobiYmbi50ZXh0Q29udGVudCl0cnl7bz1KU09OLnBhcnNlKChmdW5jdGlvbiBpKHQpe2NvbnN0IGU9eyImYTsiOiImIiwiJnE7IjonIicsIiZzOyI6IiciLCImbDsiOiI8IiwiJmc7IjoiPiJ9O3JldHVybiB0LnJlcGxhY2UoLyZbXjtdKzsvZywodD0+ZVt0XSkpfSkobi50ZXh0Q29udGVudCkpfWNhdGNoKHQpe2NvbnNvbGUud2FybigiRXhjZXB0aW9uIHdoaWxlIHJlc3RvcmluZyBUcmFuc2ZlclN0YXRlIGZvciBhcHAgIitlLHQpfXJldHVybiBYdi5pbml0KG8pfVh2Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxYdil9LFh2Lsm1cHJvdj1Nbih7dG9rZW46WHYsZmFjdG9yeTpYdi7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWHYsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW119KSxudWxsKTtjbGFzcyBKdnt9SnYuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEp2KX0sSnYuybVtb2Q9YW8oe3R5cGU6SnZ9KSxKdi7JtWluaj12bih7cHJvdmlkZXJzOlt7cHJvdmlkZTpYdix1c2VGYWN0b3J5Okt2LGRlcHM6W1pfLEh5XX1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChKdixbe3R5cGU6QXksYXJnczpbe3Byb3ZpZGVyczpbe3Byb3ZpZGU6WHYsdXNlRmFjdG9yeTpLdixkZXBzOltaXyxIeV19XX1dfV0sbnVsbCxudWxsKSwKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpuZXcgT2coIjEyLjIuMSIpO3ZhciBRdj0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnt9O2Z1bmN0aW9uICR2KHQpe2lmKHQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgZT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChmdW5jdGlvbihuKXt2YXIgbz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsbik7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbixvLmdldD9vOntlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0W25dfX0pfSkpLGV9Ci8qKgogICAgICogQGxpY2Vuc2UgQW5ndWxhciB2MTIuMC4wLW5leHQuMAogICAgICogKGMpIDIwMTAtMjAyMCBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vCiAgICAgKiBMaWNlbnNlOiBNSVQKICAgICAqLyEoZnVuY3Rpb24oKXsKLyoqCiAgICAgICAgICogQGxpY2Vuc2UKICAgICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICAgICAqCiAgICAgICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgICAgICovCiEoZnVuY3Rpb24odCl7dmFyIGU9dC5wZXJmb3JtYW5jZTtmdW5jdGlvbiBuKHQpe2UmJmUubWFyayYmZS5tYXJrKHQpfWZ1bmN0aW9uIG8odCxuKXtlJiZlLm1lYXN1cmUmJmUubWVhc3VyZSh0LG4pfW4oIlpvbmUiKTt2YXIgaT10Ll9fWm9uZV9zeW1ib2xfcHJlZml4fHwiX196b25lX3N5bWJvbF9fIjtmdW5jdGlvbiBhKHQpe3JldHVybiBpK3R9dmFyIHI9ITA9PT10W2EoImZvcmNlRHVwbGljYXRlWm9uZUNoZWNrIildO2lmKHQuWm9uZSl7aWYocnx8ImZ1bmN0aW9uIiE9dHlwZW9mIHQuWm9uZS5fX3N5bWJvbF9fKXRocm93IG5ldyBFcnJvcigiWm9uZSBhbHJlYWR5IGxvYWRlZC4iKTtyZXR1cm4gdC5ab25lfXZhciBzPShmdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxlKXt0aGlzLl9wYXJlbnQ9dCx0aGlzLl9uYW1lPWU/ZS5uYW1lfHwidW5uYW1lZCI6Ijxyb290PiIsdGhpcy5fcHJvcGVydGllcz1lJiZlLnByb3BlcnRpZXN8fHt9LHRoaXMuX3pvbmVEZWxlZ2F0ZT1uZXcgZCh0aGlzLHRoaXMuX3BhcmVudCYmdGhpcy5fcGFyZW50Ll96b25lRGVsZWdhdGUsZSl9cmV0dXJuIGUuYXNzZXJ0Wm9uZVBhdGNoZWQ9ZnVuY3Rpb24oKXtpZih0LlByb21pc2UhPT1ELlpvbmVBd2FyZVByb21pc2UpdGhyb3cgbmV3IEVycm9yKCJab25lLmpzIGhhcyBkZXRlY3RlZCB0aGF0IFpvbmVBd2FyZVByb21pc2UgYCh3aW5kb3d8Z2xvYmFsKS5Qcm9taXNlYCBoYXMgYmVlbiBvdmVyd3JpdHRlbi5cbk1vc3QgbGlrZWx5IGNhdXNlIGlzIHRoYXQgYSBQcm9taXNlIHBvbHlmaWxsIGhhcyBiZWVuIGxvYWRlZCBhZnRlciBab25lLmpzIChQb2x5ZmlsbGluZyBQcm9taXNlIGFwaSBpcyBub3QgbmVjZXNzYXJ5IHdoZW4gem9uZS5qcyBpcyBsb2FkZWQuIElmIHlvdSBtdXN0IGxvYWQgb25lLCBkbyBzbyBiZWZvcmUgbG9hZGluZyB6b25lLmpzLikiKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInJvb3QiLHtnZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9ZS5jdXJyZW50O3QucGFyZW50Oyl0PXQucGFyZW50O3JldHVybiB0fSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJjdXJyZW50Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFIuem9uZX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiY3VycmVudFRhc2siLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gQX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxlLl9fbG9hZF9wYXRjaD1mdW5jdGlvbihpLGEscyl7aWYodm9pZCAwPT09cyYmKHM9ITEpLEQuaGFzT3duUHJvcGVydHkoaSkpe2lmKCFzJiZyKXRocm93IEVycm9yKCJBbHJlYWR5IGxvYWRlZCBwYXRjaDogIitpKX1lbHNlIGlmKCF0WyJfX1pvbmVfZGlzYWJsZV8iK2ldKXt2YXIgbD0iWm9uZToiK2k7bihsKSxEW2ldPWEodCxlLEUpLG8obCxsKX19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwicGFyZW50Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhcmVudH0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsIm5hbWUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbmFtZX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRab25lV2l0aCh0KTtpZihlKXJldHVybiBlLl9wcm9wZXJ0aWVzW3RdfSxlLnByb3RvdHlwZS5nZXRab25lV2l0aD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcztlOyl7aWYoZS5fcHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eSh0KSlyZXR1cm4gZTtlPWUuX3BhcmVudH1yZXR1cm4gbnVsbH0sZS5wcm90b3R5cGUuZm9yaz1mdW5jdGlvbih0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIlpvbmVTcGVjIHJlcXVpcmVkISIpO3JldHVybiB0aGlzLl96b25lRGVsZWdhdGUuZm9yayh0aGlzLHQpfSxlLnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RpbmcgZnVuY3Rpb24gZ290OiAiK3QpO3ZhciBuPXRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnRlcmNlcHQodGhpcyx0LGUpLG89dGhpcztyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gby5ydW5HdWFyZGVkKG4sdGhpcyxhcmd1bWVudHMsZSl9fSxlLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24odCxlLG4sbyl7Uj17cGFyZW50OlIsem9uZTp0aGlzfTt0cnl7cmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnZva2UodGhpcyx0LGUsbixvKX1maW5hbGx5e1I9Ui5wYXJlbnR9fSxlLnByb3RvdHlwZS5ydW5HdWFyZGVkPWZ1bmN0aW9uKHQsZSxuLG8pe3ZvaWQgMD09PWUmJihlPW51bGwpLFI9e3BhcmVudDpSLHpvbmU6dGhpc307dHJ5e3RyeXtyZXR1cm4gdGhpcy5fem9uZURlbGVnYXRlLmludm9rZSh0aGlzLHQsZSxuLG8pfWNhdGNoKHQpe2lmKHRoaXMuX3pvbmVEZWxlZ2F0ZS5oYW5kbGVFcnJvcih0aGlzLHQpKXRocm93IHR9fWZpbmFsbHl7Uj1SLnBhcmVudH19LGUucHJvdG90eXBlLnJ1blRhc2s9ZnVuY3Rpb24odCxlLG4pe2lmKHQuem9uZSE9dGhpcyl0aHJvdyBuZXcgRXJyb3IoIkEgdGFzayBjYW4gb25seSBiZSBydW4gaW4gdGhlIHpvbmUgb2YgY3JlYXRpb24hIChDcmVhdGlvbjogIisodC56b25lfHxfKS5uYW1lKyI7IEV4ZWN1dGlvbjogIit0aGlzLm5hbWUrIikiKTtpZih0LnN0YXRlIT09Q3x8dC50eXBlIT09UyYmdC50eXBlIT09ayl7dmFyIG89dC5zdGF0ZSE9eDtvJiZ0Ll90cmFuc2l0aW9uVG8oeCx2KSx0LnJ1bkNvdW50Kys7dmFyIGk9QTtBPXQsUj17cGFyZW50OlIsem9uZTp0aGlzfTt0cnl7dC50eXBlPT1rJiZ0LmRhdGEmJiF0LmRhdGEuaXNQZXJpb2RpYyYmKHQuY2FuY2VsRm49dm9pZCAwKTt0cnl7cmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnZva2VUYXNrKHRoaXMsdCxlLG4pfWNhdGNoKHQpe2lmKHRoaXMuX3pvbmVEZWxlZ2F0ZS5oYW5kbGVFcnJvcih0aGlzLHQpKXRocm93IHR9fWZpbmFsbHl7dC5zdGF0ZSE9PUMmJnQuc3RhdGUhPT1QJiYodC50eXBlPT1TfHx0LmRhdGEmJnQuZGF0YS5pc1BlcmlvZGljP28mJnQuX3RyYW5zaXRpb25Ubyh2LHgpOih0LnJ1bkNvdW50PTAsdGhpcy5fdXBkYXRlVGFza0NvdW50KHQsLTEpLG8mJnQuX3RyYW5zaXRpb25UbyhDLHgsQykpKSxSPVIucGFyZW50LEE9aX19fSxlLnByb3RvdHlwZS5zY2hlZHVsZVRhc2s9ZnVuY3Rpb24odCl7aWYodC56b25lJiZ0LnpvbmUhPT10aGlzKWZvcih2YXIgZT10aGlzO2U7KXtpZihlPT09dC56b25lKXRocm93IEVycm9yKCJjYW4gbm90IHJlc2NoZWR1bGUgdGFzayB0byAiK3RoaXMubmFtZSsiIHdoaWNoIGlzIGRlc2NlbmRhbnRzIG9mIHRoZSBvcmlnaW5hbCB6b25lICIrdC56b25lLm5hbWUpO2U9ZS5wYXJlbnR9dC5fdHJhbnNpdGlvblRvKE0sQyk7dmFyIG49W107dC5fem9uZURlbGVnYXRlcz1uLHQuX3pvbmU9dGhpczt0cnl7dD10aGlzLl96b25lRGVsZWdhdGUuc2NoZWR1bGVUYXNrKHRoaXMsdCl9Y2F0Y2goZSl7dGhyb3cgdC5fdHJhbnNpdGlvblRvKFAsTSxDKSx0aGlzLl96b25lRGVsZWdhdGUuaGFuZGxlRXJyb3IodGhpcyxlKSxlfXJldHVybiB0Ll96b25lRGVsZWdhdGVzPT09biYmdGhpcy5fdXBkYXRlVGFza0NvdW50KHQsMSksdC5zdGF0ZT09TSYmdC5fdHJhbnNpdGlvblRvKHYsTSksdH0sZS5wcm90b3R5cGUuc2NoZWR1bGVNaWNyb1Rhc2s9ZnVuY3Rpb24odCxlLG4sbyl7cmV0dXJuIHRoaXMuc2NoZWR1bGVUYXNrKG5ldyBwKHcsdCxlLG4sbyx2b2lkIDApKX0sZS5wcm90b3R5cGUuc2NoZWR1bGVNYWNyb1Rhc2s9ZnVuY3Rpb24odCxlLG4sbyxpKXtyZXR1cm4gdGhpcy5zY2hlZHVsZVRhc2sobmV3IHAoayx0LGUsbixvLGkpKX0sZS5wcm90b3R5cGUuc2NoZWR1bGVFdmVudFRhc2s9ZnVuY3Rpb24odCxlLG4sbyxpKXtyZXR1cm4gdGhpcy5zY2hlZHVsZVRhc2sobmV3IHAoUyx0LGUsbixvLGkpKX0sZS5wcm90b3R5cGUuY2FuY2VsVGFzaz1mdW5jdGlvbih0KXtpZih0LnpvbmUhPXRoaXMpdGhyb3cgbmV3IEVycm9yKCJBIHRhc2sgY2FuIG9ubHkgYmUgY2FuY2VsbGVkIGluIHRoZSB6b25lIG9mIGNyZWF0aW9uISAoQ3JlYXRpb246ICIrKHQuem9uZXx8XykubmFtZSsiOyBFeGVjdXRpb246ICIrdGhpcy5uYW1lKyIpIik7dC5fdHJhbnNpdGlvblRvKE8sdix4KTt0cnl7dGhpcy5fem9uZURlbGVnYXRlLmNhbmNlbFRhc2sodGhpcyx0KX1jYXRjaChlKXt0aHJvdyB0Ll90cmFuc2l0aW9uVG8oUCxPKSx0aGlzLl96b25lRGVsZWdhdGUuaGFuZGxlRXJyb3IodGhpcyxlKSxlfXJldHVybiB0aGlzLl91cGRhdGVUYXNrQ291bnQodCwtMSksdC5fdHJhbnNpdGlvblRvKEMsTyksdC5ydW5Db3VudD0wLHR9LGUucHJvdG90eXBlLl91cGRhdGVUYXNrQ291bnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10Ll96b25lRGVsZWdhdGVzOy0xPT1lJiYodC5fem9uZURlbGVnYXRlcz1udWxsKTtmb3IodmFyIG89MDtvPG4ubGVuZ3RoO28rKyluW29dLl91cGRhdGVUYXNrQ291bnQodC50eXBlLGUpfSxlfSkoKTtzLl9fc3ltYm9sX189YTt2YXIgbCxjPXtuYW1lOiIiLG9uSGFzVGFzazpmdW5jdGlvbih0LGUsbixvKXtyZXR1cm4gdC5oYXNUYXNrKG4sbyl9LG9uU2NoZWR1bGVUYXNrOmZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiB0LnNjaGVkdWxlVGFzayhuLG8pfSxvbkludm9rZVRhc2s6ZnVuY3Rpb24odCxlLG4sbyxpLGEpe3JldHVybiB0Lmludm9rZVRhc2sobixvLGksYSl9LG9uQ2FuY2VsVGFzazpmdW5jdGlvbih0LGUsbixvKXtyZXR1cm4gdC5jYW5jZWxUYXNrKG4sbyl9fSxkPShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4pe3RoaXMuX3Rhc2tDb3VudHM9e21pY3JvVGFzazowLG1hY3JvVGFzazowLGV2ZW50VGFzazowfSx0aGlzLnpvbmU9dCx0aGlzLl9wYXJlbnREZWxlZ2F0ZT1lLHRoaXMuX2ZvcmtaUz1uJiYobiYmbi5vbkZvcms/bjplLl9mb3JrWlMpLHRoaXMuX2ZvcmtEbGd0PW4mJihuLm9uRm9yaz9lOmUuX2ZvcmtEbGd0KSx0aGlzLl9mb3JrQ3VyclpvbmU9biYmKG4ub25Gb3JrP3RoaXMuem9uZTplLl9mb3JrQ3VyclpvbmUpLHRoaXMuX2ludGVyY2VwdFpTPW4mJihuLm9uSW50ZXJjZXB0P246ZS5faW50ZXJjZXB0WlMpLHRoaXMuX2ludGVyY2VwdERsZ3Q9biYmKG4ub25JbnRlcmNlcHQ/ZTplLl9pbnRlcmNlcHREbGd0KSx0aGlzLl9pbnRlcmNlcHRDdXJyWm9uZT1uJiYobi5vbkludGVyY2VwdD90aGlzLnpvbmU6ZS5faW50ZXJjZXB0Q3VyclpvbmUpLHRoaXMuX2ludm9rZVpTPW4mJihuLm9uSW52b2tlP246ZS5faW52b2tlWlMpLHRoaXMuX2ludm9rZURsZ3Q9biYmKG4ub25JbnZva2U/ZTplLl9pbnZva2VEbGd0KSx0aGlzLl9pbnZva2VDdXJyWm9uZT1uJiYobi5vbkludm9rZT90aGlzLnpvbmU6ZS5faW52b2tlQ3VyclpvbmUpLHRoaXMuX2hhbmRsZUVycm9yWlM9biYmKG4ub25IYW5kbGVFcnJvcj9uOmUuX2hhbmRsZUVycm9yWlMpLHRoaXMuX2hhbmRsZUVycm9yRGxndD1uJiYobi5vbkhhbmRsZUVycm9yP2U6ZS5faGFuZGxlRXJyb3JEbGd0KSx0aGlzLl9oYW5kbGVFcnJvckN1cnJab25lPW4mJihuLm9uSGFuZGxlRXJyb3I/dGhpcy56b25lOmUuX2hhbmRsZUVycm9yQ3VyclpvbmUpLHRoaXMuX3NjaGVkdWxlVGFza1pTPW4mJihuLm9uU2NoZWR1bGVUYXNrP246ZS5fc2NoZWR1bGVUYXNrWlMpLHRoaXMuX3NjaGVkdWxlVGFza0RsZ3Q9biYmKG4ub25TY2hlZHVsZVRhc2s/ZTplLl9zY2hlZHVsZVRhc2tEbGd0KSx0aGlzLl9zY2hlZHVsZVRhc2tDdXJyWm9uZT1uJiYobi5vblNjaGVkdWxlVGFzaz90aGlzLnpvbmU6ZS5fc2NoZWR1bGVUYXNrQ3VyclpvbmUpLHRoaXMuX2ludm9rZVRhc2taUz1uJiYobi5vbkludm9rZVRhc2s/bjplLl9pbnZva2VUYXNrWlMpLHRoaXMuX2ludm9rZVRhc2tEbGd0PW4mJihuLm9uSW52b2tlVGFzaz9lOmUuX2ludm9rZVRhc2tEbGd0KSx0aGlzLl9pbnZva2VUYXNrQ3VyclpvbmU9biYmKG4ub25JbnZva2VUYXNrP3RoaXMuem9uZTplLl9pbnZva2VUYXNrQ3VyclpvbmUpLHRoaXMuX2NhbmNlbFRhc2taUz1uJiYobi5vbkNhbmNlbFRhc2s/bjplLl9jYW5jZWxUYXNrWlMpLHRoaXMuX2NhbmNlbFRhc2tEbGd0PW4mJihuLm9uQ2FuY2VsVGFzaz9lOmUuX2NhbmNlbFRhc2tEbGd0KSx0aGlzLl9jYW5jZWxUYXNrQ3VyclpvbmU9biYmKG4ub25DYW5jZWxUYXNrP3RoaXMuem9uZTplLl9jYW5jZWxUYXNrQ3VyclpvbmUpLHRoaXMuX2hhc1Rhc2taUz1udWxsLHRoaXMuX2hhc1Rhc2tEbGd0PW51bGwsdGhpcy5faGFzVGFza0RsZ3RPd25lcj1udWxsLHRoaXMuX2hhc1Rhc2tDdXJyWm9uZT1udWxsO3ZhciBvPW4mJm4ub25IYXNUYXNrOyhvfHxlJiZlLl9oYXNUYXNrWlMpJiYodGhpcy5faGFzVGFza1pTPW8/bjpjLHRoaXMuX2hhc1Rhc2tEbGd0PWUsdGhpcy5faGFzVGFza0RsZ3RPd25lcj10aGlzLHRoaXMuX2hhc1Rhc2tDdXJyWm9uZT10LG4ub25TY2hlZHVsZVRhc2t8fCh0aGlzLl9zY2hlZHVsZVRhc2taUz1jLHRoaXMuX3NjaGVkdWxlVGFza0RsZ3Q9ZSx0aGlzLl9zY2hlZHVsZVRhc2tDdXJyWm9uZT10aGlzLnpvbmUpLG4ub25JbnZva2VUYXNrfHwodGhpcy5faW52b2tlVGFza1pTPWMsdGhpcy5faW52b2tlVGFza0RsZ3Q9ZSx0aGlzLl9pbnZva2VUYXNrQ3VyclpvbmU9dGhpcy56b25lKSxuLm9uQ2FuY2VsVGFza3x8KHRoaXMuX2NhbmNlbFRhc2taUz1jLHRoaXMuX2NhbmNlbFRhc2tEbGd0PWUsdGhpcy5fY2FuY2VsVGFza0N1cnJab25lPXRoaXMuem9uZSkpfXJldHVybiB0LnByb3RvdHlwZS5mb3JrPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2ZvcmtaUz90aGlzLl9mb3JrWlMub25Gb3JrKHRoaXMuX2ZvcmtEbGd0LHRoaXMuem9uZSx0LGUpOm5ldyBzKHQsZSl9LHQucHJvdG90eXBlLmludGVyY2VwdD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuX2ludGVyY2VwdFpTP3RoaXMuX2ludGVyY2VwdFpTLm9uSW50ZXJjZXB0KHRoaXMuX2ludGVyY2VwdERsZ3QsdGhpcy5faW50ZXJjZXB0Q3VyclpvbmUsdCxlLG4pOmV9LHQucHJvdG90eXBlLmludm9rZT1mdW5jdGlvbih0LGUsbixvLGkpe3JldHVybiB0aGlzLl9pbnZva2VaUz90aGlzLl9pbnZva2VaUy5vbkludm9rZSh0aGlzLl9pbnZva2VEbGd0LHRoaXMuX2ludm9rZUN1cnJab25lLHQsZSxuLG8saSk6ZS5hcHBseShuLG8pfSx0LnByb3RvdHlwZS5oYW5kbGVFcnJvcj1mdW5jdGlvbih0LGUpe3JldHVybiF0aGlzLl9oYW5kbGVFcnJvclpTfHx0aGlzLl9oYW5kbGVFcnJvclpTLm9uSGFuZGxlRXJyb3IodGhpcy5faGFuZGxlRXJyb3JEbGd0LHRoaXMuX2hhbmRsZUVycm9yQ3VyclpvbmUsdCxlKX0sdC5wcm90b3R5cGUuc2NoZWR1bGVUYXNrPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZTtpZih0aGlzLl9zY2hlZHVsZVRhc2taUyl0aGlzLl9oYXNUYXNrWlMmJm4uX3pvbmVEZWxlZ2F0ZXMucHVzaCh0aGlzLl9oYXNUYXNrRGxndE93bmVyKSwobj10aGlzLl9zY2hlZHVsZVRhc2taUy5vblNjaGVkdWxlVGFzayh0aGlzLl9zY2hlZHVsZVRhc2tEbGd0LHRoaXMuX3NjaGVkdWxlVGFza0N1cnJab25lLHQsZSkpfHwobj1lKTtlbHNlIGlmKGUuc2NoZWR1bGVGbillLnNjaGVkdWxlRm4oZSk7ZWxzZXtpZihlLnR5cGUhPXcpdGhyb3cgbmV3IEVycm9yKCJUYXNrIGlzIG1pc3Npbmcgc2NoZWR1bGVGbi4iKTtiKGUpfXJldHVybiBufSx0LnByb3RvdHlwZS5pbnZva2VUYXNrPWZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiB0aGlzLl9pbnZva2VUYXNrWlM/dGhpcy5faW52b2tlVGFza1pTLm9uSW52b2tlVGFzayh0aGlzLl9pbnZva2VUYXNrRGxndCx0aGlzLl9pbnZva2VUYXNrQ3VyclpvbmUsdCxlLG4sbyk6ZS5jYWxsYmFjay5hcHBseShuLG8pfSx0LnByb3RvdHlwZS5jYW5jZWxUYXNrPWZ1bmN0aW9uKHQsZSl7dmFyIG47aWYodGhpcy5fY2FuY2VsVGFza1pTKW49dGhpcy5fY2FuY2VsVGFza1pTLm9uQ2FuY2VsVGFzayh0aGlzLl9jYW5jZWxUYXNrRGxndCx0aGlzLl9jYW5jZWxUYXNrQ3VyclpvbmUsdCxlKTtlbHNle2lmKCFlLmNhbmNlbEZuKXRocm93IEVycm9yKCJUYXNrIGlzIG5vdCBjYW5jZWxhYmxlIik7bj1lLmNhbmNlbEZuKGUpfXJldHVybiBufSx0LnByb3RvdHlwZS5oYXNUYXNrPWZ1bmN0aW9uKHQsZSl7dHJ5e3RoaXMuX2hhc1Rhc2taUyYmdGhpcy5faGFzVGFza1pTLm9uSGFzVGFzayh0aGlzLl9oYXNUYXNrRGxndCx0aGlzLl9oYXNUYXNrQ3VyclpvbmUsdCxlKX1jYXRjaChlKXt0aGlzLmhhbmRsZUVycm9yKHQsZSl9fSx0LnByb3RvdHlwZS5fdXBkYXRlVGFza0NvdW50PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fdGFza0NvdW50cyxvPW5bdF0saT1uW3RdPW8rZTtpZihpPDApdGhyb3cgbmV3IEVycm9yKCJNb3JlIHRhc2tzIGV4ZWN1dGVkIHRoZW4gd2VyZSBzY2hlZHVsZWQuIik7MCE9byYmMCE9aXx8dGhpcy5oYXNUYXNrKHRoaXMuem9uZSx7bWljcm9UYXNrOm4ubWljcm9UYXNrPjAsbWFjcm9UYXNrOm4ubWFjcm9UYXNrPjAsZXZlbnRUYXNrOm4uZXZlbnRUYXNrPjAsY2hhbmdlOnR9KX0sdH0pKCkscD0oZnVuY3Rpb24oKXtmdW5jdGlvbiBlKG4sbyxpLGEscixzKXtpZih0aGlzLl96b25lPW51bGwsdGhpcy5ydW5Db3VudD0wLHRoaXMuX3pvbmVEZWxlZ2F0ZXM9bnVsbCx0aGlzLl9zdGF0ZT0ibm90U2NoZWR1bGVkIix0aGlzLnR5cGU9bix0aGlzLnNvdXJjZT1vLHRoaXMuZGF0YT1hLHRoaXMuc2NoZWR1bGVGbj1yLHRoaXMuY2FuY2VsRm49cywhaSl0aHJvdyBuZXcgRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBkZWZpbmVkIik7dGhpcy5jYWxsYmFjaz1pO3ZhciBsPXRoaXM7dGhpcy5pbnZva2U9bj09PVMmJmEmJmEudXNlRz9lLmludm9rZVRhc2s6ZnVuY3Rpb24oKXtyZXR1cm4gZS5pbnZva2VUYXNrLmNhbGwodCxsLHRoaXMsYXJndW1lbnRzKX19cmV0dXJuIGUuaW52b2tlVGFzaz1mdW5jdGlvbih0LGUsbil7dHx8KHQ9dGhpcyksVCsrO3RyeXtyZXR1cm4gdC5ydW5Db3VudCsrLHQuem9uZS5ydW5UYXNrKHQsZSxuKX1maW5hbGx5ezE9PVQmJnkoKSxULS19fSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInpvbmUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fem9uZX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInN0YXRlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N0YXRlfSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmNhbmNlbFNjaGVkdWxlUmVxdWVzdD1mdW5jdGlvbigpe3RoaXMuX3RyYW5zaXRpb25UbyhDLE0pfSxlLnByb3RvdHlwZS5fdHJhbnNpdGlvblRvPWZ1bmN0aW9uKHQsZSxuKXtpZih0aGlzLl9zdGF0ZSE9PWUmJnRoaXMuX3N0YXRlIT09bil0aHJvdyBuZXcgRXJyb3IodGhpcy50eXBlKyIgJyIrdGhpcy5zb3VyY2UrIic6IGNhbiBub3QgdHJhbnNpdGlvbiB0byAnIit0KyInLCBleHBlY3Rpbmcgc3RhdGUgJyIrZSsiJyIrKG4/IiBvciAnIituKyInIjoiIikrIiwgd2FzICciK3RoaXMuX3N0YXRlKyInLiIpO3RoaXMuX3N0YXRlPXQsdD09QyYmKHRoaXMuX3pvbmVEZWxlZ2F0ZXM9bnVsbCl9LGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YSYmdm9pZCAwIT09dGhpcy5kYXRhLmhhbmRsZUlkP3RoaXMuZGF0YS5oYW5kbGVJZC50b1N0cmluZygpOk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGlzKX0sZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6dGhpcy50eXBlLHN0YXRlOnRoaXMuc3RhdGUsc291cmNlOnRoaXMuc291cmNlLHpvbmU6dGhpcy56b25lLm5hbWUscnVuQ291bnQ6dGhpcy5ydW5Db3VudH19LGV9KSgpLG09YSgic2V0VGltZW91dCIpLHU9YSgiUHJvbWlzZSIpLGY9YSgidGhlbiIpLGc9W10saD0hMTtmdW5jdGlvbiBiKGUpe2lmKDA9PT1UJiYwPT09Zy5sZW5ndGgpaWYobHx8dFt1XSYmKGw9dFt1XS5yZXNvbHZlKDApKSxsKXt2YXIgbj1sW2ZdO258fChuPWwudGhlbiksbi5jYWxsKGwseSl9ZWxzZSB0W21dKHksMCk7ZSYmZy5wdXNoKGUpfWZ1bmN0aW9uIHkoKXtpZighaCl7Zm9yKGg9ITA7Zy5sZW5ndGg7KXt2YXIgdD1nO2c9W107Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspe3ZhciBuPXRbZV07dHJ5e24uem9uZS5ydW5UYXNrKG4sbnVsbCxudWxsKX1jYXRjaCh0KXtFLm9uVW5oYW5kbGVkRXJyb3IodCl9fX1FLm1pY3JvdGFza0RyYWluRG9uZSgpLGg9ITF9fXZhciBfPXtuYW1lOiJOTyBaT05FIn0sQz0ibm90U2NoZWR1bGVkIixNPSJzY2hlZHVsaW5nIix2PSJzY2hlZHVsZWQiLHg9InJ1bm5pbmciLE89ImNhbmNlbGluZyIsUD0idW5rbm93biIsdz0ibWljcm9UYXNrIixrPSJtYWNyb1Rhc2siLFM9ImV2ZW50VGFzayIsRD17fSxFPXtzeW1ib2w6YSxjdXJyZW50Wm9uZUZyYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIFJ9LG9uVW5oYW5kbGVkRXJyb3I6TixtaWNyb3Rhc2tEcmFpbkRvbmU6TixzY2hlZHVsZU1pY3JvVGFzazpiLHNob3dVbmNhdWdodEVycm9yOmZ1bmN0aW9uKCl7cmV0dXJuIXNbYSgiaWdub3JlQ29uc29sZUVycm9yVW5jYXVnaHRFcnJvciIpXX0scGF0Y2hFdmVudFRhcmdldDpmdW5jdGlvbigpe3JldHVybltdfSxwYXRjaE9uUHJvcGVydGllczpOLHBhdGNoTWV0aG9kOmZ1bmN0aW9uKCl7cmV0dXJuIE59LGJpbmRBcmd1bWVudHM6ZnVuY3Rpb24oKXtyZXR1cm5bXX0scGF0Y2hUaGVuOmZ1bmN0aW9uKCl7cmV0dXJuIE59LHBhdGNoTWFjcm9UYXNrOmZ1bmN0aW9uKCl7cmV0dXJuIE59LHBhdGNoRXZlbnRQcm90b3R5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gTn0saXNJRU9yRWRnZTpmdW5jdGlvbigpe3JldHVybiExfSxnZXRHbG9iYWxPYmplY3RzOmZ1bmN0aW9uKCl7fSxPYmplY3REZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbigpe3JldHVybiBOfSxPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ZnVuY3Rpb24oKXt9LE9iamVjdENyZWF0ZTpmdW5jdGlvbigpe30sQXJyYXlTbGljZTpmdW5jdGlvbigpe3JldHVybltdfSxwYXRjaENsYXNzOmZ1bmN0aW9uKCl7cmV0dXJuIE59LHdyYXBXaXRoQ3VycmVudFpvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gTn0sZmlsdGVyUHJvcGVydGllczpmdW5jdGlvbigpe3JldHVybltdfSxhdHRhY2hPcmlnaW5Ub1BhdGNoZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gTn0sX3JlZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oKXtyZXR1cm4gTn0scGF0Y2hDYWxsYmFja3M6ZnVuY3Rpb24oKXtyZXR1cm4gTn19LFI9e3BhcmVudDpudWxsLHpvbmU6bmV3IHMobnVsbCxudWxsKX0sQT1udWxsLFQ9MDtmdW5jdGlvbiBOKCl7fW8oIlpvbmUiLCJab25lIiksdC5ab25lPXN9KSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93fHwidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYmJnNlbGZ8fFF2KTsKLyoqCiAgICAgICAgICogQGxpY2Vuc2UKICAgICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICAgICAqCiAgICAgICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgICAgICovCnZhciB0PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsZT1PYmplY3QuZGVmaW5lUHJvcGVydHksbj1PYmplY3QuZ2V0UHJvdG90eXBlT2Ysbz1PYmplY3QuY3JlYXRlLGk9QXJyYXkucHJvdG90eXBlLnNsaWNlLGE9ImFkZEV2ZW50TGlzdGVuZXIiLHI9InJlbW92ZUV2ZW50TGlzdGVuZXIiLHM9Wm9uZS5fX3N5bWJvbF9fKGEpLGw9Wm9uZS5fX3N5bWJvbF9fKHIpLGM9InRydWUiLGQ9ImZhbHNlIixwPVpvbmUuX19zeW1ib2xfXygiIik7ZnVuY3Rpb24gbSh0LGUpe3JldHVybiBab25lLmN1cnJlbnQud3JhcCh0LGUpfWZ1bmN0aW9uIHUodCxlLG4sbyxpKXtyZXR1cm4gWm9uZS5jdXJyZW50LnNjaGVkdWxlTWFjcm9UYXNrKHQsZSxuLG8saSl9dmFyIGY9Wm9uZS5fX3N5bWJvbF9fLGc9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3csaD1nP3dpbmRvdzp2b2lkIDAsYj1nJiZofHwib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGZ8fFF2LHk9W251bGxdO2Z1bmN0aW9uIF8odCxlKXtmb3IodmFyIG49dC5sZW5ndGgtMTtuPj0wO24tLSkiZnVuY3Rpb24iPT10eXBlb2YgdFtuXSYmKHRbbl09bSh0W25dLGUrIl8iK24pKTtyZXR1cm4gdH1mdW5jdGlvbiBDKHQpe3JldHVybiF0fHwhMSE9PXQud3JpdGFibGUmJiEoImZ1bmN0aW9uIj09dHlwZW9mIHQuZ2V0JiZ2b2lkIDA9PT10LnNldCl9dmFyIE09InVuZGVmaW5lZCIhPXR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlLHY9ISgibnciaW4gYikmJnZvaWQgMCE9PWIucHJvY2VzcyYmIltvYmplY3QgcHJvY2Vzc10iPT09e30udG9TdHJpbmcuY2FsbChiLnByb2Nlc3MpLHg9IXYmJiFNJiYhKCFnfHwhaC5IVE1MRWxlbWVudCksTz12b2lkIDAhPT1iLnByb2Nlc3MmJiJbb2JqZWN0IHByb2Nlc3NdIj09PXt9LnRvU3RyaW5nLmNhbGwoYi5wcm9jZXNzKSYmIU0mJiEoIWd8fCFoLkhUTUxFbGVtZW50KSxQPXt9LHc9ZnVuY3Rpb24odCl7aWYodD10fHxiLmV2ZW50KXt2YXIgZT1QW3QudHlwZV07ZXx8KGU9UFt0LnR5cGVdPWYoIk9OX1BST1BFUlRZIit0LnR5cGUpKTt2YXIgbixvPXRoaXN8fHQudGFyZ2V0fHxiLGk9b1tlXTtyZXR1cm4geCYmbz09PWgmJiJlcnJvciI9PT10LnR5cGU/ITA9PT0obj1pJiZpLmNhbGwodGhpcyx0Lm1lc3NhZ2UsdC5maWxlbmFtZSx0LmxpbmVubyx0LmNvbG5vLHQuZXJyb3IpKSYmdC5wcmV2ZW50RGVmYXVsdCgpOm51bGw9PShuPWkmJmkuYXBwbHkodGhpcyxhcmd1bWVudHMpKXx8bnx8dC5wcmV2ZW50RGVmYXVsdCgpLG59fTtmdW5jdGlvbiBrKG4sbyxpKXt2YXIgYT10KG4sbyk7aWYoIWEmJmkmJnQoaSxvKSYmKGE9e2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksYSYmYS5jb25maWd1cmFibGUpe3ZhciByPWYoIm9uIitvKyJwYXRjaGVkIik7aWYoIW4uaGFzT3duUHJvcGVydHkocil8fCFuW3JdKXtkZWxldGUgYS53cml0YWJsZSxkZWxldGUgYS52YWx1ZTt2YXIgcz1hLmdldCxsPWEuc2V0LGM9by5zdWJzdHIoMiksZD1QW2NdO2R8fChkPVBbY109ZigiT05fUFJPUEVSVFkiK2MpKSxhLnNldD1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2V8fG4hPT1ifHwoZT1iKSxlJiYoZVtkXSYmZS5yZW1vdmVFdmVudExpc3RlbmVyKGMsdyksbCYmbC5hcHBseShlLHkpLCJmdW5jdGlvbiI9PXR5cGVvZiB0PyhlW2RdPXQsZS5hZGRFdmVudExpc3RlbmVyKGMsdywhMSkpOmVbZF09bnVsbCl9LGEuZ2V0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZih0fHxuIT09Ynx8KHQ9YiksIXQpcmV0dXJuIG51bGw7dmFyIGU9dFtkXTtpZihlKXJldHVybiBlO2lmKHMpe3ZhciBpPXMmJnMuY2FsbCh0aGlzKTtpZihpKXJldHVybiBhLnNldC5jYWxsKHRoaXMsaSksImZ1bmN0aW9uIj09dHlwZW9mIHQucmVtb3ZlQXR0cmlidXRlJiZ0LnJlbW92ZUF0dHJpYnV0ZShvKSxpfXJldHVybiBudWxsfSxlKG4sbyxhKSxuW3JdPSEwfX19ZnVuY3Rpb24gUyh0LGUsbil7aWYoZSlmb3IodmFyIG89MDtvPGUubGVuZ3RoO28rKylrKHQsIm9uIitlW29dLG4pO2Vsc2V7dmFyIGk9W107Zm9yKHZhciBhIGluIHQpIm9uIj09YS5zdWJzdHIoMCwyKSYmaS5wdXNoKGEpO2Zvcih2YXIgcj0wO3I8aS5sZW5ndGg7cisrKWsodCxpW3JdLG4pfX12YXIgRD1mKCJvcmlnaW5hbEluc3RhbmNlIik7ZnVuY3Rpb24gRSh0KXt2YXIgbj1iW3RdO2lmKG4pe2JbZih0KV09bixiW3RdPWZ1bmN0aW9uKCl7dmFyIGU9Xyhhcmd1bWVudHMsdCk7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDA6dGhpc1tEXT1uZXcgbjticmVhaztjYXNlIDE6dGhpc1tEXT1uZXcgbihlWzBdKTticmVhaztjYXNlIDI6dGhpc1tEXT1uZXcgbihlWzBdLGVbMV0pO2JyZWFrO2Nhc2UgMzp0aGlzW0RdPW5ldyBuKGVbMF0sZVsxXSxlWzJdKTticmVhaztjYXNlIDQ6dGhpc1tEXT1uZXcgbihlWzBdLGVbMV0sZVsyXSxlWzNdKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiQXJnIGxpc3QgdG9vIGxvbmcuIil9fSxUKGJbdF0sbik7dmFyIG8saT1uZXcgbigoZnVuY3Rpb24oKXt9KSk7Zm9yKG8gaW4gaSkiWE1MSHR0cFJlcXVlc3QiPT09dCYmInJlc3BvbnNlQmxvYiI9PT1vfHwoZnVuY3Rpb24obil7ImZ1bmN0aW9uIj09dHlwZW9mIGlbbl0/Ylt0XS5wcm90b3R5cGVbbl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tEXVtuXS5hcHBseSh0aGlzW0RdLGFyZ3VtZW50cyl9OmUoYlt0XS5wcm90b3R5cGUsbix7c2V0OmZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlPyh0aGlzW0RdW25dPW0oZSx0KyIuIituKSxUKHRoaXNbRF1bbl0sZSkpOnRoaXNbRF1bbl09ZX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbRF1bbl19fSl9KShvKTtmb3IobyBpbiBuKSJwcm90b3R5cGUiIT09byYmbi5oYXNPd25Qcm9wZXJ0eShvKSYmKGJbdF1bb109bltvXSl9fWZ1bmN0aW9uIFIoZSxvLGkpe2Zvcih2YXIgYT1lO2EmJiFhLmhhc093blByb3BlcnR5KG8pOylhPW4oYSk7IWEmJmVbb10mJihhPWUpO3ZhciByPWYobykscz1udWxsO2lmKGEmJighKHM9YVtyXSl8fCFhLmhhc093blByb3BlcnR5KHIpKSYmKHM9YVtyXT1hW29dLEMoYSYmdChhLG8pKSkpe3ZhciBsPWkocyxyLG8pO2Fbb109ZnVuY3Rpb24oKXtyZXR1cm4gbCh0aGlzLGFyZ3VtZW50cyl9LFQoYVtvXSxzKX1yZXR1cm4gc31mdW5jdGlvbiBBKHQsZSxuKXt2YXIgbz1udWxsO2Z1bmN0aW9uIGkodCl7dmFyIGU9dC5kYXRhO3JldHVybiBlLmFyZ3NbZS5jYklkeF09ZnVuY3Rpb24oKXt0Lmludm9rZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG8uYXBwbHkoZS50YXJnZXQsZS5hcmdzKSx0fW89Uih0LGUsKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG8pe3ZhciBhPW4oZSxvKTtyZXR1cm4gYS5jYklkeD49MCYmImZ1bmN0aW9uIj09dHlwZW9mIG9bYS5jYklkeF0/dShhLm5hbWUsb1thLmNiSWR4XSxhLGkpOnQuYXBwbHkoZSxvKX19KSl9ZnVuY3Rpb24gVCh0LGUpe3RbZigiT3JpZ2luYWxEZWxlZ2F0ZSIpXT1lfXZhciBOPSExLHo9ITE7ZnVuY3Rpb24gSSgpe2lmKE4pcmV0dXJuIHo7Tj0hMDt0cnl7dmFyIHQ9aC5uYXZpZ2F0b3IudXNlckFnZW50Oy0xPT09dC5pbmRleE9mKCJNU0lFICIpJiYtMT09PXQuaW5kZXhPZigiVHJpZGVudC8iKSYmLTE9PT10LmluZGV4T2YoIkVkZ2UvIil8fCh6PSEwKX1jYXRjaCh0KXt9cmV0dXJuIHp9Ci8qKgogICAgICAgICAqIEBsaWNlbnNlCiAgICAgICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAgICAgKgogICAgICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICAgICAqL1pvbmUuX19sb2FkX3BhdGNoKCJab25lQXdhcmVQcm9taXNlIiwoZnVuY3Rpb24odCxlLG4pe3ZhciBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsaT1PYmplY3QuZGVmaW5lUHJvcGVydHksYT1uLnN5bWJvbCxyPVtdLHM9ITA9PT10W2EoIkRJU0FCTEVfV1JBUFBJTkdfVU5DQVVHSFRfUFJPTUlTRV9SRUpFQ1RJT04iKV0sbD1hKCJQcm9taXNlIiksYz1hKCJ0aGVuIik7bi5vblVuaGFuZGxlZEVycm9yPWZ1bmN0aW9uKHQpe2lmKG4uc2hvd1VuY2F1Z2h0RXJyb3IoKSl7dmFyIGU9dCYmdC5yZWplY3Rpb247ZT9jb25zb2xlLmVycm9yKCJVbmhhbmRsZWQgUHJvbWlzZSByZWplY3Rpb246IixlIGluc3RhbmNlb2YgRXJyb3I/ZS5tZXNzYWdlOmUsIjsgWm9uZToiLHQuem9uZS5uYW1lLCI7IFRhc2s6Iix0LnRhc2smJnQudGFzay5zb3VyY2UsIjsgVmFsdWU6IixlLGUgaW5zdGFuY2VvZiBFcnJvcj9lLnN0YWNrOnZvaWQgMCk6Y29uc29sZS5lcnJvcih0KX19LG4ubWljcm90YXNrRHJhaW5Eb25lPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PWZ1bmN0aW9uKCl7dmFyIHQ9ci5zaGlmdCgpO3RyeXt0LnpvbmUucnVuR3VhcmRlZCgoZnVuY3Rpb24oKXtpZih0LnRocm93T3JpZ2luYWwpdGhyb3cgdC5yZWplY3Rpb247dGhyb3cgdH0pKX1jYXRjaCh0KXshKGZ1bmN0aW9uIG8odCl7bi5vblVuaGFuZGxlZEVycm9yKHQpO3RyeXt2YXIgbz1lW2RdOyJmdW5jdGlvbiI9PXR5cGVvZiBvJiZvLmNhbGwodGhpcyx0KX1jYXRjaCh0KXt9fSkodCl9fTtyLmxlbmd0aDspdCgpfTt2YXIgZD1hKCJ1bmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uSGFuZGxlciIpO2Z1bmN0aW9uIHAodCl7cmV0dXJuIHQmJnQudGhlbn1mdW5jdGlvbiBtKHQpe3JldHVybiB0fWZ1bmN0aW9uIHUodCl7cmV0dXJuIEQucmVqZWN0KHQpfXZhciBmPWEoInN0YXRlIiksZz1hKCJ2YWx1ZSIpLGg9YSgiZmluYWxseSIpLGI9YSgicGFyZW50UHJvbWlzZVZhbHVlIikseT1hKCJwYXJlbnRQcm9taXNlU3RhdGUiKSxfPW51bGwsQz0hMCxNPSExO2Z1bmN0aW9uIHYodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dHJ5e08odCxlLG4pfWNhdGNoKGUpe08odCwhMSxlKX19fXZhciB4PWEoImN1cnJlbnRUYXNrVHJhY2UiKTtmdW5jdGlvbiBPKHQsbyxhKXt2YXIgbCxjPShsPSExLGZ1bmN0aW9uIHQoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7bHx8KGw9ITAsZS5hcHBseShudWxsLGFyZ3VtZW50cykpfX0pO2lmKHQ9PT1hKXRocm93IG5ldyBUeXBlRXJyb3IoIlByb21pc2UgcmVzb2x2ZWQgd2l0aCBpdHNlbGYiKTtpZih0W2ZdPT09Xyl7dmFyIGQ9bnVsbDt0cnl7Im9iamVjdCIhPXR5cGVvZiBhJiYiZnVuY3Rpb24iIT10eXBlb2YgYXx8KGQ9YSYmYS50aGVuKX1jYXRjaChlKXtyZXR1cm4gYygoZnVuY3Rpb24oKXtPKHQsITEsZSl9KSkoKSx0fWlmKG8hPT1NJiZhIGluc3RhbmNlb2YgRCYmYS5oYXNPd25Qcm9wZXJ0eShmKSYmYS5oYXNPd25Qcm9wZXJ0eShnKSYmYVtmXSE9PV8pdyhhKSxPKHQsYVtmXSxhW2ddKTtlbHNlIGlmKG8hPT1NJiYiZnVuY3Rpb24iPT10eXBlb2YgZCl0cnl7ZC5jYWxsKGEsYyh2KHQsbykpLGModih0LCExKSkpfWNhdGNoKGUpe2MoKGZ1bmN0aW9uKCl7Tyh0LCExLGUpfSkpKCl9ZWxzZXt0W2ZdPW87dmFyIHA9dFtnXTtpZih0W2ddPWEsdFtoXT09PWgmJm89PT1DJiYodFtmXT10W3ldLHRbZ109dFtiXSksbz09PU0mJmEgaW5zdGFuY2VvZiBFcnJvcil7dmFyIG09ZS5jdXJyZW50VGFzayYmZS5jdXJyZW50VGFzay5kYXRhJiZlLmN1cnJlbnRUYXNrLmRhdGEuX19jcmVhdGlvblRyYWNlX187bSYmaShhLHgse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLHZhbHVlOm19KX1mb3IodmFyIHU9MDt1PHAubGVuZ3RoOylrKHQscFt1KytdLHBbdSsrXSxwW3UrK10scFt1KytdKTtpZigwPT1wLmxlbmd0aCYmbz09TSl7dFtmXT0wO3ZhciBQPWE7dHJ5e3Rocm93IG5ldyBFcnJvcigiVW5jYXVnaHQgKGluIHByb21pc2UpOiAiKyhmdW5jdGlvbiBTKHQpe3JldHVybiB0JiZ0LnRvU3RyaW5nPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZz8odC5jb25zdHJ1Y3RvciYmdC5jb25zdHJ1Y3Rvci5uYW1lfHwiIikrIjogIitKU09OLnN0cmluZ2lmeSh0KTp0P3QudG9TdHJpbmcoKTpPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9KShhKSsoYSYmYS5zdGFjaz8iXG4iK2Euc3RhY2s6IiIpKX1jYXRjaCh0KXtQPXR9cyYmKFAudGhyb3dPcmlnaW5hbD0hMCksUC5yZWplY3Rpb249YSxQLnByb21pc2U9dCxQLnpvbmU9ZS5jdXJyZW50LFAudGFzaz1lLmN1cnJlbnRUYXNrLHIucHVzaChQKSxuLnNjaGVkdWxlTWljcm9UYXNrKCl9fX1yZXR1cm4gdH12YXIgUD1hKCJyZWplY3Rpb25IYW5kbGVkSGFuZGxlciIpO2Z1bmN0aW9uIHcodCl7aWYoMD09PXRbZl0pe3RyeXt2YXIgbj1lW1BdO24mJiJmdW5jdGlvbiI9PXR5cGVvZiBuJiZuLmNhbGwodGhpcyx7cmVqZWN0aW9uOnRbZ10scHJvbWlzZTp0fSl9Y2F0Y2godCl7fXRbZl09TTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKyl0PT09cltvXS5wcm9taXNlJiZyLnNwbGljZShvLDEpfX1mdW5jdGlvbiBrKHQsZSxuLG8saSl7dyh0KTt2YXIgYT10W2ZdLHI9YT8iZnVuY3Rpb24iPT10eXBlb2Ygbz9vOm06ImZ1bmN0aW9uIj09dHlwZW9mIGk/aTp1O2Uuc2NoZWR1bGVNaWNyb1Rhc2soIlByb21pc2UudGhlbiIsKGZ1bmN0aW9uKCl7dHJ5e3ZhciBvPXRbZ10saT0hIW4mJmg9PT1uW2hdO2kmJihuW2JdPW8sblt5XT1hKTt2YXIgcz1lLnJ1bihyLHZvaWQgMCxpJiZyIT09dSYmciE9PW0/W106W29dKTtPKG4sITAscyl9Y2F0Y2godCl7TyhuLCExLHQpfX0pLG4pfXZhciBTPWZ1bmN0aW9uKCl7fSxEPShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dmFyIG49dGhpcztpZighKG4gaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgRXJyb3IoIk11c3QgYmUgYW4gaW5zdGFuY2VvZiBQcm9taXNlLiIpO25bZl09XyxuW2ddPVtdO3RyeXtlJiZlKHYobixDKSx2KG4sTSkpfWNhdGNoKHQpe08obiwhMSx0KX19cmV0dXJuIHQudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24gWm9uZUF3YXJlUHJvbWlzZSgpIHsgW25hdGl2ZSBjb2RlXSB9In0sdC5yZXNvbHZlPWZ1bmN0aW9uKHQpe3JldHVybiBPKG5ldyB0aGlzKG51bGwpLEMsdCl9LHQucmVqZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBPKG5ldyB0aGlzKG51bGwpLE0sdCl9LHQucmFjZT1mdW5jdGlvbih0KXt2YXIgZSxuLG89bmV3IHRoaXMoKGZ1bmN0aW9uKHQsbyl7ZT10LG49b30pKTtmdW5jdGlvbiBpKHQpe2UodCl9ZnVuY3Rpb24gYSh0KXtuKHQpfWZvcih2YXIgcj0wLHM9dDtyPHMubGVuZ3RoO3IrKyl7dmFyIGw9c1tyXTtwKGwpfHwobD10aGlzLnJlc29sdmUobCkpLGwudGhlbihpLGEpfXJldHVybiBvfSx0LmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gdC5hbGxXaXRoQ2FsbGJhY2soZSl9LHQuYWxsU2V0dGxlZD1mdW5jdGlvbihlKXtyZXR1cm4odGhpcyYmdGhpcy5wcm90b3R5cGUgaW5zdGFuY2VvZiB0P3RoaXM6dCkuYWxsV2l0aENhbGxiYWNrKGUse3RoZW5DYWxsYmFjazpmdW5jdGlvbih0KXtyZXR1cm57c3RhdHVzOiJmdWxmaWxsZWQiLHZhbHVlOnR9fSxlcnJvckNhbGxiYWNrOmZ1bmN0aW9uKHQpe3JldHVybntzdGF0dXM6InJlamVjdGVkIixyZWFzb246dH19fSl9LHQuYWxsV2l0aENhbGxiYWNrPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLG8saT1uZXcgdGhpcygoZnVuY3Rpb24odCxlKXtuPXQsbz1lfSkpLGE9MixyPTAscz1bXSxsPWZ1bmN0aW9uKHQpe3AodCl8fCh0PWMucmVzb2x2ZSh0KSk7dmFyIGk9cjt0cnl7dC50aGVuKChmdW5jdGlvbih0KXtzW2ldPWU/ZS50aGVuQ2FsbGJhY2sodCk6dCwwPT0tLWEmJm4ocyl9KSwoZnVuY3Rpb24odCl7ZT8oc1tpXT1lLmVycm9yQ2FsbGJhY2sodCksMD09LS1hJiZuKHMpKTpvKHQpfSkpfWNhdGNoKHQpe28odCl9YSsrLHIrK30sYz10aGlzLGQ9MCxtPXQ7ZDxtLmxlbmd0aDtkKyspbChtW2RdKTtyZXR1cm4gMD09KGEtPTIpJiZuKHMpLGl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxTeW1ib2wudG9TdHJpbmdUYWcse2dldDpmdW5jdGlvbigpe3JldHVybiJQcm9taXNlIn0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsU3ltYm9sLnNwZWNpZXMse2dldDpmdW5jdGlvbigpe3JldHVybiB0fSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24obixvKXt2YXIgaT10aGlzLmNvbnN0cnVjdG9yW1N5bWJvbC5zcGVjaWVzXTtpJiYiZnVuY3Rpb24iPT10eXBlb2YgaXx8KGk9dGhpcy5jb25zdHJ1Y3Rvcnx8dCk7dmFyIGE9bmV3IGkoUykscj1lLmN1cnJlbnQ7cmV0dXJuIHRoaXNbZl09PV8/dGhpc1tnXS5wdXNoKHIsYSxuLG8pOmsodGhpcyxyLGEsbixvKSxhfSx0LnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aGVuKG51bGwsdCl9LHQucHJvdG90eXBlLmZpbmFsbHk9ZnVuY3Rpb24obil7dmFyIG89dGhpcy5jb25zdHJ1Y3RvcltTeW1ib2wuc3BlY2llc107byYmImZ1bmN0aW9uIj09dHlwZW9mIG98fChvPXQpO3ZhciBpPW5ldyBvKFMpO2lbaF09aDt2YXIgYT1lLmN1cnJlbnQ7cmV0dXJuIHRoaXNbZl09PV8/dGhpc1tnXS5wdXNoKGEsaSxuLG4pOmsodGhpcyxhLGksbixuKSxpfSx0fSkoKTtELnJlc29sdmU9RC5yZXNvbHZlLEQucmVqZWN0PUQucmVqZWN0LEQucmFjZT1ELnJhY2UsRC5hbGw9RC5hbGw7dmFyIEU9dFtsXT10LlByb21pc2U7dC5Qcm9taXNlPUQ7dmFyIEE9YSgidGhlblBhdGNoZWQiKTtmdW5jdGlvbiBUKHQpe3ZhciBlPXQucHJvdG90eXBlLG49byhlLCJ0aGVuIik7aWYoIW58fCExIT09bi53cml0YWJsZSYmbi5jb25maWd1cmFibGUpe3ZhciBpPWUudGhlbjtlW2NdPWksdC5wcm90b3R5cGUudGhlbj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7cmV0dXJuIG5ldyBEKChmdW5jdGlvbih0LGUpe2kuY2FsbChuLHQsZSl9KSkudGhlbih0LGUpfSx0W0FdPSEwfX1yZXR1cm4gbi5wYXRjaFRoZW49VCxFJiYoVChFKSxSKHQsImZldGNoIiwoZnVuY3Rpb24odCl7cmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIG89dC5hcHBseShlLG4pO2lmKG8gaW5zdGFuY2VvZiBEKXJldHVybiBvO3ZhciBpPW8uY29uc3RydWN0b3I7cmV0dXJuIGlbQV18fFQoaSksb319KSh0KX0pKSksUHJvbWlzZVtlLl9fc3ltYm9sX18oInVuY2F1Z2h0UHJvbWlzZUVycm9ycyIpXT1yLER9KSksCi8qKgogICAgICAgICAqIEBsaWNlbnNlCiAgICAgICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAgICAgKgogICAgICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICAgICAqLwpab25lLl9fbG9hZF9wYXRjaCgidG9TdHJpbmciLChmdW5jdGlvbih0KXt2YXIgZT1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcsbj1mKCJPcmlnaW5hbERlbGVnYXRlIiksbz1mKCJQcm9taXNlIiksaT1mKCJFcnJvciIpLGE9ZnVuY3Rpb24gYSgpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzKXt2YXIgcj10aGlzW25dO2lmKHIpcmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHI/ZS5jYWxsKHIpOk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyKTtpZih0aGlzPT09UHJvbWlzZSl7dmFyIHM9dFtvXTtpZihzKXJldHVybiBlLmNhbGwocyl9aWYodGhpcz09PUVycm9yKXt2YXIgbD10W2ldO2lmKGwpcmV0dXJuIGUuY2FsbChsKX19cmV0dXJuIGUuY2FsbCh0aGlzKX07YVtuXT1lLEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZz1hO3ZhciByPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBQcm9taXNlJiZ0aGlzIGluc3RhbmNlb2YgUHJvbWlzZT8iW29iamVjdCBQcm9taXNlXSI6ci5jYWxsKHRoaXMpfX0pKTsKLyoqCiAgICAgICAgICogQGxpY2Vuc2UKICAgICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICAgICAqCiAgICAgICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgICAgICovCnZhciBIPSExO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93KXRyeXt2YXIgRj1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sInBhc3NpdmUiLHtnZXQ6ZnVuY3Rpb24oKXtIPSEwfX0pO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0IixGLEYpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixGLEYpfWNhdGNoKHQpe0g9ITF9dmFyIEw9e3VzZUc6ITB9LEI9e30sVj17fSxqPW5ldyBSZWdFeHAoIl4iK3ArIihcXHcrKSh0cnVlfGZhbHNlKSQiKSxVPWYoInByb3BhZ2F0aW9uU3RvcHBlZCIpO2Z1bmN0aW9uIEcodCxlKXt2YXIgbj0oZT9lKHQpOnQpK2Qsbz0oZT9lKHQpOnQpK2MsaT1wK24sYT1wK287Qlt0XT17fSxCW3RdLmZhbHNlPWksQlt0XS50cnVlPWF9ZnVuY3Rpb24gVyh0LGUsbyl7dmFyIGk9byYmby5hZGR8fGEscz1vJiZvLnJtfHxyLGw9byYmby5saXN0ZW5lcnN8fCJldmVudExpc3RlbmVycyIsbT1vJiZvLnJtQWxsfHwicmVtb3ZlQWxsTGlzdGVuZXJzIix1PWYoaSksZz0iLiIraSsiOiIsaD1mdW5jdGlvbih0LGUsbil7aWYoIXQuaXNSZW1vdmVkKXt2YXIgbz10LmNhbGxiYWNrOyJvYmplY3QiPT10eXBlb2YgbyYmby5oYW5kbGVFdmVudCYmKHQuY2FsbGJhY2s9ZnVuY3Rpb24odCl7cmV0dXJuIG8uaGFuZGxlRXZlbnQodCl9LHQub3JpZ2luYWxEZWxlZ2F0ZT1vKSx0Lmludm9rZSh0LGUsW25dKTt2YXIgaT10Lm9wdGlvbnM7aSYmIm9iamVjdCI9PXR5cGVvZiBpJiZpLm9uY2UmJmVbc10uY2FsbChlLG4udHlwZSx0Lm9yaWdpbmFsRGVsZWdhdGU/dC5vcmlnaW5hbERlbGVnYXRlOnQuY2FsbGJhY2ssaSl9fSxiPWZ1bmN0aW9uKGUpe2lmKGU9ZXx8dC5ldmVudCl7dmFyIG49dGhpc3x8ZS50YXJnZXR8fHQsbz1uW0JbZS50eXBlXS5mYWxzZV07aWYobylpZigxPT09by5sZW5ndGgpaChvWzBdLG4sZSk7ZWxzZSBmb3IodmFyIGk9by5zbGljZSgpLGE9MDthPGkubGVuZ3RoJiYoIWV8fCEwIT09ZVtVXSk7YSsrKWgoaVthXSxuLGUpfX0seT1mdW5jdGlvbihlKXtpZihlPWV8fHQuZXZlbnQpe3ZhciBuPXRoaXN8fGUudGFyZ2V0fHx0LG89bltCW2UudHlwZV0udHJ1ZV07aWYobylpZigxPT09by5sZW5ndGgpaChvWzBdLG4sZSk7ZWxzZSBmb3IodmFyIGk9by5zbGljZSgpLGE9MDthPGkubGVuZ3RoJiYoIWV8fCEwIT09ZVtVXSk7YSsrKWgoaVthXSxuLGUpfX07ZnVuY3Rpb24gXyhlLG8pe2lmKCFlKXJldHVybiExO3ZhciBhPSEwO28mJnZvaWQgMCE9PW8udXNlRyYmKGE9by51c2VHKTt2YXIgcj1vJiZvLnZoLGg9ITA7byYmdm9pZCAwIT09by5jaGtEdXAmJihoPW8uY2hrRHVwKTt2YXIgXz0hMTtvJiZ2b2lkIDAhPT1vLnJ0JiYoXz1vLnJ0KTtmb3IodmFyIEM9ZTtDJiYhQy5oYXNPd25Qcm9wZXJ0eShpKTspQz1uKEMpO2lmKCFDJiZlW2ldJiYoQz1lKSwhQylyZXR1cm4hMTtpZihDW3VdKXJldHVybiExO3ZhciBNLHg9byYmby5ldmVudE5hbWVUb1N0cmluZyxPPXt9LFA9Q1t1XT1DW2ldLHc9Q1tmKHMpXT1DW3NdLGs9Q1tmKGwpXT1DW2xdLFM9Q1tmKG0pXT1DW21dO2Z1bmN0aW9uIEQodCxlKXtyZXR1cm4hSCYmIm9iamVjdCI9PXR5cGVvZiB0JiZ0PyEhdC5jYXB0dXJlOkgmJmU/ImJvb2xlYW4iPT10eXBlb2YgdD97Y2FwdHVyZTp0LHBhc3NpdmU6ITB9OnQ/Im9iamVjdCI9PXR5cGVvZiB0JiYhMSE9PXQucGFzc2l2ZT9PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3Bhc3NpdmU6ITB9KTp0OntwYXNzaXZlOiEwfTp0fW8mJm8ucHJlcGVuZCYmKE09Q1tmKG8ucHJlcGVuZCldPUNbby5wcmVwZW5kXSk7dmFyIEU9YT9mdW5jdGlvbih0KXtpZighTy5pc0V4aXN0aW5nKXJldHVybiBQLmNhbGwoTy50YXJnZXQsTy5ldmVudE5hbWUsTy5jYXB0dXJlP3k6YixPLm9wdGlvbnMpfTpmdW5jdGlvbih0KXtyZXR1cm4gUC5jYWxsKE8udGFyZ2V0LE8uZXZlbnROYW1lLHQuaW52b2tlLE8ub3B0aW9ucyl9LFI9YT9mdW5jdGlvbih0KXtpZighdC5pc1JlbW92ZWQpe3ZhciBlPUJbdC5ldmVudE5hbWVdLG49dm9pZCAwO2UmJihuPWVbdC5jYXB0dXJlP2M6ZF0pO3ZhciBvPW4mJnQudGFyZ2V0W25dO2lmKG8pZm9yKHZhciBpPTA7aTxvLmxlbmd0aDtpKyspaWYob1tpXT09PXQpe28uc3BsaWNlKGksMSksdC5pc1JlbW92ZWQ9ITAsMD09PW8ubGVuZ3RoJiYodC5hbGxSZW1vdmVkPSEwLHQudGFyZ2V0W25dPW51bGwpO2JyZWFrfX1pZih0LmFsbFJlbW92ZWQpcmV0dXJuIHcuY2FsbCh0LnRhcmdldCx0LmV2ZW50TmFtZSx0LmNhcHR1cmU/eTpiLHQub3B0aW9ucyl9OmZ1bmN0aW9uKHQpe3JldHVybiB3LmNhbGwodC50YXJnZXQsdC5ldmVudE5hbWUsdC5pbnZva2UsdC5vcHRpb25zKX0sQT1vJiZvLmRpZmY/by5kaWZmOmZ1bmN0aW9uKHQsZSl7dmFyIG49dHlwZW9mIGU7cmV0dXJuImZ1bmN0aW9uIj09PW4mJnQuY2FsbGJhY2s9PT1lfHwib2JqZWN0Ij09PW4mJnQub3JpZ2luYWxEZWxlZ2F0ZT09PWV9LE49Wm9uZVtmKCJVTlBBVENIRURfRVZFTlRTIildLHo9dFtmKCJQQVNTSVZFX0VWRU5UUyIpXSxJPWZ1bmN0aW9uKGUsbixpLHMsbCxwKXtyZXR1cm4gdm9pZCAwPT09bCYmKGw9ITEpLHZvaWQgMD09PXAmJihwPSExKSxmdW5jdGlvbigpe3ZhciBtPXRoaXN8fHQsdT1hcmd1bWVudHNbMF07byYmby50cmFuc2ZlckV2ZW50TmFtZSYmKHU9by50cmFuc2ZlckV2ZW50TmFtZSh1KSk7dmFyIGY9YXJndW1lbnRzWzFdO2lmKCFmKXJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZih2JiYidW5jYXVnaHRFeGNlcHRpb24iPT09dSlyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGc9ITE7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGYpe2lmKCFmLmhhbmRsZUV2ZW50KXJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtnPSEwfWlmKCFyfHxyKGUsZixtLGFyZ3VtZW50cykpe3ZhciBiPUgmJiEheiYmLTEhPT16LmluZGV4T2YodSkseT1EKGFyZ3VtZW50c1syXSxiKTtpZihOKWZvcih2YXIgXz0wO188Ti5sZW5ndGg7XysrKWlmKHU9PT1OW19dKXJldHVybiBiP2UuY2FsbChtLHUsZix5KTplLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgQz0hIXkmJigiYm9vbGVhbiI9PXR5cGVvZiB5fHx5LmNhcHR1cmUpLE09ISgheXx8Im9iamVjdCIhPXR5cGVvZiB5KSYmeS5vbmNlLFA9Wm9uZS5jdXJyZW50LHc9Qlt1XTt3fHwoRyh1LHgpLHc9Qlt1XSk7dmFyIGssUz13W0M/YzpkXSxFPW1bU10sUj0hMTtpZihFKXtpZihSPSEwLGgpZm9yKF89MDtfPEUubGVuZ3RoO18rKylpZihBKEVbX10sZikpcmV0dXJufWVsc2UgRT1tW1NdPVtdO3ZhciBUPW0uY29uc3RydWN0b3IubmFtZSxJPVZbVF07SSYmKGs9SVt1XSksa3x8KGs9VCtuKyh4P3godSk6dSkpLE8ub3B0aW9ucz15LE0mJihPLm9wdGlvbnMub25jZT0hMSksTy50YXJnZXQ9bSxPLmNhcHR1cmU9QyxPLmV2ZW50TmFtZT11LE8uaXNFeGlzdGluZz1SO3ZhciBGPWE/TDp2b2lkIDA7RiYmKEYudGFza0RhdGE9Tyk7dmFyIGo9UC5zY2hlZHVsZUV2ZW50VGFzayhrLGYsRixpLHMpO3JldHVybiBPLnRhcmdldD1udWxsLEYmJihGLnRhc2tEYXRhPW51bGwpLE0mJih5Lm9uY2U9ITApLChIfHwiYm9vbGVhbiIhPXR5cGVvZiBqLm9wdGlvbnMpJiYoai5vcHRpb25zPXkpLGoudGFyZ2V0PW0sai5jYXB0dXJlPUMsai5ldmVudE5hbWU9dSxnJiYoai5vcmlnaW5hbERlbGVnYXRlPWYpLHA/RS51bnNoaWZ0KGopOkUucHVzaChqKSxsP206dm9pZCAwfX19O3JldHVybiBDW2ldPUkoUCxnLEUsUixfKSxNJiYoQy5wcmVwZW5kTGlzdGVuZXI9SShNLCIucHJlcGVuZExpc3RlbmVyOiIsKGZ1bmN0aW9uKHQpe3JldHVybiBNLmNhbGwoTy50YXJnZXQsTy5ldmVudE5hbWUsdC5pbnZva2UsTy5vcHRpb25zKX0pLFIsXywhMCkpLENbc109ZnVuY3Rpb24oKXt2YXIgZT10aGlzfHx0LG49YXJndW1lbnRzWzBdO28mJm8udHJhbnNmZXJFdmVudE5hbWUmJihuPW8udHJhbnNmZXJFdmVudE5hbWUobikpO3ZhciBpPWFyZ3VtZW50c1syXSxhPSEhaSYmKCJib29sZWFuIj09dHlwZW9mIGl8fGkuY2FwdHVyZSkscz1hcmd1bWVudHNbMV07aWYoIXMpcmV0dXJuIHcuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCFyfHxyKHcscyxlLGFyZ3VtZW50cykpe3ZhciBsLG09QltuXTttJiYobD1tW2E/YzpkXSk7dmFyIHU9bCYmZVtsXTtpZih1KWZvcih2YXIgZj0wO2Y8dS5sZW5ndGg7ZisrKXt2YXIgZz11W2ZdO2lmKEEoZyxzKSlyZXR1cm4gdS5zcGxpY2UoZiwxKSxnLmlzUmVtb3ZlZD0hMCwwPT09dS5sZW5ndGgmJihnLmFsbFJlbW92ZWQ9ITAsZVtsXT1udWxsLCJzdHJpbmciPT10eXBlb2YgbiYmKGVbcCsiT05fUFJPUEVSVFkiK25dPW51bGwpKSxnLnpvbmUuY2FuY2VsVGFzayhnKSxfP2U6dm9pZCAwfXJldHVybiB3LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19LENbbF09ZnVuY3Rpb24oKXt2YXIgZT10aGlzfHx0LG49YXJndW1lbnRzWzBdO28mJm8udHJhbnNmZXJFdmVudE5hbWUmJihuPW8udHJhbnNmZXJFdmVudE5hbWUobikpO2Zvcih2YXIgaT1bXSxhPVkoZSx4P3gobik6bikscj0wO3I8YS5sZW5ndGg7cisrKXt2YXIgcz1hW3JdO2kucHVzaChzLm9yaWdpbmFsRGVsZWdhdGU/cy5vcmlnaW5hbERlbGVnYXRlOnMuY2FsbGJhY2spfXJldHVybiBpfSxDW21dPWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8dCxuPWFyZ3VtZW50c1swXTtpZihuKXtvJiZvLnRyYW5zZmVyRXZlbnROYW1lJiYobj1vLnRyYW5zZmVyRXZlbnROYW1lKG4pKTt2YXIgaT1CW25dO2lmKGkpe3ZhciBhPWVbaS5mYWxzZV0scj1lW2kudHJ1ZV07aWYoYSl7dmFyIGw9YS5zbGljZSgpO2ZvcihwPTA7cDxsLmxlbmd0aDtwKyspdGhpc1tzXS5jYWxsKHRoaXMsbiwoYz1sW3BdKS5vcmlnaW5hbERlbGVnYXRlP2Mub3JpZ2luYWxEZWxlZ2F0ZTpjLmNhbGxiYWNrLGMub3B0aW9ucyl9aWYocilmb3IobD1yLnNsaWNlKCkscD0wO3A8bC5sZW5ndGg7cCsrKXt2YXIgYzt0aGlzW3NdLmNhbGwodGhpcyxuLChjPWxbcF0pLm9yaWdpbmFsRGVsZWdhdGU/Yy5vcmlnaW5hbERlbGVnYXRlOmMuY2FsbGJhY2ssYy5vcHRpb25zKX19fWVsc2V7Zm9yKHZhciBkPU9iamVjdC5rZXlzKGUpLHA9MDtwPGQubGVuZ3RoO3ArKyl7dmFyIHU9ai5leGVjKGRbcF0pLGY9dSYmdVsxXTtmJiYicmVtb3ZlTGlzdGVuZXIiIT09ZiYmdGhpc1ttXS5jYWxsKHRoaXMsZil9dGhpc1ttXS5jYWxsKHRoaXMsInJlbW92ZUxpc3RlbmVyIil9aWYoXylyZXR1cm4gdGhpc30sVChDW2ldLFApLFQoQ1tzXSx3KSxTJiZUKENbbV0sUyksayYmVChDW2xdLGspLCEwfWZvcih2YXIgQz1bXSxNPTA7TTxlLmxlbmd0aDtNKyspQ1tNXT1fKGVbTV0sbyk7cmV0dXJuIEN9ZnVuY3Rpb24gWSh0LGUpe2lmKCFlKXt2YXIgbj1bXTtmb3IodmFyIG8gaW4gdCl7dmFyIGk9ai5leGVjKG8pLGE9aSYmaVsxXTtpZihhJiYoIWV8fGE9PT1lKSl7dmFyIHI9dFtvXTtpZihyKWZvcih2YXIgcz0wO3M8ci5sZW5ndGg7cysrKW4ucHVzaChyW3NdKX19cmV0dXJuIG59dmFyIGw9QltlXTtsfHwoRyhlKSxsPUJbZV0pO3ZhciBjPXRbbC5mYWxzZV0sZD10W2wudHJ1ZV07cmV0dXJuIGM/ZD9jLmNvbmNhdChkKTpjLnNsaWNlKCk6ZD9kLnNsaWNlKCk6W119ZnVuY3Rpb24gcSh0LGUpe3ZhciBuPXQuRXZlbnQ7biYmbi5wcm90b3R5cGUmJmUucGF0Y2hNZXRob2Qobi5wcm90b3R5cGUsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe2VbVV09ITAsdCYmdC5hcHBseShlLG4pfX0pKX0KLyoqCiAgICAgICAgICogQGxpY2Vuc2UKICAgICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICAgICAqCiAgICAgICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgICAgICovZnVuY3Rpb24gWih0LGUsbixvLGkpe3ZhciBhPVpvbmUuX19zeW1ib2xfXyhvKTtpZighZVthXSl7dmFyIHI9ZVthXT1lW29dO2Vbb109ZnVuY3Rpb24oYSxzLGwpe3JldHVybiBzJiZzLnByb3RvdHlwZSYmaS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgaT1uKyIuIitvKyI6OiIrZSxhPXMucHJvdG90eXBlO2lmKGEuaGFzT3duUHJvcGVydHkoZSkpe3ZhciByPXQuT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEsZSk7ciYmci52YWx1ZT8oci52YWx1ZT10LndyYXBXaXRoQ3VycmVudFpvbmUoci52YWx1ZSxpKSx0Ll9yZWRlZmluZVByb3BlcnR5KHMucHJvdG90eXBlLGUscikpOmFbZV0mJihhW2VdPXQud3JhcFdpdGhDdXJyZW50Wm9uZShhW2VdLGkpKX1lbHNlIGFbZV0mJihhW2VdPXQud3JhcFdpdGhDdXJyZW50Wm9uZShhW2VdLGkpKX0pKSxyLmNhbGwoZSxhLHMsbCl9LHQuYXR0YWNoT3JpZ2luVG9QYXRjaGVkKGVbb10scil9fQovKioKICAgICAgICAgKiBAbGljZW5zZQogICAgICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgICAgICoKICAgICAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAgICAgKi92YXIgWCxLLEosUSwkLHR0PVsiYWJzb2x1dGVkZXZpY2VvcmllbnRhdGlvbiIsImFmdGVyaW5wdXQiLCJhZnRlcnByaW50IiwiYXBwaW5zdGFsbGVkIiwiYmVmb3JlaW5zdGFsbHByb21wdCIsImJlZm9yZXByaW50IiwiYmVmb3JldW5sb2FkIiwiZGV2aWNlbGlnaHQiLCJkZXZpY2Vtb3Rpb24iLCJkZXZpY2VvcmllbnRhdGlvbiIsImRldmljZW9yaWVudGF0aW9uYWJzb2x1dGUiLCJkZXZpY2Vwcm94aW1pdHkiLCJoYXNoY2hhbmdlIiwibGFuZ3VhZ2VjaGFuZ2UiLCJtZXNzYWdlIiwibW96YmVmb3JlcGFpbnQiLCJvZmZsaW5lIiwib25saW5lIiwicGFpbnQiLCJwYWdlc2hvdyIsInBhZ2VoaWRlIiwicG9wc3RhdGUiLCJyZWplY3Rpb25oYW5kbGVkIiwic3RvcmFnZSIsInVuaGFuZGxlZHJlamVjdGlvbiIsInVubG9hZCIsInVzZXJwcm94aW1pdHkiLCJ2cmRpc3BsYXljb25uZWN0ZWQiLCJ2cmRpc3BsYXlkaXNjb25uZWN0ZWQiLCJ2cmRpc3BsYXlwcmVzZW50Y2hhbmdlIl0sZXQ9WyJlbmNyeXB0ZWQiLCJ3YWl0aW5nZm9ya2V5IiwibXNuZWVka2V5IiwibW96aW50ZXJydXB0YmVnaW4iLCJtb3ppbnRlcnJ1cHRlbmQiXSxudD1bImxvYWQiXSxvdD1bImJsdXIiLCJlcnJvciIsImZvY3VzIiwibG9hZCIsInJlc2l6ZSIsInNjcm9sbCIsIm1lc3NhZ2VlcnJvciJdLGl0PVsiYm91bmNlIiwiZmluaXNoIiwic3RhcnQiXSxhdD1bImxvYWRzdGFydCIsInByb2dyZXNzIiwiYWJvcnQiLCJlcnJvciIsImxvYWQiLCJwcm9ncmVzcyIsInRpbWVvdXQiLCJsb2FkZW5kIiwicmVhZHlzdGF0ZWNoYW5nZSJdLHJ0PVsidXBncmFkZW5lZWRlZCIsImNvbXBsZXRlIiwiYWJvcnQiLCJzdWNjZXNzIiwiZXJyb3IiLCJibG9ja2VkIiwidmVyc2lvbmNoYW5nZSIsImNsb3NlIl0sc3Q9WyJjbG9zZSIsImVycm9yIiwib3BlbiIsIm1lc3NhZ2UiXSxsdD1bImVycm9yIiwibWVzc2FnZSJdLGN0PVsiYWJvcnQiLCJhbmltYXRpb25jYW5jZWwiLCJhbmltYXRpb25lbmQiLCJhbmltYXRpb25pdGVyYXRpb24iLCJhdXhjbGljayIsImJlZm9yZWlucHV0IiwiYmx1ciIsImNhbmNlbCIsImNhbnBsYXkiLCJjYW5wbGF5dGhyb3VnaCIsImNoYW5nZSIsImNvbXBvc2l0aW9uc3RhcnQiLCJjb21wb3NpdGlvbnVwZGF0ZSIsImNvbXBvc2l0aW9uZW5kIiwiY3VlY2hhbmdlIiwiY2xpY2siLCJjbG9zZSIsImNvbnRleHRtZW51IiwiY3VyZWNoYW5nZSIsImRibGNsaWNrIiwiZHJhZyIsImRyYWdlbmQiLCJkcmFnZW50ZXIiLCJkcmFnZXhpdCIsImRyYWdsZWF2ZSIsImRyYWdvdmVyIiwiZHJvcCIsImR1cmF0aW9uY2hhbmdlIiwiZW1wdGllZCIsImVuZGVkIiwiZXJyb3IiLCJmb2N1cyIsImZvY3VzaW4iLCJmb2N1c291dCIsImdvdHBvaW50ZXJjYXB0dXJlIiwiaW5wdXQiLCJpbnZhbGlkIiwia2V5ZG93biIsImtleXByZXNzIiwia2V5dXAiLCJsb2FkIiwibG9hZHN0YXJ0IiwibG9hZGVkZGF0YSIsImxvYWRlZG1ldGFkYXRhIiwibG9zdHBvaW50ZXJjYXB0dXJlIiwibW91c2Vkb3duIiwibW91c2VlbnRlciIsIm1vdXNlbGVhdmUiLCJtb3VzZW1vdmUiLCJtb3VzZW91dCIsIm1vdXNlb3ZlciIsIm1vdXNldXAiLCJtb3VzZXdoZWVsIiwib3JpZW50YXRpb25jaGFuZ2UiLCJwYXVzZSIsInBsYXkiLCJwbGF5aW5nIiwicG9pbnRlcmNhbmNlbCIsInBvaW50ZXJkb3duIiwicG9pbnRlcmVudGVyIiwicG9pbnRlcmxlYXZlIiwicG9pbnRlcmxvY2tjaGFuZ2UiLCJtb3pwb2ludGVybG9ja2NoYW5nZSIsIndlYmtpdHBvaW50ZXJsb2NrZXJjaGFuZ2UiLCJwb2ludGVybG9ja2Vycm9yIiwibW96cG9pbnRlcmxvY2tlcnJvciIsIndlYmtpdHBvaW50ZXJsb2NrZXJyb3IiLCJwb2ludGVybW92ZSIsInBvaW50b3V0IiwicG9pbnRlcm92ZXIiLCJwb2ludGVydXAiLCJwcm9ncmVzcyIsInJhdGVjaGFuZ2UiLCJyZXNldCIsInJlc2l6ZSIsInNjcm9sbCIsInNlZWtlZCIsInNlZWtpbmciLCJzZWxlY3QiLCJzZWxlY3Rpb25jaGFuZ2UiLCJzZWxlY3RzdGFydCIsInNob3ciLCJzb3J0Iiwic3RhbGxlZCIsInN1Ym1pdCIsInN1c3BlbmQiLCJ0aW1ldXBkYXRlIiwidm9sdW1lY2hhbmdlIiwidG91Y2hjYW5jZWwiLCJ0b3VjaG1vdmUiLCJ0b3VjaHN0YXJ0IiwidG91Y2hlbmQiLCJ0cmFuc2l0aW9uY2FuY2VsIiwidHJhbnNpdGlvbmVuZCIsIndhaXRpbmciLCJ3aGVlbCJdLmNvbmNhdChbIndlYmdsY29udGV4dHJlc3RvcmVkIiwid2ViZ2xjb250ZXh0bG9zdCIsIndlYmdsY29udGV4dGNyZWF0aW9uZXJyb3IiXSxbImF1dG9jb21wbGV0ZSIsImF1dG9jb21wbGV0ZWVycm9yIl0sWyJ0b2dnbGUiXSxbImFmdGVyc2NyaXB0ZXhlY3V0ZSIsImJlZm9yZXNjcmlwdGV4ZWN1dGUiLCJET01Db250ZW50TG9hZGVkIiwiZnJlZXplIiwiZnVsbHNjcmVlbmNoYW5nZSIsIm1vemZ1bGxzY3JlZW5jaGFuZ2UiLCJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlIiwibXNmdWxsc2NyZWVuY2hhbmdlIiwiZnVsbHNjcmVlbmVycm9yIiwibW96ZnVsbHNjcmVlbmVycm9yIiwid2Via2l0ZnVsbHNjcmVlbmVycm9yIiwibXNmdWxsc2NyZWVuZXJyb3IiLCJyZWFkeXN0YXRlY2hhbmdlIiwidmlzaWJpbGl0eWNoYW5nZSIsInJlc3VtZSJdLHR0LFsiYmVmb3JlY29weSIsImJlZm9yZWN1dCIsImJlZm9yZXBhc3RlIiwiY29weSIsImN1dCIsInBhc3RlIiwiZHJhZ3N0YXJ0IiwibG9hZGVuZCIsImFuaW1hdGlvbnN0YXJ0Iiwic2VhcmNoIiwidHJhbnNpdGlvbnJ1biIsInRyYW5zaXRpb25zdGFydCIsIndlYmtpdGFuaW1hdGlvbmVuZCIsIndlYmtpdGFuaW1hdGlvbml0ZXJhdGlvbiIsIndlYmtpdGFuaW1hdGlvbnN0YXJ0Iiwid2Via2l0dHJhbnNpdGlvbmVuZCJdLFsiYWN0aXZhdGUiLCJhZnRlcnVwZGF0ZSIsImFyaWFyZXF1ZXN0IiwiYmVmb3JlYWN0aXZhdGUiLCJiZWZvcmVkZWFjdGl2YXRlIiwiYmVmb3JlZWRpdGZvY3VzIiwiYmVmb3JldXBkYXRlIiwiY2VsbGNoYW5nZSIsImNvbnRyb2xzZWxlY3QiLCJkYXRhYXZhaWxhYmxlIiwiZGF0YXNldGNoYW5nZWQiLCJkYXRhc2V0Y29tcGxldGUiLCJlcnJvcnVwZGF0ZSIsImZpbHRlcmNoYW5nZSIsImxheW91dGNvbXBsZXRlIiwibG9zZWNhcHR1cmUiLCJtb3ZlIiwibW92ZWVuZCIsIm1vdmVzdGFydCIsInByb3BlcnR5Y2hhbmdlIiwicmVzaXplZW5kIiwicmVzaXplc3RhcnQiLCJyb3dlbnRlciIsInJvd2V4aXQiLCJyb3dzZGVsZXRlIiwicm93c2luc2VydGVkIiwiY29tbWFuZCIsImNvbXBhc3NuZWVkc2NhbGlicmF0aW9uIiwiZGVhY3RpdmF0ZSIsImhlbHAiLCJtc2NvbnRlbnR6b29tIiwibXNtYW5pcHVsYXRpb25zdGF0ZWNoYW5nZWQiLCJtc2dlc3R1cmVjaGFuZ2UiLCJtc2dlc3R1cmVkb3VibGV0YXAiLCJtc2dlc3R1cmVlbmQiLCJtc2dlc3R1cmVob2xkIiwibXNnZXN0dXJlc3RhcnQiLCJtc2dlc3R1cmV0YXAiLCJtc2dvdHBvaW50ZXJjYXB0dXJlIiwibXNpbmVydGlhc3RhcnQiLCJtc2xvc3Rwb2ludGVyY2FwdHVyZSIsIm1zcG9pbnRlcmNhbmNlbCIsIm1zcG9pbnRlcmRvd24iLCJtc3BvaW50ZXJlbnRlciIsIm1zcG9pbnRlcmhvdmVyIiwibXNwb2ludGVybGVhdmUiLCJtc3BvaW50ZXJtb3ZlIiwibXNwb2ludGVyb3V0IiwibXNwb2ludGVyb3ZlciIsIm1zcG9pbnRlcnVwIiwicG9pbnRlcm91dCIsIm1zc2l0ZW1vZGVqdW1wbGlzdGl0ZW1yZW1vdmVkIiwibXN0aHVtYm5haWxjbGljayIsInN0b3AiLCJzdG9yYWdlY29tbWl0Il0pO2Z1bmN0aW9uIGR0KHQsZSxuKXtpZighbnx8MD09PW4ubGVuZ3RoKXJldHVybiBlO3ZhciBvPW4uZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZS50YXJnZXQ9PT10fSkpO2lmKCFvfHwwPT09by5sZW5ndGgpcmV0dXJuIGU7dmFyIGk9b1swXS5pZ25vcmVQcm9wZXJ0aWVzO3JldHVybiBlLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuLTE9PT1pLmluZGV4T2YodCl9KSl9ZnVuY3Rpb24gcHQodCxlLG4sbyl7dCYmUyh0LGR0KHQsZSxuKSxvKX1mdW5jdGlvbiBtdCh0LGUpe2lmKCghdnx8TykmJiFab25lW3Quc3ltYm9sKCJwYXRjaEV2ZW50cyIpXSl7dmFyIG89InVuZGVmaW5lZCIhPXR5cGVvZiBXZWJTb2NrZXQsaT1lLl9fWm9uZV9pZ25vcmVfb25fcHJvcGVydGllcztpZih4KXt2YXIgYT13aW5kb3cscj0oZnVuY3Rpb24gcygpe3RyeXt2YXIgdD1oLm5hdmlnYXRvci51c2VyQWdlbnQ7aWYoLTEhPT10LmluZGV4T2YoIk1TSUUgIil8fC0xIT09dC5pbmRleE9mKCJUcmlkZW50LyIpKXJldHVybiEwfWNhdGNoKHQpe31yZXR1cm4hMX0pKCk/W3t0YXJnZXQ6YSxpZ25vcmVQcm9wZXJ0aWVzOlsiZXJyb3IiXX1dOltdO3B0KGEsY3QuY29uY2F0KFsibWVzc2FnZWVycm9yIl0pLGk/aS5jb25jYXQocik6aSxuKGEpKSxwdChEb2N1bWVudC5wcm90b3R5cGUsY3QsaSksdm9pZCAwIT09YS5TVkdFbGVtZW50JiZwdChhLlNWR0VsZW1lbnQucHJvdG90eXBlLGN0LGkpLHB0KEVsZW1lbnQucHJvdG90eXBlLGN0LGkpLHB0KEhUTUxFbGVtZW50LnByb3RvdHlwZSxjdCxpKSxwdChIVE1MTWVkaWFFbGVtZW50LnByb3RvdHlwZSxldCxpKSxwdChIVE1MRnJhbWVTZXRFbGVtZW50LnByb3RvdHlwZSx0dC5jb25jYXQob3QpLGkpLHB0KEhUTUxCb2R5RWxlbWVudC5wcm90b3R5cGUsdHQuY29uY2F0KG90KSxpKSxwdChIVE1MRnJhbWVFbGVtZW50LnByb3RvdHlwZSxudCxpKSxwdChIVE1MSUZyYW1lRWxlbWVudC5wcm90b3R5cGUsbnQsaSk7dmFyIGw9YS5IVE1MTWFycXVlZUVsZW1lbnQ7bCYmcHQobC5wcm90b3R5cGUsaXQsaSk7dmFyIGM9YS5Xb3JrZXI7YyYmcHQoYy5wcm90b3R5cGUsbHQsaSl9dmFyIGQ9ZS5YTUxIdHRwUmVxdWVzdDtkJiZwdChkLnByb3RvdHlwZSxhdCxpKTt2YXIgcD1lLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ7cCYmcHQocCYmcC5wcm90b3R5cGUsYXQsaSksInVuZGVmaW5lZCIhPXR5cGVvZiBJREJJbmRleCYmKHB0KElEQkluZGV4LnByb3RvdHlwZSxydCxpKSxwdChJREJSZXF1ZXN0LnByb3RvdHlwZSxydCxpKSxwdChJREJPcGVuREJSZXF1ZXN0LnByb3RvdHlwZSxydCxpKSxwdChJREJEYXRhYmFzZS5wcm90b3R5cGUscnQsaSkscHQoSURCVHJhbnNhY3Rpb24ucHJvdG90eXBlLHJ0LGkpLHB0KElEQkN1cnNvci5wcm90b3R5cGUscnQsaSkpLG8mJnB0KFdlYlNvY2tldC5wcm90b3R5cGUsc3QsaSl9fQovKioKICAgICAgICAgKiBAbGljZW5zZQogICAgICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgICAgICoKICAgICAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAgICAgKi9mdW5jdGlvbiB1dCgpe1g9Wm9uZS5fX3N5bWJvbF9fLEs9T2JqZWN0W1goImRlZmluZVByb3BlcnR5IildPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxKPU9iamVjdFtYKCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiKV09T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixRPU9iamVjdC5jcmVhdGUsJD1YKCJ1bmNvbmZpZ3VyYWJsZXMiKSxPYmplY3QuZGVmaW5lUHJvcGVydHk9ZnVuY3Rpb24odCxlLG4pe2lmKGd0KHQsZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGFzc2lnbiB0byByZWFkIG9ubHkgcHJvcGVydHkgJyIrZSsiJyBvZiAiK3QpO3ZhciBvPW4uY29uZmlndXJhYmxlO3JldHVybiJwcm90b3R5cGUiIT09ZSYmKG49aHQodCxlLG4pKSxidCh0LGUsbixvKX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24obil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbixlW25dKX0pKSx0fSxPYmplY3QuY3JlYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIm9iamVjdCIhPXR5cGVvZiBlfHxPYmplY3QuaXNGcm96ZW4oZSl8fE9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKG4pe2Vbbl09aHQodCxuLGVbbl0pfSkpLFEodCxlKX0sT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcj1mdW5jdGlvbih0LGUpe3ZhciBuPUoodCxlKTtyZXR1cm4gbiYmZ3QodCxlKSYmKG4uY29uZmlndXJhYmxlPSExKSxufX1mdW5jdGlvbiBmdCh0LGUsbil7dmFyIG89bi5jb25maWd1cmFibGU7cmV0dXJuIGJ0KHQsZSxuPWh0KHQsZSxuKSxvKX1mdW5jdGlvbiBndCh0LGUpe3JldHVybiB0JiZ0WyRdJiZ0WyRdW2VdfWZ1bmN0aW9uIGh0KHQsZSxuKXtyZXR1cm4gT2JqZWN0LmlzRnJvemVuKG4pfHwobi5jb25maWd1cmFibGU9ITApLG4uY29uZmlndXJhYmxlfHwodFskXXx8T2JqZWN0LmlzRnJvemVuKHQpfHxLKHQsJCx7d3JpdGFibGU6ITAsdmFsdWU6e319KSx0WyRdJiYodFskXVtlXT0hMCkpLG59ZnVuY3Rpb24gYnQodCxlLG4sbyl7dHJ5e3JldHVybiBLKHQsZSxuKX1jYXRjaChyKXtpZighbi5jb25maWd1cmFibGUpdGhyb3cgcjt2b2lkIDA9PT1vP2RlbGV0ZSBuLmNvbmZpZ3VyYWJsZTpuLmNvbmZpZ3VyYWJsZT1vO3RyeXtyZXR1cm4gSyh0LGUsbil9Y2F0Y2gobyl7dmFyIGk9ITE7aWYoImNyZWF0ZWRDYWxsYmFjayIhPT1lJiYiYXR0YWNoZWRDYWxsYmFjayIhPT1lJiYiZGV0YWNoZWRDYWxsYmFjayIhPT1lJiYiYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrIiE9PWV8fChpPSEwKSwhaSl0aHJvdyBvO3ZhciBhPW51bGw7dHJ5e2E9SlNPTi5zdHJpbmdpZnkobil9Y2F0Y2godCl7YT1uLnRvU3RyaW5nKCl9Y29uc29sZS5sb2coIkF0dGVtcHRpbmcgdG8gY29uZmlndXJlICciK2UrIicgd2l0aCBkZXNjcmlwdG9yICciK2ErIicgb24gb2JqZWN0ICciK3QrIicgYW5kIGdvdCBlcnJvciwgZ2l2aW5nIHVwOiAiK28pfX19Ci8qKgogICAgICAgICAqIEBsaWNlbnNlCiAgICAgICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAgICAgKgogICAgICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICAgICAqL2Z1bmN0aW9uIHl0KHQsZSl7dmFyIG49ZS5nZXRHbG9iYWxPYmplY3RzKCksbz1uLmV2ZW50TmFtZXMsaT1uLmdsb2JhbFNvdXJjZXMsYT1uLnpvbmVTeW1ib2xFdmVudE5hbWVzLHI9bi5UUlVFX1NUUixzPW4uRkFMU0VfU1RSLGw9bi5aT05FX1NZTUJPTF9QUkVGSVgsYz0iQXBwbGljYXRpb25DYWNoZSxFdmVudFNvdXJjZSxGaWxlUmVhZGVyLElucHV0TWV0aG9kQ29udGV4dCxNZWRpYUNvbnRyb2xsZXIsTWVzc2FnZVBvcnQsTm9kZSxQZXJmb3JtYW5jZSxTVkdFbGVtZW50SW5zdGFuY2UsU2hhcmVkV29ya2VyLFRleHRUcmFjayxUZXh0VHJhY2tDdWUsVGV4dFRyYWNrTGlzdCxXZWJLaXROYW1lZEZsb3csV2luZG93LFdvcmtlcixXb3JrZXJHbG9iYWxTY29wZSxYTUxIdHRwUmVxdWVzdCxYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0LFhNTEh0dHBSZXF1ZXN0VXBsb2FkLElEQlJlcXVlc3QsSURCT3BlbkRCUmVxdWVzdCxJREJEYXRhYmFzZSxJREJUcmFuc2FjdGlvbixJREJDdXJzb3IsREJJbmRleCxXZWJTb2NrZXQiLnNwbGl0KCIsIiksZD1bXSxwPXQud3RmLG09IkFuY2hvcixBcmVhLEF1ZGlvLEJSLEJhc2UsQmFzZUZvbnQsQm9keSxCdXR0b24sQ2FudmFzLENvbnRlbnQsRExpc3QsRGlyZWN0b3J5LERpdixFbWJlZCxGaWVsZFNldCxGb250LEZvcm0sRnJhbWUsRnJhbWVTZXQsSFIsSGVhZCxIZWFkaW5nLEh0bWwsSUZyYW1lLEltYWdlLElucHV0LEtleWdlbixMSSxMYWJlbCxMZWdlbmQsTGluayxNYXAsTWFycXVlZSxNZWRpYSxNZW51LE1ldGEsTWV0ZXIsTW9kLE9MaXN0LE9iamVjdCxPcHRHcm91cCxPcHRpb24sT3V0cHV0LFBhcmFncmFwaCxQcmUsUHJvZ3Jlc3MsUXVvdGUsU2NyaXB0LFNlbGVjdCxTb3VyY2UsU3BhbixTdHlsZSxUYWJsZUNhcHRpb24sVGFibGVDZWxsLFRhYmxlQ29sLFRhYmxlLFRhYmxlUm93LFRhYmxlU2VjdGlvbixUZXh0QXJlYSxUaXRsZSxUcmFjayxVTGlzdCxVbmtub3duLFZpZGVvIi5zcGxpdCgiLCIpO3A/ZD1tLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIkhUTUwiK3QrIkVsZW1lbnQifSkpLmNvbmNhdChjKTp0LkV2ZW50VGFyZ2V0P2QucHVzaCgiRXZlbnRUYXJnZXQiKTpkPWM7Zm9yKHZhciB1PXQuX19ab25lX2Rpc2FibGVfSUVfY2hlY2t8fCExLGY9dC5fX1pvbmVfZW5hYmxlX2Nyb3NzX2NvbnRleHRfY2hlY2t8fCExLGc9ZS5pc0lFT3JFZGdlKCksaD0iW29iamVjdCBGdW5jdGlvbldyYXBwZXJdIixiPSJmdW5jdGlvbiBfX0JST1dTRVJUT09MU19DT05TT0xFX1NBRkVGVU5DKCkgeyBbbmF0aXZlIGNvZGVdIH0iLHk9e01TUG9pbnRlckNhbmNlbDoicG9pbnRlcmNhbmNlbCIsTVNQb2ludGVyRG93bjoicG9pbnRlcmRvd24iLE1TUG9pbnRlckVudGVyOiJwb2ludGVyZW50ZXIiLE1TUG9pbnRlckhvdmVyOiJwb2ludGVyaG92ZXIiLE1TUG9pbnRlckxlYXZlOiJwb2ludGVybGVhdmUiLE1TUG9pbnRlck1vdmU6InBvaW50ZXJtb3ZlIixNU1BvaW50ZXJPdXQ6InBvaW50ZXJvdXQiLE1TUG9pbnRlck92ZXI6InBvaW50ZXJvdmVyIixNU1BvaW50ZXJVcDoicG9pbnRlcnVwIn0sXz0wO188by5sZW5ndGg7XysrKXt2YXIgQz1sKygoUD1vW19dKStzKSxNPWwrKFArcik7YVtQXT17fSxhW1BdW3NdPUMsYVtQXVtyXT1NfWZvcihfPTA7XzxtLmxlbmd0aDtfKyspZm9yKHZhciB2PW1bX10seD1pW3ZdPXt9LE89MDtPPG8ubGVuZ3RoO08rKyl7dmFyIFA7eFtQPW9bT11dPXYrIi5hZGRFdmVudExpc3RlbmVyOiIrUH12YXIgdz1bXTtmb3IoXz0wO188ZC5sZW5ndGg7XysrKXt2YXIgaz10W2RbX11dO3cucHVzaChrJiZrLnByb3RvdHlwZSl9cmV0dXJuIGUucGF0Y2hFdmVudFRhcmdldCh0LHcse3ZoOmZ1bmN0aW9uKHQsZSxuLG8pe2lmKCF1JiZnKXtpZihmKXRyeXt2YXIgaTtpZigoaT1lLnRvU3RyaW5nKCkpPT09aHx8aT09YilyZXR1cm4gdC5hcHBseShuLG8pLCExfWNhdGNoKGUpe3JldHVybiB0LmFwcGx5KG4sbyksITF9ZWxzZSBpZigoaT1lLnRvU3RyaW5nKCkpPT09aHx8aT09YilyZXR1cm4gdC5hcHBseShuLG8pLCExfWVsc2UgaWYoZil0cnl7ZS50b1N0cmluZygpfWNhdGNoKGUpe3JldHVybiB0LmFwcGx5KG4sbyksITF9cmV0dXJuITB9LHRyYW5zZmVyRXZlbnROYW1lOmZ1bmN0aW9uKHQpe3JldHVybiB5W3RdfHx0fX0pLFpvbmVbZS5zeW1ib2woInBhdGNoRXZlbnRUYXJnZXQiKV09ISF0LkV2ZW50VGFyZ2V0LCEwfQovKioKICAgICAgICAgKiBAbGljZW5zZQogICAgICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgICAgICoKICAgICAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAgICAgKi8KLyoqCiAgICAgICAgICogQGxpY2Vuc2UKICAgICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICAgICAqCiAgICAgICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgICAgICovCmZ1bmN0aW9uIF90KHQsZSl7dmFyIG49dC5nZXRHbG9iYWxPYmplY3RzKCk7aWYoKCFuLmlzTm9kZXx8bi5pc01peCkmJiEoZnVuY3Rpb24gbyh0LGUpe3ZhciBuPXQuZ2V0R2xvYmFsT2JqZWN0cygpO2lmKChuLmlzQnJvd3Nlcnx8bi5pc01peCkmJiF0Lk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsIm9uY2xpY2siKSYmInVuZGVmaW5lZCIhPXR5cGVvZiBFbGVtZW50KXt2YXIgbz10Lk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihFbGVtZW50LnByb3RvdHlwZSwib25jbGljayIpO2lmKG8mJiFvLmNvbmZpZ3VyYWJsZSlyZXR1cm4hMTtpZihvKXt0Lk9iamVjdERlZmluZVByb3BlcnR5KEVsZW1lbnQucHJvdG90eXBlLCJvbmNsaWNrIix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuITB9fSk7dmFyIGk9ISFkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5vbmNsaWNrO3JldHVybiB0Lk9iamVjdERlZmluZVByb3BlcnR5KEVsZW1lbnQucHJvdG90eXBlLCJvbmNsaWNrIixvKSxpfX12YXIgYT1lLlhNTEh0dHBSZXF1ZXN0O2lmKCFhKXJldHVybiExO3ZhciByPSJvbnJlYWR5c3RhdGVjaGFuZ2UiLHM9YS5wcm90b3R5cGUsbD10Lk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihzLHIpO2lmKGwpcmV0dXJuIHQuT2JqZWN0RGVmaW5lUHJvcGVydHkocyxyLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KSxpPSEhKGQ9bmV3IGEpLm9ucmVhZHlzdGF0ZWNoYW5nZSx0Lk9iamVjdERlZmluZVByb3BlcnR5KHMscixsfHx7fSksaTt2YXIgYz10LnN5bWJvbCgiZmFrZSIpO3QuT2JqZWN0RGVmaW5lUHJvcGVydHkocyxyLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tjXX0sc2V0OmZ1bmN0aW9uKHQpe3RoaXNbY109dH19KTt2YXIgZCxwPWZ1bmN0aW9uKCl7fTtyZXR1cm4oZD1uZXcgYSkub25yZWFkeXN0YXRlY2hhbmdlPXAsaT1kW2NdPT09cCxkLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGl9KSh0LGUpKXt2YXIgaT0idW5kZWZpbmVkIiE9dHlwZW9mIFdlYlNvY2tldDsoZnVuY3Rpb24gYSh0KXtmb3IodmFyIGU9dC5nZXRHbG9iYWxPYmplY3RzKCkuZXZlbnROYW1lcyxuPXQuc3ltYm9sKCJ1bmJvdW5kIiksbz1mdW5jdGlvbihvKXt2YXIgaT1lW29dLGE9Im9uIitpO3NlbGYuYWRkRXZlbnRMaXN0ZW5lcihpLChmdW5jdGlvbihlKXt2YXIgbyxpLHI9ZS50YXJnZXQ7Zm9yKGk9cj9yLmNvbnN0cnVjdG9yLm5hbWUrIi4iK2E6InVua25vd24uIithO3I7KXJbYV0mJiFyW2FdW25dJiYoKG89dC53cmFwV2l0aEN1cnJlbnRab25lKHJbYV0saSkpW25dPXJbYV0sclthXT1vKSxyPXIucGFyZW50RWxlbWVudH0pLCEwKX0saT0wO2k8ZS5sZW5ndGg7aSsrKW8oaSl9Ci8qKgogICAgICAgICAqIEBsaWNlbnNlCiAgICAgICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAgICAgKgogICAgICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICAgICAqLykodCksdC5wYXRjaENsYXNzKCJYTUxIdHRwUmVxdWVzdCIpLGkmJihmdW5jdGlvbiByKHQsZSl7dmFyIG49dC5nZXRHbG9iYWxPYmplY3RzKCksbz1uLkFERF9FVkVOVF9MSVNURU5FUl9TVFIsaT1uLlJFTU9WRV9FVkVOVF9MSVNURU5FUl9TVFIsYT1lLldlYlNvY2tldDtlLkV2ZW50VGFyZ2V0fHx0LnBhdGNoRXZlbnRUYXJnZXQoZSxbYS5wcm90b3R5cGVdKSxlLldlYlNvY2tldD1mdW5jdGlvbihlLG4pe3ZhciByLHMsbD1hcmd1bWVudHMubGVuZ3RoPjE/bmV3IGEoZSxuKTpuZXcgYShlKSxjPXQuT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGwsIm9ubWVzc2FnZSIpO3JldHVybiBjJiYhMT09PWMuY29uZmlndXJhYmxlPyhyPXQuT2JqZWN0Q3JlYXRlKGwpLHM9bCxbbyxpLCJzZW5kIiwiY2xvc2UiXS5mb3JFYWNoKChmdW5jdGlvbihlKXtyW2VdPWZ1bmN0aW9uKCl7dmFyIG49dC5BcnJheVNsaWNlLmNhbGwoYXJndW1lbnRzKTtpZihlPT09b3x8ZT09PWkpe3ZhciBhPW4ubGVuZ3RoPjA/blswXTp2b2lkIDA7aWYoYSl7dmFyIHM9Wm9uZS5fX3N5bWJvbF9fKCJPTl9QUk9QRVJUWSIrYSk7bFtzXT1yW3NdfX1yZXR1cm4gbFtlXS5hcHBseShsLG4pfX0pKSk6cj1sLHQucGF0Y2hPblByb3BlcnRpZXMocixbImNsb3NlIiwiZXJyb3IiLCJtZXNzYWdlIiwib3BlbiJdLHMpLHJ9O3ZhciByPWUuV2ViU29ja2V0O2Zvcih2YXIgcyBpbiBhKXJbc109YVtzXX0pKHQsZSksWm9uZVt0LnN5bWJvbCgicGF0Y2hFdmVudHMiKV09ITB9fVpvbmUuX19sb2FkX3BhdGNoKCJ1dGlsIiwoZnVuY3Rpb24obixzLGwpe2wucGF0Y2hPblByb3BlcnRpZXM9UyxsLnBhdGNoTWV0aG9kPVIsbC5iaW5kQXJndW1lbnRzPV8sbC5wYXRjaE1hY3JvVGFzaz1BO3ZhciB1PXMuX19zeW1ib2xfXygiQkxBQ0tfTElTVEVEX0VWRU5UUyIpLGY9cy5fX3N5bWJvbF9fKCJVTlBBVENIRURfRVZFTlRTIik7bltmXSYmKG5bdV09bltmXSksblt1XSYmKHNbdV09c1tmXT1uW3VdKSxsLnBhdGNoRXZlbnRQcm90b3R5cGU9cSxsLnBhdGNoRXZlbnRUYXJnZXQ9VyxsLmlzSUVPckVkZ2U9SSxsLk9iamVjdERlZmluZVByb3BlcnR5PWUsbC5PYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I9dCxsLk9iamVjdENyZWF0ZT1vLGwuQXJyYXlTbGljZT1pLGwucGF0Y2hDbGFzcz1FLGwud3JhcFdpdGhDdXJyZW50Wm9uZT1tLGwuZmlsdGVyUHJvcGVydGllcz1kdCxsLmF0dGFjaE9yaWdpblRvUGF0Y2hlZD1ULGwuX3JlZGVmaW5lUHJvcGVydHk9T2JqZWN0LmRlZmluZVByb3BlcnR5LGwucGF0Y2hDYWxsYmFja3M9WixsLmdldEdsb2JhbE9iamVjdHM9ZnVuY3Rpb24oKXtyZXR1cm57Z2xvYmFsU291cmNlczpWLHpvbmVTeW1ib2xFdmVudE5hbWVzOkIsZXZlbnROYW1lczpjdCxpc0Jyb3dzZXI6eCxpc01peDpPLGlzTm9kZTp2LFRSVUVfU1RSOmMsRkFMU0VfU1RSOmQsWk9ORV9TWU1CT0xfUFJFRklYOnAsQUREX0VWRU5UX0xJU1RFTkVSX1NUUjphLFJFTU9WRV9FVkVOVF9MSVNURU5FUl9TVFI6cn19fSkpLAovKioKICAgICAgICAgKiBAbGljZW5zZQogICAgICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgICAgICoKICAgICAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAgICAgKi8KKGZ1bmN0aW9uKHQpe3ZhciBlPXQuX19ab25lX3N5bWJvbF9wcmVmaXh8fCJfX3pvbmVfc3ltYm9sX18iO3RbKGZ1bmN0aW9uIG4odCl7cmV0dXJuIGUrdH0pKCJsZWdhY3lQYXRjaCIpXT1mdW5jdGlvbigpe3ZhciBlPXQuWm9uZTtlLl9fbG9hZF9wYXRjaCgiZGVmaW5lUHJvcGVydHkiLChmdW5jdGlvbih0LGUsbil7bi5fcmVkZWZpbmVQcm9wZXJ0eT1mdCx1dCgpfSkpLGUuX19sb2FkX3BhdGNoKCJyZWdpc3RlckVsZW1lbnQiLChmdW5jdGlvbih0LGUsbil7IShmdW5jdGlvbiBvKHQsZSl7dmFyIG49ZS5nZXRHbG9iYWxPYmplY3RzKCk7KG4uaXNCcm93c2VyfHxuLmlzTWl4KSYmInJlZ2lzdGVyRWxlbWVudCJpbiB0LmRvY3VtZW50JiZlLnBhdGNoQ2FsbGJhY2tzKGUsZG9jdW1lbnQsIkRvY3VtZW50IiwicmVnaXN0ZXJFbGVtZW50IixbImNyZWF0ZWRDYWxsYmFjayIsImF0dGFjaGVkQ2FsbGJhY2siLCJkZXRhY2hlZENhbGxiYWNrIiwiYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrIl0pfSkodCxuKX0pKSxlLl9fbG9hZF9wYXRjaCgiRXZlbnRUYXJnZXRMZWdhY3kiLChmdW5jdGlvbih0LGUsbil7eXQodCxuKSxfdChuLHQpfSkpfX0pKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp2b2lkIDAhPT1Rdj9RdjoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fSk7Ci8qKgogICAgICAgICAqIEBsaWNlbnNlCiAgICAgICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAgICAgKgogICAgICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICAgICAqLwp2YXIgQ3Q9Zigiem9uZVRhc2siKTtmdW5jdGlvbiBNdCh0LGUsbixvKXt2YXIgaT1udWxsLGE9bnVsbDtuKz1vO3ZhciByPXt9O2Z1bmN0aW9uIHMoZSl7dmFyIG49ZS5kYXRhO3JldHVybiBuLmFyZ3NbMF09ZnVuY3Rpb24oKXtyZXR1cm4gZS5pbnZva2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxuLmhhbmRsZUlkPWkuYXBwbHkodCxuLmFyZ3MpLGV9ZnVuY3Rpb24gbChlKXtyZXR1cm4gYS5jYWxsKHQsZS5kYXRhLmhhbmRsZUlkKX1pPVIodCxlKz1vLChmdW5jdGlvbihuKXtyZXR1cm4gZnVuY3Rpb24oaSxhKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYVswXSl7dmFyIGM9e2lzUGVyaW9kaWM6IkludGVydmFsIj09PW8sZGVsYXk6IlRpbWVvdXQiPT09b3x8IkludGVydmFsIj09PW8/YVsxXXx8MDp2b2lkIDAsYXJnczphfSxkPWFbMF07YVswXT1mdW5jdGlvbiB0KCl7dHJ5e3JldHVybiBkLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1maW5hbGx5e2MuaXNQZXJpb2RpY3x8KCJudW1iZXIiPT10eXBlb2YgYy5oYW5kbGVJZD9kZWxldGUgcltjLmhhbmRsZUlkXTpjLmhhbmRsZUlkJiYoYy5oYW5kbGVJZFtDdF09bnVsbCkpfX07dmFyIHA9dShlLGFbMF0sYyxzLGwpO2lmKCFwKXJldHVybiBwO3ZhciBtPXAuZGF0YS5oYW5kbGVJZDtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIG0/clttXT1wOm0mJihtW0N0XT1wKSxtJiZtLnJlZiYmbS51bnJlZiYmImZ1bmN0aW9uIj09dHlwZW9mIG0ucmVmJiYiZnVuY3Rpb24iPT10eXBlb2YgbS51bnJlZiYmKHAucmVmPW0ucmVmLmJpbmQobSkscC51bnJlZj1tLnVucmVmLmJpbmQobSkpLCJudW1iZXIiPT10eXBlb2YgbXx8bT9tOnB9cmV0dXJuIG4uYXBwbHkodCxhKX19KSksYT1SKHQsbiwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKG4sbyl7dmFyIGksYT1vWzBdOyJudW1iZXIiPT10eXBlb2YgYT9pPXJbYV06KGk9YSYmYVtDdF0pfHwoaT1hKSxpJiYic3RyaW5nIj09dHlwZW9mIGkudHlwZT8ibm90U2NoZWR1bGVkIiE9PWkuc3RhdGUmJihpLmNhbmNlbEZuJiZpLmRhdGEuaXNQZXJpb2RpY3x8MD09PWkucnVuQ291bnQpJiYoIm51bWJlciI9PXR5cGVvZiBhP2RlbGV0ZSByW2FdOmEmJihhW0N0XT1udWxsKSxpLnpvbmUuY2FuY2VsVGFzayhpKSk6ZS5hcHBseSh0LG8pfX0pKX0KLyoqCiAgICAgICAgICogQGxpY2Vuc2UKICAgICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICAgICAqCiAgICAgICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgICAgICovCi8qKgogICAgICAgICAqIEBsaWNlbnNlCiAgICAgICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAgICAgKgogICAgICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICAgICAqLwpmdW5jdGlvbiB2dCh0LGUpe2lmKCFab25lW2Uuc3ltYm9sKCJwYXRjaEV2ZW50VGFyZ2V0IildKXtmb3IodmFyIG49ZS5nZXRHbG9iYWxPYmplY3RzKCksbz1uLmV2ZW50TmFtZXMsaT1uLnpvbmVTeW1ib2xFdmVudE5hbWVzLGE9bi5UUlVFX1NUUixyPW4uRkFMU0VfU1RSLHM9bi5aT05FX1NZTUJPTF9QUkVGSVgsbD0wO2w8by5sZW5ndGg7bCsrKXt2YXIgYz1vW2xdLGQ9cysoYytyKSxwPXMrKGMrYSk7aVtjXT17fSxpW2NdW3JdPWQsaVtjXVthXT1wfXZhciBtPXQuRXZlbnRUYXJnZXQ7aWYobSYmbS5wcm90b3R5cGUpcmV0dXJuIGUucGF0Y2hFdmVudFRhcmdldCh0LFttJiZtLnByb3RvdHlwZV0pLCEwfX0KLyoqCiAgICAgICAgICogQGxpY2Vuc2UKICAgICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICAgICAqCiAgICAgICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgICAgICovClpvbmUuX19sb2FkX3BhdGNoKCJsZWdhY3kiLChmdW5jdGlvbih0KXt2YXIgZT10W1pvbmUuX19zeW1ib2xfXygibGVnYWN5UGF0Y2giKV07ZSYmZSgpfSkpLFpvbmUuX19sb2FkX3BhdGNoKCJxdWV1ZU1pY3JvdGFzayIsKGZ1bmN0aW9uKHQsZSxuKXtuLnBhdGNoTWV0aG9kKHQsInF1ZXVlTWljcm90YXNrIiwoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7ZS5jdXJyZW50LnNjaGVkdWxlTWljcm9UYXNrKCJxdWV1ZU1pY3JvdGFzayIsblswXSl9fSkpfSkpLFpvbmUuX19sb2FkX3BhdGNoKCJ0aW1lcnMiLChmdW5jdGlvbih0KXt2YXIgZT0ic2V0IixuPSJjbGVhciI7TXQodCxlLG4sIlRpbWVvdXQiKSxNdCh0LGUsbiwiSW50ZXJ2YWwiKSxNdCh0LGUsbiwiSW1tZWRpYXRlIil9KSksWm9uZS5fX2xvYWRfcGF0Y2goInJlcXVlc3RBbmltYXRpb25GcmFtZSIsKGZ1bmN0aW9uKHQpe010KHQsInJlcXVlc3QiLCJjYW5jZWwiLCJBbmltYXRpb25GcmFtZSIpLE10KHQsIm1velJlcXVlc3QiLCJtb3pDYW5jZWwiLCJBbmltYXRpb25GcmFtZSIpLE10KHQsIndlYmtpdFJlcXVlc3QiLCJ3ZWJraXRDYW5jZWwiLCJBbmltYXRpb25GcmFtZSIpfSkpLFpvbmUuX19sb2FkX3BhdGNoKCJibG9ja2luZyIsKGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVsiYWxlcnQiLCJwcm9tcHQiLCJjb25maXJtIl0sbz0wO288bi5sZW5ndGg7bysrKVIodCxuW29dLChmdW5jdGlvbihuLG8saSl7cmV0dXJuIGZ1bmN0aW9uKG8sYSl7cmV0dXJuIGUuY3VycmVudC5ydW4obix0LGEsaSl9fSkpfSkpLFpvbmUuX19sb2FkX3BhdGNoKCJFdmVudFRhcmdldCIsKGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24gbyh0LGUpe2UucGF0Y2hFdmVudFByb3RvdHlwZSh0LGUpfSkodCxuKSx2dCh0LG4pO3ZhciBpPXQuWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDtpJiZpLnByb3RvdHlwZSYmbi5wYXRjaEV2ZW50VGFyZ2V0KHQsW2kucHJvdG90eXBlXSl9KSksWm9uZS5fX2xvYWRfcGF0Y2goIk11dGF0aW9uT2JzZXJ2ZXIiLChmdW5jdGlvbih0LGUsbil7RSgiTXV0YXRpb25PYnNlcnZlciIpLEUoIldlYktpdE11dGF0aW9uT2JzZXJ2ZXIiKX0pKSxab25lLl9fbG9hZF9wYXRjaCgiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLChmdW5jdGlvbih0LGUsbil7RSgiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiKX0pKSxab25lLl9fbG9hZF9wYXRjaCgiRmlsZVJlYWRlciIsKGZ1bmN0aW9uKHQsZSxuKXtFKCJGaWxlUmVhZGVyIil9KSksWm9uZS5fX2xvYWRfcGF0Y2goIm9uX3Byb3BlcnR5IiwoZnVuY3Rpb24odCxlLG4pe210KG4sdCl9KSksWm9uZS5fX2xvYWRfcGF0Y2goImN1c3RvbUVsZW1lbnRzIiwoZnVuY3Rpb24odCxlLG4peyEoZnVuY3Rpb24gbyh0LGUpe3ZhciBuPWUuZ2V0R2xvYmFsT2JqZWN0cygpOyhuLmlzQnJvd3Nlcnx8bi5pc01peCkmJnQuY3VzdG9tRWxlbWVudHMmJiJjdXN0b21FbGVtZW50cyJpbiB0JiZlLnBhdGNoQ2FsbGJhY2tzKGUsdC5jdXN0b21FbGVtZW50cywiY3VzdG9tRWxlbWVudHMiLCJkZWZpbmUiLFsiY29ubmVjdGVkQ2FsbGJhY2siLCJkaXNjb25uZWN0ZWRDYWxsYmFjayIsImFkb3B0ZWRDYWxsYmFjayIsImF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayJdKX0pKHQsbil9KSksWm9uZS5fX2xvYWRfcGF0Y2goIlhIUiIsKGZ1bmN0aW9uKHQsZSl7IShmdW5jdGlvbiBuKHQpe3ZhciBuPXQuWE1MSHR0cFJlcXVlc3Q7aWYobil7dmFyIHA9bi5wcm90b3R5cGUsbT1wW3NdLGc9cFtsXTtpZighbSl7dmFyIGg9dC5YTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0O2lmKGgpe3ZhciBiPWgucHJvdG90eXBlO209YltzXSxnPWJbbF19fXZhciB5PSJyZWFkeXN0YXRlY2hhbmdlIixfPSJzY2hlZHVsZWQiLEM9UihwLCJvcGVuIiwoZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdFtpXT0wPT1lWzJdLHRbY109ZVsxXSxDLmFwcGx5KHQsZSl9fSkpLE09ZigiZmV0Y2hUYXNrQWJvcnRpbmciKSx2PWYoImZldGNoVGFza1NjaGVkdWxpbmciKSx4PVIocCwic2VuZCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7aWYoITA9PT1lLmN1cnJlbnRbdl0pcmV0dXJuIHguYXBwbHkodCxuKTtpZih0W2ldKXJldHVybiB4LmFwcGx5KHQsbik7dmFyIG89e3RhcmdldDp0LHVybDp0W2NdLGlzUGVyaW9kaWM6ITEsYXJnczpuLGFib3J0ZWQ6ITF9LGE9dSgiWE1MSHR0cFJlcXVlc3Quc2VuZCIsdyxvLFAsayk7dCYmITA9PT10W2RdJiYhby5hYm9ydGVkJiZhLnN0YXRlPT09XyYmYS5pbnZva2UoKX19KSksTz1SKHAsImFib3J0IiwoZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCxuKXt2YXIgaT0oZnVuY3Rpb24gYSh0KXtyZXR1cm4gdFtvXX0pKHQpO2lmKGkmJiJzdHJpbmciPT10eXBlb2YgaS50eXBlKXtpZihudWxsPT1pLmNhbmNlbEZufHxpLmRhdGEmJmkuZGF0YS5hYm9ydGVkKXJldHVybjtpLnpvbmUuY2FuY2VsVGFzayhpKX1lbHNlIGlmKCEwPT09ZS5jdXJyZW50W01dKXJldHVybiBPLmFwcGx5KHQsbil9fSkpfWZ1bmN0aW9uIFAodCl7dmFyIG49dC5kYXRhLGk9bi50YXJnZXQ7aVtyXT0hMSxpW2RdPSExO3ZhciBjPWlbYV07bXx8KG09aVtzXSxnPWlbbF0pLGMmJmcuY2FsbChpLHksYyk7dmFyIHA9aVthXT1mdW5jdGlvbigpe2lmKGkucmVhZHlTdGF0ZT09PWkuRE9ORSlpZighbi5hYm9ydGVkJiZpW3JdJiZ0LnN0YXRlPT09Xyl7dmFyIG89aVtlLl9fc3ltYm9sX18oImxvYWRmYWxzZSIpXTtpZigwIT09aS5zdGF0dXMmJm8mJm8ubGVuZ3RoPjApe3ZhciBhPXQuaW52b2tlO3QuaW52b2tlPWZ1bmN0aW9uKCl7Zm9yKHZhciBvPWlbZS5fX3N5bWJvbF9fKCJsb2FkZmFsc2UiKV0scj0wO3I8by5sZW5ndGg7cisrKW9bcl09PT10JiZvLnNwbGljZShyLDEpO24uYWJvcnRlZHx8dC5zdGF0ZSE9PV98fGEuY2FsbCh0KX0sby5wdXNoKHQpfWVsc2UgdC5pbnZva2UoKX1lbHNlIG4uYWJvcnRlZHx8ITEhPT1pW3JdfHwoaVtkXT0hMCl9O3JldHVybiBtLmNhbGwoaSx5LHApLGlbb118fChpW29dPXQpLHguYXBwbHkoaSxuLmFyZ3MpLGlbcl09ITAsdH1mdW5jdGlvbiB3KCl7fWZ1bmN0aW9uIGsodCl7dmFyIGU9dC5kYXRhO3JldHVybiBlLmFib3J0ZWQ9ITAsTy5hcHBseShlLnRhcmdldCxlLmFyZ3MpfX0pKHQpO3ZhciBvPWYoInhoclRhc2siKSxpPWYoInhoclN5bmMiKSxhPWYoInhockxpc3RlbmVyIikscj1mKCJ4aHJTY2hlZHVsZWQiKSxjPWYoInhoclVSTCIpLGQ9ZigieGhyRXJyb3JCZWZvcmVTY2hlZHVsZWQiKX0pKSxab25lLl9fbG9hZF9wYXRjaCgiZ2VvbG9jYXRpb24iLChmdW5jdGlvbihlKXtlLm5hdmlnYXRvciYmZS5uYXZpZ2F0b3IuZ2VvbG9jYXRpb24mJihmdW5jdGlvbiBuKGUsbyl7Zm9yKHZhciBpPWUuY29uc3RydWN0b3IubmFtZSxhPWZ1bmN0aW9uKG4pe3ZhciBhPW9bbl0scj1lW2FdO2lmKHIpe2lmKCFDKHQoZSxhKSkpcmV0dXJuImNvbnRpbnVlIjtlW2FdPShmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KHRoaXMsXyhhcmd1bWVudHMsaSsiLiIrYSkpfTtyZXR1cm4gVChlLHQpLGV9KShyKX19LHI9MDtyPG8ubGVuZ3RoO3IrKylhKHIpfSkoZS5uYXZpZ2F0b3IuZ2VvbG9jYXRpb24sWyJnZXRDdXJyZW50UG9zaXRpb24iLCJ3YXRjaFBvc2l0aW9uIl0pfSkpLFpvbmUuX19sb2FkX3BhdGNoKCJQcm9taXNlUmVqZWN0aW9uRXZlbnQiLChmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe1kodCxlKS5mb3JFYWNoKChmdW5jdGlvbihvKXt2YXIgaT10LlByb21pc2VSZWplY3Rpb25FdmVudDtpZihpKXt2YXIgYT1uZXcgaShlLHtwcm9taXNlOm4ucHJvbWlzZSxyZWFzb246bi5yZWplY3Rpb259KTtvLmludm9rZShhKX19KSl9fXQuUHJvbWlzZVJlamVjdGlvbkV2ZW50JiYoZVtmKCJ1bmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uSGFuZGxlciIpXT1uKCJ1bmhhbmRsZWRyZWplY3Rpb24iKSxlW2YoInJlamVjdGlvbkhhbmRsZWRIYW5kbGVyIildPW4oInJlamVjdGlvbmhhbmRsZWQiKSl9KSl9KSgpOwovKioKICAgICAqIEBsaWNlbnNlIEFuZ3VsYXIgdjEyLjIuMQogICAgICogKGMpIDIwMTAtMjAyMSBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vCiAgICAgKiBMaWNlbnNlOiBNSVQKICAgICAqLwpjbGFzcyB0eHt9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBleD0iKiI7ZnVuY3Rpb24gbngodCxlKXtyZXR1cm57dHlwZTo3LG5hbWU6dCxkZWZpbml0aW9uczplLG9wdGlvbnM6e319fWZ1bmN0aW9uIG94KHQsZT1udWxsKXtyZXR1cm57dHlwZTo0LHN0eWxlczplLHRpbWluZ3M6dH19ZnVuY3Rpb24gaXgodCxlPW51bGwpe3JldHVybnt0eXBlOjIsc3RlcHM6dCxvcHRpb25zOmV9fWZ1bmN0aW9uIGF4KHQpe3JldHVybnt0eXBlOjYsc3R5bGVzOnQsb2Zmc2V0Om51bGx9fWZ1bmN0aW9uIHJ4KHQsZSxuKXtyZXR1cm57dHlwZTowLG5hbWU6dCxzdHlsZXM6ZSxvcHRpb25zOm59fWZ1bmN0aW9uIHN4KHQpe3JldHVybnt0eXBlOjUsc3RlcHM6dH19ZnVuY3Rpb24gbHgodCxlLG49bnVsbCl7cmV0dXJue3R5cGU6MSxleHByOnQsYW5pbWF0aW9uOmUsb3B0aW9uczpufX1mdW5jdGlvbiBjeCh0PW51bGwpe3JldHVybnt0eXBlOjksb3B0aW9uczp0fX1mdW5jdGlvbiBkeCh0LGUsbj1udWxsKXtyZXR1cm57dHlwZToxMSxzZWxlY3Rvcjp0LGFuaW1hdGlvbjplLG9wdGlvbnM6bn19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIHB4KHQpe1Byb21pc2UucmVzb2x2ZShudWxsKS50aGVuKHQpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBteHtjb25zdHJ1Y3Rvcih0PTAsZT0wKXt0aGlzLl9vbkRvbmVGbnM9W10sdGhpcy5fb25TdGFydEZucz1bXSx0aGlzLl9vbkRlc3Ryb3lGbnM9W10sdGhpcy5fc3RhcnRlZD0hMSx0aGlzLl9kZXN0cm95ZWQ9ITEsdGhpcy5fZmluaXNoZWQ9ITEsdGhpcy5fcG9zaXRpb249MCx0aGlzLnBhcmVudFBsYXllcj1udWxsLHRoaXMudG90YWxUaW1lPXQrZX1fb25GaW5pc2goKXt0aGlzLl9maW5pc2hlZHx8KHRoaXMuX2ZpbmlzaGVkPSEwLHRoaXMuX29uRG9uZUZucy5mb3JFYWNoKCh0PT50KCkpKSx0aGlzLl9vbkRvbmVGbnM9W10pfW9uU3RhcnQodCl7dGhpcy5fb25TdGFydEZucy5wdXNoKHQpfW9uRG9uZSh0KXt0aGlzLl9vbkRvbmVGbnMucHVzaCh0KX1vbkRlc3Ryb3kodCl7dGhpcy5fb25EZXN0cm95Rm5zLnB1c2godCl9aGFzU3RhcnRlZCgpe3JldHVybiB0aGlzLl9zdGFydGVkfWluaXQoKXt9cGxheSgpe3RoaXMuaGFzU3RhcnRlZCgpfHwodGhpcy5fb25TdGFydCgpLHRoaXMudHJpZ2dlck1pY3JvdGFzaygpKSx0aGlzLl9zdGFydGVkPSEwfXRyaWdnZXJNaWNyb3Rhc2soKXtweCgoKCk9PnRoaXMuX29uRmluaXNoKCkpKX1fb25TdGFydCgpe3RoaXMuX29uU3RhcnRGbnMuZm9yRWFjaCgodD0+dCgpKSksdGhpcy5fb25TdGFydEZucz1bXX1wYXVzZSgpe31yZXN0YXJ0KCl7fWZpbmlzaCgpe3RoaXMuX29uRmluaXNoKCl9ZGVzdHJveSgpe3RoaXMuX2Rlc3Ryb3llZHx8KHRoaXMuX2Rlc3Ryb3llZD0hMCx0aGlzLmhhc1N0YXJ0ZWQoKXx8dGhpcy5fb25TdGFydCgpLHRoaXMuZmluaXNoKCksdGhpcy5fb25EZXN0cm95Rm5zLmZvckVhY2goKHQ9PnQoKSkpLHRoaXMuX29uRGVzdHJveUZucz1bXSl9cmVzZXQoKXt0aGlzLl9zdGFydGVkPSExfXNldFBvc2l0aW9uKHQpe3RoaXMuX3Bvc2l0aW9uPXRoaXMudG90YWxUaW1lP3QqdGhpcy50b3RhbFRpbWU6MX1nZXRQb3NpdGlvbigpe3JldHVybiB0aGlzLnRvdGFsVGltZT90aGlzLl9wb3NpdGlvbi90aGlzLnRvdGFsVGltZToxfXRyaWdnZXJDYWxsYmFjayh0KXtjb25zdCBlPSJzdGFydCI9PXQ/dGhpcy5fb25TdGFydEZuczp0aGlzLl9vbkRvbmVGbnM7ZS5mb3JFYWNoKCh0PT50KCkpKSxlLmxlbmd0aD0wfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgdXh7Y29uc3RydWN0b3IodCl7dGhpcy5fb25Eb25lRm5zPVtdLHRoaXMuX29uU3RhcnRGbnM9W10sdGhpcy5fZmluaXNoZWQ9ITEsdGhpcy5fc3RhcnRlZD0hMSx0aGlzLl9kZXN0cm95ZWQ9ITEsdGhpcy5fb25EZXN0cm95Rm5zPVtdLHRoaXMucGFyZW50UGxheWVyPW51bGwsdGhpcy50b3RhbFRpbWU9MCx0aGlzLnBsYXllcnM9dDtsZXQgZT0wLG49MCxvPTA7Y29uc3QgaT10aGlzLnBsYXllcnMubGVuZ3RoOzA9PWk/cHgoKCgpPT50aGlzLl9vbkZpbmlzaCgpKSk6dGhpcy5wbGF5ZXJzLmZvckVhY2goKHQ9Pnt0Lm9uRG9uZSgoKCk9PnsrK2U9PWkmJnRoaXMuX29uRmluaXNoKCl9KSksdC5vbkRlc3Ryb3koKCgpPT57KytuPT1pJiZ0aGlzLl9vbkRlc3Ryb3koKX0pKSx0Lm9uU3RhcnQoKCgpPT57KytvPT1pJiZ0aGlzLl9vblN0YXJ0KCl9KSl9KSksdGhpcy50b3RhbFRpbWU9dGhpcy5wbGF5ZXJzLnJlZHVjZSgoKHQsZSk9Pk1hdGgubWF4KHQsZS50b3RhbFRpbWUpKSwwKX1fb25GaW5pc2goKXt0aGlzLl9maW5pc2hlZHx8KHRoaXMuX2ZpbmlzaGVkPSEwLHRoaXMuX29uRG9uZUZucy5mb3JFYWNoKCh0PT50KCkpKSx0aGlzLl9vbkRvbmVGbnM9W10pfWluaXQoKXt0aGlzLnBsYXllcnMuZm9yRWFjaCgodD0+dC5pbml0KCkpKX1vblN0YXJ0KHQpe3RoaXMuX29uU3RhcnRGbnMucHVzaCh0KX1fb25TdGFydCgpe3RoaXMuaGFzU3RhcnRlZCgpfHwodGhpcy5fc3RhcnRlZD0hMCx0aGlzLl9vblN0YXJ0Rm5zLmZvckVhY2goKHQ9PnQoKSkpLHRoaXMuX29uU3RhcnRGbnM9W10pfW9uRG9uZSh0KXt0aGlzLl9vbkRvbmVGbnMucHVzaCh0KX1vbkRlc3Ryb3kodCl7dGhpcy5fb25EZXN0cm95Rm5zLnB1c2godCl9aGFzU3RhcnRlZCgpe3JldHVybiB0aGlzLl9zdGFydGVkfXBsYXkoKXt0aGlzLnBhcmVudFBsYXllcnx8dGhpcy5pbml0KCksdGhpcy5fb25TdGFydCgpLHRoaXMucGxheWVycy5mb3JFYWNoKCh0PT50LnBsYXkoKSkpfXBhdXNlKCl7dGhpcy5wbGF5ZXJzLmZvckVhY2goKHQ9PnQucGF1c2UoKSkpfXJlc3RhcnQoKXt0aGlzLnBsYXllcnMuZm9yRWFjaCgodD0+dC5yZXN0YXJ0KCkpKX1maW5pc2goKXt0aGlzLl9vbkZpbmlzaCgpLHRoaXMucGxheWVycy5mb3JFYWNoKCh0PT50LmZpbmlzaCgpKSl9ZGVzdHJveSgpe3RoaXMuX29uRGVzdHJveSgpfV9vbkRlc3Ryb3koKXt0aGlzLl9kZXN0cm95ZWR8fCh0aGlzLl9kZXN0cm95ZWQ9ITAsdGhpcy5fb25GaW5pc2goKSx0aGlzLnBsYXllcnMuZm9yRWFjaCgodD0+dC5kZXN0cm95KCkpKSx0aGlzLl9vbkRlc3Ryb3lGbnMuZm9yRWFjaCgodD0+dCgpKSksdGhpcy5fb25EZXN0cm95Rm5zPVtdKX1yZXNldCgpe3RoaXMucGxheWVycy5mb3JFYWNoKCh0PT50LnJlc2V0KCkpKSx0aGlzLl9kZXN0cm95ZWQ9ITEsdGhpcy5fZmluaXNoZWQ9ITEsdGhpcy5fc3RhcnRlZD0hMX1zZXRQb3NpdGlvbih0KXtjb25zdCBlPXQqdGhpcy50b3RhbFRpbWU7dGhpcy5wbGF5ZXJzLmZvckVhY2goKHQ9Pntjb25zdCBuPXQudG90YWxUaW1lP01hdGgubWluKDEsZS90LnRvdGFsVGltZSk6MTt0LnNldFBvc2l0aW9uKG4pfSkpfWdldFBvc2l0aW9uKCl7Y29uc3QgdD10aGlzLnBsYXllcnMucmVkdWNlKCgodCxlKT0+bnVsbD09PXR8fGUudG90YWxUaW1lPnQudG90YWxUaW1lP2U6dCksbnVsbCk7cmV0dXJuIG51bGwhPXQ/dC5nZXRQb3NpdGlvbigpOjB9YmVmb3JlRGVzdHJveSgpe3RoaXMucGxheWVycy5mb3JFYWNoKCh0PT57dC5iZWZvcmVEZXN0cm95JiZ0LmJlZm9yZURlc3Ryb3koKX0pKX10cmlnZ2VyQ2FsbGJhY2sodCl7Y29uc3QgZT0ic3RhcnQiPT10P3RoaXMuX29uU3RhcnRGbnM6dGhpcy5fb25Eb25lRm5zO2UuZm9yRWFjaCgodD0+dCgpKSksZS5sZW5ndGg9MH19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwovKioKICAgICAqIEBsaWNlbnNlIEFuZ3VsYXIgdjEyLjIuMQogICAgICogKGMpIDIwMTAtMjAyMSBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vCiAgICAgKiBMaWNlbnNlOiBNSVQKICAgICAqLwpmdW5jdGlvbiBmeCgpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ2b2lkIDAhPT13aW5kb3cuZG9jdW1lbnR9ZnVuY3Rpb24gZ3goKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHByb2Nlc3MmJiJbb2JqZWN0IHByb2Nlc3NdIj09PXt9LnRvU3RyaW5nLmNhbGwocHJvY2Vzcyl9ZnVuY3Rpb24gaHgodCl7c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyBteDtjYXNlIDE6cmV0dXJuIHRbMF07ZGVmYXVsdDpyZXR1cm4gbmV3IHV4KHQpfX1mdW5jdGlvbiBieCh0LGUsbixvLGk9e30sYT17fSl7Y29uc3Qgcj1bXSxzPVtdO2xldCBsPS0xLGM9bnVsbDtpZihvLmZvckVhY2goKHQ9Pntjb25zdCBuPXQub2Zmc2V0LG89bj09bCxkPW8mJmN8fHt9O09iamVjdC5rZXlzKHQpLmZvckVhY2goKG49PntsZXQgbz1uLHM9dFtuXTtpZigib2Zmc2V0IiE9PW4pc3dpdGNoKG89ZS5ub3JtYWxpemVQcm9wZXJ0eU5hbWUobyxyKSxzKXtjYXNlIiEiOnM9aVtuXTticmVhaztjYXNlIGV4OnM9YVtuXTticmVhaztkZWZhdWx0OnM9ZS5ub3JtYWxpemVTdHlsZVZhbHVlKG4sbyxzLHIpfWRbb109c30pKSxvfHxzLnB1c2goZCksYz1kLGw9bn0pKSxyLmxlbmd0aCl7Y29uc3QgdD0iXG4gLSAiO3Rocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGFuaW1hdGUgZHVlIHRvIHRoZSBmb2xsb3dpbmcgZXJyb3JzOiR7dH0ke3Iuam9pbih0KX1gKX1yZXR1cm4gc31mdW5jdGlvbiB5eCh0LGUsbixvKXtzd2l0Y2goZSl7Y2FzZSJzdGFydCI6dC5vblN0YXJ0KCgoKT0+byhuJiZfeChuLCJzdGFydCIsdCkpKSk7YnJlYWs7Y2FzZSJkb25lIjp0Lm9uRG9uZSgoKCk9Pm8obiYmX3gobiwiZG9uZSIsdCkpKSk7YnJlYWs7Y2FzZSJkZXN0cm95Ijp0Lm9uRGVzdHJveSgoKCk9Pm8obiYmX3gobiwiZGVzdHJveSIsdCkpKSl9fWZ1bmN0aW9uIF94KHQsZSxuKXtjb25zdCBvPW4udG90YWxUaW1lLGk9Q3godC5lbGVtZW50LHQudHJpZ2dlck5hbWUsdC5mcm9tU3RhdGUsdC50b1N0YXRlLGV8fHQucGhhc2VOYW1lLG51bGw9PW8/dC50b3RhbFRpbWU6bywhIW4uZGlzYWJsZWQpLGE9dC5fZGF0YTtyZXR1cm4gbnVsbCE9YSYmKGkuX2RhdGE9YSksaX1mdW5jdGlvbiBDeCh0LGUsbixvLGk9IiIsYT0wLHIpe3JldHVybntlbGVtZW50OnQsdHJpZ2dlck5hbWU6ZSxmcm9tU3RhdGU6bix0b1N0YXRlOm8scGhhc2VOYW1lOmksdG90YWxUaW1lOmEsZGlzYWJsZWQ6ISFyfX1mdW5jdGlvbiBNeCh0LGUsbil7bGV0IG87cmV0dXJuIHQgaW5zdGFuY2VvZiBNYXA/KG89dC5nZXQoZSksb3x8dC5zZXQoZSxvPW4pKToobz10W2VdLG98fChvPXRbZV09bikpLG99ZnVuY3Rpb24gdngodCl7Y29uc3QgZT10LmluZGV4T2YoIjoiKTtyZXR1cm5bdC5zdWJzdHJpbmcoMSxlKSx0LnN1YnN0cihlKzEpXX1sZXQgeHg9KHQsZSk9PiExLE94PSh0LGUpPT4hMSxQeD0odCxlLG4pPT5bXTtjb25zdCB3eD1neCgpOyh3eHx8InVuZGVmaW5lZCIhPXR5cGVvZiBFbGVtZW50KSYmKHh4PWZ4KCk/KHQsZSk9Pntmb3IoO2UmJmUhPT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7KXtpZihlPT09dClyZXR1cm4hMDtlPWUucGFyZW50Tm9kZXx8ZS5ob3N0fXJldHVybiExfToodCxlKT0+dC5jb250YWlucyhlKSxPeD0oKCk9PntpZih3eHx8RWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcylyZXR1cm4odCxlKT0+dC5tYXRjaGVzKGUpO3tjb25zdCB0PUVsZW1lbnQucHJvdG90eXBlLGU9dC5tYXRjaGVzU2VsZWN0b3J8fHQubW96TWF0Y2hlc1NlbGVjdG9yfHx0Lm1zTWF0Y2hlc1NlbGVjdG9yfHx0Lm9NYXRjaGVzU2VsZWN0b3J8fHQud2Via2l0TWF0Y2hlc1NlbGVjdG9yO3JldHVybiBlPyh0LG4pPT5lLmFwcGx5KHQsW25dKTpPeH19KSgpLFB4PSh0LGUsbik9PntsZXQgbz1bXTtpZihuKXtjb25zdCBuPXQucXVlcnlTZWxlY3RvckFsbChlKTtmb3IobGV0IHQ9MDt0PG4ubGVuZ3RoO3QrKylvLnB1c2goblt0XSl9ZWxzZXtjb25zdCBuPXQucXVlcnlTZWxlY3RvcihlKTtuJiZvLnB1c2gobil9cmV0dXJuIG99KTtsZXQga3g9bnVsbCxTeD0hMTtmdW5jdGlvbiBEeCh0KXtreHx8KGt4PShmdW5jdGlvbiBlKCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudD9kb2N1bWVudC5ib2R5Om51bGx9KSgpfHx7fSxTeD0hIWt4LnN0eWxlJiYiV2Via2l0QXBwZWFyYW5jZSJpbiBreC5zdHlsZSk7bGV0IG49ITA7cmV0dXJuIGt4LnN0eWxlJiYhKGZ1bmN0aW9uIG8odCl7cmV0dXJuImVia2l0Ij09dC5zdWJzdHJpbmcoMSw2KX0pKHQpJiYobj10IGluIGt4LnN0eWxlLCFuJiZTeCkmJihuPSJXZWJraXQiK3QuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHIoMSlpbiBreC5zdHlsZSksbn1jb25zdCBFeD1PeCxSeD14eCxBeD1QeDtmdW5jdGlvbiBUeCh0KXtjb25zdCBlPXt9O3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChuPT57Y29uc3Qgbz1uLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csIiQxLSQyIik7ZVtvXT10W25dfSkpLGV9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIE54e3ZhbGlkYXRlU3R5bGVQcm9wZXJ0eSh0KXtyZXR1cm4gRHgodCl9bWF0Y2hlc0VsZW1lbnQodCxlKXtyZXR1cm4gRXgodCxlKX1jb250YWluc0VsZW1lbnQodCxlKXtyZXR1cm4gUngodCxlKX1xdWVyeSh0LGUsbil7cmV0dXJuIEF4KHQsZSxuKX1jb21wdXRlU3R5bGUodCxlLG4pe3JldHVybiBufHwiIn1hbmltYXRlKHQsZSxuLG8saSxhPVtdLHIpe3JldHVybiBuZXcgbXgobixvKX19TnguybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fE54KX0sTnguybVwcm92PU1uKHt0b2tlbjpOeCxmYWN0b3J5Ok54Lsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChOeCxbe3R5cGU6aW19XSxudWxsLG51bGwpO2NsYXNzIHp4e316eC5OT09QPW5ldyBOeDsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IEl4PSJuZy1lbnRlciIsSHg9Im5nLWxlYXZlIixGeD0ibmctdHJpZ2dlciIsTHg9Ii5uZy10cmlnZ2VyIixCeD0ibmctYW5pbWF0aW5nIixWeD0iLm5nLWFuaW1hdGluZyI7ZnVuY3Rpb24gangodCl7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiB0O2NvbnN0IGU9dC5tYXRjaCgvXigtP1tcLlxkXSspKG0/cykvKTtyZXR1cm4hZXx8ZS5sZW5ndGg8Mj8wOlV4KHBhcnNlRmxvYXQoZVsxXSksZVsyXSl9ZnVuY3Rpb24gVXgodCxlKXtzd2l0Y2goZSl7Y2FzZSJzIjpyZXR1cm4gMWUzKnQ7ZGVmYXVsdDpyZXR1cm4gdH19ZnVuY3Rpb24gR3godCxlLG4pe3JldHVybiB0Lmhhc093blByb3BlcnR5KCJkdXJhdGlvbiIpP3Q6KGZ1bmN0aW9uIG8odCxlLG4pe2xldCBvLGk9MCxhPSIiO2lmKCJzdHJpbmciPT10eXBlb2YgdCl7Y29uc3Qgbj10Lm1hdGNoKC9eKC0/W1wuXGRdKykobT9zKSg/OlxzKygtP1tcLlxkXSspKG0/cykpPyg/OlxzKyhbLWEtel0rKD86XCguKz9cKSk/KSk/JC9pKTtpZihudWxsPT09bilyZXR1cm4gZS5wdXNoKGBUaGUgcHJvdmlkZWQgdGltaW5nIHZhbHVlICIke3R9IiBpcyBpbnZhbGlkLmApLHtkdXJhdGlvbjowLGRlbGF5OjAsZWFzaW5nOiIifTtvPVV4KHBhcnNlRmxvYXQoblsxXSksblsyXSk7Y29uc3Qgcj1uWzNdO251bGwhPXImJihpPVV4KHBhcnNlRmxvYXQociksbls0XSkpO2NvbnN0IHM9bls1XTtzJiYoYT1zKX1lbHNlIG89dDtpZighbil7bGV0IG49ITEsYT1lLmxlbmd0aDtvPDAmJihlLnB1c2goIkR1cmF0aW9uIHZhbHVlcyBiZWxvdyAwIGFyZSBub3QgYWxsb3dlZCBmb3IgdGhpcyBhbmltYXRpb24gc3RlcC4iKSxuPSEwKSxpPDAmJihlLnB1c2goIkRlbGF5IHZhbHVlcyBiZWxvdyAwIGFyZSBub3QgYWxsb3dlZCBmb3IgdGhpcyBhbmltYXRpb24gc3RlcC4iKSxuPSEwKSxuJiZlLnNwbGljZShhLDAsYFRoZSBwcm92aWRlZCB0aW1pbmcgdmFsdWUgIiR7dH0iIGlzIGludmFsaWQuYCl9cmV0dXJue2R1cmF0aW9uOm8sZGVsYXk6aSxlYXNpbmc6YX19KSh0LGUsbil9ZnVuY3Rpb24gV3godCxlPXt9KXtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaCgobj0+e2Vbbl09dFtuXX0pKSxlfWZ1bmN0aW9uIFl4KHQsZSxuPXt9KXtpZihlKWZvcihsZXQgZSBpbiB0KW5bZV09dFtlXTtlbHNlIFd4KHQsbik7cmV0dXJuIG59ZnVuY3Rpb24gcXgodCxlLG4pe3JldHVybiBuP2UrIjoiK24rIjsiOiIifWZ1bmN0aW9uIFp4KHQpe2xldCBlPSIiO2ZvcihsZXQgbj0wO248dC5zdHlsZS5sZW5ndGg7bisrKXtjb25zdCBvPXQuc3R5bGUuaXRlbShuKTtlKz1xeCgwLG8sdC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG8pKX1mb3IoY29uc3QgbiBpbiB0LnN0eWxlKXQuc3R5bGUuaGFzT3duUHJvcGVydHkobikmJiFuLnN0YXJ0c1dpdGgoIl8iKSYmKGUrPXF4KDAsbi5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCIkMS0kMiIpLnRvTG93ZXJDYXNlKCksdC5zdHlsZVtuXSkpO3Quc2V0QXR0cmlidXRlKCJzdHlsZSIsZSl9ZnVuY3Rpb24gWHgodCxlLG4pe3Quc3R5bGUmJihPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChvPT57Y29uc3QgaT1vTyhvKTtuJiYhbi5oYXNPd25Qcm9wZXJ0eShvKSYmKG5bb109dC5zdHlsZVtpXSksdC5zdHlsZVtpXT1lW29dfSkpLGd4KCkmJlp4KHQpKX1mdW5jdGlvbiBLeCh0LGUpe3Quc3R5bGUmJihPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChlPT57Y29uc3Qgbj1vTyhlKTt0LnN0eWxlW25dPSIifSkpLGd4KCkmJlp4KHQpKX1mdW5jdGlvbiBKeCh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT8xPT10Lmxlbmd0aD90WzBdOml4KHQpOnR9Y29uc3QgUXg9bmV3IFJlZ0V4cCgie3tcXHMqKC4rPylcXHMqfX0iLCJnIik7ZnVuY3Rpb24gJHgodCl7bGV0IGU9W107aWYoInN0cmluZyI9PXR5cGVvZiB0KXtsZXQgbjtmb3IoO249UXguZXhlYyh0KTspZS5wdXNoKG5bMV0pO1F4Lmxhc3RJbmRleD0wfXJldHVybiBlfWZ1bmN0aW9uIHRPKHQsZSxuKXtjb25zdCBvPXQudG9TdHJpbmcoKSxpPW8ucmVwbGFjZShReCwoKHQsbyk9PntsZXQgaT1lW29dO3JldHVybiBlLmhhc093blByb3BlcnR5KG8pfHwobi5wdXNoKGBQbGVhc2UgcHJvdmlkZSBhIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uIHBhcmFtICR7b31gKSxpPSIiKSxpLnRvU3RyaW5nKCl9KSk7cmV0dXJuIGk9PW8/dDppfWZ1bmN0aW9uIGVPKHQpe2NvbnN0IGU9W107bGV0IG49dC5uZXh0KCk7Zm9yKDshbi5kb25lOyllLnB1c2gobi52YWx1ZSksbj10Lm5leHQoKTtyZXR1cm4gZX1jb25zdCBuTz0vLSsoW2EtejAtOV0pL2c7ZnVuY3Rpb24gb08odCl7cmV0dXJuIHQucmVwbGFjZShuTywoKC4uLnQpPT50WzFdLnRvVXBwZXJDYXNlKCkpKX1mdW5jdGlvbiBpTyh0LGUpe3JldHVybiAwPT09dHx8MD09PWV9ZnVuY3Rpb24gYU8odCxlLG4pe2NvbnN0IG89T2JqZWN0LmtleXMobik7aWYoby5sZW5ndGgmJmUubGVuZ3RoKXtsZXQgYT1lWzBdLHI9W107aWYoby5mb3JFYWNoKCh0PT57YS5oYXNPd25Qcm9wZXJ0eSh0KXx8ci5wdXNoKHQpLGFbdF09blt0XX0pKSxyLmxlbmd0aClmb3IodmFyIGk9MTtpPGUubGVuZ3RoO2krKyl7bGV0IG49ZVtpXTtyLmZvckVhY2goKGZ1bmN0aW9uKGUpe25bZV09c08odCxlKX0pKX19cmV0dXJuIGV9ZnVuY3Rpb24gck8odCxlLG4pe3N3aXRjaChlLnR5cGUpe2Nhc2UgNzpyZXR1cm4gdC52aXNpdFRyaWdnZXIoZSxuKTtjYXNlIDA6cmV0dXJuIHQudmlzaXRTdGF0ZShlLG4pO2Nhc2UgMTpyZXR1cm4gdC52aXNpdFRyYW5zaXRpb24oZSxuKTtjYXNlIDI6cmV0dXJuIHQudmlzaXRTZXF1ZW5jZShlLG4pO2Nhc2UgMzpyZXR1cm4gdC52aXNpdEdyb3VwKGUsbik7Y2FzZSA0OnJldHVybiB0LnZpc2l0QW5pbWF0ZShlLG4pO2Nhc2UgNTpyZXR1cm4gdC52aXNpdEtleWZyYW1lcyhlLG4pO2Nhc2UgNjpyZXR1cm4gdC52aXNpdFN0eWxlKGUsbik7Y2FzZSA4OnJldHVybiB0LnZpc2l0UmVmZXJlbmNlKGUsbik7Y2FzZSA5OnJldHVybiB0LnZpc2l0QW5pbWF0ZUNoaWxkKGUsbik7Y2FzZSAxMDpyZXR1cm4gdC52aXNpdEFuaW1hdGVSZWYoZSxuKTtjYXNlIDExOnJldHVybiB0LnZpc2l0UXVlcnkoZSxuKTtjYXNlIDEyOnJldHVybiB0LnZpc2l0U3RhZ2dlcihlLG4pO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcmVzb2x2ZSBhbmltYXRpb24gbWV0YWRhdGEgbm9kZSAjJHtlLnR5cGV9YCl9fWZ1bmN0aW9uIHNPKHQsZSl7cmV0dXJuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpW2VdfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCBsTz0iKiI7ZnVuY3Rpb24gY08odCxlKXtjb25zdCBuPVtdO3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90LnNwbGl0KC9ccyosXHMqLykuZm9yRWFjaCgodD0+KGZ1bmN0aW9uIG8odCxlLG4pe2lmKCI6Ij09dFswXSl7Y29uc3Qgbz0oZnVuY3Rpb24gbyh0LGUpe3N3aXRjaCh0KXtjYXNlIjplbnRlciI6cmV0dXJuInZvaWQgPT4gKiI7Y2FzZSI6bGVhdmUiOnJldHVybiIqID0+IHZvaWQiO2Nhc2UiOmluY3JlbWVudCI6cmV0dXJuKHQsZSk9PnBhcnNlRmxvYXQoZSk+cGFyc2VGbG9hdCh0KTtjYXNlIjpkZWNyZW1lbnQiOnJldHVybih0LGUpPT5wYXJzZUZsb2F0KGUpPHBhcnNlRmxvYXQodCk7ZGVmYXVsdDpyZXR1cm4gZS5wdXNoKGBUaGUgdHJhbnNpdGlvbiBhbGlhcyB2YWx1ZSAiJHt0fSIgaXMgbm90IHN1cHBvcnRlZGApLCIqID0+ICoifX0pKHQsbik7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG8pcmV0dXJuIHZvaWQgZS5wdXNoKG8pO3Q9b31jb25zdCBpPXQubWF0Y2goL14oXCp8Wy1cd10rKVxzKig8P1s9LV0+KVxzKihcKnxbLVx3XSspJC8pO2lmKG51bGw9PWl8fGkubGVuZ3RoPDQpcmV0dXJuIG4ucHVzaChgVGhlIHByb3ZpZGVkIHRyYW5zaXRpb24gZXhwcmVzc2lvbiAiJHt0fSIgaXMgbm90IHN1cHBvcnRlZGApLGU7Y29uc3QgYT1pWzFdLHI9aVsyXSxzPWlbM107ZS5wdXNoKG1PKGEscykpLCI8IiE9clswXXx8YT09bE8mJnM9PWxPfHxlLnB1c2gobU8ocyxhKSl9KSh0LG4sZSkpKTpuLnB1c2godCksbn1jb25zdCBkTz1uZXcgU2V0KFsidHJ1ZSIsIjEiXSkscE89bmV3IFNldChbImZhbHNlIiwiMCJdKTtmdW5jdGlvbiBtTyh0LGUpe2NvbnN0IG49ZE8uaGFzKHQpfHxwTy5oYXModCksbz1kTy5oYXMoZSl8fHBPLmhhcyhlKTtyZXR1cm4oaSxhKT0+e2xldCByPXQ9PWxPfHx0PT1pLHM9ZT09bE98fGU9PWE7cmV0dXJuIXImJm4mJiJib29sZWFuIj09dHlwZW9mIGkmJihyPWk/ZE8uaGFzKHQpOnBPLmhhcyh0KSksIXMmJm8mJiJib29sZWFuIj09dHlwZW9mIGEmJihzPWE/ZE8uaGFzKGUpOnBPLmhhcyhlKSksciYmc319Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NvbnN0IHVPPW5ldyBSZWdFeHAoInMqOnNlbGZzKiw/IiwiZyIpO2Z1bmN0aW9uIGZPKHQsZSxuKXtyZXR1cm4gbmV3IGdPKHQpLmJ1aWxkKGUsbil9Y2xhc3MgZ097Y29uc3RydWN0b3IodCl7dGhpcy5fZHJpdmVyPXR9YnVpbGQodCxlKXtjb25zdCBuPW5ldyBoTyhlKTtyZXR1cm4gdGhpcy5fcmVzZXRDb250ZXh0U3R5bGVUaW1pbmdTdGF0ZShuKSxyTyh0aGlzLEp4KHQpLG4pfV9yZXNldENvbnRleHRTdHlsZVRpbWluZ1N0YXRlKHQpe3QuY3VycmVudFF1ZXJ5U2VsZWN0b3I9IiIsdC5jb2xsZWN0ZWRTdHlsZXM9e30sdC5jb2xsZWN0ZWRTdHlsZXNbIiJdPXt9LHQuY3VycmVudFRpbWU9MH12aXNpdFRyaWdnZXIodCxlKXtsZXQgbj1lLnF1ZXJ5Q291bnQ9MCxvPWUuZGVwQ291bnQ9MDtjb25zdCBpPVtdLGE9W107cmV0dXJuIkAiPT10Lm5hbWUuY2hhckF0KDApJiZlLmVycm9ycy5wdXNoKCJhbmltYXRpb24gdHJpZ2dlcnMgY2Fubm90IGJlIHByZWZpeGVkIHdpdGggYW4gYEBgIHNpZ24gKGUuZy4gdHJpZ2dlcignQGZvbycsIFsuLi5dKSkiKSx0LmRlZmluaXRpb25zLmZvckVhY2goKHQ9PntpZih0aGlzLl9yZXNldENvbnRleHRTdHlsZVRpbWluZ1N0YXRlKGUpLDA9PXQudHlwZSl7Y29uc3Qgbj10LG89bi5uYW1lO28udG9TdHJpbmcoKS5zcGxpdCgvXHMqLFxzKi8pLmZvckVhY2goKHQ9PntuLm5hbWU9dCxpLnB1c2godGhpcy52aXNpdFN0YXRlKG4sZSkpfSkpLG4ubmFtZT1vfWVsc2UgaWYoMT09dC50eXBlKXtjb25zdCBpPXRoaXMudmlzaXRUcmFuc2l0aW9uKHQsZSk7bis9aS5xdWVyeUNvdW50LG8rPWkuZGVwQ291bnQsYS5wdXNoKGkpfWVsc2UgZS5lcnJvcnMucHVzaCgib25seSBzdGF0ZSgpIGFuZCB0cmFuc2l0aW9uKCkgZGVmaW5pdGlvbnMgY2FuIHNpdCBpbnNpZGUgb2YgYSB0cmlnZ2VyKCkiKX0pKSx7dHlwZTo3LG5hbWU6dC5uYW1lLHN0YXRlczppLHRyYW5zaXRpb25zOmEscXVlcnlDb3VudDpuLGRlcENvdW50Om8sb3B0aW9uczpudWxsfX12aXNpdFN0YXRlKHQsZSl7Y29uc3Qgbj10aGlzLnZpc2l0U3R5bGUodC5zdHlsZXMsZSksbz10Lm9wdGlvbnMmJnQub3B0aW9ucy5wYXJhbXN8fG51bGw7aWYobi5jb250YWluc0R5bmFtaWNTdHlsZXMpe2NvbnN0IGk9bmV3IFNldCxhPW98fHt9O2lmKG4uc3R5bGVzLmZvckVhY2goKHQ9PntpZihiTyh0KSl7Y29uc3QgZT10O09iamVjdC5rZXlzKGUpLmZvckVhY2goKHQ9PnskeChlW3RdKS5mb3JFYWNoKCh0PT57YS5oYXNPd25Qcm9wZXJ0eSh0KXx8aS5hZGQodCl9KSl9KSl9fSkpLGkuc2l6ZSl7Y29uc3Qgbj1lTyhpLnZhbHVlcygpKTtlLmVycm9ycy5wdXNoKGBzdGF0ZSgiJHt0Lm5hbWV9IiwgLi4uKSBtdXN0IGRlZmluZSBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIHRoZSBmb2xsb3dpbmcgc3R5bGUgc3Vic3RpdHV0aW9uczogJHtuLmpvaW4oIiwgIil9YCl9fXJldHVybnt0eXBlOjAsbmFtZTp0Lm5hbWUsc3R5bGU6bixvcHRpb25zOm8/e3BhcmFtczpvfTpudWxsfX12aXNpdFRyYW5zaXRpb24odCxlKXtlLnF1ZXJ5Q291bnQ9MCxlLmRlcENvdW50PTA7Y29uc3Qgbj1yTyh0aGlzLEp4KHQuYW5pbWF0aW9uKSxlKTtyZXR1cm57dHlwZToxLG1hdGNoZXJzOmNPKHQuZXhwcixlLmVycm9ycyksYW5pbWF0aW9uOm4scXVlcnlDb3VudDplLnF1ZXJ5Q291bnQsZGVwQ291bnQ6ZS5kZXBDb3VudCxvcHRpb25zOnlPKHQub3B0aW9ucyl9fXZpc2l0U2VxdWVuY2UodCxlKXtyZXR1cm57dHlwZToyLHN0ZXBzOnQuc3RlcHMubWFwKCh0PT5yTyh0aGlzLHQsZSkpKSxvcHRpb25zOnlPKHQub3B0aW9ucyl9fXZpc2l0R3JvdXAodCxlKXtjb25zdCBuPWUuY3VycmVudFRpbWU7bGV0IG89MDtjb25zdCBpPXQuc3RlcHMubWFwKCh0PT57ZS5jdXJyZW50VGltZT1uO2NvbnN0IGk9ck8odGhpcyx0LGUpO3JldHVybiBvPU1hdGgubWF4KG8sZS5jdXJyZW50VGltZSksaX0pKTtyZXR1cm4gZS5jdXJyZW50VGltZT1vLHt0eXBlOjMsc3RlcHM6aSxvcHRpb25zOnlPKHQub3B0aW9ucyl9fXZpc2l0QW5pbWF0ZSh0LGUpe2NvbnN0IG49KGZ1bmN0aW9uIG8odCxlKXtsZXQgbj1udWxsO2lmKHQuaGFzT3duUHJvcGVydHkoImR1cmF0aW9uIikpbj10O2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiBfTyhHeCh0LGUpLmR1cmF0aW9uLDAsIiIpO2NvbnN0IG89dDtpZihvLnNwbGl0KC9ccysvKS5zb21lKCh0PT4ieyI9PXQuY2hhckF0KDApJiYieyI9PXQuY2hhckF0KDEpKSkpe2NvbnN0IHQ9X08oMCwwLCIiKTtyZXR1cm4gdC5keW5hbWljPSEwLHQuc3RyVmFsdWU9byx0fXJldHVybiBuPW58fEd4KG8sZSksX08obi5kdXJhdGlvbixuLmRlbGF5LG4uZWFzaW5nKX0pKHQudGltaW5ncyxlLmVycm9ycyk7bGV0IGk7ZS5jdXJyZW50QW5pbWF0ZVRpbWluZ3M9bjtsZXQgYT10LnN0eWxlcz90LnN0eWxlczpheCh7fSk7aWYoNT09YS50eXBlKWk9dGhpcy52aXNpdEtleWZyYW1lcyhhLGUpO2Vsc2V7bGV0IG89dC5zdHlsZXMsYT0hMTtpZighbyl7YT0hMDtjb25zdCB0PXt9O24uZWFzaW5nJiYodC5lYXNpbmc9bi5lYXNpbmcpLG89YXgodCl9ZS5jdXJyZW50VGltZSs9bi5kdXJhdGlvbituLmRlbGF5O2NvbnN0IHI9dGhpcy52aXNpdFN0eWxlKG8sZSk7ci5pc0VtcHR5U3RlcD1hLGk9cn1yZXR1cm4gZS5jdXJyZW50QW5pbWF0ZVRpbWluZ3M9bnVsbCx7dHlwZTo0LHRpbWluZ3M6bixzdHlsZTppLG9wdGlvbnM6bnVsbH19dmlzaXRTdHlsZSh0LGUpe2NvbnN0IG49dGhpcy5fbWFrZVN0eWxlQXN0KHQsZSk7cmV0dXJuIHRoaXMuX3ZhbGlkYXRlU3R5bGVBc3QobixlKSxufV9tYWtlU3R5bGVBc3QodCxlKXtjb25zdCBuPVtdO0FycmF5LmlzQXJyYXkodC5zdHlsZXMpP3Quc3R5bGVzLmZvckVhY2goKHQ9Pnsic3RyaW5nIj09dHlwZW9mIHQ/dD09ZXg/bi5wdXNoKHQpOmUuZXJyb3JzLnB1c2goYFRoZSBwcm92aWRlZCBzdHlsZSBzdHJpbmcgdmFsdWUgJHt0fSBpcyBub3QgYWxsb3dlZC5gKTpuLnB1c2godCl9KSk6bi5wdXNoKHQuc3R5bGVzKTtsZXQgbz0hMSxpPW51bGw7cmV0dXJuIG4uZm9yRWFjaCgodD0+e2lmKGJPKHQpKXtjb25zdCBlPXQsbj1lLmVhc2luZztpZihuJiYoaT1uLGRlbGV0ZSBlLmVhc2luZyksIW8pZm9yKGxldCB0IGluIGUpaWYoZVt0XS50b1N0cmluZygpLmluZGV4T2YoInt7Iik+PTApe289ITA7YnJlYWt9fX0pKSx7dHlwZTo2LHN0eWxlczpuLGVhc2luZzppLG9mZnNldDp0Lm9mZnNldCxjb250YWluc0R5bmFtaWNTdHlsZXM6byxvcHRpb25zOm51bGx9fV92YWxpZGF0ZVN0eWxlQXN0KHQsZSl7Y29uc3Qgbj1lLmN1cnJlbnRBbmltYXRlVGltaW5ncztsZXQgbz1lLmN1cnJlbnRUaW1lLGk9ZS5jdXJyZW50VGltZTtuJiZpPjAmJihpLT1uLmR1cmF0aW9uK24uZGVsYXkpLHQuc3R5bGVzLmZvckVhY2goKHQ9Pnsic3RyaW5nIiE9dHlwZW9mIHQmJk9iamVjdC5rZXlzKHQpLmZvckVhY2goKG49PntpZighdGhpcy5fZHJpdmVyLnZhbGlkYXRlU3R5bGVQcm9wZXJ0eShuKSlyZXR1cm4gdm9pZCBlLmVycm9ycy5wdXNoKGBUaGUgcHJvdmlkZWQgYW5pbWF0aW9uIHByb3BlcnR5ICIke259IiBpcyBub3QgYSBzdXBwb3J0ZWQgQ1NTIHByb3BlcnR5IGZvciBhbmltYXRpb25zYCk7Y29uc3QgYT1lLmNvbGxlY3RlZFN0eWxlc1tlLmN1cnJlbnRRdWVyeVNlbGVjdG9yXSxyPWFbbl07bGV0IHM9ITA7ciYmKGkhPW8mJmk+PXIuc3RhcnRUaW1lJiZvPD1yLmVuZFRpbWUmJihlLmVycm9ycy5wdXNoKGBUaGUgQ1NTIHByb3BlcnR5ICIke259IiB0aGF0IGV4aXN0cyBiZXR3ZWVuIHRoZSB0aW1lcyBvZiAiJHtyLnN0YXJ0VGltZX1tcyIgYW5kICIke3IuZW5kVGltZX1tcyIgaXMgYWxzbyBiZWluZyBhbmltYXRlZCBpbiBhIHBhcmFsbGVsIGFuaW1hdGlvbiBiZXR3ZWVuIHRoZSB0aW1lcyBvZiAiJHtpfW1zIiBhbmQgIiR7b31tcyJgKSxzPSExKSxpPXIuc3RhcnRUaW1lKSxzJiYoYVtuXT17c3RhcnRUaW1lOmksZW5kVGltZTpvfSksZS5vcHRpb25zJiYoZnVuY3Rpb24gbCh0LGUsbil7Y29uc3Qgbz1lLnBhcmFtc3x8e30saT0keCh0KTtpLmxlbmd0aCYmaS5mb3JFYWNoKCh0PT57by5oYXNPd25Qcm9wZXJ0eSh0KXx8bi5wdXNoKGBVbmFibGUgdG8gcmVzb2x2ZSB0aGUgbG9jYWwgYW5pbWF0aW9uIHBhcmFtICR7dH0gaW4gdGhlIGdpdmVuIGxpc3Qgb2YgdmFsdWVzYCl9KSl9KSh0W25dLGUub3B0aW9ucyxlLmVycm9ycyl9KSl9KSl9dmlzaXRLZXlmcmFtZXModCxlKXtjb25zdCBuPXt0eXBlOjUsc3R5bGVzOltdLG9wdGlvbnM6bnVsbH07aWYoIWUuY3VycmVudEFuaW1hdGVUaW1pbmdzKXJldHVybiBlLmVycm9ycy5wdXNoKCJrZXlmcmFtZXMoKSBtdXN0IGJlIHBsYWNlZCBpbnNpZGUgb2YgYSBjYWxsIHRvIGFuaW1hdGUoKSIpLG47bGV0IG89MDtjb25zdCBpPVtdO2xldCBhPSExLHI9ITEscz0wO2NvbnN0IGw9dC5zdGVwcy5tYXAoKHQ9Pntjb25zdCBuPXRoaXMuX21ha2VTdHlsZUFzdCh0LGUpO2xldCBsPW51bGwhPW4ub2Zmc2V0P24ub2Zmc2V0OihmdW5jdGlvbiBjKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gbnVsbDtsZXQgZT1udWxsO2lmKEFycmF5LmlzQXJyYXkodCkpdC5mb3JFYWNoKCh0PT57aWYoYk8odCkmJnQuaGFzT3duUHJvcGVydHkoIm9mZnNldCIpKXtjb25zdCBuPXQ7ZT1wYXJzZUZsb2F0KG4ub2Zmc2V0KSxkZWxldGUgbi5vZmZzZXR9fSkpO2Vsc2UgaWYoYk8odCkmJnQuaGFzT3duUHJvcGVydHkoIm9mZnNldCIpKXtjb25zdCBuPXQ7ZT1wYXJzZUZsb2F0KG4ub2Zmc2V0KSxkZWxldGUgbi5vZmZzZXR9cmV0dXJuIGV9KShuLnN0eWxlcyksZD0wO3JldHVybiBudWxsIT1sJiYobysrLGQ9bi5vZmZzZXQ9bCkscj1yfHxkPDB8fGQ+MSxhPWF8fGQ8cyxzPWQsaS5wdXNoKGQpLG59KSk7ciYmZS5lcnJvcnMucHVzaCgiUGxlYXNlIGVuc3VyZSB0aGF0IGFsbCBrZXlmcmFtZSBvZmZzZXRzIGFyZSBiZXR3ZWVuIDAgYW5kIDEiKSxhJiZlLmVycm9ycy5wdXNoKCJQbGVhc2UgZW5zdXJlIHRoYXQgYWxsIGtleWZyYW1lIG9mZnNldHMgYXJlIGluIG9yZGVyIik7Y29uc3QgYz10LnN0ZXBzLmxlbmd0aDtsZXQgZD0wO28+MCYmbzxjP2UuZXJyb3JzLnB1c2goIk5vdCBhbGwgc3R5bGUoKSBzdGVwcyB3aXRoaW4gdGhlIGRlY2xhcmVkIGtleWZyYW1lcygpIGNvbnRhaW4gb2Zmc2V0cyIpOjA9PW8mJihkPTEvKGMtMSkpO2NvbnN0IHA9Yy0xLG09ZS5jdXJyZW50VGltZSx1PWUuY3VycmVudEFuaW1hdGVUaW1pbmdzLGY9dS5kdXJhdGlvbjtyZXR1cm4gbC5mb3JFYWNoKCgodCxvKT0+e2NvbnN0IGE9ZD4wP289PXA/MTpkKm86aVtvXSxyPWEqZjtlLmN1cnJlbnRUaW1lPW0rdS5kZWxheStyLHUuZHVyYXRpb249cix0aGlzLl92YWxpZGF0ZVN0eWxlQXN0KHQsZSksdC5vZmZzZXQ9YSxuLnN0eWxlcy5wdXNoKHQpfSkpLG59dmlzaXRSZWZlcmVuY2UodCxlKXtyZXR1cm57dHlwZTo4LGFuaW1hdGlvbjpyTyh0aGlzLEp4KHQuYW5pbWF0aW9uKSxlKSxvcHRpb25zOnlPKHQub3B0aW9ucyl9fXZpc2l0QW5pbWF0ZUNoaWxkKHQsZSl7cmV0dXJuIGUuZGVwQ291bnQrKyx7dHlwZTo5LG9wdGlvbnM6eU8odC5vcHRpb25zKX19dmlzaXRBbmltYXRlUmVmKHQsZSl7cmV0dXJue3R5cGU6MTAsYW5pbWF0aW9uOnRoaXMudmlzaXRSZWZlcmVuY2UodC5hbmltYXRpb24sZSksb3B0aW9uczp5Tyh0Lm9wdGlvbnMpfX12aXNpdFF1ZXJ5KHQsZSl7Y29uc3Qgbj1lLmN1cnJlbnRRdWVyeVNlbGVjdG9yLG89dC5vcHRpb25zfHx7fTtlLnF1ZXJ5Q291bnQrKyxlLmN1cnJlbnRRdWVyeT10O2NvbnN0W2ksYV09KGZ1bmN0aW9uIHIodCl7Y29uc3QgZT0hIXQuc3BsaXQoL1xzKixccyovKS5maW5kKCh0PT4iOnNlbGYiPT10KSk7cmV0dXJuIGUmJih0PXQucmVwbGFjZSh1TywiIikpLFt0PXQucmVwbGFjZSgvQFwqL2csTHgpLnJlcGxhY2UoL0BcdysvZywodD0+Ii5uZy10cmlnZ2VyLSIrdC5zdWJzdHIoMSkpKS5yZXBsYWNlKC86YW5pbWF0aW5nL2csVngpLGVdfSkodC5zZWxlY3Rvcik7ZS5jdXJyZW50UXVlcnlTZWxlY3Rvcj1uLmxlbmd0aD9uKyIgIitpOmksTXgoZS5jb2xsZWN0ZWRTdHlsZXMsZS5jdXJyZW50UXVlcnlTZWxlY3Rvcix7fSk7Y29uc3Qgcz1yTyh0aGlzLEp4KHQuYW5pbWF0aW9uKSxlKTtyZXR1cm4gZS5jdXJyZW50UXVlcnk9bnVsbCxlLmN1cnJlbnRRdWVyeVNlbGVjdG9yPW4se3R5cGU6MTEsc2VsZWN0b3I6aSxsaW1pdDpvLmxpbWl0fHwwLG9wdGlvbmFsOiEhby5vcHRpb25hbCxpbmNsdWRlU2VsZjphLGFuaW1hdGlvbjpzLG9yaWdpbmFsU2VsZWN0b3I6dC5zZWxlY3RvcixvcHRpb25zOnlPKHQub3B0aW9ucyl9fXZpc2l0U3RhZ2dlcih0LGUpe2UuY3VycmVudFF1ZXJ5fHxlLmVycm9ycy5wdXNoKCJzdGFnZ2VyKCkgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgb2YgcXVlcnkoKSIpO2NvbnN0IG49ImZ1bGwiPT09dC50aW1pbmdzP3tkdXJhdGlvbjowLGRlbGF5OjAsZWFzaW5nOiJmdWxsIn06R3godC50aW1pbmdzLGUuZXJyb3JzLCEwKTtyZXR1cm57dHlwZToxMixhbmltYXRpb246ck8odGhpcyxKeCh0LmFuaW1hdGlvbiksZSksdGltaW5nczpuLG9wdGlvbnM6bnVsbH19fWNsYXNzIGhPe2NvbnN0cnVjdG9yKHQpe3RoaXMuZXJyb3JzPXQsdGhpcy5xdWVyeUNvdW50PTAsdGhpcy5kZXBDb3VudD0wLHRoaXMuY3VycmVudFRyYW5zaXRpb249bnVsbCx0aGlzLmN1cnJlbnRRdWVyeT1udWxsLHRoaXMuY3VycmVudFF1ZXJ5U2VsZWN0b3I9bnVsbCx0aGlzLmN1cnJlbnRBbmltYXRlVGltaW5ncz1udWxsLHRoaXMuY3VycmVudFRpbWU9MCx0aGlzLmNvbGxlY3RlZFN0eWxlcz17fSx0aGlzLm9wdGlvbnM9bnVsbH19ZnVuY3Rpb24gYk8odCl7cmV0dXJuIUFycmF5LmlzQXJyYXkodCkmJiJvYmplY3QiPT10eXBlb2YgdH1mdW5jdGlvbiB5Tyh0KXtyZXR1cm4gdD8odD1XeCh0KSkucGFyYW1zJiYodC5wYXJhbXM9KGZ1bmN0aW9uIGUodCl7cmV0dXJuIHQ/V3godCk6bnVsbH0pKHQucGFyYW1zKSk6dD17fSx0fWZ1bmN0aW9uIF9PKHQsZSxuKXtyZXR1cm57ZHVyYXRpb246dCxkZWxheTplLGVhc2luZzpufX1mdW5jdGlvbiBDTyh0LGUsbixvLGksYSxyPW51bGwscz0hMSl7cmV0dXJue3R5cGU6MSxlbGVtZW50OnQsa2V5ZnJhbWVzOmUscHJlU3R5bGVQcm9wczpuLHBvc3RTdHlsZVByb3BzOm8sZHVyYXRpb246aSxkZWxheTphLHRvdGFsVGltZTppK2EsZWFzaW5nOnIsc3ViVGltZWxpbmU6c319Y2xhc3MgTU97Y29uc3RydWN0b3IoKXt0aGlzLl9tYXA9bmV3IE1hcH1jb25zdW1lKHQpe2xldCBlPXRoaXMuX21hcC5nZXQodCk7cmV0dXJuIGU/dGhpcy5fbWFwLmRlbGV0ZSh0KTplPVtdLGV9YXBwZW5kKHQsZSl7bGV0IG49dGhpcy5fbWFwLmdldCh0KTtufHx0aGlzLl9tYXAuc2V0KHQsbj1bXSksbi5wdXNoKC4uLmUpfWhhcyh0KXtyZXR1cm4gdGhpcy5fbWFwLmhhcyh0KX1jbGVhcigpe3RoaXMuX21hcC5jbGVhcigpfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3Qgdk89bmV3IFJlZ0V4cCgiOmVudGVyIiwiZyIpLHhPPW5ldyBSZWdFeHAoIjpsZWF2ZSIsImciKTtmdW5jdGlvbiBPTyh0LGUsbixvLGksYT17fSxyPXt9LHMsbCxjPVtdKXtyZXR1cm4obmV3IFBPKS5idWlsZEtleWZyYW1lcyh0LGUsbixvLGksYSxyLHMsbCxjKX1jbGFzcyBQT3tidWlsZEtleWZyYW1lcyh0LGUsbixvLGksYSxyLHMsbCxjPVtdKXtsPWx8fG5ldyBNTztjb25zdCBkPW5ldyBrTyh0LGUsbCxvLGksYyxbXSk7ZC5vcHRpb25zPXMsZC5jdXJyZW50VGltZWxpbmUuc2V0U3R5bGVzKFthXSxudWxsLGQuZXJyb3JzLHMpLHJPKHRoaXMsbixkKTtjb25zdCBwPWQudGltZWxpbmVzLmZpbHRlcigodD0+dC5jb250YWluc0FuaW1hdGlvbigpKSk7aWYocC5sZW5ndGgmJk9iamVjdC5rZXlzKHIpLmxlbmd0aCl7Y29uc3QgdD1wW3AubGVuZ3RoLTFdO3QuYWxsb3dPbmx5VGltZWxpbmVTdHlsZXMoKXx8dC5zZXRTdHlsZXMoW3JdLG51bGwsZC5lcnJvcnMscyl9cmV0dXJuIHAubGVuZ3RoP3AubWFwKCh0PT50LmJ1aWxkS2V5ZnJhbWVzKCkpKTpbQ08oZSxbXSxbXSxbXSwwLDAsIiIsITEpXX12aXNpdFRyaWdnZXIodCxlKXt9dmlzaXRTdGF0ZSh0LGUpe312aXNpdFRyYW5zaXRpb24odCxlKXt9dmlzaXRBbmltYXRlQ2hpbGQodCxlKXtjb25zdCBuPWUuc3ViSW5zdHJ1Y3Rpb25zLmNvbnN1bWUoZS5lbGVtZW50KTtpZihuKXtjb25zdCBvPWUuY3JlYXRlU3ViQ29udGV4dCh0Lm9wdGlvbnMpLGk9ZS5jdXJyZW50VGltZWxpbmUuY3VycmVudFRpbWUsYT10aGlzLl92aXNpdFN1Ykluc3RydWN0aW9ucyhuLG8sby5vcHRpb25zKTtpIT1hJiZlLnRyYW5zZm9ybUludG9OZXdUaW1lbGluZShhKX1lLnByZXZpb3VzTm9kZT10fXZpc2l0QW5pbWF0ZVJlZih0LGUpe2NvbnN0IG49ZS5jcmVhdGVTdWJDb250ZXh0KHQub3B0aW9ucyk7bi50cmFuc2Zvcm1JbnRvTmV3VGltZWxpbmUoKSx0aGlzLnZpc2l0UmVmZXJlbmNlKHQuYW5pbWF0aW9uLG4pLGUudHJhbnNmb3JtSW50b05ld1RpbWVsaW5lKG4uY3VycmVudFRpbWVsaW5lLmN1cnJlbnRUaW1lKSxlLnByZXZpb3VzTm9kZT10fV92aXNpdFN1Ykluc3RydWN0aW9ucyh0LGUsbil7bGV0IG89ZS5jdXJyZW50VGltZWxpbmUuY3VycmVudFRpbWU7Y29uc3QgaT1udWxsIT1uLmR1cmF0aW9uP2p4KG4uZHVyYXRpb24pOm51bGwsYT1udWxsIT1uLmRlbGF5P2p4KG4uZGVsYXkpOm51bGw7cmV0dXJuIDAhPT1pJiZ0LmZvckVhY2goKHQ9Pntjb25zdCBuPWUuYXBwZW5kSW5zdHJ1Y3Rpb25Ub1RpbWVsaW5lKHQsaSxhKTtvPU1hdGgubWF4KG8sbi5kdXJhdGlvbituLmRlbGF5KX0pKSxvfXZpc2l0UmVmZXJlbmNlKHQsZSl7ZS51cGRhdGVPcHRpb25zKHQub3B0aW9ucywhMCksck8odGhpcyx0LmFuaW1hdGlvbixlKSxlLnByZXZpb3VzTm9kZT10fXZpc2l0U2VxdWVuY2UodCxlKXtjb25zdCBuPWUuc3ViQ29udGV4dENvdW50O2xldCBvPWU7Y29uc3QgaT10Lm9wdGlvbnM7aWYoaSYmKGkucGFyYW1zfHxpLmRlbGF5KSYmKG89ZS5jcmVhdGVTdWJDb250ZXh0KGkpLG8udHJhbnNmb3JtSW50b05ld1RpbWVsaW5lKCksbnVsbCE9aS5kZWxheSkpezY9PW8ucHJldmlvdXNOb2RlLnR5cGUmJihvLmN1cnJlbnRUaW1lbGluZS5zbmFwc2hvdEN1cnJlbnRTdHlsZXMoKSxvLnByZXZpb3VzTm9kZT13Tyk7Y29uc3QgdD1qeChpLmRlbGF5KTtvLmRlbGF5TmV4dFN0ZXAodCl9dC5zdGVwcy5sZW5ndGgmJih0LnN0ZXBzLmZvckVhY2goKHQ9PnJPKHRoaXMsdCxvKSkpLG8uY3VycmVudFRpbWVsaW5lLmFwcGx5U3R5bGVzVG9LZXlmcmFtZSgpLG8uc3ViQ29udGV4dENvdW50Pm4mJm8udHJhbnNmb3JtSW50b05ld1RpbWVsaW5lKCkpLGUucHJldmlvdXNOb2RlPXR9dmlzaXRHcm91cCh0LGUpe2NvbnN0IG49W107bGV0IG89ZS5jdXJyZW50VGltZWxpbmUuY3VycmVudFRpbWU7Y29uc3QgaT10Lm9wdGlvbnMmJnQub3B0aW9ucy5kZWxheT9qeCh0Lm9wdGlvbnMuZGVsYXkpOjA7dC5zdGVwcy5mb3JFYWNoKChhPT57Y29uc3Qgcj1lLmNyZWF0ZVN1YkNvbnRleHQodC5vcHRpb25zKTtpJiZyLmRlbGF5TmV4dFN0ZXAoaSksck8odGhpcyxhLHIpLG89TWF0aC5tYXgobyxyLmN1cnJlbnRUaW1lbGluZS5jdXJyZW50VGltZSksbi5wdXNoKHIuY3VycmVudFRpbWVsaW5lKX0pKSxuLmZvckVhY2goKHQ9PmUuY3VycmVudFRpbWVsaW5lLm1lcmdlVGltZWxpbmVDb2xsZWN0ZWRTdHlsZXModCkpKSxlLnRyYW5zZm9ybUludG9OZXdUaW1lbGluZShvKSxlLnByZXZpb3VzTm9kZT10fV92aXNpdFRpbWluZyh0LGUpe2lmKHQuZHluYW1pYyl7Y29uc3Qgbj10LnN0clZhbHVlO3JldHVybiBHeChlLnBhcmFtcz90TyhuLGUucGFyYW1zLGUuZXJyb3JzKTpuLGUuZXJyb3JzKX1yZXR1cm57ZHVyYXRpb246dC5kdXJhdGlvbixkZWxheTp0LmRlbGF5LGVhc2luZzp0LmVhc2luZ319dmlzaXRBbmltYXRlKHQsZSl7Y29uc3Qgbj1lLmN1cnJlbnRBbmltYXRlVGltaW5ncz10aGlzLl92aXNpdFRpbWluZyh0LnRpbWluZ3MsZSksbz1lLmN1cnJlbnRUaW1lbGluZTtuLmRlbGF5JiYoZS5pbmNyZW1lbnRUaW1lKG4uZGVsYXkpLG8uc25hcHNob3RDdXJyZW50U3R5bGVzKCkpO2NvbnN0IGk9dC5zdHlsZTs1PT1pLnR5cGU/dGhpcy52aXNpdEtleWZyYW1lcyhpLGUpOihlLmluY3JlbWVudFRpbWUobi5kdXJhdGlvbiksdGhpcy52aXNpdFN0eWxlKGksZSksby5hcHBseVN0eWxlc1RvS2V5ZnJhbWUoKSksZS5jdXJyZW50QW5pbWF0ZVRpbWluZ3M9bnVsbCxlLnByZXZpb3VzTm9kZT10fXZpc2l0U3R5bGUodCxlKXtjb25zdCBuPWUuY3VycmVudFRpbWVsaW5lLG89ZS5jdXJyZW50QW5pbWF0ZVRpbWluZ3M7IW8mJm4uZ2V0Q3VycmVudFN0eWxlUHJvcGVydGllcygpLmxlbmd0aCYmbi5mb3J3YXJkRnJhbWUoKTtjb25zdCBpPW8mJm8uZWFzaW5nfHx0LmVhc2luZzt0LmlzRW1wdHlTdGVwP24uYXBwbHlFbXB0eVN0ZXAoaSk6bi5zZXRTdHlsZXModC5zdHlsZXMsaSxlLmVycm9ycyxlLm9wdGlvbnMpLGUucHJldmlvdXNOb2RlPXR9dmlzaXRLZXlmcmFtZXModCxlKXtjb25zdCBuPWUuY3VycmVudEFuaW1hdGVUaW1pbmdzLG89ZS5jdXJyZW50VGltZWxpbmUuZHVyYXRpb24saT1uLmR1cmF0aW9uLGE9ZS5jcmVhdGVTdWJDb250ZXh0KCkuY3VycmVudFRpbWVsaW5lO2EuZWFzaW5nPW4uZWFzaW5nLHQuc3R5bGVzLmZvckVhY2goKHQ9PnthLmZvcndhcmRUaW1lKCh0Lm9mZnNldHx8MCkqaSksYS5zZXRTdHlsZXModC5zdHlsZXMsdC5lYXNpbmcsZS5lcnJvcnMsZS5vcHRpb25zKSxhLmFwcGx5U3R5bGVzVG9LZXlmcmFtZSgpfSkpLGUuY3VycmVudFRpbWVsaW5lLm1lcmdlVGltZWxpbmVDb2xsZWN0ZWRTdHlsZXMoYSksZS50cmFuc2Zvcm1JbnRvTmV3VGltZWxpbmUobytpKSxlLnByZXZpb3VzTm9kZT10fXZpc2l0UXVlcnkodCxlKXtjb25zdCBuPWUuY3VycmVudFRpbWVsaW5lLmN1cnJlbnRUaW1lLG89dC5vcHRpb25zfHx7fSxpPW8uZGVsYXk/angoby5kZWxheSk6MDtpJiYoNj09PWUucHJldmlvdXNOb2RlLnR5cGV8fDA9PW4mJmUuY3VycmVudFRpbWVsaW5lLmdldEN1cnJlbnRTdHlsZVByb3BlcnRpZXMoKS5sZW5ndGgpJiYoZS5jdXJyZW50VGltZWxpbmUuc25hcHNob3RDdXJyZW50U3R5bGVzKCksZS5wcmV2aW91c05vZGU9d08pO2xldCBhPW47Y29uc3Qgcj1lLmludm9rZVF1ZXJ5KHQuc2VsZWN0b3IsdC5vcmlnaW5hbFNlbGVjdG9yLHQubGltaXQsdC5pbmNsdWRlU2VsZiwhIW8ub3B0aW9uYWwsZS5lcnJvcnMpO2UuY3VycmVudFF1ZXJ5VG90YWw9ci5sZW5ndGg7bGV0IHM9bnVsbDtyLmZvckVhY2goKChuLG8pPT57ZS5jdXJyZW50UXVlcnlJbmRleD1vO2NvbnN0IHI9ZS5jcmVhdGVTdWJDb250ZXh0KHQub3B0aW9ucyxuKTtpJiZyLmRlbGF5TmV4dFN0ZXAoaSksbj09PWUuZWxlbWVudCYmKHM9ci5jdXJyZW50VGltZWxpbmUpLHJPKHRoaXMsdC5hbmltYXRpb24sciksci5jdXJyZW50VGltZWxpbmUuYXBwbHlTdHlsZXNUb0tleWZyYW1lKCksYT1NYXRoLm1heChhLHIuY3VycmVudFRpbWVsaW5lLmN1cnJlbnRUaW1lKX0pKSxlLmN1cnJlbnRRdWVyeUluZGV4PTAsZS5jdXJyZW50UXVlcnlUb3RhbD0wLGUudHJhbnNmb3JtSW50b05ld1RpbWVsaW5lKGEpLHMmJihlLmN1cnJlbnRUaW1lbGluZS5tZXJnZVRpbWVsaW5lQ29sbGVjdGVkU3R5bGVzKHMpLGUuY3VycmVudFRpbWVsaW5lLnNuYXBzaG90Q3VycmVudFN0eWxlcygpKSxlLnByZXZpb3VzTm9kZT10fXZpc2l0U3RhZ2dlcih0LGUpe2NvbnN0IG49ZS5wYXJlbnRDb250ZXh0LG89ZS5jdXJyZW50VGltZWxpbmUsaT10LnRpbWluZ3MsYT1NYXRoLmFicyhpLmR1cmF0aW9uKSxyPWEqKGUuY3VycmVudFF1ZXJ5VG90YWwtMSk7bGV0IHM9YSplLmN1cnJlbnRRdWVyeUluZGV4O3N3aXRjaChpLmR1cmF0aW9uPDA/InJldmVyc2UiOmkuZWFzaW5nKXtjYXNlInJldmVyc2UiOnM9ci1zO2JyZWFrO2Nhc2UiZnVsbCI6cz1uLmN1cnJlbnRTdGFnZ2VyVGltZX1jb25zdCBsPWUuY3VycmVudFRpbWVsaW5lO3MmJmwuZGVsYXlOZXh0U3RlcChzKTtjb25zdCBjPWwuY3VycmVudFRpbWU7ck8odGhpcyx0LmFuaW1hdGlvbixlKSxlLnByZXZpb3VzTm9kZT10LG4uY3VycmVudFN0YWdnZXJUaW1lPW8uY3VycmVudFRpbWUtYysoby5zdGFydFRpbWUtbi5jdXJyZW50VGltZWxpbmUuc3RhcnRUaW1lKX19Y29uc3Qgd089e307Y2xhc3Mga097Y29uc3RydWN0b3IodCxlLG4sbyxpLGEscixzKXt0aGlzLl9kcml2ZXI9dCx0aGlzLmVsZW1lbnQ9ZSx0aGlzLnN1Ykluc3RydWN0aW9ucz1uLHRoaXMuX2VudGVyQ2xhc3NOYW1lPW8sdGhpcy5fbGVhdmVDbGFzc05hbWU9aSx0aGlzLmVycm9ycz1hLHRoaXMudGltZWxpbmVzPXIsdGhpcy5wYXJlbnRDb250ZXh0PW51bGwsdGhpcy5jdXJyZW50QW5pbWF0ZVRpbWluZ3M9bnVsbCx0aGlzLnByZXZpb3VzTm9kZT13Tyx0aGlzLnN1YkNvbnRleHRDb3VudD0wLHRoaXMub3B0aW9ucz17fSx0aGlzLmN1cnJlbnRRdWVyeUluZGV4PTAsdGhpcy5jdXJyZW50UXVlcnlUb3RhbD0wLHRoaXMuY3VycmVudFN0YWdnZXJUaW1lPTAsdGhpcy5jdXJyZW50VGltZWxpbmU9c3x8bmV3IFNPKHRoaXMuX2RyaXZlcixlLDApLHIucHVzaCh0aGlzLmN1cnJlbnRUaW1lbGluZSl9Z2V0IHBhcmFtcygpe3JldHVybiB0aGlzLm9wdGlvbnMucGFyYW1zfXVwZGF0ZU9wdGlvbnModCxlKXtpZighdClyZXR1cm47Y29uc3Qgbj10O2xldCBvPXRoaXMub3B0aW9ucztudWxsIT1uLmR1cmF0aW9uJiYoby5kdXJhdGlvbj1qeChuLmR1cmF0aW9uKSksbnVsbCE9bi5kZWxheSYmKG8uZGVsYXk9angobi5kZWxheSkpO2NvbnN0IGk9bi5wYXJhbXM7aWYoaSl7bGV0IHQ9by5wYXJhbXM7dHx8KHQ9dGhpcy5vcHRpb25zLnBhcmFtcz17fSksT2JqZWN0LmtleXMoaSkuZm9yRWFjaCgobj0+e2UmJnQuaGFzT3duUHJvcGVydHkobil8fCh0W25dPXRPKGlbbl0sdCx0aGlzLmVycm9ycykpfSkpfX1fY29weU9wdGlvbnMoKXtjb25zdCB0PXt9O2lmKHRoaXMub3B0aW9ucyl7Y29uc3QgZT10aGlzLm9wdGlvbnMucGFyYW1zO2lmKGUpe2NvbnN0IG49dC5wYXJhbXM9e307T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgodD0+e25bdF09ZVt0XX0pKX19cmV0dXJuIHR9Y3JlYXRlU3ViQ29udGV4dCh0PW51bGwsZSxuKXtjb25zdCBvPWV8fHRoaXMuZWxlbWVudCxpPW5ldyBrTyh0aGlzLl9kcml2ZXIsbyx0aGlzLnN1Ykluc3RydWN0aW9ucyx0aGlzLl9lbnRlckNsYXNzTmFtZSx0aGlzLl9sZWF2ZUNsYXNzTmFtZSx0aGlzLmVycm9ycyx0aGlzLnRpbWVsaW5lcyx0aGlzLmN1cnJlbnRUaW1lbGluZS5mb3JrKG8sbnx8MCkpO3JldHVybiBpLnByZXZpb3VzTm9kZT10aGlzLnByZXZpb3VzTm9kZSxpLmN1cnJlbnRBbmltYXRlVGltaW5ncz10aGlzLmN1cnJlbnRBbmltYXRlVGltaW5ncyxpLm9wdGlvbnM9dGhpcy5fY29weU9wdGlvbnMoKSxpLnVwZGF0ZU9wdGlvbnModCksaS5jdXJyZW50UXVlcnlJbmRleD10aGlzLmN1cnJlbnRRdWVyeUluZGV4LGkuY3VycmVudFF1ZXJ5VG90YWw9dGhpcy5jdXJyZW50UXVlcnlUb3RhbCxpLnBhcmVudENvbnRleHQ9dGhpcyx0aGlzLnN1YkNvbnRleHRDb3VudCsrLGl9dHJhbnNmb3JtSW50b05ld1RpbWVsaW5lKHQpe3JldHVybiB0aGlzLnByZXZpb3VzTm9kZT13Tyx0aGlzLmN1cnJlbnRUaW1lbGluZT10aGlzLmN1cnJlbnRUaW1lbGluZS5mb3JrKHRoaXMuZWxlbWVudCx0KSx0aGlzLnRpbWVsaW5lcy5wdXNoKHRoaXMuY3VycmVudFRpbWVsaW5lKSx0aGlzLmN1cnJlbnRUaW1lbGluZX1hcHBlbmRJbnN0cnVjdGlvblRvVGltZWxpbmUodCxlLG4pe2NvbnN0IG89e2R1cmF0aW9uOm51bGwhPWU/ZTp0LmR1cmF0aW9uLGRlbGF5OnRoaXMuY3VycmVudFRpbWVsaW5lLmN1cnJlbnRUaW1lKyhudWxsIT1uP246MCkrdC5kZWxheSxlYXNpbmc6IiJ9LGk9bmV3IERPKHRoaXMuX2RyaXZlcix0LmVsZW1lbnQsdC5rZXlmcmFtZXMsdC5wcmVTdHlsZVByb3BzLHQucG9zdFN0eWxlUHJvcHMsbyx0LnN0cmV0Y2hTdGFydGluZ0tleWZyYW1lKTtyZXR1cm4gdGhpcy50aW1lbGluZXMucHVzaChpKSxvfWluY3JlbWVudFRpbWUodCl7dGhpcy5jdXJyZW50VGltZWxpbmUuZm9yd2FyZFRpbWUodGhpcy5jdXJyZW50VGltZWxpbmUuZHVyYXRpb24rdCl9ZGVsYXlOZXh0U3RlcCh0KXt0PjAmJnRoaXMuY3VycmVudFRpbWVsaW5lLmRlbGF5TmV4dFN0ZXAodCl9aW52b2tlUXVlcnkodCxlLG4sbyxpLGEpe2xldCByPVtdO2lmKG8mJnIucHVzaCh0aGlzLmVsZW1lbnQpLHQubGVuZ3RoPjApe3Q9KHQ9dC5yZXBsYWNlKHZPLCIuIit0aGlzLl9lbnRlckNsYXNzTmFtZSkpLnJlcGxhY2UoeE8sIi4iK3RoaXMuX2xlYXZlQ2xhc3NOYW1lKTtsZXQgZT10aGlzLl9kcml2ZXIucXVlcnkodGhpcy5lbGVtZW50LHQsMSE9bik7MCE9PW4mJihlPW48MD9lLnNsaWNlKGUubGVuZ3RoK24sZS5sZW5ndGgpOmUuc2xpY2UoMCxuKSksci5wdXNoKC4uLmUpfXJldHVybiBpfHwwIT1yLmxlbmd0aHx8YS5wdXNoKGBcYHF1ZXJ5KCIke2V9IilcYCByZXR1cm5lZCB6ZXJvIGVsZW1lbnRzLiAoVXNlIFxgcXVlcnkoIiR7ZX0iLCB7IG9wdGlvbmFsOiB0cnVlIH0pXGAgaWYgeW91IHdpc2ggdG8gYWxsb3cgdGhpcy4pYCkscn19Y2xhc3MgU097Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy5fZHJpdmVyPXQsdGhpcy5lbGVtZW50PWUsdGhpcy5zdGFydFRpbWU9bix0aGlzLl9lbGVtZW50VGltZWxpbmVTdHlsZXNMb29rdXA9byx0aGlzLmR1cmF0aW9uPTAsdGhpcy5fcHJldmlvdXNLZXlmcmFtZT17fSx0aGlzLl9jdXJyZW50S2V5ZnJhbWU9e30sdGhpcy5fa2V5ZnJhbWVzPW5ldyBNYXAsdGhpcy5fc3R5bGVTdW1tYXJ5PXt9LHRoaXMuX3BlbmRpbmdTdHlsZXM9e30sdGhpcy5fYmFja0ZpbGw9e30sdGhpcy5fY3VycmVudEVtcHR5U3RlcEtleWZyYW1lPW51bGwsdGhpcy5fZWxlbWVudFRpbWVsaW5lU3R5bGVzTG9va3VwfHwodGhpcy5fZWxlbWVudFRpbWVsaW5lU3R5bGVzTG9va3VwPW5ldyBNYXApLHRoaXMuX2xvY2FsVGltZWxpbmVTdHlsZXM9T2JqZWN0LmNyZWF0ZSh0aGlzLl9iYWNrRmlsbCx7fSksdGhpcy5fZ2xvYmFsVGltZWxpbmVTdHlsZXM9dGhpcy5fZWxlbWVudFRpbWVsaW5lU3R5bGVzTG9va3VwLmdldChlKSx0aGlzLl9nbG9iYWxUaW1lbGluZVN0eWxlc3x8KHRoaXMuX2dsb2JhbFRpbWVsaW5lU3R5bGVzPXRoaXMuX2xvY2FsVGltZWxpbmVTdHlsZXMsdGhpcy5fZWxlbWVudFRpbWVsaW5lU3R5bGVzTG9va3VwLnNldChlLHRoaXMuX2xvY2FsVGltZWxpbmVTdHlsZXMpKSx0aGlzLl9sb2FkS2V5ZnJhbWUoKX1jb250YWluc0FuaW1hdGlvbigpe3N3aXRjaCh0aGlzLl9rZXlmcmFtZXMuc2l6ZSl7Y2FzZSAwOnJldHVybiExO2Nhc2UgMTpyZXR1cm4gdGhpcy5nZXRDdXJyZW50U3R5bGVQcm9wZXJ0aWVzKCkubGVuZ3RoPjA7ZGVmYXVsdDpyZXR1cm4hMH19Z2V0Q3VycmVudFN0eWxlUHJvcGVydGllcygpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9jdXJyZW50S2V5ZnJhbWUpfWdldCBjdXJyZW50VGltZSgpe3JldHVybiB0aGlzLnN0YXJ0VGltZSt0aGlzLmR1cmF0aW9ufWRlbGF5TmV4dFN0ZXAodCl7Y29uc3QgZT0xPT10aGlzLl9rZXlmcmFtZXMuc2l6ZSYmT2JqZWN0LmtleXModGhpcy5fcGVuZGluZ1N0eWxlcykubGVuZ3RoO3RoaXMuZHVyYXRpb258fGU/KHRoaXMuZm9yd2FyZFRpbWUodGhpcy5jdXJyZW50VGltZSt0KSxlJiZ0aGlzLnNuYXBzaG90Q3VycmVudFN0eWxlcygpKTp0aGlzLnN0YXJ0VGltZSs9dH1mb3JrKHQsZSl7cmV0dXJuIHRoaXMuYXBwbHlTdHlsZXNUb0tleWZyYW1lKCksbmV3IFNPKHRoaXMuX2RyaXZlcix0LGV8fHRoaXMuY3VycmVudFRpbWUsdGhpcy5fZWxlbWVudFRpbWVsaW5lU3R5bGVzTG9va3VwKX1fbG9hZEtleWZyYW1lKCl7dGhpcy5fY3VycmVudEtleWZyYW1lJiYodGhpcy5fcHJldmlvdXNLZXlmcmFtZT10aGlzLl9jdXJyZW50S2V5ZnJhbWUpLHRoaXMuX2N1cnJlbnRLZXlmcmFtZT10aGlzLl9rZXlmcmFtZXMuZ2V0KHRoaXMuZHVyYXRpb24pLHRoaXMuX2N1cnJlbnRLZXlmcmFtZXx8KHRoaXMuX2N1cnJlbnRLZXlmcmFtZT1PYmplY3QuY3JlYXRlKHRoaXMuX2JhY2tGaWxsLHt9KSx0aGlzLl9rZXlmcmFtZXMuc2V0KHRoaXMuZHVyYXRpb24sdGhpcy5fY3VycmVudEtleWZyYW1lKSl9Zm9yd2FyZEZyYW1lKCl7dGhpcy5kdXJhdGlvbis9MSx0aGlzLl9sb2FkS2V5ZnJhbWUoKX1mb3J3YXJkVGltZSh0KXt0aGlzLmFwcGx5U3R5bGVzVG9LZXlmcmFtZSgpLHRoaXMuZHVyYXRpb249dCx0aGlzLl9sb2FkS2V5ZnJhbWUoKX1fdXBkYXRlU3R5bGUodCxlKXt0aGlzLl9sb2NhbFRpbWVsaW5lU3R5bGVzW3RdPWUsdGhpcy5fZ2xvYmFsVGltZWxpbmVTdHlsZXNbdF09ZSx0aGlzLl9zdHlsZVN1bW1hcnlbdF09e3RpbWU6dGhpcy5jdXJyZW50VGltZSx2YWx1ZTplfX1hbGxvd09ubHlUaW1lbGluZVN0eWxlcygpe3JldHVybiB0aGlzLl9jdXJyZW50RW1wdHlTdGVwS2V5ZnJhbWUhPT10aGlzLl9jdXJyZW50S2V5ZnJhbWV9YXBwbHlFbXB0eVN0ZXAodCl7dCYmKHRoaXMuX3ByZXZpb3VzS2V5ZnJhbWUuZWFzaW5nPXQpLE9iamVjdC5rZXlzKHRoaXMuX2dsb2JhbFRpbWVsaW5lU3R5bGVzKS5mb3JFYWNoKCh0PT57dGhpcy5fYmFja0ZpbGxbdF09dGhpcy5fZ2xvYmFsVGltZWxpbmVTdHlsZXNbdF18fGV4LHRoaXMuX2N1cnJlbnRLZXlmcmFtZVt0XT1leH0pKSx0aGlzLl9jdXJyZW50RW1wdHlTdGVwS2V5ZnJhbWU9dGhpcy5fY3VycmVudEtleWZyYW1lfXNldFN0eWxlcyh0LGUsbixvKXtlJiYodGhpcy5fcHJldmlvdXNLZXlmcmFtZS5lYXNpbmc9ZSk7Y29uc3QgaT1vJiZvLnBhcmFtc3x8e30sYT0oZnVuY3Rpb24gcih0LGUpe2NvbnN0IG49e307bGV0IG87cmV0dXJuIHQuZm9yRWFjaCgodD0+eyIqIj09PXQ/KG89b3x8T2JqZWN0LmtleXMoZSksby5mb3JFYWNoKCh0PT57blt0XT1leH0pKSk6WXgodCwhMSxuKX0pKSxufQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8pKHQsdGhpcy5fZ2xvYmFsVGltZWxpbmVTdHlsZXMpO09iamVjdC5rZXlzKGEpLmZvckVhY2goKHQ9Pntjb25zdCBlPXRPKGFbdF0saSxuKTt0aGlzLl9wZW5kaW5nU3R5bGVzW3RdPWUsdGhpcy5fbG9jYWxUaW1lbGluZVN0eWxlcy5oYXNPd25Qcm9wZXJ0eSh0KXx8KHRoaXMuX2JhY2tGaWxsW3RdPXRoaXMuX2dsb2JhbFRpbWVsaW5lU3R5bGVzLmhhc093blByb3BlcnR5KHQpP3RoaXMuX2dsb2JhbFRpbWVsaW5lU3R5bGVzW3RdOmV4KSx0aGlzLl91cGRhdGVTdHlsZSh0LGUpfSkpfWFwcGx5U3R5bGVzVG9LZXlmcmFtZSgpe2NvbnN0IHQ9dGhpcy5fcGVuZGluZ1N0eWxlcyxlPU9iamVjdC5rZXlzKHQpOzAhPWUubGVuZ3RoJiYodGhpcy5fcGVuZGluZ1N0eWxlcz17fSxlLmZvckVhY2goKGU9Pnt0aGlzLl9jdXJyZW50S2V5ZnJhbWVbZV09dFtlXX0pKSxPYmplY3Qua2V5cyh0aGlzLl9sb2NhbFRpbWVsaW5lU3R5bGVzKS5mb3JFYWNoKCh0PT57dGhpcy5fY3VycmVudEtleWZyYW1lLmhhc093blByb3BlcnR5KHQpfHwodGhpcy5fY3VycmVudEtleWZyYW1lW3RdPXRoaXMuX2xvY2FsVGltZWxpbmVTdHlsZXNbdF0pfSkpKX1zbmFwc2hvdEN1cnJlbnRTdHlsZXMoKXtPYmplY3Qua2V5cyh0aGlzLl9sb2NhbFRpbWVsaW5lU3R5bGVzKS5mb3JFYWNoKCh0PT57Y29uc3QgZT10aGlzLl9sb2NhbFRpbWVsaW5lU3R5bGVzW3RdO3RoaXMuX3BlbmRpbmdTdHlsZXNbdF09ZSx0aGlzLl91cGRhdGVTdHlsZSh0LGUpfSkpfWdldEZpbmFsS2V5ZnJhbWUoKXtyZXR1cm4gdGhpcy5fa2V5ZnJhbWVzLmdldCh0aGlzLmR1cmF0aW9uKX1nZXQgcHJvcGVydGllcygpe2NvbnN0IHQ9W107Zm9yKGxldCBlIGluIHRoaXMuX2N1cnJlbnRLZXlmcmFtZSl0LnB1c2goZSk7cmV0dXJuIHR9bWVyZ2VUaW1lbGluZUNvbGxlY3RlZFN0eWxlcyh0KXtPYmplY3Qua2V5cyh0Ll9zdHlsZVN1bW1hcnkpLmZvckVhY2goKGU9Pntjb25zdCBuPXRoaXMuX3N0eWxlU3VtbWFyeVtlXSxvPXQuX3N0eWxlU3VtbWFyeVtlXTsoIW58fG8udGltZT5uLnRpbWUpJiZ0aGlzLl91cGRhdGVTdHlsZShlLG8udmFsdWUpfSkpfWJ1aWxkS2V5ZnJhbWVzKCl7dGhpcy5hcHBseVN0eWxlc1RvS2V5ZnJhbWUoKTtjb25zdCB0PW5ldyBTZXQsZT1uZXcgU2V0LG49MT09PXRoaXMuX2tleWZyYW1lcy5zaXplJiYwPT09dGhpcy5kdXJhdGlvbjtsZXQgbz1bXTt0aGlzLl9rZXlmcmFtZXMuZm9yRWFjaCgoKGksYSk9Pntjb25zdCByPVl4KGksITApO09iamVjdC5rZXlzKHIpLmZvckVhY2goKG49Pntjb25zdCBvPXJbbl07IiEiPT1vP3QuYWRkKG4pOm89PWV4JiZlLmFkZChuKX0pKSxufHwoci5vZmZzZXQ9YS90aGlzLmR1cmF0aW9uKSxvLnB1c2gocil9KSk7Y29uc3QgaT10LnNpemU/ZU8odC52YWx1ZXMoKSk6W10sYT1lLnNpemU/ZU8oZS52YWx1ZXMoKSk6W107aWYobil7Y29uc3QgdD1vWzBdLGU9V3godCk7dC5vZmZzZXQ9MCxlLm9mZnNldD0xLG89W3QsZV19cmV0dXJuIENPKHRoaXMuZWxlbWVudCxvLGksYSx0aGlzLmR1cmF0aW9uLHRoaXMuc3RhcnRUaW1lLHRoaXMuZWFzaW5nLCExKX19Y2xhc3MgRE8gZXh0ZW5kcyBTT3tjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyPSExKXtzdXBlcih0LGUsYS5kZWxheSksdGhpcy5rZXlmcmFtZXM9bix0aGlzLnByZVN0eWxlUHJvcHM9byx0aGlzLnBvc3RTdHlsZVByb3BzPWksdGhpcy5fc3RyZXRjaFN0YXJ0aW5nS2V5ZnJhbWU9cix0aGlzLnRpbWluZ3M9e2R1cmF0aW9uOmEuZHVyYXRpb24sZGVsYXk6YS5kZWxheSxlYXNpbmc6YS5lYXNpbmd9fWNvbnRhaW5zQW5pbWF0aW9uKCl7cmV0dXJuIHRoaXMua2V5ZnJhbWVzLmxlbmd0aD4xfWJ1aWxkS2V5ZnJhbWVzKCl7bGV0IHQ9dGhpcy5rZXlmcmFtZXMse2RlbGF5OmUsZHVyYXRpb246bixlYXNpbmc6b309dGhpcy50aW1pbmdzO2lmKHRoaXMuX3N0cmV0Y2hTdGFydGluZ0tleWZyYW1lJiZlKXtjb25zdCBpPVtdLGE9bitlLHI9ZS9hLHM9WXgodFswXSwhMSk7cy5vZmZzZXQ9MCxpLnB1c2gocyk7Y29uc3QgbD1ZeCh0WzBdLCExKTtsLm9mZnNldD1FTyhyKSxpLnB1c2gobCk7Y29uc3QgYz10Lmxlbmd0aC0xO2ZvcihsZXQgbz0xO288PWM7bysrKXtsZXQgcj1ZeCh0W29dLCExKTtyLm9mZnNldD1FTygoZStyLm9mZnNldCpuKS9hKSxpLnB1c2gocil9bj1hLGU9MCxvPSIiLHQ9aX1yZXR1cm4gQ08odGhpcy5lbGVtZW50LHQsdGhpcy5wcmVTdHlsZVByb3BzLHRoaXMucG9zdFN0eWxlUHJvcHMsbixlLG8sITApfX1mdW5jdGlvbiBFTyh0LGU9Myl7Y29uc3Qgbj1NYXRoLnBvdygxMCxlLTEpO3JldHVybiBNYXRoLnJvdW5kKHQqbikvbn1jbGFzcyBST3t9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIEFPIGV4dGVuZHMgUk97bm9ybWFsaXplUHJvcGVydHlOYW1lKHQsZSl7cmV0dXJuIG9PKHQpfW5vcm1hbGl6ZVN0eWxlVmFsdWUodCxlLG4sbyl7bGV0IGk9IiI7Y29uc3QgYT1uLnRvU3RyaW5nKCkudHJpbSgpO2lmKFRPW2VdJiYwIT09biYmIjAiIT09bilpZigibnVtYmVyIj09dHlwZW9mIG4paT0icHgiO2Vsc2V7Y29uc3QgZT1uLm1hdGNoKC9eWystXT9bXGRcLl0rKFthLXpdKikkLyk7ZSYmMD09ZVsxXS5sZW5ndGgmJm8ucHVzaChgUGxlYXNlIHByb3ZpZGUgYSBDU1MgdW5pdCB2YWx1ZSBmb3IgJHt0fToke259YCl9cmV0dXJuIGEraX19Y29uc3QgVE89KGZ1bmN0aW9uIE5PKHQpe2NvbnN0IGU9e307cmV0dXJuIHQuZm9yRWFjaCgodD0+ZVt0XT0hMCkpLGV9KSgid2lkdGgsaGVpZ2h0LG1pbldpZHRoLG1pbkhlaWdodCxtYXhXaWR0aCxtYXhIZWlnaHQsbGVmdCx0b3AsYm90dG9tLHJpZ2h0LGZvbnRTaXplLG91dGxpbmVXaWR0aCxvdXRsaW5lT2Zmc2V0LHBhZGRpbmdUb3AscGFkZGluZ0xlZnQscGFkZGluZ0JvdHRvbSxwYWRkaW5nUmlnaHQsbWFyZ2luVG9wLG1hcmdpbkxlZnQsbWFyZ2luQm90dG9tLG1hcmdpblJpZ2h0LGJvcmRlclJhZGl1cyxib3JkZXJXaWR0aCxib3JkZXJUb3BXaWR0aCxib3JkZXJMZWZ0V2lkdGgsYm9yZGVyUmlnaHRXaWR0aCxib3JkZXJCb3R0b21XaWR0aCx0ZXh0SW5kZW50LHBlcnNwZWN0aXZlIi5zcGxpdCgiLCIpKTtmdW5jdGlvbiB6Tyh0LGUsbixvLGksYSxyLHMsbCxjLGQscCxtKXtyZXR1cm57dHlwZTowLGVsZW1lbnQ6dCx0cmlnZ2VyTmFtZTplLGlzUmVtb3ZhbFRyYW5zaXRpb246aSxmcm9tU3RhdGU6bixmcm9tU3R5bGVzOmEsdG9TdGF0ZTpvLHRvU3R5bGVzOnIsdGltZWxpbmVzOnMscXVlcmllZEVsZW1lbnRzOmwscHJlU3R5bGVQcm9wczpjLHBvc3RTdHlsZVByb3BzOmQsdG90YWxUaW1lOnAsZXJyb3JzOm19fWNvbnN0IElPPXt9O2NsYXNzIEhPe2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLl90cmlnZ2VyTmFtZT10LHRoaXMuYXN0PWUsdGhpcy5fc3RhdGVTdHlsZXM9bn1tYXRjaCh0LGUsbixvKXtyZXR1cm4oZnVuY3Rpb24gaSh0LGUsbixvLGEpe3JldHVybiB0LnNvbWUoKHQ9PnQoZSxuLG8sYSkpKX0pKHRoaXMuYXN0Lm1hdGNoZXJzLHQsZSxuLG8pfWJ1aWxkU3R5bGVzKHQsZSxuKXtjb25zdCBvPXRoaXMuX3N0YXRlU3R5bGVzWyIqIl0saT10aGlzLl9zdGF0ZVN0eWxlc1t0XSxhPW8/by5idWlsZFN0eWxlcyhlLG4pOnt9O3JldHVybiBpP2kuYnVpbGRTdHlsZXMoZSxuKTphfWJ1aWxkKHQsZSxuLG8saSxhLHIscyxsLGMpe2NvbnN0IGQ9W10scD10aGlzLmFzdC5vcHRpb25zJiZ0aGlzLmFzdC5vcHRpb25zLnBhcmFtc3x8SU8sbT10aGlzLmJ1aWxkU3R5bGVzKG4sciYmci5wYXJhbXN8fElPLGQpLHU9cyYmcy5wYXJhbXN8fElPLGY9dGhpcy5idWlsZFN0eWxlcyhvLHUsZCksZz1uZXcgU2V0LGg9bmV3IE1hcCxiPW5ldyBNYXAseT0idm9pZCI9PT1vLF89e3BhcmFtczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scCksdSl9LEM9Yz9bXTpPTyh0LGUsdGhpcy5hc3QuYW5pbWF0aW9uLGksYSxtLGYsXyxsLGQpO2xldCBNPTA7aWYoQy5mb3JFYWNoKCh0PT57TT1NYXRoLm1heCh0LmR1cmF0aW9uK3QuZGVsYXksTSl9KSksZC5sZW5ndGgpcmV0dXJuIHpPKGUsdGhpcy5fdHJpZ2dlck5hbWUsbixvLHksbSxmLFtdLFtdLGgsYixNLGQpO0MuZm9yRWFjaCgodD0+e2NvbnN0IG49dC5lbGVtZW50LG89TXgoaCxuLHt9KTt0LnByZVN0eWxlUHJvcHMuZm9yRWFjaCgodD0+b1t0XT0hMCkpO2NvbnN0IGk9TXgoYixuLHt9KTt0LnBvc3RTdHlsZVByb3BzLmZvckVhY2goKHQ9PmlbdF09ITApKSxuIT09ZSYmZy5hZGQobil9KSk7Y29uc3Qgdj1lTyhnLnZhbHVlcygpKTtyZXR1cm4gek8oZSx0aGlzLl90cmlnZ2VyTmFtZSxuLG8seSxtLGYsQyx2LGgsYixNKX19Y2xhc3MgRk97Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuc3R5bGVzPXQsdGhpcy5kZWZhdWx0UGFyYW1zPWUsdGhpcy5ub3JtYWxpemVyPW59YnVpbGRTdHlsZXModCxlKXtjb25zdCBuPXt9LG89V3godGhpcy5kZWZhdWx0UGFyYW1zKTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaCgoZT0+e2NvbnN0IG49dFtlXTtudWxsIT1uJiYob1tlXT1uKX0pKSx0aGlzLnN0eWxlcy5zdHlsZXMuZm9yRWFjaCgodD0+e2lmKCJzdHJpbmciIT10eXBlb2YgdCl7Y29uc3QgaT10O09iamVjdC5rZXlzKGkpLmZvckVhY2goKHQ9PntsZXQgYT1pW3RdO2EubGVuZ3RoPjEmJihhPXRPKGEsbyxlKSk7Y29uc3Qgcj10aGlzLm5vcm1hbGl6ZXIubm9ybWFsaXplUHJvcGVydHlOYW1lKHQsZSk7YT10aGlzLm5vcm1hbGl6ZXIubm9ybWFsaXplU3R5bGVWYWx1ZSh0LHIsYSxlKSxuW3JdPWF9KSl9fSkpLG59fWNsYXNzIExPe2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLm5hbWU9dCx0aGlzLmFzdD1lLHRoaXMuX25vcm1hbGl6ZXI9bix0aGlzLnRyYW5zaXRpb25GYWN0b3JpZXM9W10sdGhpcy5zdGF0ZXM9e30sZS5zdGF0ZXMuZm9yRWFjaCgodD0+e3RoaXMuc3RhdGVzW3QubmFtZV09bmV3IEZPKHQuc3R5bGUsdC5vcHRpb25zJiZ0Lm9wdGlvbnMucGFyYW1zfHx7fSxuKX0pKSxCTyh0aGlzLnN0YXRlcywidHJ1ZSIsIjEiKSxCTyh0aGlzLnN0YXRlcywiZmFsc2UiLCIwIiksZS50cmFuc2l0aW9ucy5mb3JFYWNoKChlPT57dGhpcy50cmFuc2l0aW9uRmFjdG9yaWVzLnB1c2gobmV3IEhPKHQsZSx0aGlzLnN0YXRlcykpfSkpLHRoaXMuZmFsbGJhY2tUcmFuc2l0aW9uPShmdW5jdGlvbiBvKHQsZSxuKXtyZXR1cm4gbmV3IEhPKHQse3R5cGU6MSxhbmltYXRpb246e3R5cGU6MixzdGVwczpbXSxvcHRpb25zOm51bGx9LG1hdGNoZXJzOlsodCxlKT0+ITBdLG9wdGlvbnM6bnVsbCxxdWVyeUNvdW50OjAsZGVwQ291bnQ6MH0sZSl9KSh0LHRoaXMuc3RhdGVzKX1nZXQgY29udGFpbnNRdWVyaWVzKCl7cmV0dXJuIHRoaXMuYXN0LnF1ZXJ5Q291bnQ+MH1tYXRjaFRyYW5zaXRpb24odCxlLG4sbyl7cmV0dXJuIHRoaXMudHJhbnNpdGlvbkZhY3Rvcmllcy5maW5kKChpPT5pLm1hdGNoKHQsZSxuLG8pKSl8fG51bGx9bWF0Y2hTdHlsZXModCxlLG4pe3JldHVybiB0aGlzLmZhbGxiYWNrVHJhbnNpdGlvbi5idWlsZFN0eWxlcyh0LGUsbil9fWZ1bmN0aW9uIEJPKHQsZSxuKXt0Lmhhc093blByb3BlcnR5KGUpP3QuaGFzT3duUHJvcGVydHkobil8fCh0W25dPXRbZV0pOnQuaGFzT3duUHJvcGVydHkobikmJih0W2VdPXRbbl0pfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCBWTz1uZXcgTU87Y2xhc3Mgak97Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuYm9keU5vZGU9dCx0aGlzLl9kcml2ZXI9ZSx0aGlzLl9ub3JtYWxpemVyPW4sdGhpcy5fYW5pbWF0aW9ucz17fSx0aGlzLl9wbGF5ZXJzQnlJZD17fSx0aGlzLnBsYXllcnM9W119cmVnaXN0ZXIodCxlKXtjb25zdCBuPVtdLG89Zk8odGhpcy5fZHJpdmVyLGUsbik7aWYobi5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gYnVpbGQgdGhlIGFuaW1hdGlvbiBkdWUgdG8gdGhlIGZvbGxvd2luZyBlcnJvcnM6ICR7bi5qb2luKCJcbiIpfWApO3RoaXMuX2FuaW1hdGlvbnNbdF09b31fYnVpbGRQbGF5ZXIodCxlLG4pe2NvbnN0IG89dC5lbGVtZW50LGk9YngoMCx0aGlzLl9ub3JtYWxpemVyLDAsdC5rZXlmcmFtZXMsZSxuKTtyZXR1cm4gdGhpcy5fZHJpdmVyLmFuaW1hdGUobyxpLHQuZHVyYXRpb24sdC5kZWxheSx0LmVhc2luZyxbXSwhMCl9Y3JlYXRlKHQsZSxuPXt9KXtjb25zdCBvPVtdLGk9dGhpcy5fYW5pbWF0aW9uc1t0XTtsZXQgYTtjb25zdCByPW5ldyBNYXA7aWYoaT8oYT1PTyh0aGlzLl9kcml2ZXIsZSxpLEl4LEh4LHt9LHt9LG4sVk8sbyksYS5mb3JFYWNoKCh0PT57Y29uc3QgZT1NeChyLHQuZWxlbWVudCx7fSk7dC5wb3N0U3R5bGVQcm9wcy5mb3JFYWNoKCh0PT5lW3RdPW51bGwpKX0pKSk6KG8ucHVzaCgiVGhlIHJlcXVlc3RlZCBhbmltYXRpb24gZG9lc24ndCBleGlzdCBvciBoYXMgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZCIpLGE9W10pLG8ubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGNyZWF0ZSB0aGUgYW5pbWF0aW9uIGR1ZSB0byB0aGUgZm9sbG93aW5nIGVycm9yczogJHtvLmpvaW4oIlxuIil9YCk7ci5mb3JFYWNoKCgodCxlKT0+e09iamVjdC5rZXlzKHQpLmZvckVhY2goKG49Pnt0W25dPXRoaXMuX2RyaXZlci5jb21wdXRlU3R5bGUoZSxuLGV4KX0pKX0pKTtjb25zdCBzPWh4KGEubWFwKCh0PT57Y29uc3QgZT1yLmdldCh0LmVsZW1lbnQpO3JldHVybiB0aGlzLl9idWlsZFBsYXllcih0LHt9LGUpfSkpKTtyZXR1cm4gdGhpcy5fcGxheWVyc0J5SWRbdF09cyxzLm9uRGVzdHJveSgoKCk9PnRoaXMuZGVzdHJveSh0KSkpLHRoaXMucGxheWVycy5wdXNoKHMpLHN9ZGVzdHJveSh0KXtjb25zdCBlPXRoaXMuX2dldFBsYXllcih0KTtlLmRlc3Ryb3koKSxkZWxldGUgdGhpcy5fcGxheWVyc0J5SWRbdF07Y29uc3Qgbj10aGlzLnBsYXllcnMuaW5kZXhPZihlKTtuPj0wJiZ0aGlzLnBsYXllcnMuc3BsaWNlKG4sMSl9X2dldFBsYXllcih0KXtjb25zdCBlPXRoaXMuX3BsYXllcnNCeUlkW3RdO2lmKCFlKXRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGZpbmQgdGhlIHRpbWVsaW5lIHBsYXllciByZWZlcmVuY2VkIGJ5ICR7dH1gKTtyZXR1cm4gZX1saXN0ZW4odCxlLG4sbyl7Y29uc3QgaT1DeChlLCIiLCIiLCIiKTtyZXR1cm4geXgodGhpcy5fZ2V0UGxheWVyKHQpLG4saSxvKSwoKT0+e319Y29tbWFuZCh0LGUsbixvKXtpZigicmVnaXN0ZXIiPT1uKXJldHVybiB2b2lkIHRoaXMucmVnaXN0ZXIodCxvWzBdKTtpZigiY3JlYXRlIj09bilyZXR1cm4gdm9pZCB0aGlzLmNyZWF0ZSh0LGUsb1swXXx8e30pO2NvbnN0IGk9dGhpcy5fZ2V0UGxheWVyKHQpO3N3aXRjaChuKXtjYXNlInBsYXkiOmkucGxheSgpO2JyZWFrO2Nhc2UicGF1c2UiOmkucGF1c2UoKTticmVhaztjYXNlInJlc2V0IjppLnJlc2V0KCk7YnJlYWs7Y2FzZSJyZXN0YXJ0IjppLnJlc3RhcnQoKTticmVhaztjYXNlImZpbmlzaCI6aS5maW5pc2goKTticmVhaztjYXNlImluaXQiOmkuaW5pdCgpO2JyZWFrO2Nhc2Uic2V0UG9zaXRpb24iOmkuc2V0UG9zaXRpb24ocGFyc2VGbG9hdChvWzBdKSk7YnJlYWs7Y2FzZSJkZXN0cm95Ijp0aGlzLmRlc3Ryb3kodCl9fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3QgVU89Im5nLWFuaW1hdGUtcXVldWVkIixHTz0ibmctYW5pbWF0ZS1kaXNhYmxlZCIsV089Ii5uZy1hbmltYXRlLWRpc2FibGVkIixZTz1bXSxxTz17bmFtZXNwYWNlSWQ6IiIsc2V0Rm9yUmVtb3ZhbDohMSxzZXRGb3JNb3ZlOiExLGhhc0FuaW1hdGlvbjohMSxyZW1vdmVkQmVmb3JlUXVlcmllZDohMX0sWk89e25hbWVzcGFjZUlkOiIiLHNldEZvck1vdmU6ITEsc2V0Rm9yUmVtb3ZhbDohMSxoYXNBbmltYXRpb246ITEscmVtb3ZlZEJlZm9yZVF1ZXJpZWQ6ITB9O2NsYXNzIFhPe2NvbnN0cnVjdG9yKHQsZT0iIil7dGhpcy5uYW1lc3BhY2VJZD1lO2NvbnN0IG49dCYmdC5oYXNPd25Qcm9wZXJ0eSgidmFsdWUiKTtpZih0aGlzLnZhbHVlPShmdW5jdGlvbiBvKHQpe3JldHVybiBudWxsIT10P3Q6bnVsbH0pKG4/dC52YWx1ZTp0KSxuKXtjb25zdCBlPVd4KHQpO2RlbGV0ZSBlLnZhbHVlLHRoaXMub3B0aW9ucz1lfWVsc2UgdGhpcy5vcHRpb25zPXt9O3RoaXMub3B0aW9ucy5wYXJhbXN8fCh0aGlzLm9wdGlvbnMucGFyYW1zPXt9KX1nZXQgcGFyYW1zKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5wYXJhbXN9YWJzb3JiT3B0aW9ucyh0KXtjb25zdCBlPXQucGFyYW1zO2lmKGUpe2NvbnN0IHQ9dGhpcy5vcHRpb25zLnBhcmFtcztPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChuPT57bnVsbD09dFtuXSYmKHRbbl09ZVtuXSl9KSl9fX1jb25zdCBLTz0idm9pZCIsSk89bmV3IFhPKEtPKTtjbGFzcyBRT3tjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5pZD10LHRoaXMuaG9zdEVsZW1lbnQ9ZSx0aGlzLl9lbmdpbmU9bix0aGlzLnBsYXllcnM9W10sdGhpcy5fdHJpZ2dlcnM9e30sdGhpcy5fcXVldWU9W10sdGhpcy5fZWxlbWVudExpc3RlbmVycz1uZXcgTWFwLHRoaXMuX2hvc3RDbGFzc05hbWU9Im5nLXRucy0iK3QsYVAoZSx0aGlzLl9ob3N0Q2xhc3NOYW1lKX1saXN0ZW4odCxlLG4sbyl7aWYoIXRoaXMuX3RyaWdnZXJzLmhhc093blByb3BlcnR5KGUpKXRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxpc3RlbiBvbiB0aGUgYW5pbWF0aW9uIHRyaWdnZXIgZXZlbnQgIiR7bn0iIGJlY2F1c2UgdGhlIGFuaW1hdGlvbiB0cmlnZ2VyICIke2V9IiBkb2Vzbid0IGV4aXN0IWApO2lmKG51bGw9PW58fDA9PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGxpc3RlbiBvbiB0aGUgYW5pbWF0aW9uIHRyaWdnZXIgIiR7ZX0iIGJlY2F1c2UgdGhlIHByb3ZpZGVkIGV2ZW50IGlzIHVuZGVmaW5lZCFgKTtpZighKGZ1bmN0aW9uIGkodCl7cmV0dXJuInN0YXJ0Ij09dHx8ImRvbmUiPT10fSkobikpdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvdmlkZWQgYW5pbWF0aW9uIHRyaWdnZXIgZXZlbnQgIiR7bn0iIGZvciB0aGUgYW5pbWF0aW9uIHRyaWdnZXIgIiR7ZX0iIGlzIG5vdCBzdXBwb3J0ZWQhYCk7Y29uc3QgYT1NeCh0aGlzLl9lbGVtZW50TGlzdGVuZXJzLHQsW10pLHI9e25hbWU6ZSxwaGFzZTpuLGNhbGxiYWNrOm99O2EucHVzaChyKTtjb25zdCBzPU14KHRoaXMuX2VuZ2luZS5zdGF0ZXNCeUVsZW1lbnQsdCx7fSk7cmV0dXJuIHMuaGFzT3duUHJvcGVydHkoZSl8fChhUCh0LEZ4KSxhUCh0LCJuZy10cmlnZ2VyLSIrZSksc1tlXT1KTyksKCk9Pnt0aGlzLl9lbmdpbmUuYWZ0ZXJGbHVzaCgoKCk9Pntjb25zdCB0PWEuaW5kZXhPZihyKTt0Pj0wJiZhLnNwbGljZSh0LDEpLHRoaXMuX3RyaWdnZXJzW2VdfHxkZWxldGUgc1tlXX0pKX19cmVnaXN0ZXIodCxlKXtyZXR1cm4hdGhpcy5fdHJpZ2dlcnNbdF0mJih0aGlzLl90cmlnZ2Vyc1t0XT1lLCEwKX1fZ2V0VHJpZ2dlcih0KXtjb25zdCBlPXRoaXMuX3RyaWdnZXJzW3RdO2lmKCFlKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3ZpZGVkIGFuaW1hdGlvbiB0cmlnZ2VyICIke3R9IiBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZCFgKTtyZXR1cm4gZX10cmlnZ2VyKHQsZSxuLG89ITApe2NvbnN0IGk9dGhpcy5fZ2V0VHJpZ2dlcihlKSxhPW5ldyB0UCh0aGlzLmlkLGUsdCk7bGV0IHI9dGhpcy5fZW5naW5lLnN0YXRlc0J5RWxlbWVudC5nZXQodCk7cnx8KGFQKHQsRngpLGFQKHQsIm5nLXRyaWdnZXItIitlKSx0aGlzLl9lbmdpbmUuc3RhdGVzQnlFbGVtZW50LnNldCh0LHI9e30pKTtsZXQgcz1yW2VdO2NvbnN0IGw9bmV3IFhPKG4sdGhpcy5pZCk7aWYoIShuJiZuLmhhc093blByb3BlcnR5KCJ2YWx1ZSIpKSYmcyYmbC5hYnNvcmJPcHRpb25zKHMub3B0aW9ucykscltlXT1sLHN8fChzPUpPKSxsLnZhbHVlIT09S08mJnMudmFsdWU9PT1sLnZhbHVlKXtpZighKGZ1bmN0aW9uIGUodCxuKXtjb25zdCBvPU9iamVjdC5rZXlzKHQpLGk9T2JqZWN0LmtleXMobik7aWYoby5sZW5ndGghPWkubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgZT0wO2U8by5sZW5ndGg7ZSsrKXtjb25zdCBpPW9bZV07aWYoIW4uaGFzT3duUHJvcGVydHkoaSl8fHRbaV0hPT1uW2ldKXJldHVybiExfXJldHVybiEwfSkocy5wYXJhbXMsbC5wYXJhbXMpKXtjb25zdCBlPVtdLG49aS5tYXRjaFN0eWxlcyhzLnZhbHVlLHMucGFyYW1zLGUpLG89aS5tYXRjaFN0eWxlcyhsLnZhbHVlLGwucGFyYW1zLGUpO2UubGVuZ3RoP3RoaXMuX2VuZ2luZS5yZXBvcnRFcnJvcihlKTp0aGlzLl9lbmdpbmUuYWZ0ZXJGbHVzaCgoKCk9PntLeCh0LG4pLFh4KHQsbyl9KSl9cmV0dXJufWNvbnN0IGM9TXgodGhpcy5fZW5naW5lLnBsYXllcnNCeUVsZW1lbnQsdCxbXSk7Yy5mb3JFYWNoKCh0PT57dC5uYW1lc3BhY2VJZD09dGhpcy5pZCYmdC50cmlnZ2VyTmFtZT09ZSYmdC5xdWV1ZWQmJnQuZGVzdHJveSgpfSkpO2xldCBkPWkubWF0Y2hUcmFuc2l0aW9uKHMudmFsdWUsbC52YWx1ZSx0LGwucGFyYW1zKSxwPSExO2lmKCFkKXtpZighbylyZXR1cm47ZD1pLmZhbGxiYWNrVHJhbnNpdGlvbixwPSEwfXJldHVybiB0aGlzLl9lbmdpbmUudG90YWxRdWV1ZWRQbGF5ZXJzKyssdGhpcy5fcXVldWUucHVzaCh7ZWxlbWVudDp0LHRyaWdnZXJOYW1lOmUsdHJhbnNpdGlvbjpkLGZyb21TdGF0ZTpzLHRvU3RhdGU6bCxwbGF5ZXI6YSxpc0ZhbGxiYWNrVHJhbnNpdGlvbjpwfSkscHx8KGFQKHQsVU8pLGEub25TdGFydCgoKCk9PntyUCh0LFVPKX0pKSksYS5vbkRvbmUoKCgpPT57bGV0IGU9dGhpcy5wbGF5ZXJzLmluZGV4T2YoYSk7ZT49MCYmdGhpcy5wbGF5ZXJzLnNwbGljZShlLDEpO2NvbnN0IG49dGhpcy5fZW5naW5lLnBsYXllcnNCeUVsZW1lbnQuZ2V0KHQpO2lmKG4pe2xldCB0PW4uaW5kZXhPZihhKTt0Pj0wJiZuLnNwbGljZSh0LDEpfX0pKSx0aGlzLnBsYXllcnMucHVzaChhKSxjLnB1c2goYSksYX1kZXJlZ2lzdGVyKHQpe2RlbGV0ZSB0aGlzLl90cmlnZ2Vyc1t0XSx0aGlzLl9lbmdpbmUuc3RhdGVzQnlFbGVtZW50LmZvckVhY2goKChlLG4pPT57ZGVsZXRlIGVbdF19KSksdGhpcy5fZWxlbWVudExpc3RlbmVycy5mb3JFYWNoKCgoZSxuKT0+e3RoaXMuX2VsZW1lbnRMaXN0ZW5lcnMuc2V0KG4sZS5maWx0ZXIoKGU9PmUubmFtZSE9dCkpKX0pKX1jbGVhckVsZW1lbnRDYWNoZSh0KXt0aGlzLl9lbmdpbmUuc3RhdGVzQnlFbGVtZW50LmRlbGV0ZSh0KSx0aGlzLl9lbGVtZW50TGlzdGVuZXJzLmRlbGV0ZSh0KTtjb25zdCBlPXRoaXMuX2VuZ2luZS5wbGF5ZXJzQnlFbGVtZW50LmdldCh0KTtlJiYoZS5mb3JFYWNoKCh0PT50LmRlc3Ryb3koKSkpLHRoaXMuX2VuZ2luZS5wbGF5ZXJzQnlFbGVtZW50LmRlbGV0ZSh0KSl9X3NpZ25hbFJlbW92YWxGb3JJbm5lclRyaWdnZXJzKHQsZSl7Y29uc3Qgbj10aGlzLl9lbmdpbmUuZHJpdmVyLnF1ZXJ5KHQsTHgsITApO24uZm9yRWFjaCgodD0+e2lmKHQuX19uZ19yZW1vdmVkKXJldHVybjtjb25zdCBuPXRoaXMuX2VuZ2luZS5mZXRjaE5hbWVzcGFjZXNCeUVsZW1lbnQodCk7bi5zaXplP24uZm9yRWFjaCgobj0+bi50cmlnZ2VyTGVhdmVBbmltYXRpb24odCxlLCExLCEwKSkpOnRoaXMuY2xlYXJFbGVtZW50Q2FjaGUodCl9KSksdGhpcy5fZW5naW5lLmFmdGVyRmx1c2hBbmltYXRpb25zRG9uZSgoKCk9Pm4uZm9yRWFjaCgodD0+dGhpcy5jbGVhckVsZW1lbnRDYWNoZSh0KSkpKSl9dHJpZ2dlckxlYXZlQW5pbWF0aW9uKHQsZSxuLG8pe2NvbnN0IGk9dGhpcy5fZW5naW5lLnN0YXRlc0J5RWxlbWVudC5nZXQodCk7aWYoaSl7Y29uc3QgYT1bXTtpZihPYmplY3Qua2V5cyhpKS5mb3JFYWNoKChlPT57aWYodGhpcy5fdHJpZ2dlcnNbZV0pe2NvbnN0IG49dGhpcy50cmlnZ2VyKHQsZSxLTyxvKTtuJiZhLnB1c2gobil9fSkpLGEubGVuZ3RoKXJldHVybiB0aGlzLl9lbmdpbmUubWFya0VsZW1lbnRBc1JlbW92ZWQodGhpcy5pZCx0LCEwLGUpLG4mJmh4KGEpLm9uRG9uZSgoKCk9PnRoaXMuX2VuZ2luZS5wcm9jZXNzTGVhdmVOb2RlKHQpKSksITB9cmV0dXJuITF9cHJlcGFyZUxlYXZlQW5pbWF0aW9uTGlzdGVuZXJzKHQpe2NvbnN0IGU9dGhpcy5fZWxlbWVudExpc3RlbmVycy5nZXQodCksbj10aGlzLl9lbmdpbmUuc3RhdGVzQnlFbGVtZW50LmdldCh0KTtpZihlJiZuKXtjb25zdCBvPW5ldyBTZXQ7ZS5mb3JFYWNoKChlPT57Y29uc3QgaT1lLm5hbWU7aWYoby5oYXMoaSkpcmV0dXJuO28uYWRkKGkpO2NvbnN0IGE9dGhpcy5fdHJpZ2dlcnNbaV0uZmFsbGJhY2tUcmFuc2l0aW9uLHI9bltpXXx8Sk8scz1uZXcgWE8oS08pLGw9bmV3IHRQKHRoaXMuaWQsaSx0KTt0aGlzLl9lbmdpbmUudG90YWxRdWV1ZWRQbGF5ZXJzKyssdGhpcy5fcXVldWUucHVzaCh7ZWxlbWVudDp0LHRyaWdnZXJOYW1lOmksdHJhbnNpdGlvbjphLGZyb21TdGF0ZTpyLHRvU3RhdGU6cyxwbGF5ZXI6bCxpc0ZhbGxiYWNrVHJhbnNpdGlvbjohMH0pfSkpfX1yZW1vdmVOb2RlKHQsZSl7Y29uc3Qgbj10aGlzLl9lbmdpbmU7aWYodC5jaGlsZEVsZW1lbnRDb3VudCYmdGhpcy5fc2lnbmFsUmVtb3ZhbEZvcklubmVyVHJpZ2dlcnModCxlKSx0aGlzLnRyaWdnZXJMZWF2ZUFuaW1hdGlvbih0LGUsITApKXJldHVybjtsZXQgbz0hMTtpZihuLnRvdGFsQW5pbWF0aW9ucyl7Y29uc3QgZT1uLnBsYXllcnMubGVuZ3RoP24ucGxheWVyc0J5UXVlcmllZEVsZW1lbnQuZ2V0KHQpOltdO2lmKGUmJmUubGVuZ3RoKW89ITA7ZWxzZXtsZXQgZT10O2Zvcig7ZT1lLnBhcmVudE5vZGU7KWlmKG4uc3RhdGVzQnlFbGVtZW50LmdldChlKSl7bz0hMDticmVha319fWlmKHRoaXMucHJlcGFyZUxlYXZlQW5pbWF0aW9uTGlzdGVuZXJzKHQpLG8pbi5tYXJrRWxlbWVudEFzUmVtb3ZlZCh0aGlzLmlkLHQsITEsZSk7ZWxzZXtjb25zdCBvPXQuX19uZ19yZW1vdmVkO28mJm8hPT1xT3x8KG4uYWZ0ZXJGbHVzaCgoKCk9PnRoaXMuY2xlYXJFbGVtZW50Q2FjaGUodCkpKSxuLmRlc3Ryb3lJbm5lckFuaW1hdGlvbnModCksbi5fb25SZW1vdmFsQ29tcGxldGUodCxlKSl9fWluc2VydE5vZGUodCxlKXthUCh0LHRoaXMuX2hvc3RDbGFzc05hbWUpfWRyYWluUXVldWVkVHJhbnNpdGlvbnModCl7Y29uc3QgZT1bXTtyZXR1cm4gdGhpcy5fcXVldWUuZm9yRWFjaCgobj0+e2NvbnN0IG89bi5wbGF5ZXI7aWYoby5kZXN0cm95ZWQpcmV0dXJuO2NvbnN0IGk9bi5lbGVtZW50LGE9dGhpcy5fZWxlbWVudExpc3RlbmVycy5nZXQoaSk7YSYmYS5mb3JFYWNoKChlPT57aWYoZS5uYW1lPT1uLnRyaWdnZXJOYW1lKXtjb25zdCBvPUN4KGksbi50cmlnZ2VyTmFtZSxuLmZyb21TdGF0ZS52YWx1ZSxuLnRvU3RhdGUudmFsdWUpO28uX2RhdGE9dCx5eChuLnBsYXllcixlLnBoYXNlLG8sZS5jYWxsYmFjayl9fSkpLG8ubWFya2VkRm9yRGVzdHJveT90aGlzLl9lbmdpbmUuYWZ0ZXJGbHVzaCgoKCk9PntvLmRlc3Ryb3koKX0pKTplLnB1c2gobil9KSksdGhpcy5fcXVldWU9W10sZS5zb3J0KCgodCxlKT0+e2NvbnN0IG49dC50cmFuc2l0aW9uLmFzdC5kZXBDb3VudCxvPWUudHJhbnNpdGlvbi5hc3QuZGVwQ291bnQ7cmV0dXJuIDA9PW58fDA9PW8/bi1vOnRoaXMuX2VuZ2luZS5kcml2ZXIuY29udGFpbnNFbGVtZW50KHQuZWxlbWVudCxlLmVsZW1lbnQpPzE6LTF9KSl9ZGVzdHJveSh0KXt0aGlzLnBsYXllcnMuZm9yRWFjaCgodD0+dC5kZXN0cm95KCkpKSx0aGlzLl9zaWduYWxSZW1vdmFsRm9ySW5uZXJUcmlnZ2Vycyh0aGlzLmhvc3RFbGVtZW50LHQpfWVsZW1lbnRDb250YWluc0RhdGEodCl7bGV0IGU9ITE7cmV0dXJuIHRoaXMuX2VsZW1lbnRMaXN0ZW5lcnMuaGFzKHQpJiYoZT0hMCksZT0hIXRoaXMuX3F1ZXVlLmZpbmQoKGU9PmUuZWxlbWVudD09PXQpKXx8ZSxlfX1jbGFzcyAkT3tjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5ib2R5Tm9kZT10LHRoaXMuZHJpdmVyPWUsdGhpcy5fbm9ybWFsaXplcj1uLHRoaXMucGxheWVycz1bXSx0aGlzLm5ld0hvc3RFbGVtZW50cz1uZXcgTWFwLHRoaXMucGxheWVyc0J5RWxlbWVudD1uZXcgTWFwLHRoaXMucGxheWVyc0J5UXVlcmllZEVsZW1lbnQ9bmV3IE1hcCx0aGlzLnN0YXRlc0J5RWxlbWVudD1uZXcgTWFwLHRoaXMuZGlzYWJsZWROb2Rlcz1uZXcgU2V0LHRoaXMudG90YWxBbmltYXRpb25zPTAsdGhpcy50b3RhbFF1ZXVlZFBsYXllcnM9MCx0aGlzLl9uYW1lc3BhY2VMb29rdXA9e30sdGhpcy5fbmFtZXNwYWNlTGlzdD1bXSx0aGlzLl9mbHVzaEZucz1bXSx0aGlzLl93aGVuUXVpZXRGbnM9W10sdGhpcy5uYW1lc3BhY2VzQnlIb3N0RWxlbWVudD1uZXcgTWFwLHRoaXMuY29sbGVjdGVkRW50ZXJFbGVtZW50cz1bXSx0aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHM9W10sdGhpcy5vblJlbW92YWxDb21wbGV0ZT0odCxlKT0+e319X29uUmVtb3ZhbENvbXBsZXRlKHQsZSl7dGhpcy5vblJlbW92YWxDb21wbGV0ZSh0LGUpfWdldCBxdWV1ZWRQbGF5ZXJzKCl7Y29uc3QgdD1bXTtyZXR1cm4gdGhpcy5fbmFtZXNwYWNlTGlzdC5mb3JFYWNoKChlPT57ZS5wbGF5ZXJzLmZvckVhY2goKGU9PntlLnF1ZXVlZCYmdC5wdXNoKGUpfSkpfSkpLHR9Y3JlYXRlTmFtZXNwYWNlKHQsZSl7Y29uc3Qgbj1uZXcgUU8odCxlLHRoaXMpO3JldHVybiB0aGlzLmJvZHlOb2RlJiZ0aGlzLmRyaXZlci5jb250YWluc0VsZW1lbnQodGhpcy5ib2R5Tm9kZSxlKT90aGlzLl9iYWxhbmNlTmFtZXNwYWNlTGlzdChuLGUpOih0aGlzLm5ld0hvc3RFbGVtZW50cy5zZXQoZSxuKSx0aGlzLmNvbGxlY3RFbnRlckVsZW1lbnQoZSkpLHRoaXMuX25hbWVzcGFjZUxvb2t1cFt0XT1ufV9iYWxhbmNlTmFtZXNwYWNlTGlzdCh0LGUpe2NvbnN0IG49dGhpcy5fbmFtZXNwYWNlTGlzdC5sZW5ndGgtMTtpZihuPj0wKXtsZXQgbz0hMTtmb3IobGV0IGk9bjtpPj0wO2ktLSlpZih0aGlzLmRyaXZlci5jb250YWluc0VsZW1lbnQodGhpcy5fbmFtZXNwYWNlTGlzdFtpXS5ob3N0RWxlbWVudCxlKSl7dGhpcy5fbmFtZXNwYWNlTGlzdC5zcGxpY2UoaSsxLDAsdCksbz0hMDticmVha31vfHx0aGlzLl9uYW1lc3BhY2VMaXN0LnNwbGljZSgwLDAsdCl9ZWxzZSB0aGlzLl9uYW1lc3BhY2VMaXN0LnB1c2godCk7cmV0dXJuIHRoaXMubmFtZXNwYWNlc0J5SG9zdEVsZW1lbnQuc2V0KGUsdCksdH1yZWdpc3Rlcih0LGUpe2xldCBuPXRoaXMuX25hbWVzcGFjZUxvb2t1cFt0XTtyZXR1cm4gbnx8KG49dGhpcy5jcmVhdGVOYW1lc3BhY2UodCxlKSksbn1yZWdpc3RlclRyaWdnZXIodCxlLG4pe2xldCBvPXRoaXMuX25hbWVzcGFjZUxvb2t1cFt0XTtvJiZvLnJlZ2lzdGVyKGUsbikmJnRoaXMudG90YWxBbmltYXRpb25zKyt9ZGVzdHJveSh0LGUpe2lmKCF0KXJldHVybjtjb25zdCBuPXRoaXMuX2ZldGNoTmFtZXNwYWNlKHQpO3RoaXMuYWZ0ZXJGbHVzaCgoKCk9Pnt0aGlzLm5hbWVzcGFjZXNCeUhvc3RFbGVtZW50LmRlbGV0ZShuLmhvc3RFbGVtZW50KSxkZWxldGUgdGhpcy5fbmFtZXNwYWNlTG9va3VwW3RdO2NvbnN0IGU9dGhpcy5fbmFtZXNwYWNlTGlzdC5pbmRleE9mKG4pO2U+PTAmJnRoaXMuX25hbWVzcGFjZUxpc3Quc3BsaWNlKGUsMSl9KSksdGhpcy5hZnRlckZsdXNoQW5pbWF0aW9uc0RvbmUoKCgpPT5uLmRlc3Ryb3koZSkpKX1fZmV0Y2hOYW1lc3BhY2UodCl7cmV0dXJuIHRoaXMuX25hbWVzcGFjZUxvb2t1cFt0XX1mZXRjaE5hbWVzcGFjZXNCeUVsZW1lbnQodCl7Y29uc3QgZT1uZXcgU2V0LG49dGhpcy5zdGF0ZXNCeUVsZW1lbnQuZ2V0KHQpO2lmKG4pe2NvbnN0IHQ9T2JqZWN0LmtleXMobik7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGk9blt0W29dXS5uYW1lc3BhY2VJZDtpZihpKXtjb25zdCB0PXRoaXMuX2ZldGNoTmFtZXNwYWNlKGkpO3QmJmUuYWRkKHQpfX19cmV0dXJuIGV9dHJpZ2dlcih0LGUsbixvKXtpZihlUChlKSl7Y29uc3QgaT10aGlzLl9mZXRjaE5hbWVzcGFjZSh0KTtpZihpKXJldHVybiBpLnRyaWdnZXIoZSxuLG8pLCEwfXJldHVybiExfWluc2VydE5vZGUodCxlLG4sbyl7aWYoIWVQKGUpKXJldHVybjtjb25zdCBpPWUuX19uZ19yZW1vdmVkO2lmKGkmJmkuc2V0Rm9yUmVtb3ZhbCl7aS5zZXRGb3JSZW1vdmFsPSExLGkuc2V0Rm9yTW92ZT0hMDtjb25zdCB0PXRoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50cy5pbmRleE9mKGUpO3Q+PTAmJnRoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50cy5zcGxpY2UodCwxKX1pZih0KXtjb25zdCBvPXRoaXMuX2ZldGNoTmFtZXNwYWNlKHQpO28mJm8uaW5zZXJ0Tm9kZShlLG4pfW8mJnRoaXMuY29sbGVjdEVudGVyRWxlbWVudChlKX1jb2xsZWN0RW50ZXJFbGVtZW50KHQpe3RoaXMuY29sbGVjdGVkRW50ZXJFbGVtZW50cy5wdXNoKHQpfW1hcmtFbGVtZW50QXNEaXNhYmxlZCh0LGUpe2U/dGhpcy5kaXNhYmxlZE5vZGVzLmhhcyh0KXx8KHRoaXMuZGlzYWJsZWROb2Rlcy5hZGQodCksYVAodCxHTykpOnRoaXMuZGlzYWJsZWROb2Rlcy5oYXModCkmJih0aGlzLmRpc2FibGVkTm9kZXMuZGVsZXRlKHQpLHJQKHQsR08pKX1yZW1vdmVOb2RlKHQsZSxuLG8pe2lmKGVQKGUpKXtjb25zdCBpPXQ/dGhpcy5fZmV0Y2hOYW1lc3BhY2UodCk6bnVsbDtpZihpP2kucmVtb3ZlTm9kZShlLG8pOnRoaXMubWFya0VsZW1lbnRBc1JlbW92ZWQodCxlLCExLG8pLG4pe2NvbnN0IG49dGhpcy5uYW1lc3BhY2VzQnlIb3N0RWxlbWVudC5nZXQoZSk7biYmbi5pZCE9PXQmJm4ucmVtb3ZlTm9kZShlLG8pfX1lbHNlIHRoaXMuX29uUmVtb3ZhbENvbXBsZXRlKGUsbyl9bWFya0VsZW1lbnRBc1JlbW92ZWQodCxlLG4sbyl7dGhpcy5jb2xsZWN0ZWRMZWF2ZUVsZW1lbnRzLnB1c2goZSksZS5fX25nX3JlbW92ZWQ9e25hbWVzcGFjZUlkOnQsc2V0Rm9yUmVtb3ZhbDpvLGhhc0FuaW1hdGlvbjpuLHJlbW92ZWRCZWZvcmVRdWVyaWVkOiExfX1saXN0ZW4odCxlLG4sbyxpKXtyZXR1cm4gZVAoZSk/dGhpcy5fZmV0Y2hOYW1lc3BhY2UodCkubGlzdGVuKGUsbixvLGkpOigpPT57fX1fYnVpbGRJbnN0cnVjdGlvbih0LGUsbixvLGkpe3JldHVybiB0LnRyYW5zaXRpb24uYnVpbGQodGhpcy5kcml2ZXIsdC5lbGVtZW50LHQuZnJvbVN0YXRlLnZhbHVlLHQudG9TdGF0ZS52YWx1ZSxuLG8sdC5mcm9tU3RhdGUub3B0aW9ucyx0LnRvU3RhdGUub3B0aW9ucyxlLGkpfWRlc3Ryb3lJbm5lckFuaW1hdGlvbnModCl7bGV0IGU9dGhpcy5kcml2ZXIucXVlcnkodCxMeCwhMCk7ZS5mb3JFYWNoKCh0PT50aGlzLmRlc3Ryb3lBY3RpdmVBbmltYXRpb25zRm9yRWxlbWVudCh0KSkpLDAhPXRoaXMucGxheWVyc0J5UXVlcmllZEVsZW1lbnQuc2l6ZSYmKGU9dGhpcy5kcml2ZXIucXVlcnkodCxWeCwhMCksZS5mb3JFYWNoKCh0PT50aGlzLmZpbmlzaEFjdGl2ZVF1ZXJpZWRBbmltYXRpb25PbkVsZW1lbnQodCkpKSl9ZGVzdHJveUFjdGl2ZUFuaW1hdGlvbnNGb3JFbGVtZW50KHQpe2NvbnN0IGU9dGhpcy5wbGF5ZXJzQnlFbGVtZW50LmdldCh0KTtlJiZlLmZvckVhY2goKHQ9Pnt0LnF1ZXVlZD90Lm1hcmtlZEZvckRlc3Ryb3k9ITA6dC5kZXN0cm95KCl9KSl9ZmluaXNoQWN0aXZlUXVlcmllZEFuaW1hdGlvbk9uRWxlbWVudCh0KXtjb25zdCBlPXRoaXMucGxheWVyc0J5UXVlcmllZEVsZW1lbnQuZ2V0KHQpO2UmJmUuZm9yRWFjaCgodD0+dC5maW5pc2goKSkpfXdoZW5SZW5kZXJpbmdEb25lKCl7cmV0dXJuIG5ldyBQcm9taXNlKCh0PT57aWYodGhpcy5wbGF5ZXJzLmxlbmd0aClyZXR1cm4gaHgodGhpcy5wbGF5ZXJzKS5vbkRvbmUoKCgpPT50KCkpKTt0KCl9KSl9cHJvY2Vzc0xlYXZlTm9kZSh0KXtjb25zdCBlPXQuX19uZ19yZW1vdmVkO2lmKGUmJmUuc2V0Rm9yUmVtb3ZhbCl7aWYodC5fX25nX3JlbW92ZWQ9cU8sZS5uYW1lc3BhY2VJZCl7dGhpcy5kZXN0cm95SW5uZXJBbmltYXRpb25zKHQpO2NvbnN0IG49dGhpcy5fZmV0Y2hOYW1lc3BhY2UoZS5uYW1lc3BhY2VJZCk7biYmbi5jbGVhckVsZW1lbnRDYWNoZSh0KX10aGlzLl9vblJlbW92YWxDb21wbGV0ZSh0LGUuc2V0Rm9yUmVtb3ZhbCl9dGhpcy5kcml2ZXIubWF0Y2hlc0VsZW1lbnQodCxXTykmJnRoaXMubWFya0VsZW1lbnRBc0Rpc2FibGVkKHQsITEpLHRoaXMuZHJpdmVyLnF1ZXJ5KHQsV08sITApLmZvckVhY2goKHQ9Pnt0aGlzLm1hcmtFbGVtZW50QXNEaXNhYmxlZCh0LCExKX0pKX1mbHVzaCh0PS0xKXtsZXQgZT1bXTtpZih0aGlzLm5ld0hvc3RFbGVtZW50cy5zaXplJiYodGhpcy5uZXdIb3N0RWxlbWVudHMuZm9yRWFjaCgoKHQsZSk9PnRoaXMuX2JhbGFuY2VOYW1lc3BhY2VMaXN0KHQsZSkpKSx0aGlzLm5ld0hvc3RFbGVtZW50cy5jbGVhcigpKSx0aGlzLnRvdGFsQW5pbWF0aW9ucyYmdGhpcy5jb2xsZWN0ZWRFbnRlckVsZW1lbnRzLmxlbmd0aClmb3IobGV0IHQ9MDt0PHRoaXMuY29sbGVjdGVkRW50ZXJFbGVtZW50cy5sZW5ndGg7dCsrKWFQKHRoaXMuY29sbGVjdGVkRW50ZXJFbGVtZW50c1t0XSwibmctc3Rhci1pbnNlcnRlZCIpO2lmKHRoaXMuX25hbWVzcGFjZUxpc3QubGVuZ3RoJiYodGhpcy50b3RhbFF1ZXVlZFBsYXllcnN8fHRoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50cy5sZW5ndGgpKXtjb25zdCBuPVtdO3RyeXtlPXRoaXMuX2ZsdXNoQW5pbWF0aW9ucyhuLHQpfWZpbmFsbHl7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0Kyspblt0XSgpfX1lbHNlIGZvcihsZXQgdD0wO3Q8dGhpcy5jb2xsZWN0ZWRMZWF2ZUVsZW1lbnRzLmxlbmd0aDt0KyspdGhpcy5wcm9jZXNzTGVhdmVOb2RlKHRoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50c1t0XSk7aWYodGhpcy50b3RhbFF1ZXVlZFBsYXllcnM9MCx0aGlzLmNvbGxlY3RlZEVudGVyRWxlbWVudHMubGVuZ3RoPTAsdGhpcy5jb2xsZWN0ZWRMZWF2ZUVsZW1lbnRzLmxlbmd0aD0wLHRoaXMuX2ZsdXNoRm5zLmZvckVhY2goKHQ9PnQoKSkpLHRoaXMuX2ZsdXNoRm5zPVtdLHRoaXMuX3doZW5RdWlldEZucy5sZW5ndGgpe2NvbnN0IHQ9dGhpcy5fd2hlblF1aWV0Rm5zO3RoaXMuX3doZW5RdWlldEZucz1bXSxlLmxlbmd0aD9oeChlKS5vbkRvbmUoKCgpPT57dC5mb3JFYWNoKCh0PT50KCkpKX0pKTp0LmZvckVhY2goKHQ9PnQoKSkpfX1yZXBvcnRFcnJvcih0KXt0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBwcm9jZXNzIGFuaW1hdGlvbnMgZHVlIHRvIHRoZSBmb2xsb3dpbmcgZmFpbGVkIHRyaWdnZXIgdHJhbnNpdGlvbnNcbiAke3Quam9pbigiXG4iKX1gKX1fZmx1c2hBbmltYXRpb25zKHQsZSl7Y29uc3Qgbj1uZXcgTU8sbz1bXSxpPW5ldyBNYXAsYT1bXSxyPW5ldyBNYXAscz1uZXcgTWFwLGw9bmV3IE1hcCxjPW5ldyBTZXQ7dGhpcy5kaXNhYmxlZE5vZGVzLmZvckVhY2goKHQ9PntjLmFkZCh0KTtjb25zdCBlPXRoaXMuZHJpdmVyLnF1ZXJ5KHQsIi5uZy1hbmltYXRlLXF1ZXVlZCIsITApO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWMuYWRkKGVbdF0pfSkpO2NvbnN0IGQ9dGhpcy5ib2R5Tm9kZSxwPUFycmF5LmZyb20odGhpcy5zdGF0ZXNCeUVsZW1lbnQua2V5cygpKSxtPWlQKHAsdGhpcy5jb2xsZWN0ZWRFbnRlckVsZW1lbnRzKSx1PW5ldyBNYXA7bGV0IGY9MDttLmZvckVhY2goKCh0LGUpPT57Y29uc3Qgbj1JeCtmKys7dS5zZXQoZSxuKSx0LmZvckVhY2goKHQ9PmFQKHQsbikpKX0pKTtjb25zdCBnPVtdLGg9bmV3IFNldCxiPW5ldyBTZXQ7Zm9yKGxldCB0PTA7dDx0aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHMubGVuZ3RoO3QrKyl7Y29uc3QgZT10aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHNbdF0sbj1lLl9fbmdfcmVtb3ZlZDtuJiZuLnNldEZvclJlbW92YWwmJihnLnB1c2goZSksaC5hZGQoZSksbi5oYXNBbmltYXRpb24/dGhpcy5kcml2ZXIucXVlcnkoZSwiLm5nLXN0YXItaW5zZXJ0ZWQiLCEwKS5mb3JFYWNoKCh0PT5oLmFkZCh0KSkpOmIuYWRkKGUpKX1jb25zdCB5PW5ldyBNYXAsXz1pUChwLEFycmF5LmZyb20oaCkpO18uZm9yRWFjaCgoKHQsZSk9Pntjb25zdCBuPUh4K2YrKzt5LnNldChlLG4pLHQuZm9yRWFjaCgodD0+YVAodCxuKSkpfSkpLHQucHVzaCgoKCk9PnttLmZvckVhY2goKCh0LGUpPT57Y29uc3Qgbj11LmdldChlKTt0LmZvckVhY2goKHQ9PnJQKHQsbikpKX0pKSxfLmZvckVhY2goKCh0LGUpPT57Y29uc3Qgbj15LmdldChlKTt0LmZvckVhY2goKHQ9PnJQKHQsbikpKX0pKSxnLmZvckVhY2goKHQ9Pnt0aGlzLnByb2Nlc3NMZWF2ZU5vZGUodCl9KSl9KSk7Y29uc3QgQz1bXSxNPVtdO2ZvcihsZXQgdD10aGlzLl9uYW1lc3BhY2VMaXN0Lmxlbmd0aC0xO3Q+PTA7dC0tKXRoaXMuX25hbWVzcGFjZUxpc3RbdF0uZHJhaW5RdWV1ZWRUcmFuc2l0aW9ucyhlKS5mb3JFYWNoKCh0PT57Y29uc3QgZT10LnBsYXllcixpPXQuZWxlbWVudDtpZihDLnB1c2goZSksdGhpcy5jb2xsZWN0ZWRFbnRlckVsZW1lbnRzLmxlbmd0aCl7Y29uc3QgdD1pLl9fbmdfcmVtb3ZlZDtpZih0JiZ0LnNldEZvck1vdmUpcmV0dXJuIHZvaWQgZS5kZXN0cm95KCl9Y29uc3QgYz0hZHx8IXRoaXMuZHJpdmVyLmNvbnRhaW5zRWxlbWVudChkLGkpLHA9eS5nZXQoaSksbT11LmdldChpKSxmPXRoaXMuX2J1aWxkSW5zdHJ1Y3Rpb24odCxuLG0scCxjKTtpZihmLmVycm9ycyYmZi5lcnJvcnMubGVuZ3RoKU0ucHVzaChmKTtlbHNle2lmKGMpcmV0dXJuIGUub25TdGFydCgoKCk9Pkt4KGksZi5mcm9tU3R5bGVzKSkpLGUub25EZXN0cm95KCgoKT0+WHgoaSxmLnRvU3R5bGVzKSkpLHZvaWQgby5wdXNoKGUpO2lmKHQuaXNGYWxsYmFja1RyYW5zaXRpb24pcmV0dXJuIGUub25TdGFydCgoKCk9Pkt4KGksZi5mcm9tU3R5bGVzKSkpLGUub25EZXN0cm95KCgoKT0+WHgoaSxmLnRvU3R5bGVzKSkpLHZvaWQgby5wdXNoKGUpO2YudGltZWxpbmVzLmZvckVhY2goKHQ9PnQuc3RyZXRjaFN0YXJ0aW5nS2V5ZnJhbWU9ITApKSxuLmFwcGVuZChpLGYudGltZWxpbmVzKSxhLnB1c2goe2luc3RydWN0aW9uOmYscGxheWVyOmUsZWxlbWVudDppfSksZi5xdWVyaWVkRWxlbWVudHMuZm9yRWFjaCgodD0+TXgocix0LFtdKS5wdXNoKGUpKSksZi5wcmVTdHlsZVByb3BzLmZvckVhY2goKCh0LGUpPT57Y29uc3Qgbj1PYmplY3Qua2V5cyh0KTtpZihuLmxlbmd0aCl7bGV0IHQ9cy5nZXQoZSk7dHx8cy5zZXQoZSx0PW5ldyBTZXQpLG4uZm9yRWFjaCgoZT0+dC5hZGQoZSkpKX19KSksZi5wb3N0U3R5bGVQcm9wcy5mb3JFYWNoKCgodCxlKT0+e2NvbnN0IG49T2JqZWN0LmtleXModCk7bGV0IG89bC5nZXQoZSk7b3x8bC5zZXQoZSxvPW5ldyBTZXQpLG4uZm9yRWFjaCgodD0+by5hZGQodCkpKX0pKX19KSk7aWYoTS5sZW5ndGgpe2NvbnN0IHQ9W107TS5mb3JFYWNoKChlPT57dC5wdXNoKGBAJHtlLnRyaWdnZXJOYW1lfSBoYXMgZmFpbGVkIGR1ZSB0bzpcbmApLGUuZXJyb3JzLmZvckVhY2goKGU9PnQucHVzaChgLSAke2V9XG5gKSkpfSkpLEMuZm9yRWFjaCgodD0+dC5kZXN0cm95KCkpKSx0aGlzLnJlcG9ydEVycm9yKHQpfWNvbnN0IHY9bmV3IE1hcCx4PW5ldyBNYXA7YS5mb3JFYWNoKCh0PT57Y29uc3QgZT10LmVsZW1lbnQ7bi5oYXMoZSkmJih4LnNldChlLGUpLHRoaXMuX2JlZm9yZUFuaW1hdGlvbkJ1aWxkKHQucGxheWVyLm5hbWVzcGFjZUlkLHQuaW5zdHJ1Y3Rpb24sdikpfSkpLG8uZm9yRWFjaCgodD0+e2NvbnN0IGU9dC5lbGVtZW50O3RoaXMuX2dldFByZXZpb3VzUGxheWVycyhlLCExLHQubmFtZXNwYWNlSWQsdC50cmlnZ2VyTmFtZSxudWxsKS5mb3JFYWNoKCh0PT57TXgodixlLFtdKS5wdXNoKHQpLHQuZGVzdHJveSgpfSkpfSkpO2NvbnN0IE89Zy5maWx0ZXIoKHQ9PmNQKHQscyxsKSkpLFA9bmV3IE1hcDtvUChQLHRoaXMuZHJpdmVyLGIsbCxleCkuZm9yRWFjaCgodD0+e2NQKHQscyxsKSYmTy5wdXNoKHQpfSkpO2NvbnN0IHc9bmV3IE1hcDttLmZvckVhY2goKCh0LGUpPT57b1Aodyx0aGlzLmRyaXZlcixuZXcgU2V0KHQpLHMsIiEiKX0pKSxPLmZvckVhY2goKHQ9Pntjb25zdCBlPVAuZ2V0KHQpLG49dy5nZXQodCk7UC5zZXQodCxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSksbikpfSkpO2NvbnN0IGs9W10sUz1bXSxEPXt9O2EuZm9yRWFjaCgodD0+e2NvbnN0e2VsZW1lbnQ6ZSxwbGF5ZXI6YSxpbnN0cnVjdGlvbjpyfT10O2lmKG4uaGFzKGUpKXtpZihjLmhhcyhlKSlyZXR1cm4gYS5vbkRlc3Ryb3koKCgpPT5YeChlLHIudG9TdHlsZXMpKSksYS5kaXNhYmxlZD0hMCxhLm92ZXJyaWRlVG90YWxUaW1lKHIudG90YWxUaW1lKSx2b2lkIG8ucHVzaChhKTtsZXQgdD1EO2lmKHguc2l6ZT4xKXtsZXQgbj1lO2NvbnN0IG89W107Zm9yKDtuPW4ucGFyZW50Tm9kZTspe2NvbnN0IGU9eC5nZXQobik7aWYoZSl7dD1lO2JyZWFrfW8ucHVzaChuKX1vLmZvckVhY2goKGU9Pnguc2V0KGUsdCkpKX1jb25zdCBuPXRoaXMuX2J1aWxkQW5pbWF0aW9uKGEubmFtZXNwYWNlSWQscix2LGksdyxQKTtpZihhLnNldFJlYWxQbGF5ZXIobiksdD09PUQpay5wdXNoKGEpO2Vsc2V7Y29uc3QgZT10aGlzLnBsYXllcnNCeUVsZW1lbnQuZ2V0KHQpO2UmJmUubGVuZ3RoJiYoYS5wYXJlbnRQbGF5ZXI9aHgoZSkpLG8ucHVzaChhKX19ZWxzZSBLeChlLHIuZnJvbVN0eWxlcyksYS5vbkRlc3Ryb3koKCgpPT5YeChlLHIudG9TdHlsZXMpKSksUy5wdXNoKGEpLGMuaGFzKGUpJiZvLnB1c2goYSl9KSksUy5mb3JFYWNoKCh0PT57Y29uc3QgZT1pLmdldCh0LmVsZW1lbnQpO2lmKGUmJmUubGVuZ3RoKXtjb25zdCBuPWh4KGUpO3Quc2V0UmVhbFBsYXllcihuKX19KSksby5mb3JFYWNoKCh0PT57dC5wYXJlbnRQbGF5ZXI/dC5zeW5jUGxheWVyRXZlbnRzKHQucGFyZW50UGxheWVyKTp0LmRlc3Ryb3koKX0pKTtmb3IobGV0IHQ9MDt0PGcubGVuZ3RoO3QrKyl7Y29uc3QgZT1nW3RdLG49ZS5fX25nX3JlbW92ZWQ7aWYoclAoZSxIeCksbiYmbi5oYXNBbmltYXRpb24pY29udGludWU7bGV0IG89W107aWYoci5zaXplKXtsZXQgdD1yLmdldChlKTt0JiZ0Lmxlbmd0aCYmby5wdXNoKC4uLnQpO2xldCBuPXRoaXMuZHJpdmVyLnF1ZXJ5KGUsVngsITApO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKXtsZXQgZT1yLmdldChuW3RdKTtlJiZlLmxlbmd0aCYmby5wdXNoKC4uLmUpfX1jb25zdCBpPW8uZmlsdGVyKCh0PT4hdC5kZXN0cm95ZWQpKTtpLmxlbmd0aD9zUCh0aGlzLGUsaSk6dGhpcy5wcm9jZXNzTGVhdmVOb2RlKGUpfXJldHVybiBnLmxlbmd0aD0wLGsuZm9yRWFjaCgodD0+e3RoaXMucGxheWVycy5wdXNoKHQpLHQub25Eb25lKCgoKT0+e3QuZGVzdHJveSgpO2NvbnN0IGU9dGhpcy5wbGF5ZXJzLmluZGV4T2YodCk7dGhpcy5wbGF5ZXJzLnNwbGljZShlLDEpfSkpLHQucGxheSgpfSkpLGt9ZWxlbWVudENvbnRhaW5zRGF0YSh0LGUpe2xldCBuPSExO2NvbnN0IG89ZS5fX25nX3JlbW92ZWQ7cmV0dXJuIG8mJm8uc2V0Rm9yUmVtb3ZhbCYmKG49ITApLHRoaXMucGxheWVyc0J5RWxlbWVudC5oYXMoZSkmJihuPSEwKSx0aGlzLnBsYXllcnNCeVF1ZXJpZWRFbGVtZW50LmhhcyhlKSYmKG49ITApLHRoaXMuc3RhdGVzQnlFbGVtZW50LmhhcyhlKSYmKG49ITApLHRoaXMuX2ZldGNoTmFtZXNwYWNlKHQpLmVsZW1lbnRDb250YWluc0RhdGEoZSl8fG59YWZ0ZXJGbHVzaCh0KXt0aGlzLl9mbHVzaEZucy5wdXNoKHQpfWFmdGVyRmx1c2hBbmltYXRpb25zRG9uZSh0KXt0aGlzLl93aGVuUXVpZXRGbnMucHVzaCh0KX1fZ2V0UHJldmlvdXNQbGF5ZXJzKHQsZSxuLG8saSl7bGV0IGE9W107aWYoZSl7Y29uc3QgZT10aGlzLnBsYXllcnNCeVF1ZXJpZWRFbGVtZW50LmdldCh0KTtlJiYoYT1lKX1lbHNle2NvbnN0IGU9dGhpcy5wbGF5ZXJzQnlFbGVtZW50LmdldCh0KTtpZihlKXtjb25zdCB0PSFpfHxpPT1LTztlLmZvckVhY2goKGU9PntlLnF1ZXVlZHx8KHR8fGUudHJpZ2dlck5hbWU9PW8pJiZhLnB1c2goZSl9KSl9fXJldHVybihufHxvKSYmKGE9YS5maWx0ZXIoKHQ9PiEobiYmbiE9dC5uYW1lc3BhY2VJZHx8byYmbyE9dC50cmlnZ2VyTmFtZSkpKSksYX1fYmVmb3JlQW5pbWF0aW9uQnVpbGQodCxlLG4pe2NvbnN0IG89ZS5lbGVtZW50LGk9ZS5pc1JlbW92YWxUcmFuc2l0aW9uP3ZvaWQgMDp0LGE9ZS5pc1JlbW92YWxUcmFuc2l0aW9uP3ZvaWQgMDplLnRyaWdnZXJOYW1lO2Zvcihjb25zdCB0IG9mIGUudGltZWxpbmVzKXtjb25zdCByPXQuZWxlbWVudCxzPXIhPT1vLGw9TXgobixyLFtdKTt0aGlzLl9nZXRQcmV2aW91c1BsYXllcnMocixzLGksYSxlLnRvU3RhdGUpLmZvckVhY2goKHQ9Pntjb25zdCBlPXQuZ2V0UmVhbFBsYXllcigpO2UuYmVmb3JlRGVzdHJveSYmZS5iZWZvcmVEZXN0cm95KCksdC5kZXN0cm95KCksbC5wdXNoKHQpfSkpfUt4KG8sZS5mcm9tU3R5bGVzKX1fYnVpbGRBbmltYXRpb24odCxlLG4sbyxpLGEpe2NvbnN0IHI9ZS50cmlnZ2VyTmFtZSxzPWUuZWxlbWVudCxsPVtdLGM9bmV3IFNldCxkPW5ldyBTZXQscD1lLnRpbWVsaW5lcy5tYXAoKGU9Pntjb25zdCBwPWUuZWxlbWVudDtjLmFkZChwKTtjb25zdCBtPXAuX19uZ19yZW1vdmVkO2lmKG0mJm0ucmVtb3ZlZEJlZm9yZVF1ZXJpZWQpcmV0dXJuIG5ldyBteChlLmR1cmF0aW9uLGUuZGVsYXkpO2NvbnN0IHU9cCE9PXMsZj0oZnVuY3Rpb24gZyh0KXtjb25zdCBlPVtdO3JldHVybiBsUCh0LGUpLGV9KSgobi5nZXQocCl8fFlPKS5tYXAoKHQ9PnQuZ2V0UmVhbFBsYXllcigpKSkpLmZpbHRlcigodD0+ISF0LmVsZW1lbnQmJnQuZWxlbWVudD09PXApKSxoPWkuZ2V0KHApLGI9YS5nZXQocCkseT1ieCgwLHRoaXMuX25vcm1hbGl6ZXIsMCxlLmtleWZyYW1lcyxoLGIpLF89dGhpcy5fYnVpbGRQbGF5ZXIoZSx5LGYpO2lmKGUuc3ViVGltZWxpbmUmJm8mJmQuYWRkKHApLHUpe2NvbnN0IGU9bmV3IHRQKHQscixwKTtlLnNldFJlYWxQbGF5ZXIoXyksbC5wdXNoKGUpfXJldHVybiBffSkpO2wuZm9yRWFjaCgodD0+e014KHRoaXMucGxheWVyc0J5UXVlcmllZEVsZW1lbnQsdC5lbGVtZW50LFtdKS5wdXNoKHQpLHQub25Eb25lKCgoKT0+KGZ1bmN0aW9uIGUodCxuLG8pe2xldCBpO2lmKHQgaW5zdGFuY2VvZiBNYXApe2lmKGk9dC5nZXQobiksaSl7aWYoaS5sZW5ndGgpe2NvbnN0IHQ9aS5pbmRleE9mKG8pO2kuc3BsaWNlKHQsMSl9MD09aS5sZW5ndGgmJnQuZGVsZXRlKG4pfX1lbHNlIGlmKGk9dFtuXSxpKXtpZihpLmxlbmd0aCl7Y29uc3QgdD1pLmluZGV4T2Yobyk7aS5zcGxpY2UodCwxKX0wPT1pLmxlbmd0aCYmZGVsZXRlIHRbbl19cmV0dXJuIGl9KSh0aGlzLnBsYXllcnNCeVF1ZXJpZWRFbGVtZW50LHQuZWxlbWVudCx0KSkpfSkpLGMuZm9yRWFjaCgodD0+YVAodCxCeCkpKTtjb25zdCBtPWh4KHApO3JldHVybiBtLm9uRGVzdHJveSgoKCk9PntjLmZvckVhY2goKHQ9PnJQKHQsQngpKSksWHgocyxlLnRvU3R5bGVzKX0pKSxkLmZvckVhY2goKHQ9PntNeChvLHQsW10pLnB1c2gobSl9KSksbX1fYnVpbGRQbGF5ZXIodCxlLG4pe3JldHVybiBlLmxlbmd0aD4wP3RoaXMuZHJpdmVyLmFuaW1hdGUodC5lbGVtZW50LGUsdC5kdXJhdGlvbix0LmRlbGF5LHQuZWFzaW5nLG4pOm5ldyBteCh0LmR1cmF0aW9uLHQuZGVsYXkpfX1jbGFzcyB0UHtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5uYW1lc3BhY2VJZD10LHRoaXMudHJpZ2dlck5hbWU9ZSx0aGlzLmVsZW1lbnQ9bix0aGlzLl9wbGF5ZXI9bmV3IG14LHRoaXMuX2NvbnRhaW5zUmVhbFBsYXllcj0hMSx0aGlzLl9xdWV1ZWRDYWxsYmFja3M9e30sdGhpcy5kZXN0cm95ZWQ9ITEsdGhpcy5tYXJrZWRGb3JEZXN0cm95PSExLHRoaXMuZGlzYWJsZWQ9ITEsdGhpcy5xdWV1ZWQ9ITAsdGhpcy50b3RhbFRpbWU9MH1zZXRSZWFsUGxheWVyKHQpe3RoaXMuX2NvbnRhaW5zUmVhbFBsYXllcnx8KHRoaXMuX3BsYXllcj10LE9iamVjdC5rZXlzKHRoaXMuX3F1ZXVlZENhbGxiYWNrcykuZm9yRWFjaCgoZT0+e3RoaXMuX3F1ZXVlZENhbGxiYWNrc1tlXS5mb3JFYWNoKChuPT55eCh0LGUsdm9pZCAwLG4pKSl9KSksdGhpcy5fcXVldWVkQ2FsbGJhY2tzPXt9LHRoaXMuX2NvbnRhaW5zUmVhbFBsYXllcj0hMCx0aGlzLm92ZXJyaWRlVG90YWxUaW1lKHQudG90YWxUaW1lKSx0aGlzLnF1ZXVlZD0hMSl9Z2V0UmVhbFBsYXllcigpe3JldHVybiB0aGlzLl9wbGF5ZXJ9b3ZlcnJpZGVUb3RhbFRpbWUodCl7dGhpcy50b3RhbFRpbWU9dH1zeW5jUGxheWVyRXZlbnRzKHQpe2NvbnN0IGU9dGhpcy5fcGxheWVyO2UudHJpZ2dlckNhbGxiYWNrJiZ0Lm9uU3RhcnQoKCgpPT5lLnRyaWdnZXJDYWxsYmFjaygic3RhcnQiKSkpLHQub25Eb25lKCgoKT0+dGhpcy5maW5pc2goKSkpLHQub25EZXN0cm95KCgoKT0+dGhpcy5kZXN0cm95KCkpKX1fcXVldWVFdmVudCh0LGUpe014KHRoaXMuX3F1ZXVlZENhbGxiYWNrcyx0LFtdKS5wdXNoKGUpfW9uRG9uZSh0KXt0aGlzLnF1ZXVlZCYmdGhpcy5fcXVldWVFdmVudCgiZG9uZSIsdCksdGhpcy5fcGxheWVyLm9uRG9uZSh0KX1vblN0YXJ0KHQpe3RoaXMucXVldWVkJiZ0aGlzLl9xdWV1ZUV2ZW50KCJzdGFydCIsdCksdGhpcy5fcGxheWVyLm9uU3RhcnQodCl9b25EZXN0cm95KHQpe3RoaXMucXVldWVkJiZ0aGlzLl9xdWV1ZUV2ZW50KCJkZXN0cm95Iix0KSx0aGlzLl9wbGF5ZXIub25EZXN0cm95KHQpfWluaXQoKXt0aGlzLl9wbGF5ZXIuaW5pdCgpfWhhc1N0YXJ0ZWQoKXtyZXR1cm4hdGhpcy5xdWV1ZWQmJnRoaXMuX3BsYXllci5oYXNTdGFydGVkKCl9cGxheSgpeyF0aGlzLnF1ZXVlZCYmdGhpcy5fcGxheWVyLnBsYXkoKX1wYXVzZSgpeyF0aGlzLnF1ZXVlZCYmdGhpcy5fcGxheWVyLnBhdXNlKCl9cmVzdGFydCgpeyF0aGlzLnF1ZXVlZCYmdGhpcy5fcGxheWVyLnJlc3RhcnQoKX1maW5pc2goKXt0aGlzLl9wbGF5ZXIuZmluaXNoKCl9ZGVzdHJveSgpe3RoaXMuZGVzdHJveWVkPSEwLHRoaXMuX3BsYXllci5kZXN0cm95KCl9cmVzZXQoKXshdGhpcy5xdWV1ZWQmJnRoaXMuX3BsYXllci5yZXNldCgpfXNldFBvc2l0aW9uKHQpe3RoaXMucXVldWVkfHx0aGlzLl9wbGF5ZXIuc2V0UG9zaXRpb24odCl9Z2V0UG9zaXRpb24oKXtyZXR1cm4gdGhpcy5xdWV1ZWQ/MDp0aGlzLl9wbGF5ZXIuZ2V0UG9zaXRpb24oKX10cmlnZ2VyQ2FsbGJhY2sodCl7Y29uc3QgZT10aGlzLl9wbGF5ZXI7ZS50cmlnZ2VyQ2FsbGJhY2smJmUudHJpZ2dlckNhbGxiYWNrKHQpfX1mdW5jdGlvbiBlUCh0KXtyZXR1cm4gdCYmMT09PXQubm9kZVR5cGV9ZnVuY3Rpb24gblAodCxlKXtjb25zdCBuPXQuc3R5bGUuZGlzcGxheTtyZXR1cm4gdC5zdHlsZS5kaXNwbGF5PW51bGwhPWU/ZToibm9uZSIsbn1mdW5jdGlvbiBvUCh0LGUsbixvLGkpe2NvbnN0IGE9W107bi5mb3JFYWNoKCh0PT5hLnB1c2goblAodCkpKSk7Y29uc3Qgcj1bXTtvLmZvckVhY2goKChuLG8pPT57Y29uc3QgYT17fTtuLmZvckVhY2goKHQ9Pntjb25zdCBuPWFbdF09ZS5jb21wdXRlU3R5bGUobyx0LGkpO24mJjAhPW4ubGVuZ3RofHwoby5fX25nX3JlbW92ZWQ9Wk8sci5wdXNoKG8pKX0pKSx0LnNldChvLGEpfSkpO2xldCBzPTA7cmV0dXJuIG4uZm9yRWFjaCgodD0+blAodCxhW3MrK10pKSkscn1mdW5jdGlvbiBpUCh0LGUpe2NvbnN0IG49bmV3IE1hcDtpZih0LmZvckVhY2goKHQ9Pm4uc2V0KHQsW10pKSksMD09ZS5sZW5ndGgpcmV0dXJuIG47Y29uc3Qgbz1uZXcgU2V0KGUpLGk9bmV3IE1hcDtmdW5jdGlvbiBhKHQpe2lmKCF0KXJldHVybiAxO2xldCBlPWkuZ2V0KHQpO2lmKGUpcmV0dXJuIGU7Y29uc3Qgcj10LnBhcmVudE5vZGU7cmV0dXJuIGU9bi5oYXMocik/cjpvLmhhcyhyKT8xOmEociksaS5zZXQodCxlKSxlfXJldHVybiBlLmZvckVhY2goKHQ9Pntjb25zdCBlPWEodCk7MSE9PWUmJm4uZ2V0KGUpLnB1c2godCl9KSksbn1mdW5jdGlvbiBhUCh0LGUpe2lmKHQuY2xhc3NMaXN0KXQuY2xhc3NMaXN0LmFkZChlKTtlbHNle2xldCBuPXQuJCRjbGFzc2VzO258fChuPXQuJCRjbGFzc2VzPXt9KSxuW2VdPSEwfX1mdW5jdGlvbiByUCh0LGUpe2lmKHQuY2xhc3NMaXN0KXQuY2xhc3NMaXN0LnJlbW92ZShlKTtlbHNle2xldCBuPXQuJCRjbGFzc2VzO24mJmRlbGV0ZSBuW2VdfX1mdW5jdGlvbiBzUCh0LGUsbil7aHgobikub25Eb25lKCgoKT0+dC5wcm9jZXNzTGVhdmVOb2RlKGUpKSl9ZnVuY3Rpb24gbFAodCxlKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3Qgbz10W25dO28gaW5zdGFuY2VvZiB1eD9sUChvLnBsYXllcnMsZSk6ZS5wdXNoKG8pfX1mdW5jdGlvbiBjUCh0LGUsbil7Y29uc3Qgbz1uLmdldCh0KTtpZighbylyZXR1cm4hMTtsZXQgaT1lLmdldCh0KTtyZXR1cm4gaT9vLmZvckVhY2goKHQ9PmkuYWRkKHQpKSk6ZS5zZXQodCxvKSxuLmRlbGV0ZSh0KSwhMH1jbGFzcyBkUHtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5ib2R5Tm9kZT10LHRoaXMuX2RyaXZlcj1lLHRoaXMuX25vcm1hbGl6ZXI9bix0aGlzLl90cmlnZ2VyQ2FjaGU9e30sdGhpcy5vblJlbW92YWxDb21wbGV0ZT0odCxlKT0+e30sdGhpcy5fdHJhbnNpdGlvbkVuZ2luZT1uZXcgJE8odCxlLG4pLHRoaXMuX3RpbWVsaW5lRW5naW5lPW5ldyBqTyh0LGUsbiksdGhpcy5fdHJhbnNpdGlvbkVuZ2luZS5vblJlbW92YWxDb21wbGV0ZT0odCxlKT0+dGhpcy5vblJlbW92YWxDb21wbGV0ZSh0LGUpfXJlZ2lzdGVyVHJpZ2dlcih0LGUsbixvLGkpe2NvbnN0IGE9dCsiLSIrbztsZXQgcj10aGlzLl90cmlnZ2VyQ2FjaGVbYV07aWYoIXIpe2NvbnN0IHQ9W10sZT1mTyh0aGlzLl9kcml2ZXIsaSx0KTtpZih0Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYFRoZSBhbmltYXRpb24gdHJpZ2dlciAiJHtvfSIgaGFzIGZhaWxlZCB0byBidWlsZCBkdWUgdG8gdGhlIGZvbGxvd2luZyBlcnJvcnM6XG4gLSAke3Quam9pbigiXG4gLSAiKX1gKTtyPShmdW5jdGlvbiBuKHQsZSxvKXtyZXR1cm4gbmV3IExPKHQsZSxvKX0pKG8sZSx0aGlzLl9ub3JtYWxpemVyKSx0aGlzLl90cmlnZ2VyQ2FjaGVbYV09cn10aGlzLl90cmFuc2l0aW9uRW5naW5lLnJlZ2lzdGVyVHJpZ2dlcihlLG8scil9cmVnaXN0ZXIodCxlKXt0aGlzLl90cmFuc2l0aW9uRW5naW5lLnJlZ2lzdGVyKHQsZSl9ZGVzdHJveSh0LGUpe3RoaXMuX3RyYW5zaXRpb25FbmdpbmUuZGVzdHJveSh0LGUpfW9uSW5zZXJ0KHQsZSxuLG8pe3RoaXMuX3RyYW5zaXRpb25FbmdpbmUuaW5zZXJ0Tm9kZSh0LGUsbixvKX1vblJlbW92ZSh0LGUsbixvKXt0aGlzLl90cmFuc2l0aW9uRW5naW5lLnJlbW92ZU5vZGUodCxlLG98fCExLG4pfWRpc2FibGVBbmltYXRpb25zKHQsZSl7dGhpcy5fdHJhbnNpdGlvbkVuZ2luZS5tYXJrRWxlbWVudEFzRGlzYWJsZWQodCxlKX1wcm9jZXNzKHQsZSxuLG8pe2lmKCJAIj09bi5jaGFyQXQoMCkpe2NvbnN0W3QsaV09dngobik7dGhpcy5fdGltZWxpbmVFbmdpbmUuY29tbWFuZCh0LGUsaSxvKX1lbHNlIHRoaXMuX3RyYW5zaXRpb25FbmdpbmUudHJpZ2dlcih0LGUsbixvKX1saXN0ZW4odCxlLG4sbyxpKXtpZigiQCI9PW4uY2hhckF0KDApKXtjb25zdFt0LG9dPXZ4KG4pO3JldHVybiB0aGlzLl90aW1lbGluZUVuZ2luZS5saXN0ZW4odCxlLG8saSl9cmV0dXJuIHRoaXMuX3RyYW5zaXRpb25FbmdpbmUubGlzdGVuKHQsZSxuLG8saSl9Zmx1c2godD0tMSl7dGhpcy5fdHJhbnNpdGlvbkVuZ2luZS5mbHVzaCh0KX1nZXQgcGxheWVycygpe3JldHVybiB0aGlzLl90cmFuc2l0aW9uRW5naW5lLnBsYXllcnMuY29uY2F0KHRoaXMuX3RpbWVsaW5lRW5naW5lLnBsYXllcnMpfXdoZW5SZW5kZXJpbmdEb25lKCl7cmV0dXJuIHRoaXMuX3RyYW5zaXRpb25FbmdpbmUud2hlblJlbmRlcmluZ0RvbmUoKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIHBQKHQsZSl7bGV0IG49bnVsbCxvPW51bGw7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPyhuPXVQKGVbMF0pLGUubGVuZ3RoPjEmJihvPXVQKGVbZS5sZW5ndGgtMV0pKSk6ZSYmKG49dVAoZSkpLG58fG8/bmV3IG1QKHQsbixvKTpudWxsfWNsYXNzIG1Qe2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLl9lbGVtZW50PXQsdGhpcy5fc3RhcnRTdHlsZXM9ZSx0aGlzLl9lbmRTdHlsZXM9bix0aGlzLl9zdGF0ZT0wO2xldCBvPW1QLmluaXRpYWxTdHlsZXNCeUVsZW1lbnQuZ2V0KHQpO298fG1QLmluaXRpYWxTdHlsZXNCeUVsZW1lbnQuc2V0KHQsbz17fSksdGhpcy5faW5pdGlhbFN0eWxlcz1vfXN0YXJ0KCl7dGhpcy5fc3RhdGU8MSYmKHRoaXMuX3N0YXJ0U3R5bGVzJiZYeCh0aGlzLl9lbGVtZW50LHRoaXMuX3N0YXJ0U3R5bGVzLHRoaXMuX2luaXRpYWxTdHlsZXMpLHRoaXMuX3N0YXRlPTEpfWZpbmlzaCgpe3RoaXMuc3RhcnQoKSx0aGlzLl9zdGF0ZTwyJiYoWHgodGhpcy5fZWxlbWVudCx0aGlzLl9pbml0aWFsU3R5bGVzKSx0aGlzLl9lbmRTdHlsZXMmJihYeCh0aGlzLl9lbGVtZW50LHRoaXMuX2VuZFN0eWxlcyksdGhpcy5fZW5kU3R5bGVzPW51bGwpLHRoaXMuX3N0YXRlPTEpfWRlc3Ryb3koKXt0aGlzLmZpbmlzaCgpLHRoaXMuX3N0YXRlPDMmJihtUC5pbml0aWFsU3R5bGVzQnlFbGVtZW50LmRlbGV0ZSh0aGlzLl9lbGVtZW50KSx0aGlzLl9zdGFydFN0eWxlcyYmKEt4KHRoaXMuX2VsZW1lbnQsdGhpcy5fc3RhcnRTdHlsZXMpLHRoaXMuX2VuZFN0eWxlcz1udWxsKSx0aGlzLl9lbmRTdHlsZXMmJihLeCh0aGlzLl9lbGVtZW50LHRoaXMuX2VuZFN0eWxlcyksdGhpcy5fZW5kU3R5bGVzPW51bGwpLFh4KHRoaXMuX2VsZW1lbnQsdGhpcy5faW5pdGlhbFN0eWxlcyksdGhpcy5fc3RhdGU9Myl9fWZ1bmN0aW9uIHVQKHQpe2xldCBlPW51bGw7Y29uc3Qgbj1PYmplY3Qua2V5cyh0KTtmb3IobGV0IG89MDtvPG4ubGVuZ3RoO28rKyl7Y29uc3QgaT1uW29dO2ZQKGkpJiYoZT1lfHx7fSxlW2ldPXRbaV0pfXJldHVybiBlfWZ1bmN0aW9uIGZQKHQpe3JldHVybiJkaXNwbGF5Ij09PXR8fCJwb3NpdGlvbiI9PT10fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9tUC5pbml0aWFsU3R5bGVzQnlFbGVtZW50PW5ldyBXZWFrTWFwO2NvbnN0IGdQPSJhbmltYXRpb24iLGhQPSJhbmltYXRpb25lbmQiO2NsYXNzIGJQe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIpe3RoaXMuX2VsZW1lbnQ9dCx0aGlzLl9uYW1lPWUsdGhpcy5fZHVyYXRpb249bix0aGlzLl9kZWxheT1vLHRoaXMuX2Vhc2luZz1pLHRoaXMuX2ZpbGxNb2RlPWEsdGhpcy5fb25Eb25lRm49cix0aGlzLl9maW5pc2hlZD0hMSx0aGlzLl9kZXN0cm95ZWQ9ITEsdGhpcy5fc3RhcnRUaW1lPTAsdGhpcy5fcG9zaXRpb249MCx0aGlzLl9ldmVudEZuPXQ9PnRoaXMuX2hhbmRsZUNhbGxiYWNrKHQpfWFwcGx5KCl7IShmdW5jdGlvbiB0KGUsbil7Y29uc3Qgbz14UChlLCIiKS50cmltKCk7bGV0IGk9MDtvLmxlbmd0aCYmKChmdW5jdGlvbiBhKHQsZSl7bGV0IG49MDtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl0LmNoYXJBdChvKT09PWUmJm4rKztyZXR1cm4gbn0pKG8sIiwiKSsxLG49YCR7b30sICR7bn1gKSx2UChlLCIiLG4pfSkodGhpcy5fZWxlbWVudCxgJHt0aGlzLl9kdXJhdGlvbn1tcyAke3RoaXMuX2Vhc2luZ30gJHt0aGlzLl9kZWxheX1tcyAxIG5vcm1hbCAke3RoaXMuX2ZpbGxNb2RlfSAke3RoaXMuX25hbWV9YCksTVAodGhpcy5fZWxlbWVudCx0aGlzLl9ldmVudEZuLCExKSx0aGlzLl9zdGFydFRpbWU9RGF0ZS5ub3coKX1wYXVzZSgpe3lQKHRoaXMuX2VsZW1lbnQsdGhpcy5fbmFtZSwicGF1c2VkIil9cmVzdW1lKCl7eVAodGhpcy5fZWxlbWVudCx0aGlzLl9uYW1lLCJydW5uaW5nIil9c2V0UG9zaXRpb24odCl7Y29uc3QgZT1fUCh0aGlzLl9lbGVtZW50LHRoaXMuX25hbWUpO3RoaXMuX3Bvc2l0aW9uPXQqdGhpcy5fZHVyYXRpb24sdlAodGhpcy5fZWxlbWVudCwiRGVsYXkiLGAtJHt0aGlzLl9wb3NpdGlvbn1tc2AsZSl9Z2V0UG9zaXRpb24oKXtyZXR1cm4gdGhpcy5fcG9zaXRpb259X2hhbmRsZUNhbGxiYWNrKHQpe2NvbnN0IGU9dC5fbmdUZXN0TWFudWFsVGltZXN0YW1wfHxEYXRlLm5vdygpLG49MWUzKnBhcnNlRmxvYXQodC5lbGFwc2VkVGltZS50b0ZpeGVkKDMpKTt0LmFuaW1hdGlvbk5hbWU9PXRoaXMuX25hbWUmJk1hdGgubWF4KGUtdGhpcy5fc3RhcnRUaW1lLDApPj10aGlzLl9kZWxheSYmbj49dGhpcy5fZHVyYXRpb24mJnRoaXMuZmluaXNoKCl9ZmluaXNoKCl7dGhpcy5fZmluaXNoZWR8fCh0aGlzLl9maW5pc2hlZD0hMCx0aGlzLl9vbkRvbmVGbigpLE1QKHRoaXMuX2VsZW1lbnQsdGhpcy5fZXZlbnRGbiwhMCkpfWRlc3Ryb3koKXt0aGlzLl9kZXN0cm95ZWR8fCh0aGlzLl9kZXN0cm95ZWQ9ITAsdGhpcy5maW5pc2goKSwoZnVuY3Rpb24gdChlLG4pe2NvbnN0IG89eFAoZSwiIikuc3BsaXQoIiwiKSxpPUNQKG8sbik7aT49MCYmKG8uc3BsaWNlKGksMSksdlAoZSwiIixvLmpvaW4oIiwiKSkpfSkodGhpcy5fZWxlbWVudCx0aGlzLl9uYW1lKSl9fWZ1bmN0aW9uIHlQKHQsZSxuKXt2UCh0LCJQbGF5U3RhdGUiLG4sX1AodCxlKSl9ZnVuY3Rpb24gX1AodCxlKXtjb25zdCBuPXhQKHQsIiIpO3JldHVybiBuLmluZGV4T2YoIiwiKT4wP0NQKG4uc3BsaXQoIiwiKSxlKTpDUChbbl0sZSl9ZnVuY3Rpb24gQ1AodCxlKXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylpZih0W25dLmluZGV4T2YoZSk+PTApcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gTVAodCxlLG4pe24/dC5yZW1vdmVFdmVudExpc3RlbmVyKGhQLGUpOnQuYWRkRXZlbnRMaXN0ZW5lcihoUCxlKX1mdW5jdGlvbiB2UCh0LGUsbixvKXtjb25zdCBpPWdQK2U7aWYobnVsbCE9byl7Y29uc3QgZT10LnN0eWxlW2ldO2lmKGUubGVuZ3RoKXtjb25zdCB0PWUuc3BsaXQoIiwiKTt0W29dPW4sbj10LmpvaW4oIiwiKX19dC5zdHlsZVtpXT1ufWZ1bmN0aW9uIHhQKHQsZSl7cmV0dXJuIHQuc3R5bGVbZ1ArZV18fCIifWNsYXNzIE9Qe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIscyl7dGhpcy5lbGVtZW50PXQsdGhpcy5rZXlmcmFtZXM9ZSx0aGlzLmFuaW1hdGlvbk5hbWU9bix0aGlzLl9kdXJhdGlvbj1vLHRoaXMuX2RlbGF5PWksdGhpcy5fZmluYWxTdHlsZXM9cix0aGlzLl9zcGVjaWFsU3R5bGVzPXMsdGhpcy5fb25Eb25lRm5zPVtdLHRoaXMuX29uU3RhcnRGbnM9W10sdGhpcy5fb25EZXN0cm95Rm5zPVtdLHRoaXMuY3VycmVudFNuYXBzaG90PXt9LHRoaXMuX3N0YXRlPTAsdGhpcy5lYXNpbmc9YXx8ImxpbmVhciIsdGhpcy50b3RhbFRpbWU9bytpLHRoaXMuX2J1aWxkU3R5bGVyKCl9b25TdGFydCh0KXt0aGlzLl9vblN0YXJ0Rm5zLnB1c2godCl9b25Eb25lKHQpe3RoaXMuX29uRG9uZUZucy5wdXNoKHQpfW9uRGVzdHJveSh0KXt0aGlzLl9vbkRlc3Ryb3lGbnMucHVzaCh0KX1kZXN0cm95KCl7dGhpcy5pbml0KCksdGhpcy5fc3RhdGU+PTR8fCh0aGlzLl9zdGF0ZT00LHRoaXMuX3N0eWxlci5kZXN0cm95KCksdGhpcy5fZmx1c2hTdGFydEZucygpLHRoaXMuX2ZsdXNoRG9uZUZucygpLHRoaXMuX3NwZWNpYWxTdHlsZXMmJnRoaXMuX3NwZWNpYWxTdHlsZXMuZGVzdHJveSgpLHRoaXMuX29uRGVzdHJveUZucy5mb3JFYWNoKCh0PT50KCkpKSx0aGlzLl9vbkRlc3Ryb3lGbnM9W10pfV9mbHVzaERvbmVGbnMoKXt0aGlzLl9vbkRvbmVGbnMuZm9yRWFjaCgodD0+dCgpKSksdGhpcy5fb25Eb25lRm5zPVtdfV9mbHVzaFN0YXJ0Rm5zKCl7dGhpcy5fb25TdGFydEZucy5mb3JFYWNoKCh0PT50KCkpKSx0aGlzLl9vblN0YXJ0Rm5zPVtdfWZpbmlzaCgpe3RoaXMuaW5pdCgpLHRoaXMuX3N0YXRlPj0zfHwodGhpcy5fc3RhdGU9Myx0aGlzLl9zdHlsZXIuZmluaXNoKCksdGhpcy5fZmx1c2hTdGFydEZucygpLHRoaXMuX3NwZWNpYWxTdHlsZXMmJnRoaXMuX3NwZWNpYWxTdHlsZXMuZmluaXNoKCksdGhpcy5fZmx1c2hEb25lRm5zKCkpfXNldFBvc2l0aW9uKHQpe3RoaXMuX3N0eWxlci5zZXRQb3NpdGlvbih0KX1nZXRQb3NpdGlvbigpe3JldHVybiB0aGlzLl9zdHlsZXIuZ2V0UG9zaXRpb24oKX1oYXNTdGFydGVkKCl7cmV0dXJuIHRoaXMuX3N0YXRlPj0yfWluaXQoKXt0aGlzLl9zdGF0ZT49MXx8KHRoaXMuX3N0YXRlPTEsdGhpcy5fc3R5bGVyLmFwcGx5KCksdGhpcy5fZGVsYXkmJnRoaXMuX3N0eWxlci5wYXVzZSgpKX1wbGF5KCl7dGhpcy5pbml0KCksdGhpcy5oYXNTdGFydGVkKCl8fCh0aGlzLl9mbHVzaFN0YXJ0Rm5zKCksdGhpcy5fc3RhdGU9Mix0aGlzLl9zcGVjaWFsU3R5bGVzJiZ0aGlzLl9zcGVjaWFsU3R5bGVzLnN0YXJ0KCkpLHRoaXMuX3N0eWxlci5yZXN1bWUoKX1wYXVzZSgpe3RoaXMuaW5pdCgpLHRoaXMuX3N0eWxlci5wYXVzZSgpfXJlc3RhcnQoKXt0aGlzLnJlc2V0KCksdGhpcy5wbGF5KCl9cmVzZXQoKXt0aGlzLl9zdGF0ZT0wLHRoaXMuX3N0eWxlci5kZXN0cm95KCksdGhpcy5fYnVpbGRTdHlsZXIoKSx0aGlzLl9zdHlsZXIuYXBwbHkoKX1fYnVpbGRTdHlsZXIoKXt0aGlzLl9zdHlsZXI9bmV3IGJQKHRoaXMuZWxlbWVudCx0aGlzLmFuaW1hdGlvbk5hbWUsdGhpcy5fZHVyYXRpb24sdGhpcy5fZGVsYXksdGhpcy5lYXNpbmcsImZvcndhcmRzIiwoKCk9PnRoaXMuZmluaXNoKCkpKX10cmlnZ2VyQ2FsbGJhY2sodCl7Y29uc3QgZT0ic3RhcnQiPT10P3RoaXMuX29uU3RhcnRGbnM6dGhpcy5fb25Eb25lRm5zO2UuZm9yRWFjaCgodD0+dCgpKSksZS5sZW5ndGg9MH1iZWZvcmVEZXN0cm95KCl7dGhpcy5pbml0KCk7Y29uc3QgdD17fTtpZih0aGlzLmhhc1N0YXJ0ZWQoKSl7Y29uc3QgZT10aGlzLl9zdGF0ZT49MztPYmplY3Qua2V5cyh0aGlzLl9maW5hbFN0eWxlcykuZm9yRWFjaCgobj0+eyJvZmZzZXQiIT1uJiYodFtuXT1lP3RoaXMuX2ZpbmFsU3R5bGVzW25dOnNPKHRoaXMuZWxlbWVudCxuKSl9KSl9dGhpcy5jdXJyZW50U25hcHNob3Q9dH19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIFBQIGV4dGVuZHMgbXh7Y29uc3RydWN0b3IodCxlKXtzdXBlcigpLHRoaXMuZWxlbWVudD10LHRoaXMuX3N0YXJ0aW5nU3R5bGVzPXt9LHRoaXMuX19pbml0aWFsaXplZD0hMSx0aGlzLl9zdHlsZXM9VHgoZSl9aW5pdCgpeyF0aGlzLl9faW5pdGlhbGl6ZWQmJnRoaXMuX3N0YXJ0aW5nU3R5bGVzJiYodGhpcy5fX2luaXRpYWxpemVkPSEwLE9iamVjdC5rZXlzKHRoaXMuX3N0eWxlcykuZm9yRWFjaCgodD0+e3RoaXMuX3N0YXJ0aW5nU3R5bGVzW3RdPXRoaXMuZWxlbWVudC5zdHlsZVt0XX0pKSxzdXBlci5pbml0KCkpfXBsYXkoKXt0aGlzLl9zdGFydGluZ1N0eWxlcyYmKHRoaXMuaW5pdCgpLE9iamVjdC5rZXlzKHRoaXMuX3N0eWxlcykuZm9yRWFjaCgodD0+dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KHQsdGhpcy5fc3R5bGVzW3RdKSkpLHN1cGVyLnBsYXkoKSl9ZGVzdHJveSgpe3RoaXMuX3N0YXJ0aW5nU3R5bGVzJiYoT2JqZWN0LmtleXModGhpcy5fc3RhcnRpbmdTdHlsZXMpLmZvckVhY2goKHQ9Pntjb25zdCBlPXRoaXMuX3N0YXJ0aW5nU3R5bGVzW3RdO2U/dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KHQsZSk6dGhpcy5lbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfSkpLHRoaXMuX3N0YXJ0aW5nU3R5bGVzPW51bGwsc3VwZXIuZGVzdHJveSgpKX19Y2xhc3Mgd1B7Y29uc3RydWN0b3IoKXt0aGlzLl9jb3VudD0wfXZhbGlkYXRlU3R5bGVQcm9wZXJ0eSh0KXtyZXR1cm4gRHgodCl9bWF0Y2hlc0VsZW1lbnQodCxlKXtyZXR1cm4gRXgodCxlKX1jb250YWluc0VsZW1lbnQodCxlKXtyZXR1cm4gUngodCxlKX1xdWVyeSh0LGUsbil7cmV0dXJuIEF4KHQsZSxuKX1jb21wdXRlU3R5bGUodCxlLG4pe3JldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KVtlXX1idWlsZEtleWZyYW1lRWxlbWVudCh0LGUsbil7bj1uLm1hcCgodD0+VHgodCkpKTtsZXQgbz1gQGtleWZyYW1lcyAke2V9IHtcbmAsaT0iIjtuLmZvckVhY2goKHQ9PntpPSIgIjtjb25zdCBlPXBhcnNlRmxvYXQodC5vZmZzZXQpO28rPWAke2l9JHsxMDAqZX0lIHtcbmAsaSs9IiAiLE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGU9Pntjb25zdCBuPXRbZV07c3dpdGNoKGUpe2Nhc2Uib2Zmc2V0IjpyZXR1cm47Y2FzZSJlYXNpbmciOnJldHVybiB2b2lkKG4mJihvKz1gJHtpfWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ICR7bn07XG5gKSk7ZGVmYXVsdDpyZXR1cm4gdm9pZChvKz1gJHtpfSR7ZX06ICR7bn07XG5gKX19KSksbys9YCR7aX19XG5gfSkpLG8rPSJ9XG4iO2NvbnN0IGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtyZXR1cm4gYS50ZXh0Q29udGVudD1vLGF9YW5pbWF0ZSh0LGUsbixvLGksYT1bXSxyKXsoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJnImJihmdW5jdGlvbiBzKCl7a1B8fChjb25zb2xlLndhcm4oIkBhbmd1bGFyL2FuaW1hdGlvbnM6IHBsZWFzZSBsb2FkIHRoZSB3ZWItYW5pbWF0aW9ucy5qcyBwb2x5ZmlsbCB0byBhbGxvdyBwcm9ncmFtbWF0aWMgYWNjZXNzLi4uXG4iLCIgIHZpc2l0IGh0dHBzOi8vYml0Lmx5L0lXdWthbSB0byBsZWFybiBtb3JlIGFib3V0IHVzaW5nIHRoZSB3ZWItYW5pbWF0aW9uLWpzIHBvbHlmaWxsLiIpLGtQPSEwKX0pKCk7Y29uc3QgbD1hLmZpbHRlcigodD0+dCBpbnN0YW5jZW9mIE9QKSksYz17fTtpTyhuLG8pJiZsLmZvckVhY2goKHQ9PntsZXQgZT10LmN1cnJlbnRTbmFwc2hvdDtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKCh0PT5jW3RdPWVbdF0pKX0pKTtjb25zdCBkPShmdW5jdGlvbiBwKHQpe2xldCBlPXt9O3JldHVybiB0JiYoQXJyYXkuaXNBcnJheSh0KT90Olt0XSkuZm9yRWFjaCgodD0+e09iamVjdC5rZXlzKHQpLmZvckVhY2goKG49Pnsib2Zmc2V0IiE9biYmImVhc2luZyIhPW4mJihlW25dPXRbbl0pfSkpfSkpLGV9KShlPWFPKHQsZSxjKSk7aWYoMD09bilyZXR1cm4gbmV3IFBQKHQsZCk7Y29uc3QgbT0iZ2VuX2Nzc19rZl8iK3RoaXMuX2NvdW50KyssdT10aGlzLmJ1aWxkS2V5ZnJhbWVFbGVtZW50KHQsbSxlKTsoZnVuY3Rpb24gZih0KXt2YXIgZTtjb25zdCBuPW51bGw9PT0oZT10LmdldFJvb3ROb2RlKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5jYWxsKHQpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgU2hhZG93Um9vdCYmbiBpbnN0YW5jZW9mIFNoYWRvd1Jvb3Q/bjpkb2N1bWVudC5oZWFkfSkodCkuYXBwZW5kQ2hpbGQodSk7Y29uc3QgZz1wUCh0LGUpLGg9bmV3IE9QKHQsZSxtLG4sbyxpLGQsZyk7cmV0dXJuIGgub25EZXN0cm95KCgoKT0+KGZ1bmN0aW9uIHQoZSl7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpfSkodSkpKSxofX1sZXQga1A9ITE7Y2xhc3MgU1B7Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy5lbGVtZW50PXQsdGhpcy5rZXlmcmFtZXM9ZSx0aGlzLm9wdGlvbnM9bix0aGlzLl9zcGVjaWFsU3R5bGVzPW8sdGhpcy5fb25Eb25lRm5zPVtdLHRoaXMuX29uU3RhcnRGbnM9W10sdGhpcy5fb25EZXN0cm95Rm5zPVtdLHRoaXMuX2luaXRpYWxpemVkPSExLHRoaXMuX2ZpbmlzaGVkPSExLHRoaXMuX3N0YXJ0ZWQ9ITEsdGhpcy5fZGVzdHJveWVkPSExLHRoaXMudGltZT0wLHRoaXMucGFyZW50UGxheWVyPW51bGwsdGhpcy5jdXJyZW50U25hcHNob3Q9e30sdGhpcy5fZHVyYXRpb249bi5kdXJhdGlvbix0aGlzLl9kZWxheT1uLmRlbGF5fHwwLHRoaXMudGltZT10aGlzLl9kdXJhdGlvbit0aGlzLl9kZWxheX1fb25GaW5pc2goKXt0aGlzLl9maW5pc2hlZHx8KHRoaXMuX2ZpbmlzaGVkPSEwLHRoaXMuX29uRG9uZUZucy5mb3JFYWNoKCh0PT50KCkpKSx0aGlzLl9vbkRvbmVGbnM9W10pfWluaXQoKXt0aGlzLl9idWlsZFBsYXllcigpLHRoaXMuX3ByZXBhcmVQbGF5ZXJCZWZvcmVTdGFydCgpfV9idWlsZFBsYXllcigpe2lmKHRoaXMuX2luaXRpYWxpemVkKXJldHVybjt0aGlzLl9pbml0aWFsaXplZD0hMDtjb25zdCB0PXRoaXMua2V5ZnJhbWVzO3RoaXMuZG9tUGxheWVyPXRoaXMuX3RyaWdnZXJXZWJBbmltYXRpb24odGhpcy5lbGVtZW50LHQsdGhpcy5vcHRpb25zKSx0aGlzLl9maW5hbEtleWZyYW1lPXQubGVuZ3RoP3RbdC5sZW5ndGgtMV06e30sdGhpcy5kb21QbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcigiZmluaXNoIiwoKCk9PnRoaXMuX29uRmluaXNoKCkpKX1fcHJlcGFyZVBsYXllckJlZm9yZVN0YXJ0KCl7dGhpcy5fZGVsYXk/dGhpcy5fcmVzZXREb21QbGF5ZXJTdGF0ZSgpOnRoaXMuZG9tUGxheWVyLnBhdXNlKCl9X3RyaWdnZXJXZWJBbmltYXRpb24odCxlLG4pe3JldHVybiB0LmFuaW1hdGUoZSxuKX1vblN0YXJ0KHQpe3RoaXMuX29uU3RhcnRGbnMucHVzaCh0KX1vbkRvbmUodCl7dGhpcy5fb25Eb25lRm5zLnB1c2godCl9b25EZXN0cm95KHQpe3RoaXMuX29uRGVzdHJveUZucy5wdXNoKHQpfXBsYXkoKXt0aGlzLl9idWlsZFBsYXllcigpLHRoaXMuaGFzU3RhcnRlZCgpfHwodGhpcy5fb25TdGFydEZucy5mb3JFYWNoKCh0PT50KCkpKSx0aGlzLl9vblN0YXJ0Rm5zPVtdLHRoaXMuX3N0YXJ0ZWQ9ITAsdGhpcy5fc3BlY2lhbFN0eWxlcyYmdGhpcy5fc3BlY2lhbFN0eWxlcy5zdGFydCgpKSx0aGlzLmRvbVBsYXllci5wbGF5KCl9cGF1c2UoKXt0aGlzLmluaXQoKSx0aGlzLmRvbVBsYXllci5wYXVzZSgpfWZpbmlzaCgpe3RoaXMuaW5pdCgpLHRoaXMuX3NwZWNpYWxTdHlsZXMmJnRoaXMuX3NwZWNpYWxTdHlsZXMuZmluaXNoKCksdGhpcy5fb25GaW5pc2goKSx0aGlzLmRvbVBsYXllci5maW5pc2goKX1yZXNldCgpe3RoaXMuX3Jlc2V0RG9tUGxheWVyU3RhdGUoKSx0aGlzLl9kZXN0cm95ZWQ9ITEsdGhpcy5fZmluaXNoZWQ9ITEsdGhpcy5fc3RhcnRlZD0hMX1fcmVzZXREb21QbGF5ZXJTdGF0ZSgpe3RoaXMuZG9tUGxheWVyJiZ0aGlzLmRvbVBsYXllci5jYW5jZWwoKX1yZXN0YXJ0KCl7dGhpcy5yZXNldCgpLHRoaXMucGxheSgpfWhhc1N0YXJ0ZWQoKXtyZXR1cm4gdGhpcy5fc3RhcnRlZH1kZXN0cm95KCl7dGhpcy5fZGVzdHJveWVkfHwodGhpcy5fZGVzdHJveWVkPSEwLHRoaXMuX3Jlc2V0RG9tUGxheWVyU3RhdGUoKSx0aGlzLl9vbkZpbmlzaCgpLHRoaXMuX3NwZWNpYWxTdHlsZXMmJnRoaXMuX3NwZWNpYWxTdHlsZXMuZGVzdHJveSgpLHRoaXMuX29uRGVzdHJveUZucy5mb3JFYWNoKCh0PT50KCkpKSx0aGlzLl9vbkRlc3Ryb3lGbnM9W10pfXNldFBvc2l0aW9uKHQpe3ZvaWQgMD09PXRoaXMuZG9tUGxheWVyJiZ0aGlzLmluaXQoKSx0aGlzLmRvbVBsYXllci5jdXJyZW50VGltZT10KnRoaXMudGltZX1nZXRQb3NpdGlvbigpe3JldHVybiB0aGlzLmRvbVBsYXllci5jdXJyZW50VGltZS90aGlzLnRpbWV9Z2V0IHRvdGFsVGltZSgpe3JldHVybiB0aGlzLl9kZWxheSt0aGlzLl9kdXJhdGlvbn1iZWZvcmVEZXN0cm95KCl7Y29uc3QgdD17fTt0aGlzLmhhc1N0YXJ0ZWQoKSYmT2JqZWN0LmtleXModGhpcy5fZmluYWxLZXlmcmFtZSkuZm9yRWFjaCgoZT0+eyJvZmZzZXQiIT1lJiYodFtlXT10aGlzLl9maW5pc2hlZD90aGlzLl9maW5hbEtleWZyYW1lW2VdOnNPKHRoaXMuZWxlbWVudCxlKSl9KSksdGhpcy5jdXJyZW50U25hcHNob3Q9dH10cmlnZ2VyQ2FsbGJhY2sodCl7Y29uc3QgZT0ic3RhcnQiPT10P3RoaXMuX29uU3RhcnRGbnM6dGhpcy5fb25Eb25lRm5zO2UuZm9yRWFjaCgodD0+dCgpKSksZS5sZW5ndGg9MH19Y2xhc3MgRFB7Y29uc3RydWN0b3IoKXt0aGlzLl9pc05hdGl2ZUltcGw9L1x7XHMqXFtuYXRpdmVccytjb2RlXF1ccypcfS8udGVzdChFUCgpLnRvU3RyaW5nKCkpLHRoaXMuX2Nzc0tleWZyYW1lc0RyaXZlcj1uZXcgd1B9dmFsaWRhdGVTdHlsZVByb3BlcnR5KHQpe3JldHVybiBEeCh0KX1tYXRjaGVzRWxlbWVudCh0LGUpe3JldHVybiBFeCh0LGUpfWNvbnRhaW5zRWxlbWVudCh0LGUpe3JldHVybiBSeCh0LGUpfXF1ZXJ5KHQsZSxuKXtyZXR1cm4gQXgodCxlLG4pfWNvbXB1dGVTdHlsZSh0LGUsbil7cmV0dXJuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpW2VdfW92ZXJyaWRlV2ViQW5pbWF0aW9uc1N1cHBvcnQodCl7dGhpcy5faXNOYXRpdmVJbXBsPXR9YW5pbWF0ZSh0LGUsbixvLGksYT1bXSxyKXtpZighciYmIXRoaXMuX2lzTmF0aXZlSW1wbClyZXR1cm4gdGhpcy5fY3NzS2V5ZnJhbWVzRHJpdmVyLmFuaW1hdGUodCxlLG4sbyxpLGEpO2NvbnN0IHM9e2R1cmF0aW9uOm4sZGVsYXk6byxmaWxsOjA9PW8/ImJvdGgiOiJmb3J3YXJkcyJ9O2kmJihzLmVhc2luZz1pKTtjb25zdCBsPXt9LGM9YS5maWx0ZXIoKHQ9PnQgaW5zdGFuY2VvZiBTUCkpO2lPKG4sbykmJmMuZm9yRWFjaCgodD0+e2xldCBlPXQuY3VycmVudFNuYXBzaG90O09iamVjdC5rZXlzKGUpLmZvckVhY2goKHQ9PmxbdF09ZVt0XSkpfSkpO2NvbnN0IGQ9cFAodCxlPWFPKHQsZT1lLm1hcCgodD0+WXgodCwhMSkpKSxsKSk7cmV0dXJuIG5ldyBTUCh0LGUscyxkKX19ZnVuY3Rpb24gRVAoKXtyZXR1cm4gZngoKSYmRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZXx8e319Ci8qKgogICAgICogQGxpY2Vuc2UgQW5ndWxhciB2MTIuMi4xCiAgICAgKiAoYykgMjAxMC0yMDIxIEdvb2dsZSBMTEMuIGh0dHBzOi8vYW5ndWxhci5pby8KICAgICAqIExpY2Vuc2U6IE1JVAogICAgICovY2xhc3MgUlAgZXh0ZW5kcyB0eHtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5fbmV4dEFuaW1hdGlvbklkPTAsdGhpcy5fcmVuZGVyZXI9dC5jcmVhdGVSZW5kZXJlcihlLmJvZHkse2lkOiIwIixlbmNhcHN1bGF0aW9uOkhuLk5vbmUsc3R5bGVzOltdLGRhdGE6e2FuaW1hdGlvbjpbXX19KX1idWlsZCh0KXtjb25zdCBlPXRoaXMuX25leHRBbmltYXRpb25JZC50b1N0cmluZygpO3RoaXMuX25leHRBbmltYXRpb25JZCsrO2NvbnN0IG49QXJyYXkuaXNBcnJheSh0KT9peCh0KTp0O3JldHVybiBOUCh0aGlzLl9yZW5kZXJlcixudWxsLGUsInJlZ2lzdGVyIixbbl0pLG5ldyBBUChlLHRoaXMuX3JlbmRlcmVyKX19UlAuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFJQKSh2cihfZyksdnIoWl8pKX0sUlAuybVwcm92PU1uKHt0b2tlbjpSUCxmYWN0b3J5OlJQLsm1ZmFjfSksUlAuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpfZ30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChSUCxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6X2d9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSksbnVsbCk7Y2xhc3MgQVAgZXh0ZW5kcyBjbGFzc3t9e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoKSx0aGlzLl9pZD10LHRoaXMuX3JlbmRlcmVyPWV9Y3JlYXRlKHQsZSl7cmV0dXJuIG5ldyBUUCh0aGlzLl9pZCx0LGV8fHt9LHRoaXMuX3JlbmRlcmVyKX19Y2xhc3MgVFB7Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy5pZD10LHRoaXMuZWxlbWVudD1lLHRoaXMuX3JlbmRlcmVyPW8sdGhpcy5wYXJlbnRQbGF5ZXI9bnVsbCx0aGlzLl9zdGFydGVkPSExLHRoaXMudG90YWxUaW1lPTAsdGhpcy5fY29tbWFuZCgiY3JlYXRlIixuKX1fbGlzdGVuKHQsZSl7cmV0dXJuIHRoaXMuX3JlbmRlcmVyLmxpc3Rlbih0aGlzLmVsZW1lbnQsYEBAJHt0aGlzLmlkfToke3R9YCxlKX1fY29tbWFuZCh0LC4uLmUpe3JldHVybiBOUCh0aGlzLl9yZW5kZXJlcix0aGlzLmVsZW1lbnQsdGhpcy5pZCx0LGUpfW9uRG9uZSh0KXt0aGlzLl9saXN0ZW4oImRvbmUiLHQpfW9uU3RhcnQodCl7dGhpcy5fbGlzdGVuKCJzdGFydCIsdCl9b25EZXN0cm95KHQpe3RoaXMuX2xpc3RlbigiZGVzdHJveSIsdCl9aW5pdCgpe3RoaXMuX2NvbW1hbmQoImluaXQiKX1oYXNTdGFydGVkKCl7cmV0dXJuIHRoaXMuX3N0YXJ0ZWR9cGxheSgpe3RoaXMuX2NvbW1hbmQoInBsYXkiKSx0aGlzLl9zdGFydGVkPSEwfXBhdXNlKCl7dGhpcy5fY29tbWFuZCgicGF1c2UiKX1yZXN0YXJ0KCl7dGhpcy5fY29tbWFuZCgicmVzdGFydCIpfWZpbmlzaCgpe3RoaXMuX2NvbW1hbmQoImZpbmlzaCIpfWRlc3Ryb3koKXt0aGlzLl9jb21tYW5kKCJkZXN0cm95Iil9cmVzZXQoKXt0aGlzLl9jb21tYW5kKCJyZXNldCIpLHRoaXMuX3N0YXJ0ZWQ9ITF9c2V0UG9zaXRpb24odCl7dGhpcy5fY29tbWFuZCgic2V0UG9zaXRpb24iLHQpfWdldFBvc2l0aW9uKCl7dmFyIHQsZTtyZXR1cm4gbnVsbCE9PShlPW51bGw9PT0odD10aGlzLl9yZW5kZXJlci5lbmdpbmUucGxheWVyc1srdGhpcy5pZF0pfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmdldFBvc2l0aW9uKCkpJiZ2b2lkIDAhPT1lP2U6MH19ZnVuY3Rpb24gTlAodCxlLG4sbyxpKXtyZXR1cm4gdC5zZXRQcm9wZXJ0eShlLGBAQCR7bn06JHtvfWAsaSl9Y29uc3QgelA9IkAiLElQPSJALmRpc2FibGVkIjtjbGFzcyBIUHtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5kZWxlZ2F0ZT10LHRoaXMuZW5naW5lPWUsdGhpcy5fem9uZT1uLHRoaXMuX2N1cnJlbnRJZD0wLHRoaXMuX21pY3JvdGFza0lkPTEsdGhpcy5fYW5pbWF0aW9uQ2FsbGJhY2tzQnVmZmVyPVtdLHRoaXMuX3JlbmRlcmVyQ2FjaGU9bmV3IE1hcCx0aGlzLl9jZFJlY3VyRGVwdGg9MCx0aGlzLnByb21pc2U9UHJvbWlzZS5yZXNvbHZlKDApLGUub25SZW1vdmFsQ29tcGxldGU9KHQsZSk9PntlJiZlLnBhcmVudE5vZGUodCkmJmUucmVtb3ZlQ2hpbGQodC5wYXJlbnROb2RlLHQpfX1jcmVhdGVSZW5kZXJlcih0LGUpe2NvbnN0IG49dGhpcy5kZWxlZ2F0ZS5jcmVhdGVSZW5kZXJlcih0LGUpO2lmKCEodCYmZSYmZS5kYXRhJiZlLmRhdGEuYW5pbWF0aW9uKSl7bGV0IHQ9dGhpcy5fcmVuZGVyZXJDYWNoZS5nZXQobik7cmV0dXJuIHR8fCh0PW5ldyBGUCgiIixuLHRoaXMuZW5naW5lKSx0aGlzLl9yZW5kZXJlckNhY2hlLnNldChuLHQpKSx0fWNvbnN0IG89ZS5pZCxpPWUuaWQrIi0iK3RoaXMuX2N1cnJlbnRJZDt0aGlzLl9jdXJyZW50SWQrKyx0aGlzLmVuZ2luZS5yZWdpc3RlcihpLHQpO2NvbnN0IGE9ZT0+e0FycmF5LmlzQXJyYXkoZSk/ZS5mb3JFYWNoKGEpOnRoaXMuZW5naW5lLnJlZ2lzdGVyVHJpZ2dlcihvLGksdCxlLm5hbWUsZSl9O3JldHVybiBlLmRhdGEuYW5pbWF0aW9uLmZvckVhY2goYSksbmV3IExQKHRoaXMsaSxuLHRoaXMuZW5naW5lKX1iZWdpbigpe3RoaXMuX2NkUmVjdXJEZXB0aCsrLHRoaXMuZGVsZWdhdGUuYmVnaW4mJnRoaXMuZGVsZWdhdGUuYmVnaW4oKX1fc2NoZWR1bGVDb3VudFRhc2soKXt0aGlzLnByb21pc2UudGhlbigoKCk9Pnt0aGlzLl9taWNyb3Rhc2tJZCsrfSkpfXNjaGVkdWxlTGlzdGVuZXJDYWxsYmFjayh0LGUsbil7dD49MCYmdDx0aGlzLl9taWNyb3Rhc2tJZD90aGlzLl96b25lLnJ1bigoKCk9PmUobikpKTooMD09dGhpcy5fYW5pbWF0aW9uQ2FsbGJhY2tzQnVmZmVyLmxlbmd0aCYmUHJvbWlzZS5yZXNvbHZlKG51bGwpLnRoZW4oKCgpPT57dGhpcy5fem9uZS5ydW4oKCgpPT57dGhpcy5fYW5pbWF0aW9uQ2FsbGJhY2tzQnVmZmVyLmZvckVhY2goKHQ9Pntjb25zdFtlLG5dPXQ7ZShuKX0pKSx0aGlzLl9hbmltYXRpb25DYWxsYmFja3NCdWZmZXI9W119KSl9KSksdGhpcy5fYW5pbWF0aW9uQ2FsbGJhY2tzQnVmZmVyLnB1c2goW2Usbl0pKX1lbmQoKXt0aGlzLl9jZFJlY3VyRGVwdGgtLSwwPT10aGlzLl9jZFJlY3VyRGVwdGgmJnRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT57dGhpcy5fc2NoZWR1bGVDb3VudFRhc2soKSx0aGlzLmVuZ2luZS5mbHVzaCh0aGlzLl9taWNyb3Rhc2tJZCl9KSksdGhpcy5kZWxlZ2F0ZS5lbmQmJnRoaXMuZGVsZWdhdGUuZW5kKCl9d2hlblJlbmRlcmluZ0RvbmUoKXtyZXR1cm4gdGhpcy5lbmdpbmUud2hlblJlbmRlcmluZ0RvbmUoKX19SFAuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEhQKSh2cihfZyksdnIoZFApLHZyKGFfKSl9LEhQLsm1cHJvdj1Nbih7dG9rZW46SFAsZmFjdG9yeTpIUC7JtWZhY30pLEhQLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6X2d9LHt0eXBlOmRQfSx7dHlwZTphX31dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoSFAsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOl9nfSx7dHlwZTpkUH0se3R5cGU6YV99XX0pLG51bGwpO2NsYXNzIEZQe2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLm5hbWVzcGFjZUlkPXQsdGhpcy5kZWxlZ2F0ZT1lLHRoaXMuZW5naW5lPW4sdGhpcy5kZXN0cm95Tm9kZT10aGlzLmRlbGVnYXRlLmRlc3Ryb3lOb2RlP3Q9PmUuZGVzdHJveU5vZGUodCk6bnVsbH1nZXQgZGF0YSgpe3JldHVybiB0aGlzLmRlbGVnYXRlLmRhdGF9ZGVzdHJveSgpe3RoaXMuZW5naW5lLmRlc3Ryb3kodGhpcy5uYW1lc3BhY2VJZCx0aGlzLmRlbGVnYXRlKSx0aGlzLmRlbGVnYXRlLmRlc3Ryb3koKX1jcmVhdGVFbGVtZW50KHQsZSl7cmV0dXJuIHRoaXMuZGVsZWdhdGUuY3JlYXRlRWxlbWVudCh0LGUpfWNyZWF0ZUNvbW1lbnQodCl7cmV0dXJuIHRoaXMuZGVsZWdhdGUuY3JlYXRlQ29tbWVudCh0KX1jcmVhdGVUZXh0KHQpe3JldHVybiB0aGlzLmRlbGVnYXRlLmNyZWF0ZVRleHQodCl9YXBwZW5kQ2hpbGQodCxlKXt0aGlzLmRlbGVnYXRlLmFwcGVuZENoaWxkKHQsZSksdGhpcy5lbmdpbmUub25JbnNlcnQodGhpcy5uYW1lc3BhY2VJZCxlLHQsITEpfWluc2VydEJlZm9yZSh0LGUsbixvPSEwKXt0aGlzLmRlbGVnYXRlLmluc2VydEJlZm9yZSh0LGUsbiksdGhpcy5lbmdpbmUub25JbnNlcnQodGhpcy5uYW1lc3BhY2VJZCxlLHQsbyl9cmVtb3ZlQ2hpbGQodCxlLG4pe3RoaXMuZW5naW5lLm9uUmVtb3ZlKHRoaXMubmFtZXNwYWNlSWQsZSx0aGlzLmRlbGVnYXRlLG4pfXNlbGVjdFJvb3RFbGVtZW50KHQsZSl7cmV0dXJuIHRoaXMuZGVsZWdhdGUuc2VsZWN0Um9vdEVsZW1lbnQodCxlKX1wYXJlbnROb2RlKHQpe3JldHVybiB0aGlzLmRlbGVnYXRlLnBhcmVudE5vZGUodCl9bmV4dFNpYmxpbmcodCl7cmV0dXJuIHRoaXMuZGVsZWdhdGUubmV4dFNpYmxpbmcodCl9c2V0QXR0cmlidXRlKHQsZSxuLG8pe3RoaXMuZGVsZWdhdGUuc2V0QXR0cmlidXRlKHQsZSxuLG8pfXJlbW92ZUF0dHJpYnV0ZSh0LGUsbil7dGhpcy5kZWxlZ2F0ZS5yZW1vdmVBdHRyaWJ1dGUodCxlLG4pfWFkZENsYXNzKHQsZSl7dGhpcy5kZWxlZ2F0ZS5hZGRDbGFzcyh0LGUpfXJlbW92ZUNsYXNzKHQsZSl7dGhpcy5kZWxlZ2F0ZS5yZW1vdmVDbGFzcyh0LGUpfXNldFN0eWxlKHQsZSxuLG8pe3RoaXMuZGVsZWdhdGUuc2V0U3R5bGUodCxlLG4sbyl9cmVtb3ZlU3R5bGUodCxlLG4pe3RoaXMuZGVsZWdhdGUucmVtb3ZlU3R5bGUodCxlLG4pfXNldFByb3BlcnR5KHQsZSxuKXtlLmNoYXJBdCgwKT09elAmJmU9PUlQP3RoaXMuZGlzYWJsZUFuaW1hdGlvbnModCwhIW4pOnRoaXMuZGVsZWdhdGUuc2V0UHJvcGVydHkodCxlLG4pfXNldFZhbHVlKHQsZSl7dGhpcy5kZWxlZ2F0ZS5zZXRWYWx1ZSh0LGUpfWxpc3Rlbih0LGUsbil7cmV0dXJuIHRoaXMuZGVsZWdhdGUubGlzdGVuKHQsZSxuKX1kaXNhYmxlQW5pbWF0aW9ucyh0LGUpe3RoaXMuZW5naW5lLmRpc2FibGVBbmltYXRpb25zKHQsZSl9fWNsYXNzIExQIGV4dGVuZHMgRlB7Y29uc3RydWN0b3IodCxlLG4sbyl7c3VwZXIoZSxuLG8pLHRoaXMuZmFjdG9yeT10LHRoaXMubmFtZXNwYWNlSWQ9ZX1zZXRQcm9wZXJ0eSh0LGUsbil7ZS5jaGFyQXQoMCk9PXpQPyIuIj09ZS5jaGFyQXQoMSkmJmU9PUlQP3RoaXMuZGlzYWJsZUFuaW1hdGlvbnModCxuPXZvaWQgMD09PW58fCEhbik6dGhpcy5lbmdpbmUucHJvY2Vzcyh0aGlzLm5hbWVzcGFjZUlkLHQsZS5zdWJzdHIoMSksbik6dGhpcy5kZWxlZ2F0ZS5zZXRQcm9wZXJ0eSh0LGUsbil9bGlzdGVuKHQsZSxuKXtpZihlLmNoYXJBdCgwKT09elApe2NvbnN0IG89KGZ1bmN0aW9uIGkodCl7c3dpdGNoKHQpe2Nhc2UiYm9keSI6cmV0dXJuIGRvY3VtZW50LmJvZHk7Y2FzZSJkb2N1bWVudCI6cmV0dXJuIGRvY3VtZW50O2Nhc2Uid2luZG93IjpyZXR1cm4gd2luZG93O2RlZmF1bHQ6cmV0dXJuIHR9fSkodCk7bGV0IGE9ZS5zdWJzdHIoMSkscj0iIjtyZXR1cm4gYS5jaGFyQXQoMCkhPXpQJiYoW2Escl09KGZ1bmN0aW9uIHModCl7Y29uc3QgZT10LmluZGV4T2YoIi4iKTtyZXR1cm5bdC5zdWJzdHJpbmcoMCxlKSx0LnN1YnN0cihlKzEpXX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKShhKSksdGhpcy5lbmdpbmUubGlzdGVuKHRoaXMubmFtZXNwYWNlSWQsbyxhLHIsKHQ9Pnt0aGlzLmZhY3Rvcnkuc2NoZWR1bGVMaXN0ZW5lckNhbGxiYWNrKHQuX2RhdGF8fC0xLG4sdCl9KSl9cmV0dXJuIHRoaXMuZGVsZWdhdGUubGlzdGVuKHQsZSxuKX19Y2xhc3MgQlAgZXh0ZW5kcyBkUHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodC5ib2R5LGUsbil9bmdPbkRlc3Ryb3koKXt0aGlzLmZsdXNoKCl9fUJQLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxCUCkodnIoWl8pLHZyKHp4KSx2cihSTykpfSxCUC7JtXByb3Y9TW4oe3Rva2VuOkJQLGZhY3Rvcnk6QlAuybVmYWN9KSxCUC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6enh9LHt0eXBlOlJPfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChCUCxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTp6eH0se3R5cGU6Uk99XX0pLG51bGwpO2NvbnN0IFZQPW5ldyBHYSgiQW5pbWF0aW9uTW9kdWxlVHlwZSIpLGpQPVt7cHJvdmlkZTp0eCx1c2VDbGFzczpSUH0se3Byb3ZpZGU6Uk8sdXNlRmFjdG9yeTpmdW5jdGlvbiBVUCgpe3JldHVybiBuZXcgQU99fSx7cHJvdmlkZTpkUCx1c2VDbGFzczpCUH0se3Byb3ZpZGU6X2csdXNlRmFjdG9yeTpmdW5jdGlvbiBHUCh0LGUsbil7cmV0dXJuIG5ldyBIUCh0LGUsbil9LGRlcHM6W2h2LGRQLGFfXX1dLFdQPVt7cHJvdmlkZTp6eCx1c2VGYWN0b3J5OmZ1bmN0aW9uIFlQKCl7cmV0dXJuKGZ1bmN0aW9uIHQoKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgRVAoKX0pKCk/bmV3IERQOm5ldyB3UH19LHtwcm92aWRlOlZQLHVzZVZhbHVlOiJCcm93c2VyQW5pbWF0aW9ucyJ9LC4uLmpQXSxxUD1be3Byb3ZpZGU6engsdXNlQ2xhc3M6Tnh9LHtwcm92aWRlOlZQLHVzZVZhbHVlOiJOb29wQW5pbWF0aW9ucyJ9LC4uLmpQXTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIFpQe3N0YXRpYyB3aXRoQ29uZmlnKHQpe3JldHVybntuZ01vZHVsZTpaUCxwcm92aWRlcnM6dC5kaXNhYmxlQW5pbWF0aW9ucz9xUDpXUH19fVpQLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxaUCl9LFpQLsm1bW9kPWFvKHt0eXBlOlpQfSksWlAuybVpbmo9dm4oe3Byb3ZpZGVyczpXUCxpbXBvcnRzOltVdl19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFpQLFt7dHlwZTpBeSxhcmdzOlt7ZXhwb3J0czpbVXZdLHByb3ZpZGVyczpXUH1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFpQLHtleHBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1V2XX19KTtjbGFzcyBYUHt9WFAuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFhQKX0sWFAuybVtb2Q9YW8oe3R5cGU6WFB9KSxYUC7JtWluaj12bih7cHJvdmlkZXJzOnFQLGltcG9ydHM6W1V2XX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWFAsW3t0eXBlOkF5LGFyZ3M6W3tleHBvcnRzOltVdl0scHJvdmlkZXJzOnFQfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oWFAse2V4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bVXZdfX0pO2NvbnN0IEtQPXt9O2Z1bmN0aW9uIEpQKHQsZSl7aWYoS1BbdF09KEtQW3RdfHwwKSsxLCJmdW5jdGlvbiI9PXR5cGVvZiBlKXJldHVybiBRUCh0LCgoLi4ubik9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKC4uLm4pKSx7dHlwZTp0fSkpKTtzd2l0Y2goZT9lLl9hczoiZW1wdHkiKXtjYXNlImVtcHR5IjpyZXR1cm4gUVAodCwoKCk9Pih7dHlwZTp0fSkpKTtjYXNlInByb3BzIjpyZXR1cm4gUVAodCwoZT0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHt0eXBlOnR9KSkpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGNvbmZpZy4iKX19ZnVuY3Rpb24gUVAodCxlKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInR5cGUiLHt2YWx1ZTp0LHdyaXRhYmxlOiExfSl9Y29uc3QgJFA9IkBuZ3J4L3N0b3JlL2luaXQiO2NsYXNzIHR3IGV4dGVuZHMgRntjb25zdHJ1Y3Rvcigpe3N1cGVyKHt0eXBlOiRQfSl9bmV4dCh0KXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJcbiAgICAgICAgRGlzcGF0Y2ggZXhwZWN0ZWQgYW4gb2JqZWN0LCBpbnN0ZWFkIGl0IHJlY2VpdmVkIGEgZnVuY3Rpb24uXG4gICAgICAgIElmIHlvdSdyZSB1c2luZyB0aGUgY3JlYXRlQWN0aW9uIGZ1bmN0aW9uLCBtYWtlIHN1cmUgdG8gaW52b2tlIHRoZSBmdW5jdGlvblxuICAgICAgICBiZWZvcmUgZGlzcGF0Y2hpbmcgdGhlIGFjdGlvbi4gRm9yIGV4YW1wbGUsIHNvbWVBY3Rpb24gc2hvdWxkIGJlIHNvbWVBY3Rpb24oKS4iKTtpZih2b2lkIDA9PT10KXRocm93IG5ldyBUeXBlRXJyb3IoIkFjdGlvbnMgbXVzdCBiZSBvYmplY3RzIik7aWYodm9pZCAwPT09dC50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkFjdGlvbnMgbXVzdCBoYXZlIGEgdHlwZSBwcm9wZXJ0eSIpO3N1cGVyLm5leHQodCl9Y29tcGxldGUoKXt9bmdPbkRlc3Ryb3koKXtzdXBlci5jb21wbGV0ZSgpfX10dy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8dHcpfSx0dy7JtXByb3Y9TW4oe3Rva2VuOnR3LGZhY3Rvcnk6dHcuybVmYWN9KSx0dy5jdG9yUGFyYW1ldGVycz0oKT0+W10sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh0dyxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5bXX0pLG51bGwpO2NvbnN0IGV3PVt0d10sbnc9bmV3IEdhKCJAbmdyeC9zdG9yZSBJbnRlcm5hbCBSb290IEd1YXJkIiksb3c9bmV3IEdhKCJAbmdyeC9zdG9yZSBJbnRlcm5hbCBJbml0aWFsIFN0YXRlIiksaXc9bmV3IEdhKCJAbmdyeC9zdG9yZSBJbml0aWFsIFN0YXRlIiksYXc9bmV3IEdhKCJAbmdyeC9zdG9yZSBSZWR1Y2VyIEZhY3RvcnkiKSxydz1uZXcgR2EoIkBuZ3J4L3N0b3JlIEludGVybmFsIFJlZHVjZXIgRmFjdG9yeSBQcm92aWRlciIpLHN3PW5ldyBHYSgiQG5ncngvc3RvcmUgSW5pdGlhbCBSZWR1Y2VycyIpLGx3PW5ldyBHYSgiQG5ncngvc3RvcmUgSW50ZXJuYWwgSW5pdGlhbCBSZWR1Y2VycyIpLGN3PW5ldyBHYSgiQG5ncngvc3RvcmUgU3RvcmUgRmVhdHVyZXMiKSxkdz1uZXcgR2EoIkBuZ3J4L3N0b3JlIEludGVybmFsIFN0b3JlIFJlZHVjZXJzIikscHc9bmV3IEdhKCJAbmdyeC9zdG9yZSBJbnRlcm5hbCBGZWF0dXJlIFJlZHVjZXJzIiksbXc9bmV3IEdhKCJAbmdyeC9zdG9yZSBJbnRlcm5hbCBGZWF0dXJlIENvbmZpZ3MiKSx1dz1uZXcgR2EoIkBuZ3J4L3N0b3JlIEludGVybmFsIFN0b3JlIEZlYXR1cmVzIiksZnc9bmV3IEdhKCJAbmdyeC9zdG9yZSBJbnRlcm5hbCBGZWF0dXJlIFJlZHVjZXJzIFRva2VuIiksZ3c9bmV3IEdhKCJAbmdyeC9zdG9yZSBGZWF0dXJlIFJlZHVjZXJzIiksaHc9bmV3IEdhKCJAbmdyeC9zdG9yZSBVc2VyIFByb3ZpZGVkIE1ldGEgUmVkdWNlcnMiKSxidz1uZXcgR2EoIkBuZ3J4L3N0b3JlIE1ldGEgUmVkdWNlcnMiKSx5dz1uZXcgR2EoIkBuZ3J4L3N0b3JlIEludGVybmFsIFJlc29sdmVkIE1ldGEgUmVkdWNlcnMiKSxfdz1uZXcgR2EoIkBuZ3J4L3N0b3JlIFVzZXIgUnVudGltZSBDaGVja3MgQ29uZmlnIiksQ3c9bmV3IEdhKCJAbmdyeC9zdG9yZSBJbnRlcm5hbCBVc2VyIFJ1bnRpbWUgQ2hlY2tzIENvbmZpZyIpLE13PW5ldyBHYSgiQG5ncngvc3RvcmUgSW50ZXJuYWwgUnVudGltZSBDaGVja3MiKSx2dz1uZXcgR2EoIkBuZ3J4L3N0b3JlIENoZWNrIGlmIEFjdGlvbiB0eXBlcyBhcmUgdW5pcXVlIik7ZnVuY3Rpb24geHcodCxlPXt9KXtjb25zdCBuPU9iamVjdC5rZXlzKHQpLG89e307Zm9yKGxldCBlPTA7ZTxuLmxlbmd0aDtlKyspe2NvbnN0IGk9bltlXTsiZnVuY3Rpb24iPT10eXBlb2YgdFtpXSYmKG9baV09dFtpXSl9Y29uc3QgaT1PYmplY3Qua2V5cyhvKTtyZXR1cm4gZnVuY3Rpb24gdChuLGEpe249dm9pZCAwPT09bj9lOm47bGV0IHI9ITE7Y29uc3Qgcz17fTtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrKyl7Y29uc3QgZT1pW3RdLGw9bltlXSxjPSgwLG9bZV0pKGwsYSk7c1tlXT1jLHI9cnx8YyE9PWx9cmV0dXJuIHI/czpufX1mdW5jdGlvbiBPdyguLi50KXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYoMD09PXQubGVuZ3RoKXJldHVybiBlO2NvbnN0IG49dFt0Lmxlbmd0aC0xXTtyZXR1cm4gdC5zbGljZSgwLC0xKS5yZWR1Y2VSaWdodCgoKHQsZSk9PmUodCkpLG4oZSkpfX1mdW5jdGlvbiBQdyh0LGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aD4wJiYodD1Pdy5hcHBseShudWxsLFsuLi5lLHRdKSksKGUsbik9Pntjb25zdCBvPXQoZSk7cmV0dXJuKHQsZSk9Pm8odD12b2lkIDA9PT10P246dCxlKX19Y2xhc3Mgd3cgZXh0ZW5kcyBEe31jbGFzcyBrdyBleHRlbmRzIHR3e31jbGFzcyBTdyBleHRlbmRzIEZ7Y29uc3RydWN0b3IodCxlLG4sbyl7c3VwZXIobyhuLGUpKSx0aGlzLmRpc3BhdGNoZXI9dCx0aGlzLmluaXRpYWxTdGF0ZT1lLHRoaXMucmVkdWNlcnM9bix0aGlzLnJlZHVjZXJGYWN0b3J5PW99Z2V0IGN1cnJlbnRSZWR1Y2Vycygpe3JldHVybiB0aGlzLnJlZHVjZXJzfWFkZEZlYXR1cmUodCl7dGhpcy5hZGRGZWF0dXJlcyhbdF0pfWFkZEZlYXR1cmVzKHQpe2NvbnN0IGU9dC5yZWR1Y2UoKCh0LHtyZWR1Y2VyczplLHJlZHVjZXJGYWN0b3J5Om4sbWV0YVJlZHVjZXJzOm8saW5pdGlhbFN0YXRlOmksa2V5OmF9KT0+e2NvbnN0IHI9ImZ1bmN0aW9uIj09dHlwZW9mIGU/KGZ1bmN0aW9uIHModCl7Y29uc3QgZT1BcnJheS5pc0FycmF5KHQpJiZ0Lmxlbmd0aD4wP093KC4uLnQpOnQ9PnQ7cmV0dXJuKHQsbik9Pih0PWUodCksKGUsbyk9PnQoZT12b2lkIDA9PT1lP246ZSxvKSl9KShvKShlLGkpOlB3KG4sbykoZSxpKTtyZXR1cm4gdFthXT1yLHR9KSx7fSk7dGhpcy5hZGRSZWR1Y2VycyhlKX1yZW1vdmVGZWF0dXJlKHQpe3RoaXMucmVtb3ZlRmVhdHVyZXMoW3RdKX1yZW1vdmVGZWF0dXJlcyh0KXt0aGlzLnJlbW92ZVJlZHVjZXJzKHQubWFwKCh0PT50LmtleSkpKX1hZGRSZWR1Y2VyKHQsZSl7dGhpcy5hZGRSZWR1Y2Vycyh7W3RdOmV9KX1hZGRSZWR1Y2Vycyh0KXt0aGlzLnJlZHVjZXJzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0aGlzLnJlZHVjZXJzKSx0KSx0aGlzLnVwZGF0ZVJlZHVjZXJzKE9iamVjdC5rZXlzKHQpKX1yZW1vdmVSZWR1Y2VyKHQpe3RoaXMucmVtb3ZlUmVkdWNlcnMoW3RdKX1yZW1vdmVSZWR1Y2Vycyh0KXt0LmZvckVhY2goKHQ9Pnt0aGlzLnJlZHVjZXJzPShmdW5jdGlvbiBlKHQsbil7cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZpbHRlcigodD0+dCE9PW4pKS5yZWR1Y2UoKChlLG4pPT5PYmplY3QuYXNzaWduKGUse1tuXTp0W25dfSkpLHt9KX0pKHRoaXMucmVkdWNlcnMsdCl9KSksdGhpcy51cGRhdGVSZWR1Y2Vycyh0KX11cGRhdGVSZWR1Y2Vycyh0KXt0aGlzLm5leHQodGhpcy5yZWR1Y2VyRmFjdG9yeSh0aGlzLnJlZHVjZXJzLHRoaXMuaW5pdGlhbFN0YXRlKSksdGhpcy5kaXNwYXRjaGVyLm5leHQoe3R5cGU6IkBuZ3J4L3N0b3JlL3VwZGF0ZS1yZWR1Y2VycyIsZmVhdHVyZXM6dH0pfW5nT25EZXN0cm95KCl7dGhpcy5jb21wbGV0ZSgpfX1Tdy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8U3cpKHZyKGt3KSx2cihpdyksdnIoc3cpLHZyKGF3KSl9LFN3Lsm1cHJvdj1Nbih7dG9rZW46U3csZmFjdG9yeTpTdy7JtWZhY30pLFN3LmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6a3d9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltpd119XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3N3XX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbYXddfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFN3LFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTprd30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W2l3XX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbc3ddfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOlthd119XX1dfSksbnVsbCk7Y29uc3QgRHc9W1N3LHtwcm92aWRlOnd3LHVzZUV4aXN0aW5nOlN3fSx7cHJvdmlkZTprdyx1c2VFeGlzdGluZzp0d31dO2NsYXNzIEV3IGV4dGVuZHMgSXtuZ09uRGVzdHJveSgpe3RoaXMuY29tcGxldGUoKX19RXcuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKEV3KSkpKG58fEV3KX19KSgpLEV3Lsm1cHJvdj1Nbih7dG9rZW46RXcsZmFjdG9yeTpFdy7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRXcsW3t0eXBlOmltfV0sbnVsbCxudWxsKTtjb25zdCBSdz1bRXddO2NsYXNzIEF3IGV4dGVuZHMgRHt9Y2xhc3MgVHcgZXh0ZW5kcyBGe2NvbnN0cnVjdG9yKHQsZSxuLG8pe3N1cGVyKG8pO2NvbnN0IGk9dC5waXBlKChmdW5jdGlvbiByKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPTApLFIoKGZ1bmN0aW9uKG4sbyl7bi5zdWJzY3JpYmUobmV3IFQobywoZnVuY3Rpb24obil7cmV0dXJuIG8uYWRkKHQuc2NoZWR1bGUoKGZ1bmN0aW9uKCl7cmV0dXJuIG8ubmV4dChuKX0pLGUpKX0pLChmdW5jdGlvbigpe3JldHVybiBvLmFkZCh0LnNjaGVkdWxlKChmdW5jdGlvbigpe3JldHVybiBvLmNvbXBsZXRlKCl9KSxlKSl9KSwoZnVuY3Rpb24obil7cmV0dXJuIG8uYWRkKHQuc2NoZWR1bGUoKGZ1bmN0aW9uKCl7cmV0dXJuIG8uZXJyb3Iobil9KSxlKSl9KSkpfSkpfSkob3QpKS5waXBlKFZlKGUpKS5waXBlKChmdW5jdGlvbiBhKHQsZSl7cmV0dXJuIFIobWUodCxlLGFyZ3VtZW50cy5sZW5ndGg+PTIsITApKX0pKE53LHtzdGF0ZTpvfSkpO3RoaXMuc3RhdGVTdWJzY3JpcHRpb249aS5zdWJzY3JpYmUoKCh7c3RhdGU6dCxhY3Rpb246ZX0pPT57dGhpcy5uZXh0KHQpLG4ubmV4dChlKX0pKX1uZ09uRGVzdHJveSgpe3RoaXMuc3RhdGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLmNvbXBsZXRlKCl9fWZ1bmN0aW9uIE53KHQ9e3N0YXRlOnZvaWQgMH0sW2Usbl0pe2NvbnN0e3N0YXRlOm99PXQ7cmV0dXJue3N0YXRlOm4obyxlKSxhY3Rpb246ZX19VHcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFR3KSh2cih0dyksdnIod3cpLHZyKEV3KSx2cihpdykpfSxUdy7JtXByb3Y9TW4oe3Rva2VuOlR3LGZhY3Rvcnk6VHcuybVmYWN9KSxUdy5JTklUPSRQLFR3LmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6dHd9LHt0eXBlOnd3fSx7dHlwZTpFd30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W2l3XX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChUdyxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dHd9LHt0eXBlOnd3fSx7dHlwZTpFd30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W2l3XX1dfV19KSxudWxsKTtjb25zdCB6dz1bVHcse3Byb3ZpZGU6QXcsdXNlRXhpc3Rpbmc6VHd9XTtjbGFzcyBJdyBleHRlbmRzIER7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKCksdGhpcy5hY3Rpb25zT2JzZXJ2ZXI9ZSx0aGlzLnJlZHVjZXJNYW5hZ2VyPW4sdGhpcy5zb3VyY2U9dH1zZWxlY3QodCwuLi5lKXtyZXR1cm4gRncuY2FsbChudWxsLHQsLi4uZSkodGhpcyl9bGlmdCh0KXtjb25zdCBlPW5ldyBJdyh0aGlzLHRoaXMuYWN0aW9uc09ic2VydmVyLHRoaXMucmVkdWNlck1hbmFnZXIpO3JldHVybiBlLm9wZXJhdG9yPXQsZX1kaXNwYXRjaCh0KXt0aGlzLmFjdGlvbnNPYnNlcnZlci5uZXh0KHQpfW5leHQodCl7dGhpcy5hY3Rpb25zT2JzZXJ2ZXIubmV4dCh0KX1lcnJvcih0KXt0aGlzLmFjdGlvbnNPYnNlcnZlci5lcnJvcih0KX1jb21wbGV0ZSgpe3RoaXMuYWN0aW9uc09ic2VydmVyLmNvbXBsZXRlKCl9YWRkUmVkdWNlcih0LGUpe3RoaXMucmVkdWNlck1hbmFnZXIuYWRkUmVkdWNlcih0LGUpfXJlbW92ZVJlZHVjZXIodCl7dGhpcy5yZWR1Y2VyTWFuYWdlci5yZW1vdmVSZWR1Y2VyKHQpfX1Jdy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SXcpKHZyKEF3KSx2cih0dyksdnIoU3cpKX0sSXcuybVwcm92PU1uKHt0b2tlbjpJdyxmYWN0b3J5Okl3Lsm1ZmFjfSksSXcuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpBd30se3R5cGU6dHd9LHt0eXBlOlN3fV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChJdyxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6QXd9LHt0eXBlOnR3fSx7dHlwZTpTd31dfSksbnVsbCk7Y29uc3QgSHc9W0l3XTtmdW5jdGlvbiBGdyh0LGUsLi4ubil7cmV0dXJuIGZ1bmN0aW9uIG8oaSl7bGV0IGE7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtjb25zdCBvPVtlLC4uLm5dLmZpbHRlcihCb29sZWFuKTthPWkucGlwZSgoZnVuY3Rpb24gcigpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTt2YXIgbj10Lmxlbmd0aDtpZigwPT09bil0aHJvdyBuZXcgRXJyb3IoImxpc3Qgb2YgcHJvcGVydGllcyBjYW5ub3QgYmUgZW1wdHkuIik7cmV0dXJuIEl0KChmdW5jdGlvbihlKXtmb3IodmFyIG89ZSxpPTA7aTxuO2krKyl7dmFyIGE9bnVsbD09bz92b2lkIDA6b1t0W2ldXTtpZih2b2lkIDA9PT1hKXJldHVybjtvPWF9cmV0dXJuIG99KSl9KSh0LC4uLm8pKX1lbHNle2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoYFVuZXhwZWN0ZWQgdHlwZSAnJHt0eXBlb2YgdH0nIGluIHNlbGVjdCBvcGVyYXRvciwgZXhwZWN0ZWQgJ3N0cmluZycgb3IgJ2Z1bmN0aW9uJ2ApO2E9aS5waXBlKEl0KChuPT50KG4sZSkpKSl9cmV0dXJuIGEucGlwZShNZSgpKX19Y29uc3QgTHc9Imh0dHBzOi8vbmdyeC5pby9ndWlkZS9zdG9yZS9jb25maWd1cmF0aW9uL3J1bnRpbWUtY2hlY2tzIjtmdW5jdGlvbiBCdyh0KXtyZXR1cm4gdm9pZCAwPT09dH1mdW5jdGlvbiBWdyh0KXtyZXR1cm4gbnVsbD09PXR9ZnVuY3Rpb24gancodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCl9ZnVuY3Rpb24gVXcodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dH1mdW5jdGlvbiBHdyh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH1mdW5jdGlvbiBXdyh0LGUpe3JldHVybiB0PT09ZX1mdW5jdGlvbiBZdyh0LGUsbil7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspaWYoIW4odFtvXSxlW29dKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBxdyh0LGU9V3csbj1Xdyl7bGV0IG8saT1udWxsLGE9bnVsbDtyZXR1cm57bWVtb2l6ZWQ6ZnVuY3Rpb24gcigpe2lmKHZvaWQgMCE9PW8pcmV0dXJuIG8ucmVzdWx0O2lmKCFpKXJldHVybiBhPXQuYXBwbHkobnVsbCxhcmd1bWVudHMpLGk9YXJndW1lbnRzLGE7aWYoIVl3KGFyZ3VtZW50cyxpLGUpKXJldHVybiBhO2NvbnN0IHI9dC5hcHBseShudWxsLGFyZ3VtZW50cyk7cmV0dXJuIGk9YXJndW1lbnRzLG4oYSxyKT9hOihhPXIscil9LHJlc2V0OmZ1bmN0aW9uIHMoKXtpPW51bGwsYT1udWxsfSxzZXRSZXN1bHQ6ZnVuY3Rpb24gbCh0KXtvPXtyZXN1bHQ6dH19LGNsZWFyUmVzdWx0OmZ1bmN0aW9uIGMoKXtvPXZvaWQgMH19fWZ1bmN0aW9uIFp3KC4uLnQpe3JldHVybihmdW5jdGlvbiBlKHQsbj17c3RhdGVGbjpYd30pe3JldHVybiBmdW5jdGlvbiguLi5lKXtsZXQgbz1lO2lmKEFycmF5LmlzQXJyYXkob1swXSkpe2NvbnN0W3QsLi4uZV09bztvPVsuLi50LC4uLmVdfWNvbnN0IGk9by5zbGljZSgwLG8ubGVuZ3RoLTEpLGE9b1tvLmxlbmd0aC0xXSxyPWkuZmlsdGVyKCh0PT50LnJlbGVhc2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlbGVhc2UpKSxzPXQoKGZ1bmN0aW9uKC4uLnQpe3JldHVybiBhLmFwcGx5KG51bGwsdCl9KSksbD1xdygoZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5zdGF0ZUZuLmFwcGx5KG51bGwsW3QsaSxlLHNdKX0pKTtyZXR1cm4gT2JqZWN0LmFzc2lnbihsLm1lbW9pemVkLHtyZWxlYXNlOmZ1bmN0aW9uIGMoKXtsLnJlc2V0KCkscy5yZXNldCgpLHIuZm9yRWFjaCgodD0+dC5yZWxlYXNlKCkpKX0scHJvamVjdG9yOnMubWVtb2l6ZWQsc2V0UmVzdWx0Omwuc2V0UmVzdWx0LGNsZWFyUmVzdWx0OmwuY2xlYXJSZXN1bHR9KX19KShxdykoLi4udCl9ZnVuY3Rpb24gWHcodCxlLG4sbyl7aWYodm9pZCAwPT09bil7Y29uc3Qgbj1lLm1hcCgoZT0+ZSh0KSkpO3JldHVybiBvLm1lbW9pemVkLmFwcGx5KG51bGwsbil9Y29uc3QgaT1lLm1hcCgoZT0+ZSh0LG4pKSk7cmV0dXJuIG8ubWVtb2l6ZWQuYXBwbHkobnVsbCxbLi4uaSxuXSl9ZnVuY3Rpb24gS3codCl7cmV0dXJuIFp3KChlPT57Y29uc3Qgbj1lW3RdO3JldHVybiB5XygpJiYhKHQgaW4gZSkmJmNvbnNvbGUud2FybihgQG5ncngvc3RvcmU6IFRoZSBmZWF0dXJlIG5hbWUgIiR7dH0iIGRvZXMgbm90IGV4aXN0IGluIHRoZSBzdGF0ZSwgdGhlcmVmb3JlIGNyZWF0ZUZlYXR1cmVTZWxlY3RvciBjYW5ub3QgYWNjZXNzIGl0LiAgQmUgc3VyZSBpdCBpcyBpbXBvcnRlZCBpbiBhIGxvYWRlZCBtb2R1bGUgdXNpbmcgU3RvcmVNb2R1bGUuZm9yUm9vdCgnJHt0fScsIC4uLikgb3IgU3RvcmVNb2R1bGUuZm9yRmVhdHVyZSgnJHt0fScsIC4uLikuICBJZiB0aGUgZGVmYXVsdCBzdGF0ZSBpcyBpbnRlbmRlZCB0byBiZSB1bmRlZmluZWQsIGFzIGlzIHRoZSBjYXNlIHdpdGggcm91dGVyIHN0YXRlLCB0aGlzIGRldmVsb3BtZW50LW9ubHkgd2FybmluZyBtZXNzYWdlIGNhbiBiZSBpZ25vcmVkLmApLG59KSwodD0+dCkpfWZ1bmN0aW9uIEp3KHQpe09iamVjdC5mcmVlemUodCk7Y29uc3QgZT1Hdyh0KTtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkuZm9yRWFjaCgobj0+e2lmKCFuLnN0YXJ0c1dpdGgoIsm1IikmJihmdW5jdGlvbiBvKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfSkodCxuKSYmKCFlfHwiY2FsbGVyIiE9PW4mJiJjYWxsZWUiIT09biYmImFyZ3VtZW50cyIhPT1uKSl7Y29uc3QgZT10W25dOyFVdyhlKSYmIUd3KGUpfHxPYmplY3QuaXNGcm96ZW4oZSl8fEp3KGUpfX0pKSx0fWZ1bmN0aW9uIFF3KHQsZT1bXSl7cmV0dXJuKEJ3KHQpfHxWdyh0KSkmJjA9PT1lLmxlbmd0aD97cGF0aDpbInJvb3QiXSx2YWx1ZTp0fTpPYmplY3Qua2V5cyh0KS5yZWR1Y2UoKChuLG8pPT57aWYobilyZXR1cm4gbjtjb25zdCBpPXRbb107cmV0dXJuKGZ1bmN0aW9uIGEodCl7cmV0dXJuIEd3KHQpJiZ0Lmhhc093blByb3BlcnR5KCLJtWNtcCIpfSkoaSk/bjohKEJ3KGkpfHxWdyhpKXx8KGZ1bmN0aW9uIHIodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0fSkoaSl8fChmdW5jdGlvbiBzKHQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHR9KShpKXx8KGZ1bmN0aW9uIGwodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fSkoaSl8fGp3KGkpKSYmKChmdW5jdGlvbiBjKHQpe2lmKCEoZnVuY3Rpb24gZSh0KXtyZXR1cm4gVXcodCkmJiFqdyh0KX0pKHQpKXJldHVybiExO2NvbnN0IG49T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpO3JldHVybiBuPT09T2JqZWN0LnByb3RvdHlwZXx8bnVsbD09PW59KShpKT9RdyhpLFsuLi5lLG9dKTp7cGF0aDpbLi4uZSxvXSx2YWx1ZTppfSl9KSwhMSl9ZnVuY3Rpb24gJHcodCxlKXtpZighMT09PXQpcmV0dXJuO2NvbnN0IG49dC5wYXRoLmpvaW4oIi4iKSxvPW5ldyBFcnJvcihgRGV0ZWN0ZWQgdW5zZXJpYWxpemFibGUgJHtlfSBhdCAiJHtufSIuICR7THd9I3N0cmljdCR7ZX1zZXJpYWxpemFiaWxpdHlgKTt0aHJvdyBvLnZhbHVlPXQudmFsdWUsby51bnNlcmlhbGl6YWJsZVBhdGg9bixvfWZ1bmN0aW9uIHRrKHQpe3JldHVybiB5XygpP09iamVjdC5hc3NpZ24oe3N0cmljdFN0YXRlU2VyaWFsaXphYmlsaXR5OiExLHN0cmljdEFjdGlvblNlcmlhbGl6YWJpbGl0eTohMSxzdHJpY3RTdGF0ZUltbXV0YWJpbGl0eTohMCxzdHJpY3RBY3Rpb25JbW11dGFiaWxpdHk6ITAsc3RyaWN0QWN0aW9uV2l0aGluTmdab25lOiExLHN0cmljdEFjdGlvblR5cGVVbmlxdWVuZXNzOiExfSx0KTp7c3RyaWN0U3RhdGVTZXJpYWxpemFiaWxpdHk6ITEsc3RyaWN0QWN0aW9uU2VyaWFsaXphYmlsaXR5OiExLHN0cmljdFN0YXRlSW1tdXRhYmlsaXR5OiExLHN0cmljdEFjdGlvbkltbXV0YWJpbGl0eTohMSxzdHJpY3RBY3Rpb25XaXRoaW5OZ1pvbmU6ITEsc3RyaWN0QWN0aW9uVHlwZVVuaXF1ZW5lc3M6ITF9fWZ1bmN0aW9uIGVrKHtzdHJpY3RBY3Rpb25TZXJpYWxpemFiaWxpdHk6dCxzdHJpY3RTdGF0ZVNlcmlhbGl6YWJpbGl0eTplfSl7cmV0dXJuIG49PnR8fGU/KGZ1bmN0aW9uIG8odCxlKXtyZXR1cm4gZnVuY3Rpb24obixvKXtlLmFjdGlvbihvKSYmJHcoUXcobyksImFjdGlvbiIpO2NvbnN0IGk9dChuLG8pO3JldHVybiBlLnN0YXRlKCkmJiR3KFF3KGkpLCJzdGF0ZSIpLGl9fSkobix7YWN0aW9uOmU9PnQmJiFvayhlKSxzdGF0ZTooKT0+ZX0pOm59ZnVuY3Rpb24gbmsoe3N0cmljdEFjdGlvbkltbXV0YWJpbGl0eTp0LHN0cmljdFN0YXRlSW1tdXRhYmlsaXR5OmV9KXtyZXR1cm4gbj0+dHx8ZT8oZnVuY3Rpb24gbyh0LGUpe3JldHVybiBmdW5jdGlvbihuLG8pe2NvbnN0IGk9ZS5hY3Rpb24obyk/Sncobyk6byxhPXQobixpKTtyZXR1cm4gZS5zdGF0ZSgpP0p3KGEpOmF9fSkobix7YWN0aW9uOmU9PnQmJiFvayhlKSxzdGF0ZTooKT0+ZX0pOm59ZnVuY3Rpb24gb2sodCl7cmV0dXJuIHQudHlwZS5zdGFydHNXaXRoKCJAbmdyeCIpfWZ1bmN0aW9uIGlrKHtzdHJpY3RBY3Rpb25XaXRoaW5OZ1pvbmU6dH0pe3JldHVybiBlPT50PyhmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4sbyl7aWYoZS5hY3Rpb24obykmJiFhXy5pc0luQW5ndWxhclpvbmUoKSl0aHJvdyBuZXcgRXJyb3IoYEFjdGlvbiAnJHtvLnR5cGV9JyBydW5uaW5nIG91dHNpZGUgTmdab25lLiAke0x3fSNzdHJpY3RhY3Rpb253aXRoaW5uZ3pvbmVgKTtyZXR1cm4gdChuLG8pfX0pKGUse2FjdGlvbjplPT50JiYhb2soZSl9KTplfWZ1bmN0aW9uIGFrKCl7cmV0dXJuW3twcm92aWRlOnZ3LG11bHRpOiEwLGRlcHM6W013XSx1c2VGYWN0b3J5OnNrfV19ZnVuY3Rpb24gcmsodCl7cmV0dXJuIHR9ZnVuY3Rpb24gc2sodCl7aWYoIXQuc3RyaWN0QWN0aW9uVHlwZVVuaXF1ZW5lc3MpcmV0dXJuO2NvbnN0IGU9T2JqZWN0LmVudHJpZXMoS1ApLmZpbHRlcigoKFssdF0pPT50PjEpKS5tYXAoKChbdF0pPT50KSk7aWYoZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBBY3Rpb24gdHlwZXMgYXJlIHJlZ2lzdGVyZWQgbW9yZSB0aGFuIG9uY2UsICR7ZS5tYXAoKHQ9PmAiJHt0fSJgKSkuam9pbigiLCAiKX0uICR7THd9I3N0cmljdGFjdGlvbnR5cGV1bmlxdWVuZXNzYCl9Y2xhc3MgbGt7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEpe319bGsuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGxrKSh2cih0dyksdnIod3cpLHZyKEV3KSx2cihJdyksdnIobncsOCksdnIodncsOCkpfSxsay7JtW1vZD1hbyh7dHlwZTpsa30pLGxrLsm1aW5qPXZuKHt9KSxsay5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnR3fSx7dHlwZTp3d30se3R5cGU6RXd9LHt0eXBlOkl3fSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W253XX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3Z3XX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChsayxbe3R5cGU6QXksYXJnczpbe31dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnR3fSx7dHlwZTp3d30se3R5cGU6RXd9LHt0eXBlOkl3fSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W253XX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3Z3XX1dfV19KSxudWxsKTtjbGFzcyBja3tjb25zdHJ1Y3Rvcih0LGUsbixvLGkpe3RoaXMuZmVhdHVyZXM9dCx0aGlzLmZlYXR1cmVSZWR1Y2Vycz1lLHRoaXMucmVkdWNlck1hbmFnZXI9bjtjb25zdCBhPXQubWFwKCgodCxuKT0+e2NvbnN0IG89ZS5zaGlmdCgpW25dO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3JlZHVjZXJzOm8saW5pdGlhbFN0YXRlOmZrKHQuaW5pdGlhbFN0YXRlKX0pfSkpO24uYWRkRmVhdHVyZXMoYSl9bmdPbkRlc3Ryb3koKXt0aGlzLnJlZHVjZXJNYW5hZ2VyLnJlbW92ZUZlYXR1cmVzKHRoaXMuZmVhdHVyZXMpfX1jay7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8Y2spKHZyKHV3KSx2cihndyksdnIoU3cpLHZyKGxrKSx2cih2dyw4KSl9LGNrLsm1bW9kPWFvKHt0eXBlOmNrfSksY2suybVpbmo9dm4oe30pLGNrLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbdXddfV19LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W2d3XX1dfSx7dHlwZTpTd30se3R5cGU6bGt9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbdnddfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGNrLFt7dHlwZTpBeSxhcmdzOlt7fV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbdXddfV19LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W2d3XX1dfSx7dHlwZTpTd30se3R5cGU6bGt9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbdnddfV19XX0pLG51bGwpO2NsYXNzIGRre3N0YXRpYyBmb3JSb290KHQsZT17fSl7cmV0dXJue25nTW9kdWxlOmxrLHByb3ZpZGVyczpbe3Byb3ZpZGU6bncsdXNlRmFjdG9yeTpoayxkZXBzOltbSXcsbmV3IFNyLG5ldyBFcl1dfSx7cHJvdmlkZTpvdyx1c2VWYWx1ZTplLmluaXRpYWxTdGF0ZX0se3Byb3ZpZGU6aXcsdXNlRmFjdG9yeTpmayxkZXBzOltvd119LHtwcm92aWRlOmx3LHVzZVZhbHVlOnR9LHtwcm92aWRlOmR3LHVzZUV4aXN0aW5nOnQgaW5zdGFuY2VvZiBHYT90Omx3fSx7cHJvdmlkZTpzdyxkZXBzOltycCxsdyxbbmV3IGtyKGR3KV1dLHVzZUZhY3Rvcnk6cGt9LHtwcm92aWRlOmh3LHVzZVZhbHVlOmUubWV0YVJlZHVjZXJzP2UubWV0YVJlZHVjZXJzOltdfSx7cHJvdmlkZTp5dyxkZXBzOltidyxod10sdXNlRmFjdG9yeTpna30se3Byb3ZpZGU6cncsdXNlVmFsdWU6ZS5yZWR1Y2VyRmFjdG9yeT9lLnJlZHVjZXJGYWN0b3J5Onh3fSx7cHJvdmlkZTphdyxkZXBzOltydyx5d10sdXNlRmFjdG9yeTpQd30sZXcsRHcsUncsencsSHcsKG49ZS5ydW50aW1lQ2hlY2tzLFt7cHJvdmlkZTpDdyx1c2VWYWx1ZTpufSx7cHJvdmlkZTpfdyx1c2VGYWN0b3J5OnJrLGRlcHM6W0N3XX0se3Byb3ZpZGU6TXcsZGVwczpbX3ddLHVzZUZhY3Rvcnk6dGt9LHtwcm92aWRlOmJ3LG11bHRpOiEwLGRlcHM6W013XSx1c2VGYWN0b3J5Om5rfSx7cHJvdmlkZTpidyxtdWx0aTohMCxkZXBzOltNd10sdXNlRmFjdG9yeTpla30se3Byb3ZpZGU6YncsbXVsdGk6ITAsZGVwczpbTXddLHVzZUZhY3Rvcnk6aWt9XSksYWsoKV19O3ZhciBufXN0YXRpYyBmb3JGZWF0dXJlKHQsZSxuPXt9KXtyZXR1cm57bmdNb2R1bGU6Y2sscHJvdmlkZXJzOlt7cHJvdmlkZTptdyxtdWx0aTohMCx1c2VWYWx1ZTp0IGluc3RhbmNlb2YgT2JqZWN0P3t9Om59LHtwcm92aWRlOmN3LG11bHRpOiEwLHVzZVZhbHVlOntrZXk6dCBpbnN0YW5jZW9mIE9iamVjdD90Lm5hbWU6dCxyZWR1Y2VyRmFjdG9yeTpuIGluc3RhbmNlb2YgR2F8fCFuLnJlZHVjZXJGYWN0b3J5P3h3Om4ucmVkdWNlckZhY3RvcnksbWV0YVJlZHVjZXJzOm4gaW5zdGFuY2VvZiBHYXx8IW4ubWV0YVJlZHVjZXJzP1tdOm4ubWV0YVJlZHVjZXJzLGluaXRpYWxTdGF0ZTpuIGluc3RhbmNlb2YgR2F8fCFuLmluaXRpYWxTdGF0ZT92b2lkIDA6bi5pbml0aWFsU3RhdGV9fSx7cHJvdmlkZTp1dyxkZXBzOltycCxtdyxjd10sdXNlRmFjdG9yeTpta30se3Byb3ZpZGU6cHcsbXVsdGk6ITAsdXNlVmFsdWU6dCBpbnN0YW5jZW9mIE9iamVjdD90LnJlZHVjZXI6ZX0se3Byb3ZpZGU6ZncsbXVsdGk6ITAsdXNlRXhpc3Rpbmc6ZSBpbnN0YW5jZW9mIEdhP2U6cHd9LHtwcm92aWRlOmd3LG11bHRpOiEwLGRlcHM6W3JwLHB3LFtuZXcga3IoZncpXV0sdXNlRmFjdG9yeTp1a30sYWsoKV19fX1mdW5jdGlvbiBwayh0LGUpe3JldHVybiBlIGluc3RhbmNlb2YgR2E/dC5nZXQoZSk6ZX1mdW5jdGlvbiBtayh0LGUsbil7cmV0dXJuIG4ubWFwKCgobixvKT0+e2lmKGVbb11pbnN0YW5jZW9mIEdhKXtjb25zdCBpPXQuZ2V0KGVbb10pO3JldHVybntrZXk6bi5rZXkscmVkdWNlckZhY3Rvcnk6aS5yZWR1Y2VyRmFjdG9yeT9pLnJlZHVjZXJGYWN0b3J5Onh3LG1ldGFSZWR1Y2VyczppLm1ldGFSZWR1Y2Vycz9pLm1ldGFSZWR1Y2VyczpbXSxpbml0aWFsU3RhdGU6aS5pbml0aWFsU3RhdGV9fXJldHVybiBufSkpfWZ1bmN0aW9uIHVrKHQsZSl7cmV0dXJuIGUubWFwKChlPT5lIGluc3RhbmNlb2YgR2E/dC5nZXQoZSk6ZSkpfWZ1bmN0aW9uIGZrKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3QoKTp0fWZ1bmN0aW9uIGdrKHQsZSl7cmV0dXJuIHQuY29uY2F0KGUpfWZ1bmN0aW9uIGhrKHQpe2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3RvcmVNb2R1bGUuZm9yUm9vdCgpIGNhbGxlZCB0d2ljZS4gRmVhdHVyZSBtb2R1bGVzIHNob3VsZCB1c2UgU3RvcmVNb2R1bGUuZm9yRmVhdHVyZSgpIGluc3RlYWQuIik7cmV0dXJuImd1YXJkZWQifWZ1bmN0aW9uIGJrKC4uLnQpe3JldHVybntyZWR1Y2VyOnQucG9wKCksdHlwZXM6dC5tYXAoKHQ9PnQudHlwZSkpfX1mdW5jdGlvbiB5ayh0LC4uLmUpe2NvbnN0IG49bmV3IE1hcDtmb3IoY29uc3QgdCBvZiBlKWZvcihjb25zdCBlIG9mIHQudHlwZXMpe2NvbnN0IG89bi5nZXQoZSk7bi5zZXQoZSxvPyhlLG4pPT50LnJlZHVjZXIobyhlLG4pLG4pOnQucmVkdWNlcil9cmV0dXJuIGZ1bmN0aW9uKGU9dCxvKXtjb25zdCBpPW4uZ2V0KG8udHlwZSk7cmV0dXJuIGk/aShlLG8pOmV9fWRrLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxkayl9LGRrLsm1bW9kPWFvKHt0eXBlOmRrfSksZGsuybVpbmo9dm4oe30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZGssW3t0eXBlOkF5LGFyZ3M6W3t9XX1dLG51bGwsbnVsbCk7Y29uc3QgX2s9e2Rpc3BhdGNoOiEwLHVzZUVmZmVjdHNFcnJvckhhbmRsZXI6ITB9LENrPSJfX0BuZ3J4L2VmZmVjdHNfY3JlYXRlX18iO2Z1bmN0aW9uIE1rKHQsZSl7Y29uc3Qgbj10KCksbz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sX2spLGUpO3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkobixDayx7dmFsdWU6b30pLG59ZnVuY3Rpb24gdmsodCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpLmZpbHRlcigoZT0+ISghdFtlXXx8IXRbZV0uaGFzT3duUHJvcGVydHkoQ2spKSYmdFtlXVtDa10uaGFzT3duUHJvcGVydHkoImRpc3BhdGNoIikpKS5tYXAoKGU9Pk9iamVjdC5hc3NpZ24oe3Byb3BlcnR5TmFtZTplfSx0W2VdW0NrXSkpKX1mdW5jdGlvbiB4ayh0KXtyZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfWNvbnN0IE9rPSJfX0BuZ3J4L2VmZmVjdHNfXyI7ZnVuY3Rpb24gUGsodCl7cmV0dXJuIE93KHdrLHhrKSh0KX1mdW5jdGlvbiB3ayh0KXtyZXR1cm4oZnVuY3Rpb24gZSh0KXtyZXR1cm4gdC5jb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShPayl9KSh0KT90LmNvbnN0cnVjdG9yW09rXTpbXX1mdW5jdGlvbiBrayh0LGUsbj0xMCl7cmV0dXJuIHQucGlwZShwZSgobz0+KGUmJmUuaGFuZGxlRXJyb3Iobyksbjw9MT90OmtrKHQsZSxuLTEpKSkpKX1jbGFzcyBTayBleHRlbmRzIER7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0JiYodGhpcy5zb3VyY2U9dCl9bGlmdCh0KXtjb25zdCBlPW5ldyBTaztyZXR1cm4gZS5zb3VyY2U9dGhpcyxlLm9wZXJhdG9yPXQsZX19ZnVuY3Rpb24gRGsoLi4udCl7cmV0dXJuIGNlKChlPT50LnNvbWUoKHQ9PiJzdHJpbmciPT10eXBlb2YgdD90PT09ZS50eXBlOnQudHlwZT09PWUudHlwZSkpKSl9ZnVuY3Rpb24gRWsodCl7cmV0dXJuIFJrKHQsIm5ncnhPbkluaXRFZmZlY3RzIil9ZnVuY3Rpb24gUmsodCxlKXtyZXR1cm4gdCYmZSBpbiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdFtlXX1Tay7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8U2spKHZyKEV3KSl9LFNrLsm1cHJvdj1Nbih7dG9rZW46U2ssZmFjdG9yeTpTay7JtWZhY30pLFNrLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6RCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltFd119XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoU2ssW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkQsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbRXddfV19XX0pLG51bGwpO2NvbnN0IEFrPW5ldyBHYSgiQG5ncngvZWZmZWN0cyBJbnRlcm5hbCBSb290IEd1YXJkIiksVGs9bmV3IEdhKCJAbmdyeC9lZmZlY3RzIFVzZXIgUHJvdmlkZWQgRWZmZWN0cyIpLE5rPW5ldyBHYSgiQG5ncngvZWZmZWN0cyBJbnRlcm5hbCBSb290IEVmZmVjdHMiKSx6az1uZXcgR2EoIkBuZ3J4L2VmZmVjdHMgUm9vdCBFZmZlY3RzIiksSWs9bmV3IEdhKCJAbmdyeC9lZmZlY3RzIEludGVybmFsIEZlYXR1cmUgRWZmZWN0cyIpLEhrPW5ldyBHYSgiQG5ncngvZWZmZWN0cyBGZWF0dXJlIEVmZmVjdHMiKSxGaz1uZXcgR2EoIkBuZ3J4L2VmZmVjdHMgRWZmZWN0cyBFcnJvciBIYW5kbGVyIik7Y2xhc3MgTGsgZXh0ZW5kcyBJe2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoKSx0aGlzLmVycm9ySGFuZGxlcj10LHRoaXMuZWZmZWN0c0Vycm9ySGFuZGxlcj1lfWFkZEVmZmVjdHModCl7dGhpcy5uZXh0KHQpfXRvQWN0aW9ucygpe3JldHVybiB0aGlzLnBpcGUod2UoeGspLFp0KCh0PT50LnBpcGUod2UoQmspKSkpLFp0KCh0PT5yZSh0LnBpcGUoUGUoKHQ9PihmdW5jdGlvbiBlKHQsbil7cmV0dXJuIGU9Pntjb25zdCBvPShmdW5jdGlvbiBpKHQsZSxuKXtjb25zdCBvPXhrKHQpLmNvbnN0cnVjdG9yLm5hbWU7cmV0dXJuIHJlKC4uLihmdW5jdGlvbiBpKHQpe3JldHVybltQayx2a10ucmVkdWNlKCgoZSxuKT0+ZS5jb25jYXQobih0KSkpLFtdKX0pKHQpLm1hcCgoKHtwcm9wZXJ0eU5hbWU6aSxkaXNwYXRjaDphLHVzZUVmZmVjdHNFcnJvckhhbmRsZXI6cn0pPT57Y29uc3Qgcz0iZnVuY3Rpb24iPT10eXBlb2YgdFtpXT90W2ldKCk6dFtpXSxsPXI/bihzLGUpOnM7cmV0dXJuITE9PT1hP2wucGlwZSh5ZSgpKTpsLnBpcGUoKGZ1bmN0aW9uIGMoKXtyZXR1cm4gUigoZnVuY3Rpb24odCxlKXt0LnN1YnNjcmliZShuZXcgVChlLChmdW5jdGlvbih0KXtlLm5leHQoQXQuY3JlYXRlTmV4dCh0KSl9KSwoZnVuY3Rpb24oKXtlLm5leHQoQXQuY3JlYXRlQ29tcGxldGUoKSksZS5jb21wbGV0ZSgpfSksKGZ1bmN0aW9uKHQpe2UubmV4dChBdC5jcmVhdGVFcnJvcih0KSksZS5jb21wbGV0ZSgpfSkpKX0pKX0pKCkpLnBpcGUoSXQoKGU9Pih7ZWZmZWN0OnRbaV0sbm90aWZpY2F0aW9uOmUscHJvcGVydHlOYW1lOmksc291cmNlTmFtZTpvLHNvdXJjZUluc3RhbmNlOnR9KSkpKX0pKSl9KShlLHQsbik7cmV0dXJuKGZ1bmN0aW9uIGEodCl7cmV0dXJuIFJrKHQsIm5ncnhPblJ1bkVmZmVjdHMiKX0pKGUpP2UubmdyeE9uUnVuRWZmZWN0cyhvKTpvfX0pKHRoaXMuZXJyb3JIYW5kbGVyLHRoaXMuZWZmZWN0c0Vycm9ySGFuZGxlcikodCkpKSxJdCgodD0+KChmdW5jdGlvbiBlKHQsbil7aWYoIk4iPT09dC5ub3RpZmljYXRpb24ua2luZCl7Y29uc3QgZT10Lm5vdGlmaWNhdGlvbi52YWx1ZTshKGZ1bmN0aW9uIG8odCl7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJnQmJnQudHlwZSYmInN0cmluZyI9PXR5cGVvZiB0LnR5cGV9KShlKSYmbi5oYW5kbGVFcnJvcihuZXcgRXJyb3IoYEVmZmVjdCAkeyhmdW5jdGlvbiBpKHtwcm9wZXJ0eU5hbWU6dCxzb3VyY2VJbnN0YW5jZTplLHNvdXJjZU5hbWU6bn0pe2NvbnN0IG89ImZ1bmN0aW9uIj09dHlwZW9mIGVbdF07cmV0dXJuYCIke259LiR7U3RyaW5nKHQpfSR7bz8iKCkiOiIifSJgfSkodCl9IGRpc3BhdGNoZWQgYW4gaW52YWxpZCBhY3Rpb246ICR7KGZ1bmN0aW9uIGEodCl7dHJ5e3JldHVybiBKU09OLnN0cmluZ2lmeSh0KX1jYXRjaChlKXtyZXR1cm4gdH19KShlKX1gKSl9fSkodCx0aGlzLmVycm9ySGFuZGxlciksdC5ub3RpZmljYXRpb24pKSksY2UoKHQ9PiJOIj09PXQua2luZCYmbnVsbCE9dC52YWx1ZSkpLChmdW5jdGlvbiBlKCl7cmV0dXJuIFIoKGZ1bmN0aW9uKHQsZSl7dC5zdWJzY3JpYmUobmV3IFQoZSwoZnVuY3Rpb24odCl7cmV0dXJuIFR0KHQsZSl9KSkpfSkpfSkoKSksdC5waXBlKGJlKDEpLGNlKEVrKSxJdCgodD0+dC5uZ3J4T25Jbml0RWZmZWN0cygpKSkpKSkpKX19ZnVuY3Rpb24gQmsodCl7cmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJuIFJrKHQsIm5ncnhPbklkZW50aWZ5RWZmZWN0cyIpfSkodCk/dC5uZ3J4T25JZGVudGlmeUVmZmVjdHMoKToiIn1May7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8TGspKHZyKFpzKSx2cihGaykpfSxMay7JtXByb3Y9TW4oe3Rva2VuOkxrLGZhY3Rvcnk6TGsuybVmYWN9KSxMay5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlpzfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbRmtdfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKExrLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpac30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W0ZrXX1dfV19KSxudWxsKTtjbGFzcyBWa3tjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuZWZmZWN0U291cmNlcz10LHRoaXMuc3RvcmU9ZSx0aGlzLmVmZmVjdHNTdWJzY3JpcHRpb249bnVsbH1zdGFydCgpe3RoaXMuZWZmZWN0c1N1YnNjcmlwdGlvbnx8KHRoaXMuZWZmZWN0c1N1YnNjcmlwdGlvbj10aGlzLmVmZmVjdFNvdXJjZXMudG9BY3Rpb25zKCkuc3Vic2NyaWJlKHRoaXMuc3RvcmUpKX1uZ09uRGVzdHJveSgpe3RoaXMuZWZmZWN0c1N1YnNjcmlwdGlvbiYmKHRoaXMuZWZmZWN0c1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuZWZmZWN0c1N1YnNjcmlwdGlvbj1udWxsKX19VmsuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFZrKSh2cihMayksdnIoSXcpKX0sVmsuybVwcm92PU1uKHt0b2tlbjpWayxmYWN0b3J5OlZrLsm1ZmFjfSksVmsuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpMa30se3R5cGU6SXd9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFZrLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpMa30se3R5cGU6SXd9XX0pLG51bGwpO2NvbnN0IGprPSJAbmdyeC9lZmZlY3RzL2luaXQiO0pQKGprKTtjbGFzcyBVa3tjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyKXt0aGlzLnNvdXJjZXM9dCxlLnN0YXJ0KCksby5mb3JFYWNoKChlPT50LmFkZEVmZmVjdHMoZSkpKSxuLmRpc3BhdGNoKHt0eXBlOmprfSl9YWRkRWZmZWN0cyh0KXt0aGlzLnNvdXJjZXMuYWRkRWZmZWN0cyh0KX19VWsuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFVrKSh2cihMayksdnIoVmspLHZyKEl3KSx2cih6ayksdnIobGssOCksdnIoY2ssOCksdnIoQWssOCkpfSxVay7JtW1vZD1hbyh7dHlwZTpVa30pLFVrLsm1aW5qPXZuKHt9KSxVay5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOkxrfSx7dHlwZTpWa30se3R5cGU6SXd9LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3prXX1dfSx7dHlwZTpsayxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpjayxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W0FrXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChVayxbe3R5cGU6QXksYXJnczpbe31dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkxrfSx7dHlwZTpWa30se3R5cGU6SXd9LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3prXX1dfSx7dHlwZTpsayxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpjayxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W0FrXX1dfV19KSxudWxsKTtjbGFzcyBHa3tjb25zdHJ1Y3Rvcih0LGUsbixvKXtlLmZvckVhY2goKGU9PmUuZm9yRWFjaCgoZT0+dC5hZGRFZmZlY3RzKGUpKSkpKX19R2suybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEdrKSh2cihVayksdnIoSGspLHZyKGxrLDgpLHZyKGNrLDgpKX0sR2suybVtb2Q9YW8oe3R5cGU6R2t9KSxHay7JtWluaj12bih7fSksR2suY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpVa30se3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbSGtdfV19LHt0eXBlOmxrLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOmNrLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEdrLFt7dHlwZTpBeSxhcmdzOlt7fV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6VWt9LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W0hrXX1dfSx7dHlwZTpsayxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpjayxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfV19KSxudWxsKTtjbGFzcyBXa3tzdGF0aWMgZm9yRmVhdHVyZSh0PVtdKXtyZXR1cm57bmdNb2R1bGU6R2sscHJvdmlkZXJzOlt0LHtwcm92aWRlOklrLG11bHRpOiEwLHVzZVZhbHVlOnR9LHtwcm92aWRlOlRrLG11bHRpOiEwLHVzZVZhbHVlOltdfSx7cHJvdmlkZTpIayxtdWx0aTohMCx1c2VGYWN0b3J5OllrLGRlcHM6W3JwLElrLFRrXX1dfX1zdGF0aWMgZm9yUm9vdCh0PVtdKXtyZXR1cm57bmdNb2R1bGU6VWsscHJvdmlkZXJzOlt7cHJvdmlkZTpGayx1c2VWYWx1ZTpra30sVmssTGssU2ssdCx7cHJvdmlkZTpOayx1c2VWYWx1ZTpbdF19LHtwcm92aWRlOkFrLHVzZUZhY3Rvcnk6cWssZGVwczpbW1ZrLG5ldyBTcixuZXcgRXJdLFtOayxuZXcgRHJdXX0se3Byb3ZpZGU6VGssbXVsdGk6ITAsdXNlVmFsdWU6W119LHtwcm92aWRlOnprLHVzZUZhY3Rvcnk6WWssZGVwczpbcnAsTmssVGtdfV19fX1mdW5jdGlvbiBZayh0LGUsbil7Y29uc3Qgbz1bXTtmb3IoY29uc3QgdCBvZiBlKW8ucHVzaCguLi50KTtmb3IoY29uc3QgdCBvZiBuKW8ucHVzaCguLi50KTtyZXR1cm4oZnVuY3Rpb24gaSh0LGUpe3JldHVybiBlLm1hcCgoZT0+dC5nZXQoZSkpKX0pKHQsbyl9ZnVuY3Rpb24gcWsodCxlKXtpZigoMSE9PWUubGVuZ3RofHwwIT09ZVswXS5sZW5ndGgpJiZ0KXRocm93IG5ldyBUeXBlRXJyb3IoIkVmZmVjdHNNb2R1bGUuZm9yUm9vdCgpIGNhbGxlZCB0d2ljZS4gRmVhdHVyZSBtb2R1bGVzIHNob3VsZCB1c2UgRWZmZWN0c01vZHVsZS5mb3JGZWF0dXJlKCkgaW5zdGVhZC4iKTtyZXR1cm4iZ3VhcmRlZCJ9dmFyIFprO1drLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxXayl9LFdrLsm1bW9kPWFvKHt0eXBlOldrfSksV2suybVpbmo9dm4oe30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoV2ssW3t0eXBlOkF5LGFyZ3M6W3t9XX1dLG51bGwsbnVsbCksKGZ1bmN0aW9uKHQpe3RbdC5VTktOT1dOPTBdPSJVTktOT1dOIix0W3QuRVhQRVJJTUVOVFM9MV09IkVYUEVSSU1FTlRTIix0W3QuRVhQRVJJTUVOVD0yXT0iRVhQRVJJTUVOVCIsdFt0LkNPTVBBUkVfRVhQRVJJTUVOVD0zXT0iQ09NUEFSRV9FWFBFUklNRU5UIix0W3QuTk9UX1NFVD00XT0iTk9UX1NFVCJ9KShaa3x8KFprPXt9KSk7Y29uc3QgWGs9ImRlZmF1bHRFeHBlcmltZW50SWQiO2Z1bmN0aW9uIEtrKHQpe3JldHVybiB0LnNwbGl0KCIsIikubWFwKCh0PT57Y29uc3QgZT10LmluZGV4T2YoIjoiKTtpZihlPDApdGhyb3cgbmV3IEVycm9yKGBFeHBlY3QgY29sb24gZGVsaW1pdGluZyBuYW1lIGFuZCBJRDogJHt0fWApO2NvbnN0IG49dC5zbGljZSgwLGUpLG89dC5zbGljZShlKzEpO2lmKCFvKXRocm93IG5ldyBFcnJvcihgRXhwZWN0IGlkIHRvIGJlIG5vbi1mYWxzeTogJHt0fWApO3JldHVybntuYW1lOm4saWQ6b319KSl9ZnVuY3Rpb24gSmsodCxlKXtzd2l0Y2godCl7Y2FzZSBaay5FWFBFUklNRU5UOnJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwiZXhwZXJpbWVudElkIik/W2UuZXhwZXJpbWVudElkXTpbWGtdO2Nhc2UgWmsuQ09NUEFSRV9FWFBFUklNRU5UOnJldHVybiBLayhlLmV4cGVyaW1lbnRJZHMpLm1hcCgoKHtpZDp0fSk9PnQpKTtjYXNlIFprLkVYUEVSSU1FTlRTOmRlZmF1bHQ6cmV0dXJuIG51bGx9fWZ1bmN0aW9uIFFrKHQsZSl7dmFyIG47c3dpdGNoKHQpe2Nhc2UgWmsuQ09NUEFSRV9FWFBFUklNRU5UOmNhc2UgWmsuRVhQRVJJTUVOVDp7Y29uc3Qgbz1udWxsIT09KG49SmsodCxlKSkmJnZvaWQgMCE9PW4/bjpbXTtyZXR1cm4gby5zb3J0KCksYCR7dH0vJHtvLmpvaW4oIiwiKX1gfWNhc2UgWmsuRVhQRVJJTUVOVFM6cmV0dXJuIFN0cmluZyh0KTtjYXNlIFprLk5PVF9TRVQ6cmV0dXJuIl9fbm90X3NldCI7ZGVmYXVsdDpyZXR1cm4iIn19Y29uc3QgJGs9KCk9PndpbmRvdy5sb2NhdGlvbi5ocmVmO2NsYXNzIHRTe2dldEhyZWYoKXtyZXR1cm4gJGsoKX1nZXRTZWFyY2goKXtjb25zdCB0PW5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCksZT1bXTtyZXR1cm4gdC5mb3JFYWNoKCgodCxuKT0+e2UucHVzaCh7a2V5Om4sdmFsdWU6dH0pfSkpLGV9Z2V0SGFzaCgpe3JldHVybiB3aW5kb3cubG9jYXRpb24uaGFzaH1nZXRQYXRoKCl7cmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZX1yZXBsYWNlU3RhdGUodCl7d2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIiIsdCl9cHVzaFN0YXRlKHQpe3dpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShudWxsLCIiLHQpfW9uUG9wU3RhdGUoKXtyZXR1cm4gb2Uod2luZG93LCJwb3BzdGF0ZSIpLnBpcGUoSXQoKCgpPT4oe3BhdGhuYW1lOnRoaXMuZ2V0UGF0aCgpLHF1ZXJ5UGFyYW1zOnRoaXMuZ2V0U2VhcmNoKCl9KSkpKX1nZXRSZXNvbHZlZFBhdGgodCl7cmV0dXJuIG5ldyBVUkwodCwkaygpKS5wYXRobmFtZX1nZXRGdWxsUGF0aEZyb21Sb3V0ZU9yTmF2KHQsZSl7Y29uc3Qgbj10aGlzLmdldFJlc29sdmVkUGF0aCh0LnBhdGhuYW1lKTtsZXQgbz0iIjtyZXR1cm4hKGZ1bmN0aW9uIGkodCl7cmV0dXJuIHQuaGFzT3duUHJvcGVydHkoInBhdGhuYW1lIikmJiF0Lmhhc093blByb3BlcnR5KCJxdWVyeVBhcmFtcyIpfSkodCkmJnQucXVlcnlQYXJhbXMubGVuZ3RoJiYobz0iPyIrKGZ1bmN0aW9uIGEodCl7Y29uc3QgZT1uZXcgVVJMU2VhcmNoUGFyYW1zO2Zvcihjb25zdHtrZXk6bix2YWx1ZTpvfW9mIHQpZS5hcHBlbmQobixvKTtyZXR1cm4gZX0pKHQucXVlcnlQYXJhbXMpLnRvU3RyaW5nKCkpLGAke259JHtvfSR7ZT90aGlzLmdldEhhc2goKToiIn1gfX10Uy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8dFMpfSx0Uy7JtXByb3Y9TW4oe3Rva2VuOnRTLGZhY3Rvcnk6dFMuybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHRTLFt7dHlwZTppbX1dLG51bGwsbnVsbCk7Y2xhc3MgZVN7Y29uc3RydWN0b3IodCl7dGhpcy5hcHBSb290PXRoaXMuZ2V0QXBwUm9vdEZyb21NZXRhRWxlbWVudCh0KX1nZXRBcHBSb290RnJvbU1ldGFFbGVtZW50KHQpe2NvbnN0IGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZCBtZXRhW25hbWU9InRiLXJlbGF0aXZlLXJvb3QiXScpO2lmKCFlKXJldHVybiIvIjtjb25zdHtwYXRobmFtZTpufT1uZXcgVVJMKGUuY29udGVudCx0LmdldEhyZWYoKSk7cmV0dXJuIG4ucmVwbGFjZSgvXC8qJC8sIi8iKX1nZXRBYnNQYXRobmFtZVdpdGhBcHBSb290KHQpe3JldHVybiB0aGlzLmFwcFJvb3Quc2xpY2UoMCwtMSkrdH1nZXRBcHBSb290bGVzc1BhdGhuYW1lKHQpe3JldHVybiB0LnN0YXJ0c1dpdGgodGhpcy5hcHBSb290KT8iLyIrdC5zbGljZSh0aGlzLmFwcFJvb3QubGVuZ3RoKTp0fX1lUy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8ZVMpKHZyKHRTKSl9LGVTLsm1cHJvdj1Nbih7dG9rZW46ZVMsZmFjdG9yeTplUy7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZVMsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnRTfV19KSxudWxsKTtjbGFzcyBuUyBleHRlbmRzIGVTe2dldEFwcFJvb3QoKXtyZXR1cm4gdGhpcy5hcHBSb290fXNldEFwcFJvb3QodCl7dGhpcy5hcHBSb290PXR9fW5TLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYShuUykpKShufHxuUyl9fSkoKSxuUy7JtXByb3Y9TW4oe3Rva2VuOm5TLGZhY3Rvcnk6blMuybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKG5TLFt7dHlwZTppbX1dLG51bGwsbnVsbCk7Y2xhc3Mgb1N7fW9TLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxvUyl9LG9TLsm1bW9kPWFvKHt0eXBlOm9TfSksb1MuybVpbmo9dm4oe3Byb3ZpZGVyczpbdFNdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChvUyxbe3R5cGU6QXksYXJnczpbe3Byb3ZpZGVyczpbdFNdfV19XSxudWxsLG51bGwpO2NsYXNzIGlTe31pUy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8aVMpfSxpUy7JtW1vZD1hbyh7dHlwZTppU30pLGlTLsm1aW5qPXZuKHtwcm92aWRlcnM6W2VTXSxpbXBvcnRzOltbb1NdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoaVMsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltvU10scHJvdmlkZXJzOltlU119XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhpUyx7aW1wb3J0czpbb1NdfSk7Y29uc3QgYVM9SlAoIltBcHAgUm91dGluZ10gRGlzY2FyZGluZyBVbnNhdmVkIFVwZGF0ZXMiKSxyUz1KUCgiW0FwcCBSb3V0aW5nXSBTdGF0ZSBSZWh5ZHJhdGVkIEZyb20gVXJsIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksc1M9SlAoIltBcHAgUm91dGluZ10gUm91dGUgQ29uZmlnIExvYWRlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLGxTPUpQKCJbQXBwIFJvdXRpbmddIEluIEFwcCBOYXZpZ2F0aW9uIFJlcXVlc3RlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLGNTPUpQKCJbQXBwIFJvdXRpbmddIEluIEFwcCBOYXZpZ2F0aW5nIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksZFM9SlAoIltBcHAgUm91dGluZ10gSW4gQXBwIE5hdmlnYXRlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLHBTPW5ldyBHYSgiW0FwcCBSb3V0aW5nXSBEaXJ0eSBVcGRhdGVzIik7Y2xhc3MgbVN7Y29uc3RydWN0b3IodCl7dGhpcy5kaXJ0eVVwZGF0ZXNTZWxlY3RvckZhY3Rvcmllcz10fWdldERpcnR5VXBkYXRlc1NlbGVjdG9ycygpe3ZhciB0O3JldHVybiBudWxsIT09KHQ9dGhpcy5kaXJ0eVVwZGF0ZXNTZWxlY3RvckZhY3RvcmllcykmJnZvaWQgMCE9PXQ/dDpbXX1zdGF0aWMgcmVnaXN0ZXJEaXJ0eVVwZGF0ZXModCl7cmV0dXJue25nTW9kdWxlOm1TLHByb3ZpZGVyczpbe3Byb3ZpZGU6cFMsbXVsdGk6ITAsdXNlRmFjdG9yeTp0fV19fX1tUy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bVMpKHZyKHBTLDgpKX0sbVMuybVtb2Q9YW8oe3R5cGU6bVN9KSxtUy7JtWluaj12bih7fSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChtUyxbe3R5cGU6QXl9XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3BTXX1dfV19KSxudWxsKTtjb25zdCB1Uz1uZXcgR2EoIltBcHAgUm91dGluZ10gUHJvZ3JhbW1hdGljYWwgTmF2aWdhdGlvbiBQcm92aWRlciIpO2NsYXNzIGZTe2NvbnN0cnVjdG9yKHQpe3RoaXMucHJvdmlkZXJzPW5ldyBNYXA7Zm9yKGNvbnN0IGUgb2YgdHx8W10pe2lmKHRoaXMucHJvdmlkZXJzLmhhcyhlLmFjdGlvbkNyZWF0b3IudHlwZSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYCIke2UuYWN0aW9uQ3JlYXRvci50eXBlfSIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciBuYXYuIE11bHRpcGxlIG5hdmlnYXRpb25zIG9uIHNhbWUga2ljayBpcyBub3QgYWxsb3dlZC5gKTt0aGlzLnByb3ZpZGVycy5zZXQoZS5hY3Rpb25DcmVhdG9yLnR5cGUsZS5sYW1iZGEpfX1nZXROYXZpZ2F0aW9uKHQpe2NvbnN0IGU9dGhpcy5wcm92aWRlcnMuZ2V0KHQudHlwZSk7cmV0dXJuIGU/ZSh0KTpudWxsfXN0YXRpYyByZWdpc3RlclByb2dyYW1tYXRpY2FsTmF2aWdhdGlvbih0KXtyZXR1cm57bmdNb2R1bGU6ZlMscHJvdmlkZXJzOlt7cHJvdmlkZTp1UyxtdWx0aTohMCx1c2VGYWN0b3J5OnR9XX19fWZ1bmN0aW9uIGdTKHQpe3JldHVybiBudWxsIT10LnJvdXRlS2luZH1mdW5jdGlvbiBoUyh0KXtyZXR1cm4gdlModCkubWFwKCh0PT57Y29uc3QgZT10LnN0YXJ0c1dpdGgoIjoiKTtyZXR1cm4gZT97cGF0aFBhcnQ6dCxpc1BhcmFtOiEwLHBhcmFtTmFtZTp0LnNsaWNlKDEpfTp7cGF0aFBhcnQ6dCxpc1BhcmFtOmV9fSkpfWZTLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxmUykodnIodVMsOCkpfSxmUy7JtW1vZD1hbyh7dHlwZTpmU30pLGZTLsm1aW5qPXZuKHt9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGZTLFt7dHlwZTpBeSxhcmdzOlt7fV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOlt1U119XX1dfSksbnVsbCk7Y2xhc3MgYlN7Y29uc3RydWN0b3IodCl7dGhpcy52YWxpZGF0ZUNvbmZpZyh0KSx0aGlzLnBhdGhGcmFnbWVudHM9aFModC5wYXRoKSx0aGlzLnBhdGhNYXRjaGVycz10aGlzLmdldFBhdGhNYXRjaGVycyh0aGlzLnBhdGhGcmFnbWVudHMpfXN0YXRpYyBnZXRNYXRjaGVyKHQpe3JldHVybiBnUyh0KT9uZXcgeVModCk6KGZ1bmN0aW9uIGUodCl7cmV0dXJuIHZvaWQgMCE9PXQucmVkaXJlY3Rpb25QYXRofSkodCk/bmV3IF9TKHQpOm5ldyBDUyh0KX12YWxpZGF0ZUNvbmZpZyh7cGF0aDp0fSl7aWYoIXQuc3RhcnRzV2l0aCgiLyIpKXRocm93IG5ldyBSYW5nZUVycm9yKGBjb25maWcucGF0aCBzaG91bGQgc3RhcnQgd2l0aCAnLycuICR7dH1gKTtsZXQgZT0wO2Zvcig7KGU9dC5pbmRleE9mKCI6IixlKzEpKT49MDspe2lmKCIvIiE9PXRbZS0xXSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgY29uZmlnLnBhdGggcGFyYW1ldGVyIHNob3VsZCBjb21lIGFmdGVyICcvJy4gJHt0fWApO2lmKHZvaWQgMD09PXRbZSsxXXx8Ii8iPT09dFtlKzFdKXRocm93IG5ldyBSYW5nZUVycm9yKGBjb25maWcucGF0aCBwYXJhbWV0ZXIgc2hvdWxkIGhhdmUgbm9uLWVtcHR5IG5hbWUuICR7dH1gKX19Z2V0UGF0aE1hdGNoZXJzKHQpe3JldHVybiB0Lm1hcCgodD0+e2NvbnN0e3BhdGhQYXJ0OmV9PXQ7cmV0dXJuIHQuaXNQYXJhbT9lPT4oe2lzUGFyYW1QYXRoUGFydDohMCxwYXJ0TWF0Y2hlZDohMCxwYXJhbU5hbWU6dC5wYXJhbU5hbWUscGFyYW1WYWx1ZTplfSk6dD0+KHtpc1BhcmFtUGF0aFBhcnQ6ITEscGFydE1hdGNoZWQ6dD09PWV9KX0pKX1tYXRjaCh0KXtsZXQgZT17fTtpZih0aGlzLnBhdGhNYXRjaGVycy5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm57cmVzdWx0OiExfTtsZXQgbj0wO2Zvcihjb25zdCBvIG9mIHRoaXMucGF0aE1hdGNoZXJzKXtjb25zdCBpPW8odFtuKytdKTtpZighaS5wYXJ0TWF0Y2hlZClyZXR1cm57cmVzdWx0OiExfTtpLmlzUGFyYW1QYXRoUGFydCYmKGU9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHtbaS5wYXJhbU5hbWVdOmkucGFyYW1WYWx1ZX0pKX1yZXR1cm57cmVzdWx0OiEwLHBhcmFtczplLHBhdGhQYXJ0czp0LGlzUmVkaXJlY3Rpb246ITF9fW1hdGNoQnlQYXJhbXModCl7cmV0dXJue3Jlc3VsdDohMCxwYXJhbXM6dCxwYXRoUGFydHM6dGhpcy5yZXByb2plY3RQYXRoQnlQYXJhbXModGhpcy5wYXRoRnJhZ21lbnRzLHQpLGlzUmVkaXJlY3Rpb246ITF9fXJlcHJvamVjdFBhdGhCeVBhcmFtcyh0LGUpe2NvbnN0IG49W107Zm9yKGNvbnN0IG8gb2YgdClpZihvLmlzUGFyYW0pe2NvbnN0e3BhcmFtTmFtZTp0fT1vO2lmKCFlLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBSYW5nZUVycm9yKGBGYWlsZWQgdG8gcmVwcm9qZWN0IHBhcmFtZXRlci4gIiR7dH0iIHBhcmFtZXRlciBzaG91bGQgYmUgcHJlc2VudC5gKTtuLnB1c2goZVt0XSl9ZWxzZSBuLnB1c2goby5wYXRoUGFydCk7cmV0dXJuIG59fWNsYXNzIHlTIGV4dGVuZHMgYlN7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5kZWZpbml0aW9uPXR9fWNsYXNzIF9TIGV4dGVuZHMgYlN7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5kZWZpbml0aW9uPXQsdGhpcy5yZWRpcmVjdGlvbkZyYWdtZW50cz1oUyh0LnJlZGlyZWN0aW9uUGF0aCl9bWF0Y2godCl7Y29uc3QgZT1zdXBlci5tYXRjaCh0KTtpZighZS5yZXN1bHQpcmV0dXJuIGU7Y29uc3Qgbj10aGlzLnJlcHJvamVjdFBhdGhCeVBhcmFtcyh0aGlzLnJlZGlyZWN0aW9uRnJhZ21lbnRzLGUucGFyYW1zKTtyZXR1cm57cmVzdWx0OiEwLHBhcmFtczplLnBhcmFtcyxwYXRoUGFydHM6bixpc1JlZGlyZWN0aW9uOiEwfX19Y2xhc3MgQ1MgZXh0ZW5kcyBiU3tjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLmRlZmluaXRpb249dH1tYXRjaCh0KXtjb25zdCBlPXN1cGVyLm1hdGNoKHQpO2lmKCFlLnJlc3VsdClyZXR1cm4gZTtjb25zdHtwYXRoUGFydHM6bixxdWVyeVBhcmFtczpvfT10aGlzLmRlZmluaXRpb24ucmVkaXJlY3Rvcih0KTtyZXR1cm57cmVzdWx0OiEwLHBhcmFtczplLnBhcmFtcyxwYXRoUGFydHM6bixpc1JlZGlyZWN0aW9uOiEwLHJlZGlyZWN0aW9uUXVlcnlQYXJhbXM6b319fWNsYXNzIE1Te2NvbnN0cnVjdG9yKHQsZT0zKXtpZih0aGlzLm1heFJlZGlyZWN0aW9uPWUsZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJtYXhSZWRpcmVjdGlvbiBoYXMgdG8gYmUgbm9uLW5lZ2F0aXZlIG51bWJlciIpO3RoaXMudmFsaWRhdGVSb3V0ZUNvbmZpZ3ModCksdGhpcy5kZWZhdWx0Um91dGVDb25maWc9bnVsbCx0aGlzLnJvdXRlS2luZFRvQ29uY3JldGVDb25maWdNYXRjaGVycz1uZXcgTWFwLHRoaXMuY29uZmlnTWF0Y2hlcnM9W107Zm9yKGNvbnN0IGUgb2YgdCl7Y29uc3QgdD1iUy5nZXRNYXRjaGVyKGUpO3RoaXMuY29uZmlnTWF0Y2hlcnMucHVzaCh0KSx0IGluc3RhbmNlb2YgeVMmJih0aGlzLnJvdXRlS2luZFRvQ29uY3JldGVDb25maWdNYXRjaGVycy5zZXQodC5kZWZpbml0aW9uLnJvdXRlS2luZCx0KSx0LmRlZmluaXRpb24uZGVmYXVsdFJvdXRlJiYodGhpcy5kZWZhdWx0Um91dGVDb25maWc9dCkpfX12YWxpZGF0ZVJvdXRlQ29uZmlncyh0KXtjb25zdCBlPXQuZmlsdGVyKGdTKSxuPWUuZmlsdGVyKCh0PT50LmRlZmF1bHRSb3V0ZSkpO2lmKG4ubGVuZ3RoPjEpe2NvbnN0IHQ9bi5tYXAoKCh7cGF0aDp0fSk9PnQpKS5qb2luKCIsICIpO3Rocm93IG5ldyBSYW5nZUVycm9yKGBUaGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBkZWZhdWx0Um91dGVzLiAke3R9YCl9aWYoMT09PW4ubGVuZ3RoKXtjb25zdHtwYXRoOnR9PW5bMF07aWYoQm9vbGVhbihoUyh0KS5maW5kKCgoe2lzUGFyYW06dH0pPT50KSkpKXRocm93IG5ldyBSYW5nZUVycm9yKGBBIGRlZmF1bHRSb3V0ZSBjYW5ub3QgaGF2ZSBhbnkgcGFyYW1zLiAke3R9YCl9Y29uc3Qgbz1uZXcgU2V0O2Zvcihjb25zdHtyb3V0ZUtpbmQ6dH1vZiBlKXtpZihvLmhhcyh0KSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgTXVsdGlwbGUgcm91dGUgY29uZmlndXJhdGlvbiBmb3Iga2luZDogJHt0fS4gQ29uZmlndXJhdGlvbnMgc2hvdWxkIGhhdmUgdW5pcXVlIHJvdXRlS2luZHNgKTtvLmFkZCh0KX19bWF0Y2godCl7dmFyIGU7aWYoIXQucGF0aG5hbWUuc3RhcnRzV2l0aCgiLyIpKXRocm93IG5ldyBSYW5nZUVycm9yKCdOYXZpZ2F0aW9uIGhhcyB0byBtYWRlIHdpdGggcGF0aG5hbWUgdGhhdCBzdGFydHMgd2l0aCAiLyInKTtsZXQgbixvPXZTKHQucGF0aG5hbWUpLGk9MCxhPSExO2Zvcig7Oyl7bGV0IHQ9ITE7Zm9yKGNvbnN0IGUgb2YgdGhpcy5jb25maWdNYXRjaGVycyl7Y29uc3QgaT1lLm1hdGNoKG8pO2lmKGkucmVzdWx0KXt0PSEwO2NvbnN0e3BhcmFtczpyLHBhdGhQYXJ0czpzLGlzUmVkaXJlY3Rpb246bH09aTtpZihsKXtvPXMsYT0hMCxuPWkucmVkaXJlY3Rpb25RdWVyeVBhcmFtczticmVha31pZighKGUgaW5zdGFuY2VvZiB5UykpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk5vIGNvbmNyZXRlIHJvdXRlIGRlZmluaXRpb24gYG1hdGNoYCByZXR1cm4gcmVkaXJlY3Rpb24iKTtjb25zdHtkZWZpbml0aW9uOmN9PWUsZD17cm91dGVLaW5kOmMucm91dGVLaW5kLHBhcmFtczpyLHBhdGhuYW1lOnhTKHMpLGRlZXBMaW5rUHJvdmlkZXI6Yy5kZWVwTGlua1Byb3ZpZGVyfHxudWxsfTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGQpLGE/e29yaWdpbmF0ZUZyb21SZWRpcmVjdGlvbjohMCxyZWRpcmVjdGlvbk9ubHlRdWVyeVBhcmFtczpufTp7b3JpZ2luYXRlRnJvbVJlZGlyZWN0aW9uOiExfSl9fWlmKGEmJmkrKywhdHx8aT50aGlzLm1heFJlZGlyZWN0aW9uKWJyZWFrfWlmKGk+dGhpcy5tYXhSZWRpcmVjdGlvbil0aHJvdyBuZXcgRXJyb3IoYFBvdGVudGlhbCByZWRpcmVjdGlvbiBsb29wIChyZWRpcmVjdGluZyBtb3JlIHRoYW4gJHt0aGlzLm1heFJlZGlyZWN0aW9ufSB0aW1lcy4gUGxlYXNlIGRvIG5vdCBoYXZlIGN5Y2xlcyBpbiB0aGUgcm91dGVzLmApO2lmKHRoaXMuZGVmYXVsdFJvdXRlQ29uZmlnKXtjb25zdHtkZWZpbml0aW9uOnR9PXRoaXMuZGVmYXVsdFJvdXRlQ29uZmlnO3JldHVybntyb3V0ZUtpbmQ6dC5yb3V0ZUtpbmQsZGVlcExpbmtQcm92aWRlcjpudWxsIT09KGU9dC5kZWVwTGlua1Byb3ZpZGVyKSYmdm9pZCAwIT09ZT9lOm51bGwscGF0aG5hbWU6dC5wYXRoLHBhcmFtczp7fSxvcmlnaW5hdGVGcm9tUmVkaXJlY3Rpb246YX19cmV0dXJuIG51bGx9bWF0Y2hCeVJvdXRlS2luZCh0LGUpe2NvbnN0IG49dGhpcy5yb3V0ZUtpbmRUb0NvbmNyZXRlQ29uZmlnTWF0Y2hlcnMuZ2V0KHQpO2lmKCFuKXRocm93IG5ldyBSYW5nZUVycm9yKGBSZXF1aXJlcyBjb25maWd1cmF0aW9uIGZvciByb3V0ZUtpbmQ6ICR7dH1gKTtyZXR1cm57cm91dGVLaW5kOnQscGFyYW1zOmUscGF0aG5hbWU6eFMobi5tYXRjaEJ5UGFyYW1zKGUpLnBhdGhQYXJ0cyksZGVlcExpbmtQcm92aWRlcjpuLmRlZmluaXRpb24uZGVlcExpbmtQcm92aWRlcnx8bnVsbCxvcmlnaW5hdGVGcm9tUmVkaXJlY3Rpb246ITF9fX1mdW5jdGlvbiB2Uyh0KXtyZXR1cm4gdC5zcGxpdCgiLyIpLnNsaWNlKDEpfWZ1bmN0aW9uIHhTKHQpe3JldHVybiIvIit0LmpvaW4oIi8iKX1jb25zdCBPUz1uZXcgR2EoIltBcHAgUm91dGluZ10gUm91dGUgQ29uZmlnIik7Y2xhc3MgUFN7Y29uc3RydWN0b3IodCl7aWYodGhpcy5yb3V0ZUNvbmZpZ3M9bnVsbCx0aGlzLnJvdXRlS2luZFRvTmdDb21wb25lbnQ9bmV3IE1hcCwhdClyZXR1cm47Y29uc3QgZT1bXTtmb3IoY29uc3QgbiBvZiB0KWZvcihjb25zdCB0IG9mIG4pZS5wdXNoKHQpO3RoaXMucm91dGVDb25maWdzPW5ldyBNUyhlKSxlLmZvckVhY2goKHQ9PntnUyh0KSYmdGhpcy5yb3V0ZUtpbmRUb05nQ29tcG9uZW50LnNldCh0LnJvdXRlS2luZCx0Lm5nQ29tcG9uZW50KX0pKX1nZXRSZWdpc3RlcmVkUm91dGVLaW5kcygpe3JldHVybiB0aGlzLnJvdXRlS2luZFRvTmdDb21wb25lbnQua2V5cygpfWdldFJvdXRlQ29uZmlncygpe3JldHVybiB0aGlzLnJvdXRlQ29uZmlnc31nZXROZ0NvbXBvbmVudEJ5Um91dGVLaW5kKHQpe3JldHVybiB0aGlzLnJvdXRlS2luZFRvTmdDb21wb25lbnQuZ2V0KHQpfHxudWxsfXN0YXRpYyByZWdpc3RlclJvdXRlcyh0KXtyZXR1cm57bmdNb2R1bGU6UFMscHJvdmlkZXJzOlt7cHJvdmlkZTpPUyxtdWx0aTohMCx1c2VGYWN0b3J5OnR9XX19fVBTLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxQUykodnIoT1MsOCkpfSxQUy7JtW1vZD1hbyh7dHlwZTpQU30pLFBTLsm1aW5qPXZuKHt9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFBTLFt7dHlwZTpBeSxhcmdzOlt7fV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltPU119XX1dfSksbnVsbCk7Y29uc3Qgd1M9ImFwcF9yb3V0aW5nIixrUz1Ldyh3UyksU1M9Wncoa1MsKHQ9PnQuYWN0aXZlUm91dGUpKSxEUz1adyhrUywodD0+dC5uZXh0Um91dGUpKSxFUz1adyhrUywodD0+dC5yZWdpc3RlcmVkUm91dGVLZXlzKSksUlM9WncoU1MsKHQ9PnQ/dC5yb3V0ZUtpbmQ6WmsuTk9UX1NFVCkpLEFTPVp3KFNTLCh0PT50P3QucGFyYW1zOnt9KSksVFM9WncoUlMsQVMsKCh0LGUpPT5Kayh0LGUpKSksTlM9WncoUlMsQVMsKCh0LGUpPT5Rayh0LGUpKSkselM9WncoUlMsQVMsKCh0LGUpPT57aWYodCE9PVprLkNPTVBBUkVfRVhQRVJJTUVOVClyZXR1cm57fTtjb25zdCBuPShmdW5jdGlvbiBvKHQpe2NvbnN0IGU9bmV3IE1hcCxuPUtrKHQuZXhwZXJpbWVudElkcyk7Zm9yKGNvbnN0e2lkOnQsbmFtZTpvfW9mIG4pbyYmZS5zZXQodCxvKTtyZXR1cm4gZX0pKGUpO3JldHVybiBPYmplY3QuZnJvbUVudHJpZXMobi5lbnRyaWVzKCkpfSkpLElTPUpQKCJbQXBwIFJvdXRpbmddIEVmZmVjdHMgSW5pdCIpO2NsYXNzIEhTe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIpe3RoaXMuYWN0aW9ucyQ9dCx0aGlzLnN0b3JlPWUsdGhpcy5sb2NhdGlvbj1uLHRoaXMuZGlydHlVcGRhdGVzUmVnaXN0cnk9byx0aGlzLnJlZ2lzdHJ5PWksdGhpcy5wcm9ncmFtbWF0aWNhbE5hdk1vZHVsZT1hLHRoaXMuYXBwUm9vdFByb3ZpZGVyPXIsdGhpcy5vbk5hdmlnYXRpb25SZXF1ZXN0ZWQkPXRoaXMuYWN0aW9ucyQucGlwZShEayhsUyksSXQoKHQ9Pntjb25zdCBlPXQucGF0aG5hbWUuc3RhcnRzV2l0aCgiLyIpP3RoaXMuYXBwUm9vdFByb3ZpZGVyLmdldEFic1BhdGhuYW1lV2l0aEFwcFJvb3QodC5wYXRobmFtZSk6dGhpcy5sb2NhdGlvbi5nZXRSZXNvbHZlZFBhdGgodC5wYXRobmFtZSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7cGF0aG5hbWU6ZX0pfSkpKSx0aGlzLmJvb3RzdHJhcFJlZHVjZXJzJD1NaygoKCk9PnRoaXMuYWN0aW9ucyQucGlwZShEayhJUyksSXQoKCgpPT5zUyh7cm91dGVLaW5kczpuZXcgU2V0KHRoaXMucmVnaXN0cnkuZ2V0UmVnaXN0ZXJlZFJvdXRlS2luZHMoKSl9KSkpKSkpLHRoaXMub25Jbml0JD10aGlzLmFjdGlvbnMkLnBpcGUoRGsoSVMpKS5waXBlKENlKDApLEl0KCgoKT0+KHtwYXRobmFtZTp0aGlzLmxvY2F0aW9uLmdldFBhdGgoKSxxdWVyeVBhcmFtczp0aGlzLmxvY2F0aW9uLmdldFNlYXJjaCgpLHJlcGxhY2VTdGF0ZTohMCxicm93c2VySW5pdGlhdGVkOiEwfSkpKSksdGhpcy51c2VySW5pdE5hdlJvdXRlJD1yZSh0aGlzLm9uTmF2aWdhdGlvblJlcXVlc3RlZCQsdGhpcy5vbkluaXQkLHRoaXMubG9jYXRpb24ub25Qb3BTdGF0ZSgpLnBpcGUoSXQoKHQ9Pih7cGF0aG5hbWU6dC5wYXRobmFtZSxyZXBsYWNlU3RhdGU6dC5yZXBsYWNlU3RhdGUsYnJvd3NlckluaXRpYXRlZDohMH0pKSkpKS5waXBlKEl0KCh0PT57aWYoIXQucGF0aG5hbWUuc3RhcnRzV2l0aCgiLyIpKXRocm93IG5ldyBFcnJvcihgW0FwcCByb3V0aW5nXSBwYXRobmFtZSBtdXN0IHN0YXJ0IHdpdGggJy8nLiBHb3Q6ICR7dC5wYXRobmFtZX1gKTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtwYXRobmFtZTp0aGlzLmFwcFJvb3RQcm92aWRlci5nZXRBcHBSb290bGVzc1BhdGhuYW1lKHQucGF0aG5hbWUpfSl9KSksSXQoKHQ9Pih7cm91dGVNYXRjaDp0aGlzLnJvdXRlQ29uZmlncz90aGlzLnJvdXRlQ29uZmlncy5tYXRjaCh0KTpudWxsLG9wdGlvbnM6e3JlcGxhY2VTdGF0ZTp0LnJlcGxhY2VTdGF0ZSxicm93c2VySW5pdGlhdGVkOnQuYnJvd3NlckluaXRpYXRlZH19KSkpKSx0aGlzLnByb2dyYW1tdGljYWxOYXZSb3V0ZSQ9dGhpcy5hY3Rpb25zJC5waXBlKEl0KCh0PT50aGlzLnByb2dyYW1tYXRpY2FsTmF2TW9kdWxlLmdldE5hdmlnYXRpb24odCkpKSxjZSgodD0+bnVsbCE9PXQpKSxJdCgodD0+e2NvbnN0IGU9dCxuPWUucm91dGVLaW5kO2xldCBvO3N3aXRjaChlLnJvdXRlS2luZCl7Y2FzZSBaay5DT01QQVJFX0VYUEVSSU1FTlQ6bz17ZXhwZXJpbWVudElkczooaT1lLnJvdXRlUGFyYW1zLmFsaWFzQW5kRXhwZXJpbWVudElkcyxpLm1hcCgoKHthbGlhczp0LGlkOmV9KT0+YCR7dH06JHtlfWApKS5qb2luKCIsIikpfTticmVhaztkZWZhdWx0Om89ZS5yb3V0ZVBhcmFtc312YXIgaTtyZXR1cm57cm91dGVLaW5kOm4scm91dGVQYXJhbXM6b319KSksSXQoKCh7cm91dGVLaW5kOnQscm91dGVQYXJhbXM6ZX0pPT4oe3JvdXRlTWF0Y2g6dGhpcy5yb3V0ZUNvbmZpZ3M/dGhpcy5yb3V0ZUNvbmZpZ3MubWF0Y2hCeVJvdXRlS2luZCh0LGUpOm51bGwsb3B0aW9uczp7cmVwbGFjZVN0YXRlOiExLGJyb3dzZXJJbml0aWF0ZWQ6ITF9fSkpKSksdGhpcy52YWxpZGF0ZWRSb3V0ZSQ9cmUodGhpcy51c2VySW5pdE5hdlJvdXRlJCx0aGlzLnByb2dyYW1tdGljYWxOYXZSb3V0ZSQpLnBpcGUoY2UoKCh7cm91dGVNYXRjaDp0fSk9PkJvb2xlYW4odCkpKSxJdCgodD0+KHtyb3V0ZU1hdGNoOnQucm91dGVNYXRjaCxvcHRpb25zOnQub3B0aW9uc30pKSkpLHRoaXMubmF2aWdhdGUkPU1rKCgoKT0+dGhpcy52YWxpZGF0ZWRSb3V0ZSQucGlwZShWZSh0aGlzLnN0b3JlLnNlbGVjdChTUykpLFp0KCgoW3QsZV0pPT57Y29uc3Qgbj1udWxsIT09ZSYmUWsodC5yb3V0ZU1hdGNoLnJvdXRlS2luZCx0LnJvdXRlTWF0Y2gucGFyYW1zKT09PVFrKGUucm91dGVLaW5kLGUucGFyYW1zKSxvPXRoaXMuZGlydHlVcGRhdGVzUmVnaXN0cnkuZ2V0RGlydHlVcGRhdGVzU2VsZWN0b3JzKCk7cmV0dXJuIG58fCFvLmxlbmd0aD9FdCh0KTokdCh0aGlzLmRpcnR5VXBkYXRlc1JlZ2lzdHJ5LmdldERpcnR5VXBkYXRlc1NlbGVjdG9ycygpLm1hcCgodD0+dGhpcy5zdG9yZS5zZWxlY3QodCkucGlwZShiZSgxKSkpKSkucGlwZShJdCgodD0+dm9pZCAwIT09dFswXS5leHBlcmltZW50SWRzJiZ0WzBdLmV4cGVyaW1lbnRJZHMubGVuZ3RoPjApKSxjZSgodD0+e2lmKHQpe2NvbnN0IHQ9d2luZG93LmNvbmZpcm0oIllvdSBoYXZlIHVuc2F2ZWQgZWRpdHMsIGFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkaXNjYXJkIHRoZW0/Iik7cmV0dXJuIHQmJnRoaXMuc3RvcmUuZGlzcGF0Y2goYVMoKSksdH1yZXR1cm4hMH0pKSxJdCgoKCk9PnQpKSl9KSksRmUoKCh7cm91dGVNYXRjaDp0LG9wdGlvbnM6ZX0pPT57aWYoZS5icm93c2VySW5pdGlhdGVkJiZ0LmRlZXBMaW5rUHJvdmlkZXIpe2NvbnN0IGU9dC5vcmlnaW5hdGVGcm9tUmVkaXJlY3Rpb24mJnQucmVkaXJlY3Rpb25Pbmx5UXVlcnlQYXJhbXM/dC5yZWRpcmVjdGlvbk9ubHlRdWVyeVBhcmFtczp0aGlzLmxvY2F0aW9uLmdldFNlYXJjaCgpLG49dC5kZWVwTGlua1Byb3ZpZGVyLmRlc2VyaWFsaXplUXVlcnlQYXJhbXMoZSk7dGhpcy5zdG9yZS5kaXNwYXRjaChyUyh7cm91dGVLaW5kOnQucm91dGVLaW5kLHBhcnRpYWxTdGF0ZTpufSkpfX0pKSx6ZSgoKHtyb3V0ZU1hdGNoOnQsb3B0aW9uczplfSk9Pnt2YXIgbjtjb25zdCBvPXtyZXBsYWNlU3RhdGU6bnVsbCE9PShuPWUucmVwbGFjZVN0YXRlKSYmdm9pZCAwIT09biYmbn0saT1FdCh7cm91dGVLaW5kOnQucm91dGVLaW5kLHBhcmFtczp0LnBhcmFtcyxwYXRobmFtZTp0LnBhdGhuYW1lLHF1ZXJ5UGFyYW1zOltdLG5hdmlnYXRpb25PcHRpb25zOm99KTtyZXR1cm4gbnVsbD09PXQuZGVlcExpbmtQcm92aWRlcj9pOnQuZGVlcExpbmtQcm92aWRlci5zZXJpYWxpemVTdGF0ZVRvUXVlcnlQYXJhbXModGhpcy5zdG9yZSkucGlwZShJdCgoKGUsbik9Pih7cm91dGVLaW5kOnQucm91dGVLaW5kLHBhcmFtczp0LnBhcmFtcyxwYXRobmFtZTp0LnBhdGhuYW1lLHF1ZXJ5UGFyYW1zOmUsbmF2aWdhdGlvbk9wdGlvbnM6MD09PW4/bzpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbykse3JlcGxhY2VTdGF0ZTohMH0pfSkpKSl9KSksRmUoKHQ9Pnt0aGlzLnN0b3JlLmRpc3BhdGNoKGNTKHthZnRlcjp0fSkpfSkpLGdlKDApKS5waXBlKFZlKHRoaXMuc3RvcmUuc2VsZWN0KFNTKSksSXQoKChbdCxlXSk9Pih7cHJlc2VydmVIYXNoOm51bGw9PT1lfHxudWxsPT09dHx8UWsoZS5yb3V0ZUtpbmQsZS5wYXJhbXMpPT09UWsodC5yb3V0ZUtpbmQsdC5wYXJhbXMpLHJvdXRlOnR9KSkpLEZlKCgoe3ByZXNlcnZlSGFzaDp0LHJvdXRlOmV9KT0+eyEoZnVuY3Rpb24gbih0LGUpe3JldHVybiB0LnBhdGhuYW1lPT09ZS5wYXRobmFtZSYmdC5xdWVyeVBhcmFtcy5sZW5ndGg9PT1lLnF1ZXJ5UGFyYW1zLmxlbmd0aCYmdC5xdWVyeVBhcmFtcy5ldmVyeSgoKHQsbik9Pntjb25zdCBvPWUucXVlcnlQYXJhbXNbbl07cmV0dXJuIHQua2V5PT09by5rZXkmJnQudmFsdWU9PT1vLnZhbHVlfSkpfSkoZSx7cGF0aG5hbWU6dGhpcy5hcHBSb290UHJvdmlkZXIuZ2V0QXBwUm9vdGxlc3NQYXRobmFtZSh0aGlzLmxvY2F0aW9uLmdldFBhdGgoKSkscXVlcnlQYXJhbXM6dGhpcy5sb2NhdGlvbi5nZXRTZWFyY2goKX0pJiYoZS5uYXZpZ2F0aW9uT3B0aW9ucy5yZXBsYWNlU3RhdGU/dGhpcy5sb2NhdGlvbi5yZXBsYWNlU3RhdGUodGhpcy5hcHBSb290UHJvdmlkZXIuZ2V0QWJzUGF0aG5hbWVXaXRoQXBwUm9vdCh0aGlzLmxvY2F0aW9uLmdldEZ1bGxQYXRoRnJvbVJvdXRlT3JOYXYoZSx0KSkpOnRoaXMubG9jYXRpb24ucHVzaFN0YXRlKHRoaXMuYXBwUm9vdFByb3ZpZGVyLmdldEFic1BhdGhuYW1lV2l0aEFwcFJvb3QodGhpcy5sb2NhdGlvbi5nZXRGdWxsUGF0aEZyb21Sb3V0ZU9yTmF2KGUsdCkpKSl9KSkpLnBpcGUoVmUodGhpcy5zdG9yZS5zZWxlY3QoU1MpKSxJdCgoKFt7cm91dGU6dH0sZV0pPT5kUyh7YmVmb3JlOmUsYWZ0ZXI6dH0pKSkpKSksdGhpcy5yb3V0ZUNvbmZpZ3M9aS5nZXRSb3V0ZUNvbmZpZ3MoKX1uZ3J4T25Jbml0RWZmZWN0cygpe3JldHVybiBJUygpfX1IUy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SFMpKHZyKFNrKSx2cihJdyksdnIodFMpLHZyKG1TKSx2cihQUyksdnIoZlMpLHZyKGVTKSl9LEhTLsm1cHJvdj1Nbih7dG9rZW46SFMsZmFjdG9yeTpIUy7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoSFMsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlNrfSx7dHlwZTpJd30se3R5cGU6dFN9LHt0eXBlOm1TfSx7dHlwZTpQU30se3R5cGU6ZlN9LHt0eXBlOmVTfV19KSxudWxsKTtjb25zdCBGUz15ayh7YWN0aXZlUm91dGU6bnVsbCxuZXh0Um91dGU6bnVsbCxyZWdpc3RlcmVkUm91dGVLZXlzOm5ldyBTZXR9LGJrKGNTLCgodCx7YWZ0ZXI6ZX0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse25leHRSb3V0ZTplfSkpKSxiayhkUywoKHQse2FmdGVyOmV9KT0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHthY3RpdmVSb3V0ZTplLG5leHRSb3V0ZTpudWxsfSkpKSxiayhzUywoKHQse3JvdXRlS2luZHM6ZX0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3JlZ2lzdGVyZWRSb3V0ZUtleXM6ZX0pKSkpO2Z1bmN0aW9uIExTKHQsZSl7cmV0dXJuIEZTKHQsZSl9Y2xhc3MgQlN7fUJTLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxCUyl9LEJTLsm1bW9kPWFvKHt0eXBlOkJTfSksQlMuybVpbmo9dm4oe3Byb3ZpZGVyczpbbVMsZlNdLGltcG9ydHM6W1tQUyxkay5mb3JGZWF0dXJlKHdTLExTKSxXay5mb3JGZWF0dXJlKFtIU10pLGlTLG9TXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEJTLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbUFMsZGsuZm9yRmVhdHVyZSh3UyxMUyksV2suZm9yRmVhdHVyZShbSFNdKSxpUyxvU10scHJvdmlkZXJzOlttUyxmU119XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhCUyx7aW1wb3J0czpbUFMsY2ssR2ssaVMsb1NdfSk7Y2xhc3MgVlN7fWNvbnN0IGpTPSJfX3RhYl9fIjtjbGFzcyBVU3tjb25zdHJ1Y3Rvcigpe3RoaXMudGZTdG9yYWdlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRmLXN0b3JhZ2UiKSxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Zi1nbG9iYWxzIikudGZfZ2xvYmFscy5zZXRVc2VIYXNoKCEwKSx0aGlzLnRmU3RvcmFnZS50Zl9zdG9yYWdlLm1pZ3JhdGVMZWdhY3lVUkxTY2hlbWUoKX1nZXRTdHJpbmcodCl7cmV0dXJuIHRoaXMudGZTdG9yYWdlLnRmX3N0b3JhZ2UuZ2V0U3RyaW5nKHQpfXNldFN0cmluZyh0LGUsbil7dGhpcy50ZlN0b3JhZ2UudGZfc3RvcmFnZS5zZXRTdHJpbmcodCxlLG4pfWdldFBsdWdpbklkKCl7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKGpTKX1zZXRQbHVnaW5JZCh0LGUpe3RoaXMuc2V0U3RyaW5nKGpTLHQsZSl9fXZhciBHUztVUy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VVMpfSxVUy7JtXByb3Y9TW4oe3Rva2VuOlVTLGZhY3Rvcnk6VVMuybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFVTLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVybltdfSksbnVsbCksKGZ1bmN0aW9uKHQpe3QuQlJPV1NFUl9ERUZBVUxUPSJicm93c2VyX2RlZmF1bHQiLHQuTElHSFQ9ImxpZ2h0Iix0LkRBUks9ImRhcmsifSkoR1N8fChHUz17fSkpO2NvbnN0IFdTPUpQKCJbUGVyc2lzdGVudCBTZXR0aW5nc10gR2xvYmFsIFNldHRpbmdzIExvYWRlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLFlTPW5ldyBHYSgiW1BlcnNpc3RlbnQgU2V0dGluZ3NdIEdsb2JhbCBTZXR0aW5ncyIpO2NsYXNzIHFTe2NvbnN0cnVjdG9yKHQpe3RoaXMuZ2xvYmFsU2V0dGluZ1NlbGVjdG9ycz1bXSx0JiYodGhpcy5nbG9iYWxTZXR0aW5nU2VsZWN0b3JzPXQubWFwKCh0PT50KCkpKSl9Z2V0R2xvYmFsU2V0dGluZ1NlbGVjdG9ycygpe3ZhciB0O3JldHVybiBudWxsIT09KHQ9dGhpcy5nbG9iYWxTZXR0aW5nU2VsZWN0b3JzKSYmdm9pZCAwIT09dD90OltdfXN0YXRpYyBkZWZpbmVHbG9iYWxTZXR0aW5nKHQpe3JldHVybntuZ01vZHVsZTpxUyxwcm92aWRlcnM6W3twcm92aWRlOllTLG11bHRpOiEwLHVzZVZhbHVlOnR9XX19fXFTLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxxUykodnIoWVMsOCkpfSxxUy7JtW1vZD1hbyh7dHlwZTpxU30pLHFTLsm1aW5qPXZuKHt9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHFTLFt7dHlwZTpBeX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbWVNdfV19XX0pLG51bGwpO2NsYXNzIFpTe3NldEl0ZW0odCxlKXtsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0LGUpfWdldEl0ZW0odCl7cmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHQpfXJlbW92ZUl0ZW0odCl7bG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odCl9fVpTLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxaUyl9LFpTLsm1cHJvdj1Nbih7dG9rZW46WlMsZmFjdG9yeTpaUy7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWlMsW3t0eXBlOmltfV0sbnVsbCxudWxsKTtjbGFzcyBYU3t9WFMuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFhTKX0sWFMuybVtb2Q9YW8oe3R5cGU6WFN9KSxYUy7JtWluaj12bih7cHJvdmlkZXJzOltaU119KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFhTLFt7dHlwZTpBeSxhcmdzOlt7cHJvdmlkZXJzOltaU119XX1dLG51bGwsbnVsbCk7Y29uc3QgS1M9Il90Yl9nbG9iYWxfc2V0dGluZ3MudGltZXNlcmllcyIsSlM9Il90Yl9nbG9iYWxfc2V0dGluZ3MiLFFTPSJub3RpZmljYXRpb25MYXN0UmVhZFRpbWVzdGFtcCI7Y2xhc3MgJFN7fSRTLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHwkUyl9LCRTLsm1cHJvdj1Nbih7dG9rZW46JFMsZmFjdG9yeTokUy7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoJFMsW3t0eXBlOmltfV0sbnVsbCxudWxsKTtjbGFzcyB0RHt9dEQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHREKX0sdEQuybVwcm92PU1uKHt0b2tlbjp0RCxmYWN0b3J5OnRELsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh0RCxbe3R5cGU6aW19XSxudWxsLG51bGwpO2NsYXNzIGVEIGV4dGVuZHMgdER7dWlUb0JhY2tlbmQodCl7cmV0dXJue2lnbm9yZU91dGxpZXJzOnQuaWdub3JlT3V0bGllcnMsc2NhbGFyU21vb3RoaW5nOnQuc2NhbGFyU21vb3RoaW5nLHRvb2x0aXBTb3J0OnQudG9vbHRpcFNvcnRTdHJpbmcsYXV0b1JlbG9hZDp0LmF1dG9SZWxvYWQsYXV0b1JlbG9hZFBlcmlvZEluTXM6dC5hdXRvUmVsb2FkUGVyaW9kSW5NcyxwYWdpbmF0aW9uU2l6ZTp0LnBhZ2VTaXplLHRoZW1lOnQudGhlbWVPdmVycmlkZSxub3RpZmljYXRpb25MYXN0UmVhZFRpbWVJbk1zOnQubm90aWZpY2F0aW9uTGFzdFJlYWRUaW1lSW5NcyxzaWRlQmFyV2lkdGhJblBlcmNlbnQ6dC5zaWRlQmFyV2lkdGhJblBlcmNlbnQsdGltZVNlcmllc1Byb21vdGlvbkRpc21pc3NlZDp0LnRpbWVTZXJpZXNQcm9tb3Rpb25EaXNtaXNzZWQsdGltZVNlcmllc1NldHRpbmdzUGFuZU9wZW5lZDp0LnRpbWVTZXJpZXNTZXR0aW5nc1BhbmVPcGVuZWR9fWJhY2tlbmRUb1VpKHQpe2NvbnN0IGU9e307cmV0dXJuIHQuaGFzT3duUHJvcGVydHkoInNjYWxhclNtb290aGluZyIpJiYibnVtYmVyIj09dHlwZW9mIHQuc2NhbGFyU21vb3RoaW5nJiYoZS5zY2FsYXJTbW9vdGhpbmc9dC5zY2FsYXJTbW9vdGhpbmcpLHQuaGFzT3duUHJvcGVydHkoImlnbm9yZU91dGxpZXJzIikmJiJib29sZWFuIj09dHlwZW9mIHQuaWdub3JlT3V0bGllcnMmJihlLmlnbm9yZU91dGxpZXJzPXQuaWdub3JlT3V0bGllcnMpLHQuaGFzT3duUHJvcGVydHkoInRvb2x0aXBTb3J0IikmJiJzdHJpbmciPT10eXBlb2YgdC50b29sdGlwU29ydCYmKGUudG9vbHRpcFNvcnRTdHJpbmc9dC50b29sdGlwU29ydCksdC5oYXNPd25Qcm9wZXJ0eSgiYXV0b1JlbG9hZCIpJiYiYm9vbGVhbiI9PXR5cGVvZiB0LmF1dG9SZWxvYWQmJihlLmF1dG9SZWxvYWQ9dC5hdXRvUmVsb2FkKSx0Lmhhc093blByb3BlcnR5KCJhdXRvUmVsb2FkUGVyaW9kSW5NcyIpJiYibnVtYmVyIj09dHlwZW9mIHQuYXV0b1JlbG9hZFBlcmlvZEluTXMmJihlLmF1dG9SZWxvYWRQZXJpb2RJbk1zPXQuYXV0b1JlbG9hZFBlcmlvZEluTXMpLHQuaGFzT3duUHJvcGVydHkoInBhZ2luYXRpb25TaXplIikmJiJudW1iZXIiPT10eXBlb2YgdC5wYWdpbmF0aW9uU2l6ZSYmKGUucGFnZVNpemU9dC5wYWdpbmF0aW9uU2l6ZSksdC5oYXNPd25Qcm9wZXJ0eSgidGhlbWUiKSYmInN0cmluZyI9PXR5cGVvZiB0LnRoZW1lJiZuZXcgU2V0KE9iamVjdC52YWx1ZXMoR1MpKS5oYXModC50aGVtZSkmJihlLnRoZW1lT3ZlcnJpZGU9dC50aGVtZSksdC5oYXNPd25Qcm9wZXJ0eSgibm90aWZpY2F0aW9uTGFzdFJlYWRUaW1lSW5NcyIpJiYibnVtYmVyIj09dHlwZW9mIHQubm90aWZpY2F0aW9uTGFzdFJlYWRUaW1lSW5NcyYmKGUubm90aWZpY2F0aW9uTGFzdFJlYWRUaW1lSW5Ncz10Lm5vdGlmaWNhdGlvbkxhc3RSZWFkVGltZUluTXMpLHQuaGFzT3duUHJvcGVydHkoInNpZGVCYXJXaWR0aEluUGVyY2VudCIpJiYibnVtYmVyIj09dHlwZW9mIHQuc2lkZUJhcldpZHRoSW5QZXJjZW50JiYoZS5zaWRlQmFyV2lkdGhJblBlcmNlbnQ9dC5zaWRlQmFyV2lkdGhJblBlcmNlbnQpLHQuaGFzT3duUHJvcGVydHkoInRpbWVTZXJpZXNQcm9tb3Rpb25EaXNtaXNzZWQiKSYmImJvb2xlYW4iPT10eXBlb2YgdC50aW1lU2VyaWVzUHJvbW90aW9uRGlzbWlzc2VkJiYoZS50aW1lU2VyaWVzUHJvbW90aW9uRGlzbWlzc2VkPXQudGltZVNlcmllc1Byb21vdGlvbkRpc21pc3NlZCksdC5oYXNPd25Qcm9wZXJ0eSgidGltZVNlcmllc1NldHRpbmdzUGFuZU9wZW5lZCIpJiYiYm9vbGVhbiI9PXR5cGVvZiB0LnRpbWVTZXJpZXNTZXR0aW5nc1BhbmVPcGVuZWQmJihlLnRpbWVTZXJpZXNTZXR0aW5nc1BhbmVPcGVuZWQ9dC50aW1lU2VyaWVzU2V0dGluZ3NQYW5lT3BlbmVkKSxlfX1lRC7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoZUQpKSkobnx8ZUQpfX0pKCksZUQuybVwcm92PU1uKHt0b2tlbjplRCxmYWN0b3J5OmVELsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChlRCxbe3R5cGU6aW19XSxudWxsLG51bGwpO2NsYXNzIG5Ee2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5sb2NhbFN0b3JhZ2U9dCx0aGlzLmNvbnZlcnRlcj1lfXNldFNldHRpbmdzKHQpe3JldHVybiBPYmplY3Qua2V5cyh0KT90aGlzLmdldFNldHRpbmdzKCkucGlwZShGZSgoZT0+e3RoaXMubG9jYWxTdG9yYWdlLnNldEl0ZW0oSlMsSlNPTi5zdHJpbmdpZnkodGhpcy5jb252ZXJ0ZXIudWlUb0JhY2tlbmQoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHQpKSkpLHRoaXMubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oS1MpLHRoaXMubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oUVMpfSkpLEl0KCgoKT0+e30pKSk6cnR9ZGVzZXJpYWxpemUodCl7dHJ5e3JldHVybiBKU09OLnBhcnNlKHQpfWNhdGNoKHQpe3JldHVybnt9fX1nZXRTZXR0aW5ncygpe3ZhciB0LGU7Y29uc3Qgbj10aGlzLmxvY2FsU3RvcmFnZS5nZXRJdGVtKFFTKSxvPXRoaXMuY29udmVydGVyLmJhY2tlbmRUb1VpKHRoaXMuZGVzZXJpYWxpemUobj9KU09OLnN0cmluZ2lmeSh7bm90aWZpY2F0aW9uTGFzdFJlYWRUaW1lSW5NczpOdW1iZXIobil9KToie30iKSksaT10aGlzLmNvbnZlcnRlci5iYWNrZW5kVG9VaSh0aGlzLmRlc2VyaWFsaXplKG51bGwhPT0odD10aGlzLmxvY2FsU3RvcmFnZS5nZXRJdGVtKEtTKSkmJnZvaWQgMCE9PXQ/dDoie30iKSksYT10aGlzLmNvbnZlcnRlci5iYWNrZW5kVG9VaSh0aGlzLmRlc2VyaWFsaXplKG51bGwhPT0oZT10aGlzLmxvY2FsU3RvcmFnZS5nZXRJdGVtKEpTKSkmJnZvaWQgMCE9PWU/ZToie30iKSk7cmV0dXJuIEV0KE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG8pLGkpLGEpKX19bkQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fG5EKSh2cihaUyksdnIodEQpKX0sbkQuybVwcm92PU1uKHt0b2tlbjpuRCxmYWN0b3J5Om5ELsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChuRCxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6WlN9LHt0eXBlOnREfV19KSxudWxsKTtjbGFzcyBvRHt9b0QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fG9EKX0sb0QuybVtb2Q9YW8oe3R5cGU6b0R9KSxvRC7JtWluaj12bih7cHJvdmlkZXJzOlt7cHJvdmlkZTokUyx1c2VDbGFzczpuRH0se3Byb3ZpZGU6dEQsdXNlQ2xhc3M6ZUR9XSxpbXBvcnRzOltbWFNdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgob0QsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltYU10scHJvdmlkZXJzOlt7cHJvdmlkZTokUyx1c2VDbGFzczpuRH0se3Byb3ZpZGU6dEQsdXNlQ2xhc3M6ZUR9XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKG9ELHtpbXBvcnRzOltYU119KTtjb25zdCBpRD1KUCgiW1BlcnNpc3RlbnQgU2V0dGluZ3NdIEVmZmVjdHMgSW5pdCIpO2NsYXNzIGFEe2NvbnN0cnVjdG9yKHQsZSxuLG8pe3RoaXMuYWN0aW9ucyQ9dCx0aGlzLnN0b3JlPWUsdGhpcy5jb25maWdNb2R1bGU9bix0aGlzLmRhdGFTb3VyY2U9byx0aGlzLmluaXRpYWxpemVBbmRVcGRhdGVTZXR0aW5ncyQ9TWsoKCgpPT57Y29uc3QgdD10aGlzLmFjdGlvbnMkLnBpcGUoRGsoaUQpLFp0KCgoKT0+dGhpcy5kYXRhU291cmNlLmdldFNldHRpbmdzKCkpKSxGZSgodD0+e3RoaXMuc3RvcmUuZGlzcGF0Y2goV1Moe3BhcnRpYWxTZXR0aW5nczp0fSkpfSkpLENlKDApLFp0KCgoKT0+cmUoLi4udGhpcy5jb25maWdNb2R1bGUuZ2V0R2xvYmFsU2V0dGluZ1NlbGVjdG9ycygpLm1hcCgodD0+dGhpcy5zdG9yZS5zZWxlY3QodCkucGlwZShNZSgoKHQsZSk9Pntjb25zdCBuPU9iamVjdC52YWx1ZXModCksbz1PYmplY3QudmFsdWVzKGUpO3JldHVybiBuLmxlbmd0aD09PW8ubGVuZ3RoJiZuLmV2ZXJ5KCgodCxlKT0+dD09PW9bZV0pKX0pKSxUZSgxKSkpKSkpKSxFZSgpKTtyZXR1cm4gdC5waXBlKChmdW5jdGlvbiBlKHQpe3JldHVybiBSKChmdW5jdGlvbihlLG4pe3ZhciBvPVtdO3JldHVybiBlLnN1YnNjcmliZShuZXcgVChuLChmdW5jdGlvbih0KXtyZXR1cm4gby5wdXNoKHQpfSksKGZ1bmN0aW9uKCl7bi5uZXh0KG8pLG4uY29tcGxldGUoKX0pKSksdC5zdWJzY3JpYmUobmV3IFQobiwoZnVuY3Rpb24oKXt2YXIgdD1vO289W10sbi5uZXh0KHQpfSkseSkpLGZ1bmN0aW9uKCl7bz1udWxsfX0pKX0pKHQucGlwZShnZSg1MDApKSksWnQoKHQ9Pntjb25zdCBlPXt9O2Zvcihjb25zdCBuIG9mIHQpT2JqZWN0LmFzc2lnbihlLG4pO3JldHVybiB0aGlzLmRhdGFTb3VyY2Uuc2V0U2V0dGluZ3MoZSl9KSkpfSkse2Rpc3BhdGNoOiExfSl9bmdyeE9uSW5pdEVmZmVjdHMoKXtyZXR1cm4gaUQoKX19YUQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGFEKSh2cihTayksdnIoSXcpLHZyKHFTKSx2cigkUykpfSxhRC7JtXByb3Y9TW4oe3Rva2VuOmFELGZhY3Rvcnk6YUQuybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGFELFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpTa30se3R5cGU6SXd9LHt0eXBlOnFTfSx7dHlwZTokU31dfSksbnVsbCk7Y2xhc3MgckR7fXJELsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxyRCl9LHJELsm1bW9kPWFvKHt0eXBlOnJEfSksckQuybVpbmo9dm4oe3Byb3ZpZGVyczpbcVNdLGltcG9ydHM6W1tXay5mb3JGZWF0dXJlKFthRF0pLG9EXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHJELFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbV2suZm9yRmVhdHVyZShbYURdKSxvRF0scHJvdmlkZXJzOltxU119XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhyRCx7aW1wb3J0czpbR2ssb0RdfSk7Ci8qKgogICAgICogQGxpY2Vuc2UgQW5ndWxhciB2MTIuMi4xCiAgICAgKiAoYykgMjAxMC0yMDIxIEdvb2dsZSBMTEMuIGh0dHBzOi8vYW5ndWxhci5pby8KICAgICAqIExpY2Vuc2U6IE1JVAogICAgICovCmNsYXNzIHNEe31jbGFzcyBsRHt9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIGNEe2NvbnN0cnVjdG9yKHQpe3RoaXMubm9ybWFsaXplZE5hbWVzPW5ldyBNYXAsdGhpcy5sYXp5VXBkYXRlPW51bGwsdD90aGlzLmxhenlJbml0PSJzdHJpbmciPT10eXBlb2YgdD8oKT0+e3RoaXMuaGVhZGVycz1uZXcgTWFwLHQuc3BsaXQoIlxuIikuZm9yRWFjaCgodD0+e2NvbnN0IGU9dC5pbmRleE9mKCI6Iik7aWYoZT4wKXtjb25zdCBuPXQuc2xpY2UoMCxlKSxvPW4udG9Mb3dlckNhc2UoKSxpPXQuc2xpY2UoZSsxKS50cmltKCk7dGhpcy5tYXliZVNldE5vcm1hbGl6ZWROYW1lKG4sbyksdGhpcy5oZWFkZXJzLmhhcyhvKT90aGlzLmhlYWRlcnMuZ2V0KG8pLnB1c2goaSk6dGhpcy5oZWFkZXJzLnNldChvLFtpXSl9fSkpfTooKT0+e3RoaXMuaGVhZGVycz1uZXcgTWFwLE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGU9PntsZXQgbj10W2VdO2NvbnN0IG89ZS50b0xvd2VyQ2FzZSgpOyJzdHJpbmciPT10eXBlb2YgbiYmKG49W25dKSxuLmxlbmd0aD4wJiYodGhpcy5oZWFkZXJzLnNldChvLG4pLHRoaXMubWF5YmVTZXROb3JtYWxpemVkTmFtZShlLG8pKX0pKX06dGhpcy5oZWFkZXJzPW5ldyBNYXB9aGFzKHQpe3JldHVybiB0aGlzLmluaXQoKSx0aGlzLmhlYWRlcnMuaGFzKHQudG9Mb3dlckNhc2UoKSl9Z2V0KHQpe3RoaXMuaW5pdCgpO2NvbnN0IGU9dGhpcy5oZWFkZXJzLmdldCh0LnRvTG93ZXJDYXNlKCkpO3JldHVybiBlJiZlLmxlbmd0aD4wP2VbMF06bnVsbH1rZXlzKCl7cmV0dXJuIHRoaXMuaW5pdCgpLEFycmF5LmZyb20odGhpcy5ub3JtYWxpemVkTmFtZXMudmFsdWVzKCkpfWdldEFsbCh0KXtyZXR1cm4gdGhpcy5pbml0KCksdGhpcy5oZWFkZXJzLmdldCh0LnRvTG93ZXJDYXNlKCkpfHxudWxsfWFwcGVuZCh0LGUpe3JldHVybiB0aGlzLmNsb25lKHtuYW1lOnQsdmFsdWU6ZSxvcDoiYSJ9KX1zZXQodCxlKXtyZXR1cm4gdGhpcy5jbG9uZSh7bmFtZTp0LHZhbHVlOmUsb3A6InMifSl9ZGVsZXRlKHQsZSl7cmV0dXJuIHRoaXMuY2xvbmUoe25hbWU6dCx2YWx1ZTplLG9wOiJkIn0pfW1heWJlU2V0Tm9ybWFsaXplZE5hbWUodCxlKXt0aGlzLm5vcm1hbGl6ZWROYW1lcy5oYXMoZSl8fHRoaXMubm9ybWFsaXplZE5hbWVzLnNldChlLHQpfWluaXQoKXt0aGlzLmxhenlJbml0JiYodGhpcy5sYXp5SW5pdCBpbnN0YW5jZW9mIGNEP3RoaXMuY29weUZyb20odGhpcy5sYXp5SW5pdCk6dGhpcy5sYXp5SW5pdCgpLHRoaXMubGF6eUluaXQ9bnVsbCx0aGlzLmxhenlVcGRhdGUmJih0aGlzLmxhenlVcGRhdGUuZm9yRWFjaCgodD0+dGhpcy5hcHBseVVwZGF0ZSh0KSkpLHRoaXMubGF6eVVwZGF0ZT1udWxsKSl9Y29weUZyb20odCl7dC5pbml0KCksQXJyYXkuZnJvbSh0LmhlYWRlcnMua2V5cygpKS5mb3JFYWNoKChlPT57dGhpcy5oZWFkZXJzLnNldChlLHQuaGVhZGVycy5nZXQoZSkpLHRoaXMubm9ybWFsaXplZE5hbWVzLnNldChlLHQubm9ybWFsaXplZE5hbWVzLmdldChlKSl9KSl9Y2xvbmUodCl7Y29uc3QgZT1uZXcgY0Q7cmV0dXJuIGUubGF6eUluaXQ9dGhpcy5sYXp5SW5pdCYmdGhpcy5sYXp5SW5pdCBpbnN0YW5jZW9mIGNEP3RoaXMubGF6eUluaXQ6dGhpcyxlLmxhenlVcGRhdGU9KHRoaXMubGF6eVVwZGF0ZXx8W10pLmNvbmNhdChbdF0pLGV9YXBwbHlVcGRhdGUodCl7Y29uc3QgZT10Lm5hbWUudG9Mb3dlckNhc2UoKTtzd2l0Y2godC5vcCl7Y2FzZSJhIjpjYXNlInMiOmxldCBuPXQudmFsdWU7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYobj1bbl0pLDA9PT1uLmxlbmd0aClyZXR1cm47dGhpcy5tYXliZVNldE5vcm1hbGl6ZWROYW1lKHQubmFtZSxlKTtjb25zdCBvPSgiYSI9PT10Lm9wP3RoaXMuaGVhZGVycy5nZXQoZSk6dm9pZCAwKXx8W107by5wdXNoKC4uLm4pLHRoaXMuaGVhZGVycy5zZXQoZSxvKTticmVhaztjYXNlImQiOmNvbnN0IGk9dC52YWx1ZTtpZihpKXtsZXQgdD10aGlzLmhlYWRlcnMuZ2V0KGUpO2lmKCF0KXJldHVybjt0PXQuZmlsdGVyKCh0PT4tMT09PWkuaW5kZXhPZih0KSkpLDA9PT10Lmxlbmd0aD8odGhpcy5oZWFkZXJzLmRlbGV0ZShlKSx0aGlzLm5vcm1hbGl6ZWROYW1lcy5kZWxldGUoZSkpOnRoaXMuaGVhZGVycy5zZXQoZSx0KX1lbHNlIHRoaXMuaGVhZGVycy5kZWxldGUoZSksdGhpcy5ub3JtYWxpemVkTmFtZXMuZGVsZXRlKGUpfX1mb3JFYWNoKHQpe3RoaXMuaW5pdCgpLEFycmF5LmZyb20odGhpcy5ub3JtYWxpemVkTmFtZXMua2V5cygpKS5mb3JFYWNoKChlPT50KHRoaXMubm9ybWFsaXplZE5hbWVzLmdldChlKSx0aGlzLmhlYWRlcnMuZ2V0KGUpKSkpfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgZER7ZW5jb2RlS2V5KHQpe3JldHVybiBwRCh0KX1lbmNvZGVWYWx1ZSh0KXtyZXR1cm4gcEQodCl9ZGVjb2RlS2V5KHQpe3JldHVybiBkZWNvZGVVUklDb21wb25lbnQodCl9ZGVjb2RlVmFsdWUodCl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0KX19ZnVuY3Rpb24gcEQodCl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh0KS5yZXBsYWNlKC8lNDAvZ2ksIkAiKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZ2ksIiQiKS5yZXBsYWNlKC8lMkMvZ2ksIiwiKS5yZXBsYWNlKC8lM0IvZ2ksIjsiKS5yZXBsYWNlKC8lMkIvZ2ksIisiKS5yZXBsYWNlKC8lM0QvZ2ksIj0iKS5yZXBsYWNlKC8lM0YvZ2ksIj8iKS5yZXBsYWNlKC8lMkYvZ2ksIi8iKX1mdW5jdGlvbiBtRCh0KXtyZXR1cm5gJHt0fWB9Y2xhc3MgdUR7Y29uc3RydWN0b3IodD17fSl7aWYodGhpcy51cGRhdGVzPW51bGwsdGhpcy5jbG9uZUZyb209bnVsbCx0aGlzLmVuY29kZXI9dC5lbmNvZGVyfHxuZXcgZEQsdC5mcm9tU3RyaW5nKXtpZih0LmZyb21PYmplY3QpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qgc3BlY2lmeSBib3RoIGZyb21TdHJpbmcgYW5kIGZyb21PYmplY3QuIik7dGhpcy5tYXA9KGZ1bmN0aW9uIGUodCxuKXtjb25zdCBvPW5ldyBNYXA7cmV0dXJuIHQubGVuZ3RoPjAmJnQucmVwbGFjZSgvXlw/LywiIikuc3BsaXQoIiYiKS5mb3JFYWNoKCh0PT57Y29uc3QgZT10LmluZGV4T2YoIj0iKSxbaSxhXT0tMT09ZT9bbi5kZWNvZGVLZXkodCksIiJdOltuLmRlY29kZUtleSh0LnNsaWNlKDAsZSkpLG4uZGVjb2RlVmFsdWUodC5zbGljZShlKzEpKV0scj1vLmdldChpKXx8W107ci5wdXNoKGEpLG8uc2V0KGkscil9KSksb30pKHQuZnJvbVN0cmluZyx0aGlzLmVuY29kZXIpfWVsc2UgdC5mcm9tT2JqZWN0Pyh0aGlzLm1hcD1uZXcgTWFwLE9iamVjdC5rZXlzKHQuZnJvbU9iamVjdCkuZm9yRWFjaCgoZT0+e2NvbnN0IG49dC5mcm9tT2JqZWN0W2VdO3RoaXMubWFwLnNldChlLEFycmF5LmlzQXJyYXkobik/bjpbbl0pfSkpKTp0aGlzLm1hcD1udWxsfWhhcyh0KXtyZXR1cm4gdGhpcy5pbml0KCksdGhpcy5tYXAuaGFzKHQpfWdldCh0KXt0aGlzLmluaXQoKTtjb25zdCBlPXRoaXMubWFwLmdldCh0KTtyZXR1cm4gZT9lWzBdOm51bGx9Z2V0QWxsKHQpe3JldHVybiB0aGlzLmluaXQoKSx0aGlzLm1hcC5nZXQodCl8fG51bGx9a2V5cygpe3JldHVybiB0aGlzLmluaXQoKSxBcnJheS5mcm9tKHRoaXMubWFwLmtleXMoKSl9YXBwZW5kKHQsZSl7cmV0dXJuIHRoaXMuY2xvbmUoe3BhcmFtOnQsdmFsdWU6ZSxvcDoiYSJ9KX1hcHBlbmRBbGwodCl7Y29uc3QgZT1bXTtyZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaCgobj0+e2NvbnN0IG89dFtuXTtBcnJheS5pc0FycmF5KG8pP28uZm9yRWFjaCgodD0+e2UucHVzaCh7cGFyYW06bix2YWx1ZTp0LG9wOiJhIn0pfSkpOmUucHVzaCh7cGFyYW06bix2YWx1ZTpvLG9wOiJhIn0pfSkpLHRoaXMuY2xvbmUoZSl9c2V0KHQsZSl7cmV0dXJuIHRoaXMuY2xvbmUoe3BhcmFtOnQsdmFsdWU6ZSxvcDoicyJ9KX1kZWxldGUodCxlKXtyZXR1cm4gdGhpcy5jbG9uZSh7cGFyYW06dCx2YWx1ZTplLG9wOiJkIn0pfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuaW5pdCgpLHRoaXMua2V5cygpLm1hcCgodD0+e2NvbnN0IGU9dGhpcy5lbmNvZGVyLmVuY29kZUtleSh0KTtyZXR1cm4gdGhpcy5tYXAuZ2V0KHQpLm1hcCgodD0+ZSsiPSIrdGhpcy5lbmNvZGVyLmVuY29kZVZhbHVlKHQpKSkuam9pbigiJiIpfSkpLmZpbHRlcigodD0+IiIhPT10KSkuam9pbigiJiIpfWNsb25lKHQpe2NvbnN0IGU9bmV3IHVEKHtlbmNvZGVyOnRoaXMuZW5jb2Rlcn0pO3JldHVybiBlLmNsb25lRnJvbT10aGlzLmNsb25lRnJvbXx8dGhpcyxlLnVwZGF0ZXM9KHRoaXMudXBkYXRlc3x8W10pLmNvbmNhdCh0KSxlfWluaXQoKXtudWxsPT09dGhpcy5tYXAmJih0aGlzLm1hcD1uZXcgTWFwKSxudWxsIT09dGhpcy5jbG9uZUZyb20mJih0aGlzLmNsb25lRnJvbS5pbml0KCksdGhpcy5jbG9uZUZyb20ua2V5cygpLmZvckVhY2goKHQ9PnRoaXMubWFwLnNldCh0LHRoaXMuY2xvbmVGcm9tLm1hcC5nZXQodCkpKSksdGhpcy51cGRhdGVzLmZvckVhY2goKHQ9Pntzd2l0Y2godC5vcCl7Y2FzZSJhIjpjYXNlInMiOmNvbnN0IGU9KCJhIj09PXQub3A/dGhpcy5tYXAuZ2V0KHQucGFyYW0pOnZvaWQgMCl8fFtdO2UucHVzaChtRCh0LnZhbHVlKSksdGhpcy5tYXAuc2V0KHQucGFyYW0sZSk7YnJlYWs7Y2FzZSJkIjppZih2b2lkIDA9PT10LnZhbHVlKXt0aGlzLm1hcC5kZWxldGUodC5wYXJhbSk7YnJlYWt9e2xldCBlPXRoaXMubWFwLmdldCh0LnBhcmFtKXx8W107Y29uc3Qgbj1lLmluZGV4T2YobUQodC52YWx1ZSkpOy0xIT09biYmZS5zcGxpY2UobiwxKSxlLmxlbmd0aD4wP3RoaXMubWFwLnNldCh0LnBhcmFtLGUpOnRoaXMubWFwLmRlbGV0ZSh0LnBhcmFtKX19fSkpLHRoaXMuY2xvbmVGcm9tPXRoaXMudXBkYXRlcz1udWxsKX19Y2xhc3MgZkR7Y29uc3RydWN0b3IoKXt0aGlzLm1hcD1uZXcgTWFwfXNldCh0LGUpe3JldHVybiB0aGlzLm1hcC5zZXQodCxlKSx0aGlzfWdldCh0KXtyZXR1cm4gdGhpcy5tYXAuaGFzKHQpfHx0aGlzLm1hcC5zZXQodCx0LmRlZmF1bHRWYWx1ZSgpKSx0aGlzLm1hcC5nZXQodCl9ZGVsZXRlKHQpe3JldHVybiB0aGlzLm1hcC5kZWxldGUodCksdGhpc31rZXlzKCl7cmV0dXJuIHRoaXMubWFwLmtleXMoKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIGdEKHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcn1mdW5jdGlvbiBoRCh0KXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEJsb2ImJnQgaW5zdGFuY2VvZiBCbG9ifWZ1bmN0aW9uIGJEKHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgRm9ybURhdGEmJnQgaW5zdGFuY2VvZiBGb3JtRGF0YX1jbGFzcyB5RHtjb25zdHJ1Y3Rvcih0LGUsbixvKXtsZXQgaTtpZih0aGlzLnVybD1lLHRoaXMuYm9keT1udWxsLHRoaXMucmVwb3J0UHJvZ3Jlc3M9ITEsdGhpcy53aXRoQ3JlZGVudGlhbHM9ITEsdGhpcy5yZXNwb25zZVR5cGU9Impzb24iLHRoaXMubWV0aG9kPXQudG9VcHBlckNhc2UoKSwoZnVuY3Rpb24gYSh0KXtzd2l0Y2godCl7Y2FzZSJERUxFVEUiOmNhc2UiR0VUIjpjYXNlIkhFQUQiOmNhc2UiT1BUSU9OUyI6Y2FzZSJKU09OUCI6cmV0dXJuITE7ZGVmYXVsdDpyZXR1cm4hMH19KSh0aGlzLm1ldGhvZCl8fG8/KHRoaXMuYm9keT12b2lkIDAhPT1uP246bnVsbCxpPW8pOmk9bixpJiYodGhpcy5yZXBvcnRQcm9ncmVzcz0hIWkucmVwb3J0UHJvZ3Jlc3MsdGhpcy53aXRoQ3JlZGVudGlhbHM9ISFpLndpdGhDcmVkZW50aWFscyxpLnJlc3BvbnNlVHlwZSYmKHRoaXMucmVzcG9uc2VUeXBlPWkucmVzcG9uc2VUeXBlKSxpLmhlYWRlcnMmJih0aGlzLmhlYWRlcnM9aS5oZWFkZXJzKSxpLmNvbnRleHQmJih0aGlzLmNvbnRleHQ9aS5jb250ZXh0KSxpLnBhcmFtcyYmKHRoaXMucGFyYW1zPWkucGFyYW1zKSksdGhpcy5oZWFkZXJzfHwodGhpcy5oZWFkZXJzPW5ldyBjRCksdGhpcy5jb250ZXh0fHwodGhpcy5jb250ZXh0PW5ldyBmRCksdGhpcy5wYXJhbXMpe2NvbnN0IHQ9dGhpcy5wYXJhbXMudG9TdHJpbmcoKTtpZigwPT09dC5sZW5ndGgpdGhpcy51cmxXaXRoUGFyYW1zPWU7ZWxzZXtjb25zdCBuPWUuaW5kZXhPZigiPyIpO3RoaXMudXJsV2l0aFBhcmFtcz1lKygtMT09PW4/Ij8iOm48ZS5sZW5ndGgtMT8iJiI6IiIpK3R9fWVsc2UgdGhpcy5wYXJhbXM9bmV3IHVELHRoaXMudXJsV2l0aFBhcmFtcz1lfXNlcmlhbGl6ZUJvZHkoKXtyZXR1cm4gbnVsbD09PXRoaXMuYm9keT9udWxsOmdEKHRoaXMuYm9keSl8fGhEKHRoaXMuYm9keSl8fGJEKHRoaXMuYm9keSl8fChmdW5jdGlvbiB0KGUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgVVJMU2VhcmNoUGFyYW1zJiZlIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zfSkodGhpcy5ib2R5KXx8InN0cmluZyI9PXR5cGVvZiB0aGlzLmJvZHk/dGhpcy5ib2R5OnRoaXMuYm9keSBpbnN0YW5jZW9mIHVEP3RoaXMuYm9keS50b1N0cmluZygpOiJvYmplY3QiPT10eXBlb2YgdGhpcy5ib2R5fHwiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmJvZHl8fEFycmF5LmlzQXJyYXkodGhpcy5ib2R5KT9KU09OLnN0cmluZ2lmeSh0aGlzLmJvZHkpOnRoaXMuYm9keS50b1N0cmluZygpfWRldGVjdENvbnRlbnRUeXBlSGVhZGVyKCl7cmV0dXJuIG51bGw9PT10aGlzLmJvZHl8fGJEKHRoaXMuYm9keSk/bnVsbDpoRCh0aGlzLmJvZHkpP3RoaXMuYm9keS50eXBlfHxudWxsOmdEKHRoaXMuYm9keSk/bnVsbDoic3RyaW5nIj09dHlwZW9mIHRoaXMuYm9keT8idGV4dC9wbGFpbiI6dGhpcy5ib2R5IGluc3RhbmNlb2YgdUQ/ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04Ijoib2JqZWN0Ij09dHlwZW9mIHRoaXMuYm9keXx8Im51bWJlciI9PXR5cGVvZiB0aGlzLmJvZHl8fCJib29sZWFuIj09dHlwZW9mIHRoaXMuYm9keT8iYXBwbGljYXRpb24vanNvbiI6bnVsbH1jbG9uZSh0PXt9KXt2YXIgZTtjb25zdCBuPXQubWV0aG9kfHx0aGlzLm1ldGhvZCxvPXQudXJsfHx0aGlzLnVybCxpPXQucmVzcG9uc2VUeXBlfHx0aGlzLnJlc3BvbnNlVHlwZSxhPXZvaWQgMCE9PXQuYm9keT90LmJvZHk6dGhpcy5ib2R5LHI9dm9pZCAwIT09dC53aXRoQ3JlZGVudGlhbHM/dC53aXRoQ3JlZGVudGlhbHM6dGhpcy53aXRoQ3JlZGVudGlhbHMscz12b2lkIDAhPT10LnJlcG9ydFByb2dyZXNzP3QucmVwb3J0UHJvZ3Jlc3M6dGhpcy5yZXBvcnRQcm9ncmVzcztsZXQgbD10LmhlYWRlcnN8fHRoaXMuaGVhZGVycyxjPXQucGFyYW1zfHx0aGlzLnBhcmFtcztjb25zdCBkPW51bGwhPT0oZT10LmNvbnRleHQpJiZ2b2lkIDAhPT1lP2U6dGhpcy5jb250ZXh0O3JldHVybiB2b2lkIDAhPT10LnNldEhlYWRlcnMmJihsPU9iamVjdC5rZXlzKHQuc2V0SGVhZGVycykucmVkdWNlKCgoZSxuKT0+ZS5zZXQobix0LnNldEhlYWRlcnNbbl0pKSxsKSksdC5zZXRQYXJhbXMmJihjPU9iamVjdC5rZXlzKHQuc2V0UGFyYW1zKS5yZWR1Y2UoKChlLG4pPT5lLnNldChuLHQuc2V0UGFyYW1zW25dKSksYykpLG5ldyB5RChuLG8sYSx7cGFyYW1zOmMsaGVhZGVyczpsLGNvbnRleHQ6ZCxyZXBvcnRQcm9ncmVzczpzLHJlc3BvbnNlVHlwZTppLHdpdGhDcmVkZW50aWFsczpyfSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi92YXIgX0Q7IShmdW5jdGlvbih0KXt0W3QuU2VudD0wXT0iU2VudCIsdFt0LlVwbG9hZFByb2dyZXNzPTFdPSJVcGxvYWRQcm9ncmVzcyIsdFt0LlJlc3BvbnNlSGVhZGVyPTJdPSJSZXNwb25zZUhlYWRlciIsdFt0LkRvd25sb2FkUHJvZ3Jlc3M9M109IkRvd25sb2FkUHJvZ3Jlc3MiLHRbdC5SZXNwb25zZT00XT0iUmVzcG9uc2UiLHRbdC5Vc2VyPTVdPSJVc2VyIn0pKF9EfHwoX0Q9e30pKTtjbGFzcyBDRHtjb25zdHJ1Y3Rvcih0LGU9MjAwLG49Ik9LIil7dGhpcy5oZWFkZXJzPXQuaGVhZGVyc3x8bmV3IGNELHRoaXMuc3RhdHVzPXZvaWQgMCE9PXQuc3RhdHVzP3Quc3RhdHVzOmUsdGhpcy5zdGF0dXNUZXh0PXQuc3RhdHVzVGV4dHx8bix0aGlzLnVybD10LnVybHx8bnVsbCx0aGlzLm9rPXRoaXMuc3RhdHVzPj0yMDAmJnRoaXMuc3RhdHVzPDMwMH19Y2xhc3MgTUQgZXh0ZW5kcyBDRHtjb25zdHJ1Y3Rvcih0PXt9KXtzdXBlcih0KSx0aGlzLnR5cGU9X0QuUmVzcG9uc2VIZWFkZXJ9Y2xvbmUodD17fSl7cmV0dXJuIG5ldyBNRCh7aGVhZGVyczp0LmhlYWRlcnN8fHRoaXMuaGVhZGVycyxzdGF0dXM6dm9pZCAwIT09dC5zdGF0dXM/dC5zdGF0dXM6dGhpcy5zdGF0dXMsc3RhdHVzVGV4dDp0LnN0YXR1c1RleHR8fHRoaXMuc3RhdHVzVGV4dCx1cmw6dC51cmx8fHRoaXMudXJsfHx2b2lkIDB9KX19Y2xhc3MgdkQgZXh0ZW5kcyBDRHtjb25zdHJ1Y3Rvcih0PXt9KXtzdXBlcih0KSx0aGlzLnR5cGU9X0QuUmVzcG9uc2UsdGhpcy5ib2R5PXZvaWQgMCE9PXQuYm9keT90LmJvZHk6bnVsbH1jbG9uZSh0PXt9KXtyZXR1cm4gbmV3IHZEKHtib2R5OnZvaWQgMCE9PXQuYm9keT90LmJvZHk6dGhpcy5ib2R5LGhlYWRlcnM6dC5oZWFkZXJzfHx0aGlzLmhlYWRlcnMsc3RhdHVzOnZvaWQgMCE9PXQuc3RhdHVzP3Quc3RhdHVzOnRoaXMuc3RhdHVzLHN0YXR1c1RleHQ6dC5zdGF0dXNUZXh0fHx0aGlzLnN0YXR1c1RleHQsdXJsOnQudXJsfHx0aGlzLnVybHx8dm9pZCAwfSl9fWNsYXNzIHhEIGV4dGVuZHMgQ0R7Y29uc3RydWN0b3IodCl7c3VwZXIodCwwLCJVbmtub3duIEVycm9yIiksdGhpcy5uYW1lPSJIdHRwRXJyb3JSZXNwb25zZSIsdGhpcy5vaz0hMSx0aGlzLm1lc3NhZ2U9dGhpcy5zdGF0dXM+PTIwMCYmdGhpcy5zdGF0dXM8MzAwP2BIdHRwIGZhaWx1cmUgZHVyaW5nIHBhcnNpbmcgZm9yICR7dC51cmx8fCIodW5rbm93biB1cmwpIn1gOmBIdHRwIGZhaWx1cmUgcmVzcG9uc2UgZm9yICR7dC51cmx8fCIodW5rbm93biB1cmwpIn06ICR7dC5zdGF0dXN9ICR7dC5zdGF0dXNUZXh0fWAsdGhpcy5lcnJvcj10LmVycm9yfHxudWxsfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gT0QodCxlKXtyZXR1cm57Ym9keTplLGhlYWRlcnM6dC5oZWFkZXJzLGNvbnRleHQ6dC5jb250ZXh0LG9ic2VydmU6dC5vYnNlcnZlLHBhcmFtczp0LnBhcmFtcyxyZXBvcnRQcm9ncmVzczp0LnJlcG9ydFByb2dyZXNzLHJlc3BvbnNlVHlwZTp0LnJlc3BvbnNlVHlwZSx3aXRoQ3JlZGVudGlhbHM6dC53aXRoQ3JlZGVudGlhbHN9fWNsYXNzIFBEe2NvbnN0cnVjdG9yKHQpe3RoaXMuaGFuZGxlcj10fXJlcXVlc3QodCxlLG49e30pe2xldCBvO2lmKHQgaW5zdGFuY2VvZiB5RClvPXQ7ZWxzZXtsZXQgaSxhO2k9bi5oZWFkZXJzIGluc3RhbmNlb2YgY0Q/bi5oZWFkZXJzOm5ldyBjRChuLmhlYWRlcnMpLG4ucGFyYW1zJiYoYT1uLnBhcmFtcyBpbnN0YW5jZW9mIHVEP24ucGFyYW1zOm5ldyB1RCh7ZnJvbU9iamVjdDpuLnBhcmFtc30pKSxvPW5ldyB5RCh0LGUsdm9pZCAwIT09bi5ib2R5P24uYm9keTpudWxsLHtoZWFkZXJzOmksY29udGV4dDpuLmNvbnRleHQscGFyYW1zOmEscmVwb3J0UHJvZ3Jlc3M6bi5yZXBvcnRQcm9ncmVzcyxyZXNwb25zZVR5cGU6bi5yZXNwb25zZVR5cGV8fCJqc29uIix3aXRoQ3JlZGVudGlhbHM6bi53aXRoQ3JlZGVudGlhbHN9KX1jb25zdCBpPUV0KG8pLnBpcGUoKGZ1bmN0aW9uIGEodCxlKXtyZXR1cm4gbChlKT9adCh0LGUsMSk6WnQodCwxKX0pKCh0PT50aGlzLmhhbmRsZXIuaGFuZGxlKHQpKSkpO2lmKHQgaW5zdGFuY2VvZiB5RHx8ImV2ZW50cyI9PT1uLm9ic2VydmUpcmV0dXJuIGk7Y29uc3Qgcj1pLnBpcGUoY2UoKHQ9PnQgaW5zdGFuY2VvZiB2RCkpKTtzd2l0Y2gobi5vYnNlcnZlfHwiYm9keSIpe2Nhc2UiYm9keSI6c3dpdGNoKG8ucmVzcG9uc2VUeXBlKXtjYXNlImFycmF5YnVmZmVyIjpyZXR1cm4gci5waXBlKEl0KCh0PT57aWYobnVsbCE9PXQuYm9keSYmISh0LmJvZHkgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpdGhyb3cgbmV3IEVycm9yKCJSZXNwb25zZSBpcyBub3QgYW4gQXJyYXlCdWZmZXIuIik7cmV0dXJuIHQuYm9keX0pKSk7Y2FzZSJibG9iIjpyZXR1cm4gci5waXBlKEl0KCh0PT57aWYobnVsbCE9PXQuYm9keSYmISh0LmJvZHkgaW5zdGFuY2VvZiBCbG9iKSl0aHJvdyBuZXcgRXJyb3IoIlJlc3BvbnNlIGlzIG5vdCBhIEJsb2IuIik7cmV0dXJuIHQuYm9keX0pKSk7Y2FzZSJ0ZXh0IjpyZXR1cm4gci5waXBlKEl0KCh0PT57aWYobnVsbCE9PXQuYm9keSYmInN0cmluZyIhPXR5cGVvZiB0LmJvZHkpdGhyb3cgbmV3IEVycm9yKCJSZXNwb25zZSBpcyBub3QgYSBzdHJpbmcuIik7cmV0dXJuIHQuYm9keX0pKSk7Y2FzZSJqc29uIjpkZWZhdWx0OnJldHVybiByLnBpcGUoSXQoKHQ9PnQuYm9keSkpKX1jYXNlInJlc3BvbnNlIjpyZXR1cm4gcjtkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5yZWFjaGFibGU6IHVuaGFuZGxlZCBvYnNlcnZlIHR5cGUgJHtuLm9ic2VydmV9fWApfX1kZWxldGUodCxlPXt9KXtyZXR1cm4gdGhpcy5yZXF1ZXN0KCJERUxFVEUiLHQsZSl9Z2V0KHQsZT17fSl7cmV0dXJuIHRoaXMucmVxdWVzdCgiR0VUIix0LGUpfWhlYWQodCxlPXt9KXtyZXR1cm4gdGhpcy5yZXF1ZXN0KCJIRUFEIix0LGUpfWpzb25wKHQsZSl7cmV0dXJuIHRoaXMucmVxdWVzdCgiSlNPTlAiLHQse3BhcmFtczoobmV3IHVEKS5hcHBlbmQoZSwiSlNPTlBfQ0FMTEJBQ0siKSxvYnNlcnZlOiJib2R5IixyZXNwb25zZVR5cGU6Impzb24ifSl9b3B0aW9ucyh0LGU9e30pe3JldHVybiB0aGlzLnJlcXVlc3QoIk9QVElPTlMiLHQsZSl9cGF0Y2godCxlLG49e30pe3JldHVybiB0aGlzLnJlcXVlc3QoIlBBVENIIix0LE9EKG4sZSkpfXBvc3QodCxlLG49e30pe3JldHVybiB0aGlzLnJlcXVlc3QoIlBPU1QiLHQsT0QobixlKSl9cHV0KHQsZSxuPXt9KXtyZXR1cm4gdGhpcy5yZXF1ZXN0KCJQVVQiLHQsT0QobixlKSl9fVBELsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxQRCkodnIoc0QpKX0sUEQuybVwcm92PU1uKHt0b2tlbjpQRCxmYWN0b3J5OlBELsm1ZmFjfSksUEQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpzRH1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUEQsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnNEfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIHdEe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5uZXh0PXQsdGhpcy5pbnRlcmNlcHRvcj1lfWhhbmRsZSh0KXtyZXR1cm4gdGhpcy5pbnRlcmNlcHRvci5pbnRlcmNlcHQodCx0aGlzLm5leHQpfX1jb25zdCBrRD1uZXcgR2EoIkhUVFBfSU5URVJDRVBUT1JTIik7Y2xhc3MgU0R7aW50ZXJjZXB0KHQsZSl7cmV0dXJuIGUuaGFuZGxlKHQpfX1TRC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8U0QpfSxTRC7JtXByb3Y9TW4oe3Rva2VuOlNELGZhY3Rvcnk6U0QuybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFNELFt7dHlwZTppbX1dLG51bGwsbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpsZXQgREQ9MDtjbGFzcyBFRHt9Y2xhc3MgUkR7Y29uc3RydWN0b3IodCxlKXt0aGlzLmNhbGxiYWNrTWFwPXQsdGhpcy5kb2N1bWVudD1lLHRoaXMucmVzb2x2ZWRQcm9taXNlPVByb21pc2UucmVzb2x2ZSgpfW5leHRDYWxsYmFjaygpe3JldHVybiJuZ19qc29ucF9jYWxsYmFja18iK0REKyt9aGFuZGxlKHQpe2lmKCJKU09OUCIhPT10Lm1ldGhvZCl0aHJvdyBuZXcgRXJyb3IoIkpTT05QIHJlcXVlc3RzIG11c3QgdXNlIEpTT05QIHJlcXVlc3QgbWV0aG9kLiIpO2lmKCJqc29uIiE9PXQucmVzcG9uc2VUeXBlKXRocm93IG5ldyBFcnJvcigiSlNPTlAgcmVxdWVzdHMgbXVzdCB1c2UgSnNvbiByZXNwb25zZSB0eXBlLiIpO3JldHVybiBuZXcgRCgoZT0+e2NvbnN0IG49dGhpcy5uZXh0Q2FsbGJhY2soKSxvPXQudXJsV2l0aFBhcmFtcy5yZXBsYWNlKC89SlNPTlBfQ0FMTEJBQ0soJnwkKS8sYD0ke259JDFgKSxpPXRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aS5zcmM9bztsZXQgYT1udWxsLHI9ITEscz0hMTt0aGlzLmNhbGxiYWNrTWFwW25dPXQ9PntkZWxldGUgdGhpcy5jYWxsYmFja01hcFtuXSxzfHwoYT10LHI9ITApfTtjb25zdCBsPSgpPT57aS5wYXJlbnROb2RlJiZpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaSksZGVsZXRlIHRoaXMuY2FsbGJhY2tNYXBbbl19LGM9dD0+e3N8fHRoaXMucmVzb2x2ZWRQcm9taXNlLnRoZW4oKCgpPT57bCgpLHI/KGUubmV4dChuZXcgdkQoe2JvZHk6YSxzdGF0dXM6MjAwLHN0YXR1c1RleHQ6Ik9LIix1cmw6b30pKSxlLmNvbXBsZXRlKCkpOmUuZXJyb3IobmV3IHhEKHt1cmw6byxzdGF0dXM6MCxzdGF0dXNUZXh0OiJKU09OUCBFcnJvciIsZXJyb3I6bmV3IEVycm9yKCJKU09OUCBpbmplY3RlZCBzY3JpcHQgZGlkIG5vdCBpbnZva2UgY2FsbGJhY2suIil9KSl9KSl9LGQ9dD0+e3N8fChsKCksZS5lcnJvcihuZXcgeEQoe2Vycm9yOnQsc3RhdHVzOjAsc3RhdHVzVGV4dDoiSlNPTlAgRXJyb3IiLHVybDpvfSkpKX07cmV0dXJuIGkuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsYyksaS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZCksdGhpcy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGkpLGUubmV4dCh7dHlwZTpfRC5TZW50fSksKCk9PntzPSEwLGkucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsYyksaS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsZCksbCgpfX0pKX19UkQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFJEKSh2cihFRCksdnIoWl8pKX0sUkQuybVwcm92PU1uKHt0b2tlbjpSRCxmYWN0b3J5OlJELsm1ZmFjfSksUkQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpFRH0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChSRCxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6RUR9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSksbnVsbCk7Y2xhc3MgQUR7Y29uc3RydWN0b3IodCl7dGhpcy5qc29ucD10fWludGVyY2VwdCh0LGUpe3JldHVybiJKU09OUCI9PT10Lm1ldGhvZD90aGlzLmpzb25wLmhhbmRsZSh0KTplLmhhbmRsZSh0KX19QUQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEFEKSh2cihSRCkpfSxBRC7JtXByb3Y9TW4oe3Rva2VuOkFELGZhY3Rvcnk6QUQuybVmYWN9KSxBRC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlJEfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChBRCxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6UkR9XX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgVEQ9L15cKVxdXH0nLD9cbi87Y2xhc3MgTkR7Y29uc3RydWN0b3IodCl7dGhpcy54aHJGYWN0b3J5PXR9aGFuZGxlKHQpe2lmKCJKU09OUCI9PT10Lm1ldGhvZCl0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHRlZCB0byBjb25zdHJ1Y3QgSnNvbnAgcmVxdWVzdCB3aXRob3V0IEh0dHBDbGllbnRKc29ucE1vZHVsZSBpbnN0YWxsZWQuIik7cmV0dXJuIG5ldyBEKChlPT57Y29uc3Qgbj10aGlzLnhockZhY3RvcnkuYnVpbGQoKTtpZihuLm9wZW4odC5tZXRob2QsdC51cmxXaXRoUGFyYW1zKSx0LndpdGhDcmVkZW50aWFscyYmKG4ud2l0aENyZWRlbnRpYWxzPSEwKSx0LmhlYWRlcnMuZm9yRWFjaCgoKHQsZSk9Pm4uc2V0UmVxdWVzdEhlYWRlcih0LGUuam9pbigiLCIpKSkpLHQuaGVhZGVycy5oYXMoIkFjY2VwdCIpfHxuLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsImFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKiIpLCF0LmhlYWRlcnMuaGFzKCJDb250ZW50LVR5cGUiKSl7Y29uc3QgZT10LmRldGVjdENvbnRlbnRUeXBlSGVhZGVyKCk7bnVsbCE9PWUmJm4uc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixlKX1pZih0LnJlc3BvbnNlVHlwZSl7Y29uc3QgZT10LnJlc3BvbnNlVHlwZS50b0xvd2VyQ2FzZSgpO24ucmVzcG9uc2VUeXBlPSJqc29uIiE9PWU/ZToidGV4dCJ9Y29uc3Qgbz10LnNlcmlhbGl6ZUJvZHkoKTtsZXQgaT1udWxsO2NvbnN0IGE9KCk9PntpZihudWxsIT09aSlyZXR1cm4gaTtjb25zdCBlPTEyMjM9PT1uLnN0YXR1cz8yMDQ6bi5zdGF0dXMsbz1uLnN0YXR1c1RleHR8fCJPSyIsYT1uZXcgY0Qobi5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkscj0oZnVuY3Rpb24gcyh0KXtyZXR1cm4icmVzcG9uc2VVUkwiaW4gdCYmdC5yZXNwb25zZVVSTD90LnJlc3BvbnNlVVJMOi9eWC1SZXF1ZXN0LVVSTDovbS50ZXN0KHQuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpP3QuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtUmVxdWVzdC1VUkwiKTpudWxsfSkobil8fHQudXJsO3JldHVybiBpPW5ldyBNRCh7aGVhZGVyczphLHN0YXR1czplLHN0YXR1c1RleHQ6byx1cmw6cn0pLGl9LHI9KCk9PntsZXR7aGVhZGVyczpvLHN0YXR1czppLHN0YXR1c1RleHQ6cix1cmw6c309YSgpLGw9bnVsbDsyMDQhPT1pJiYobD12b2lkIDA9PT1uLnJlc3BvbnNlP24ucmVzcG9uc2VUZXh0Om4ucmVzcG9uc2UpLDA9PT1pJiYoaT1sPzIwMDowKTtsZXQgYz1pPj0yMDAmJmk8MzAwO2lmKCJqc29uIj09PXQucmVzcG9uc2VUeXBlJiYic3RyaW5nIj09dHlwZW9mIGwpe2NvbnN0IHQ9bDtsPWwucmVwbGFjZShURCwiIik7dHJ5e2w9IiIhPT1sP0pTT04ucGFyc2UobCk6bnVsbH1jYXRjaChlKXtsPXQsYyYmKGM9ITEsbD17ZXJyb3I6ZSx0ZXh0Omx9KX19Yz8oZS5uZXh0KG5ldyB2RCh7Ym9keTpsLGhlYWRlcnM6byxzdGF0dXM6aSxzdGF0dXNUZXh0OnIsdXJsOnN8fHZvaWQgMH0pKSxlLmNvbXBsZXRlKCkpOmUuZXJyb3IobmV3IHhEKHtlcnJvcjpsLGhlYWRlcnM6byxzdGF0dXM6aSxzdGF0dXNUZXh0OnIsdXJsOnN8fHZvaWQgMH0pKX0scz10PT57Y29uc3R7dXJsOm99PWEoKSxpPW5ldyB4RCh7ZXJyb3I6dCxzdGF0dXM6bi5zdGF0dXN8fDAsc3RhdHVzVGV4dDpuLnN0YXR1c1RleHR8fCJVbmtub3duIEVycm9yIix1cmw6b3x8dm9pZCAwfSk7ZS5lcnJvcihpKX07bGV0IGw9ITE7Y29uc3QgYz1vPT57bHx8KGUubmV4dChhKCkpLGw9ITApO2xldCBpPXt0eXBlOl9ELkRvd25sb2FkUHJvZ3Jlc3MsbG9hZGVkOm8ubG9hZGVkfTtvLmxlbmd0aENvbXB1dGFibGUmJihpLnRvdGFsPW8udG90YWwpLCJ0ZXh0Ij09PXQucmVzcG9uc2VUeXBlJiZuLnJlc3BvbnNlVGV4dCYmKGkucGFydGlhbFRleHQ9bi5yZXNwb25zZVRleHQpLGUubmV4dChpKX0sZD10PT57bGV0IG49e3R5cGU6X0QuVXBsb2FkUHJvZ3Jlc3MsbG9hZGVkOnQubG9hZGVkfTt0Lmxlbmd0aENvbXB1dGFibGUmJihuLnRvdGFsPXQudG90YWwpLGUubmV4dChuKX07cmV0dXJuIG4uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsciksbi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIscyksbi5hZGRFdmVudExpc3RlbmVyKCJ0aW1lb3V0IixzKSxuLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixzKSx0LnJlcG9ydFByb2dyZXNzJiYobi5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsYyksbnVsbCE9PW8mJm4udXBsb2FkJiZuLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZCkpLG4uc2VuZChvKSxlLm5leHQoe3R5cGU6X0QuU2VudH0pLCgpPT57bi5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIscyksbi5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIscyksbi5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixyKSxuLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWVvdXQiLHMpLHQucmVwb3J0UHJvZ3Jlc3MmJihuLnJlbW92ZUV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixjKSxudWxsIT09byYmbi51cGxvYWQmJm4udXBsb2FkLnJlbW92ZUV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixkKSksbi5yZWFkeVN0YXRlIT09bi5ET05FJiZuLmFib3J0KCl9fSkpfX1ORC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8TkQpKHZyKFhNKSl9LE5ELsm1cHJvdj1Nbih7dG9rZW46TkQsZmFjdG9yeTpORC7JtWZhY30pLE5ELmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6WE19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKE5ELFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpYTX1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCB6RD1uZXcgR2EoIlhTUkZfQ09PS0lFX05BTUUiKSxJRD1uZXcgR2EoIlhTUkZfSEVBREVSX05BTUUiKTtjbGFzcyBIRHt9Y2xhc3MgRkR7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuZG9jPXQsdGhpcy5wbGF0Zm9ybT1lLHRoaXMuY29va2llTmFtZT1uLHRoaXMubGFzdENvb2tpZVN0cmluZz0iIix0aGlzLmxhc3RUb2tlbj1udWxsLHRoaXMucGFyc2VDb3VudD0wfWdldFRva2VuKCl7aWYoInNlcnZlciI9PT10aGlzLnBsYXRmb3JtKXJldHVybiBudWxsO2NvbnN0IHQ9dGhpcy5kb2MuY29va2llfHwiIjtyZXR1cm4gdCE9PXRoaXMubGFzdENvb2tpZVN0cmluZyYmKHRoaXMucGFyc2VDb3VudCsrLHRoaXMubGFzdFRva2VuPWlNKHQsdGhpcy5jb29raWVOYW1lKSx0aGlzLmxhc3RDb29raWVTdHJpbmc9dCksdGhpcy5sYXN0VG9rZW59fUZELsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxGRCkodnIoWl8pLHZyKGp5KSx2cih6RCkpfSxGRC7JtXByb3Y9TW4oe3Rva2VuOkZELGZhY3Rvcnk6RkQuybVmYWN9KSxGRC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W2p5XX1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbekRdfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEZELFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltqeV19XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3pEXX1dfV19KSxudWxsKTtjbGFzcyBMRHtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMudG9rZW5TZXJ2aWNlPXQsdGhpcy5oZWFkZXJOYW1lPWV9aW50ZXJjZXB0KHQsZSl7Y29uc3Qgbj10LnVybC50b0xvd2VyQ2FzZSgpO2lmKCJHRVQiPT09dC5tZXRob2R8fCJIRUFEIj09PXQubWV0aG9kfHxuLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKXx8bi5zdGFydHNXaXRoKCJodHRwczovLyIpKXJldHVybiBlLmhhbmRsZSh0KTtjb25zdCBvPXRoaXMudG9rZW5TZXJ2aWNlLmdldFRva2VuKCk7cmV0dXJuIG51bGw9PT1vfHx0LmhlYWRlcnMuaGFzKHRoaXMuaGVhZGVyTmFtZSl8fCh0PXQuY2xvbmUoe2hlYWRlcnM6dC5oZWFkZXJzLnNldCh0aGlzLmhlYWRlck5hbWUsbyl9KSksZS5oYW5kbGUodCl9fUxELsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxMRCkodnIoSEQpLHZyKElEKSl9LExELsm1cHJvdj1Nbih7dG9rZW46TEQsZmFjdG9yeTpMRC7JtWZhY30pLExELmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6SER9LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltJRF19XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoTEQsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkhEfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbSURdfV19XX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgQkR7Y29uc3RydWN0b3IodCxlKXt0aGlzLmJhY2tlbmQ9dCx0aGlzLmluamVjdG9yPWUsdGhpcy5jaGFpbj1udWxsfWhhbmRsZSh0KXtpZihudWxsPT09dGhpcy5jaGFpbil7Y29uc3QgdD10aGlzLmluamVjdG9yLmdldChrRCxbXSk7dGhpcy5jaGFpbj10LnJlZHVjZVJpZ2h0KCgodCxlKT0+bmV3IHdEKHQsZSkpLHRoaXMuYmFja2VuZCl9cmV0dXJuIHRoaXMuY2hhaW4uaGFuZGxlKHQpfX1mdW5jdGlvbiBWRCgpe3JldHVybiJvYmplY3QiPT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fX1CRC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8QkQpKHZyKGxEKSx2cihycCkpfSxCRC7JtXByb3Y9TW4oe3Rva2VuOkJELGZhY3Rvcnk6QkQuybVmYWN9KSxCRC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmxEfSx7dHlwZTpycH1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQkQsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmxEfSx7dHlwZTpycH1dfSksbnVsbCk7Y2xhc3MgakR7c3RhdGljIGRpc2FibGUoKXtyZXR1cm57bmdNb2R1bGU6akQscHJvdmlkZXJzOlt7cHJvdmlkZTpMRCx1c2VDbGFzczpTRH1dfX1zdGF0aWMgd2l0aE9wdGlvbnModD17fSl7cmV0dXJue25nTW9kdWxlOmpELHByb3ZpZGVyczpbdC5jb29raWVOYW1lP3twcm92aWRlOnpELHVzZVZhbHVlOnQuY29va2llTmFtZX06W10sdC5oZWFkZXJOYW1lP3twcm92aWRlOklELHVzZVZhbHVlOnQuaGVhZGVyTmFtZX06W11dfX19akQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGpEKX0sakQuybVtb2Q9YW8oe3R5cGU6akR9KSxqRC7JtWluaj12bih7cHJvdmlkZXJzOltMRCx7cHJvdmlkZTprRCx1c2VFeGlzdGluZzpMRCxtdWx0aTohMH0se3Byb3ZpZGU6SEQsdXNlQ2xhc3M6RkR9LHtwcm92aWRlOnpELHVzZVZhbHVlOiJYU1JGLVRPS0VOIn0se3Byb3ZpZGU6SUQsdXNlVmFsdWU6IlgtWFNSRi1UT0tFTiJ9XX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoakQsW3t0eXBlOkF5LGFyZ3M6W3twcm92aWRlcnM6W0xELHtwcm92aWRlOmtELHVzZUV4aXN0aW5nOkxELG11bHRpOiEwfSx7cHJvdmlkZTpIRCx1c2VDbGFzczpGRH0se3Byb3ZpZGU6ekQsdXNlVmFsdWU6IlhTUkYtVE9LRU4ifSx7cHJvdmlkZTpJRCx1c2VWYWx1ZToiWC1YU1JGLVRPS0VOIn1dfV19XSxudWxsLG51bGwpO2NsYXNzIFVEe31VRC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VUQpfSxVRC7JtW1vZD1hbyh7dHlwZTpVRH0pLFVELsm1aW5qPXZuKHtwcm92aWRlcnM6W1BELHtwcm92aWRlOnNELHVzZUNsYXNzOkJEfSxORCx7cHJvdmlkZTpsRCx1c2VFeGlzdGluZzpORH1dLGltcG9ydHM6W1tqRC53aXRoT3B0aW9ucyh7Y29va2llTmFtZToiWFNSRi1UT0tFTiIsaGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIn0pXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFVELFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbakQud2l0aE9wdGlvbnMoe2Nvb2tpZU5hbWU6IlhTUkYtVE9LRU4iLGhlYWRlck5hbWU6IlgtWFNSRi1UT0tFTiJ9KV0scHJvdmlkZXJzOltQRCx7cHJvdmlkZTpzRCx1c2VDbGFzczpCRH0sTkQse3Byb3ZpZGU6bEQsdXNlRXhpc3Rpbmc6TkR9XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFVELHtpbXBvcnRzOltqRF19KTtjbGFzcyBHRHt9R0QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEdEKX0sR0QuybVtb2Q9YW8oe3R5cGU6R0R9KSxHRC7JtWluaj12bih7cHJvdmlkZXJzOltSRCx7cHJvdmlkZTpFRCx1c2VGYWN0b3J5OlZEfSx7cHJvdmlkZTprRCx1c2VDbGFzczpBRCxtdWx0aTohMH1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChHRCxbe3R5cGU6QXksYXJnczpbe3Byb3ZpZGVyczpbUkQse3Byb3ZpZGU6RUQsdXNlRmFjdG9yeTpWRH0se3Byb3ZpZGU6a0QsdXNlQ2xhc3M6QUQsbXVsdGk6ITB9XX1dfV0sbnVsbCxudWxsKTtjb25zdCBXRD0iZmVhdHVyZSIsWUQ9S3coV0QpLHFEPVp3KFlELCh0PT50LmlzRmVhdHVyZUZsYWdzTG9hZGVkKSksWkQ9WncoWUQsKHQ9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmRlZmF1bHRGbGFncyksdC5mbGFnT3ZlcnJpZGVzKSkpLFhEPVp3KFlELCh0PT50LmZsYWdPdmVycmlkZXN8fHt9KSksS0Q9WncoWkQsKHQ9PnQuaXNBdXRvRGFya01vZGVBbGxvd2VkKSksSkQ9WncoWkQsKHQ9Pm51bGwhPT10LmVuYWJsZURhcmtNb2RlT3ZlcnJpZGU/dC5lbmFibGVEYXJrTW9kZU92ZXJyaWRlOnQuZGVmYXVsdEVuYWJsZURhcmtNb2RlKSksUUQ9WncoWkQsKHQ9PnQuZW5hYmxlRGFya01vZGVPdmVycmlkZSkpLCREPVp3KFpELCh0PT50LmVuYWJsZWRFeHBlcmltZW50YWxQbHVnaW5zKSksdEU9WncoWkQsKHQ9PnQuaW5Db2xhYikpLGVFPVp3KFpELCh0PT50LmVuYWJsZWRDb2xvckdyb3VwKSksbkU9WncoWkQsKHQ9PnQuZW5hYmxlZENvbG9yR3JvdXBCeVJlZ2V4KSksb0U9WncoWkQsKHQ9PnQubWV0cmljc0ltYWdlU3VwcG9ydEVuYWJsZWQpKSxpRT1adyhaRCwodD0+dC5lbmFibGVkTGlua2VkVGltZSkpLGFFPVp3KFpELCh0PT50LmVuYWJsZVRpbWVTZXJpZXNQcm9tb3Rpb24pKTtmdW5jdGlvbiByRSh0KXtjb25zdCBlPXt9O2Zvcihjb25zdFtuLG9db2YgdC5lbnRyaWVzKCkpZVtuXT1vO3JldHVybiBlfWZ1bmN0aW9uIHNFKHQpe2xldCBlPXQuaGVhZGVyc3x8bmV3IGNEO3JldHVybiBlPWUuYXBwZW5kKCJYLVhTUkYtUHJvdGVjdGVkIiwiMSIpLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7aGVhZGVyczplfSl9Y2xhc3MgbEV7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuYXBwUm9vdFByb3ZpZGVyPXQsdGhpcy5odHRwPWUsdGhpcy5zdG9yZT1ufXJlc29sdmVBcHBSb290KHQpe3JldHVybiB0LnN0YXJ0c1dpdGgoIi8iKT90aGlzLmFwcFJvb3RQcm92aWRlci5nZXRBYnNQYXRobmFtZVdpdGhBcHBSb290KHQpOnR9Z2V0KHQsZT17fSl7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5yZXNvbHZlQXBwUm9vdCh0KSxlKX1wb3N0KHQsZSxuPXt9KXtyZXR1cm4gbj1zRShuKSx0aGlzLnN0b3JlLnNlbGVjdChxRCkucGlwZShjZSgodD0+Qm9vbGVhbih0KSkpLGJlKDEpLFZlKHRoaXMuc3RvcmUuc2VsZWN0KHRFKSksWnQoKChbLG9dKT0+e2NvbnN0IGk9dGhpcy5yZXNvbHZlQXBwUm9vdCh0KTtyZXR1cm4gbz90aGlzLmh0dHAuZ2V0KGkse2hlYWRlcnM6bi5oZWFkZXJzLHBhcmFtczpyRShlKX0pOnRoaXMuaHR0cC5wb3N0KGksZSxuKX0pKSl9cHV0KHQsZSxuPXt9KXtyZXR1cm4gdGhpcy5odHRwLnB1dCh0aGlzLnJlc29sdmVBcHBSb290KHQpLGUsc0UobikpfWRlbGV0ZSh0LGU9e30pe3JldHVybiB0aGlzLmh0dHAuZGVsZXRlKHRoaXMucmVzb2x2ZUFwcFJvb3QodCksc0UoZSkpfX1sRS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bEUpKHZyKGVTKSx2cihQRCksdnIoSXcpKX0sbEUuybVwcm92PU1uKHt0b2tlbjpsRSxmYWN0b3J5OmxFLsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChsRSxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6ZVN9LHt0eXBlOlBEfSx7dHlwZTpJd31dfSksbnVsbCk7Y2xhc3MgY0V7fXZhciBkRSxwRSxtRTtjRS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8Y0UpfSxjRS7JtW1vZD1hbyh7dHlwZTpjRX0pLGNFLsm1aW5qPXZuKHtwcm92aWRlcnM6W2xFXSxpbXBvcnRzOltbVUQsaVNdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoY0UsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltVRCxpU10scHJvdmlkZXJzOltsRV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhjRSx7aW1wb3J0czpbVUQsaVNdfSksKGZ1bmN0aW9uKHQpe3QuU1RFUD0ic3RlcCIsdC5XQUxMX1RJTUU9IndhbGxfdGltZSIsdC5SRUxBVElWRT0icmVsYXRpdmUifSkoZEV8fChkRT17fSkpLChmdW5jdGlvbih0KXt0Lk9GRlNFVD0ib2Zmc2V0Iix0Lk9WRVJMQVk9Im92ZXJsYXkifSkocEV8fChwRT17fSkpLChmdW5jdGlvbih0KXt0LlVOS05PV049IlVOS05PV04iLHQuTk9UX0ZPVU5EPSJOT1RfRk9VTkQifSkobUV8fChtRT17fSkpO2NvbnN0IHVFPW5ldyBHYSgiVGVuc29yQm9hcmQgYnJhbmQgbmFtZSIpO2Z1bmN0aW9uIGZFKHQpe2xldCBlPW1FLlVOS05PV047cmV0dXJuIHQgaW5zdGFuY2VvZiB4RCYmNDA0PT09dC5zdGF0dXMmJihlPW1FLk5PVF9GT1VORCksUnQobmV3IGdFKGUpKX1jbGFzcyBnRXtjb25zdHJ1Y3Rvcih0KXt0aGlzLmZhaWx1cmVDb2RlPXR9fWNsYXNzIGhFe2NvbnN0cnVjdG9yKHQpe3RoaXMuaHR0cD10LHRoaXMudGZCYWNrZW5kPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRmLWJhY2tlbmQiKS50Zl9iYWNrZW5kfWZldGNoUGx1Z2luc0xpc3RpbmcodCl7Y29uc3QgZT0oZnVuY3Rpb24gbih0KXtpZighdC5sZW5ndGgpcmV0dXJuIG51bGw7Y29uc3QgZT1uZXcgVVJMU2VhcmNoUGFyYW1zO2Zvcihjb25zdCBuIG9mIHQpZS5hcHBlbmQoImV4cGVyaW1lbnRhbFBsdWdpbiIsbik7cmV0dXJuIGV9KSh0KSxvPWU/YGRhdGEvcGx1Z2luc19saXN0aW5nPyR7ZS50b1N0cmluZygpfWA6ImRhdGEvcGx1Z2luc19saXN0aW5nIjtyZXR1cm4gdGhpcy5odHRwLmdldChvKS5waXBlKHBlKGZFKSl9ZmV0Y2hFbnZpcm9ubWVudCgpe3JldHVybiAkdChbdGhpcy5odHRwLmdldCgiZGF0YS9lbnZpcm9ubWVudCIpLEN0KHRoaXMudGZCYWNrZW5kLmVudmlyb25tZW50U3RvcmUucmVmcmVzaCgpKV0pLnBpcGUoSXQoKChbdF0pPT50KSkscGUoZkUpKX19aEUuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGhFKSh2cihsRSkpfSxoRS7JtXByb3Y9TW4oe3Rva2VuOmhFLGZhY3Rvcnk6aEUuybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGhFLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpsRX1dfSksbnVsbCk7Y2xhc3MgYkV7fXZhciB5RTtiRS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8YkUpfSxiRS7JtW1vZD1hbyh7dHlwZTpiRX0pLGJFLsm1aW5qPXZuKHtwcm92aWRlcnM6W2hFXSxpbXBvcnRzOltbY0VdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoYkUsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltjRV0scHJvdmlkZXJzOltoRV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhiRSx7aW1wb3J0czpbY0VdfSksKGZ1bmN0aW9uKHQpe3RbdC5OT1RfTE9BREVEPTBdPSJOT1RfTE9BREVEIix0W3QuTE9BREVEPTFdPSJMT0FERUQiLHRbdC5MT0FESU5HPTJdPSJMT0FESU5HIix0W3QuRkFJTEVEPTNdPSJGQUlMRUQifSkoeUV8fCh5RT17fSkpO2NvbnN0IF9FPUpQKCJbQ29yZV0gUGx1Z2luIENoYW5nZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxDRT1KUCgiW0NvcmVdIFBsdWdpbiBVcmwgSGFzaCBDaGFuZ2VkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksTUU9SlAoIltDb3JlXSBMb2FkZWQiKSx2RT1KUCgiW0NvcmVdIFVzZXIgVHJpZ2dlcmVkIFJlbG9hZCIpLHhFPUpQKCJbQ29yZV0gQXV0byBSZWxvYWQiKSxPRT1KUCgiW0NvcmVdIFBsdWdpbkxpc3RpbmcgRmV0Y2ggUmVxdWVzdGVkIiksUEU9SlAoIltDb3JlXSBQbHVnaW5MaXN0aW5nIEZldGNoIFN1Y2Nlc3NmdWwiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSx3RT1KUCgiW0NvcmVdIFBsdWdpbkxpc3RpbmcgRmV0Y2ggRmFpbGVkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksa0U9SlAoIltDb3JlXSBQb2x5bWVyIENvbXBvbmVudCBSdW5zIEZldGNoIFJlcXVlc3RlZCIpLFNFPUpQKCJbQ29yZV0gUG9seW1lciBDb21wb25lbnQgUnVucyBGZXRjaCBTdWNjZXNzZnVsIiksREU9SlAoIltDb3JlXSBQb2x5bWVyIENvbXBvbmVudCBSdW5zIEZldGNoIEZhaWxlZCIpLEVFPUpQKCJbQ29yZV0gRW52aXJvbm1lbnQgRmV0Y2ggU3VjY2Vzc2Z1bCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLFJFPUpQKCJbQ29yZV0gUnVuIFNlbGVjdGlvbiBDaGFuZ2VkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksQUU9SlAoIltDb3JlXSBSdW4gRmV0Y2ggU3VjY2Vzc2Z1bCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLFRFPUpQKCJbQ29yZV0gU2lkZSBCYXIgV2lkdGggQ2hhbmdlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLE5FPUpQKCJbTWV0cmljc10gTWV0cmljcyBTZXR0aW5ncyBQYW5lIENsb3NlZCIpLHpFPUpQKCJbTWV0cmljc10gTWV0cmljcyBTZXR0aW5ncyBQYW5lIFRvZ2dsZWQiKSxJRT1KUCgiW01ldHJpY3NdIE1ldHJpY3MgVGFnIE1ldGFkYXRhIFJlcXVlc3RlZCIpLEhFPUpQKCJbTWV0cmljc10gTWV0cmljcyBUYWcgTWV0YWRhdGEgTG9hZGVkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksRkU9SlAoIltNZXRyaWNzXSBNZXRyaWNzIFRhZyBNZXRhZGF0YSBGYWlsZWQiKSxMRT1KUCgiW01ldHJpY3NdIE1ldHJpY3MgU2V0dGluZ3MgQ2hhbmdlIFRvb2x0aXAiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KTtKUCgiW01ldHJpY3NdIE1ldHJpY3MgU2V0dGluZ3MgVG9nZ2xlIFNob3cgRGF0YSBEb3dubG9hZCIpO2NvbnN0IEJFPUpQKCJbTWV0cmljc10gTWV0cmljcyBTZXR0aW5nIFRvZ2dsZSBJZ25vcmUgT3V0bGllciIpLFZFPUpQKCJbTWV0cmljc10gTWV0cmljcyBTZXR0aW5nIENoYW5nZSBYIEF4aXMgVHlwZSIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLGpFPUpQKCJbTWV0cmljc10gTWV0cmljcyBTZXR0aW5nIENoYW5nZSBTY2FsYXIgU21vb3RoaW5nIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksVUU9SlAoIltNZXRyaWNzXSBNZXRyaWNzIFNldHRpbmcgUGFydGl0aW9uIE5vbiBNb25vdG9uaWMgWCBUb2dnbGVkIiksR0U9SlAoIltNZXRyaWNzXSBNZXRyaWNzIFNldHRpbmcgQ2hhbmdlIEltYWdlIEJyaWdodG5lc3MiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxXRT1KUCgiW01ldHJpY3NdIE1ldHJpY3MgU2V0dGluZyBDaGFuZ2UgSW1hZ2UgQ29udHJhc3QiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxZRT1KUCgiW01ldHJpY3NdIEltYWdlIEJyaWdodG5lc3MgU2V0dGluZyBSZXNldCIpLHFFPUpQKCJbTWV0cmljc10gSW1hZ2UgQ29udHJhc3QgU2V0dGluZyBSZXNldCIpLFpFPUpQKCJbTWV0cmljc10gTWV0cmljcyBTZXR0aW5nIFRvZ2dsZSBJbWFnZSBTaG93IEFjdHVhbCBTaXplIiksWEU9SlAoIltNZXRyaWNzXSBNZXRyaWNzIFNldHRpbmcgQ2hhbmdlIEhpc3RvZ3JhbSBNb2RlIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksS0U9SlAoIltNZXRyaWNzXSBNdWx0aXBsZSBUaW1lIFNlcmllcyBSZXF1ZXN0ZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxKRT1KUCgiW01ldHJpY3NdIEZldGNoIFRpbWUgU2VyaWVzIFJlcXVlc3QgRmFpbGVkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksUUU9SlAoIltNZXRyaWNzXSBGZXRjaCBUaW1lIFNlcmllcyBSZXNwb25zZSBMb2FkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSwkRT1KUCgiW01ldHJpY3NdIENhcmQgVmlzaWJpbGl0eSBDaGFuZ2VkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksdFI9SlAoIltNZXRyaWNzXSBDYXJkIFN0ZXAgU2xpZGVyIENoYW5nZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxlUj1KUCgiW01ldHJpY3NdIFRhZyBGaWx0ZXIgQ2hhbmdlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLG5SPUpQKCJbTWV0cmljc10gTWV0cmljcyBUYWcgR3JvdXAgRXhwYW5zaW9uIENoYW5nZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxvUj1KUCgiW01ldHJpY3NdIENhcmQgUGluIFN0YXRlIFRvZ2dsZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxpUj1KUCgiW01ldHJpY3NdIFRvZ2dsZSBWaXNpYmxlIFBsdWdpbiIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLGFSPUpQKCJbTWV0cmljc10gVG9nZ2xlIFNob3cgQWxsIFBsdWdpbnMiKSxyUj1KUCgiW01ldHJpY3NdIExpbmtlZCBUaW1lIFNlbGVjdGlvbiBDaGFuZ2VkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksc1I9SlAoIltNZXRyaWNzXSBMaW5rZWQgVGltZSBTZWxlY3Rpb24gQ2xlYXJlZCIpLGxSPUpQKCJbTWV0cmljc10gU2VsZWN0IFRpbWUgRW5hYmxlIFRvZ2dsZSIpLGNSPUpQKCJbTWV0cmljc10gVXNlIFJhbmdlIFNlbGVjdCBUaW1lIFRvZ2dsZSIpLGRSPUpQKCJbTWV0cmljc10gTWV0cmljcyBQcm9tbyBEaXNtaXNzZWQiKSxwUj1KUCgiW01ldHJpY3NdIE1ldHJpY3MgUHJvbW8gR28gVG8gU2NhbGFycyIpLG1SPSJjb3JlIix1Uj17YWN0aXZlUGx1Z2luOm51bGwscGx1Z2luczp7fSxjb3JlRGF0YUxvYWRTdGF0ZTp7c3RhdGU6eUUuTk9UX0xPQURFRCxsYXN0TG9hZGVkVGltZUluTXM6bnVsbH0scGx1Z2luc0xpc3RMb2FkZWQ6e3N0YXRlOnlFLk5PVF9MT0FERUQsbGFzdExvYWRlZFRpbWVJbk1zOm51bGwsZmFpbHVyZUNvZGU6bnVsbH0sZW52aXJvbm1lbnQ6e2RhdGFfbG9jYXRpb246IiIsd2luZG93X3RpdGxlOiIifSxwb2x5bWVyUnVuc0xvYWRTdGF0ZTp7c3RhdGU6eUUuTk9UX0xPQURFRCxsYXN0TG9hZGVkVGltZUluTXM6bnVsbH0scG9seW1lckludGVyb3BSdW5zOltdLHBvbHltZXJJbnRlcm9wUnVuU2VsZWN0aW9uOm5ldyBTZXQsc2lkZUJhcldpZHRoSW5QZXJjZW50OjIwfSxmUj15ayh1UixiayhfRSxDRSwoKHQse3BsdWdpbjplfSk9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7YWN0aXZlUGx1Z2luOmV9KSkpLGJrKE9FLCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2NvcmVEYXRhTG9hZFN0YXRlOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmNvcmVEYXRhTG9hZFN0YXRlKSx7c3RhdGU6eUUuTE9BRElOR30pLHBsdWdpbnNMaXN0TG9hZGVkOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnBsdWdpbnNMaXN0TG9hZGVkKSx7c3RhdGU6eUUuTE9BRElOR30pfSkpKSxiayh3RSwoKHQse2ZhaWx1cmVDb2RlOmV9KT0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtjb3JlRGF0YUxvYWRTdGF0ZTpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5jb3JlRGF0YUxvYWRTdGF0ZSkse3N0YXRlOnlFLkZBSUxFRH0pLHBsdWdpbnNMaXN0TG9hZGVkOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnBsdWdpbnNMaXN0TG9hZGVkKSx7c3RhdGU6eUUuRkFJTEVELGZhaWx1cmVDb2RlOmV9KX0pKSksYmsoUEUsKCh0LHtwbHVnaW5zOmV9KT0+e2NvbnN0IG49T2JqZWN0LmtleXMoZSkuZmluZCgodD0+ZVt0XS5lbmFibGVkKSl8fG51bGwsbz10LmFjdGl2ZVBsdWdpbnx8bixpPURhdGUubm93KCk7bGV0IGE9dC5jb3JlRGF0YUxvYWRTdGF0ZTtyZXR1cm4gdC5wb2x5bWVyUnVuc0xvYWRTdGF0ZS5zdGF0ZT09PXlFLkxPQURFRCYmKGE9e3N0YXRlOnlFLkxPQURFRCxsYXN0TG9hZGVkVGltZUluTXM6aX0pLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7YWN0aXZlUGx1Z2luOm8sY29yZURhdGFMb2FkU3RhdGU6YSxwbHVnaW5zOmUscGx1Z2luc0xpc3RMb2FkZWQ6e3N0YXRlOnlFLkxPQURFRCxsYXN0TG9hZGVkVGltZUluTXM6aSxmYWlsdXJlQ29kZTpudWxsfX0pfSkpLGJrKGtFLCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2NvcmVEYXRhTG9hZFN0YXRlOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmNvcmVEYXRhTG9hZFN0YXRlKSx7c3RhdGU6eUUuTE9BRElOR30pLHBvbHltZXJSdW5zTG9hZFN0YXRlOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnBvbHltZXJSdW5zTG9hZFN0YXRlKSx7c3RhdGU6eUUuTE9BRElOR30pfSkpKSxiayhTRSwodD0+e2NvbnN0IGU9RGF0ZS5ub3coKTtsZXQgbj10LmNvcmVEYXRhTG9hZFN0YXRlO3JldHVybiB0LnBsdWdpbnNMaXN0TG9hZGVkLnN0YXRlPT09eUUuTE9BREVEJiYobj17c3RhdGU6eUUuTE9BREVELGxhc3RMb2FkZWRUaW1lSW5NczplfSksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtjb3JlRGF0YUxvYWRTdGF0ZTpuLHBvbHltZXJSdW5zTG9hZFN0YXRlOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnBvbHltZXJSdW5zTG9hZFN0YXRlKSx7c3RhdGU6eUUuTE9BREVELGxhc3RMb2FkZWRUaW1lSW5NczplfSl9KX0pKSxiayhERSwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtjb3JlRGF0YUxvYWRTdGF0ZTpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5jb3JlRGF0YUxvYWRTdGF0ZSkse3N0YXRlOnlFLkZBSUxFRH0pLHBvbHltZXJSdW5zTG9hZFN0YXRlOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnBvbHltZXJSdW5zTG9hZFN0YXRlKSx7c3RhdGU6eUUuRkFJTEVEfSl9KSkpLGJrKEVFLCgodCx7ZW52aXJvbm1lbnQ6ZX0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2Vudmlyb25tZW50OmV9KSkpLGJrKEFFLCgodCx7cnVuczplfSk9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7cG9seW1lckludGVyb3BSdW5zOmV9KSkpLGJrKFJFLCgodCx7bmV4dFNlbGVjdGlvbjplfSk9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7cG9seW1lckludGVyb3BSdW5TZWxlY3Rpb246bmV3IFNldChlKX0pKSksYmsoVEUsKCh0LHt3aWR0aEluUGVyY2VudDplfSk9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7c2lkZUJhcldpZHRoSW5QZXJjZW50Ok1hdGgubWluKE1hdGgubWF4KDAsZSksMTAwKX0pKSksYmsoV1MsKCh0LHtwYXJ0aWFsU2V0dGluZ3M6ZX0pPT57Y29uc3Qgbj1PYmplY3QuYXNzaWduKHt9LHQpLG89ZS5zaWRlQmFyV2lkdGhJblBlcmNlbnQ7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBvJiZvPj0wJiZvPD0xMDAmJihuLnNpZGVCYXJXaWR0aEluUGVyY2VudD1vKSxufSkpLGJrKHBSLCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2FjdGl2ZVBsdWdpbjoic2NhbGFycyJ9KSkpKTtmdW5jdGlvbiBnUih0LGUpe3JldHVybiBmUih0LGUpfWNvbnN0IGhSPUt3KG1SKSxiUj1adyhoUiwodD0+dC5wbHVnaW5zTGlzdExvYWRlZCkpLHlSPVp3KGhSLCh0PT50LnBvbHltZXJSdW5zTG9hZFN0YXRlKSksX1I9WncoaFIsKHQ9PnQuY29yZURhdGFMb2FkU3RhdGUuc3RhdGUpKSxDUj1adyhoUiwodD0+dC5jb3JlRGF0YUxvYWRTdGF0ZS5sYXN0TG9hZGVkVGltZUluTXMpKSxNUj1adyhoUiwodD0+dC5hY3RpdmVQbHVnaW4pKSx2Uj1adyhoUiwodD0+dC5wbHVnaW5zKSkseFI9WncoaFIsKHQ9PnQuZW52aXJvbm1lbnQpKSxPUj1adyhoUiwodD0+dC5zaWRlQmFyV2lkdGhJblBlcmNlbnQpKSxQUj1uZXcgU2V0KFtaay5DT01QQVJFX0VYUEVSSU1FTlQsWmsuRVhQRVJJTUVOVCxaay5OT1RfU0VUXSk7Y2xhc3Mgd1J7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuYWN0aW9ucyQ9dCx0aGlzLnN0b3JlPWUsdGhpcy53ZWJhcHBEYXRhU291cmNlPW4sdGhpcy50ZkJhY2tlbmQ9e3JlZjpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Zi1iYWNrZW5kIikudGZfYmFja2VuZH0sdGhpcy5vbkRhc2hib2FyZExvYWQkPXJlKHRoaXMuYWN0aW9ucyQucGlwZShEayhNRSxkUyksVmUodGhpcy5zdG9yZS5zZWxlY3QoTlMpKSxNZSgoKFssdF0sWyxlXSk9PnQ9PT1lKSkpLHRoaXMuYWN0aW9ucyQucGlwZShEayh4RSx2RSkpKS5waXBlKFZlKHRoaXMuc3RvcmUuc2VsZWN0KFJTKSksY2UoKChbLHRdKT0+UFIuaGFzKHQpKSksQmUoMSx2b2lkIDAse2xlYWRpbmc6ITB9KSksdGhpcy5mZXRjaFdlYkFwcERhdGEkPU1rKCgoKT0+cmUodGhpcy5vbkRhc2hib2FyZExvYWQkLnBpcGUoVmUodGhpcy5zdG9yZS5zZWxlY3QoYlIpLHRoaXMuc3RvcmUuc2VsZWN0KCREKSksY2UoKChbLHtzdGF0ZTp0fV0pPT50IT09eUUuTE9BRElORykpLEZlKCgoKT0+dGhpcy5zdG9yZS5kaXNwYXRjaChPRSgpKSkpLFp0KCgoWywsdF0pPT4oZnVuY3Rpb24gZSgpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0W2VdPWFyZ3VtZW50c1tlXTt2YXIgbj1rdCh0KSxvPWxlKHQpO3JldHVybiBvLmxlbmd0aD9uZXcgRCgoZnVuY3Rpb24odCl7dmFyIGU9by5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuW119KSkscj1vLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm4hMX0pKTt0LmFkZCgoZnVuY3Rpb24oKXtlPXI9bnVsbH0pKTtmb3IodmFyIHM9ZnVuY3Rpb24ocyl7TXQob1tzXSkuc3Vic2NyaWJlKG5ldyBUKHQsKGZ1bmN0aW9uKG8pe2lmKGVbc10ucHVzaChvKSxlLmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gdC5sZW5ndGh9KSkpe3ZhciBsPWUubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5zaGlmdCgpfSkpO3QubmV4dChuP24uYXBwbHkodm9pZCAwLGEoW10saShsKSkpOmwpLGUuc29tZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4hdC5sZW5ndGgmJnJbZV19KSkmJnQuY29tcGxldGUoKX19KSwoZnVuY3Rpb24oKXtyW3NdPSEwLCFlW3NdLmxlbmd0aCYmdC5jb21wbGV0ZSgpfSkpKX0sbD0wOyF0LmNsb3NlZCYmbDxvLmxlbmd0aDtsKyspcyhsKTtyZXR1cm4gZnVuY3Rpb24oKXtlPXI9bnVsbH19KSk6cnR9KSh0aGlzLndlYmFwcERhdGFTb3VyY2UuZmV0Y2hQbHVnaW5zTGlzdGluZyh0KSx0aGlzLmZldGNoRW52aXJvbm1lbnQoKSkucGlwZShJdCgoKFt0XSk9Pnt0aGlzLnN0b3JlLmRpc3BhdGNoKFBFKHtwbHVnaW5zOnR9KSl9KSkscGUoKHQ9Pih0aGlzLnN0b3JlLmRpc3BhdGNoKHdFKHQgaW5zdGFuY2VvZiBnRT97ZmFpbHVyZUNvZGU6dC5mYWlsdXJlQ29kZX06e2ZhaWx1cmVDb2RlOm1FLlVOS05PV059KSkscnQpKSkpKSkpLHRoaXMub25EYXNoYm9hcmRMb2FkJC5waXBlKEl0KCgoWyx0XSk9PnQpKSx6ZSgodD0+dCE9PVprLkNPTVBBUkVfRVhQRVJJTUVOVD9FdChbXSk6dGhpcy5zdG9yZS5zZWxlY3QoelMpLnBpcGUoTWUoKCh0LGUpPT57Y29uc3Qgbj1PYmplY3QuZW50cmllcyh0KSxvPW5ldyBNYXAoT2JqZWN0LmVudHJpZXMoZSkpO2lmKG4ubGVuZ3RoIT09by5zaXplKXJldHVybiExO2Zvcihjb25zdFt0LGVdb2YgbilpZihvLmdldCh0KSE9PWUpcmV0dXJuITE7cmV0dXJuITB9KSksQ2UoMCksQmUoNTAwLHZvaWQgMCx7bGVhZGluZzohMCx0cmFpbGluZzohMH0pKSkpLFZlKHRoaXMuc3RvcmUuc2VsZWN0KFJTKSx0aGlzLnN0b3JlLnNlbGVjdCh5UikpLGNlKCgoWyx0LGVdKT0+UFIuaGFzKHQpJiZlLnN0YXRlIT09eUUuTE9BRElORykpLEZlKCgoKT0+e3RoaXMuc3RvcmUuZGlzcGF0Y2goa0UoKSl9KSksemUoKCgpPT50aGlzLnJlZnJlc2hQb2x5bWVyUnVucygpKSksRmUoKCgpPT57dGhpcy5zdG9yZS5kaXNwYXRjaChTRSgpKX0pKSxwZSgoKCk9Pih0aGlzLnN0b3JlLmRpc3BhdGNoKERFKCkpLHJ0KSkpKSkpLHtkaXNwYXRjaDohMX0pLHRoaXMuZGlzcGF0Y2hDaGFuZ2VQbHVnaW4kPU1rKCgoKT0+cmUodGhpcy5vbkRhc2hib2FyZExvYWQkLHRoaXMuYWN0aW9ucyQucGlwZShEayhQRSkpKS5waXBlKFZlKHRoaXMuc3RvcmUuc2VsZWN0KE1SKSksSXQoKChbLHRdKT0+dCkpLE1lKCksY2UoKHQ9Pm51bGwhPT10KSksYmUoMSksRmUoKHQ9Pnt0aGlzLnN0b3JlLmRpc3BhdGNoKF9FKHtwbHVnaW46dH0pKX0pKSkpLHtkaXNwYXRjaDohMX0pfXJlZnJlc2hQb2x5bWVyUnVucygpe3JldHVybiBDdCh0aGlzLnRmQmFja2VuZC5yZWYucnVuc1N0b3JlLnJlZnJlc2goKSl9ZmV0Y2hFbnZpcm9ubWVudCgpe3JldHVybiB0aGlzLndlYmFwcERhdGFTb3VyY2UuZmV0Y2hFbnZpcm9ubWVudCgpLnBpcGUoRmUoKHQ9Pnt0aGlzLnN0b3JlLmRpc3BhdGNoKEVFKHtlbnZpcm9ubWVudDp0fSkpfSkpKX19d1IuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHdSKSh2cihTayksdnIoSXcpLHZyKGhFKSl9LHdSLsm1cHJvdj1Nbih7dG9rZW46d1IsZmFjdG9yeTp3Ui7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgod1IsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlNrfSx7dHlwZTpJd30se3R5cGU6aEV9XX0pLG51bGwpO2NvbnN0IGtSPW5ldyBHYSgiQ29yZSBGZWF0dXJlIENvbmZpZyIpO2Z1bmN0aW9uIFNSKHQpe3JldHVybntpbml0aWFsU3RhdGU6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHVSKSx7YWN0aXZlUGx1Z2luOnQuZ2V0UGx1Z2luSWQoKXx8bnVsbH0pfX1mdW5jdGlvbiBEUigpe3JldHVybiBadyhPUiwodD0+KHtzaWRlQmFyV2lkdGhJblBlcmNlbnQ6dH0pKSl9Y2xhc3MgRVJ7fUVSLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxFUil9LEVSLsm1bW9kPWFvKHt0eXBlOkVSfSksRVIuybVpbmo9dm4oe3Byb3ZpZGVyczpbe3Byb3ZpZGU6a1IsZGVwczpbVlNdLHVzZUZhY3Rvcnk6U1J9XSxpbXBvcnRzOltbV2suZm9yRmVhdHVyZShbd1JdKSxkay5mb3JGZWF0dXJlKG1SLGdSLGtSKSxiRSxxUy5kZWZpbmVHbG9iYWxTZXR0aW5nKERSKV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChFUixbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W1drLmZvckZlYXR1cmUoW3dSXSksZGsuZm9yRmVhdHVyZShtUixnUixrUiksYkUscVMuZGVmaW5lR2xvYmFsU2V0dGluZyhEUildLHByb3ZpZGVyczpbe3Byb3ZpZGU6a1IsZGVwczpbVlNdLHVzZUZhY3Rvcnk6U1J9XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKEVSLHtpbXBvcnRzOltHayxjayxiRSxxU119KTtjb25zdCBSUj1uZXcgR2EoIltBbGVydF0gQWN0aW9uLVRvLUFsZXJ0IFByb3ZpZGVyIik7Y2xhc3MgQVJ7Y29uc3RydWN0b3IodCl7dGhpcy5wcm92aWRlcnM9bmV3IE1hcDtmb3IoY29uc3QgZSBvZiB0fHxbXSlmb3IoY29uc3QgdCBvZiBlKXtpZih0aGlzLnByb3ZpZGVycy5oYXModC5hY3Rpb25DcmVhdG9yLnR5cGUpKXRocm93IG5ldyBSYW5nZUVycm9yKGAiJHt0LmFjdGlvbkNyZWF0b3IudHlwZX0iIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgYWxlcnRzLiBNdWx0aXBsZSBhbGVydHMgZm9yIHRoZSBzYW1lIGFjdGlvbiBpcyBub3QgYWxsb3dlZC5gKTt0aGlzLnByb3ZpZGVycy5zZXQodC5hY3Rpb25DcmVhdG9yLnR5cGUsdC5hbGVydEZyb21BY3Rpb24pfX1nZXRBbGVydEZyb21BY3Rpb24odCl7Y29uc3QgZT10aGlzLnByb3ZpZGVycy5nZXQodC50eXBlKTtyZXR1cm4gZT9lKHQpOm51bGx9c3RhdGljIHJlZ2lzdGVyQWxlcnRBY3Rpb25zKHQpe3JldHVybntuZ01vZHVsZTpBUixwcm92aWRlcnM6W3twcm92aWRlOlJSLG11bHRpOiEwLHVzZUZhY3Rvcnk6dH1dfX19QVIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEFSKSh2cihSUiw4KSl9LEFSLsm1bW9kPWFvKHt0eXBlOkFSfSksQVIuybVpbmo9dm4oe30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQVIsW3t0eXBlOkF5LGFyZ3M6W3t9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1JSXX1dfV19KSxudWxsKTtjb25zdCBUUj0iaHBhcmFtcyIsTlI9SlAoIltSdW5zXSBGZXRjaCBSdW5zIFJlcXVlc3RlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLHpSPUpQKCJbUnVuc10gRmV0Y2ggUnVucyBTdWNjZWVkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxJUj1KUCgiW1J1bnNdIEZldGNoIFJ1bnMgRmFpbGVkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksSFI9SlAoIltSdW5zXSBSdW4gU2VsZWN0aW9uIFRvZ2dsZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxGUj1KUCgiW1J1bnNdIFJ1biBQYWdlIFNlbGVjdGlvbiBUb2dnbGVkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksTFI9SlAoIltSdW5zXSBSdW4gU2VsZWN0b3IgUGFnaW5hdGlvbiBPcHRpb24gQ2hhbmdlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLEJSPUpQKCJbUnVuc10gUnVuIFNlbGVjdG9yIFNvcnQgQ2hhbmdlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLFZSPUpQKCJbUnVuc10gUnVuIFNlbGVjdG9yIFJlZ2V4IEZpbHRlciBDaGFuZ2VkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksalI9SlAoIltSdW5zXSBSdW4gQ29sb3IgQ2hhbmdlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLFVSPUpQKCJbUnVuc10gUnVuIFRhYmxlIFNob3duIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksR1I9SlAoIltSdW5zXSBSdW4gR3JvdXAgQnkgQ2hhbmdlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pO3ZhciBXUixZUixxUixaUjshKGZ1bmN0aW9uKHQpe3QuREFUQVNFVF9VTktOT1dOPSJEQVRBU0VUX1VOS05PV04iLHQuREFUQVNFVF9UUkFJTklORz0iREFUQVNFVF9UUkFJTklORyIsdC5EQVRBU0VUX1ZBTElEQVRJT049IkRBVEFTRVRfVkFMSURBVElPTiJ9KShXUnx8KFdSPXt9KSksKGZ1bmN0aW9uKHQpe3QuU1RBVFVTX1VOS05PV049IlNUQVRVU19VTktOT1dOIix0LlNUQVRVU19TVUNDRVNTPSJTVEFUVVNfU1VDQ0VTUyIsdC5TVEFUVVNfRkFJTFVSRT0iU1RBVFVTX0ZBSUxVUkUiLHQuU1RBVFVTX1JVTk5JTkc9IlNUQVRVU19SVU5OSU5HIn0pKFlSfHwoWVI9e30pKSwoZnVuY3Rpb24odCl7dC5EQVRBX1RZUEVfVU5TRVQ9IkRBVEFfVFlQRV9VTlNFVCIsdC5EQVRBX1RZUEVfU1RSSU5HPSJEQVRBX1RZUEVfU1RSSU5HIix0LkRBVEFfVFlQRV9CT09MPSJEQVRBX1RZUEVfQk9PTCIsdC5EQVRBX1RZUEVfRkxPQVQ2ND0iREFUQV9UWVBFX0ZMT0FUNjQifSkocVJ8fChxUj17fSkpLChmdW5jdGlvbih0KXt0W3QuRElTQ1JFVEU9MF09IkRJU0NSRVRFIix0W3QuSU5URVJWQUw9MV09IklOVEVSVkFMIn0pKFpSfHwoWlI9e30pKTtjbGFzcyBYUnt9WFIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFhSKX0sWFIuybVwcm92PU1uKHt0b2tlbjpYUixmYWN0b3J5OlhSLsm1ZmFjLHByb3ZpZGVkSW46InJvb3QifSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChYUixbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSxudWxsLG51bGwpO2NvbnN0IEtSPUpQKCJbSHBhcmFtc10gSHBhcmFtcyBEaXNjcmV0ZSBIcGFyYW0gRmlsdGVyIENoYW5nZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxKUj1KUCgiW0hwYXJhbXNdIEhwYXJhbXMgSW50ZXJ2YWwgSHBhcmFtIEZpbHRlciBDaGFuZ2VkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksUVI9SlAoIltIcGFyYW1zXSBIcGFyYW1zIE1ldHJpYyBGaWx0ZXIgQ2hhbmdlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pO2Z1bmN0aW9uICRSKHQpe3JldHVybiBKU09OLnN0cmluZ2lmeShbLi4udF0uc29ydCgpKX1mdW5jdGlvbiB0QSh0KXt2YXIgZSxuLG8saTtjb25zdCBhPW5ldyBNYXAscj1uZXcgTWFwLHM9bmV3IE1hcDtmb3IoY29uc3QgYSBvZiB0KWZvcihjb25zdFt0LGxdb2YgYSlpZihsLnR5cGU9PT1aUi5ESVNDUkVURSl7Y29uc3R7cG9zc2libGVWYWx1ZXM6ZSx2YWx1ZXM6bn09ci5nZXQodCl8fHtwb3NzaWJsZVZhbHVlczpuZXcgU2V0LHZhbHVlczpuZXcgU2V0fTtmb3IoY29uc3QgdCBvZiBsLmZpbHRlclZhbHVlcyluLmFkZCh0KTtmb3IoY29uc3QgdCBvZiBsLnBvc3NpYmxlVmFsdWVzKWUuYWRkKHQpO3Iuc2V0KHQse3Bvc3NpYmxlVmFsdWVzOmUsdmFsdWVzOm59KX1lbHNle2NvbnN0IGE9cy5nZXQodCk7cy5zZXQodCx7ZmlsdGVyTG93ZXJWYWx1ZTpNYXRoLm1pbihsLmZpbHRlckxvd2VyVmFsdWUsbnVsbCE9PShlPW51bGw9PWE/dm9pZCAwOmEuZmlsdGVyTG93ZXJWYWx1ZSkmJnZvaWQgMCE9PWU/ZToxLzApLGZpbHRlclVwcGVyVmFsdWU6TWF0aC5tYXgobC5maWx0ZXJVcHBlclZhbHVlLG51bGwhPT0obj1udWxsPT1hP3ZvaWQgMDphLmZpbHRlclVwcGVyVmFsdWUpJiZ2b2lkIDAhPT1uP246LTEvMCksbWluVmFsdWU6TWF0aC5taW4obC5taW5WYWx1ZSxudWxsIT09KG89bnVsbD09YT92b2lkIDA6YS5taW5WYWx1ZSkmJnZvaWQgMCE9PW8/bzoxLzApLG1heFZhbHVlOk1hdGgubWF4KGwubWF4VmFsdWUsbnVsbCE9PShpPW51bGw9PWE/dm9pZCAwOmEubWF4VmFsdWUpJiZ2b2lkIDAhPT1pP2k6LTEvMCl9KX1mb3IoY29uc3RbdCx7dmFsdWVzOmUscG9zc2libGVWYWx1ZXM6bn1db2YgcilhLnNldCh0LHt0eXBlOlpSLkRJU0NSRVRFLGluY2x1ZGVVbmRlZmluZWQ6ITAscG9zc2libGVWYWx1ZXM6Wy4uLm5dLGZpbHRlclZhbHVlczpbLi4uZV19KTtmb3IoY29uc3RbdCx7bWluVmFsdWU6ZSxtYXhWYWx1ZTpuLGZpbHRlckxvd2VyVmFsdWU6byxmaWx0ZXJVcHBlclZhbHVlOml9XW9mIHMpe2lmKGEuaGFzKHQpKXtjb25zdCBlPWEuZ2V0KHQpO2lmKGUudHlwZT09PVpSLkRJU0NSRVRFJiZlLnBvc3NpYmxlVmFsdWVzLnNvbWUoKHQ9PnQpKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQ2Fubm90IGNvbWJpbmUgaHBhcmFtLCAke3R9LCBhcyBpdCBpcyBvZiBtaXhlZCB0eXBlcy5gKX1hLnNldCh0LHt0eXBlOlpSLklOVEVSVkFMLGluY2x1ZGVVbmRlZmluZWQ6ITAsbWluVmFsdWU6ZSxtYXhWYWx1ZTpuLGZpbHRlckxvd2VyVmFsdWU6byxmaWx0ZXJVcHBlclZhbHVlOml9KX1yZXR1cm4gYX1mdW5jdGlvbiBlQSh0KXt2YXIgZSxuLG8saTtjb25zdCBhPW5ldyBNYXA7Zm9yKGNvbnN0IHIgb2YgdClmb3IoY29uc3RbdCxzXW9mIHIpe2NvbnN0IHI9YS5nZXQodCk7YS5zZXQodCxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe3R5cGU6WlIuSU5URVJWQUwsaW5jbHVkZVVuZGVmaW5lZDohMH0scikse21pblZhbHVlOk1hdGgubWluKHMubWluVmFsdWUsbnVsbCE9PShlPW51bGw9PXI/dm9pZCAwOnIubWluVmFsdWUpJiZ2b2lkIDAhPT1lP2U6MS8wKSxtYXhWYWx1ZTpNYXRoLm1heChzLm1heFZhbHVlLG51bGwhPT0obj1udWxsPT1yP3ZvaWQgMDpyLm1heFZhbHVlKSYmdm9pZCAwIT09bj9uOi0xLzApLGZpbHRlckxvd2VyVmFsdWU6TWF0aC5taW4ocy5maWx0ZXJMb3dlclZhbHVlLG51bGwhPT0obz1udWxsPT1yP3ZvaWQgMDpyLmZpbHRlckxvd2VyVmFsdWUpJiZ2b2lkIDAhPT1vP286MS8wKSxmaWx0ZXJVcHBlclZhbHVlOk1hdGgubWF4KHMuZmlsdGVyVXBwZXJWYWx1ZSxudWxsIT09KGk9bnVsbD09cj92b2lkIDA6ci5maWx0ZXJVcHBlclZhbHVlKSYmdm9pZCAwIT09aT9pOi0xLzApfSkpfXJldHVybiBhfWNvbnN0IG5BPXlrKHtzcGVjczp7fSxmaWx0ZXJzOnt9fSxiayhLUiwoKHQsZSk9Pnt2YXIgbjtjb25zdHtleHBlcmltZW50SWRzOm8saHBhcmFtTmFtZTppLGZpbHRlclZhbHVlczphLGluY2x1ZGVVbmRlZmluZWQ6cn09ZSxzPSRSKG8pLGw9bnVsbCE9PShuPXQuZmlsdGVyc1tzXSkmJnZvaWQgMCE9PW4/bjp7aHBhcmFtczpuZXcgTWFwfSxjPWwuaHBhcmFtcy5nZXQoaSk7aWYoYyYmYy50eXBlIT09WlIuRElTQ1JFVEUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYE5ldyBkaXNjcmV0ZSBmaWx0ZXIgb2YgJHtpfSBjb25mbGljdHMgZXhpc3RpbmcgZmlsdGVyIG9mIGArWlJbYy50eXBlXSk7Y29uc3QgZD10QShvLmZpbHRlcigoZT0+Qm9vbGVhbih0LnNwZWNzW2VdKSkpLm1hcCgoZT0+dC5zcGVjc1tlXS5ocGFyYW0uZGVmYXVsdEZpbHRlcnMpKSkuZ2V0KGkpO2lmKCFkKXRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNldCBocGFyYW0sICR7aX0sIHdoZW4gaXQgaXMgbm90IGtub3duIGZvciBleHBlcmltZW50SWRzOiAke28uam9pbigiLCAiKX1gKTtpZihkLnR5cGUhPT1aUi5ESVNDUkVURSl0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzZXQgJHtpfSB3aGVuIGRlZmF1bHQgZmlsdGVyIGlzIG5vdCBvZiBkaXNjcmV0ZSB0eXBlLmApO2NvbnN0IHA9bmV3IFNldChkLnBvc3NpYmxlVmFsdWVzKSxtPVsuLi5hXS5maWx0ZXIoKHQ9PiFwLmhhcyh0KSkpO2lmKG0ubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgTmV3IGZpbHRlciBmb3IgJHtpfSBoYXMgbW9yZSB0aGFuIG9uZSB2YWx1ZSB0aGF0IGlzIG5vdCBwcmVzZW50IGluIHRoZSBzcGVjLiBCYWQgdmFsdWVzOiAke20uam9pbigiLCAiKX1gKTtjb25zdCB1PW5ldyBNYXAobC5ocGFyYW1zKTtyZXR1cm4gdS5zZXQoaSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYykse3R5cGU6WlIuRElTQ1JFVEUsaW5jbHVkZVVuZGVmaW5lZDpyLHBvc3NpYmxlVmFsdWVzOlsuLi5wXSxmaWx0ZXJWYWx1ZXM6YX0pKSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2ZpbHRlcnM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuZmlsdGVycykse1tzXTpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbCkse2hwYXJhbXM6dX0pfSl9KX0pKSxiayhKUiwoKHQsZSk9Pnt2YXIgbjtjb25zdHtleHBlcmltZW50SWRzOm8saHBhcmFtTmFtZTppLGZpbHRlckxvd2VyVmFsdWU6YSxmaWx0ZXJVcHBlclZhbHVlOnIsaW5jbHVkZVVuZGVmaW5lZDpzfT1lLGw9JFIobyksYz1udWxsIT09KG49dC5maWx0ZXJzW2xdKSYmdm9pZCAwIT09bj9uOnttZXRyaWNzOm5ldyBNYXAsaHBhcmFtczpuZXcgTWFwfSxkPWMuaHBhcmFtcy5nZXQoaSk7aWYoZCYmZC50eXBlIT09WlIuSU5URVJWQUwpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYE5ldyBpbnRlcnZhbCBmaWx0ZXIgb2YgJHtpfSBjb25mbGljdHMgZXhpc3RpbmcgZmlsdGVyIG9mIGArWlJbZC50eXBlXSk7Y29uc3QgcD10QShvLmZpbHRlcigoZT0+Qm9vbGVhbih0LnNwZWNzW2VdKSkpLm1hcCgoZT0+dC5zcGVjc1tlXS5ocGFyYW0uZGVmYXVsdEZpbHRlcnMpKSkuZ2V0KGkpO2lmKCFwKXRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNldCBocGFyYSwgJHtpfSwgd2hlbiBpdCBpcyBub3Qga25vd24gZm9yIGV4cGVyaW1lbnRJZHM6ICR7by5qb2luKCIsICIpfWApO2lmKHAudHlwZSE9PVpSLklOVEVSVkFMKXRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNldCAke2l9IHdoZW4gZGVmYXVsdCBmaWx0ZXIgaXMgbm90IG9mIGludGVydmFsIHR5cGUuYCk7Y29uc3QgbT1uZXcgTWFwKGMuaHBhcmFtcyk7cmV0dXJuIG0uc2V0KGksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGQpLHt0eXBlOlpSLklOVEVSVkFMLGluY2x1ZGVVbmRlZmluZWQ6cyxtaW5WYWx1ZTpwLm1pblZhbHVlLG1heFZhbHVlOnAubWF4VmFsdWUsZmlsdGVyTG93ZXJWYWx1ZTphLGZpbHRlclVwcGVyVmFsdWU6cn0pKSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2ZpbHRlcnM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuZmlsdGVycykse1tsXTpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYykse2hwYXJhbXM6bX0pfSl9KX0pKSxiayhRUiwoKHQsZSk9Pnt2YXIgbjtjb25zdHtleHBlcmltZW50SWRzOm8sbWV0cmljVGFnOmksZmlsdGVyTG93ZXJWYWx1ZTphLGZpbHRlclVwcGVyVmFsdWU6cixpbmNsdWRlVW5kZWZpbmVkOnN9PWUsbD0kUihvKSxjPW51bGwhPT0obj10LmZpbHRlcnNbbF0pJiZ2b2lkIDAhPT1uP246e21ldHJpY3M6bmV3IE1hcCxocGFyYW1zOm5ldyBNYXB9LGQ9ZUEoby5maWx0ZXIoKGU9PkJvb2xlYW4odC5zcGVjc1tlXSkpKS5tYXAoKGU9PnQuc3BlY3NbZV0ubWV0cmljLmRlZmF1bHRGaWx0ZXJzKSkpLmdldChpKTtpZighZCl0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzZXQgbWV0cmljLCAke2l9LCB3aGVuIGl0IGlzIG5vdCBrbm93biBmb3IgZXhwZXJpbWVudElkczogJHtvLmpvaW4oIiwgIil9YCk7Y29uc3QgcD1jLm1ldHJpY3MuZ2V0KGkpLG09bmV3IE1hcChjLm1ldHJpY3MpO3JldHVybiBtLnNldChpLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxwKSx7dHlwZTpaUi5JTlRFUlZBTCxpbmNsdWRlVW5kZWZpbmVkOnMsbWluVmFsdWU6ZC5taW5WYWx1ZSxtYXhWYWx1ZTpkLm1heFZhbHVlLGZpbHRlckxvd2VyVmFsdWU6YSxmaWx0ZXJVcHBlclZhbHVlOnJ9KSksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtmaWx0ZXJzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmZpbHRlcnMpLHtbbF06T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGMpLHttZXRyaWNzOm19KX0pfSl9KSksYmsoelIsKCh0LGUpPT57dmFyIG4sbyxpLGE7aWYoMD09PU9iamVjdC5rZXlzKGUubmV3UnVuc0FuZE1ldGFkYXRhKS5sZW5ndGgpcmV0dXJuIHQ7Y29uc3Qgcj1PYmplY3QuYXNzaWduKHt9LHQuc3BlY3MpLHM9bmV3IE1hcCxsPW5ldyBTZXQ7Zm9yKGNvbnN0IHQgb2YgT2JqZWN0LmtleXMoZS5uZXdSdW5zQW5kTWV0YWRhdGEpKXtjb25zdCBjPW5ldyBNYXAsZD1uZXcgTWFwLHA9bmV3IE1hcCxtPW5ldyBNYXAse3J1bnM6dSxtZXRhZGF0YTpmfT1lLm5ld1J1bnNBbmRNZXRhZGF0YVt0XTtmb3IoY29uc3QgdCBvZiB1KXtjb25zdCBlPWYucnVuVG9IcGFyYW1zQW5kTWV0cmljc1t0LmlkXTtpZihlKWZvcihjb25zdCB0IG9mIGUubWV0cmljcyl7Y29uc3QgZT1zLmdldCh0LnRhZyk7cy5zZXQodC50YWcse21pbjplP01hdGgubWluKGUubWluLHQudmFsdWUpOnQudmFsdWUsbWF4OmU/TWF0aC5tYXgoZS5tYXgsdC52YWx1ZSk6dC52YWx1ZX0pfX1mb3IoY29uc3R7bmFtZTp0LGRvbWFpbjplfW9mIGYuaHBhcmFtU3BlY3MpaWYoZS50eXBlPT09WlIuRElTQ1JFVEUpe2NvbnN0IG49cC5nZXQodCl8fG5ldyBTZXQ7Zm9yKGNvbnN0IHQgb2YgZS52YWx1ZXMpbi5hZGQodCk7cC5zZXQodCxuKX1lbHNle2NvbnN0IG49bS5nZXQodCk7bS5zZXQodCx7bWluVmFsdWU6bj9NYXRoLm1pbihlLm1pblZhbHVlLG4ubWluVmFsdWUpOmUubWluVmFsdWUsbWF4VmFsdWU6bj9NYXRoLm1heChlLm1heFZhbHVlLG4ubWF4VmFsdWUpOmUubWF4VmFsdWV9KX1mb3IoY29uc3QgdCBvZiBmLm1ldHJpY1NwZWNzKWwuYWRkKHQudGFnKTtmb3IoY29uc3RbdCxlXW9mIHApYy5zZXQodCx7dHlwZTpaUi5ESVNDUkVURSxpbmNsdWRlVW5kZWZpbmVkOiEwLHBvc3NpYmxlVmFsdWVzOlsuLi5lXSxmaWx0ZXJWYWx1ZXM6Wy4uLmVdfSk7Zm9yKGNvbnN0W3Qse21pblZhbHVlOmUsbWF4VmFsdWU6bn1db2YgbSljLnNldCh0LHt0eXBlOlpSLklOVEVSVkFMLGluY2x1ZGVVbmRlZmluZWQ6ITAsbWluVmFsdWU6ZSxtYXhWYWx1ZTpuLGZpbHRlckxvd2VyVmFsdWU6ZSxmaWx0ZXJVcHBlclZhbHVlOm59KTtmb3IoY29uc3QgdCBvZiBsKXtjb25zdCBlPXMuZ2V0KHQpLGk9bnVsbCE9PShuPW51bGw9PWU/dm9pZCAwOmUubWluKSYmdm9pZCAwIT09bj9uOjAsYT1udWxsIT09KG89bnVsbD09ZT92b2lkIDA6ZS5tYXgpJiZ2b2lkIDAhPT1vP286MDtkLnNldCh0LHt0eXBlOlpSLklOVEVSVkFMLGluY2x1ZGVVbmRlZmluZWQ6ITAsbWluVmFsdWU6aSxtYXhWYWx1ZTphLGZpbHRlckxvd2VyVmFsdWU6aSxmaWx0ZXJVcHBlclZhbHVlOmF9KX1yW3RdPXtocGFyYW06T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG51bGw9PT0oaT1yW3RdKXx8dm9pZCAwPT09aT92b2lkIDA6aS5ocGFyYW0pLHtzcGVjczpmLmhwYXJhbVNwZWNzLGRlZmF1bHRGaWx0ZXJzOmN9KSxtZXRyaWM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG51bGw9PT0oYT1yW3RdKXx8dm9pZCAwPT09YT92b2lkIDA6YS5tZXRyaWMpLHtzcGVjczpmLm1ldHJpY1NwZWNzLGRlZmF1bHRGaWx0ZXJzOmR9KX19cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7c3BlY3M6cn0pfSkpKTtmdW5jdGlvbiBvQSh0LGUpe3JldHVybiBuQSh0LGUpfWNsYXNzIGlBe31pQS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8aUEpfSxpQS7JtW1vZD1hbyh7dHlwZTppQX0pLGlBLsm1aW5qPXZuKHtpbXBvcnRzOltbZGsuZm9yRmVhdHVyZShUUixvQSldXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoaUEsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltkay5mb3JGZWF0dXJlKFRSLG9BKV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhpQSx7aW1wb3J0czpbY2tdfSk7Y2xhc3MgYUF7fWZ1bmN0aW9uIHJBKHQsZSl7cmV0dXJuYCR7ZX0vJHt0fWB9YUEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGFBKX0sYUEuybVtb2Q9YW8oe3R5cGU6YUF9KSxhQS7JtWluaj12bih7aW1wb3J0czpbW2lBXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGFBLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbaUFdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oYUEse2ltcG9ydHM6W2lBXX0pO2NsYXNzIHNBe2NvbnN0cnVjdG9yKHQpe3RoaXMuaHR0cD10fWZldGNoUnVucyh0KXtyZXR1cm4gdGhpcy5odHRwLmdldCgiZGF0YS9ydW5zIikucGlwZShJdCgoZT0+ZS5tYXAoKGU9Pih7aWQ6ckEoZSx0KSxuYW1lOmUsc3RhcnRUaW1lOjB9KSkpKSkpfWZldGNoSHBhcmFtc01ldGFkYXRhKHQpe3JldHVybiBFdCh7aHBhcmFtU3BlY3M6W10sbWV0cmljU3BlY3M6W10scnVuVG9IcGFyYW1zQW5kTWV0cmljczp7fX0pfX1zQS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8c0EpKHZyKGxFKSl9LHNBLsm1cHJvdj1Nbih7dG9rZW46c0EsZmFjdG9yeTpzQS7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoc0EsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmxFfV19KSxudWxsKTtjbGFzcyBsQXt9bEEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGxBKX0sbEEuybVtb2Q9YW8oe3R5cGU6bEF9KSxsQS7JtWluaj12bih7cHJvdmlkZXJzOlt7cHJvdmlkZTpYUix1c2VDbGFzczpzQX1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChsQSxbe3R5cGU6QXksYXJnczpbe3Byb3ZpZGVyczpbe3Byb3ZpZGU6WFIsdXNlQ2xhc3M6c0F9XX1dfV0sbnVsbCxudWxsKTtjb25zdCBjQT0iYWxlcnRzIixkQT1adyhLdyhjQSksKHQ9PnQubGF0ZXN0QWxlcnQpKSxwQT0iZXhwZXJpbWVudHMiLG1BPVp3KEt3KHBBKSwodD0+dC5kYXRhKSksdUE9WncobUEsKCh0LGUpPT57Y29uc3R7ZXhwZXJpbWVudElkOm59PWU7cmV0dXJuIHQuZXhwZXJpbWVudE1hcFtuXXx8bnVsbH0pKTsKLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4KCiAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKICAgIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC4KCiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSAogICAgUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCiAgICBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsCiAgICBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00KICAgIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCiAgICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAgICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KZnVuY3Rpb24gZkEodCxlKXt2YXIgbj17fTtmb3IodmFyIG8gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxvKSYmZS5pbmRleE9mKG8pPDAmJihuW29dPXRbb10pO2lmKG51bGwhPXQmJiJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgaT0wO2ZvcihvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7aTxvLmxlbmd0aDtpKyspZS5pbmRleE9mKG9baV0pPDAmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LG9baV0pJiYobltvW2ldXT10W29baV1dKX1yZXR1cm4gbn1mdW5jdGlvbiBnQSh0LGUsbixvKXtyZXR1cm4gbmV3KG58fChuPVByb21pc2UpKSgoZnVuY3Rpb24oaSxhKXtmdW5jdGlvbiByKHQpe3RyeXtsKG8ubmV4dCh0KSl9Y2F0Y2godCl7YSh0KX19ZnVuY3Rpb24gcyh0KXt0cnl7bChvLnRocm93KHQpKX1jYXRjaCh0KXthKHQpfX1mdW5jdGlvbiBsKHQpe3QuZG9uZT9pKHQudmFsdWUpOihmdW5jdGlvbiBlKHQpe3JldHVybiB0IGluc3RhbmNlb2Ygbj90Om5ldyBuKChmdW5jdGlvbihlKXtlKHQpfSkpfSkodC52YWx1ZSkudGhlbihyLHMpfWwoKG89by5hcHBseSh0LGV8fFtdKSkubmV4dCgpKX0pKX12YXIgaEEsYkEseUE7IShmdW5jdGlvbih0KXt0LlNDQUxBUlM9InNjYWxhcnMiLHQuSElTVE9HUkFNUz0iaGlzdG9ncmFtcyIsdC5JTUFHRVM9ImltYWdlcyJ9KShoQXx8KGhBPXt9KSksKGZ1bmN0aW9uKHQpe3QuREVGQVVMVD0iZGVmYXVsdCIsdC5BU0NFTkRJTkc9ImFzY2VuZGluZyIsdC5ERVNDRU5ESU5HPSJkZXNjZW5kaW5nIix0Lk5FQVJFU1Q9Im5lYXJlc3QifSkoYkF8fChiQT17fSkpLChmdW5jdGlvbih0KXt0W3QuU1RFUD0wXT0iU1RFUCIsdFt0LlJFTEFUSVZFPTFdPSJSRUxBVElWRSIsdFt0LldBTExfVElNRT0yXT0iV0FMTF9USU1FIn0pKHlBfHwoeUE9e30pKTtjb25zdCBfQT0idGltZXNlcmllcyIsQ0E9W2hBLklNQUdFU107ZnVuY3Rpb24gTUEodCl7cmV0dXJuIENBLmluY2x1ZGVzKHQpfWNvbnN0IHZBPVtoQS5ISVNUT0dSQU1TLGhBLklNQUdFU107ZnVuY3Rpb24geEEodCl7cmV0dXJuIHZBLmluY2x1ZGVzKHQpfWZ1bmN0aW9uIE9BKHQpe3JldHVybiB4QSh0LnBsdWdpbil9Y2xhc3MgUEF7fWZ1bmN0aW9uIHdBKHQpe3JldHVybiB0Lmhhc093blByb3BlcnR5KCJlcnJvciIpfWNvbnN0IGtBPSJkYXRhL3BsdWdpbi90aW1lc2VyaWVzIjtmdW5jdGlvbiBTQSh0KXtjb25zdCBlPXQuaW5kZXhPZigiLyIpO3JldHVybntydW46dC5zdWJzdHJpbmcoZSsxKSxleHBlcmltZW50SWQ6dC5zdWJzdHJpbmcoMCxlKX19ZnVuY3Rpb24gREEodCxlKXtyZXR1cm5gJHtlfS8ke3R9YH1mdW5jdGlvbiBFQSh0LGUpe2NvbnN0e3J1blRvU2VyaWVzOm4scnVuOm99PXQsaT1mQSh0LFsicnVuVG9TZXJpZXMiLCJydW4iXSksYT1PYmplY3QuYXNzaWduKHt9LGkpO3JldHVybiBuJiYoYS5ydW5Ub1Nlcmllcz1SQShuLGUpKSxvJiYoYS5ydW5JZD1EQShvLGUpKSxhfWZ1bmN0aW9uIFJBKHQsZSl7Y29uc3Qgbj17fTtmb3IoY29uc3QgbyBpbiB0KXQuaGFzT3duUHJvcGVydHkobykmJihuW0RBKG8sZSldPXRbb10pO3JldHVybiBufWNsYXNzIEFBe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5odHRwPXQsdGhpcy5zdG9yZT1lfWZldGNoVGFnTWV0YWRhdGEodCl7Y29uc3QgZT10Lm1hcCgodD0+dGhpcy5odHRwLmdldChgL2V4cGVyaW1lbnQvJHt0fS8ke2tBfS90YWdzYCkucGlwZShJdCgoZT0+KGZ1bmN0aW9uIG4odCxlKXtjb25zdCBuPXt9O2Zvcihjb25zdCBvIG9mIE9iamVjdC5rZXlzKHQpKXtjb25zdCBpPW87aWYoTUEoaSkpe2NvbnN0IG89dFtpXSx7dGFnUnVuU2FtcGxlZEluZm86YX09byxyPWZBKG8sWyJ0YWdSdW5TYW1wbGVkSW5mbyJdKSxzPXt9O2Zvcihjb25zdCB0IGluIGEpYS5oYXNPd25Qcm9wZXJ0eSh0KSYmKHNbdF09UkEoYVt0XSxlKSk7bltpXT1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scikse3RhZ1J1blNhbXBsZWRJbmZvOnN9KX1lbHNle2NvbnN0IG89dFtpXSx7cnVuVGFnSW5mbzphfT1vLHI9ZkEobyxbInJ1blRhZ0luZm8iXSk7bltpXT1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30scikse3J1blRhZ0luZm86UkEoYSxlKX0pfX1yZXR1cm4gbn0pKGUsdCkpKSkpKSxuPXRoaXMuc3RvcmUuc2VsZWN0KHFEKS5waXBlKGNlKEJvb2xlYW4pLGJlKDEpLFZlKHRoaXMuc3RvcmUuc2VsZWN0KG9FKSksSXQoKChbLHRdKT0+dCkpKTtyZXR1cm4gJHQoZSkucGlwZShWZShuKSxJdCgoKFt0LGVdKT0+e2NvbnN0IG49KGZ1bmN0aW9uIG8odCl7Y29uc3QgZT17fTtmb3IoY29uc3QgbiBvZiB0KWZvcihjb25zdCB0IG9mIE9iamVjdC52YWx1ZXMoaEEpKWlmKE1BKHQpKXtlW3RdPWVbdF18fHt0YWdEZXNjcmlwdGlvbnM6e30sdGFnUnVuU2FtcGxlZEluZm86e319O2NvbnN0e3RhZ0Rlc2NyaXB0aW9uczpvLHRhZ1J1blNhbXBsZWRJbmZvOml9PW5bdF07ZVt0XS50YWdEZXNjcmlwdGlvbnM9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGVbdF0udGFnRGVzY3JpcHRpb25zKSxvKTtjb25zdCBhPWVbdF0udGFnUnVuU2FtcGxlZEluZm87Zm9yKGNvbnN0IHQgb2YgT2JqZWN0LmtleXMoaSkpe2FbdF09YVt0XXx8e307Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXMoaVt0XSkpYVt0XVtlXT1pW3RdW2VdfX1lbHNle2VbdF09ZVt0XXx8e3RhZ0Rlc2NyaXB0aW9uczp7fSxydW5UYWdJbmZvOnt9fTtjb25zdHt0YWdEZXNjcmlwdGlvbnM6byxydW5UYWdJbmZvOml9PW5bdF07ZVt0XS50YWdEZXNjcmlwdGlvbnM9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGVbdF0udGFnRGVzY3JpcHRpb25zKSxvKSxlW3RdLnJ1blRhZ0luZm89T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGVbdF0ucnVuVGFnSW5mbyksaSl9cmV0dXJuIGV9KSh0KTtyZXR1cm4gZXx8KG5baEEuSU1BR0VTXT17dGFnRGVzY3JpcHRpb25zOnt9LHRhZ1J1blNhbXBsZWRJbmZvOnt9fSksbn0pKSl9ZmV0Y2hUaW1lU2VyaWVzKHQpe2NvbnN0IGU9dC5tYXAoKHQ9PntpZih4QSh0LnBsdWdpbikpe2NvbnN0IGU9dCx7cnVuSWQ6bn09ZSxvPWZBKGUsWyJydW5JZCJdKSx7cnVuOmksZXhwZXJpbWVudElkOmF9PVNBKG4pLHI9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG8pLHtydW46aX0pO3JldHVybiB0aGlzLmZldGNoVGltZVNlcmllc0JhY2tlbmRSZXF1ZXN0KHIsYSkucGlwZShJdCgoKHtyZXNwb25zZTp0LGV4cGVyaW1lbnRJZDplfSk9PkVBKHQsZSkpKSl9Y29uc3QgZT10LHtleHBlcmltZW50SWRzOm59PWUsbz1mQShlLFsiZXhwZXJpbWVudElkcyJdKTtyZXR1cm4gJHQobi5tYXAoKHQ9PnRoaXMuZmV0Y2hUaW1lU2VyaWVzQmFja2VuZFJlcXVlc3Qobyx0KSkpKS5waXBlKEl0KCh0PT57Y29uc3QgZT1mQSh0WzBdLnJlc3BvbnNlLFsicnVuVG9TZXJpZXMiLCJlcnJvciJdKTtmb3IoY29uc3R7cmVzcG9uc2U6bixleHBlcmltZW50SWQ6b31vZiB0KXtjb25zdCB0PUVBKG4sbyk7aWYoZS5lcnJvciljb250aW51ZTtjb25zdHtydW5Ub1NlcmllczppLGVycm9yOmF9PXQ7aWYoYSllLmVycm9yPWEsZS5ydW5Ub1Nlcmllcz12b2lkIDA7ZWxzZXtlLnJ1blRvU2VyaWVzPWUucnVuVG9TZXJpZXN8fHt9O2Zvcihjb25zdCB0IG9mIE9iamVjdC5rZXlzKGkpKWUucnVuVG9TZXJpZXNbdF09aVt0XX19cmV0dXJuIGV9KSkpfSkpO3JldHVybiAkdChlKX1mZXRjaFRpbWVTZXJpZXNCYWNrZW5kUmVxdWVzdCh0LGUpe2NvbnN0IG49bmV3IEZvcm1EYXRhO3JldHVybiBuLmFwcGVuZCgicmVxdWVzdHMiLEpTT04uc3RyaW5naWZ5KFt0XSkpLHRoaXMuaHR0cC5wb3N0KGAvZXhwZXJpbWVudC8ke2V9LyR7a0F9L3RpbWVTZXJpZXNgLG4pLnBpcGUoSXQoKHQ9Pih7cmVzcG9uc2U6dFswXSxleHBlcmltZW50SWQ6ZX0pKSkpfWltYWdlVXJsKHQpe3JldHVybmAke2tBfS9pbWFnZURhdGE/aW1hZ2VJZD0ke3R9YH1kb3dubG9hZFVybCh0LGUsbixvKXtjb25zdHtydW46aSxleHBlcmltZW50SWQ6YX09U0Eobik7bGV0IHI7c3dpdGNoKHQpe2Nhc2UgaEEuU0NBTEFSUzpyPSJzY2FsYXJzL3NjYWxhcnMiO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBOb3QgaW1wbGVtZW50ZWQ6IGRvd25sb2FkVXJsIGZvciAke3R9IGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXRgKX1pZighYSl0aHJvdyBuZXcgRXJyb3IoImV4cGVyaW1lbnRJZCBpcyBlbXB0eTsgaXQgaXMgcmVxdWlyZWQgdG8gZm9ybSBkb3dubG9hZFVybC4iKTtyZXR1cm5gL2V4cGVyaW1lbnQvJHthfS9kYXRhL3BsdWdpbi8ke3J9PyR7bmV3IFVSTFNlYXJjaFBhcmFtcyh7dGFnOmUscnVuOmksZm9ybWF0Om99KX1gfX1BQS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8QUEpKHZyKGxFKSx2cihJdykpfSxBQS7JtXByb3Y9TW4oe3Rva2VuOkFBLGZhY3Rvcnk6QUEuybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEFBLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpsRX0se3R5cGU6SXd9XX0pLG51bGwpO2NsYXNzIFRBe31UQS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VEEpfSxUQS7JtXByb3Y9TW4oe3Rva2VuOlRBLGZhY3Rvcnk6VEEuybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFRBLFt7dHlwZTppbX1dLG51bGwsbnVsbCk7Y29uc3QgTkE9ImV4cGVyaW1lbnRhbFBsdWdpbiIsekE9InNjYWxhcnNCYXRjaFNpemUiLElBPSJlbmFibGVDb2xvckdyb3VwIixIQT0iZW5hYmxlQ29sb3JHcm91cEJ5UmVnZXgiLEZBPSJkYXJrTW9kZSIsTEE9ImVuYWJsZUxpbmtUaW1lIixCQT1uZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO2NsYXNzIFZBe2dldFBhcmFtcygpe3JldHVybiBCQX19VkEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFZBKX0sVkEuybVwcm92PU1uKHt0b2tlbjpWQSxmYWN0b3J5OlZBLsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChWQSxbe3R5cGU6aW19XSxudWxsLG51bGwpO2NsYXNzIGpBe2NvbnN0cnVjdG9yKHQpe3RoaXMucXVlcnlQYXJhbXM9dH1nZXRGZWF0dXJlcyh0PSExKXtjb25zdCBlPXRoaXMucXVlcnlQYXJhbXMuZ2V0UGFyYW1zKCksbj10P3RoaXMuZ2V0UGFydGlhbEZlYXR1cmVzRnJvbU1lZGlhUXVlcnkoKTp7fTtyZXR1cm4gZS5oYXMoTkEpJiYobi5lbmFibGVkRXhwZXJpbWVudGFsUGx1Z2lucz1lLmdldEFsbChOQSkpLGUuaGFzKCJ0ZW5zb3Jib2FyZENvbGFiIikmJihuLmluQ29sYWI9InRydWUiPT09ZS5nZXQoInRlbnNvcmJvYXJkQ29sYWIiKSksZS5oYXMoekEpJiYobi5zY2FsYXJzQmF0Y2hTaXplPU51bWJlcihlLmdldCh6QSkpKSxlLmhhcyhJQSkmJihuLmVuYWJsZWRDb2xvckdyb3VwPSJmYWxzZSIhPT1lLmdldChJQSkpLGUuaGFzKEhBKSYmKG4uZW5hYmxlZENvbG9yR3JvdXBCeVJlZ2V4PSJmYWxzZSIhPT1lLmdldChIQSkpLGUuaGFzKEZBKSYmKG4uZGVmYXVsdEVuYWJsZURhcmtNb2RlPSJmYWxzZSIhPT1lLmdldChGQSkpLGUuaGFzKExBKSYmKG4uZW5hYmxlZExpbmtlZFRpbWU9ImZhbHNlIiE9PWUuZ2V0KExBKSksbn1nZXRQYXJ0aWFsRmVhdHVyZXNGcm9tTWVkaWFRdWVyeSgpe2NvbnN0IHQ9e307cmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIikubWF0Y2hlcyYmKHQuZGVmYXVsdEVuYWJsZURhcmtNb2RlPSEwKSx0fX1qQS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8akEpKHZyKFZBKSl9LGpBLsm1cHJvdj1Nbih7dG9rZW46akEsZmFjdG9yeTpqQS7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoakEsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlZBfV19KSxudWxsKTtjbGFzcyBVQXt9VUEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFVBKX0sVUEuybVtb2Q9YW8oe3R5cGU6VUF9KSxVQS7JtWluaj12bih7cHJvdmlkZXJzOltqQSxWQSx7cHJvdmlkZTpUQSx1c2VDbGFzczpqQX1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChVQSxbe3R5cGU6QXksYXJnczpbe3Byb3ZpZGVyczpbakEsVkEse3Byb3ZpZGU6VEEsdXNlQ2xhc3M6akF9XX1dfV0sbnVsbCxudWxsKTtjb25zdCBHQT1KUCgiW0ZFQVRVUkUgRkxBR10gUGFydGlhbCBGZWF0dXJlIEZsYWdzIExvYWRlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLFdBPUpQKCJbRkVBVFVSRSBGTEFHXSBFbmFibGUgRGFyayBNb2RlIE92ZXJyaWRlIENoYW5nZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxZQT1KUCgiW0ZFQVRVUkUgRkxBR10gRWZmZWN0cyBJbml0Iik7Y2xhc3MgcUF7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuYWN0aW9ucyQ9dCx0aGlzLnN0b3JlPWUsdGhpcy5kYXRhU291cmNlPW4sdGhpcy5nZXRGZWF0dXJlRmxhZ3MkPU1rKCgoKT0+dGhpcy5hY3Rpb25zJC5waXBlKERrKFlBKSxmZSh0aGlzLnN0b3JlLnNlbGVjdChLRCkpLEl0KCgoWyx0XSk9Pntjb25zdCBlPXRoaXMuZGF0YVNvdXJjZS5nZXRGZWF0dXJlcyh0KTtyZXR1cm4gR0Eoe2ZlYXR1cmVzOmV9KX0pKSkpKX1uZ3J4T25Jbml0RWZmZWN0cygpe3JldHVybiBZQSgpfX1xQS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8cUEpKHZyKFNrKSx2cihJdyksdnIoVEEpKX0scUEuybVwcm92PU1uKHt0b2tlbjpxQSxmYWN0b3J5OnFBLsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChxQSxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6U2t9LHt0eXBlOkl3fSx7dHlwZTpUQX1dfSksbnVsbCk7Y29uc3QgWkE9e2lzRmVhdHVyZUZsYWdzTG9hZGVkOiExLGRlZmF1bHRGbGFnczp7aXNBdXRvRGFya01vZGVBbGxvd2VkOiEwLGRlZmF1bHRFbmFibGVEYXJrTW9kZTohMSxlbmFibGVEYXJrTW9kZU92ZXJyaWRlOm51bGwsZW5hYmxlZENvbG9yR3JvdXA6ITAsZW5hYmxlZENvbG9yR3JvdXBCeVJlZ2V4OiEwLGVuYWJsZWRFeHBlcmltZW50YWxQbHVnaW5zOltdLGluQ29sYWI6ITEsc2NhbGFyc0JhdGNoU2l6ZTp2b2lkIDAsbWV0cmljc0ltYWdlU3VwcG9ydEVuYWJsZWQ6ITAsZW5hYmxlZExpbmtlZFRpbWU6ITEsZW5hYmxlVGltZVNlcmllc1Byb21vdGlvbjohMX0sZmxhZ092ZXJyaWRlczp7fX0sWEE9bmV3IEdhKCJbRmVhdHVyZSBGbGFnXSBTdG9yZSBDb25maWciKTtmdW5jdGlvbiBLQSgpe3JldHVybntpbml0aWFsU3RhdGU6WkF9fWNvbnN0IEpBPXlrKFpBLGJrKEdBLCgodCx7ZmVhdHVyZXM6ZX0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2lzRmVhdHVyZUZsYWdzTG9hZGVkOiEwLGZsYWdPdmVycmlkZXM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuZmxhZ092ZXJyaWRlcyksZSl9KSkpLGJrKFdBLCgodCx7ZW5hYmxlRGFya01vZGU6ZX0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2ZsYWdPdmVycmlkZXM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuZmxhZ092ZXJyaWRlcykse2VuYWJsZURhcmtNb2RlT3ZlcnJpZGU6ZX0pfSkpKSxiayhXUywoKHQse3BhcnRpYWxTZXR0aW5nczplfSk9PntpZighZS50aGVtZU92ZXJyaWRlKXJldHVybiB0O2xldCBuO3N3aXRjaChlLnRoZW1lT3ZlcnJpZGUpe2Nhc2UgR1MuQlJPV1NFUl9ERUZBVUxUOm49bnVsbDticmVhaztjYXNlIEdTLkRBUks6bj0hMDticmVhaztjYXNlIEdTLkxJR0hUOm49ITF9cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7ZmxhZ092ZXJyaWRlczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5mbGFnT3ZlcnJpZGVzKSx7ZW5hYmxlRGFya01vZGVPdmVycmlkZTpufSl9KX0pKSk7ZnVuY3Rpb24gUUEodCxlKXtyZXR1cm4gSkEodCxlKX1mdW5jdGlvbiAkQSgpe3JldHVybiBadyhRRCwodD0+bnVsbD09PXQ/e3RoZW1lT3ZlcnJpZGU6R1MuQlJPV1NFUl9ERUZBVUxUfTp7dGhlbWVPdmVycmlkZTp0P0dTLkRBUks6R1MuTElHSFR9KSl9Y2xhc3MgdFR7fXRULsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx0VCl9LHRULsm1bW9kPWFvKHt0eXBlOnRUfSksdFQuybVpbmo9dm4oe3Byb3ZpZGVyczpbe3Byb3ZpZGU6WEEsdXNlRmFjdG9yeTpLQX1dLGltcG9ydHM6W1tVQSxkay5mb3JGZWF0dXJlKFdELFFBLFhBKSxXay5mb3JGZWF0dXJlKFtxQV0pLHFTLmRlZmluZUdsb2JhbFNldHRpbmcoJEEpXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHRULFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbVUEsZGsuZm9yRmVhdHVyZShXRCxRQSxYQSksV2suZm9yRmVhdHVyZShbcUFdKSxxUy5kZWZpbmVHbG9iYWxTZXR0aW5nKCRBKV0scHJvdmlkZXJzOlt7cHJvdmlkZTpYQSx1c2VGYWN0b3J5OktBfV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyh0VCx7aW1wb3J0czpbVUEsY2ssR2sscVNdfSk7Y2xhc3MgZVR7fWZ1bmN0aW9uIG5UKHQsZSxuLG8pe3JldHVybiB0W2VdLmhhc093blByb3BlcnR5KG4pP01BKGUpP3RbZV1bbl0uaGFzT3duUHJvcGVydHkobyk/dFtlXVtuXVtvXTpudWxsOnRbZV1bbl06bnVsbH1mdW5jdGlvbiBvVCh0LGUsbixvKXtpZihNQShlKSl7Y29uc3QgaT1PYmplY3QuYXNzaWduKHt9LHRbZV0pLGE9KGZ1bmN0aW9uIGkodCxlLG4pe2NvbnN0IG89dC5oYXNPd25Qcm9wZXJ0eShlKT9PYmplY3QuYXNzaWduKHt9LHRbZV0pOnt9LGk9by5oYXNPd25Qcm9wZXJ0eShuKTtyZXR1cm4gb1tuXT1pP09iamVjdC5hc3NpZ24oe30sb1tuXSk6e3J1blRvU2VyaWVzOnt9LHJ1blRvTG9hZFN0YXRlOnt9fSxvfSkoaSxuLG8pO3JldHVybiBpW25dPWEsaX1jb25zdCBhPU9iamVjdC5hc3NpZ24oe30sdFtlXSkscj1hLmhhc093blByb3BlcnR5KG4pO3JldHVybiBhW25dPXI/T2JqZWN0LmFzc2lnbih7fSxhW25dKTp7cnVuVG9TZXJpZXM6e30scnVuVG9Mb2FkU3RhdGU6e319LGF9ZnVuY3Rpb24gaVQodCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHQpfWZ1bmN0aW9uIGFUKHQsZSxuKXtjb25zdCBvPU9iamVjdC5hc3NpZ24oe30sbik7Zm9yKGNvbnN0IG4gb2YgZSlvW25dPXQ7cmV0dXJuIG99ZnVuY3Rpb24gclQodCxlLG4sbyl7aWYoTUEoZSkpe2NvbnN0IGk9dFtlXS50YWdSdW5TYW1wbGVkSW5mbztyZXR1cm4gaS5oYXNPd25Qcm9wZXJ0eShuKT9PYmplY3Qua2V5cyhpW25dKS5maWx0ZXIoKHQ9Pm88aVtuXVt0XS5tYXhTYW1wbGVzUGVyU3RlcCkpOltdfWNvbnN0IGk9dFtlXS50YWdUb1J1bnM7cmV0dXJuIGkuaGFzT3duUHJvcGVydHkobik/aVtuXTpbXX1mdW5jdGlvbiBzVCh0LGUsbixvLGksYSl7Y29uc3Qgcj1uZXcgU2V0KHQpLHM9W107Zm9yKGNvbnN0IG8gb2YgdClmb3IoY29uc3QgdCBvZiBlKWlmKChsPW5bdF0pLnBsdWdpbj09PShjPW8pLnBsdWdpbiYmbC50YWc9PT1jLnRhZyYmbC5zYW1wbGU9PT1jLnNhbXBsZSYmKGwucnVuSWQ9PT1jLnJ1bklkfHwhbC5ydW5JZCYmIWMucnVuSWQpKXtzLnB1c2godCksci5kZWxldGUobyk7YnJlYWt9dmFyIGwsYztpZighcy5sZW5ndGgpcmV0dXJue3VucmVzb2x2ZWRJbXBvcnRlZFBpbm5lZENhcmRzOnQsY2FyZE1ldGFkYXRhTWFwOm4sY2FyZFRvUGlubmVkQ29weTpvLHBpbm5lZENhcmRUb09yaWdpbmFsOmksY2FyZFN0ZXBJbmRleDphfTtsZXQgZD17Y2FyZFRvUGlubmVkQ29weTpvLHBpbm5lZENhcmRUb09yaWdpbmFsOmksY2FyZFN0ZXBJbmRleDphLGNhcmRNZXRhZGF0YU1hcDpufTtmb3IoY29uc3QgdCBvZiBzKWQ9bFQodCxkLmNhcmRUb1Bpbm5lZENvcHksZC5waW5uZWRDYXJkVG9PcmlnaW5hbCxkLmNhcmRTdGVwSW5kZXgsZC5jYXJkTWV0YWRhdGFNYXApO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZCkse3VucmVzb2x2ZWRJbXBvcnRlZFBpbm5lZENhcmRzOlsuLi5yXX0pfWZ1bmN0aW9uIGxUKHQsZSxuLG8saSl7aWYoZS5oYXModCkpcmV0dXJue2NhcmRUb1Bpbm5lZENvcHk6ZSxwaW5uZWRDYXJkVG9PcmlnaW5hbDpuLGNhcmRTdGVwSW5kZXg6byxjYXJkTWV0YWRhdGFNYXA6aX07Y29uc3QgYT1uZXcgTWFwKGUpLHI9bmV3IE1hcChuKSxzPU9iamVjdC5hc3NpZ24oe30sbyksbD1PYmplY3QuYXNzaWduKHt9LGkpLGM9KGZ1bmN0aW9uIGQodCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHtiYXNlQ2FyZElkOnR9KX0pKHQpO2Euc2V0KHQsYyksci5zZXQoYyx0KSxvLmhhc093blByb3BlcnR5KHQpJiYoc1tjXT1vW3RdKTtjb25zdCBwPWlbdF07aWYoIXApdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcGluIGEgY2FyZCB3aXRob3V0IG1ldGFkYXRhIik7cmV0dXJuIGxbY109cCx7Y2FyZFRvUGlubmVkQ29weTphLHBpbm5lZENhcmRUb09yaWdpbmFsOnIsY2FyZFN0ZXBJbmRleDpzLGNhcmRNZXRhZGF0YU1hcDpsfX1mdW5jdGlvbiBjVCh0KXtyZXR1cm4gdC5waW5uZWRDYXJkVG9PcmlnaW5hbC5zaXplK3QudW5yZXNvbHZlZEltcG9ydGVkUGlubmVkQ2FyZHMubGVuZ3RoPDEwfWVULsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxlVCl9LGVULsm1bW9kPWFvKHt0eXBlOmVUfSksZVQuybVpbmo9dm4oe3Byb3ZpZGVyczpbe3Byb3ZpZGU6UEEsdXNlQ2xhc3M6QUF9XSxpbXBvcnRzOltbdFQsY0VdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZVQsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOlt0VCxjRV0scHJvdmlkZXJzOlt7cHJvdmlkZTpQQSx1c2VDbGFzczpBQX1dfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oZVQse2ltcG9ydHM6W3RULGNFXX0pO2NvbnN0IGRUPSJtZXRyaWNzIixwVD17dG9vbHRpcFNvcnQ6YkEuREVGQVVMVCxpZ25vcmVPdXRsaWVyczohMCx4QXhpc1R5cGU6eUEuU1RFUCxzY2FsYXJTbW9vdGhpbmc6LjYsc2NhbGFyUGFydGl0aW9uTm9uTW9ub3RvbmljWDohMSxpbWFnZUJyaWdodG5lc3NJbk1pbGxpOjFlMyxpbWFnZUNvbnRyYXN0SW5NaWxsaToxZTMsaW1hZ2VTaG93QWN0dWFsU2l6ZTohMSxoaXN0b2dyYW1Nb2RlOnBFLk9GRlNFVH0sbVQ9S3coZFQpLHVUPVp3KG1ULCh0PT50LnRhZ01ldGFkYXRhTG9hZFN0YXRlKSk7WncobVQsKHQ9PnQudGFnTWV0YWRhdGEpKTtjb25zdCBmVD1adyhtVCwodD0+dC5jYXJkTGlzdCkpLGdUPVp3KG1ULCgodCxlKT0+e2lmKCF0LmNhcmRNZXRhZGF0YU1hcC5oYXNPd25Qcm9wZXJ0eShlKSlyZXR1cm4geUUuTk9UX0xPQURFRDtjb25zdHtwbHVnaW46bix0YWc6byxydW5JZDppLHNhbXBsZTphfT10LmNhcmRNZXRhZGF0YU1hcFtlXSxyPW5UKHQudGltZVNlcmllc0RhdGEsbixvLGEpO2lmKCFyKXJldHVybiB5RS5OT1RfTE9BREVEO2NvbnN0IHM9ci5ydW5Ub0xvYWRTdGF0ZTtpZihpKXJldHVybiBzLmhhc093blByb3BlcnR5KGkpP3NbaV06eUUuTk9UX0xPQURFRDtjb25zdCBsPXJUKHQudGFnTWV0YWRhdGEsbixvLGEpO2lmKCFsLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBsb2FkIGEgY2FyZCB3aG9zZSB0YWcgaGFzIG5vIHJ1bnMiKTtyZXR1cm4gbC5ldmVyeSgodD0+c1t0XT09PXlFLkxPQURFRCkpP3lFLkxPQURFRDpsLnNvbWUoKHQ9PnNbdF09PT15RS5MT0FESU5HKSk/eUUuTE9BRElORzp5RS5OT1RfTE9BREVEfSkpLGhUPVp3KG1ULCgodCxlKT0+e2lmKCF0LmNhcmRNZXRhZGF0YU1hcC5oYXNPd25Qcm9wZXJ0eShlKSlyZXR1cm4gbnVsbDtjb25zdHtwbHVnaW46bix0YWc6byxzYW1wbGU6aX09dC5jYXJkTWV0YWRhdGFNYXBbZV0sYT1uVCh0LnRpbWVTZXJpZXNEYXRhLG4sbyxpKTtyZXR1cm4gYT9hLnJ1blRvU2VyaWVzOm51bGx9KSksYlQ9WncobVQsKHQ9PnQuY2FyZE1ldGFkYXRhTWFwKSkseVQ9WncoYlQsKCh0LGUpPT50Lmhhc093blByb3BlcnR5KGUpP3RbZV06bnVsbCkpLF9UPVp3KG1ULCh0PT50LnZpc2libGVDYXJkTWFwKSksQ1Q9WncoX1QsKHQ9Pm5ldyBTZXQodC52YWx1ZXMoKSkpKSxNVD1adyhmVCxiVCwoKHQsZSk9PnQuZmlsdGVyKCh0PT5lLmhhc093blByb3BlcnR5KHQpKSkubWFwKCh0PT5PYmplY3QuYXNzaWduKHtjYXJkSWQ6dH0sZVt0XSkpKSkpLHZUPVp3KG1ULCgodCxlKT0+dC5jYXJkU3RlcEluZGV4Lmhhc093blByb3BlcnR5KGUpP3QuY2FyZFN0ZXBJbmRleFtlXTpudWxsKSkseFQ9WncobVQsKHQ9PnQuY2FyZFRvUGlubmVkQ29weSkpLE9UPVp3KG1ULCh0PT50LnBpbm5lZENhcmRUb09yaWdpbmFsKSksUFQ9WncoeFQsYlQsKCh0LGUpPT5bLi4udC52YWx1ZXMoKV0uZmlsdGVyKCh0PT5lLmhhc093blByb3BlcnR5KHQpKSkubWFwKCh0PT5PYmplY3QuYXNzaWduKHtjYXJkSWQ6dH0sZVt0XSkpKSkpLHdUPVp3KHhULE9ULCgodCxlLG4pPT50LmhhcyhuKXx8ZS5oYXMobikpKSxrVD1adyhtVCwodD0+dC51bnJlc29sdmVkSW1wb3J0ZWRQaW5uZWRDYXJkcykpLFNUPVp3KG1ULCh0PT5jVCh0KSkpLERUPVp3KG1ULCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5zZXR0aW5ncyksdC5zZXR0aW5nT3ZlcnJpZGVzKSkpLEVUPVp3KG1ULCh0PT50LnNldHRpbmdPdmVycmlkZXMpKSxSVD1adyhEVCwodD0+dC50b29sdGlwU29ydCkpLEFUPVp3KERULCh0PT50Lmlnbm9yZU91dGxpZXJzKSksVFQ9WncoRFQsKHQ9PnQueEF4aXNUeXBlKSksTlQ9WncoRFQsKHQ9PnQuaGlzdG9ncmFtTW9kZSkpLHpUPVp3KERULCh0PT50LnNjYWxhclNtb290aGluZykpLElUPVp3KERULCh0PT50LnNjYWxhclBhcnRpdGlvbk5vbk1vbm90b25pY1gpKSxIVD1adyhEVCwodD0+dC5pbWFnZUJyaWdodG5lc3NJbk1pbGxpKSksRlQ9WncoRFQsKHQ9PnQuaW1hZ2VDb250cmFzdEluTWlsbGkpKSxMVD1adyhEVCwodD0+dC5pbWFnZVNob3dBY3R1YWxTaXplKSksQlQ9WncobVQsKHQ9PnQudGFnRmlsdGVyKSksVlQ9WncobVQsKCh0LGUpPT5Cb29sZWFuKHQudGFnR3JvdXBFeHBhbmRlZC5nZXQoZSkpKSksalQ9WncobVQsKHQ9PnQuc2VsZWN0VGltZUVuYWJsZWQpKSxVVD1adyhtVCwodD0+dC51c2VSYW5nZVNlbGVjdFRpbWUpKSxHVD1adyhtVCwodD0+e2NvbnN0e21pbjplLG1heDpufT10LnN0ZXBNaW5NYXg7cmV0dXJue21pbjplPT09MS8wPzA6ZSxtYXg6bj09PS0xLzA/MWUzOm59fSkpLFdUPVp3KG1ULEdULCgodCxlKT0+e3ZhciBuO3JldHVybiB0LnNlbGVjdGVkVGltZT9PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5zZWxlY3RlZFRpbWUpLHtlbmQ6bnVsbCE9PShuPXQuc2VsZWN0ZWRUaW1lLmVuZCkmJnZvaWQgMCE9PW4/bjp7c3RlcDplLm1heH19KTp7c3RhcnQ6e3N0ZXA6ZS5taW59LGVuZDp7c3RlcDplLm1heH19fSkpLFlUPVp3KG1ULFdULCgodCxlKT0+dC5zZWxlY3RUaW1lRW5hYmxlZD90LnVzZVJhbmdlU2VsZWN0VGltZT9lOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7ZW5kOm51bGx9KTpudWxsKSkscVQ9WncobVQsKHQ9PnQuZmlsdGVyZWRQbHVnaW5UeXBlcykpLFpUPVp3KG1ULCh0PT50LnByb21vdGVUaW1lU2VyaWVzKSksWFQ9WncobVQsKHQ9PnQuaXNTZXR0aW5nc1BhbmVPcGVuKSk7dmFyIEtUOyEoZnVuY3Rpb24odCl7dFt0Lk5PTkU9MF09Ik5PTkUiLHRbdC5XSEFUU19ORVc9MV09IldIQVRTX05FVyJ9KShLVHx8KEtUPXt9KSk7Y29uc3QgSlQ9S3coIm5vdGlmaWNhdGlvbiIpO1p3KEpULCh0PT50Lm5vdGlmaWNhdGlvbnMpKSxadyhKVCwodD0+e3ZhciBlO3JldHVybiBudWxsIT09KGU9dC5sYXN0UmVhZFRpbWVzdGFtcEluTXMpJiZ2b2lkIDAhPT1lP2U6LTF9KSk7Y29uc3QgUVQ9InJ1bnMiO3ZhciAkVCx0TjtmdW5jdGlvbiBlTih0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodC5zbGljZSgpLnNvcnQoKSl9ZnVuY3Rpb24gbk4odCxlLG4pe2NvbnN0IG89e30saT1bXSxhPXttYXRjaGVzOm8sbm9uTWF0Y2hlczppfTtzd2l0Y2godC5rZXkpe2Nhc2UgdE4uUlVOOmZvcihjb25zdCB0IG9mIGUpb1t0LmlkXT1bdF07YnJlYWs7Y2FzZSB0Ti5FWFBFUklNRU5UOmZvcihjb25zdCB0IG9mIGUpe2NvbnN0IGU9blt0LmlkXSxpPW9bZV18fFtdO2kucHVzaCh0KSxvW2VdPWl9YnJlYWs7Y2FzZSB0Ti5SRUdFWDppZighdC5yZWdleFN0cmluZylicmVhaztsZXQgYTt0cnl7YT1uZXcgUmVnRXhwKHQucmVnZXhTdHJpbmcpfWNhdGNoKHQpe2JyZWFrfWZvcihjb25zdCB0IG9mIGUpe2NvbnN0IGU9dC5uYW1lLm1hdGNoKGEpO2lmKGUpe2NvbnN0IG49ZS5sZW5ndGg+MT9KU09OLnN0cmluZ2lmeShlLnNsaWNlKDEpKToicHNldWRvX2dyb3VwIixpPW9bbl18fFtdO2kucHVzaCh0KSxvW25dPWl9ZWxzZSBpLnB1c2godCl9fXJldHVybiBhfWZ1bmN0aW9uIG9OKHQsZSl7c3dpdGNoKHQpe2Nhc2UgdE4uUkVHRVg6cmV0dXJue2tleTp0LHJlZ2V4U3RyaW5nOm51bGwhPWU/ZToiIn07Y2FzZSB0Ti5SVU46Y2FzZSB0Ti5FWFBFUklNRU5UOmRlZmF1bHQ6cmV0dXJue2tleTp0fX19IShmdW5jdGlvbih0KXt0W3QuRVhQRVJJTUVOVF9OQU1FPTBdPSJFWFBFUklNRU5UX05BTUUiLHRbdC5IUEFSQU09MV09IkhQQVJBTSIsdFt0Lk1FVFJJQz0yXT0iTUVUUklDIix0W3QuUlVOX05BTUU9M109IlJVTl9OQU1FIn0pKCRUfHwoJFQ9e30pKSwoZnVuY3Rpb24odCl7dFt0LlJVTj0wXT0iUlVOIix0W3QuRVhQRVJJTUVOVD0xXT0iRVhQRVJJTUVOVCIsdFt0LlJFR0VYPTJdPSJSRUdFWCJ9KSh0Tnx8KHROPXt9KSk7Y29uc3QgaU49S3coUVQpLGFOPVp3KGlOLCh0PT50LmRhdGEpKSxyTj1adyhhTiwoKHQsZSk9Pnt2YXIgbjtyZXR1cm4gbnVsbCE9PShuPXQucnVuSWRUb0V4cElkW2UucnVuSWRdKSYmdm9pZCAwIT09bj9uOm51bGx9KSksc049WncoYU4sKCh0LGUpPT57dmFyIG47cmV0dXJuIG51bGwhPT0obj10LnJ1bk1ldGFkYXRhW2UucnVuSWRdKSYmdm9pZCAwIT09bj9uOm51bGx9KSksbE49WncoYU4sKCh0LGUpPT4odC5ydW5JZHNbZS5leHBlcmltZW50SWRdfHxbXSkuZmlsdGVyKChlPT5Cb29sZWFuKHQucnVuTWV0YWRhdGFbZV0pKSkubWFwKChlPT50LnJ1bk1ldGFkYXRhW2VdKSkpKSxjTj1adyhhTiwoKHQsZSk9Pnt2YXIgbjtyZXR1cm4gbnVsbCE9PShuPXQucnVuSWRzW2UuZXhwZXJpbWVudElkXSkmJnZvaWQgMCE9PW4/bjpbXX0pKSxkTj1adyhhTiwodD0+bmV3IE1hcChPYmplY3QuZW50cmllcyh0LnJ1bk1ldGFkYXRhKSkpKSxwTj1adyhhTiwoKHQsZSk9PnQucnVuc0xvYWRTdGF0ZVtlLmV4cGVyaW1lbnRJZF18fHtsYXN0TG9hZGVkVGltZUluTXM6bnVsbCxzdGF0ZTp5RS5OT1RfTE9BREVEfSkpLG1OPVp3KGFOLCgodCxlKT0+e2NvbnN0IG49ZU4oZS5leHBlcmltZW50SWRzKTtyZXR1cm4gdC5zZWxlY3Rpb25TdGF0ZS5nZXQobil8fG5ldyBNYXB9KSksdU49WncoYU4sKHQ9Pm51bGwhPT10LnVzZXJTZXRHcm91cEJ5S2V5P29OKHQudXNlclNldEdyb3VwQnlLZXksdC5jb2xvckdyb3VwUmVnZXhTdHJpbmcpOm51bGwpKSxmTj1adyh1TixhTiwoKHQsZSk9Pm51bGwhPXQ/dDplLmluaXRpYWxHcm91cEJ5KSksZ049WncoYU4sKHQ9PnQucmVnZXhGaWx0ZXIpKSxoTj1adyhpTiwodD0+dC51aSkpLGJOPVp3KGhOLCh0PT50LnBhZ2luYXRpb25PcHRpb24pKSx5Tj1adyhoTiwodD0+dC5zb3J0KSksX049WncoYU4sKHQ9PnQucnVuQ29sb3JPdmVycmlkZUZvckdyb3VwQnkpKSxDTj1adyhhTiwodD0+dC5kZWZhdWx0UnVuQ29sb3JJZEZvckdyb3VwQnkpKSxNTj1adyhhTiwodD0+dC5jb2xvckdyb3VwUmVnZXhTdHJpbmcpKSx2Tj1KUCgiW1NldHRpbmdzXSBSZWxvYWQgRW5hYmxlIFRvZ2dsZWQiKSx4Tj1KUCgiW1NldHRpbmdzXSBSZWxvYWQgUGVyaW9kIENoYW5nZSIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLE9OPUpQKCJbU2V0dGluZ3NdIFBhZ2UgU2l6ZSBDaGFuZ2UiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxQTj0ic2V0dGluZ3MiLHdOPXtzdGF0ZTp5RS5MT0FERUQsbGFzdExvYWRlZFRpbWVJbk1zOkRhdGUubm93KCksc2V0dGluZ3M6e3JlbG9hZFBlcmlvZEluTXM6M2U0LHJlbG9hZEVuYWJsZWQ6ITEscGFnZVNpemU6MTIsY29sb3JQYWxldHRlOntpZDoiZGVmYXVsdCIsbmFtZToiRGVmYWx0Iixjb2xvcnM6W3tuYW1lOiJTbGF0ZSIsbGlnaHRIZXg6IiM0MjUwNjYiLGRhcmtIZXg6IiM4ZTk4YTMifSx7bmFtZToiQ3lhbiIsbGlnaHRIZXg6IiMxMmI1Y2IiLGRhcmtIZXg6IiMxMmI1Y2IifSx7bmFtZToiUGluayIsbGlnaHRIZXg6IiNlNTI1OTIiLGRhcmtIZXg6IiNlNTI1OTIifSx7bmFtZToiWWVsbG93IixsaWdodEhleDoiI2Y5YWIwMCIsZGFya0hleDoiI2Y5YWIwMCJ9LHtuYW1lOiJQdXJwbGUiLGxpZ2h0SGV4OiIjOTMzNGU2IixkYXJrSGV4OiIjOTMzNGU2In0se25hbWU6IkxpZ2h0IEdyZWVuIixsaWdodEhleDoiIzdjYjM0MiIsZGFya0hleDoiIzdjYjM0MiJ9LHtuYW1lOiJPcmFuZ2UiLGxpZ2h0SGV4OiIjZTg3MTBhIixkYXJrSGV4OiIjZTg3MTBhIn1dLGluYWN0aXZlOntuYW1lOiJHcmF5IixsaWdodEhleDoiI2UwZTBlMCIsZGFya0hleDoiIzNiM2IzYiJ9fX19LGtOPUt3KFBOKSxTTj1adyhrTiwodD0+dC5zdGF0ZSkpLEROPVp3KGtOLCh0PT50LnNldHRpbmdzLnJlbG9hZEVuYWJsZWQpKSxFTj1adyhrTiwodD0+dC5zZXR0aW5ncy5yZWxvYWRQZXJpb2RJbk1zKSksUk49Wncoa04sKHQ9PnQuc2V0dGluZ3MucGFnZVNpemUpKSxBTj1adyhrTiwodD0+dC5zZXR0aW5ncy5jb2xvclBhbGV0dGUpKTtmdW5jdGlvbiBUTih0LGUsbil7aWYoIWUpcmV0dXJuITA7bGV0IG87dHJ5e289bmV3IFJlZ0V4cChlLCJpIil9Y2F0Y2godCl7cmV0dXJuITF9Y29uc3QgaT1bdC5ydW5OYW1lXTtyZXR1cm4gbiYmaS5wdXNoKHQuZXhwZXJpbWVudEFsaWFzLGAke3QuZXhwZXJpbWVudEFsaWFzfS8ke3QucnVuTmFtZX1gKSxpLnNvbWUoKHQ9Pm8udGVzdCh0KSkpfWNvbnN0IE5OPVp3KCh0PT57Y29uc3QgZT1UUyh0KTtyZXR1cm4gZT9tTih0LHtleHBlcmltZW50SWRzOmV9KTpudWxsfSksZ04sKHQ9Pnt2YXIgZTtjb25zdCBuPW51bGwhPT0oZT1UUyh0KSkmJnZvaWQgMCE9PWU/ZTpbXSxvPXpTKHQpLGk9bmV3IE1hcDtmb3IoY29uc3QgZSBvZiBuKXtjb25zdCBuPXVBKHQse2V4cGVyaW1lbnRJZDplfSk7aWYoIW4pY29udGludWU7Y29uc3QgYT1sTih0LHtleHBlcmltZW50SWQ6ZX0pO2Zvcihjb25zdCB0IG9mIGEpaS5zZXQodC5pZCx7cnVuTmFtZTp0Lm5hbWUsZXhwZXJpbWVudE5hbWU6bi5uYW1lLGV4cGVyaW1lbnRBbGlhczpvW2VdfSl9cmV0dXJuIGl9KSxSUywoKHQsZSxuLG8pPT57aWYoIXQpcmV0dXJuIG51bGw7Y29uc3QgaT1vPT09WmsuQ09NUEFSRV9FWFBFUklNRU5ULGE9bmV3IE1hcDtmb3IoY29uc3RbbyxyXW9mIHQuZW50cmllcygpKXtjb25zdCB0PW4uZ2V0KG8pO2Euc2V0KG8sVE4odCxlLGkpJiZyKX1yZXR1cm4gYX0pKSx6Tj1adyhBTixDTixfTixKRCwoKHQsZSxuLG8pPT57Y29uc3QgaT17fTtyZXR1cm4gZS5mb3JFYWNoKCgoZSxhKT0+e2xldCByPW8/dC5pbmFjdGl2ZS5kYXJrSGV4OnQuaW5hY3RpdmUubGlnaHRIZXg7aWYobi5oYXMoYSkpcj1uLmdldChhKTtlbHNlIGlmKGU+PTApe2NvbnN0IG49dC5jb2xvcnNbZSV0LmNvbG9ycy5sZW5ndGhdO3I9bz9uLmRhcmtIZXg6bi5saWdodEhleH1pW2FdPXJ9KSksaX0pKTtjbGFzcyBJTntjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5hY3Rpb25zJD10LHRoaXMuc3RvcmU9ZSx0aGlzLnJ1bnNEYXRhU291cmNlPW4sdGhpcy5sb2FkUnVuc09uUnVuVGFibGVTaG93biQ9TWsoKCgpPT50aGlzLmFjdGlvbnMkLnBpcGUoRGsoVVIpLFp0KCgoe2V4cGVyaW1lbnRJZHM6dH0pPT50aGlzLmdldEV4cGVyaW1lbnRzV2l0aExvYWRTdGF0ZSh0LCh0PT50PT09eUUuRkFJTEVEfHx0PT09eUUuTk9UX0xPQURFRCkpLnBpcGUoY2UoKHQ9PiEhdC5sZW5ndGgpKSxadCgoZT0+dGhpcy5mZXRjaEFsbFJ1bnNMaXN0KHQsZSkpKSkpKSkpLHtkaXNwYXRjaDohMX0pLHRoaXMuZXhwZXJpbWVudHNXaXRoU3RhbGVSdW5zT25Sb3V0ZUNoYW5nZSQ9dGhpcy5hY3Rpb25zJC5waXBlKERrKGRTKSxWZSh0aGlzLnN0b3JlLnNlbGVjdChOUykpLE1lKCgoWyx0XSxbLGVdKT0+dD09PWUpKSxWZSh0aGlzLnN0b3JlLnNlbGVjdChUUykpLGNlKCgoWyx0XSk9PiEhdCkpLEl0KCgoWyx0XSk9PnQpKSxadCgodD0+dGhpcy5nZXRFeHBlcmltZW50c1dpdGhMb2FkU3RhdGUodCwodD0+dD09PXlFLkZBSUxFRHx8dD09PXlFLk5PVF9MT0FERUQpKS5waXBlKEl0KChlPT4oe2V4cGVyaW1lbnRJZHM6dCxleHBlcmltZW50SWRzVG9CZUZldGNoZWQ6ZX0pKSkpKSkpLHRoaXMuZXhwZXJpbWVudHNXaXRoU3RhbGVSdW5zT25SZWxvYWQkPXRoaXMuYWN0aW9ucyQucGlwZShEayh4RSx2RSksVmUodGhpcy5zdG9yZS5zZWxlY3QoVFMpKSxjZSgoKFssdF0pPT4hIXQpKSxJdCgoKFssdF0pPT50KSksWnQoKHQ9PnRoaXMuZ2V0RXhwZXJpbWVudHNXaXRoTG9hZFN0YXRlKHQsKHQ9PnQhPT15RS5MT0FESU5HKSkucGlwZShJdCgoZT0+KHtleHBlcmltZW50SWRzOnQsZXhwZXJpbWVudElkc1RvQmVGZXRjaGVkOmV9KSkpKSkpKSx0aGlzLmxvYWRSdW5zT25OYXZpZ2F0aW9uT3JSZWxvYWQkPU1rKCgoKT0+cmUodGhpcy5leHBlcmltZW50c1dpdGhTdGFsZVJ1bnNPblJvdXRlQ2hhbmdlJCx0aGlzLmV4cGVyaW1lbnRzV2l0aFN0YWxlUnVuc09uUmVsb2FkJCkucGlwZShadCgoKHtleHBlcmltZW50SWRzOnQsZXhwZXJpbWVudElkc1RvQmVGZXRjaGVkOmV9KT0+dGhpcy5mZXRjaEFsbFJ1bnNMaXN0KHQsZSkpKSkpLHtkaXNwYXRjaDohMX0pfWdldFJ1bnNMaXN0TG9hZFN0YXRlKHQpe3JldHVybiB0aGlzLnN0b3JlLnNlbGVjdChwTix7ZXhwZXJpbWVudElkOnR9KS5waXBlKGJlKDEpKX1nZXRFeHBlcmltZW50c1dpdGhMb2FkU3RhdGUodCxlKXtyZXR1cm4gJHQodC5tYXAoKHQ9PnRoaXMuZ2V0UnVuc0xpc3RMb2FkU3RhdGUodCkpKSkucGlwZShJdCgobj0+dC5maWx0ZXIoKCh0LG8pPT5lKG5bb10uc3RhdGUpKSkpKSl9ZmV0Y2hBbGxSdW5zTGlzdCh0LGUpe3JldHVybiBFdCh7ZXhwZXJpbWVudElkczp0LGV4cGVyaW1lbnRJZHNUb0JlRmV0Y2hlZDplfSkucGlwZShGZSgoKCk9Pnt0aGlzLnN0b3JlLmRpc3BhdGNoKE5SKHtleHBlcmltZW50SWRzOnQscmVxdWVzdGVkRXhwZXJpbWVudElkczplfSkpfSkpLFp0KCgoKT0+e2NvbnN0IG49bmV3IFNldChlKTtyZXR1cm4gJHQodC5tYXAoKHQ9Pm4uaGFzKHQpP3RoaXMuZmV0Y2hSdW5zRm9yRXhwZXJpbWVudCh0KTp0aGlzLm1heWJlV2FpdEZvclJ1bnNBbmRHZXRSdW5zKHQpKSkpfSkpLEl0KCh0PT57Y29uc3QgZT17fSxuPVtdO2Zvcihjb25zdCBvIG9mIHQpbi5wdXNoKC4uLm8ucnVucyksby5mcm9tUmVtb3RlJiYoZVtvLmV4cGVyaW1lbnRJZF09e3J1bnM6by5ydW5zLG1ldGFkYXRhOm8ubWV0YWRhdGF9KTtyZXR1cm57bmV3UnVuc0FuZE1ldGFkYXRhOmUscnVuc0ZvckFsbEV4cGVyaW1lbnRzOm59fSkpLEZlKCgoe25ld1J1bnNBbmRNZXRhZGF0YTplLHJ1bnNGb3JBbGxFeHBlcmltZW50czpufSk9Pnt0aGlzLnN0b3JlLmRpc3BhdGNoKHpSKHtleHBlcmltZW50SWRzOnQsbmV3UnVuc0FuZE1ldGFkYXRhOmUscnVuc0ZvckFsbEV4cGVyaW1lbnRzOm59KSl9KSkscGUoKG49Pih0aGlzLnN0b3JlLmRpc3BhdGNoKElSKHtleHBlcmltZW50SWRzOnQscmVxdWVzdGVkRXhwZXJpbWVudElkczplfSkpLEV0KG51bGwpKSkpLEl0KCgoKT0+bnVsbCkpKX1tYXliZVdhaXRGb3JSdW5zQW5kR2V0UnVucyh0KXtyZXR1cm4gdGhpcy5zdG9yZS5zZWxlY3QocE4se2V4cGVyaW1lbnRJZDp0fSkucGlwZShjZSgodD0+dC5zdGF0ZSE9PXlFLkxPQURJTkcpKSxiZSgxKSxadCgodD0+dC5zdGF0ZT09PXlFLkZBSUxFRD9SdChuZXcgRXJyb3IoIlBlbmRpbmcgcmVxdWVzdCBmYWlsZWQiKSk6RXQodCkpKSxWZSh0aGlzLnN0b3JlLnNlbGVjdChsTix7ZXhwZXJpbWVudElkOnR9KSksSXQoKChbLGVdKT0+KHtmcm9tUmVtb3RlOiExLGV4cGVyaW1lbnRJZDp0LHJ1bnM6ZX0pKSkpfWZldGNoUnVuc0ZvckV4cGVyaW1lbnQodCl7cmV0dXJuICR0KFt0aGlzLnJ1bnNEYXRhU291cmNlLmZldGNoUnVucyh0KSx0aGlzLnJ1bnNEYXRhU291cmNlLmZldGNoSHBhcmFtc01ldGFkYXRhKHQpXSkucGlwZShJdCgoKFtlLG5dKT0+KHtmcm9tUmVtb3RlOiEwLGV4cGVyaW1lbnRJZDp0LHJ1bnM6ZSxtZXRhZGF0YTpufSkpKSl9fWZ1bmN0aW9uIEhOKHQsZSxuKXtjb25zdCBvPU9iamVjdC5rZXlzKHQpLGk9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCksZSkse3ByaXZhdGVSb3V0ZUNvbnRleHRlZFN0YXRlOnt9fSk7cmV0dXJue2luaXRpYWxTdGF0ZTppLHJlZHVjZXJzOnlrKGksYmsoZFMsKChlLHtiZWZvcmU6aSxhZnRlcjphfSk9Pntjb25zdCByPVFrKGEucm91dGVLaW5kLGEucGFyYW1zKSxzPWk/UWsoaS5yb3V0ZUtpbmQsaS5wYXJhbXMpOm51bGw7aWYocz09PXIpcmV0dXJuIGU7bGV0IGw9T2JqZWN0LmFzc2lnbih7fSxlLnByaXZhdGVSb3V0ZUNvbnRleHRlZFN0YXRlKTtpZihzKXtjb25zdCB0PXt9O2Zvcihjb25zdCBuIG9mIG8pdFtuXT1lW25dO2w9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGwpLHtbc106dH0pfWxldCBjPWUucHJpdmF0ZVJvdXRlQ29udGV4dGVkU3RhdGUmJmUucHJpdmF0ZVJvdXRlQ29udGV4dGVkU3RhdGVbcl0/ZS5wcml2YXRlUm91dGVDb250ZXh0ZWRTdGF0ZVtyXTpudWxsO3MmJm51bGw9PT1jJiYoYz10KTtjb25zdCBkPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLGMpLHtwcml2YXRlUm91dGVDb250ZXh0ZWRTdGF0ZTpsfSk7cmV0dXJuIG4/bihkLGEpOmR9KSkpfX12YXIgRk4sTE47ZnVuY3Rpb24gQk4oLi4udCl7cmV0dXJuKGUsbik9PntsZXQgbz1lO2Zvcihjb25zdCBlIG9mIHQpbz1lKG8sbik7cmV0dXJuIG99fUlOLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxJTikodnIoU2spLHZyKEl3KSx2cihYUikpfSxJTi7JtXByb3Y9TW4oe3Rva2VuOklOLGZhY3Rvcnk6SU4uybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKElOLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpTa30se3R5cGU6SXd9LHt0eXBlOlhSfV19KSxudWxsKSwoZnVuY3Rpb24odCl7dC5BU0M9ImFzYyIsdC5ERVNDPSJkZXNjIix0LlVOU0VUPSIifSkoRk58fChGTj17fSkpLChmdW5jdGlvbih0KXt0LkVYUEVSSU1FTlRfSUQ9ImlkIix0LlVTRVI9InVzZXIiLHQuQkVGT1JFPSJiZWZvcmUiLHQuQUZURVI9ImFmdGVyIix0LlJFR0VYPSJyZWdleCJ9KShMTnx8KExOPXt9KSk7Y29uc3R7aW5pdGlhbFN0YXRlOlZOLHJlZHVjZXJzOmpOfT1ITih7cnVuQ29sb3JPdmVycmlkZUZvckdyb3VwQnk6bmV3IE1hcCxkZWZhdWx0UnVuQ29sb3JJZEZvckdyb3VwQnk6bmV3IE1hcCxncm91cEtleVRvQ29sb3JJZDpuZXcgTWFwLGluaXRpYWxHcm91cEJ5OntrZXk6dE4uUlVOfSx1c2VyU2V0R3JvdXBCeUtleTpudWxsLGNvbG9yR3JvdXBSZWdleFN0cmluZzoiIixyZWdleEZpbHRlcjoiIn0se3J1bklkczp7fSxydW5JZFRvRXhwSWQ6e30scnVuTWV0YWRhdGE6e30scnVuc0xvYWRTdGF0ZTp7fSxzZWxlY3Rpb25TdGF0ZTpuZXcgTWFwfSwoKHQsZSk9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7aW5pdGlhbEdyb3VwQnk6e2tleTplLnJvdXRlS2luZD09PVprLkNPTVBBUkVfRVhQRVJJTUVOVD90Ti5FWFBFUklNRU5UOnROLlJVTn19KSkpLFVOPUJOKHlrKFZOLGJrKHJTLCgodCx7cm91dGVLaW5kOmUscGFydGlhbFN0YXRlOm59KT0+e3ZhciBvO2lmKGUhPT1aay5DT01QQVJFX0VYUEVSSU1FTlQmJmUhPT1aay5FWFBFUklNRU5UKXJldHVybiB0O2NvbnN0IGk9bi5ydW5zLmdyb3VwQnk7aWYoIWkpcmV0dXJuIHQ7Y29uc3QgYT1pLmtleT09PXROLlJFR0VYP2kucmVnZXhTdHJpbmc6dC5jb2xvckdyb3VwUmVnZXhTdHJpbmc7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7Y29sb3JHcm91cFJlZ2V4U3RyaW5nOmEsdXNlclNldEdyb3VwQnlLZXk6bnVsbCE9PShvPWkua2V5KSYmdm9pZCAwIT09bz9vOm51bGx9KX0pKSxiayhOUiwoKHQsZSk9Pntjb25zdCBuPU9iamVjdC5hc3NpZ24oe30sdC5ydW5zTG9hZFN0YXRlKTtmb3IoY29uc3QgdCBvZiBlLnJlcXVlc3RlZEV4cGVyaW1lbnRJZHMpblt0XT1uW3RdP09iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuW3RdKSx7c3RhdGU6eUUuTE9BRElOR30pOntsYXN0TG9hZGVkVGltZUluTXM6bnVsbCxzdGF0ZTp5RS5MT0FESU5HfTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtydW5zTG9hZFN0YXRlOm59KX0pKSxiayh6UiwoKHQsZSk9Pnt2YXIgbjtjb25zdCBvPU9iamVjdC5hc3NpZ24oe30sdC5ydW5JZHMpLGk9T2JqZWN0LmFzc2lnbih7fSx0LnJ1bk1ldGFkYXRhKSxhPU9iamVjdC5hc3NpZ24oe30sdC5ydW5JZFRvRXhwSWQpLHI9T2JqZWN0LmFzc2lnbih7fSx0LnJ1bnNMb2FkU3RhdGUpLHM9bmV3IE1hcCh0LnNlbGVjdGlvblN0YXRlKTtmb3IoY29uc3QgdCBvZiBPYmplY3Qua2V5cyhlLm5ld1J1bnNBbmRNZXRhZGF0YSkpe2NvbnN0e3J1bnM6bixtZXRhZGF0YTpzfT1lLm5ld1J1bnNBbmRNZXRhZGF0YVt0XTtvW3RdPW4ubWFwKCgoe2lkOnR9KT0+dCkpLHJbdF09T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHJbdF0pLHtsYXN0TG9hZGVkVGltZUluTXM6RGF0ZS5ub3coKSxzdGF0ZTp5RS5MT0FERUR9KTtmb3IoY29uc3QgZSBvZiBuKXtjb25zdCBuPXMucnVuVG9IcGFyYW1zQW5kTWV0cmljc1tlLmlkXTtpW2UuaWRdPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7aHBhcmFtczpuP24uaHBhcmFtczpudWxsLG1ldHJpY3M6bj9uLm1ldHJpY3M6bnVsbH0pLGFbZS5pZF09dH19Y29uc3QgbD1lTihlLmV4cGVyaW1lbnRJZHMpLGM9bmV3IE1hcChudWxsIT09KG49cy5nZXQobCkpJiZ2b2lkIDAhPT1uP246W10pLGQ9ZS5ydW5zRm9yQWxsRXhwZXJpbWVudHMubGVuZ3RoPD01MDA7Zm9yKGNvbnN0IHQgb2YgZS5ydW5zRm9yQWxsRXhwZXJpbWVudHMpYy5oYXModC5pZCl8fGMuc2V0KHQuaWQsZCk7cmV0dXJuIHMuc2V0KGwsYyksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtydW5JZHM6byxydW5JZFRvRXhwSWQ6YSxydW5NZXRhZGF0YTppLHJ1bnNMb2FkU3RhdGU6cixzZWxlY3Rpb25TdGF0ZTpzfSl9KSksYmsoSVIsKCh0LGUpPT57Y29uc3Qgbj1PYmplY3QuYXNzaWduKHt9LHQucnVuc0xvYWRTdGF0ZSk7Zm9yKGNvbnN0IHQgb2YgZS5yZXF1ZXN0ZWRFeHBlcmltZW50SWRzKW5bdF09blt0XT9PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sblt0XSkse3N0YXRlOnlFLkZBSUxFRH0pOntsYXN0TG9hZGVkVGltZUluTXM6bnVsbCxzdGF0ZTp5RS5GQUlMRUR9O3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3J1bnNMb2FkU3RhdGU6bn0pfSkpLGJrKEhSLCgodCx7ZXhwZXJpbWVudElkczplLHJ1bklkOm59KT0+e3ZhciBvO2NvbnN0IGk9ZU4oZSksYT1uZXcgTWFwKHQuc2VsZWN0aW9uU3RhdGUpLHI9bmV3IE1hcChudWxsIT09KG89YS5nZXQoaSkpJiZ2b2lkIDAhPT1vP286W10pO3JldHVybiByLnNldChuLCFCb29sZWFuKHIuZ2V0KG4pKSksYS5zZXQoaSxyKSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NlbGVjdGlvblN0YXRlOmF9KX0pKSxiayhGUiwoKHQse2V4cGVyaW1lbnRJZHM6ZSxydW5JZHM6bn0pPT57dmFyIG87Y29uc3QgaT1lTihlKSxhPW5ldyBNYXAodC5zZWxlY3Rpb25TdGF0ZSkscj1uZXcgTWFwKG51bGwhPT0obz1hLmdldChpKSkmJnZvaWQgMCE9PW8/bzpbXSkscz0hbi5ldmVyeSgodD0+Qm9vbGVhbihyLmdldCh0KSkpKTtmb3IoY29uc3QgdCBvZiBuKXIuc2V0KHQscyk7cmV0dXJuIGEuc2V0KGksciksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzZWxlY3Rpb25TdGF0ZTphfSl9KSksYmsoelIsKCh0LHtydW5zRm9yQWxsRXhwZXJpbWVudHM6ZX0pPT57Y29uc3Qgbj1uZXcgTWFwKHQuZ3JvdXBLZXlUb0NvbG9ySWQpLG89bmV3IE1hcCh0LmRlZmF1bHRSdW5Db2xvcklkRm9yR3JvdXBCeSk7bGV0IGk9dC5pbml0aWFsR3JvdXBCeTtudWxsIT09dC51c2VyU2V0R3JvdXBCeUtleSYmKGk9b04odC51c2VyU2V0R3JvdXBCeUtleSx0LmNvbG9yR3JvdXBSZWdleFN0cmluZykpO2NvbnN0IGE9bk4oaSxlLHQucnVuSWRUb0V4cElkKTtPYmplY3QuZW50cmllcyhhLm1hdGNoZXMpLmZvckVhY2goKChbdCxlXSk9Pnt2YXIgaTtjb25zdCBhPW51bGwhPT0oaT1uLmdldCh0KSkmJnZvaWQgMCE9PWk/aTpuLnNpemU7bi5zZXQodCxhKTtmb3IoY29uc3QgdCBvZiBlKW8uc2V0KHQuaWQsYSl9KSk7Zm9yKGNvbnN0IHQgb2YgYS5ub25NYXRjaGVzKW8uc2V0KHQuaWQsLTEpO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2RlZmF1bHRSdW5Db2xvcklkRm9yR3JvdXBCeTpvLGdyb3VwS2V5VG9Db2xvcklkOm59KX0pKSxiayhHUiwoKHQse2V4cGVyaW1lbnRJZHM6ZSxncm91cEJ5Om59KT0+e2NvbnN0IG89bmV3IE1hcCxpPW5ldyBNYXAodC5kZWZhdWx0UnVuQ29sb3JJZEZvckdyb3VwQnkpLGE9bk4obixlLmZsYXRNYXAoKGU9PnQucnVuSWRzW2VdKSkubWFwKChlPT50LnJ1bk1ldGFkYXRhW2VdKSksdC5ydW5JZFRvRXhwSWQpO09iamVjdC5lbnRyaWVzKGEubWF0Y2hlcykuZm9yRWFjaCgoKFt0LGVdKT0+e3ZhciBuO2NvbnN0IGE9bnVsbCE9PShuPW8uZ2V0KHQpKSYmdm9pZCAwIT09bj9uOm8uc2l6ZTtvLnNldCh0LGEpO2Zvcihjb25zdCB0IG9mIGUpaS5zZXQodC5pZCxhKX0pKTtmb3IoY29uc3QgdCBvZiBhLm5vbk1hdGNoZXMpaS5zZXQodC5pZCwtMSk7Y29uc3Qgcj1uLmtleT09PXROLlJFR0VYP24ucmVnZXhTdHJpbmc6dC5jb2xvckdyb3VwUmVnZXhTdHJpbmc7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7Y29sb3JHcm91cFJlZ2V4U3RyaW5nOnIsdXNlclNldEdyb3VwQnlLZXk6bi5rZXksZGVmYXVsdFJ1bkNvbG9ySWRGb3JHcm91cEJ5OmksZ3JvdXBLZXlUb0NvbG9ySWQ6byxydW5Db2xvck92ZXJyaWRlRm9yR3JvdXBCeTpuZXcgTWFwfSl9KSksYmsoalIsKCh0LHtydW5JZDplLG5ld0NvbG9yOm59KT0+e2NvbnN0IG89bmV3IE1hcCh0LnJ1bkNvbG9yT3ZlcnJpZGVGb3JHcm91cEJ5KTtyZXR1cm4gby5zZXQoZSxuKSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3J1bkNvbG9yT3ZlcnJpZGVGb3JHcm91cEJ5Om99KX0pKSxiayhWUiwoKHQsZSk9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7cmVnZXhGaWx0ZXI6ZS5yZWdleFN0cmluZ30pKSkpLGpOKSxHTj17a2V5Om51bGwsZGlyZWN0aW9uOkZOLlVOU0VUfSx7aW5pdGlhbFN0YXRlOldOLHJlZHVjZXJzOllOfT1ITih7cGFnaW5hdGlvbk9wdGlvbjp7cGFnZUluZGV4OjAscGFnZVNpemU6MTB9LHNvcnQ6R059LHt9KSxxTj1CTih5ayhXTixiayhMUiwoKHQse3BhZ2VTaXplOmUscGFnZUluZGV4Om59KT0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtwYWdpbmF0aW9uT3B0aW9uOntwYWdlU2l6ZTplLHBhZ2VJbmRleDpufX0pKSksYmsoVlIsKCh0LGUpPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3BhZ2luYXRpb25PcHRpb246T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQucGFnaW5hdGlvbk9wdGlvbikse3BhZ2VJbmRleDowfSl9KSkpLGJrKEJSLCgodCxlKT0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzb3J0OntrZXk6ZS5rZXksZGlyZWN0aW9uOmUuZGlyZWN0aW9ufX0pKSkpLFlOKTtmdW5jdGlvbiBaTih0LGUpe3JldHVybiB4dyh7ZGF0YTpVTix1aTpxTn0pKHQsZSl9ZnVuY3Rpb24gWE4oKXtyZXR1cm5be2FjdGlvbkNyZWF0b3I6SVIsYWxlcnRGcm9tQWN0aW9uOigpPT4oe2xvY2FsaXplZE1lc3NhZ2U6IkZhaWxlZCB0byBmZXRjaCBydW5zIn0pfV19Y2xhc3MgS057fXZhciBKTjtLTi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8S04pfSxLTi7JtW1vZD1hbyh7dHlwZTpLTn0pLEtOLsm1aW5qPXZuKHtpbXBvcnRzOltbZGsuZm9yRmVhdHVyZShRVCxaTiksV2suZm9yRmVhdHVyZShbSU5dKSxsQSxBUi5yZWdpc3RlckFsZXJ0QWN0aW9ucyhYTiksYUFdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoS04sW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltkay5mb3JGZWF0dXJlKFFULFpOKSxXay5mb3JGZWF0dXJlKFtJTl0pLGxBLEFSLnJlZ2lzdGVyQWxlcnRBY3Rpb25zKFhOKSxhQV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhLTix7aW1wb3J0czpbY2ssR2ssbEEsQVIsYUFdfSksKGZ1bmN0aW9uKHQpe3QuUlVOU19DSEFOR0VEPSJleHBlcmltZW50YWwuUnVuc0NoYW5nZWQiLHQuR0VUX1JVTlM9ImV4cGVyaW1lbnRhbC5HZXRSdW5zIix0LkdFVF9VUkxfREFUQT0iZXhwZXJpbWVudGFsLkdldFVSTFBsdWdpbkRhdGEiLHQuREFUQV9SRUxPQURFRD0iZXhwZXJpbWVudGFsLkRhdGFSZWxvYWRlZCJ9KShKTnx8KEpOPXt9KSk7Y2xhc3MgUU57Y29uc3RydWN0b3IodCl7dGhpcy5wb3J0PXQsdGhpcy5pZD0wLHRoaXMucmVzcG9uc2VXYWl0cz1uZXcgTWFwLHRoaXMubGlzdGVuZXJzPW5ldyBNYXAsdGhpcy5wb3J0LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCh0PT50aGlzLm9uTWVzc2FnZSh0KSkpfWxpc3Rlbih0LGUpe3RoaXMubGlzdGVuZXJzLnNldCh0LGUpfXVubGlzdGVuKHQpe3RoaXMubGlzdGVuZXJzLmRlbGV0ZSh0KX1vbk1lc3NhZ2UodCl7cmV0dXJuIGdBKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT1KU09OLnBhcnNlKHQuZGF0YSksbj1lLnR5cGUsbz1lLmlkLGk9ZS5wYXlsb2FkLGE9ZS5lcnJvcjtpZihlLmlzUmVwbHkpe2lmKCF0aGlzLnJlc3BvbnNlV2FpdHMuaGFzKG8pKXJldHVybjtjb25zdHtyZXNvbHZlOnQscmVqZWN0OmV9PXRoaXMucmVzcG9uc2VXYWl0cy5nZXQobyk7cmV0dXJuIHRoaXMucmVzcG9uc2VXYWl0cy5kZWxldGUobyksdm9pZChhP2UobmV3IEVycm9yKGEpKTp0KGkpKX1sZXQgcj1udWxsLHM9bnVsbDtpZih0aGlzLmxpc3RlbmVycy5oYXMobikpe2NvbnN0IHQ9dGhpcy5saXN0ZW5lcnMuZ2V0KG4pO3RyeXtyPXlpZWxkIHQoaSl9Y2F0Y2godCl7cz10fX10aGlzLnBvc3RNZXNzYWdlKHt0eXBlOm4saWQ6byxwYXlsb2FkOnIsZXJyb3I6cyxpc1JlcGx5OiEwfSl9KSl9cG9zdE1lc3NhZ2UodCl7dGhpcy5wb3J0LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KHQpKX1zZW5kTWVzc2FnZSh0LGUpe2NvbnN0IG49dGhpcy5pZCsrO3JldHVybiB0aGlzLnBvc3RNZXNzYWdlKHt0eXBlOnQsaWQ6bixwYXlsb2FkOmUsZXJyb3I6bnVsbCxpc1JlcGx5OiExfSksbmV3IFByb21pc2UoKCh0LGUpPT57dGhpcy5yZXNwb25zZVdhaXRzLnNldChuLHtyZXNvbHZlOnQscmVqZWN0OmV9KX0pKX19Y29uc3QgJE49bmV3IFdlYWtNYXAsdHo9bmV3IFNldCxlej1uZXcgTWFwLG56PW5ldyBNYXA7ZnVuY3Rpb24gb3oodCxlKXtyZXR1cm4gbj0+e2NvbnN0IG89bnouZ2V0KGUpLGk9JE4uZ2V0KG8pfHxudWxsO3JldHVybiB0KGksbil9fXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwodD0+e2lmKCJleHBlcmltZW50YWwuYm9vdHN0cmFwIiE9PXQuZGF0YSlyZXR1cm47Y29uc3QgZT10LnBvcnRzWzBdO2lmKCFlKXJldHVybjtjb25zdCBuPXQuc291cmNlP3Quc291cmNlLmZyYW1lRWxlbWVudDpudWxsO24mJihmdW5jdGlvbiBvKHQsZSl7Y29uc3Qgbj1uZXcgUU4odCk7dHouYWRkKG4pLG56LnNldChuLGUpLHQuc3RhcnQoKTtmb3IoY29uc3RbdCxlXW9mIGV6KXtjb25zdCBvPW96KGUsbik7bi5saXN0ZW4odCxvKX19KShlLG4pfSkpO2NsYXNzIGl6e2Jyb2FkY2FzdCh0LGUpe3JldHVybihmdW5jdGlvbiBuKHQsZSl7Zm9yKGNvbnN0IHQgb2YgdHopbnouZ2V0KHQpLmlzQ29ubmVjdGVkfHwodHouZGVsZXRlKHQpLG56LmRlbGV0ZSh0KSk7Y29uc3Qgbj1bLi4udHpdLm1hcCgobj0+bi5zZW5kTWVzc2FnZSh0LGUpKSk7cmV0dXJuIFByb21pc2UuYWxsKG4pfSkodCxlKX1saXN0ZW4odCxlKXshKGZ1bmN0aW9uIG4odCxlKXtlei5zZXQodCxlKTtmb3IoY29uc3QgbiBvZiB0eil7Y29uc3Qgbz1veihlLG4pO24ubGlzdGVuKHQsbyl9fSkodCxlKX11bmxpc3Rlbih0KXshKGZ1bmN0aW9uIGUodCl7ZXouZGVsZXRlKHQpO2Zvcihjb25zdCBlIG9mIHR6KWUudW5saXN0ZW4odCl9KSh0KX19aXouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGl6KX0saXouybVwcm92PU1uKHt0b2tlbjppeixmYWN0b3J5Oml6Lsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChpeixbe3R5cGU6aW19XSxudWxsLG51bGwpO2NsYXNzIGF6e2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5pcGM9dCx0aGlzLnN0b3JlPWV9aW5pdCgpe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGYtc3RvcmFnZSIpO3RoaXMuaXBjLmxpc3RlbihKTi5HRVRfVVJMX0RBVEEsKGU9PntpZighZSlyZXR1cm47Y29uc3Qgbj1gcC4ke2UucGx1Z2luTmFtZX0uYCxvPXt9LGk9dC50Zl9zdG9yYWdlLmdldFVybEhhc2hEaWN0KCk7Zm9yKGxldCB0IGluIGkpdC5zdGFydHNXaXRoKG4pJiYob1t0LnN1YnN0cmluZyhuLmxlbmd0aCldPWlbdF0pO3JldHVybiBvfSkpLHRoaXMuc3RvcmUuc2VsZWN0KENSKS5waXBlKGNlKCh0PT5udWxsIT09dCkpLE1lKCkpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLmlwYy5icm9hZGNhc3QoSk4uREFUQV9SRUxPQURFRCx2b2lkIDApfSkpfX1hei7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8YXopKHZyKGl6KSx2cihJdykpfSxhei7JtXByb3Y9TW4oe3Rva2VuOmF6LGZhY3Rvcnk6YXouybVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGF6LFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTppen0se3R5cGU6SXd9XX0pLG51bGwpO2NsYXNzIHJ6e2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5pcGM9dCx0aGlzLnN0b3JlPWV9aW5pdCgpe2NvbnN0IHQ9dGhpcy5zdG9yZS5zZWxlY3QoVFMpLnBpcGUoWnQoKHQ9PnQ/V3QodC5tYXAoKHQ9PnRoaXMuc3RvcmUuc2VsZWN0KGxOLHtleHBlcmltZW50SWQ6dH0pKSkpLnBpcGUoSXQoKHQ9PnQuZmxhdCgpKSksTWUoKCh0LGUpPT50Lmxlbmd0aD09PWUubGVuZ3RoJiZ0LmV2ZXJ5KCgodCxuKT0+ZVtuXS5pZD09PXQuaWQpKSkpLEl0KCh0PT50Lm1hcCgoKHtuYW1lOnR9KT0+dCkpKSkpOkV0KFtdKSkpKTt0LnN1YnNjcmliZSgodD0+e3RoaXMuaXBjLmJyb2FkY2FzdChKTi5SVU5TX0NIQU5HRUQsdCl9KSksdGhpcy5pcGMubGlzdGVuKEpOLkdFVF9SVU5TLCgoKT0+dC5waXBlKGJlKDEpKS50b1Byb21pc2UoKSkpfX1yei7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8cnopKHZyKGl6KSx2cihJdykpfSxyei7JtXByb3Y9TW4oe3Rva2VuOnJ6LGZhY3Rvcnk6cnouybVmYWMscHJvdmlkZWRJbjoicm9vdCJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHJ6LFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTppen0se3R5cGU6SXd9XX0pLG51bGwpO2NsYXNzIHN6e2NvbnN0cnVjdG9yKHQsZSl7ZS5pbml0KCksdC5pbml0KCl9cmVnaXN0ZXJQbHVnaW5JZnJhbWUodCxlKXshKGZ1bmN0aW9uIG4odCxlKXskTi5zZXQodCx7cGx1Z2luTmFtZTplfSl9KSh0LGUpfX1zei7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8c3opKHZyKHJ6KSx2cihheikpfSxzei7JtW1vZD1hbyh7dHlwZTpzen0pLHN6Lsm1aW5qPXZuKHtwcm92aWRlcnM6W2l6LGF6LHJ6XSxpbXBvcnRzOltbQlMsRVIsS05dXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoc3osW3t0eXBlOkF5LGFyZ3M6W3twcm92aWRlcnM6W2l6LGF6LHJ6XSxpbXBvcnRzOltCUyxFUixLTl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpyen0se3R5cGU6YXp9XX0pLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oc3ose2ltcG9ydHM6W0JTLEVSLEtOXX0pO2NvbnN0IGx6PUpQKCJbQWxlcnRdIEFsZXJ0IFJlcG9ydGVkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSk7Y2xhc3MgY3p7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuYWN0aW9ucyQ9dCx0aGlzLnN0b3JlPWUsdGhpcy5hbGVydEFjdGlvbk1vZHVsZT1uLHRoaXMucmVwb3J0UmVnaXN0ZXJlZEFjdGlvbkFsZXJ0cyQ9TWsoKCgpPT50aGlzLmFjdGlvbnMkLnBpcGUoRmUoKHQ9Pntjb25zdCBlPXRoaXMuYWxlcnRBY3Rpb25Nb2R1bGUuZ2V0QWxlcnRGcm9tQWN0aW9uKHQpO2UmJnRoaXMuc3RvcmUuZGlzcGF0Y2gobHooZSkpfSkpKSkse2Rpc3BhdGNoOiExfSl9fWN6Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxjeikodnIoU2spLHZyKEl3KSx2cihBUikpfSxjei7JtXByb3Y9TW4oe3Rva2VuOmN6LGZhY3Rvcnk6Y3ouybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGN6LFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpTa30se3R5cGU6SXd9LHt0eXBlOkFSfV19KSxudWxsKTtjb25zdCBkej15ayh7bGF0ZXN0QWxlcnQ6bnVsbH0sYmsobHosKCh0LHtsb2NhbGl6ZWRNZXNzYWdlOmUsZm9sbG93dXBBY3Rpb246bn0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2xhdGVzdEFsZXJ0Ontsb2NhbGl6ZWRNZXNzYWdlOmUsZm9sbG93dXBBY3Rpb246bixjcmVhdGVkOkRhdGUubm93KCl9fSkpKSk7ZnVuY3Rpb24gcHoodCxlKXtyZXR1cm4gZHoodCxlKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3QgbXo9MTMsdXo9MjcsZno9MzIsZ3o9MzgsaHo9NDA7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBieih0LC4uLmUpe3JldHVybiBlLmxlbmd0aD9lLnNvbWUoKGU9PnRbZV0pKTp0LmFsdEtleXx8dC5zaGlmdEtleXx8dC5jdHJsS2V5fHx0Lm1ldGFLZXl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIHl6KHQpe3JldHVybiBudWxsIT10JiYiZmFsc2UiIT1gJHt0fWB9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIF96KHQsZT0wKXtyZXR1cm4gQ3oodCk/TnVtYmVyKHQpOmV9ZnVuY3Rpb24gQ3oodCl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQodCkpJiYhaXNOYU4oTnVtYmVyKHQpKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gTXoodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dDpbdF19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIHZ6KHQpe3JldHVybiBudWxsPT10PyIiOiJzdHJpbmciPT10eXBlb2YgdD90OmAke3R9cHhgfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiB4eih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGhnP3QubmF0aXZlRWxlbWVudDp0fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9sZXQgT3osUHo7dHJ5e096PSJ1bmRlZmluZWQiIT10eXBlb2YgSW50bCYmSW50bC52OEJyZWFrSXRlcmF0b3J9Y2F0Y2goakN0KXtPej0hMX1jbGFzcyB3entjb25zdHJ1Y3Rvcih0KXt0aGlzLl9wbGF0Zm9ybUlkPXQsdGhpcy5pc0Jyb3dzZXI9dGhpcy5fcGxhdGZvcm1JZD8oZnVuY3Rpb24gZSh0KXtyZXR1cm4iYnJvd3NlciI9PT10fSkodGhpcy5fcGxhdGZvcm1JZCk6Im9iamVjdCI9PXR5cGVvZiBkb2N1bWVudCYmISFkb2N1bWVudCx0aGlzLkVER0U9dGhpcy5pc0Jyb3dzZXImJi8oZWRnZSkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHRoaXMuVFJJREVOVD10aGlzLmlzQnJvd3NlciYmLyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx0aGlzLkJMSU5LPXRoaXMuaXNCcm93c2VyJiYhKCF3aW5kb3cuY2hyb21lJiYhT3opJiYidW5kZWZpbmVkIiE9dHlwZW9mIENTUyYmIXRoaXMuRURHRSYmIXRoaXMuVFJJREVOVCx0aGlzLldFQktJVD10aGlzLmlzQnJvd3NlciYmL0FwcGxlV2ViS2l0L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmIXRoaXMuQkxJTksmJiF0aGlzLkVER0UmJiF0aGlzLlRSSURFTlQsdGhpcy5JT1M9dGhpcy5pc0Jyb3dzZXImJi9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhKCJNU1N0cmVhbSJpbiB3aW5kb3cpLHRoaXMuRklSRUZPWD10aGlzLmlzQnJvd3NlciYmLyhmaXJlZm94fG1pbmVmaWVsZCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHRoaXMuQU5EUk9JRD10aGlzLmlzQnJvd3NlciYmL2FuZHJvaWQvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhdGhpcy5UUklERU5ULHRoaXMuU0FGQVJJPXRoaXMuaXNCcm93c2VyJiYvc2FmYXJpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmdGhpcy5XRUJLSVR9fXd6Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx3eikodnIoankpKX0sd3ouybVwcm92PU1uKHtmYWN0b3J5OmZ1bmN0aW9uIHQoKXtyZXR1cm4gbmV3IHd6KHZyKGp5KSl9LHRva2VuOnd6LHByb3ZpZGVkSW46InJvb3QifSksd3ouY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpPYmplY3QsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbanldfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHd6LFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpPYmplY3QsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbanldfV19XX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3Mga3p7fWt6Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxreil9LGt6Lsm1bW9kPWFvKHt0eXBlOmt6fSksa3ouybVpbmo9dm4oe30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoa3osW3t0eXBlOkF5LGFyZ3M6W3t9XX1dLG51bGwsbnVsbCk7Y29uc3QgU3o9WyJjb2xvciIsImJ1dHRvbiIsImNoZWNrYm94IiwiZGF0ZSIsImRhdGV0aW1lLWxvY2FsIiwiZW1haWwiLCJmaWxlIiwiaGlkZGVuIiwiaW1hZ2UiLCJtb250aCIsIm51bWJlciIsInBhc3N3b3JkIiwicmFkaW8iLCJyYW5nZSIsInJlc2V0Iiwic2VhcmNoIiwic3VibWl0IiwidGVsIiwidGV4dCIsInRpbWUiLCJ1cmwiLCJ3ZWVrIl07ZnVuY3Rpb24gRHooKXtpZihQeilyZXR1cm4gUHo7aWYoIm9iamVjdCIhPXR5cGVvZiBkb2N1bWVudHx8IWRvY3VtZW50KXJldHVybiBQej1uZXcgU2V0KFN6KSxQejtsZXQgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO3JldHVybiBQej1uZXcgU2V0KFN6LmZpbHRlcigoZT0+KHQuc2V0QXR0cmlidXRlKCJ0eXBlIixlKSx0LnR5cGU9PT1lKSkpKSxQen0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovbGV0IEV6LFJ6LEF6LFR6O2Z1bmN0aW9uIE56KHQpe3JldHVybihmdW5jdGlvbiBlKCl7aWYobnVsbD09RXomJiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93KXRyeXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsbnVsbCxPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sInBhc3NpdmUiLHtnZXQ6KCk9PkV6PSEwfSkpfWZpbmFsbHl7RXo9RXp8fCExfXJldHVybiBFen0pKCk/dDohIXQuY2FwdHVyZX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24genooKXtpZihudWxsPT1Beil7aWYoIm9iamVjdCIhPXR5cGVvZiBkb2N1bWVudHx8IWRvY3VtZW50fHwiZnVuY3Rpb24iIT10eXBlb2YgRWxlbWVudHx8IUVsZW1lbnQpcmV0dXJuIEF6PSExLEF6O2lmKCJzY3JvbGxCZWhhdmlvciJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUpQXo9ITA7ZWxzZXtjb25zdCB0PUVsZW1lbnQucHJvdG90eXBlLnNjcm9sbFRvO0F6PSEhdCYmIS9ce1xzKlxbbmF0aXZlIGNvZGVcXVxzKlx9Ly50ZXN0KHQudG9TdHJpbmcoKSl9fXJldHVybiBBen1mdW5jdGlvbiBJeigpe2lmKCJvYmplY3QiIT10eXBlb2YgZG9jdW1lbnR8fCFkb2N1bWVudClyZXR1cm4gMDtpZihudWxsPT1Seil7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxlPXQuc3R5bGU7dC5kaXI9InJ0bCIsZS53aWR0aD0iMXB4IixlLm92ZXJmbG93PSJhdXRvIixlLnZpc2liaWxpdHk9ImhpZGRlbiIsZS5wb2ludGVyRXZlbnRzPSJub25lIixlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Y29uc3Qgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxvPW4uc3R5bGU7by53aWR0aD0iMnB4IixvLmhlaWdodD0iMXB4Iix0LmFwcGVuZENoaWxkKG4pLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodCksUno9MCwwPT09dC5zY3JvbGxMZWZ0JiYodC5zY3JvbGxMZWZ0PTEsUno9MD09PXQuc2Nyb2xsTGVmdD8xOjIpLHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KX1yZXR1cm4gUnp9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIEh6KHQpe2lmKChmdW5jdGlvbiBlKCl7aWYobnVsbD09VHope2NvbnN0IHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudD9kb2N1bWVudC5oZWFkOm51bGw7VHo9ISghdHx8IXQuY3JlYXRlU2hhZG93Um9vdCYmIXQuYXR0YWNoU2hhZG93KX1yZXR1cm4gVHp9KSgpKXtjb25zdCBlPXQuZ2V0Um9vdE5vZGU/dC5nZXRSb290Tm9kZSgpOm51bGw7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBTaGFkb3dSb290JiZTaGFkb3dSb290JiZlIGluc3RhbmNlb2YgU2hhZG93Um9vdClyZXR1cm4gZX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBGeigpe2xldCB0PSJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJmRvY3VtZW50P2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQ6bnVsbDtmb3IoO3QmJnQuc2hhZG93Um9vdDspe2NvbnN0IGU9dC5zaGFkb3dSb290LmFjdGl2ZUVsZW1lbnQ7aWYoZT09PXQpYnJlYWs7dD1lfXJldHVybiB0fWZ1bmN0aW9uIEx6KHQpe3JldHVybiB0LmNvbXBvc2VkUGF0aD90LmNvbXBvc2VkUGF0aCgpWzBdOnQudGFyZ2V0fWNsYXNzIEJ6e2NyZWF0ZSh0KXtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXI/bnVsbDpuZXcgTXV0YXRpb25PYnNlcnZlcih0KX19QnouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEJ6KX0sQnouybVwcm92PU1uKHtmYWN0b3J5OmZ1bmN0aW9uIHQoKXtyZXR1cm4gbmV3IEJ6fSx0b2tlbjpCeixwcm92aWRlZEluOiJyb290In0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQnosW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOiJyb290In1dfV0sbnVsbCxudWxsKTtjbGFzcyBWentjb25zdHJ1Y3Rvcih0KXt0aGlzLl9tdXRhdGlvbk9ic2VydmVyRmFjdG9yeT10LHRoaXMuX29ic2VydmVkRWxlbWVudHM9bmV3IE1hcH1uZ09uRGVzdHJveSgpe3RoaXMuX29ic2VydmVkRWxlbWVudHMuZm9yRWFjaCgoKHQsZSk9PnRoaXMuX2NsZWFudXBPYnNlcnZlcihlKSkpfW9ic2VydmUodCl7Y29uc3QgZT14eih0KTtyZXR1cm4gbmV3IEQoKHQ9Pntjb25zdCBuPXRoaXMuX29ic2VydmVFbGVtZW50KGUpLnN1YnNjcmliZSh0KTtyZXR1cm4oKT0+e24udW5zdWJzY3JpYmUoKSx0aGlzLl91bm9ic2VydmVFbGVtZW50KGUpfX0pKX1fb2JzZXJ2ZUVsZW1lbnQodCl7aWYodGhpcy5fb2JzZXJ2ZWRFbGVtZW50cy5oYXModCkpdGhpcy5fb2JzZXJ2ZWRFbGVtZW50cy5nZXQodCkuY291bnQrKztlbHNle2NvbnN0IGU9bmV3IEksbj10aGlzLl9tdXRhdGlvbk9ic2VydmVyRmFjdG9yeS5jcmVhdGUoKHQ9PmUubmV4dCh0KSkpO24mJm4ub2JzZXJ2ZSh0LHtjaGFyYWN0ZXJEYXRhOiEwLGNoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSksdGhpcy5fb2JzZXJ2ZWRFbGVtZW50cy5zZXQodCx7b2JzZXJ2ZXI6bixzdHJlYW06ZSxjb3VudDoxfSl9cmV0dXJuIHRoaXMuX29ic2VydmVkRWxlbWVudHMuZ2V0KHQpLnN0cmVhbX1fdW5vYnNlcnZlRWxlbWVudCh0KXt0aGlzLl9vYnNlcnZlZEVsZW1lbnRzLmhhcyh0KSYmKHRoaXMuX29ic2VydmVkRWxlbWVudHMuZ2V0KHQpLmNvdW50LS0sdGhpcy5fb2JzZXJ2ZWRFbGVtZW50cy5nZXQodCkuY291bnR8fHRoaXMuX2NsZWFudXBPYnNlcnZlcih0KSl9X2NsZWFudXBPYnNlcnZlcih0KXtpZih0aGlzLl9vYnNlcnZlZEVsZW1lbnRzLmhhcyh0KSl7Y29uc3R7b2JzZXJ2ZXI6ZSxzdHJlYW06bn09dGhpcy5fb2JzZXJ2ZWRFbGVtZW50cy5nZXQodCk7ZSYmZS5kaXNjb25uZWN0KCksbi5jb21wbGV0ZSgpLHRoaXMuX29ic2VydmVkRWxlbWVudHMuZGVsZXRlKHQpfX19VnouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFZ6KSh2cihCeikpfSxWei7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgVnoodnIoQnopKX0sdG9rZW46VnoscHJvdmlkZWRJbjoicm9vdCJ9KSxWei5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOkJ6fV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChWeixbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6Qnp9XX0pLG51bGwpO2NsYXNzIGp6e2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLl9jb250ZW50T2JzZXJ2ZXI9dCx0aGlzLl9lbGVtZW50UmVmPWUsdGhpcy5fbmdab25lPW4sdGhpcy5ldmVudD1uZXcgTGgsdGhpcy5fZGlzYWJsZWQ9ITEsdGhpcy5fY3VycmVudFN1YnNjcmlwdGlvbj1udWxsfWdldCBkaXNhYmxlZCgpe3JldHVybiB0aGlzLl9kaXNhYmxlZH1zZXQgZGlzYWJsZWQodCl7dGhpcy5fZGlzYWJsZWQ9eXoodCksdGhpcy5fZGlzYWJsZWQ/dGhpcy5fdW5zdWJzY3JpYmUoKTp0aGlzLl9zdWJzY3JpYmUoKX1nZXQgZGVib3VuY2UoKXtyZXR1cm4gdGhpcy5fZGVib3VuY2V9c2V0IGRlYm91bmNlKHQpe3RoaXMuX2RlYm91bmNlPV96KHQpLHRoaXMuX3N1YnNjcmliZSgpfW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX2N1cnJlbnRTdWJzY3JpcHRpb258fHRoaXMuZGlzYWJsZWR8fHRoaXMuX3N1YnNjcmliZSgpfW5nT25EZXN0cm95KCl7dGhpcy5fdW5zdWJzY3JpYmUoKX1fc3Vic2NyaWJlKCl7dGhpcy5fdW5zdWJzY3JpYmUoKTtjb25zdCB0PXRoaXMuX2NvbnRlbnRPYnNlcnZlci5vYnNlcnZlKHRoaXMuX2VsZW1lbnRSZWYpO3RoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9Pnt0aGlzLl9jdXJyZW50U3Vic2NyaXB0aW9uPSh0aGlzLmRlYm91bmNlP3QucGlwZShnZSh0aGlzLmRlYm91bmNlKSk6dCkuc3Vic2NyaWJlKHRoaXMuZXZlbnQpfSkpfV91bnN1YnNjcmliZSgpe3ZhciB0O251bGw9PT0odD10aGlzLl9jdXJyZW50U3Vic2NyaXB0aW9uKXx8dm9pZCAwPT09dHx8dC51bnN1YnNjcmliZSgpfX1qei7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8anopKFNtKFZ6KSxTbShoZyksU20oYV8pKX0sanouybVkaXI9bG8oe3R5cGU6anosc2VsZWN0b3JzOltbIiIsImNka09ic2VydmVDb250ZW50IiwiIl1dLGlucHV0czp7ZGlzYWJsZWQ6WyJjZGtPYnNlcnZlQ29udGVudERpc2FibGVkIiwiZGlzYWJsZWQiXSxkZWJvdW5jZToiZGVib3VuY2UifSxvdXRwdXRzOntldmVudDoiY2RrT2JzZXJ2ZUNvbnRlbnQifSxleHBvcnRBczpbImNka09ic2VydmVDb250ZW50Il19KSxqei5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlZ6fSx7dHlwZTpoZ30se3R5cGU6YV99XSxqei5wcm9wRGVjb3JhdG9ycz17ZXZlbnQ6W3t0eXBlOk95LGFyZ3M6WyJjZGtPYnNlcnZlQ29udGVudCJdfV0sZGlzYWJsZWQ6W3t0eXBlOnh5LGFyZ3M6WyJjZGtPYnNlcnZlQ29udGVudERpc2FibGVkIl19XSxkZWJvdW5jZTpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChqeixbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbY2RrT2JzZXJ2ZUNvbnRlbnRdIixleHBvcnRBczoiY2RrT2JzZXJ2ZUNvbnRlbnQifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6Vnp9LHt0eXBlOmhnfSx7dHlwZTphX31dfSkse2V2ZW50Olt7dHlwZTpPeSxhcmdzOlsiY2RrT2JzZXJ2ZUNvbnRlbnQiXX1dLGRpc2FibGVkOlt7dHlwZTp4eSxhcmdzOlsiY2RrT2JzZXJ2ZUNvbnRlbnREaXNhYmxlZCJdfV0sZGVib3VuY2U6W3t0eXBlOnh5fV19KTtjbGFzcyBVent9ZnVuY3Rpb24gR3oodCxlKXtyZXR1cm4odC5nZXRBdHRyaWJ1dGUoZSl8fCIiKS5tYXRjaCgvXFMrL2cpfHxbXX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovVXouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFV6KX0sVXouybVtb2Q9YW8oe3R5cGU6VXp9KSxVei7JtWluaj12bih7cHJvdmlkZXJzOltCel19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFV6LFt7dHlwZTpBeSxhcmdzOlt7ZXhwb3J0czpbanpdLGRlY2xhcmF0aW9uczpbanpdLHByb3ZpZGVyczpbQnpdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oVXose2RlY2xhcmF0aW9uczpbanpdLGV4cG9ydHM6W2p6XX0pO2NvbnN0IFd6PSJjZGstZGVzY3JpYmVkYnktbWVzc2FnZS1jb250YWluZXIiLFl6PSJjZGstZGVzY3JpYmVkYnktaG9zdCI7bGV0IHF6PTA7Y29uc3QgWno9bmV3IE1hcDtsZXQgWHo9bnVsbDtjbGFzcyBLentjb25zdHJ1Y3Rvcih0KXt0aGlzLl9kb2N1bWVudD10fWRlc2NyaWJlKHQsZSxuKXtpZighdGhpcy5fY2FuQmVEZXNjcmliZWQodCxlKSlyZXR1cm47Y29uc3Qgbz1KeihlLG4pOyJzdHJpbmciIT10eXBlb2YgZT8oUXooZSksWnouc2V0KG8se21lc3NhZ2VFbGVtZW50OmUscmVmZXJlbmNlQ291bnQ6MH0pKTpaei5oYXMobyl8fHRoaXMuX2NyZWF0ZU1lc3NhZ2VFbGVtZW50KGUsbiksdGhpcy5faXNFbGVtZW50RGVzY3JpYmVkQnlNZXNzYWdlKHQsbyl8fHRoaXMuX2FkZE1lc3NhZ2VSZWZlcmVuY2UodCxvKX1yZW1vdmVEZXNjcmlwdGlvbih0LGUsbil7aWYoIWV8fCF0aGlzLl9pc0VsZW1lbnROb2RlKHQpKXJldHVybjtjb25zdCBvPUp6KGUsbik7aWYodGhpcy5faXNFbGVtZW50RGVzY3JpYmVkQnlNZXNzYWdlKHQsbykmJnRoaXMuX3JlbW92ZU1lc3NhZ2VSZWZlcmVuY2UodCxvKSwic3RyaW5nIj09dHlwZW9mIGUpe2NvbnN0IHQ9WnouZ2V0KG8pO3QmJjA9PT10LnJlZmVyZW5jZUNvdW50JiZ0aGlzLl9kZWxldGVNZXNzYWdlRWxlbWVudChvKX1YeiYmMD09PVh6LmNoaWxkTm9kZXMubGVuZ3RoJiZ0aGlzLl9kZWxldGVNZXNzYWdlc0NvbnRhaW5lcigpfW5nT25EZXN0cm95KCl7Y29uc3QgdD10aGlzLl9kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbY2RrLWRlc2NyaWJlZGJ5LWhvc3RdIik7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspdGhpcy5fcmVtb3ZlQ2RrRGVzY3JpYmVkQnlSZWZlcmVuY2VJZHModFtlXSksdFtlXS5yZW1vdmVBdHRyaWJ1dGUoWXopO1h6JiZ0aGlzLl9kZWxldGVNZXNzYWdlc0NvbnRhaW5lcigpLFp6LmNsZWFyKCl9X2NyZWF0ZU1lc3NhZ2VFbGVtZW50KHQsZSl7Y29uc3Qgbj10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtReihuKSxuLnRleHRDb250ZW50PXQsZSYmbi5zZXRBdHRyaWJ1dGUoInJvbGUiLGUpLHRoaXMuX2NyZWF0ZU1lc3NhZ2VzQ29udGFpbmVyKCksWHouYXBwZW5kQ2hpbGQobiksWnouc2V0KEp6KHQsZSkse21lc3NhZ2VFbGVtZW50Om4scmVmZXJlbmNlQ291bnQ6MH0pfV9kZWxldGVNZXNzYWdlRWxlbWVudCh0KXtjb25zdCBlPVp6LmdldCh0KSxuPWUmJmUubWVzc2FnZUVsZW1lbnQ7WHomJm4mJlh6LnJlbW92ZUNoaWxkKG4pLFp6LmRlbGV0ZSh0KX1fY3JlYXRlTWVzc2FnZXNDb250YWluZXIoKXtpZighWHope2NvbnN0IHQ9dGhpcy5fZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoV3opO3QmJnQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLFh6PXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLFh6LmlkPVd6LFh6LnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIsWHouY2xhc3NMaXN0LmFkZCgiY2RrLXZpc3VhbGx5LWhpZGRlbiIpLHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoWHopfX1fZGVsZXRlTWVzc2FnZXNDb250YWluZXIoKXtYeiYmWHoucGFyZW50Tm9kZSYmKFh6LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoWHopLFh6PW51bGwpfV9yZW1vdmVDZGtEZXNjcmliZWRCeVJlZmVyZW5jZUlkcyh0KXtjb25zdCBlPUd6KHQsImFyaWEtZGVzY3JpYmVkYnkiKS5maWx0ZXIoKHQ9PjAhPXQuaW5kZXhPZigiY2RrLWRlc2NyaWJlZGJ5LW1lc3NhZ2UiKSkpO3Quc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5IixlLmpvaW4oIiAiKSl9X2FkZE1lc3NhZ2VSZWZlcmVuY2UodCxlKXtjb25zdCBuPVp6LmdldChlKTshKGZ1bmN0aW9uIG8odCxlLG4pe2NvbnN0IG89R3oodCxlKTtvLnNvbWUoKHQ9PnQudHJpbSgpPT1uLnRyaW0oKSkpfHwoby5wdXNoKG4udHJpbSgpKSx0LnNldEF0dHJpYnV0ZShlLG8uam9pbigiICIpKSl9KSh0LCJhcmlhLWRlc2NyaWJlZGJ5IixuLm1lc3NhZ2VFbGVtZW50LmlkKSx0LnNldEF0dHJpYnV0ZShZeiwiIiksbi5yZWZlcmVuY2VDb3VudCsrfV9yZW1vdmVNZXNzYWdlUmVmZXJlbmNlKHQsZSl7Y29uc3Qgbj1aei5nZXQoZSk7bi5yZWZlcmVuY2VDb3VudC0tLChmdW5jdGlvbiBvKHQsZSxuKXtjb25zdCBvPUd6KHQsZSkuZmlsdGVyKCh0PT50IT1uLnRyaW0oKSkpO28ubGVuZ3RoP3Quc2V0QXR0cmlidXRlKGUsby5qb2luKCIgIikpOnQucmVtb3ZlQXR0cmlidXRlKGUpfSkodCwiYXJpYS1kZXNjcmliZWRieSIsbi5tZXNzYWdlRWxlbWVudC5pZCksdC5yZW1vdmVBdHRyaWJ1dGUoWXopfV9pc0VsZW1lbnREZXNjcmliZWRCeU1lc3NhZ2UodCxlKXtjb25zdCBuPUd6KHQsImFyaWEtZGVzY3JpYmVkYnkiKSxvPVp6LmdldChlKSxpPW8mJm8ubWVzc2FnZUVsZW1lbnQuaWQ7cmV0dXJuISFpJiYtMSE9bi5pbmRleE9mKGkpfV9jYW5CZURlc2NyaWJlZCh0LGUpe2lmKCF0aGlzLl9pc0VsZW1lbnROb2RlKHQpKXJldHVybiExO2lmKGUmJiJvYmplY3QiPT10eXBlb2YgZSlyZXR1cm4hMDtjb25zdCBuPW51bGw9PWU/IiI6YCR7ZX1gLnRyaW0oKSxvPXQuZ2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIik7cmV0dXJuISghbnx8byYmby50cmltKCk9PT1uKX1faXNFbGVtZW50Tm9kZSh0KXtyZXR1cm4gdC5ub2RlVHlwZT09PXRoaXMuX2RvY3VtZW50LkVMRU1FTlRfTk9ERX19ZnVuY3Rpb24gSnoodCxlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/YCR7ZXx8IiJ9LyR7dH1gOnR9ZnVuY3Rpb24gUXoodCl7dC5pZHx8KHQuaWQ9ImNkay1kZXNjcmliZWRieS1tZXNzYWdlLSIrcXorKyl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL0t6Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxLeikodnIoWl8pKX0sS3ouybVwcm92PU1uKHtmYWN0b3J5OmZ1bmN0aW9uIHQoKXtyZXR1cm4gbmV3IEt6KHZyKFpfKSl9LHRva2VuOkt6LHByb3ZpZGVkSW46InJvb3QifSksS3ouY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEt6LFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XX0pLG51bGwpO2NsYXNzICR6e2NvbnN0cnVjdG9yKHQpe3RoaXMuX2l0ZW1zPXQsdGhpcy5fYWN0aXZlSXRlbUluZGV4PS0xLHRoaXMuX2FjdGl2ZUl0ZW09bnVsbCx0aGlzLl93cmFwPSExLHRoaXMuX2xldHRlcktleVN0cmVhbT1uZXcgSSx0aGlzLl90eXBlYWhlYWRTdWJzY3JpcHRpb249bS5FTVBUWSx0aGlzLl92ZXJ0aWNhbD0hMCx0aGlzLl9hbGxvd2VkTW9kaWZpZXJLZXlzPVtdLHRoaXMuX2hvbWVBbmRFbmQ9ITEsdGhpcy5fc2tpcFByZWRpY2F0ZUZuPXQ9PnQuZGlzYWJsZWQsdGhpcy5fcHJlc3NlZExldHRlcnM9W10sdGhpcy50YWJPdXQ9bmV3IEksdGhpcy5jaGFuZ2U9bmV3IEksdCBpbnN0YW5jZW9mIFZoJiZ0LmNoYW5nZXMuc3Vic2NyaWJlKCh0PT57aWYodGhpcy5fYWN0aXZlSXRlbSl7Y29uc3QgZT10LnRvQXJyYXkoKS5pbmRleE9mKHRoaXMuX2FjdGl2ZUl0ZW0pO2U+LTEmJmUhPT10aGlzLl9hY3RpdmVJdGVtSW5kZXgmJih0aGlzLl9hY3RpdmVJdGVtSW5kZXg9ZSl9fSkpfXNraXBQcmVkaWNhdGUodCl7cmV0dXJuIHRoaXMuX3NraXBQcmVkaWNhdGVGbj10LHRoaXN9d2l0aFdyYXAodD0hMCl7cmV0dXJuIHRoaXMuX3dyYXA9dCx0aGlzfXdpdGhWZXJ0aWNhbE9yaWVudGF0aW9uKHQ9ITApe3JldHVybiB0aGlzLl92ZXJ0aWNhbD10LHRoaXN9d2l0aEhvcml6b250YWxPcmllbnRhdGlvbih0KXtyZXR1cm4gdGhpcy5faG9yaXpvbnRhbD10LHRoaXN9d2l0aEFsbG93ZWRNb2RpZmllcktleXModCl7cmV0dXJuIHRoaXMuX2FsbG93ZWRNb2RpZmllcktleXM9dCx0aGlzfXdpdGhUeXBlQWhlYWQodD0yMDApe2lmKCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmdGhpcy5faXRlbXMubGVuZ3RoJiZ0aGlzLl9pdGVtcy5zb21lKCh0PT4iZnVuY3Rpb24iIT10eXBlb2YgdC5nZXRMYWJlbCkpKXRocm93IEVycm9yKCJMaXN0S2V5TWFuYWdlciBpdGVtcyBpbiB0eXBlYWhlYWQgbW9kZSBtdXN0IGltcGxlbWVudCB0aGUgYGdldExhYmVsYCBtZXRob2QuIik7cmV0dXJuIHRoaXMuX3R5cGVhaGVhZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX3R5cGVhaGVhZFN1YnNjcmlwdGlvbj10aGlzLl9sZXR0ZXJLZXlTdHJlYW0ucGlwZShGZSgodD0+dGhpcy5fcHJlc3NlZExldHRlcnMucHVzaCh0KSkpLGdlKHQpLGNlKCgoKT0+dGhpcy5fcHJlc3NlZExldHRlcnMubGVuZ3RoPjApKSxJdCgoKCk9PnRoaXMuX3ByZXNzZWRMZXR0ZXJzLmpvaW4oIiIpKSkpLnN1YnNjcmliZSgodD0+e2NvbnN0IGU9dGhpcy5fZ2V0SXRlbXNBcnJheSgpO2ZvcihsZXQgbj0xO248ZS5sZW5ndGgrMTtuKyspe2NvbnN0IG89KHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCtuKSVlLmxlbmd0aCxpPWVbb107aWYoIXRoaXMuX3NraXBQcmVkaWNhdGVGbihpKSYmMD09PWkuZ2V0TGFiZWwoKS50b1VwcGVyQ2FzZSgpLnRyaW0oKS5pbmRleE9mKHQpKXt0aGlzLnNldEFjdGl2ZUl0ZW0obyk7YnJlYWt9fXRoaXMuX3ByZXNzZWRMZXR0ZXJzPVtdfSkpLHRoaXN9d2l0aEhvbWVBbmRFbmQodD0hMCl7cmV0dXJuIHRoaXMuX2hvbWVBbmRFbmQ9dCx0aGlzfXNldEFjdGl2ZUl0ZW0odCl7Y29uc3QgZT10aGlzLl9hY3RpdmVJdGVtO3RoaXMudXBkYXRlQWN0aXZlSXRlbSh0KSx0aGlzLl9hY3RpdmVJdGVtIT09ZSYmdGhpcy5jaGFuZ2UubmV4dCh0aGlzLl9hY3RpdmVJdGVtSW5kZXgpfW9uS2V5ZG93bih0KXtjb25zdCBlPXQua2V5Q29kZSxuPVsiYWx0S2V5IiwiY3RybEtleSIsIm1ldGFLZXkiLCJzaGlmdEtleSJdLmV2ZXJ5KChlPT4hdFtlXXx8dGhpcy5fYWxsb3dlZE1vZGlmaWVyS2V5cy5pbmRleE9mKGUpPi0xKSk7c3dpdGNoKGUpe2Nhc2UgOTpyZXR1cm4gdm9pZCB0aGlzLnRhYk91dC5uZXh0KCk7Y2FzZSBoejppZih0aGlzLl92ZXJ0aWNhbCYmbil7dGhpcy5zZXROZXh0SXRlbUFjdGl2ZSgpO2JyZWFrfXJldHVybjtjYXNlIGd6OmlmKHRoaXMuX3ZlcnRpY2FsJiZuKXt0aGlzLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpO2JyZWFrfXJldHVybjtjYXNlIDM5OmlmKHRoaXMuX2hvcml6b250YWwmJm4peyJydGwiPT09dGhpcy5faG9yaXpvbnRhbD90aGlzLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpOnRoaXMuc2V0TmV4dEl0ZW1BY3RpdmUoKTticmVha31yZXR1cm47Y2FzZSAzNzppZih0aGlzLl9ob3Jpem9udGFsJiZuKXsicnRsIj09PXRoaXMuX2hvcml6b250YWw/dGhpcy5zZXROZXh0SXRlbUFjdGl2ZSgpOnRoaXMuc2V0UHJldmlvdXNJdGVtQWN0aXZlKCk7YnJlYWt9cmV0dXJuO2Nhc2UgMzY6aWYodGhpcy5faG9tZUFuZEVuZCYmbil7dGhpcy5zZXRGaXJzdEl0ZW1BY3RpdmUoKTticmVha31yZXR1cm47Y2FzZSAzNTppZih0aGlzLl9ob21lQW5kRW5kJiZuKXt0aGlzLnNldExhc3RJdGVtQWN0aXZlKCk7YnJlYWt9cmV0dXJuO2RlZmF1bHQ6cmV0dXJuIHZvaWQoKG58fGJ6KHQsInNoaWZ0S2V5IikpJiYodC5rZXkmJjE9PT10LmtleS5sZW5ndGg/dGhpcy5fbGV0dGVyS2V5U3RyZWFtLm5leHQodC5rZXkudG9Mb2NhbGVVcHBlckNhc2UoKSk6KGU+PTY1JiZlPD05MHx8ZT49NDgmJmU8PTU3KSYmdGhpcy5fbGV0dGVyS2V5U3RyZWFtLm5leHQoU3RyaW5nLmZyb21DaGFyQ29kZShlKSkpKX10aGlzLl9wcmVzc2VkTGV0dGVycz1bXSx0LnByZXZlbnREZWZhdWx0KCl9Z2V0IGFjdGl2ZUl0ZW1JbmRleCgpe3JldHVybiB0aGlzLl9hY3RpdmVJdGVtSW5kZXh9Z2V0IGFjdGl2ZUl0ZW0oKXtyZXR1cm4gdGhpcy5fYWN0aXZlSXRlbX1pc1R5cGluZygpe3JldHVybiB0aGlzLl9wcmVzc2VkTGV0dGVycy5sZW5ndGg+MH1zZXRGaXJzdEl0ZW1BY3RpdmUoKXt0aGlzLl9zZXRBY3RpdmVJdGVtQnlJbmRleCgwLDEpfXNldExhc3RJdGVtQWN0aXZlKCl7dGhpcy5fc2V0QWN0aXZlSXRlbUJ5SW5kZXgodGhpcy5faXRlbXMubGVuZ3RoLTEsLTEpfXNldE5leHRJdGVtQWN0aXZlKCl7dGhpcy5fYWN0aXZlSXRlbUluZGV4PDA/dGhpcy5zZXRGaXJzdEl0ZW1BY3RpdmUoKTp0aGlzLl9zZXRBY3RpdmVJdGVtQnlEZWx0YSgxKX1zZXRQcmV2aW91c0l0ZW1BY3RpdmUoKXt0aGlzLl9hY3RpdmVJdGVtSW5kZXg8MCYmdGhpcy5fd3JhcD90aGlzLnNldExhc3RJdGVtQWN0aXZlKCk6dGhpcy5fc2V0QWN0aXZlSXRlbUJ5RGVsdGEoLTEpfXVwZGF0ZUFjdGl2ZUl0ZW0odCl7Y29uc3QgZT10aGlzLl9nZXRJdGVtc0FycmF5KCksbj0ibnVtYmVyIj09dHlwZW9mIHQ/dDplLmluZGV4T2YodCksbz1lW25dO3RoaXMuX2FjdGl2ZUl0ZW09bnVsbD09bz9udWxsOm8sdGhpcy5fYWN0aXZlSXRlbUluZGV4PW59X3NldEFjdGl2ZUl0ZW1CeURlbHRhKHQpe3RoaXMuX3dyYXA/dGhpcy5fc2V0QWN0aXZlSW5XcmFwTW9kZSh0KTp0aGlzLl9zZXRBY3RpdmVJbkRlZmF1bHRNb2RlKHQpfV9zZXRBY3RpdmVJbldyYXBNb2RlKHQpe2NvbnN0IGU9dGhpcy5fZ2V0SXRlbXNBcnJheSgpO2ZvcihsZXQgbj0xO248PWUubGVuZ3RoO24rKyl7Y29uc3Qgbz0odGhpcy5fYWN0aXZlSXRlbUluZGV4K3QqbitlLmxlbmd0aCklZS5sZW5ndGg7aWYoIXRoaXMuX3NraXBQcmVkaWNhdGVGbihlW29dKSlyZXR1cm4gdm9pZCB0aGlzLnNldEFjdGl2ZUl0ZW0obyl9fV9zZXRBY3RpdmVJbkRlZmF1bHRNb2RlKHQpe3RoaXMuX3NldEFjdGl2ZUl0ZW1CeUluZGV4KHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCt0LHQpfV9zZXRBY3RpdmVJdGVtQnlJbmRleCh0LGUpe2NvbnN0IG49dGhpcy5fZ2V0SXRlbXNBcnJheSgpO2lmKG5bdF0pe2Zvcig7dGhpcy5fc2tpcFByZWRpY2F0ZUZuKG5bdF0pOylpZighblt0Kz1lXSlyZXR1cm47dGhpcy5zZXRBY3RpdmVJdGVtKHQpfX1fZ2V0SXRlbXNBcnJheSgpe3JldHVybiB0aGlzLl9pdGVtcyBpbnN0YW5jZW9mIFZoP3RoaXMuX2l0ZW1zLnRvQXJyYXkoKTp0aGlzLl9pdGVtc319Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIHRJIGV4dGVuZHMgJHp7c2V0QWN0aXZlSXRlbSh0KXt0aGlzLmFjdGl2ZUl0ZW0mJnRoaXMuYWN0aXZlSXRlbS5zZXRJbmFjdGl2ZVN0eWxlcygpLHN1cGVyLnNldEFjdGl2ZUl0ZW0odCksdGhpcy5hY3RpdmVJdGVtJiZ0aGlzLmFjdGl2ZUl0ZW0uc2V0QWN0aXZlU3R5bGVzKCl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBlSSBleHRlbmRzICR6e2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9vcmlnaW49InByb2dyYW0ifXNldEZvY3VzT3JpZ2luKHQpe3JldHVybiB0aGlzLl9vcmlnaW49dCx0aGlzfXNldEFjdGl2ZUl0ZW0odCl7c3VwZXIuc2V0QWN0aXZlSXRlbSh0KSx0aGlzLmFjdGl2ZUl0ZW0mJnRoaXMuYWN0aXZlSXRlbS5mb2N1cyh0aGlzLl9vcmlnaW4pfX1jbGFzcyBuSXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9wbGF0Zm9ybT10fWlzRGlzYWJsZWQodCl7cmV0dXJuIHQuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpfWlzVmlzaWJsZSh0KXtyZXR1cm4oZnVuY3Rpb24gZSh0KXtyZXR1cm4hISh0Lm9mZnNldFdpZHRofHx0Lm9mZnNldEhlaWdodHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQuZ2V0Q2xpZW50UmVjdHMmJnQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSkodCkmJiJ2aXNpYmxlIj09PWdldENvbXB1dGVkU3R5bGUodCkudmlzaWJpbGl0eX1pc1RhYmJhYmxlKHQpe2lmKCF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpcmV0dXJuITE7Y29uc3QgZT0oZnVuY3Rpb24gbyh0KXt0cnl7cmV0dXJuIHQuZnJhbWVFbGVtZW50fWNhdGNoKHQpe3JldHVybiBudWxsfX0pKChmdW5jdGlvbiBuKHQpe3JldHVybiB0Lm93bmVyRG9jdW1lbnQmJnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8d2luZG93fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8pKHQpKTtpZihlKXtpZigtMT09PWlJKGUpKXJldHVybiExO2lmKCF0aGlzLmlzVmlzaWJsZShlKSlyZXR1cm4hMX1sZXQgaT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksYT1pSSh0KTtyZXR1cm4gdC5oYXNBdHRyaWJ1dGUoImNvbnRlbnRlZGl0YWJsZSIpPy0xIT09YToiaWZyYW1lIiE9PWkmJiJvYmplY3QiIT09aSYmISh0aGlzLl9wbGF0Zm9ybS5XRUJLSVQmJnRoaXMuX3BsYXRmb3JtLklPUyYmIShmdW5jdGlvbiByKHQpe2xldCBlPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxuPSJpbnB1dCI9PT1lJiZ0LnR5cGU7cmV0dXJuInRleHQiPT09bnx8InBhc3N3b3JkIj09PW58fCJzZWxlY3QiPT09ZXx8InRleHRhcmVhIj09PWV9KSh0KSkmJigiYXVkaW8iPT09aT8hIXQuaGFzQXR0cmlidXRlKCJjb250cm9scyIpJiYtMSE9PWE6InZpZGVvIj09PWk/LTEhPT1hJiYobnVsbCE9PWF8fHRoaXMuX3BsYXRmb3JtLkZJUkVGT1h8fHQuaGFzQXR0cmlidXRlKCJjb250cm9scyIpKTp0LnRhYkluZGV4Pj0wKX1pc0ZvY3VzYWJsZSh0LGUpe3JldHVybihmdW5jdGlvbiBuKHQpe3JldHVybiEoZnVuY3Rpb24gZSh0KXtyZXR1cm4oZnVuY3Rpb24gZSh0KXtyZXR1cm4iaW5wdXQiPT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCl9KSh0KSYmImhpZGRlbiI9PXQudHlwZX0pKHQpJiYoKGZ1bmN0aW9uIG4odCl7bGV0IGU9dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1lfHwic2VsZWN0Ij09PWV8fCJidXR0b24iPT09ZXx8InRleHRhcmVhIj09PWV9KSh0KXx8KGZ1bmN0aW9uIG8odCl7cmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJuImEiPT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCl9KSh0KSYmdC5oYXNBdHRyaWJ1dGUoImhyZWYiKX0pKHQpfHx0Lmhhc0F0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIil8fG9JKHQpKX0pKHQpJiYhdGhpcy5pc0Rpc2FibGVkKHQpJiYoKG51bGw9PWU/dm9pZCAwOmUuaWdub3JlVmlzaWJpbGl0eSl8fHRoaXMuaXNWaXNpYmxlKHQpKX19ZnVuY3Rpb24gb0kodCl7aWYoIXQuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpfHx2b2lkIDA9PT10LnRhYkluZGV4KXJldHVybiExO2xldCBlPXQuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpO3JldHVybiItMzI3NjgiIT1lJiYhKCFlfHxpc05hTihwYXJzZUludChlLDEwKSkpfWZ1bmN0aW9uIGlJKHQpe2lmKCFvSSh0KSlyZXR1cm4gbnVsbDtjb25zdCBlPXBhcnNlSW50KHQuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpfHwiIiwxMCk7cmV0dXJuIGlzTmFOKGUpPy0xOmV9bkkuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fG5JKSh2cih3eikpfSxuSS7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgbkkodnIod3opKX0sdG9rZW46bkkscHJvdmlkZWRJbjoicm9vdCJ9KSxuSS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnd6fV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChuSSxbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6d3p9XX0pLG51bGwpO2NsYXNzIGFJe2NvbnN0cnVjdG9yKHQsZSxuLG8saT0hMSl7dGhpcy5fZWxlbWVudD10LHRoaXMuX2NoZWNrZXI9ZSx0aGlzLl9uZ1pvbmU9bix0aGlzLl9kb2N1bWVudD1vLHRoaXMuX2hhc0F0dGFjaGVkPSExLHRoaXMuc3RhcnRBbmNob3JMaXN0ZW5lcj0oKT0+dGhpcy5mb2N1c0xhc3RUYWJiYWJsZUVsZW1lbnQoKSx0aGlzLmVuZEFuY2hvckxpc3RlbmVyPSgpPT50aGlzLmZvY3VzRmlyc3RUYWJiYWJsZUVsZW1lbnQoKSx0aGlzLl9lbmFibGVkPSEwLGl8fHRoaXMuYXR0YWNoQW5jaG9ycygpfWdldCBlbmFibGVkKCl7cmV0dXJuIHRoaXMuX2VuYWJsZWR9c2V0IGVuYWJsZWQodCl7dGhpcy5fZW5hYmxlZD10LHRoaXMuX3N0YXJ0QW5jaG9yJiZ0aGlzLl9lbmRBbmNob3ImJih0aGlzLl90b2dnbGVBbmNob3JUYWJJbmRleCh0LHRoaXMuX3N0YXJ0QW5jaG9yKSx0aGlzLl90b2dnbGVBbmNob3JUYWJJbmRleCh0LHRoaXMuX2VuZEFuY2hvcikpfWRlc3Ryb3koKXtjb25zdCB0PXRoaXMuX3N0YXJ0QW5jaG9yLGU9dGhpcy5fZW5kQW5jaG9yO3QmJih0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLnN0YXJ0QW5jaG9yTGlzdGVuZXIpLHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpKSxlJiYoZS5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5lbmRBbmNob3JMaXN0ZW5lciksZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSkpLHRoaXMuX3N0YXJ0QW5jaG9yPXRoaXMuX2VuZEFuY2hvcj1udWxsLHRoaXMuX2hhc0F0dGFjaGVkPSExfWF0dGFjaEFuY2hvcnMoKXtyZXR1cm4hIXRoaXMuX2hhc0F0dGFjaGVkfHwodGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e3RoaXMuX3N0YXJ0QW5jaG9yfHwodGhpcy5fc3RhcnRBbmNob3I9dGhpcy5fY3JlYXRlQW5jaG9yKCksdGhpcy5fc3RhcnRBbmNob3IuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuc3RhcnRBbmNob3JMaXN0ZW5lcikpLHRoaXMuX2VuZEFuY2hvcnx8KHRoaXMuX2VuZEFuY2hvcj10aGlzLl9jcmVhdGVBbmNob3IoKSx0aGlzLl9lbmRBbmNob3IuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuZW5kQW5jaG9yTGlzdGVuZXIpKX0pKSx0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUmJih0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuX3N0YXJ0QW5jaG9yLHRoaXMuX2VsZW1lbnQpLHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5fZW5kQW5jaG9yLHRoaXMuX2VsZW1lbnQubmV4dFNpYmxpbmcpLHRoaXMuX2hhc0F0dGFjaGVkPSEwKSx0aGlzLl9oYXNBdHRhY2hlZCl9Zm9jdXNJbml0aWFsRWxlbWVudFdoZW5SZWFkeSh0KXtyZXR1cm4gbmV3IFByb21pc2UoKGU9Pnt0aGlzLl9leGVjdXRlT25TdGFibGUoKCgpPT5lKHRoaXMuZm9jdXNJbml0aWFsRWxlbWVudCh0KSkpKX0pKX1mb2N1c0ZpcnN0VGFiYmFibGVFbGVtZW50V2hlblJlYWR5KHQpe3JldHVybiBuZXcgUHJvbWlzZSgoZT0+e3RoaXMuX2V4ZWN1dGVPblN0YWJsZSgoKCk9PmUodGhpcy5mb2N1c0ZpcnN0VGFiYmFibGVFbGVtZW50KHQpKSkpfSkpfWZvY3VzTGFzdFRhYmJhYmxlRWxlbWVudFdoZW5SZWFkeSh0KXtyZXR1cm4gbmV3IFByb21pc2UoKGU9Pnt0aGlzLl9leGVjdXRlT25TdGFibGUoKCgpPT5lKHRoaXMuZm9jdXNMYXN0VGFiYmFibGVFbGVtZW50KHQpKSkpfSkpfV9nZXRSZWdpb25Cb3VuZGFyeSh0KXtsZXQgZT10aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFtjZGstZm9jdXMtcmVnaW9uLSR7dH1dLCBbY2RrRm9jdXNSZWdpb24ke3R9XSwgW2Nkay1mb2N1cy0ke3R9XWApO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWVbbl0uaGFzQXR0cmlidXRlKGBjZGstZm9jdXMtJHt0fWApP2NvbnNvbGUud2FybihgRm91bmQgdXNlIG9mIGRlcHJlY2F0ZWQgYXR0cmlidXRlICdjZGstZm9jdXMtJHt0fScsIHVzZSAnY2RrRm9jdXNSZWdpb24ke3R9JyBpbnN0ZWFkLiBUaGUgZGVwcmVjYXRlZCBhdHRyaWJ1dGUgd2lsbCBiZSByZW1vdmVkIGluIDguMC4wLmAsZVtuXSk6ZVtuXS5oYXNBdHRyaWJ1dGUoYGNkay1mb2N1cy1yZWdpb24tJHt0fWApJiZjb25zb2xlLndhcm4oYEZvdW5kIHVzZSBvZiBkZXByZWNhdGVkIGF0dHJpYnV0ZSAnY2RrLWZvY3VzLXJlZ2lvbi0ke3R9JywgdXNlICdjZGtGb2N1c1JlZ2lvbiR7dH0nIGluc3RlYWQuIFRoZSBkZXByZWNhdGVkIGF0dHJpYnV0ZSB3aWxsIGJlIHJlbW92ZWQgaW4gOC4wLjAuYCxlW25dKTtyZXR1cm4ic3RhcnQiPT10P2UubGVuZ3RoP2VbMF06dGhpcy5fZ2V0Rmlyc3RUYWJiYWJsZUVsZW1lbnQodGhpcy5fZWxlbWVudCk6ZS5sZW5ndGg/ZVtlLmxlbmd0aC0xXTp0aGlzLl9nZXRMYXN0VGFiYmFibGVFbGVtZW50KHRoaXMuX2VsZW1lbnQpfWZvY3VzSW5pdGlhbEVsZW1lbnQodCl7Y29uc3QgZT10aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIltjZGstZm9jdXMtaW5pdGlhbF0sIFtjZGtGb2N1c0luaXRpYWxdIik7aWYoZSl7aWYoZS5oYXNBdHRyaWJ1dGUoImNkay1mb2N1cy1pbml0aWFsIikmJmNvbnNvbGUud2FybigiRm91bmQgdXNlIG9mIGRlcHJlY2F0ZWQgYXR0cmlidXRlICdjZGstZm9jdXMtaW5pdGlhbCcsIHVzZSAnY2RrRm9jdXNJbml0aWFsJyBpbnN0ZWFkLiBUaGUgZGVwcmVjYXRlZCBhdHRyaWJ1dGUgd2lsbCBiZSByZW1vdmVkIGluIDguMC4wIixlKSwidW5kZWZpbmVkIiE9dHlwZW9mIG5nRGV2TW9kZSYmIW5nRGV2TW9kZXx8dGhpcy5fY2hlY2tlci5pc0ZvY3VzYWJsZShlKXx8Y29uc29sZS53YXJuKCJFbGVtZW50IG1hdGNoaW5nICdbY2RrRm9jdXNJbml0aWFsXScgaXMgbm90IGZvY3VzYWJsZS4iLGUpLCF0aGlzLl9jaGVja2VyLmlzRm9jdXNhYmxlKGUpKXtjb25zdCBuPXRoaXMuX2dldEZpcnN0VGFiYmFibGVFbGVtZW50KGUpO3JldHVybiBudWxsPT1ufHxuLmZvY3VzKHQpLCEhbn1yZXR1cm4gZS5mb2N1cyh0KSwhMH1yZXR1cm4gdGhpcy5mb2N1c0ZpcnN0VGFiYmFibGVFbGVtZW50KHQpfWZvY3VzRmlyc3RUYWJiYWJsZUVsZW1lbnQodCl7Y29uc3QgZT10aGlzLl9nZXRSZWdpb25Cb3VuZGFyeSgic3RhcnQiKTtyZXR1cm4gZSYmZS5mb2N1cyh0KSwhIWV9Zm9jdXNMYXN0VGFiYmFibGVFbGVtZW50KHQpe2NvbnN0IGU9dGhpcy5fZ2V0UmVnaW9uQm91bmRhcnkoImVuZCIpO3JldHVybiBlJiZlLmZvY3VzKHQpLCEhZX1oYXNBdHRhY2hlZCgpe3JldHVybiB0aGlzLl9oYXNBdHRhY2hlZH1fZ2V0Rmlyc3RUYWJiYWJsZUVsZW1lbnQodCl7aWYodGhpcy5fY2hlY2tlci5pc0ZvY3VzYWJsZSh0KSYmdGhpcy5fY2hlY2tlci5pc1RhYmJhYmxlKHQpKXJldHVybiB0O2xldCBlPXQuY2hpbGRyZW58fHQuY2hpbGROb2Rlcztmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7bGV0IG49ZVt0XS5ub2RlVHlwZT09PXRoaXMuX2RvY3VtZW50LkVMRU1FTlRfTk9ERT90aGlzLl9nZXRGaXJzdFRhYmJhYmxlRWxlbWVudChlW3RdKTpudWxsO2lmKG4pcmV0dXJuIG59cmV0dXJuIG51bGx9X2dldExhc3RUYWJiYWJsZUVsZW1lbnQodCl7aWYodGhpcy5fY2hlY2tlci5pc0ZvY3VzYWJsZSh0KSYmdGhpcy5fY2hlY2tlci5pc1RhYmJhYmxlKHQpKXJldHVybiB0O2xldCBlPXQuY2hpbGRyZW58fHQuY2hpbGROb2Rlcztmb3IobGV0IHQ9ZS5sZW5ndGgtMTt0Pj0wO3QtLSl7bGV0IG49ZVt0XS5ub2RlVHlwZT09PXRoaXMuX2RvY3VtZW50LkVMRU1FTlRfTk9ERT90aGlzLl9nZXRMYXN0VGFiYmFibGVFbGVtZW50KGVbdF0pOm51bGw7aWYobilyZXR1cm4gbn1yZXR1cm4gbnVsbH1fY3JlYXRlQW5jaG9yKCl7Y29uc3QgdD10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gdGhpcy5fdG9nZ2xlQW5jaG9yVGFiSW5kZXgodGhpcy5fZW5hYmxlZCx0KSx0LmNsYXNzTGlzdC5hZGQoImNkay12aXN1YWxseS1oaWRkZW4iKSx0LmNsYXNzTGlzdC5hZGQoImNkay1mb2N1cy10cmFwLWFuY2hvciIpLHQuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsInRydWUiKSx0fV90b2dnbGVBbmNob3JUYWJJbmRleCh0LGUpe3Q/ZS5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiMCIpOmUucmVtb3ZlQXR0cmlidXRlKCJ0YWJpbmRleCIpfXRvZ2dsZUFuY2hvcnModCl7dGhpcy5fc3RhcnRBbmNob3ImJnRoaXMuX2VuZEFuY2hvciYmKHRoaXMuX3RvZ2dsZUFuY2hvclRhYkluZGV4KHQsdGhpcy5fc3RhcnRBbmNob3IpLHRoaXMuX3RvZ2dsZUFuY2hvclRhYkluZGV4KHQsdGhpcy5fZW5kQW5jaG9yKSl9X2V4ZWN1dGVPblN0YWJsZSh0KXt0aGlzLl9uZ1pvbmUuaXNTdGFibGU/dCgpOnRoaXMuX25nWm9uZS5vblN0YWJsZS5waXBlKGJlKDEpKS5zdWJzY3JpYmUodCl9fWNsYXNzIHJJe2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLl9jaGVja2VyPXQsdGhpcy5fbmdab25lPWUsdGhpcy5fZG9jdW1lbnQ9bn1jcmVhdGUodCxlPSExKXtyZXR1cm4gbmV3IGFJKHQsdGhpcy5fY2hlY2tlcix0aGlzLl9uZ1pvbmUsdGhpcy5fZG9jdW1lbnQsZSl9fXJJLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxySSkodnIobkkpLHZyKGFfKSx2cihaXykpfSxySS7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgckkodnIobkkpLHZyKGFfKSx2cihaXykpfSx0b2tlbjpySSxwcm92aWRlZEluOiJyb290In0pLHJJLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6bkl9LHt0eXBlOmFffSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHJJLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpuSX0se3R5cGU6YV99LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSksbnVsbCk7Y2xhc3Mgc0l7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuX2VsZW1lbnRSZWY9dCx0aGlzLl9mb2N1c1RyYXBGYWN0b3J5PWUsdGhpcy5fcHJldmlvdXNseUZvY3VzZWRFbGVtZW50PW51bGwsdGhpcy5mb2N1c1RyYXA9dGhpcy5fZm9jdXNUcmFwRmFjdG9yeS5jcmVhdGUodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCEwKX1nZXQgZW5hYmxlZCgpe3JldHVybiB0aGlzLmZvY3VzVHJhcC5lbmFibGVkfXNldCBlbmFibGVkKHQpe3RoaXMuZm9jdXNUcmFwLmVuYWJsZWQ9eXoodCl9Z2V0IGF1dG9DYXB0dXJlKCl7cmV0dXJuIHRoaXMuX2F1dG9DYXB0dXJlfXNldCBhdXRvQ2FwdHVyZSh0KXt0aGlzLl9hdXRvQ2FwdHVyZT15eih0KX1uZ09uRGVzdHJveSgpe3RoaXMuZm9jdXNUcmFwLmRlc3Ryb3koKSx0aGlzLl9wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQmJih0aGlzLl9wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQuZm9jdXMoKSx0aGlzLl9wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQ9bnVsbCl9bmdBZnRlckNvbnRlbnRJbml0KCl7dGhpcy5mb2N1c1RyYXAuYXR0YWNoQW5jaG9ycygpLHRoaXMuYXV0b0NhcHR1cmUmJnRoaXMuX2NhcHR1cmVGb2N1cygpfW5nRG9DaGVjaygpe3RoaXMuZm9jdXNUcmFwLmhhc0F0dGFjaGVkKCl8fHRoaXMuZm9jdXNUcmFwLmF0dGFjaEFuY2hvcnMoKX1uZ09uQ2hhbmdlcyh0KXtjb25zdCBlPXQuYXV0b0NhcHR1cmU7ZSYmIWUuZmlyc3RDaGFuZ2UmJnRoaXMuYXV0b0NhcHR1cmUmJnRoaXMuZm9jdXNUcmFwLmhhc0F0dGFjaGVkKCkmJnRoaXMuX2NhcHR1cmVGb2N1cygpfV9jYXB0dXJlRm9jdXMoKXt0aGlzLl9wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQ9RnooKSx0aGlzLmZvY3VzVHJhcC5mb2N1c0luaXRpYWxFbGVtZW50V2hlblJlYWR5KCl9fXNJLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxzSSkoU20oaGcpLFNtKHJJKSxTbShaXykpfSxzSS7JtWRpcj1sbyh7dHlwZTpzSSxzZWxlY3RvcnM6W1siIiwiY2RrVHJhcEZvY3VzIiwiIl1dLGlucHV0czp7ZW5hYmxlZDpbImNka1RyYXBGb2N1cyIsImVuYWJsZWQiXSxhdXRvQ2FwdHVyZTpbImNka1RyYXBGb2N1c0F1dG9DYXB0dXJlIiwiYXV0b0NhcHR1cmUiXX0sZXhwb3J0QXM6WyJjZGtUcmFwRm9jdXMiXSxmZWF0dXJlczpbQm9dfSksc0kuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ30se3R5cGU6ckl9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dLHNJLnByb3BEZWNvcmF0b3JzPXtlbmFibGVkOlt7dHlwZTp4eSxhcmdzOlsiY2RrVHJhcEZvY3VzIl19XSxhdXRvQ2FwdHVyZTpbe3R5cGU6eHksYXJnczpbImNka1RyYXBGb2N1c0F1dG9DYXB0dXJlIl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChzSSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbY2RrVHJhcEZvY3VzXSIsZXhwb3J0QXM6ImNka1RyYXBGb2N1cyJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6ckl9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSkse2VuYWJsZWQ6W3t0eXBlOnh5LGFyZ3M6WyJjZGtUcmFwRm9jdXMiXX1dLGF1dG9DYXB0dXJlOlt7dHlwZTp4eSxhcmdzOlsiY2RrVHJhcEZvY3VzQXV0b0NhcHR1cmUiXX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBsSSBleHRlbmRzIGFJe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIpe3N1cGVyKHQsZSxuLG8sci5kZWZlciksdGhpcy5fZm9jdXNUcmFwTWFuYWdlcj1pLHRoaXMuX2luZXJ0U3RyYXRlZ3k9YSx0aGlzLl9mb2N1c1RyYXBNYW5hZ2VyLnJlZ2lzdGVyKHRoaXMpfWdldCBlbmFibGVkKCl7cmV0dXJuIHRoaXMuX2VuYWJsZWR9c2V0IGVuYWJsZWQodCl7dGhpcy5fZW5hYmxlZD10LHRoaXMuX2VuYWJsZWQ/dGhpcy5fZm9jdXNUcmFwTWFuYWdlci5yZWdpc3Rlcih0aGlzKTp0aGlzLl9mb2N1c1RyYXBNYW5hZ2VyLmRlcmVnaXN0ZXIodGhpcyl9ZGVzdHJveSgpe3RoaXMuX2ZvY3VzVHJhcE1hbmFnZXIuZGVyZWdpc3Rlcih0aGlzKSxzdXBlci5kZXN0cm95KCl9X2VuYWJsZSgpe3RoaXMuX2luZXJ0U3RyYXRlZ3kucHJldmVudEZvY3VzKHRoaXMpLHRoaXMudG9nZ2xlQW5jaG9ycyghMCl9X2Rpc2FibGUoKXt0aGlzLl9pbmVydFN0cmF0ZWd5LmFsbG93Rm9jdXModGhpcyksdGhpcy50b2dnbGVBbmNob3JzKCExKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCBjST1uZXcgR2EoIkZPQ1VTX1RSQVBfSU5FUlRfU1RSQVRFR1kiKSxkST0idW5kZWZpbmVkIiE9dHlwZW9mIEVsZW1lbnQmJiEhRWxlbWVudC5wcm90b3R5cGUuY2xvc2VzdDsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gcEkodCxlKXtyZXR1cm4gdC5tYXRjaGVzP3QubWF0Y2hlcyhlKTp0Lm1zTWF0Y2hlc1NlbGVjdG9yKGUpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBtSXtjb25zdHJ1Y3Rvcigpe3RoaXMuX2xpc3RlbmVyPW51bGx9cHJldmVudEZvY3VzKHQpe3RoaXMuX2xpc3RlbmVyJiZ0Ll9kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fbGlzdGVuZXIsITApLHRoaXMuX2xpc3RlbmVyPWU9PnRoaXMuX3RyYXBGb2N1cyh0LGUpLHQuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9Pnt0Ll9kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fbGlzdGVuZXIsITApfSkpfWFsbG93Rm9jdXModCl7dGhpcy5fbGlzdGVuZXImJih0Ll9kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fbGlzdGVuZXIsITApLHRoaXMuX2xpc3RlbmVyPW51bGwpfV90cmFwRm9jdXModCxlKXtjb25zdCBuPWUudGFyZ2V0LG89dC5fZWxlbWVudDtvLmNvbnRhaW5zKG4pfHxudWxsIT09KGZ1bmN0aW9uIGkodCxlKXtpZighKHQgaW5zdGFuY2VvZiBOb2RlKSlyZXR1cm4gbnVsbDtsZXQgbj10O2Zvcig7bnVsbCE9biYmIShuIGluc3RhbmNlb2YgRWxlbWVudCk7KW49bi5wYXJlbnROb2RlO3JldHVybiBuJiYoZEk/bi5jbG9zZXN0KGUpOihmdW5jdGlvbiBvKHQsZSl7bGV0IG49dDtmb3IoO251bGwhPW4mJiEobiBpbnN0YW5jZW9mIEVsZW1lbnQmJnBJKG4sZSkpOyluPW4ucGFyZW50Tm9kZTtyZXR1cm4gbnx8bnVsbH0pKG4sZSkpfSkobiwiZGl2LmNkay1vdmVybGF5LXBhbmUiKXx8c2V0VGltZW91dCgoKCk9Pnt0LmVuYWJsZWQmJiFvLmNvbnRhaW5zKHQuX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQpJiZ0LmZvY3VzRmlyc3RUYWJiYWJsZUVsZW1lbnQoKX0pKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIHVJe2NvbnN0cnVjdG9yKCl7dGhpcy5fZm9jdXNUcmFwU3RhY2s9W119cmVnaXN0ZXIodCl7dGhpcy5fZm9jdXNUcmFwU3RhY2s9dGhpcy5fZm9jdXNUcmFwU3RhY2suZmlsdGVyKChlPT5lIT09dCkpO2xldCBlPXRoaXMuX2ZvY3VzVHJhcFN0YWNrO2UubGVuZ3RoJiZlW2UubGVuZ3RoLTFdLl9kaXNhYmxlKCksZS5wdXNoKHQpLHQuX2VuYWJsZSgpfWRlcmVnaXN0ZXIodCl7dC5fZGlzYWJsZSgpO2NvbnN0IGU9dGhpcy5fZm9jdXNUcmFwU3RhY2ssbj1lLmluZGV4T2YodCk7LTEhPT1uJiYoZS5zcGxpY2UobiwxKSxlLmxlbmd0aCYmZVtlLmxlbmd0aC0xXS5fZW5hYmxlKCkpfX11SS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8dUkpfSx1SS7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgdUl9LHRva2VuOnVJLHByb3ZpZGVkSW46InJvb3QifSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh1SSxbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5bXX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgZkl7Y29uc3RydWN0b3IodCxlLG4sbyxpKXt0aGlzLl9jaGVja2VyPXQsdGhpcy5fbmdab25lPWUsdGhpcy5fZm9jdXNUcmFwTWFuYWdlcj1uLHRoaXMuX2RvY3VtZW50PW8sdGhpcy5faW5lcnRTdHJhdGVneT1pfHxuZXcgbUl9Y3JlYXRlKHQsZT17ZGVmZXI6ITF9KXtsZXQgbjtyZXR1cm4gbj0iYm9vbGVhbiI9PXR5cGVvZiBlP3tkZWZlcjplfTplLG5ldyBsSSh0LHRoaXMuX2NoZWNrZXIsdGhpcy5fbmdab25lLHRoaXMuX2RvY3VtZW50LHRoaXMuX2ZvY3VzVHJhcE1hbmFnZXIsdGhpcy5faW5lcnRTdHJhdGVneSxuKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBnSSh0KXtyZXR1cm4gMD09PXQub2Zmc2V0WCYmMD09PXQub2Zmc2V0WX1mdW5jdGlvbiBoSSh0KXtjb25zdCBlPXQudG91Y2hlcyYmdC50b3VjaGVzWzBdfHx0LmNoYW5nZWRUb3VjaGVzJiZ0LmNoYW5nZWRUb3VjaGVzWzBdO3JldHVybiEoIWV8fC0xIT09ZS5pZGVudGlmaWVyfHxudWxsIT1lLnJhZGl1c1gmJjEhPT1lLnJhZGl1c1h8fG51bGwhPWUucmFkaXVzWSYmMSE9PWUucmFkaXVzWSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2ZJLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxmSSkodnIobkkpLHZyKGFfKSx2cih1SSksdnIoWl8pLHZyKGNJLDgpKX0sZkkuybVwcm92PU1uKHtmYWN0b3J5OmZ1bmN0aW9uIHQoKXtyZXR1cm4gbmV3IGZJKHZyKG5JKSx2cihhXyksdnIodUkpLHZyKFpfKSx2cihjSSw4KSl9LHRva2VuOmZJLHByb3ZpZGVkSW46InJvb3QifSksZkkuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpuSX0se3R5cGU6YV99LHt0eXBlOnVJfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbY0ldfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGZJLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpuSX0se3R5cGU6YV99LHt0eXBlOnVJfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbY0ldfV19XX0pLG51bGwpO2NvbnN0IGJJPW5ldyBHYSgiY2RrLWlucHV0LW1vZGFsaXR5LWRldGVjdG9yLW9wdGlvbnMiKSx5ST17aWdub3JlS2V5czpbMTgsMTcsMjI0LDkxLDE2XX0sX0k9Tnooe3Bhc3NpdmU6ITAsY2FwdHVyZTohMH0pO2NsYXNzIENJe2NvbnN0cnVjdG9yKHQsZSxuLG8pe3RoaXMuX3BsYXRmb3JtPXQsdGhpcy5fbW9zdFJlY2VudFRhcmdldD1udWxsLHRoaXMuX21vZGFsaXR5PW5ldyBGKG51bGwpLHRoaXMuX2xhc3RUb3VjaE1zPTAsdGhpcy5fb25LZXlkb3duPXQ9Pnt2YXIgZSxuOyhudWxsPT09KG49bnVsbD09PShlPXRoaXMuX29wdGlvbnMpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmlnbm9yZUtleXMpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLnNvbWUoKGU9PmU9PT10LmtleUNvZGUpKSl8fCh0aGlzLl9tb2RhbGl0eS5uZXh0KCJrZXlib2FyZCIpLHRoaXMuX21vc3RSZWNlbnRUYXJnZXQ9THoodCkpfSx0aGlzLl9vbk1vdXNlZG93bj10PT57RGF0ZS5ub3coKS10aGlzLl9sYXN0VG91Y2hNczw2NTB8fCh0aGlzLl9tb2RhbGl0eS5uZXh0KGdJKHQpPyJrZXlib2FyZCI6Im1vdXNlIiksdGhpcy5fbW9zdFJlY2VudFRhcmdldD1Meih0KSl9LHRoaXMuX29uVG91Y2hzdGFydD10PT57aEkodCk/dGhpcy5fbW9kYWxpdHkubmV4dCgia2V5Ym9hcmQiKToodGhpcy5fbGFzdFRvdWNoTXM9RGF0ZS5ub3coKSx0aGlzLl9tb2RhbGl0eS5uZXh0KCJ0b3VjaCIpLHRoaXMuX21vc3RSZWNlbnRUYXJnZXQ9THoodCkpfSx0aGlzLl9vcHRpb25zPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx5SSksbyksdGhpcy5tb2RhbGl0eURldGVjdGVkPXRoaXMuX21vZGFsaXR5LnBpcGUoVGUoMSkpLHRoaXMubW9kYWxpdHlDaGFuZ2VkPXRoaXMubW9kYWxpdHlEZXRlY3RlZC5waXBlKE1lKCkpLHQuaXNCcm93c2VyJiZlLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e24uYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5fb25LZXlkb3duLF9JKSxuLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5fb25Nb3VzZWRvd24sX0kpLG4uYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5fb25Ub3VjaHN0YXJ0LF9JKX0pKX1nZXQgbW9zdFJlY2VudE1vZGFsaXR5KCl7cmV0dXJuIHRoaXMuX21vZGFsaXR5LnZhbHVlfW5nT25EZXN0cm95KCl7dGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyJiYoZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5fb25LZXlkb3duLF9JKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuX29uTW91c2Vkb3duLF9JKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLl9vblRvdWNoc3RhcnQsX0kpKX19Q0kuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fENJKSh2cih3eiksdnIoYV8pLHZyKFpfKSx2cihiSSw4KSl9LENJLsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIG5ldyBDSSh2cih3eiksdnIoYV8pLHZyKFpfKSx2cihiSSw4KSl9LHRva2VuOkNJLHByb3ZpZGVkSW46InJvb3QifSksQ0kuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp3en0se3R5cGU6YV99LHt0eXBlOkRvY3VtZW50LGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W2JJXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChDSSxbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6d3p9LHt0eXBlOmFffSx7dHlwZTpEb2N1bWVudCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltiSV19XX1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBNST1uZXcgR2EoImxpdmVBbm5vdW5jZXJFbGVtZW50Iix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbiB2SSgpe3JldHVybiBudWxsfX0pLHhJPW5ldyBHYSgiTElWRV9BTk5PVU5DRVJfREVGQVVMVF9PUFRJT05TIik7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBPSXtjb25zdHJ1Y3Rvcih0LGUsbixvKXt0aGlzLl9uZ1pvbmU9ZSx0aGlzLl9kZWZhdWx0T3B0aW9ucz1vLHRoaXMuX2RvY3VtZW50PW4sdGhpcy5fbGl2ZUVsZW1lbnQ9dHx8dGhpcy5fY3JlYXRlTGl2ZUVsZW1lbnQoKX1hbm5vdW5jZSh0LC4uLmUpe2NvbnN0IG49dGhpcy5fZGVmYXVsdE9wdGlvbnM7bGV0IG8saTtyZXR1cm4gMT09PWUubGVuZ3RoJiYibnVtYmVyIj09dHlwZW9mIGVbMF0/aT1lWzBdOltvLGldPWUsdGhpcy5jbGVhcigpLGNsZWFyVGltZW91dCh0aGlzLl9wcmV2aW91c1RpbWVvdXQpLG98fChvPW4mJm4ucG9saXRlbmVzcz9uLnBvbGl0ZW5lc3M6InBvbGl0ZSIpLG51bGw9PWkmJm4mJihpPW4uZHVyYXRpb24pLHRoaXMuX2xpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1saXZlIixvKSx0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT5uZXcgUHJvbWlzZSgoZT0+e2NsZWFyVGltZW91dCh0aGlzLl9wcmV2aW91c1RpbWVvdXQpLHRoaXMuX3ByZXZpb3VzVGltZW91dD1zZXRUaW1lb3V0KCgoKT0+e3RoaXMuX2xpdmVFbGVtZW50LnRleHRDb250ZW50PXQsZSgpLCJudW1iZXIiPT10eXBlb2YgaSYmKHRoaXMuX3ByZXZpb3VzVGltZW91dD1zZXRUaW1lb3V0KCgoKT0+dGhpcy5jbGVhcigpKSxpKSl9KSwxMDApfSkpKSl9Y2xlYXIoKXt0aGlzLl9saXZlRWxlbWVudCYmKHRoaXMuX2xpdmVFbGVtZW50LnRleHRDb250ZW50PSIiKX1uZ09uRGVzdHJveSgpe2NsZWFyVGltZW91dCh0aGlzLl9wcmV2aW91c1RpbWVvdXQpLHRoaXMuX2xpdmVFbGVtZW50JiZ0aGlzLl9saXZlRWxlbWVudC5wYXJlbnROb2RlJiYodGhpcy5fbGl2ZUVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9saXZlRWxlbWVudCksdGhpcy5fbGl2ZUVsZW1lbnQ9bnVsbCl9X2NyZWF0ZUxpdmVFbGVtZW50KCl7Y29uc3QgdD0iY2RrLWxpdmUtYW5ub3VuY2VyLWVsZW1lbnQiLGU9dGhpcy5fZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh0KSxuPXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlW3RdKTtyZXR1cm4gbi5jbGFzc0xpc3QuYWRkKHQpLG4uY2xhc3NMaXN0LmFkZCgiY2RrLXZpc3VhbGx5LWhpZGRlbiIpLG4uc2V0QXR0cmlidXRlKCJhcmlhLWF0b21pYyIsInRydWUiKSxuLnNldEF0dHJpYnV0ZSgiYXJpYS1saXZlIiwicG9saXRlIiksdGhpcy5fZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChuKSxufX1PSS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8T0kpKHZyKE1JLDgpLHZyKGFfKSx2cihaXyksdnIoeEksOCkpfSxPSS7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgT0kodnIoTUksOCksdnIoYV8pLHZyKFpfKSx2cih4SSw4KSl9LHRva2VuOk9JLHByb3ZpZGVkSW46InJvb3QifSksT0kuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W01JXX1dfSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3hJXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChPSSxbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltNSV19XX0se3R5cGU6YV99LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOlt4SV19XX1dfSksbnVsbCk7Y2xhc3MgUEl7Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy5fZWxlbWVudFJlZj10LHRoaXMuX2xpdmVBbm5vdW5jZXI9ZSx0aGlzLl9jb250ZW50T2JzZXJ2ZXI9bix0aGlzLl9uZ1pvbmU9byx0aGlzLl9wb2xpdGVuZXNzPSJwb2xpdGUifWdldCBwb2xpdGVuZXNzKCl7cmV0dXJuIHRoaXMuX3BvbGl0ZW5lc3N9c2V0IHBvbGl0ZW5lc3ModCl7dGhpcy5fcG9saXRlbmVzcz0ib2ZmIj09PXR8fCJhc3NlcnRpdmUiPT09dD90OiJwb2xpdGUiLCJvZmYiPT09dGhpcy5fcG9saXRlbmVzcz90aGlzLl9zdWJzY3JpcHRpb24mJih0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl9zdWJzY3JpcHRpb249bnVsbCk6dGhpcy5fc3Vic2NyaXB0aW9ufHwodGhpcy5fc3Vic2NyaXB0aW9uPXRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PnRoaXMuX2NvbnRlbnRPYnNlcnZlci5vYnNlcnZlKHRoaXMuX2VsZW1lbnRSZWYpLnN1YnNjcmliZSgoKCk9Pntjb25zdCB0PXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC50ZXh0Q29udGVudDt0IT09dGhpcy5fcHJldmlvdXNBbm5vdW5jZWRUZXh0JiYodGhpcy5fbGl2ZUFubm91bmNlci5hbm5vdW5jZSh0LHRoaXMuX3BvbGl0ZW5lc3MpLHRoaXMuX3ByZXZpb3VzQW5ub3VuY2VkVGV4dD10KX0pKSkpKX1uZ09uRGVzdHJveSgpe3RoaXMuX3N1YnNjcmlwdGlvbiYmdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCl9fVBJLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxQSSkoU20oaGcpLFNtKE9JKSxTbShWeiksU20oYV8pKX0sUEkuybVkaXI9bG8oe3R5cGU6UEksc2VsZWN0b3JzOltbIiIsImNka0FyaWFMaXZlIiwiIl1dLGlucHV0czp7cG9saXRlbmVzczpbImNka0FyaWFMaXZlIiwicG9saXRlbmVzcyJdfSxleHBvcnRBczpbImNka0FyaWFMaXZlIl19KSxQSS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpPSX0se3R5cGU6Vnp9LHt0eXBlOmFffV0sUEkucHJvcERlY29yYXRvcnM9e3BvbGl0ZW5lc3M6W3t0eXBlOnh5LGFyZ3M6WyJjZGtBcmlhTGl2ZSJdfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUEksW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Nka0FyaWFMaXZlXSIsZXhwb3J0QXM6ImNka0FyaWFMaXZlIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTpPSX0se3R5cGU6Vnp9LHt0eXBlOmFffV19KSx7cG9saXRlbmVzczpbe3R5cGU6eHksYXJnczpbImNka0FyaWFMaXZlIl19XX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3Qgd0k9bmV3IEdhKCJjZGstZm9jdXMtbW9uaXRvci1kZWZhdWx0LW9wdGlvbnMiKSxrST1Oeih7cGFzc2l2ZTohMCxjYXB0dXJlOiEwfSk7Y2xhc3MgU0l7Y29uc3RydWN0b3IodCxlLG4sbyxpKXt0aGlzLl9uZ1pvbmU9dCx0aGlzLl9wbGF0Zm9ybT1lLHRoaXMuX2lucHV0TW9kYWxpdHlEZXRlY3Rvcj1uLHRoaXMuX29yaWdpbj1udWxsLHRoaXMuX3dpbmRvd0ZvY3VzZWQ9ITEsdGhpcy5fb3JpZ2luRnJvbVRvdWNoSW50ZXJhY3Rpb249ITEsdGhpcy5fZWxlbWVudEluZm89bmV3IE1hcCx0aGlzLl9tb25pdG9yZWRFbGVtZW50Q291bnQ9MCx0aGlzLl9yb290Tm9kZUZvY3VzTGlzdGVuZXJDb3VudD1uZXcgTWFwLHRoaXMuX3dpbmRvd0ZvY3VzTGlzdGVuZXI9KCk9Pnt0aGlzLl93aW5kb3dGb2N1c2VkPSEwLHRoaXMuX3dpbmRvd0ZvY3VzVGltZW91dElkPXNldFRpbWVvdXQoKCgpPT50aGlzLl93aW5kb3dGb2N1c2VkPSExKSl9LHRoaXMuX3N0b3BJbnB1dE1vZGFsaXR5RGV0ZWN0b3I9bmV3IEksdGhpcy5fcm9vdE5vZGVGb2N1c0FuZEJsdXJMaXN0ZW5lcj10PT57Y29uc3QgZT1Meih0KSxuPSJmb2N1cyI9PT10LnR5cGU/dGhpcy5fb25Gb2N1czp0aGlzLl9vbkJsdXI7Zm9yKGxldCBvPWU7bztvPW8ucGFyZW50RWxlbWVudCluLmNhbGwodGhpcyx0LG8pfSx0aGlzLl9kb2N1bWVudD1vLHRoaXMuX2RldGVjdGlvbk1vZGU9KG51bGw9PWk/dm9pZCAwOmkuZGV0ZWN0aW9uTW9kZSl8fDB9bW9uaXRvcih0LGU9ITEpe2NvbnN0IG49eHoodCk7aWYoIXRoaXMuX3BsYXRmb3JtLmlzQnJvd3Nlcnx8MSE9PW4ubm9kZVR5cGUpcmV0dXJuIEV0KG51bGwpO2NvbnN0IG89SHoobil8fHRoaXMuX2dldERvY3VtZW50KCksaT10aGlzLl9lbGVtZW50SW5mby5nZXQobik7aWYoaSlyZXR1cm4gZSYmKGkuY2hlY2tDaGlsZHJlbj0hMCksaS5zdWJqZWN0O2NvbnN0IGE9e2NoZWNrQ2hpbGRyZW46ZSxzdWJqZWN0Om5ldyBJLHJvb3ROb2RlOm99O3JldHVybiB0aGlzLl9lbGVtZW50SW5mby5zZXQobixhKSx0aGlzLl9yZWdpc3Rlckdsb2JhbExpc3RlbmVycyhhKSxhLnN1YmplY3R9c3RvcE1vbml0b3JpbmcodCl7Y29uc3QgZT14eih0KSxuPXRoaXMuX2VsZW1lbnRJbmZvLmdldChlKTtuJiYobi5zdWJqZWN0LmNvbXBsZXRlKCksdGhpcy5fc2V0Q2xhc3NlcyhlKSx0aGlzLl9lbGVtZW50SW5mby5kZWxldGUoZSksdGhpcy5fcmVtb3ZlR2xvYmFsTGlzdGVuZXJzKG4pKX1mb2N1c1ZpYSh0LGUsbil7Y29uc3Qgbz14eih0KTtvPT09dGhpcy5fZ2V0RG9jdW1lbnQoKS5hY3RpdmVFbGVtZW50P3RoaXMuX2dldENsb3Nlc3RFbGVtZW50c0luZm8obykuZm9yRWFjaCgoKFt0LG5dKT0+dGhpcy5fb3JpZ2luQ2hhbmdlZCh0LGUsbikpKToodGhpcy5fc2V0T3JpZ2luKGUpLCJmdW5jdGlvbiI9PXR5cGVvZiBvLmZvY3VzJiZvLmZvY3VzKG4pKX1uZ09uRGVzdHJveSgpe3RoaXMuX2VsZW1lbnRJbmZvLmZvckVhY2goKCh0LGUpPT50aGlzLnN0b3BNb25pdG9yaW5nKGUpKSl9X2dldERvY3VtZW50KCl7cmV0dXJuIHRoaXMuX2RvY3VtZW50fHxkb2N1bWVudH1fZ2V0V2luZG93KCl7cmV0dXJuIHRoaXMuX2dldERvY3VtZW50KCkuZGVmYXVsdFZpZXd8fHdpbmRvd31fdG9nZ2xlQ2xhc3ModCxlLG4pe24/dC5jbGFzc0xpc3QuYWRkKGUpOnQuY2xhc3NMaXN0LnJlbW92ZShlKX1fZ2V0Rm9jdXNPcmlnaW4odCl7cmV0dXJuIHRoaXMuX29yaWdpbj90aGlzLl9vcmlnaW5Gcm9tVG91Y2hJbnRlcmFjdGlvbj90aGlzLl9zaG91bGRCZUF0dHJpYnV0ZWRUb1RvdWNoKHQpPyJ0b3VjaCI6InByb2dyYW0iOnRoaXMuX29yaWdpbjp0aGlzLl93aW5kb3dGb2N1c2VkJiZ0aGlzLl9sYXN0Rm9jdXNPcmlnaW4/dGhpcy5fbGFzdEZvY3VzT3JpZ2luOiJwcm9ncmFtIn1fc2hvdWxkQmVBdHRyaWJ1dGVkVG9Ub3VjaCh0KXtyZXR1cm4gMT09PXRoaXMuX2RldGVjdGlvbk1vZGV8fCEhKG51bGw9PXQ/dm9pZCAwOnQuY29udGFpbnModGhpcy5faW5wdXRNb2RhbGl0eURldGVjdG9yLl9tb3N0UmVjZW50VGFyZ2V0KSl9X3NldENsYXNzZXModCxlKXt0aGlzLl90b2dnbGVDbGFzcyh0LCJjZGstZm9jdXNlZCIsISFlKSx0aGlzLl90b2dnbGVDbGFzcyh0LCJjZGstdG91Y2gtZm9jdXNlZCIsInRvdWNoIj09PWUpLHRoaXMuX3RvZ2dsZUNsYXNzKHQsImNkay1rZXlib2FyZC1mb2N1c2VkIiwia2V5Ym9hcmQiPT09ZSksdGhpcy5fdG9nZ2xlQ2xhc3ModCwiY2RrLW1vdXNlLWZvY3VzZWQiLCJtb3VzZSI9PT1lKSx0aGlzLl90b2dnbGVDbGFzcyh0LCJjZGstcHJvZ3JhbS1mb2N1c2VkIiwicHJvZ3JhbSI9PT1lKX1fc2V0T3JpZ2luKHQsZT0hMSl7dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e3RoaXMuX29yaWdpbj10LHRoaXMuX29yaWdpbkZyb21Ub3VjaEludGVyYWN0aW9uPSJ0b3VjaCI9PT10JiZlLDA9PT10aGlzLl9kZXRlY3Rpb25Nb2RlJiYoY2xlYXJUaW1lb3V0KHRoaXMuX29yaWdpblRpbWVvdXRJZCksdGhpcy5fb3JpZ2luVGltZW91dElkPXNldFRpbWVvdXQoKCgpPT50aGlzLl9vcmlnaW49bnVsbCksdGhpcy5fb3JpZ2luRnJvbVRvdWNoSW50ZXJhY3Rpb24/NjUwOjEpKX0pKX1fb25Gb2N1cyh0LGUpe2NvbnN0IG49dGhpcy5fZWxlbWVudEluZm8uZ2V0KGUpLG89THoodCk7biYmKG4uY2hlY2tDaGlsZHJlbnx8ZT09PW8pJiZ0aGlzLl9vcmlnaW5DaGFuZ2VkKGUsdGhpcy5fZ2V0Rm9jdXNPcmlnaW4obyksbil9X29uQmx1cih0LGUpe2NvbnN0IG49dGhpcy5fZWxlbWVudEluZm8uZ2V0KGUpOyFufHxuLmNoZWNrQ2hpbGRyZW4mJnQucmVsYXRlZFRhcmdldCBpbnN0YW5jZW9mIE5vZGUmJmUuY29udGFpbnModC5yZWxhdGVkVGFyZ2V0KXx8KHRoaXMuX3NldENsYXNzZXMoZSksdGhpcy5fZW1pdE9yaWdpbihuLnN1YmplY3QsbnVsbCkpfV9lbWl0T3JpZ2luKHQsZSl7dGhpcy5fbmdab25lLnJ1bigoKCk9PnQubmV4dChlKSkpfV9yZWdpc3Rlckdsb2JhbExpc3RlbmVycyh0KXtpZighdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKXJldHVybjtjb25zdCBlPXQucm9vdE5vZGUsbj10aGlzLl9yb290Tm9kZUZvY3VzTGlzdGVuZXJDb3VudC5nZXQoZSl8fDA7bnx8dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e2UuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX3Jvb3ROb2RlRm9jdXNBbmRCbHVyTGlzdGVuZXIsa0kpLGUuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsdGhpcy5fcm9vdE5vZGVGb2N1c0FuZEJsdXJMaXN0ZW5lcixrSSl9KSksdGhpcy5fcm9vdE5vZGVGb2N1c0xpc3RlbmVyQ291bnQuc2V0KGUsbisxKSwxPT0rK3RoaXMuX21vbml0b3JlZEVsZW1lbnRDb3VudCYmKHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9Pnt0aGlzLl9nZXRXaW5kb3coKS5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fd2luZG93Rm9jdXNMaXN0ZW5lcil9KSksdGhpcy5faW5wdXRNb2RhbGl0eURldGVjdG9yLm1vZGFsaXR5RGV0ZWN0ZWQucGlwZShJZSh0aGlzLl9zdG9wSW5wdXRNb2RhbGl0eURldGVjdG9yKSkuc3Vic2NyaWJlKCh0PT57dGhpcy5fc2V0T3JpZ2luKHQsITApfSkpKX1fcmVtb3ZlR2xvYmFsTGlzdGVuZXJzKHQpe2NvbnN0IGU9dC5yb290Tm9kZTtpZih0aGlzLl9yb290Tm9kZUZvY3VzTGlzdGVuZXJDb3VudC5oYXMoZSkpe2NvbnN0IHQ9dGhpcy5fcm9vdE5vZGVGb2N1c0xpc3RlbmVyQ291bnQuZ2V0KGUpO3Q+MT90aGlzLl9yb290Tm9kZUZvY3VzTGlzdGVuZXJDb3VudC5zZXQoZSx0LTEpOihlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9yb290Tm9kZUZvY3VzQW5kQmx1ckxpc3RlbmVyLGtJKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImJsdXIiLHRoaXMuX3Jvb3ROb2RlRm9jdXNBbmRCbHVyTGlzdGVuZXIsa0kpLHRoaXMuX3Jvb3ROb2RlRm9jdXNMaXN0ZW5lckNvdW50LmRlbGV0ZShlKSl9LS10aGlzLl9tb25pdG9yZWRFbGVtZW50Q291bnR8fCh0aGlzLl9nZXRXaW5kb3coKS5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fd2luZG93Rm9jdXNMaXN0ZW5lciksdGhpcy5fc3RvcElucHV0TW9kYWxpdHlEZXRlY3Rvci5uZXh0KCksY2xlYXJUaW1lb3V0KHRoaXMuX3dpbmRvd0ZvY3VzVGltZW91dElkKSxjbGVhclRpbWVvdXQodGhpcy5fb3JpZ2luVGltZW91dElkKSl9X29yaWdpbkNoYW5nZWQodCxlLG4pe3RoaXMuX3NldENsYXNzZXModCxlKSx0aGlzLl9lbWl0T3JpZ2luKG4uc3ViamVjdCxlKSx0aGlzLl9sYXN0Rm9jdXNPcmlnaW49ZX1fZ2V0Q2xvc2VzdEVsZW1lbnRzSW5mbyh0KXtjb25zdCBlPVtdO3JldHVybiB0aGlzLl9lbGVtZW50SW5mby5mb3JFYWNoKCgobixvKT0+eyhvPT09dHx8bi5jaGVja0NoaWxkcmVuJiZvLmNvbnRhaW5zKHQpKSYmZS5wdXNoKFtvLG5dKX0pKSxlfX1TSS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8U0kpKHZyKGFfKSx2cih3eiksdnIoQ0kpLHZyKFpfLDgpLHZyKHdJLDgpKX0sU0kuybVwcm92PU1uKHtmYWN0b3J5OmZ1bmN0aW9uIHQoKXtyZXR1cm4gbmV3IFNJKHZyKGFfKSx2cih3eiksdnIoQ0kpLHZyKFpfLDgpLHZyKHdJLDgpKX0sdG9rZW46U0kscHJvdmlkZWRJbjoicm9vdCJ9KSxTSS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmFffSx7dHlwZTp3en0se3R5cGU6Q0l9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbd0ldfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFNJLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTphX30se3R5cGU6d3p9LHt0eXBlOkNJfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3dJXX1dfV19KSxudWxsKTtjbGFzcyBESXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX2VsZW1lbnRSZWY9dCx0aGlzLl9mb2N1c01vbml0b3I9ZSx0aGlzLmNka0ZvY3VzQ2hhbmdlPW5ldyBMaH1uZ0FmdGVyVmlld0luaXQoKXtjb25zdCB0PXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDt0aGlzLl9tb25pdG9yU3Vic2NyaXB0aW9uPXRoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHQsMT09PXQubm9kZVR5cGUmJnQuaGFzQXR0cmlidXRlKCJjZGtNb25pdG9yU3VidHJlZUZvY3VzIikpLnN1YnNjcmliZSgodD0+dGhpcy5jZGtGb2N1c0NoYW5nZS5lbWl0KHQpKSl9bmdPbkRlc3Ryb3koKXt0aGlzLl9mb2N1c01vbml0b3Iuc3RvcE1vbml0b3JpbmcodGhpcy5fZWxlbWVudFJlZiksdGhpcy5fbW9uaXRvclN1YnNjcmlwdGlvbiYmdGhpcy5fbW9uaXRvclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpfX1ESS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8REkpKFNtKGhnKSxTbShTSSkpfSxESS7JtWRpcj1sbyh7dHlwZTpESSxzZWxlY3RvcnM6W1siIiwiY2RrTW9uaXRvckVsZW1lbnRGb2N1cyIsIiJdLFsiIiwiY2RrTW9uaXRvclN1YnRyZWVGb2N1cyIsIiJdXSxvdXRwdXRzOntjZGtGb2N1c0NoYW5nZToiY2RrRm9jdXNDaGFuZ2UifX0pLERJLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOlNJfV0sREkucHJvcERlY29yYXRvcnM9e2Nka0ZvY3VzQ2hhbmdlOlt7dHlwZTpPeX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKERJLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IltjZGtNb25pdG9yRWxlbWVudEZvY3VzXSwgW2Nka01vbml0b3JTdWJ0cmVlRm9jdXNdIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTpTSX1dfSkse2Nka0ZvY3VzQ2hhbmdlOlt7dHlwZTpPeX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBFST0iY2RrLWhpZ2gtY29udHJhc3QtYmxhY2stb24td2hpdGUiLFJJPSJjZGstaGlnaC1jb250cmFzdC13aGl0ZS1vbi1ibGFjayIsQUk9ImNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSI7Y2xhc3MgVEl7Y29uc3RydWN0b3IodCxlKXt0aGlzLl9wbGF0Zm9ybT10LHRoaXMuX2RvY3VtZW50PWV9Z2V0SGlnaENvbnRyYXN0TW9kZSgpe2lmKCF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpcmV0dXJuIDA7Y29uc3QgdD10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LnN0eWxlLmJhY2tncm91bmRDb2xvcj0icmdiKDEsMiwzKSIsdC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodCk7Y29uc3QgZT10aGlzLl9kb2N1bWVudC5kZWZhdWx0Vmlld3x8d2luZG93LG49ZSYmZS5nZXRDb21wdXRlZFN0eWxlP2UuZ2V0Q29tcHV0ZWRTdHlsZSh0KTpudWxsLG89KG4mJm4uYmFja2dyb3VuZENvbG9yfHwiIikucmVwbGFjZSgvIC9nLCIiKTtzd2l0Y2godGhpcy5fZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0KSxvKXtjYXNlInJnYigwLDAsMCkiOnJldHVybiAyO2Nhc2UicmdiKDI1NSwyNTUsMjU1KSI6cmV0dXJuIDF9cmV0dXJuIDB9X2FwcGx5Qm9keUhpZ2hDb250cmFzdE1vZGVDc3NDbGFzc2VzKCl7aWYoIXRoaXMuX2hhc0NoZWNrZWRIaWdoQ29udHJhc3RNb2RlJiZ0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXImJnRoaXMuX2RvY3VtZW50LmJvZHkpe2NvbnN0IHQ9dGhpcy5fZG9jdW1lbnQuYm9keS5jbGFzc0xpc3Q7dC5yZW1vdmUoQUkpLHQucmVtb3ZlKEVJKSx0LnJlbW92ZShSSSksdGhpcy5faGFzQ2hlY2tlZEhpZ2hDb250cmFzdE1vZGU9ITA7Y29uc3QgZT10aGlzLmdldEhpZ2hDb250cmFzdE1vZGUoKTsxPT09ZT8odC5hZGQoQUkpLHQuYWRkKEVJKSk6Mj09PWUmJih0LmFkZChBSSksdC5hZGQoUkkpKX19fVRJLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxUSSkodnIod3opLHZyKFpfKSl9LFRJLsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIG5ldyBUSSh2cih3eiksdnIoWl8pKX0sdG9rZW46VEkscHJvdmlkZWRJbjoicm9vdCJ9KSxUSS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnd6fSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFRJLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp3en0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIE5Je2NvbnN0cnVjdG9yKHQpe3QuX2FwcGx5Qm9keUhpZ2hDb250cmFzdE1vZGVDc3NDbGFzc2VzKCl9fU5JLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxOSSkodnIoVEkpKX0sTkkuybVtb2Q9YW8oe3R5cGU6Tkl9KSxOSS7JtWluaj12bih7aW1wb3J0czpbW2t6LFV6XV19KSxOSS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlRJfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChOSSxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W2t6LFV6XSxkZWNsYXJhdGlvbnM6W1BJLHNJLERJXSxleHBvcnRzOltQSSxzSSxESV19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpUSX1dfSksbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhOSSx7ZGVjbGFyYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuW1BJLHNJLERJXX0saW1wb3J0czpmdW5jdGlvbigpe3JldHVybltreixVel19LGV4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bUEksc0ksREldfX0pO2NvbnN0IHpJPW5ldyBHYSgiY2RrLWRpci1kb2MiLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OmZ1bmN0aW9uIElJKCl7cmV0dXJuIE9yKFpfKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovfSk7Y2xhc3MgSEl7Y29uc3RydWN0b3IodCl7aWYodGhpcy52YWx1ZT0ibHRyIix0aGlzLmNoYW5nZT1uZXcgTGgsdCl7Y29uc3QgZT10LmRvY3VtZW50RWxlbWVudD90LmRvY3VtZW50RWxlbWVudC5kaXI6bnVsbCxuPSh0LmJvZHk/dC5ib2R5LmRpcjpudWxsKXx8ZTt0aGlzLnZhbHVlPSJsdHIiPT09bnx8InJ0bCI9PT1uP246Imx0ciJ9fW5nT25EZXN0cm95KCl7dGhpcy5jaGFuZ2UuY29tcGxldGUoKX19SEkuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEhJKSh2cih6SSw4KSl9LEhJLsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIG5ldyBISSh2cih6SSw4KSl9LHRva2VuOkhJLHByb3ZpZGVkSW46InJvb3QifSksSEkuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3pJXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChISSxbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOlt6SV19XX1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBGSXtjb25zdHJ1Y3Rvcigpe3RoaXMuX2Rpcj0ibHRyIix0aGlzLl9pc0luaXRpYWxpemVkPSExLHRoaXMuY2hhbmdlPW5ldyBMaH1nZXQgZGlyKCl7cmV0dXJuIHRoaXMuX2Rpcn1zZXQgZGlyKHQpe2NvbnN0IGU9dGhpcy5fZGlyLG49dD90LnRvTG93ZXJDYXNlKCk6dDt0aGlzLl9yYXdEaXI9dCx0aGlzLl9kaXI9Imx0ciI9PT1ufHwicnRsIj09PW4/bjoibHRyIixlIT09dGhpcy5fZGlyJiZ0aGlzLl9pc0luaXRpYWxpemVkJiZ0aGlzLmNoYW5nZS5lbWl0KHRoaXMuX2Rpcil9Z2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMuZGlyfW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX2lzSW5pdGlhbGl6ZWQ9ITB9bmdPbkRlc3Ryb3koKXt0aGlzLmNoYW5nZS5jb21wbGV0ZSgpfX1GSS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8RkkpfSxGSS7JtWRpcj1sbyh7dHlwZTpGSSxzZWxlY3RvcnM6W1siIiwiZGlyIiwiIl1dLGhvc3RWYXJzOjEsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJmpwKCJkaXIiLG4uX3Jhd0Rpcil9LGlucHV0czp7ZGlyOiJkaXIifSxvdXRwdXRzOntjaGFuZ2U6ImRpckNoYW5nZSJ9LGV4cG9ydEFzOlsiZGlyIl0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTpISSx1c2VFeGlzdGluZzpGSX1dKV19KSxGSS5wcm9wRGVjb3JhdG9ycz17Y2hhbmdlOlt7dHlwZTpPeSxhcmdzOlsiZGlyQ2hhbmdlIl19XSxkaXI6W3t0eXBlOnh5fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRkksW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Rpcl0iLHByb3ZpZGVyczpbe3Byb3ZpZGU6SEksdXNlRXhpc3Rpbmc6Rkl9XSxob3N0OnsiW2F0dHIuZGlyXSI6Il9yYXdEaXIifSxleHBvcnRBczoiZGlyIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW119KSx7Y2hhbmdlOlt7dHlwZTpPeSxhcmdzOlsiZGlyQ2hhbmdlIl19XSxkaXI6W3t0eXBlOnh5fV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIExJe31MSS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8TEkpfSxMSS7JtW1vZD1hbyh7dHlwZTpMSX0pLExJLsm1aW5qPXZuKHt9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKExJLFt7dHlwZTpBeSxhcmdzOlt7ZXhwb3J0czpbRkldLGRlY2xhcmF0aW9uczpbRkldfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oTEkse2RlY2xhcmF0aW9uczpbRkldLGV4cG9ydHM6W0ZJXX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgQkk9bmV3IE9nKCIxMi4yLjEiKSxWST1bIioiLFtbIm1hdC1vcHRpb24iXSxbIm5nLWNvbnRhaW5lciJdXV07ZnVuY3Rpb24gakkodCxlKXtpZigxJnQmJlRtKDAsIm1hdC1wc2V1ZG8tY2hlY2tib3giLDQpLDImdCl7Y29uc3QgdD1ZbSgpO0RtKCJzdGF0ZSIsdC5zZWxlY3RlZD8iY2hlY2tlZCI6InVuY2hlY2tlZCIpKCJkaXNhYmxlZCIsdC5kaXNhYmxlZCl9fWZ1bmN0aW9uIFVJKHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIsNSksa3UoMSksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoMSksRHUoIigiLHQuZ3JvdXAubGFiZWwsIikiKX19bmV3IE9nKCIxMi4yLjMiKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIEdJe31HSS5TVEFOREFSRF9DVVJWRT0iY3ViaWMtYmV6aWVyKDAuNCwwLjAsMC4yLDEpIixHSS5ERUNFTEVSQVRJT05fQ1VSVkU9ImN1YmljLWJlemllcigwLjAsMC4wLDAuMiwxKSIsR0kuQUNDRUxFUkFUSU9OX0NVUlZFPSJjdWJpYy1iZXppZXIoMC40LDAuMCwxLDEpIixHSS5TSEFSUF9DVVJWRT0iY3ViaWMtYmV6aWVyKDAuNCwwLjAsMC42LDEpIjtjbGFzcyBXSXt9V0kuQ09NUExFWD0iMzc1bXMiLFdJLkVOVEVSSU5HPSIyMjVtcyIsV0kuRVhJVElORz0iMTk1bXMiOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgWUk9bmV3IE9nKCIxMi4yLjMiKSxxST1uZXcgR2EoIm1hdC1zYW5pdHktY2hlY2tzIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbiBaSSgpe3JldHVybiEwfX0pO2NsYXNzIFhJe2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLl9oYXNEb25lR2xvYmFsQ2hlY2tzPSExLHRoaXMuX2RvY3VtZW50PW4sdC5fYXBwbHlCb2R5SGlnaENvbnRyYXN0TW9kZUNzc0NsYXNzZXMoKSx0aGlzLl9zYW5pdHlDaGVja3M9ZSx0aGlzLl9oYXNEb25lR2xvYmFsQ2hlY2tzfHwodGhpcy5fY2hlY2tEb2N0eXBlSXNEZWZpbmVkKCksdGhpcy5fY2hlY2tUaGVtZUlzUHJlc2VudCgpLHRoaXMuX2NoZWNrQ2RrVmVyc2lvbk1hdGNoKCksdGhpcy5faGFzRG9uZUdsb2JhbENoZWNrcz0hMCl9X2dldFdpbmRvdygpe2NvbnN0IHQ9dGhpcy5fZG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdztyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJnQ/dDpudWxsfV9jaGVja0lzRW5hYmxlZCh0KXtyZXR1cm4hKCF5XygpfHx0aGlzLl9pc1Rlc3RFbnYoKSkmJigiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLl9zYW5pdHlDaGVja3M/dGhpcy5fc2FuaXR5Q2hlY2tzOiEhdGhpcy5fc2FuaXR5Q2hlY2tzW3RdKX1faXNUZXN0RW52KCl7Y29uc3QgdD10aGlzLl9nZXRXaW5kb3coKTtyZXR1cm4gdCYmKHQuX19rYXJtYV9ffHx0Lmphc21pbmUpfV9jaGVja0RvY3R5cGVJc0RlZmluZWQoKXt0aGlzLl9jaGVja0lzRW5hYmxlZCgiZG9jdHlwZSIpJiYhdGhpcy5fZG9jdW1lbnQuZG9jdHlwZSYmY29uc29sZS53YXJuKCJDdXJyZW50IGRvY3VtZW50IGRvZXMgbm90IGhhdmUgYSBkb2N0eXBlLiBUaGlzIG1heSBjYXVzZSBzb21lIEFuZ3VsYXIgTWF0ZXJpYWwgY29tcG9uZW50cyBub3QgdG8gYmVoYXZlIGFzIGV4cGVjdGVkLiIpfV9jaGVja1RoZW1lSXNQcmVzZW50KCl7aWYoIXRoaXMuX2NoZWNrSXNFbmFibGVkKCJ0aGVtZSIpfHwhdGhpcy5fZG9jdW1lbnQuYm9keXx8ImZ1bmN0aW9uIiE9dHlwZW9mIGdldENvbXB1dGVkU3R5bGUpcmV0dXJuO2NvbnN0IHQ9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5jbGFzc0xpc3QuYWRkKCJtYXQtdGhlbWUtbG9hZGVkLW1hcmtlciIpLHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodCk7Y29uc3QgZT1nZXRDb21wdXRlZFN0eWxlKHQpO2UmJiJub25lIiE9PWUuZGlzcGxheSYmY29uc29sZS53YXJuKCJDb3VsZCBub3QgZmluZCBBbmd1bGFyIE1hdGVyaWFsIGNvcmUgdGhlbWUuIE1vc3QgTWF0ZXJpYWwgY29tcG9uZW50cyBtYXkgbm90IHdvcmsgYXMgZXhwZWN0ZWQuIEZvciBtb3JlIGluZm8gcmVmZXIgdG8gdGhlIHRoZW1pbmcgZ3VpZGU6IGh0dHBzOi8vbWF0ZXJpYWwuYW5ndWxhci5pby9ndWlkZS90aGVtaW5nIiksdGhpcy5fZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0KX1fY2hlY2tDZGtWZXJzaW9uTWF0Y2goKXt0aGlzLl9jaGVja0lzRW5hYmxlZCgidmVyc2lvbiIpJiZZSS5mdWxsIT09QkkuZnVsbCYmY29uc29sZS53YXJuKCJUaGUgQW5ndWxhciBNYXRlcmlhbCB2ZXJzaW9uICgiK1lJLmZ1bGwrIikgZG9lcyBub3QgbWF0Y2ggdGhlIEFuZ3VsYXIgQ0RLIHZlcnNpb24gKCIrQkkuZnVsbCsiKS5cblBsZWFzZSBlbnN1cmUgdGhlIHZlcnNpb25zIG9mIHRoZXNlIHR3byBwYWNrYWdlcyBleGFjdGx5IG1hdGNoLiIpfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmZ1bmN0aW9uIEtJKHQpe3JldHVybiBjbGFzcyBleHRlbmRzIHR7Y29uc3RydWN0b3IoLi4udCl7c3VwZXIoLi4udCksdGhpcy5fZGlzYWJsZWQ9ITF9Z2V0IGRpc2FibGVkKCl7cmV0dXJuIHRoaXMuX2Rpc2FibGVkfXNldCBkaXNhYmxlZCh0KXt0aGlzLl9kaXNhYmxlZD15eih0KX19fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBKSSh0LGUpe3JldHVybiBjbGFzcyBleHRlbmRzIHR7Y29uc3RydWN0b3IoLi4udCl7c3VwZXIoLi4udCksdGhpcy5kZWZhdWx0Q29sb3I9ZSx0aGlzLmNvbG9yPWV9Z2V0IGNvbG9yKCl7cmV0dXJuIHRoaXMuX2NvbG9yfXNldCBjb2xvcih0KXtjb25zdCBlPXR8fHRoaXMuZGVmYXVsdENvbG9yO2UhPT10aGlzLl9jb2xvciYmKHRoaXMuX2NvbG9yJiZ0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShgbWF0LSR7dGhpcy5fY29sb3J9YCksZSYmdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoYG1hdC0ke2V9YCksdGhpcy5fY29sb3I9ZSl9fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gUUkodCl7cmV0dXJuIGNsYXNzIGV4dGVuZHMgdHtjb25zdHJ1Y3RvciguLi50KXtzdXBlciguLi50KSx0aGlzLl9kaXNhYmxlUmlwcGxlPSExfWdldCBkaXNhYmxlUmlwcGxlKCl7cmV0dXJuIHRoaXMuX2Rpc2FibGVSaXBwbGV9c2V0IGRpc2FibGVSaXBwbGUodCl7dGhpcy5fZGlzYWJsZVJpcHBsZT15eih0KX19fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiAkSSh0LGU9MCl7cmV0dXJuIGNsYXNzIGV4dGVuZHMgdHtjb25zdHJ1Y3RvciguLi50KXtzdXBlciguLi50KSx0aGlzLl90YWJJbmRleD1lLHRoaXMuZGVmYXVsdFRhYkluZGV4PWV9Z2V0IHRhYkluZGV4KCl7cmV0dXJuIHRoaXMuZGlzYWJsZWQ/LTE6dGhpcy5fdGFiSW5kZXh9c2V0IHRhYkluZGV4KHQpe3RoaXMuX3RhYkluZGV4PW51bGwhPXQ/X3oodCk6dGhpcy5kZWZhdWx0VGFiSW5kZXh9fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gdEgodCl7cmV0dXJuIGNsYXNzIGV4dGVuZHMgdHtjb25zdHJ1Y3RvciguLi50KXtzdXBlciguLi50KSx0aGlzLnN0YXRlQ2hhbmdlcz1uZXcgSSx0aGlzLmVycm9yU3RhdGU9ITF9dXBkYXRlRXJyb3JTdGF0ZSgpe2NvbnN0IHQ9dGhpcy5lcnJvclN0YXRlLGU9KHRoaXMuZXJyb3JTdGF0ZU1hdGNoZXJ8fHRoaXMuX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlcikuaXNFcnJvclN0YXRlKHRoaXMubmdDb250cm9sP3RoaXMubmdDb250cm9sLmNvbnRyb2w6bnVsbCx0aGlzLl9wYXJlbnRGb3JtR3JvdXB8fHRoaXMuX3BhcmVudEZvcm0pO2UhPT10JiYodGhpcy5lcnJvclN0YXRlPWUsdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpKX19fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBlSCh0KXtyZXR1cm4gY2xhc3MgZXh0ZW5kcyB0e2NvbnN0cnVjdG9yKC4uLnQpe3N1cGVyKC4uLnQpLHRoaXMuX2lzSW5pdGlhbGl6ZWQ9ITEsdGhpcy5fcGVuZGluZ1N1YnNjcmliZXJzPVtdLHRoaXMuaW5pdGlhbGl6ZWQ9bmV3IEQoKHQ9Pnt0aGlzLl9pc0luaXRpYWxpemVkP3RoaXMuX25vdGlmeVN1YnNjcmliZXIodCk6dGhpcy5fcGVuZGluZ1N1YnNjcmliZXJzLnB1c2godCl9KSl9X21hcmtJbml0aWFsaXplZCgpe2lmKHRoaXMuX2lzSW5pdGlhbGl6ZWQmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSl0aHJvdyBFcnJvcigiVGhpcyBkaXJlY3RpdmUgaGFzIGFscmVhZHkgYmVlbiBtYXJrZWQgYXMgaW5pdGlhbGl6ZWQgYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIHR3aWNlLiIpO3RoaXMuX2lzSW5pdGlhbGl6ZWQ9ITAsdGhpcy5fcGVuZGluZ1N1YnNjcmliZXJzLmZvckVhY2godGhpcy5fbm90aWZ5U3Vic2NyaWJlciksdGhpcy5fcGVuZGluZ1N1YnNjcmliZXJzPW51bGx9X25vdGlmeVN1YnNjcmliZXIodCl7dC5uZXh0KCksdC5jb21wbGV0ZSgpfX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9YSS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WEkpKHZyKFRJKSx2cihxSSw4KSx2cihaXykpfSxYSS7JtW1vZD1hbyh7dHlwZTpYSX0pLFhJLsm1aW5qPXZuKHtpbXBvcnRzOltbTEldLExJXX0pLFhJLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6VEl9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbcUldfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWEksW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltMSV0sZXhwb3J0czpbTEldfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6VEl9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbcUldfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSksbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhYSSx7aW1wb3J0czpmdW5jdGlvbigpe3JldHVybltMSV19LGV4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bTEldfX0pO2NvbnN0IG5IPW5ldyBHYSgiTUFUX0RBVEVfTE9DQUxFIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbiBvSCgpe3JldHVybiBPcihXeSl9fSk7Y2xhc3MgaUh7Y29uc3RydWN0b3IoKXt0aGlzLl9sb2NhbGVDaGFuZ2VzPW5ldyBJLHRoaXMubG9jYWxlQ2hhbmdlcz10aGlzLl9sb2NhbGVDaGFuZ2VzfWdldFZhbGlkRGF0ZU9yTnVsbCh0KXtyZXR1cm4gdGhpcy5pc0RhdGVJbnN0YW5jZSh0KSYmdGhpcy5pc1ZhbGlkKHQpP3Q6bnVsbH1kZXNlcmlhbGl6ZSh0KXtyZXR1cm4gbnVsbD09dHx8dGhpcy5pc0RhdGVJbnN0YW5jZSh0KSYmdGhpcy5pc1ZhbGlkKHQpP3Q6dGhpcy5pbnZhbGlkKCl9c2V0TG9jYWxlKHQpe3RoaXMubG9jYWxlPXQsdGhpcy5fbG9jYWxlQ2hhbmdlcy5uZXh0KCl9Y29tcGFyZURhdGUodCxlKXtyZXR1cm4gdGhpcy5nZXRZZWFyKHQpLXRoaXMuZ2V0WWVhcihlKXx8dGhpcy5nZXRNb250aCh0KS10aGlzLmdldE1vbnRoKGUpfHx0aGlzLmdldERhdGUodCktdGhpcy5nZXREYXRlKGUpfXNhbWVEYXRlKHQsZSl7aWYodCYmZSl7bGV0IG49dGhpcy5pc1ZhbGlkKHQpLG89dGhpcy5pc1ZhbGlkKGUpO3JldHVybiBuJiZvPyF0aGlzLmNvbXBhcmVEYXRlKHQsZSk6bj09b31yZXR1cm4gdD09ZX1jbGFtcERhdGUodCxlLG4pe3JldHVybiBlJiZ0aGlzLmNvbXBhcmVEYXRlKHQsZSk8MD9lOm4mJnRoaXMuY29tcGFyZURhdGUodCxuKT4wP246dH19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NvbnN0IGFIPW5ldyBHYSgibWF0LWRhdGUtZm9ybWF0cyIpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9sZXQgckg7dHJ5e3JIPSJ1bmRlZmluZWQiIT10eXBlb2YgSW50bH1jYXRjaChqQ3Qpe3JIPSExfWNvbnN0IHNIPXtsb25nOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxzaG9ydDpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdLG5hcnJvdzpbIkoiLCJGIiwiTSIsIkEiLCJNIiwiSiIsIkoiLCJBIiwiUyIsIk8iLCJOIiwiRCJdfSxsSD1wSCgzMSwodD0+U3RyaW5nKHQrMSkpKSxjSD17bG9uZzpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sc2hvcnQ6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxuYXJyb3c6WyJTIiwiTSIsIlQiLCJXIiwiVCIsIkYiLCJTIl19LGRIPS9eXGR7NH0tXGR7Mn0tXGR7Mn0oPzpUXGR7Mn06XGR7Mn06XGR7Mn0oPzpcLlxkKyk/KD86WnwoPzooPzpcK3wtKVxkezJ9OlxkezJ9KSk/KT8kLztmdW5jdGlvbiBwSCh0LGUpe2NvbnN0IG49QXJyYXkodCk7Zm9yKGxldCBvPTA7bzx0O28rKyluW29dPWUobyk7cmV0dXJuIG59Y2xhc3MgbUggZXh0ZW5kcyBpSHtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy51c2VVdGNGb3JEaXNwbGF5PSEwLHN1cGVyLnNldExvY2FsZSh0KSx0aGlzLnVzZVV0Y0ZvckRpc3BsYXk9IWUuVFJJREVOVCx0aGlzLl9jbGFtcERhdGU9ZS5UUklERU5UfHxlLkVER0V9Z2V0WWVhcih0KXtyZXR1cm4gdC5nZXRGdWxsWWVhcigpfWdldE1vbnRoKHQpe3JldHVybiB0LmdldE1vbnRoKCl9Z2V0RGF0ZSh0KXtyZXR1cm4gdC5nZXREYXRlKCl9Z2V0RGF5T2ZXZWVrKHQpe3JldHVybiB0LmdldERheSgpfWdldE1vbnRoTmFtZXModCl7aWYockgpe2NvbnN0IGU9bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5sb2NhbGUse21vbnRoOnQsdGltZVpvbmU6InV0YyJ9KTtyZXR1cm4gcEgoMTIsKHQ9PnRoaXMuX3N0cmlwRGlyZWN0aW9uYWxpdHlDaGFyYWN0ZXJzKHRoaXMuX2Zvcm1hdChlLG5ldyBEYXRlKDIwMTcsdCwxKSkpKSl9cmV0dXJuIHNIW3RdfWdldERhdGVOYW1lcygpe2lmKHJIKXtjb25zdCB0PW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMubG9jYWxlLHtkYXk6Im51bWVyaWMiLHRpbWVab25lOiJ1dGMifSk7cmV0dXJuIHBIKDMxLChlPT50aGlzLl9zdHJpcERpcmVjdGlvbmFsaXR5Q2hhcmFjdGVycyh0aGlzLl9mb3JtYXQodCxuZXcgRGF0ZSgyMDE3LDAsZSsxKSkpKSl9cmV0dXJuIGxIfWdldERheU9mV2Vla05hbWVzKHQpe2lmKHJIKXtjb25zdCBlPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMubG9jYWxlLHt3ZWVrZGF5OnQsdGltZVpvbmU6InV0YyJ9KTtyZXR1cm4gcEgoNywodD0+dGhpcy5fc3RyaXBEaXJlY3Rpb25hbGl0eUNoYXJhY3RlcnModGhpcy5fZm9ybWF0KGUsbmV3IERhdGUoMjAxNywwLHQrMSkpKSkpfXJldHVybiBjSFt0XX1nZXRZZWFyTmFtZSh0KXtpZihySCl7Y29uc3QgZT1uZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0aGlzLmxvY2FsZSx7eWVhcjoibnVtZXJpYyIsdGltZVpvbmU6InV0YyJ9KTtyZXR1cm4gdGhpcy5fc3RyaXBEaXJlY3Rpb25hbGl0eUNoYXJhY3RlcnModGhpcy5fZm9ybWF0KGUsdCkpfXJldHVybiBTdHJpbmcodGhpcy5nZXRZZWFyKHQpKX1nZXRGaXJzdERheU9mV2Vlaygpe3JldHVybiAwfWdldE51bURheXNJbk1vbnRoKHQpe3JldHVybiB0aGlzLmdldERhdGUodGhpcy5fY3JlYXRlRGF0ZVdpdGhPdmVyZmxvdyh0aGlzLmdldFllYXIodCksdGhpcy5nZXRNb250aCh0KSsxLDApKX1jbG9uZSh0KXtyZXR1cm4gbmV3IERhdGUodC5nZXRUaW1lKCkpfWNyZWF0ZURhdGUodCxlLG4pe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpe2lmKGU8MHx8ZT4xMSl0aHJvdyBFcnJvcihgSW52YWxpZCBtb250aCBpbmRleCAiJHtlfSIuIE1vbnRoIGluZGV4IGhhcyB0byBiZSBiZXR3ZWVuIDAgYW5kIDExLmApO2lmKG48MSl0aHJvdyBFcnJvcihgSW52YWxpZCBkYXRlICIke259Ii4gRGF0ZSBoYXMgdG8gYmUgZ3JlYXRlciB0aGFuIDAuYCl9bGV0IG89dGhpcy5fY3JlYXRlRGF0ZVdpdGhPdmVyZmxvdyh0LGUsbik7aWYoby5nZXRNb250aCgpIT1lJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkpdGhyb3cgRXJyb3IoYEludmFsaWQgZGF0ZSAiJHtufSIgZm9yIG1vbnRoIHdpdGggaW5kZXggIiR7ZX0iLmApO3JldHVybiBvfXRvZGF5KCl7cmV0dXJuIG5ldyBEYXRlfXBhcnNlKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD9uZXcgRGF0ZSh0KTp0P25ldyBEYXRlKERhdGUucGFyc2UodCkpOm51bGx9Zm9ybWF0KHQsZSl7aWYoIXRoaXMuaXNWYWxpZCh0KSl0aHJvdyBFcnJvcigiTmF0aXZlRGF0ZUFkYXB0ZXI6IENhbm5vdCBmb3JtYXQgaW52YWxpZCBkYXRlLiIpO2lmKHJIKXt0aGlzLl9jbGFtcERhdGUmJih0LmdldEZ1bGxZZWFyKCk8MXx8dC5nZXRGdWxsWWVhcigpPjk5OTkpJiYodD10aGlzLmNsb25lKHQpKS5zZXRGdWxsWWVhcihNYXRoLm1heCgxLE1hdGgubWluKDk5OTksdC5nZXRGdWxsWWVhcigpKSkpLGU9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHt0aW1lWm9uZToidXRjIn0pO2NvbnN0IG49bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5sb2NhbGUsZSk7cmV0dXJuIHRoaXMuX3N0cmlwRGlyZWN0aW9uYWxpdHlDaGFyYWN0ZXJzKHRoaXMuX2Zvcm1hdChuLHQpKX1yZXR1cm4gdGhpcy5fc3RyaXBEaXJlY3Rpb25hbGl0eUNoYXJhY3RlcnModC50b0RhdGVTdHJpbmcoKSl9YWRkQ2FsZW5kYXJZZWFycyh0LGUpe3JldHVybiB0aGlzLmFkZENhbGVuZGFyTW9udGhzKHQsMTIqZSl9YWRkQ2FsZW5kYXJNb250aHModCxlKXtsZXQgbj10aGlzLl9jcmVhdGVEYXRlV2l0aE92ZXJmbG93KHRoaXMuZ2V0WWVhcih0KSx0aGlzLmdldE1vbnRoKHQpK2UsdGhpcy5nZXREYXRlKHQpKTtyZXR1cm4gdGhpcy5nZXRNb250aChuKSE9KCh0aGlzLmdldE1vbnRoKHQpK2UpJTEyKzEyKSUxMiYmKG49dGhpcy5fY3JlYXRlRGF0ZVdpdGhPdmVyZmxvdyh0aGlzLmdldFllYXIobiksdGhpcy5nZXRNb250aChuKSwwKSksbn1hZGRDYWxlbmRhckRheXModCxlKXtyZXR1cm4gdGhpcy5fY3JlYXRlRGF0ZVdpdGhPdmVyZmxvdyh0aGlzLmdldFllYXIodCksdGhpcy5nZXRNb250aCh0KSx0aGlzLmdldERhdGUodCkrZSl9dG9Jc284NjAxKHQpe3JldHVyblt0LmdldFVUQ0Z1bGxZZWFyKCksdGhpcy5fMmRpZ2l0KHQuZ2V0VVRDTW9udGgoKSsxKSx0aGlzLl8yZGlnaXQodC5nZXRVVENEYXRlKCkpXS5qb2luKCItIil9ZGVzZXJpYWxpemUodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZighdClyZXR1cm4gbnVsbDtpZihkSC50ZXN0KHQpKXtsZXQgZT1uZXcgRGF0ZSh0KTtpZih0aGlzLmlzVmFsaWQoZSkpcmV0dXJuIGV9fXJldHVybiBzdXBlci5kZXNlcmlhbGl6ZSh0KX1pc0RhdGVJbnN0YW5jZSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIERhdGV9aXNWYWxpZCh0KXtyZXR1cm4haXNOYU4odC5nZXRUaW1lKCkpfWludmFsaWQoKXtyZXR1cm4gbmV3IERhdGUoTmFOKX1fY3JlYXRlRGF0ZVdpdGhPdmVyZmxvdyh0LGUsbil7Y29uc3Qgbz1uZXcgRGF0ZTtyZXR1cm4gby5zZXRGdWxsWWVhcih0LGUsbiksby5zZXRIb3VycygwLDAsMCwwKSxvfV8yZGlnaXQodCl7cmV0dXJuKCIwMCIrdCkuc2xpY2UoLTIpfV9zdHJpcERpcmVjdGlvbmFsaXR5Q2hhcmFjdGVycyh0KXtyZXR1cm4gdC5yZXBsYWNlKC9bXHUyMDBlXHUyMDBmXS9nLCIiKX1fZm9ybWF0KHQsZSl7Y29uc3Qgbj1uZXcgRGF0ZTtyZXR1cm4gbi5zZXRVVENGdWxsWWVhcihlLmdldEZ1bGxZZWFyKCksZS5nZXRNb250aCgpLGUuZ2V0RGF0ZSgpKSxuLnNldFVUQ0hvdXJzKGUuZ2V0SG91cnMoKSxlLmdldE1pbnV0ZXMoKSxlLmdldFNlY29uZHMoKSxlLmdldE1pbGxpc2Vjb25kcygpKSx0LmZvcm1hdChuKX19bUguybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fG1IKSh2cihuSCw4KSx2cih3eikpfSxtSC7JtXByb3Y9TW4oe3Rva2VuOm1ILGZhY3Rvcnk6bUguybVmYWN9KSxtSC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbbkhdfV19LHt0eXBlOnd6fV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChtSCxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltuSF19XX0se3R5cGU6d3p9XX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgdUh7fXVILsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx1SCl9LHVILsm1bW9kPWFvKHt0eXBlOnVIfSksdUguybVpbmo9dm4oe3Byb3ZpZGVyczpbe3Byb3ZpZGU6aUgsdXNlQ2xhc3M6bUh9XSxpbXBvcnRzOltba3pdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodUgsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltrel0scHJvdmlkZXJzOlt7cHJvdmlkZTppSCx1c2VDbGFzczptSH1dfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8odUgse2ltcG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5ba3pdfX0pO2NvbnN0IGZIPXtwYXJzZTp7ZGF0ZUlucHV0Om51bGx9LGRpc3BsYXk6e2RhdGVJbnB1dDp7eWVhcjoibnVtZXJpYyIsbW9udGg6Im51bWVyaWMiLGRheToibnVtZXJpYyJ9LG1vbnRoWWVhckxhYmVsOnt5ZWFyOiJudW1lcmljIixtb250aDoic2hvcnQifSxkYXRlQTExeUxhYmVsOnt5ZWFyOiJudW1lcmljIixtb250aDoibG9uZyIsZGF5OiJudW1lcmljIn0sbW9udGhZZWFyQTExeUxhYmVsOnt5ZWFyOiJudW1lcmljIixtb250aDoibG9uZyJ9fX07Y2xhc3MgZ0h7fWdILsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxnSCl9LGdILsm1bW9kPWFvKHt0eXBlOmdIfSksZ0guybVpbmo9dm4oe3Byb3ZpZGVyczpbe3Byb3ZpZGU6YUgsdXNlVmFsdWU6Zkh9XSxpbXBvcnRzOltbdUhdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZ0gsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOlt1SF0scHJvdmlkZXJzOlt7cHJvdmlkZTphSCx1c2VWYWx1ZTpmSH1dfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oZ0gse2ltcG9ydHM6W3VIXX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgaEh7aXNFcnJvclN0YXRlKHQsZSl7cmV0dXJuISEodCYmdC5pbnZhbGlkJiYodC5kaXJ0eXx8ZSYmZS5zdWJtaXR0ZWQpKX19aEguybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGhIKX0saEguybVwcm92PU1uKHt0b2tlbjpoSCxmYWN0b3J5OmhILsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChoSCxbe3R5cGU6aW19XSxudWxsLG51bGwpO2NsYXNzIGJIe2lzRXJyb3JTdGF0ZSh0LGUpe3JldHVybiEhKHQmJnQuaW52YWxpZCYmKHQudG91Y2hlZHx8ZSYmZS5zdWJtaXR0ZWQpKX19YkguybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGJIKX0sYkguybVwcm92PU1uKHtmYWN0b3J5OmZ1bmN0aW9uIHQoKXtyZXR1cm4gbmV3IGJIfSx0b2tlbjpiSCxwcm92aWRlZEluOiJyb290In0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoYkgsW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOiJyb290In1dfV0sbnVsbCxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIHlIe315SC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8eUgpfSx5SC7JtWRpcj1sbyh7dHlwZTp5SCxzZWxlY3RvcnM6W1siIiwibWF0LWxpbmUiLCIiXSxbIiIsIm1hdExpbmUiLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtbGluZSJdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh5SCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbWF0LWxpbmVdLCBbbWF0TGluZV0iLGhvc3Q6e2NsYXNzOiJtYXQtbGluZSJ9fV19XSxudWxsLG51bGwpO2NsYXNzIF9Ie31fSC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8X0gpfSxfSC7JtW1vZD1hbyh7dHlwZTpfSH0pLF9ILsm1aW5qPXZuKHtpbXBvcnRzOltbWEldLFhJXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoX0gsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltYSV0sZXhwb3J0czpbeUgsWEldLGRlY2xhcmF0aW9uczpbeUhdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oX0gse2RlY2xhcmF0aW9uczpbeUhdLGltcG9ydHM6W1hJXSxleHBvcnRzOlt5SCxYSV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIENIe2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLl9yZW5kZXJlcj10LHRoaXMuZWxlbWVudD1lLHRoaXMuY29uZmlnPW4sdGhpcy5zdGF0ZT0zfWZhZGVPdXQoKXt0aGlzLl9yZW5kZXJlci5mYWRlT3V0UmlwcGxlKHRoaXMpfX1jb25zdCBNSD17ZW50ZXJEdXJhdGlvbjoyMjUsZXhpdER1cmF0aW9uOjE1MH0sdkg9Tnooe3Bhc3NpdmU6ITB9KSx4SD1bIm1vdXNlZG93biIsInRvdWNoc3RhcnQiXSxPSD1bIm1vdXNldXAiLCJtb3VzZWxlYXZlIiwidG91Y2hlbmQiLCJ0b3VjaGNhbmNlbCJdO2NsYXNzIFBIe2NvbnN0cnVjdG9yKHQsZSxuLG8pe3RoaXMuX3RhcmdldD10LHRoaXMuX25nWm9uZT1lLHRoaXMuX2lzUG9pbnRlckRvd249ITEsdGhpcy5fYWN0aXZlUmlwcGxlcz1uZXcgU2V0LHRoaXMuX3BvaW50ZXJVcEV2ZW50c1JlZ2lzdGVyZWQ9ITEsby5pc0Jyb3dzZXImJih0aGlzLl9jb250YWluZXJFbGVtZW50PXh6KG4pKX1mYWRlSW5SaXBwbGUodCxlLG49e30pe2NvbnN0IG89dGhpcy5fY29udGFpbmVyUmVjdD10aGlzLl9jb250YWluZXJSZWN0fHx0aGlzLl9jb250YWluZXJFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGk9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LE1IKSxuLmFuaW1hdGlvbik7bi5jZW50ZXJlZCYmKHQ9by5sZWZ0K28ud2lkdGgvMixlPW8udG9wK28uaGVpZ2h0LzIpO2NvbnN0IGE9bi5yYWRpdXN8fChmdW5jdGlvbiByKHQsZSxuKXtjb25zdCBvPU1hdGgubWF4KE1hdGguYWJzKHQtbi5sZWZ0KSxNYXRoLmFicyh0LW4ucmlnaHQpKSxpPU1hdGgubWF4KE1hdGguYWJzKGUtbi50b3ApLE1hdGguYWJzKGUtbi5ib3R0b20pKTtyZXR1cm4gTWF0aC5zcXJ0KG8qbytpKmkpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8pKHQsZSxvKSxzPXQtby5sZWZ0LGw9ZS1vLnRvcCxjPWkuZW50ZXJEdXJhdGlvbixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuY2xhc3NMaXN0LmFkZCgibWF0LXJpcHBsZS1lbGVtZW50IiksZC5zdHlsZS5sZWZ0PXMtYSsicHgiLGQuc3R5bGUudG9wPWwtYSsicHgiLGQuc3R5bGUuaGVpZ2h0PTIqYSsicHgiLGQuc3R5bGUud2lkdGg9MiphKyJweCIsbnVsbCE9bi5jb2xvciYmKGQuc3R5bGUuYmFja2dyb3VuZENvbG9yPW4uY29sb3IpLGQuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPWAke2N9bXNgLHRoaXMuX2NvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQoZCksKGZ1bmN0aW9uIHAodCl7d2luZG93LmdldENvbXB1dGVkU3R5bGUodCkuZ2V0UHJvcGVydHlWYWx1ZSgib3BhY2l0eSIpfSkoZCksZC5zdHlsZS50cmFuc2Zvcm09InNjYWxlKDEpIjtjb25zdCBtPW5ldyBDSCh0aGlzLGQsbik7cmV0dXJuIG0uc3RhdGU9MCx0aGlzLl9hY3RpdmVSaXBwbGVzLmFkZChtKSxuLnBlcnNpc3RlbnR8fCh0aGlzLl9tb3N0UmVjZW50VHJhbnNpZW50UmlwcGxlPW0pLHRoaXMuX3J1blRpbWVvdXRPdXRzaWRlWm9uZSgoKCk9Pntjb25zdCB0PW09PT10aGlzLl9tb3N0UmVjZW50VHJhbnNpZW50UmlwcGxlO20uc3RhdGU9MSxuLnBlcnNpc3RlbnR8fHQmJnRoaXMuX2lzUG9pbnRlckRvd258fG0uZmFkZU91dCgpfSksYyksbX1mYWRlT3V0UmlwcGxlKHQpe2NvbnN0IGU9dGhpcy5fYWN0aXZlUmlwcGxlcy5kZWxldGUodCk7aWYodD09PXRoaXMuX21vc3RSZWNlbnRUcmFuc2llbnRSaXBwbGUmJih0aGlzLl9tb3N0UmVjZW50VHJhbnNpZW50UmlwcGxlPW51bGwpLHRoaXMuX2FjdGl2ZVJpcHBsZXMuc2l6ZXx8KHRoaXMuX2NvbnRhaW5lclJlY3Q9bnVsbCksIWUpcmV0dXJuO2NvbnN0IG49dC5lbGVtZW50LG89T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LE1IKSx0LmNvbmZpZy5hbmltYXRpb24pO24uc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPWAke28uZXhpdER1cmF0aW9ufW1zYCxuLnN0eWxlLm9wYWNpdHk9IjAiLHQuc3RhdGU9Mix0aGlzLl9ydW5UaW1lb3V0T3V0c2lkZVpvbmUoKCgpPT57dC5zdGF0ZT0zLG4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKX0pLG8uZXhpdER1cmF0aW9uKX1mYWRlT3V0QWxsKCl7dGhpcy5fYWN0aXZlUmlwcGxlcy5mb3JFYWNoKCh0PT50LmZhZGVPdXQoKSkpfWZhZGVPdXRBbGxOb25QZXJzaXN0ZW50KCl7dGhpcy5fYWN0aXZlUmlwcGxlcy5mb3JFYWNoKCh0PT57dC5jb25maWcucGVyc2lzdGVudHx8dC5mYWRlT3V0KCl9KSl9c2V0dXBUcmlnZ2VyRXZlbnRzKHQpe2NvbnN0IGU9eHoodCk7ZSYmZSE9PXRoaXMuX3RyaWdnZXJFbGVtZW50JiYodGhpcy5fcmVtb3ZlVHJpZ2dlckV2ZW50cygpLHRoaXMuX3RyaWdnZXJFbGVtZW50PWUsdGhpcy5fcmVnaXN0ZXJFdmVudHMoeEgpKX1oYW5kbGVFdmVudCh0KXsibW91c2Vkb3duIj09PXQudHlwZT90aGlzLl9vbk1vdXNlZG93bih0KToidG91Y2hzdGFydCI9PT10LnR5cGU/dGhpcy5fb25Ub3VjaFN0YXJ0KHQpOnRoaXMuX29uUG9pbnRlclVwKCksdGhpcy5fcG9pbnRlclVwRXZlbnRzUmVnaXN0ZXJlZHx8KHRoaXMuX3JlZ2lzdGVyRXZlbnRzKE9IKSx0aGlzLl9wb2ludGVyVXBFdmVudHNSZWdpc3RlcmVkPSEwKX1fb25Nb3VzZWRvd24odCl7Y29uc3QgZT1nSSh0KSxuPXRoaXMuX2xhc3RUb3VjaFN0YXJ0RXZlbnQmJkRhdGUubm93KCk8dGhpcy5fbGFzdFRvdWNoU3RhcnRFdmVudCs4MDA7dGhpcy5fdGFyZ2V0LnJpcHBsZURpc2FibGVkfHxlfHxufHwodGhpcy5faXNQb2ludGVyRG93bj0hMCx0aGlzLmZhZGVJblJpcHBsZSh0LmNsaWVudFgsdC5jbGllbnRZLHRoaXMuX3RhcmdldC5yaXBwbGVDb25maWcpKX1fb25Ub3VjaFN0YXJ0KHQpe2lmKCF0aGlzLl90YXJnZXQucmlwcGxlRGlzYWJsZWQmJiFoSSh0KSl7dGhpcy5fbGFzdFRvdWNoU3RhcnRFdmVudD1EYXRlLm5vdygpLHRoaXMuX2lzUG9pbnRlckRvd249ITA7Y29uc3QgZT10LmNoYW5nZWRUb3VjaGVzO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXRoaXMuZmFkZUluUmlwcGxlKGVbdF0uY2xpZW50WCxlW3RdLmNsaWVudFksdGhpcy5fdGFyZ2V0LnJpcHBsZUNvbmZpZyl9fV9vblBvaW50ZXJVcCgpe3RoaXMuX2lzUG9pbnRlckRvd24mJih0aGlzLl9pc1BvaW50ZXJEb3duPSExLHRoaXMuX2FjdGl2ZVJpcHBsZXMuZm9yRWFjaCgodD0+eyF0LmNvbmZpZy5wZXJzaXN0ZW50JiYoMT09PXQuc3RhdGV8fHQuY29uZmlnLnRlcm1pbmF0ZU9uUG9pbnRlclVwJiYwPT09dC5zdGF0ZSkmJnQuZmFkZU91dCgpfSkpKX1fcnVuVGltZW91dE91dHNpZGVab25lKHQsZT0wKXt0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT5zZXRUaW1lb3V0KHQsZSkpKX1fcmVnaXN0ZXJFdmVudHModCl7dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e3QuZm9yRWFjaCgodD0+e3RoaXMuX3RyaWdnZXJFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodCx0aGlzLHZIKX0pKX0pKX1fcmVtb3ZlVHJpZ2dlckV2ZW50cygpe3RoaXMuX3RyaWdnZXJFbGVtZW50JiYoeEguZm9yRWFjaCgodD0+e3RoaXMuX3RyaWdnZXJFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodCx0aGlzLHZIKX0pKSx0aGlzLl9wb2ludGVyVXBFdmVudHNSZWdpc3RlcmVkJiZPSC5mb3JFYWNoKCh0PT57dGhpcy5fdHJpZ2dlckVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LHRoaXMsdkgpfSkpKX19Y29uc3Qgd0g9bmV3IEdhKCJtYXQtcmlwcGxlLWdsb2JhbC1vcHRpb25zIik7Y2xhc3Mga0h7Y29uc3RydWN0b3IodCxlLG4sbyxpKXt0aGlzLl9lbGVtZW50UmVmPXQsdGhpcy5fYW5pbWF0aW9uTW9kZT1pLHRoaXMucmFkaXVzPTAsdGhpcy5fZGlzYWJsZWQ9ITEsdGhpcy5faXNJbml0aWFsaXplZD0hMSx0aGlzLl9nbG9iYWxPcHRpb25zPW98fHt9LHRoaXMuX3JpcHBsZVJlbmRlcmVyPW5ldyBQSCh0aGlzLGUsdCxuKX1nZXQgZGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5fZGlzYWJsZWR9c2V0IGRpc2FibGVkKHQpe3QmJnRoaXMuZmFkZU91dEFsbE5vblBlcnNpc3RlbnQoKSx0aGlzLl9kaXNhYmxlZD10LHRoaXMuX3NldHVwVHJpZ2dlckV2ZW50c0lmRW5hYmxlZCgpfWdldCB0cmlnZ2VyKCl7cmV0dXJuIHRoaXMuX3RyaWdnZXJ8fHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudH1zZXQgdHJpZ2dlcih0KXt0aGlzLl90cmlnZ2VyPXQsdGhpcy5fc2V0dXBUcmlnZ2VyRXZlbnRzSWZFbmFibGVkKCl9bmdPbkluaXQoKXt0aGlzLl9pc0luaXRpYWxpemVkPSEwLHRoaXMuX3NldHVwVHJpZ2dlckV2ZW50c0lmRW5hYmxlZCgpfW5nT25EZXN0cm95KCl7dGhpcy5fcmlwcGxlUmVuZGVyZXIuX3JlbW92ZVRyaWdnZXJFdmVudHMoKX1mYWRlT3V0QWxsKCl7dGhpcy5fcmlwcGxlUmVuZGVyZXIuZmFkZU91dEFsbCgpfWZhZGVPdXRBbGxOb25QZXJzaXN0ZW50KCl7dGhpcy5fcmlwcGxlUmVuZGVyZXIuZmFkZU91dEFsbE5vblBlcnNpc3RlbnQoKX1nZXQgcmlwcGxlQ29uZmlnKCl7cmV0dXJue2NlbnRlcmVkOnRoaXMuY2VudGVyZWQscmFkaXVzOnRoaXMucmFkaXVzLGNvbG9yOnRoaXMuY29sb3IsYW5pbWF0aW9uOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHRoaXMuX2dsb2JhbE9wdGlvbnMuYW5pbWF0aW9uKSwiTm9vcEFuaW1hdGlvbnMiPT09dGhpcy5fYW5pbWF0aW9uTW9kZT97ZW50ZXJEdXJhdGlvbjowLGV4aXREdXJhdGlvbjowfTp7fSksdGhpcy5hbmltYXRpb24pLHRlcm1pbmF0ZU9uUG9pbnRlclVwOnRoaXMuX2dsb2JhbE9wdGlvbnMudGVybWluYXRlT25Qb2ludGVyVXB9fWdldCByaXBwbGVEaXNhYmxlZCgpe3JldHVybiB0aGlzLmRpc2FibGVkfHwhIXRoaXMuX2dsb2JhbE9wdGlvbnMuZGlzYWJsZWR9X3NldHVwVHJpZ2dlckV2ZW50c0lmRW5hYmxlZCgpeyF0aGlzLmRpc2FibGVkJiZ0aGlzLl9pc0luaXRpYWxpemVkJiZ0aGlzLl9yaXBwbGVSZW5kZXJlci5zZXR1cFRyaWdnZXJFdmVudHModGhpcy50cmlnZ2VyKX1sYXVuY2godCxlPTAsbil7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuX3JpcHBsZVJlbmRlcmVyLmZhZGVJblJpcHBsZSh0LGUsT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHRoaXMucmlwcGxlQ29uZmlnKSxuKSk6dGhpcy5fcmlwcGxlUmVuZGVyZXIuZmFkZUluUmlwcGxlKDAsMCxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5yaXBwbGVDb25maWcpLHQpKX19a0guybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGtIKShTbShoZyksU20oYV8pLFNtKHd6KSxTbSh3SCw4KSxTbShWUCw4KSl9LGtILsm1ZGlyPWxvKHt0eXBlOmtILHNlbGVjdG9yczpbWyIiLCJtYXQtcmlwcGxlIiwiIl0sWyIiLCJtYXRSaXBwbGUiLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtcmlwcGxlIl0saG9zdFZhcnM6Mixob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmcHUoIm1hdC1yaXBwbGUtdW5ib3VuZGVkIixuLnVuYm91bmRlZCl9LGlucHV0czp7cmFkaXVzOlsibWF0UmlwcGxlUmFkaXVzIiwicmFkaXVzIl0sZGlzYWJsZWQ6WyJtYXRSaXBwbGVEaXNhYmxlZCIsImRpc2FibGVkIl0sdHJpZ2dlcjpbIm1hdFJpcHBsZVRyaWdnZXIiLCJ0cmlnZ2VyIl0sY29sb3I6WyJtYXRSaXBwbGVDb2xvciIsImNvbG9yIl0sdW5ib3VuZGVkOlsibWF0UmlwcGxlVW5ib3VuZGVkIiwidW5ib3VuZGVkIl0sY2VudGVyZWQ6WyJtYXRSaXBwbGVDZW50ZXJlZCIsImNlbnRlcmVkIl0sYW5pbWF0aW9uOlsibWF0UmlwcGxlQW5pbWF0aW9uIiwiYW5pbWF0aW9uIl19LGV4cG9ydEFzOlsibWF0UmlwcGxlIl19KSxrSC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTphX30se3R5cGU6d3p9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbd0hdfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19XSxrSC5wcm9wRGVjb3JhdG9ycz17Y29sb3I6W3t0eXBlOnh5LGFyZ3M6WyJtYXRSaXBwbGVDb2xvciJdfV0sdW5ib3VuZGVkOlt7dHlwZTp4eSxhcmdzOlsibWF0UmlwcGxlVW5ib3VuZGVkIl19XSxjZW50ZXJlZDpbe3R5cGU6eHksYXJnczpbIm1hdFJpcHBsZUNlbnRlcmVkIl19XSxyYWRpdXM6W3t0eXBlOnh5LGFyZ3M6WyJtYXRSaXBwbGVSYWRpdXMiXX1dLGFuaW1hdGlvbjpbe3R5cGU6eHksYXJnczpbIm1hdFJpcHBsZUFuaW1hdGlvbiJdfV0sZGlzYWJsZWQ6W3t0eXBlOnh5LGFyZ3M6WyJtYXRSaXBwbGVEaXNhYmxlZCJdfV0sdHJpZ2dlcjpbe3R5cGU6eHksYXJnczpbIm1hdFJpcHBsZVRyaWdnZXIiXX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGtILFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IlttYXQtcmlwcGxlXSwgW21hdFJpcHBsZV0iLGV4cG9ydEFzOiJtYXRSaXBwbGUiLGhvc3Q6e2NsYXNzOiJtYXQtcmlwcGxlIiwiW2NsYXNzLm1hdC1yaXBwbGUtdW5ib3VuZGVkXSI6InVuYm91bmRlZCJ9fV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOmFffSx7dHlwZTp3en0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOlt3SF19XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dfSkse3JhZGl1czpbe3R5cGU6eHksYXJnczpbIm1hdFJpcHBsZVJhZGl1cyJdfV0sZGlzYWJsZWQ6W3t0eXBlOnh5LGFyZ3M6WyJtYXRSaXBwbGVEaXNhYmxlZCJdfV0sdHJpZ2dlcjpbe3R5cGU6eHksYXJnczpbIm1hdFJpcHBsZVRyaWdnZXIiXX1dLGNvbG9yOlt7dHlwZTp4eSxhcmdzOlsibWF0UmlwcGxlQ29sb3IiXX1dLHVuYm91bmRlZDpbe3R5cGU6eHksYXJnczpbIm1hdFJpcHBsZVVuYm91bmRlZCJdfV0sY2VudGVyZWQ6W3t0eXBlOnh5LGFyZ3M6WyJtYXRSaXBwbGVDZW50ZXJlZCJdfV0sYW5pbWF0aW9uOlt7dHlwZTp4eSxhcmdzOlsibWF0UmlwcGxlQW5pbWF0aW9uIl19XX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgU0h7fVNILsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxTSCl9LFNILsm1bW9kPWFvKHt0eXBlOlNIfSksU0guybVpbmo9dm4oe2ltcG9ydHM6W1tYSSxrel0sWEldfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChTSCxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W1hJLGt6XSxleHBvcnRzOltrSCxYSV0sZGVjbGFyYXRpb25zOltrSF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhTSCx7ZGVjbGFyYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuW2tIXX0saW1wb3J0czpmdW5jdGlvbigpe3JldHVybltYSSxrel19LGV4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5ba0gsWEldfX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgREh7Y29uc3RydWN0b3IodCl7dGhpcy5fYW5pbWF0aW9uTW9kZT10LHRoaXMuc3RhdGU9InVuY2hlY2tlZCIsdGhpcy5kaXNhYmxlZD0hMX19REguybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fERIKShTbShWUCw4KSl9LERILsm1Y21wPXRvKHt0eXBlOkRILHNlbGVjdG9yczpbWyJtYXQtcHNldWRvLWNoZWNrYm94Il1dLGhvc3RBdHRyczpbMSwibWF0LXBzZXVkby1jaGVja2JveCJdLGhvc3RWYXJzOjgsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJnB1KCJtYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUiLCJpbmRldGVybWluYXRlIj09PW4uc3RhdGUpKCJtYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQiLCJjaGVja2VkIj09PW4uc3RhdGUpKCJtYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkIixuLmRpc2FibGVkKSgiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLCJOb29wQW5pbWF0aW9ucyI9PT1uLl9hbmltYXRpb25Nb2RlKX0saW5wdXRzOntzdGF0ZToic3RhdGUiLGRpc2FibGVkOiJkaXNhYmxlZCJ9LGRlY2xzOjAsdmFyczowLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXt9LHN0eWxlczpbJy5tYXQtcHNldWRvLWNoZWNrYm94e3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7Ym9yZGVyOjJweCBzb2xpZDtib3JkZXItcmFkaXVzOjJweDtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXgtc2hyaW5rOjA7dHJhbnNpdGlvbjpib3JkZXItY29sb3IgOTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAwLjEpLGJhY2tncm91bmQtY29sb3IgOTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAwLjEpfS5tYXQtcHNldWRvLWNoZWNrYm94OjphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTtvcGFjaXR5OjA7Y29udGVudDoiIjtib3JkZXItYm90dG9tOjJweCBzb2xpZCBjdXJyZW50Q29sb3I7dHJhbnNpdGlvbjpvcGFjaXR5IDkwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKX0ubWF0LXBzZXVkby1jaGVja2JveC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsLm1hdC1wc2V1ZG8tY2hlY2tib3gubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRle2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXBzZXVkby1jaGVja2JveHt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wc2V1ZG8tY2hlY2tib3g6OmFmdGVye3RyYW5zaXRpb246bm9uZX0ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdH0ubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlOjphZnRlcnt0b3A6NXB4O2xlZnQ6MXB4O3dpZHRoOjEwcHg7b3BhY2l0eToxO2JvcmRlci1yYWRpdXM6MnB4fS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQ6OmFmdGVye3RvcDoyLjRweDtsZWZ0OjFweDt3aWR0aDo4cHg7aGVpZ2h0OjNweDtib3JkZXItbGVmdDoycHggc29saWQgY3VycmVudENvbG9yO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTtvcGFjaXR5OjE7Ym94LXNpemluZzpjb250ZW50LWJveH1cbiddLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLERILmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dLERILnByb3BEZWNvcmF0b3JzPXtzdGF0ZTpbe3R5cGU6eHl9XSxkaXNhYmxlZDpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChESCxbe3R5cGU6TXksYXJnczpbe2VuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLHNlbGVjdG9yOiJtYXQtcHNldWRvLWNoZWNrYm94Iix0ZW1wbGF0ZToiIixob3N0OntjbGFzczoibWF0LXBzZXVkby1jaGVja2JveCIsIltjbGFzcy5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVdIjonc3RhdGUgPT09ICJpbmRldGVybWluYXRlIicsIltjbGFzcy5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRdIjonc3RhdGUgPT09ICJjaGVja2VkIicsIltjbGFzcy5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkXSI6ImRpc2FibGVkIiwiW2NsYXNzLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlXSI6J19hbmltYXRpb25Nb2RlID09PSAiTm9vcEFuaW1hdGlvbnMiJ30sc3R5bGVzOlsnLm1hdC1wc2V1ZG8tY2hlY2tib3h7d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtib3JkZXI6MnB4IHNvbGlkO2JvcmRlci1yYWRpdXM6MnB4O2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7ZmxleC1zaHJpbms6MDt0cmFuc2l0aW9uOmJvcmRlci1jb2xvciA5MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDAuMSksYmFja2dyb3VuZC1jb2xvciA5MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDAuMSl9Lm1hdC1wc2V1ZG8tY2hlY2tib3g6OmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO29wYWNpdHk6MDtjb250ZW50OiIiO2JvcmRlci1ib3R0b206MnB4IHNvbGlkIGN1cnJlbnRDb2xvcjt0cmFuc2l0aW9uOm9wYWNpdHkgOTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAwLjEpfS5tYXQtcHNldWRvLWNoZWNrYm94Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCwubWF0LXBzZXVkby1jaGVja2JveC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGV7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtcHNldWRvLWNoZWNrYm94e3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXBzZXVkby1jaGVja2JveDo6YWZ0ZXJ7dHJhbnNpdGlvbjpub25lfS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGU6OmFmdGVye3RvcDo1cHg7bGVmdDoxcHg7d2lkdGg6MTBweDtvcGFjaXR5OjE7Ym9yZGVyLXJhZGl1czoycHh9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZDo6YWZ0ZXJ7dG9wOjIuNHB4O2xlZnQ6MXB4O3dpZHRoOjhweDtoZWlnaHQ6M3B4O2JvcmRlci1sZWZ0OjJweCBzb2xpZCBjdXJyZW50Q29sb3I7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpO29wYWNpdHk6MTtib3gtc2l6aW5nOmNvbnRlbnQtYm94fVxuJ119XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV19KSx7c3RhdGU6W3t0eXBlOnh5fV0sZGlzYWJsZWQ6W3t0eXBlOnh5fV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIEVIe31FSC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8RUgpfSxFSC7JtW1vZD1hbyh7dHlwZTpFSH0pLEVILsm1aW5qPXZuKHtpbXBvcnRzOltbWEldXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRUgsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltYSV0sZXhwb3J0czpbREhdLGRlY2xhcmF0aW9uczpbREhdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oRUgse2RlY2xhcmF0aW9uczpbREhdLGltcG9ydHM6W1hJXSxleHBvcnRzOltESF19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IFJIPW5ldyBHYSgiTUFUX09QVElPTl9QQVJFTlRfQ09NUE9ORU5UIiksQUg9S0koY2xhc3N7fSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2xldCBUSD0wO2NsYXNzIE5IIGV4dGVuZHMgQUh7Y29uc3RydWN0b3IodCl7dmFyIGU7c3VwZXIoKSx0aGlzLl9sYWJlbElkPSJtYXQtb3B0Z3JvdXAtbGFiZWwtIitUSCsrLHRoaXMuX2luZXJ0PW51bGwhPT0oZT1udWxsPT10P3ZvaWQgMDp0LmluZXJ0R3JvdXBzKSYmdm9pZCAwIT09ZSYmZX19TkguybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fE5IKShTbShSSCw4KSl9LE5ILsm1ZGlyPWxvKHt0eXBlOk5ILGlucHV0czp7bGFiZWw6ImxhYmVsIn0sZmVhdHVyZXM6W3hwXX0pLE5ILmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1JIXX0se3R5cGU6U3J9XX1dLE5ILnByb3BEZWNvcmF0b3JzPXtsYWJlbDpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChOSCxbe3R5cGU6Q3l9XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1JIXX0se3R5cGU6U3J9XX1dfSkse2xhYmVsOlt7dHlwZTp4eX1dfSk7Y29uc3Qgekg9bmV3IEdhKCJNYXRPcHRncm91cCIpO2NsYXNzIElIIGV4dGVuZHMgTkh7fUlILsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYShJSCkpKShufHxJSCl9fSkoKSxJSC7JtWNtcD10byh7dHlwZTpJSCxzZWxlY3RvcnM6W1sibWF0LW9wdGdyb3VwIl1dLGhvc3RBdHRyczpbMSwibWF0LW9wdGdyb3VwIl0saG9zdFZhcnM6NSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmKGpwKCJyb2xlIixuLl9pbmVydD9udWxsOiJncm91cCIpKCJhcmlhLWRpc2FibGVkIixuLl9pbmVydD9udWxsOm4uZGlzYWJsZWQudG9TdHJpbmcoKSkoImFyaWEtbGFiZWxsZWRieSIsbi5faW5lcnQ/bnVsbDpuLl9sYWJlbElkKSxwdSgibWF0LW9wdGdyb3VwLWRpc2FibGVkIixuLmRpc2FibGVkKSl9LGlucHV0czp7ZGlzYWJsZWQ6ImRpc2FibGVkIn0sZXhwb3J0QXM6WyJtYXRPcHRncm91cCJdLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6ekgsdXNlRXhpc3Rpbmc6SUh9XSkseHBdLG5nQ29udGVudFNlbGVjdG9yczpbIioiLCJtYXQtb3B0aW9uLCBuZy1jb250YWluZXIiXSxkZWNsczo0LHZhcnM6Mixjb25zdHM6W1siYXJpYS1oaWRkZW4iLCJ0cnVlIiwxLCJtYXQtb3B0Z3JvdXAtbGFiZWwiLDMsImlkIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabShWSSksUm0oMCwic3BhbiIsMCksa3UoMSksWG0oMiksQW0oKSxYbSgzLDEpKSwyJmUmJihEbSgiaWQiLG4uX2xhYmVsSWQpLHJjKDEpLER1KCIiLG4ubGFiZWwsIiAiKSl9LHN0eWxlczpbIi5tYXQtb3B0Z3JvdXAtbGFiZWx7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7bGluZS1oZWlnaHQ6NDhweDtoZWlnaHQ6NDhweDtwYWRkaW5nOjAgMTZweDt0ZXh0LWFsaWduOmxlZnQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7bWF4LXdpZHRoOjEwMCU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpkZWZhdWx0fS5tYXQtb3B0Z3JvdXAtbGFiZWxbZGlzYWJsZWRde2N1cnNvcjpkZWZhdWx0fVtkaXI9cnRsXSAubWF0LW9wdGdyb3VwLWxhYmVse3RleHQtYWxpZ246cmlnaHR9Lm1hdC1vcHRncm91cC1sYWJlbCAubWF0LWljb257bWFyZ2luLXJpZ2h0OjE2cHg7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtb3B0Z3JvdXAtbGFiZWwgLm1hdC1pY29uIHN2Z3t2ZXJ0aWNhbC1hbGlnbjp0b3B9W2Rpcj1ydGxdIC5tYXQtb3B0Z3JvdXAtbGFiZWwgLm1hdC1pY29ue21hcmdpbi1sZWZ0OjE2cHg7bWFyZ2luLXJpZ2h0OjB9XG4iXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKElILFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC1vcHRncm91cCIsZXhwb3J0QXM6Im1hdE9wdGdyb3VwIix0ZW1wbGF0ZTonPHNwYW4gY2xhc3M9Im1hdC1vcHRncm91cC1sYWJlbCIgYXJpYS1oaWRkZW49InRydWUiIFtpZF09Il9sYWJlbElkIj57eyBsYWJlbCB9fSA8bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9zcGFuPlxuPG5nLWNvbnRlbnQgc2VsZWN0PSJtYXQtb3B0aW9uLCBuZy1jb250YWluZXIiPjwvbmctY29udGVudD5cbicsZW5jYXBzdWxhdGlvbjpIbi5Ob25lLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2gsaW5wdXRzOlsiZGlzYWJsZWQiXSxob3N0OntjbGFzczoibWF0LW9wdGdyb3VwIiwiW2F0dHIucm9sZV0iOidfaW5lcnQgPyBudWxsIDogImdyb3VwIicsIlthdHRyLmFyaWEtZGlzYWJsZWRdIjoiX2luZXJ0ID8gbnVsbCA6IGRpc2FibGVkLnRvU3RyaW5nKCkiLCJbYXR0ci5hcmlhLWxhYmVsbGVkYnldIjoiX2luZXJ0ID8gbnVsbCA6IF9sYWJlbElkIiwiW2NsYXNzLm1hdC1vcHRncm91cC1kaXNhYmxlZF0iOiJkaXNhYmxlZCJ9LHByb3ZpZGVyczpbe3Byb3ZpZGU6ekgsdXNlRXhpc3Rpbmc6SUh9XSxzdHlsZXM6WyIubWF0LW9wdGdyb3VwLWxhYmVse3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2xpbmUtaGVpZ2h0OjQ4cHg7aGVpZ2h0OjQ4cHg7cGFkZGluZzowIDE2cHg7dGV4dC1hbGlnbjpsZWZ0O3RleHQtZGVjb3JhdGlvbjpub25lO21heC13aWR0aDoxMDAlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6ZGVmYXVsdH0ubWF0LW9wdGdyb3VwLWxhYmVsW2Rpc2FibGVkXXtjdXJzb3I6ZGVmYXVsdH1bZGlyPXJ0bF0gLm1hdC1vcHRncm91cC1sYWJlbHt0ZXh0LWFsaWduOnJpZ2h0fS5tYXQtb3B0Z3JvdXAtbGFiZWwgLm1hdC1pY29ue21hcmdpbi1yaWdodDoxNnB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0ubWF0LW9wdGdyb3VwLWxhYmVsIC5tYXQtaWNvbiBzdmd7dmVydGljYWwtYWxpZ246dG9wfVtkaXI9cnRsXSAubWF0LW9wdGdyb3VwLWxhYmVsIC5tYXQtaWNvbnttYXJnaW4tbGVmdDoxNnB4O21hcmdpbi1yaWdodDowfVxuIl19XX1dLG51bGwsbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpsZXQgSEg9MDtjbGFzcyBGSHtjb25zdHJ1Y3Rvcih0LGU9ITEpe3RoaXMuc291cmNlPXQsdGhpcy5pc1VzZXJJbnB1dD1lfX1jbGFzcyBMSHtjb25zdHJ1Y3Rvcih0LGUsbixvKXt0aGlzLl9lbGVtZW50PXQsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWY9ZSx0aGlzLl9wYXJlbnQ9bix0aGlzLmdyb3VwPW8sdGhpcy5fc2VsZWN0ZWQ9ITEsdGhpcy5fYWN0aXZlPSExLHRoaXMuX2Rpc2FibGVkPSExLHRoaXMuX21vc3RSZWNlbnRWaWV3VmFsdWU9IiIsdGhpcy5pZD0ibWF0LW9wdGlvbi0iK0hIKyssdGhpcy5vblNlbGVjdGlvbkNoYW5nZT1uZXcgTGgsdGhpcy5fc3RhdGVDaGFuZ2VzPW5ldyBJfWdldCBtdWx0aXBsZSgpe3JldHVybiB0aGlzLl9wYXJlbnQmJnRoaXMuX3BhcmVudC5tdWx0aXBsZX1nZXQgc2VsZWN0ZWQoKXtyZXR1cm4gdGhpcy5fc2VsZWN0ZWR9Z2V0IGRpc2FibGVkKCl7cmV0dXJuIHRoaXMuZ3JvdXAmJnRoaXMuZ3JvdXAuZGlzYWJsZWR8fHRoaXMuX2Rpc2FibGVkfXNldCBkaXNhYmxlZCh0KXt0aGlzLl9kaXNhYmxlZD15eih0KX1nZXQgZGlzYWJsZVJpcHBsZSgpe3JldHVybiB0aGlzLl9wYXJlbnQmJnRoaXMuX3BhcmVudC5kaXNhYmxlUmlwcGxlfWdldCBhY3RpdmUoKXtyZXR1cm4gdGhpcy5fYWN0aXZlfWdldCB2aWV3VmFsdWUoKXtyZXR1cm4odGhpcy5fZ2V0SG9zdEVsZW1lbnQoKS50ZXh0Q29udGVudHx8IiIpLnRyaW0oKX1zZWxlY3QoKXt0aGlzLl9zZWxlY3RlZHx8KHRoaXMuX3NlbGVjdGVkPSEwLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpLHRoaXMuX2VtaXRTZWxlY3Rpb25DaGFuZ2VFdmVudCgpKX1kZXNlbGVjdCgpe3RoaXMuX3NlbGVjdGVkJiYodGhpcy5fc2VsZWN0ZWQ9ITEsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCksdGhpcy5fZW1pdFNlbGVjdGlvbkNoYW5nZUV2ZW50KCkpfWZvY3VzKHQsZSl7Y29uc3Qgbj10aGlzLl9nZXRIb3N0RWxlbWVudCgpOyJmdW5jdGlvbiI9PXR5cGVvZiBuLmZvY3VzJiZuLmZvY3VzKGUpfXNldEFjdGl2ZVN0eWxlcygpe3RoaXMuX2FjdGl2ZXx8KHRoaXMuX2FjdGl2ZT0hMCx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSl9c2V0SW5hY3RpdmVTdHlsZXMoKXt0aGlzLl9hY3RpdmUmJih0aGlzLl9hY3RpdmU9ITEsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpfWdldExhYmVsKCl7cmV0dXJuIHRoaXMudmlld1ZhbHVlfV9oYW5kbGVLZXlkb3duKHQpe3Qua2V5Q29kZSE9PW16JiZ0LmtleUNvZGUhPT1menx8YnoodCl8fCh0aGlzLl9zZWxlY3RWaWFJbnRlcmFjdGlvbigpLHQucHJldmVudERlZmF1bHQoKSl9X3NlbGVjdFZpYUludGVyYWN0aW9uKCl7dGhpcy5kaXNhYmxlZHx8KHRoaXMuX3NlbGVjdGVkPSF0aGlzLm11bHRpcGxlfHwhdGhpcy5fc2VsZWN0ZWQsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCksdGhpcy5fZW1pdFNlbGVjdGlvbkNoYW5nZUV2ZW50KCEwKSl9X2dldEFyaWFTZWxlY3RlZCgpe3JldHVybiB0aGlzLnNlbGVjdGVkfHwhdGhpcy5tdWx0aXBsZSYmbnVsbH1fZ2V0VGFiSW5kZXgoKXtyZXR1cm4gdGhpcy5kaXNhYmxlZD8iLTEiOiIwIn1fZ2V0SG9zdEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50fW5nQWZ0ZXJWaWV3Q2hlY2tlZCgpe2lmKHRoaXMuX3NlbGVjdGVkKXtjb25zdCB0PXRoaXMudmlld1ZhbHVlO3QhPT10aGlzLl9tb3N0UmVjZW50Vmlld1ZhbHVlJiYodGhpcy5fbW9zdFJlY2VudFZpZXdWYWx1ZT10LHRoaXMuX3N0YXRlQ2hhbmdlcy5uZXh0KCkpfX1uZ09uRGVzdHJveSgpe3RoaXMuX3N0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpfV9lbWl0U2VsZWN0aW9uQ2hhbmdlRXZlbnQodD0hMSl7dGhpcy5vblNlbGVjdGlvbkNoYW5nZS5lbWl0KG5ldyBGSCh0aGlzLHQpKX19TEguybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fExIKShTbShoZyksU20oVWcpLFNtKHZvaWQgMCksU20oTkgpKX0sTEguybVkaXI9bG8oe3R5cGU6TEgsaW5wdXRzOntpZDoiaWQiLGRpc2FibGVkOiJkaXNhYmxlZCIsdmFsdWU6InZhbHVlIn0sb3V0cHV0czp7b25TZWxlY3Rpb25DaGFuZ2U6Im9uU2VsZWN0aW9uQ2hhbmdlIn19KSxMSC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpVZ30se3R5cGU6dm9pZCAwfSx7dHlwZTpOSH1dLExILnByb3BEZWNvcmF0b3JzPXt2YWx1ZTpbe3R5cGU6eHl9XSxpZDpbe3R5cGU6eHl9XSxkaXNhYmxlZDpbe3R5cGU6eHl9XSxvblNlbGVjdGlvbkNoYW5nZTpbe3R5cGU6T3l9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChMSCxbe3R5cGU6Q3l9XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOlVnfSx7dHlwZTp2b2lkIDB9LHt0eXBlOk5IfV19KSx7aWQ6W3t0eXBlOnh5fV0sb25TZWxlY3Rpb25DaGFuZ2U6W3t0eXBlOk95fV0sZGlzYWJsZWQ6W3t0eXBlOnh5fV0sdmFsdWU6W3t0eXBlOnh5fV19KTtjbGFzcyBCSCBleHRlbmRzIExIe2NvbnN0cnVjdG9yKHQsZSxuLG8pe3N1cGVyKHQsZSxuLG8pfX1mdW5jdGlvbiBWSCh0LGUsbil7aWYobi5sZW5ndGgpe2xldCBvPWUudG9BcnJheSgpLGk9bi50b0FycmF5KCksYT0wO2ZvcihsZXQgZT0wO2U8dCsxO2UrKylvW2VdLmdyb3VwJiZvW2VdLmdyb3VwPT09aVthXSYmYSsrO3JldHVybiBhfXJldHVybiAwfWZ1bmN0aW9uIGpIKHQsZSxuLG8pe3JldHVybiB0PG4/dDp0K2U+bitvP01hdGgubWF4KDAsdC1vK2UpOm59Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL0JILsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxCSCkoU20oaGcpLFNtKFVnKSxTbShSSCw4KSxTbSh6SCw4KSl9LEJILsm1Y21wPXRvKHt0eXBlOkJILHNlbGVjdG9yczpbWyJtYXQtb3B0aW9uIl1dLGhvc3RBdHRyczpbInJvbGUiLCJvcHRpb24iLDEsIm1hdC1vcHRpb24iLCJtYXQtZm9jdXMtaW5kaWNhdG9yIl0saG9zdFZhcnM6MTIsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJlZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5fc2VsZWN0VmlhSW50ZXJhY3Rpb24oKX0pKSgia2V5ZG93biIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX2hhbmRsZUtleWRvd24oZSl9KSksMiZlJiYoVHUoImlkIixuLmlkKSxqcCgidGFiaW5kZXgiLG4uX2dldFRhYkluZGV4KCkpKCJhcmlhLXNlbGVjdGVkIixuLl9nZXRBcmlhU2VsZWN0ZWQoKSkoImFyaWEtZGlzYWJsZWQiLG4uZGlzYWJsZWQudG9TdHJpbmcoKSkscHUoIm1hdC1zZWxlY3RlZCIsbi5zZWxlY3RlZCkoIm1hdC1vcHRpb24tbXVsdGlwbGUiLG4ubXVsdGlwbGUpKCJtYXQtYWN0aXZlIixuLmFjdGl2ZSkoIm1hdC1vcHRpb24tZGlzYWJsZWQiLG4uZGlzYWJsZWQpKX0sZXhwb3J0QXM6WyJtYXRPcHRpb24iXSxmZWF0dXJlczpbeHBdLG5nQ29udGVudFNlbGVjdG9yczpbIioiXSxkZWNsczo1LHZhcnM6NCxjb25zdHM6W1siY2xhc3MiLCJtYXQtb3B0aW9uLXBzZXVkby1jaGVja2JveCIsMywic3RhdGUiLCJkaXNhYmxlZCIsNCwibmdJZiJdLFsxLCJtYXQtb3B0aW9uLXRleHQiXSxbImNsYXNzIiwiY2RrLXZpc3VhbGx5LWhpZGRlbiIsNCwibmdJZiJdLFsibWF0LXJpcHBsZSIsIiIsMSwibWF0LW9wdGlvbi1yaXBwbGUiLDMsIm1hdFJpcHBsZVRyaWdnZXIiLCJtYXRSaXBwbGVEaXNhYmxlZCJdLFsxLCJtYXQtb3B0aW9uLXBzZXVkby1jaGVja2JveCIsMywic3RhdGUiLCJkaXNhYmxlZCJdLFsxLCJjZGstdmlzdWFsbHktaGlkZGVuIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabSgpLFFwKDAsakksMSwyLCJtYXQtcHNldWRvLWNoZWNrYm94IiwwKSxSbSgxLCJzcGFuIiwxKSxYbSgyKSxBbSgpLFFwKDMsVUksMiwxLCJzcGFuIiwyKSxUbSg0LCJkaXYiLDMpKSwyJmUmJihEbSgibmdJZiIsbi5tdWx0aXBsZSkscmMoMyksRG0oIm5nSWYiLG4uZ3JvdXAmJm4uZ3JvdXAuX2luZXJ0KSxyYygxKSxEbSgibWF0UmlwcGxlVHJpZ2dlciIsbi5fZ2V0SG9zdEVsZW1lbnQoKSkoIm1hdFJpcHBsZURpc2FibGVkIixuLmRpc2FibGVkfHxuLmRpc2FibGVSaXBwbGUpKX0sZGlyZWN0aXZlczpbZE0sa0gsREhdLHN0eWxlczpbIi5tYXQtb3B0aW9ue3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2xpbmUtaGVpZ2h0OjQ4cHg7aGVpZ2h0OjQ4cHg7cGFkZGluZzowIDE2cHg7dGV4dC1hbGlnbjpsZWZ0O3RleHQtZGVjb3JhdGlvbjpub25lO21heC13aWR0aDoxMDAlO3Bvc2l0aW9uOnJlbGF0aXZlO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O21heC13aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDthbGlnbi1pdGVtczpjZW50ZXI7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtb3B0aW9uW2Rpc2FibGVkXXtjdXJzb3I6ZGVmYXVsdH1bZGlyPXJ0bF0gLm1hdC1vcHRpb257dGV4dC1hbGlnbjpyaWdodH0ubWF0LW9wdGlvbiAubWF0LWljb257bWFyZ2luLXJpZ2h0OjE2cHg7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtb3B0aW9uIC5tYXQtaWNvbiBzdmd7dmVydGljYWwtYWxpZ246dG9wfVtkaXI9cnRsXSAubWF0LW9wdGlvbiAubWF0LWljb257bWFyZ2luLWxlZnQ6MTZweDttYXJnaW4tcmlnaHQ6MH0ubWF0LW9wdGlvblthcmlhLWRpc2FibGVkPXRydWVdey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6ZGVmYXVsdH0ubWF0LW9wdGdyb3VwIC5tYXQtb3B0aW9uOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7cGFkZGluZy1sZWZ0OjMycHh9W2Rpcj1ydGxdIC5tYXQtb3B0Z3JvdXAgLm1hdC1vcHRpb246bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKXtwYWRkaW5nLWxlZnQ6MTZweDtwYWRkaW5nLXJpZ2h0OjMycHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW9wdGlvbnttYXJnaW46MCAxcHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW9wdGlvbi5tYXQtYWN0aXZle2JvcmRlcjpzb2xpZCAxcHggY3VycmVudENvbG9yO21hcmdpbjowfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1vcHRpb25bYXJpYS1kaXNhYmxlZD10cnVlXXtvcGFjaXR5Oi41fS5tYXQtb3B0aW9uLXRleHR7ZGlzcGxheTppbmxpbmUtYmxvY2s7ZmxleC1ncm93OjE7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9Lm1hdC1vcHRpb24gLm1hdC1vcHRpb24tcmlwcGxle3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1hdC1vcHRpb24tcHNldWRvLWNoZWNrYm94e21hcmdpbi1yaWdodDo4cHh9W2Rpcj1ydGxdIC5tYXQtb3B0aW9uLXBzZXVkby1jaGVja2JveHttYXJnaW4tbGVmdDo4cHg7bWFyZ2luLXJpZ2h0OjB9XG4iXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSxCSC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpVZ30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltSSF19XX0se3R5cGU6SUgsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3pIXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChCSCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtYXQtb3B0aW9uIixleHBvcnRBczoibWF0T3B0aW9uIixob3N0Ontyb2xlOiJvcHRpb24iLCJbYXR0ci50YWJpbmRleF0iOiJfZ2V0VGFiSW5kZXgoKSIsIltjbGFzcy5tYXQtc2VsZWN0ZWRdIjoic2VsZWN0ZWQiLCJbY2xhc3MubWF0LW9wdGlvbi1tdWx0aXBsZV0iOiJtdWx0aXBsZSIsIltjbGFzcy5tYXQtYWN0aXZlXSI6ImFjdGl2ZSIsIltpZF0iOiJpZCIsIlthdHRyLmFyaWEtc2VsZWN0ZWRdIjoiX2dldEFyaWFTZWxlY3RlZCgpIiwiW2F0dHIuYXJpYS1kaXNhYmxlZF0iOiJkaXNhYmxlZC50b1N0cmluZygpIiwiW2NsYXNzLm1hdC1vcHRpb24tZGlzYWJsZWRdIjoiZGlzYWJsZWQiLCIoY2xpY2spIjoiX3NlbGVjdFZpYUludGVyYWN0aW9uKCkiLCIoa2V5ZG93bikiOiJfaGFuZGxlS2V5ZG93bigkZXZlbnQpIixjbGFzczoibWF0LW9wdGlvbiBtYXQtZm9jdXMtaW5kaWNhdG9yIn0sdGVtcGxhdGU6JzxtYXQtcHNldWRvLWNoZWNrYm94ICpuZ0lmPSJtdWx0aXBsZSIgY2xhc3M9Im1hdC1vcHRpb24tcHNldWRvLWNoZWNrYm94IlxuICAgIFtzdGF0ZV09InNlbGVjdGVkID8gXCdjaGVja2VkXCcgOiBcJ3VuY2hlY2tlZFwnIiBbZGlzYWJsZWRdPSJkaXNhYmxlZCI+PC9tYXQtcHNldWRvLWNoZWNrYm94PlxuXG48c3BhbiBjbGFzcz0ibWF0LW9wdGlvbi10ZXh0Ij48bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9zcGFuPlxuXG5ceDNjIS0tIFNlZSBhMTF5IG5vdGVzIGluc2lkZSBvcHRncm91cC50cyBmb3IgY29udGV4dCBiZWhpbmQgdGhpcyBlbGVtZW50LiAtLVx4M2VcbjxzcGFuIGNsYXNzPSJjZGstdmlzdWFsbHktaGlkZGVuIiAqbmdJZj0iZ3JvdXAgJiYgZ3JvdXAuX2luZXJ0Ij4oe3sgZ3JvdXAubGFiZWwgfX0pPC9zcGFuPlxuXG48ZGl2IGNsYXNzPSJtYXQtb3B0aW9uLXJpcHBsZSIgbWF0LXJpcHBsZVxuICAgICBbbWF0UmlwcGxlVHJpZ2dlcl09Il9nZXRIb3N0RWxlbWVudCgpIlxuICAgICBbbWF0UmlwcGxlRGlzYWJsZWRdPSJkaXNhYmxlZCB8fCBkaXNhYmxlUmlwcGxlIj5cbjwvZGl2PlxuJyxlbmNhcHN1bGF0aW9uOkhuLk5vbmUsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaCxzdHlsZXM6WyIubWF0LW9wdGlvbnt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztsaW5lLWhlaWdodDo0OHB4O2hlaWdodDo0OHB4O3BhZGRpbmc6MCAxNnB4O3RleHQtYWxpZ246bGVmdDt0ZXh0LWRlY29yYXRpb246bm9uZTttYXgtd2lkdGg6MTAwJTtwb3NpdGlvbjpyZWxhdGl2ZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdzttYXgtd2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7YWxpZ24taXRlbXM6Y2VudGVyOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LW9wdGlvbltkaXNhYmxlZF17Y3Vyc29yOmRlZmF1bHR9W2Rpcj1ydGxdIC5tYXQtb3B0aW9ue3RleHQtYWxpZ246cmlnaHR9Lm1hdC1vcHRpb24gLm1hdC1pY29ue21hcmdpbi1yaWdodDoxNnB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0ubWF0LW9wdGlvbiAubWF0LWljb24gc3Zne3ZlcnRpY2FsLWFsaWduOnRvcH1bZGlyPXJ0bF0gLm1hdC1vcHRpb24gLm1hdC1pY29ue21hcmdpbi1sZWZ0OjE2cHg7bWFyZ2luLXJpZ2h0OjB9Lm1hdC1vcHRpb25bYXJpYS1kaXNhYmxlZD10cnVlXXstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7Y3Vyc29yOmRlZmF1bHR9Lm1hdC1vcHRncm91cCAubWF0LW9wdGlvbjpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpe3BhZGRpbmctbGVmdDozMnB4fVtkaXI9cnRsXSAubWF0LW9wdGdyb3VwIC5tYXQtb3B0aW9uOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7cGFkZGluZy1sZWZ0OjE2cHg7cGFkZGluZy1yaWdodDozMnB4fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1vcHRpb257bWFyZ2luOjAgMXB4fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1vcHRpb24ubWF0LWFjdGl2ZXtib3JkZXI6c29saWQgMXB4IGN1cnJlbnRDb2xvcjttYXJnaW46MH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtb3B0aW9uW2FyaWEtZGlzYWJsZWQ9dHJ1ZV17b3BhY2l0eTouNX0ubWF0LW9wdGlvbi10ZXh0e2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZsZXgtZ3JvdzoxO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzfS5tYXQtb3B0aW9uIC5tYXQtb3B0aW9uLXJpcHBsZXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lfS5tYXQtb3B0aW9uLXBzZXVkby1jaGVja2JveHttYXJnaW4tcmlnaHQ6OHB4fVtkaXI9cnRsXSAubWF0LW9wdGlvbi1wc2V1ZG8tY2hlY2tib3h7bWFyZ2luLWxlZnQ6OHB4O21hcmdpbi1yaWdodDowfVxuIl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6VWd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbUkhdfV19LHt0eXBlOklILGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOlt6SF19XX1dfSksbnVsbCk7Y2xhc3MgVUh7fVVILsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxVSCl9LFVILsm1bW9kPWFvKHt0eXBlOlVIfSksVUguybVpbmo9dm4oe2ltcG9ydHM6W1tTSCxXTSxYSSxFSF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChVSCxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W1NILFdNLFhJLEVIXSxleHBvcnRzOltCSCxJSF0sZGVjbGFyYXRpb25zOltCSCxJSF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhVSCx7ZGVjbGFyYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuW0JILElIXX0saW1wb3J0czpmdW5jdGlvbigpe3JldHVybltTSCxXTSxYSSxFSF19LGV4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bQkgsSUhdfX0pO2NvbnN0IEdIPVsibWF0LWJ1dHRvbiIsIiJdLFdIPVsiKiJdLFlIPSIubWF0LWJ1dHRvbiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5OjB9Lm1hdC1idXR0b246aG92ZXI6bm90KC5tYXQtYnV0dG9uLWRpc2FibGVkKSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b246aG92ZXI6bm90KC5tYXQtYnV0dG9uLWRpc2FibGVkKSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjA0fUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1idXR0b246aG92ZXI6bm90KC5tYXQtYnV0dG9uLWRpc2FibGVkKSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b246aG92ZXI6bm90KC5tYXQtYnV0dG9uLWRpc2FibGVkKSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6MH19Lm1hdC1idXR0b24sLm1hdC1pY29uLWJ1dHRvbiwubWF0LXN0cm9rZWQtYnV0dG9uLC5tYXQtZmxhdC1idXR0b257Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MDttaW4td2lkdGg6NjRweDtsaW5lLWhlaWdodDozNnB4O3BhZGRpbmc6MCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O292ZXJmbG93OnZpc2libGV9Lm1hdC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1pY29uLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LXN0cm9rZWQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtZmxhdC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWljb24tYnV0dG9uLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtZmxhdC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdH0ubWF0LWJ1dHRvbi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b24uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtZmxhdC1idXR0b24uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWZsYXQtYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4xMn0ubWF0LWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LWljb24tYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtc3Ryb2tlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1mbGF0LWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LXJhaXNlZC1idXR0b257Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MDttaW4td2lkdGg6NjRweDtsaW5lLWhlaWdodDozNnB4O3BhZGRpbmc6MCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O292ZXJmbG93OnZpc2libGU7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApO3RyYW5zaXRpb246YmFja2dyb3VuZCA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxib3gtc2hhZG93IDI4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSl9Lm1hdC1yYWlzZWQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5tYXQtcmFpc2VkLWJ1dHRvbi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtcmFpc2VkLWJ1dHRvbi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTouMTJ9Lm1hdC1yYWlzZWQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtcmFpc2VkLWJ1dHRvbnt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC1zdHJva2VkLWJ1dHRvbntib3JkZXI6MXB4IHNvbGlkIGN1cnJlbnRDb2xvcjtwYWRkaW5nOjAgMTVweDtsaW5lLWhlaWdodDozNHB4fS5tYXQtc3Ryb2tlZC1idXR0b24gLm1hdC1idXR0b24tcmlwcGxlLm1hdC1yaXBwbGUsLm1hdC1zdHJva2VkLWJ1dHRvbiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e3RvcDotMXB4O2xlZnQ6LTFweDtyaWdodDotMXB4O2JvdHRvbTotMXB4fS5tYXQtZmFie2JveC1zaXppbmc6Ym9yZGVyLWJveDtwb3NpdGlvbjpyZWxhdGl2ZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7Y3Vyc29yOnBvaW50ZXI7b3V0bGluZTpub25lO2JvcmRlcjpub25lOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDtkaXNwbGF5OmlubGluZS1ibG9jazt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7dGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luOjA7bWluLXdpZHRoOjY0cHg7bGluZS1oZWlnaHQ6MzZweDtwYWRkaW5nOjAgMTZweDtib3JkZXItcmFkaXVzOjRweDtvdmVyZmxvdzp2aXNpYmxlO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLCAwLCAwKTt0cmFuc2l0aW9uOmJhY2tncm91bmQgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYm94LXNoYWRvdyAyODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO21pbi13aWR0aDowO2JvcmRlci1yYWRpdXM6NTAlO3dpZHRoOjU2cHg7aGVpZ2h0OjU2cHg7cGFkZGluZzowO2ZsZXgtc2hyaW5rOjB9Lm1hdC1mYWI6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1mYWIubWF0LWJ1dHRvbi1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdH0ubWF0LWZhYi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtZmFiLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4xMn0ubWF0LWZhYjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LWZhYnt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC1mYWIgLm1hdC1idXR0b24td3JhcHBlcntwYWRkaW5nOjE2cHggMDtkaXNwbGF5OmlubGluZS1ibG9jaztsaW5lLWhlaWdodDoyNHB4fS5tYXQtbWluaS1mYWJ7Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MDttaW4td2lkdGg6NjRweDtsaW5lLWhlaWdodDozNnB4O3BhZGRpbmc6MCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O292ZXJmbG93OnZpc2libGU7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApO3RyYW5zaXRpb246YmFja2dyb3VuZCA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxib3gtc2hhZG93IDI4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7bWluLXdpZHRoOjA7Ym9yZGVyLXJhZGl1czo1MCU7d2lkdGg6NDBweDtoZWlnaHQ6NDBweDtwYWRkaW5nOjA7ZmxleC1zaHJpbms6MH0ubWF0LW1pbmktZmFiOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtbWluaS1mYWIubWF0LWJ1dHRvbi1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdH0ubWF0LW1pbmktZmFiLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1taW5pLWZhYi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTouMTJ9Lm1hdC1taW5pLWZhYjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LW1pbmktZmFie3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LW1pbmktZmFiIC5tYXQtYnV0dG9uLXdyYXBwZXJ7cGFkZGluZzo4cHggMDtkaXNwbGF5OmlubGluZS1ibG9jaztsaW5lLWhlaWdodDoyNHB4fS5tYXQtaWNvbi1idXR0b257cGFkZGluZzowO21pbi13aWR0aDowO3dpZHRoOjQwcHg7aGVpZ2h0OjQwcHg7ZmxleC1zaHJpbms6MDtsaW5lLWhlaWdodDo0MHB4O2JvcmRlci1yYWRpdXM6NTAlfS5tYXQtaWNvbi1idXR0b24gaSwubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbntsaW5lLWhlaWdodDoyNHB4fS5tYXQtYnV0dG9uLXJpcHBsZS5tYXQtcmlwcGxlLC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6bm9uZTtib3JkZXItcmFkaXVzOmluaGVyaXR9Lm1hdC1idXR0b24tcmlwcGxlLm1hdC1yaXBwbGU6bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5OjA7dHJhbnNpdGlvbjpvcGFjaXR5IDIwMG1zIGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKSxiYWNrZ3JvdW5kLWNvbG9yIDIwMG1zIGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1idXR0b24tcmlwcGxlLXJvdW5ke2JvcmRlci1yYWRpdXM6NTAlO3otaW5kZXg6MX0ubWF0LWJ1dHRvbiAubWF0LWJ1dHRvbi13cmFwcGVyPiosLm1hdC1mbGF0LWJ1dHRvbiAubWF0LWJ1dHRvbi13cmFwcGVyPiosLm1hdC1zdHJva2VkLWJ1dHRvbiAubWF0LWJ1dHRvbi13cmFwcGVyPiosLm1hdC1yYWlzZWQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LWljb24tYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LWZhYiAubWF0LWJ1dHRvbi13cmFwcGVyPiosLm1hdC1taW5pLWZhYiAubWF0LWJ1dHRvbi13cmFwcGVyPip7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtZm9ybS1maWVsZDpub3QoLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5KSAubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbi1idXR0b24sLm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbntkaXNwbGF5OmlubGluZS1mbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO2ZvbnQtc2l6ZTppbmhlcml0O3dpZHRoOjIuNWVtO2hlaWdodDoyLjVlbX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mbGF0LWJ1dHRvbiwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtcmFpc2VkLWJ1dHRvbiwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtaWNvbi1idXR0b24sLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZhYiwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtbWluaS1mYWJ7b3V0bGluZTpzb2xpZCAxcHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJ1dHRvbi1iYXNlLmNkay1rZXlib2FyZC1mb2N1c2VkLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24tYmFzZS5jZGstcHJvZ3JhbS1mb2N1c2Vke291dGxpbmU6c29saWQgM3B4fVxuIixxSD1bIm1hdC1idXR0b24iLCJtYXQtZmxhdC1idXR0b24iLCJtYXQtaWNvbi1idXR0b24iLCJtYXQtcmFpc2VkLWJ1dHRvbiIsIm1hdC1zdHJva2VkLWJ1dHRvbiIsIm1hdC1taW5pLWZhYiIsIm1hdC1mYWIiXSxaSD1KSShLSShRSShjbGFzc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl9lbGVtZW50UmVmPXR9fSkpKTtjbGFzcyBYSCBleHRlbmRzIFpIe2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcih0KSx0aGlzLl9mb2N1c01vbml0b3I9ZSx0aGlzLl9hbmltYXRpb25Nb2RlPW4sdGhpcy5pc1JvdW5kQnV0dG9uPXRoaXMuX2hhc0hvc3RBdHRyaWJ1dGVzKCJtYXQtZmFiIiwibWF0LW1pbmktZmFiIiksdGhpcy5pc0ljb25CdXR0b249dGhpcy5faGFzSG9zdEF0dHJpYnV0ZXMoIm1hdC1pY29uLWJ1dHRvbiIpO2Zvcihjb25zdCB0IG9mIHFIKXRoaXMuX2hhc0hvc3RBdHRyaWJ1dGVzKHQpJiZ0aGlzLl9nZXRIb3N0RWxlbWVudCgpLmNsYXNzTGlzdC5hZGQodCk7dC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoIm1hdC1idXR0b24tYmFzZSIpLHRoaXMuaXNSb3VuZEJ1dHRvbiYmKHRoaXMuY29sb3I9ImFjY2VudCIpfW5nQWZ0ZXJWaWV3SW5pdCgpe3RoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHRoaXMuX2VsZW1lbnRSZWYsITApfW5nT25EZXN0cm95KCl7dGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKHRoaXMuX2VsZW1lbnRSZWYpfWZvY3VzKHQsZSl7dD90aGlzLl9mb2N1c01vbml0b3IuZm9jdXNWaWEodGhpcy5fZ2V0SG9zdEVsZW1lbnQoKSx0LGUpOnRoaXMuX2dldEhvc3RFbGVtZW50KCkuZm9jdXMoZSl9X2dldEhvc3RFbGVtZW50KCl7cmV0dXJuIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudH1faXNSaXBwbGVEaXNhYmxlZCgpe3JldHVybiB0aGlzLmRpc2FibGVSaXBwbGV8fHRoaXMuZGlzYWJsZWR9X2hhc0hvc3RBdHRyaWJ1dGVzKC4uLnQpe3JldHVybiB0LnNvbWUoKHQ9PnRoaXMuX2dldEhvc3RFbGVtZW50KCkuaGFzQXR0cmlidXRlKHQpKSl9fVhILsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxYSCkoU20oaGcpLFNtKFNJKSxTbShWUCw4KSl9LFhILsm1Y21wPXRvKHt0eXBlOlhILHNlbGVjdG9yczpbWyJidXR0b24iLCJtYXQtYnV0dG9uIiwiIl0sWyJidXR0b24iLCJtYXQtcmFpc2VkLWJ1dHRvbiIsIiJdLFsiYnV0dG9uIiwibWF0LWljb24tYnV0dG9uIiwiIl0sWyJidXR0b24iLCJtYXQtZmFiIiwiIl0sWyJidXR0b24iLCJtYXQtbWluaS1mYWIiLCIiXSxbImJ1dHRvbiIsIm1hdC1zdHJva2VkLWJ1dHRvbiIsIiJdLFsiYnV0dG9uIiwibWF0LWZsYXQtYnV0dG9uIiwiIl1dLHZpZXdRdWVyeTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiZRaChrSCw1KSwyJmUpe2xldCB0O0poKHQ9dGIoKSkmJihuLnJpcHBsZT10LmZpcnN0KX19LGhvc3RBdHRyczpbMSwibWF0LWZvY3VzLWluZGljYXRvciJdLGhvc3RWYXJzOjUsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJihqcCgiZGlzYWJsZWQiLG4uZGlzYWJsZWR8fG51bGwpLHB1KCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsIk5vb3BBbmltYXRpb25zIj09PW4uX2FuaW1hdGlvbk1vZGUpKCJtYXQtYnV0dG9uLWRpc2FibGVkIixuLmRpc2FibGVkKSl9LGlucHV0czp7ZGlzYWJsZWQ6ImRpc2FibGVkIixkaXNhYmxlUmlwcGxlOiJkaXNhYmxlUmlwcGxlIixjb2xvcjoiY29sb3IifSxleHBvcnRBczpbIm1hdEJ1dHRvbiJdLGZlYXR1cmVzOlt4cF0sYXR0cnM6R0gsbmdDb250ZW50U2VsZWN0b3JzOldILGRlY2xzOjQsdmFyczo1LGNvbnN0czpbWzEsIm1hdC1idXR0b24td3JhcHBlciJdLFsibWF0UmlwcGxlIiwiIiwxLCJtYXQtYnV0dG9uLXJpcHBsZSIsMywibWF0UmlwcGxlRGlzYWJsZWQiLCJtYXRSaXBwbGVDZW50ZXJlZCIsIm1hdFJpcHBsZVRyaWdnZXIiXSxbMSwibWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5Il1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabSgpLFJtKDAsInNwYW4iLDApLFhtKDEpLEFtKCksVG0oMiwic3BhbiIsMSksVG0oMywic3BhbiIsMikpLDImZSYmKHJjKDIpLHB1KCJtYXQtYnV0dG9uLXJpcHBsZS1yb3VuZCIsbi5pc1JvdW5kQnV0dG9ufHxuLmlzSWNvbkJ1dHRvbiksRG0oIm1hdFJpcHBsZURpc2FibGVkIixuLl9pc1JpcHBsZURpc2FibGVkKCkpKCJtYXRSaXBwbGVDZW50ZXJlZCIsbi5pc0ljb25CdXR0b24pKCJtYXRSaXBwbGVUcmlnZ2VyIixuLl9nZXRIb3N0RWxlbWVudCgpKSl9LGRpcmVjdGl2ZXM6W2tIXSxzdHlsZXM6W1lIXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSxYSC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpTSX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dLFhILnByb3BEZWNvcmF0b3JzPXtyaXBwbGU6W3t0eXBlOlphLGFyZ3M6W2tIXX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFhILFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImJ1dHRvblttYXQtYnV0dG9uXSwgYnV0dG9uW21hdC1yYWlzZWQtYnV0dG9uXSwgYnV0dG9uW21hdC1pY29uLWJ1dHRvbl0sXG4gICAgICAgICAgICAgYnV0dG9uW21hdC1mYWJdLCBidXR0b25bbWF0LW1pbmktZmFiXSwgYnV0dG9uW21hdC1zdHJva2VkLWJ1dHRvbl0sXG4gICAgICAgICAgICAgYnV0dG9uW21hdC1mbGF0LWJ1dHRvbl0iLGV4cG9ydEFzOiJtYXRCdXR0b24iLGhvc3Q6eyJbYXR0ci5kaXNhYmxlZF0iOiJkaXNhYmxlZCB8fCBudWxsIiwiW2NsYXNzLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlXSI6J19hbmltYXRpb25Nb2RlID09PSAiTm9vcEFuaW1hdGlvbnMiJywiW2NsYXNzLm1hdC1idXR0b24tZGlzYWJsZWRdIjoiZGlzYWJsZWQiLGNsYXNzOiJtYXQtZm9jdXMtaW5kaWNhdG9yIn0sdGVtcGxhdGU6JzxzcGFuIGNsYXNzPSJtYXQtYnV0dG9uLXdyYXBwZXIiPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L3NwYW4+XG48c3BhbiBtYXRSaXBwbGUgY2xhc3M9Im1hdC1idXR0b24tcmlwcGxlIlxuICAgICAgW2NsYXNzLm1hdC1idXR0b24tcmlwcGxlLXJvdW5kXT0iaXNSb3VuZEJ1dHRvbiB8fCBpc0ljb25CdXR0b24iXG4gICAgICBbbWF0UmlwcGxlRGlzYWJsZWRdPSJfaXNSaXBwbGVEaXNhYmxlZCgpIlxuICAgICAgW21hdFJpcHBsZUNlbnRlcmVkXT0iaXNJY29uQnV0dG9uIlxuICAgICAgW21hdFJpcHBsZVRyaWdnZXJdPSJfZ2V0SG9zdEVsZW1lbnQoKSI+PC9zcGFuPlxuPHNwYW4gY2xhc3M9Im1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSI+PC9zcGFuPlxuJyxpbnB1dHM6WyJkaXNhYmxlZCIsImRpc2FibGVSaXBwbGUiLCJjb2xvciJdLGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLHN0eWxlczpbIi5tYXQtYnV0dG9uIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6MH0ubWF0LWJ1dHRvbjpob3Zlcjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbjpob3Zlcjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTouMDR9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWJ1dHRvbjpob3Zlcjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbjpob3Zlcjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTowfX0ubWF0LWJ1dHRvbiwubWF0LWljb24tYnV0dG9uLC5tYXQtc3Ryb2tlZC1idXR0b24sLm1hdC1mbGF0LWJ1dHRvbntib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtib3JkZXI6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjowO21pbi13aWR0aDo2NHB4O2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LWljb24tYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtc3Ryb2tlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1mbGF0LWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtaWNvbi1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5tYXQtYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1idXR0b24uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1mbGF0LWJ1dHRvbi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtZmxhdC1idXR0b24uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjEyfS5tYXQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtaWNvbi1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1zdHJva2VkLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LWZsYXQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtcmFpc2VkLWJ1dHRvbntib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtib3JkZXI6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjowO21pbi13aWR0aDo2NHB4O2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7b3ZlcmZsb3c6dmlzaWJsZTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKX0ubWF0LXJhaXNlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1idXR0b24tZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHR9Lm1hdC1yYWlzZWQtYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1yYWlzZWQtYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4xMn0ubWF0LXJhaXNlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1yYWlzZWQtYnV0dG9ue3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXN0cm9rZWQtYnV0dG9ue2JvcmRlcjoxcHggc29saWQgY3VycmVudENvbG9yO3BhZGRpbmc6MCAxNXB4O2xpbmUtaGVpZ2h0OjM0cHh9Lm1hdC1zdHJva2VkLWJ1dHRvbiAubWF0LWJ1dHRvbi1yaXBwbGUubWF0LXJpcHBsZSwubWF0LXN0cm9rZWQtYnV0dG9uIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7dG9wOi0xcHg7bGVmdDotMXB4O3JpZ2h0Oi0xcHg7Ym90dG9tOi0xcHh9Lm1hdC1mYWJ7Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MDttaW4td2lkdGg6NjRweDtsaW5lLWhlaWdodDozNnB4O3BhZGRpbmc6MCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O292ZXJmbG93OnZpc2libGU7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApO3RyYW5zaXRpb246YmFja2dyb3VuZCA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxib3gtc2hhZG93IDI4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7bWluLXdpZHRoOjA7Ym9yZGVyLXJhZGl1czo1MCU7d2lkdGg6NTZweDtoZWlnaHQ6NTZweDtwYWRkaW5nOjA7ZmxleC1zaHJpbms6MH0ubWF0LWZhYjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LWZhYi5tYXQtYnV0dG9uLWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5tYXQtZmFiLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1mYWIuY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjEyfS5tYXQtZmFiOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtZmFie3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LWZhYiAubWF0LWJ1dHRvbi13cmFwcGVye3BhZGRpbmc6MTZweCAwO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1taW5pLWZhYntib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtib3JkZXI6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjowO21pbi13aWR0aDo2NHB4O2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7b3ZlcmZsb3c6dmlzaWJsZTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTttaW4td2lkdGg6MDtib3JkZXItcmFkaXVzOjUwJTt3aWR0aDo0MHB4O2hlaWdodDo0MHB4O3BhZGRpbmc6MDtmbGV4LXNocmluazowfS5tYXQtbWluaS1mYWI6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1taW5pLWZhYi5tYXQtYnV0dG9uLWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5tYXQtbWluaS1mYWIuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LW1pbmktZmFiLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4xMn0ubWF0LW1pbmktZmFiOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtbWluaS1mYWJ7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtbWluaS1mYWIgLm1hdC1idXR0b24td3JhcHBlcntwYWRkaW5nOjhweCAwO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1pY29uLWJ1dHRvbntwYWRkaW5nOjA7bWluLXdpZHRoOjA7d2lkdGg6NDBweDtoZWlnaHQ6NDBweDtmbGV4LXNocmluazowO2xpbmUtaGVpZ2h0OjQwcHg7Ym9yZGVyLXJhZGl1czo1MCV9Lm1hdC1pY29uLWJ1dHRvbiBpLC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29ue2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1idXR0b24tcmlwcGxlLm1hdC1yaXBwbGUsLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlci1yYWRpdXM6aW5oZXJpdH0ubWF0LWJ1dHRvbi1yaXBwbGUubWF0LXJpcHBsZTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgMjAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpLGJhY2tncm91bmQtY29sb3IgMjAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e3RyYW5zaXRpb246bm9uZX0ubWF0LWJ1dHRvbi1yaXBwbGUtcm91bmR7Ym9yZGVyLXJhZGl1czo1MCU7ei1pbmRleDoxfS5tYXQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LWZsYXQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LXN0cm9rZWQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LXJhaXNlZC1idXR0b24gLm1hdC1idXR0b24td3JhcHBlcj4qLC5tYXQtaWNvbi1idXR0b24gLm1hdC1idXR0b24td3JhcHBlcj4qLC5tYXQtZmFiIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LW1pbmktZmFiIC5tYXQtYnV0dG9uLXdyYXBwZXI+Knt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Lm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiwubWF0LWZvcm0tZmllbGQ6bm90KC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSkgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb24tYnV0dG9ue2Rpc3BsYXk6aW5saW5lLWZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7Zm9udC1zaXplOmluaGVyaXQ7d2lkdGg6Mi41ZW07aGVpZ2h0OjIuNWVtfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24sLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZsYXQtYnV0dG9uLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1yYWlzZWQtYnV0dG9uLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1pY29uLWJ1dHRvbiwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZmFiLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1taW5pLWZhYntvdXRsaW5lOnNvbGlkIDFweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLWJhc2UuY2RrLWtleWJvYXJkLWZvY3VzZWQsLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJ1dHRvbi1iYXNlLmNkay1wcm9ncmFtLWZvY3VzZWR7b3V0bGluZTpzb2xpZCAzcHh9XG4iXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTpTSX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dfSkse3JpcHBsZTpbe3R5cGU6WmEsYXJnczpba0hdfV19KTtjbGFzcyBLSCBleHRlbmRzIFhIe2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihlLHQsbil9X2hhbHREaXNhYmxlZEV2ZW50cyh0KXt0aGlzLmRpc2FibGVkJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkpfX1LSC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8S0gpKFNtKFNJKSxTbShoZyksU20oVlAsOCkpfSxLSC7JtWNtcD10byh7dHlwZTpLSCxzZWxlY3RvcnM6W1siYSIsIm1hdC1idXR0b24iLCIiXSxbImEiLCJtYXQtcmFpc2VkLWJ1dHRvbiIsIiJdLFsiYSIsIm1hdC1pY29uLWJ1dHRvbiIsIiJdLFsiYSIsIm1hdC1mYWIiLCIiXSxbImEiLCJtYXQtbWluaS1mYWIiLCIiXSxbImEiLCJtYXQtc3Ryb2tlZC1idXR0b24iLCIiXSxbImEiLCJtYXQtZmxhdC1idXR0b24iLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtZm9jdXMtaW5kaWNhdG9yIl0saG9zdFZhcnM6Nyxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezEmZSYmVm0oImNsaWNrIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5faGFsdERpc2FibGVkRXZlbnRzKGUpfSkpLDImZSYmKGpwKCJ0YWJpbmRleCIsbi5kaXNhYmxlZD8tMTpuLnRhYkluZGV4fHwwKSgiZGlzYWJsZWQiLG4uZGlzYWJsZWR8fG51bGwpKCJhcmlhLWRpc2FibGVkIixuLmRpc2FibGVkLnRvU3RyaW5nKCkpLHB1KCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsIk5vb3BBbmltYXRpb25zIj09PW4uX2FuaW1hdGlvbk1vZGUpKCJtYXQtYnV0dG9uLWRpc2FibGVkIixuLmRpc2FibGVkKSl9LGlucHV0czp7ZGlzYWJsZWQ6ImRpc2FibGVkIixkaXNhYmxlUmlwcGxlOiJkaXNhYmxlUmlwcGxlIixjb2xvcjoiY29sb3IiLHRhYkluZGV4OiJ0YWJJbmRleCJ9LGV4cG9ydEFzOlsibWF0QnV0dG9uIiwibWF0QW5jaG9yIl0sZmVhdHVyZXM6W3hwXSxhdHRyczpHSCxuZ0NvbnRlbnRTZWxlY3RvcnM6V0gsZGVjbHM6NCx2YXJzOjUsY29uc3RzOltbMSwibWF0LWJ1dHRvbi13cmFwcGVyIl0sWyJtYXRSaXBwbGUiLCIiLDEsIm1hdC1idXR0b24tcmlwcGxlIiwzLCJtYXRSaXBwbGVEaXNhYmxlZCIsIm1hdFJpcHBsZUNlbnRlcmVkIiwibWF0UmlwcGxlVHJpZ2dlciJdLFsxLCJtYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXkiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFptKCksUm0oMCwic3BhbiIsMCksWG0oMSksQW0oKSxUbSgyLCJzcGFuIiwxKSxUbSgzLCJzcGFuIiwyKSksMiZlJiYocmMoMikscHUoIm1hdC1idXR0b24tcmlwcGxlLXJvdW5kIixuLmlzUm91bmRCdXR0b258fG4uaXNJY29uQnV0dG9uKSxEbSgibWF0UmlwcGxlRGlzYWJsZWQiLG4uX2lzUmlwcGxlRGlzYWJsZWQoKSkoIm1hdFJpcHBsZUNlbnRlcmVkIixuLmlzSWNvbkJ1dHRvbikoIm1hdFJpcHBsZVRyaWdnZXIiLG4uX2dldEhvc3RFbGVtZW50KCkpKX0sZGlyZWN0aXZlczpba0hdLHN0eWxlczpbWUhdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLEtILmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6U0l9LHt0eXBlOmhnfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV0sS0gucHJvcERlY29yYXRvcnM9e3RhYkluZGV4Olt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEtILFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImFbbWF0LWJ1dHRvbl0sIGFbbWF0LXJhaXNlZC1idXR0b25dLCBhW21hdC1pY29uLWJ1dHRvbl0sIGFbbWF0LWZhYl0sXG4gICAgICAgICAgICAgYVttYXQtbWluaS1mYWJdLCBhW21hdC1zdHJva2VkLWJ1dHRvbl0sIGFbbWF0LWZsYXQtYnV0dG9uXSIsZXhwb3J0QXM6Im1hdEJ1dHRvbiwgbWF0QW5jaG9yIixob3N0OnsiW2F0dHIudGFiaW5kZXhdIjoiZGlzYWJsZWQgPyAtMSA6ICh0YWJJbmRleCB8fCAwKSIsIlthdHRyLmRpc2FibGVkXSI6ImRpc2FibGVkIHx8IG51bGwiLCJbYXR0ci5hcmlhLWRpc2FibGVkXSI6ImRpc2FibGVkLnRvU3RyaW5nKCkiLCIoY2xpY2spIjoiX2hhbHREaXNhYmxlZEV2ZW50cygkZXZlbnQpIiwiW2NsYXNzLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlXSI6J19hbmltYXRpb25Nb2RlID09PSAiTm9vcEFuaW1hdGlvbnMiJywiW2NsYXNzLm1hdC1idXR0b24tZGlzYWJsZWRdIjoiZGlzYWJsZWQiLGNsYXNzOiJtYXQtZm9jdXMtaW5kaWNhdG9yIn0saW5wdXRzOlsiZGlzYWJsZWQiLCJkaXNhYmxlUmlwcGxlIiwiY29sb3IiXSx0ZW1wbGF0ZTonPHNwYW4gY2xhc3M9Im1hdC1idXR0b24td3JhcHBlciI+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50Pjwvc3Bhbj5cbjxzcGFuIG1hdFJpcHBsZSBjbGFzcz0ibWF0LWJ1dHRvbi1yaXBwbGUiXG4gICAgICBbY2xhc3MubWF0LWJ1dHRvbi1yaXBwbGUtcm91bmRdPSJpc1JvdW5kQnV0dG9uIHx8IGlzSWNvbkJ1dHRvbiJcbiAgICAgIFttYXRSaXBwbGVEaXNhYmxlZF09Il9pc1JpcHBsZURpc2FibGVkKCkiXG4gICAgICBbbWF0UmlwcGxlQ2VudGVyZWRdPSJpc0ljb25CdXR0b24iXG4gICAgICBbbWF0UmlwcGxlVHJpZ2dlcl09Il9nZXRIb3N0RWxlbWVudCgpIj48L3NwYW4+XG48c3BhbiBjbGFzcz0ibWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5Ij48L3NwYW4+XG4nLGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLHN0eWxlczpbIi5tYXQtYnV0dG9uIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6MH0ubWF0LWJ1dHRvbjpob3Zlcjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbjpob3Zlcjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTouMDR9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWJ1dHRvbjpob3Zlcjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbjpob3Zlcjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTowfX0ubWF0LWJ1dHRvbiwubWF0LWljb24tYnV0dG9uLC5tYXQtc3Ryb2tlZC1idXR0b24sLm1hdC1mbGF0LWJ1dHRvbntib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtib3JkZXI6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjowO21pbi13aWR0aDo2NHB4O2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LWljb24tYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtc3Ryb2tlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1mbGF0LWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtaWNvbi1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5tYXQtYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1idXR0b24uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1mbGF0LWJ1dHRvbi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtZmxhdC1idXR0b24uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjEyfS5tYXQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtaWNvbi1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1zdHJva2VkLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LWZsYXQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtcmFpc2VkLWJ1dHRvbntib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtib3JkZXI6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjowO21pbi13aWR0aDo2NHB4O2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7b3ZlcmZsb3c6dmlzaWJsZTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKX0ubWF0LXJhaXNlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1idXR0b24tZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHR9Lm1hdC1yYWlzZWQtYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1yYWlzZWQtYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4xMn0ubWF0LXJhaXNlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1yYWlzZWQtYnV0dG9ue3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXN0cm9rZWQtYnV0dG9ue2JvcmRlcjoxcHggc29saWQgY3VycmVudENvbG9yO3BhZGRpbmc6MCAxNXB4O2xpbmUtaGVpZ2h0OjM0cHh9Lm1hdC1zdHJva2VkLWJ1dHRvbiAubWF0LWJ1dHRvbi1yaXBwbGUubWF0LXJpcHBsZSwubWF0LXN0cm9rZWQtYnV0dG9uIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7dG9wOi0xcHg7bGVmdDotMXB4O3JpZ2h0Oi0xcHg7Ym90dG9tOi0xcHh9Lm1hdC1mYWJ7Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MDttaW4td2lkdGg6NjRweDtsaW5lLWhlaWdodDozNnB4O3BhZGRpbmc6MCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O292ZXJmbG93OnZpc2libGU7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApO3RyYW5zaXRpb246YmFja2dyb3VuZCA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxib3gtc2hhZG93IDI4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7bWluLXdpZHRoOjA7Ym9yZGVyLXJhZGl1czo1MCU7d2lkdGg6NTZweDtoZWlnaHQ6NTZweDtwYWRkaW5nOjA7ZmxleC1zaHJpbms6MH0ubWF0LWZhYjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LWZhYi5tYXQtYnV0dG9uLWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5tYXQtZmFiLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1mYWIuY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjEyfS5tYXQtZmFiOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtZmFie3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LWZhYiAubWF0LWJ1dHRvbi13cmFwcGVye3BhZGRpbmc6MTZweCAwO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1taW5pLWZhYntib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtib3JkZXI6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjowO21pbi13aWR0aDo2NHB4O2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7b3ZlcmZsb3c6dmlzaWJsZTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTttaW4td2lkdGg6MDtib3JkZXItcmFkaXVzOjUwJTt3aWR0aDo0MHB4O2hlaWdodDo0MHB4O3BhZGRpbmc6MDtmbGV4LXNocmluazowfS5tYXQtbWluaS1mYWI6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1taW5pLWZhYi5tYXQtYnV0dG9uLWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5tYXQtbWluaS1mYWIuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LW1pbmktZmFiLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4xMn0ubWF0LW1pbmktZmFiOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtbWluaS1mYWJ7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtbWluaS1mYWIgLm1hdC1idXR0b24td3JhcHBlcntwYWRkaW5nOjhweCAwO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1pY29uLWJ1dHRvbntwYWRkaW5nOjA7bWluLXdpZHRoOjA7d2lkdGg6NDBweDtoZWlnaHQ6NDBweDtmbGV4LXNocmluazowO2xpbmUtaGVpZ2h0OjQwcHg7Ym9yZGVyLXJhZGl1czo1MCV9Lm1hdC1pY29uLWJ1dHRvbiBpLC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29ue2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1idXR0b24tcmlwcGxlLm1hdC1yaXBwbGUsLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlci1yYWRpdXM6aW5oZXJpdH0ubWF0LWJ1dHRvbi1yaXBwbGUubWF0LXJpcHBsZTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgMjAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpLGJhY2tncm91bmQtY29sb3IgMjAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e3RyYW5zaXRpb246bm9uZX0ubWF0LWJ1dHRvbi1yaXBwbGUtcm91bmR7Ym9yZGVyLXJhZGl1czo1MCU7ei1pbmRleDoxfS5tYXQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LWZsYXQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LXN0cm9rZWQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LXJhaXNlZC1idXR0b24gLm1hdC1idXR0b24td3JhcHBlcj4qLC5tYXQtaWNvbi1idXR0b24gLm1hdC1idXR0b24td3JhcHBlcj4qLC5tYXQtZmFiIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LW1pbmktZmFiIC5tYXQtYnV0dG9uLXdyYXBwZXI+Knt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Lm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiwubWF0LWZvcm0tZmllbGQ6bm90KC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSkgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb24tYnV0dG9ue2Rpc3BsYXk6aW5saW5lLWZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7Zm9udC1zaXplOmluaGVyaXQ7d2lkdGg6Mi41ZW07aGVpZ2h0OjIuNWVtfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24sLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZsYXQtYnV0dG9uLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1yYWlzZWQtYnV0dG9uLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1pY29uLWJ1dHRvbiwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZmFiLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1taW5pLWZhYntvdXRsaW5lOnNvbGlkIDFweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLWJhc2UuY2RrLWtleWJvYXJkLWZvY3VzZWQsLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJ1dHRvbi1iYXNlLmNkay1wcm9ncmFtLWZvY3VzZWR7b3V0bGluZTpzb2xpZCAzcHh9XG4iXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlNJfSx7dHlwZTpoZ30se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dfSkse3RhYkluZGV4Olt7dHlwZTp4eX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBKSHt9SkguybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEpIKX0sSkguybVtb2Q9YW8oe3R5cGU6Skh9KSxKSC7JtWluaj12bih7aW1wb3J0czpbW1NILFhJXSxYSV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEpILFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbU0gsWEldLGV4cG9ydHM6W1hILEtILFhJXSxkZWNsYXJhdGlvbnM6W1hILEtIXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKEpILHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bWEgsS0hdfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1NILFhJXX0sZXhwb3J0czpmdW5jdGlvbigpe3JldHVybltYSCxLSCxYSV19fSk7Y2xhc3MgUUh7fWZ1bmN0aW9uICRIKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5jb25uZWN0fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyB0RiBleHRlbmRzIFFIe2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5fZGF0YT10fWNvbm5lY3QoKXtyZXR1cm4gTnQodGhpcy5fZGF0YSk/dGhpcy5fZGF0YTpFdCh0aGlzLl9kYXRhKX1kaXNjb25uZWN0KCl7fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIGVGe2FwcGx5Q2hhbmdlcyh0LGUsbixvLGkpe3QuZm9yRWFjaE9wZXJhdGlvbigoKHQsbyxhKT0+e2xldCByLHM7aWYobnVsbD09dC5wcmV2aW91c0luZGV4KXtjb25zdCBpPW4odCxvLGEpO3I9ZS5jcmVhdGVFbWJlZGRlZFZpZXcoaS50ZW1wbGF0ZVJlZixpLmNvbnRleHQsaS5pbmRleCkscz0xfWVsc2UgbnVsbD09YT8oZS5yZW1vdmUobykscz0zKToocj1lLmdldChvKSxlLm1vdmUocixhKSxzPTIpO2kmJmkoe2NvbnRleHQ6bnVsbD09cj92b2lkIDA6ci5jb250ZXh0LG9wZXJhdGlvbjpzLHJlY29yZDp0fSl9KSl9ZGV0YWNoKCl7fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgbkZ7Y29uc3RydWN0b3IoKXt0aGlzLnZpZXdDYWNoZVNpemU9MjAsdGhpcy5fdmlld0NhY2hlPVtdfWFwcGx5Q2hhbmdlcyh0LGUsbixvLGkpe3QuZm9yRWFjaE9wZXJhdGlvbigoKHQsYSxyKT0+e2xldCBzLGw7bnVsbD09dC5wcmV2aW91c0luZGV4PyhzPXRoaXMuX2luc2VydFZpZXcoKCgpPT5uKHQsYSxyKSkscixlLG8odCkpLGw9cz8xOjApOm51bGw9PXI/KHRoaXMuX2RldGFjaEFuZENhY2hlVmlldyhhLGUpLGw9Myk6KHM9dGhpcy5fbW92ZVZpZXcoYSxyLGUsbyh0KSksbD0yKSxpJiZpKHtjb250ZXh0Om51bGw9PXM/dm9pZCAwOnMuY29udGV4dCxvcGVyYXRpb246bCxyZWNvcmQ6dH0pfSkpfWRldGFjaCgpe2Zvcihjb25zdCB0IG9mIHRoaXMuX3ZpZXdDYWNoZSl0LmRlc3Ryb3koKTt0aGlzLl92aWV3Q2FjaGU9W119X2luc2VydFZpZXcodCxlLG4sbyl7Y29uc3QgaT10aGlzLl9pbnNlcnRWaWV3RnJvbUNhY2hlKGUsbik7aWYoaSlyZXR1cm4gdm9pZChpLmNvbnRleHQuJGltcGxpY2l0PW8pO2NvbnN0IGE9dCgpO3JldHVybiBuLmNyZWF0ZUVtYmVkZGVkVmlldyhhLnRlbXBsYXRlUmVmLGEuY29udGV4dCxhLmluZGV4KX1fZGV0YWNoQW5kQ2FjaGVWaWV3KHQsZSl7Y29uc3Qgbj1lLmRldGFjaCh0KTt0aGlzLl9tYXliZUNhY2hlVmlldyhuLGUpfV9tb3ZlVmlldyh0LGUsbixvKXtjb25zdCBpPW4uZ2V0KHQpO3JldHVybiBuLm1vdmUoaSxlKSxpLmNvbnRleHQuJGltcGxpY2l0PW8saX1fbWF5YmVDYWNoZVZpZXcodCxlKXtpZih0aGlzLl92aWV3Q2FjaGUubGVuZ3RoPHRoaXMudmlld0NhY2hlU2l6ZSl0aGlzLl92aWV3Q2FjaGUucHVzaCh0KTtlbHNle2NvbnN0IG49ZS5pbmRleE9mKHQpOy0xPT09bj90LmRlc3Ryb3koKTplLnJlbW92ZShuKX19X2luc2VydFZpZXdGcm9tQ2FjaGUodCxlKXtjb25zdCBuPXRoaXMuX3ZpZXdDYWNoZS5wb3AoKTtyZXR1cm4gbiYmZS5pbnNlcnQobix0KSxufHxudWxsfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3Mgb0Z7Y29uc3RydWN0b3IodD0hMSxlLG49ITApe3RoaXMuX211bHRpcGxlPXQsdGhpcy5fZW1pdENoYW5nZXM9bix0aGlzLl9zZWxlY3Rpb249bmV3IFNldCx0aGlzLl9kZXNlbGVjdGVkVG9FbWl0PVtdLHRoaXMuX3NlbGVjdGVkVG9FbWl0PVtdLHRoaXMuY2hhbmdlZD1uZXcgSSxlJiZlLmxlbmd0aCYmKHQ/ZS5mb3JFYWNoKCh0PT50aGlzLl9tYXJrU2VsZWN0ZWQodCkpKTp0aGlzLl9tYXJrU2VsZWN0ZWQoZVswXSksdGhpcy5fc2VsZWN0ZWRUb0VtaXQubGVuZ3RoPTApfWdldCBzZWxlY3RlZCgpe3JldHVybiB0aGlzLl9zZWxlY3RlZHx8KHRoaXMuX3NlbGVjdGVkPUFycmF5LmZyb20odGhpcy5fc2VsZWN0aW9uLnZhbHVlcygpKSksdGhpcy5fc2VsZWN0ZWR9c2VsZWN0KC4uLnQpe3RoaXMuX3ZlcmlmeVZhbHVlQXNzaWdubWVudCh0KSx0LmZvckVhY2goKHQ9PnRoaXMuX21hcmtTZWxlY3RlZCh0KSkpLHRoaXMuX2VtaXRDaGFuZ2VFdmVudCgpfWRlc2VsZWN0KC4uLnQpe3RoaXMuX3ZlcmlmeVZhbHVlQXNzaWdubWVudCh0KSx0LmZvckVhY2goKHQ9PnRoaXMuX3VubWFya1NlbGVjdGVkKHQpKSksdGhpcy5fZW1pdENoYW5nZUV2ZW50KCl9dG9nZ2xlKHQpe3RoaXMuaXNTZWxlY3RlZCh0KT90aGlzLmRlc2VsZWN0KHQpOnRoaXMuc2VsZWN0KHQpfWNsZWFyKCl7dGhpcy5fdW5tYXJrQWxsKCksdGhpcy5fZW1pdENoYW5nZUV2ZW50KCl9aXNTZWxlY3RlZCh0KXtyZXR1cm4gdGhpcy5fc2VsZWN0aW9uLmhhcyh0KX1pc0VtcHR5KCl7cmV0dXJuIDA9PT10aGlzLl9zZWxlY3Rpb24uc2l6ZX1oYXNWYWx1ZSgpe3JldHVybiF0aGlzLmlzRW1wdHkoKX1zb3J0KHQpe3RoaXMuX211bHRpcGxlJiZ0aGlzLnNlbGVjdGVkJiZ0aGlzLl9zZWxlY3RlZC5zb3J0KHQpfWlzTXVsdGlwbGVTZWxlY3Rpb24oKXtyZXR1cm4gdGhpcy5fbXVsdGlwbGV9X2VtaXRDaGFuZ2VFdmVudCgpe3RoaXMuX3NlbGVjdGVkPW51bGwsKHRoaXMuX3NlbGVjdGVkVG9FbWl0Lmxlbmd0aHx8dGhpcy5fZGVzZWxlY3RlZFRvRW1pdC5sZW5ndGgpJiYodGhpcy5jaGFuZ2VkLm5leHQoe3NvdXJjZTp0aGlzLGFkZGVkOnRoaXMuX3NlbGVjdGVkVG9FbWl0LHJlbW92ZWQ6dGhpcy5fZGVzZWxlY3RlZFRvRW1pdH0pLHRoaXMuX2Rlc2VsZWN0ZWRUb0VtaXQ9W10sdGhpcy5fc2VsZWN0ZWRUb0VtaXQ9W10pfV9tYXJrU2VsZWN0ZWQodCl7dGhpcy5pc1NlbGVjdGVkKHQpfHwodGhpcy5fbXVsdGlwbGV8fHRoaXMuX3VubWFya0FsbCgpLHRoaXMuX3NlbGVjdGlvbi5hZGQodCksdGhpcy5fZW1pdENoYW5nZXMmJnRoaXMuX3NlbGVjdGVkVG9FbWl0LnB1c2godCkpfV91bm1hcmtTZWxlY3RlZCh0KXt0aGlzLmlzU2VsZWN0ZWQodCkmJih0aGlzLl9zZWxlY3Rpb24uZGVsZXRlKHQpLHRoaXMuX2VtaXRDaGFuZ2VzJiZ0aGlzLl9kZXNlbGVjdGVkVG9FbWl0LnB1c2godCkpfV91bm1hcmtBbGwoKXt0aGlzLmlzRW1wdHkoKXx8dGhpcy5fc2VsZWN0aW9uLmZvckVhY2goKHQ9PnRoaXMuX3VubWFya1NlbGVjdGVkKHQpKSl9X3ZlcmlmeVZhbHVlQXNzaWdubWVudCh0KXtpZih0Lmxlbmd0aD4xJiYhdGhpcy5fbXVsdGlwbGUmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSl0aHJvdyhmdW5jdGlvbiBlKCl7cmV0dXJuIEVycm9yKCJDYW5ub3QgcGFzcyBtdWx0aXBsZSB2YWx1ZXMgaW50byBTZWxlY3Rpb25Nb2RlbCB3aXRoIHNpbmdsZS12YWx1ZSBtb2RlLiIpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8pKCl9fWNsYXNzIGlGe2NvbnN0cnVjdG9yKCl7dGhpcy5fbGlzdGVuZXJzPVtdfW5vdGlmeSh0LGUpe2ZvcihsZXQgbiBvZiB0aGlzLl9saXN0ZW5lcnMpbih0LGUpfWxpc3Rlbih0KXtyZXR1cm4gdGhpcy5fbGlzdGVuZXJzLnB1c2godCksKCk9Pnt0aGlzLl9saXN0ZW5lcnM9dGhpcy5fbGlzdGVuZXJzLmZpbHRlcigoZT0+dCE9PWUpKX19bmdPbkRlc3Ryb3koKXt0aGlzLl9saXN0ZW5lcnM9W119fWlGLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxpRil9LGlGLsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIG5ldyBpRn0sdG9rZW46aUYscHJvdmlkZWRJbjoicm9vdCJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGlGLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVybltdfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgYUY9bmV3IEdhKCJfVmlld1JlcGVhdGVyIiksckY9WyJjb250ZW50V3JhcHBlciJdLHNGPW5ldyBHYSgiVklSVFVBTF9TQ1JPTExfU1RSQVRFR1kiKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIGxGe2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLl9zY3JvbGxlZEluZGV4Q2hhbmdlPW5ldyBJLHRoaXMuc2Nyb2xsZWRJbmRleENoYW5nZT10aGlzLl9zY3JvbGxlZEluZGV4Q2hhbmdlLnBpcGUoTWUoKSksdGhpcy5fdmlld3BvcnQ9bnVsbCx0aGlzLl9pdGVtU2l6ZT10LHRoaXMuX21pbkJ1ZmZlclB4PWUsdGhpcy5fbWF4QnVmZmVyUHg9bn1hdHRhY2godCl7dGhpcy5fdmlld3BvcnQ9dCx0aGlzLl91cGRhdGVUb3RhbENvbnRlbnRTaXplKCksdGhpcy5fdXBkYXRlUmVuZGVyZWRSYW5nZSgpfWRldGFjaCgpe3RoaXMuX3Njcm9sbGVkSW5kZXhDaGFuZ2UuY29tcGxldGUoKSx0aGlzLl92aWV3cG9ydD1udWxsfXVwZGF0ZUl0ZW1BbmRCdWZmZXJTaXplKHQsZSxuKXtpZihuPGUmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSl0aHJvdyBFcnJvcigiQ0RLIHZpcnR1YWwgc2Nyb2xsOiBtYXhCdWZmZXJQeCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBtaW5CdWZmZXJQeCIpO3RoaXMuX2l0ZW1TaXplPXQsdGhpcy5fbWluQnVmZmVyUHg9ZSx0aGlzLl9tYXhCdWZmZXJQeD1uLHRoaXMuX3VwZGF0ZVRvdGFsQ29udGVudFNpemUoKSx0aGlzLl91cGRhdGVSZW5kZXJlZFJhbmdlKCl9b25Db250ZW50U2Nyb2xsZWQoKXt0aGlzLl91cGRhdGVSZW5kZXJlZFJhbmdlKCl9b25EYXRhTGVuZ3RoQ2hhbmdlZCgpe3RoaXMuX3VwZGF0ZVRvdGFsQ29udGVudFNpemUoKSx0aGlzLl91cGRhdGVSZW5kZXJlZFJhbmdlKCl9b25Db250ZW50UmVuZGVyZWQoKXt9b25SZW5kZXJlZE9mZnNldENoYW5nZWQoKXt9c2Nyb2xsVG9JbmRleCh0LGUpe3RoaXMuX3ZpZXdwb3J0JiZ0aGlzLl92aWV3cG9ydC5zY3JvbGxUb09mZnNldCh0KnRoaXMuX2l0ZW1TaXplLGUpfV91cGRhdGVUb3RhbENvbnRlbnRTaXplKCl7dGhpcy5fdmlld3BvcnQmJnRoaXMuX3ZpZXdwb3J0LnNldFRvdGFsQ29udGVudFNpemUodGhpcy5fdmlld3BvcnQuZ2V0RGF0YUxlbmd0aCgpKnRoaXMuX2l0ZW1TaXplKX1fdXBkYXRlUmVuZGVyZWRSYW5nZSgpe2lmKCF0aGlzLl92aWV3cG9ydClyZXR1cm47Y29uc3QgdD10aGlzLl92aWV3cG9ydC5nZXRSZW5kZXJlZFJhbmdlKCksZT17c3RhcnQ6dC5zdGFydCxlbmQ6dC5lbmR9LG49dGhpcy5fdmlld3BvcnQuZ2V0Vmlld3BvcnRTaXplKCksbz10aGlzLl92aWV3cG9ydC5nZXREYXRhTGVuZ3RoKCk7bGV0IGk9dGhpcy5fdmlld3BvcnQubWVhc3VyZVNjcm9sbE9mZnNldCgpLGE9dGhpcy5faXRlbVNpemU+MD9pL3RoaXMuX2l0ZW1TaXplOjA7aWYoZS5lbmQ+byl7Y29uc3QgdD1NYXRoLmNlaWwobi90aGlzLl9pdGVtU2l6ZSkscj1NYXRoLm1heCgwLE1hdGgubWluKGEsby10KSk7YSE9ciYmKGE9cixpPXIqdGhpcy5faXRlbVNpemUsZS5zdGFydD1NYXRoLmZsb29yKGEpKSxlLmVuZD1NYXRoLm1heCgwLE1hdGgubWluKG8sZS5zdGFydCt0KSl9Y29uc3Qgcj1pLWUuc3RhcnQqdGhpcy5faXRlbVNpemU7aWYocjx0aGlzLl9taW5CdWZmZXJQeCYmMCE9ZS5zdGFydCl7Y29uc3QgdD1NYXRoLmNlaWwoKHRoaXMuX21heEJ1ZmZlclB4LXIpL3RoaXMuX2l0ZW1TaXplKTtlLnN0YXJ0PU1hdGgubWF4KDAsZS5zdGFydC10KSxlLmVuZD1NYXRoLm1pbihvLE1hdGguY2VpbChhKyhuK3RoaXMuX21pbkJ1ZmZlclB4KS90aGlzLl9pdGVtU2l6ZSkpfWVsc2V7Y29uc3QgdD1lLmVuZCp0aGlzLl9pdGVtU2l6ZS0oaStuKTtpZih0PHRoaXMuX21pbkJ1ZmZlclB4JiZlLmVuZCE9byl7Y29uc3Qgbj1NYXRoLmNlaWwoKHRoaXMuX21heEJ1ZmZlclB4LXQpL3RoaXMuX2l0ZW1TaXplKTtuPjAmJihlLmVuZD1NYXRoLm1pbihvLGUuZW5kK24pLGUuc3RhcnQ9TWF0aC5tYXgoMCxNYXRoLmZsb29yKGEtdGhpcy5fbWluQnVmZmVyUHgvdGhpcy5faXRlbVNpemUpKSl9fXRoaXMuX3ZpZXdwb3J0LnNldFJlbmRlcmVkUmFuZ2UoZSksdGhpcy5fdmlld3BvcnQuc2V0UmVuZGVyZWRDb250ZW50T2Zmc2V0KHRoaXMuX2l0ZW1TaXplKmUuc3RhcnQpLHRoaXMuX3Njcm9sbGVkSW5kZXhDaGFuZ2UubmV4dChNYXRoLmZsb29yKGEpKX19ZnVuY3Rpb24gY0YodCl7cmV0dXJuIHQuX3Njcm9sbFN0cmF0ZWd5fWNsYXNzIGRGe2NvbnN0cnVjdG9yKCl7dGhpcy5faXRlbVNpemU9MjAsdGhpcy5fbWluQnVmZmVyUHg9MTAwLHRoaXMuX21heEJ1ZmZlclB4PTIwMCx0aGlzLl9zY3JvbGxTdHJhdGVneT1uZXcgbEYodGhpcy5pdGVtU2l6ZSx0aGlzLm1pbkJ1ZmZlclB4LHRoaXMubWF4QnVmZmVyUHgpfWdldCBpdGVtU2l6ZSgpe3JldHVybiB0aGlzLl9pdGVtU2l6ZX1zZXQgaXRlbVNpemUodCl7dGhpcy5faXRlbVNpemU9X3oodCl9Z2V0IG1pbkJ1ZmZlclB4KCl7cmV0dXJuIHRoaXMuX21pbkJ1ZmZlclB4fXNldCBtaW5CdWZmZXJQeCh0KXt0aGlzLl9taW5CdWZmZXJQeD1feih0KX1nZXQgbWF4QnVmZmVyUHgoKXtyZXR1cm4gdGhpcy5fbWF4QnVmZmVyUHh9c2V0IG1heEJ1ZmZlclB4KHQpe3RoaXMuX21heEJ1ZmZlclB4PV96KHQpfW5nT25DaGFuZ2VzKCl7dGhpcy5fc2Nyb2xsU3RyYXRlZ3kudXBkYXRlSXRlbUFuZEJ1ZmZlclNpemUodGhpcy5pdGVtU2l6ZSx0aGlzLm1pbkJ1ZmZlclB4LHRoaXMubWF4QnVmZmVyUHgpfX1kRi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8ZEYpfSxkRi7JtWRpcj1sbyh7dHlwZTpkRixzZWxlY3RvcnM6W1siY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0IiwiaXRlbVNpemUiLCIiXV0saW5wdXRzOntpdGVtU2l6ZToiaXRlbVNpemUiLG1pbkJ1ZmZlclB4OiJtaW5CdWZmZXJQeCIsbWF4QnVmZmVyUHg6Im1heEJ1ZmZlclB4In0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTpzRix1c2VGYWN0b3J5OmNGLGRlcHM6W3FlKCgoKT0+ZEYpKV19XSksQm9dfSksZEYucHJvcERlY29yYXRvcnM9e2l0ZW1TaXplOlt7dHlwZTp4eX1dLG1pbkJ1ZmZlclB4Olt7dHlwZTp4eX1dLG1heEJ1ZmZlclB4Olt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGRGLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6ImNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFtpdGVtU2l6ZV0iLHByb3ZpZGVyczpbe3Byb3ZpZGU6c0YsdXNlRmFjdG9yeTpjRixkZXBzOltxZSgoKCk9PmRGKSldfV19XX1dLChmdW5jdGlvbigpe3JldHVybltdfSkse2l0ZW1TaXplOlt7dHlwZTp4eX1dLG1pbkJ1ZmZlclB4Olt7dHlwZTp4eX1dLG1heEJ1ZmZlclB4Olt7dHlwZTp4eX1dfSk7Y2xhc3MgcEZ7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuX25nWm9uZT10LHRoaXMuX3BsYXRmb3JtPWUsdGhpcy5fc2Nyb2xsZWQ9bmV3IEksdGhpcy5fZ2xvYmFsU3Vic2NyaXB0aW9uPW51bGwsdGhpcy5fc2Nyb2xsZWRDb3VudD0wLHRoaXMuc2Nyb2xsQ29udGFpbmVycz1uZXcgTWFwLHRoaXMuX2RvY3VtZW50PW59cmVnaXN0ZXIodCl7dGhpcy5zY3JvbGxDb250YWluZXJzLmhhcyh0KXx8dGhpcy5zY3JvbGxDb250YWluZXJzLnNldCh0LHQuZWxlbWVudFNjcm9sbGVkKCkuc3Vic2NyaWJlKCgoKT0+dGhpcy5fc2Nyb2xsZWQubmV4dCh0KSkpKX1kZXJlZ2lzdGVyKHQpe2NvbnN0IGU9dGhpcy5zY3JvbGxDb250YWluZXJzLmdldCh0KTtlJiYoZS51bnN1YnNjcmliZSgpLHRoaXMuc2Nyb2xsQ29udGFpbmVycy5kZWxldGUodCkpfXNjcm9sbGVkKHQ9MjApe3JldHVybiB0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXI/bmV3IEQoKGU9Pnt0aGlzLl9nbG9iYWxTdWJzY3JpcHRpb258fHRoaXMuX2FkZEdsb2JhbExpc3RlbmVyKCk7Y29uc3Qgbj10PjA/dGhpcy5fc2Nyb2xsZWQucGlwZShkZSh0KSkuc3Vic2NyaWJlKGUpOnRoaXMuX3Njcm9sbGVkLnN1YnNjcmliZShlKTtyZXR1cm4gdGhpcy5fc2Nyb2xsZWRDb3VudCsrLCgpPT57bi51bnN1YnNjcmliZSgpLHRoaXMuX3Njcm9sbGVkQ291bnQtLSx0aGlzLl9zY3JvbGxlZENvdW50fHx0aGlzLl9yZW1vdmVHbG9iYWxMaXN0ZW5lcigpfX0pKTpFdCgpfW5nT25EZXN0cm95KCl7dGhpcy5fcmVtb3ZlR2xvYmFsTGlzdGVuZXIoKSx0aGlzLnNjcm9sbENvbnRhaW5lcnMuZm9yRWFjaCgoKHQsZSk9PnRoaXMuZGVyZWdpc3RlcihlKSkpLHRoaXMuX3Njcm9sbGVkLmNvbXBsZXRlKCl9YW5jZXN0b3JTY3JvbGxlZCh0LGUpe2NvbnN0IG49dGhpcy5nZXRBbmNlc3RvclNjcm9sbENvbnRhaW5lcnModCk7cmV0dXJuIHRoaXMuc2Nyb2xsZWQoZSkucGlwZShjZSgodD0+IXR8fG4uaW5kZXhPZih0KT4tMSkpKX1nZXRBbmNlc3RvclNjcm9sbENvbnRhaW5lcnModCl7Y29uc3QgZT1bXTtyZXR1cm4gdGhpcy5zY3JvbGxDb250YWluZXJzLmZvckVhY2goKChuLG8pPT57dGhpcy5fc2Nyb2xsYWJsZUNvbnRhaW5zRWxlbWVudChvLHQpJiZlLnB1c2gobyl9KSksZX1fZ2V0V2luZG93KCl7cmV0dXJuIHRoaXMuX2RvY3VtZW50LmRlZmF1bHRWaWV3fHx3aW5kb3d9X3Njcm9sbGFibGVDb250YWluc0VsZW1lbnQodCxlKXtsZXQgbj14eihlKSxvPXQuZ2V0RWxlbWVudFJlZigpLm5hdGl2ZUVsZW1lbnQ7ZG97aWYobj09bylyZXR1cm4hMH13aGlsZShuPW4ucGFyZW50RWxlbWVudCk7cmV0dXJuITF9X2FkZEdsb2JhbExpc3RlbmVyKCl7dGhpcy5fZ2xvYmFsU3Vic2NyaXB0aW9uPXRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9Pm9lKHRoaXMuX2dldFdpbmRvdygpLmRvY3VtZW50LCJzY3JvbGwiKS5zdWJzY3JpYmUoKCgpPT50aGlzLl9zY3JvbGxlZC5uZXh0KCkpKSkpfV9yZW1vdmVHbG9iYWxMaXN0ZW5lcigpe3RoaXMuX2dsb2JhbFN1YnNjcmlwdGlvbiYmKHRoaXMuX2dsb2JhbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX2dsb2JhbFN1YnNjcmlwdGlvbj1udWxsKX19cEYuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHBGKSh2cihhXyksdnIod3opLHZyKFpfLDgpKX0scEYuybVwcm92PU1uKHtmYWN0b3J5OmZ1bmN0aW9uIHQoKXtyZXR1cm4gbmV3IHBGKHZyKGFfKSx2cih3eiksdnIoWl8sOCkpfSx0b2tlbjpwRixwcm92aWRlZEluOiJyb290In0pLHBGLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6YV99LHt0eXBlOnd6fSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1pfXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChwRixbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6YV99LHt0eXBlOnd6fSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1pfXX1dfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIG1Ge2NvbnN0cnVjdG9yKHQsZSxuLG8pe3RoaXMuZWxlbWVudFJlZj10LHRoaXMuc2Nyb2xsRGlzcGF0Y2hlcj1lLHRoaXMubmdab25lPW4sdGhpcy5kaXI9byx0aGlzLl9kZXN0cm95ZWQ9bmV3IEksdGhpcy5fZWxlbWVudFNjcm9sbGVkPW5ldyBEKCh0PT50aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9Pm9lKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCJzY3JvbGwiKS5waXBlKEllKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSh0KSkpKSl9bmdPbkluaXQoKXt0aGlzLnNjcm9sbERpc3BhdGNoZXIucmVnaXN0ZXIodGhpcyl9bmdPbkRlc3Ryb3koKXt0aGlzLnNjcm9sbERpc3BhdGNoZXIuZGVyZWdpc3Rlcih0aGlzKSx0aGlzLl9kZXN0cm95ZWQubmV4dCgpLHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpfWVsZW1lbnRTY3JvbGxlZCgpe3JldHVybiB0aGlzLl9lbGVtZW50U2Nyb2xsZWR9Z2V0RWxlbWVudFJlZigpe3JldHVybiB0aGlzLmVsZW1lbnRSZWZ9c2Nyb2xsVG8odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxuPXRoaXMuZGlyJiYicnRsIj09dGhpcy5kaXIudmFsdWU7bnVsbD09dC5sZWZ0JiYodC5sZWZ0PW4/dC5lbmQ6dC5zdGFydCksbnVsbD09dC5yaWdodCYmKHQucmlnaHQ9bj90LnN0YXJ0OnQuZW5kKSxudWxsIT10LmJvdHRvbSYmKHQudG9wPWUuc2Nyb2xsSGVpZ2h0LWUuY2xpZW50SGVpZ2h0LXQuYm90dG9tKSxuJiYwIT1JeigpPyhudWxsIT10LmxlZnQmJih0LnJpZ2h0PWUuc2Nyb2xsV2lkdGgtZS5jbGllbnRXaWR0aC10LmxlZnQpLDI9PUl6KCk/dC5sZWZ0PXQucmlnaHQ6MT09SXooKSYmKHQubGVmdD10LnJpZ2h0Py10LnJpZ2h0OnQucmlnaHQpKTpudWxsIT10LnJpZ2h0JiYodC5sZWZ0PWUuc2Nyb2xsV2lkdGgtZS5jbGllbnRXaWR0aC10LnJpZ2h0KSx0aGlzLl9hcHBseVNjcm9sbFRvT3B0aW9ucyh0KX1fYXBwbHlTY3JvbGxUb09wdGlvbnModCl7Y29uc3QgZT10aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDt6eigpP2Uuc2Nyb2xsVG8odCk6KG51bGwhPXQudG9wJiYoZS5zY3JvbGxUb3A9dC50b3ApLG51bGwhPXQubGVmdCYmKGUuc2Nyb2xsTGVmdD10LmxlZnQpKX1tZWFzdXJlU2Nyb2xsT2Zmc2V0KHQpe2NvbnN0IGU9ImxlZnQiLG49InJpZ2h0IixvPXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O2lmKCJ0b3AiPT10KXJldHVybiBvLnNjcm9sbFRvcDtpZigiYm90dG9tIj09dClyZXR1cm4gby5zY3JvbGxIZWlnaHQtby5jbGllbnRIZWlnaHQtby5zY3JvbGxUb3A7Y29uc3QgaT10aGlzLmRpciYmInJ0bCI9PXRoaXMuZGlyLnZhbHVlO3JldHVybiJzdGFydCI9PXQ/dD1pP246ZToiZW5kIj09dCYmKHQ9aT9lOm4pLGkmJjI9PUl6KCk/dD09ZT9vLnNjcm9sbFdpZHRoLW8uY2xpZW50V2lkdGgtby5zY3JvbGxMZWZ0Om8uc2Nyb2xsTGVmdDppJiYxPT1JeigpP3Q9PWU/by5zY3JvbGxMZWZ0K28uc2Nyb2xsV2lkdGgtby5jbGllbnRXaWR0aDotby5zY3JvbGxMZWZ0OnQ9PWU/by5zY3JvbGxMZWZ0Om8uc2Nyb2xsV2lkdGgtby5jbGllbnRXaWR0aC1vLnNjcm9sbExlZnR9fW1GLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxtRikoU20oaGcpLFNtKHBGKSxTbShhXyksU20oSEksOCkpfSxtRi7JtWRpcj1sbyh7dHlwZTptRixzZWxlY3RvcnM6W1siIiwiY2RrLXNjcm9sbGFibGUiLCIiXSxbIiIsImNka1Njcm9sbGFibGUiLCIiXV19KSxtRi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpwRn0se3R5cGU6YV99LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKG1GLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IltjZGstc2Nyb2xsYWJsZV0sIFtjZGtTY3JvbGxhYmxlXSJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6cEZ9LHt0eXBlOmFffSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfV19KSxudWxsKTtjbGFzcyB1Rntjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5fcGxhdGZvcm09dCx0aGlzLl9jaGFuZ2U9bmV3IEksdGhpcy5fY2hhbmdlTGlzdGVuZXI9dD0+e3RoaXMuX2NoYW5nZS5uZXh0KHQpfSx0aGlzLl9kb2N1bWVudD1uLGUucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT57aWYodC5pc0Jyb3dzZXIpe2NvbnN0IHQ9dGhpcy5fZ2V0V2luZG93KCk7dC5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRoaXMuX2NoYW5nZUxpc3RlbmVyKSx0LmFkZEV2ZW50TGlzdGVuZXIoIm9yaWVudGF0aW9uY2hhbmdlIix0aGlzLl9jaGFuZ2VMaXN0ZW5lcil9dGhpcy5jaGFuZ2UoKS5zdWJzY3JpYmUoKCgpPT50aGlzLl92aWV3cG9ydFNpemU9bnVsbCkpfSkpfW5nT25EZXN0cm95KCl7aWYodGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKXtjb25zdCB0PXRoaXMuX2dldFdpbmRvdygpO3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIix0aGlzLl9jaGFuZ2VMaXN0ZW5lciksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJvcmllbnRhdGlvbmNoYW5nZSIsdGhpcy5fY2hhbmdlTGlzdGVuZXIpfXRoaXMuX2NoYW5nZS5jb21wbGV0ZSgpfWdldFZpZXdwb3J0U2l6ZSgpe3RoaXMuX3ZpZXdwb3J0U2l6ZXx8dGhpcy5fdXBkYXRlVmlld3BvcnRTaXplKCk7Y29uc3QgdD17d2lkdGg6dGhpcy5fdmlld3BvcnRTaXplLndpZHRoLGhlaWdodDp0aGlzLl92aWV3cG9ydFNpemUuaGVpZ2h0fTtyZXR1cm4gdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyfHwodGhpcy5fdmlld3BvcnRTaXplPW51bGwpLHR9Z2V0Vmlld3BvcnRSZWN0KCl7Y29uc3QgdD10aGlzLmdldFZpZXdwb3J0U2Nyb2xsUG9zaXRpb24oKSx7d2lkdGg6ZSxoZWlnaHQ6bn09dGhpcy5nZXRWaWV3cG9ydFNpemUoKTtyZXR1cm57dG9wOnQudG9wLGxlZnQ6dC5sZWZ0LGJvdHRvbTp0LnRvcCtuLHJpZ2h0OnQubGVmdCtlLGhlaWdodDpuLHdpZHRoOmV9fWdldFZpZXdwb3J0U2Nyb2xsUG9zaXRpb24oKXtpZighdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKXJldHVybnt0b3A6MCxsZWZ0OjB9O2NvbnN0IHQ9dGhpcy5fZG9jdW1lbnQsZT10aGlzLl9nZXRXaW5kb3coKSxuPXQuZG9jdW1lbnRFbGVtZW50LG89bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57dG9wOi1vLnRvcHx8dC5ib2R5LnNjcm9sbFRvcHx8ZS5zY3JvbGxZfHxuLnNjcm9sbFRvcHx8MCxsZWZ0Oi1vLmxlZnR8fHQuYm9keS5zY3JvbGxMZWZ0fHxlLnNjcm9sbFh8fG4uc2Nyb2xsTGVmdHx8MH19Y2hhbmdlKHQ9MjApe3JldHVybiB0PjA/dGhpcy5fY2hhbmdlLnBpcGUoZGUodCkpOnRoaXMuX2NoYW5nZX1fZ2V0V2luZG93KCl7cmV0dXJuIHRoaXMuX2RvY3VtZW50LmRlZmF1bHRWaWV3fHx3aW5kb3d9X3VwZGF0ZVZpZXdwb3J0U2l6ZSgpe2NvbnN0IHQ9dGhpcy5fZ2V0V2luZG93KCk7dGhpcy5fdmlld3BvcnRTaXplPXRoaXMuX3BsYXRmb3JtLmlzQnJvd3Nlcj97d2lkdGg6dC5pbm5lcldpZHRoLGhlaWdodDp0LmlubmVySGVpZ2h0fTp7d2lkdGg6MCxoZWlnaHQ6MH19fXVGLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx1RikodnIod3opLHZyKGFfKSx2cihaXyw4KSl9LHVGLsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIG5ldyB1Rih2cih3eiksdnIoYV8pLHZyKFpfLDgpKX0sdG9rZW46dUYscHJvdmlkZWRJbjoicm9vdCJ9KSx1Ri5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnd6fSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltaX119XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodUYsW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOiJyb290In1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnd6fSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltaX119XX1dfSksbnVsbCk7Y29uc3QgZkY9InVuZGVmaW5lZCIhPXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU/YXQ6JDtjbGFzcyBnRiBleHRlbmRzIG1Ge2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIpe2lmKHN1cGVyKHQsYSxuLGkpLHRoaXMuZWxlbWVudFJlZj10LHRoaXMuX2NoYW5nZURldGVjdG9yUmVmPWUsdGhpcy5fc2Nyb2xsU3RyYXRlZ3k9byx0aGlzLl9kZXRhY2hlZFN1YmplY3Q9bmV3IEksdGhpcy5fcmVuZGVyZWRSYW5nZVN1YmplY3Q9bmV3IEksdGhpcy5fb3JpZW50YXRpb249InZlcnRpY2FsIix0aGlzLl9hcHBlbmRPbmx5PSExLHRoaXMuc2Nyb2xsZWRJbmRleENoYW5nZT1uZXcgRCgodD0+dGhpcy5fc2Nyb2xsU3RyYXRlZ3kuc2Nyb2xsZWRJbmRleENoYW5nZS5zdWJzY3JpYmUoKGU9PlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCgpPT50aGlzLm5nWm9uZS5ydW4oKCgpPT50Lm5leHQoZSkpKSkpKSkpKSx0aGlzLnJlbmRlcmVkUmFuZ2VTdHJlYW09dGhpcy5fcmVuZGVyZWRSYW5nZVN1YmplY3QsdGhpcy5fdG90YWxDb250ZW50U2l6ZT0wLHRoaXMuX3RvdGFsQ29udGVudFdpZHRoPSIiLHRoaXMuX3RvdGFsQ29udGVudEhlaWdodD0iIix0aGlzLl9yZW5kZXJlZFJhbmdlPXtzdGFydDowLGVuZDowfSx0aGlzLl9kYXRhTGVuZ3RoPTAsdGhpcy5fdmlld3BvcnRTaXplPTAsdGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0PTAsdGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0TmVlZHNSZXdyaXRlPSExLHRoaXMuX2lzQ2hhbmdlRGV0ZWN0aW9uUGVuZGluZz0hMSx0aGlzLl9ydW5BZnRlckNoYW5nZURldGVjdGlvbj1bXSx0aGlzLl92aWV3cG9ydENoYW5nZXM9bS5FTVBUWSwhbyYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93IEVycm9yKCdFcnJvcjogY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0IHJlcXVpcmVzIHRoZSAiaXRlbVNpemUiIHByb3BlcnR5IHRvIGJlIHNldC4nKTt0aGlzLl92aWV3cG9ydENoYW5nZXM9ci5jaGFuZ2UoKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5jaGVja1ZpZXdwb3J0U2l6ZSgpfSkpfWdldCBvcmllbnRhdGlvbigpe3JldHVybiB0aGlzLl9vcmllbnRhdGlvbn1zZXQgb3JpZW50YXRpb24odCl7dGhpcy5fb3JpZW50YXRpb24hPT10JiYodGhpcy5fb3JpZW50YXRpb249dCx0aGlzLl9jYWxjdWxhdGVTcGFjZXJTaXplKCkpfWdldCBhcHBlbmRPbmx5KCl7cmV0dXJuIHRoaXMuX2FwcGVuZE9ubHl9c2V0IGFwcGVuZE9ubHkodCl7dGhpcy5fYXBwZW5kT25seT15eih0KX1uZ09uSW5pdCgpe3N1cGVyLm5nT25Jbml0KCksdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+e3RoaXMuX21lYXN1cmVWaWV3cG9ydFNpemUoKSx0aGlzLl9zY3JvbGxTdHJhdGVneS5hdHRhY2godGhpcyksdGhpcy5lbGVtZW50U2Nyb2xsZWQoKS5waXBlKE5lKG51bGwpLGRlKDAsZkYpKS5zdWJzY3JpYmUoKCgpPT50aGlzLl9zY3JvbGxTdHJhdGVneS5vbkNvbnRlbnRTY3JvbGxlZCgpKSksdGhpcy5fbWFya0NoYW5nZURldGVjdGlvbk5lZWRlZCgpfSkpKSl9bmdPbkRlc3Ryb3koKXt0aGlzLmRldGFjaCgpLHRoaXMuX3Njcm9sbFN0cmF0ZWd5LmRldGFjaCgpLHRoaXMuX3JlbmRlcmVkUmFuZ2VTdWJqZWN0LmNvbXBsZXRlKCksdGhpcy5fZGV0YWNoZWRTdWJqZWN0LmNvbXBsZXRlKCksdGhpcy5fdmlld3BvcnRDaGFuZ2VzLnVuc3Vic2NyaWJlKCksc3VwZXIubmdPbkRlc3Ryb3koKX1hdHRhY2godCl7aWYodGhpcy5fZm9yT2YmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSl0aHJvdyBFcnJvcigiQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0IGlzIGFscmVhZHkgYXR0YWNoZWQuIik7dGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT57dGhpcy5fZm9yT2Y9dCx0aGlzLl9mb3JPZi5kYXRhU3RyZWFtLnBpcGUoSWUodGhpcy5fZGV0YWNoZWRTdWJqZWN0KSkuc3Vic2NyaWJlKCh0PT57Y29uc3QgZT10Lmxlbmd0aDtlIT09dGhpcy5fZGF0YUxlbmd0aCYmKHRoaXMuX2RhdGFMZW5ndGg9ZSx0aGlzLl9zY3JvbGxTdHJhdGVneS5vbkRhdGFMZW5ndGhDaGFuZ2VkKCkpLHRoaXMuX2RvQ2hhbmdlRGV0ZWN0aW9uKCl9KSl9KSl9ZGV0YWNoKCl7dGhpcy5fZm9yT2Y9bnVsbCx0aGlzLl9kZXRhY2hlZFN1YmplY3QubmV4dCgpfWdldERhdGFMZW5ndGgoKXtyZXR1cm4gdGhpcy5fZGF0YUxlbmd0aH1nZXRWaWV3cG9ydFNpemUoKXtyZXR1cm4gdGhpcy5fdmlld3BvcnRTaXplfWdldFJlbmRlcmVkUmFuZ2UoKXtyZXR1cm4gdGhpcy5fcmVuZGVyZWRSYW5nZX1zZXRUb3RhbENvbnRlbnRTaXplKHQpe3RoaXMuX3RvdGFsQ29udGVudFNpemUhPT10JiYodGhpcy5fdG90YWxDb250ZW50U2l6ZT10LHRoaXMuX2NhbGN1bGF0ZVNwYWNlclNpemUoKSx0aGlzLl9tYXJrQ2hhbmdlRGV0ZWN0aW9uTmVlZGVkKCkpfXNldFJlbmRlcmVkUmFuZ2UodCl7KAovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KZnVuY3Rpb24gZSh0LG4pe3JldHVybiB0LnN0YXJ0PT1uLnN0YXJ0JiZ0LmVuZD09bi5lbmR9KSh0aGlzLl9yZW5kZXJlZFJhbmdlLHQpfHwodGhpcy5hcHBlbmRPbmx5JiYodD17c3RhcnQ6MCxlbmQ6TWF0aC5tYXgodGhpcy5fcmVuZGVyZWRSYW5nZS5lbmQsdC5lbmQpfSksdGhpcy5fcmVuZGVyZWRSYW5nZVN1YmplY3QubmV4dCh0aGlzLl9yZW5kZXJlZFJhbmdlPXQpLHRoaXMuX21hcmtDaGFuZ2VEZXRlY3Rpb25OZWVkZWQoKCgpPT50aGlzLl9zY3JvbGxTdHJhdGVneS5vbkNvbnRlbnRSZW5kZXJlZCgpKSkpfWdldE9mZnNldFRvUmVuZGVyZWRDb250ZW50U3RhcnQoKXtyZXR1cm4gdGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0TmVlZHNSZXdyaXRlP251bGw6dGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0fXNldFJlbmRlcmVkQ29udGVudE9mZnNldCh0LGU9InRvLXN0YXJ0Iil7Y29uc3Qgbj0iaG9yaXpvbnRhbCI9PXRoaXMub3JpZW50YXRpb24sbz1uPyJYIjoiWSI7bGV0IGk9YHRyYW5zbGF0ZSR7b30oJHtOdW1iZXIoKG4mJnRoaXMuZGlyJiYicnRsIj09dGhpcy5kaXIudmFsdWU/LTE6MSkqdCl9cHgpYDt0aGlzLl9yZW5kZXJlZENvbnRlbnRPZmZzZXQ9dCwidG8tZW5kIj09PWUmJihpKz1gIHRyYW5zbGF0ZSR7b30oLTEwMCUpYCx0aGlzLl9yZW5kZXJlZENvbnRlbnRPZmZzZXROZWVkc1Jld3JpdGU9ITApLHRoaXMuX3JlbmRlcmVkQ29udGVudFRyYW5zZm9ybSE9aSYmKHRoaXMuX3JlbmRlcmVkQ29udGVudFRyYW5zZm9ybT1pLHRoaXMuX21hcmtDaGFuZ2VEZXRlY3Rpb25OZWVkZWQoKCgpPT57dGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0TmVlZHNSZXdyaXRlPyh0aGlzLl9yZW5kZXJlZENvbnRlbnRPZmZzZXQtPXRoaXMubWVhc3VyZVJlbmRlcmVkQ29udGVudFNpemUoKSx0aGlzLl9yZW5kZXJlZENvbnRlbnRPZmZzZXROZWVkc1Jld3JpdGU9ITEsdGhpcy5zZXRSZW5kZXJlZENvbnRlbnRPZmZzZXQodGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0KSk6dGhpcy5fc2Nyb2xsU3RyYXRlZ3kub25SZW5kZXJlZE9mZnNldENoYW5nZWQoKX0pKSl9c2Nyb2xsVG9PZmZzZXQodCxlPSJhdXRvIil7Y29uc3Qgbj17YmVoYXZpb3I6ZX07Imhvcml6b250YWwiPT09dGhpcy5vcmllbnRhdGlvbj9uLnN0YXJ0PXQ6bi50b3A9dCx0aGlzLnNjcm9sbFRvKG4pfXNjcm9sbFRvSW5kZXgodCxlPSJhdXRvIil7dGhpcy5fc2Nyb2xsU3RyYXRlZ3kuc2Nyb2xsVG9JbmRleCh0LGUpfW1lYXN1cmVTY3JvbGxPZmZzZXQodCl7cmV0dXJuIHN1cGVyLm1lYXN1cmVTY3JvbGxPZmZzZXQodHx8KCJob3Jpem9udGFsIj09PXRoaXMub3JpZW50YXRpb24/InN0YXJ0IjoidG9wIikpfW1lYXN1cmVSZW5kZXJlZENvbnRlbnRTaXplKCl7Y29uc3QgdD10aGlzLl9jb250ZW50V3JhcHBlci5uYXRpdmVFbGVtZW50O3JldHVybiJob3Jpem9udGFsIj09PXRoaXMub3JpZW50YXRpb24/dC5vZmZzZXRXaWR0aDp0Lm9mZnNldEhlaWdodH1tZWFzdXJlUmFuZ2VTaXplKHQpe3JldHVybiB0aGlzLl9mb3JPZj90aGlzLl9mb3JPZi5tZWFzdXJlUmFuZ2VTaXplKHQsdGhpcy5vcmllbnRhdGlvbik6MH1jaGVja1ZpZXdwb3J0U2l6ZSgpe3RoaXMuX21lYXN1cmVWaWV3cG9ydFNpemUoKSx0aGlzLl9zY3JvbGxTdHJhdGVneS5vbkRhdGFMZW5ndGhDaGFuZ2VkKCl9X21lYXN1cmVWaWV3cG9ydFNpemUoKXtjb25zdCB0PXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O3RoaXMuX3ZpZXdwb3J0U2l6ZT0iaG9yaXpvbnRhbCI9PT10aGlzLm9yaWVudGF0aW9uP3QuY2xpZW50V2lkdGg6dC5jbGllbnRIZWlnaHR9X21hcmtDaGFuZ2VEZXRlY3Rpb25OZWVkZWQodCl7dCYmdGhpcy5fcnVuQWZ0ZXJDaGFuZ2VEZXRlY3Rpb24ucHVzaCh0KSx0aGlzLl9pc0NoYW5nZURldGVjdGlvblBlbmRpbmd8fCh0aGlzLl9pc0NoYW5nZURldGVjdGlvblBlbmRpbmc9ITAsdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+e3RoaXMuX2RvQ2hhbmdlRGV0ZWN0aW9uKCl9KSkpKSl9X2RvQ2hhbmdlRGV0ZWN0aW9uKCl7dGhpcy5faXNDaGFuZ2VEZXRlY3Rpb25QZW5kaW5nPSExLHRoaXMuX2NvbnRlbnRXcmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtPXRoaXMuX3JlbmRlcmVkQ29udGVudFRyYW5zZm9ybSx0aGlzLm5nWm9uZS5ydW4oKCgpPT50aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSkpO2NvbnN0IHQ9dGhpcy5fcnVuQWZ0ZXJDaGFuZ2VEZXRlY3Rpb247dGhpcy5fcnVuQWZ0ZXJDaGFuZ2VEZXRlY3Rpb249W107Zm9yKGNvbnN0IGUgb2YgdCllKCl9X2NhbGN1bGF0ZVNwYWNlclNpemUoKXt0aGlzLl90b3RhbENvbnRlbnRIZWlnaHQ9Imhvcml6b250YWwiPT09dGhpcy5vcmllbnRhdGlvbj8iIjpgJHt0aGlzLl90b3RhbENvbnRlbnRTaXplfXB4YCx0aGlzLl90b3RhbENvbnRlbnRXaWR0aD0iaG9yaXpvbnRhbCI9PT10aGlzLm9yaWVudGF0aW9uP2Ake3RoaXMuX3RvdGFsQ29udGVudFNpemV9cHhgOiIifX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmZ1bmN0aW9uIGhGKHQsZSxuKXtpZighbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIDA7Y29uc3Qgbz1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybiJob3Jpem9udGFsIj09PXQ/InN0YXJ0Ij09PWU/by5sZWZ0Om8ucmlnaHQ6InN0YXJ0Ij09PWU/by50b3A6by5ib3R0b219Z0YuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGdGKShTbShoZyksU20oVWcpLFNtKGFfKSxTbShzRiw4KSxTbShISSw4KSxTbShwRiksU20odUYpKX0sZ0YuybVjbXA9dG8oe3R5cGU6Z0Ysc2VsZWN0b3JzOltbImNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmUWgockYsNyksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5fY29udGVudFdyYXBwZXI9dC5maXJzdCl9fSxob3N0QXR0cnM6WzEsImNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCJdLGhvc3RWYXJzOjQsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJnB1KCJjZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24taG9yaXpvbnRhbCIsImhvcml6b250YWwiPT09bi5vcmllbnRhdGlvbikoImNkay12aXJ0dWFsLXNjcm9sbC1vcmllbnRhdGlvbi12ZXJ0aWNhbCIsImhvcml6b250YWwiIT09bi5vcmllbnRhdGlvbil9LGlucHV0czp7b3JpZW50YXRpb246Im9yaWVudGF0aW9uIixhcHBlbmRPbmx5OiJhcHBlbmRPbmx5In0sb3V0cHV0czp7c2Nyb2xsZWRJbmRleENoYW5nZToic2Nyb2xsZWRJbmRleENoYW5nZSJ9LGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6bUYsdXNlRXhpc3Rpbmc6Z0Z9XSkseHBdLG5nQ29udGVudFNlbGVjdG9yczpbIioiXSxkZWNsczo0LHZhcnM6NCxjb25zdHM6W1sxLCJjZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVyIl0sWyJjb250ZW50V3JhcHBlciIsIiJdLFsxLCJjZGstdmlydHVhbC1zY3JvbGwtc3BhY2VyIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabSgpLFJtKDAsImRpdiIsMCwxKSxYbSgyKSxBbSgpLFRtKDMsImRpdiIsMikpLDImZSYmKHJjKDMpLGR1KCJ3aWR0aCIsbi5fdG90YWxDb250ZW50V2lkdGgpKCJoZWlnaHQiLG4uX3RvdGFsQ29udGVudEhlaWdodCkpfSxzdHlsZXM6WyJjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnR7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzphdXRvO2NvbnRhaW46c3RyaWN0O3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3dpbGwtY2hhbmdlOnNjcm9sbC1wb3NpdGlvbjstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaH0uY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7Y29udGFpbjpjb250ZW50fVtkaXI9cnRsXSAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcntyaWdodDowO2xlZnQ6YXV0b30uY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLWhvcml6b250YWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXJ7bWluLWhlaWdodDoxMDAlfS5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24taG9yaXpvbnRhbCAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcj5kbDpub3QoW2Nka1ZpcnR1YWxGb3JdKSwuY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLWhvcml6b250YWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXI+b2w6bm90KFtjZGtWaXJ0dWFsRm9yXSksLmNkay12aXJ0dWFsLXNjcm9sbC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIC5jZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVyPnRhYmxlOm5vdChbY2RrVmlydHVhbEZvcl0pLC5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24taG9yaXpvbnRhbCAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcj51bDpub3QoW2Nka1ZpcnR1YWxGb3JdKXtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDtib3JkZXItbGVmdC13aWR0aDowO2JvcmRlci1yaWdodC13aWR0aDowO291dGxpbmU6bm9uZX0uY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLXZlcnRpY2FsIC5jZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVye21pbi13aWR0aDoxMDAlfS5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24tdmVydGljYWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXI+ZGw6bm90KFtjZGtWaXJ0dWFsRm9yXSksLmNkay12aXJ0dWFsLXNjcm9sbC1vcmllbnRhdGlvbi12ZXJ0aWNhbCAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcj5vbDpub3QoW2Nka1ZpcnR1YWxGb3JdKSwuY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLXZlcnRpY2FsIC5jZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVyPnRhYmxlOm5vdChbY2RrVmlydHVhbEZvcl0pLC5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24tdmVydGljYWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXI+dWw6bm90KFtjZGtWaXJ0dWFsRm9yXSl7cGFkZGluZy10b3A6MDtwYWRkaW5nLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7Ym9yZGVyLXRvcC13aWR0aDowO2JvcmRlci1ib3R0b20td2lkdGg6MDtvdXRsaW5lOm5vbmV9LmNkay12aXJ0dWFsLXNjcm9sbC1zcGFjZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO2hlaWdodDoxcHg7d2lkdGg6MXB4O3RyYW5zZm9ybS1vcmlnaW46MCAwfVtkaXI9cnRsXSAuY2RrLXZpcnR1YWwtc2Nyb2xsLXNwYWNlcntyaWdodDowO2xlZnQ6YXV0bzt0cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMH1cbiJdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLGdGLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOlVnfSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltzRl19XX0se3R5cGU6SEksZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6cEZ9LHt0eXBlOnVGfV0sZ0YucHJvcERlY29yYXRvcnM9e29yaWVudGF0aW9uOlt7dHlwZTp4eX1dLGFwcGVuZE9ubHk6W3t0eXBlOnh5fV0sc2Nyb2xsZWRJbmRleENoYW5nZTpbe3R5cGU6T3l9XSxfY29udGVudFdyYXBwZXI6W3t0eXBlOlphLGFyZ3M6WyJjb250ZW50V3JhcHBlciIse3N0YXRpYzohMH1dfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZ0YsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0Iix0ZW1wbGF0ZTonXHgzYyEtLVxuICBXcmFwIHRoZSByZW5kZXJlZCBjb250ZW50IGluIGFuIGVsZW1lbnQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gb2Zmc2V0IGl0IGJhc2VkIG9uIHRoZSBzY3JvbGxcbiAgcG9zaXRpb24uXG4tLVx4M2VcbjxkaXYgI2NvbnRlbnRXcmFwcGVyIGNsYXNzPSJjZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVyIj5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9kaXY+XG5ceDNjIS0tXG4gIFNwYWNlciB1c2VkIHRvIGZvcmNlIHRoZSBzY3JvbGxpbmcgY29udGFpbmVyIHRvIHRoZSBjb3JyZWN0IHNpemUgZm9yIHRoZSAqdG90YWwqIG51bWJlciBvZiBpdGVtc1xuICBzbyB0aGF0IHRoZSBzY3JvbGxiYXIgY2FwdHVyZXMgdGhlIHNpemUgb2YgdGhlIGVudGlyZSBkYXRhIHNldC5cbi0tXHgzZVxuPGRpdiBjbGFzcz0iY2RrLXZpcnR1YWwtc2Nyb2xsLXNwYWNlciJcbiAgICAgW3N0eWxlLndpZHRoXT0iX3RvdGFsQ29udGVudFdpZHRoIiBbc3R5bGUuaGVpZ2h0XT0iX3RvdGFsQ29udGVudEhlaWdodCI+PC9kaXY+XG4nLGhvc3Q6e2NsYXNzOiJjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQiLCJbY2xhc3MuY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLWhvcml6b250YWxdIjonb3JpZW50YXRpb24gPT09ICJob3Jpem9udGFsIicsIltjbGFzcy5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24tdmVydGljYWxdIjonb3JpZW50YXRpb24gIT09ICJob3Jpem9udGFsIid9LGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLHByb3ZpZGVyczpbe3Byb3ZpZGU6bUYsdXNlRXhpc3Rpbmc6Z0Z9XSxzdHlsZXM6WyJjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnR7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzphdXRvO2NvbnRhaW46c3RyaWN0O3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3dpbGwtY2hhbmdlOnNjcm9sbC1wb3NpdGlvbjstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaH0uY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7Y29udGFpbjpjb250ZW50fVtkaXI9cnRsXSAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcntyaWdodDowO2xlZnQ6YXV0b30uY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLWhvcml6b250YWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXJ7bWluLWhlaWdodDoxMDAlfS5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24taG9yaXpvbnRhbCAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcj5kbDpub3QoW2Nka1ZpcnR1YWxGb3JdKSwuY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLWhvcml6b250YWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXI+b2w6bm90KFtjZGtWaXJ0dWFsRm9yXSksLmNkay12aXJ0dWFsLXNjcm9sbC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIC5jZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVyPnRhYmxlOm5vdChbY2RrVmlydHVhbEZvcl0pLC5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24taG9yaXpvbnRhbCAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcj51bDpub3QoW2Nka1ZpcnR1YWxGb3JdKXtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDtib3JkZXItbGVmdC13aWR0aDowO2JvcmRlci1yaWdodC13aWR0aDowO291dGxpbmU6bm9uZX0uY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLXZlcnRpY2FsIC5jZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVye21pbi13aWR0aDoxMDAlfS5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24tdmVydGljYWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXI+ZGw6bm90KFtjZGtWaXJ0dWFsRm9yXSksLmNkay12aXJ0dWFsLXNjcm9sbC1vcmllbnRhdGlvbi12ZXJ0aWNhbCAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcj5vbDpub3QoW2Nka1ZpcnR1YWxGb3JdKSwuY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLXZlcnRpY2FsIC5jZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVyPnRhYmxlOm5vdChbY2RrVmlydHVhbEZvcl0pLC5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24tdmVydGljYWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXI+dWw6bm90KFtjZGtWaXJ0dWFsRm9yXSl7cGFkZGluZy10b3A6MDtwYWRkaW5nLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7Ym9yZGVyLXRvcC13aWR0aDowO2JvcmRlci1ib3R0b20td2lkdGg6MDtvdXRsaW5lOm5vbmV9LmNkay12aXJ0dWFsLXNjcm9sbC1zcGFjZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO2hlaWdodDoxcHg7d2lkdGg6MXB4O3RyYW5zZm9ybS1vcmlnaW46MCAwfVtkaXI9cnRsXSAuY2RrLXZpcnR1YWwtc2Nyb2xsLXNwYWNlcntyaWdodDowO2xlZnQ6YXV0bzt0cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMH1cbiJdfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOlVnfSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltzRl19XX0se3R5cGU6SEksZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6cEZ9LHt0eXBlOnVGfV19KSx7c2Nyb2xsZWRJbmRleENoYW5nZTpbe3R5cGU6T3l9XSxvcmllbnRhdGlvbjpbe3R5cGU6eHl9XSxhcHBlbmRPbmx5Olt7dHlwZTp4eX1dLF9jb250ZW50V3JhcHBlcjpbe3R5cGU6WmEsYXJnczpbImNvbnRlbnRXcmFwcGVyIix7c3RhdGljOiEwfV19XX0pO2NsYXNzIGJGe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhKXt0aGlzLl92aWV3Q29udGFpbmVyUmVmPXQsdGhpcy5fdGVtcGxhdGU9ZSx0aGlzLl9kaWZmZXJzPW4sdGhpcy5fdmlld1JlcGVhdGVyPW8sdGhpcy5fdmlld3BvcnQ9aSx0aGlzLnZpZXdDaGFuZ2U9bmV3IEksdGhpcy5fZGF0YVNvdXJjZUNoYW5nZXM9bmV3IEksdGhpcy5kYXRhU3RyZWFtPXRoaXMuX2RhdGFTb3VyY2VDaGFuZ2VzLnBpcGUoTmUobnVsbCksRGUoKSx6ZSgoKFt0LGVdKT0+dGhpcy5fY2hhbmdlRGF0YVNvdXJjZSh0LGUpKSksQWUoMSkpLHRoaXMuX2RpZmZlcj1udWxsLHRoaXMuX25lZWRzVXBkYXRlPSExLHRoaXMuX2Rlc3Ryb3llZD1uZXcgSSx0aGlzLmRhdGFTdHJlYW0uc3Vic2NyaWJlKCh0PT57dGhpcy5fZGF0YT10LHRoaXMuX29uUmVuZGVyZWREYXRhQ2hhbmdlKCl9KSksdGhpcy5fdmlld3BvcnQucmVuZGVyZWRSYW5nZVN0cmVhbS5waXBlKEllKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgodD0+e3RoaXMuX3JlbmRlcmVkUmFuZ2U9dCxhLnJ1bigoKCk9PnRoaXMudmlld0NoYW5nZS5uZXh0KHRoaXMuX3JlbmRlcmVkUmFuZ2UpKSksdGhpcy5fb25SZW5kZXJlZERhdGFDaGFuZ2UoKX0pKSx0aGlzLl92aWV3cG9ydC5hdHRhY2godGhpcyl9Z2V0IGNka1ZpcnR1YWxGb3JPZigpe3JldHVybiB0aGlzLl9jZGtWaXJ0dWFsRm9yT2Z9c2V0IGNka1ZpcnR1YWxGb3JPZih0KXt0aGlzLl9jZGtWaXJ0dWFsRm9yT2Y9dCwkSCh0KT90aGlzLl9kYXRhU291cmNlQ2hhbmdlcy5uZXh0KHQpOnRoaXMuX2RhdGFTb3VyY2VDaGFuZ2VzLm5leHQobmV3IHRGKE50KHQpP3Q6QXJyYXkuZnJvbSh0fHxbXSkpKX1nZXQgY2RrVmlydHVhbEZvclRyYWNrQnkoKXtyZXR1cm4gdGhpcy5fY2RrVmlydHVhbEZvclRyYWNrQnl9c2V0IGNka1ZpcnR1YWxGb3JUcmFja0J5KHQpe3RoaXMuX25lZWRzVXBkYXRlPSEwLHRoaXMuX2Nka1ZpcnR1YWxGb3JUcmFja0J5PXQ/KGUsbik9PnQoZSsodGhpcy5fcmVuZGVyZWRSYW5nZT90aGlzLl9yZW5kZXJlZFJhbmdlLnN0YXJ0OjApLG4pOnZvaWQgMH1zZXQgY2RrVmlydHVhbEZvclRlbXBsYXRlKHQpe3QmJih0aGlzLl9uZWVkc1VwZGF0ZT0hMCx0aGlzLl90ZW1wbGF0ZT10KX1nZXQgY2RrVmlydHVhbEZvclRlbXBsYXRlQ2FjaGVTaXplKCl7cmV0dXJuIHRoaXMuX3ZpZXdSZXBlYXRlci52aWV3Q2FjaGVTaXplfXNldCBjZGtWaXJ0dWFsRm9yVGVtcGxhdGVDYWNoZVNpemUodCl7dGhpcy5fdmlld1JlcGVhdGVyLnZpZXdDYWNoZVNpemU9X3oodCl9bWVhc3VyZVJhbmdlU2l6ZSh0LGUpe2lmKHQuc3RhcnQ+PXQuZW5kKXJldHVybiAwO2lmKCh0LnN0YXJ0PHRoaXMuX3JlbmRlcmVkUmFuZ2Uuc3RhcnR8fHQuZW5kPnRoaXMuX3JlbmRlcmVkUmFuZ2UuZW5kKSYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93IEVycm9yKCJFcnJvcjogYXR0ZW1wdGVkIHRvIG1lYXN1cmUgYW4gaXRlbSB0aGF0IGlzbid0IHJlbmRlcmVkLiIpO2NvbnN0IG49dC5zdGFydC10aGlzLl9yZW5kZXJlZFJhbmdlLnN0YXJ0LG89dC5lbmQtdC5zdGFydDtsZXQgaSxhO2ZvcihsZXQgdD0wO3Q8bzt0Kyspe2NvbnN0IGU9dGhpcy5fdmlld0NvbnRhaW5lclJlZi5nZXQodCtuKTtpZihlJiZlLnJvb3ROb2Rlcy5sZW5ndGgpe2k9YT1lLnJvb3ROb2Rlc1swXTticmVha319Zm9yKGxldCB0PW8tMTt0Pi0xO3QtLSl7Y29uc3QgZT10aGlzLl92aWV3Q29udGFpbmVyUmVmLmdldCh0K24pO2lmKGUmJmUucm9vdE5vZGVzLmxlbmd0aCl7YT1lLnJvb3ROb2Rlc1tlLnJvb3ROb2Rlcy5sZW5ndGgtMV07YnJlYWt9fXJldHVybiBpJiZhP2hGKGUsImVuZCIsYSktaEYoZSwic3RhcnQiLGkpOjB9bmdEb0NoZWNrKCl7aWYodGhpcy5fZGlmZmVyJiZ0aGlzLl9uZWVkc1VwZGF0ZSl7Y29uc3QgdD10aGlzLl9kaWZmZXIuZGlmZih0aGlzLl9yZW5kZXJlZEl0ZW1zKTt0P3RoaXMuX2FwcGx5Q2hhbmdlcyh0KTp0aGlzLl91cGRhdGVDb250ZXh0KCksdGhpcy5fbmVlZHNVcGRhdGU9ITF9fW5nT25EZXN0cm95KCl7dGhpcy5fdmlld3BvcnQuZGV0YWNoKCksdGhpcy5fZGF0YVNvdXJjZUNoYW5nZXMubmV4dCh2b2lkIDApLHRoaXMuX2RhdGFTb3VyY2VDaGFuZ2VzLmNvbXBsZXRlKCksdGhpcy52aWV3Q2hhbmdlLmNvbXBsZXRlKCksdGhpcy5fZGVzdHJveWVkLm5leHQoKSx0aGlzLl9kZXN0cm95ZWQuY29tcGxldGUoKSx0aGlzLl92aWV3UmVwZWF0ZXIuZGV0YWNoKCl9X29uUmVuZGVyZWREYXRhQ2hhbmdlKCl7dGhpcy5fcmVuZGVyZWRSYW5nZSYmKHRoaXMuX3JlbmRlcmVkSXRlbXM9dGhpcy5fZGF0YS5zbGljZSh0aGlzLl9yZW5kZXJlZFJhbmdlLnN0YXJ0LHRoaXMuX3JlbmRlcmVkUmFuZ2UuZW5kKSx0aGlzLl9kaWZmZXJ8fCh0aGlzLl9kaWZmZXI9dGhpcy5fZGlmZmVycy5maW5kKHRoaXMuX3JlbmRlcmVkSXRlbXMpLmNyZWF0ZSgoKHQsZSk9PnRoaXMuY2RrVmlydHVhbEZvclRyYWNrQnk/dGhpcy5jZGtWaXJ0dWFsRm9yVHJhY2tCeSh0LGUpOmUpKSksdGhpcy5fbmVlZHNVcGRhdGU9ITApfV9jaGFuZ2VEYXRhU291cmNlKHQsZSl7cmV0dXJuIHQmJnQuZGlzY29ubmVjdCh0aGlzKSx0aGlzLl9uZWVkc1VwZGF0ZT0hMCxlP2UuY29ubmVjdCh0aGlzKTpFdCgpfV91cGRhdGVDb250ZXh0KCl7Y29uc3QgdD10aGlzLl9kYXRhLmxlbmd0aDtsZXQgZT10aGlzLl92aWV3Q29udGFpbmVyUmVmLmxlbmd0aDtmb3IoO2UtLTspe2NvbnN0IG49dGhpcy5fdmlld0NvbnRhaW5lclJlZi5nZXQoZSk7bi5jb250ZXh0LmluZGV4PXRoaXMuX3JlbmRlcmVkUmFuZ2Uuc3RhcnQrZSxuLmNvbnRleHQuY291bnQ9dCx0aGlzLl91cGRhdGVDb21wdXRlZENvbnRleHRQcm9wZXJ0aWVzKG4uY29udGV4dCksbi5kZXRlY3RDaGFuZ2VzKCl9fV9hcHBseUNoYW5nZXModCl7dGhpcy5fdmlld1JlcGVhdGVyLmFwcGx5Q2hhbmdlcyh0LHRoaXMuX3ZpZXdDb250YWluZXJSZWYsKCh0LGUsbik9PnRoaXMuX2dldEVtYmVkZGVkVmlld0FyZ3ModCxuKSksKHQ9PnQuaXRlbSkpLHQuZm9yRWFjaElkZW50aXR5Q2hhbmdlKCh0PT57dGhpcy5fdmlld0NvbnRhaW5lclJlZi5nZXQodC5jdXJyZW50SW5kZXgpLmNvbnRleHQuJGltcGxpY2l0PXQuaXRlbX0pKTtjb25zdCBlPXRoaXMuX2RhdGEubGVuZ3RoO2xldCBuPXRoaXMuX3ZpZXdDb250YWluZXJSZWYubGVuZ3RoO2Zvcig7bi0tOyl7Y29uc3QgdD10aGlzLl92aWV3Q29udGFpbmVyUmVmLmdldChuKTt0LmNvbnRleHQuaW5kZXg9dGhpcy5fcmVuZGVyZWRSYW5nZS5zdGFydCtuLHQuY29udGV4dC5jb3VudD1lLHRoaXMuX3VwZGF0ZUNvbXB1dGVkQ29udGV4dFByb3BlcnRpZXModC5jb250ZXh0KX19X3VwZGF0ZUNvbXB1dGVkQ29udGV4dFByb3BlcnRpZXModCl7dC5maXJzdD0wPT09dC5pbmRleCx0Lmxhc3Q9dC5pbmRleD09PXQuY291bnQtMSx0LmV2ZW49dC5pbmRleCUyPT0wLHQub2RkPSF0LmV2ZW59X2dldEVtYmVkZGVkVmlld0FyZ3ModCxlKXtyZXR1cm57dGVtcGxhdGVSZWY6dGhpcy5fdGVtcGxhdGUsY29udGV4dDp7JGltcGxpY2l0OnQuaXRlbSxjZGtWaXJ0dWFsRm9yT2Y6dGhpcy5fY2RrVmlydHVhbEZvck9mLGluZGV4Oi0xLGNvdW50Oi0xLGZpcnN0OiExLGxhc3Q6ITEsb2RkOiExLGV2ZW46ITF9LGluZGV4OmV9fX1iRi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8YkYpKFNtKGVoKSxTbShYZyksU20oSGcpLFNtKGFGKSxTbShnRiw0KSxTbShhXykpfSxiRi7JtWRpcj1sbyh7dHlwZTpiRixzZWxlY3RvcnM6W1siIiwiY2RrVmlydHVhbEZvciIsIiIsImNka1ZpcnR1YWxGb3JPZiIsIiJdXSxpbnB1dHM6e2Nka1ZpcnR1YWxGb3JPZjoiY2RrVmlydHVhbEZvck9mIixjZGtWaXJ0dWFsRm9yVHJhY2tCeToiY2RrVmlydHVhbEZvclRyYWNrQnkiLGNka1ZpcnR1YWxGb3JUZW1wbGF0ZToiY2RrVmlydHVhbEZvclRlbXBsYXRlIixjZGtWaXJ0dWFsRm9yVGVtcGxhdGVDYWNoZVNpemU6ImNka1ZpcnR1YWxGb3JUZW1wbGF0ZUNhY2hlU2l6ZSJ9LGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6YUYsdXNlQ2xhc3M6bkZ9XSldfSksYkYuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTplaH0se3R5cGU6WGd9LHt0eXBlOkhnfSx7dHlwZTpuRixkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOlthRl19XX0se3R5cGU6Z0YsZGVjb3JhdG9yczpbe3R5cGU6RXJ9XX0se3R5cGU6YV99XSxiRi5wcm9wRGVjb3JhdG9ycz17Y2RrVmlydHVhbEZvck9mOlt7dHlwZTp4eX1dLGNka1ZpcnR1YWxGb3JUcmFja0J5Olt7dHlwZTp4eX1dLGNka1ZpcnR1YWxGb3JUZW1wbGF0ZTpbe3R5cGU6eHl9XSxjZGtWaXJ0dWFsRm9yVGVtcGxhdGVDYWNoZVNpemU6W3t0eXBlOnh5fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoYkYsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Nka1ZpcnR1YWxGb3JdW2Nka1ZpcnR1YWxGb3JPZl0iLHByb3ZpZGVyczpbe3Byb3ZpZGU6YUYsdXNlQ2xhc3M6bkZ9XX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmVofSx7dHlwZTpYZ30se3R5cGU6SGd9LHt0eXBlOm5GLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W2FGXX1dfSx7dHlwZTpnRixkZWNvcmF0b3JzOlt7dHlwZTpFcn1dfSx7dHlwZTphX31dfSkse2Nka1ZpcnR1YWxGb3JPZjpbe3R5cGU6eHl9XSxjZGtWaXJ0dWFsRm9yVHJhY2tCeTpbe3R5cGU6eHl9XSxjZGtWaXJ0dWFsRm9yVGVtcGxhdGU6W3t0eXBlOnh5fV0sY2RrVmlydHVhbEZvclRlbXBsYXRlQ2FjaGVTaXplOlt7dHlwZTp4eX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyB5Rnt9eUYuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHlGKX0seUYuybVtb2Q9YW8oe3R5cGU6eUZ9KSx5Ri7JtWluaj12bih7fSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh5Rixbe3R5cGU6QXksYXJnczpbe2V4cG9ydHM6W21GXSxkZWNsYXJhdGlvbnM6W21GXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKHlGLHtkZWNsYXJhdGlvbnM6W21GXSxleHBvcnRzOlttRl19KTtjbGFzcyBfRnt9ZnVuY3Rpb24gQ0YoKXt0aHJvdyBFcnJvcigiSG9zdCBhbHJlYWR5IGhhcyBhIHBvcnRhbCBhdHRhY2hlZCIpfV9GLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxfRil9LF9GLsm1bW9kPWFvKHt0eXBlOl9GfSksX0YuybVpbmo9dm4oe2ltcG9ydHM6W1tMSSxreix5Rl0sTEkseUZdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChfRixbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W0xJLGt6LHlGXSxleHBvcnRzOltMSSx5RixkRixiRixnRl0sZGVjbGFyYXRpb25zOltkRixiRixnRl19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhfRix7ZGVjbGFyYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuW2RGLGJGLGdGXX0saW1wb3J0czpmdW5jdGlvbigpe3JldHVybltMSSxreix5Rl19LGV4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bTEkseUYsZEYsYkYsZ0ZdfX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgTUZ7YXR0YWNoKHQpe3JldHVybigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmKG51bGw9PXQmJihmdW5jdGlvbiBlKCl7dGhyb3cgRXJyb3IoIkF0dGVtcHRpbmcgdG8gYXR0YWNoIGEgcG9ydGFsIHRvIGEgbnVsbCBQb3J0YWxPdXRsZXQiKX0pKCksdC5oYXNBdHRhY2hlZCgpJiZDRigpKSx0aGlzLl9hdHRhY2hlZEhvc3Q9dCx0LmF0dGFjaCh0aGlzKX1kZXRhY2goKXtsZXQgdD10aGlzLl9hdHRhY2hlZEhvc3Q7bnVsbCE9dD8odGhpcy5fYXR0YWNoZWRIb3N0PW51bGwsdC5kZXRhY2goKSk6KCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiYoZnVuY3Rpb24gZSgpe3Rocm93IEVycm9yKCJBdHRlbXB0aW5nIHRvIGRldGFjaCBhIHBvcnRhbCB0aGF0IGlzIG5vdCBhdHRhY2hlZCB0byBhIGhvc3QiKX0pKCl9Z2V0IGlzQXR0YWNoZWQoKXtyZXR1cm4gbnVsbCE9dGhpcy5fYXR0YWNoZWRIb3N0fXNldEF0dGFjaGVkSG9zdCh0KXt0aGlzLl9hdHRhY2hlZEhvc3Q9dH19Y2xhc3MgdkYgZXh0ZW5kcyBNRntjb25zdHJ1Y3Rvcih0LGUsbixvKXtzdXBlcigpLHRoaXMuY29tcG9uZW50PXQsdGhpcy52aWV3Q29udGFpbmVyUmVmPWUsdGhpcy5pbmplY3Rvcj1uLHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyPW99fWNsYXNzIHhGIGV4dGVuZHMgTUZ7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKCksdGhpcy50ZW1wbGF0ZVJlZj10LHRoaXMudmlld0NvbnRhaW5lclJlZj1lLHRoaXMuY29udGV4dD1ufWdldCBvcmlnaW4oKXtyZXR1cm4gdGhpcy50ZW1wbGF0ZVJlZi5lbGVtZW50UmVmfWF0dGFjaCh0LGU9dGhpcy5jb250ZXh0KXtyZXR1cm4gdGhpcy5jb250ZXh0PWUsc3VwZXIuYXR0YWNoKHQpfWRldGFjaCgpe3JldHVybiB0aGlzLmNvbnRleHQ9dm9pZCAwLHN1cGVyLmRldGFjaCgpfX1jbGFzcyBPRiBleHRlbmRzIE1Ge2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5lbGVtZW50PXQgaW5zdGFuY2VvZiBoZz90Lm5hdGl2ZUVsZW1lbnQ6dH19Y2xhc3MgUEZ7Y29uc3RydWN0b3IoKXt0aGlzLl9pc0Rpc3Bvc2VkPSExLHRoaXMuYXR0YWNoRG9tUG9ydGFsPW51bGx9aGFzQXR0YWNoZWQoKXtyZXR1cm4hIXRoaXMuX2F0dGFjaGVkUG9ydGFsfWF0dGFjaCh0KXtyZXR1cm4oInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJih0fHwoZnVuY3Rpb24gZSgpe3Rocm93IEVycm9yKCJNdXN0IHByb3ZpZGUgYSBwb3J0YWwgdG8gYXR0YWNoIil9KSgpLHRoaXMuaGFzQXR0YWNoZWQoKSYmQ0YoKSx0aGlzLl9pc0Rpc3Bvc2VkJiYoZnVuY3Rpb24gbigpe3Rocm93IEVycm9yKCJUaGlzIFBvcnRhbE91dGxldCBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkIil9KSgpKSx0IGluc3RhbmNlb2YgdkY/KHRoaXMuX2F0dGFjaGVkUG9ydGFsPXQsdGhpcy5hdHRhY2hDb21wb25lbnRQb3J0YWwodCkpOnQgaW5zdGFuY2VvZiB4Rj8odGhpcy5fYXR0YWNoZWRQb3J0YWw9dCx0aGlzLmF0dGFjaFRlbXBsYXRlUG9ydGFsKHQpKTp0aGlzLmF0dGFjaERvbVBvcnRhbCYmdCBpbnN0YW5jZW9mIE9GPyh0aGlzLl9hdHRhY2hlZFBvcnRhbD10LHRoaXMuYXR0YWNoRG9tUG9ydGFsKHQpKTp2b2lkKCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmKGZ1bmN0aW9uIG8oKXt0aHJvdyBFcnJvcigiQXR0ZW1wdGluZyB0byBhdHRhY2ggYW4gdW5rbm93biBQb3J0YWwgdHlwZS4gQmFzZVBvcnRhbE91dGxldCBhY2NlcHRzIGVpdGhlciBhIENvbXBvbmVudFBvcnRhbCBvciBhIFRlbXBsYXRlUG9ydGFsLiIpfSkoKSl9ZGV0YWNoKCl7dGhpcy5fYXR0YWNoZWRQb3J0YWwmJih0aGlzLl9hdHRhY2hlZFBvcnRhbC5zZXRBdHRhY2hlZEhvc3QobnVsbCksdGhpcy5fYXR0YWNoZWRQb3J0YWw9bnVsbCksdGhpcy5faW52b2tlRGlzcG9zZUZuKCl9ZGlzcG9zZSgpe3RoaXMuaGFzQXR0YWNoZWQoKSYmdGhpcy5kZXRhY2goKSx0aGlzLl9pbnZva2VEaXNwb3NlRm4oKSx0aGlzLl9pc0Rpc3Bvc2VkPSEwfXNldERpc3Bvc2VGbih0KXt0aGlzLl9kaXNwb3NlRm49dH1faW52b2tlRGlzcG9zZUZuKCl7dGhpcy5fZGlzcG9zZUZuJiYodGhpcy5fZGlzcG9zZUZuKCksdGhpcy5fZGlzcG9zZUZuPW51bGwpfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3Mgd0YgZXh0ZW5kcyBQRntjb25zdHJ1Y3Rvcih0LGUsbixvLGkpe3N1cGVyKCksdGhpcy5vdXRsZXRFbGVtZW50PXQsdGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyPWUsdGhpcy5fYXBwUmVmPW4sdGhpcy5fZGVmYXVsdEluamVjdG9yPW8sdGhpcy5hdHRhY2hEb21Qb3J0YWw9dD0+e2lmKCF0aGlzLl9kb2N1bWVudCYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93IEVycm9yKCJDYW5ub3QgYXR0YWNoIERPTSBwb3J0YWwgd2l0aG91dCBfZG9jdW1lbnQgY29uc3RydWN0b3IgcGFyYW1ldGVyIik7Y29uc3QgZT10LmVsZW1lbnQ7aWYoIWUucGFyZW50Tm9kZSYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93IEVycm9yKCJET00gcG9ydGFsIGNvbnRlbnQgbXVzdCBiZSBhdHRhY2hlZCB0byBhIHBhcmVudCBub2RlLiIpO2NvbnN0IG49dGhpcy5fZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgiZG9tLXBvcnRhbCIpO2UucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobixlKSx0aGlzLm91dGxldEVsZW1lbnQuYXBwZW5kQ2hpbGQoZSksdGhpcy5fYXR0YWNoZWRQb3J0YWw9dCxzdXBlci5zZXREaXNwb3NlRm4oKCgpPT57bi5wYXJlbnROb2RlJiZuLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsbil9KSl9LHRoaXMuX2RvY3VtZW50PWl9YXR0YWNoQ29tcG9uZW50UG9ydGFsKHQpe2NvbnN0IGU9KHQuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyfHx0aGlzLl9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KHQuY29tcG9uZW50KTtsZXQgbjtyZXR1cm4gdC52aWV3Q29udGFpbmVyUmVmPyhuPXQudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoZSx0LnZpZXdDb250YWluZXJSZWYubGVuZ3RoLHQuaW5qZWN0b3J8fHQudmlld0NvbnRhaW5lclJlZi5pbmplY3RvciksdGhpcy5zZXREaXNwb3NlRm4oKCgpPT5uLmRlc3Ryb3koKSkpKToobj1lLmNyZWF0ZSh0LmluamVjdG9yfHx0aGlzLl9kZWZhdWx0SW5qZWN0b3IpLHRoaXMuX2FwcFJlZi5hdHRhY2hWaWV3KG4uaG9zdFZpZXcpLHRoaXMuc2V0RGlzcG9zZUZuKCgoKT0+e3RoaXMuX2FwcFJlZi5kZXRhY2hWaWV3KG4uaG9zdFZpZXcpLG4uZGVzdHJveSgpfSkpKSx0aGlzLm91dGxldEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fZ2V0Q29tcG9uZW50Um9vdE5vZGUobikpLHRoaXMuX2F0dGFjaGVkUG9ydGFsPXQsbn1hdHRhY2hUZW1wbGF0ZVBvcnRhbCh0KXtsZXQgZT10LnZpZXdDb250YWluZXJSZWYsbj1lLmNyZWF0ZUVtYmVkZGVkVmlldyh0LnRlbXBsYXRlUmVmLHQuY29udGV4dCk7cmV0dXJuIG4ucm9vdE5vZGVzLmZvckVhY2goKHQ9PnRoaXMub3V0bGV0RWxlbWVudC5hcHBlbmRDaGlsZCh0KSkpLG4uZGV0ZWN0Q2hhbmdlcygpLHRoaXMuc2V0RGlzcG9zZUZuKCgoKT0+e2xldCB0PWUuaW5kZXhPZihuKTstMSE9PXQmJmUucmVtb3ZlKHQpfSkpLHRoaXMuX2F0dGFjaGVkUG9ydGFsPXQsbn1kaXNwb3NlKCl7c3VwZXIuZGlzcG9zZSgpLG51bGwhPXRoaXMub3V0bGV0RWxlbWVudC5wYXJlbnROb2RlJiZ0aGlzLm91dGxldEVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm91dGxldEVsZW1lbnQpfV9nZXRDb21wb25lbnRSb290Tm9kZSh0KXtyZXR1cm4gdC5ob3N0Vmlldy5yb290Tm9kZXNbMF19fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBrRiBleHRlbmRzIHhGe2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKX19a0YuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGtGKShTbShYZyksU20oZWgpKX0sa0YuybVkaXI9bG8oe3R5cGU6a0Ysc2VsZWN0b3JzOltbIiIsImNka1BvcnRhbCIsIiJdXSxleHBvcnRBczpbImNka1BvcnRhbCJdLGZlYXR1cmVzOlt4cF19KSxrRi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlhnfSx7dHlwZTplaH1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoa0YsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Nka1BvcnRhbF0iLGV4cG9ydEFzOiJjZGtQb3J0YWwifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6WGd9LHt0eXBlOmVofV19KSxudWxsKTtjbGFzcyBTRiBleHRlbmRzIGtGe31TRi7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoU0YpKSkobnx8U0YpfX0pKCksU0YuybVkaXI9bG8oe3R5cGU6U0Ysc2VsZWN0b3JzOltbIiIsImNkay1wb3J0YWwiLCIiXSxbIiIsInBvcnRhbCIsIiJdXSxleHBvcnRBczpbImNka1BvcnRhbCJdLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6a0YsdXNlRXhpc3Rpbmc6U0Z9XSkseHBdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChTRixbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbY2RrLXBvcnRhbF0sIFtwb3J0YWxdIixleHBvcnRBczoiY2RrUG9ydGFsIixwcm92aWRlcnM6W3twcm92aWRlOmtGLHVzZUV4aXN0aW5nOlNGfV19XX1dLG51bGwsbnVsbCk7Y2xhc3MgREYgZXh0ZW5kcyBQRntjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIoKSx0aGlzLl9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI9dCx0aGlzLl92aWV3Q29udGFpbmVyUmVmPWUsdGhpcy5faXNJbml0aWFsaXplZD0hMSx0aGlzLmF0dGFjaGVkPW5ldyBMaCx0aGlzLmF0dGFjaERvbVBvcnRhbD10PT57aWYoIXRoaXMuX2RvY3VtZW50JiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkpdGhyb3cgRXJyb3IoIkNhbm5vdCBhdHRhY2ggRE9NIHBvcnRhbCB3aXRob3V0IF9kb2N1bWVudCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIiKTtjb25zdCBlPXQuZWxlbWVudDtpZighZS5wYXJlbnROb2RlJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkpdGhyb3cgRXJyb3IoIkRPTSBwb3J0YWwgY29udGVudCBtdXN0IGJlIGF0dGFjaGVkIHRvIGEgcGFyZW50IG5vZGUuIik7Y29uc3Qgbj10aGlzLl9kb2N1bWVudC5jcmVhdGVDb21tZW50KCJkb20tcG9ydGFsIik7dC5zZXRBdHRhY2hlZEhvc3QodGhpcyksZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuLGUpLHRoaXMuX2dldFJvb3ROb2RlKCkuYXBwZW5kQ2hpbGQoZSksdGhpcy5fYXR0YWNoZWRQb3J0YWw9dCxzdXBlci5zZXREaXNwb3NlRm4oKCgpPT57bi5wYXJlbnROb2RlJiZuLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsbil9KSl9LHRoaXMuX2RvY3VtZW50PW59Z2V0IHBvcnRhbCgpe3JldHVybiB0aGlzLl9hdHRhY2hlZFBvcnRhbH1zZXQgcG9ydGFsKHQpeyghdGhpcy5oYXNBdHRhY2hlZCgpfHx0fHx0aGlzLl9pc0luaXRpYWxpemVkKSYmKHRoaXMuaGFzQXR0YWNoZWQoKSYmc3VwZXIuZGV0YWNoKCksdCYmc3VwZXIuYXR0YWNoKHQpLHRoaXMuX2F0dGFjaGVkUG9ydGFsPXQpfWdldCBhdHRhY2hlZFJlZigpe3JldHVybiB0aGlzLl9hdHRhY2hlZFJlZn1uZ09uSW5pdCgpe3RoaXMuX2lzSW5pdGlhbGl6ZWQ9ITB9bmdPbkRlc3Ryb3koKXtzdXBlci5kaXNwb3NlKCksdGhpcy5fYXR0YWNoZWRQb3J0YWw9bnVsbCx0aGlzLl9hdHRhY2hlZFJlZj1udWxsfWF0dGFjaENvbXBvbmVudFBvcnRhbCh0KXt0LnNldEF0dGFjaGVkSG9zdCh0aGlzKTtjb25zdCBlPW51bGwhPXQudmlld0NvbnRhaW5lclJlZj90LnZpZXdDb250YWluZXJSZWY6dGhpcy5fdmlld0NvbnRhaW5lclJlZixuPSh0LmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcnx8dGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyKS5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeSh0LmNvbXBvbmVudCksbz1lLmNyZWF0ZUNvbXBvbmVudChuLGUubGVuZ3RoLHQuaW5qZWN0b3J8fGUuaW5qZWN0b3IpO3JldHVybiBlIT09dGhpcy5fdmlld0NvbnRhaW5lclJlZiYmdGhpcy5fZ2V0Um9vdE5vZGUoKS5hcHBlbmRDaGlsZChvLmhvc3RWaWV3LnJvb3ROb2Rlc1swXSksc3VwZXIuc2V0RGlzcG9zZUZuKCgoKT0+by5kZXN0cm95KCkpKSx0aGlzLl9hdHRhY2hlZFBvcnRhbD10LHRoaXMuX2F0dGFjaGVkUmVmPW8sdGhpcy5hdHRhY2hlZC5lbWl0KG8pLG99YXR0YWNoVGVtcGxhdGVQb3J0YWwodCl7dC5zZXRBdHRhY2hlZEhvc3QodGhpcyk7Y29uc3QgZT10aGlzLl92aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0LnRlbXBsYXRlUmVmLHQuY29udGV4dCk7cmV0dXJuIHN1cGVyLnNldERpc3Bvc2VGbigoKCk9PnRoaXMuX3ZpZXdDb250YWluZXJSZWYuY2xlYXIoKSkpLHRoaXMuX2F0dGFjaGVkUG9ydGFsPXQsdGhpcy5fYXR0YWNoZWRSZWY9ZSx0aGlzLmF0dGFjaGVkLmVtaXQoZSksZX1fZ2V0Um9vdE5vZGUoKXtjb25zdCB0PXRoaXMuX3ZpZXdDb250YWluZXJSZWYuZWxlbWVudC5uYXRpdmVFbGVtZW50O3JldHVybiB0Lm5vZGVUeXBlPT09dC5FTEVNRU5UX05PREU/dDp0LnBhcmVudE5vZGV9fURGLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxERikoU20odWcpLFNtKGVoKSxTbShaXykpfSxERi7JtWRpcj1sbyh7dHlwZTpERixzZWxlY3RvcnM6W1siIiwiY2RrUG9ydGFsT3V0bGV0IiwiIl1dLGlucHV0czp7cG9ydGFsOlsiY2RrUG9ydGFsT3V0bGV0IiwicG9ydGFsIl19LG91dHB1dHM6e2F0dGFjaGVkOiJhdHRhY2hlZCJ9LGV4cG9ydEFzOlsiY2RrUG9ydGFsT3V0bGV0Il0sZmVhdHVyZXM6W3hwXX0pLERGLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6dWd9LHt0eXBlOmVofSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XSxERi5wcm9wRGVjb3JhdG9ycz17YXR0YWNoZWQ6W3t0eXBlOk95fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoREYsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Nka1BvcnRhbE91dGxldF0iLGV4cG9ydEFzOiJjZGtQb3J0YWxPdXRsZXQiLGlucHV0czpbInBvcnRhbDogY2RrUG9ydGFsT3V0bGV0Il19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp1Z30se3R5cGU6ZWh9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSkse2F0dGFjaGVkOlt7dHlwZTpPeX1dfSk7Y2xhc3MgRUYgZXh0ZW5kcyBERnt9RUYuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKEVGKSkpKG58fEVGKX19KSgpLEVGLsm1ZGlyPWxvKHt0eXBlOkVGLHNlbGVjdG9yczpbWyIiLCJjZGtQb3J0YWxIb3N0IiwiIl0sWyIiLCJwb3J0YWxIb3N0IiwiIl1dLGlucHV0czp7cG9ydGFsOlsiY2RrUG9ydGFsSG9zdCIsInBvcnRhbCJdfSxleHBvcnRBczpbImNka1BvcnRhbEhvc3QiXSxmZWF0dXJlczpbcGcoW3twcm92aWRlOkRGLHVzZUV4aXN0aW5nOkVGfV0pLHhwXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRUYsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Nka1BvcnRhbEhvc3RdLCBbcG9ydGFsSG9zdF0iLGV4cG9ydEFzOiJjZGtQb3J0YWxIb3N0IixpbnB1dHM6WyJwb3J0YWw6IGNka1BvcnRhbEhvc3QiXSxwcm92aWRlcnM6W3twcm92aWRlOkRGLHVzZUV4aXN0aW5nOkVGfV19XX1dLG51bGwsbnVsbCk7Y2xhc3MgUkZ7fVJGLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxSRil9LFJGLsm1bW9kPWFvKHt0eXBlOlJGfSksUkYuybVpbmo9dm4oe30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUkYsW3t0eXBlOkF5LGFyZ3M6W3tleHBvcnRzOltrRixERixTRixFRl0sZGVjbGFyYXRpb25zOltrRixERixTRixFRl19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhSRix7ZGVjbGFyYXRpb25zOltrRixERixTRixFRl0sZXhwb3J0czpba0YsREYsU0YsRUZdfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBBRj16eigpO2NsYXNzIFRGe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fdmlld3BvcnRSdWxlcj10LHRoaXMuX3ByZXZpb3VzSFRNTFN0eWxlcz17dG9wOiIiLGxlZnQ6IiJ9LHRoaXMuX2lzRW5hYmxlZD0hMSx0aGlzLl9kb2N1bWVudD1lfWF0dGFjaCgpe31lbmFibGUoKXtpZih0aGlzLl9jYW5CZUVuYWJsZWQoKSl7Y29uc3QgdD10aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7dGhpcy5fcHJldmlvdXNTY3JvbGxQb3NpdGlvbj10aGlzLl92aWV3cG9ydFJ1bGVyLmdldFZpZXdwb3J0U2Nyb2xsUG9zaXRpb24oKSx0aGlzLl9wcmV2aW91c0hUTUxTdHlsZXMubGVmdD10LnN0eWxlLmxlZnR8fCIiLHRoaXMuX3ByZXZpb3VzSFRNTFN0eWxlcy50b3A9dC5zdHlsZS50b3B8fCIiLHQuc3R5bGUubGVmdD12eigtdGhpcy5fcHJldmlvdXNTY3JvbGxQb3NpdGlvbi5sZWZ0KSx0LnN0eWxlLnRvcD12eigtdGhpcy5fcHJldmlvdXNTY3JvbGxQb3NpdGlvbi50b3ApLHQuY2xhc3NMaXN0LmFkZCgiY2RrLWdsb2JhbC1zY3JvbGxibG9jayIpLHRoaXMuX2lzRW5hYmxlZD0hMH19ZGlzYWJsZSgpe2lmKHRoaXMuX2lzRW5hYmxlZCl7Y29uc3QgdD10aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZT10LnN0eWxlLG49dGhpcy5fZG9jdW1lbnQuYm9keS5zdHlsZSxvPWUuc2Nyb2xsQmVoYXZpb3J8fCIiLGk9bi5zY3JvbGxCZWhhdmlvcnx8IiI7dGhpcy5faXNFbmFibGVkPSExLGUubGVmdD10aGlzLl9wcmV2aW91c0hUTUxTdHlsZXMubGVmdCxlLnRvcD10aGlzLl9wcmV2aW91c0hUTUxTdHlsZXMudG9wLHQuY2xhc3NMaXN0LnJlbW92ZSgiY2RrLWdsb2JhbC1zY3JvbGxibG9jayIpLEFGJiYoZS5zY3JvbGxCZWhhdmlvcj1uLnNjcm9sbEJlaGF2aW9yPSJhdXRvIiksd2luZG93LnNjcm9sbCh0aGlzLl9wcmV2aW91c1Njcm9sbFBvc2l0aW9uLmxlZnQsdGhpcy5fcHJldmlvdXNTY3JvbGxQb3NpdGlvbi50b3ApLEFGJiYoZS5zY3JvbGxCZWhhdmlvcj1vLG4uc2Nyb2xsQmVoYXZpb3I9aSl9fV9jYW5CZUVuYWJsZWQoKXtpZih0aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJjZGstZ2xvYmFsLXNjcm9sbGJsb2NrIil8fHRoaXMuX2lzRW5hYmxlZClyZXR1cm4hMTtjb25zdCB0PXRoaXMuX2RvY3VtZW50LmJvZHksZT10aGlzLl92aWV3cG9ydFJ1bGVyLmdldFZpZXdwb3J0U2l6ZSgpO3JldHVybiB0LnNjcm9sbEhlaWdodD5lLmhlaWdodHx8dC5zY3JvbGxXaWR0aD5lLndpZHRofX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gTkYoKXtyZXR1cm4gRXJyb3IoIlNjcm9sbCBzdHJhdGVneSBoYXMgYWxyZWFkeSBiZWVuIGF0dGFjaGVkLiIpfWNsYXNzIHpGe2NvbnN0cnVjdG9yKHQsZSxuLG8pe3RoaXMuX3Njcm9sbERpc3BhdGNoZXI9dCx0aGlzLl9uZ1pvbmU9ZSx0aGlzLl92aWV3cG9ydFJ1bGVyPW4sdGhpcy5fY29uZmlnPW8sdGhpcy5fc2Nyb2xsU3Vic2NyaXB0aW9uPW51bGwsdGhpcy5fZGV0YWNoPSgpPT57dGhpcy5kaXNhYmxlKCksdGhpcy5fb3ZlcmxheVJlZi5oYXNBdHRhY2hlZCgpJiZ0aGlzLl9uZ1pvbmUucnVuKCgoKT0+dGhpcy5fb3ZlcmxheVJlZi5kZXRhY2goKSkpfX1hdHRhY2godCl7aWYodGhpcy5fb3ZlcmxheVJlZiYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93IE5GKCk7dGhpcy5fb3ZlcmxheVJlZj10fWVuYWJsZSgpe2lmKHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbilyZXR1cm47Y29uc3QgdD10aGlzLl9zY3JvbGxEaXNwYXRjaGVyLnNjcm9sbGVkKDApO3RoaXMuX2NvbmZpZyYmdGhpcy5fY29uZmlnLnRocmVzaG9sZCYmdGhpcy5fY29uZmlnLnRocmVzaG9sZD4xPyh0aGlzLl9pbml0aWFsU2Nyb2xsUG9zaXRpb249dGhpcy5fdmlld3BvcnRSdWxlci5nZXRWaWV3cG9ydFNjcm9sbFBvc2l0aW9uKCkudG9wLHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbj10LnN1YnNjcmliZSgoKCk9Pntjb25zdCB0PXRoaXMuX3ZpZXdwb3J0UnVsZXIuZ2V0Vmlld3BvcnRTY3JvbGxQb3NpdGlvbigpLnRvcDtNYXRoLmFicyh0LXRoaXMuX2luaXRpYWxTY3JvbGxQb3NpdGlvbik+dGhpcy5fY29uZmlnLnRocmVzaG9sZD90aGlzLl9kZXRhY2goKTp0aGlzLl9vdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCl9KSkpOnRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbj10LnN1YnNjcmliZSh0aGlzLl9kZXRhY2gpfWRpc2FibGUoKXt0aGlzLl9zY3JvbGxTdWJzY3JpcHRpb24mJih0aGlzLl9zY3JvbGxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl9zY3JvbGxTdWJzY3JpcHRpb249bnVsbCl9ZGV0YWNoKCl7dGhpcy5kaXNhYmxlKCksdGhpcy5fb3ZlcmxheVJlZj1udWxsfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgSUZ7ZW5hYmxlKCl7fWRpc2FibGUoKXt9YXR0YWNoKCl7fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovZnVuY3Rpb24gSEYodCxlKXtyZXR1cm4gZS5zb21lKChlPT50LmJvdHRvbTxlLnRvcHx8dC50b3A+ZS5ib3R0b218fHQucmlnaHQ8ZS5sZWZ0fHx0LmxlZnQ+ZS5yaWdodCkpfWZ1bmN0aW9uIEZGKHQsZSl7cmV0dXJuIGUuc29tZSgoZT0+dC50b3A8ZS50b3B8fHQuYm90dG9tPmUuYm90dG9tfHx0LmxlZnQ8ZS5sZWZ0fHx0LnJpZ2h0PmUucmlnaHQpKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgTEZ7Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy5fc2Nyb2xsRGlzcGF0Y2hlcj10LHRoaXMuX3ZpZXdwb3J0UnVsZXI9ZSx0aGlzLl9uZ1pvbmU9bix0aGlzLl9jb25maWc9byx0aGlzLl9zY3JvbGxTdWJzY3JpcHRpb249bnVsbH1hdHRhY2godCl7aWYodGhpcy5fb3ZlcmxheVJlZiYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93IE5GKCk7dGhpcy5fb3ZlcmxheVJlZj10fWVuYWJsZSgpe3RoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbnx8KHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbj10aGlzLl9zY3JvbGxEaXNwYXRjaGVyLnNjcm9sbGVkKHRoaXMuX2NvbmZpZz90aGlzLl9jb25maWcuc2Nyb2xsVGhyb3R0bGU6MCkuc3Vic2NyaWJlKCgoKT0+e2lmKHRoaXMuX292ZXJsYXlSZWYudXBkYXRlUG9zaXRpb24oKSx0aGlzLl9jb25maWcmJnRoaXMuX2NvbmZpZy5hdXRvQ2xvc2Upe2NvbnN0IHQ9dGhpcy5fb3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx7d2lkdGg6ZSxoZWlnaHQ6bn09dGhpcy5fdmlld3BvcnRSdWxlci5nZXRWaWV3cG9ydFNpemUoKTtIRih0LFt7d2lkdGg6ZSxoZWlnaHQ6bixib3R0b206bixyaWdodDplLHRvcDowLGxlZnQ6MH1dKSYmKHRoaXMuZGlzYWJsZSgpLHRoaXMuX25nWm9uZS5ydW4oKCgpPT50aGlzLl9vdmVybGF5UmVmLmRldGFjaCgpKSkpfX0pKSl9ZGlzYWJsZSgpe3RoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbiYmKHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbj1udWxsKX1kZXRhY2goKXt0aGlzLmRpc2FibGUoKSx0aGlzLl9vdmVybGF5UmVmPW51bGx9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBCRntjb25zdHJ1Y3Rvcih0LGUsbixvKXt0aGlzLl9zY3JvbGxEaXNwYXRjaGVyPXQsdGhpcy5fdmlld3BvcnRSdWxlcj1lLHRoaXMuX25nWm9uZT1uLHRoaXMubm9vcD0oKT0+bmV3IElGLHRoaXMuY2xvc2U9dD0+bmV3IHpGKHRoaXMuX3Njcm9sbERpc3BhdGNoZXIsdGhpcy5fbmdab25lLHRoaXMuX3ZpZXdwb3J0UnVsZXIsdCksdGhpcy5ibG9jaz0oKT0+bmV3IFRGKHRoaXMuX3ZpZXdwb3J0UnVsZXIsdGhpcy5fZG9jdW1lbnQpLHRoaXMucmVwb3NpdGlvbj10PT5uZXcgTEYodGhpcy5fc2Nyb2xsRGlzcGF0Y2hlcix0aGlzLl92aWV3cG9ydFJ1bGVyLHRoaXMuX25nWm9uZSx0KSx0aGlzLl9kb2N1bWVudD1vfX1CRi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8QkYpKHZyKHBGKSx2cih1RiksdnIoYV8pLHZyKFpfKSl9LEJGLsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIG5ldyBCRih2cihwRiksdnIodUYpLHZyKGFfKSx2cihaXykpfSx0b2tlbjpCRixwcm92aWRlZEluOiJyb290In0pLEJGLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6cEZ9LHt0eXBlOnVGfSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChCRixbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6cEZ9LHt0eXBlOnVGfSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBWRntjb25zdHJ1Y3Rvcih0KXtpZih0aGlzLnNjcm9sbFN0cmF0ZWd5PW5ldyBJRix0aGlzLnBhbmVsQ2xhc3M9IiIsdGhpcy5oYXNCYWNrZHJvcD0hMSx0aGlzLmJhY2tkcm9wQ2xhc3M9ImNkay1vdmVybGF5LWRhcmstYmFja2Ryb3AiLHRoaXMuZGlzcG9zZU9uTmF2aWdhdGlvbj0hMSx0KXtjb25zdCBlPU9iamVjdC5rZXlzKHQpO2Zvcihjb25zdCBuIG9mIGUpdm9pZCAwIT09dFtuXSYmKHRoaXNbbl09dFtuXSl9fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgakZ7Y29uc3RydWN0b3IodCxlLG4sbyxpKXt0aGlzLm9mZnNldFg9bix0aGlzLm9mZnNldFk9byx0aGlzLnBhbmVsQ2xhc3M9aSx0aGlzLm9yaWdpblg9dC5vcmlnaW5YLHRoaXMub3JpZ2luWT10Lm9yaWdpblksdGhpcy5vdmVybGF5WD1lLm92ZXJsYXlYLHRoaXMub3ZlcmxheVk9ZS5vdmVybGF5WX19Y2xhc3MgVUZ7fWNsYXNzIEdGe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5jb25uZWN0aW9uUGFpcj10LHRoaXMuc2Nyb2xsYWJsZVZpZXdQcm9wZXJ0aWVzPWV9fWZ1bmN0aW9uIFdGKHQsZSl7aWYoInRvcCIhPT1lJiYiYm90dG9tIiE9PWUmJiJjZW50ZXIiIT09ZSl0aHJvdyBFcnJvcihgQ29ubmVjdGVkUG9zaXRpb246IEludmFsaWQgJHt0fSAiJHtlfSIuIEV4cGVjdGVkICJ0b3AiLCAiYm90dG9tIiBvciAiY2VudGVyIi5gKX1mdW5jdGlvbiBZRih0LGUpe2lmKCJzdGFydCIhPT1lJiYiZW5kIiE9PWUmJiJjZW50ZXIiIT09ZSl0aHJvdyBFcnJvcihgQ29ubmVjdGVkUG9zaXRpb246IEludmFsaWQgJHt0fSAiJHtlfSIuIEV4cGVjdGVkICJzdGFydCIsICJlbmQiIG9yICJjZW50ZXIiLmApfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9HRi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmpGfSx7dHlwZTpVRixkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfV07Y2xhc3MgcUZ7Y29uc3RydWN0b3IodCl7dGhpcy5fYXR0YWNoZWRPdmVybGF5cz1bXSx0aGlzLl9kb2N1bWVudD10fW5nT25EZXN0cm95KCl7dGhpcy5kZXRhY2goKX1hZGQodCl7dGhpcy5yZW1vdmUodCksdGhpcy5fYXR0YWNoZWRPdmVybGF5cy5wdXNoKHQpfXJlbW92ZSh0KXtjb25zdCBlPXRoaXMuX2F0dGFjaGVkT3ZlcmxheXMuaW5kZXhPZih0KTtlPi0xJiZ0aGlzLl9hdHRhY2hlZE92ZXJsYXlzLnNwbGljZShlLDEpLDA9PT10aGlzLl9hdHRhY2hlZE92ZXJsYXlzLmxlbmd0aCYmdGhpcy5kZXRhY2goKX19cUYuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHFGKSh2cihaXykpfSxxRi7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgcUYodnIoWl8pKX0sdG9rZW46cUYscHJvdmlkZWRJbjoicm9vdCJ9KSxxRi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgocUYsW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOiJyb290In1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBaRiBleHRlbmRzIHFGe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuX2tleWRvd25MaXN0ZW5lcj10PT57Y29uc3QgZT10aGlzLl9hdHRhY2hlZE92ZXJsYXlzO2ZvcihsZXQgbj1lLmxlbmd0aC0xO24+LTE7bi0tKWlmKGVbbl0uX2tleWRvd25FdmVudHMub2JzZXJ2ZXJzLmxlbmd0aD4wKXtlW25dLl9rZXlkb3duRXZlbnRzLm5leHQodCk7YnJlYWt9fX1hZGQodCl7c3VwZXIuYWRkKHQpLHRoaXMuX2lzQXR0YWNoZWR8fCh0aGlzLl9kb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuX2tleWRvd25MaXN0ZW5lciksdGhpcy5faXNBdHRhY2hlZD0hMCl9ZGV0YWNoKCl7dGhpcy5faXNBdHRhY2hlZCYmKHRoaXMuX2RvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5fa2V5ZG93bkxpc3RlbmVyKSx0aGlzLl9pc0F0dGFjaGVkPSExKX19WkYuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFpGKSh2cihaXykpfSxaRi7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgWkYodnIoWl8pKX0sdG9rZW46WkYscHJvdmlkZWRJbjoicm9vdCJ9KSxaRi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWkYsW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOiJyb290In1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBYRiBleHRlbmRzIHFGe2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCksdGhpcy5fcGxhdGZvcm09ZSx0aGlzLl9jdXJzb3JTdHlsZUlzU2V0PSExLHRoaXMuX2NsaWNrTGlzdGVuZXI9dD0+e2NvbnN0IGU9THoodCksbj10aGlzLl9hdHRhY2hlZE92ZXJsYXlzLnNsaWNlKCk7Zm9yKGxldCBvPW4ubGVuZ3RoLTE7bz4tMTtvLS0pe2NvbnN0IGk9bltvXTtpZighKGkuX291dHNpZGVQb2ludGVyRXZlbnRzLm9ic2VydmVycy5sZW5ndGg8MSkmJmkuaGFzQXR0YWNoZWQoKSl7aWYoaS5vdmVybGF5RWxlbWVudC5jb250YWlucyhlKSlicmVhaztpLl9vdXRzaWRlUG9pbnRlckV2ZW50cy5uZXh0KHQpfX19fWFkZCh0KXtpZihzdXBlci5hZGQodCksIXRoaXMuX2lzQXR0YWNoZWQpe2NvbnN0IHQ9dGhpcy5fZG9jdW1lbnQuYm9keTt0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLl9jbGlja0xpc3RlbmVyLCEwKSx0LmFkZEV2ZW50TGlzdGVuZXIoImF1eGNsaWNrIix0aGlzLl9jbGlja0xpc3RlbmVyLCEwKSx0LmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51Iix0aGlzLl9jbGlja0xpc3RlbmVyLCEwKSx0aGlzLl9wbGF0Zm9ybS5JT1MmJiF0aGlzLl9jdXJzb3JTdHlsZUlzU2V0JiYodGhpcy5fY3Vyc29yT3JpZ2luYWxWYWx1ZT10LnN0eWxlLmN1cnNvcix0LnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy5fY3Vyc29yU3R5bGVJc1NldD0hMCksdGhpcy5faXNBdHRhY2hlZD0hMH19ZGV0YWNoKCl7aWYodGhpcy5faXNBdHRhY2hlZCl7Y29uc3QgdD10aGlzLl9kb2N1bWVudC5ib2R5O3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuX2NsaWNrTGlzdGVuZXIsITApLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYXV4Y2xpY2siLHRoaXMuX2NsaWNrTGlzdGVuZXIsITApLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLHRoaXMuX2NsaWNrTGlzdGVuZXIsITApLHRoaXMuX3BsYXRmb3JtLklPUyYmdGhpcy5fY3Vyc29yU3R5bGVJc1NldCYmKHQuc3R5bGUuY3Vyc29yPXRoaXMuX2N1cnNvck9yaWdpbmFsVmFsdWUsdGhpcy5fY3Vyc29yU3R5bGVJc1NldD0hMSksdGhpcy5faXNBdHRhY2hlZD0hMX19fVhGLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxYRikodnIoWl8pLHZyKHd6KSl9LFhGLsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIG5ldyBYRih2cihaXyksdnIod3opKX0sdG9rZW46WEYscHJvdmlkZWRJbjoicm9vdCJ9KSxYRi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6d3p9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFhGLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOnd6fV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IEtGPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSxKRj12b2lkIDAhPT1LRi5fX2thcm1hX18mJiEhS0YuX19rYXJtYV9ffHx2b2lkIDAhPT1LRi5qYXNtaW5lJiYhIUtGLmphc21pbmV8fHZvaWQgMCE9PUtGLmplc3QmJiEhS0YuamVzdHx8dm9pZCAwIT09S0YuTW9jaGEmJiEhS0YuTW9jaGE7Y2xhc3MgUUZ7Y29uc3RydWN0b3IodCxlKXt0aGlzLl9wbGF0Zm9ybT1lLHRoaXMuX2RvY3VtZW50PXR9bmdPbkRlc3Ryb3koKXtjb25zdCB0PXRoaXMuX2NvbnRhaW5lckVsZW1lbnQ7dCYmdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCl9Z2V0Q29udGFpbmVyRWxlbWVudCgpe3JldHVybiB0aGlzLl9jb250YWluZXJFbGVtZW50fHx0aGlzLl9jcmVhdGVDb250YWluZXIoKSx0aGlzLl9jb250YWluZXJFbGVtZW50fV9jcmVhdGVDb250YWluZXIoKXtjb25zdCB0PSJjZGstb3ZlcmxheS1jb250YWluZXIiO2lmKHRoaXMuX3BsYXRmb3JtLmlzQnJvd3Nlcnx8SkYpe2NvbnN0IGU9dGhpcy5fZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgLiR7dH1bcGxhdGZvcm09InNlcnZlciJdLCAuJHt0fVtwbGF0Zm9ybT0idGVzdCJdYCk7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVbdF0pfWNvbnN0IGU9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5jbGFzc0xpc3QuYWRkKHQpLEpGP2Uuc2V0QXR0cmlidXRlKCJwbGF0Zm9ybSIsInRlc3QiKTp0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXJ8fGUuc2V0QXR0cmlidXRlKCJwbGF0Zm9ybSIsInNlcnZlciIpLHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSksdGhpcy5fY29udGFpbmVyRWxlbWVudD1lfX1RRi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8UUYpKHZyKFpfKSx2cih3eikpfSxRRi7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgUUYodnIoWl8pLHZyKHd6KSl9LHRva2VuOlFGLHByb3ZpZGVkSW46InJvb3QifSksUUYuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOnd6fV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChRRixbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTp3en1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyAkRntjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyLHMsbCl7dGhpcy5fcG9ydGFsT3V0bGV0PXQsdGhpcy5faG9zdD1lLHRoaXMuX3BhbmU9bix0aGlzLl9jb25maWc9byx0aGlzLl9uZ1pvbmU9aSx0aGlzLl9rZXlib2FyZERpc3BhdGNoZXI9YSx0aGlzLl9kb2N1bWVudD1yLHRoaXMuX2xvY2F0aW9uPXMsdGhpcy5fb3V0c2lkZUNsaWNrRGlzcGF0Y2hlcj1sLHRoaXMuX2JhY2tkcm9wRWxlbWVudD1udWxsLHRoaXMuX2JhY2tkcm9wQ2xpY2s9bmV3IEksdGhpcy5fYXR0YWNobWVudHM9bmV3IEksdGhpcy5fZGV0YWNobWVudHM9bmV3IEksdGhpcy5fbG9jYXRpb25DaGFuZ2VzPW0uRU1QVFksdGhpcy5fYmFja2Ryb3BDbGlja0hhbmRsZXI9dD0+dGhpcy5fYmFja2Ryb3BDbGljay5uZXh0KHQpLHRoaXMuX2tleWRvd25FdmVudHM9bmV3IEksdGhpcy5fb3V0c2lkZVBvaW50ZXJFdmVudHM9bmV3IEksby5zY3JvbGxTdHJhdGVneSYmKHRoaXMuX3Njcm9sbFN0cmF0ZWd5PW8uc2Nyb2xsU3RyYXRlZ3ksdGhpcy5fc2Nyb2xsU3RyYXRlZ3kuYXR0YWNoKHRoaXMpKSx0aGlzLl9wb3NpdGlvblN0cmF0ZWd5PW8ucG9zaXRpb25TdHJhdGVneX1nZXQgb3ZlcmxheUVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fcGFuZX1nZXQgYmFja2Ryb3BFbGVtZW50KCl7cmV0dXJuIHRoaXMuX2JhY2tkcm9wRWxlbWVudH1nZXQgaG9zdEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5faG9zdH1hdHRhY2godCl7bGV0IGU9dGhpcy5fcG9ydGFsT3V0bGV0LmF0dGFjaCh0KTtyZXR1cm4hdGhpcy5faG9zdC5wYXJlbnRFbGVtZW50JiZ0aGlzLl9wcmV2aW91c0hvc3RQYXJlbnQmJnRoaXMuX3ByZXZpb3VzSG9zdFBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLl9ob3N0KSx0aGlzLl9wb3NpdGlvblN0cmF0ZWd5JiZ0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LmF0dGFjaCh0aGlzKSx0aGlzLl91cGRhdGVTdGFja2luZ09yZGVyKCksdGhpcy5fdXBkYXRlRWxlbWVudFNpemUoKSx0aGlzLl91cGRhdGVFbGVtZW50RGlyZWN0aW9uKCksdGhpcy5fc2Nyb2xsU3RyYXRlZ3kmJnRoaXMuX3Njcm9sbFN0cmF0ZWd5LmVuYWJsZSgpLHRoaXMuX25nWm9uZS5vblN0YWJsZS5waXBlKGJlKDEpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5oYXNBdHRhY2hlZCgpJiZ0aGlzLnVwZGF0ZVBvc2l0aW9uKCl9KSksdGhpcy5fdG9nZ2xlUG9pbnRlckV2ZW50cyghMCksdGhpcy5fY29uZmlnLmhhc0JhY2tkcm9wJiZ0aGlzLl9hdHRhY2hCYWNrZHJvcCgpLHRoaXMuX2NvbmZpZy5wYW5lbENsYXNzJiZ0aGlzLl90b2dnbGVDbGFzc2VzKHRoaXMuX3BhbmUsdGhpcy5fY29uZmlnLnBhbmVsQ2xhc3MsITApLHRoaXMuX2F0dGFjaG1lbnRzLm5leHQoKSx0aGlzLl9rZXlib2FyZERpc3BhdGNoZXIuYWRkKHRoaXMpLHRoaXMuX2NvbmZpZy5kaXNwb3NlT25OYXZpZ2F0aW9uJiYodGhpcy5fbG9jYXRpb25DaGFuZ2VzPXRoaXMuX2xvY2F0aW9uLnN1YnNjcmliZSgoKCk9PnRoaXMuZGlzcG9zZSgpKSkpLHRoaXMuX291dHNpZGVDbGlja0Rpc3BhdGNoZXIuYWRkKHRoaXMpLGV9ZGV0YWNoKCl7aWYoIXRoaXMuaGFzQXR0YWNoZWQoKSlyZXR1cm47dGhpcy5kZXRhY2hCYWNrZHJvcCgpLHRoaXMuX3RvZ2dsZVBvaW50ZXJFdmVudHMoITEpLHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kmJnRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kuZGV0YWNoJiZ0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LmRldGFjaCgpLHRoaXMuX3Njcm9sbFN0cmF0ZWd5JiZ0aGlzLl9zY3JvbGxTdHJhdGVneS5kaXNhYmxlKCk7Y29uc3QgdD10aGlzLl9wb3J0YWxPdXRsZXQuZGV0YWNoKCk7cmV0dXJuIHRoaXMuX2RldGFjaG1lbnRzLm5leHQoKSx0aGlzLl9rZXlib2FyZERpc3BhdGNoZXIucmVtb3ZlKHRoaXMpLHRoaXMuX2RldGFjaENvbnRlbnRXaGVuU3RhYmxlKCksdGhpcy5fbG9jYXRpb25DaGFuZ2VzLnVuc3Vic2NyaWJlKCksdGhpcy5fb3V0c2lkZUNsaWNrRGlzcGF0Y2hlci5yZW1vdmUodGhpcyksdH1kaXNwb3NlKCl7Y29uc3QgdD10aGlzLmhhc0F0dGFjaGVkKCk7dGhpcy5fcG9zaXRpb25TdHJhdGVneSYmdGhpcy5fcG9zaXRpb25TdHJhdGVneS5kaXNwb3NlKCksdGhpcy5fZGlzcG9zZVNjcm9sbFN0cmF0ZWd5KCksdGhpcy5kZXRhY2hCYWNrZHJvcCgpLHRoaXMuX2xvY2F0aW9uQ2hhbmdlcy51bnN1YnNjcmliZSgpLHRoaXMuX2tleWJvYXJkRGlzcGF0Y2hlci5yZW1vdmUodGhpcyksdGhpcy5fcG9ydGFsT3V0bGV0LmRpc3Bvc2UoKSx0aGlzLl9hdHRhY2htZW50cy5jb21wbGV0ZSgpLHRoaXMuX2JhY2tkcm9wQ2xpY2suY29tcGxldGUoKSx0aGlzLl9rZXlkb3duRXZlbnRzLmNvbXBsZXRlKCksdGhpcy5fb3V0c2lkZVBvaW50ZXJFdmVudHMuY29tcGxldGUoKSx0aGlzLl9vdXRzaWRlQ2xpY2tEaXNwYXRjaGVyLnJlbW92ZSh0aGlzKSx0aGlzLl9ob3N0JiZ0aGlzLl9ob3N0LnBhcmVudE5vZGUmJih0aGlzLl9ob3N0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5faG9zdCksdGhpcy5faG9zdD1udWxsKSx0aGlzLl9wcmV2aW91c0hvc3RQYXJlbnQ9dGhpcy5fcGFuZT1udWxsLHQmJnRoaXMuX2RldGFjaG1lbnRzLm5leHQoKSx0aGlzLl9kZXRhY2htZW50cy5jb21wbGV0ZSgpfWhhc0F0dGFjaGVkKCl7cmV0dXJuIHRoaXMuX3BvcnRhbE91dGxldC5oYXNBdHRhY2hlZCgpfWJhY2tkcm9wQ2xpY2soKXtyZXR1cm4gdGhpcy5fYmFja2Ryb3BDbGlja31hdHRhY2htZW50cygpe3JldHVybiB0aGlzLl9hdHRhY2htZW50c31kZXRhY2htZW50cygpe3JldHVybiB0aGlzLl9kZXRhY2htZW50c31rZXlkb3duRXZlbnRzKCl7cmV0dXJuIHRoaXMuX2tleWRvd25FdmVudHN9b3V0c2lkZVBvaW50ZXJFdmVudHMoKXtyZXR1cm4gdGhpcy5fb3V0c2lkZVBvaW50ZXJFdmVudHN9Z2V0Q29uZmlnKCl7cmV0dXJuIHRoaXMuX2NvbmZpZ311cGRhdGVQb3NpdGlvbigpe3RoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kmJnRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kuYXBwbHkoKX11cGRhdGVQb3NpdGlvblN0cmF0ZWd5KHQpe3QhPT10aGlzLl9wb3NpdGlvblN0cmF0ZWd5JiYodGhpcy5fcG9zaXRpb25TdHJhdGVneSYmdGhpcy5fcG9zaXRpb25TdHJhdGVneS5kaXNwb3NlKCksdGhpcy5fcG9zaXRpb25TdHJhdGVneT10LHRoaXMuaGFzQXR0YWNoZWQoKSYmKHQuYXR0YWNoKHRoaXMpLHRoaXMudXBkYXRlUG9zaXRpb24oKSkpfXVwZGF0ZVNpemUodCl7dGhpcy5fY29uZmlnPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0aGlzLl9jb25maWcpLHQpLHRoaXMuX3VwZGF0ZUVsZW1lbnRTaXplKCl9c2V0RGlyZWN0aW9uKHQpe3RoaXMuX2NvbmZpZz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdGhpcy5fY29uZmlnKSx7ZGlyZWN0aW9uOnR9KSx0aGlzLl91cGRhdGVFbGVtZW50RGlyZWN0aW9uKCl9YWRkUGFuZWxDbGFzcyh0KXt0aGlzLl9wYW5lJiZ0aGlzLl90b2dnbGVDbGFzc2VzKHRoaXMuX3BhbmUsdCwhMCl9cmVtb3ZlUGFuZWxDbGFzcyh0KXt0aGlzLl9wYW5lJiZ0aGlzLl90b2dnbGVDbGFzc2VzKHRoaXMuX3BhbmUsdCwhMSl9Z2V0RGlyZWN0aW9uKCl7Y29uc3QgdD10aGlzLl9jb25maWcuZGlyZWN0aW9uO3JldHVybiB0PyJzdHJpbmciPT10eXBlb2YgdD90OnQudmFsdWU6Imx0ciJ9dXBkYXRlU2Nyb2xsU3RyYXRlZ3kodCl7dCE9PXRoaXMuX3Njcm9sbFN0cmF0ZWd5JiYodGhpcy5fZGlzcG9zZVNjcm9sbFN0cmF0ZWd5KCksdGhpcy5fc2Nyb2xsU3RyYXRlZ3k9dCx0aGlzLmhhc0F0dGFjaGVkKCkmJih0LmF0dGFjaCh0aGlzKSx0LmVuYWJsZSgpKSl9X3VwZGF0ZUVsZW1lbnREaXJlY3Rpb24oKXt0aGlzLl9ob3N0LnNldEF0dHJpYnV0ZSgiZGlyIix0aGlzLmdldERpcmVjdGlvbigpKX1fdXBkYXRlRWxlbWVudFNpemUoKXtpZighdGhpcy5fcGFuZSlyZXR1cm47Y29uc3QgdD10aGlzLl9wYW5lLnN0eWxlO3Qud2lkdGg9dnoodGhpcy5fY29uZmlnLndpZHRoKSx0LmhlaWdodD12eih0aGlzLl9jb25maWcuaGVpZ2h0KSx0Lm1pbldpZHRoPXZ6KHRoaXMuX2NvbmZpZy5taW5XaWR0aCksdC5taW5IZWlnaHQ9dnoodGhpcy5fY29uZmlnLm1pbkhlaWdodCksdC5tYXhXaWR0aD12eih0aGlzLl9jb25maWcubWF4V2lkdGgpLHQubWF4SGVpZ2h0PXZ6KHRoaXMuX2NvbmZpZy5tYXhIZWlnaHQpfV90b2dnbGVQb2ludGVyRXZlbnRzKHQpe3RoaXMuX3BhbmUuc3R5bGUucG9pbnRlckV2ZW50cz10PyIiOiJub25lIn1fYXR0YWNoQmFja2Ryb3AoKXtjb25zdCB0PSJjZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nIjt0aGlzLl9iYWNrZHJvcEVsZW1lbnQ9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5fYmFja2Ryb3BFbGVtZW50LmNsYXNzTGlzdC5hZGQoImNkay1vdmVybGF5LWJhY2tkcm9wIiksdGhpcy5fY29uZmlnLmJhY2tkcm9wQ2xhc3MmJnRoaXMuX3RvZ2dsZUNsYXNzZXModGhpcy5fYmFja2Ryb3BFbGVtZW50LHRoaXMuX2NvbmZpZy5iYWNrZHJvcENsYXNzLCEwKSx0aGlzLl9ob3N0LnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMuX2JhY2tkcm9wRWxlbWVudCx0aGlzLl9ob3N0KSx0aGlzLl9iYWNrZHJvcEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuX2JhY2tkcm9wQ2xpY2tIYW5kbGVyKSwidW5kZWZpbmVkIiE9dHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZT90aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT57cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+e3RoaXMuX2JhY2tkcm9wRWxlbWVudCYmdGhpcy5fYmFja2Ryb3BFbGVtZW50LmNsYXNzTGlzdC5hZGQodCl9KSl9KSk6dGhpcy5fYmFja2Ryb3BFbGVtZW50LmNsYXNzTGlzdC5hZGQodCl9X3VwZGF0ZVN0YWNraW5nT3JkZXIoKXt0aGlzLl9ob3N0Lm5leHRTaWJsaW5nJiZ0aGlzLl9ob3N0LnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcy5faG9zdCl9ZGV0YWNoQmFja2Ryb3AoKXtsZXQgdCxlPXRoaXMuX2JhY2tkcm9wRWxlbWVudDtpZighZSlyZXR1cm47bGV0IG49KCk9PntlJiYoZS5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5fYmFja2Ryb3BDbGlja0hhbmRsZXIpLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmVuZCIsbiksZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSkpLHRoaXMuX2JhY2tkcm9wRWxlbWVudD09ZSYmKHRoaXMuX2JhY2tkcm9wRWxlbWVudD1udWxsKSx0aGlzLl9jb25maWcuYmFja2Ryb3BDbGFzcyYmdGhpcy5fdG9nZ2xlQ2xhc3NlcyhlLHRoaXMuX2NvbmZpZy5iYWNrZHJvcENsYXNzLCExKSxjbGVhclRpbWVvdXQodCl9O2UuY2xhc3NMaXN0LnJlbW92ZSgiY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZyIpLHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PntlLmFkZEV2ZW50TGlzdGVuZXIoInRyYW5zaXRpb25lbmQiLG4pfSkpLGUuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIsdD10aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT5zZXRUaW1lb3V0KG4sNTAwKSkpfV90b2dnbGVDbGFzc2VzKHQsZSxuKXtjb25zdCBvPXQuY2xhc3NMaXN0O016KGUpLmZvckVhY2goKHQ9Pnt0JiYobj9vLmFkZCh0KTpvLnJlbW92ZSh0KSl9KSl9X2RldGFjaENvbnRlbnRXaGVuU3RhYmxlKCl7dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e2NvbnN0IHQ9dGhpcy5fbmdab25lLm9uU3RhYmxlLnBpcGUoSWUocmUodGhpcy5fYXR0YWNobWVudHMsdGhpcy5fZGV0YWNobWVudHMpKSkuc3Vic2NyaWJlKCgoKT0+e3RoaXMuX3BhbmUmJnRoaXMuX2hvc3QmJjAhPT10aGlzLl9wYW5lLmNoaWxkcmVuLmxlbmd0aHx8KHRoaXMuX3BhbmUmJnRoaXMuX2NvbmZpZy5wYW5lbENsYXNzJiZ0aGlzLl90b2dnbGVDbGFzc2VzKHRoaXMuX3BhbmUsdGhpcy5fY29uZmlnLnBhbmVsQ2xhc3MsITEpLHRoaXMuX2hvc3QmJnRoaXMuX2hvc3QucGFyZW50RWxlbWVudCYmKHRoaXMuX3ByZXZpb3VzSG9zdFBhcmVudD10aGlzLl9ob3N0LnBhcmVudEVsZW1lbnQsdGhpcy5fcHJldmlvdXNIb3N0UGFyZW50LnJlbW92ZUNoaWxkKHRoaXMuX2hvc3QpKSx0LnVuc3Vic2NyaWJlKCkpfSkpfSkpfV9kaXNwb3NlU2Nyb2xsU3RyYXRlZ3koKXtjb25zdCB0PXRoaXMuX3Njcm9sbFN0cmF0ZWd5O3QmJih0LmRpc2FibGUoKSx0LmRldGFjaCYmdC5kZXRhY2goKSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCB0TD0iY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveCIsZUw9LyhbQS1aYS16JV0rKSQvO2NsYXNzIG5Me2NvbnN0cnVjdG9yKHQsZSxuLG8saSl7dGhpcy5fdmlld3BvcnRSdWxlcj1lLHRoaXMuX2RvY3VtZW50PW4sdGhpcy5fcGxhdGZvcm09byx0aGlzLl9vdmVybGF5Q29udGFpbmVyPWksdGhpcy5fbGFzdEJvdW5kaW5nQm94U2l6ZT17d2lkdGg6MCxoZWlnaHQ6MH0sdGhpcy5faXNQdXNoZWQ9ITEsdGhpcy5fY2FuUHVzaD0hMCx0aGlzLl9ncm93QWZ0ZXJPcGVuPSExLHRoaXMuX2hhc0ZsZXhpYmxlRGltZW5zaW9ucz0hMCx0aGlzLl9wb3NpdGlvbkxvY2tlZD0hMSx0aGlzLl92aWV3cG9ydE1hcmdpbj0wLHRoaXMuX3Njcm9sbGFibGVzPVtdLHRoaXMuX3ByZWZlcnJlZFBvc2l0aW9ucz1bXSx0aGlzLl9wb3NpdGlvbkNoYW5nZXM9bmV3IEksdGhpcy5fcmVzaXplU3Vic2NyaXB0aW9uPW0uRU1QVFksdGhpcy5fb2Zmc2V0WD0wLHRoaXMuX29mZnNldFk9MCx0aGlzLl9hcHBsaWVkUGFuZWxDbGFzc2VzPVtdLHRoaXMucG9zaXRpb25DaGFuZ2VzPXRoaXMuX3Bvc2l0aW9uQ2hhbmdlcyx0aGlzLnNldE9yaWdpbih0KX1nZXQgcG9zaXRpb25zKCl7cmV0dXJuIHRoaXMuX3ByZWZlcnJlZFBvc2l0aW9uc31hdHRhY2godCl7aWYodGhpcy5fb3ZlcmxheVJlZiYmdCE9PXRoaXMuX292ZXJsYXlSZWYmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSl0aHJvdyBFcnJvcigiVGhpcyBwb3NpdGlvbiBzdHJhdGVneSBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIGFuIG92ZXJsYXkiKTt0aGlzLl92YWxpZGF0ZVBvc2l0aW9ucygpLHQuaG9zdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0TCksdGhpcy5fb3ZlcmxheVJlZj10LHRoaXMuX2JvdW5kaW5nQm94PXQuaG9zdEVsZW1lbnQsdGhpcy5fcGFuZT10Lm92ZXJsYXlFbGVtZW50LHRoaXMuX2lzRGlzcG9zZWQ9ITEsdGhpcy5faXNJbml0aWFsUmVuZGVyPSEwLHRoaXMuX2xhc3RQb3NpdGlvbj1udWxsLHRoaXMuX3Jlc2l6ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX3Jlc2l6ZVN1YnNjcmlwdGlvbj10aGlzLl92aWV3cG9ydFJ1bGVyLmNoYW5nZSgpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLl9pc0luaXRpYWxSZW5kZXI9ITAsdGhpcy5hcHBseSgpfSkpfWFwcGx5KCl7aWYodGhpcy5faXNEaXNwb3NlZHx8IXRoaXMuX3BsYXRmb3JtLmlzQnJvd3NlcilyZXR1cm47aWYoIXRoaXMuX2lzSW5pdGlhbFJlbmRlciYmdGhpcy5fcG9zaXRpb25Mb2NrZWQmJnRoaXMuX2xhc3RQb3NpdGlvbilyZXR1cm4gdm9pZCB0aGlzLnJlYXBwbHlMYXN0UG9zaXRpb24oKTt0aGlzLl9jbGVhclBhbmVsQ2xhc3NlcygpLHRoaXMuX3Jlc2V0T3ZlcmxheUVsZW1lbnRTdHlsZXMoKSx0aGlzLl9yZXNldEJvdW5kaW5nQm94U3R5bGVzKCksdGhpcy5fdmlld3BvcnRSZWN0PXRoaXMuX2dldE5hcnJvd2VkVmlld3BvcnRSZWN0KCksdGhpcy5fb3JpZ2luUmVjdD10aGlzLl9nZXRPcmlnaW5SZWN0KCksdGhpcy5fb3ZlcmxheVJlY3Q9dGhpcy5fcGFuZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCB0PXRoaXMuX29yaWdpblJlY3QsZT10aGlzLl9vdmVybGF5UmVjdCxuPXRoaXMuX3ZpZXdwb3J0UmVjdCxvPVtdO2xldCBpO2ZvcihsZXQgYSBvZiB0aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnMpe2xldCByPXRoaXMuX2dldE9yaWdpblBvaW50KHQsYSkscz10aGlzLl9nZXRPdmVybGF5UG9pbnQocixlLGEpLGw9dGhpcy5fZ2V0T3ZlcmxheUZpdChzLGUsbixhKTtpZihsLmlzQ29tcGxldGVseVdpdGhpblZpZXdwb3J0KXJldHVybiB0aGlzLl9pc1B1c2hlZD0hMSx2b2lkIHRoaXMuX2FwcGx5UG9zaXRpb24oYSxyKTt0aGlzLl9jYW5GaXRXaXRoRmxleGlibGVEaW1lbnNpb25zKGwscyxuKT9vLnB1c2goe3Bvc2l0aW9uOmEsb3JpZ2luOnIsb3ZlcmxheVJlY3Q6ZSxib3VuZGluZ0JveFJlY3Q6dGhpcy5fY2FsY3VsYXRlQm91bmRpbmdCb3hSZWN0KHIsYSl9KTooIWl8fGkub3ZlcmxheUZpdC52aXNpYmxlQXJlYTxsLnZpc2libGVBcmVhKSYmKGk9e292ZXJsYXlGaXQ6bCxvdmVybGF5UG9pbnQ6cyxvcmlnaW5Qb2ludDpyLHBvc2l0aW9uOmEsb3ZlcmxheVJlY3Q6ZX0pfWlmKG8ubGVuZ3RoKXtsZXQgdD1udWxsLGU9LTE7Zm9yKGNvbnN0IG4gb2Ygbyl7Y29uc3Qgbz1uLmJvdW5kaW5nQm94UmVjdC53aWR0aCpuLmJvdW5kaW5nQm94UmVjdC5oZWlnaHQqKG4ucG9zaXRpb24ud2VpZ2h0fHwxKTtvPmUmJihlPW8sdD1uKX1yZXR1cm4gdGhpcy5faXNQdXNoZWQ9ITEsdm9pZCB0aGlzLl9hcHBseVBvc2l0aW9uKHQucG9zaXRpb24sdC5vcmlnaW4pfWlmKHRoaXMuX2NhblB1c2gpcmV0dXJuIHRoaXMuX2lzUHVzaGVkPSEwLHZvaWQgdGhpcy5fYXBwbHlQb3NpdGlvbihpLnBvc2l0aW9uLGkub3JpZ2luUG9pbnQpO3RoaXMuX2FwcGx5UG9zaXRpb24oaS5wb3NpdGlvbixpLm9yaWdpblBvaW50KX1kZXRhY2goKXt0aGlzLl9jbGVhclBhbmVsQ2xhc3NlcygpLHRoaXMuX2xhc3RQb3NpdGlvbj1udWxsLHRoaXMuX3ByZXZpb3VzUHVzaEFtb3VudD1udWxsLHRoaXMuX3Jlc2l6ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpfWRpc3Bvc2UoKXt0aGlzLl9pc0Rpc3Bvc2VkfHwodGhpcy5fYm91bmRpbmdCb3gmJm9MKHRoaXMuX2JvdW5kaW5nQm94LnN0eWxlLHt0b3A6IiIsbGVmdDoiIixyaWdodDoiIixib3R0b206IiIsaGVpZ2h0OiIiLHdpZHRoOiIiLGFsaWduSXRlbXM6IiIsanVzdGlmeUNvbnRlbnQ6IiJ9KSx0aGlzLl9wYW5lJiZ0aGlzLl9yZXNldE92ZXJsYXlFbGVtZW50U3R5bGVzKCksdGhpcy5fb3ZlcmxheVJlZiYmdGhpcy5fb3ZlcmxheVJlZi5ob3N0RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHRMKSx0aGlzLmRldGFjaCgpLHRoaXMuX3Bvc2l0aW9uQ2hhbmdlcy5jb21wbGV0ZSgpLHRoaXMuX292ZXJsYXlSZWY9dGhpcy5fYm91bmRpbmdCb3g9bnVsbCx0aGlzLl9pc0Rpc3Bvc2VkPSEwKX1yZWFwcGx5TGFzdFBvc2l0aW9uKCl7aWYoIXRoaXMuX2lzRGlzcG9zZWQmJighdGhpcy5fcGxhdGZvcm18fHRoaXMuX3BsYXRmb3JtLmlzQnJvd3Nlcikpe3RoaXMuX29yaWdpblJlY3Q9dGhpcy5fZ2V0T3JpZ2luUmVjdCgpLHRoaXMuX292ZXJsYXlSZWN0PXRoaXMuX3BhbmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdGhpcy5fdmlld3BvcnRSZWN0PXRoaXMuX2dldE5hcnJvd2VkVmlld3BvcnRSZWN0KCk7Y29uc3QgdD10aGlzLl9sYXN0UG9zaXRpb258fHRoaXMuX3ByZWZlcnJlZFBvc2l0aW9uc1swXSxlPXRoaXMuX2dldE9yaWdpblBvaW50KHRoaXMuX29yaWdpblJlY3QsdCk7dGhpcy5fYXBwbHlQb3NpdGlvbih0LGUpfX13aXRoU2Nyb2xsYWJsZUNvbnRhaW5lcnModCl7cmV0dXJuIHRoaXMuX3Njcm9sbGFibGVzPXQsdGhpc313aXRoUG9zaXRpb25zKHQpe3JldHVybiB0aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnM9dCwtMT09PXQuaW5kZXhPZih0aGlzLl9sYXN0UG9zaXRpb24pJiYodGhpcy5fbGFzdFBvc2l0aW9uPW51bGwpLHRoaXMuX3ZhbGlkYXRlUG9zaXRpb25zKCksdGhpc313aXRoVmlld3BvcnRNYXJnaW4odCl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0TWFyZ2luPXQsdGhpc313aXRoRmxleGlibGVEaW1lbnNpb25zKHQ9ITApe3JldHVybiB0aGlzLl9oYXNGbGV4aWJsZURpbWVuc2lvbnM9dCx0aGlzfXdpdGhHcm93QWZ0ZXJPcGVuKHQ9ITApe3JldHVybiB0aGlzLl9ncm93QWZ0ZXJPcGVuPXQsdGhpc313aXRoUHVzaCh0PSEwKXtyZXR1cm4gdGhpcy5fY2FuUHVzaD10LHRoaXN9d2l0aExvY2tlZFBvc2l0aW9uKHQ9ITApe3JldHVybiB0aGlzLl9wb3NpdGlvbkxvY2tlZD10LHRoaXN9c2V0T3JpZ2luKHQpe3JldHVybiB0aGlzLl9vcmlnaW49dCx0aGlzfXdpdGhEZWZhdWx0T2Zmc2V0WCh0KXtyZXR1cm4gdGhpcy5fb2Zmc2V0WD10LHRoaXN9d2l0aERlZmF1bHRPZmZzZXRZKHQpe3JldHVybiB0aGlzLl9vZmZzZXRZPXQsdGhpc313aXRoVHJhbnNmb3JtT3JpZ2luT24odCl7cmV0dXJuIHRoaXMuX3RyYW5zZm9ybU9yaWdpblNlbGVjdG9yPXQsdGhpc31fZ2V0T3JpZ2luUG9pbnQodCxlKXtsZXQgbixvO2lmKCJjZW50ZXIiPT1lLm9yaWdpblgpbj10LmxlZnQrdC53aWR0aC8yO2Vsc2V7Y29uc3Qgbz10aGlzLl9pc1J0bCgpP3QucmlnaHQ6dC5sZWZ0LGk9dGhpcy5faXNSdGwoKT90LmxlZnQ6dC5yaWdodDtuPSJzdGFydCI9PWUub3JpZ2luWD9vOml9cmV0dXJuIG89ImNlbnRlciI9PWUub3JpZ2luWT90LnRvcCt0LmhlaWdodC8yOiJ0b3AiPT1lLm9yaWdpblk/dC50b3A6dC5ib3R0b20se3g6bix5Om99fV9nZXRPdmVybGF5UG9pbnQodCxlLG4pe2xldCBvLGk7cmV0dXJuIG89ImNlbnRlciI9PW4ub3ZlcmxheVg/LWUud2lkdGgvMjoic3RhcnQiPT09bi5vdmVybGF5WD90aGlzLl9pc1J0bCgpPy1lLndpZHRoOjA6dGhpcy5faXNSdGwoKT8wOi1lLndpZHRoLGk9ImNlbnRlciI9PW4ub3ZlcmxheVk/LWUuaGVpZ2h0LzI6InRvcCI9PW4ub3ZlcmxheVk/MDotZS5oZWlnaHQse3g6dC54K28seTp0LnkraX19X2dldE92ZXJsYXlGaXQodCxlLG4sbyl7Y29uc3QgaT1hTChlKTtsZXR7eDphLHk6cn09dCxzPXRoaXMuX2dldE9mZnNldChvLCJ4IiksbD10aGlzLl9nZXRPZmZzZXQobywieSIpO3MmJihhKz1zKSxsJiYocis9bCk7bGV0IGM9MC1yLGQ9citpLmhlaWdodC1uLmhlaWdodCxwPXRoaXMuX3N1YnRyYWN0T3ZlcmZsb3dzKGkud2lkdGgsMC1hLGEraS53aWR0aC1uLndpZHRoKSxtPXRoaXMuX3N1YnRyYWN0T3ZlcmZsb3dzKGkuaGVpZ2h0LGMsZCksdT1wKm07cmV0dXJue3Zpc2libGVBcmVhOnUsaXNDb21wbGV0ZWx5V2l0aGluVmlld3BvcnQ6aS53aWR0aCppLmhlaWdodD09PXUsZml0c0luVmlld3BvcnRWZXJ0aWNhbGx5Om09PT1pLmhlaWdodCxmaXRzSW5WaWV3cG9ydEhvcml6b250YWxseTpwPT1pLndpZHRofX1fY2FuRml0V2l0aEZsZXhpYmxlRGltZW5zaW9ucyh0LGUsbil7aWYodGhpcy5faGFzRmxleGlibGVEaW1lbnNpb25zKXtjb25zdCBvPW4uYm90dG9tLWUueSxpPW4ucmlnaHQtZS54LGE9aUwodGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKS5taW5IZWlnaHQpLHI9aUwodGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKS5taW5XaWR0aCkscz10LmZpdHNJblZpZXdwb3J0SG9yaXpvbnRhbGx5fHxudWxsIT1yJiZyPD1pO3JldHVybih0LmZpdHNJblZpZXdwb3J0VmVydGljYWxseXx8bnVsbCE9YSYmYTw9bykmJnN9cmV0dXJuITF9X3B1c2hPdmVybGF5T25TY3JlZW4odCxlLG4pe2lmKHRoaXMuX3ByZXZpb3VzUHVzaEFtb3VudCYmdGhpcy5fcG9zaXRpb25Mb2NrZWQpcmV0dXJue3g6dC54K3RoaXMuX3ByZXZpb3VzUHVzaEFtb3VudC54LHk6dC55K3RoaXMuX3ByZXZpb3VzUHVzaEFtb3VudC55fTtjb25zdCBvPWFMKGUpLGk9dGhpcy5fdmlld3BvcnRSZWN0LGE9TWF0aC5tYXgodC54K28ud2lkdGgtaS53aWR0aCwwKSxyPU1hdGgubWF4KHQueStvLmhlaWdodC1pLmhlaWdodCwwKSxzPU1hdGgubWF4KGkudG9wLW4udG9wLXQueSwwKSxsPU1hdGgubWF4KGkubGVmdC1uLmxlZnQtdC54LDApO2xldCBjPTAsZD0wO3JldHVybiBjPW8ud2lkdGg8PWkud2lkdGg/bHx8LWE6dC54PHRoaXMuX3ZpZXdwb3J0TWFyZ2luP2kubGVmdC1uLmxlZnQtdC54OjAsZD1vLmhlaWdodDw9aS5oZWlnaHQ/c3x8LXI6dC55PHRoaXMuX3ZpZXdwb3J0TWFyZ2luP2kudG9wLW4udG9wLXQueTowLHRoaXMuX3ByZXZpb3VzUHVzaEFtb3VudD17eDpjLHk6ZH0se3g6dC54K2MseTp0LnkrZH19X2FwcGx5UG9zaXRpb24odCxlKXtpZih0aGlzLl9zZXRUcmFuc2Zvcm1PcmlnaW4odCksdGhpcy5fc2V0T3ZlcmxheUVsZW1lbnRTdHlsZXMoZSx0KSx0aGlzLl9zZXRCb3VuZGluZ0JveFN0eWxlcyhlLHQpLHQucGFuZWxDbGFzcyYmdGhpcy5fYWRkUGFuZWxDbGFzc2VzKHQucGFuZWxDbGFzcyksdGhpcy5fbGFzdFBvc2l0aW9uPXQsdGhpcy5fcG9zaXRpb25DaGFuZ2VzLm9ic2VydmVycy5sZW5ndGgpe2NvbnN0IGU9dGhpcy5fZ2V0U2Nyb2xsVmlzaWJpbGl0eSgpLG49bmV3IEdGKHQsZSk7dGhpcy5fcG9zaXRpb25DaGFuZ2VzLm5leHQobil9dGhpcy5faXNJbml0aWFsUmVuZGVyPSExfV9zZXRUcmFuc2Zvcm1PcmlnaW4odCl7aWYoIXRoaXMuX3RyYW5zZm9ybU9yaWdpblNlbGVjdG9yKXJldHVybjtjb25zdCBlPXRoaXMuX2JvdW5kaW5nQm94LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5fdHJhbnNmb3JtT3JpZ2luU2VsZWN0b3IpO2xldCBuLG89dC5vdmVybGF5WTtuPSJjZW50ZXIiPT09dC5vdmVybGF5WD8iY2VudGVyIjp0aGlzLl9pc1J0bCgpPyJzdGFydCI9PT10Lm92ZXJsYXlYPyJyaWdodCI6ImxlZnQiOiJzdGFydCI9PT10Lm92ZXJsYXlYPyJsZWZ0IjoicmlnaHQiO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0uc3R5bGUudHJhbnNmb3JtT3JpZ2luPWAke259ICR7b31gfV9jYWxjdWxhdGVCb3VuZGluZ0JveFJlY3QodCxlKXtjb25zdCBuPXRoaXMuX3ZpZXdwb3J0UmVjdCxvPXRoaXMuX2lzUnRsKCk7bGV0IGksYSxyLHMsbCxjO2lmKCJ0b3AiPT09ZS5vdmVybGF5WSlhPXQueSxpPW4uaGVpZ2h0LWErdGhpcy5fdmlld3BvcnRNYXJnaW47ZWxzZSBpZigiYm90dG9tIj09PWUub3ZlcmxheVkpcj1uLmhlaWdodC10LnkrMip0aGlzLl92aWV3cG9ydE1hcmdpbixpPW4uaGVpZ2h0LXIrdGhpcy5fdmlld3BvcnRNYXJnaW47ZWxzZXtjb25zdCBlPU1hdGgubWluKG4uYm90dG9tLXQueStuLnRvcCx0LnkpLG89dGhpcy5fbGFzdEJvdW5kaW5nQm94U2l6ZS5oZWlnaHQ7aT0yKmUsYT10LnktZSxpPm8mJiF0aGlzLl9pc0luaXRpYWxSZW5kZXImJiF0aGlzLl9ncm93QWZ0ZXJPcGVuJiYoYT10Lnktby8yKX1pZigiZW5kIj09PWUub3ZlcmxheVgmJiFvfHwic3RhcnQiPT09ZS5vdmVybGF5WCYmbyljPW4ud2lkdGgtdC54K3RoaXMuX3ZpZXdwb3J0TWFyZ2luLHM9dC54LXRoaXMuX3ZpZXdwb3J0TWFyZ2luO2Vsc2UgaWYoInN0YXJ0Ij09PWUub3ZlcmxheVgmJiFvfHwiZW5kIj09PWUub3ZlcmxheVgmJm8pbD10Lngscz1uLnJpZ2h0LXQueDtlbHNle2NvbnN0IGU9TWF0aC5taW4obi5yaWdodC10Lngrbi5sZWZ0LHQueCksbz10aGlzLl9sYXN0Qm91bmRpbmdCb3hTaXplLndpZHRoO3M9MiplLGw9dC54LWUscz5vJiYhdGhpcy5faXNJbml0aWFsUmVuZGVyJiYhdGhpcy5fZ3Jvd0FmdGVyT3BlbiYmKGw9dC54LW8vMil9cmV0dXJue3RvcDphLGxlZnQ6bCxib3R0b206cixyaWdodDpjLHdpZHRoOnMsaGVpZ2h0Oml9fV9zZXRCb3VuZGluZ0JveFN0eWxlcyh0LGUpe2NvbnN0IG49dGhpcy5fY2FsY3VsYXRlQm91bmRpbmdCb3hSZWN0KHQsZSk7dGhpcy5faXNJbml0aWFsUmVuZGVyfHx0aGlzLl9ncm93QWZ0ZXJPcGVufHwobi5oZWlnaHQ9TWF0aC5taW4obi5oZWlnaHQsdGhpcy5fbGFzdEJvdW5kaW5nQm94U2l6ZS5oZWlnaHQpLG4ud2lkdGg9TWF0aC5taW4obi53aWR0aCx0aGlzLl9sYXN0Qm91bmRpbmdCb3hTaXplLndpZHRoKSk7Y29uc3Qgbz17fTtpZih0aGlzLl9oYXNFeGFjdFBvc2l0aW9uKCkpby50b3A9by5sZWZ0PSIwIixvLmJvdHRvbT1vLnJpZ2h0PW8ubWF4SGVpZ2h0PW8ubWF4V2lkdGg9IiIsby53aWR0aD1vLmhlaWdodD0iMTAwJSI7ZWxzZXtjb25zdCB0PXRoaXMuX292ZXJsYXlSZWYuZ2V0Q29uZmlnKCkubWF4SGVpZ2h0LGk9dGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKS5tYXhXaWR0aDtvLmhlaWdodD12eihuLmhlaWdodCksby50b3A9dnoobi50b3ApLG8uYm90dG9tPXZ6KG4uYm90dG9tKSxvLndpZHRoPXZ6KG4ud2lkdGgpLG8ubGVmdD12eihuLmxlZnQpLG8ucmlnaHQ9dnoobi5yaWdodCksby5hbGlnbkl0ZW1zPSJjZW50ZXIiPT09ZS5vdmVybGF5WD8iY2VudGVyIjoiZW5kIj09PWUub3ZlcmxheVg/ImZsZXgtZW5kIjoiZmxleC1zdGFydCIsby5qdXN0aWZ5Q29udGVudD0iY2VudGVyIj09PWUub3ZlcmxheVk/ImNlbnRlciI6ImJvdHRvbSI9PT1lLm92ZXJsYXlZPyJmbGV4LWVuZCI6ImZsZXgtc3RhcnQiLHQmJihvLm1heEhlaWdodD12eih0KSksaSYmKG8ubWF4V2lkdGg9dnooaSkpfXRoaXMuX2xhc3RCb3VuZGluZ0JveFNpemU9bixvTCh0aGlzLl9ib3VuZGluZ0JveC5zdHlsZSxvKX1fcmVzZXRCb3VuZGluZ0JveFN0eWxlcygpe29MKHRoaXMuX2JvdW5kaW5nQm94LnN0eWxlLHt0b3A6IjAiLGxlZnQ6IjAiLHJpZ2h0OiIwIixib3R0b206IjAiLGhlaWdodDoiIix3aWR0aDoiIixhbGlnbkl0ZW1zOiIiLGp1c3RpZnlDb250ZW50OiIifSl9X3Jlc2V0T3ZlcmxheUVsZW1lbnRTdHlsZXMoKXtvTCh0aGlzLl9wYW5lLnN0eWxlLHt0b3A6IiIsbGVmdDoiIixib3R0b206IiIscmlnaHQ6IiIscG9zaXRpb246IiIsdHJhbnNmb3JtOiIifSl9X3NldE92ZXJsYXlFbGVtZW50U3R5bGVzKHQsZSl7Y29uc3Qgbj17fSxvPXRoaXMuX2hhc0V4YWN0UG9zaXRpb24oKSxpPXRoaXMuX2hhc0ZsZXhpYmxlRGltZW5zaW9ucyxhPXRoaXMuX292ZXJsYXlSZWYuZ2V0Q29uZmlnKCk7aWYobyl7Y29uc3Qgbz10aGlzLl92aWV3cG9ydFJ1bGVyLmdldFZpZXdwb3J0U2Nyb2xsUG9zaXRpb24oKTtvTChuLHRoaXMuX2dldEV4YWN0T3ZlcmxheVkoZSx0LG8pKSxvTChuLHRoaXMuX2dldEV4YWN0T3ZlcmxheVgoZSx0LG8pKX1lbHNlIG4ucG9zaXRpb249InN0YXRpYyI7bGV0IHI9IiIscz10aGlzLl9nZXRPZmZzZXQoZSwieCIpLGw9dGhpcy5fZ2V0T2Zmc2V0KGUsInkiKTtzJiYocis9YHRyYW5zbGF0ZVgoJHtzfXB4KSBgKSxsJiYocis9YHRyYW5zbGF0ZVkoJHtsfXB4KWApLG4udHJhbnNmb3JtPXIudHJpbSgpLGEubWF4SGVpZ2h0JiYobz9uLm1heEhlaWdodD12eihhLm1heEhlaWdodCk6aSYmKG4ubWF4SGVpZ2h0PSIiKSksYS5tYXhXaWR0aCYmKG8/bi5tYXhXaWR0aD12eihhLm1heFdpZHRoKTppJiYobi5tYXhXaWR0aD0iIikpLG9MKHRoaXMuX3BhbmUuc3R5bGUsbil9X2dldEV4YWN0T3ZlcmxheVkodCxlLG4pe2xldCBvPXt0b3A6IiIsYm90dG9tOiIifSxpPXRoaXMuX2dldE92ZXJsYXlQb2ludChlLHRoaXMuX292ZXJsYXlSZWN0LHQpO3RoaXMuX2lzUHVzaGVkJiYoaT10aGlzLl9wdXNoT3ZlcmxheU9uU2NyZWVuKGksdGhpcy5fb3ZlcmxheVJlY3QsbikpO2xldCBhPXRoaXMuX292ZXJsYXlDb250YWluZXIuZ2V0Q29udGFpbmVyRWxlbWVudCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtyZXR1cm4gaS55LT1hLCJib3R0b20iPT09dC5vdmVybGF5WT9vLmJvdHRvbT10aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LShpLnkrdGhpcy5fb3ZlcmxheVJlY3QuaGVpZ2h0KSsicHgiOm8udG9wPXZ6KGkueSksb31fZ2V0RXhhY3RPdmVybGF5WCh0LGUsbil7bGV0IG8saT17bGVmdDoiIixyaWdodDoiIn0sYT10aGlzLl9nZXRPdmVybGF5UG9pbnQoZSx0aGlzLl9vdmVybGF5UmVjdCx0KTtyZXR1cm4gdGhpcy5faXNQdXNoZWQmJihhPXRoaXMuX3B1c2hPdmVybGF5T25TY3JlZW4oYSx0aGlzLl9vdmVybGF5UmVjdCxuKSksbz10aGlzLl9pc1J0bCgpPyJlbmQiPT09dC5vdmVybGF5WD8ibGVmdCI6InJpZ2h0IjoiZW5kIj09PXQub3ZlcmxheVg/InJpZ2h0IjoibGVmdCIsInJpZ2h0Ij09PW8/aS5yaWdodD10aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgtKGEueCt0aGlzLl9vdmVybGF5UmVjdC53aWR0aCkrInB4IjppLmxlZnQ9dnooYS54KSxpfV9nZXRTY3JvbGxWaXNpYmlsaXR5KCl7Y29uc3QgdD10aGlzLl9nZXRPcmlnaW5SZWN0KCksZT10aGlzLl9wYW5lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49dGhpcy5fc2Nyb2xsYWJsZXMubWFwKCh0PT50LmdldEVsZW1lbnRSZWYoKS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSk7cmV0dXJue2lzT3JpZ2luQ2xpcHBlZDpGRih0LG4pLGlzT3JpZ2luT3V0c2lkZVZpZXc6SEYodCxuKSxpc092ZXJsYXlDbGlwcGVkOkZGKGUsbiksaXNPdmVybGF5T3V0c2lkZVZpZXc6SEYoZSxuKX19X3N1YnRyYWN0T3ZlcmZsb3dzKHQsLi4uZSl7cmV0dXJuIGUucmVkdWNlKCgodCxlKT0+dC1NYXRoLm1heChlLDApKSx0KX1fZ2V0TmFycm93ZWRWaWV3cG9ydFJlY3QoKXtjb25zdCB0PXRoaXMuX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCxlPXRoaXMuX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsbj10aGlzLl92aWV3cG9ydFJ1bGVyLmdldFZpZXdwb3J0U2Nyb2xsUG9zaXRpb24oKTtyZXR1cm57dG9wOm4udG9wK3RoaXMuX3ZpZXdwb3J0TWFyZ2luLGxlZnQ6bi5sZWZ0K3RoaXMuX3ZpZXdwb3J0TWFyZ2luLHJpZ2h0Om4ubGVmdCt0LXRoaXMuX3ZpZXdwb3J0TWFyZ2luLGJvdHRvbTpuLnRvcCtlLXRoaXMuX3ZpZXdwb3J0TWFyZ2luLHdpZHRoOnQtMip0aGlzLl92aWV3cG9ydE1hcmdpbixoZWlnaHQ6ZS0yKnRoaXMuX3ZpZXdwb3J0TWFyZ2lufX1faXNSdGwoKXtyZXR1cm4icnRsIj09PXRoaXMuX292ZXJsYXlSZWYuZ2V0RGlyZWN0aW9uKCl9X2hhc0V4YWN0UG9zaXRpb24oKXtyZXR1cm4hdGhpcy5faGFzRmxleGlibGVEaW1lbnNpb25zfHx0aGlzLl9pc1B1c2hlZH1fZ2V0T2Zmc2V0KHQsZSl7cmV0dXJuIngiPT09ZT9udWxsPT10Lm9mZnNldFg/dGhpcy5fb2Zmc2V0WDp0Lm9mZnNldFg6bnVsbD09dC5vZmZzZXRZP3RoaXMuX29mZnNldFk6dC5vZmZzZXRZfV92YWxpZGF0ZVBvc2l0aW9ucygpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpe2lmKCF0aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnMubGVuZ3RoKXRocm93IEVycm9yKCJGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3k6IEF0IGxlYXN0IG9uZSBwb3NpdGlvbiBpcyByZXF1aXJlZC4iKTt0aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnMuZm9yRWFjaCgodD0+e1lGKCJvcmlnaW5YIix0Lm9yaWdpblgpLFdGKCJvcmlnaW5ZIix0Lm9yaWdpblkpLFlGKCJvdmVybGF5WCIsdC5vdmVybGF5WCksV0YoIm92ZXJsYXlZIix0Lm92ZXJsYXlZKX0pKX19X2FkZFBhbmVsQ2xhc3Nlcyh0KXt0aGlzLl9wYW5lJiZNeih0KS5mb3JFYWNoKCh0PT57IiIhPT10JiYtMT09PXRoaXMuX2FwcGxpZWRQYW5lbENsYXNzZXMuaW5kZXhPZih0KSYmKHRoaXMuX2FwcGxpZWRQYW5lbENsYXNzZXMucHVzaCh0KSx0aGlzLl9wYW5lLmNsYXNzTGlzdC5hZGQodCkpfSkpfV9jbGVhclBhbmVsQ2xhc3Nlcygpe3RoaXMuX3BhbmUmJih0aGlzLl9hcHBsaWVkUGFuZWxDbGFzc2VzLmZvckVhY2goKHQ9Pnt0aGlzLl9wYW5lLmNsYXNzTGlzdC5yZW1vdmUodCl9KSksdGhpcy5fYXBwbGllZFBhbmVsQ2xhc3Nlcz1bXSl9X2dldE9yaWdpblJlY3QoKXtjb25zdCB0PXRoaXMuX29yaWdpbjtpZih0IGluc3RhbmNlb2YgaGcpcmV0dXJuIHQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZih0IGluc3RhbmNlb2YgRWxlbWVudClyZXR1cm4gdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCBlPXQud2lkdGh8fDAsbj10LmhlaWdodHx8MDtyZXR1cm57dG9wOnQueSxib3R0b206dC55K24sbGVmdDp0LngscmlnaHQ6dC54K2UsaGVpZ2h0Om4sd2lkdGg6ZX19fWZ1bmN0aW9uIG9MKHQsZSl7Zm9yKGxldCBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSk7cmV0dXJuIHR9ZnVuY3Rpb24gaUwodCl7aWYoIm51bWJlciIhPXR5cGVvZiB0JiZudWxsIT10KXtjb25zdFtlLG5dPXQuc3BsaXQoZUwpO3JldHVybiBuJiYicHgiIT09bj9udWxsOnBhcnNlRmxvYXQoZSl9cmV0dXJuIHR8fG51bGx9ZnVuY3Rpb24gYUwodCl7cmV0dXJue3RvcDpNYXRoLmZsb29yKHQudG9wKSxyaWdodDpNYXRoLmZsb29yKHQucmlnaHQpLGJvdHRvbTpNYXRoLmZsb29yKHQuYm90dG9tKSxsZWZ0Ok1hdGguZmxvb3IodC5sZWZ0KSx3aWR0aDpNYXRoLmZsb29yKHQud2lkdGgpLGhlaWdodDpNYXRoLmZsb29yKHQuaGVpZ2h0KX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIHJMe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIpe3RoaXMuX3ByZWZlcnJlZFBvc2l0aW9ucz1bXSx0aGlzLl9wb3NpdGlvblN0cmF0ZWd5PW5ldyBuTChuLG8saSxhLHIpLndpdGhGbGV4aWJsZURpbWVuc2lvbnMoITEpLndpdGhQdXNoKCExKS53aXRoVmlld3BvcnRNYXJnaW4oMCksdGhpcy53aXRoRmFsbGJhY2tQb3NpdGlvbih0LGUpLHRoaXMub25Qb3NpdGlvbkNoYW5nZT10aGlzLl9wb3NpdGlvblN0cmF0ZWd5LnBvc2l0aW9uQ2hhbmdlc31nZXQgcG9zaXRpb25zKCl7cmV0dXJuIHRoaXMuX3ByZWZlcnJlZFBvc2l0aW9uc31hdHRhY2godCl7dGhpcy5fb3ZlcmxheVJlZj10LHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kuYXR0YWNoKHQpLHRoaXMuX2RpcmVjdGlvbiYmKHQuc2V0RGlyZWN0aW9uKHRoaXMuX2RpcmVjdGlvbiksdGhpcy5fZGlyZWN0aW9uPW51bGwpfWRpc3Bvc2UoKXt0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LmRpc3Bvc2UoKX1kZXRhY2goKXt0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LmRldGFjaCgpfWFwcGx5KCl7dGhpcy5fcG9zaXRpb25TdHJhdGVneS5hcHBseSgpfXJlY2FsY3VsYXRlTGFzdFBvc2l0aW9uKCl7dGhpcy5fcG9zaXRpb25TdHJhdGVneS5yZWFwcGx5TGFzdFBvc2l0aW9uKCl9d2l0aFNjcm9sbGFibGVDb250YWluZXJzKHQpe3RoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kud2l0aFNjcm9sbGFibGVDb250YWluZXJzKHQpfXdpdGhGYWxsYmFja1Bvc2l0aW9uKHQsZSxuLG8pe2NvbnN0IGk9bmV3IGpGKHQsZSxuLG8pO3JldHVybiB0aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnMucHVzaChpKSx0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LndpdGhQb3NpdGlvbnModGhpcy5fcHJlZmVycmVkUG9zaXRpb25zKSx0aGlzfXdpdGhEaXJlY3Rpb24odCl7cmV0dXJuIHRoaXMuX292ZXJsYXlSZWY/dGhpcy5fb3ZlcmxheVJlZi5zZXREaXJlY3Rpb24odCk6dGhpcy5fZGlyZWN0aW9uPXQsdGhpc313aXRoT2Zmc2V0WCh0KXtyZXR1cm4gdGhpcy5fcG9zaXRpb25TdHJhdGVneS53aXRoRGVmYXVsdE9mZnNldFgodCksdGhpc313aXRoT2Zmc2V0WSh0KXtyZXR1cm4gdGhpcy5fcG9zaXRpb25TdHJhdGVneS53aXRoRGVmYXVsdE9mZnNldFkodCksdGhpc313aXRoTG9ja2VkUG9zaXRpb24odCl7cmV0dXJuIHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kud2l0aExvY2tlZFBvc2l0aW9uKHQpLHRoaXN9d2l0aFBvc2l0aW9ucyh0KXtyZXR1cm4gdGhpcy5fcHJlZmVycmVkUG9zaXRpb25zPXQuc2xpY2UoKSx0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LndpdGhQb3NpdGlvbnModGhpcy5fcHJlZmVycmVkUG9zaXRpb25zKSx0aGlzfXNldE9yaWdpbih0KXtyZXR1cm4gdGhpcy5fcG9zaXRpb25TdHJhdGVneS5zZXRPcmlnaW4odCksdGhpc319Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NvbnN0IHNMPSJjZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlciI7Y2xhc3MgbEx7Y29uc3RydWN0b3IoKXt0aGlzLl9jc3NQb3NpdGlvbj0ic3RhdGljIix0aGlzLl90b3BPZmZzZXQ9IiIsdGhpcy5fYm90dG9tT2Zmc2V0PSIiLHRoaXMuX2xlZnRPZmZzZXQ9IiIsdGhpcy5fcmlnaHRPZmZzZXQ9IiIsdGhpcy5fYWxpZ25JdGVtcz0iIix0aGlzLl9qdXN0aWZ5Q29udGVudD0iIix0aGlzLl93aWR0aD0iIix0aGlzLl9oZWlnaHQ9IiJ9YXR0YWNoKHQpe2NvbnN0IGU9dC5nZXRDb25maWcoKTt0aGlzLl9vdmVybGF5UmVmPXQsdGhpcy5fd2lkdGgmJiFlLndpZHRoJiZ0LnVwZGF0ZVNpemUoe3dpZHRoOnRoaXMuX3dpZHRofSksdGhpcy5faGVpZ2h0JiYhZS5oZWlnaHQmJnQudXBkYXRlU2l6ZSh7aGVpZ2h0OnRoaXMuX2hlaWdodH0pLHQuaG9zdEVsZW1lbnQuY2xhc3NMaXN0LmFkZChzTCksdGhpcy5faXNEaXNwb3NlZD0hMX10b3AodD0iIil7cmV0dXJuIHRoaXMuX2JvdHRvbU9mZnNldD0iIix0aGlzLl90b3BPZmZzZXQ9dCx0aGlzLl9hbGlnbkl0ZW1zPSJmbGV4LXN0YXJ0Iix0aGlzfWxlZnQodD0iIil7cmV0dXJuIHRoaXMuX3JpZ2h0T2Zmc2V0PSIiLHRoaXMuX2xlZnRPZmZzZXQ9dCx0aGlzLl9qdXN0aWZ5Q29udGVudD0iZmxleC1zdGFydCIsdGhpc31ib3R0b20odD0iIil7cmV0dXJuIHRoaXMuX3RvcE9mZnNldD0iIix0aGlzLl9ib3R0b21PZmZzZXQ9dCx0aGlzLl9hbGlnbkl0ZW1zPSJmbGV4LWVuZCIsdGhpc31yaWdodCh0PSIiKXtyZXR1cm4gdGhpcy5fbGVmdE9mZnNldD0iIix0aGlzLl9yaWdodE9mZnNldD10LHRoaXMuX2p1c3RpZnlDb250ZW50PSJmbGV4LWVuZCIsdGhpc313aWR0aCh0PSIiKXtyZXR1cm4gdGhpcy5fb3ZlcmxheVJlZj90aGlzLl9vdmVybGF5UmVmLnVwZGF0ZVNpemUoe3dpZHRoOnR9KTp0aGlzLl93aWR0aD10LHRoaXN9aGVpZ2h0KHQ9IiIpe3JldHVybiB0aGlzLl9vdmVybGF5UmVmP3RoaXMuX292ZXJsYXlSZWYudXBkYXRlU2l6ZSh7aGVpZ2h0OnR9KTp0aGlzLl9oZWlnaHQ9dCx0aGlzfWNlbnRlckhvcml6b250YWxseSh0PSIiKXtyZXR1cm4gdGhpcy5sZWZ0KHQpLHRoaXMuX2p1c3RpZnlDb250ZW50PSJjZW50ZXIiLHRoaXN9Y2VudGVyVmVydGljYWxseSh0PSIiKXtyZXR1cm4gdGhpcy50b3AodCksdGhpcy5fYWxpZ25JdGVtcz0iY2VudGVyIix0aGlzfWFwcGx5KCl7aWYoIXRoaXMuX292ZXJsYXlSZWZ8fCF0aGlzLl9vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkpcmV0dXJuO2NvbnN0IHQ9dGhpcy5fb3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5zdHlsZSxlPXRoaXMuX292ZXJsYXlSZWYuaG9zdEVsZW1lbnQuc3R5bGUsbj10aGlzLl9vdmVybGF5UmVmLmdldENvbmZpZygpLHt3aWR0aDpvLGhlaWdodDppLG1heFdpZHRoOmEsbWF4SGVpZ2h0OnJ9PW4scz0hKCIxMDAlIiE9PW8mJiIxMDB2dyIhPT1vfHxhJiYiMTAwJSIhPT1hJiYiMTAwdnciIT09YSksbD0hKCIxMDAlIiE9PWkmJiIxMDB2aCIhPT1pfHxyJiYiMTAwJSIhPT1yJiYiMTAwdmgiIT09cik7dC5wb3NpdGlvbj10aGlzLl9jc3NQb3NpdGlvbix0Lm1hcmdpbkxlZnQ9cz8iMCI6dGhpcy5fbGVmdE9mZnNldCx0Lm1hcmdpblRvcD1sPyIwIjp0aGlzLl90b3BPZmZzZXQsdC5tYXJnaW5Cb3R0b209dGhpcy5fYm90dG9tT2Zmc2V0LHQubWFyZ2luUmlnaHQ9dGhpcy5fcmlnaHRPZmZzZXQscz9lLmp1c3RpZnlDb250ZW50PSJmbGV4LXN0YXJ0IjoiY2VudGVyIj09PXRoaXMuX2p1c3RpZnlDb250ZW50P2UuanVzdGlmeUNvbnRlbnQ9ImNlbnRlciI6InJ0bCI9PT10aGlzLl9vdmVybGF5UmVmLmdldENvbmZpZygpLmRpcmVjdGlvbj8iZmxleC1zdGFydCI9PT10aGlzLl9qdXN0aWZ5Q29udGVudD9lLmp1c3RpZnlDb250ZW50PSJmbGV4LWVuZCI6ImZsZXgtZW5kIj09PXRoaXMuX2p1c3RpZnlDb250ZW50JiYoZS5qdXN0aWZ5Q29udGVudD0iZmxleC1zdGFydCIpOmUuanVzdGlmeUNvbnRlbnQ9dGhpcy5fanVzdGlmeUNvbnRlbnQsZS5hbGlnbkl0ZW1zPWw/ImZsZXgtc3RhcnQiOnRoaXMuX2FsaWduSXRlbXN9ZGlzcG9zZSgpe2lmKHRoaXMuX2lzRGlzcG9zZWR8fCF0aGlzLl9vdmVybGF5UmVmKXJldHVybjtjb25zdCB0PXRoaXMuX292ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuc3R5bGUsZT10aGlzLl9vdmVybGF5UmVmLmhvc3RFbGVtZW50LG49ZS5zdHlsZTtlLmNsYXNzTGlzdC5yZW1vdmUoc0wpLG4uanVzdGlmeUNvbnRlbnQ9bi5hbGlnbkl0ZW1zPXQubWFyZ2luVG9wPXQubWFyZ2luQm90dG9tPXQubWFyZ2luTGVmdD10Lm1hcmdpblJpZ2h0PXQucG9zaXRpb249IiIsdGhpcy5fb3ZlcmxheVJlZj1udWxsLHRoaXMuX2lzRGlzcG9zZWQ9ITB9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBjTHtjb25zdHJ1Y3Rvcih0LGUsbixvKXt0aGlzLl92aWV3cG9ydFJ1bGVyPXQsdGhpcy5fZG9jdW1lbnQ9ZSx0aGlzLl9wbGF0Zm9ybT1uLHRoaXMuX292ZXJsYXlDb250YWluZXI9b31nbG9iYWwoKXtyZXR1cm4gbmV3IGxMfWNvbm5lY3RlZFRvKHQsZSxuKXtyZXR1cm4gbmV3IHJMKGUsbix0LHRoaXMuX3ZpZXdwb3J0UnVsZXIsdGhpcy5fZG9jdW1lbnQsdGhpcy5fcGxhdGZvcm0sdGhpcy5fb3ZlcmxheUNvbnRhaW5lcil9ZmxleGlibGVDb25uZWN0ZWRUbyh0KXtyZXR1cm4gbmV3IG5MKHQsdGhpcy5fdmlld3BvcnRSdWxlcix0aGlzLl9kb2N1bWVudCx0aGlzLl9wbGF0Zm9ybSx0aGlzLl9vdmVybGF5Q29udGFpbmVyKX19Y0wuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGNMKSh2cih1RiksdnIoWl8pLHZyKHd6KSx2cihRRikpfSxjTC7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgY0wodnIodUYpLHZyKFpfKSx2cih3eiksdnIoUUYpKX0sdG9rZW46Y0wscHJvdmlkZWRJbjoicm9vdCJ9KSxjTC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnVGfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOnd6fSx7dHlwZTpRRn1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoY0wsW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOiJyb290In1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnVGfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOnd6fSx7dHlwZTpRRn1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpsZXQgZEw9MDtjbGFzcyBwTHtjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyLHMsbCxjLGQpe3RoaXMuc2Nyb2xsU3RyYXRlZ2llcz10LHRoaXMuX292ZXJsYXlDb250YWluZXI9ZSx0aGlzLl9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI9bix0aGlzLl9wb3NpdGlvbkJ1aWxkZXI9byx0aGlzLl9rZXlib2FyZERpc3BhdGNoZXI9aSx0aGlzLl9pbmplY3Rvcj1hLHRoaXMuX25nWm9uZT1yLHRoaXMuX2RvY3VtZW50PXMsdGhpcy5fZGlyZWN0aW9uYWxpdHk9bCx0aGlzLl9sb2NhdGlvbj1jLHRoaXMuX291dHNpZGVDbGlja0Rpc3BhdGNoZXI9ZH1jcmVhdGUodCl7Y29uc3QgZT10aGlzLl9jcmVhdGVIb3N0RWxlbWVudCgpLG49dGhpcy5fY3JlYXRlUGFuZUVsZW1lbnQoZSksbz10aGlzLl9jcmVhdGVQb3J0YWxPdXRsZXQobiksaT1uZXcgVkYodCk7cmV0dXJuIGkuZGlyZWN0aW9uPWkuZGlyZWN0aW9ufHx0aGlzLl9kaXJlY3Rpb25hbGl0eS52YWx1ZSxuZXcgJEYobyxlLG4saSx0aGlzLl9uZ1pvbmUsdGhpcy5fa2V5Ym9hcmREaXNwYXRjaGVyLHRoaXMuX2RvY3VtZW50LHRoaXMuX2xvY2F0aW9uLHRoaXMuX291dHNpZGVDbGlja0Rpc3BhdGNoZXIpfXBvc2l0aW9uKCl7cmV0dXJuIHRoaXMuX3Bvc2l0aW9uQnVpbGRlcn1fY3JlYXRlUGFuZUVsZW1lbnQodCl7Y29uc3QgZT10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gZS5pZD0iY2RrLW92ZXJsYXktIitkTCsrLGUuY2xhc3NMaXN0LmFkZCgiY2RrLW92ZXJsYXktcGFuZSIpLHQuYXBwZW5kQ2hpbGQoZSksZX1fY3JlYXRlSG9zdEVsZW1lbnQoKXtjb25zdCB0PXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiB0aGlzLl9vdmVybGF5Q29udGFpbmVyLmdldENvbnRhaW5lckVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0KSx0fV9jcmVhdGVQb3J0YWxPdXRsZXQodCl7cmV0dXJuIHRoaXMuX2FwcFJlZnx8KHRoaXMuX2FwcFJlZj10aGlzLl9pbmplY3Rvci5nZXQoT18pKSxuZXcgd0YodCx0aGlzLl9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsdGhpcy5fYXBwUmVmLHRoaXMuX2luamVjdG9yLHRoaXMuX2RvY3VtZW50KX19cEwuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHBMKSh2cihCRiksdnIoUUYpLHZyKHVnKSx2cihjTCksdnIoWkYpLHZyKHJwKSx2cihhXyksdnIoWl8pLHZyKEhJKSx2cihsQyksdnIoWEYpKX0scEwuybVwcm92PU1uKHt0b2tlbjpwTCxmYWN0b3J5OnBMLsm1ZmFjfSkscEwuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpCRn0se3R5cGU6UUZ9LHt0eXBlOnVnfSx7dHlwZTpjTH0se3R5cGU6WkZ9LHt0eXBlOnJwfSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTpISX0se3R5cGU6bEN9LHt0eXBlOlhGfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChwTCxbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6QkZ9LHt0eXBlOlFGfSx7dHlwZTp1Z30se3R5cGU6Y0x9LHt0eXBlOlpGfSx7dHlwZTpycH0se3R5cGU6YV99LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6SEl9LHt0eXBlOmxDfSx7dHlwZTpYRn1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBtTD1be29yaWdpblg6InN0YXJ0IixvcmlnaW5ZOiJib3R0b20iLG92ZXJsYXlYOiJzdGFydCIsb3ZlcmxheVk6InRvcCJ9LHtvcmlnaW5YOiJzdGFydCIsb3JpZ2luWToidG9wIixvdmVybGF5WDoic3RhcnQiLG92ZXJsYXlZOiJib3R0b20ifSx7b3JpZ2luWDoiZW5kIixvcmlnaW5ZOiJ0b3AiLG92ZXJsYXlYOiJlbmQiLG92ZXJsYXlZOiJib3R0b20ifSx7b3JpZ2luWDoiZW5kIixvcmlnaW5ZOiJib3R0b20iLG92ZXJsYXlYOiJlbmQiLG92ZXJsYXlZOiJ0b3AifV0sdUw9bmV3IEdhKCJjZGstY29ubmVjdGVkLW92ZXJsYXktc2Nyb2xsLXN0cmF0ZWd5Iik7Y2xhc3MgZkx7Y29uc3RydWN0b3IodCl7dGhpcy5lbGVtZW50UmVmPXR9fWZMLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxmTCkoU20oaGcpKX0sZkwuybVkaXI9bG8oe3R5cGU6Zkwsc2VsZWN0b3JzOltbIiIsImNkay1vdmVybGF5LW9yaWdpbiIsIiJdLFsiIiwib3ZlcmxheS1vcmlnaW4iLCIiXSxbIiIsImNka092ZXJsYXlPcmlnaW4iLCIiXV0sZXhwb3J0QXM6WyJjZGtPdmVybGF5T3JpZ2luIl19KSxmTC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChmTCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbY2RrLW92ZXJsYXktb3JpZ2luXSwgW292ZXJsYXktb3JpZ2luXSwgW2Nka092ZXJsYXlPcmlnaW5dIixleHBvcnRBczoiY2RrT3ZlcmxheU9yaWdpbiJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ31dfSksbnVsbCk7Y2xhc3MgZ0x7Y29uc3RydWN0b3IodCxlLG4sbyxpKXt0aGlzLl9vdmVybGF5PXQsdGhpcy5fZGlyPWksdGhpcy5faGFzQmFja2Ryb3A9ITEsdGhpcy5fbG9ja1Bvc2l0aW9uPSExLHRoaXMuX2dyb3dBZnRlck9wZW49ITEsdGhpcy5fZmxleGlibGVEaW1lbnNpb25zPSExLHRoaXMuX3B1c2g9ITEsdGhpcy5fYmFja2Ryb3BTdWJzY3JpcHRpb249bS5FTVBUWSx0aGlzLl9hdHRhY2hTdWJzY3JpcHRpb249bS5FTVBUWSx0aGlzLl9kZXRhY2hTdWJzY3JpcHRpb249bS5FTVBUWSx0aGlzLl9wb3NpdGlvblN1YnNjcmlwdGlvbj1tLkVNUFRZLHRoaXMudmlld3BvcnRNYXJnaW49MCx0aGlzLm9wZW49ITEsdGhpcy5kaXNhYmxlQ2xvc2U9ITEsdGhpcy5iYWNrZHJvcENsaWNrPW5ldyBMaCx0aGlzLnBvc2l0aW9uQ2hhbmdlPW5ldyBMaCx0aGlzLmF0dGFjaD1uZXcgTGgsdGhpcy5kZXRhY2g9bmV3IExoLHRoaXMub3ZlcmxheUtleWRvd249bmV3IExoLHRoaXMub3ZlcmxheU91dHNpZGVDbGljaz1uZXcgTGgsdGhpcy5fdGVtcGxhdGVQb3J0YWw9bmV3IHhGKGUsbiksdGhpcy5fc2Nyb2xsU3RyYXRlZ3lGYWN0b3J5PW8sdGhpcy5zY3JvbGxTdHJhdGVneT10aGlzLl9zY3JvbGxTdHJhdGVneUZhY3RvcnkoKX1nZXQgb2Zmc2V0WCgpe3JldHVybiB0aGlzLl9vZmZzZXRYfXNldCBvZmZzZXRYKHQpe3RoaXMuX29mZnNldFg9dCx0aGlzLl9wb3NpdGlvbiYmdGhpcy5fdXBkYXRlUG9zaXRpb25TdHJhdGVneSh0aGlzLl9wb3NpdGlvbil9Z2V0IG9mZnNldFkoKXtyZXR1cm4gdGhpcy5fb2Zmc2V0WX1zZXQgb2Zmc2V0WSh0KXt0aGlzLl9vZmZzZXRZPXQsdGhpcy5fcG9zaXRpb24mJnRoaXMuX3VwZGF0ZVBvc2l0aW9uU3RyYXRlZ3kodGhpcy5fcG9zaXRpb24pfWdldCBoYXNCYWNrZHJvcCgpe3JldHVybiB0aGlzLl9oYXNCYWNrZHJvcH1zZXQgaGFzQmFja2Ryb3AodCl7dGhpcy5faGFzQmFja2Ryb3A9eXoodCl9Z2V0IGxvY2tQb3NpdGlvbigpe3JldHVybiB0aGlzLl9sb2NrUG9zaXRpb259c2V0IGxvY2tQb3NpdGlvbih0KXt0aGlzLl9sb2NrUG9zaXRpb249eXoodCl9Z2V0IGZsZXhpYmxlRGltZW5zaW9ucygpe3JldHVybiB0aGlzLl9mbGV4aWJsZURpbWVuc2lvbnN9c2V0IGZsZXhpYmxlRGltZW5zaW9ucyh0KXt0aGlzLl9mbGV4aWJsZURpbWVuc2lvbnM9eXoodCl9Z2V0IGdyb3dBZnRlck9wZW4oKXtyZXR1cm4gdGhpcy5fZ3Jvd0FmdGVyT3Blbn1zZXQgZ3Jvd0FmdGVyT3Blbih0KXt0aGlzLl9ncm93QWZ0ZXJPcGVuPXl6KHQpfWdldCBwdXNoKCl7cmV0dXJuIHRoaXMuX3B1c2h9c2V0IHB1c2godCl7dGhpcy5fcHVzaD15eih0KX1nZXQgb3ZlcmxheVJlZigpe3JldHVybiB0aGlzLl9vdmVybGF5UmVmfWdldCBkaXIoKXtyZXR1cm4gdGhpcy5fZGlyP3RoaXMuX2Rpci52YWx1ZToibHRyIn1uZ09uRGVzdHJveSgpe3RoaXMuX2F0dGFjaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX2RldGFjaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX2JhY2tkcm9wU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5fcG9zaXRpb25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl9vdmVybGF5UmVmJiZ0aGlzLl9vdmVybGF5UmVmLmRpc3Bvc2UoKX1uZ09uQ2hhbmdlcyh0KXt0aGlzLl9wb3NpdGlvbiYmKHRoaXMuX3VwZGF0ZVBvc2l0aW9uU3RyYXRlZ3kodGhpcy5fcG9zaXRpb24pLHRoaXMuX292ZXJsYXlSZWYudXBkYXRlU2l6ZSh7d2lkdGg6dGhpcy53aWR0aCxtaW5XaWR0aDp0aGlzLm1pbldpZHRoLGhlaWdodDp0aGlzLmhlaWdodCxtaW5IZWlnaHQ6dGhpcy5taW5IZWlnaHR9KSx0Lm9yaWdpbiYmdGhpcy5vcGVuJiZ0aGlzLl9wb3NpdGlvbi5hcHBseSgpKSx0Lm9wZW4mJih0aGlzLm9wZW4/dGhpcy5fYXR0YWNoT3ZlcmxheSgpOnRoaXMuX2RldGFjaE92ZXJsYXkoKSl9X2NyZWF0ZU92ZXJsYXkoKXt0aGlzLnBvc2l0aW9ucyYmdGhpcy5wb3NpdGlvbnMubGVuZ3RofHwodGhpcy5wb3NpdGlvbnM9bUwpO2NvbnN0IHQ9dGhpcy5fb3ZlcmxheVJlZj10aGlzLl9vdmVybGF5LmNyZWF0ZSh0aGlzLl9idWlsZENvbmZpZygpKTt0aGlzLl9hdHRhY2hTdWJzY3JpcHRpb249dC5hdHRhY2htZW50cygpLnN1YnNjcmliZSgoKCk9PnRoaXMuYXR0YWNoLmVtaXQoKSkpLHRoaXMuX2RldGFjaFN1YnNjcmlwdGlvbj10LmRldGFjaG1lbnRzKCkuc3Vic2NyaWJlKCgoKT0+dGhpcy5kZXRhY2guZW1pdCgpKSksdC5rZXlkb3duRXZlbnRzKCkuc3Vic2NyaWJlKCh0PT57dGhpcy5vdmVybGF5S2V5ZG93bi5uZXh0KHQpLHQua2V5Q29kZSE9PXV6fHx0aGlzLmRpc2FibGVDbG9zZXx8YnoodCl8fCh0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fZGV0YWNoT3ZlcmxheSgpKX0pKSx0aGlzLl9vdmVybGF5UmVmLm91dHNpZGVQb2ludGVyRXZlbnRzKCkuc3Vic2NyaWJlKCh0PT57dGhpcy5vdmVybGF5T3V0c2lkZUNsaWNrLm5leHQodCl9KSl9X2J1aWxkQ29uZmlnKCl7Y29uc3QgdD10aGlzLl9wb3NpdGlvbj10aGlzLnBvc2l0aW9uU3RyYXRlZ3l8fHRoaXMuX2NyZWF0ZVBvc2l0aW9uU3RyYXRlZ3koKSxlPW5ldyBWRih7ZGlyZWN0aW9uOnRoaXMuX2Rpcixwb3NpdGlvblN0cmF0ZWd5OnQsc2Nyb2xsU3RyYXRlZ3k6dGhpcy5zY3JvbGxTdHJhdGVneSxoYXNCYWNrZHJvcDp0aGlzLmhhc0JhY2tkcm9wfSk7cmV0dXJuKHRoaXMud2lkdGh8fDA9PT10aGlzLndpZHRoKSYmKGUud2lkdGg9dGhpcy53aWR0aCksKHRoaXMuaGVpZ2h0fHwwPT09dGhpcy5oZWlnaHQpJiYoZS5oZWlnaHQ9dGhpcy5oZWlnaHQpLCh0aGlzLm1pbldpZHRofHwwPT09dGhpcy5taW5XaWR0aCkmJihlLm1pbldpZHRoPXRoaXMubWluV2lkdGgpLCh0aGlzLm1pbkhlaWdodHx8MD09PXRoaXMubWluSGVpZ2h0KSYmKGUubWluSGVpZ2h0PXRoaXMubWluSGVpZ2h0KSx0aGlzLmJhY2tkcm9wQ2xhc3MmJihlLmJhY2tkcm9wQ2xhc3M9dGhpcy5iYWNrZHJvcENsYXNzKSx0aGlzLnBhbmVsQ2xhc3MmJihlLnBhbmVsQ2xhc3M9dGhpcy5wYW5lbENsYXNzKSxlfV91cGRhdGVQb3NpdGlvblN0cmF0ZWd5KHQpe2NvbnN0IGU9dGhpcy5wb3NpdGlvbnMubWFwKCh0PT4oe29yaWdpblg6dC5vcmlnaW5YLG9yaWdpblk6dC5vcmlnaW5ZLG92ZXJsYXlYOnQub3ZlcmxheVgsb3ZlcmxheVk6dC5vdmVybGF5WSxvZmZzZXRYOnQub2Zmc2V0WHx8dGhpcy5vZmZzZXRYLG9mZnNldFk6dC5vZmZzZXRZfHx0aGlzLm9mZnNldFkscGFuZWxDbGFzczp0LnBhbmVsQ2xhc3N8fHZvaWQgMH0pKSk7cmV0dXJuIHQuc2V0T3JpZ2luKHRoaXMub3JpZ2luLmVsZW1lbnRSZWYpLndpdGhQb3NpdGlvbnMoZSkud2l0aEZsZXhpYmxlRGltZW5zaW9ucyh0aGlzLmZsZXhpYmxlRGltZW5zaW9ucykud2l0aFB1c2godGhpcy5wdXNoKS53aXRoR3Jvd0FmdGVyT3Blbih0aGlzLmdyb3dBZnRlck9wZW4pLndpdGhWaWV3cG9ydE1hcmdpbih0aGlzLnZpZXdwb3J0TWFyZ2luKS53aXRoTG9ja2VkUG9zaXRpb24odGhpcy5sb2NrUG9zaXRpb24pLndpdGhUcmFuc2Zvcm1PcmlnaW5Pbih0aGlzLnRyYW5zZm9ybU9yaWdpblNlbGVjdG9yKX1fY3JlYXRlUG9zaXRpb25TdHJhdGVneSgpe2NvbnN0IHQ9dGhpcy5fb3ZlcmxheS5wb3NpdGlvbigpLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy5vcmlnaW4uZWxlbWVudFJlZik7cmV0dXJuIHRoaXMuX3VwZGF0ZVBvc2l0aW9uU3RyYXRlZ3kodCksdH1fYXR0YWNoT3ZlcmxheSgpe3RoaXMuX292ZXJsYXlSZWY/dGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKS5oYXNCYWNrZHJvcD10aGlzLmhhc0JhY2tkcm9wOnRoaXMuX2NyZWF0ZU92ZXJsYXkoKSx0aGlzLl9vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCl8fHRoaXMuX292ZXJsYXlSZWYuYXR0YWNoKHRoaXMuX3RlbXBsYXRlUG9ydGFsKSx0aGlzLmhhc0JhY2tkcm9wP3RoaXMuX2JhY2tkcm9wU3Vic2NyaXB0aW9uPXRoaXMuX292ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgodD0+e3RoaXMuYmFja2Ryb3BDbGljay5lbWl0KHQpfSkpOnRoaXMuX2JhY2tkcm9wU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5fcG9zaXRpb25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLnBvc2l0aW9uQ2hhbmdlLm9ic2VydmVycy5sZW5ndGg+MCYmKHRoaXMuX3Bvc2l0aW9uU3Vic2NyaXB0aW9uPXRoaXMuX3Bvc2l0aW9uLnBvc2l0aW9uQ2hhbmdlcy5waXBlKEhlKCgoKT0+dGhpcy5wb3NpdGlvbkNoYW5nZS5vYnNlcnZlcnMubGVuZ3RoPjApKSkuc3Vic2NyaWJlKCh0PT57dGhpcy5wb3NpdGlvbkNoYW5nZS5lbWl0KHQpLDA9PT10aGlzLnBvc2l0aW9uQ2hhbmdlLm9ic2VydmVycy5sZW5ndGgmJnRoaXMuX3Bvc2l0aW9uU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCl9KSkpfV9kZXRhY2hPdmVybGF5KCl7dGhpcy5fb3ZlcmxheVJlZiYmdGhpcy5fb3ZlcmxheVJlZi5kZXRhY2goKSx0aGlzLl9iYWNrZHJvcFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX3Bvc2l0aW9uU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCl9fWdMLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxnTCkoU20ocEwpLFNtKFhnKSxTbShlaCksU20odUwpLFNtKEhJLDgpKX0sZ0wuybVkaXI9bG8oe3R5cGU6Z0wsc2VsZWN0b3JzOltbIiIsImNkay1jb25uZWN0ZWQtb3ZlcmxheSIsIiJdLFsiIiwiY29ubmVjdGVkLW92ZXJsYXkiLCIiXSxbIiIsImNka0Nvbm5lY3RlZE92ZXJsYXkiLCIiXV0saW5wdXRzOnt2aWV3cG9ydE1hcmdpbjpbImNka0Nvbm5lY3RlZE92ZXJsYXlWaWV3cG9ydE1hcmdpbiIsInZpZXdwb3J0TWFyZ2luIl0sb3BlbjpbImNka0Nvbm5lY3RlZE92ZXJsYXlPcGVuIiwib3BlbiJdLGRpc2FibGVDbG9zZTpbImNka0Nvbm5lY3RlZE92ZXJsYXlEaXNhYmxlQ2xvc2UiLCJkaXNhYmxlQ2xvc2UiXSxzY3JvbGxTdHJhdGVneTpbImNka0Nvbm5lY3RlZE92ZXJsYXlTY3JvbGxTdHJhdGVneSIsInNjcm9sbFN0cmF0ZWd5Il0sb2Zmc2V0WDpbImNka0Nvbm5lY3RlZE92ZXJsYXlPZmZzZXRYIiwib2Zmc2V0WCJdLG9mZnNldFk6WyJjZGtDb25uZWN0ZWRPdmVybGF5T2Zmc2V0WSIsIm9mZnNldFkiXSxoYXNCYWNrZHJvcDpbImNka0Nvbm5lY3RlZE92ZXJsYXlIYXNCYWNrZHJvcCIsImhhc0JhY2tkcm9wIl0sbG9ja1Bvc2l0aW9uOlsiY2RrQ29ubmVjdGVkT3ZlcmxheUxvY2tQb3NpdGlvbiIsImxvY2tQb3NpdGlvbiJdLGZsZXhpYmxlRGltZW5zaW9uczpbImNka0Nvbm5lY3RlZE92ZXJsYXlGbGV4aWJsZURpbWVuc2lvbnMiLCJmbGV4aWJsZURpbWVuc2lvbnMiXSxncm93QWZ0ZXJPcGVuOlsiY2RrQ29ubmVjdGVkT3ZlcmxheUdyb3dBZnRlck9wZW4iLCJncm93QWZ0ZXJPcGVuIl0scHVzaDpbImNka0Nvbm5lY3RlZE92ZXJsYXlQdXNoIiwicHVzaCJdLHBvc2l0aW9uczpbImNka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnMiLCJwb3NpdGlvbnMiXSxvcmlnaW46WyJjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luIiwib3JpZ2luIl0scG9zaXRpb25TdHJhdGVneTpbImNka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvblN0cmF0ZWd5IiwicG9zaXRpb25TdHJhdGVneSJdLHdpZHRoOlsiY2RrQ29ubmVjdGVkT3ZlcmxheVdpZHRoIiwid2lkdGgiXSxoZWlnaHQ6WyJjZGtDb25uZWN0ZWRPdmVybGF5SGVpZ2h0IiwiaGVpZ2h0Il0sbWluV2lkdGg6WyJjZGtDb25uZWN0ZWRPdmVybGF5TWluV2lkdGgiLCJtaW5XaWR0aCJdLG1pbkhlaWdodDpbImNka0Nvbm5lY3RlZE92ZXJsYXlNaW5IZWlnaHQiLCJtaW5IZWlnaHQiXSxiYWNrZHJvcENsYXNzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheUJhY2tkcm9wQ2xhc3MiLCJiYWNrZHJvcENsYXNzIl0scGFuZWxDbGFzczpbImNka0Nvbm5lY3RlZE92ZXJsYXlQYW5lbENsYXNzIiwicGFuZWxDbGFzcyJdLHRyYW5zZm9ybU9yaWdpblNlbGVjdG9yOlsiY2RrQ29ubmVjdGVkT3ZlcmxheVRyYW5zZm9ybU9yaWdpbk9uIiwidHJhbnNmb3JtT3JpZ2luU2VsZWN0b3IiXX0sb3V0cHV0czp7YmFja2Ryb3BDbGljazoiYmFja2Ryb3BDbGljayIscG9zaXRpb25DaGFuZ2U6InBvc2l0aW9uQ2hhbmdlIixhdHRhY2g6ImF0dGFjaCIsZGV0YWNoOiJkZXRhY2giLG92ZXJsYXlLZXlkb3duOiJvdmVybGF5S2V5ZG93biIsb3ZlcmxheU91dHNpZGVDbGljazoib3ZlcmxheU91dHNpZGVDbGljayJ9LGV4cG9ydEFzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheSJdLGZlYXR1cmVzOltCb119KSxnTC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnBMfSx7dHlwZTpYZ30se3R5cGU6ZWh9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOlt1TF19XX0se3R5cGU6SEksZGVjb3JhdG9yczpbe3R5cGU6U3J9XX1dLGdMLnByb3BEZWNvcmF0b3JzPXtvcmlnaW46W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luIl19XSxwb3NpdGlvbnM6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25zIl19XSxwb3NpdGlvblN0cmF0ZWd5Olt7dHlwZTp4eSxhcmdzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uU3RyYXRlZ3kiXX1dLG9mZnNldFg6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5T2Zmc2V0WCJdfV0sb2Zmc2V0WTpbe3R5cGU6eHksYXJnczpbImNka0Nvbm5lY3RlZE92ZXJsYXlPZmZzZXRZIl19XSx3aWR0aDpbe3R5cGU6eHksYXJnczpbImNka0Nvbm5lY3RlZE92ZXJsYXlXaWR0aCJdfV0saGVpZ2h0Olt7dHlwZTp4eSxhcmdzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheUhlaWdodCJdfV0sbWluV2lkdGg6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5TWluV2lkdGgiXX1dLG1pbkhlaWdodDpbe3R5cGU6eHksYXJnczpbImNka0Nvbm5lY3RlZE92ZXJsYXlNaW5IZWlnaHQiXX1dLGJhY2tkcm9wQ2xhc3M6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcyJdfV0scGFuZWxDbGFzczpbe3R5cGU6eHksYXJnczpbImNka0Nvbm5lY3RlZE92ZXJsYXlQYW5lbENsYXNzIl19XSx2aWV3cG9ydE1hcmdpbjpbe3R5cGU6eHksYXJnczpbImNka0Nvbm5lY3RlZE92ZXJsYXlWaWV3cG9ydE1hcmdpbiJdfV0sc2Nyb2xsU3RyYXRlZ3k6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5U2Nyb2xsU3RyYXRlZ3kiXX1dLG9wZW46W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5T3BlbiJdfV0sZGlzYWJsZUNsb3NlOlt7dHlwZTp4eSxhcmdzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheURpc2FibGVDbG9zZSJdfV0sdHJhbnNmb3JtT3JpZ2luU2VsZWN0b3I6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5VHJhbnNmb3JtT3JpZ2luT24iXX1dLGhhc0JhY2tkcm9wOlt7dHlwZTp4eSxhcmdzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wIl19XSxsb2NrUG9zaXRpb246W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5TG9ja1Bvc2l0aW9uIl19XSxmbGV4aWJsZURpbWVuc2lvbnM6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5RmxleGlibGVEaW1lbnNpb25zIl19XSxncm93QWZ0ZXJPcGVuOlt7dHlwZTp4eSxhcmdzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheUdyb3dBZnRlck9wZW4iXX1dLHB1c2g6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5UHVzaCJdfV0sYmFja2Ryb3BDbGljazpbe3R5cGU6T3l9XSxwb3NpdGlvbkNoYW5nZTpbe3R5cGU6T3l9XSxhdHRhY2g6W3t0eXBlOk95fV0sZGV0YWNoOlt7dHlwZTpPeX1dLG92ZXJsYXlLZXlkb3duOlt7dHlwZTpPeX1dLG92ZXJsYXlPdXRzaWRlQ2xpY2s6W3t0eXBlOk95fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZ0wsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Nkay1jb25uZWN0ZWQtb3ZlcmxheV0sIFtjb25uZWN0ZWQtb3ZlcmxheV0sIFtjZGtDb25uZWN0ZWRPdmVybGF5XSIsZXhwb3J0QXM6ImNka0Nvbm5lY3RlZE92ZXJsYXkifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6cEx9LHt0eXBlOlhnfSx7dHlwZTplaH0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3VMXX1dfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfV19KSx7dmlld3BvcnRNYXJnaW46W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5Vmlld3BvcnRNYXJnaW4iXX1dLG9wZW46W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5T3BlbiJdfV0sZGlzYWJsZUNsb3NlOlt7dHlwZTp4eSxhcmdzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheURpc2FibGVDbG9zZSJdfV0sYmFja2Ryb3BDbGljazpbe3R5cGU6T3l9XSxwb3NpdGlvbkNoYW5nZTpbe3R5cGU6T3l9XSxhdHRhY2g6W3t0eXBlOk95fV0sZGV0YWNoOlt7dHlwZTpPeX1dLG92ZXJsYXlLZXlkb3duOlt7dHlwZTpPeX1dLG92ZXJsYXlPdXRzaWRlQ2xpY2s6W3t0eXBlOk95fV0sc2Nyb2xsU3RyYXRlZ3k6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5U2Nyb2xsU3RyYXRlZ3kiXX1dLG9mZnNldFg6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5T2Zmc2V0WCJdfV0sb2Zmc2V0WTpbe3R5cGU6eHksYXJnczpbImNka0Nvbm5lY3RlZE92ZXJsYXlPZmZzZXRZIl19XSxoYXNCYWNrZHJvcDpbe3R5cGU6eHksYXJnczpbImNka0Nvbm5lY3RlZE92ZXJsYXlIYXNCYWNrZHJvcCJdfV0sbG9ja1Bvc2l0aW9uOlt7dHlwZTp4eSxhcmdzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheUxvY2tQb3NpdGlvbiJdfV0sZmxleGlibGVEaW1lbnNpb25zOlt7dHlwZTp4eSxhcmdzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheUZsZXhpYmxlRGltZW5zaW9ucyJdfV0sZ3Jvd0FmdGVyT3Blbjpbe3R5cGU6eHksYXJnczpbImNka0Nvbm5lY3RlZE92ZXJsYXlHcm93QWZ0ZXJPcGVuIl19XSxwdXNoOlt7dHlwZTp4eSxhcmdzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheVB1c2giXX1dLHBvc2l0aW9uczpbe3R5cGU6eHksYXJnczpbImNka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnMiXX1dLG9yaWdpbjpbe3R5cGU6eHksYXJnczpbImNka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW4iXX1dLHBvc2l0aW9uU3RyYXRlZ3k6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25TdHJhdGVneSJdfV0sd2lkdGg6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5V2lkdGgiXX1dLGhlaWdodDpbe3R5cGU6eHksYXJnczpbImNka0Nvbm5lY3RlZE92ZXJsYXlIZWlnaHQiXX1dLG1pbldpZHRoOlt7dHlwZTp4eSxhcmdzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheU1pbldpZHRoIl19XSxtaW5IZWlnaHQ6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5TWluSGVpZ2h0Il19XSxiYWNrZHJvcENsYXNzOlt7dHlwZTp4eSxhcmdzOlsiY2RrQ29ubmVjdGVkT3ZlcmxheUJhY2tkcm9wQ2xhc3MiXX1dLHBhbmVsQ2xhc3M6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5UGFuZWxDbGFzcyJdfV0sdHJhbnNmb3JtT3JpZ2luU2VsZWN0b3I6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb25uZWN0ZWRPdmVybGF5VHJhbnNmb3JtT3JpZ2luT24iXX1dfSk7Y29uc3QgaEw9e3Byb3ZpZGU6dUwsZGVwczpbcExdLHVzZUZhY3Rvcnk6ZnVuY3Rpb24gYkwodCl7cmV0dXJuKCk9PnQuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKCl9fTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgeUx7fXlMLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx5TCl9LHlMLsm1bW9kPWFvKHt0eXBlOnlMfSkseUwuybVpbmo9dm4oe3Byb3ZpZGVyczpbcEwsaExdLGltcG9ydHM6W1tMSSxSRixfRl0sX0ZdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh5TCxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W0xJLFJGLF9GXSxleHBvcnRzOltnTCxmTCxfRl0sZGVjbGFyYXRpb25zOltnTCxmTF0scHJvdmlkZXJzOltwTCxoTF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyh5TCx7ZGVjbGFyYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuW2dMLGZMXX0saW1wb3J0czpmdW5jdGlvbigpe3JldHVybltMSSxSRixfRl19LGV4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bZ0wsZkwsX0ZdfX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIF9MIGV4dGVuZHMgUUZ7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpfW5nT25EZXN0cm95KCl7c3VwZXIubmdPbkRlc3Ryb3koKSx0aGlzLl9mdWxsU2NyZWVuRXZlbnROYW1lJiZ0aGlzLl9mdWxsU2NyZWVuTGlzdGVuZXImJnRoaXMuX2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5fZnVsbFNjcmVlbkV2ZW50TmFtZSx0aGlzLl9mdWxsU2NyZWVuTGlzdGVuZXIpfV9jcmVhdGVDb250YWluZXIoKXtzdXBlci5fY3JlYXRlQ29udGFpbmVyKCksdGhpcy5fYWRqdXN0UGFyZW50Rm9yRnVsbHNjcmVlbkNoYW5nZSgpLHRoaXMuX2FkZEZ1bGxzY3JlZW5DaGFuZ2VMaXN0ZW5lcigoKCk9PnRoaXMuX2FkanVzdFBhcmVudEZvckZ1bGxzY3JlZW5DaGFuZ2UoKSkpfV9hZGp1c3RQYXJlbnRGb3JGdWxsc2NyZWVuQ2hhbmdlKCl7dGhpcy5fY29udGFpbmVyRWxlbWVudCYmKHRoaXMuZ2V0RnVsbHNjcmVlbkVsZW1lbnQoKXx8dGhpcy5fZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQodGhpcy5fY29udGFpbmVyRWxlbWVudCl9X2FkZEZ1bGxzY3JlZW5DaGFuZ2VMaXN0ZW5lcih0KXtjb25zdCBlPXRoaXMuX2dldEV2ZW50TmFtZSgpO2UmJih0aGlzLl9mdWxsU2NyZWVuTGlzdGVuZXImJnRoaXMuX2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0aGlzLl9mdWxsU2NyZWVuTGlzdGVuZXIpLHRoaXMuX2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZSx0KSx0aGlzLl9mdWxsU2NyZWVuTGlzdGVuZXI9dCl9X2dldEV2ZW50TmFtZSgpe2lmKCF0aGlzLl9mdWxsU2NyZWVuRXZlbnROYW1lKXtjb25zdCB0PXRoaXMuX2RvY3VtZW50O3QuZnVsbHNjcmVlbkVuYWJsZWQ/dGhpcy5fZnVsbFNjcmVlbkV2ZW50TmFtZT0iZnVsbHNjcmVlbmNoYW5nZSI6dC53ZWJraXRGdWxsc2NyZWVuRW5hYmxlZD90aGlzLl9mdWxsU2NyZWVuRXZlbnROYW1lPSJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlIjp0Lm1vekZ1bGxTY3JlZW5FbmFibGVkP3RoaXMuX2Z1bGxTY3JlZW5FdmVudE5hbWU9Im1vemZ1bGxzY3JlZW5jaGFuZ2UiOnQubXNGdWxsc2NyZWVuRW5hYmxlZCYmKHRoaXMuX2Z1bGxTY3JlZW5FdmVudE5hbWU9Ik1TRnVsbHNjcmVlbkNoYW5nZSIpfXJldHVybiB0aGlzLl9mdWxsU2NyZWVuRXZlbnROYW1lfWdldEZ1bGxzY3JlZW5FbGVtZW50KCl7Y29uc3QgdD10aGlzLl9kb2N1bWVudDtyZXR1cm4gdC5mdWxsc2NyZWVuRWxlbWVudHx8dC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudHx8dC5tb3pGdWxsU2NyZWVuRWxlbWVudHx8dC5tc0Z1bGxzY3JlZW5FbGVtZW50fHxudWxsfX1fTC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8X0wpKHZyKFpfKSx2cih3eikpfSxfTC7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgX0wodnIoWl8pLHZyKHd6KSl9LHRva2VuOl9MLHByb3ZpZGVkSW46InJvb3QifSksX0wuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOnd6fV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChfTCxbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTp3en1dfSksbnVsbCk7Y2xhc3MgQ0x7fUNMLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxDTCl9LENMLsm1bW9kPWFvKHt0eXBlOkNMfSksQ0wuybVpbmo9dm4oe30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQ0wsW3t0eXBlOkF5LGFyZ3M6W3t9XX1dLG51bGwsbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBNTD1uZXcgU2V0O2xldCB2TDtjbGFzcyB4THtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9wbGF0Zm9ybT10LHRoaXMuX21hdGNoTWVkaWE9dGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyJiZ3aW5kb3cubWF0Y2hNZWRpYT93aW5kb3cubWF0Y2hNZWRpYS5iaW5kKHdpbmRvdyk6T0x9bWF0Y2hNZWRpYSh0KXtyZXR1cm4gdGhpcy5fcGxhdGZvcm0uV0VCS0lUJiYoZnVuY3Rpb24gZSh0KXtpZighTUwuaGFzKHQpKXRyeXt2THx8KHZMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIiksdkwuc2V0QXR0cmlidXRlKCJ0eXBlIiwidGV4dC9jc3MiKSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHZMKSksdkwuc2hlZXQmJih2TC5zaGVldC5pbnNlcnRSdWxlKGBAbWVkaWEgJHt0fSB7LmZ4LXF1ZXJ5LXRlc3R7IH19YCwwKSxNTC5hZGQodCkpfWNhdGNoKHQpe2NvbnNvbGUuZXJyb3IodCl9fSkodCksdGhpcy5fbWF0Y2hNZWRpYSh0KX19ZnVuY3Rpb24gT0wodCl7cmV0dXJue21hdGNoZXM6ImFsbCI9PT10fHwiIj09PXQsbWVkaWE6dCxhZGRMaXN0ZW5lcjooKT0+e30scmVtb3ZlTGlzdGVuZXI6KCk9Pnt9fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICoveEwuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHhMKSh2cih3eikpfSx4TC7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgeEwodnIod3opKX0sdG9rZW46eEwscHJvdmlkZWRJbjoicm9vdCJ9KSx4TC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnd6fV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh4TCxbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6d3p9XX0pLG51bGwpO2NsYXNzIFBMe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fbWVkaWFNYXRjaGVyPXQsdGhpcy5fem9uZT1lLHRoaXMuX3F1ZXJpZXM9bmV3IE1hcCx0aGlzLl9kZXN0cm95U3ViamVjdD1uZXcgSX1uZ09uRGVzdHJveSgpe3RoaXMuX2Rlc3Ryb3lTdWJqZWN0Lm5leHQoKSx0aGlzLl9kZXN0cm95U3ViamVjdC5jb21wbGV0ZSgpfWlzTWF0Y2hlZCh0KXtyZXR1cm4gd0woTXoodCkpLnNvbWUoKHQ9PnRoaXMuX3JlZ2lzdGVyUXVlcnkodCkubXFsLm1hdGNoZXMpKX1vYnNlcnZlKHQpe2xldCBlPVd0KHdMKE16KHQpKS5tYXAoKHQ9PnRoaXMuX3JlZ2lzdGVyUXVlcnkodCkub2JzZXJ2YWJsZSkpKTtyZXR1cm4gZT1KdChlLnBpcGUoYmUoMSkpLGUucGlwZShUZSgxKSxnZSgwKSkpLGUucGlwZShJdCgodD0+e2NvbnN0IGU9e21hdGNoZXM6ITEsYnJlYWtwb2ludHM6e319O3JldHVybiB0LmZvckVhY2goKCh7bWF0Y2hlczp0LHF1ZXJ5Om59KT0+e2UubWF0Y2hlcz1lLm1hdGNoZXN8fHQsZS5icmVha3BvaW50c1tuXT10fSkpLGV9KSkpfV9yZWdpc3RlclF1ZXJ5KHQpe2lmKHRoaXMuX3F1ZXJpZXMuaGFzKHQpKXJldHVybiB0aGlzLl9xdWVyaWVzLmdldCh0KTtjb25zdCBlPXRoaXMuX21lZGlhTWF0Y2hlci5tYXRjaE1lZGlhKHQpLG49e29ic2VydmFibGU6bmV3IEQoKHQ9Pntjb25zdCBuPWU9PnRoaXMuX3pvbmUucnVuKCgoKT0+dC5uZXh0KGUpKSk7cmV0dXJuIGUuYWRkTGlzdGVuZXIobiksKCk9PntlLnJlbW92ZUxpc3RlbmVyKG4pfX0pKS5waXBlKE5lKGUpLEl0KCgoe21hdGNoZXM6ZX0pPT4oe3F1ZXJ5OnQsbWF0Y2hlczplfSkpKSxJZSh0aGlzLl9kZXN0cm95U3ViamVjdCkpLG1xbDplfTtyZXR1cm4gdGhpcy5fcXVlcmllcy5zZXQodCxuKSxufX1mdW5jdGlvbiB3TCh0KXtyZXR1cm4gdC5tYXAoKHQ9PnQuc3BsaXQoIiwiKSkpLnJlZHVjZSgoKHQsZSk9PnQuY29uY2F0KGUpKSkubWFwKCh0PT50LnRyaW0oKSkpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBrTCh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsImRpdiIsMSksUm0oMSwiYnV0dG9uIiwyKSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLFltKCkuYWN0aW9uKCl9KSksa3UoMiksQW0oKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgpO3JjKDIpLFN1KHQuZGF0YS5hY3Rpb24pfX1mdW5jdGlvbiBTTCh0LGUpe31QTC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8UEwpKHZyKHhMKSx2cihhXykpfSxQTC7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgUEwodnIoeEwpLHZyKGFfKSl9LHRva2VuOlBMLHByb3ZpZGVkSW46InJvb3QifSksUEwuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp4TH0se3R5cGU6YV99XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFBMLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp4TH0se3R5cGU6YV99XX0pLG51bGwpO2NvbnN0IERMPW5ldyBHYSgiTWF0U25hY2tCYXJEYXRhIik7Y2xhc3MgRUx7Y29uc3RydWN0b3IoKXt0aGlzLnBvbGl0ZW5lc3M9ImFzc2VydGl2ZSIsdGhpcy5hbm5vdW5jZW1lbnRNZXNzYWdlPSIiLHRoaXMuZHVyYXRpb249MCx0aGlzLmRhdGE9bnVsbCx0aGlzLmhvcml6b250YWxQb3NpdGlvbj0iY2VudGVyIix0aGlzLnZlcnRpY2FsUG9zaXRpb249ImJvdHRvbSJ9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCBSTD1NYXRoLnBvdygyLDMxKS0xO2NsYXNzIEFMe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fb3ZlcmxheVJlZj1lLHRoaXMuX2FmdGVyRGlzbWlzc2VkPW5ldyBJLHRoaXMuX2FmdGVyT3BlbmVkPW5ldyBJLHRoaXMuX29uQWN0aW9uPW5ldyBJLHRoaXMuX2Rpc21pc3NlZEJ5QWN0aW9uPSExLHRoaXMuY29udGFpbmVySW5zdGFuY2U9dCx0aGlzLm9uQWN0aW9uKCkuc3Vic2NyaWJlKCgoKT0+dGhpcy5kaXNtaXNzKCkpKSx0Ll9vbkV4aXQuc3Vic2NyaWJlKCgoKT0+dGhpcy5fZmluaXNoRGlzbWlzcygpKSl9ZGlzbWlzcygpe3RoaXMuX2FmdGVyRGlzbWlzc2VkLmNsb3NlZHx8dGhpcy5jb250YWluZXJJbnN0YW5jZS5leGl0KCksY2xlYXJUaW1lb3V0KHRoaXMuX2R1cmF0aW9uVGltZW91dElkKX1kaXNtaXNzV2l0aEFjdGlvbigpe3RoaXMuX29uQWN0aW9uLmNsb3NlZHx8KHRoaXMuX2Rpc21pc3NlZEJ5QWN0aW9uPSEwLHRoaXMuX29uQWN0aW9uLm5leHQoKSx0aGlzLl9vbkFjdGlvbi5jb21wbGV0ZSgpKSxjbGVhclRpbWVvdXQodGhpcy5fZHVyYXRpb25UaW1lb3V0SWQpfWNsb3NlV2l0aEFjdGlvbigpe3RoaXMuZGlzbWlzc1dpdGhBY3Rpb24oKX1fZGlzbWlzc0FmdGVyKHQpe3RoaXMuX2R1cmF0aW9uVGltZW91dElkPXNldFRpbWVvdXQoKCgpPT50aGlzLmRpc21pc3MoKSksTWF0aC5taW4odCxSTCkpfV9vcGVuKCl7dGhpcy5fYWZ0ZXJPcGVuZWQuY2xvc2VkfHwodGhpcy5fYWZ0ZXJPcGVuZWQubmV4dCgpLHRoaXMuX2FmdGVyT3BlbmVkLmNvbXBsZXRlKCkpfV9maW5pc2hEaXNtaXNzKCl7dGhpcy5fb3ZlcmxheVJlZi5kaXNwb3NlKCksdGhpcy5fb25BY3Rpb24uY2xvc2VkfHx0aGlzLl9vbkFjdGlvbi5jb21wbGV0ZSgpLHRoaXMuX2FmdGVyRGlzbWlzc2VkLm5leHQoe2Rpc21pc3NlZEJ5QWN0aW9uOnRoaXMuX2Rpc21pc3NlZEJ5QWN0aW9ufSksdGhpcy5fYWZ0ZXJEaXNtaXNzZWQuY29tcGxldGUoKSx0aGlzLl9kaXNtaXNzZWRCeUFjdGlvbj0hMX1hZnRlckRpc21pc3NlZCgpe3JldHVybiB0aGlzLl9hZnRlckRpc21pc3NlZH1hZnRlck9wZW5lZCgpe3JldHVybiB0aGlzLmNvbnRhaW5lckluc3RhbmNlLl9vbkVudGVyfW9uQWN0aW9uKCl7cmV0dXJuIHRoaXMuX29uQWN0aW9ufX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgVEx7Y29uc3RydWN0b3IodCxlKXt0aGlzLnNuYWNrQmFyUmVmPXQsdGhpcy5kYXRhPWV9YWN0aW9uKCl7dGhpcy5zbmFja0JhclJlZi5kaXNtaXNzV2l0aEFjdGlvbigpfWdldCBoYXNBY3Rpb24oKXtyZXR1cm4hIXRoaXMuZGF0YS5hY3Rpb259fVRMLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxUTCkoU20oQUwpLFNtKERMKSl9LFRMLsm1Y21wPXRvKHt0eXBlOlRMLHNlbGVjdG9yczpbWyJzaW1wbGUtc25hY2stYmFyIl1dLGhvc3RBdHRyczpbMSwibWF0LXNpbXBsZS1zbmFja2JhciJdLGRlY2xzOjMsdmFyczoyLGNvbnN0czpbWyJjbGFzcyIsIm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uIiw0LCJuZ0lmIl0sWzEsIm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uIl0sWyJtYXQtYnV0dG9uIiwiIiwzLCJjbGljayJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwic3BhbiIpLGt1KDEpLEFtKCksUXAoMixrTCwzLDEsImRpdiIsMCkpLDImZSYmKHJjKDEpLFN1KG4uZGF0YS5tZXNzYWdlKSxyYygxKSxEbSgibmdJZiIsbi5oYXNBY3Rpb24pKX0sZGlyZWN0aXZlczpbZE0sWEhdLHN0eWxlczpbIi5tYXQtc2ltcGxlLXNuYWNrYmFye2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjthbGlnbi1pdGVtczpjZW50ZXI7bGluZS1oZWlnaHQ6MjBweDtvcGFjaXR5OjF9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9ue2ZsZXgtc2hyaW5rOjA7bWFyZ2luOi04cHggLThweCAtOHB4IDhweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb24gYnV0dG9ue21heC1oZWlnaHQ6MzZweDttaW4td2lkdGg6MH1bZGlyPXJ0bF0gLm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9ue21hcmdpbi1sZWZ0Oi04cHg7bWFyZ2luLXJpZ2h0OjhweH1cbiJdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLFRMLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6QUx9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltETF19XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoVEwsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3Rvcjoic2ltcGxlLXNuYWNrLWJhciIsdGVtcGxhdGU6JzxzcGFuPnt7ZGF0YS5tZXNzYWdlfX08L3NwYW4+XG48ZGl2IGNsYXNzPSJtYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbiIgICpuZ0lmPSJoYXNBY3Rpb24iPlxuICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT0iYWN0aW9uKCkiPnt7ZGF0YS5hY3Rpb259fTwvYnV0dG9uPlxuPC9kaXY+XG4nLGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLGhvc3Q6e2NsYXNzOiJtYXQtc2ltcGxlLXNuYWNrYmFyIn0sc3R5bGVzOlsiLm1hdC1zaW1wbGUtc25hY2tiYXJ7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjtsaW5lLWhlaWdodDoyMHB4O29wYWNpdHk6MX0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb257ZmxleC1zaHJpbms6MDttYXJnaW46LThweCAtOHB4IC04cHggOHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbiBidXR0b257bWF4LWhlaWdodDozNnB4O21pbi13aWR0aDowfVtkaXI9cnRsXSAubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb257bWFyZ2luLWxlZnQ6LThweDttYXJnaW4tcmlnaHQ6OHB4fVxuIl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpBTH0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W0RMXX1dfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IE5MPXtzbmFja0JhclN0YXRlOm54KCJzdGF0ZSIsW3J4KCJ2b2lkLCBoaWRkZW4iLGF4KHt0cmFuc2Zvcm06InNjYWxlKDAuOCkiLG9wYWNpdHk6MH0pKSxyeCgidmlzaWJsZSIsYXgoe3RyYW5zZm9ybToic2NhbGUoMSkiLG9wYWNpdHk6MX0pKSxseCgiKiA9PiB2aXNpYmxlIixveCgiMTUwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSkiKSksbHgoIiogPT4gdm9pZCwgKiA9PiBoaWRkZW4iLG94KCI3NW1zIGN1YmljLWJlemllcigwLjQsIDAuMCwgMSwgMSkiLGF4KHtvcGFjaXR5OjB9KSkpXSl9OwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyB6TCBleHRlbmRzIFBGe2NvbnN0cnVjdG9yKHQsZSxuLG8saSl7c3VwZXIoKSx0aGlzLl9uZ1pvbmU9dCx0aGlzLl9lbGVtZW50UmVmPWUsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWY9bix0aGlzLl9wbGF0Zm9ybT1vLHRoaXMuc25hY2tCYXJDb25maWc9aSx0aGlzLl9hbm5vdW5jZURlbGF5PTE1MCx0aGlzLl9kZXN0cm95ZWQ9ITEsdGhpcy5fb25Bbm5vdW5jZT1uZXcgSSx0aGlzLl9vbkV4aXQ9bmV3IEksdGhpcy5fb25FbnRlcj1uZXcgSSx0aGlzLl9hbmltYXRpb25TdGF0ZT0idm9pZCIsdGhpcy5hdHRhY2hEb21Qb3J0YWw9dD0+KHRoaXMuX2Fzc2VydE5vdEF0dGFjaGVkKCksdGhpcy5fYXBwbHlTbmFja0JhckNsYXNzZXMoKSx0aGlzLl9wb3J0YWxPdXRsZXQuYXR0YWNoRG9tUG9ydGFsKHQpKSx0aGlzLl9saXZlPSJhc3NlcnRpdmUiIT09aS5wb2xpdGVuZXNzfHxpLmFubm91bmNlbWVudE1lc3NhZ2U/Im9mZiI9PT1pLnBvbGl0ZW5lc3M/Im9mZiI6InBvbGl0ZSI6ImFzc2VydGl2ZSIsdGhpcy5fcGxhdGZvcm0uRklSRUZPWCYmKCJwb2xpdGUiPT09dGhpcy5fbGl2ZSYmKHRoaXMuX3JvbGU9InN0YXR1cyIpLCJhc3NlcnRpdmUiPT09dGhpcy5fbGl2ZSYmKHRoaXMuX3JvbGU9ImFsZXJ0IikpfWF0dGFjaENvbXBvbmVudFBvcnRhbCh0KXtyZXR1cm4gdGhpcy5fYXNzZXJ0Tm90QXR0YWNoZWQoKSx0aGlzLl9hcHBseVNuYWNrQmFyQ2xhc3NlcygpLHRoaXMuX3BvcnRhbE91dGxldC5hdHRhY2hDb21wb25lbnRQb3J0YWwodCl9YXR0YWNoVGVtcGxhdGVQb3J0YWwodCl7cmV0dXJuIHRoaXMuX2Fzc2VydE5vdEF0dGFjaGVkKCksdGhpcy5fYXBwbHlTbmFja0JhckNsYXNzZXMoKSx0aGlzLl9wb3J0YWxPdXRsZXQuYXR0YWNoVGVtcGxhdGVQb3J0YWwodCl9b25BbmltYXRpb25FbmQodCl7Y29uc3R7ZnJvbVN0YXRlOmUsdG9TdGF0ZTpufT10O2lmKCgidm9pZCI9PT1uJiYidm9pZCIhPT1lfHwiaGlkZGVuIj09PW4pJiZ0aGlzLl9jb21wbGV0ZUV4aXQoKSwidmlzaWJsZSI9PT1uKXtjb25zdCB0PXRoaXMuX29uRW50ZXI7dGhpcy5fbmdab25lLnJ1bigoKCk9Pnt0Lm5leHQoKSx0LmNvbXBsZXRlKCl9KSl9fWVudGVyKCl7dGhpcy5fZGVzdHJveWVkfHwodGhpcy5fYW5pbWF0aW9uU3RhdGU9InZpc2libGUiLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKSx0aGlzLl9zY3JlZW5SZWFkZXJBbm5vdW5jZSgpKX1leGl0KCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvblN0YXRlPSJoaWRkZW4iLHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoIm1hdC1leGl0IiwiIiksY2xlYXJUaW1lb3V0KHRoaXMuX2Fubm91bmNlVGltZW91dElkKSx0aGlzLl9vbkV4aXR9bmdPbkRlc3Ryb3koKXt0aGlzLl9kZXN0cm95ZWQ9ITAsdGhpcy5fY29tcGxldGVFeGl0KCl9X2NvbXBsZXRlRXhpdCgpe3RoaXMuX25nWm9uZS5vbk1pY3JvdGFza0VtcHR5LnBpcGUoYmUoMSkpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLl9vbkV4aXQubmV4dCgpLHRoaXMuX29uRXhpdC5jb21wbGV0ZSgpfSkpfV9hcHBseVNuYWNrQmFyQ2xhc3Nlcygpe2NvbnN0IHQ9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LGU9dGhpcy5zbmFja0JhckNvbmZpZy5wYW5lbENsYXNzO2UmJihBcnJheS5pc0FycmF5KGUpP2UuZm9yRWFjaCgoZT0+dC5jbGFzc0xpc3QuYWRkKGUpKSk6dC5jbGFzc0xpc3QuYWRkKGUpKSwiY2VudGVyIj09PXRoaXMuc25hY2tCYXJDb25maWcuaG9yaXpvbnRhbFBvc2l0aW9uJiZ0LmNsYXNzTGlzdC5hZGQoIm1hdC1zbmFjay1iYXItY2VudGVyIiksInRvcCI9PT10aGlzLnNuYWNrQmFyQ29uZmlnLnZlcnRpY2FsUG9zaXRpb24mJnQuY2xhc3NMaXN0LmFkZCgibWF0LXNuYWNrLWJhci10b3AiKX1fYXNzZXJ0Tm90QXR0YWNoZWQoKXtpZih0aGlzLl9wb3J0YWxPdXRsZXQuaGFzQXR0YWNoZWQoKSYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93IEVycm9yKCJBdHRlbXB0aW5nIHRvIGF0dGFjaCBzbmFjayBiYXIgY29udGVudCBhZnRlciBjb250ZW50IGlzIGFscmVhZHkgYXR0YWNoZWQiKX1fc2NyZWVuUmVhZGVyQW5ub3VuY2UoKXt0aGlzLl9hbm5vdW5jZVRpbWVvdXRJZHx8dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e3RoaXMuX2Fubm91bmNlVGltZW91dElkPXNldFRpbWVvdXQoKCgpPT57Y29uc3QgdD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigiW2FyaWEtaGlkZGVuXSIpLGU9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoIlthcmlhLWxpdmVdIik7aWYodCYmZSl7bGV0IG49bnVsbDt0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXImJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmdC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSYmKG49ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCksdC5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiksZS5hcHBlbmRDaGlsZCh0KSxudWxsPT1ufHxuLmZvY3VzKCksdGhpcy5fb25Bbm5vdW5jZS5uZXh0KCksdGhpcy5fb25Bbm5vdW5jZS5jb21wbGV0ZSgpfX0pLHRoaXMuX2Fubm91bmNlRGVsYXkpfSkpfX16TC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8ekwpKFNtKGFfKSxTbShoZyksU20oVWcpLFNtKHd6KSxTbShFTCkpfSx6TC7JtWNtcD10byh7dHlwZTp6TCxzZWxlY3RvcnM6W1sic25hY2stYmFyLWNvbnRhaW5lciJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmUWgoREYsNyksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5fcG9ydGFsT3V0bGV0PXQuZmlyc3QpfX0saG9zdEF0dHJzOlsxLCJtYXQtc25hY2stYmFyLWNvbnRhaW5lciJdLGhvc3RWYXJzOjEsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJmptKCJAc3RhdGUuZG9uZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25BbmltYXRpb25FbmQoZSl9KSksMiZlJiZOdSgiQHN0YXRlIixuLl9hbmltYXRpb25TdGF0ZSl9LGZlYXR1cmVzOlt4cF0sZGVjbHM6Myx2YXJzOjIsY29uc3RzOltbImFyaWEtaGlkZGVuIiwidHJ1ZSJdLFsiY2RrUG9ydGFsT3V0bGV0IiwiIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJkaXYiLDApLFFwKDEsU0wsMCwwLCJuZy10ZW1wbGF0ZSIsMSksQW0oKSxUbSgyLCJkaXYiKSksMiZlJiYocmMoMiksanAoImFyaWEtbGl2ZSIsbi5fbGl2ZSkoInJvbGUiLG4uX3JvbGUpKX0sZGlyZWN0aXZlczpbREZdLHN0eWxlczpbIi5tYXQtc25hY2stYmFyLWNvbnRhaW5lcntib3JkZXItcmFkaXVzOjRweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTpibG9jazttYXJnaW46MjRweDttYXgtd2lkdGg6MzN2dzttaW4td2lkdGg6MzQ0cHg7cGFkZGluZzoxNHB4IDE2cHg7bWluLWhlaWdodDo0OHB4O3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zbmFjay1iYXItY29udGFpbmVye2JvcmRlcjpzb2xpZCAxcHh9Lm1hdC1zbmFjay1iYXItaGFuZHNldHt3aWR0aDoxMDAlfS5tYXQtc25hY2stYmFyLWhhbmRzZXQgLm1hdC1zbmFjay1iYXItY29udGFpbmVye21hcmdpbjo4cHg7bWF4LXdpZHRoOjEwMCU7bWluLXdpZHRoOjA7d2lkdGg6MTAwJX1cbiJdLGVuY2Fwc3VsYXRpb246MixkYXRhOnthbmltYXRpb246W05MLnNuYWNrQmFyU3RhdGVdfX0pLHpMLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6YV99LHt0eXBlOmhnfSx7dHlwZTpVZ30se3R5cGU6d3p9LHt0eXBlOkVMfV0sekwucHJvcERlY29yYXRvcnM9e19wb3J0YWxPdXRsZXQ6W3t0eXBlOlphLGFyZ3M6W0RGLHtzdGF0aWM6ITB9XX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHpMLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InNuYWNrLWJhci1jb250YWluZXIiLHRlbXBsYXRlOidceDNjIS0tIEluaXRpYWxseSBob2xkcyB0aGUgc25hY2sgYmFyIGNvbnRlbnQsIHdpbGwgYmUgZW1wdHkgYWZ0ZXIgYW5ub3VuY2luZyB0byBzY3JlZW4gcmVhZGVycy4gLS1ceDNlXG48ZGl2IGFyaWEtaGlkZGVuPSJ0cnVlIj5cbiAgPG5nLXRlbXBsYXRlIGNka1BvcnRhbE91dGxldD48L25nLXRlbXBsYXRlPlxuPC9kaXY+XG5cblx4M2MhLS0gV2lsbCByZWNlaXZlIHRoZSBzbmFjayBiYXIgY29udGVudCBmcm9tIHRoZSBub24tbGl2ZSBkaXYsIG1vdmUgd2lsbCBoYXBwZW4gYSBzaG9ydCBkZWxheSBhZnRlciBvcGVuaW5nIC0tXHgzZVxuPGRpdiBbYXR0ci5hcmlhLWxpdmVdPSJfbGl2ZSIgW2F0dHIucm9sZV09Il9yb2xlIj48L2Rpdj5cbicsY2hhbmdlRGV0ZWN0aW9uOnpuLkRlZmF1bHQsZW5jYXBzdWxhdGlvbjpIbi5Ob25lLGFuaW1hdGlvbnM6W05MLnNuYWNrQmFyU3RhdGVdLGhvc3Q6e2NsYXNzOiJtYXQtc25hY2stYmFyLWNvbnRhaW5lciIsIltAc3RhdGVdIjoiX2FuaW1hdGlvblN0YXRlIiwiKEBzdGF0ZS5kb25lKSI6Im9uQW5pbWF0aW9uRW5kKCRldmVudCkifSxzdHlsZXM6WyIubWF0LXNuYWNrLWJhci1jb250YWluZXJ7Ym9yZGVyLXJhZGl1czo0cHg7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjI0cHg7bWF4LXdpZHRoOjMzdnc7bWluLXdpZHRoOjM0NHB4O3BhZGRpbmc6MTRweCAxNnB4O21pbi1oZWlnaHQ6NDhweDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcn0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc25hY2stYmFyLWNvbnRhaW5lcntib3JkZXI6c29saWQgMXB4fS5tYXQtc25hY2stYmFyLWhhbmRzZXR7d2lkdGg6MTAwJX0ubWF0LXNuYWNrLWJhci1oYW5kc2V0IC5tYXQtc25hY2stYmFyLWNvbnRhaW5lcnttYXJnaW46OHB4O21heC13aWR0aDoxMDAlO21pbi13aWR0aDowO3dpZHRoOjEwMCV9XG4iXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmFffSx7dHlwZTpoZ30se3R5cGU6VWd9LHt0eXBlOnd6fSx7dHlwZTpFTH1dfSkse19wb3J0YWxPdXRsZXQ6W3t0eXBlOlphLGFyZ3M6W0RGLHtzdGF0aWM6ITB9XX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBJTHt9SUwuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fElMKX0sSUwuybVtb2Q9YW8oe3R5cGU6SUx9KSxJTC7JtWluaj12bih7aW1wb3J0czpbW3lMLFJGLFdNLEpILFhJXSxYSV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKElMLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbeUwsUkYsV00sSkgsWEldLGV4cG9ydHM6W3pMLFhJXSxkZWNsYXJhdGlvbnM6W3pMLFRMXSxlbnRyeUNvbXBvbmVudHM6W3pMLFRMXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKElMLHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bekwsVExdfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW3lMLFJGLFdNLEpILFhJXX0sZXhwb3J0czpmdW5jdGlvbigpe3JldHVyblt6TCxYSV19fSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBITD1uZXcgR2EoIm1hdC1zbmFjay1iYXItZGVmYXVsdC1vcHRpb25zIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbiBGTCgpe3JldHVybiBuZXcgRUx9fSk7Y2xhc3MgTEx7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEpe3RoaXMuX292ZXJsYXk9dCx0aGlzLl9saXZlPWUsdGhpcy5faW5qZWN0b3I9bix0aGlzLl9icmVha3BvaW50T2JzZXJ2ZXI9byx0aGlzLl9wYXJlbnRTbmFja0Jhcj1pLHRoaXMuX2RlZmF1bHRDb25maWc9YSx0aGlzLl9zbmFja0JhclJlZkF0VGhpc0xldmVsPW51bGwsdGhpcy5zaW1wbGVTbmFja0JhckNvbXBvbmVudD1UTCx0aGlzLnNuYWNrQmFyQ29udGFpbmVyQ29tcG9uZW50PXpMLHRoaXMuaGFuZHNldENzc0NsYXNzPSJtYXQtc25hY2stYmFyLWhhbmRzZXQifWdldCBfb3BlbmVkU25hY2tCYXJSZWYoKXtjb25zdCB0PXRoaXMuX3BhcmVudFNuYWNrQmFyO3JldHVybiB0P3QuX29wZW5lZFNuYWNrQmFyUmVmOnRoaXMuX3NuYWNrQmFyUmVmQXRUaGlzTGV2ZWx9c2V0IF9vcGVuZWRTbmFja0JhclJlZih0KXt0aGlzLl9wYXJlbnRTbmFja0Jhcj90aGlzLl9wYXJlbnRTbmFja0Jhci5fb3BlbmVkU25hY2tCYXJSZWY9dDp0aGlzLl9zbmFja0JhclJlZkF0VGhpc0xldmVsPXR9b3BlbkZyb21Db21wb25lbnQodCxlKXtyZXR1cm4gdGhpcy5fYXR0YWNoKHQsZSl9b3BlbkZyb21UZW1wbGF0ZSh0LGUpe3JldHVybiB0aGlzLl9hdHRhY2godCxlKX1vcGVuKHQsZT0iIixuKXtjb25zdCBvPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0aGlzLl9kZWZhdWx0Q29uZmlnKSxuKTtyZXR1cm4gby5kYXRhPXttZXNzYWdlOnQsYWN0aW9uOmV9LG8uYW5ub3VuY2VtZW50TWVzc2FnZT09PXQmJihvLmFubm91bmNlbWVudE1lc3NhZ2U9dm9pZCAwKSx0aGlzLm9wZW5Gcm9tQ29tcG9uZW50KHRoaXMuc2ltcGxlU25hY2tCYXJDb21wb25lbnQsbyl9ZGlzbWlzcygpe3RoaXMuX29wZW5lZFNuYWNrQmFyUmVmJiZ0aGlzLl9vcGVuZWRTbmFja0JhclJlZi5kaXNtaXNzKCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9zbmFja0JhclJlZkF0VGhpc0xldmVsJiZ0aGlzLl9zbmFja0JhclJlZkF0VGhpc0xldmVsLmRpc21pc3MoKX1fYXR0YWNoU25hY2tCYXJDb250YWluZXIodCxlKXtjb25zdCBuPXJwLmNyZWF0ZSh7cGFyZW50OmUmJmUudmlld0NvbnRhaW5lclJlZiYmZS52aWV3Q29udGFpbmVyUmVmLmluamVjdG9yfHx0aGlzLl9pbmplY3Rvcixwcm92aWRlcnM6W3twcm92aWRlOkVMLHVzZVZhbHVlOmV9XX0pLG89bmV3IHZGKHRoaXMuc25hY2tCYXJDb250YWluZXJDb21wb25lbnQsZS52aWV3Q29udGFpbmVyUmVmLG4pLGk9dC5hdHRhY2gobyk7cmV0dXJuIGkuaW5zdGFuY2Uuc25hY2tCYXJDb25maWc9ZSxpLmluc3RhbmNlfV9hdHRhY2godCxlKXtjb25zdCBuPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG5ldyBFTCksdGhpcy5fZGVmYXVsdENvbmZpZyksZSksbz10aGlzLl9jcmVhdGVPdmVybGF5KG4pLGk9dGhpcy5fYXR0YWNoU25hY2tCYXJDb250YWluZXIobyxuKSxhPW5ldyBBTChpLG8pO2lmKHQgaW5zdGFuY2VvZiBYZyl7Y29uc3QgZT1uZXcgeEYodCxudWxsLHskaW1wbGljaXQ6bi5kYXRhLHNuYWNrQmFyUmVmOmF9KTthLmluc3RhbmNlPWkuYXR0YWNoVGVtcGxhdGVQb3J0YWwoZSl9ZWxzZXtjb25zdCBlPXRoaXMuX2NyZWF0ZUluamVjdG9yKG4sYSksbz1uZXcgdkYodCx2b2lkIDAsZSkscj1pLmF0dGFjaENvbXBvbmVudFBvcnRhbChvKTthLmluc3RhbmNlPXIuaW5zdGFuY2V9cmV0dXJuIHRoaXMuX2JyZWFrcG9pbnRPYnNlcnZlci5vYnNlcnZlKCIobWF4LXdpZHRoOiA1OTkuOThweCkgYW5kIChvcmllbnRhdGlvbjogcG9ydHJhaXQpIikucGlwZShJZShvLmRldGFjaG1lbnRzKCkpKS5zdWJzY3JpYmUoKHQ9Pntjb25zdCBlPW8ub3ZlcmxheUVsZW1lbnQuY2xhc3NMaXN0O3QubWF0Y2hlcz9lLmFkZCh0aGlzLmhhbmRzZXRDc3NDbGFzcyk6ZS5yZW1vdmUodGhpcy5oYW5kc2V0Q3NzQ2xhc3MpfSkpLG4uYW5ub3VuY2VtZW50TWVzc2FnZSYmaS5fb25Bbm5vdW5jZS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fbGl2ZS5hbm5vdW5jZShuLmFubm91bmNlbWVudE1lc3NhZ2Usbi5wb2xpdGVuZXNzKX0pKSx0aGlzLl9hbmltYXRlU25hY2tCYXIoYSxuKSx0aGlzLl9vcGVuZWRTbmFja0JhclJlZj1hLHRoaXMuX29wZW5lZFNuYWNrQmFyUmVmfV9hbmltYXRlU25hY2tCYXIodCxlKXt0LmFmdGVyRGlzbWlzc2VkKCkuc3Vic2NyaWJlKCgoKT0+e3RoaXMuX29wZW5lZFNuYWNrQmFyUmVmPT10JiYodGhpcy5fb3BlbmVkU25hY2tCYXJSZWY9bnVsbCksZS5hbm5vdW5jZW1lbnRNZXNzYWdlJiZ0aGlzLl9saXZlLmNsZWFyKCl9KSksdGhpcy5fb3BlbmVkU25hY2tCYXJSZWY/KHRoaXMuX29wZW5lZFNuYWNrQmFyUmVmLmFmdGVyRGlzbWlzc2VkKCkuc3Vic2NyaWJlKCgoKT0+e3QuY29udGFpbmVySW5zdGFuY2UuZW50ZXIoKX0pKSx0aGlzLl9vcGVuZWRTbmFja0JhclJlZi5kaXNtaXNzKCkpOnQuY29udGFpbmVySW5zdGFuY2UuZW50ZXIoKSxlLmR1cmF0aW9uJiZlLmR1cmF0aW9uPjAmJnQuYWZ0ZXJPcGVuZWQoKS5zdWJzY3JpYmUoKCgpPT50Ll9kaXNtaXNzQWZ0ZXIoZS5kdXJhdGlvbikpKX1fY3JlYXRlT3ZlcmxheSh0KXtjb25zdCBlPW5ldyBWRjtlLmRpcmVjdGlvbj10LmRpcmVjdGlvbjtsZXQgbj10aGlzLl9vdmVybGF5LnBvc2l0aW9uKCkuZ2xvYmFsKCk7Y29uc3Qgbz0icnRsIj09PXQuZGlyZWN0aW9uLGk9ImxlZnQiPT09dC5ob3Jpem9udGFsUG9zaXRpb258fCJzdGFydCI9PT10Lmhvcml6b250YWxQb3NpdGlvbiYmIW98fCJlbmQiPT09dC5ob3Jpem9udGFsUG9zaXRpb24mJm8sYT0haSYmImNlbnRlciIhPT10Lmhvcml6b250YWxQb3NpdGlvbjtyZXR1cm4gaT9uLmxlZnQoIjAiKTphP24ucmlnaHQoIjAiKTpuLmNlbnRlckhvcml6b250YWxseSgpLCJ0b3AiPT09dC52ZXJ0aWNhbFBvc2l0aW9uP24udG9wKCIwIik6bi5ib3R0b20oIjAiKSxlLnBvc2l0aW9uU3RyYXRlZ3k9bix0aGlzLl9vdmVybGF5LmNyZWF0ZShlKX1fY3JlYXRlSW5qZWN0b3IodCxlKXtyZXR1cm4gcnAuY3JlYXRlKHtwYXJlbnQ6dCYmdC52aWV3Q29udGFpbmVyUmVmJiZ0LnZpZXdDb250YWluZXJSZWYuaW5qZWN0b3J8fHRoaXMuX2luamVjdG9yLHByb3ZpZGVyczpbe3Byb3ZpZGU6QUwsdXNlVmFsdWU6ZX0se3Byb3ZpZGU6REwsdXNlVmFsdWU6dC5kYXRhfV19KX19TEwuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fExMKSh2cihwTCksdnIoT0kpLHZyKHJwKSx2cihQTCksdnIoTEwsMTIpLHZyKEhMKSl9LExMLsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIG5ldyBMTCh2cihwTCksdnIoT0kpLHZyKEdkKSx2cihQTCksdnIoTEwsMTIpLHZyKEhMKSl9LHRva2VuOkxMLHByb3ZpZGVkSW46SUx9KSxMTC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnBMfSx7dHlwZTpPSX0se3R5cGU6cnB9LHt0eXBlOlBMfSx7dHlwZTpMTCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RXJ9XX0se3R5cGU6RUwsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbSExdfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKExMLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjpJTH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnBMfSx7dHlwZTpPSX0se3R5cGU6cnB9LHt0eXBlOlBMfSx7dHlwZTpMTCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RXJ9XX0se3R5cGU6RUwsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbSExdfV19XX0pLG51bGwpO2NvbnN0IEJMPS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxWTD0iXFx1MDAwMC1cXHUwMDIwXFx1MDA3Zi1cXHUwMDlmIixqTD1uZXcgUmVnRXhwKCIoPzpbYS16QS1aXVthLXpBLVowLTkrLi1dezIsfTpcXC9cXC98ZGF0YTp8d3d3XFwuKVteXFxzIitWTCsnIl17Mix9W15cXHMnK1ZMKyJcIicpfVxcXSw6Oy4hP10iLCJndSIpO2Z1bmN0aW9uIFVMKHQpe3JldHVybihmdW5jdGlvbiBlKHQsbil7bi5mbGFncy5pbmNsdWRlcygiZyIpfHwobj1uZXcgUmVnRXhwKG4sbi5mbGFncysiZyIpKTtjb25zdCBvPVtdO2xldCBpPTA7Zm9yKGNvbnN0IGUgb2YgdC5tYXRjaEFsbChuKSl7Y29uc3Qgbj1lLmluZGV4LGE9ZVswXTtuPmkmJm8ucHVzaCh7aW5kZXg6aSx0ZXh0OnQuc3Vic3RyaW5nKGksbiksbWF0Y2hlc1JlZ2V4OiExfSksby5wdXNoKHtpbmRleDpuLHRleHQ6YSxtYXRjaGVzUmVnZXg6ITB9KSxpPW4rYS5sZW5ndGh9cmV0dXJuIHQubGVuZ3RoPmkmJm8ucHVzaCh7aW5kZXg6aSx0ZXh0OnQuc3Vic3RyaW5nKGksdC5sZW5ndGgpLG1hdGNoZXNSZWdleDohMX0pLG99KSh0LGpMKS5tYXAoKCh7bWF0Y2hlc1JlZ2V4OnQsdGV4dDplfSk9Pih7aXNVUkw6dCx0ZXh0OmV9KSkpfWZ1bmN0aW9uIEdMKHQsZSl7aWYoMSZ0JiYoTm0oMCksa3UoMSksem0oKSksMiZ0KXtjb25zdCB0PVltKCkuJGltcGxpY2l0O3JjKDEpLER1KCIgIix0LnRleHQsIiAiKX19ZnVuY3Rpb24gV0wodCxlKXtpZigxJnQmJihSbSgwLCJhIiw3KSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKS4kaW1wbGljaXQ7S20oImhyZWYiLHQudGV4dCxUcykscmMoMSksU3UodC50ZXh0KX19ZnVuY3Rpb24gWUwodCxlKXtpZigxJnQmJihObSgwKSxRcCgxLEdMLDIsMSwibmctY29udGFpbmVyIiw1KSxRcCgyLFdMLDIsMiwibmctdGVtcGxhdGUiLG51bGwsNixpYiksem0oKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49JHAoMyk7cmMoMSksRG0oIm5nSWYiLCF0LmlzVVJMKSgibmdJZkVsc2UiLG4pfX1mdW5jdGlvbiBxTCh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsImJ1dHRvbiIsOCksVm0oImNsaWNrIiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgpLm9uQWN0aW9uQnV0dG9uQ2xpY2tlZCgpfSkpLGt1KDEpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKCk7cmMoMSksRHUoIiAiLHQuYWxlcnQuZm9sbG93dXBBY3Rpb24ubG9jYWxpemVkTGFiZWwsIiAiKX19Y2xhc3MgWkx7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuc25hY2tCYXJSZWY9dCx0aGlzLnVua25vd25EYXRhPWUsdGhpcy5zdG9yZT1uLHRoaXMuc3BsaXRCeVVSTD1VTCx0aGlzLmFsZXJ0PWV9b25BY3Rpb25CdXR0b25DbGlja2VkKCl7cmV0dXJuIGdBKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dGhpcy5zbmFja0JhclJlZi5kaXNtaXNzKCk7Y29uc3QgdD15aWVsZCB0aGlzLmFsZXJ0LmZvbGxvd3VwQWN0aW9uLmdldEZvbGxvd3VwQWN0aW9uKHRoaXMuc3RvcmUpO3RoaXMuc3RvcmUuZGlzcGF0Y2godCl9KSl9b25DbG9zZUJ1dHRvbkNsaWNrZWQoKXt0aGlzLnNuYWNrQmFyUmVmLmRpc21pc3MoKX19WkwuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFpMKShTbShBTCksU20oREwpLFNtKEl3KSl9LFpMLsm1Y21wPXRvKHt0eXBlOlpMLHNlbGVjdG9yczpbWyJhbGVydC1kaXNwbGF5LXNuYWNrYmFyIl1dLGRlY2xzOjYsdmFyczoyLGNvbnN0czpmdW5jdGlvbigpe2xldCB0O3JldHVybiB0PSJ1bmRlZmluZWQiIT10eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUmJm5nSTE4bkNsb3N1cmVNb2RlP2dvb2cuZ2V0TXNnKCJEaXNtaXNzIik6JGxvY2FsaXplYDpBIGJ1dHRvbiB0byBjbG9zZSB0aGUgc25hY2tiYXIgbWVzc2FnZeKQn2VhNGQ5ZmU2MTQyMGEzZmNlODFjZjU0YzRjNjE1ZTNjMTljNjQ2YTbikJ8xNTM2MDg3NTE5NzQzNzA3MzYyOkRpc21pc3NgLFtbMSwibWVzc2FnZSJdLFs0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbMSwiY29udHJvbHMiXSxbIm1hdC1idXR0b24iLCIiLCJjbGFzcyIsImZvbGxvd3VwLWJ1dHRvbiIsMywiY2xpY2siLDQsIm5nSWYiXSxbIm1hdC1idXR0b24iLCIiLCJhcmlhLWxhYmVsIix0LDEsImRpc21pc3MtYnV0dG9uIiwzLCJjbGljayJdLFs0LCJuZ0lmIiwibmdJZkVsc2UiXSxbImxpbmtQaWVjZSIsIiJdLFsicmVsIiwibm9yZWZlcnJlciBub29wZW5lciIsInRhcmdldCIsIl9ibGFuayIsMywiaHJlZiJdLFsibWF0LWJ1dHRvbiIsIiIsMSwiZm9sbG93dXAtYnV0dG9uIiwzLCJjbGljayJdXX0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImRpdiIsMCksUXAoMSxZTCw0LDIsIm5nLWNvbnRhaW5lciIsMSksQW0oKSxSbSgyLCJkaXYiLDIpLFFwKDMscUwsMiwxLCJidXR0b24iLDMpLFJtKDQsImJ1dHRvbiIsNCksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uQ2xvc2VCdXR0b25DbGlja2VkKCl9KSksa3UoNSwiIERpc21pc3MgIiksQW0oKSxBbSgpKSwyJmUmJihyYygxKSxEbSgibmdGb3JPZiIsbi5zcGxpdEJ5VVJMKG4uYWxlcnQubG9jYWxpemVkTWVzc2FnZSkpLHJjKDIpLERtKCJuZ0lmIixuLmFsZXJ0LmZvbGxvd3VwQWN0aW9uKSl9LGRpcmVjdGl2ZXM6W2xNLGRNLFhIXSxzdHlsZXM6WyJbX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcH0ubWVzc2FnZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7YWxpZ24tc2VsZjpjZW50ZXI7bWFyZ2luOjVweCAwO3dvcmQtYnJlYWs6YnJlYWstd29yZH0ubWVzc2FnZVtfbmdjb250ZW50LSVDT01QJV0gICBhW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5jb250cm9sc1tfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO21hcmdpbi1sZWZ0OmF1dG99YnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9Il0sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFpMLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImFsZXJ0LWRpc3BsYXktc25hY2tiYXIiLHRlbXBsYXRlVXJsOiIuL2FsZXJ0X2Rpc3BsYXlfc25hY2tiYXJfY29udGFpbmVyLm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vYWxlcnRfZGlzcGxheV9zbmFja2Jhcl9jb250YWluZXIuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkFMfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbRExdfV19LHt0eXBlOkl3fV19KSxudWxsKTtjbGFzcyBYTHtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuc3RvcmU9dCx0aGlzLnNuYWNrQmFyPWUsdGhpcy5uZ1Vuc3Vic2NyaWJlPW5ldyBJfW5nT25Jbml0KCl7dGhpcy5zdG9yZS5zZWxlY3QoZEEpLnBpcGUoSWUodGhpcy5uZ1Vuc3Vic2NyaWJlKSxjZSgodD0+Qm9vbGVhbih0KSkpKS5zdWJzY3JpYmUoKHQ9Pnt0aGlzLnNob3dBbGVydCh0KX0pKX1uZ09uRGVzdHJveSgpe3RoaXMubmdVbnN1YnNjcmliZS5uZXh0KCksdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCl9c2hvd0FsZXJ0KHQpe3RoaXMuc25hY2tCYXIub3BlbkZyb21Db21wb25lbnQoWkwse2R1cmF0aW9uOjVlMyxob3Jpem9udGFsUG9zaXRpb246InN0YXJ0Iix2ZXJ0aWNhbFBvc2l0aW9uOiJib3R0b20iLGRhdGE6dH0pfX1YTC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WEwpKFNtKEl3KSxTbShMTCkpfSxYTC7JtWNtcD10byh7dHlwZTpYTCxzZWxlY3RvcnM6W1siYWxlcnQtc25hY2tiYXIiXV0sZGVjbHM6MCx2YXJzOjAsdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pe30sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChYTCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJhbGVydC1zbmFja2JhciIsdGVtcGxhdGU6IiIsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fSx7dHlwZTpMTH1dfSksbnVsbCk7Y2xhc3MgS0x7fUtMLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxLTCl9LEtMLsm1bW9kPWFvKHt0eXBlOktMfSksS0wuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxKSCxJTF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChLTCxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbWEwsWkxdLGV4cG9ydHM6W1hMXSxpbXBvcnRzOltXTSxKSCxJTF0sZW50cnlDb21wb25lbnRzOltaTF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhLTCx7ZGVjbGFyYXRpb25zOltYTCxaTF0saW1wb3J0czpbV00sSkgsSUxdLGV4cG9ydHM6W1hMXX0pO2NsYXNzIEpMe31KTC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SkwpfSxKTC7JtW1vZD1hbyh7dHlwZTpKTH0pLEpMLsm1aW5qPXZuKHtpbXBvcnRzOltbQVIsS0wsZGsuZm9yRmVhdHVyZShjQSxweiksV2suZm9yRmVhdHVyZShbY3pdKV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChKTCxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W0FSLEtMLGRrLmZvckZlYXR1cmUoY0EscHopLFdrLmZvckZlYXR1cmUoW2N6XSldfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oSkwse2ltcG9ydHM6W0FSLEtMLGNrLEdrXX0pO2NvbnN0IFFMPVsiKiIsW1sibWF0LXRvb2xiYXItcm93Il1dXSwkTD1KSShjbGFzc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl9lbGVtZW50UmVmPXR9fSk7Y2xhc3MgdEJ7fXRCLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx0Qil9LHRCLsm1ZGlyPWxvKHt0eXBlOnRCLHNlbGVjdG9yczpbWyJtYXQtdG9vbGJhci1yb3ciXV0saG9zdEF0dHJzOlsxLCJtYXQtdG9vbGJhci1yb3ciXSxleHBvcnRBczpbIm1hdFRvb2xiYXJSb3ciXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodEIsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoibWF0LXRvb2xiYXItcm93IixleHBvcnRBczoibWF0VG9vbGJhclJvdyIsaG9zdDp7Y2xhc3M6Im1hdC10b29sYmFyLXJvdyJ9fV19XSxudWxsLG51bGwpO2NsYXNzIGVCIGV4dGVuZHMgJEx7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHQpLHRoaXMuX3BsYXRmb3JtPWUsdGhpcy5fZG9jdW1lbnQ9bn1uZ0FmdGVyVmlld0luaXQoKXt0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXImJih0aGlzLl9jaGVja1Rvb2xiYXJNaXhlZE1vZGVzKCksdGhpcy5fdG9vbGJhclJvd3MuY2hhbmdlcy5zdWJzY3JpYmUoKCgpPT50aGlzLl9jaGVja1Rvb2xiYXJNaXhlZE1vZGVzKCkpKSl9X2NoZWNrVG9vbGJhck1peGVkTW9kZXMoKXt0aGlzLl90b29sYmFyUm93cy5sZW5ndGgmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmQXJyYXkuZnJvbSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2hpbGROb2RlcykuZmlsdGVyKCh0PT4hKHQuY2xhc3NMaXN0JiZ0LmNsYXNzTGlzdC5jb250YWlucygibWF0LXRvb2xiYXItcm93IikpKSkuZmlsdGVyKCh0PT50Lm5vZGVUeXBlIT09KHRoaXMuX2RvY3VtZW50P3RoaXMuX2RvY3VtZW50LkNPTU1FTlRfTk9ERTo4KSkpLnNvbWUoKHQ9PiEoIXQudGV4dENvbnRlbnR8fCF0LnRleHRDb250ZW50LnRyaW0oKSkpKSYmKGZ1bmN0aW9uIHQoKXt0aHJvdyBFcnJvcigiTWF0VG9vbGJhcjogQXR0ZW1wdGluZyB0byBjb21iaW5lIGRpZmZlcmVudCB0b29sYmFyIG1vZGVzLiBFaXRoZXIgc3BlY2lmeSBtdWx0aXBsZSBgPG1hdC10b29sYmFyLXJvdz5gIGVsZW1lbnRzIGV4cGxpY2l0bHkgb3IganVzdCBwbGFjZSBjb250ZW50IGluc2lkZSBvZiBhIGA8bWF0LXRvb2xiYXI+YCBmb3IgYSBzaW5nbGUgcm93LiIpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8pKCl9fWVCLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxlQikoU20oaGcpLFNtKHd6KSxTbShaXykpfSxlQi7JtWNtcD10byh7dHlwZTplQixzZWxlY3RvcnM6W1sibWF0LXRvb2xiYXIiXV0sY29udGVudFF1ZXJpZXM6ZnVuY3Rpb24gdChlLG4sbyl7aWYoMSZlJiYkaChvLHRCLDUpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uX3Rvb2xiYXJSb3dzPXQpfX0saG9zdEF0dHJzOlsxLCJtYXQtdG9vbGJhciJdLGhvc3RWYXJzOjQsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJnB1KCJtYXQtdG9vbGJhci1tdWx0aXBsZS1yb3dzIixuLl90b29sYmFyUm93cy5sZW5ndGg+MCkoIm1hdC10b29sYmFyLXNpbmdsZS1yb3ciLDA9PT1uLl90b29sYmFyUm93cy5sZW5ndGgpfSxpbnB1dHM6e2NvbG9yOiJjb2xvciJ9LGV4cG9ydEFzOlsibWF0VG9vbGJhciJdLGZlYXR1cmVzOlt4cF0sbmdDb250ZW50U2VsZWN0b3JzOlsiKiIsIm1hdC10b29sYmFyLXJvdyJdLGRlY2xzOjIsdmFyczowLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabShRTCksWG0oMCksWG0oMSwxKSl9LHN0eWxlczpbIi5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10b29sYmFye291dGxpbmU6c29saWQgMXB4fS5tYXQtdG9vbGJhci1yb3csLm1hdC10b29sYmFyLXNpbmdsZS1yb3d7ZGlzcGxheTpmbGV4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjAgMTZweDt3aWR0aDoxMDAlO2ZsZXgtZGlyZWN0aW9uOnJvdzthbGlnbi1pdGVtczpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwfS5tYXQtdG9vbGJhci1tdWx0aXBsZS1yb3dze2Rpc3BsYXk6ZmxleDtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3dpZHRoOjEwMCV9XG4iXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSxlQi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTp3en0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV0sZUIucHJvcERlY29yYXRvcnM9e190b29sYmFyUm93czpbe3R5cGU6WWEsYXJnczpbdEIse2Rlc2NlbmRhbnRzOiEwfV19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChlQixbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtYXQtdG9vbGJhciIsZXhwb3J0QXM6Im1hdFRvb2xiYXIiLHRlbXBsYXRlOic8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48bmctY29udGVudCBzZWxlY3Q9Im1hdC10b29sYmFyLXJvdyI+PC9uZy1jb250ZW50PlxuJyxpbnB1dHM6WyJjb2xvciJdLGhvc3Q6e2NsYXNzOiJtYXQtdG9vbGJhciIsIltjbGFzcy5tYXQtdG9vbGJhci1tdWx0aXBsZS1yb3dzXSI6Il90b29sYmFyUm93cy5sZW5ndGggPiAwIiwiW2NsYXNzLm1hdC10b29sYmFyLXNpbmdsZS1yb3ddIjoiX3Rvb2xiYXJSb3dzLmxlbmd0aCA9PT0gMCJ9LGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2gsZW5jYXBzdWxhdGlvbjpIbi5Ob25lLHN0eWxlczpbIi5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10b29sYmFye291dGxpbmU6c29saWQgMXB4fS5tYXQtdG9vbGJhci1yb3csLm1hdC10b29sYmFyLXNpbmdsZS1yb3d7ZGlzcGxheTpmbGV4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjAgMTZweDt3aWR0aDoxMDAlO2ZsZXgtZGlyZWN0aW9uOnJvdzthbGlnbi1pdGVtczpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwfS5tYXQtdG9vbGJhci1tdWx0aXBsZS1yb3dze2Rpc3BsYXk6ZmxleDtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3dpZHRoOjEwMCV9XG4iXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTp3en0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV19KSx7X3Rvb2xiYXJSb3dzOlt7dHlwZTpZYSxhcmdzOlt0Qix7ZGVzY2VuZGFudHM6ITB9XX1dfSk7Y2xhc3MgbkJ7fWZ1bmN0aW9uIG9CKHQsZSl7MSZ0JiZYbSgwKX1uQi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bkIpfSxuQi7JtW1vZD1hbyh7dHlwZTpuQn0pLG5CLsm1aW5qPXZuKHtpbXBvcnRzOltbWEldLFhJXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobkIsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltYSV0sZXhwb3J0czpbZUIsdEIsWEldLGRlY2xhcmF0aW9uczpbZUIsdEJdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8obkIse2RlY2xhcmF0aW9uczpmdW5jdGlvbigpe3JldHVybltlQix0Ql19LGltcG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bWEldfSxleHBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW2VCLHRCLFhJXX19KTtjb25zdCBpQj1bIioiXTtmdW5jdGlvbiBhQih0LGUpe31jb25zdCByQj1mdW5jdGlvbih0KXtyZXR1cm57YW5pbWF0aW9uRHVyYXRpb246dH19LHNCPWZ1bmN0aW9uKHQsZSl7cmV0dXJue3ZhbHVlOnQscGFyYW1zOmV9fSxsQj1bInRhYkJvZHlXcmFwcGVyIl0sY0I9WyJ0YWJIZWFkZXIiXTtmdW5jdGlvbiBkQih0LGUpe31mdW5jdGlvbiBwQih0LGUpezEmdCYmUXAoMCxkQiwwLDAsIm5nLXRlbXBsYXRlIiw5KSwyJnQmJkRtKCJjZGtQb3J0YWxPdXRsZXQiLFltKCkuJGltcGxpY2l0LnRlbXBsYXRlTGFiZWwpfWZ1bmN0aW9uIG1CKHQsZSl7MSZ0JiZrdSgwKSwyJnQmJlN1KFltKCkuJGltcGxpY2l0LnRleHRMYWJlbCl9ZnVuY3Rpb24gdUIodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDYpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUoKXtjb25zdCBuPWhpKHQpLG89bi4kaW1wbGljaXQsaT1uLmluZGV4LGE9WW0oKSxyPSRwKDEpO3JldHVybiBhLl9oYW5kbGVDbGljayhvLHIsaSl9KSkoImNka0ZvY3VzQ2hhbmdlIiwoZnVuY3Rpb24gZShuKXtjb25zdCBvPWhpKHQpLmluZGV4O3JldHVybiBZbSgpLl90YWJGb2N1c0NoYW5nZWQobixvKX0pKSxSbSgxLCJkaXYiLDcpLFFwKDIscEIsMSwxLCJuZy10ZW1wbGF0ZSIsOCksUXAoMyxtQiwxLDEsIm5nLXRlbXBsYXRlIiw4KSxBbSgpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49ZS5pbmRleCxvPVltKCk7cHUoIm1hdC10YWItbGFiZWwtYWN0aXZlIixvLnNlbGVjdGVkSW5kZXg9PW4pLERtKCJpZCIsby5fZ2V0VGFiTGFiZWxJZChuKSkoImRpc2FibGVkIix0LmRpc2FibGVkKSgibWF0UmlwcGxlRGlzYWJsZWQiLHQuZGlzYWJsZWR8fG8uZGlzYWJsZVJpcHBsZSksanAoInRhYkluZGV4IixvLl9nZXRUYWJJbmRleCh0LG4pKSgiYXJpYS1wb3NpbnNldCIsbisxKSgiYXJpYS1zZXRzaXplIixvLl90YWJzLmxlbmd0aCkoImFyaWEtY29udHJvbHMiLG8uX2dldFRhYkNvbnRlbnRJZChuKSkoImFyaWEtc2VsZWN0ZWQiLG8uc2VsZWN0ZWRJbmRleD09bikoImFyaWEtbGFiZWwiLHQuYXJpYUxhYmVsfHxudWxsKSgiYXJpYS1sYWJlbGxlZGJ5IiwhdC5hcmlhTGFiZWwmJnQuYXJpYUxhYmVsbGVkYnk/dC5hcmlhTGFiZWxsZWRieTpudWxsKSxyYygyKSxEbSgibmdJZiIsdC50ZW1wbGF0ZUxhYmVsKSxyYygxKSxEbSgibmdJZiIsIXQudGVtcGxhdGVMYWJlbCl9fWZ1bmN0aW9uIGZCKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwibWF0LXRhYi1ib2R5IiwxMCksVm0oIl9vbkNlbnRlcmVkIiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgpLl9yZW1vdmVUYWJCb2R5V3JhcHBlckhlaWdodCgpfSkpKCJfb25DZW50ZXJpbmciLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLl9zZXRUYWJCb2R5V3JhcHBlckhlaWdodChuKX0pKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdCxuPWUuaW5kZXgsbz1ZbSgpO3B1KCJtYXQtdGFiLWJvZHktYWN0aXZlIixvLnNlbGVjdGVkSW5kZXg9PT1uKSxEbSgiaWQiLG8uX2dldFRhYkNvbnRlbnRJZChuKSkoImNvbnRlbnQiLHQuY29udGVudCkoInBvc2l0aW9uIix0LnBvc2l0aW9uKSgib3JpZ2luIix0Lm9yaWdpbikoImFuaW1hdGlvbkR1cmF0aW9uIixvLmFuaW1hdGlvbkR1cmF0aW9uKSxqcCgidGFiaW5kZXgiLG51bGwhPW8uY29udGVudFRhYkluZGV4JiZvLnNlbGVjdGVkSW5kZXg9PT1uP28uY29udGVudFRhYkluZGV4Om51bGwpKCJhcmlhLWxhYmVsbGVkYnkiLG8uX2dldFRhYkxhYmVsSWQobikpfX1jb25zdCBnQj1bInRhYkxpc3RDb250YWluZXIiXSxoQj1bInRhYkxpc3QiXSxiQj1bIm5leHRQYWdpbmF0b3IiXSx5Qj1bInByZXZpb3VzUGFnaW5hdG9yIl0sX0I9bmV3IEdhKCJNYXRJbmtCYXJQb3NpdGlvbmVyIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbiBDQigpe3JldHVybiB0PT4oe2xlZnQ6dD8odC5vZmZzZXRMZWZ0fHwwKSsicHgiOiIwIix3aWR0aDp0Pyh0Lm9mZnNldFdpZHRofHwwKSsicHgiOiIwIn0pfX0pO2NsYXNzIE1Ce2NvbnN0cnVjdG9yKHQsZSxuLG8pe3RoaXMuX2VsZW1lbnRSZWY9dCx0aGlzLl9uZ1pvbmU9ZSx0aGlzLl9pbmtCYXJQb3NpdGlvbmVyPW4sdGhpcy5fYW5pbWF0aW9uTW9kZT1vfWFsaWduVG9FbGVtZW50KHQpe3RoaXMuc2hvdygpLCJ1bmRlZmluZWQiIT10eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lP3RoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PntyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT50aGlzLl9zZXRTdHlsZXModCkpKX0pKTp0aGlzLl9zZXRTdHlsZXModCl9c2hvdygpe3RoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIn1oaWRlKCl7dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9X3NldFN0eWxlcyh0KXtjb25zdCBlPXRoaXMuX2lua0JhclBvc2l0aW9uZXIodCksbj10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7bi5zdHlsZS5sZWZ0PWUubGVmdCxuLnN0eWxlLndpZHRoPWUud2lkdGh9fU1CLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxNQikoU20oaGcpLFNtKGFfKSxTbShfQiksU20oVlAsOCkpfSxNQi7JtWRpcj1sbyh7dHlwZTpNQixzZWxlY3RvcnM6W1sibWF0LWluay1iYXIiXV0saG9zdEF0dHJzOlsxLCJtYXQtaW5rLWJhciJdLGhvc3RWYXJzOjIsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJnB1KCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsIk5vb3BBbmltYXRpb25zIj09PW4uX2FuaW1hdGlvbk1vZGUpfX0pLE1CLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOmFffSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbX0JdfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKE1CLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC1pbmstYmFyIixob3N0OntjbGFzczoibWF0LWluay1iYXIiLCJbY2xhc3MuX21hdC1hbmltYXRpb24tbm9vcGFibGVdIjoiX2FuaW1hdGlvbk1vZGUgPT09ICdOb29wQW5pbWF0aW9ucycifX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W19CXX1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IHZCPW5ldyBHYSgiTWF0VGFiQ29udGVudCIpO2NsYXNzIHhCe2NvbnN0cnVjdG9yKHQpe3RoaXMudGVtcGxhdGU9dH19eEIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHhCKShTbShYZykpfSx4Qi7JtWRpcj1sbyh7dHlwZTp4QixzZWxlY3RvcnM6W1siIiwibWF0VGFiQ29udGVudCIsIiJdXSxmZWF0dXJlczpbcGcoW3twcm92aWRlOnZCLHVzZUV4aXN0aW5nOnhCfV0pXX0pLHhCLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6WGd9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHhCLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IlttYXRUYWJDb250ZW50XSIscHJvdmlkZXJzOlt7cHJvdmlkZTp2Qix1c2VFeGlzdGluZzp4Qn1dfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6WGd9XX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgT0I9bmV3IEdhKCJNYXRUYWJMYWJlbCIpO2NsYXNzIFBCIGV4dGVuZHMga0Z7fVBCLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYShQQikpKShufHxQQil9fSkoKSxQQi7JtWRpcj1sbyh7dHlwZTpQQixzZWxlY3RvcnM6W1siIiwibWF0LXRhYi1sYWJlbCIsIiJdLFsiIiwibWF0VGFiTGFiZWwiLCIiXV0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTpPQix1c2VFeGlzdGluZzpQQn1dKSx4cF19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFBCLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IlttYXQtdGFiLWxhYmVsXSwgW21hdFRhYkxhYmVsXSIscHJvdmlkZXJzOlt7cHJvdmlkZTpPQix1c2VFeGlzdGluZzpQQn1dfV19XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3Qgd0I9S0koY2xhc3N7fSksa0I9bmV3IEdhKCJNQVRfVEFCX0dST1VQIik7Y2xhc3MgU0IgZXh0ZW5kcyB3Qntjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5fdmlld0NvbnRhaW5lclJlZj10LHRoaXMuX2Nsb3Nlc3RUYWJHcm91cD1lLHRoaXMudGV4dExhYmVsPSIiLHRoaXMuX2NvbnRlbnRQb3J0YWw9bnVsbCx0aGlzLl9zdGF0ZUNoYW5nZXM9bmV3IEksdGhpcy5wb3NpdGlvbj1udWxsLHRoaXMub3JpZ2luPW51bGwsdGhpcy5pc0FjdGl2ZT0hMX1nZXQgdGVtcGxhdGVMYWJlbCgpe3JldHVybiB0aGlzLl90ZW1wbGF0ZUxhYmVsfXNldCB0ZW1wbGF0ZUxhYmVsKHQpe3RoaXMuX3NldFRlbXBsYXRlTGFiZWxJbnB1dCh0KX1nZXQgY29udGVudCgpe3JldHVybiB0aGlzLl9jb250ZW50UG9ydGFsfW5nT25DaGFuZ2VzKHQpeyh0Lmhhc093blByb3BlcnR5KCJ0ZXh0TGFiZWwiKXx8dC5oYXNPd25Qcm9wZXJ0eSgiZGlzYWJsZWQiKSkmJnRoaXMuX3N0YXRlQ2hhbmdlcy5uZXh0KCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9zdGF0ZUNoYW5nZXMuY29tcGxldGUoKX1uZ09uSW5pdCgpe3RoaXMuX2NvbnRlbnRQb3J0YWw9bmV3IHhGKHRoaXMuX2V4cGxpY2l0Q29udGVudHx8dGhpcy5faW1wbGljaXRDb250ZW50LHRoaXMuX3ZpZXdDb250YWluZXJSZWYpfV9zZXRUZW1wbGF0ZUxhYmVsSW5wdXQodCl7dCYmKHRoaXMuX3RlbXBsYXRlTGFiZWw9dCl9fVNCLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxTQikoU20oZWgpLFNtKGtCLDgpKX0sU0IuybVjbXA9dG8oe3R5cGU6U0Isc2VsZWN0b3JzOltbIm1hdC10YWIiXV0sY29udGVudFF1ZXJpZXM6ZnVuY3Rpb24gdChlLG4sbyl7aWYoMSZlJiYoJGgobyxPQiw1KSwkaChvLHZCLDcsWGcpKSwyJmUpe2xldCB0O0poKHQ9dGIoKSkmJihuLnRlbXBsYXRlTGFiZWw9dC5maXJzdCksSmgodD10YigpKSYmKG4uX2V4cGxpY2l0Q29udGVudD10LmZpcnN0KX19LHZpZXdRdWVyeTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiZRaChYZyw3KSwyJmUpe2xldCB0O0poKHQ9dGIoKSkmJihuLl9pbXBsaWNpdENvbnRlbnQ9dC5maXJzdCl9fSxpbnB1dHM6e2Rpc2FibGVkOiJkaXNhYmxlZCIsdGV4dExhYmVsOlsibGFiZWwiLCJ0ZXh0TGFiZWwiXSxhcmlhTGFiZWw6WyJhcmlhLWxhYmVsIiwiYXJpYUxhYmVsIl0sYXJpYUxhYmVsbGVkYnk6WyJhcmlhLWxhYmVsbGVkYnkiLCJhcmlhTGFiZWxsZWRieSJdfSxleHBvcnRBczpbIm1hdFRhYiJdLGZlYXR1cmVzOlt4cCxCb10sbmdDb250ZW50U2VsZWN0b3JzOmlCLGRlY2xzOjEsdmFyczowLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabSgpLFFwKDAsb0IsMSwwLCJuZy10ZW1wbGF0ZSIpKX0sZW5jYXBzdWxhdGlvbjoyfSksU0IuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTplaH0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W2tCXX0se3R5cGU6U3J9XX1dLFNCLnByb3BEZWNvcmF0b3JzPXt0ZW1wbGF0ZUxhYmVsOlt7dHlwZTpxYSxhcmdzOltPQl19XSxfZXhwbGljaXRDb250ZW50Olt7dHlwZTpxYSxhcmdzOlt2Qix7cmVhZDpYZyxzdGF0aWM6ITB9XX1dLF9pbXBsaWNpdENvbnRlbnQ6W3t0eXBlOlphLGFyZ3M6W1hnLHtzdGF0aWM6ITB9XX1dLHRleHRMYWJlbDpbe3R5cGU6eHksYXJnczpbImxhYmVsIl19XSxhcmlhTGFiZWw6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsIl19XSxhcmlhTGFiZWxsZWRieTpbe3R5cGU6eHksYXJnczpbImFyaWEtbGFiZWxsZWRieSJdfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoU0IsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWF0LXRhYiIsdGVtcGxhdGU6Ilx4M2MhLS0gQ3JlYXRlIGEgdGVtcGxhdGUgZm9yIHRoZSBjb250ZW50IG9mIHRoZSA8bWF0LXRhYj4gc28gdGhhdCB3ZSBjYW4gZ3JhYiBhIHJlZmVyZW5jZSB0byB0aGlzXG4gICAgVGVtcGxhdGVSZWYgYW5kIHVzZSBpdCBpbiBhIFBvcnRhbCB0byByZW5kZXIgdGhlIHRhYiBjb250ZW50IGluIHRoZSBhcHByb3ByaWF0ZSBwbGFjZSBpbiB0aGVcbiAgICB0YWItZ3JvdXAuIC0tXHgzZVxuPG5nLXRlbXBsYXRlPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L25nLXRlbXBsYXRlPlxuIixpbnB1dHM6WyJkaXNhYmxlZCJdLGNoYW5nZURldGVjdGlvbjp6bi5EZWZhdWx0LGVuY2Fwc3VsYXRpb246SG4uTm9uZSxleHBvcnRBczoibWF0VGFiIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmVofSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpba0JdfSx7dHlwZTpTcn1dfV19KSx7dGV4dExhYmVsOlt7dHlwZTp4eSxhcmdzOlsibGFiZWwiXX1dLHRlbXBsYXRlTGFiZWw6W3t0eXBlOnFhLGFyZ3M6W09CXX1dLF9leHBsaWNpdENvbnRlbnQ6W3t0eXBlOnFhLGFyZ3M6W3ZCLHtyZWFkOlhnLHN0YXRpYzohMH1dfV0sX2ltcGxpY2l0Q29udGVudDpbe3R5cGU6WmEsYXJnczpbWGcse3N0YXRpYzohMH1dfV0sYXJpYUxhYmVsOlt7dHlwZTp4eSxhcmdzOlsiYXJpYS1sYWJlbCJdfV0sYXJpYUxhYmVsbGVkYnk6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsbGVkYnkiXX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBEQj17dHJhbnNsYXRlVGFiOm54KCJ0cmFuc2xhdGVUYWIiLFtyeCgiY2VudGVyLCB2b2lkLCBsZWZ0LW9yaWdpbi1jZW50ZXIsIHJpZ2h0LW9yaWdpbi1jZW50ZXIiLGF4KHt0cmFuc2Zvcm06Im5vbmUifSkpLHJ4KCJsZWZ0IixheCh7dHJhbnNmb3JtOiJ0cmFuc2xhdGUzZCgtMTAwJSwgMCwgMCkiLG1pbkhlaWdodDoiMXB4In0pKSxyeCgicmlnaHQiLGF4KHt0cmFuc2Zvcm06InRyYW5zbGF0ZTNkKDEwMCUsIDAsIDApIixtaW5IZWlnaHQ6IjFweCJ9KSksbHgoIiogPT4gbGVmdCwgKiA9PiByaWdodCwgbGVmdCA9PiBjZW50ZXIsIHJpZ2h0ID0+IGNlbnRlciIsb3goInt7YW5pbWF0aW9uRHVyYXRpb259fSBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSkiKSksbHgoInZvaWQgPT4gbGVmdC1vcmlnaW4tY2VudGVyIixbYXgoe3RyYW5zZm9ybToidHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApIn0pLG94KCJ7e2FuaW1hdGlvbkR1cmF0aW9ufX0gY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpIildKSxseCgidm9pZCA9PiByaWdodC1vcmlnaW4tY2VudGVyIixbYXgoe3RyYW5zZm9ybToidHJhbnNsYXRlM2QoMTAwJSwgMCwgMCkifSksb3goInt7YW5pbWF0aW9uRHVyYXRpb259fSBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSkiKV0pXSl9OwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBFQiBleHRlbmRzIERGe2NvbnN0cnVjdG9yKHQsZSxuLG8pe3N1cGVyKHQsZSxvKSx0aGlzLl9ob3N0PW4sdGhpcy5fY2VudGVyaW5nU3ViPW0uRU1QVFksdGhpcy5fbGVhdmluZ1N1Yj1tLkVNUFRZfW5nT25Jbml0KCl7c3VwZXIubmdPbkluaXQoKSx0aGlzLl9jZW50ZXJpbmdTdWI9dGhpcy5faG9zdC5fYmVmb3JlQ2VudGVyaW5nLnBpcGUoTmUodGhpcy5faG9zdC5faXNDZW50ZXJQb3NpdGlvbih0aGlzLl9ob3N0Ll9wb3NpdGlvbikpKS5zdWJzY3JpYmUoKHQ9Pnt0JiYhdGhpcy5oYXNBdHRhY2hlZCgpJiZ0aGlzLmF0dGFjaCh0aGlzLl9ob3N0Ll9jb250ZW50KX0pKSx0aGlzLl9sZWF2aW5nU3ViPXRoaXMuX2hvc3QuX2FmdGVyTGVhdmluZ0NlbnRlci5zdWJzY3JpYmUoKCgpPT57dGhpcy5kZXRhY2goKX0pKX1uZ09uRGVzdHJveSgpe3N1cGVyLm5nT25EZXN0cm95KCksdGhpcy5fY2VudGVyaW5nU3ViLnVuc3Vic2NyaWJlKCksdGhpcy5fbGVhdmluZ1N1Yi51bnN1YnNjcmliZSgpfX1FQi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8RUIpKFNtKHVnKSxTbShlaCksU20ocWUoKCgpPT5BQikpKSxTbShaXykpfSxFQi7JtWRpcj1sbyh7dHlwZTpFQixzZWxlY3RvcnM6W1siIiwibWF0VGFiQm9keUhvc3QiLCIiXV0sZmVhdHVyZXM6W3hwXX0pLEVCLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6dWd9LHt0eXBlOmVofSx7dHlwZTpBQixkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltxZSgoKCk9PkFCKSldfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRUIsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW21hdFRhYkJvZHlIb3N0XSJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp1Z30se3R5cGU6ZWh9LHt0eXBlOkFCLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3FlKCgoKT0+QUIpKV19XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV19KSxudWxsKTtjbGFzcyBSQntjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5fZWxlbWVudFJlZj10LHRoaXMuX2Rpcj1lLHRoaXMuX2RpckNoYW5nZVN1YnNjcmlwdGlvbj1tLkVNUFRZLHRoaXMuX3RyYW5zbGF0ZVRhYkNvbXBsZXRlPW5ldyBJLHRoaXMuX29uQ2VudGVyaW5nPW5ldyBMaCx0aGlzLl9iZWZvcmVDZW50ZXJpbmc9bmV3IExoLHRoaXMuX2FmdGVyTGVhdmluZ0NlbnRlcj1uZXcgTGgsdGhpcy5fb25DZW50ZXJlZD1uZXcgTGgoITApLHRoaXMuYW5pbWF0aW9uRHVyYXRpb249IjUwMG1zIixlJiYodGhpcy5fZGlyQ2hhbmdlU3Vic2NyaXB0aW9uPWUuY2hhbmdlLnN1YnNjcmliZSgodD0+e3RoaXMuX2NvbXB1dGVQb3NpdGlvbkFuaW1hdGlvblN0YXRlKHQpLG4ubWFya0ZvckNoZWNrKCl9KSkpLHRoaXMuX3RyYW5zbGF0ZVRhYkNvbXBsZXRlLnBpcGUoTWUoKCh0LGUpPT50LmZyb21TdGF0ZT09PWUuZnJvbVN0YXRlJiZ0LnRvU3RhdGU9PT1lLnRvU3RhdGUpKSkuc3Vic2NyaWJlKCh0PT57dGhpcy5faXNDZW50ZXJQb3NpdGlvbih0LnRvU3RhdGUpJiZ0aGlzLl9pc0NlbnRlclBvc2l0aW9uKHRoaXMuX3Bvc2l0aW9uKSYmdGhpcy5fb25DZW50ZXJlZC5lbWl0KCksdGhpcy5faXNDZW50ZXJQb3NpdGlvbih0LmZyb21TdGF0ZSkmJiF0aGlzLl9pc0NlbnRlclBvc2l0aW9uKHRoaXMuX3Bvc2l0aW9uKSYmdGhpcy5fYWZ0ZXJMZWF2aW5nQ2VudGVyLmVtaXQoKX0pKX1zZXQgcG9zaXRpb24odCl7dGhpcy5fcG9zaXRpb25JbmRleD10LHRoaXMuX2NvbXB1dGVQb3NpdGlvbkFuaW1hdGlvblN0YXRlKCl9bmdPbkluaXQoKXsiY2VudGVyIj09dGhpcy5fcG9zaXRpb24mJm51bGwhPXRoaXMub3JpZ2luJiYodGhpcy5fcG9zaXRpb249dGhpcy5fY29tcHV0ZVBvc2l0aW9uRnJvbU9yaWdpbih0aGlzLm9yaWdpbikpfW5nT25EZXN0cm95KCl7dGhpcy5fZGlyQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5fdHJhbnNsYXRlVGFiQ29tcGxldGUuY29tcGxldGUoKX1fb25UcmFuc2xhdGVUYWJTdGFydGVkKHQpe2NvbnN0IGU9dGhpcy5faXNDZW50ZXJQb3NpdGlvbih0LnRvU3RhdGUpO3RoaXMuX2JlZm9yZUNlbnRlcmluZy5lbWl0KGUpLGUmJnRoaXMuX29uQ2VudGVyaW5nLmVtaXQodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCl9X2dldExheW91dERpcmVjdGlvbigpe3JldHVybiB0aGlzLl9kaXImJiJydGwiPT09dGhpcy5fZGlyLnZhbHVlPyJydGwiOiJsdHIifV9pc0NlbnRlclBvc2l0aW9uKHQpe3JldHVybiJjZW50ZXIiPT10fHwibGVmdC1vcmlnaW4tY2VudGVyIj09dHx8InJpZ2h0LW9yaWdpbi1jZW50ZXIiPT10fV9jb21wdXRlUG9zaXRpb25BbmltYXRpb25TdGF0ZSh0PXRoaXMuX2dldExheW91dERpcmVjdGlvbigpKXt0aGlzLl9wb3NpdGlvbj10aGlzLl9wb3NpdGlvbkluZGV4PDA/Imx0ciI9PXQ/ImxlZnQiOiJyaWdodCI6dGhpcy5fcG9zaXRpb25JbmRleD4wPyJsdHIiPT10PyJyaWdodCI6ImxlZnQiOiJjZW50ZXIifV9jb21wdXRlUG9zaXRpb25Gcm9tT3JpZ2luKHQpe2NvbnN0IGU9dGhpcy5fZ2V0TGF5b3V0RGlyZWN0aW9uKCk7cmV0dXJuImx0ciI9PWUmJnQ8PTB8fCJydGwiPT1lJiZ0PjA/ImxlZnQtb3JpZ2luLWNlbnRlciI6InJpZ2h0LW9yaWdpbi1jZW50ZXIifX1SQi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8UkIpKFNtKGhnKSxTbShISSw4KSxTbShVZykpfSxSQi7JtWRpcj1sbyh7dHlwZTpSQixpbnB1dHM6e2FuaW1hdGlvbkR1cmF0aW9uOiJhbmltYXRpb25EdXJhdGlvbiIscG9zaXRpb246InBvc2l0aW9uIixfY29udGVudDpbImNvbnRlbnQiLCJfY29udGVudCJdLG9yaWdpbjoib3JpZ2luIn0sb3V0cHV0czp7X29uQ2VudGVyaW5nOiJfb25DZW50ZXJpbmciLF9iZWZvcmVDZW50ZXJpbmc6Il9iZWZvcmVDZW50ZXJpbmciLF9hZnRlckxlYXZpbmdDZW50ZXI6Il9hZnRlckxlYXZpbmdDZW50ZXIiLF9vbkNlbnRlcmVkOiJfb25DZW50ZXJlZCJ9fSksUkIuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ30se3R5cGU6SEksZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6VWd9XSxSQi5wcm9wRGVjb3JhdG9ycz17X29uQ2VudGVyaW5nOlt7dHlwZTpPeX1dLF9iZWZvcmVDZW50ZXJpbmc6W3t0eXBlOk95fV0sX2FmdGVyTGVhdmluZ0NlbnRlcjpbe3R5cGU6T3l9XSxfb25DZW50ZXJlZDpbe3R5cGU6T3l9XSxfY29udGVudDpbe3R5cGU6eHksYXJnczpbImNvbnRlbnQiXX1dLG9yaWdpbjpbe3R5cGU6eHl9XSxhbmltYXRpb25EdXJhdGlvbjpbe3R5cGU6eHl9XSxwb3NpdGlvbjpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChSQixbe3R5cGU6Q3l9XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOlVnfV19KSx7X29uQ2VudGVyaW5nOlt7dHlwZTpPeX1dLF9iZWZvcmVDZW50ZXJpbmc6W3t0eXBlOk95fV0sX2FmdGVyTGVhdmluZ0NlbnRlcjpbe3R5cGU6T3l9XSxfb25DZW50ZXJlZDpbe3R5cGU6T3l9XSxhbmltYXRpb25EdXJhdGlvbjpbe3R5cGU6eHl9XSxwb3NpdGlvbjpbe3R5cGU6eHl9XSxfY29udGVudDpbe3R5cGU6eHksYXJnczpbImNvbnRlbnQiXX1dLG9yaWdpbjpbe3R5cGU6eHl9XX0pO2NsYXNzIEFCIGV4dGVuZHMgUkJ7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHQsZSxuKX19QUIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEFCKShTbShoZyksU20oSEksOCksU20oVWcpKX0sQUIuybVjbXA9dG8oe3R5cGU6QUIsc2VsZWN0b3JzOltbIm1hdC10YWItYm9keSJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmUWgoREYsNSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5fcG9ydGFsSG9zdD10LmZpcnN0KX19LGhvc3RBdHRyczpbMSwibWF0LXRhYi1ib2R5Il0sZmVhdHVyZXM6W3hwXSxkZWNsczozLHZhcnM6Nixjb25zdHM6W1siY2RrU2Nyb2xsYWJsZSIsIiIsMSwibWF0LXRhYi1ib2R5LWNvbnRlbnQiXSxbImNvbnRlbnQiLCIiXSxbIm1hdFRhYkJvZHlIb3N0IiwiIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJkaXYiLDAsMSksVm0oIkB0cmFuc2xhdGVUYWIuc3RhcnQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9vblRyYW5zbGF0ZVRhYlN0YXJ0ZWQoZSl9KSkoIkB0cmFuc2xhdGVUYWIuZG9uZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX3RyYW5zbGF0ZVRhYkNvbXBsZXRlLm5leHQoZSl9KSksUXAoMixhQiwwLDAsIm5nLXRlbXBsYXRlIiwyKSxBbSgpKSwyJmUmJkRtKCJAdHJhbnNsYXRlVGFiIix2aCgzLHNCLG4uX3Bvc2l0aW9uLE1oKDEsckIsbi5hbmltYXRpb25EdXJhdGlvbikpKX0sZGlyZWN0aXZlczpbRUJdLHN0eWxlczpbIi5tYXQtdGFiLWJvZHktY29udGVudHtoZWlnaHQ6MTAwJTtvdmVyZmxvdzphdXRvfS5tYXQtdGFiLWdyb3VwLWR5bmFtaWMtaGVpZ2h0IC5tYXQtdGFiLWJvZHktY29udGVudHtvdmVyZmxvdzpoaWRkZW59XG4iXSxlbmNhcHN1bGF0aW9uOjIsZGF0YTp7YW5pbWF0aW9uOltEQi50cmFuc2xhdGVUYWJdfX0pLEFCLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOlVnfV0sQUIucHJvcERlY29yYXRvcnM9e19wb3J0YWxIb3N0Olt7dHlwZTpaYSxhcmdzOltERl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChBQixbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtYXQtdGFiLWJvZHkiLHRlbXBsYXRlOic8ZGl2IGNsYXNzPSJtYXQtdGFiLWJvZHktY29udGVudCIgI2NvbnRlbnRcbiAgICAgW0B0cmFuc2xhdGVUYWJdPSJ7XG4gICAgICAgIHZhbHVlOiBfcG9zaXRpb24sXG4gICAgICAgIHBhcmFtczoge2FuaW1hdGlvbkR1cmF0aW9uOiBhbmltYXRpb25EdXJhdGlvbn1cbiAgICAgfSJcbiAgICAgKEB0cmFuc2xhdGVUYWIuc3RhcnQpPSJfb25UcmFuc2xhdGVUYWJTdGFydGVkKCRldmVudCkiXG4gICAgIChAdHJhbnNsYXRlVGFiLmRvbmUpPSJfdHJhbnNsYXRlVGFiQ29tcGxldGUubmV4dCgkZXZlbnQpIlxuICAgICBjZGtTY3JvbGxhYmxlPlxuICA8bmctdGVtcGxhdGUgbWF0VGFiQm9keUhvc3Q+PC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuJyxlbmNhcHN1bGF0aW9uOkhuLk5vbmUsY2hhbmdlRGV0ZWN0aW9uOnpuLkRlZmF1bHQsYW5pbWF0aW9uczpbREIudHJhbnNsYXRlVGFiXSxob3N0OntjbGFzczoibWF0LXRhYi1ib2R5In0sc3R5bGVzOlsiLm1hdC10YWItYm9keS1jb250ZW50e2hlaWdodDoxMDAlO292ZXJmbG93OmF1dG99Lm1hdC10YWItZ3JvdXAtZHluYW1pYy1oZWlnaHQgLm1hdC10YWItYm9keS1jb250ZW50e292ZXJmbG93OmhpZGRlbn1cbiJdfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOlVnfV19KSx7X3BvcnRhbEhvc3Q6W3t0eXBlOlphLGFyZ3M6W0RGXX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBUQj1uZXcgR2EoIk1BVF9UQUJTX0NPTkZJRyIpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9sZXQgTkI9MDtjbGFzcyB6Qnt9Y29uc3QgSUI9SkkoUUkoY2xhc3N7Y29uc3RydWN0b3IodCl7dGhpcy5fZWxlbWVudFJlZj10fX0pLCJwcmltYXJ5Iik7Y2xhc3MgSEIgZXh0ZW5kcyBJQntjb25zdHJ1Y3Rvcih0LGUsbixvKXt2YXIgaTtzdXBlcih0KSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZj1lLHRoaXMuX2FuaW1hdGlvbk1vZGU9byx0aGlzLl90YWJzPW5ldyBWaCx0aGlzLl9pbmRleFRvU2VsZWN0PTAsdGhpcy5fdGFiQm9keVdyYXBwZXJIZWlnaHQ9MCx0aGlzLl90YWJzU3Vic2NyaXB0aW9uPW0uRU1QVFksdGhpcy5fdGFiTGFiZWxTdWJzY3JpcHRpb249bS5FTVBUWSx0aGlzLl9zZWxlY3RlZEluZGV4PW51bGwsdGhpcy5oZWFkZXJQb3NpdGlvbj0iYWJvdmUiLHRoaXMuc2VsZWN0ZWRJbmRleENoYW5nZT1uZXcgTGgsdGhpcy5mb2N1c0NoYW5nZT1uZXcgTGgsdGhpcy5hbmltYXRpb25Eb25lPW5ldyBMaCx0aGlzLnNlbGVjdGVkVGFiQ2hhbmdlPW5ldyBMaCghMCksdGhpcy5fZ3JvdXBJZD1OQisrLHRoaXMuYW5pbWF0aW9uRHVyYXRpb249biYmbi5hbmltYXRpb25EdXJhdGlvbj9uLmFuaW1hdGlvbkR1cmF0aW9uOiI1MDBtcyIsdGhpcy5kaXNhYmxlUGFnaW5hdGlvbj0hKCFufHxudWxsPT1uLmRpc2FibGVQYWdpbmF0aW9uKSYmbi5kaXNhYmxlUGFnaW5hdGlvbix0aGlzLmR5bmFtaWNIZWlnaHQ9ISghbnx8bnVsbD09bi5keW5hbWljSGVpZ2h0KSYmbi5keW5hbWljSGVpZ2h0LHRoaXMuY29udGVudFRhYkluZGV4PW51bGwhPT0oaT1udWxsPT1uP3ZvaWQgMDpuLmNvbnRlbnRUYWJJbmRleCkmJnZvaWQgMCE9PWk/aTpudWxsfWdldCBkeW5hbWljSGVpZ2h0KCl7cmV0dXJuIHRoaXMuX2R5bmFtaWNIZWlnaHR9c2V0IGR5bmFtaWNIZWlnaHQodCl7dGhpcy5fZHluYW1pY0hlaWdodD15eih0KX1nZXQgc2VsZWN0ZWRJbmRleCgpe3JldHVybiB0aGlzLl9zZWxlY3RlZEluZGV4fXNldCBzZWxlY3RlZEluZGV4KHQpe3RoaXMuX2luZGV4VG9TZWxlY3Q9X3oodCxudWxsKX1nZXQgYW5pbWF0aW9uRHVyYXRpb24oKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uRHVyYXRpb259c2V0IGFuaW1hdGlvbkR1cmF0aW9uKHQpe3RoaXMuX2FuaW1hdGlvbkR1cmF0aW9uPS9eXGQrJC8udGVzdCh0KT90KyJtcyI6dH1nZXQgY29udGVudFRhYkluZGV4KCl7cmV0dXJuIHRoaXMuX2NvbnRlbnRUYWJJbmRleH1zZXQgY29udGVudFRhYkluZGV4KHQpe3RoaXMuX2NvbnRlbnRUYWJJbmRleD1feih0LG51bGwpfWdldCBiYWNrZ3JvdW5kQ29sb3IoKXtyZXR1cm4gdGhpcy5fYmFja2dyb3VuZENvbG9yfXNldCBiYWNrZ3JvdW5kQ29sb3IodCl7Y29uc3QgZT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7ZS5jbGFzc0xpc3QucmVtb3ZlKGBtYXQtYmFja2dyb3VuZC0ke3RoaXMuYmFja2dyb3VuZENvbG9yfWApLHQmJmUuY2xhc3NMaXN0LmFkZChgbWF0LWJhY2tncm91bmQtJHt0fWApLHRoaXMuX2JhY2tncm91bmRDb2xvcj10fW5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpe2NvbnN0IHQ9dGhpcy5faW5kZXhUb1NlbGVjdD10aGlzLl9jbGFtcFRhYkluZGV4KHRoaXMuX2luZGV4VG9TZWxlY3QpO2lmKHRoaXMuX3NlbGVjdGVkSW5kZXghPXQpe2NvbnN0IGU9bnVsbD09dGhpcy5fc2VsZWN0ZWRJbmRleDtpZighZSl7dGhpcy5zZWxlY3RlZFRhYkNoYW5nZS5lbWl0KHRoaXMuX2NyZWF0ZUNoYW5nZUV2ZW50KHQpKTtjb25zdCBlPXRoaXMuX3RhYkJvZHlXcmFwcGVyLm5hdGl2ZUVsZW1lbnQ7ZS5zdHlsZS5taW5IZWlnaHQ9ZS5jbGllbnRIZWlnaHQrInB4In1Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+e3RoaXMuX3RhYnMuZm9yRWFjaCgoKGUsbik9PmUuaXNBY3RpdmU9bj09PXQpKSxlfHwodGhpcy5zZWxlY3RlZEluZGV4Q2hhbmdlLmVtaXQodCksdGhpcy5fdGFiQm9keVdyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS5taW5IZWlnaHQ9IiIpfSkpfXRoaXMuX3RhYnMuZm9yRWFjaCgoKGUsbik9PntlLnBvc2l0aW9uPW4tdCxudWxsPT10aGlzLl9zZWxlY3RlZEluZGV4fHwwIT1lLnBvc2l0aW9ufHxlLm9yaWdpbnx8KGUub3JpZ2luPXQtdGhpcy5fc2VsZWN0ZWRJbmRleCl9KSksdGhpcy5fc2VsZWN0ZWRJbmRleCE9PXQmJih0aGlzLl9zZWxlY3RlZEluZGV4PXQsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpfW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX3N1YnNjcmliZVRvQWxsVGFiQ2hhbmdlcygpLHRoaXMuX3N1YnNjcmliZVRvVGFiTGFiZWxzKCksdGhpcy5fdGFic1N1YnNjcmlwdGlvbj10aGlzLl90YWJzLmNoYW5nZXMuc3Vic2NyaWJlKCgoKT0+e2lmKHRoaXMuX2NsYW1wVGFiSW5kZXgodGhpcy5faW5kZXhUb1NlbGVjdCk9PT10aGlzLl9zZWxlY3RlZEluZGV4KXtjb25zdCB0PXRoaXMuX3RhYnMudG9BcnJheSgpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKHRbZV0uaXNBY3RpdmUpe3RoaXMuX2luZGV4VG9TZWxlY3Q9dGhpcy5fc2VsZWN0ZWRJbmRleD1lO2JyZWFrfX10aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX0pKX1fc3Vic2NyaWJlVG9BbGxUYWJDaGFuZ2VzKCl7dGhpcy5fYWxsVGFicy5jaGFuZ2VzLnBpcGUoTmUodGhpcy5fYWxsVGFicykpLnN1YnNjcmliZSgodD0+e3RoaXMuX3RhYnMucmVzZXQodC5maWx0ZXIoKHQ9PnQuX2Nsb3Nlc3RUYWJHcm91cD09PXRoaXN8fCF0Ll9jbG9zZXN0VGFiR3JvdXApKSksdGhpcy5fdGFicy5ub3RpZnlPbkNoYW5nZXMoKX0pKX1uZ09uRGVzdHJveSgpe3RoaXMuX3RhYnMuZGVzdHJveSgpLHRoaXMuX3RhYnNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl90YWJMYWJlbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpfXJlYWxpZ25JbmtCYXIoKXt0aGlzLl90YWJIZWFkZXImJnRoaXMuX3RhYkhlYWRlci5fYWxpZ25JbmtCYXJUb1NlbGVjdGVkVGFiKCl9Zm9jdXNUYWIodCl7Y29uc3QgZT10aGlzLl90YWJIZWFkZXI7ZSYmKGUuZm9jdXNJbmRleD10KX1fZm9jdXNDaGFuZ2VkKHQpe3RoaXMuZm9jdXNDaGFuZ2UuZW1pdCh0aGlzLl9jcmVhdGVDaGFuZ2VFdmVudCh0KSl9X2NyZWF0ZUNoYW5nZUV2ZW50KHQpe2NvbnN0IGU9bmV3IHpCO3JldHVybiBlLmluZGV4PXQsdGhpcy5fdGFicyYmdGhpcy5fdGFicy5sZW5ndGgmJihlLnRhYj10aGlzLl90YWJzLnRvQXJyYXkoKVt0XSksZX1fc3Vic2NyaWJlVG9UYWJMYWJlbHMoKXt0aGlzLl90YWJMYWJlbFN1YnNjcmlwdGlvbiYmdGhpcy5fdGFiTGFiZWxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl90YWJMYWJlbFN1YnNjcmlwdGlvbj1yZSguLi50aGlzLl90YWJzLm1hcCgodD0+dC5fc3RhdGVDaGFuZ2VzKSkpLnN1YnNjcmliZSgoKCk9PnRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKSl9X2NsYW1wVGFiSW5kZXgodCl7cmV0dXJuIE1hdGgubWluKHRoaXMuX3RhYnMubGVuZ3RoLTEsTWF0aC5tYXgodHx8MCwwKSl9X2dldFRhYkxhYmVsSWQodCl7cmV0dXJuYG1hdC10YWItbGFiZWwtJHt0aGlzLl9ncm91cElkfS0ke3R9YH1fZ2V0VGFiQ29udGVudElkKHQpe3JldHVybmBtYXQtdGFiLWNvbnRlbnQtJHt0aGlzLl9ncm91cElkfS0ke3R9YH1fc2V0VGFiQm9keVdyYXBwZXJIZWlnaHQodCl7aWYoIXRoaXMuX2R5bmFtaWNIZWlnaHR8fCF0aGlzLl90YWJCb2R5V3JhcHBlckhlaWdodClyZXR1cm47Y29uc3QgZT10aGlzLl90YWJCb2R5V3JhcHBlci5uYXRpdmVFbGVtZW50O2Uuc3R5bGUuaGVpZ2h0PXRoaXMuX3RhYkJvZHlXcmFwcGVySGVpZ2h0KyJweCIsdGhpcy5fdGFiQm9keVdyYXBwZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQmJihlLnN0eWxlLmhlaWdodD10KyJweCIpfV9yZW1vdmVUYWJCb2R5V3JhcHBlckhlaWdodCgpe2NvbnN0IHQ9dGhpcy5fdGFiQm9keVdyYXBwZXIubmF0aXZlRWxlbWVudDt0aGlzLl90YWJCb2R5V3JhcHBlckhlaWdodD10LmNsaWVudEhlaWdodCx0LnN0eWxlLmhlaWdodD0iIix0aGlzLmFuaW1hdGlvbkRvbmUuZW1pdCgpfV9oYW5kbGVDbGljayh0LGUsbil7dC5kaXNhYmxlZHx8KHRoaXMuc2VsZWN0ZWRJbmRleD1lLmZvY3VzSW5kZXg9bil9X2dldFRhYkluZGV4KHQsZSl7cmV0dXJuIHQuZGlzYWJsZWQ/bnVsbDp0aGlzLnNlbGVjdGVkSW5kZXg9PT1lPzA6LTF9X3RhYkZvY3VzQ2hhbmdlZCh0LGUpe3QmJiJtb3VzZSIhPT10JiYidG91Y2giIT09dCYmKHRoaXMuX3RhYkhlYWRlci5mb2N1c0luZGV4PWUpfX1IQi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SEIpKFNtKGhnKSxTbShVZyksU20oVEIsOCksU20oVlAsOCkpfSxIQi7JtWRpcj1sbyh7dHlwZTpIQixpbnB1dHM6e2hlYWRlclBvc2l0aW9uOiJoZWFkZXJQb3NpdGlvbiIsYW5pbWF0aW9uRHVyYXRpb246ImFuaW1hdGlvbkR1cmF0aW9uIixkaXNhYmxlUGFnaW5hdGlvbjoiZGlzYWJsZVBhZ2luYXRpb24iLGR5bmFtaWNIZWlnaHQ6ImR5bmFtaWNIZWlnaHQiLGNvbnRlbnRUYWJJbmRleDoiY29udGVudFRhYkluZGV4IixzZWxlY3RlZEluZGV4OiJzZWxlY3RlZEluZGV4IixiYWNrZ3JvdW5kQ29sb3I6ImJhY2tncm91bmRDb2xvciJ9LG91dHB1dHM6e3NlbGVjdGVkSW5kZXhDaGFuZ2U6InNlbGVjdGVkSW5kZXhDaGFuZ2UiLGZvY3VzQ2hhbmdlOiJmb2N1c0NoYW5nZSIsYW5pbWF0aW9uRG9uZToiYW5pbWF0aW9uRG9uZSIsc2VsZWN0ZWRUYWJDaGFuZ2U6InNlbGVjdGVkVGFiQ2hhbmdlIn0sZmVhdHVyZXM6W3hwXX0pLEhCLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOlVnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbVEJdfSx7dHlwZTpTcn1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV0sSEIucHJvcERlY29yYXRvcnM9e2R5bmFtaWNIZWlnaHQ6W3t0eXBlOnh5fV0sc2VsZWN0ZWRJbmRleDpbe3R5cGU6eHl9XSxoZWFkZXJQb3NpdGlvbjpbe3R5cGU6eHl9XSxhbmltYXRpb25EdXJhdGlvbjpbe3R5cGU6eHl9XSxjb250ZW50VGFiSW5kZXg6W3t0eXBlOnh5fV0sZGlzYWJsZVBhZ2luYXRpb246W3t0eXBlOnh5fV0sYmFja2dyb3VuZENvbG9yOlt7dHlwZTp4eX1dLHNlbGVjdGVkSW5kZXhDaGFuZ2U6W3t0eXBlOk95fV0sZm9jdXNDaGFuZ2U6W3t0eXBlOk95fV0sYW5pbWF0aW9uRG9uZTpbe3R5cGU6T3l9XSxzZWxlY3RlZFRhYkNoYW5nZTpbe3R5cGU6T3l9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChIQixbe3R5cGU6Q3l9XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOlVnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbVEJdfSx7dHlwZTpTcn1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV19KSx7aGVhZGVyUG9zaXRpb246W3t0eXBlOnh5fV0sc2VsZWN0ZWRJbmRleENoYW5nZTpbe3R5cGU6T3l9XSxmb2N1c0NoYW5nZTpbe3R5cGU6T3l9XSxhbmltYXRpb25Eb25lOlt7dHlwZTpPeX1dLHNlbGVjdGVkVGFiQ2hhbmdlOlt7dHlwZTpPeX1dLGFuaW1hdGlvbkR1cmF0aW9uOlt7dHlwZTp4eX1dLGRpc2FibGVQYWdpbmF0aW9uOlt7dHlwZTp4eX1dLGR5bmFtaWNIZWlnaHQ6W3t0eXBlOnh5fV0sY29udGVudFRhYkluZGV4Olt7dHlwZTp4eX1dLHNlbGVjdGVkSW5kZXg6W3t0eXBlOnh5fV0sYmFja2dyb3VuZENvbG9yOlt7dHlwZTp4eX1dfSk7Y2xhc3MgRkIgZXh0ZW5kcyBIQntjb25zdHJ1Y3Rvcih0LGUsbixvKXtzdXBlcih0LGUsbixvKX19RkIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEZCKShTbShoZyksU20oVWcpLFNtKFRCLDgpLFNtKFZQLDgpKX0sRkIuybVjbXA9dG8oe3R5cGU6RkIsc2VsZWN0b3JzOltbIm1hdC10YWItZ3JvdXAiXV0sY29udGVudFF1ZXJpZXM6ZnVuY3Rpb24gdChlLG4sbyl7aWYoMSZlJiYkaChvLFNCLDUpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uX2FsbFRhYnM9dCl9fSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmKFFoKGxCLDUpLFFoKGNCLDUpKSwyJmUpe2xldCB0O0poKHQ9dGIoKSkmJihuLl90YWJCb2R5V3JhcHBlcj10LmZpcnN0KSxKaCh0PXRiKCkpJiYobi5fdGFiSGVhZGVyPXQuZmlyc3QpfX0saG9zdEF0dHJzOlsxLCJtYXQtdGFiLWdyb3VwIl0saG9zdFZhcnM6NCxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmcHUoIm1hdC10YWItZ3JvdXAtZHluYW1pYy1oZWlnaHQiLG4uZHluYW1pY0hlaWdodCkoIm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIiwiYmVsb3ciPT09bi5oZWFkZXJQb3NpdGlvbil9LGlucHV0czp7Y29sb3I6ImNvbG9yIixkaXNhYmxlUmlwcGxlOiJkaXNhYmxlUmlwcGxlIn0sZXhwb3J0QXM6WyJtYXRUYWJHcm91cCJdLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6a0IsdXNlRXhpc3Rpbmc6RkJ9XSkseHBdLGRlY2xzOjYsdmFyczo3LGNvbnN0czpbWzMsInNlbGVjdGVkSW5kZXgiLCJkaXNhYmxlUmlwcGxlIiwiZGlzYWJsZVBhZ2luYXRpb24iLCJpbmRleEZvY3VzZWQiLCJzZWxlY3RGb2N1c2VkSW5kZXgiXSxbInRhYkhlYWRlciIsIiJdLFsiY2xhc3MiLCJtYXQtdGFiLWxhYmVsIG1hdC1mb2N1cy1pbmRpY2F0b3IiLCJyb2xlIiwidGFiIiwibWF0VGFiTGFiZWxXcmFwcGVyIiwiIiwibWF0LXJpcHBsZSIsIiIsImNka01vbml0b3JFbGVtZW50Rm9jdXMiLCIiLDMsImlkIiwibWF0LXRhYi1sYWJlbC1hY3RpdmUiLCJkaXNhYmxlZCIsIm1hdFJpcHBsZURpc2FibGVkIiwiY2xpY2siLCJjZGtGb2N1c0NoYW5nZSIsNCwibmdGb3IiLCJuZ0Zvck9mIl0sWzEsIm1hdC10YWItYm9keS13cmFwcGVyIl0sWyJ0YWJCb2R5V3JhcHBlciIsIiJdLFsicm9sZSIsInRhYnBhbmVsIiwzLCJpZCIsIm1hdC10YWItYm9keS1hY3RpdmUiLCJjb250ZW50IiwicG9zaXRpb24iLCJvcmlnaW4iLCJhbmltYXRpb25EdXJhdGlvbiIsIl9vbkNlbnRlcmVkIiwiX29uQ2VudGVyaW5nIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbInJvbGUiLCJ0YWIiLCJtYXRUYWJMYWJlbFdyYXBwZXIiLCIiLCJtYXQtcmlwcGxlIiwiIiwiY2RrTW9uaXRvckVsZW1lbnRGb2N1cyIsIiIsMSwibWF0LXRhYi1sYWJlbCIsIm1hdC1mb2N1cy1pbmRpY2F0b3IiLDMsImlkIiwiZGlzYWJsZWQiLCJtYXRSaXBwbGVEaXNhYmxlZCIsImNsaWNrIiwiY2RrRm9jdXNDaGFuZ2UiXSxbMSwibWF0LXRhYi1sYWJlbC1jb250ZW50Il0sWzMsIm5nSWYiXSxbMywiY2RrUG9ydGFsT3V0bGV0Il0sWyJyb2xlIiwidGFicGFuZWwiLDMsImlkIiwiY29udGVudCIsInBvc2l0aW9uIiwib3JpZ2luIiwiYW5pbWF0aW9uRHVyYXRpb24iLCJfb25DZW50ZXJlZCIsIl9vbkNlbnRlcmluZyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwibWF0LXRhYi1oZWFkZXIiLDAsMSksVm0oImluZGV4Rm9jdXNlZCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX2ZvY3VzQ2hhbmdlZChlKX0pKSgic2VsZWN0Rm9jdXNlZEluZGV4IiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5zZWxlY3RlZEluZGV4PWV9KSksUXAoMix1Qiw0LDE0LCJkaXYiLDIpLEFtKCksUm0oMywiZGl2IiwzLDQpLFFwKDUsZkIsMSw5LCJtYXQtdGFiLWJvZHkiLDUpLEFtKCkpLDImZSYmKERtKCJzZWxlY3RlZEluZGV4IixuLnNlbGVjdGVkSW5kZXh8fDApKCJkaXNhYmxlUmlwcGxlIixuLmRpc2FibGVSaXBwbGUpKCJkaXNhYmxlUGFnaW5hdGlvbiIsbi5kaXNhYmxlUGFnaW5hdGlvbikscmMoMiksRG0oIm5nRm9yT2YiLG4uX3RhYnMpLHJjKDEpLHB1KCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsIk5vb3BBbmltYXRpb25zIj09PW4uX2FuaW1hdGlvbk1vZGUpLHJjKDIpLERtKCJuZ0Zvck9mIixuLl90YWJzKSl9LGRpcmVjdGl2ZXM6ZnVuY3Rpb24oKXtyZXR1cm5bR0IsbE0sQkIsa0gsREksZE0sREYsQUJdfSxzdHlsZXM6WyIubWF0LXRhYi1ncm91cHtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21heC13aWR0aDoxMDAlfS5tYXQtdGFiLWdyb3VwLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVye2ZsZXgtZGlyZWN0aW9uOmNvbHVtbi1yZXZlcnNlfS5tYXQtdGFiLWxhYmVse2hlaWdodDo0OHB4O3BhZGRpbmc6MCAyNHB4O2N1cnNvcjpwb2ludGVyO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvcGFjaXR5Oi42O21pbi13aWR0aDoxNjBweDt0ZXh0LWFsaWduOmNlbnRlcjtkaXNwbGF5OmlubGluZS1mbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcDtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXRhYi1sYWJlbDpmb2N1c3tvdXRsaW5lOm5vbmV9Lm1hdC10YWItbGFiZWw6Zm9jdXM6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXRhYi1sYWJlbDpmb2N1c3tvdXRsaW5lOmRvdHRlZCAycHg7b3V0bGluZS1vZmZzZXQ6LTJweH0ubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZHtvcGFjaXR5Oi41fS5tYXQtdGFiLWxhYmVsIC5tYXQtdGFiLWxhYmVsLWNvbnRlbnR7ZGlzcGxheTppbmxpbmUtZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXB9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXRhYi1sYWJlbHtvcGFjaXR5OjF9QG1lZGlhKG1heC13aWR0aDogNTk5cHgpey5tYXQtdGFiLWxhYmVse3BhZGRpbmc6MCAxMnB4fX1AbWVkaWEobWF4LXdpZHRoOiA5NTlweCl7Lm1hdC10YWItbGFiZWx7cGFkZGluZzowIDEycHh9fS5tYXQtdGFiLWdyb3VwW21hdC1zdHJldGNoLXRhYnNdPi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbHtmbGV4LWJhc2lzOjA7ZmxleC1ncm93OjF9Lm1hdC10YWItYm9keS13cmFwcGVye3Bvc2l0aW9uOnJlbGF0aXZlO292ZXJmbG93OmhpZGRlbjtkaXNwbGF5OmZsZXg7dHJhbnNpdGlvbjpoZWlnaHQgNTAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtdGFiLWJvZHktd3JhcHBlcnt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC10YWItYm9keXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmJsb2NrO292ZXJmbG93OmhpZGRlbjtvdXRsaW5lOjA7ZmxleC1iYXNpczoxMDAlfS5tYXQtdGFiLWJvZHkubWF0LXRhYi1ib2R5LWFjdGl2ZXtwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87ei1pbmRleDoxO2ZsZXgtZ3JvdzoxfS5tYXQtdGFiLWdyb3VwLm1hdC10YWItZ3JvdXAtZHluYW1pYy1oZWlnaHQgLm1hdC10YWItYm9keS5tYXQtdGFiLWJvZHktYWN0aXZle292ZXJmbG93LXk6aGlkZGVufVxuIl0sZW5jYXBzdWxhdGlvbjoyfSksRkIuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ30se3R5cGU6VWd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltUQl19LHt0eXBlOlNyfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19XSxGQi5wcm9wRGVjb3JhdG9ycz17X2FsbFRhYnM6W3t0eXBlOllhLGFyZ3M6W1NCLHtkZXNjZW5kYW50czohMH1dfV0sX3RhYkJvZHlXcmFwcGVyOlt7dHlwZTpaYSxhcmdzOlsidGFiQm9keVdyYXBwZXIiXX1dLF90YWJIZWFkZXI6W3t0eXBlOlphLGFyZ3M6WyJ0YWJIZWFkZXIiXX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEZCLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC10YWItZ3JvdXAiLGV4cG9ydEFzOiJtYXRUYWJHcm91cCIsdGVtcGxhdGU6JzxtYXQtdGFiLWhlYWRlciAjdGFiSGVhZGVyXG4gICAgICAgICAgICAgICBbc2VsZWN0ZWRJbmRleF09InNlbGVjdGVkSW5kZXggfHwgMCJcbiAgICAgICAgICAgICAgIFtkaXNhYmxlUmlwcGxlXT0iZGlzYWJsZVJpcHBsZSJcbiAgICAgICAgICAgICAgIFtkaXNhYmxlUGFnaW5hdGlvbl09ImRpc2FibGVQYWdpbmF0aW9uIlxuICAgICAgICAgICAgICAgKGluZGV4Rm9jdXNlZCk9Il9mb2N1c0NoYW5nZWQoJGV2ZW50KSJcbiAgICAgICAgICAgICAgIChzZWxlY3RGb2N1c2VkSW5kZXgpPSJzZWxlY3RlZEluZGV4ID0gJGV2ZW50Ij5cbiAgPGRpdiBjbGFzcz0ibWF0LXRhYi1sYWJlbCBtYXQtZm9jdXMtaW5kaWNhdG9yIiByb2xlPSJ0YWIiIG1hdFRhYkxhYmVsV3JhcHBlciBtYXQtcmlwcGxlIGNka01vbml0b3JFbGVtZW50Rm9jdXNcbiAgICAgICAqbmdGb3I9ImxldCB0YWIgb2YgX3RhYnM7IGxldCBpID0gaW5kZXgiXG4gICAgICAgW2lkXT0iX2dldFRhYkxhYmVsSWQoaSkiXG4gICAgICAgW2F0dHIudGFiSW5kZXhdPSJfZ2V0VGFiSW5kZXgodGFiLCBpKSJcbiAgICAgICBbYXR0ci5hcmlhLXBvc2luc2V0XT0iaSArIDEiXG4gICAgICAgW2F0dHIuYXJpYS1zZXRzaXplXT0iX3RhYnMubGVuZ3RoIlxuICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPSJfZ2V0VGFiQ29udGVudElkKGkpIlxuICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPSJzZWxlY3RlZEluZGV4ID09IGkiXG4gICAgICAgW2F0dHIuYXJpYS1sYWJlbF09InRhYi5hcmlhTGFiZWwgfHwgbnVsbCJcbiAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPSIoIXRhYi5hcmlhTGFiZWwgJiYgdGFiLmFyaWFMYWJlbGxlZGJ5KSA/IHRhYi5hcmlhTGFiZWxsZWRieSA6IG51bGwiXG4gICAgICAgW2NsYXNzLm1hdC10YWItbGFiZWwtYWN0aXZlXT0ic2VsZWN0ZWRJbmRleCA9PSBpIlxuICAgICAgIFtkaXNhYmxlZF09InRhYi5kaXNhYmxlZCJcbiAgICAgICBbbWF0UmlwcGxlRGlzYWJsZWRdPSJ0YWIuZGlzYWJsZWQgfHwgZGlzYWJsZVJpcHBsZSJcbiAgICAgICAoY2xpY2spPSJfaGFuZGxlQ2xpY2sodGFiLCB0YWJIZWFkZXIsIGkpIlxuICAgICAgIChjZGtGb2N1c0NoYW5nZSk9Il90YWJGb2N1c0NoYW5nZWQoJGV2ZW50LCBpKSI+XG5cblxuICAgIDxkaXYgY2xhc3M9Im1hdC10YWItbGFiZWwtY29udGVudCI+XG4gICAgICBceDNjIS0tIElmIHRoZXJlIGlzIGEgbGFiZWwgdGVtcGxhdGUsIHVzZSBpdC4gLS1ceDNlXG4gICAgICA8bmctdGVtcGxhdGUgW25nSWZdPSJ0YWIudGVtcGxhdGVMYWJlbCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbY2RrUG9ydGFsT3V0bGV0XT0idGFiLnRlbXBsYXRlTGFiZWwiPjwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICBceDNjIS0tIElmIHRoZXJlIGlzIG5vdCBhIGxhYmVsIHRlbXBsYXRlLCBmYWxsIGJhY2sgdG8gdGhlIHRleHQgbGFiZWwuIC0tXHgzZVxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT0iIXRhYi50ZW1wbGF0ZUxhYmVsIj57e3RhYi50ZXh0TGFiZWx9fTwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9tYXQtdGFiLWhlYWRlcj5cblxuPGRpdlxuICBjbGFzcz0ibWF0LXRhYi1ib2R5LXdyYXBwZXIiXG4gIFtjbGFzcy5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZV09Il9hbmltYXRpb25Nb2RlID09PSBcJ05vb3BBbmltYXRpb25zXCciXG4gICN0YWJCb2R5V3JhcHBlcj5cbiAgPG1hdC10YWItYm9keSByb2xlPSJ0YWJwYW5lbCJcbiAgICAgICAgICAgICAgICpuZ0Zvcj0ibGV0IHRhYiBvZiBfdGFiczsgbGV0IGkgPSBpbmRleCJcbiAgICAgICAgICAgICAgIFtpZF09Il9nZXRUYWJDb250ZW50SWQoaSkiXG4gICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09Iihjb250ZW50VGFiSW5kZXggIT0gbnVsbCAmJiBzZWxlY3RlZEluZGV4ID09PSBpKSA/IGNvbnRlbnRUYWJJbmRleCA6IG51bGwiXG4gICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPSJfZ2V0VGFiTGFiZWxJZChpKSJcbiAgICAgICAgICAgICAgIFtjbGFzcy5tYXQtdGFiLWJvZHktYWN0aXZlXT0ic2VsZWN0ZWRJbmRleCA9PT0gaSJcbiAgICAgICAgICAgICAgIFtjb250ZW50XT0idGFiLmNvbnRlbnQhIlxuICAgICAgICAgICAgICAgW3Bvc2l0aW9uXT0idGFiLnBvc2l0aW9uISJcbiAgICAgICAgICAgICAgIFtvcmlnaW5dPSJ0YWIub3JpZ2luIlxuICAgICAgICAgICAgICAgW2FuaW1hdGlvbkR1cmF0aW9uXT0iYW5pbWF0aW9uRHVyYXRpb24iXG4gICAgICAgICAgICAgICAoX29uQ2VudGVyZWQpPSJfcmVtb3ZlVGFiQm9keVdyYXBwZXJIZWlnaHQoKSJcbiAgICAgICAgICAgICAgIChfb25DZW50ZXJpbmcpPSJfc2V0VGFiQm9keVdyYXBwZXJIZWlnaHQoJGV2ZW50KSI+XG4gIDwvbWF0LXRhYi1ib2R5PlxuPC9kaXY+XG4nLGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uRGVmYXVsdCxpbnB1dHM6WyJjb2xvciIsImRpc2FibGVSaXBwbGUiXSxwcm92aWRlcnM6W3twcm92aWRlOmtCLHVzZUV4aXN0aW5nOkZCfV0saG9zdDp7Y2xhc3M6Im1hdC10YWItZ3JvdXAiLCJbY2xhc3MubWF0LXRhYi1ncm91cC1keW5hbWljLWhlaWdodF0iOiJkeW5hbWljSGVpZ2h0IiwiW2NsYXNzLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyXSI6J2hlYWRlclBvc2l0aW9uID09PSAiYmVsb3ciJ30sc3R5bGVzOlsiLm1hdC10YWItZ3JvdXB7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttYXgtd2lkdGg6MTAwJX0ubWF0LXRhYi1ncm91cC5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcntmbGV4LWRpcmVjdGlvbjpjb2x1bW4tcmV2ZXJzZX0ubWF0LXRhYi1sYWJlbHtoZWlnaHQ6NDhweDtwYWRkaW5nOjAgMjRweDtjdXJzb3I6cG9pbnRlcjtib3gtc2l6aW5nOmJvcmRlci1ib3g7b3BhY2l0eTouNjttaW4td2lkdGg6MTYwcHg7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXA7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC10YWItbGFiZWw6Zm9jdXN7b3V0bGluZTpub25lfS5tYXQtdGFiLWxhYmVsOmZvY3VzOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10YWItbGFiZWw6Zm9jdXN7b3V0bGluZTpkb3R0ZWQgMnB4O291dGxpbmUtb2Zmc2V0Oi0ycHh9Lm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWR7b3BhY2l0eTouNX0ubWF0LXRhYi1sYWJlbCAubWF0LXRhYi1sYWJlbC1jb250ZW50e2Rpc3BsYXk6aW5saW5lLWZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10YWItbGFiZWx7b3BhY2l0eToxfUBtZWRpYShtYXgtd2lkdGg6IDU5OXB4KXsubWF0LXRhYi1sYWJlbHtwYWRkaW5nOjAgMTJweH19QG1lZGlhKG1heC13aWR0aDogOTU5cHgpey5tYXQtdGFiLWxhYmVse3BhZGRpbmc6MCAxMnB4fX0ubWF0LXRhYi1ncm91cFttYXQtc3RyZXRjaC10YWJzXT4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWx7ZmxleC1iYXNpczowO2ZsZXgtZ3JvdzoxfS5tYXQtdGFiLWJvZHktd3JhcHBlcntwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzpoaWRkZW47ZGlzcGxheTpmbGV4O3RyYW5zaXRpb246aGVpZ2h0IDUwMG1zIGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXRhYi1ib2R5LXdyYXBwZXJ7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtdGFiLWJvZHl7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpibG9jaztvdmVyZmxvdzpoaWRkZW47b3V0bGluZTowO2ZsZXgtYmFzaXM6MTAwJX0ubWF0LXRhYi1ib2R5Lm1hdC10YWItYm9keS1hY3RpdmV7cG9zaXRpb246cmVsYXRpdmU7b3ZlcmZsb3cteDpoaWRkZW47b3ZlcmZsb3cteTphdXRvO3otaW5kZXg6MTtmbGV4LWdyb3c6MX0ubWF0LXRhYi1ncm91cC5tYXQtdGFiLWdyb3VwLWR5bmFtaWMtaGVpZ2h0IC5tYXQtdGFiLWJvZHkubWF0LXRhYi1ib2R5LWFjdGl2ZXtvdmVyZmxvdy15OmhpZGRlbn1cbiJdfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOlVnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbVEJdfSx7dHlwZTpTcn1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV19KSx7X2FsbFRhYnM6W3t0eXBlOllhLGFyZ3M6W1NCLHtkZXNjZW5kYW50czohMH1dfV0sX3RhYkJvZHlXcmFwcGVyOlt7dHlwZTpaYSxhcmdzOlsidGFiQm9keVdyYXBwZXIiXX1dLF90YWJIZWFkZXI6W3t0eXBlOlphLGFyZ3M6WyJ0YWJIZWFkZXIiXX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBMQj1LSShjbGFzc3t9KTtjbGFzcyBCQiBleHRlbmRzIExCe2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5lbGVtZW50UmVmPXR9Zm9jdXMoKXt0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpfWdldE9mZnNldExlZnQoKXtyZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdH1nZXRPZmZzZXRXaWR0aCgpe3JldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aH19QkIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEJCKShTbShoZykpfSxCQi7JtWRpcj1sbyh7dHlwZTpCQixzZWxlY3RvcnM6W1siIiwibWF0VGFiTGFiZWxXcmFwcGVyIiwiIl1dLGhvc3RWYXJzOjMsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJihqcCgiYXJpYS1kaXNhYmxlZCIsISFuLmRpc2FibGVkKSxwdSgibWF0LXRhYi1kaXNhYmxlZCIsbi5kaXNhYmxlZCkpfSxpbnB1dHM6e2Rpc2FibGVkOiJkaXNhYmxlZCJ9LGZlYXR1cmVzOlt4cF19KSxCQi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChCQixbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbWF0VGFiTGFiZWxXcmFwcGVyXSIsaW5wdXRzOlsiZGlzYWJsZWQiXSxob3N0OnsiW2NsYXNzLm1hdC10YWItZGlzYWJsZWRdIjoiZGlzYWJsZWQiLCJbYXR0ci5hcmlhLWRpc2FibGVkXSI6IiEhZGlzYWJsZWQifX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IFZCPU56KHtwYXNzaXZlOiEwfSk7Y2xhc3MgakJ7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEscil7dGhpcy5fZWxlbWVudFJlZj10LHRoaXMuX2NoYW5nZURldGVjdG9yUmVmPWUsdGhpcy5fdmlld3BvcnRSdWxlcj1uLHRoaXMuX2Rpcj1vLHRoaXMuX25nWm9uZT1pLHRoaXMuX3BsYXRmb3JtPWEsdGhpcy5fYW5pbWF0aW9uTW9kZT1yLHRoaXMuX3Njcm9sbERpc3RhbmNlPTAsdGhpcy5fc2VsZWN0ZWRJbmRleENoYW5nZWQ9ITEsdGhpcy5fZGVzdHJveWVkPW5ldyBJLHRoaXMuX3Nob3dQYWdpbmF0aW9uQ29udHJvbHM9ITEsdGhpcy5fZGlzYWJsZVNjcm9sbEFmdGVyPSEwLHRoaXMuX2Rpc2FibGVTY3JvbGxCZWZvcmU9ITAsdGhpcy5fc3RvcFNjcm9sbGluZz1uZXcgSSx0aGlzLmRpc2FibGVQYWdpbmF0aW9uPSExLHRoaXMuX3NlbGVjdGVkSW5kZXg9MCx0aGlzLnNlbGVjdEZvY3VzZWRJbmRleD1uZXcgTGgsdGhpcy5pbmRleEZvY3VzZWQ9bmV3IExoLGkucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT57b2UodC5uYXRpdmVFbGVtZW50LCJtb3VzZWxlYXZlIikucGlwZShJZSh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fc3RvcEludGVydmFsKCl9KSl9KSl9Z2V0IHNlbGVjdGVkSW5kZXgoKXtyZXR1cm4gdGhpcy5fc2VsZWN0ZWRJbmRleH1zZXQgc2VsZWN0ZWRJbmRleCh0KXt0PV96KHQpLHRoaXMuX3NlbGVjdGVkSW5kZXghPXQmJih0aGlzLl9zZWxlY3RlZEluZGV4Q2hhbmdlZD0hMCx0aGlzLl9zZWxlY3RlZEluZGV4PXQsdGhpcy5fa2V5TWFuYWdlciYmdGhpcy5fa2V5TWFuYWdlci51cGRhdGVBY3RpdmVJdGVtKHQpKX1uZ0FmdGVyVmlld0luaXQoKXtvZSh0aGlzLl9wcmV2aW91c1BhZ2luYXRvci5uYXRpdmVFbGVtZW50LCJ0b3VjaHN0YXJ0IixWQikucGlwZShJZSh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5faGFuZGxlUGFnaW5hdG9yUHJlc3MoImJlZm9yZSIpfSkpLG9lKHRoaXMuX25leHRQYWdpbmF0b3IubmF0aXZlRWxlbWVudCwidG91Y2hzdGFydCIsVkIpLnBpcGUoSWUodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgoKT0+e3RoaXMuX2hhbmRsZVBhZ2luYXRvclByZXNzKCJhZnRlciIpfSkpfW5nQWZ0ZXJDb250ZW50SW5pdCgpe2NvbnN0IHQ9dGhpcy5fZGlyP3RoaXMuX2Rpci5jaGFuZ2U6RXQoImx0ciIpLGU9dGhpcy5fdmlld3BvcnRSdWxlci5jaGFuZ2UoMTUwKSxuPSgpPT57dGhpcy51cGRhdGVQYWdpbmF0aW9uKCksdGhpcy5fYWxpZ25JbmtCYXJUb1NlbGVjdGVkVGFiKCl9O3RoaXMuX2tleU1hbmFnZXI9bmV3IGVJKHRoaXMuX2l0ZW1zKS53aXRoSG9yaXpvbnRhbE9yaWVudGF0aW9uKHRoaXMuX2dldExheW91dERpcmVjdGlvbigpKS53aXRoSG9tZUFuZEVuZCgpLndpdGhXcmFwKCksdGhpcy5fa2V5TWFuYWdlci51cGRhdGVBY3RpdmVJdGVtKHRoaXMuX3NlbGVjdGVkSW5kZXgpLCJ1bmRlZmluZWQiIT10eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lP3JlcXVlc3RBbmltYXRpb25GcmFtZShuKTpuKCkscmUodCxlLHRoaXMuX2l0ZW1zLmNoYW5nZXMpLnBpcGUoSWUodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgoKT0+e3RoaXMuX25nWm9uZS5ydW4oKCgpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKG4pKSksdGhpcy5fa2V5TWFuYWdlci53aXRoSG9yaXpvbnRhbE9yaWVudGF0aW9uKHRoaXMuX2dldExheW91dERpcmVjdGlvbigpKX0pKSx0aGlzLl9rZXlNYW5hZ2VyLmNoYW5nZS5waXBlKEllKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgodD0+e3RoaXMuaW5kZXhGb2N1c2VkLmVtaXQodCksdGhpcy5fc2V0VGFiRm9jdXModCl9KSl9bmdBZnRlckNvbnRlbnRDaGVja2VkKCl7dGhpcy5fdGFiTGFiZWxDb3VudCE9dGhpcy5faXRlbXMubGVuZ3RoJiYodGhpcy51cGRhdGVQYWdpbmF0aW9uKCksdGhpcy5fdGFiTGFiZWxDb3VudD10aGlzLl9pdGVtcy5sZW5ndGgsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpLHRoaXMuX3NlbGVjdGVkSW5kZXhDaGFuZ2VkJiYodGhpcy5fc2Nyb2xsVG9MYWJlbCh0aGlzLl9zZWxlY3RlZEluZGV4KSx0aGlzLl9jaGVja1Njcm9sbGluZ0NvbnRyb2xzKCksdGhpcy5fYWxpZ25JbmtCYXJUb1NlbGVjdGVkVGFiKCksdGhpcy5fc2VsZWN0ZWRJbmRleENoYW5nZWQ9ITEsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpLHRoaXMuX3Njcm9sbERpc3RhbmNlQ2hhbmdlZCYmKHRoaXMuX3VwZGF0ZVRhYlNjcm9sbFBvc2l0aW9uKCksdGhpcy5fc2Nyb2xsRGlzdGFuY2VDaGFuZ2VkPSExLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKX1uZ09uRGVzdHJveSgpe3RoaXMuX2Rlc3Ryb3llZC5uZXh0KCksdGhpcy5fZGVzdHJveWVkLmNvbXBsZXRlKCksdGhpcy5fc3RvcFNjcm9sbGluZy5jb21wbGV0ZSgpfV9oYW5kbGVLZXlkb3duKHQpe2lmKCFieih0KSlzd2l0Y2godC5rZXlDb2RlKXtjYXNlIG16OmNhc2UgZno6dGhpcy5mb2N1c0luZGV4IT09dGhpcy5zZWxlY3RlZEluZGV4JiYodGhpcy5zZWxlY3RGb2N1c2VkSW5kZXguZW1pdCh0aGlzLmZvY3VzSW5kZXgpLHRoaXMuX2l0ZW1TZWxlY3RlZCh0KSk7YnJlYWs7ZGVmYXVsdDp0aGlzLl9rZXlNYW5hZ2VyLm9uS2V5ZG93bih0KX19X29uQ29udGVudENoYW5nZXMoKXtjb25zdCB0PXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC50ZXh0Q29udGVudDt0IT09dGhpcy5fY3VycmVudFRleHRDb250ZW50JiYodGhpcy5fY3VycmVudFRleHRDb250ZW50PXR8fCIiLHRoaXMuX25nWm9uZS5ydW4oKCgpPT57dGhpcy51cGRhdGVQYWdpbmF0aW9uKCksdGhpcy5fYWxpZ25JbmtCYXJUb1NlbGVjdGVkVGFiKCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9KSkpfXVwZGF0ZVBhZ2luYXRpb24oKXt0aGlzLl9jaGVja1BhZ2luYXRpb25FbmFibGVkKCksdGhpcy5fY2hlY2tTY3JvbGxpbmdDb250cm9scygpLHRoaXMuX3VwZGF0ZVRhYlNjcm9sbFBvc2l0aW9uKCl9Z2V0IGZvY3VzSW5kZXgoKXtyZXR1cm4gdGhpcy5fa2V5TWFuYWdlcj90aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW1JbmRleDowfXNldCBmb2N1c0luZGV4KHQpe3RoaXMuX2lzVmFsaWRJbmRleCh0KSYmdGhpcy5mb2N1c0luZGV4IT09dCYmdGhpcy5fa2V5TWFuYWdlciYmdGhpcy5fa2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKHQpfV9pc1ZhbGlkSW5kZXgodCl7aWYoIXRoaXMuX2l0ZW1zKXJldHVybiEwO2NvbnN0IGU9dGhpcy5faXRlbXM/dGhpcy5faXRlbXMudG9BcnJheSgpW3RdOm51bGw7cmV0dXJuISFlJiYhZS5kaXNhYmxlZH1fc2V0VGFiRm9jdXModCl7aWYodGhpcy5fc2hvd1BhZ2luYXRpb25Db250cm9scyYmdGhpcy5fc2Nyb2xsVG9MYWJlbCh0KSx0aGlzLl9pdGVtcyYmdGhpcy5faXRlbXMubGVuZ3RoKXt0aGlzLl9pdGVtcy50b0FycmF5KClbdF0uZm9jdXMoKTtjb25zdCBlPXRoaXMuX3RhYkxpc3RDb250YWluZXIubmF0aXZlRWxlbWVudCxuPXRoaXMuX2dldExheW91dERpcmVjdGlvbigpO2Uuc2Nyb2xsTGVmdD0ibHRyIj09bj8wOmUuc2Nyb2xsV2lkdGgtZS5vZmZzZXRXaWR0aH19X2dldExheW91dERpcmVjdGlvbigpe3JldHVybiB0aGlzLl9kaXImJiJydGwiPT09dGhpcy5fZGlyLnZhbHVlPyJydGwiOiJsdHIifV91cGRhdGVUYWJTY3JvbGxQb3NpdGlvbigpe2lmKHRoaXMuZGlzYWJsZVBhZ2luYXRpb24pcmV0dXJuO2NvbnN0IHQ9dGhpcy5zY3JvbGxEaXN0YW5jZSxlPSJsdHIiPT09dGhpcy5fZ2V0TGF5b3V0RGlyZWN0aW9uKCk/LXQ6dDt0aGlzLl90YWJMaXN0Lm5hdGl2ZUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtPWB0cmFuc2xhdGVYKCR7TWF0aC5yb3VuZChlKX1weClgLCh0aGlzLl9wbGF0Zm9ybS5UUklERU5UfHx0aGlzLl9wbGF0Zm9ybS5FREdFKSYmKHRoaXMuX3RhYkxpc3RDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0PTApfWdldCBzY3JvbGxEaXN0YW5jZSgpe3JldHVybiB0aGlzLl9zY3JvbGxEaXN0YW5jZX1zZXQgc2Nyb2xsRGlzdGFuY2UodCl7dGhpcy5fc2Nyb2xsVG8odCl9X3Njcm9sbEhlYWRlcih0KXtyZXR1cm4gdGhpcy5fc2Nyb2xsVG8odGhpcy5fc2Nyb2xsRGlzdGFuY2UrKCJiZWZvcmUiPT10Py0xOjEpKnRoaXMuX3RhYkxpc3RDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aC8zKX1faGFuZGxlUGFnaW5hdG9yQ2xpY2sodCl7dGhpcy5fc3RvcEludGVydmFsKCksdGhpcy5fc2Nyb2xsSGVhZGVyKHQpfV9zY3JvbGxUb0xhYmVsKHQpe2lmKHRoaXMuZGlzYWJsZVBhZ2luYXRpb24pcmV0dXJuO2NvbnN0IGU9dGhpcy5faXRlbXM/dGhpcy5faXRlbXMudG9BcnJheSgpW3RdOm51bGw7aWYoIWUpcmV0dXJuO2NvbnN0IG49dGhpcy5fdGFiTGlzdENvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoLHtvZmZzZXRMZWZ0Om8sb2Zmc2V0V2lkdGg6aX09ZS5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7bGV0IGEscjsibHRyIj09dGhpcy5fZ2V0TGF5b3V0RGlyZWN0aW9uKCk/KGE9byxyPWEraSk6KHI9dGhpcy5fdGFiTGlzdC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoLW8sYT1yLWkpO2NvbnN0IHM9dGhpcy5zY3JvbGxEaXN0YW5jZSxsPXRoaXMuc2Nyb2xsRGlzdGFuY2UrbjthPHM/dGhpcy5zY3JvbGxEaXN0YW5jZS09cy1hKzYwOnI+bCYmKHRoaXMuc2Nyb2xsRGlzdGFuY2UrPXItbCs2MCl9X2NoZWNrUGFnaW5hdGlvbkVuYWJsZWQoKXtpZih0aGlzLmRpc2FibGVQYWdpbmF0aW9uKXRoaXMuX3Nob3dQYWdpbmF0aW9uQ29udHJvbHM9ITE7ZWxzZXtjb25zdCB0PXRoaXMuX3RhYkxpc3QubmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aD50aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7dHx8KHRoaXMuc2Nyb2xsRGlzdGFuY2U9MCksdCE9PXRoaXMuX3Nob3dQYWdpbmF0aW9uQ29udHJvbHMmJnRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpLHRoaXMuX3Nob3dQYWdpbmF0aW9uQ29udHJvbHM9dH19X2NoZWNrU2Nyb2xsaW5nQ29udHJvbHMoKXt0aGlzLmRpc2FibGVQYWdpbmF0aW9uP3RoaXMuX2Rpc2FibGVTY3JvbGxBZnRlcj10aGlzLl9kaXNhYmxlU2Nyb2xsQmVmb3JlPSEwOih0aGlzLl9kaXNhYmxlU2Nyb2xsQmVmb3JlPTA9PXRoaXMuc2Nyb2xsRGlzdGFuY2UsdGhpcy5fZGlzYWJsZVNjcm9sbEFmdGVyPXRoaXMuc2Nyb2xsRGlzdGFuY2U9PXRoaXMuX2dldE1heFNjcm9sbERpc3RhbmNlKCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpfV9nZXRNYXhTY3JvbGxEaXN0YW5jZSgpe3JldHVybiB0aGlzLl90YWJMaXN0Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGgtdGhpcy5fdGFiTGlzdENvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRofHwwfV9hbGlnbklua0JhclRvU2VsZWN0ZWRUYWIoKXtjb25zdCB0PXRoaXMuX2l0ZW1zJiZ0aGlzLl9pdGVtcy5sZW5ndGg/dGhpcy5faXRlbXMudG9BcnJheSgpW3RoaXMuc2VsZWN0ZWRJbmRleF06bnVsbCxlPXQ/dC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ6bnVsbDtlP3RoaXMuX2lua0Jhci5hbGlnblRvRWxlbWVudChlKTp0aGlzLl9pbmtCYXIuaGlkZSgpfV9zdG9wSW50ZXJ2YWwoKXt0aGlzLl9zdG9wU2Nyb2xsaW5nLm5leHQoKX1faGFuZGxlUGFnaW5hdG9yUHJlc3ModCxlKXtlJiZudWxsIT1lLmJ1dHRvbiYmMCE9PWUuYnV0dG9ufHwodGhpcy5fc3RvcEludGVydmFsKCksYWUoNjUwLDEwMCkucGlwZShJZShyZSh0aGlzLl9zdG9wU2Nyb2xsaW5nLHRoaXMuX2Rlc3Ryb3llZCkpKS5zdWJzY3JpYmUoKCgpPT57Y29uc3R7bWF4U2Nyb2xsRGlzdGFuY2U6ZSxkaXN0YW5jZTpufT10aGlzLl9zY3JvbGxIZWFkZXIodCk7KDA9PT1ufHxuPj1lKSYmdGhpcy5fc3RvcEludGVydmFsKCl9KSkpfV9zY3JvbGxUbyh0KXtpZih0aGlzLmRpc2FibGVQYWdpbmF0aW9uKXJldHVybnttYXhTY3JvbGxEaXN0YW5jZTowLGRpc3RhbmNlOjB9O2NvbnN0IGU9dGhpcy5fZ2V0TWF4U2Nyb2xsRGlzdGFuY2UoKTtyZXR1cm4gdGhpcy5fc2Nyb2xsRGlzdGFuY2U9TWF0aC5tYXgoMCxNYXRoLm1pbihlLHQpKSx0aGlzLl9zY3JvbGxEaXN0YW5jZUNoYW5nZWQ9ITAsdGhpcy5fY2hlY2tTY3JvbGxpbmdDb250cm9scygpLHttYXhTY3JvbGxEaXN0YW5jZTplLGRpc3RhbmNlOnRoaXMuX3Njcm9sbERpc3RhbmNlfX19akIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGpCKShTbShoZyksU20oVWcpLFNtKHVGKSxTbShISSw4KSxTbShhXyksU20od3opLFNtKFZQLDgpKX0sakIuybVkaXI9bG8oe3R5cGU6akIsaW5wdXRzOntkaXNhYmxlUGFnaW5hdGlvbjoiZGlzYWJsZVBhZ2luYXRpb24ifX0pLGpCLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOlVnfSx7dHlwZTp1Rn0se3R5cGU6SEksZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6YV99LHt0eXBlOnd6fSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV0sakIucHJvcERlY29yYXRvcnM9e2Rpc2FibGVQYWdpbmF0aW9uOlt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGpCLFt7dHlwZTpDeX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6VWd9LHt0eXBlOnVGfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTphX30se3R5cGU6d3p9LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19XX0pLHtkaXNhYmxlUGFnaW5hdGlvbjpbe3R5cGU6eHl9XX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgVUIgZXh0ZW5kcyBqQntjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyKXtzdXBlcih0LGUsbixvLGksYSxyKSx0aGlzLl9kaXNhYmxlUmlwcGxlPSExfWdldCBkaXNhYmxlUmlwcGxlKCl7cmV0dXJuIHRoaXMuX2Rpc2FibGVSaXBwbGV9c2V0IGRpc2FibGVSaXBwbGUodCl7dGhpcy5fZGlzYWJsZVJpcHBsZT15eih0KX1faXRlbVNlbGVjdGVkKHQpe3QucHJldmVudERlZmF1bHQoKX19VUIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFVCKShTbShoZyksU20oVWcpLFNtKHVGKSxTbShISSw4KSxTbShhXyksU20od3opLFNtKFZQLDgpKX0sVUIuybVkaXI9bG8oe3R5cGU6VUIsaW5wdXRzOntkaXNhYmxlUmlwcGxlOiJkaXNhYmxlUmlwcGxlIn0sZmVhdHVyZXM6W3hwXX0pLFVCLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOlVnfSx7dHlwZTp1Rn0se3R5cGU6SEksZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6YV99LHt0eXBlOnd6fSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV0sVUIucHJvcERlY29yYXRvcnM9e2Rpc2FibGVSaXBwbGU6W3t0eXBlOnh5fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoVUIsW3t0eXBlOkN5fV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTpVZ30se3R5cGU6dUZ9LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOmFffSx7dHlwZTp3en0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dfSkse2Rpc2FibGVSaXBwbGU6W3t0eXBlOnh5fV19KTtjbGFzcyBHQiBleHRlbmRzIFVCe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIpe3N1cGVyKHQsZSxuLG8saSxhLHIpfX1HQi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8R0IpKFNtKGhnKSxTbShVZyksU20odUYpLFNtKEhJLDgpLFNtKGFfKSxTbSh3eiksU20oVlAsOCkpfSxHQi7JtWNtcD10byh7dHlwZTpHQixzZWxlY3RvcnM6W1sibWF0LXRhYi1oZWFkZXIiXV0sY29udGVudFF1ZXJpZXM6ZnVuY3Rpb24gdChlLG4sbyl7aWYoMSZlJiYkaChvLEJCLDQpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uX2l0ZW1zPXQpfX0sdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihRaChNQiw3KSxRaChnQiw3KSxRaChoQiw3KSxRaChiQiw1KSxRaCh5Qiw1KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5faW5rQmFyPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLl90YWJMaXN0Q29udGFpbmVyPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLl90YWJMaXN0PXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLl9uZXh0UGFnaW5hdG9yPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLl9wcmV2aW91c1BhZ2luYXRvcj10LmZpcnN0KX19LGhvc3RBdHRyczpbMSwibWF0LXRhYi1oZWFkZXIiXSxob3N0VmFyczo0LGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZwdSgibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jb250cm9scy1lbmFibGVkIixuLl9zaG93UGFnaW5hdGlvbkNvbnRyb2xzKSgibWF0LXRhYi1oZWFkZXItcnRsIiwicnRsIj09bi5fZ2V0TGF5b3V0RGlyZWN0aW9uKCkpfSxpbnB1dHM6e3NlbGVjdGVkSW5kZXg6InNlbGVjdGVkSW5kZXgifSxvdXRwdXRzOntzZWxlY3RGb2N1c2VkSW5kZXg6InNlbGVjdEZvY3VzZWRJbmRleCIsaW5kZXhGb2N1c2VkOiJpbmRleEZvY3VzZWQifSxmZWF0dXJlczpbeHBdLG5nQ29udGVudFNlbGVjdG9yczppQixkZWNsczoxMyx2YXJzOjgsY29uc3RzOltbImFyaWEtaGlkZGVuIiwidHJ1ZSIsIm1hdC1yaXBwbGUiLCIiLDEsIm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24iLCJtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSIsIm1hdC1lbGV2YXRpb24tejQiLDMsIm1hdFJpcHBsZURpc2FibGVkIiwiY2xpY2siLCJtb3VzZWRvd24iLCJ0b3VjaGVuZCJdLFsicHJldmlvdXNQYWdpbmF0b3IiLCIiXSxbMSwibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIl0sWzEsIm1hdC10YWItbGFiZWwtY29udGFpbmVyIiwzLCJrZXlkb3duIl0sWyJ0YWJMaXN0Q29udGFpbmVyIiwiIl0sWyJyb2xlIiwidGFibGlzdCIsMSwibWF0LXRhYi1saXN0IiwzLCJjZGtPYnNlcnZlQ29udGVudCJdLFsidGFiTGlzdCIsIiJdLFsxLCJtYXQtdGFiLWxhYmVscyJdLFsiYXJpYS1oaWRkZW4iLCJ0cnVlIiwibWF0LXJpcHBsZSIsIiIsMSwibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiIsIm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYWZ0ZXIiLCJtYXQtZWxldmF0aW9uLXo0IiwzLCJtYXRSaXBwbGVEaXNhYmxlZCIsIm1vdXNlZG93biIsImNsaWNrIiwidG91Y2hlbmQiXSxbIm5leHRQYWdpbmF0b3IiLCIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFptKCksUm0oMCwiZGl2IiwwLDEpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5faGFuZGxlUGFnaW5hdG9yQ2xpY2soImJlZm9yZSIpfSkpKCJtb3VzZWRvd24iLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9oYW5kbGVQYWdpbmF0b3JQcmVzcygiYmVmb3JlIixlKX0pKSgidG91Y2hlbmQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX3N0b3BJbnRlcnZhbCgpfSkpLFRtKDIsImRpdiIsMiksQW0oKSxSbSgzLCJkaXYiLDMsNCksVm0oImtleWRvd24iLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9oYW5kbGVLZXlkb3duKGUpfSkpLFJtKDUsImRpdiIsNSw2KSxWbSgiY2RrT2JzZXJ2ZUNvbnRlbnQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX29uQ29udGVudENoYW5nZXMoKX0pKSxSbSg3LCJkaXYiLDcpLFhtKDgpLEFtKCksVG0oOSwibWF0LWluay1iYXIiKSxBbSgpLEFtKCksUm0oMTAsImRpdiIsOCw5KSxWbSgibW91c2Vkb3duIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5faGFuZGxlUGFnaW5hdG9yUHJlc3MoImFmdGVyIixlKX0pKSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX2hhbmRsZVBhZ2luYXRvckNsaWNrKCJhZnRlciIpfSkpKCJ0b3VjaGVuZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5fc3RvcEludGVydmFsKCl9KSksVG0oMTIsImRpdiIsMiksQW0oKSksMiZlJiYocHUoIm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQiLG4uX2Rpc2FibGVTY3JvbGxCZWZvcmUpLERtKCJtYXRSaXBwbGVEaXNhYmxlZCIsbi5fZGlzYWJsZVNjcm9sbEJlZm9yZXx8bi5kaXNhYmxlUmlwcGxlKSxyYyg1KSxwdSgiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLCJOb29wQW5pbWF0aW9ucyI9PT1uLl9hbmltYXRpb25Nb2RlKSxyYyg1KSxwdSgibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCIsbi5fZGlzYWJsZVNjcm9sbEFmdGVyKSxEbSgibWF0UmlwcGxlRGlzYWJsZWQiLG4uX2Rpc2FibGVTY3JvbGxBZnRlcnx8bi5kaXNhYmxlUmlwcGxlKSl9LGRpcmVjdGl2ZXM6W2tILGp6LE1CXSxzdHlsZXM6WycubWF0LXRhYi1oZWFkZXJ7ZGlzcGxheTpmbGV4O292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZTtmbGV4LXNocmluazowfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5Om5vbmU7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7bWluLXdpZHRoOjMycHg7Y3Vyc29yOnBvaW50ZXI7ei1pbmRleDoyOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0b3VjaC1hY3Rpb246bm9uZX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jb250cm9scy1lbmFibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9ue2Rpc3BsYXk6ZmxleH0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1iZWZvcmUsLm1hdC10YWItaGVhZGVyLXJ0bCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1hZnRlcntwYWRkaW5nLWxlZnQ6NHB4fS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWhlYWRlci1ydGwgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYWZ0ZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbnt0cmFuc2Zvcm06cm90YXRlKC0xMzVkZWcpfS5tYXQtdGFiLWhlYWRlci1ydGwgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYmVmb3JlLC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWFmdGVye3BhZGRpbmctcmlnaHQ6NHB4fS5tYXQtdGFiLWhlYWRlci1ydGwgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYmVmb3JlIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYWZ0ZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbnt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6MnB4IDJweCAwIDA7Y29udGVudDoiIjtoZWlnaHQ6OHB4O3dpZHRoOjhweH0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZHtib3gtc2hhZG93Om5vbmU7Y3Vyc29yOmRlZmF1bHR9Lm1hdC10YWItbGlzdHtmbGV4LWdyb3c6MTtwb3NpdGlvbjpyZWxhdGl2ZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSA1MDBtcyBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSl9Lm1hdC1pbmstYmFye3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTowO2hlaWdodDoycHg7dHJhbnNpdGlvbjo1MDBtcyBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSl9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1pbmstYmFye3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXIgLm1hdC1pbmstYmFye2JvdHRvbTphdXRvO3RvcDowfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1pbmstYmFye291dGxpbmU6c29saWQgMnB4O2hlaWdodDowfS5tYXQtdGFiLWxhYmVsc3tkaXNwbGF5OmZsZXh9W21hdC1hbGlnbi10YWJzPWNlbnRlcl0+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsc3tqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfVttYXQtYWxpZ24tdGFicz1lbmRdPi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbHN7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5tYXQtdGFiLWxhYmVsLWNvbnRhaW5lcntkaXNwbGF5OmZsZXg7ZmxleC1ncm93OjE7b3ZlcmZsb3c6aGlkZGVuO3otaW5kZXg6MX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXRhYi1saXN0e3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXRhYi1sYWJlbHtoZWlnaHQ6NDhweDtwYWRkaW5nOjAgMjRweDtjdXJzb3I6cG9pbnRlcjtib3gtc2l6aW5nOmJvcmRlci1ib3g7b3BhY2l0eTouNjttaW4td2lkdGg6MTYwcHg7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXA7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC10YWItbGFiZWw6Zm9jdXN7b3V0bGluZTpub25lfS5tYXQtdGFiLWxhYmVsOmZvY3VzOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10YWItbGFiZWw6Zm9jdXN7b3V0bGluZTpkb3R0ZWQgMnB4O291dGxpbmUtb2Zmc2V0Oi0ycHh9Lm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWR7b3BhY2l0eTouNX0ubWF0LXRhYi1sYWJlbCAubWF0LXRhYi1sYWJlbC1jb250ZW50e2Rpc3BsYXk6aW5saW5lLWZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10YWItbGFiZWx7b3BhY2l0eToxfUBtZWRpYShtYXgtd2lkdGg6IDU5OXB4KXsubWF0LXRhYi1sYWJlbHttaW4td2lkdGg6NzJweH19XG4nXSxlbmNhcHN1bGF0aW9uOjJ9KSxHQi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpVZ30se3R5cGU6dUZ9LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOmFffSx7dHlwZTp3en0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dLEdCLnByb3BEZWNvcmF0b3JzPXtfaXRlbXM6W3t0eXBlOllhLGFyZ3M6W0JCLHtkZXNjZW5kYW50czohMX1dfV0sX2lua0Jhcjpbe3R5cGU6WmEsYXJnczpbTUIse3N0YXRpYzohMH1dfV0sX3RhYkxpc3RDb250YWluZXI6W3t0eXBlOlphLGFyZ3M6WyJ0YWJMaXN0Q29udGFpbmVyIix7c3RhdGljOiEwfV19XSxfdGFiTGlzdDpbe3R5cGU6WmEsYXJnczpbInRhYkxpc3QiLHtzdGF0aWM6ITB9XX1dLF9uZXh0UGFnaW5hdG9yOlt7dHlwZTpaYSxhcmdzOlsibmV4dFBhZ2luYXRvciJdfV0sX3ByZXZpb3VzUGFnaW5hdG9yOlt7dHlwZTpaYSxhcmdzOlsicHJldmlvdXNQYWdpbmF0b3IiXX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEdCLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC10YWItaGVhZGVyIix0ZW1wbGF0ZTonPGRpdiBjbGFzcz0ibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiBtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSBtYXQtZWxldmF0aW9uLXo0IlxuICAgICAjcHJldmlvdXNQYWdpbmF0b3JcbiAgICAgYXJpYS1oaWRkZW49InRydWUiXG4gICAgIG1hdC1yaXBwbGUgW21hdFJpcHBsZURpc2FibGVkXT0iX2Rpc2FibGVTY3JvbGxCZWZvcmUgfHwgZGlzYWJsZVJpcHBsZSJcbiAgICAgW2NsYXNzLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRdPSJfZGlzYWJsZVNjcm9sbEJlZm9yZSJcbiAgICAgKGNsaWNrKT0iX2hhbmRsZVBhZ2luYXRvckNsaWNrKFwnYmVmb3JlXCcpIlxuICAgICAobW91c2Vkb3duKT0iX2hhbmRsZVBhZ2luYXRvclByZXNzKFwnYmVmb3JlXCcsICRldmVudCkiXG4gICAgICh0b3VjaGVuZCk9Il9zdG9wSW50ZXJ2YWwoKSI+XG4gIDxkaXYgY2xhc3M9Im1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiI+PC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz0ibWF0LXRhYi1sYWJlbC1jb250YWluZXIiICN0YWJMaXN0Q29udGFpbmVyIChrZXlkb3duKT0iX2hhbmRsZUtleWRvd24oJGV2ZW50KSI+XG4gIDxkaXZcbiAgICAjdGFiTGlzdFxuICAgIGNsYXNzPSJtYXQtdGFiLWxpc3QiXG4gICAgW2NsYXNzLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlXT0iX2FuaW1hdGlvbk1vZGUgPT09IFwnTm9vcEFuaW1hdGlvbnNcJyJcbiAgICByb2xlPSJ0YWJsaXN0IlxuICAgIChjZGtPYnNlcnZlQ29udGVudCk9Il9vbkNvbnRlbnRDaGFuZ2VzKCkiPlxuICAgIDxkaXYgY2xhc3M9Im1hdC10YWItbGFiZWxzIj5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgICA8bWF0LWluay1iYXI+PC9tYXQtaW5rLWJhcj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz0ibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiBtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWFmdGVyIG1hdC1lbGV2YXRpb24tejQiXG4gICAgICNuZXh0UGFnaW5hdG9yXG4gICAgIGFyaWEtaGlkZGVuPSJ0cnVlIlxuICAgICBtYXQtcmlwcGxlIFttYXRSaXBwbGVEaXNhYmxlZF09Il9kaXNhYmxlU2Nyb2xsQWZ0ZXIgfHwgZGlzYWJsZVJpcHBsZSJcbiAgICAgW2NsYXNzLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRdPSJfZGlzYWJsZVNjcm9sbEFmdGVyIlxuICAgICAobW91c2Vkb3duKT0iX2hhbmRsZVBhZ2luYXRvclByZXNzKFwnYWZ0ZXJcJywgJGV2ZW50KSJcbiAgICAgKGNsaWNrKT0iX2hhbmRsZVBhZ2luYXRvckNsaWNrKFwnYWZ0ZXJcJykiXG4gICAgICh0b3VjaGVuZCk9Il9zdG9wSW50ZXJ2YWwoKSI+XG4gIDxkaXYgY2xhc3M9Im1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiI+PC9kaXY+XG48L2Rpdj5cbicsaW5wdXRzOlsic2VsZWN0ZWRJbmRleCJdLG91dHB1dHM6WyJzZWxlY3RGb2N1c2VkSW5kZXgiLCJpbmRleEZvY3VzZWQiXSxlbmNhcHN1bGF0aW9uOkhuLk5vbmUsY2hhbmdlRGV0ZWN0aW9uOnpuLkRlZmF1bHQsaG9zdDp7Y2xhc3M6Im1hdC10YWItaGVhZGVyIiwiW2NsYXNzLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY29udHJvbHMtZW5hYmxlZF0iOiJfc2hvd1BhZ2luYXRpb25Db250cm9scyIsIltjbGFzcy5tYXQtdGFiLWhlYWRlci1ydGxdIjoiX2dldExheW91dERpcmVjdGlvbigpID09ICdydGwnIn0sc3R5bGVzOlsnLm1hdC10YWItaGVhZGVye2Rpc3BsYXk6ZmxleDtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmU7ZmxleC1zaHJpbms6MH0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbnstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpub25lO2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO21pbi13aWR0aDozMnB4O2N1cnNvcjpwb2ludGVyO3otaW5kZXg6Mjstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dG91Y2gtYWN0aW9uOm5vbmV9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY29udHJvbHMtZW5hYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbntkaXNwbGF5OmZsZXh9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYmVmb3JlLC5tYXQtdGFiLWhlYWRlci1ydGwgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYWZ0ZXJ7cGFkZGluZy1sZWZ0OjRweH0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1iZWZvcmUgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1oZWFkZXItcnRsIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWFmdGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257dHJhbnNmb3JtOnJvdGF0ZSgtMTM1ZGVnKX0ubWF0LXRhYi1oZWFkZXItcnRsIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSwubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1hZnRlcntwYWRkaW5nLXJpZ2h0OjRweH0ubWF0LXRhYi1oZWFkZXItcnRsIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWFmdGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjJweCAycHggMCAwO2NvbnRlbnQ6IiI7aGVpZ2h0OjhweDt3aWR0aDo4cHh9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWR7Ym94LXNoYWRvdzpub25lO2N1cnNvcjpkZWZhdWx0fS5tYXQtdGFiLWxpc3R7ZmxleC1ncm93OjE7cG9zaXRpb246cmVsYXRpdmU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gNTAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpfS5tYXQtaW5rLWJhcntwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MDtoZWlnaHQ6MnB4O3RyYW5zaXRpb246NTAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtaW5rLWJhcnt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tYXQtaW5rLWJhcntib3R0b206YXV0bzt0b3A6MH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtaW5rLWJhcntvdXRsaW5lOnNvbGlkIDJweDtoZWlnaHQ6MH0ubWF0LXRhYi1sYWJlbHN7ZGlzcGxheTpmbGV4fVttYXQtYWxpZ24tdGFicz1jZW50ZXJdPi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbHN7anVzdGlmeS1jb250ZW50OmNlbnRlcn1bbWF0LWFsaWduLXRhYnM9ZW5kXT4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWxze2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0ubWF0LXRhYi1sYWJlbC1jb250YWluZXJ7ZGlzcGxheTpmbGV4O2ZsZXgtZ3JvdzoxO292ZXJmbG93OmhpZGRlbjt6LWluZGV4OjF9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC10YWItbGlzdHt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC10YWItbGFiZWx7aGVpZ2h0OjQ4cHg7cGFkZGluZzowIDI0cHg7Y3Vyc29yOnBvaW50ZXI7Ym94LXNpemluZzpib3JkZXItYm94O29wYWNpdHk6LjY7bWluLXdpZHRoOjE2MHB4O3RleHQtYWxpZ246Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtdGFiLWxhYmVsOmZvY3Vze291dGxpbmU6bm9uZX0ubWF0LXRhYi1sYWJlbDpmb2N1czpub3QoLm1hdC10YWItZGlzYWJsZWQpe29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdGFiLWxhYmVsOmZvY3Vze291dGxpbmU6ZG90dGVkIDJweDtvdXRsaW5lLW9mZnNldDotMnB4fS5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHR9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVke29wYWNpdHk6LjV9Lm1hdC10YWItbGFiZWwgLm1hdC10YWItbGFiZWwtY29udGVudHtkaXNwbGF5OmlubGluZS1mbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdGFiLWxhYmVse29wYWNpdHk6MX1AbWVkaWEobWF4LXdpZHRoOiA1OTlweCl7Lm1hdC10YWItbGFiZWx7bWluLXdpZHRoOjcycHh9fVxuJ119XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6VWd9LHt0eXBlOnVGfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTphX30se3R5cGU6d3p9LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19XX0pLHtfaXRlbXM6W3t0eXBlOllhLGFyZ3M6W0JCLHtkZXNjZW5kYW50czohMX1dfV0sX2lua0Jhcjpbe3R5cGU6WmEsYXJnczpbTUIse3N0YXRpYzohMH1dfV0sX3RhYkxpc3RDb250YWluZXI6W3t0eXBlOlphLGFyZ3M6WyJ0YWJMaXN0Q29udGFpbmVyIix7c3RhdGljOiEwfV19XSxfdGFiTGlzdDpbe3R5cGU6WmEsYXJnczpbInRhYkxpc3QiLHtzdGF0aWM6ITB9XX1dLF9uZXh0UGFnaW5hdG9yOlt7dHlwZTpaYSxhcmdzOlsibmV4dFBhZ2luYXRvciJdfV0sX3ByZXZpb3VzUGFnaW5hdG9yOlt7dHlwZTpaYSxhcmdzOlsicHJldmlvdXNQYWdpbmF0b3IiXX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBXQiBleHRlbmRzIGpCe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIpe3N1cGVyKHQsbyxpLGUsbixhLHIpLHRoaXMuX2Rpc2FibGVSaXBwbGU9ITEsdGhpcy5jb2xvcj0icHJpbWFyeSJ9Z2V0IGJhY2tncm91bmRDb2xvcigpe3JldHVybiB0aGlzLl9iYWNrZ3JvdW5kQ29sb3J9c2V0IGJhY2tncm91bmRDb2xvcih0KXtjb25zdCBlPXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3Q7ZS5yZW1vdmUoYG1hdC1iYWNrZ3JvdW5kLSR7dGhpcy5iYWNrZ3JvdW5kQ29sb3J9YCksdCYmZS5hZGQoYG1hdC1iYWNrZ3JvdW5kLSR7dH1gKSx0aGlzLl9iYWNrZ3JvdW5kQ29sb3I9dH1nZXQgZGlzYWJsZVJpcHBsZSgpe3JldHVybiB0aGlzLl9kaXNhYmxlUmlwcGxlfXNldCBkaXNhYmxlUmlwcGxlKHQpe3RoaXMuX2Rpc2FibGVSaXBwbGU9eXoodCl9X2l0ZW1TZWxlY3RlZCgpe31uZ0FmdGVyQ29udGVudEluaXQoKXt0aGlzLl9pdGVtcy5jaGFuZ2VzLnBpcGUoTmUobnVsbCksSWUodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgoKT0+e3RoaXMudXBkYXRlQWN0aXZlTGluaygpfSkpLHN1cGVyLm5nQWZ0ZXJDb250ZW50SW5pdCgpfXVwZGF0ZUFjdGl2ZUxpbmsoKXtpZighdGhpcy5faXRlbXMpcmV0dXJuO2NvbnN0IHQ9dGhpcy5faXRlbXMudG9BcnJheSgpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKHRbZV0uYWN0aXZlKXJldHVybiB0aGlzLnNlbGVjdGVkSW5kZXg9ZSx2b2lkIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO3RoaXMuc2VsZWN0ZWRJbmRleD0tMSx0aGlzLl9pbmtCYXIuaGlkZSgpfX1XQi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8V0IpKFNtKGhnKSxTbShISSw4KSxTbShhXyksU20oVWcpLFNtKHVGKSxTbSh3eiksU20oVlAsOCkpfSxXQi7JtWRpcj1sbyh7dHlwZTpXQixpbnB1dHM6e2NvbG9yOiJjb2xvciIsYmFja2dyb3VuZENvbG9yOiJiYWNrZ3JvdW5kQ29sb3IiLGRpc2FibGVSaXBwbGU6ImRpc2FibGVSaXBwbGUifSxmZWF0dXJlczpbeHBdfSksV0IuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ30se3R5cGU6SEksZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6YV99LHt0eXBlOlVnfSx7dHlwZTp1Rn0se3R5cGU6d3p9LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19XSxXQi5wcm9wRGVjb3JhdG9ycz17YmFja2dyb3VuZENvbG9yOlt7dHlwZTp4eX1dLGRpc2FibGVSaXBwbGU6W3t0eXBlOnh5fV0sY29sb3I6W3t0eXBlOnh5fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoV0IsW3t0eXBlOkN5fV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTphX30se3R5cGU6VWd9LHt0eXBlOnVGfSx7dHlwZTp3en0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dfSkse2NvbG9yOlt7dHlwZTp4eX1dLGJhY2tncm91bmRDb2xvcjpbe3R5cGU6eHl9XSxkaXNhYmxlUmlwcGxlOlt7dHlwZTp4eX1dfSk7Y2xhc3MgWUIgZXh0ZW5kcyBXQntjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyKXtzdXBlcih0LGUsbixvLGksYSxyKX19WUIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFlCKShTbShoZyksU20oSEksOCksU20oYV8pLFNtKFVnKSxTbSh1RiksU20od3opLFNtKFZQLDgpKX0sWUIuybVjbXA9dG8oe3R5cGU6WUIsc2VsZWN0b3JzOltbIiIsIm1hdC10YWItbmF2LWJhciIsIiJdXSxjb250ZW50UXVlcmllczpmdW5jdGlvbiB0KGUsbixvKXtpZigxJmUmJiRoKG8sWEIsNSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5faXRlbXM9dCl9fSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmKFFoKE1CLDcpLFFoKGdCLDcpLFFoKGhCLDcpLFFoKGJCLDUpLFFoKHlCLDUpKSwyJmUpe2xldCB0O0poKHQ9dGIoKSkmJihuLl9pbmtCYXI9dC5maXJzdCksSmgodD10YigpKSYmKG4uX3RhYkxpc3RDb250YWluZXI9dC5maXJzdCksSmgodD10YigpKSYmKG4uX3RhYkxpc3Q9dC5maXJzdCksSmgodD10YigpKSYmKG4uX25leHRQYWdpbmF0b3I9dC5maXJzdCksSmgodD10YigpKSYmKG4uX3ByZXZpb3VzUGFnaW5hdG9yPXQuZmlyc3QpfX0saG9zdEF0dHJzOlsxLCJtYXQtdGFiLW5hdi1iYXIiLCJtYXQtdGFiLWhlYWRlciJdLGhvc3RWYXJzOjEwLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZwdSgibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jb250cm9scy1lbmFibGVkIixuLl9zaG93UGFnaW5hdGlvbkNvbnRyb2xzKSgibWF0LXRhYi1oZWFkZXItcnRsIiwicnRsIj09bi5fZ2V0TGF5b3V0RGlyZWN0aW9uKCkpKCJtYXQtcHJpbWFyeSIsIndhcm4iIT09bi5jb2xvciYmImFjY2VudCIhPT1uLmNvbG9yKSgibWF0LWFjY2VudCIsImFjY2VudCI9PT1uLmNvbG9yKSgibWF0LXdhcm4iLCJ3YXJuIj09PW4uY29sb3IpfSxpbnB1dHM6e2NvbG9yOiJjb2xvciJ9LGV4cG9ydEFzOlsibWF0VGFiTmF2QmFyIiwibWF0VGFiTmF2Il0sZmVhdHVyZXM6W3hwXSxhdHRyczpbIm1hdC10YWItbmF2LWJhciIsIiJdLG5nQ29udGVudFNlbGVjdG9yczppQixkZWNsczoxMyx2YXJzOjgsY29uc3RzOltbImFyaWEtaGlkZGVuIiwidHJ1ZSIsIm1hdC1yaXBwbGUiLCIiLDEsIm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24iLCJtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSIsIm1hdC1lbGV2YXRpb24tejQiLDMsIm1hdFJpcHBsZURpc2FibGVkIiwiY2xpY2siLCJtb3VzZWRvd24iLCJ0b3VjaGVuZCJdLFsicHJldmlvdXNQYWdpbmF0b3IiLCIiXSxbMSwibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIl0sWzEsIm1hdC10YWItbGluay1jb250YWluZXIiLDMsImtleWRvd24iXSxbInRhYkxpc3RDb250YWluZXIiLCIiXSxbMSwibWF0LXRhYi1saXN0IiwzLCJjZGtPYnNlcnZlQ29udGVudCJdLFsidGFiTGlzdCIsIiJdLFsxLCJtYXQtdGFiLWxpbmtzIl0sWyJhcmlhLWhpZGRlbiIsInRydWUiLCJtYXQtcmlwcGxlIiwiIiwxLCJtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIiwibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1hZnRlciIsIm1hdC1lbGV2YXRpb24tejQiLDMsIm1hdFJpcHBsZURpc2FibGVkIiwibW91c2Vkb3duIiwiY2xpY2siLCJ0b3VjaGVuZCJdLFsibmV4dFBhZ2luYXRvciIsIiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoWm0oKSxSbSgwLCJkaXYiLDAsMSksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9oYW5kbGVQYWdpbmF0b3JDbGljaygiYmVmb3JlIil9KSkoIm1vdXNlZG93biIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX2hhbmRsZVBhZ2luYXRvclByZXNzKCJiZWZvcmUiLGUpfSkpKCJ0b3VjaGVuZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5fc3RvcEludGVydmFsKCl9KSksVG0oMiwiZGl2IiwyKSxBbSgpLFJtKDMsImRpdiIsMyw0KSxWbSgia2V5ZG93biIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX2hhbmRsZUtleWRvd24oZSl9KSksUm0oNSwiZGl2Iiw1LDYpLFZtKCJjZGtPYnNlcnZlQ29udGVudCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5fb25Db250ZW50Q2hhbmdlcygpfSkpLFJtKDcsImRpdiIsNyksWG0oOCksQW0oKSxUbSg5LCJtYXQtaW5rLWJhciIpLEFtKCksQW0oKSxSbSgxMCwiZGl2Iiw4LDkpLFZtKCJtb3VzZWRvd24iLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9oYW5kbGVQYWdpbmF0b3JQcmVzcygiYWZ0ZXIiLGUpfSkpKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5faGFuZGxlUGFnaW5hdG9yQ2xpY2soImFmdGVyIil9KSkoInRvdWNoZW5kIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9zdG9wSW50ZXJ2YWwoKX0pKSxUbSgxMiwiZGl2IiwyKSxBbSgpKSwyJmUmJihwdSgibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCIsbi5fZGlzYWJsZVNjcm9sbEJlZm9yZSksRG0oIm1hdFJpcHBsZURpc2FibGVkIixuLl9kaXNhYmxlU2Nyb2xsQmVmb3JlfHxuLmRpc2FibGVSaXBwbGUpLHJjKDUpLHB1KCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsIk5vb3BBbmltYXRpb25zIj09PW4uX2FuaW1hdGlvbk1vZGUpLHJjKDUpLHB1KCJtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIixuLl9kaXNhYmxlU2Nyb2xsQWZ0ZXIpLERtKCJtYXRSaXBwbGVEaXNhYmxlZCIsbi5fZGlzYWJsZVNjcm9sbEFmdGVyfHxuLmRpc2FibGVSaXBwbGUpKX0sZGlyZWN0aXZlczpba0gsanosTUJdLHN0eWxlczpbJy5tYXQtdGFiLWhlYWRlcntkaXNwbGF5OmZsZXg7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXgtc2hyaW5rOjB9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6bm9uZTtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjttaW4td2lkdGg6MzJweDtjdXJzb3I6cG9pbnRlcjt6LWluZGV4OjI7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RvdWNoLWFjdGlvbjpub25lfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNvbnRyb2xzLWVuYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257ZGlzcGxheTpmbGV4fS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSwubWF0LXRhYi1oZWFkZXItcnRsIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWFmdGVye3BhZGRpbmctbGVmdDo0cHh9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYmVmb3JlIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItaGVhZGVyLXJ0bCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1hZnRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue3RyYW5zZm9ybTpyb3RhdGUoLTEzNWRlZyl9Lm1hdC10YWItaGVhZGVyLXJ0bCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1iZWZvcmUsLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYWZ0ZXJ7cGFkZGluZy1yaWdodDo0cHh9Lm1hdC10YWItaGVhZGVyLXJ0bCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1iZWZvcmUgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1hZnRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDoycHggMnB4IDAgMDtjb250ZW50OiIiO2hlaWdodDo4cHg7d2lkdGg6OHB4fS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVke2JveC1zaGFkb3c6bm9uZTtjdXJzb3I6ZGVmYXVsdH0ubWF0LXRhYi1saXN0e2ZsZXgtZ3JvdzoxO3Bvc2l0aW9uOnJlbGF0aXZlO3RyYW5zaXRpb246dHJhbnNmb3JtIDUwMG1zIGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKX0ubWF0LXRhYi1saW5rc3tkaXNwbGF5OmZsZXh9W21hdC1hbGlnbi10YWJzPWNlbnRlcl0+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGlua3N7anVzdGlmeS1jb250ZW50OmNlbnRlcn1bbWF0LWFsaWduLXRhYnM9ZW5kXT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXRhYi1saW5rc3tqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9Lm1hdC1pbmstYmFye3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTowO2hlaWdodDoycHg7dHJhbnNpdGlvbjo1MDBtcyBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSl9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1pbmstYmFye3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXIgLm1hdC1pbmstYmFye2JvdHRvbTphdXRvO3RvcDowfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1pbmstYmFye291dGxpbmU6c29saWQgMnB4O2hlaWdodDowfS5tYXQtdGFiLWxpbmstY29udGFpbmVye2Rpc3BsYXk6ZmxleDtmbGV4LWdyb3c6MTtvdmVyZmxvdzpoaWRkZW47ei1pbmRleDoxfS5tYXQtdGFiLWxpbmt7aGVpZ2h0OjQ4cHg7cGFkZGluZzowIDI0cHg7Y3Vyc29yOnBvaW50ZXI7Ym94LXNpemluZzpib3JkZXItYm94O29wYWNpdHk6LjY7bWluLXdpZHRoOjE2MHB4O3RleHQtYWxpZ246Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwO3ZlcnRpY2FsLWFsaWduOnRvcDt0ZXh0LWRlY29yYXRpb246bm9uZTtwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzpoaWRkZW47LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtdGFiLWxpbms6Zm9jdXN7b3V0bGluZTpub25lfS5tYXQtdGFiLWxpbms6Zm9jdXM6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXRhYi1saW5rOmZvY3Vze291dGxpbmU6ZG90dGVkIDJweDtvdXRsaW5lLW9mZnNldDotMnB4fS5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtvcGFjaXR5Oi41fS5tYXQtdGFiLWxpbmsgLm1hdC10YWItbGFiZWwtY29udGVudHtkaXNwbGF5OmlubGluZS1mbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdGFiLWxpbmt7b3BhY2l0eToxfVttYXQtc3RyZXRjaC10YWJzXSAubWF0LXRhYi1saW5re2ZsZXgtYmFzaXM6MDtmbGV4LWdyb3c6MX0ubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7cG9pbnRlci1ldmVudHM6bm9uZX1AbWVkaWEobWF4LXdpZHRoOiA1OTlweCl7Lm1hdC10YWItbGlua3ttaW4td2lkdGg6NzJweH19XG4nXSxlbmNhcHN1bGF0aW9uOjJ9KSxZQi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTphX30se3R5cGU6VWd9LHt0eXBlOnVGfSx7dHlwZTp3en0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dLFlCLnByb3BEZWNvcmF0b3JzPXtfaXRlbXM6W3t0eXBlOllhLGFyZ3M6W3FlKCgoKT0+WEIpKSx7ZGVzY2VuZGFudHM6ITB9XX1dLF9pbmtCYXI6W3t0eXBlOlphLGFyZ3M6W01CLHtzdGF0aWM6ITB9XX1dLF90YWJMaXN0Q29udGFpbmVyOlt7dHlwZTpaYSxhcmdzOlsidGFiTGlzdENvbnRhaW5lciIse3N0YXRpYzohMH1dfV0sX3RhYkxpc3Q6W3t0eXBlOlphLGFyZ3M6WyJ0YWJMaXN0Iix7c3RhdGljOiEwfV19XSxfbmV4dFBhZ2luYXRvcjpbe3R5cGU6WmEsYXJnczpbIm5leHRQYWdpbmF0b3IiXX1dLF9wcmV2aW91c1BhZ2luYXRvcjpbe3R5cGU6WmEsYXJnczpbInByZXZpb3VzUGFnaW5hdG9yIl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChZQixbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJbbWF0LXRhYi1uYXYtYmFyXSIsZXhwb3J0QXM6Im1hdFRhYk5hdkJhciwgbWF0VGFiTmF2IixpbnB1dHM6WyJjb2xvciJdLHRlbXBsYXRlOic8ZGl2IGNsYXNzPSJtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIG1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYmVmb3JlIG1hdC1lbGV2YXRpb24tejQiXG4gICAgICNwcmV2aW91c1BhZ2luYXRvclxuICAgICBhcmlhLWhpZGRlbj0idHJ1ZSJcbiAgICAgbWF0LXJpcHBsZSBbbWF0UmlwcGxlRGlzYWJsZWRdPSJfZGlzYWJsZVNjcm9sbEJlZm9yZSB8fCBkaXNhYmxlUmlwcGxlIlxuICAgICBbY2xhc3MubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZF09Il9kaXNhYmxlU2Nyb2xsQmVmb3JlIlxuICAgICAoY2xpY2spPSJfaGFuZGxlUGFnaW5hdG9yQ2xpY2soXCdiZWZvcmVcJykiXG4gICAgIChtb3VzZWRvd24pPSJfaGFuZGxlUGFnaW5hdG9yUHJlc3MoXCdiZWZvcmVcJywgJGV2ZW50KSJcbiAgICAgKHRvdWNoZW5kKT0iX3N0b3BJbnRlcnZhbCgpIj5cbiAgPGRpdiBjbGFzcz0ibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIj48L2Rpdj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPSJtYXQtdGFiLWxpbmstY29udGFpbmVyIiAjdGFiTGlzdENvbnRhaW5lciAoa2V5ZG93bik9Il9oYW5kbGVLZXlkb3duKCRldmVudCkiPlxuICA8ZGl2XG4gICAgY2xhc3M9Im1hdC10YWItbGlzdCJcbiAgICBbY2xhc3MuX21hdC1hbmltYXRpb24tbm9vcGFibGVdPSJfYW5pbWF0aW9uTW9kZSA9PT0gXCdOb29wQW5pbWF0aW9uc1wnIlxuICAgICN0YWJMaXN0XG4gICAgKGNka09ic2VydmVDb250ZW50KT0iX29uQ29udGVudENoYW5nZXMoKSI+XG4gICAgPGRpdiBjbGFzcz0ibWF0LXRhYi1saW5rcyI+XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gICAgPG1hdC1pbmstYmFyPjwvbWF0LWluay1iYXI+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9Im1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gbWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1hZnRlciBtYXQtZWxldmF0aW9uLXo0IlxuICAgICAjbmV4dFBhZ2luYXRvclxuICAgICBhcmlhLWhpZGRlbj0idHJ1ZSJcbiAgICAgbWF0LXJpcHBsZSBbbWF0UmlwcGxlRGlzYWJsZWRdPSJfZGlzYWJsZVNjcm9sbEFmdGVyIHx8IGRpc2FibGVSaXBwbGUiXG4gICAgIFtjbGFzcy5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkXT0iX2Rpc2FibGVTY3JvbGxBZnRlciJcbiAgICAgKG1vdXNlZG93bik9Il9oYW5kbGVQYWdpbmF0b3JQcmVzcyhcJ2FmdGVyXCcsICRldmVudCkiXG4gICAgIChjbGljayk9Il9oYW5kbGVQYWdpbmF0b3JDbGljayhcJ2FmdGVyXCcpIlxuICAgICAodG91Y2hlbmQpPSJfc3RvcEludGVydmFsKCkiPlxuICA8ZGl2IGNsYXNzPSJtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24iPjwvZGl2PlxuPC9kaXY+XG4nLGhvc3Q6e2NsYXNzOiJtYXQtdGFiLW5hdi1iYXIgbWF0LXRhYi1oZWFkZXIiLCJbY2xhc3MubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jb250cm9scy1lbmFibGVkXSI6Il9zaG93UGFnaW5hdGlvbkNvbnRyb2xzIiwiW2NsYXNzLm1hdC10YWItaGVhZGVyLXJ0bF0iOiJfZ2V0TGF5b3V0RGlyZWN0aW9uKCkgPT0gJ3J0bCciLCJbY2xhc3MubWF0LXByaW1hcnldIjonY29sb3IgIT09ICJ3YXJuIiAmJiBjb2xvciAhPT0gImFjY2VudCInLCJbY2xhc3MubWF0LWFjY2VudF0iOidjb2xvciA9PT0gImFjY2VudCInLCJbY2xhc3MubWF0LXdhcm5dIjonY29sb3IgPT09ICJ3YXJuIid9LGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uRGVmYXVsdCxzdHlsZXM6WycubWF0LXRhYi1oZWFkZXJ7ZGlzcGxheTpmbGV4O292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZTtmbGV4LXNocmluazowfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5Om5vbmU7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7bWluLXdpZHRoOjMycHg7Y3Vyc29yOnBvaW50ZXI7ei1pbmRleDoyOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0b3VjaC1hY3Rpb246bm9uZX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jb250cm9scy1lbmFibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9ue2Rpc3BsYXk6ZmxleH0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1iZWZvcmUsLm1hdC10YWItaGVhZGVyLXJ0bCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1hZnRlcntwYWRkaW5nLWxlZnQ6NHB4fS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWhlYWRlci1ydGwgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYWZ0ZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbnt0cmFuc2Zvcm06cm90YXRlKC0xMzVkZWcpfS5tYXQtdGFiLWhlYWRlci1ydGwgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYmVmb3JlLC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWFmdGVye3BhZGRpbmctcmlnaHQ6NHB4fS5tYXQtdGFiLWhlYWRlci1ydGwgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYmVmb3JlIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYWZ0ZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbnt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6MnB4IDJweCAwIDA7Y29udGVudDoiIjtoZWlnaHQ6OHB4O3dpZHRoOjhweH0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZHtib3gtc2hhZG93Om5vbmU7Y3Vyc29yOmRlZmF1bHR9Lm1hdC10YWItbGlzdHtmbGV4LWdyb3c6MTtwb3NpdGlvbjpyZWxhdGl2ZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSA1MDBtcyBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSl9Lm1hdC10YWItbGlua3N7ZGlzcGxheTpmbGV4fVttYXQtYWxpZ24tdGFicz1jZW50ZXJdPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmtze2p1c3RpZnktY29udGVudDpjZW50ZXJ9W21hdC1hbGlnbi10YWJzPWVuZF0+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGlua3N7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5tYXQtaW5rLWJhcntwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MDtoZWlnaHQ6MnB4O3RyYW5zaXRpb246NTAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtaW5rLWJhcnt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tYXQtaW5rLWJhcntib3R0b206YXV0bzt0b3A6MH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtaW5rLWJhcntvdXRsaW5lOnNvbGlkIDJweDtoZWlnaHQ6MH0ubWF0LXRhYi1saW5rLWNvbnRhaW5lcntkaXNwbGF5OmZsZXg7ZmxleC1ncm93OjE7b3ZlcmZsb3c6aGlkZGVuO3otaW5kZXg6MX0ubWF0LXRhYi1saW5re2hlaWdodDo0OHB4O3BhZGRpbmc6MCAyNHB4O2N1cnNvcjpwb2ludGVyO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvcGFjaXR5Oi42O21pbi13aWR0aDoxNjBweDt0ZXh0LWFsaWduOmNlbnRlcjtkaXNwbGF5OmlubGluZS1mbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcDt2ZXJ0aWNhbC1hbGlnbjp0b3A7dGV4dC1kZWNvcmF0aW9uOm5vbmU7cG9zaXRpb246cmVsYXRpdmU7b3ZlcmZsb3c6aGlkZGVuOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LXRhYi1saW5rOmZvY3Vze291dGxpbmU6bm9uZX0ubWF0LXRhYi1saW5rOmZvY3VzOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10YWItbGluazpmb2N1c3tvdXRsaW5lOmRvdHRlZCAycHg7b3V0bGluZS1vZmZzZXQ6LTJweH0ubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHR9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7b3BhY2l0eTouNX0ubWF0LXRhYi1saW5rIC5tYXQtdGFiLWxhYmVsLWNvbnRlbnR7ZGlzcGxheTppbmxpbmUtZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXB9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXRhYi1saW5re29wYWNpdHk6MX1bbWF0LXN0cmV0Y2gtdGFic10gLm1hdC10YWItbGlua3tmbGV4LWJhc2lzOjA7ZmxleC1ncm93OjF9Lm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVke3BvaW50ZXItZXZlbnRzOm5vbmV9QG1lZGlhKG1heC13aWR0aDogNTk5cHgpey5tYXQtdGFiLWxpbmt7bWluLXdpZHRoOjcycHh9fVxuJ119XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6SEksZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6YV99LHt0eXBlOlVnfSx7dHlwZTp1Rn0se3R5cGU6d3p9LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19XX0pLHtfaXRlbXM6W3t0eXBlOllhLGFyZ3M6W3FlKCgoKT0+WEIpKSx7ZGVzY2VuZGFudHM6ITB9XX1dLF9pbmtCYXI6W3t0eXBlOlphLGFyZ3M6W01CLHtzdGF0aWM6ITB9XX1dLF90YWJMaXN0Q29udGFpbmVyOlt7dHlwZTpaYSxhcmdzOlsidGFiTGlzdENvbnRhaW5lciIse3N0YXRpYzohMH1dfV0sX3RhYkxpc3Q6W3t0eXBlOlphLGFyZ3M6WyJ0YWJMaXN0Iix7c3RhdGljOiEwfV19XSxfbmV4dFBhZ2luYXRvcjpbe3R5cGU6WmEsYXJnczpbIm5leHRQYWdpbmF0b3IiXX1dLF9wcmV2aW91c1BhZ2luYXRvcjpbe3R5cGU6WmEsYXJnczpbInByZXZpb3VzUGFnaW5hdG9yIl19XX0pO2NvbnN0IHFCPSRJKFFJKEtJKGNsYXNze30pKSk7Y2xhc3MgWkIgZXh0ZW5kcyBxQntjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSl7c3VwZXIoKSx0aGlzLl90YWJOYXZCYXI9dCx0aGlzLmVsZW1lbnRSZWY9ZSx0aGlzLl9mb2N1c01vbml0b3I9aSx0aGlzLl9pc0FjdGl2ZT0hMSx0aGlzLnJpcHBsZUNvbmZpZz1ufHx7fSx0aGlzLnRhYkluZGV4PXBhcnNlSW50KG8pfHwwLCJOb29wQW5pbWF0aW9ucyI9PT1hJiYodGhpcy5yaXBwbGVDb25maWcuYW5pbWF0aW9uPXtlbnRlckR1cmF0aW9uOjAsZXhpdER1cmF0aW9uOjB9KX1nZXQgYWN0aXZlKCl7cmV0dXJuIHRoaXMuX2lzQWN0aXZlfXNldCBhY3RpdmUodCl7eXoodCkhPT10aGlzLl9pc0FjdGl2ZSYmKHRoaXMuX2lzQWN0aXZlPXQsdGhpcy5fdGFiTmF2QmFyLnVwZGF0ZUFjdGl2ZUxpbmsoKSl9Z2V0IHJpcHBsZURpc2FibGVkKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWR8fHRoaXMuZGlzYWJsZVJpcHBsZXx8dGhpcy5fdGFiTmF2QmFyLmRpc2FibGVSaXBwbGV8fCEhdGhpcy5yaXBwbGVDb25maWcuZGlzYWJsZWR9Zm9jdXMoKXt0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpfW5nQWZ0ZXJWaWV3SW5pdCgpe3RoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHRoaXMuZWxlbWVudFJlZil9bmdPbkRlc3Ryb3koKXt0aGlzLl9mb2N1c01vbml0b3Iuc3RvcE1vbml0b3JpbmcodGhpcy5lbGVtZW50UmVmKX1faGFuZGxlRm9jdXMoKXt0aGlzLl90YWJOYXZCYXIuZm9jdXNJbmRleD10aGlzLl90YWJOYXZCYXIuX2l0ZW1zLnRvQXJyYXkoKS5pbmRleE9mKHRoaXMpfX1aQi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WkIpKFNtKFdCKSxTbShoZyksU20od0gsOCksTmEoInRhYmluZGV4IiksU20oU0kpLFNtKFZQLDgpKX0sWkIuybVkaXI9bG8oe3R5cGU6WkIsaW5wdXRzOnthY3RpdmU6ImFjdGl2ZSJ9LGZlYXR1cmVzOlt4cF19KSxaQi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOldCfSx7dHlwZTpoZ30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOlt3SF19XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmphLGFyZ3M6WyJ0YWJpbmRleCJdfV19LHt0eXBlOlNJfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV0sWkIucHJvcERlY29yYXRvcnM9e2FjdGl2ZTpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChaQixbe3R5cGU6Q3l9XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6V0J9LHt0eXBlOmhnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3dIXX1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6amEsYXJnczpbInRhYmluZGV4Il19XX0se3R5cGU6U0l9LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19XX0pLHthY3RpdmU6W3t0eXBlOnh5fV19KTtjbGFzcyBYQiBleHRlbmRzIFpCe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIscyl7c3VwZXIodCxlLGksYSxyLHMpLHRoaXMuX3RhYkxpbmtSaXBwbGU9bmV3IFBIKHRoaXMsbixlLG8pLHRoaXMuX3RhYkxpbmtSaXBwbGUuc2V0dXBUcmlnZ2VyRXZlbnRzKGUubmF0aXZlRWxlbWVudCl9bmdPbkRlc3Ryb3koKXtzdXBlci5uZ09uRGVzdHJveSgpLHRoaXMuX3RhYkxpbmtSaXBwbGUuX3JlbW92ZVRyaWdnZXJFdmVudHMoKX19WEIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFhCKShTbShZQiksU20oaGcpLFNtKGFfKSxTbSh3eiksU20od0gsOCksTmEoInRhYmluZGV4IiksU20oU0kpLFNtKFZQLDgpKX0sWEIuybVkaXI9bG8oe3R5cGU6WEIsc2VsZWN0b3JzOltbIiIsIm1hdC10YWItbGluayIsIiJdLFsiIiwibWF0VGFiTGluayIsIiJdXSxob3N0QXR0cnM6WzEsIm1hdC10YWItbGluayIsIm1hdC1mb2N1cy1pbmRpY2F0b3IiXSxob3N0VmFyczo3LGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgiZm9jdXMiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX2hhbmRsZUZvY3VzKCl9KSksMiZlJiYoanAoImFyaWEtY3VycmVudCIsbi5hY3RpdmU/InBhZ2UiOm51bGwpKCJhcmlhLWRpc2FibGVkIixuLmRpc2FibGVkKSgidGFiSW5kZXgiLG4udGFiSW5kZXgpLHB1KCJtYXQtdGFiLWRpc2FibGVkIixuLmRpc2FibGVkKSgibWF0LXRhYi1sYWJlbC1hY3RpdmUiLG4uYWN0aXZlKSl9LGlucHV0czp7ZGlzYWJsZWQ6ImRpc2FibGVkIixkaXNhYmxlUmlwcGxlOiJkaXNhYmxlUmlwcGxlIix0YWJJbmRleDoidGFiSW5kZXgifSxleHBvcnRBczpbIm1hdFRhYkxpbmsiXSxmZWF0dXJlczpbeHBdfSksWEIuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpZQn0se3R5cGU6aGd9LHt0eXBlOmFffSx7dHlwZTp3en0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOlt3SF19XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmphLGFyZ3M6WyJ0YWJpbmRleCJdfV19LHt0eXBlOlNJfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChYQixbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbWF0LXRhYi1saW5rXSwgW21hdFRhYkxpbmtdIixleHBvcnRBczoibWF0VGFiTGluayIsaW5wdXRzOlsiZGlzYWJsZWQiLCJkaXNhYmxlUmlwcGxlIiwidGFiSW5kZXgiXSxob3N0OntjbGFzczoibWF0LXRhYi1saW5rIG1hdC1mb2N1cy1pbmRpY2F0b3IiLCJbYXR0ci5hcmlhLWN1cnJlbnRdIjonYWN0aXZlID8gInBhZ2UiIDogbnVsbCcsIlthdHRyLmFyaWEtZGlzYWJsZWRdIjoiZGlzYWJsZWQiLCJbYXR0ci50YWJJbmRleF0iOiJ0YWJJbmRleCIsIltjbGFzcy5tYXQtdGFiLWRpc2FibGVkXSI6ImRpc2FibGVkIiwiW2NsYXNzLm1hdC10YWItbGFiZWwtYWN0aXZlXSI6ImFjdGl2ZSIsIihmb2N1cykiOiJfaGFuZGxlRm9jdXMoKSJ9fV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6WUJ9LHt0eXBlOmhnfSx7dHlwZTphX30se3R5cGU6d3p9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbd0hdfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpqYSxhcmdzOlsidGFiaW5kZXgiXX1dfSx7dHlwZTpTSX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBLQnt9S0IuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEtCKX0sS0IuybVtb2Q9YW8oe3R5cGU6S0J9KSxLQi7JtWluaj12bih7aW1wb3J0czpbW1dNLFhJLFJGLFNILFV6LE5JXSxYSV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEtCLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbV00sWEksUkYsU0gsVXosTkldLGV4cG9ydHM6W1hJLEZCLFBCLFNCLFlCLFhCLHhCXSxkZWNsYXJhdGlvbnM6W0ZCLFBCLFNCLE1CLEJCLFlCLFhCLEFCLEVCLEdCLHhCXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKEtCLHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bRkIsUEIsU0IsTUIsQkIsWUIsWEIsQUIsRUIsR0IseEJdfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1dNLFhJLFJGLFNILFV6LE5JXX0sZXhwb3J0czpmdW5jdGlvbigpe3JldHVybltYSSxGQixQQixTQixZQixYQix4Ql19fSk7Y29uc3QgSkI9WyJ1bmRlcmxpbmUiXSxRQj1bImNvbm5lY3Rpb25Db250YWluZXIiXSwkQj1bImlucHV0Q29udGFpbmVyIl0sdFY9WyJsYWJlbCJdO2Z1bmN0aW9uIGVWKHQsZSl7MSZ0JiYoTm0oMCksUm0oMSwiZGl2IiwxNCksVG0oMiwiZGl2IiwxNSksVG0oMywiZGl2IiwxNiksVG0oNCwiZGl2IiwxNyksQW0oKSxSbSg1LCJkaXYiLDE4KSxUbSg2LCJkaXYiLDE1KSxUbSg3LCJkaXYiLDE2KSxUbSg4LCJkaXYiLDE3KSxBbSgpLHptKCkpfWZ1bmN0aW9uIG5WKHQsZSl7MSZ0JiYoUm0oMCwiZGl2IiwxOSksWG0oMSwxKSxBbSgpKX1mdW5jdGlvbiBvVih0LGUpe2lmKDEmdCYmKE5tKDApLFhtKDEsMiksUm0oMiwic3BhbiIpLGt1KDMpLEFtKCksem0oKSksMiZ0KXtjb25zdCB0PVltKDIpO3JjKDMpLFN1KHQuX2NvbnRyb2wucGxhY2Vob2xkZXIpfX1mdW5jdGlvbiBpVih0LGUpezEmdCYmWG0oMCwzLFsiKm5nU3dpdGNoQ2FzZSIsInRydWUiXSl9ZnVuY3Rpb24gYVYodCxlKXsxJnQmJihSbSgwLCJzcGFuIiwyMyksa3UoMSwiICoiKSxBbSgpKX1mdW5jdGlvbiByVih0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsImxhYmVsIiwyMCwyMSksVm0oImNka09ic2VydmVDb250ZW50IiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgpLnVwZGF0ZU91dGxpbmVHYXAoKX0pKSxRcCgyLG9WLDQsMSwibmctY29udGFpbmVyIiwxMiksUXAoMyxpViwxLDAsIm5nLWNvbnRlbnQiLDEyKSxRcCg0LGFWLDIsMCwic3BhbiIsMjIpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKCk7cHUoIm1hdC1lbXB0eSIsdC5fY29udHJvbC5lbXB0eSYmIXQuX3Nob3VsZEFsd2F5c0Zsb2F0KCkpKCJtYXQtZm9ybS1maWVsZC1lbXB0eSIsdC5fY29udHJvbC5lbXB0eSYmIXQuX3Nob3VsZEFsd2F5c0Zsb2F0KCkpKCJtYXQtYWNjZW50IiwiYWNjZW50Ij09dC5jb2xvcikoIm1hdC13YXJuIiwid2FybiI9PXQuY29sb3IpLERtKCJjZGtPYnNlcnZlQ29udGVudERpc2FibGVkIiwib3V0bGluZSIhPXQuYXBwZWFyYW5jZSkoImlkIix0Ll9sYWJlbElkKSgibmdTd2l0Y2giLHQuX2hhc0xhYmVsKCkpLGpwKCJmb3IiLHQuX2NvbnRyb2wuaWQpKCJhcmlhLW93bnMiLHQuX2NvbnRyb2wuaWQpLHJjKDIpLERtKCJuZ1N3aXRjaENhc2UiLCExKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIiwhMCkscmMoMSksRG0oIm5nSWYiLCF0LmhpZGVSZXF1aXJlZE1hcmtlciYmdC5fY29udHJvbC5yZXF1aXJlZCYmIXQuX2NvbnRyb2wuZGlzYWJsZWQpfX1mdW5jdGlvbiBzVih0LGUpezEmdCYmKFJtKDAsImRpdiIsMjQpLFhtKDEsNCksQW0oKSl9ZnVuY3Rpb24gbFYodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDI1LDI2KSxUbSgyLCJzcGFuIiwyNyksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoMikscHUoIm1hdC1hY2NlbnQiLCJhY2NlbnQiPT10LmNvbG9yKSgibWF0LXdhcm4iLCJ3YXJuIj09dC5jb2xvcil9fWZ1bmN0aW9uIGNWKHQsZSl7MSZ0JiYoUm0oMCwiZGl2IiksWG0oMSw1KSxBbSgpKSwyJnQmJkRtKCJAdHJhbnNpdGlvbk1lc3NhZ2VzIixZbSgpLl9zdWJzY3JpcHRBbmltYXRpb25TdGF0ZSl9ZnVuY3Rpb24gZFYodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDMxKSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMik7RG0oImlkIix0Ll9oaW50TGFiZWxJZCkscmMoMSksU3UodC5oaW50TGFiZWwpfX1mdW5jdGlvbiBwVih0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsMjgpLFFwKDEsZFYsMiwyLCJkaXYiLDI5KSxYbSgyLDYpLFRtKDMsImRpdiIsMzApLFhtKDQsNyksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7RG0oIkB0cmFuc2l0aW9uTWVzc2FnZXMiLHQuX3N1YnNjcmlwdEFuaW1hdGlvblN0YXRlKSxyYygxKSxEbSgibmdJZiIsdC5oaW50TGFiZWwpfX1jb25zdCBtVj1bIioiLFtbIiIsIm1hdFByZWZpeCIsIiJdXSxbWyJtYXQtcGxhY2Vob2xkZXIiXV0sW1sibWF0LWxhYmVsIl1dLFtbIiIsIm1hdFN1ZmZpeCIsIiJdXSxbWyJtYXQtZXJyb3IiXV0sW1sibWF0LWhpbnQiLDMsImFsaWduIiwiZW5kIl1dLFtbIm1hdC1oaW50IiwiYWxpZ24iLCJlbmQiXV1dO2xldCB1Vj0wO2NvbnN0IGZWPW5ldyBHYSgiTWF0RXJyb3IiKTtjbGFzcyBnVntjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuaWQ9Im1hdC1lcnJvci0iK3VWKyssdHx8ZS5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1saXZlIiwicG9saXRlIil9fWdWLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxnVikoTmEoImFyaWEtbGl2ZSIpLFNtKGhnKSl9LGdWLsm1ZGlyPWxvKHt0eXBlOmdWLHNlbGVjdG9yczpbWyJtYXQtZXJyb3IiXV0saG9zdEF0dHJzOlsiYXJpYS1hdG9taWMiLCJ0cnVlIiwxLCJtYXQtZXJyb3IiXSxob3N0VmFyczoxLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZqcCgiaWQiLG4uaWQpfSxpbnB1dHM6e2lkOiJpZCJ9LGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6ZlYsdXNlRXhpc3Rpbmc6Z1Z9XSldfSksZ1YuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6amEsYXJnczpbImFyaWEtbGl2ZSJdfV19LHt0eXBlOmhnfV0sZ1YucHJvcERlY29yYXRvcnM9e2lkOlt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGdWLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC1lcnJvciIsaG9zdDp7Y2xhc3M6Im1hdC1lcnJvciIsIlthdHRyLmlkXSI6ImlkIiwiYXJpYS1hdG9taWMiOiJ0cnVlIn0scHJvdmlkZXJzOlt7cHJvdmlkZTpmVix1c2VFeGlzdGluZzpnVn1dfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmphLGFyZ3M6WyJhcmlhLWxpdmUiXX1dfSx7dHlwZTpoZ31dfSkse2lkOlt7dHlwZTp4eX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBoVj17dHJhbnNpdGlvbk1lc3NhZ2VzOm54KCJ0cmFuc2l0aW9uTWVzc2FnZXMiLFtyeCgiZW50ZXIiLGF4KHtvcGFjaXR5OjEsdHJhbnNmb3JtOiJ0cmFuc2xhdGVZKDAlKSJ9KSksbHgoInZvaWQgPT4gZW50ZXIiLFtheCh7b3BhY2l0eTowLHRyYW5zZm9ybToidHJhbnNsYXRlWSgtNXB4KSJ9KSxveCgiMzAwbXMgY3ViaWMtYmV6aWVyKDAuNTUsIDAsIDAuNTUsIDAuMikiKV0pXSl9OwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBiVnt9ZnVuY3Rpb24geVYodCl7cmV0dXJuIEVycm9yKGBBIGhpbnQgd2FzIGFscmVhZHkgZGVjbGFyZWQgZm9yICdhbGlnbj0iJHt0fSInLmApfWJWLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxiVil9LGJWLsm1ZGlyPWxvKHt0eXBlOmJWfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChiVixbe3R5cGU6Q3l9XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KbGV0IF9WPTA7Y29uc3QgQ1Y9bmV3IEdhKCJNYXRIaW50Iik7Y2xhc3MgTVZ7Y29uc3RydWN0b3IoKXt0aGlzLmFsaWduPSJzdGFydCIsdGhpcy5pZD0ibWF0LWhpbnQtIitfVisrfX1NVi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8TVYpfSxNVi7JtWRpcj1sbyh7dHlwZTpNVixzZWxlY3RvcnM6W1sibWF0LWhpbnQiXV0saG9zdEF0dHJzOlsxLCJtYXQtaGludCJdLGhvc3RWYXJzOjQsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJihqcCgiaWQiLG4uaWQpKCJhbGlnbiIsbnVsbCkscHUoIm1hdC1mb3JtLWZpZWxkLWhpbnQtZW5kIiwiZW5kIj09PW4uYWxpZ24pKX0saW5wdXRzOnthbGlnbjoiYWxpZ24iLGlkOiJpZCJ9LGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6Q1YsdXNlRXhpc3Rpbmc6TVZ9XSldfSksTVYucHJvcERlY29yYXRvcnM9e2FsaWduOlt7dHlwZTp4eX1dLGlkOlt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKE1WLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC1oaW50Iixob3N0OntjbGFzczoibWF0LWhpbnQiLCJbY2xhc3MubWF0LWZvcm0tZmllbGQtaGludC1lbmRdIjonYWxpZ24gPT09ICJlbmQiJywiW2F0dHIuaWRdIjoiaWQiLCJbYXR0ci5hbGlnbl0iOiJudWxsIn0scHJvdmlkZXJzOlt7cHJvdmlkZTpDVix1c2VFeGlzdGluZzpNVn1dfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5bXX0pLHthbGlnbjpbe3R5cGU6eHl9XSxpZDpbe3R5cGU6eHl9XX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgdlZ7fXZWLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx2Vil9LHZWLsm1ZGlyPWxvKHt0eXBlOnZWLHNlbGVjdG9yczpbWyJtYXQtbGFiZWwiXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHZWLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC1sYWJlbCJ9XX1dLG51bGwsbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyB4Vnt9eFYuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHhWKX0seFYuybVkaXI9bG8oe3R5cGU6eFYsc2VsZWN0b3JzOltbIm1hdC1wbGFjZWhvbGRlciJdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoeFYsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoibWF0LXBsYWNlaG9sZGVyIn1dfV0sbnVsbCxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IE9WPW5ldyBHYSgiTWF0UHJlZml4Iik7Y2xhc3MgUFZ7fVBWLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxQVil9LFBWLsm1ZGlyPWxvKHt0eXBlOlBWLHNlbGVjdG9yczpbWyIiLCJtYXRQcmVmaXgiLCIiXV0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTpPVix1c2VFeGlzdGluZzpQVn1dKV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFBWLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IlttYXRQcmVmaXhdIixwcm92aWRlcnM6W3twcm92aWRlOk9WLHVzZUV4aXN0aW5nOlBWfV19XX1dLG51bGwsbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCB3Vj1uZXcgR2EoIk1hdFN1ZmZpeCIpO2NsYXNzIGtWe31rVi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8a1YpfSxrVi7JtWRpcj1sbyh7dHlwZTprVixzZWxlY3RvcnM6W1siIiwibWF0U3VmZml4IiwiIl1dLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6d1YsdXNlRXhpc3Rpbmc6a1Z9XSldfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChrVixbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbWF0U3VmZml4XSIscHJvdmlkZXJzOlt7cHJvdmlkZTp3Vix1c2VFeGlzdGluZzprVn1dfV19XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KbGV0IFNWPTA7Y29uc3QgRFY9SkkoY2xhc3N7Y29uc3RydWN0b3IodCl7dGhpcy5fZWxlbWVudFJlZj10fX0sInByaW1hcnkiKSxFVj1uZXcgR2EoIk1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfT1BUSU9OUyIpLFJWPW5ldyBHYSgiTWF0Rm9ybUZpZWxkIik7Y2xhc3MgQVYgZXh0ZW5kcyBEVntjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyLHMpe3N1cGVyKHQpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmPWUsdGhpcy5fZGlyPW8sdGhpcy5fZGVmYXVsdHM9aSx0aGlzLl9wbGF0Zm9ybT1hLHRoaXMuX25nWm9uZT1yLHRoaXMuX291dGxpbmVHYXBDYWxjdWxhdGlvbk5lZWRlZEltbWVkaWF0ZWx5PSExLHRoaXMuX291dGxpbmVHYXBDYWxjdWxhdGlvbk5lZWRlZE9uU3RhYmxlPSExLHRoaXMuX2Rlc3Ryb3llZD1uZXcgSSx0aGlzLl9zaG93QWx3YXlzQW5pbWF0ZT0hMSx0aGlzLl9zdWJzY3JpcHRBbmltYXRpb25TdGF0ZT0iIix0aGlzLl9oaW50TGFiZWw9IiIsdGhpcy5faGludExhYmVsSWQ9Im1hdC1oaW50LSIrU1YrKyx0aGlzLl9sYWJlbElkPSJtYXQtZm9ybS1maWVsZC1sYWJlbC0iK1NWKyssdGhpcy5mbG9hdExhYmVsPXRoaXMuX2dldERlZmF1bHRGbG9hdExhYmVsU3RhdGUoKSx0aGlzLl9hbmltYXRpb25zRW5hYmxlZD0iTm9vcEFuaW1hdGlvbnMiIT09cyx0aGlzLmFwcGVhcmFuY2U9aSYmaS5hcHBlYXJhbmNlP2kuYXBwZWFyYW5jZToibGVnYWN5Iix0aGlzLl9oaWRlUmVxdWlyZWRNYXJrZXI9ISghaXx8bnVsbD09aS5oaWRlUmVxdWlyZWRNYXJrZXIpJiZpLmhpZGVSZXF1aXJlZE1hcmtlcn1nZXQgYXBwZWFyYW5jZSgpe3JldHVybiB0aGlzLl9hcHBlYXJhbmNlfXNldCBhcHBlYXJhbmNlKHQpe2NvbnN0IGU9dGhpcy5fYXBwZWFyYW5jZTt0aGlzLl9hcHBlYXJhbmNlPXR8fHRoaXMuX2RlZmF1bHRzJiZ0aGlzLl9kZWZhdWx0cy5hcHBlYXJhbmNlfHwibGVnYWN5Iiwib3V0bGluZSI9PT10aGlzLl9hcHBlYXJhbmNlJiZlIT09dCYmKHRoaXMuX291dGxpbmVHYXBDYWxjdWxhdGlvbk5lZWRlZE9uU3RhYmxlPSEwKX1nZXQgaGlkZVJlcXVpcmVkTWFya2VyKCl7cmV0dXJuIHRoaXMuX2hpZGVSZXF1aXJlZE1hcmtlcn1zZXQgaGlkZVJlcXVpcmVkTWFya2VyKHQpe3RoaXMuX2hpZGVSZXF1aXJlZE1hcmtlcj15eih0KX1fc2hvdWxkQWx3YXlzRmxvYXQoKXtyZXR1cm4iYWx3YXlzIj09PXRoaXMuZmxvYXRMYWJlbCYmIXRoaXMuX3Nob3dBbHdheXNBbmltYXRlfV9jYW5MYWJlbEZsb2F0KCl7cmV0dXJuIm5ldmVyIiE9PXRoaXMuZmxvYXRMYWJlbH1nZXQgaGludExhYmVsKCl7cmV0dXJuIHRoaXMuX2hpbnRMYWJlbH1zZXQgaGludExhYmVsKHQpe3RoaXMuX2hpbnRMYWJlbD10LHRoaXMuX3Byb2Nlc3NIaW50cygpfWdldCBmbG9hdExhYmVsKCl7cmV0dXJuImxlZ2FjeSIhPT10aGlzLmFwcGVhcmFuY2UmJiJuZXZlciI9PT10aGlzLl9mbG9hdExhYmVsPyJhdXRvIjp0aGlzLl9mbG9hdExhYmVsfXNldCBmbG9hdExhYmVsKHQpe3QhPT10aGlzLl9mbG9hdExhYmVsJiYodGhpcy5fZmxvYXRMYWJlbD10fHx0aGlzLl9nZXREZWZhdWx0RmxvYXRMYWJlbFN0YXRlKCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpfWdldCBfY29udHJvbCgpe3JldHVybiB0aGlzLl9leHBsaWNpdEZvcm1GaWVsZENvbnRyb2x8fHRoaXMuX2NvbnRyb2xOb25TdGF0aWN8fHRoaXMuX2NvbnRyb2xTdGF0aWN9c2V0IF9jb250cm9sKHQpe3RoaXMuX2V4cGxpY2l0Rm9ybUZpZWxkQ29udHJvbD10fWdldExhYmVsSWQoKXtyZXR1cm4gdGhpcy5faGFzRmxvYXRpbmdMYWJlbCgpP3RoaXMuX2xhYmVsSWQ6bnVsbH1nZXRDb25uZWN0ZWRPdmVybGF5T3JpZ2luKCl7cmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25Db250YWluZXJSZWZ8fHRoaXMuX2VsZW1lbnRSZWZ9bmdBZnRlckNvbnRlbnRJbml0KCl7dGhpcy5fdmFsaWRhdGVDb250cm9sQ2hpbGQoKTtjb25zdCB0PXRoaXMuX2NvbnRyb2w7dC5jb250cm9sVHlwZSYmdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoYG1hdC1mb3JtLWZpZWxkLXR5cGUtJHt0LmNvbnRyb2xUeXBlfWApLHQuc3RhdGVDaGFuZ2VzLnBpcGUoTmUobnVsbCkpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLl92YWxpZGF0ZVBsYWNlaG9sZGVycygpLHRoaXMuX3N5bmNEZXNjcmliZWRCeUlkcygpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfSkpLHQubmdDb250cm9sJiZ0Lm5nQ29udHJvbC52YWx1ZUNoYW5nZXMmJnQubmdDb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKEllKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoKCk9PnRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKSksdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e3RoaXMuX25nWm9uZS5vblN0YWJsZS5waXBlKEllKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLl9vdXRsaW5lR2FwQ2FsY3VsYXRpb25OZWVkZWRPblN0YWJsZSYmdGhpcy51cGRhdGVPdXRsaW5lR2FwKCl9KSl9KSkscmUodGhpcy5fcHJlZml4Q2hpbGRyZW4uY2hhbmdlcyx0aGlzLl9zdWZmaXhDaGlsZHJlbi5jaGFuZ2VzKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fb3V0bGluZUdhcENhbGN1bGF0aW9uTmVlZGVkT25TdGFibGU9ITAsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9KSksdGhpcy5faGludENoaWxkcmVuLmNoYW5nZXMucGlwZShOZShudWxsKSkuc3Vic2NyaWJlKCgoKT0+e3RoaXMuX3Byb2Nlc3NIaW50cygpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfSkpLHRoaXMuX2Vycm9yQ2hpbGRyZW4uY2hhbmdlcy5waXBlKE5lKG51bGwpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fc3luY0Rlc2NyaWJlZEJ5SWRzKCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9KSksdGhpcy5fZGlyJiZ0aGlzLl9kaXIuY2hhbmdlLnBpcGUoSWUodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgoKT0+eyJmdW5jdGlvbiI9PXR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU/dGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKCk9PnRoaXMudXBkYXRlT3V0bGluZUdhcCgpKSl9KSk6dGhpcy51cGRhdGVPdXRsaW5lR2FwKCl9KSl9bmdBZnRlckNvbnRlbnRDaGVja2VkKCl7dGhpcy5fdmFsaWRhdGVDb250cm9sQ2hpbGQoKSx0aGlzLl9vdXRsaW5lR2FwQ2FsY3VsYXRpb25OZWVkZWRJbW1lZGlhdGVseSYmdGhpcy51cGRhdGVPdXRsaW5lR2FwKCl9bmdBZnRlclZpZXdJbml0KCl7dGhpcy5fc3Vic2NyaXB0QW5pbWF0aW9uU3RhdGU9ImVudGVyIix0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9kZXN0cm95ZWQubmV4dCgpLHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpfV9zaG91bGRGb3J3YXJkKHQpe2NvbnN0IGU9dGhpcy5fY29udHJvbD90aGlzLl9jb250cm9sLm5nQ29udHJvbDpudWxsO3JldHVybiBlJiZlW3RdfV9oYXNQbGFjZWhvbGRlcigpe3JldHVybiEhKHRoaXMuX2NvbnRyb2wmJnRoaXMuX2NvbnRyb2wucGxhY2Vob2xkZXJ8fHRoaXMuX3BsYWNlaG9sZGVyQ2hpbGQpfV9oYXNMYWJlbCgpe3JldHVybiEoIXRoaXMuX2xhYmVsQ2hpbGROb25TdGF0aWMmJiF0aGlzLl9sYWJlbENoaWxkU3RhdGljKX1fc2hvdWxkTGFiZWxGbG9hdCgpe3JldHVybiB0aGlzLl9jYW5MYWJlbEZsb2F0KCkmJih0aGlzLl9jb250cm9sJiZ0aGlzLl9jb250cm9sLnNob3VsZExhYmVsRmxvYXR8fHRoaXMuX3Nob3VsZEFsd2F5c0Zsb2F0KCkpfV9oaWRlQ29udHJvbFBsYWNlaG9sZGVyKCl7cmV0dXJuImxlZ2FjeSI9PT10aGlzLmFwcGVhcmFuY2UmJiF0aGlzLl9oYXNMYWJlbCgpfHx0aGlzLl9oYXNMYWJlbCgpJiYhdGhpcy5fc2hvdWxkTGFiZWxGbG9hdCgpfV9oYXNGbG9hdGluZ0xhYmVsKCl7cmV0dXJuIHRoaXMuX2hhc0xhYmVsKCl8fCJsZWdhY3kiPT09dGhpcy5hcHBlYXJhbmNlJiZ0aGlzLl9oYXNQbGFjZWhvbGRlcigpfV9nZXREaXNwbGF5ZWRNZXNzYWdlcygpe3JldHVybiB0aGlzLl9lcnJvckNoaWxkcmVuJiZ0aGlzLl9lcnJvckNoaWxkcmVuLmxlbmd0aD4wJiZ0aGlzLl9jb250cm9sLmVycm9yU3RhdGU/ImVycm9yIjoiaGludCJ9X2FuaW1hdGVBbmRMb2NrTGFiZWwoKXt0aGlzLl9oYXNGbG9hdGluZ0xhYmVsKCkmJnRoaXMuX2NhbkxhYmVsRmxvYXQoKSYmKHRoaXMuX2FuaW1hdGlvbnNFbmFibGVkJiZ0aGlzLl9sYWJlbCYmKHRoaXMuX3Nob3dBbHdheXNBbmltYXRlPSEwLG9lKHRoaXMuX2xhYmVsLm5hdGl2ZUVsZW1lbnQsInRyYW5zaXRpb25lbmQiKS5waXBlKGJlKDEpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fc2hvd0Fsd2F5c0FuaW1hdGU9ITF9KSkpLHRoaXMuZmxvYXRMYWJlbD0iYWx3YXlzIix0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSl9X3ZhbGlkYXRlUGxhY2Vob2xkZXJzKCl7aWYodGhpcy5fY29udHJvbC5wbGFjZWhvbGRlciYmdGhpcy5fcGxhY2Vob2xkZXJDaGlsZCYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KdGhyb3coZnVuY3Rpb24gdCgpe3JldHVybiBFcnJvcigiUGxhY2Vob2xkZXIgYXR0cmlidXRlIGFuZCBjaGlsZCBlbGVtZW50IHdlcmUgYm90aCBzcGVjaWZpZWQuIil9KSgpfV9wcm9jZXNzSGludHMoKXt0aGlzLl92YWxpZGF0ZUhpbnRzKCksdGhpcy5fc3luY0Rlc2NyaWJlZEJ5SWRzKCl9X3ZhbGlkYXRlSGludHMoKXtpZih0aGlzLl9oaW50Q2hpbGRyZW4mJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSl7bGV0IHQsZTt0aGlzLl9oaW50Q2hpbGRyZW4uZm9yRWFjaCgobj0+e2lmKCJzdGFydCI9PT1uLmFsaWduKXtpZih0fHx0aGlzLmhpbnRMYWJlbCl0aHJvdyB5Vigic3RhcnQiKTt0PW59ZWxzZSBpZigiZW5kIj09PW4uYWxpZ24pe2lmKGUpdGhyb3cgeVYoImVuZCIpO2U9bn19KSl9fV9nZXREZWZhdWx0RmxvYXRMYWJlbFN0YXRlKCl7cmV0dXJuIHRoaXMuX2RlZmF1bHRzJiZ0aGlzLl9kZWZhdWx0cy5mbG9hdExhYmVsfHwiYXV0byJ9X3N5bmNEZXNjcmliZWRCeUlkcygpe2lmKHRoaXMuX2NvbnRyb2wpe2xldCB0PVtdO2lmKHRoaXMuX2NvbnRyb2wudXNlckFyaWFEZXNjcmliZWRCeSYmInN0cmluZyI9PXR5cGVvZiB0aGlzLl9jb250cm9sLnVzZXJBcmlhRGVzY3JpYmVkQnkmJnQucHVzaCguLi50aGlzLl9jb250cm9sLnVzZXJBcmlhRGVzY3JpYmVkQnkuc3BsaXQoIiAiKSksImhpbnQiPT09dGhpcy5fZ2V0RGlzcGxheWVkTWVzc2FnZXMoKSl7Y29uc3QgZT10aGlzLl9oaW50Q2hpbGRyZW4/dGhpcy5faGludENoaWxkcmVuLmZpbmQoKHQ9PiJzdGFydCI9PT10LmFsaWduKSk6bnVsbCxuPXRoaXMuX2hpbnRDaGlsZHJlbj90aGlzLl9oaW50Q2hpbGRyZW4uZmluZCgodD0+ImVuZCI9PT10LmFsaWduKSk6bnVsbDtlP3QucHVzaChlLmlkKTp0aGlzLl9oaW50TGFiZWwmJnQucHVzaCh0aGlzLl9oaW50TGFiZWxJZCksbiYmdC5wdXNoKG4uaWQpfWVsc2UgdGhpcy5fZXJyb3JDaGlsZHJlbiYmdC5wdXNoKC4uLnRoaXMuX2Vycm9yQ2hpbGRyZW4ubWFwKCh0PT50LmlkKSkpO3RoaXMuX2NvbnRyb2wuc2V0RGVzY3JpYmVkQnlJZHModCl9fV92YWxpZGF0ZUNvbnRyb2xDaGlsZCgpe2lmKCF0aGlzLl9jb250cm9sJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkpdGhyb3coZnVuY3Rpb24gdCgpe3JldHVybiBFcnJvcigibWF0LWZvcm0tZmllbGQgbXVzdCBjb250YWluIGEgTWF0Rm9ybUZpZWxkQ29udHJvbC4iKX0pKCl9dXBkYXRlT3V0bGluZUdhcCgpe2NvbnN0IHQ9dGhpcy5fbGFiZWw/dGhpcy5fbGFiZWwubmF0aXZlRWxlbWVudDpudWxsO2lmKCJvdXRsaW5lIiE9PXRoaXMuYXBwZWFyYW5jZXx8IXR8fCF0LmNoaWxkcmVuLmxlbmd0aHx8IXQudGV4dENvbnRlbnQudHJpbSgpKXJldHVybjtpZighdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKXJldHVybjtpZighdGhpcy5faXNBdHRhY2hlZFRvRE9NKCkpcmV0dXJuIHZvaWQodGhpcy5fb3V0bGluZUdhcENhbGN1bGF0aW9uTmVlZGVkSW1tZWRpYXRlbHk9ITApO2xldCBlPTAsbj0wO2NvbnN0IG89dGhpcy5fY29ubmVjdGlvbkNvbnRhaW5lclJlZi5uYXRpdmVFbGVtZW50LGk9by5xdWVyeVNlbGVjdG9yQWxsKCIubWF0LWZvcm0tZmllbGQtb3V0bGluZS1zdGFydCIpLGE9by5xdWVyeVNlbGVjdG9yQWxsKCIubWF0LWZvcm0tZmllbGQtb3V0bGluZS1nYXAiKTtpZih0aGlzLl9sYWJlbCYmdGhpcy5fbGFiZWwubmF0aXZlRWxlbWVudC5jaGlsZHJlbi5sZW5ndGgpe2NvbnN0IGk9by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZigwPT09aS53aWR0aCYmMD09PWkuaGVpZ2h0KXJldHVybiB0aGlzLl9vdXRsaW5lR2FwQ2FsY3VsYXRpb25OZWVkZWRPblN0YWJsZT0hMCx2b2lkKHRoaXMuX291dGxpbmVHYXBDYWxjdWxhdGlvbk5lZWRlZEltbWVkaWF0ZWx5PSExKTtjb25zdCBhPXRoaXMuX2dldFN0YXJ0RW5kKGkpLHI9dC5jaGlsZHJlbixzPXRoaXMuX2dldFN0YXJ0RW5kKHJbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO2xldCBsPTA7Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0KyspbCs9clt0XS5vZmZzZXRXaWR0aDtlPU1hdGguYWJzKHMtYSktNSxuPWw+MD8uNzUqbCsxMDowfWZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7dCsrKWlbdF0uc3R5bGUud2lkdGg9YCR7ZX1weGA7Zm9yKGxldCB0PTA7dDxhLmxlbmd0aDt0KyspYVt0XS5zdHlsZS53aWR0aD1gJHtufXB4YDt0aGlzLl9vdXRsaW5lR2FwQ2FsY3VsYXRpb25OZWVkZWRPblN0YWJsZT10aGlzLl9vdXRsaW5lR2FwQ2FsY3VsYXRpb25OZWVkZWRJbW1lZGlhdGVseT0hMX1fZ2V0U3RhcnRFbmQodCl7cmV0dXJuIHRoaXMuX2RpciYmInJ0bCI9PT10aGlzLl9kaXIudmFsdWU/dC5yaWdodDp0LmxlZnR9X2lzQXR0YWNoZWRUb0RPTSgpe2NvbnN0IHQ9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O2lmKHQuZ2V0Um9vdE5vZGUpe2NvbnN0IGU9dC5nZXRSb290Tm9kZSgpO3JldHVybiBlJiZlIT09dH1yZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zKHQpfX1BVi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8QVYpKFNtKGhnKSxTbShVZyksU20oaGcpLFNtKEhJLDgpLFNtKEVWLDgpLFNtKHd6KSxTbShhXyksU20oVlAsOCkpfSxBVi7JtWNtcD10byh7dHlwZTpBVixzZWxlY3RvcnM6W1sibWF0LWZvcm0tZmllbGQiXV0sY29udGVudFF1ZXJpZXM6ZnVuY3Rpb24gdChlLG4sbyl7aWYoMSZlJiYoJGgobyxiViw1KSwkaChvLGJWLDcpLCRoKG8sdlYsNSksJGgobyx2Viw3KSwkaChvLHhWLDUpLCRoKG8sZlYsNSksJGgobyxDViw1KSwkaChvLE9WLDUpLCRoKG8sd1YsNSkpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uX2NvbnRyb2xOb25TdGF0aWM9dC5maXJzdCksSmgodD10YigpKSYmKG4uX2NvbnRyb2xTdGF0aWM9dC5maXJzdCksSmgodD10YigpKSYmKG4uX2xhYmVsQ2hpbGROb25TdGF0aWM9dC5maXJzdCksSmgodD10YigpKSYmKG4uX2xhYmVsQ2hpbGRTdGF0aWM9dC5maXJzdCksSmgodD10YigpKSYmKG4uX3BsYWNlaG9sZGVyQ2hpbGQ9dC5maXJzdCksSmgodD10YigpKSYmKG4uX2Vycm9yQ2hpbGRyZW49dCksSmgodD10YigpKSYmKG4uX2hpbnRDaGlsZHJlbj10KSxKaCh0PXRiKCkpJiYobi5fcHJlZml4Q2hpbGRyZW49dCksSmgodD10YigpKSYmKG4uX3N1ZmZpeENoaWxkcmVuPXQpfX0sdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihRaChKQiw1KSxRaChRQiw3KSxRaCgkQiw1KSxRaCh0Viw1KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi51bmRlcmxpbmVSZWY9dC5maXJzdCksSmgodD10YigpKSYmKG4uX2Nvbm5lY3Rpb25Db250YWluZXJSZWY9dC5maXJzdCksSmgodD10YigpKSYmKG4uX2lucHV0Q29udGFpbmVyUmVmPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLl9sYWJlbD10LmZpcnN0KX19LGhvc3RBdHRyczpbMSwibWF0LWZvcm0tZmllbGQiXSxob3N0VmFyczo0MCxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmcHUoIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQiLCJzdGFuZGFyZCI9PW4uYXBwZWFyYW5jZSkoIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCIsImZpbGwiPT1uLmFwcGVhcmFuY2UpKCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUiLCJvdXRsaW5lIj09bi5hcHBlYXJhbmNlKSgibWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kiLCJsZWdhY3kiPT1uLmFwcGVhcmFuY2UpKCJtYXQtZm9ybS1maWVsZC1pbnZhbGlkIixuLl9jb250cm9sLmVycm9yU3RhdGUpKCJtYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQiLG4uX2NhbkxhYmVsRmxvYXQoKSkoIm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCIsbi5fc2hvdWxkTGFiZWxGbG9hdCgpKSgibWF0LWZvcm0tZmllbGQtaGFzLWxhYmVsIixuLl9oYXNGbG9hdGluZ0xhYmVsKCkpKCJtYXQtZm9ybS1maWVsZC1oaWRlLXBsYWNlaG9sZGVyIixuLl9oaWRlQ29udHJvbFBsYWNlaG9sZGVyKCkpKCJtYXQtZm9ybS1maWVsZC1kaXNhYmxlZCIsbi5fY29udHJvbC5kaXNhYmxlZCkoIm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsZWQiLG4uX2NvbnRyb2wuYXV0b2ZpbGxlZCkoIm1hdC1mb2N1c2VkIixuLl9jb250cm9sLmZvY3VzZWQpKCJuZy11bnRvdWNoZWQiLG4uX3Nob3VsZEZvcndhcmQoInVudG91Y2hlZCIpKSgibmctdG91Y2hlZCIsbi5fc2hvdWxkRm9yd2FyZCgidG91Y2hlZCIpKSgibmctcHJpc3RpbmUiLG4uX3Nob3VsZEZvcndhcmQoInByaXN0aW5lIikpKCJuZy1kaXJ0eSIsbi5fc2hvdWxkRm9yd2FyZCgiZGlydHkiKSkoIm5nLXZhbGlkIixuLl9zaG91bGRGb3J3YXJkKCJ2YWxpZCIpKSgibmctaW52YWxpZCIsbi5fc2hvdWxkRm9yd2FyZCgiaW52YWxpZCIpKSgibmctcGVuZGluZyIsbi5fc2hvdWxkRm9yd2FyZCgicGVuZGluZyIpKSgiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLCFuLl9hbmltYXRpb25zRW5hYmxlZCl9LGlucHV0czp7Y29sb3I6ImNvbG9yIixmbG9hdExhYmVsOiJmbG9hdExhYmVsIixhcHBlYXJhbmNlOiJhcHBlYXJhbmNlIixoaWRlUmVxdWlyZWRNYXJrZXI6ImhpZGVSZXF1aXJlZE1hcmtlciIsaGludExhYmVsOiJoaW50TGFiZWwifSxleHBvcnRBczpbIm1hdEZvcm1GaWVsZCJdLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6UlYsdXNlRXhpc3Rpbmc6QVZ9XSkseHBdLG5nQ29udGVudFNlbGVjdG9yczpbIioiLCJbbWF0UHJlZml4XSIsIm1hdC1wbGFjZWhvbGRlciIsIm1hdC1sYWJlbCIsIlttYXRTdWZmaXhdIiwibWF0LWVycm9yIiwibWF0LWhpbnQ6bm90KFthbGlnbj0nZW5kJ10pIiwibWF0LWhpbnRbYWxpZ249J2VuZCddIl0sZGVjbHM6MTUsdmFyczo4LGNvbnN0czpbWzEsIm1hdC1mb3JtLWZpZWxkLXdyYXBwZXIiXSxbMSwibWF0LWZvcm0tZmllbGQtZmxleCIsMywiY2xpY2siXSxbImNvbm5lY3Rpb25Db250YWluZXIiLCIiXSxbNCwibmdJZiJdLFsiY2xhc3MiLCJtYXQtZm9ybS1maWVsZC1wcmVmaXgiLDQsIm5nSWYiXSxbMSwibWF0LWZvcm0tZmllbGQtaW5maXgiXSxbImlucHV0Q29udGFpbmVyIiwiIl0sWzEsIm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIiXSxbImNsYXNzIiwibWF0LWZvcm0tZmllbGQtbGFiZWwiLDMsImNka09ic2VydmVDb250ZW50RGlzYWJsZWQiLCJpZCIsIm1hdC1lbXB0eSIsIm1hdC1mb3JtLWZpZWxkLWVtcHR5IiwibWF0LWFjY2VudCIsIm1hdC13YXJuIiwibmdTd2l0Y2giLCJjZGtPYnNlcnZlQ29udGVudCIsNCwibmdJZiJdLFsiY2xhc3MiLCJtYXQtZm9ybS1maWVsZC1zdWZmaXgiLDQsIm5nSWYiXSxbImNsYXNzIiwibWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIiw0LCJuZ0lmIl0sWzEsIm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyIiwzLCJuZ1N3aXRjaCJdLFs0LCJuZ1N3aXRjaENhc2UiXSxbImNsYXNzIiwibWF0LWZvcm0tZmllbGQtaGludC13cmFwcGVyIiw0LCJuZ1N3aXRjaENhc2UiXSxbMSwibWF0LWZvcm0tZmllbGQtb3V0bGluZSJdLFsxLCJtYXQtZm9ybS1maWVsZC1vdXRsaW5lLXN0YXJ0Il0sWzEsIm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZ2FwIl0sWzEsIm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZW5kIl0sWzEsIm1hdC1mb3JtLWZpZWxkLW91dGxpbmUiLCJtYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrIl0sWzEsIm1hdC1mb3JtLWZpZWxkLXByZWZpeCJdLFsxLCJtYXQtZm9ybS1maWVsZC1sYWJlbCIsMywiY2RrT2JzZXJ2ZUNvbnRlbnREaXNhYmxlZCIsImlkIiwibmdTd2l0Y2giLCJjZGtPYnNlcnZlQ29udGVudCJdLFsibGFiZWwiLCIiXSxbImNsYXNzIiwibWF0LXBsYWNlaG9sZGVyLXJlcXVpcmVkIG1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlciIsImFyaWEtaGlkZGVuIiwidHJ1ZSIsNCwibmdJZiJdLFsiYXJpYS1oaWRkZW4iLCJ0cnVlIiwxLCJtYXQtcGxhY2Vob2xkZXItcmVxdWlyZWQiLCJtYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXIiXSxbMSwibWF0LWZvcm0tZmllbGQtc3VmZml4Il0sWzEsIm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSJdLFsidW5kZXJsaW5lIiwiIl0sWzEsIm1hdC1mb3JtLWZpZWxkLXJpcHBsZSJdLFsxLCJtYXQtZm9ybS1maWVsZC1oaW50LXdyYXBwZXIiXSxbImNsYXNzIiwibWF0LWhpbnQiLDMsImlkIiw0LCJuZ0lmIl0sWzEsIm1hdC1mb3JtLWZpZWxkLWhpbnQtc3BhY2VyIl0sWzEsIm1hdC1oaW50IiwzLCJpZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoWm0obVYpLFJtKDAsImRpdiIsMCksUm0oMSwiZGl2IiwxLDIpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX2NvbnRyb2wub25Db250YWluZXJDbGljayYmbi5fY29udHJvbC5vbkNvbnRhaW5lckNsaWNrKGUpfSkpLFFwKDMsZVYsOSwwLCJuZy1jb250YWluZXIiLDMpLFFwKDQsblYsMiwwLCJkaXYiLDQpLFJtKDUsImRpdiIsNSw2KSxYbSg3KSxSbSg4LCJzcGFuIiw3KSxRcCg5LHJWLDUsMTYsImxhYmVsIiw4KSxBbSgpLEFtKCksUXAoMTAsc1YsMiwwLCJkaXYiLDkpLEFtKCksUXAoMTEsbFYsMyw0LCJkaXYiLDEwKSxSbSgxMiwiZGl2IiwxMSksUXAoMTMsY1YsMiwxLCJkaXYiLDEyKSxRcCgxNCxwViw1LDIsImRpdiIsMTMpLEFtKCksQW0oKSksMiZlJiYocmMoMyksRG0oIm5nSWYiLCJvdXRsaW5lIj09bi5hcHBlYXJhbmNlKSxyYygxKSxEbSgibmdJZiIsbi5fcHJlZml4Q2hpbGRyZW4ubGVuZ3RoKSxyYyg1KSxEbSgibmdJZiIsbi5faGFzRmxvYXRpbmdMYWJlbCgpKSxyYygxKSxEbSgibmdJZiIsbi5fc3VmZml4Q2hpbGRyZW4ubGVuZ3RoKSxyYygxKSxEbSgibmdJZiIsIm91dGxpbmUiIT1uLmFwcGVhcmFuY2UpLHJjKDEpLERtKCJuZ1N3aXRjaCIsbi5fZ2V0RGlzcGxheWVkTWVzc2FnZXMoKSkscmMoMSksRG0oIm5nU3dpdGNoQ2FzZSIsImVycm9yIikscmMoMSksRG0oIm5nU3dpdGNoQ2FzZSIsImhpbnQiKSl9LGRpcmVjdGl2ZXM6W2RNLGZNLGdNLGp6XSxzdHlsZXM6WyIubWF0LWZvcm0tZmllbGR7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246cmVsYXRpdmU7dGV4dC1hbGlnbjpsZWZ0fVtkaXI9cnRsXSAubWF0LWZvcm0tZmllbGR7dGV4dC1hbGlnbjpyaWdodH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcntwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWZvcm0tZmllbGQtZmxleHtkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmJhc2VsaW5lO2JveC1zaXppbmc6Ym9yZGVyLWJveDt3aWR0aDoxMDAlfS5tYXQtZm9ybS1maWVsZC1wcmVmaXgsLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeHt3aGl0ZS1zcGFjZTpub3dyYXA7ZmxleDpub25lO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtZm9ybS1maWVsZC1pbmZpeHtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXg6YXV0bzttaW4td2lkdGg6MDt3aWR0aDoxODBweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1pbmZpeHtib3JkZXItaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRyYW5zcGFyZW50LCB0cmFuc3BhcmVudCl9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJ7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO2JveC1zaXppbmc6Y29udGVudC1ib3g7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvdmVyZmxvdzpoaWRkZW47cG9pbnRlci1ldmVudHM6bm9uZX1bZGlyPXJ0bF0gLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJ7bGVmdDphdXRvO3JpZ2h0OjB9Lm1hdC1mb3JtLWZpZWxkLWxhYmVse3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDtmb250OmluaGVyaXQ7cG9pbnRlci1ldmVudHM6bm9uZTt3aWR0aDoxMDAlO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO292ZXJmbG93OmhpZGRlbjt0cmFuc2Zvcm0tb3JpZ2luOjAgMDt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxjb2xvciA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSx3aWR0aCA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtkaXNwbGF5Om5vbmV9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMDtsZWZ0OmF1dG87cmlnaHQ6MH0ubWF0LWZvcm0tZmllbGQtZW1wdHkubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2Rpc3BsYXk6YmxvY2t9Lm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbCsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7ZGlzcGxheTpub25lfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbCsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7ZGlzcGxheTpibG9jazt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtaW5wdXQtc2VydmVyW3BsYWNlaG9sZGVyXTpub3QoOnBsYWNlaG9sZGVyLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7ZGlzcGxheTpub25lfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbcGxhY2Vob2xkZXJdOm5vdCg6cGxhY2Vob2xkZXItc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHtkaXNwbGF5OmJsb2NrfS5tYXQtZm9ybS1maWVsZC1sYWJlbDpub3QoLm1hdC1mb3JtLWZpZWxkLWVtcHR5KXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNmb3JtOnNjYWxlM2QoMSwgMS4wMDAxLCAxKX0ubWF0LWZvcm0tZmllbGQtcmlwcGxle3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt3aWR0aDoxMDAlO3RyYW5zZm9ybS1vcmlnaW46NTAlO3RyYW5zZm9ybTpzY2FsZVgoMC41KTtvcGFjaXR5OjA7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDMwMG1zIGN1YmljLWJlemllcigwLjU1LCAwLCAwLjU1LCAwLjIpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7b3BhY2l0eToxO3RyYW5zZm9ybTpub25lO3RyYW5zaXRpb246dHJhbnNmb3JtIDMwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLG9wYWNpdHkgMTAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYmFja2dyb3VuZC1jb2xvciAzMDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7cG9zaXRpb246YWJzb2x1dGU7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjEwMCU7b3ZlcmZsb3c6aGlkZGVufS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlciAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1pY29ue3dpZHRoOjFlbTtoZWlnaHQ6MWVtO2ZvbnQtc2l6ZTppbmhlcml0O3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfS5tYXQtZm9ybS1maWVsZC1oaW50LXdyYXBwZXJ7ZGlzcGxheTpmbGV4fS5tYXQtZm9ybS1maWVsZC1oaW50LXNwYWNlcntmbGV4OjEgMCAxZW19Lm1hdC1lcnJvcntkaXNwbGF5OmJsb2NrfS5tYXQtZm9ybS1maWVsZC1jb250cm9sLXdyYXBwZXJ7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1mb3JtLWZpZWxkLWhpbnQtZW5ke29yZGVyOjF9Lm1hdC1mb3JtLWZpZWxkLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXt0cmFuc2l0aW9uOm5vbmV9XG4iLCcubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1mbGV4e2JvcmRlci1yYWRpdXM6NHB4IDRweCAwIDA7cGFkZGluZzouNzVlbSAuNzVlbSAwIC43NWVtfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtZmxleHtvdXRsaW5lOnNvbGlkIDFweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWZsZXh7b3V0bGluZTpkYXNoZWQgM3B4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZTo6YmVmb3Jle2NvbnRlbnQ6IiI7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MDtoZWlnaHQ6MXB4O3dpZHRoOjEwMCV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtcmlwcGxle2JvdHRvbTowO2hlaWdodDoycHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7aGVpZ2h0OjB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbDpub3QoLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkKSAubWF0LWZvcm0tZmllbGQtZmxleDpob3Zlcn4ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7b3BhY2l0eToxO3RyYW5zZm9ybTpub25lO3RyYW5zaXRpb246b3BhY2l0eSA2MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlOm5vdCgubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQpIC5tYXQtZm9ybS1maWVsZC1mbGV4OmhvdmVyfi5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7cGFkZGluZzowIDFlbX1cbicsJy5tYXQtaW5wdXQtZWxlbWVudHtmb250OmluaGVyaXQ7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjpjdXJyZW50Q29sb3I7Ym9yZGVyOm5vbmU7b3V0bGluZTpub25lO3BhZGRpbmc6MDttYXJnaW46MDt3aWR0aDoxMDAlO21heC13aWR0aDoxMDAlO3ZlcnRpY2FsLWFsaWduOmJvdHRvbTt0ZXh0LWFsaWduOmluaGVyaXQ7Ym94LXNpemluZzpjb250ZW50LWJveH0ubWF0LWlucHV0LWVsZW1lbnQ6LW1vei11aS1pbnZhbGlke2JveC1zaGFkb3c6bm9uZX0ubWF0LWlucHV0LWVsZW1lbnQ6Oi1tcy1jbGVhciwubWF0LWlucHV0LWVsZW1lbnQ6Oi1tcy1yZXZlYWx7ZGlzcGxheTpub25lfS5tYXQtaW5wdXQtZWxlbWVudCwubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtc2VhcmNoLWNhbmNlbC1idXR0b24sLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uLC5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1zZWFyY2gtcmVzdWx0cy1idXR0b24sLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LXNlYXJjaC1yZXN1bHRzLWRlY29yYXRpb257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmV9Lm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWNvbnRhY3RzLWF1dG8tZmlsbC1idXR0b24sLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWNhcHMtbG9jay1pbmRpY2F0b3IsLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWNyZWRlbnRpYWxzLWF1dG8tZmlsbC1idXR0b257dmlzaWJpbGl0eTpoaWRkZW59Lm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9ZGF0ZV0sLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9ZGF0ZXRpbWVdLC5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPWRhdGV0aW1lLWxvY2FsXSwubWF0LWlucHV0LWVsZW1lbnRbdHlwZT1tb250aF0sLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9d2Vla10sLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9dGltZV17bGluZS1oZWlnaHQ6MX0ubWF0LWlucHV0LWVsZW1lbnRbdHlwZT1kYXRlXTo6YWZ0ZXIsLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9ZGF0ZXRpbWVdOjphZnRlciwubWF0LWlucHV0LWVsZW1lbnRbdHlwZT1kYXRldGltZS1sb2NhbF06OmFmdGVyLC5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPW1vbnRoXTo6YWZ0ZXIsLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9d2Vla106OmFmdGVyLC5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPXRpbWVdOjphZnRlcntjb250ZW50OiIgIjt3aGl0ZS1zcGFjZTpwcmU7d2lkdGg6MXB4fS5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiwubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvciwubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtY2xlYXItYnV0dG9ue2ZvbnQtc2l6ZTouNzVlbX0ubWF0LWlucHV0LWVsZW1lbnQ6OnBsYWNlaG9sZGVyey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt0cmFuc2l0aW9uOmNvbG9yIDQwMG1zIDEzMy4zMzMzMzMzMzMzbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1pbnB1dC1lbGVtZW50OjpwbGFjZWhvbGRlcjotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7LW1zLXVzZXItc2VsZWN0OnRleHR9Lm1hdC1pbnB1dC1lbGVtZW50OjotbW96LXBsYWNlaG9sZGVyey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt0cmFuc2l0aW9uOmNvbG9yIDQwMG1zIDEzMy4zMzMzMzMzMzMzbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1pbnB1dC1lbGVtZW50OjotbW96LXBsYWNlaG9sZGVyOi1tcy1pbnB1dC1wbGFjZWhvbGRlcnstbXMtdXNlci1zZWxlY3Q6dGV4dH0ubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3RyYW5zaXRpb246Y29sb3IgNDAwbXMgMTMzLjMzMzMzMzMzMzNtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXI6LW1zLWlucHV0LXBsYWNlaG9sZGVyey1tcy11c2VyLXNlbGVjdDp0ZXh0fS5tYXQtaW5wdXQtZWxlbWVudDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3RyYW5zaXRpb246Y29sb3IgNDAwbXMgMTMzLjMzMzMzMzMzMzNtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWlucHV0LWVsZW1lbnQ6LW1zLWlucHV0LXBsYWNlaG9sZGVyOi1tcy1pbnB1dC1wbGFjZWhvbGRlcnstbXMtdXNlci1zZWxlY3Q6dGV4dH0ubWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciAubWF0LWlucHV0LWVsZW1lbnQ6OnBsYWNlaG9sZGVye2NvbG9yOnRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7LXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpub25lfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIgLm1hdC1pbnB1dC1lbGVtZW50OjpwbGFjZWhvbGRlcntvcGFjaXR5OjB9Lm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIgLm1hdC1pbnB1dC1lbGVtZW50OjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7LXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpub25lfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIgLm1hdC1pbnB1dC1lbGVtZW50OjotbW96LXBsYWNlaG9sZGVye29wYWNpdHk6MH0ubWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciAubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudDstd2Via2l0LXRleHQtZmlsbC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciAubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7b3BhY2l0eTowfS5tYXQtZm9ybS1maWVsZC1oaWRlLXBsYWNlaG9sZGVyIC5tYXQtaW5wdXQtZWxlbWVudDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudDstd2Via2l0LXRleHQtZmlsbC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciAubWF0LWlucHV0LWVsZW1lbnQ6LW1zLWlucHV0LXBsYWNlaG9sZGVye29wYWNpdHk6MH10ZXh0YXJlYS5tYXQtaW5wdXQtZWxlbWVudHtyZXNpemU6dmVydGljYWw7b3ZlcmZsb3c6YXV0b310ZXh0YXJlYS5tYXQtaW5wdXQtZWxlbWVudC5jZGstdGV4dGFyZWEtYXV0b3NpemV7cmVzaXplOm5vbmV9dGV4dGFyZWEubWF0LWlucHV0LWVsZW1lbnR7cGFkZGluZzoycHggMDttYXJnaW46LTJweCAwfXNlbGVjdC5tYXQtaW5wdXQtZWxlbWVudHstbW96LWFwcGVhcmFuY2U6bm9uZTstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTtwb3NpdGlvbjpyZWxhdGl2ZTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWZsZXg7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmctdG9wOjFlbTt0b3A6LTFlbTttYXJnaW4tYm90dG9tOi0xZW19c2VsZWN0Lm1hdC1pbnB1dC1lbGVtZW50OjotbXMtZXhwYW5ke2Rpc3BsYXk6bm9uZX1zZWxlY3QubWF0LWlucHV0LWVsZW1lbnQ6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9c2VsZWN0Lm1hdC1pbnB1dC1lbGVtZW50Om5vdCg6ZGlzYWJsZWQpe2N1cnNvcjpwb2ludGVyfXNlbGVjdC5tYXQtaW5wdXQtZWxlbWVudDo6LW1zLXZhbHVle2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDpub25lfS5tYXQtZm9jdXNlZCAuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIHNlbGVjdC5tYXQtaW5wdXQtZWxlbWVudDo6LW1zLXZhbHVle2NvbG9yOmluaGVyaXR9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb250ZW50OiIiO3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyLWxlZnQ6NXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yaWdodDo1cHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXRvcDo1cHggc29saWQ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtyaWdodDowO21hcmdpbi10b3A6LTIuNXB4O3BvaW50ZXItZXZlbnRzOm5vbmV9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0IC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7cmlnaHQ6YXV0bztsZWZ0OjB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1pbnB1dC1lbGVtZW50e3BhZGRpbmctcmlnaHQ6MTVweH1bZGlyPXJ0bF0gLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1pbnB1dC1lbGVtZW50e3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MTVweH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdCAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcnttYXgtd2lkdGg6Y2FsYygxMDAlIC0gMTBweCl9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7bWFyZ2luLXRvcDotNXB4fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye21hcmdpbi10b3A6LTEwcHh9XG4nLCIubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDBweCk7LW1zLXRyYW5zZm9ybTpub25lfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbiwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb257d2lkdGg6MWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbi1idXR0b24sLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbntmb250OmluaGVyaXQ7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb257Zm9udC1zaXplOmluaGVyaXR9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7aGVpZ2h0OjFweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2hlaWdodDowO2JvcmRlci10b3A6c29saWQgMXB4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtcmlwcGxle3RvcDowO2hlaWdodDoycHg7b3ZlcmZsb3c6aGlkZGVufS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7aGVpZ2h0OjA7Ym9yZGVyLXRvcDpzb2xpZCAycHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1wb3NpdGlvbjowO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3JkZXItdG9wLXN0eWxlOmRvdHRlZDtib3JkZXItdG9wLXdpZHRoOjJweH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtaW52YWxpZDpub3QoLm1hdC1mb2N1c2VkKSAubWF0LWZvcm0tZmllbGQtcmlwcGxle2hlaWdodDoxcHh9XG4iLCIubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC13cmFwcGVye21hcmdpbjouMjVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLWZsZXh7cGFkZGluZzowIC43NWVtIDAgLjc1ZW07bWFyZ2luLXRvcDotMC4yNWVtO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLXByZWZpeCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1zdWZmaXh7dG9wOi4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmV7ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDouMjVlbTtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb2ludGVyLWV2ZW50czpub25lfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtc3RhcnQsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1lbmR7Ym9yZGVyOjFweCBzb2xpZCBjdXJyZW50Q29sb3I7bWluLXdpZHRoOjVweH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXN0YXJ0e2JvcmRlci1yYWRpdXM6NXB4IDAgMCA1cHg7Ym9yZGVyLXJpZ2h0LXN0eWxlOm5vbmV9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtc3RhcnR7Ym9yZGVyLXJpZ2h0LXN0eWxlOnNvbGlkO2JvcmRlci1sZWZ0LXN0eWxlOm5vbmU7Ym9yZGVyLXJhZGl1czowIDVweCA1cHggMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWVuZHtib3JkZXItcmFkaXVzOjAgNXB4IDVweCAwO2JvcmRlci1sZWZ0LXN0eWxlOm5vbmU7ZmxleC1ncm93OjF9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZW5ke2JvcmRlci1sZWZ0LXN0eWxlOnNvbGlkO2JvcmRlci1yaWdodC1zdHlsZTpub25lO2JvcmRlci1yYWRpdXM6NXB4IDAgMCA1cHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1nYXB7Ym9yZGVyLXJhZGl1czouMDAwMDAxcHg7Ym9yZGVyOjFweCBzb2xpZCBjdXJyZW50Q29sb3I7Ym9yZGVyLWxlZnQtc3R5bGU6bm9uZTtib3JkZXItcmlnaHQtc3R5bGU6bm9uZX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZ2Fwe2JvcmRlci10b3AtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tvcGFjaXR5OjB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1zdGFydCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWVuZCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWdhcHtib3JkZXItd2lkdGg6MnB4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5le29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgMTAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljaywubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tib3JkZXI6M3B4IGRhc2hlZH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lOm5vdCgubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQpIC5tYXQtZm9ybS1maWVsZC1mbGV4OmhvdmVyIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5le29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgNjAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZTpub3QoLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkKSAubWF0LWZvcm0tZmllbGQtZmxleDpob3ZlciAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tvcGFjaXR5OjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7cGFkZGluZzowIDFlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlOm5vdCgubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQpIC5tYXQtZm9ybS1maWVsZC1mbGV4OmhvdmVyfi5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1zdGFydCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWVuZCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWdhcHt0cmFuc2l0aW9uOm5vbmV9XG4iLCIubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWZvcm0tZmllbGQtZmxleHtwYWRkaW5nLXRvcDouNzVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2hlaWdodDoxcHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2hlaWdodDowO2JvcmRlci10b3A6c29saWQgMXB4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7Ym90dG9tOjA7aGVpZ2h0OjJweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7aGVpZ2h0OjA7Ym9yZGVyLXRvcDpzb2xpZCAycHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7Ym9yZGVyLXRvcC1zdHlsZTpkb3R0ZWQ7Ym9yZGVyLXRvcC13aWR0aDoycHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQ6bm90KC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCkgLm1hdC1mb3JtLWZpZWxkLWZsZXg6aG92ZXJ+Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSAubWF0LWZvcm0tZmllbGQtcmlwcGxle29wYWNpdHk6MTt0cmFuc2Zvcm06bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgNjAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQuX21hdC1hbmltYXRpb24tbm9vcGFibGU6bm90KC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCkgLm1hdC1mb3JtLWZpZWxkLWZsZXg6aG92ZXJ+Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSAubWF0LWZvcm0tZmllbGQtcmlwcGxle3RyYW5zaXRpb246bm9uZX1cbiJdLGVuY2Fwc3VsYXRpb246MixkYXRhOnthbmltYXRpb246W2hWLnRyYW5zaXRpb25NZXNzYWdlc119LGNoYW5nZURldGVjdGlvbjowfSksQVYuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ30se3R5cGU6VWd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltoZ119XX0se3R5cGU6SEksZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltFVl19XX0se3R5cGU6d3p9LHt0eXBlOmFffSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV0sQVYucHJvcERlY29yYXRvcnM9e2FwcGVhcmFuY2U6W3t0eXBlOnh5fV0saGlkZVJlcXVpcmVkTWFya2VyOlt7dHlwZTp4eX1dLGhpbnRMYWJlbDpbe3R5cGU6eHl9XSxmbG9hdExhYmVsOlt7dHlwZTp4eX1dLHVuZGVybGluZVJlZjpbe3R5cGU6WmEsYXJnczpbInVuZGVybGluZSJdfV0sX2Nvbm5lY3Rpb25Db250YWluZXJSZWY6W3t0eXBlOlphLGFyZ3M6WyJjb25uZWN0aW9uQ29udGFpbmVyIix7c3RhdGljOiEwfV19XSxfaW5wdXRDb250YWluZXJSZWY6W3t0eXBlOlphLGFyZ3M6WyJpbnB1dENvbnRhaW5lciJdfV0sX2xhYmVsOlt7dHlwZTpaYSxhcmdzOlsibGFiZWwiXX1dLF9jb250cm9sTm9uU3RhdGljOlt7dHlwZTpxYSxhcmdzOltiVl19XSxfY29udHJvbFN0YXRpYzpbe3R5cGU6cWEsYXJnczpbYlYse3N0YXRpYzohMH1dfV0sX2xhYmVsQ2hpbGROb25TdGF0aWM6W3t0eXBlOnFhLGFyZ3M6W3ZWXX1dLF9sYWJlbENoaWxkU3RhdGljOlt7dHlwZTpxYSxhcmdzOlt2Vix7c3RhdGljOiEwfV19XSxfcGxhY2Vob2xkZXJDaGlsZDpbe3R5cGU6cWEsYXJnczpbeFZdfV0sX2Vycm9yQ2hpbGRyZW46W3t0eXBlOllhLGFyZ3M6W2ZWLHtkZXNjZW5kYW50czohMH1dfV0sX2hpbnRDaGlsZHJlbjpbe3R5cGU6WWEsYXJnczpbQ1Yse2Rlc2NlbmRhbnRzOiEwfV19XSxfcHJlZml4Q2hpbGRyZW46W3t0eXBlOllhLGFyZ3M6W09WLHtkZXNjZW5kYW50czohMH1dfV0sX3N1ZmZpeENoaWxkcmVuOlt7dHlwZTpZYSxhcmdzOlt3Vix7ZGVzY2VuZGFudHM6ITB9XX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEFWLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC1mb3JtLWZpZWxkIixleHBvcnRBczoibWF0Rm9ybUZpZWxkIix0ZW1wbGF0ZTonPGRpdiBjbGFzcz0ibWF0LWZvcm0tZmllbGQtd3JhcHBlciI+XG4gIDxkaXYgY2xhc3M9Im1hdC1mb3JtLWZpZWxkLWZsZXgiICNjb25uZWN0aW9uQ29udGFpbmVyXG4gICAgICAgKGNsaWNrKT0iX2NvbnRyb2wub25Db250YWluZXJDbGljayAmJiBfY29udHJvbC5vbkNvbnRhaW5lckNsaWNrKCRldmVudCkiPlxuXG4gICAgXHgzYyEtLSBPdXRsaW5lIHVzZWQgZm9yIG91dGxpbmUgYXBwZWFyYW5jZS4gLS1ceDNlXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj0iYXBwZWFyYW5jZSA9PSBcJ291dGxpbmVcJyI+XG4gICAgICA8ZGl2IGNsYXNzPSJtYXQtZm9ybS1maWVsZC1vdXRsaW5lIj5cbiAgICAgICAgPGRpdiBjbGFzcz0ibWF0LWZvcm0tZmllbGQtb3V0bGluZS1zdGFydCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9Im1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZ2FwIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz0ibWF0LWZvcm0tZmllbGQtb3V0bGluZS1lbmQiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPSJtYXQtZm9ybS1maWVsZC1vdXRsaW5lIG1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2siPlxuICAgICAgICA8ZGl2IGNsYXNzPSJtYXQtZm9ybS1maWVsZC1vdXRsaW5lLXN0YXJ0Ij48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz0ibWF0LWZvcm0tZmllbGQtb3V0bGluZS1nYXAiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPSJtYXQtZm9ybS1maWVsZC1vdXRsaW5lLWVuZCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxkaXYgY2xhc3M9Im1hdC1mb3JtLWZpZWxkLXByZWZpeCIgKm5nSWY9Il9wcmVmaXhDaGlsZHJlbi5sZW5ndGgiPlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PSJbbWF0UHJlZml4XSI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz0ibWF0LWZvcm0tZmllbGQtaW5maXgiICNpbnB1dENvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cblxuICAgICAgPHNwYW4gY2xhc3M9Im1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIiPlxuICAgICAgICBceDNjIS0tIFdlIGFkZCBhcmlhLW93bnMgYXMgYSB3b3JrYXJvdW5kIGZvciBhbiBpc3N1ZSBpbiBKQVdTICYgTlZEQSB3aGVyZSB0aGUgbGFiZWwgaXNuXCd0XG4gICAgICAgICAgICAgcmVhZCBpZiBpdCBjb21lcyBiZWZvcmUgdGhlIGNvbnRyb2wgaW4gdGhlIERPTS4gLS1ceDNlXG4gICAgICAgIDxsYWJlbCBjbGFzcz0ibWF0LWZvcm0tZmllbGQtbGFiZWwiXG4gICAgICAgICAgICAgICAoY2RrT2JzZXJ2ZUNvbnRlbnQpPSJ1cGRhdGVPdXRsaW5lR2FwKCkiXG4gICAgICAgICAgICAgICBbY2RrT2JzZXJ2ZUNvbnRlbnREaXNhYmxlZF09ImFwcGVhcmFuY2UgIT0gXCdvdXRsaW5lXCciXG4gICAgICAgICAgICAgICBbaWRdPSJfbGFiZWxJZCJcbiAgICAgICAgICAgICAgIFthdHRyLmZvcl09Il9jb250cm9sLmlkIlxuICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1vd25zXT0iX2NvbnRyb2wuaWQiXG4gICAgICAgICAgICAgICBbY2xhc3MubWF0LWVtcHR5XT0iX2NvbnRyb2wuZW1wdHkgJiYgIV9zaG91bGRBbHdheXNGbG9hdCgpIlxuICAgICAgICAgICAgICAgW2NsYXNzLm1hdC1mb3JtLWZpZWxkLWVtcHR5XT0iX2NvbnRyb2wuZW1wdHkgJiYgIV9zaG91bGRBbHdheXNGbG9hdCgpIlxuICAgICAgICAgICAgICAgW2NsYXNzLm1hdC1hY2NlbnRdPSJjb2xvciA9PSBcJ2FjY2VudFwnIlxuICAgICAgICAgICAgICAgW2NsYXNzLm1hdC13YXJuXT0iY29sb3IgPT0gXCd3YXJuXCciXG4gICAgICAgICAgICAgICAjbGFiZWxcbiAgICAgICAgICAgICAgICpuZ0lmPSJfaGFzRmxvYXRpbmdMYWJlbCgpIlxuICAgICAgICAgICAgICAgW25nU3dpdGNoXT0iX2hhc0xhYmVsKCkiPlxuXG4gICAgICAgICAgXHgzYyEtLSBAYnJlYWtpbmctY2hhbmdlIDguMC4wIHJlbW92ZSBpbiBmYXZvciBvZiBtYXQtbGFiZWwgZWxlbWVudCBhbiBwbGFjZWhvbGRlciBhdHRyLiAtLVx4M2VcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9ImZhbHNlIj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD0ibWF0LXBsYWNlaG9sZGVyIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8c3Bhbj57e19jb250cm9sLnBsYWNlaG9sZGVyfX08L3NwYW4+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9Im1hdC1sYWJlbCIgKm5nU3dpdGNoQ2FzZT0idHJ1ZSI+PC9uZy1jb250ZW50PlxuXG4gICAgICAgICAgXHgzYyEtLSBAYnJlYWtpbmctY2hhbmdlIDguMC4wIHJlbW92ZSBgbWF0LXBsYWNlaG9sZGVyLXJlcXVpcmVkYCBjbGFzcyAtLVx4M2VcbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9Im1hdC1wbGFjZWhvbGRlci1yZXF1aXJlZCBtYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXIiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj0idHJ1ZSJcbiAgICAgICAgICAgICpuZ0lmPSIhaGlkZVJlcXVpcmVkTWFya2VyICYmIF9jb250cm9sLnJlcXVpcmVkICYmICFfY29udHJvbC5kaXNhYmxlZCI+JiMzMjsqPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz0ibWF0LWZvcm0tZmllbGQtc3VmZml4IiAqbmdJZj0iX3N1ZmZpeENoaWxkcmVuLmxlbmd0aCI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9IlttYXRTdWZmaXhdIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIFx4M2MhLS0gVW5kZXJsaW5lIHVzZWQgZm9yIGxlZ2FjeSwgc3RhbmRhcmQsIGFuZCBib3ggYXBwZWFyYW5jZXMuIC0tXHgzZVxuICA8ZGl2IGNsYXNzPSJtYXQtZm9ybS1maWVsZC11bmRlcmxpbmUiICN1bmRlcmxpbmVcbiAgICAgICAqbmdJZj0iYXBwZWFyYW5jZSAhPSBcJ291dGxpbmVcJyI+XG4gICAgPHNwYW4gY2xhc3M9Im1hdC1mb3JtLWZpZWxkLXJpcHBsZSJcbiAgICAgICAgICBbY2xhc3MubWF0LWFjY2VudF09ImNvbG9yID09IFwnYWNjZW50XCciXG4gICAgICAgICAgW2NsYXNzLm1hdC13YXJuXT0iY29sb3IgPT0gXCd3YXJuXCciPjwvc3Bhbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz0ibWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXIiXG4gICAgICAgW25nU3dpdGNoXT0iX2dldERpc3BsYXllZE1lc3NhZ2VzKCkiPlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT0iXCdlcnJvclwnIiBbQHRyYW5zaXRpb25NZXNzYWdlc109Il9zdWJzY3JpcHRBbmltYXRpb25TdGF0ZSI+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9Im1hdC1lcnJvciI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz0ibWF0LWZvcm0tZmllbGQtaGludC13cmFwcGVyIiAqbmdTd2l0Y2hDYXNlPSJcJ2hpbnRcJyJcbiAgICAgIFtAdHJhbnNpdGlvbk1lc3NhZ2VzXT0iX3N1YnNjcmlwdEFuaW1hdGlvblN0YXRlIj5cbiAgICAgIFx4M2MhLS0gVE9ETyhtbWFsZXJiYSk6IHVzZSBhbiBhY3R1YWwgPG1hdC1oaW50PiBvbmNlIGFsbCBzZWxlY3RvcnMgYXJlIHN3aXRjaGVkIHRvIG1hdC0qIC0tXHgzZVxuICAgICAgPGRpdiAqbmdJZj0iaGludExhYmVsIiBbaWRdPSJfaGludExhYmVsSWQiIGNsYXNzPSJtYXQtaGludCI+e3toaW50TGFiZWx9fTwvZGl2PlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PSJtYXQtaGludDpub3QoW2FsaWduPVwnZW5kXCddKSI+PC9uZy1jb250ZW50PlxuICAgICAgPGRpdiBjbGFzcz0ibWF0LWZvcm0tZmllbGQtaGludC1zcGFjZXIiPjwvZGl2PlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PSJtYXQtaGludFthbGlnbj1cJ2VuZFwnXSI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuJyxhbmltYXRpb25zOltoVi50cmFuc2l0aW9uTWVzc2FnZXNdLGhvc3Q6e2NsYXNzOiJtYXQtZm9ybS1maWVsZCIsIltjbGFzcy5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkXSI6J2FwcGVhcmFuY2UgPT0gInN0YW5kYXJkIicsIltjbGFzcy5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxdIjonYXBwZWFyYW5jZSA9PSAiZmlsbCInLCJbY2xhc3MubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lXSI6J2FwcGVhcmFuY2UgPT0gIm91dGxpbmUiJywiW2NsYXNzLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5XSI6J2FwcGVhcmFuY2UgPT0gImxlZ2FjeSInLCJbY2xhc3MubWF0LWZvcm0tZmllbGQtaW52YWxpZF0iOiJfY29udHJvbC5lcnJvclN0YXRlIiwiW2NsYXNzLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdF0iOiJfY2FuTGFiZWxGbG9hdCgpIiwiW2NsYXNzLm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdF0iOiJfc2hvdWxkTGFiZWxGbG9hdCgpIiwiW2NsYXNzLm1hdC1mb3JtLWZpZWxkLWhhcy1sYWJlbF0iOiJfaGFzRmxvYXRpbmdMYWJlbCgpIiwiW2NsYXNzLm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXJdIjoiX2hpZGVDb250cm9sUGxhY2Vob2xkZXIoKSIsIltjbGFzcy5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZF0iOiJfY29udHJvbC5kaXNhYmxlZCIsIltjbGFzcy5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbGVkXSI6Il9jb250cm9sLmF1dG9maWxsZWQiLCJbY2xhc3MubWF0LWZvY3VzZWRdIjoiX2NvbnRyb2wuZm9jdXNlZCIsIltjbGFzcy5uZy11bnRvdWNoZWRdIjonX3Nob3VsZEZvcndhcmQoInVudG91Y2hlZCIpJywiW2NsYXNzLm5nLXRvdWNoZWRdIjonX3Nob3VsZEZvcndhcmQoInRvdWNoZWQiKScsIltjbGFzcy5uZy1wcmlzdGluZV0iOidfc2hvdWxkRm9yd2FyZCgicHJpc3RpbmUiKScsIltjbGFzcy5uZy1kaXJ0eV0iOidfc2hvdWxkRm9yd2FyZCgiZGlydHkiKScsIltjbGFzcy5uZy12YWxpZF0iOidfc2hvdWxkRm9yd2FyZCgidmFsaWQiKScsIltjbGFzcy5uZy1pbnZhbGlkXSI6J19zaG91bGRGb3J3YXJkKCJpbnZhbGlkIiknLCJbY2xhc3MubmctcGVuZGluZ10iOidfc2hvdWxkRm9yd2FyZCgicGVuZGluZyIpJywiW2NsYXNzLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlXSI6IiFfYW5pbWF0aW9uc0VuYWJsZWQifSxpbnB1dHM6WyJjb2xvciJdLGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLHByb3ZpZGVyczpbe3Byb3ZpZGU6UlYsdXNlRXhpc3Rpbmc6QVZ9XSxzdHlsZXM6WyIubWF0LWZvcm0tZmllbGR7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246cmVsYXRpdmU7dGV4dC1hbGlnbjpsZWZ0fVtkaXI9cnRsXSAubWF0LWZvcm0tZmllbGR7dGV4dC1hbGlnbjpyaWdodH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcntwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWZvcm0tZmllbGQtZmxleHtkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmJhc2VsaW5lO2JveC1zaXppbmc6Ym9yZGVyLWJveDt3aWR0aDoxMDAlfS5tYXQtZm9ybS1maWVsZC1wcmVmaXgsLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeHt3aGl0ZS1zcGFjZTpub3dyYXA7ZmxleDpub25lO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtZm9ybS1maWVsZC1pbmZpeHtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXg6YXV0bzttaW4td2lkdGg6MDt3aWR0aDoxODBweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1pbmZpeHtib3JkZXItaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRyYW5zcGFyZW50LCB0cmFuc3BhcmVudCl9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJ7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO2JveC1zaXppbmc6Y29udGVudC1ib3g7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvdmVyZmxvdzpoaWRkZW47cG9pbnRlci1ldmVudHM6bm9uZX1bZGlyPXJ0bF0gLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJ7bGVmdDphdXRvO3JpZ2h0OjB9Lm1hdC1mb3JtLWZpZWxkLWxhYmVse3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDtmb250OmluaGVyaXQ7cG9pbnRlci1ldmVudHM6bm9uZTt3aWR0aDoxMDAlO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO292ZXJmbG93OmhpZGRlbjt0cmFuc2Zvcm0tb3JpZ2luOjAgMDt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxjb2xvciA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSx3aWR0aCA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtkaXNwbGF5Om5vbmV9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMDtsZWZ0OmF1dG87cmlnaHQ6MH0ubWF0LWZvcm0tZmllbGQtZW1wdHkubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2Rpc3BsYXk6YmxvY2t9Lm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbCsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7ZGlzcGxheTpub25lfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbCsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7ZGlzcGxheTpibG9jazt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtaW5wdXQtc2VydmVyW3BsYWNlaG9sZGVyXTpub3QoOnBsYWNlaG9sZGVyLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7ZGlzcGxheTpub25lfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbcGxhY2Vob2xkZXJdOm5vdCg6cGxhY2Vob2xkZXItc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHtkaXNwbGF5OmJsb2NrfS5tYXQtZm9ybS1maWVsZC1sYWJlbDpub3QoLm1hdC1mb3JtLWZpZWxkLWVtcHR5KXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNmb3JtOnNjYWxlM2QoMSwgMS4wMDAxLCAxKX0ubWF0LWZvcm0tZmllbGQtcmlwcGxle3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt3aWR0aDoxMDAlO3RyYW5zZm9ybS1vcmlnaW46NTAlO3RyYW5zZm9ybTpzY2FsZVgoMC41KTtvcGFjaXR5OjA7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDMwMG1zIGN1YmljLWJlemllcigwLjU1LCAwLCAwLjU1LCAwLjIpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7b3BhY2l0eToxO3RyYW5zZm9ybTpub25lO3RyYW5zaXRpb246dHJhbnNmb3JtIDMwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLG9wYWNpdHkgMTAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYmFja2dyb3VuZC1jb2xvciAzMDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7cG9zaXRpb246YWJzb2x1dGU7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjEwMCU7b3ZlcmZsb3c6aGlkZGVufS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlciAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1pY29ue3dpZHRoOjFlbTtoZWlnaHQ6MWVtO2ZvbnQtc2l6ZTppbmhlcml0O3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfS5tYXQtZm9ybS1maWVsZC1oaW50LXdyYXBwZXJ7ZGlzcGxheTpmbGV4fS5tYXQtZm9ybS1maWVsZC1oaW50LXNwYWNlcntmbGV4OjEgMCAxZW19Lm1hdC1lcnJvcntkaXNwbGF5OmJsb2NrfS5tYXQtZm9ybS1maWVsZC1jb250cm9sLXdyYXBwZXJ7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1mb3JtLWZpZWxkLWhpbnQtZW5ke29yZGVyOjF9Lm1hdC1mb3JtLWZpZWxkLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXt0cmFuc2l0aW9uOm5vbmV9XG4iLCcubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1mbGV4e2JvcmRlci1yYWRpdXM6NHB4IDRweCAwIDA7cGFkZGluZzouNzVlbSAuNzVlbSAwIC43NWVtfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtZmxleHtvdXRsaW5lOnNvbGlkIDFweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWZsZXh7b3V0bGluZTpkYXNoZWQgM3B4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZTo6YmVmb3Jle2NvbnRlbnQ6IiI7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MDtoZWlnaHQ6MXB4O3dpZHRoOjEwMCV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtcmlwcGxle2JvdHRvbTowO2hlaWdodDoycHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7aGVpZ2h0OjB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbDpub3QoLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkKSAubWF0LWZvcm0tZmllbGQtZmxleDpob3Zlcn4ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7b3BhY2l0eToxO3RyYW5zZm9ybTpub25lO3RyYW5zaXRpb246b3BhY2l0eSA2MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlOm5vdCgubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQpIC5tYXQtZm9ybS1maWVsZC1mbGV4OmhvdmVyfi5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7cGFkZGluZzowIDFlbX1cbicsJy5tYXQtaW5wdXQtZWxlbWVudHtmb250OmluaGVyaXQ7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjpjdXJyZW50Q29sb3I7Ym9yZGVyOm5vbmU7b3V0bGluZTpub25lO3BhZGRpbmc6MDttYXJnaW46MDt3aWR0aDoxMDAlO21heC13aWR0aDoxMDAlO3ZlcnRpY2FsLWFsaWduOmJvdHRvbTt0ZXh0LWFsaWduOmluaGVyaXQ7Ym94LXNpemluZzpjb250ZW50LWJveH0ubWF0LWlucHV0LWVsZW1lbnQ6LW1vei11aS1pbnZhbGlke2JveC1zaGFkb3c6bm9uZX0ubWF0LWlucHV0LWVsZW1lbnQ6Oi1tcy1jbGVhciwubWF0LWlucHV0LWVsZW1lbnQ6Oi1tcy1yZXZlYWx7ZGlzcGxheTpub25lfS5tYXQtaW5wdXQtZWxlbWVudCwubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtc2VhcmNoLWNhbmNlbC1idXR0b24sLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uLC5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1zZWFyY2gtcmVzdWx0cy1idXR0b24sLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LXNlYXJjaC1yZXN1bHRzLWRlY29yYXRpb257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmV9Lm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWNvbnRhY3RzLWF1dG8tZmlsbC1idXR0b24sLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWNhcHMtbG9jay1pbmRpY2F0b3IsLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWNyZWRlbnRpYWxzLWF1dG8tZmlsbC1idXR0b257dmlzaWJpbGl0eTpoaWRkZW59Lm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9ZGF0ZV0sLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9ZGF0ZXRpbWVdLC5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPWRhdGV0aW1lLWxvY2FsXSwubWF0LWlucHV0LWVsZW1lbnRbdHlwZT1tb250aF0sLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9d2Vla10sLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9dGltZV17bGluZS1oZWlnaHQ6MX0ubWF0LWlucHV0LWVsZW1lbnRbdHlwZT1kYXRlXTo6YWZ0ZXIsLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9ZGF0ZXRpbWVdOjphZnRlciwubWF0LWlucHV0LWVsZW1lbnRbdHlwZT1kYXRldGltZS1sb2NhbF06OmFmdGVyLC5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPW1vbnRoXTo6YWZ0ZXIsLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9d2Vla106OmFmdGVyLC5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPXRpbWVdOjphZnRlcntjb250ZW50OiIgIjt3aGl0ZS1zcGFjZTpwcmU7d2lkdGg6MXB4fS5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiwubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvciwubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtY2xlYXItYnV0dG9ue2ZvbnQtc2l6ZTouNzVlbX0ubWF0LWlucHV0LWVsZW1lbnQ6OnBsYWNlaG9sZGVyey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt0cmFuc2l0aW9uOmNvbG9yIDQwMG1zIDEzMy4zMzMzMzMzMzMzbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1pbnB1dC1lbGVtZW50OjpwbGFjZWhvbGRlcjotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7LW1zLXVzZXItc2VsZWN0OnRleHR9Lm1hdC1pbnB1dC1lbGVtZW50OjotbW96LXBsYWNlaG9sZGVyey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt0cmFuc2l0aW9uOmNvbG9yIDQwMG1zIDEzMy4zMzMzMzMzMzMzbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1pbnB1dC1lbGVtZW50OjotbW96LXBsYWNlaG9sZGVyOi1tcy1pbnB1dC1wbGFjZWhvbGRlcnstbXMtdXNlci1zZWxlY3Q6dGV4dH0ubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3RyYW5zaXRpb246Y29sb3IgNDAwbXMgMTMzLjMzMzMzMzMzMzNtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXI6LW1zLWlucHV0LXBsYWNlaG9sZGVyey1tcy11c2VyLXNlbGVjdDp0ZXh0fS5tYXQtaW5wdXQtZWxlbWVudDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3RyYW5zaXRpb246Y29sb3IgNDAwbXMgMTMzLjMzMzMzMzMzMzNtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWlucHV0LWVsZW1lbnQ6LW1zLWlucHV0LXBsYWNlaG9sZGVyOi1tcy1pbnB1dC1wbGFjZWhvbGRlcnstbXMtdXNlci1zZWxlY3Q6dGV4dH0ubWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciAubWF0LWlucHV0LWVsZW1lbnQ6OnBsYWNlaG9sZGVye2NvbG9yOnRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7LXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpub25lfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIgLm1hdC1pbnB1dC1lbGVtZW50OjpwbGFjZWhvbGRlcntvcGFjaXR5OjB9Lm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIgLm1hdC1pbnB1dC1lbGVtZW50OjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7LXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpub25lfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIgLm1hdC1pbnB1dC1lbGVtZW50OjotbW96LXBsYWNlaG9sZGVye29wYWNpdHk6MH0ubWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciAubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudDstd2Via2l0LXRleHQtZmlsbC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciAubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7b3BhY2l0eTowfS5tYXQtZm9ybS1maWVsZC1oaWRlLXBsYWNlaG9sZGVyIC5tYXQtaW5wdXQtZWxlbWVudDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudDstd2Via2l0LXRleHQtZmlsbC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciAubWF0LWlucHV0LWVsZW1lbnQ6LW1zLWlucHV0LXBsYWNlaG9sZGVye29wYWNpdHk6MH10ZXh0YXJlYS5tYXQtaW5wdXQtZWxlbWVudHtyZXNpemU6dmVydGljYWw7b3ZlcmZsb3c6YXV0b310ZXh0YXJlYS5tYXQtaW5wdXQtZWxlbWVudC5jZGstdGV4dGFyZWEtYXV0b3NpemV7cmVzaXplOm5vbmV9dGV4dGFyZWEubWF0LWlucHV0LWVsZW1lbnR7cGFkZGluZzoycHggMDttYXJnaW46LTJweCAwfXNlbGVjdC5tYXQtaW5wdXQtZWxlbWVudHstbW96LWFwcGVhcmFuY2U6bm9uZTstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTtwb3NpdGlvbjpyZWxhdGl2ZTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWZsZXg7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmctdG9wOjFlbTt0b3A6LTFlbTttYXJnaW4tYm90dG9tOi0xZW19c2VsZWN0Lm1hdC1pbnB1dC1lbGVtZW50OjotbXMtZXhwYW5ke2Rpc3BsYXk6bm9uZX1zZWxlY3QubWF0LWlucHV0LWVsZW1lbnQ6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9c2VsZWN0Lm1hdC1pbnB1dC1lbGVtZW50Om5vdCg6ZGlzYWJsZWQpe2N1cnNvcjpwb2ludGVyfXNlbGVjdC5tYXQtaW5wdXQtZWxlbWVudDo6LW1zLXZhbHVle2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDpub25lfS5tYXQtZm9jdXNlZCAuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIHNlbGVjdC5tYXQtaW5wdXQtZWxlbWVudDo6LW1zLXZhbHVle2NvbG9yOmluaGVyaXR9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb250ZW50OiIiO3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyLWxlZnQ6NXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yaWdodDo1cHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXRvcDo1cHggc29saWQ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtyaWdodDowO21hcmdpbi10b3A6LTIuNXB4O3BvaW50ZXItZXZlbnRzOm5vbmV9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0IC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7cmlnaHQ6YXV0bztsZWZ0OjB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1pbnB1dC1lbGVtZW50e3BhZGRpbmctcmlnaHQ6MTVweH1bZGlyPXJ0bF0gLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1pbnB1dC1lbGVtZW50e3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MTVweH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdCAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcnttYXgtd2lkdGg6Y2FsYygxMDAlIC0gMTBweCl9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7bWFyZ2luLXRvcDotNXB4fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye21hcmdpbi10b3A6LTEwcHh9XG4nLCIubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDBweCk7LW1zLXRyYW5zZm9ybTpub25lfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbiwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb257d2lkdGg6MWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbi1idXR0b24sLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbntmb250OmluaGVyaXQ7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb257Zm9udC1zaXplOmluaGVyaXR9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7aGVpZ2h0OjFweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2hlaWdodDowO2JvcmRlci10b3A6c29saWQgMXB4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtcmlwcGxle3RvcDowO2hlaWdodDoycHg7b3ZlcmZsb3c6aGlkZGVufS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7aGVpZ2h0OjA7Ym9yZGVyLXRvcDpzb2xpZCAycHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1wb3NpdGlvbjowO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3JkZXItdG9wLXN0eWxlOmRvdHRlZDtib3JkZXItdG9wLXdpZHRoOjJweH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtaW52YWxpZDpub3QoLm1hdC1mb2N1c2VkKSAubWF0LWZvcm0tZmllbGQtcmlwcGxle2hlaWdodDoxcHh9XG4iLCIubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC13cmFwcGVye21hcmdpbjouMjVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLWZsZXh7cGFkZGluZzowIC43NWVtIDAgLjc1ZW07bWFyZ2luLXRvcDotMC4yNWVtO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLXByZWZpeCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1zdWZmaXh7dG9wOi4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmV7ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDouMjVlbTtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb2ludGVyLWV2ZW50czpub25lfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtc3RhcnQsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1lbmR7Ym9yZGVyOjFweCBzb2xpZCBjdXJyZW50Q29sb3I7bWluLXdpZHRoOjVweH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXN0YXJ0e2JvcmRlci1yYWRpdXM6NXB4IDAgMCA1cHg7Ym9yZGVyLXJpZ2h0LXN0eWxlOm5vbmV9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtc3RhcnR7Ym9yZGVyLXJpZ2h0LXN0eWxlOnNvbGlkO2JvcmRlci1sZWZ0LXN0eWxlOm5vbmU7Ym9yZGVyLXJhZGl1czowIDVweCA1cHggMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWVuZHtib3JkZXItcmFkaXVzOjAgNXB4IDVweCAwO2JvcmRlci1sZWZ0LXN0eWxlOm5vbmU7ZmxleC1ncm93OjF9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZW5ke2JvcmRlci1sZWZ0LXN0eWxlOnNvbGlkO2JvcmRlci1yaWdodC1zdHlsZTpub25lO2JvcmRlci1yYWRpdXM6NXB4IDAgMCA1cHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1nYXB7Ym9yZGVyLXJhZGl1czouMDAwMDAxcHg7Ym9yZGVyOjFweCBzb2xpZCBjdXJyZW50Q29sb3I7Ym9yZGVyLWxlZnQtc3R5bGU6bm9uZTtib3JkZXItcmlnaHQtc3R5bGU6bm9uZX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZ2Fwe2JvcmRlci10b3AtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tvcGFjaXR5OjB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1zdGFydCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWVuZCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWdhcHtib3JkZXItd2lkdGg6MnB4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5le29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgMTAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljaywubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tib3JkZXI6M3B4IGRhc2hlZH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lOm5vdCgubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQpIC5tYXQtZm9ybS1maWVsZC1mbGV4OmhvdmVyIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5le29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgNjAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZTpub3QoLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkKSAubWF0LWZvcm0tZmllbGQtZmxleDpob3ZlciAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tvcGFjaXR5OjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7cGFkZGluZzowIDFlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlOm5vdCgubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQpIC5tYXQtZm9ybS1maWVsZC1mbGV4OmhvdmVyfi5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1zdGFydCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWVuZCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWdhcHt0cmFuc2l0aW9uOm5vbmV9XG4iLCIubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWZvcm0tZmllbGQtZmxleHtwYWRkaW5nLXRvcDouNzVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2hlaWdodDoxcHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2hlaWdodDowO2JvcmRlci10b3A6c29saWQgMXB4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7Ym90dG9tOjA7aGVpZ2h0OjJweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7aGVpZ2h0OjA7Ym9yZGVyLXRvcDpzb2xpZCAycHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7Ym9yZGVyLXRvcC1zdHlsZTpkb3R0ZWQ7Ym9yZGVyLXRvcC13aWR0aDoycHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQ6bm90KC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCkgLm1hdC1mb3JtLWZpZWxkLWZsZXg6aG92ZXJ+Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSAubWF0LWZvcm0tZmllbGQtcmlwcGxle29wYWNpdHk6MTt0cmFuc2Zvcm06bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgNjAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQuX21hdC1hbmltYXRpb24tbm9vcGFibGU6bm90KC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCkgLm1hdC1mb3JtLWZpZWxkLWZsZXg6aG92ZXJ+Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSAubWF0LWZvcm0tZmllbGQtcmlwcGxle3RyYW5zaXRpb246bm9uZX1cbiJdfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOlVnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbaGddfV19LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbRVZdfV19LHt0eXBlOnd6fSx7dHlwZTphX30se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dfSkse2Zsb2F0TGFiZWw6W3t0eXBlOnh5fV0sYXBwZWFyYW5jZTpbe3R5cGU6eHl9XSxoaWRlUmVxdWlyZWRNYXJrZXI6W3t0eXBlOnh5fV0saGludExhYmVsOlt7dHlwZTp4eX1dLHVuZGVybGluZVJlZjpbe3R5cGU6WmEsYXJnczpbInVuZGVybGluZSJdfV0sX2Nvbm5lY3Rpb25Db250YWluZXJSZWY6W3t0eXBlOlphLGFyZ3M6WyJjb25uZWN0aW9uQ29udGFpbmVyIix7c3RhdGljOiEwfV19XSxfaW5wdXRDb250YWluZXJSZWY6W3t0eXBlOlphLGFyZ3M6WyJpbnB1dENvbnRhaW5lciJdfV0sX2xhYmVsOlt7dHlwZTpaYSxhcmdzOlsibGFiZWwiXX1dLF9jb250cm9sTm9uU3RhdGljOlt7dHlwZTpxYSxhcmdzOltiVl19XSxfY29udHJvbFN0YXRpYzpbe3R5cGU6cWEsYXJnczpbYlYse3N0YXRpYzohMH1dfV0sX2xhYmVsQ2hpbGROb25TdGF0aWM6W3t0eXBlOnFhLGFyZ3M6W3ZWXX1dLF9sYWJlbENoaWxkU3RhdGljOlt7dHlwZTpxYSxhcmdzOlt2Vix7c3RhdGljOiEwfV19XSxfcGxhY2Vob2xkZXJDaGlsZDpbe3R5cGU6cWEsYXJnczpbeFZdfV0sX2Vycm9yQ2hpbGRyZW46W3t0eXBlOllhLGFyZ3M6W2ZWLHtkZXNjZW5kYW50czohMH1dfV0sX2hpbnRDaGlsZHJlbjpbe3R5cGU6WWEsYXJnczpbQ1Yse2Rlc2NlbmRhbnRzOiEwfV19XSxfcHJlZml4Q2hpbGRyZW46W3t0eXBlOllhLGFyZ3M6W09WLHtkZXNjZW5kYW50czohMH1dfV0sX3N1ZmZpeENoaWxkcmVuOlt7dHlwZTpZYSxhcmdzOlt3Vix7ZGVzY2VuZGFudHM6ITB9XX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBUVnt9VFYuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFRWKX0sVFYuybVtb2Q9YW8oe3R5cGU6VFZ9KSxUVi7JtWluaj12bih7aW1wb3J0czpbW1dNLFhJLFV6XSxYSV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFRWLFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltnVixBVixNVix2Vix4VixQVixrVl0saW1wb3J0czpbV00sWEksVXpdLGV4cG9ydHM6W1hJLGdWLEFWLE1WLHZWLHhWLFBWLGtWXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFRWLHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bZ1YsQVYsTVYsdlYseFYsUFYsa1ZdfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1dNLFhJLFV6XX0sZXhwb3J0czpmdW5jdGlvbigpe3JldHVybltYSSxnVixBVixNVix2Vix4VixQVixrVl19fSk7Ci8qKgogICAgICogQGxpY2Vuc2UgQW5ndWxhciB2MTIuMi4xCiAgICAgKiAoYykgMjAxMC0yMDIxIEdvb2dsZSBMTEMuIGh0dHBzOi8vYW5ndWxhci5pby8KICAgICAqIExpY2Vuc2U6IE1JVAogICAgICovCmNsYXNzIE5We2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fcmVuZGVyZXI9dCx0aGlzLl9lbGVtZW50UmVmPWUsdGhpcy5vbkNoYW5nZT10PT57fSx0aGlzLm9uVG91Y2hlZD0oKT0+e319c2V0UHJvcGVydHkodCxlKXt0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsdCxlKX1yZWdpc3Rlck9uVG91Y2hlZCh0KXt0aGlzLm9uVG91Y2hlZD10fXJlZ2lzdGVyT25DaGFuZ2UodCl7dGhpcy5vbkNoYW5nZT10fXNldERpc2FibGVkU3RhdGUodCl7dGhpcy5zZXRQcm9wZXJ0eSgiZGlzYWJsZWQiLHQpfX1OVi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8TlYpKFNtKENnKSxTbShoZykpfSxOVi7JtWRpcj1sbyh7dHlwZTpOVn0pLE5WLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6Q2d9LHt0eXBlOmhnfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChOVixbe3R5cGU6Q3l9XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6Q2d9LHt0eXBlOmhnfV19KSxudWxsKTtjbGFzcyB6ViBleHRlbmRzIE5We316Vi7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoelYpKSkobnx8elYpfX0pKCkselYuybVkaXI9bG8oe3R5cGU6elYsZmVhdHVyZXM6W3hwXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoelYsW3t0eXBlOkN5fV0sbnVsbCxudWxsKTtjb25zdCBJVj1uZXcgR2EoIk5nVmFsdWVBY2Nlc3NvciIpLEhWPXtwcm92aWRlOklWLHVzZUV4aXN0aW5nOnFlKCgoKT0+RlYpKSxtdWx0aTohMH07Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIEZWIGV4dGVuZHMgelZ7d3JpdGVWYWx1ZSh0KXt0aGlzLnNldFByb3BlcnR5KCJjaGVja2VkIix0KX19RlYuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKEZWKSkpKG58fEZWKX19KSgpLEZWLsm1ZGlyPWxvKHt0eXBlOkZWLHNlbGVjdG9yczpbWyJpbnB1dCIsInR5cGUiLCJjaGVja2JveCIsImZvcm1Db250cm9sTmFtZSIsIiJdLFsiaW5wdXQiLCJ0eXBlIiwiY2hlY2tib3giLCJmb3JtQ29udHJvbCIsIiJdLFsiaW5wdXQiLCJ0eXBlIiwiY2hlY2tib3giLCJuZ01vZGVsIiwiIl1dLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgiY2hhbmdlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vbkNoYW5nZShlLnRhcmdldC5jaGVja2VkKX0pKSgiYmx1ciIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblRvdWNoZWQoKX0pKX0sZmVhdHVyZXM6W3BnKFtIVl0pLHhwXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRlYsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiaW5wdXRbdHlwZT1jaGVja2JveF1bZm9ybUNvbnRyb2xOYW1lXSxpbnB1dFt0eXBlPWNoZWNrYm94XVtmb3JtQ29udHJvbF0saW5wdXRbdHlwZT1jaGVja2JveF1bbmdNb2RlbF0iLGhvc3Q6eyIoY2hhbmdlKSI6Im9uQ2hhbmdlKCRldmVudC50YXJnZXQuY2hlY2tlZCkiLCIoYmx1cikiOiJvblRvdWNoZWQoKSJ9LHByb3ZpZGVyczpbSFZdfV19XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgTFY9e3Byb3ZpZGU6SVYsdXNlRXhpc3Rpbmc6cWUoKCgpPT5WVikpLG11bHRpOiEwfSxCVj1uZXcgR2EoIkNvbXBvc2l0aW9uRXZlbnRNb2RlIik7Y2xhc3MgVlYgZXh0ZW5kcyBOVntjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodCxlKSx0aGlzLl9jb21wb3NpdGlvbk1vZGU9bix0aGlzLl9jb21wb3Npbmc9ITEsbnVsbD09dGhpcy5fY29tcG9zaXRpb25Nb2RlJiYodGhpcy5fY29tcG9zaXRpb25Nb2RlPSEoZnVuY3Rpb24gbygpe2NvbnN0IHQ9cV8oKT9xXygpLmdldFVzZXJBZ2VudCgpOiIiO3JldHVybi9hbmRyb2lkIChcZCspLy50ZXN0KHQudG9Mb3dlckNhc2UoKSl9KSgpKX13cml0ZVZhbHVlKHQpe3RoaXMuc2V0UHJvcGVydHkoInZhbHVlIixudWxsPT10PyIiOnQpfV9oYW5kbGVJbnB1dCh0KXsoIXRoaXMuX2NvbXBvc2l0aW9uTW9kZXx8dGhpcy5fY29tcG9zaXRpb25Nb2RlJiYhdGhpcy5fY29tcG9zaW5nKSYmdGhpcy5vbkNoYW5nZSh0KX1fY29tcG9zaXRpb25TdGFydCgpe3RoaXMuX2NvbXBvc2luZz0hMH1fY29tcG9zaXRpb25FbmQodCl7dGhpcy5fY29tcG9zaW5nPSExLHRoaXMuX2NvbXBvc2l0aW9uTW9kZSYmdGhpcy5vbkNoYW5nZSh0KX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiBqVih0KXtyZXR1cm4gbnVsbD09dHx8MD09PXQubGVuZ3RofWZ1bmN0aW9uIFVWKHQpe3JldHVybiBudWxsIT10JiYibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RofVZWLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxWVikoU20oQ2cpLFNtKGhnKSxTbShCViw4KSl9LFZWLsm1ZGlyPWxvKHt0eXBlOlZWLHNlbGVjdG9yczpbWyJpbnB1dCIsImZvcm1Db250cm9sTmFtZSIsIiIsMywidHlwZSIsImNoZWNrYm94Il0sWyJ0ZXh0YXJlYSIsImZvcm1Db250cm9sTmFtZSIsIiJdLFsiaW5wdXQiLCJmb3JtQ29udHJvbCIsIiIsMywidHlwZSIsImNoZWNrYm94Il0sWyJ0ZXh0YXJlYSIsImZvcm1Db250cm9sIiwiIl0sWyJpbnB1dCIsIm5nTW9kZWwiLCIiLDMsInR5cGUiLCJjaGVja2JveCJdLFsidGV4dGFyZWEiLCJuZ01vZGVsIiwiIl0sWyIiLCJuZ0RlZmF1bHRDb250cm9sIiwiIl1dLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgiaW5wdXQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9oYW5kbGVJbnB1dChlLnRhcmdldC52YWx1ZSl9KSkoImJsdXIiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25Ub3VjaGVkKCl9KSkoImNvbXBvc2l0aW9uc3RhcnQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX2NvbXBvc2l0aW9uU3RhcnQoKX0pKSgiY29tcG9zaXRpb25lbmQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9jb21wb3NpdGlvbkVuZChlLnRhcmdldC52YWx1ZSl9KSl9LGZlYXR1cmVzOltwZyhbTFZdKSx4cF19KSxWVi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOkNnfSx7dHlwZTpoZ30se3R5cGU6Qm9vbGVhbixkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbQlZdfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFZWLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6ImlucHV0Om5vdChbdHlwZT1jaGVja2JveF0pW2Zvcm1Db250cm9sTmFtZV0sdGV4dGFyZWFbZm9ybUNvbnRyb2xOYW1lXSxpbnB1dDpub3QoW3R5cGU9Y2hlY2tib3hdKVtmb3JtQ29udHJvbF0sdGV4dGFyZWFbZm9ybUNvbnRyb2xdLGlucHV0Om5vdChbdHlwZT1jaGVja2JveF0pW25nTW9kZWxdLHRleHRhcmVhW25nTW9kZWxdLFtuZ0RlZmF1bHRDb250cm9sXSIsaG9zdDp7IihpbnB1dCkiOiIkYW55KHRoaXMpLl9oYW5kbGVJbnB1dCgkZXZlbnQudGFyZ2V0LnZhbHVlKSIsIihibHVyKSI6Im9uVG91Y2hlZCgpIiwiKGNvbXBvc2l0aW9uc3RhcnQpIjoiJGFueSh0aGlzKS5fY29tcG9zaXRpb25TdGFydCgpIiwiKGNvbXBvc2l0aW9uZW5kKSI6IiRhbnkodGhpcykuX2NvbXBvc2l0aW9uRW5kKCRldmVudC50YXJnZXQudmFsdWUpIn0scHJvdmlkZXJzOltMVl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpDZ30se3R5cGU6aGd9LHt0eXBlOkJvb2xlYW4sZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W0JWXX1dfV19KSxudWxsKTtjb25zdCBHVj1uZXcgR2EoIk5nVmFsaWRhdG9ycyIpLFdWPW5ldyBHYSgiTmdBc3luY1ZhbGlkYXRvcnMiKSxZVj0vXig/PS57MSwyNTR9JCkoPz0uezEsNjR9QClbYS16QS1aMC05ISMkJSYnKisvPT9eX2B7fH1+LV0rKD86XC5bYS16QS1aMC05ISMkJSYnKisvPT9eX2B7fH1+LV0rKSpAW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KD86XC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKiQvO2NsYXNzIHFWe3N0YXRpYyBtaW4odCl7cmV0dXJuIFpWKHQpfXN0YXRpYyBtYXgodCl7cmV0dXJuIFhWKHQpfXN0YXRpYyByZXF1aXJlZCh0KXtyZXR1cm4gS1YodCl9c3RhdGljIHJlcXVpcmVkVHJ1ZSh0KXtyZXR1cm4gSlYodCl9c3RhdGljIGVtYWlsKHQpe3JldHVybiBRVih0KX1zdGF0aWMgbWluTGVuZ3RoKHQpe3JldHVybiAkVih0KX1zdGF0aWMgbWF4TGVuZ3RoKHQpe3JldHVybiB0aih0KX1zdGF0aWMgcGF0dGVybih0KXtyZXR1cm4gZWoodCl9c3RhdGljIG51bGxWYWxpZGF0b3IodCl7cmV0dXJuIG51bGx9c3RhdGljIGNvbXBvc2UodCl7cmV0dXJuIGxqKHQpfXN0YXRpYyBjb21wb3NlQXN5bmModCl7cmV0dXJuIGRqKHQpfX1mdW5jdGlvbiBaVih0KXtyZXR1cm4gZT0+e2lmKGpWKGUudmFsdWUpfHxqVih0KSlyZXR1cm4gbnVsbDtjb25zdCBuPXBhcnNlRmxvYXQoZS52YWx1ZSk7cmV0dXJuIWlzTmFOKG4pJiZuPHQ/e21pbjp7bWluOnQsYWN0dWFsOmUudmFsdWV9fTpudWxsfX1mdW5jdGlvbiBYVih0KXtyZXR1cm4gZT0+e2lmKGpWKGUudmFsdWUpfHxqVih0KSlyZXR1cm4gbnVsbDtjb25zdCBuPXBhcnNlRmxvYXQoZS52YWx1ZSk7cmV0dXJuIWlzTmFOKG4pJiZuPnQ/e21heDp7bWF4OnQsYWN0dWFsOmUudmFsdWV9fTpudWxsfX1mdW5jdGlvbiBLVih0KXtyZXR1cm4galYodC52YWx1ZSk/e3JlcXVpcmVkOiEwfTpudWxsfWZ1bmN0aW9uIEpWKHQpe3JldHVybiEwPT09dC52YWx1ZT9udWxsOntyZXF1aXJlZDohMH19ZnVuY3Rpb24gUVYodCl7cmV0dXJuIGpWKHQudmFsdWUpfHxZVi50ZXN0KHQudmFsdWUpP251bGw6e2VtYWlsOiEwfX1mdW5jdGlvbiAkVih0KXtyZXR1cm4gZT0+alYoZS52YWx1ZSl8fCFVVihlLnZhbHVlKT9udWxsOmUudmFsdWUubGVuZ3RoPHQ/e21pbmxlbmd0aDp7cmVxdWlyZWRMZW5ndGg6dCxhY3R1YWxMZW5ndGg6ZS52YWx1ZS5sZW5ndGh9fTpudWxsfWZ1bmN0aW9uIHRqKHQpe3JldHVybiBlPT5VVihlLnZhbHVlKSYmZS52YWx1ZS5sZW5ndGg+dD97bWF4bGVuZ3RoOntyZXF1aXJlZExlbmd0aDp0LGFjdHVhbExlbmd0aDplLnZhbHVlLmxlbmd0aH19Om51bGx9ZnVuY3Rpb24gZWoodCl7aWYoIXQpcmV0dXJuIG5qO2xldCBlLG47cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0PyhuPSIiLCJeIiE9PXQuY2hhckF0KDApJiYobis9Il4iKSxuKz10LCIkIiE9PXQuY2hhckF0KHQubGVuZ3RoLTEpJiYobis9IiQiKSxlPW5ldyBSZWdFeHAobikpOihuPXQudG9TdHJpbmcoKSxlPXQpLHQ9PntpZihqVih0LnZhbHVlKSlyZXR1cm4gbnVsbDtjb25zdCBvPXQudmFsdWU7cmV0dXJuIGUudGVzdChvKT9udWxsOntwYXR0ZXJuOntyZXF1aXJlZFBhdHRlcm46bixhY3R1YWxWYWx1ZTpvfX19fWZ1bmN0aW9uIG5qKHQpe3JldHVybiBudWxsfWZ1bmN0aW9uIG9qKHQpe3JldHVybiBudWxsIT10fWZ1bmN0aW9uIGlqKHQpe2NvbnN0IGU9Rm0odCk/Q3QodCk6dDtpZighQm0oZSkmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSl0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIHZhbGlkYXRvciB0byByZXR1cm4gUHJvbWlzZSBvciBPYnNlcnZhYmxlLiIpO3JldHVybiBlfWZ1bmN0aW9uIGFqKHQpe2xldCBlPXt9O3JldHVybiB0LmZvckVhY2goKHQ9PntlPW51bGwhPXQ/T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHQpOmV9KSksMD09PU9iamVjdC5rZXlzKGUpLmxlbmd0aD9udWxsOmV9ZnVuY3Rpb24gcmoodCxlKXtyZXR1cm4gZS5tYXAoKGU9PmUodCkpKX1mdW5jdGlvbiBzaih0KXtyZXR1cm4gdC5tYXAoKHQ9PihmdW5jdGlvbiBlKHQpe3JldHVybiF0LnZhbGlkYXRlfSkodCk/dDplPT50LnZhbGlkYXRlKGUpKSl9ZnVuY3Rpb24gbGoodCl7aWYoIXQpcmV0dXJuIG51bGw7Y29uc3QgZT10LmZpbHRlcihvaik7cmV0dXJuIDA9PWUubGVuZ3RoP251bGw6ZnVuY3Rpb24odCl7cmV0dXJuIGFqKHJqKHQsZSkpfX1mdW5jdGlvbiBjaih0KXtyZXR1cm4gbnVsbCE9dD9saihzaih0KSk6bnVsbH1mdW5jdGlvbiBkaih0KXtpZighdClyZXR1cm4gbnVsbDtjb25zdCBlPXQuZmlsdGVyKG9qKTtyZXR1cm4gMD09ZS5sZW5ndGg/bnVsbDpmdW5jdGlvbih0KXtyZXR1cm4gJHQocmoodCxlKS5tYXAoaWopKS5waXBlKEl0KGFqKSl9fWZ1bmN0aW9uIHBqKHQpe3JldHVybiBudWxsIT10P2RqKHNqKHQpKTpudWxsfWZ1bmN0aW9uIG1qKHQsZSl7cmV0dXJuIG51bGw9PT10P1tlXTpBcnJheS5pc0FycmF5KHQpP1suLi50LGVdOlt0LGVdfWZ1bmN0aW9uIHVqKHQpe3JldHVybiB0Ll9yYXdWYWxpZGF0b3JzfWZ1bmN0aW9uIGZqKHQpe3JldHVybiB0Ll9yYXdBc3luY1ZhbGlkYXRvcnN9ZnVuY3Rpb24gZ2oodCl7cmV0dXJuIHQ/QXJyYXkuaXNBcnJheSh0KT90Olt0XTpbXX1mdW5jdGlvbiBoaih0LGUpe3JldHVybiBBcnJheS5pc0FycmF5KHQpP3QuaW5jbHVkZXMoZSk6dD09PWV9ZnVuY3Rpb24gYmoodCxlKXtjb25zdCBuPWdqKGUpO3JldHVybiBnaih0KS5mb3JFYWNoKCh0PT57aGoobix0KXx8bi5wdXNoKHQpfSkpLG59ZnVuY3Rpb24geWoodCxlKXtyZXR1cm4gZ2ooZSkuZmlsdGVyKChlPT4haGoodCxlKSkpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBfantjb25zdHJ1Y3Rvcigpe3RoaXMuX3Jhd1ZhbGlkYXRvcnM9W10sdGhpcy5fcmF3QXN5bmNWYWxpZGF0b3JzPVtdLHRoaXMuX29uRGVzdHJveUNhbGxiYWNrcz1bXX1nZXQgdmFsdWUoKXtyZXR1cm4gdGhpcy5jb250cm9sP3RoaXMuY29udHJvbC52YWx1ZTpudWxsfWdldCB2YWxpZCgpe3JldHVybiB0aGlzLmNvbnRyb2w/dGhpcy5jb250cm9sLnZhbGlkOm51bGx9Z2V0IGludmFsaWQoKXtyZXR1cm4gdGhpcy5jb250cm9sP3RoaXMuY29udHJvbC5pbnZhbGlkOm51bGx9Z2V0IHBlbmRpbmcoKXtyZXR1cm4gdGhpcy5jb250cm9sP3RoaXMuY29udHJvbC5wZW5kaW5nOm51bGx9Z2V0IGRpc2FibGVkKCl7cmV0dXJuIHRoaXMuY29udHJvbD90aGlzLmNvbnRyb2wuZGlzYWJsZWQ6bnVsbH1nZXQgZW5hYmxlZCgpe3JldHVybiB0aGlzLmNvbnRyb2w/dGhpcy5jb250cm9sLmVuYWJsZWQ6bnVsbH1nZXQgZXJyb3JzKCl7cmV0dXJuIHRoaXMuY29udHJvbD90aGlzLmNvbnRyb2wuZXJyb3JzOm51bGx9Z2V0IHByaXN0aW5lKCl7cmV0dXJuIHRoaXMuY29udHJvbD90aGlzLmNvbnRyb2wucHJpc3RpbmU6bnVsbH1nZXQgZGlydHkoKXtyZXR1cm4gdGhpcy5jb250cm9sP3RoaXMuY29udHJvbC5kaXJ0eTpudWxsfWdldCB0b3VjaGVkKCl7cmV0dXJuIHRoaXMuY29udHJvbD90aGlzLmNvbnRyb2wudG91Y2hlZDpudWxsfWdldCBzdGF0dXMoKXtyZXR1cm4gdGhpcy5jb250cm9sP3RoaXMuY29udHJvbC5zdGF0dXM6bnVsbH1nZXQgdW50b3VjaGVkKCl7cmV0dXJuIHRoaXMuY29udHJvbD90aGlzLmNvbnRyb2wudW50b3VjaGVkOm51bGx9Z2V0IHN0YXR1c0NoYW5nZXMoKXtyZXR1cm4gdGhpcy5jb250cm9sP3RoaXMuY29udHJvbC5zdGF0dXNDaGFuZ2VzOm51bGx9Z2V0IHZhbHVlQ2hhbmdlcygpe3JldHVybiB0aGlzLmNvbnRyb2w/dGhpcy5jb250cm9sLnZhbHVlQ2hhbmdlczpudWxsfWdldCBwYXRoKCl7cmV0dXJuIG51bGx9X3NldFZhbGlkYXRvcnModCl7dGhpcy5fcmF3VmFsaWRhdG9ycz10fHxbXSx0aGlzLl9jb21wb3NlZFZhbGlkYXRvckZuPWNqKHRoaXMuX3Jhd1ZhbGlkYXRvcnMpfV9zZXRBc3luY1ZhbGlkYXRvcnModCl7dGhpcy5fcmF3QXN5bmNWYWxpZGF0b3JzPXR8fFtdLHRoaXMuX2NvbXBvc2VkQXN5bmNWYWxpZGF0b3JGbj1waih0aGlzLl9yYXdBc3luY1ZhbGlkYXRvcnMpfWdldCB2YWxpZGF0b3IoKXtyZXR1cm4gdGhpcy5fY29tcG9zZWRWYWxpZGF0b3JGbnx8bnVsbH1nZXQgYXN5bmNWYWxpZGF0b3IoKXtyZXR1cm4gdGhpcy5fY29tcG9zZWRBc3luY1ZhbGlkYXRvckZufHxudWxsfV9yZWdpc3Rlck9uRGVzdHJveSh0KXt0aGlzLl9vbkRlc3Ryb3lDYWxsYmFja3MucHVzaCh0KX1faW52b2tlT25EZXN0cm95Q2FsbGJhY2tzKCl7dGhpcy5fb25EZXN0cm95Q2FsbGJhY2tzLmZvckVhY2goKHQ9PnQoKSkpLHRoaXMuX29uRGVzdHJveUNhbGxiYWNrcz1bXX1yZXNldCh0KXt0aGlzLmNvbnRyb2wmJnRoaXMuY29udHJvbC5yZXNldCh0KX1oYXNFcnJvcih0LGUpe3JldHVybiEhdGhpcy5jb250cm9sJiZ0aGlzLmNvbnRyb2wuaGFzRXJyb3IodCxlKX1nZXRFcnJvcih0LGUpe3JldHVybiB0aGlzLmNvbnRyb2w/dGhpcy5jb250cm9sLmdldEVycm9yKHQsZSk6bnVsbH19X2ouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fF9qKX0sX2ouybVkaXI9bG8oe3R5cGU6X2p9KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIENqIGV4dGVuZHMgX2p7Z2V0IGZvcm1EaXJlY3RpdmUoKXtyZXR1cm4gbnVsbH1nZXQgcGF0aCgpe3JldHVybiBudWxsfX1Dai7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoQ2opKSkobnx8Q2opfX0pKCksQ2ouybVkaXI9bG8oe3R5cGU6Q2osZmVhdHVyZXM6W3hwXX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgTWogZXh0ZW5kcyBfantjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fcGFyZW50PW51bGwsdGhpcy5uYW1lPW51bGwsdGhpcy52YWx1ZUFjY2Vzc29yPW51bGx9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyB2antjb25zdHJ1Y3Rvcih0KXt0aGlzLl9jZD10fWlzKHQpe3ZhciBlLG4sbztyZXR1cm4ic3VibWl0dGVkIj09PXQ/ISEobnVsbD09PShlPXRoaXMuX2NkKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5zdWJtaXR0ZWQpOiEhKG51bGw9PT0obz1udWxsPT09KG49dGhpcy5fY2QpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmNvbnRyb2wpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvW3RdKX19Y2xhc3MgeGogZXh0ZW5kcyB2antjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX19eGouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHhqKShTbShNaiwyKSl9LHhqLsm1ZGlyPWxvKHt0eXBlOnhqLHNlbGVjdG9yczpbWyIiLCJmb3JtQ29udHJvbE5hbWUiLCIiXSxbIiIsIm5nTW9kZWwiLCIiXSxbIiIsImZvcm1Db250cm9sIiwiIl1dLGhvc3RWYXJzOjE0LGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZwdSgibmctdW50b3VjaGVkIixuLmlzKCJ1bnRvdWNoZWQiKSkoIm5nLXRvdWNoZWQiLG4uaXMoInRvdWNoZWQiKSkoIm5nLXByaXN0aW5lIixuLmlzKCJwcmlzdGluZSIpKSgibmctZGlydHkiLG4uaXMoImRpcnR5IikpKCJuZy12YWxpZCIsbi5pcygidmFsaWQiKSkoIm5nLWludmFsaWQiLG4uaXMoImludmFsaWQiKSkoIm5nLXBlbmRpbmciLG4uaXMoInBlbmRpbmciKSl9LGZlYXR1cmVzOlt4cF19KSx4ai5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOk1qLGRlY29yYXRvcnM6W3t0eXBlOkRyfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHhqLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6Iltmb3JtQ29udHJvbE5hbWVdLFtuZ01vZGVsXSxbZm9ybUNvbnRyb2xdIixob3N0OnsiW2NsYXNzLm5nLXVudG91Y2hlZF0iOidpcygidW50b3VjaGVkIiknLCJbY2xhc3MubmctdG91Y2hlZF0iOidpcygidG91Y2hlZCIpJywiW2NsYXNzLm5nLXByaXN0aW5lXSI6J2lzKCJwcmlzdGluZSIpJywiW2NsYXNzLm5nLWRpcnR5XSI6J2lzKCJkaXJ0eSIpJywiW2NsYXNzLm5nLXZhbGlkXSI6J2lzKCJ2YWxpZCIpJywiW2NsYXNzLm5nLWludmFsaWRdIjonaXMoImludmFsaWQiKScsIltjbGFzcy5uZy1wZW5kaW5nXSI6J2lzKCJwZW5kaW5nIiknfX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOk1qLGRlY29yYXRvcnM6W3t0eXBlOkRyfV19XX0pLG51bGwpO2NsYXNzIE9qIGV4dGVuZHMgdmp7Y29uc3RydWN0b3IodCl7c3VwZXIodCl9fU9qLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxPaikoU20oQ2osMTApKX0sT2ouybVkaXI9bG8oe3R5cGU6T2osc2VsZWN0b3JzOltbIiIsImZvcm1Hcm91cE5hbWUiLCIiXSxbIiIsImZvcm1BcnJheU5hbWUiLCIiXSxbIiIsIm5nTW9kZWxHcm91cCIsIiJdLFsiIiwiZm9ybUdyb3VwIiwiIl0sWyJmb3JtIiwzLCJuZ05vRm9ybSIsIiJdLFsiIiwibmdGb3JtIiwiIl1dLGhvc3RWYXJzOjE2LGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZwdSgibmctdW50b3VjaGVkIixuLmlzKCJ1bnRvdWNoZWQiKSkoIm5nLXRvdWNoZWQiLG4uaXMoInRvdWNoZWQiKSkoIm5nLXByaXN0aW5lIixuLmlzKCJwcmlzdGluZSIpKSgibmctZGlydHkiLG4uaXMoImRpcnR5IikpKCJuZy12YWxpZCIsbi5pcygidmFsaWQiKSkoIm5nLWludmFsaWQiLG4uaXMoImludmFsaWQiKSkoIm5nLXBlbmRpbmciLG4uaXMoInBlbmRpbmciKSkoIm5nLXN1Ym1pdHRlZCIsbi5pcygic3VibWl0dGVkIikpfSxmZWF0dXJlczpbeHBdfSksT2ouY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpDaixkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoT2osW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Zvcm1Hcm91cE5hbWVdLFtmb3JtQXJyYXlOYW1lXSxbbmdNb2RlbEdyb3VwXSxbZm9ybUdyb3VwXSxmb3JtOm5vdChbbmdOb0Zvcm1dKSxbbmdGb3JtXSIsaG9zdDp7IltjbGFzcy5uZy11bnRvdWNoZWRdIjonaXMoInVudG91Y2hlZCIpJywiW2NsYXNzLm5nLXRvdWNoZWRdIjonaXMoInRvdWNoZWQiKScsIltjbGFzcy5uZy1wcmlzdGluZV0iOidpcygicHJpc3RpbmUiKScsIltjbGFzcy5uZy1kaXJ0eV0iOidpcygiZGlydHkiKScsIltjbGFzcy5uZy12YWxpZF0iOidpcygidmFsaWQiKScsIltjbGFzcy5uZy1pbnZhbGlkXSI6J2lzKCJpbnZhbGlkIiknLCJbY2xhc3MubmctcGVuZGluZ10iOidpcygicGVuZGluZyIpJywiW2NsYXNzLm5nLXN1Ym1pdHRlZF0iOidpcygic3VibWl0dGVkIiknfX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkNqLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn1dfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IFBqPSdcbiAgICA8ZGl2IFtmb3JtR3JvdXBdPSJteUdyb3VwIj5cbiAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9ImZpcnN0TmFtZSI+XG4gICAgPC9kaXY+XG5cbiAgICBJbiB5b3VyIGNsYXNzOlxuXG4gICAgdGhpcy5teUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgZmlyc3ROYW1lOiBuZXcgRm9ybUNvbnRyb2woKVxuICAgIH0pOycsd2o9J1xuICAgIDxkaXYgW2Zvcm1Hcm91cF09Im15R3JvdXAiPlxuICAgICAgIDxkaXYgZm9ybUdyb3VwTmFtZT0icGVyc29uIj5cbiAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPSJmaXJzdE5hbWUiPlxuICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgSW4geW91ciBjbGFzczpcblxuICAgIHRoaXMubXlHcm91cCA9IG5ldyBGb3JtR3JvdXAoe1xuICAgICAgIHBlcnNvbjogbmV3IEZvcm1Hcm91cCh7IGZpcnN0TmFtZTogbmV3IEZvcm1Db250cm9sKCkgfSlcbiAgICB9KTsnLGtqPSdcbiAgICA8Zm9ybT5cbiAgICAgICA8ZGl2IG5nTW9kZWxHcm91cD0icGVyc29uIj5cbiAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09InBlcnNvbi5uYW1lIiBuYW1lPSJmaXJzdE5hbWUiPlxuICAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT4nOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBTantzdGF0aWMgY29udHJvbFBhcmVudEV4Y2VwdGlvbigpe3Rocm93IG5ldyBFcnJvcihgZm9ybUNvbnRyb2xOYW1lIG11c3QgYmUgdXNlZCB3aXRoIGEgcGFyZW50IGZvcm1Hcm91cCBkaXJlY3RpdmUuICBZb3UnbGwgd2FudCB0byBhZGQgYSBmb3JtR3JvdXBcbiAgICAgICBkaXJlY3RpdmUgYW5kIHBhc3MgaXQgYW4gZXhpc3RpbmcgRm9ybUdyb3VwIGluc3RhbmNlICh5b3UgY2FuIGNyZWF0ZSBvbmUgaW4geW91ciBjbGFzcykuXG5cbiAgICAgIEV4YW1wbGU6XG5cbiAgICAgICR7UGp9YCl9c3RhdGljIG5nTW9kZWxHcm91cEV4Y2VwdGlvbigpe3Rocm93IG5ldyBFcnJvcihgZm9ybUNvbnRyb2xOYW1lIGNhbm5vdCBiZSB1c2VkIHdpdGggYW4gbmdNb2RlbEdyb3VwIHBhcmVudC4gSXQgaXMgb25seSBjb21wYXRpYmxlIHdpdGggcGFyZW50c1xuICAgICAgIHRoYXQgYWxzbyBoYXZlIGEgImZvcm0iIHByZWZpeDogZm9ybUdyb3VwTmFtZSwgZm9ybUFycmF5TmFtZSwgb3IgZm9ybUdyb3VwLlxuXG4gICAgICAgT3B0aW9uIDE6ICBVcGRhdGUgdGhlIHBhcmVudCB0byBiZSBmb3JtR3JvdXBOYW1lIChyZWFjdGl2ZSBmb3JtIHN0cmF0ZWd5KVxuXG4gICAgICAgICR7d2p9XG5cbiAgICAgICAgT3B0aW9uIDI6IFVzZSBuZ01vZGVsIGluc3RlYWQgb2YgZm9ybUNvbnRyb2xOYW1lICh0ZW1wbGF0ZS1kcml2ZW4gc3RyYXRlZ3kpXG5cbiAgICAgICAgJHtran1gKX1zdGF0aWMgbWlzc2luZ0Zvcm1FeGNlcHRpb24oKXt0aHJvdyBuZXcgRXJyb3IoYGZvcm1Hcm91cCBleHBlY3RzIGEgRm9ybUdyb3VwIGluc3RhbmNlLiBQbGVhc2UgcGFzcyBvbmUgaW4uXG5cbiAgICAgICBFeGFtcGxlOlxuXG4gICAgICAgJHtQan1gKX1zdGF0aWMgZ3JvdXBQYXJlbnRFeGNlcHRpb24oKXt0aHJvdyBuZXcgRXJyb3IoYGZvcm1Hcm91cE5hbWUgbXVzdCBiZSB1c2VkIHdpdGggYSBwYXJlbnQgZm9ybUdyb3VwIGRpcmVjdGl2ZS4gIFlvdSdsbCB3YW50IHRvIGFkZCBhIGZvcm1Hcm91cFxuICAgICAgZGlyZWN0aXZlIGFuZCBwYXNzIGl0IGFuIGV4aXN0aW5nIEZvcm1Hcm91cCBpbnN0YW5jZSAoeW91IGNhbiBjcmVhdGUgb25lIGluIHlvdXIgY2xhc3MpLlxuXG4gICAgICBFeGFtcGxlOlxuXG4gICAgICAke3dqfWApfXN0YXRpYyBhcnJheVBhcmVudEV4Y2VwdGlvbigpe3Rocm93IG5ldyBFcnJvcignZm9ybUFycmF5TmFtZSBtdXN0IGJlIHVzZWQgd2l0aCBhIHBhcmVudCBmb3JtR3JvdXAgZGlyZWN0aXZlLiAgWW91XCdsbCB3YW50IHRvIGFkZCBhIGZvcm1Hcm91cFxuICAgICAgIGRpcmVjdGl2ZSBhbmQgcGFzcyBpdCBhbiBleGlzdGluZyBGb3JtR3JvdXAgaW5zdGFuY2UgKHlvdSBjYW4gY3JlYXRlIG9uZSBpbiB5b3VyIGNsYXNzKS5cblxuICAgICAgICBFeGFtcGxlOlxuXG4gICAgICAgIFxuICAgIDxkaXYgW2Zvcm1Hcm91cF09Im15R3JvdXAiPlxuICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPSJjaXRpZXMiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj0ibGV0IGNpdHkgb2YgY2l0eUFycmF5LmNvbnRyb2xzOyBpbmRleCBhcyBpIj5cbiAgICAgICAgICA8aW5wdXQgW2Zvcm1Db250cm9sTmFtZV09ImkiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgSW4geW91ciBjbGFzczpcblxuICAgIHRoaXMuY2l0eUFycmF5ID0gbmV3IEZvcm1BcnJheShbbmV3IEZvcm1Db250cm9sKFwnU0ZcJyldKTtcbiAgICB0aGlzLm15R3JvdXAgPSBuZXcgRm9ybUdyb3VwKHtcbiAgICAgIGNpdGllczogdGhpcy5jaXR5QXJyYXlcbiAgICB9KTsnKX1zdGF0aWMgZGlzYWJsZWRBdHRyV2FybmluZygpe2NvbnNvbGUud2FybigiXG4gICAgICBJdCBsb29rcyBsaWtlIHlvdSdyZSB1c2luZyB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIHdpdGggYSByZWFjdGl2ZSBmb3JtIGRpcmVjdGl2ZS4gSWYgeW91IHNldCBkaXNhYmxlZCB0byB0cnVlXG4gICAgICB3aGVuIHlvdSBzZXQgdXAgdGhpcyBjb250cm9sIGluIHlvdXIgY29tcG9uZW50IGNsYXNzLCB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIHdpbGwgYWN0dWFsbHkgYmUgc2V0IGluIHRoZSBET00gZm9yXG4gICAgICB5b3UuIFdlIHJlY29tbWVuZCB1c2luZyB0aGlzIGFwcHJvYWNoIHRvIGF2b2lkICdjaGFuZ2VkIGFmdGVyIGNoZWNrZWQnIGVycm9ycy5cblxuICAgICAgRXhhbXBsZTpcbiAgICAgIGZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICAgICAgZmlyc3Q6IG5ldyBGb3JtQ29udHJvbCh7dmFsdWU6ICdOYW5jeScsIGRpc2FibGVkOiB0cnVlfSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICAgIGxhc3Q6IG5ldyBGb3JtQ29udHJvbCgnRHJldycsIFZhbGlkYXRvcnMucmVxdWlyZWQpXG4gICAgICB9KTtcbiAgICAiKX1zdGF0aWMgbmdNb2RlbFdhcm5pbmcodCl7Y29uc29sZS53YXJuKGBcbiAgICBJdCBsb29rcyBsaWtlIHlvdSdyZSB1c2luZyBuZ01vZGVsIG9uIHRoZSBzYW1lIGZvcm0gZmllbGQgYXMgJHt0fS5cbiAgICBTdXBwb3J0IGZvciB1c2luZyB0aGUgbmdNb2RlbCBpbnB1dCBwcm9wZXJ0eSBhbmQgbmdNb2RlbENoYW5nZSBldmVudCB3aXRoXG4gICAgcmVhY3RpdmUgZm9ybSBkaXJlY3RpdmVzIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gQW5ndWxhciB2NiBhbmQgd2lsbCBiZSByZW1vdmVkXG4gICAgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBBbmd1bGFyLlxuXG4gICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcywgc2VlIG91ciBBUEkgZG9jcyBoZXJlOlxuICAgIGh0dHBzOi8vYW5ndWxhci5pby9hcGkvZm9ybXMvJHsiZm9ybUNvbnRyb2wiPT09dD8iRm9ybUNvbnRyb2xEaXJlY3RpdmUiOiJGb3JtQ29udHJvbE5hbWUifSN1c2Utd2l0aC1uZ21vZGVsXG4gICAgYCl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBEaih0LGUpe3JldHVyblsuLi5lLnBhdGgsdF19ZnVuY3Rpb24gRWoodCxlKXsoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJih0fHxIaihlLCJDYW5ub3QgZmluZCBjb250cm9sIHdpdGgiKSxlLnZhbHVlQWNjZXNzb3J8fEhqKGUsIk5vIHZhbHVlIGFjY2Vzc29yIGZvciBmb3JtIGNvbnRyb2wgd2l0aCIpKSxUaih0LGUpLGUudmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlKHQudmFsdWUpLChmdW5jdGlvbiBuKHQsZSl7ZS52YWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25DaGFuZ2UoKG49Pnt0Ll9wZW5kaW5nVmFsdWU9bix0Ll9wZW5kaW5nQ2hhbmdlPSEwLHQuX3BlbmRpbmdEaXJ0eT0hMCwiY2hhbmdlIj09PXQudXBkYXRlT24mJnpqKHQsZSl9KSl9KSh0LGUpLChmdW5jdGlvbiBvKHQsZSl7Y29uc3Qgbj0odCxuKT0+e2UudmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlKHQpLG4mJmUudmlld1RvTW9kZWxVcGRhdGUodCl9O3QucmVnaXN0ZXJPbkNoYW5nZShuKSxlLl9yZWdpc3Rlck9uRGVzdHJveSgoKCk9Pnt0Ll91bnJlZ2lzdGVyT25DaGFuZ2Uobil9KSl9KSh0LGUpLChmdW5jdGlvbiBpKHQsZSl7ZS52YWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25Ub3VjaGVkKCgoKT0+e3QuX3BlbmRpbmdUb3VjaGVkPSEwLCJibHVyIj09PXQudXBkYXRlT24mJnQuX3BlbmRpbmdDaGFuZ2UmJnpqKHQsZSksInN1Ym1pdCIhPT10LnVwZGF0ZU9uJiZ0Lm1hcmtBc1RvdWNoZWQoKX0pKX0pKHQsZSksKGZ1bmN0aW9uIGEodCxlKXtpZihlLnZhbHVlQWNjZXNzb3Iuc2V0RGlzYWJsZWRTdGF0ZSl7Y29uc3Qgbj10PT57ZS52YWx1ZUFjY2Vzc29yLnNldERpc2FibGVkU3RhdGUodCl9O3QucmVnaXN0ZXJPbkRpc2FibGVkQ2hhbmdlKG4pLGUuX3JlZ2lzdGVyT25EZXN0cm95KCgoKT0+e3QuX3VucmVnaXN0ZXJPbkRpc2FibGVkQ2hhbmdlKG4pfSkpfX0pKHQsZSl9ZnVuY3Rpb24gUmoodCxlLG49ITApe2NvbnN0IG89KCk9PntuJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJihmdW5jdGlvbiB0KGUpe0hqKGUsIlRoZXJlIGlzIG5vIEZvcm1Db250cm9sIGluc3RhbmNlIGF0dGFjaGVkIHRvIGZvcm0gY29udHJvbCBlbGVtZW50IHdpdGgiKX0pKGUpfTtlLnZhbHVlQWNjZXNzb3ImJihlLnZhbHVlQWNjZXNzb3IucmVnaXN0ZXJPbkNoYW5nZShvKSxlLnZhbHVlQWNjZXNzb3IucmVnaXN0ZXJPblRvdWNoZWQobykpLE5qKHQsZSksdCYmKGUuX2ludm9rZU9uRGVzdHJveUNhbGxiYWNrcygpLHQuX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKCgoKT0+e30pKSl9ZnVuY3Rpb24gQWoodCxlKXt0LmZvckVhY2goKHQ9Pnt0LnJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UmJnQucmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShlKX0pKX1mdW5jdGlvbiBUaih0LGUpe2NvbnN0IG49dWoodCk7bnVsbCE9PWUudmFsaWRhdG9yP3Quc2V0VmFsaWRhdG9ycyhtaihuLGUudmFsaWRhdG9yKSk6ImZ1bmN0aW9uIj09dHlwZW9mIG4mJnQuc2V0VmFsaWRhdG9ycyhbbl0pO2NvbnN0IG89ZmoodCk7bnVsbCE9PWUuYXN5bmNWYWxpZGF0b3I/dC5zZXRBc3luY1ZhbGlkYXRvcnMobWoobyxlLmFzeW5jVmFsaWRhdG9yKSk6ImZ1bmN0aW9uIj09dHlwZW9mIG8mJnQuc2V0QXN5bmNWYWxpZGF0b3JzKFtvXSk7Y29uc3QgaT0oKT0+dC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7QWooZS5fcmF3VmFsaWRhdG9ycyxpKSxBaihlLl9yYXdBc3luY1ZhbGlkYXRvcnMsaSl9ZnVuY3Rpb24gTmoodCxlKXtsZXQgbj0hMTtpZihudWxsIT09dCl7aWYobnVsbCE9PWUudmFsaWRhdG9yKXtjb25zdCBvPXVqKHQpO2lmKEFycmF5LmlzQXJyYXkobykmJm8ubGVuZ3RoPjApe2NvbnN0IGk9by5maWx0ZXIoKHQ9PnQhPT1lLnZhbGlkYXRvcikpO2kubGVuZ3RoIT09by5sZW5ndGgmJihuPSEwLHQuc2V0VmFsaWRhdG9ycyhpKSl9fWlmKG51bGwhPT1lLmFzeW5jVmFsaWRhdG9yKXtjb25zdCBvPWZqKHQpO2lmKEFycmF5LmlzQXJyYXkobykmJm8ubGVuZ3RoPjApe2NvbnN0IGk9by5maWx0ZXIoKHQ9PnQhPT1lLmFzeW5jVmFsaWRhdG9yKSk7aS5sZW5ndGghPT1vLmxlbmd0aCYmKG49ITAsdC5zZXRBc3luY1ZhbGlkYXRvcnMoaSkpfX19Y29uc3Qgbz0oKT0+e307cmV0dXJuIEFqKGUuX3Jhd1ZhbGlkYXRvcnMsbyksQWooZS5fcmF3QXN5bmNWYWxpZGF0b3JzLG8pLG59ZnVuY3Rpb24gemoodCxlKXt0Ll9wZW5kaW5nRGlydHkmJnQubWFya0FzRGlydHkoKSx0LnNldFZhbHVlKHQuX3BlbmRpbmdWYWx1ZSx7ZW1pdE1vZGVsVG9WaWV3Q2hhbmdlOiExfSksZS52aWV3VG9Nb2RlbFVwZGF0ZSh0Ll9wZW5kaW5nVmFsdWUpLHQuX3BlbmRpbmdDaGFuZ2U9ITF9ZnVuY3Rpb24gSWoodCxlKXtudWxsIT10fHwidW5kZWZpbmVkIiE9dHlwZW9mIG5nRGV2TW9kZSYmIW5nRGV2TW9kZXx8SGooZSwiQ2Fubm90IGZpbmQgY29udHJvbCB3aXRoIiksVGoodCxlKX1mdW5jdGlvbiBIaih0LGUpe2xldCBuO3Rocm93IG49dC5wYXRoLmxlbmd0aD4xP2BwYXRoOiAnJHt0LnBhdGguam9pbigiIC0+ICIpfSdgOnQucGF0aFswXT9gbmFtZTogJyR7dC5wYXRofSdgOiJ1bnNwZWNpZmllZCBuYW1lIGF0dHJpYnV0ZSIsbmV3IEVycm9yKGAke2V9ICR7bn1gKX1mdW5jdGlvbiBGaih0LGUpe2lmKCF0Lmhhc093blByb3BlcnR5KCJtb2RlbCIpKXJldHVybiExO2NvbnN0IG49dC5tb2RlbDtyZXR1cm4hIW4uaXNGaXJzdENoYW5nZSgpfHwhT2JqZWN0LmlzKGUsbi5jdXJyZW50VmFsdWUpfWZ1bmN0aW9uIExqKHQsZSl7dC5fc3luY1BlbmRpbmdDb250cm9scygpLGUuZm9yRWFjaCgodD0+e2NvbnN0IGU9dC5jb250cm9sOyJzdWJtaXQiPT09ZS51cGRhdGVPbiYmZS5fcGVuZGluZ0NoYW5nZSYmKHQudmlld1RvTW9kZWxVcGRhdGUoZS5fcGVuZGluZ1ZhbHVlKSxlLl9wZW5kaW5nQ2hhbmdlPSExKX0pKX1mdW5jdGlvbiBCaih0LGUpe2lmKCFlKXJldHVybiBudWxsO2xldCBuLG8saTtyZXR1cm4gQXJyYXkuaXNBcnJheShlKXx8InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0Rldk1vZGUmJiFuZ0Rldk1vZGV8fEhqKHQsIlZhbHVlIGFjY2Vzc29yIHdhcyBub3QgcHJvdmlkZWQgYXMgYW4gYXJyYXkgZm9yIGZvcm0gY29udHJvbCB3aXRoIiksZS5mb3JFYWNoKChlPT57ZS5jb25zdHJ1Y3Rvcj09PVZWP249ZTooZnVuY3Rpb24gYSh0KXtyZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKHQuY29uc3RydWN0b3IpPT09elZ9KShlKT8obyYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZIaih0LCJNb3JlIHRoYW4gb25lIGJ1aWx0LWluIHZhbHVlIGFjY2Vzc29yIG1hdGNoZXMgZm9ybSBjb250cm9sIHdpdGgiKSxvPWUpOihpJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJkhqKHQsIk1vcmUgdGhhbiBvbmUgY3VzdG9tIHZhbHVlIGFjY2Vzc29yIG1hdGNoZXMgZm9ybSBjb250cm9sIHdpdGgiKSxpPWUpfSkpLGl8fG98fG58fCgoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJkhqKHQsIk5vIHZhbGlkIHZhbHVlIGFjY2Vzc29yIGZvciBmb3JtIGNvbnRyb2wgd2l0aCIpLG51bGwpfWZ1bmN0aW9uIFZqKHQsZSl7Y29uc3Qgbj10LmluZGV4T2YoZSk7bj4tMSYmdC5zcGxpY2UobiwxKX1mdW5jdGlvbiBqaih0LGUsbixvKXsibmV2ZXIiIT09byYmKChudWxsIT09byYmIm9uY2UiIT09b3x8ZS5fbmdNb2RlbFdhcm5pbmdTZW50T25jZSkmJigiYWx3YXlzIiE9PW98fG4uX25nTW9kZWxXYXJuaW5nU2VudCl8fChTai5uZ01vZGVsV2FybmluZyh0KSxlLl9uZ01vZGVsV2FybmluZ1NlbnRPbmNlPSEwLG4uX25nTW9kZWxXYXJuaW5nU2VudD0hMCkpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jb25zdCBVaj0iVkFMSUQiLEdqPSJJTlZBTElEIixXaj0iUEVORElORyIsWWo9IkRJU0FCTEVEIjtmdW5jdGlvbiBxaih0KXtyZXR1cm4oSmoodCk/dC52YWxpZGF0b3JzOnQpfHxudWxsfWZ1bmN0aW9uIFpqKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpP2NqKHQpOnR8fG51bGx9ZnVuY3Rpb24gWGoodCxlKXtyZXR1cm4oSmooZSk/ZS5hc3luY1ZhbGlkYXRvcnM6dCl8fG51bGx9ZnVuY3Rpb24gS2oodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/cGoodCk6dHx8bnVsbH1mdW5jdGlvbiBKaih0KXtyZXR1cm4gbnVsbCE9dCYmIUFycmF5LmlzQXJyYXkodCkmJiJvYmplY3QiPT10eXBlb2YgdH1jbGFzcyBRantjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX2hhc093blBlbmRpbmdBc3luY1ZhbGlkYXRvcj0hMSx0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2U9KCk9Pnt9LHRoaXMuX3BhcmVudD1udWxsLHRoaXMucHJpc3RpbmU9ITAsdGhpcy50b3VjaGVkPSExLHRoaXMuX29uRGlzYWJsZWRDaGFuZ2U9W10sdGhpcy5fcmF3VmFsaWRhdG9ycz10LHRoaXMuX3Jhd0FzeW5jVmFsaWRhdG9ycz1lLHRoaXMuX2NvbXBvc2VkVmFsaWRhdG9yRm49WmoodGhpcy5fcmF3VmFsaWRhdG9ycyksdGhpcy5fY29tcG9zZWRBc3luY1ZhbGlkYXRvckZuPUtqKHRoaXMuX3Jhd0FzeW5jVmFsaWRhdG9ycyl9Z2V0IHZhbGlkYXRvcigpe3JldHVybiB0aGlzLl9jb21wb3NlZFZhbGlkYXRvckZufXNldCB2YWxpZGF0b3IodCl7dGhpcy5fcmF3VmFsaWRhdG9ycz10aGlzLl9jb21wb3NlZFZhbGlkYXRvckZuPXR9Z2V0IGFzeW5jVmFsaWRhdG9yKCl7cmV0dXJuIHRoaXMuX2NvbXBvc2VkQXN5bmNWYWxpZGF0b3JGbn1zZXQgYXN5bmNWYWxpZGF0b3IodCl7dGhpcy5fcmF3QXN5bmNWYWxpZGF0b3JzPXRoaXMuX2NvbXBvc2VkQXN5bmNWYWxpZGF0b3JGbj10fWdldCBwYXJlbnQoKXtyZXR1cm4gdGhpcy5fcGFyZW50fWdldCB2YWxpZCgpe3JldHVybiB0aGlzLnN0YXR1cz09PVVqfWdldCBpbnZhbGlkKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT09R2p9Z2V0IHBlbmRpbmcoKXtyZXR1cm4gdGhpcy5zdGF0dXM9PVdqfWdldCBkaXNhYmxlZCgpe3JldHVybiB0aGlzLnN0YXR1cz09PVlqfWdldCBlbmFibGVkKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT09WWp9Z2V0IGRpcnR5KCl7cmV0dXJuIXRoaXMucHJpc3RpbmV9Z2V0IHVudG91Y2hlZCgpe3JldHVybiF0aGlzLnRvdWNoZWR9Z2V0IHVwZGF0ZU9uKCl7cmV0dXJuIHRoaXMuX3VwZGF0ZU9uP3RoaXMuX3VwZGF0ZU9uOnRoaXMucGFyZW50P3RoaXMucGFyZW50LnVwZGF0ZU9uOiJjaGFuZ2UifXNldFZhbGlkYXRvcnModCl7dGhpcy5fcmF3VmFsaWRhdG9ycz10LHRoaXMuX2NvbXBvc2VkVmFsaWRhdG9yRm49WmoodCl9c2V0QXN5bmNWYWxpZGF0b3JzKHQpe3RoaXMuX3Jhd0FzeW5jVmFsaWRhdG9ycz10LHRoaXMuX2NvbXBvc2VkQXN5bmNWYWxpZGF0b3JGbj1Laih0KX1hZGRWYWxpZGF0b3JzKHQpe3RoaXMuc2V0VmFsaWRhdG9ycyhiaih0LHRoaXMuX3Jhd1ZhbGlkYXRvcnMpKX1hZGRBc3luY1ZhbGlkYXRvcnModCl7dGhpcy5zZXRBc3luY1ZhbGlkYXRvcnMoYmoodCx0aGlzLl9yYXdBc3luY1ZhbGlkYXRvcnMpKX1yZW1vdmVWYWxpZGF0b3JzKHQpe3RoaXMuc2V0VmFsaWRhdG9ycyh5aih0LHRoaXMuX3Jhd1ZhbGlkYXRvcnMpKX1yZW1vdmVBc3luY1ZhbGlkYXRvcnModCl7dGhpcy5zZXRBc3luY1ZhbGlkYXRvcnMoeWoodCx0aGlzLl9yYXdBc3luY1ZhbGlkYXRvcnMpKX1oYXNWYWxpZGF0b3IodCl7cmV0dXJuIGhqKHRoaXMuX3Jhd1ZhbGlkYXRvcnMsdCl9aGFzQXN5bmNWYWxpZGF0b3IodCl7cmV0dXJuIGhqKHRoaXMuX3Jhd0FzeW5jVmFsaWRhdG9ycyx0KX1jbGVhclZhbGlkYXRvcnMoKXt0aGlzLnZhbGlkYXRvcj1udWxsfWNsZWFyQXN5bmNWYWxpZGF0b3JzKCl7dGhpcy5hc3luY1ZhbGlkYXRvcj1udWxsfW1hcmtBc1RvdWNoZWQodD17fSl7dGhpcy50b3VjaGVkPSEwLHRoaXMuX3BhcmVudCYmIXQub25seVNlbGYmJnRoaXMuX3BhcmVudC5tYXJrQXNUb3VjaGVkKHQpfW1hcmtBbGxBc1RvdWNoZWQoKXt0aGlzLm1hcmtBc1RvdWNoZWQoe29ubHlTZWxmOiEwfSksdGhpcy5fZm9yRWFjaENoaWxkKCh0PT50Lm1hcmtBbGxBc1RvdWNoZWQoKSkpfW1hcmtBc1VudG91Y2hlZCh0PXt9KXt0aGlzLnRvdWNoZWQ9ITEsdGhpcy5fcGVuZGluZ1RvdWNoZWQ9ITEsdGhpcy5fZm9yRWFjaENoaWxkKCh0PT57dC5tYXJrQXNVbnRvdWNoZWQoe29ubHlTZWxmOiEwfSl9KSksdGhpcy5fcGFyZW50JiYhdC5vbmx5U2VsZiYmdGhpcy5fcGFyZW50Ll91cGRhdGVUb3VjaGVkKHQpfW1hcmtBc0RpcnR5KHQ9e30pe3RoaXMucHJpc3RpbmU9ITEsdGhpcy5fcGFyZW50JiYhdC5vbmx5U2VsZiYmdGhpcy5fcGFyZW50Lm1hcmtBc0RpcnR5KHQpfW1hcmtBc1ByaXN0aW5lKHQ9e30pe3RoaXMucHJpc3RpbmU9ITAsdGhpcy5fcGVuZGluZ0RpcnR5PSExLHRoaXMuX2ZvckVhY2hDaGlsZCgodD0+e3QubWFya0FzUHJpc3RpbmUoe29ubHlTZWxmOiEwfSl9KSksdGhpcy5fcGFyZW50JiYhdC5vbmx5U2VsZiYmdGhpcy5fcGFyZW50Ll91cGRhdGVQcmlzdGluZSh0KX1tYXJrQXNQZW5kaW5nKHQ9e30pe3RoaXMuc3RhdHVzPVdqLCExIT09dC5lbWl0RXZlbnQmJnRoaXMuc3RhdHVzQ2hhbmdlcy5lbWl0KHRoaXMuc3RhdHVzKSx0aGlzLl9wYXJlbnQmJiF0Lm9ubHlTZWxmJiZ0aGlzLl9wYXJlbnQubWFya0FzUGVuZGluZyh0KX1kaXNhYmxlKHQ9e30pe2NvbnN0IGU9dGhpcy5fcGFyZW50TWFya2VkRGlydHkodC5vbmx5U2VsZik7dGhpcy5zdGF0dXM9WWosdGhpcy5lcnJvcnM9bnVsbCx0aGlzLl9mb3JFYWNoQ2hpbGQoKGU9PntlLmRpc2FibGUoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtvbmx5U2VsZjohMH0pKX0pKSx0aGlzLl91cGRhdGVWYWx1ZSgpLCExIT09dC5lbWl0RXZlbnQmJih0aGlzLnZhbHVlQ2hhbmdlcy5lbWl0KHRoaXMudmFsdWUpLHRoaXMuc3RhdHVzQ2hhbmdlcy5lbWl0KHRoaXMuc3RhdHVzKSksdGhpcy5fdXBkYXRlQW5jZXN0b3JzKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7c2tpcFByaXN0aW5lQ2hlY2s6ZX0pKSx0aGlzLl9vbkRpc2FibGVkQ2hhbmdlLmZvckVhY2goKHQ9PnQoITApKSl9ZW5hYmxlKHQ9e30pe2NvbnN0IGU9dGhpcy5fcGFyZW50TWFya2VkRGlydHkodC5vbmx5U2VsZik7dGhpcy5zdGF0dXM9VWosdGhpcy5fZm9yRWFjaENoaWxkKChlPT57ZS5lbmFibGUoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtvbmx5U2VsZjohMH0pKX0pKSx0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe29ubHlTZWxmOiEwLGVtaXRFdmVudDp0LmVtaXRFdmVudH0pLHRoaXMuX3VwZGF0ZUFuY2VzdG9ycyhPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NraXBQcmlzdGluZUNoZWNrOmV9KSksdGhpcy5fb25EaXNhYmxlZENoYW5nZS5mb3JFYWNoKCh0PT50KCExKSkpfV91cGRhdGVBbmNlc3RvcnModCl7dGhpcy5fcGFyZW50JiYhdC5vbmx5U2VsZiYmKHRoaXMuX3BhcmVudC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHQpLHQuc2tpcFByaXN0aW5lQ2hlY2t8fHRoaXMuX3BhcmVudC5fdXBkYXRlUHJpc3RpbmUoKSx0aGlzLl9wYXJlbnQuX3VwZGF0ZVRvdWNoZWQoKSl9c2V0UGFyZW50KHQpe3RoaXMuX3BhcmVudD10fXVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkodD17fSl7dGhpcy5fc2V0SW5pdGlhbFN0YXR1cygpLHRoaXMuX3VwZGF0ZVZhbHVlKCksdGhpcy5lbmFibGVkJiYodGhpcy5fY2FuY2VsRXhpc3RpbmdTdWJzY3JpcHRpb24oKSx0aGlzLmVycm9ycz10aGlzLl9ydW5WYWxpZGF0b3IoKSx0aGlzLnN0YXR1cz10aGlzLl9jYWxjdWxhdGVTdGF0dXMoKSx0aGlzLnN0YXR1cyE9PVVqJiZ0aGlzLnN0YXR1cyE9PVdqfHx0aGlzLl9ydW5Bc3luY1ZhbGlkYXRvcih0LmVtaXRFdmVudCkpLCExIT09dC5lbWl0RXZlbnQmJih0aGlzLnZhbHVlQ2hhbmdlcy5lbWl0KHRoaXMudmFsdWUpLHRoaXMuc3RhdHVzQ2hhbmdlcy5lbWl0KHRoaXMuc3RhdHVzKSksdGhpcy5fcGFyZW50JiYhdC5vbmx5U2VsZiYmdGhpcy5fcGFyZW50LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkodCl9X3VwZGF0ZVRyZWVWYWxpZGl0eSh0PXtlbWl0RXZlbnQ6ITB9KXt0aGlzLl9mb3JFYWNoQ2hpbGQoKGU9PmUuX3VwZGF0ZVRyZWVWYWxpZGl0eSh0KSkpLHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7b25seVNlbGY6ITAsZW1pdEV2ZW50OnQuZW1pdEV2ZW50fSl9X3NldEluaXRpYWxTdGF0dXMoKXt0aGlzLnN0YXR1cz10aGlzLl9hbGxDb250cm9sc0Rpc2FibGVkKCk/WWo6VWp9X3J1blZhbGlkYXRvcigpe3JldHVybiB0aGlzLnZhbGlkYXRvcj90aGlzLnZhbGlkYXRvcih0aGlzKTpudWxsfV9ydW5Bc3luY1ZhbGlkYXRvcih0KXtpZih0aGlzLmFzeW5jVmFsaWRhdG9yKXt0aGlzLnN0YXR1cz1Xaix0aGlzLl9oYXNPd25QZW5kaW5nQXN5bmNWYWxpZGF0b3I9ITA7Y29uc3QgZT1paih0aGlzLmFzeW5jVmFsaWRhdG9yKHRoaXMpKTt0aGlzLl9hc3luY1ZhbGlkYXRpb25TdWJzY3JpcHRpb249ZS5zdWJzY3JpYmUoKGU9Pnt0aGlzLl9oYXNPd25QZW5kaW5nQXN5bmNWYWxpZGF0b3I9ITEsdGhpcy5zZXRFcnJvcnMoZSx7ZW1pdEV2ZW50OnR9KX0pKX19X2NhbmNlbEV4aXN0aW5nU3Vic2NyaXB0aW9uKCl7dGhpcy5fYXN5bmNWYWxpZGF0aW9uU3Vic2NyaXB0aW9uJiYodGhpcy5fYXN5bmNWYWxpZGF0aW9uU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5faGFzT3duUGVuZGluZ0FzeW5jVmFsaWRhdG9yPSExKX1zZXRFcnJvcnModCxlPXt9KXt0aGlzLmVycm9ycz10LHRoaXMuX3VwZGF0ZUNvbnRyb2xzRXJyb3JzKCExIT09ZS5lbWl0RXZlbnQpfWdldCh0KXtyZXR1cm4oZnVuY3Rpb24gZSh0LG4sbyl7aWYobnVsbD09bilyZXR1cm4gbnVsbDtpZihBcnJheS5pc0FycmF5KG4pfHwobj1uLnNwbGl0KG8pKSxBcnJheS5pc0FycmF5KG4pJiYwPT09bi5sZW5ndGgpcmV0dXJuIG51bGw7bGV0IGk9dDtyZXR1cm4gbi5mb3JFYWNoKCh0PT57aT1pIGluc3RhbmNlb2YgdFU/aS5jb250cm9scy5oYXNPd25Qcm9wZXJ0eSh0KT9pLmNvbnRyb2xzW3RdOm51bGw6aSBpbnN0YW5jZW9mIGVVJiZpLmF0KHQpfHxudWxsfSkpLGl9KSh0aGlzLHQsIi4iKX1nZXRFcnJvcih0LGUpe2NvbnN0IG49ZT90aGlzLmdldChlKTp0aGlzO3JldHVybiBuJiZuLmVycm9ycz9uLmVycm9yc1t0XTpudWxsfWhhc0Vycm9yKHQsZSl7cmV0dXJuISF0aGlzLmdldEVycm9yKHQsZSl9Z2V0IHJvb3QoKXtsZXQgdD10aGlzO2Zvcig7dC5fcGFyZW50Oyl0PXQuX3BhcmVudDtyZXR1cm4gdH1fdXBkYXRlQ29udHJvbHNFcnJvcnModCl7dGhpcy5zdGF0dXM9dGhpcy5fY2FsY3VsYXRlU3RhdHVzKCksdCYmdGhpcy5zdGF0dXNDaGFuZ2VzLmVtaXQodGhpcy5zdGF0dXMpLHRoaXMuX3BhcmVudCYmdGhpcy5fcGFyZW50Ll91cGRhdGVDb250cm9sc0Vycm9ycyh0KX1faW5pdE9ic2VydmFibGVzKCl7dGhpcy52YWx1ZUNoYW5nZXM9bmV3IExoLHRoaXMuc3RhdHVzQ2hhbmdlcz1uZXcgTGh9X2NhbGN1bGF0ZVN0YXR1cygpe3JldHVybiB0aGlzLl9hbGxDb250cm9sc0Rpc2FibGVkKCk/WWo6dGhpcy5lcnJvcnM/R2o6dGhpcy5faGFzT3duUGVuZGluZ0FzeW5jVmFsaWRhdG9yfHx0aGlzLl9hbnlDb250cm9sc0hhdmVTdGF0dXMoV2opP1dqOnRoaXMuX2FueUNvbnRyb2xzSGF2ZVN0YXR1cyhHaik/R2o6VWp9X2FueUNvbnRyb2xzSGF2ZVN0YXR1cyh0KXtyZXR1cm4gdGhpcy5fYW55Q29udHJvbHMoKGU9PmUuc3RhdHVzPT09dCkpfV9hbnlDb250cm9sc0RpcnR5KCl7cmV0dXJuIHRoaXMuX2FueUNvbnRyb2xzKCh0PT50LmRpcnR5KSl9X2FueUNvbnRyb2xzVG91Y2hlZCgpe3JldHVybiB0aGlzLl9hbnlDb250cm9scygodD0+dC50b3VjaGVkKSl9X3VwZGF0ZVByaXN0aW5lKHQ9e30pe3RoaXMucHJpc3RpbmU9IXRoaXMuX2FueUNvbnRyb2xzRGlydHkoKSx0aGlzLl9wYXJlbnQmJiF0Lm9ubHlTZWxmJiZ0aGlzLl9wYXJlbnQuX3VwZGF0ZVByaXN0aW5lKHQpfV91cGRhdGVUb3VjaGVkKHQ9e30pe3RoaXMudG91Y2hlZD10aGlzLl9hbnlDb250cm9sc1RvdWNoZWQoKSx0aGlzLl9wYXJlbnQmJiF0Lm9ubHlTZWxmJiZ0aGlzLl9wYXJlbnQuX3VwZGF0ZVRvdWNoZWQodCl9X2lzQm94ZWRWYWx1ZSh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10JiYyPT09T2JqZWN0LmtleXModCkubGVuZ3RoJiYidmFsdWUiaW4gdCYmImRpc2FibGVkImluIHR9X3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKHQpe3RoaXMuX29uQ29sbGVjdGlvbkNoYW5nZT10fV9zZXRVcGRhdGVTdHJhdGVneSh0KXtKaih0KSYmbnVsbCE9dC51cGRhdGVPbiYmKHRoaXMuX3VwZGF0ZU9uPXQudXBkYXRlT24pfV9wYXJlbnRNYXJrZWREaXJ0eSh0KXtyZXR1cm4hdCYmISghdGhpcy5fcGFyZW50fHwhdGhpcy5fcGFyZW50LmRpcnR5KSYmIXRoaXMuX3BhcmVudC5fYW55Q29udHJvbHNEaXJ0eSgpfX1jbGFzcyAkaiBleHRlbmRzIFFqe2NvbnN0cnVjdG9yKHQ9bnVsbCxlLG4pe3N1cGVyKHFqKGUpLFhqKG4sZSkpLHRoaXMuX29uQ2hhbmdlPVtdLHRoaXMuX2FwcGx5Rm9ybVN0YXRlKHQpLHRoaXMuX3NldFVwZGF0ZVN0cmF0ZWd5KGUpLHRoaXMuX2luaXRPYnNlcnZhYmxlcygpLHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7b25seVNlbGY6ITAsZW1pdEV2ZW50OiEhdGhpcy5hc3luY1ZhbGlkYXRvcn0pfXNldFZhbHVlKHQsZT17fSl7dGhpcy52YWx1ZT10aGlzLl9wZW5kaW5nVmFsdWU9dCx0aGlzLl9vbkNoYW5nZS5sZW5ndGgmJiExIT09ZS5lbWl0TW9kZWxUb1ZpZXdDaGFuZ2UmJnRoaXMuX29uQ2hhbmdlLmZvckVhY2goKHQ9PnQodGhpcy52YWx1ZSwhMSE9PWUuZW1pdFZpZXdUb01vZGVsQ2hhbmdlKSkpLHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eShlKX1wYXRjaFZhbHVlKHQsZT17fSl7dGhpcy5zZXRWYWx1ZSh0LGUpfXJlc2V0KHQ9bnVsbCxlPXt9KXt0aGlzLl9hcHBseUZvcm1TdGF0ZSh0KSx0aGlzLm1hcmtBc1ByaXN0aW5lKGUpLHRoaXMubWFya0FzVW50b3VjaGVkKGUpLHRoaXMuc2V0VmFsdWUodGhpcy52YWx1ZSxlKSx0aGlzLl9wZW5kaW5nQ2hhbmdlPSExfV91cGRhdGVWYWx1ZSgpe31fYW55Q29udHJvbHModCl7cmV0dXJuITF9X2FsbENvbnRyb2xzRGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5kaXNhYmxlZH1yZWdpc3Rlck9uQ2hhbmdlKHQpe3RoaXMuX29uQ2hhbmdlLnB1c2godCl9X3VucmVnaXN0ZXJPbkNoYW5nZSh0KXtWaih0aGlzLl9vbkNoYW5nZSx0KX1yZWdpc3Rlck9uRGlzYWJsZWRDaGFuZ2UodCl7dGhpcy5fb25EaXNhYmxlZENoYW5nZS5wdXNoKHQpfV91bnJlZ2lzdGVyT25EaXNhYmxlZENoYW5nZSh0KXtWaih0aGlzLl9vbkRpc2FibGVkQ2hhbmdlLHQpfV9mb3JFYWNoQ2hpbGQodCl7fV9zeW5jUGVuZGluZ0NvbnRyb2xzKCl7cmV0dXJuISgic3VibWl0IiE9PXRoaXMudXBkYXRlT258fCh0aGlzLl9wZW5kaW5nRGlydHkmJnRoaXMubWFya0FzRGlydHkoKSx0aGlzLl9wZW5kaW5nVG91Y2hlZCYmdGhpcy5tYXJrQXNUb3VjaGVkKCksIXRoaXMuX3BlbmRpbmdDaGFuZ2UpfHwodGhpcy5zZXRWYWx1ZSh0aGlzLl9wZW5kaW5nVmFsdWUse29ubHlTZWxmOiEwLGVtaXRNb2RlbFRvVmlld0NoYW5nZTohMX0pLDApKX1fYXBwbHlGb3JtU3RhdGUodCl7dGhpcy5faXNCb3hlZFZhbHVlKHQpPyh0aGlzLnZhbHVlPXRoaXMuX3BlbmRpbmdWYWx1ZT10LnZhbHVlLHQuZGlzYWJsZWQ/dGhpcy5kaXNhYmxlKHtvbmx5U2VsZjohMCxlbWl0RXZlbnQ6ITF9KTp0aGlzLmVuYWJsZSh7b25seVNlbGY6ITAsZW1pdEV2ZW50OiExfSkpOnRoaXMudmFsdWU9dGhpcy5fcGVuZGluZ1ZhbHVlPXR9fWNsYXNzIHRVIGV4dGVuZHMgUWp7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHFqKGUpLFhqKG4sZSkpLHRoaXMuY29udHJvbHM9dCx0aGlzLl9pbml0T2JzZXJ2YWJsZXMoKSx0aGlzLl9zZXRVcGRhdGVTdHJhdGVneShlKSx0aGlzLl9zZXRVcENvbnRyb2xzKCksdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtvbmx5U2VsZjohMCxlbWl0RXZlbnQ6ISF0aGlzLmFzeW5jVmFsaWRhdG9yfSl9cmVnaXN0ZXJDb250cm9sKHQsZSl7cmV0dXJuIHRoaXMuY29udHJvbHNbdF0/dGhpcy5jb250cm9sc1t0XToodGhpcy5jb250cm9sc1t0XT1lLGUuc2V0UGFyZW50KHRoaXMpLGUuX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKHRoaXMuX29uQ29sbGVjdGlvbkNoYW5nZSksZSl9YWRkQ29udHJvbCh0LGUsbj17fSl7dGhpcy5yZWdpc3RlckNvbnRyb2wodCxlKSx0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe2VtaXRFdmVudDpuLmVtaXRFdmVudH0pLHRoaXMuX29uQ29sbGVjdGlvbkNoYW5nZSgpfXJlbW92ZUNvbnRyb2wodCxlPXt9KXt0aGlzLmNvbnRyb2xzW3RdJiZ0aGlzLmNvbnRyb2xzW3RdLl9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZSgoKCk9Pnt9KSksZGVsZXRlIHRoaXMuY29udHJvbHNbdF0sdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6ZS5lbWl0RXZlbnR9KSx0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UoKX1zZXRDb250cm9sKHQsZSxuPXt9KXt0aGlzLmNvbnRyb2xzW3RdJiZ0aGlzLmNvbnRyb2xzW3RdLl9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZSgoKCk9Pnt9KSksZGVsZXRlIHRoaXMuY29udHJvbHNbdF0sZSYmdGhpcy5yZWdpc3RlckNvbnRyb2wodCxlKSx0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe2VtaXRFdmVudDpuLmVtaXRFdmVudH0pLHRoaXMuX29uQ29sbGVjdGlvbkNoYW5nZSgpfWNvbnRhaW5zKHQpe3JldHVybiB0aGlzLmNvbnRyb2xzLmhhc093blByb3BlcnR5KHQpJiZ0aGlzLmNvbnRyb2xzW3RdLmVuYWJsZWR9c2V0VmFsdWUodCxlPXt9KXt0aGlzLl9jaGVja0FsbFZhbHVlc1ByZXNlbnQodCksT2JqZWN0LmtleXModCkuZm9yRWFjaCgobj0+e3RoaXMuX3Rocm93SWZDb250cm9sTWlzc2luZyhuKSx0aGlzLmNvbnRyb2xzW25dLnNldFZhbHVlKHRbbl0se29ubHlTZWxmOiEwLGVtaXRFdmVudDplLmVtaXRFdmVudH0pfSkpLHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eShlKX1wYXRjaFZhbHVlKHQsZT17fSl7bnVsbCE9dCYmKE9iamVjdC5rZXlzKHQpLmZvckVhY2goKG49Pnt0aGlzLmNvbnRyb2xzW25dJiZ0aGlzLmNvbnRyb2xzW25dLnBhdGNoVmFsdWUodFtuXSx7b25seVNlbGY6ITAsZW1pdEV2ZW50OmUuZW1pdEV2ZW50fSl9KSksdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KGUpKX1yZXNldCh0PXt9LGU9e30pe3RoaXMuX2ZvckVhY2hDaGlsZCgoKG4sbyk9PntuLnJlc2V0KHRbb10se29ubHlTZWxmOiEwLGVtaXRFdmVudDplLmVtaXRFdmVudH0pfSkpLHRoaXMuX3VwZGF0ZVByaXN0aW5lKGUpLHRoaXMuX3VwZGF0ZVRvdWNoZWQoZSksdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KGUpfWdldFJhd1ZhbHVlKCl7cmV0dXJuIHRoaXMuX3JlZHVjZUNoaWxkcmVuKHt9LCgodCxlLG4pPT4odFtuXT1lIGluc3RhbmNlb2YgJGo/ZS52YWx1ZTplLmdldFJhd1ZhbHVlKCksdCkpKX1fc3luY1BlbmRpbmdDb250cm9scygpe2xldCB0PXRoaXMuX3JlZHVjZUNoaWxkcmVuKCExLCgodCxlKT0+ISFlLl9zeW5jUGVuZGluZ0NvbnRyb2xzKCl8fHQpKTtyZXR1cm4gdCYmdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtvbmx5U2VsZjohMH0pLHR9X3Rocm93SWZDb250cm9sTWlzc2luZyh0KXtpZighT2JqZWN0LmtleXModGhpcy5jb250cm9scykubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiXG4gICAgICAgIFRoZXJlIGFyZSBubyBmb3JtIGNvbnRyb2xzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGdyb3VwIHlldC4gSWYgeW91J3JlIHVzaW5nIG5nTW9kZWwsXG4gICAgICAgIHlvdSBtYXkgd2FudCB0byBjaGVjayBuZXh0IHRpY2sgKGUuZy4gdXNlIHNldFRpbWVvdXQpLlxuICAgICAgIik7aWYoIXRoaXMuY29udHJvbHNbdF0pdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBmb3JtIGNvbnRyb2wgd2l0aCBuYW1lOiAke3R9LmApfV9mb3JFYWNoQ2hpbGQodCl7T2JqZWN0LmtleXModGhpcy5jb250cm9scykuZm9yRWFjaCgoZT0+e2NvbnN0IG49dGhpcy5jb250cm9sc1tlXTtuJiZ0KG4sZSl9KSl9X3NldFVwQ29udHJvbHMoKXt0aGlzLl9mb3JFYWNoQ2hpbGQoKHQ9Pnt0LnNldFBhcmVudCh0aGlzKSx0Ll9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZSh0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UpfSkpfV91cGRhdGVWYWx1ZSgpe3RoaXMudmFsdWU9dGhpcy5fcmVkdWNlVmFsdWUoKX1fYW55Q29udHJvbHModCl7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LmtleXModGhpcy5jb250cm9scykpe2NvbnN0IG49dGhpcy5jb250cm9sc1tlXTtpZih0aGlzLmNvbnRhaW5zKGUpJiZ0KG4pKXJldHVybiEwfXJldHVybiExfV9yZWR1Y2VWYWx1ZSgpe3JldHVybiB0aGlzLl9yZWR1Y2VDaGlsZHJlbih7fSwoKHQsZSxuKT0+KChlLmVuYWJsZWR8fHRoaXMuZGlzYWJsZWQpJiYodFtuXT1lLnZhbHVlKSx0KSkpfV9yZWR1Y2VDaGlsZHJlbih0LGUpe2xldCBuPXQ7cmV0dXJuIHRoaXMuX2ZvckVhY2hDaGlsZCgoKHQsbyk9PntuPWUobix0LG8pfSkpLG59X2FsbENvbnRyb2xzRGlzYWJsZWQoKXtmb3IoY29uc3QgdCBvZiBPYmplY3Qua2V5cyh0aGlzLmNvbnRyb2xzKSlpZih0aGlzLmNvbnRyb2xzW3RdLmVuYWJsZWQpcmV0dXJuITE7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuY29udHJvbHMpLmxlbmd0aD4wfHx0aGlzLmRpc2FibGVkfV9jaGVja0FsbFZhbHVlc1ByZXNlbnQodCl7dGhpcy5fZm9yRWFjaENoaWxkKCgoZSxuKT0+e2lmKHZvaWQgMD09PXRbbl0pdGhyb3cgbmV3IEVycm9yKGBNdXN0IHN1cHBseSBhIHZhbHVlIGZvciBmb3JtIGNvbnRyb2wgd2l0aCBuYW1lOiAnJHtufScuYCl9KSl9fWNsYXNzIGVVIGV4dGVuZHMgUWp7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHFqKGUpLFhqKG4sZSkpLHRoaXMuY29udHJvbHM9dCx0aGlzLl9pbml0T2JzZXJ2YWJsZXMoKSx0aGlzLl9zZXRVcGRhdGVTdHJhdGVneShlKSx0aGlzLl9zZXRVcENvbnRyb2xzKCksdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtvbmx5U2VsZjohMCxlbWl0RXZlbnQ6ISF0aGlzLmFzeW5jVmFsaWRhdG9yfSl9YXQodCl7cmV0dXJuIHRoaXMuY29udHJvbHNbdF19cHVzaCh0LGU9e30pe3RoaXMuY29udHJvbHMucHVzaCh0KSx0aGlzLl9yZWdpc3RlckNvbnRyb2wodCksdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6ZS5lbWl0RXZlbnR9KSx0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UoKX1pbnNlcnQodCxlLG49e30pe3RoaXMuY29udHJvbHMuc3BsaWNlKHQsMCxlKSx0aGlzLl9yZWdpc3RlckNvbnRyb2woZSksdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6bi5lbWl0RXZlbnR9KX1yZW1vdmVBdCh0LGU9e30pe3RoaXMuY29udHJvbHNbdF0mJnRoaXMuY29udHJvbHNbdF0uX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKCgoKT0+e30pKSx0aGlzLmNvbnRyb2xzLnNwbGljZSh0LDEpLHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OmUuZW1pdEV2ZW50fSl9c2V0Q29udHJvbCh0LGUsbj17fSl7dGhpcy5jb250cm9sc1t0XSYmdGhpcy5jb250cm9sc1t0XS5fcmVnaXN0ZXJPbkNvbGxlY3Rpb25DaGFuZ2UoKCgpPT57fSkpLHRoaXMuY29udHJvbHMuc3BsaWNlKHQsMSksZSYmKHRoaXMuY29udHJvbHMuc3BsaWNlKHQsMCxlKSx0aGlzLl9yZWdpc3RlckNvbnRyb2woZSkpLHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50Om4uZW1pdEV2ZW50fSksdGhpcy5fb25Db2xsZWN0aW9uQ2hhbmdlKCl9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmNvbnRyb2xzLmxlbmd0aH1zZXRWYWx1ZSh0LGU9e30pe3RoaXMuX2NoZWNrQWxsVmFsdWVzUHJlc2VudCh0KSx0LmZvckVhY2goKCh0LG4pPT57dGhpcy5fdGhyb3dJZkNvbnRyb2xNaXNzaW5nKG4pLHRoaXMuYXQobikuc2V0VmFsdWUodCx7b25seVNlbGY6ITAsZW1pdEV2ZW50OmUuZW1pdEV2ZW50fSl9KSksdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KGUpfXBhdGNoVmFsdWUodCxlPXt9KXtudWxsIT10JiYodC5mb3JFYWNoKCgodCxuKT0+e3RoaXMuYXQobikmJnRoaXMuYXQobikucGF0Y2hWYWx1ZSh0LHtvbmx5U2VsZjohMCxlbWl0RXZlbnQ6ZS5lbWl0RXZlbnR9KX0pKSx0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoZSkpfXJlc2V0KHQ9W10sZT17fSl7dGhpcy5fZm9yRWFjaENoaWxkKCgobixvKT0+e24ucmVzZXQodFtvXSx7b25seVNlbGY6ITAsZW1pdEV2ZW50OmUuZW1pdEV2ZW50fSl9KSksdGhpcy5fdXBkYXRlUHJpc3RpbmUoZSksdGhpcy5fdXBkYXRlVG91Y2hlZChlKSx0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoZSl9Z2V0UmF3VmFsdWUoKXtyZXR1cm4gdGhpcy5jb250cm9scy5tYXAoKHQ9PnQgaW5zdGFuY2VvZiAkaj90LnZhbHVlOnQuZ2V0UmF3VmFsdWUoKSkpfWNsZWFyKHQ9e30pe3RoaXMuY29udHJvbHMubGVuZ3RoPDF8fCh0aGlzLl9mb3JFYWNoQ2hpbGQoKHQ9PnQuX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKCgoKT0+e30pKSkpLHRoaXMuY29udHJvbHMuc3BsaWNlKDApLHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OnQuZW1pdEV2ZW50fSkpfV9zeW5jUGVuZGluZ0NvbnRyb2xzKCl7bGV0IHQ9dGhpcy5jb250cm9scy5yZWR1Y2UoKCh0LGUpPT4hIWUuX3N5bmNQZW5kaW5nQ29udHJvbHMoKXx8dCksITEpO3JldHVybiB0JiZ0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe29ubHlTZWxmOiEwfSksdH1fdGhyb3dJZkNvbnRyb2xNaXNzaW5nKHQpe2lmKCF0aGlzLmNvbnRyb2xzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlxuICAgICAgICBUaGVyZSBhcmUgbm8gZm9ybSBjb250cm9scyByZWdpc3RlcmVkIHdpdGggdGhpcyBhcnJheSB5ZXQuIElmIHlvdSdyZSB1c2luZyBuZ01vZGVsLFxuICAgICAgICB5b3UgbWF5IHdhbnQgdG8gY2hlY2sgbmV4dCB0aWNrIChlLmcuIHVzZSBzZXRUaW1lb3V0KS5cbiAgICAgICIpO2lmKCF0aGlzLmF0KHQpKXRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgZm9ybSBjb250cm9sIGF0IGluZGV4ICR7dH1gKX1fZm9yRWFjaENoaWxkKHQpe3RoaXMuY29udHJvbHMuZm9yRWFjaCgoKGUsbik9Pnt0KGUsbil9KSl9X3VwZGF0ZVZhbHVlKCl7dGhpcy52YWx1ZT10aGlzLmNvbnRyb2xzLmZpbHRlcigodD0+dC5lbmFibGVkfHx0aGlzLmRpc2FibGVkKSkubWFwKCh0PT50LnZhbHVlKSl9X2FueUNvbnRyb2xzKHQpe3JldHVybiB0aGlzLmNvbnRyb2xzLnNvbWUoKGU9PmUuZW5hYmxlZCYmdChlKSkpfV9zZXRVcENvbnRyb2xzKCl7dGhpcy5fZm9yRWFjaENoaWxkKCh0PT50aGlzLl9yZWdpc3RlckNvbnRyb2wodCkpKX1fY2hlY2tBbGxWYWx1ZXNQcmVzZW50KHQpe3RoaXMuX2ZvckVhY2hDaGlsZCgoKGUsbik9PntpZih2b2lkIDA9PT10W25dKXRocm93IG5ldyBFcnJvcihgTXVzdCBzdXBwbHkgYSB2YWx1ZSBmb3IgZm9ybSBjb250cm9sIGF0IGluZGV4OiAke259LmApfSkpfV9hbGxDb250cm9sc0Rpc2FibGVkKCl7Zm9yKGNvbnN0IHQgb2YgdGhpcy5jb250cm9scylpZih0LmVuYWJsZWQpcmV0dXJuITE7cmV0dXJuIHRoaXMuY29udHJvbHMubGVuZ3RoPjB8fHRoaXMuZGlzYWJsZWR9X3JlZ2lzdGVyQ29udHJvbCh0KXt0LnNldFBhcmVudCh0aGlzKSx0Ll9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZSh0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UpfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3QgblU9e3Byb3ZpZGU6Q2osdXNlRXhpc3Rpbmc6cWUoKCgpPT5pVSkpfSxvVT1Qcm9taXNlLnJlc29sdmUobnVsbCk7Y2xhc3MgaVUgZXh0ZW5kcyBDantjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5zdWJtaXR0ZWQ9ITEsdGhpcy5fZGlyZWN0aXZlcz1bXSx0aGlzLm5nU3VibWl0PW5ldyBMaCx0aGlzLmZvcm09bmV3IHRVKHt9LGNqKHQpLHBqKGUpKX1uZ0FmdGVyVmlld0luaXQoKXt0aGlzLl9zZXRVcGRhdGVTdHJhdGVneSgpfWdldCBmb3JtRGlyZWN0aXZlKCl7cmV0dXJuIHRoaXN9Z2V0IGNvbnRyb2woKXtyZXR1cm4gdGhpcy5mb3JtfWdldCBwYXRoKCl7cmV0dXJuW119Z2V0IGNvbnRyb2xzKCl7cmV0dXJuIHRoaXMuZm9ybS5jb250cm9sc31hZGRDb250cm9sKHQpe29VLnRoZW4oKCgpPT57Y29uc3QgZT10aGlzLl9maW5kQ29udGFpbmVyKHQucGF0aCk7dC5jb250cm9sPWUucmVnaXN0ZXJDb250cm9sKHQubmFtZSx0LmNvbnRyb2wpLEVqKHQuY29udHJvbCx0KSx0LmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiExfSksdGhpcy5fZGlyZWN0aXZlcy5wdXNoKHQpfSkpfWdldENvbnRyb2wodCl7cmV0dXJuIHRoaXMuZm9ybS5nZXQodC5wYXRoKX1yZW1vdmVDb250cm9sKHQpe29VLnRoZW4oKCgpPT57Y29uc3QgZT10aGlzLl9maW5kQ29udGFpbmVyKHQucGF0aCk7ZSYmZS5yZW1vdmVDb250cm9sKHQubmFtZSksVmoodGhpcy5fZGlyZWN0aXZlcyx0KX0pKX1hZGRGb3JtR3JvdXAodCl7b1UudGhlbigoKCk9Pntjb25zdCBlPXRoaXMuX2ZpbmRDb250YWluZXIodC5wYXRoKSxuPW5ldyB0VSh7fSk7SWoobix0KSxlLnJlZ2lzdGVyQ29udHJvbCh0Lm5hbWUsbiksbi51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6ITF9KX0pKX1yZW1vdmVGb3JtR3JvdXAodCl7b1UudGhlbigoKCk9Pntjb25zdCBlPXRoaXMuX2ZpbmRDb250YWluZXIodC5wYXRoKTtlJiZlLnJlbW92ZUNvbnRyb2wodC5uYW1lKX0pKX1nZXRGb3JtR3JvdXAodCl7cmV0dXJuIHRoaXMuZm9ybS5nZXQodC5wYXRoKX11cGRhdGVNb2RlbCh0LGUpe29VLnRoZW4oKCgpPT57dGhpcy5mb3JtLmdldCh0LnBhdGgpLnNldFZhbHVlKGUpfSkpfXNldFZhbHVlKHQpe3RoaXMuY29udHJvbC5zZXRWYWx1ZSh0KX1vblN1Ym1pdCh0KXtyZXR1cm4gdGhpcy5zdWJtaXR0ZWQ9ITAsTGoodGhpcy5mb3JtLHRoaXMuX2RpcmVjdGl2ZXMpLHRoaXMubmdTdWJtaXQuZW1pdCh0KSwhMX1vblJlc2V0KCl7dGhpcy5yZXNldEZvcm0oKX1yZXNldEZvcm0odCl7dGhpcy5mb3JtLnJlc2V0KHQpLHRoaXMuc3VibWl0dGVkPSExfV9zZXRVcGRhdGVTdHJhdGVneSgpe3RoaXMub3B0aW9ucyYmbnVsbCE9dGhpcy5vcHRpb25zLnVwZGF0ZU9uJiYodGhpcy5mb3JtLl91cGRhdGVPbj10aGlzLm9wdGlvbnMudXBkYXRlT24pfV9maW5kQ29udGFpbmVyKHQpe3JldHVybiB0LnBvcCgpLHQubGVuZ3RoP3RoaXMuZm9ybS5nZXQodCk6dGhpcy5mb3JtfX1pVS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8aVUpKFNtKEdWLDEwKSxTbShXViwxMCkpfSxpVS7JtWRpcj1sbyh7dHlwZTppVSxzZWxlY3RvcnM6W1siZm9ybSIsMywibmdOb0Zvcm0iLCIiLDMsImZvcm1Hcm91cCIsIiJdLFsibmctZm9ybSJdLFsiIiwibmdGb3JtIiwiIl1dLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgic3VibWl0IiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblN1Ym1pdChlKX0pKSgicmVzZXQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25SZXNldCgpfSkpfSxpbnB1dHM6e29wdGlvbnM6WyJuZ0Zvcm1PcHRpb25zIiwib3B0aW9ucyJdfSxvdXRwdXRzOntuZ1N1Ym1pdDoibmdTdWJtaXQifSxleHBvcnRBczpbIm5nRm9ybSJdLGZlYXR1cmVzOltwZyhbblVdKSx4cF19KSxpVS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbR1ZdfV19LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbV1ZdfV19XSxpVS5wcm9wRGVjb3JhdG9ycz17b3B0aW9uczpbe3R5cGU6eHksYXJnczpbIm5nRm9ybU9wdGlvbnMiXX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGlVLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6ImZvcm06bm90KFtuZ05vRm9ybV0pOm5vdChbZm9ybUdyb3VwXSksbmctZm9ybSxbbmdGb3JtXSIscHJvdmlkZXJzOltuVV0saG9zdDp7IihzdWJtaXQpIjoib25TdWJtaXQoJGV2ZW50KSIsIihyZXNldCkiOiJvblJlc2V0KCkifSxvdXRwdXRzOlsibmdTdWJtaXQiXSxleHBvcnRBczoibmdGb3JtIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbR1ZdfV19LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbV1ZdfV19XX0pLHtvcHRpb25zOlt7dHlwZTp4eSxhcmdzOlsibmdGb3JtT3B0aW9ucyJdfV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIGFVIGV4dGVuZHMgQ2p7bmdPbkluaXQoKXt0aGlzLl9jaGVja1BhcmVudFR5cGUoKSx0aGlzLmZvcm1EaXJlY3RpdmUuYWRkRm9ybUdyb3VwKHRoaXMpfW5nT25EZXN0cm95KCl7dGhpcy5mb3JtRGlyZWN0aXZlJiZ0aGlzLmZvcm1EaXJlY3RpdmUucmVtb3ZlRm9ybUdyb3VwKHRoaXMpfWdldCBjb250cm9sKCl7cmV0dXJuIHRoaXMuZm9ybURpcmVjdGl2ZS5nZXRGb3JtR3JvdXAodGhpcyl9Z2V0IHBhdGgoKXtyZXR1cm4gRGoobnVsbD09dGhpcy5uYW1lP3RoaXMubmFtZTp0aGlzLm5hbWUudG9TdHJpbmcoKSx0aGlzLl9wYXJlbnQpfWdldCBmb3JtRGlyZWN0aXZlKCl7cmV0dXJuIHRoaXMuX3BhcmVudD90aGlzLl9wYXJlbnQuZm9ybURpcmVjdGl2ZTpudWxsfV9jaGVja1BhcmVudFR5cGUoKXt9fWFVLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYShhVSkpKShufHxhVSl9fSkoKSxhVS7JtWRpcj1sbyh7dHlwZTphVSxmZWF0dXJlczpbeHBdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChhVSxbe3R5cGU6Q3l9XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgclV7c3RhdGljIG1vZGVsUGFyZW50RXhjZXB0aW9uKCl7dGhyb3cgbmV3IEVycm9yKGBcbiAgICAgIG5nTW9kZWwgY2Fubm90IGJlIHVzZWQgdG8gcmVnaXN0ZXIgZm9ybSBjb250cm9scyB3aXRoIGEgcGFyZW50IGZvcm1Hcm91cCBkaXJlY3RpdmUuICBUcnkgdXNpbmdcbiAgICAgIGZvcm1Hcm91cCdzIHBhcnRuZXIgZGlyZWN0aXZlICJmb3JtQ29udHJvbE5hbWUiIGluc3RlYWQuICBFeGFtcGxlOlxuXG4gICAgICAke1BqfVxuXG4gICAgICBPciwgaWYgeW91J2QgbGlrZSB0byBhdm9pZCByZWdpc3RlcmluZyB0aGlzIGZvcm0gY29udHJvbCwgaW5kaWNhdGUgdGhhdCBpdCdzIHN0YW5kYWxvbmUgaW4gbmdNb2RlbE9wdGlvbnM6XG5cbiAgICAgIEV4YW1wbGU6XG5cbiAgICAgIFxuICAgIDxkaXYgW2Zvcm1Hcm91cF09Im15R3JvdXAiPlxuICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9ImZpcnN0TmFtZSI+XG4gICAgICAgPGlucHV0IFsobmdNb2RlbCldPSJzaG93TW9yZUNvbnRyb2xzIiBbbmdNb2RlbE9wdGlvbnNdPSJ7c3RhbmRhbG9uZTogdHJ1ZX0iPlxuICAgIDwvZGl2PlxuICBgKX1zdGF0aWMgZm9ybUdyb3VwTmFtZUV4Y2VwdGlvbigpe3Rocm93IG5ldyBFcnJvcihgXG4gICAgICBuZ01vZGVsIGNhbm5vdCBiZSB1c2VkIHRvIHJlZ2lzdGVyIGZvcm0gY29udHJvbHMgd2l0aCBhIHBhcmVudCBmb3JtR3JvdXBOYW1lIG9yIGZvcm1BcnJheU5hbWUgZGlyZWN0aXZlLlxuXG4gICAgICBPcHRpb24gMTogVXNlIGZvcm1Db250cm9sTmFtZSBpbnN0ZWFkIG9mIG5nTW9kZWwgKHJlYWN0aXZlIHN0cmF0ZWd5KTpcblxuICAgICAgJHt3an1cblxuICAgICAgT3B0aW9uIDI6ICBVcGRhdGUgbmdNb2RlbCdzIHBhcmVudCBiZSBuZ01vZGVsR3JvdXAgKHRlbXBsYXRlLWRyaXZlbiBzdHJhdGVneSk6XG5cbiAgICAgICR7a2p9YCl9c3RhdGljIG1pc3NpbmdOYW1lRXhjZXB0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCdJZiBuZ01vZGVsIGlzIHVzZWQgd2l0aGluIGEgZm9ybSB0YWcsIGVpdGhlciB0aGUgbmFtZSBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgb3IgdGhlIGZvcm1cbiAgICAgIGNvbnRyb2wgbXVzdCBiZSBkZWZpbmVkIGFzIFwnc3RhbmRhbG9uZVwnIGluIG5nTW9kZWxPcHRpb25zLlxuXG4gICAgICBFeGFtcGxlIDE6IDxpbnB1dCBbKG5nTW9kZWwpXT0icGVyc29uLmZpcnN0TmFtZSIgbmFtZT0iZmlyc3QiPlxuICAgICAgRXhhbXBsZSAyOiA8aW5wdXQgWyhuZ01vZGVsKV09InBlcnNvbi5maXJzdE5hbWUiIFtuZ01vZGVsT3B0aW9uc109IntzdGFuZGFsb25lOiB0cnVlfSI+Jyl9c3RhdGljIG1vZGVsR3JvdXBQYXJlbnRFeGNlcHRpb24oKXt0aHJvdyBuZXcgRXJyb3IoYFxuICAgICAgbmdNb2RlbEdyb3VwIGNhbm5vdCBiZSB1c2VkIHdpdGggYSBwYXJlbnQgZm9ybUdyb3VwIGRpcmVjdGl2ZS5cblxuICAgICAgT3B0aW9uIDE6IFVzZSBmb3JtR3JvdXBOYW1lIGluc3RlYWQgb2YgbmdNb2RlbEdyb3VwIChyZWFjdGl2ZSBzdHJhdGVneSk6XG5cbiAgICAgICR7d2p9XG5cbiAgICAgIE9wdGlvbiAyOiAgVXNlIGEgcmVndWxhciBmb3JtIHRhZyBpbnN0ZWFkIG9mIHRoZSBmb3JtR3JvdXAgZGlyZWN0aXZlICh0ZW1wbGF0ZS1kcml2ZW4gc3RyYXRlZ3kpOlxuXG4gICAgICAke2tqfWApfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3Qgc1U9e3Byb3ZpZGU6Q2osdXNlRXhpc3Rpbmc6cWUoKCgpPT5sVSkpfTtjbGFzcyBsVSBleHRlbmRzIGFVe2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcigpLHRoaXMuX3BhcmVudD10LHRoaXMuX3NldFZhbGlkYXRvcnMoZSksdGhpcy5fc2V0QXN5bmNWYWxpZGF0b3JzKG4pfV9jaGVja1BhcmVudFR5cGUoKXt0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBsVXx8dGhpcy5fcGFyZW50IGluc3RhbmNlb2YgaVV8fCJ1bmRlZmluZWQiIT10eXBlb2YgbmdEZXZNb2RlJiYhbmdEZXZNb2RlfHxyVS5tb2RlbEdyb3VwUGFyZW50RXhjZXB0aW9uKCl9fWxVLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxsVSkoU20oQ2osNSksU20oR1YsMTApLFNtKFdWLDEwKSl9LGxVLsm1ZGlyPWxvKHt0eXBlOmxVLHNlbGVjdG9yczpbWyIiLCJuZ01vZGVsR3JvdXAiLCIiXV0saW5wdXRzOntuYW1lOlsibmdNb2RlbEdyb3VwIiwibmFtZSJdfSxleHBvcnRBczpbIm5nTW9kZWxHcm91cCJdLGZlYXR1cmVzOltwZyhbc1VdKSx4cF19KSxsVS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOkNqLGRlY29yYXRvcnM6W3t0eXBlOlJyfSx7dHlwZTpFcn1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W0dWXX1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W1dWXX1dfV0sbFUucHJvcERlY29yYXRvcnM9e25hbWU6W3t0eXBlOnh5LGFyZ3M6WyJuZ01vZGVsR3JvdXAiXX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGxVLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IltuZ01vZGVsR3JvdXBdIixwcm92aWRlcnM6W3NVXSxleHBvcnRBczoibmdNb2RlbEdyb3VwIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkNqLGRlY29yYXRvcnM6W3t0eXBlOlJyfSx7dHlwZTpFcn1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W0dWXX1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W1dWXX1dfV19KSx7bmFtZTpbe3R5cGU6eHksYXJnczpbIm5nTW9kZWxHcm91cCJdfV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IGNVPXtwcm92aWRlOk1qLHVzZUV4aXN0aW5nOnFlKCgoKT0+cFUpKX0sZFU9UHJvbWlzZS5yZXNvbHZlKG51bGwpO2NsYXNzIHBVIGV4dGVuZHMgTWp7Y29uc3RydWN0b3IodCxlLG4sbyl7c3VwZXIoKSx0aGlzLmNvbnRyb2w9bmV3ICRqLHRoaXMuX3JlZ2lzdGVyZWQ9ITEsdGhpcy51cGRhdGU9bmV3IExoLHRoaXMuX3BhcmVudD10LHRoaXMuX3NldFZhbGlkYXRvcnMoZSksdGhpcy5fc2V0QXN5bmNWYWxpZGF0b3JzKG4pLHRoaXMudmFsdWVBY2Nlc3Nvcj1Caih0aGlzLG8pfW5nT25DaGFuZ2VzKHQpe3RoaXMuX2NoZWNrRm9yRXJyb3JzKCksdGhpcy5fcmVnaXN0ZXJlZHx8dGhpcy5fc2V0VXBDb250cm9sKCksImlzRGlzYWJsZWQiaW4gdCYmdGhpcy5fdXBkYXRlRGlzYWJsZWQodCksRmoodCx0aGlzLnZpZXdNb2RlbCkmJih0aGlzLl91cGRhdGVWYWx1ZSh0aGlzLm1vZGVsKSx0aGlzLnZpZXdNb2RlbD10aGlzLm1vZGVsKX1uZ09uRGVzdHJveSgpe3RoaXMuZm9ybURpcmVjdGl2ZSYmdGhpcy5mb3JtRGlyZWN0aXZlLnJlbW92ZUNvbnRyb2wodGhpcyl9Z2V0IHBhdGgoKXtyZXR1cm4gdGhpcy5fcGFyZW50P0RqKHRoaXMubmFtZSx0aGlzLl9wYXJlbnQpOlt0aGlzLm5hbWVdfWdldCBmb3JtRGlyZWN0aXZlKCl7cmV0dXJuIHRoaXMuX3BhcmVudD90aGlzLl9wYXJlbnQuZm9ybURpcmVjdGl2ZTpudWxsfXZpZXdUb01vZGVsVXBkYXRlKHQpe3RoaXMudmlld01vZGVsPXQsdGhpcy51cGRhdGUuZW1pdCh0KX1fc2V0VXBDb250cm9sKCl7dGhpcy5fc2V0VXBkYXRlU3RyYXRlZ3koKSx0aGlzLl9pc1N0YW5kYWxvbmUoKT90aGlzLl9zZXRVcFN0YW5kYWxvbmUoKTp0aGlzLmZvcm1EaXJlY3RpdmUuYWRkQ29udHJvbCh0aGlzKSx0aGlzLl9yZWdpc3RlcmVkPSEwfV9zZXRVcGRhdGVTdHJhdGVneSgpe3RoaXMub3B0aW9ucyYmbnVsbCE9dGhpcy5vcHRpb25zLnVwZGF0ZU9uJiYodGhpcy5jb250cm9sLl91cGRhdGVPbj10aGlzLm9wdGlvbnMudXBkYXRlT24pfV9pc1N0YW5kYWxvbmUoKXtyZXR1cm4hdGhpcy5fcGFyZW50fHwhKCF0aGlzLm9wdGlvbnN8fCF0aGlzLm9wdGlvbnMuc3RhbmRhbG9uZSl9X3NldFVwU3RhbmRhbG9uZSgpe0VqKHRoaXMuY29udHJvbCx0aGlzKSx0aGlzLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiExfSl9X2NoZWNrRm9yRXJyb3JzKCl7dGhpcy5faXNTdGFuZGFsb25lKCl8fHRoaXMuX2NoZWNrUGFyZW50VHlwZSgpLHRoaXMuX2NoZWNrTmFtZSgpfV9jaGVja1BhcmVudFR5cGUoKXsoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJighKHRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIGxVKSYmdGhpcy5fcGFyZW50IGluc3RhbmNlb2YgYVU/clUuZm9ybUdyb3VwTmFtZUV4Y2VwdGlvbigpOnRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIGxVfHx0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBpVXx8clUubW9kZWxQYXJlbnRFeGNlcHRpb24oKSl9X2NoZWNrTmFtZSgpe3RoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLm5hbWUmJih0aGlzLm5hbWU9dGhpcy5vcHRpb25zLm5hbWUpLHRoaXMuX2lzU3RhbmRhbG9uZSgpfHx0aGlzLm5hbWV8fCJ1bmRlZmluZWQiIT10eXBlb2YgbmdEZXZNb2RlJiYhbmdEZXZNb2RlfHxyVS5taXNzaW5nTmFtZUV4Y2VwdGlvbigpfV91cGRhdGVWYWx1ZSh0KXtkVS50aGVuKCgoKT0+e3RoaXMuY29udHJvbC5zZXRWYWx1ZSh0LHtlbWl0Vmlld1RvTW9kZWxDaGFuZ2U6ITF9KX0pKX1fdXBkYXRlRGlzYWJsZWQodCl7Y29uc3QgZT10LmlzRGlzYWJsZWQuY3VycmVudFZhbHVlLG49IiI9PT1lfHxlJiYiZmFsc2UiIT09ZTtkVS50aGVuKCgoKT0+e24mJiF0aGlzLmNvbnRyb2wuZGlzYWJsZWQ/dGhpcy5jb250cm9sLmRpc2FibGUoKTohbiYmdGhpcy5jb250cm9sLmRpc2FibGVkJiZ0aGlzLmNvbnRyb2wuZW5hYmxlKCl9KSl9fXBVLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxwVSkoU20oQ2osOSksU20oR1YsMTApLFNtKFdWLDEwKSxTbShJViwxMCkpfSxwVS7JtWRpcj1sbyh7dHlwZTpwVSxzZWxlY3RvcnM6W1siIiwibmdNb2RlbCIsIiIsMywiZm9ybUNvbnRyb2xOYW1lIiwiIiwzLCJmb3JtQ29udHJvbCIsIiJdXSxpbnB1dHM6e25hbWU6Im5hbWUiLGlzRGlzYWJsZWQ6WyJkaXNhYmxlZCIsImlzRGlzYWJsZWQiXSxtb2RlbDpbIm5nTW9kZWwiLCJtb2RlbCJdLG9wdGlvbnM6WyJuZ01vZGVsT3B0aW9ucyIsIm9wdGlvbnMiXX0sb3V0cHV0czp7dXBkYXRlOiJuZ01vZGVsQ2hhbmdlIn0sZXhwb3J0QXM6WyJuZ01vZGVsIl0sZmVhdHVyZXM6W3BnKFtjVV0pLHhwLEJvXX0pLHBVLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6Q2osZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOlJyfV19LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbR1ZdfV19LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbV1ZdfV19LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbSVZdfV19XSxwVS5wcm9wRGVjb3JhdG9ycz17bmFtZTpbe3R5cGU6eHl9XSxpc0Rpc2FibGVkOlt7dHlwZTp4eSxhcmdzOlsiZGlzYWJsZWQiXX1dLG1vZGVsOlt7dHlwZTp4eSxhcmdzOlsibmdNb2RlbCJdfV0sb3B0aW9uczpbe3R5cGU6eHksYXJnczpbIm5nTW9kZWxPcHRpb25zIl19XSx1cGRhdGU6W3t0eXBlOk95LGFyZ3M6WyJuZ01vZGVsQ2hhbmdlIl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChwVSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbmdNb2RlbF06bm90KFtmb3JtQ29udHJvbE5hbWVdKTpub3QoW2Zvcm1Db250cm9sXSkiLHByb3ZpZGVyczpbY1VdLGV4cG9ydEFzOiJuZ01vZGVsIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkNqLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpScn1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W0dWXX1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W1dWXX1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W0lWXX1dfV19KSx7dXBkYXRlOlt7dHlwZTpPeSxhcmdzOlsibmdNb2RlbENoYW5nZSJdfV0sbmFtZTpbe3R5cGU6eHl9XSxpc0Rpc2FibGVkOlt7dHlwZTp4eSxhcmdzOlsiZGlzYWJsZWQiXX1dLG1vZGVsOlt7dHlwZTp4eSxhcmdzOlsibmdNb2RlbCJdfV0sb3B0aW9uczpbe3R5cGU6eHksYXJnczpbIm5nTW9kZWxPcHRpb25zIl19XX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgbVV7fW1VLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxtVSl9LG1VLsm1ZGlyPWxvKHt0eXBlOm1VLHNlbGVjdG9yczpbWyJmb3JtIiwzLCJuZ05vRm9ybSIsIiIsMywibmdOYXRpdmVWYWxpZGF0ZSIsIiJdXSxob3N0QXR0cnM6WyJub3ZhbGlkYXRlIiwiIl19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKG1VLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6ImZvcm06bm90KFtuZ05vRm9ybV0pOm5vdChbbmdOYXRpdmVWYWxpZGF0ZV0pIixob3N0Ontub3ZhbGlkYXRlOiIifX1dfV0sbnVsbCxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IHVVPXtwcm92aWRlOklWLHVzZUV4aXN0aW5nOnFlKCgoKT0+ZlUpKSxtdWx0aTohMH07Y2xhc3MgZlUgZXh0ZW5kcyB6Vnt3cml0ZVZhbHVlKHQpe3RoaXMuc2V0UHJvcGVydHkoInZhbHVlIixudWxsPT10PyIiOnQpfXJlZ2lzdGVyT25DaGFuZ2UodCl7dGhpcy5vbkNoYW5nZT1lPT57dCgiIj09ZT9udWxsOnBhcnNlRmxvYXQoZSkpfX19ZlUuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKGZVKSkpKG58fGZVKX19KSgpLGZVLsm1ZGlyPWxvKHt0eXBlOmZVLHNlbGVjdG9yczpbWyJpbnB1dCIsInR5cGUiLCJudW1iZXIiLCJmb3JtQ29udHJvbE5hbWUiLCIiXSxbImlucHV0IiwidHlwZSIsIm51bWJlciIsImZvcm1Db250cm9sIiwiIl0sWyJpbnB1dCIsInR5cGUiLCJudW1iZXIiLCJuZ01vZGVsIiwiIl1dLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgiaW5wdXQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uQ2hhbmdlKGUudGFyZ2V0LnZhbHVlKX0pKSgiYmx1ciIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblRvdWNoZWQoKX0pKX0sZmVhdHVyZXM6W3BnKFt1VV0pLHhwXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZlUsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiaW5wdXRbdHlwZT1udW1iZXJdW2Zvcm1Db250cm9sTmFtZV0saW5wdXRbdHlwZT1udW1iZXJdW2Zvcm1Db250cm9sXSxpbnB1dFt0eXBlPW51bWJlcl1bbmdNb2RlbF0iLGhvc3Q6eyIoaW5wdXQpIjoib25DaGFuZ2UoJGV2ZW50LnRhcmdldC52YWx1ZSkiLCIoYmx1cikiOiJvblRvdWNoZWQoKSJ9LHByb3ZpZGVyczpbdVVdfV19XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgZ1U9e3Byb3ZpZGU6SVYsdXNlRXhpc3Rpbmc6cWUoKCgpPT55VSkpLG11bHRpOiEwfTtjbGFzcyBoVXt9aFUuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGhVKX0saFUuybVtb2Q9YW8oe3R5cGU6aFV9KSxoVS7JtWluaj12bih7fSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChoVSxbe3R5cGU6QXl9XSxudWxsLG51bGwpO2NsYXNzIGJVe2NvbnN0cnVjdG9yKCl7dGhpcy5fYWNjZXNzb3JzPVtdfWFkZCh0LGUpe3RoaXMuX2FjY2Vzc29ycy5wdXNoKFt0LGVdKX1yZW1vdmUodCl7Zm9yKGxldCBlPXRoaXMuX2FjY2Vzc29ycy5sZW5ndGgtMTtlPj0wOy0tZSlpZih0aGlzLl9hY2Nlc3NvcnNbZV1bMV09PT10KXJldHVybiB2b2lkIHRoaXMuX2FjY2Vzc29ycy5zcGxpY2UoZSwxKX1zZWxlY3QodCl7dGhpcy5fYWNjZXNzb3JzLmZvckVhY2goKGU9Pnt0aGlzLl9pc1NhbWVHcm91cChlLHQpJiZlWzFdIT09dCYmZVsxXS5maXJlVW5jaGVjayh0LnZhbHVlKX0pKX1faXNTYW1lR3JvdXAodCxlKXtyZXR1cm4hIXRbMF0uY29udHJvbCYmdFswXS5fcGFyZW50PT09ZS5fY29udHJvbC5fcGFyZW50JiZ0WzFdLm5hbWU9PT1lLm5hbWV9fWJVLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxiVSl9LGJVLsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIG5ldyBiVX0sdG9rZW46YlUscHJvdmlkZWRJbjpoVX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoYlUsW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOmhVfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5bXX0pLG51bGwpO2NsYXNzIHlVIGV4dGVuZHMgelZ7Y29uc3RydWN0b3IodCxlLG4sbyl7c3VwZXIodCxlKSx0aGlzLl9yZWdpc3RyeT1uLHRoaXMuX2luamVjdG9yPW8sdGhpcy5vbkNoYW5nZT0oKT0+e319bmdPbkluaXQoKXt0aGlzLl9jb250cm9sPXRoaXMuX2luamVjdG9yLmdldChNaiksdGhpcy5fY2hlY2tOYW1lKCksdGhpcy5fcmVnaXN0cnkuYWRkKHRoaXMuX2NvbnRyb2wsdGhpcyl9bmdPbkRlc3Ryb3koKXt0aGlzLl9yZWdpc3RyeS5yZW1vdmUodGhpcyl9d3JpdGVWYWx1ZSh0KXt0aGlzLl9zdGF0ZT10PT09dGhpcy52YWx1ZSx0aGlzLnNldFByb3BlcnR5KCJjaGVja2VkIix0aGlzLl9zdGF0ZSl9cmVnaXN0ZXJPbkNoYW5nZSh0KXt0aGlzLl9mbj10LHRoaXMub25DaGFuZ2U9KCk9Pnt0KHRoaXMudmFsdWUpLHRoaXMuX3JlZ2lzdHJ5LnNlbGVjdCh0aGlzKX19ZmlyZVVuY2hlY2sodCl7dGhpcy53cml0ZVZhbHVlKHQpfV9jaGVja05hbWUoKXt0aGlzLm5hbWUmJnRoaXMuZm9ybUNvbnRyb2xOYW1lJiZ0aGlzLm5hbWUhPT10aGlzLmZvcm1Db250cm9sTmFtZSYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiYoZnVuY3Rpb24gdCgpe3Rocm93IG5ldyBFcnJvcignXG4gICAgICBJZiB5b3UgZGVmaW5lIGJvdGggYSBuYW1lIGFuZCBhIGZvcm1Db250cm9sTmFtZSBhdHRyaWJ1dGUgb24geW91ciByYWRpbyBidXR0b24sIHRoZWlyIHZhbHVlc1xuICAgICAgbXVzdCBtYXRjaC4gRXg6IDxpbnB1dCB0eXBlPSJyYWRpbyIgZm9ybUNvbnRyb2xOYW1lPSJmb29kIiBuYW1lPSJmb29kIj5cbiAgICAnKX0pKCksIXRoaXMubmFtZSYmdGhpcy5mb3JtQ29udHJvbE5hbWUmJih0aGlzLm5hbWU9dGhpcy5mb3JtQ29udHJvbE5hbWUpfX15VS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8eVUpKFNtKENnKSxTbShoZyksU20oYlUpLFNtKHJwKSl9LHlVLsm1ZGlyPWxvKHt0eXBlOnlVLHNlbGVjdG9yczpbWyJpbnB1dCIsInR5cGUiLCJyYWRpbyIsImZvcm1Db250cm9sTmFtZSIsIiJdLFsiaW5wdXQiLCJ0eXBlIiwicmFkaW8iLCJmb3JtQ29udHJvbCIsIiJdLFsiaW5wdXQiLCJ0eXBlIiwicmFkaW8iLCJuZ01vZGVsIiwiIl1dLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgiY2hhbmdlIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uQ2hhbmdlKCl9KSkoImJsdXIiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25Ub3VjaGVkKCl9KSl9LGlucHV0czp7bmFtZToibmFtZSIsZm9ybUNvbnRyb2xOYW1lOiJmb3JtQ29udHJvbE5hbWUiLHZhbHVlOiJ2YWx1ZSJ9LGZlYXR1cmVzOltwZyhbZ1VdKSx4cF19KSx5VS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOkNnfSx7dHlwZTpoZ30se3R5cGU6YlV9LHt0eXBlOnJwfV0seVUucHJvcERlY29yYXRvcnM9e25hbWU6W3t0eXBlOnh5fV0sZm9ybUNvbnRyb2xOYW1lOlt7dHlwZTp4eX1dLHZhbHVlOlt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHlVLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6ImlucHV0W3R5cGU9cmFkaW9dW2Zvcm1Db250cm9sTmFtZV0saW5wdXRbdHlwZT1yYWRpb11bZm9ybUNvbnRyb2xdLGlucHV0W3R5cGU9cmFkaW9dW25nTW9kZWxdIixob3N0OnsiKGNoYW5nZSkiOiJvbkNoYW5nZSgpIiwiKGJsdXIpIjoib25Ub3VjaGVkKCkifSxwcm92aWRlcnM6W2dVXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkNnfSx7dHlwZTpoZ30se3R5cGU6YlV9LHt0eXBlOnJwfV19KSx7bmFtZTpbe3R5cGU6eHl9XSxmb3JtQ29udHJvbE5hbWU6W3t0eXBlOnh5fV0sdmFsdWU6W3t0eXBlOnh5fV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IF9VPXtwcm92aWRlOklWLHVzZUV4aXN0aW5nOnFlKCgoKT0+Q1UpKSxtdWx0aTohMH07Y2xhc3MgQ1UgZXh0ZW5kcyB6Vnt3cml0ZVZhbHVlKHQpe3RoaXMuc2V0UHJvcGVydHkoInZhbHVlIixwYXJzZUZsb2F0KHQpKX1yZWdpc3Rlck9uQ2hhbmdlKHQpe3RoaXMub25DaGFuZ2U9ZT0+e3QoIiI9PWU/bnVsbDpwYXJzZUZsb2F0KGUpKX19fUNVLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYShDVSkpKShufHxDVSl9fSkoKSxDVS7JtWRpcj1sbyh7dHlwZTpDVSxzZWxlY3RvcnM6W1siaW5wdXQiLCJ0eXBlIiwicmFuZ2UiLCJmb3JtQ29udHJvbE5hbWUiLCIiXSxbImlucHV0IiwidHlwZSIsInJhbmdlIiwiZm9ybUNvbnRyb2wiLCIiXSxbImlucHV0IiwidHlwZSIsInJhbmdlIiwibmdNb2RlbCIsIiJdXSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezEmZSYmVm0oImNoYW5nZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25DaGFuZ2UoZS50YXJnZXQudmFsdWUpfSkpKCJpbnB1dCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25DaGFuZ2UoZS50YXJnZXQudmFsdWUpfSkpKCJibHVyIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uVG91Y2hlZCgpfSkpfSxmZWF0dXJlczpbcGcoW19VXSkseHBdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChDVSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJpbnB1dFt0eXBlPXJhbmdlXVtmb3JtQ29udHJvbE5hbWVdLGlucHV0W3R5cGU9cmFuZ2VdW2Zvcm1Db250cm9sXSxpbnB1dFt0eXBlPXJhbmdlXVtuZ01vZGVsXSIsaG9zdDp7IihjaGFuZ2UpIjoib25DaGFuZ2UoJGV2ZW50LnRhcmdldC52YWx1ZSkiLCIoaW5wdXQpIjoib25DaGFuZ2UoJGV2ZW50LnRhcmdldC52YWx1ZSkiLCIoYmx1cikiOiJvblRvdWNoZWQoKSJ9LHByb3ZpZGVyczpbX1VdfV19XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgTVU9bmV3IEdhKCJOZ01vZGVsV2l0aEZvcm1Db250cm9sV2FybmluZyIpLHZVPXtwcm92aWRlOk1qLHVzZUV4aXN0aW5nOnFlKCgoKT0+eFUpKX07Y2xhc3MgeFUgZXh0ZW5kcyBNantjb25zdHJ1Y3Rvcih0LGUsbixvKXtzdXBlcigpLHRoaXMuX25nTW9kZWxXYXJuaW5nQ29uZmlnPW8sdGhpcy51cGRhdGU9bmV3IExoLHRoaXMuX25nTW9kZWxXYXJuaW5nU2VudD0hMSx0aGlzLl9zZXRWYWxpZGF0b3JzKHQpLHRoaXMuX3NldEFzeW5jVmFsaWRhdG9ycyhlKSx0aGlzLnZhbHVlQWNjZXNzb3I9QmoodGhpcyxuKX1zZXQgaXNEaXNhYmxlZCh0KXsoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJlNqLmRpc2FibGVkQXR0cldhcm5pbmcoKX1uZ09uQ2hhbmdlcyh0KXtpZih0aGlzLl9pc0NvbnRyb2xDaGFuZ2VkKHQpKXtjb25zdCBlPXQuZm9ybS5wcmV2aW91c1ZhbHVlO2UmJlJqKGUsdGhpcywhMSksRWoodGhpcy5mb3JtLHRoaXMpLHRoaXMuY29udHJvbC5kaXNhYmxlZCYmdGhpcy52YWx1ZUFjY2Vzc29yLnNldERpc2FibGVkU3RhdGUmJnRoaXMudmFsdWVBY2Nlc3Nvci5zZXREaXNhYmxlZFN0YXRlKCEwKSx0aGlzLmZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiExfSl9RmoodCx0aGlzLnZpZXdNb2RlbCkmJigoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmpqKCJmb3JtQ29udHJvbCIseFUsdGhpcyx0aGlzLl9uZ01vZGVsV2FybmluZ0NvbmZpZyksdGhpcy5mb3JtLnNldFZhbHVlKHRoaXMubW9kZWwpLHRoaXMudmlld01vZGVsPXRoaXMubW9kZWwpfW5nT25EZXN0cm95KCl7dGhpcy5mb3JtJiZSaih0aGlzLmZvcm0sdGhpcywhMSl9Z2V0IHBhdGgoKXtyZXR1cm5bXX1nZXQgY29udHJvbCgpe3JldHVybiB0aGlzLmZvcm19dmlld1RvTW9kZWxVcGRhdGUodCl7dGhpcy52aWV3TW9kZWw9dCx0aGlzLnVwZGF0ZS5lbWl0KHQpfV9pc0NvbnRyb2xDaGFuZ2VkKHQpe3JldHVybiB0Lmhhc093blByb3BlcnR5KCJmb3JtIil9fXhVLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx4VSkoU20oR1YsMTApLFNtKFdWLDEwKSxTbShJViwxMCksU20oTVUsOCkpfSx4VS7JtWRpcj1sbyh7dHlwZTp4VSxzZWxlY3RvcnM6W1siIiwiZm9ybUNvbnRyb2wiLCIiXV0saW5wdXRzOntpc0Rpc2FibGVkOlsiZGlzYWJsZWQiLCJpc0Rpc2FibGVkIl0sZm9ybTpbImZvcm1Db250cm9sIiwiZm9ybSJdLG1vZGVsOlsibmdNb2RlbCIsIm1vZGVsIl19LG91dHB1dHM6e3VwZGF0ZToibmdNb2RlbENoYW5nZSJ9LGV4cG9ydEFzOlsibmdGb3JtIl0sZmVhdHVyZXM6W3BnKFt2VV0pLHhwLEJvXX0pLHhVLl9uZ01vZGVsV2FybmluZ1NlbnRPbmNlPSExLHhVLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOkRyfSx7dHlwZTprcixhcmdzOltHVl19XX0se3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOkRyfSx7dHlwZTprcixhcmdzOltXVl19XX0se3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOkRyfSx7dHlwZTprcixhcmdzOltJVl19XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltNVV19XX1dLHhVLnByb3BEZWNvcmF0b3JzPXtmb3JtOlt7dHlwZTp4eSxhcmdzOlsiZm9ybUNvbnRyb2wiXX1dLGlzRGlzYWJsZWQ6W3t0eXBlOnh5LGFyZ3M6WyJkaXNhYmxlZCJdfV0sbW9kZWw6W3t0eXBlOnh5LGFyZ3M6WyJuZ01vZGVsIl19XSx1cGRhdGU6W3t0eXBlOk95LGFyZ3M6WyJuZ01vZGVsQ2hhbmdlIl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh4VSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbZm9ybUNvbnRyb2xdIixwcm92aWRlcnM6W3ZVXSxleHBvcnRBczoibmdGb3JtIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbR1ZdfV19LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbV1ZdfV19LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbSVZdfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbTVVdfV19XX0pLHt1cGRhdGU6W3t0eXBlOk95LGFyZ3M6WyJuZ01vZGVsQ2hhbmdlIl19XSxpc0Rpc2FibGVkOlt7dHlwZTp4eSxhcmdzOlsiZGlzYWJsZWQiXX1dLGZvcm06W3t0eXBlOnh5LGFyZ3M6WyJmb3JtQ29udHJvbCJdfV0sbW9kZWw6W3t0eXBlOnh5LGFyZ3M6WyJuZ01vZGVsIl19XX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgT1U9e3Byb3ZpZGU6Q2osdXNlRXhpc3Rpbmc6cWUoKCgpPT5QVSkpfTtjbGFzcyBQVSBleHRlbmRzIENqe2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoKSx0aGlzLnZhbGlkYXRvcnM9dCx0aGlzLmFzeW5jVmFsaWRhdG9ycz1lLHRoaXMuc3VibWl0dGVkPSExLHRoaXMuX29uQ29sbGVjdGlvbkNoYW5nZT0oKT0+dGhpcy5fdXBkYXRlRG9tVmFsdWUoKSx0aGlzLmRpcmVjdGl2ZXM9W10sdGhpcy5mb3JtPW51bGwsdGhpcy5uZ1N1Ym1pdD1uZXcgTGgsdGhpcy5fc2V0VmFsaWRhdG9ycyh0KSx0aGlzLl9zZXRBc3luY1ZhbGlkYXRvcnMoZSl9bmdPbkNoYW5nZXModCl7dGhpcy5fY2hlY2tGb3JtUHJlc2VudCgpLHQuaGFzT3duUHJvcGVydHkoImZvcm0iKSYmKHRoaXMuX3VwZGF0ZVZhbGlkYXRvcnMoKSx0aGlzLl91cGRhdGVEb21WYWx1ZSgpLHRoaXMuX3VwZGF0ZVJlZ2lzdHJhdGlvbnMoKSx0aGlzLl9vbGRGb3JtPXRoaXMuZm9ybSl9bmdPbkRlc3Ryb3koKXt0aGlzLmZvcm0mJihOaih0aGlzLmZvcm0sdGhpcyksdGhpcy5mb3JtLl9vbkNvbGxlY3Rpb25DaGFuZ2U9PT10aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UmJnRoaXMuZm9ybS5fcmVnaXN0ZXJPbkNvbGxlY3Rpb25DaGFuZ2UoKCgpPT57fSkpKX1nZXQgZm9ybURpcmVjdGl2ZSgpe3JldHVybiB0aGlzfWdldCBjb250cm9sKCl7cmV0dXJuIHRoaXMuZm9ybX1nZXQgcGF0aCgpe3JldHVybltdfWFkZENvbnRyb2wodCl7Y29uc3QgZT10aGlzLmZvcm0uZ2V0KHQucGF0aCk7cmV0dXJuIEVqKGUsdCksZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6ITF9KSx0aGlzLmRpcmVjdGl2ZXMucHVzaCh0KSxlfWdldENvbnRyb2wodCl7cmV0dXJuIHRoaXMuZm9ybS5nZXQodC5wYXRoKX1yZW1vdmVDb250cm9sKHQpe1JqKHQuY29udHJvbHx8bnVsbCx0LCExKSxWaih0aGlzLmRpcmVjdGl2ZXMsdCl9YWRkRm9ybUdyb3VwKHQpe3RoaXMuX3NldFVwRm9ybUNvbnRhaW5lcih0KX1yZW1vdmVGb3JtR3JvdXAodCl7dGhpcy5fY2xlYW5VcEZvcm1Db250YWluZXIodCl9Z2V0Rm9ybUdyb3VwKHQpe3JldHVybiB0aGlzLmZvcm0uZ2V0KHQucGF0aCl9YWRkRm9ybUFycmF5KHQpe3RoaXMuX3NldFVwRm9ybUNvbnRhaW5lcih0KX1yZW1vdmVGb3JtQXJyYXkodCl7dGhpcy5fY2xlYW5VcEZvcm1Db250YWluZXIodCl9Z2V0Rm9ybUFycmF5KHQpe3JldHVybiB0aGlzLmZvcm0uZ2V0KHQucGF0aCl9dXBkYXRlTW9kZWwodCxlKXt0aGlzLmZvcm0uZ2V0KHQucGF0aCkuc2V0VmFsdWUoZSl9b25TdWJtaXQodCl7cmV0dXJuIHRoaXMuc3VibWl0dGVkPSEwLExqKHRoaXMuZm9ybSx0aGlzLmRpcmVjdGl2ZXMpLHRoaXMubmdTdWJtaXQuZW1pdCh0KSwhMX1vblJlc2V0KCl7dGhpcy5yZXNldEZvcm0oKX1yZXNldEZvcm0odCl7dGhpcy5mb3JtLnJlc2V0KHQpLHRoaXMuc3VibWl0dGVkPSExfV91cGRhdGVEb21WYWx1ZSgpe3RoaXMuZGlyZWN0aXZlcy5mb3JFYWNoKCh0PT57Y29uc3QgZT10LmNvbnRyb2wsbj10aGlzLmZvcm0uZ2V0KHQucGF0aCk7ZSE9PW4mJihSaihlfHxudWxsLHQpLG4gaW5zdGFuY2VvZiAkaiYmKEVqKG4sdCksdC5jb250cm9sPW4pKX0pKSx0aGlzLmZvcm0uX3VwZGF0ZVRyZWVWYWxpZGl0eSh7ZW1pdEV2ZW50OiExfSl9X3NldFVwRm9ybUNvbnRhaW5lcih0KXtjb25zdCBlPXRoaXMuZm9ybS5nZXQodC5wYXRoKTtJaihlLHQpLGUudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiExfSl9X2NsZWFuVXBGb3JtQ29udGFpbmVyKHQpe2lmKHRoaXMuZm9ybSl7Y29uc3QgZT10aGlzLmZvcm0uZ2V0KHQucGF0aCk7ZSYmKGZ1bmN0aW9uIG4odCxlKXtyZXR1cm4gTmoodCxlKX0pKGUsdCkmJmUudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiExfSl9fV91cGRhdGVSZWdpc3RyYXRpb25zKCl7dGhpcy5mb3JtLl9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZSh0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UpLHRoaXMuX29sZEZvcm0mJnRoaXMuX29sZEZvcm0uX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKCgoKT0+e30pKX1fdXBkYXRlVmFsaWRhdG9ycygpe1RqKHRoaXMuZm9ybSx0aGlzKSx0aGlzLl9vbGRGb3JtJiZOaih0aGlzLl9vbGRGb3JtLHRoaXMpfV9jaGVja0Zvcm1QcmVzZW50KCl7dGhpcy5mb3JtfHwidW5kZWZpbmVkIiE9dHlwZW9mIG5nRGV2TW9kZSYmIW5nRGV2TW9kZXx8U2oubWlzc2luZ0Zvcm1FeGNlcHRpb24oKX19UFUuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFBVKShTbShHViwxMCksU20oV1YsMTApKX0sUFUuybVkaXI9bG8oe3R5cGU6UFUsc2VsZWN0b3JzOltbIiIsImZvcm1Hcm91cCIsIiJdXSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezEmZSYmVm0oInN1Ym1pdCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25TdWJtaXQoZSl9KSkoInJlc2V0IiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uUmVzZXQoKX0pKX0saW5wdXRzOntmb3JtOlsiZm9ybUdyb3VwIiwiZm9ybSJdfSxvdXRwdXRzOntuZ1N1Ym1pdDoibmdTdWJtaXQifSxleHBvcnRBczpbIm5nRm9ybSJdLGZlYXR1cmVzOltwZyhbT1VdKSx4cCxCb119KSxQVS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbR1ZdfV19LHt0eXBlOkFycmF5LGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbV1ZdfV19XSxQVS5wcm9wRGVjb3JhdG9ycz17Zm9ybTpbe3R5cGU6eHksYXJnczpbImZvcm1Hcm91cCJdfV0sbmdTdWJtaXQ6W3t0eXBlOk95fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUFUsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Zvcm1Hcm91cF0iLHByb3ZpZGVyczpbT1VdLGhvc3Q6eyIoc3VibWl0KSI6Im9uU3VibWl0KCRldmVudCkiLCIocmVzZXQpIjoib25SZXNldCgpIn0sZXhwb3J0QXM6Im5nRm9ybSJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W0dWXX1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W1dWXX1dfV19KSx7Zm9ybTpbe3R5cGU6eHksYXJnczpbImZvcm1Hcm91cCJdfV0sbmdTdWJtaXQ6W3t0eXBlOk95fV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IHdVPXtwcm92aWRlOkNqLHVzZUV4aXN0aW5nOnFlKCgoKT0+a1UpKX07Y2xhc3Mga1UgZXh0ZW5kcyBhVXtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIoKSx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9zZXRWYWxpZGF0b3JzKGUpLHRoaXMuX3NldEFzeW5jVmFsaWRhdG9ycyhuKX1fY2hlY2tQYXJlbnRUeXBlKCl7RVUodGhpcy5fcGFyZW50KSYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZTai5ncm91cFBhcmVudEV4Y2VwdGlvbigpfX1rVS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8a1UpKFNtKENqLDEzKSxTbShHViwxMCksU20oV1YsMTApKX0sa1UuybVkaXI9bG8oe3R5cGU6a1Usc2VsZWN0b3JzOltbIiIsImZvcm1Hcm91cE5hbWUiLCIiXV0saW5wdXRzOntuYW1lOlsiZm9ybUdyb3VwTmFtZSIsIm5hbWUiXX0sZmVhdHVyZXM6W3BnKFt3VV0pLHhwXX0pLGtVLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6Q2osZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOlJyfSx7dHlwZTpFcn1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W0dWXX1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W1dWXX1dfV0sa1UucHJvcERlY29yYXRvcnM9e25hbWU6W3t0eXBlOnh5LGFyZ3M6WyJmb3JtR3JvdXBOYW1lIl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChrVSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbZm9ybUdyb3VwTmFtZV0iLHByb3ZpZGVyczpbd1VdfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6Q2osZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOlJyfSx7dHlwZTpFcn1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W0dWXX1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W1dWXX1dfV19KSx7bmFtZTpbe3R5cGU6eHksYXJnczpbImZvcm1Hcm91cE5hbWUiXX1dfSk7Y29uc3QgU1U9e3Byb3ZpZGU6Q2osdXNlRXhpc3Rpbmc6cWUoKCgpPT5EVSkpfTtjbGFzcyBEVSBleHRlbmRzIENqe2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcigpLHRoaXMuX3BhcmVudD10LHRoaXMuX3NldFZhbGlkYXRvcnMoZSksdGhpcy5fc2V0QXN5bmNWYWxpZGF0b3JzKG4pfW5nT25Jbml0KCl7dGhpcy5fY2hlY2tQYXJlbnRUeXBlKCksdGhpcy5mb3JtRGlyZWN0aXZlLmFkZEZvcm1BcnJheSh0aGlzKX1uZ09uRGVzdHJveSgpe3RoaXMuZm9ybURpcmVjdGl2ZSYmdGhpcy5mb3JtRGlyZWN0aXZlLnJlbW92ZUZvcm1BcnJheSh0aGlzKX1nZXQgY29udHJvbCgpe3JldHVybiB0aGlzLmZvcm1EaXJlY3RpdmUuZ2V0Rm9ybUFycmF5KHRoaXMpfWdldCBmb3JtRGlyZWN0aXZlKCl7cmV0dXJuIHRoaXMuX3BhcmVudD90aGlzLl9wYXJlbnQuZm9ybURpcmVjdGl2ZTpudWxsfWdldCBwYXRoKCl7cmV0dXJuIERqKG51bGw9PXRoaXMubmFtZT90aGlzLm5hbWU6dGhpcy5uYW1lLnRvU3RyaW5nKCksdGhpcy5fcGFyZW50KX1fY2hlY2tQYXJlbnRUeXBlKCl7RVUodGhpcy5fcGFyZW50KSYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZTai5hcnJheVBhcmVudEV4Y2VwdGlvbigpfX1mdW5jdGlvbiBFVSh0KXtyZXR1cm4hKHQgaW5zdGFuY2VvZiBrVXx8dCBpbnN0YW5jZW9mIFBVfHx0IGluc3RhbmNlb2YgRFUpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9EVS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8RFUpKFNtKENqLDEzKSxTbShHViwxMCksU20oV1YsMTApKX0sRFUuybVkaXI9bG8oe3R5cGU6RFUsc2VsZWN0b3JzOltbIiIsImZvcm1BcnJheU5hbWUiLCIiXV0saW5wdXRzOntuYW1lOlsiZm9ybUFycmF5TmFtZSIsIm5hbWUiXX0sZmVhdHVyZXM6W3BnKFtTVV0pLHhwXX0pLERVLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6Q2osZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOlJyfSx7dHlwZTpFcn1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W0dWXX1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W1dWXX1dfV0sRFUucHJvcERlY29yYXRvcnM9e25hbWU6W3t0eXBlOnh5LGFyZ3M6WyJmb3JtQXJyYXlOYW1lIl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChEVSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbZm9ybUFycmF5TmFtZV0iLHByb3ZpZGVyczpbU1VdfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6Q2osZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOlJyfSx7dHlwZTpFcn1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W0dWXX1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W1dWXX1dfV19KSx7bmFtZTpbe3R5cGU6eHksYXJnczpbImZvcm1BcnJheU5hbWUiXX1dfSk7Y29uc3QgUlU9e3Byb3ZpZGU6TWosdXNlRXhpc3Rpbmc6cWUoKCgpPT5BVSkpfTtjbGFzcyBBVSBleHRlbmRzIE1qe2NvbnN0cnVjdG9yKHQsZSxuLG8saSl7c3VwZXIoKSx0aGlzLl9uZ01vZGVsV2FybmluZ0NvbmZpZz1pLHRoaXMuX2FkZGVkPSExLHRoaXMudXBkYXRlPW5ldyBMaCx0aGlzLl9uZ01vZGVsV2FybmluZ1NlbnQ9ITEsdGhpcy5fcGFyZW50PXQsdGhpcy5fc2V0VmFsaWRhdG9ycyhlKSx0aGlzLl9zZXRBc3luY1ZhbGlkYXRvcnMobiksdGhpcy52YWx1ZUFjY2Vzc29yPUJqKHRoaXMsbyl9c2V0IGlzRGlzYWJsZWQodCl7KCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZTai5kaXNhYmxlZEF0dHJXYXJuaW5nKCl9bmdPbkNoYW5nZXModCl7dGhpcy5fYWRkZWR8fHRoaXMuX3NldFVwQ29udHJvbCgpLEZqKHQsdGhpcy52aWV3TW9kZWwpJiYoKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZqaigiZm9ybUNvbnRyb2xOYW1lIixBVSx0aGlzLHRoaXMuX25nTW9kZWxXYXJuaW5nQ29uZmlnKSx0aGlzLnZpZXdNb2RlbD10aGlzLm1vZGVsLHRoaXMuZm9ybURpcmVjdGl2ZS51cGRhdGVNb2RlbCh0aGlzLHRoaXMubW9kZWwpKX1uZ09uRGVzdHJveSgpe3RoaXMuZm9ybURpcmVjdGl2ZSYmdGhpcy5mb3JtRGlyZWN0aXZlLnJlbW92ZUNvbnRyb2wodGhpcyl9dmlld1RvTW9kZWxVcGRhdGUodCl7dGhpcy52aWV3TW9kZWw9dCx0aGlzLnVwZGF0ZS5lbWl0KHQpfWdldCBwYXRoKCl7cmV0dXJuIERqKG51bGw9PXRoaXMubmFtZT90aGlzLm5hbWU6dGhpcy5uYW1lLnRvU3RyaW5nKCksdGhpcy5fcGFyZW50KX1nZXQgZm9ybURpcmVjdGl2ZSgpe3JldHVybiB0aGlzLl9wYXJlbnQ/dGhpcy5fcGFyZW50LmZvcm1EaXJlY3RpdmU6bnVsbH1fY2hlY2tQYXJlbnRUeXBlKCl7KCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiYoISh0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBrVSkmJnRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIGFVP1NqLm5nTW9kZWxHcm91cEV4Y2VwdGlvbigpOnRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIGtVfHx0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBQVXx8dGhpcy5fcGFyZW50IGluc3RhbmNlb2YgRFV8fFNqLmNvbnRyb2xQYXJlbnRFeGNlcHRpb24oKSl9X3NldFVwQ29udHJvbCgpe3RoaXMuX2NoZWNrUGFyZW50VHlwZSgpLHRoaXMuY29udHJvbD10aGlzLmZvcm1EaXJlY3RpdmUuYWRkQ29udHJvbCh0aGlzKSx0aGlzLmNvbnRyb2wuZGlzYWJsZWQmJnRoaXMudmFsdWVBY2Nlc3Nvci5zZXREaXNhYmxlZFN0YXRlJiZ0aGlzLnZhbHVlQWNjZXNzb3Iuc2V0RGlzYWJsZWRTdGF0ZSghMCksdGhpcy5fYWRkZWQ9ITB9fUFVLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxBVSkoU20oQ2osMTMpLFNtKEdWLDEwKSxTbShXViwxMCksU20oSVYsMTApLFNtKE1VLDgpKX0sQVUuybVkaXI9bG8oe3R5cGU6QVUsc2VsZWN0b3JzOltbIiIsImZvcm1Db250cm9sTmFtZSIsIiJdXSxpbnB1dHM6e2lzRGlzYWJsZWQ6WyJkaXNhYmxlZCIsImlzRGlzYWJsZWQiXSxuYW1lOlsiZm9ybUNvbnRyb2xOYW1lIiwibmFtZSJdLG1vZGVsOlsibmdNb2RlbCIsIm1vZGVsIl19LG91dHB1dHM6e3VwZGF0ZToibmdNb2RlbENoYW5nZSJ9LGZlYXR1cmVzOltwZyhbUlVdKSx4cCxCb119KSxBVS5fbmdNb2RlbFdhcm5pbmdTZW50T25jZT0hMSxBVS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOkNqLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpScn0se3R5cGU6RXJ9XX0se3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOkRyfSx7dHlwZTprcixhcmdzOltHVl19XX0se3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOkRyfSx7dHlwZTprcixhcmdzOltXVl19XX0se3R5cGU6QXJyYXksZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOkRyfSx7dHlwZTprcixhcmdzOltJVl19XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltNVV19XX1dLEFVLnByb3BEZWNvcmF0b3JzPXtuYW1lOlt7dHlwZTp4eSxhcmdzOlsiZm9ybUNvbnRyb2xOYW1lIl19XSxpc0Rpc2FibGVkOlt7dHlwZTp4eSxhcmdzOlsiZGlzYWJsZWQiXX1dLG1vZGVsOlt7dHlwZTp4eSxhcmdzOlsibmdNb2RlbCJdfV0sdXBkYXRlOlt7dHlwZTpPeSxhcmdzOlsibmdNb2RlbENoYW5nZSJdfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQVUsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Zvcm1Db250cm9sTmFtZV0iLHByb3ZpZGVyczpbUlVdfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6Q2osZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOlJyfSx7dHlwZTpFcn1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W0dWXX1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W1dWXX1dfSx7dHlwZTpBcnJheSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W0lWXX1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W01VXX1dfV19KSx7dXBkYXRlOlt7dHlwZTpPeSxhcmdzOlsibmdNb2RlbENoYW5nZSJdfV0saXNEaXNhYmxlZDpbe3R5cGU6eHksYXJnczpbImRpc2FibGVkIl19XSxuYW1lOlt7dHlwZTp4eSxhcmdzOlsiZm9ybUNvbnRyb2xOYW1lIl19XSxtb2RlbDpbe3R5cGU6eHksYXJnczpbIm5nTW9kZWwiXX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBUVT17cHJvdmlkZTpJVix1c2VFeGlzdGluZzpxZSgoKCk9PnpVKSksbXVsdGk6ITB9O2Z1bmN0aW9uIE5VKHQsZSl7cmV0dXJuIG51bGw9PXQ/YCR7ZX1gOihlJiYib2JqZWN0Ij09dHlwZW9mIGUmJihlPSJPYmplY3QiKSxgJHt0fTogJHtlfWAuc2xpY2UoMCw1MCkpfWNsYXNzIHpVIGV4dGVuZHMgelZ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX29wdGlvbk1hcD1uZXcgTWFwLHRoaXMuX2lkQ291bnRlcj0wLHRoaXMuX2NvbXBhcmVXaXRoPU9iamVjdC5pc31zZXQgY29tcGFyZVdpdGgodCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSl0aHJvdyBuZXcgRXJyb3IoYGNvbXBhcmVXaXRoIG11c3QgYmUgYSBmdW5jdGlvbiwgYnV0IHJlY2VpdmVkICR7SlNPTi5zdHJpbmdpZnkodCl9YCk7dGhpcy5fY29tcGFyZVdpdGg9dH13cml0ZVZhbHVlKHQpe3RoaXMudmFsdWU9dDtjb25zdCBlPXRoaXMuX2dldE9wdGlvbklkKHQpO251bGw9PWUmJnRoaXMuc2V0UHJvcGVydHkoInNlbGVjdGVkSW5kZXgiLC0xKTtjb25zdCBuPU5VKGUsdCk7dGhpcy5zZXRQcm9wZXJ0eSgidmFsdWUiLG4pfXJlZ2lzdGVyT25DaGFuZ2UodCl7dGhpcy5vbkNoYW5nZT1lPT57dGhpcy52YWx1ZT10aGlzLl9nZXRPcHRpb25WYWx1ZShlKSx0KHRoaXMudmFsdWUpfX1fcmVnaXN0ZXJPcHRpb24oKXtyZXR1cm4odGhpcy5faWRDb3VudGVyKyspLnRvU3RyaW5nKCl9X2dldE9wdGlvbklkKHQpe2Zvcihjb25zdCBlIG9mIEFycmF5LmZyb20odGhpcy5fb3B0aW9uTWFwLmtleXMoKSkpaWYodGhpcy5fY29tcGFyZVdpdGgodGhpcy5fb3B0aW9uTWFwLmdldChlKSx0KSlyZXR1cm4gZTtyZXR1cm4gbnVsbH1fZ2V0T3B0aW9uVmFsdWUodCl7Y29uc3QgZT0oZnVuY3Rpb24gbih0KXtyZXR1cm4gdC5zcGxpdCgiOiIpWzBdfSkodCk7cmV0dXJuIHRoaXMuX29wdGlvbk1hcC5oYXMoZSk/dGhpcy5fb3B0aW9uTWFwLmdldChlKTp0fX16VS7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoelUpKSkobnx8elUpfX0pKCkselUuybVkaXI9bG8oe3R5cGU6elUsc2VsZWN0b3JzOltbInNlbGVjdCIsImZvcm1Db250cm9sTmFtZSIsIiIsMywibXVsdGlwbGUiLCIiXSxbInNlbGVjdCIsImZvcm1Db250cm9sIiwiIiwzLCJtdWx0aXBsZSIsIiJdLFsic2VsZWN0IiwibmdNb2RlbCIsIiIsMywibXVsdGlwbGUiLCIiXV0saG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJlZtKCJjaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uQ2hhbmdlKGUudGFyZ2V0LnZhbHVlKX0pKSgiYmx1ciIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblRvdWNoZWQoKX0pKX0saW5wdXRzOntjb21wYXJlV2l0aDoiY29tcGFyZVdpdGgifSxmZWF0dXJlczpbcGcoW1RVXSkseHBdfSkselUucHJvcERlY29yYXRvcnM9e2NvbXBhcmVXaXRoOlt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHpVLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6InNlbGVjdDpub3QoW211bHRpcGxlXSlbZm9ybUNvbnRyb2xOYW1lXSxzZWxlY3Q6bm90KFttdWx0aXBsZV0pW2Zvcm1Db250cm9sXSxzZWxlY3Q6bm90KFttdWx0aXBsZV0pW25nTW9kZWxdIixob3N0OnsiKGNoYW5nZSkiOiJvbkNoYW5nZSgkZXZlbnQudGFyZ2V0LnZhbHVlKSIsIihibHVyKSI6Im9uVG91Y2hlZCgpIn0scHJvdmlkZXJzOltUVV19XX1dLG51bGwse2NvbXBhcmVXaXRoOlt7dHlwZTp4eX1dfSk7Y2xhc3MgSVV7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuX2VsZW1lbnQ9dCx0aGlzLl9yZW5kZXJlcj1lLHRoaXMuX3NlbGVjdD1uLHRoaXMuX3NlbGVjdCYmKHRoaXMuaWQ9dGhpcy5fc2VsZWN0Ll9yZWdpc3Rlck9wdGlvbigpKX1zZXQgbmdWYWx1ZSh0KXtudWxsIT10aGlzLl9zZWxlY3QmJih0aGlzLl9zZWxlY3QuX29wdGlvbk1hcC5zZXQodGhpcy5pZCx0KSx0aGlzLl9zZXRFbGVtZW50VmFsdWUoTlUodGhpcy5pZCx0KSksdGhpcy5fc2VsZWN0LndyaXRlVmFsdWUodGhpcy5fc2VsZWN0LnZhbHVlKSl9c2V0IHZhbHVlKHQpe3RoaXMuX3NldEVsZW1lbnRWYWx1ZSh0KSx0aGlzLl9zZWxlY3QmJnRoaXMuX3NlbGVjdC53cml0ZVZhbHVlKHRoaXMuX3NlbGVjdC52YWx1ZSl9X3NldEVsZW1lbnRWYWx1ZSh0KXt0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsInZhbHVlIix0KX1uZ09uRGVzdHJveSgpe3RoaXMuX3NlbGVjdCYmKHRoaXMuX3NlbGVjdC5fb3B0aW9uTWFwLmRlbGV0ZSh0aGlzLmlkKSx0aGlzLl9zZWxlY3Qud3JpdGVWYWx1ZSh0aGlzLl9zZWxlY3QudmFsdWUpKX19SVUuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fElVKShTbShoZyksU20oQ2cpLFNtKHpVLDkpKX0sSVUuybVkaXI9bG8oe3R5cGU6SVUsc2VsZWN0b3JzOltbIm9wdGlvbiJdXSxpbnB1dHM6e25nVmFsdWU6Im5nVmFsdWUiLHZhbHVlOiJ2YWx1ZSJ9fSksSVUuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ30se3R5cGU6Q2d9LHt0eXBlOnpVLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpScn1dfV0sSVUucHJvcERlY29yYXRvcnM9e25nVmFsdWU6W3t0eXBlOnh5LGFyZ3M6WyJuZ1ZhbHVlIl19XSx2YWx1ZTpbe3R5cGU6eHksYXJnczpbInZhbHVlIl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChJVSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJvcHRpb24ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOkNnfSx7dHlwZTp6VSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6UnJ9XX1dfSkse25nVmFsdWU6W3t0eXBlOnh5LGFyZ3M6WyJuZ1ZhbHVlIl19XSx2YWx1ZTpbe3R5cGU6eHksYXJnczpbInZhbHVlIl19XX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgSFU9e3Byb3ZpZGU6SVYsdXNlRXhpc3Rpbmc6cWUoKCgpPT5MVSkpLG11bHRpOiEwfTtmdW5jdGlvbiBGVSh0LGUpe3JldHVybiBudWxsPT10P2Ake2V9YDooInN0cmluZyI9PXR5cGVvZiBlJiYoZT1gJyR7ZX0nYCksZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYoZT0iT2JqZWN0IiksYCR7dH06ICR7ZX1gLnNsaWNlKDAsNTApKX1jbGFzcyBMVSBleHRlbmRzIHpWe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9vcHRpb25NYXA9bmV3IE1hcCx0aGlzLl9pZENvdW50ZXI9MCx0aGlzLl9jb21wYXJlV2l0aD1PYmplY3QuaXN9c2V0IGNvbXBhcmVXaXRoKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkpdGhyb3cgbmV3IEVycm9yKGBjb21wYXJlV2l0aCBtdXN0IGJlIGEgZnVuY3Rpb24sIGJ1dCByZWNlaXZlZCAke0pTT04uc3RyaW5naWZ5KHQpfWApO3RoaXMuX2NvbXBhcmVXaXRoPXR9d3JpdGVWYWx1ZSh0KXtsZXQgZTtpZih0aGlzLnZhbHVlPXQsQXJyYXkuaXNBcnJheSh0KSl7Y29uc3Qgbj10Lm1hcCgodD0+dGhpcy5fZ2V0T3B0aW9uSWQodCkpKTtlPSh0LGUpPT57dC5fc2V0U2VsZWN0ZWQobi5pbmRleE9mKGUudG9TdHJpbmcoKSk+LTEpfX1lbHNlIGU9KHQsZSk9Pnt0Ll9zZXRTZWxlY3RlZCghMSl9O3RoaXMuX29wdGlvbk1hcC5mb3JFYWNoKGUpfXJlZ2lzdGVyT25DaGFuZ2UodCl7dGhpcy5vbkNoYW5nZT1lPT57Y29uc3Qgbj1bXTtpZih2b2lkIDAhPT1lLnNlbGVjdGVkT3B0aW9ucyl7Y29uc3QgdD1lLnNlbGVjdGVkT3B0aW9ucztmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl7Y29uc3Qgbz10Lml0ZW0oZSksaT10aGlzLl9nZXRPcHRpb25WYWx1ZShvLnZhbHVlKTtuLnB1c2goaSl9fWVsc2V7Y29uc3QgdD1lLm9wdGlvbnM7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2NvbnN0IG89dC5pdGVtKGUpO2lmKG8uc2VsZWN0ZWQpe2NvbnN0IHQ9dGhpcy5fZ2V0T3B0aW9uVmFsdWUoby52YWx1ZSk7bi5wdXNoKHQpfX19dGhpcy52YWx1ZT1uLHQobil9fV9yZWdpc3Rlck9wdGlvbih0KXtjb25zdCBlPSh0aGlzLl9pZENvdW50ZXIrKykudG9TdHJpbmcoKTtyZXR1cm4gdGhpcy5fb3B0aW9uTWFwLnNldChlLHQpLGV9X2dldE9wdGlvbklkKHQpe2Zvcihjb25zdCBlIG9mIEFycmF5LmZyb20odGhpcy5fb3B0aW9uTWFwLmtleXMoKSkpaWYodGhpcy5fY29tcGFyZVdpdGgodGhpcy5fb3B0aW9uTWFwLmdldChlKS5fdmFsdWUsdCkpcmV0dXJuIGU7cmV0dXJuIG51bGx9X2dldE9wdGlvblZhbHVlKHQpe2NvbnN0IGU9KGZ1bmN0aW9uIG4odCl7cmV0dXJuIHQuc3BsaXQoIjoiKVswXX0pKHQpO3JldHVybiB0aGlzLl9vcHRpb25NYXAuaGFzKGUpP3RoaXMuX29wdGlvbk1hcC5nZXQoZSkuX3ZhbHVlOnR9fUxVLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYShMVSkpKShufHxMVSl9fSkoKSxMVS7JtWRpcj1sbyh7dHlwZTpMVSxzZWxlY3RvcnM6W1sic2VsZWN0IiwibXVsdGlwbGUiLCIiLCJmb3JtQ29udHJvbE5hbWUiLCIiXSxbInNlbGVjdCIsIm11bHRpcGxlIiwiIiwiZm9ybUNvbnRyb2wiLCIiXSxbInNlbGVjdCIsIm11bHRpcGxlIiwiIiwibmdNb2RlbCIsIiJdXSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezEmZSYmVm0oImNoYW5nZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25DaGFuZ2UoZS50YXJnZXQpfSkpKCJibHVyIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uVG91Y2hlZCgpfSkpfSxpbnB1dHM6e2NvbXBhcmVXaXRoOiJjb21wYXJlV2l0aCJ9LGZlYXR1cmVzOltwZyhbSFVdKSx4cF19KSxMVS5wcm9wRGVjb3JhdG9ycz17Y29tcGFyZVdpdGg6W3t0eXBlOnh5fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoTFUsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3Rvcjoic2VsZWN0W211bHRpcGxlXVtmb3JtQ29udHJvbE5hbWVdLHNlbGVjdFttdWx0aXBsZV1bZm9ybUNvbnRyb2xdLHNlbGVjdFttdWx0aXBsZV1bbmdNb2RlbF0iLGhvc3Q6eyIoY2hhbmdlKSI6Im9uQ2hhbmdlKCRldmVudC50YXJnZXQpIiwiKGJsdXIpIjoib25Ub3VjaGVkKCkifSxwcm92aWRlcnM6W0hVXX1dfV0sbnVsbCx7Y29tcGFyZVdpdGg6W3t0eXBlOnh5fV19KTtjbGFzcyBCVXtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5fZWxlbWVudD10LHRoaXMuX3JlbmRlcmVyPWUsdGhpcy5fc2VsZWN0PW4sdGhpcy5fc2VsZWN0JiYodGhpcy5pZD10aGlzLl9zZWxlY3QuX3JlZ2lzdGVyT3B0aW9uKHRoaXMpKX1zZXQgbmdWYWx1ZSh0KXtudWxsIT10aGlzLl9zZWxlY3QmJih0aGlzLl92YWx1ZT10LHRoaXMuX3NldEVsZW1lbnRWYWx1ZShGVSh0aGlzLmlkLHQpKSx0aGlzLl9zZWxlY3Qud3JpdGVWYWx1ZSh0aGlzLl9zZWxlY3QudmFsdWUpKX1zZXQgdmFsdWUodCl7dGhpcy5fc2VsZWN0Pyh0aGlzLl92YWx1ZT10LHRoaXMuX3NldEVsZW1lbnRWYWx1ZShGVSh0aGlzLmlkLHQpKSx0aGlzLl9zZWxlY3Qud3JpdGVWYWx1ZSh0aGlzLl9zZWxlY3QudmFsdWUpKTp0aGlzLl9zZXRFbGVtZW50VmFsdWUodCl9X3NldEVsZW1lbnRWYWx1ZSh0KXt0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsInZhbHVlIix0KX1fc2V0U2VsZWN0ZWQodCl7dGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LCJzZWxlY3RlZCIsdCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9zZWxlY3QmJih0aGlzLl9zZWxlY3QuX29wdGlvbk1hcC5kZWxldGUodGhpcy5pZCksdGhpcy5fc2VsZWN0LndyaXRlVmFsdWUodGhpcy5fc2VsZWN0LnZhbHVlKSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KZnVuY3Rpb24gVlUodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3Q6cGFyc2VJbnQodCwxMCl9QlUuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEJVKShTbShoZyksU20oQ2cpLFNtKExVLDkpKX0sQlUuybVkaXI9bG8oe3R5cGU6QlUsc2VsZWN0b3JzOltbIm9wdGlvbiJdXSxpbnB1dHM6e25nVmFsdWU6Im5nVmFsdWUiLHZhbHVlOiJ2YWx1ZSJ9fSksQlUuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ30se3R5cGU6Q2d9LHt0eXBlOkxVLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpScn1dfV0sQlUucHJvcERlY29yYXRvcnM9e25nVmFsdWU6W3t0eXBlOnh5LGFyZ3M6WyJuZ1ZhbHVlIl19XSx2YWx1ZTpbe3R5cGU6eHksYXJnczpbInZhbHVlIl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChCVSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJvcHRpb24ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOkNnfSx7dHlwZTpMVSxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6UnJ9XX1dfSkse25nVmFsdWU6W3t0eXBlOnh5LGFyZ3M6WyJuZ1ZhbHVlIl19XSx2YWx1ZTpbe3R5cGU6eHksYXJnczpbInZhbHVlIl19XX0pO2NsYXNzIGpVe2NvbnN0cnVjdG9yKCl7dGhpcy5fdmFsaWRhdG9yPW5qfWhhbmRsZUNoYW5nZXModCl7aWYodGhpcy5pbnB1dE5hbWUgaW4gdCl7Y29uc3QgZT10aGlzLm5vcm1hbGl6ZUlucHV0KHRbdGhpcy5pbnB1dE5hbWVdLmN1cnJlbnRWYWx1ZSk7dGhpcy5fdmFsaWRhdG9yPXRoaXMuY3JlYXRlVmFsaWRhdG9yKGUpLHRoaXMuX29uQ2hhbmdlJiZ0aGlzLl9vbkNoYW5nZSgpfX12YWxpZGF0ZSh0KXtyZXR1cm4gdGhpcy5fdmFsaWRhdG9yKHQpfXJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UodCl7dGhpcy5fb25DaGFuZ2U9dH19alUuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGpVKX0salUuybVkaXI9bG8oe3R5cGU6alV9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGpVLFt7dHlwZTpDeX1dLChmdW5jdGlvbigpe3JldHVybltdfSksbnVsbCk7Y29uc3QgVVU9e3Byb3ZpZGU6R1YsdXNlRXhpc3Rpbmc6cWUoKCgpPT5HVSkpLG11bHRpOiEwfTtjbGFzcyBHVSBleHRlbmRzIGpVe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmlucHV0TmFtZT0ibWF4Iix0aGlzLm5vcm1hbGl6ZUlucHV0PXQ9PnBhcnNlRmxvYXQodCksdGhpcy5jcmVhdGVWYWxpZGF0b3I9dD0+WFYodCl9bmdPbkNoYW5nZXModCl7dGhpcy5oYW5kbGVDaGFuZ2VzKHQpfX1HVS7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoR1UpKSkobnx8R1UpfX0pKCksR1UuybVkaXI9bG8oe3R5cGU6R1Usc2VsZWN0b3JzOltbImlucHV0IiwidHlwZSIsIm51bWJlciIsIm1heCIsIiIsImZvcm1Db250cm9sTmFtZSIsIiJdLFsiaW5wdXQiLCJ0eXBlIiwibnVtYmVyIiwibWF4IiwiIiwiZm9ybUNvbnRyb2wiLCIiXSxbImlucHV0IiwidHlwZSIsIm51bWJlciIsIm1heCIsIiIsIm5nTW9kZWwiLCIiXV0saG9zdFZhcnM6MSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pe2lmKDImZSl7bGV0IHQ7anAoIm1heCIsbnVsbCE9PSh0PW4ubWF4KSYmdm9pZCAwIT09dD90Om51bGwpfX0saW5wdXRzOnttYXg6Im1heCJ9LGZlYXR1cmVzOltwZyhbVVVdKSx4cCxCb119KSxHVS5wcm9wRGVjb3JhdG9ycz17bWF4Olt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEdVLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6ImlucHV0W3R5cGU9bnVtYmVyXVttYXhdW2Zvcm1Db250cm9sTmFtZV0saW5wdXRbdHlwZT1udW1iZXJdW21heF1bZm9ybUNvbnRyb2xdLGlucHV0W3R5cGU9bnVtYmVyXVttYXhdW25nTW9kZWxdIixwcm92aWRlcnM6W1VVXSxob3N0OnsiW2F0dHIubWF4XSI6Im1heCA/PyBudWxsIn19XX1dLG51bGwse21heDpbe3R5cGU6eHl9XX0pO2NvbnN0IFdVPXtwcm92aWRlOkdWLHVzZUV4aXN0aW5nOnFlKCgoKT0+WVUpKSxtdWx0aTohMH07Y2xhc3MgWVUgZXh0ZW5kcyBqVXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5pbnB1dE5hbWU9Im1pbiIsdGhpcy5ub3JtYWxpemVJbnB1dD10PT5wYXJzZUZsb2F0KHQpLHRoaXMuY3JlYXRlVmFsaWRhdG9yPXQ9PlpWKHQpfW5nT25DaGFuZ2VzKHQpe3RoaXMuaGFuZGxlQ2hhbmdlcyh0KX19WVUuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKFlVKSkpKG58fFlVKX19KSgpLFlVLsm1ZGlyPWxvKHt0eXBlOllVLHNlbGVjdG9yczpbWyJpbnB1dCIsInR5cGUiLCJudW1iZXIiLCJtaW4iLCIiLCJmb3JtQ29udHJvbE5hbWUiLCIiXSxbImlucHV0IiwidHlwZSIsIm51bWJlciIsIm1pbiIsIiIsImZvcm1Db250cm9sIiwiIl0sWyJpbnB1dCIsInR5cGUiLCJudW1iZXIiLCJtaW4iLCIiLCJuZ01vZGVsIiwiIl1dLGhvc3RWYXJzOjEsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXtpZigyJmUpe2xldCB0O2pwKCJtaW4iLG51bGwhPT0odD1uLm1pbikmJnZvaWQgMCE9PXQ/dDpudWxsKX19LGlucHV0czp7bWluOiJtaW4ifSxmZWF0dXJlczpbcGcoW1dVXSkseHAsQm9dfSksWVUucHJvcERlY29yYXRvcnM9e21pbjpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChZVSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJpbnB1dFt0eXBlPW51bWJlcl1bbWluXVtmb3JtQ29udHJvbE5hbWVdLGlucHV0W3R5cGU9bnVtYmVyXVttaW5dW2Zvcm1Db250cm9sXSxpbnB1dFt0eXBlPW51bWJlcl1bbWluXVtuZ01vZGVsXSIscHJvdmlkZXJzOltXVV0saG9zdDp7IlthdHRyLm1pbl0iOiJtaW4gPz8gbnVsbCJ9fV19XSxudWxsLHttaW46W3t0eXBlOnh5fV19KTtjb25zdCBxVT17cHJvdmlkZTpHVix1c2VFeGlzdGluZzpxZSgoKCk9PlhVKSksbXVsdGk6ITB9LFpVPXtwcm92aWRlOkdWLHVzZUV4aXN0aW5nOnFlKCgoKT0+S1UpKSxtdWx0aTohMH07Y2xhc3MgWFV7Y29uc3RydWN0b3IoKXt0aGlzLl9yZXF1aXJlZD0hMX1nZXQgcmVxdWlyZWQoKXtyZXR1cm4gdGhpcy5fcmVxdWlyZWR9c2V0IHJlcXVpcmVkKHQpe3RoaXMuX3JlcXVpcmVkPW51bGwhPXQmJiExIT09dCYmImZhbHNlIiE9YCR7dH1gLHRoaXMuX29uQ2hhbmdlJiZ0aGlzLl9vbkNoYW5nZSgpfXZhbGlkYXRlKHQpe3JldHVybiB0aGlzLnJlcXVpcmVkP0tWKHQpOm51bGx9cmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZSh0KXt0aGlzLl9vbkNoYW5nZT10fX1YVS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WFUpfSxYVS7JtWRpcj1sbyh7dHlwZTpYVSxzZWxlY3RvcnM6W1siIiwicmVxdWlyZWQiLCIiLCJmb3JtQ29udHJvbE5hbWUiLCIiLDMsInR5cGUiLCJjaGVja2JveCJdLFsiIiwicmVxdWlyZWQiLCIiLCJmb3JtQ29udHJvbCIsIiIsMywidHlwZSIsImNoZWNrYm94Il0sWyIiLCJyZXF1aXJlZCIsIiIsIm5nTW9kZWwiLCIiLDMsInR5cGUiLCJjaGVja2JveCJdXSxob3N0VmFyczoxLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZqcCgicmVxdWlyZWQiLG4ucmVxdWlyZWQ/IiI6bnVsbCl9LGlucHV0czp7cmVxdWlyZWQ6InJlcXVpcmVkIn0sZmVhdHVyZXM6W3BnKFtxVV0pXX0pLFhVLnByb3BEZWNvcmF0b3JzPXtyZXF1aXJlZDpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChYVSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiI6bm90KFt0eXBlPWNoZWNrYm94XSlbcmVxdWlyZWRdW2Zvcm1Db250cm9sTmFtZV0sOm5vdChbdHlwZT1jaGVja2JveF0pW3JlcXVpcmVkXVtmb3JtQ29udHJvbF0sOm5vdChbdHlwZT1jaGVja2JveF0pW3JlcXVpcmVkXVtuZ01vZGVsXSIscHJvdmlkZXJzOltxVV0saG9zdDp7IlthdHRyLnJlcXVpcmVkXSI6J3JlcXVpcmVkID8gIiIgOiBudWxsJ319XX1dLChmdW5jdGlvbigpe3JldHVybltdfSkse3JlcXVpcmVkOlt7dHlwZTp4eX1dfSk7Y2xhc3MgS1UgZXh0ZW5kcyBYVXt2YWxpZGF0ZSh0KXtyZXR1cm4gdGhpcy5yZXF1aXJlZD9KVih0KTpudWxsfX1LVS7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoS1UpKSkobnx8S1UpfX0pKCksS1UuybVkaXI9bG8oe3R5cGU6S1Usc2VsZWN0b3JzOltbImlucHV0IiwidHlwZSIsImNoZWNrYm94IiwicmVxdWlyZWQiLCIiLCJmb3JtQ29udHJvbE5hbWUiLCIiXSxbImlucHV0IiwidHlwZSIsImNoZWNrYm94IiwicmVxdWlyZWQiLCIiLCJmb3JtQ29udHJvbCIsIiJdLFsiaW5wdXQiLCJ0eXBlIiwiY2hlY2tib3giLCJyZXF1aXJlZCIsIiIsIm5nTW9kZWwiLCIiXV0saG9zdFZhcnM6MSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmanAoInJlcXVpcmVkIixuLnJlcXVpcmVkPyIiOm51bGwpfSxmZWF0dXJlczpbcGcoW1pVXSkseHBdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChLVSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJpbnB1dFt0eXBlPWNoZWNrYm94XVtyZXF1aXJlZF1bZm9ybUNvbnRyb2xOYW1lXSxpbnB1dFt0eXBlPWNoZWNrYm94XVtyZXF1aXJlZF1bZm9ybUNvbnRyb2xdLGlucHV0W3R5cGU9Y2hlY2tib3hdW3JlcXVpcmVkXVtuZ01vZGVsXSIscHJvdmlkZXJzOltaVV0saG9zdDp7IlthdHRyLnJlcXVpcmVkXSI6J3JlcXVpcmVkID8gIiIgOiBudWxsJ319XX1dLG51bGwsbnVsbCk7Y29uc3QgSlU9e3Byb3ZpZGU6R1YsdXNlRXhpc3Rpbmc6cWUoKCgpPT5RVSkpLG11bHRpOiEwfTtjbGFzcyBRVXtjb25zdHJ1Y3Rvcigpe3RoaXMuX2VuYWJsZWQ9ITF9c2V0IGVtYWlsKHQpe3RoaXMuX2VuYWJsZWQ9IiI9PT10fHwhMD09PXR8fCJ0cnVlIj09PXQsdGhpcy5fb25DaGFuZ2UmJnRoaXMuX29uQ2hhbmdlKCl9dmFsaWRhdGUodCl7cmV0dXJuIHRoaXMuX2VuYWJsZWQ/UVYodCk6bnVsbH1yZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKHQpe3RoaXMuX29uQ2hhbmdlPXR9fVFVLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxRVSl9LFFVLsm1ZGlyPWxvKHt0eXBlOlFVLHNlbGVjdG9yczpbWyIiLCJlbWFpbCIsIiIsImZvcm1Db250cm9sTmFtZSIsIiJdLFsiIiwiZW1haWwiLCIiLCJmb3JtQ29udHJvbCIsIiJdLFsiIiwiZW1haWwiLCIiLCJuZ01vZGVsIiwiIl1dLGlucHV0czp7ZW1haWw6ImVtYWlsIn0sZmVhdHVyZXM6W3BnKFtKVV0pXX0pLFFVLnByb3BEZWNvcmF0b3JzPXtlbWFpbDpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChRVSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbZW1haWxdW2Zvcm1Db250cm9sTmFtZV0sW2VtYWlsXVtmb3JtQ29udHJvbF0sW2VtYWlsXVtuZ01vZGVsXSIscHJvdmlkZXJzOltKVV19XX1dLChmdW5jdGlvbigpe3JldHVybltdfSkse2VtYWlsOlt7dHlwZTp4eX1dfSk7Y29uc3QgJFU9e3Byb3ZpZGU6R1YsdXNlRXhpc3Rpbmc6cWUoKCgpPT50RykpLG11bHRpOiEwfTtjbGFzcyB0R3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3ZhbGlkYXRvcj1uan1uZ09uQ2hhbmdlcyh0KXsibWlubGVuZ3RoImluIHQmJih0aGlzLl9jcmVhdGVWYWxpZGF0b3IoKSx0aGlzLl9vbkNoYW5nZSYmdGhpcy5fb25DaGFuZ2UoKSl9dmFsaWRhdGUodCl7cmV0dXJuIHRoaXMuZW5hYmxlZCgpP3RoaXMuX3ZhbGlkYXRvcih0KTpudWxsfXJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UodCl7dGhpcy5fb25DaGFuZ2U9dH1fY3JlYXRlVmFsaWRhdG9yKCl7dGhpcy5fdmFsaWRhdG9yPXRoaXMuZW5hYmxlZCgpPyRWKFZVKHRoaXMubWlubGVuZ3RoKSk6bmp9ZW5hYmxlZCgpe3JldHVybiBudWxsIT10aGlzLm1pbmxlbmd0aH19dEcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHRHKX0sdEcuybVkaXI9bG8oe3R5cGU6dEcsc2VsZWN0b3JzOltbIiIsIm1pbmxlbmd0aCIsIiIsImZvcm1Db250cm9sTmFtZSIsIiJdLFsiIiwibWlubGVuZ3RoIiwiIiwiZm9ybUNvbnRyb2wiLCIiXSxbIiIsIm1pbmxlbmd0aCIsIiIsIm5nTW9kZWwiLCIiXV0saG9zdFZhcnM6MSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmanAoIm1pbmxlbmd0aCIsbi5lbmFibGVkKCk/bi5taW5sZW5ndGg6bnVsbCl9LGlucHV0czp7bWlubGVuZ3RoOiJtaW5sZW5ndGgifSxmZWF0dXJlczpbcGcoWyRVXSksQm9dfSksdEcucHJvcERlY29yYXRvcnM9e21pbmxlbmd0aDpbe3R5cGU6eHl9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh0Ryxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbWlubGVuZ3RoXVtmb3JtQ29udHJvbE5hbWVdLFttaW5sZW5ndGhdW2Zvcm1Db250cm9sXSxbbWlubGVuZ3RoXVtuZ01vZGVsXSIscHJvdmlkZXJzOlskVV0saG9zdDp7IlthdHRyLm1pbmxlbmd0aF0iOiJlbmFibGVkKCkgPyBtaW5sZW5ndGggOiBudWxsIn19XX1dLChmdW5jdGlvbigpe3JldHVybltdfSkse21pbmxlbmd0aDpbe3R5cGU6eHl9XX0pO2NvbnN0IGVHPXtwcm92aWRlOkdWLHVzZUV4aXN0aW5nOnFlKCgoKT0+bkcpKSxtdWx0aTohMH07Y2xhc3Mgbkd7Y29uc3RydWN0b3IoKXt0aGlzLl92YWxpZGF0b3I9bmp9bmdPbkNoYW5nZXModCl7Im1heGxlbmd0aCJpbiB0JiYodGhpcy5fY3JlYXRlVmFsaWRhdG9yKCksdGhpcy5fb25DaGFuZ2UmJnRoaXMuX29uQ2hhbmdlKCkpfXZhbGlkYXRlKHQpe3JldHVybiB0aGlzLmVuYWJsZWQoKT90aGlzLl92YWxpZGF0b3IodCk6bnVsbH1yZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKHQpe3RoaXMuX29uQ2hhbmdlPXR9X2NyZWF0ZVZhbGlkYXRvcigpe3RoaXMuX3ZhbGlkYXRvcj10aGlzLmVuYWJsZWQoKT90aihWVSh0aGlzLm1heGxlbmd0aCkpOm5qfWVuYWJsZWQoKXtyZXR1cm4gbnVsbCE9dGhpcy5tYXhsZW5ndGh9fW5HLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxuRyl9LG5HLsm1ZGlyPWxvKHt0eXBlOm5HLHNlbGVjdG9yczpbWyIiLCJtYXhsZW5ndGgiLCIiLCJmb3JtQ29udHJvbE5hbWUiLCIiXSxbIiIsIm1heGxlbmd0aCIsIiIsImZvcm1Db250cm9sIiwiIl0sWyIiLCJtYXhsZW5ndGgiLCIiLCJuZ01vZGVsIiwiIl1dLGhvc3RWYXJzOjEsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJmpwKCJtYXhsZW5ndGgiLG4uZW5hYmxlZCgpP24ubWF4bGVuZ3RoOm51bGwpfSxpbnB1dHM6e21heGxlbmd0aDoibWF4bGVuZ3RoIn0sZmVhdHVyZXM6W3BnKFtlR10pLEJvXX0pLG5HLnByb3BEZWNvcmF0b3JzPXttYXhsZW5ndGg6W3t0eXBlOnh5fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobkcsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW21heGxlbmd0aF1bZm9ybUNvbnRyb2xOYW1lXSxbbWF4bGVuZ3RoXVtmb3JtQ29udHJvbF0sW21heGxlbmd0aF1bbmdNb2RlbF0iLHByb3ZpZGVyczpbZUddLGhvc3Q6eyJbYXR0ci5tYXhsZW5ndGhdIjoiZW5hYmxlZCgpID8gbWF4bGVuZ3RoIDogbnVsbCJ9fV19XSwoZnVuY3Rpb24oKXtyZXR1cm5bXX0pLHttYXhsZW5ndGg6W3t0eXBlOnh5fV19KTtjb25zdCBvRz17cHJvdmlkZTpHVix1c2VFeGlzdGluZzpxZSgoKCk9PmlHKSksbXVsdGk6ITB9O2NsYXNzIGlHe2NvbnN0cnVjdG9yKCl7dGhpcy5fdmFsaWRhdG9yPW5qfW5nT25DaGFuZ2VzKHQpeyJwYXR0ZXJuImluIHQmJih0aGlzLl9jcmVhdGVWYWxpZGF0b3IoKSx0aGlzLl9vbkNoYW5nZSYmdGhpcy5fb25DaGFuZ2UoKSl9dmFsaWRhdGUodCl7cmV0dXJuIHRoaXMuX3ZhbGlkYXRvcih0KX1yZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKHQpe3RoaXMuX29uQ2hhbmdlPXR9X2NyZWF0ZVZhbGlkYXRvcigpe3RoaXMuX3ZhbGlkYXRvcj1laih0aGlzLnBhdHRlcm4pfX1pRy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8aUcpfSxpRy7JtWRpcj1sbyh7dHlwZTppRyxzZWxlY3RvcnM6W1siIiwicGF0dGVybiIsIiIsImZvcm1Db250cm9sTmFtZSIsIiJdLFsiIiwicGF0dGVybiIsIiIsImZvcm1Db250cm9sIiwiIl0sWyIiLCJwYXR0ZXJuIiwiIiwibmdNb2RlbCIsIiJdXSxob3N0VmFyczoxLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZqcCgicGF0dGVybiIsbi5wYXR0ZXJuP24ucGF0dGVybjpudWxsKX0saW5wdXRzOntwYXR0ZXJuOiJwYXR0ZXJuIn0sZmVhdHVyZXM6W3BnKFtvR10pLEJvXX0pLGlHLnByb3BEZWNvcmF0b3JzPXtwYXR0ZXJuOlt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGlHLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IltwYXR0ZXJuXVtmb3JtQ29udHJvbE5hbWVdLFtwYXR0ZXJuXVtmb3JtQ29udHJvbF0sW3BhdHRlcm5dW25nTW9kZWxdIixwcm92aWRlcnM6W29HXSxob3N0OnsiW2F0dHIucGF0dGVybl0iOiJwYXR0ZXJuID8gcGF0dGVybiA6IG51bGwifX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW119KSx7cGF0dGVybjpbe3R5cGU6eHl9XX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgYUc9W21VLElVLEJVLFZWLGZVLENVLEZWLHpVLExVLHlVLHhqLE9qLFhVLHRHLG5HLGlHLEtVLFFVLFlVLEdVXSxyRz1bcFUsbFUsaVVdLHNHPVt4VSxQVSxBVSxrVSxEVV07Y2xhc3MgbEd7fWxHLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxsRyl9LGxHLsm1bW9kPWFvKHt0eXBlOmxHfSksbEcuybVpbmo9dm4oe2ltcG9ydHM6W1toVV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChsRyxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczphRyxpbXBvcnRzOltoVV0sZXhwb3J0czphR31dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKGxHLHtkZWNsYXJhdGlvbnM6W21VLElVLEJVLFZWLGZVLENVLEZWLHpVLExVLHlVLHhqLE9qLFhVLHRHLG5HLGlHLEtVLFFVLFlVLEdVXSxpbXBvcnRzOltoVV0sZXhwb3J0czpbbVUsSVUsQlUsVlYsZlUsQ1UsRlYselUsTFUseVUseGosT2osWFUsdEcsbkcsaUcsS1UsUVUsWVUsR1VdfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBjR3t9Y0cuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGNHKX0sY0cuybVtb2Q9YW8oe3R5cGU6Y0d9KSxjRy7JtWluaj12bih7aW1wb3J0czpbbEddfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChjRyxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpyRyxleHBvcnRzOltsRyxyR119XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhjRyx7ZGVjbGFyYXRpb25zOltwVSxsVSxpVV0sZXhwb3J0czpbbEcscFUsbFUsaVVdfSk7Y2xhc3MgZEd7c3RhdGljIHdpdGhDb25maWcodCl7cmV0dXJue25nTW9kdWxlOmRHLHByb3ZpZGVyczpbe3Byb3ZpZGU6TVUsdXNlVmFsdWU6dC53YXJuT25OZ01vZGVsV2l0aEZvcm1Db250cm9sfV19fX1kRy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8ZEcpfSxkRy7JtW1vZD1hbyh7dHlwZTpkR30pLGRHLsm1aW5qPXZuKHtpbXBvcnRzOltsR119KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGRHLFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltzR10sZXhwb3J0czpbbEcsc0ddfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oZEcse2RlY2xhcmF0aW9uczpbeFUsUFUsQVUsa1UsRFVdLGV4cG9ydHM6W2xHLHhVLFBVLEFVLGtVLERVXX0pO2NsYXNzIHBHe2dyb3VwKHQsZT1udWxsKXtjb25zdCBuPXRoaXMuX3JlZHVjZUNvbnRyb2xzKHQpO2xldCBvLGk9bnVsbCxhPW51bGw7cmV0dXJuIG51bGwhPWUmJigoCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiByKHQpe3JldHVybiB2b2lkIDAhPT10LmFzeW5jVmFsaWRhdG9yc3x8dm9pZCAwIT09dC52YWxpZGF0b3JzfHx2b2lkIDAhPT10LnVwZGF0ZU9ufSkoZSk/KGk9bnVsbCE9ZS52YWxpZGF0b3JzP2UudmFsaWRhdG9yczpudWxsLGE9bnVsbCE9ZS5hc3luY1ZhbGlkYXRvcnM/ZS5hc3luY1ZhbGlkYXRvcnM6bnVsbCxvPW51bGwhPWUudXBkYXRlT24/ZS51cGRhdGVPbjp2b2lkIDApOihpPW51bGwhPWUudmFsaWRhdG9yP2UudmFsaWRhdG9yOm51bGwsYT1udWxsIT1lLmFzeW5jVmFsaWRhdG9yP2UuYXN5bmNWYWxpZGF0b3I6bnVsbCkpLG5ldyB0VShuLHthc3luY1ZhbGlkYXRvcnM6YSx1cGRhdGVPbjpvLHZhbGlkYXRvcnM6aX0pfWNvbnRyb2wodCxlLG4pe3JldHVybiBuZXcgJGoodCxlLG4pfWFycmF5KHQsZSxuKXtjb25zdCBvPXQubWFwKCh0PT50aGlzLl9jcmVhdGVDb250cm9sKHQpKSk7cmV0dXJuIG5ldyBlVShvLGUsbil9X3JlZHVjZUNvbnRyb2xzKHQpe2NvbnN0IGU9e307cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKG49PntlW25dPXRoaXMuX2NyZWF0ZUNvbnRyb2wodFtuXSl9KSksZX1fY3JlYXRlQ29udHJvbCh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mICRqfHx0IGluc3RhbmNlb2YgdFV8fHQgaW5zdGFuY2VvZiBlVT90OkFycmF5LmlzQXJyYXkodCk/dGhpcy5jb250cm9sKHRbMF0sdC5sZW5ndGg+MT90WzFdOm51bGwsdC5sZW5ndGg+Mj90WzJdOm51bGwpOnRoaXMuY29udHJvbCh0KX19cEcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHBHKX0scEcuybVwcm92PU1uKHtmYWN0b3J5OmZ1bmN0aW9uIHQoKXtyZXR1cm4gbmV3IHBHfSx0b2tlbjpwRyxwcm92aWRlZEluOmRHfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChwRyxbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46ZEd9XX1dLG51bGwsbnVsbCksCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpuZXcgT2coIjEyLjIuMSIpO2NvbnN0IG1HPVsidHJpZ2dlciJdLHVHPVsicGFuZWwiXTtmdW5jdGlvbiBmRyh0LGUpe2lmKDEmdCYmKFJtKDAsInNwYW4iLDgpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpO3JjKDEpLFN1KHQucGxhY2Vob2xkZXIpfX1mdW5jdGlvbiBnRyh0LGUpe2lmKDEmdCYmKFJtKDAsInNwYW4iLDEyKSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMik7cmMoMSksU3UodC50cmlnZ2VyVmFsdWUpfX1mdW5jdGlvbiBoRyh0LGUpezEmdCYmWG0oMCwwLFsiKm5nU3dpdGNoQ2FzZSIsInRydWUiXSl9ZnVuY3Rpb24gYkcodCxlKXsxJnQmJihSbSgwLCJzcGFuIiw5KSxRcCgxLGdHLDIsMSwic3BhbiIsMTApLFFwKDIsaEcsMSwwLCJuZy1jb250ZW50IiwxMSksQW0oKSksMiZ0JiYoRG0oIm5nU3dpdGNoIiwhIVltKCkuY3VzdG9tVHJpZ2dlcikscmMoMiksRG0oIm5nU3dpdGNoQ2FzZSIsITApKX1mdW5jdGlvbiB5Ryh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsImRpdiIsMTMpLFJtKDEsImRpdiIsMTQsMTUpLFZtKCJAdHJhbnNmb3JtUGFuZWwuZG9uZSIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkuX3BhbmVsRG9uZUFuaW1hdGluZ1N0cmVhbS5uZXh0KG4udG9TdGF0ZSl9KSkoImtleWRvd24iLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLl9oYW5kbGVLZXlkb3duKG4pfSkpLFhtKDMsMSksQW0oKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgpO0RtKCJAdHJhbnNmb3JtUGFuZWxXcmFwIix2b2lkIDApLHJjKDEpLEF1KCJtYXQtc2VsZWN0LXBhbmVsICIsdC5fZ2V0UGFuZWxUaGVtZSgpLCIiKSxkdSgidHJhbnNmb3JtLW9yaWdpbiIsdC5fdHJhbnNmb3JtT3JpZ2luKSgiZm9udC1zaXplIix0Ll90cmlnZ2VyRm9udFNpemUsInB4IiksRG0oIm5nQ2xhc3MiLHQucGFuZWxDbGFzcykoIkB0cmFuc2Zvcm1QYW5lbCIsdC5tdWx0aXBsZT8ic2hvd2luZy1tdWx0aXBsZSI6InNob3dpbmciKSxqcCgiaWQiLHQuaWQrIi1wYW5lbCIpKCJhcmlhLW11bHRpc2VsZWN0YWJsZSIsdC5tdWx0aXBsZSkoImFyaWEtbGFiZWwiLHQuYXJpYUxhYmVsfHxudWxsKSgiYXJpYS1sYWJlbGxlZGJ5Iix0Ll9nZXRQYW5lbEFyaWFMYWJlbGxlZGJ5KCkpfX1jb25zdCBfRz1bW1sibWF0LXNlbGVjdC10cmlnZ2VyIl1dLCIqIl0sQ0c9e3RyYW5zZm9ybVBhbmVsV3JhcDpueCgidHJhbnNmb3JtUGFuZWxXcmFwIixbbHgoIiogPT4gdm9pZCIsZHgoIkB0cmFuc2Zvcm1QYW5lbCIsW2N4KCldLHtvcHRpb25hbDohMH0pKV0pLHRyYW5zZm9ybVBhbmVsOm54KCJ0cmFuc2Zvcm1QYW5lbCIsW3J4KCJ2b2lkIixheCh7dHJhbnNmb3JtOiJzY2FsZVkoMC44KSIsbWluV2lkdGg6IjEwMCUiLG9wYWNpdHk6MH0pKSxyeCgic2hvd2luZyIsYXgoe29wYWNpdHk6MSxtaW5XaWR0aDoiY2FsYygxMDAlICsgMzJweCkiLHRyYW5zZm9ybToic2NhbGVZKDEpIn0pKSxyeCgic2hvd2luZy1tdWx0aXBsZSIsYXgoe29wYWNpdHk6MSxtaW5XaWR0aDoiY2FsYygxMDAlICsgNjRweCkiLHRyYW5zZm9ybToic2NhbGVZKDEpIn0pKSxseCgidm9pZCA9PiAqIixveCgiMTIwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSkiKSksbHgoIiogPT4gdm9pZCIsb3goIjEwMG1zIDI1bXMgbGluZWFyIixheCh7b3BhY2l0eTowfSkpKV0pfTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmxldCBNRz0wO2NvbnN0IHZHPTI1Nix4Rz1uZXcgR2EoIm1hdC1zZWxlY3Qtc2Nyb2xsLXN0cmF0ZWd5IiksT0c9bmV3IEdhKCJNQVRfU0VMRUNUX0NPTkZJRyIpLFBHPXtwcm92aWRlOnhHLGRlcHM6W3BMXSx1c2VGYWN0b3J5OmZ1bmN0aW9uIHdHKHQpe3JldHVybigpPT50LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpfX07Y2xhc3Mga0d7Y29uc3RydWN0b3IodCxlKXt0aGlzLnNvdXJjZT10LHRoaXMudmFsdWU9ZX19Y29uc3QgU0c9UUkoJEkoS0kodEgoY2xhc3N7Y29uc3RydWN0b3IodCxlLG4sbyxpKXt0aGlzLl9lbGVtZW50UmVmPXQsdGhpcy5fZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyPWUsdGhpcy5fcGFyZW50Rm9ybT1uLHRoaXMuX3BhcmVudEZvcm1Hcm91cD1vLHRoaXMubmdDb250cm9sPWl9fSkpKSksREc9bmV3IEdhKCJNYXRTZWxlY3RUcmlnZ2VyIik7Y2xhc3MgRUd7fUVHLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxFRyl9LEVHLsm1ZGlyPWxvKHt0eXBlOkVHLHNlbGVjdG9yczpbWyJtYXQtc2VsZWN0LXRyaWdnZXIiXV0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTpERyx1c2VFeGlzdGluZzpFR31dKV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEVHLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC1zZWxlY3QtdHJpZ2dlciIscHJvdmlkZXJzOlt7cHJvdmlkZTpERyx1c2VFeGlzdGluZzpFR31dfV19XSxudWxsLG51bGwpO2NsYXNzIFJHIGV4dGVuZHMgU0d7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1KXt2YXIgZixnLGg7c3VwZXIoaSxvLHIscyxjKSx0aGlzLl92aWV3cG9ydFJ1bGVyPXQsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWY9ZSx0aGlzLl9uZ1pvbmU9bix0aGlzLl9kaXI9YSx0aGlzLl9wYXJlbnRGb3JtRmllbGQ9bCx0aGlzLl9saXZlQW5ub3VuY2VyPW0sdGhpcy5fZGVmYXVsdE9wdGlvbnM9dSx0aGlzLl9wYW5lbE9wZW49ITEsdGhpcy5fY29tcGFyZVdpdGg9KHQsZSk9PnQ9PT1lLHRoaXMuX3VpZD0ibWF0LXNlbGVjdC0iK01HKyssdGhpcy5fdHJpZ2dlckFyaWFMYWJlbGxlZEJ5PW51bGwsdGhpcy5fZGVzdHJveT1uZXcgSSx0aGlzLl9vbkNoYW5nZT0oKT0+e30sdGhpcy5fb25Ub3VjaGVkPSgpPT57fSx0aGlzLl92YWx1ZUlkPSJtYXQtc2VsZWN0LXZhbHVlLSIrTUcrKyx0aGlzLl9wYW5lbERvbmVBbmltYXRpbmdTdHJlYW09bmV3IEksdGhpcy5fb3ZlcmxheVBhbmVsQ2xhc3M9KG51bGw9PT0oZj10aGlzLl9kZWZhdWx0T3B0aW9ucyl8fHZvaWQgMD09PWY/dm9pZCAwOmYub3ZlcmxheVBhbmVsQ2xhc3MpfHwiIix0aGlzLl9mb2N1c2VkPSExLHRoaXMuY29udHJvbFR5cGU9Im1hdC1zZWxlY3QiLHRoaXMuX3JlcXVpcmVkPSExLHRoaXMuX211bHRpcGxlPSExLHRoaXMuX2Rpc2FibGVPcHRpb25DZW50ZXJpbmc9bnVsbCE9PShoPW51bGw9PT0oZz10aGlzLl9kZWZhdWx0T3B0aW9ucyl8fHZvaWQgMD09PWc/dm9pZCAwOmcuZGlzYWJsZU9wdGlvbkNlbnRlcmluZykmJnZvaWQgMCE9PWgmJmgsdGhpcy5hcmlhTGFiZWw9IiIsdGhpcy5vcHRpb25TZWxlY3Rpb25DaGFuZ2VzPVF0KCgoKT0+e2NvbnN0IHQ9dGhpcy5vcHRpb25zO3JldHVybiB0P3QuY2hhbmdlcy5waXBlKE5lKHQpLHplKCgoKT0+cmUoLi4udC5tYXAoKHQ9PnQub25TZWxlY3Rpb25DaGFuZ2UpKSkpKSk6dGhpcy5fbmdab25lLm9uU3RhYmxlLnBpcGUoYmUoMSksemUoKCgpPT50aGlzLm9wdGlvblNlbGVjdGlvbkNoYW5nZXMpKSl9KSksdGhpcy5vcGVuZWRDaGFuZ2U9bmV3IExoLHRoaXMuX29wZW5lZFN0cmVhbT10aGlzLm9wZW5lZENoYW5nZS5waXBlKGNlKCh0PT50KSksSXQoKCgpPT57fSkpKSx0aGlzLl9jbG9zZWRTdHJlYW09dGhpcy5vcGVuZWRDaGFuZ2UucGlwZShjZSgodD0+IXQpKSxJdCgoKCk9Pnt9KSkpLHRoaXMuc2VsZWN0aW9uQ2hhbmdlPW5ldyBMaCx0aGlzLnZhbHVlQ2hhbmdlPW5ldyBMaCx0aGlzLm5nQ29udHJvbCYmKHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3I9dGhpcyksbnVsbCE9KG51bGw9PXU/dm9pZCAwOnUudHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbCkmJih0aGlzLl90eXBlYWhlYWREZWJvdW5jZUludGVydmFsPXUudHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbCksdGhpcy5fc2Nyb2xsU3RyYXRlZ3lGYWN0b3J5PXAsdGhpcy5fc2Nyb2xsU3RyYXRlZ3k9dGhpcy5fc2Nyb2xsU3RyYXRlZ3lGYWN0b3J5KCksdGhpcy50YWJJbmRleD1wYXJzZUludChkKXx8MCx0aGlzLmlkPXRoaXMuaWR9Z2V0IGZvY3VzZWQoKXtyZXR1cm4gdGhpcy5fZm9jdXNlZHx8dGhpcy5fcGFuZWxPcGVufWdldCBwbGFjZWhvbGRlcigpe3JldHVybiB0aGlzLl9wbGFjZWhvbGRlcn1zZXQgcGxhY2Vob2xkZXIodCl7dGhpcy5fcGxhY2Vob2xkZXI9dCx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCl9Z2V0IHJlcXVpcmVkKCl7cmV0dXJuIHRoaXMuX3JlcXVpcmVkfXNldCByZXF1aXJlZCh0KXt0aGlzLl9yZXF1aXJlZD15eih0KSx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCl9Z2V0IG11bHRpcGxlKCl7cmV0dXJuIHRoaXMuX211bHRpcGxlfXNldCBtdWx0aXBsZSh0KXtpZih0aGlzLl9zZWxlY3Rpb25Nb2RlbCYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KdGhyb3coZnVuY3Rpb24gZSgpe3JldHVybiBFcnJvcigiQ2Fubm90IGNoYW5nZSBgbXVsdGlwbGVgIG1vZGUgb2Ygc2VsZWN0IGFmdGVyIGluaXRpYWxpemF0aW9uLiIpfSkoKTt0aGlzLl9tdWx0aXBsZT15eih0KX1nZXQgZGlzYWJsZU9wdGlvbkNlbnRlcmluZygpe3JldHVybiB0aGlzLl9kaXNhYmxlT3B0aW9uQ2VudGVyaW5nfXNldCBkaXNhYmxlT3B0aW9uQ2VudGVyaW5nKHQpe3RoaXMuX2Rpc2FibGVPcHRpb25DZW50ZXJpbmc9eXoodCl9Z2V0IGNvbXBhcmVXaXRoKCl7cmV0dXJuIHRoaXMuX2NvbXBhcmVXaXRofXNldCBjb21wYXJlV2l0aCh0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93KGZ1bmN0aW9uIGUoKXtyZXR1cm4gRXJyb3IoImBjb21wYXJlV2l0aGAgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpfSkoKTt0aGlzLl9jb21wYXJlV2l0aD10LHRoaXMuX3NlbGVjdGlvbk1vZGVsJiZ0aGlzLl9pbml0aWFsaXplU2VsZWN0aW9uKCl9Z2V0IHZhbHVlKCl7cmV0dXJuIHRoaXMuX3ZhbHVlfXNldCB2YWx1ZSh0KXsodCE9PXRoaXMuX3ZhbHVlfHx0aGlzLl9tdWx0aXBsZSYmQXJyYXkuaXNBcnJheSh0KSkmJih0aGlzLm9wdGlvbnMmJnRoaXMuX3NldFNlbGVjdGlvbkJ5VmFsdWUodCksdGhpcy5fdmFsdWU9dCl9Z2V0IHR5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWwoKXtyZXR1cm4gdGhpcy5fdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbH1zZXQgdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbCh0KXt0aGlzLl90eXBlYWhlYWREZWJvdW5jZUludGVydmFsPV96KHQpfWdldCBpZCgpe3JldHVybiB0aGlzLl9pZH1zZXQgaWQodCl7dGhpcy5faWQ9dHx8dGhpcy5fdWlkLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKX1uZ09uSW5pdCgpe3RoaXMuX3NlbGVjdGlvbk1vZGVsPW5ldyBvRih0aGlzLm11bHRpcGxlKSx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCksdGhpcy5fcGFuZWxEb25lQW5pbWF0aW5nU3RyZWFtLnBpcGUoTWUoKSxJZSh0aGlzLl9kZXN0cm95KSkuc3Vic2NyaWJlKCgoKT0+dGhpcy5fcGFuZWxEb25lQW5pbWF0aW5nKHRoaXMucGFuZWxPcGVuKSkpfW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX2luaXRLZXlNYW5hZ2VyKCksdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2hhbmdlZC5waXBlKEllKHRoaXMuX2Rlc3Ryb3kpKS5zdWJzY3JpYmUoKHQ9Pnt0LmFkZGVkLmZvckVhY2goKHQ9PnQuc2VsZWN0KCkpKSx0LnJlbW92ZWQuZm9yRWFjaCgodD0+dC5kZXNlbGVjdCgpKSl9KSksdGhpcy5vcHRpb25zLmNoYW5nZXMucGlwZShOZShudWxsKSxJZSh0aGlzLl9kZXN0cm95KSkuc3Vic2NyaWJlKCgoKT0+e3RoaXMuX3Jlc2V0T3B0aW9ucygpLHRoaXMuX2luaXRpYWxpemVTZWxlY3Rpb24oKX0pKX1uZ0RvQ2hlY2soKXtjb25zdCB0PXRoaXMuX2dldFRyaWdnZXJBcmlhTGFiZWxsZWRieSgpO2lmKHQhPT10aGlzLl90cmlnZ2VyQXJpYUxhYmVsbGVkQnkpe2NvbnN0IGU9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O3RoaXMuX3RyaWdnZXJBcmlhTGFiZWxsZWRCeT10LHQ/ZS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsdCk6ZS5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIpfXRoaXMubmdDb250cm9sJiZ0aGlzLnVwZGF0ZUVycm9yU3RhdGUoKX1uZ09uQ2hhbmdlcyh0KXt0LmRpc2FibGVkJiZ0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCksdC50eXBlYWhlYWREZWJvdW5jZUludGVydmFsJiZ0aGlzLl9rZXlNYW5hZ2VyJiZ0aGlzLl9rZXlNYW5hZ2VyLndpdGhUeXBlQWhlYWQodGhpcy5fdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9kZXN0cm95Lm5leHQoKSx0aGlzLl9kZXN0cm95LmNvbXBsZXRlKCksdGhpcy5zdGF0ZUNoYW5nZXMuY29tcGxldGUoKX10b2dnbGUoKXt0aGlzLnBhbmVsT3Blbj90aGlzLmNsb3NlKCk6dGhpcy5vcGVuKCl9b3Blbigpe3RoaXMuX2Nhbk9wZW4oKSYmKHRoaXMuX3BhbmVsT3Blbj0hMCx0aGlzLl9rZXlNYW5hZ2VyLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24obnVsbCksdGhpcy5faGlnaGxpZ2h0Q29ycmVjdE9wdGlvbigpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKX1jbG9zZSgpe3RoaXMuX3BhbmVsT3BlbiYmKHRoaXMuX3BhbmVsT3Blbj0hMSx0aGlzLl9rZXlNYW5hZ2VyLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24odGhpcy5faXNSdGwoKT8icnRsIjoibHRyIiksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCksdGhpcy5fb25Ub3VjaGVkKCkpfXdyaXRlVmFsdWUodCl7dGhpcy52YWx1ZT10fXJlZ2lzdGVyT25DaGFuZ2UodCl7dGhpcy5fb25DaGFuZ2U9dH1yZWdpc3Rlck9uVG91Y2hlZCh0KXt0aGlzLl9vblRvdWNoZWQ9dH1zZXREaXNhYmxlZFN0YXRlKHQpe3RoaXMuZGlzYWJsZWQ9dCx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCl9Z2V0IHBhbmVsT3Blbigpe3JldHVybiB0aGlzLl9wYW5lbE9wZW59Z2V0IHNlbGVjdGVkKCl7cmV0dXJuIHRoaXMubXVsdGlwbGU/dGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQ6dGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRbMF19Z2V0IHRyaWdnZXJWYWx1ZSgpe2lmKHRoaXMuZW1wdHkpcmV0dXJuIiI7aWYodGhpcy5fbXVsdGlwbGUpe2NvbnN0IHQ9dGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQubWFwKCh0PT50LnZpZXdWYWx1ZSkpO3JldHVybiB0aGlzLl9pc1J0bCgpJiZ0LnJldmVyc2UoKSx0LmpvaW4oIiwgIil9cmV0dXJuIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkWzBdLnZpZXdWYWx1ZX1faXNSdGwoKXtyZXR1cm4hIXRoaXMuX2RpciYmInJ0bCI9PT10aGlzLl9kaXIudmFsdWV9X2hhbmRsZUtleWRvd24odCl7dGhpcy5kaXNhYmxlZHx8KHRoaXMucGFuZWxPcGVuP3RoaXMuX2hhbmRsZU9wZW5LZXlkb3duKHQpOnRoaXMuX2hhbmRsZUNsb3NlZEtleWRvd24odCkpfV9oYW5kbGVDbG9zZWRLZXlkb3duKHQpe2NvbnN0IGU9dC5rZXlDb2RlLG49ZT09PWh6fHxlPT09Z3p8fDM3PT09ZXx8Mzk9PT1lLG89ZT09PW16fHxlPT09ZnosaT10aGlzLl9rZXlNYW5hZ2VyO2lmKCFpLmlzVHlwaW5nKCkmJm8mJiFieih0KXx8KHRoaXMubXVsdGlwbGV8fHQuYWx0S2V5KSYmbil0LnByZXZlbnREZWZhdWx0KCksdGhpcy5vcGVuKCk7ZWxzZSBpZighdGhpcy5tdWx0aXBsZSl7Y29uc3QgZT10aGlzLnNlbGVjdGVkO2kub25LZXlkb3duKHQpO2NvbnN0IG49dGhpcy5zZWxlY3RlZDtuJiZlIT09biYmdGhpcy5fbGl2ZUFubm91bmNlci5hbm5vdW5jZShuLnZpZXdWYWx1ZSwxZTQpfX1faGFuZGxlT3BlbktleWRvd24odCl7Y29uc3QgZT10aGlzLl9rZXlNYW5hZ2VyLG49dC5rZXlDb2RlLG89bj09PWh6fHxuPT09Z3osaT1lLmlzVHlwaW5nKCk7aWYobyYmdC5hbHRLZXkpdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuY2xvc2UoKTtlbHNlIGlmKGl8fG4hPT1teiYmbiE9PWZ6fHwhZS5hY3RpdmVJdGVtfHxieih0KSlpZighaSYmdGhpcy5fbXVsdGlwbGUmJjY1PT09biYmdC5jdHJsS2V5KXt0LnByZXZlbnREZWZhdWx0KCk7Y29uc3QgZT10aGlzLm9wdGlvbnMuc29tZSgodD0+IXQuZGlzYWJsZWQmJiF0LnNlbGVjdGVkKSk7dGhpcy5vcHRpb25zLmZvckVhY2goKHQ9Pnt0LmRpc2FibGVkfHwoZT90LnNlbGVjdCgpOnQuZGVzZWxlY3QoKSl9KSl9ZWxzZXtjb25zdCBuPWUuYWN0aXZlSXRlbUluZGV4O2Uub25LZXlkb3duKHQpLHRoaXMuX211bHRpcGxlJiZvJiZ0LnNoaWZ0S2V5JiZlLmFjdGl2ZUl0ZW0mJmUuYWN0aXZlSXRlbUluZGV4IT09biYmZS5hY3RpdmVJdGVtLl9zZWxlY3RWaWFJbnRlcmFjdGlvbigpfWVsc2UgdC5wcmV2ZW50RGVmYXVsdCgpLGUuYWN0aXZlSXRlbS5fc2VsZWN0VmlhSW50ZXJhY3Rpb24oKX1fb25Gb2N1cygpe3RoaXMuZGlzYWJsZWR8fCh0aGlzLl9mb2N1c2VkPSEwLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKSl9X29uQmx1cigpe3RoaXMuX2ZvY3VzZWQ9ITEsdGhpcy5kaXNhYmxlZHx8dGhpcy5wYW5lbE9wZW58fCh0aGlzLl9vblRvdWNoZWQoKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCkpfV9vbkF0dGFjaGVkKCl7dGhpcy5fb3ZlcmxheURpci5wb3NpdGlvbkNoYW5nZS5waXBlKGJlKDEpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpLHRoaXMuX3Bvc2l0aW9uaW5nU2V0dGxlZCgpfSkpfV9nZXRQYW5lbFRoZW1lKCl7cmV0dXJuIHRoaXMuX3BhcmVudEZvcm1GaWVsZD9gbWF0LSR7dGhpcy5fcGFyZW50Rm9ybUZpZWxkLmNvbG9yfWA6IiJ9Z2V0IGVtcHR5KCl7cmV0dXJuIXRoaXMuX3NlbGVjdGlvbk1vZGVsfHx0aGlzLl9zZWxlY3Rpb25Nb2RlbC5pc0VtcHR5KCl9X2luaXRpYWxpemVTZWxlY3Rpb24oKXtQcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+e3RoaXMuX3NldFNlbGVjdGlvbkJ5VmFsdWUodGhpcy5uZ0NvbnRyb2w/dGhpcy5uZ0NvbnRyb2wudmFsdWU6dGhpcy5fdmFsdWUpLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKX0pKX1fc2V0U2VsZWN0aW9uQnlWYWx1ZSh0KXtpZih0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZC5mb3JFYWNoKCh0PT50LnNldEluYWN0aXZlU3R5bGVzKCkpKSx0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhcigpLHRoaXMubXVsdGlwbGUmJnQpe2lmKCFBcnJheS5pc0FycmF5KHQpJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkpdGhyb3coZnVuY3Rpb24gZSgpe3JldHVybiBFcnJvcigiVmFsdWUgbXVzdCBiZSBhbiBhcnJheSBpbiBtdWx0aXBsZS1zZWxlY3Rpb24gbW9kZS4iKX0pKCk7dC5mb3JFYWNoKCh0PT50aGlzLl9zZWxlY3RWYWx1ZSh0KSkpLHRoaXMuX3NvcnRWYWx1ZXMoKX1lbHNle2NvbnN0IGU9dGhpcy5fc2VsZWN0VmFsdWUodCk7ZT90aGlzLl9rZXlNYW5hZ2VyLnVwZGF0ZUFjdGl2ZUl0ZW0oZSk6dGhpcy5wYW5lbE9wZW58fHRoaXMuX2tleU1hbmFnZXIudXBkYXRlQWN0aXZlSXRlbSgtMSl9dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9X3NlbGVjdFZhbHVlKHQpe2NvbnN0IGU9dGhpcy5vcHRpb25zLmZpbmQoKGU9PntpZih0aGlzLl9zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKGUpKXJldHVybiExO3RyeXtyZXR1cm4gbnVsbCE9ZS52YWx1ZSYmdGhpcy5fY29tcGFyZVdpdGgoZS52YWx1ZSx0KX1jYXRjaCh0KXtyZXR1cm4oInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmNvbnNvbGUud2Fybih0KSwhMX19KSk7cmV0dXJuIGUmJnRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdChlKSxlfV9pbml0S2V5TWFuYWdlcigpe3RoaXMuX2tleU1hbmFnZXI9bmV3IHRJKHRoaXMub3B0aW9ucykud2l0aFR5cGVBaGVhZCh0aGlzLl90eXBlYWhlYWREZWJvdW5jZUludGVydmFsKS53aXRoVmVydGljYWxPcmllbnRhdGlvbigpLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24odGhpcy5faXNSdGwoKT8icnRsIjoibHRyIikud2l0aEhvbWVBbmRFbmQoKS53aXRoQWxsb3dlZE1vZGlmaWVyS2V5cyhbInNoaWZ0S2V5Il0pLHRoaXMuX2tleU1hbmFnZXIudGFiT3V0LnBpcGUoSWUodGhpcy5fZGVzdHJveSkpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLnBhbmVsT3BlbiYmKCF0aGlzLm11bHRpcGxlJiZ0aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0mJnRoaXMuX2tleU1hbmFnZXIuYWN0aXZlSXRlbS5fc2VsZWN0VmlhSW50ZXJhY3Rpb24oKSx0aGlzLmZvY3VzKCksdGhpcy5jbG9zZSgpKX0pKSx0aGlzLl9rZXlNYW5hZ2VyLmNoYW5nZS5waXBlKEllKHRoaXMuX2Rlc3Ryb3kpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fcGFuZWxPcGVuJiZ0aGlzLnBhbmVsP3RoaXMuX3Njcm9sbE9wdGlvbkludG9WaWV3KHRoaXMuX2tleU1hbmFnZXIuYWN0aXZlSXRlbUluZGV4fHwwKTp0aGlzLl9wYW5lbE9wZW58fHRoaXMubXVsdGlwbGV8fCF0aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW18fHRoaXMuX2tleU1hbmFnZXIuYWN0aXZlSXRlbS5fc2VsZWN0VmlhSW50ZXJhY3Rpb24oKX0pKX1fcmVzZXRPcHRpb25zKCl7Y29uc3QgdD1yZSh0aGlzLm9wdGlvbnMuY2hhbmdlcyx0aGlzLl9kZXN0cm95KTt0aGlzLm9wdGlvblNlbGVjdGlvbkNoYW5nZXMucGlwZShJZSh0KSkuc3Vic2NyaWJlKCh0PT57dGhpcy5fb25TZWxlY3QodC5zb3VyY2UsdC5pc1VzZXJJbnB1dCksdC5pc1VzZXJJbnB1dCYmIXRoaXMubXVsdGlwbGUmJnRoaXMuX3BhbmVsT3BlbiYmKHRoaXMuY2xvc2UoKSx0aGlzLmZvY3VzKCkpfSkpLHJlKC4uLnRoaXMub3B0aW9ucy5tYXAoKHQ9PnQuX3N0YXRlQ2hhbmdlcykpKS5waXBlKEllKHQpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCksdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpfSkpfV9vblNlbGVjdCh0LGUpe2NvbnN0IG49dGhpcy5fc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZCh0KTtudWxsIT10LnZhbHVlfHx0aGlzLl9tdWx0aXBsZT8obiE9PXQuc2VsZWN0ZWQmJih0LnNlbGVjdGVkP3RoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdCh0KTp0aGlzLl9zZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdCh0KSksZSYmdGhpcy5fa2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKHQpLHRoaXMubXVsdGlwbGUmJih0aGlzLl9zb3J0VmFsdWVzKCksZSYmdGhpcy5mb2N1cygpKSk6KHQuZGVzZWxlY3QoKSx0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhcigpLG51bGwhPXRoaXMudmFsdWUmJnRoaXMuX3Byb3BhZ2F0ZUNoYW5nZXModC52YWx1ZSkpLG4hPT10aGlzLl9zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKHQpJiZ0aGlzLl9wcm9wYWdhdGVDaGFuZ2VzKCksdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpfV9zb3J0VmFsdWVzKCl7aWYodGhpcy5tdWx0aXBsZSl7Y29uc3QgdD10aGlzLm9wdGlvbnMudG9BcnJheSgpO3RoaXMuX3NlbGVjdGlvbk1vZGVsLnNvcnQoKChlLG4pPT50aGlzLnNvcnRDb21wYXJhdG9yP3RoaXMuc29ydENvbXBhcmF0b3IoZSxuLHQpOnQuaW5kZXhPZihlKS10LmluZGV4T2YobikpKSx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCl9fV9wcm9wYWdhdGVDaGFuZ2VzKHQpe2xldCBlPW51bGw7ZT10aGlzLm11bHRpcGxlP3RoaXMuc2VsZWN0ZWQubWFwKCh0PT50LnZhbHVlKSk6dGhpcy5zZWxlY3RlZD90aGlzLnNlbGVjdGVkLnZhbHVlOnQsdGhpcy5fdmFsdWU9ZSx0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoZSksdGhpcy5fb25DaGFuZ2UoZSksdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLl9nZXRDaGFuZ2VFdmVudChlKSksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9X2hpZ2hsaWdodENvcnJlY3RPcHRpb24oKXt0aGlzLl9rZXlNYW5hZ2VyJiYodGhpcy5lbXB0eT90aGlzLl9rZXlNYW5hZ2VyLnNldEZpcnN0SXRlbUFjdGl2ZSgpOnRoaXMuX2tleU1hbmFnZXIuc2V0QWN0aXZlSXRlbSh0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFswXSkpfV9jYW5PcGVuKCl7dmFyIHQ7cmV0dXJuIXRoaXMuX3BhbmVsT3BlbiYmIXRoaXMuZGlzYWJsZWQmJihudWxsPT09KHQ9dGhpcy5vcHRpb25zKXx8dm9pZCAwPT09dD92b2lkIDA6dC5sZW5ndGgpPjB9Zm9jdXModCl7dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKHQpfV9nZXRQYW5lbEFyaWFMYWJlbGxlZGJ5KCl7dmFyIHQ7aWYodGhpcy5hcmlhTGFiZWwpcmV0dXJuIG51bGw7Y29uc3QgZT1udWxsPT09KHQ9dGhpcy5fcGFyZW50Rm9ybUZpZWxkKXx8dm9pZCAwPT09dD92b2lkIDA6dC5nZXRMYWJlbElkKCk7cmV0dXJuIHRoaXMuYXJpYUxhYmVsbGVkYnk/KGU/ZSsiICI6IiIpK3RoaXMuYXJpYUxhYmVsbGVkYnk6ZX1fZ2V0QXJpYUFjdGl2ZURlc2NlbmRhbnQoKXtyZXR1cm4gdGhpcy5wYW5lbE9wZW4mJnRoaXMuX2tleU1hbmFnZXImJnRoaXMuX2tleU1hbmFnZXIuYWN0aXZlSXRlbT90aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0uaWQ6bnVsbH1fZ2V0VHJpZ2dlckFyaWFMYWJlbGxlZGJ5KCl7dmFyIHQ7aWYodGhpcy5hcmlhTGFiZWwpcmV0dXJuIG51bGw7Y29uc3QgZT1udWxsPT09KHQ9dGhpcy5fcGFyZW50Rm9ybUZpZWxkKXx8dm9pZCAwPT09dD92b2lkIDA6dC5nZXRMYWJlbElkKCk7bGV0IG49KGU/ZSsiICI6IiIpK3RoaXMuX3ZhbHVlSWQ7cmV0dXJuIHRoaXMuYXJpYUxhYmVsbGVkYnkmJihuKz0iICIrdGhpcy5hcmlhTGFiZWxsZWRieSksbn1fcGFuZWxEb25lQW5pbWF0aW5nKHQpe3RoaXMub3BlbmVkQ2hhbmdlLmVtaXQodCl9c2V0RGVzY3JpYmVkQnlJZHModCl7dGhpcy5fYXJpYURlc2NyaWJlZGJ5PXQuam9pbigiICIpfW9uQ29udGFpbmVyQ2xpY2soKXt0aGlzLmZvY3VzKCksdGhpcy5vcGVuKCl9Z2V0IHNob3VsZExhYmVsRmxvYXQoKXtyZXR1cm4gdGhpcy5fcGFuZWxPcGVufHwhdGhpcy5lbXB0eXx8dGhpcy5fZm9jdXNlZCYmISF0aGlzLl9wbGFjZWhvbGRlcn19UkcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFJHKShTbSh1RiksU20oVWcpLFNtKGFfKSxTbShiSCksU20oaGcpLFNtKEhJLDgpLFNtKGlVLDgpLFNtKFBVLDgpLFNtKFJWLDgpLFNtKE1qLDEwKSxOYSgidGFiaW5kZXgiKSxTbSh4RyksU20oT0kpLFNtKE9HLDgpKX0sUkcuybVkaXI9bG8oe3R5cGU6Ukcsdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihRaChtRyw1KSxRaCh1Ryw1KSxRaChnTCw1KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi50cmlnZ2VyPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLnBhbmVsPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLl9vdmVybGF5RGlyPXQuZmlyc3QpfX0saW5wdXRzOnthcmlhTGFiZWw6WyJhcmlhLWxhYmVsIiwiYXJpYUxhYmVsIl0saWQ6ImlkIixwbGFjZWhvbGRlcjoicGxhY2Vob2xkZXIiLHJlcXVpcmVkOiJyZXF1aXJlZCIsbXVsdGlwbGU6Im11bHRpcGxlIixkaXNhYmxlT3B0aW9uQ2VudGVyaW5nOiJkaXNhYmxlT3B0aW9uQ2VudGVyaW5nIixjb21wYXJlV2l0aDoiY29tcGFyZVdpdGgiLHZhbHVlOiJ2YWx1ZSIsdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbDoidHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbCIscGFuZWxDbGFzczoicGFuZWxDbGFzcyIsYXJpYUxhYmVsbGVkYnk6WyJhcmlhLWxhYmVsbGVkYnkiLCJhcmlhTGFiZWxsZWRieSJdLGVycm9yU3RhdGVNYXRjaGVyOiJlcnJvclN0YXRlTWF0Y2hlciIsc29ydENvbXBhcmF0b3I6InNvcnRDb21wYXJhdG9yIn0sb3V0cHV0czp7b3BlbmVkQ2hhbmdlOiJvcGVuZWRDaGFuZ2UiLF9vcGVuZWRTdHJlYW06Im9wZW5lZCIsX2Nsb3NlZFN0cmVhbToiY2xvc2VkIixzZWxlY3Rpb25DaGFuZ2U6InNlbGVjdGlvbkNoYW5nZSIsdmFsdWVDaGFuZ2U6InZhbHVlQ2hhbmdlIn0sZmVhdHVyZXM6W3hwLEJvXX0pLFJHLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6dUZ9LHt0eXBlOlVnfSx7dHlwZTphX30se3R5cGU6Ykh9LHt0eXBlOmhnfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTppVSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpQVSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpBVixkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbUlZdfV19LHt0eXBlOk1qLGRlY29yYXRvcnM6W3t0eXBlOkRyfSx7dHlwZTpTcn1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6amEsYXJnczpbInRhYmluZGV4Il19XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3hHXX1dfSx7dHlwZTpPSX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltPR119XX1dLFJHLnByb3BEZWNvcmF0b3JzPXt0cmlnZ2VyOlt7dHlwZTpaYSxhcmdzOlsidHJpZ2dlciJdfV0scGFuZWw6W3t0eXBlOlphLGFyZ3M6WyJwYW5lbCJdfV0sX292ZXJsYXlEaXI6W3t0eXBlOlphLGFyZ3M6W2dMXX1dLHBhbmVsQ2xhc3M6W3t0eXBlOnh5fV0scGxhY2Vob2xkZXI6W3t0eXBlOnh5fV0scmVxdWlyZWQ6W3t0eXBlOnh5fV0sbXVsdGlwbGU6W3t0eXBlOnh5fV0sZGlzYWJsZU9wdGlvbkNlbnRlcmluZzpbe3R5cGU6eHl9XSxjb21wYXJlV2l0aDpbe3R5cGU6eHl9XSx2YWx1ZTpbe3R5cGU6eHl9XSxhcmlhTGFiZWw6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsIl19XSxhcmlhTGFiZWxsZWRieTpbe3R5cGU6eHksYXJnczpbImFyaWEtbGFiZWxsZWRieSJdfV0sZXJyb3JTdGF0ZU1hdGNoZXI6W3t0eXBlOnh5fV0sdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbDpbe3R5cGU6eHl9XSxzb3J0Q29tcGFyYXRvcjpbe3R5cGU6eHl9XSxpZDpbe3R5cGU6eHl9XSxvcGVuZWRDaGFuZ2U6W3t0eXBlOk95fV0sX29wZW5lZFN0cmVhbTpbe3R5cGU6T3ksYXJnczpbIm9wZW5lZCJdfV0sX2Nsb3NlZFN0cmVhbTpbe3R5cGU6T3ksYXJnczpbImNsb3NlZCJdfV0sc2VsZWN0aW9uQ2hhbmdlOlt7dHlwZTpPeX1dLHZhbHVlQ2hhbmdlOlt7dHlwZTpPeX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFJHLFt7dHlwZTpDeX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp1Rn0se3R5cGU6VWd9LHt0eXBlOmFffSx7dHlwZTpiSH0se3R5cGU6aGd9LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOmlVLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOlBVLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOkFWLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltSVl19XX0se3R5cGU6TWosZGVjb3JhdG9yczpbe3R5cGU6RHJ9LHt0eXBlOlNyfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpqYSxhcmdzOlsidGFiaW5kZXgiXX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbeEddfV19LHt0eXBlOk9JfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W09HXX1dfV19KSx7YXJpYUxhYmVsOlt7dHlwZTp4eSxhcmdzOlsiYXJpYS1sYWJlbCJdfV0sb3BlbmVkQ2hhbmdlOlt7dHlwZTpPeX1dLF9vcGVuZWRTdHJlYW06W3t0eXBlOk95LGFyZ3M6WyJvcGVuZWQiXX1dLF9jbG9zZWRTdHJlYW06W3t0eXBlOk95LGFyZ3M6WyJjbG9zZWQiXX1dLHNlbGVjdGlvbkNoYW5nZTpbe3R5cGU6T3l9XSx2YWx1ZUNoYW5nZTpbe3R5cGU6T3l9XSxpZDpbe3R5cGU6eHl9XSxwbGFjZWhvbGRlcjpbe3R5cGU6eHl9XSxyZXF1aXJlZDpbe3R5cGU6eHl9XSxtdWx0aXBsZTpbe3R5cGU6eHl9XSxkaXNhYmxlT3B0aW9uQ2VudGVyaW5nOlt7dHlwZTp4eX1dLGNvbXBhcmVXaXRoOlt7dHlwZTp4eX1dLHZhbHVlOlt7dHlwZTp4eX1dLHR5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWw6W3t0eXBlOnh5fV0sdHJpZ2dlcjpbe3R5cGU6WmEsYXJnczpbInRyaWdnZXIiXX1dLHBhbmVsOlt7dHlwZTpaYSxhcmdzOlsicGFuZWwiXX1dLF9vdmVybGF5RGlyOlt7dHlwZTpaYSxhcmdzOltnTF19XSxwYW5lbENsYXNzOlt7dHlwZTp4eX1dLGFyaWFMYWJlbGxlZGJ5Olt7dHlwZTp4eSxhcmdzOlsiYXJpYS1sYWJlbGxlZGJ5Il19XSxlcnJvclN0YXRlTWF0Y2hlcjpbe3R5cGU6eHl9XSxzb3J0Q29tcGFyYXRvcjpbe3R5cGU6eHl9XX0pO2NsYXNzIEFHIGV4dGVuZHMgUkd7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX3Njcm9sbFRvcD0wLHRoaXMuX3RyaWdnZXJGb250U2l6ZT0wLHRoaXMuX3RyYW5zZm9ybU9yaWdpbj0idG9wIix0aGlzLl9vZmZzZXRZPTAsdGhpcy5fcG9zaXRpb25zPVt7b3JpZ2luWDoic3RhcnQiLG9yaWdpblk6InRvcCIsb3ZlcmxheVg6InN0YXJ0IixvdmVybGF5WToidG9wIn0se29yaWdpblg6InN0YXJ0IixvcmlnaW5ZOiJib3R0b20iLG92ZXJsYXlYOiJzdGFydCIsb3ZlcmxheVk6ImJvdHRvbSJ9XX1fY2FsY3VsYXRlT3ZlcmxheVNjcm9sbCh0LGUsbil7Y29uc3Qgbz10aGlzLl9nZXRJdGVtSGVpZ2h0KCk7cmV0dXJuIE1hdGgubWluKE1hdGgubWF4KDAsbyp0LWUrby8yKSxuKX1uZ09uSW5pdCgpe3N1cGVyLm5nT25Jbml0KCksdGhpcy5fdmlld3BvcnRSdWxlci5jaGFuZ2UoKS5waXBlKEllKHRoaXMuX2Rlc3Ryb3kpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5wYW5lbE9wZW4mJih0aGlzLl90cmlnZ2VyUmVjdD10aGlzLnRyaWdnZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSl9KSl9b3Blbigpe3N1cGVyLl9jYW5PcGVuKCkmJihzdXBlci5vcGVuKCksdGhpcy5fdHJpZ2dlclJlY3Q9dGhpcy50cmlnZ2VyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdGhpcy5fdHJpZ2dlckZvbnRTaXplPXBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUodGhpcy50cmlnZ2VyLm5hdGl2ZUVsZW1lbnQpLmZvbnRTaXplfHwiMCIpLHRoaXMuX2NhbGN1bGF0ZU92ZXJsYXlQb3NpdGlvbigpLHRoaXMuX25nWm9uZS5vblN0YWJsZS5waXBlKGJlKDEpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fdHJpZ2dlckZvbnRTaXplJiZ0aGlzLl9vdmVybGF5RGlyLm92ZXJsYXlSZWYmJnRoaXMuX292ZXJsYXlEaXIub3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudCYmKHRoaXMuX292ZXJsYXlEaXIub3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5zdHlsZS5mb250U2l6ZT1gJHt0aGlzLl90cmlnZ2VyRm9udFNpemV9cHhgKX0pKSl9X3Njcm9sbE9wdGlvbkludG9WaWV3KHQpe2NvbnN0IGU9VkgodCx0aGlzLm9wdGlvbnMsdGhpcy5vcHRpb25Hcm91cHMpLG49dGhpcy5fZ2V0SXRlbUhlaWdodCgpO3RoaXMucGFuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A9MD09PXQmJjE9PT1lPzA6akgoKHQrZSkqbixuLHRoaXMucGFuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AsdkcpfV9wb3NpdGlvbmluZ1NldHRsZWQoKXt0aGlzLl9jYWxjdWxhdGVPdmVybGF5T2Zmc2V0WCgpLHRoaXMucGFuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A9dGhpcy5fc2Nyb2xsVG9wfV9wYW5lbERvbmVBbmltYXRpbmcodCl7dGhpcy5wYW5lbE9wZW4/dGhpcy5fc2Nyb2xsVG9wPTA6KHRoaXMuX292ZXJsYXlEaXIub2Zmc2V0WD0wLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKSxzdXBlci5fcGFuZWxEb25lQW5pbWF0aW5nKHQpfV9nZXRDaGFuZ2VFdmVudCh0KXtyZXR1cm4gbmV3IGtHKHRoaXMsdCl9X2NhbGN1bGF0ZU92ZXJsYXlPZmZzZXRYKCl7Y29uc3QgdD10aGlzLl9vdmVybGF5RGlyLm92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZT10aGlzLl92aWV3cG9ydFJ1bGVyLmdldFZpZXdwb3J0U2l6ZSgpLG49dGhpcy5faXNSdGwoKSxvPXRoaXMubXVsdGlwbGU/NTY6MzI7bGV0IGk7aWYodGhpcy5tdWx0aXBsZSlpPTQwO2Vsc2UgaWYodGhpcy5kaXNhYmxlT3B0aW9uQ2VudGVyaW5nKWk9MTY7ZWxzZXtsZXQgdD10aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFswXXx8dGhpcy5vcHRpb25zLmZpcnN0O2k9dCYmdC5ncm91cD8zMjoxNn1ufHwoaSo9LTEpO2NvbnN0IGE9MC0odC5sZWZ0K2ktKG4/bzowKSkscj10LnJpZ2h0K2ktZS53aWR0aCsobj8wOm8pO2E+MD9pKz1hKzg6cj4wJiYoaS09cis4KSx0aGlzLl9vdmVybGF5RGlyLm9mZnNldFg9TWF0aC5yb3VuZChpKSx0aGlzLl9vdmVybGF5RGlyLm92ZXJsYXlSZWYudXBkYXRlUG9zaXRpb24oKX1fY2FsY3VsYXRlT3ZlcmxheU9mZnNldFkodCxlLG4pe2NvbnN0IG89dGhpcy5fZ2V0SXRlbUhlaWdodCgpLGk9KG8tdGhpcy5fdHJpZ2dlclJlY3QuaGVpZ2h0KS8yLGE9TWF0aC5mbG9vcih2Ry9vKTtsZXQgcjtyZXR1cm4gdGhpcy5kaXNhYmxlT3B0aW9uQ2VudGVyaW5nPzA6KHI9MD09PXRoaXMuX3Njcm9sbFRvcD90Km86dGhpcy5fc2Nyb2xsVG9wPT09bj8odC0odGhpcy5fZ2V0SXRlbUNvdW50KCktYSkpKm8rKG8tKHRoaXMuX2dldEl0ZW1Db3VudCgpKm8tdkcpJW8pOmUtby8yLE1hdGgucm91bmQoLTEqci1pKSl9X2NoZWNrT3ZlcmxheVdpdGhpblZpZXdwb3J0KHQpe2NvbnN0IGU9dGhpcy5fZ2V0SXRlbUhlaWdodCgpLG49dGhpcy5fdmlld3BvcnRSdWxlci5nZXRWaWV3cG9ydFNpemUoKSxvPXRoaXMuX3RyaWdnZXJSZWN0LnRvcC04LGk9bi5oZWlnaHQtdGhpcy5fdHJpZ2dlclJlY3QuYm90dG9tLTgsYT1NYXRoLmFicyh0aGlzLl9vZmZzZXRZKSxyPU1hdGgubWluKHRoaXMuX2dldEl0ZW1Db3VudCgpKmUsdkcpLWEtdGhpcy5fdHJpZ2dlclJlY3QuaGVpZ2h0O3I+aT90aGlzLl9hZGp1c3RQYW5lbFVwKHIsaSk6YT5vP3RoaXMuX2FkanVzdFBhbmVsRG93bihhLG8sdCk6dGhpcy5fdHJhbnNmb3JtT3JpZ2luPXRoaXMuX2dldE9yaWdpbkJhc2VkT25PcHRpb24oKX1fYWRqdXN0UGFuZWxVcCh0LGUpe2NvbnN0IG49TWF0aC5yb3VuZCh0LWUpO3RoaXMuX3Njcm9sbFRvcC09bix0aGlzLl9vZmZzZXRZLT1uLHRoaXMuX3RyYW5zZm9ybU9yaWdpbj10aGlzLl9nZXRPcmlnaW5CYXNlZE9uT3B0aW9uKCksdGhpcy5fc2Nyb2xsVG9wPD0wJiYodGhpcy5fc2Nyb2xsVG9wPTAsdGhpcy5fb2Zmc2V0WT0wLHRoaXMuX3RyYW5zZm9ybU9yaWdpbj0iNTAlIGJvdHRvbSAwcHgiKX1fYWRqdXN0UGFuZWxEb3duKHQsZSxuKXtjb25zdCBvPU1hdGgucm91bmQodC1lKTtpZih0aGlzLl9zY3JvbGxUb3ArPW8sdGhpcy5fb2Zmc2V0WSs9byx0aGlzLl90cmFuc2Zvcm1PcmlnaW49dGhpcy5fZ2V0T3JpZ2luQmFzZWRPbk9wdGlvbigpLHRoaXMuX3Njcm9sbFRvcD49bilyZXR1cm4gdGhpcy5fc2Nyb2xsVG9wPW4sdGhpcy5fb2Zmc2V0WT0wLHZvaWQodGhpcy5fdHJhbnNmb3JtT3JpZ2luPSI1MCUgdG9wIDBweCIpfV9jYWxjdWxhdGVPdmVybGF5UG9zaXRpb24oKXtjb25zdCB0PXRoaXMuX2dldEl0ZW1IZWlnaHQoKSxlPXRoaXMuX2dldEl0ZW1Db3VudCgpLG49TWF0aC5taW4oZSp0LHZHKSxvPWUqdC1uO2xldCBpO2k9dGhpcy5lbXB0eT8wOk1hdGgubWF4KHRoaXMub3B0aW9ucy50b0FycmF5KCkuaW5kZXhPZih0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFswXSksMCksaSs9VkgoaSx0aGlzLm9wdGlvbnMsdGhpcy5vcHRpb25Hcm91cHMpO2NvbnN0IGE9bi8yO3RoaXMuX3Njcm9sbFRvcD10aGlzLl9jYWxjdWxhdGVPdmVybGF5U2Nyb2xsKGksYSxvKSx0aGlzLl9vZmZzZXRZPXRoaXMuX2NhbGN1bGF0ZU92ZXJsYXlPZmZzZXRZKGksYSxvKSx0aGlzLl9jaGVja092ZXJsYXlXaXRoaW5WaWV3cG9ydChvKX1fZ2V0T3JpZ2luQmFzZWRPbk9wdGlvbigpe2NvbnN0IHQ9dGhpcy5fZ2V0SXRlbUhlaWdodCgpLGU9KHQtdGhpcy5fdHJpZ2dlclJlY3QuaGVpZ2h0KS8yO3JldHVybmA1MCUgJHtNYXRoLmFicyh0aGlzLl9vZmZzZXRZKS1lK3QvMn1weCAwcHhgfV9nZXRJdGVtSGVpZ2h0KCl7cmV0dXJuIDMqdGhpcy5fdHJpZ2dlckZvbnRTaXplfV9nZXRJdGVtQ291bnQoKXtyZXR1cm4gdGhpcy5vcHRpb25zLmxlbmd0aCt0aGlzLm9wdGlvbkdyb3Vwcy5sZW5ndGh9fUFHLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYShBRykpKShufHxBRyl9fSkoKSxBRy7JtWNtcD10byh7dHlwZTpBRyxzZWxlY3RvcnM6W1sibWF0LXNlbGVjdCJdXSxjb250ZW50UXVlcmllczpmdW5jdGlvbiB0KGUsbixvKXtpZigxJmUmJigkaChvLERHLDUpLCRoKG8sQkgsNSksJGgobyx6SCw1KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5jdXN0b21UcmlnZ2VyPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLm9wdGlvbnM9dCksSmgodD10YigpKSYmKG4ub3B0aW9uR3JvdXBzPXQpfX0saG9zdEF0dHJzOlsicm9sZSIsImNvbWJvYm94IiwiYXJpYS1hdXRvY29tcGxldGUiLCJub25lIiwiYXJpYS1oYXNwb3B1cCIsInRydWUiLDEsIm1hdC1zZWxlY3QiXSxob3N0VmFyczoyMCxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezEmZSYmVm0oImtleWRvd24iLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9oYW5kbGVLZXlkb3duKGUpfSkpKCJmb2N1cyIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5fb25Gb2N1cygpfSkpKCJibHVyIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9vbkJsdXIoKX0pKSwyJmUmJihqcCgiaWQiLG4uaWQpKCJ0YWJpbmRleCIsbi50YWJJbmRleCkoImFyaWEtY29udHJvbHMiLG4ucGFuZWxPcGVuP24uaWQrIi1wYW5lbCI6bnVsbCkoImFyaWEtZXhwYW5kZWQiLG4ucGFuZWxPcGVuKSgiYXJpYS1sYWJlbCIsbi5hcmlhTGFiZWx8fG51bGwpKCJhcmlhLXJlcXVpcmVkIixuLnJlcXVpcmVkLnRvU3RyaW5nKCkpKCJhcmlhLWRpc2FibGVkIixuLmRpc2FibGVkLnRvU3RyaW5nKCkpKCJhcmlhLWludmFsaWQiLG4uZXJyb3JTdGF0ZSkoImFyaWEtZGVzY3JpYmVkYnkiLG4uX2FyaWFEZXNjcmliZWRieXx8bnVsbCkoImFyaWEtYWN0aXZlZGVzY2VuZGFudCIsbi5fZ2V0QXJpYUFjdGl2ZURlc2NlbmRhbnQoKSkscHUoIm1hdC1zZWxlY3QtZGlzYWJsZWQiLG4uZGlzYWJsZWQpKCJtYXQtc2VsZWN0LWludmFsaWQiLG4uZXJyb3JTdGF0ZSkoIm1hdC1zZWxlY3QtcmVxdWlyZWQiLG4ucmVxdWlyZWQpKCJtYXQtc2VsZWN0LWVtcHR5IixuLmVtcHR5KSgibWF0LXNlbGVjdC1tdWx0aXBsZSIsbi5tdWx0aXBsZSkpfSxpbnB1dHM6e2Rpc2FibGVkOiJkaXNhYmxlZCIsZGlzYWJsZVJpcHBsZToiZGlzYWJsZVJpcHBsZSIsdGFiSW5kZXg6InRhYkluZGV4In0sZXhwb3J0QXM6WyJtYXRTZWxlY3QiXSxmZWF0dXJlczpbcGcoW3twcm92aWRlOmJWLHVzZUV4aXN0aW5nOkFHfSx7cHJvdmlkZTpSSCx1c2VFeGlzdGluZzpBR31dKSx4cF0sbmdDb250ZW50U2VsZWN0b3JzOlsibWF0LXNlbGVjdC10cmlnZ2VyIiwiKiJdLGRlY2xzOjksdmFyczoxMixjb25zdHM6W1siY2RrLW92ZXJsYXktb3JpZ2luIiwiIiwxLCJtYXQtc2VsZWN0LXRyaWdnZXIiLDMsImNsaWNrIl0sWyJvcmlnaW4iLCJjZGtPdmVybGF5T3JpZ2luIiwidHJpZ2dlciIsIiJdLFsxLCJtYXQtc2VsZWN0LXZhbHVlIiwzLCJuZ1N3aXRjaCJdLFsiY2xhc3MiLCJtYXQtc2VsZWN0LXBsYWNlaG9sZGVyIG1hdC1zZWxlY3QtbWluLWxpbmUiLDQsIm5nU3dpdGNoQ2FzZSJdLFsiY2xhc3MiLCJtYXQtc2VsZWN0LXZhbHVlLXRleHQiLDMsIm5nU3dpdGNoIiw0LCJuZ1N3aXRjaENhc2UiXSxbMSwibWF0LXNlbGVjdC1hcnJvdy13cmFwcGVyIl0sWzEsIm1hdC1zZWxlY3QtYXJyb3ciXSxbImNkay1jb25uZWN0ZWQtb3ZlcmxheSIsIiIsImNka0Nvbm5lY3RlZE92ZXJsYXlMb2NrUG9zaXRpb24iLCIiLCJjZGtDb25uZWN0ZWRPdmVybGF5SGFzQmFja2Ryb3AiLCIiLCJjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcyIsImNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wIiwzLCJjZGtDb25uZWN0ZWRPdmVybGF5UGFuZWxDbGFzcyIsImNka0Nvbm5lY3RlZE92ZXJsYXlTY3JvbGxTdHJhdGVneSIsImNka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW4iLCJjZGtDb25uZWN0ZWRPdmVybGF5T3BlbiIsImNka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnMiLCJjZGtDb25uZWN0ZWRPdmVybGF5TWluV2lkdGgiLCJjZGtDb25uZWN0ZWRPdmVybGF5T2Zmc2V0WSIsImJhY2tkcm9wQ2xpY2siLCJhdHRhY2giLCJkZXRhY2giXSxbMSwibWF0LXNlbGVjdC1wbGFjZWhvbGRlciIsIm1hdC1zZWxlY3QtbWluLWxpbmUiXSxbMSwibWF0LXNlbGVjdC12YWx1ZS10ZXh0IiwzLCJuZ1N3aXRjaCJdLFsiY2xhc3MiLCJtYXQtc2VsZWN0LW1pbi1saW5lIiw0LCJuZ1N3aXRjaERlZmF1bHQiXSxbNCwibmdTd2l0Y2hDYXNlIl0sWzEsIm1hdC1zZWxlY3QtbWluLWxpbmUiXSxbMSwibWF0LXNlbGVjdC1wYW5lbC13cmFwIl0sWyJyb2xlIiwibGlzdGJveCIsInRhYmluZGV4IiwiLTEiLDMsIm5nQ2xhc3MiLCJrZXlkb3duIl0sWyJwYW5lbCIsIiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoWm0oX0cpLFJtKDAsImRpdiIsMCwxKSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4udG9nZ2xlKCl9KSksUm0oMywiZGl2IiwyKSxRcCg0LGZHLDIsMSwic3BhbiIsMyksUXAoNSxiRywzLDIsInNwYW4iLDQpLEFtKCksUm0oNiwiZGl2Iiw1KSxUbSg3LCJkaXYiLDYpLEFtKCksQW0oKSxRcCg4LHlHLDQsMTQsIm5nLXRlbXBsYXRlIiw3KSxWbSgiYmFja2Ryb3BDbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5jbG9zZSgpfSkpKCJhdHRhY2giLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX29uQXR0YWNoZWQoKX0pKSgiZGV0YWNoIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLmNsb3NlKCl9KSkpLDImZSl7Y29uc3QgdD0kcCgxKTtqcCgiYXJpYS1vd25zIixuLnBhbmVsT3Blbj9uLmlkKyItcGFuZWwiOm51bGwpLHJjKDMpLERtKCJuZ1N3aXRjaCIsbi5lbXB0eSksanAoImlkIixuLl92YWx1ZUlkKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIiwhMCkscmMoMSksRG0oIm5nU3dpdGNoQ2FzZSIsITEpLHJjKDMpLERtKCJjZGtDb25uZWN0ZWRPdmVybGF5UGFuZWxDbGFzcyIsbi5fb3ZlcmxheVBhbmVsQ2xhc3MpKCJjZGtDb25uZWN0ZWRPdmVybGF5U2Nyb2xsU3RyYXRlZ3kiLG4uX3Njcm9sbFN0cmF0ZWd5KSgiY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbiIsdCkoImNka0Nvbm5lY3RlZE92ZXJsYXlPcGVuIixuLnBhbmVsT3BlbikoImNka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnMiLG4uX3Bvc2l0aW9ucykoImNka0Nvbm5lY3RlZE92ZXJsYXlNaW5XaWR0aCIsbnVsbD09bi5fdHJpZ2dlclJlY3Q/bnVsbDpuLl90cmlnZ2VyUmVjdC53aWR0aCkoImNka0Nvbm5lY3RlZE92ZXJsYXlPZmZzZXRZIixuLl9vZmZzZXRZKX19LGRpcmVjdGl2ZXM6W2ZMLGZNLGdNLGdMLGhNLGFNXSxzdHlsZXM6WycubWF0LXNlbGVjdHtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxMDAlO291dGxpbmU6bm9uZX0ubWF0LXNlbGVjdC10cmlnZ2Vye2Rpc3BsYXk6aW5saW5lLXRhYmxlO2N1cnNvcjpwb2ludGVyO3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LXNlbGVjdC1kaXNhYmxlZCAubWF0LXNlbGVjdC10cmlnZ2Vyey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6ZGVmYXVsdH0ubWF0LXNlbGVjdC12YWx1ZXtkaXNwbGF5OnRhYmxlLWNlbGw7bWF4LXdpZHRoOjA7d2lkdGg6MTAwJTtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9Lm1hdC1zZWxlY3QtdmFsdWUtdGV4dHt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9Lm1hdC1zZWxlY3QtYXJyb3ctd3JhcHBlcntkaXNwbGF5OnRhYmxlLWNlbGw7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1zZWxlY3QtYXJyb3ctd3JhcHBlcnt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtc2VsZWN0LWFycm93LXdyYXBwZXJ7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTI1JSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtaGFzLWxhYmVsIC5tYXQtc2VsZWN0Om5vdCgubWF0LXNlbGVjdC1lbXB0eSkgLm1hdC1zZWxlY3QtYXJyb3ctd3JhcHBlcnt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWVtcHR5IC5tYXQtc2VsZWN0LWFycm93LXdyYXBwZXJ7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1lbXB0eSAubWF0LXNlbGVjdC1hcnJvdy13cmFwcGVye3RyYW5zaXRpb246bm9uZX0ubWF0LXNlbGVjdC1hcnJvd3t3aWR0aDowO2hlaWdodDowO2JvcmRlci1sZWZ0OjVweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmlnaHQ6NXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci10b3A6NXB4IHNvbGlkO21hcmdpbjowIDRweH0ubWF0LXNlbGVjdC1wYW5lbC13cmFwe2ZsZXgtYmFzaXM6MTAwJX0ubWF0LXNlbGVjdC1wYW5lbHttaW4td2lkdGg6MTEycHg7bWF4LXdpZHRoOjI4MHB4O292ZXJmbG93OmF1dG87LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7cGFkZGluZy10b3A6MDtwYWRkaW5nLWJvdHRvbTowO21heC1oZWlnaHQ6MjU2cHg7bWluLXdpZHRoOjEwMCU7Ym9yZGVyLXJhZGl1czo0cHg7b3V0bGluZTowfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zZWxlY3QtcGFuZWx7b3V0bGluZTpzb2xpZCAxcHh9Lm1hdC1zZWxlY3QtcGFuZWwgLm1hdC1vcHRncm91cC1sYWJlbCwubWF0LXNlbGVjdC1wYW5lbCAubWF0LW9wdGlvbntmb250LXNpemU6aW5oZXJpdDtsaW5lLWhlaWdodDozZW07aGVpZ2h0OjNlbX0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtc2VsZWN0Om5vdCgubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQpIC5tYXQtZm9ybS1maWVsZC1mbGV4e2N1cnNvcjpwb2ludGVyfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1zZWxlY3QgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3dpZHRoOmNhbGMoMTAwJSAtIDE4cHgpfS5tYXQtc2VsZWN0LXBsYWNlaG9sZGVye3RyYW5zaXRpb246Y29sb3IgNDAwbXMgMTMzLjMzMzMzMzMzMzNtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJ7dHJhbnNpdGlvbjpub25lfS5tYXQtZm9ybS1maWVsZC1oaWRlLXBsYWNlaG9sZGVyIC5tYXQtc2VsZWN0LXBsYWNlaG9sZGVye2NvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtdGV4dC1maWxsLWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246bm9uZTtkaXNwbGF5OmJsb2NrfS5tYXQtc2VsZWN0LW1pbi1saW5lOmVtcHR5OjpiZWZvcmV7Y29udGVudDoiICI7d2hpdGUtc3BhY2U6cHJlO3dpZHRoOjFweDtkaXNwbGF5OmlubGluZS1ibG9jaztvcGFjaXR5OjB9XG4nXSxlbmNhcHN1bGF0aW9uOjIsZGF0YTp7YW5pbWF0aW9uOltDRy50cmFuc2Zvcm1QYW5lbFdyYXAsQ0cudHJhbnNmb3JtUGFuZWxdfSxjaGFuZ2VEZXRlY3Rpb246MH0pLEFHLnByb3BEZWNvcmF0b3JzPXtvcHRpb25zOlt7dHlwZTpZYSxhcmdzOltCSCx7ZGVzY2VuZGFudHM6ITB9XX1dLG9wdGlvbkdyb3Vwczpbe3R5cGU6WWEsYXJnczpbekgse2Rlc2NlbmRhbnRzOiEwfV19XSxjdXN0b21UcmlnZ2VyOlt7dHlwZTpxYSxhcmdzOltER119XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChBRyxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtYXQtc2VsZWN0IixleHBvcnRBczoibWF0U2VsZWN0Iix0ZW1wbGF0ZTonXHgzYyEtLVxuIE5vdGUgdGhhdCB0aGUgc2VsZWN0IHRyaWdnZXIgZWxlbWVudCBzcGVjaWZpZXMgYGFyaWEtb3duc2AgcG9pbnRpbmcgdG8gdGhlIGxpc3Rib3ggb3ZlcmxheS5cbiBXaGlsZSBhcmlhLW93bnMgaXMgbm90IHJlcXVpcmVkIGZvciB0aGUgQVJJQSAxLjIgYHJvbGU9ImNvbWJvYm94ImAgaW50ZXJhY3Rpb24gcGF0dGVybixcbiBpdCBmaXhlcyBhbiBpc3N1ZSB3aXRoIFZvaWNlT3ZlciB3aGVuIHRoZSBzZWxlY3QgYXBwZWFycyBpbnNpZGUgb2YgYW4gYGFyaWEtbW9kZWw9InRydWUiYFxuIGVsZW1lbnQgKGUuZy4gYSBkaWFsb2cpLiBXaXRob3V0IHRoaXMgYGFyaWEtb3duc2AsIHRoZSBgYXJpYS1tb2RhbGAgb24gYSBkaWFsb2cgcHJldmVudHNcbiBWb2ljZU92ZXIgZnJvbSAic2VlaW5nIiB0aGUgc2VsZWN0XCdzIGxpc3Rib3ggb3ZlcmxheSBmb3IgYXJpYS1hY3RpdmVkZXNjZW5kYW50LlxuIFVzaW5nIGBhcmlhLW93bnNgIHJlLXBhcmVudHMgdGhlIHNlbGVjdCBvdmVybGF5IHNvIHRoYXQgaXQgd29ya3MgYWdhaW4uXG4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvaXNzdWVzLzIwNjk0XG4tLVx4M2VcbjxkaXYgY2RrLW92ZXJsYXktb3JpZ2luXG4gICAgIFthdHRyLmFyaWEtb3duc109InBhbmVsT3BlbiA/IGlkICsgXCctcGFuZWxcJyA6IG51bGwiXG4gICAgIGNsYXNzPSJtYXQtc2VsZWN0LXRyaWdnZXIiXG4gICAgIChjbGljayk9InRvZ2dsZSgpIlxuICAgICAjb3JpZ2luPSJjZGtPdmVybGF5T3JpZ2luIlxuICAgICAjdHJpZ2dlcj5cbiAgPGRpdiBjbGFzcz0ibWF0LXNlbGVjdC12YWx1ZSIgW25nU3dpdGNoXT0iZW1wdHkiIFthdHRyLmlkXT0iX3ZhbHVlSWQiPlxuICAgIDxzcGFuIGNsYXNzPSJtYXQtc2VsZWN0LXBsYWNlaG9sZGVyIG1hdC1zZWxlY3QtbWluLWxpbmUiICpuZ1N3aXRjaENhc2U9InRydWUiPnt7cGxhY2Vob2xkZXJ9fTwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz0ibWF0LXNlbGVjdC12YWx1ZS10ZXh0IiAqbmdTd2l0Y2hDYXNlPSJmYWxzZSIgW25nU3dpdGNoXT0iISFjdXN0b21UcmlnZ2VyIj5cbiAgICAgIDxzcGFuIGNsYXNzPSJtYXQtc2VsZWN0LW1pbi1saW5lIiAqbmdTd2l0Y2hEZWZhdWx0Pnt7dHJpZ2dlclZhbHVlfX08L3NwYW4+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9Im1hdC1zZWxlY3QtdHJpZ2dlciIgKm5nU3dpdGNoQ2FzZT0idHJ1ZSI+PC9uZy1jb250ZW50PlxuICAgIDwvc3Bhbj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz0ibWF0LXNlbGVjdC1hcnJvdy13cmFwcGVyIj48ZGl2IGNsYXNzPSJtYXQtc2VsZWN0LWFycm93Ij48L2Rpdj48L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGVcbiAgY2RrLWNvbm5lY3RlZC1vdmVybGF5XG4gIGNka0Nvbm5lY3RlZE92ZXJsYXlMb2NrUG9zaXRpb25cbiAgY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wXG4gIGNka0Nvbm5lY3RlZE92ZXJsYXlCYWNrZHJvcENsYXNzPSJjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCJcbiAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlQYW5lbENsYXNzXT0iX292ZXJsYXlQYW5lbENsYXNzIlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheVNjcm9sbFN0cmF0ZWd5XT0iX3Njcm9sbFN0cmF0ZWd5IlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbl09Im9yaWdpbiJcbiAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT0icGFuZWxPcGVuIlxuICBbY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uc109Il9wb3NpdGlvbnMiXG4gIFtjZGtDb25uZWN0ZWRPdmVybGF5TWluV2lkdGhdPSJfdHJpZ2dlclJlY3Q/LndpZHRoISJcbiAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPZmZzZXRZXT0iX29mZnNldFkiXG4gIChiYWNrZHJvcENsaWNrKT0iY2xvc2UoKSJcbiAgKGF0dGFjaCk9Il9vbkF0dGFjaGVkKCkiXG4gIChkZXRhY2gpPSJjbG9zZSgpIj5cbiAgPGRpdiBjbGFzcz0ibWF0LXNlbGVjdC1wYW5lbC13cmFwIiBbQHRyYW5zZm9ybVBhbmVsV3JhcF0+XG4gICAgPGRpdlxuICAgICAgI3BhbmVsXG4gICAgICByb2xlPSJsaXN0Ym94IlxuICAgICAgdGFiaW5kZXg9Ii0xIlxuICAgICAgY2xhc3M9Im1hdC1zZWxlY3QtcGFuZWwge3sgX2dldFBhbmVsVGhlbWUoKSB9fSJcbiAgICAgIFthdHRyLmlkXT0iaWQgKyBcJy1wYW5lbFwnIlxuICAgICAgW2F0dHIuYXJpYS1tdWx0aXNlbGVjdGFibGVdPSJtdWx0aXBsZSJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPSJhcmlhTGFiZWwgfHwgbnVsbCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09Il9nZXRQYW5lbEFyaWFMYWJlbGxlZGJ5KCkiXG4gICAgICBbbmdDbGFzc109InBhbmVsQ2xhc3MiXG4gICAgICBbQHRyYW5zZm9ybVBhbmVsXT0ibXVsdGlwbGUgPyBcJ3Nob3dpbmctbXVsdGlwbGVcJyA6IFwnc2hvd2luZ1wnIlxuICAgICAgKEB0cmFuc2Zvcm1QYW5lbC5kb25lKT0iX3BhbmVsRG9uZUFuaW1hdGluZ1N0cmVhbS5uZXh0KCRldmVudC50b1N0YXRlKSJcbiAgICAgIFtzdHlsZS50cmFuc2Zvcm1PcmlnaW5dPSJfdHJhbnNmb3JtT3JpZ2luIlxuICAgICAgW3N0eWxlLmZvbnQtc2l6ZS5weF09Il90cmlnZ2VyRm9udFNpemUiXG4gICAgICAoa2V5ZG93bik9Il9oYW5kbGVLZXlkb3duKCRldmVudCkiPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4nLGlucHV0czpbImRpc2FibGVkIiwiZGlzYWJsZVJpcHBsZSIsInRhYkluZGV4Il0sZW5jYXBzdWxhdGlvbjpIbi5Ob25lLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2gsaG9zdDp7cm9sZToiY29tYm9ib3giLCJhcmlhLWF1dG9jb21wbGV0ZSI6Im5vbmUiLCJhcmlhLWhhc3BvcHVwIjoidHJ1ZSIsY2xhc3M6Im1hdC1zZWxlY3QiLCJbYXR0ci5pZF0iOiJpZCIsIlthdHRyLnRhYmluZGV4XSI6InRhYkluZGV4IiwiW2F0dHIuYXJpYS1jb250cm9sc10iOidwYW5lbE9wZW4gPyBpZCArICItcGFuZWwiIDogbnVsbCcsIlthdHRyLmFyaWEtZXhwYW5kZWRdIjoicGFuZWxPcGVuIiwiW2F0dHIuYXJpYS1sYWJlbF0iOiJhcmlhTGFiZWwgfHwgbnVsbCIsIlthdHRyLmFyaWEtcmVxdWlyZWRdIjoicmVxdWlyZWQudG9TdHJpbmcoKSIsIlthdHRyLmFyaWEtZGlzYWJsZWRdIjoiZGlzYWJsZWQudG9TdHJpbmcoKSIsIlthdHRyLmFyaWEtaW52YWxpZF0iOiJlcnJvclN0YXRlIiwiW2F0dHIuYXJpYS1kZXNjcmliZWRieV0iOiJfYXJpYURlc2NyaWJlZGJ5IHx8IG51bGwiLCJbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdIjoiX2dldEFyaWFBY3RpdmVEZXNjZW5kYW50KCkiLCJbY2xhc3MubWF0LXNlbGVjdC1kaXNhYmxlZF0iOiJkaXNhYmxlZCIsIltjbGFzcy5tYXQtc2VsZWN0LWludmFsaWRdIjoiZXJyb3JTdGF0ZSIsIltjbGFzcy5tYXQtc2VsZWN0LXJlcXVpcmVkXSI6InJlcXVpcmVkIiwiW2NsYXNzLm1hdC1zZWxlY3QtZW1wdHldIjoiZW1wdHkiLCJbY2xhc3MubWF0LXNlbGVjdC1tdWx0aXBsZV0iOiJtdWx0aXBsZSIsIihrZXlkb3duKSI6Il9oYW5kbGVLZXlkb3duKCRldmVudCkiLCIoZm9jdXMpIjoiX29uRm9jdXMoKSIsIihibHVyKSI6Il9vbkJsdXIoKSJ9LGFuaW1hdGlvbnM6W0NHLnRyYW5zZm9ybVBhbmVsV3JhcCxDRy50cmFuc2Zvcm1QYW5lbF0scHJvdmlkZXJzOlt7cHJvdmlkZTpiVix1c2VFeGlzdGluZzpBR30se3Byb3ZpZGU6UkgsdXNlRXhpc3Rpbmc6QUd9XSxzdHlsZXM6WycubWF0LXNlbGVjdHtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxMDAlO291dGxpbmU6bm9uZX0ubWF0LXNlbGVjdC10cmlnZ2Vye2Rpc3BsYXk6aW5saW5lLXRhYmxlO2N1cnNvcjpwb2ludGVyO3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LXNlbGVjdC1kaXNhYmxlZCAubWF0LXNlbGVjdC10cmlnZ2Vyey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6ZGVmYXVsdH0ubWF0LXNlbGVjdC12YWx1ZXtkaXNwbGF5OnRhYmxlLWNlbGw7bWF4LXdpZHRoOjA7d2lkdGg6MTAwJTtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9Lm1hdC1zZWxlY3QtdmFsdWUtdGV4dHt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9Lm1hdC1zZWxlY3QtYXJyb3ctd3JhcHBlcntkaXNwbGF5OnRhYmxlLWNlbGw7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1zZWxlY3QtYXJyb3ctd3JhcHBlcnt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtc2VsZWN0LWFycm93LXdyYXBwZXJ7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTI1JSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtaGFzLWxhYmVsIC5tYXQtc2VsZWN0Om5vdCgubWF0LXNlbGVjdC1lbXB0eSkgLm1hdC1zZWxlY3QtYXJyb3ctd3JhcHBlcnt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWVtcHR5IC5tYXQtc2VsZWN0LWFycm93LXdyYXBwZXJ7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1lbXB0eSAubWF0LXNlbGVjdC1hcnJvdy13cmFwcGVye3RyYW5zaXRpb246bm9uZX0ubWF0LXNlbGVjdC1hcnJvd3t3aWR0aDowO2hlaWdodDowO2JvcmRlci1sZWZ0OjVweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmlnaHQ6NXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci10b3A6NXB4IHNvbGlkO21hcmdpbjowIDRweH0ubWF0LXNlbGVjdC1wYW5lbC13cmFwe2ZsZXgtYmFzaXM6MTAwJX0ubWF0LXNlbGVjdC1wYW5lbHttaW4td2lkdGg6MTEycHg7bWF4LXdpZHRoOjI4MHB4O292ZXJmbG93OmF1dG87LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7cGFkZGluZy10b3A6MDtwYWRkaW5nLWJvdHRvbTowO21heC1oZWlnaHQ6MjU2cHg7bWluLXdpZHRoOjEwMCU7Ym9yZGVyLXJhZGl1czo0cHg7b3V0bGluZTowfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zZWxlY3QtcGFuZWx7b3V0bGluZTpzb2xpZCAxcHh9Lm1hdC1zZWxlY3QtcGFuZWwgLm1hdC1vcHRncm91cC1sYWJlbCwubWF0LXNlbGVjdC1wYW5lbCAubWF0LW9wdGlvbntmb250LXNpemU6aW5oZXJpdDtsaW5lLWhlaWdodDozZW07aGVpZ2h0OjNlbX0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtc2VsZWN0Om5vdCgubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQpIC5tYXQtZm9ybS1maWVsZC1mbGV4e2N1cnNvcjpwb2ludGVyfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1zZWxlY3QgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3dpZHRoOmNhbGMoMTAwJSAtIDE4cHgpfS5tYXQtc2VsZWN0LXBsYWNlaG9sZGVye3RyYW5zaXRpb246Y29sb3IgNDAwbXMgMTMzLjMzMzMzMzMzMzNtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJ7dHJhbnNpdGlvbjpub25lfS5tYXQtZm9ybS1maWVsZC1oaWRlLXBsYWNlaG9sZGVyIC5tYXQtc2VsZWN0LXBsYWNlaG9sZGVye2NvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtdGV4dC1maWxsLWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246bm9uZTtkaXNwbGF5OmJsb2NrfS5tYXQtc2VsZWN0LW1pbi1saW5lOmVtcHR5OjpiZWZvcmV7Y29udGVudDoiICI7d2hpdGUtc3BhY2U6cHJlO3dpZHRoOjFweDtkaXNwbGF5OmlubGluZS1ibG9jaztvcGFjaXR5OjB9XG4nXX1dfV0sbnVsbCx7b3B0aW9uczpbe3R5cGU6WWEsYXJnczpbQkgse2Rlc2NlbmRhbnRzOiEwfV19XSxvcHRpb25Hcm91cHM6W3t0eXBlOllhLGFyZ3M6W3pILHtkZXNjZW5kYW50czohMH1dfV0sY3VzdG9tVHJpZ2dlcjpbe3R5cGU6cWEsYXJnczpbREddfV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIFRHe31mdW5jdGlvbiBORyh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsInNwYW4iLDUpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUobil7aGkodCk7Y29uc3Qgbz1ZbSgpLiRpbXBsaWNpdDtyZXR1cm4gWW0oKS5vbkFjdGl2ZVBsdWdpblNlbGVjdGlvbihuLG8uaWQpfSkpLGt1KDEpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKCkuJGltcGxpY2l0O2pwKCJkYXRhLXBsdWdpbi1pZCIsdC5pZCkscmMoMSksRHUoIiAiLHQudGFiX25hbWUsIiAiKX19ZnVuY3Rpb24gekcodCxlKXsxJnQmJihSbSgwLCJtYXQtdGFiIiwzKSxRcCgxLE5HLDIsMiwibmctdGVtcGxhdGUiLDQpLEFtKCkpLDImdCYmRG0oImRpc2FibGVkIiwhZS4kaW1wbGljaXQuZW5hYmxlZCl9ZnVuY3Rpb24gSUcodCxlKXtpZigxJnQmJihSbSgwLCJtYXQtb3B0aW9uIiw5KSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQ7RG0oInZhbHVlIix0LmlkKSxqcCgiZGF0YS1wbHVnaW4taWQiLHQuaWQpLHJjKDEpLER1KCIgIix0LnRhYl9uYW1lLCIgIil9fWZ1bmN0aW9uIEhHKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwibWF0LWZvcm0tZmllbGQiLDYpLFJtKDEsIm1hdC1sYWJlbCIpLGt1KDIsIkluYWN0aXZlIiksQW0oKSxSbSgzLCJtYXQtc2VsZWN0Iiw3KSxWbSgic2VsZWN0aW9uQ2hhbmdlIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oKS5vbkRpc2FibGVkUGx1Z2luU2VsZWN0aW9uQ2hhbmdlZChuKX0pKSxRcCg0LElHLDIsMywibWF0LW9wdGlvbiIsOCksQW0oKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgpO3JjKDMpLERtKCJ2YWx1ZSIsdC5zZWxlY3RlZFBsdWdpbikscmMoMSksRG0oIm5nRm9yT2YiLHQuZGlzYWJsZWRQbHVnaW5zKX19VEcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFRHKX0sVEcuybVtb2Q9YW8oe3R5cGU6VEd9KSxURy7JtWluaj12bih7cHJvdmlkZXJzOltQR10saW1wb3J0czpbW1dNLHlMLFVILFhJXSx5RixUVixVSCxYSV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFRHLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbV00seUwsVUgsWEldLGV4cG9ydHM6W3lGLFRWLEFHLEVHLFVILFhJXSxkZWNsYXJhdGlvbnM6W0FHLEVHXSxwcm92aWRlcnM6W1BHXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFRHLHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bQUcsRUddfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1dNLHlMLFVILFhJXX0sZXhwb3J0czpmdW5jdGlvbigpe3JldHVyblt5RixUVixBRyxFRyxVSCxYSV19fSk7Y2xhc3MgRkd7Y29uc3RydWN0b3IoKXt0aGlzLm9uUGx1Z2luU2VsZWN0aW9uQ2hhbmdlZD1uZXcgTGh9Z2V0QWN0aXZlUGx1Z2luSW5kZXgoKXtyZXR1cm4gdGhpcy5hY3RpdmVQbHVnaW5zLmZpbmRJbmRleCgoKHtpZDp0fSk9PnQ9PT10aGlzLnNlbGVjdGVkUGx1Z2luKSl9b25BY3RpdmVQbHVnaW5TZWxlY3Rpb24odCxlKXt0LnN0b3BQcm9wYWdhdGlvbigpLHRoaXMub25QbHVnaW5TZWxlY3Rpb25DaGFuZ2VkLmVtaXQoZSl9b25EaXNhYmxlZFBsdWdpblNlbGVjdGlvbkNoYW5nZWQodCl7dGhpcy5vblBsdWdpblNlbGVjdGlvbkNoYW5nZWQuZW1pdCh0LnZhbHVlKX19RkcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEZHKX0sRkcuybVjbXA9dG8oe3R5cGU6Rkcsc2VsZWN0b3JzOltbInBsdWdpbi1zZWxlY3Rvci1jb21wb25lbnQiXV0saW5wdXRzOnthY3RpdmVQbHVnaW5zOiJhY3RpdmVQbHVnaW5zIixkaXNhYmxlZFBsdWdpbnM6ImRpc2FibGVkUGx1Z2lucyIsc2VsZWN0ZWRQbHVnaW46InNlbGVjdGVkUGx1Z2luIn0sb3V0cHV0czp7b25QbHVnaW5TZWxlY3Rpb25DaGFuZ2VkOiJvblBsdWdpblNlbGVjdGlvbkNoYW5nZWQifSxkZWNsczozLHZhcnM6Myxjb25zdHM6W1siYW5pbWF0aW9uRHVyYXRpb24iLCIxMDBtcyIsMSwiYWN0aXZlLXBsdWdpbi1saXN0IiwzLCJzZWxlY3RlZEluZGV4Il0sWzMsImRpc2FibGVkIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbImZsb2F0TGFiZWwiLCJuZXZlciIsNCwibmdJZiJdLFszLCJkaXNhYmxlZCJdLFsibWF0LXRhYi1sYWJlbCIsIiJdLFsxLCJwbHVnaW4tbmFtZSIsMywiY2xpY2siXSxbImZsb2F0TGFiZWwiLCJuZXZlciJdLFszLCJ2YWx1ZSIsInNlbGVjdGlvbkNoYW5nZSJdLFszLCJ2YWx1ZSIsNCwibmdGb3IiLCJuZ0Zvck9mIl0sWzMsInZhbHVlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJtYXQtdGFiLWdyb3VwIiwwKSxRcCgxLHpHLDIsMSwibWF0LXRhYiIsMSksQW0oKSxRcCgyLEhHLDUsMiwibWF0LWZvcm0tZmllbGQiLDIpKSwyJmUmJihEbSgic2VsZWN0ZWRJbmRleCIsbi5nZXRBY3RpdmVQbHVnaW5JbmRleCgpKSxyYygxKSxEbSgibmdGb3JPZiIsbi5hY3RpdmVQbHVnaW5zKSxyYygxKSxEbSgibmdJZiIsbi5kaXNhYmxlZFBsdWdpbnMubGVuZ3RoPjApKX0sZGlyZWN0aXZlczpbRkIsbE0sZE0sU0IsUEIsQVYsdlYsQUcsQkhdLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtmbGV4OjEgMSBhdXRvO2ZvbnQtc2l6ZToxNHB4O2hlaWdodDoxMDAlO292ZXJmbG93OmhpZGRlbn1tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17ZmxleDowIDA7bWFyZ2luLXRvcDo1cHg7d2lkdGg6MTMwcHh9bWF0LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV0sIG1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjUwMDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9LmFjdGl2ZS1wbHVnaW4tbGlzdFtfbmdjb250ZW50LSVDT01QJV17YWxpZ24tc2VsZjpzdHJldGNoO2ZsZXg6MSAxIGF1dG87b3ZlcmZsb3c6aGlkZGVufS5wbHVnaW4tbmFtZVtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWZsZXg7aGVpZ2h0OjEwMCU7anVzdGlmeS1jb250ZW50OmNlbnRlcjtwYWRkaW5nOjAgMTJweDt3aWR0aDoxMDAlfVtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QubWF0LXByaW1hcnkgLm1hdC10YWItbGlzdCAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9W19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCAubWF0LXRhYi1sYWJlbCwgW19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCAubWF0LXRhYi1saW5re2NvbG9yOmluaGVyaXQ7b3BhY2l0eTouN31bX25naG9zdC0lQ09NUCVdICAgICAuYWN0aXZlLXBsdWdpbi1saXN0IC5tYXQtdGFiLWxhYmVsLm1hdC10YWItbGFiZWwtYWN0aXZlLCBbX25naG9zdC0lQ09NUCVdICAgICAuYWN0aXZlLXBsdWdpbi1saXN0IC5tYXQtdGFiLWxpbmsubWF0LXRhYi1sYWJlbC1hY3RpdmV7b3BhY2l0eToxfVtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6Y3VycmVudENvbG9yfVtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWR7dmlzaWJpbGl0eTpoaWRkZW59W19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCAubWF0LXRhYi1kaXNhYmxlZHtkaXNwbGF5Om5vbmV9W19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCBtYXQtdGFiLWxpc3QsIFtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgLm1hdC10YWItaGVhZGVyLCBbX25naG9zdC0lQ09NUCVdICAgICAuYWN0aXZlLXBsdWdpbi1saXN0IC5tYXQtdGFiLWxhYmVscywgW19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCAubWF0LXRhYi1sYWJlbHtoZWlnaHQ6MTAwJX1bX25naG9zdC0lQ09NUCVdICAgICAuYWN0aXZlLXBsdWdpbi1saXN0IC5tYXQtdGFiLWxhYmVse21pbi13aWR0aDo0OHB4O3BhZGRpbmc6MDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9W19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCAubWF0LXRhYi1sYWJlbC1jb250ZW50e2hlaWdodDoxMDAlfVtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgbWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGlzdHtwYWRkaW5nOjAgMzZweH1bX25naG9zdC0lQ09NUCVdICAgICAuYWN0aXZlLXBsdWdpbi1saXN0IG1hdC10YWItaGVhZGVyPjpmaXJzdC1jaGlsZCwgW19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCBtYXQtdGFiLWhlYWRlcj4ubWF0LXRhYi1sYWJlbC1jb250YWluZXIsIFtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgbWF0LXRhYi1oZWFkZXI+Omxhc3QtY2hpbGR7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjB9W19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCBtYXQtdGFiLWhlYWRlcj46Zmlyc3QtY2hpbGQsIFtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgbWF0LXRhYi1oZWFkZXI+Lm1hdC10YWItbGFiZWwtY29udGFpbmVye2xlZnQ6MH1bX25naG9zdC0lQ09NUCVdICAgICAuYWN0aXZlLXBsdWdpbi1saXN0IG1hdC10YWItaGVhZGVyPjpsYXN0LWNoaWxkLCBbX25naG9zdC0lQ09NUCVdICAgICAuYWN0aXZlLXBsdWdpbi1saXN0IG1hdC10YWItaGVhZGVyPi5tYXQtdGFiLWxhYmVsLWNvbnRhaW5lcntyaWdodDowfVtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgbWF0LXRhYi1oZWFkZXI+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfWJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCBtYXQtdGFiLWhlYWRlcj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbntiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9J119KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEZHLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InBsdWdpbi1zZWxlY3Rvci1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiIuL3BsdWdpbl9zZWxlY3Rvcl9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9wbHVnaW5fc2VsZWN0b3JfY29tcG9uZW50LmNzcyJdfV19XSxudWxsLHthY3RpdmVQbHVnaW5zOlt7dHlwZTp4eX1dLGRpc2FibGVkUGx1Z2luczpbe3R5cGU6eHl9XSxzZWxlY3RlZFBsdWdpbjpbe3R5cGU6eHl9XSxvblBsdWdpblNlbGVjdGlvbkNoYW5nZWQ6W3t0eXBlOk95fV19KTtjb25zdCBMRz1adyh2UiwodD0+T2JqZWN0LmtleXModCkubWFwKChlPT5PYmplY3QuYXNzaWduKHt9LHtpZDplfSx0W2VdKSkpKSksQkc9WncoTEcsKHQ9PnQuZmlsdGVyKCh0PT4hdC5lbmFibGVkKSkpKTtjbGFzcyBWR3tjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5hY3RpdmVQbHVnaW4kPXRoaXMuc3RvcmUucGlwZShGdyhNUikpLHRoaXMucGx1Z2lucyQ9dGhpcy5zdG9yZS5waXBlKEZ3KExHKSksdGhpcy5kaXNhYmxlZFBsdWdpbnMkPXRoaXMuc3RvcmUucGlwZShGdyhCRykpfW9uUGx1Z2luU2VsZWN0aW9uQ2hhbmdlKHQpe3RoaXMuc3RvcmUuZGlzcGF0Y2goX0Uoe3BsdWdpbjp0fSkpfX1mdW5jdGlvbiBqRyh0LGUpe31WRy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VkcpKFNtKEl3KSl9LFZHLsm1Y21wPXRvKHt0eXBlOlZHLHNlbGVjdG9yczpbWyJwbHVnaW4tc2VsZWN0b3IiXV0sZGVjbHM6NCx2YXJzOjksY29uc3RzOltbMywiYWN0aXZlUGx1Z2lucyIsImRpc2FibGVkUGx1Z2lucyIsInNlbGVjdGVkUGx1Z2luIiwib25QbHVnaW5TZWxlY3Rpb25DaGFuZ2VkIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJwbHVnaW4tc2VsZWN0b3ItY29tcG9uZW50IiwwKSxWbSgib25QbHVnaW5TZWxlY3Rpb25DaGFuZ2VkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblBsdWdpblNlbGVjdGlvbkNoYW5nZShlKX0pKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQWgoMywiYXN5bmMiKSxBbSgpKSwyJmUmJkRtKCJhY3RpdmVQbHVnaW5zIixUaCgxLDMsbi5wbHVnaW5zJCkpKCJkaXNhYmxlZFBsdWdpbnMiLFRoKDIsNSxuLmRpc2FibGVkUGx1Z2lucyQpKSgic2VsZWN0ZWRQbHVnaW4iLFRoKDMsNyxuLmFjdGl2ZVBsdWdpbiQpKX0sZGlyZWN0aXZlczpbRkddLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChWRyxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJwbHVnaW4tc2VsZWN0b3IiLHRlbXBsYXRlOidcbiAgICA8cGx1Z2luLXNlbGVjdG9yLWNvbXBvbmVudFxuICAgICAgW2FjdGl2ZVBsdWdpbnNdPSJwbHVnaW5zJCB8IGFzeW5jIlxuICAgICAgW2Rpc2FibGVkUGx1Z2luc109ImRpc2FibGVkUGx1Z2lucyQgfCBhc3luYyJcbiAgICAgIFtzZWxlY3RlZFBsdWdpbl09ImFjdGl2ZVBsdWdpbiQgfCBhc3luYyJcbiAgICAgIChvblBsdWdpblNlbGVjdGlvbkNoYW5nZWQpPSJvblBsdWdpblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpIlxuICAgID48L3BsdWdpbi1zZWxlY3Rvci1jb21wb25lbnQ+XG4gICd9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y2xhc3MgVUd7Y29uc3RydWN0b3IoKXt0aGlzLnJvbGU9ImRpYWxvZyIsdGhpcy5wYW5lbENsYXNzPSIiLHRoaXMuaGFzQmFja2Ryb3A9ITAsdGhpcy5iYWNrZHJvcENsYXNzPSIiLHRoaXMuZGlzYWJsZUNsb3NlPSExLHRoaXMud2lkdGg9IiIsdGhpcy5oZWlnaHQ9IiIsdGhpcy5tYXhXaWR0aD0iODB2dyIsdGhpcy5kYXRhPW51bGwsdGhpcy5hcmlhRGVzY3JpYmVkQnk9bnVsbCx0aGlzLmFyaWFMYWJlbGxlZEJ5PW51bGwsdGhpcy5hcmlhTGFiZWw9bnVsbCx0aGlzLmF1dG9Gb2N1cz0hMCx0aGlzLnJlc3RvcmVGb2N1cz0hMCx0aGlzLmNsb3NlT25OYXZpZ2F0aW9uPSEwfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY29uc3QgR0c9e2RpYWxvZ0NvbnRhaW5lcjpueCgiZGlhbG9nQ29udGFpbmVyIixbcngoInZvaWQsIGV4aXQiLGF4KHtvcGFjaXR5OjAsdHJhbnNmb3JtOiJzY2FsZSgwLjcpIn0pKSxyeCgiZW50ZXIiLGF4KHt0cmFuc2Zvcm06Im5vbmUifSkpLGx4KCIqID0+IGVudGVyIixveCgiMTUwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSkiLGF4KHt0cmFuc2Zvcm06Im5vbmUiLG9wYWNpdHk6MX0pKSksbHgoIiogPT4gdm9pZCwgKiA9PiBleGl0IixveCgiNzVtcyBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSkiLGF4KHtvcGFjaXR5OjB9KSkpXSl9OwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBXRygpe3Rocm93IEVycm9yKCJBdHRlbXB0aW5nIHRvIGF0dGFjaCBkaWFsb2cgY29udGVudCBhZnRlciBjb250ZW50IGlzIGFscmVhZHkgYXR0YWNoZWQiKX1jbGFzcyBZRyBleHRlbmRzIFBGe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhKXtzdXBlcigpLHRoaXMuX2VsZW1lbnRSZWY9dCx0aGlzLl9mb2N1c1RyYXBGYWN0b3J5PWUsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWY9bix0aGlzLl9jb25maWc9aSx0aGlzLl9mb2N1c01vbml0b3I9YSx0aGlzLl9hbmltYXRpb25TdGF0ZUNoYW5nZWQ9bmV3IExoLHRoaXMuX2VsZW1lbnRGb2N1c2VkQmVmb3JlRGlhbG9nV2FzT3BlbmVkPW51bGwsdGhpcy5fY2xvc2VJbnRlcmFjdGlvblR5cGU9bnVsbCx0aGlzLmF0dGFjaERvbVBvcnRhbD10PT4odGhpcy5fcG9ydGFsT3V0bGV0Lmhhc0F0dGFjaGVkKCkmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmV0coKSx0aGlzLl9wb3J0YWxPdXRsZXQuYXR0YWNoRG9tUG9ydGFsKHQpKSx0aGlzLl9hcmlhTGFiZWxsZWRCeT1pLmFyaWFMYWJlbGxlZEJ5fHxudWxsLHRoaXMuX2RvY3VtZW50PW99X2luaXRpYWxpemVXaXRoQXR0YWNoZWRDb250ZW50KCl7dGhpcy5fc2V0dXBGb2N1c1RyYXAoKSx0aGlzLl9jYXB0dXJlUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KCksdGhpcy5fZm9jdXNEaWFsb2dDb250YWluZXIoKX1hdHRhY2hDb21wb25lbnRQb3J0YWwodCl7cmV0dXJuIHRoaXMuX3BvcnRhbE91dGxldC5oYXNBdHRhY2hlZCgpJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJldHKCksdGhpcy5fcG9ydGFsT3V0bGV0LmF0dGFjaENvbXBvbmVudFBvcnRhbCh0KX1hdHRhY2hUZW1wbGF0ZVBvcnRhbCh0KXtyZXR1cm4gdGhpcy5fcG9ydGFsT3V0bGV0Lmhhc0F0dGFjaGVkKCkmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmV0coKSx0aGlzLl9wb3J0YWxPdXRsZXQuYXR0YWNoVGVtcGxhdGVQb3J0YWwodCl9X3JlY2FwdHVyZUZvY3VzKCl7dGhpcy5fY29udGFpbnNGb2N1cygpfHwoIXRoaXMuX2NvbmZpZy5hdXRvRm9jdXN8fCF0aGlzLl9mb2N1c1RyYXAuZm9jdXNJbml0aWFsRWxlbWVudCgpKSYmdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCl9X3RyYXBGb2N1cygpe3RoaXMuX2NvbmZpZy5hdXRvRm9jdXM/dGhpcy5fZm9jdXNUcmFwLmZvY3VzSW5pdGlhbEVsZW1lbnRXaGVuUmVhZHkoKTp0aGlzLl9jb250YWluc0ZvY3VzKCl8fHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpfV9yZXN0b3JlRm9jdXMoKXtjb25zdCB0PXRoaXMuX2VsZW1lbnRGb2N1c2VkQmVmb3JlRGlhbG9nV2FzT3BlbmVkO2lmKHRoaXMuX2NvbmZpZy5yZXN0b3JlRm9jdXMmJnQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LmZvY3VzKXtjb25zdCBlPUZ6KCksbj10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7ZSYmZSE9PXRoaXMuX2RvY3VtZW50LmJvZHkmJmUhPT1uJiYhbi5jb250YWlucyhlKXx8KHRoaXMuX2ZvY3VzTW9uaXRvcj8odGhpcy5fZm9jdXNNb25pdG9yLmZvY3VzVmlhKHQsdGhpcy5fY2xvc2VJbnRlcmFjdGlvblR5cGUpLHRoaXMuX2Nsb3NlSW50ZXJhY3Rpb25UeXBlPW51bGwpOnQuZm9jdXMoKSl9dGhpcy5fZm9jdXNUcmFwJiZ0aGlzLl9mb2N1c1RyYXAuZGVzdHJveSgpfV9zZXR1cEZvY3VzVHJhcCgpe3RoaXMuX2ZvY3VzVHJhcD10aGlzLl9mb2N1c1RyYXBGYWN0b3J5LmNyZWF0ZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpfV9jYXB0dXJlUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KCl7dGhpcy5fZG9jdW1lbnQmJih0aGlzLl9lbGVtZW50Rm9jdXNlZEJlZm9yZURpYWxvZ1dhc09wZW5lZD1GeigpKX1fZm9jdXNEaWFsb2dDb250YWluZXIoKXt0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMmJnRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpfV9jb250YWluc0ZvY3VzKCl7Y29uc3QgdD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsZT1GeigpO3JldHVybiB0PT09ZXx8dC5jb250YWlucyhlKX19WUcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFlHKShTbShoZyksU20ockkpLFNtKFVnKSxTbShaXyw4KSxTbShVRyksU20oU0kpKX0sWUcuybVkaXI9bG8oe3R5cGU6WUcsdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJlFoKERGLDcpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uX3BvcnRhbE91dGxldD10LmZpcnN0KX19LGZlYXR1cmVzOlt4cF19KSxZRy5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpySX0se3R5cGU6VWd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOlVHfSx7dHlwZTpTSX1dLFlHLnByb3BEZWNvcmF0b3JzPXtfcG9ydGFsT3V0bGV0Olt7dHlwZTpaYSxhcmdzOltERix7c3RhdGljOiEwfV19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChZRyxbe3R5cGU6Q3l9XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOnJJfSx7dHlwZTpVZ30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6VUd9LHt0eXBlOlNJfV19KSx7X3BvcnRhbE91dGxldDpbe3R5cGU6WmEsYXJnczpbREYse3N0YXRpYzohMH1dfV19KTtjbGFzcyBxRyBleHRlbmRzIFlHe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9zdGF0ZT0iZW50ZXIifV9vbkFuaW1hdGlvbkRvbmUoe3RvU3RhdGU6dCx0b3RhbFRpbWU6ZX0peyJlbnRlciI9PT10Pyh0aGlzLl90cmFwRm9jdXMoKSx0aGlzLl9hbmltYXRpb25TdGF0ZUNoYW5nZWQubmV4dCh7c3RhdGU6Im9wZW5lZCIsdG90YWxUaW1lOmV9KSk6ImV4aXQiPT09dCYmKHRoaXMuX3Jlc3RvcmVGb2N1cygpLHRoaXMuX2FuaW1hdGlvblN0YXRlQ2hhbmdlZC5uZXh0KHtzdGF0ZToiY2xvc2VkIix0b3RhbFRpbWU6ZX0pKX1fb25BbmltYXRpb25TdGFydCh7dG9TdGF0ZTp0LHRvdGFsVGltZTplfSl7ImVudGVyIj09PXQ/dGhpcy5fYW5pbWF0aW9uU3RhdGVDaGFuZ2VkLm5leHQoe3N0YXRlOiJvcGVuaW5nIix0b3RhbFRpbWU6ZX0pOiJleGl0IiE9PXQmJiJ2b2lkIiE9PXR8fHRoaXMuX2FuaW1hdGlvblN0YXRlQ2hhbmdlZC5uZXh0KHtzdGF0ZToiY2xvc2luZyIsdG90YWxUaW1lOmV9KX1fc3RhcnRFeGl0QW5pbWF0aW9uKCl7dGhpcy5fc3RhdGU9ImV4aXQiLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfX1xRy7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEocUcpKSkobnx8cUcpfX0pKCkscUcuybVjbXA9dG8oe3R5cGU6cUcsc2VsZWN0b3JzOltbIm1hdC1kaWFsb2ctY29udGFpbmVyIl1dLGhvc3RBdHRyczpbInRhYmluZGV4IiwiLTEiLCJhcmlhLW1vZGFsIiwidHJ1ZSIsMSwibWF0LWRpYWxvZy1jb250YWluZXIiXSxob3N0VmFyczo2LGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZqbSgiQGRpYWxvZ0NvbnRhaW5lci5zdGFydCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX29uQW5pbWF0aW9uU3RhcnQoZSl9KSkoIkBkaWFsb2dDb250YWluZXIuZG9uZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX29uQW5pbWF0aW9uRG9uZShlKX0pKSwyJmUmJihUdSgiaWQiLG4uX2lkKSxqcCgicm9sZSIsbi5fY29uZmlnLnJvbGUpKCJhcmlhLWxhYmVsbGVkYnkiLG4uX2NvbmZpZy5hcmlhTGFiZWw/bnVsbDpuLl9hcmlhTGFiZWxsZWRCeSkoImFyaWEtbGFiZWwiLG4uX2NvbmZpZy5hcmlhTGFiZWwpKCJhcmlhLWRlc2NyaWJlZGJ5IixuLl9jb25maWcuYXJpYURlc2NyaWJlZEJ5fHxudWxsKSxOdSgiQGRpYWxvZ0NvbnRhaW5lciIsbi5fc3RhdGUpKX0sZmVhdHVyZXM6W3hwXSxkZWNsczoxLHZhcnM6MCxjb25zdHM6W1siY2RrUG9ydGFsT3V0bGV0IiwiIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJlFwKDAsakcsMCwwLCJuZy10ZW1wbGF0ZSIsMCl9LGRpcmVjdGl2ZXM6W0RGXSxzdHlsZXM6WyIubWF0LWRpYWxvZy1jb250YWluZXJ7ZGlzcGxheTpibG9jaztwYWRkaW5nOjI0cHg7Ym9yZGVyLXJhZGl1czo0cHg7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OmF1dG87b3V0bGluZTowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7bWluLWhlaWdodDppbmhlcml0O21heC1oZWlnaHQ6aW5oZXJpdH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZGlhbG9nLWNvbnRhaW5lcntvdXRsaW5lOnNvbGlkIDFweH0ubWF0LWRpYWxvZy1jb250ZW50e2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjAgLTI0cHg7cGFkZGluZzowIDI0cHg7bWF4LWhlaWdodDo2NXZoO292ZXJmbG93OmF1dG87LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2h9Lm1hdC1kaWFsb2ctdGl0bGV7bWFyZ2luOjAgMCAyMHB4O2Rpc3BsYXk6YmxvY2t9Lm1hdC1kaWFsb2ctYWN0aW9uc3twYWRkaW5nOjhweCAwO2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDttaW4taGVpZ2h0OjUycHg7YWxpZ24taXRlbXM6Y2VudGVyO2JveC1zaXppbmc6Y29udGVudC1ib3g7bWFyZ2luLWJvdHRvbTotMjRweH0ubWF0LWRpYWxvZy1hY3Rpb25zW2FsaWduPWVuZF17anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5tYXQtZGlhbG9nLWFjdGlvbnNbYWxpZ249Y2VudGVyXXtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5tYXQtZGlhbG9nLWFjdGlvbnMgLm1hdC1idXR0b24tYmFzZSsubWF0LWJ1dHRvbi1iYXNlLC5tYXQtZGlhbG9nLWFjdGlvbnMgLm1hdC1tZGMtYnV0dG9uLWJhc2UrLm1hdC1tZGMtYnV0dG9uLWJhc2V7bWFyZ2luLWxlZnQ6OHB4fVtkaXI9cnRsXSAubWF0LWRpYWxvZy1hY3Rpb25zIC5tYXQtYnV0dG9uLWJhc2UrLm1hdC1idXR0b24tYmFzZSxbZGlyPXJ0bF0gLm1hdC1kaWFsb2ctYWN0aW9ucyAubWF0LW1kYy1idXR0b24tYmFzZSsubWF0LW1kYy1idXR0b24tYmFzZXttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDo4cHh9XG4iXSxlbmNhcHN1bGF0aW9uOjIsZGF0YTp7YW5pbWF0aW9uOltHRy5kaWFsb2dDb250YWluZXJdfX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgocUcsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWF0LWRpYWxvZy1jb250YWluZXIiLHRlbXBsYXRlOiI8bmctdGVtcGxhdGUgY2RrUG9ydGFsT3V0bGV0PjwvbmctdGVtcGxhdGU+XG4iLGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uRGVmYXVsdCxhbmltYXRpb25zOltHRy5kaWFsb2dDb250YWluZXJdLGhvc3Q6e2NsYXNzOiJtYXQtZGlhbG9nLWNvbnRhaW5lciIsdGFiaW5kZXg6Ii0xIiwiYXJpYS1tb2RhbCI6InRydWUiLCJbaWRdIjoiX2lkIiwiW2F0dHIucm9sZV0iOiJfY29uZmlnLnJvbGUiLCJbYXR0ci5hcmlhLWxhYmVsbGVkYnldIjoiX2NvbmZpZy5hcmlhTGFiZWwgPyBudWxsIDogX2FyaWFMYWJlbGxlZEJ5IiwiW2F0dHIuYXJpYS1sYWJlbF0iOiJfY29uZmlnLmFyaWFMYWJlbCIsIlthdHRyLmFyaWEtZGVzY3JpYmVkYnldIjoiX2NvbmZpZy5hcmlhRGVzY3JpYmVkQnkgfHwgbnVsbCIsIltAZGlhbG9nQ29udGFpbmVyXSI6Il9zdGF0ZSIsIihAZGlhbG9nQ29udGFpbmVyLnN0YXJ0KSI6Il9vbkFuaW1hdGlvblN0YXJ0KCRldmVudCkiLCIoQGRpYWxvZ0NvbnRhaW5lci5kb25lKSI6Il9vbkFuaW1hdGlvbkRvbmUoJGV2ZW50KSJ9LHN0eWxlczpbIi5tYXQtZGlhbG9nLWNvbnRhaW5lcntkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MjRweDtib3JkZXItcmFkaXVzOjRweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6YXV0bztvdXRsaW5lOjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTttaW4taGVpZ2h0OmluaGVyaXQ7bWF4LWhlaWdodDppbmhlcml0fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1kaWFsb2ctY29udGFpbmVye291dGxpbmU6c29saWQgMXB4fS5tYXQtZGlhbG9nLWNvbnRlbnR7ZGlzcGxheTpibG9jazttYXJnaW46MCAtMjRweDtwYWRkaW5nOjAgMjRweDttYXgtaGVpZ2h0OjY1dmg7b3ZlcmZsb3c6YXV0bzstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaH0ubWF0LWRpYWxvZy10aXRsZXttYXJnaW46MCAwIDIwcHg7ZGlzcGxheTpibG9ja30ubWF0LWRpYWxvZy1hY3Rpb25ze3BhZGRpbmc6OHB4IDA7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO21pbi1oZWlnaHQ6NTJweDthbGlnbi1pdGVtczpjZW50ZXI7Ym94LXNpemluZzpjb250ZW50LWJveDttYXJnaW4tYm90dG9tOi0yNHB4fS5tYXQtZGlhbG9nLWFjdGlvbnNbYWxpZ249ZW5kXXtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9Lm1hdC1kaWFsb2ctYWN0aW9uc1thbGlnbj1jZW50ZXJde2p1c3RpZnktY29udGVudDpjZW50ZXJ9Lm1hdC1kaWFsb2ctYWN0aW9ucyAubWF0LWJ1dHRvbi1iYXNlKy5tYXQtYnV0dG9uLWJhc2UsLm1hdC1kaWFsb2ctYWN0aW9ucyAubWF0LW1kYy1idXR0b24tYmFzZSsubWF0LW1kYy1idXR0b24tYmFzZXttYXJnaW4tbGVmdDo4cHh9W2Rpcj1ydGxdIC5tYXQtZGlhbG9nLWFjdGlvbnMgLm1hdC1idXR0b24tYmFzZSsubWF0LWJ1dHRvbi1iYXNlLFtkaXI9cnRsXSAubWF0LWRpYWxvZy1hY3Rpb25zIC5tYXQtbWRjLWJ1dHRvbi1iYXNlKy5tYXQtbWRjLWJ1dHRvbi1iYXNle21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjhweH1cbiJdfV19XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KbGV0IFpHPTA7Y2xhc3MgWEd7Y29uc3RydWN0b3IodCxlLG49Im1hdC1kaWFsb2ctIitaRysrKXt0aGlzLl9vdmVybGF5UmVmPXQsdGhpcy5fY29udGFpbmVySW5zdGFuY2U9ZSx0aGlzLmlkPW4sdGhpcy5kaXNhYmxlQ2xvc2U9dGhpcy5fY29udGFpbmVySW5zdGFuY2UuX2NvbmZpZy5kaXNhYmxlQ2xvc2UsdGhpcy5fYWZ0ZXJPcGVuZWQ9bmV3IEksdGhpcy5fYWZ0ZXJDbG9zZWQ9bmV3IEksdGhpcy5fYmVmb3JlQ2xvc2VkPW5ldyBJLHRoaXMuX3N0YXRlPTAsZS5faWQ9bixlLl9hbmltYXRpb25TdGF0ZUNoYW5nZWQucGlwZShjZSgodD0+Im9wZW5lZCI9PT10LnN0YXRlKSksYmUoMSkpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLl9hZnRlck9wZW5lZC5uZXh0KCksdGhpcy5fYWZ0ZXJPcGVuZWQuY29tcGxldGUoKX0pKSxlLl9hbmltYXRpb25TdGF0ZUNoYW5nZWQucGlwZShjZSgodD0+ImNsb3NlZCI9PT10LnN0YXRlKSksYmUoMSkpLnN1YnNjcmliZSgoKCk9PntjbGVhclRpbWVvdXQodGhpcy5fY2xvc2VGYWxsYmFja1RpbWVvdXQpLHRoaXMuX2ZpbmlzaERpYWxvZ0Nsb3NlKCl9KSksdC5kZXRhY2htZW50cygpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLl9iZWZvcmVDbG9zZWQubmV4dCh0aGlzLl9yZXN1bHQpLHRoaXMuX2JlZm9yZUNsb3NlZC5jb21wbGV0ZSgpLHRoaXMuX2FmdGVyQ2xvc2VkLm5leHQodGhpcy5fcmVzdWx0KSx0aGlzLl9hZnRlckNsb3NlZC5jb21wbGV0ZSgpLHRoaXMuY29tcG9uZW50SW5zdGFuY2U9bnVsbCx0aGlzLl9vdmVybGF5UmVmLmRpc3Bvc2UoKX0pKSx0LmtleWRvd25FdmVudHMoKS5waXBlKGNlKCh0PT50LmtleUNvZGU9PT11eiYmIXRoaXMuZGlzYWJsZUNsb3NlJiYhYnoodCkpKSkuc3Vic2NyaWJlKCh0PT57dC5wcmV2ZW50RGVmYXVsdCgpLEtHKHRoaXMsImtleWJvYXJkIil9KSksdC5iYWNrZHJvcENsaWNrKCkuc3Vic2NyaWJlKCgoKT0+e3RoaXMuZGlzYWJsZUNsb3NlP3RoaXMuX2NvbnRhaW5lckluc3RhbmNlLl9yZWNhcHR1cmVGb2N1cygpOktHKHRoaXMsIm1vdXNlIil9KSl9Y2xvc2UodCl7dGhpcy5fcmVzdWx0PXQsdGhpcy5fY29udGFpbmVySW5zdGFuY2UuX2FuaW1hdGlvblN0YXRlQ2hhbmdlZC5waXBlKGNlKCh0PT4iY2xvc2luZyI9PT10LnN0YXRlKSksYmUoMSkpLnN1YnNjcmliZSgoZT0+e3RoaXMuX2JlZm9yZUNsb3NlZC5uZXh0KHQpLHRoaXMuX2JlZm9yZUNsb3NlZC5jb21wbGV0ZSgpLHRoaXMuX292ZXJsYXlSZWYuZGV0YWNoQmFja2Ryb3AoKSx0aGlzLl9jbG9zZUZhbGxiYWNrVGltZW91dD1zZXRUaW1lb3V0KCgoKT0+dGhpcy5fZmluaXNoRGlhbG9nQ2xvc2UoKSksZS50b3RhbFRpbWUrMTAwKX0pKSx0aGlzLl9zdGF0ZT0xLHRoaXMuX2NvbnRhaW5lckluc3RhbmNlLl9zdGFydEV4aXRBbmltYXRpb24oKX1hZnRlck9wZW5lZCgpe3JldHVybiB0aGlzLl9hZnRlck9wZW5lZH1hZnRlckNsb3NlZCgpe3JldHVybiB0aGlzLl9hZnRlckNsb3NlZH1iZWZvcmVDbG9zZWQoKXtyZXR1cm4gdGhpcy5fYmVmb3JlQ2xvc2VkfWJhY2tkcm9wQ2xpY2soKXtyZXR1cm4gdGhpcy5fb3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCl9a2V5ZG93bkV2ZW50cygpe3JldHVybiB0aGlzLl9vdmVybGF5UmVmLmtleWRvd25FdmVudHMoKX11cGRhdGVQb3NpdGlvbih0KXtsZXQgZT10aGlzLl9nZXRQb3NpdGlvblN0cmF0ZWd5KCk7cmV0dXJuIHQmJih0LmxlZnR8fHQucmlnaHQpP3QubGVmdD9lLmxlZnQodC5sZWZ0KTplLnJpZ2h0KHQucmlnaHQpOmUuY2VudGVySG9yaXpvbnRhbGx5KCksdCYmKHQudG9wfHx0LmJvdHRvbSk/dC50b3A/ZS50b3AodC50b3ApOmUuYm90dG9tKHQuYm90dG9tKTplLmNlbnRlclZlcnRpY2FsbHkoKSx0aGlzLl9vdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCksdGhpc311cGRhdGVTaXplKHQ9IiIsZT0iIil7cmV0dXJuIHRoaXMuX292ZXJsYXlSZWYudXBkYXRlU2l6ZSh7d2lkdGg6dCxoZWlnaHQ6ZX0pLHRoaXMuX292ZXJsYXlSZWYudXBkYXRlUG9zaXRpb24oKSx0aGlzfWFkZFBhbmVsQ2xhc3ModCl7cmV0dXJuIHRoaXMuX292ZXJsYXlSZWYuYWRkUGFuZWxDbGFzcyh0KSx0aGlzfXJlbW92ZVBhbmVsQ2xhc3ModCl7cmV0dXJuIHRoaXMuX292ZXJsYXlSZWYucmVtb3ZlUGFuZWxDbGFzcyh0KSx0aGlzfWdldFN0YXRlKCl7cmV0dXJuIHRoaXMuX3N0YXRlfV9maW5pc2hEaWFsb2dDbG9zZSgpe3RoaXMuX3N0YXRlPTIsdGhpcy5fb3ZlcmxheVJlZi5kaXNwb3NlKCl9X2dldFBvc2l0aW9uU3RyYXRlZ3koKXtyZXR1cm4gdGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKS5wb3NpdGlvblN0cmF0ZWd5fX1mdW5jdGlvbiBLRyh0LGUsbil7cmV0dXJuIHZvaWQgMCE9PXQuX2NvbnRhaW5lckluc3RhbmNlJiYodC5fY29udGFpbmVySW5zdGFuY2UuX2Nsb3NlSW50ZXJhY3Rpb25UeXBlPWUpLHQuY2xvc2Uobil9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NvbnN0IEpHPW5ldyBHYSgiTWF0RGlhbG9nRGF0YSIpLFFHPW5ldyBHYSgibWF0LWRpYWxvZy1kZWZhdWx0LW9wdGlvbnMiKSwkRz1uZXcgR2EoIm1hdC1kaWFsb2ctc2Nyb2xsLXN0cmF0ZWd5IiksdFc9e3Byb3ZpZGU6JEcsZGVwczpbcExdLHVzZUZhY3Rvcnk6ZnVuY3Rpb24gZVcodCl7cmV0dXJuKCk9PnQuc2Nyb2xsU3RyYXRlZ2llcy5ibG9jaygpfX07Y2xhc3Mgbld7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEscixzLGwpe3RoaXMuX292ZXJsYXk9dCx0aGlzLl9pbmplY3Rvcj1lLHRoaXMuX2RlZmF1bHRPcHRpb25zPW4sdGhpcy5fcGFyZW50RGlhbG9nPW8sdGhpcy5fb3ZlcmxheUNvbnRhaW5lcj1pLHRoaXMuX2RpYWxvZ1JlZkNvbnN0cnVjdG9yPXIsdGhpcy5fZGlhbG9nQ29udGFpbmVyVHlwZT1zLHRoaXMuX2RpYWxvZ0RhdGFUb2tlbj1sLHRoaXMuX29wZW5EaWFsb2dzQXRUaGlzTGV2ZWw9W10sdGhpcy5fYWZ0ZXJBbGxDbG9zZWRBdFRoaXNMZXZlbD1uZXcgSSx0aGlzLl9hZnRlck9wZW5lZEF0VGhpc0xldmVsPW5ldyBJLHRoaXMuX2FyaWFIaWRkZW5FbGVtZW50cz1uZXcgTWFwLHRoaXMuYWZ0ZXJBbGxDbG9zZWQ9UXQoKCgpPT50aGlzLm9wZW5EaWFsb2dzLmxlbmd0aD90aGlzLl9nZXRBZnRlckFsbENsb3NlZCgpOnRoaXMuX2dldEFmdGVyQWxsQ2xvc2VkKCkucGlwZShOZSh2b2lkIDApKSkpLHRoaXMuX3Njcm9sbFN0cmF0ZWd5PWF9Z2V0IG9wZW5EaWFsb2dzKCl7cmV0dXJuIHRoaXMuX3BhcmVudERpYWxvZz90aGlzLl9wYXJlbnREaWFsb2cub3BlbkRpYWxvZ3M6dGhpcy5fb3BlbkRpYWxvZ3NBdFRoaXNMZXZlbH1nZXQgYWZ0ZXJPcGVuZWQoKXtyZXR1cm4gdGhpcy5fcGFyZW50RGlhbG9nP3RoaXMuX3BhcmVudERpYWxvZy5hZnRlck9wZW5lZDp0aGlzLl9hZnRlck9wZW5lZEF0VGhpc0xldmVsfV9nZXRBZnRlckFsbENsb3NlZCgpe2NvbnN0IHQ9dGhpcy5fcGFyZW50RGlhbG9nO3JldHVybiB0P3QuX2dldEFmdGVyQWxsQ2xvc2VkKCk6dGhpcy5fYWZ0ZXJBbGxDbG9zZWRBdFRoaXNMZXZlbH1vcGVuKHQsZSl7aWYoKGU9KGZ1bmN0aW9uIG4odCxlKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHQpfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8pKGUsdGhpcy5fZGVmYXVsdE9wdGlvbnN8fG5ldyBVRykpLmlkJiZ0aGlzLmdldERpYWxvZ0J5SWQoZS5pZCkmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSl0aHJvdyBFcnJvcihgRGlhbG9nIHdpdGggaWQgIiR7ZS5pZH0iIGV4aXN0cyBhbHJlYWR5LiBUaGUgZGlhbG9nIGlkIG11c3QgYmUgdW5pcXVlLmApO2NvbnN0IG89dGhpcy5fY3JlYXRlT3ZlcmxheShlKSxpPXRoaXMuX2F0dGFjaERpYWxvZ0NvbnRhaW5lcihvLGUpLGE9dGhpcy5fYXR0YWNoRGlhbG9nQ29udGVudCh0LGksbyxlKTtyZXR1cm4gdGhpcy5vcGVuRGlhbG9ncy5sZW5ndGh8fHRoaXMuX2hpZGVOb25EaWFsb2dDb250ZW50RnJvbUFzc2lzdGl2ZVRlY2hub2xvZ3koKSx0aGlzLm9wZW5EaWFsb2dzLnB1c2goYSksYS5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoKCk9PnRoaXMuX3JlbW92ZU9wZW5EaWFsb2coYSkpKSx0aGlzLmFmdGVyT3BlbmVkLm5leHQoYSksaS5faW5pdGlhbGl6ZVdpdGhBdHRhY2hlZENvbnRlbnQoKSxhfWNsb3NlQWxsKCl7dGhpcy5fY2xvc2VEaWFsb2dzKHRoaXMub3BlbkRpYWxvZ3MpfWdldERpYWxvZ0J5SWQodCl7cmV0dXJuIHRoaXMub3BlbkRpYWxvZ3MuZmluZCgoZT0+ZS5pZD09PXQpKX1uZ09uRGVzdHJveSgpe3RoaXMuX2Nsb3NlRGlhbG9ncyh0aGlzLl9vcGVuRGlhbG9nc0F0VGhpc0xldmVsKSx0aGlzLl9hZnRlckFsbENsb3NlZEF0VGhpc0xldmVsLmNvbXBsZXRlKCksdGhpcy5fYWZ0ZXJPcGVuZWRBdFRoaXNMZXZlbC5jb21wbGV0ZSgpfV9jcmVhdGVPdmVybGF5KHQpe2NvbnN0IGU9dGhpcy5fZ2V0T3ZlcmxheUNvbmZpZyh0KTtyZXR1cm4gdGhpcy5fb3ZlcmxheS5jcmVhdGUoZSl9X2dldE92ZXJsYXlDb25maWcodCl7Y29uc3QgZT1uZXcgVkYoe3Bvc2l0aW9uU3RyYXRlZ3k6dGhpcy5fb3ZlcmxheS5wb3NpdGlvbigpLmdsb2JhbCgpLHNjcm9sbFN0cmF0ZWd5OnQuc2Nyb2xsU3RyYXRlZ3l8fHRoaXMuX3Njcm9sbFN0cmF0ZWd5KCkscGFuZWxDbGFzczp0LnBhbmVsQ2xhc3MsaGFzQmFja2Ryb3A6dC5oYXNCYWNrZHJvcCxkaXJlY3Rpb246dC5kaXJlY3Rpb24sbWluV2lkdGg6dC5taW5XaWR0aCxtaW5IZWlnaHQ6dC5taW5IZWlnaHQsbWF4V2lkdGg6dC5tYXhXaWR0aCxtYXhIZWlnaHQ6dC5tYXhIZWlnaHQsZGlzcG9zZU9uTmF2aWdhdGlvbjp0LmNsb3NlT25OYXZpZ2F0aW9ufSk7cmV0dXJuIHQuYmFja2Ryb3BDbGFzcyYmKGUuYmFja2Ryb3BDbGFzcz10LmJhY2tkcm9wQ2xhc3MpLGV9X2F0dGFjaERpYWxvZ0NvbnRhaW5lcih0LGUpe2NvbnN0IG49cnAuY3JlYXRlKHtwYXJlbnQ6ZSYmZS52aWV3Q29udGFpbmVyUmVmJiZlLnZpZXdDb250YWluZXJSZWYuaW5qZWN0b3J8fHRoaXMuX2luamVjdG9yLHByb3ZpZGVyczpbe3Byb3ZpZGU6VUcsdXNlVmFsdWU6ZX1dfSksbz1uZXcgdkYodGhpcy5fZGlhbG9nQ29udGFpbmVyVHlwZSxlLnZpZXdDb250YWluZXJSZWYsbixlLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcik7cmV0dXJuIHQuYXR0YWNoKG8pLmluc3RhbmNlfV9hdHRhY2hEaWFsb2dDb250ZW50KHQsZSxuLG8pe2NvbnN0IGk9bmV3IHRoaXMuX2RpYWxvZ1JlZkNvbnN0cnVjdG9yKG4sZSxvLmlkKTtpZih0IGluc3RhbmNlb2YgWGcpZS5hdHRhY2hUZW1wbGF0ZVBvcnRhbChuZXcgeEYodCxudWxsLHskaW1wbGljaXQ6by5kYXRhLGRpYWxvZ1JlZjppfSkpO2Vsc2V7Y29uc3Qgbj10aGlzLl9jcmVhdGVJbmplY3RvcihvLGksZSksYT1lLmF0dGFjaENvbXBvbmVudFBvcnRhbChuZXcgdkYodCxvLnZpZXdDb250YWluZXJSZWYsbikpO2kuY29tcG9uZW50SW5zdGFuY2U9YS5pbnN0YW5jZX1yZXR1cm4gaS51cGRhdGVTaXplKG8ud2lkdGgsby5oZWlnaHQpLnVwZGF0ZVBvc2l0aW9uKG8ucG9zaXRpb24pLGl9X2NyZWF0ZUluamVjdG9yKHQsZSxuKXtjb25zdCBvPXQmJnQudmlld0NvbnRhaW5lclJlZiYmdC52aWV3Q29udGFpbmVyUmVmLmluamVjdG9yLGk9W3twcm92aWRlOnRoaXMuX2RpYWxvZ0NvbnRhaW5lclR5cGUsdXNlVmFsdWU6bn0se3Byb3ZpZGU6dGhpcy5fZGlhbG9nRGF0YVRva2VuLHVzZVZhbHVlOnQuZGF0YX0se3Byb3ZpZGU6dGhpcy5fZGlhbG9nUmVmQ29uc3RydWN0b3IsdXNlVmFsdWU6ZX1dO3JldHVybiF0LmRpcmVjdGlvbnx8byYmby5nZXQoSEksbnVsbCxFbi5PcHRpb25hbCl8fGkucHVzaCh7cHJvdmlkZTpISSx1c2VWYWx1ZTp7dmFsdWU6dC5kaXJlY3Rpb24sY2hhbmdlOkV0KCl9fSkscnAuY3JlYXRlKHtwYXJlbnQ6b3x8dGhpcy5faW5qZWN0b3IscHJvdmlkZXJzOml9KX1fcmVtb3ZlT3BlbkRpYWxvZyh0KXtjb25zdCBlPXRoaXMub3BlbkRpYWxvZ3MuaW5kZXhPZih0KTtlPi0xJiYodGhpcy5vcGVuRGlhbG9ncy5zcGxpY2UoZSwxKSx0aGlzLm9wZW5EaWFsb2dzLmxlbmd0aHx8KHRoaXMuX2FyaWFIaWRkZW5FbGVtZW50cy5mb3JFYWNoKCgodCxlKT0+e3Q/ZS5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIix0KTplLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iKX0pKSx0aGlzLl9hcmlhSGlkZGVuRWxlbWVudHMuY2xlYXIoKSx0aGlzLl9nZXRBZnRlckFsbENsb3NlZCgpLm5leHQoKSkpfV9oaWRlTm9uRGlhbG9nQ29udGVudEZyb21Bc3Npc3RpdmVUZWNobm9sb2d5KCl7Y29uc3QgdD10aGlzLl9vdmVybGF5Q29udGFpbmVyLmdldENvbnRhaW5lckVsZW1lbnQoKTtpZih0LnBhcmVudEVsZW1lbnQpe2NvbnN0IGU9dC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuO2ZvcihsZXQgbj1lLmxlbmd0aC0xO24+LTE7bi0tKXtsZXQgbz1lW25dO289PT10fHwiU0NSSVBUIj09PW8ubm9kZU5hbWV8fCJTVFlMRSI9PT1vLm5vZGVOYW1lfHxvLmhhc0F0dHJpYnV0ZSgiYXJpYS1saXZlIil8fCh0aGlzLl9hcmlhSGlkZGVuRWxlbWVudHMuc2V0KG8sby5nZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIikpLG8uc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsInRydWUiKSl9fX1fY2xvc2VEaWFsb2dzKHQpe2xldCBlPXQubGVuZ3RoO2Zvcig7ZS0tOyl0W2VdLmNsb3NlKCl9fW5XLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxuVykoU20ocEwpLFNtKHJwKSxTbSh2b2lkIDApLFNtKHZvaWQgMCksU20oUUYpLFNtKHZvaWQgMCksU20oUWEpLFNtKFFhKSxTbShHYSkpfSxuVy7JtWRpcj1sbyh7dHlwZTpuV30pLG5XLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6cEx9LHt0eXBlOnJwfSx7dHlwZTp2b2lkIDB9LHt0eXBlOnZvaWQgMH0se3R5cGU6UUZ9LHt0eXBlOnZvaWQgMH0se3R5cGU6UWF9LHt0eXBlOlFhfSx7dHlwZTpHYX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoblcsW3t0eXBlOkN5fV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnBMfSx7dHlwZTpycH0se3R5cGU6dm9pZCAwfSx7dHlwZTp2b2lkIDB9LHt0eXBlOlFGfSx7dHlwZTp2b2lkIDB9LHt0eXBlOlFhfSx7dHlwZTpRYX0se3R5cGU6R2F9XX0pLG51bGwpO2NsYXNzIG9XIGV4dGVuZHMgbld7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEscil7c3VwZXIodCxlLG8sYSxyLGksWEcscUcsSkcpfX1vVy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8b1cpKHZyKHBMKSx2cihycCksdnIobEMsOCksdnIoUUcsOCksdnIoJEcpLHZyKG9XLDEyKSx2cihRRikpfSxvVy7JtXByb3Y9TW4oe3Rva2VuOm9XLGZhY3Rvcnk6b1cuybVmYWN9KSxvVy5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnBMfSx7dHlwZTpycH0se3R5cGU6bEMsZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6VUcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1FHXX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbJEddfV19LHt0eXBlOm9XLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpFcn1dfSx7dHlwZTpRRn1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgob1csW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnBMfSx7dHlwZTpycH0se3R5cGU6bEMsZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6VUcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1FHXX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbJEddfV19LHt0eXBlOm9XLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpFcn1dfSx7dHlwZTpRRn1dfSksbnVsbCk7bGV0IGlXPTA7Y2xhc3MgYVd7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuZGlhbG9nUmVmPXQsdGhpcy5fZWxlbWVudFJlZj1lLHRoaXMuX2RpYWxvZz1uLHRoaXMudHlwZT0iYnV0dG9uIn1uZ09uSW5pdCgpe3RoaXMuZGlhbG9nUmVmfHwodGhpcy5kaWFsb2dSZWY9Y1codGhpcy5fZWxlbWVudFJlZix0aGlzLl9kaWFsb2cub3BlbkRpYWxvZ3MpKX1uZ09uQ2hhbmdlcyh0KXtjb25zdCBlPXQuX21hdERpYWxvZ0Nsb3NlfHx0Ll9tYXREaWFsb2dDbG9zZVJlc3VsdDtlJiYodGhpcy5kaWFsb2dSZXN1bHQ9ZS5jdXJyZW50VmFsdWUpfV9vbkJ1dHRvbkNsaWNrKHQpe0tHKHRoaXMuZGlhbG9nUmVmLDA9PT10LnNjcmVlblgmJjA9PT10LnNjcmVlblk/ImtleWJvYXJkIjoibW91c2UiLHRoaXMuZGlhbG9nUmVzdWx0KX19YVcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGFXKShTbShYRyw4KSxTbShoZyksU20ob1cpKX0sYVcuybVkaXI9bG8oe3R5cGU6YVcsc2VsZWN0b3JzOltbIiIsIm1hdC1kaWFsb2ctY2xvc2UiLCIiXSxbIiIsIm1hdERpYWxvZ0Nsb3NlIiwiIl1dLGhvc3RWYXJzOjIsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJlZtKCJjbGljayIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX29uQnV0dG9uQ2xpY2soZSl9KSksMiZlJiZqcCgiYXJpYS1sYWJlbCIsbi5hcmlhTGFiZWx8fG51bGwpKCJ0eXBlIixuLnR5cGUpfSxpbnB1dHM6e3R5cGU6InR5cGUiLGRpYWxvZ1Jlc3VsdDpbIm1hdC1kaWFsb2ctY2xvc2UiLCJkaWFsb2dSZXN1bHQiXSxhcmlhTGFiZWw6WyJhcmlhLWxhYmVsIiwiYXJpYUxhYmVsIl0sX21hdERpYWxvZ0Nsb3NlOlsibWF0RGlhbG9nQ2xvc2UiLCJfbWF0RGlhbG9nQ2xvc2UiXX0sZXhwb3J0QXM6WyJtYXREaWFsb2dDbG9zZSJdLGZlYXR1cmVzOltCb119KSxhVy5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlhHLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOmhnfSx7dHlwZTpvV31dLGFXLnByb3BEZWNvcmF0b3JzPXthcmlhTGFiZWw6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsIl19XSx0eXBlOlt7dHlwZTp4eX1dLGRpYWxvZ1Jlc3VsdDpbe3R5cGU6eHksYXJnczpbIm1hdC1kaWFsb2ctY2xvc2UiXX1dLF9tYXREaWFsb2dDbG9zZTpbe3R5cGU6eHksYXJnczpbIm1hdERpYWxvZ0Nsb3NlIl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChhVyxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbWF0LWRpYWxvZy1jbG9zZV0sIFttYXREaWFsb2dDbG9zZV0iLGV4cG9ydEFzOiJtYXREaWFsb2dDbG9zZSIsaG9zdDp7IihjbGljaykiOiJfb25CdXR0b25DbGljaygkZXZlbnQpIiwiW2F0dHIuYXJpYS1sYWJlbF0iOiJhcmlhTGFiZWwgfHwgbnVsbCIsIlthdHRyLnR5cGVdIjoidHlwZSJ9fV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6WEcsZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6aGd9LHt0eXBlOm9XfV19KSx7dHlwZTpbe3R5cGU6eHl9XSxkaWFsb2dSZXN1bHQ6W3t0eXBlOnh5LGFyZ3M6WyJtYXQtZGlhbG9nLWNsb3NlIl19XSxhcmlhTGFiZWw6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsIl19XSxfbWF0RGlhbG9nQ2xvc2U6W3t0eXBlOnh5LGFyZ3M6WyJtYXREaWFsb2dDbG9zZSJdfV19KTtjbGFzcyByV3tjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5fZGlhbG9nUmVmPXQsdGhpcy5fZWxlbWVudFJlZj1lLHRoaXMuX2RpYWxvZz1uLHRoaXMuaWQ9Im1hdC1kaWFsb2ctdGl0bGUtIitpVysrfW5nT25Jbml0KCl7dGhpcy5fZGlhbG9nUmVmfHwodGhpcy5fZGlhbG9nUmVmPWNXKHRoaXMuX2VsZW1lbnRSZWYsdGhpcy5fZGlhbG9nLm9wZW5EaWFsb2dzKSksdGhpcy5fZGlhbG9nUmVmJiZQcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+e2NvbnN0IHQ9dGhpcy5fZGlhbG9nUmVmLl9jb250YWluZXJJbnN0YW5jZTt0JiYhdC5fYXJpYUxhYmVsbGVkQnkmJih0Ll9hcmlhTGFiZWxsZWRCeT10aGlzLmlkKX0pKX19clcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHJXKShTbShYRyw4KSxTbShoZyksU20ob1cpKX0sclcuybVkaXI9bG8oe3R5cGU6clcsc2VsZWN0b3JzOltbIiIsIm1hdC1kaWFsb2ctdGl0bGUiLCIiXSxbIiIsIm1hdERpYWxvZ1RpdGxlIiwiIl1dLGhvc3RBdHRyczpbMSwibWF0LWRpYWxvZy10aXRsZSJdLGhvc3RWYXJzOjEsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJlR1KCJpZCIsbi5pZCl9LGlucHV0czp7aWQ6ImlkIn0sZXhwb3J0QXM6WyJtYXREaWFsb2dUaXRsZSJdfSksclcuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpYRyxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpoZ30se3R5cGU6b1d9XSxyVy5wcm9wRGVjb3JhdG9ycz17aWQ6W3t0eXBlOnh5fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoclcsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW21hdC1kaWFsb2ctdGl0bGVdLCBbbWF0RGlhbG9nVGl0bGVdIixleHBvcnRBczoibWF0RGlhbG9nVGl0bGUiLGhvc3Q6e2NsYXNzOiJtYXQtZGlhbG9nLXRpdGxlIiwiW2lkXSI6ImlkIn19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpYRyxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpoZ30se3R5cGU6b1d9XX0pLHtpZDpbe3R5cGU6eHl9XX0pO2NsYXNzIHNXe31zVy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8c1cpfSxzVy7JtWRpcj1sbyh7dHlwZTpzVyxzZWxlY3RvcnM6W1siIiwibWF0LWRpYWxvZy1jb250ZW50IiwiIl0sWyJtYXQtZGlhbG9nLWNvbnRlbnQiXSxbIiIsIm1hdERpYWxvZ0NvbnRlbnQiLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtZGlhbG9nLWNvbnRlbnQiXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoc1csW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW21hdC1kaWFsb2ctY29udGVudF0sIG1hdC1kaWFsb2ctY29udGVudCwgW21hdERpYWxvZ0NvbnRlbnRdIixob3N0OntjbGFzczoibWF0LWRpYWxvZy1jb250ZW50In19XX1dLG51bGwsbnVsbCk7Y2xhc3MgbFd7fWZ1bmN0aW9uIGNXKHQsZSl7bGV0IG49dC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQ7Zm9yKDtuJiYhbi5jbGFzc0xpc3QuY29udGFpbnMoIm1hdC1kaWFsb2ctY29udGFpbmVyIik7KW49bi5wYXJlbnRFbGVtZW50O3JldHVybiBuP2UuZmluZCgodD0+dC5pZD09PW4uaWQpKTpudWxsfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9sVy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bFcpfSxsVy7JtWRpcj1sbyh7dHlwZTpsVyxzZWxlY3RvcnM6W1siIiwibWF0LWRpYWxvZy1hY3Rpb25zIiwiIl0sWyJtYXQtZGlhbG9nLWFjdGlvbnMiXSxbIiIsIm1hdERpYWxvZ0FjdGlvbnMiLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtZGlhbG9nLWFjdGlvbnMiXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobFcsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW21hdC1kaWFsb2ctYWN0aW9uc10sIG1hdC1kaWFsb2ctYWN0aW9ucywgW21hdERpYWxvZ0FjdGlvbnNdIixob3N0OntjbGFzczoibWF0LWRpYWxvZy1hY3Rpb25zIn19XX1dLG51bGwsbnVsbCk7Y2xhc3MgZFd7fWRXLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxkVyl9LGRXLsm1bW9kPWFvKHt0eXBlOmRXfSksZFcuybVpbmo9dm4oe3Byb3ZpZGVyczpbb1csdFddLGltcG9ydHM6W1t5TCxSRixYSV0sWEldfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChkVyxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W3lMLFJGLFhJXSxleHBvcnRzOltxRyxhVyxyVyxzVyxsVyxYSV0sZGVjbGFyYXRpb25zOltxRyxhVyxyVyxsVyxzV10scHJvdmlkZXJzOltvVyx0V10sZW50cnlDb21wb25lbnRzOltxR119XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhkVyx7ZGVjbGFyYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuW3FHLGFXLHJXLGxXLHNXXX0saW1wb3J0czpmdW5jdGlvbigpe3JldHVyblt5TCxSRixYSV19LGV4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bcUcsYVcsclcsc1csbFcsWEldfX0pO2NsYXNzIHBXe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fZG9jdW1lbnQ9ZTtjb25zdCBuPXRoaXMuX3RleHRhcmVhPXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIiksbz1uLnN0eWxlO28ucG9zaXRpb249ImZpeGVkIixvLnRvcD1vLm9wYWNpdHk9IjAiLG8ubGVmdD0iLTk5OWVtIixuLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIiksbi52YWx1ZT10LHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobil9Y29weSgpe2NvbnN0IHQ9dGhpcy5fdGV4dGFyZWE7bGV0IGU9ITE7dHJ5e2lmKHQpe2NvbnN0IG49dGhpcy5fZG9jdW1lbnQuYWN0aXZlRWxlbWVudDt0LnNlbGVjdCgpLHQuc2V0U2VsZWN0aW9uUmFuZ2UoMCx0LnZhbHVlLmxlbmd0aCksZT10aGlzLl9kb2N1bWVudC5leGVjQ29tbWFuZCgiY29weSIpLG4mJm4uZm9jdXMoKX19Y2F0Y2godCl7fXJldHVybiBlfWRlc3Ryb3koKXtjb25zdCB0PXRoaXMuX3RleHRhcmVhO3QmJih0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0aGlzLl90ZXh0YXJlYT12b2lkIDApfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovY2xhc3MgbVd7Y29uc3RydWN0b3IodCl7dGhpcy5fZG9jdW1lbnQ9dH1jb3B5KHQpe2NvbnN0IGU9dGhpcy5iZWdpbkNvcHkodCksbj1lLmNvcHkoKTtyZXR1cm4gZS5kZXN0cm95KCksbn1iZWdpbkNvcHkodCl7cmV0dXJuIG5ldyBwVyh0LHRoaXMuX2RvY3VtZW50KX19bVcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fG1XKSh2cihaXykpfSxtVy7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgbVcodnIoWl8pKX0sdG9rZW46bVcscHJvdmlkZWRJbjoicm9vdCJ9KSxtVy5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobVcsW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOiJyb290In1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCB1Vz1uZXcgR2EoIkNES19DT1BZX1RPX0NMSVBCT0FSRF9DT05GSUciKTtjbGFzcyBmV3tjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5fY2xpcGJvYXJkPXQsdGhpcy5fbmdab25lPWUsdGhpcy50ZXh0PSIiLHRoaXMuYXR0ZW1wdHM9MSx0aGlzLmNvcGllZD1uZXcgTGgsdGhpcy5fcGVuZGluZz1uZXcgU2V0LG4mJm51bGwhPW4uYXR0ZW1wdHMmJih0aGlzLmF0dGVtcHRzPW4uYXR0ZW1wdHMpfWNvcHkodD10aGlzLmF0dGVtcHRzKXtpZih0PjEpe2xldCBlPXQ7Y29uc3Qgbj10aGlzLl9jbGlwYm9hcmQuYmVnaW5Db3B5KHRoaXMudGV4dCk7dGhpcy5fcGVuZGluZy5hZGQobik7Y29uc3Qgbz0oKT0+e2NvbnN0IHQ9bi5jb3B5KCk7dHx8IS0tZXx8dGhpcy5fZGVzdHJveWVkPyh0aGlzLl9jdXJyZW50VGltZW91dD1udWxsLHRoaXMuX3BlbmRpbmcuZGVsZXRlKG4pLG4uZGVzdHJveSgpLHRoaXMuY29waWVkLmVtaXQodCkpOnRoaXMuX2N1cnJlbnRUaW1lb3V0PXRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PnNldFRpbWVvdXQobywxKSkpfTtvKCl9ZWxzZSB0aGlzLmNvcGllZC5lbWl0KHRoaXMuX2NsaXBib2FyZC5jb3B5KHRoaXMudGV4dCkpfW5nT25EZXN0cm95KCl7dGhpcy5fY3VycmVudFRpbWVvdXQmJmNsZWFyVGltZW91dCh0aGlzLl9jdXJyZW50VGltZW91dCksdGhpcy5fcGVuZGluZy5mb3JFYWNoKCh0PT50LmRlc3Ryb3koKSkpLHRoaXMuX3BlbmRpbmcuY2xlYXIoKSx0aGlzLl9kZXN0cm95ZWQ9ITB9fWZXLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxmVykoU20obVcpLFNtKGFfKSxTbSh1Vyw4KSl9LGZXLsm1ZGlyPWxvKHt0eXBlOmZXLHNlbGVjdG9yczpbWyIiLCJjZGtDb3B5VG9DbGlwYm9hcmQiLCIiXV0saG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJlZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5jb3B5KCl9KSl9LGlucHV0czp7dGV4dDpbImNka0NvcHlUb0NsaXBib2FyZCIsInRleHQiXSxhdHRlbXB0czpbImNka0NvcHlUb0NsaXBib2FyZEF0dGVtcHRzIiwiYXR0ZW1wdHMiXX0sb3V0cHV0czp7Y29waWVkOiJjZGtDb3B5VG9DbGlwYm9hcmRDb3BpZWQifX0pLGZXLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6bVd9LHt0eXBlOmFffSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3VXXX1dfV0sZlcucHJvcERlY29yYXRvcnM9e3RleHQ6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb3B5VG9DbGlwYm9hcmQiXX1dLGF0dGVtcHRzOlt7dHlwZTp4eSxhcmdzOlsiY2RrQ29weVRvQ2xpcGJvYXJkQXR0ZW1wdHMiXX1dLGNvcGllZDpbe3R5cGU6T3ksYXJnczpbImNka0NvcHlUb0NsaXBib2FyZENvcGllZCJdfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZlcsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Nka0NvcHlUb0NsaXBib2FyZF0iLGhvc3Q6eyIoY2xpY2spIjoiY29weSgpIn19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTptV30se3R5cGU6YV99LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbdVddfV19XX0pLHt0ZXh0Olt7dHlwZTp4eSxhcmdzOlsiY2RrQ29weVRvQ2xpcGJvYXJkIl19XSxhdHRlbXB0czpbe3R5cGU6eHksYXJnczpbImNka0NvcHlUb0NsaXBib2FyZEF0dGVtcHRzIl19XSxjb3BpZWQ6W3t0eXBlOk95LGFyZ3M6WyJjZGtDb3B5VG9DbGlwYm9hcmRDb3BpZWQiXX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBnV3t9ZnVuY3Rpb24gaFcodCl7cmV0dXJuIEVycm9yKGBVbmFibGUgdG8gZmluZCBpY29uIHdpdGggdGhlIG5hbWUgIiR7dH0iYCl9ZnVuY3Rpb24gYlcodCl7cmV0dXJuIEVycm9yKGBUaGUgVVJMIHByb3ZpZGVkIHRvIE1hdEljb25SZWdpc3RyeSB3YXMgbm90IHRydXN0ZWQgYXMgYSByZXNvdXJjZSBVUkwgdmlhIEFuZ3VsYXIncyBEb21TYW5pdGl6ZXIuIEF0dGVtcHRlZCBVUkwgd2FzICIke3R9Ii5gKX1mdW5jdGlvbiB5Vyh0KXtyZXR1cm4gRXJyb3IoYFRoZSBsaXRlcmFsIHByb3ZpZGVkIHRvIE1hdEljb25SZWdpc3RyeSB3YXMgbm90IHRydXN0ZWQgYXMgc2FmZSBIVE1MIGJ5IEFuZ3VsYXIncyBEb21TYW5pdGl6ZXIuIEF0dGVtcHRlZCBsaXRlcmFsIHdhcyAiJHt0fSIuYCl9Z1cuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGdXKX0sZ1cuybVtb2Q9YW8oe3R5cGU6Z1d9KSxnVy7JtWluaj12bih7fSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChnVyxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbZlddLGV4cG9ydHM6W2ZXXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKGdXLHtkZWNsYXJhdGlvbnM6W2ZXXSxleHBvcnRzOltmV119KTtjbGFzcyBfV3tjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy51cmw9dCx0aGlzLnN2Z1RleHQ9ZSx0aGlzLm9wdGlvbnM9bn19Y2xhc3MgQ1d7Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy5faHR0cENsaWVudD10LHRoaXMuX3Nhbml0aXplcj1lLHRoaXMuX2Vycm9ySGFuZGxlcj1vLHRoaXMuX3N2Z0ljb25Db25maWdzPW5ldyBNYXAsdGhpcy5faWNvblNldENvbmZpZ3M9bmV3IE1hcCx0aGlzLl9jYWNoZWRJY29uc0J5VXJsPW5ldyBNYXAsdGhpcy5faW5Qcm9ncmVzc1VybEZldGNoZXM9bmV3IE1hcCx0aGlzLl9mb250Q3NzQ2xhc3Nlc0J5QWxpYXM9bmV3IE1hcCx0aGlzLl9yZXNvbHZlcnM9W10sdGhpcy5fZGVmYXVsdEZvbnRTZXRDbGFzcz0ibWF0ZXJpYWwtaWNvbnMiLHRoaXMuX2RvY3VtZW50PW59YWRkU3ZnSWNvbih0LGUsbil7cmV0dXJuIHRoaXMuYWRkU3ZnSWNvbkluTmFtZXNwYWNlKCIiLHQsZSxuKX1hZGRTdmdJY29uTGl0ZXJhbCh0LGUsbil7cmV0dXJuIHRoaXMuYWRkU3ZnSWNvbkxpdGVyYWxJbk5hbWVzcGFjZSgiIix0LGUsbil9YWRkU3ZnSWNvbkluTmFtZXNwYWNlKHQsZSxuLG8pe3JldHVybiB0aGlzLl9hZGRTdmdJY29uQ29uZmlnKHQsZSxuZXcgX1cobixudWxsLG8pKX1hZGRTdmdJY29uUmVzb2x2ZXIodCl7cmV0dXJuIHRoaXMuX3Jlc29sdmVycy5wdXNoKHQpLHRoaXN9YWRkU3ZnSWNvbkxpdGVyYWxJbk5hbWVzcGFjZSh0LGUsbixvKXtjb25zdCBpPXRoaXMuX3Nhbml0aXplci5zYW5pdGl6ZShBcy5IVE1MLG4pO2lmKCFpKXRocm93IHlXKG4pO3JldHVybiB0aGlzLl9hZGRTdmdJY29uQ29uZmlnKHQsZSxuZXcgX1coIiIsaSxvKSl9YWRkU3ZnSWNvblNldCh0LGUpe3JldHVybiB0aGlzLmFkZFN2Z0ljb25TZXRJbk5hbWVzcGFjZSgiIix0LGUpfWFkZFN2Z0ljb25TZXRMaXRlcmFsKHQsZSl7cmV0dXJuIHRoaXMuYWRkU3ZnSWNvblNldExpdGVyYWxJbk5hbWVzcGFjZSgiIix0LGUpfWFkZFN2Z0ljb25TZXRJbk5hbWVzcGFjZSh0LGUsbil7cmV0dXJuIHRoaXMuX2FkZFN2Z0ljb25TZXRDb25maWcodCxuZXcgX1coZSxudWxsLG4pKX1hZGRTdmdJY29uU2V0TGl0ZXJhbEluTmFtZXNwYWNlKHQsZSxuKXtjb25zdCBvPXRoaXMuX3Nhbml0aXplci5zYW5pdGl6ZShBcy5IVE1MLGUpO2lmKCFvKXRocm93IHlXKGUpO3JldHVybiB0aGlzLl9hZGRTdmdJY29uU2V0Q29uZmlnKHQsbmV3IF9XKCIiLG8sbikpfXJlZ2lzdGVyRm9udENsYXNzQWxpYXModCxlPXQpe3JldHVybiB0aGlzLl9mb250Q3NzQ2xhc3Nlc0J5QWxpYXMuc2V0KHQsZSksdGhpc31jbGFzc05hbWVGb3JGb250QWxpYXModCl7cmV0dXJuIHRoaXMuX2ZvbnRDc3NDbGFzc2VzQnlBbGlhcy5nZXQodCl8fHR9c2V0RGVmYXVsdEZvbnRTZXRDbGFzcyh0KXtyZXR1cm4gdGhpcy5fZGVmYXVsdEZvbnRTZXRDbGFzcz10LHRoaXN9Z2V0RGVmYXVsdEZvbnRTZXRDbGFzcygpe3JldHVybiB0aGlzLl9kZWZhdWx0Rm9udFNldENsYXNzfWdldFN2Z0ljb25Gcm9tVXJsKHQpe2NvbnN0IGU9dGhpcy5fc2FuaXRpemVyLnNhbml0aXplKEFzLlJFU09VUkNFX1VSTCx0KTtpZighZSl0aHJvdyBiVyh0KTtjb25zdCBuPXRoaXMuX2NhY2hlZEljb25zQnlVcmwuZ2V0KGUpO3JldHVybiBuP0V0KE1XKG4pKTp0aGlzLl9sb2FkU3ZnSWNvbkZyb21Db25maWcobmV3IF9XKHQsbnVsbCkpLnBpcGUoRmUoKHQ9PnRoaXMuX2NhY2hlZEljb25zQnlVcmwuc2V0KGUsdCkpKSxJdCgodD0+TVcodCkpKSl9Z2V0TmFtZWRTdmdJY29uKHQsZT0iIil7Y29uc3Qgbj12VyhlLHQpO2xldCBvPXRoaXMuX3N2Z0ljb25Db25maWdzLmdldChuKTtpZihvKXJldHVybiB0aGlzLl9nZXRTdmdGcm9tQ29uZmlnKG8pO2lmKG89dGhpcy5fZ2V0SWNvbkNvbmZpZ0Zyb21SZXNvbHZlcnMoZSx0KSxvKXJldHVybiB0aGlzLl9zdmdJY29uQ29uZmlncy5zZXQobixvKSx0aGlzLl9nZXRTdmdGcm9tQ29uZmlnKG8pO2NvbnN0IGk9dGhpcy5faWNvblNldENvbmZpZ3MuZ2V0KGUpO3JldHVybiBpP3RoaXMuX2dldFN2Z0Zyb21JY29uU2V0Q29uZmlncyh0LGkpOlJ0KGhXKG4pKX1uZ09uRGVzdHJveSgpe3RoaXMuX3Jlc29sdmVycz1bXSx0aGlzLl9zdmdJY29uQ29uZmlncy5jbGVhcigpLHRoaXMuX2ljb25TZXRDb25maWdzLmNsZWFyKCksdGhpcy5fY2FjaGVkSWNvbnNCeVVybC5jbGVhcigpfV9nZXRTdmdGcm9tQ29uZmlnKHQpe3JldHVybiB0LnN2Z1RleHQ/RXQoTVcodGhpcy5fc3ZnRWxlbWVudEZyb21Db25maWcodCkpKTp0aGlzLl9sb2FkU3ZnSWNvbkZyb21Db25maWcodCkucGlwZShJdCgodD0+TVcodCkpKSl9X2dldFN2Z0Zyb21JY29uU2V0Q29uZmlncyh0LGUpe2NvbnN0IG49dGhpcy5fZXh0cmFjdEljb25XaXRoTmFtZUZyb21BbnlTZXQodCxlKTtyZXR1cm4gbj9FdChuKTokdChlLmZpbHRlcigodD0+IXQuc3ZnVGV4dCkpLm1hcCgodD0+dGhpcy5fbG9hZFN2Z0ljb25TZXRGcm9tQ29uZmlnKHQpLnBpcGUocGUoKGU9Pntjb25zdCBuPXRoaXMuX3Nhbml0aXplci5zYW5pdGl6ZShBcy5SRVNPVVJDRV9VUkwsdC51cmwpO3JldHVybiB0aGlzLl9lcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IobmV3IEVycm9yKGBMb2FkaW5nIGljb24gc2V0IFVSTDogJHtufSBmYWlsZWQ6ICR7ZS5tZXNzYWdlfWApKSxFdChudWxsKX0pKSkpKSkucGlwZShJdCgoKCk9Pntjb25zdCBuPXRoaXMuX2V4dHJhY3RJY29uV2l0aE5hbWVGcm9tQW55U2V0KHQsZSk7aWYoIW4pdGhyb3cgaFcodCk7cmV0dXJuIG59KSkpfV9leHRyYWN0SWNvbldpdGhOYW1lRnJvbUFueVNldCh0LGUpe2ZvcihsZXQgbj1lLmxlbmd0aC0xO24+PTA7bi0tKXtjb25zdCBvPWVbbl07aWYoby5zdmdUZXh0JiZvLnN2Z1RleHQuaW5kZXhPZih0KT4tMSl7Y29uc3QgZT10aGlzLl9zdmdFbGVtZW50RnJvbUNvbmZpZyhvKSxuPXRoaXMuX2V4dHJhY3RTdmdJY29uRnJvbVNldChlLHQsby5vcHRpb25zKTtpZihuKXJldHVybiBufX1yZXR1cm4gbnVsbH1fbG9hZFN2Z0ljb25Gcm9tQ29uZmlnKHQpe3JldHVybiB0aGlzLl9mZXRjaEljb24odCkucGlwZShGZSgoZT0+dC5zdmdUZXh0PWUpKSxJdCgoKCk9PnRoaXMuX3N2Z0VsZW1lbnRGcm9tQ29uZmlnKHQpKSkpfV9sb2FkU3ZnSWNvblNldEZyb21Db25maWcodCl7cmV0dXJuIHQuc3ZnVGV4dD9FdChudWxsKTp0aGlzLl9mZXRjaEljb24odCkucGlwZShGZSgoZT0+dC5zdmdUZXh0PWUpKSl9X2V4dHJhY3RTdmdJY29uRnJvbVNldCh0LGUsbil7Y29uc3Qgbz10LnF1ZXJ5U2VsZWN0b3IoYFtpZD0iJHtlfSJdYCk7aWYoIW8pcmV0dXJuIG51bGw7Y29uc3QgaT1vLmNsb25lTm9kZSghMCk7aWYoaS5yZW1vdmVBdHRyaWJ1dGUoImlkIiksInN2ZyI9PT1pLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHRoaXMuX3NldFN2Z0F0dHJpYnV0ZXMoaSxuKTtpZigic3ltYm9sIj09PWkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSlyZXR1cm4gdGhpcy5fc2V0U3ZnQXR0cmlidXRlcyh0aGlzLl90b1N2Z0VsZW1lbnQoaSksbik7Y29uc3QgYT10aGlzLl9zdmdFbGVtZW50RnJvbVN0cmluZygiPHN2Zz48L3N2Zz4iKTtyZXR1cm4gYS5hcHBlbmRDaGlsZChpKSx0aGlzLl9zZXRTdmdBdHRyaWJ1dGVzKGEsbil9X3N2Z0VsZW1lbnRGcm9tU3RyaW5nKHQpe2NvbnN0IGU9dGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIik7ZS5pbm5lckhUTUw9dDtjb25zdCBuPWUucXVlcnlTZWxlY3Rvcigic3ZnIik7aWYoIW4pdGhyb3cgRXJyb3IoIjxzdmc+IHRhZyBub3QgZm91bmQiKTtyZXR1cm4gbn1fdG9TdmdFbGVtZW50KHQpe2NvbnN0IGU9dGhpcy5fc3ZnRWxlbWVudEZyb21TdHJpbmcoIjxzdmc+PC9zdmc+Iiksbj10LmF0dHJpYnV0ZXM7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0Kyspe2NvbnN0e25hbWU6byx2YWx1ZTppfT1uW3RdOyJpZCIhPT1vJiZlLnNldEF0dHJpYnV0ZShvLGkpfWZvcihsZXQgbj0wO248dC5jaGlsZE5vZGVzLmxlbmd0aDtuKyspdC5jaGlsZE5vZGVzW25dLm5vZGVUeXBlPT09dGhpcy5fZG9jdW1lbnQuRUxFTUVOVF9OT0RFJiZlLmFwcGVuZENoaWxkKHQuY2hpbGROb2Rlc1tuXS5jbG9uZU5vZGUoITApKTtyZXR1cm4gZX1fc2V0U3ZnQXR0cmlidXRlcyh0LGUpe3JldHVybiB0LnNldEF0dHJpYnV0ZSgiZml0IiwiIiksdC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKSx0LnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIiksdC5zZXRBdHRyaWJ1dGUoInByZXNlcnZlQXNwZWN0UmF0aW8iLCJ4TWlkWU1pZCBtZWV0IiksdC5zZXRBdHRyaWJ1dGUoImZvY3VzYWJsZSIsImZhbHNlIiksZSYmZS52aWV3Qm94JiZ0LnNldEF0dHJpYnV0ZSgidmlld0JveCIsZS52aWV3Qm94KSx0fV9mZXRjaEljb24odCl7dmFyIGU7Y29uc3R7dXJsOm4sb3B0aW9uczpvfT10LGk9bnVsbCE9PShlPW51bGw9PW8/dm9pZCAwOm8ud2l0aENyZWRlbnRpYWxzKSYmdm9pZCAwIT09ZSYmZTtpZighdGhpcy5faHR0cENsaWVudCl0aHJvdyhmdW5jdGlvbiBhKCl7cmV0dXJuIEVycm9yKCJDb3VsZCBub3QgZmluZCBIdHRwQ2xpZW50IHByb3ZpZGVyIGZvciB1c2Ugd2l0aCBBbmd1bGFyIE1hdGVyaWFsIGljb25zLiBQbGVhc2UgaW5jbHVkZSB0aGUgSHR0cENsaWVudE1vZHVsZSBmcm9tIEBhbmd1bGFyL2NvbW1vbi9odHRwIGluIHlvdXIgYXBwIGltcG9ydHMuIil9KSgpO2lmKG51bGw9PW4pdGhyb3cgRXJyb3IoYENhbm5vdCBmZXRjaCBpY29uIGZyb20gVVJMICIke259Ii5gKTtjb25zdCByPXRoaXMuX3Nhbml0aXplci5zYW5pdGl6ZShBcy5SRVNPVVJDRV9VUkwsbik7aWYoIXIpdGhyb3cgYlcobik7Y29uc3Qgcz10aGlzLl9pblByb2dyZXNzVXJsRmV0Y2hlcy5nZXQocik7aWYocylyZXR1cm4gcztjb25zdCBsPXRoaXMuX2h0dHBDbGllbnQuZ2V0KHIse3Jlc3BvbnNlVHlwZToidGV4dCIsd2l0aENyZWRlbnRpYWxzOml9KS5waXBlKChmdW5jdGlvbiBjKHQpe3JldHVybiBSKChmdW5jdGlvbihlLG4pe3RyeXtlLnN1YnNjcmliZShuKX1maW5hbGx5e24uYWRkKHQpfX0pKX0pKCgoKT0+dGhpcy5faW5Qcm9ncmVzc1VybEZldGNoZXMuZGVsZXRlKHIpKSksRWUoKSk7cmV0dXJuIHRoaXMuX2luUHJvZ3Jlc3NVcmxGZXRjaGVzLnNldChyLGwpLGx9X2FkZFN2Z0ljb25Db25maWcodCxlLG4pe3JldHVybiB0aGlzLl9zdmdJY29uQ29uZmlncy5zZXQodlcodCxlKSxuKSx0aGlzfV9hZGRTdmdJY29uU2V0Q29uZmlnKHQsZSl7Y29uc3Qgbj10aGlzLl9pY29uU2V0Q29uZmlncy5nZXQodCk7cmV0dXJuIG4/bi5wdXNoKGUpOnRoaXMuX2ljb25TZXRDb25maWdzLnNldCh0LFtlXSksdGhpc31fc3ZnRWxlbWVudEZyb21Db25maWcodCl7aWYoIXQuc3ZnRWxlbWVudCl7Y29uc3QgZT10aGlzLl9zdmdFbGVtZW50RnJvbVN0cmluZyh0LnN2Z1RleHQpO3RoaXMuX3NldFN2Z0F0dHJpYnV0ZXMoZSx0Lm9wdGlvbnMpLHQuc3ZnRWxlbWVudD1lfXJldHVybiB0LnN2Z0VsZW1lbnR9X2dldEljb25Db25maWdGcm9tUmVzb2x2ZXJzKHQsZSl7Zm9yKGxldCBvPTA7bzx0aGlzLl9yZXNvbHZlcnMubGVuZ3RoO28rKyl7Y29uc3QgaT10aGlzLl9yZXNvbHZlcnNbb10oZSx0KTtpZihpKXJldHVybihuPWkpLnVybCYmbi5vcHRpb25zP25ldyBfVyhpLnVybCxudWxsLGkub3B0aW9ucyk6bmV3IF9XKGksbnVsbCl9dmFyIG47Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL319ZnVuY3Rpb24gTVcodCl7cmV0dXJuIHQuY2xvbmVOb2RlKCEwKX1mdW5jdGlvbiB2Vyh0LGUpe3JldHVybiB0KyI6IitlfUNXLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxDVykodnIoUEQsOCksdnIoenYpLHZyKFpfLDgpLHZyKFpzKSl9LENXLsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIG5ldyBDVyh2cihQRCw4KSx2cih6diksdnIoWl8sOCksdnIoWnMpKX0sdG9rZW46Q1cscHJvdmlkZWRJbjoicm9vdCJ9KSxDVy5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlBELGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOnp2fSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTpac31dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQ1csW3t0eXBlOmltLGFyZ3M6W3twcm92aWRlZEluOiJyb290In1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlBELGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOnp2fSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTpac31dfSksbnVsbCksbmV3IFNyLG5ldyBFcixuZXcgU3IsbmV3IFNyO2NvbnN0IHhXPUpJKGNsYXNze2NvbnN0cnVjdG9yKHQpe3RoaXMuX2VsZW1lbnRSZWY9dH19KSxPVz1uZXcgR2EoIm1hdC1pY29uLWxvY2F0aW9uIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbiBQVygpe2NvbnN0IHQ9T3IoWl8pLGU9dD90LmxvY2F0aW9uOm51bGw7cmV0dXJue2dldFBhdGhuYW1lOigpPT5lP2UucGF0aG5hbWUrZS5zZWFyY2g6IiJ9fX0pLHdXPVsiY2xpcC1wYXRoIiwiY29sb3ItcHJvZmlsZSIsInNyYyIsImN1cnNvciIsImZpbGwiLCJmaWx0ZXIiLCJtYXJrZXIiLCJtYXJrZXItc3RhcnQiLCJtYXJrZXItbWlkIiwibWFya2VyLWVuZCIsIm1hc2siLCJzdHJva2UiXSxrVz13Vy5tYXAoKHQ9PmBbJHt0fV1gKSkuam9pbigiLCAiKSxTVz0vXnVybFwoWyciXT8jKC4qPylbJyJdP1wpJC87Y2xhc3MgRFcgZXh0ZW5kcyB4V3tjb25zdHJ1Y3Rvcih0LGUsbixvLGkpe3N1cGVyKHQpLHRoaXMuX2ljb25SZWdpc3RyeT1lLHRoaXMuX2xvY2F0aW9uPW8sdGhpcy5fZXJyb3JIYW5kbGVyPWksdGhpcy5faW5saW5lPSExLHRoaXMuX2N1cnJlbnRJY29uRmV0Y2g9bS5FTVBUWSxufHx0Lm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsInRydWUiKX1nZXQgaW5saW5lKCl7cmV0dXJuIHRoaXMuX2lubGluZX1zZXQgaW5saW5lKHQpe3RoaXMuX2lubGluZT15eih0KX1nZXQgc3ZnSWNvbigpe3JldHVybiB0aGlzLl9zdmdJY29ufXNldCBzdmdJY29uKHQpe3QhPT10aGlzLl9zdmdJY29uJiYodD90aGlzLl91cGRhdGVTdmdJY29uKHQpOnRoaXMuX3N2Z0ljb24mJnRoaXMuX2NsZWFyU3ZnRWxlbWVudCgpLHRoaXMuX3N2Z0ljb249dCl9Z2V0IGZvbnRTZXQoKXtyZXR1cm4gdGhpcy5fZm9udFNldH1zZXQgZm9udFNldCh0KXtjb25zdCBlPXRoaXMuX2NsZWFudXBGb250VmFsdWUodCk7ZSE9PXRoaXMuX2ZvbnRTZXQmJih0aGlzLl9mb250U2V0PWUsdGhpcy5fdXBkYXRlRm9udEljb25DbGFzc2VzKCkpfWdldCBmb250SWNvbigpe3JldHVybiB0aGlzLl9mb250SWNvbn1zZXQgZm9udEljb24odCl7Y29uc3QgZT10aGlzLl9jbGVhbnVwRm9udFZhbHVlKHQpO2UhPT10aGlzLl9mb250SWNvbiYmKHRoaXMuX2ZvbnRJY29uPWUsdGhpcy5fdXBkYXRlRm9udEljb25DbGFzc2VzKCkpfV9zcGxpdEljb25OYW1lKHQpe2lmKCF0KXJldHVyblsiIiwiIl07Y29uc3QgZT10LnNwbGl0KCI6Iik7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDE6cmV0dXJuWyIiLGVbMF1dO2Nhc2UgMjpyZXR1cm4gZTtkZWZhdWx0OnRocm93IEVycm9yKGBJbnZhbGlkIGljb24gbmFtZTogIiR7dH0iYCl9fW5nT25Jbml0KCl7dGhpcy5fdXBkYXRlRm9udEljb25DbGFzc2VzKCl9bmdBZnRlclZpZXdDaGVja2VkKCl7Y29uc3QgdD10aGlzLl9lbGVtZW50c1dpdGhFeHRlcm5hbFJlZmVyZW5jZXM7aWYodCYmdC5zaXplKXtjb25zdCB0PXRoaXMuX2xvY2F0aW9uLmdldFBhdGhuYW1lKCk7dCE9PXRoaXMuX3ByZXZpb3VzUGF0aCYmKHRoaXMuX3ByZXZpb3VzUGF0aD10LHRoaXMuX3ByZXBlbmRQYXRoVG9SZWZlcmVuY2VzKHQpKX19bmdPbkRlc3Ryb3koKXt0aGlzLl9jdXJyZW50SWNvbkZldGNoLnVuc3Vic2NyaWJlKCksdGhpcy5fZWxlbWVudHNXaXRoRXh0ZXJuYWxSZWZlcmVuY2VzJiZ0aGlzLl9lbGVtZW50c1dpdGhFeHRlcm5hbFJlZmVyZW5jZXMuY2xlYXIoKX1fdXNpbmdGb250SWNvbigpe3JldHVybiF0aGlzLnN2Z0ljb259X3NldFN2Z0VsZW1lbnQodCl7dGhpcy5fY2xlYXJTdmdFbGVtZW50KCk7Y29uc3QgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlIik7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XS50ZXh0Q29udGVudCs9IiAiO2NvbnN0IG49dGhpcy5fbG9jYXRpb24uZ2V0UGF0aG5hbWUoKTt0aGlzLl9wcmV2aW91c1BhdGg9bix0aGlzLl9jYWNoZUNoaWxkcmVuV2l0aEV4dGVybmFsUmVmZXJlbmNlcyh0KSx0aGlzLl9wcmVwZW5kUGF0aFRvUmVmZXJlbmNlcyhuKSx0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQodCl9X2NsZWFyU3ZnRWxlbWVudCgpe2NvbnN0IHQ9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O2xldCBlPXQuY2hpbGROb2Rlcy5sZW5ndGg7Zm9yKHRoaXMuX2VsZW1lbnRzV2l0aEV4dGVybmFsUmVmZXJlbmNlcyYmdGhpcy5fZWxlbWVudHNXaXRoRXh0ZXJuYWxSZWZlcmVuY2VzLmNsZWFyKCk7ZS0tOyl7Y29uc3Qgbj10LmNoaWxkTm9kZXNbZV07MT09PW4ubm9kZVR5cGUmJiJzdmciIT09bi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpfHx0LnJlbW92ZUNoaWxkKG4pfX1fdXBkYXRlRm9udEljb25DbGFzc2VzKCl7aWYoIXRoaXMuX3VzaW5nRm9udEljb24oKSlyZXR1cm47Y29uc3QgdD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsZT10aGlzLmZvbnRTZXQ/dGhpcy5faWNvblJlZ2lzdHJ5LmNsYXNzTmFtZUZvckZvbnRBbGlhcyh0aGlzLmZvbnRTZXQpOnRoaXMuX2ljb25SZWdpc3RyeS5nZXREZWZhdWx0Rm9udFNldENsYXNzKCk7ZSE9dGhpcy5fcHJldmlvdXNGb250U2V0Q2xhc3MmJih0aGlzLl9wcmV2aW91c0ZvbnRTZXRDbGFzcyYmdC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX3ByZXZpb3VzRm9udFNldENsYXNzKSxlJiZ0LmNsYXNzTGlzdC5hZGQoZSksdGhpcy5fcHJldmlvdXNGb250U2V0Q2xhc3M9ZSksdGhpcy5mb250SWNvbiE9dGhpcy5fcHJldmlvdXNGb250SWNvbkNsYXNzJiYodGhpcy5fcHJldmlvdXNGb250SWNvbkNsYXNzJiZ0LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fcHJldmlvdXNGb250SWNvbkNsYXNzKSx0aGlzLmZvbnRJY29uJiZ0LmNsYXNzTGlzdC5hZGQodGhpcy5mb250SWNvbiksdGhpcy5fcHJldmlvdXNGb250SWNvbkNsYXNzPXRoaXMuZm9udEljb24pfV9jbGVhbnVwRm9udFZhbHVlKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90LnRyaW0oKS5zcGxpdCgiICIpWzBdOnR9X3ByZXBlbmRQYXRoVG9SZWZlcmVuY2VzKHQpe2NvbnN0IGU9dGhpcy5fZWxlbWVudHNXaXRoRXh0ZXJuYWxSZWZlcmVuY2VzO2UmJmUuZm9yRWFjaCgoKGUsbik9PntlLmZvckVhY2goKGU9PntuLnNldEF0dHJpYnV0ZShlLm5hbWUsYHVybCgnJHt0fSMke2UudmFsdWV9JylgKX0pKX0pKX1fY2FjaGVDaGlsZHJlbldpdGhFeHRlcm5hbFJlZmVyZW5jZXModCl7Y29uc3QgZT10LnF1ZXJ5U2VsZWN0b3JBbGwoa1cpLG49dGhpcy5fZWxlbWVudHNXaXRoRXh0ZXJuYWxSZWZlcmVuY2VzPXRoaXMuX2VsZW1lbnRzV2l0aEV4dGVybmFsUmVmZXJlbmNlc3x8bmV3IE1hcDtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl3Vy5mb3JFYWNoKChvPT57Y29uc3QgaT1lW3RdLGE9aS5nZXRBdHRyaWJ1dGUobykscj1hP2EubWF0Y2goU1cpOm51bGw7aWYocil7bGV0IHQ9bi5nZXQoaSk7dHx8KHQ9W10sbi5zZXQoaSx0KSksdC5wdXNoKHtuYW1lOm8sdmFsdWU6clsxXX0pfX0pKX1fdXBkYXRlU3ZnSWNvbih0KXtpZih0aGlzLl9zdmdOYW1lc3BhY2U9bnVsbCx0aGlzLl9zdmdOYW1lPW51bGwsdGhpcy5fY3VycmVudEljb25GZXRjaC51bnN1YnNjcmliZSgpLHQpe2NvbnN0W2Usbl09dGhpcy5fc3BsaXRJY29uTmFtZSh0KTtlJiYodGhpcy5fc3ZnTmFtZXNwYWNlPWUpLG4mJih0aGlzLl9zdmdOYW1lPW4pLHRoaXMuX2N1cnJlbnRJY29uRmV0Y2g9dGhpcy5faWNvblJlZ2lzdHJ5LmdldE5hbWVkU3ZnSWNvbihuLGUpLnBpcGUoYmUoMSkpLnN1YnNjcmliZSgodD0+dGhpcy5fc2V0U3ZnRWxlbWVudCh0KSksKHQ9Pnt0aGlzLl9lcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IobmV3IEVycm9yKGBFcnJvciByZXRyaWV2aW5nIGljb24gJHtlfToke259ISAke3QubWVzc2FnZX1gKSl9KSl9fX1EVy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8RFcpKFNtKGhnKSxTbShDVyksTmEoImFyaWEtaGlkZGVuIiksU20oT1cpLFNtKFpzKSl9LERXLsm1Y21wPXRvKHt0eXBlOkRXLHNlbGVjdG9yczpbWyJtYXQtaWNvbiJdXSxob3N0QXR0cnM6WyJyb2xlIiwiaW1nIiwxLCJtYXQtaWNvbiIsIm5vdHJhbnNsYXRlIl0saG9zdFZhcnM6Nyxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmKGpwKCJkYXRhLW1hdC1pY29uLXR5cGUiLG4uX3VzaW5nRm9udEljb24oKT8iZm9udCI6InN2ZyIpKCJkYXRhLW1hdC1pY29uLW5hbWUiLG4uX3N2Z05hbWV8fG4uZm9udEljb24pKCJkYXRhLW1hdC1pY29uLW5hbWVzcGFjZSIsbi5fc3ZnTmFtZXNwYWNlfHxuLmZvbnRTZXQpLHB1KCJtYXQtaWNvbi1pbmxpbmUiLG4uaW5saW5lKSgibWF0LWljb24tbm8tY29sb3IiLCJwcmltYXJ5IiE9PW4uY29sb3ImJiJhY2NlbnQiIT09bi5jb2xvciYmIndhcm4iIT09bi5jb2xvcikpfSxpbnB1dHM6e2NvbG9yOiJjb2xvciIsaW5saW5lOiJpbmxpbmUiLHN2Z0ljb246InN2Z0ljb24iLGZvbnRTZXQ6ImZvbnRTZXQiLGZvbnRJY29uOiJmb250SWNvbiJ9LGV4cG9ydEFzOlsibWF0SWNvbiJdLGZlYXR1cmVzOlt4cF0sbmdDb250ZW50U2VsZWN0b3JzOlsiKiJdLGRlY2xzOjEsdmFyczowLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabSgpLFhtKDApKX0sc3R5bGVzOlsiLm1hdC1pY29ue2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtkaXNwbGF5OmlubGluZS1ibG9jaztmaWxsOmN1cnJlbnRDb2xvcjtoZWlnaHQ6MjRweDt3aWR0aDoyNHB4fS5tYXQtaWNvbi5tYXQtaWNvbi1pbmxpbmV7Zm9udC1zaXplOmluaGVyaXQ7aGVpZ2h0OmluaGVyaXQ7bGluZS1oZWlnaHQ6aW5oZXJpdDt3aWR0aDppbmhlcml0fVtkaXI9cnRsXSAubWF0LWljb24tcnRsLW1pcnJvcnt0cmFuc2Zvcm06c2NhbGUoLTEsIDEpfS5tYXQtZm9ybS1maWVsZDpub3QoLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5KSAubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbiwubWF0LWZvcm0tZmllbGQ6bm90KC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSkgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb257ZGlzcGxheTpibG9ja30ubWF0LWZvcm0tZmllbGQ6bm90KC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSkgLm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbiwubWF0LWZvcm0tZmllbGQ6bm90KC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSkgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbnttYXJnaW46YXV0b31cbiJdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLERXLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOkNXfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6amEsYXJnczpbImFyaWEtaGlkZGVuIl19XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W09XXX1dfSx7dHlwZTpac31dLERXLnByb3BEZWNvcmF0b3JzPXtpbmxpbmU6W3t0eXBlOnh5fV0sc3ZnSWNvbjpbe3R5cGU6eHl9XSxmb250U2V0Olt7dHlwZTp4eX1dLGZvbnRJY29uOlt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKERXLFt7dHlwZTpNeSxhcmdzOlt7dGVtcGxhdGU6IjxuZy1jb250ZW50PjwvbmctY29udGVudD4iLHNlbGVjdG9yOiJtYXQtaWNvbiIsZXhwb3J0QXM6Im1hdEljb24iLGlucHV0czpbImNvbG9yIl0saG9zdDp7cm9sZToiaW1nIixjbGFzczoibWF0LWljb24gbm90cmFuc2xhdGUiLCJbYXR0ci5kYXRhLW1hdC1pY29uLXR5cGVdIjonX3VzaW5nRm9udEljb24oKSA/ICJmb250IiA6ICJzdmciJywiW2F0dHIuZGF0YS1tYXQtaWNvbi1uYW1lXSI6Il9zdmdOYW1lIHx8IGZvbnRJY29uIiwiW2F0dHIuZGF0YS1tYXQtaWNvbi1uYW1lc3BhY2VdIjoiX3N2Z05hbWVzcGFjZSB8fCBmb250U2V0IiwiW2NsYXNzLm1hdC1pY29uLWlubGluZV0iOiJpbmxpbmUiLCJbY2xhc3MubWF0LWljb24tbm8tY29sb3JdIjonY29sb3IgIT09ICJwcmltYXJ5IiAmJiBjb2xvciAhPT0gImFjY2VudCIgJiYgY29sb3IgIT09ICJ3YXJuIid9LGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLHN0eWxlczpbIi5tYXQtaWNvbntiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7ZmlsbDpjdXJyZW50Q29sb3I7aGVpZ2h0OjI0cHg7d2lkdGg6MjRweH0ubWF0LWljb24ubWF0LWljb24taW5saW5le2ZvbnQtc2l6ZTppbmhlcml0O2hlaWdodDppbmhlcml0O2xpbmUtaGVpZ2h0OmluaGVyaXQ7d2lkdGg6aW5oZXJpdH1bZGlyPXJ0bF0gLm1hdC1pY29uLXJ0bC1taXJyb3J7dHJhbnNmb3JtOnNjYWxlKC0xLCAxKX0ubWF0LWZvcm0tZmllbGQ6bm90KC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSkgLm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29ue2Rpc3BsYXk6YmxvY2t9Lm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb257bWFyZ2luOmF1dG99XG4iXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTpDV30se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmphLGFyZ3M6WyJhcmlhLWhpZGRlbiJdfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltPV119XX0se3R5cGU6WnN9XX0pLHtpbmxpbmU6W3t0eXBlOnh5fV0sc3ZnSWNvbjpbe3R5cGU6eHl9XSxmb250U2V0Olt7dHlwZTp4eX1dLGZvbnRJY29uOlt7dHlwZTp4eX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBFV3t9RVcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEVXKX0sRVcuybVtb2Q9YW8oe3R5cGU6RVd9KSxFVy7JtWluaj12bih7aW1wb3J0czpbW1hJXSxYSV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEVXLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbWEldLGV4cG9ydHM6W0RXLFhJXSxkZWNsYXJhdGlvbnM6W0RXXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKEVXLHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bRFddfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1hJXX0sZXhwb3J0czpmdW5jdGlvbigpe3JldHVybltEVyxYSV19fSk7Y2xhc3MgUld7Y29uc3RydWN0b3IodCl7dGhpcy5kaWFsb2dSZWY9dCx0aGlzLnRlbnNvcmJvYXJkRG90RGV2VXJsPSJodHRwczovL3RlbnNvcmJvYXJkLmRldi8/dXRtX3NvdXJjZT10ZW5zb3Jib2FyZCJ9b25DbG9zZSgpe3RoaXMuZGlhbG9nUmVmLmNsb3NlKCl9Z2V0Q29tbWFuZFRleHQoKXtyZXR1cm4gdGhpcy5sb2dkaXI/InRlbnNvcmJvYXJkIGRldiB1cGxvYWQgLS1sb2dkaXIgXFxcbiAgICAnIit0aGlzLmxvZ2Rpci5yZXBsYWNlKC8nL2csIidcXCcnIikrIiciOiJ0ZW5zb3Jib2FyZCBkZXYgdXBsb2FkIC0tbG9nZGlyIHtsb2dkaXJ9In19UlcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFJXKShTbShYRykpfSxSVy7JtWNtcD10byh7dHlwZTpSVyxzZWxlY3RvcnM6W1sidGJkZXYtdXBsb2FkLWRpYWxvZy1jb21wb25lbnQiXV0saW5wdXRzOntsb2dkaXI6ImxvZ2RpciJ9LGRlY2xzOjIxLHZhcnM6NCxjb25zdHM6W1sidGFyZ2V0IiwiX2JsYW5rIiwicmVsIiwibm9yZWZlcnJlciBub29wZW5lciIsMSwiYW5jaG9yLXRleHQiLDMsImhyZWYiXSxbMSwiY29tbWFuZCJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwidGl0bGUiLCJDbGljayB0byBjb3B5IHRoZSBjb21tYW5kIiwxLCJjb21tYW5kLWNvcHkiLDMsImNka0NvcHlUb0NsaXBib2FyZCJdLFsic3ZnSWNvbiIsImNvbnRlbnRfY29weV8yNHB4Il0sWzEsImJvdHRvbS1idXR0b25zIl0sWyJtYXQtZmxhdC1idXR0b24iLCIiLDEsImNsb3NlLWJ1dHRvbiIsMywiY2xpY2siXSxbIm1hdC1mbGF0LWJ1dHRvbiIsIiIsInRhcmdldCIsIl9ibGFuayIsInJlbCIsIm5vcmVmZXJyZXIgbm9vcGVuZXIiLDEsImxlYXJuLW1vcmUtYnV0dG9uIiwzLCJocmVmIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJoMyIpLGt1KDEsIlVwbG9hZCB0byBUZW5zb3JCb2FyZC5kZXYiKSxBbSgpLFJtKDIsInAiKSxSbSgzLCJhIiwwKSxrdSg0LCIgVGVuc29yQm9hcmQuZGV2IiksQW0oKSxrdSg1LCIgZW5hYmxlcyB5b3UgdG8gZWFzaWx5IGhvc3QsIHRyYWNrLCBhbmQgc2hhcmUgeW91ciBNTCBleHBlcmltZW50cyB3aXRoIGV2ZXJ5b25lLiBZb3UgY2FuIHNoYXJlIGEgbGluayB0byB0aGUgdXBsb2FkZWQgVGVuc29yQm9hcmQgaW4gcGFwZXJzLCBibG9nIHBvc3RzLCBhbmQgc29jaWFsIG1lZGlhLiBUaGlzIGNhbiBzaG93Y2FzZSB0aGUgcmVzdWx0cyBtb3JlIGVmZmVjdGl2ZWx5IGFuZCBoZWxwcyByZXByb2R1Y2liaWxpdHkuXG4iKSxBbSgpLFJtKDYsInAiKSxrdSg3LCJUbyB1cGxvYWQgYSBsb2dkaXIgdG8gVGVuc29yQm9hcmQuZGV2LCBydW4gdGhlIGNvbW1hbmQ6IiksQW0oKSxSbSg4LCJkaXYiLDEpLFJtKDksInByZSIpLFJtKDEwLCJjb2RlIiksa3UoMTEpLEFtKCksQW0oKSxSbSgxMiwiYnV0dG9uIiwyKSxUbSgxMywibWF0LWljb24iLDMpLEFtKCksQW0oKSxSbSgxNCwicCIpLGt1KDE1LCIgT25seSBjZXJ0YWluIHBsdWdpbnMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuIFVwbG9hZGVkIFRlbnNvckJvYXJkcyBhcmUgcHVibGljIGFuZCB2aXNpYmxlIHRvIGV2ZXJ5b25lOyBkbyBub3QgdXBsb2FkIHNlbnNpdGl2ZSBkYXRhLlxuIiksQW0oKSxSbSgxNiwiZGl2Iiw0KSxSbSgxNywiYnV0dG9uIiw1KSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25DbG9zZSgpfSkpLGt1KDE4LCIgQ2xvc2UgIiksQW0oKSxSbSgxOSwiYSIsNiksa3UoMjAsIiBMZWFybiBtb3JlICIpLEFtKCksQW0oKSksMiZlJiYocmMoMyksS20oImhyZWYiLG4udGVuc29yYm9hcmREb3REZXZVcmwsVHMpLHJjKDgpLFN1KG4uZ2V0Q29tbWFuZFRleHQoKSkscmMoMSksRG0oImNka0NvcHlUb0NsaXBib2FyZCIsbi5nZXRDb21tYW5kVGV4dCgpKSxyYyg3KSxLbSgiaHJlZiIsbi50ZW5zb3Jib2FyZERvdERldlVybCxUcykpfSxkaXJlY3RpdmVzOltYSCxmVyxEVyxLSF0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9ZGl2W19uZ2NvbnRlbnQtJUNPTVAlXSwgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjE2cHggMH1bX25naG9zdC0lQ09NUCVdID4gW19uZ2NvbnRlbnQtJUNPTVAlXTpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9W19uZ2hvc3QtJUNPTVAlXSA+IFtfbmdjb250ZW50LSVDT01QJV06bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9aDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMDtsaW5lLWhlaWdodDoxLjV9cFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoxLjV9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9LmFuY2hvci10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXt0ZXh0LWRlY29yYXRpb246bm9uZX0uY29tbWFuZFtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2JhY2tncm91bmQ6I2Y1ZjZmNztib3JkZXItcmFkaXVzOjRweDtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47cGFkZGluZzoycHggMTJweH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuY29tbWFuZFtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5jb21tYW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiM2MTYxNjF9cHJlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdy14OmF1dG99Y29kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS41fS5ib3R0b20tYnV0dG9uc1tfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9LmNsb3NlLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bWFyZ2luLXJpZ2h0OjhweH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuY2xvc2UtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmNsb3NlLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9W19uZ2hvc3QtJUNPTVAlXSAgIC5sZWFybi1tb3JlLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzE5NzZkMjt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9Ym9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmxlYXJuLW1vcmUtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNDJhNWY1fSddfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChSVyxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJ0YmRldi11cGxvYWQtZGlhbG9nLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vdGJkZXZfdXBsb2FkX2RpYWxvZ19jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi90YmRldl91cGxvYWRfZGlhbG9nX2NvbXBvbmVudC5jc3MiXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlhHfV19KSx7bG9nZGlyOlt7dHlwZTp4eX1dfSk7Y29uc3QgQVc9WncoeFIsKHQ9PnQuZGF0YV9sb2NhdGlvbikpO2NsYXNzIFRXe2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLmxvZ2RpciQ9dGhpcy5zdG9yZS5waXBlKEZ3KEFXKSl9fWZ1bmN0aW9uIE5XKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiYnV0dG9uIiwxKSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLFltKCkub3BlbkRpYWxvZygpfSkpLFJtKDEsInNwYW4iLDIpLFRtKDIsIm1hdC1pY29uIiwzKSxrdSgzLCIgVXBsb2FkICIpLEFtKCksQW0oKX19VFcuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFRXKShTbShJdykpfSxUVy7JtWNtcD10byh7dHlwZTpUVyxzZWxlY3RvcnM6W1sidGJkZXYtdXBsb2FkLWRpYWxvZyJdXSxkZWNsczoyLHZhcnM6Myxjb25zdHM6W1szLCJsb2dkaXIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFRtKDAsInRiZGV2LXVwbG9hZC1kaWFsb2ctY29tcG9uZW50IiwwKSxBaCgxLCJhc3luYyIpKSwyJmUmJkRtKCJsb2dkaXIiLFRoKDEsMSxuLmxvZ2RpciQpKX0sZGlyZWN0aXZlczpbUlddLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChUVyxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJ0YmRldi11cGxvYWQtZGlhbG9nIix0ZW1wbGF0ZTonXG4gICAgPHRiZGV2LXVwbG9hZC1kaWFsb2ctY29tcG9uZW50XG4gICAgICBbbG9nZGlyXT0ibG9nZGlyJCB8IGFzeW5jIlxuICAgID48L3RiZGV2LXVwbG9hZC1kaWFsb2ctY29tcG9uZW50PlxuICAnfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NvbnN0IHpXPVsibG9jYWxob3N0IiwiMTI3LjAuMC4xIl07Y2xhc3MgSVd7Y29uc3RydWN0b3IodCxlKXt0aGlzLndpbmRvdz10LHRoaXMuZGlhbG9nPWUsdGhpcy5zaG93bj16Vy5pbmNsdWRlcyh0LmxvY2F0aW9uLmhvc3RuYW1lKX1vcGVuRGlhbG9nKCl7dGhpcy5kaWFsb2cub3BlbihUVyx7d2lkdGg6IjU2MHB4In0pfX1mdW5jdGlvbiBIVyh0LGUpezEmdCYmKHFpKCksUm0oMCwic3ZnIiwyKSxUbSgxLCJwb2x5Z29uIiwzKSxBbSgpKX1JVy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SVcpKFNtKCJ3aW5kb3ciKSxTbShvVykpfSxJVy7JtWNtcD10byh7dHlwZTpJVyxzZWxlY3RvcnM6W1sidGJkZXYtdXBsb2FkLWJ1dHRvbiJdXSxob3N0VmFyczoyLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZwdSgic2hvd24iLG4uc2hvd24pfSxkZWNsczoxLHZhcnM6MSxjb25zdHM6W1sibWF0LXN0cm9rZWQtYnV0dG9uIiwiIiwzLCJjbGljayIsNCwibmdJZiJdLFsibWF0LXN0cm9rZWQtYnV0dG9uIiwiIiwzLCJjbGljayJdLFsxLCJidXR0b24tY29udGVudHMiXSxbInN2Z0ljb24iLCJpbmZvX291dGxpbmVfMjRweCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiZRcCgwLE5XLDQsMCwiYnV0dG9uIiwwKSwyJmUmJkRtKCJuZ0lmIixuLnNob3duKX0sZGlyZWN0aXZlczpbZE0sWEgsRFddLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV0gICBidXR0b24ubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Ym9yZGVyOjFweCBzb2xpZCAjZWJlYmVifWJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIGJ1dHRvbi5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2VmNmMwMH0uYnV0dG9uLWNvbnRlbnRzW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX1tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXJpZ2h0OjZweH0nXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoSVcsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoidGJkZXYtdXBsb2FkLWJ1dHRvbiIsdGVtcGxhdGVVcmw6Ii4vdGJkZXZfdXBsb2FkX2J1dHRvbl9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi90YmRldl91cGxvYWRfYnV0dG9uX2NvbXBvbmVudC5jc3MiXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOldpbmRvdyxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOlsid2luZG93Il19XX0se3R5cGU6b1d9XX0pLHtzaG93bjpbe3R5cGU6UHksYXJnczpbImNsYXNzLnNob3duIl19XX0pO2NvbnN0IEZXPVsiKiJdO2Z1bmN0aW9uIExXKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2IiwwKSxWbSgia2V5ZG93biIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkuX2hhbmRsZUtleWRvd24obil9KSkoImNsaWNrIiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgpLmNsb3NlZC5lbWl0KCJjbGljayIpfSkpKCJAdHJhbnNmb3JtTWVudS5zdGFydCIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkuX29uQW5pbWF0aW9uU3RhcnQobil9KSkoIkB0cmFuc2Zvcm1NZW51LmRvbmUiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLl9vbkFuaW1hdGlvbkRvbmUobil9KSksUm0oMSwiZGl2IiwxKSxYbSgyKSxBbSgpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKCk7RG0oImlkIix0LnBhbmVsSWQpKCJuZ0NsYXNzIix0Ll9jbGFzc0xpc3QpKCJAdHJhbnNmb3JtTWVudSIsdC5fcGFuZWxBbmltYXRpb25TdGF0ZSksanAoImFyaWEtbGFiZWwiLHQuYXJpYUxhYmVsfHxudWxsKSgiYXJpYS1sYWJlbGxlZGJ5Iix0LmFyaWFMYWJlbGxlZGJ5fHxudWxsKSgiYXJpYS1kZXNjcmliZWRieSIsdC5hcmlhRGVzY3JpYmVkYnl8fG51bGwpfX1jb25zdCBCVz17dHJhbnNmb3JtTWVudTpueCgidHJhbnNmb3JtTWVudSIsW3J4KCJ2b2lkIixheCh7b3BhY2l0eTowLHRyYW5zZm9ybToic2NhbGUoMC44KSJ9KSksbHgoInZvaWQgPT4gZW50ZXIiLG94KCIxMjBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKSIsYXgoe29wYWNpdHk6MSx0cmFuc2Zvcm06InNjYWxlKDEpIn0pKSksbHgoIiogPT4gdm9pZCIsb3goIjEwMG1zIDI1bXMgbGluZWFyIixheCh7b3BhY2l0eTowfSkpKV0pLGZhZGVJbkl0ZW1zOm54KCJmYWRlSW5JdGVtcyIsW3J4KCJzaG93aW5nIixheCh7b3BhY2l0eToxfSkpLGx4KCJ2b2lkID0+ICoiLFtheCh7b3BhY2l0eTowfSksb3goIjQwMG1zIDEwMG1zIGN1YmljLWJlemllcigwLjU1LCAwLCAwLjU1LCAwLjIpIildKV0pfSxWVz1uZXcgR2EoIk1hdE1lbnVDb250ZW50Iik7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIGpXe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIpe3RoaXMuX3RlbXBsYXRlPXQsdGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyPWUsdGhpcy5fYXBwUmVmPW4sdGhpcy5faW5qZWN0b3I9byx0aGlzLl92aWV3Q29udGFpbmVyUmVmPWksdGhpcy5fZG9jdW1lbnQ9YSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZj1yLHRoaXMuX2F0dGFjaGVkPW5ldyBJfWF0dGFjaCh0PXt9KXt0aGlzLl9wb3J0YWx8fCh0aGlzLl9wb3J0YWw9bmV3IHhGKHRoaXMuX3RlbXBsYXRlLHRoaXMuX3ZpZXdDb250YWluZXJSZWYpKSx0aGlzLmRldGFjaCgpLHRoaXMuX291dGxldHx8KHRoaXMuX291dGxldD1uZXcgd0YodGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLHRoaXMuX2FwcFJlZix0aGlzLl9pbmplY3RvcikpO2NvbnN0IGU9dGhpcy5fdGVtcGxhdGUuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O2UucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5fb3V0bGV0Lm91dGxldEVsZW1lbnQsZSksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYmJnRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpLHRoaXMuX3BvcnRhbC5hdHRhY2godGhpcy5fb3V0bGV0LHQpLHRoaXMuX2F0dGFjaGVkLm5leHQoKX1kZXRhY2goKXt0aGlzLl9wb3J0YWwuaXNBdHRhY2hlZCYmdGhpcy5fcG9ydGFsLmRldGFjaCgpfW5nT25EZXN0cm95KCl7dGhpcy5fb3V0bGV0JiZ0aGlzLl9vdXRsZXQuZGlzcG9zZSgpfX1qVy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8alcpKFNtKFhnKSxTbSh1ZyksU20oT18pLFNtKHJwKSxTbShlaCksU20oWl8pLFNtKFVnKSl9LGpXLsm1ZGlyPWxvKHt0eXBlOmpXLHNlbGVjdG9yczpbWyJuZy10ZW1wbGF0ZSIsIm1hdE1lbnVDb250ZW50IiwiIl1dLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6VlcsdXNlRXhpc3Rpbmc6ald9XSldfSksalcuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpYZ30se3R5cGU6dWd9LHt0eXBlOk9ffSx7dHlwZTpycH0se3R5cGU6ZWh9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6VWd9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGpXLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6Im5nLXRlbXBsYXRlW21hdE1lbnVDb250ZW50XSIscHJvdmlkZXJzOlt7cHJvdmlkZTpWVyx1c2VFeGlzdGluZzpqV31dfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6WGd9LHt0eXBlOnVnfSx7dHlwZTpPX30se3R5cGU6cnB9LHt0eXBlOmVofSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOlVnfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IFVXPW5ldyBHYSgiTUFUX01FTlVfUEFORUwiKSxHVz1RSShLSShjbGFzc3t9KSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIFdXIGV4dGVuZHMgR1d7Y29uc3RydWN0b3IodCxlLG4sbyxpKXtzdXBlcigpLHRoaXMuX2VsZW1lbnRSZWY9dCx0aGlzLl9mb2N1c01vbml0b3I9bix0aGlzLl9wYXJlbnRNZW51PW8sdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWY9aSx0aGlzLnJvbGU9Im1lbnVpdGVtIix0aGlzLl9ob3ZlcmVkPW5ldyBJLHRoaXMuX2ZvY3VzZWQ9bmV3IEksdGhpcy5faGlnaGxpZ2h0ZWQ9ITEsdGhpcy5fdHJpZ2dlcnNTdWJtZW51PSExLG8mJm8uYWRkSXRlbSYmby5hZGRJdGVtKHRoaXMpfWZvY3VzKHQsZSl7dGhpcy5fZm9jdXNNb25pdG9yJiZ0P3RoaXMuX2ZvY3VzTW9uaXRvci5mb2N1c1ZpYSh0aGlzLl9nZXRIb3N0RWxlbWVudCgpLHQsZSk6dGhpcy5fZ2V0SG9zdEVsZW1lbnQoKS5mb2N1cyhlKSx0aGlzLl9mb2N1c2VkLm5leHQodGhpcyl9bmdBZnRlclZpZXdJbml0KCl7dGhpcy5fZm9jdXNNb25pdG9yJiZ0aGlzLl9mb2N1c01vbml0b3IubW9uaXRvcih0aGlzLl9lbGVtZW50UmVmLCExKX1uZ09uRGVzdHJveSgpe3RoaXMuX2ZvY3VzTW9uaXRvciYmdGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKHRoaXMuX2VsZW1lbnRSZWYpLHRoaXMuX3BhcmVudE1lbnUmJnRoaXMuX3BhcmVudE1lbnUucmVtb3ZlSXRlbSYmdGhpcy5fcGFyZW50TWVudS5yZW1vdmVJdGVtKHRoaXMpLHRoaXMuX2hvdmVyZWQuY29tcGxldGUoKSx0aGlzLl9mb2N1c2VkLmNvbXBsZXRlKCl9X2dldFRhYkluZGV4KCl7cmV0dXJuIHRoaXMuZGlzYWJsZWQ/Ii0xIjoiMCJ9X2dldEhvc3RFbGVtZW50KCl7cmV0dXJuIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudH1fY2hlY2tEaXNhYmxlZCh0KXt0aGlzLmRpc2FibGVkJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCkpfV9oYW5kbGVNb3VzZUVudGVyKCl7dGhpcy5faG92ZXJlZC5uZXh0KHRoaXMpfWdldExhYmVsKCl7dmFyIHQsZTtjb25zdCBuPXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbG9uZU5vZGUoITApLG89bi5xdWVyeVNlbGVjdG9yQWxsKCJtYXQtaWNvbiwgLm1hdGVyaWFsLWljb25zIik7Zm9yKGxldCBlPTA7ZTxvLmxlbmd0aDtlKyspe2NvbnN0IG49b1tlXTtudWxsPT09KHQ9bi5wYXJlbnROb2RlKXx8dm9pZCAwPT09dHx8dC5yZW1vdmVDaGlsZChuKX1yZXR1cm4obnVsbD09PShlPW4udGV4dENvbnRlbnQpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnRyaW0oKSl8fCIifV9zZXRIaWdobGlnaHRlZCh0KXt2YXIgZTt0aGlzLl9oaWdobGlnaHRlZD10LG51bGw9PT0oZT10aGlzLl9jaGFuZ2VEZXRlY3RvclJlZil8fHZvaWQgMD09PWV8fGUubWFya0ZvckNoZWNrKCl9fVdXLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxXVykoU20oaGcpLFNtKFpfKSxTbShTSSksU20oVVcsOCksU20oVWcpKX0sV1cuybVjbXA9dG8oe3R5cGU6V1csc2VsZWN0b3JzOltbIiIsIm1hdC1tZW51LWl0ZW0iLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtZm9jdXMtaW5kaWNhdG9yIl0saG9zdFZhcnM6MTAsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJlZtKCJjbGljayIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX2NoZWNrRGlzYWJsZWQoZSl9KSkoIm1vdXNlZW50ZXIiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX2hhbmRsZU1vdXNlRW50ZXIoKX0pKSwyJmUmJihqcCgicm9sZSIsbi5yb2xlKSgidGFiaW5kZXgiLG4uX2dldFRhYkluZGV4KCkpKCJhcmlhLWRpc2FibGVkIixuLmRpc2FibGVkLnRvU3RyaW5nKCkpKCJkaXNhYmxlZCIsbi5kaXNhYmxlZHx8bnVsbCkscHUoIm1hdC1tZW51LWl0ZW0iLCEwKSgibWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZCIsbi5faGlnaGxpZ2h0ZWQpKCJtYXQtbWVudS1pdGVtLXN1Ym1lbnUtdHJpZ2dlciIsbi5fdHJpZ2dlcnNTdWJtZW51KSl9LGlucHV0czp7ZGlzYWJsZWQ6ImRpc2FibGVkIixkaXNhYmxlUmlwcGxlOiJkaXNhYmxlUmlwcGxlIixyb2xlOiJyb2xlIn0sZXhwb3J0QXM6WyJtYXRNZW51SXRlbSJdLGZlYXR1cmVzOlt4cF0sYXR0cnM6WyJtYXQtbWVudS1pdGVtIiwiIl0sbmdDb250ZW50U2VsZWN0b3JzOkZXLGRlY2xzOjMsdmFyczozLGNvbnN0czpbWyJtYXRSaXBwbGUiLCIiLDEsIm1hdC1tZW51LXJpcHBsZSIsMywibWF0UmlwcGxlRGlzYWJsZWQiLCJtYXRSaXBwbGVUcmlnZ2VyIl0sWyJjbGFzcyIsIm1hdC1tZW51LXN1Ym1lbnUtaWNvbiIsInZpZXdCb3giLCIwIDAgNSAxMCIsImZvY3VzYWJsZSIsImZhbHNlIiw0LCJuZ0lmIl0sWyJ2aWV3Qm94IiwiMCAwIDUgMTAiLCJmb2N1c2FibGUiLCJmYWxzZSIsMSwibWF0LW1lbnUtc3VibWVudS1pY29uIl0sWyJwb2ludHMiLCIwLDAgNSw1IDAsMTAiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFptKCksWG0oMCksVG0oMSwiZGl2IiwwKSxRcCgyLEhXLDIsMCwic3ZnIiwxKSksMiZlJiYocmMoMSksRG0oIm1hdFJpcHBsZURpc2FibGVkIixuLmRpc2FibGVSaXBwbGV8fG4uZGlzYWJsZWQpKCJtYXRSaXBwbGVUcmlnZ2VyIixuLl9nZXRIb3N0RWxlbWVudCgpKSxyYygxKSxEbSgibmdJZiIsbi5fdHJpZ2dlcnNTdWJtZW51KSl9LGRpcmVjdGl2ZXM6W2tILGRNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSxXVy5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOlNJfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbVVddfSx7dHlwZTpTcn1dfSx7dHlwZTpVZ31dLFdXLnByb3BEZWNvcmF0b3JzPXtyb2xlOlt7dHlwZTp4eX1dLF9jaGVja0Rpc2FibGVkOlt7dHlwZTp3eSxhcmdzOlsiY2xpY2siLFsiJGV2ZW50Il1dfV0sX2hhbmRsZU1vdXNlRW50ZXI6W3t0eXBlOnd5LGFyZ3M6WyJtb3VzZWVudGVyIl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChXVyxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJbbWF0LW1lbnUtaXRlbV0iLGV4cG9ydEFzOiJtYXRNZW51SXRlbSIsaW5wdXRzOlsiZGlzYWJsZWQiLCJkaXNhYmxlUmlwcGxlIl0saG9zdDp7IlthdHRyLnJvbGVdIjoicm9sZSIsIltjbGFzcy5tYXQtbWVudS1pdGVtXSI6InRydWUiLCJbY2xhc3MubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZF0iOiJfaGlnaGxpZ2h0ZWQiLCJbY2xhc3MubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXJdIjoiX3RyaWdnZXJzU3VibWVudSIsIlthdHRyLnRhYmluZGV4XSI6Il9nZXRUYWJJbmRleCgpIiwiW2F0dHIuYXJpYS1kaXNhYmxlZF0iOiJkaXNhYmxlZC50b1N0cmluZygpIiwiW2F0dHIuZGlzYWJsZWRdIjoiZGlzYWJsZWQgfHwgbnVsbCIsY2xhc3M6Im1hdC1mb2N1cy1pbmRpY2F0b3IifSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLGVuY2Fwc3VsYXRpb246SG4uTm9uZSx0ZW1wbGF0ZTonPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPGRpdiBjbGFzcz0ibWF0LW1lbnUtcmlwcGxlIiBtYXRSaXBwbGVcbiAgICAgW21hdFJpcHBsZURpc2FibGVkXT0iZGlzYWJsZVJpcHBsZSB8fCBkaXNhYmxlZCJcbiAgICAgW21hdFJpcHBsZVRyaWdnZXJdPSJfZ2V0SG9zdEVsZW1lbnQoKSI+XG48L2Rpdj5cblxuPHN2Z1xuICAqbmdJZj0iX3RyaWdnZXJzU3VibWVudSJcbiAgY2xhc3M9Im1hdC1tZW51LXN1Ym1lbnUtaWNvbiJcbiAgdmlld0JveD0iMCAwIDUgMTAiXG4gIGZvY3VzYWJsZT0iZmFsc2UiPjxwb2x5Z29uIHBvaW50cz0iMCwwIDUsNSAwLDEwIi8+PC9zdmc+XG4nfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6U0l9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltVV119LHt0eXBlOlNyfV19LHt0eXBlOlVnfV19KSx7cm9sZTpbe3R5cGU6eHl9XSxfY2hlY2tEaXNhYmxlZDpbe3R5cGU6d3ksYXJnczpbImNsaWNrIixbIiRldmVudCJdXX1dLF9oYW5kbGVNb3VzZUVudGVyOlt7dHlwZTp3eSxhcmdzOlsibW91c2VlbnRlciJdfV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IFlXPW5ldyBHYSgibWF0LW1lbnUtZGVmYXVsdC1vcHRpb25zIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbiBxVygpe3JldHVybntvdmVybGFwVHJpZ2dlcjohMSx4UG9zaXRpb246ImFmdGVyIix5UG9zaXRpb246ImJlbG93IixiYWNrZHJvcENsYXNzOiJjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCJ9fX0pO2xldCBaVz0wO2NsYXNzIFhXe2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLl9lbGVtZW50UmVmPXQsdGhpcy5fbmdab25lPWUsdGhpcy5fZGVmYXVsdE9wdGlvbnM9bix0aGlzLl94UG9zaXRpb249dGhpcy5fZGVmYXVsdE9wdGlvbnMueFBvc2l0aW9uLHRoaXMuX3lQb3NpdGlvbj10aGlzLl9kZWZhdWx0T3B0aW9ucy55UG9zaXRpb24sdGhpcy5fZGlyZWN0RGVzY2VuZGFudEl0ZW1zPW5ldyBWaCx0aGlzLl90YWJTdWJzY3JpcHRpb249bS5FTVBUWSx0aGlzLl9jbGFzc0xpc3Q9e30sdGhpcy5fcGFuZWxBbmltYXRpb25TdGF0ZT0idm9pZCIsdGhpcy5fYW5pbWF0aW9uRG9uZT1uZXcgSSx0aGlzLm92ZXJsYXlQYW5lbENsYXNzPXRoaXMuX2RlZmF1bHRPcHRpb25zLm92ZXJsYXlQYW5lbENsYXNzfHwiIix0aGlzLmJhY2tkcm9wQ2xhc3M9dGhpcy5fZGVmYXVsdE9wdGlvbnMuYmFja2Ryb3BDbGFzcyx0aGlzLl9vdmVybGFwVHJpZ2dlcj10aGlzLl9kZWZhdWx0T3B0aW9ucy5vdmVybGFwVHJpZ2dlcix0aGlzLl9oYXNCYWNrZHJvcD10aGlzLl9kZWZhdWx0T3B0aW9ucy5oYXNCYWNrZHJvcCx0aGlzLmNsb3NlZD1uZXcgTGgsdGhpcy5jbG9zZT10aGlzLmNsb3NlZCx0aGlzLnBhbmVsSWQ9Im1hdC1tZW51LXBhbmVsLSIrWlcrK31nZXQgeFBvc2l0aW9uKCl7cmV0dXJuIHRoaXMuX3hQb3NpdGlvbn1zZXQgeFBvc2l0aW9uKHQpeyJiZWZvcmUiPT09dHx8ImFmdGVyIj09PXR8fCJ1bmRlZmluZWQiIT10eXBlb2YgbmdEZXZNb2RlJiYhbmdEZXZNb2RlfHwoZnVuY3Rpb24gZSgpe3Rocm93IEVycm9yKCd4UG9zaXRpb24gdmFsdWUgbXVzdCBiZSBlaXRoZXIgXCdiZWZvcmVcJyBvciBhZnRlclwnLlxuICAgICAgRXhhbXBsZTogPG1hdC1tZW51IHhQb3NpdGlvbj0iYmVmb3JlIiAjbWVudT0ibWF0TWVudSI+PC9tYXQtbWVudT4nKX0pKCksdGhpcy5feFBvc2l0aW9uPXQsdGhpcy5zZXRQb3NpdGlvbkNsYXNzZXMoKX1nZXQgeVBvc2l0aW9uKCl7cmV0dXJuIHRoaXMuX3lQb3NpdGlvbn1zZXQgeVBvc2l0aW9uKHQpeyJhYm92ZSI9PT10fHwiYmVsb3ciPT09dHx8InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0Rldk1vZGUmJiFuZ0Rldk1vZGV8fChmdW5jdGlvbiBlKCl7dGhyb3cgRXJyb3IoJ3lQb3NpdGlvbiB2YWx1ZSBtdXN0IGJlIGVpdGhlciBcJ2Fib3ZlXCcgb3IgYmVsb3dcJy5cbiAgICAgIEV4YW1wbGU6IDxtYXQtbWVudSB5UG9zaXRpb249ImFib3ZlIiAjbWVudT0ibWF0TWVudSI+PC9tYXQtbWVudT4nKX0pKCksdGhpcy5feVBvc2l0aW9uPXQsdGhpcy5zZXRQb3NpdGlvbkNsYXNzZXMoKX1nZXQgb3ZlcmxhcFRyaWdnZXIoKXtyZXR1cm4gdGhpcy5fb3ZlcmxhcFRyaWdnZXJ9c2V0IG92ZXJsYXBUcmlnZ2VyKHQpe3RoaXMuX292ZXJsYXBUcmlnZ2VyPXl6KHQpfWdldCBoYXNCYWNrZHJvcCgpe3JldHVybiB0aGlzLl9oYXNCYWNrZHJvcH1zZXQgaGFzQmFja2Ryb3AodCl7dGhpcy5faGFzQmFja2Ryb3A9eXoodCl9c2V0IHBhbmVsQ2xhc3ModCl7Y29uc3QgZT10aGlzLl9wcmV2aW91c1BhbmVsQ2xhc3M7ZSYmZS5sZW5ndGgmJmUuc3BsaXQoIiAiKS5mb3JFYWNoKCh0PT57dGhpcy5fY2xhc3NMaXN0W3RdPSExfSkpLHRoaXMuX3ByZXZpb3VzUGFuZWxDbGFzcz10LHQmJnQubGVuZ3RoJiYodC5zcGxpdCgiICIpLmZvckVhY2goKHQ9Pnt0aGlzLl9jbGFzc0xpc3RbdF09ITB9KSksdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTmFtZT0iIil9Z2V0IGNsYXNzTGlzdCgpe3JldHVybiB0aGlzLnBhbmVsQ2xhc3N9c2V0IGNsYXNzTGlzdCh0KXt0aGlzLnBhbmVsQ2xhc3M9dH1uZ09uSW5pdCgpe3RoaXMuc2V0UG9zaXRpb25DbGFzc2VzKCl9bmdBZnRlckNvbnRlbnRJbml0KCl7dGhpcy5fdXBkYXRlRGlyZWN0RGVzY2VuZGFudHMoKSx0aGlzLl9rZXlNYW5hZ2VyPW5ldyBlSSh0aGlzLl9kaXJlY3REZXNjZW5kYW50SXRlbXMpLndpdGhXcmFwKCkud2l0aFR5cGVBaGVhZCgpLndpdGhIb21lQW5kRW5kKCksdGhpcy5fdGFiU3Vic2NyaXB0aW9uPXRoaXMuX2tleU1hbmFnZXIudGFiT3V0LnN1YnNjcmliZSgoKCk9PnRoaXMuY2xvc2VkLmVtaXQoInRhYiIpKSksdGhpcy5fZGlyZWN0RGVzY2VuZGFudEl0ZW1zLmNoYW5nZXMucGlwZShOZSh0aGlzLl9kaXJlY3REZXNjZW5kYW50SXRlbXMpLHplKCh0PT5yZSguLi50Lm1hcCgodD0+dC5fZm9jdXNlZCkpKSkpKS5zdWJzY3JpYmUoKHQ9PnRoaXMuX2tleU1hbmFnZXIudXBkYXRlQWN0aXZlSXRlbSh0KSkpfW5nT25EZXN0cm95KCl7dGhpcy5fZGlyZWN0RGVzY2VuZGFudEl0ZW1zLmRlc3Ryb3koKSx0aGlzLl90YWJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLmNsb3NlZC5jb21wbGV0ZSgpfV9ob3ZlcmVkKCl7cmV0dXJuIHRoaXMuX2RpcmVjdERlc2NlbmRhbnRJdGVtcy5jaGFuZ2VzLnBpcGUoTmUodGhpcy5fZGlyZWN0RGVzY2VuZGFudEl0ZW1zKSx6ZSgodD0+cmUoLi4udC5tYXAoKHQ9PnQuX2hvdmVyZWQpKSkpKSl9YWRkSXRlbSh0KXt9cmVtb3ZlSXRlbSh0KXt9X2hhbmRsZUtleWRvd24odCl7Y29uc3QgZT10LmtleUNvZGUsbj10aGlzLl9rZXlNYW5hZ2VyO3N3aXRjaChlKXtjYXNlIHV6OmJ6KHQpfHwodC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuY2xvc2VkLmVtaXQoImtleWRvd24iKSk7YnJlYWs7Y2FzZSAzNzp0aGlzLnBhcmVudE1lbnUmJiJsdHIiPT09dGhpcy5kaXJlY3Rpb24mJnRoaXMuY2xvc2VkLmVtaXQoImtleWRvd24iKTticmVhaztjYXNlIDM5OnRoaXMucGFyZW50TWVudSYmInJ0bCI9PT10aGlzLmRpcmVjdGlvbiYmdGhpcy5jbG9zZWQuZW1pdCgia2V5ZG93biIpO2JyZWFrO2RlZmF1bHQ6ZSE9PWd6JiZlIT09aHp8fG4uc2V0Rm9jdXNPcmlnaW4oImtleWJvYXJkIiksbi5vbktleWRvd24odCl9fWZvY3VzRmlyc3RJdGVtKHQ9InByb2dyYW0iKXt0aGlzLmxhenlDb250ZW50P3RoaXMuX25nWm9uZS5vblN0YWJsZS5waXBlKGJlKDEpKS5zdWJzY3JpYmUoKCgpPT50aGlzLl9mb2N1c0ZpcnN0SXRlbSh0KSkpOnRoaXMuX2ZvY3VzRmlyc3RJdGVtKHQpfV9mb2N1c0ZpcnN0SXRlbSh0KXtjb25zdCBlPXRoaXMuX2tleU1hbmFnZXI7aWYoZS5zZXRGb2N1c09yaWdpbih0KS5zZXRGaXJzdEl0ZW1BY3RpdmUoKSwhZS5hY3RpdmVJdGVtJiZ0aGlzLl9kaXJlY3REZXNjZW5kYW50SXRlbXMubGVuZ3RoKXtsZXQgdD10aGlzLl9kaXJlY3REZXNjZW5kYW50SXRlbXMuZmlyc3QuX2dldEhvc3RFbGVtZW50KCkucGFyZW50RWxlbWVudDtmb3IoO3Q7KXtpZigibWVudSI9PT10LmdldEF0dHJpYnV0ZSgicm9sZSIpKXt0LmZvY3VzKCk7YnJlYWt9dD10LnBhcmVudEVsZW1lbnR9fX1yZXNldEFjdGl2ZUl0ZW0oKXt0aGlzLl9rZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0oLTEpfXNldEVsZXZhdGlvbih0KXtjb25zdCBlPU1hdGgubWluKHRoaXMuX2Jhc2VFbGV2YXRpb24rdCwyNCksbj1gJHt0aGlzLl9lbGV2YXRpb25QcmVmaXh9JHtlfWAsbz1PYmplY3Qua2V5cyh0aGlzLl9jbGFzc0xpc3QpLmZpbmQoKHQ9PnQuc3RhcnRzV2l0aCh0aGlzLl9lbGV2YXRpb25QcmVmaXgpKSk7byYmbyE9PXRoaXMuX3ByZXZpb3VzRWxldmF0aW9ufHwodGhpcy5fcHJldmlvdXNFbGV2YXRpb24mJih0aGlzLl9jbGFzc0xpc3RbdGhpcy5fcHJldmlvdXNFbGV2YXRpb25dPSExKSx0aGlzLl9jbGFzc0xpc3Rbbl09ITAsdGhpcy5fcHJldmlvdXNFbGV2YXRpb249bil9c2V0UG9zaXRpb25DbGFzc2VzKHQ9dGhpcy54UG9zaXRpb24sZT10aGlzLnlQb3NpdGlvbil7Y29uc3Qgbj10aGlzLl9jbGFzc0xpc3Q7blsibWF0LW1lbnUtYmVmb3JlIl09ImJlZm9yZSI9PT10LG5bIm1hdC1tZW51LWFmdGVyIl09ImFmdGVyIj09PXQsblsibWF0LW1lbnUtYWJvdmUiXT0iYWJvdmUiPT09ZSxuWyJtYXQtbWVudS1iZWxvdyJdPSJiZWxvdyI9PT1lfV9zdGFydEFuaW1hdGlvbigpe3RoaXMuX3BhbmVsQW5pbWF0aW9uU3RhdGU9ImVudGVyIn1fcmVzZXRBbmltYXRpb24oKXt0aGlzLl9wYW5lbEFuaW1hdGlvblN0YXRlPSJ2b2lkIn1fb25BbmltYXRpb25Eb25lKHQpe3RoaXMuX2FuaW1hdGlvbkRvbmUubmV4dCh0KSx0aGlzLl9pc0FuaW1hdGluZz0hMX1fb25BbmltYXRpb25TdGFydCh0KXt0aGlzLl9pc0FuaW1hdGluZz0hMCwiZW50ZXIiPT09dC50b1N0YXRlJiYwPT09dGhpcy5fa2V5TWFuYWdlci5hY3RpdmVJdGVtSW5kZXgmJih0LmVsZW1lbnQuc2Nyb2xsVG9wPTApfV91cGRhdGVEaXJlY3REZXNjZW5kYW50cygpe3RoaXMuX2FsbEl0ZW1zLmNoYW5nZXMucGlwZShOZSh0aGlzLl9hbGxJdGVtcykpLnN1YnNjcmliZSgodD0+e3RoaXMuX2RpcmVjdERlc2NlbmRhbnRJdGVtcy5yZXNldCh0LmZpbHRlcigodD0+dC5fcGFyZW50TWVudT09PXRoaXMpKSksdGhpcy5fZGlyZWN0RGVzY2VuZGFudEl0ZW1zLm5vdGlmeU9uQ2hhbmdlcygpfSkpfX1YVy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WFcpKFNtKGhnKSxTbShhXyksU20oWVcpKX0sWFcuybVkaXI9bG8oe3R5cGU6WFcsY29udGVudFF1ZXJpZXM6ZnVuY3Rpb24gdChlLG4sbyl7aWYoMSZlJiYoJGgobyxWVyw1KSwkaChvLFdXLDUpLCRoKG8sV1csNCkpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4ubGF6eUNvbnRlbnQ9dC5maXJzdCksSmgodD10YigpKSYmKG4uX2FsbEl0ZW1zPXQpLEpoKHQ9dGIoKSkmJihuLml0ZW1zPXQpfX0sdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJlFoKFhnLDUpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4udGVtcGxhdGVSZWY9dC5maXJzdCl9fSxpbnB1dHM6e2JhY2tkcm9wQ2xhc3M6ImJhY2tkcm9wQ2xhc3MiLHhQb3NpdGlvbjoieFBvc2l0aW9uIix5UG9zaXRpb246InlQb3NpdGlvbiIsb3ZlcmxhcFRyaWdnZXI6Im92ZXJsYXBUcmlnZ2VyIixoYXNCYWNrZHJvcDoiaGFzQmFja2Ryb3AiLHBhbmVsQ2xhc3M6WyJjbGFzcyIsInBhbmVsQ2xhc3MiXSxjbGFzc0xpc3Q6ImNsYXNzTGlzdCIsYXJpYUxhYmVsOlsiYXJpYS1sYWJlbCIsImFyaWFMYWJlbCJdLGFyaWFMYWJlbGxlZGJ5OlsiYXJpYS1sYWJlbGxlZGJ5IiwiYXJpYUxhYmVsbGVkYnkiXSxhcmlhRGVzY3JpYmVkYnk6WyJhcmlhLWRlc2NyaWJlZGJ5IiwiYXJpYURlc2NyaWJlZGJ5Il19LG91dHB1dHM6e2Nsb3NlZDoiY2xvc2VkIixjbG9zZToiY2xvc2UifX0pLFhXLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOmFffSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWVddfV19XSxYVy5wcm9wRGVjb3JhdG9ycz17X2FsbEl0ZW1zOlt7dHlwZTpZYSxhcmdzOltXVyx7ZGVzY2VuZGFudHM6ITB9XX1dLGJhY2tkcm9wQ2xhc3M6W3t0eXBlOnh5fV0sYXJpYUxhYmVsOlt7dHlwZTp4eSxhcmdzOlsiYXJpYS1sYWJlbCJdfV0sYXJpYUxhYmVsbGVkYnk6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsbGVkYnkiXX1dLGFyaWFEZXNjcmliZWRieTpbe3R5cGU6eHksYXJnczpbImFyaWEtZGVzY3JpYmVkYnkiXX1dLHhQb3NpdGlvbjpbe3R5cGU6eHl9XSx5UG9zaXRpb246W3t0eXBlOnh5fV0sdGVtcGxhdGVSZWY6W3t0eXBlOlphLGFyZ3M6W1hnXX1dLGl0ZW1zOlt7dHlwZTpZYSxhcmdzOltXVyx7ZGVzY2VuZGFudHM6ITF9XX1dLGxhenlDb250ZW50Olt7dHlwZTpxYSxhcmdzOltWV119XSxvdmVybGFwVHJpZ2dlcjpbe3R5cGU6eHl9XSxoYXNCYWNrZHJvcDpbe3R5cGU6eHl9XSxwYW5lbENsYXNzOlt7dHlwZTp4eSxhcmdzOlsiY2xhc3MiXX1dLGNsYXNzTGlzdDpbe3R5cGU6eHl9XSxjbG9zZWQ6W3t0eXBlOk95fV0sY2xvc2U6W3t0eXBlOk95fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWFcsW3t0eXBlOkN5fV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1lXXX1dfV19KSx7YmFja2Ryb3BDbGFzczpbe3R5cGU6eHl9XSxjbG9zZWQ6W3t0eXBlOk95fV0sY2xvc2U6W3t0eXBlOk95fV0seFBvc2l0aW9uOlt7dHlwZTp4eX1dLHlQb3NpdGlvbjpbe3R5cGU6eHl9XSxvdmVybGFwVHJpZ2dlcjpbe3R5cGU6eHl9XSxoYXNCYWNrZHJvcDpbe3R5cGU6eHl9XSxwYW5lbENsYXNzOlt7dHlwZTp4eSxhcmdzOlsiY2xhc3MiXX1dLGNsYXNzTGlzdDpbe3R5cGU6eHl9XSxfYWxsSXRlbXM6W3t0eXBlOllhLGFyZ3M6W1dXLHtkZXNjZW5kYW50czohMH1dfV0sYXJpYUxhYmVsOlt7dHlwZTp4eSxhcmdzOlsiYXJpYS1sYWJlbCJdfV0sYXJpYUxhYmVsbGVkYnk6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsbGVkYnkiXX1dLGFyaWFEZXNjcmliZWRieTpbe3R5cGU6eHksYXJnczpbImFyaWEtZGVzY3JpYmVkYnkiXX1dLHRlbXBsYXRlUmVmOlt7dHlwZTpaYSxhcmdzOltYZ119XSxpdGVtczpbe3R5cGU6WWEsYXJnczpbV1cse2Rlc2NlbmRhbnRzOiExfV19XSxsYXp5Q29udGVudDpbe3R5cGU6cWEsYXJnczpbVlddfV19KTtjbGFzcyBLVyBleHRlbmRzIFhXe2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcih0LGUsbiksdGhpcy5fZWxldmF0aW9uUHJlZml4PSJtYXQtZWxldmF0aW9uLXoiLHRoaXMuX2Jhc2VFbGV2YXRpb249NH19S1cuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEtXKShTbShoZyksU20oYV8pLFNtKFlXKSl9LEtXLsm1Y21wPXRvKHt0eXBlOktXLHNlbGVjdG9yczpbWyJtYXQtbWVudSJdXSxob3N0VmFyczozLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZqcCgiYXJpYS1sYWJlbCIsbnVsbCkoImFyaWEtbGFiZWxsZWRieSIsbnVsbCkoImFyaWEtZGVzY3JpYmVkYnkiLG51bGwpfSxleHBvcnRBczpbIm1hdE1lbnUiXSxmZWF0dXJlczpbcGcoW3twcm92aWRlOlVXLHVzZUV4aXN0aW5nOktXfV0pLHhwXSxuZ0NvbnRlbnRTZWxlY3RvcnM6RlcsZGVjbHM6MSx2YXJzOjAsY29uc3RzOltbInRhYmluZGV4IiwiLTEiLCJyb2xlIiwibWVudSIsMSwibWF0LW1lbnUtcGFuZWwiLDMsImlkIiwibmdDbGFzcyIsImtleWRvd24iLCJjbGljayJdLFsxLCJtYXQtbWVudS1jb250ZW50Il1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabSgpLFFwKDAsTFcsMyw2LCJuZy10ZW1wbGF0ZSIpKX0sZGlyZWN0aXZlczpbYU1dLHN0eWxlczpbIm1hdC1tZW51e2Rpc3BsYXk6bm9uZX0ubWF0LW1lbnUtcGFuZWx7bWluLXdpZHRoOjExMnB4O21heC13aWR0aDoyODBweDtvdmVyZmxvdzphdXRvOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNoO21heC1oZWlnaHQ6Y2FsYygxMDB2aCAtIDQ4cHgpO2JvcmRlci1yYWRpdXM6NHB4O291dGxpbmU6MDttaW4taGVpZ2h0OjY0cHh9Lm1hdC1tZW51LXBhbmVsLm5nLWFuaW1hdGluZ3twb2ludGVyLWV2ZW50czpub25lfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1tZW51LXBhbmVse291dGxpbmU6c29saWQgMXB4fS5tYXQtbWVudS1jb250ZW50Om5vdCg6ZW1wdHkpe3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1tZW51LWl0ZW17LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtib3JkZXI6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7bGluZS1oZWlnaHQ6NDhweDtoZWlnaHQ6NDhweDtwYWRkaW5nOjAgMTZweDt0ZXh0LWFsaWduOmxlZnQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7bWF4LXdpZHRoOjEwMCU7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZW51LWl0ZW06Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRde2N1cnNvcjpkZWZhdWx0fVtkaXI9cnRsXSAubWF0LW1lbnUtaXRlbXt0ZXh0LWFsaWduOnJpZ2h0fS5tYXQtbWVudS1pdGVtIC5tYXQtaWNvbnttYXJnaW4tcmlnaHQ6MTZweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Lm1hdC1tZW51LWl0ZW0gLm1hdC1pY29uIHN2Z3t2ZXJ0aWNhbC1hbGlnbjp0b3B9W2Rpcj1ydGxdIC5tYXQtbWVudS1pdGVtIC5tYXQtaWNvbnttYXJnaW4tbGVmdDoxNnB4O21hcmdpbi1yaWdodDowfS5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXXtwb2ludGVyLWV2ZW50czpub25lfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1tZW51LWl0ZW17bWFyZ2luLXRvcDoxcHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW1lbnUtaXRlbS5jZGstcHJvZ3JhbS1mb2N1c2VkLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1tZW51LWl0ZW0uY2RrLWtleWJvYXJkLWZvY3VzZWQsLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZHtvdXRsaW5lOmRvdHRlZCAxcHh9Lm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2Vye3BhZGRpbmctcmlnaHQ6MzJweH1bZGlyPXJ0bF0gLm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2Vye3BhZGRpbmctcmlnaHQ6MTZweDtwYWRkaW5nLWxlZnQ6MzJweH0ubWF0LW1lbnUtc3VibWVudS1pY29ue3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7cmlnaHQ6MTZweDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKTt3aWR0aDo1cHg7aGVpZ2h0OjEwcHg7ZmlsbDpjdXJyZW50Q29sb3J9W2Rpcj1ydGxdIC5tYXQtbWVudS1zdWJtZW51LWljb257cmlnaHQ6YXV0bztsZWZ0OjE2cHg7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSkgc2NhbGVYKC0xKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtbWVudS1zdWJtZW51LWljb257ZmlsbDpDYW52YXNUZXh0fWJ1dHRvbi5tYXQtbWVudS1pdGVte3dpZHRoOjEwMCV9Lm1hdC1tZW51LWl0ZW0gLm1hdC1tZW51LXJpcHBsZXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lfVxuIl0sZW5jYXBzdWxhdGlvbjoyLGRhdGE6e2FuaW1hdGlvbjpbQlcudHJhbnNmb3JtTWVudSxCVy5mYWRlSW5JdGVtc119LGNoYW5nZURldGVjdGlvbjowfSksS1cuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ30se3R5cGU6YV99LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltZV119XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoS1csW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWF0LW1lbnUiLHRlbXBsYXRlOic8bmctdGVtcGxhdGU+XG4gIDxkaXZcbiAgICBjbGFzcz0ibWF0LW1lbnUtcGFuZWwiXG4gICAgW2lkXT0icGFuZWxJZCJcbiAgICBbbmdDbGFzc109Il9jbGFzc0xpc3QiXG4gICAgKGtleWRvd24pPSJfaGFuZGxlS2V5ZG93bigkZXZlbnQpIlxuICAgIChjbGljayk9ImNsb3NlZC5lbWl0KFwnY2xpY2tcJykiXG4gICAgW0B0cmFuc2Zvcm1NZW51XT0iX3BhbmVsQW5pbWF0aW9uU3RhdGUiXG4gICAgKEB0cmFuc2Zvcm1NZW51LnN0YXJ0KT0iX29uQW5pbWF0aW9uU3RhcnQoJGV2ZW50KSJcbiAgICAoQHRyYW5zZm9ybU1lbnUuZG9uZSk9Il9vbkFuaW1hdGlvbkRvbmUoJGV2ZW50KSJcbiAgICB0YWJpbmRleD0iLTEiXG4gICAgcm9sZT0ibWVudSJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT0iYXJpYUxhYmVsIHx8IG51bGwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT0iYXJpYUxhYmVsbGVkYnkgfHwgbnVsbCJcbiAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT0iYXJpYURlc2NyaWJlZGJ5IHx8IG51bGwiPlxuICAgIDxkaXYgY2xhc3M9Im1hdC1tZW51LWNvbnRlbnQiPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4nLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2gsZW5jYXBzdWxhdGlvbjpIbi5Ob25lLGV4cG9ydEFzOiJtYXRNZW51Iixob3N0OnsiW2F0dHIuYXJpYS1sYWJlbF0iOiJudWxsIiwiW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XSI6Im51bGwiLCJbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XSI6Im51bGwifSxhbmltYXRpb25zOltCVy50cmFuc2Zvcm1NZW51LEJXLmZhZGVJbkl0ZW1zXSxwcm92aWRlcnM6W3twcm92aWRlOlVXLHVzZUV4aXN0aW5nOktXfV0sc3R5bGVzOlsibWF0LW1lbnV7ZGlzcGxheTpub25lfS5tYXQtbWVudS1wYW5lbHttaW4td2lkdGg6MTEycHg7bWF4LXdpZHRoOjI4MHB4O292ZXJmbG93OmF1dG87LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gNDhweCk7Ym9yZGVyLXJhZGl1czo0cHg7b3V0bGluZTowO21pbi1oZWlnaHQ6NjRweH0ubWF0LW1lbnUtcGFuZWwubmctYW5pbWF0aW5ne3BvaW50ZXItZXZlbnRzOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW1lbnUtcGFuZWx7b3V0bGluZTpzb2xpZCAxcHh9Lm1hdC1tZW51LWNvbnRlbnQ6bm90KDplbXB0eSl7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LW1lbnUtaXRlbXstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7Y3Vyc29yOnBvaW50ZXI7b3V0bGluZTpub25lO2JvcmRlcjpub25lOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztsaW5lLWhlaWdodDo0OHB4O2hlaWdodDo0OHB4O3BhZGRpbmc6MCAxNnB4O3RleHQtYWxpZ246bGVmdDt0ZXh0LWRlY29yYXRpb246bm9uZTttYXgtd2lkdGg6MTAwJTtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1lbnUtaXRlbTo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF17Y3Vyc29yOmRlZmF1bHR9W2Rpcj1ydGxdIC5tYXQtbWVudS1pdGVte3RleHQtYWxpZ246cmlnaHR9Lm1hdC1tZW51LWl0ZW0gLm1hdC1pY29ue21hcmdpbi1yaWdodDoxNnB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0ubWF0LW1lbnUtaXRlbSAubWF0LWljb24gc3Zne3ZlcnRpY2FsLWFsaWduOnRvcH1bZGlyPXJ0bF0gLm1hdC1tZW51LWl0ZW0gLm1hdC1pY29ue21hcmdpbi1sZWZ0OjE2cHg7bWFyZ2luLXJpZ2h0OjB9Lm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRde3BvaW50ZXItZXZlbnRzOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW1lbnUtaXRlbXttYXJnaW4tdG9wOjFweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtbWVudS1pdGVtLmNkay1wcm9ncmFtLWZvY3VzZWQsLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZCwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtbWVudS1pdGVtLWhpZ2hsaWdodGVke291dGxpbmU6ZG90dGVkIDFweH0ubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXJ7cGFkZGluZy1yaWdodDozMnB4fVtkaXI9cnRsXSAubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXJ7cGFkZGluZy1yaWdodDoxNnB4O3BhZGRpbmctbGVmdDozMnB4fS5tYXQtbWVudS1zdWJtZW51LWljb257cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtyaWdodDoxNnB4O3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpO3dpZHRoOjVweDtoZWlnaHQ6MTBweDtmaWxsOmN1cnJlbnRDb2xvcn1bZGlyPXJ0bF0gLm1hdC1tZW51LXN1Ym1lbnUtaWNvbntyaWdodDphdXRvO2xlZnQ6MTZweDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKSBzY2FsZVgoLTEpfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1tZW51LXN1Ym1lbnUtaWNvbntmaWxsOkNhbnZhc1RleHR9YnV0dG9uLm1hdC1tZW51LWl0ZW17d2lkdGg6MTAwJX0ubWF0LW1lbnUtaXRlbSAubWF0LW1lbnUtcmlwcGxle3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOm5vbmV9XG4iXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1lXXX1dfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IEpXPW5ldyBHYSgibWF0LW1lbnUtc2Nyb2xsLXN0cmF0ZWd5IiksUVc9e3Byb3ZpZGU6SlcsZGVwczpbcExdLHVzZUZhY3Rvcnk6ZnVuY3Rpb24gJFcodCl7cmV0dXJuKCk9PnQuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKCl9fSx0WT1Oeih7cGFzc2l2ZTohMH0pO2NsYXNzIGVZe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIscyl7dGhpcy5fb3ZlcmxheT10LHRoaXMuX2VsZW1lbnQ9ZSx0aGlzLl92aWV3Q29udGFpbmVyUmVmPW4sdGhpcy5fbWVudUl0ZW1JbnN0YW5jZT1hLHRoaXMuX2Rpcj1yLHRoaXMuX2ZvY3VzTW9uaXRvcj1zLHRoaXMuX292ZXJsYXlSZWY9bnVsbCx0aGlzLl9tZW51T3Blbj0hMSx0aGlzLl9jbG9zaW5nQWN0aW9uc1N1YnNjcmlwdGlvbj1tLkVNUFRZLHRoaXMuX2hvdmVyU3Vic2NyaXB0aW9uPW0uRU1QVFksdGhpcy5fbWVudUNsb3NlU3Vic2NyaXB0aW9uPW0uRU1QVFksdGhpcy5faGFuZGxlVG91Y2hTdGFydD10PT57aEkodCl8fCh0aGlzLl9vcGVuZWRCeT0idG91Y2giKX0sdGhpcy5fb3BlbmVkQnk9dm9pZCAwLHRoaXMucmVzdG9yZUZvY3VzPSEwLHRoaXMubWVudU9wZW5lZD1uZXcgTGgsdGhpcy5vbk1lbnVPcGVuPXRoaXMubWVudU9wZW5lZCx0aGlzLm1lbnVDbG9zZWQ9bmV3IExoLHRoaXMub25NZW51Q2xvc2U9dGhpcy5tZW51Q2xvc2VkLHRoaXMuX3Njcm9sbFN0cmF0ZWd5PW8sdGhpcy5fcGFyZW50TWF0ZXJpYWxNZW51PWkgaW5zdGFuY2VvZiBYVz9pOnZvaWQgMCxlLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5faGFuZGxlVG91Y2hTdGFydCx0WSksYSYmKGEuX3RyaWdnZXJzU3VibWVudT10aGlzLnRyaWdnZXJzU3VibWVudSgpKX1nZXQgX2RlcHJlY2F0ZWRNYXRNZW51VHJpZ2dlckZvcigpe3JldHVybiB0aGlzLm1lbnV9c2V0IF9kZXByZWNhdGVkTWF0TWVudVRyaWdnZXJGb3IodCl7dGhpcy5tZW51PXR9Z2V0IG1lbnUoKXtyZXR1cm4gdGhpcy5fbWVudX1zZXQgbWVudSh0KXt0IT09dGhpcy5fbWVudSYmKHRoaXMuX21lbnU9dCx0aGlzLl9tZW51Q2xvc2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0JiYodCE9PXRoaXMuX3BhcmVudE1hdGVyaWFsTWVudXx8InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0Rldk1vZGUmJiFuZ0Rldk1vZGV8fChmdW5jdGlvbiBlKCl7dGhyb3cgRXJyb3IoIm1hdE1lbnVUcmlnZ2VyRm9yOiBtZW51IGNhbm5vdCBjb250YWluIGl0cyBvd24gdHJpZ2dlci4gQXNzaWduIGEgbWVudSB0aGF0IGlzIG5vdCBhIHBhcmVudCBvZiB0aGUgdHJpZ2dlciBvciBtb3ZlIHRoZSB0cmlnZ2VyIG91dHNpZGUgb2YgdGhlIG1lbnUuIil9KSgpLHRoaXMuX21lbnVDbG9zZVN1YnNjcmlwdGlvbj10LmNsb3NlLnN1YnNjcmliZSgodD0+e3RoaXMuX2Rlc3Ryb3lNZW51KHQpLCJjbGljayIhPT10JiYidGFiIiE9PXR8fCF0aGlzLl9wYXJlbnRNYXRlcmlhbE1lbnV8fHRoaXMuX3BhcmVudE1hdGVyaWFsTWVudS5jbG9zZWQuZW1pdCh0KX0pKSkpfW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX2NoZWNrTWVudSgpLHRoaXMuX2hhbmRsZUhvdmVyKCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9vdmVybGF5UmVmJiYodGhpcy5fb3ZlcmxheVJlZi5kaXNwb3NlKCksdGhpcy5fb3ZlcmxheVJlZj1udWxsKSx0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5faGFuZGxlVG91Y2hTdGFydCx0WSksdGhpcy5fbWVudUNsb3NlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5fY2xvc2luZ0FjdGlvbnNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl9ob3ZlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpfWdldCBtZW51T3Blbigpe3JldHVybiB0aGlzLl9tZW51T3Blbn1nZXQgZGlyKCl7cmV0dXJuIHRoaXMuX2RpciYmInJ0bCI9PT10aGlzLl9kaXIudmFsdWU/InJ0bCI6Imx0ciJ9dHJpZ2dlcnNTdWJtZW51KCl7cmV0dXJuISghdGhpcy5fbWVudUl0ZW1JbnN0YW5jZXx8IXRoaXMuX3BhcmVudE1hdGVyaWFsTWVudSl9dG9nZ2xlTWVudSgpe3JldHVybiB0aGlzLl9tZW51T3Blbj90aGlzLmNsb3NlTWVudSgpOnRoaXMub3Blbk1lbnUoKX1vcGVuTWVudSgpe2lmKHRoaXMuX21lbnVPcGVuKXJldHVybjt0aGlzLl9jaGVja01lbnUoKTtjb25zdCB0PXRoaXMuX2NyZWF0ZU92ZXJsYXkoKSxlPXQuZ2V0Q29uZmlnKCk7dGhpcy5fc2V0UG9zaXRpb24oZS5wb3NpdGlvblN0cmF0ZWd5KSxlLmhhc0JhY2tkcm9wPW51bGw9PXRoaXMubWVudS5oYXNCYWNrZHJvcD8hdGhpcy50cmlnZ2Vyc1N1Ym1lbnUoKTp0aGlzLm1lbnUuaGFzQmFja2Ryb3AsdC5hdHRhY2godGhpcy5fZ2V0UG9ydGFsKCkpLHRoaXMubWVudS5sYXp5Q29udGVudCYmdGhpcy5tZW51LmxhenlDb250ZW50LmF0dGFjaCh0aGlzLm1lbnVEYXRhKSx0aGlzLl9jbG9zaW5nQWN0aW9uc1N1YnNjcmlwdGlvbj10aGlzLl9tZW51Q2xvc2luZ0FjdGlvbnMoKS5zdWJzY3JpYmUoKCgpPT50aGlzLmNsb3NlTWVudSgpKSksdGhpcy5faW5pdE1lbnUoKSx0aGlzLm1lbnUgaW5zdGFuY2VvZiBYVyYmdGhpcy5tZW51Ll9zdGFydEFuaW1hdGlvbigpfWNsb3NlTWVudSgpe3RoaXMubWVudS5jbG9zZS5lbWl0KCl9Zm9jdXModCxlKXt0aGlzLl9mb2N1c01vbml0b3ImJnQ/dGhpcy5fZm9jdXNNb25pdG9yLmZvY3VzVmlhKHRoaXMuX2VsZW1lbnQsdCxlKTp0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoZSl9dXBkYXRlUG9zaXRpb24oKXt2YXIgdDtudWxsPT09KHQ9dGhpcy5fb3ZlcmxheVJlZil8fHZvaWQgMD09PXR8fHQudXBkYXRlUG9zaXRpb24oKX1fZGVzdHJveU1lbnUodCl7aWYoIXRoaXMuX292ZXJsYXlSZWZ8fCF0aGlzLm1lbnVPcGVuKXJldHVybjtjb25zdCBlPXRoaXMubWVudTt0aGlzLl9jbG9zaW5nQWN0aW9uc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX292ZXJsYXlSZWYuZGV0YWNoKCksIXRoaXMucmVzdG9yZUZvY3VzfHwia2V5ZG93biIhPT10JiZ0aGlzLl9vcGVuZWRCeSYmdGhpcy50cmlnZ2Vyc1N1Ym1lbnUoKXx8dGhpcy5mb2N1cyh0aGlzLl9vcGVuZWRCeSksdGhpcy5fb3BlbmVkQnk9dm9pZCAwLGUgaW5zdGFuY2VvZiBYVz8oZS5fcmVzZXRBbmltYXRpb24oKSxlLmxhenlDb250ZW50P2UuX2FuaW1hdGlvbkRvbmUucGlwZShjZSgodD0+InZvaWQiPT09dC50b1N0YXRlKSksYmUoMSksSWUoZS5sYXp5Q29udGVudC5fYXR0YWNoZWQpKS5zdWJzY3JpYmUoe25leHQ6KCk9PmUubGF6eUNvbnRlbnQuZGV0YWNoKCksY29tcGxldGU6KCk9PnRoaXMuX3NldElzTWVudU9wZW4oITEpfSk6dGhpcy5fc2V0SXNNZW51T3BlbighMSkpOih0aGlzLl9zZXRJc01lbnVPcGVuKCExKSxlLmxhenlDb250ZW50JiZlLmxhenlDb250ZW50LmRldGFjaCgpKX1faW5pdE1lbnUoKXt0aGlzLm1lbnUucGFyZW50TWVudT10aGlzLnRyaWdnZXJzU3VibWVudSgpP3RoaXMuX3BhcmVudE1hdGVyaWFsTWVudTp2b2lkIDAsdGhpcy5tZW51LmRpcmVjdGlvbj10aGlzLmRpcix0aGlzLl9zZXRNZW51RWxldmF0aW9uKCksdGhpcy5tZW51LmZvY3VzRmlyc3RJdGVtKHRoaXMuX29wZW5lZEJ5fHwicHJvZ3JhbSIpLHRoaXMuX3NldElzTWVudU9wZW4oITApfV9zZXRNZW51RWxldmF0aW9uKCl7aWYodGhpcy5tZW51LnNldEVsZXZhdGlvbil7bGV0IHQ9MCxlPXRoaXMubWVudS5wYXJlbnRNZW51O2Zvcig7ZTspdCsrLGU9ZS5wYXJlbnRNZW51O3RoaXMubWVudS5zZXRFbGV2YXRpb24odCl9fV9zZXRJc01lbnVPcGVuKHQpe3RoaXMuX21lbnVPcGVuPXQsdGhpcy5fbWVudU9wZW4/dGhpcy5tZW51T3BlbmVkLmVtaXQoKTp0aGlzLm1lbnVDbG9zZWQuZW1pdCgpLHRoaXMudHJpZ2dlcnNTdWJtZW51KCkmJnRoaXMuX21lbnVJdGVtSW5zdGFuY2UuX3NldEhpZ2hsaWdodGVkKHQpfV9jaGVja01lbnUoKXt0aGlzLm1lbnV8fCJ1bmRlZmluZWQiIT10eXBlb2YgbmdEZXZNb2RlJiYhbmdEZXZNb2RlfHwoCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpmdW5jdGlvbiB0KCl7dGhyb3cgRXJyb3IoJ21hdE1lbnVUcmlnZ2VyRm9yOiBtdXN0IHBhc3MgaW4gYW4gbWF0LW1lbnUgaW5zdGFuY2UuXG5cbiAgICBFeGFtcGxlOlxuICAgICAgPG1hdC1tZW51ICNtZW51PSJtYXRNZW51Ij48L21hdC1tZW51PlxuICAgICAgPGJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPSJtZW51Ij48L2J1dHRvbj4nKX0pKCl9X2NyZWF0ZU92ZXJsYXkoKXtpZighdGhpcy5fb3ZlcmxheVJlZil7Y29uc3QgdD10aGlzLl9nZXRPdmVybGF5Q29uZmlnKCk7dGhpcy5fc3Vic2NyaWJlVG9Qb3NpdGlvbnModC5wb3NpdGlvblN0cmF0ZWd5KSx0aGlzLl9vdmVybGF5UmVmPXRoaXMuX292ZXJsYXkuY3JlYXRlKHQpLHRoaXMuX292ZXJsYXlSZWYua2V5ZG93bkV2ZW50cygpLnN1YnNjcmliZSgpfXJldHVybiB0aGlzLl9vdmVybGF5UmVmfV9nZXRPdmVybGF5Q29uZmlnKCl7cmV0dXJuIG5ldyBWRih7cG9zaXRpb25TdHJhdGVneTp0aGlzLl9vdmVybGF5LnBvc2l0aW9uKCkuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLl9lbGVtZW50KS53aXRoTG9ja2VkUG9zaXRpb24oKS53aXRoR3Jvd0FmdGVyT3BlbigpLndpdGhUcmFuc2Zvcm1PcmlnaW5PbigiLm1hdC1tZW51LXBhbmVsLCAubWF0LW1kYy1tZW51LXBhbmVsIiksYmFja2Ryb3BDbGFzczp0aGlzLm1lbnUuYmFja2Ryb3BDbGFzc3x8ImNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wIixwYW5lbENsYXNzOnRoaXMubWVudS5vdmVybGF5UGFuZWxDbGFzcyxzY3JvbGxTdHJhdGVneTp0aGlzLl9zY3JvbGxTdHJhdGVneSgpLGRpcmVjdGlvbjp0aGlzLl9kaXJ9KX1fc3Vic2NyaWJlVG9Qb3NpdGlvbnModCl7dGhpcy5tZW51LnNldFBvc2l0aW9uQ2xhc3NlcyYmdC5wb3NpdGlvbkNoYW5nZXMuc3Vic2NyaWJlKCh0PT57dGhpcy5tZW51LnNldFBvc2l0aW9uQ2xhc3Nlcygic3RhcnQiPT09dC5jb25uZWN0aW9uUGFpci5vdmVybGF5WD8iYWZ0ZXIiOiJiZWZvcmUiLCJ0b3AiPT09dC5jb25uZWN0aW9uUGFpci5vdmVybGF5WT8iYmVsb3ciOiJhYm92ZSIpfSkpfV9zZXRQb3NpdGlvbih0KXtsZXRbZSxuXT0iYmVmb3JlIj09PXRoaXMubWVudS54UG9zaXRpb24/WyJlbmQiLCJzdGFydCJdOlsic3RhcnQiLCJlbmQiXSxbbyxpXT0iYWJvdmUiPT09dGhpcy5tZW51LnlQb3NpdGlvbj9bImJvdHRvbSIsInRvcCJdOlsidG9wIiwiYm90dG9tIl0sW2Escl09W28saV0sW3MsbF09W2Usbl0sYz0wO3RoaXMudHJpZ2dlcnNTdWJtZW51KCk/KGw9ZT0iYmVmb3JlIj09PXRoaXMubWVudS54UG9zaXRpb24/InN0YXJ0IjoiZW5kIixuPXM9ImVuZCI9PT1lPyJzdGFydCI6ImVuZCIsYz0iYm90dG9tIj09PW8/ODotOCk6dGhpcy5tZW51Lm92ZXJsYXBUcmlnZ2VyfHwoYT0idG9wIj09PW8/ImJvdHRvbSI6InRvcCIscj0idG9wIj09PWk/ImJvdHRvbSI6InRvcCIpLHQud2l0aFBvc2l0aW9ucyhbe29yaWdpblg6ZSxvcmlnaW5ZOmEsb3ZlcmxheVg6cyxvdmVybGF5WTpvLG9mZnNldFk6Y30se29yaWdpblg6bixvcmlnaW5ZOmEsb3ZlcmxheVg6bCxvdmVybGF5WTpvLG9mZnNldFk6Y30se29yaWdpblg6ZSxvcmlnaW5ZOnIsb3ZlcmxheVg6cyxvdmVybGF5WTppLG9mZnNldFk6LWN9LHtvcmlnaW5YOm4sb3JpZ2luWTpyLG92ZXJsYXlYOmwsb3ZlcmxheVk6aSxvZmZzZXRZOi1jfV0pfV9tZW51Q2xvc2luZ0FjdGlvbnMoKXtjb25zdCB0PXRoaXMuX292ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLGU9dGhpcy5fb3ZlcmxheVJlZi5kZXRhY2htZW50cygpO3JldHVybiByZSh0LHRoaXMuX3BhcmVudE1hdGVyaWFsTWVudT90aGlzLl9wYXJlbnRNYXRlcmlhbE1lbnUuY2xvc2VkOkV0KCksdGhpcy5fcGFyZW50TWF0ZXJpYWxNZW51P3RoaXMuX3BhcmVudE1hdGVyaWFsTWVudS5faG92ZXJlZCgpLnBpcGUoY2UoKHQ9PnQhPT10aGlzLl9tZW51SXRlbUluc3RhbmNlKSksY2UoKCgpPT50aGlzLl9tZW51T3BlbikpKTpFdCgpLGUpfV9oYW5kbGVNb3VzZWRvd24odCl7Z0kodCl8fCh0aGlzLl9vcGVuZWRCeT0wPT09dC5idXR0b24/Im1vdXNlIjp2b2lkIDAsdGhpcy50cmlnZ2Vyc1N1Ym1lbnUoKSYmdC5wcmV2ZW50RGVmYXVsdCgpKX1faGFuZGxlS2V5ZG93bih0KXtjb25zdCBlPXQua2V5Q29kZTtlIT09bXomJmUhPT1menx8KHRoaXMuX29wZW5lZEJ5PSJrZXlib2FyZCIpLHRoaXMudHJpZ2dlcnNTdWJtZW51KCkmJigzOT09PWUmJiJsdHIiPT09dGhpcy5kaXJ8fDM3PT09ZSYmInJ0bCI9PT10aGlzLmRpcikmJih0aGlzLl9vcGVuZWRCeT0ia2V5Ym9hcmQiLHRoaXMub3Blbk1lbnUoKSl9X2hhbmRsZUNsaWNrKHQpe3RoaXMudHJpZ2dlcnNTdWJtZW51KCk/KHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5vcGVuTWVudSgpKTp0aGlzLnRvZ2dsZU1lbnUoKX1faGFuZGxlSG92ZXIoKXt0aGlzLnRyaWdnZXJzU3VibWVudSgpJiZ0aGlzLl9wYXJlbnRNYXRlcmlhbE1lbnUmJih0aGlzLl9ob3ZlclN1YnNjcmlwdGlvbj10aGlzLl9wYXJlbnRNYXRlcmlhbE1lbnUuX2hvdmVyZWQoKS5waXBlKGNlKCh0PT50PT09dGhpcy5fbWVudUl0ZW1JbnN0YW5jZSYmIXQuZGlzYWJsZWQpKSxDZSgwLCQpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fb3BlbmVkQnk9Im1vdXNlIix0aGlzLm1lbnUgaW5zdGFuY2VvZiBYVyYmdGhpcy5tZW51Ll9pc0FuaW1hdGluZz90aGlzLm1lbnUuX2FuaW1hdGlvbkRvbmUucGlwZShiZSgxKSxDZSgwLCQpLEllKHRoaXMuX3BhcmVudE1hdGVyaWFsTWVudS5faG92ZXJlZCgpKSkuc3Vic2NyaWJlKCgoKT0+dGhpcy5vcGVuTWVudSgpKSk6dGhpcy5vcGVuTWVudSgpfSkpKX1fZ2V0UG9ydGFsKCl7cmV0dXJuIHRoaXMuX3BvcnRhbCYmdGhpcy5fcG9ydGFsLnRlbXBsYXRlUmVmPT09dGhpcy5tZW51LnRlbXBsYXRlUmVmfHwodGhpcy5fcG9ydGFsPW5ldyB4Rih0aGlzLm1lbnUudGVtcGxhdGVSZWYsdGhpcy5fdmlld0NvbnRhaW5lclJlZikpLHRoaXMuX3BvcnRhbH19ZVkuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGVZKShTbShwTCksU20oaGcpLFNtKGVoKSxTbShKVyksU20oVVcsOCksU20oV1csMTApLFNtKEhJLDgpLFNtKFNJKSl9LGVZLsm1ZGlyPWxvKHt0eXBlOmVZLHNlbGVjdG9yczpbWyIiLCJtYXQtbWVudS10cmlnZ2VyLWZvciIsIiJdLFsiIiwibWF0TWVudVRyaWdnZXJGb3IiLCIiXV0saG9zdEF0dHJzOlsiYXJpYS1oYXNwb3B1cCIsInRydWUiLDEsIm1hdC1tZW51LXRyaWdnZXIiXSxob3N0VmFyczoyLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgibW91c2Vkb3duIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5faGFuZGxlTW91c2Vkb3duKGUpfSkpKCJrZXlkb3duIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5faGFuZGxlS2V5ZG93bihlKX0pKSgiY2xpY2siLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9oYW5kbGVDbGljayhlKX0pKSwyJmUmJmpwKCJhcmlhLWV4cGFuZGVkIixuLm1lbnVPcGVufHxudWxsKSgiYXJpYS1jb250cm9scyIsbi5tZW51T3Blbj9uLm1lbnUucGFuZWxJZDpudWxsKX0saW5wdXRzOntyZXN0b3JlRm9jdXM6WyJtYXRNZW51VHJpZ2dlclJlc3RvcmVGb2N1cyIsInJlc3RvcmVGb2N1cyJdLF9kZXByZWNhdGVkTWF0TWVudVRyaWdnZXJGb3I6WyJtYXQtbWVudS10cmlnZ2VyLWZvciIsIl9kZXByZWNhdGVkTWF0TWVudVRyaWdnZXJGb3IiXSxtZW51OlsibWF0TWVudVRyaWdnZXJGb3IiLCJtZW51Il0sbWVudURhdGE6WyJtYXRNZW51VHJpZ2dlckRhdGEiLCJtZW51RGF0YSJdfSxvdXRwdXRzOnttZW51T3BlbmVkOiJtZW51T3BlbmVkIixvbk1lbnVPcGVuOiJvbk1lbnVPcGVuIixtZW51Q2xvc2VkOiJtZW51Q2xvc2VkIixvbk1lbnVDbG9zZToib25NZW51Q2xvc2UifSxleHBvcnRBczpbIm1hdE1lbnVUcmlnZ2VyIl19KSxlWS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnBMfSx7dHlwZTpoZ30se3R5cGU6ZWh9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltKV119XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1VXXX0se3R5cGU6U3J9XX0se3R5cGU6V1csZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOkRyfV19LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOlNJfV0sZVkucHJvcERlY29yYXRvcnM9e19kZXByZWNhdGVkTWF0TWVudVRyaWdnZXJGb3I6W3t0eXBlOnh5LGFyZ3M6WyJtYXQtbWVudS10cmlnZ2VyLWZvciJdfV0sbWVudTpbe3R5cGU6eHksYXJnczpbIm1hdE1lbnVUcmlnZ2VyRm9yIl19XSxtZW51RGF0YTpbe3R5cGU6eHksYXJnczpbIm1hdE1lbnVUcmlnZ2VyRGF0YSJdfV0scmVzdG9yZUZvY3VzOlt7dHlwZTp4eSxhcmdzOlsibWF0TWVudVRyaWdnZXJSZXN0b3JlRm9jdXMiXX1dLG1lbnVPcGVuZWQ6W3t0eXBlOk95fV0sb25NZW51T3Blbjpbe3R5cGU6T3l9XSxtZW51Q2xvc2VkOlt7dHlwZTpPeX1dLG9uTWVudUNsb3NlOlt7dHlwZTpPeX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGVZLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IlttYXQtbWVudS10cmlnZ2VyLWZvcl0sIFttYXRNZW51VHJpZ2dlckZvcl0iLGhvc3Q6e2NsYXNzOiJtYXQtbWVudS10cmlnZ2VyIiwiYXJpYS1oYXNwb3B1cCI6InRydWUiLCJbYXR0ci5hcmlhLWV4cGFuZGVkXSI6Im1lbnVPcGVuIHx8IG51bGwiLCJbYXR0ci5hcmlhLWNvbnRyb2xzXSI6Im1lbnVPcGVuID8gbWVudS5wYW5lbElkIDogbnVsbCIsIihtb3VzZWRvd24pIjoiX2hhbmRsZU1vdXNlZG93bigkZXZlbnQpIiwiKGtleWRvd24pIjoiX2hhbmRsZUtleWRvd24oJGV2ZW50KSIsIihjbGljaykiOiJfaGFuZGxlQ2xpY2soJGV2ZW50KSJ9LGV4cG9ydEFzOiJtYXRNZW51VHJpZ2dlciJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpwTH0se3R5cGU6aGd9LHt0eXBlOmVofSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbSlddfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltVV119LHt0eXBlOlNyfV19LHt0eXBlOldXLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn1dfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpTSX1dfSkse3Jlc3RvcmVGb2N1czpbe3R5cGU6eHksYXJnczpbIm1hdE1lbnVUcmlnZ2VyUmVzdG9yZUZvY3VzIl19XSxtZW51T3BlbmVkOlt7dHlwZTpPeX1dLG9uTWVudU9wZW46W3t0eXBlOk95fV0sbWVudUNsb3NlZDpbe3R5cGU6T3l9XSxvbk1lbnVDbG9zZTpbe3R5cGU6T3l9XSxfZGVwcmVjYXRlZE1hdE1lbnVUcmlnZ2VyRm9yOlt7dHlwZTp4eSxhcmdzOlsibWF0LW1lbnUtdHJpZ2dlci1mb3IiXX1dLG1lbnU6W3t0eXBlOnh5LGFyZ3M6WyJtYXRNZW51VHJpZ2dlckZvciJdfV0sbWVudURhdGE6W3t0eXBlOnh5LGFyZ3M6WyJtYXRNZW51VHJpZ2dlckRhdGEiXX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBuWXt9blkuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fG5ZKX0sblkuybVtb2Q9YW8oe3R5cGU6bll9KSxuWS7JtWluaj12bih7cHJvdmlkZXJzOltRV10saW1wb3J0czpbWEldfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChuWSxbe3R5cGU6QXksYXJnczpbe2V4cG9ydHM6W2VZLGpXLFhJXSxkZWNsYXJhdGlvbnM6W2VZLGpXXSxwcm92aWRlcnM6W1FXXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKG5ZLHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bZVksalddfSxleHBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW2VZLGpXLFhJXX19KTtjbGFzcyBvWXt9ZnVuY3Rpb24gaVkodCxlKXsxJnQmJlRtKDAsIm1hdC1pY29uIiw4KX1mdW5jdGlvbiBhWSh0LGUpezEmdCYmVG0oMCwibWF0LWljb24iLDkpfWZ1bmN0aW9uIHJZKHQsZSl7MSZ0JiZUbSgwLCJtYXQtaWNvbiIsMTApfXZhciBzWTtvWS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8b1kpfSxvWS7JtW1vZD1hbyh7dHlwZTpvWX0pLG9ZLsm1aW5qPXZuKHtwcm92aWRlcnM6W1FXXSxpbXBvcnRzOltbV00sWEksU0gseUwsblldLHlGLFhJLG5ZXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgob1ksW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltXTSxYSSxTSCx5TCxuWV0sZXhwb3J0czpbeUYsWEksS1csV1csblldLGRlY2xhcmF0aW9uczpbS1csV1ddLHByb3ZpZGVyczpbUVddfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8ob1kse2RlY2xhcmF0aW9uczpmdW5jdGlvbigpe3JldHVybltLVyxXV119LGltcG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bV00sWEksU0gseUwsblldfSxleHBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW3lGLFhJLEtXLFdXLG5ZXX19KSwoZnVuY3Rpb24odCl7dFt0LkRFRkFVTFQ9MF09IkRFRkFVTFQiLHRbdC5EQVJLX01PREVfT049MV09IkRBUktfTU9ERV9PTiIsdFt0LkRBUktfTU9ERV9PRkY9Ml09IkRBUktfTU9ERV9PRkYifSkoc1l8fChzWT17fSkpO2NsYXNzIGxZe2NvbnN0cnVjdG9yKCl7dGhpcy5EYXJrTW9kZU92ZXJyaWRlPXNZLHRoaXMub25PdmVycmlkZUNoYW5nZWQ9bmV3IExofWdldEJ1dHRvblRpdGxlKCl7bGV0IHQ7c3dpdGNoKHRoaXMuZGFya01vZGVPdmVycmlkZSl7Y2FzZSBzWS5ERUZBVUxUOnQ9IkJyb3dzZXIgZGVmYXVsdCI7YnJlYWs7Y2FzZSBzWS5EQVJLX01PREVfT046dD0iRGFyayBtb2RlIjticmVhaztjYXNlIHNZLkRBUktfTU9ERV9PRkY6dD0iTGlnaHQgbW9kZSJ9cmV0dXJuYEN1cnJlbnQgbW9kZTogWyR7dH1dLiBTd2l0Y2ggYmV0d2VlbiBicm93c2VyIGRlZmF1bHQsIGxpZ2h0LCBvciBkYXJrIHRoZW1lLmB9fWxZLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxsWSl9LGxZLsm1Y21wPXRvKHt0eXBlOmxZLHNlbGVjdG9yczpbWyJhcHAtaGVhZGVyLWRhcmstbW9kZS10b2dnbGUtY29tcG9uZW50Il1dLGlucHV0czp7ZGFya01vZGVPdmVycmlkZToiZGFya01vZGVPdmVycmlkZSJ9LG91dHB1dHM6e29uT3ZlcnJpZGVDaGFuZ2VkOiJvbk92ZXJyaWRlQ2hhbmdlZCJ9LGRlY2xzOjE1LHZhcnM6Nixjb25zdHM6W1sibWF0LWljb24tYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsIk1lbnUgZm9yIGNoYW5naW5nIGxpZ2h0IG9yIGRhcmsgdGhlbWUiLDMsIm1hdE1lbnVUcmlnZ2VyRm9yIiwibmdTd2l0Y2giLCJ0aXRsZSJdLFsic3ZnSWNvbiIsImJyaWdodG5lc3NfNl8yNHB4Iiw0LCJuZ1N3aXRjaENhc2UiXSxbInN2Z0ljb24iLCJsaWdodF9tb2RlXzI0cHgiLDQsIm5nU3dpdGNoQ2FzZSJdLFsic3ZnSWNvbiIsImRhcmtfbW9kZV8yNHB4Iiw0LCJuZ1N3aXRjaENhc2UiXSxbIm1lbnUiLCJtYXRNZW51Il0sWyJtYXQtbWVudS1pdGVtIiwiIiwidGl0bGUiLCJTZXQgdGhlIHRoZW1lIHRvIG1hdGNoIHRoZSBkZWZhdWx0IG1vZGUgaW4gdGhlIGJyb3dzZXIuIiwzLCJjbGljayJdLFsibWF0LW1lbnUtaXRlbSIsIiIsInRpdGxlIiwiRm9yY2UgbGlnaHQgVGVuc29yQm9hcmQgdGhlbWUuIiwzLCJjbGljayJdLFsibWF0LW1lbnUtaXRlbSIsIiIsInRpdGxlIiwiRm9yY2UgZGFyayBUZW5zb3JCb2FyZCB0aGVtZS4iLDMsImNsaWNrIl0sWyJzdmdJY29uIiwiYnJpZ2h0bmVzc182XzI0cHgiXSxbInN2Z0ljb24iLCJsaWdodF9tb2RlXzI0cHgiXSxbInN2Z0ljb24iLCJkYXJrX21vZGVfMjRweCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiYnV0dG9uIiwwKSxRcCgxLGlZLDEsMCwibWF0LWljb24iLDEpLFFwKDIsYVksMSwwLCJtYXQtaWNvbiIsMiksUXAoMyxyWSwxLDAsIm1hdC1pY29uIiwzKSxBbSgpLFJtKDQsIm1hdC1tZW51IixudWxsLDQpLFJtKDYsImJ1dHRvbiIsNSksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uT3ZlcnJpZGVDaGFuZ2VkLmVtaXQobi5EYXJrTW9kZU92ZXJyaWRlLkRFRkFVTFQpfSkpLFJtKDcsImxhYmVsIiksa3UoOCwiQnJvd3NlciBkZWZhdWx0IiksQW0oKSxBbSgpLFJtKDksImJ1dHRvbiIsNiksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uT3ZlcnJpZGVDaGFuZ2VkLmVtaXQobi5EYXJrTW9kZU92ZXJyaWRlLkRBUktfTU9ERV9PRkYpfSkpLFJtKDEwLCJsYWJlbCIpLGt1KDExLCJMaWdodCIpLEFtKCksQW0oKSxSbSgxMiwiYnV0dG9uIiw3KSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25PdmVycmlkZUNoYW5nZWQuZW1pdChuLkRhcmtNb2RlT3ZlcnJpZGUuREFSS19NT0RFX09OKX0pKSxSbSgxMywibGFiZWwiKSxrdSgxNCwiRGFyayIpLEFtKCksQW0oKSxBbSgpKSwyJmUmJihEbSgibWF0TWVudVRyaWdnZXJGb3IiLCRwKDUpKSgibmdTd2l0Y2giLG4uZGFya01vZGVPdmVycmlkZSkoInRpdGxlIixuLmdldEJ1dHRvblRpdGxlKCkpLHJjKDEpLERtKCJuZ1N3aXRjaENhc2UiLG4uRGFya01vZGVPdmVycmlkZS5ERUZBVUxUKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIixuLkRhcmtNb2RlT3ZlcnJpZGUuREFSS19NT0RFX09GRikscmMoMSksRG0oIm5nU3dpdGNoQ2FzZSIsbi5EYXJrTW9kZU92ZXJyaWRlLkRBUktfTU9ERV9PTikpfSxkaXJlY3RpdmVzOltYSCxlWSxmTSxnTSxLVyxXVyxEV10sZW5jYXBzdWxhdGlvbjoyfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChsWSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJhcHAtaGVhZGVyLWRhcmstbW9kZS10b2dnbGUtY29tcG9uZW50Iix0ZW1wbGF0ZTonXG4gICAgPGJ1dHRvblxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBbbWF0TWVudVRyaWdnZXJGb3JdPSJtZW51IlxuICAgICAgYXJpYS1sYWJlbD0iTWVudSBmb3IgY2hhbmdpbmcgbGlnaHQgb3IgZGFyayB0aGVtZSJcbiAgICAgIFtuZ1N3aXRjaF09ImRhcmtNb2RlT3ZlcnJpZGUiXG4gICAgICBbdGl0bGVdPSJnZXRCdXR0b25UaXRsZSgpIlxuICAgID5cbiAgICAgIDxtYXQtaWNvblxuICAgICAgICAqbmdTd2l0Y2hDYXNlPSJEYXJrTW9kZU92ZXJyaWRlLkRFRkFVTFQiXG4gICAgICAgIHN2Z0ljb249ImJyaWdodG5lc3NfNl8yNHB4IlxuICAgICAgPjwvbWF0LWljb24+XG4gICAgICA8bWF0LWljb25cbiAgICAgICAgKm5nU3dpdGNoQ2FzZT0iRGFya01vZGVPdmVycmlkZS5EQVJLX01PREVfT0ZGIlxuICAgICAgICBzdmdJY29uPSJsaWdodF9tb2RlXzI0cHgiXG4gICAgICA+PC9tYXQtaWNvbj5cbiAgICAgIDxtYXQtaWNvblxuICAgICAgICAqbmdTd2l0Y2hDYXNlPSJEYXJrTW9kZU92ZXJyaWRlLkRBUktfTU9ERV9PTiJcbiAgICAgICAgc3ZnSWNvbj0iZGFya19tb2RlXzI0cHgiXG4gICAgICA+PC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8bWF0LW1lbnUgI21lbnU9Im1hdE1lbnUiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgIHRpdGxlPSJTZXQgdGhlIHRoZW1lIHRvIG1hdGNoIHRoZSBkZWZhdWx0IG1vZGUgaW4gdGhlIGJyb3dzZXIuIlxuICAgICAgICAoY2xpY2spPSJvbk92ZXJyaWRlQ2hhbmdlZC5lbWl0KERhcmtNb2RlT3ZlcnJpZGUuREVGQVVMVCkiXG4gICAgICA+XG4gICAgICAgIDxsYWJlbD5Ccm93c2VyIGRlZmF1bHQ8L2xhYmVsPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgdGl0bGU9IkZvcmNlIGxpZ2h0IFRlbnNvckJvYXJkIHRoZW1lLiJcbiAgICAgICAgKGNsaWNrKT0ib25PdmVycmlkZUNoYW5nZWQuZW1pdChEYXJrTW9kZU92ZXJyaWRlLkRBUktfTU9ERV9PRkYpIlxuICAgICAgPlxuICAgICAgICA8bGFiZWw+TGlnaHQ8L2xhYmVsPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgdGl0bGU9IkZvcmNlIGRhcmsgVGVuc29yQm9hcmQgdGhlbWUuIlxuICAgICAgICAoY2xpY2spPSJvbk92ZXJyaWRlQ2hhbmdlZC5lbWl0KERhcmtNb2RlT3ZlcnJpZGUuREFSS19NT0RFX09OKSJcbiAgICAgID5cbiAgICAgICAgPGxhYmVsPkRhcms8L2xhYmVsPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9tYXQtbWVudT5cbiAgJ31dfV0sbnVsbCx7ZGFya01vZGVPdmVycmlkZTpbe3R5cGU6eHl9XSxvbk92ZXJyaWRlQ2hhbmdlZDpbe3R5cGU6T3l9XX0pO2NsYXNzIGNZe2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLmRhcmtNb2RlT3ZlcnJpZGUkPXRoaXMuc3RvcmUuc2VsZWN0KFFEKS5waXBlKEl0KCh0PT5udWxsPT09dD9zWS5ERUZBVUxUOnQ/c1kuREFSS19NT0RFX09OOnNZLkRBUktfTU9ERV9PRkYpKSl9Y2hhbmdlRGFya01vZGUodCl7bGV0IGU9bnVsbDtzd2l0Y2godCl7Y2FzZSBzWS5ERUZBVUxUOmU9bnVsbDticmVhaztjYXNlIHNZLkRBUktfTU9ERV9PRkY6ZT0hMTticmVhaztjYXNlIHNZLkRBUktfTU9ERV9PTjplPSEwfXRoaXMuc3RvcmUuZGlzcGF0Y2goV0Eoe2VuYWJsZURhcmtNb2RlOmV9KSl9fWNZLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxjWSkoU20oSXcpKX0sY1kuybVjbXA9dG8oe3R5cGU6Y1ksc2VsZWN0b3JzOltbImFwcC1oZWFkZXItZGFyay1tb2RlLXRvZ2dsZSJdXSxkZWNsczoyLHZhcnM6Myxjb25zdHM6W1szLCJkYXJrTW9kZU92ZXJyaWRlIiwib25PdmVycmlkZUNoYW5nZWQiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImFwcC1oZWFkZXItZGFyay1tb2RlLXRvZ2dsZS1jb21wb25lbnQiLDApLFZtKCJvbk92ZXJyaWRlQ2hhbmdlZCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uY2hhbmdlRGFya01vZGUoZSl9KSksQWgoMSwiYXN5bmMiKSxBbSgpKSwyJmUmJkRtKCJkYXJrTW9kZU92ZXJyaWRlIixUaCgxLDEsbi5kYXJrTW9kZU92ZXJyaWRlJCkpfSxkaXJlY3RpdmVzOltsWV0scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGNZLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImFwcC1oZWFkZXItZGFyay1tb2RlLXRvZ2dsZSIsdGVtcGxhdGU6J1xuICAgIDxhcHAtaGVhZGVyLWRhcmstbW9kZS10b2dnbGUtY29tcG9uZW50XG4gICAgICBbZGFya01vZGVPdmVycmlkZV09ImRhcmtNb2RlT3ZlcnJpZGUkIHwgYXN5bmMiXG4gICAgICAob25PdmVycmlkZUNoYW5nZWQpPSJjaGFuZ2VEYXJrTW9kZSgkZXZlbnQpIlxuICAgID5cbiAgICA8L2FwcC1oZWFkZXItZGFyay1tb2RlLXRvZ2dsZS1jb21wb25lbnQ+XG4gICd9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y29uc3QgZFk9WncodlIsTVIsKCh0LGUpPT4hKCFlfHwhdFtlXSkmJnRbZV0uZGlzYWJsZV9yZWxvYWQpKTtjbGFzcyBwWXtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5yZWxvYWREaXNhYmxlZCQ9dGhpcy5zdG9yZS5zZWxlY3QoZFkpLHRoaXMuaXNSZWxvYWRpbmckPXRoaXMuc3RvcmUuc2VsZWN0KF9SKS5waXBlKGZlKHRoaXMucmVsb2FkRGlzYWJsZWQkKSxJdCgoKFt0LGVdKT0+IWUmJnQ9PT15RS5MT0FESU5HKSkpLHRoaXMubGFzdExvYWRlZFRpbWVJbk1zJD10aGlzLnN0b3JlLnNlbGVjdChDUil9dHJpZ2dlclJlbG9hZCgpe3RoaXMuc3RvcmUuZGlzcGF0Y2godkUoKSl9Z2V0UmVsb2FkVGl0bGUodCl7cmV0dXJuIHQ/YExhc3QgVXBkYXRlZDogJHt0fWA6IkxvYWRpbmcuLi4ifX1mdW5jdGlvbiBtWSh0KXtyZXR1cm4gdC5zdGF0ZSE9PXlFLk5PVF9MT0FERUQmJnQuc3RhdGUhPT15RS5MT0FESU5HfXBZLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxwWSkoU20oSXcpKX0scFkuybVjbXA9dG8oe3R5cGU6cFksc2VsZWN0b3JzOltbImFwcC1oZWFkZXItcmVsb2FkIl1dLGRlY2xzOjYsdmFyczoxMyxjb25zdHM6W1sibWF0LWljb24tYnV0dG9uIiwiIiwxLCJyZWxvYWQtYnV0dG9uIiwzLCJ0aXRsZSIsImRpc2FibGVkIiwiY2xpY2siXSxbInN2Z0ljb24iLCJyZWZyZXNoXzI0cHgiLDEsInJlZnJlc2gtaWNvbiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiYnV0dG9uIiwwKSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4udHJpZ2dlclJlbG9hZCgpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiZGF0ZSIpLEFoKDMsImFzeW5jIiksQWgoNCwiYXN5bmMiKSxUbSg1LCJtYXQtaWNvbiIsMSksQW0oKSksMiZlJiYocHUoImxvYWRpbmciLFRoKDEsNCxuLmlzUmVsb2FkaW5nJCkpLERtKCJ0aXRsZSIsbi5nZXRSZWxvYWRUaXRsZShOaCgyLDYsVGgoMyw5LG4ubGFzdExvYWRlZFRpbWVJbk1zJCksIm1lZGl1bSIpKSkoImRpc2FibGVkIixUaCg0LDExLG4ucmVsb2FkRGlzYWJsZWQkKSkpfSxkaXJlY3RpdmVzOltYSCxEV10scGlwZXM6W3dNLFJNXSxzdHlsZXM6WyIucmVsb2FkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5yZWZyZXNoLWljb25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgIC5yZWxvYWQtYnV0dG9uLmxvYWRpbmdbX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgYW5pbWF0aW9uOiByb3RhdGUgMnMgbGluZWFyIGluZmluaXRlO1xuICAgICAgfVxuXG4gICAgICBAa2V5ZnJhbWVzIHJvdGF0ZSB7XG4gICAgICAgIDAlIHtcbiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcbiAgICAgICAgfVxuICAgICAgICA1MCUge1xuICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XG4gICAgICAgIH1cbiAgICAgICAgMTAwJSB7XG4gICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgICAgICAgfVxuICAgICAgfSJdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChwWSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJhcHAtaGVhZGVyLXJlbG9hZCIsdGVtcGxhdGU6J1xuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPSJyZWxvYWQtYnV0dG9uIlxuICAgICAgW2NsYXNzLmxvYWRpbmddPSJpc1JlbG9hZGluZyQgfCBhc3luYyJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgKGNsaWNrKT0idHJpZ2dlclJlbG9hZCgpIlxuICAgICAgW3RpdGxlXT0iZ2V0UmVsb2FkVGl0bGUobGFzdExvYWRlZFRpbWVJbk1zJCB8IGFzeW5jIHwgZGF0ZTogXCdtZWRpdW1cJykiXG4gICAgICBbZGlzYWJsZWRdPSJyZWxvYWREaXNhYmxlZCQgfCBhc3luYyJcbiAgICA+XG4gICAgICA8bWF0LWljb24gY2xhc3M9InJlZnJlc2gtaWNvbiIgc3ZnSWNvbj0icmVmcmVzaF8yNHB4Ij48L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICAnLHN0eWxlczpbIlxuICAgICAgLnJlbG9hZC1idXR0b24sXG4gICAgICAucmVmcmVzaC1pY29uIHtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgIC5yZWxvYWQtYnV0dG9uLmxvYWRpbmcge1xuICAgICAgICBhbmltYXRpb246IHJvdGF0ZSAycyBsaW5lYXIgaW5maW5pdGU7XG4gICAgICB9XG5cbiAgICAgIEBrZXlmcmFtZXMgcm90YXRlIHtcbiAgICAgICAgMCUge1xuICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICAgICAgICB9XG4gICAgICAgIDUwJSB7XG4gICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbiAgICAgICAgfVxuICAgICAgICAxMDAlIHtcbiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgIl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y29uc3QgdVk9eWsod04sYmsodk4sKHQ9Pm1ZKHQpP09iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7c2V0dGluZ3M6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuc2V0dGluZ3MpLHtyZWxvYWRFbmFibGVkOiF0LnNldHRpbmdzLnJlbG9hZEVuYWJsZWR9KX0pOnQpKSxiayh4TiwoKHQse3BlcmlvZEluTXM6ZX0pPT57aWYoIW1ZKHQpKXJldHVybiB0O2NvbnN0IG49ZT49M2U0P2U6dC5zZXR0aW5ncy5yZWxvYWRQZXJpb2RJbk1zO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NldHRpbmdzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnNldHRpbmdzKSx7cmVsb2FkUGVyaW9kSW5NczpufSl9KX0pKSxiayhPTiwoKHQse3NpemU6ZX0pPT57aWYoIW1ZKHQpKXJldHVybiB0O2NvbnN0IG49ZT4wP2U6dC5zZXR0aW5ncy5wYWdlU2l6ZTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzZXR0aW5nczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5zZXR0aW5ncykse3BhZ2VTaXplOm59KX0pfSkpLGJrKFdTLCgodCx7cGFydGlhbFNldHRpbmdzOmV9KT0+e2NvbnN0IG49e307cmV0dXJuIE51bWJlci5pc0Zpbml0ZShlLnBhZ2VTaXplKSYmZS5wYWdlU2l6ZT4wJiYobi5wYWdlU2l6ZT1lLnBhZ2VTaXplKSwiYm9vbGVhbiI9PXR5cGVvZiBlLmF1dG9SZWxvYWQmJihuLnJlbG9hZEVuYWJsZWQ9ZS5hdXRvUmVsb2FkKSxOdW1iZXIuaXNGaW5pdGUoZS5hdXRvUmVsb2FkUGVyaW9kSW5NcykmJmUuYXV0b1JlbG9hZFBlcmlvZEluTXM+M2U0JiYobi5yZWxvYWRQZXJpb2RJbk1zPWUuYXV0b1JlbG9hZFBlcmlvZEluTXMpLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7c2V0dGluZ3M6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuc2V0dGluZ3MpLG4pfSl9KSkpO2Z1bmN0aW9uIGZZKHQsZSl7cmV0dXJuIHVZKHQsZSl9Y29uc3QgZ1k9WyJpbnB1dCJdLGhZPWZ1bmN0aW9uKHQpe3JldHVybntlbnRlckR1cmF0aW9uOnR9fSxiWT1uZXcgR2EoIm1hdC1jaGVja2JveC1kZWZhdWx0LW9wdGlvbnMiLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OmZ1bmN0aW9uIHlZKCl7cmV0dXJue2NvbG9yOiJhY2NlbnQiLGNsaWNrQWN0aW9uOiJjaGVjay1pbmRldGVybWluYXRlIn19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL30pO2xldCBfWT0wO2NvbnN0IENZPXtjb2xvcjoiYWNjZW50IixjbGlja0FjdGlvbjoiY2hlY2staW5kZXRlcm1pbmF0ZSJ9LE1ZPXtwcm92aWRlOklWLHVzZUV4aXN0aW5nOnFlKCgoKT0+T1kpKSxtdWx0aTohMH07Y2xhc3Mgdll7fWNvbnN0IHhZPSRJKEpJKFFJKEtJKGNsYXNze2NvbnN0cnVjdG9yKHQpe3RoaXMuX2VsZW1lbnRSZWY9dH19KSkpKTtjbGFzcyBPWSBleHRlbmRzIHhZe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIpe3N1cGVyKHQpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmPWUsdGhpcy5fZm9jdXNNb25pdG9yPW4sdGhpcy5fbmdab25lPW8sdGhpcy5fYW5pbWF0aW9uTW9kZT1hLHRoaXMuX29wdGlvbnM9cix0aGlzLmFyaWFMYWJlbD0iIix0aGlzLmFyaWFMYWJlbGxlZGJ5PW51bGwsdGhpcy5fdW5pcXVlSWQ9Im1hdC1jaGVja2JveC0iKyArK19ZLHRoaXMuaWQ9dGhpcy5fdW5pcXVlSWQsdGhpcy5sYWJlbFBvc2l0aW9uPSJhZnRlciIsdGhpcy5uYW1lPW51bGwsdGhpcy5jaGFuZ2U9bmV3IExoLHRoaXMuaW5kZXRlcm1pbmF0ZUNoYW5nZT1uZXcgTGgsdGhpcy5fb25Ub3VjaGVkPSgpPT57fSx0aGlzLl9jdXJyZW50QW5pbWF0aW9uQ2xhc3M9IiIsdGhpcy5fY3VycmVudENoZWNrU3RhdGU9MCx0aGlzLl9jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuPSgpPT57fSx0aGlzLl9jaGVja2VkPSExLHRoaXMuX2Rpc2FibGVkPSExLHRoaXMuX2luZGV0ZXJtaW5hdGU9ITEsdGhpcy5fb3B0aW9ucz10aGlzLl9vcHRpb25zfHxDWSx0aGlzLmNvbG9yPXRoaXMuZGVmYXVsdENvbG9yPXRoaXMuX29wdGlvbnMuY29sb3J8fENZLmNvbG9yLHRoaXMudGFiSW5kZXg9cGFyc2VJbnQoaSl8fDB9Z2V0IGlucHV0SWQoKXtyZXR1cm5gJHt0aGlzLmlkfHx0aGlzLl91bmlxdWVJZH0taW5wdXRgfWdldCByZXF1aXJlZCgpe3JldHVybiB0aGlzLl9yZXF1aXJlZH1zZXQgcmVxdWlyZWQodCl7dGhpcy5fcmVxdWlyZWQ9eXoodCl9bmdBZnRlclZpZXdJbml0KCl7dGhpcy5fZm9jdXNNb25pdG9yLm1vbml0b3IodGhpcy5fZWxlbWVudFJlZiwhMCkuc3Vic2NyaWJlKCh0PT57dHx8UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKCk9Pnt0aGlzLl9vblRvdWNoZWQoKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX0pKX0pKSx0aGlzLl9zeW5jSW5kZXRlcm1pbmF0ZSh0aGlzLl9pbmRldGVybWluYXRlKX1uZ0FmdGVyVmlld0NoZWNrZWQoKXt9bmdPbkRlc3Ryb3koKXt0aGlzLl9mb2N1c01vbml0b3Iuc3RvcE1vbml0b3JpbmcodGhpcy5fZWxlbWVudFJlZil9Z2V0IGNoZWNrZWQoKXtyZXR1cm4gdGhpcy5fY2hlY2tlZH1zZXQgY2hlY2tlZCh0KXt0IT10aGlzLmNoZWNrZWQmJih0aGlzLl9jaGVja2VkPXQsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpfWdldCBkaXNhYmxlZCgpe3JldHVybiB0aGlzLl9kaXNhYmxlZH1zZXQgZGlzYWJsZWQodCl7Y29uc3QgZT15eih0KTtlIT09dGhpcy5kaXNhYmxlZCYmKHRoaXMuX2Rpc2FibGVkPWUsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpfWdldCBpbmRldGVybWluYXRlKCl7cmV0dXJuIHRoaXMuX2luZGV0ZXJtaW5hdGV9c2V0IGluZGV0ZXJtaW5hdGUodCl7Y29uc3QgZT10IT10aGlzLl9pbmRldGVybWluYXRlO3RoaXMuX2luZGV0ZXJtaW5hdGU9eXoodCksZSYmKHRoaXMuX3RyYW5zaXRpb25DaGVja1N0YXRlKHRoaXMuX2luZGV0ZXJtaW5hdGU/Mzp0aGlzLmNoZWNrZWQ/MToyKSx0aGlzLmluZGV0ZXJtaW5hdGVDaGFuZ2UuZW1pdCh0aGlzLl9pbmRldGVybWluYXRlKSksdGhpcy5fc3luY0luZGV0ZXJtaW5hdGUodGhpcy5faW5kZXRlcm1pbmF0ZSl9X2lzUmlwcGxlRGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5kaXNhYmxlUmlwcGxlfHx0aGlzLmRpc2FibGVkfV9vbkxhYmVsVGV4dENoYW5nZSgpe3RoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKX13cml0ZVZhbHVlKHQpe3RoaXMuY2hlY2tlZD0hIXR9cmVnaXN0ZXJPbkNoYW5nZSh0KXt0aGlzLl9jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuPXR9cmVnaXN0ZXJPblRvdWNoZWQodCl7dGhpcy5fb25Ub3VjaGVkPXR9c2V0RGlzYWJsZWRTdGF0ZSh0KXt0aGlzLmRpc2FibGVkPXR9X2dldEFyaWFDaGVja2VkKCl7cmV0dXJuIHRoaXMuY2hlY2tlZD8idHJ1ZSI6dGhpcy5pbmRldGVybWluYXRlPyJtaXhlZCI6ImZhbHNlIn1fdHJhbnNpdGlvbkNoZWNrU3RhdGUodCl7bGV0IGU9dGhpcy5fY3VycmVudENoZWNrU3RhdGUsbj10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7aWYoZSE9PXQmJih0aGlzLl9jdXJyZW50QW5pbWF0aW9uQ2xhc3MubGVuZ3RoPjAmJm4uY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9jdXJyZW50QW5pbWF0aW9uQ2xhc3MpLHRoaXMuX2N1cnJlbnRBbmltYXRpb25DbGFzcz10aGlzLl9nZXRBbmltYXRpb25DbGFzc0ZvckNoZWNrU3RhdGVUcmFuc2l0aW9uKGUsdCksdGhpcy5fY3VycmVudENoZWNrU3RhdGU9dCx0aGlzLl9jdXJyZW50QW5pbWF0aW9uQ2xhc3MubGVuZ3RoPjApKXtuLmNsYXNzTGlzdC5hZGQodGhpcy5fY3VycmVudEFuaW1hdGlvbkNsYXNzKTtjb25zdCB0PXRoaXMuX2N1cnJlbnRBbmltYXRpb25DbGFzczt0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT57c2V0VGltZW91dCgoKCk9PntuLmNsYXNzTGlzdC5yZW1vdmUodCl9KSwxZTMpfSkpfX1fZW1pdENoYW5nZUV2ZW50KCl7Y29uc3QgdD1uZXcgdlk7dC5zb3VyY2U9dGhpcyx0LmNoZWNrZWQ9dGhpcy5jaGVja2VkLHRoaXMuX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm4odGhpcy5jaGVja2VkKSx0aGlzLmNoYW5nZS5lbWl0KHQpLHRoaXMuX2lucHV0RWxlbWVudCYmKHRoaXMuX2lucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmNoZWNrZWQ9dGhpcy5jaGVja2VkKX10b2dnbGUoKXt0aGlzLmNoZWNrZWQ9IXRoaXMuY2hlY2tlZH1fb25JbnB1dENsaWNrKHQpe3ZhciBlO2NvbnN0IG49bnVsbD09PShlPXRoaXMuX29wdGlvbnMpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmNsaWNrQWN0aW9uO3Quc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5kaXNhYmxlZHx8Im5vb3AiPT09bj90aGlzLmRpc2FibGVkfHwibm9vcCIhPT1ufHwodGhpcy5faW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2hlY2tlZD10aGlzLmNoZWNrZWQsdGhpcy5faW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuaW5kZXRlcm1pbmF0ZT10aGlzLmluZGV0ZXJtaW5hdGUpOih0aGlzLmluZGV0ZXJtaW5hdGUmJiJjaGVjayIhPT1uJiZQcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+e3RoaXMuX2luZGV0ZXJtaW5hdGU9ITEsdGhpcy5pbmRldGVybWluYXRlQ2hhbmdlLmVtaXQodGhpcy5faW5kZXRlcm1pbmF0ZSl9KSksdGhpcy50b2dnbGUoKSx0aGlzLl90cmFuc2l0aW9uQ2hlY2tTdGF0ZSh0aGlzLl9jaGVja2VkPzE6MiksdGhpcy5fZW1pdENoYW5nZUV2ZW50KCkpfWZvY3VzKHQsZSl7dD90aGlzLl9mb2N1c01vbml0b3IuZm9jdXNWaWEodGhpcy5faW5wdXRFbGVtZW50LHQsZSk6dGhpcy5faW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoZSl9X29uSW50ZXJhY3Rpb25FdmVudCh0KXt0LnN0b3BQcm9wYWdhdGlvbigpfV9nZXRBbmltYXRpb25DbGFzc0ZvckNoZWNrU3RhdGVUcmFuc2l0aW9uKHQsZSl7aWYoIk5vb3BBbmltYXRpb25zIj09PXRoaXMuX2FuaW1hdGlvbk1vZGUpcmV0dXJuIiI7bGV0IG49IiI7c3dpdGNoKHQpe2Nhc2UgMDppZigxPT09ZSluPSJ1bmNoZWNrZWQtY2hlY2tlZCI7ZWxzZXtpZigzIT1lKXJldHVybiIiO249InVuY2hlY2tlZC1pbmRldGVybWluYXRlIn1icmVhaztjYXNlIDI6bj0xPT09ZT8idW5jaGVja2VkLWNoZWNrZWQiOiJ1bmNoZWNrZWQtaW5kZXRlcm1pbmF0ZSI7YnJlYWs7Y2FzZSAxOm49Mj09PWU/ImNoZWNrZWQtdW5jaGVja2VkIjoiY2hlY2tlZC1pbmRldGVybWluYXRlIjticmVhaztjYXNlIDM6bj0xPT09ZT8iaW5kZXRlcm1pbmF0ZS1jaGVja2VkIjoiaW5kZXRlcm1pbmF0ZS11bmNoZWNrZWQifXJldHVybmBtYXQtY2hlY2tib3gtYW5pbS0ke259YH1fc3luY0luZGV0ZXJtaW5hdGUodCl7Y29uc3QgZT10aGlzLl9pbnB1dEVsZW1lbnQ7ZSYmKGUubmF0aXZlRWxlbWVudC5pbmRldGVybWluYXRlPXQpfX1PWS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8T1kpKFNtKGhnKSxTbShVZyksU20oU0kpLFNtKGFfKSxOYSgidGFiaW5kZXgiKSxTbShWUCw4KSxTbShiWSw4KSl9LE9ZLsm1Y21wPXRvKHt0eXBlOk9ZLHNlbGVjdG9yczpbWyJtYXQtY2hlY2tib3giXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihRaChnWSw1KSxRaChrSCw1KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5faW5wdXRFbGVtZW50PXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLnJpcHBsZT10LmZpcnN0KX19LGhvc3RBdHRyczpbMSwibWF0LWNoZWNrYm94Il0saG9zdFZhcnM6MTIsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJihUdSgiaWQiLG4uaWQpLGpwKCJ0YWJpbmRleCIsbnVsbCkscHUoIm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlIixuLmluZGV0ZXJtaW5hdGUpKCJtYXQtY2hlY2tib3gtY2hlY2tlZCIsbi5jaGVja2VkKSgibWF0LWNoZWNrYm94LWRpc2FibGVkIixuLmRpc2FibGVkKSgibWF0LWNoZWNrYm94LWxhYmVsLWJlZm9yZSIsImJlZm9yZSI9PW4ubGFiZWxQb3NpdGlvbikoIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIiwiTm9vcEFuaW1hdGlvbnMiPT09bi5fYW5pbWF0aW9uTW9kZSkpfSxpbnB1dHM6e2Rpc2FibGVSaXBwbGU6ImRpc2FibGVSaXBwbGUiLGNvbG9yOiJjb2xvciIsdGFiSW5kZXg6InRhYkluZGV4IixhcmlhTGFiZWw6WyJhcmlhLWxhYmVsIiwiYXJpYUxhYmVsIl0sYXJpYUxhYmVsbGVkYnk6WyJhcmlhLWxhYmVsbGVkYnkiLCJhcmlhTGFiZWxsZWRieSJdLGlkOiJpZCIsbGFiZWxQb3NpdGlvbjoibGFiZWxQb3NpdGlvbiIsbmFtZToibmFtZSIscmVxdWlyZWQ6InJlcXVpcmVkIixjaGVja2VkOiJjaGVja2VkIixkaXNhYmxlZDoiZGlzYWJsZWQiLGluZGV0ZXJtaW5hdGU6ImluZGV0ZXJtaW5hdGUiLGFyaWFEZXNjcmliZWRieTpbImFyaWEtZGVzY3JpYmVkYnkiLCJhcmlhRGVzY3JpYmVkYnkiXSx2YWx1ZToidmFsdWUifSxvdXRwdXRzOntjaGFuZ2U6ImNoYW5nZSIsaW5kZXRlcm1pbmF0ZUNoYW5nZToiaW5kZXRlcm1pbmF0ZUNoYW5nZSJ9LGV4cG9ydEFzOlsibWF0Q2hlY2tib3giXSxmZWF0dXJlczpbcGcoW01ZXSkseHBdLG5nQ29udGVudFNlbGVjdG9yczpbIioiXSxkZWNsczoxNyx2YXJzOjIxLGNvbnN0czpbWzEsIm1hdC1jaGVja2JveC1sYXlvdXQiXSxbImxhYmVsIiwiIl0sWzEsIm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXIiXSxbInR5cGUiLCJjaGVja2JveCIsMSwibWF0LWNoZWNrYm94LWlucHV0IiwiY2RrLXZpc3VhbGx5LWhpZGRlbiIsMywiaWQiLCJyZXF1aXJlZCIsImNoZWNrZWQiLCJkaXNhYmxlZCIsInRhYkluZGV4IiwiY2hhbmdlIiwiY2xpY2siXSxbImlucHV0IiwiIl0sWyJtYXRSaXBwbGUiLCIiLDEsIm1hdC1jaGVja2JveC1yaXBwbGUiLCJtYXQtZm9jdXMtaW5kaWNhdG9yIiwzLCJtYXRSaXBwbGVUcmlnZ2VyIiwibWF0UmlwcGxlRGlzYWJsZWQiLCJtYXRSaXBwbGVSYWRpdXMiLCJtYXRSaXBwbGVDZW50ZXJlZCIsIm1hdFJpcHBsZUFuaW1hdGlvbiJdLFsxLCJtYXQtcmlwcGxlLWVsZW1lbnQiLCJtYXQtY2hlY2tib3gtcGVyc2lzdGVudC1yaXBwbGUiXSxbMSwibWF0LWNoZWNrYm94LWZyYW1lIl0sWzEsIm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kIl0sWyJ2ZXJzaW9uIiwiMS4xIiwiZm9jdXNhYmxlIiwiZmFsc2UiLCJ2aWV3Qm94IiwiMCAwIDI0IDI0IiwwLCJ4bWwiLCJzcGFjZSIsInByZXNlcnZlIiwiYXJpYS1oaWRkZW4iLCJ0cnVlIiwxLCJtYXQtY2hlY2tib3gtY2hlY2ttYXJrIl0sWyJmaWxsIiwibm9uZSIsInN0cm9rZSIsIndoaXRlIiwiZCIsIk00LjEsMTIuNyA5LDE3LjYgMjAuMyw2LjMiLDEsIm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aCJdLFsxLCJtYXQtY2hlY2tib3gtbWl4ZWRtYXJrIl0sWzEsIm1hdC1jaGVja2JveC1sYWJlbCIsMywiY2RrT2JzZXJ2ZUNvbnRlbnQiXSxbImNoZWNrYm94TGFiZWwiLCIiXSxbMiwiZGlzcGxheSIsIm5vbmUiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmKFptKCksUm0oMCwibGFiZWwiLDAsMSksUm0oMiwic3BhbiIsMiksUm0oMywiaW5wdXQiLDMsNCksVm0oImNoYW5nZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX29uSW50ZXJhY3Rpb25FdmVudChlKX0pKSgiY2xpY2siLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9vbklucHV0Q2xpY2soZSl9KSksQW0oKSxSbSg1LCJzcGFuIiw1KSxUbSg2LCJzcGFuIiw2KSxBbSgpLFRtKDcsInNwYW4iLDcpLFJtKDgsInNwYW4iLDgpLHFpKCksUm0oOSwic3ZnIiw5KSxUbSgxMCwicGF0aCIsMTApLEFtKCksWmkoKSxUbSgxMSwic3BhbiIsMTEpLEFtKCksQW0oKSxSbSgxMiwic3BhbiIsMTIsMTMpLFZtKCJjZGtPYnNlcnZlQ29udGVudCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5fb25MYWJlbFRleHRDaGFuZ2UoKX0pKSxSbSgxNCwic3BhbiIsMTQpLGt1KDE1LCLCoCIpLEFtKCksWG0oMTYpLEFtKCksQW0oKSksMiZlKXtjb25zdCB0PSRwKDEpLGU9JHAoMTMpO2pwKCJmb3IiLG4uaW5wdXRJZCkscmMoMikscHUoIm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXItbm8tc2lkZS1tYXJnaW4iLCFlLnRleHRDb250ZW50fHwhZS50ZXh0Q29udGVudC50cmltKCkpLHJjKDEpLERtKCJpZCIsbi5pbnB1dElkKSgicmVxdWlyZWQiLG4ucmVxdWlyZWQpKCJjaGVja2VkIixuLmNoZWNrZWQpKCJkaXNhYmxlZCIsbi5kaXNhYmxlZCkoInRhYkluZGV4IixuLnRhYkluZGV4KSxqcCgidmFsdWUiLG4udmFsdWUpKCJuYW1lIixuLm5hbWUpKCJhcmlhLWxhYmVsIixuLmFyaWFMYWJlbHx8bnVsbCkoImFyaWEtbGFiZWxsZWRieSIsbi5hcmlhTGFiZWxsZWRieSkoImFyaWEtY2hlY2tlZCIsbi5fZ2V0QXJpYUNoZWNrZWQoKSkoImFyaWEtZGVzY3JpYmVkYnkiLG4uYXJpYURlc2NyaWJlZGJ5KSxyYygyKSxEbSgibWF0UmlwcGxlVHJpZ2dlciIsdCkoIm1hdFJpcHBsZURpc2FibGVkIixuLl9pc1JpcHBsZURpc2FibGVkKCkpKCJtYXRSaXBwbGVSYWRpdXMiLDIwKSgibWF0UmlwcGxlQ2VudGVyZWQiLCEwKSgibWF0UmlwcGxlQW5pbWF0aW9uIixNaCgxOSxoWSwiTm9vcEFuaW1hdGlvbnMiPT09bi5fYW5pbWF0aW9uTW9kZT8wOjE1MCkpfX0sZGlyZWN0aXZlczpba0gsanpdLHN0eWxlczpbIkBrZXlmcmFtZXMgbWF0LWNoZWNrYm94LWZhZGUtaW4tYmFja2dyb3VuZHswJXtvcGFjaXR5OjB9NTAle29wYWNpdHk6MX19QGtleWZyYW1lcyBtYXQtY2hlY2tib3gtZmFkZS1vdXQtYmFja2dyb3VuZHswJSw1MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIG1hdC1jaGVja2JveC11bmNoZWNrZWQtY2hlY2tlZC1jaGVja21hcmstcGF0aHswJSw1MCV7c3Ryb2tlLWRhc2hvZmZzZXQ6MjIuOTEwMjU5fTUwJXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLCAwLCAwLjIsIDAuMSl9MTAwJXtzdHJva2UtZGFzaG9mZnNldDowfX1Aa2V5ZnJhbWVzIG1hdC1jaGVja2JveC11bmNoZWNrZWQtaW5kZXRlcm1pbmF0ZS1taXhlZG1hcmt7MCUsNjguMiV7dHJhbnNmb3JtOnNjYWxlWCgwKX02OC4yJXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLCAwLCAwLCAxKX0xMDAle3RyYW5zZm9ybTpzY2FsZVgoMSl9fUBrZXlmcmFtZXMgbWF0LWNoZWNrYm94LWNoZWNrZWQtdW5jaGVja2VkLWNoZWNrbWFyay1wYXRoe2Zyb217YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC40LCAwLCAxLCAxKTtzdHJva2UtZGFzaG9mZnNldDowfXRve3N0cm9rZS1kYXNob2Zmc2V0Oi0yMi45MTAyNTl9fUBrZXlmcmFtZXMgbWF0LWNoZWNrYm94LWNoZWNrZWQtaW5kZXRlcm1pbmF0ZS1jaGVja21hcmt7ZnJvbXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLCAwLCAwLjIsIDAuMSk7b3BhY2l0eToxO3RyYW5zZm9ybTpyb3RhdGUoMGRlZyl9dG97b3BhY2l0eTowO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfX1Aa2V5ZnJhbWVzIG1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLWNoZWNrZWQtY2hlY2ttYXJre2Zyb217YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4xNCwgMCwgMCwgMSk7b3BhY2l0eTowO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfXRve29wYWNpdHk6MTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fUBrZXlmcmFtZXMgbWF0LWNoZWNrYm94LWNoZWNrZWQtaW5kZXRlcm1pbmF0ZS1taXhlZG1hcmt7ZnJvbXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLCAwLCAwLjIsIDAuMSk7b3BhY2l0eTowO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX10b3tvcGFjaXR5OjE7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX19QGtleWZyYW1lcyBtYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS1jaGVja2VkLW1peGVkbWFya3tmcm9te2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTQsIDAsIDAsIDEpO29wYWNpdHk6MTt0cmFuc2Zvcm06cm90YXRlKDBkZWcpfXRve29wYWNpdHk6MDt0cmFuc2Zvcm06cm90YXRlKDMxNWRlZyl9fUBrZXlmcmFtZXMgbWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUtdW5jaGVja2VkLW1peGVkbWFya3swJXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmxpbmVhcjtvcGFjaXR5OjE7dHJhbnNmb3JtOnNjYWxlWCgxKX0zMi44JSwxMDAle29wYWNpdHk6MDt0cmFuc2Zvcm06c2NhbGVYKDApfX0ubWF0LWNoZWNrYm94LWJhY2tncm91bmQsLm1hdC1jaGVja2JveC1mcmFtZXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjJweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9pbnRlci1ldmVudHM6bm9uZX0ubWF0LWNoZWNrYm94e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3RyYW5zaXRpb246YmFja2dyb3VuZCA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxib3gtc2hhZG93IDI4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7Y3Vyc29yOnBvaW50ZXI7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50fS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtY2hlY2tib3h7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtY2hlY2tib3ggLm1hdC1yaXBwbGUtZWxlbWVudDpub3QoLm1hdC1jaGVja2JveC1wZXJzaXN0ZW50LXJpcHBsZSl7b3BhY2l0eTouMTZ9Lm1hdC1jaGVja2JveCAubWF0LWNoZWNrYm94LXJpcHBsZXtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OmNhbGMoNTAlIC0gMjBweCk7dG9wOmNhbGMoNTAlIC0gMjBweCk7aGVpZ2h0OjQwcHg7d2lkdGg6NDBweDt6LWluZGV4OjE7cG9pbnRlci1ldmVudHM6bm9uZX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtY2hlY2tib3guY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1jaGVja2JveC1yaXBwbGV7b3V0bGluZTpzb2xpZCAzcHh9Lm1hdC1jaGVja2JveC1sYXlvdXR7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjppbmhlcml0O2FsaWduLWl0ZW1zOmJhc2VsaW5lO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtkaXNwbGF5OmlubGluZS1mbGV4O3doaXRlLXNwYWNlOm5vd3JhcH0ubWF0LWNoZWNrYm94LWxhYmVsey13ZWJraXQtdXNlci1zZWxlY3Q6YXV0bzstbW96LXVzZXItc2VsZWN0OmF1dG87LW1zLXVzZXItc2VsZWN0OmF1dG87dXNlci1zZWxlY3Q6YXV0b30ubWF0LWNoZWNrYm94LWlubmVyLWNvbnRhaW5lcntkaXNwbGF5OmlubGluZS1ibG9jaztoZWlnaHQ6MTZweDtsaW5lLWhlaWdodDowO21hcmdpbjphdXRvO21hcmdpbi1yaWdodDo4cHg7b3JkZXI6MDtwb3NpdGlvbjpyZWxhdGl2ZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7d2hpdGUtc3BhY2U6bm93cmFwO3dpZHRoOjE2cHg7ZmxleC1zaHJpbms6MH1bZGlyPXJ0bF0gLm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXJ7bWFyZ2luLWxlZnQ6OHB4O21hcmdpbi1yaWdodDphdXRvfS5tYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVyLW5vLXNpZGUtbWFyZ2lue21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjB9Lm1hdC1jaGVja2JveC1mcmFtZXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246Ym9yZGVyLWNvbG9yIDkwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKTtib3JkZXItd2lkdGg6MnB4O2JvcmRlci1zdHlsZTpzb2xpZH0uX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1jaGVja2JveC1mcmFtZXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1jaGVja2JveC1iYWNrZ3JvdW5ke2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmlubGluZS1mbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDkwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKSxvcGFjaXR5IDkwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKTstd2Via2l0LXByaW50LWNvbG9yLWFkanVzdDpleGFjdDtjb2xvci1hZGp1c3Q6ZXhhY3R9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHt0cmFuc2l0aW9uOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWNoZWNrYm94IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kOm5vbmV9Lm1hdC1jaGVja2JveC1wZXJzaXN0ZW50LXJpcHBsZXtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7dHJhbnNmb3JtOm5vbmV9Lm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXI6aG92ZXIgLm1hdC1jaGVja2JveC1wZXJzaXN0ZW50LXJpcHBsZXtvcGFjaXR5Oi4wNH0ubWF0LWNoZWNrYm94LmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtY2hlY2tib3gtcGVyc2lzdGVudC1yaXBwbGV7b3BhY2l0eTouMTJ9Lm1hdC1jaGVja2JveC1wZXJzaXN0ZW50LXJpcHBsZSwubWF0LWNoZWNrYm94Lm1hdC1jaGVja2JveC1kaXNhYmxlZCAubWF0LWNoZWNrYm94LWlubmVyLWNvbnRhaW5lcjpob3ZlciAubWF0LWNoZWNrYm94LXBlcnNpc3RlbnQtcmlwcGxle29wYWNpdHk6MH1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVyOmhvdmVyIC5tYXQtY2hlY2tib3gtcGVyc2lzdGVudC1yaXBwbGV7ZGlzcGxheTpub25lfX0ubWF0LWNoZWNrYm94LWNoZWNrbWFya3t0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGh7c3Ryb2tlLWRhc2hvZmZzZXQ6MjIuOTEwMjU5O3N0cm9rZS1kYXNoYXJyYXk6MjIuOTEwMjU5O3N0cm9rZS13aWR0aDoyLjEzMzMzMzMzMzNweH0uY2RrLWhpZ2gtY29udHJhc3QtYmxhY2stb24td2hpdGUgLm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHtzdHJva2U6IzAwMCAhaW1wb3J0YW50fS5tYXQtY2hlY2tib3gtbWl4ZWRtYXJre3dpZHRoOmNhbGMoMTAwJSAtIDZweCk7aGVpZ2h0OjJweDtvcGFjaXR5OjA7dHJhbnNmb3JtOnNjYWxlWCgwKSByb3RhdGUoMGRlZyk7Ym9yZGVyLXJhZGl1czoycHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWNoZWNrYm94LW1peGVkbWFya3toZWlnaHQ6MDtib3JkZXItdG9wOnNvbGlkIDJweDttYXJnaW4tdG9wOjJweH0ubWF0LWNoZWNrYm94LWxhYmVsLWJlZm9yZSAubWF0LWNoZWNrYm94LWlubmVyLWNvbnRhaW5lcntvcmRlcjoxO21hcmdpbi1sZWZ0OjhweDttYXJnaW4tcmlnaHQ6YXV0b31bZGlyPXJ0bF0gLm1hdC1jaGVja2JveC1sYWJlbC1iZWZvcmUgLm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXJ7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6OHB4fS5tYXQtY2hlY2tib3gtY2hlY2tlZCAubWF0LWNoZWNrYm94LWNoZWNrbWFya3tvcGFjaXR5OjF9Lm1hdC1jaGVja2JveC1jaGVja2VkIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGh7c3Ryb2tlLWRhc2hvZmZzZXQ6MH0ubWF0LWNoZWNrYm94LWNoZWNrZWQgLm1hdC1jaGVja2JveC1taXhlZG1hcmt7dHJhbnNmb3JtOnNjYWxlWCgxKSByb3RhdGUoLTQ1ZGVnKX0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUgLm1hdC1jaGVja2JveC1jaGVja21hcmt7b3BhY2l0eTowO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoe3N0cm9rZS1kYXNob2Zmc2V0OjB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlIC5tYXQtY2hlY2tib3gtbWl4ZWRtYXJre29wYWNpdHk6MTt0cmFuc2Zvcm06c2NhbGVYKDEpIHJvdGF0ZSgwZGVnKX0ubWF0LWNoZWNrYm94LXVuY2hlY2tlZCAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWNoZWNrYm94LWRpc2FibGVke2N1cnNvcjpkZWZhdWx0fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1jaGVja2JveC1kaXNhYmxlZHtvcGFjaXR5Oi41fS5tYXQtY2hlY2tib3gtYW5pbS11bmNoZWNrZWQtY2hlY2tlZCAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YW5pbWF0aW9uOjE4MG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LWZhZGUtaW4tYmFja2dyb3VuZH0ubWF0LWNoZWNrYm94LWFuaW0tdW5jaGVja2VkLWNoZWNrZWQgLm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHthbmltYXRpb246MTgwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtdW5jaGVja2VkLWNoZWNrZWQtY2hlY2ttYXJrLXBhdGh9Lm1hdC1jaGVja2JveC1hbmltLXVuY2hlY2tlZC1pbmRldGVybWluYXRlIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHthbmltYXRpb246MTgwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtZmFkZS1pbi1iYWNrZ3JvdW5kfS5tYXQtY2hlY2tib3gtYW5pbS11bmNoZWNrZWQtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LW1peGVkbWFya3thbmltYXRpb246OTBtcyBsaW5lYXIgMG1zIG1hdC1jaGVja2JveC11bmNoZWNrZWQtaW5kZXRlcm1pbmF0ZS1taXhlZG1hcmt9Lm1hdC1jaGVja2JveC1hbmltLWNoZWNrZWQtdW5jaGVja2VkIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHthbmltYXRpb246MTgwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtZmFkZS1vdXQtYmFja2dyb3VuZH0ubWF0LWNoZWNrYm94LWFuaW0tY2hlY2tlZC11bmNoZWNrZWQgLm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHthbmltYXRpb246OTBtcyBsaW5lYXIgMG1zIG1hdC1jaGVja2JveC1jaGVja2VkLXVuY2hlY2tlZC1jaGVja21hcmstcGF0aH0ubWF0LWNoZWNrYm94LWFuaW0tY2hlY2tlZC1pbmRldGVybWluYXRlIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJre2FuaW1hdGlvbjo5MG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LWNoZWNrZWQtaW5kZXRlcm1pbmF0ZS1jaGVja21hcmt9Lm1hdC1jaGVja2JveC1hbmltLWNoZWNrZWQtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LW1peGVkbWFya3thbmltYXRpb246OTBtcyBsaW5lYXIgMG1zIG1hdC1jaGVja2JveC1jaGVja2VkLWluZGV0ZXJtaW5hdGUtbWl4ZWRtYXJrfS5tYXQtY2hlY2tib3gtYW5pbS1pbmRldGVybWluYXRlLWNoZWNrZWQgLm1hdC1jaGVja2JveC1jaGVja21hcmt7YW5pbWF0aW9uOjUwMG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUtY2hlY2tlZC1jaGVja21hcmt9Lm1hdC1jaGVja2JveC1hbmltLWluZGV0ZXJtaW5hdGUtY2hlY2tlZCAubWF0LWNoZWNrYm94LW1peGVkbWFya3thbmltYXRpb246NTAwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS1jaGVja2VkLW1peGVkbWFya30ubWF0LWNoZWNrYm94LWFuaW0taW5kZXRlcm1pbmF0ZS11bmNoZWNrZWQgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5ke2FuaW1hdGlvbjoxODBtcyBsaW5lYXIgMG1zIG1hdC1jaGVja2JveC1mYWRlLW91dC1iYWNrZ3JvdW5kfS5tYXQtY2hlY2tib3gtYW5pbS1pbmRldGVybWluYXRlLXVuY2hlY2tlZCAubWF0LWNoZWNrYm94LW1peGVkbWFya3thbmltYXRpb246MzAwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS11bmNoZWNrZWQtbWl4ZWRtYXJrfS5tYXQtY2hlY2tib3gtaW5wdXR7Ym90dG9tOjA7bGVmdDo1MCV9XG4iXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSxPWS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpVZ30se3R5cGU6U0l9LHt0eXBlOmFffSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6amEsYXJnczpbInRhYmluZGV4Il19XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltiWV19XX1dLE9ZLnByb3BEZWNvcmF0b3JzPXthcmlhTGFiZWw6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsIl19XSxhcmlhTGFiZWxsZWRieTpbe3R5cGU6eHksYXJnczpbImFyaWEtbGFiZWxsZWRieSJdfV0sYXJpYURlc2NyaWJlZGJ5Olt7dHlwZTp4eSxhcmdzOlsiYXJpYS1kZXNjcmliZWRieSJdfV0saWQ6W3t0eXBlOnh5fV0scmVxdWlyZWQ6W3t0eXBlOnh5fV0sbGFiZWxQb3NpdGlvbjpbe3R5cGU6eHl9XSxuYW1lOlt7dHlwZTp4eX1dLGNoYW5nZTpbe3R5cGU6T3l9XSxpbmRldGVybWluYXRlQ2hhbmdlOlt7dHlwZTpPeX1dLHZhbHVlOlt7dHlwZTp4eX1dLF9pbnB1dEVsZW1lbnQ6W3t0eXBlOlphLGFyZ3M6WyJpbnB1dCJdfV0scmlwcGxlOlt7dHlwZTpaYSxhcmdzOltrSF19XSxjaGVja2VkOlt7dHlwZTp4eX1dLGRpc2FibGVkOlt7dHlwZTp4eX1dLGluZGV0ZXJtaW5hdGU6W3t0eXBlOnh5fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoT1ksW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWF0LWNoZWNrYm94Iix0ZW1wbGF0ZTonPGxhYmVsIFthdHRyLmZvcl09ImlucHV0SWQiIGNsYXNzPSJtYXQtY2hlY2tib3gtbGF5b3V0IiAjbGFiZWw+XG4gIDxzcGFuIGNsYXNzPSJtYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVyIlxuICAgICAgIFtjbGFzcy5tYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVyLW5vLXNpZGUtbWFyZ2luXT0iIWNoZWNrYm94TGFiZWwudGV4dENvbnRlbnQgfHwgIWNoZWNrYm94TGFiZWwudGV4dENvbnRlbnQudHJpbSgpIj5cbiAgICA8aW5wdXQgI2lucHV0XG4gICAgICAgICAgIGNsYXNzPSJtYXQtY2hlY2tib3gtaW5wdXQgY2RrLXZpc3VhbGx5LWhpZGRlbiIgdHlwZT0iY2hlY2tib3giXG4gICAgICAgICAgIFtpZF09ImlucHV0SWQiXG4gICAgICAgICAgIFtyZXF1aXJlZF09InJlcXVpcmVkIlxuICAgICAgICAgICBbY2hlY2tlZF09ImNoZWNrZWQiXG4gICAgICAgICAgIFthdHRyLnZhbHVlXT0idmFsdWUiXG4gICAgICAgICAgIFtkaXNhYmxlZF09ImRpc2FibGVkIlxuICAgICAgICAgICBbYXR0ci5uYW1lXT0ibmFtZSJcbiAgICAgICAgICAgW3RhYkluZGV4XT0idGFiSW5kZXgiXG4gICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPSJhcmlhTGFiZWwgfHwgbnVsbCJcbiAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT0iYXJpYUxhYmVsbGVkYnkiXG4gICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09Il9nZXRBcmlhQ2hlY2tlZCgpIlxuICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT0iYXJpYURlc2NyaWJlZGJ5IlxuICAgICAgICAgICAoY2hhbmdlKT0iX29uSW50ZXJhY3Rpb25FdmVudCgkZXZlbnQpIlxuICAgICAgICAgICAoY2xpY2spPSJfb25JbnB1dENsaWNrKCRldmVudCkiPlxuICAgIDxzcGFuIG1hdFJpcHBsZSBjbGFzcz0ibWF0LWNoZWNrYm94LXJpcHBsZSBtYXQtZm9jdXMtaW5kaWNhdG9yIlxuICAgICAgICAgW21hdFJpcHBsZVRyaWdnZXJdPSJsYWJlbCJcbiAgICAgICAgIFttYXRSaXBwbGVEaXNhYmxlZF09Il9pc1JpcHBsZURpc2FibGVkKCkiXG4gICAgICAgICBbbWF0UmlwcGxlUmFkaXVzXT0iMjAiXG4gICAgICAgICBbbWF0UmlwcGxlQ2VudGVyZWRdPSJ0cnVlIlxuICAgICAgICAgW21hdFJpcHBsZUFuaW1hdGlvbl09IntlbnRlckR1cmF0aW9uOiBfYW5pbWF0aW9uTW9kZSA9PT0gXCdOb29wQW5pbWF0aW9uc1wnID8gMCA6IDE1MH0iPlxuICAgICAgPHNwYW4gY2xhc3M9Im1hdC1yaXBwbGUtZWxlbWVudCBtYXQtY2hlY2tib3gtcGVyc2lzdGVudC1yaXBwbGUiPjwvc3Bhbj5cbiAgICA8L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9Im1hdC1jaGVja2JveC1mcmFtZSI+PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPSJtYXQtY2hlY2tib3gtYmFja2dyb3VuZCI+XG4gICAgICA8c3ZnIHZlcnNpb249IjEuMSJcbiAgICAgICAgICAgZm9jdXNhYmxlPSJmYWxzZSJcbiAgICAgICAgICAgY2xhc3M9Im1hdC1jaGVja2JveC1jaGVja21hcmsiXG4gICAgICAgICAgIHZpZXdCb3g9IjAgMCAyNCAyNCJcbiAgICAgICAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSJcbiAgICAgICAgICAgYXJpYS1oaWRkZW49InRydWUiPlxuICAgICAgICA8cGF0aCBjbGFzcz0ibWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoIlxuICAgICAgICAgICAgICBmaWxsPSJub25lIlxuICAgICAgICAgICAgICBzdHJva2U9IndoaXRlIlxuICAgICAgICAgICAgICBkPSJNNC4xLDEyLjcgOSwxNy42IDIwLjMsNi4zIi8+XG4gICAgICA8L3N2Zz5cbiAgICAgIFx4M2MhLS0gRWxlbWVudCBmb3IgcmVuZGVyaW5nIHRoZSBpbmRldGVybWluYXRlIHN0YXRlIGNoZWNrYm94LiAtLVx4M2VcbiAgICAgIDxzcGFuIGNsYXNzPSJtYXQtY2hlY2tib3gtbWl4ZWRtYXJrIj48L3NwYW4+XG4gICAgPC9zcGFuPlxuICA8L3NwYW4+XG4gIDxzcGFuIGNsYXNzPSJtYXQtY2hlY2tib3gtbGFiZWwiICNjaGVja2JveExhYmVsIChjZGtPYnNlcnZlQ29udGVudCk9Il9vbkxhYmVsVGV4dENoYW5nZSgpIj5cbiAgICBceDNjIS0tIEFkZCBhbiBpbnZpc2libGUgc3BhbiBzbyBKQVdTIGNhbiByZWFkIHRoZSBsYWJlbCAtLVx4M2VcbiAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lIj4mbmJzcDs8L3NwYW4+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L3NwYW4+XG48L2xhYmVsPlxuJyxleHBvcnRBczoibWF0Q2hlY2tib3giLGhvc3Q6e2NsYXNzOiJtYXQtY2hlY2tib3giLCJbaWRdIjoiaWQiLCJbYXR0ci50YWJpbmRleF0iOiJudWxsIiwiW2NsYXNzLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlXSI6ImluZGV0ZXJtaW5hdGUiLCJbY2xhc3MubWF0LWNoZWNrYm94LWNoZWNrZWRdIjoiY2hlY2tlZCIsIltjbGFzcy5tYXQtY2hlY2tib3gtZGlzYWJsZWRdIjoiZGlzYWJsZWQiLCJbY2xhc3MubWF0LWNoZWNrYm94LWxhYmVsLWJlZm9yZV0iOidsYWJlbFBvc2l0aW9uID09ICJiZWZvcmUiJywiW2NsYXNzLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlXSI6Il9hbmltYXRpb25Nb2RlID09PSAnTm9vcEFuaW1hdGlvbnMnIn0scHJvdmlkZXJzOltNWV0saW5wdXRzOlsiZGlzYWJsZVJpcHBsZSIsImNvbG9yIiwidGFiSW5kZXgiXSxlbmNhcHN1bGF0aW9uOkhuLk5vbmUsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaCxzdHlsZXM6WyJAa2V5ZnJhbWVzIG1hdC1jaGVja2JveC1mYWRlLWluLWJhY2tncm91bmR7MCV7b3BhY2l0eTowfTUwJXtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgbWF0LWNoZWNrYm94LWZhZGUtb3V0LWJhY2tncm91bmR7MCUsNTAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MH19QGtleWZyYW1lcyBtYXQtY2hlY2tib3gtdW5jaGVja2VkLWNoZWNrZWQtY2hlY2ttYXJrLXBhdGh7MCUsNTAle3N0cm9rZS1kYXNob2Zmc2V0OjIyLjkxMDI1OX01MCV7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAwLjEpfTEwMCV7c3Ryb2tlLWRhc2hvZmZzZXQ6MH19QGtleWZyYW1lcyBtYXQtY2hlY2tib3gtdW5jaGVja2VkLWluZGV0ZXJtaW5hdGUtbWl4ZWRtYXJrezAlLDY4LjIle3RyYW5zZm9ybTpzY2FsZVgoMCl9NjguMiV7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMCwgMCwgMCwgMSl9MTAwJXt0cmFuc2Zvcm06c2NhbGVYKDEpfX1Aa2V5ZnJhbWVzIG1hdC1jaGVja2JveC1jaGVja2VkLXVuY2hlY2tlZC1jaGVja21hcmstcGF0aHtmcm9te2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuNCwgMCwgMSwgMSk7c3Ryb2tlLWRhc2hvZmZzZXQ6MH10b3tzdHJva2UtZGFzaG9mZnNldDotMjIuOTEwMjU5fX1Aa2V5ZnJhbWVzIG1hdC1jaGVja2JveC1jaGVja2VkLWluZGV0ZXJtaW5hdGUtY2hlY2ttYXJre2Zyb217YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAwLjEpO29wYWNpdHk6MTt0cmFuc2Zvcm06cm90YXRlKDBkZWcpfXRve29wYWNpdHk6MDt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX19QGtleWZyYW1lcyBtYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS1jaGVja2VkLWNoZWNrbWFya3tmcm9te2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMTQsIDAsIDAsIDEpO29wYWNpdHk6MDt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX10b3tvcGFjaXR5OjE7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1Aa2V5ZnJhbWVzIG1hdC1jaGVja2JveC1jaGVja2VkLWluZGV0ZXJtaW5hdGUtbWl4ZWRtYXJre2Zyb217YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAwLjEpO29wYWNpdHk6MDt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9dG97b3BhY2l0eToxO3RyYW5zZm9ybTpyb3RhdGUoMGRlZyl9fUBrZXlmcmFtZXMgbWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUtY2hlY2tlZC1taXhlZG1hcmt7ZnJvbXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjE0LCAwLCAwLCAxKTtvcGFjaXR5OjE7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX10b3tvcGFjaXR5OjA7dHJhbnNmb3JtOnJvdGF0ZSgzMTVkZWcpfX1Aa2V5ZnJhbWVzIG1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLXVuY2hlY2tlZC1taXhlZG1hcmt7MCV7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpsaW5lYXI7b3BhY2l0eToxO3RyYW5zZm9ybTpzY2FsZVgoMSl9MzIuOCUsMTAwJXtvcGFjaXR5OjA7dHJhbnNmb3JtOnNjYWxlWCgwKX19Lm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLC5tYXQtY2hlY2tib3gtZnJhbWV7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czoycHg7Ym94LXNpemluZzpib3JkZXItYm94O3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1hdC1jaGVja2JveHtkaXNwbGF5OmlubGluZS1ibG9jazt0cmFuc2l0aW9uOmJhY2tncm91bmQgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYm94LXNoYWRvdyAyODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO2N1cnNvcjpwb2ludGVyOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudH0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LWNoZWNrYm94e3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LWNoZWNrYm94IC5tYXQtcmlwcGxlLWVsZW1lbnQ6bm90KC5tYXQtY2hlY2tib3gtcGVyc2lzdGVudC1yaXBwbGUpe29wYWNpdHk6LjE2fS5tYXQtY2hlY2tib3ggLm1hdC1jaGVja2JveC1yaXBwbGV7cG9zaXRpb246YWJzb2x1dGU7bGVmdDpjYWxjKDUwJSAtIDIwcHgpO3RvcDpjYWxjKDUwJSAtIDIwcHgpO2hlaWdodDo0MHB4O3dpZHRoOjQwcHg7ei1pbmRleDoxO3BvaW50ZXItZXZlbnRzOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWNoZWNrYm94LmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtY2hlY2tib3gtcmlwcGxle291dGxpbmU6c29saWQgM3B4fS5tYXQtY2hlY2tib3gtbGF5b3V0ey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6aW5oZXJpdDthbGlnbi1pdGVtczpiYXNlbGluZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7ZGlzcGxheTppbmxpbmUtZmxleDt3aGl0ZS1zcGFjZTpub3dyYXB9Lm1hdC1jaGVja2JveC1sYWJlbHstd2Via2l0LXVzZXItc2VsZWN0OmF1dG87LW1vei11c2VyLXNlbGVjdDphdXRvOy1tcy11c2VyLXNlbGVjdDphdXRvO3VzZXItc2VsZWN0OmF1dG99Lm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7aGVpZ2h0OjE2cHg7bGluZS1oZWlnaHQ6MDttYXJnaW46YXV0bzttYXJnaW4tcmlnaHQ6OHB4O29yZGVyOjA7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246bWlkZGxlO3doaXRlLXNwYWNlOm5vd3JhcDt3aWR0aDoxNnB4O2ZsZXgtc2hyaW5rOjB9W2Rpcj1ydGxdIC5tYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVye21hcmdpbi1sZWZ0OjhweDttYXJnaW4tcmlnaHQ6YXV0b30ubWF0LWNoZWNrYm94LWlubmVyLWNvbnRhaW5lci1uby1zaWRlLW1hcmdpbnttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowfS5tYXQtY2hlY2tib3gtZnJhbWV7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOmJvcmRlci1jb2xvciA5MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDAuMSk7Ym9yZGVyLXdpZHRoOjJweDtib3JkZXItc3R5bGU6c29saWR9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtY2hlY2tib3gtZnJhbWV7dHJhbnNpdGlvbjpub25lfS5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTppbmxpbmUtZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA5MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDAuMSksb3BhY2l0eSA5MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDAuMSk7LXdlYmtpdC1wcmludC1jb2xvci1hZGp1c3Q6ZXhhY3Q7Y29sb3ItYWRqdXN0OmV4YWN0fS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7dHJhbnNpdGlvbjpub25lfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1jaGVja2JveCAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZDpub25lfS5tYXQtY2hlY2tib3gtcGVyc2lzdGVudC1yaXBwbGV7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3RyYW5zZm9ybTpub25lfS5tYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVyOmhvdmVyIC5tYXQtY2hlY2tib3gtcGVyc2lzdGVudC1yaXBwbGV7b3BhY2l0eTouMDR9Lm1hdC1jaGVja2JveC5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWNoZWNrYm94LXBlcnNpc3RlbnQtcmlwcGxle29wYWNpdHk6LjEyfS5tYXQtY2hlY2tib3gtcGVyc2lzdGVudC1yaXBwbGUsLm1hdC1jaGVja2JveC5tYXQtY2hlY2tib3gtZGlzYWJsZWQgLm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXI6aG92ZXIgLm1hdC1jaGVja2JveC1wZXJzaXN0ZW50LXJpcHBsZXtvcGFjaXR5OjB9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWNoZWNrYm94LWlubmVyLWNvbnRhaW5lcjpob3ZlciAubWF0LWNoZWNrYm94LXBlcnNpc3RlbnQtcmlwcGxle2Rpc3BsYXk6bm9uZX19Lm1hdC1jaGVja2JveC1jaGVja21hcmt7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJX0ubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoe3N0cm9rZS1kYXNob2Zmc2V0OjIyLjkxMDI1OTtzdHJva2UtZGFzaGFycmF5OjIyLjkxMDI1OTtzdHJva2Utd2lkdGg6Mi4xMzMzMzMzMzMzcHh9LmNkay1oaWdoLWNvbnRyYXN0LWJsYWNrLW9uLXdoaXRlIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGh7c3Ryb2tlOiMwMDAgIWltcG9ydGFudH0ubWF0LWNoZWNrYm94LW1peGVkbWFya3t3aWR0aDpjYWxjKDEwMCUgLSA2cHgpO2hlaWdodDoycHg7b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZVgoMCkgcm90YXRlKDBkZWcpO2JvcmRlci1yYWRpdXM6MnB4fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1jaGVja2JveC1taXhlZG1hcmt7aGVpZ2h0OjA7Ym9yZGVyLXRvcDpzb2xpZCAycHg7bWFyZ2luLXRvcDoycHh9Lm1hdC1jaGVja2JveC1sYWJlbC1iZWZvcmUgLm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXJ7b3JkZXI6MTttYXJnaW4tbGVmdDo4cHg7bWFyZ2luLXJpZ2h0OmF1dG99W2Rpcj1ydGxdIC5tYXQtY2hlY2tib3gtbGFiZWwtYmVmb3JlIC5tYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVye21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OjhweH0ubWF0LWNoZWNrYm94LWNoZWNrZWQgLm1hdC1jaGVja2JveC1jaGVja21hcmt7b3BhY2l0eToxfS5tYXQtY2hlY2tib3gtY2hlY2tlZCAubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoe3N0cm9rZS1kYXNob2Zmc2V0OjB9Lm1hdC1jaGVja2JveC1jaGVja2VkIC5tYXQtY2hlY2tib3gtbWl4ZWRtYXJre3RyYW5zZm9ybTpzY2FsZVgoMSkgcm90YXRlKC00NWRlZyl9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJre29wYWNpdHk6MDt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUgLm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHtzdHJva2UtZGFzaG9mZnNldDowfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LW1peGVkbWFya3tvcGFjaXR5OjE7dHJhbnNmb3JtOnNjYWxlWCgxKSByb3RhdGUoMGRlZyl9Lm1hdC1jaGVja2JveC11bmNoZWNrZWQgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1jaGVja2JveC1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtY2hlY2tib3gtZGlzYWJsZWR7b3BhY2l0eTouNX0ubWF0LWNoZWNrYm94LWFuaW0tdW5jaGVja2VkLWNoZWNrZWQgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5ke2FuaW1hdGlvbjoxODBtcyBsaW5lYXIgMG1zIG1hdC1jaGVja2JveC1mYWRlLWluLWJhY2tncm91bmR9Lm1hdC1jaGVja2JveC1hbmltLXVuY2hlY2tlZC1jaGVja2VkIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGh7YW5pbWF0aW9uOjE4MG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LXVuY2hlY2tlZC1jaGVja2VkLWNoZWNrbWFyay1wYXRofS5tYXQtY2hlY2tib3gtYW5pbS11bmNoZWNrZWQtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YW5pbWF0aW9uOjE4MG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LWZhZGUtaW4tYmFja2dyb3VuZH0ubWF0LWNoZWNrYm94LWFuaW0tdW5jaGVja2VkLWluZGV0ZXJtaW5hdGUgLm1hdC1jaGVja2JveC1taXhlZG1hcmt7YW5pbWF0aW9uOjkwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtdW5jaGVja2VkLWluZGV0ZXJtaW5hdGUtbWl4ZWRtYXJrfS5tYXQtY2hlY2tib3gtYW5pbS1jaGVja2VkLXVuY2hlY2tlZCAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YW5pbWF0aW9uOjE4MG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LWZhZGUtb3V0LWJhY2tncm91bmR9Lm1hdC1jaGVja2JveC1hbmltLWNoZWNrZWQtdW5jaGVja2VkIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGh7YW5pbWF0aW9uOjkwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtY2hlY2tlZC11bmNoZWNrZWQtY2hlY2ttYXJrLXBhdGh9Lm1hdC1jaGVja2JveC1hbmltLWNoZWNrZWQtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LWNoZWNrbWFya3thbmltYXRpb246OTBtcyBsaW5lYXIgMG1zIG1hdC1jaGVja2JveC1jaGVja2VkLWluZGV0ZXJtaW5hdGUtY2hlY2ttYXJrfS5tYXQtY2hlY2tib3gtYW5pbS1jaGVja2VkLWluZGV0ZXJtaW5hdGUgLm1hdC1jaGVja2JveC1taXhlZG1hcmt7YW5pbWF0aW9uOjkwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtY2hlY2tlZC1pbmRldGVybWluYXRlLW1peGVkbWFya30ubWF0LWNoZWNrYm94LWFuaW0taW5kZXRlcm1pbmF0ZS1jaGVja2VkIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJre2FuaW1hdGlvbjo1MDBtcyBsaW5lYXIgMG1zIG1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLWNoZWNrZWQtY2hlY2ttYXJrfS5tYXQtY2hlY2tib3gtYW5pbS1pbmRldGVybWluYXRlLWNoZWNrZWQgLm1hdC1jaGVja2JveC1taXhlZG1hcmt7YW5pbWF0aW9uOjUwMG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUtY2hlY2tlZC1taXhlZG1hcmt9Lm1hdC1jaGVja2JveC1hbmltLWluZGV0ZXJtaW5hdGUtdW5jaGVja2VkIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHthbmltYXRpb246MTgwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtZmFkZS1vdXQtYmFja2dyb3VuZH0ubWF0LWNoZWNrYm94LWFuaW0taW5kZXRlcm1pbmF0ZS11bmNoZWNrZWQgLm1hdC1jaGVja2JveC1taXhlZG1hcmt7YW5pbWF0aW9uOjMwMG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUtdW5jaGVja2VkLW1peGVkbWFya30ubWF0LWNoZWNrYm94LWlucHV0e2JvdHRvbTowO2xlZnQ6NTAlfVxuIl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6VWd9LHt0eXBlOlNJfSx7dHlwZTphX30se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmphLGFyZ3M6WyJ0YWJpbmRleCJdfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbYlldfV19XX0pLHthcmlhTGFiZWw6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsIl19XSxhcmlhTGFiZWxsZWRieTpbe3R5cGU6eHksYXJnczpbImFyaWEtbGFiZWxsZWRieSJdfV0saWQ6W3t0eXBlOnh5fV0sbGFiZWxQb3NpdGlvbjpbe3R5cGU6eHl9XSxuYW1lOlt7dHlwZTp4eX1dLGNoYW5nZTpbe3R5cGU6T3l9XSxpbmRldGVybWluYXRlQ2hhbmdlOlt7dHlwZTpPeX1dLHJlcXVpcmVkOlt7dHlwZTp4eX1dLGNoZWNrZWQ6W3t0eXBlOnh5fV0sZGlzYWJsZWQ6W3t0eXBlOnh5fV0saW5kZXRlcm1pbmF0ZTpbe3R5cGU6eHl9XSxhcmlhRGVzY3JpYmVkYnk6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWRlc2NyaWJlZGJ5Il19XSx2YWx1ZTpbe3R5cGU6eHl9XSxfaW5wdXRFbGVtZW50Olt7dHlwZTpaYSxhcmdzOlsiaW5wdXQiXX1dLHJpcHBsZTpbe3R5cGU6WmEsYXJnczpba0hdfV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IFBZPXtwcm92aWRlOkdWLHVzZUV4aXN0aW5nOnFlKCgoKT0+d1kpKSxtdWx0aTohMH07Y2xhc3Mgd1kgZXh0ZW5kcyBLVXt9d1kuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKHdZKSkpKG58fHdZKX19KSgpLHdZLsm1ZGlyPWxvKHt0eXBlOndZLHNlbGVjdG9yczpbWyJtYXQtY2hlY2tib3giLCJyZXF1aXJlZCIsIiIsImZvcm1Db250cm9sTmFtZSIsIiJdLFsibWF0LWNoZWNrYm94IiwicmVxdWlyZWQiLCIiLCJmb3JtQ29udHJvbCIsIiJdLFsibWF0LWNoZWNrYm94IiwicmVxdWlyZWQiLCIiLCJuZ01vZGVsIiwiIl1dLGZlYXR1cmVzOltwZyhbUFldKSx4cF19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHdZLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC1jaGVja2JveFtyZXF1aXJlZF1bZm9ybUNvbnRyb2xOYW1lXSxcbiAgICAgICAgICAgICBtYXQtY2hlY2tib3hbcmVxdWlyZWRdW2Zvcm1Db250cm9sXSwgbWF0LWNoZWNrYm94W3JlcXVpcmVkXVtuZ01vZGVsXSIscHJvdmlkZXJzOltQWV19XX1dLG51bGwsbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBrWXt9a1kuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGtZKX0sa1kuybVtb2Q9YW8oe3R5cGU6a1l9KSxrWS7JtWluaj12bih7fSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChrWSxbe3R5cGU6QXksYXJnczpbe2V4cG9ydHM6W3dZXSxkZWNsYXJhdGlvbnM6W3dZXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKGtZLHtkZWNsYXJhdGlvbnM6W3dZXSxleHBvcnRzOlt3WV19KTtjbGFzcyBTWXt9U1kuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFNZKX0sU1kuybVtb2Q9YW8oe3R5cGU6U1l9KSxTWS7JtWluaj12bih7aW1wb3J0czpbW1NILFhJLFV6LGtZXSxYSSxrWV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFNZLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbU0gsWEksVXosa1ldLGV4cG9ydHM6W09ZLFhJLGtZXSxkZWNsYXJhdGlvbnM6W09ZXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFNZLHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bT1ldfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1NILFhJLFV6LGtZXX0sZXhwb3J0czpmdW5jdGlvbigpe3JldHVybltPWSxYSSxrWV19fSk7Y29uc3QgRFk9Tnooe3Bhc3NpdmU6ITB9KTtjbGFzcyBFWXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuX3BsYXRmb3JtPXQsdGhpcy5fbmdab25lPWUsdGhpcy5fbW9uaXRvcmVkRWxlbWVudHM9bmV3IE1hcH1tb25pdG9yKHQpe2lmKCF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpcmV0dXJuIHJ0O2NvbnN0IGU9eHoodCksbj10aGlzLl9tb25pdG9yZWRFbGVtZW50cy5nZXQoZSk7aWYobilyZXR1cm4gbi5zdWJqZWN0O2NvbnN0IG89bmV3IEksaT0iY2RrLXRleHQtZmllbGQtYXV0b2ZpbGxlZCIsYT10PT57ImNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IiE9PXQuYW5pbWF0aW9uTmFtZXx8ZS5jbGFzc0xpc3QuY29udGFpbnMoaSk/ImNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCI9PT10LmFuaW1hdGlvbk5hbWUmJmUuY2xhc3NMaXN0LmNvbnRhaW5zKGkpJiYoZS5jbGFzc0xpc3QucmVtb3ZlKGkpLHRoaXMuX25nWm9uZS5ydW4oKCgpPT5vLm5leHQoe3RhcmdldDp0LnRhcmdldCxpc0F1dG9maWxsZWQ6ITF9KSkpKTooZS5jbGFzc0xpc3QuYWRkKGkpLHRoaXMuX25nWm9uZS5ydW4oKCgpPT5vLm5leHQoe3RhcmdldDp0LnRhcmdldCxpc0F1dG9maWxsZWQ6ITB9KSkpKX07cmV0dXJuIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PntlLmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbnN0YXJ0IixhLERZKSxlLmNsYXNzTGlzdC5hZGQoImNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZCIpfSkpLHRoaXMuX21vbml0b3JlZEVsZW1lbnRzLnNldChlLHtzdWJqZWN0Om8sdW5saXN0ZW46KCk9PntlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbnN0YXJ0IixhLERZKX19KSxvfXN0b3BNb25pdG9yaW5nKHQpe2NvbnN0IGU9eHoodCksbj10aGlzLl9tb25pdG9yZWRFbGVtZW50cy5nZXQoZSk7biYmKG4udW5saXN0ZW4oKSxuLnN1YmplY3QuY29tcGxldGUoKSxlLmNsYXNzTGlzdC5yZW1vdmUoImNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZCIpLGUuY2xhc3NMaXN0LnJlbW92ZSgiY2RrLXRleHQtZmllbGQtYXV0b2ZpbGxlZCIpLHRoaXMuX21vbml0b3JlZEVsZW1lbnRzLmRlbGV0ZShlKSl9bmdPbkRlc3Ryb3koKXt0aGlzLl9tb25pdG9yZWRFbGVtZW50cy5mb3JFYWNoKCgodCxlKT0+dGhpcy5zdG9wTW9uaXRvcmluZyhlKSkpfX1FWS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8RVkpKHZyKHd6KSx2cihhXykpfSxFWS7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgRVkodnIod3opLHZyKGFfKSl9LHRva2VuOkVZLHByb3ZpZGVkSW46InJvb3QifSksRVkuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp3en0se3R5cGU6YV99XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEVZLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp3en0se3R5cGU6YV99XX0pLG51bGwpO2NsYXNzIFJZe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fZWxlbWVudFJlZj10LHRoaXMuX2F1dG9maWxsTW9uaXRvcj1lLHRoaXMuY2RrQXV0b2ZpbGw9bmV3IExofW5nT25Jbml0KCl7dGhpcy5fYXV0b2ZpbGxNb25pdG9yLm1vbml0b3IodGhpcy5fZWxlbWVudFJlZikuc3Vic2NyaWJlKCh0PT50aGlzLmNka0F1dG9maWxsLmVtaXQodCkpKX1uZ09uRGVzdHJveSgpe3RoaXMuX2F1dG9maWxsTW9uaXRvci5zdG9wTW9uaXRvcmluZyh0aGlzLl9lbGVtZW50UmVmKX19UlkuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFJZKShTbShoZyksU20oRVkpKX0sUlkuybVkaXI9bG8oe3R5cGU6Ulksc2VsZWN0b3JzOltbIiIsImNka0F1dG9maWxsIiwiIl1dLG91dHB1dHM6e2Nka0F1dG9maWxsOiJjZGtBdXRvZmlsbCJ9fSksUlkuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ30se3R5cGU6RVl9XSxSWS5wcm9wRGVjb3JhdG9ycz17Y2RrQXV0b2ZpbGw6W3t0eXBlOk95fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUlksW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Nka0F1dG9maWxsXSJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6RVl9XX0pLHtjZGtBdXRvZmlsbDpbe3R5cGU6T3l9XX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgQVl7Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy5fZWxlbWVudFJlZj10LHRoaXMuX3BsYXRmb3JtPWUsdGhpcy5fbmdab25lPW4sdGhpcy5fZGVzdHJveWVkPW5ldyBJLHRoaXMuX2VuYWJsZWQ9ITAsdGhpcy5fcHJldmlvdXNNaW5Sb3dzPS0xLHRoaXMuX2lzVmlld0luaXRlZD0hMSx0aGlzLl9oYW5kbGVGb2N1c0V2ZW50PXQ9Pnt0aGlzLl9oYXNGb2N1cz0iZm9jdXMiPT09dC50eXBlfSx0aGlzLl9kb2N1bWVudD1vLHRoaXMuX3RleHRhcmVhRWxlbWVudD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnR9Z2V0IG1pblJvd3MoKXtyZXR1cm4gdGhpcy5fbWluUm93c31zZXQgbWluUm93cyh0KXt0aGlzLl9taW5Sb3dzPV96KHQpLHRoaXMuX3NldE1pbkhlaWdodCgpfWdldCBtYXhSb3dzKCl7cmV0dXJuIHRoaXMuX21heFJvd3N9c2V0IG1heFJvd3ModCl7dGhpcy5fbWF4Um93cz1feih0KSx0aGlzLl9zZXRNYXhIZWlnaHQoKX1nZXQgZW5hYmxlZCgpe3JldHVybiB0aGlzLl9lbmFibGVkfXNldCBlbmFibGVkKHQpe3Q9eXoodCksdGhpcy5fZW5hYmxlZCE9PXQmJigodGhpcy5fZW5hYmxlZD10KT90aGlzLnJlc2l6ZVRvRml0Q29udGVudCghMCk6dGhpcy5yZXNldCgpKX1nZXQgcGxhY2Vob2xkZXIoKXtyZXR1cm4gdGhpcy5fdGV4dGFyZWFFbGVtZW50LnBsYWNlaG9sZGVyfXNldCBwbGFjZWhvbGRlcih0KXt0aGlzLl9jYWNoZWRQbGFjZWhvbGRlckhlaWdodD12b2lkIDAsdGhpcy5fdGV4dGFyZWFFbGVtZW50LnBsYWNlaG9sZGVyPXQsdGhpcy5fY2FjaGVUZXh0YXJlYVBsYWNlaG9sZGVySGVpZ2h0KCl9X3NldE1pbkhlaWdodCgpe2NvbnN0IHQ9dGhpcy5taW5Sb3dzJiZ0aGlzLl9jYWNoZWRMaW5lSGVpZ2h0P3RoaXMubWluUm93cyp0aGlzLl9jYWNoZWRMaW5lSGVpZ2h0KyJweCI6bnVsbDt0JiYodGhpcy5fdGV4dGFyZWFFbGVtZW50LnN0eWxlLm1pbkhlaWdodD10KX1fc2V0TWF4SGVpZ2h0KCl7Y29uc3QgdD10aGlzLm1heFJvd3MmJnRoaXMuX2NhY2hlZExpbmVIZWlnaHQ/dGhpcy5tYXhSb3dzKnRoaXMuX2NhY2hlZExpbmVIZWlnaHQrInB4IjpudWxsO3QmJih0aGlzLl90ZXh0YXJlYUVsZW1lbnQuc3R5bGUubWF4SGVpZ2h0PXQpfW5nQWZ0ZXJWaWV3SW5pdCgpe3RoaXMuX3BsYXRmb3JtLmlzQnJvd3NlciYmKHRoaXMuX2luaXRpYWxIZWlnaHQ9dGhpcy5fdGV4dGFyZWFFbGVtZW50LnN0eWxlLmhlaWdodCx0aGlzLnJlc2l6ZVRvRml0Q29udGVudCgpLHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PntvZSh0aGlzLl9nZXRXaW5kb3coKSwicmVzaXplIikucGlwZShkZSgxNiksSWUodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgoKT0+dGhpcy5yZXNpemVUb0ZpdENvbnRlbnQoITApKSksdGhpcy5fdGV4dGFyZWFFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9oYW5kbGVGb2N1c0V2ZW50KSx0aGlzLl90ZXh0YXJlYUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsdGhpcy5faGFuZGxlRm9jdXNFdmVudCl9KSksdGhpcy5faXNWaWV3SW5pdGVkPSEwLHRoaXMucmVzaXplVG9GaXRDb250ZW50KCEwKSl9bmdPbkRlc3Ryb3koKXt0aGlzLl90ZXh0YXJlYUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2hhbmRsZUZvY3VzRXZlbnQpLHRoaXMuX3RleHRhcmVhRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9oYW5kbGVGb2N1c0V2ZW50KSx0aGlzLl9kZXN0cm95ZWQubmV4dCgpLHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpfV9jYWNoZVRleHRhcmVhTGluZUhlaWdodCgpe2lmKHRoaXMuX2NhY2hlZExpbmVIZWlnaHQpcmV0dXJuO2xldCB0PXRoaXMuX3RleHRhcmVhRWxlbWVudC5jbG9uZU5vZGUoITEpO3Qucm93cz0xLHQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIix0LnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIsdC5zdHlsZS5ib3JkZXI9Im5vbmUiLHQuc3R5bGUucGFkZGluZz0iMCIsdC5zdHlsZS5oZWlnaHQ9IiIsdC5zdHlsZS5taW5IZWlnaHQ9IiIsdC5zdHlsZS5tYXhIZWlnaHQ9IiIsdC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIix0aGlzLl90ZXh0YXJlYUVsZW1lbnQucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0KSx0aGlzLl9jYWNoZWRMaW5lSGVpZ2h0PXQuY2xpZW50SGVpZ2h0LHRoaXMuX3RleHRhcmVhRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLHRoaXMuX3NldE1pbkhlaWdodCgpLHRoaXMuX3NldE1heEhlaWdodCgpfV9tZWFzdXJlU2Nyb2xsSGVpZ2h0KCl7Y29uc3QgdD10aGlzLl90ZXh0YXJlYUVsZW1lbnQsZT10LnN0eWxlLm1hcmdpbkJvdHRvbXx8IiIsbj10aGlzLl9wbGF0Zm9ybS5GSVJFRk9YLG89biYmdGhpcy5faGFzRm9jdXMsaT1uPyJjZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3giOiJjZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nIjtvJiYodC5zdHlsZS5tYXJnaW5Cb3R0b209YCR7dC5jbGllbnRIZWlnaHR9cHhgKSx0LmNsYXNzTGlzdC5hZGQoaSk7Y29uc3QgYT10LnNjcm9sbEhlaWdodC00O3JldHVybiB0LmNsYXNzTGlzdC5yZW1vdmUoaSksbyYmKHQuc3R5bGUubWFyZ2luQm90dG9tPWUpLGF9X2NhY2hlVGV4dGFyZWFQbGFjZWhvbGRlckhlaWdodCgpe2lmKCF0aGlzLl9pc1ZpZXdJbml0ZWR8fG51bGwhPXRoaXMuX2NhY2hlZFBsYWNlaG9sZGVySGVpZ2h0KXJldHVybjtpZighdGhpcy5wbGFjZWhvbGRlcilyZXR1cm4gdm9pZCh0aGlzLl9jYWNoZWRQbGFjZWhvbGRlckhlaWdodD0wKTtjb25zdCB0PXRoaXMuX3RleHRhcmVhRWxlbWVudC52YWx1ZTt0aGlzLl90ZXh0YXJlYUVsZW1lbnQudmFsdWU9dGhpcy5fdGV4dGFyZWFFbGVtZW50LnBsYWNlaG9sZGVyLHRoaXMuX2NhY2hlZFBsYWNlaG9sZGVySGVpZ2h0PXRoaXMuX21lYXN1cmVTY3JvbGxIZWlnaHQoKSx0aGlzLl90ZXh0YXJlYUVsZW1lbnQudmFsdWU9dH1uZ0RvQ2hlY2soKXt0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXImJnRoaXMucmVzaXplVG9GaXRDb250ZW50KCl9cmVzaXplVG9GaXRDb250ZW50KHQ9ITEpe2lmKCF0aGlzLl9lbmFibGVkKXJldHVybjtpZih0aGlzLl9jYWNoZVRleHRhcmVhTGluZUhlaWdodCgpLHRoaXMuX2NhY2hlVGV4dGFyZWFQbGFjZWhvbGRlckhlaWdodCgpLCF0aGlzLl9jYWNoZWRMaW5lSGVpZ2h0KXJldHVybjtjb25zdCBlPXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxuPWUudmFsdWU7aWYoIXQmJnRoaXMuX21pblJvd3M9PT10aGlzLl9wcmV2aW91c01pblJvd3MmJm49PT10aGlzLl9wcmV2aW91c1ZhbHVlKXJldHVybjtjb25zdCBvPXRoaXMuX21lYXN1cmVTY3JvbGxIZWlnaHQoKSxpPU1hdGgubWF4KG8sdGhpcy5fY2FjaGVkUGxhY2Vob2xkZXJIZWlnaHR8fDApO2Uuc3R5bGUuaGVpZ2h0PWAke2l9cHhgLHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PnsidW5kZWZpbmVkIiE9dHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZT9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT50aGlzLl9zY3JvbGxUb0NhcmV0UG9zaXRpb24oZSkpKTpzZXRUaW1lb3V0KCgoKT0+dGhpcy5fc2Nyb2xsVG9DYXJldFBvc2l0aW9uKGUpKSl9KSksdGhpcy5fcHJldmlvdXNWYWx1ZT1uLHRoaXMuX3ByZXZpb3VzTWluUm93cz10aGlzLl9taW5Sb3dzfXJlc2V0KCl7dm9pZCAwIT09dGhpcy5faW5pdGlhbEhlaWdodCYmKHRoaXMuX3RleHRhcmVhRWxlbWVudC5zdHlsZS5oZWlnaHQ9dGhpcy5faW5pdGlhbEhlaWdodCl9X25vb3BJbnB1dEhhbmRsZXIoKXt9X2dldERvY3VtZW50KCl7cmV0dXJuIHRoaXMuX2RvY3VtZW50fHxkb2N1bWVudH1fZ2V0V2luZG93KCl7cmV0dXJuIHRoaXMuX2dldERvY3VtZW50KCkuZGVmYXVsdFZpZXd8fHdpbmRvd31fc2Nyb2xsVG9DYXJldFBvc2l0aW9uKHQpe2NvbnN0e3NlbGVjdGlvblN0YXJ0OmUsc2VsZWN0aW9uRW5kOm59PXQ7IXRoaXMuX2Rlc3Ryb3llZC5pc1N0b3BwZWQmJnRoaXMuX2hhc0ZvY3VzJiZ0LnNldFNlbGVjdGlvblJhbmdlKGUsbil9fUFZLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxBWSkoU20oaGcpLFNtKHd6KSxTbShhXyksU20oWl8sOCkpfSxBWS7JtWRpcj1sbyh7dHlwZTpBWSxzZWxlY3RvcnM6W1sidGV4dGFyZWEiLCJjZGtUZXh0YXJlYUF1dG9zaXplIiwiIl1dLGhvc3RBdHRyczpbInJvd3MiLCIxIiwxLCJjZGstdGV4dGFyZWEtYXV0b3NpemUiXSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezEmZSYmVm0oImlucHV0IiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9ub29wSW5wdXRIYW5kbGVyKCl9KSl9LGlucHV0czp7bWluUm93czpbImNka0F1dG9zaXplTWluUm93cyIsIm1pblJvd3MiXSxtYXhSb3dzOlsiY2RrQXV0b3NpemVNYXhSb3dzIiwibWF4Um93cyJdLGVuYWJsZWQ6WyJjZGtUZXh0YXJlYUF1dG9zaXplIiwiZW5hYmxlZCJdLHBsYWNlaG9sZGVyOiJwbGFjZWhvbGRlciJ9LGV4cG9ydEFzOlsiY2RrVGV4dGFyZWFBdXRvc2l6ZSJdfSksQVkuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ30se3R5cGU6d3p9LHt0eXBlOmFffSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1pfXX1dfV0sQVkucHJvcERlY29yYXRvcnM9e21pblJvd3M6W3t0eXBlOnh5LGFyZ3M6WyJjZGtBdXRvc2l6ZU1pblJvd3MiXX1dLG1heFJvd3M6W3t0eXBlOnh5LGFyZ3M6WyJjZGtBdXRvc2l6ZU1heFJvd3MiXX1dLGVuYWJsZWQ6W3t0eXBlOnh5LGFyZ3M6WyJjZGtUZXh0YXJlYUF1dG9zaXplIl19XSxwbGFjZWhvbGRlcjpbe3R5cGU6eHl9XSxfbm9vcElucHV0SGFuZGxlcjpbe3R5cGU6d3ksYXJnczpbImlucHV0Il19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChBWSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJ0ZXh0YXJlYVtjZGtUZXh0YXJlYUF1dG9zaXplXSIsZXhwb3J0QXM6ImNka1RleHRhcmVhQXV0b3NpemUiLGhvc3Q6e2NsYXNzOiJjZGstdGV4dGFyZWEtYXV0b3NpemUiLHJvd3M6IjEifX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTp3en0se3R5cGU6YV99LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbWl9dfV19XX0pLHttaW5Sb3dzOlt7dHlwZTp4eSxhcmdzOlsiY2RrQXV0b3NpemVNaW5Sb3dzIl19XSxtYXhSb3dzOlt7dHlwZTp4eSxhcmdzOlsiY2RrQXV0b3NpemVNYXhSb3dzIl19XSxlbmFibGVkOlt7dHlwZTp4eSxhcmdzOlsiY2RrVGV4dGFyZWFBdXRvc2l6ZSJdfV0scGxhY2Vob2xkZXI6W3t0eXBlOnh5fV0sX25vb3BJbnB1dEhhbmRsZXI6W3t0eXBlOnd5LGFyZ3M6WyJpbnB1dCJdfV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIFRZe31UWS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VFkpfSxUWS7JtW1vZD1hbyh7dHlwZTpUWX0pLFRZLsm1aW5qPXZuKHtpbXBvcnRzOltba3pdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoVFksW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W1JZLEFZXSxpbXBvcnRzOltrel0sZXhwb3J0czpbUlksQVldfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oVFkse2RlY2xhcmF0aW9uczpmdW5jdGlvbigpe3JldHVybltSWSxBWV19LGltcG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5ba3pdfSxleHBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1JZLEFZXX19KTtjbGFzcyBOWSBleHRlbmRzIEFZe2dldCBtYXRBdXRvc2l6ZU1pblJvd3MoKXtyZXR1cm4gdGhpcy5taW5Sb3dzfXNldCBtYXRBdXRvc2l6ZU1pblJvd3ModCl7dGhpcy5taW5Sb3dzPXR9Z2V0IG1hdEF1dG9zaXplTWF4Um93cygpe3JldHVybiB0aGlzLm1heFJvd3N9c2V0IG1hdEF1dG9zaXplTWF4Um93cyh0KXt0aGlzLm1heFJvd3M9dH1nZXQgbWF0QXV0b3NpemUoKXtyZXR1cm4gdGhpcy5lbmFibGVkfXNldCBtYXRBdXRvc2l6ZSh0KXt0aGlzLmVuYWJsZWQ9dH1nZXQgbWF0VGV4dGFyZWFBdXRvc2l6ZSgpe3JldHVybiB0aGlzLmVuYWJsZWR9c2V0IG1hdFRleHRhcmVhQXV0b3NpemUodCl7dGhpcy5lbmFibGVkPXR9fU5ZLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYShOWSkpKShufHxOWSl9fSkoKSxOWS7JtWRpcj1sbyh7dHlwZTpOWSxzZWxlY3RvcnM6W1sidGV4dGFyZWEiLCJtYXQtYXV0b3NpemUiLCIiXSxbInRleHRhcmVhIiwibWF0VGV4dGFyZWFBdXRvc2l6ZSIsIiJdXSxob3N0QXR0cnM6WyJyb3dzIiwiMSIsMSwiY2RrLXRleHRhcmVhLWF1dG9zaXplIiwibWF0LWF1dG9zaXplIl0saW5wdXRzOntjZGtBdXRvc2l6ZU1pblJvd3M6ImNka0F1dG9zaXplTWluUm93cyIsY2RrQXV0b3NpemVNYXhSb3dzOiJjZGtBdXRvc2l6ZU1heFJvd3MiLG1hdEF1dG9zaXplTWluUm93czoibWF0QXV0b3NpemVNaW5Sb3dzIixtYXRBdXRvc2l6ZU1heFJvd3M6Im1hdEF1dG9zaXplTWF4Um93cyIsbWF0QXV0b3NpemU6WyJtYXQtYXV0b3NpemUiLCJtYXRBdXRvc2l6ZSJdLG1hdFRleHRhcmVhQXV0b3NpemU6Im1hdFRleHRhcmVhQXV0b3NpemUifSxleHBvcnRBczpbIm1hdFRleHRhcmVhQXV0b3NpemUiXSxmZWF0dXJlczpbeHBdfSksTlkucHJvcERlY29yYXRvcnM9e21hdEF1dG9zaXplTWluUm93czpbe3R5cGU6eHl9XSxtYXRBdXRvc2l6ZU1heFJvd3M6W3t0eXBlOnh5fV0sbWF0QXV0b3NpemU6W3t0eXBlOnh5LGFyZ3M6WyJtYXQtYXV0b3NpemUiXX1dLG1hdFRleHRhcmVhQXV0b3NpemU6W3t0eXBlOnh5fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoTlksW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoidGV4dGFyZWFbbWF0LWF1dG9zaXplXSwgdGV4dGFyZWFbbWF0VGV4dGFyZWFBdXRvc2l6ZV0iLGV4cG9ydEFzOiJtYXRUZXh0YXJlYUF1dG9zaXplIixpbnB1dHM6WyJjZGtBdXRvc2l6ZU1pblJvd3MiLCJjZGtBdXRvc2l6ZU1heFJvd3MiXSxob3N0OntjbGFzczoiY2RrLXRleHRhcmVhLWF1dG9zaXplIG1hdC1hdXRvc2l6ZSIscm93czoiMSJ9fV19XSxudWxsLHttYXRBdXRvc2l6ZU1pblJvd3M6W3t0eXBlOnh5fV0sbWF0QXV0b3NpemVNYXhSb3dzOlt7dHlwZTp4eX1dLG1hdEF1dG9zaXplOlt7dHlwZTp4eSxhcmdzOlsibWF0LWF1dG9zaXplIl19XSxtYXRUZXh0YXJlYUF1dG9zaXplOlt7dHlwZTp4eX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCB6WT1uZXcgR2EoIk1BVF9JTlBVVF9WQUxVRV9BQ0NFU1NPUiIpLElZPVsiYnV0dG9uIiwiY2hlY2tib3giLCJmaWxlIiwiaGlkZGVuIiwiaW1hZ2UiLCJyYWRpbyIsInJhbmdlIiwicmVzZXQiLCJzdWJtaXQiXTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovbGV0IEhZPTA7Y29uc3QgRlk9dEgoY2xhc3N7Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy5fZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyPXQsdGhpcy5fcGFyZW50Rm9ybT1lLHRoaXMuX3BhcmVudEZvcm1Hcm91cD1uLHRoaXMubmdDb250cm9sPW99fSk7Y2xhc3MgTFkgZXh0ZW5kcyBGWXtjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyLHMsbCxjKXtzdXBlcihhLG8saSxuKSx0aGlzLl9lbGVtZW50UmVmPXQsdGhpcy5fcGxhdGZvcm09ZSx0aGlzLl9hdXRvZmlsbE1vbml0b3I9cyx0aGlzLl9mb3JtRmllbGQ9Yyx0aGlzLl91aWQ9Im1hdC1pbnB1dC0iK0hZKyssdGhpcy5mb2N1c2VkPSExLHRoaXMuc3RhdGVDaGFuZ2VzPW5ldyBJLHRoaXMuY29udHJvbFR5cGU9Im1hdC1pbnB1dCIsdGhpcy5hdXRvZmlsbGVkPSExLHRoaXMuX2Rpc2FibGVkPSExLHRoaXMuX3JlcXVpcmVkPSExLHRoaXMuX3R5cGU9InRleHQiLHRoaXMuX3JlYWRvbmx5PSExLHRoaXMuX25ldmVyRW1wdHlJbnB1dFR5cGVzPVsiZGF0ZSIsImRhdGV0aW1lIiwiZGF0ZXRpbWUtbG9jYWwiLCJtb250aCIsInRpbWUiLCJ3ZWVrIl0uZmlsdGVyKCh0PT5EeigpLmhhcyh0KSkpO2NvbnN0IGQ9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LHA9ZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3RoaXMuX2lucHV0VmFsdWVBY2Nlc3Nvcj1yfHxkLHRoaXMuX3ByZXZpb3VzTmF0aXZlVmFsdWU9dGhpcy52YWx1ZSx0aGlzLmlkPXRoaXMuaWQsZS5JT1MmJmwucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT57dC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIiwodD0+e2NvbnN0IGU9dC50YXJnZXQ7ZS52YWx1ZXx8MCE9PWUuc2VsZWN0aW9uU3RhcnR8fDAhPT1lLnNlbGVjdGlvbkVuZHx8KGUuc2V0U2VsZWN0aW9uUmFuZ2UoMSwxKSxlLnNldFNlbGVjdGlvblJhbmdlKDAsMCkpfSkpfSkpLHRoaXMuX2lzU2VydmVyPSF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIsdGhpcy5faXNOYXRpdmVTZWxlY3Q9InNlbGVjdCI9PT1wLHRoaXMuX2lzVGV4dGFyZWE9InRleHRhcmVhIj09PXAsdGhpcy5faXNJbkZvcm1GaWVsZD0hIWMsdGhpcy5faXNOYXRpdmVTZWxlY3QmJih0aGlzLmNvbnRyb2xUeXBlPWQubXVsdGlwbGU/Im1hdC1uYXRpdmUtc2VsZWN0LW11bHRpcGxlIjoibWF0LW5hdGl2ZS1zZWxlY3QiKX1nZXQgZGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5uZ0NvbnRyb2wmJm51bGwhPT10aGlzLm5nQ29udHJvbC5kaXNhYmxlZD90aGlzLm5nQ29udHJvbC5kaXNhYmxlZDp0aGlzLl9kaXNhYmxlZH1zZXQgZGlzYWJsZWQodCl7dGhpcy5fZGlzYWJsZWQ9eXoodCksdGhpcy5mb2N1c2VkJiYodGhpcy5mb2N1c2VkPSExLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKSl9Z2V0IGlkKCl7cmV0dXJuIHRoaXMuX2lkfXNldCBpZCh0KXt0aGlzLl9pZD10fHx0aGlzLl91aWR9Z2V0IHJlcXVpcmVkKCl7cmV0dXJuIHRoaXMuX3JlcXVpcmVkfXNldCByZXF1aXJlZCh0KXt0aGlzLl9yZXF1aXJlZD15eih0KX1nZXQgdHlwZSgpe3JldHVybiB0aGlzLl90eXBlfXNldCB0eXBlKHQpe3RoaXMuX3R5cGU9dHx8InRleHQiLHRoaXMuX3ZhbGlkYXRlVHlwZSgpLCF0aGlzLl9pc1RleHRhcmVhJiZEeigpLmhhcyh0aGlzLl90eXBlKSYmKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC50eXBlPXRoaXMuX3R5cGUpfWdldCB2YWx1ZSgpe3JldHVybiB0aGlzLl9pbnB1dFZhbHVlQWNjZXNzb3IudmFsdWV9c2V0IHZhbHVlKHQpe3QhPT10aGlzLnZhbHVlJiYodGhpcy5faW5wdXRWYWx1ZUFjY2Vzc29yLnZhbHVlPXQsdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpKX1nZXQgcmVhZG9ubHkoKXtyZXR1cm4gdGhpcy5fcmVhZG9ubHl9c2V0IHJlYWRvbmx5KHQpe3RoaXMuX3JlYWRvbmx5PXl6KHQpfW5nQWZ0ZXJWaWV3SW5pdCgpe3RoaXMuX3BsYXRmb3JtLmlzQnJvd3NlciYmdGhpcy5fYXV0b2ZpbGxNb25pdG9yLm1vbml0b3IodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5zdWJzY3JpYmUoKHQ9Pnt0aGlzLmF1dG9maWxsZWQ9dC5pc0F1dG9maWxsZWQsdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpfSkpfW5nT25DaGFuZ2VzKCl7dGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpfW5nT25EZXN0cm95KCl7dGhpcy5zdGF0ZUNoYW5nZXMuY29tcGxldGUoKSx0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXImJnRoaXMuX2F1dG9maWxsTW9uaXRvci5zdG9wTW9uaXRvcmluZyh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpfW5nRG9DaGVjaygpe3RoaXMubmdDb250cm9sJiZ0aGlzLnVwZGF0ZUVycm9yU3RhdGUoKSx0aGlzLl9kaXJ0eUNoZWNrTmF0aXZlVmFsdWUoKSx0aGlzLl9kaXJ0eUNoZWNrUGxhY2Vob2xkZXIoKX1mb2N1cyh0KXt0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXModCl9X2ZvY3VzQ2hhbmdlZCh0KXt0IT09dGhpcy5mb2N1c2VkJiYodGhpcy5mb2N1c2VkPXQsdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpKX1fb25JbnB1dCgpe31fZGlydHlDaGVja1BsYWNlaG9sZGVyKCl7dmFyIHQsZTtjb25zdCBuPShudWxsPT09KGU9bnVsbD09PSh0PXRoaXMuX2Zvcm1GaWVsZCl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuX2hpZGVDb250cm9sUGxhY2Vob2xkZXIpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmNhbGwodCkpP251bGw6dGhpcy5wbGFjZWhvbGRlcjtpZihuIT09dGhpcy5fcHJldmlvdXNQbGFjZWhvbGRlcil7Y29uc3QgdD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7dGhpcy5fcHJldmlvdXNQbGFjZWhvbGRlcj1uLG4/dC5zZXRBdHRyaWJ1dGUoInBsYWNlaG9sZGVyIixuKTp0LnJlbW92ZUF0dHJpYnV0ZSgicGxhY2Vob2xkZXIiKX19X2RpcnR5Q2hlY2tOYXRpdmVWYWx1ZSgpe2NvbnN0IHQ9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlO3RoaXMuX3ByZXZpb3VzTmF0aXZlVmFsdWUhPT10JiYodGhpcy5fcHJldmlvdXNOYXRpdmVWYWx1ZT10LHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKSl9X3ZhbGlkYXRlVHlwZSgpe2lmKElZLmluZGV4T2YodGhpcy5fdHlwZSk+LTEmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSkKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCnRocm93KGZ1bmN0aW9uIHQoZSl7cmV0dXJuIEVycm9yKGBJbnB1dCB0eXBlICIke2V9IiBpc24ndCBzdXBwb3J0ZWQgYnkgbWF0SW5wdXQuYCl9KSh0aGlzLl90eXBlKX1faXNOZXZlckVtcHR5KCl7cmV0dXJuIHRoaXMuX25ldmVyRW1wdHlJbnB1dFR5cGVzLmluZGV4T2YodGhpcy5fdHlwZSk+LTF9X2lzQmFkSW5wdXQoKXtsZXQgdD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudmFsaWRpdHk7cmV0dXJuIHQmJnQuYmFkSW5wdXR9Z2V0IGVtcHR5KCl7cmV0dXJuISh0aGlzLl9pc05ldmVyRW1wdHkoKXx8dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlfHx0aGlzLl9pc0JhZElucHV0KCl8fHRoaXMuYXV0b2ZpbGxlZCl9Z2V0IHNob3VsZExhYmVsRmxvYXQoKXtpZih0aGlzLl9pc05hdGl2ZVNlbGVjdCl7Y29uc3QgdD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsZT10Lm9wdGlvbnNbMF07cmV0dXJuIHRoaXMuZm9jdXNlZHx8dC5tdWx0aXBsZXx8IXRoaXMuZW1wdHl8fCEhKHQuc2VsZWN0ZWRJbmRleD4tMSYmZSYmZS5sYWJlbCl9cmV0dXJuIHRoaXMuZm9jdXNlZHx8IXRoaXMuZW1wdHl9c2V0RGVzY3JpYmVkQnlJZHModCl7dC5sZW5ndGg/dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1kZXNjcmliZWRieSIsdC5qb2luKCIgIikpOnRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtZGVzY3JpYmVkYnkiKX1vbkNvbnRhaW5lckNsaWNrKCl7dGhpcy5mb2N1c2VkfHx0aGlzLmZvY3VzKCl9fUxZLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxMWSkoU20oaGcpLFNtKHd6KSxTbShNaiwxMCksU20oaVUsOCksU20oUFUsOCksU20oYkgpLFNtKHpZLDEwKSxTbShFWSksU20oYV8pLFNtKFJWLDgpKX0sTFkuybVkaXI9bG8oe3R5cGU6TFksc2VsZWN0b3JzOltbImlucHV0IiwibWF0SW5wdXQiLCIiXSxbInRleHRhcmVhIiwibWF0SW5wdXQiLCIiXSxbInNlbGVjdCIsIm1hdE5hdGl2ZUNvbnRyb2wiLCIiXSxbImlucHV0IiwibWF0TmF0aXZlQ29udHJvbCIsIiJdLFsidGV4dGFyZWEiLCJtYXROYXRpdmVDb250cm9sIiwiIl1dLGhvc3RBdHRyczpbMSwibWF0LWlucHV0LWVsZW1lbnQiLCJtYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sIl0saG9zdFZhcnM6OSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezEmZSYmVm0oImZvY3VzIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9mb2N1c0NoYW5nZWQoITApfSkpKCJibHVyIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9mb2N1c0NoYW5nZWQoITEpfSkpKCJpbnB1dCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5fb25JbnB1dCgpfSkpLDImZSYmKFR1KCJkaXNhYmxlZCIsbi5kaXNhYmxlZCkoInJlcXVpcmVkIixuLnJlcXVpcmVkKSxqcCgiaWQiLG4uaWQpKCJkYXRhLXBsYWNlaG9sZGVyIixuLnBsYWNlaG9sZGVyKSgicmVhZG9ubHkiLG4ucmVhZG9ubHkmJiFuLl9pc05hdGl2ZVNlbGVjdHx8bnVsbCkoImFyaWEtaW52YWxpZCIsbi5lbXB0eSYmbi5yZXF1aXJlZD9udWxsOm4uZXJyb3JTdGF0ZSkoImFyaWEtcmVxdWlyZWQiLG4ucmVxdWlyZWQpLHB1KCJtYXQtaW5wdXQtc2VydmVyIixuLl9pc1NlcnZlcikpfSxpbnB1dHM6e2lkOiJpZCIsZGlzYWJsZWQ6ImRpc2FibGVkIixyZXF1aXJlZDoicmVxdWlyZWQiLHR5cGU6InR5cGUiLHZhbHVlOiJ2YWx1ZSIscmVhZG9ubHk6InJlYWRvbmx5IixwbGFjZWhvbGRlcjoicGxhY2Vob2xkZXIiLGVycm9yU3RhdGVNYXRjaGVyOiJlcnJvclN0YXRlTWF0Y2hlciIsdXNlckFyaWFEZXNjcmliZWRCeTpbImFyaWEtZGVzY3JpYmVkYnkiLCJ1c2VyQXJpYURlc2NyaWJlZEJ5Il19LGV4cG9ydEFzOlsibWF0SW5wdXQiXSxmZWF0dXJlczpbcGcoW3twcm92aWRlOmJWLHVzZUV4aXN0aW5nOkxZfV0pLHhwLEJvXX0pLExZLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOnd6fSx7dHlwZTpNaixkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9XX0se3R5cGU6aVUsZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6UFUsZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6Ykh9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6RHJ9LHt0eXBlOmtyLGFyZ3M6W3pZXX1dfSx7dHlwZTpFWX0se3R5cGU6YV99LHt0eXBlOkFWLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltSVl19XX1dLExZLnByb3BEZWNvcmF0b3JzPXtkaXNhYmxlZDpbe3R5cGU6eHl9XSxpZDpbe3R5cGU6eHl9XSxwbGFjZWhvbGRlcjpbe3R5cGU6eHl9XSxyZXF1aXJlZDpbe3R5cGU6eHl9XSx0eXBlOlt7dHlwZTp4eX1dLGVycm9yU3RhdGVNYXRjaGVyOlt7dHlwZTp4eX1dLHVzZXJBcmlhRGVzY3JpYmVkQnk6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWRlc2NyaWJlZGJ5Il19XSx2YWx1ZTpbe3R5cGU6eHl9XSxyZWFkb25seTpbe3R5cGU6eHl9XSxfZm9jdXNDaGFuZ2VkOlt7dHlwZTp3eSxhcmdzOlsiZm9jdXMiLFsidHJ1ZSJdXX0se3R5cGU6d3ksYXJnczpbImJsdXIiLFsiZmFsc2UiXV19XSxfb25JbnB1dDpbe3R5cGU6d3ksYXJnczpbImlucHV0Il19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChMWSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJpbnB1dFttYXRJbnB1dF0sIHRleHRhcmVhW21hdElucHV0XSwgc2VsZWN0W21hdE5hdGl2ZUNvbnRyb2xdLFxuICAgICAgaW5wdXRbbWF0TmF0aXZlQ29udHJvbF0sIHRleHRhcmVhW21hdE5hdGl2ZUNvbnRyb2xdIixleHBvcnRBczoibWF0SW5wdXQiLGhvc3Q6e2NsYXNzOiJtYXQtaW5wdXQtZWxlbWVudCBtYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sIiwiW2NsYXNzLm1hdC1pbnB1dC1zZXJ2ZXJdIjoiX2lzU2VydmVyIiwiW2F0dHIuaWRdIjoiaWQiLCJbYXR0ci5kYXRhLXBsYWNlaG9sZGVyXSI6InBsYWNlaG9sZGVyIiwiW2Rpc2FibGVkXSI6ImRpc2FibGVkIiwiW3JlcXVpcmVkXSI6InJlcXVpcmVkIiwiW2F0dHIucmVhZG9ubHldIjoicmVhZG9ubHkgJiYgIV9pc05hdGl2ZVNlbGVjdCB8fCBudWxsIiwiW2F0dHIuYXJpYS1pbnZhbGlkXSI6IihlbXB0eSAmJiByZXF1aXJlZCkgPyBudWxsIDogZXJyb3JTdGF0ZSIsIlthdHRyLmFyaWEtcmVxdWlyZWRdIjoicmVxdWlyZWQifSxwcm92aWRlcnM6W3twcm92aWRlOmJWLHVzZUV4aXN0aW5nOkxZfV19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6d3p9LHt0eXBlOk1qLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn1dfSx7dHlwZTppVSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpQVSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpiSH0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn0se3R5cGU6a3IsYXJnczpbelldfV19LHt0eXBlOkVZfSx7dHlwZTphX30se3R5cGU6QVYsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1JWXX1dfV19KSx7aWQ6W3t0eXBlOnh5fV0sZGlzYWJsZWQ6W3t0eXBlOnh5fV0scmVxdWlyZWQ6W3t0eXBlOnh5fV0sdHlwZTpbe3R5cGU6eHl9XSx2YWx1ZTpbe3R5cGU6eHl9XSxyZWFkb25seTpbe3R5cGU6eHl9XSxfZm9jdXNDaGFuZ2VkOlt7dHlwZTp3eSxhcmdzOlsiZm9jdXMiLFsidHJ1ZSJdXX0se3R5cGU6d3ksYXJnczpbImJsdXIiLFsiZmFsc2UiXV19XSxfb25JbnB1dDpbe3R5cGU6d3ksYXJnczpbImlucHV0Il19XSxwbGFjZWhvbGRlcjpbe3R5cGU6eHl9XSxlcnJvclN0YXRlTWF0Y2hlcjpbe3R5cGU6eHl9XSx1c2VyQXJpYURlc2NyaWJlZEJ5Olt7dHlwZTp4eSxhcmdzOlsiYXJpYS1kZXNjcmliZWRieSJdfV19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIEJZe31mdW5jdGlvbiBWWSh0LGUpe2lmKDEmdCYmKFJtKDAsIm1hdC1lcnJvciIpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpO3JjKDEpLER1KCIgUmVsb2FkIHBlcmlvZCBoYXMgdG8gYmUgbWluaW11bSBvZiAiLHQuTUlOX1JFTE9BRF9QRVJJT0RfSU5fUywiIHNlY29uZHMuICIpfX1mdW5jdGlvbiBqWSh0LGUpezEmdCYmKFJtKDAsIm1hdC1lcnJvciIpLGt1KDEsIiBQYWdlIHNpemUgaGFzIHRvIGJlIGEgcG9zaXRpdmUgaW50ZWdlci4gIiksQW0oKSl9QlkuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEJZKX0sQlkuybVtb2Q9YW8oe3R5cGU6Qll9KSxCWS7JtWluaj12bih7cHJvdmlkZXJzOltiSF0saW1wb3J0czpbW1RZLFRWLFhJXSxUWSxUVl19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEJZLFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltMWSxOWV0saW1wb3J0czpbVFksVFYsWEldLGV4cG9ydHM6W1RZLFRWLExZLE5ZXSxwcm92aWRlcnM6W2JIXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKEJZLHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bTFksTlldfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1RZLFRWLFhJXX0sZXhwb3J0czpmdW5jdGlvbigpe3JldHVybltUWSxUVixMWSxOWV19fSk7Y2xhc3MgVVl7Y29uc3RydWN0b3IoKXt0aGlzLnJlbG9hZFRvZ2dsZWQ9bmV3IExoLHRoaXMucmVsb2FkUGVyaW9kSW5Nc0NoYW5nZWQ9bmV3IExoLHRoaXMucGFnZVNpemVDaGFuZ2VkPW5ldyBMaCx0aGlzLk1JTl9SRUxPQURfUEVSSU9EX0lOX1M9MzAsdGhpcy5yZWxvYWRQZXJpb2RDb250cm9sPW5ldyAkaih0aGlzLk1JTl9SRUxPQURfUEVSSU9EX0lOX1MsW3FWLnJlcXVpcmVkLHFWLm1pbih0aGlzLk1JTl9SRUxPQURfUEVSSU9EX0lOX1MpXSksdGhpcy5wYWdpbmF0aW9uQ29udHJvbD1uZXcgJGooMSxbcVYucmVxdWlyZWQscVYubWluKDEpLHQ9Pntjb25zdCBlPU51bWJlcih0LnZhbHVlKTtyZXR1cm4gTWF0aC5yb3VuZChlKT09PXQudmFsdWU/bnVsbDp7aW50ZWdlcjp7dmFsdWU6dC52YWx1ZX19fV0pLHRoaXMubmdVbnN1YnNjcmliZT1uZXcgSX1uZ09uSW5pdCgpe3RoaXMucmVsb2FkUGVyaW9kQ29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpLGdlKDUwMCksY2UoKCgpPT50aGlzLnJlbG9hZFBlcmlvZENvbnRyb2wudmFsaWQpKSkuc3Vic2NyaWJlKCgoKT0+e3RoaXMucmVsb2FkUGVyaW9kQ29udHJvbC52YWxpZCYmdGhpcy5yZWxvYWRQZXJpb2RJbk1zQ2hhbmdlZC5lbWl0KDFlMyp0aGlzLnJlbG9hZFBlcmlvZENvbnRyb2wudmFsdWUpfSkpLHRoaXMucGFnaW5hdGlvbkNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoSWUodGhpcy5uZ1Vuc3Vic2NyaWJlKSxnZSg1MDApLGNlKCgoKT0+dGhpcy5wYWdpbmF0aW9uQ29udHJvbC52YWxpZCkpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5wYWdlU2l6ZUNoYW5nZWQuZW1pdCh0aGlzLnBhZ2luYXRpb25Db250cm9sLnZhbHVlKX0pKX1uZ09uRGVzdHJveSgpe3RoaXMubmdVbnN1YnNjcmliZS5uZXh0KCksdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCl9bmdPbkNoYW5nZXModCl7aWYodC5yZWxvYWRQZXJpb2RJbk1zKXtjb25zdCBlPXQucmVsb2FkUGVyaW9kSW5NcztlLnByZXZpb3VzVmFsdWUhPT1lLmN1cnJlbnRWYWx1ZSYmdGhpcy5yZWxvYWRQZXJpb2RDb250cm9sLnNldFZhbHVlKGUuY3VycmVudFZhbHVlLzFlMyl9aWYodC5yZWxvYWRFbmFibGVkJiYodC5yZWxvYWRFbmFibGVkLmN1cnJlbnRWYWx1ZT90aGlzLnJlbG9hZFBlcmlvZENvbnRyb2wuZW5hYmxlKCk6dGhpcy5yZWxvYWRQZXJpb2RDb250cm9sLmRpc2FibGUoKSksdC5wYWdlU2l6ZSl7Y29uc3QgZT10LnBhZ2VTaXplO2UucHJldmlvdXNWYWx1ZSE9PWUuY3VycmVudFZhbHVlJiZ0aGlzLnBhZ2luYXRpb25Db250cm9sLnNldFZhbHVlKGUuY3VycmVudFZhbHVlKX19b25SZWxvYWRUb2dnbGUoKXt0aGlzLnJlbG9hZFRvZ2dsZWQuZW1pdCgpfX1VWS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VVkpfSxVWS7JtWNtcD10byh7dHlwZTpVWSxzZWxlY3RvcnM6W1sic2V0dGluZ3MtZGlhbG9nLWNvbXBvbmVudCJdXSxpbnB1dHM6e3JlbG9hZEVuYWJsZWQ6InJlbG9hZEVuYWJsZWQiLHJlbG9hZFBlcmlvZEluTXM6InJlbG9hZFBlcmlvZEluTXMiLHBhZ2VTaXplOiJwYWdlU2l6ZSJ9LG91dHB1dHM6e3JlbG9hZFRvZ2dsZWQ6InJlbG9hZFRvZ2dsZWQiLHJlbG9hZFBlcmlvZEluTXNDaGFuZ2VkOiJyZWxvYWRQZXJpb2RJbk1zQ2hhbmdlZCIscGFnZVNpemVDaGFuZ2VkOiJwYWdlU2l6ZUNoYW5nZWQifSxmZWF0dXJlczpbQm9dLGRlY2xzOjE0LHZhcnM6NSxjb25zdHM6W1sxLCJyZWxvYWQtdG9nZ2xlIl0sWzMsImNoZWNrZWQiLCJjaGFuZ2UiXSxbIm1hdElucHV0IiwiIiwidHlwZSIsIm51bWJlciIsInBsYWNlaG9sZGVyIiwiUmVsb2FkIFBlcmlvZCIsMSwicmVsb2FkLXBlcmlvZCIsMywiZm9ybUNvbnRyb2wiXSxbNCwibmdJZiJdLFsibWF0SW5wdXQiLCIiLCJ0eXBlIiwibnVtYmVyIiwicGxhY2Vob2xkZXIiLCJQYWdpbmF0aW9uIExpbWl0IiwxLCJwYWdlLXNpemUiLDMsImZvcm1Db250cm9sIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJoMyIpLGt1KDEsIlNldHRpbmdzIiksQW0oKSxSbSgyLCJkaXYiKSxSbSgzLCJkaXYiLDApLFJtKDQsIm1hdC1jaGVja2JveCIsMSksVm0oImNoYW5nZSIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblJlbG9hZFRvZ2dsZSgpfSkpLGt1KDUsIlJlbG9hZCBkYXRhIiksQW0oKSxBbSgpLFJtKDYsImRpdiIpLFJtKDcsIm1hdC1mb3JtLWZpZWxkIiksVG0oOCwiaW5wdXQiLDIpLEFtKCksUXAoOSxWWSwyLDEsIm1hdC1lcnJvciIsMyksQW0oKSxBbSgpLFJtKDEwLCJkaXYiKSxSbSgxMSwibWF0LWZvcm0tZmllbGQiKSxUbSgxMiwiaW5wdXQiLDQpLEFtKCksUXAoMTMsalksMiwwLCJtYXQtZXJyb3IiLDMpLEFtKCkpLDImZSYmKHJjKDQpLERtKCJjaGVja2VkIixuLnJlbG9hZEVuYWJsZWQpLHJjKDQpLERtKCJmb3JtQ29udHJvbCIsbi5yZWxvYWRQZXJpb2RDb250cm9sKSxyYygxKSxEbSgibmdJZiIsbi5yZWxvYWRQZXJpb2RDb250cm9sLmhhc0Vycm9yKCJtaW4iKXx8bi5yZWxvYWRQZXJpb2RDb250cm9sLmhhc0Vycm9yKCJyZXF1aXJlZCIpKSxyYygzKSxEbSgiZm9ybUNvbnRyb2wiLG4ucGFnaW5hdGlvbkNvbnRyb2wpLHJjKDEpLERtKCJuZ0lmIixuLnBhZ2luYXRpb25Db250cm9sLmludmFsaWQpKX0sZGlyZWN0aXZlczpbT1ksQVYsTFksZlUsVlYseGoseFUsZE0sZ1ZdLHN0eWxlczpbIltfbmdob3N0LSVDT01QJV0ge1xuICBmb250LXNpemU6IDE1cHg7XG59XG5cbltfbmdob3N0LSVDT01QJV0gICAgPiBkaXZbX25nY29udGVudC0lQ09NUCVdIHtcbiAgbWFyZ2luOiAxMHB4IDA7XG59XG5cbltfbmdob3N0LSVDT01QJV0gICAgPiBbX25nY29udGVudC0lQ09NUCVdOmZpcnN0LWNoaWxkIHtcbiAgbWFyZ2luLXRvcDogMDtcbn1cblxuW19uZ2hvc3QtJUNPTVAlXSAgICA+IFtfbmdjb250ZW50LSVDT01QJV06bGFzdC1jaGlsZCB7XG4gIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbmgzW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGZvbnQtc2l6ZTogMjBweDtcbn1cblxuLnJlbG9hZC10b2dnbGVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcbn0iXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoVVksW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3Rvcjoic2V0dGluZ3MtZGlhbG9nLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6InNldHRpbmdzX2RpYWxvZ19jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9zZXR0aW5nc19kaWFsb2dfY29tcG9uZW50LmNzcyJdfV19XSxudWxsLHtyZWxvYWRFbmFibGVkOlt7dHlwZTp4eX1dLHJlbG9hZFBlcmlvZEluTXM6W3t0eXBlOnh5fV0scGFnZVNpemU6W3t0eXBlOnh5fV0scmVsb2FkVG9nZ2xlZDpbe3R5cGU6T3l9XSxyZWxvYWRQZXJpb2RJbk1zQ2hhbmdlZDpbe3R5cGU6T3l9XSxwYWdlU2l6ZUNoYW5nZWQ6W3t0eXBlOk95fV19KTtjbGFzcyBHWXtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5yZWxvYWRFbmFibGVkJD10aGlzLnN0b3JlLnNlbGVjdChETiksdGhpcy5yZWxvYWRQZXJpb2RJbk1zJD10aGlzLnN0b3JlLnNlbGVjdChFTiksdGhpcy5wYWdlU2l6ZSQ9dGhpcy5zdG9yZS5zZWxlY3QoUk4pfW9uUmVsb2FkVG9nZ2xlZCgpe3RoaXMuc3RvcmUuZGlzcGF0Y2godk4oKSl9b25SZWxvYWRQZXJpb2RJbk1zQ2hhbmdlZCh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKHhOKHtwZXJpb2RJbk1zOnR9KSl9b25QYWdlU2l6ZUNoYW5nZWQodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChPTih7c2l6ZTp0fSkpfX1HWS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8R1kpKFNtKEl3KSl9LEdZLsm1Y21wPXRvKHt0eXBlOkdZLHNlbGVjdG9yczpbWyJzZXR0aW5ncy1kaWFsb2ciXV0sZGVjbHM6NCx2YXJzOjksY29uc3RzOltbMywicmVsb2FkRW5hYmxlZCIsInJlbG9hZFBlcmlvZEluTXMiLCJwYWdlU2l6ZSIsInJlbG9hZFRvZ2dsZWQiLCJyZWxvYWRQZXJpb2RJbk1zQ2hhbmdlZCIsInBhZ2VTaXplQ2hhbmdlZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwic2V0dGluZ3MtZGlhbG9nLWNvbXBvbmVudCIsMCksVm0oInJlbG9hZFRvZ2dsZWQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25SZWxvYWRUb2dnbGVkKCl9KSkoInJlbG9hZFBlcmlvZEluTXNDaGFuZ2VkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblJlbG9hZFBlcmlvZEluTXNDaGFuZ2VkKGUpfSkpKCJwYWdlU2l6ZUNoYW5nZWQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uUGFnZVNpemVDaGFuZ2VkKGUpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBaCgzLCJhc3luYyIpLEFtKCkpLDImZSYmRG0oInJlbG9hZEVuYWJsZWQiLFRoKDEsMyxuLnJlbG9hZEVuYWJsZWQkKSkoInJlbG9hZFBlcmlvZEluTXMiLFRoKDIsNSxuLnJlbG9hZFBlcmlvZEluTXMkKSkoInBhZ2VTaXplIixUaCgzLDcsbi5wYWdlU2l6ZSQpKX0sZGlyZWN0aXZlczpbVVldLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChHWSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJzZXR0aW5ncy1kaWFsb2ciLHRlbXBsYXRlOidcbiAgICA8c2V0dGluZ3MtZGlhbG9nLWNvbXBvbmVudFxuICAgICAgW3JlbG9hZEVuYWJsZWRdPSJyZWxvYWRFbmFibGVkJCB8IGFzeW5jIlxuICAgICAgW3JlbG9hZFBlcmlvZEluTXNdPSJyZWxvYWRQZXJpb2RJbk1zJCB8IGFzeW5jIlxuICAgICAgW3BhZ2VTaXplXT0icGFnZVNpemUkIHwgYXN5bmMiXG4gICAgICAocmVsb2FkVG9nZ2xlZCk9Im9uUmVsb2FkVG9nZ2xlZCgpIlxuICAgICAgKHJlbG9hZFBlcmlvZEluTXNDaGFuZ2VkKT0ib25SZWxvYWRQZXJpb2RJbk1zQ2hhbmdlZCgkZXZlbnQpIlxuICAgICAgKHBhZ2VTaXplQ2hhbmdlZCk9Im9uUGFnZVNpemVDaGFuZ2VkKCRldmVudCkiXG4gICAgPjwvc2V0dGluZ3MtZGlhbG9nLWNvbXBvbmVudD5cbiAgJ31dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSxudWxsKTtjbGFzcyBXWXtjb25zdHJ1Y3Rvcih0KXt0aGlzLmRpYWxvZz10fWlzQnV0dG9uRGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5zZXR0aW5nc0xvYWRTdGF0ZT09PXlFLk5PVF9MT0FERUR8fHRoaXMuc2V0dGluZ3NMb2FkU3RhdGU9PT15RS5MT0FESU5HfW9wZW5EaWFsb2coKXt0aGlzLmRpYWxvZy5vcGVuKEdZLHt3aWR0aDoiNDAwcHgifSl9fVdZLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxXWSkoU20ob1cpKX0sV1kuybVjbXA9dG8oe3R5cGU6V1ksc2VsZWN0b3JzOltbInNldHRpbmdzLWJ1dHRvbi1jb21wb25lbnQiXV0saW5wdXRzOntzZXR0aW5nc0xvYWRTdGF0ZToic2V0dGluZ3NMb2FkU3RhdGUifSxkZWNsczoyLHZhcnM6MSxjb25zdHM6W1sibWF0LWljb24tYnV0dG9uIiwiIiwzLCJkaXNhYmxlZCIsImNsaWNrIl0sWyJzdmdJY29uIiwic2V0dGluZ3NfMjRweCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiYnV0dG9uIiwwKSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub3BlbkRpYWxvZygpfSkpLFRtKDEsIm1hdC1pY29uIiwxKSxBbSgpKSwyJmUmJkRtKCJkaXNhYmxlZCIsbi5pc0J1dHRvbkRpc2FibGVkKCkpfSxkaXJlY3RpdmVzOltYSCxEV10sZW5jYXBzdWxhdGlvbjoyfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChXWSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJzZXR0aW5ncy1idXR0b24tY29tcG9uZW50Iix0ZW1wbGF0ZTonXG4gICAgPGJ1dHRvblxuICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICBbZGlzYWJsZWRdPSJpc0J1dHRvbkRpc2FibGVkKCkiXG4gICAgICAoY2xpY2spPSJvcGVuRGlhbG9nKCkiXG4gICAgPlxuICAgICAgPG1hdC1pY29uIHN2Z0ljb249InNldHRpbmdzXzI0cHgiPjwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gICd9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpvV31dfSkse3NldHRpbmdzTG9hZFN0YXRlOlt7dHlwZTp4eX1dfSk7Y2xhc3MgWVl7Y29uc3RydWN0b3IodCl7dGhpcy5zdG9yZT10LHRoaXMuc2V0dGluZ3NMb2FkU3RhdGUkPXRoaXMuc3RvcmUuc2VsZWN0KFNOKX19WVkuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFlZKShTbShJdykpfSxZWS7JtWNtcD10byh7dHlwZTpZWSxzZWxlY3RvcnM6W1sic2V0dGluZ3MtYnV0dG9uIl1dLGRlY2xzOjIsdmFyczozLGNvbnN0czpbWzMsInNldHRpbmdzTG9hZFN0YXRlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihUbSgwLCJzZXR0aW5ncy1idXR0b24tY29tcG9uZW50IiwwKSxBaCgxLCJhc3luYyIpKSwyJmUmJkRtKCJzZXR0aW5nc0xvYWRTdGF0ZSIsVGgoMSwxLG4uc2V0dGluZ3NMb2FkU3RhdGUkKSl9LGRpcmVjdGl2ZXM6W1dZXSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246Mn0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWVksW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3Rvcjoic2V0dGluZ3MtYnV0dG9uIix0ZW1wbGF0ZTonXG4gICAgPHNldHRpbmdzLWJ1dHRvbi1jb21wb25lbnRcbiAgICAgIFtzZXR0aW5nc0xvYWRTdGF0ZV09InNldHRpbmdzTG9hZFN0YXRlJCB8IGFzeW5jIlxuICAgID48L3NldHRpbmdzLWJ1dHRvbi1jb21wb25lbnQ+XG4gICd9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y2xhc3MgcVl7fXFZLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxxWSl9LHFZLsm1Y21wPXRvKHt0eXBlOnFZLHNlbGVjdG9yczpbWyJhcHAtaGVhZGVyIl1dLGRlY2xzOjEwLHZhcnM6MCxjb25zdHM6W1sxLCJicmFuZCJdLFsxLCJwbHVnaW5zIl0sWyJtYXQtaWNvbi1idXR0b24iLCIiLCJocmVmIiwiaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIiwicmVsIiwibm9vcGVuZXIgbm9yZWZlcnJlciIsInRhcmdldCIsIl9ibGFuayIsImFyaWEtbGFiZWwiLCJIZWxwIiwxLCJyZWFkbWUiXSxbInN2Z0ljb24iLCJoZWxwX291dGxpbmVfMjRweCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwibWF0LXRvb2xiYXIiKSxSbSgxLCJzcGFuIiwwKSxrdSgyLCJUZW5zb3JCb2FyZCIpLEFtKCksVG0oMywicGx1Z2luLXNlbGVjdG9yIiwxKSxUbSg0LCJ0YmRldi11cGxvYWQtYnV0dG9uIiksVG0oNSwiYXBwLWhlYWRlci1kYXJrLW1vZGUtdG9nZ2xlIiksVG0oNiwiYXBwLWhlYWRlci1yZWxvYWQiKSxUbSg3LCJzZXR0aW5ncy1idXR0b24iKSxSbSg4LCJhIiwyKSxUbSg5LCJtYXQtaWNvbiIsMyksQW0oKSxBbSgpKX0sZGlyZWN0aXZlczpbZUIsVkcsSVcsY1kscFksWVksS0gsRFddLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfW1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7Y29sb3I6I2ZmZjtkaXNwbGF5OmZsZXg7aGVpZ2h0OjY0cHg7b3ZlcmZsb3c6aGlkZGVuO3dpZHRoOjEwMCV9dGJkZXYtdXBsb2FkLWJ1dHRvbi5zaG93bltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgOHB4IDAgMTZweH0uYnJhbmRbX25nY29udGVudC0lQ09NUCVdLCAucmVhZG1lW19uZ2NvbnRlbnQtJUNPTVAlXSwgYXBwLWhlYWRlci1yZWxvYWRbX25nY29udGVudC0lQ09NUCVdLCBzZXR0aW5ncy1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZsZXg6MCAwIGF1dG99LmJyYW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtsZXR0ZXItc3BhY2luZzotMC4wMjVlbTttYXJnaW4tbGVmdDoxMHB4O3RleHQtcmVuZGVyaW5nOm9wdGltaXplTGVnaWJpbGl0eX0ucGx1Z2luc1tfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtmbGV4OjEgMSBhdXRvO2ZvbnQtc2l6ZToxNHB4O2hlaWdodDoxMDAlO292ZXJmbG93OmhpZGRlbn0nXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgocVksW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiYXBwLWhlYWRlciIsdGVtcGxhdGU6J1xuICAgIDxtYXQtdG9vbGJhcj5cbiAgICAgIDxzcGFuIGNsYXNzPSJicmFuZCI+VGVuc29yQm9hcmQ8L3NwYW4+XG4gICAgICA8cGx1Z2luLXNlbGVjdG9yIGNsYXNzPSJwbHVnaW5zIj48L3BsdWdpbi1zZWxlY3Rvcj5cbiAgICAgIDx0YmRldi11cGxvYWQtYnV0dG9uPjwvdGJkZXYtdXBsb2FkLWJ1dHRvbj5cbiAgICAgIDxhcHAtaGVhZGVyLWRhcmstbW9kZS10b2dnbGU+PC9hcHAtaGVhZGVyLWRhcmstbW9kZS10b2dnbGU+XG4gICAgICA8YXBwLWhlYWRlci1yZWxvYWQ+PC9hcHAtaGVhZGVyLXJlbG9hZD5cbiAgICAgIDxzZXR0aW5ncy1idXR0b24+PC9zZXR0aW5ncy1idXR0b24+XG4gICAgICA8YVxuICAgICAgICBjbGFzcz0icmVhZG1lIlxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIlxuICAgICAgICByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiXG4gICAgICAgIHRhcmdldD0iX2JsYW5rIlxuICAgICAgICBhcmlhLWxhYmVsPSJIZWxwIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj0iaGVscF9vdXRsaW5lXzI0cHgiPjwvbWF0LWljb24+XG4gICAgICA8L2E+XG4gICAgPC9tYXQtdG9vbGJhcj5cbiAgJyxzdHlsZVVybHM6WyJoZWFkZXJfY29tcG9uZW50LmNzcyJdfV19XSxudWxsLG51bGwpO2NvbnN0IFpZPVsicm91dGVDb250YWluZXIiXTtjbGFzcyBYWXtjb25zdHJ1Y3Rvcih0KXt0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcj10fW5nT25DaGFuZ2VzKHQpe2NvbnN0IGU9dC5hY3RpdmVOZ0NvbXBvbmVudDtpZihlJiYodGhpcy5yb3V0ZUNvbnRhaW5lci5jbGVhcigpLGUuY3VycmVudFZhbHVlKSl7Y29uc3QgdD10aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShlLmN1cnJlbnRWYWx1ZSk7dGhpcy5yb3V0ZUNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQodCl9fX1YWS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WFkpKFNtKHVnKSl9LFhZLsm1Y21wPXRvKHt0eXBlOlhZLHNlbGVjdG9yczpbWyJyb3V0ZXItb3V0bGV0LWNvbXBvbmVudCJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmUWgoWlksNyxlaCksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5yb3V0ZUNvbnRhaW5lcj10LmZpcnN0KX19LGlucHV0czp7YWN0aXZlTmdDb21wb25lbnQ6ImFjdGl2ZU5nQ29tcG9uZW50In0sZmVhdHVyZXM6W0JvXSxkZWNsczoyLHZhcnM6MCxjb25zdHM6W1sicm91dGVDb250YWluZXIiLCIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmSW0oMCxudWxsLDApfSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFhZLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InJvdXRlci1vdXRsZXQtY29tcG9uZW50Iix0ZW1wbGF0ZToiIDxuZy1jb250YWluZXIgI3JvdXRlQ29udGFpbmVyPjwvbmctY29udGFpbmVyPiAiLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp1Z31dfSkse3JvdXRlQ29udGFpbmVyOlt7dHlwZTpaYSxhcmdzOlsicm91dGVDb250YWluZXIiLHtzdGF0aWM6ITAscmVhZDplaH1dfV0sYWN0aXZlTmdDb21wb25lbnQ6W3t0eXBlOnh5fV19KTtjbGFzcyBLWXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuc3RvcmU9dCx0aGlzLnJlZ2lzdHJ5PWUsdGhpcy5hY3RpdmVOZ0NvbXBvbmVudCQ9V3QoW3RoaXMuc3RvcmUuc2VsZWN0KFNTKSx0aGlzLnN0b3JlLnNlbGVjdChEUyldKS5waXBlKEl0KCgoW3QsZV0pPT50P251bGwhPT1lJiZRayhlLnJvdXRlS2luZCxlLnBhcmFtcykhPT1Rayh0LnJvdXRlS2luZCx0LnBhcmFtcyk/bnVsbDp0aGlzLnJlZ2lzdHJ5LmdldE5nQ29tcG9uZW50QnlSb3V0ZUtpbmQodC5yb3V0ZUtpbmQpOm51bGwpKSl9fXZhciBKWTtLWS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8S1kpKFNtKEl3KSxTbShQUykpfSxLWS7JtWNtcD10byh7dHlwZTpLWSxzZWxlY3RvcnM6W1sicm91dGVyLW91dGxldCJdXSxkZWNsczoyLHZhcnM6Myxjb25zdHM6W1szLCJhY3RpdmVOZ0NvbXBvbmVudCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwicm91dGVyLW91dGxldC1jb21wb25lbnQiLDApLEFoKDEsImFzeW5jIikpLDImZSYmRG0oImFjdGl2ZU5nQ29tcG9uZW50IixUaCgxLDEsbi5hY3RpdmVOZ0NvbXBvbmVudCQpKX0sZGlyZWN0aXZlczpbWFldLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChLWSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJyb3V0ZXItb3V0bGV0Iix0ZW1wbGF0ZTonXG4gICAgPHJvdXRlci1vdXRsZXQtY29tcG9uZW50XG4gICAgICBbYWN0aXZlTmdDb21wb25lbnRdPSJhY3RpdmVOZ0NvbXBvbmVudCQgfCBhc3luYyJcbiAgICA+PC9yb3V0ZXItb3V0bGV0LWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9LHt0eXBlOlBTfV19KSxudWxsKSwoZnVuY3Rpb24odCl7dFt0LkFDVElWRV9QTFVHSU49MF09IkFDVElWRV9QTFVHSU4ifSkoSll8fChKWT17fSkpO2NsYXNzIFFZe2NvbnN0cnVjdG9yKHQpe3RoaXMuZGVlcExpbmtlcj10LHRoaXMub25WYWx1ZUNoYW5nZT1uZXcgTGgsdGhpcy5uZ1Vuc3Vic2NyaWJlPW5ldyBJLHRoaXMub25IYXNoQ2hhbmdlPW9lKHdpbmRvdywicG9wc3RhdGUiLHtwYXNzaXZlOiEwfSkucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpKX1uZ09uSW5pdCgpe3RoaXMub25IYXNoQ2hhbmdlLnN1YnNjcmliZSgoKCk9Pntjb25zdCB0PXRoaXMuZGVlcExpbmtlci5nZXRQbHVnaW5JZCgpO3QhPT10aGlzLmFjdGl2ZVBsdWdpbklkJiZ0aGlzLm9uVmFsdWVDaGFuZ2UuZW1pdCh7cHJvcDpKWS5BQ1RJVkVfUExVR0lOLHZhbHVlOnR9KX0pKX1uZ09uRGVzdHJveSgpe3RoaXMubmdVbnN1YnNjcmliZS5uZXh0KCksdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCl9bmdPbkNoYW5nZXModCl7aWYodC5hY3RpdmVQbHVnaW5JZCl7Y29uc3QgZT10LmFjdGl2ZVBsdWdpbklkO3RoaXMuZGVlcExpbmtlci5zZXRQbHVnaW5JZChudWxsPT09ZS5jdXJyZW50VmFsdWU/IiI6ZS5jdXJyZW50VmFsdWUse2RlZmF1bHRWYWx1ZToiIix1c2VMb2NhdGlvblJlcGxhY2U6bnVsbD09PWUucHJldmlvdXNWYWx1ZXx8ZS5maXJzdENoYW5nZX0pfX19UVkuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFFZKShTbShWUykpfSxRWS7JtWNtcD10byh7dHlwZTpRWSxzZWxlY3RvcnM6W1siaGFzaC1zdG9yYWdlLWNvbXBvbmVudCJdXSxpbnB1dHM6e2FjdGl2ZVBsdWdpbklkOiJhY3RpdmVQbHVnaW5JZCJ9LG91dHB1dHM6e29uVmFsdWVDaGFuZ2U6Im9uVmFsdWVDaGFuZ2UifSxmZWF0dXJlczpbQm9dLGRlY2xzOjAsdmFyczowLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXt9LGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUVksW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiaGFzaC1zdG9yYWdlLWNvbXBvbmVudCIsdGVtcGxhdGU6IiIsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlZTfV19KSx7YWN0aXZlUGx1Z2luSWQ6W3t0eXBlOnh5fV0sb25WYWx1ZUNoYW5nZTpbe3R5cGU6T3l9XX0pO2NsYXNzICRZe2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLmFjdGl2ZVBsdWdpbklkJD10aGlzLnN0b3JlLnBpcGUoRncoTVIpKX1vblZhbHVlQ2hhbmdlZCh0KXtzd2l0Y2godC5wcm9wKXtjYXNlIEpZLkFDVElWRV9QTFVHSU46dGhpcy5zdG9yZS5kaXNwYXRjaChDRSh7cGx1Z2luOnQudmFsdWV9KSl9fX0kWS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8JFkpKFNtKEl3KSl9LCRZLsm1Y21wPXRvKHt0eXBlOiRZLHNlbGVjdG9yczpbWyJoYXNoLXN0b3JhZ2UiXV0sZGVjbHM6Mix2YXJzOjMsY29uc3RzOltbMywiYWN0aXZlUGx1Z2luSWQiLCJvblZhbHVlQ2hhbmdlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJoYXNoLXN0b3JhZ2UtY29tcG9uZW50IiwwKSxWbSgib25WYWx1ZUNoYW5nZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25WYWx1ZUNoYW5nZWQoZSl9KSksQWgoMSwiYXN5bmMiKSxBbSgpKSwyJmUmJkRtKCJhY3RpdmVQbHVnaW5JZCIsVGgoMSwxLG4uYWN0aXZlUGx1Z2luSWQkKSl9LGRpcmVjdGl2ZXM6W1FZXSxwaXBlczpbd01dLHN0eWxlczpbIltfbmdob3N0LSVDT01QJV0ge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfSJdLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCgkWSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJoYXNoLXN0b3JhZ2UiLHRlbXBsYXRlOidcbiAgICA8aGFzaC1zdG9yYWdlLWNvbXBvbmVudFxuICAgICAgW2FjdGl2ZVBsdWdpbklkXT0iYWN0aXZlUGx1Z2luSWQkIHwgYXN5bmMiXG4gICAgICAob25WYWx1ZUNoYW5nZSk9Im9uVmFsdWVDaGFuZ2VkKCRldmVudCkiXG4gICAgPlxuICAgIDwvaGFzaC1zdG9yYWdlLWNvbXBvbmVudD5cbiAgJyxzdHlsZXM6WyJcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICAiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NsYXNzIHRxe25nT25DaGFuZ2VzKHQpe3QudGl0bGUmJihmdW5jdGlvbiBlKHQpe2RvY3VtZW50LnRpdGxlPXR9KSh0LnRpdGxlLmN1cnJlbnRWYWx1ZSl9fXRxLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx0cSl9LHRxLsm1Y21wPXRvKHt0eXBlOnRxLHNlbGVjdG9yczpbWyJwYWdlLXRpdGxlLWNvbXBvbmVudCJdXSxpbnB1dHM6e3RpdGxlOiJ0aXRsZSJ9LGZlYXR1cmVzOltCb10sZGVjbHM6MCx2YXJzOjAsdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pe30sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh0cSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJwYWdlLXRpdGxlLWNvbXBvbmVudCIsdGVtcGxhdGU6IiIsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7dGl0bGU6W3t0eXBlOnh5fV19KTtjb25zdCBlcT0iVGVuc29yQm9hcmQiO2NsYXNzIG5xe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5zdG9yZT10LHRoaXMuY3VzdG9tQnJhbmROYW1lPWUsdGhpcy5nZXRFeHBlcmltZW50SWQkPXRoaXMuc3RvcmUuc2VsZWN0KFRTKS5waXBlKEl0KCh0PT5udWxsPT10P3ZvaWQgMDp0WzBdKSkpLHRoaXMuZXhwZXJpbWVudE5hbWUkPXRoaXMuZ2V0RXhwZXJpbWVudElkJC5waXBlKGNlKEJvb2xlYW4pLFp0KCh0PT50aGlzLnN0b3JlLnNlbGVjdCh1QSx7ZXhwZXJpbWVudElkOnR9KSkpLEl0KCh0PT50P3QubmFtZTpudWxsKSkpLHRoaXMudGl0bGUkPXRoaXMuc3RvcmUuc2VsZWN0KHhSKS5waXBlKGZlKHRoaXMuc3RvcmUuc2VsZWN0KFJTKSx0aGlzLmV4cGVyaW1lbnROYW1lJCksSXQoKChbdCxlLG5dKT0+e2NvbnN0IG89dGhpcy5jdXN0b21CcmFuZE5hbWV8fGVxO3JldHVybiB0LndpbmRvd190aXRsZT90LndpbmRvd190aXRsZTplPT09WmsuRVhQRVJJTUVOVCYmbj9gJHtufSAtICR7b31gOm99KSksTmUodGhpcy5jdXN0b21CcmFuZE5hbWV8fGVxKSxNZSgpKX19bnEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fG5xKShTbShJdyksU20odUUsOCkpfSxucS7JtWNtcD10byh7dHlwZTpucSxzZWxlY3RvcnM6W1sicGFnZS10aXRsZSJdXSxkZWNsczoyLHZhcnM6Myxjb25zdHM6W1szLCJ0aXRsZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwicGFnZS10aXRsZS1jb21wb25lbnQiLDApLEFoKDEsImFzeW5jIikpLDImZSYmRG0oInRpdGxlIixUaCgxLDEsbi50aXRsZSQpKX0sZGlyZWN0aXZlczpbdHFdLHBpcGVzOlt3TV0sc3R5bGVzOlsiW19uZ2hvc3QtJUNPTVAlXSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9Il0sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKG5xLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InBhZ2UtdGl0bGUiLHRlbXBsYXRlOidcbiAgICA8cGFnZS10aXRsZS1jb21wb25lbnQgW3RpdGxlXT0idGl0bGUkIHwgYXN5bmMiPjwvcGFnZS10aXRsZS1jb21wb25lbnQ+XG4gICcsc3R5bGVzOlsiXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3VFXX1dfV19KSxudWxsKTtjbGFzcyBvcXtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5uZ1Vuc3Vic2NyaWJlPW5ldyBJLHRoaXMuZ2V0UGFnZVNpemUkPXRoaXMuc3RvcmUucGlwZShGdyhSTikpLHRoaXMucGFnaW5hdGVkVmlld1N0b3JlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRmLXBhZ2luYXRlZC12aWV3LXN0b3JlIikudGZfcGFnaW5hdGVkX3ZpZXd9bmdPbkluaXQoKXt0aGlzLmdldFBhZ2VTaXplJC5waXBlKEllKHRoaXMubmdVbnN1YnNjcmliZSksTWUoKSkuc3Vic2NyaWJlKCh0PT57dGhpcy5wYWdpbmF0ZWRWaWV3U3RvcmUuc2V0TGltaXQodCl9KSl9bmdPbkRlc3Ryb3koKXt0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpLHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpfX1vcS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8b3EpKFNtKEl3KSl9LG9xLsm1Y21wPXRvKHt0eXBlOm9xLHNlbGVjdG9yczpbWyJzZXR0aW5ncy1wb2x5bWVyLWludGVyb3AiXV0sZGVjbHM6MCx2YXJzOjAsdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pe30sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChvcSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJzZXR0aW5ncy1wb2x5bWVyLWludGVyb3AiLHRlbXBsYXRlOiIiLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y2xhc3MgaXF7Y29uc3RydWN0b3IodCl7dC5zZWxlY3QoSkQpLnN1YnNjcmliZSgodD0+e2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiZGFyay1tb2RlIix0KX0pKX19aXEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGlxKShTbShJdykpfSxpcS7JtWNtcD10byh7dHlwZTppcSxzZWxlY3RvcnM6W1siZGFyay1tb2RlLXN1cHBvcnRlciJdXSxkZWNsczowLHZhcnM6MCx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7fSxzdHlsZXM6WyJbX25naG9zdC0lQ09NUCVdIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH0iXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoaXEsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiZGFyay1tb2RlLXN1cHBvcnRlciIsdGVtcGxhdGU6IiIsc3R5bGVzOlsiXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSxudWxsKTtjbGFzcyBhcXtjb25zdHJ1Y3Rvcih0KXt0aGlzLnZjUmVmPXR9fWFxLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxhcSkoU20oZWgpKX0sYXEuybVjbXA9dG8oe3R5cGU6YXEsc2VsZWN0b3JzOltbInRiLXdlYmFwcCJdXSxkZWNsczo4LHZhcnM6MCx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwiYXBwLWhlYWRlciIpLFJtKDEsIm1haW4iKSxUbSgyLCJyb3V0ZXItb3V0bGV0IiksQW0oKSxUbSgzLCJhbGVydC1zbmFja2JhciIpLFRtKDQsImhhc2gtc3RvcmFnZSIpLFRtKDUsInBhZ2UtdGl0bGUiKSxUbSg2LCJzZXR0aW5ncy1wb2x5bWVyLWludGVyb3AiKSxUbSg3LCJkYXJrLW1vZGUtc3VwcG9ydGVyIikpfSxkaXJlY3RpdmVzOltxWSxLWSxYTCwkWSxucSxvcSxpcV0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9aHRtbFtfbmdjb250ZW50LSVDT01QJV0sIGJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90byxzYW5zLXNlcmlmO2hlaWdodDoxMDAlO21hcmdpbjowO3BhZGRpbmc6MH1bX25naG9zdC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1ZjVmNTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2hlaWdodDoxMDAlfWFwcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MCAxcHggM3B4IDNweCByZ2JhKDAsMCwwLC4yNSk7ZmxleDowIDA7ei1pbmRleDoxfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIGFwcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICBhcHAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjAgMXB4IDNweCAzcHggcmdiYSgyNTUsMjU1LDI1NSwuMSl9bWFpbltfbmdjb250ZW50LSVDT01QJV17ZmxleC1ncm93OjE7b3ZlcmZsb3c6YXV0b30nXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoYXEsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoidGItd2ViYXBwIix0ZW1wbGF0ZVVybDoiLi9hcHBfY29udGFpbmVyLm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vYXBwX2NvbnRhaW5lci5jc3MiXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmVofV19KSxudWxsKTtjbGFzcyBycXtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5zdG9yZT10LHRoaXMubG9jYXRpb249ZSx0aGlzLmFwcFJvb3RQcm92aWRlcj1uLHRoaXMucGF0aG5hbWU9bnVsbH1oYW5kbGVDbGljayh0KXshdGhpcy5wYXRobmFtZXx8dC5jdHJsS2V5fHx0Lm1ldGFLZXl8fCh0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLnN0b3JlLmRpc3BhdGNoKGxTKHtwYXRobmFtZTp0aGlzLnBhdGhuYW1lfSkpKX1nZXQgaHJlZigpe3JldHVybiB0aGlzLnBhdGhuYW1lP3RoaXMuYXBwUm9vdFByb3ZpZGVyLmdldEFic1BhdGhuYW1lV2l0aEFwcFJvb3QodGhpcy5sb2NhdGlvbi5nZXRGdWxsUGF0aEZyb21Sb3V0ZU9yTmF2KHtwYXRobmFtZTp0aGlzLnBhdGhuYW1lfSkpOm51bGx9c2V0IHJvdXRlckxpbmsodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLDA9PT10Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigicm91dGVMaW5rIHNob3VsZCBoYXZlIHByb3BlciBwYXRoLiBHb3Qgbm90aGluZy4iKTtjb25zdCBlPVsuLi50XS5qb2luKCIvIik7dGhpcy5wYXRobmFtZT1lLmVuZHNXaXRoKCIvIik/ZTplKyIvIn19cnEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHJxKShTbShJdyksU20odFMpLFNtKGVTKSl9LHJxLsm1ZGlyPWxvKHt0eXBlOnJxLHNlbGVjdG9yczpbWyJhIiwicm91dGVyTGluayIsIiJdXSxob3N0VmFyczoxLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgiY2xpY2siLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLmhhbmRsZUNsaWNrKGUpfSkpLDImZSYmanAoImhyZWYiLG4uaHJlZixUcyl9LGlucHV0czp7cm91dGVyTGluazoicm91dGVyTGluayJ9fSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChycSxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJhW3JvdXRlckxpbmtdIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fSx7dHlwZTp0U30se3R5cGU6ZVN9XX0pLHtoYW5kbGVDbGljazpbe3R5cGU6d3ksYXJnczpbImNsaWNrIixbIiRldmVudCJdXX1dLGhyZWY6W3t0eXBlOlB5LGFyZ3M6WyJhdHRyLmhyZWYiXX1dLHJvdXRlckxpbms6W3t0eXBlOnh5fV19KTtjbGFzcyBzcXt9c3EuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHNxKX0sc3EuybVtb2Q9YW8oe3R5cGU6c3F9KSxzcS7JtWluaj12bih7aW1wb3J0czpbW1dNLGlTLG9TLFBTXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHNxLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbV00saVMsb1MsUFNdLGV4cG9ydHM6W0tZLHJxXSxkZWNsYXJhdGlvbnM6W0tZLFhZLHJxXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKHNxLHtkZWNsYXJhdGlvbnM6W0tZLFhZLHJxXSxpbXBvcnRzOltXTSxpUyxvUyxQU10sZXhwb3J0czpbS1kscnFdfSk7Y2xhc3MgbHF7fWxxLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxscSl9LGxxLsm1bW9kPWFvKHt0eXBlOmxxfSksbHEuybVpbmo9dm4oe30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobHEsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W2lxXSxleHBvcnRzOltpcV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhscSx7ZGVjbGFyYXRpb25zOltpcV0sZXhwb3J0czpbaXFdfSk7Y2xhc3MgY3F7fWNxLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxjcSl9LGNxLsm1bW9kPWFvKHt0eXBlOmNxfSksY3EuybVpbmo9dm4oe3Byb3ZpZGVyczpbe3Byb3ZpZGU6VlMsdXNlQ2xhc3M6VVN9XX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoY3EsW3t0eXBlOkF5LGFyZ3M6W3twcm92aWRlcnM6W3twcm92aWRlOlZTLHVzZUNsYXNzOlVTfV19XX1dLG51bGwsbnVsbCk7Y2xhc3MgZHF7fWRxLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxkcSl9LGRxLsm1bW9kPWFvKHt0eXBlOmRxfSksZHEuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxjcV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChkcSxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbJFksUVldLGV4cG9ydHM6WyRZXSxpbXBvcnRzOltXTSxjcV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhkcSx7ZGVjbGFyYXRpb25zOlskWSxRWV0saW1wb3J0czpbV00sY3FdLGV4cG9ydHM6WyRZXX0pO2NsYXNzIHBxe31wcS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8cHEpfSxwcS7JtW1vZD1hbyh7dHlwZTpwcX0pLHBxLsm1aW5qPXZuKHtpbXBvcnRzOltbV01dXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgocHEsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W25xLHRxXSxleHBvcnRzOltucV0saW1wb3J0czpbV01dfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8ocHEse2RlY2xhcmF0aW9uczpbbnEsdHFdLGltcG9ydHM6W1dNXSxleHBvcnRzOltucV19KTtjb25zdCBtcT17aWQ6WGssbmFtZToiIixzdGFydF90aW1lOjB9LHVxPXlrKHtleHBlcmltZW50TWFwOntbbXEuaWRdOm1xfX0pO2Z1bmN0aW9uIGZxKHQsZSl7cmV0dXJuIHh3KHtkYXRhOnVxfSkodCxlKX1jbGFzcyBncXt9Z3EuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGdxKX0sZ3EuybVtb2Q9YW8oe3R5cGU6Z3F9KSxncS7JtWluaj12bih7aW1wb3J0czpbW2RrLmZvckZlYXR1cmUocEEsZnEpXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGdxLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbZGsuZm9yRmVhdHVyZShwQSxmcSldfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oZ3Ese2ltcG9ydHM6W2NrXX0pO2NsYXNzIGhxe31mdW5jdGlvbiBicSgpe3JldHVybiBadyhETiwodD0+KHthdXRvUmVsb2FkOnR9KSkpfWZ1bmN0aW9uIHlxKCl7cmV0dXJuIFp3KEVOLCh0PT4oe2F1dG9SZWxvYWRQZXJpb2RJbk1zOnR9KSkpfWZ1bmN0aW9uIF9xKCl7cmV0dXJuIFp3KFJOLCh0PT4oe3BhZ2VTaXplOnR9KSkpfWhxLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxocSl9LGhxLsm1bW9kPWFvKHt0eXBlOmhxfSksaHEuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxjRyxkRyxKSCxTWSxkVyxFVyxCWV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChocSxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbV1ksWVksVVksR1ksb3FdLGV4cG9ydHM6W1dZLFlZLEdZLG9xXSxlbnRyeUNvbXBvbmVudHM6W0dZXSxpbXBvcnRzOltXTSxjRyxkRyxKSCxTWSxkVyxFVyxCWV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhocSx7ZGVjbGFyYXRpb25zOltXWSxZWSxVWSxHWSxvcV0saW1wb3J0czpbV00sY0csZEcsSkgsU1ksZFcsRVcsQlldLGV4cG9ydHM6W1dZLFlZLEdZLG9xXX0pO2NsYXNzIENxe31DcS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8Q3EpfSxDcS7JtW1vZD1hbyh7dHlwZTpDcX0pLENxLsm1aW5qPXZuKHtpbXBvcnRzOltbZGsuZm9yRmVhdHVyZShQTixmWSkscVMuZGVmaW5lR2xvYmFsU2V0dGluZyhicSkscVMuZGVmaW5lR2xvYmFsU2V0dGluZyh5cSkscVMuZGVmaW5lR2xvYmFsU2V0dGluZyhfcSldLGhxXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQ3EsW3t0eXBlOkF5LGFyZ3M6W3tleHBvcnRzOltocV0saW1wb3J0czpbZGsuZm9yRmVhdHVyZShQTixmWSkscVMuZGVmaW5lR2xvYmFsU2V0dGluZyhicSkscVMuZGVmaW5lR2xvYmFsU2V0dGluZyh5cSkscVMuZGVmaW5lR2xvYmFsU2V0dGluZyhfcSldfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oQ3Ese2ltcG9ydHM6W2NrLHFTLHFTLHFTXSxleHBvcnRzOltocV19KTtjbGFzcyBNcXt9TXEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fE1xKX0sTXEuybVtb2Q9YW8oe3R5cGU6TXF9KSxNcS7JtWluaj12bih7cHJvdmlkZXJzOlt7cHJvdmlkZToid2luZG93Iix1c2VWYWx1ZTp3aW5kb3d9XSxpbXBvcnRzOltbZ1csV00sSkgsZFcsRVddXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoTXEsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W0lXLFJXLFRXXSxleHBvcnRzOltJV10sZW50cnlDb21wb25lbnRzOltUV10saW1wb3J0czpbZ1csV00sSkgsZFcsRVddLHByb3ZpZGVyczpbe3Byb3ZpZGU6IndpbmRvdyIsdXNlVmFsdWU6d2luZG93fV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhNcSx7ZGVjbGFyYXRpb25zOltJVyxSVyxUV10saW1wb3J0czpbZ1csV00sSkgsZFcsRVddLGV4cG9ydHM6W0lXXX0pO2NsYXNzIHZxe312cS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8dnEpfSx2cS7JtW1vZD1hbyh7dHlwZTp2cX0pLHZxLsm1aW5qPXZuKHtwcm92aWRlcnM6W10saW1wb3J0czpbW0pILEVXLEtCLG5CLFRHLG9ZLFdNLEVSLENxLE1xXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHZxLFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltsWSxjWSxxWSxGRyxWRyxwWV0sZXhwb3J0czpbY1kscVksVkcscFldLHByb3ZpZGVyczpbXSxpbXBvcnRzOltKSCxFVyxLQixuQixURyxvWSxXTSxFUixDcSxNcV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyh2cSx7ZGVjbGFyYXRpb25zOltsWSxjWSxxWSxGRyxWRyxwWV0saW1wb3J0czpbSkgsRVcsS0IsbkIsVEcsb1ksV00sRVIsQ3EsTXFdLGV4cG9ydHM6W2NZLHFZLFZHLHBZXX0pO2NsYXNzIHhxe2NvbnN0cnVjdG9yKHQsZSl7Y29uc3Qgbj10LmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybCgiLi9pY29uX2J1bmRsZS5zdmciKTtlLmFkZFN2Z0ljb25TZXQobil9fXhxLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx4cSkodnIoenYpLHZyKENXKSl9LHhxLsm1bW9kPWFvKHt0eXBlOnhxfSkseHEuybVpbmo9dm4oe2ltcG9ydHM6W1tFV11dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh4cSxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W0VXXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnp2fSx7dHlwZTpDV31dfSksbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyh4cSx7aW1wb3J0czpbRVddfSk7Y29uc3QgT3E9bmV3IEdhKCJbcGx1Z2luc10gUGx1Z2luIHJlZ2lzdHJ5IGNvbmZpZyIpLFBxPW5ldyBNYXA7Y2xhc3Mgd3F7Y29uc3RydWN0b3IodCl7aWYoIXQpcmV0dXJuO2NvbnN0IGU9bmV3IFNldCh0Lm1hcCgodD0+dC5wbHVnaW5OYW1lKSkpO2NvbnNvbGUuYXNzZXJ0KGUuc2l6ZT09PXQubGVuZ3RoLCJDYW5ub3QgcmVnaXN0ZXIgdGhlIHNhbWUgcGx1Z2luIG11bHRpcGxlIHRpbWVzLiIpO2Zvcihjb25zdCBlIG9mIHQpe2NvbnN0e3BsdWdpbk5hbWU6dCxjb21wb25lbnRDbGFzczpufT1lO1BxLnNldCh0LG4pfX1zdGF0aWMgZm9yUGx1Z2luKHQsZSl7cmV0dXJue25nTW9kdWxlOndxLHByb3ZpZGVyczpbe3Byb3ZpZGU6T3EsbXVsdGk6ITAsdXNlVmFsdWU6e3BsdWdpbk5hbWU6dCxjb21wb25lbnRDbGFzczplfX1dfX1nZXRDb21wb25lbnQodCl7cmV0dXJuIFBxLmdldCh0KXx8bnVsbH19d3EuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHdxKSh2cihPcSw4KSl9LHdxLsm1bW9kPWFvKHt0eXBlOndxfSksd3EuybVpbmo9dm4oe30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgod3EsW3t0eXBlOkF5LGFyZ3M6W3t9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W09xXX1dfV19KSxudWxsKTtjbGFzcyBrcXtjb25zdHJ1Y3Rvcih0KXt0aGlzLmh0dHA9dCx0aGlzLmh0dHBQYXRoUHJlZml4PSJkYXRhL3BsdWdpbi9kZWJ1Z2dlci12MiJ9ZmV0Y2hSdW5zKCl7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5odHRwUGF0aFByZWZpeCsiL3J1bnMiKX1mZXRjaEV4ZWN1dGlvbkRpZ2VzdHModCxlLG4pe3JldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaHR0cFBhdGhQcmVmaXgrIi9leGVjdXRpb24vZGlnZXN0cyIse3BhcmFtczp7cnVuOnQsYmVnaW46U3RyaW5nKGUpLGVuZDpTdHJpbmcobil9fSl9ZmV0Y2hFeGVjdXRpb25EYXRhKHQsZSxuKXtyZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmh0dHBQYXRoUHJlZml4KyIvZXhlY3V0aW9uL2RhdGEiLHtwYXJhbXM6e3J1bjp0LGJlZ2luOlN0cmluZyhlKSxlbmQ6U3RyaW5nKG4pfX0pfWZldGNoR3JhcGhFeGVjdXRpb25EaWdlc3RzKHQsZSxuLG8pe2lmKHZvaWQgMCE9PW8pdGhyb3cgbmV3IEVycm9yKCJ0cmFjZV9pZCBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIGZldGNoR3JhcGhFeGVjdXRpb25EaWdlc3RzKCkgeWV0Iik7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5odHRwUGF0aFByZWZpeCsiL2dyYXBoX2V4ZWN1dGlvbi9kaWdlc3RzIix7cGFyYW1zOntydW46dCxiZWdpbjpTdHJpbmcoZSksZW5kOlN0cmluZyhuKX19KX1mZXRjaEdyYXBoRXhlY3V0aW9uRGF0YSh0LGUsbixvKXtpZih2b2lkIDAhPT1vKXRocm93IG5ldyBFcnJvcigidHJhY2VfaWQgaXMgbm90IGltcGxlbWVudGVkIGZvciBmZXRjaEdyYXBoRXhlY3V0aW9uRGF0YSgpIHlldCIpO3JldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaHR0cFBhdGhQcmVmaXgrIi9ncmFwaF9leGVjdXRpb24vZGF0YSIse3BhcmFtczp7cnVuOnQsYmVnaW46U3RyaW5nKGUpLGVuZDpTdHJpbmcobil9fSl9ZmV0Y2hHcmFwaE9wSW5mbyh0LGUsbil7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5odHRwUGF0aFByZWZpeCsiL2dyYXBocy9vcF9pbmZvIix7cGFyYW1zOntydW46dCxncmFwaF9pZDplLG9wX25hbWU6bn19KX1mZXRjaFNvdXJjZUZpbGVMaXN0KHQpe3JldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaHR0cFBhdGhQcmVmaXgrIi9zb3VyY2VfZmlsZXMvbGlzdCIse3BhcmFtczp7cnVuOnR9fSl9ZmV0Y2hTb3VyY2VGaWxlKHQsZSl7cmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5odHRwUGF0aFByZWZpeCsiL3NvdXJjZV9maWxlcy9maWxlIix7cGFyYW1zOntydW46dCxpbmRleDpTdHJpbmcoZSl9fSl9ZmV0Y2hTdGFja0ZyYW1lcyh0LGUpe3JldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaHR0cFBhdGhQcmVmaXgrIi9zdGFja19mcmFtZXMvc3RhY2tfZnJhbWVzIix7cGFyYW1zOntydW46dCxzdGFja19mcmFtZV9pZHM6ZS5qb2luKCIsIil9fSkucGlwZShJdCgodD0+KHtzdGFja19mcmFtZXM6dC5zdGFja19mcmFtZXMubWFwKCh0PT4oZnVuY3Rpb24gZSh0KXtyZXR1cm57aG9zdF9uYW1lOnRbMF0sZmlsZV9wYXRoOnRbMV0sbGluZW5vOnRbMl0sZnVuY3Rpb25fbmFtZTp0WzNdfX0pKHQpKSl9KSkpKX1mZXRjaEFsZXJ0cyh0LGUsbixvKXtjb25zdCBpPXtydW46dCxiZWdpbjpTdHJpbmcoZSksZW5kOlN0cmluZyhuKX07cmV0dXJuIHZvaWQgMCE9PW8mJihpLmFsZXJ0X3R5cGU9byksdGhpcy5odHRwLmdldCh0aGlzLmh0dHBQYXRoUHJlZml4KyIvYWxlcnRzIix7cGFyYW1zOml9KX19a3EuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGtxKSh2cihsRSkpfSxrcS7JtXByb3Y9TW4oe3Rva2VuOmtxLGZhY3Rvcnk6a3EuybVmYWN9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGtxLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpsRX1dfSksbnVsbCk7Y2xhc3MgU3F7fVNxLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxTcSl9LFNxLsm1bW9kPWFvKHt0eXBlOlNxfSksU3EuybVpbmo9dm4oe3Byb3ZpZGVyczpba3FdLGltcG9ydHM6W1tjRV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChTcSxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W2NFXSxwcm92aWRlcnM6W2txXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFNxLHtpbXBvcnRzOltjRV19KTtjbGFzcyBEcXt9RHEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fERxKX0sRHEuybVjbXA9dG8oe3R5cGU6RHEsc2VsZWN0b3JzOltbImluYWN0aXZlLWNvbXBvbmVudCJdXSxkZWNsczo1NCx2YXJzOjAsY29uc3RzOltbMSwiY29udGFpbmVyIl0sWzEsInRpdGxlIl0sWzEsImNvZGUiXSxbMSwiYXJnIl0sWzEsImV4aGliaXRzLWNvbnRhaW5lciJdLFsxLCJleGhpYml0Il0sWzEsInNjcmVlbnNob3QiXSxbInNyYyIsImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBVFlBQUFFMkNBWUFBQURydkw2cEFBQW95SHBVV0hSU1lYY2djSEp2Wm1sc1pTQjBlWEJsSUdWNGFXWUFBSGphclp4cGRoeTVjb1gvWXhWZUF1WmhPUmdDNTNnSFhyNi9pMkpyZW1xcm4rMVdpNlNLeFV3a0VIR0hRSURPL3VzL3Ivc1AvaHV0WlpkTDYzWFU2dmt2anp6aTVJdnVQLytOOXpINC9ENisvMUw5K2lyOC9Mcjc5bzNJNTZSM2ZyN1I1dWR6bUx4ZXZ2L0FYL2NJNitmWFhmLzZUdXhmRi9yNkJoZitqRUIzMXRmbngwSHlldnk4SHZMWGhZWjl2cWlqdHgrSHVyNHV0TC9lK0lieTlUZC9HOWJuay83dGZucWhNVXVuY0tNVW82V1EvUHVZUHlOSW43K1R2KzE5akx3djhOcE1LUVgzK2ZSMU1TYmtwOGY3NjdQM1AwN1FUNVA4MTFmdTE5bi85dFV2a3gvbjErdnBsN21zWDNQazYrKy9FY292cjZkdnQ0ay9oY08zRWNXZnYzRjd6UC95T0Y5Lzd6MzlYdnM4M2N5VkdhMWZFZlVtKzY4WjBoc1hVNTdlajFYK05QNFd2bTd2eitCUDk5TnZsdno0N1JkL2RoZ2hzaXJYaFJ4T21PRUdlNTkzMkF3eFI0dU56ekh1bU41clBiVTQ0azVhcDZ3LzRjYVdSanFwczI0N21tUE5jb3JmeGhMZWZjZTczdzZkTzUvQVcyUGdZbHJxdi8zai9xZHYvanQvM0wxYlV4UjgvelpYakNzcXJobUdWazRmZVJkTEVPN1h1cFUzd1gvOStWcCsvMFA4RUtxc1lIblQzSG5BNmRmbkVxdUU3N0dWM2pvbjNsZjQvRm5qNE5yNXVnQlR4TDBMZ3dtSkZmQTFwQkpxOEMzR0ZnTHoyRm1neWNoanluR3hBcUdVZUJoa3pDblY2RnJzVWZmbVoxcDQ3NDBsMXFpWHdTWVdvcVJLYm5WV2FMSllPUmZpcCtWT0RNMlNTaTZsMU5KS2QyV1VXVlBOdGRSYVd4WEl6WlphYnFYVjFscHZvODJlZXU2bDE5NTY3NlBQRVVjQ0E4dW9vNDAreHBnenVzbU5KdGVhdkgveXlvb3JyYnpLcXF1dHZzYWFtL0RaZVpkZGQ5dDlqejFQUE9rQUU2ZWVkdm9aWjFwd0JsSll0bUxWbW5VYk5pK3hkdFBOdDl4NjIrMTMzUGx0MWI1VzlWLysvQnVyRnI1V0xiNlYwdnZhdDFYalZkZmFYNWNJZ3BPaU5XUEZZZzZzZU5NS0VOQlJhK1o3eURscTViUm1ma1NTb2tRR1diUTI3Z1N0R0V1WUxjUnl3N2UxKzc1eS8yamRYT24vYU4zaW4xYk9hZW4rUDFiT3NYVC91bTYvV2JVam50dHZ4VDVacURuMWlleTdaWnk0M0k1eDFUTG50SmxhUzJYdUZYTUxhWmVRV3oyMXJucUJrOXZQTHQzSHhyZTZaNVlQbk1Na0hMOXlQYUhvUXIybWZPUHhFM2hmcGQwMTAyRnBrNTZ5TTQ2OVRyNjUzMVVZTFpjRy84NDhPN1JqM0xTc3VGZFk1dG8wbml1bGZYbmtsdkkrbnFRc0J3QmRmVzhtZGQ4V29tK3NaT285NTU3KzRvWWtLTDlsbmpaakp5RDVPSFZ6bTZXdVdjNWNaWmVUSnludnpmTzQyWWM2Um84UnJTR1NQbmxNUzIzbmNRbTFmSS9DeGFVZVRpM3dkZHNnd3RwMzdicHV5TVhhWWJKcnYxWUE3dVhUYWNiVDVkRGEzS3pEQ20weWY1VXhNMzNiNVFrOWhGMW40YVozU1JTRXMyOGZ6V0k2Vm1lSXlXeHM0MXErcmg3V09DMGFWekRpdUsvR1BCRVF3U21KQ09uK3hFUmFZOTdNMEViYnZoeml0bmF5b0xHRVBNSnN1MXBpa1FmZ05jdGw2WHNJMXRmTmxoMXozRzhvZHBLRndjTWh1eTZQNGxFVFFPSHVNNDJ5N0I3TlNDSU9UN3A5WHlZL0hPWDJRaUsxZlJaejFIWUVPWGlZZmtyTithUmx1L2hWZlIrUm1HUnR5VEk3blptb2ljZzcvdVp5RDhHOUR6azZFb05vc2FHUGFneDVaUktOY1laOFd6bjdpQXZQOWJQWktHWWtKdmNOUE5EMW5ZYytQQ1J3UFkxUXlIRHRhdFhjNnJYQ3hKZEpiWk9STWhlVmRMQithMHVSbXhJUmhjbGsyT2UwYm9jdzdpeUVKK1p6Vk1EeWdmK2R4TjJZZXNycnIvWFR5Tmk5V3BuNTlNMDAzV09OQlNZVkV2ZFY2QmF1SFBaS0RETldHeFZZS2JlNFdFY1NjR3crRTZFa3hzbkowQk05dEJLWXQ2QWJWejFPR2d1Z0lmZnZIRVQ2SkZvTDR3UWN6bUN5Szh6V1NLTWFod2ZIeUdHR2txWUdFTllCVG5PRGpNdGNaeEZZMmJZVmNBT1FJMklodDd1TnBTUkY5a1JDZENZWVBPVHJHeUEvVnJjdVltSGNYYStGblJseU9Zblp0VkRTM2p3T29kcHRTZkFrd1U4eU55NloxWGpBS2FCWXVaK3doYlVrRkFoYUEvUkpGdm8rUVFWYkF6Q3ViU2NGb3lka0pwTi9iaUhtSElIT3R3dWh0bmRPZTBtRXdRZkxHOGhSMHdnbEt4UkoyMkp4RTFDRGZONFRlcmRid0VER3lQVldkRHN0QUdPMkM4TGI2Qy9tUmdQTG1KaDRnS3JXenlTbWdmNEZGbGZ3ajVjSlVGRGtLa3dPa1hQbmNZMVpKZ0tQRVZhZ0c2blFvSlNJZGtzeGQ4VlFPMW15K1M0a21TMkZ4QllFVk5ZdWx5UWtZNUZRL2lFTWI2Y1FqdU9za3hKaWxGZ0RNb3p3OEtZQkdWRTZSaGl4MWhJOXQyOWtYeWRLWWp5ekxsWWhJMnVZeXBHQ2dlTTFBWGZlR3lBMDg5T2txSnRNZW1mMGkxd0hNRjYrZjI0a0pNaEZoRVhRaWpnQ0hiRU81QnY4dUMvNUltSWxCZ09NQ21vQ2cyUDdUYWlCM0FFQUJWdFJtSk1GSmlTenFHSEFLYTd1QVVPUEJwcDBCbVNRNGdVTklSTmZZUDFGVk56Yy9ENEFkMEdlb28wclV1MENZUkFCVHlxV3UyazRVQlR0dFhoV0l3Uk5yQXN4RGpKM3JkMVg3Y0lLaFd1VEtTQVNlU0JtSDBpWXl0V05zQWFoaHJtamxTV1ZXQ0x6MnpKRU9zWTlGUTZyd3ZiZWJWOGlrRXVrc2xseUxOQ05zemFBNktZSjN5MkxBY3kydVJnMHlaaFdtdWlVeGhVRUFMVlpJbFFQY01UVkd6UlBzdkxvbXhDY0Z4QWFyV1JDd3RhMUNFbTZUUGdRdXhpL2phNnYrQUFlR3NRaXF3MThJdHBZUjBKZU9Dd1dBVWxMWXVyMktzTUkwbzRuSU5YTjVUU1kraHhaOVhQNUZwZGNDbGVnc0VQSFlHSmg0VWoyVWxZZy9OcmxHbk1zSm1NalZMaFpZRVhUbG1JREZWbVd4SlNqb3pBT3hCY3EyWVBsVVU0M041SFUvWWFGdi8vczlFVUd0a3NtYXJvQWRPOExCWkVFWnlJbGRrSlE5VEJyUlI4Y1VyYklYb01QTWszTVNnT3pab0ZGN0JJWEZ6RllHcU5ackJ4NnlMTmVnRXNpbi9xR3VJS3VqaHpQSFRteVJIQ0VCcmxtRWpSOGU5VGxrT2RubGF0WlBhdW53d2ZqbmR3OEkxb1dkQWI3b3lNazQ5QmVxWEhQR01sbEVtT1VSc0FNTkV3MzVxaEFud0J5T2NnOGtET1RtMnY0WXdVaGdLSElCS1VGcENEUEMvcXh0UDU2VUdSc1lMOEZDUThnTFRtSW5wOHhLWkF1ZE1DSThzT1hmQU9vQUxrOERnK1Z6amFXcDBwSG5BZVI2Q2xtNWFUWmk1WFRGOW0vejE3RUoxbU1jb2w1QXgxTUplQU93Y3E5NEIyUlBRZ0pRaGpVSHVnVnBCeU1kQVc0QUdXVU9IUHRqZ0k4Ly9LeVhtM0tBd3h3MlFOUVFocVFOOEZTWC9ub0ViR1c1V0E5MGE3TXJYY0xXMlZvU2lJeUNla3ZySCtUeEtvRXpnMWkxMFpXMkRwRzhnellkM2Q0STI4bWdYVWhjcVJkajBOaWlYZVFCbVErUzVvQnExU1FDUFBGdk1JRXpHNUZvclNSK0loRzVCd2lPeXRtRTdDQXJKODdPVGlJTllSbHhLOXozNW1ZOTdvV0lnZm9aa2FnTVM3TTRJQUpjQzRkbnBtQmNvdUw2WWRIdHRla3VDQnNxdWVBSk9RMnF5bnhESHNzekFEWVRIREJCd2huSHBVdkNJY05tUFlKODJFSWdoSXpTTnd2aDYyL3FGc3doYWVUa0NJMFlDeFNIV3lYK3I5RFRtS0JUajBiOEVBNHMrNHNDeCtoYzUrUmFYdkRJb2hoWTdxMTVIeGo0SnBLWVdhR3lVRVV5RHFzUmt4MTY1M0Z1TUlXeFhWRnpFR1pDSTJUSlhoZFFoekFXNENwdUFIeVpSUm9OQVlML1JnUDI1RVJnWGtvOEdmZWltK1VRMGZBTGNLU2pPQ0JRYkx0OW43Z2F2Q1RzZkRjbmpTMTlBWlZpSG5NRm9NZjh4UkJHcWc1R0JEZmcrbDZ3MDFKd203MHUxdGdXRldnWENSekp2MlJOUTJHSjlZbmlMbXc1MFJySmtpTXlRVnAwb0pLa1RRcXNzMG5Kb1ltM0JVRi9FQzk2TVlFU1VORzgwenh6UkRBakd0b09MdXFkVitFMkVsZDZvSDVLS3JUbGZEMTJZVmZYdmoxTTg4Qmtac25DbGp5eG1JeVVGSzN5dG9OTFE4cXNVK0Uxc0I0SUZnMnVoOCtSQkloRDhrZVJEaHZ3UzB1RkFUMlUrYXBpcThObzFnRFZnWHJwZVVETTJGSWMwQ2V4OUMwcCtQQkw2SVJUYTRNK2Qyckt5ZEV5bnhnalIwQ2JrRWFNQWRWeXd1SnJMeGRzNDdzeFh6aVVnbG1GbjRsd0JrN0FkSGphSnNQYlMydXdHQU54b0JlMGFHUUY3QkdISGtVb2ljeFR3ZlJWRUVCQUlvaXY0cEZpZkR0S3c0bjRTMEdFOXdKZFZnUmJEdG5zOEI0aWFUS1FITVhKWUlXNnZJc1RLN2hpdURDblFGSkpneTloN2NHUzBHNXhGdkp2cWFFaDNJbVNiZEltYXFVYU0xeDM0cmNRUGZpSTlDSHZVYUZqdzNtc2hLQWd4aEg1c0hPQURrMEVGUEFxUjVWaGRmWDB2SnhaZ2VNRWk2YnFTTWZFUzlkdzdFYjVDTWxSN2tkN0RQSVY3SUJHN3RFQ1pmd0dnMEZIQWNUZmdqQTdiQSt0NkpNSTR4dGsrbkVUbHkvSUkyRGwwMVpNcjBVNG5VRG5TajlQVUg5S2prUDlWd0VKaTVoZ0crT3Q2QVlLdmlCYkNETU10UW1kc3prdXlvdGQrRXZzWDVRTUltUDZpWDRXWktPOVFlbE8yQVo4VHU1T0d3NVVBeWgrUVpSamd1WGJpQk5kRWwrR3c2S0M0MUVrbTlpT1pBODFhOVIwWnk0TGloQWhXMVdGb0lrc1J2RSt5aTF3Vmt6TjJSakJ0K3d0Z1NTS2d1NkczR3lBZU83aENsSFZvaGJvWWFpYkpCTlJ3QTI1bzdjUmxlU3UxYzJoY1ZsWmdGZzFwMHhtT1Myblp3TmFnR0lXQlhRRWlXRlk2N2dzRExaVFRDOE5WVkJ5SDl1TFdGM3lId01mVlJkMTBmSWxEQkRCYWFTNWxCUS9lN216alEyd0xaQzE3OFoyei8rcnZzZnZvM2dIWmkzeWRSVUtMczJTUkNNak9GRXZDcER5TWs0VHdEemVuVG80SHQ1dEJWNU51Z2FUTjk4WjRtMjhZZnBDV0pzZjg4a2ZTakk2Z1QrSWtUQ1NJQXl1cmJzQnRnNWVETmwvR1Z0d1dxMURaVjFnZytkamhDend6eXBOb04wUWI1K2dMWFV2dlFWMmdYMlJWa3RlVXlFVnBtcVFudkJKOCtHaWNkKzRUd2J1blFUMndENUJXdHlSQThOVkJ2UFF5RGpJOUFhcjhhQVJXQXNqdHh2Q0VWNEVHL2pzUkZIUWtRQ0UrZWgwVi9CS2tsRFhCWFFNT0ZYVVZwZ0ZtU25Za1p2cW03OGJrU0FkRVNuSTZUSnhiaE5QbkxqcGcyc0JKY2JNbWc5TTA5aU56eTI3Y0JGSFhaVThnUjl4M1NyYXNFaUJsYnd4U1g0SlcwWGtDbmtlSW1JeGJMRkgrVEU1Q21aS1dWRkdzY2pqM0V1NEFnRElZTFIyQ1VPcEEvS0RLMkxZdVk5ZXlxdXF5MzQ0RjVMQjhPbFM3eVBjV0xJN2kxRWRnRzFmbFZyT0ttR2pPOHBRV212Mm5pSU54Z3g0N1RRUXd2elhQd3dINkpRaW9zNDNCKzQrRDdnQlBCSTZYTlJyb0NJR2ZLb3FSSWNoRWc0aVFCaC9ZSmxuUFRLRUJsU0NIWURLaHhra29UR2ozaE93V3lSU3dnejNtODVTQmtmQ0ZBZWhWczJwb21YcWt6OVFFQTErQUlLQmZ6TlhjZ2NqVGtoTXE4S0NuNGtraGhBUnBYckRQQzh5Qnk4eEFGTVpCYk9aSmNxZjRkd3c1aWhDdEVoSkMzeENRWlBSb3ZiNTJhQU92Zm43ZkJLMFZjQmpWRndQSjJuSXc1c1Y3UVhERUpBRUVFb3ZnaHk0bW1OTWJKUzRhcllTcnFxL25zbVM0WDVneDhMZW42QUg3dE1CV2Jnc2ZkVzlSUGtoc2tOa0x3NVl0Y0JKY3kyYXF3TlQwR3VIZFlEcFRWeG1zd2ZBRlFCK29reElRTHc0N1YyOEpNMXhER2VjRkYzR2VyT3ljV0FCT011aUdnRUVLcHF5Sm1RYXdOSzZVT0tHbUlqRXJhUGVFOUd2YmhDWFRsM01wSjFOSW5maW9oQTJ5MWtQSzRSK1lJTTQ1MVFUdVhmQ0hPVkVaSmtQSlBVV2RJTE1HUkJySHlyN0FWNkhVNjRyVHBaS213dlZITVNiSGV4ZWd1Ym5VT3ZTT25FeHpFUVl5dDY4WkxIQ1NBTGlXK0NCQVZNanNZWm5zNldqYnZJQVVNV2NHTXlxd2tIa1FnZUVpcXF2ZkNvd1BpUmVjSlRkZVViZ2dMaU9vUUl5UzNUVkYzUXM3QWl2ak9mczkvU29tMjRDMHNhSVllTG9tem5WVUhIRURrejVxeDYrZXg1QXhlcVEvaFpnWkZ3dE5raCtjZzZUR050VFNWZjhOeS9FaDJvZytoRFBiK3FKdlluUU12R2NyRUVRN1Y0THllOXRodTRicHhEd0EyZ1ZWQkJYcFZuTXYvakoxWHJCODJEWnlGSVhpL0JlQkx1QlRXSFlxL0llaVFVb3dMOHhkam5xSnlBZEF0RitRRlFza1pqU0NWRHJVaTNoSEt6RElGZ3NqekNvOHJ3a3ozanF0VEh1RjNEaVdPRThheFlIdXlvU0lKVVZIWDU3clZBUTYzOVVCMXNUT3ZvU0RqR0JrNys2NHZOdFU4MGdJMkhHdWhBeE5yVlpzRUowbVBNSUJHS0NHeHlwZmRnTFM3UHRVT2RxZ2hweDhaam9WUjNOMlRocks1Q1krT0JDTG8xdnkvMVJTRXlEY2tXK0RmakIrOUlqZmpBbFM5QnVsNEVuYnhpNVNHWVF4ZUc5N1crcUN5Vzl2YUVrcis5K0U4Ly9lMUhCYnZ1NjZkYlRLbytCRlJ4cmR0dlpCQjhwdklNTVlrNlJHYUdxKzJkRmpzcVRvVm5ySStzWFJmVjE0aUZHQkZ6cXQwZTZkTktsdGpXcm9CQzhFck5HUUJ6dURzMGIzRDAxZzVFT3BYcHFxck40TFFyVjNmaUNvS2lvM3VnUmtnVTBUb0FjOUlyUkJGWnNpelBnek1XOHhUVktyQTJrSTU4SHNhNkU1a1dyMHNKc0FocnFCb0N2MGtoSkhTV2FvbS9HMWw0U3ZQb1ZjVUpXWHVGSmdFWUdmQlV4TVpma2grZm04WXowb2g0TEFoY29rSkpQV21URVBDejEyNnFhbzNaZ3lhRVFCeXd6Q0lFbmZhMnQwcFI4QXlhUEwzU2tYUXljcnFYbXlLWWx5T3d3cGZvWTc1R09hSkFtREVZdmdGZEx5U3V3OTVGV0VGVnRneUt4YXpCTFBUOGxtYkU2U0hyUzBoZVZYU2dIWW1lc1FZcklhako1dkZZVnNiTC9ZNkVZWnA0eHVhS2VSRW1hQ1pCbnlsODhHYWtZekR1Yzg2SThQQ0FYQkdWYm5obUtpZzlxeHl6bkJtQVBCSGpxRmtUbXNCNVZzaUoxeVF5WmNaaE9TZ1RFSUFXeUhRVmZ4b3d3a3dEV0VBMHN1NG13SVhVVEhQQ21vQ3RxclJra3JnS0xESTVHV0FUeHN0UGhxT1hWWkJDN1Rpc1FZQitONmtFWlJ0TEtoUkVScU8vRm9NbGdRRThucFh3dy9zeE5pZ1E5cTRxeXV3bG1FWW1abm1SSHNsOU1rZENTK1VWeEwzMkV1NitNQ0wzYkNRSElRajFRYVg0aEE1dXBKTHhVRUhpRjRhdXpLMDI2Z3hGempLRGc3V2NqRE1uNDdSWmh0c2srdkYzQ1AyTDVnQ3A0WjJsblFrMEhpRmZNVERjcTRvcVhjWjBxdXdudlFJOVZOZ1hsa2xoeTZGY1pET0crdzZicHlEL3NMcEhtdy9ZeUNDcjI3WTIrSFpQK3lMWUkwTUh1Q2RpaEF0Z0V3blpDVjVXeEFoQktLT1hDcEZhWW9GaVgzS1FpdVEvT1lLZVpRV1FQT3BBV054ODVZdmIzdW81V05JVGcwRjZtWkl3aXFvMWhRZ0pTeG1OdDBKV0Z0RXZjaFRXa3JQeWkxd0QxSGU4ZW1ORVJuVnQyMTdwcTRrTVpoNFlFcm9maEJ5bDk2WktWZGNtTWhJSTVRMHFJNXo4d1dBNGVWNjBDN09aNE1vcnpVVEt6anVKeTUyYXNPWUU3UndpUnJURkZBTEVLSmxlVlV5T2pjV2ZSQ1pNU3c2U01RUGdERis3Y21IUFgzY2MvdnpaL2MwM1htSFNFNXcvU04ydmN1VXZyNnBIakNkeXFreWtsTENXYzJ6c1hjS0dJN25nUXBBRGEzRWFHTnFUZ2xKSUFwL0FzUU5OVW1QVHRyK3hGancrOHZnUUZSMVFnTkd5N0dZQ1FsUmd5MHdTcnArOGdlSUlERHlzb1RwMjJFOGNXMGZqc2M0TkVHNTRmVGZsV3JWbkpqZFZ0RHRkRDdKTEdhaUV2ZDZ5akpzQjdKaWhzSGJ2R2RPaktobWtzeUNUS05VK0hIU3Y0bVF3d0dtK1RYK3l0V0VqTmhtSm9vRngxZ3MxZkZHVDd1SG5rTmZKdzNLZElHVmNtRDB1aE1iY0lpaE1pQm5XYThtS1NxV055dU9CbVZmS0hCMkROc1pUdHpXSWtSclgxUDRLdUt4U0xmZU9yazN5R1dtTzMxUHhrZmpSTmh6RDV6NEJMd3BtSXp1MVZjZlBBSDJxRFFOSFFObFJ1d3hRYzNLSkhxZ0ZjZUdscXQyVTNobHdXREZCZkhoRzFJZ0s5eVNqdE93YkFnbU9oMk0yVUxza0xGUUppRi9GT2JsMm1WVFVJWXpieHVFeVRMTlhwcVBGVkpBUFN1NVc0T0JscXBLUkZkclNhZHBKQ1VjNGdpaTczU25BTU1DR3hzR081MUs4NGFvWEQ4Zno1M2FzN1BISVNGeFlWRkJTRldoRm5odEd4WkJtTWdXOGQraUpnVTBHQjRIYXVyRmZBQVBNcG5JZlFzMlBpWHNhVUFiVXJGS0FxY2hVYnhsM2VoVTNWQXcxZExzakVNdFpTRVVpSitNU3h6YjhPalBVQ0lQSmRHT3d5cCtLbFh4MmYzckQrNXpiVTBFL0VWejgrVlgzZVRtckN3RTFMTXdIU0dTM2VWazg4c2M4NC9NYkVkcjBkTDVvaWVBZWlKbmJTWnBUbVNCQWlIeXBRL1VtVm8ybGVjME9zb21nY3VTeFFTNGl2aWdVSFNxL0JrL1VSdUlaQThDaXdRR21iWkVJaFZvNW9seXV0MGxzRUJCWFNKVFd5VzBydDhRY1RmU3piYWZTMWxGVHlXaVZjRlJSQ1c3V1B1a2NRbEdZa3JRUDVFd0k2UGtCQUlqMTRHbUdoanhBU0VPdUN6RUt3ajVmalFyS2hRa2k2azBiaFR3L2RBNnBRSnZFZzk1VENUNlVOTStMV1VyeUhLai9oaFFuVFJ6QWpPSkNaR1FZYTZtS2ZER0pBQk42Zld0UEVmTzhrdTJDTGtFOU1PY2dRNUJwU1ZQa1dERUxyWTZ0elFPeTVMeVo1NUg5djQvV244L3UvNHJXbitqUWhWNkFJTjVlaUJEN3Y0bW1EZmVlRWJCdjJCWSthL0RhR3BvenY2NGVkSzUzMGhqd040WW1MTWdXYVlwcmtPL3J1SlZVK3V6cFpLK2V5Ym04ZHVteTloQ0taRG82bmlraDVUcjZ3cW5KRE5nWnVCVDFUWGpWN0dBWGRXQVl3dnVvMVlEQUF5bjR1WWxuRGIxTDNsUVZZVkdDL2FJYk54WUMyTFBYK1lBeFJLUGFSZTBsaExsS3Y5TURSaDZVMkVXOVVvQUF4dXlxazJHczBodTJaOVpTRnBOUjBVY3NPSk1Xc1dUQXdsak1RRk43QlJKK3FXbWt5NldpQWZqT1BnVDR4QVZtK0JvSXhvYmg0OUNUQ1B2dXdCY0dweDNxSExzdUxxL1oxUWdKbXRYTmNzRmFEWHZLYW5BWFZSWFUwem0xU2RCVTVzWFRJMG1Td3pLamgwL3RYYjA2blZERXR2TG9VTVpSRlloSHIxZWx2ZkRLNHZCdlVMK05qT3dabDhsRUE2cEx4bUhJNzl1MmV3VngrYkpqcjNxdkhXdkVJYWxMOGlCOUcxQnZ0Y2JwVlFkZm9BSitBZnI3Q2tEM3Z3N2xueU5ZWXZRM0lmeEx4ZTJIRVA0UjRJZ1RNTEloWG10UmkxNk8rR1A4ZUN5TDljWktWNVF2RDQ5VnE3YXJIRGlDMEJQQlhxVWNuRUJDQTdJQTBGbU1XQWh0bDNPaHMydGxQVnZIZktwWEVnRWF1am9zSnJvWTB1RTJQVmVWWm1CTkVBakVTMHVYWkFXWENoc3A1UnJVTXR6eDlBb2RtQ2hPUk9ZR2FJOHdWOXhWUUdCK0pEZXAvSml2akZocVRNQ0RmUnpIM1JJV016MkNIS2dZVFFXOGhUaE9GUVcwc0dUb0R6K3h5bDBOZmFCY1VrK2IvaTRRRG43VVprZGhOUkhTWXpnVkdEZnordmJhMFVmaFU2WEVEQmIrNzlwemozSFhyZFJWcVZjRGtMU2U0aDZpR3JFd3dJREFaTVBQVUhwN1pTcDhSWWpTWGdKbDhsTjdudHlsbzVIMHM0Qzh1cW53ZkpnV0ZhdHRxUDJOVkdwZ2RuNmRZdkF5d2tyOWt0cTNTeUpuaUFPUm9KMkRBOTFqUWZFVEpLUnlRclk5WTcxNFhsRDRZcDNkWkxWbXVuNnBsUTJsc3hUejFZTUc2clVpc0M3U1hwMTd2cXV2aTFFQWFVbm1VQW9HeGM2VHMvTFplUXpLM2xQY2J6cTNFQ2ZtRk8vZUZrL3pRd3I4S2NMZFAwMkJQMldBKzY2NUp6RkFrQmIxZEJncUdYYUN0dmREOUxZd0hOQWlHTWVIb3ViVlg2RGQvUXUyQTNTWVpnVDB4dWdGbWUwQTZrMFlMMnJuSGlTREg4cFNHR3NuL1ZXZG1XV25NaWdzZ0RndlNkMkNXNW9XVFF4b0V2cEZFQmRHWk9INTMyUUVNb0RmVkhvbEpxd2tOVlduMVlkRHprRXBFdi8xcXB6ZUVZSmphZGRoRXBuVnQ2Rk95MnEzUklYY0FSbW45bzZJMnlFc1o5eXY1OGdWYlEva0dsbHBobll6U1pLbHU1Y2hHZ3IzSzRYbkFSejVCbUc2TXRrMmNOWXdpWFpReUFpOE9DRGd1QXBFUHRST2NORE9mVExSUk9CYytMcklEWGlDSkgwYWRITGd6akNaYXJDL2c4cjFYQmdzWmd4alBtNW45ZmlOT3pMZUQ4SERpNjlmUzVWRXlHRTh6NHAxcVFuQjM5WHdlUlBMSVFIUDhoWGIwSjE2TlJ3alYvRnRta3BwaUgxU0tsMzFjUUh2eHljbXpBaDRGV2JnNG55bnlnN0UrVkJoYkRRUHdpK0diOEFJcGtmb3JqSUQ2UTFXb2F5RERoUGNYdFJBaHNJMjZXdnRwNWRaQTA0VkZjZWpxWDlwa0NwcTA1N05aZGJ1OWxmeHZyM0pES3NYaUp3cGFnR00yaVZJMmtKSzVvV1FoNGYwOEE1b0JhV3BDV1BDNkFDbnF3aFRWby9waG1NQndTVWRwZE0xVVR2Y1hmWDZCb1l2aENTZUFvU2VjM3oyM0h0Vm5YUjF0Q3ByNG5EMG1EVWNFRWE3NHRYQjFqVDd0NDM0Zi96Wi9jMDMvbkVIUVBjUlZSRVdUS3VlOENITGtyU0IxWkJCVmFVaWdLMEFLT1I0K29XaGdEcmQ4TEZKN0V4ZnFBTlpvMi9xY0FuQ3lxdWlGcjJha2hIS1JITHlhaWxSNDJwR2plRmFNSGRvS0J3ZFlsNGRIT0ZEN1RndEorOWNCK0hpdFZtTzk4UjJ0L3FxVk1nUE5Xek85Yng4WGdnUndjTHhPRGJBQ3A5L2tDQTRjaUk1NGlDemYvNFllSnJxQXQ3STRsN1UxeFl5RDZ2K1gzZ0xndEttcVRRTGtTbzJKWkVKOFM2Nnprd1o1bGlubjFqOHJrTTROWWxRaDdZbFZpbmkrNXEzNnAyS2Z2U2FRZmJocUtyWXlKNWR5MmNYSWRma3VFbUJVUHZDZU12S1hXM1lzQkxZZnVZOUlIYU9PdXlnQWpYTFFabHhuMC9IRjNDR2NpZC84VHpadTJ6dzVGb3lKK3JnWGMxNFoxUTV3UjZwNkZqS1ZJc2hkcDgxU0RMQ1pLR0Z2WGJ6UXkxeitFdWZuSHlrUi9oOStyOVJXbG1OOGlnT2kxUFpScVozYmF0VUJjNGVMS2k2TDBFMWtrQWRPOUFaQ0J1M2s5S056V3Q3cTZrM2w4eGdtdFdsSGRRdWh1TzRBV1M4SW1Jc2pxbStEa0hrckZ1Z1RCZWEwemVienZmWExYSzBjdW9OcS85V1luei83UDV2aWZFOUw5eTN4QWo0Uk9RL0RpbURtQWlURVY0RElsNjN2K1JJbURINVpkT1JNZVNacm5lZTE5TS9uSURBTnI0RGFRTDlxMXVNREF0TDRxbCtkaGplUDhSckJuSTJYQ0N6MWlRTHB0cE1rQ0RFZm5OZUxlc0l5c0p0Tzl4MmNZeFJPOUhNY28zcXRjY3E0MzRhY1lQZ1ltSURaQlFHTE1GZFdTaHR2K0NFQVRaN0hlbllHcEJkNTE5QWFSUjhLd2pEWVF1RkFmYm1nbEdHNzVPMHEwNDhxTzl5cVhZR0d1c3d5WFJYeDBSSXU2QkdXZmpiQXFGOGNNUVdrQVRxNDlldWRvWkJzVFBjUGh2dU5KUFVHVis3dFdIcHB6YitIZTdFOTVuZ09TUURvMndyOTc1MEtJWG9RZGRsRlVSaWJ3ZmszV0JwcXFxV29Va3dNQk5ZelVHbGlOSWN6d0JyQU11Z016bE50QUxTNnBEMUt1WWExTkpLVUhKNWJOWk40RDVLTnV5dFhzUWJNcE9nMHgrWW1taWVhYjd2dUNUMnBUSXo0R01KbUczRTR0WDJQTXQ1WHU4ekNTaU5oc3IwT2dUME5udkZFVWdBNXNoVXBCM3Ewb3dhNTZ2aXF2VmxGNTNDUEZzTlNpVE0rbkRIVUNFclZKUm5Kd3F6Q3VyKzFWMmNIZXRvZy8xNkNab2ttdHFyMGl6L3FJenovYlA3VFgzbmQ5V2RIMTk3cFIzTUpkYXU3cFhSYVlBSnk3K0JYaWtWTW1mc2pBaTFRZndVc21ab245bE9RSEdvS0ZpMHAzTFFZSFY0U2UzUzFCYXJuWGZzdEF2cXdrZi9xbHFwWGkva0lkWmF4dVlNc1NiWEJ4NW0wZUdLaVVBQ0pra1VRRnoxUTNCT0xaT3EvamdTcFduL0hOcVdKQXZpQUxSVWxaa1lhbVFGL2RXb1JGamhQR1RSMUxhaFJsa05IVFdGWmpqekhBY1RsWTVHclZqcFJwQ0NtK1I0bTdlOTB3N1ZKeHpHOTlFa1pROXNGWS9DcE5TbVBXbFpCTGRoa0tyeG9QMzk4QWRpcW5vV0s3eVpZUEhhbndzSlZPSEhkQmYxSXZZZ1p3dW5RYTJEL0sxSFVKdlUyNXZHYXlsL2JieERYYmg3YVljUXlGaVlrS0YyT2dGV3JYSmpUQ05jcTYzUnF0YW5UdlFXWnd3OG9xRG02K0RSOWdTdTRTSjhIbVRob2RZTlFXWW9QZGpHQ1pZTENJSkFvYWt5VFNaS20zcW5iVTBVZG1aQTZ0QU42ajVnK1JFUUdSTkhITVUrSUNwbVQ3M3RpR3F6dHFPMk45b3BVWEtQVUlhZWRYNHRxV1c5ZFo5ZjR4M3FLZXJmQ1p5UTcwRmdDQzNSbUZ4Q3g0VlcvNXlwMWxGd1NVaHNJL2JXU1NZam50WHBpK3lkYitXbTltNlV6RldWVlJ3TE1oblFqeGsvZ0hKWEd5eXBPdS9DSEVKSWt1L2RhWThMVFlHczFvYks3QzNxekp0d2oxemd2ZTBsSzU0bmdRVTZtWWNXNnRsWG5Td2RQSWZPa0xGc0h1NC9Gek9vR3JKT3dPbUlVMUVMNjZoSzQ2UGpCZHRRUUhVUDFNM1N4dUxybitTQm5vRUlrbFRBaXNzcUhrMDFQWU1XMHVPTUNRT3BwblVnbm9qQllDTm1vVDNlcGZYc0M3QmNHNVZtekI3NENBQ0dGcHdLcGR5Zmh3cmEybEhKQzhHRTZsVmp2NDVZUnBEMW5SbHAwa293M0lycVFkd3FNUFNrWXpYdm9JNUxCRHJXZzJBR2pEVFFGZFdzaVl3anUzbHN4V3NpS0ZGK2hiUWhqeit0bkJlVjNsRVEyN1RwaFJWZHFhdEJ3VlRvZ2oySzlpQjErby9rMDZteXJoYWNQeHc2ZUovZHJ5L005THVkMi9FM3I3T2VxSnVHbDNPZWh3R3NWSVpZdGhJY3FiTmhwWXlrVXdGRVhLNXFHQXlxZE1FM3BpTmpxRkI3dS9OcU1EYlpCdnhhOE5ORDE3dkwvY2s2TWpqMU9FaUJialZvUytzT25ZOVVwSVdHNkQxRmlLQitWQWxFd3BwL2RLZDhKV1lqL09FSkxrbFRuZW5EMGxpb1IzWkp2VzFCRnErVC93RktVNnBsakJqeUJCdEU3c3Z2dWxXSWEvUnBtOEFOWVVGV3ZnWGRFcGtaOEVDOElna200cFVNVzhHdnJqT01ZYXNyQ0FEUTBTQUFEMzJFYmh6S3BsNVFRS0FuajAwRUdHTXg5VnV5Nk9yMXdIbGxIV3U5d042Vkt1OWxJS1hxYStVTndKUmpQZFNUcno2bnJhMFMxVUVLUU9WNVo1L29SQkRRZ3A3Z3lOb2lPV1dscG9TMnBXaGJKWXNPUWp1OGJxaGRsbk9oWDh0V1I3anN2Rnc3czZ6ejZJUzJDRncxQWVndnFXYVRYNmRSd0JLaTBPZnJpWWhadmZsSmhqQXh2MXEyT3NMTVY4M21yOU9DcEFRbWN0b2RKVVRlYlIxbkpLbTZqblF3ejZCV3l1YlVkcmluQXFkbWdIcngrSk1sQlpzZ1YvV0E0THEzZlB4bEZDU2Nlb0o3ZjNRRVovS2Rxak9YSXpwQ1U2azZuZ3ByYWpTS2tuMldkZm9MMnBpdnNxNU5nMlpiQWd6M1BKcGtxK3FGRWFRbDZkVVBTVTR2OVVsai9PUFY0UXhGL2xUZm9qYjgwSHVHeG9NVFpvU3BKMitwWUhsOGpXRkxUV2JjOGJVRU9mSmJKMTZBRVNPSmwxcEljQVozRTBYYTF6cWZRajVDT3dlVUtnWXBNOWNYczR4ZXJWRERWZUVlZ25MSTZsZHEwakdmNUYrUE9nQ0t3UENBVFh6dDE4aEtLT2tkU24wSFVPTWVDUmZlV05Ld0paRkx4ZmZQdEhHSVVlNzBDME9ISGdLRnJPT0hPb1h4cmltMkFMTlJPR3IzVVJkTWZtMzdPZ0JVTTRiUGZXN1pzRHM2akR0MUlyUEtQbzFJTW5ENXc0cnNxZTBySXAyNWI2bzJ2T08vK00ycmZqRUdpdlNBKzYrT2hiR3NDeXR3R2ZSZ0RVR0pGZ09HTFJsOEFIZXkzTWp0dzgrbEYxczZqd2xwNDRhSWFsWFEzSzA2SnNQVWtpSjg1SnVIUkFPUGp4Nm9pek1CSHlHMk9vUzlQQXlXc0d2VnA4NG5JYWdRTmI0NmozTWsrSEJyeUUxQ2ZhcHd5OUJFdDR4WVBRVjRrSUpPUHlwUUZCMFAxVzdUaHZrQlpsUjhFbGNXTG9SOWtsYkRxZjBCbG45Q1kzN2lnN3RDWGJDWXlKYXRWbGxoRTZGQko0ZVpFeDN6RzJBR3l6KzBWMkllb0YwQmtVMHVCektBbjJMd09wYW1rM2g0U3ZEbzZLd25ZWTJoVklPS2dFMEt0S21BWFZ0VzZUY0RzV1NjamtzT25ocEpvVUtqam9TK3ZnZlVTSEpFQWg1Nlh2Vm5EMEMzNlZpZ05JeUtGc0Fxcm5vZG5SYnM2dFhJMWxxR0owYVh6SHRPU3NlWFJ5bHV2aE1ES2VvYWdWVTY3OGpNdWtYblVMWVJFc2dpdUpqNXlmbWRrOUZPVEkwNHlxc3lzN3F4dFJQc0pKU2hBclZTVjBtRmhlUFdyNjI1NnQ3UHFobnZaRStiQS93MXFidEtuU2lpSnBBY3lPa2dJdUh0VkRjSlJ5YzVNc0dUbVlaeUZFOXhERFd1RVFvb3RLUTZkYml2WmZNcGJWVEc4VHJZcitvMWRKeW1XK0NsS3ZQQUhnWTBKamtxNExFdWRVMlRyb3I1T0tzaVZoeUtlckRQZm5aV1I0eUJST0tDdDhIUzFGUSs5UXNJTWhuOGRqOVZxaVBSWjFDSHRhb1hxQVVKVDlQdnFDRFJnSE5XaTRUU3IySkk2cUVFYWhrZFdWUlAyYS95QSs5Y0RXUU83ZkhMdnBPNEJFL1NNYnNkbWVXVnRCc2NNSlVIWWEwVEkvNkMyVk9IWC9Ec3dPVzRiNGNCTzRvOE5rblFxOU5HTnBOYTNsL2ZLTm1nTTJNQTF3RjhWVkt4TEFSdEZhYkZlQ1BCQ2srUEwwbUszdTVmK1g2dDE0TkNXSHkwQjZScXFQcnhkVjkxM00ybnhuWHZ0OEh5NiszVjRNWUFqclF5bksvRGpKTHdFUnRRNitmNHE5cml3TkpmeTRkcFpLVVpNWVgxdFQ3R1VjeThaVldoYTBvSkJwQWtMY0dpdWc2NURHOEkrdDBOREV2S2YrbjNWRFMxMzZvU0VnUk5iWVhQK1Q0Y0hjZ1QxZEdpWHNKUWxCZkkzWGNtMGRUT05QeCtIY1U2VG4zZWhvcllweDZOaVNUZjJ1a0RNSnZPVm1vZlVJQ3ZYN1lCWlZicFZjRU9VZTYxSjQ0Q3VNeXhtMTd0T1BoczlCYjZCQXA4OUlPS2FXckMwV1pQbDNnRjE4QTRSTmRhOEJLbzYwZFBIUytONkFFbHN0TzJWd096V2FEWHVRdHZYMi9JMFVTR0tOUGlpam9CSDFHRW9LRWVHUThFOFJIeGFxV2FSQmpMa1Z3UlBML3FCYTVOT3h3NGYvMCtEWlYyZWxFbEFSYUVFb1BNVTlwUGhPRmR1Vi9mWDdVQTJUMEJXM2o5SmloU0xFMUNGOXV1T3ErbDN4UVE5QnQrNXRhdnBqQVUzMmc2RTN1Zkw3MEhVYmtNUzBWMHhLNytvL2RUcjU2b0k5ZjhHeFJsVGhFK1RTNVNwZThoUVlwcTRPblJ2VjNTUUQwL3JFWlFYd3h4YWc3dW5Jb1FKQ3BmcUtYNjg3c2ZqbjZ6Q1c5YThBc29kWmR5R3JRaDlYRWRXK2NLY2xUYnNrNEdBYTZPV2ZTTVl1aFg2YWh6WDRwMWZCMGdJTWFBQ0l1U25UbXJaQnJIZk16NzJWZmxXZFJ2dEl3bmRYM2ppZkRxYW1OcUtNQUlUT3R3SWlLVm1OK1cvWTZDZkdndmFnOTZwUFNNNEg2U0Z5eUR3TlUwNS9DQ0FkRFdXWkNzTGR3dWNhSGZ6aFdDVHFxb2s2UWhNVmo4aGJoQytwYWpYeUtoQmhCMVdPZ2IyTGdWbkZ3cTRrNlRxczR0cG5hdFhaWitwWWM2NS9WZHNhNU9DNkpsbU9oY2xVZ3JhYWNDa0dvK2VUMmpBeEszMnM5WDBMbU5kRmpOZ1JObnBwcnlROGR3MVN5Y1ZDTXNQREpKa0xYRnFaTnhPakx6MTYvTWNnaUU5ZmVWSVJ3ajV0VDlOOUN1dGhqZzZ0MTRBQUFCZzJsRFExQkpRME1nY0hKdlptbHNaUUFBZUp4OWtUMUl3MEFjeFY5VHBhSVZCVHVJT0dTb1RoWkVSUnkxQ2tXb0VHcUZWaDFNTHYyQ0pnMUppb3VqNEZwdzhHT3g2dURpckt1RHF5QUlmb0E0T1RvcHVraUovMHNLTFdJOE9PN0h1M3VQdTNlQVVDOHp6ZW9ZQnpUZE5sT0p1SmpKcm9xaFY0UWdvQjg5Q01qTU11WWtLUW5mOFhXUEFGL3ZZanpMLzl5Zm8xZk5XUXdJaU1TenpEQnQ0ZzNpNlUzYjRMeFBIR0ZGV1NVK0p4NHo2WUxFajF4WFBIN2pYSEJaNEprUk01MmFKNDRRaTRVMlZ0cVlGVTJOZUlvNHFtbzY1UXNaajFYT1c1eTFjcFUxNzhsZkdNN3BLOHRjcHptTUJCYXhCQWtpRkZSUlFoazJZclRxcEZoSTBYN2N4ei9rK2lWeUtlUXFnWkZqQVJWb2tGMC8rQi84N3RiS1QwNTRTZUU0MFBuaU9COGpRR2dYYU5RYzUvdlljUm9uUVBBWnVOSmIva29kbVBra3ZkYlNva2RBM3pad2NkM1NsRDNnY2djWWZESmtVM2FsSUUwaG53ZmV6K2lic3NEQUxkQzk1dlhXM01mcEE1Q21ycEkzd01FaE1GcWc3SFdmZDNlMTkvYnZtV1ovUDhhN2NtTHcwWHh2QUFBQUJtSkxSMFFBL3dEL0FQK2d2YWVUQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUFCM1JKVFVVSDVBY0NFQjhmQlZ4SHRBQUFJQUJKUkVGVWVOcnNuWGw4Vk9XOS85L1BtUzA3a0lXd2hNVUVBUkVFcEFXMEltb1JwWXExaUZXdy9rVEZ1clNpWGNDNjBOcUNYYkQxdXR3cVdtcXhyZEQySXJkWHNiVEk5WXBMQ3lpaVV0a0RFUklnZXpLVFdjK2M4L3orbUhNbUo1TUppeUlrOEx4ZnIvTUtaQ1l6a3pOblB2bnVYL0g5cjEzQW1xMVZSSDE5R1RieFp1WmQrQUczejF0RjBSMnJXRHR2R0ZETGlobmptTGRoSElzK1dNNzBQS0Q4R2E2NDlGSEtMMTNNOW1jbjA0cWZGYlBHTXUvTjBTellzSndiaXV6dlJ5bGZzWUNIRnIvQzVqMEJmSVZuTWY3bWU3aW1iZ0YzL0M3S3pHVWJXVGllTGtrNEhPYkFnUVBVMU5SUVYxZEhZMk1qVFUxTkJBSUJXbHBhQ0FhRGhNTmh3dUV3MFdpVWFEUktMQllqRm91aDZ6cTZyaE9QeDVPSFlSakpyNFpoWUpxbTg5L0NORTJjaDVUUy9pcWtsTmdISUZLL0FrZ3BoZlhTazE5VHZpZDI3ZHBWWEZCUTBOdm44eFc3WEs1aVRkT0tORTByRUVMa0F6MkFQQ0ZFSHBBTlpBR1pnTmM2WElCbVBaNEpHRURNT3NKQUNBaEtLZjJBWDByWkpLVnNrRkxXRzRaUnArdDZkU1FTcVRsNDhPREJrU05IMWxpUEl4MUh1LzhMSVZKdnM3OEhJSVVRN2I0NkRxbHBHa0lJTkUxTFBhVEw1Y0xsY3FGcEd2YS8zVzUzOHF0OWVEd2UzRzQzaG1IUXZYdDNmRDRmUHArUHpNeE1Nak16eWM3T0ppY25oOXpjWExwMzcwNlBIajBvTEN5a1o4K2U5T25UaDh6TXpHTzQ2dnlzbXp1Sm16ZFBaZFhhK1F4RGtZcDkwYmVlc2hXekdEdnZUVVl2Mk1EeVZtWDZISWl5YnM1WWJsNVZ4QjJyMWpLdmk3MDdzVmlNQXdjT2NPalFJZXJxNm1ob2FLQ3BxUW0vMzU4VXRGQW9SQ1FTSVJLSkhGSFFuR0xtUEV6VEZMYkFwWWhaR3lHenhja3BVcW1DNWZ4L1RVM040SnljbkVGdXQ3dE0wN1JTSWNSQUljUUFZQUNRMFVsT2N3VFlKNlg4eERUTkNzTXc5c1ppc1QyTmpZM2xBd1lNMkowaWNQSXdndGRPQUczaEUwSzBFVHBOMDJTcXlGbkNsaFE1NStFVU41ZkxoV0VZNU9YbDRmVjY4WHE5K0h3K01qSXl5TWpJSUNzckt5bHdlWGw1ZE8vZW5mejhmQW9MQytuVnF4ZDkrdlRCNi9VZVZ0QzJybmlSbDk1Y3hZcFZsUXhiOENyTGJ5aFJLcFlHZHkzUWFsaHRaZkh2MWhQakxDNGNYM1RjQkd6ck0zTlpWaktQK1ZOTDhObmZMVi9CNG5VQjZEdVZTN3VZcU8zZnY1OURodzVSVzF0TGZYMDlqWTJOK1AxK0FvRkFVdERDNGZCaEJVM1g5YVIxbGlwcTZjVE10c3BzWWJQL0tLVVJzamIvMzdWclY4OCtmZnFNOEhnOEkxd3UxOWxDaUxPQnN5RDVWblJtTW9EQlFvakJ0cEI0dlY1eWNuSXdUVE1LYkROTmMyczhIdDhhRG9jLzNybHo1OGZqeG8ycnN5eEZLUk1uU3RyL2Q0cWNsRklLSWV6N0pBWE9NSXlrOVdaYmM5WWhPaEk1cDdDWnBvbW1hWGc4SGp3ZUQxNnZsM0E0ak0vbkl4UUtFUXdHYVdscElSQUk0UGY3YVdwcW9yR3hrWWFHQm1wcmErblZxeGY5K3ZYcitMTzA2Z2wrdDc2SWNUYy95Wk5LMURxMjJJWmNjRDJUSnc2amlGbzJyMXZEQjFWUWV2TlNWczRmVDk1eGVZcEtWc3lheHJ3My9mUWROWkdKbzB2QXY1WDFyMnhnVDZ3dlZ5NWV5Wk9UaTdyRXlhcXVybTduZGpZM055ZmRUcWVnUlNLUmRvSjJCQ3ROMkc1bmlxQ0pEcXl5ZGhiWnRkZGU2MXF5Wk1rWE16SXl2dUJ5dWNZSUljNEZCcDltMS9RdTB6VGYxM1Y5czkvdmYvL3JYLy82Kyt2V3JUTWQ0cFlVT1NHRW1jNmlTMmZOYVpvbTAxaHh1Rnl1TmlJbnBTUXJLeXZwbmpvRnp1djFKcTIzek14TXNyS3lrdTVwdDI3ZDJybW54Y1hGU3FFK3JiQjkvNmF2c0c3OU51cklwYkJzTkZOdm5zYzkwNGNkSjFHenFXWDlpMCt3ZU5rNk5wZFhFYUNRMHZHVHVmbWVlN2hoZE9jWHRlYm1acXFxcXBKV1dqcTNNMTBjVGRkMVlyRlkwa0pMRTBjVHpqaGFHc3RNcEltWDJWYVorTjczdnVkNitPR0hML0Q1Zk9kcG1uYStFT0k4SUVkZDFtMW9rVkt1ajhmajZ3T0J3TWE3N3Jwci9WLys4cGQ0R3FFem5hNnJRK1NjY1RtWmFzbWx4TitrbEpLTWpJeDJzVGV2MTVzVXVJN2liMDczdEtpb2lGNjlldEczYjErNmRldW0zc1hQR21OVHRLTHJPdnYzNzI5anBUVTFOU1d0dEtPSm82VkxEdGlDbG1LZEpkMU1oMFdHVThpa2xGcERROE93bkp5Y2kxd3UxNFZDaUltQXV1cVA4ZStVYVpwdjZicitkblYxOWRzREJ3N2Nib2xiTzZ2T2FkSFoxcHZ6MzNhQ3dTbHlVa3A4UHA5TWwxeEl0ZDdTeGQ5czY2MTc5KzV0ckxkKy9mcmg4WGpVdTZlRTdiTng2TkFoS2lzcjJ5VUhuRzZuTFdxMmxXWmJhRWNyYUlaaEpOMU0welE3RkxOUUtIU3gxK3VkcEduYUpHQ0VlbmVPSy8rT3grT3YrLzMrTndvTEM5OG1rY1UxVThXdUk1R3prdzIydXdyZzlYcVRGbHhIQW1kYmNMYjFab3ViMHoxTlRTNlVsSlRRcTFjdjlZNHBZVHQyZ3NFZysvYnQ0OENCQTFSWFY2ZE5EaHlwZkNQRjdSUXBpUUduZFNaU0xMU2ttSVhENFNsZXIzZUtFR0lLMEZlOU15ZUVLc013L2hFSUJOYm01K2V2cGJWY0phM0lPV055dHFzSzRIYTdwYk04eEJhNUkxbHZxZTVwYm00dWVYbDU5T2pSZzRLQ0FvcUxpK25UcHcvOSsvY25PenRidlZ0SzJJNk8vZnYzSjYwMFp5d3RYWElnTlphV3hrbzdrcUNKMUpoWk1CaTh4T2Z6WFNXRXVGS0pXYWNRdWRWTlRVMnJpNHFLYkV1dWpjaWxXbkgydngzdWFUdUJjN3ZkSFFxYzAzcExUUzZreHQ1S1Nrb09rejFWS0dFREFvRUFuM3p5Q1ZWVlZXMnN0T2JtNWpZMWFVZFpaQ3RzMTlOMk53OWpuV21OalkzRGMzSnl2cVpwMnRXZ2FpMDdLZHRpc2RnckJ3NGMrRnRwYWVsV2g4QVpEcEZ6eHViYVdIRjI5dFFXT1V2WVpEcjNOTlY2YzlhKzJabFQyM3JyMjdjdkF3WU1JRGMzVjcxRFN0amFXMmwyZ2lCZHhyT2pFZzViMU5JSm1yTkx3Q2xvdHBpdFdyVXFZOUtrU2RlNjNlN3BRb2pMMUdYWWRUQk5jMDBvRkhyNXFhZWVldVhCQng4TUEvR09SQzZkd0RscjROSUpuQzF1SFpXR3BHWk83Y1NDc3Q2VXNBRVFDb1hZdTNkdnV3U0JiYVcxdExRa1kybEg2Qnc0bktBSnA5dloxTlEwSWpzNyt6cE4wNjREMUpYWXhmOG02cnIrMHY3OSsvODZhTkNnYlE1WDFVaDFWUjBDSjQ4a2NCMWxUdTNZVzA1T1R0SjZTMDBzbkhIR0dXUmxaYWwzNW5RVnRvTUhEeVpkejVxYW1qWUpnaVBWcFRsRUxhMmdXUVcxYmR6TlVDZzB4ZXYxemhCQ1hLc3V1VlBTaWx2WjFOVDBVbUZoNGV0U3lyZ1F3aWx3aHRPQ3M0WE9HWWRMRmJpT1ltL3A2dDVzMTdSbno1NUoxN1IzNzk2bi9YdmlQcDErV2NNd0tDOHZaOSsrZlJ3OGVERFpFdFhjM0l6Zjd5Y1lEQ1pGTFJxTnB1MGVzQVhORVVkTEsyZzMzbmlqYThtU0pUZTYzZTRiZ1F2VXgvL1VSZE8wYWZuNStkTmlzZGc3TzNmdS9QTXR0OXp5MHNhTkcrT1dtMnBJS2R0bFZnM0RrS1pwU2szVDdGaXNkSllFeGVOeDZTd1hzajBFWnlqRS9xTnIveEVPaFVMSmRxMnlzakpjTHBjU3RsT2RwcVltOXV6WjB5YnI2V3lKT2xLeGJScTNVemk2QkpLQ3RtblRwdHdSSTBiTWNybGNONkZxems0djkwZUlMMlZuWjMvcFgvLzYxemNqa2NqeVpjdVcvZVcyMjI3elc5WmJ2Q09CazFKS1I2RzJVK0JrYWd1ZXM5ZjRTQUpYV2xwSzkrN2RsU3Q2cWxKWldVbEZSUVdWbFpWcGE5UFNGZHNleGtwTEcwUGJ0bTFiajdLeXNsdGNMdGN0d0NEMU1ULzlNQXlEeXNwS0Jnd1lZSCtyUEJLSi9PR1ZWMTc1ODNYWFhkZG9XM0QyWWNYZ3pIUXhPR2ZkbTlNOVRTMExzWXQ2MDlXOGxaU1VNSERnUUVwS1NwU3duVXBJS2RtNWN5ZWZmUEpKc3VEMmNGblAxQTZDRHR4T084dXBTU25GaHg5K21IZldXV2ZOZHJsY3M0RXk5ZkZXd3VZUU5wczk0WEQ0OTMvNjA1K1czM3JycmMxSEVEalQwWFNmMnJrZzAzVXNkSlExdFF0NkJ3d1l3T0RCZzdHNkpaU3dkV1VDZ1FDN2QrOU94dE5xYW1xU1dVOW53VzBIcnFkSWJZVktzZEswK2ZQbnUrYlBuLzlObDh2MVRWVDkyUWw4WXc5QjlRNW9xSUJ3VStJQXlPeWVPUElIUXZFUXlPM1ZtWVROL2tPN0xSUUt2ZkQxcjM5OTJlclZxMk9Xd05raVp6b0V6a3kxM3B3QzUvRjRaRWY5cHM1cElmbjUrZlRzMlpQZXZYdlR2MzkvQmcwYWROclV2SjJTd2xaZFhVMTVlVG43OSsvbjRNR0Q3VW81VXVOcHpvQnNPcmZUVGd6WVdjNUlKSEs5eCtPNUV4aW5sT1lFMFZBQnU5Y2x2aDROK1FOaDBNVEUxMDRpYkE2QjIrajMrNWQyNzk3OUZTR0VuaUp3N1Z4VVJ3ZURUTFhlVW12ZVVndDY3WktRM3IxNzA2OWZQOHJLeWs2TGNVaW5YUEtnb3FLaVRaTEFucHZXVVR6TmFhWFpnVm1uMitsSURHaWhVT2dTcjlkN2w5WHlwRGhSYlBrclZIMTQ3RUs0c1FMNmpvSVJYKzFjMW9RUVk3dDE2emJXTUl3cmEycHFsdmJ1M2Z1ZlRvRkxUVExZQ1FacldJSk1tZDluLy8rb2tneVJTSVJ3T016QWdRT1ZzSFdWZU5xT0hUdllzMmRQc2pYS0hqUFVVVHl0QTllem5kdlowTkF3T0M4djcxdENpRHVVeXB4QTRoSFk4RUxDL2Z5MFZIMlFjRmZQdlE3Y0daM3ExOU0wN1N1OWV2WDZTaXdXVy9MeHh4Ly9mdlRvMGVVT2diUExSQXpBTkUzVHRQZGIyTmxUdTJYUEtXNnBJbWNud0ZMRkxSS0pNR1RJa0ZNMjduWktDRnM0SEdiSGpoMVVWRlMwNmZlMDY5TTZpcWVsV21tV3FDWGR6bG16WnJtZWUrNjV1MTB1MXh4QXpXRSswV3hZQ29IcTQrUEd2djluR0h0VHAvdzFQUjdQN0ZHalJrMEpCb1BQVHBndzRmZWJOMitPQWJwbHZXbTJpeXFsTk8xeDVsWUNTenFISzZRS1hMcFNFV2ZZeFJhM1kxc2tvNFR0aE5EWTJNak9uVHVwcUtoSURvUjBUdVZJVjU5bS9SVnppcHJUU3RPa2xDSVVDazMyK1h6M0FsOVdDbk9TM00vaklXcE9jZHZ5UDUzT0xYWFFOeXNyNnlmdnZ2dnV4VFUxTlV0NjkrNzlsaEFpNW5CUEJhMDlxVExGZ25NS25FeTNGQ2lkZTJwWEFRd2VQSmdlUFhxY1lzTG1YOEdNVWZQWWtIc052L3Z3VVNaMm9SZGZYVjNkcHB6RGJtSlBWM1RyS09VUXRubWV4a3JUS2lzcmV4VVhGOStyYWRwM2xMcWNKQm9xamoybWRyUnVhZCtSSnpTaDhDbmMwNHQ3OWVwMWNUUWEvZlhycjcvK3V5bFRwaHl5M0ZQTktYQ0pYVFRDN01oNmM3aXFISTJiT25qdzRGTXFxZEJsTGJiOSsvZXphOWN1UHZua2syUTVoN09USUYyU0lOVktNd3pEYWFWcGtVaGt1c2ZqK1E0d1JxbkxTV1RYRzYzLzFnL3gwSS8vd2JJR0dEZmo2eXlma0FrWVZINjRpWWRlM2N2NnlnaGtaak42NUFqbVRSL0NhS3NIUExwL053dFdiT0dWdlg0Q1pGQTZ1RDkzVEIvTDlOM3JZT3pBVG44S3ZGN3Z0eTY3N0xMejYrdnJueTBvS0ZndGhIQlo3cW51aUwwSlovd3RqY0IxR0h0THRlQnNnZXZ5VTBMODVheDdaUm51U2FQbXNRY2c4QkkzbDY1ajVrc2JXVmkybFJjWFBNVGlOVnVwaXZyb08yd2lOODlmeUMyajh6ckZheTh2TDJmMzd0MUpVYlBMT1ZLYjJEc1NOV2ZHVTBxcFZWZFg5eXNvS1BpdUVPSXVwU29ubWNBaGFQd2srZCt0cjI5a1JVUEt0ZnZ4djVqeGJEbFZlQ2dkV0l5dm9aWU42OWN6b3g3V2ZtY0lKYzE3bWZQNE83d1doc0xpWW9iUnpJYXRPNW4zZUl5OEg3cVlmTmFoazFMbmRxd0lJVWJuNStjdmpzVml2M25ublhlZXYvamlpeXVGRUpyRFBZMWp0ZkxaazBUc3pLbFQzSnhiejV6TGcrellzbk80UXl3V282eXNLOWFabDdOaXpod1dyZG1HMzVlTGUrYk1DL25kc2plcDhwWnk2UTNYY0dtUm4zVVB6V0wrS2o5OUw1ek9IU1hsdkxKc0ZRdG4rY2xidTVUcEozbXAxUGJ0MjVPRnQ4NmV6OE5rUG9XejE5TlJsNlpKS1VVa0Vwbm04WGkrQjN4QnFVcG5pQzlzYi8xMy9RNFd2TnBJTE9VdVc3ZldFczNMNXNJckxtZnBoQndJN1diV0Q5N2h6YjM3V0I4YXd1U0tmV3oxWk5CMzJGaFczbm9HUmJUdy9LS1hXRmhSeGFxOU1MbStva3NJbTQzSDQ3bHQ0c1NKWTJwcmF4Y1hGUld0c1dKdm1pVnF0dlZHd25DVHFkYWJTSW5Ea2VxaU9qZW4yUUkzZE9qUUxuYmhSS0hvR3VZdm44cmt2Qlc0YjVsM0phOHRlNU1xMzJobXpyK1RpWlR6VEhrZFVNclVlZk9aTnl6S3BXY3RadFdlWFBMOE9MWXJuMWlrbEh6ODhjZnMzcjI3emNKaWUydVVQWmtqSlVtUUttckplTnIyN2R1N2w1V1ZmVi9UdEhsS1RUb1I5UlhXUDJLcytlc0hiS0FINHdhMnNLRkNUOTVsL0xWZlkyTzZBVkFlTDNrZXlCczVrYmRHcG50d0Yza2VTendIanU5U3AwVUljVzVoWWVGemtVamtpVC8rOFkrL25UMTdkcU5sdmVtMGpzZ3liRUZ6eHQ3c1FhZE9jVXRkKzVnUXVTaE5GZS95NXlmMlVqanJQM2xzNXRsZHFCeGtHTlBuRDdPTnQzUXh0akltWGptS0o3Wjl3T0lyeDdKbTFIakdYM29OTSsrWnpMQ1Q1SW5xdXM3SEgzK2M3Q1pJTGJ4TkxlZXcwdG1wV2M5a2dpQVlERjdvOC9ubUNpRW1LeVhwWkZndFV0RzltMWl3S1VMZkN5WnljM3hkRzJHenFmMXdFd3ZlYTZaMmJ4VWI0aGxjZU8wb0pqczMxQjNhelVPdlZsRlpmNGoxRlJwOXg0emxqc0ZBUE5wbFQ0L1A1N3ZuNXB0dlBudlNwRW5QRGh3NDhGMHI5aGF6WEZNaGhEQVNobHByM00zcG1xWk1Fa2tJV3p4QzNkNHR2TDUvUHdmOEp1Nk1Ya3lkdklNUFA0eHo5dGxuZDhtMWYybVRCOFB1WE03YTBTdFl0dXcxMXExZng3SkhYMlBaNzY1azhkb25tWHlDeFMwU2lhUVZOYnZ3TnQwK0FvZWxsdXA2YXJGWTdIYVh5M1VmMEVlcFNDY2swZ3cwOC96eTNWUmw5dU9KcTN1UnR5TDlYZjE3OTdGcWt6L3huN3h1REN0T3FjZnkxN0ptVXdWMUFPNXNocDNSTGJFSS9MTVUvSFlDTkUyYk5HREFnR0Yrdi84LzgvTHkvZ3hvbG51YXROeHdKQlpzajhleTNvVGxzbUthVVJxcnlxbHRDcU9qNGMzcnlhQnpoelAyM0hNNFM2dGc1ODZFcTNyMjJXZVRrWkhSdGM0UmdNL3lVYU5Sd0wrZVorYk1aZEZyZWN4OGNpbXZibHpMUTZPQXVuV3MybnhpWDF3d0dPU2pqejQ2YkoxYVNseE54R0l4WWZkOFdtYTJacHFtVmxWVjFTY2Vqei9tY3JtZVVLTFd1YW45MTBZV1Y4SzRxOGN5OVRDVHJzdXUvaHA3bnY0R0crNDlpN05DMVN4KzlsK3NDVG51TVBnOE5qNTlFOXNXWE13MUJVRmVXL0U2aS9ZYXA4cHA2cE9ibS92VGFEUjYvNnBWcTBxa2xCbldSOWtMZUtTVUxpbWxabC8vVmd4TjJONU1KQklSNFdBejFRMGhvcVlnbytnTVJvNFl6QmtGR2VqTk5SdzRjSUNLaWdwMjd0ekpSeDk5UkRBWTdHSVdtNitJdkZ3Z3NJWUYwMlpSdm5BaGViVnJXTFZxSFZzclAyQnlTUzNyeWdGdkdhTk9ZTElrRUFpMHNkU2NMVksyb0RuSGQ5dXVwMVdmMWlickdRd0dKL2g4dnZ1RUVKY3EyZWprWkJpcytMOERCSUFOeTEraWRIbnJUUnVXLzRVSis3L0NxNWQ1cWRWZDVCWGtVT1J4VVRSNEdOZVViR05oUlMwYnFtRmlmZ3VWWVFOZlhqZEtzc0JYMEorWnc3SjVxVHJJNXAwdGNNN2dVK1owZWIzZTJWT21UQ25kdTNmdk0yZWNjY1o3VnR6TlRpd0lJWVJobXFacEwzaHVHM2R6aVc3ZE1tVkxNRUs0ZWpjYmF6OGh0N0F2WldjT1lxakRYYldQczg4K3U4dE1CM0hqbThnOTg2OWs2NEkxN0NrdnB5cGF3cDFQTHNYLzBBSit0KzUzTEk1NUtUenJVdTZZdDVCYlRsQlRVWE56YzFMVTdHYjIrdnI2ZHU3bllUS2Z5WGhhTkJyOWh0dnR2aDgxL0xGcmtObVRzalA3Y0tFajVGRmJlWWh0ZnBQYzRtTEdueUZZcy94bDVtMkZjVE8reHZJSk9SQnE0SU1HQUMrRm1WQzUvblV1L1o5R2NzZGN6RnUzOWllUE1PWFZZVUFqTDgvYjZYcEdqNE5yZXNtQUFRTUdORFEwUEpXZm4vK0s1WnFLRk5jVVo5ek5Gam1QSjFOMEwrd21QZWdFQTM2YWF6L2hnOW9xYXVPWGNxSFYyZURzVVQzNzdMUHAxcTFiMTRpeGxVMS9rclhUbmQ4ZXo1M1B2c3FkSitFRk5UVTFmV3BSY3lRSnRGdHV1Y1cxZVBIaUgyaWE5aUNuMlc2SExrM0JjQ1pmZXluT3JNNzYzLytabWVzakRMdGtJbytlbDBtdHB5K0ZXL2V6WWZuTFRIb3ZIMTkxTGR2OGtIdm1FS2IyZ2hMUEVNYXRXYytHVGV1WVZGMUVtZDdNaG1vVDh2b3hjMWdtRkE4OTVVNmJFS0tzUjQ4ZXZ3eUZRbjNHangrLzVLT1BQdEljMXB0dWlWa3k3aGFQeDl0a1RLWFhLM01LZWxQWUcyTEJJTzVvTTQyTnliS1JOc2ZaWjUvZDZVZU9kNm9QZkdOajR4RkZMWjM3bVpva09IVG9VTCtDZ29MN2hSQ3psVkowTVlxSEp1YXVIWWFpTDB4a09adFlzR1l2NjNkVlEyWWU0eTRZd2Z5ckJ5VW1GUlFNNGRsN1hTeGFzWVUxZTZ2WlFBWm5EVHVMTzZhUFlXbzNvR0RncVhyMjNKbVptZlBlZSsrOTR0ZGZmLzAzbDE5K2VhVnR1Vm5XVzl5K1k3cWtRdUtMajh6Y0FqSmxDODNONllYTkZyZk8zRi9hYVFaTk9rWE56bjdhb3VhTXFhV3gxT3pXS00wMFRSRUlCTDZRbVpuNWdKcVoxb1hac0xSTjk4RnhwY2NBR0RmcmMzbm9veDAwZVNJd0RHUDF6cDA3Rnc4Yk5td0xFTFd5cGpxUVhBK29hWm9VUXBqV2RGNXA3VlNRenBIajlrVGU3dDI3VTFCUVFLOWV2WklES3p1enVIVUtpODNwZnFhSzJ1SGNUNnZmTStsK2hzUGh5N3hlNzRPb3liWmRtek12Z28wdmZINlBmUnJnY3JtbURCMDZ0S0N5c3ZMcGtwS1N0NnhFZ20yNUlZVEFtVlN3ZzI2dGxsc3lGc2ZoakovaHc0ZDNTcmYwcEF1Yk0xSGdGTFhHeHNhMEV6cFMzTStrcUVXajBSbHV0L3RCNEV5bERGMmMvSUdKS1J6SGU4SkhKNS9zOFRuRTNjYjI2ZE1udjY2dTdxbkN3c0svU1NtZFNRVWRSMUxCSVdEU2NsM2JxVms2Z1JOQ01IejQ4RTZYVURpcHd1WXM2WERHMUd4Uk81ejc2UlMxV0N4Mmg4dmxlb2lUMXZDbE9PNk11QnI4aDQ3ZlRMWWVBeEtQZVpvaGhCaFVVRkR3VUZOVFUwNzM3dDMveTJHNXRRbEYyZUlXajhmVGlsdEhvbVlmSTBhTTZGU2xJQ2ROMklMQllJZUpnalIxYXNLNTQ5TXBhcnF1ejlVMDdTRWdRNm5CS2NhNFdjZG5pbTZQQVREbSt0UDVUQloxNjladGZrdExTM1pPVHM3dm5XNnBVN1RTaVp1ZFhFZ1Z0RlJoMHpTTkVTTkdrSjJkM1NsK1llMWtQS216VGVvb3NwL0N1VUhLanFrOS9mVFRIbDNYZjZocDJrSWxhcWNvN2d6NDBoMEpGL0t6dUovalpwMXl0V3VmZ296czdPd0hRcUhRN1ZkZWVXVzJvMVBCQTdpdFRnV1hhWnJDTUF6aDZGSWdHbzBLKy9NWURBYngrLzAwTlRWUlgxL1BvVU9IcUt5c3BMeThuSTgvL3BoSUpOSXBmbG5Yd3c4L2ZFS2ZVTmQxL3YzdmY3Y1pQZVMwMUZKaWFzTGV5RzRuQ3FTVTR0MTMzODM1eWxlKzhpTk4wMzZnUHYybkFjVkRFN0d4VUpQVlMzcVVWdG81VjUvUUtSNVNTdngrZjZldThmSjRQT2RObXpZTmw4dTFkZDI2ZGZFT3BuZklOSWtEa2VxU09wcnMyeHhGUlVXNFhLN1RSOWlrbEd6WnNxV05xS1hiSkpVNmRzZ3BhanQyN09neGRPalFIMnFhOWwzMWlUK055T3dPSmFNU0l1ZkxTVGhLbmd5SVdUMk11Y1dRWFpnUXNpR1RvUFNDeE0rY1FMcUNzQUc0M2U2eDU1OS92aWd1THQ3K3Q3LzlUWGRtUmpzU042Y0FPdXZaVWdYTy9scGNYSHhTUng2ZDBCaGJSNzJmVHZlem81SU9LYVVvTHk4djZOKy8vNE5DaUx2VkovMDBKYmRYNGxBTmNwOEpuODkzKzIyMzNhWjV2ZDRsdDk5K2V5MjB4czRjVnBsaEdJYnRhYlZKS0RqamE4NDRtOHZsd3Q1YVAzejQ4Rk5mMk96SnR4Mk5IanBNOFczU1VsT2lwbEFjVjNHNzdhYWJiaUlhalQ0M1o4NmNCcWRsbGs3Y2NHUkxPeEsyVkhFN1daTjRUNGdyV2w1ZW50d21kZkRnd1E3SGVhY3I2YkJqYXBiN09VZGRqb3JPU2xkeFJWUGMwakVqUjQ2VVFvaC92L25tbTRabGpiVnpTMVBFcmwyOHpYa09uTzZweStVaVB6Ly8xTFBZOXUvZmY5UXh0WFIxYWs4Ly9iUm41TWlSRDJxYWRvLzY2Q2dVeDUrTWpJemJIM2pnZ2ZpbVRadWVYYjE2TmVrc045TTBEV2d0QmJIS1JlVGgzRkdYeTRYVnBuWEN0MTk5cnNKV1hWMmRYSkdYdW5qbGNERTFaNTNhN05tekg5UTA3ZnZxOGxNb1BqOHlNek8vdFdMRmlsaDJkdlp2YlVGemlKdkVXdEpzK2FiSm1Kc1FRanJkVU9kaHU2TzJ1SjNJdmFXZm03RFpHOXFkN21kSDQ3eFRZMm9weGJjUHFzdE9vZmo4eWNySytrNGdFSWprNXViK2tiWlpVcGxheEd0L1h5U1FIY1haYkt2TkZyY1QxVFQvdVFoYk9CeHVJMnIyNHBYbTV1YkR1cC9XS085a201VFZVYUJRS0U0UU9UazUzMmxzYkF6MTZORmpwV1cxU1ZKaWJKYTRPUzAySVlTUXRxZzVCYzYyMkd4aE8rZWNjOGpNek94NndpYWxaTWVPSGUxMkZLUmFhdFkyS2VjU1kreUZLOUZvZEliVis2azZDaFNLRTB0RzkrN2Q1MVJYVndlTGk0di9MaFA5VjIwKzMvWlhlMkNsWmEyMXNkeWNGcHZUSmZYNWZJd2NPZkp6cjNFNzdzTG1GTFhVN0tlOTk3T2p5YmVtYVlwd09IeVpOYVZETmJRckZDZUhvcUtpb3J2Mjd0M3JQK09NTS82Wllyblo4VGE3OUFPSG9BbE4wMlJIY1RaYjJESXlNajczTXBEakttd1ZGUlhzMmJPSHFxcXFwS1dXNm40NnVncElLZXZRQW9IQUY2eDVhbXIwa0VKeEVoRkNET3Jmdi8vdG16ZHZiaG85ZXZUSGx1V1duTnNtaEdoanRaR1NJVTJOczduZGJ0eHVOMTZ2RjYvWFMwWkdCZ01IRHV6OHdsWmRYWjBVdGVycTZxU28yZjJmRHZlelRhdVVjNXgzWm1ibUE2Z2hrUXBGcDBEVHRDK09HREZpOXNxVkt4K2RObTFhbFVQY3BHTjJHNlpwbW5hbU5KM1Zac2ZhbkJsU2UwTHY1NVVwUFM3Q0ZnZ0VrcE02cXF1cjJ6UzFPMk5xNmNvNnBKVGlsbHR1Y1ZrN0N0UTRiNFdpRStGeXVTNi80b29yYW9jT0hmclk5dTNielJSeHN6T24wdDRxYjR1Yk01bGdXMnoyVjYvWG0zUkpzN0t5UHBjNWJwOVoyS1NVN1ZxbG5KWmF1cWIyMUF6bzRzV0xmNkFXcnlnVW5ST3YxM3ZqdSsrK1c1T2JtL3Q3UzlETUZIR1RxWmxTVGRQYVdHN3BTajk4UGgrWm1abU1HalhxdUNjVFByT3c3ZHk1azMzNzlpWExPbzVtVFY1S0J2UWJxbFpOb2VqYzVPVGszRk5kWFgyb3VMajQ3NENaeGkxdEUzT3p5ajZTNG5hNFdGdFdWaFpEaGd6cFBNSldXVm5acmxhdGcxWXAwbVZBZzhIZ0JHdVpzZHI3cVZCMGJ0eEZSVVYzYk4yNjlkQ3dZY1BldDZ3ejIwcHJseW1OeCtPeW80TGRkTEcyN094c1NrcU8zMGIyVHkwb1RVMU5hV3ZWT2hBMWtiS2xYVHR3NEVBZm44OTNIMm9BalVMUkpSQkNsQTBlUFBpV0YxOTg4Y0FOTjl4d3dPR1NKaTI0bFBxMnBFdWFUdGljNHBhVmxVVk9UczV4R3lEZy9qVDdHdzNUWk0rL3QxSzVldy9WKzZ0b09GUkRjMzA5Z2FabVF2NEFrV0NJU0NoRU5CSkJqOFNFcnNlSTYzRmhHcWFRTWlGc1BUM2hlYUpwMzZYcWNsR2NuRStwQmk0UGFKN0V3RXB2dGpvblI0SEw1YnA0MnJScEZjQlR0TWJiVE5Ja0UxTEZ6WmxJY0xxa3prVEN5SkVqajh2MDNVOWxzWlh2L1lUS3FvTlUxOVRSME5CSXM5OVBTMHVRVUNoTU9CSWhFbzBTamNYUVk3clE0M0hpY1NNeE5saEtJU1ZhckhyMzdVS0l1OVJsb2pocFNCUGlVU0FLc1JZSU5VSkdMbVRrMmQ2VW9nTXlNakp1cnErdnJ5Z29LUGdyWUhTVVRCQkNTRHZlbG1xNU9kMVJwN0RsNU9Rd2VQRGdFeTlzQjZ0cjJGZFp4YUhxV3VvYkdtbHE5aE1JdEJBTWhRaUZJMFFpVWFMUkdIcE1KeUZxY1JJeE5TbWtsQ0pZdGUxQ2w4dDFuN284RkoxTDZBd0lONEVlaHB5ZUNZdE8wU0g1K2ZsM2JOMjZ0Y0tLdDVrcGg1UlN5b1MyQ2VMeGVESTdHbzFHNlVqY01qTXprK1Vmdlh2M1BuSENGZ3FGK1dSL0pRY1AxVkJiWDA5alV6TW9NaklCQUFBZ0FFbEVRVlQrUUFzdFNWR0xFSTNGaU9reDlIaGM2UEU0aHRFNmdtajdodi90N3ZQNTVnSjkxS1doNkpURW8rQS9tQkEzbCtkemY3cDE2OVoxbWwvOW9vc3VPcGE3OXdadUF2YVNpTEcxRVRaQVdpVmRwbUVZeE9OeEdZdkZSRFFhbGZhMnE1YVdsdVMycStycWFxcXFxcWlvcUdEbnpwMlVsWldSa2ZIcFc4V1BTZGoyN3R0UDFjRnFhdXRzVVF2UUVuUllhckVZc1ppT3JzZUZyc2N4REJORFdpNG9pTEl6Qm54ZndHVDE2VkYwYXN3NGhPb1R1eFZPQUdWbmZyYSt5ZkpkMndIdzlmM2lwMzZNYU5XN0FGU2QrZVN4L05nbFlUTzJiVkQ1OTM5TFlxdThnWjFJQUNrUVVrZ3BNRTFKWEVMVWdHQmNhQ0ltTldKb0lvSkxoSENKSUc2WEg3ZXJDWStuRG8vM0VBY1haWEhHR1dkdzVtMGZmYXJmNTZqdDdmMVZCNmlzT2toTmJSMzFqVTAwK3dNRVdvS0V3bUVpNFVSY0xSYUxFZE4xZEQxTzNEQXdERk5JTXhGWGl4emNPVTNUdEhucVU2UG9NcGJiMGE3Nk80M0oxTHpmZW5mZ2p5ZVFtTVRqQTd5V3dlU1NTSmNFVFNLRmlSUUdramdtT2dZeDRrUmxuSWpVQ2Nzb1FUTkt3QXpUYUFTcGkvdXByYTJscHFibVU3K3VveEsyUUVzTCt5c1BjS2ltbHZyNlJwcWIvUVJhV2hMSkFxZW9XZFphc2w3TnlvQlc3M2l2bjhmai9wNjZEQlJkaW5CeklzbWdPTHhQNnVrKzY5bWlXYjA3RURkTmdtWTZ4RTJYcGtpS0d6b1JxUk9TVVZyTUNINGpUR004bUhSUFc0eFB0NEQ1cUZ6UlQvWlZjYUM2aHJyNkJocWJFM0cxWURCTXlKRUJqU1dTQmJhb1lab1NLYVdRU0swZ3Y4ZDNnUytvUytBVTh0YWFZd1NlMjBIa1g5VVlWYUV1OFpwZGZiUEpPSzhudWQ4Y2d0Yk5leFEvSVJON1MzMjVKKzAxZi9MWEozbUdhL241MWIxUDl0bkQ5L09iS0xpaWpzWXhMeE9PdGQ0aUVLTXZ6UnZ4ZFdyNXRlMlNTakNFTTVrQTBrUktBeE1CYU5JUUxpR2tTMnE0aFlaYnV2Q1lVYnpDamM5d296VTNrNW1aU2FVZVlhanIyRVB5UjdUWTlsY2RwT3JnSVdycjZtbXdrZ1dKREtpenNWMXY2NEphR2RDRUM3cHJ1aXJ0T1BYd1AvRXh3UlY3dTR5b0FSaFZRWUlyOXVKLzR1T2oveUU5ck43c284Q25lVzUrYitCUEpqZ3NOaS9nQWR3U3FRR2FCR0ZDV3BjMEtuWENVcmRjMGdoK3Y1K21waVlPNlUwYzBCdVByOFVXRElhb1BIQ1E2dG82R2hxYWt2VnF3WkF0YWpHaWxxakY0M0VSTjZ3c3FPV0NWbjY4dnBmSDQvNk9ldHRQUFNML3F1bXlyejI2cWY3bzd4eVBkc25mc2ZvZmovRFMzbUlLM0g1YUdnTzRoMDFrY0dBTGU1cjhOSWVMR2YrTm16aTM2UGhtZlh0NXV0MEVmSnpPYXBOSUNVS2FTRk1BQmxMR3BTazBZVWczY2FKb3VIRVJsaTY4cGhzUkROTGMzRXl0SGlWSHk2QzdLNHNzelhkOExMWkV2VnBOc2w3TkZyVkVFVzRzVVlTYkdCaHB1YUFtcGpSdEYxUVVGeFhkQzR4Uk1uQnFJUU02WmtPMHk3NStvemFNR2RDUDhwZnR1akcyZU9HWCtPcnM3M0xydHk4blkrTmE2cys5Z3h2dWVKQ1pZLzI4dmE3aXVEK2ZRSXdDcGx0V213L3dTaXZXWm1tTklHRzFZVnR0Y1dtSUdBWXhhUkNWT2hFWkl5U2poRUloV2xwYWFJd0hxWTM3cVlvMUhCOVg5RkIxTFFjT1ZWTmIxNUFvN1docG9TVVlJaHdKRTdXS2NHTkphODJ3dXd2c0xLZ0lIZGd4V2RPRXN0Wk9RVVN1cDJ2L0FvWkU2K3Evd3hIeGtKMmJtMWdha3BsUGRrNHgvZnNsZnVlYzNFemlrYy9OeGY3bUgvLzR4M1BUdUtSMmxsU2taa25qR09qRWlVa3JVMnJxUkNJUlFxRVFUVWFJK25pQVEzb3pOYnIvc3dtYkhvOWJMbWc5RFZacHh5ZnZyT0t2ZjkvQTN1WW9rVmcwVVlTcjY4U2pBZEhVN0Nlc3QzWVh6SnB4amN2bjlkNmI3ckUzLy9SNlNzKzdseGNQcE54UTl6SXp6cHZHUSsrbGNSMys3eWVNdldrWjVVcFRUaU95eVBqMUxmVForVFd5Q3gwWDdJVHp5Rjk5QzcxMzNrM3ZkNjZueHpmN3Q3bUlqM1M3NHZPblQ1OCtNd2VJN2hrT3E4MWpoYjAwYWNYYVpFTFlFdUxXSmtzYUowSkMyTUxoY0tJRUpCNmlMaDdnb041SVhCcWZYdGlTcFIwTmpUVDUvYlFFZzBSMEEwdy9GZVhWaEdLNm5RVWxiaVJNZGRsYWlLczk5L2pQN3dhKzNPR3p4ajVrMGE5ZXAvYW9YbUlMYTFaOVFNblVTeWhUMTh6cFl4Vk9ta0MzUzFNYTAwdkhrUC8wQ0Z3Yi8wbjlWWCtrN3BkMXVPKytuTzVmeXpxNjJ4VW5CRTNUSnE0KzR3ZFRIVmFicDFYY3BJdWt1TFc2cERwRzRwQnhZbEluR28wU2lVUUlHaEg4Um9qR2VJdmxralorT21GcjlnYzRjS2c2VWRyUjFKem9BdzJHaU1STnBBRFpjcENxeG9qZEJ5cmloa3k0MTFJS3BCUU41UjhNZHJsY2N3NzdyRG5aOE1aL3N1aWZMVWQraFhWdjg5SjdnNWg1VVM5MXhad3U1UFluNzRFQkdLOVZZanBDZWU1SlorS3AzVW56STl1SmJXOUUvKzgzYWRuZ3dqZXA3MUhkcmpoeGRITmwzZlRINHR2N09jV050clZ0d2xuYjVyVGFZc1NKeFdKRW8xRkNNa2FMR2FIWkNGRWZiNkU2M2tUQUNCKzdzRlVkU0hRWE5EUTJPVnFtd3NUaUpyaTdrWjhoQ2RmWEVkVGoxdURJNUtRU0laRmFYcDc0MXVabFB5bVpObmt5cFdNbU0vYWFlU3o2Wjl2QW4zZmdWZHd6R1Y3NjZYTnNQa0lNdXZhTnY3UDVDNWN6dWZCdzRyZVB6VnYyNFZmWFV5Y1RxQjU0Si9URjdTd0RHM3NSUmUvZFFON1lqa2JUdVBEY1BZSE11azAwLzNmYlVwTDQwdi9pME9WdkVZdWwvSWpQZFZTM2QwVUdYRDNuVTlXd0ZWODJqMXN2c3djM25zbVZjKy9tSEd0UHNmdWNPL251Tjg0NXhrYzBpUDdnZVE2TWFGdkRkaGo2bnA4eitHcFNFd2xDdUt4RFF4TkpxODFJSkJLSVc0a0VYZGVKeFdLRVpZeVFHU1ZnUkdpS0I2azdveS9oMzF4RXo5ZHZTaDVGLzNGbXUza3NiY285cW12ck9GUlRTNTA5dGNOcW1RcEhvc1RpRWt4QlpsRTNYQWVhOERlN1JKYTN0UThVaVFnZjJINUozYXI1ZDh4Nk5zWU5QMXZDczROaDYvS2ZNK2YreHpocjFVS21KaS93ZkNaLzc5dHN1T2JuUFBUY1ZieDZkMGV6SmcveHlpdjdHRDlyTEhuMnR3Njh6WUtmTG1OenJEL1gzUDF0SmdlZVk4N1NGc3A2dDdENXFWRTgrdFJNaHZtVXBweHd2SVZrL2VKaXNrdmp4RmYraytZTlJYVDd5Wm13SjRycmdiRkV2dk15TGRzTnFOcEg1TlVvK3A0T1lpVkR4OUo5R29SdS9RQzlhRkpLQ01OQU9nVFFOV0VjT2VPaVJPN2JkM1MzbnlZYzJGZkJDOC8reHhIdk4rbUtyL0hGOHk4NnFzZjBYVFNRZ3VlbUFoQmF1WTJtSDZ3OThzOW9ucHZlNlBmQU94ZnQvK2ttSUc0ZGlYNVNwQW5DTkVHQXhBQnBJSVdPSVYzRUVaYXdSV1Nja0JuREp5SmtHbDZhbTNiUXdCZW85NFNURzY1aWRhT1E3T3BZMkE0Y1RHUkJtNXFhQ2JRa0NuSERZYXNJMTVCSWFhRExESEo5UWpSR3drUTBqOUJNS1VpOE9NM3I5ZDZWZDk2M1diazhuN0krT1FCTW5IRTV3NVl0NDRNS21EckM4V1NGbHpELzdwZVo5S3ZIZVA2YXA3a2xYU0g0M3RkNTZlQW81cDJmay96VytxWEw0UGJIV2RsN0s0c2V1SXNadWRONTlybXJLQVBXLy9SZVh0bzVrMkVqbE02YzhMakt0UFBKcW4yVDJ2dGlaUHppTW9xdTkrUC8xbjhUM2dQaWExZFJjRVVQV3JiWFFkVWVBai9hMDhHajlDRDdKeU1Rci82ZHdJY0dUT3JBb252Z2VncG41Q044Y2VJci8wSHozMExIY1B1cFQ1LytBN24va1NlTzYyTkczNmpnd09Dbmp2bm5TbjA5cndIK0RlaUFMcVdNQzd2T1RhS1I2RXJBQk9LWVVwTkN4SVVoUlR5ZXNOcGtuQWh1UW1iQ0pXMm9yR0hIZFM4UXp5aG1lR2EvSTd1aSs2dGFYZEJtZjhJRlRmU0JKa1lSNllZRWFSQ1B4OEhud3lVa2hoN0hxdkxSN3YvYnJ1dUZFRmY2Q25Pby9jZGpUTHZ5U29hZU41blN5LzZERGJFWTZUek9rdW5mNXA2QnUzbmlwMytuTXMzdFcxZjlIZjlGVnpIZVlZSDV2RkM1WXg5YmQrNm1QT29sTDdDUHlnQkFDLzVBNG5iRmlVZjY0NGlpSG5oSEZlUHJDMmJNaDZjdzhXWm9lUzVrNE1qWkxOZjFFOGp0K3duK1grNXpXRjd0WFNMOXViOVJlKzFmYVBqaEx1U2tTZlM0cWNjeDNLNDRrYmlFZHRtbWdUKzV3T0dTZWxwcjI1SWRDWmhPbDVURTlGMWQxNU5kQ1JFWlMzUWxHR0dhakNCMWV1Q3dIUWx1Z0ppdWM2aTZwdFVGRGJaT3c3WHIxZUptUXRpTWVGekVEWUhISllRUk40VmhDbTFvWHFGTGM3bnZCQ2hmOWhDelh1ckZ3bC85bnFsRDh2RUYvczZNeWM5MThQU0R1T1dCcTNocDFuTXNlbU42cXF5eDdCOHhKdjlzRkU3UGN2VGRQK0RLNTVieHU0cEIzUHlySll5dWY1bTUzNzZMeGJRUUhUaUxKNGVvaStta0NOdmYzc0JmZEQ3Wk0rTEVubnFWNW0wOXlQdVBhUlRsdVlCcUFuY2RJWnZsTFNiN213UFFpcURIUDB1dHYySnVCTkR0Lys0a2ErbC9VZnVyT2l1bTJraThEdUxiNnpEUDZrdkJ0S0c0WC9nWDhXVE05UWkzSzA0b1BUM2RyaDJoOWY3WEZ2T2dibGx1VHBkVWdwQVNhVnJpSnVQU0ZDSWVseTZYQ3gwelVRSWlkY0ptakJZalFyTVdwc0Zvb1VadnBzaWRoMGU0MGd2YkFhc1h0TEdweVdwd1Q4eFlpOW9ON3JwTzNBQ2thWThqd2hRdU5CRVhwcFRDazkvdm04QTRhR0h6UDNlVE4rYWJUQitTbjNpR1FBdUh5dy80UnN4aS9wV3ZjL05UeThpTmVaTWxIZEgzWG1hTjd4S1dwcnFWdnY1TXZmc0hURTI2dEZmeDVBdFhFWTJDVDhYV1RpSWhvaStzSmZxQy9mOEEvaHYzZ2RjRnNhT29QWXJWMFRKN09TR254VDNxZkFwL2trWHcxcldFOS9qeFBuQTkzVXUzMFREN3c2Ukl5U2lKbkJzdXZBOWNlNWpiRlNjdFRJSDQ0cklCZDA4ZXNmZUJWVW1YRkd5WDFHcTVRaVJNcDBUNWg1WVlUb2t1VFhSY1JORUp5eGcrMDBPTEViRUtkMXM0cERmUnoxdlEvam5Ea1FpSGFscG5yTFVFZzRuQmtkRldhMDNYZGVKU0lqR0ZFVTh1T2haQ0NIRk5XZSs4RmlHK21YaTRITW9HNWxQM3IyVTgvOC9kYkgzdjd6eDAvMUkraUVHMFEzWExZZUxkMytaU2dnUmFyM0xXdmJTUm9pc3ZaOWhSbmp3bGFwMlVWRkhyVzBydXo4L0RWOWpleFRUMzFCSGY3ampxb2hDTkpyNWZGMFBmV0ljWU40YThiNWJpTHUyQlo5Slk4cTdJSXY3V25rVDErbUZ2VjV4TWVyaXpyNzA3NTh1NXBEVElKMXhScWFWMkpCaUdJUXpEd0ZrQ2ttaVVqeEUwSXdTczhVYTF1cCtJMmI0OVRtdFhzNVpjbmRjcWFyb2V4N0NHajVpbWFTMW1RVWlFZUd6dTJObGVXdlZuOU8wLzVLRVJoM2ppZTdjeDdZRVYrQytieGN6aE9VVHJEMU96Vm5nSjgrOGUyZnFITmZBMkwvMnpGOWRjMWw5ZEVhY2FmZnVUT2FrVVg5OWpMOEdRYS8rUCtoL3VRWHh0RWtWLy93YUZQeTVGdnJxV3hsOVdIOVh0aXBPSFFBeTlzK2VsbDlLMmFMZE5INmxkdEdzbWhBM0RTSlIvNk5MdUpVMklXOGgyU1kwUTlVWUwxWHBUKytmNzV6OWVZbGQ1UmJzRkxmNFd5eVZ0M1R3bG90SEVMb080WVFocFNtM3Jodi9OSDF4MnhqdHduSnNDRHJ6TjgvL01ZZXIwVVJTcGE2SlRjbURjeTEzNjlmZlpjTlV4bUJzRGp1cHVobUZRV1ZuSmdBRURqdnFodS9ET2d3NTU0NDAzMHY5aGtuTFBILzd3aHp1ZWYvNzVPaUFJaElDd0VDSm11YWlHRU1LMHRsbEphOUdMdExkWTJjdGVjbkp5Nk5hdEcvbjUrUlFYRjFOU1VzS2dRWVBhN0VodzE5VzNyMW16VnVjbHJEVnIwMVE4Ym1CWTFwcVVDWFV0R3pqZ2x1TXVhZ0I5THVDVzZVbzhGS2MrRXlkTzdEU3ZwWFV0Nk9kRzZhaFJveVk5Ly96eksrMVlteEJDeHlyL0VFS1lRb2prbWo3bjNsRjdXM3hPVGc1NWVYbms1K2RUVkZSRTc5Njk2ZCsvUDRNR0RhS3NyRldLTkhzcFN6RG9xRm16ZHhmWW9tYjV1NlpwQ3ROcW5kcjBmNnR5WFM3dEZuVnBLaFNLbzZWYnQyN1h6SjA3TnpmcGprcnBzZHpScEV1YVdOZHBDbXU3bGJCTFB4THJCeEt0VnZhbUs3L2ZUMk5qSXpVMU5ZUkNyZldLbWoxbkxSUU90NDc1dHVKcXVwNFV0bmJXMm9oaFEyWUJnOVJiZFhyaTZwVjFlcngyemFYZTdPT0lFS0xzdnZ2dXU1ajJTUVNYbEZKTFRONld3alJOTEdGTDFyVFo0bVkzeU5zejIrd1Zmb2NPSFdwOTJ4SWRCZ2tYTkdLTitVNjRvRHB4bzYyMUppMXI3Y2F2WCsxeXVWdzNxYmZwOU1VM3BxRHJ2dll2RkI2RENxcGFrZU5OZm43K1YwdExTNzFwckRiTnR0b3NjV3RudGRuaVpvODFDZ2FEQkFJQkdoc2JxYTJ0SlJKSkxIL1JuTmFhTXd0cUQ0ODBEQVBUTUszbExBbHJiY21UaTI0RVZPUFNhVXplUFdlVGRYVi9YSDJ6dTQ2bDFqZUw3T2xua0RkbjJOSC9rQ2RUdmRuSDMybzcrKzIzMzU1d05GYmI0U3czcDlYVzNOemN4bXB6Si9ZWFJOUEcxaEsxSkNhR1phMVpGcHZtZHJ0dlZHL1A2WTNXelV2MyswZWQ0cDlBRGJ3NTZzMytIQ2d1THI0Q2VOTVN0cGlVMGkyRWNKTklKR2d5Z2JES1BxUmhHQ0llajh2VVdGc2tFbWxqdGRYVjFWRlNVb0xiS3VXd2Q0SW1sVEZ1MVpFWXBvRXBKVkpLSklqUXdSMVRnQXZVVzZNNDVjbnNCa0o4L3M5akduQm9LN1RVbkRaYnNUUTRiK2VyaTBjTnZ1S09qWmJGNWtGS0hZRkxTZ3dTaGhTbU5ER2tnU0YxNG1hVXVCRW1IZytpeHdQRVlrMUVvZzJFSXpXMGhBL1FIUHlFK3BiZEhQTC9PeUZzeVdMY3VHMnRHUmkyRzJwS3BKbFl6Z0pTZUQyZUdlcUtWNXp5dUgzZ3kvdjhueWZVQ0pXYlFRK2RkcWQ0WU4vaVNjQUhTYXNOUEVJU1IwZ1hDRk1paFpSZ1Npa053OFF3VE9LR2lXNFk2THBCVEk4VDFYWENrU2pCY0pSQU1FeFRvSVc2eG1hMGFDVGhndXB4dlcwVzFISkRyYVFCVWlLYTltNFpJWVM0VmwzMWlsUGJuSEJCVHM4VDgxd3ROYWVscUFGNDNPNnIvdmUzQy9zbExiWkVuQzFsTndLWVVnb2pFV3NUY1NNUis5ZU5PSG84VGl5bUU0MVo0aFlLMHh3STBkQVVRSE9XZHlRTGNXMFgxRFFUYm1qQ1d0T3lzN091VTFlOTRwUzMxUEo2SitKcko0TG1BNmYxNlI0N1lzaUZwR3l6UWxvWlVva21wUlNtbEppbXhMQVRDYmE0eFExaThUalJtRTRrR2lNWWlSSUlobWdNQk5HU1RlNU9VVXRhYTNiQ0FMSHFUNy9MMERSTkNadmkxRVM0d0pzTnViMFMvejVSbk9hYjVuT3lNcTZZT1dWQ2htMjFTVnZjRXJQYUJJbVpSaUpodFVrTXd4UUpsOVNhL3FISGllbHhJcGJWMWhLTzRBOEUwZXdzcUc2NW9IYlNJR210V1NVZWt5NjY0RnFnbi9vRUtFNE5JZE1TMXBrM0I3SUxvWHNKYmZiOG5TaTY4RUxtNDBUSm8zTnZIWmZHSFhWSjBLUzBoWTJrMVJZM1RPSnhFOTIyMnZSV3F5MFVqaElJaFhIcnVJbmp4c0JGWEFvTUtZUWhCWVlsYUpacWF1N0MwdWtuSkVPa1VDaE9LM29XZEw4RWVOdGh0Ym1GeElXUVd1SXZrSlJTSWd3cE1Vd3BEZE1RY2NPUXR1V214MU9zdGxBRXJkVU5qU2RIaFNSYXA2UjlpTWJHeHVGQ2lNdlVXNkJRZEQyaWIvNkdvWGU4ek5aTyt2cmNMdGNsYTVjc1NFMGl1Q3lyTFRuT1NKclNLdGcxTGN1dE5kWm1KeElTVmxzRWQ3SnV6UkkyTTlrVG1oQTFRT1RrNUh4TlhSNEt4UW1rOGpXdXVQTVZ0clYrL01udE9aREowNmN4ZjBvSmh5MUVhZHpGaS8vclovejBNU2R3eWZndUhycnhLWmFsamtiem5NdmlsYk9ZZklTZi91THd3ZU9BVDFLc05oMkJoaVJSK2lHUXBta2xFcXpTRHp0ODFqYldGbXNWdHRha2dUWEZ3elJ0TjFSb21uYTF1dElVaWhPTVp4QUxmanVIRzNvQTZGUnVXczJjUjU5aWJ2YVBlUGJDd3pUeU4yN2pkOHVxeUx0OERHVW50SEhDemFVUFBzYXo0NC85SjNPek15Y0IvMDNiT0pzYlpOeXFraGFtRldzelRGTWFpVDVTbVlpM0dlaEdhNnd0SEkyaHBicWc5b0hWaUJvTUJpOEJocW1yVEtFNHFTcEh5WmdwM0R4RVovT1dHaXIvNTFkdDNjdnFONWcyN1JmODhyK2VZZXdEYjdCSDM4WGMyUTh6ZDVOMXUxN05TNC8vaWduVDVqRDArb1hNV1Z1ZDNFVVNyZHpFUS9jL3pNaHAzMlhvamIvZzloVzdxTFZ1Vy8vNGc0ejkwWitaZS84dm1IVGpmWXk4NHhtZTMzNk1kWGV4U3A2WjgxMnVXRnFaZU03R1RkeCsvWVBjL3FhMTRyejZJeFkrOE1qUVFmMzZEYlVFcmRVZGxiaE1LVFhEbENKdW1DSnFtQmlteE5RakhLenpVeCt6eXovQzdQN3czN3k1UDhUdURXK2gyYUtXTHI0R0NKL1BkNVc2cUJTS2s0MU83ZlozV0xiRHc3QWgrWlJjT0k3Uk5SK3h5bHJSV3Z2K1Iyd3RPWmV2WFhzbkczOTZFYVdlTTNsMHljTThPc2I2OFpvcWFvZC9nMWRYL29xMXM0dFp2K1JsMXJRQXNRb1dMZndMVzRmY3dOcVZqL0hoenliaFc3MkVPYXZyazg5Y1Z4bm0wbnZ2WSswZkZySjBURDJMWG5nL0tYeEhoYmVFVys2OUNQNytaMTZzOUxQdU55dlpQUHdxRmw2WUI3RUtGdnpvUlRZUHVZN1gvL3I0ZWM0NG03UXlvNENtQ1NGY0FqQk5Jb2JFTUVGQ011YVdHSzBHcG1IUzgreHpFNjZvdy8zRWJuYTNEazBJY2FXNnFCU0trNkZsdTVuLy8rWXdQeGxqNjh2RTZiT1pQeWtQT0lkcmhxeGs4WnVWekN2Tlo5MzZLc291dks3am1GcmZjN2xqVWpGNVFONlljeWg3K2cxcWd4RGQ4VFlyZ2lONGR1YVppVEg4SldPWVAvMGRKcXgrbi9JcGx3SlFPT0pMVEM1T1dJMmpSNVRBK21vcUljM1kvaml2UFRLSFVzZDNMcnpuNXl5ZGxJV3ZkQXFQWHI2TkdRdWZKQzlZd3J3bngxRUVSTGU4d1lyZ0NKNmNlU2I5dkZ3Q0xFMjEyb1JJZENJZ2hLbUJRRXJNaFBVbFRNT1VpVGliaGlIQnRGeFNkNnExWnJ1aGdBaUh3MU9BdnVvS1V5aE9kb3d0bFR3bWZ2bE1Gcnk4amZMcCtieTJJNThyYnlzK1dxODI0WUxxRUcwTUVDMCtpeExIMkxtaW52bjRHcXM3dE1wOG55ckc1bUhZVnk5aTlNc3ZVdjdsNjVodS9VN1JSaitCcGdwdXYvNTlnRDREQnZRZjhja24rOTVyRzJkREJ3UVNJWVFRbWtDYTFoUnowelN0amdRd3BVd0ttNVlxYXBhbEJpQzhYdThVZFhVcEZKMlRvdkZqR1YzelBzdit2b1hOSmVPWVduTHNqK0hya1ltdnVwcktXT3YzYW1zYWlQWW9QczZMbEVLc1g3YWF6U1VEOEwyMW1oZXR4V0crbkR4eWUzNko1U3NmWS92S3g5aSs4aisrbUdxeFNkbmFpV0JLaVNHbE1HV3FLMm9tRnBTYWlkSVB6UkkwZTZpYnNNczhMRGRVQ1p0QzBWbkpPWXRyaGpmdzRyS1BLSmt3Z3FTdWVUUHhFYUt5NmNoQmZ0K0lpNWp1Zlo5Rnl5cW9CYUxWbTFpd29vclJVODQ5cnFVaTBTMnZNUGV0Zk9ZOU9JZEh2K3huMGVOdlV3bjRobzlsTWh0WnRLSUNQNUNoTjE2VVlxMGxWL1JKcEdaYW9tYUNFRWlpRVYzb1JweHd3RTlkSEtTWnFHdHpweVlOYkRjMEZBcGRyTnhRaGFJems4WEVTWVB3YmZCejVYakhxUGFTYzdqNTNIZDQ2TTRmcyszQmhUeDZ1SWZ3RG1UZWo3L09nbDh2WmRJMFA5SHNmQ1orZFRaUFR2azBvOS9ieDlqZ0xCYTlNSWtQZnIyQm9objNjVU94QjJaTVkvSTlMekIzOVZrc256S01oVCtleG9KZkwyWENNajlSYjE2ZnkyWitlOGcvbHYzbmh5VDdSbkZKbVJnWmpoQkNBeUdsa0Y2WElLcEhPVmdmdytWeTQ5TWtwbFgrSVhyMjdFazBHaFd4V0l4NFBDNU0wOVNrbEM1ZDEzK21hZHAzMU1XalVCd2RuMmF2S0IrditteVcwS1kvTW1sNUNjdC9lUkVscDhoNURJWWlTM0xHWHZzaTBBSUVnS0NBTUlLb1FPaENZR2hDbUc2WEpyMGVGejZ2UjJiNnZHVDZmR1JsK3NqT3pFQkx6WWFTcUYvVE5FMmJwQzVWaGFMekVtMnM0UGtWMnlqNThybW5qS2dCWkdYNnprdm5pbUxOYWNOdXM1SlNKRG9SVEd1RmdaSHNSTkJTaW5LUlVvcUdob1pocUdVdENrWG5aYy9MWEhIck03elU0eW9XVHNrN3BYNDFJY1RacTUvNVVlOE94RTFJaVVDQ0thMU1xTE9IMURyY3FRM3ZKSHBETDFKWGprTFJpU205aXJVclQ5M2ErVEZubnprTTJHOExtd1NYa0dnSTIyS1RRb0tVZHUrb2RkaGJyWkpaVVZwSEZBbVh5M1dodW5JVUNzWEpvbnRlemlqTFNrdE8ra2djc2xXcnBOMC9LcE9WSFlaMWFLa1cyL2UrOXoyWEVHS2lPclVLaGVKazRYRzd6aHQ1WnIrVWh2aGtuSzExbEJHV0t5cmJ1cU5haWh2S3d3OC9mQUhRVFoxYWhVSnhFdW4yL0NQZkxYVmFiVExSRkovWUZpL0JtcTZMdEVRdE9kTElhYkZaQ0ovUGQ1NDZwd3FGNG1SVFd0SnJTSHRYRkszVkhVMFlaYVoxR0xJMUVhbzV5enhJekY0N1g1MVNoVUp4c3NuSnpqekhZYkcxS2Z1dzlVcGFXVkpwN1Q4MlpHS3NrV1piYTFKS2NlMjExN3FFRU1waVV5Z1VKeDIzeS9XRkFiM3lYU2tXbThzU05FMUtCRmh4dGpidWFHdU1UUUJpeVpJbFh3UnkxQ2xWS0JTZHdXaGI5dWg5L1oyaUpxMTlvemhXOHlYaWJNNmFOb2ZGQnBDUmtmRUZkUzRWQ2tWbjRjd0JmZHNrRUdnYlp5TTF6aWFsaVNuTlZ1VWpVYjgyUnAxS2hVTFJXZWlXbXpXRWRzbUR0bkUySEhFMjAweTBXYmtkWTRxRUVPSmNkU29WQ2tWbndlTjJENmQ5akMzWkw0cXpuaTNwanJaYWJPemF0YXNuTUZpZFNvVkMwVmtRUWd6NjVmZG01WFFrYmlSVUxWblBacnVsZG94TjlPblRSelc5S3hTS1RzZWw1NS9ieHhJeWErQWtHaEpoVDlXVldKVWRWaGVDbEk3c2dzZmpVY0ttVUNnNkhYMkxDL283ckxSMnRXeFlJNHhhdXhBU3dvYVVVcmhjcnJQVktWUW9GSjJObkt6TU14eWkxa2JZckRoYndpT1ZDTXNWRlpyZEl5cUVVTUttVUNnNkhSNlBlMUNLcUxrY0ZodXQ0cFpJSU5pdUtOWWR6bEtuVUtGUWREWTBJWVk0ckxUMkpSOXBFZ2dhSUdwcWFnWnp1SFdCQ29WQ2NTU3FOekYzem9NTW5Yb2ZjOWJyeC9PUmZTc2Z2Ny9RS1dqU21zZEdzdVREVGlBNExMYWNuSnhCNmwxUktFNVgvTHg0L3k5WVZBbFV2OEcwNzc5QjVURS9oczZhRi83Q3VwNVhzZmFsWC9Ea2VFL2JtN2UveElRYmw3SW05dWxlNGREU2ZrV2tMZEsxT3hBU2dxYnJCdUc0WmJHNTNlNHk5ZVlxRktjcExidDRzM0VnRjVaQTdaWnRSSWNQK2hUTFljTFVOdXFVakJqVVpxdDhrdEtMZUhMZUZNWjdQOTFMTE95UlY1ekdIUlZ0RHlrTTB4UzZBVzRwcGRBMHJWUzl1d3JGNmNaVzV0NzZJdXVDWWVwaUhqYmYrQkhSWUlDb3Q1SUpOZGV4ZHQ0NWJlTlRzVXBlZlByUExGNWZSUzJaRER0M0NndnZ1b0JoT1pVODgvMW5lR0pIbk5pT1JZeGRQWlpuRjEvRGFPZlA3bGpMN1kvb1BQcW5iekQremQ4d2NobmNVQnBtM1k1cWFtT1pUTHpwTmg2ZFZJeXY4VzFtM1BvT2VSZG1Vcm05Z2RvbUtQdnlOQmJjT0tSUFcwc3RHVjhUSmxKb2dHN2F4bU0wNFlvS0lRYXFOMW1oT04wWXhxTy9mWVNWTS9veWF1WjMyZmlIT2R4Uk1vajV6enpDVzZtaVJvZzFqei9ERTQxamVIYkpZMnhmY2lmWEJGY3o2L0ZOMUZMQ25iKzhqL25EM1l5NmFSNGJVMFV0SFRVTk1HVVdhMy83Q0cvZE81RDFTMTVtVFV1cmE4endHMWk1K0dFMlBqT05vdlV2OHBNM1E3MHR5Nnk5dUFGU0NPRjJpY1FkM043RURVS0lBZXBOVmloT1IzUzI3Z2hRZGtZeHRGVHlRYXd2dzNxa2MxZTNzR3g5SnROdnVvaGhPVUJPQ1RmY05vNjg5OTloWGVPbmVOcWVaM0hOaU1UYXdMelNNeW1MTlZBYnRHOHM1c0l4QlFsaDdYRU9kMHpJWmVNN08wbzZFRFY3c1Fza0J4VkozTllOU3RnVWl0T015dFhQTUdOWkpmNm1NR3g1a0hXRXFRdDYySHhyQlRjLytEM3VkQWFvbXZ6VVVrQnBUNmM0OWFXRWo5alRDUFQ0REMvRXlqTkVkU0JOREs2b09BLytIZW1YWXJFSkNacEltYVpyeTV1MmE5ZXVZaUJEdmMwS3hlbEZ5WlE3ZWV1WmFZenYreVdXL3VFUlhwMTVKbWRkZFRjYmY1c2lhZ0RkOHlpaW5qMDFiZDNKV3ZJbzdmSDV2czdLeWdiSXpzMzQyYnhiY2pxMDJGTFFDZ29LZXF1M1dLRTRUYW1wb0prdkJxQUFBQ0FBU1VSQlZMeTRoREtnZkU4OUphWEY2ZStYTTRLWjQ4T3NlT0Z0dHJZQUxaVzh1UFFOYXMvOUVoT1B1N0JWc2VwL0svQUQwY3EzZWVMTk1PTW5uTWtYQjUrUjV4Q3kxbnEyRktScDR2YjVmTVhxM1ZVb1RrLzhsUTFRTW9ZOC9KUlhlaWliNHVuZ25sbE12dmRPYXAvK003Tm1yOFFmeTZScy9CU2V2V3NNUmNmOVZlV1NWN21hYWRmdm9qS1d4K2dwTi9Eb3BEeWFkL2ZJNjhCYWExMUdKUkNHYVVnUmpVYnY5SHE5VDZ1M1dLSDRiQmlHUVdWbEpRTUdIRVBJK3VOVjZzUTVhWHliR2JlK3o1Vy9uY01OS1paZ1pYWGRnbjVmdnZrZElHQWZBa0lJSWdJUkV3SkRFOEowYVpwMGE1cFdwTTZtUXFIbzdHUmwrUEljYm1nYlM4MDU1UU1rbXFacEJlcVVLUlNLem83WDQyNFhZeU5kakExd0N5SHkxU2xUS0JTZGdoNFhzSHpsQldsdmNydmJDRnY3UXlKc21kUDRiQlVvQ29WQ2NVSndhVm82VjVRMlZwdFZxS3NCZWVxVUtSU0t6bzZtaVJ6U3hkWmtHM0VURXRDRUVFcllGQXBGcDBlSTlzS1dhcm5aWFZVYWtLMU9tVUtoNlBUQ2x0QXFwL3VacHV0QUpvVXRTNTB5aFVMUkJTeTJ6QlJSYzJpZWJDTndHcENwVHBsQ29lZ0NaQnpHRFcxanRXbWs3YWRYS0JTS1RvZTN2WGVhVHRaUXdxWlFLSTZHRUp0WFBNT0U2Ny9MME8rL1J2bkpFN1oyQ1lOMkFpZGI1NGNyRklwVGxTMS9adExDajRpaXMyN1JRdVp1K2hRYnBDcmY0YUZsZmlZL3ZKRHR2N3lVNDdja3BaNTEvL01HYTZxUDZzNnV3MWhzMWtaNE1HbHRTMUFvRktjb1d6ZFZVRFJtSUQ2cWVHMVBNUmNPOFJ6N2d6UTJVSnZkbHd1SEh1OWNZd092clZqTmEwZTNGa3ZyMEVxelRMWEVKbmdRVWtxcDNucUY0clBUMmFaN2xQL1BrOHhZVVlXL1NjZlhQUk9mbmxqYVVwamRrNXQvM0g2WVpPMm1sNW43bTNkWVg2UGo2M2ttMDJkOW5mbmpDNGl1WDhxRXh6K2lMZ2k1MlptTW4zMGZ6MDVxVy80YXJkekVnbCsvd2lzNy9FU3ppNW40MVdrc25ING1SY0M2UmZjeE4zczJHNzkxWnVMTzYzL0QwTi9rcy96SGVTeTRmeTFibThLUW5Vdlo1YmZ4NmxjcjB5NXplZlMyY3lnQnhQQ3AwNEFnaWVrZWZxQUZDQXFJU3RDQk9DQTFFcGFiUXFFNHhTajc2aHcyL3ZZbXB2WThoMGQvK3dodjNYc09mUytjemNZL3BKbVFXL2thc3g3OWlKSlo4L2h3NVM5WWUxcys2eDVmd3FJOTRCcy9pNDBQanFPdys3azgrYWRIMm9rYXNRb1dMZndMVzRmY3dOcVZqL0hoenliaFc3MkVPYXZyRC84Q1N5NWw1UjltTTcxN0psUG5Qc0tyc3daYU43UmY1dkxRV2orSDFTcVJtQk9lR01xbW9RR0d1Z1FVaWxPVW1pcktldzVpbUJmS3QxZFROcnh2MnJ0dFh2ME9sY09uTUc5OEFUNDhGSTJaeXJ6aERheFlYWEhFcDRodWVac1Z3UkhNbTVtdzBId2xZNWcvdlMrYlY3Ly9LWk1NN1plNXJIOXJHLzcyV3RXK1Y5VENEY1JJcmxOUUtCU25CbHQ1Nkk2L3NLYkpUMTBzazJrM3JrN3NETTEraEFudlQrUFZlV1BhTkluWE5vYkpLeTV3ZkMrTGtwSmMvSlgxUkJtWXNvb3ZSZGdhQTBTTHoycXpLTG1vWno2K3htcHFqOE52a2xqbUVzYWYwS3FqUXVNWTdxeFFLTG9LdzFpNCtHR1dmam1mQys5NmtJMS9tTVhVbmlNU0xtbUtxQUVVOWNqRVgxMlBQL2tkbmNxYUFIazlDZzRyYWdDK0hwbjRxcXVwZENoSmJVMEQwUjdGaWJIaG43R2d6RnJtUWw1N3JaSXBYOXNJVzFoZEJBckZxVWlJOG1vb0s4bUN4bXJLdmNXVWRTQXlvNmQ4aVpKL3IyWFJKajlSRW9tRUo5N1BaL3FVZ1VkOEZ0K0lpNWp1Zlo5Rnl5cW9CYUxWbTFpd29vclJVODZsRENncHljZS81U1BXTitwRUd5dDRmbldGUTZFOCtMdzZ0VFgxUkpQZlM3L01KUThpUi9Wcnk0UXJHbElYZ0VKeEt0TEFCNVVGbkZVQzdLMml0dWVnanV2UFNpNWw2ZHd3YzMvekNDTWZzYktpOTg1bVh1bFJQSTEzSVBOKy9IVVcvSG9wazZiNWlXYm5NL0dyczNseVNtSTRkOW5sMTNIUGxxWGMvdi9XRWUwK2dLa2o4c2xOL25CZnJwa3lrRm0vZVlSSmUrN2tyWm5RMFRJWEtXVTRqWFhtK0w5QUNJa3BUU21rbEI4QUk5VkZvRkI4TnRReWwrUEFZWmE1bUZKdWNZMjQ2b2UwbG5zNEY3cEVCVUlYZ3JnbWhLbEpLZjNxYkNvVWlzNk9sTEtsWTJ2Tm5wMmJRQU9Vc0NrVWlrNlBhY29XaDRESmRJSm1lYVM0cFpSTlFnaDExaFFLeGNubk1NdGNETU1JSE1aaWMrb2FtcFN5UVoxTmhVTFIyWWtiaGovRllwUHB4VTJnU1NucjFTbFRLQlNkbldoTTkzZmdma3JIdWdNQU5NTXc2dFFwVXlnVW5aMVFKQnFnZld4TnRuZEVRZE4xdlZxZE1vVkMwZGxwOGdjN2NrV1RZbWRuQzl5UlNLUW1KeWRIblRXRm9oUHh5WUVhZFJKUytHRDdua0RIb2lhdEZhT0pRV3p1Z3djUEhpd3NMRlJuVGFIb1JBem8wMU9kaEJTcTZ4dnRjZy9URmpXUjhENmw3WUlLSWRBMGdUWnk1TWdhanJZSFM2RlFLRTRPa2JtL1dobzZqQ3Y2Lzl0NzgvaW82bnYvLy9VNTIreExsc2tlRWhLV0VFUkFLK0R2aWxoLzZOV3FiUzlZV3JTOVNsdSthUHVyMUc4TDFRcTl0cUJ0b2N0RmJ5dFdyMWhic0ZxZ1ZXcFJSQlRVRmxjVU5TeWFSQ0FRUXNqQ3pHU1ptWFBPNS9mSG5IUHltWk16U2JCc3d1ZjFlQndUQW1hWk0vUE02NzE5M3RUYUNZKytvM2IzODhlTmk0dnJUQldsOUlBTlpEcmozREpFRExCUlN1aysvdEJ4Y1hHZHFkSjAvYUFOYWhsdXpkeVliQVNrYWJEcHV2NHhmK2k0dUxqT1ZDV1Rhck9EWTNOcytTQWt2Zk9BYXByV3lCODZMaTZ1TTFYeDdwNW1oeEEwYSt1SGxLWmhza0ZSK041a0xpNnVNMEVwYkZqNkE4eC9UVTMvc1dBYWZuN0haMW94aEJ3YklTUmRHUVZBT3pvNjZ2bUR5Y1YxWmluUjlCWVczWGszeGw5M0cycSs5a3NzMk56RW5ESTdORURVYlg0ZWEzZWZyTE5rVzdCcDdTdlkzbkdpUDYrTTZ4YjlDcnZXL1JMdkxCZ0hCVUJEL2I0MkJtWTIxMmFPVXhIcnZ3SUFXbEZSOFJGd25JOFpGeGZYeVZQeVF5eForaVIyVk0zQStzZC9oczBMejBmVHd3OWd3ZmJqZ1ZRUGRyeXdFV3Yybkt6VC8xdXdiczFMMk5aeGNqNjdTNUVSVEFlU2lUdSt2N3pEN3RRSW9JTms5TFNsQ3dna0hZcWExbTRYZ0FuOEdjWEZkZm9WM2Y0U05tQVNIcDE3ZnZvNDczRlhZT24xYitPYXA5NUQ2NVRKaURpY05MdHA2Zi9Ga3NMYjhQTGNTdXg0OU9lWTkydzdvbDBxa251V1lmempBT1FSV0h6ZlhGeWZBMFEzUDRCSmF5VmNWOWlPSFEzdGFGVktjZjNjRzdGNFN2bzQ3OFMyaHpCK1RTSFdyL3c4YWdFQUgyTFIxeDVHOUxzL3gzMFh0dUNSTysvRGlrWVZpVlFQdHY3d0IxZ053RFg4YWp6KzA4dXlIeitlb1c1c1g3c2FTNTdhaGZvdUlGZzJCblBtZmhtM2pnczYvRnU2eHdZMUhZQk9BUW9LQ3FTM3ZoTmlMQmFsZWpySGhuUmx0RTRRQkE0MkxxNHpRRTBOTFVEVlpBTXFhVldQcmtUd3FROVJqOG5wN1U4RGFPTE5QOERyTjBleCtzNjdzVzdLUXF6L1FsNy9mOVNwWXNLaS80dmxaVEphdHorS0dmKzlHbFVyYnNPTmhZTjlkNFg0K2svdndkZXhFL05tUEkzcWV4Y05iVGNDRzJhL3RSNjNQUVVzL09uUGNYMVpDblViZjQrYjcxbVA2b2R2eHBXMkNVOWQxK3ZSUDdlbUE5Q0oyWlJMUVRWS0lZR0FDQ0lFUWdnRlFGVlZyZU5QSnk2dU0wT0pMaFV1UmNwY2ZlZVQ0RXFwSnk1blZEQUNVOHJTSzRValU2N0dEUVVmNDIvdm5hSUR0UlVacmxRUFdqdWlpTUtMMnF1L2ljMFB6TUkwaDdGMVhVdnVRLy84R2hPQ0Vpb1FBSlJDQTFNOEFFQjdlbm8rNEU4bkxxNHpReTZmaEVUU0JyRXVGUWxaR25UUDV5ZFRBR1U1UUxUejFHempkSTJiZ2NlL093YTcxanlBNlYrNUM5UC9hejAydEtpT1AxdXlOMzdRQmpRTjlwWVBRaWhKVDhKVFF2cEdxdWpldlhzNTJMaTR6aEJWMXhRQ2V6NUVYVVo0Mm9SbzJVZ2poeVVEU0NGeHd0YWR4OURVQWdURG5qUjRGQm11Vk9xa1ZSUVRMUzFJakw0TTkvMTBFVjcvMDEyNGIyb1BWdDY5R21zZENoSFI5Z010QnNBMEJtckdaVlJFS1FVRklCQ1N2a3ppVFo0OCtTaUFEL2xUaW92ckRIQnNGMXlCNitYWHNlU2hPdFRIdTlHNit5VXNXTnVPSzc4d0xwMWZ5eWxGYmNGQi9PM2xKa1NSUXV2dTU3SHFmZFgyV1R3b3k1RlIvL1l1MUNlQlJEeUtLQXZDSXp1eGFYYzNnQlRxTnorTlZVY3FjYTJadkI5ZWllcU9YZmpiZTkwQXVsRzMrU1ZzNnJSL2wwR1U1YlJqKzl0TmlBS0lkblFQR1lTdDI1L0FOWGMrZ1UwdEtRQmVSQW9EY0NYN2c3UTNnWStPSGQ3Wmc2eXRIdWxMcHdDSUFKbWtpd2hXOFFDQXJ1djYyNElnak9SUEt5NnUweXlsRWdzWHpjS1MzenlKYTJhM0ErRlNYSG5EclZnK3hXdjhnekxNLy9abG1QZmZ2OEtFMzhzb1BlOENYSGxlQUUwWm4wVEd0SnRtNE1wN25zWTFNNThFd2hXWWY5ZjNjR3VOOGRjK0wzWTkvaXRNZXE4ZDBaeEtYTC93eHI3Q1FlRy9ZZWxOSCtLMmV4WmhWZEtEQ1pkZWdDbWw5bSt5RXJmTW5ZeDV2L2tWSnZ3ZUNKVCtHKzY3YnlhbURhSFh2K3dMTitQQmp2Vlk5djBmNExZdXdGVlFpZXUvZTZOUjRlMXIwS1dVZnVBVWhwSjBWVlNuNmVQWEFFS29MS2JkR2lFRVJCUkZXZGQxQ1lEYzA5TnpxOHZsK2hsL1ZuRnhIYjgrVFF1VG81c2Z3S1NuUitDWis2NFlZbnZHNmRIaG94Mi9MTDdzUDE5RmVrbHlISmxMa25zQmtoSUlWRUtJTGdrQ1ZTU0JLb3FjenJHWmxkRm9OUG8yZjNweWNYR2RLZHJkY0dDZnphMnhPVFpLakpFcW96R1hrblNPalFwc25EcHIxcXkzRFNweWNYRnhuVzdGdi9hRDVTM0lySVJtZ00yOENDR1VrTDRUZENWQ2lIRktPUFN0VzdmcWxOTHRoSkRwL0RIbDRqcDdGWngrSzNhZjRhOXlWZFBlYW1ydDdBYzFZNVNLQXNSd2JlYU1hQnBxYkI4YmpMZTZxcXJiK1czbjR1STYzWXJHdTk5M0NFUFpjSlNtWTFCWWJvMlk3UjdHSDZpWlo0dkZZcS96aDVTTGkrdDBhKy9IQnhzR2dockpPRG1YUUNCR0g1c2dJQ1BIQmtELzFyZSt0UjNBTWY2d2NuRnhuVVlkKzhhaVh6ZGxnWnBEamcyVUNBU0NRS2dnR0k2TkVYM3l5U2RWWGRkZjVvOHJGeGVYa3lnOStWOGpwYXF2MVRVZVlzTlFOUk51Zldld01lRW5DQkVnRUNGZFBDQ0VtSDF1RklDZVNxVmVjYmxjMS9KYnlNWEZCYVM3WVErblBEaVNVS0NCSUo3UVR1clhhMnRyMjVrdERLWHBBZ0tsNXRRQkNGS1VBRlFFcUFpcWkybXdBVll2bTA0cHBTMHRMYThNR3phTTMwMHVMaTdvRk5nUkN3S3VBUHg1UWZoOGZoU2U1Sy81NFVkL3IzZUFtZ1pBTTFsRkNLRkVFQ0FJQW1SWmhxSzQ0SEs1NEhhNzA4Y1dtWVVEMDdGVlZsYnVCdkErdjZWY1hGeUhVMjdBRlVCaFVRbDhQdjhwQ0hWcDNkeHZmcjNORm9hcUJ0UnNSeGFaUFd5Q2tWOUxnMDRRQkFGTW5zMkNtNnFxVy9ndDVlTGlPcEpRNEE4RVQ5blg2K3JxZWczT3ViVytpbWpha0JrdEhnSUVnY0NDbWloWTdSNW1LQXJqZjlTajBlaEwvSlp5Y1ozYm9oVFFxSkRkcWJWdHg4cnZmUVdmdS94aVRML3FQL0REdnpjREFKcWYvQ1l1dmVSaTQvb20vdHc4OUs5WlgvOVJIVEx6YTdiQ0FYVExpQm1UQm9JZ2dCaFFFd1VSa3VuWUdMaFJTcW1lbjUvL2lwN2V2bHpLYnk4WDE3a3BRb0I0VXN1U1U0dmg1ZnNXNDFsOEN5dWUrZytNVkdLSUlRQUFLSjcxTUxaOUlZRkUrOSt4NE1abmp1ZExIcnIyYzFmdHQ0V2d4bVVQUXlrMFZZY2twNkVtc283TnNHOU9TMGMxVGRPZTQ3ZVdpNHZMV2MzNDRNTWthcS8rSEVZR0FMZ0NDTEJINExwY2NCM251dUtlbnA1dDJkd2FJZENRc1hLUFVsM1hxSjUyYkZRUVJJaUNDRkh2N08vWXpMbFJBSG9zRnRzY0RvZS96bThnRnhjWEUzOWk0NTMvaWZ0M0pKR01KNEZmWEl2UC9RS0FNZ1YzL25rSnBycUc5amxlKytNeVBQamtkdXlQS3lpYWVBM21mZis3eU85c2ZOY0dOYXR3WUxSNTZBUklBODM0VE1sNEhPM3hPQVJQQkZWbFBvakVuUWFiZWVtNm5nRzMzTnpjelR3YzVlTGl5bFFlcnY3cE03Z2FlN0h5aHJuWS8vVy80ZDdweDdlSllkK1RQOENQLzE2Qk94L2NoS201Y2J5MjhuYjgrSHUvUGZUZTFwODBHc1pLdFlNTmxPb2doSUlRS2dvaVJLSWhxUko0d2lFRWpUWVBVUlFnZW5JZ3BDMmNrREV2eXBSVWRVM1ROdklieWNYRmRlSzBGeHYvK2lGcXYvcGRUQzEyQWE0OFRMN2xHNWg0OU9tWDRKaGI2ejlLUlVoNk94VWhBREhDVUVFVUlZb2lSRW1DSUlxaTVkak1rQlI5Ky91MHpzNU9Eall1THE0VHFIYTB0L3RSVkJ6bys1Q3JBZ0Z2MjQ1c1lhZ0Z0NHcyRHdBZ1NFTXRYUTBWUlJHU0tLYkJac0tOZ1pyVnp4YUpSRjVCZWtzOEZ4Y1gxd2xRTG5KejR6amNGck0rUW51Yjkvem1qUVAyYW1qS2hCckpQREhYT0NrMy9mK3lVQk5GQ1pJVzY2dUttbStaWTR5c0FkUmtNcm1CM3d3dUxxNVBySXcxZ2FOdzlSZEhvdTZSMytMbDVnU0FOcnp5MndkZVF2OUpnNHpDZ1hXd3BNRW9RUlJBb05ORWtrSVVDWFFLU0pJSWljWWdzWTZOeWJVUnBqcXFIVHAwNk8rVmxaVUwrZDNoNHVJYWlwcWYvQ2ErZkYvZnF1SjNicndZOXdPWTlNTk4rTVhuQXFpWTlYUDhWOXNTM0QvdlN2dzRya0FMalhqWHdhM1pHM01wVE9NbENCQmtCWDZ0Ry9HT0kyanNKSkQ5WlJpWG13TTVNQkpreElnUjZPM3RSVzl2TDBra0VraWxVa1JWVmFMcnVrQXBsWkRlek9wU1ZmV1BnaUJjeVc4WkY1ZXpQazFicW9ZcVNvRzNZMkVVVnB5OHJaeXFxcjQ0dktKc0pZQmU5RzJqTXE5dVFrZ0NRSW9Rb2hKQ2RGRVVxU1RKVkZFVXVOd3U2bmE3NFhGNzRQVjY0ZlA3RVF3RUlFaVNaRHEyak9xb1BSenQ3dTUrbWo5MXViak9MUkVDU0VSSFY5ZkoyL0hVM0h6b1ZZY1FOQVZBSllSa2JxVXkyQ1FJQWtSUm9GWnVUUkloU1JKa1NZS3NLSDNGQTNzUndWWWQxZSsvLy80TkFBN3dXODNGZFc2cFFFbWdLM1p5RHRXbWxEYjkxNDhXNzJMQWxyS0ZvVHJNSTRyTW5RYlcyRlFmdHlSUlNvTk5scUVvU3A5alkvTnNnaUNBb2FNT1FMdnJycnQ2VXFuVU9uNmJ1YmpPTFJVcENkQkVIRWVhbTA2NGM0dkg0ODg5dittNWxKTmJBNGc5djVhR216RVhhb2VhSk11UUZRVXVsd3VTSktVL2FQd2pLb29pMFRTTkNvSUFUZE1vNDlyVUF3Y08vTFdxcXVxNy9GWnpjWjFiNGVnRmdTaU9KTHB4dUMyTzJGRVJYY2tUYzRMdUs2Kzg4bllXdDZZQzFCeDhUM09JR3RKMWFKcEdOVTJGcXFhUVNvbElKa1ZJdlNKNlpRazlMcVVQYkV5dWpRMUhNMlpIUjR3WXNVdFYxZldDSU16Z3Q1dUw2OXlDVzZGYlJhRTdCa3FCekZVcG4weUpaT3B2bHkxYWROVG0xRklBVWdSUVFjd3dGRlFnb0NJQlpCRlFKTUN0RUhnVXdPc0N2RzRnNEFWQ2ZpQTNDQlRrQUlJc3k3QzVOdGdINDQxUkt3M3BTUVFlam5KeG5lT1FPeEhhM1hqZ1ZRZTNsdEhta2JGaXp6aDNUUlRUb2Fna2lwQWtFYklrUXBZa0tJb010MHVCMStQdUE1c29pdVpiYW9hbHpKSGhWblUwUHo5L0M2WDBWWDU3dWJpNFBxazBUZDgrWWViOHhnSGNtdFozL2xyYVhJbUVVRkVnRUFXUlNxSUlVVXpEVFpZa0tMSUV0eUxENDNiQjczVkRVQlFGc2l6RDd0eHNEYnRXRVFHQTJ0WFY5UVMvTlZ4Y1hKOVVCdzYzdmpDQVcxTU50NmFUOUpaM0toQkFFSWpoMUFSSWttQTROUkdLTE1GbHVUVVhBbDVQSDlnY2lnam1pRlhHN0NnQWJmcjA2ZXNvcFh6WkN4Y1gxM0ZMcDdSdTZsZS8vMzRXdDJiTWgvWVZEZEpnTTl5YUtGRFRxYVhiTzJ4dXplTkdNT0NENEhLNWtBVnVHYTZORFVkZmYvMTF0YmUzOTNGK2k3aTR1STVYUjlvNm4yMXE3V1NobGpTdU5OU0llWkpIdW45Tk1QWWFtQzBlYkc1TmtmcmNtcy90UXNEblJZNGRiRGE0c2E3TlBoaXZybG16NWtrQTlmdzJjWEZ4RFZXVTBvWWYzZitISFlPRW9kWkp1UVJBMnEwSkVNVjBiazJTUk1paVpCVU1YSVpiODNrOUNBVzh5QTBISUhnOEhqakJ6VlloWlVOU0RZQTJkKzdjYUc5djd4LzRyZUxpNGhxcVdqdWlHeDVhOTN6Q3lhMFJJR1VVRFRUQVBFZ3k3ZGhFVVRDS0JRSmtVWVFzRzdrMTJZQ2F4NFdBejROd3dJLzhuRkFhYkc2M3UxODRtcVg5STZQMVk4T0dEVThBYU9DM2k0dUxhd2h1clhIWncwKytaWU1hNjlqNldqelNSUU1JaEVDMGlnWnB0MmJPaENxeURMZExoc2Vsd08vMUlCVHdJUzhjUUZGZURnU2Z6d2UzMjIyNU5oWnc5dFlQVzY1Ti9mS1h2OXpSMDlQekdMOWxYRnhjZzdxMTltTlAvL0t4cDN0dElhanAxbFNRdmhWN3Bsc1RCVUxUYmkwZGhxYUJsbGtKOVhuY0NQZzh5QW1tM1pva2lSRDhmais4WG0rR2F6dWUxbzgvL2VsUGoxTksrUW03WEZ4Y0E3bTFQWGYvNW85dk9rRE5kRzBPTFI1RzBVQVVqUllQZXpPdURLL2JCYi9QY0d1aEFJcnljd0FBUWlBUWdNL25nejBrWmVEbTFQcGhWVWkvOFkxdkhPdnU3djQ5djNWY1hGeloxTnphL3ZRRFR6NDNXRzR0b3lGWE1OeWFKQXEwSDlRVUdSNlhLOE90UlhKRGNCdUxUSVZ3T0F6V3RRMVFKYzNxMm1iTm1yV0dVdm82djMxY1hGeDI2YnIrNXZSdi9IQ0hBOVFHY0d1QUtCQklnamxkMERkaDRKSmx1SlYwTTY3ZjUwRTQ0RU5lT0lpaS9GenJhd281T1RrSUJvT1dhM1BLdGJHdWpka2FiMjFyM3JoeFl6SWFqVDdLYnlFWEY1ZGREVTJIbjluVmVFakY0SlZRSFNCVVNCOGtTVVZCZ0NTSmhsdExRMDJSbWZZT2p4dEJueGM1d1FBS2NzUHdldnAybXdyNStma0loOE1JQkFMd2VyMFczRXpITmxUWEZnNkhOK2k2L25kK0c3bTR1RXlsVlBYNWtaK2J0OHZCcVEzdTFzUk10eVliQlFPUDJ4aWQ4bmtRRHZxUW54TkVVU1FuNCtzS0JRVUZ5TTNOUlRBWWhOL3Z0M0p0RGhNSkE3azJsUkNTT25Ma0NIZHRYRnhjbG5ic3F0K0V6R1pjQzJ5R1cxT0g2dFpjVm51SE1Ucmw5eUkzRkVCQlhoZytqenNUYkNVbEpjalB6MGRPVGc3TVFzSlFjbTFtTVlGMWJjWEZ4ZjlJcFZJUDg5dkp4Y1hWMWRPN1p2THM3eCt3UVMyUnphMEpSaVhVeWEwcHNnU1h5Mnp2Y0NIZzkxcnRIU1dSdkg1ZlcvQjRQQ2dxS2tKZVhoNUNvVkRXUW9KVGhkVGUxMFlJU1gzd3dRZVBBVGpJYnlzWDE3a3JDaHo4NitaL2JvTnp3WUIxYXhsOWExWWwxTzdXRktOZzRIYW4yenY4WHVTRmdpakt6NEhIcmZRSEd3Q1VsSlFnRW9tQUxTUjR2VjY0WEM1a0c1TFBsbXViT0hGaWZYZDM5NFA4MW5KeG5iczZjclRqeWEvZSthc09tMVBMNnRaSWhsc1RNODVaY3lreVhJb0NyMXVCejJzVURFSUJSSEpES0NuSWMvejZBZ0FvaW9LaW9pSmtLeVRZcXFUVW5FcXdyK2d6WGR2VXFWTWYwM1g5Ulg1N3ViZ0drZUk3NjM0a1ZkTmUvc3lYYm50akNHNU5NOXlhYms0WlNFYmZXcjhxcUhFeWJzQ2JidS9JRHdkUkZNbUZJa3Zad1FZQTVlWGxNQXNKWmtqcVZFaGdoK1NaR1ZLZGRXMDdkdXhJSGpseWhPZmF1TGdHVTZqa3JQdVJkdTVwZkthcHRkTStYWkFBa0NETUJpckRyZW5FT2tTU1dFNU50bzFOZVR6cGszSE4wenNLOHNJb0w4clArajBJN0IvTWtOUjBiUVAwdGxtdWpabElZSjFicXJpNCtPVmtNdmtiL3N6bDRocEFrWkZubFd1THhyc2Z2WERXN1I4YmJvMkZXdC9BZS8vejFxaElDRTBQdUlzMGZTcXVuT0hXMGhNR1hvU0Rma1J5c29lZ2ptQXJMQ3pNR3BJNmpGdFJTWkl5Q2dtc2F5T0VKTGRzMmJLS1VycURQM3U1dUxLSUNFRDFwVUJPQlNCN1B0VS9pcTdUZHgvNDB6UDJnb0dWV3lOQTBneEJtZlBXcUdDRm9HbW9aWnlLNnhTQzV1ZWlNQzg4NFBmU0wwQXRMUzFGZTNzN290RW80dkU0ZW5wNmtFZ2trRXdta1V3bWtVcWxvS29xVkZXRnBtblFOQTI2cm9OWjA2ZFJTZ1VBNnRWWFgzMjRyYTN0d2R6YzNKWDhHY3pGbGMxZWlFREp1RS85ai9IaG5qM3I3L2p2eCtJT1VFczdOa0xTQlFOQ05DTjlSUVZSaENqTGtGd3VTQzRYWkk4SGl0Y0xsOThQZHpBSWJ6Z01mMTRlZ29XRnlCMDJEQVVqUnFCMDNEZ2dGQnE2WXdPQVVDZ0VwOTYyTEkyN0dTRXBISnAyOC9MeU5xWlNxWWY0czVlTDYreFZQQjVmWFZOVHM0Y0pRVE9nUmdoaDErcnBBTktOdUtKSXpWWXlXWmFoR0p2YzNXNDNQQjRQZkQ0ZkFvRUFjbkp5a0orZmo1S1NFb1FHZ1pvajJJQjBJY0hzYldPSDVMUE5rdHFhZG5WQ2lOVnBUQWhKdmZycXE0OVFTdC9tdDUrTDYreVRydXZ2UFByb295K2lmMTZOaFZyS01Ec2FJVVEzSnBpc3RaOG0xRXl3ZVR3ZWVMMWUrUDEraE1OaDVPWGxvYWlvQ09YbDVVTXp3VTRmbEdVWlpXVmxLQ3dzN0ZjbGRUaHhkNkJDZ2dvZzlkblBmcmFwcmEyTmg2TmNYR2VoOXV6WnMvNDczL2xPTkdzSTJ0ZTNabXgySjFuZG11blVQQjRQL0g0L1FxRVFjbk56VVZoWWlMS3lNc2l5UEtUdlNjcjJGMFZGUmVqbzZFQTBHa1ZYVjFmV1hCdWJaOU4xbmVxNmJtNjEwaWlseEhCdFFpUVMyZFRiMjd2QzVYTE41MDhGTHE2elE4ZU9IWHU0dHJaMjd3QnV6ZG8rWmJnMWFvTE5iUGhublpycDF2eCtQNExCSUhKeWNoQ0pSRkJTVW9LaW9xSWhmMS9TUUg4NWJOZ3dkSFoySWhhTG9idTdPd051WmdIQnVLaXU2OFJXU0tBQWRFcXBWU1g5NHgvLytMOXo1c3daS3dqQ2RQNlU0T0lDOXUzYjk2bjkzbFZWZmVtZWUrNTUyUWExWHB0Ynk4aXJBYUNFRU90ekdDWUlBSkRHUnZxdHdSSHJZOGY3V0EwSU5wL1BoN0t5TXN1MWRYZDNXMkJMcFZKMjEwWTFUU082cmxQakc5TU54MmJtMjRSdmZ2T2JIZE9uVDMrd29xS2lGa0FKZjFwem5ldXFxS2o0dEg3cnphKysrdXFHVmF0VzlUaUVvTDJ3RlF5TXZKcHVPRFZxT0RScTV0TE1Ja0U0SEVadWJpNEtDZ3BRVmxhR3Fxb3ExTmJXRGptM05pU3dBZWxDd3JGanh5elgxdHZibXdFM3R2WERDRWRCMDRMUjEwWW9wV29hemtTb3JLeDhJeHFOL2s4Z0VMaVhQNjI1dUQ2ZE9uanc0Qjh2dWVTU0pnTnFMTkRzSWFocVRpWVJRcXk4bXIxWTRIYTdMY0FGZzBIazV1WWlFb21ndExUMHVLRUdaQ2tlT1AxV1lWdEEyRUY1V3dzSWRSaVNaOGV0VW9TUVpEQVlmQ0taVFBLUkt5NnVNMVIxUzZhaXF1cG1ySTMyLzd0NFBMNjZyS3pzYldTMmRsZ2hxQzJ2WmtITlZnV2wyYURHdG5aOFVrYzdKTEFGQW9HTUZwQlFLT1E0bFdDRG0xa2x6UmlTTngrSTU1OS8vbUZkMTdmd3B4QVhWMXJSdXJWWU11OGFUQjFmZzZxcUdveWZOQjJ6Rnp5Q3JhMW56dmVvcXVyV2xTdFhib0Z6QmRTQUcwMVNTbFZLcWFicnVxNXBtcTVwT3RWaHVUV3FLQXBFdFF2dDdURWs1WFE0R2dnRUVBcUZNbG83QW9IQUovbytwYUgrdy9MeWNzZHBCSWRjVzdhUUZFYk9UU1dFSksrOTl0cERqWTJORDFSVVZGUVFRcXI1MDVyclhGYnIxZ1dZUFc4ZEdvSVRjTzMxODNGREtSRGJ0UTBiTml6Rm5LMnZZY1V6RCtLNnlPbjlIaW1sRGR1M2IzOTZ3WUlGTVljUXRCZnBJZmNrcFdiQmdHaUVwRWVuS05WcEt0R0RoTWVIZ0dHQ3hHZ3ptbzhvQ05lY2x3RTFNNy8yU1VMUTR3WWJBQXdmUHR5eFF1b3daa1YxWFNkbVpRTUExWFdkYlFFaGhCQmgrUERoYjdhM3Q5K2ZrNVB6aStQOVhyaTR6aDZydGhYTEZxeERRMlFtVnExZmpta1d3RzdGTFRjc3dZeVpxN0JrMlZaY3VYd2FYS2ZSckRVMk5xNlpPblZxazgydFpZYWdsS1lMQmtUUVJNSHFWNE1rYU9qdVNhRTNucUJDWGhBdWx3dWlMSUFRRVc1dlptdEhhV2twaGc4Zi9pOTlzOEx4L0dPdjE0dUtpZ29VRnhkbkhFeVo1ZFJkS3N0eXY1RFVOcFdReU0zTjNkRFQwL01yL3V6bU9uZTV0Z1liamlxNGRQNUMwU0F4c2dBQUlBQkpSRUZVQm1wcEJTZmVnc1VMYnNDVmtRUmFiZm12WmFzWFlNYlVHbFNOWDRDdGFkK0hyUS9jaGhsVHg2T21xZ28xazY3QnpVczJvU25CZk1LdHQyRjgxWFFzV3JzYWkyWlB4L2lhS3RTTW40b1pDOWFpemlHZmxxamZnRVd6cDJQc2lJcUhxcXVyMzJlY1dpOTdFVUlTWUErUVRKL2NvWnVOdUxMTEI3OGtVSUhxSUhvNzluN3dBZDQ3bEFRaGNieS82Uzk0NUsvdkl4V0pvUGpJVTVnemF3NXUvLzJmY05zMWsxQlROUlZMNmdCc21vZWFxa2xZc0Qzeis5dTZZRHlxYXVaaEUvdkJwcTNINzVLS2k0c0hkRzFtT01xR3BHWUxpQkdhc3ZrMkFZQXdaY3FVaDk5ODg4MUNXWlp2NGs5enJuTk5kYS90UUJLMXVHS0tVNndad2JSYmwySmF2NDl2dzhwbFZiamkrdmxZVkZXTGFrU3hkZEVNekZtVHdPUWI1bVBwQkJkYVgxdUhsYXR1d2V6b0ttek9jSHNOV0xOb0ZhNmRQeC8zelE4aXVtMFZscTFjaU5sUkZ6WS9lQjM2dm92dFdIWnpIU28rKy9rbjlyZjhnKzFYNnhlQ3NsQURvRk1LU296RlQrbThtZ0ovVVNtS3ZWNzRQQkp5eHBZQnh4cnd3V0UzeGw0eEhSZVBIb054UlVVWTVnMUJrUko0ZnZrS2pMbjJSc3lmV1lXSkVRQk5RM2UvQzJiUCtXVGhYM1YxTmVMeGVOYjJEd1pzR1NFcHBaVHF1bTV2QVNFN2QrNFV0bXpaOHREMDZkTUxSRkc4bWovVnVjNGRKZERhR2dXVUNDSXMxNkt0YUdXZEZsd0lSb0lNbkVveDg3NzFXRDR0YVB6N1RWaXhIWmh3eTRONGRPSEU5TCs3L2pwRVdpZGg0YWEvWWZ2eWFRd2NGVXhlL0RqdXU5SDRnbE9tb0N3eEhUTlhyY0NxdXV1d3NMYnZhNDYvODRuTm56bXk0ZmtOOFI2blhqVjdGVlFsQXRHaFU1MVNuYVpTS1ZBSVVFUVpzaXhUYTdqZGx3NDlKYmtadTQ1NFVUbHVJaTQ1dndMRHk4cFFmU3k5UnEvcWxzZXhmbUh0Y1lmZWRTdVhZTjNCcWs4R05sRVVVVlZWMVE5czdEU0NiY3lLbUlVRUkrZkdGaE1JSVVTNDZxcXJtdXJxNmxiVzFOVGtFVUltOFNjODE3a0N0a1FpRFJFWDh5cmV2dVFhM0xEdWFOOEhBak94NnQzbERKeXFNWGxpa0lsWnI4VHl6VmZhUG5jUTFXVVJZSHNyb2dtZ2p4SXVSTW9pR2RDY09QTTZWSzFhaWUwN1dvRmE4KzhtdkZXdTdIMTYvdno1VVZ0T3JjZTRlbTM5YXVsR1hJbFFVSjFxdWs3VlpDK090U2RvM09WSFVYa0llVVpyUnlBUWdCU1ZJWW91QlBNTHJXWmM4VjBDSUlEYXliV2ZJSjlZajYxYkc0QXhDejU1d2o0Y0RxT3lzdEtDVzdZS0tldmNUTGdaVXdrZ2hKakZCSUVRUW1wcmE5OXJhbXI2YlVsSlNTNGhaQVIvMG5PZC9US0JaZ0RPZURYWDNuSWZWbDJiQUJERnRtWHpzV29vb1ZpMERtdFhyTUNhVGR0UmR6Q0dwR1hRcXROSUdvZ1VaVlVvQTFEZjBBUWdBa3BSMzlQVDl1ZDdaMTdWWW9OYVh3V1V5YXNadVhNcnJ5YkxMaXJMTW1SQnAycWlGL0dlT0pvYlBnTDFUY2Jra3JSamt6c1VTSklMNGNJU1ZGWldJaHdPLzR1UFpTc2FXZ0ZsWXZXL1Zva3NLeXV6QnVSWnVHWEx0UmxRTTRlL3pMQlVNeDRjQWtBb0t5dDcrZWpSby9mbjVlVXRBaERoVDN5dXN4MXNrVWdRU0RhaHFSVkFtZUcxcXFkZ1dqVUFSTkc2U2hsQ2pxa09EOHllZ2VXdEV6Rm40WElzckM1RDBBWFVyYndaQ3pjTjFUdGFPbnFndlh2MTRjT3ZOQ0p6c0wzWElhK1dNdk5xNWpKMWRyckE3WGJEazErRVNpV0ZwcjM3Y0tUaE1EQ2hDams1T1ZEYVhaQWtEL0xMS2xCV1ZuWkNIOVYvdWNWaTFLaFJHYTZORFVudEozOVFTdGw4bTI0T3d4cmhLU0dFRUVvcHljL1AvM3RuWjZjL0ZBb3RCdURtVDM2dXMxbTFsMDVFWU0xVy9HMVRFNzcrOVUvNEF0K3hCbXQyQVpldWVCQ0xyK3NMVVJQQklRWjA5ZStnQ1VDa3FxejM0TUdEcTY1ZThYWWQrdG82elBDVGRXdjlRbEJDcUs0bWswaUpMbmg5TWhSRnNmSnEza0FleXZNUG9MTXRpVlFnalB6OGZMaU91cUVvUGhSVmpSclNMd0Fna1VIZi9vcWdLZ0lrbTVxT3I5M0RTWVFRakJneHdwcE15TS9QdHlZVDdHTlhaZ3VJYmZHeU9YSmx0b0FrQVNUQzRmQ2Z1N3E2ZUJzSTExbXY0TFJiY0gxcEV1K3NXSUJINmhMOXdxdlcxdVFRN0ZZQ1VRQ0pLUFAvSitydy9JNVd1eHNERUVOOVhUMGJ3MkxUcWswNGlER1lNZ29QR2VOU0xOUjZHYmhsbkxGbXZuN05maldCZ0ZJOWhTVHBLeFo0dlY3NFBDbkU0Z1NDUHc5bGhma29LaXBDUldFSWlxSWdtU1NELzN5UkNDS0lvYjYrS2VQbmU2MHV4dnlqYWt5YlZnWHNXbk5pbW1JRGdRQ3FxNnY3RlJJMFRjczJJRDlZTVlGUVNvbmY3MytzdTd2YjQvRjRidWRQZjY2ek54cWRpSVVQTGtMZDdLVllPbU02bnIvdVNsdzZwaFE0Mm9EWE5tM0F0b1lBSnR3eUV4TUh0SDNYNHNyOGRWaTNaRGJtTlZ5SmFyUml4NllOMkhFd0NTQ0tSQlFBVTJ2WXRYdzJaalJjajJzbjVPUG9hMnV3K205SEViNzA5Z2QvTUtuZ0h3Nmhadzh5anlPeU9UV3pFVmVpYmg4UTYwclMrTkVXSkx1RHlBbW4wQk5ydzc3Mk5yUW5YYWllUGhVWEdJZEdqblNOUXVpSkxWaXpaQWx3eGFXNDdzWnBLQnZvNXl0ZGhWWExic2E4Z3pNeHdYVVE3MnphZ09jYkFEQ0w0R3R2V1l5WkcrYWN1Rzcvd3NKQ3gxeWJxcXBzUDF0R1dNb1dFNHhQbzluRDBsbXpaajM4NXovL1dYRzczZC9tcndDdXM1WnR0Vi9INDV0cjhjaXlGVml6ZFMxV3JJc2hxZVNqcW5ZYWJsazVIL092ckI2NFNoaWNocVdQTDROcjBRcHNXTDBTVzExVm1ITDlmWGg4d3ZOWXRMSUpCNW44SFJEQUZZc1dvMnpiQ3F4YzBvQ29xeFFqcjczN2tmcFhmN2tWL2FjS3JCQ1VFQ1FvTlZmb1dWRHJhOEtWWlNpS2o1YUdLSHFpY2NSN1kyZzlITU5SUVVHNHNBcFRwMTZPYS85dEpFcExTMUZWVllYeXkrL0U0amVic1d6REtxeG96Y2UwRzZjTkRQOUhseUc2WUFVMnJWcU9yWUVxVEx4dU1aWk5YSUdGR3pJZmgrV1Byd1JoRDNJN0VkcTllemQyNzk2TnhzWkdIRHAwQ0VlT0hFRjdlM3ZHMFVjR0FBa0RRR0wwdXdrQVJFcXBCRUFHNEtLVXVuLzBveCtGZi9qREg5N2ljcm5tOFpjQTE1a3FUZFBRMU5SMFpwK3h0dlUyakorekZkTld2WXY3REk3RVlySGZmL3ZiMzk3OGh6LzhvWWR4WlQwQXVvMjNQWVFRcTJCQWpHMVQ3UGxxek5IZTFobHI1dnluZWI1YVNVa0poZzhmanBxYUd0VFUxSnpVSC9PRXoyZU9IajNhQ2tudDdSOVpYSnQ1NGk2UVdTbTF3dEtmL09Rbm5aRkk1T0c1YytjS0xwZHJMbjhKY1hHZEdNVmlzVDhzWHJ4NGl3RzFKQU8xSGdacS9VN0RkYXFBc3NVQ244L25lTHgzWldVbFJvOGVmZEovcmhNT05rSUlSbzhlYllITjN2cWhhWnAxNUMrVGI4dFdLYlUrNTNlKzg1MDJSVkVldnVtbW04RGh4c1YxWXFDMmRPblN6U3RXck9oQ1pxR0FiY0RObGxmVEJVRmdOMHhSY3hHTC9jQkkwNjJaVUdPUEJ2L1VnQTBBUEI0UFJvMGExYTlwMTliUDFxK1lZTGcwMDdXeGNDT0VFREp2M3J6V1JDTHh1N2x6NStwdXQ1dUhwVnhjbjFESjd0anZGeTlldkdVQXFMRk9yZC9xUE9QQVNHcDNhdWJLdkZBb1pCMFlXVnhjaklxS0Nvd2FOUW9lejZuWmRpL2VmZmZkSitVVG13ZFFtbkF6SzZRczNHelhZQmluQUxCeDQ4WVVJZVQ5aXkrK1dKVmxtWTllY1oweG9wUWlHbzJlZ0E3Nms2aktxM0hEelRjODh2U3kvMi9MNzM3M3UrNXNUZzBPa3dWc29jQ0Vtc3Zsb3V3SnVQYVZlV2FoWU15WU1jalB6ejlsUCtaSlBRT3RzTEN3M3pTQ1E0VVVUSjdOcXBRQ2dHMWdIb1FRVUVxeGRPbFN2UFhXV3crdVhiczI2ZlY2ZVNzSUY5Y1ExZEhSOGVBVlYxeXg5YTIzM2twbWMycXdIVVBFVmo4eks2QjlUczNjMnM3bTFJcUtpbEJSVVlHUkkwZWlzTER3bFA2Y0ovMXd4L0x5OGd6WHhrNGoyRjFiK3BjZUpRQ29xcW9tM0RRMkxEWGh0bkhqUnZoOHZ2K054V0s5ZnIvL2R2QUpCUzZ1Z2RUYjJ0cjZVRUZCd1QvUS8vVGJnYUNtRVVJMG9lOElvcXpoWnpBWVJEaWNuaW9vS2lyQ3NHSERyT2I5VTYxVGNtcHRkWFYxMXVQRG1WTjJUVHR2NWRwVVZUWC96aEZ1QUJBSUJQN1kwZEhSSFE2SGJ3T2ZMZVhpY3RMUmd3Y1ByakltQ3RqWnp4NWIrT2tJTldiQmNRYlVuRmJubVZBckx5L0hpQkVqVUYxOWVrNzlQMlhIY2RmVTFHVGJpK0RvM0V5NEFlbitvQUhnUm5OeWN0YTN0TFIwUlNLUmIvRlRRYmk0d0JxRit2cjYrdFVqUjQ2c0c4U3BKYkpCamMycFpRcy9uYUIyc252VnpnaXdBY0RZc1dQN3dTMEwyQ3k0bVFtM2JIQXovMXhZV1Boc1kyTmpkTml3WWZNRVFiaUlQNlc1em5WcG12Yld1KysrKytjTEw3eXdFZjFuUHdkcjZiQ2dObGhPellSYVlXRWh5c3ZMVVYxZGpiRmp4NTdXbi8yVWdvMFFnckZqeDJaMWJRNi9iVmdINXdnMzQvTlNTaWtkUG56NFAzYnMyTkU1YnR5NGI0cWllQlYvYW5PZDhUcjJ1NVB5YVZNcGJmT1diYnVldm1ybS9TMU0rR21mL2V3aHhycThUS2hSalJCS1JZRlFVYUJVbG5USW9nNlhwTUl0cS9BcUtmamRTUVE5Q1lTOVBjanpkNkV3RkVkNVhoVFZoWjBZVzk0R0VuMzkzQUViQU1peWJNRnRFTWZHNXR1eXdZMGFINmRtYURweDRzUVAxcTlmdi95YWE2NXBWUlRsYS95VnczV3VxYnM3K2NURGoyMTdmdjRkZjQ0T0FMVmVBaVJBWUt0K1FpTUVhYWlKaE1xeUFFVVc0WEpKMU8yVzRmVW84UGxjQ1BqZENJZTh5TXYxbzZnd2hQTFNYRlFQTDhEWW1sTElrbmphSDRQVHN2TE83WFpqN05peGpuazIxcTJ4SVNraEJLbFVLbjBVU1ByLzAvcllsdW5jWnN5WWNiQ21wdVpYYjd6eHhoRy8zejhmZkxVZjE3a2h0YTA5L3RENGYvdXZsdzgyeCswN0N0anoxRXlvMlp3YWRJR0FDZ0toa2dFMVdSYVE2RXpRenFBTFkzTFNVQXNHR0tnVmhGQldtb3ZxNFJHTUhWTUN0MXMrSXg2STAvYUM5L2w4RnR6c1lMT0hwWVFRYXVUVDdLMGc5Z2tGYXNKdDkrN2RlaUFRZUt5bHBlVndKQks1aFM5bDVqcFR0ZjJlKzNIejBmOFg3LzY2OWhQdkRhV1VOalR1TzdxbWVzS2k5NUc1VGFyZmVXb00xTlNCb0tZb0luVXBJcWlRUkZLUjRmZTVFVENobHVkSFVVR3dEMm8xcGZCNVhhaC85cC9Zbmo4T04zN0c3L0JkeHJIMXZtZXc1T245YUlwSmlJd2JoOFUvbVk0clM4NGlzQUhwYzl6R2poM3I2TmpZdkJ4Ny93YUJHMldkR3dCYVdGajRiRjFkM2VGUm8wWjlYUlRGei9LWEVkZFpaOU5VYmV2Mk54cWVubnIxTDV5V0dkdVA4MDZBOUIzcDNRYzFRZ1VCVkpJRUtrdkVnSm9NdDF1QUpoS0lMaGNDQVRkeVdLZFcxZ2UxUU1BTlFFWGRjNjlnWlVtVkk5aGFuMzBHdHowdFllbGp0K082a2w1cy9kRWF6THZqRFd4KzdDS1VuVTFnQTRCUUtHVEJiUkNvOVlPYmtXOWp6M096Z0diQVRRZWcxOWJXdnIxNjllcERNMmJNK05qdGRzL2hMd1d1TTFXSlo5ZGgvSVBBamFNVDJMcXpEYTFKRjZiZE5oUExQNThIRjFxdzdEL1dZUHZvS3JqMnRLQXBsb0JZTldiMWVTUFZMYis1NXk4eFpMWnoyTU5QYSs2VFVxUUVRalFRNkNiVVJBRlVUZWswbWRRQlFxZ2dFNVNWeXZCNlJHZ1MwTzEyR1ZEelFEdTBIMzk2TG9aTzNZdnlDOGZqaHo4ZWp1dUMrN0hrUDU3QzJrTWFZbGlEU1hzdXdlTVBYNFMrTUVuRmp1Y09JZmp2czNCZGlRVEFqMmx6eHFINkt4OWllK3dpWEorb3c3eXZiRVhrWjdkaTZXZk9BckFCNlkxWEE1V0hUY0FSUXN5TEVrS0ltWE16YzIyNnJsTzJ2NDExYmpmZWVPTWhBUGUzdGJWOW5KdWJld3VBWXY0eTRqb2pkZWdZY05jc2JQNlpIOUZYbjhIME8xN0Nwcy9PeEhVQkFFaWdWUm1EOVgvNVFuUHk0LzEvTEp0d3o5dGIrNWFxSkJtSXNVZDVKd2hCa2xLa1FLQUtJQm9JTklHQUVvSG9va0JBVXhyVmlJQ2NQQmYxU3hUdHJRbTBkSXNvSzNCQmxRVW8zblQ0NlRuNk1WYnZDdUsySDgvQXZNdHo4ZkZqeitMbWIyOUc1QzlYWWZGZmJzV0UyMytOWlNVMzRPVUY5aEdxWHJUR1ZFUktHQ2VYNzBjRXZXZzlDbUQ0TU54eTE3OGpPTzRzY1d5bWNuSnlNdURHUUt3ZjJPek9EUUJoNWtyN09UY0F1dUhlYUY1ZTNsL3I2dW8rSGpWcTFFMmlLRjdPWDBWY1o1eEtxakRUQ09XQ280ZWhPdmtHV21NQUFnQWdvbVp5eFV0N3QzKzQ0WktyZnRHRWdiZXo5OXBDVHhWSWg1NkVRQmNFUWdXQlFKSUlKUnBCVWdjbGdnaVgzNFVSdVVFb1hpK0NBUWtwUlVEVTcwTnhnUXYxcjNXaCtrdWZ4N3pMaHlFbjdFWE9iWmZodXFmWFljMC9wbVBLWUltZWZxc2JSQUFxWWtrQThHUGlaLzFuVHlocWg5dDU1NTNYRDJvRFFJNlN0UHJsM0N3YjE5Y09Zb2FtV20xdDdkcy8rOW5QR3Ivem5lL3M4bnE5L01oeHJqTlhSalVoWVd4ajZVbHBENy95Mk5xWEgzNXVXNDh0bjlaLzd5ZVFwRUNLV0ZDRER2UkJUUlFKbFNRQ1dSS2dlQ1hxN2traDJ0Nk56clllQkNLNU9ML1lqWnl3Z3FSYlJHY29pUEl5TnhwVUwyb3ZISUdjc05kTUpxR3FSTVh6UjNzeDZMaTJZditBQmtCQ1FEbnhEOXNaMXdZUkRvZUhCRGQ3V0dxK2J4eU5wSnRBWTRvS09pSEVkRzc2SFhmY29kOXh4eDMvZStEQWdiMmxwYVUzRTBJbThsY1IxNWtxcXROM2R1MDVzdjd1VnhyM0FvMnFRejR0dzZVUmdpU29CVFNORUdpZzBFRkFCWkZRU1NCVWt0THRISW9pVWdrRXZrSS95djBLZkxLTzVvK080dDJtZkV3WTRVZlNJNkV0TndjanF2TVFyWGdmcjBaMTVqdUxvK0dvaEVqK1lHZFF1QkhKbDlCNktBNGdsUDdRMFRoYTRVUGtKSnhtSkp5Sk56RVVDbUhjdUhFWU9YSWtoZzBiaHVMaVlrUWlFZVRrNUdSYjdVY1ZSUUd6Mm84eXEvMDA0NHoyRklBa0lTUkJDREhQYys4dUx5L2Z1bTdkdWgvMjl2YXU0aThmcmpOUnFxNnRmdkdKTGY5VE8vbC9kaU56ejZmMVBHWXVhMFVlTloyYWNaWmEraGM4Mjg0aEdJMjNJbExIZXJDL1RZWHNkU09VNDBlK1g0TGk4Nkc0S0loOG40SkFRVDdHamFuQkYyY1BSOTJxRjdEaGtBcWdGenNlMllvTkdJTWIvaDhKZ0FTWFMwS2k3UmhhRS8wOTFKVExoaUg2M0hhc2JWU0J4REZzV3ZVTzZzZU53cFJBR3BBN1hteEFmZUlzZFd5bUFvRUF4bzBiQjBFUUhDOUNpUDJ0NWR4U3FaUlpNV1dMQ3BRSlRVMzNwZ0hRdnZTbEx6VUIrRTFUVTlQT2twS1Ntd2doRS9qTGlldDBTOWZwdXgvV3Q2OWYrK0diZTdEc1RaVUpQWk9PTG8yQkdhVjkrd2xJdWo5TkZ5aEZTdGRwVDFLRXp5dENVU1RxZGtsd3UyWGtqMUNnSEl6aG5UZmpvS0tNZ29waG1IMVZHU3JLdlVnRVhEaFlXb0pBd0kzQTU3K0FCNDgrZ3lYLytXc3NpRW1JakI2RHhiK1pqaWxHeUR6bCtuRW91K01wVFAzUFMvRE1FeGVEYlI0Tlh2WHZlUERRYzFnMDk5ZFlaUFN4M2ZlVGllbFdqNlA3c2ZKSFcxSDJtMXV4K1B4Ly9iRTc0VnVxVHJSNmUzdnh3UWNmb0w2K0hnY09ITURodzRkeDlPaFJkSFoySWhxTm9xdXJ5OXA4bFVna3pGMExoTmwrQlYzWENhVlVNQzhqYXlrQmtDbWxpcEhKY0FGd3JWcTFLakpyMXF6cnZWN3YvK0V2TGE3ajBTZmFVcFZsVmpRYTYzbjBnZjk5Y2RzZGR6OFZSMStCZ0IyUFlzUFFkT2dKTnZRa09rSC9Jb0VzQ1pCbGticVV0THZ5dUdWNHZhNk1pWUw4dkFDS0NrSW9MOHV4eHFUT2xJbUNUNzFqc3lKenR4dm5uMzgrUkZIc2Q3SHV6ZWJnc2hVVktKTjdNNHNLT3RKVlV3MkFPbWZPSEczT25Ea1A3ZDI3OTYycXFxb2JSRkdjeGwreVhLY3M3RlQxbDNlK2YrQ1pDeSs3OTJNRFVuYVh4dWJVa2dSSVprd1JvSzgvelhCcVZCU1lJb0VpVWtXUjRIYkpjQnRROC90Y0NBWTh5QWw1a1ovSHpINVdGV0RzbUROajl2T3NBeHVRSHB3ZlAzNDhKRW5xQnpiN1d3WjJWQkFFSWdnQ1ZGV2x6TDZGOU42L3Z0RFVxQlFSelF4TkFhaWpSbzE2ZmNTSUVUdGZmLzMxNjNKeWNtNENVTXBmZGx3blM1VGk0SkhXWTA5K1p0cFAzbWhLejNteVVFczRYRWtIbDlZWGVwcVRCR0pma1NEdDFHUzQzUkxjYmdVK2IzcjJNeFR3SUJ6MklXSkNyU3dYSTRZWFl1eVlVcHlDaFZMbkx0aUFkSHZIZWVlZEIwbVNqZ2R3L1NxbWhCQnFoS1pnblp1WmQwTjZHNzBHUVAzb280L1UzTnpjOVJzM2Juempzc3N1KzZMYjdiNkp2d1M1VHFoQy93ZGRYVjFyL3ZyWHYyNzc2bGZuZFF6aTBneWdFUk5vS2VNWHNYVitHck9iQUpJa09lNzhORSsrdGUvOVpJL3pQcDJIUko1VFlETlZVMU1EV1piTkNpaU1OV0NPSWFvSk4rTXRZZUFHUFMzclNDU3pnZGZKdlYxOTlkV05BSDViVjFmMzZzaVJJMmRLa3ZUdi9CWEo5YThxbFVvOXYyUEhqazJUSjA4K3dBQXRHOVNTRE5SVTlBMndteEdIdFd6Rk9NYmJmSjFRUlZGZ1B5RFNoRnB1Ym03R2lyelRlWnozT1EwMklMMUR3V3p2TUM4V2NFNmhxWEhEcmRDVXFacGFybzBKVFRYR3ZWbFBvdHJhMnJjQXZOL1UxUFJDY1hIeGwvaEp2VnlmUkxxdXY5blEwUERNeUpFamQ1bS9QRzFBU3pxNHRKU0RTOU9aaXhxLzJMTkN6ZXYxd3V2MUloQUlXSHMvQ3dvS0xLaU5IRG55dEN4ZTRXQmpWRjVlbmdFMzgyYWFvYXJkeFJtZ3MrQ1dTcVVvSWNRODhOSmVXTkFad0dXNE53Q3Bzckt5RnkrODhNSi9QdnZzczFmbTVlVjlpUkJTdzErdVhJUG4wZWllNXVibXA2ZFBuNzVqMTY1ZEtwTWZZM05wN051a0RXb3E4MHZYQXBxNUVrOFVSZmFYUFhXNVhCbFFNNWV1bUhzL0k1RUlTa3BLckdYR3AzcEYzc25VU1Z1WWZDcGsybW1uZkp6NWRvQnhMSHRhMUp3cmhRRTRHSEN6R24xTjJBSFFtNXVidGVYTGx6ZWtVcWtYTHJqZ2dtYTMyMTFDQ01uaEw5OXpHbHlPQzVNcHBZMnRyYTJQTFZ5NDhFK3paOC9lZi9Ub1Vic3I2M2RrTjlMTFZYcnQrVFJtY2JIVFJuWW9pa0lWUmVtWFMyT0J4aTVkcWE2dVB1WExqTGxqRzRKeWNuSncvdm5udy96dHhFd2daT1RoMkN1UlNEaUdwb3g3TTRmckJWdDRxZ0ZRamZBMEJTQjE3NzMzSnUrOTk5Ni9MRjI2OUlWdmYvdmIwME9oMEV4K3FDV1hBYlNHMXRiV0RjdVdMWHZybDcvOFpTK1RHM1BLcGJGaGFBcnA0NFZVUW1CR0N4cEEra1lGQVVwQWFQcXBTa0JCUUNtb1RnRktDWFFLYURxRnBnT3FScEhTZ0pRR0pGV0toQW9rVWtCdmlxQW5SYkQ3b3dNQURweFZqLzJuMnJHWmttVVpoWVdGanFlQURISGUxRzdnekJONzJSTkM3TlZUeTcwQjBMWnMyWkw0K2M5L3ZyZTd1L3Y1Q3k2NG9Nbmo4ZVFTUWdyNHkvdmNjMnpCWUxDdXBhWGxEOS83M3ZjZW56MTdkdU0vLy9uUFhnZUgxbStucHkybnBoSmlnZERJcDZXZmk0UUlFQVdSaXBJSVNUSnlhYklNUlVuL2NuZTUzWEM3UGZCNmZmRDUvQWdFQXdpRndzakp5VVYrcEFERnhTVW9IellNVmRVaklFbnlXWGt2enZqSmcrUFZ4eDkvaklhR0JqUTFOVmxUQ2gwZEhZaEdvNGpGWXVqdTdrWjNkemQ2ZTN1UlNDU1FUQ2JOVGZXRVhlcXM2em94TCtOeE1xY1cyTWtGaVZJcUE1Q1JQcnZBdXFxcXFwUlhYbmxsYW1GaDRUV0NJRnpNWC9abnY1TEo1UFkzM25qamhhOTg1U3Z2TnpVMW1TTk5yRU96RndneUhKb3gwOHlNUWhIemx5aGxLNTVtb1l3dEVHUXJFcGp0SEdiNFdWWldocXFxS2xSV1ZwN1Y5K0tzVzNKU1dWa0pqOGRqRHNlYmVZZWhGQmlvVVUwbHFxcGE0YW5aOTJhNk5TTTgxUWNJVDVNQWxJYUdCcVdrcE9RRkFOdjI3dDA3b2JLeWNyb3N5NS9uTC8relQ0bEU0bSs3ZCs5K2RjS0VDWTBNek5pd00ra0FOUloycWdFMXE5cHBnSTJheFFIanVVbVo1NjRGTkRPbnhoWUovSDUvUms2dHVMall5cW1kVFVXQ2N3WnNBRkJZV0FpdjEyc0J6dTEyZzMwUzJPSFcyOXRyQVM2WlRHYkx2VkZLS1dIUGVEUFBkMk9lbUNuRHdWbUFBNkNNR2pYcWRRRHZ2UERDQzA5TW1qVHBVci9mZncxd3dvOTU1enExWVdkVExCWjc3c1VYWDN6N2kxLzg0dEVzUUhPQ211bk9yR0YxSTQrbTI2dWRCdFJnVmp6TjU2dVRTek9oWmk4VW1PMGNadU50SUJBNEorN1BXUmVLMm5NZWUvZnV4YjU5KzNEbzBDRzB0TFNndmIzZEdxQ1B4K1BXQUwwWm1ocEQ5RWdtazFCVjFYUnZHZUdwc1hoR29KUVN3OEdaNGFsNXNTRXFHNnJLQUpRYmJyakJ2WHo1OHNrRkJRV1hTNUxFVC9IOUZFbFYxUmNQSERqdzZ1MjMzNzdycWFlZVNnMFJhQ2s3MEFDMktKQUJNOTJjZDJiRFR0YWx5YklNdHBYRFBra1FEb2VSbTV1THdzTENqSFlPOG1tZGorSmdjMVpUVXhNKy92aGpORFUxb2FXbEJXMXRiUVBtM2N6Y1d5cVZnbmxLQ0FNNFlxd01KT3cxQU9Da0xJQ1RBY2liTjI4dXYraWlpeVlIQW9IcHZCL3VqUDBGdWFlenMvT2xiZHUydmZ2RkwzNnhqUUdTRTlCU1dZQ20yb0ZtSG54cWhwdDJsOFlDemV4UE0xM2FRUG0wdkx3OEZCWVdvcXlzREpXVmxTZ3JPL2VDZzNNQ2JBRFEyZG1aVVZSb2JXMUZSMGNIamgwN2hsZ3NaaDEvMU52YjYxUllnQUUyWXJvM0ZuQk1nWUVGSEZ0a0VBMEhaNGRjeHZYZWUrL1ZWRmRYWCt6eGVDNEhVTUtSY2xwaGRxaTd1L3VsdXJxNkhaTW1UZHFQdmlyNFlFQ3o1ODVZVjJjUE9hbDVJQU9UNDJWZEdqdnI2Umg2c2syMzdNeW5XU1N3OTlSeHNKMkYwalFOOWZYMTJMOS9QNXFibTlIYTJvcTJ0alljTzNiTU90dXRxNnZMT3R1dHQ3YzNBMjRPN3MwTVQ4MHozd1lDM0ZBZ1ozNU0ycjE3OTdpS2lvcUwzRzczWlJ4eXB3NW1QVDA5Mno3NjZLTjN4NDhmMzJnTEY1MkFwZzRSWnYyQUJtc1BCeWdSQ0JSWjdoZDJzaTdOTEJDNFhDNXIzdFBuOHlFWURDSVVDaUV2THcrUlNNVEtwMVZYVjBNVXhYUDJYcDVUWURQVjNOeU1mZnYyNGVEQmd6aHk1RWhHYUJxUHh5MjRzWWRYc25CakFjY1VGd1lDSERIQUpqaUVxWklOYXJMdFk5TE9uVHRIVjFWVlRmQjZ2UmNUUXNaeUJKMDQ2YnBlMTlYVjlkcWVQWHZxTHJyb0l0YVo2UXlZQmdLYXlnQk5wWlNxUnFYYzZuRTBONld4UURNcm5icXVVMEVRNFhhNytnSE5IbnA2UEo1K1EreG02RmxRVUlEUzBsSlVWRlNndUpodmxqd253UVlBM2QzZGFHeHN6T2gzYTI5dng3Rmp4eENQeHhHUHh5MjRPWVdtV2NKVEMzQU9PVGpDT0xpTVhCd0RPQ2ZRWmZ6ZHhvMGJpeSs4OE1MYWNEZzhRWmJsaTJGdHh1QWFvbzZsVXFuWDJ0cmFkdjd6bi8rc256RmpScHNCSUgwQWQrWUVOZmFFalg3RkFNYWhXYmt6Tm9kbUZnWTBUWWNvaXZENXZPendlci9RMDRTYTMrL3YxOHBoaHA3RGh3K0gxK3ZsZC9oY0JwdXBBd2NPNE1DQkF6aDA2QkJhVzFzSHJKcXlvYWt0OXpZWTRNQVdHV3lRTTUyY0dhYUtkcGc1QVE2QU9INzhlUG1SUng2cHFxcXFHdTMzKzgrWEpPa3pBUHo4YVoyaHVLcXFiMFdqMGZmMzd0M2I4STF2ZktPcHJxNnUzK1NJTFhUTUJqUVdadXovbzl1QVpqazA0NElkYUdiWXFhb2FGU1VKQWI4dkEyaHNiMXEycXFjNXhGNWVYbjdXbk1yQndYWUNGWXZGck5DVXJacWE3czFwcjBJVzk1WUJPRjNYN1ZWVVpBbFQ3WkF6UTFVckwrY0FOc24yZDJKRlJZVzRaczJhWVNOSGpxd0toVUtqWlZrK2p4QXk0aHpMazMyVVRDWS82T2pvK0dqMzd0Mzd2dmExcjdVME5UWHBObGZtNU02eXVUVHI3OHhtYk52bnlJQ1p6YUdCclhLYXgybXhoWUZrU29Va1NRaUhnaGt1elF3OTdRMjNiTlhUREQzUGxkNDBEclovd2IyeFZWUFR2Y1Zpc2F3OWJ3NjVOd3R3cG5zeklXY1BVeG5BT1lXcTluQlZ0QUhPNlgzUmZ2M2lGNy93WDNIRkZTV2xwYVhEL0g3L2NGbVdSd2lDTUJyV0t0NVByUks2cnU5SkpwUDFzVmhzMy83OSt3OCs5OXh6TFhmZGRWZVBDWmhCWUpZTmFobnZNODRzSTh4a1EwM1k1b21adzAySXBRaVhBQUFHR1VsRVFWUXRtREV1alRLTnRrZ2tVNUFrR1htNTRheTlhWUZBSU1PbG1hRW5kMmtjYkVOV1YxY1g5dS9mYnpYMDJudmVzaFVXc2dGTzA3VEJBR2QzY1NiZ2lBUGtCQWZJRGZhKzZPQUdoZlhyMStmWDFOUkU4dlB6Qy8xK2Y0a3N5OFdpS0pZUlFzb3g2RXJ2VTZaZVN1a0JUZE1PSnBQSjVuZzgzbnpreUpIV3VycTZ0aTkvK2NzZFlBNG1HQVJtMlJ5YTQvdjI1RDhMTS9RdEFLSnNNY0IwWndBZ1NWSS9vTEY5YVd4eG9LYzNtVDdFb1NDL1g0SEFxVGV0cEtRRXc0WU5nOC9uNHk5V0RyYmoxK0hEaC9zVkZ1enV6ZDdVYTA0c09MZzNxL2VOQlp5bWFTYll3UFRDd2NIRjJTRm5BWXFCM0dDWFlIdGZzTDF2NWY5Ky9ldGYrOGVOR3hjc0tpb0toa0tob05mckRTcUtFcFFrS1NpS1lsQVFCRDhoeEU4SThSRkNQQVlJelFNQXpNOEpCZ3pXMmpoS2FRK2x0SXRTR3RkMVBhNXBXa3hWMVdnaWtZaDJkM2ZIT2pzN284M056YkdkTzNmR0Z5eFkwTTNBaTlwQVJnZUFtVzV6V05wZ2wvMjh2V3d3WTBGbXVqTm1TeG9GQUVWUkxKalpXamd5aWdPeUxLTzdKd2xGVVZCU1hHQTEyOXBkR2xzZ0tDb3E0aTlPRHJaL1RhbFV5aW9zSERseXhOcG5PdFNtM3FFQ3p1YmlXQWMzRU9RY1ljZE1Qd2dEUUUxMEFKdjlZci9PUUJjYzN0cmZ6MGlET2J6UHZoM29zb1BNZm1WemFmM2VONDkrZDRMWVlEQXozN2Z0MUlBb2lxQ1V3dVZ5WlFXYXZlSVo3K3FGeStWQ3hiRFNqR2JiY0RpTS9QeDhGQlFVV0FVQ1daYjVpNUtEN2NUcDJMRmpPSGp3WUwvYzIxRDYzb3laVTN0NG1oR21HdTdOZ3B3eHpXQ0Zxc3g5c3Vma2lBT0Vzc0ZPeUFJemNRaGdZd0VuT0VCdElNQU5CRGM3ME9BQXNZRWNtcDdGcmRrVCs0TkNqQ2tBVUZ1WWFjTE1LZ1F3RmM2TUhSdWlLRkpLS2R4dWR3YlFKRW15SEpxOU9CQ05kY1B0OFdEVWlPSDlLcDVGUlVVb0xTMUZLTVE3ZWpqWVRxSmFXbG95M0JzN2tqVlFhMGcyOThhMmg1alZVNXVMQXpOMGI3bzNlMDRPRG81dVVPRFpxckZPUUJzSWJzZmozSTRIYk1jVGRqb0NqcWxPWmdVWUF5OFdubUJ6WnVhZjJUQ1RYUTdFQUkyeXVUUktLYnhlYjFhWFptL2g2SXgyd2V2MTRmenphcXh6MDB5WGRpNGNMOFRCZGdicHdJRURsbnR6S2k3WXE2ZE9yU0dwVk1weWJqYkFRZGQxNGdBNDFzbkJGcXJhM1p6OXozWW9aWFZpRHVFdUdRUnMyVnliUFNTbEE4QnRJTURwVG45bW9EU1FzN1AvUHhsZmkvMnpMZFNFM1puWmdFWnRsVTdyYkQ5ZDErSHorUVpzdEdWblBOczZZZ2dFZ3BneWFhTGwwbmkxazRQdHRDbVpUT0xRb1VQOWlndHNlRHBZL20wQTl6WWc1TXhpQStQazdHNE9XUnlkSFVSTzE2RE9qQTJIVDBhT3piWlVodzRSZVBZTHRpUGRZUWVaM1pXWnpvekpuMldGbVIxcUp0ZzBUVU13R0J4d2FKMXR0RzA1ZWd6aGNBNnV1UHdTbEpTVVFGRVUvdUxpWUR2OTZ1bnA2UmVlc3RYVG9iU0gyT0ZtbTJCd21rZTFRNDV0SFlGRFhnNDJLTUhCMldFQUp6YlVmSm9UekxJNXRxRVdFdXlBd3dBQWd4MWM5andaa3krRExXOW0zME9iQVRPMmZZTmQxRzNQcFdtYWhuQTRuSFcrMDZ4Mm1tSG53Y1B0eUk4VTRMSkwrSXJhRXltSlB3VC9tandlRDZxcnExRlVWSVREaHc5bkROV3orVGNUY0hZSE4xRDExQUZ3bE1uREVSdmdxQTEwNWtWTm9GRkt6Y01HMlY5b2c0TEtDWVlEd0d5b3B4blNvVUxPWVMwaWJDRWwrMjh6M21lY21TUElISUJHN1V1M0J3TWFlMm1haHB5Y25INWIxOW1qaGN5aDlhS2lJa0NxNXk4aURyWXpWejZmRDlYVjFTZ3VMdTZYZjJQYlEreUFzOCtlWm1rUGNRcFJxUWsxVGRPcy9Kc1Q2RXpBTWE3T2hGMC8xODVBYkRCb1pRUFlKd1ZiVnNBeEo3LzIwYmdQZHJBNXNneUkyY0xNZmlBek42amJROC9Cd2s1N0RzMjhWRlZGZm42K2RheVFIV2htSG8wUHEzT3dmYXJrOVhwUlZWV0ZrcElTSy8vVzF0YVcwZi9tVkVFOUhnZG5DMDh6M0J5YmczTndjSGJZbVhCajMyWkFqLzI3VTVIQ1lCMlg3V1A5NEdWNzZ3Z3hCNkJsNU5CWXFObkR6c0VjbWoySDVuYTdrVXFsVUZKU2t0R1BscGVYWnpYWnV0MXUvaUxoWVB2MHl1MTJXOGN5c3dVR3RvTEtBdTU0Y25BTzdzMnBUY1FPdW40RkI5UFoyUUhIL0preVJRblcxZldqbWhQOGh1TFVuTTdoWnovR2dzdm14dXp1TEFObWJJdEdsdnlaWTdnNVZJZG16NkdaVXdPcFZBcVZsWlhJeWNuSm1CcVFKUDVTTzVYNi93SEYxRm5aOGoxaXh3QUFBQUJKUlU1RXJrSmdnZz09Il0sWzEsImRlc2NyaXB0aW9uIl0sWyJzcmMiLCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQVRZQUFBRTJDQVlBQUFEcnZMNnBBQUJNQzNwVVdIUlNZWGNnY0hKdlptbHNaU0IwZVhCbElHVjRhV1lBQUhqYXJmMVp0aVc1bFdVTC9rc3JvZ2tpcUFSb0Rpb1o0L1VnbTU5ejRpaU5SdEk5SXZ4bG1sSUwzbnV1Rk1BdTF0b1ZydjMvK1grKzYzLzlyLy8xdktta0srVzNsbGJLelgrcHBSWTYvNmozNzc5Mi9uenVkUDQ4LzhYeTUxL1B2Mzc5K3VzYmdiK2puL3g5NCsyL3Y1L08xL00vZitBZjkzakd2Mzc5cW4rK0UrcWZDLzM1QmhmK1BZRjM5dC9yN3cvSjE4UHY2MC82YzZHMmYvOG9yYjUvZjlUeDUwTHp6d2ZQby96NW5mNTZyTjlmL3Yvclg3N3dza29yYzZNWXdvNVB2TStmNmZjRThmZTc4L3M5ZndZKzkvQzFIbU1zRjM4OThmMXpNUmJrWDE3dkgzL2Y5OThYNkY4VytSLy91djU5OWYvNjE3OHRmdWgvdmg3L2JTM0xuelc2eTMvOWpTZi8yOWZqWDdjSi95SU9mejFSK05kdjNDSEYvM2lkUDcrL2I5WHYyNyszNjBoaFMrV1BSSjNGZnY1eEdUNDRXUEo0ZnF6dzYrVjM1dC92K2RYNFZlOStUN1o4M2ZNZS9KcFBld0s3OGwxUGV0YlRuKy9aNSsvNVRCNHhoUjFlL2c1aGhuaStWdU1iV3BqUmZVcitlcjd3eGhaWHJPemJEUHRpNjFJTWZ6M0xjKzdienYzbVU3bnpldmhvZUxpWVcvM2YvcnIrZDkvOG4veTZ2bSs2Uk05ZC8xb3JuaXNvMXp5R08rZWZmSW9OZWI0Lys1YlBBdi9qMTUvdHYvOG1QNGdxTzVqUE1sZGVzTi9qZDRtUm4zL0tWano3SFBsYzV1K2ZDajNYdS81Y2dDWGkzcG1IZVNJN2NKY241cWM4OXh2Qyt6eXNZMldET2s4ZVlncURIWGh5RG91SFJGNWlDZGNiYXZEZS9NejduTStHSEVyd3k5Z21OaUxIZ201VmRxaXpXU2xsNU9kTkZSbnFPZWFVY3k3NXpmWEtMZmNTU3lxNWxQSVdqVngvNDV2ZS9KYjNmZXZiM2w1alRUWFhVdDlhYTZ1OWhSYXhnYm1WOXJiYVd1czlYSjBiZGE3VitYem5LeU9NT05MSW80eDMxTkZHbjRqUFREUFBNdDlaWjV0OWhSVVhabUtWOWE2NjJ1cjd1VGFXWXFlZGQ5bnZycnZ0L2lGclgvelNsNy95dlYvOTJ0Zi8yclUvdS9vZnYvNEh1L2I4MmJWd2RzclB2WC90R2wrOTN2Y2ZsM2cwSjlrOVk4ZENldGp4MXgxQW9JTjdkdGNucGVET3VXZDNDeWhGRGp4a2RtK3U5YmhqYkdIYVQ4amY4OWZlL1hQbi9xLzI3Y3IxLzJyZnd2OXA1eTYzN3Y4Zk8zZXhkZis1Yi8vRnJpMzkzRHc3OXROQzEvU09hQitmNmFGZS9MNXYvdmpyYng2cDdwN0w2SG4xa1dkZXFhTWk5NzdmRjRmeWNObVpZbjkzdjFOWU82VXZocFRlSzliUWE4Wk81YStOc2Q1N2JOYzhzRFp2K3VwVDhGclBkcW5penBVMXJuMitiWS82MUw3ak84dkhoM2R1VjRtNHlCRXdaWVZscjJGekU0eGYvN2hvU3l6QnlPL3FmYzMwM2pQdzFud1hieHZZMGR4YS9ZbytPbzc3WXNPL09ubVorTDVmcVd6RDJobWZIc1lJdmV5TVJ3UUlQTHhsbmFPdHROTllMZk9jdVlYTXBuN0lFd0pVcjRFUlhwWG5DcW4xUFYvZXVlYjFmbThyOWV1MWpQWStYMEVvSXErNVcxOGRPOU16Ky9IdVozQ2hOMjA4d1hzOTdCNHVvdll2NTQ4djFQeWw4ZDFuVC9IZ2RjZTYyVS8ycnFlRW9JNVVTd2hydHZmRncxUldaQjNkdWNvN25sMTR6VmxIaWp6TllBay8xQUlkd0g0OXBha01uMUw1N2Z6bCtaWEpvOFZudDd6MnF1K2VIMXRjVUpGNWYzM3R3ZDUrTWRZNzl6QlN1dG1kOTVsMXphVVhXdC9kZWNiOERsNXZmVWhQV09OYisvbG1yeXU5Kzd0NGlxeDQ3UGNwNzNkdmZNSEx6OHhSMm14WXlQZDk0c2F2enBCdjlndWREM2ZKZGFQckc2ZjI3SW5FUFN0Y0kwMWVrajhpdCtvKzloZm5qWmNiM3JPbFhka3lkaTZ1Kzlzam9Wbzk4WWc3c0lNWWx6SkNyU0d4L1JPUmFDbjB2VldudVQ3V2xsdVArYjBvM1U0RnVZajM3clBpZFhkZ0M5QzV3YzY5TGgxWHcvWWdGL25DUG9Ua3hTcHFGbmZ4L2R0dXdiL1hOOC8vZjNwaHM1Nm5aVFM3M1RFMmZYZ1liM2kvMkhkZUk2MXJMRjRtM1BWTHJHRmlEenNPS2JjUmUvdFFjT0J1VzJOZ21DYmJ3Zjh3Vm14VGIvRWJvV0Nwa0tuVTN0d3ZmTk5DTXdjN0hWSkJxZ2VHQjdBQXNwdklGelp1YllUanJldkxBMlVaZS9LWU55L2xEU0pyMitabXQ2K05UajF6RlV4YlExYjd5bHZkZjdGSTkrQlJFS0cxUUl4ejhyRTNIRDBzV0krZXhoeiticXYwOWFDMDJpYmM1NDVlTGN6R005MnJwcktScjRhdGlieDFmN25MZzB6c2pxbGFxN1FXTUZBcGxkcnZ2TGdPeUw5aXhQWWNEeVlaUk5YQlZ4R2JJaTVlNmR0UC9saFdWZ3ZKU2JraU1hM3hrYlhxTE9sN0VOUVhGVTF4UWlFKzNqUnJUQkhWK21Jd3NBWCtMOFRCNXM0K1o4UWZvTHgzVGhnbDlCZ2wzOXc5THBUM2V3RjZvUTlzZHJ2ZFl2UVQrTVhiOCsrWSsxMnd6YkgzdDk1alloZmkzZG8zSzR2Q1U5MjVZVTE0aFRsQi9yRXNsdnZDek1YTmpzeGNucFI3VFJqcThLUTNJSU1kTHFDSHV3dUxneWZJZzQwYWhlY2N1d0ZXeHV4bGxZU0hBRVRVbVBKNGNrVFVKMnBYc084VDNMcmJmTit1TUxIM3JPUERzaURzdlBsdUdBM1cwVjNFcDdFay9VWXZMcGE1cE1ETEQyMUw0c1ZRSUM1MmYvNTRYaXhmd2dFTlJHVy8yTitNU3FMMGZLNDJibzZ3aDgwRjl0VzRZNHQ1cnJjTzFCem5zSEJ5dURLRUR1L1YwZmZZNTUxS0tNL0h2MnY1VUY5TU9UOHhQOXhGM0R2anhhRlpHNXVYRTUvQUFLWStzRTY4YnVVdlRENWVBdUY4ZTZxajNCT0ZCbVVETmpGeGVYd0ZiVVlpTXo3andXV3ZoUnRwWGg5bm05N2FlbVpWMFFoV0Z2SEg2bUtHZmVmQk15TmhyNUx4ZklNbmEvVjQzdlcxV2E5SEN5S3c1eG5SRnN4NUx3RkJ3STY2L0E4K0d5ZVJ0SWpOVmVUYkJiRFBXN0RTN0ZoVDBsNFpwRnVNVVFOS1lIa2p0cFJYeTFoUlZpYS82RCtDV1ZyR2tDTSsrR0YwclFxbnY3bGJTWURSa2p2T1pWelNndzlHOElZUlpzVUF5VlhDOXVJZG1VSmxrSjVVUGtES2hpdjBnWWdqSDBYUDlXSE1jWWhMYTMwOXFPVVJwWFhqejlhSDJyZHYrWUg3UXhLaEVBVVFrR0NtTENieXhZOGhBN21pTkI4cnpSODM5dll0MTFzbkYwY0pWd2U4N2JleUl3cmRNeFl1ODFiZXNONVR3SUF2akJxMnIyYzgyQXg0eHc5UitmYis4Q0s4SytnQTRJSVJ3b2hqOFlCbGoyNmQ3V3Y3Z3gwTkVNOUNLRUZCS0M2QzhHMFdQN0o2SDc0Qng5QVJodXZHQ29SM0RGejBERHpqM1dOUkZWa3NTQUtQMnBDRDJZb2NXQlB6WWNBQk9Ed1M5OGFWWWtqdzdSSGp2M2paamRGSndDVllJVGRhZU8xajlNZUdaUDM5SnhyS3picC83NUdma0F1N2dZWlhEUGVGN2VVaURTZ3hwRVRsUlZ0QkZHOTlYTlZieGVkR1BDdTdFU2FlVDBjTGF2eGFqZ3BPeGcxaTBGOEFPeVlVQlh1ZlVQQUtlQSswbGdzQXk5Qlp4SGgvZ3hYTEdLRGVubmV5K3FrOEQ1Z25nVGg1SWxaUWczYTlFL1BMT3BaUFUrbEs3YWNDSDBabDYzc3JlYlQwRnFBVzBvaWZIamp5K1FEWXBqR0NxcmlpM1R3WFFHdlA5dUVBRmV3RjZzR2xjR0hVRkNlUGlSTTVndDJ3VDAvSEZVajlVRHBzVlB0dXR2RURmTU9Obm5JMW5BWXFnM0haQmJERjVvQWZzVnFaalgzQU9NMTM1MllWZzg0LzhYMlFYY3dsL2pHT3dpYmphUkhBZENIdFNGbGNRVU1PbW4vVGdpRUNWc1E0b1VBcWNvQktsSXhqdUpWdGRBaVpQOGdETkFFdUwySGdsYTVibUlOb0taTVF4M0dXSGhkWGdhWW85WU92QmdLK0dHTitQSlNXbG55UzF3c1pnY1gvSWNaM25lbWFGVE8xVmU4bXdjZER4L3VOMEZYV1RjU1IwVXpFSFMvT1ZvTlhjcGh6QXdyeGlZSEwzQ3c3TnFpVks3SUhXTGdHL0FNN0k3MW9PU3Yxdks3eWc1NkhoZy9EK0FZd05nUVB1UHNoZWVLdG1yazVxcFVnVFB2cTZCUXdJUmVjV0FJeklBZ29QcThGT1lZYUpZZ0hkMEh5SjJDVkhaL0lGWmoxdzNOdnZBSGZPVngrWFZpbXg4akpDeVg1eDllUHZ5NTFQVEtHOWZzQUZ1VHZINW5IcHYzdEo2Ly85ei82cno5NW5SL2RvK1M3WWd4N2F0aWVDSnFjWTJKT1lTbUk2SVBSaFphQzlMRGZDR25MRUlDWEhTcWlrZC9iWHZOSUs5Ymh4ZTIvOCtBQWRMVCtZeVYrMzRCRitDMlY5MEFaVE5ETnphS2F6eTNuVGhjQ09QRnlvTCtBSG1GdFhpQXI2b082SHVUSFBrSms4Z3NkMkYySGt6SHU3S0M0SFVCWC9mUERNMStMN1VHNzN4VUVkZy9NQU1VT01zOGN2VFdrWmVEbWNXOTR1dyt2SkU2TGdNUTNkamowRFJBZlJqb3VjSERCR1dPQnNac05nY0dBaHhlNENLWm1LYmduZG0wQWNnR2JQR3BNY1dnVEVxaDFwTHVCYWhOeTNPTjFieTRGcWNHUGJSWm5vQzJzQk9hUGp3VEpJSzQrUkZ3WVZvbEhHYkFqckxEUlQ0aGpiM3VQdmRhbzMyWG9DdUFxb0ZMUDBTelVEWjRjV0JBWU5adGJFbWF2cy8wTkdaMDRwcG1mTU1TbjdEUFVHMk4wZi9tcWNHdUFKZENndmtwSmlobjNCUHY0S3A0NUQ1eCtydHh6ZGhGWVNWS01oQ0dhK203czBvSTJMNjU5VFRRU1NsamZJVHBpalhDV2NUenBHOUQvUGxnMWVQNkh6TUNTeDFmeGRqc0hIQlppMVdTUkQyNityUEZnMkxqekIrd0FqZUJESUFqdm01OThLQVIrQWxTR0NQWENZdDBpL1RkTTlMNjlBVjVRUlNKdzZ3UmtYeGVxSGZSVUJidUJ0SDFmKzRQSEFPOXhZNWphRVZoZ0lkWXN3bmcvWE5QODhEdm9pQnl4QXRUWnp5dGovUnF3SDZ6K3BNQnQ1ZUxuaDFHS0cvekE0K1hJM21ON2VDM2VuMzFubFo4TUZvcEE4WTRGRGUwRnNiRWZRRTJlQTFvQjJVS3FOb1JpcHdSNVlVZUN6QXVVOG9DY01KNll4QWc5d3RtaHVDelhEZVNTb2x6RlhjZkRBWFIxbkJtbUpibzNwaWd3TGVnZnNBR1V6dTQwT0lBc21wL2xIYll1YWNKOU1XUGh1WDc4ck9MdG9KYTd2MndUb3BCNWQ1VDFabFZ1VER1MjFUQUdEQjZ6Q1ppTE9NQ2huMDI4WGtxbzdydzZJQnRFaGs0VWJTK09DSGpUV1V6OENZNUJ6b1RvWWVqaE14MUVDQk9GVGtpMjJNNEhhQVhrZkRSc0NUM283eDRzUFJzeThLcUdIOUNXRFBERGMyRW5CTU0za09jYjJBQnNUeEFuZWowZUwyRE1XYjN5WG1VamU5c2NBekNzMyt4U3llOUJoMi9HdjdGRU9OWlZXUkxqYnM4TFRPa2JHN0x3ZExPQWpockVtblcvUU5aWWlpQlpLdm5CaVJvMUFhYkEyTytXSDNYemhNTEV2RGpZd3JPM0ZjTXFBRng0Q2VqdlpRM3ZjcTNxSG1TbGNIVE1Sb1hpSkw0SUJJMlNZdkFOc0czaGpZYVNBdHlJaWdXaTlPb0gxUW53ejQyS0hDWVBtTUpVOFNCcnZTQjZsQi9oNEw2YlZjS0pZYzRDQ2kwWkc1V05CY0hOVzdXOTN3RWhoRzdzQzRJTDlrSFV3ZGY1L011ZGcrT3pZcENxZ0kxR1lQa1NXTmVRNHR3dk9CZWJuc0V1aGlSUVhBUzhYNENZZ0YvQUM1YU5QT0NLdFZ0VG1NRHl1ZXlvVGw4R0NtS29idzRxY3BlMnNtNExFUXlWRndQNnNUZ1lEVVFNdFVSY3VUZXlFUnFNSE13R2FoQ2xWR3c4SGtxdml6MWx6WkNNelRibWdUSFJoT1BicjVNNkFhQXZzUld3Qm16NUhTZ2RjQ0RmMjNIdXJDRzYvQUVPY0pPZjRmWVhIS2tDQVg0MmN1Sy9UVUpwRU1ieFo0TmJJZnBZZm9CV1FMNXF5TytFTFhXOERsNElLNDJkbCtrQkdQazhKQUtXaVZLOXo1VmcrVGphdHU3ZHE2ckFOcUlEckdMSUlqak1icm1CS3dOZXQ5bkhKUDJHb2Y3alNmN3hJTmVmSjBFUCtyR0tCbjBFMVh5SzNVRkl2N3hPZkplMWhnMFhTRFBZQzhWaWRlSmROSjYzRHYzS01GZE1yczVBRXQxUWJYNmcxSUpBWTdaaGM0akFnNmJmZmNsWnZ2TG4xbmp4OVAzejl0ZmY3eDgvd0sxb0F5TEtBcDBGN1N2ajBnRzZCbG1rUWMzb21ORS9CYlBINTJ1WXROd3ZURnFTaWhiSWZ4TkFnOEZiZERGbHNDOE1EUG4rak9nbTZhQ3hJSmdqdHBVdE5jUjlGbjIwY0NVOFVPQ3hmRGZNTnFBVi93YWlEcytJUU9JQWoxUm1jYWI1T1NMellzV2hWTU9jNE4vQ0dwZHhqZFlibmdIZmNvUmdISkFsc1AwRHQvNXRmLzdyN2JuKzJoOHQvd0NCNEN6eWcvK0YzK0JaRjZRSEd3YnN5TFZnT2xJNFVjVWJwTERuMFU4ajZTakx0YkNRYStiS0MwekRCZ0hsWWRNYjJzYzJicnhVbEZzY29MNm1pQXQrTm5CNzZBQVB4eGFEVEZoWUxPUytIeUQ5MHpvdktNM0xFM3M0MEV5TWJOREh3MGw1NmdlSzYxN2lZOS96cW8veDhyMzdUMW11dTVRNzdxckZFeGd2dlB0RUd5RzFrcTRURTRPWHlScll1eE9kVG51QU96NXN6RjVWNW84Q2xIcE5IQ0hLWFRMd3B3Q1RFSVEzd25OQnFCQVVLSGRmVDNCdEIxNk42L085VlFXdWZDTHlUT3dydXJrMEk0anlQV0RBS0JSbW1MWHBFU0tNbTB3UlVJSGx1Q1Zhc21EZUh5dUUxUVVsU1lDZVZlSEtHM2YwakF1RU53d2FHTjFIWmhkcUpOVjh4MmQ4R0JRTWJPblF3aGhpVWRrTldBL2o4SzlCbEtYeGI2dUVkU0hOTUdtRG5Ed2prZzFkZ0thT2IyWWM3YU5aNkJXeWdLeGxLTXFlMHFHeXNaUEdwa1BTbmlKVkkxMUd6bHBubFg1N1d4dE9RQWdIcW1oUWQ3T3JyQ0Uvelpla3B4aGhRK25pdXNERmNaVGdLL2pLVlJzVzJEVDMvYXBMb3J4dkYwWFlUQVJNc3FPQ09JcVYyc2J3c3pOQTA2NVMzRkJsdkRyUGlud1lRS2g0aW5yamJpclVxT25raGlRS1JJKzNpUk1VQTdQN01zdUNnWTN6Qjd3Z2VSR29rbVlBOEVNbzZoVkVRaER1bGNGUCsyQTE0T3YzYmlRYVVpd0kzem5pOHlGbkgxcXc4Ym52QjVUaEpoK1dISk5UOEpoVHhKYkJIK3JzUE9xNGpTMFhWZzI4T1NlMGMrQWpqQUZEUW5HdllHTjR4c2RGY2VHWXpGWnJpZERRQzE3OExwZGQwYTA0RGZnUnEyaUFrNFZQT0dXZUZ3K3dZaDlyNTJXQXc0MVBPck9HRUppb3h0NWY0Snh0M0NFMGJyaGtMM2xVMEUweUFZQVRPK0lYUG53c1duaVhiNlBhS1R6b2Z0WG56VGRXZ05LYVY5MjRiMURZbDJ0Q3NjRE1DTzhOOFgxZ05pdHh1N3FCT3hEdS9EN2dINU1uY0RVdzJNMXRBQXREM1dueE1qUTBaY2NRNm9DdHdEd2x0UmlTZ0dEK0kzUmZzVTFQaHRpKzBFaDBialhFUndlUVZvc2dqU2RmQVMxeVlUZGVlRWltOTZ0MTI1aUNEREsrTzdnVWZ3cnZpMGEwUUxJYkMzaFhjekdGSmZwKzBQN2tSWkJnby9PUEllMG5KYUF6QXNVK0JoMHkwZzNPM2RLQ1J6ZGw0bjdNOVFCSmNWTy9uQkpMbks4aEdETGtnUkZwaUJ2YWJqRHhSSStCSlZKWUVGWXZFcGtRVVNIZUQ1SEZ0Y016dExwUVg2U3FYeGlVa1JBRVZnRi9OdlBocjF0bkFMaUlRcldGSEdKM3NSY0w4OGJydzlJU3VBaWZlWnM0ZUJhVWFGKzZTendIMndTSGhvYTJwMFlBUENKeWcwL3lFWGJJTDZ6dzQ0RmZTQ0FmUUdLNWIwYnVRZjVnUlJ6WkJYcGNieXFEYjQwSi94NzhSalc1aEtIbkFxb0VSeGovdUxHendNY25MK0g0L1Z2aXB4cWdXeXc0K0tpYXQ5ZWNpWE1OdjJoMHFrYkpid0J4bnR1ZzI5MTF5WWFsMEg1WTJtNXhQWGxHSlFIbHVNU01ZS0tOMFVSV09oQnFwaStFYm5YTjFwMXJ0K2FTR2d5SkFQaVVaY05oY1MrTWNZakJqRW9HUkZTd1pQOFA0UlBuLzIzZE1BaDhNR09ySS9BaG9vV1ovOTdYZVBhZEowK0s4VzhtcGRDeEpkbXl4Q2ViSkdXZkRURmhGZmNHNjBNUEJDYi9manNFOHNjRDQ2VTR4bi9lL2NGVFlDbnJNSTJrU0p0clN5Y3FBaitCZE1TVGhHTFhhOCt4Ui9OK3JZZnhYcCtGTGJWalAxSFIyOWcxUk9NRi9KZit6OXVkdTAyREFGdDRPdXVCRUR3UTNuUGh1d0JQRjhKZkUzZ2Y0SVE1eDhzVUF3SjREM3dxZnROMFg2eVloMSt1RDdNWmtzOHdOL0tCUWdCVnh0RFdYUHpiVDZZdllpaTNBZnp2WkFsOTE3TWdmeTBIK0pnSGlUZHdQT0NDc1cyNDFsWngxWERrKzJLSHh6M2h1cmp6cmFpQk5iV3ZrbzErdGg0OGhkbHIvNGViWFArNFN6NFNBVWptM1lFR2FMVUxEOFpENFRDWXVMc09UOG5uOFYvQS9NdDJBQTdteWZMaGZDN2diUnpZNTR4dmVqNFVHb3ZzbXM2VGpmM1hCL2pidHYvTGU4WWFRUDRzRFJ3REl3Rml3b1ZrVGZHSjZXQXlHOXVDRFVIWlFaZEdrYnFrNWUrN2gvWEMrdlN4TDBnNldvbFV5dEFOT09LWEkyWVZNWmJzakNkQzVORkY3REc4NTMyQnYrQTVKS2RYNUMvcXZrenhLWkQ0YnpZQUlpU016bFdhTnF1R3pqaUNGQkZZQnJvcVg5RUdoWm54UkRqdzl5OVFXaWFROFNyQ3VmRUhtcU9WRTRxTFA4VWxRNUFiMmdRVktDK1diVXYvYnBPRnoxR0NabUprUDloUmRIYysxNUJjR01xQnd0enhYdWptTU04SzFvVE5taHpCaEpaM2M5Rzh6d2FBUlQ0enRaQWhQMzFqUExBb2x6NXZtT21ZK0lOOUloRGNqMlhHeDZmNjRXNHhsU2JKd0NhTlp3UTVyY0x5c3VLc25RVmxHYVRSOTJYQWNuMG1ia3J2WEFWbmhJaU1lbWRaRlR1QzZaOW8wSy9LWmZMcTIxZ1lQamF6UWRVOHZrWVN1cjRUeGlQd1hpYlJYK09kNFBScFRka1RQak5VOG9yZXNaWGJJQnY4MzJqWlNRVWE2Q3JyYWV3UHFMWUI4aDgwZnhnOWovMEJFTEd6Y24xY1NHZGpKcVprakNQU1ZVSWhpREFTemNydllPWTRocThIdkVnNzlZbHd1ME1sUHJqbGhMc1ZUR1FHcFVXcjZmZ1paQzByS1ZQSlI2WndhOXorUzVnU3J2Mll6bEE0VFRWSGxwMVZnU3hiaHZDTGFZSDd1NVVqM0RzTmdCNTcyTER5TDh4UlB3aGdCdFVDTFo1OVJlQWxaQ0dEeE9SNG90MjNJWGxKWklodkxTdkRxMXFZNlFTbjJFeUFDK3lETlRTK1h2UEo1RDJtNlJ0MExCWFRHY2FvOFMxY1RFdHV2WU4wVlN5cytjUEhyRU9WWUlOZ2p2UWtCSjM3NDIyeGtkZnptSFNva3gzQVdJeGpXOFBQKzhLanVPTWI0SU1MaElDSUFIQlJhTVRydFdnbWZnQXpBQW52SFBjRlJ2QmJxSk5xdytzaGpMTjNKQjhvQmwrdGVMWnZRZUdXZ1k3OEdMSlMvLys2NDdtZnlVejkweERpb3lUb2RjVHg0TEFnL2pIaGJzVmhpVjJER0NCSCtIU1RnUG5GVTZNQmo5OFB4a3UrZmpYOE5ONW5BblhhKzVqNkJDV0M4WEEyUXFCUWpBTHhMbENXdUZHa2x2QlhKOWxkQVErZ3laR0tNT3JpVVlCd0E0dUREdDVZVThnQ05HcURBU3JZTytYNFlMYVEvMmNOOXEwY0hnYktRWW5CNFA2NUVKaUpQZnBiamtIY0QwQkt0NG5vWDhidnh4VWp5cHpMNFlxWUdmalJCL1FCNUpna1MrOER3Uy9YMXdjWUtpMWVDU2tDSWdMU3A3YnpPWWtIeGRtNm9CdWptdzB5Z3preGozbGpKdzJyOFB3WStyb25oaTNrb1o1dU1XMHlWN3RNdTNmTE9VQ0NTR1FVdExlbDdSUm5Md1AzM1NEaFNVekdYOHIrMHZGSGpPVUh1TTNscERSK2JQN0J1ZTRIQk1iM3Y2YVIrcjJNMG94d3ZMb0JNVFJlQS9xTzBsYVVITitiSVNuV3ZTQ2tCaTd4aVR4L1J5eXl0VXlnRi9CQnJnQ2h1azRCTlVDTHI0RGg0YTVKTk5KTWVrUlVKUFZYVHplTnpnRmFVNDl2d2lJaWdZWWhlU3VVdmNSa3JBNXZQWUJJMGJEY1l4WVJRbnhGODVQc1RyQktSY3FLalZZTnhoaStoN1JCcnhLTHNWV2NTTVhaWW1DeExqaTdjcTlmREtDVUN3c0NyVGdMRmtvK1A0UVJnT2dCL2pDL3JBK0FBNXVCYU93RjhBY0NBcUVtR2phd0pwZ1M3aHRHWFNCL2ZLSkpBTmxOUlJSV3g2RVpOK0RkYmpsQ040akJicUhYVm9weHp3UytFbTZNdjczNEJVK0hHRm1PdHdZdzRzRk9mTUhhRlRnak1tNGxqd2dKbSszV205RUFxeVFnR080WXVDaGVoSzNkMjByZnVBQUZ0UjVCNFBkU0g3SDRIK2dQQUc3cXE4UGxBK3hyak00aWxjejZXRHRpNlZHMFhNRDgyZ2N1aEd3K3hnQS85dVhCcVBQS3JHUnNRMFdDa3FOZ3dMSnlGcTJlOVFQUW16cWYzSVJyWVJMcTFhQVBrSU1ialc4dzluTFNveDlXRVhPSDgrTDN4cDRNakg5OVRmbnZDbWZsZmdLYzIwVFc4YjRqWHRFUTFYbVg4UDZXTUJzVndIWkIzVzVqN29BdGtDTW9CRVNVZ2hsQlNCR2NXNS95R3ZaK2tKNThJWmEzRjBMZVlEd3NVTG9iajlqUjduYkNFam1mdEJhMElxQjdWaXhpa3RrTHNhakpVdlBGT05lejJKWEw1SGREaTRlbEFZY1ZRU0JBRWF3S3lHNXVFSXFBUWJMQVhtQUxjQjVJc01WU1pSbzltWmVSUVpacytkN28xUnJzY0RReXRBeWU2VG0ybVFjNG82Vi9vby83TTBzeEFhdDgwWW9qci9kZE1JV2VyZUVTTW9kYWNJbzMxczJ5aHdTQTJQR1lpUnRuQXhQY2x2NEJDbnZkRFU4Q1dNMElHRVJ0dGdzTGJFUkdlSmg3TlErRlBxTG5HTFo2U20wQXl0V0VOSStYWXNaNkEvQkFoVkNqOVZoU2NHUHVNQWlBQ0o4SDZHRFdMWnJiUndicVFoYkJUK1UrSmRrWnNqMXcyaGJJWTdBTndBRDhkVVliRnkzZ3llT2FXSWVOQi84c21RSlUxMnJBUWIyTTNDSVhnekhmSVJHc3RlbDYxamRYby9pbXdaRHFWSkc0TmkremY1dDdmNERLOXZaaTZHcytJRHVYR0E2QUlOekJNT1g5amZHcjNMOTNISllWQ3NuTnY3SnFMMDhVNzdSUHJTRWdoMGV0cHJjTTJRd2xQT0NkTUtVR2kzQWNpYlY5bXFVTXhnaTNWZWdBc1g1cVF5K3NNcFRLekUweUNtbHBPbERBU2dZeGlMY0hZbVJFeitvQjYzYkFRUjBFanMxN0UzSTF1blVYRDd0V1VUME1NRGZNMnpJelh1M1JqbjI4UGpDaFdTZG9jQTJ2MExSZFlMM0JUc09WbGNOVmVYYkFON3EydDZVVkpvWUFZNy9rUE1TZWEvbyswTGREQTVCa05CYy9oSERMQkxKNTcySlFOb1lUdVYyc2tmZ0llUVludkJWUVBqSkVKQmpEZkRBZ3dMTStoNldURmVqRzZrSUYrNHVBRnhZWkV6YjdBeUR1YjduMkN4UkZiZ0EyWnJSYTNOTTBtcFV2Z0IzaklkKzB3SEVhY0R2NTBSUGJUMzU1TEdReEh3VDJvR3RUSjQxTzdveHQ0WGRTcmpWOGVLWUVlOENXM01naVd4V01WdFlwU2VhS0FsM1E2N1FjTmdmcklRM001WEkva0JaV2hFdmkrcE5PYW9mT3ZyQVh0NFdsNzdES3cyenVsRHVlY0hzM2pKaGVFT0ZsTmVTZnJFUFYxa2JyUmZqaUwxZUwwVFNDekplZzVjbXlhYXRXMUFSNWk2V2UrME1KY0R3Zy93Y0VCUy9PMll2MXRuR01PTS8zUmErbjRSS1RaRHdRV0FBRDJ3empyMmd4Z0xWalNpVk1qQVc4MHZydkh2YmZuMVZUYlREelZ5TVJiaFpDN3d3UVp6L0RaWmhMYVR4MW1LZzlHS0Nua0tCKzBEUTBLV0NacGd5bDUxTyswR1JCVmpKTlhBZG1Ca0lGQTQvcENtd0NnQWhROWVpcXpCQWExZWFudnYvcXFmNDgvbC9KalQ4dk1QSmwwZnc2M3dJcEhCdUZtQlJjNllrQ2hjT3RjenN4M21DVUVvcWJtb0YxSE9EM0V6TGp3Zmw2MVhkMFBJckhrVEVBeWR4OFNzZ0tsSHQxMDEyc2dyeTk3TU1OMTFxditCV29CL01HQjdNb3NLT3EyWVA4VDR2cUJDalZOSElDL21KdThzbGdKK1N2WWVzQVFCYXZKUFBxa05NTUdKbFkrRzRjQjNka08wRDY2VWI0ZmtwUWZsVnN1azZBblJVMXI3c2FUelhiOGF6YjZrRTRMRitZRFNkWjhnVUJZTjlnUmV3WXptSGpBbmx6WEhFQ3lHUFo1MHdnbmhNUldzYWVIMnM1Z1IxQVZaYm13Nyt4YXZsYjEwa1BRRnh1cUhUYkp0T01oVUFzc0grUHhaTGhHMko4bnE3OEl4bjExNk1kMGpST1U4bUZoRXR1VDJ6OXMwSmxHUWxvL3JpUDBIbzB2NkkxSHZoTXN6bTV6aUFWVXZqNXMwNDg0dXFYRnVqR3dUYXd1dVdrMVlMbFZYaE5pQXQyQmM2RUh3WlNscHdOQ2NrT0FpNGlXL0J6M2hIT0JBYStEQTdNZitUSlhPWHh5NkQ5YzVYLzgyVitVT2JGb1lsc29rYjVRWTRPMjhERUE2QlNNTXp5enZITFZvbS9oQ213aHBGWnhWQnV1OFFDNjgxYW5DUkNBd0ZqUHRFMXl4NEVJVkNiKzFldkx1ZEZzd0xNQmljZnNSd3dDQUFsUUJQNkF2Y01tbGFXaDFkRDlMRmFzb01yS1hRNG5BZEVpSWdpaWpDQS9QNWFmVjVERWMxQThuZGFackNTMnR3aGZZYnlCMUNwVFB3R0YxNUdPSU5PMDRRRmFONW1rLy9wcW8wT3AvMUxPTlAzV3pZWWJJNTJKeVRRL1lpamJMTmtKcGZTdEpRQlMyTWR2dVd5ZVJvZEttMWo4VnpzbUc1Z1dNTkNza0R1UFdhUzJ4c1BBMzBYaUdyRy9YSVIvQU9Zb2dQTit1RVcxb1ZEN0VMZ0JhOW45T2VuWWN0V2pHS2NnL1VWclUwNDlyT2EvbnZITzFjdk8wVVArRGFjTDVRWHNIbi85SE9mcEhnL0pGTmptdUl2NEcySjJIRzEvVFV6S1RWM0RmQ01acFBZNWJidUNlZTAxSHh1Q0NPNkZxcmRWY2JPY1VDMkpKZzNlMW13WllrTW9CMUVqZ3V3akJta2lnQmFZR1kwNXpIcmZVUlR2M0VwT1hIVzMxNTgzQlVlUE8yQ1lUMStYN1BraEZkQWhJOFh4VWppUW5oM05nTHppRU8yL21GZUZyN3hxaFhrcjc0OXVNME9vUVF2c1Y3TE5FblpBOXFDRmJFYWN6MW1IaXhtZk15K1ZlUHQ3T29ET1k0NjBQRWZxd01xdjMreWhHRndFYlg4K1FDVytBdmF3YWp2MzRMWk9IQk4yelVSdTN0TGFSQXZaQmJNaEttd3pjc2FJOGpEampnUkMxOTdmV2Y4UUkvc0t5eENYdnZsWW16NytsanhhaTJMelNSWlBwdngwYmZ0TGkvT0FlLzE5dnNFVlgydUIzS04yMnRZbTEydEFVSEYwVHN3TUo2Mnd3M1JSVjU4V2M5a2p1WlRwbUlwa0M0QlNZVGdQbmlhaWRtTDJDalFLMWJpQkdhbXhkNUFMeE4xMml6OGVRbWdKTU5LcGxUdmFtMEFVTHNBWTRWWXRoeFptd0pJKzdSKzRLenZUNUxsdDdzWEx0UTBtWjRudlBCUGxobWJ6MlpJK0FNcktWNkRackhoRnYxSTBvSEttUFFuVnd0ajd0ZmkvejJ1ekRmYk5vQWM1ZytUdlVheE9raFpKQUFUQ0xZbHhYeHlXZmlXK2t6SXJFVlFBZnJiakI1YW9IOHRnQVVnSVNCZDFlUjlZWGRuTFR3RkdQUzI1OHNWV0pZSmdqS0xKWW80WHcwVlZoWEEvaHBWZzNkY3I5MFhjZ0owcWhpUmg4RStXaXBUTGpPQ1NOZW9keHNOaWRnYlc4bHF2OFppbzQwVnBXTlN4b1BzWHRrNkJIemQrMkJ5Z2xIQitTdkFRYmFCRzQvMTNValQ5QVhaZDVNSXNCbXJkTmtIYkhoa2I4Q2J6OVhNVkcxb3h5bTNoc3MrVm1qRENrQjdvSE13R3JUaWZubkJ0NTMvaSt3OHdJZkM0NWI3eTgrbzJKUUpZcHQyUFVCcWpvdkVmaUVxN0NuSU52Q0R2QWI4aTMxL0Nnd01lbXY1MHdPaGd5c0F2bkpHMEFPWUxkNlhqMnpqajdsTWtOakhtMWRiUWxsTGtWMHhEbjRiZGhrbm1vK2t0bWJlRklsNVBvc1dSQzZQRHZKVEVjNDJjbWZ3RDQ3TnFzTXRSOVNzeFpQWHQwVUxGTmpFZmJOYVVNSUw1OU1qOHV3S283dXlyWFFEeTEveUNDZ1M1aXpmS1ExZkIwYkFRMmJjOTJNczB0b1JNMVJ2ejZlMUNkTTVnRkxSeXFyN21paE5BcXdIaVNEMk5PT2EwaTgzYW1yZjZrbzA1OWxOeW1SZWZwWmZkVmNDYzMwTFd3a2wrdVVnc1VVL2ExT3M5VWtuUFduOVpZVDkzeWM2Rk4vL3ZOamY3bm51ZUV3dHlCWklhY0V2bG9WZGVMSFJvVC80K1JmOEJhS0d0UmdOQk12SUNic0I5OWZvaUltUmIwNlVOVi90Ly9LTy83d2grQVlUdml4RHJTYTg3YzVGYWEzd1NSSFBnREIydUdjSGZleW84N3J4QXljYTlWb2hnYW5VdW9TVFBaQWduU0lDRVlOZUNRWlpRSGw5TmE2UC83VDdnMGMyM1JsaHNSRGZvVnRLRWR4eGVqOHdVYk5ZSklXaFJ5Y0JlQmxrYlJFdHZoOVl4N1hjL0lCMVEyM1JWOVFPbWRQNk50OEQwcCtSLzJVN0ZwK0hwRTE0NUVKYjhaSmNHOFp4d1NXVEtkaGZLOVFHWHFIcEZ2MW1TR0RoU3NzTU1wU1l4MEJoaDJuYlVYRExCWE13Wmg0R2NRVVJ6ekJuY1dCTHNYQ25tVHAvMFVVOGNMYXdEM2lDOEQzUmN0YmJMUFJ0bjJOUGFMaWhTalFScWxXUTdGUWI3OXZTblpHemQxbHpjb3YzT2g5ZkZVS2F0dlY1Q1JObk1NeGtxc0VHNjlnQ1hzVU9UdnZQcnJzZ0hiYStueHdQL3k0ejdPM0RBV1hRUW4wcFc0YmMvT3FScFU1NGw5UFJDcjh3QXdlbnVOc1YwQXRydU5Lako3NFBUbjRWb2JFTUFVRXQ4ZjRiUkpPZko3MFdMNXJBd3loQUt1dmRyWm01YlhpNUxNTXg3V3I0OUhQYnJIdVozUzVsaUxpdG9XWWR6Ly9rODM3QlVoYWtJRFpBVmx0OCtFRXFMNzBremdHaWpWTkRIbitVWloyWUNzOVhzbDAxdHNXODJVNndiOThMNjQ3ODNnYVFSb21vVk5peEE5Z25iZ21pZ3hldnZCeUdOZHZMdGF6N2U1QzlPN1lLbEY2R1RTZlMxSzF1Wkd0aE11aW1WWE8zelpHWHdBQXRPRzA0M1M0NFdJaTE0QWFBeStoSlRtaWpkYlVOVkZ6SGZvN0dTeGE4R2dhQ1MvRXlrSnBxWVVlMFR0Z1FOV3NIZU9rZDN3cUJ3NDNWOXJKSkEzRTBoSG9IYlBtOHhRc1p0cnB2T1N6dmsyYTZVS014dWpLQVkwRWlZSkJXQmtQanpLMmNlcEtWTEtCQjhLMXJRTXBDTWRVL2JCL2IvdUJudzlZRnYzaGF0Sm5Gc29rQXhjM0JlUmYzcjlidVJuZnRkc2FpUG5iZEJRdFJjbzg4S0x4MlFwTXR0T0VScmxvd1hKYUw1ZklyNGx0VzRDZjRLeXNRQkZiVHd2VngrbTROUDBBZlpoSjNSQi9KZm9udEY2NXBFQ3lDUEFNN3lRNmR2SVVKSWR1T3JkaFd1RzhiWG80K2RvakhpWjBsYkRJMDZaVVRBQ2NhaUMzYkNZVWtBOWNBQ3ZNR2wvSmNHS2JIUWtUK0Z5SFpFMkNMYnpzWGh1R2hTSjkxcHNrY0J1UWVNUHE5eTQ2QnZaZUZFVHh3MDZIanZMQitFN2VRd3BrZmczSkdheFhTeEQ4Nm9jTW5xVkNjKzdITE9kMFhUSFBxUjVMSkt2WUhEeFAxMHlDR1lZSHpLb2FnNUErMVlRVWVwOGRnVEIzK1lldkdON1hJNzNkZnRqbEE2Y3FKTTBGVTY3QktwMzVyMWV3NjFjOE12c2g0L1lDQnFNbHNBQ0RsRVdBQXd1NDA4MVY5bTJ3N245NzBzL2UxL0JyWDVtNkdsUnFMZ0sycDVvd2UrTTNhVWxOSkZMU2ExWURlRyt3RytWdkdZNzdIM21BMGtLZDVnRlZmaXZZTVRzdUVPeUsxb3kzaEZRT2FkZmpXMmUzYkpCNm9kd1BKcm1KVlNtT0RiNlhSdmNCbnJiQ2JuWlh3M1c3VmtCR0s3TndJNjdRRm90RTFLOUFkSU9MSE5oVjgvelRpakUxOGJQSkh5SGwrOERPU1p2a2IzcVRaK1hCcXRZQkdwdy84Tlo3UDB4a0gyWGsvTDFoM1h3NmpFTk4rMDU3Sk5uUWt4WWc2R0JuUUFZNDNhMmZhK2IxMXhVRjJEWFlBVU5wNTNwTFY5M2RmMXRXZWR0MWhXNER4WTc0Tk9zTU5JSXdmYm5uV2hCV1BCZ1FRZUFQb0ZkWlJtcGp6VFNrT25TbFUxTmdzUDVBQTYxZ3RLOGJITkVsclZwZWwvekJoUm5kcjBoNThBTnBuV1hsLzkvWktYSGpZZUtvVnJ4V3RJUWkxc0JlZ1k2Zzdvb0FPZ1RkZmROT3VOaXo5YWNROWxCMVViVHZMQnpFQWgyQzVYeXZWNTc3YStCV1pEbXNQZGJ0bXhnUG10cUFaN1o4QmoxOVY4bXQxQ0FvZ285c0YycmJtYTZRNVAxNEkwYmp6MDRDY3ZHK3lwdmdCdFg4RkRXVDVnTDQxb0dHUHIvdVlxYnF0Uzc3TmVlZFdPZzdJZlBuMS9xcnhoNE5jOERsUEhJWURwb0hvejNRREtzSnF1dFJnak1lSW5WV3RwcFFOa3RoaW5ubjUrVnc0QlR1UldBdWNyQ0pxdEJOMStVNWhFbTRjQjJBUExONm0zS2dDcUw0cVU3Y0Y0U2lJVVVCem5sZTI2djdyanJWd3B0T3ZJanR1eWZnN3NYamdlREFHdUczaDY3Q2p1T1JpTlFPMFl1c1owMzc3aGpkY1dDS00xTVFzN1JhNEsvY0ZhQ0diZ3FLVEdMVFVZYkZJOVFiRmZraVY3UENKb0NORXIvRkpmTUtLRjVhZGwwSUoyVXRjb0ROTE9tK0thaTV6NmFjRkhYc045YmVieFhqTXRPTUM4Y0w1N2RIdDlXUTN3b1VUc2Nwaldlc0lXMlB2UU9vTDA3Vk1jdHBtanBHMGZBVCtEN1JmV2VVd2lZQVhlaHhLMEZLSEp0Y0xrTm1xZVNxdzl2MUFsRjQ3eVJxdXhraE5ONHhnZWJ3c09laVgrTmZEVXE1VHBldGJQalpqM2VXeWxla3RQNmxGZ3NISHhoTGk5eE8yQlVuL0pyTFBBd3dqK3JvS3FCNXVHUmRtbmhSMGhIM285NFZmL0xhanZuZ0ExdGU1Tm05SmVpSk10L2xJYS9WUS9mYldkVHVNQnZDVjlPV2dNRVF1Yjl0Zys4YlRzc3ZSeGdRdzlPbi9LRnpEZkgwMndqenN0dWtuczVxc1h4Qms4WDc3QVBvTndaNGlnNDFEdjlBZnE0cmlabHRmRUhKSTNEajVpbVpqV0RTZ3haTlBCOGs3ZVV3YjZONWs4M0VDOUo3WUp0YmlUbGMxeExiakVjVFhDb2J5TEhOMm16VjVPdVRPTWxKOVg1ejJHSlFUMjRoQUFXTWtDYkxDRG9BWnRpb0NKbTAyNFFGdmwyTnFESWFGVTRzTWpnY293bVpWOTNVeU5MeFVzRFNqbi9BOWdORWVSejV4L1I4K01qVjRqaFZ3QkUyMjlRbDZISVRQdVFnVG12U2c3VEV1bHVPRWt1b25BRDVZSFAvUXJWNXpoQXZDYkR3K0FUeFo3aTdFd2p3Q2NEQWVlbDVuTmZRT2w3MldOVnZMSG5XMjNqamo1NVFTU0REbU5waUtyS2U2NmdSMGJMbEIrT0VxQmdoNUpKTjZFOU1BNmRhd0xXTXhXRmNnQnNZODNGYStOMXcrWkFiYk5MdVc2Yk5DTEM1OFZiWlFxanFKQjVjSEFnSzJodzFndHlZa3VndjVzWnFrVDhFTU9qMDZTQXlpNEpnTmk5YmdReG5sQWtuQU5CQ0xHMUF2OXVqSUdSRHh1d0xpL3FIengrWTFhUjBQaiswelBsVW4ydzZrUU9vVHB2UERKSnRZMFgxdHl4ZmduY1hDT0V6dGdJc0FLOUgzZnFyUkM3b2hjUi9WK241OGJNYUJRTCtlSUZuWXAyOHJhd3M2QUdvTHE0OFZBb2RmV2xyOUV0TEhTMWg2K0oxRjVnYnZ2NGlEZEREYkFTOXpTSFl5c2s3b0FCQUhyQUFWeGM5ejlSSE5LNE1WeXd0d0dNRVVCMjRmSzNTZnlVaC9YVk42YnpEMng1WEdMMExBQ2x4bjJKSlZhNWhhczByclYzUno2bDMvN2N2RzBITDlieTU1L2ZPYS83OWQ4dnF2SHZQL3pTV3YvLzJiczd5b0lpUTBZRzV2YStLRTBpZjZrSDRMZVRjY24zRklKejhzZyt6MytJL0wvQ3lIY3hCK3RzTXNwZTIrTVBlZ252ZmY0SUJUdTN6OSs5Y05IdjBYTDJ1ZEpPWUZOZDZJbzUxVXVmMW8xN0xNOUF1WFExdWdaSmdpZkNkVzBNTG5Qait3SWh3cGgybzhoSFd3Wk85VEZHMW0xQ1RvaDBRVHVEV3JOc3ZWM20wUEtmYndYTisrS0J6eHJLNFpvR1pWc0RVZUQ3dXd3cHdPdlVHWjRKSExrbmowUmtoczZPYjZiT2I3ckhVR1c1U0JaZGhXZ3pWNzlEc2VheHNVL09JeDNWWnliSXRoYjl1QkhQMFJzRG1mSTVRc3EzN3QrZnF3elJsc2lFTkV4Wko5YXYxNUxJUUFEZk0xVE1vQ2htclA3Q2ZBQW42R21kakU2YlNEMUM4c2FJZkR0RlFDak8wV2pqdEQ3eGpPTjd6THJqSEwvWUp4TlNjZzdRRGdkdnJNNTJ3MTUwN0FDWnBnRk9XSENzT3VvZzJyZU96UDhIODUxWnJSQnVwa21mVm5kYUxmMUNkRE81Rkt5STNKMHUva3RpNFdDNE1KN3Rxd1NDaUNwc2R3ZExGMHlkaTVmdmZPUHB3ellaQkE4UWtJeUM0bDJ5QUNIaUdZcDUxbjlscTNsWDdjRWtNcHhiUXF4Z2Q3VHFPRkpYcXV6MGtmbWRHRUFkejFjTXJIbUR3c0hONlBpdVR1OXA5Q1dNVHh3MlZEN1NQR1pqeXVaUlVHRnlpcDJhdzE4QU1CcDFLQlIxQkV4ZkNiVmlBNDYwTU90VXdhaFZPZkc1emZ4ZzRub3phVzRTNG43U1FMR3V4VWorQXNiUE50UlFxK3JEM3c0eXZjZ29xU3dRYThUY1R4NXo4Vm8zc3NpZFp0WU1PeHBILzl6Zk82RzlYSmZBQnJLT2Q2KzJrNlpZc0ZLamY3QnZDMFZ1aXpNc1FhVllBOGtFYWkxRSt2L3lmYTNXQk9tT1NMVHp5N0NFLzhlRFVUZElvanFNbm04NDRvZ2M1aWJhQkI1eVhzYWY4RlBnWFFCNUp1eHJUZ0NwSzc1THlPamg5YSs4cllvd25LZi9LcDFFZ1dQeWN1RVIxamd4cW5XRXl6Qk9kQ0RXdlljVTdnOVR3aDNSVStMRlYyVE5hRmxDYzI2OHVIcVlJZGRGK0RIWjIrSDhBR2pKWWN1bW1GRFI1OGRoT2lmaFZENHJnWk5JbWRYSmRSSWhNUW9KaU5YSDJ2cERuZXpyNTY0WDRxVjA4akE2YWRXY1crckZTY0ZLZ0REWTVYbTg0OEt0bW8zOWRPSTlkMkxnK3lETDhRbTIyTVUxYjlUMjJ0ZzV6QTNOemxEbVhQMCtBMnNKbVFLR3U4OXJwMHE5QWpPT1pHSmV5N0dNQWdlSkRCTXJHM1JvRFhXYzZGM2ZPa3VrOXgyTnJQbVRsa3JSRlk1bkxTaGZrdExyRGhmMWdpVUt3OXJvNGNhbGhHN004d0NnUVlTaCs2RDIxaC9leGJDZllKWXRjL2N5QVhhQkwvMEU5UzFwQ1ZMc0ZhdFdMT3o1UkR3VmFjVVlmOU9mV2RJZzZ6UVFzQXI3a3JnSVFTeDNWaW5MRllDZHJ2VmNvOWZHM2N1SE1FNnNNWGlnR3RaQVZBZkQ2UXJ6MHM2N1NQYUtqR3I5UXpYVGFyWlhZQk84SnRSc0MyZDJmZzJhMThRMWJ0ZVVnZENXZEo0VkNBYlg4WTJ4a21ycVpOMlBZMFQyUy95Qm03QnVGN0R4NTZONHNrUTg2aVZNU3UyS2pGbi9kb0xMSnhOaU5ucDZNcG41U01jMENRYkpocXNMYnZrTjdxYUtUMWE4MEY5Wm5ZUEpNNVdqVmRtaUhoblo5dk1lUG53bE1iaU1iWmNuMlB5d1FlNzRrdk5uUTUyc24rTzUzUWNWdFlBc2NFYXA0c2NqMnp3Nnh6Y3ppRjB4ak9hdy9SS2RBUDlKNmp5cE5ZNTJVMzFRamxRY1N4VHJFa3kzcHU3MitGNlBQc1dqRDhUcmw3TFNacnR4TjJIcmp0ZGFmakQ4dy9yejJqdFZIZHlISjJobDl1em5jS1JVTGZUNWs5aG5qeDJmdXhiUGlaaGc2YzZ3VmQvL25YZWlxYkhjVmg0ZWRuL3dYNm9iSUgrK2JMWTVQeGQ0dnBIWGgxaGlnYUhyVmMwMExDbmk5WEptRUxNL3R1YkxMYk8zUjNqSThpblo2K2tuT3k3dXhrcEZoNEcyQUpCaW80ZCtwR3E4Nk9MOW1SUGRZMkNaY1BVQXBzeHJJajdOREtZRWtHUGhkYmJWSHJOSXI5dnBGcnB2WWFjc0NsWUFaUlpCemVaWWtRSnBkZnh0anc2Z2dYcERTYmNJeEFHa0dXeVFNY0UwYldHVWRMaWV0Mkx5Sy9xWnJEUi9pdkh0OWpkNFdEZVZ2Q3NoeXlkaGVuRmpxV1l0c0Q4Q0MyR2FZNzdhZVAwYkdNRmlmYUFZeHd3SG4yOVNURnlqSTJRelN2UmFaV3RGblpDV000Q1ZVYkh4elhOL01OSTMyek5YeHMxVDR6Ry9qQmJ1bm1sYzR3UDd1VExhRnc3aGxMNTU3ajNuU01mQXREWWVVc2l6OC95NTk1OU9lTVQwVFJxMmxBVEVtNEZvNm5JMXloTzIvcVBVbUo5U3dzbXoyR1RrZUM3VXdzTnM0aldyeWFMVWFTejhDRjdER2NKclhMZDdHcEFkRWNmQmljQlNiQWU3Q3I5Mm1CZ0pEZ3pzemtETXpZc2xyRE1rellDaUp1bEd3WVlhaldLRjdSOFpOdlNoTllaREwvTnhjeXNxbjZLQTBscEZ1ZG5mWjhuZ0dnYjNST1N2dWdheGpqTUhyQUZrSkY0V3UzMC92TWlnS2dINmpxWjBzTTJtd3I4R09zekM3MVlWTDJzZllyNUk3VzI1WGk0Rm9NZkovOXNvL0hvVzdRK2ZLY1dBSzJIbmdGRkhvNmNtckxTM1JpREFidlVEVTg4SXZCc3NEVEVHZVZRdS8yWHY5KzE2YzVqTEtPdi9jOGZZYm1ZL3lYai83NnN2NzY4SHV0OTlkVy8xOSsyb28ybTJZY3MyRTIwWG04dU05OU85UmdSSXhMZXh6WFluRUZGZzhuc2o0aHB5WGIrMUVOWUFzWmZ5QkJmTWRVdXZsak9rdXRtalVCeWlLbXhjRmZyOVdhVmVMMzNkVnFKZENRUFBxSGplS2ZSTUZwZEJIQ0c3ZGF6YWhzTXFBRU5FaC9taW02NGNocEVnb2R4dVUxaDhvNHRndGJheGNNTG1WYnhCckFSc3ZlZFdjVW1WZDAxSWR3ekVsc2dGZm5XWHd2YkpnMVNoWnhPbm9EVmNkdk81bkYydVFIWTVmNEY1UTRkSWUxMmd6bkZJVzdDZzJSSFQ2emJLaTNjdmU3T202a3h0amRWRXdGTmxhaHRvUnhWa3lpcWZmZEg1Tmh3QlV3eTBRSFR2QjQyQzJCcDhyMloyS1BCdHVHR1J5T3RJTHl4OU15UEgvVk0vdXpFRktKRjlDZU52UDNoeS90TU1nc084c2F1cFBhL296aytYM2l6L2Vmdnk3WC8zNDVuRUw5MTd2NTdiL3VkZjF1OXU4WCszT3pZWnY3KzRBNXdWbzRHSUM1ZnRZSmV1dTBBSm5RUWNEYm50ZWZCV25sdjdqZC8rM0xPWFhwTW1nSkttR2xMVEhGQm1sZklVYWZVb1ZYaGhYQ1g5N3o5ZGFIeGN0RGFobFAvTkZSRFRndDAvU25nK1kzWFhTViswOWxKazl3aXNrUTAxT3lqSE0zRHY0Q2NFYzZVVDRINTVuM2h1RmFIeEZRMnBGTzJXaHp1RkpDbVVCM1RsdnFqckxVNFJ6QVA3czVxWk1NZ1AwKy9UUGJacmV2ZFJ3MzhEcGV1Nlh0dUJIczJENnIwK2RaZk50Sy96enM3MUZ0MVhQU2I5UmxPaThRZC9SYVpmZllmRjJ1VXV1WVozelV2RSt6VE5vQ01qMDJTL0hzcms1N3lBTm9CUHk1bmFXS0FZZEFSTjFXL2NmY0U1RC9mejRKcE5zaEtkRVorZEJ1YTN1TElkb2MwWFZuWUJRMEpGbjNaSjNLWjA5NXU4Qkx2cXdlSXI0aUhpOW9tOG5FYnlaVEozek1OaVY4VzBOZzdFWlhkRWFNelp6M3dOb0tqSzVvYk1GSm1OYitQK0FTcDVjMHAwM01GSVVXay9mb2o2MjExWEc0SVFHUU1USHhWR25nMjRlOWZXVmNqOFBFQnRwbEZCaW9hT1U4Zmo5aGtuTUZhNHJOeStoeWhkMTJjWnpTRkJra0VCN290STZZdWcyMGw2MVYzU1lDUG4xTTFZMG5ldXhtNDRraXZpZndvbkQxM2NOcnRQZ2RDYnJqcXQ0T2NWYjZNRXRmdll6em5xNnp4eXBIVUtqMW5lY2dDZXhLa0gvYjBkUUJHZFpKWWUxNFRJK1hlREIzRDg0WFI4NFNMVlRFZEFBT3lFamx4NElEY2Ezc2M5ekZzbitUSmNNM2RTSENWZ2Ewejh1U1FHN3NTSVIvekNmSEhUbWtDY0M1Q2p6ZXdZZmdGNFVrR3ZBM2JlSElqZkE2d2hoOFVSMXVCcjIwUUxJMWdLVXpYKzFydHUzTStsN0FvNTFyeHIyWDRSQ2JvMWFSa2JYeHE2Und0eDNmaEMxWmpyYnNOdDA2bXJUWkpoMHV4eCtFaEg4RklJSUNiOGU2R01rNEpZb3hPeGtITUhVYjRyUnJhY3ZHckJoNlBXakRnbjBUREVqOGhZWVg2Yk1KV3JNWUMzTDE4R0pwREljQlliZC9NNkRPZkkvYlFWcE9ZZ05RU0hZVjd3ZVozMjFkZGErVFJuZWtLcHdqTy9kMU9FWWt2bzREZGhqK0djRTBucnV5dUdjMkZvRFNzckU3OVpxbFdPV2N3dkR1bk9ZNE15dXpnL0dCYXdyaTQ5em1NNGhrbEYvaG5vYlVtSVVzSHdQZ3pDelRTaGlDQmRHLzBFaFFITlRWdVRaQ25MYVBWZXY2dVhRN1p2Nk1lVisyemZJU29oZHJZVnQzSUlLbGFyQktRT2pGN2pkc2UvSkpIL2t4OStuamNkemN0b0tGMVRlU2J3R1Vsc2lBRkFyOG1DT2Jwb1k3dEFjb0VDNlA0bkE2aHVVTXAxUlNaQXUxL1pWTXZHY3k3ZW5yZDlhVk9lbmwrUS9RUWg3dHBIczYzaFk1WWRmczNPZS9aYk1pVW1TZ1dDNEQvTXZSbWppSFg2RDMzNGtyNlZKTVhyWlNMRmdLMWlzaXM3a0RqNDA3T2t3aE9CaXVRSHZDeWVNNW9VTHNhbkhhWWd1ZEZ2QnQzUUo3S2tWdlR0aVMrRmwyczY1ZG0wMDF3UmpQNUhtZHZNdWwzcE1iZzBBNTNXN0FPRHFJWTlvTEVneldMSHZjc2pLNk16QUE4Ym84cldHaVhzVmhQZ2tFYmwwd0dJR2ZldTM5QSt0SDUyMWlEcjVwODJNcGdoRWJwTzFTYmJhUGFnSXVQcEhuTktYY25QLytBdmRaVVpPUTJRNTlGSGFoM0V1MzdieVFWTGNRMEs0SkdOeGZZNnNReVBjNHhYOGJYU1U3TmdCNUI4ZFEyQnpDbDE5WDNjd29QdEVDQjE4K1FVMjNTWmIzUWw4dytzV3VKMjluSGF3VG1DcytvVGtZMzk2WmFuK2VrUmhkcTEzOWF4Z3lmUzN5UDJWTWQ3b3YwVlpsMjUyNlpnc05FcThZdjZmZGFUazN4dk9Gd3EvQkhxWUU3Ri9SbWhTbk85OUdmZmNKbjF4bzl3ZU4rRHl5Qld6czNNdHpwc2lYbm1pUnFaMGsyUmR5dE42L0pJTnQ0UG5uOUtyckgrT3JUS0RDR1ROY1o3RzVEaWMwL0dYenRPYzFGQ3YxK002MkpnWlB3UVo4VHRSeElqUU9NYldyQkFzNllNUGZWL0swWVE3U1o5UTFzejBRNHJVMTNwYk9Jay93WFNFUUsycHJFdHVLeW1wRTBhekxtY2VtaW02TXFIUFFVU3hXODhYcllhdTFOZEdPdTU0ek1vQjJzOEFzVnJIYkdHeGcvL2hJNHdNMlgvekViZ1dLZHVielduSUwvd3c0clhMR0w3L0FzQWFZRlpwaG84YXRNTllEWlhHMlJsRVFQbEJMdXh5MVpXOHlaSHBiWFZ4US9TQmN5cGEvcy8rc2lpMHNFK1Z6cUluaXNrOVN6V0J4YzJnNE9qNDMwSzh0eStudEdKeVc3ejdPdUxUekZsS0NKUGRqZHJHWThqMEVGa3A0VzhnVzdTMHZkalZhN3ZhT0s1WnNsNS9sbHVaYkxWcEhzT3B2c3VGdGRHSGdZdkNkR3ZjWm5aZFRuSXlRNjNJOVR3Sk5ZQWluL1pPNk94bGQwVU5VTVIwYTR1a1ZSdHFHRXdhaHFvZ2J6Z1FENUtEdzRXd3g0SktqVkR3bTVESzAvMWl0Q1RNMWh1ZjhWNHdHckFUcVlEN0U2Z04rMnFrZ0huNnc5bTVOUDJER0huVlBJempMT1Y5R2N3VmF4YzRzWHVqTVZpeUNZWFNXbDEvT202MU9sd3ptTVQzSVkySnRicTRNamlwWWFSczdXN3lTSmN3V2UzZ1NUN2RkeHE2Wnp3SkI1Nzg3MkRlbHoyS1U3cUJvVzVSOXdBWVE4WkFKamJyenZMN0w3cDdITWo5ci9lMVl6YzV0QmtMd0FqZHd4RzVlNEtUZGNmZm5EQlI3MjdOczEra2tnS2xsRnRTb0g1TG9kSGVZUFU0ME9lcjZYbzdkNG9HcUk1UU02emxWeGxaT0FGV1Foajl2cWc2akFzS01BWjVCQ0s4Y3ExV2p4OHJaTGZJdHAvS2lBT09NZER6YW5mcDYwalRnbUFxUW96alV5cWJGS0RjbzQ0VGpyN2dkTlpSQWpzYWg4Q0dhTlJ2MzdQVzMwdmFjS3VBRXlSSzVQZThlSGd2UERYTy80YlI0bm5rV0YwaU1hK05ieTRCMHoxMnRyTm0ybnpza0paaitCM0k1dTk2aFA5aU1kaVl1QThHclUwT0FBVHJxV2ZCcjRjbkcrZmM2UlgrYWZGYmx6QUZ3aERsNjVVU284Zm9zemFsYzFlbkhqNTJjRS92blJ2Q0NrSnJQU2FMZENiMjJ3L01Hd2VnaDdCZFcvc3lGRllxWkpXdmwxcnc2dE43REVTQWFxS2I5cEkrVHR1TzRUa2xqUGlOdGVYVUhFUlM3a3M0RzhNcjl6SVhVVE85VHkrR0V0MkszK1BLNEJZQklldkZ2MElQTGVwZDU2dGlzcGtBRnN4bDJHM2lUNGNWMHlwMUJ5S2MxcmhlYkdCOXIyRUcraUFZd3J0NW5jUDNGYXRnNmNzVFplcTBqMEZiTW1pZHF2L1RKZzVmL2paMCtFWXBkQnliQzNwdS82Y0FGTk1oT3JuQW9POThZOVVGcDU2K3QrKzNoc3gzODN5NTUzTVcvL0JUN2Z2MVRxSjczRGhXYzhadGZZckZyLy9kTDVwOVgvdHZQOFBRT3g1N3JPbTJUKzBhZHNSdFNhdERGdWoxbUFTY2QyK256WDh0SjFyRmdYdS84cGpQTzRIWkduYk9qMmpodmVQMXpYWDd2S0VQOVBlLy83UG11ZjMzQWZ6eGZCQXkxVlJ5bSs4QVQrMnRhYmp2SXltcmhRMXl6aFdUM2hIZ0hlKzh2Si9hbDkwK2IxOUVXREdob1dIL2tlK1V6Z2p3QWRvS1JHbmI5SElqenJDK2ZTanFMYUNOUTlKa1hacVpGQi9zdW85Vm5Ndmo0NEVleHZ0bm9mTFVrc1owT2lnZU54Rm5EUkR5MkIzNjZmS0w2RnVOL09NaHpSb1V6MVZ5YU5OZzdRTy9lVHA1ajllMVhyTGFpbndwcGlFVURuajhOV2pyMGZjMTRDY3YzWGF2Vlg1djA5MXRJQ2E3elVESXdkd3RPUUFnVGtRZC9ZV3FEWFp2WWs5Y1JCbVU3Ui9nSTZjMGFtV3Q1REV6djRUU3p3Q3Fpc3RZYkJ0Ti9Ob0VOY1VYVnZ3V25yR0VmdjM0N0ZOUVJjSjQwOGE1d2RZODYrdXhmOEFYT21GdkxWbmZ3K0ozdDZ6Nk92SE0yY1hWMkpaWUVZTHVhQ25lT0g5aW5GaVZmbHFQYVRIeE9mTE4xSU5qQ2J3SUVQYmYwZnZ4NjUrQjJtQ3Nza29YUnhlcFE0KzFHdzlLUksvdjd2OXVoSXlmYnlzOVpCV2pmb3FNWnJDMndXVDJmVXlhSDFYVk8vLzh6YXVXY0paWnhwZTB0OGJJWXhrazUzUW01TmlUb3pWNGpNN2dBOGU5WDg2L3lvUUFxTXErRGV3TDBKUHNFdUFOYytuR3c5OFVLZUpsdDdRRTNQNE94c3pkK2s0ZXN4TjRobUNGM1l6cmRvc2o4Y1p2eFdGenVYSWJqeDVEMHF6dkdjejhuaUtIdnJUYm1aTFBpYk13Wk1tcXpUZ2Rhb25RQlJ1bm8zZjQ2WGRKdW1uRG5DY1Z0VHF0K3pWREpIZU1haGp5QmRmYW1PRWpRR0M4S2dWbSsyN2JjYWxxQ09VNWVFRGZhOFJQR3doY28rS3IxeklhWVFxVG1DSU8yeHVOSktmSUttNVF4SXUxZEh0amxxVkZHMEl5L0EvS2NNeFZDZGd5RXNSR1dZWTFpQXl0SzQ4UUE1NDJiQzdZTFlOdEo2SW1ZemRQV0tqaW1DMTBkaXJlc0szRGUza25Jd1duWm1OZFl6YXRCeHNGQkdCMTlaUWUzalh6T0ZzV0ZoWFBnbUFIV1J6RGtsT3BxLzQ1VEJWN0lTZ2NlNHpsWE94cnlaL1N1cDJ2QWR4T0FFTjRJYnVGQy9PY2NEUWRjUEwybWF1TnBIcFpRWVFYcVBuWCtzTmd6NldlOURqVEJ2TDRPRUpsUS9XV0I5N1pIUERudTFRbW1BOUtQNlFBQ2R0WURhY0pwclFlcGdFSmc5QUtJSlRzWFpNOEhON2xnSlU5ZTZEWTR5NVkrYkxUSFVEUlBXektHSEhqR3gzSnBRZloyd0Jpa0pqdEVibjNPemJiSDdBN2I0SlBSRmRUVzdybGx6WnFKdzVGc3REdmI5OERaUEJPdzVXankzOU5WMkRVNzNMZW54bGh3NGlHc096bnpGdkF5RUIzbnpOZ0RjM3VjWEMvL01ndmJ3cVl5L3ZUVHJyK1pzNXovL3ExLy9jNFptbW5hMElIWXcrRjRTOVNRem5sc0ZqSlZxRGtneTU0OUozNGoxL0VjMVZOdFFSdW5yZ1loVHNueDBKYmNJQWpiM3JMVkZwN2Y4ZXpEYWNUMWdqMEQ4bkowSU1ZcGJiSkw1VDBaaVBramR1Q2svKzdyRzNRS0NhczlOb2Nwc0pvNVFKNnFjMlphc01FNnozTjQwV3RJTldHN25qNGQ2M3BtVE5zMGRRcElteFgvQUc4ZStZa1hGc3l3OFRZMWZsc045ajk4cG1LZmZCd0RtcldPcTBxMVNxOGZFSmVlRnhLQVpRNnZoWXlmQjl2QkFaYjcxb0tWQWw4emNPdEpUWFo1UEU0WnhvUlg2eUtBMG0xRDBXMHlkNmJTaVNMWFgyVFlzMjRNVW5pNG5tTWg0NWxZZ3BOMHJ2Q0p1K1Z3cllWN21WYm9POW9SOFppdjRZUHFxQmN3Tjl0NG5qLy82YS8vRFFhM21lc2M5MlVtNk1oTHZJNjRIR0ZoMWY0cFNQSGZ2aTU5M2JxcWZCRC9hMEdEVll0V21zQUVlcnlLM1NnQTh3cTczc1hJMkZxZUJ3QnlIQTcvZENZemJNMDVkbllreE5xQ25pT1krUmVkUDVLaENJVzROZHJzV0xJWWY4azFrM05qMlYvRGljTW12QS9XMEkyS25LbXJ3VnJuNHJGY0ZsSTRJZVdrMWEvL05xL3VtWGIyWWV1NFVZY3prQW9HNGxRVXlQUDBFS1VCV2hTTTQ4UHlKZkMrblV4Z0JiZlJRS2VncmVuOFM2T1pnODEzcUxlVkx2czljNnN0MDlKYWFFL0RtOUY5UXdZWE1LTURUQ1FRY0xKdUlIS2hoUG11VGxWL25DTnVCMkg5bkwvRXowaEwwam5BemtIb0EvNTlnNGJnSW13aE8zWG5BdXBvNW4wL1IxNkJOWndVTmswR2RTbmU2N3dMUkpBMTNBWnJzRWlHcnozaVlJQXNjNGNjODNPbUwvczlTbUczcG1jdW5CcG0yTFZJQmF2bHFaaUlQSTZTSGZIY1NLZytUc3ltclZHSHVZam53b0FCY1l6ZExOU2dUVXc4cmcvbytTNEw4WjdIdHVuaTNOeHNPKzNub0JnYjd5d1pibmZCVEJlanAvQitUS2FuQVZUcmhMTjFFL0djM2dPZ3ZIZkZjSDlHSEVCaVdGV0xXSVlENDdkRE1MbjE2N2xOc0U3ZUJGMnp2QitIZXRjS0JuRzBlUDg4eEk3bk5HY1RuMmRZWi9mbnlDdVB3b0hTL3M3SWFyZ293K1hoSEp5RXE3SC8rM01NdHVld05tZTA0QzdSWUtSb2ZSVWJ3U1dkVStRWXpISnlMYTloeUF6QkJlMTRFa091bDNQSFc3V1h3bmx0ck84SHRrYWVuWWtsbFB0ekdpT2dFUTd4MDd4UExPM1FobmVkempsWTUwVDdiNFBtT3g2bGdmLzliMzdVb0hZOThZVHFKSlhpYVdmQlRuZFcxTUM0VSs2c25KYm1lOUFkZ3Y3OEFOV050Sm5nRzhsTUNWemRtd0h0SEFFenpsR1JxNkRZb0RHbkREZjcweE13cVlLUW5EWDdIQ0x0eU5LN2ZkWFRPejA1OWN4M1FmcnJjRHlEZHJMQUxJRDdEbEQ1S3J1bXhKeUlpWlRIczE4OFpRL2s3YUc0dytIK3dTRkw4VDdCbHBvZHZnZUtWNTVQZHZCclRxcXpXMHhvNFBTNjRjUkZEMGV0UUtLNlBDUFM4U3hkc3V5cjhrOUFoVlUvejMwYUFUeWYwN3A0YkVudjdUcUpGOUNsZzJhVmllaWg1WkM5UitvdkI3REJBb2RRN0hBby9WUWEyMEpsMVE4bTBIR0pTTjFiQUtOcm56TW5vR0JCL1p1Ty9Cb3ZiQnNEYWsyZFo1M1lsb3ZpUEFHaTFQM0JkZWJWb2pPZXc0YkphNWZwL2pySzQwUUtYTXp6TEQzZEVna0oydTNhVC9ZemRyUGxZR2d3RkovSmY1MTNXcitUKzIrWGRZSDNPZHJIQks1UlRNdTFxb25pWUR0TFlWMkFOcERJSTJKL0JBeGt6RlliY3dkbDJpQ1lFY2hUc1c4OThmQW93SGxLWmw2bkhqaFFFMlZ6aXA1OXlSQ2RmV3V0djJqRjdqNk5uTk9CZFpDdmpvWHN2NGtoeTlFUDZWK1Z3b2cvTUJiejI2b0htb0phV2NFRG5XMTVsWDBYNXp4N0NvTVRiMDZ4Mll1dUJ5VVZNMncweFZOdVlyQUZyVnJwNDZrdGtBZnJHZi8yaWtlSGpnWmQ5emxDcHRXRDZJc1RLb0taaXZ2YnhUa1ljWGhnQVlUVUh1dlg4ZGU1ZUE0Wmh0VVUrdHhXaUdEQjM4dVdCQ2R3Mld0NzZ2L3pMMGJDNHRaUWYyWHAzNS8zenZpUCtEcGtPR0liWXJubFpmMTBIcS9MZzJYUVZDZlFUSDRZeEZxc1Q0Mi9uaFljMWZyZlhmcmtyWUtEMDY4bCtMWnRBUmlNT0ZyZGhqbVl4NDk1Mk5BNTZRNi9GZlJYNW91dHpFUHpEVnhDQVlQdE9pYkFMMzJDZ1NlRGpZNmJEeDRQZ0dMQ2NzN1p3STdBZkR6cEdMVjUwMWgydUtmYndmYnY4YTNnVzZoV0hGYzk3V2FtZE9YeVJWeGN6UzNvZjdjVkVjT2h3Q2ExQzQ3S2s1QTlabU1iZ0JxZVZYc0x1a3l3T0hJWExDbjdpNmJjUHFjdEd0TXNRVXAwVGlscUo2ZDVvMzJtSXg4blY1YUQ1aEgrYUlOem1QUDZwU29GYXNIMHROT2YwMkQ5bHFOM25kRWI0enJUbWMyc3RUT1l6VURmNDRtb3poN3BKeTN6b212ak50MWpxV0p4aXFPbE0veVk4MU1xSy9VQXBSMm1XVytQdXdSSEZEdGNBQmt0Z2ZkZTV5SzNQL05xZVVpWThNblF6TlNkQzJTZStINHdBTHVlU1BHTXU4YmtNYjdaREJlT3VucWVGTXpRTXQxNENtRytDd2RXSCtjQ3ZtVTFzQTk0Mm41YnozNTF2TUE2WTF3ODBleHhMay8rZFZNOGY4N1Z3c0J0VDY0QmRGMVdUTnVRNy9HQXJMT1QvZmM1SE9aOHRCNjNQSm9ub0p3SVRzQzdyNG9yaTU1NitwMVJxeDdNbU9EOVZyRkFRSjBYamJleWlMLzhUUzA5Ly91RkJNZm1hUXBPZFRRRVpxT0RTZnVURVR4RFVDOU1qR2JaZVFmSXlHMEZuUU9tSEhhMFR6cXQ1Tjg1UHRaZEZhZXMyMEg0bi9wLzZVS2RvL0NkdlAzZks4M2ZadkFXUkhMYUJUM2w3VTM0eFZvZFRGQTgzdkp6T1BuNzRnKzNaL253bzlwS2VJaGQzazZVQ3c1OXkwaVEyNDM4VktNcjAyTlZzSDhuVHZTZTA3V2hDajFZRGNvbnJuaHFUWkRrVTNuVG5aNTRzeUxvd0x6UElRT2oyVzZKRUU4bktOcDhiM0d5SWJieU9Ea1poZ0RvU0pjTkx0YVBXVG0yaHZQaGtzZmtnYUVmaDhNSEo1YS9uZ3I2Mmd6ZG5PMnBMM0w2cVJXWW5yV0J2RUhYMzlmanc4VHhqL044K1Jtbk8rQ0lkYVpXN0s3b3NNOXUvUTRPK3daMk8zcjhPY1Z5ZUFCMmFEcE00RG9oRkFDNStHVTYyZ0ZnNWJBZ2c5UFJVOEtEeHhFNS9NekRUNnl0aE94Nzh0M3lhRGxJaEFLUzhQMC8wb0tjTjFOaWdHWkQxMkU2cmNhSjJxK05EaW44OHRIMmJpZlU4UFdjS1N1dGNlWEpRdWRRN3N0Y2RRd1oxbStlZHppdVl0M0NRanZSRGV1Yks1SXh6eE9UdzMyV09UQWxveDhrMGV1SUtET28xck1Ta1dYZFRJRkkyS2xSREpuK0NpdzFUTTZlM3RGRGZLM3g3UmFFYnVNTDJHSGtkVHYwc1RuWjY4OWswN25QSVhNZTBwREZhR3hyR3lmVmhLa2YyOWxtRW1qUFMweW1mOHpqLzg0N0F1cjlacks4QzFPQmVTMmUrUHhyZ2JRbXBKNGhua1hHNlFHTjFWbmlGaVpoNHExbWZteDF4S2ZiakhRNldLWm52enpid1ZPNGpUZWVmQjJ2M2U5d3N1YU9uclJvekJTVnc1ejVUQTdBaHZyMWc5YnZEeVhEdFhtMldKYVlwdGtTQW96bU90SGZFNmxONFFHbHpwRkdOcFFBOHl3TEhSNjEzaDJpM0o1cXM0SDlXTTZybFdBODV0M1J5eGgyUUdNTW5qMm1EeDNRVUIyY1d5eWVsdVp0TEhnemNlRXVPNURXSkNPc3RsMW53aXcyMi9PL3krZTVndmFOVEpkbHRHTTVrY1BuOUkwNkNPSjJCb09EWWhUTlpGdnJPUXNsTFk5eWFpZjV4MjRhWGJIeHFXbmVUdnJPWkp3elJ0WFk3V25BVmt4Z0V1SDEvdGpkalZMakE2dERGSk1CYnE5L2gyTWhEcEhTWEVIZWx0bjltTTVSV3g3QXhMN1pHOHU3MnJpaHF6WWN1YkgybDlVZXJ6bnpjelM5REdlbk03YXBXZk53Q2xkVzV6WGY5M1I4WTVGd21kbkdHNk9BbnZzVHo3SGZGK1ROZ2pWTFM1cjhJdU81N3p3OGRDSmo2UlpiWUNWRkVoMDYrUTAzalgzVElYZ3YrWkJkcDlhd3Z4N2VpZzJ3RU1hS0pydzZUMlgwZEZwMyttWHJZVDh1Q01IQ3VaZmxvUjNZeDlJTlpUM3VnTW5UeTAxWVo5Nzk0TW51NVpFWUNJQnpSb1NrRm0rSm9MZkYzR2RtMWhsbzdSQ3d1czhCMzFhN2xQWmRBUy9aN00wS1R0d2Q5em5zT1ZuVHREekJRalY5ekN1YkVuUzRQUGFlYjJlSHdsYjcxN09uRmZlK0w5dWpIVCtGM21WUDMrck9CdkRjUC90WHduTU9WUExRR0E5eHFpYmcyRi9KWnZmSWVnK3R3YXpwZjY1ekxDckk1ZnIvQXBZVHFBOGFKZXJZQUFBQmcybERRMUJKUTBNZ2NISnZabWxzWlFBQWVKeDlrVDFJdzBBY3hWOVRwYUlWQlR1SU9HU29UaFpFUlJ5MUNrV29FR3FGVmgxTUx2MkNKZzFKaW91ajRGcHc4R094NnVEaXJLdURxeUFJZm9BNE9Ub3B1a2lKLzBzS0xXSThPTzdIdTN1UHUzZUFVQzh6emVvWUJ6VGRObE9KdUpqSnJvcWhWNFFnb0I4OUNNak1NdVlrS1FuZjhYV1BBRi92WWp6TC85eWZvMWZOV1F3SWlNU3p6REJ0NGczaTZVM2I0THhQSEdGRldTVStKeDR6NllMRWoxeFhQSDdqWEhCWjRKa1JNNTJhSjQ0UWk0VTJWdHFZRlUyTmVJbzRxbW82NVFzWmoxWE9XNXkxY3BVMTc4bGZHTTdwSzh0Y3B6bU1CQmF4QkFraUZGUlJRaGsyWXJUcXBGaEkwWDdjeHovaytpVnlLZVFxZ1pGakFSVm9rRjAvK0IvODd0YktUMDU0U2VFNDBQbmlPQjhqUUdnWGFOUWM1L3ZZY1JvblFQQVp1TkpiL2tvZG1Qa2t2ZGJTb2tkQTN6WndjZDNTbEQzZ2NnY1lmREprVTNhbElFMGhud2ZleitpYnNzREFMZEM5NXZYVzNNZnBBNUNtcnBJM3dNRWhNRnFnN0hXZmQzZTE5L2J2bVdaL1A4YTdjbUx3MFh4dkFBQUFCbUpMUjBRQS93RC9BUCtndmFlVEFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFBQjNSSlRVVUg1QWNDRUNRU1IxL1VNUUFBSUFCSlJFRlVlTnJzWFdkNEZGWGJ2cy9NMW5UU0V3SkpxRUtvU3ErQ1NGRXNLS0orb29DZ2lJclN1d2d2dlNnZFFTa1dSSDFGUklvRkMvS0NnQ0NDUWlDMGtKQzJ1OGx1eXZhZGNyNGZPek5zR29ZU2l1eHpYWE50c2p1N00zUG1uSHVlZWorRVVvcTdWZjc4ODArTUdERUNmLy85TjhMRHc5R3paMC9FeHNiaXE2Kyt3dG16WndFQUd6ZHV4T3paczVHYm00dEhIMzBVTE1zaUpDUUVhOWFzQVFEczNic1hJMGVPeE9uVHA1R1ltSWhHalJyaHQ5OSt3OWl4WTJHejJiQjU4MllVRmhiaTBVY2ZoZHZ0aHNQaHdOR2pSMkV5bVFBQW9hR2hTRTVPaGlpSzRIa2VnaUFvcjRJZ1FCUkYzNytKS0lydzNTaWw4aXVobEVMZUFKQ3lyd0JBS1NYUzVTdXZaZDRqNTg2ZGk0bUlpSWpUYXJVeExNdkdNQXdUeFRCTUJDRWtIRUFOQUNHRWtCQUFnUUFDQU9nQmFLU05CY0JJdnljQ0VBQjRwTTBKd0FIQVRpa3RBVkJDS1MyaWxGb29wV1pCRUFvNGpqTzZYQzVUWGw1ZVh2UG16VTNTNzFDZnJkei9oSkN5bjhudkFRQWxoSlI3OWRrb3d6QWdoSUJobUxJYlpWa1dMTXVDWVJqSWY2dFVLdVZWM3RScU5kUnFOVFFhRFRRYURiUmFMYlJhTGZSNlBmUjZQUUlEQXhFVUZJVGc0R0NFaFlXaFJvMGFpSXlNUkhSME5PTGo0M0g0OEdIVXJYOFAvSEpqaE56TndIWTk0dkY0a0p1YkM0UEJnSUtDQWxnc0ZoUVZGYUdrcEFRMm13MTJ1eDBPaHdNdWx3c3Vsd3R1dHhzZWp3Y2Vqd2NjeDRIak9QQThYMnFUQWN4M0UwV1J5QUJYQnN4S0FabjhmeGtBS3dWWXZ2OXYyN2F0Z1Y2dnI4ZXliRjJHWWVvQVNDS0VKQUpJQktDN1RZYlpCZUFTcFRTVFVwb2hpdUpGanVQU3JWYnJoUUVEQnB5WHdjMEgyQ29EdkhJQVNBaWgwbmhSRUhKNVlBZ3BCWHkrSU9jTGVtWEJ6aGYwZk1GT3A5ZERwOVVpTkRRVU1URXhDc0NGaElRZ0xDd000ZUhoaUl5TVJFWkdCdHEyN3dTMVd1MWZYSDVndTNZWk9YSWtWcTVjZVZ1ZFUzUjB0RmZOcVFETVpLMU1CamI1M3NtYW1pOTQrZjYvYi8vQjZKalkyS1pxdGJvcHd6QXBoSkFVQUkwQWFPL3dXK2dHY0ZvVXhWT0NJSnh5dVp5cDZSZlNVeC9wMjZkQTBoUjlRVTBzQTRDZ2xDci9YMEdqbzRSaHdCQUdERVBBTURLWU1aUmgyQXBCalZXeFVLblVVS3RVVUtuVjBLalZFaGdTcURVYTFFcElRRUJBQUFJREF4RWNISXlRa0JEVXFGRURPVGs1YU5xc0pRUkJRRXhNakIrWi9NQjI4OFJvTkNJM054Y21rd2tGQlFVb0xDeEVjWEV4ckZZcmJEWWJIQTRIbkU2bm9xV1YxZEQrUVVzanN0bFpCdEI4TmJOUzJsaFpVSHU0N3lQczRuZVd0TmJwZEswWWhybVBFSEl2Z0FaMzJXMDZKNHJpbjdrNVdjYzBHdldmWThlTStYUHYzcjJpRDlpSmxRQ2VaTVlTU2dnb1FFQklaU0RIZ0dFWnNBd0RobUZwS1lCVHNWQ3hsN1UybFd5aXF0VVFSUkhCd1VHSWlJaUFYcTlIUUVDQVlwNGFqVWJVYjNBUGFrZ2FYR3hNTENLam92eUx6ZzlzMVNmRnhjWEl5Y21Cd1dCQWZuNStoV2FuMCttRTArbUUyKzFXekU2TzQrRHhlTUR6ZkNsUTgvR2pFVjgvV2dXYUdhbkFYNlpvWm1QSGptVWZlK3p4VHVHUlVlMkRnb0k3RUVMYUF3ankzekhBYnJmQldsS01WdmZkYTZPVUh1SjUvcERWYWozODZxdXZIdnJpaXk5NFFraFpvQk1yTW0zTGFIRzBsRitPVWNBTkxNdUFZYjBncDJKWnNMN2dKZ0Vjd3pCZ2lGY3pMK3QvTTV2TnFGVTdDYUdob1Y0VE5TSUMwZEhSaUl1TFEzQndpUCtHK29IdHhnbkhjY2pLeWlxbHBSVVZGU2xhV2xYOGFHVzFORms3OHcwT3lKcVpiR2I2YUdTK3ZqSkNLV1VzRmt2am9LQ2crMW1XN1FLUXJrZU9IQW1OVDZqdHYxa1ZTRzdPSmJScDNicmNjK3JRNzRmM1JVWEg3aThveU4vZnZtM3JOQW5VS3RMcXhFcEE3cklteHpDVUlUNGFITXVDbGJXNGN0cWJDcUlnSWpJeVFna3c2SFE2NkhRNkZCVVZJUzZ1SmdLREFoRWNISUxRMEZCRmU0dUppVVZ3VUJDeXN6Smh0OXNxdmQ3QXdDQWtKZGRGU0dqb0xSdnprdUppWkZ5OGNNdlBVM1czVFhaS0tRd0dBMHdtRTNoQmdNMXFyWEEvaThVQ2s4bFVTanV6MisyS2R1WUxaUDhBWWhWR05XV0h2MlQvZ1BqNHg4cUNtY1BoNktiUmFIb3dETk1EUUZQZjgzUTZIWDRFcTBTY2pnckhKdFR0Y3ZiVmFyVjlhOVpNd0tYc3ZKTTh6LzlpczlsK2JaclNhRDhoRUh5QmpsSmFUcU9UL0hNQUlaU0lJa1JDd0lnTUJNSlFoaEhBc2d4aEdCWXN6MUtlNWFGU1NSb2NwNElnOExEWnROQm9OSXAyNzNLNVVGSlNBcTFPRDZmTHEvazdITjY1WnJOYVVWSlNnaUpMQVFJREF4RVdGblpGTFRYajRnVTBhM0h2TFJ2emkrbm40WERZLzFHYnJ1N3pWTjF0b0hiczJER0FNQWdNQ2taZ1lCQmlZa3Z2NDNBNGtKT1REYmVIQjhlTDRBUVJna2doVWlpdkZLVDBSbEZtbzZBVUVDbUZLRklpS3BGTDcxYld4S1NVRWlxWm1jUWJybU9jVG1jZmpVYlRoeERTQjBETmE3M21IM2YvZ0kwYjFzTmtNaUkrUGg0ZmIvb001ODZkeGRBaGc1UjlKazJaaG9jZWV2aHV4YjhtS3BXcVNWaFkyQnRaT1hrNWdpRDhZTGZiZjBwcDFPQW55VndWS2dVNVNpa0ZvZDRBS3dVaElrU1JRQkI4QUk1bHdmTXNXQlZQVmJ3S29pakE0WENBNHppbzFXckZYV0czMjZFcExsYUFUblp0T0J4MjJPdzJGSmlNQ0EwTmhjMW1RMlJrSkhRNlhhV2djU3ZsbjBEdFpwM25YUVZzQm9NQklBeWlZK0lxTmwxeWM1R1htd3RUdmdsbXN4bEZoWVdLSDgzaHNNTXBtNTF1Tnp4dU56eWNCNXhIMHRaNEh4OGFMMEFRZU1uY0ZDR0tzc2xKQ2FVaUtBVUJLTGxzY25yLy8rMjNBOTBURTJzL0doOGYzL2Q2d016M2VoYk1uNHVacythZ2RlczJLQ2twQVFEVXExY2ZQLzc4S3dEZ3BhR0RxMjI4TjZ4Zmg4Y2U3NGVJaUloeTU3VnN5VHM0Y2VKdmFEUWE5SGl3RjBhOCtocFlsZ1VBWkdkblk4V3lKVGh4OGdTMFdpMTY5dXlGbDRlUFVENnZEcEdPV2ZQRXlSTXZhclhhRjZkTW5aWXpkTmpMMzludDl1K2FOV20wWHdJNG9ZelpXbGFMazRJUElrU1JnU2dTeWdnQ0JJWUZLekJFWUhtSW9raWRUbWM1WUhNNEhGQ3JOVjVYaGpTLzNHNDNuRTRYSEE0bkNpMEZFdEE1WUxmYkVSRVJnY2pJU0w5YTdnYzJ3R1RLUjJCUWNMbjNiVFlic3JPenZEbHArZm13RkZwUVhDVDcwUzVITzkwdUY5d2VOenh1anhmVU9BNDh4NEZUQUkwSEx3Y0VGRkFUSlRDVEUyaTlJQ2FibWFkT24yMFNFQmpZajJHWXgrMTJXK1A4L0h6RXg4ZmZrT3M5azNZYWtaR1I2Tml4RXdBb0M0RVFBcTFXcS94ZFhmTGh4dlhvM0tWTE9XQ2I4ZlkwTkduU0ZQK1pQUmZGUlVVWU0vcE4xRXlvaVg3OW5vUW9pcGcwWVJ5NmRYOEFzK2JNZzhsb3hMaXhveEFWRlkzK1R3Mm9sdk9zNUpnMW82S2loL1YvYXNDd3JCekQ2YzRkMiszNHoreTUzNzR3OFA5T0FSQWs3VTBneEt1WVg5YmtLS1dVVUVJRVNpa2hvaWhTUWtRSUFrTloxdXVPY0xsY1VLbFVWQTRxcWRWcXVGd3VxTlIyeWFYaDlkTzZQUjdKWEhXaHVLaFEwZVpjTGhjY0RnY2NEZ2Vpb3FLZzErdXY2YnEvMnZJbDNsdTlFai85c2hjQThNckx3MkN4V0VxNVl5Wk5ub0llRC9ZRUFKdytmUXE3ZHU1QTgrWXQ4R0RQWHRXK1hoZk1uNHR2ZCsxVTV1anJJOTlFLzZjR0lEMDlIVXZlWFl5UzRpSUVoNFJpNHFUSnFGWEw2MmMrZU9BM3JGbXordTRDTmw3Z0VSZ1lWRVo3eUVGdVRpNk1SaVBNWm04S2gxZExzMTcycDhuUlRvL2tVL1BJL2pRdnFBazhENTczRFFnSXZta2FwSFJBQU14SEgzK2k2OXlsNjFNc3kvWW5oUFR5ZGFyYVNvcXUrenFQSHorR0dkT25LWnJBNDQ5NnpjeCtUL1RIb01GRHF2UWJodzRld01vVnkyRXc1Q0V4TVFsanhvNUhTcE1teXVkN2Y5MkREUnZXSWQ5a1FreHNMSVlQSDRGMjdUc0FBRWErL2lxeUxtVUNBRWEvK1FaVUtoWUpDYld3Y3ZVYWlLS0lybDI3NGVHK2ZhSFZhaEVkRTROV3JWdmo3Smt6eW1LcUVSNk81d1lPaEVhalFVS3RXdWpZcVRQUzBrNVgyN3lvd2pFYkVVSWF4Y2JHVHJpVW5iZmI2WFJzbnpIOXJSMmZmYmJaQ1lDWE5EY1o3QlNRazMxeGhGQlE2alZUS2FYVTdYYUQ1M2tpQlJVb3ovTnd1OTFnV1JWNE5RK092K3l6NWFSZ2xMV2tSQWxNZVR5ZVVnQVhHUmxab2ZZbWlpSVloaW4zTndEazVlWGgyMTA3UysyLzV2MTF5dDl1bHd0REJyK0FqcDA2QXdCV3IxcUo5UFFMY05qdHFGZXYvdFhaK2syYUtJbnNWenJIc3Y5YnpHYTh0K1lETkU1SktmV2RXZjk1RzZOR2pVSHpGaTJ4YStjT0xGKzJGSXNXdnd1WHk0bUZDK1poNWVxMVlPNG1ZUE1ORkRpZFRwdzVjd1puejU3RnhZdnB5TTdPUWw1ZUh2THpUUXJBRlJjWHd5cVpvamE3SFE2N0EwNkgweWRYelEyMzIwM2NiZy94QmhFODRIbU9TRGxwUkJSRlJoUkZobExLVWtyWjFOTm5tMmRjeXA3ZHJmc0RKMVFxMVFlK29PYXJQVjZ2dEdqUkV0dTI3OEtibzhhZ1pzMEViTnUrQzl1Mjc2b3lxRjA0Zng1dlRadUNFYSs5amwzZjdjWlRBNTdHbU5GdndHUTBBZ0F5TXpNd2U5Wk1USnc0QlR1Ly9RR1BQUElZcGs2ZERJZmtyRit4Y2pXMmJkOEZBRml5YkRtMmJkK0ZsYXU5SldnTXcrQzVnYzhqTEt5RzE5bDhNUjBIZnZzTmJkdTJVN1RLRlN0WFE2ZlRLeFA5K0xGamFOYXNlYlhOaTZzNUppR2taMEJBNE1vRmk5N1pYNzlCZ3lscjMxL1hqRktxaFRmaFdRTkFEVkFWcFZRbDMzZDVIa2h6Z25BY1J6eVNOdVp5dVlqTDVTSXlXRG1kVGpnZFRqanNEdGpzZHRoc05saWx3SlhOWmtOeGNURUtDd3RoTnB0aE1wbVFsNWVIckt3c1hMcDBDVzYzV3puUEkwY09ZK3JraWVBNERoYUxCUzhOSFZKS0cxdTBjRDVHdnZGbXBXUHkzWGZmb2xQbkxvbzJPT3lsbDdING5TV29VN2Z1Vlk5dlNFZ0lOQnBOaFordFgvYytObis2Q1FCdzRzVGZlUE9OMThzOWNNcjZ5Ujk5N0hFMGI5RVNBSERQUFkxZ2xnQXpMeThQWVdFMVVMTm16YnN2S3VvMVNZM0l6c3FXbmlMNUtDeTA0TUtGQzlqOXcvZm8xdTBCdUZ4T09GMnV5NmFucEtWbFptWWdyRVlORUVJZzhEemhlYStHNXZHNElRZ0NZVlVxOEJ4SFpKSE56ZDY5Ky9SWis4SDZaL2Y5Yis5VEgyN2NBSTdqVUxkZVBVeWFQRVZaVExlVDdOeTVIVjN2NzZhWXNMMzdQSVR2dnR1RjNidC93TURuWDBCRVJDUTJiUHdZdFdwNzFmOUhIbjBNUzVlOGc2eXNTMmpZc0dyMWpxa25UMkwwcUpGd3VWeTR2MXQzZE9sNmY0WDdyWGx2RmZRQkFYam80YjQzN2ZxcmNreENTSzJJOEloUlFjSEJvekt6Y3JlV2xCUi8xVFNsMFM4QTRhWElxaUJwYllLdkJnZUE4anhQR1lhUjh4ZXBsTmRJR0lZQkw2Z29ML2dtY1h2OXQwNkhvMVErcEt6UmVSUnoxV3VtUmtsSnZhMWF0Y2F2ZTM3QnpCblRrWk9UalNlZmZBcmhFa2hzLzJZYjZ0YXRoMGFOVXlvMXpiZCs5U1VXTG41WGVhOHlZTHBlZWZiL0JtTDBxRGRnTmhkZzMvLytoMWx6NWlxZm1TMW1USjgyQldhTEdXM2F0TVhvTWVPZzFXclJyOStUeWo1ZmZQNFpldmJ1RFFDSWpZMkR4V0pHZW5yNjNhV3hpYUtJOVBRTE9IUG1qS1NsWFVKZVhoNU1KaFBPcEtXQjUzbGN5cnFrVkJMSWVXcE9oeE5PbHhPVVVuamNIdUp4dTB0cGFGTGFCcUdpeUJCQ0dFb3AwKytKSjFVWExsNGFQRzc4aEIrN2RMMS9xOWxzZm1yRjhtVjRkK2t5ZlBMcFoxQ3IxTmo2MVZlM2JaQWxMcTYwbjY5MjdTUVlESGtBZ0tDZ0lCdzkrZ2VHdnp3VXp6MzdOQWEvTUZBWjM2cEtTcE1tMlAzVEhueng1VmJrNWVWaHcvcDE1ZmI1K0tNUDhmdnZoekIzN255b1ZEZm5HVnpWWTFKS1lTbTBJQ2d3Q0F6RFBCRVdWdVBUUzlsNVc5TE9ubisyZWZNV2VrcXBEcGVKQVh3MU9JWlN5Z2lDd1BBOFQzaWVKeHpIRVo3bjVjQUJjYnZjeE9WeWVWTS9IRTRsVjFJT0h2QThyMVFzaElhR1FxL1h3MlF5SVRjM0YxbFpXVWhQdndCS0tZWVBINEUvai80QnJVYXJnTFRSYU1DTzdkOWcyTENYS3IyMjMvYnZRMUp5SGNUR3hsM1hXUGJ1M1J2OSsvZEhmSHc4T25Ub2dQNzkrNk54NDhhbDlna0tDc0lycjd5S0wvLzdCYnAxNzE3cXdUaCsvRVM4OCs1U2JQcjBjNWpOWm55OWRVdXA3Mjc1OHI4b01CZmdxYWVlQmdEbzlYcE1uaklOOCtmTnZuczB0cUtpSXB3L2Z4NnNTZ3RUdmhFV3N6Yy96V3IxbXBwWldaY1FHeGVIM053Y3hNVEVLRTlDUTE0ZU9JNERJUVNVVXNKeEhnQUVITWNSUWVDQjBqV2FaUE5uWHdRdldqaC84SktseXdjUlFwb2VQSGdBOCtZdkJCVkZ2REZxdEdLQ05iem5IdVRsNWQ2V1l4VVRFd05EWGw2cDkzSnlzdEd5cFRmdmFOLy85dUxUVFo5Z3lkTGxTS2hWQ3dEUXBWUDdpclNhY21EbmRybnczWGZmb2srZmg2RFY2UkFYRjRjZVBSN0UvdjM3eWszYUgzZi9nR1VyVnQyMGhOT3JPZWFSSTRlaFVhdlJvR0ZEMyt2dEdCZ1kySEg3em05ZmRydmRuMzM5OVZmL25UQnViQWtoUkpCOGNiSVdwL2ppQkVHZ2xGSXFpaUk0am9NZ2lKUmxSUWlpUUFSQm9JSktnQ0I0UWM4M0o5SnV0ME9qMFVDbjB5bmxXYkwvN2Z5NTh5aklMOENhTmFzdzhQbEJPSHNtRFF2bXo4V2t5Vk94YzhjT1dHMVd2REw4SllCNHlSeUdESG9lYTlaK0FLMlVRdkxGNTUvaDVWZEdYUGQ0ZnYvOTl3Q0FEaDA2SUNNakE3bTU1ZWY3aFFzWE1IL2VIUHhuMWh4czNMQU90Uk9UOFBERGZTRUlBbHEwdkZjeGhYdjI3SVhEdi8rdWZPL1hQYi9neHg5L3dMdExscGVLbHJkcjN3SHQybmU0T3pTMjdPeHNuRHg1RWxsWldjakt1b1M4M0R5WVRKZURCVWFEQVlJZ0lpZ3dDRVdGaFlvZnJTQS9INElnSUNRa2xHaTFPa0lwaFNBSWhCZDRJZ2c4WVNRQndEejVaUC93aTVuWll6dDE3bklvSmpaMmNkcnBVMDJ6c2k0QkFKS1NraEVWSFkzT25ic29pM3ZIam0vUW84ZUR0eTZRSXBrNkFFQWx5aVFaaEI3dSt3ajI3dDJEdzRkL0I4L3orT1dYbjVGNjhnUjY5dks2Qk0xbU13Z0JHSlpGY1hHUjRpT2hZdWtxbHJqNGVCdzZlQkFjeHlGZm9tblNhTFg0NU9PUDhQbm5tOEZ4SElxS0NyRnYzLy9RckZtenk2YndqdTNZOXZWV0xGMitVakdmcXQzOHJ1SXgzVzQzZmo5MEVQUG56Y0h3VjE1RllHQmdSWURlUktmVHpYbjIyZWUrUDM4aFk4VHE5OVpHU1JxY2xsS3FvWlNxZlRVNHlRL0xlTWtQZU1MeEhQRUdEZHpFN1hZVGw4c05INTljS2UzTmJyZkRLaVh4eXI2M3JLeExPSFRvQU9yVXFZdHUzUi9BdE9rem9ORm9ZYkZZTUhUWVMvajhpeTNZK05FbldMTjJIVFFhRFRaKzlJa0NhcWRQbllMYjQ2bFduNmF2SFAzakNDWk5ub3I3dTNYSHUwdFg0RlRxU1ZCS1VWeGNqQmNHL3ArU29uVDgrREVrSlNjcmYzLzA0VWJNWDdDb3d2RUgvdVhwSHBSU25EMTdGcG1abVFyRkVLdFNvNlM0QkZhYkZRNjdIUTZuRTlrNTJRZ0kwRXZPVjRMaTRtSVFoc0RsY2hPMVdnVVA1NEVvQ2dCQWZPaUJHQURraHg5L0NibDBLWFBZZ2YzN2hqRU1VeGNBT25ic2pJTUhEeUl3TUJDZE8zY3RadzdQbVRNTER6elFvMUlmUjNWTDJRVGRCZlBuWXNIOHVYaXdaeSs4TlgwRzZ0ZHZnTGRuenNKN3ExZkNrSmVIMm9tSldMajRYY1JJMmN4OUhub1lKMCtld05BaEw0QmxWWGpzOFg2b1g3OEJMSVdXVXNjWk0yWWNGaTlhNkgwUzE2Nk5kUnMrZ2thandZS0ZpN0Z5eFRKODhmbG5VS3ZWNkhwL053d2EvQ0lBUUJBRUxGcm9OUU9mZmJwL2FUTngwK2JyTm84cWtxb2VjK1JycjRJUUlERXhDV1BIVFZCOGtGZVF1bHFkYmtiZlJ4NTlvY2VEUFQvK1p0dlhuNDBiTzdwWTF0NGsvNXVpeFhsVFE0aElLQVgxVnFoUVFSUWhpZ0xoZVI0c3kxSzVjcVVpaWl2NVlXVXc1S0ZHalhBMGFOQVFaOCtlZ2NQaHdKaXg0NnFVMnZQNVo1L2lxUnVjVm5QZ3dJRktQeHZ3OURQSzN4RVJFUmcvWVJJQUlEdzhIQzhPRzRiWFh4ME9Tb0hrT25YUTd3bXZiMjMrdkRsd3U5MFk1Uk5vbVByVzIyalFvQ0VLQ3kxNGVkalFmMit0cU5WcXhmbno1M0hwMG1VLzJsOS8vUVdHVmNGdXM4SHVrNXVXbG5iNnN2WkNLZFJxTmRIcGRMQmFyVEx2RnBHSUlBbkRNSVJTeWlRbEpiRjc5dTUvbVdYWmwzLzY2Y2ZHKy8rM0Z6UCtNeHNBa0o2ZWpubHpaeU1vTUJDRFh4eUs1czFiS09lMWJPbTc0RGdPNDhaUHJEZ2llUzROWGJ0MnJmSjE3dDI3MTA5UVdJbFVOcGEzY014T3A1NDQvdEh5NWNzM2YvZmRkeDRKNEJRVEZkN2FWUG1WeXNYMkRNTlFRUkFVL2plVlNrVlpsb1ZhcllaS3BWTElMV1hUTkNtNWpzVDNKcEZaeHNTZ1pzMEVKQ2NubFV0M3V0Rnk4TGYvVlhuZjloMjdWTnQ1L0NzMU5xUFJpQXNYTGlBcnk1dkM0VXNFeWJBcXJ6UFc2WVRMN1lMZGJnZlA4NGlPaVFIUGNYQzZYTVJodDROaFdSQkNpQ0FJY2k2YUV1VThmZWI4TXk4TS9MOFJScU94Ylh4OFBQTEsrQTdxMUtrRHU4Mkdnb0o4TkcxNjJjVGEvT2ttbU0xbXpKZzU2NFpkcTE0ZjRFZXdxeHliV3pobWpXclVDSisvYytmT0owcEtTajRNQ3d2YlFRamhmQUZPMHVLSVY0c0RwVlNnb2xTckovbmpJSW9pVWFsVTFKY1ZSdGJhQUlLaW9pTHdISzhrKzdyZGJyaGRMcmhjVGlRbEpsVXJIVkpBUUdDVnlxb0NBZ0tyZGFEL2RjQ1drWkdCOVBSMFpHZG5LMG1CY3RLdDFXb0Z3N0JLS29mSDQ0SEZiSUZLcFlMYjVTWTh6NE5LQmVyZXRBMkdpQ0pQQkVFZ0FKZzJiZHAyZjJmSjBsY0RBd1A3VHBveUZWTW5UMFNOOEhDb1ZDd0N5aXlXanAwNm82UzRTRWsyTkJvTldQUGVLaVFrMU1LUVFkNG9Jc093MlBqUko5ZDF2U3pMd202M1ZmdVQrRTRUdTgxYWFRa1djNHZHekc2emdsV3BRQWhwRXhvYTJrWVFoTDRtaytuRHVMaTRBNFFRamxMS0UwSmtnQk5CSUlKQ2hDZ3FCSm1pNk0wYWthbXRSRkZVekZNQTBPbjBzSmFVZUZOQ2VEa2xoTHRjeWVCeXcrbHlvWllVOUxuUmtseW4zajhXd2djRUJDSzVUcjFxSGV0L2pTbEtLY1daTTJlUW5wNk9uSndjR0kxR2hXWklydmZNeWNrQllSZ3ZLMGVwc2lpZWVOazRlRi82SUZsTFkwNmtwalVJRGc1K2pSRHl5cTB5bnlvSDhreVlMUmJFeE1iNzBjeFhhemZrSWpJeUFvbTF5MU02WldSbXdteSsrV05tTk9RaUlpSUNTWW1sejRuanVIV3BxYWtmdDJ6WjhnSUFEZ0F2UlZJVkg1ek1IK2ZMQ2VkRGNFbkxtcVV5SlpJY01aVlRROExEd3hFVkZZVzR1RGpVcmwyN1drdnFicVg4S3pRMnVZb2dJeU5EQVRXejJZemk0bUtmSW5ZSDNHNDNSRXA5eTZJSXovUGdCUjZpUWl0RUNRVWxvSlQwZjJvQXUzRFJPeU5abG4wRFFNTE51SmFnNE9DcjJqOHhzVGJ5ODAwd0duSVJGQnh5MTJ0dWRwc1ZOcHNWQXM5WENHb0FrSlNZQ0pQcDVvMlpmRTZpSUpRRE5RQlFxOVhEV3JSbzBjZHV0Ni90M0xueng4ZU9IZlBJQUFkdmtNcTNBRi9oaHBOQmptRVlJdm5mcUV4Ujd0dGNSZ1k0WDlaZXVlZEN3NFlOcjduVzlIYVdPMTVqS3l3c3hObXpaNVU4R1Y4T3RiSmtrSVdGaGZCV0MvRGdLdGZTR0FEazNJV01uaHFOWmhTQUIyN21vblM3bldqV3RPbFZhNnNYTXpKaHNaZ2g4Q0pjcnJ1VG8wMnZEd0REc29pTWlFUmlZcTEvMUVZeU15OGh2NkFBQWk5VTI1anA5UUZnVmFvS05iV0tSQlRGUFNhVGFWMWNYTncrUW9odmdJR1hORGRCQWpSUkRpNndMRXQ5d0l5cTFlcFNKSmErUFJia0JqSnlkNnlrcENRMGFOQUFOV3JVOEFQYmJXTnVHSTJsMGpsazJ1NktHRzdkYmpmc2RqdGNMaGNSS1lVZ0VVRXFXaHFsQktETWthUEhZcU9pb2tjUlFrYmY3T3N4R2ZNUUZ4dUR1TGc0K09YdUZvL0hzK3FYWDM3WjJLZFBINE1VWUpBMU9NRW5jaXFERzVXMU5WbFRVNnZWVkc0QldCYmNmRTNTK1BoNEpDWW1va0dEQnYrcUpqSjNyQ21hbFpXRmMrZk9JVE16VTBubjhHMnVJdE82K0RMZENvSkFQQjZ1SXZZTkJnQno0ZUtsL2lxVmFqU0ErMjdtdFRqc050aXNKUUNvSDlUOEFnRFFhRFN2OWVyVnE0UFpiRjRiRVJIeEhTR0VsY0NOODhsL0kxNGxUeFI5R3Y1UUg2cDVXbG11VzJWMXA5VVZWUEFEV3hYa3dvVUxPSC8rdkFKcWNqcEgyZVlxWmVpN0NjZHhBS2g4MCtVdVQ4eTJiZHRxaFlTRWpNbThlUDdWbTMwdHdjSEJVS2xVaUkrUFEyeHNySDlGKytXeU9VVkl5L0R3OERVZWorZUQzMzc3YlVPM2J0MnlDU0dNYkpwU1NubGNabDRXdlY0SjZoc3BKYjVSMDdMcElUSjl2UysxdmNmalFkMXJZUER3QTl0MVNscGFtcEo0SzNlTktpekZkT3NvQzJyRXB4ZUI0a3VEVkRuZ2RydWZVS3ZWWXdHMDhpOGx2OXlPb2xhclgrcmF0ZXQ5K2ZuNWE2S2lvblpMdmpkR0FqVlplNU5UUWNwcWIrWFNRc3BXTHZoMlRwTUI3cDU3N3V5a2I1S1JrWEZIbktoY0hpVUhDWHo5YVdXMU5KOU9VY1JiV096dERDV25jRkJLeWM4Ly94eVdtSmc0am1HWUNmNmw0NWM3eVBlMmJPdldyZXNuVFpwVUNNRGprK0FyeVA0M3VXcEJTZ254OWIxUjN3b0Z1ZlZmVUZCUU9iK2JIRlM0VTlOQlZJbUppYmY5U1hJY2g5VFVWTVYzVmxHSHFBcTZRdmwyVS9jRk5jWnV0M2ZSYXJYakNTRTkvVXZGTDNlWXZEbCsvUGlVWjU1NVptMVNVdElSQUN3QU9YcEtVSnJKRjZJb2doQWlsMlFSbWYrdHJJYm1XMlR2Y0RoZ3RWcFJWRlNFbEpRVXFOVnF2eWw2bzhYbGNpRTFOVlVwa1pLckNYeGI0aWs5Q1NUQ1BWbFRrMDFQQ2RnWVNpbmo4WGlHc3l3N0VZQS9vOVV2ZDZRd0ROTWpNVEd4Y1VsSnljcVFrSkF2QURDU2VTb25sWmNLTE1nV0QvVUtrYXNYZlByWTRrckY5U2twS1pWMnhicHRUZEhiT2QzRGJyZVhBcld5MVFSbEd4YkwvalRKL0pUclBCbFJGRWx1Ym01OGRIVDBCRUxJcS82bDRaZmIxZDFpTUJoZ05Kb2dDQUpzTnVzL2ZvZm4rWFZIamh4Wk4zbnk1RnhKYzVNckY1VGllcCs4TjBpcElYSVNyNUx6Sm5lbUwxdWxFQjBkalpvMWF5STVPZm0yQUxmZzRCQ3dMSVBvNk9nclpoRGN0aHFiMVdxdEZOUmtobHU1OTZKdmtFQUdOWi9JSjJPMzJ6dHJ0ZHFKaEpBSC9jdkhMN2NycUIwN2Rnd1VSS21HcUdKVzJiRDZEUnZYNmRydGdmYzZ0R3Z6QndBRzNzaXBUSURxcFVYeS9rT2x2cmRlalkxU0wwT1MxQWRYM3VRZXVvSkl3UXNVSEMvQzdSR1FtSnlBb0tCYlg5bGl0OXVRbTJkQWJsNGU3cnYzM2pzSDJJcUxpeFZRazR2WnpXWnpoWnBhSlpGUHhaL21kcnNIcWxTcXlRRHErWmVQWDI1WE1SZ01vQ0RYVkwvS01FejNXclZxSjU1TVRWdlJKT1dlSGFDVW9ZQnYzdzFCb2dzUnZiRUFDc2tDQmJ6cmhDb21xUnhSbGN4VVVhUVFxUlJOcFNJYU5taUk0SkNRV3pwV2dZRkJDQXdNZ3NtWUI0UEJVR0dhMUczRm9QdkREeitnZmZ2MmlJbUpRZGV1WFRGaHdnVHMyYk5IWWVpb0tBTHFWdm9QZUgxcTBzYUlvcWlhUDMvK2xQVDA5TFhmZi8vOWJRTnFQTTlqMUtoUmlJNk9SbWhvS0lZUEg2NTBkL0xMM1NzbVV6NkNncThMTU9xR2hvVXRQbmYrNHZDRzl6UUtBS0NUdW1mSlBSZFlTc0ZTS25mTEVnalBjL0J3bkplcDErV1dlaXg0dTJOWnJWWVVGeFhCWWpIRFpEUWhKeWNIR1Jjdkl1MU1Ha3FLaTIrTE1Rc01Db1pSNnB4V1Z0Z1pNMmJjRmllNWQrOWU5T3paRXlrcEtYamdnUWVRbEpTRW9xSWlIRDU4V0k3c0tJQlcxdnlVdFRRdnRiTEFwS1NrMVByODg4L25kdTNhZGN5QUFRT1lrSkFRZE9uUzViYTR6b2tUSjJMYnRtMzQ5Tk5QOGV5enoyTHAwcVU0ZGVvVUhudnNNZi9xdm9zbE56Y1hOY0lqcnZwN3AwK2xZdDVVN01lSEFBQWdBRWxFUVZTYzJlalZ1dzhBTUNxMXV1T3ovL2RjU0t2V2JTNTh2ZlVyQitCVjNTb3pmeWxBY0xtUnQyU08wc3VicEtrVkZPVGowTUdES0N3c1JFUkVCSUtDZ3FIVDZmRDExMTloL3R6WjJMWnRLd290aFdncG1ZYjUrZmw0YTlvVWJONjhDVC8vOUJPYU5HMkswTkF3QU1CZmZ4M0h0Q21Uc0hYckZody85aWRhdDJsN1RWMndOQm9Ock5aaXhGZmdhN3R0VE5HMWE5ZWlhZE9tZU9hWlo1Q1ZsUVZDQ0ZxMmJJbUNnZ0tjT1hNR0tTa3BsU1hlbGdvU1BQamdnNjBhTldvMHBWdTNibjNsbTNlN2lOMXV4NnBWcTdCcDB5YUZtdWo5OTk5SHo1NDlzV0RCZ2dxYjN2cmw3aENydFFUUjEyQ0dOcnluRWQ2ZStaOVM3Nm5WNmtGZHVuU0ovdVhYLzYzcGZuK1hFNVJTUmtJM3hUU1ZzVTBVQkpHWGZHMkE5OVVMZUJLd2dlSkMrZ1Z3SEFlV1lSRVJFWUdNakF4UUFJR0JnZGk2WlF2V2ZyQWVHbzBHWThlOGlTTkhEcU4xNnpaWXZXb0Z1bmQvQUgwZmVSUi8vSEVFQytiTnhhcjMxb0xuZWN5Yk13dnpGeTVHVWxJeTFuM2c3U3Y2MHN2RHIybmNmSHNGMzNhbWFGRlJFZXgyTzNKeWNuRGh3b1ZTUHJYRXhFUWtKaVlxS1IxMnV4MzUrZm1rc0xBUU5wdU51Rnd1SWdnQ0k0b2lrNVNVMVB2SEgzOWNzbno1OHI2RUVIVHAwZ1ZIang3RlcyKzloWGJ0dkExNTI3VnJoOW16WjZONzkrNElDQWhBdlhyMThQMzMzMlBac21WSVNFaEFhR2dvaGcwYnBoRDNVVW94Yjk0ODFLOWZIeHFOQmhFUkVSZzBhQkRzZGpzOEhnK2FObTJLQngrOEhKUFl0R2tUdEZvdGpoOC9EZ0RvMzc4L1dyWHlGalVjTzNZTVRxZXpGTjlhNTg3ZVR0c0hEeDcwcjI2L2xCT3oyWXl4WTBaaDBQUC9oOEdEQnVMM1E5NTVrcDJkalFIOW44Q1QvUjdGcURkR2x2ck81SW5qTVdUUTgzMW0vMmZHMUpTVWxDNEFkS0RVdDVFTUs0b2lLNjhicFlrTXg2R2twSmdZREhsZVFrcW50M0Z6WkdRa0dqWm9DSTFXZzVLU0V1VG01aUF6SXdPN2YvZ0JLVTJhSUNEQVM3SmFJNndHL3BMbS9WOS9IVWVYTHQ1NUhob2FpclMwMC9CNFBERGs1VUduMXlNcHlkdVlKVHc4SEg4ZFAzYkR4KzJXYTJ4eW9LQmR1M2I0OXR0dk1YZnVYTVRGeFNFa0pBUjZ2UjR5MTd1YzBtRTJtd2tBcUZRcVFpbVZ1NjR6VnF2MVdZMUdNN1Z2Mzc3MUd6WnNpRVdMRm9GaEdMUnYzeDZQUFBJSXBreVpvaHh6L3Z6NTJMRmpCenAxNm9SWFhua0YvZnIxdytPUFA0N1RwMC9qMUtsVDZOYXRHeDU2NkNFODhjUVRXTFZxRlJZdVhJak5temVqY2VQR09INzhPQVlPSElqbXpadGp6Smd4K1BEREQ5R3VYVHQ4OHNrbjZONjlPMGFPSEltWk0yZWlSWXNXQ3JBVkZoWUNBSEp5Y2hSdzlIbTZJaUlpQXRuWjJmNVY3SmR5OHNYbm05R3NXVE1NR3Z3aTB0UFRzWHJWQ3JSdDF4NEpDUW40NzVhdE9IZnVMT2JPTGswMVAyL0JJbWx0RmJVWi90TFE4QTgvK21URjRFSFBmeXNwTWtTeVRqa0tDTjRIT0JHbGZGNFFRcWhLcFNKdXQ5dXJ4QUdnb0NDRWdkdmxnczFtUTc0cEh3QkJabVlHQWdJQ2NQRmlPbFlzV3dwQkZCQXMrUW1MaTR1aDFlbXdZL3MzK09tbjNkQm9OTERaYkNncEtZRldxNFhINDhIS0ZjdVFtNXVMb3FLaUd6NXV0MVJqODAzcEVFVVJBd2NPUk4yNmRXRXltWERxMUNrY1BYb1VxYW1wS0NrcGdkdnRSa2xKQ1pIQVFJbjRNQXpEQkFjSHYvTGxsMTh1MG1nMDllV0dGenFkRGhxTkJvUVFoVmxVbG43OStxRmJ0MjVRcTlWNDRva240SEs1TUhmdVhBUUhCNk50MjdabzBxUUpVbE5UQVFCSlNVbFl2MzQ5K3ZUcGc4VEVSRHoyMkdQbzJyV3I4dmw5OTkySFNaTW1ZZno0OFJneVpBaWFOR21DQ1JNdVYyazk4OHd6R0RIQzI2UFI0WEJVbUF1azFXcWxEbGwrOFV0cGFkMm1MWDcrNlVkODlPRkd1RjB1TEg1blNaVytKNG9pWnM1NEd3LzNmYlRlQXowZW5IWXE3ZHdBQURwcDAxQksxYUJVQllBRktLT2tSd0dFWlZYZ09BL3h1RDArcmY3c2NIczhjRGdjc0JSYWtKOXZRbEZSRVU3OC9SZkdqeHVENTU1L0FkMjZsYVl1bkRkbkZqSXlMbUx4TzB1aDFXcExLVE5qUnIrSnhvMVRNUEtOTjZ0bDNHNFpzUGttMzhvcEhTNlhDM1hxMUVHclZxM1F1SEZqUkVSRVFCQUVHSTFHNG5hN0pYWU83eE5IemxIak9HNThTa3JLZ3RUVTFDcDNxUEF0STVNSFBDRWhvWlJUVWdhYXZuMzdvbmJ0MnBnNWN5YWVlKzQ1dEdqUkF0OTk5NTNVT01NcjA2ZFBSMFJFQlBiczJZT1BQLzVZNlhOUVZ2UjZQVHdlVDduMzNXNTNwZjBSL1hLWEExdnJObGk1YWcxcUppVGc0NDgyNHUyM3BsYnBlK3ZYdlErZFRvZUJ6NzhBQUZIQndjRnZmZjNOOXNFQTlCSzRhUWtoYWtLSWlsTEtBbUI4QW5DRTQzaDRPQTlSSXFaT0p6aVBGK2hLaW90aHNWamdjYnRSWEZLQ3h4OS9BZ1FFSmRZU2hJYUZLZVpuaDQ2ZE1QS05VVkNyMWZCNFBBcHpiMGx4TVVhUEdZZmVmUjZDeStWQ21QU2RPeDdZZk11a3NyT3prWk9UZ3kxYnR1RGl4WXRLbmhySGNkRHI5UWdKQ1NHQWwvN2JGOVJXcjE2dDVqaHVPc013czBWUjFKWHRPSDVGKzF0VjNnS3ZyTmgzeVpJbDZOQ2hBekl6TTlHaFF3ZXNYYnNXdlh2M0xyV1AwV2hFVGs0T0tLWDQ5ZGRmS3oxdVFrSUNYQzVYS2RXYjR6aVl6V2JVckZuVHY0cjlVazdteloyTncwY09vMGVQQnpGNXlqUWNPblFRL3pUWDkrL2ZoNzIvL29vcFU5L3luZGU2SmsyYVRybjMzbnVITjJ2V1BCQlNPZ2lsVkEwcEhRUUFTMFdSOER4SEJJRW5QRmM2SFlUbmViamRic1drVkdzMGNEZ2NLQ2pJeDhXTDZkajl3L2RvMUxneEFLQkZpNWJLZWY1NTlDaVNrcEtoMFdnUUd4ZUgwTEF3YUNVTGF2KytmV2plb3NXZDcyT1RDOXA5YXorTGlvcVFuNThQaDhPQjVPUmszK1JiSW1zNGN2czdBR1RuenAxQlBYdjJuTW93ekxpaW9pS2NPblVLUTRjT3JmQjQxOHRPc0dUSkVreWVQQmt6Wjg1VTNzdkl5Q2dWd1h6cHBaZlFva1VMOU92WEQ2TkhqMGJQbmowckJLcVdMVnRDcjlkajM3NTllT1NSUjZSSnVCOE13eWpCRGIvNHhWY0dEbndCaXhjdndPZWJQNFVvaWhnemRqd1loa0YyZGpiR2pIb0RIT2RCY1hFeEJ2Ui9BdmZlZHg4bVRaNktsY3VYd3VWeTRiVVJMeXUvczNMMVdnUUhCMlBCb25kR3Y3Tm9vYWFnSUg5ZGJtNnUvSVNWbzZXOHROWUViMk1zd2V0aWsvYmhlWUY2T0s4NUNnSUVCd1VqTGk0ZW4yN3lkcEsvOTk3N0VCd2NESjduOGVwckl6Ri8zaHg4K2Q4dm9OZnJNWEh5RkVXcG1ETDFMY3lhTlFPY2gwT3RXclV3WWRLVU94dllLS1hseXFUazZHZHljakxPbnorUDFOUlVCQVFFUUJBRXVOM2Vwd1FoUkNiVEl5a3BLVFZtejU0OU5TSWk0azIxV28wcFU2WWdKQ1FFQXdaVTNMMDZLQ2dJQnc4ZXhLRkRoNjRKUE1MRHczSGd3QUhrNXVaQ0VBUXNYTGdRcDA2ZFFsT3BMOEg2OWV1eFo4OGUvUDMzMzZoWHJ4NDJiZHFFbDE1NkNkOSsreTBBNFBQUFAwZGhZU0ZHakJpQndNQkFEQjA2RksrLy9qcUNnNE9oMFdnd2ZQaHdEQmt5Qk9IaDRmNVY3SmR5VXF0MmJTeGJ2cXBDN2YrL1c3WlcrSjNQLy90VnBiOTN6ejJOOE1INmphKzUzVzdWNWs4M3JadisxbFN6dExaOGxBRUdsSXFDS0RLbHdDMG9LQWdhclVhMm5rQkFVQ01zREVsSlNZaUlpRUJNVEN3eU16TEFzaXdhTjA2cDFCL1l0R2t6ckgxL2ZiV08yMDAxUmE5VTBCNFVGSVRZMkZpSW9paWJvMFFHTlpabENhV1VYTGh3SWVMNzc3OS9LeTR1N3MwSEhuZ0FYYnAwZ1ZhcnhmNzkreXUxMDE5NzdUVWNPSEFBZ3djUHZxWnozckJoQTBwS1NsQzNibDIwYTljT05wc05reVpOd3A5Ly9vbXNyQ3lNR1RNR1U2ZE9SWU1HRGNBd0RENzQ0QVA4K09PUDJMQmhBd0JneTVZdFdMLys4azFjdkhneEhucm9JVHorK09QbzI3Y3Y3ci8vZml4YnRzeS9ndjF5VTBXcjFRNS9idURBbCtjdFdCUUZRQ3RWS2FpOXlvNVNwVUJFMFp0NTRHM0E3QTBvdU4zZUtnV0h3K0UxU3lXZm04bGtRbTV1TGpJeU1uRDJ6SmxiZW4wM2pkMGpMUzBOYVdscFNvczh1WnVVWENibHkzeGJKdm1XVUVySm1UTm5hdFNwVStjdFFzaEkvN1FzTGFJb0lpUHpFaXdXQ3dSQmdNdDVkNVpvNmZSNnNDeUw4Qm9SU0VxcVhXa1FSN1lldkdObUJzOVgzNWpwOUhxb1ZDcEVoRWNnS2FseTdzTzllL2VpYnYyYnoxcnJjYnMvMkxUcGsvZmZuajdOQXNCRkNIRkRhUnhEQkVJZ0VNSW9EV1BVYWhYVUdnM1ZhcVMrcFFFQkNBb01STERVemk4aUloS3hzYkdvWGJzMjZ0YXJqM3IxcXJlYXNiSSt2RGZGRkpWN0ZKVGxVNU03U1IwL2Z0eTNRb0Q0MnYzU0ZsU3ZYcjJwQVA3Vm9HWXdHSzY2VTVEYjdjRmZmLzBGVnFWQ2NFaW92NitvM1liQ29rSVVITTFIaStZdG9OR29Ld1MxUC80NENvWmxFUlJjL1dObXQ5dGd0bGlRWDVDUDFxMnV6RUNmYy9QekdWL3ExcTI3ZUhISWkycy8zTGhCV1lkZTA5UmJZZ1dJZ2loU1VHOHhQQlVFa1FpOFFKVnU4ejRrbFU2SEEzYTdEVlpyQ1lvS2kyQXVLQ2lWY1hBanBlWVZmcmZhZ1Mwcks2dFVqNEt5M2RrZERnZHExNjZ0YUdvZWo2ZFU3ZWZxMWF2Vnc0WU5tOG93ekp2d1N6bkpNK1NCVmFuOG5lQWxrWmtmaklaYzVPYmxJcWtDaHVpTEdabGdXUGFtalpudk9XVm1Ya0xpRmZxTDFreEl1QlhETm56cXRPbDhSa2JHMmwvMy9GS1poaXRjQmp1UlVpb1NTc3YzVWVBbFpsNlBoNFBMNDgyQkk0UWcvaVpIL2FzVjJJeEdvOUlpcjJ6amxRbzZTWkdLdU5Ra1VCdm5YN0lWaTduQWpLQ1FVUDlBbEpHZzRCQVVGSmdyQkRhTHhZTGdXekJtUWNFaEtEQVhYQkhZYnBrWnI5Tzk5djRINnowTjZpV3ZsN1ZhT2FCQXZkRUZLcGJLTXlFVUlBUWdjbGQ2RUVMQWVNa3N3VEFzV0phRmlsVkI1VFZmRVJVVmRlY0RtOXloWFc2Umw1K2ZYeW1kZDFtZm1tL3lMY013VS8zTHRESS9FU0FJd2wxdmZsYW1KUlVYV1NyODdGYU5XV0JnRUlvTExkZjAzWkxpWW1SY3ZBQzczWGJGMzA5S3JvdVEwR3NEYmIxZVB6cnQ3QVhYUFEzcWJwTHdUSmxxUG1NblhtN2Z4MUdPOHhBSitFQVlBc0l3RXJBeFlGa0dLcFhDMWd1TlJvUFEwTkE3RjlpY1RtY3BVQ3ZMcDFZSlNhVGNmSVZJdlFsZVlSaG0ycFVYOXRWVEtkOXVVbFdxNDRxRUVNRHA5SE81VlRvUEsrRzV1NVhCbFd1OVh4ZlR6OFBoc0Y5eEg3dmRob3lMRjlDc3hiM1hBYjZCbzArZU91Tm8wcmpoVmg5UW8yVTBPQkVBRlVXUjhEeFBuVTRIWVZtV01vU0FFQVlNUXlDWE5ubzNGVlJxTlRScURSbzFibnhUS01adk9MQlJTbkhtekJtbFRaNGMvU3lycVpXSmZzcU5KUmlKOWZaWmxtV253VnY2VWVseHJwRksrYmFUcWxBZFg2djh1UHNIYk55d0hpYVRFZkh4OGZoNDAyYzRkKzRzaGc0WnBPd3phY28wUFBUUXczNGt2STNsbjBETmR5NWRyMVVhR2hyNnhyRy9UdHBiTm0veXZhKzJWZ2JjQUVDa2xIcDlhcHlIZUhzclhBWTJobVhCTWhLd3lWcWJWb1BHalZPcXZhM2ZEUWMyWDFBcjI4ellicmRYU09mdDYxZHpPcDI5VkNyVlZBQlhOTWl2aDByNWRqU2Ivb25xK0Zva056Y1hDK2JQeGN4WmM5QzZkUnVVbEpRQUFPclZxNDhmZi80VkFQRFMwTUhWZGwwYjFxL0RZNC8zSzhWbUlwL1hzaVh2NE1TSnY2SFJhTkRqd1Y0WThlcHJZRmtXZ0plU1o4V3lKVGh4OGdTMFdpMTY5dXlGbDRlUFVENnZEdm1uWTNicDFCNXF0UnFFTUVoS1NzS1FvY1BRc1dPbmZ5dU9Sa1ZFUkx5NmN1WEtrdGRmZi8xQUdjMk5Fa0tvOUQrUm0yRHhIT2ZsSW1jSUpRd0JReVEvbTZTNUtjQ20xa0NyMGFKZS9mclZlZ0UzTkVFM0l5TUQ2ZW5wbGVhcHlkUkRVb3M4K0xMZlVrb1pxOVhhU3FQUlRBWHdqMWQ5QTZpVWJ6K0F1d0xWOFRVOVpOSk9Jekl5RWgwN2RvSkdvMUhLd0FnaFNtZWk2bnh5ZnJoeFBTd1djN24zWjd3OURUVVRFdkQxTnp2eC9nY2JjT2pnQVd6ZnZnMkFOeWR2MG9SeGFORHdIbXo3WmlkV3JGaU52Yi91d2RkYnY2cTI4NnpxTVZldVhvTWR1NzdEa0tIRHNIamhmR3o5YXNzdG1TZUVFTng3NzczbzJiTW5ldlRvZ2ZqNHEzdTRDNEtBMzM3Ymo4a1R4eU03SzZ1eVk5U0xpb29hdm1EQmdzYVM1U1RUakt1VnVsSks1VzcwaE9kNThKdzM5Y05US3ZYRGpzS2lRdnowNDI2c1hmTWU1cytmZy8zNzl5RkxPbTdXcFVzWStmcXJlUGFacHpCbTFCc29LaXBVenVHakR6Zml1V2VmeGpOUDk4ZXVuVHR1amNabU5Cb1ZVRE1halFxb3libHF2bDNhZlRxMEs2Qm1NQmhxNmZYNktRRGFWdlhtL051YzVvR0JRYkJacjU5UC92anhZNWd4ZlJvOEVzM000NDk2emN4K1QvVEhvTUZEcXZRYmh3NGV3TW9WeTJFdzVDRXhNUWxqeG81SFNwTW15dWQ3ZjkyRERSdldJZDlrUWt4c0xJWVBINEYyN1RzQUFFYSsvaXF5TG1VQ0FFYS8rUVpVS2hZSkNiV3djdlVhaUtLSXJsMjc0ZUcrZmFIVmFoRWRFNE5XclZzcm1lb1dpd1Uxd3NQeDNNQ0IwR2cwU0toVkN4MDdkVVphMnVscUcvZXJPYVplcjBmSGpwMmduaklOYjArZmhsNjkrOXgwWnBiazVHU3dMSXZkdTNkRHE5V2llL2Z1eU0vUGg4UitVd3F3NVNSbDM3L2ZmT04xMUt4WkU2ZFBuNElnQ2xjQzBOYUppWW5EeG80ZHUraWRkOTdKa2JVMkg1K2JIR0FRQlVFRUlieTM3cEV3bERBTUNFUEFzQXh5YzNOQkNNRURQWG9BbEdMRCtuV29WNzgrOURvZGxpNTVCNDg5M2c4OWVqeUlMejcvRE8rdFhvWEpVNmJoeEltL3ZYTnM0MGR3dTkwWVBud1lXdDU3WDVWQi9JWm9iRmFyVldIcThLMy9sRHUzWHltdGcxSktYbnp4UlRZaUltSXlJYVJ2MVk5WmNrTW5pOWxzeHVSSkUvRGNzMDlqM3R6WnR3emNLcU02dmhwcDBhSWx0bTNmaFRkSGpVSE5tZ25ZdG4wWHRtM2ZWV1ZRdTNEK1BONmFOZ1VqWG5zZHU3N2JqYWNHUEkweG85K0FTZEltTXpNek1IdldURXljT0FVN3YvMEJqenp5R0taT25hdzBwVm14Y2pXMmJkOEZBRml5YkRtMmJkK0ZsYXZYZUNjY3crQzVnYzhqTEt5RzF5bCtNUjBIZnZzTmJkdDY2M2dqSXlPeFl1VnE2SFI2WlVFZVAzWU16Wm8xcjdZeHY1Wmp0bTdURmg2T3V5V2xRNUdSa2NqTnpWVjhYYUlvb2thTkdxWDJPWExrTUtaT25naU80MkN4V1BEUzBDR3dXTHdSMlhlWExNUGtLZE9xcEJnd0ROUDd2dnZ1R3h3VEU2T1h0RGFmMGl1d0FCaHZSemlSdUZ3dTRuSzV3SEVlWWpHYmtaZWJDNWZUaGVMaUlnUUdCcUtrcEFRcXRScUNJQ0QxNUFsa1pHWWdMZTIwY3U4ZmVyZ3ZEdjkrQ0FCdy90eFp0R2paRWxxZERpR2hvV2pmdmdQK09ITDQ1cG1pbE5KeVZRVyttcHB2Qk5TM1E3dHZCSFRObWpXVENDSERic1JOLzJyTGwzanUyYWZ4N0ROUFlmNjhPWEM3WEZYNjN2dHIzOE05OXpUQ3A1OTlnYkhqTGhORm1veEc3Tnl4L2E1eVZPL2N1UjFkNysrR2poMDdRYXZWb25lZmgzQlBvMGJZdmZzSEFFQkVSQ1EyYlB3WWpWTlN3REFNSG5uME1YQWVEN0t5TGxYNUdLa25UNkpuajI0WTlQeHp1S2RSSTNUcGVuK0YrNjE1YnhYMEFRRjQ2T0crTiszNnEzSk1RZ2pDYTRURGR2M08rcXNXalVZRFFSQVFFUkdCVHAwNlFSVEZVa1NPQU5DcVZXdUVSMFJnNW96cEdEdm1UZlI3NGttRmFPRnFHNmVvVktybkZ5MWFOQkJlTGpkZmsxUWxZUWdqVWtvWWhvSEg0eUUybXcwdWw0c0VCZ2JDN1haRHBWTEJZTWlEMVdwRmRuWTJDZ3N0eU0zTlJXNU9EaUlqb3lBbkJSODZlQUJXcTNjODY5U3RoNk4vSEZFb2tsSlRUOEptczkwOFlEdDc5aXd1WGJxa3BIVlVwZmRubVFqb3dCdVZxM2JpeE4vWXN1Vy9XUHZCZW55NitRc3dESVAxNjlkVjZidm56NTFEaDQ0ZHk5MzQvUHg4N05qeHpWMEZiQWFEQVhGeHBWWCsycldUWUREa0FmQ3lQQnc5K2dlR3Z6d1V6ejM3TkFhL01GRFJkS29xS1UyYVlQZFBlL0RGbDF1Umw1ZUhEUlhjcDQ4LytoQy8vMzRJYytmT3I1QkRyenFrcXNla2xNSlNhRUhRTFhLSEpDY25vMUdqUnZqdHQ5K1VvRkJaNEIwK2ZBVCtQUG9IdEJydGRUMFk5SG85Qmc0YytLYkJZT2haZ2IvTnE3bDUvVzBNSVFTQ0lFQ3Qxa0FRQk9MeHVCRVVGQXhlRUhENDkwTTRmU29WRE1QQTRYREFaREtoVjYvZStPYWJyekZrOFBOSVRUMkp3RUJ2LzRUbXpWdWdaNjgrR1BuNkNFeWZOZ1VCK2dEb0EvUTN4OGVXbloxZExsZk50MVRLQjlSUVVRVFVicmQzbHBvWjM1QlphN05hRVJRVWpJQ0FBREFNZ3hlSHZvU0xGOU9seFpxSFJRc1hJTjlrUkdoWURZd2JQd0dKaVVuNCtlZWY4Tjh2UGtObVppYm16cGtGalVhRDU1NTdIbDI2M28rbFM5N0JzVCtQd21Bd1lQakxYcjYzdGUrdng0YjE2L0RubjBkaE5CaVEwcVFKTHFaZlFHUlVOTjU1ZHlrb3BWaTlhaVgrK09Nd09BK0g5aDA2NHJYWFI0SlNpbkZqUnVIK2J0M3h5S09QNGNTSnZ6Rm45bit3YnYySHQwVjNiVitKaVltQklTK3YxSHM1T2RsbzJkS2Jpckx2ZjN2eDZhWlBzR1RwY2lUVXFnWEFHeldzYUhHVkJUdTN5NFh2dnZzV2ZmbzhCSzFPaDdpNE9QVG84U0QyNzk5WGFyOHRYLzRYUCs3K0FjdFdyTHJtaE5PcmxhczU1cEVqaDZGUnE5R2dZY09iZm4ra3NrUDgrZWVmQUFDV1pjdFJ5OXRzTm93ZlB3WURueCtFczJmU3NHRCtYRXlhUFBXYWdrVk9weE5idG14UkFYamxyNy8rTWpSdjN2eFB5ZGNtU3Y0MkpXSktLU1VNdzhMamNWT24wOXVVbmpBTW9xS2lFQkFRQUoxT2g3Ly8rZ3VpSU1KaU1VTWJGNC9uWHhpTUJnMGE0bUo2T2k1bFppckhmVzdnODNodTRQTUFnSmVHdllpNmRhdGVVSC9OR2x0UlVWR0Z1V3FWZ0JvcDA2V2R5YzNOamRkcXRSTnhBenUwdDI3VEZqVnIxc1RMdzE3RTExdTNRS2ZUb1hYck5nQ0FPYk5ub1dmUFh2aDQwMmQ0L29WQm1DNVJMRC93UUErc2ZYODlhdGFNeDdTM1ptRHQrK3NWczJqVTZMR1lNSEVLa3BLVHNmYjk5YVU0cE5xMmJZY1pNMmNoTXpNREgzMnlHWmN5TTJHeFdHQTBHaEFZR0lBTkd6L0d4NXMySS9Ya0NSdy9mZ3lFRUV5Wk5oMmZidm9ZYVdtbk1YZk9MRXg3NisxYkJtclMvZkJxSDZLb2FOSUE4SERmUjdCMzd4NGNQdnc3ZUo3SEw3LzhqTlNUSjlDelZ5L0ZIMGtJd0xBc2lvdUxzUG5UVGRMdmxHYUtpWXVQeDZHREI4RnhIUEpOSnE4MnJOWGlrNDgvd3VlZmJ3YkhjU2dxS3NTK2ZmOURzMmJOTHB2Q083WmoyOWRic1hUNXlwdkdVMWZWWTdyZGJ2eCs2Q0RtejV1RDRhKzhla3NvM2ZQejh4V0EwbWcwQ0FzTEs5Y1E1Y0tGOCtqYXRSdis3N21CbURaOUJqUWFyZUpqdXc2cFc3OSsvUmRIalJvVlc1Ry9qVkxLTUF6RHlGUmpIbzhISE04UnpzUEI0M2JEWVhmZ3pKa3ppSXFLZ3QxaFIxRlJFUW9LQ21BMEdQREhIMGV3Zk5rU1BQbFVhVjVGanVPdzZaT1BRWWlYeDYxYU5UWkJFSkNlbnE0RUMzd2pvQldrZFpBeWFSMkVVc3BFUjBkUElJUThlQ052dUVxbHdveVpzM0Q2VkNxKy9mWmJESDVoSUdiTm5vczZkZXZpN0prMDlGemhKZXhyMDZZdDNuVzVZRElhRVIxemJXbTlXcTBXT3IxZU1Wc0RBdlRnT1E2eHNYR0lqSXpDeEFsandUSXNERWF2MzlIcm00ckE2REhqOFBxcnIrRDVGd2FqU1pPbXR3VFV5aWJvTHBnL0Z3dm16OFdEUFh2aHJla3pVTDkrQTd3OWN4YmVXNzBTaHJ3ODFFNU14TUxGN3lJbXhwdGYxK2VoaDNIeTVBa01IZklDV0ZhRnh4N3ZoL3IxRzhCU3BseG96Smh4V0x4b0lUWnVXSWZhdFd0ajNZYVBvTkZvc0dEaFlxeGNzUXhmZlA0WjFHbzF1dDdmRFlNR3Y2ak1yVVVMdldiZ3MwLzNMMjBtYnRxTTJOaTRHejRlVlQzbXlOZGVCU0ZBWW1JU3hvNmJjRVB6MklLRGc2dThiMFpHQnNMQ3d0Q2pSdzhBd1BIang4djEwbWpldkFXYU4yK2hySXV4NDhiZklQL3J6bTZ0VzdmT0FMRENSMnNUQVZCQ2lEZEdTa1VxMTR2eVBFOFp3cEFTYXdubE9RNmhvV0dJam9tRjNXNkhXcVdHV3EzR3JsMDd3RElzbm5yNmFiU1hJdXVBbCtKOCtkSjMwYng1Uzh4ZnNMaENiYk95Y2JzbVlQT05nRmJHcVZZRzFHUUdBTGxjYWpnaDVOVWJQVUZQbno0Rm5VNkhSbzFUMEtoeENyNzl0akUrK0dBdDVzMWJvSmhHaXBuRU1LQzQ4VngwZi8xMUhMdDI3c0RTWlN1ZzFla3dZM3JwcWpDSHd3RzFXZzJYeTFudEFOYXJkeCs1UTNncHFWKy9BZjYzLzhwOVREdDI3RlRwd3RWcXRaajIxdHVsM3F1bzRXMmJ0dTBxWkhtdFY3OCtsaTVmV2VGdnN5eUx2ZnNPM0ZTZ3I4b3gvMm04YnNRNTJPMjJLa1VxNWFxYjY1VlBQL3ZpbXI2blZxdUhiTml3SWVQRkYxL2NCaS9GcmtnQktyV1NwL0NtZ1lpaUtGS0JGOEFURG9FQkFVU3IxVkdkWGdlMzJ3V253MXVOb0ZLcjBLMWJkOFRHeHFGV3Jkckl5TGlJT25YcUFnQTZkZXFNVHAwNlYzb2VkcHUxVWovb1ZadWllWGw1Q2dXUmIxcEhCUkZRK0lDYW9xM1o3Zll1TE10T3JJN0prWFhwRWhiT253ZTczVnQrWWk0b1FHaG9LTFE2SGVvM2FJZ2ZwYWplSDM4Y2dWcWxRblQwUDJ0cm9hR2hLTWd2cUxDN1ZFVmlOcHVoMSt1aDFtaVFuNS92ellXU2lva05oank4dDNvbDN2OWdBdzcvL2p1T1hFWDR1bkxIYmdEOGNuVmpjeXZIckxKalIwZEh3M0dGV3VlQWdLcVp2RlhkNzNwL0t5Z282SlYzMzMyM2hSSk1rSnJDeUNhcG5BSWlpZ0xoZVFFY3o0UGpQUEI0WkFaZUZ4d09CK3cyRzBxS1M3d012UGxHS2JtL2FrbnFkcHNWMGRIUjF3OXNEb2VqRkZ2SFB3UUx5aVhocHFXbGhXbTEydkVBcXFVT3FtZXYzdWpjcFN0ZUh2WWlubjNtS2FTZVBJSFhSM3BwM0taT200NXZkKzNFNEVFRHNYSDlPc3o0ejV3cU9WSVRhdFZDMjNidDhQU0FKL0hDd0dkaE5CcXV1SCtuVHAyaDArdngxSlA5TUgzYUZOU3RWeDkydXgwOHoyUG0yOVB4MHN1dm9GYnQycGo2MXR0WXZIRCtkZnM5NUNlOVg4cFArc3BLc0poYk5HWjJteFZzSlJwR1hGd2NLQldSYjh5cjhOeVM2OVQ3UjlBS0NBaEVjcDBieDFqN0Q4ZU1pNCtQSC9UQ0M0TnF5T0JHeTRNYlF5a2xvaWdRZ2VmQmNiemtiL1BBN1hMQjVYVEM3bkRBYXJPaXVMZ0lGck1GSnFNUjJWblpTbCtGeXNiUlpNZ0ZDQ290UDd3cWF2RFUxRlNrcGFVaE16TlRxUVgxTlVWOUtneUlyTFZKdmpWR29pR2F4VERNaEJzeDZMZUtTcm02cFRLcTQ4cjlMWmt3V3l4K29za3lZalRrSWpJeUFvbTF5M09mWldSbXdteSsrV05tTk9RaUlpSUNTVmZnWXpPWlREQVlET0I1SGxicjdjOVc0M0s1VnZYdTNYczlBSWUwdVFCNENDRWNBSjRRSWhKQ1JJbGFYS1l2b2xxdGwxbzhJQ0FBZ1lHQkNBNE9SbzBhTlJBUkVZRzR1RGpVcmwwYnljbko1VFhGNEdDb1ZTckV4c1pXcXExZGxZOHRLeXNMMmRuWk1KbE1NSnZORlFZTFBCNVB1ZFFPT1ZqZ2NybWV1RkdnZHJYTzFqdEpydmE2RWhOckl6L2ZCS01oVjJFNXVkczFOWnZOQ29Ibkt3UTFBRWhLVElUSmRQUEdURDRuVVJDdUNHcXlTWHFsQlhzYnltdFpXVmxuYTlXcXRWZjJ0eEZDbElBQ0FIaFpQd2hrY0ZPcFZOQm9OTkJxdGREcjlRcXdoWWFHSWp3OEhGRlJVWWlMaTBPZE9uVlFTMG9udWxxcEVyQlpyVmFsc3FBc3FQbldnUHFtZHZpYW9FYWpzWlphclI1N3E1eXRkOUtpdk5wRVZFSUlXclZxaFlzWm1iQll6Q2l5V09CeTNaMGNiWHA5QUJpV1JXUkVKQklUcjd3ZzJyUnVqY3pNUzhndktLaldNZFByQThDcVZQK29xZDNKVXJObXpjRmZmdm5sMmFlZWVpb2JsNk9rTXJCUk9aTGdKYWZrS2NNd2hHVlp5cklzWEM1WEtTSktHZXdDQWdJUUhKdGcwTndBQUNBQVNVUkJWQnlNc0xDd2ExSmlxclNLWk5QVE53bTNnc29DWDFDVHF3c0lwWlNKaUlnWUE2RFZqUnpNNk9ob0dBekdmeDJ3eGNkZmZUb0RJUVIxa3BOUUp6bkpiNE5lcGJhYitDOEZtNXNwaEpDV2ZmdjJIUUJnRlFCQjZvL2dqWlpLcEpUd0VsTlNDZHpBY1p3Q2JpcVZxa0p3Q3d3TVJFaElDSnI0a0M5VVZmNHhlSkNWbFlXY25CekZuMVlacUYzQkJPMWZIYWtkaXJQVlpJRGpEbmVlTyt3MnJ6TVU5SVp4c2ZuRkx6ZFRkRHJka096czdNNlF5cTBvcFJwSXlidStnUVJCRUlnRWJBcHV5QjJ1SEJMTlVVbUpOMHFhbjUrUG5Kd2NoZUxvaG1sc2RydTl3bncxWDhKSUdkaDRuaTluZ21ablo4ZXExZXJSMVRXWTk5NTdMNHhHSTR3bUU2d2x4WGNrTmJqc0RFMUlxSG1uK1ZiODRwZFNFaDhmUDJqanhvMnBRNFlNRVNSL20rQnJscFkxU2FYcUJPcExSR20zMnhXdFRRNHNoSVNFSUR3OC9LcXFQSzRJYkdYejFjcEVQbjN6MVNveVFVbE1UTXdvQVBkVjUyREd4TVJjZFM5T3YvakZMOVZpa3JZWU1HQkEveUZEaG53QWdQY3hTUVhKSkJYaFpkMVZURktHWVloS3BhSXlDNGh2WUtHb3FLaVVyNjFSbzBaVkI3Wk1uNkpUWDhuUHo4ZVpNMmRLTVhlVTlhK1ZEUno0Y3F5bHBhWDF6TXJLR3UyLzNYN3h5MTBsTCsvWnMrZG90MjdkRHN2Z0JpbFNLaGZMUzAxZzVLcDVoVlB1Y3Zlcnk2WnFXVE8xcWkzOFZJbGhQNVI3aytNRjVGL01BbkVhUU54bUVFOHhDR2NESTloQkJCY2d1QURCNDkxRWpsQlJBQ2dsOGpiNC85cXc5YVAzalBMZlk3LzQ1ZTZUaEdiaS85VkxydkgzK1l1RlBBQ0JBQUpBWmJPVWdSZk5BQ3FDaWp5RjZDWVFYQlNDQXhDc0lJSU9qR0FCNGZKQlBMa2c3a3dRNXpuQWxvcjQ1RnBRcS82NTkwV0Z3WU9zYkFzTXBtS1lMVFlVRlR0aHM3bmdjTHJoZEhKd3V6bDRQRHc4SEErT0Y4RHpJZ1NCUWhRcFJFb0pCWmozbHcwZUNlQUIveTMyaTErdVRTaTljOCtkWlptdWgvZE1md1J5SU1FYlJKQURDU3lWaUNsRmtVSVFLSGhlQk1jTDhIQThQQjRlYmpjSHA1T0R3K21HemVaQ1ViRVRab3NOQmxNeExtVlZyVktubkkrdHVNU0ozTHdpRkJSWVVWamtnTlhxaE4zaEJUV1htNFBidzhQakVjQnhBbmhlSkx4QUlRaVVpSlFTVUJETHhYY2JzQ3p6aG45cStzVXZWeWNpQlF5V1NKZ0t3eUNJTEd4M2RqcmlvQVVMRmh5Wk9ISGlSYTlKNmcwbWVFMVNpSklGU2tSS3dBdUVjZ0pEUER4TDNad0tUbzhhTnBjYUpVNHRDbTA2RkZqMU1CWUZJdHNjQkVOeENQSks0bEFuZ1VOY2VBRXFxNG9zQjJ3NXVZVXc1WmZBVW1oSGlkVUptOTBOaDlNRGw4c2pnUm9QanVQQisycHJGS0FVaEFKTVNJaitOUUFKL21ucUY3OWNIYWdkTzFjZllNTVFGSEpuOThtVnBHWkM3ZVRISjA2Y3VCb0FEMitFVkg0VlFRZ0Z2RzM4Q0NFZ1VyTmxJdEVkc1NvMVZDbzFWR29OMUJvdE5Gb2R0TG9BaUNRUXhUWTE4b29Ta0djT3c3MzF6MWNJYnFWTVVXTitDUXpHWWhSWWJDZ3Fkc0JxYzhIaDhNRHA0dUJ5eTZBbXlDWW80YjBtS0tFaUpaU0NPUEpXZENlRXZQSnZtbkRqcG0zQi9YM2Z1V0cveC9NQ1JrMytBdEgxeGlHMDlwc1lQbW9USEE2UGYyWGY1V0lvakFUWU1NVEV4djlya3M2MVd1MmdQYi91YTQ3TFZPSWFTdUZESmU3Tm5oQkZrUWlDQUY3Z0NjOTVBd2VjNS8vWk8rL3dLS28yaXY5bXRtVlRJRTE2Q1VoSGFWSkUwQUFmVWtSQkJDc2xJQWdxTFlMU2xkNkQ5TjVFcFNnSWlpQktFWkFlbENJSVVnVUVFdEo3c21WbXZqOW1kNUpOSXlCTjJmTTgrMEIyWm5idTNwMTU1MjMzSENzV3F3V0xROFpQMVQ1SUpENHVqdVNVRkhRNkErZ0tjelBlTDlkenV4aTJHeEVKUk1jbWs1Q2dHclhVTkF2cEdkYk12SnJEc05udHNtQzNPMEpRR1VFQkFSQ05Sc1A3N2tzMGZ3d2JzNUZOUC96T3VzOTZzV2wxSDNidStaTitnOWU2SitZUlIxUjhvZitjVGk1QXVmTGxPMlF4YkFaUURHU3FXNG5PMWpCSmxnWEpMbUczMndXYjNaWlpGYlZtVmtWVFVsSklURXdrTGphV3lKdVJlUHY0M3Rxdy9YMDlUZzFCNDFKSlRFb2pKZFZDZXBxVmpBd2JGb3VqV0pEcHJTRkpNcktzT0FzY1lrYlV2RGNFZ1JmZGwyamVTRTIxTUcvcGJzTEdkeUM0Y1NXQ0cxZGk4YXpPckZ4emtKaFlOL1hRb3dwRkFVblMzNUduZHViMEh3d012ZmNwN1ROblRoTTJiWXJHYWVqRXhvM2ZFTkxsTFVLNmRuSVI1SW1Pam1iZ0J3TjR1M3ZYbGkxYXRtcE1GaXB4UlZIVUlvS2lpQTdtSHhSSHE0Y2syYlYyRHlmRlVZYWo1U00xTlpYazVDU05Vand4TVFtN3JNKzEwQ0lDV0cxMk5RU05UU0VoS1kza0ZBdHBhUmJTblViTldUQ3dTOWp0a21DWFpDUVp4N0lweEk4L2FxMHo2SFh2UGVnTDVPbm1rd2tkOWhYQmJjSUlxakdjSnhxTzRmdXRKN1R0ZFp0TVpQallqVlN0UDRyaWxUL2k3UGxJTEJZYll5WnZwbnpORVhnVTdVTzlwaFBac2R0VktOZG1rK2dkK2lYZUpmdFR2UEpIZkRwdmUrWVBHSlBNSzUwWDRsZjJBN3hMOXVlRlYrZHc0VktVdHIxajEwWFViVElSZ0dPLy8wMTZ1bzNnUnBXMDdjODJWRVh2RDRaZmROL2hqeWdFQVZMU2hEczZ0bktWcW93YU0vYWVqbS8rdkxrc1c3cUVTeGN2YWlTdUFGZXZYbUhEK3ZVc1dMU1VaY3RYY3VMRU1ZMDhkZjY4T1RScjlqOVdmcjZLZDk5Ny8xVVBEN09ITXh6RlVTRVZCRUVIT0kyYnl0c21TVWlPVlV3Mm13MnJMWXV5ZkhvNnFTbXBKQ2FxSVdsMFZCUUppVkt1T1RZOXdJMGJDVVRISkJPZmtFcFNrbG9GVFhPMGRsaXNkcXlhcHliaHFJSTZ2RFUxRFAxNDhFdTlLS0NDKzczR2dtVy9zSFY5UDVvOVY0WE5QLzdPSzEwV2Nuam5VR3JYVUJjN3o1aS9rNVVMdW1FeTZxbFVvU2c5KzMzQmp6di9ZT0duYjFHcFFsR1dmcjZQRjE2ZHcvRzlJNmxXUmVYck9uRDRJdVhLQm5CMHp3aU9ucmhLajM2ZlU4akhUTSt1alFrZDlqVVdxNDN3bjRjQzBHL3dWNFM4OXhuN2YxSVptanEycTBOOGdscmV1aDZSZ05Hb0o4QS84OGxzTU9nSThQZmkybzBFOXgzdVJnN0V4c1l5Y2NJNFlxS2pFRVNSOTk3clE0T25HM0x0MmpVR2h2YkhaclBpNit2SGlwVmZaS1k3aG56RWpSdlhBVlYweWRQTGl6VnIxd0VxcmYrY1dUTklURXJFMzgrZndVT0hhVm9XQU91Ky9vb05HOVpyK3dQMGZLY1hScU9Sc0dsVFhNYjIrNGtUUEZXM0xwNmVudGp0ZHZ4OC9UaHgvRGoxNnRYbnhJbmpmUENCU3VqajYrdGJyMFNKNGkwdVhicTBHYkE1WGxvaFFWRVUyUkdTT2xZa1NPaDBkdXgyR3phYkhxdk4wYWlibms2YVNRMUpFeElTaUltTndXVEl2YWRObjU1dTFYcldFcE95VkVFMW8rYklxemx5YTQ0UTFPbXRDU2YyZlZ4SXB4TjdQU3dYd2xzZDY5SHNPWldBOHNWV05XamVwQ29MbC8vQ29wbXE5bVdiRmsveVdudVZhQ1F1UHBYUFZoOWcxWklldk5SYVZmMmVOcTRqaDM3OWl5bXpmbUxsQWxVNXZWalJRaXliMHhXVHlVQ2xDa1g1N2ZnVjVpemVSYyt1amJsOE5aYlNKZjBvV2R3UFQwOGp5K2QyNWRxTmVHMDhiM1NvcC8wL0xkMktoNGMrbHlTckhvdlY3cjZMM2NpQnI5YXVwa2FOR29SMGU1dExseTR4Zjk0Y0dqemRrRktsU3ZIMStnMmNQMytPaWVQSHVSd3phY28wQUJJVEUrajlUZzgrR1BnaG9NcjJUUncvbHZFVEoxTzhlSEYrK25FckMrYlBZL1NZek9OcjFxcVZnM2s0TDRIbHhNUkVQRHc4aUk2T1p0S0VjVWl5aEk4alQ1aVltSWpKdzRQdk4zM0hqaDNiOFBUMGZMVkh6M2YyTEZ1NnhPbzBiSTVWQ1pJajM2YklpaUlJYWtpcTJDVzdZTFByRkwwekpEV29JV2w2ZWpxcHFTbHFTQm9majBFdmtwNHVZemE3amxHOEVhbUdvUEdKbVQxckdlbVpCUU9iemRtemx0VmJBOW5oclZXdFhMd25VTzFodVJEcTFIU2xvYWxlcFRpbnp0elEvcTc0ZU9aQzh6Tm5JNUJsaFliMXlyc2MwL2pwQ3Z4eEpsTlhzMjd0SUV3bWcvWjMvYWZLOGVlNVNHUlpac2lBbG56LzQrOEVQajZRTnEvTjRic2ZUbEM5U3U3TXJHWVBBMWFybE9OOWk4V09sNmZSZlJlN2tRUDE2amRnNTQ3dHJQeHNCWmFNRE1LbXp5alFjYklzTTJiMEtOcTgySmI2OWRWZzZxKy9Mbkh0MnQ4TUh6cVk3aUZkV0wzNlM2SnV1dW9MVktwVW1WYzZkQ3p3K0U2Zi9vT1JJNGJ5VHU5M2FkclV0U2QvMG9SeFhMNzhGMkhUWjJJeW1hcDA2OTdqZVZ3S0NZNEtxWm9TRTFDOU5tUlpRckpMU0hhN1F5dEJyWkphTFJZeUxCbWtwNlZyaFlURXhFUnVSQ2JtOU5qVW5yVVVraHplV3JyVFc3TTRRbEJuejVva0M1SmQ5ZGFjemJobndzZjQ2WFJpejRmcFFwQ3phVnRtV096b2RKbkYzNndHSkx1Vnovb1pXWVYramRuY1hiMWVSSzhYRVVXUnRpL1U1UHFaS1h5LzlYZCszUGtIdzhkK3kveGx1em04WXhpZTJZeFZxUkorWkdUWVNFaE13N2V3cDVhL2k0MUxwV1J4WC9kZDdFWk93MWF2UG5QbkxTVDhTRGlmcjF5QjBXaGt6TGdKdHp4dTJkTEZlSGg0MExsTDF5eTVZaHZGaWhWekNWdi9DUW9YTGt4R1JnWmgwMmRTcUZBaFRwdzRUbUZmWDIzYk00MGEwNkpsSzgxYkxGNjgrS3U5ZXIyN2MvSGloZFlzNGFpZExMeHRMbDZiWFJKMGRydmlVaVcxV0VqUFNDYzFOWTNrNUdUME9vR29hSmxpUlF2aDVXbks5TmhpWXBOSlNFeFhlOWJTclZyQndLWlZRZVZNYjAxV3ZUVm5idTN4Y28rOURUeitNRjBJNFVjdnUveDk2TWdsYXRmSW5VMjFZdmtpNlBVaUI0OWNjbm4vUVBoRnFsVEt6RHVjdmVENlZEdCs4bStxVlZZSklZZU0yc0Q1aTFGMGVlTnBWaTNwd2Y2ZlB1TFU2UnNjUDVtVFE2cDJqZEtZelFiMkhqaXZ2YmZ2MEFWRVVlRHBiRjZqRzI0QVRKbzRudkFqNFRSdi9qekRoby9rMEtHRExnL2QzTEJ2MzE3MjdON044QkVmdXdnV1ZhaFFnYVNrSkg3WnMxdkx0MzIvNlR1WFk4K2ZQOGZHamQ4VWFHeFAxcWlCMVdyRlpESWhTUklIRCt5blppMVZ5N1JXcmRyYU9JLys5aHRCUWVVd21VemwrL1R0MTV4c1JZVHNYcHZzOU5yVVFrSm1sZFNtQ2k5Yk1qSklUMWR6YlNrcEtjVEVKaE41MDlWcjA4Y25xQ3NNVWgzZW1zVmlVOWRzT1VOUW04TmJrMXk5dGQvMkRQZlI2Y1MzSDdxY3hJWmZlYWIrNHp6ZnRDb3JWaDNnNU9ucnJGclNJOWQ5Zlh3ODZOZXJHWU5HcnNmYnkwU2xDa1ZaL3VWK0RvWmZZdXJXRDdYOS9qaHpnNFhMOS9EdTI4RWMvdlV2NWl6YXhkSTVYUnhHTDVJK0g2NWhYdGliQlBoN3NXTFZBYnk5VFpwaFhQdk5FZUlUMG5pdlJ6QmVYaVo2ZEdsTTM4RnI4Zkh4d0dqUTB6djBTN3AzZWdaL1B5LzNYZXhHRG5UdTNKV3dzQ21zWGIwS1daWVpPT2dqUkZGMEtSNGtKaWJ5V3NkWHFQUFVVd3dkTm9LNXMyZVNrWkZCbi9jeVU5OXo1eS9DeDhlSFNWT21NZlBUNlN4YXVBQlBUMDhHWmhOU1BuYjBLQnMycktkOSt3NjNIRnZac2tHMGI5K0JkM3YxUkVIaDJXZURxVmV2UGdEdjkrbkg1RWtUV1BmMVY1ak5ab1lNR3c2QW43OS9oL2F2ZE5pK2NjTTNOc0RxTUc1MlZHVXJsVzFYYmRwMTVOcFVyeTFybGRSaXRXcTliVG9SNGhNa29xS1RLVjdVVjR1U2hGbVRYK1ZHUkR4Uk1jbkV4NmVTbUt3dWVrOU5zMnBMcVRJc2ttQzFTdGp0aWlESmlxZ29pTmJvK2YxME9qSHNZYm9Jbm00K21TZXFsdURDWDlFY09uS0pHdFZMTVgxOFI1NTlSbTJwcU50a0lpKzNxY25Jajlwb3gxaXRka2FPLzQ0dnZqcEVRbUk2dFo0c3pmaVJiZmxmc01yOTlPSEk5Wnc1RjRHZnJ5Yy8vM0lXblU1a2FHZ3IrcnpUQkZEYlBRWU0vWXJ0dTg2UW5KSkJuWnBsbURhMkE0MmVWbVhRT25aZHhPV3JzZnk2ZTdnam4yWWpkTmpYclBubUNLSWcwTEZkSFdaUGVRTVBENFA3TG42RXNlZDQ1ZitrNmxwdWlJK1BuMWpqaWFyZkF5bEFLcEFtQ0lJRlZkM0s3bEMxa25VNm5XSXdHakVaVFlxSGh3a1BzeGxQc3lkZTNsNzQrQlRDdDdBdm9nZ05hMG1VRDNxTWFsVktVRDVJcFRVU3hvOTh5WFVabGNON1MwMnprcDVoSlNQREpsaXNFamFiSWtpU0xNZ3lZdWZYNitrL1c5RGpNUERrdzJiWVdqV3Z6dWloTHoyeU40aWlnQ0M0di92RE1tY0YvZXhIeWJBcGl2SkhvNFlOM3YvNzc2c3BEdU9XSmdoQ09tQkJsZXlUUkZHVVJWRlVEQWFEb2hKUGVpZ2VIaDZZUGMxNGVucmg3ZTFONFVLRkVRU0Zlay9LbENubFQ2VUt4YWo1UkdrOFBBem9VeHk1dFl3TUcxWkwxdFVGV1JhNVordGJXenFuVzVlSHphaGxoK0RiKzEvM2cwZWVtMGJSSXJlL3JFWlM5RnlPcWt4OGtoNUpGc2xJZnpSVnFqek1ablNpZ244aE8wRkZ6aUlLZWJmUXlBcGNpYWxNYklJSlNkYmRzemxUeHlRVFdOaEMyY2ZPM3RMSVhiOTI3Vkg0cWFvdldMajQyUmZidE5ycHlMWFpGRVd4Z1dBWEJMV1FJTXV5QUNnMm15M1RJT0pZNlNTckt4VThUQ2ExdVRsRklqRXBrOW9vcUV3Zyt0UTBpNE81STF0dVRaS1JKRm1RSk1XeHlrQjlvU0RxOWJvdUQvMVRJV0hSSTNFenA5djkrUDFDS2ZRR0Qzd0t1M1ZGVTFOVGlFOU9JaWFoS2pVZnY0cEpuNWlyVWZ2MTNCUG85T2I3TW1lcHFTbkVKaWNSRmY4RTlTcWR5dGU0bFN6MWFCRGpGQzlSb2czd2k4T3dXUUc5SUtESDBkZUdxbXdscU12UUJRVUVRUlFFUlJUVmJnUlJwOE5pdFNLZ2tKb21rWnljUVh4Q0dqRXh5WlFxNFllWW5tNVR2VFdyU3lNdWRydUVKTWxxSmRSQm5xU0FrSFp6Ym11ZzhjTTRXWWQyREgza3d0REl1Q0xvRFI3L0tWYUlmd0l2TDIrS0ZpdUJUdTlCUkZ6dWlsK1hvNnVoMDV2djI1eGxqc25NbFpqS3VBR2lLRGJjcy9kQUxUSkpLQTJLb3VoUUs2U3FOVk1VRkVWV0s2U3lNNHJNdXBaVWxTUklUN2VSa3BwQllsSWFzZkdwUkVZbElhWnJQR3RxejVyTkxtR1hIRWJOR1lKbU1uZ0lSb1B1VGZmUDh2QWdOdEgwbjJTRitLZnc5aWxFVEtJcDEyMXhpZm9ITW1mZVBvV0lTVEM1Znh3SFNwY3VuYjMxdzhuOG9YT3lmamhvalpBbHRmM0Q3bGdrYjdmWnNEcGFRTkl6cktTbVdVbE95U0FoSVkyWTJHVDBGa3NtZWFUV3M2Ym0xZ1MxYjAxeFdFNkVoQ3N6bnhRRTRkWGJDZ2tmNFdUMnZaNGZTZFloeVRxM3A1YUhsNVFZSDRzc2d5aTZ6dmVEbWpOMVRIRjM5SnNuSlNaeSthK0xwT2Fqb2V2bDVVMVF1Y2NwVkxqd1hSbnZ2VDZud1dCb3UvYXI5Vis5OFhySEMyUlNoK3NGUWJBN3dsRlpsZXhUQkVtU0ZVbVNCTWt1S1U2dnpXNnpBUW9XaTB4NnVwWFVWQXVKeWVuRXhhV2lWM05yV1pkTnlRNXZUVmFMQmdvNCtkYTh2RXl2RjJUQS96R0s0M3Y3RlBjRW5VNmlpRzlDdmxUSHVVRW5Tbzlzb2FBZ1NFOVBkekZxb0JxVUJ6bG42ZWxwZC9RZysrdlNCZExTVXZQZEp6VTFoY3QvWGFSR3JUcDNaYXozNDV5MTY5UitEcmlhSmRkbWRYaHRrcUtvdVRaRmtSVlZ4VXB5cFRheTJ4RlFzRmdsTWl3MjFXdEx6aUErTVExOUZ2MENOYTltenl3YXlBNVhFQVZoODFkOVBFUlJlTDBnUnUwL1JuRjh6NUdhbWtKRWdsKytWTWQzaXUzYmZtTEY4bVZFUmQya1JJa1NmUDdsR3M2ZlAwZVA3aUhhUGtPSGorU0ZGOXE0ZjRpSEdMY3lNRm12cFgvVE9UMDl2ZHEwZTduOSt1KyszV2pKekxWaEV3UkVVQnk1TmtGUUZCbEpraFZKbGdTN3VrZ2V1OTJHQUZpdE1oa1dHK25wVmxKU00waEtTa2VmblVEU25pVzNsblg1VlBPbTFWNEZTdDlxb0ZrcGp0MG9lSWppNWVYTnpVaVptL0YrRlBPUHZ5dWZlK1BHRGFaTW5zaVljUk9vVjY4K1NVbEpBRlNvVUpIdE8zY0Q4RTZQYnZmc2V5MWZ0cFIyTDdjbklDQWd4N2htelpqT3laTy9ZelFhYWY1OFM5NTd2NC9HS25IdDJqWG16SnJCeVZNbk1abE10R2pSa2w2OTM4dkJPbkUzY2F0elB0ZTRJUWFEQVVFUUNRb0tvbnVQbmpScTFOaDk4ZjV6bEJyNThhZ0czMzI3Y1JmYUVpdEZEMEttUG9KS0lhNWt6YldwaStRbFFNRnFrN0ZZN0dSWWJLU2xxN2syMFJtQ1NwS2MyZUloWjdaNDRHengwT2tLdE9UL3YwcHhmRi9DMG55b2p1OEVaLzg4UTJCZ0lJMGFOY1pvTkJJWUdPZ0l4d1JNSmhNbWs4bGxMZUhkeG1jcmxoRVhGNXZqL2RHalJsS3lWQ2syZnJlWnhVdVdjK2pnQVRadCtsYjErR1dab1lNL3BGTGxLbno3M1dibXpKblBudDI3MkxqaG0zczJ6b0tlYys3OGhYeS9aU3ZkZS9Ra2JPcGtObnl6L29GY0o0SWdVS2RPSFZxMGFFSHo1czBwVWVMMm5BaEprdGkvZngvRGhuekV0Yi8vdmk4cGdiRmpSdkhXRzYvUnZWc1h6cHcrclczNysrcFZ4bzhiMDR3czFWRWM2MGVkREx1U0pBbVNKQW1LSWd1U2F0d0VwN0N5SktrUnA5VnFkL0hhTk1QbTB0NGhPU20vMVJhUCtLc3puaEFFV3Q3cUMvd1RpbU0zVk04dEw2cmoyOEh4NDhkNHVXMGJwazJkVEdSa0pDKzNiY1BMYmR1dzhyTVZCZjZNUXdjUDBQbXROMmplTEpnZTNVUDQ0OVFwbCsxN2R1OGlwR3NuWG1qMVBOMjdkZUhRd1FQYXRuNTkzK2ZsdG1wbys4R0EvcnpjdGcxOTMzOVhNeUxCd1UzcEd0SU5rOGxFa2FKRnFWdXZIdWZPbmdVZ0xpNE9QMzkvT25YdWpORm9wRlRwMGpScS9DeC8vbm5tbnMzNzdaelRiRGJUcUZGamhnMGZ5WkxGQzEwWVplOFh5cFVyaDA2blk5dTJiZXpkdTVlYU5XdGlNQmh5TmRpNS9YOUEvNzc4c21jM1o4NmNScEtsMnpwMzQ4YU4wZXYxZVQ0Z2N2dDczZGRmNGVucHllcTFYek40OEZER2p4dUQ0cmpJWjg2WXpzdnRYMm0yWnUyNjBtVFRId1YwZ2lBSW9pZzYxNDRpYXpVQVNYczVxZFdzRmpzWkdUYlMwcXlJem9LQlhTc1lPTFVNdEtLQjRPM2wwYjVnVDVJN3B6aDJRMFZLcXZDUGMyeTFhdFhtMjAxYkdCQTZrSklsUy9IdHBpMTh1MmtMSWQyNkYrajRpeGN1OFBISTRielhweTlidG03ajFkZGVaK0FIL1RYdXJpdFhMak4rM0JpR0RCbk81aDkrNHFXWDJqRml4RERTMHRTay9KeTU4L2wyMHhZQVpzeWF6YmVidGpCMy9rSUFSRkdrVStjdStQcXFudWxmZjEzaXdQNzlOR2p3TkFDQmdZSE1tVHNmRHcremRuTWNQM2FNR2pWcTNyTTV2NU56MXF2ZkFLdk5waG5rKzRuQXdFQnUzTGpoY0NaVWlpMC9QMWRQLzhpUmNFWU1HNExOWmlNdUxvNTNlblFuTGs0VkcvNTB4aXlHRFI5NVJ3NUlRRUJBbmw3K2h3TkRPWDdzcUdiTUZzeWY1N2llem11L2I5VnExVEVhalZ5N3BucUs1OCtmbzBHRHA2bFZ1MWFEWEx3MkVSQVZCVUVRQkxYdFE4bGFSSEMwZ05pemVtMTIwak9zaUhaSjFzUlpuR0dvckdTeWVLQW9naWdLTC8rVEgyTFF3RkJlNjlpZWtDNXYwYlh6bTJ6Wi9MMlcxM2l0NHl1MGIvY2kzVVB1N1dLRzdpRmR1SGp4OW5RRnR2MzBJNjkxZklVWFdyZGc5cXk4Q2Y1MjdOak82RTlHL21lTTYrYk5td2h1MHBSR2pScGpNcGxvMWZvRnFsU3R5amFIa0VkQVFDRExWM3hPdGVyVkVVV1JsOXEydzJhMTh2ZmZWd3Q4amo5T25hSkY4NmFFZE9sRWxhcFZlUzY0U2E3N0xWd3dEN09uSnkrMHVYODZRUVU1cHlBSStQdjVrNUo2LzBWNGpFWWpraVFSRUJCQTQ4YU5rV1VaazhtMVA2NXUzWHI0QndRd1p2UW5EQm80Z1BhdmRNRGYzMTg3L2w2Z1Q5LytUSnd3bnJselpyUDFoeTEwNmFvV3FCNnZVSUZmOXV4QmxtVXVYYnJFelp1UnBDU3I4L2I0NHhYWXMzc1hYbDdlemJNWk5YMm1jY3ZzYVZOa1J6anExRWVRVk1kTVZaS1hzRmh0cEdmWUVMTVlOYTFnSUN1QW8yaVFHakczR1hlQklmZWpJY05ZK2NWcTVzeGJ3T2NyVjNEcDBpV04zbmhxMktjUDVRM2VvbVVydmw2L2dXN2QzdVpSUW1Sa0pNV0x1K1p0eXBRSklqSlNaUlgyOXZibXQ5OStwWGV2SG5SNjgzVzZkZTJjYXlpU0g2by84UVRiZHV6aXEzVWJpSWlJY0ZFNGN1THpsWjl4K1BBaEprNmNuR2Y0YzdkUjBITXFpa0pjZkJ6ZUR5anRVcTVjT2FwV3JjcisvZnUxb2xCMnc5dTc5M3NjL2UxWFRFYlRQM293bU0xbU9uYnNTTWVPSFRFWURMUnIxNDZPSFR2eTJHT1B1ZXozZUlVSzZqM3oxUnA2OVg2WFFvWFVYUHVycjcyQlRxK2plN2N1ZlBINVozaDdlMlAyVkwzalFSOE81dWVmZC9KMjk2NVZ1b2FFVkhFWXM2eDVOcDJpS0NwWG0zTTFnaXdqT1VOVFdkWTZPbFN2VGNKaXNhR1hzcXd5Y0RUa09zTlFBTUZrMHJlOW16OUk0Y0srUFBGa0RTNWVPRS81OG5tVEt5WW1KakI1NGdTaW9xS3cyMjEwNnR4VlkrTThjK1kwTTJkTUp6MHRqU0pGaXpGMDJBZ3RNYjU3MTgrc1h2MGxsb3dNcWoveEpCOE0vRkRMUCt6NmVTZGpSMzlNZW5vR2ZmdjExN3lFYjlhdlU1UFhpa0xUWnYralcvY2V0L3dlUjQ2RTgrbjBhWWlDU01sU0pmRTBlMnJiOGh0RDgyYkI5Qi93QVV1WExFSlI0UHN0V3g4NncxYTBhRkVpSXlKYzNydCsvUnExYTZ1OVNudC8yY09xTDc5Z3hzelpsQ3F0RnNxZmE5d3cxNXNydTdHelpHU3dkZXNQdEc3OUFpWVBENG9YTDA3ejVzK3piOTllbC8zV3IvdWE3ZHQrWXRhY2VYZXQ0ZlJXdUoxekhqa1NqdEZnb0ZMbCs3OUV5bXExWXJmYk9YcFVEZnQwT2gwV2k4VTFwWkdTd2tjZkRhUnpseERPbmYyVEtaTW5NblRZaURzcUZxV25wN04rdlZvb2FkZXVIVC84OEFOWkY2ZG5qWEIyNy9xWjhSTW1NVDFzR2hNbVRhWlNwY3FZeldhR0Roc0JRRkpTRW0rODFvRVNKVW9DVUtwMGFUNmRNY3R4Myt4cStQbktsWDlrTld5Q0lEakNVVVhJR25xcktUTUpSUkdRSkFXN1hmWGFiRFk3Rm90ZERVVlZiMDBXSEVVRFRhaEZVUlJSRUlTN0dnTkVSMFZ4NnVUdlZLbFNOZC85enAwN3gvK2FQOCt5RlN1Wk0zY0JzMmJPd09wWUd6YnE0eEdFaGc3azh5L1g4TXd6alZpeWFJR1dyMW0vZmgxejVzeG41UmVyQWZoaHkyYnRNMzE4ZkZqNXhXcEdqeG5IL1BsekFaVlliL1BtVFN4Y3RKUWx5ejdqdDk5K1k5ZlBPL01kbThWaVljSzRNWXdhUFpZdlY2K2xUT215MnJaYmpjRnV0eE1WRmNXNmI3NWwvVGNiSDVqeGNuWnZBeWl5ak4xdTE0eFFteGRmWXMrZVhZU0hIOFp1dC9Qenp6djU0OVJKV3JSVTYwZXhzYkVJQW9nNkhZbUpDYXhlOWFYamMxeXJIc1ZMbE9EUXdZUFliRGFpbzFSSlFxUEp4QmVmcjJUdDJ0WFliRFlTRXVMWnUvY1hhdFNva1JrS2Y3K0piemR1WU9ic3VWcjRkTS9EN3dLZTAyS3hjUGpRUVNaUG1rRHZkOS9IeSt2K0U0UkdSMGRyQnNwb05PTHI2MHRDZ3F2SzJjV0xGd2dPYnNwYm5Ub3o4cFBSR0kwbUxjZDJyM0R5NUVrK25UR0w1NEtiTU9MalQvanQxeU11MjVPU2twZzJkVEl2dnRRMlJ6ajg5OTlYV2JaMGNiTXNJYWhXUkhCNGJLSWdDQzdMckZRYU5kbFJJM0ROdGVuVlNxaXNlV3V5eW1FcEFFSjY1THpXUU1tNzhhV25oMDNGN0dIR2FETFNwMjkvU3BjcGsrLytOV3ZXWXZteUpXemI5aU02blI2TEpZUGs1R1FTNHVQeDl2YWhhclhxQUx6VXRoMU5telVENFBEaFExejcreXJ2OW41SGU3SjVlL3RrNWgwYzdKNVZxMVhURXVIaDRZZDQvdm1XbU0ycWEvemlpeThSSG42WXBzMytsK2ZZcmw2OXdtT1BGZEdNYzVWcTFkajN5NTRDalFHZ2EwaTNlNWJuS0FpeU4raE9tVHlSS1pNbjhueUxsbno4eVdncVZxekVxREhqV0RCL0xwRVJFWlFwVzVhcFlaOXFNbTJ0WDJqRHFWTW42ZEc5S3pxZG5uWXZ0NmRpeFVyRXhidmVPQU1IZmtqWXRLbXNXTDZVTW1YS3NIVDVTb3hHSTFPbWhqRjN6aXkrV3JzR2c4RkFjSk9taERqQ2ZVbVNtRFpWRFFQZmZOMjF3K2p6TDFkVHJGanh1ejRmQlQxbnZ6N3ZJd2dxYyt5Z0R3ZmZ0VDQyUlFGdno0S1h3aTlmdm95dnJ5L05temNINFBqeDQxaXQxaHozdzYyQXVRQUFJQUJKUkVGVVQ4MmFLazIzWHE5blVEYW0zRHZGZDk5OWwzY3VQY3M1YXRXcVRhMWF0YlcvRnk5YXdPNWR1L2hmOCtkekZMSDY5M3VmbE9RVVFycS9YV0wwMlBGUE5ubXUwYS9aOG13MlFiWGt6bkJVVVlzSU1vS2dlbXlTbzFiZ3pMWHBKYWZ5bEhQNWxKcGJBeENNUmwzcnUzWHhEUHB3c0VZYlhCQ3NYYk1LdTgzT2xLblRFUVJCYXg5d2hqaE9HQXdHL1B6VUo2ek5haU80U1ZOTmJpeS94Ry9XRUNtcmR5NElnbGFLemkrL2tsZXphRUhHSUdaZjUzT1AwTEpWYTFxMnl2a1RWcXhZaVYvMkhjejMyRWFOR3VkNTQ1cE1Ka1orUE1ybHZYZDY1ZVMvcTkvZ2FiNWV2eUhIK3hVcVZtVG03TG01ZnJaT3AyUFAzZ1AzMWRBWDVKeTNtcTkvQWtFQXZjNU9hbXBLZ1NxVmlxSnc3Tml4ZjN6ZVZXdSt1bTl6M0t2M2UvVHFuYnVtK3V3NTg3T21LdW9CeDdPRm83cHM0YWlneUxJaVNYWkVRVVNTQk1maWdreXZUWlNkWWFpakdxcVN1V2xoYUdzZUVLS2pZL0QyOFVZUUJJNGZQMFpTVWhLS29sQzZUQm1TazVNNWYvNGNBRC85dUZVVGNxMVh2ejQvNzl6SjlldXFXT3pPblRzNGVmTDNmTTlUdDI1OXRtL2JSbnA2T2phYmpSKzJiS2Erb3pTZEY4cVdEU0k2T2xvcnVVZmN5SlQzdTVNeC9KTW52VGxMYnMrTjdFbHZ6eHc5Z1E5NnpuSWJFMEFSM3dSU2svTVd6ZmIwTEZqSVc5RDk3dVpuM2Mxem1qdzhtbVR6MXB3OWJhTGo1U0RsVUFSSmtoQUV1eUE3bzg0c1hwdGVDME1WQlNWTEdKb1dNYmZwM1FwRDgwSitnaFN2dmZZNlk4ZU00b2N0VzZoY3BRb1ZLbFlrTVNHQndNQkF4b3diejZkaDA3QllMQVErRnNpUW9XcGlza3FWcXZUclA0Q2hnei9FWnJkUkxxZ2NnNGNPeTNjTVQ5V3RTOHRXclhtM2wxb3dlUGE1SmpSdDJreExoaTVkc3BpVTFCUmtTV0xmM3IxMDZSckNTMjNiTVhUNENFWU1HNEtmdno5NnZVNHJIdHpKR1A3SmsxNFU1UUkvNlI4bHBLWWtJNHB5anA1QWRjNmtCekpucVNuSjZFUXAxejdGWXY1eDNJajFKeXBTd2N2SEw4Zll5cFd2Y010RjZaNmVYcFFyWCtHdWpmZEJuQk1vc1gzSHJzclBOMjk2Z2l3MFJrNmpwaG8yQkZtV0hlNGJTTEtnZFhZNEs2UkNrVUF6RnF0ZHNGcGw3SklpeUtwWWk4NFdzMkNTS0FvZjNPNm9IaVh1OW51QmkrZi9KTGhXd1pzK0wwZFZKamE1a0h0dGJqYmNqTHhCUUtFa2doN0xPWmVYb3lzVG0zVC81eXkvTVRtOXlhajRRa1RHQjJDVGpLUStvc1F0NmVucFMxdTNicjBLVlE4aEdWWHdKZDBoK0dJVEJDUlJGR1NEWGxDTVJoR1RVYStZUFF5WXpRWTh6U2E4dkV6b25XR29rb1hKUTFFVVVSU0Y1dmM2Q2VwR1RuaDdLcmZGMTFVbThEeFI4ZFc1R1hrRGJ4ODNOWGhxU2pJcEtjblliUm1VQ1RpWGV5b2g4Q3hSY1UvZXR6bHpqa215cDFNMjhHeStIbmhSL3lTSytpYzk0cUk4U2tQZ3F5emhxTTdCOXFGV1J4RWNDK05CbGhWRlZwdDJGVWxTMUFxcFhVS2ZyU2tYQllTNHl6T3FjUWRpTGJlYkJIVWo1dzJnMTlsdjY0SVdSWm02bGM1d09ib3ljWWxXRXVMaXlNaDROQi8xWnJNbm9pZ1RVTmhHMmNmT0lRcEtudGRwdlVvbnVSSlRtWmdFeXoyZE03UFpFNTBvRWVCcm9XemcyUUwvdG84eU9hc2dDTlczcnU5YnZIWEh1WDlweGsxQmgrRElzWUVnS0tyTmttWFViZzVIWmRUNTBxdlUzOW5XaG5wN05MblRRUlh4VFNBaUljRnQyTzRBS1NtSmxQUzdmY29pVWJCVHZzZ2ZsQy9pbHQrN0hjTVI5TmhaZ2g1N09PVDMzSERGVTdXQ3FnRi9PdzJiQWpvaGF3RkJ6YlVwaXFOTlRYS3NSbkQwdHlFNnZEVUJiVzBvZ2s0VW43dlRBUlh6ajBPUkVvaTZlWTIwQjdDTzd0K0l0TlFVb2lLdWdwUklVYjkveHNYMmFEL3BINzQ1Y3h1MU80T3ZyMmN0MUtLQm5zd0NnaXIwb3RHcEtZS3NJRGk4TmtHV2xTd2VtNU9leU9HeERlclhUQ2NJQlArVEgvS3BTcGU0R2UvRHpmZ0FraE9OcEtTNmY2aTg0TzBGQnAyVlVvRnhGUEZOY2srSUcyNEFCcjJ1WWMzcXhRd24vb2pVWndsSFJRUkVCVVVBUVZBVXh4SXJ4Ykc0d0VHN0pza3lncGRaSjlqc2lpQ3AxVkF4K2Zyc3BwNW00NC91cVhYRERUY2VKSTZldU5MbnFlQ0pwOGhTSFJVRTBnR3JJQWcyUVVEV2FkVlJIUjRtdmVMaFljQnNOcUszUzFrV3ZpdUtjRE1xc2VIOTZveDN3dzAzM01qVGF6UG9LZ04vWmcxRkZRVlJFRkE3T0JDUVpRVzdCSUpOUmhEc2FzZ29nT0RoNFNIYTdYWkJVUlJSVVJTZDNXN2ZKQWpDOCs1cGRjTU5OeDRrN0hiN2JvUEJNREdMeDVZaUNFSXFZQkVFd1NvSWdpUUlncXpYNnhXajBhZzQ2TzRWczltTTZGd1hxU2lLOE9xcnIrb0VRV2pvbmxJMzNIRGpRVU92MTljdFc3WnMxc0tCVmtCd09HS3VWRVpaWG9MUmFCUWxTUklWUmRFbEppWTI5UGIyM3VXZVVqZmN1UDlRRklYSXlFaHUzb3hDa2lSU1VwSWYrVGs1ZGVwVTc3NTkrNTUxZW15T1Y3b2dDRmJBN3ZUYWREcWRvdGZyTVJnTWlzbGtRcCtWeWNMRHc2T3UrL0p5dzQwSFk5U09IVHVHZ3FDdGhuRHI4WUt2LzJQbGdRdGthZnR3a0U5cWpUU0NJQ0FJQXFLb1E2L1hvOWNiTWhlV0FvSk9wM3ZxMy9qbFEwTkRhZFdxVllIMlRVbEpRUkFFZHUvZWZjZm5xMVdyRnBNblQ3N1R2QUdob2FFVUtWS0V3b1VMMDd0M2IwMEV4WTFIRjVHUmtTZ0lGQzFXd3QzY25nVStQajZWczRXaG9wTjRNcXZ0VWhtSlpMV2ZUWkhWSEp0em5hZ2dDSFhjVTNsdk1XellNRFp0MnNTNmRldll0R2tUTzNmdXBGKy9mdTZKZWNRUkZSWHQxdVBOQlFhRDRRbHk1dGl5R1RVRmxXNU5RVkZrRkZuV2R1RDgrZk5GZ0VydXFieDNTRTFOWmQ2OGVZU0ZoUkVjSEV4d2NEQ0xGeTltNWNxVnhNVEV1Q2ZvRVlZa1NYZmtxWjA1L1FjRFEvdmY4L0dkT1hPYXNHbFQyTzVRS25OaTQ4WnZDT255RmlGZE83a0k4a1JIUnpQd2d3R0VkTzFFM3o3dmNmWHFGVzNiaVJQSDZmbDJON3FGZEdiMEp5UHoxV1lWQktIQ3lJOUhlZWRqM0FBRUhBc05uTTI2enFxb1VLSkVpU2YvS3hmSmQ5OTlSLzM2OVRHYnpYaDVlZEc4ZVhQT25YTmxldmpsbDErb1ZxMGFIaDRlTkd2V2pMLysra3ZiSnNzeVk4ZU9wWFRwMG5oN2U5T29VU1AyNzkrZjY3bWlvNk41NVpWWDhQUHp3OXZibXhkZWVJRUxGeTVvMndNREEvbndRNVZOOTlpeFk2U25weE1jbkxtdzQ5bG5ud1hnNE1HRDdydjdFVVp5OHAydE9xbGNwU3FqeG95OXAyT2JQMjh1eTVZdTRkTEZpeTVHNk9yVksyeFl2NTRGaTVheWJQbEtUcHc0eHBFajRZNWo1dENzMmY5WStma3F1blYvbXltVEptcXBtRWtUeGpIeWsxRjh0dkpMU3BVdW8ybG01SVZubndzdTRUQmtMb1NUanJCVVc0R2dLbGlwWHB2bTBoa01oditFWWZ2OTk5OTU1WlZYNk55NU0yZk9uR0hIamgzY3ZIbFRNeTVPekpvMWkwbVRKbkg4K0hHOHZiMXAxcXlacHJ3emNlSkVsaXhad3BJbFN6aDU4aVFkT25TZ2VmUG1uTTFGSERjME5CU0x4VUo0ZURqSGpoMURsbVZDUWpMMUJBWU5HcVJ4MDErL2ZoMmowVWhBUUVCV1Y1dUFnQUN1WGJ2bXZydmR5SUhZMkZnR0RRd2xwTXRiZEF2cHpPRkQ2Z1BRcWNuYm9YMWJRdnU3cGpLR0RmbEk5YUs2dkVXN2wxN2d6VGRlMWJaZHZIaVIwUDU5NmQ2dEM0TStHTURObTVFdXg2NzcraXVYL1FGNnZ0T0xzT2t6S1AvNDQ2NzMyb2tUUEZXM0xwNmVLc21xbjY4Zko0NGYxN3l5NTU1VEgrQ0ZDeGZtenovUFlMVmFpWXlJd01Oc0ppaW9IQUQrL3Y2Y09KNC96WG54WXNYS1pERnFqanhiMW5CVXlReEoxVHdiZWxCNzJIUTZYZlgvd29XZ0tBcWZmdm9wL2Z1cjdubFFVQkFoSVNFc1dMREFaYjlQUHZtRWR1M2FBYkJpeFFwS2xTckY1czJiZWVtbGw1ZzhlVExMbHkvWENoSURCdzVrMTY1ZHpKdzVNOGZuWEw1OG1kS2xTMU95WkVrOFBUMVp2bnk1aTVFYU5peVRQVGN0TFEwUEQ0OGNZemFaVERuazA5eHdBK0NydGF1cFVhTUdJZDNlNXRLbFM4eWZONGNHVHpmVU5IblBuei9IeFBIalhJNlpOR1Vhb0VwWTluNm5oNmEvWWJWYW1UaCtMT01uVHFaNDhlTDg5T05XRnN5ZngrZ3htY2ZYckZVcmg1NUhYc0pEaVltSmVIaDRFQjBkemFRSjQ1QmtDUjlIbmpBeE1SR1Rod2ZmYi9xT0hUdTJZVFFhU1VsSklTa3BDWlBKaE5WcVplNmNXZHk0Y1NPSHdsWjJlSGw3bDh0aTFCd0dUaEVkRkFPT1hqYWN0UUpGVVJSQjcyeHlFd1RoUDJIWWF0YXNTVUJBQU5PblQrZk1tVE9jUFh1V1gzLzlsYUpGWFl2bmpSdG5DcFVFQkFSUXZueDUvdmpqRDU1ODhrbFNVMVBwMXEwYmI3K2RLWlJzdFZwZGpuRml5SkFodlBubW13UUdCdEswYVZOZWZQRkZ1bmJ0bXV2WXpHWnpEalVoVUNYZEhvU01teHNQUCtyVmI4Q2NXVE1BZ2ZyMUd4QTJmVWFCanBObG1UR2pSOUhteGJiVXI5OEFVS1VocjEzN20rRkRCNnY3S0RKZTJmUUtLbFdxVEtWS0JkZEtQWDM2RDQ2TkdFcm9CNE00KytlZlhNeVNocGswWVJ3QmdZR0VUWi9KcXgxZWRqR0lBejhZd0lzdnZrU0hqcTh5WXRqUWZNOWhNQmdxWk11dDVjeXhvYUNBVmtEUVoyNmc2bi9oUWpoNDhDRE5taldqU1pNbU5HM2FsTmRlZTQzdzhIQ1dMbDJhNzFOSXI5ZGpOQm8xcmMwMWE5WlF2YnFycmMvTjIycmJ0aTNYcjEvbisrKy81OGNmZjJUNDhPSE1ueitmdzRjUGF5NjZFNlZLbFNJakk0T0VoQVI4ZlgwQnNObHN4TWJHVXJKa1NmZGQ3RVpPdzFhdlBuUG5MU1Q4U0RpZnIxeUIwV2hrekxnSnR6eHUyZExGZUhoNDBMbEw1a1BXWnJOUnJGZ3hWcXo4NHE2TXJYRGh3bVJrWkJBMmZTYUZDaFhpeEluakZIWmMxNFVMRithWlJvMDFrWE5WaHRLYlFvVUtrWlNZeUlTSlUzajg4Y2M1ZS9aUDdWN0lDNElnVk02U1c4dWFaOHRlUUZDY0JRUVJFS0tpb2lvQnB2L0NoYkJnd1FMcTE2L1AxcTFiR1R4NE1DMWF0T0RHalJzNUpQV3k1c3VTazVPNWVQRWkxYXRYcDN6NThwaE1KaTVjdUVDRkNoVzAxNkpGaTlpeVpVdXVIdHY1OCtmcDBxVUxxMWF0WXYvKy9adzZkWXJqamx4RFZ0U3VYUnV6MmN6ZXZabXE1L3YyN1VNVVJaNSsrbW4zWGV4R0RreWFPSjd3SStFMGIvNDh3NGFQNU5DaGd5N1NrYmxoMzc2OTdObTltK0VqUG5hUnFxeFFvUUpKU1VuOHNtZTNsbS83ZnBPclR1ajU4K2ZZdVBHYkFvM3R5Um8xc0ZxdG1Fd21KRW5pNElIOTFLeWxhcG5XcWxWYkcrZlIzMzRqS0tnY1JxT1JZc1dMVTlqWEY1UERzZGkzZDY5MlRENHdMVjY2UERBWGc2YjFzQUZaUERaSGpzM2IyN3ZDZitWQzhQZjNaK2ZPblp3OGVaS1NKVXV5YnQwNmxpMWJocCtmbjh0KzQ4ZVBwM0hqeHZqNitoSWFHa3JGaWhWcDNibzFvaWd5Y09CQXhvNGRTN0ZpeFdqWXNDSHIxNjlueG93WmJOKytQY2Y1enA0OVM1OCtmWmczYng0QkFRR3NXTEVDYjI5dnFsUlJCVzBtVFpwRTdkcTFhZFdxRlY1ZVh2VG8wWU8rZmZ2aTQrT0QwV2lrZCsvZWRPL2UvYjRwbnJ2eDcwTG56bDBKQzV2QzJ0V3JrR1daZ1lNK1FoVEZmQlhlNXM2ZVNVWkdCbjNlNjZWOXp0ejVpL0R4OFdIU2xHbk0vSFE2aXhZdXdOUFRrNEhaaEpTUEhUM0toZzNyYWQrK3d5M0hWclpzRU8zYmQrRGRYajFSVUhqMjJXQk5PL2o5UHYyWVBHa0M2NzcrQ3JQWnpKQmh3N1hJYVBpSWp4azNialEycTQzU3BVc3plT2p3VzU2clFvV0tqd0hYYy9mWUhEb2hHcmVrZ2lDS29vZkZZaG1nMStzbi8xdC8vTkRRVVA3ODgwOSsvUEZIWW1OajZkbXpKenQzN3NSZ01QRFVVMC94eGh0djBMTm5UNjVldllxdnJ5OCtQajVNblRxVmxTdFg4dmZmZjlPb1VTTVdMbHhJR1ljNnZjMW1ZOHlZTVh6MjJXZkV4TVJRdVhKbFB2bmtFenAwNk9CNEd0WGlqVGZlWU9qUW9VUkhSek5nd0FDMmI5OU9jbkl5ZGVyVVlkcTBhVFJxMUFoUTJ6MjZkZXRHV0ZpWWxrOExEUTFselpvMWlLSkl4NDRkbVQxN2RxNWhyaHVQRHZiczJlTldkOHNIY2JHeFlUVnJWTitPdW1iVStVb1RCQ0VEVlNsZUVrVlJYVE5xTUNpQ0lBaG11OTArVXhURlh1N3BjOE1OdDJGN0dKR1JucjY2WW9WeVgyUXpiS2xaREp0ZEVFUlpweE1WdmNHZzZCM0p1YUIvNnhlZU4yOGVmZnYyL1UvOGVKR1JrVG1xdHdXQkxNdGN2bktWdUxnNEpFa2lJLzNSWEh2cVlUYWowK253OXdzZ0tLZ00rUkdtS29yaW1MTlk3UFo3TjJjZVpqTjZ2WjRBL3dDQ2dzcmVjdi9yN243R1hDRkpVbkVjVGJsWlg0cWlwaEhWN2c0WldRYkpMaUVJZ3VBcHkvSlJvTEo3K3Y1OXNGaXNuRGh4QXAxZTc5WVZCVkpUVTBoSlRrS1M3TlNxV1F1ajBaQ3JVZnYxMTk4UWRicjdveXZxR0pNc1M5U3JXOWZ0c2QwQkZFVTVYNlpVOFEvSUpKMTBFazg2cWNMdGpuQlUwZXYxaXJPNlVOWTlkZjlPUkVSR29OUHIzYXdRRG5oNWVWTzBXQWwwT2owM0ltN2t1czlmbDY4ZzZuVDNiYzZjWXhKRkhWZXVYSFZmdEhjQVFSQktaL1BZc3YvZnBWbFhQSC8rZkZIQW5ibitseUkySnRiTkNwRUx2SDBLRVJNVG0rdTJ1TGk0QnpKbjNqNkZpSWwxa3gzY2FWVC95ZWd4M3VUWjh1SFViUUZRMEFjRUJCUjN6OW0vMVQyL2MxYUlSOEZ6UzB5SXkzWGJnNW96THk5dkV1UGo3dWpZcE1SRUx2OTFrZFI4dEhxOXZMd0pLdmM0aFFvWGZtRHpmaS9IV2JWS3RVSkFUQzdlbXZPT3dObjZvVGVaVEVYdi9nM25wamd1S0h4OENxSFRpUlFwVW9UaXhXL3ZHU01Ja0o3dUpxbk1DK2w1RUhnK3lPTEtuZjVlZjEyNlFGcGEvZ0s5cWFrcFhQN3JJalZxUFRoYXhYczV6c2VLRkNtVTNWdHpGQThFMTNCVVVmUTZuZTZ1R2pZM3hmSHRJelUxaFJzUmtkeUlpT0NwT25mM290eSs3U2RXTEY5R1ZOUk5TcFFvd2VkZnJ1SDgrWFAwNko3SlFESjArRWhlZUtHTis0ZDRpSEVyWTVIMVd2cXZqck5Rb1VLRnNoZ3daM091NEZnTW56V1NFZlNpS0Q1Mk43OVlWb3BqTndvZW9uaDVlUk4xTTRMSXlFaUtGU3QyVno3M3hvMGJUSms4a1RIakpsQ3ZYbjJTa2xUT3J3b1ZLcko5NTI0QTN1blI3WjU5citYTGx0THU1Zll1TkUzT2NjMmFNWjJUSjMvSGFEVFMvUG1XdlBkK0g0MVY0dHExYTh5Wk5ZT1RwMDVpTXBsbzBhSWx2WHEvbDROMTRtN2lWdWQ4cm5GRERBWURnaUFTRkJSRTl4NDlhZFNvc2Z2aXZZOHdtejBLdVJxMUhDL0gwa2tGVVJURmdMdDVjamZGOFQ4d2NONCszTHg1ODY1OTN0ay96eEFZR0VpalJvMHhHbzBFQmdZNlFsZ0Jod2FqeTFyQ3U0M1BWaXdqTGk1bkFuLzBxSkdVTEZXS2pkOXRadkdTNVJ3NmVJQk5tNzRGMUo2OG9ZTS9wRkxsS256NzNXYm16Sm5QbnQyNzJMamhtM3Myem9LZWMrNzhoWHkvWlN2ZGUvUWtiT3BrTm55ei9vRmNKNElnVUtkT0hWcTBhRUh6NXMwcFVlTDJuSWlEQi9ZVDByVVRyNy82Q2pNK0RkUFdkTnBzTnNLbVRTR2t5MXQwRCtuQ3ZuMlphNXJ6WThTOWQ1Rk1LcHUrKzVhaGcxWGFKWVBCbU4xakUzRVVEckpHakZhckZWRVFoTHU2U05HZHpQNW5ucHRka3Y3eDV4dy9mb3lYMjdaaDJ0VEpSRVpHOG5MYk5yemN0ZzByUDF0UjRNODRkUEFBbmQ5NmcrYk5ndW5SUFlRL1RwMXkyYjVuOXk1Q3VuYmloVmJQMDcxYkZ3NGRQS0J0NjlmM2ZWNXVxNGEySHd6b3o4dHQyOUQzL1hjMUl4SWMzSlN1SWQwd21Vd1VLVnFVdXZYcWNjNUJTaEFYRjRlZnZ6K2RPbmZHYURSU3FuUnBHalYrbGovL1BIUFA1djEyem1rMm0yblVxREhEaG85a3llS0YrZEphM3l1VUsxY09uVTdIdG0zYjJMdDNMelZyMXNSZ01PUnFzTFAvUHlNam5hbFRKakZ4MGxSV3IxMUhURXdNMjM3NkVZQ3RQMndoSXlPRGxWK3NadnFNV2N5ZSthbm01ZWZGaUZzUVBQSEVFOXBETmI4eFp2MDdKaWFHZDNwMDU4S0Y4OXJ2b05mckMrWGhxV2t2V1piUjYvV0lnTi9kblBRN3BUaDJRMFZLOGo4dnROU3FWWnR2TjIxaFFPaEFTcFlzeGJlYnR2RHRwaTJFZE90ZW9PTXZYcmpBeHlPSDgxNmZ2bXpadW8xWFgzdWRnUi8wSjhyaFRWNjVjcG54NDhZd1pNaHdOdi93RXkrOTFJNFJJNFpwYWx0ejVzN24yMDBxRThxTVdiUDVkdE1XNXM1ZkNJQW9pblRxM0FWZlgvV3krK3V2U3h6WXY1OEdEVlIyazhEQVFPYk1uWStIaDFtNzBJOGZPMGFOR2pYdjJaemZ5VG5yMVcrQTFXYlREUEw5UkdCZ0lEZHUzTkE4RkZtV2M1QThIRGtTem9oaFE3RFpiTVRGeGZGT2orN0V4Y1VSRVJHQnI2OGZKVXVXUktmVDBhcFZhdzRmUGdTb3JMZlBQdnVjNDNjU01CaU1uRHQzVnR1V0d5TnVBWE5qZVpKVkxsdTZXS01HUDNueWR3YjBWMWNSK2ZyNjhzV3FOWVIweStSRTFPbDB1WVdpdUlhaHFrY3JBdmM4Ymh3ME1KVFhPcllucE10YmRPMzhKbHMyZjYvbE5WN3IrQXJ0MjcxSTk1QXU5M1FNM1VPNmNQSGl4ZHM2WnR0UFAvSmF4MWQ0b1hVTFpzL0ttK0J2eDQ3dGpQNWs1SC9HdUc3ZXZJbmdKazFwMUtneEpwT0pWcTFmb0VyVnFteHpDSGtFQkFTeWZNWG5WS3RlSFZFVWVhbHRPMnhXSzMvL1hmRG0wejlPbmFKRjg2YUVkT2xFbGFwVmVTNjRTYTc3TFZ3d0Q3T25KeSswZWZHK2ZmK0NuRk1RQlB6OS9FbDVBTWw2bzlHSUpFa0VCQVRRdUhGalpGbkdaSEpsSGF0YnR4NytBUUdNR2YwSmd3WU9vUDBySGZEMzk2ZFlzZUxFeGNWeTZkSWw3SFk3NGVIaHBLU28zOEhKaUh2cTFFbUdEUDRRbzhsSVltS2l0czNKaUR0M3ppeU5FZmVmNHMyM09yTnIxOC9NbVQyVGNXTkcwN2RmZjZkM2xpT25LZ2lDZHo2NU5SY2pweGNFNGI0a3hENGFNb3g2OWVxVG1KaEFyNTV2VTdXYXluMldGNzN4dzRBV0xWdlJvbVVydnY1cUxaR1JFWStNMXhnWkdVbUZDaFZkM2l0VEpraWJBMjl2YjNaczM4YjQ4V05JU1U3Sk02eklEOVdmZUlKdE8zWVJFUkhCSngrUFlQbXlwZlI4eDVXSDRmT1ZuM0g0OENIbXpKbVBYcSsvTDkrOW9PZFVGSVc0K0RpOEgxRGF4Um1PN3QrL24xcTU4SmtKZ2tEdjN1L3h4dXNkS1ZPbXJHYWt6V1l6dzRhUFpQS2s4WTdmdFN5ZVpyTjIzUGZmYnlJOVBaMUprNmN4ZSthbkxwK1pGeU51WG1qVnFoWGUzdXI4T1BPQXAwK2Y1dlRwMDlvKzN0N2V2UHZ1KzN3UTJvODMzK3BFNWNwNUx5c1RSZEU3bnpCVU0ybzJtdzA5Y0Y4NXFRc1g5dVdKSjJ0dzhjSjV5cGN2bitkK2lZa0pUSjQ0Z2Fpb0tPeDJHNTA2ZDlYWU9NK2NPYzNNR2ROSlQwdWpTTkZpREIwMlFvdmhkKy82bWRXcnY4U1NrVUgxSjU3a2c0RWZhdm1IWFQvdlpPem9qMGxQejZCdnYvNmFsL0ROK25WcThscFJhTnJzZjNUcjN1T1czK1BJa1hBK25UNE5VUkFwV2Fva251Wk10dHo4eHRDOFdURDlCM3pBMGlXTFVCVDRmc3ZXaDg2d0ZTMWFsTWdJVjBOKy9mbzFhdGRXVzFIMi9yS0hWVjkrd1l5WnN5bFZ1alNnVmcxenU3bXlHenRMUmdaYnQvNUE2OVl2WVBMd29Iang0alJ2L3J4TG9ocGcvYnF2MmI3dEoyYk5tWGZmR2s1djU1eEhqb1JqTkJpb1ZQbitMN0cyV3EzWTdYYU9IajNxRE5GeWFHYWtwS1R3MFVjRDZkd2xoSE5uLzJUSzVJa01IVFlDUVJCNHV1RXpQTjN3R1VmdWJLNUdTMSs0Y0dITVpqTmp4MDFBRkVVc0ZndUZIZk9RRnlOdWZ2anhSelYzOTh3enozRDU4bVV0ZkhaSmUxeTh5T1JKRXhnN2JnSXJsaStsVE5rZzJ1VHRLWHRsTTJKWmpKcVFOV1JGQkR6djU0OFNIUlhGcVpPL1U2Vksva3prNTg2ZDQzL05uMmZaaXBYTW1idUFXVE5uWUxWYXNWcXRqUHA0QktHaEEvbjh5elU4ODB3amxpeGFvT1ZyMXE5Zng1dzU4MW41eFdvQWZ0aXlXZnRNSHg4ZlZuNnhtdEZqeGpGLy9seEFKZGJidkhrVEN4Y3RaY215ei9qdHQ5L1k5ZlBPZk1kbXNWaVlNRzRNbzBhUDVjdlZheWxUT25PcDdhM0dZTGZiaVlxS1l0MDMzN0wrbTQwUHpIalo3WGFOQmwyUlpleDJ1MmFFMnJ6NEVudjI3Q0k4L0RCMnU1MmZmOTdKSDZkTzBxSmxTMEJWVGhJRUVIVTZFaE1UdEJ5SklydXlGQmN2VVlKREJ3OWlzOW1Jam9wU3d5aVRpUzgrWDhuYXRhdXgyV3drSk1TemQrOHYxS2hSSXpNVS9uNFQzMjdjd016WmMrOGJBV2RCejJteFdEaDg2Q0NUSjAyZzk3dnZQeEN0aXVqb2FLMmFiVFFhOGZYMXpTR0ljdkhpQllLRG0vSldwODZNL0dRMFJxT0p1RGpYVlErSER4MWt4NDV0V2c5anJWcTFzZHZ0aUtKSVFrSThGeTllcEZMRlN0cTIzQmh4L3lsKysvVUlRNGVOb0VuVFpudzZjdzZuL3ppVmcrMDZ5NFBTbk0yb1pYMkd1cFQzOVlENWZ2d1kwOE9tWXZZd1l6UVo2ZE8zUDZVZHBJNTVvV2JOV2l4ZnRvUnQyMzVFcDlOanNXU1FuSnhNUW53ODN0NCtWSzJtNmhHODFMWWRUWnMxVTMrb3c0ZTQ5dmRWM3UzOVRwYW5pazltM3NIQjdsbTFXalV0RVI0ZWZvam5uMitKMmVHT3YvamlTNFNISDZacHMvL2xPYmFyVjYvdzJHTkZOT05jcFZvMTl2MnlwMEJqQU9nYTB1MnVYQlIzaXV3TnVsTW1UMlRLNUlrODM2SWxIMzh5bW9vVkt6RnF6RGdXeko5TFpFUUVaY3FXWldyWXB4UXRxdmJYdFg2aERhZE9uYVJIOTY3b2RIcmF2ZHllaWhVckVaZHR1ZERBZ1I4U05tMnEraVF1VTRhbHkxZGlOQnFaTWpXTXVYTm04ZFhhTlJnTUJvS2JOTldTeEpJa01XM3FaUFI2UFcrKzN0RTFUUHh5TmNXSzNmMFZnQVU5Wjc4Kzd5TUlLblBzb0E4SDM5VStOaDhmbndMdmUvbnlaWHg5ZlRWWngrUEhqK2RJNU5lc1dZdWFOV3RwK2FwQldaaHk0K1BqNk5XekI2VkxsMmJpcENrOFZxU0k5cnVlTzNkT3kzZjNHeENxZWE1NU1lSVdCQWNPSE1oejIydXZ2Nkg5UHlBZ2dJOEc1eXZzNHBGUEdPcXdjQ0tTSktFSDdzc2ROdWpEd1JwdGNFR3dkczBxN0RZN1U2Wk9SeEFFclgzQWFaNmRNQmdNK1BtcFQxaWIxVVp3azZhYTNGaCtpZCtzSVZMV1ZpNUJFUEo4WW1UTnIrVFZMRnFRTWVUSEUzWTMwYkpWYTFxMmFwM2ovWW9WSy9ITHZ2d0ZtaHMxYXB6bmpXc3ltUmo1OFNpWDk5N3AxVHZIZnZVYlBNM1g2emZrZUw5Q3hZck1uRDAzMTgvVzZYVHMyWHZndmhyNmdwenpWdk4xTjhhUW1wcFNvRllwNStxZU80V2Zuei9yY29rV3NodkFyQWdNREN5d1F0YmRSRUJBZ0ZaaHo4VldDZG50Z1NDQVRxZTJlenc0MXlGZmR6c0dieDl2QkVIZytQRmpKQ1Vsb1NnS3BjdVVJVGs1bWZQblZXWDNuMzdjU3RpMEtRRFVxMStmbjNmdTVQcjE2d0RzM0xtRGt5ZC96L2M4ZGV2V1ovdTJiYVNucDJPejJmaGh5MmJxTjhoZldLVnMyU0NpbzZPMW5FRkVsdHpCbll6aG44QnM5c1NOMjV1YkJ6bG5lWjI3U0pFaXBPV3pwdHJUczJBaGIwSDN1MWU0eCtNMDV1S3BDVW8ycjgwWml1b2UxQ1RrSjBqeDJtdXZNM2JNS0g3WXNvWEtWYXBRb1dKRkVoTVNDQXdNWk15NDhYd2FOZzJMeFVMZ1k0RU1HVHBDRFFtclZLVmYvd0VNSGZ3aE5ydU5ja0hsR0R4MFdMNWplS3B1WFZxMmFzMjd2ZFNDd2JQUE5hRnBVelcwM2ZiVGp5eGRzcGlVMUJSa1NXTGYzcjEwNlJyQ1MyM2JNWFQ0Q0VZTUc0S2Z2ejk2dlU0ckh0ekpHTzdYay81UlFtcEtjcDVldGZpQTVpdzFKUmxkSHBYVzRzV0xFeEVSUWZUTkNEeTlmWEtNclZ6NUNyZGNZTzdwNlVXNThnOVdsK2tlajFPWG04ZVdXOTVOVUc0VmQ5MG1qaDQ5U3BGaWJvM01PMFZVNUhYcTNNWkMrTXVYcnhBYkYrZGVtNXNOTnlOdkVCZ1lRTmxjY3JtWHIxd2hOdmIrejluTnlCc0VCQVFRVkRidi9ISlVWQlNSa1pIWTdYYVNrOTJzT05uUnBFbVQ5a0FhS29OdUVwbWlMaFkwN1FOQnZ1dk5RVzRQNHA4OTBXKzNYNnRzMlRKRVIwY2pudHFQQUFBZ0FFbEVRVlJ4TS9LR214cmNNWWNwS2NsSWRudXVSZzBncUd4Wm9xTHUzNXc1eHlSTFVyNUd6Um1TRm5Fazg5M0lGZG5EVHNHWll4TUVRVjExSUlxQ29DaUtoTHBFNGE0Z0lpS0N5TWliUEZiVXpWOTUrOTdhRFVxVUtIN2I3QjZLb3ZEWDVTdkV4Y1VpMldVeU1oNU5qamF6MlJOUnB5TXdJSkN5WlV2ZmNvSC9sU3RYaVk2SlFiSkw5MnpPekdaUGRIcjlMVDAxTndvRVdSQ0Vqa0JxRm84dFJSQ0VWTUFpQ0lKTkVBUzdLSXFLb0NpS0ZURGM3WEJVRUhWNGVYbmo2ZmJjYm9rMGg5Z0hLTGNWaHJyaHhpTUdteUFJcjJjeGJNbEFzaUFJYVVCR1ZzT21CKzY2WWF0VHB3NDNiOTdrWmxRVXlVbUpiZ2JkZk9EdDQ0TkJyNmRVcVpMdUVNUU5OL0tIdGFBN09nM2JYYThSRnkxYTlJNDBNdDF3d3cwM0NtallsR3ovYWhDQmRQZDh1ZUdHRy84Q1pCVFlZN3R5NVlwYkRjUU5OOXg0NktFb1Nub3UzcG1pT0JSZG5KMXJpcUlvK3JKbHk2YTZwOHdOTjl4NDJDSExjbXFXMEZNemNObmJQUVJCUUZRVXhVMTU2NFliYnZ3YlBMYnN6SlpLdHY5cmYrdFJlMEhjY01PTkIzL2p1dlY0ODRIZGJrL0pZc0NVTEtHb2tqVVVsV1VadmFJb0NmZFNxY2dOTjl3b21GRno2L0htRDR2RmtweWJ4K1pxdnpKRDBiaEhiWUpLbFNwRnRXclZjaFdqOFBiMjVyUFBQcnVYVHgxQ1EwTXBVcVFJaFFzWHBuZnYzcG9JaWh1UExyTHE4YnFYSStaNTd5Umw4OWdVY21uMUFOV3d4VDZLazNUbXpCa21UWnAwMzg4N2JOZ3dObTNheExwMTY5aTBhUk03ZCs2a1g3OSs3cXYyRVlkYmovZldzRnF0U1ZrOHRWenlhNExLclNpQUtFbFN6S000U2VYS2xXUGl4SW1jT1hQbXZwMHpOVFdWZWZQbUVSWVdSbkJ3TU1IQndTeGV2SmlWSzFjU0V4UGp2bklmWWR5cEh1K1owMzh3TUxUL2ZYQUVUaE0yYlFyYkhVcGxUbXpjK0EwaFhkNGlwR3NubGk5YnFyMmZuOER5aVJQSDZmbDJON3FGZEdiMEp5TUxyTTJhbnA2V2pHdFRicmJxcU5OZkE5Rm1zOTE4RkMrazNyMTdVNzE2ZGQ1NTU1MThHWFBYcjEvUGswOCtpZGxzcG5yMTZpeGR1dFJsKzg4Ly8weWRPblV3bTgzVXExZVBzTEF3RjNIWXdNQkFQdnhRWmRNOWR1d1k2ZW5wQkFjSGE5dWZmZlpaQUE0ZVBPaSt1eDloM0trZWIrVXFWUmsxWnV3OUhkdjhlWE5adG5RSmx5NWVkREZDVjY5ZVljUDY5U3hZdEpSbHkxZHk0c1F4amh3SmR4eVR1OEN5M1c1bjBvUnhqUHhrRkordC9KSlNwY3RvbWhtM1FsSmlVbDZoYUk0VkNQcU1qSXlvVzZuTi9CZWgwK2xZc21RSkRSbzBZTkdpUmJ6NzdyczU5dG03ZHkrZE9uVmk5dXpadEdyVmlxTkhqOUs3ZDI5ME9oM2R1M2ZuNHNXTHRHblRocjU5KzdKbXpScCsrZVVYK3Zmdjd5THdNV2pRSUdyWHJnM0E5ZXZYTVJxTkJBUUVhTnNOQmdNQkFRRmN1M2JOZlhlN2tRT3hzYkZNbkRDT21PZ29CRkhrdmZmNjBPRHBoaTRrcmI2K2ZxeFkrVVZtdW1QSVI5eTRvVEk0SnlRazRPbmx4WnExNndCVkZXck9yQmtrSmlYaTcrZlA0S0hETkMwTGdIVmZmOFdHRGV1MS9RRjZ2dE1MbzlHb01WVTc4ZnVKRXp4VnR5NmVucDdZN1hiOGZQMDRjZnc0OWVyVjU4U0o0M3p3d1NEQVZXQTU2dVpOUE14bWdvTEtBZUR2NzgvUE8zY1VhQzV1UnQxTUxvQlJVd0QwRVJFUkVYbkp6Ly9YOGRSVFR4RWFHc3FRSVVObzI3YXRwbjNveElRSkUralJvd2U5ZTZ0OC9tWExsdVhTcFV0TW5UcVY3dDI3czNEaFFxcFVxY0swYWRQVXAyZmx5cHc4ZVpMVnExZTc1TlNjU0V0THc4UERJOGM0VENaVER2azBOOXdBK0dydGFtclVxRUZJdDdlNWRPa1M4K2ZOb2NIVERTbFZxbFNlbXJ5VHBxalhZMkppQXIzZjZhSHBiMWl0VmlhT0g4djRpWk1wWHJ3NFAvMjRsUVh6NXpGNlRPYnhOV3ZWeXNFOG5KZndrRk5nT1RvNm1ra1R4aUhKRWo2T1BHRldnZVVkTzdacEFzdEpTVW1ZVENhc1ZpdHo1OHppeG8wYk9SUzI4ZzY3VHp2YlBlUzhQRFZuTUNyV3JGa3ppdHRZZy9WZnc5aXhZd2tJQ0tCdjM3NDV0cDA2ZFlwbHk1Ymg3ZTJ0dlVhT0hNbUZDeGVRSkluang0OVR2NzZyUUUyalJvM3lQSmZaYk02MUVtdXhXQjZJakpzYkR6L3ExVy9BemgzYldmblpDaXdaR1FVV1ZKRmxtVEdqUjlIbXhiYlVyOThBVUtVaHIxMzdtK0ZEQjlNOXBBdXJWMytwcWJVNVVhbFNaVjdwMExIQTR6dDkrZzlHamhqS083M2ZwV2xUVjJXM1NSUEdjZm55WDRSTm4rbWlWSitZbU1qQUR3WlFyVnAxK3ZVZlVOQlRaVXdZUHpZdG4xQlVNM1NDb0Rib0Fsd0ZLajJLRjQ2bnB5Y0xGeTZrWmN1V2JOem9xdHhqdDlzWk5HZ1FiNy85ZG83alJGRkVyOWZuRUFUT0wxOVhxbFFwTWpJeVNFaEl3TmZYRjFCVnEyTmpZeWxaMGsybjdrWXVocTFlZmViT1cwajRrWEErWDdrQ285SEltSEVUYm5uY3NxV0w4ZkR3b0hPWHJ0cDdOcHVOWXNXS3VZU3Qvd1NGQ3hjbUl5T0RzT2t6S1ZTb0VDZE9IS2V3NDdyT1MyQzVVS0ZDSkNVbU1tSGlGQjUvL0hIT252MVR1eGZ5ZzZJb2YyY3pZSElXenkzbi9ha2VvMXg1bEMrZUZpMWEwTGx6Wi9yMjdhdUpDQU5VcTFhTmt5ZFBVcUZDQmUxMTRNQUJaczJhaFNBSVBQbmtreHc1Y3NUbHM3TC9uUlcxYTlmR2JEYXpkMittNnZtK2Zmc1FSWkdubjM3YWZSZTdrUU9USm80bi9FZzR6WnMvejdEaEl6bDA2R0NPaDJsMjdOdTNsejI3ZHpOOHhNY3V6YXNWS2xRZ0tTbUpYL2JzMXZKdDMyLzZ6dVhZOCtmUHNYSGpOd1VhMjVNMWFtQzFXakdaVEVpU3hNRUQrNmxaUzlVeXpVdGd1Vmp4NGhUMjljWGtDRy8zN2QyckhaTWZKRW02bnMybzVlR3RxZjBlZWtDUlpmbHlYb28randwbXpKaEIxYXBWWFhKZFE0WU1vVldyVm93ZVBacE9uVHB4K3ZScCt2ZnZ6OENCQXdIbzI3Y3ZzMmZQWnVqUW9iejk5dHNjT25TSUJRc1d1SVNWa3laTm9uYnQyclJxMVFvdkx5OTY5T2hCMzc1OThmSHh3V2cwMHJ0M2I3cDM3MzdmRk0vZCtIZWhjK2V1aElWTlllM3FWY2l5ek1CQkh5R0tZcjRLYjNObnp5UWpJNE0rNy9YU1BtZnUvRVg0K1Bnd2FjbzBabjQ2blVVTEYrRHA2Y25BYkRxaXg0NGVaY09HOWJSdjMrR1dZeXRiTm9qMjdUdndicStlS0NnOCsyeXdwaDJjbDhDeVhxOW4rSWlQR1RkdU5EYXJqZEtsU3pONDZLM0ZsMjAyVzBRdUhwdWlxdSs1ZW0yQ2dDSUlndUNka1pIUnoyZzBUbnhVTHBaU3BVb1JHaHFxdFdFNDhjVVhYOUMxYTFkV3JGaEJ0MjdkQUZpMWFoVVRKMDdrd29VTEZDdFdqSjQ5ZXpKeTVFanRTZmpUVHo4eGNPQkFMbHk0UU8zYXRXblFvQUhyMTYvWGRFVURBd1BwMXEwYllXRmhXajR0TkRTVU5XdldJSW9pSFR0MlpQYnMyYmtXRmR4NGRMQm56eDRlcjFqRlBSRjVJQ1ltNXRQYU5aLzRCVmRhOEJRbkxUZ3FiYmdraXFLczArbFZ3NWFVbE5URzI5dDdyWHY2Ymc4blQ1NGtMUzJOQmcwYWFPK05IajJhSDM3NGdmRHc4UHMyRGxtV3VYemxLbkZ4Y1VpU1JFYjZvN2xFeThOc1JxZlQ0ZThYUUZCUUdVUlJ6QzluNDVpeldPejJlemRuSG1ZemVyMmVBUDhBZ29MS3VnM2JIZUxzbjM4T2EvNi9KcWZKS2VTU0RqaWs5MFJKRkVWWnI5Y3Bla0NKajQrLytDajBza21TZE52eWR2bmRHQmN1WEtCTGx5NnNXcldLV3JWcWNmTGtTZWJObThmdzRjUEpqUGNManNqSXlOdW1VN2RZckp3NGNRS2RYbzlQb2NKdStiM1VGT0lUNG9uNUxacGFOV3RoTkJweS9lMSsvZlUzUkowT2I1OTdQMmVwcVNuRXhzVVJIUk5OdmJwMTg5MzN1cnVmTVZjY09uZ2dsc3lDZ1ZZNGNEQjdPRUpSQlFVRldaWVJCRUh3Qkl6L1orKzc0NXVvLy8rZmQ1ZGNkdmVtcFlXMkRGR2dTQUUvRkJGL2JCemdGMFVGUkN4WWtDRWdJaFFVRkdRclFnc2lVNUNsSUdKWkFySmt5aXBZaG15UTBxYnBidE9SY1hlL1AyNDBTZE5Tb0dYbTlYaEVhZFpkM25mM3ZOZDhQbG1XMVFOUXVKYnc3bXpxMUtsWXZIZ3gwdExTRUJ3Y2pMaTRPSXdlUGJwU2I2RTY3V0dKL3o3cXhvc1RleUVzdEx5WGRPMzZEZVRtNWo0VXdXUWZiMitFT3BIaGMzbHNsZCsvUTJvRjlBRXZZMkIwQ0VWTEFKZ0ZvV1NHSkVsT0pwTnhKTXFTY1JkYzYzZjNGaDhmait2WHI4TmtNdUhxMWFzWU0yYk1Bd00xQU1qT3luWU5UenN4cmM0TldWbk8rUjF5Y25JZXlwcHBkVzdJeW5iTkJOOURxdVVpN0ZzOGJGczk3SXNISW9PdTZKMnpMSHZldFlTUGwzSGN2UTlQUCttbTBXakJza3lGS1ltSHNXWWFqUmFNbFhFZG5MczBpOFZ5RmVYNzF4ejcySGgyRHdIY1pBUkJjQnpIY1ZhcjlYeEZveE11ZXpTTklJQ1NFaGVYVzBWV1VnSFAzY01zcnR6cjhTckl6OGVONjFkUlZHU3NGRGpENm9URHpkMzlvZjIrbXRoUG83SHdwaE5BSytleEVVU1o3b0ZNZktHa3BPU2NDOWdxODQ1NDJtYUR3UUFydzhCWVdEMjB6VnF0RGpLNURINit2Z2dNREt6Mi9kNjFjd2VXTDFzS2d5RURRVUZCV0xscUxTNWZ2b1RZL3Yyazk0eU5uNEN1WGJ1NUR2SWpiTmV2WFVGeGNlWDBQa1ZGUnR5NGZoV05telo3b3Ziejl1MjAydzZBeGdCZ2hhSkJ1WWNJYkFEQVhicDA2VngwZExUckRLb0ExSktUa3dHQ2hFYXI0Mm1iQTZydis0dUtqRWpYWnlBOVBSM05tbFhmU1ptV2xvWVowNmZpeThsZkl6cTZCUW9LZUdxY2lJaEk3TnE5RHdBd01QYjlHbHUzWlV1WDRQWHVQZXpZVE1UOW1qdm5HNlNrL0FPYXB0RytReWNNL21pSU5IeWRtcHFLaExsemtISTJCUXFGQWgwN2RzS0hjWU5SazAza2Q5cm1pekV2UUM2WGd5QkloSVdGb1gvc0FMUnVIZlBBenNFN2dZWHR1ZlF3clNiMmMvKyt2UmtDYURFaXFObDdiYnlYQmx1VktoSGxXclpzbVFYZ3Nndkd5cHRlcndjSUVuNytnVFdTbTlGb3RQRHpEd1JBSUQwOXZkcSs5K0svRitEajQ0UFdyV05BMDdURUUwY1FCQlFLQlJRS0JXcFM3K0xINVV1UmsxTStnVDlwNGdUVUNnN0diNzl2d2FMRnkzRDB5R0VrSlcwQ3dQZmtqUjB6R3ZYcU44Q20zN2NnSVdFQjl1L2JpOTgyL2xwaisxblZiU1l1V0lqTlc3ZWpmK3dBeko0NUhSdC8zZUM2T0dyZXFiZ3ljOGEwa3NyQ1VJSVFRbEhZaDZJUTNzQ3lMSHVLSk1sSTEzTGFtOEdRQ1kxV1YrUGIwZWpjWURBWTdqc2tQWDA2R1pPK21BQ3oyWXppNG1KMGY0MFBNM3U4MFJQOTN1OWZwZTg0ZXVRd0VoUG1RYTlQUjJob0dFWjk4aWthUGZ1czdWMFV5NVl0UWFiQkFQK0FBTVRGRFVhckYvNEhBQmcyOUNQY0VoaFRSMzQ4SERJWmhlRGdFQ1F1V0FpV1pkRzJiVHQwZStVVktCUUsrUG43bzNsME5DNWR2QWlBcjFoNmVubWhkNTgrb0drYXdTRWhhQjNUQnYvK1czTkYrN3ZacGtxbFF1dldNWkRIVDhERUx5YWdVK2N1angwekM4TXdPSHIwQ0xZay9ZNGhRNGNqT0NRRUFEOGtQL2U3YjVIeXp4bVFKSVhZZ1I4aUpvWW5RczNNek1TMHFWT1FuWjBGbmM0Tll6NGJpOXExUXl2ZERrRVFpSXFLZ28rUEQxaVd4Zm56NTVHV2xsYmwvVnp4NDNMOHNYM2JPV2RoS0FDVzR6aTJMTDlHY0NBSXZrRzlvRUFxSGdBQVo3RllraFVLUlM4WGxObWJsYkUra0NxYVJxT0ZzU0R2dnIrbmFkTW9iRXJhaWgxL2JNZktGVDlpOWRxZjcrcnpWNjljd2VjVDRqSHBxeWxvM2p3YWUvZnN4cWlSdy9IVHFyWHc4L2ZIelpzM01HWHlsNWc3Yno0YU5HeUlUYjl0eFBqeDQ3QjV5M2FvMVdva0pDNlF3cmM1YytjaE1yS01PSVlrU2ZUdTA3Y3NKM1A5R2c0Zk9vU1BodkMwVVQ0K1B0TG5SVy9xZEhJeVh1L2VvOGJXL1Y2MkdkMmlKY3dXQ3k1ZHZJaW9aczBleWZPV1pWbXA5Y2oyM3g4UEg0cGF0V3Jod29YellHd3F4OXUzYlVWcGFTbFcvTFFHT1RrNUdQUmhMQm8zYmdJM056ZUpFZmVWVjEvRGlSUEhNV1BhVk16Ly9vZEt0MStuVGgxUUZJV2RPM2RDb1ZEZzVaZGZSbVptSml3V2k5Tjl0UDA3SmVVZjdOKzNGN05tZjN2bGhWYlJqbUdvYlk0TklvQVJBamhydFZxKzNVTk13aFVVRkp4eXdWaDVxNjVDUVpXMlpUUSs5Tis3WlVzUzJyN1VEcTFieDBDaFVLQnpsNjVvMExBaGRncDg5OTdlUGxpMmZDV2VhZFFJSkVuaTFkZGVoOFZzeHExYi8xVjVHK2ZPbmtYSDl1M1FyMjl2TkdqWUVDKzJmY25wK3haK1B4OHF0UnBkdTczeXdINS9WYlpKRUFTOFBMMWdMREkra3VmczhlUEhNSDdjWjdCWUxNakp5Y0hBMlA3SXllRUY2YjZkTXhmajRpZVV1MW1mT1hNYWJkcThLTnlBQ01qbE5DNWR1aWk5OXVLTFBLVzlMU1B1blc0WW9vZkdjZnhFZ0tlbnA5MTdsaTVaSkZHRHA2VDhnNCtIOHplNEs1Y3ZvV2xVRkc3eHJyK3R0OFk0Q1VmQmNad0VjSEk1YmRlZ3k3MzExbHVud0hmMnVxd1NPM1BtTkRwMWVCbDVlYm1TaDlPdjc3dFBWRTR4TU5DK0s3OTI3VERvOVh6K1Q2dlY0dVRKRTRqN01CYTkzK21GOTkvckk5MXRxMnFObm4wV08vL2NpNS9YYjBSNmVycWRFSWhvSzFmOGlMLy9Qb3FwVTZkWDJ5amNuYXlxMitRNERqbTVPZEErb2oyRXpadEh3OHZiRzE5TytnS2ZqUG9ZUGQ3NFA0bEI1azZNdUdmUHB1Q3pNYU5CSzJqazUrZExyNG1NdUlrSmN5VkczTXFNcG1rd0RBTnZiMi9FeE1TQVpWazd3a2tBZU9mZFB0aTdkdzhTNW4ySHlWOU93dEJodkRCTjNmQUluRHh4M0RoMHlFY1pEaUdvSGJBSllGWk8xSVVVa3NjY0FIYi8vdjBzeDNGSFhkQjFaeXNwS2NHYTFhdWZ5Ti9tNys4UHZVTVI0L2J0VklrYi84QmYrN0Y2MVUvNC9QTkpXTDMyNXdwRFhZSWd5b0dkcWJRVW0zN2JDRk1wVDlvY0dCaUk5dTA3NE15WjAzYnYyN0QrRit6YXVRTnp2a3Q0WUgxWmQ3UE40OGVQZ1piTFVhOSsvWWR5ZkRwMjdDZzlIRm1jeGJXUGl4dU1VeWRQUUVFcnF1enhidDZjaE9YTGxtTGE5RmtJZGNpaFZjU0llNmR3dEdIRGhqaDA2SkJVbGJjMXJWYUxRWU0rd3ZwZmZrYTdsMTlHL2ZyOFdGbVRKazNSdmtPbmt3WkRSbVdneHBiTmlZckJLSy96UU1LZU41eTFXcTB1WUt2aUFkdTdaN2ZrM3R2YXZyMTc4T0hBRDlDdjc3dVlPV09hbEZOSVMwdkRvQThIb1BjN3ZUQnI1blFwcWY5UThvWldxMFNxeWJFc3JGYXJCRUxkWG5rVisvZnZ4YkZqZjhOcXRXTFBudDA0ZHpZRkhUdDFBc0FMakJBRVFGSVU4dlB6cEZDQ1krM0pUQU9EZ25EMHlCRllMQlprR2d6OFhWeWh3RThyVjJEZHVqV3dXQ3pJeTh2RmdRTi9vWEhqeG1XaDhPWWtiUHB0STc2YmwvakFlT3FxdWsyVHlZUy9qeDdCOUdsZkkyN1FSdytsY0pDUmtZR2RPM2RLRDJkTU1rYWpFWjkrT2dwOSt2WkRRRUFBWmt5ZldpbTdzeGhpZW5oNFlOYnNiK0hsNVFXVHlRUjNBZUJGUnR4aHcwZEFMcGRMakxpVm1kbHNoc2xrd3NHREIyRXltVUJSVkRsdGo2dFhyMkw2dEsveDFlU3ZjZlRJWVd6ZHVrVjY3ZFZYWHp2ckpBeGxiSE5zb21OR0VJU1VxM056ZDRkTUtJOXlvbHRYV0ZoNHpFVjZlR2RUcXpYbzJLa0xWcTlhaVM1ZHlnRHErdlZyMkxCaFBSSVNGa0NoVkdMbWpHbll0blVMWHUvZUEzUG5mSVAySFRxaTU1dHY0ZGpmUjNIbzRJR0hzdStPRGJvenBrL0ZqT2xUMGFGakozeit4U1JFUnRiRHhDOG40L3NGaWRDbnA2TjJhQ2htenY1Vzh0aTZkTzJHczJkVEVOdi9QVkNVREs5Mzc0SEl5SHJJeWJVSCtWR2pSbVAyckpsWXZtd0phdGV1alNYTFZvQ21hY3lZT1J1SkNYUHg4N3Exa012bGFQdFNPL1I3bjZkZlp4Z0dzMmJ5WWVBN3ZleTU5MWV1V29PQWdPcHZZcTdxTm9jTitRZ0V3Uk1zZmpKNnpBUHRZN3RidTNyMUN0cTJiWWQzZS9lQjFXckYzTy9tSUNjbnAxeFBvYTAxYlJxRmMrZk9naVJKNU9YbDR1clZxNmduRkg0cVlzU3R6REl6TSszQ1h3OFBqM0xDTFNkUEhNZlljZVB4ZlBQbWVLNXhFeXhidWhoZHUzWURRUkM0ZHYzYXRZcEFEUTVUQnlSSlFTYWpZRFlERkVtVlRSNklIdHRISDMxMGROMjZkZmtBM0Yzd1ZibTk4WDg5MGE5dmI0azFGQUQrL3Zzb1VtLzloMEZ4QTZXN2xsWm9GVWxKK1FjVEJVV2c4SWlhNzZycDFMa0xPblh1VXU3NXlNaDYrT3RnNVRxbXJWdkhWSGpoS2hRS1RQaDhvdDF6QXorTUsvZStGaTFiNFpjTkc4czlIeEVaaWUvbUpUcjlib3Fpc1AvQTRRZDZIS3V5elR1dDEvMmFUbGU5N1VSTm1qUkZreVk4NWJaTUpzTW5Ea3k1enF4TDEyNjRkT2tTK3ZmanE5YkRQaDRoaGVRVk1lSldaamR1M0lDSGh3ZmF0MjhQQURoOStuUzVnc05idmQ2Vy91M3Q3WTFQeDR5VlVuNXhBMk5UbllJYVFiRGdPSllUakNSSmppUUpqaUJJYUxWYUxqYzNoL2ZZYkhPaXYvenlpM1hObWpVSFNKSjh4UVZkRlJ0QkVGQ3BWSGlqWjArc1dsVW1qbUV4VzlEMnBYYVM1Smxqd3JrbUcySmQ5dmdhUlZFb0tqSSswT0Y4eDl4b1pRRG80K05UWllVczIvTTlPVG41bnZiTllySDhyZGZyYmNOUXF3aHVCQTl1bkRSbFFKSWdDQklrU1lCV0tPRHU3c0VYRHh4bXJsaUx4WExRZGFyZEdkZ0FvRWYzTjNBNzlaYjBmSFNMRnRpemU3ZEVEYjU3OTU5SVNmbEhjdWUzYjl2S2g0TkNHZjErVGFWU3V3N0dYYTdOdzF5emlyYnQ1K2VIWW1OaHBhbVBxcVpJSG5hS3BqcmVsNXViKzA4bFlhaERLQ3FNVXBFa1NJSUVTWkpTVlJSQ0lvNEZ3R1ZrWkxpQXJZcW1VQ3JScDI5WnZxcEJnNFlZTnZ4ampCMHpHbS8zNm9rL2QrNUFjSEF3QUdENGlGSFl1ZU1QOUg2bkY3WnQyd3F5R21ZZnhUdTl5K3l0eUZoWTRXd3ArWkRXck1oWUNLcUNGcExBd0VCd0hJdk1qSFNuKzFhbmJzUWR3VUN0MXFCTzNZaUh1dTdWdForblRwNjQ2Z1RVeEVlWm1BdEI4SVVza2lnRE5aSUVvVktwQ0t2VlNyQXNTM0ljUjNFY0p3ZWdZRmwySDRCblhaY0ljUExVS2ZnSDNML3U1NFVMNTFHclZqRGMzTnl3Wjg5dWJOKzJGYk5tZjJ2M25nejliVHgvRjUzc04yN2NSSGFPaTBIWDBUTDBhZkR4OFVabzdmSnN0UStMZFpobjlmVkdtQk1HWGRFTUJnUDBlajJzVmlzS0gyQmorS05rSE1lZGI5ZXUzU1R3SWkyMjRpMUZBSW9KZ2hBMERnaUdJQWlXSkVtT29palFOTTNSTkEyRlFnRVpINTlLZVI4cEhMVmFyWHRrTXBrTDJBRElxaW4vVVZwU2lqR2pSL0hLNzFvdFBoczdydHdkWFM2WDM5VjNob2JXUm1hbUFSbjZOR2gxYmk3TkEyTWhqTVpDTUZhclUxQURnTERRVUJnTUQyN054SDFpR2FaU1VCTkRVajgvdjZmNkdCWVdGdjROSjdrMUFJd1lWWXF0SGhSRlFTNlhnNlpwS0pWS0tKVktxRlFxRUZxdGxyQllMQVRETUFUTHNoVEhjUlFBT2lzcjYyVXZMNitOTGxnRDB0UFRrYTdQRUJnNGFzNE1HZWtJRFBDLzZ5RjRqdU53L2NaTjVPUmtnN0d5S0MxOU9za25WU28xU0lxQ2o3Y1BRa05EN2xpb3VYbnpQMlJtWllHeE1qVzJaaXFWR3BSTWRrZFB6V1ZsZHVMRWlVK2pvNk92QWloR21jYUJrU0NJSXNHTE13djZCZ3hGVVp4Y0x1Y1VDZ1dVU2lXblZDcWhWcXRCdUxtNUVXYXpXUVEyMjNCVXliSnNNb0JhcnFVR1RwMUtCa0VRMEdoMVVGZnpIYjY0eUFoallRRUFybHI1MkZ6bXNzY3dERTBqU1hLa1RSaHFDMndsQUVvSmdyRFJFS1U0bXFZbFlGT3BWRkNyMVh3b1NwSWt4ekNNYlNqS0FXQVlodGxCVWRRSHJ1VUdtaldMUW5wNk9neUdUQlFXNUZYYnNMcE9wNE5NSmtOUVVDQUNBZ0pjQysyeXA5cEtTa3IrZ24wMTFDNFVkY0Fvb1llTnh6Q1NKRUZSRkNpS0tzdXhpVzBmd2xBcEM0QXRMQ3o4MDhQRHd3VnNnZ1VHQnRZSWZiZkxYT1l5M3E1Y3VYTEdBZFNzQUt3RVFkaTFlaEFPZld3aW9Jbi9Kc1h5cURoblpkUFR4bnA1ZWYwSjRMWnJ1VjNtTXBjOWlEQzBTWk1tMXdYd3NqbzhHRnRRQXdCYjdMSUZONHFpSUdOWmx1TTRyb3h0MHNaakE4QmV1M1p0TzBWUkExekw3aktYdWF5R3c5QjlqcDZhQTZpSnpMbWNHRjBLUEc4Y3d6QmdHQVpXcXhVV2l3VXloVUloa3JSSjAvOEMyTEVBR0hkMzkrM2UzdDR1WUhPWnkxeFdvM2I4K1BIa1NzSlFpZEZEOU5Ca01obmtjam1Fd2dIRXdvRldxd1ZwRzV2YWNMTko0YWl2cis5QnVGVGlYZVl5bDlWc0dIcXhSWXNXL3ptQW1nVVZNSG80NXRha0VGUW00eDgyRlFXQ0pFbU9aVmxDaUdGRnNRVEdiRFp2cG1tNm9XdjVYZWF5R3IyNG9kZnJrWkZoQU1Nd01CcWZuc21Ed3NMQ2ZiQnZ5cFVlSE1lSmpia2l3U1JZbHVVc0ZndHNkQS9BY1p3VWpzcHNQVGJCYStPSU1vVVhGZ0NUbHBhMkxTd3NiSXpyMUhPWnkyb08xSktUazhHQmtLWWgvSitpMzc5enh4OW5uSGhyVnZEVEJuYkVraVJKY3BSTUJscE9RNkdnb1ZBcW9WS3FvRktyb0ZGcm9OUHB5a0pSVzNCekRFZnIxcTE3bm1YWm5VL2FZaVltSmtLcFZEN1FiVnF0Vm93WU1RSitmbjV3ZDNkSFhGd2Npb3VMWFZmMlUyNTZ2UjRjQ1BnSEJEMTFZM0ZXcTNWdjdBZnZaOXNBbThYQmF5c2Zob29ENzdaaEtDV0RUQzZIWEM0SEtaUEpSRkRqYkR3MnpvYnRnd1hBRkJjWEo3bE92L3UzY2VQR0lTa3BDZXZYcjBkU1VoSjI3OTZOWWNPR3VSYm1LVGVESVJOYW5kdFQrZHZUMDlNT09RbEJMYWk0ZjAxb3hpVTVpaFNBVGNibjErUXlHZVEwWFJhS09oWVJDSUt3YS8xSVNFallQRzdjdU04QWhMaE93M3V6b3FJaXpKOC9INnRXclVMYnRyeVUyYUpGaTlDeFkwZk1tREZEVW1wMzJkTm5ETVBjazZkMjRmdzVMRjcwQTc3OWJsNk43dCtGQytleGRjdG1OR25TRkIwNmRwS2UvKzIzWDdGcDQ2OEFRYUJ0MjNiNElKWnZvS2hNWVBuTW1kTkltUHNkckl3VllhRmhxZGV1WDcvZzRLMUpZYWlJUDQ0TnVTUkZnaVFkdkRXaFNrclRkSm5IWmh1S2l1R29qZGZHakI4L3ZzUmlzZno2dEoxd2E5ZXVSWk1tVGFCU3FWQzNibDNNbTJkL0F1M1pzd2ZObWpXRFNxVkNkSFEwWnMrZWJRZFFQWHYyUlBQbXpRRUF5Y25KS0NrcGtVQU5BTnEwNFpXMmp4dzU0cnE2bjJJckxDeTRwOC9WYjlBUUU3Lzhxa2IzYmNIOFJDeGRzaGpYcmw1RlVWR1I5UHgvLzkzRXhnMGI4UDBQUzdCMDJRcWNPWk9NNDhlUENaL2hCWlpYckZ5TjkvdC9nQm5UcGtxcG1HbGZUOGFFTHliaXh4V3I0T1BydDJQdm50MFdaOTRhUU5oWFJFVndJMGxRdHVOVEFxako1SExJUmRvaXNUd3F2SW1qS0lwZ0dJWWpTUklNdzBoNU5nRFdXN2R1YmFwYnQrNklwK1ZrKyttbm54QWJHNHR2dnZrR25UdDN4bDkvL1lYaHc0ZERyVlpqd0lBQnVIcjFLcnAxNjRhaFE0ZGk3ZHExMHV1MnlrVTllL1pFYmk2dlAzcjc5bTNRTkcwbnFDR1h5K0h0N1kzVTFGVFgxZTJ5Y3BhZG5ZMnBYMDlHVnFZQkJFbGk4T0FoYU5ucUJhU21wbUxVaU9Hd1dNenc4UERFOGhWbDlQVGpQdnNVYVduOHdGQmVYaDdVR2czV3Jsc1BnRmVGU3BnN0Iva0YrZkR5OU1LWXNlTWtrUjRBV1AvTHo5aTRjWVAwZmdBWU1QQkQwRFNOMmJObTJPM2JQMmZPNFBubXphRldxMkcxV3VIcDRZa3pwMDhqT3JvRnpwdzVqWkVqUHdGZ0w3QnN5TWlBVXFWQ1dGZ2QwYk03VllHM1ppVUlNYjlHY0FEQkVRQkhrQ1JIa1NSSWt1S2tTRk1NUXdWdlRhRlFsZ0diVGE3Tk5oeTFteDJOaUlpNFlMVmFONUlrK2NiVGNGSjk4ODAzK09DREQ2UWNXR1JrSkc3Y3VJSEpreWRqd0lBQldMaHdJUm8wYUlCWnMyYnhkOC82OVpHU2tvSTFhOVpJMy9IMjIyVmlGY1hGeFU2TEZRcUZvcHdzbWN0Y0JnQS9yMXVEeG8wYm85LzdIK0RhdFd0WU1EOEJMVnU5Z09EZ1lQeXlZU011WDc2RXFWTW0yMzFtMmd6K2ZNelB6MFBjd0ZoSmY4TnNObVBxbEs4d1plcDBCQVlHWXNjZjIvSDlndm1ZOVBqTzdyUUFBQ0FBU1VSQlZHWFo1NXMwYlZxT2VmaE9Bc3VabVptWTl2VmtNQ3dEblpBbnRCVlkvdlBQblpMQWNrRkJBUlFLQmN4bU0rWis5KzJXWlVzWFp6bDRhcmJnSm9TaDRQaUhXRFN3U1ovSnlydzFXbWpXVmFtVUlPVnlPUnk4TmpnT3hndTlJZ3dBSmk4djc2a0pSOCtmUDQ4WFhuakI3cm1ZbUJqODk5OS9NQnFOT0gzNmREbXgydGF0VzFmNGZTcVZxcHhLRDhCclZUNE1mVXFYUGZvVzNhSWxkdis1Q3l0K1hBNVRhV21WQlZWWWxzV1hreWFpMnl1dm9VV0xsZ0I0YWNqVTFGdUlIenNHL2Z2MXhabzFxMkRJeUxEN1hMMTY5ZkhHLy9XOGkydmtIQ2FNSDR1QmNZUFFydDMvc3dmWUNnU1c4L1B6TVdya3gvQnc5empreEZ1ekxScEliQjYydVRXS3NnbERaUlJrTXJtTnQ2YUFTcVdHVEFRMnNXdFhERWNwaXVJRUhVSGIyVkhHeDhkbkQ4TXdod2lDYVAya24xUXFsY3JwQ1NQK1h5YVRsVk02cjB5VU5qZzRHS1dscGNqTHk0T0hod2NBd0dLeElEczdHN1ZxdVdqdlhPWUUyS0piSUhIK1FodzdmZ3dyVnl3SFRkUDRjdkxYZC96YzBpV0xvRlFxMGFmdmU5SnpGb3NGQVFFQmRtSHIvWmk3dXp0S1Mwc3grNXZ2NE9ibWhqTm5Uc05kT0s5RmdlV09uVHBMM3FKV3E0V2JteHNLOHZNeGVjcTBveSsvMU9aNkpkNmEyTHZHbG5WcENHRW9qMUdTUXlhWHlVREw1YUFWQ2lpVktxZzFhcEEwVFVNdTlINVVFSkxhRlJFQVdJdUtpbjUrR2s2cWhnMGJsa3ZxSHo1OEdJR0JnWEJ6YzhOenp6Mkg0OGVQMjczdStMZXRSVVZGUWFWUzRjQ0JNcUhrZ3djUGdpUkp0R3JWeW5VVnU2eWNUWnM2QmNlT0gwUDc5aDB3TG40Q2poNDlVdTVtNm1nSER4N0EvbjM3RUQvK2N6c1c0WWlJQ0JRVUZPQ3YvZnVrZk52bXBOL3RQbnY1OGlYODlsdlZnckxuR2plRzJXeUdRcUVBd3pBNGN2Z1FtalRsdFV3ckVsZ09DQXlFdTRjSDhuSnpkMWZrclFHRUhac0hRTmg0YkdWNU5jck9XMU5BcVZCQ3JWWkJxOUZDSmdKYlJVVUVtN1lQYVJLaGZmdjJ2eDQ1Y3VSRGdpQWVlMDBFbG1YeHh4OS9sSHUrYmR1MmlJK1BSOCtlUGZIc3M4K2ljK2ZPT0hqd0lPYk1tWU9KRTNteDRLRkRoMkxldkhrWU8zWXNQdmpnQXh3OWVoVGZmLys5WFZpNWJ0MDY1T2JtWXZEZ3dkQm9OSWlOamNYUW9VT2gwK2xBMHpUaTR1TFF2MzkvU1RIYlpTNnp0VDU5M3NQczJUT3diczFxc0N5TFVaOThDcElrN1lvSCtmbjVlS3ZuRzJqMi9QTVlPMjQ4RXVkOWg5TFNVZ3daL0tIMFBZa0xmb0JPcDhPMEdiUHczYmZmNEllRjMwT3RWbU9VZzQ1bzhxbFQyTGh4QTNyMCtMODc3bHRvYUJoNjlQZy9EUHB3QURod2FOT21yU1FlWHBIQXNrd213N2o0Q2VkZmU2WHIyUXE4TlF0QmlLQW1GQTBJOE40YVJZSWlLVTRtVlVMbFV0OGFyYUNoVkNtaEZpWVBpSjQ5ZXlJL1B4K0ZoWVVvS2lwQ2NYRXhTa3BLWURLWkNKUEpCQnM5QkpMak9Ca0FPUUJsVVZIUkFKVks5ZlhqZk5Ja0ppWlcyQng3L2ZwMWhJV0ZZZG15WlpneFl3WnUzTGlCc0xBd0RCOCtIRU9HREpIZXQyUEhEb3dhTlFwWHJseEJWRlFVV3Jac2lRMGJOa2k2b2oxNzlzU05HemR3NHNRSktaODJZc1FJckYyN0ZpUkpvbWZQbnBnM2I5NERuNEJ3MmFObCsvZnZSM2hrZzZmaXR4b01obStmajJwOEJEejl0NmhyWUFSUEJWNUNFRVFwRDNDRWxWZWhvamlaVENZcVVIRzJUQjRhclJZNm5RNmVucDd3OGZGRlVGQVF3c0xDUVBUdTNSdDVlWGtvS0NoQVVWRVJpb3FLVUZKU2d0TFNVcGhNSnNKc05zTnF0WklzeXhJMmVnajA0c1dMdldKalkvOEFFUDYwbm93cEtTa29MaTVHeTVZdHBlY21UWnFFYmR1MjRkaXhZdy9VNjd4eDh6L2s1T1NBWVJpVWxqeWRJMXBLbFFvVVJjSEwweHRoWWJVbDhsUm54bkdjc0diWnNGcHJiczJVS2hWa01obTh2YndSRmhiNjFBTWJ4M0hYUGhzemV1TGFOYXVMQUpTZ1ROZkFDRjVhcndTQVdRQTJScERXWTRWd2sxTW9GZnhjcUVvRnRVWURuVllMTjNkM2VIbDV3OS9mRDhIQklRaVBpSUJNcFZLaHBLUUVORTNEYkRaRExwZkRZckU0VmtodFExSUdBRE53NE1DQzNyMTcvNlJVS2ljOWpnczhiTmd3SkNZbTNzOEJ3cFVyVjlDM2IxK3NYcjBhVFpzMlJVcEtDdWJQbjQvNGVON3R2cE5La3FQcDlYcjQrOS9kNkxQSlpNYVpNMmRBeVdUUXVibTc1UGVLak1qTnkwWFd5VXcwYmRJVU5DMTNldXhPbkRnSmtxS2cxZFg4bWhVVkdaR2RrNFBNckV4RUM4M2FGZG50Sjd5Zk1UYzNkL1BhTmF0Tk5pR29XUVF5QUJZT1lBZ0hiUVB4UHh6SGdXTTVzQ3dMbG1WNUpnK0J6Y05xdGNCaXNjQmlOc05zTXZQQXBsUXFVVkpTWXBkcms4bGtzRnF0b0NnS0RNT0E0emlKTnB6ak9BWUFzM256NXAvZmZQUE45d0RVZmR3V09DRWhBUWtKQ2ZmMUhUMTY5RUI4ZkR4R2pCaUJ0TFEwQkFjSDQ5TlBQOFhISDM4c1hVQTFiZW42ZEZBeW1Vc3dXVENOUmd1TlJvc01mUnJTMHRNUUZscmVTN3ArNHlaSWlucGdhMmE3VHpkdi9vZlFTbVQ0YWdVSFA4bmUydldsUzVlY2RBQTFtOXhhV1l0SEdhRWtCYmxNMUEzbHE1Nml0NmJWYXVIdTdnNVBUeS80K2ZraE9EZ1lkY1BEMGFqUnN5QTFHZzJVU2lVVUNnVm9tb1p0TVVFb0lvQ2lLTTZtbjAxcy9iRDI2dFVydDZTa1pPWFRmQ0hGeDhmait2WHJNSmxNdUhyMUtzYU1HVk5wQ0ZUZGxwMlYvZFFPVDFkbVdwMGJzckt5bmI2V2s1UHpVTlpNcTNORFZuYldVM3RNc3JPemt4WXZXbGdLKzRLQkNHNFNrNGR0aXdjZmlwS2daQlJIVVE3TnVNS1VnVnF0a2tETzI4c2JNcGtNcEZhcmhWcXRobEtweEwyMGZxeGJ0MjR0eDNFdWh0MkhjZ2U4OStIcHA4RnpZMW5HNldzUGE4MDBHaTBZSy9PVW5xdmN4VzltenpyaEJOVEVmRm81d1JaZTZaMTBtQWZsUjZma0FxaXBWRXBvTkJxNHVibkJ3OU1Udm42K0FBQ1pUcWVUS3FKQ3djQXUxeWFUeVRpcjFVb3dET08wWVRjMk5qYi9yYmZlV3FIUmFLWS80UWNHZXIwZUJvTUJWb2FCc2JCNjJFMjFXaDFrY2huOGZIM3ZXdHFQSUlDU0VoZVhXMFZXVWdIUDNjTXNydHpyOFNLU00wSE1Ud2F1NU4zYmhpTTh3QTJKQWhmbFd5Mi9veUEvSHpldVgwVlJrYkZTSUErckV3NDNkM2RrWkdRa3JmcHBSWVc1TlRocHlDVkprdVA3MW1TY1RFYnhvQ2FUZzZiTGRBNTRqUU1kNzYxNSswQ2g0THNMWkI0ZUhpZ29LSURSYUpTcW9XYXpXUUkzcTlVS21Vd0dobUhFcEozVTB5YmsycXh2dmZYV21pMWJ0cnhCRUVTTEp4WFVrcE9UQVlLRVJxdmoyVTJyVWR1NHFNaUlkSDBHMHRQVHExMEpmdGZPSFZpK2JDa01oZ3dFQlFWaDVhcTF1SHo1RW1MNzk1UGVNelorQXJwMjdlWkN3a2ZaRXBPQnEzbjMvdmtyZVNEbUo0TmIwckZhZHVmNnRTc29MaTY2NDNsOTQvcFZQTnU0NllsM2VyMlo3QVRVbkhwcmtKaHliWWZjNVpETDVKRFRmRE91UXFHQVVxV0NSc05QTTNoNjhYazIwV1NlbnA3SXk4dERZV0doYlE4YmFKcm1xd3dPWHBzTjY0ZWsxcng5KzNaelFVSEJqKzd1N2s4a3NPbjFlb0FnNGVkZk0yTEpZbkxab0U5RGVucDZ0WWt5cDZXbFljYjBxZmh5OHRlSWptNkJnZ0tlR2ljaUloSzdkdThEQUF5TWZiL0cxbTNaMGlWNHZYc1BPellUY2IvbXp2a0dLU24vZ0tacHRPL1FDWU0vR2lJTlg2ZW1waUpoN2h5a25FMkJRcUZBeDQ2ZDhHSGM0SExEMmRWcGQ5cm1pekV2UUM2WGd5QkloSVdGb1gvc0FMUnVIZlBBemtIaWZrRE5CdHlxeSs0RWFyYmc5dC9ObTF1dlhMbHN2WU8zeHBUUHJWR1FVUlFualU3SjVUd2RPRTJYZVdzNkxkdzlQT0R0N1dNM0FrbjYrUGpBdzhNRE9wME9hclVhS3BVS0NvVkN5clU1eTdjNXk3VjVlSGhzWmxsMjI1TUliQVpESmpSYVhjM25ZSFJ1TUJnTTFmWjlGLys5QUI4Zkg3UnVIUU9hcGlXZU9JSWdvRkR3ZDcyN2JVbTVHL3R4K1ZMazVKUlA0RSthT0FHMWdvUHgyKzlic0dqeE1odzljaGhKU1pzQThEMTVZOGVNUnIzNkRiRHA5eTFJU0ZpQS9mdjI0cmVOTmNlOVVOVnRKaTVZaU0xYnQ2Ti83QURNbmprZEczL2Q0UElrNzJCV3EzVlhtNWdYTGpqeDFDcjAxa2c3YjYwTTFPVENQS2hDcVlSS3hjdnN1YnU1dzh2VEMvNDIzaG9Ba0g1K2Z2RHk4b0tibXh1MFdpM0U5Zyt4U21vRGJKd05oYmpkaUJYNGFYeUx3V0Q0OFlrOE9JejFnU1NiTlJvdHJGYnJmWC9QNmRQSjZQNWFOOHlhT1IxNnZSN2RYK3VHN3E5MXc0b2ZsMWY1TzQ0ZU9Zdys3NzZOOWkrM1JXei9mamgzOXF6ZDYvdjM3VVcvOTNxamErY082UDkrWHh3OWNsaDZiZGpRajlEOU5UNjBIZm54Y0hSL3JSdUdmalJJQXBHMmJkdmh2WDd2UTZGUXdNL2ZIODJqbzNIcDRrVUFmTVhTMDhzTHZmdjBBVTNUQ0E0SlFldVlOdmozMzVxclQ5M05ObFVxRlZxM2pzRzQrQWxZdkdpaEhmSGlrMkJGUlVWSStuMFR4bzRaWFQwaDYvWHJPMkUvRTJvSGJCekhXVG1PWXppT1kxbVc1UWhBOHRaS1NvcTVUSU1CcWJkdW9hQ2dvSXk5UTZtQ1JxT0dRcUhBZ3ZtSk9IandMNmpVYW50Z0N3b0tnbytQRHp3OVBhSFQ2ZURZL2xGSmxiU2MxeFlZR0hqWVlyRXNlZEtBcmJvS0JWWGFsdEY0MzkvUnRHa1VOaVZ0eGNjalJxRldyV0JzU3RxS1RVbGIwZS85L2xYNi9OVXJWL0Q1aEhnTUhqSVVXN2Z2eEp0djljS29rY01saXB1Yk4yOWd5dVF2OGRsbjhkaXliUWRlZmZWMWpCOC9UaEtsU1VoY2dFMUpXd0VBYytiT3c2YWtyVWhjc0pBLzRVZ1N2ZnYwaFllSHAzRGlYOFBoUTRmUXNpVlBBdURqNDRPRXhBVlFLbFVTRUo1T1RrYmp4azFxYk0zdlpadlJMVnJDYkxGSWdQdzRtZU1RdmZoM1ZsWVdCc2IyeDVVcmw2dmxSbEphV3JwbS9Qanh0eHhBemVUb3JmRmpVenllTUF3RGtxVEFzZ3dzRmdzL1NSQWVqc3lzVExBY0I2VkNDWlhRM25IczJGRW9sVXE0dWJtWDJ6YXBVcWtRRUJBQWIyOXZ1THU3dzdiOW96S3Z6VmxmRzBFUWxuUG56cTBFY052bGhEKyt0bVZMRXRxKzFBNnRXOGRBb1ZDZ2M1ZXVhTkN3SVhidTNBRUE4UGIyd2JMbEsvRk1vMFlnU1JLdnZ2WTZMR1l6YnQzNnI4cmJPSGYyTERxMmI0ZCtmWHVqUWNPR2VMSHRTMDdmdC9ENytWQ3AxZWphN1pVSDl2dXJzazJDSU9EbDZRVmprZkhST1hBRW9QMGdDbTZqL3dkQ0tZUHF0ZnB3RzljR2hKdkM3bTJqUjQzQTZlUlRBSGpHM084WHpBY0FlSGg0NEtmVmE5SHYvUStxWTI5dUh6dDI3SzhLUERYYjNqVVc0SE5yRkVWeEhNZHhGRVdCWlZsT29WQUl3KzBxZUh0NXdXZ3NoRW9vR09UbDVjRnNNdUhGRjErRVhGNSt1b1FFZ0tDZ0lQajYrc0xUMHhOdWJtN1FhRFJRcTlWU0hzWVpBMGhGdWJhb3FLaXJ4Y1hGUHp6cEYzL1h6aDFRV1Boa0N0cnE5WG9FQnRwMzVkZXVIUWE5UGgwQW9OVnFjZkxrQ2NSOUdJdmU3L1RDKysvMWNlb0pWR2FObm4wV08vL2NpNS9YYjBSNmVqcVdMUzN2Nks5YzhTUCsvdnNvcGs2ZERwbE05a0IrZTFXM3lYRWNjbkp6b0gyRWVnaVZIU05BcU9SZ2Mwcmd2ZlExcU45b2lOSS9yOEw5VTN2cXhDRkRoMlBxMTFPUW1EQVAyN2R0UmQvMytBcTVlRzFYaCtYbDVmMlNtSmlZNitDcG1aem4xaml1VE1vWWtNa29LSlJLbU0xbVVDU1BOY1hGeFNBSVFuQzZGRGg4NkJBR0RJaUR6czE1bzdVTTRLbC9Bd0lDa0pPVFUySHJoOFZpRVdheXJKekE5c0d4TEF1Q0lGaU80d2piWEZ1Yk5tMVdIajkrdkIxSmt1MWMvcy9qWi83Ky90Q25wOXZmZm0rbklpcUtiMFU1OE5kK3JGNzFFK1o4TncvQklieG8yWXN4THpqMWFoekJ6bFJhaXUzYnQ2RkxsNjVRS0pVSURBeEUrL1lkY1BEZ0FidjNiVmovQzNidDNJRzVDZlBoNXU3K1FINzMzV3p6K1BGam9PVnkxS3RmLzRFZkgwWHJFTGpIdnlqOWJmazNFN21mN0lTOG5qZEt0bDJHOVhvdWRNTmJJbmZrRHBpUHAwSDdnWDBMVVhoRUJEcDI2b3lWSzVaajVxeHY0T1oyNzFNWWNya2M3ZHJaWCtZN2R1dzRNSHIwNk9OVjhOWVlBVDlZcTlYS0NaRWdLSm1NVXlxVUlBa0NOMjVjbDRZSGVEWVBEVTZmVHNaTDdWNUd2UVlOOE8vRkN4VURHd0NFaElRZ0t5dkxhZXVIQ0d3aXVERU1JejJFR1ZJV0FDSDJ0U1VuSjVzTkJzT1NnSUNBcHhMWWZ0MnducS95Y1J6YXZmei84SDcvV0FCOG04TlhrNzVBWVdFaG1rWkY0ZERCQTFJdTZrR2JiWkdDWTFsWXJWWnB3cVRiSzY5aXlPQTRkT2pVQ2MyYVBZKy8vdHFQYzJkVDhOblljUUI0Z1JHQ0FFaUtRbjUrSHJadTJTSjhqLzFzYkdCUUVJNGVPWUs2ZGNPUmw1c0xYejgvMEFvRmZscTVBdm41ZVhpM2QxOFVGUmx4NE1CZmFOS2tMSisxWlhNU052MjJFWE1UNWo4d25ycXFidE5rTXVGMDhpbk1tREVOY1lNK2VpaVU3cVpEdDJEb3RycjhNYjJlQzdxSlArVFArY0Y2TXcrcVYrdkJjamtiY0RndU8zZjhnWDE3OTJESzE5UHd6ZXhaK0hyYWROU3JkMjhBYmJGWXNIT252WmI2dFd2WHRoWVVGRGhPRjRnZVd6bUdYSXFpUUZJVXdIRlMzNnhjTGtkQVlDQTBHZzEwV2gzKytlY00vUDBEUU5NS1hMMXlCWVVGaGJqNDd3WGs1R1NESkVuSTVYTDBldnVkOHNBbWhxUzV1Ym5JejgrSDBXaEVjWEV4VENhVEhialplbTBNdzNBY3gwRjRTTk1JQUN5QmdZRUhUQ2JUZkpxbWh6eE5vSlo4NmhTMmJFbkN3aCtXZ0tJb2ZESnFCRUpEdzlEdTVmK0h1WE8rUWZzT0hkSHp6YmR3N08rak9PVGdwVHdvYzJ6UW5URjlLbVpNbjRvT0hUdmg4eThtSVRLeUhpWitPUm5mTDBpRVBqMGR0VU5ETVhQMnQ1S2FVWmV1M1hEMmJBcGkrNzhIaXBMaDllNDlFQmxaRHptNU9YYmJHVFZxTkdiUG1vbmx5NWFnZHUzYVdMSnNCV2lheG95WnM1R1lNQmMvcjFzTHVWeU90aSsxay9JNkRNTmcxa3crREh5bmx6MzMvc3BWYXhBUVVQMjloRlhkNXJBaEg0RWdlSUxGVDBhUGVhQjliRld4a3UyWDRmYkovMEQ1cUpIVmV5TTBiejREOTg5aWtEL2pvTjM3VWxKUzhPMmN1ZkR6OTRlYnV6dE9uamgrejhCV2JoOUtTbjRjTjI3Y0RRRzh6STRGQTFRd1pRQ0FzMWdzMEdpMW5OeEd3MEF1cDVHV25nYVpUSVk2ZGVyQ3o4OFAwMmZPUm9QNkRlRGo2NHVGMzgrSFZxdXpBN1Z5d09idjc0L3M3R3prNWVWSndDYU9XWWtlbTQzWDVoaVMyazBqRUFSaDNyTm56L0pPblRyOWp5Q0lxS2NGMkk0ZE80b09IVHBKellLdnZQSXFqaDM3RysxZS9uOUlTZmtIRXdWRm9QQ0l5QnJmbDA2ZHU2QlQ1eTdsbm8rTXJJZS9EbGF1WTlxNmRVeUZGNjVDb2NDRXp5ZmFQVGZ3dzdoeTcydlJzaFYrMmJDeDNQTVJrWkg0YnA1enlpaUtvckQvd09FSGVzeXFzczA3cmRmOW1rNVhEWDJTREllQ21ZZWtQNDNMVHdQTFQ1ZDcyeWMyckxsTm0wYWhhZFBxdVR3NWpqdnp4eDkvT0JZTWJITnJaaW0zUmhDc1FQbk5XYTFXRGdDVVNpV24wK21rV2RDaW9tSmN1bmdSL3Y0QjZOQ3hFOC9rSVV3WStQaFdQaHBXTGp0YXExYXRjcmsyMFdOejhOcWtjSlJsV1Z2VmVJYmpPQktBdFV1WEx2cnM3T3dmdkx5OEZqNU5YcHR0ejZ2QVl5Y2xuR3V5SWRabGo2OVJGSVdpSXVNalFXamc3ZTE5VHltU3RMUzBqV3ZYcmpVNkFUV1RIYWp4bkdzc1FZQWpTWktuOXBielBXcmkySlNDcHVIdDVZWDY5ZXNMdEVTKzhQRHdnSStQajkxa3pxREJ6Z1BDY3Z3Njd1N3VjTmJiVmtIakxpZlNHMVhVdE92dDdiM2RZckVzZmxwTzBPYk5XMkRYenAwb0tTbUJ4V0xCdHExYjBFTG8wV3JhTkFyYnQvRW56T1ZMMWRQL3BGS3BYYWh3bDJ2ek1OZXNvbTM3K2ZtaDJGaHhsWjBMOTdoL2o2b2F2a00wdGRvK3QxaGFXcnA2NU1pUkYyMUNVSk9EdDJaWE1DQUlnaU9FWm44WnJ6akZ5ZVV5WVJhVWxtWkIrU0YzZ1NYWDJ4disvZ0dTZHVsZGVXd0FYMGdRdlRaYnFuQkhyODIyaUNCNmJTeGZCbU9FU2lsSkVBUjE2TkNoWlczYnRuMmVJSWhtVDlLRk0rQ0RmaUFFN2pWZlh6OGtKQzdBODgyYm8xUG5MaGowSVY4d2FQUGlTMmpYN21VQXdQQVJvL0RseE0veDY0YjFDSStJNEJPbVQ5Q2QvbEd5SW1OaGhhMEw1RU5hc3lKaklhZ0tXa2dDQXdPUm5wNk96SXgwcUFXaUJUc2JHZ1V1TWZtZVowYTVjQTlnYVBWbGhPclVqWkFHNFRtT083MW56NTY5VHZKcXR1MGRqa1VEZm5SS0hKdVN5eUNYQzU0YkxZNU5sUTI1ZTNsNndjL1hyOG95bFU1WFdTNlhJemc0Mks2SVlFdHBKSWFpanUwZlRnb0pWZ0NXZHUzYXBXWm1aaTcwOGZGWjlEaGVKRm9uK1k5dGYreXE4UDI5M242blhESVRBUEx5Y2pGejlyZHdjM1BEbmoyN1VWSlNVcVZ0M1Nsc3lNN0pjUUdiZ3htTmhmRHg5WEg2bW8rUE43S3pIL3lhR1kyRjVRZ0JiSzFaczJZd0dBelE2L1VvS3N5Mzc1UFVBaGhiRzBEdCs5aURiT0J5ZHZWZEYxb050Rm9OYnQ2OHVmSEhIMzhzcUNnRWhZT3lPNStWRVpUdk9BNGN5M0ljeTRKbEdUQ01sWDlZTGJCYXpMQ1lTMkV4bDhKVVdneFRhUkZ1WHI5eTc4QUdBQUVCQWNqTnpiWHoycHpsMm13OU5vZENndWkxV1FpQ0lIMTlmWGVXbHBiT1ZTZ1VIejl1RjRtc211N3dwU1dsR0RONkZLLzhydFZLN1JPMmQzUm5YZFNWV1dob2JXUm1HcENoVDROVzUrYlNQREFXd21nc0JHTzFJclMyY3hBSUN3MkZ3ZkRnMWt6Y0o1WmhFQlphT1RENStmblowZTg4NnBhZm43L2twWmRldWxTUnQwWVFoQWhzREVFUWpNamNJYXBPMFRRTmxVb2xlR2RsZE45ZVhsN3c5UzFUbldyUW9BRWFObXhZOVd1MnNoZHIxNjVkWVYrYm85ZkdzaXpoVUVnb1Z5VmR0V3JWMHY3OSt6Y2lTYkw5NDNTeCtQbjVJVjJmY2Q4WFFGU3pabGk0cU9KUjJxSWlJd0lEN2s3TWhTQUlORy9lSE5kdjNFUk9UamJ5Y25KUVd2cDBraytxVkdxUUZBVWZieCtFaG9aVSt0NFcwZEc0ZWZNL1pHWmwxZWlhcVZScVVESVp2TDI5N3docWo1dFpyZFo5RXlkT1BPQUFhcVVpc0FtZ1pwOVhFN1FNUkNWM3VWek95ZVZseEpHMkFPZmg0UUZ2YjI4RUJBU2dkdTI3V3p2aVRvSWp0Mjdkd3ZuejUzSHQyaldrcHFiQ1lEQWdKeWRIQWp4SExWSUI5QWlXWlFtV1pTbU80eWp3V3FRMHgzSEtHemR1dEFvTkRaMEw0TEZTSHpsMUtoa0VRVUNqMVVGZHpYZjQ0aUlqaklVRkFMaHFKNXAwbWN0cXlOSVBIVG8wT3lZbTVwWUFaQ1hnTlVLTFlLOFBhaXVseDloNmF3cUZncFAwUVRXODBMR0hod2U4dkd6RVdlcld4VFBQUElPUWtKQzdpN0x1OUlhUWtCQkpVTmt4MStiWStpSEtZbkc4MlU0a1dIbm5naUREd3NLT0Z4UVVKT3AwdXFtUDAxRnMxaXdLNmVucE1CZ3lVVmlRVnkwc0hBRGZ2eVNUeVJBVUZJaUFnQURYNWVLeXg4SnUzNzY5S2lZbUpsVUlNOFhRczlSSkNHb1Z2RFZwMEYwaWpSUkNVVnVhYjFHL1FBeEZhOVdxZGRlZ1ZpVmc0L000b1U1emJVNTYyc1JDZ21Odm16aHVaU0VJZ25KemMvdlpaRExWcFdsNndPTjBNQU1EQTZ1TjNkWmxMbnRjeldnMHJnNE9EajRGKzlZT3h4RFVZaE9Dc3M1QzBJcEFqVmQxOTBGUVVCQkNRMFB2YVIrcnBCT24wK2tRRWhKaVIyOWt5N2dyRHFrSy9XMTJ2VzJDMXliMXRva0xzV3ZYcmlVc3krNXhuU1l1YzlsamxWZmJ2M0Rod2oxd1hnR1ZQRFk0eklNSzVKR2NMYWpSQXNXM0dJN3FkS0lvQzU5WEN3a0p1ZWVKRE5uTm16ZXJqb0k4VlpIVDdubnhPZkYxNFNFbThGaWhBNThRd2UyVlYxNUpPM0Rnd1BjaElTR2hBTUpkcDR6TFhQWm9HOGR4MTA2Y09KSDA2YWVmRmpvSlFjdUJtaUNBYkNlblo0c2ZGZUVJTCtSQ2dtVlozQTArMlFIYjNiaDZ2cjYrVGljUmJBU1dZVU1mVHBoTUpoQUVBVUc2VDJvQklmaGZSTFpwMCtaRVRrNU9ncWVuNSt5cWhzVXVjNW5MSG82emR1M2F0VFZ2dnZsbXFvTzM1aXdFdGRxMmRvamhwOER2S0JVTXRGcXRYZWdwVmo4akl5UFJ1SEZqcU5YM1BpRnlWMkNpVnFzUkdocGFib2EwZ3ZsUmptVlpRaXdrY0J6SENnVUYyNmtFMHN2TGEzTnhjWEdRU3FVYTR6cDNYT2F5UjlPeXM3TVhoNGVIbjdYeDFFcHRId1JCbUd4QnpURUVGU1FHeXVYVmJNSE5WOURXRFEwTnZTOVF1MnRnQS9nRWVrVjhiYzdHck1UR1hRSGNPR0VxUWN5M2tRRElWcTFhTFRseDRvUy9YQzd2NXpxRlhQWVVoM3JRNi9YSXlEQ0FZUmdZalk4R1EzTnBhZW5QNzc3N3JtMi9XcmtRbE9NNENkUTRqbU1GUmx5T1pWbU9ZUmc3dmo4eHNoTWZZcFZVb1ZCQXJWWkRMcGZqMHFWTER4YllBQ0E4UE56cHFKV1RhUVJPNkdjVFI2M0VXVkxiRmhEaW4zLytJZmZzMmJPNGZmdjJmaFJGZFhHZDRpNTdHa0V0T1RrWkhBaHBHc0wvRWRndmk4WHk1MDhyVit6S3ljbXhPQUUxMndrRGZteUtJRmdDWVBsMEZLL2VMakIzY0VvbEw4U2kwV2o1bmpWM0QzaDVlOEhmUHdDMWdvTVJYamRjMHRHNFg3dW5iNkFvQ25YcjFrVndjREQ4L2YzaDVlVmxWeWxWS3BXMitUZE9aQUt4VmJZUzNGVXIrQllRYytmT25WTXZYYnEwa09PNFk0L3pDYnBwMHlZb2xjcUtFeFZXSzBhTUdBRS9Qeis0dTdzakxpNU9VbmR5MmROcmVyMGVIQWo0QndROU1tTnhMTXVlUEhUd1lOTEVMeVlVT09UVVNvUkhxUjJvU1hSRUpGZStDbHArdWtEbnBvT0hoNmRFUlZRN05MUmFRTzJlZ1EzZ0ZXM0N3c0lRRkJRRVIyMVNKeXBYb3BxelhRdUlBN2labm5ubW1aUzB0TFFGSE1kZGVWSlA0SEhqeGlFcEtRbnIxNjlIVWxJU2R1L2VqV0hEaHJtdTdLZmNESVpNYUhWdWo4eitjQngzOWR5NWMrdjc5bmtud3dIVWJDdWdKanRRRTNyV1NGS2FCNFZjSnVma3RDaDBySUJLWlQ5bDRPUGpBLytBQUlTRTFMNHY3WVZxQXpZQUNBNE9SbWhvS0FJREF5WCt0a3JBRGJiOWJRSi9tMFFsTGp4TXdjSEJCM0p5Y2hJQVpENXBKMjlSVVJIbXo1K1AyYk5ubzIzYnRtamJ0aTBXTFZxRUZTdFdJQ3NyeTNWMVA4WEdNTXc5ZVdvWHpwL0RxQkhEcTN0M3NtN2V2TG02YStjTzEyRS8yRzRIYkFSQldEaU9zNGlDeHh6SENSeHJGRWVRSklxS2pNak56VUdtd1FBQ3ZOaTBScTJHMldUQ2diLyt3cFl0bS9IbnJwM3c5dmF1OXNiMysvYjc2dFdyaDlxMWEwdmc1dUhoWVNmaFp3TnVZa2dxOXNPeHprSlNBQ1lmSDU5dCtmbjUzd2tMV0tQV3FsVXJUSmt5QlMrLy9ETFVhalVpSWlMd3h4OS9ZTzdjdVFnT0RvYTd1enNHREJnZ3FTMk5HREVDblR0M3R2dU83dDI3WTlDZ1FVNi92MmZQbm1qZXZEa0FJRGs1R1NVbEpXamJ0cTMwZXBzMmJRQUFSNDRjY1YzZFQ3RVZGaGJjMCtmcU4yaUlpVjkrVloyN1VxclhweTl2MDdyVmVaUzFkWlRhaEo2OHQyYlgya0V5SkVteEhNZXg0RGpJWkJUTUpoTlVLalVYRWxJYi9nRUJTRTlQaDFxdGdWcWpRVXJLUDNqbDFWY3hldlFZUkVSRTR2Q2hROVcrbnZmZE8wWVFCQ0lpSXB3cVdqbXJqb290SUFBSUFFNkxDUnpIa1I0ZUh1dU5ScU5HbzlIRTEvUkpOWDM2ZEd6ZXZCa3hNVEVZTkdnUWV2VG9nZTdkdStQQ2hRczRmLzQ4MnJWcmg2NWR1K0tOTjk2NDYrL3UyYk1uY25OekFRQzNiOThHVGROMm5GeHl1UnplM3Q1SVRVMTFYZDB1SzJmWjJkbVkrdlZrWkdVYVFKQWtCZzhlZ3BhdFhrQnFhaXBHalJnT2k4VU1EdzlQTEYveFUxbTY0N05Qa1piR2E1Ym41ZVZCcmRGZzdicjFBSUNyVjY4aVllNGM1QmZrdzh2VEMyUEdqcE5FZWdCZytiS2xpNy80ZlB3cEIxQXJ0UUUzdmxnQVdJUnJsaVVJc0FSSmNBUkhnT000VGlhVGdXVlp6dDNESFFxRkFnUkJRSitlRHJWS0RZcWlvRmFyVWI5QlF3VFZxb1dpSWlNT0hUejRNcm5Fd0FBQUlBQkpSRUZVNkFFYndJOWNoWWVIbHlPakZNdThUZ2JrYmZ2YklJU2s0bVNDQ0c2RVZxdGRXVnhjckZLcFZDTnI4dVRwMGFPSHBJMzR4aHR2WU5teVpaZzZkU3AwT2gxYXRteUpaNTk5RnVmT25ic25ZSHY3N2JlbGZ4Y1hGenN0TENnVUNwaE1KdGRWN0xKeTl2TzZOV2pjdURINnZmOEJybDI3aGdYekU5Q3kxUXNJRGc3R0x4czI0dkxsUzVnNlpiTGRaNmJObUFVQXlNL1BROXpBV0l3Y05Sb0FZRGFiTVhYS1Y1Z3lkVG9DQXdPeDQ0L3QrSDdCZkV3U0JJYnk4L04rK09MejhZZWRoSjRsZDhpcmNTekRpRlJsa010cFVad0ZSVVZGTUFwc3hrb1ZINzFwdEZyNCt2cGkrN2F0eU0vUFIxNWUzcU1KYkFDdmNHVkxJVzdidEd2anNkbjJ0VW5neHBhcDZqSUMwRW5nOXRaYmJ5MVp2MzQ5clZRcWEwekd6M2I2UXFGUVNQbEQwV2lhcmhiZ1VhbFVNSnZONVo0M21Vd1BSWi9TWlkrK1JiZG9pWVM1Y3dBUWFOR2lKV1ovTTZkS24yTlpGbDlPbW9odXI3eUdGaTFhQWdDdVg3K0cxTlJiaUIvTDk4S3pIQXVOb0YxUVdGaTQ3SjFlYisxSCtha0MreERVUmtKUEZEdG1HSWFUeStVYzc1eUFvMm1lTERYVFlJQkdvMFYwZEF2OC9mZFJ1THQ3UUtWVWdtVlpyUGh4T1hyMWVoc05uM2tHNDhlTmZYU0JEUURDd3NMc3RCRWNweEZzaUNoaDQ2MXhBdmlKa3drUW12MUFFQVN4WmNzV1l0cTBhVXZpNCtObENvVWlyaVpPSHBrVEh2cUsxS1NjUFcreFdLcTBuZURnWUpTV2xpSXZMdzhlSGg3U1o3T3pzNnZNNWU2eXB3ellvbHNnY2Y1Q0hEdCtEQ3RYTEFkTjAvaHk4dGQzL056U0pZdWdWQ3JScCs5N2R1ZHBRRUNBWGRnS0FFYWpjY1dFK0hGN1UxTCtjZXhUY3dRMU96WmNvZG1lb3hVS2pwYkxZYlpZUUpFa2FJVUNGRVhCMTljWGRlclVoYnU3QndpQ1FHQlFJSFJhSFJpckZSTStuNGp3OEhCY3ZQaXZkQzA4c3NBR0FQWHIxeStuUmVvWWpqcDRiU0s5RVd4eWJveVFneU1JZ2lDKyt1cXJQRjlmM3lVREJ3NGtGUXJGd0lkNW90RTBYYzUxdm5UcFVwVTRvNktpb3FCU3FYRGd3QUc4K3VxckFJQ0RCdytDSkVtMGF0WEtkUlc3ckp4Tm16b0YwUzFhb24zN0RtZ1IzUUp2OXV3QmxtVXI3ZmM2ZVBBQTl1L2JoNFdMbHRqZGlDTWlJbEJRVUlDLzl1L0RpMjFmd3RXclYzSHE1SW1menA0OXUyZmp4ZzBsTnA1YWljUERSQkNFV2NpcDJiSGhNaXpMeVNnWlpESTVTa3BLT0hjdmJ5aVZTdWgwYmxBbytQK1hta3I1SnR4YXdRZ0xEVU5BWUNBVU5NM3Y2NEVEYU5LMDZhTVBiQVJCb0g3OStoS3dPWHBzRE1QWWVteTI0QVpoRkFOQ3ZzM3VPNGNORzVaTjAvU1NmdjM2NFdHQ1c4dVdMVEY3OW13c1c3WU16WnMzeDZKRmk1Q2VubDdoKzlldFc0ZmMzRndNSGp3WUdvMEdzYkd4R0RwMEtIUTZIV2lhUmx4Y0hQcjM3dzh2THkvWFZleXljdGFuejN1WVBYc0cxcTFaRFpabE1lcVRUMEdTcEYzeElEOC9IMi8xZkFQTm5uOGVZOGVOUitLODcxQmFXb29oZ3orVXZpZHh3US9RNlhTWU5tTVd2dnYyRy95dzhIdlFOUDJUaDZmbm54dlcvMUlFKzBLQmJRT3V5WEVPVk9wWG95Z1FESU9Ta21LVWxwWndhclVhbmw1ZVVLbFVxRmUvUG03ZXVJR2pSdzlEcDlPaDE5dnZJaVE0QlBYcTEwZjgrTTh4ZWZJa1dNd1doSVNFWU16WStFY2YyTVJjVXIxNjlld3FwTGE1TmlHdlZxNllBUHRLcVMyNEVRUkJFSEZ4Y1prbWsyblJ3SUVEV2FWU0dmY3dUclRYWDM4ZEkwZU94T2pSbzhHeUxQcjE2NGNCQXdhZ3ROUjVaOHFHRFJ0dzQ4WU5EQjQ4R0FBd2UvWnNXSzFXZE8vZUhTUkpvbWZQbnBnN2Q2N3JDbmFaVXd1cFhSdHo1ODEzbXRiNFpjTkc1emZUWDM2dDhQc2FOR2lJaFl1V3dHZzBycGcxYzhhZVpVc1hWd1Jxa3FjbWdocEprZ3hRUmhvcG95aE9ybFNDcGhVYzMzd3JpTEtvTlhCemQwZGtaQ1Q4L1B3UUZGUUxZWFhxb0c1NE9KUktKWjU3cmpGK1dMUzBSdGZ0anBvSDkyTVpHUms0ZCs0Y3JseTVndFRVVk9qMWVtUm5aNWZUU3hCQ1YwSUFRRUpnNFNVNGppTnROQlBrSE1jcEFDZ25USmpnSGg4Zkg2dFNxWWE0VG4wK1VYemo1bi9JeWNrQnd6QW9MWGs2UjdTVUtoVW9pb0tYcHpmQ3dtcFhHcTV4SENlc1dUYXMxcHBiTTZWS0JabE1CbTh2YjRTRlZVd1J0bi8vZm9SSE5uZ2c2MVJZV0xoc1F2eTR2VGJocHpOUXMyWHNzSWlNSFdKelBVWEpPSUhlbXdjMXBiMjRzYWRubWNwVWFGZ1k2dGR2QUY5ZjN3ZDJMdFFvQjVxL3YzKzU0WGduRlZMWTVObWtTcWx3d2RyMnVJbUZCVXlaTWdVblQ1NzhZY09HRFdhMVduM1ByU0FkT25UQW4zLysrY2hjbUhxOUh2NytkemY2YkRLWmNlYk1HVkF5R1hSdTdpNzV2U0lqY3ZOeWtYVXlFMDJiTklWWW9YTUV0Uk1uVG9La0tHaDFOYjltUlVWR1pPZmtJRE1yRTlGQ3MzWkZkcnVHK3hrTENncCtHRHBrOFA1TGx5NmFLd00xbEZWQUpUMVFnVGhXVUpvaUlJeE9TYXdkSkNWUWYxTVU1RElaeFBsUXRWSUZzOGxVNDcvdGdRRWJ3SXZCaU9CV1dYVlVySkFLdld5YzFXb1Z3WTJ4RFV0RmNOdStmVHMwR3MzU3dzTENVcTFXT3hLQThtNzNiZGV1WFkvOWhaeXVUd2NsazhFL0lBZ3VBelFhTFRRYUxUTDBhVWhMVDBPWUV5TFY2emR1Z3FTb0I3Wm10dnQwOCtaL0NLMUVocStXVFp0Uk5WdHBkbmIyNGxZdG14OUdlZmJiaWp3MUt3aUNJUUNHRUR3MUdVVnhNcG5ncVlsRDdXbzF0Qm9OZEhha2tZR29YVHNVa1pHUkNBMExlK0Rud1FOaHJRMFBENjlJWUZrQ09KdTdxWlJyczFxdDRtdE93UTBBZERyZHF0emMzR0lQRDQvaEFIeWZ0Z3M1T3lzYldqZDNGNkk1bUZibmhxeXNiS2ZBbHBPVEE5MURXRE90emcxWjJWbVZBbHNOV1paZW43NDgrdm1vVTdDZi9YVDAwdXhCRFFLb0VTUkhFaVJIa1FKYkIyMURHQ25NZjJvRnZRSStCUFZEclZwOFh1MWhnTm9EQXpZK2FkbkFLYkE1ZW0yaTV5YUNHOEFQQ0ZjQ2JweW5wK2ZHakl5TUlsOWYzNDhJZ29oNFdpNWVqcnYzNGVtbndYUEx6OHR4K3RyRFdqT05Sb3Y4M0p4NytpeVJuQWxpZmpKdzVlNjY5RGx3VjIrYXNsYTMvbS95K1R0NGFxWnlvRVlJb0VZU0FndXVESEk1elNsb2thbERBRFdKQmRjTGJqb2RMT1pTNU9WbUl6TkRnOHlNTktmckVGWW5IRzd1N284L3NBRkFvMGFOeW9GYkJjQW1nWnVZY0tzSTNNUy8vZjM5LzdoKy9YcEI3ZHExNDBpU2pLNStFT0haVFEwR0E2d01BMk5oOWJDYmFyVTZ5T1F5K0FtMHlIZDFzaE5BU1ltTHk2MGlLNm1BNSs1aEZsZnUrWGdsSmdOWDd3N1VXSEFuejVYY1d0ODVkZloxbEovOXRHL3BzTXVwbFFjMW1RQnF0SUwzMUJ5TEJhTElzZFZpZ29lSFI2WEs3VVZGUnR5NGZoV05telo3TW9DTklBZzBhdFNvUXEvTkdaalllSEJPd1UzNFhvN2pPSzVPblRxSGs1T1Q4NTU3N3JrQkZFVjFyazVRUzA1T0JnZ1NHcTJPWnpldFJtM2pvaUlqMHZVWlNFOVByM1lsK0YwN2QyRDVzcVV3R0RJUUZCU0VsYXZXNHZMbFM0anRYOGJDUGpaK0FycDI3ZVpDd2tmWWlMc0VOUXZIL0htdzhHSlNuNHlGR1RiaHArUHNaNGtBYXVaeU9UVTdVSk9ERmdTT2xRcEJMay9qV0FIMVEyQlFFSXdGZVpXQ211MDUvMFNFb3FMSjVYSUozTzdnc2RubTJ5b0NOM0h3bGhORDA2aW9xSE1iTjI2YzFhMWJ0MHlhcHZ0V3h6N3I5WHFBSU9Iblh6Tml5V0p5MmFCUFEzcDZlclZ4VTZXbHBXSEc5S240Y3ZMWGlJNXVnWUlDbmhvbklpSVN1M2J2QXdBTWpIMi94bzcxc3FWTDhIcjNIblpzSnVKK3paM3pEVkpTL2dGTjAyamZvUk1HZnpRRUZFVUJBRkpUVTVFd2R3NVN6cVpBb1ZDZ1k4ZE8rREJ1c1BSNlRkaWR0dmxpekF1UXkrVWdDQkpoWVdIb0h6c0FyVnZIUEpxZUttditlVTMyb1YxZjVQMVdVQW1vbGZQVUJBTFlDa0NONzFWVHFrUVJGbDBacVBueGJSMWhvV0hJejh1dTBlTlVWU01meGthVlNpVWFOV3FFOFBCd0JBY0hTMExNdGx4dVlyT2ZRcUdReEZWbE1obG5JOFRNMkhLNUNUbUNVZ0FsYjd6eHh1MG1UWnA4YXpRYXZ4RmV2eTh6R0RLaDBlcHFmRjAwT2pjWURJWnErNzZMLzE2QWo0OFBXcmVPQVUzVDhQSHhrVHhuUVFxdHdwblk2ckFmbHk5RlRrNTJ1ZWNuVFp5QVdzSEIrTzMzTFZpMGVCbU9Iam1NcEtSTmZQakVzaGc3WmpUcTFXK0FUYjl2UVVMQ0F1emZ0eGUvYmZ5MXh2YXpxdHRNWExBUW03ZHVSLy9ZQVpnOWN6bzIvcnJob1Z5MDNqOTJoOXZvLzBsL2V5VjBoYkpUQkFCWWM2MUYzN2UrTnZIM0wvSit5M2ZJcFJVTGo3THFweTJvZ1dCZ1UvMmtLRms1VUFNSFpHWm1vcmk0V01xcCtmcjZJaWd3Q0tHaFlhaFh2ejVvWVZSS1BNK2FOV3VHamgwN29uMzc5Z2dLdXJzcTlJb2ZsNlAzTzczd2RxK2UyTHBsYzVrM2FyRmc5cXdaNk5mM1hmVHYxeGNIRHg1NCtCNWJtWmVpUWFOR2pad054WmNMUzBXeFZkaFVTNFVUMG5GQ2dSUEQwbi8vL1pmVjZYUXJNekl5OUw2K3ZvTUlncmhuVVdZclkzMGd5V2FOUmd0andmMVR1Sncrbll4SlgweUEyV3hHY1hFeHVyL0doNWs5M3VpSmZ1LzNyOUozSEQxeUdJa0o4NkRYcHlNME5BeWpQdmtValo1OVZucDkvNzY5V0xac0NUSU5CdmdIQkNBdWJqQmF2Y0JmYk1PR2ZvUmIvL0ZDdHlNL0hnNlpqRUp3Y0FnU0Z5d0V5N0pvMjdZZHVyM3lDaFFLQmZ6OC9kRThPaHFYTGw0RXdGY3NQYjI4MEx0UEg5QTBqZUNRRUxTT2FZTi8vNzFRWSt0K045dFVxVlJvM1RvRzh2Z0ptUGpGQkhUcTNPV2hNTE5vK2pTR2NWa3kySndTSVp6aHJ2MW56bHJ6d3MydnpzSmVUY29abjVvUWZoSldnQk5CamVVZEJ0S21VQ0RuYUtGUWtKK2ZEMFpRbXFKcEdsNWVaWjVhYUJnUGFvNlNlWFhxMUFGRlVkaTVjeWNVQ2dWZWZ2bGxaR1ptMnBGR09NNjlpbitucFB6RG4yUExWOEJrTWlFdWJnQ2ltajJQb0tBZ2JOKzJGYVdscFZqeDB4cms1T1JnMElleGFOeTRpVVF0bnA2ZS9uQThOdEYwT3AxVHo4M1QweE02bmM0WnhiaWRNSXlvbitEZ3Vaa0Z6NjBVUUxHL3YvOGYvLzc3N3lTR1lmYmU2MzVXVjZHZ1N0c3kzbi91b1duVEtHeEsyb3FQUjR4Q3JWckIySlMwRlp1U3RsWVoxSzVldVlMUEo4Umo4SkNoMkxwOUo5NThxeGRHalJ3T1EwWUdBT0RtelJ1WU12bExmUFpaUExaczI0RlhYMzBkNDhlUGswUnBFaElYWUZQU1ZnREFuTG56c0NscEt4SVhMT1JEQkpKRTd6NTk0ZUhoQ1lDbjBqbDg2QkJhdHVSSkFIeDhmSkNRdUFCS3BVbzYwVThuSjZOeDR5WTF0dWIzc3Mzb0ZpMWh0bGdrUUg3UVpqbHJnUGJENS9rYkwydmQvL2Z0Yy9OZnVQbFZDdXdaYjRzZEhxVUUvekFEaEFVRXlrQ056K3h3VnF1Rms4bDVDdis4dkh6STVES29WQ3JVQ2F1RHFHYlB3OHZiRzFxdEZyNitmcnluRmhhRyt2WHFRNnZWT2wzWHRMUTB5VmxoV1JhZW5wNTI3MW02WkJIV3JGNEZBRWhKK1FjZkR4OEtBTGh5K1JLYVJrVkJvVlRDemQwZEw3endQNXc0enVzOG5UbHpHbTNhdkNpY1R3VGtjaHFYTHBVZGgxa3pwejljWUFNQWQzZDNDZHhDUWtMc3dPME9GT08yWVNrcmhLYmluVW9FdHhJQXhjODg4OHlwbjMvK2VVcHBhZWx5VnhyNnpyWmxTeExhdnRRT3JWdkhRS0ZRb0hPWHJtalFzQ0YyN3R6QmgwTGVQbGkyZktVa2xmYnFhNi9EWWpiajFxMy9xcnlOYzJmUG9tUDdkdWpYdHpjYU5HeUlGOXUrNVBSOUM3K2ZENVZhamE3ZFhubGd2NzhxMnlRSUFsNmVYakRXY0JLOHdodmd5ak5RZFk1QWlTZTFPdUhYNVN1Ny9UYm1sZ09vT1FKYkNRR1VBb1NaZjhCS0NLcFNKTUNSSURpYXBqbVNKRkZTWE13VkZCVEEzY01kT3EyT24vMTBjNE83dXp0VUtoWGMzTno0bkpvQWFyb0tSRmhvbWdiRE1QRDI5a1pNVEF4WWxwWDREa1Y3NTkwKzJMdDNEeExtZllmSlgwN0MwR0c4ZmtQZDhBaWNQSEVjUnFNUkJRVUZPSGZ1ckhUVHo4L1BoMUtweE5tektmaHN6R2pRQ2hyNStma0FnS1RmTnlFOFBPTGhoYUsyNXVIaGdVYU5HbFY2RW9uL0Z4NGNRUkNFeFdMaGJPc01MTXR5dHYxdFlsZ0tnT3ZkdTNjYWdJVHM3T3diWGw1ZWd3RGNjNGIrd29YemlCc1lpMlhMVnlJaU1oSkxseXpHNXFSTmtwZFNrWDAzNXhzY1BuUUlPVGs1bURqcFM3UjVzZTBqQ1d4NnZSNFJFWkYyejlXdUhRYTlubWN4MFdxMStIUFhUa3laOGlXTWhVYTdNS0txMXVqWlo3SHp6NzFJVDAvSEY1K1B4N0tsU3pCZzRJZDI3MW01NGtmOC9mZFJKQ1FzY01xWlZ4TlcxVzF5SEllYzNCeG9IMUlQSVZka1NiODhmL2VxaHNlR25NSXhpZnhSQkRaVEJhR25CZUJFcFhhR0FNRUp3QVlLQkNlWHk2RlVxcmk4dkZ4UWxBd0IvZ0ZDOVZNSE56YzNlSGw1UWEvWHdOUExTd2cvRzl5eEYwME1SdzhkT29TbVR1aUp0Rm90QmczNkNDTkhETU03Ny9aRy9mcjh2R3lUSmszUnNWTVhEQnM2R081dTdsQ3IxRkNwVmRMbk5tOU9Ra2xKQ2FaTm40VjUzMzBMQU1qSTBHTnowdTlJblAvOW93RnNBT0RwNldrSGJqWWdWZzdZeEdPTHNpWmV3bWF1VkFRNmFhNE5BQ3VTNG5sN2UyODZmLzc4alhyMTZ2V2pLT3JsZTkxZnVWeU92LzdhajRqSVNCdytWRFhPOWhFalA4R0lrWjlnbk1CZytxaWF2NzgvOUE1VVRMZHZweUlxaW05Rk9mRFhmcXhlOVJQbWZEY1B3UUlQM1lzeEx6aTlJVG1DbmFtMEZOdTNiME9YTGwyaFVDb1JHQmlJOXUwN2xFc0FiMWovQzNidDNJRzVDZk5ydEpIelhyZDUvUGd4MEhJNTZ0V3YvOENQajVXeDd2dGJmMzV6dHgvalUxR0pPcnQ5Z1lDUWV0UUFnaVVKZ2lWQWNDVEhnZ0xKeVVCQ0pwTnorZmw1Y0hOM0IyTzF3bURJd0xQUE5TNmJLUER6aFZ2cUxmajYrcUYrL2YvZjNwbkhSMVhlKy8vem5HWDJ5YjRNeVlTRWtJUmN0dUNsd3JWaVhTNHVWRnNwdUsrWHFxMC8vZlc2SWxhOXJiVjFCWmNxeXExNlJhdTFldVVWYmRVZjlkNjZ3cjBnb2xHSkNZUWtKQ1FrSVNHUVpTYVptYk04dnovT2VVNmVPWmxKUUFGSnpQTjZIZVprTXBNWnpweDVuODkzTDBmcUtNZUlOWnY5N0xQUEFCanppTzJkcUJzYUd2REEvZmZpbnQvZWk3WFBQWXZKaFVVNDIxVEtsMTUyT1M2OXpFaHN1T2JxbjJMcTFCTEx5bk83M2JqbnQvZENFQVJFbzFHa3BxYmlyVGZmUkgrb0g5ZisvSnB2M3hTMXcyM216SmtvS1NsQlFVRkIzRmkvMU5SVXkrZm1kcnVaYVVyWjNGS2JXY3I4Ym9yTk5CMWdwdW1xVmF2dUhoZ1llUExydnRkL21ENERIMys4Q1hWMU94RGcwak0rM3J3Sks1YmZZdjM4NkNPcnZyWG8yWWhmRHJPN01RQlFYYmZhU2dIQTJlZjhDQjkrK0Q2MmJQa1lxcXJpdmZmZXhWZlYyM0RHbVdjQ01BYU1FQUlJb29qZTNoN0xSMEwxK0tEUHBMdzhiTjYwQ1lxaW9NdU05anFjVHJ6NHh4Znd5aXN2UTFFVTlQUWN3SVlOSDJIMjdObERwdkNiZjhVYnIxZmlzY2RYSDdVK2RRZjdtdEZvRkI5djNvUUg3cjhYUDcvMnVxTWVPT2pUQnArOS9mSGZyVDM3YjNlTVpub09BSWlZMDZSaUFCUkN6SUhHRkxvZ2lWUWtBcFVnVUJrQ0hFU2toQUIrZndyeTg0T1lWdjRQY0xuY2NMdmN5TWpJUkU1T0R2THo4cEdlbG82OHZMeFJvUVlZRVZRbVJCd09COUxTMG9ZMWFmMTA2eWU0L1pkMzRwUlRUOE1qanoyQm1xK3E0NEtIaXFMZ3BSZi9DRUtBV2JObVd6NWsxUXhrOVBRY1FFTkRBOHBLeTNEVjFkZmdsVmZYWWUwTEx4NDdpbzAzUzJmT25EbE1zWTJ3VVdJc0VFS3NOdU9ta3FOY2dxL09lclFEMEcrLy9YYjk5dHR2LzQrV2xwYTYvUHo4ZnlHRUhIY283OU1oeS9CNlBIanhqeTlnd1VrbjRhdnFiV1BHaDJaUDBIM3dnZnZ3NEFQMzRmUXp6c1MvL2VwdWxKYVc0ZGUvK1MzV1BMVWFIZTN0bUZ4WWlJZFdQV0pOTTFyMHc3TlJYYjBOVnkyN0FxSW80ZHpGUDBGcGFSbjIyOHFGYnI3NVZxeGErWkJ4Slo0OEdjOCs5d0ljRGdjZWZHZ1ZWai94ZTd6NnlwOGh5ekpPUHVWVVhQa3ZQd1ZnNUNtdWZPZ0JTSktFaXk4OEw5NU1mT2xsQkFLSFA1ZndZRi96RjlkZkIwS0F3c0lpM0hMcmJVYzFqMDBIL2J3aHNyZnlsSmI3NnRBNGxPSmtVMnJXTGNGUUh6VUFSaVVCaUE1UUtnQlVwSVJLZ2dCUkEyUWlVaWNrT05QU2gyby9mVDRVRkJRTTVhbVpnWUlkTzdZUGkzNG1XMDFOVFVoTFM4UENoUXNCQUo5Ly92bXdtUjhYWERnMDdDZ3pNeFBMYnh1YWY3Qng0d1k4L3RnanFLZzREZzg4dU1xQzVLSWZubzI2dWpvc3U5SlFjNys0NGNaaENsczZGcjk0cWFtcG1EVnJsdFVPaFJCaTNmTDczSDBXM0FCUXJxcEI1M3h3aVV4VHJhQ2c0TVBYWG51dDdweHp6cm5BNVhJdE85ajNxS2dxVHZ2bmhmajlZNC9naGh0dnhoL1dQSFhNSGNjenoxcUVNODlhTk96KzB0SXlmTFJ4NURtbUo1NjRJT2tYMStsMDRxNS8rM1hjZmRmOGJIamZ6M256L3lsaE04U1MwbEk4OXZqcWhIOWJGRVY4dU9GL2orcHhPcGpYSE8xNGZkUGw5eWZQa3h3SWgvLzAycjRQMzcvclFHVWZaM3JHRWdITjlLY3BBRFdnUmcyZ0VRcWRnRklDUWtVUUtpb2FKQUF5a1F5b1FZYmI0ekdTYi8xRFByWHM3QndqcGNQTVUvdmU5dzYrV3RHcTJQbWFhOEdDazdCZ3dVbkQ3cGNrQ2JmY3VuekU1eDZUWUdNZk5BODMrNVlBY0JiY0ZFV2hab1VDSDFTZ1hLVUNVMjhhQU8zODg4OXZCZkJrYTJ2cmwzbDVlVmNTUWtadHdxNXJHcjUvNGdJME5UWEZSWG9FVVlSK0JKdDNUcXp4dVVSUlJEZ2Npc3VYMUhYOWkxMjdkbFdlOG9NVGQ0QkxaeG9CYWpFeXBOSllkdzZkQUdhUWdFQUVvUklFeUJBc3FMa2d3K1gwd09QendlZnpXVDYxbkJ5alRLcW9NSEdlV3FMbDhYZ3hNQkErcU1jZHlTVWR5eCsyMSt2RjdObXpJWXFpdFkwQ09tb3FPQll4dFFjVm1HMnEyMDFUQUZvd0dQeGc3ZHExWDExd3dRWG5lVHllbjQzMi9qSXlNdkIvZi9HdjZPZnkzUEx6ZzlqZDNJUllMQWFxNjZpdHJVRmhZZEVSTzBadXQyZUNDb2Q0Ykw3Tlk1YnN0WE55Y3REUnNkY0NXeWpVLy93ZlgzaitvL3Z2dXpka1UybDg1SlBmZUtpWlppZDBFMmpVaUh3S1ZBS0JURVRxZ0FnSFpMaUlETGZEQTA5SkRueG1TZ2VER3QvOTFwNm1rV3hOS1M3QnJzYjZFZUhtOFhneHBiamt1d3Myd0NpL3NzUE5EcmtFSmlwVGIvWXFCY3I1M3BocHFwdW1xUVpBWGJac21iWnMyYkpuNnVycVBpMHVMcjVFRk1WRHlzbkl5OHZEcWFmOU15Ni85Q0trcEtSYVpVeEFmTHJIVjlYYjhNVGp2OGY5RHp5RXFTVmYvME5PZEtXZldFRFlITktiYUFuZjBqRUxoL29oSmtraG1UUnBFdHJiMjlIUjFycGhkMHZyMjB1WExHNUtvdEo0bnhvTGpNV0dWSm94UmNxNGNCczFuNElnVWtrU0lVbG1odzZIREFkckVtbk9LR0Q5MUN6ek16L2Z5Rk9iVm41SXFUWXBxYW1vT0c3dXQvNzVIOUdaQjRkelVVcXQrUWt0TFMzbzZPaEFWMWNYZW5wNjBOdmJpM0E0akhBNGpFZ2t3by8vSTl6Z1pxTHJPcHVsUUFDd2VRcWlDWGlaVXVvQTRBRGdCT0FzS1NseGJkbXk1VWVOdTNaZG1SczRPb00vOTNic3dkeEQ2UERSMU5TTTd2MzdKenJvRGp1T2Jjakt5a1JoZ2s0VFRjM042TzQrK3Nkc2IwY2JNak16VVpTZzBTU2xkRTluWitkL3pwa3o1NU9Pamc3RkJyVm9Jb1VHSzlwSlZCaU5JVFRURXFGc015dDBJRWtTSk1tYVV3QW5CemFQeHdPLzM0KzB0RFJrWkdRZ056Y1grZm41bURKbHloR3RKZjVPS3phTHdJUmc1c3laN0FNYXB0enN0K1kyTEdKS0NLRW0zTUFyTjJhYXdwaEdyd0ZRNit2cjFZeU1qTW9ubjN6eWt3VS9PR1Z4UmtibWxVZjZpaTdMOGlFOXA3QndNcnE2T3JHM293MCtmOHJFeklOUVAwS2hmbWlxbWhCcUFGQlVXSWpPenFOM3pOaDcwalV0SWRUQzRmRExiN3p4eGtlWFhYYlpnVkZVV3BSVGFOWkVkbE9sYVNiTWRBNW1Sc2RiMmRiSzI4MzFValBiZVdkblp5TVFDR0R5NU1rb0tTbEJlWG41bUQ0UHhveGk0MWREUXdQcTYrdlIzTnlNOXZaMjdOdTNEL3YzNzBkZlh4OUNvUkRDNFRBR0J3Y3Q1V2JPWENEY0dFQmV2UW1tZWhOTTBFc0FKRTY5V1FydS9RODJWRXdwTGw0cWl1S1pSK0wvMWJtM0haTUN1WWZjdG9oU2lsMU56ZGkvdnh1YXFpTVMrVzQybjNTN1BSQkVFVm1aV1Nnc0xCaFZiVFEzNzBiWHZuM1FWTzJJSFRPMzJ3TlJraElxTlVWUi9ydXFxdXEvNXMrZjM4SUJMUm5VRXBtZDZwRFphUUhObUUxZ0FzMG9aSTlYYUY2djE0SmFSa1lHc3JLeU1HblNKQlFXRnFLa3BBUlRwMDRkOCtmQ21BUWJBTFMwdEdEbnpwMFczRG83TzNIZ3dBSDA5dmFpdjc4ZkF3TUQvR2kvWVhEVE5JMll3NXZabUQ4R04yYWVzcEYvTWc4M0FNNVBQcTFha0pPVGUvN2g2dFE3RUE0aDFOOEhnQjcyUnBNVDY5aGJ1cTV2Yld4c2ZMdTB0TFRXVkZ4MmxSWkxvTktVQkNwTjV6WnFXakJKb2VZeDB6bjgxbnlDZENQeWFVS3R0TFFVQldZbHlWaGYwbGg5NHdVRkJUQ3JEbUFXeFZ1M2ljeFYwMFNsZ2lBUVFSQ2dLQW9saExDR2wvYkFnaFVwSllRdzA5UTZBWStmZTl6N0pTVWxteDUrK09FelVsSlN6aWVFZkczZDd2ZjdJVWtTOHZJbUlSQUlUSHpyeC9HaWxPNW9iMi8vNjhLRkM2dHFhMnNaek95K3RKak5oOFpEelJZY3NJWVhVMUVVcVNpSzF2ZEJsbVhLZXU0eHFIbTlYZ3RxUnBEQWJEdFVXSWl5c3JKREh2MDRBYllqdEhKemM4R2FVUEtBU3dRMXp2ZkdaaUVTUlZGQUNHRUp2WlFPRFRYVmJXa2hHZ0RWbkcrcW1QNDM1ZHh6ejMzcmpqdnUrUERXVzI4OVBTMHQ3WHhDU1BIRTEzZGlKUURhcnE2dXJyL2VmZmZkVzllc1dSUGxUTWxZQXRPVDNTcDJzNU9kaTh5WHhpYXkyMVdhTE1zVzBPeFFZd0VDbHM1UlZGU0Vzckt5WWUyRXhyd3AydFRVTk9iL0U1RklCSTJOalZhMGROKytmVmEwTkJRS1lXQmdBSU9EZzRoR281WlphaGJvRWxZenljeFNMbXBLYkthcFNDbVZtSW5LK2Q4Y0FKeTMzSEpMeWhWWFhMRXdKU1ZsNlRkcGFqbXh4aFhRR3ZmdjMvL21talZyUG4zMjJXY2pIS0NVSkVDTGNiQ3pSenVaVXJPaW5jejg1S3dVcTlzMFUydDhvQ0ExTlJWcGFXbm0zTThBQ2dvS1VGeGNESmZMTmU2Ty9aajFzU1U0aWJCanh3NDBOalppejU0OTJMdDNyd1U0RmxSZ2dPUDlic3ozeGdHT21GMTlDZk8vSVQ0MVJJUVJYRWdFT01meTVjdjlLMWFzT0RVakkrTmNRc2lNaWEvM2Q5S0hWdFBaMmZtM1gvM3FWMVhQUFBOTWRBU2cyVGZGTkR0VkRtWWFiM2JhVlpxcDFPS0FsaWp5eVlER1VqbUtpNHN4YmRxME1adk84WjBCRzF0TlRVMW9iR3hFYTJ1cnBkNE9IRGlBdnI2K3BFR0ZCSUdGdU1ncFUyOE1jaGpLZlVzS3VPTGlZc2ZHalJ0UHlzM05QVnNRaEJNbXZ1N2pmMm1hdHJtbHBlWGRrMDQ2cWJxMXRaWEJpUWVhY2hCQVk4K3pBZ01BS0IveFpDcU5EeEFrQ3hLa3hFMW5EeUFZREtLNHVCaEYzOUlnNHdrZjI5ZGNSVVZGZkZ1ak9CL2NLQUVHZGlWazZvMXFtbWJsdmNITWRUUFZXMXh3d2VaL2l3RndORFkyT3ZMeTh0NEY4RkZkWGQyY29xS2loYklzLzNqaTZ6LytWalFhZld2Nzl1My9NMmZPbkYwY3pIaVZGa3NBTlNVSjBQamdRRnlTTGEvU2VMUFQ0WEFNODZjeDA1TlA1eWdvS01EVXFWUEhWWkRnT3dNMndBZ3E4SDNiWEM0WCtKUEFEcmRJSkdJQkxoYUxXWkZUQmpjdXVFRDRrWCtzUXdpTWZDSVZnR0lxT0F0d0FCeGxaV1ZiQUh6KzdydnZ2anB2M3J3ZitIeStzd0VFSjVBd3BsMGZyZjM5L2UrOC8vNzdueTFldkhoZkVxQWxncG95a2tJekw1aDhsQjRzcHNXdGtKVHlBQUFUVGtsRVFWVG1CdWk2VG5WZGg2WnBWbDh5UlZHc0JIV202QndPQjhMaE1OeHVOL3I3KzlIYjI0dnQyN2RqKy9idGgrVVkrUDBwRUVYQlNobVpNRVdQb3QrdHJxNE96YzNOYUd0cnc5NjllN0YvLy80Ui9XNW1LVmJDNEFLWDFBdlROR1dsV1hGQkJwdUp5cHVxTWdESEpaZGM0bHE1Y3VYOG5KeWMweVJKT20wQ0UyTm5xYXI2Zmt0THkvL2NkTk5OdFgvNXkxK1Vnd1Nha2dCbzlxQUFnNWxPaUFDanhsT2dnaWhDRWtXSXJDUktraUU3WkRoa0I0eXA3S1pTYzd2aDhYcmg5L21Sa21xTXhzdkt5a0p1SUlCZzBBZ1NIQWwvV3BqTHdaeDdET1Znaml1d1hYVFJSWGoxMVZkeC9mWFhZL1hxb1g1ZnJhMnRhR3Bxd2cwMzNJRFBQdnNNNTU1N0xnb0tDcEw2M2JpRVhwaCt0NUdDQzJRVXdFbEpBQ2NEa0JjdFdsU3dkdTNhK1RrNU9RdS9TVDdjeERxaUY4Z2RQVDA5SDN6MDBVZGZMRjY4dUp1RFVpS2dLVW1BcGlZRG10a2prREpmR2hFRWlLWXZUUlFOb0VteVdSb2xPeUE3SEhDYVVITzdYSERINWFnWjZSeFoyZG1tK1RuNXFLaXB6cjN0eUpzVU9HWnlNY2VkS1NyTE10NTQ0dzA4OGNRVDFoVXFHQXhDRUFSVVYxY0RNRHAxQmdLQllUNDRleTVjTEJhREtJcFFGSVZsZFpORTVxbk5COGM2aFFpbWlTcHhKcXBrbnZBVzJOYXZYMThmQ0FTYUFieStiZHUyOHFsVHA1N2dkcnRQQXpCUjFmN3R3cXh0WUdEZ2c1cWFtcXA1OCtidFpqN1Znd0FhdjZtbVF0TVNtWndNYUlJZ1VFcXBtVjlwSk5xS2tnaEpaTFdlRW1UWllTZzFGaVJ3R3BGUHR4bjU5UHVOeUdkR1pnWnlzbk9SbDVlSHlZV0YxcXpOSTcyOFBqLzI3dDA3QWJZanRSWXNXSUFOR3paZ3k1WXRtRDkvdm5YL3hvMGJNV2ZPSEd6ZHV0VXE5alVuemNjQkxod09XMEdHU0NSaUFjNVViOVFlWE5CMW5ROHdKQW95YUFCRTg0b3RVVW9aMk94S1RwNDFhOWJuQUw0QzhQejI3ZHRuRlJZV0h1OXl1VTZaZ056Umc5bmc0T0JIOWZYMVgxUlVWT3ppMVZVU29La0hDYk9FUU9NREE3cXVVMW1XTVV5bHhabWVUcmo0ZEE2dkY3Rm9GRnMvK1FRWFgzSUpNak96a0dPbWN4UVZUWWtiUlB4TlYyMXREZDUrNjAxVVZNekI2V2NNTDVYMmVuMEk5ZmNlTTUvbHVBTmJSa1lHVGozMVZGUldWc2FCYmQyNmRiamdnZ3Z3NmFlZkloZ01vclMwRkI2UEJ6VTFOYWlzckVSUFR3L2NiamZLeTh1Um41K1B3Y0ZCU0pLRW5UdDNZdCsrZmRhZ0UwbVNhR1ptSmtSUkpLRlFDSkZJaElxaUNOYXhGd0FSUmRFQ25LN3JnbWwyaUdia1ZEUlBmR2FtU2dsQUo1V1hsMjhGOERtQXRWOSsrZVcwNHVMaU9SNlA1NFNKM0xqRHUzUmRyd21Id3gvdjJMR2o1dmpqaitlVm1jNkJhU1NncVJ6UTdPWW1pNXpUWkVCajZSdXFxc0xoY0VCa0hUa2swNEpnS3MzaGhOTTEzUFQwcDZSZ3puSEhJUmljYktSekZBU1JrM040bzU1UFBia2FqWTBOR0FpSGg0MWw1TmZSSEN6K25RTWJBQ3hkdWhRUFAvd3dIbnp3UVFEQTRPQWcxcTlmajVVclYyTEZpaFZJVDAvSDdObXpVVmRYaCtlZmZ4NlhYSElKQ2dvS1VGdGJpemZmZkJPeUxDTVlER0wzN3QzbzZ1cENhV2twWkZsR1QwOFA5dXpaZzRHQkFhU21wdEpZTElaSUpFSjBYWWZYNjZXYXBpRVNpVURYZFNwSkV1R2lxTVM4V2dzMk01V3ZhT0EzSG5UUzdObXp2ekNWM0t2cjE2K2ZOSGZ1M09scGFXbHpaRmsrQVVEcUJKNE9hZlVxaXZKeGQzZjNsNXMyYldwWXNtUkpONFlpa2NuVVdTS284UjAyVk50emRVNmhVYjQvR2t1d0ZTd2ZtaEhCRkFTQk9wMHVQajhOc3NNQmdSRHMzcjBibXFwQ2xDVE1ualViK2NFZ0tBWCszOXR2UVJBRXBLZG40SkhISHJlc2tGK3VXSTYydGowQWdKNmVIbmk4WHZ6NWxkY0FHSjF4bnZqOW8ranQ2MFZHZWdadXUvMlgxcEFlQUhqdFAxOUZaZVU2Ni9FQWNQVTFQNFBENGNDcWxRK09tUTk1WElKdDhlTEZ1TzY2NjFCZFhZMlpNMmRpL2ZyMW1ENTlPZ29MQzYzSGVEd2V2UHp5eTdqNDRvdHg3YlhYb3EydERjRmdFS0ZRQ0pzMmJVSkZSUVZ5YzNQaDkvdVJsWldGU0NRQ244K0hmZnYyUWRNMHVOMXVSQ0lSQUtEcDZla1FCTUV5VVZWVmhTaUtiTllDaTZJUzB6UVZ6UHNZNEVUeml5S1pxazYwUVk0SG5iUm8wYUpkQUZvQS9MMmlva0orN3JubmlvdUxpNmY1Zkw3WmtpUjlEOEJFSzEyYmtGQlY5ZE8rdnI3cXVycTZ4cXV1dXFxMXBxWkd0eWt6eldZNkpnTWFEelArT2JyTjNMUVVtcmtoR2RCWXp6UkNDRnd1MXpDVnRxZHREM0t5Y3pCOXhneW9xb3J0dGJXWS8wOG5JRDA5SGQvLy9vbUl4YUo0OVpVL1l4bzMzL1QrQjFjYUJPL3R3Yyt2dVFvMzNYd3JBR1BPNTMyL3V3ZS91KzhCVEpvMENlLzhiVDNXUFBVazd2N05iNjNuVnN5Wk02enpzTVBoR0hNZityak5ZMXV3WUFGZWYvMTF6Snc1RSt2V3JjTjU1NTAzN0hIVjFkWG82dXBDWldVbHVNbFcwSFVkMmRuWmNMbGNhR3hzeE02ZE82MDBFVVZSa0pLU0FxL1hpNEVCbzRlWDMrK0hwbWxVVlZVTURnNFNWVlVoeTdLVmEyUkdVVmsrRWpYSGFRMVRjS2FaYWxVMmNKQkxCRHZwaXkrK2tPYk9uVnNOWUR1QXR3b0xDOFdYWDM1NWNtbHBhWEZxYXVvMFdaWm5Fa0pLdmtzVW81VFd4Mkt4cnc0Y09GQy9mZnYyNXNzdnYzeHZhMnVyYmxObGlkUlpNcFZtL1k0bFk5ditCdTgzaXpNM2VhQnhDZUJ4UUdNS2pSQUN0OGM5bE1aaG1wN0JZQUYyMXUxQVcxc2JTa3BLY01sbGx5RWozWWg2QmdJQlJLTlJ1TjN1UkNZMmZuUDNyM0gyT1QvR3ZIbUdTMmJYcmthMHRyYmdEbk5ndDA1MWVHMURWY3JLcHFHc2JOcVlQdytrOFhxQ0wxMjZGR3ZYcnNWdHQ5Mkd0OTkrRy9mZWUrK3d4NmlxaWx0dXVRVS8vYWt4MDdLOXZkMXFPUzZLSXQ1NDR3Mjg4ODQ3S0M0dXh1VEprekZqeGd4VVZWVkJraVQ0ZkQ1cmlJdlg2N1ZTUTJSWnB0Rm9GRTZuazVqUlUycUxvREt3V1ZQc0thVzZlUitEbkFBalJZQXZ3QmR0Z0J1MjM5emNMSjU0NG9rN0FOUURlQmVBdUdyVkt0L3BwNStlbDUrZlA5bm44MDJSWmJsRUVJUnBNSHJMamVVVjFYVjlSeXdXYStqdjcyL2V2WHYzbm5mZWVXZnZuWGZlT1FndUoyd0VtQ1dEV3R3K3A4eml6RXliT3FNMm9GRytrd3pmWWNZT05MWUJnTmZqalE4UWVEekl5OHZIak9uVGNhQ25CenZyZHFDOXJRMDMzblFMSnVYbElTOHZEenQzMWlVOE9QL3g3Tk53dVZ5NDdQSXJyUHNVUlVFZ0VNRGFGMTRjOXhlNGNRdTJKVXVXNE1ZYmI4VFRUeitOc3JJeVRKa3laZGhqcGsrZmptM2J0cUhFSEtaU1VsS0NaNTU1QmhzM2JzUlZWMTJGVFpzMlllSENoVml3WUlHVjg3WjU4MmE0M1c3NC9YNXJxclhYNjdVaXB3NkhnNWtWbEc5b3FXa2FCRUdncXFxQ1VncFJGQ21sbEpoQkI4S3BPRlo0VHpqSUNTYmtoQVNRRzNILzFsdHZIUVRRRGFDR00zMkZ5c3JLclBMeTh1eXNyS3hjbjgrWEo4dnlKRkVVZzRTUUFnREhTcnVIQ0tXMFJkTzBQYkZZckQwVUNyVjNkbloyMWRUVWRGOTQ0WVVITUpTZHI0OENzMlFLTGVFK0J6UGREak1NRFFDaXlkUlpJcURaaXRhdGpVWGpBY0RuOThlVlJ2bDhQbXpkK2dtbVRTdkhxYWVlQnJmYmpYdC9kdyttbFpmRDUwdnVjZGk0Y1FNKy9PQUQvUHZUejhZbDVaYVVsS0N2cnc4ZmZmZ0JmbkR5S1dob2FFRE5WOVg0MFkvUHRSNnpjMmNkcXF1MzRTYy9XVG9CdG1OeEJZTkJ6SnMzRDNmZGRSZnV2UFBPaEk5WnNXSUZ6anJyTE54OTk5MjQ5TkpMVVZOVGcrWExsK1BtbTIvR2pCa3prSldWaFk2T0R2ajlmaWlLZ3ZmZWV3K1JTQVN5TENNOVBSMzc5eHVUejMwK24xV3h3RTVTdDlzTlZWV3hmLzkrcWlnS2ZENGZKRWtpZzRPRDBEU05NajhHU3hjUkJJRVYyNE1CYmdUSVdZQ3lkUjBaYWVPVGg0VWxTNVlNQU5qRC9WMzJHdVRSUngvMXpabzFLeVVRQ0tTa3BxYW1lRHllRklmRGtTSkpVb29vaWltQ0lQZ0lJVDVDaUpjUTRqWkJ5Qm9Bc05jQ0J3WnJiQnlsZEpCU0dxYVVoblJkRDJtYTFxK3FhbDgwR3UwYkdCam83K25wNld0dmIrLy84c3N2UTh1WEx4L2c0RVZ0SUtNandFeTNLU3h0dEkxMTBVZ0FzamlZOFNBRFM2ZzFwNlR4NWlhRG1hMnRVQnpRV044MHA5TUpTaWxTVTFOdHJidFRjZFpaUDhTNzcvNDNHaHZxNFhRNmNlZGR2NExQNTBOcmF5dHV2dkZmb1NneDlQYjI0b0x6bHVBZjU4N0Y3Yis4RTZzZmZ3eVJTQVRYLzUraENaS3JuL29EL0g0LzduOXdKUjU3NUdIODRkL1h3T1B4NEdiYjRPR3F6ejVEWmVXNk1RKzJjVmQ1b0tvcTFxMWJCd0JZdVhJbGJydnROalEwTktDNDJPZ0JLVWtTWG5ycEpWeDAwVVVBZ0QvOTZVKzQ3Nzc3VUY5ZmowQWdnS3V2dmhwMzNYVVhDQ0hZc21VTHJyNzZhdFRXMXNMajhhQzgzSml2V0ZWVmhXWExscUcydGhaLy8vdmZzWGp4WXF0cVlkZXVYV2h1YmtaRlJRVVVSY0hPblR1aHFpcUN3U0NibG9YdTdtNm0xQ0FJQWp1eENlZUxzeURIOWhOQUxnNTJuSm9URW9Fc3dUNS9tMmpqWDJla0RRbHU3ZnR4YnJBRSsvenRTSnNkWlBZdG1Vb2J0czhHOXlTQzJHZ3dZL3UyeHFVSEJUUmVwZkhOSUh0NmVqQnBVajY4UGkvOGZuTytwMW5BbnBzYlFINSsvaUdOd2ZzMlZzUE83VGo1NUpNbndEWldWbTl2TC9iczJXUDUzK3oxcG14NGpMMlpKVmR6Q200TW9GVzh6TXhVUHNqQXlyVzRzaTMrY3lJMjBNVkJqbElRZ0E2RDNTSCtuQWhzUE9DRUJGQWJDWEFqd2MwT05DU0EyRWdLVFUraTF1eU8vVkVoWm5zOTNtL0dZR2JkY3FhbmZYQTN0WGR0WmpCenVkeElTZkVQYXdMSkZGcDNkemNLSmhkWnpTQXpNak90NG5LL1AyVk1mRStPSmJDTkcxUDBoQk5Pd09iTm04ZGNFSSsveUtTbXBqTHpsSEpkSEFqWDNZRVFRdUpVSEl4eGdjVHcwMEVBQ0VrRUpVb2gyS0JIUmdIYVNIQTdGT1YyS0dBN0ZMTXpHZUNvRFdnakFVeTNBd3dnbEJCUWdJQVFDMlFHekFRQkFqRWhKZ29RK1JJb3RobWxVRU5xVFpZaENBUUNJVkExRGRtcHFjTWFRZnI5ZmhCQ0VBd0dvV2thZkQ0L1VsTlM0ZlY0MGRmYmg3N2V2bVArUk00UEhsdk5hc1lOMkRadDJuVFVYb3NmMk56ZDNSM1h5REljRG8vVXFkZFNib3FpV01yTlZHOThEU3JoRkJ6bGxCeTdwVFpUbGNGRTU5VWRyN0lJQVVrRVBRNlNvNEZNR0FWb3lhQkdFa0I4TkxWR2t5aTNaS0JqY05KSGVnNXo5ck9ac3B6elA1RXFzOEdNUUJEWTdGcUJDc0x3bVJxU0pCbGdrMlRJSnRRY1pxS3QwK0dBcnV1UUpCbVptWmxXNVFCckJDbUtJb3FMcHlMYm5FVXdzU2JBZHRSWFFVRUJjbk56MGRiV1puWHBUV1Nlc280aEl3R08zeGpZUm9NY0J6aG9ta1lKa3hoRFFJdURqVTNoeFVHUFN6MFpCakRUdEIwSlpFZlN4MmI3bVNtcHBNQ2ppWjdQZGM3QXNIMkQ5Z2JRQ0FFQkFSRUlGUWhCbkRvekZCb1ZCUUdDS0VLMFEwMlNJRW5NcDJaQVRYWTQ0SkJsT0V5ejA2Z3FFQ0dLQWdLQmdOV3VteldDbEdVWjAyZk1PT1NCMlJOckFteUhkVGtjRGhRVkZWbUE2K3pzdE5xUTkvVDBvTCsvZjBUL1d6TEFjZjQzcTRNSUR6a3VpZGlDbkdtZUluNjRQYS9jQ0V4QVlRaDJJT3c3bmd4WU5wVTNxaitOc24wNmltSWoxczNCUUc0VTRQRS9HK1lqLzNkc1RuOEFvTHBPSVFnQ0RKNFJhdlkvQTdHVW1jQUZCa1RUN0RSdmVZVW1Nb1hHQWMxVWFQSEJBVGM4SHNPWHBpb0tKaytlYkxYclp0T2lvdEhvaUZBalZWMGdUMVlCOVQySC8yUXVTUU85L2pqUTQ3SW53RFllRjZVVUhSMGQ2T3pzaEtwcGgxVFVHNGxFME4vZmI1bWpiRXZXeUpKdGxBSTZwWkFrQ1U2bmN5VEFRZE0wdnByQmdwd2dpS0JVcDdwT1RjRHBvQlNnb0t6OUtnQkNUUENaMzNlWUlCd09LaTZnUkVhNWpkdTNlSFZ3L1F6cElTcTUrRGVmNEhkY3poWmwrYytpS0ZyUFllYWxwbWtRUldrWXpBaWZnMmI0enl5b2plWkhrMDJ6MCtGd3d1RjB4QUhONHhtYXZENFE3a2RwYVNseWNuSVFDQVRnOVhvUDdnUmJYUVUwOUJ5WkU3KytCK1RKS3RCbno1Z0EyM2lFV2xWVkZVQUVlSDErZUwwKzVINk4xbEtEZzRQbzdPeEVkL2MrOUppVDZmdjYreEFPaFJBT0QyQndjQUNSd1FnaTBRaGlwbm9iR0J4RUpESUlWVkdNcTNwaTh6UnVZNHBOVlZWSWtnUmRwMFNuT3FpdXd3Q2NNUnFWUldWTkFCRFo0WUJ1bXJxTVJ5eTZOOFFuQWs3TklZbDV5WU1TQjJHQ2pnSTJBa0tTQWk0T1dQR1A0MzRtaEplYW9KUmFkWmpzLzBnSU1TcEVIQTdtTzZNTWFoYk1ERC9hY0xOelJLQ3h0a0l1dU53dXVOMGVlTDBlZUgwK3BKanBHMm5wNlFqMzk2S2lvZ0llaitlUXppdHlwS0RHd1czQ0ZCMkhxNk9qQXlBQ2NuSy9XYmRSdDl1TndzSkNCQUs1Nk9yc1F2ZCtNN2pRMjJ1WnB3TURZUXdNR0RDTFJxTndlenlJeFdMbzcrdUZKRWx3dTkwam1xaE10V21hQmtWUklFbnlVSkJoQ0c1RVZZMi80WFE2emNlWS9qaFJoSzRiMWxzMEdqV1VpaWhpeUpaRkhOZ1NwQVF4Zm1Bb2RrRVRYaXlTdGFObWJhRGkxWlQxUEdyL3ZablF6SVBOQWxnQ3B6OElJZEEwRFE2SHd3SWFNeThCd09sd3hxZHFpSUwxR1ZGSzRUTHJORjF1RjBSUndoZWZWMWwvMStQeG9LUzBGSG1abVhIcEczYUY1dmY3a1pLYWl2VDBkR1JtWkNJN0p4dXR1NXNPR1dvVGF3SnNYM3QxZG5iQjYvTWZ0ci9uZExvUUxDaEFZTklrTS9ldDIxSncvZjM5Q0lWREdEQVYzT0JnQk5Gb0JBNVp4dURnQUh3KzM0ZytPSDZMeFdLUVpVZGNBYjhKT0txR0ZCQkM0UGY3VFJWSENhVTZkTXBNVm1vTXJ5RUNaRW5pL1hTY3YyN0lGY1lCei9xSERPME5neDhiTkdLREcxVlYxWUlWcFlDbXFTQ0VRaENNYWd4RlVVQUVBWkpvdkNkVlZhRHJsQnJGNGtNcXpYTDYyemFCR0NhbXBxblU1WElOeXpkajRPS2hGZ3FGRUFxRlVGdzhGUzYzRzNzN090RFd0Z2V6WnMwR1UzM2ZPMzRlMHRMUzBOZlhoK3B0WDhMcGNHTEd6Rmx3bXdyTjQvWEE1L1daTGJvTmhaYVJrWW5zN096RG1seWIrZnhpS05XZDZGdjF2d0NBakNkK2lJRzM2aEI1cHo3cGMvelhIUS9uS1VYWWQ0SFJqc2g3K1d4SVU5TFJlOCtIQi8yNm96V2JQSmJXL3djYUx0Ynd1T0xUcXdBQUFBQkpSVTVFcmtKZ2dnPT0iXSxbInNyYyIsImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBVFlBQUFFMkNBWUFBQURydkw2cEFBQktvbnBVV0hSU1lYY2djSEp2Wm1sc1pTQjBlWEJsSUdWNGFXWUFBSGphcloxdGx1VzRyV1gvYXhSdkNCSy9PUnp4UTJ2MURIcjR2VGNqczF4VnRsLzdyVzZYcXlJejRzYTlFZ2tjbkFNQzBMWC85Ly82cnYvNnIvOTZTbXZoU3JtMjBrdTUrVi9xcVllWFA3VDc1My85L1BlNTAvbnYrVjhzdi83MC9QWDcxeDgvQ0h5TnZ2TG5CL1g5K2ZxOGZELy80eGQrZjhZei92cjlxLzM2U1dpLzN1alhEM2pqbnl2d2svM3ordk5GOHYzdzgvMG4vWHFqdm4vK1VIcXJmNzdVOGV1TjVxOFhua3Y1OVcvNjQ3Sit2dmozNnkvZnFLelN5bnhRREdISEo5N252K25uQ3VMUHZ5Ly8xdlBmd091ZUdQbnpFOXQxdnZ5K0pSYmtMN2YzKyt0OS8zbUIvckxJdi85MC9YMzEvL2pUM3hZL3ZMKytILysybHVYWEd0M2xYLy9neVgvN2Z2empZOEpmek9HUEt3cC8vY0VZNlo5djU5ZS8zN2ZhOSsyZnUzdFRZVVhMTDRzNmkvMzhmaHRlT0ZqeWVINnQ4RS9sMzh5ZjYvbW44MCs3MzN1eTVldWU5K0NmK2ZRbnNDdmY5YVJuUGUvelBmdDhuYy9rRWxQWW9mSTFoQm5pK1Y2TE5mUXdvL3VVL09mNVFvMDlydGpZeXhuMnhmYWxHUDY0bHVkOGJqK2ZONS9HSjYrSGw0YUhOM3Y0bFgvN3ovWGYvZkIvOHMvMWZkTWxldTcyeDFweFhVRzc1akxjT2YvTHE5aUQ1L3UxYi9rczhPOS9mbTMvL1NmN3dWVFp3WHlXdVhHRDd6MSszbUxrNXgrMkZjOCtSMTZYK2ZxenljOVYxNjgzWUluNDdNekZQSkVkdU1zVDgxT2V1NFpRbjRkMWJHelF5NVdIbU1KZ0I1NmN3K0lpUTRxeGhLdUdGdnhzZnFjKzU3VWhoeEw4TnRqRVJ1Ulk4SzNHRHIxc1Zrb1orNm1wWVVOdmpqbmxuRXV1dVYyNTU3ZkVra291cGRRaXlMMDExbFJ6TGJYV1ZudDlXMnlwNVZaYWJhMzE5dmJRSXhpWWUrbTF0OTc3KzRicjVZTmUzdXZsOVMvZkdXSEVrVVllWmRUUlJoL3Z4SHhtbW5tV1dXZWJmYjRyckxpQWlWVldYVzMxOWU3bjJpREZUanZ2c3V0dXUrLzN3OWErK0tVdmYrV3JYL3Y2OS82eGE3OTI5Wi8rK1IvczJ2TnIxOExaS1Y5WC85ZzF2bnZWK3ZzdEh1RWt1MmZzV0VnUE8xN2RBUXc2dUdkM2UxSUs3cHg3ZHZlQVUrVEFSV2IzNWxxUE84WVdwdjJFL0QxLzdOMC9kdTQvMnJjcnQvOW8zOEwvYmVjdXQrNy94ODVkYk4wLzc5dS8yTFZsbkp0bngzNjgwRFc5STk3SGE5N0FGWDFqZmZ5MXhDKy84YXZqMjdOdVlkSWYvK2MvdlY3dlo3LzE0VjdMdStwVGMwaWx2V3h1SEozTEdIUGlWMmxFTDJXL2laZU1IZExYV255NWc5bldNKzg5cmpCbkhMdTJKKzg2ZHN4ZmU0RzZiK3kxVjU0SmU5cVR6MXExMzJ2dDhYQWZNKzkzalRWQ0duenVFL29NcVY1UDQ2MG02NFgxM1h2WG1RWTJzTCtZNy81OE5lMzY4TE9ZNTczbUhwM3RIUFVlVDhwanMyT0EvOHN1WWxUWFRLTFZzK2FxTDhRa3gwMTRmZGZMT25RdU1lVEJubGJXSjR6U0FmWTN6L3FOVk4vd0xTeHJmaVhPWEVlNklEVjEzaXhHYlFtRDdrU1ozc3Yzc01GZjNTekdIUHh4eGEvTkw5eGNudjR6b0NGMThxNnh6b0J6enE5ZGJlV1MwbUtkWnI1SHVWc1A3UHNjUUg3ZnE0VTFTMXhoclB0TCtWc1kwRno0UVk5NXJ4cHEzeVd3RVNtWHE3U0hQZmxxNXVhTU4rdTcyWXpPNjl6WWY3UDV6OHlyY1RIQVFTejl1MGNxMXpEZ3hidVV0UWF3d3EyRnVQRWpEQk96aldzVXRqbHlLWFBFL1BJSkJjZC9CNSs4NDZoY3lvTWg4R3ZYR01lcS9qdUwreGMvbTZXTVdQYVk4Y09wOTJ6ZkZkWXFIZmVPaWJET1BXTWJLVXhYcHNjMlYvYlcxajYzK1h3dllQL0hXMk10SWJBaFJQcjJmQmVoL1FGOUZtQ0NLZlc1dWNmK3hsQXg0bWVYd1hLWDhSVSt2UlI4OHlQQ1l5ZnRUZmViV250NVQ4eDlyblcxOHVVSmlIM0huTXFMRFg3LzdncStmdlBpcjZWdngvcHhRVEdOc0h0Ym9PUDFzb1A4dFh3UkFNSzd1VXBRRE44SEZVYm5mbk1BU2NTczJPVis3N05lYkNBYUJSZi81bzlYNzY5ZVVoNHV2dGZ2aWQvWi9mMDFYZUZsaTJyQldwNVpndWF5ODRRbUxqeGs4LzZzSWV5R1QzMjBsVEJodFlTVHhJY2tQUXgzL1BhajV3NXNhb1JudlBWaks3aitZNWNkTUs2d0JSY3UxZGJmTC9MaGtYZTRObEc2bDhhT0R1Z1NLMVJUK2JCalhqbEhMOXQ3WHZ5aEZaYWtoNmZuRzJzTEtRZnViNy9TNzdyRzgxNnBqRldlZC9JcGdHdHZCQUt3R09OLzhsdnpSK0J2TlU3d2xML09BejR6cHhiM3lDek1malRIY1dOVTE4TTlWWnowVGJNMjdoNUhlOWRSRUptOWxJN0pMbExBMTBKZ0pmK2R5VjcvdVQwL1h2SEtHdzRYSmpmTkJSY2lUK2NlcERVM3hqZUJWVHhhT2xwRHdUS0pydlV0R3lOczd5N2xHNERBZ3BEbGN2ZlJpbXZFUlk5S0dKMVZUSG9IVjlRelZERUJwcE9RcHJrV1ByVHp5ZzF1d25uNC8vZXlpckVOWUpLVjRwNzUwekQyQVR2c3lWcFB2OHJUZExXT05RSlFmT0p1OGRDdXpYczloQzhDWWt4RXhNZFBHUnU4aWdSVklta3BzZDBFOC9SaUd2dGEvVTQ1Z28rZG5jZW5TOFpRSGx5clB4MThZSjltNUJjcWNjWlBXcVcrWHd0N0VqSW4vc1J2YmFJQWNZMzd3RnJaNWtCRVh1bmV4TS8rZU5zdmlBT3lEZEIxMTRKb1drRERBMFpoTWMvZ2QwZHEvVDdzRysrNVFPRmtWRFdDRFlKYzIxWGt4ZWkrQXRCa1FoUG9jRStDL2lEK3M3SjFQanZpOXgzR1V4OUR6cTQ1WFdQaTd2RVJFTURZeGtKeStiemxuQVQrR3JtaU1jcXp1TTNiMEFRUmdPaDhIU3dCL2lOK0dTQXJmTzlLOFNVOGNodjh6U1VocW1DNjVka3BHOGJBSlZaLzg0dG44VEdMbGdGckl4Vy9qemtsc0FFeUVhK1JGb3NPUUk2YXhTaG9GUHpxL25hQU9zQzI5b2RZTFFOQ1JkUWpYb3pBSGNBaXFtamEwaUljZjVOMXV6Wk9DSVpGU0VlcXdENlVZMGxDcHRZRGpFU1FzUzhpVFNHNFZqQ3NOTDZ1dlo4SmZNU1ZoYkV2dlZkSmE5OGd3ZDczT3dpM2tXQ2VYdXc4QXk4ZjcvSHRZcEM1VTJFbFo5dkljYkFLLzBPTHNWdllQcHp0SmtDK2hPUWJ1cGQwcHp1dnRVSW0zTDdiQ3dVRVNzejVXYmxCSE91SFMzUFJtTUtRSlJMU1lERWZzQkhZTlJ5K2x3eDI5bHN0QmJ6aVFSdkN4d2RqZmRBVUdDQXh6VVdGeExWYUNPRmpBOURneFFmZFpITUpKUmU2ekhDQ3pSUGVJVWg0TjVmUDRzUDFRSFo0M3MwTnNVNHBEYUltZG5BTEJqS24vdjVjRmplVzR4VXlSR2krSFhMWUMvNkN4QUtWY0NQOGpoc2hxT1pudndUbXNEYjJuRURWaVRNUVplL2FpWDdZS0phdjhJdlF4ZzVtOTRGNVlFejNCOW9BRzRtTDc4QXc5S2pnM1VSMGRoNEVaM1hlbk5oWjNwZGJ4V1Q3M250ZFMzNUJOQW9ZZDRzRHozZzdMdnBKQS9BYUtCWnZnQk1YMW4yOVdNbWNIZGJSY3lDWUpTVlc1WGQ2dmZTZVJQZ0k4QnRDOWF1ZHdDZ211QTZsSS83Y0IvV1FCa0FNWkJLK1dONVFGd3FoNUFGWTFjNlBCbS9VZVBsczNuWGlWckVNcENCMG5vMURYMWVNSXh2bmVvTkpnZ0VMcmM2YWFrdWJWWGxZbDRWbEJRSWtiTXJOVGMwZFJjZWtHZ2hvcUljMmMrdDU0b2tUTXdBdVFBYmVlMkUxaTFENlFNWUMwZ0NxU2VSWUY4eXVtU0tBanFVcUhpQkljQTU1R1ZFd3NaUlFwRGsvc0creElZU3JDVTBCUjNadVdncHNZY0w1MkRYQXZHdktQVWFpQXdJS2x3V3BXSFB6UGZ3V1ZCTmtqdEF3VENPV2I3NWdub3QrUWhXdndLbnJ2bnJDbTlZTDJ6VHlQVFVBeklRTDRESmtkQVdYRGdxaFBrQ1laMjNlSFJ3QmFOeHEyR3JxT0FnN2VvUFpnQWg0RHVKcWh2ZFRqVE5xc0JjSlhURENSSFI5Mk1EcFp3Z09OMkU3dzhwQmF3SXpEbG9ENEhvQjVIQ0xVREo0OVFiV0N4VGlBb24reUFEczVlMndpL0tDbkVRWGpIYjM1eDR2Q3h6QlVvSUlXOHJXb1VXZ3IwUWIvSE9OcEJXai8xaXhUdUJoWSsrcHo1NTBHeXNFUnR4dzVwNGpJVGRPSWhpVUFFSjhBL0lRclNlVmhZWUpRanM3N0gyK2NDUXVHWDhrSEJDOE96aUZIRzBoSmNJc1lWTWdMdGd2VXFVU1A5VU1GMFFwanU4dUh4NnNXZ256WXpIblU4SGtyK2NLeHpkU0FUeVREWUlrVHJidWdUQUNQQldUZnJHcmhHOWVMOUhLUDZKTStSTkdVSlArNnk5MWJpWEJzN2lxZ0o0QzFBSExoUVJDVmdTa1RKUTlZa2U0TE5RUHZJa2RKb0NPaWxJNUNkR0FrOVVYaEk0RUtaeDgrOEdHT3Q4WHFwYkN5OW9EVTVDS3lwSzFXY2VGZlV3WXdyY0NvaFg5M1JNc0VIN29Uc0FFMGJtOEFRZ3dDTVBwVWJSQjBJM0ZMNlFFbklhMHNNdDN2ZEFrMzBOY2hLR3lwSERhSmpYZXQxSWJVK3FUaTlrOVpKZ2Y5UGcxakhrRkV6S0dHNktGNzdJaDF3bmhSNmoxcGlEampTVU9vTklORkJwckJ5R08vK0JaZXN6NzVjNTFGUlRsQm9sYklPSmwvQnBKeDFaZUVjditqSTEzbDQrQ3dvRVk5TEsyUkVWZXlKMHZUTjBQWVZNSkZ4MlRhd2d4Z2pPWWl4SHRQSUNrQzdjWUgrOFA0bjFMVGY2OU4wNnZqZ1RtVW1oZ0M0dUh3NEVvMkNUT0FnRUQ2aUJWbnd1R1JZLzh0Z3MwakhzaEJGQUZEZmNObUVyMmN4QzRpK0J1S3F5ejZnTW43cUFRd1pOb2puYzExU3ZtR0hDOHVIRVJYZ2tNYnN4RzVNaUdZUUpRZmt0NkFOZTM0VkhObldjTkRpRDFrMVpFNDM1dk96RnA0akFENGNmSHNoTUp3aEpnNVRBRkZ1ZjgxZ0E4TUNlRFVkc0dJbHk1SnhPYUl4THAyRHN3Q3NrTW5zQjhMdmdBZkp4OU53b013UHJlSU4zTnZSQzdNZU1YTzRiRVRwWWZQdjZDZzF3Rmk4VjExd1RyZWdzYjJVYTRaSE1nQmFvZWlXc3VGYU5KWExNOHBCTnA5dEVvbU1lSUNlRDd5ckd6bDZWbEtURS9TRFpMUDVFUWdBdmsrTlhqbDJaRzRBZGxvQk80U0NWU3dmaUlJWlYvdi81RU16UklpVWVYSm1wT0JkNElZOHpyVFJnOGtRVyt6VzlYV0dFMFJUSkN4NGVKRWdBZ2R3SHlmRk41WHpFUzFQNDlzRnpvMzNvRVFaWWxYeTBaN0RHTDczTzdJakljVGNsNnZRQ0l2MDRVYmtab2ZpV1BEMUkrRXlTQmVBUEhiZnpwWFFpSkhTNTBZTTY5dzJ2TC9neTZCUFBLVnZ4YURoY2pFWWhRaWIyYmdJQUNzemhQVFRkUnFiRzF5QVFXdEpsaGYvZzczeFhIUzVBQmJLUXMxbzZqQ095QVVpb3plYkF3RVRWZlJnMzZTWWczS0czSk4rdk5HN1h3Qk5qZDRIS0krTUFQY2FraTVIQnRERGVqKzlnempHS1lNTVRKaUFBZzI1MzRYRmtOL0NHR2hjVmRFMHZlQ2s2azViY2lLLzF6UWR5RWx5VHFIYTcyNVVHWVFESHp1Wkcvb25wQjVZclNmUkNUZlVOR1lkWTNuSFBJWkFKeUQvNmNYendLQm9uUGNTUEFGWnJQZTRaVndqakdxTVh3U2lSOE5QRE94U0N6cXZENXI1YVZnSWlZUkpNVVJENWU4YjRxUHZpN0Y1TUM3MGNvYnhncGtwQXJZaStoS1lxTHBkOGs0aU4zK21IcGtLcWdac201aEhQa2xYbHYrSXFadEk0NzhUMkUyMjlidi83cFFoQWVLUEJ6SmdGU1lZNnNDT3h0QzNoM0FLSUQyaWplUmxsVys4R0xIaVJSdXZobDZUdWNLK0pWaElZTU9VSU9RRFVLWlA4TExNaG1sWEJzeURBaHlqd21sNy8rdGp2WDkzdHpjTkVjRGp2bURiaWhuUk9Pai9hUmZrYzJDeVoxQ0dEYmtERndGeFNxSzV2VUsxOVpGL3JtSVJ3VDdMeFRqMlpNRldmMkZpYi9uWk01S0J3b1FIamQzQlpzOWc5ei9jZEZzVWJiSzY4WksvbHUxRTh3ek8raDYwSzh3R3o4RFZuUmVLOGxyMFZheE5kTUw2UnU5M0diNlVXV2huakJmRk9ycHNyVVpWa1VoWEdFb2YzOXEwOG1aa2kxVFgraUxZQWErWEo5dUtKOW05dG1IV0NGSGJxeVppRFdvTGlBZkN6SENBZFlZcWNtdkJGUUQzK0R0MmJzR1Y0SHFRYW4wS2tROWc0VE80bW50eUpDUy93M1Y4SUs2TEd4d2poWXJGQU5mOHArSUJVeWVSR3VDdEVUTVlWQThKUjJtME1DODkrQi9YNTF3K2FnS093T2tmZE81dUtXeW1pZ0JBdnFMR2dLNE01MW44djQvdXlvZjc2UWp6MEc5cEN4alNoQzdNWVB3UisyRk9XTnIvRCtjUFRTRzhDR1ZtZ05KWHQvQlZZRyswUEJoeUdoQk53N0lUUEJBR1dxUlAveHFvMGdhWmdZNFA3ZUFEaWtBVFZ5N2VlRnR1NnQ5b0pPUWM0RkZSZzZ2UHJGMU1HZVhUL0UrZ1BxcGc5V2h0U0ZnQU8rQ0llWjNJc0t4RjdRUWVMMWN6d2ptM3NzQ01pQ2VxdlRvNVM0aHprbjJRMXZuRG82SFZva2hxc0x3VFRDMkFNRDJSZWhuc1dBTTNTbzJ3ZnRoeVpBR0Q1MzVYbjVWYVFsd211bXdtMFFOTUNGQ0QzQ05jdnU3RE1lRFV5T1pqNzdoeDdoNU5nSFV0SXMyRHNWaUliS2JDb2FWcDBDTWFoNWpBUDNmVEZMZUJVRWxpZ0hQK1NTTC9VdWxrelEzcmZISEpBT1VDeDZxdHkwY3lrQWVyc1hreVVUR0J6L0dnYXZoR1ErWndQbEhGaW5RLy9RTy9EQlYva0hjR1djQWRuVTRHNGdhekRCNFE3eWxqQmJyamRyLzNnL1AyTDFrVzltc0JBU1k2RllSTTEzNFpLWURmc2lBUUV2Q1NkOENqc1BpM2lmMjBUSVJHczh4T3pyZy8zaWhxQlBXRENMWVdvTUFOdmI3QmJMU3B5RzFTQ1FRRjVBR0NkcEd5Zi96TG1pVEovMkZjK3VJRnEvVHZtRnJNZGZPQm54eVdWTFc3RHZpVkVpa2VEeEExV0ZtMFhzaEhVQjV6QnJOTUdFMW02UE13aFJZRTB6dzVuUUhlemFEVmplSUJOdmpBNzU3cDhVNzRSakxQT2szUGQ0YnUrZlVCUlordlRHY3ZrbHY4bzlJbkJQNkErcEpKdmhrVmhCSXhkVGhCRGVneEJRTnFKa0lBaUdqLy80blR0ajhOKytWTHJmQ2JYdzU0VkJCUk9pR3dHQTViTmx2QzF2VE9BSkNpelRjWVowb2dJQjdtTmxaUTR2dGc4ZWdZVlFRUzQrZUtiTmRpRGNDYXNEQnpSTjVCRjlOK1dKVnVtSFBSVitCTWk4VC9tTWZxbDUxQzBiZWZkRVd3K3dybmt3QXkwRTR3bGhEeHdUaTBEVFdINHczRXZvWXovWkhSVjJCN3d6ZUkyd04rbnJZa1RQcjVROWlwWEYvektNaW5qL0lnTUJYV3hwdGladjczampvL0dDYVd5ZktRSzJjMEVUTDZ3Tklib251eFhEQUptTzNHa1JodEZ1ZHJpYWFrVko4NVkzOFNTWlJNZEF1RnpJVTN4dVhtK2VaMTRtYWowQnd5YUEvY3dPc3NxbUdFQlNMbjFnR2JlSG1oTkdVUU1CQ1ViS3k3aVUwUlZqTmNDU0FuZ0VhcmtzbWRYQUlWajNDblNqREpJL3hjeUJUR1F6TzZJOEI1MlIxZHk0YUdndUszZEFHa0JvL1dMVm9rZXFzczlzRHU0eFZ5QVBVR1crejhSK3NmUjFrc0VwbjNPdUFGQTB6NFYwanFtU2UrS0JFYWkvMG9WMVlGZkxCK2VEUFlNV3c2UUZ3UWQyakl3YmdOczM0RnFMSFlNSVJZVHZzOGRraitIUjE0S05OYzJkVDlDYkg4d285Qzk0Nk5XTS8rSXNzY25ySktCREx3TFhORjVvbm1lQmhJWkJuT3JKek9pUnpnTTZSaERrMzlpSmMwaG9FeDEzckhDOFdhYld2VytjQlRoN01pVFovRHJ4SVJIS3NEZENkb05ZOFJWSEtBRHo5cXpRUThlNUlBTlEvTytjbGo0QkdZQjhSSTQ4QVJUbmdyRW4zQnlGalJEYnJQaUZxK1VZQVdoQ1RabGRvd3d2OGNqTTJGNDNsMkMrK2I2SnQ4MWNYczluZllnb0EwWUlQZ0xzUU5wM2VmenRTVEJHMEhDYjZhSFdMSjV3dWtpN1JzKzhBYlNIVDRXRFpVVHBqU2NYZVlmcFhUNGNXQ3hnTnB1MWM0UVZFc0M1YTZ5ZHBSdjZnam93UG1xOGtuRUpOQURnNG5uQkIxT1FxZDBJbklEWUFzbS9xNThqTU5nMFBnakh3Tzg4cW5qalMrd0pVQjh3Q2c3WElKVlFIVURRT0xsMm5oMEhuYXpmbkh4YTdkWkUrS1hpWk1FY2p3b2MzdjZrS2tYNkNCQUxGaDFNc1dXdUFsVDk5b3ZwNEFiZklwUmcyMWdYNkh2bDBuTkpyWXNCSC94K21VZ3o1bnhvSG9nVkxHc1MzeXN3aGd4aGRTcUxGRTUwY2tzc0JZQkExK2ZpTS9PVFFDVElEUGpKZFhzWWlEMjl0YjFjVW9RYnd1WFBnY09ReTZBRmN5dG1nN2NudVI5V2g2eUx2Qkc4Q1JhYk1wSDlQV3dITzVkUUI1VDlGNUk2S21NZGt4Zy9DWnVZSGF2SkhzTjcwTFlZbzZ4bXNtdmZuYzA4WUtGcEhBVDRJTEVzRlIvVk52RVBzLzlraDZ3S09yT2hQelBXNFdGRGZXRHhlRG5zazhWTzdnWDZFd2FTWVdhK2NVbFI4WHR6U1dBcVhBNFhHY3Jld2QzazduRVE3N21RME85M2t0K3MvY1ZHSnBPa2tmODAxaGFWUWNTSXJpRU96SjVpeEN3OHpHTWNkYzdtQnZWU3ZORUxqOWlOQy9NcDJORURTOWtmWVFMVzBJRW1OSWVxSGw0VWpLVGJzeWJRdE4xNFdJdFlLMzhEcVRJYldHY2tKbVF6T0pjNmVucTRiVjFUelBMaURqUlg3TndFVFVvSk8wTGFjaG1JZkZuRmtxRkdrd090c3h6M1NvVVB2Z2pkY0FzVXlrbER3VEF3Tnk3VkUwK1dNSjZERytKc2d3MXpmNnNRdXNmTjlkK2Ztc0xqekd6S2ZsektRY0IvUXk5Z0o3RDNpZWEya3FZQWN1RlFBaHozeTZZb1AwOWNmMzBsM0RlTFQyN1l5Z3Qzdm9KT25ZMzloSTVVZ3A4Rnl1UVA2czc3d2lMeEI0SCtlVmpvZ28vaWIzdzFpSnVQQkxPSlYxaDI4SXY1V3lJN3NhaXVUckErQlJpeXZtYXhnV3lXV0liUVJnZ2h6bDVwNVZnUW1tWFVBc3NoaVZmUHBwb3RaeWp6M21iNVpHS3lnUVEvQWhNQVgwU2UvczV0VEVJSEVXY3JOV0dQT1cwMEgwSHJDOWZIdldZaURCYnZNWEQ3elZsdVM0OStjUllzOEpBV3YvNm1MWWg1L0l6bC8zNFkwT1Y1RUpkcmpVekdWcTJBeUlxUUxuRnFQNVVSNkJ6ZTMrTnBmQVU0Ky9XRFg5OW1PL2pCWmRWcU9uVUdlRW8za2Zld3ljU2pZS2tTenJKWTBZRGRBT2x3NUtWVCt4UGpuWnc2UVF1UTNPa0NRYUxSazlqbUFjTk0yWElsd2pZVXR2MmNTU1NEQXpIOHNXNGwrZG9Kbm52dUZzdDRUNlZKd3RlZ1RTVnNYcTJjWXk4TlJkd2ZGMi9RUWdkbWVBZ3VtTTM4UmVqSmhLVkhWd2w3KzlRcGlBYnprSXNZSU9oRU0vdGFFdW9HU01FOVZPc2VwN0xOZzQwSXJBWGhYbTRGa3JIcW5xeHREQno5QkI2aDlFSEM0QW5JVWoxOW9TVmpHd29DdkdpZXRkMFZydWpCN0NzMzBFL2VmRnNUZ1Q1Q1Q4WXhQWUx1VUdiYzRnVnlJK292L05iNlppd0paNE1ZV2N3NHhXYVZJandobitOd1pDZmlsMGpiUVhZbzk3cFlmZ2drNUFuVUp1S0JEb1ZZQUhzWWFncmVzSGwrRGl5VzVzY0JlRmh3U2FqVEczT0ZFOHdQMHZhdWE5MWNFaUlkY0s0cHZxYU1NWUxDQnNDWDJQM2pKQURMMTBYbUFNZ1JDRGNSZ3N1SGZTV0oyZ0l1TGd0N0lLZTNDSkNlMTN3anZqYlVDcDRhcWhMWnlqcFpKalllUU5NZXUwa0V6d3E0ZHpaMUxld0k0WlZiZ29SWVZRYlAzZENXNWYyZ1FSY1hrenlJQXdkeFYvUU0xTWxVVEFnblNuYlBrdkJzRER4Y3hJbHVMdWdHL2tDTmVKTGpyeUkvSUJwWnZWY2ptTTNnZ2t5VEk0VnpOdm15YmNDRnJLU3lJTmZSZDZnMUJGRXFUMHFZeDRDZG0zajF2Qnl1WkNHSmxIYXREd0dSY0ZIcmJLWlZYTkdqUWV5SnYxOGVGTTdpZ2ZYTEN5dVlnNTU4MkZ3UUZ2a0x1VFdCZzBJcGFYSi9jSXQ4dng2MGJqMHpHOU83U2RmcnVTWGphRTlNNyszcWNHVDlubnRDTEt6VllnOENieFB1VWFmbFkwMHJHcGlBRlJnRUJUZ2dhaTdBajVUQ1ZpWDI1Mlk5RFNYRTdJWnk1QmZoSjU0eEVtMkkxTkUxaDdFSGF3THdqQUlwK0Y3dkJ2NWFMamFQeFNkQWg2Y3ZyTUxqdVY4NnoyUnBSZXQ4ZWc4TURQYThDSENzQVJqU0lBNHhudFNoWlNQek10ZXdQbFFDV0RndGxVaXNNazZWd1pOUUxDK0J1UlBBOHBzOEl3Q05SM3JpMXVnOW8wSnllMnlkKzJYVm1qVTcwQ1BJUW1GaGtYZ3h3bTFhTE83SVBPVlJyRHU4RkRLNGdyQzA1Yjc4ZzZTMi9xTDE3MUlabm16NnRLcGtla3FIQ3NFaXNQYmFNaUNEN3hLVDhXb1kwSWhHR1NMK1l6VVJUSVJWZzR2dzI5ZkRqNkFzME5FR3UxK285S1A5UHp5WXkzeVFjMzE3d0tXZE5lUVRzb2RJSWlNUjEzRi9sQ29Xdks4eWRydk5hWUVHWFBDRzB6WlBYOTZBcDJZcjFtQm1XQnAweWxNbWdpWnVpc1FHS3daMytwMWpQbXdjcUlXQUZDQm40RFNTSzFIWlBJV25hUStoNFVQeVdVN1NNUC9rMFdnbGRPSHVPeGRVQjN0L2QwakF2RTQyQi9mUzRNRFpMeEQ0SmxweWU3S044V1lnazRpQW12M3dLSWdyOGR3Q0NmWWlXNTExRXpvZU5OcEY4SjRQU0pIUTBGNWt4S1BqQjg1akRBblJBdU41OWNKRFkxNVBnWEI5aE1zODVZSEVHZUJDMkxocWhmbUQrT3o3U3F3dmhKVDFqRStjMzcwOFd1ZTlFYWRWczRKaEdkQytVMWgxa3R5OUtPeDE5Q3RDTVZYRXBadGl5ZFkyQTRnbTF2c0E3Vm9hdC9rMjRlelR4aHZHM2l4WHdpOEpaTU55TzI0blhFUWYxTDVITCtZZmVWdDhJbkROQ09mUUJ1dVpWU2pkMCtpWndrOGQyd3hBeU1PMno0Z2ZIWkhiTUVoQ0N0ekhZZ0ZZVEZ2TjBtTkMxU0wyVmlVT3VMSUhqTnJpa3cxZlN3WmlZdDBIMENvd3VZSEFyUkd3WUJFQnNudnlsZWFNdVp6SGNsOVdlbHFJU3h5dHcwekhucm4vOEpaa2FZRkhJT003b3NqRFRIRDVaRVJZMGZNVkR2Mk5NSElBMllpTWgyMThZRDVzNjJSbldNbnp0Y0ozNEsyUTVHRFJIZXJvNXcyYXF2cHdFV0lGSENUOC9PRFAzNFpYRXd3ZVpEaTBMQ05GRTJ3N0FlZzNXRWFBQlBJSSsraVhCOUNLeVlOS1hOeVRTY2lKdVJURVp4andOWXZaaVpaRWJpQlpvMGsvbkNtejM1OTVTRlBYVnVBVFlxRURFTWdXOFE4enc1RC91QWlZNFpYNVZpZ1RkbW9SVDhBaXBiMmdLeTQ0WnVhS0NITUE2aXVmSDBiN1l2RU9ZZTlGejJHY2dNSE9saW53VGxDQTVkNFFjOU5YM2wwOStRVkRDUUR4YXJDb2hrNUE3dktHajNtS2x3L0hlT0Rsbms5K2ZncHk1ejBWM0hDOVlnVU11QldoTFZrakJCZ0dlSVFOVjlBRFVXUEppUTVIK014UTBVV2MvenduaFBkZ0hjWGNSUkVDaVRGcllYZ0VxUnVIUnZQaXhsY05uaktoQklnenNtSVFHSnd3YzVnc3ZIemhpTVAxZ0x2NFpaMzhCVGMzOS9aSTV5UkhhbHdXNkdaTUhPV3dNbmFER09KdGxmeVlKaDZJNTRscm5tOWtzMWMxSGNrN1gxNWlFYUhKM0w0VEYzNnhteXhreTNCN0FKV3dWNENRRE0rekJvOFFvRktLQ0NJUDhyOWR6Mms2b2loWk1vdFZnRkd2UlJuelFwNjQ3NW13bGphTW9pZ25QZHY0dXZLZExRSEtTdWNqVXJmMjB2cVNHeTNBbFFIakE1cGt6dVpOT0czMEhWK1BlamV1VDNUeXlKN3cwME1GbzJBY2pVMW0vL2tLQXB2M0JkUzlLU3RWTEpmMGlDQmYrU2xXVnVMVlpoQ3g1M21EcUFVL2dZZGJRVzdlZnB0T1dOWGFNNnYyVGY0cytTclVDbXFRaUlEemdwV1diWEVac1N5S0RwMlZHM3dHWVQ2WmpLOWY1ZFZkaFdOdHdjWk0wU0tvYm5odkRCNEF3cEZEdk41SC80R2VJK3pGU1U5MFhXZ2dUU3BIZUFraDVCdDA1aDFkb21xbEZ0d1VpRVAzWWFIcWpWUXYweUxGbnBVdmVvWnJ3aGh2KzFEQjhPd01zQzU3aXhEcTMydWxkaXQ0YkpGb0tURm15OFNJT1UyeWVPcGNMUnhKMW95cVdaRFZxa1pXNjMzTW9pcmRjT0JzMGNCandrT3JUNS90RG55RzlTb1FqWGhKYVYrMldlOENtRnMzdFhCYlYyZHhocFdQZUxGNVNuTVkxVkRIZHFOTXNhRjlKNlFKRWhlWGJOalJTYmhtT050VTdySjVzRHJpNC9Ra1pYbFloZmhBNVFIOXczd1ZvdlN6RlNGOEN2bHFRb2RYak1zNmxUWk9xNDh4MUNvL1VNNktHcVR3dWIvTmxYT0R5MmFnUkJodjVpM1IvamFOUUZiT3I1ZDJIVWpyMXNUMDkvRU0veFJYbmFRak1SRCsxUWpnWEhBTG51L0JzT1J0dUJEclY2eW16eWNmY3BkTC95REc0WlZKYmMvVkVDcDlPMjQyWlFGZzVJZGRzUjZNT0llRVlZa3c2Qml5cm9RdmhKTXJ1anl3eGdDMng2WkZhWlVzOWtWK2N1R2JXQkhiOXliUHVvcThXOGU3N1pSQkVjSkVWT29DQUpkMDNkOUo5QUtFSGx3UFAxVkZDS1MrWmdKaGFVSEx0M2o0c1cxdjJ3QlJvSkhZUDR1QnVYbSsvcXpMRTFsM2lrMEJ2RHBvMTB6TlFEUnY2eWNhUE5hVHdHTGhIZ1NZU01hL0NETm8yWHJWY1lYM2duZGREWjVQSU1TSVh1dmhlejVIMHVobnFIQ3N5end2SnZ3TjNyUGV3U0tmMjFSRVZrZmVrSDZDLzNvQXV3c3oyZ1ZDWVM4RWl3cnFZQUxaSlBPNHQxazJjQk0xaUh3SFlTMVg5elQxMjFCWTFtWS9Ia1N0RnllK2Jtemh0bHAydmVWV2I0YjJlVUx3SlF0UTlvc1VqQjllQ0dVS2NBQ2JIOWdRYzRhbklNbmNhSlNsWEF0MitMelFHbUV5V3ZFSGtQWU9WeUVTWTQ5Sk5meHBCekFXNVRCNmhMdkNVVjhFbkdrc3BHU0RSSnk0RDc5RkJKVTVVZUlzdHZtYkV1QWVqYjJ2cHVwTk1scVRYQzEzeHpxZ1U0UUZsdlFKMWRPU3VTL0xKSW5GbUVVbERJQVVjSHZUVzNWd3o3bjNXbGdza05naUQ2SWZFZXk5VHhVenFxdFkzeVl2aEFaY2lOK2Zia3dyZVRFbjhRRXdlSHN3bzNNYmdMY0ZtaG1pVGdSQXNZQm5BMTVrOUFGZlhHbndaVmxXYlVrWjhmdFU4eUs0Q1drS3FTZXRVM2VBSUlIUXNqQVQxUTJKOEtnakRmUk1oNTI3NTJ3eUNBalBQdFgwbGlUZU54b2RhZFYzdHRpaERvM05JdW0wakRLNVNuZUZKVnU4MnQ4eVRkZC9ubXI2dDVrbUlES25DK1BJcDRwKzNoN1lXYzVhMm8wL1AyaHV2L0hhai94Ly8zcjlKeS9FUUwrbXRBNjdib3MzUWR4NDloZXNjdU5tZXkvdUQ2V1BDbEQwZ1JJNXFxNEpaY0dNd2VrSEdxdlVvMVpQcVJwRVEraDNqMUh2dHFmczUwTkN3Snl6WjkrUXpXbDUvcFEwMitGUW9Sa1YvUE13YnMzWHVrRUxPT3A5aWh5TjE3Q1E1Rm51YThmV1pTbWVhRnR0QVNsVGtZWXJSUTgxS3NJaHZ4V3FBU0VBZzFCZEhnaWlrcERXdUdERFh3bGhmcnVuaS9oYjl5bFF0R1RXZzdueVUxYVIwS3daTmcwclRzMDJtdnNoVUJERlRPNWE4RSs0R3FqNXRPMjdhVmZmMmdvc3Q3SHBTNEsxUVo2QTV4eGJoOHBDUHN4L1ZHTFBUMFo1ZWtoeWpyYjVVSlFtU2ljL1Z3YWxyTHQ2ckZJREFQNWhQTmpVTC9PQm1tbEFmdFdBTkovOFZ3SHhwT3ZmQ0FoOGIySGY0QXVJWkdGRUJsRHVjenh1a3lBK3JFSjhna1NtVFVqUnhZNWk1eDU5MjdrUVpDV3RleWpYSUVVR3ptcllHelovZWZCK0UycUl3LzNlN0d1MEgrV3p5YUxlMTRaenhlR2gycHVoNXpnczRkM0RENXM3b2gxZ0ZqYTFJaUdDMHNMNHRnYklVc0lVSVZpSnV3ZHc3Y3kwemhEbW1LeGxKd3hvUmVqVkl4SU1UeS9raUlWOHZtTDhBazZnVndhRmRIK0laaERyNS9TWFhjdmFEc0RMaW9JNzlvRkhHWnRaSHl0eE5od0VqSUpDOHRiYlZ1TzFMSDM4aW9NS0NPTHBOYVYrM2VkMCtnNzRRclRPOUFVb3VXVVRHUGFDVEl0Tmk4ZUdxNEdIMktiY0ZQSG9ZZWhMa0xESkcxVmFMOHU4eHZzaG5UejVObWNhMzNkYVM1VE5pc3JncDgxTHJNT3cyQzE2VjRRTG5EZDUvdGVuRFJscFhqOFY1NmxteTdyWTdoMWdDY05PRUg0WC80UVVQZk93SmE4TTl2amFIT1JaU05WTzdaUE8vSGhkL0lkdHZLc25udUZXQVZiN3Y0TG50REpjWEJtdzl1aFZDUmM4cmJmWGdNQXk4ZVVNc0Z1cWtQTUZ0Vlh6QXJDc2Q3RTBJd1I3MUJJWHhNb2pRU2UveHR2aTR6REw1NjBRaUk1ck51MGh4Zzk5d0VhTnEyY0N1Y0s1bjQ2Qi9tcEFvMldQS203ZEtVNTc1bEZCSDRUL0ZWYzJGdTBwZWJ3Sm9xZVdGWnBEN0VldFFCclNZNDN4NmYrSW1DQ0tGcDV2VFkwbzVYa1h2TG9wcWdEenoycEtZak1xUzFVSDJNdVBoTHB2blB3b3Q5SHdvcG93RHVMYU9aMTRCU0MyRktLQmF5eGdEUzRNSDhNK0pXRlFvS2RCNXVCSFpaNXlTbUo4Wm1NOFhtTEZZTHhzT3BvanRQSGVmTWNRRGtMY0xnOUFjWHVtSW1TbzJjNVhTejJuYVlGbFVTTUJCYU9UUVdlcjBFR0swV1hucVgrYis5NW93enNFOWJrbEpETWFoOHhjNHliWFNnUmw3ZzNlYkRrYVpsVGE1dzVQdTA3Wk9LVDZkNXZ3WGFhTk1EM0NPWXJmUGpVK1BkU2Z2Rkh4WE1RU0dzbnB0bExIWE0yclhuNHRuRVI2b0dtZTZuRXhHdE9hWURTTnhWYnZ1b25YWU53Z1NBSXkxMk41VkxSYVB4TjFZR3hRTFN3cnZLYjRQUWMxdEkxNFRxZms3MkFHTG05REgyNkNxVmlZNXBuQ2xjL0Z3c3B2MDBlQk5VZmNOL2p6WStEeFhKTGJRbVRZOXhUUGVkZmNrR25yVHRHWllEeDB6MmtDbDZtZG5RNlBNTnRkVDRLbm1PRjVmNTFNL1NYRDg1M1dRZkg1QjUwUE5qc0w1UHBUZnVjSHRYL3lPei9ablpQYnNUVG5qK3pPN3h3T1FlZVAxSTdpRDZlVmV1SVVpeFY1YlpuL1VMakk3WjBscUY4TGxtRVppZE50WitZdHN3a1NTTVc3WndMRVBKSGhRdWg3QklBMnR3U0FuUXNtdzNNRnltMGtpV3pUR3NCR1BOM0ZNbDM3a2lyeExSTUk4YlRhUFcwY0Y1UUxYcVhZUnpCK3RwL2NNdEQ1M3RZNnZUYXZJcEpaUHhRb1FvWXJnQ2w3T3BXRzRpS0FyYTBDOGRkMFpVOTlpRjA0dDVvVXJ3aFdMdGhzQURZUUVvcWRMUTJaYzAvelJWdFRXcXphOE9BcFlMb1FkaFF1Sk5hZ2dneUdvNFNJaUo2akhXbUJVUFBVc3lUQlJDUWhaRUcxVjhSRDhmcmNUOCsvZlRMMWdzbWlZdkMzaytNaWltV1BkajBJRlZDdDlhMGIzMzhMZ3NQdXJXSFJIQ3JWRSsvYk9IQVRpcjhYY2R4TlRyS2lxSWFBWnhlNDlsZHFCcEc1ZUpqMU1uOUlyR3V2OVNQZGNvQTJyZkN5UldVb1hiNlJHNkxHUGxMUDgwYUI2VnREbGl3ditPYnRNUnErdk9SQ2FPRlRJem05Wlg2S3JNZGFvS0UyMUJHaFFyN1FyVVJpT0RoTEVrOXVHQ1FZZDdZUkZDVEJZZmtRQy9ROXM3TVNpQVY5OFZhNEdMYUVVV3picUV1OTJHSG9VN2NZSENIK0pxakVBcXFFWnB5WXo1QXMrMm53ZWpQYWIzREtRaUpZUnoweFB1VlVickZyWDdhZERTbldMVWZGTllqMnBkc2xBSnN3aHJNUkhtczBlY3lLL0xENVNTMzkycERubFhSRnQzOWhrOG1TSG1TTUtRTTdaSzFvYlRicDNnZEo4LzNIVjZ6NkJwMGhML2plSFo1b0RjRzhMM1ljaTl6Mzk0eTFJVDVyUTdGd3RpT0NXVXlUSkpXTCtDeU5lSDRUNG1DYlNEdDBlS2F2OFdhb0kvajNwMERLSnNqTVpTUTRoYjIrbUNwQXNDd3o2bTlWWjI1RFZKdldYWnNWcmVFemJNVVBMbkRaMTczNkdDWUlocXpOWG1ZWUwzelp5dExrb1lLdEZYcVNMYzNFQ0FESG1seHJrakMzdUxsSkZydXNaVTlMTEJrVnVvc0ZCN2pTeVc2Q2pmWnpkb2hWd2UvdEJPcjdIdGF3b3hJZUs3WkNMbVlQaU80WHEyTXUxS1JLOWppR1RjUENoMG1mYW9iWlRuWEwxNkVOeGZROS9Bb0RZWGZoTlhnMEcvVlk4ZGl1MC9xUzJUdjdwOUVxV0JDM1pYZFZ1QWZFeFdLdEdON3ErWkx1YTllYmRTK0liTWlrV2Nxa3BvV043T1VwYURTaFM0ejdxZmdiME5PRDJLUEdPM1FwNDJOM3BvWTkyZEZwQ2pRQ3NNbVpTOEQrd1B0L3VpVFp1MDYwWUM5WWVWdUg0UE8rMnRCRGxBUFdRN2Vub0VPM2hpWDdHNTVyZEZIMUUxYjdaUVVjM2dXdTRvZ2Y4Tlh0dFFuMkNPR25ZSWNqYTlnUlpQdXc5UlY3d0ZBa2xpZUt6OWNHZVJpaDNhdklhSFMwNGFoQ01oYmFOMzBlUzhjQlZUcDVMSHZPaUJnSUxXTEd3QnBxcS9DY2lZOXdrWjhXZjltWGg3TURiOHFMaEJvSFpqeFZ0RDBaQW5qYkJvMENaeHNBeG1FNUNsU0hCYnVmKy9Ub1JHTTRscDFodUJxTjgwRkt0dUVBRGRSKzhvK0xxSXFvUUZuY2xreDN4VjUyUnNyQ1B0aWpVNlpzVWU1VDltVWhaVFJ4aXluWEUreTM4cnoyMCtLRVcwTmoyVmpDWXZZOHN2MzVMOE5oV1orQ2E2WExHa2tMRGdQQjFKemViU1YwaFJ0dkR6R3NFYlR2UGllUEZrL040dW5SdCszSlVzc3h3eTQyKzBCR29jb3ZzWThvQkxDZHMvSWJ6bUVueU5MMnVFZVcwOGtoaFZVM0VmdHVBQVQvdGtldnl1RVF3ZDB5eHVIQkl2WVI3dHdxQk1DVCtmZ2tHM3JzNWcvOFB4RllIUDB3alZlWVN6THA5VVhBQXVqajkzRHlDNXJPajl3QVNGUDd3QzlpUk1JNHQrVlhIWE8zOE9KOTdqUVZpdkt3YytDRExUbE9BV00weTlIV2hTTEhKZ25wbnB0OU50MjJFdTdYSTJnLzJLSnAyeFVnSlhhcUNxU1BSN3AyT0Nkb0tWS2pnYVhodWV5R3g1a3hudWVyZzdqM3ZkK3BvdzBUVWJCNGp5U0JKT1NqWlorYkFMdk1QVUhvZ0tKNWl2UHg3NGJ3ZS9OeUhsaDdmaVo1Z0tyQTZZQXduVGFkYXBVMnY0VmZQeGp1UkpUQTMrMHBPdDIzN054cDRCcmo4aUlkSldFZFFuNklZZzRtd1I3NXRJRFdBNjdpK296Y0lOeEk3Q0pYSUFtMHN2QlVvVG04QUtPNlRsVVFIL0M2U3QzMHBiTmlHaXlEaFpYL2VsWmhKVEdMeDRJRTV4NndVNTVXNVJ2NVorbWFKeUtYZlRBQkxPdFdjTUdTMFozb1BrU2d4Uml3VGxRM0RERTYxYU1OOTZoNmhBUGdqMmRwUURZMVFkakNGWnVOWThsNDVrZ25HYUNESnJUY1J3VmFUNjRSNDhja3JTejc4MS9rM0dBenB2TFdDd0k5WlJ0UVpEemdCa0FncjdZWFk2Tld3VXZtTXpwRzFwK1QxUS9OQTdISFJvRGFSSkxHbmdXSDMvRkRhM3VKSHNSS0xUQkNuNU5kc3M4UDNxemJuZ3lMNElJVkFZWHdMc094cHdtZU9nMGMvYnYrakk1UVNHVEp6YkpNQTJxeU5BRHU5SjBnbDg1UWc1dXR1Z1cyZldhQUNGV3ZSd0g5VWhSOEFXRnpHci82R2dSZEM5bWlaMzJZZFNLOFlVRElVM1BGSnBXd1FidUJUbkV4ZnRRMlRtQmY5c09xT0Jya0NNTS9yYU9KUnJQR09KcEYxZyswM2VKZUdGU3h6aEl6OEt3ZXY2eEhrVGxLSlVsa1VmVm5KNGQ1M2drenQxN0hBenhFc0gyUXhWNWNhd3EzS05JZVI4bDRvQUpGQStnZk1MdStaNG9JNEdMSGJMUnAxcmlZUFZHNms0NXNpZitmY2JIeDQyWHpyNEhOUW1Uczhic2lVSm1zbCtINm9ZamRkUFNSY3BZZDN3TG5Qb1RjWmxKTG05My9aWVZycW56T3kxWGFZYmJqaGJERytzWW5nT3BKbm4rcml0ZjNUQk1yc0kzSERubUVZQnFuWlVpQ041RWhqN0tud0tCN2htcGVyS0F6Wmo3TFd1QWN4NUJlbTBtc2owQVdsUXBXMjJHVG1rSXlUWnRsVHBFMEROdUtYbXRQVTNOa0lXeWd5Vk4xbzNxYTA3SUNnS3RzWjU0T1FJRWtLRmJybUt0MGxrMHdqSjRwUWhGb3RUMitYaXpHK094YnJRdFVZRFhzclZtd2htRGJPOXUxZ2FWcWpTbmZYQkdHVXgzWTByRlI4Rzg1RU1WVlRSQ3RhU3J5ak9xeGhPTk1BYnFqZmNvZjlMM1pSYk9reVkxTGcvVEJxVzdMZng5bDF5bll1NjBPT3J0bTlTcWFuSHUxZHJWVm0yS1JYb252SVR0bWI2Y2ZGSmJTTnJHSXEzalhUNjZ3bnVFaHBwRHVkWUh3ZDdZQjlrVzl0cG9KTzl1NVFzUFhlTDZ1QklJOUlJb2VqTnloQU1zVUVPd2JGc0hXM3ZkSlplRWlQNk1WdUd0VWlBWE1kekluQW1kcDQ0ZGF4Ny9YUC95cjhvZnJmMXovQUg1YU9HUVpPM2JOeFJJZEg1dVhuUkFUUFVpOVpUWGJpbXJ6RGNzVGQvVGRBaEpxc2xFWE0vRmtEbmNoZGp2S3hzazVZWjVFMC8xYzUvVGFPc3p1U0pMUUdzUTdHeS81M0czbGFuRHdUYldIQWxjZml1OVJGcGJaaTUwdDNTaUJXQTVYc0VsYWlaUS9ITHlhRWljUUkvQk9TTWJWYjQ5Umt0VlFOc2VjbVQ1SVpNK0phbStZSnlMV1pOaUZnV0JpdTM0ZDQ3SmNuVEFTVGQzT0JWWERWenhDaHBKVmh3MHNQcU5uQzhuUElGRDkrSDVzbnJON0ZTVDJZb1pWT3RnenIzSll4eTBsZEJwQjk4RFpRVGhIdllQMUVWM0xkUk1aK0trZHlkbUVTTG1Lc3pYZ251Z3hqRG9IbEYrSGVFR1F1aE11Y0xzVnovVEQxMFdxVDdKUE1IdUF3R3VzNWp3ZGlTK1dqVXFyNHlIYUZQU0QxUkIyNFh5MUlna3NjSnEyWHp1OElKeVkrazAvMWNsLzBwNlJjZVE2MkFWTHp3Rit5N3lKY253aVc5QnRXUHlRRE9xK0FDRXl0VzM5MWpRTGpabUF2aXhpa2w5Tlc3WnNIMEN1VjhkL25lRlVMMWorVFJ1OTJOd1A3bzA5bVIwN2RiYjNaNHQyUkJTak00dlZaYytaUlFEbFJmek5jZG1SQmJXeGxmTzBRcldmd1hOSVdkNGd2dXhjRWpHKzNFVTlKSjFDMnV6cHRISktRaFNWQ00zaGQ2RE51S1hYWnVmQUFWc3VBQlRlM3g1T0lnbnNkbHF4bHh6Z1lGMUIxYldKeE9hVkliVTJBRjFsOE9sY20yVWFKWEo5ZGJQLzdIN0MwTHVwQzlNTlQ3Y3NoTldwOXM4OUZnNG9Lci9LZmdDb2hQaXJFWG1iTGQ0bXVyVmlHeWVkYVRvOVJiSlBmZndhN21IN0RQQU1TN0ZFWHJFMHpzZ1IxTk00TTFsZ3lyZWpSQ3A0UjZnd0dXSFZ4dlQ4dWhMV3FpMkg2QnRIM2ppSllscm5pWnNjb3BneXdZS1lNNi8zN3J6YWdRaE9hdUd1c1BlcThzOW13KzYxU2lVbzFRUWR0M3ZlbkdNaHlHS1U0WkVtaEFmayszSzRia3ZkTElqWjBhYks5NXlMejI3d05Zc0wrL1BZRGtGRE9QTzA4bFNnY2tmVlJZZDVSdXZkVUtTWGM0bFFsSXVBZzNpQU41eENjU3MrWCtnQVNoakw2bDRKS0FwZmY1VFh3WUtqS20zeTNGOWhOZVBGTzhPNzdHeDB5b1ZETk12SGhVQUE4UFhGeDhFbnAyT0F5bnRTOEN3aWEyZEZyeVB2SE5YRzMxQVQ0TkZXNGtEemw3eU9FRFhVaytha0F1NXo2aEU5TU5zcXlZMjZzeWkxdjkwalYvemI3aGRFMmszc1ArMnVOZG16MjI0ejVPS01LUUdQNmkwUUtrUTRPMEtTczhLU1V5ekRaK0hFTXpkRTFhcFMvZVZhZXptdkFDT0h3cnlaQzI0UUVIQUExMTJXNmVKZGtIQTdXZVA0R1hsa1NYeXc2cmJhQUV1WVF6c0wvazRKR1N0c3h6UWd2bXhQc0Z0NjJXQnUzUzUwVmNpcUd5cndnV2JOMlg2d2dkNHRjV0JYNEJiN0ptUURzRGR4OFN4c3MxNGRVL0N1TUZ1WW5LM2VqdmNzelpZdlFMTnpnNDdVTzNVaCtod3FFN2VEWjc5bmRxbWQvYkF2cStteEhKUVgvby9Mb3BvN24yRm5mSmxJczFqT1hMUElXdzUyTm0raDBwbGVsMVBnTEloK29ZSndBeFR4K0lnY0x3cDFPYXZGZ0dGeXhoUG1ZcFI0aTNYSmFhTmx4NWswWjRGWHlwYyttZXhhYVNkWHgzNVVzM1phcDZNeVc5V2hsbW5LZFVZSVd0RDdoTStJWVNQNDh0QWM1UUhQdG44bUJpZURmQjY2bm82TVd3NkpxRjNPbkgzc3hjMjREQjVwM1F5TVp6WUhYa0E5VXdJUjdaL3RGOXEybTU0bWFuK0NsbnEyT212bWxNNTBCd1FrU3dOTlJXNUhYam9FeGdoSlJMSlJIUm8vbGFRNExTUXhlcnBSN0pERWUrNkdmSHFKSzhFYVdPazNOM1I3S1o5OVJxZmt2cGpmeERiUTVOeThReit1RnUvdGRKZEtHRnpPN0pDa1RZZnVlWVJwMjhjMExYeWZZdHlLMk9HTnEvT01uSzRRUFQ2NHR6SGdzZ0VTSVpzd1l0VGdhNi81czdtWnluSTBTL1VkSFFzWXNCSFR1VFNkS0JSTXZ6d3FEWENVaU9JMHBHdEd1MFl0T0IyM2c4TEVIWWRSc01VT1FhbTh1L2xLTE96R2daRktFS0JvQ2drS21LRWhlcUhvY0ZrOGJMK1VmZ05MbTl0R01rZEx3UjZ4azk2emhjTmVSN2Z1MHg0NVp4amxKRHNCdTBSK3MyalgvMU5Mem9aaXoxZnpjaEp6OUFEanpPT0RIU0VEMGlNdnpXTTVHY0IyUVBndTI0Y202aGtiQ2VkSWVkbGxrMDgrdFNja3JYTzBWaE5CYlg5NzBVN0padjl6V284YXZKWE5CYUFDWDk3WFlpU3JkbzFWdHNWQWRYck5aK29BTGtKSWNtN0hlckl0N2NYWlFleE5pK3V6d1JBUEZtV3lsQTVjbDllWnNMQVNld0RmZ0prN2JUZkV0Vm4xT3Q1bytsSXl0dmRqVWYzS1lJQjE1UkNGYm5jTGhLZnAyVW9FaTVuU2l6Vmx0Nkp4L3dGZ0s5Qm5pOWo0TzdIS28rL0hVdlY2Y3EzQm9jcjJjeFMwUElqaTRCYXU2Sndxb0FHaXVkTzdtOHF6aHAwZGR3NGVETXhCWTNnOGtZK1kxcTNPTWp0bi9xZkhjMkZlUkROOTcvRElNVE1oMFBsNHRmYnJjZklJOHF6ZVZnRGNRUEhKODVnNUtJNERhZjloTWN2MSt3OThORzcyUmFVT1hCRFQ3eTlhaDh2YnJQZVlhSFBIQjVVelZUT1kzM1FqVUMvd3hNOUJBYWRlL3U0T2hTVnNPaEhyNlU2N08rZFcyQW9CMVNQSEl5U3l3d0N5cmpmL2lpMEo1bS9iQ1FSaW52R29lNnhwZXRLcWVaVFdaOHV2OUFYRkRsTkFISFkxaUQzczlwdUFDZmxNNVFYeDZ1WHM4ZWRNTVlDUERZSlJzZSsxbmxFM2RzMXVhRjZBa2lUbk5jQmliaWR4dmE3L0diTmlsc2Z4MSsxQ040VFRBV0RuVWJROWMvdkJYZ3hibzcwTkoxK3pTTzh3N1dMeGJIZXdYaWV1bnVvYVhCZi8xZnUzdllnT29iMm5rNHNjNmZYWnhJdzlnT2RGZUVNeERLQ3NPUmpxTTFMYi9QMFI5d2g2anI3emVMV2o4c3FwS3Q3Mm9pQ1duTGxjRllOZ1ZtZ2VURmhhdE02QXJoYndwK2JzUTJ1S0FJRFBDdnorMU12bzhqcUhwWG9WMXFJVUQvMXdOY2NkalhiS3kyRU9DWVd4UGZNbUppQXJwc1dObnZUZlo3ejNHeTZvMkQraFVScEswTDlxeWhjelE3NkowS3poR1c3V1hZb0pPMzN4NXN1RmN3VFY0L2dqTzJtS1F5VDNHVm50L0RuSXZQVXpVdVpodmFQZE9aSy9nYmRPcS84UVJRNXlRV1VUbDkya1plOEVhMm5DRFM5OEFYTEgyRVhWcFMxMDRUUXZUUk9iTUNNSCtVNUZwM2w0cTJhdXR3SEpBV3RJRHJSR0ZoYWJSQWg2emxvdEhsdHVod0U0d29hVmN6ajI3enFWdzhYQkRsUHJCV0JEZEExRmFQU1F5ZnFRR1J5TUxRNVh1TjFZRGpFdWpvU2RpZGR0MXBQZFc2WnhQNURXNTNhWTVyNmNFMXljaCtjMFJNelowNXB3TDJBU29zL2xwRE12ZFlHZjZSeVI4Z2M0K1RJTnptZG1TN2tKN2M5anliQ2VhSGNySzJxZ3Nya1BpY2oyZU52OEJKb0JCd25tOWp3dWNKWm82ZEdSSGl3Z2xNVXN1SThGV1phbmVJNTYwcnVaYnpnMUJEcTBDclJ0V3Bqd09wak4vQzRYSGR3U0lPV3hOR1E2NDhHcFYrdUtFRElmcllHMlFwQk9PeDJtSlR2TlVZTFd1Nk8zeStlUGNNQ2l1TDJkK0NBa0wraUNyVU1FREpoLytkZ2tEeENjelNCYjNQbFJ2RnNEQVgwTzlaU2lPc242N2JjbnF0bnhWQjJ1UFpKam0wR2JaWTN4aGRzL3MyUWtxN01XSWNUM0dlTmJZY2g1Yi9tUE8yVzFsbWVQVmc3ZERoTUowMkViYzhwNklSYmx1VHcyaTA3QTR6NHJmTlJCamtHVkg1MHpiOVlnclE3dk1WVU10MEpFSjhoRjZpQ2I5U0tJVFdoYlNlbWFMcDFIZHBBS3p6aXFoK2pCSTh4enlieE5VZzQ3VE0yVGRXeEVQaHlNdmc3WmNkWm5YSkM5aXdYTUdYNzBkc2Z0b1Q2Uk11aGFoN281RStBSTR0Y3lXQmFEbjVtSlBLVjFEbnE1WHlzRWlyMEZuU3VLWjc0SFJMUFlyVTBnOXNoWGQrTzMrNHlDdzdJa0p3Y2Y0MkVxMHRMMFBURS9iT0hCMmVaK3kzVnNidU8waHpIeDRhM1pydXhnT0V6YlRtM3I1bStWZGJLczMrSWw1elRDVkk3c2FNN05ubm5ad2ZKNUVqUk85aUtBUXdUWkRXS3hXbDkzd3VGZy80YWQ1Y0ZheERPNDdNT09paFZ3enNnOFIrL3pxaTNyanpiTmdkWFJtbVJFYVkybjZQdUZTamduU2ZZUXpvbU9mZVFZQktMTXJ2a3p3YzdPOFp3dngrNmY0ZllQQkVuY2VDVkt6NmxXVGFZcm0yMnBjVFJMRWRBOTJxdjFNYzVVdUNIYTIvNzJCUnNCTEIxMkFLNklIcFBMeHJQZjVCeGNCMGJaZUJmdEZMR1V6RWNCNUZkZXRVMzJFQmZMM1J4ZmlicTZBUElVcmI2MDJUNmZLZEtRdkFBdlk0M3Q1cTAyeWNWNVlPcWdYUHVzRERXcjlWcU44Slg5Ni9raTJJVFZVRDdVWVZvWG9QVG5zajMvYnR5Q2pjWWorUnFjeXpxTnh5NGJlZVhqbU1uYlUyV2c0eHFLci9zZFVYMktRSzAycnNleXA3eDNFSitSQ0M5ZlFLdmw1QitSZkczSG5kc1JsQWEzUXdBSW1WMUxKdmVlNHVobFFrUkc3N3dKS1pmc0NLM3pPUWZVWnlxbXd6QnRWMHFFTkxZV3VGeW1kcXFqVnNEc3dqM3NFdXd0Tmxub3RDS3ovVTZmSFVzbURPZGVHb2Z6czNlZDVzNm5kYXI3REdRTVcwbGVpTFErZ2NOUjJGeG9IUjBBZStDSVFMNkhTY1Y0RHgrWUUyWmVrYWtZRnJJS3NpY0xiQVpnRzdUdFJMN09JNEdzQkhwUTBRNmk5akVSblVoNFNtbE45Y1ZmcWZ4N1F1ZVFEaTk0VlFuRURvb01UdFhhbFNEREd0blBDb0lRMFZsc0E3V0gvMjg5WTV3czRmbHI2SFlpYzJ0U0FLRHdUSHpHQTlBczF5bnV0Q29wK2N3SVQvQlJiYXVlMlJaT0luSjhxVnhQbW50T1dKeEpqaUpiQlZWeGp1Q1FacWlDeTdaclowK1lQWWxPUkF5RVlQU2lGTHQxL2dWY3h6bDNzVFhrT1pPNG5NMW9sL1FaTHNSclBNKy93blF1SElEQ0lqcHVibHVKdno1QnpKNzZoQjYzTk5LWlhPOHI2eHZkWTRKa2Q1QkpxK0swYnJ0OHRtTS9Tbldvc01PRE1ERTA0SEppM0YyRHg0WFA4ckV2NXU4ZHd1TlFMdE1QM1Q2K25LeGJDY04raGl2RGIvT1ppZXVBR1FkT1pQMklHOTVvMWZjOHBNcVNwdFBicmZKVGdBWWZLR052a3ZPUnQwOGJtUmYyMFcxdHNMVHlTK0VwNDNhYzRuTzYvWjFJdnUwd1I3WEU2dXhpL05tU2FmNis3UUo4N0dpUzVUaXVHSmJrZFVySGlwTzJUanNoUHR1enRVMVdQRVZreG1zamtHY3NIdGE0eks5anBHQXhYRGtoWlY5V2hMUFFZMGhDUWZaWW5DOXZuc2xHRDBlblRvOE5MU3MyZUxDZ3RpRUxGa1FQTUJxL1FrM0VkS0VTQjl4M09HRy9PcXpiYytVN08vUU1FbXA5b3pNNVlYVk83UWtlM1Rrc0lVNGZJd005WklOWm16SHFaUmRldDM0WldVVTBIUVNheDBJQUVCMU9qSGtSOGZGQzNPWG4rVlV6TmJPd1RuTTJnZVRJN0dYZG5OUFBWdFdqOSsxSjhubUVUc3NlMVRUc09ZbWlxWnpKenQxQ1VqYkVrbGxJZ2hKcm5tZGJGUWRMWGVNOG1DRytDQ3M3M1ZzOFBVNTludEgwSGl3RmorM251VDByTjYyRWhxY2lxT2Vwc2JGWFFXUkNpd3l1M2NkVkNJUGd6SFNLbDlVVmhBLzdqWHlhRlZ4M255Rnh6dWNiRXVGRGFnZUNFZlJweHJLTEdNY0cxZWM4eG9WRkM1Wk1ycy8yVWdMSFo4TmRQc09hc3NZL0hPQVNwSnk5clFjZGhjL3NjeGg1V1JUOUFsa2VqQklDMkZySHJmTFNSY0NQOHVVV3dta25URTZPVjJEWTRGT3JKZzZkcmFkSDhDdlhxeGMvbmd3QXpNMm5YWlNOcEd2eWhHYUNncUJLV0o0d2xCTVVYck1hUGxmRE05MDVMYm5rWFV1NUhCeTFidDRob0ltY1EvUVltanhySDVBZGJzV1p5Q1U1QnM0SGpIbVVPOC9NaG16cnVNaGt3K0FMaHdUbXBKcnJnMVRwSDE4MVRMTnlNU0FmSVlUck5uK0VKWVIwQ29vOXdmS3dhNXhuUnRnd05DcVJGbnJpMEhtSFBVcmhjdjJpVTFvY2cyL2VIdk5uKzNCY1p6S2tkVW94WGdMa1poY01sT3E0TTB6NzRrMVpNMGNxUDdhR212WlhnSG00cEVOeDAzMDVUZUZrK2U0enN2UjliU2diVS9WT2pFZHNGd3d5M3phMm4yZVpmT1laNEp1dzVtQnZHMDd4Uk1mN1EyeFlSQ2RlV3B3Umc4Zmp6dUQwRVNMVG04TWpyd290ZEVobFErWkRmMTVQVTZFaHpZbmgzMm1FZGNLTUZkM2JpZ1VucDhYNzFORi90amxMTTFnT3BDalVhSnVIUkhSL1owNDNHR0MzeUxmOW44blFuUkVNSGk2Zkt2Nzl5VUJBdE1VRjMxYTRxYnFMYklTMVU3dHZITVhpVitkT090TEQ2aE5ZS2lFL3p1REpPRCtOTWpaN1BzOVAxOC9JSDJ3RXNMK2NZZ1NYeHRpakU4RXNOVHd0enE4QS9kMjJ4ei8yQ0hUMnhPWVdKQ09PQzJFR1grNC9xc2FKL1E3YlFRQlpvWWNHdWxXdTFlb3ZyTkU1cnRzcFI1OFliTVVMN0tBNm8vaDk2NWxydVRCTTFOWUdOODhBbkR0Z0E4RmhtUWpONlNEb0JlWkRCTE9QQmJEakhFTHdWZDVjZlltT3RwVUNUUUkzMm1kSTBoZlNaVzF2UDQvVklhcER4bDZrOW52TEFCT29LZkt1TTdOQ1BMQ2p2eUsxUk9xZWJjOTQ3QWhTdDkvWHVPMlVLSStqTW53Q0RqUXUyKzRFUEtsV05OdG4ydkl5dkVrdmRxVEVwUTROanQwN3ovMGc0TmpDTUIyK0RuVERtQkQwVHNmM0lWQnpnTnZRNi9ZemhsTmFycnBTbFVHZnUrZkZ6UUhGODhVZzQ4ZXRvV0E4Z0Ivd016dk1hem5WL0E3d3RxcnE3czZVZW4xMmhGMVF2TmR0SVZwWUJNa0owNnNGVE1SUkw3TzRsaFUyczhDQjJIWUdhRXF3VC9YZmFZSHljTWl4K1gzNGtNSk1KQjBPbkxjNDByWnJLZmdIclhGV2c2ak4rL3U0SE1UNjRjL2JLR2VXRFFKamdZeGo3NTA2aGlna0RGbkZBNEttZVZ0NURGZThRQllZOUxkNklNNWo4SGJUelBFTjA2MGQ4d1VvUFhFa2ZpMFBQUWlrUVA3eTJRanMybXpCL0ZWS2xudllIeDU4T0E5czNQeVNUVWZ1UjhGMUxBODNDVmk0TXdkTDMyOXdZcFd4M2o2K24vS29hdU1wck5idXNuNmU4VE1PaFhYV1BRcjljUWQ5TEJEczBVa25acG50MDRBOXFLelk0b25hOGF6VHFkZDVYczR3N2FhelFJd2tGQ0RwQUJBZ3dybWNyK2Mwc3BYWnpJdG11QnNSb0RvVUdnMmY1RGFuWWRFNUVkRklMbXFkZ3ZCbWR0RHhkTU5YMVdvTnZROXVFUWliZGFESlBEWHJMVUxiL0RESGVTYmFldzFqd3VOa2Z2aml5YXRidEdkQnVQWER5Tkg3VjVuYzU4RCs0UFMxQndMNUZvamg2WkU1VTdReHlONWZINVBuVThoWVRaOFFVY3lyQnlLb1RkWUJIKzRQd1luSTVxTWVzek95YlNhMU5zcHNNU0NUbk1kK2ZVS3lVMzU4SXBVUEV3aU9rcldiL05UaFkxQ0ZOVmJrMkZQc09CM0VySlZxYi9JNUtwYVB5S3pMTloxQWMwb2RvNDl1eUVGUXhxOFFDZmVaeER6RVRaOVQxcVd6RG5UY0hxQzlmRnIwak0wbjZPd0ZyUWxPRFN2MmZTVnJWc3JwaE1WSlVOZG55Q0NZMElGTUk5NlEySnc4M2o3UGw0eU9XSzhSZWZMQklaL3d0WHhTSGphVW0rb1o3N1FySldQeFhFNXhVQ3dLMUFlc2JLT1NUZkdPZlBtNlJQbk1nY1Y2ek5VU3d5MnNIaVhhTzB2NFNJTVhPZVFTTkR4SjB0UDRmYWJhcWZGaC9zdGFKQUlDdi9ZNGJ6dDlWeFlwSkZVTzBYWXVUenE1L25rb3UvSEExT3hKTEh2MnZKMjBCN05wNXJQR012QnhYeXhGZ3ZvdER3NlhCK2pGYnMrNStsaU8zTGZRR2VkSXArcmVzckc1N3VqYzNZM2RPc1lmWSsvZXZvTzE3OHZCRW5leUJBTWk1RUFSOWJRZEx1TzBjeW05enpSVnJNc0RUc05nUm01NkcvYlFtQ1k3UVlQRnZzRVczcHdMSkZaOVRrYVdJamh6eEVmdlFXS2NBdS80Y1hqVk5nZnBXU0ZyWFdkQnF2dUFoNG9kWHdnNmZvWFA1UHF3Ryt4b0JuejZ0SVJidE04aU9hU3BPZmZVc2JtT2tuak91SXpwdWZBY3lyZnc1c3NScnl5SkZQUFhzOU13eUdrVHVNODZlVEUrWU5iNXo0NHI4ZnpFZG9UUHlBdjRQVTVYbVYxMjRPZ0NxM2R1TUxuSWJDdG8rOGdGQUZtazFEcXpvM3pvbk95TEJlUm1wYU1lUmNGSnpUNlpQdnVlaTQxblM1N1hHdTNndVkvVFdRQlRLSGVGVjY5dFRaa0greW9taTJ6T2M5dWVIY2JuUXgvMEZ4K08xYS8zVENpMTFNaE9ZR0lIckxIN2JDZXJzdGxESjhkVkoraDZ6T2ZEUFJ3bGtwMDVXbndLVFBJdVRkMWNJN3BYenpQeVQ1bGVObHc2M2dKRzlxQUNsSENQTGZ0UWlzOENoalBQenc0NTYxRWNWcGxmUi9aZTJJbFBuWU9heEF3bjgzZ1pjSWdvQy9UNnlWcURiUFk4bktkZHpXb3Yrc05LQjRQUjgvajRGeTVzK3JBN2EzRjhvcFoxbXltY1pGeDAzTnVwdC9ZeGRQMHRVSDY4OVIxbldwV0hOdXdLTXVXUjBRTUhNNjdydTAvNUtmdnpoVlZPVnQvU041RFVKOFE1VU1hSFBWaHFOTXlVbU9xTHhCK1dtWS8zc1ljSWU3YTJYWTZYZGlpaWJXNDQ2ODlNWkd3YXh2dTVKeU9jeHpqc2JmL1RZMTdmTWp1YkN5Q2J6bW00bXdlYjR6cVJPL2xZWWVodzhyR1B5OVF3Nkg2eXNkc0gxK0syNTdBMjJoWmpoMlV4a3hOOWhBOE1FWmVFK0RwcmJOa3NrYU1QOCswK29jN1JURWZ3TGl2R2lJUmVDbmJoOFlIc3Zwc3ljSnc2RUlzZjVWUFNjNWxXVUxmNllMdm5IR0RZZUswY1JKN0FUeDdpQmN5TDNmUkpJdzQveFBNOUtYMGo3bHJzdXpsbmxsZER5dmlJaGVjMkxZMjVmUEZNQncvTFRyNWdmWVJUaHdnMnhBZTIydGtFNk96aFUrSFdjdjY0bytTMG8yMWZvTW1qZTV4SGU1YndGSityTVFGbHgxaDlCSE1mK3VSakhHQlIrZGVvcWZ2MHo1aVlQWDRNSGprU3gvTnFXR1VqMkcySEREcmdLeE5wWVhIZFpwWGlRNWtMdU9DY3NtYndSUUlhWHl5ejhEUGZlb204NlZjL0k0cnF0YXdmTmVxMFVqMkEzYkk0eDBjMzJibnNRMTdzUUQxUHViS3BHTnN3N3p6MlJiU1lSaFdIbnBxdDRyY3RteVo4RW9BbXhCYjVacnFia0Izbk14NWJhWHdpeE9jakhoM0RpVHBzRnVnQ2xzMnVNcXR3eTdiU0JEbjNzRGg4RWdCUHdQaFRUeVBCNVBuZG5WN0ZFdnYvZVo4eGg3Tjk3Q0tNU0NHZkFGc0pSaDZiblRHcll6cTVQWHVzV1oyQ0dJZlBkNElGL3IzaGtkVzR0a2Q0UG43cmtZR2JxSExlRU84QzZ6QllFMm5FVFpPZ1RqcVJRVHNJQ1hlSzJlZWNkc2M2eExhdVUxV3JCWml0T2dQYmEyMU9GL1NRenZHM1ZreGd1WHRHQjVXZHB5Q2RWdjd1V0NZVFV5THNlQzRIV0ZydFlNdEtkQW9RaXNRSjYrTnpOQ3ZZOFp5Ukt3NDh4UUNoYThnY09LTlpWQ3VLZ2s4cGZYekNRRlhLcnZBNUU5OE8yZXpqQjZyOXZpamY1VE4vRytLMU9QeTZPOG9TVW5JN0dyOURlN0Y4SStEc25tV2o5VDJmeHlpTEhJb0ZnSSs2OEo1NzRTeE8zYTdMNThQNGJKMEEvcjNxcFNSQi9FenhlUnFSZlFJVHhoaUFWcGpGbUQ3Y2JKdTI5Umpma3Ywelh1MDdCeCtPNXhDK2ZXNVdQdW1vZWNvWUVWOEFjcnYyUExOTWtHZndSVlpLVU1TSnN5VWlIakhHMTltSHFUdSszeDZUSHM2elNhQmV3SWZEK29vUGRBNzJISCtWdXh6V0o5bXBCdXQzakh5MnJRekYzQ3JvYW1JZm1MdWRNTUNOUWRSc3IvQTVqNXMzdzJCWnZldk1BU2svbGNTT0xEelBKNFdPTCtOR3NSbHlxRHpmWGoyMUR6NDJPUHRvaWNma2NiU21mSjJ6MjR1bEhvN0U1aXFRaWhha1R4K1RHcERlTXoxQzJVZjR6QjMxNWZOVUxQVzUyK05qcVo5NysxeW5ZQkhVNHlOVG5UUnpwamVpYzMwR2VmbDV4dGdwSC9MSkFzUVk0N3dkYVdDVkE0SldjVFRwTU4zdHdUVC9zbXU3VjgrKytDN3JBRGtFOXg3SENWaHc4bnBnN0lPcEhYWG84eHA5cU9PcC92Rmh5TDRZazM3VTA5RkJremJIM2FnREJ4dXdXdDI0T2thMU5XQWxqMElSRkQ2emFaWUdlWHJpT2NDM1dKL2xyY3VXdSs4ODdheWZydjdoZ2FYajhweStWeUptZDVxSEljMldyampNd0dNZ0tCZlUyTm84eStVcjB2aStjVnVqOCtWNGcyMEJrMCtzdzRZOWh1WENpVUdPVFhmcUdwVFpKeUY1K2o1Zm43c21mOXYyNHpxeC93VDR1dXBWUEhJZ05IZ1c1SUZ1UDdNOXZvUkxmZFZIRDhHSUFmZnNBY1I5R3ZlVEQwQWJCZG1IQTN5UGVlRVhMZEtHbTRyN29aN1BYRWY4QkNKdm5ScXY5eG1OVnQxR0h3NTlocDFqSDhSdEsxVXNpMkZsZllidERENnB3bno3emhIRWM1enpycWRRREJhbWhTenA1NW56WmFzWnZvRTVMZ25rNFpUSnMxdmxmRW5UY1h6ejFKZEVINXhta2lEeUJxOUQ4ckZqYkljRmwvTE94ZldiZzdRbXloSFdEd1NCejc0L2JxZjduR09zNnZVMHdRZk5BUm5Pckx0dDVhaHE2L2M4eFdQZU9UbmNzMFdUZkZZcjNSNHBwek9nVHp6QlJ5NnJuQUNFODh5MEp3MldNcW1uaStOOWJhYXhlOENHZm9tQ3d3THMvZmc4ZXpZVlBCeGtyaXRhZ1dDVGdnY3pQVHZFMzRkdUpwK2ltQjJ3ZFNyMVgydlpBRUZqNkRlQXpXS2F4SWR3UHpBM3Uza2lvdU02RDFKS1g1cWVmTXRLdWRKbGhwdG8ySDFNd1p1ZHR3WEVxdWVjOHd1YXNXT0FyR08rNjdRamkrVytQaDkvKzRxVEZpVzBEaUI2U05LRzAvaHR6MFc0d3BpMlJsODN1NUVTOGdQZHlmWjRQb2lSR2J2aVpibWxOWWFXZkZvbGlMQllwalNmZDNZRjRPdUVGTHVYMXZESnUydlk4dTJENnQvMlpXUUlkdTVVbTN3VkM5VzZjK1J0OGJQWkdtZGp5WjNZeEJyYk1YdGI3dm42Q0hFY3cvUDU2cEFWYktsWk9rQzQ1SXJTOVZrTWRkdVVaOE5Fc04za3RrTjN3YmJsN0dCcFF3QzJuZzArbm9vNDhqaWFyOGRqN0xVQVp2OFBQUGZ2RWE2TzBVNEFBQUdEYVVORFVFbERReUJ3Y205bWFXeGxBQUI0bkgyUlBVakRRQnpGWDFPbG9oVUZPNGc0WktoT0ZrUkZITFVLUmFnUWFvVldIVXd1L1lJbURVbUtpNlBnV25Ed1k3SHE0T0tzcTRPcklBaCtnRGc1T2ltNlNJbi9Td290WWp3NDdzZTdlNCs3ZDRCUUx6UE42aGdITk4wMlU0bTRtTW11aXFGWGhDQ2dIejBJeU13eTVpUXBDZC94ZFk4QVgrOWlQTXYvM0oralY4MVpEQWlJeExQTU1HM2lEZUxwVGR2Z3ZFOGNZVVZaSlQ0bkhqUHBnc1NQWEZjOGZ1TmNjRm5nbVJFem5ab25qaENMaFRaVzJwZ1ZUWTE0aWppcWFqcmxDeG1QVmM1Ym5MVnlsVFh2eVY4WXp1a3J5MXluT1l3RUZyRUVDU0lVVkZGQ0dUWml0T3FrV0VqUmZ0ekhQK1Q2SlhJcDVDcUJrV01CRldpUVhULzRIL3p1MXNwUFRuaEo0VGpRK2VJNEh5TkFhQmRvMUJ6bis5aHhHaWRBOEJtNDBsditTaDJZK1NTOTF0S2lSMERmTm5CeDNkS1VQZUJ5QnhoOE1tUlRkcVVnVFNHZkI5N1A2SnV5d01BdDBMM205ZGJjeCtrRGtLYXVramZBd1NFd1dxRHNkWjkzZDdYMzl1K1pabjgveHJ0eVl2RFJmRzhBQUFBR1lrdEhSQUQvQVA4QS82QzlwNU1BQUFBSmNFaFpjd0FBQ3hNQUFBc1RBUUNhbkJnQUFBQUhkRWxOUlFma0J3SVJFZytzaDBPcUFBQWdBRWxFUVZSNDJ1eGRkM2dVMWQ1K3oyekxwdmVFa0lSaUNDMFFhZ2hkT3FHSU5CRkVVY0VHSW9JRnBQaGh1VjdBY20zWDNwQXJLZ29pSUNBaXZZbDBFa3BDU085bGU1dlptZlA5c1R2RDdHWkRVVVRVL1QzUFBKdmR6Y3llT1hQbW5mZlhDYVVVZnZudFlyUFpVRjVlanVycWF0VFcxa0tuMDBHdjE4TmtNc0ZzTnNOaXNjQm1zOEZtczhIaGNNRGhjSUJsV2JBc0M0N2p3SEVjbkU2bnRQRThMNzN5UEE5QkVPUi9FMEVRSU44b3BlSXJvWlJDM0FBUTcxY0FvSlFTOTlDbFY2L1BTRjVlWGx4VVZGUVRqVVlUcDFBbzRoaUdpV0VZSm9vUUVna2dBa0FvSVNRVVFCQ0FRQUJhQUdyM3BnREF1SThuQU9BQnNPN05Cc0FLd0VJcE5RSXdVa3IxbE5KNlNta2R6L08xSE1kVjJlMzI2b3FLaW9yMDlQUnE5M0dvYkd2d25oRGkvWjM0R1FCUVFraURWOWxHR1lZQklRUU13MEFRQktqVmFqQU1BNFpocUVLaGdFS2hBTU13RVA5V0twWFNxN2lwVkNxb1ZDcW8xV3FvMVdwb05CcG9OQnBvdFZwb3RWb0VCUVVoT0RnWUlTRWhDQThQUjBSRUJLS2pveEViRzR1RWhBUm90VnIvelhRZGhmaUI3YmNKeTdJb0x5OUhaV1VsYW10clVWOWZENzFlRDZQUktBR2ExV3FGM1c2SDNXNi9JcURKd1V5K0NZSkFSSUR6QWpNUElCUEJTUTVTM29BbGYxOWRYWjBhSEJ5Y29sUXFiMkVZcGlVaHBEa2hwQm1BWmdBQ2JwSnB0Z01vcHBRV0NZSlF5UE44QWN1eUYzVTZYWDZ6WnMwdWVBRWN2UXpnTlFCQUVmZ0lJUjVBUnltbFNxVlNCRFlKME9RZ0o5L2s0TllZd0FVRUJDQWdJQUNCZ1lFU3dJV0doaUk4UEJ5UmtaR0lqbzVHZkh3OEVoSVNvRmFyL1RlWEg5aitIQ2twS1VGbFpTVnFhbXBRVjFjSG5VNEhvOUVJazhra0Fack5acnNzb0hFY0o3RXpiMUR6QldZaUt4T0JUYngyUG9ETTQzMWVYbDVzUWtKQ0I1VksxVUdoVUxRbmhMUUgwQmFBNXE5OERYaWVkNVNXbHA1TlNrbzY0M1E2ejloc3RwemMzTnljSGoxNjFMcVpvaHpVQkRkVDgyQjIza0FuQXBzSWFDS2J1eExJaWFDbVVDaWdVcWt1QzNCYXJWWUN1SkNRRUlTR2hpSWlJZ0pSVVZHSWlZbEJmSHc4a3BLUy9EZVpIOWh1bkZSVlZUVlFPdzBHZzZSMnlnSE5icmMzQUxRcnNEUWlxcDFlZ0VZYVlXVU5HTm5FaVJNVkgzMzBVZmVBZ0lCdUNvV2lLeUdrQzREVXYrTzE0SGtlcGFXbGFOYXNtZmRYZVlJZ0hPTTQ3cmpSYUR4Mnh4MTNITnU5ZTdjZ0F6c0o5QWdoZ2plamN3TmJBemJITUF6MUFYQlFLQlQwU3V4TkRuQWlleE1CVGxSUHc4TENHcWluY1hGeC9wdk9EMngvbkJnTUJwU1ZsVWtzelpmYTZjdU94bkVjV0phVkdKb1BPeHFSMjlGOE1EUGl3MTRtc2pMeXhCTlBLSll1WGRwSG85SDBaQmltRnlHa0o0RGdmOEkxdVF5d2VZdVpVbnJJNlhRZU1wbE1oMmZPbkhsb3pabzFUaDlBSjRqQTVnWTA2c011UjcyWm5KZjlqWHJiMzBRR3AxYXJKWUJyelA0bVYwOUY5dGEwYVZPRWhZWDViMEkvc0YwLzRUZ09KU1VsSGl4TnI5ZExMTzFxN0dpK25BTWlvSG14TTBuTmxERXl5SUdNVXNyVTE5ZTNDdzRPdmxXaFVQUWpoUFFIOEk5YzlkY0FiQTJlVTRJZzdPVTRibDlWVmRXKzVzMmJuM09EV3dOV0oyZDBJbnVUL3kwNkdPUWdKd0pjWTg2Rks5bmZSUFlXSGg3dXdkNlNrcEtnVXFuOE42VWYySDZmVkZaV29yUzB0SUZ6UUs1MmlxQW1zalNSb1YwdG9QRThMNm1aZ2lBMENtWldxM1dBV3EwZXpERE1ZQUFkL0ZmbmR3R2J0MlE3bmM0ZFJxTnhWM1IwOUQ2NHZMaUNOOWcxQm5JTXcwanFxa0tob0ZjTGNDS0RFOW1iQ0c1eTlkVGJ1WkNZbUlqNCtIai94ZmNEMjdXTHhXSkJjWEV4eXN2TFVWVlY1ZE01Y0tYd0RTKzFrM2c1QnVUc2pIZ3hOQW5NYkRaYmxscXR6aUtFWkFGbzZyOHlOMFRLZUo3LzBXUXliWStNak55T1MrRXFQa0ZPcHE1NnFLb2lpL1B5b05JcnNUZHY5ZFRidVJBWEY0ZUVoQVFrSnljaktDaklmN1g4d0haMVVsSlNJckUwdVMzTmwzUEEyNWJtZzZWZENkQ0l0ODNNWXJFTTFHZzB0eEZDUnZuQjdLWUF1UzE2dlg1TFRFeU15T1E4UU02YnhjbEFybEdBVXlxVmpRS2NuTDE1T3hlOGJXK0ppWWwrNzZrZjJDNHZKcE1KUlVWRktDc3I4MkJwQm9QQkl5YnRLb05zaWFoNml1cm1aZGdabzlQcDBvS0RnOGN5REhNN2dIYitKWGxUeWxtV1pUZVdsNWR2YnRteTVSa1p3UEV5a0tPeTF3WXNUcTZtdW9HTlhrMXdyenoyVGZTY2l1eXRhZE9tYU5hc0dVSkNRdnhYeUE5c0RWbWE2Q0R3NWZGc0xJUkRCRFZmZ0NiUEVwQURtZ2htbXpadENoZzhlUEJFcFZJNWdSQXl6TDhNL3pvaUNNSTJxOVc2NGEyMzN0cTRhTkVpR3dDbkhPUmtMRTRRMlp1M211b1ZIdUlCY0NLNE5SWWE0dTA1RlIwTGZ2Ym1CellBZ05WcVJVRkJRUU1IZ2NqU3pHYXpaRXU3UXViQTVRQ055TlZPdlY3ZklTZ29hQkxETUpNQStGZmlYL3laeUhIYzJwS1NrdlVwS1Nsblphb3E3NjJxeWdDT1hnbmdMaGZZcTlWcUVSd2NMTEUzYjhkQ2l4WXRFQmdZNkw4eS8xUmdxNmlva0ZUUDZ1cHFEd2ZCbGVMU1pLRG1FOURjQWJVZTZxYlZhczFTcTlXVENTRVQvVXZ1YjhuaTF1bjErclhSMGRFNzNBeE9EbkM4THpWVkZpYlNBT0FhczczNWluc1RWZFBZMkZoSk5XM1NwTWsvL3Bvby8wa255L004OHZQelVWeGNqSXFLQ2lrbHltQXd3R2cwd21LeFNLRG1jRGg4WmcrSWdDYXpvL2tFdEx2dnZsdngwVWNmM2ExVUt1OEcwTWQvKy85OWhXR1ljWkdSa2VONG50OXZzVmkrSGp4NDhOckRodzg3UlpDamxEYndyUEk4VHdWQm9HTGlQYy96VkI0UzVIUTZxVHhjU05RUTVLWVE4YUVyUG9TdFZpdk1aak5NSmhOdXVlVVdLQlNLZnk1akt5d3MvRWVjcU5GbzlBbG9vc2RUcm5aZXpvN21TK1dVc1RPeWFkT21rTmF0VzkrclVDaW13Ujl6OW84VVNtbTJ3K0g0Y3YzNjlXc1dMRmhnSklUd01pYlhRRTJWc1RodkJuZForNXRjUFJVRGU4V2MweVpObWlBNU9SbWhvYUgvVEdEak9PNXZmNUpsWldVb0xDeVV2SjVpQm9HMzZ0bFlHSWVYMmtsa2FVOFNxR1ZuWjBlMGJObnlmb1ZDY1QrQUZQL3Q3UmNBK1hhN2ZkV21UWnUrbmpKbGlzNUxUZVhkNENhcHFPNWdYeXJQUWZWV1QzMkZoWGluWkVWSFIwdGUwK2JObTZOcDAzOWU1TkRmMnNaR0tVVnViaTZLaW9xa2dOdkxlVDI5TXdnYVVUdEZMeWRES1NVblQ1NE1iZHUyN1F5RlFqRUR3QzMrZTlrdlB1U2l6V2I3L0t1dnZ2cHkrdlRwaHNzQkhDRkVrQ1hkZTJjdVVGOFpDNDE1VGNXQTNtYk5taUUxTlJYdWJBay9zUDJWeFdReTRjS0ZDNUw2V1YxZExYazk1UUczamVSNUV1OVVLQzlQSjdOa3lSTEZraVZMSGxRb0ZBL0NIMy9tbDZ0NzBKNjFXcTByNzdqamp0VmJ0bXhoM1FBbnFhZ3lnQlBrSGxUdjFDeVZTa1VieXplVnE2V1JrWkdJalkyVjFOS1VsSlIvVE16YjN4TFlxcXFxa0orZmo1S1NFbFJVVkRRSTVmQk9YcGZiMUx4WW1vZGpRUFJ5MnUzMk8xVXExU01BZXZodlY3LzhCb0E3YkRRYVB3c1BEOTlJQ09HOEFNNmJ3VkZaQmdQMVptL2VNVy9lQWIxaVNFaVRKazJRbEpTRVcyNjU1UjlSRHVsdjV4VXRMQ3pFeFlzWFBlTFQ1TG1lM3NucmNwWW1PZ3JrYXFmTWpzWllyZGFCYXJWNnBqdmx5UzkrK1cxc2dwQ01zTEN3REo3blIxVlhWMy9XcEVtVEEzS0E4L2FpOGp4UDNRSkJFS2hYL1Q3eFBYeDVVVVd6aXVoRnRkdnRzTmxzYU42OHVSL1kvaXIydFBQbnorUGl4WXVOT2drdVU5bTJBVXVUcTUzMTlmV3BvYUdoc3dnaEQvdHZTNzljTDJFWVprUjhmUHdJbG1VL3lzbkorYnh6NTg3NU1vQVR3MFI0QUlJZ0NJTFkzOEs5VVRGbFR3NXUzaUFuT3NDOHdjMXV0Nk4xNjlaL1c3dmIzd0xZYkRZYnpwOC83K0g1bE1lbk5XWlA4MlpwYmxDVDFNNTc3NzFYOGNFSEg4eFdLQlNQQVVqMDM0cCsrU05FcFZMTjZOU3BVNWJGWW5tL2I5KytueDgvZnB3RndMblpHeU9xcUpSU3FSaW0yNEZGNWNVVnZBSE91MXF6SE9CWWxwWEE3ZS9ZU09ZdkQydzZuUTY1dWJrb0xDeVVDa0xLcTNMNEtnYnBmb3JKUVUzTzBoaEtLYkZhclVNMUdzM2pBQWI1YnoyLzNBQnBHaGdZK1B5dnYvNDZvTHE2K3FNbVRacnNKWVN3TXZXVTRGSk9LdlZpY0hLQW83NmFBdmxTVDhVb2dOVFVWRVJFUlBpQjdXYVJxcW9xajNBT01ZbmRWNFZiV1NnSEVlbTVENWJHbEphV3hzZkZ4VDNPTU14Yy83M21sejlCUFIwUUh4OC93T0Z3L0hmSGpoMmZabVZsVmJyVlUwWU9jSzRLNWtSb2pMM0pWRlZjalpxYW1wcjZ0M0lxL0dXQnJhU2tCSGw1ZVNncUtwTENPZVROVlh3NUNieFpHcy96Y3BiRzJPMzJDU3FWYW03cHVlTmR5eDNCeUVodmRWT2RjMzE5UFdwcmE1R2FtdXBIZ0wrQTZQVjZiTnEwQ1E2SEE0TUdEYm9tZzcxYXJaNDFiTml3WG5WMWRlOUhSVVZ0SVlRbzNPb3BKN085RWJuOVRRNXdMTXNTbG1VYnRiMTVNemlPNDFCVFV3T3oyUXdBaUlpSVFPdldyWDgzOFNnb0tBQUF4TWZIWDlYNVYxUlV3T0Z3L0c3bkJ0UG9ONndlbnl4N0VvUDdaeUlqc3o4ZVdmZ3F5a3pPbTJMQjVPZm40OHlaTXg1eGFwZlltZzdGRjg3ZzJKRmZrWjJkZzhMaU1saHNkamdjRGlJQ25EczFpZ2lDd0FpQ29LaXNyRXgyT3AydnFWU3Evd0hvdXZvLzgzRFB3bmR1aW5NOWZQZ3czbnp6VFFEQWtTTkg4TnByci8ycFkvZzl3bkVjQmcwYUJJUEI4S2VONFhyTDJiTm5ZYmZiRzN6dWREb3hZY0lFRkJVVklUQXdFRmFyOVpxUFRRanBIQmtaK1I3THNvdDM3TmpSakZJYVFDblZ3TldZV2tVcFZWQktGWUlnS0FSQllIaWVKMDZuazdBc0M1UEpCS1BSU0VRdnFEeVAxR0F3U0ZXaUt5b3FVRnhjakFzWEx1RFFvVVA0K09PUDhmYmJiLy9tZGZiU1N5L2h6Smt6QUlDQ2dnS3NXN2NPSzFhc3dLcFZxNjVxUFd6WnNzWG4vMTdyZW1nVTJMWjk4Q3hlL0hRM1JrNS9CdiszNEQ3ay9mZ2VIbm4yNHo5OUlaMDdkdzVuejU1RmZuNitSN1Zia2ExVkZlY2h2NlFheXNCUWhBUUhnSE5ZU0gyOW5vaU16YzNVaUNBSUlrc2JGeDBkL1JVaFpPYk4rTlQvOHNzdmtaR1I4YmNZZzBxbHd2dnZ2LytidWk3ZERQUGdTK2JNbVlPU2twSUduK2ZsNVlFUWdrV0xGbUh5NU1sbzE2N2Q3NW0zQi9yMzcvL2ZFeWRPWkFIUXd0VVRWZ1EzcFJ2Z0dCSGMzTDAwQ00vemNEZ2N4RzYzRXhIY0xCWUxUQ1lUVHA0OGlZS0NBdFRVMUVqOVBWaVd4Wmd4WXpCdzRNRGZORTZUeVlUZHUzZWpUWnMyQUlETXpFeXNXTEVDdDkxMjJ3MWZENDBDVzFGUkVVaEVjMHlaTkFZamI3OFhMeTkvRWNPNkpNRUpRRjk0RkhQdm40Q01qRXpjTnZraDdENVhCUUE0dXY1TkRNKzZGM2syQUhEaXhZZEc0dUZsWDdwNStVbE15aHFPZDcvWWlEbFRiMGRtUmlZKzIxM29ZbUNIdnNjOTQ0WWlJNk1YcGo3NkhQSnJIU0p0eE5aUGxtUDBnTDdJN0RzWUR5NTRCYWZQblVOQlFZSFVEcys3SjBGRmVUWEFxQkFhRkFDVldrdlVTZ1dvNEhTQm10TkpPSTVsbkU0bjAyUEFpUEJ2OXAxNVFhVlNmUW1nMjRGdjM4VHcvcjB3OExaN2NMalFKS2V1SG1OWTh1WWFPRzdRVFdNMEduSDI3Rm4wNkhFcER0aHF0V0xldkhubzM3OC9IbnZzTVRnY3J0R1l6V1k4OWRSVEdEcDBLQ1pObW9SVHAwNEJBTDc0NGdzOCt1aWpHREJnQUJZdlhveXNyQ3pNbVROSGJMcU10V3ZYWXVUSWtjakt5dkw1cFBRMWhsOSsrUVhqeDQvSDRNR0RzV1RKRXRoc05nQkFiVzB0WnMrZWpheXNMSXdmUHg2Ly9QS0x0TTlkZDkyRmtTTkhZczZjT1pLNkk4cW5uMzZLNGNPSFk4aVFJWGp0dGRmZ0hUVHVQWWJ2di84ZTc3MzNudlQ5NmRPbnNXREJBb2twTFZ1MkRFT0hEc1hZc1dPbE1aak5aa3lmUGgydnYvNDZoZ3daZ29rVEo2S29xQWdBOE1JTEwyRC8vdjNTOFZhdlhvM1ZxMWRmOXRyczJiTUhFeWRPUkdscEtlYk9uWXVKRXlkaTU4NmRBSUNubjM0YVR6enhCQ29xS2pCeDRrUk1uRGdSTE10ZTluanIxNi9INjYrL2poa3pacUJmdjM1WXVuU3BOQS9MbHkvSHFGR2p1aXhjdVBDRFhidDJ6ZjN3d3crakthVUJBRFNVVWhXbFZDa0lncExuZVViYzNNQkdEQVlEYW10clVWdGJTMncyRzNRNkhVNmZQZzJqMFlqczdHeHMyN1lOUjQ4ZVJXVmxKY3JLeWxCUVVJRGk0bUxVMWRWSnY1K1hsNGQ3N3JrSGdpQkk0NTA5ZXphT0hqM3FjUTRiTjI3RXFGR2p3RERNRmRmMjVkYkR1WFBuTUdIQ0JBd1lNQUNmZnZycEZkZmtoUXNYTUhQbVREend3QVBvMzc4L0ZpNWNDTWgwYzQrdDhzUUc5R2pmRXAxNmpjRFNWOTdCNlJMWGlWTGVnRmtqT3FIN3NHbjRidE42ekpwd0sxcjNtSUFTTzhXdWorZWpSWXMrT0dtbW9KVERJNE5TTUd6Mlc2NzlxdmVoUzRzV2FObTZFMmJNbTQ5Rjg1L0Uzbnd6K0xvVEdOQytKVVkvK0N3MnJGK04wVDNiWXRUanJuMU9yRnVHbGkzYVl2N3JLL0hLMGpsSWlvbEMxclFuTUgvK2ZFeWZQaDNqeG8zRDRNR0RrWm1aaVk0ZE95STFOUlVhQlFGUmFoQVpHVWxDUWtLSVZxc2xhcldhVVNxVkN1S3lLYXBYcmZsMjhPSUhSLy9Zc20wZmVxeWFvNDdTUGJSclNnczY5cUdsZFAzYWxYUll0MVRhZXNUamxGSktUNnhiUmx1MmFFdWZlZXQvZE8ybksyaW5sSlowMmJvVDlFYklxbFdyNk50dnZ5MjkvL0hISDJuLy92MXBXVmtaZFRnYzlNNDc3NlJyMTY2bGxGSzZZTUVDK3E5Ly9Zc0tna0FQSHo1TWUvVG9RYTFXSzMzOTlkZnBmLzd6SDNya3lCRTZkT2hReW5FYzdkV3JGNjJ0cmFVSER4NmtJMGVPcEhxOW51cjFlanBreUJCNjh1VEp5NDVCcDlQUjd0MjcwN05uejFLZTUrbkNoUXZwRzIrOFFTbWw5UDMzMzZlZmYvNDVwWlRTUTRjTzBYNzkra243bVV3bWFqUWFhWHA2T2pVWUROTG41OCtmcC8zNjlhTVdpNFZhTEJZNlpjb1Urc3N2djF4MkREVTFOYlIzNzk2VTR6aEtLYVZMbGl5aGE5YXNvWlJTK3ZycnI5T25uMzZhT3AxT2V2YnNXWnFabVVudGRqczFHQXcwSlNXRkhqaHdnRkpLNllvVksrajgrZk9sZVowNWM2WjAvR0hEaHRIQ3dzS3J1a1pEaGd5aHVibTVEVDQvY2VJRUhUTm16RlZmNjQ4Ly9wamVkdHR0VktmVFViUFpUQWNPSEVoLy9mVlhTaW1sTnB1TkdvMUdPbVBHRFByamp6OVNudWQvS2l3c25BQ2dHWUFtQUtJSUlXRUFnZ0FFTUF5akpvUW9DU0VLdFZyTkJBUUVFQUFrTEN5TXhNZkhJems1R1FFQkFXamV2RGt5TXpNeGVQQmdqQnMzRHRPblQ4ZjgrZlB4MEVNUFllREFnVGgrL0RoWWxnV2xGR1BHak1IT25UdEJLY1c1YytmUXQyOWZPSjFPRDh3WU4yNGN5c3JLR21ESnA1OStpdWVmZjk3ak03ZXFqUFQwZEJnTUJ1bnpqei8rR0dQSGpvWFpiRVpWVlJVeU16T1JuWjN0c2UrcVZhdnc5dHR2Uys5UG56Nk5ybDI3b3F5c0RGYXJGUk1uVG15Y3NjV2xqOGJXcmQvanZxd08yUC9OZXhnemVBZysrZmtjaE9JRDJISFdnSWtQUG8zYlI0N0Jvc2Z1Qmx0OUZMdFAxbDhWQ3huMTZISjgrT295dkxqc1pmUnBHWVNDZzd0UmFHVXdmZDRpakI0ekdXKzgrd0ZtanV2dGVnSjh2d0UwTEFGOHhSbmtGQmtRb0hEaTlQR2pVcHlhZDBpSHpXWURUeWtnOEI2cXA4dnJLVEFVVU14K1k5UERVeWVPWDdsay9zeWhHbnNadHUzT1JmNnZoMURQQitEQnA1L0JtSEgzWUdDWGhFdFBvZTgzQUJGSlNGQVlVV1VMUkdJRWcxMjc5dDBReHJaMjdWcU1HemZPNDdNMmJkb2dJU0VCYXJVYTNicDFRMFZGQlFEZ3A1OSt3b3daTTBBSVFmZnUzWkdjbkl3VEowNEFnRlIxTlNRa0JFcWxFa0ZCUVdCWkZwczNiMGFUSmsyd2R1MWFyRjI3RmpFeE1UaDA2TkJseDNENDhHRjA2TkFCYmRxMEFjTXdXTEJnQWNhUEh3OEFtREZqQmhJU0V2RDIyMjlqNTg2ZHFLbXBrZllUZjk4N0lEUXVMZzRxbFFydnZQTU9UcDgralpVclZ6WlFNYnpIRUIwZGpTNWR1bUQzN3QxZ1dSYTdkKy9HcUZHdVpKQWZmdmdCSVNFaFdMbHlKUTRjT0FDR1lYRCsvSGxwREQxNzlnUUFaR1Jrb0tyS3BXa01IRGdRT1RrNTBPbDBPSG55Sk9MaTRxNUhXNzlybHU3ZHV5TThQQnhCUVVGbzM3NDlLaXNyQVFBQkFRRUlDUW1SNnFzeERETzRXYk5tYjN6enpUZFQzS3BwZ0tpYUFoQlZVd1VBUnN5ZUlZUVF0eU9OMk8xMjhEd1B1OTB1cWFaNnZSNTFkWFZTWUx2UmFFUnViaTVPblRvRnU5Mk9HVE5tNFBQUFB3Y0FmUFhWVjdqbm5uczg2cjNsNXVZaUpDUUVDUWtKVjNXdWphMEhBT2pjdVRPQ2dvSVFHeHVMWWNPR2VURC94dTZMaElRRUpDUWtRS3ZWNHE2Nzdtb00yRmhzVy9NWjloY3llR3p4TW16YnN4ZTNkMURobGRmZWQzbFFBR2cwcnVhdEt2Y3J4L0x1ZlFYSUdHc0RDZmVLbDJFNUJ3QUZOQnFYZzdaRmVoOWs5ZTNzb3B3bUN6aWJIaGZPbjBkaFlSSENrMUlSRzZLOFhQY29Ra0VJcFlKVU84M3A1QmllNTVuaXZPMEp2VnEyZUMxQXEzMERRSUpTbzRZQ0FNZXo0Snc4QUFXVW1vWk9ZcnZORGlYRG82YXlFcFdWMWVpU05RVlp2ZHJlRUZ0aWVIajRaYXVoTWd3anFRc2N4MEdqMFVqZmFiWGFLNm8vTnBzTm9hR2gwaloyN0ZqMDZkUG5zbVBnT0E1cXRWcDZIeElTSXBYRmVlMjExN0IrL1hyMDZORURJMGFNdUtyekRBc0x3OGFORzVHYW1vcHZ2dmtHdzRZTlExbFoyUlhuWWVyVXFmajIyMit4ZmZ0MkRCbzBTQW95dGRsc2lJeU1sTTVwN3R5NVB1ZFFQbmRLcFJMang0L0g5OTkvajNYcjF1R3V1Kzc2MDIxM2hCQmNJWTg3UWExV3Z6Uno1c3huTm0zYWxDaXFwaktBRTRHTmNkdVRJUWdDY1FmbkVrRVFpTVBoOEhBcTZQVjY2ZDZ5V0N3b0xDeVV3SzF2Mzc3SXo4L0h1WFBuc0czYk5reWFOTWxqTUd2V3JNR0VDUk91K3p5bzFXcklTNnRkelgyaDBXZ2FBellsanYrNEVrOHRlQlo3VCthanRMUVFlclByeGxFMDY0Wk8wU3I4c081L0tDd3R4YW92TndDQkxkR3RZd3ppWStJQTFPR1hnOW5JUDdrTEY2cjVLdzY4WlpjTVJDaFliUHBtSGNwSzgvRFl1RXowdnVkRm1Fd21ORW0rQlpiYUtnaWg4YmlsWlRNb0JSWUJha1dET0RWM3hWdkNzaXdVaEFCVUlDekxFWjduR1VHZ3pOQ0hYKzNYcEhubWg1bnR3MmJ1MnJnRzU0cEw4ZTJxTmJDUUVHUjBhWTFiT25SRUlDeFl2Mm9kQ3M4ZnhjbThPbWw4ZlhyM0JLZlhJU0VqQ3c4L09BMXQ0c09Ra2RIbEQxL1lhOWFzd1IxMzNIRk5UL3N0VzdaSWJ2YnM3R3gwN05qeGl2dFVWVlZoekpneG1EQmhBbHEzYnUyeFlIeU5vWFBuempoNjlDajBlcjMwUHg5ODhJSGt0UjAzYmh5NmQrOHVxUWxYa2wyN2R1SGxsMS9HYmJmZGhsZGVlUVZ0MjdiRndZTUhyemdQM2J0M1IybHBLVmF1WElrcFU2WkluMmRrWklCbFdVeVlNQUVUSmt4QVFrTENWUVdmVHBvMENldlhyOGZodzRldnlYaXUxV3BSVjFmM3A0QmZlbm82amg0OU9xTlhyMTR2RlJRVTlQRGxXQUNnRUFTQkVkbWI2RFdsbE1LWFUwSE0xckhaYkZJSi9ieThQSnc5ZXhhVEprM0NvNDgraXFGRGgzcFVDZUU0RHJ0MjdjTFFvVU92eTNrVkZoYUNVZ3FIdzRIZHUzZWpRNGNPVjF3UE9wMU9zamYvOU5OUGpjV3hNWGpzcGYraWV2NUN6QmczQkJ3Rm9sdDJ3Y3N2ejRGUzNRVExYdjhYWnM1N0hnUDdyWUk2ckNtZWVlVnRwSVVDR0h3blJxVjlnK1VQMzRaUFcvZERpNlpoMEYzaEpEVEovZkhLMGdmeDFMOFhvZSs3SEtLYWQ4VnpDNmZnOU9uVGlPNDRCSm10TCtEbmJ6NEQ2K1NoMElhZ1pZb0dBWEI2eDZoSjhXbFFLQWdSQkNJSVBBSEFESjc0eU5UWC8rL2had2pScGl4NCtYVVVQVElQSTI3dEIwVkFCTzViK2hxR3R0SUNHSW9sRHc3QnN4OCtqUjlYeDZKOXdxV3FvOE1mZmg2UGx6NkJOeDZmZ3VVOEVOMnFLMTdxUHhsQStCKzJZRm1XeFo0OWV5U0QrTlhJMHFWTE1YUG1UR3phdEFrVkZSVll1blRwRlcvbzhlUEg0L1RwMDhqS3lrSk1UQXdVQ29YazVtOXNEQWtKQ1pnN2R5NG1USmlBbUpnWUFKRGM3ak5tek1EQ2hRc1JHeHVMMk5oWUNJSUFnOEdBc0xBd2pCczNEdlgxOVRDWlRCZzFhaFNDZ29Ld1pjc1daR1ptWXZYcTFSZ3pab3pyd2FsUVNEZkk1ZWFCRUlLSkV5ZGl5NVl0U0VtNVZOZHo0Y0tGZVBUUlJ6RjI3RmhRU3RHdVhidXI4cWFLUFFOYXRXb0ZwZkxxd3p1blRwMktPWFBtb0huejVoZzllalNtVHAxNjNkZkQ4ODgvangwN2RxQzJ0aGJIamgzRFN5KzloUGZmZngrdFc3ZkcxS2xUTVdyVXFJRnhjWEhOQmcwYTlOYlBQLys4MFoyR0phL3N6QU1BcFZSd3gyNUNvVkJRa1JDbzFXb2FIeDhQczltTVU2ZE9TV3p4czg4K1EvdjI3VEZ5NUVnSWdvQTJiZHFndUxnWTk5NTdyOGY0ZnY3NVovVHQyOWVEeVFQQWhnMGI4TnBycjhGa01zSHBkT0xubjMvR0k0ODhna21USmpXNkhrU1FHanQyTFBSNlBYcjA2Q0daRHk2M0hod09CKzY5OTE0cDlPYUtaWXRZaHdsV0I0UHdVSy9PMDRJVDlYbzlna09qb2ZaWUJ3TDA5WG9FUjBaZVUvU3Z3RHFnTjlzQUJqaWJrK01SemxGZFhZWGFlaDBjTmx1RGJBSTVxTW15Q0pocGQwOVZMUC9QZnhkRWh3Y3Rna2Nnc210ODJ1QndhTlNlaE5WbTBRUEtZR2g5cUtTc3d3S2pqVWQwK0I5ZmF2bnMyYk00Y3VRSTdyNzc3bXZldDY2dURxR2hvVkNwVkZlOWo4MW1BOGR4SG1Xa3J6UUdsbVZoTnBzUkdSblpZSUhaYkRhRWgxOGI4SnRNSmhCQ0VCd2NmRjNtd1dBd1FLMVcvKzQ4eUNsVHBqU0l1OXU0Y2FPSDUwL3NrWEdsY3k0dUxzWWpqenppOFZuNzl1MnhZc1dLM3p5K21wb2FhTFZhTUF5RGYvM3JYODdFeE1UWDNudnZ2WTlPblRwbGQ2ZGtjZTdONmE3ekpoQkNCSGtoUzQxR0E3VmFUY1hhYm1McEk3Rm9aVlJVRk9MajQyRTBHcEdUazROVnExWjVuT3VubjM2S1BuMzZvRldyNnhmUUxpYnJ5ME5CR2xzUDJkblpXTGh3SWI3Nzdqdm85WHBFUmtiZVhQWFlkRG9kY3J4QVRYUVNpTTFXNU4yalpLQW1yNXZHVkZaV0prVkZSVDFEQ0prQnYvamxieXFDSU9EdXUrOUcwNlpOd2ZNOFRwMDZoYSsvL2hvaElTRXJkK3pZOGVIdzRjTkxDU0VPTDNEanZjQk5LajB1Z3B1OEc1WUlicVdscFNnb0tNQ3NXYlBRcDA4ZnRHL2YvcWJKTHhXQmJjT0dEWmNZL2MwQ2JISlFLeWtwOFFBMWVjTVZIMHhOVEkxaUJFRWdKcE9wbTFhclhlaXZtZWFYZndxNFpXZG53MjYzSXowOVhYSWc4VHkvSlRjMzk3MTI3ZHFkQnVDUXNUZW51N2tNNys2eElJaU5ZK1RnSnBZY0Y3MlhZZzIzbEpRVXFXRGx6UUp1VnFzVmhZV0ZIa0hRTndXdzZmVjZaR2RuK3dRMWthbjVVajlsV1FTRVVzclliTFpoYXJWNkVmeVZiZjNpRjFCS0Q1ZVhsNytUbUppNDF3dmNPRGU0U2N6TlhYNjhBYmcxcHBhSzRKYVdsbmJOWm9jYklYOTZFcnpCWVBESjFIUTZuYzhLSFY3cXB3UnFEb2Rqc2xLcFhBU2dsWDlKKzhVdnJrcTlDUWtKa2JXMXRXOUZSMGR2cHBReXhCVTRSaWlsSE54T0JjR2RVdUFtT1JRdXh3UDFBWlMrZmdOcGFXbS9LUzNxYnd0c0pwUEpwMDFOQkxYTHFaOXlVR05aOW1HRlFyRVlRSXgvT2Z2Rkx4N0FreElWRmJWWXI5Y0hoNGVIZitNdWQwUzhOVFlSM0p4T3AwOXdhd3pVeEsxRGh3NDNWYU1ZNXMvNllZdkYwcWlqd0VjVFk5SVlxSEVjOTVSQ29WanVCN1hHN1EvMzNYZmZUVFdtd3NKQy9OVWFkYi84OHN2bzNiczNoZzRkS3FVYVRaNDhHWk1uVDhiMDZkT3YrKy90Mzc4ZjE3SG5iMHhZV05nU3M5bDhMd0N0TEpoWG5xa2daU2s0blU3aXJscEpSN1FBQUNBQVNVUkJWTk1tSmREYmJEYVBRTjY2dWpvcGVUNC9QeDg1T1Rtd1dDdzRlL2FzbE5IaExmUG16Wk15WlJxVHpaczNTeGtPZnpsZ3M5dnQxK0w5SlBJT1VxSk43WjEzM2xGeEhQY3N3ekF2d3BWUzRoY2Z3dk04amh3NWNsT042Y1VYWDRURllwSGVHNDFHeko0OSs2YWR3NU1uVDJMTGxpMzQ2YWVmc0czYk5uVHExQWtxbFFxdnZQSUtubnZ1dWVzK3Z6VTFOVmkrZlBrMWhlejRrb3NYTCtLNTU1NFQzd1lFQlFVdHJLeXNmRWlqMFFRMUFtNEtRUkNJdlB5UnU5S3VCRzRXaXdWR283RlJjSHZpaVNjOFVxM2tjdXJVS2FsZ1FtTlNXVmtwRlNmNFM2bWlITWRkMXZ2cFpWTVRjejRoTDhmeTY2Ky9CcWVucHk5aUdPYkp2eU1ZSFRod0FNMmJOOGYrL2ZzUkZ4ZUh2bjM3U2psMVpyTVoyN2R2QndEMDZkTUgwZEhSMG43bDVlWFl0MjhmSWlNak1YRGdRSjlWRms2ZE9nV05SaU1WRWF5dHJjWE9uVHNSR0JpSWZ2MzZlYWdUUjQ4ZVJWNWVIdnIxNjRmYzNGemNldXV0a2xxeWI5OCtsSmVYbzNmdjNraE12TlFPb3F5c0RQdjI3VU5vYUNnR0Roem9rZVlGdUxJaWFtcHEwTDU5ZXdCQVRrNE96cDQ5aTkyN2QyUGJ0bTBBZ0w1OSswcnhaOFhGeFRodzRBQ1NrNVBScTFjdkNRZ3ZYTGlBbUpnWTdOKy9INm1wcWVqU3Bjc1Z4MEFweGQ2OWUxRlJVWUdlUFhzaU9UbFoyaWNuSndkUlVWRW9MUzFGYm00dSt2WHJoOFRFUk96Y3VST0hEaDFDUkVRRTl1M2JCN1ZhTGMxRDA2Wk5ZVEtaR21XbGh3NGRRbEpTRW5yMTZnVkNDSTRkTzRiVTFGUm90VnFjUG4wYW5UcDF3b1VMRnhBWUdPaVJZN2x1M1RxTUhUdjJpdXZoK1BIamlJNk9SbEpTRWdCSWViT0RCZzNDc1dQSGNQVG9VZXphdFVzS2NCMDZkQ2kwV3UzYzFxMWJxNGNORy9iUnl5Ky9ySGVybEtMZHplbFdTM2wzcVh4UkxZWEQ0U0NDSUZDajBRaTFXbzNFeEVRUFZaUVFncEtTRWdRRUJIalkyOFRyNTZ0czA5R2pSNUdibTR0dTNicDV4TUFKZ29BZE8zYWd2cjRlUTRZTWtZNzN5eSsvb0UyYk5nZ0xDd1BMc2podzRJQjBMZXgyTzdadDJ3YWxVb2wyN2RyZFdNWkdLZlVBTlhreXUzZlRGVmx2QWc5UU8zLytmRVI2ZXZyU3Z5dW9BYTR5T2s4KytTVDBlajJXTFZzbVpRUG9kRHJjZHR0dEtDMHRSV0ZoSVVhUEhvM2EybG9Bd0xGanh6QnAwaVRvOVhwczNyd1pEenp3UUlQamJ0bXlCZlBuejVmQThPTEZpNWc0Y2FLVS9EMW16QmdwTFdYMTZ0VjQrdW1uWVRRYXNXalJJano5OU5NZUtzWFhYMzhObzlHSUtWT21JRHM3R3dCdy9QaHgzSDMzM1RBYWpkaTVjeWNtVDU3Y3dEYXpidDA2andUbXVybzZsSmFXUWhBRUZCVVZvYWlvU0xUellPZk9uWGpnZ1FkZ3NWanc3cnZ2U29Hc3BhV2xtRFZyRnQ1NDR3M29kRHJNbWpVTHUzYnR1dUlZNXMyYmh5KysrQUlta3dsVHAwNzFLRlcwYXRVcVRKOCtIZSsrK3k1eWNuSlFYKzhxNmxCU1VvS2FtaHJZYkRZVUZSV2h0TFQwaXRkdjU4NmR1TysrKzJDeFdQRFJSeDlKa2ZJYk4yN0VrU05IY1Bic1dUenh4Qk1BZ1BmZmY5OURQYU9VNHZ2dnY4ZnR0OTkreGZWdy92eDVQUC84ODlML2JkMjZGWjkvL2prWWhrRjFkVFVxS3l2QnNxdzByNkt3TER2TDRYQThQSEhpeEdnQVl2RktGUUNsSUFnS0FBcEtLV0ZaVmxKTFRTWVRxcXFxWUxGWVVGMWRqWnljSEEvbVZsVlZoYTFidDZKZHUzYkl5Y2tCcFJSbnpwekIrUEhqVVYxZGpjOC8vOXhqN2w1OTlWVzgvdnJyc0ZxdGVPU1JSN0JqeHc3cHV3MGJOdURvMGFNNGZmbzB4b3daSTdINzVjdVhTeVlNbzlHSUo1OThVZ0xDcVZPbll2djI3Y2pQejNkbGZ6Uld0dWlQMkU2ZlBvMXZ2LzBXcjd6eUN1Yk5tNGVwVTZkaTVNaVI2Tk9uRHpwMTZvVFUxRlFrSlNVaE5qWVc0ZUhoSkNnb2lHZzBHa2FwVkNvVUNvV3lzTEF3VGhDRU4rbmZYSVlQSDA2enM3TXBwWlNXbHBiU0RoMDZVS2ZUU1d0cmErbXhZOGNvcFpTeUxFdG56SmhCdDJ6WlFpbWw5UDc3NzZlYk5tMmk3dExRZE1HQ0JWU24wMUdqMFVqVDB0TG8xcTFiNlpBaFEyaFZWWlgwTzZXbHBmVE1tVFBTOGJLeXN1anAwNmNwcFpUMjc5OWZHa041ZVRudDNyMDdwWlRTNDhlUDB4RWpSbEJYTldwS3Yvbm1HL3JVVTA5UlNpbjk5Tk5QNmV6WnM2blQ2WlMrczlsczB1OEpna0N6c3JLb1RxZnpPTithbWhyYXRXdlhCdk13ZVBCZ2FRd1dpNFYyN3R5Wk9od09tcE9UUXdjTkdpU040WU1QUHFEUFBmZmNaY2R3NXN3WmV1dXR0MUt4UitldVhidm8rUEhqcGQrYVAzOCtmZjc1NTMxZWowMmJOdEZaczJiNS9NNW9OTktPSFR0NmZEWnExQ2g2K1BCaFNpbWxITWZSbmoxNzB2ejhmUHJkZDkvUmQ5NTVoMzc0NFlkMDRNQ0J0TEt5a280ZE85WmpqbzRjT2RMZ3R4cGJEM2E3bldaa1pORGk0bUpLS2FWMzNua24zYkZqeDJWTEp4a01CcHFXbGtZNWpxTjJ1LzJEMmJOblp3Qm9BU0FCUUJTQVVFSklJTU13R2dCS2htRVVHbzJHSVlTUXdNQkFFaHNiaTRTRUJEQU1nMDZkT3FGUG56NFlPWElrSmsrZWpDWk5tbURGaWhYNDl0dHZwUnA1SDMvOHNYVC85K3ZYRC9uNSthaXNyRVJHUmdic2Rqc29wVGg0OENDbVRKa2lsUzFhdEdpUnRNLzA2ZE94ZnYxNlVFb3hkdXhZbkRoeEFwUlMxTlRVb0d2WHJxQ1U0cGRmZnNHSUVTTWdzc3kzM25ycnhxbWk1ODZkdzRVTEZ5VDFVOTd6VTdTcE5SSjhLekcxNU9Ua1JZU1EyZmdIaUppdjJMUnBVekFNQTZQUmlKQ1FFS3hldlJvclZxeEFhR2dvY25KeXBDZDdZV0docEY0U1F2RHZmLzhiZ012emJMZmJNWC8rZlBUczJWUEs3d1JjcFdPZWYvNTVXQ3dXQkFjSG82S2lBanpQUzZ4SVBKN2MxcE9ibTR2eThuS01IRGxTc3VHMWJldXFkako1OG1RVUZSVmgyTEJoU0UxTnhiUnAweEFRY01uOGVlVElFYVNrcEZ4VjNCUFA4OGpQejhkVFR6M2xNVjR4K1Y2cjFVcnFlWEJ3c0ZUSnBMRXhGQlFVb0czYnRwSjZucGFXSnRYakYrVjZwUVJkdkhoUlVyMlVTaVhhdEdtRHdzSkNwS2VuWStmT25YQTRISmc2ZFNvT0hqd0lwVkxwTVVlTkpYbjdXZzhSRVJHWU9uVXFWcTFhaGNtVEo2T21wZ2I5Ky9lL3FyWGwzaDRZTjI0Yzl1N2QrOEdKRXlmcXZiVXJkODRvTCthWDhqeFBXWllWKy8vQlpyTkphbWg1ZVRsaVkyTlJYVjBObFVvRmhVS0IwNmRQUytXazVPc29QejhmRm90RlVyY0ZRZkJZRTNMelJXcHFxa2UxRjE5U1ZsYm0wU05WcFZMZEdHREx6OC8zQ1dvK0tuUTBDT2tRYldvdFdyVDR4NENhWEl4R0kxaVdSWEJ3TUxaczJRS2owWWd2djNSVkpYNzAwVWVsLzR1T2prWkZSWVdVRUw1bnp4NTA3OTdkNVNGaUdHemV2Qm56NXMzRGUrKzlKK1Vycmw2OUdvbUppVml5WkFrQWVLZy9VVkZScUt5czlMQ2ZpWiszYmR2V1o0WFp2THc4UFB6d3czajIyV2R4N05neFBQamdnOWkyYlJ1aW9xSXVlOU1TUWp5cXN3S0FRcUZBZUhnNFB2endRNmtza2lpaSt1MUxHaHREVEV5TXh3MVNWbGJtQWZMWFU4VGZFcHZ1aUwvVnZIbHpWRlpXSWpBd0VJTUdEY0xpeFlzOUdxWllMQlljUDM1Y2VpaGRhVDBBcmlUOEVTTkdnR1ZaVEpzMnpjT3U2bXRldlVXdFZqL1FwazBiWWRTb1VlKy8rT0tMYUF6Y1JBRGlPRTRLQlJFZEFZUVFYTHg0RWQyNmRVTnRiUzBVQ29Ya1FEaCsvRGg2OSs0dEhVOWNROUhSMGRpMGFaTlBPN0I4ek9YbDVjak16QlRIS2ozQTVDYU9xS2lvQnVyOEh3NXNKU1VsVXRNVmI2Ym1iVlB6RmRMeHpqdnZxTnlPZ2puL0pFQjc3NzMzTUdYS0ZLeGF0UW9qUm95QVNxVkNiR3lzVkErcnVMZ1l1M2J0a2tyc1RKczJUZktrNWVibTRxdXZ2c0tHRFJ2Z2REcWhWcXVSa0pDQXQ5NTZDN2ZmZmp2YXRXdUgvdjM3SXlZbUJsdTNic1dPSFR0dzRzUUpuRGx6UnJLeFRabzBDUXNYTHNTRER6N29rWVBYdDI5ZnZQTEtLM2oxMVZmUnYzOS83Tml4QTBsSlNaZzhlVEtPSERtQ2JkdTJZYzZjT2FpcHFZRmFyWmFldm1MbGlPWExsemM0MS9Ed2NDZ1VDbnoxMVZkbzBxUUoyclZyaDVpWUdEend3QU9ZTTJjTzVzMmJoN3E2T216WnNnWC8vZTkvTHp0dmpZMmhhOWV1SUlUZzdiZmZSa1pHQnBZdFc5YWdTc1cxZXBzM2JOZ0F1OTBPanVQdzNYZmZJVFEwRklNR0RjTDk5OStQSlV1VzRNa25uOFRldlhzUkZoYUd0TFEwRUVJUUdCaUl0bTNiSWprNUdVVkZSUjc5QURadjNvemh3NGY3dk5sOXJRZkExVTFxOE9EQjJMQmhBL2J0OHl5QW1wU1VoT0xpWXZ6d3d3OElDQWlRQU1KYkZBckZRd3NYTG5UdTNMbnovZjM3OXpld2k3cmY4NElnU0hGdWxGTGljRGdvSVFUeXB1TjZ2VjRDdHRUVVZMejc3cnVJakl5RXpXWkRjWEV4QUtCMTY5Wm8zcnc1RmkxYWhQSGp4K1BZc1dPd1dDeVlPM2V1TkE5ZHUzYUZ5V1RDL3YzN3NYanhZZ0JBMTY1ZDhmbm5uOFBoY09DSEgzNlF4cGVabVluLys3Ly93M3Z2dllkV3JWcGh6Wm8xVUN4ZHV2UVB1em1ycXFwd3p0MmpRTjdNMkdBd2VCU0k5RTZUa3NlcHJWKy9mZ25ETUF2K1NhRDJ4UmRmWU5Tb1VUaDQ4Q0JhdEdpQnVYUG5RcVZTSVRFeEVZbUppZGkzYngvaTQrTXhZY0lFUkVWRklURXhFYTFhdFVKU1VwS3JGcFZTaVJkZWVFSHlMQ29VQ25UdjNoMUJRVUhvMGFNSHpwdzVnL1QwZExScjF3NHFsUXFIRGgxQ1dsb2FoZzRkaW9TRUJNVEV4Q0FqSXdOV3F4VkhqaHhCdDI3ZGNPalFJVXlmUGgwS2hRSzMzWFliY25OemNmVG9VYlJwMHdZVEprd0F3ekJJVDA5SFVGQVFkdTdjQ1l2RmdzV0xGMHU5S3RldFc0Y21UWnBJSGpxNU1BeURYcjE2WWQrK2ZhaW9xRUJhV2hwQ1EwT2xpcktpK2pacjFpeUpxUVFHQm5yVTZZcUxpME9MRmkwYUhRTWhCQ05IamtSMmRqYU9IeitPaVJNbk5tZ3kwckpsUzhUR3h2cThKbEZSVVEwOGQ5dTNiNGZGWWtHM2J0MWdNQmpnZERxUm5wNk85UFIwaElXRllmdjI3WWlLaXNLenp6NHJsZlNKaUloQXQyN2RFQjBkamVqb2FHUm1aa3FlNk9lZWV3NlBQLzU0Z3lqK3h0YURuRHcwYjk0Y0F3WU04TmhQcTlXaVk4ZU8yTE5uRDNRNkhUcDE2b1NBZ0FBb0ZBcDA2OVpOK3Ird3NEQjA3Tmd4NDg0Nzc3Uy85TkpMcDJXTVQwUTRLcXFjY2lhblZDcUo2TlFLQ1FueHFLUkNLVVZrWkNTYU5XdUdFeWRPSUNrcENWbFpXVWhMUzROV3EwVldWaGFxcTZ0eDhPQkJ4TWJHNHQ1Nzc1WFU3ZDY5ZXlNdkx3OWxaV1Y0OXRsbkplOTF0MjdkVUZwYWlweWNIRXlhTkFteHNiSG8ycldyVk9ycThPSERxS3FxUW54OC9CK1hLNnJUNlpDZG5lM0Ixcnl6Q3J6RE91UnhhbUx3clR0T3pTOSs4Y3NORUxQWi9PK1FrSkQvQWJDNUs0TTRBTENRVlFZUmMwdVZTaVYxTTJJcTVwV0tTZk1SRVJGU1htbHljakpTVWxLUWxwWjJ3NUxtL3hCVjFHYXpTUjNhS3lvcVVGdGJLN1hIdTV6NnlmTTg1R2xTRE1NczlpODF2L2pseGtsd2NQQmNuVTVuallpSVdPZG1aaFR1V0RhdjlDdnFJblhFbGFORkNHVVlCZ3pEZ0JBQzhXK2xVZ21WU2dWM2NqMDZkdXo0dTJ2ay9TbkFSaW5GK2ZQblVWaFk2S0YreXF0MGlCNVFlWkZJdDZ1V0VSUGEzYm1mL293Q3Yvamx4a3BBZUhqNFkxVlZWWmE0dUxpdDFKVmM2bTF2Zzd1SGd1QjBPa1hQcUFoeUlJUklkalp4RXdGT285RWdQVDNkWnhPWG14clk1S0FtTmpJV0hRVVdpK1d5bFc4RlFTQTJtMjJZdTBxSFAvZlRMMzc1Y3lRbUppWm1aa0ZCZ2JGRml4WUh2SmdiQlVBRlFSQzlvNUFCR2hHTFY0cWJITlJFWUFzSUNKQ2FLdjhsZ0syd3NCQVhMMTVFV1ZtWlQwZUIzVzV2a0ZVZ0MrdGdUQ1pUTjNjOU5YL3BJYi80NVU4VVFraEtjbkx5UThlUEg5ZDM3dHc1eDgzY1JKV1VpbjBSUk5ZR21ZTkJWRVc5R1p0U3FZUmFyWVphclpiNm12NVJjdDI4b2xWVlZaSmRyYnk4M0tkZHJURVBxRmpPT3pRMDlDVkN5RUQvc3ZLTFgyNEtjR3NhRXhNVDJxbFRwOU5mZi8yMXpRMWVrcWNVUG1xMnVWVlM4Vy81NTVCL0xvYSt5SHRjWEZmR2RqMWFoNW5OWnB3NWMwWmlhMklPcUhlYlBJZkQ0ZUVCRmRYUHUrNjZTd0hnbWZyNmVuODViNy80NWVhUzRabVptVFVwS1NtdlhiaHdRWkF4TjFmNmdmc1A5eXZjV1FuRW5VSUgrZVowT3FYTlhUVUU3ZHExKzBQQVRmbDdhejVSU3BHWGw0Zmk0bUpVVkZRMHNLczFWdExiN1N3Z0FKaGx5NVl0Y0RxZE42VHhpdGhUMGJ2cXhKWEVZckVnTUZBTFFoai9VdmZMUDQyNTNiMTE2OWJxbEpTVXo5MDRKc2pCalJBUnh3VEs4enpoT0k2NmFSc1Z2YVJ5RmRYYlk5cStmZnZyN2t4UUJnVUYvcTRENU9YbG9iYTJCbnE5RG1hekNWYXJCWGE3cEhMS0tuUTRpUmlkTFBlQTF0YldUSFU3QzI2SThMd1RUaWVQYXoxdm5VNkh5TWlJYStvNWFUQVlFUklTN0RPUzNDOSsrU3RKVUZEZ25QejhDNVczM0pLeUZZQTNjNVArVHhBRWdlZDVPSjFPS0JRTTRUaU9LcFZLaWFIWjdUWllyUmFZelNibzlUclUxdGFnb3FMOHVyYnVBd0RsdGR5bzNsSldWb2F5c25KVVY5ZWd2bDRIZzhFSXM3bEJqd0kzdUVtZ1J0eFVsZFRXMXZRTkNBaDRCamV3THB6cmFTSGd0NXkzYUFDOVdqR1pUQWdMQzhYdm1XTy8rT1VtRVdWOGZQekR4NDhmcSt6Y3Vjc3hYOHpOL1VvRVFRRFA4NVRqbkdBWXppdmtRd21WU2cyMVdnT05KZ0JhYlNDQ2dvSVJHaHJhSUNmNGR3MjJzV3FYVjVMUzhqSWNQM3NCT25kR2djRndLYW5kYkxiQWJMV0J2UVJzSWxzanZDQVFLbENtcUtnd0lTZ29hRDZBbEJ0THF4a3B6dVphVlc1NWN1OGZ0YzhmSWZwamU2Qm9sb0dRcUJzVEZrZzVPNncxOVZCR1JFT2pWUU53b21Mckp0aHNnS3BwR3lSbHRQbGIzT20vWlY1dGhUbXdPS01SblJMWHlIL1lVYlhqTUNKdjdRZVZtK2c3aWs2ajdGZytBSUxZUWFNUkhNcGN4N0ZFSURvbDRXcDN1YVYxNjliM3IxeTVzbnphdEdubEFNUkFYZkdWaXA1U251ZmhEdHFWUWtBdWVVY3Q3dEFQdGJzVGxoYkJ3VUVJQ3d1N3BxWXdqdEpjR0l4YXhMWkxhbkJPeW10V2s2Z1ZpejdZZ1AxRjVTQjFaU2l2cVVmWHVGQW9MU1pZTEdhVWxKV2hzTjRNd3RrZ0NFQ0lFc1RwZE1MSmNjVEJPUW5nc3F1OWsydCsrcm40K0NIa1QxaVFsT0thMVVNeFArNWE5dnN0Ky93UlV2TFpjZ1JOL2d4aHZRUC84TitxMi9ZWkRyL3lKYlROV3NCUlZvQm04OTlGbS81SlVBVUV3bkp1Tjg0ZHFFS3p6SFovQzJEN0xmTnFPTEFHaGZwTXhLYU9iSXpuSS8rOXp4RFk5MVpvM0VTZlVXcWcxZ2JnNHRzdlFKMStHMExERzY2bnl1OC9Sc0R0YVFpTDhSeEx3ZnRMb2V6MUdKSTZSRGJZeDN6aVI1UVlPaU0yTmZGYU5KNEI0OGFOSzV3MmJkcGJNdFlteUZnYjRJcHpnMXNscFF6REVJV0NvUTZIQWtxbGF4TXpFZFRxUzIzK2dvT0QwYkZqeDZzbUFwYmptM0gyVkJMaTA1bzFPS2RyQnphbzBUK3REWG8yRFVGaG9ScTc5cFppN3prZHVrY29ZTmJYNFdLZEZZbmhnZUR0UUVWMUhURXJsVkFJVG5DdUNHVkNBTVpTbS8vUXlEZjJ6TXpKVEVYSEc1eGJJRGRpL2pZMWx2bkQ5d0VFVURCdzZxdkEwU0FFUm5oNmpTZ0VFREN3VjVWRDBJUWpNUHpTWXJaWGxZSlhoaUlvS3ZUU0Rxd2RvQVRPdW1vSW1qQUVoSHFtdERpTmRiQVpIUWlNaTRkQzlkdEJtQy9kai8yTFY2TEgybzFvMGl3VUVHeXcxbk5nR0EzaUI0OUFNRk9PL0FLTGova1E0S2lwQnNjcEVKUVFBOCtISFE5YmVRVUVWVEFDWThJOXZxTU9LOHhWdGRERXhFR3QxZHhrOCtyN25BalBnVG9GVUtzQk5nc1FIQmZoT1Q1bkRQcCsreG1JYkk2MHpkcWhlYk4ycVB4b0NZQ0dhNWM2bldqLzNDb1FaY1BQemFjT1FObHFPb2dRRGlpVjBqaW80RVQ4N2ZNUUwvdnMwakE0V01zcndFVEdJU0JRMDJDdDhFYkhmVlVWVllWeFRlTFdBK0I5cWFTQ0lBaUVFT3AwT3NFd0JBNGJKWVF3MUtYQktLRlV1dE9zVkdvRWFOUlFPT3pRS0xVSURRMTEyOXNFMkNyTFFRTWlQYTREQUhDNktuQWtCRVRnUUoyOE5CL3ljMUplcXplaW9xSWVhazZQa3FwSzFOWFZnemhaMk13bVdOUXExT29NSUFvQ2NDNjdtb0pRY0N3TEVFcW9xNlk2c1ZoTS9aVE91dmtjbzBTd2tvQ1FHdzFzbHdEdXR6QzJhOW52dCt3REFPZWZtWWlMdVNvd1NpV0V5b3NJdm4waCtzNGQ3ZnJTZUFycit6K0RwR0V4cUR5bEE4dzZkUGprSnpSTE11TFFmVk5SWjQyRXlsSUdrallSdDc0Nkd5b0dvRTRPaFcvTlI3RktBWHZCR2NUUFhvSHVkN2tLRWhiKzUxR2MzRlNDaU9ZUk1GNm9ROFozR3hFclBkd2RPUG5rVEtnR3pVSzdyQzVYWGhzL3JJZXErd1FrTkhlckU0cEFCTW55UndnVlFIbkJhejZxc1hQd2VMQXhMYUdDQVNaZEtQcXUraENSTVJwUVV6SDJUTGtIOXRDV1VBczYyQk1HSXV0VlYwaysvZTdQc1dmUkp3aHRtd0o3MlVVa1Ava0oyZzFzZnBQTWErUG5CSUdIOGVlVjJIN2dLekNXTXFEMW5SajR4aXdvQVZTdSt5OU9mYmtEK21OMUdIeG1MeUs5c1pyakFIaXVKL2JzejlqOS9FZXduUDRWcmQvZWk3YTNObkdwWk1jMllkL0xYOENTVXdKUzhEaktQOUVpK3JaSDBHVnlQd0JsT0hEM2s5QVZua2ZJN1l2Ui8rbExwZHJ0dVh1d2U5WWlNRTFhZ1MzTVE5eERMNkhiWFgxOXJaV0g5eHpJTHV6WEsrMllTeFdsQWtBRVVTMTF1MGtKejdKdzJ1MVVTUWpzT2gzNDZIZzNhMU9DNk10UTlRdUxXcFVkUWVwZ1hGVCtpSUIzWGtDZ3ZReDV6endITnJRWlVIOFJRVVBub3ZjVDQwQWc0T0pyczNGeVl5SENZalhnV0FkSW0yVDNmSGllMHpVQm05VnFsY0k2YW12cm9LK3Z4dkhDU3NRRmg3cmFjOW5zSUx3QW85RUdvOE5KRkZRQUZTaWhEQWhEd0l4YnNpTDhrVFU3bjZxdjB5ZE1HejhZS2VvL1F4SDliY0QyZS9hN1poRGxuWEJHOXNLb2o1NENNZVhoaDh6eHFKZ3lBZ254U2hldnFEa0ZSZVptakY3ZUVRQUxKNnRFMWVvM1VhWHFoOUhmTDRiQ2FjQ3VJWm5JMnpNTzdRY2tBcndUeXJRc0RINXVDcHpsZTdGK3dCSzBHcmNMRVlIVk9QZmhYbVRzT29XRU9BQk9GandqZjlnSU1KdzZBazE3M1ZXZGcrWENCUVFuOTJ6OGY2a0F3ZWtOYkJIb3MzNDcxQ0V1NnA3M3doU2MrV29YK2o0MkhPWURQNkErYkRER2ZlRXFoTW16ckxSdjRlY2ZvTm5UbjZIVEdOZlRuV2VGSzQ3eHhzMXI0K2NFZ1ljVnlSajc3WnRRQ3dic0hOUUQrWWZ1UUp1ZXNXZ3lmZzZhakIrTEg5cE1kQU9ZMS9pZEhFQTlnVTNUYmpDR2ZqVVlSKzdxQnRCTGF5Mnc2MmdNL1dvMGp0L2ZHNm83MzBMYTBHVFprUkxSNTh1dlVQTCtZN2hRVDJYSHMrTElZM09Rc09CcmRCemNHb0xwUERiM200SDZNWHNSRmRKZ3JUUmhxV0xhc21YL0xsaXc0Qm1CVWdpRVFJRE1ZMG9wQlFVRXlpaWcwQVpRRlp6RVhGdER0YUdCVUNqc0lDd0xjMTAxNG9lUFJHeUxKb2lMamtadFJRVjIvdWRWSkkxOEdjTm5EUUdjT3V3WU9BQ2w0MGFpcWZvUWpuNXlBVU1QYjBWNGtJRGo5dzlHbGZTZzlEeW5hM0xYRlJRVW9Lek1uUU5hWDR1REo4N0FvUXBDc3NJSnM5a09qbVVoY0FLYzFFbkFTNG50RUFRUVFhREVrZHpweWJuOTJ3MnRMem1QVjdjZndhalVFWWhUd1M4K0pMWlBMMWVublpCV2lHa0QxSjhxUjBLOGUzRnFVbkhMNkk2U2FVQ3BCblFuVHlLdTc1TlFBSUF5REUxNnQwZjE2ZFBBQUpmOUpLNm5xNHFwTXFFN29xSXVvajdmam9nT2tZanZHWWtqRDB4RDhwQitpQjg0RFBIdDVmYVdRUFQvNmRRZmZLWU1xamUrZzl6dmRzTm10b090TGtLSXU1eTBOcTBybUZNUFlOY2NCK0o2ZEVYeXlKRUlVcnZucDJjdkhQalhMRGpQamtCVWozNUlIdERsSnBwWFphUG5CQUJSbVpsUU13Q1lNTVIzYjRYNjdHeWc1MDJRY0dQS1JYVzJEWXE5MytEWVFaZHFUcDJsMEJXWUVkWFI1MW9aT0h2MjdMTUxGanp6c1ZzbDViM3NiZFNOMEpUbmVUQXFCZ0xsaWMzT1VxVkNBY0p5Y0FaR1FDQXNqRVlqTkJvTkFtc0tVSCtzQ0h6MGVoeXIvd1VVQU90MG9ENm5CQkdxTTJEU01oQWV4QUJnRU4rM0o2ck9OTGFxcnRaUVdsS0MwdEpTVkZkWG9hNnVGa2RPbkVLSlE0SFdvVXJZN2E1cUhWUVFJSEFjR01KQXpRQzhRQWxBQ2FXVW1mYjhmOFpOSGRybjZaN040ekd5YngrMDV3cXhyZERpUjdCRzZjVmx2dE1HNGZkRmtCRDNsVmVpODBmYjBIdnhkS2k1TXV3ZlB4UjV4MnArODFHRFdqYUhzYUQ0bXZheDdGK0pneCtmUkpkMy9vZVJXN2FnNi8xRDNkb01vRXpzZ2RIN2ZrTEtrRTR3N1ZxRkgyNS9ES3g3djZZUHZJd1JYNjVBZUh3QXppKzVCNGZlMzNIVHpPdmx6c25uWG96aUpsbDBBcUNLUlB6SUxDUm1aU0VwYXlSNmZMb1dUVzhKYkhTdEJBWUd6aW9wS2U0TFZ5VWVEYVZVRFZmNGxvSlNxcUFBUXlsMTl5cmx3UVBnT0JZczY0Q0Q0OEJCZ05WcWhjbGtoc0ZnUUYyZERqcU9BZHVxTFVpWExrakt5a0tYTi8rSGxGN1hGZ3B5VmNCbU1wazhlb0FlUDNVS1o0d1VIYUkwWU8wMjJPME9zS3dEQ2dDVXRST0hLMmFOVUVFZ0JHQ3Fxa3FUUWdQVlR4VFZHbHpUWnplZ3hFSVFIT0NQNzJwTXF2Y2VjQmtyVEhtb09RZEVkcnk4U3o0aXZRT3E5dTRGRHdCT0F5cjI1eUJTVm1HMjZ1QmVsL0czL0ZmVTZWb2hxa1VBQUJhc1JVQlVSaiswbS9jc1V2ckZ3cGd2NytMTkl1Zi81dUQ4OXF0amJRbWp4NEhkdHhwbEJRYjNmV0tGcGRwd3llMFVHUW0yckFST3VYbWpyQXdCcmRJUkhoTUVDQmFVL2JUM2txSGFaQUxDNHBBNGFnSzZ2N1lVeXBKenNMcDNaazBtQk4zU0NTbjNQb3hPRDk0Ry9ibThtMlplTDNkT0FGQzNieDlZd1hXOHlsL3pFTmtoN2VyY2RwSGhzRnloc1ltM0tEVWFzSFgxVi9mUElXMFEyOW9HcXlrY3NkMjZJclpiVjRTM2FBWlZFSFBadGRLMGFkTjd2L2xtVFJNUjNBQkk0QWFBb1FMUHVPeHRUc0lUUUhCeWhHVTVPRGduV040Sm04MFZ0T3NDTnc2MGFTREtDcXRnaXdpSHRuVXFvbHEzaERva0VFR2RPb0JtSDRiZUlnQndvbkx2d2NiUCsyck8xNVhZN2k0WVdWT0tBM21Wc0xGMjdDbTNRV0R0Z0FBa0JDbmhwQ0FxeHRXOUJ0UlZoNDRCbUtpb3VIbVBqdXpkN1lGdk4rTG9rUmpvYTJ1UjBMRW5SaVJwL0FqV2lDaHFEK0xIY1hlQXI3NkkwQWRlY051QkdwZjRPeDlIM0E5MzRvY1JKNkN5bFlHa1BZUlcvUytwbGR6SkxkZzZjU3ZzQldmUWZNbGJjRG1hcXJGcjJGandDYWxRb3g1Rzh5MFlPRlFlaXNHaGN0TTNVTWNPUit2QkhhOThFeVgzUjc5L1Q4SCsyL3Nqb0VVTE9FcUxrZkxTYW5RWTZuSW1hTHFNUkt1V1gyRjl0OTdRZEJtQjBSOHNRdFNnU1ZDL2RSZTJURHdLeGxhUGdPaExEZ0R6d2YvaDU4VmZJcUpOQzlnS3ppQjY1Z0tFdWFmaDdJSTdVSFJSaTVBWU5YUzUxZWo2d2VNM3pid0tsemtuQU5BcXl2SFQ3ZVBBV01yQWRIb010MlJFQWREaDREMzNRRmZ2Z05GUWdRUGpSa09wYllFK2E5K0UyTUs2OWR6NTJQbllPT1F2RFViN2w3OUVxNTRKeUZ2eEtQTDJGTUdhV3cxU2NpOEtYOU1pYmZuL2tOemV0VmZ5UFE5ajF4T1BvT3lURU1UZCtUUXlwZzlHN2RaM2NQanRMV0FyTDhMQi9Zck4rMWVpeVgwTDBYbDhUM1I3ODNYc2ZuQXFTdDVMZ1pLcmhkbVNnQ0UvZll6Z3k2d1ZRa2puVWFORzNRSGd2ektWbEhmVFZJRlNTZ1dua3dvQVZTclZjRHFkNERpT0VKNm5uRUJodDl2ZHdidXV5aDlSUFFlZ2F2dEtiRHorRTNJaUF4QmxEVVBmRGQ4akpyNHZ1ajdRRWo4UEc0N1FXQzE0cW5FMURBUWFuQk9oR21uUWdRQUFJQUJKUkVGVVZMaWlDaW9tdUplV2l1V0k2cURYRzN4MW1YSW51SE9FNXdWQ0tWWFk3YmFKS3BYcWZ5N3JMNGR5Z3dVYWJSQ2l0SCtPY2EyNnVob3N5eUV4OGRxb2JYWjJEbEpUVzBtMTYvK29mUURnN0ZPalllbTZGQjJISllJVGdoRVVGWFRWKzdyQ0VrSVFGTlV3ME5GUlV3a2hJQlRha0VBUDljTldXUWtuVkFpT2o4SDFjT2RRMWdwemVUVlVNZkVJQ0xxS2VCNkJoYW00RXVyWUJHZ0NsVjVmV1dHcHJJVXFJaFlCSVo3SFlnMDFjQmdjQ0V4SWhFSjVrODNyWmM0SkFIaExIV3hteGl2YzQyWVJBZGJ5VWxCTkJJS2lRcTU2clpTVmxjMU5URXphQmNBQ1YybHhPNldVSllSdzdyTGl2SGRKY2ExV2k4REFRQVFGQlNFa0pBVGg0V0dJakl4Q2JHd3M0a0lEMGF4WkszVHVuWW5rcEV0QnVHeGRGWnhNTUFJamduNGJZN05ZTENndExVVlZsYnkybWdrV2k5V2REM29wYmNycGxISkJpU0M0Z25CTFMwdmlWU3JWM0V1UFN4VVNJc1BobDZzVGRVUWMxTmU0VDBCYzQ4R1dtcGg0bjlZSWJYekNkUjAzVVFjaTVGcHFiVEZxaERSUGJ1U3JRSVFrKy81T0hSWURkZGhOT3ErWE9TY0FVQVJGSVRqb1psMTVEQUlUa3E5NXJTUWtKRXo3OU5OUGN1Njc3MzRlQUE5UWliWGhVb0ZLTVplVUtoUUt3cklzZFdVa0tLQlNLV0d4cUtUT1lvR0JXaGhZTzhwS1N4RVZHWW1nSU5lRXFhT3VmUDB1YTJPNzFJVEYxVEpQQkRWWGFXOEhIQTRXSE9lUk1pVjZRZ21sbE1URnhUME9vS3Nmb3E1TkVtZjhIMUp1VGZGUGhIOWUvMUpDQ09sMHh4MTNUSERiMlRTVVF1NUlZRVJja0dVbGdPTTR3bkVzSEE0V2Ryc0ROcHNORm92Vm5TU3ZSMTFkTFNvcks2WFdmVmR0VzJ6c2k4cktTcS95M2lhWXpSYlliRllQcHNheW5GUmpTUkI0S2NIZGFyVU1aUmhtcnY5eVg3dUV0TzdtbndUL3ZQNGxKVEF3OE1IYzNQTkhVMU5iSHdiZ2RERzNTN1kyU0lueVVyb1ZXSmFEUXNGS1NmSTJtd3BtczlxZEpLOURVRkFRUWtOREVSRVJnZmo0K0t2a25ENkU0emd2RmRSVlc4MW1zOEptczd1OW9LeFUybHV1Z2xKS3liMzNUbE5vTkpySC9aZlpMMzc1NTBuTGxpMm5wS1NreUQya0tqZUpZdUFPL3hBRU1RVEVDYWZUU1RpT0E4dUtyTTBPbTgwS3M5a01nOEdJK3ZwNlZGVlZvN1MwRkZkYlA5SW5zTGxDTzZyY0txaEJxck5tczhtWkd1dlJBZHBkSlpOUVNwa1BQdmhnTm9CQi9rdDg3VkpkWFkzUzBqTC9SUGpsTHlzS2hhTC80Y08vakJhQmpWS3FFc0dOVXFxZ2xETHU2dGx5bFZUQ0ZZZkRCVzZYNnJZWjNDcHBGVXBLU240YnNCa01CbmZQZ2hyb2RIcVlUSzYyZVdMTFBIbU5OYWVUSS9JdVV3QklmWDFkcWtLaGVNeC9lZjNpbDMrdVJFUkVUTnV5WlhPU0Y3aEpzVzBBaUNBSU10YkdTYXpOVlpEUzdyYTNXV0F5R2FIVDZWRmJXNFB5OG5JWURJWnJCelo1aHlsWGVXOExyRlpQVURPYXpLZzFtS0EzV1dGak9ibkRnQkU0NjZ4WE51eE1YTEJ1TC9hV21TNGQyR25ITjdzUDRjbXZ0dUhmMjArZ3lrSDlWLzk2aTlPQzJ0UG5YY0drdjFNcVZyK0FnKzl2dSs1RDVDdC94WTdaeXozR2FEaTJIY2VXek1lKzJYTng1cnU5RUg3WEx3alFuOWlQOHgrK2d4TnZyb1RENjd1cXJTdHhjUFpqT1BMS2g3QmFaYi9rck1PKysyZkM1RStHdVY3UzlOWmJiNzNkRFd3ZVFic2lhL04wSkhneU54SGNyRlliekdZTGpFYVhTbHBkWFkyeXF3aFM5Z0MycXFvcVZGWld1aExjM1hGcUxoWFVKck9yMldHdzJNRVFWeUVQd2NrUnB5dG1qVmdORlFObmY3VDVZUzRxRVNOYi9qOTc1eDBmUlozLy8rZk1sdXhtMDNzMmdTUWtoQllnR0NEU0lRS0NvS0FDSXZZR25PVzhzNWV2RFU4NXozTHF6M1lxbGtOUkViRmdwQmNGUktRSENNMlFoUFJlTjl0bmZuL3NKdGtVVWhDVTAzazl6QU96bTVuNXpPZnptZmU4Nit0dDRLSDN2dUZBdldzTGY1VCtIVXR6Yk13ZE1Zamcyanh1WHZIenI5ekFDdHJBZEpRdDF6N2FWSGIwcTJSa1hSbVd5dHF6UHNUakx6MUw4TVV6OFN3aXl2bGlKWDdESnhFM1l4VFpqOTlNNW9iY1gzR0ZLakpmZUlYcXpEMWt2dnB4aTdtbzN2dzJQL3pqYTZMblhvZTJhQ09iN251MXVjSktIVXpNRUMwSDN0K2c3S096QkoxT2QwTm01dUhCSGxyYjZhS2tMYlMybHY2Mnhxb0VsMGxhWGw1QmNYRXhKU1VsWFJkc2hZV3VaaXpWMVZVdFRGQ3IxWUxOMWlqWUpQeTl0WUpXRkJBRkJORlZ4aThBWXVISjdOdVArTVZ5LzZqZWpFbStnTGtKQWl2MkZ3QldOaHd1NGRaSkl4a2FFOEg4UzBkZ1AzYVVnMlpsOGM4V2lyNWV3djZYbHVLb084bmh4WXZadi9oNXFpcWtSaWxGMXB2UHMvMk9POW43OGhJYVRGMTdwY2gxaFJ4YS9BamI3MzJFZ294OFQ2bEg5anN2c2YyT085bjkwcEtXbWsrSGd2Y0l4OWFhaUp2Y3A4WEhnNTk1ZzRSTEp4STFjUmFSS1NHWUNvdC94VXdFTS9LajVhVGVmdzJ0S3pDelAxeEs3TUtINlRGcUdJTVdQWUw5dS85UzVtSFZSTTIrbk9ML3ZvZEZlZU9lTmZUdTNmdEtXZ1lSTkI3bWFLUFcxbFJMNmhsSXNObXNXSzB0VGRMcTZpckt5c29vTEN6cW1tREx5M01WdUxlT2dycE1VRmRhaDBlVDQrYUFnU3VDSzFvczVybkh5NnVuSjBTRTRHeW81MVNkbGNTSUVJNlhWZ0ZPSEpLTVN1VytuS2hDSmRkenN0S3VyUHhaZ2svL1lZU05HWUtvQ1NJNExZMnd0TEhvOWE3NVB2SDBBbzd1cVNIK3RsdlI1RzlrdzkwdmRrbGJMbHJ4R2VvaDA0aWRFTWRQMTh5anZNSUJPTWk0ZXc2L1pEcEpXREFmSC9NZU52NzEzMTA2WDkzUFAyQlBISTdmYWJJcmk1Y3RJanUzRi8wdUgzWU9ac2hDOWRFOC9Qc25Vbi95R0RhdlJBSWl5cW5KYW5hWGlCRXBCSWw3S2M2eUtSdnFMRUd0VmwrY241ODNtcWJjdG1aZlcyTkRKemVkZUl0QWdrdTQyZDM1YlcyanBLV2xKZVRsNVhjczJHdzJHOFhGcmxyUTZ1cHF0d25hNEJFRlBVMTZoOU1weUxJczN2SFFZeXFOUnZNWHM4Mkd0MWJGcDJ2V2NzMktuOUZyMU5UYUhZQTNJK0tEV1BGakJtWDFEYXpkdW85Y1djQnNkU2dyZjViZzIzc1F4bUZKaUxvQUlsSlRNYWFtb3ZNR0tDTjc1UzZTSG4yY2lPUmtCaTU2Rk9lNjVWVFVkMzVPLzZsWDAzZktLS0ttMzBiOE1DYzVHektRUzNkeWJLT1RvWXZ1SWlneGtmaTc3MFhjc1lLcWhzN1BWM3Z5Sklib21IYS9hOWkvZ20ydjdTTnQrUkw4Zk04Rmxib0pteGxVbW1LMlRCeExabm91YWowNDZqek5CaDk4WW5UVVpSVXJHK29zSWpJeWNuWktTb3JPcmJXMUNTUTBtcVh0cFgrNHRMYkdLR21EMnlTdHByeThuT0xpSW15MjlsOUNhcGNKV3RpaUg2aXIvck94WktwWlcydE14SFU2bmE0MmRwSWtDSUlndlBMMFkvT0JWTDFXUzRQSnlkWFRMK0VTcDVxOU96ZmpwM0hWaE40Mll3cld0VHU1ZldrV0EvdjBaWHpRQ2J3VmRvOXpEMGMxRGRYK2VJZTUxU1R2VVBTKzFWZ3FnVTc2MUJvOGtpSDF4a2pLSzh0eGxOWml0UlN5NjlZYm05UjlyNlFrc0FLZFVQL0xPT0EwTk9rVk83WVJjUEZzQWtQUEZWZThBYTBlblBZSUp2NjBEMDFJRUQ4c0JyV3Z2dTJmU2s1bDM1eEZpS0k0Yk0yYTFaTkRROE8rQmV6dUh3ZHVXbkZjeWJ1Q3V5OXBrNXp4MU5xMFdsY2dRYWR6QlJLcXFocE4wa0ppMnluZlU1dk41aVk2SWxjdHFHZVQ0NWI1YWc2SFEzQUxOY0h1Y0FtMWpBUDcvVlFxMVh5QVBxR0IvSEswSE5Gck1LSEE4ZUp5RW51NE9oSnB2UU80NS9LTDNTNmFRaVpzOCtYK1VJVmw4dXp1SUFGQmNyYWtIRk1INEIxUVEwT3BEZUswWUNyRFhCZUFMcWdMT282SHI4dGNXSVIrc0JGMW1BRXZRenlqUHY0VVF6ZmZTMzZSY1pnM3RKK0hGRFR4V3BKc29lMGJrU1g1NEIySXp2ZlhGRmZxQ09qZmc1ck00K2d1R0FhbURLcEx3eGdRNzl2Q1hHMG9NQkVTRjludUdKeGFmd3lCdnNvK094UFBaM0R3N0VjZWVmajdaNTlkYkFQc3NpdzczQXdnVHJmVzFxSjFuOXN5bEp1anBEWjNsTFRSSksyaG9zSVZTQWdQRDBldmIvbUNFcHZvaUtvYTIrYzFlRFE4dGpiV2d1SndOUHJXSE5oc0RnQUJXUmIyMURodVhiYi9WSCtBMkw1OTZWZWJ3L1BiVDdCbC8xNCt6WktabGV3cUhpNDZsY3RIZTA2dzZlQXgvcjUwRTRNdUhFcWNJdGZPc2xJU2c2LzZCSm52ZlVIZXVnMDBtQUJDaWIxaUdJZWUrUWZGR2ZzNStNUmlWSlBuRU96VCtlbHExbjdNMFRYYktmajJIYkwyYU9nNXNUOUNXQ3A5eHRyNDhmN25LZDZmUWRIbU5leCs0WjB1cFpqNGpSaUprTGtIVXpzZWlNcE5Lem0rZW5lN3grMjVkZ3piWDE3VjVXa28rdllqam55K0FhZTluS3dQUGlSNyt5RUFlbDEzUFRsdlBFUHU5enM1OFBpemFLWmNTNmhIRWIxY2NZQnkweUFpK3JUVkdnL2NNWVh2bjEydTdMRXpoQ0FJZmUrNzc3NUp0SzFHOEV6OWFKRzA2M0EwK3ZXYlRWS0x4VlZMV2xkWDU4NXRLMjgza0tDYU8vY3FqOXkxS21wcmE5cHBlbXpGWm5PRllwME9SeE43eHlQdmZSYWs5dlo1M1NwcWc0WkhCNEhLaTdSK1VSdzRsa1ZHcFpNN0x4M0hNSGVmUTZmTndwYk1iUGFYMURJd2FUQVBqSW5uOStBTk5abE1PSjBTZm41KzNUcXV0TFNNNE9EZ2J2VUlQWk5qem5SOHJ0M2pqWEhTaFppT0hxUWh2d2pEd0F2UmV3c0VqNW1NcXV3d2VhdTNJTWFPWlBpamYwSGJoWDRUd2VNbVl6dXdscExNV2dZKy9VL0NZL3dBa2ZBcE0xQ1ZIaVF2ZlFPMWhiVUVqeHhMVUZ4azU1Ukgra2pzR1V1cDhSNURXSytXTEMrU3RRRjFXQ3hCY2ExcUFhVmlEdi96Yll4M1BFWlliTmVZWWFwKzJrUkRyWmF3NFFNUkdreUlmajBKN20xRUYzY0JJVkYyVHFXdlJZZ2V6ZkJIRnFEVk5JKzY2SlBYYU9nMW5jUXg3ZmM5OVJzd2pPRDRTRVZLbmFuT3JOTVpOUnJOK2syYk5sdHgxNDgyVW9rTGd0RFlXZDZ6azV3Z2lnS2lxSEwvaU80T1Z5cDNseXMxV3EwV25jNkxvS0NnRnZSZ3dqZmZmTzNSeTZCUnVOVzZtVHdhazNQTldDeU5YR3NPd2VsMGlySXNpemFiOVY2VlN2WHMvOUxrbnU5OGJHYzZ2djhWMkxJMnNQSHBINW44d2VOZGVySFpNcjVnMVNNL00rUGI1emluSGxsSEJWdXUrQXVEUHZ5VW9FQlJrVUxuQ05YVjFmOEtEQXhhaVl1enpTUUlRZ011RDYxTkVBU0hJQWlTU3FXU0dqbmJkRG92V2FmVDQrMnR4MkF3NE9Qamk1K2ZIMEZCZ1lTR2hoRVZaU1F1TG83Ky9mc1RIeC9mYklwNkJnemNaSkdOR2hwMnU4T3RFam9GZDNwSFUrblVuajI3ZlZVcTFjM0tVaW5vRHJUeEU1bmFSYUVHb0UyYXdlVmZMZWFjaDVuVXdZei9acmtpMU00eC9QMzlyN3ovL3Z0OEc4MVJkNFJVUmF0U0szZHVHdzZISzFKcXR6dXcyZXdlVVZKWGJsdGpJS0cwdEpTR2h1YlF2T2dxY3E5dlpYcTJ6RmxyajJ0dDRNQ0JOd0lLdVpXQ2N3dFJqYWhXaE0wZnlOY1cvK0NERDA1d0M3WjJmVzJ0T2R2YTVyWlpXd1FTWEVYeXJrQkMwN1pwV2VUZW1LL1dOaExxWnU0UUFPRzY2NjVWcVZTcUc1UmxVcUJBUVhjUkZCUTBvMWV2WHRwMnREYXhVV3Z6cUVob3lwMXREaVI0a2xJMkZzbTcwajhzRm90THNMbTBOVmVSZXp0Q3paT1NxRWxiZS9mZGQ2OERCaXBMZFBiaEl0VlRVZ29VL0tHMXRnSGJ0bTBkMHhXdHJYM05yVkc0TlJiSnQwei9BQkJicG5mWVd2alduRTZuTzIrdG1Sa1hFTlZxOVhYSzhweEx3ZWFuVElTQ1B6VEN3OE9udVFWYW85YW1waFVaWldNMVFxTU1hdWxyczUwMi9jUGhjS0J1ckFkdDFOWWE4OVdhS3d5YWZHdTRLYituQXFPcmEydXBzWXRFQmZyUXJndkVLWU9xZFFLQWs2S3FPZ3pldnZoNXFaVFZQUTJLMTN4S1ZiRVZNYVFYZmFhUDZkSXh0dndqbEJTSzlCamVwOHZYc1JjZklXdk56OGhBK01RckNJbytWNXFpaE9Sb1cwMHFxTlZucFN0V2l5dFY1Wkt6dDR4ZUYzV0RCcnd1bjJOZmJFUUNBbE12SnFKZjEraW5LN2F2UnRWN0hBRmgzbDIrVk1YV2RFcXp5aEYwNGNUUG5jTFpTdVdVR2lvbzNMSU5xMG5FZU9tbDZIVy8zWDQxbmRoTnJUV1V5S1NZTGg4aml1S0k0OGVQSmJzcHhCdUw0KzF1cmMzcE5rZWJORGFuMDRuRFpzRlVYNDlUcTRYUVNMeTh2RnJWa1RacWJTV0lybnJRNWdvREQyMnRUY0FBRUxScTI5VjMvZnNEcHIzMUxYLy82RXRHdjdTQ0hhV045WFpXbnZ2b0MwWSs5UjhTRmkzSHMwVFZZYXBnL2lzZnNlQ3p6Vno2NGxJK1BGS21TTERUUU9WbFFGTnpoRDJ2Zk43bFl4cjJmY3UrRDlaMnp5UVF0V2dNQm9vL2VaSEN6S3B6ZGorbjNubVlsU2xEV1ptU3pDZkdhRDRmTXBTVktVUForTVJIditxOCtSOHQ1c2lHSXkxZm5RVzcrUG1GLzNidlJLSWFqY0ZBNWRvUHlmN3hlSmNQeTM3ak1Zb09WWGZ2VWw1NnRHSTUrNTk2bmJOWGF1OWc5MDJYOE11bVE1aEx5NUhPSVR2SndZZHVvcml3NVFVcU55MGo4OHRkM1Q1WGJHenNSRTl6dEZXRVZHZ2RTSEE2blRobEdXdDFPZldWZFUwVkNXYXpwVWxyYzlXUmxpRTJVaEo1Q2pWM2hZRm4wQUJabG9YcTZxcUJna283ZThHc21XeC9ZQjRyNzc2T0IvcDdzV2pEd2NaSGtza2pMMlRWZ290by9lNWY5ZjJQMVBVY3pEY0xMMmZsTlVONSthdnRWQ2owTU8waWRNS2w5SnFjZW5ydHJLS0UybE9GT051WlAyZERIWFg1cGJTaDhaUnNtRTdsWURGWm1qNVNoOFVUUDNzV2dWRytwMzFnR3ZKUFVWOVN4YStoQmUxNTIzUE1PckNmV1FkVzRlY2R5S2kxKzVsMVlEOFRuN3EyZVhpU1M3TXo1ZWRncWJOMHJxRTRISmlPSGFEbVZEbVN3MEdiOXJpU2picWNmT3kyTG13eVF3UzlaczhpTlBFMHJlVWNOa3o1cHpCVnRNL2NhaTB0eEZ6VDBNNWExRkNiazk5aW5RS0hweEUvNHlKT0YraVZMQ1pxYzNLd05saTZPTHNTa2lPZnNuMGlTWXNlcFA5ZmJzRGdvVUE2VFJYVW5jcHZkNi9JQUE0TGRUazVYWm9ueWVHZ2V1Y1dURFUyMTV5M3UvZUsyeks5dUs5aGJXaFpjcUxSYUM3YnVIRkREdytOcmNrY2JmSzF1VnNPdUlRYWd1anREUm9WRG1kakxha0h0VkZkRGFVNTJSUms1NkgyVE85b0xwdHk0blJLU0ZLenhnYUlCb1BoS2hCSjh1amczalBJSDB0SkkvMlFtaUc5b3FBbXA4MFU3c2dxWk1KRll3RUlqdWxGUDhkV2RwWTV1U1JjTVVtN1k5THR2R29NWmVaSXZIMGxxck1iU0gzL0U2TDZ1SnJ1Mmc2dlpzMnN6V2lvd3F3Znh1UlBua2V2QmZPeExXeWUveUFxWXlMVzdPTkUzUDR2aGw4L3JzTXJ5WFc1YkprOUQ0dHZMN1J5Slphb1NVeDdwYmsvaiszWUpyWXVXazd5RzI4UjdQOHI3K3JJbDN5eTRITVNldFZSVmlSaHIzSXdldjFhTEovZXcvSFNrVnowMkN6QXdwYVIvWWo5T0pzWXpRN1cvZTFGTENjT1lqYzhSZlYzQVJoR3ptSE1QWFBjNW1nV1c2NmJpNjJ1bnVwU1B5YXZYMEhBR1ZyWjloUHJXSFhOMC9qMjdvVlVmaElwYmpvWHZmRWdXcmRneW43MVhuTFZLaXpabVVUZS9SS3AxNDhISkU2OTh3aTdsL3lFZjN3UXRmbDJSbjY0alBEWWpnZFJ2Zmw5TmovNEx2NzlFN0FVWkJIejRGSUdUSXpyOEppODkvN0I0VzkyVWx0VHhFL3o1cUpXQnpEcy9YY0o5b1dDOXg3aHB6ZTJFUkFYU0hXdWpaR2ZmVXBrbkd1eENwZmN6NEdkRW1MMkxwd2FiNnoreWN6ODVKK25kUTJVci9zUHU5OWVRMTIybVlwN3J1YUVRVVhQK1UvUmYvSUFBTXo3dm1iOXRjdVJLbjVCNm5NTlU5KytGeFZRdldNNVA5ejlQUG8rZlRFZCs0WEVmN3piZEF6QThPR3BZNEZUYnEzTkJySU5CQld5N0pSbFdaUkFscHhPV1JCRTFHcVg1aVpMTW9Ma2JKSCswVkJ5Z3IwcnZpUXkya2lKMUlDNnRXK3QwVkhuMHRhYVRkQnZ2LzFXSjRyaVZTMVgzY1I3TzdPWU0rbXlUcmFIbGJJNkJ5UDhSRjc0YkEzSm8wY1I3Z05sdFdZSTkxSGtWZGNOR1lhOHV3YXRyK3NCS2ZyZ0VmYS9zNUtvRjI1eHpYSzFscWxydjhTZ3M3SDdxbEZrZnIyZmxObUo3UDdyMzRoKzdETUdUZXlEVkhlTTc4YmVTc1hsV3dudTREbXIzNTVPVmZBVXJ2ajRNZGZidUJVOWpMT3VsSXI5aDdDZEpYdEtQckdId0JjMmt6cmNDQTRMVHFEd2RDWjA5QWltckZqQjhTZm1VaFgzZDFKdmJLbmRTcVVtQnE3OW1tQi9rZDFYRFNmMyt5d0Nwc2VmbVZzZ2FnU1gvcmdWalJyQXdyWXBROG5kUFovZXcxMHZFKzNnUzVuNDFEd2NoVnY1YXNKakpNN2FnaUY3TlR2L2M0eUxOMi9DejFlay9JdG4rT241OTVuK2VzZXRRTEtYdmt2Y294K1FQS00zSU9Ic2doYlY0K2JINlhIektWWWxYTTNJRlNzSWFzeGtyc3ZnNTMrdVovUzJyWVNINmNoLy9XNTJQZmMrbDczVi9IS3Eybm1VU3phdEl5QlloOU5pNmREZkdUSjVBVk1tTDJEcmhEaWlYdjJjWHIxYnBreWJIVVl1LytZNTFKWWMwZ2ZOcEt6aVhpSjhDOWw1K3o5SVdycVJYa21oMlBPMzhQWE1wNGlidUJ3M1ZTQStQb1pwOCtiTlc3RnMyVEtyeXh4Rkl5RGJaUkFGd2ZXZjRDS3p4ZWwweWs2blU1QWxXUmFjVG5jdHFic0JqQ0dBNk5temlJd01wMmZQQ05TTlVWQ1hHZXIwU1BGbzZWK2JPSEhpYktDNXo3eGs1L1V2VnVOSVNHVkIvK0N1ZW5VdzZEUm9SRUdSVVdlSW11MHJ5Znc0SFZORkhZN3FFcVMremU4YVE4cG9ERG9BTFNHamgzSDh3Q0dZQXFXSHpLaTJmczdlSFNBaklUdnlxY3F1SjNqUTZWOHErcVFVeEl6YjJISzNsZkRVRkhwT200YkJvekpNUDNRdWN3N1BQWHMzRm5NaHZZYTdUVUcxN2xmVkVhdmlrd2oyZHoxNGh1aEk2cXFyei9oY2dtamh4UE9MeWQ5NUFMdFZ3cHhUUzBCbERlQVNiT0VqUnJtR2JCeEdjUEJKS3JNc21IZHZBMi9JZXZsWlZ3djB5aFBVSFBUQzZYWWVuUTVoSTBieTR6TjM0RGh5Q2NHcFkrazU0WUl6SHJmbFdBYm1xR0dFaGJtaUNCRmp4MUM3TkwzRkdBSW16aVRBWGN1dDB2MjZhRU5neWhCWGRZZ3VBa05JRFpaYWNKYnZvcnpHaTZBdi8wUFZsNEJrUnF6TXBLWUs5TTBpSS9yNTUvK1Z1bXpac3MyTjVxanNNa2NkSUR0bEdjbmxiNU5rU1hLMjB0ZzhvcVJhTThVL2JhR2lwcDRDalJmcVJoUFU2V3lkNHRHY2tBdUlhclZxbHNmN21rOVhyV2FyR01mN1UvdlRlVjY0RjZHK2FzcHFuZnhseGtWQUEvK3BoMUEvdlNLcE9yWThXN29xVHE1ank2UExHZmZGZndtTERhYnE2eGZaOHJXdEl3WFBkUkpORUJIVHB1TGpYcWdlVTZmakcrL2Q0YlhVMGFsY3VtMDlSVnUzVXZqTlV0TGZXY3ZNelcraFBVZTNLdW9OcDlsSFV0Ty9jaGQ1U1FWUEIxWTNpaGJhZTkxbXYvb1ErYVVwakYyMkNKMjNtdDNYRFVPVzVOT2Z3WDA5cjVqQlJFMmQ2djU4S2oxdkRtZ3hsUGF1RlhYYjgxeVN0cCtpclQ5eDdMSHJLYnp1VlVZdFNEdG4yMHZyYy9hZVAwRThUZEdiZnpSUlU2YzJsY1QxbURhN2pWc2dMQ3dzRGRqV3l0Zm1tYkFydTFJL1hKUkdzb3dnT0oyeVMyYTUzR2hWbVlkQk5qSmdTaHJSUFl5SXpjbTR6dmJTTzVCbFdhaXFxa3dTQk9IaVJuOVordnIxZkZZWHdqdFhwalNwbEoxdG1aR0pSallmeXdhZ0xQY2t4OVNScElZcS9yWFR6bGh3Q09yeVhFd2Vjc3RlVklRYzJaZmcyR0RBUWQ2NmxvMUhUSHUyVVc4QnNGRytiUmVoQXdlQmIxL0MrcGhwcUFzZ2JHZ0tZVU5UQ0lpTFFXTm9Yamh0U0FoMUJTMGJxRGpxNnNBL25PanBzeGoyMHBPbzg0N2k2ZnUxWlcxbCsxMFBVMWwzN3ViQUt5Q0FCamY5czdQNEFKVkZMY21SMUhvRGxzcnlzL2VnaHdSaE90V1NicnFob0lDQUljUFFlYXR4Vmh5aWFHZExQcm1TSFZ0ZDgxVzRpNHFxM2dUSDZRZ1pQaHByMWlIMC9ZWTB6Ym1mTWFoWm1CbUMwRHFLTVZXMWxOUzJ1am9NOGNrazNMaVE1UG1YVVgzMHhCbmZpNjdQSUhRRnV5Z3RkUVVoaW4vWWlsL3k0Ri9OcUtQMjFXTXI3MW9FWFJVM2pCQnlzUnBpbStjaExncE5xN2VqV3ExTzI3QmhmWTkyQkp1cTBXSnNsRWVTSkNFTDRMRFpXblMyc3BnYUVQejljVGl0MUpkbm8yNFVhbTJyREpxQ0JvS1BqOC9semNaMENZczNaVkdyOHlMdFdWZW9YUnZhaSswTEp3RHc1TnNma0Y1c284N21ZTWFpSlNRTkhzYUhNd1l4ZmN3b3ZudG5GWmU5ZVpLYXFscitldmswZ3BVU3dOTUx0ckFSREo0Wnd1b0xSNkEycG5EeHQ2K2hIellWSTIremV1WmN0R0lkdXFDUWxvSWdTT0tIV1planBncUw3MFFtenhnRXdOQlhYK2I3K2RlUzkxWUNhbnM1OVNZams5WXZhU0xRN1hYTFBXeTYrVDYrZkY5SDNOOWZKUG5Lb2RUditJaU4vL2NKZ1gzak1HZG5Fbkw3US9oN3ZKU2Q1U2ZKL3V3clloNWJUTkE1U244TG1YZ0Zxbi9PSVgzbVQ2ajlJdEdGdE5SempKZGZ6OUZiSCtLYjFhL2dOLzU2eGo5NjdhKzZYdlRjQlp5WU41K1ZJOThrNHBxSEdIbkhOR0t1dVpYMUN4WlF0M0VnbGhyUUo3UmtYYkVmV00yYTJXdXdaR2NTKzlqL0k4QWJHRENWMUp1MnMzN0NPUHo3eFdJK2xZM2ZwUTh5OXA1TDNVOXlUd2JmZHhGYjAwYWc4b3RoVFBvS2duM2d5RU56eUQycHh6ZFVTOVh4VWxMZS90dVozNHp2SUZJZnVwanQweWZqSHg5TWRiYU5rWjhzK3RWcmtuRFRRcmJmUFpOZi9BM0UzUDBTQTZjbmRmQ21NSkw2MmtOc3ZXa0tKK0w3SWxlVllnbEtaZnBIaTlvSTJHSERocVVDdVo3Q1RaWmx1K0NLa0VxeUlMak5VUW1WbHc3SlZFOVZ0Z2xiWURqYVdDOTA0VVpxTTM4aXEvd2tKWUlPWWZEZ3dlNytCbVlzRm90Z3RWcXgyKzJDdytFUTNDRlhsZFBwMkFQMFB4dTJWVWxWUFhxREFUL3Q3Nk90bmUrMFJaM0RnU2svSDFWZ0JEcERXNytJczZHT2hsb0xQaEdocmN3ZGlZYkNmR1N2UUF6QlhaTkVrcTBCVTNFNW1zQXdkTDY2MzJXOVpKdUordEk2dktNaitMMzBlMmRESFEybE5YajNqRWJWenN2WVdsYU1wUE5ENzl2U3ZKY3NKa3lsRlhpRlJhRFZkVzBQMkdyS3NOWlk4VFpHb3pvTGxDWk9VdzBORlNhOG80M3RqdjIzY2FuWU1PVVhJL3FIb1BkdlA1bFpsdVdqb3FpNkE2Z0g2bkJSR3BrQmk0QmdGMFRCS1FpQ3BGYXJaWTFHSTN0NWVhSFQ2V1M5WG8rM3Q3ZUwwc2hiajQ5V1QxalBIaTZOcmRrRWJkYlljQ2ZJbVV6MWFXZEhxTGtjSHVHQlNyblFyelFHTUVUSG5sNzk5L2JGMTl1MzNibjNOdmJzM21wcHZmSHQyZk4zdlZ0QmE4QTMydkM3amtIbDdZdHZCNmthWHFIdFZ5cUlPZ08rUGJzM2RxMS9LRnIvc3poMmd6KytCdi9mZDh1S1dneWQ3Q05CRVBvZVBKalJkK0RBUWZ2Ym1LUElUbVFrUVJBRVNYSnBiWTJCQk04NlVvY2tJMm5WMkd3V3hNYkdMTTI1YTgzK05VRHc4dks2VEJFbUNoUW9PTmVJajQ4ZjBjb1ViYzM0UVhPWmxZU243UElza0xkYWJZZ2V2alhCN1ZzVFBCeDJvaUFJMDVVcFY2QkF3Ym1HWHE5UG83bjZvTjBXZmE0ZnFaSDVRMmloc1RWMXRySTFhbXlTUitEQXBha0JndG5jTUJXSVVxWmNnUUlGdndHTVI0OGVHVWpMOHFwR3hvL0cxRE5Ca2p5TDQ1czF0MmIyanliQjFvWnp6ZVhlMEdxbktuUDkyNkswdEpUOC9BSmxJaFQ4S1JFVEV6UE1VMk56bTZPcVZ1Wm9DNjQyTjRWNEM2MU5kQWNNbWxTN3hnUGRacWdpMkJRb1VQQ2JRYWZUalcrbHJiVm5qcmFRV2EwRENYYTdIZEhUREczVTFBQ2hvY0Uwb1gwejFNbk9qTU1zV3JtQmU1ZHY0djE5dVI3MEt6SlplWGw4dW0wdnIyNDhTSzNIVVE1ckE5c1BIZWV0alR0Wm5sbWlyT0J2aUVQM1hjR0pIY1hud1Vna2ZyNTZQQVduL2poemF5dk5wYnF3NGd5UHJtUGJaWmRTMnFYRGJWUmxITUorRmhoeGFqY3RZY01UUzgvcVBNZ05GWlFleVczeitjL1hqQ1V2cDN2bWFFYkdnVDRlV2xzTGphM3hweVZYbTlRbVFpcTJNa1B4TUVNbnRyODM2L2hxYnlGOVltUEV6UktVQUFBZ0FFbEVRVlM0dEg4VW03ZHM0UEVmR2tkdTVyMzFlemhTWE1KYlAyUzJFR3lsZVRtOHN6ZWIvYitjNUl0amltRDdMV0V0SzhCdXRwMEhJeEdKbnJjUXY4QS9rT3RnMVN2c1diTCtqQVc5cFNBUFIxZTZUVlBPanF0dnBOcDhGbDR2cGtvYXlzNHUvNTZVK3dNYi92cGltODh0ZVRuWTdkMDdWNjlldlpJOU5iYlRtS040bXFQTldwdExzS21ibzZHTlRCNHVNMVFVeGZZRm14akE0aHNuTmYwYTJGREdYL2Jud3RoWXdKdG5icDRKTlRsOGMzQm5TekdjMEo4UEV2cXplc05hUHFoVGhNMjVRUFhPZEk0dlg0OGREUUVqcDlIL3l2Rk5TYnEyNHFQc2UreDF6RlpmRXY5Mk55RkdYOEJDM3JJUEtkcDdGTHRkVGZDa1dmU1pub29BVlArY1RtV2xub1k5RzZpcEZJbTc2WGFNU2U0aWRVY2QyZSsvUStIK2szakZENkgvd3B2dzl1NDQrOU4wNkFkT3JOb09vaGJ2MGEwRWI4NStNcGQ4Z3FuYWlpRitDSDBYM3RBNUEreHB4bEN6ZHcxRkJmNzB2WFFFQUpXYlYxSWxKUkovVVJKbDZ6NmlRVzJrY25NNkZtY3dDZlB2SURUVzMvMndsM0w4blhlb3lDckJrRFNPL3JkY2lWYmRxSTJVY2VLOTl5ZzdVb0JYejBRU2JyNlZBUDlxTWw5K240bzlHZFRWbGJGL2NUWkNaREtEYjNSNWJ4d1ZXUng5OTBPcVQ5VVNNUFl5K2wyVjVrNHd0cEgzMFZ1YzJubVNnTFRKZEVVQnEveCtCYWQrM0kvWlZNT0pGeFpUb0JXSm5MT1E4SGgvMS9tV3ZVdmVqcU9valFra3pwL2ZWTmplc1FKWXpiR1huNlU4dTRySVdUZlRhMHkvSnMwdy8vUDN5UHZoRUtxSVJCSVhkbjYrM0E5ZW92TGdBZVRpWFBZdFhveWdDcVQzM3hZMmtTYVlUK3hrOTVKUHNYdEZNK0NldS9Gemw3Qlk4ak00OXM3SDFGVTdDSjE2TllsVGhpSUEzdDdlSTREUFdwdWlqZVlvc2lRNUpVbkE2VVFscW1WSkl3bE91MDAyMWRSZ2t5UXNYdDZJalZMUG5aU0xMQ05VVmxiMHA0dk5XbzZVbHBOb0RGR2t5dThNdVdRbkcrWS9UK2pNYStsejNSVUk1cG9XUklBbmwzOUY2Q1d6Q2RCbHMvWEIxNXBNb1pwQ08xR3pyNlAzdkdrVXZYSTdCOWNjQTZCbVZ6bzcvdlk0bXBScHhFN293WTZycjZXaVJnSWNaTnc5aDE4eW5TUXNtSStQZVE4Yi8vcnZUaDlRVFhnc1lXbWpLZm44VlZxU2JUU3c4NmJyY2ZhNW1IN3piOFEvUU1MYTZSdis5R1B3Nnp1SXdsZnY0OFR1UW14Wlcvbmg0ZjhRTUNqUnBmT3MvNHdkRDd4STRPUzVHQk1kYkxuMlRzd09seFd5ODVvWmxKbU1KTjUySXh6OWpCK2VXOTVrb2Z3MDd6SUtDbjFKdUcwKzRiMjhxTTJ0QkxVdndlUFM4RThNUXh2ZGw3QzBOTUtISnJwdktaOHRNK2ZRRUpCQ245dXVvdjdiWjluOXdYWUFTajU5bGwyZkhpTHVwaHNSOXEya3JMRHp5bjVkM0VEQzBsSlJhNzBJSEpOR1dOcDRmSUpjbklpRlN4NWoxNmNaeE41ME13R2FrNnlmZDErWG1IbnIxbjFLUStTRnhNOGN5YUU3cnlMM21JdEVNK3U1djdCL1ZUYXhOODBuTkt5VXpkYzkxT241L0llT0lXUllFdmhHRUo2V1J0aTRDOTAwVHk2dE5HZEZPc1paMTZBdDNjSlB6eTl6T2JSSzk3TnU1aTJJZ3liUlo5NWxGTDU4QjRjM1pRR3VaaStyVjM4WDJaNmZEVmtXWkFSQkVBUVFhSEtqT2UxV25LalJCSWVpRGRDaGJsM3dqcXMyZEh4WEhxWlQyWWQ1ODdDVGQrN3NwMGlXMzl0NzFWQ0p3NkZIYjR3bUpENkNrT1NXMzhkZGR5ZlJJL29qUjExTnh1VWZZQU8waERMZ3J6ZFJzWDgvNW1vYi9vUGlLTjkxRUthNCtpWUVYSHdOZmFhTUFrWVJ0K0k5Y2pjZEkyaFVKY2MyT3BtNDZ5NThOQkIwOTcxa3BWNUxWY085QkhkQS9hOE43WWt4MU1ndmJUUTdLNVpxSzRGaFlRUU1TQ0o0WUhMblFyeDBad2RqTURMeXRhZFpjOHR0NUJocTZmdmlSd1NITnBjelJjNWJTT3lZWVRCbU1Ma2ZEaUIvYnhVeDZ2WGtsdmRuNXIxWG93TDg3NzJEcjJlOGp1WFJPWWdacThrcFR1REtyMjUzTVpza045ZEdocWVtWWo4VVFaazJIbU5xTXlkYzFmcmwxQmluTWY2R2k1R0JRWGZkeUtwRlh6SDh4bEhrcmxoSjc3OStqZkdDT0l6OTcrZkVoMWQyZXIvZVBmdmczZE1YalVaSFNHb3FvWVptb1pHOTRpdjZQdlE5eGdzaUlQa0pjcFplUU1HSmw0anIzWEVKbCthQ1MwbStLZzBCNkRmek0zTFRmeUFtZmpCSGx1d2llZE9QaElhb2tmdmZUKzdTRVJSbE9ZaUpQMzE5VjBEU01IeFYrUWlHdkJiejBJamVDLytPY1dnZ2dmWlpySHJPVlY5ZThQbjdhTWJmU3Y5cG81R0FnUXV1WU1meWRKTFNYSngxS1NrcC9ZRThUM05VRUlTbVpGMEVRVUFVWlVIRXBaaHB2TkQ1YW5BNnJOZ0ZMNWRnYSt6dTN2aWpVcW5HZGpiWkZVVTVMUGo4QUl0dW1FbWlRYWxtLzcyaGlwdkV5SHN5T0hEbkhING90R0s4NXUrTWVHQnVVMzJsVjZDcjVGM1FhUkVjRGlUQVdaSEoraGszNFQxeUtnRVIvalFVMXlQNU5GTlNlMGVFTnYyL1BqU002c29TSEtYbFdDMkY3THIxeGlZYUhxK2tKTEFDM21jeThrQ0d2Zm9NKzE5OW1DLytua2ZBaU1zWThjcVQrSGF3cHh5bFJSMk9RZGRuUERHSml6aGVNSmp4bzFvMkdOR0hOZEovYS9FMit0TlFYazJEc3hpcE1vTnROOXpZUEtvQjhVaUF0YkFZVFV4OHQraWE2b3Z6Y1J6ZHc1WWJtdnNuQlBjZTdqcGZhUjFCWVdGdVZTd0NROEN2S1FnMVl5azFvMnUwbU1SQURHRmdxNndET3VaSTFJVkZOYmtwZE1Zd0dySXFvYVlJczluTW9YdHY1V2pUbStBQ1ZOamM4dVhNL0tycVFKZFRWYVZSSVZ1dHJwRVhGV0Q2OFFpYmI5amNyUGtOYVM1eUNnZ0lTQVkyZUdocnJoOEJBVmtXSktkVGtKMlNJSW9xSkVtU0hlWmFvYWJVS2h0OGZCRjB0cllhMjczMzNxc1NCS0ZEM3VpNmlnSnUrV2diZDg2ZHdiZ0liMFdxbkJkUTAvT1dCK2w1eTRQWVNqTllOMjQyUmRmT0pkcllnZTltNHdvY1EyNWc3TDl1QitENEU3dndERmcyRkRjMzNER1hsZUoxWVRqcU1BMWVobmhHZmZ3cEJ2WFpHWG5nbUZsTUdETUwyVkxGam5tVE9mN2RIRkptbjU0MVFoMFcyZUVZeXI5NWtkenFJY1QzK29XZlg5L0FxRHVhM2NYbTRrSWdCYkRSVUZoRFpFZ0EzdW9JVkpHcFRQanN0VGFGOWpaakJQYmNuZGdrbXVqQVBTRUlBbktyN2lrK0VkRjRwWVF5OGIySDJ3cVVjSC9NcGFWQUhGaUtNVlU3dWl3Z0JGRnExZHRCank1TWo2V3dISHBIZ0ZTRnFSU01YYUJic1pRV0lMczFHVXRoS2Q0UlFlQWZqdDdnejVDM2xoRWVlQWJLU2plNnlPZ2pqZmhmTkpPSlQ3ZlB5S0xSYUVZTUhqeEljK0JBUnF0RVhVRjA2V3VDZ0N6aHROdVJOR3JzWmdzYW4yQjBZZjdvdkhXb1c1bWhQUG5rRTZPQjAxZk4ydXU0YzBrNnV1ZytWQlprczdRQVZQb0E1aVc3aWx5M0h6akV5WXB5ckU0elgyN1BJQ0U4a3FrSm9VZ04xU3c3Y0lyRHA2b3B0VWtzM1FHcEEvcVI2S2RSWk5KWmdDMXJPMGMyRlJDWk9nQkgvazZzMmhoOEFqb3hjYUo2MExBbm5ZS2ZSMFB4TG81OXV3Lzk5RXVhZ3hGclArYm9ta0g0T2c2UnZjL0ErRmY2SVBoTDlCbHI0OGY3bjJmZ0RSY2pWeFZTc0NlUElmZmQxaUg3UnRYKzdaaHFySmhOVGlwM2JrRjl5b3VRMUJIb2RLVWMvTmNLZ3NhTlJFc2w5YVYyZ21QQ094eTNFSlo2MmpFNHM3YXo3UjlyR2ZYTk40VDRsckYreWh4T3BQYW45MUNYaEMvNjVDMXlVaU1Rc2xkVFlyK1FZUmNFb2hXbjB0UDNSYlkvczRRK2w2YmlLRHhHU2JiRUJYK1pqWGJRVkdJai9zMzIvM3VEL25QSFlzdmRneHc1aVo3dTgvbkg5NlhxZzY4NE9UUUliV2dNMGNQN0VUaHBEajR2WE03UGIvWW1ia3dpNXF4RFZKdkNHRFJ2SWpGenJtVGJxNHNKQ2JtZHFxL2VvTDZyY28wUUFtSWNuSGh6S2Ria1NBSlNSdU1ickNOdTFreCtldkZKQW53WFVyL3BBMm9pcGhIVnUzUDkwcjQzblgyZlhZd3hvb1lqM3h4bHlLZmpRZTFMdjVzR3N2dXVoMG4rNnpXbzdlVVViZHBQd21QMzBCbUJ2eW82SG4zQk14ejZmQlgrZ1VHRWp4L1ZGSHhwRDFHemIrVEFKWDhobzM4SXhnRkc2bzd1eE9xVFROOUxoalVwY08rOTkzNnZsSlNVUXpRM1UxWUpJQ0lJSXJMc1JFWkFGR1JabHBGRkFidTVGbHVEQnJtNkZKVmFyUmJjaWJrQ0lENzExSk5YaTZKNGVoK2JaS2ZLcGlMY29NRmlkMkN4TzdDS1dvWkhCd0Z3TFBjVWVWWTFRMk5Ed2VGQXJmY2xLY3dYMlZyUEQ5bGwrUGdIMGkvSUc0dmRRVlI0QkJINjM1YU14bVF5NFhSSzNXNUtYRnBhUm5Cd01DcVY2cHdlYzZialEzQlN0V3M3UlpzMlUxc3FNSERSMDRRYW03ZWpiNzhVRElIdTZKWW1nTEJoL2RIMUhFeGdVQTA1WDY3QmpKR2syMlpqNkpGQVlGdzROYnZTY2NSY2hMNXNENlhIVFF4OCtwK0U5L0FGUk1LbnpFQlZlcEM4OUEzVUZ0WVNQSElzUVhHUkhYTG1sNjFiU2RYeGZIeVRVaEZyQ3pFWGxPQnpRU282THpCbkhhQm8weWJLRHVjUWZjdWpKSTVONkZSN09kMFl5cmR2Sm5UMlh6RDJqVURRQmhBNW9pOFZod3NKR1JoUHhmcFAwSTJkaStQZ0pxcktmRWg1N2duOEEzUWdlQkYxMlV4c1I3ZVR2KzRIVEZWMndzYU93ejhxQkFRdm9pK2JnVDE3Si9scmY4RHFDTUE0WVFRNmI5ZFRxNDBkVEVpVVFQWGg0MWpNV3NJSDl3YU5IejFuVEtMdTU4MFViTnlLMWFvbFl1eDRmTU44TVF3WWdhK1lUKzQzbTlHTm1VMU1TaStDaGc3RnExTlpKQkkrTVExYjFpSHE4L0xSeFNWakNOTGhlOEU0Zk9RQ1RxMWFqODBRei9Cbkg4YmczYmtxYlJpZWhsZkJ6K1QvbkVYQy9jOFNrK3dTMUVHakw4RkhLQ0l2L1R1cXNvcnh1MkEwWWYxaU9pY2k5Z29uYW13L2FqSU9ZUzZzeG45NENvM01aQUhKSTlDN0RUdkJONXl3UVFtSWhraGlMeGxCeFpZMUZHNzdDWWNZVE9UWTBYZ0hORnVBZXIwKzY3bm5uanVCcTkrb0hYQUk0QUNjZ0NRSW9peXFSRmtRQk5SZU9sU1NFNm5CZ3RvUWlLRFQ2VVJQN2pXSHcvNk5JQWlUL3FpYXpmbk94M2FtNHp2YnlIMzlkckpOa3hqL3dPVi9tTFUvY3YrbG1GS2VaT2pjRkVYRi94K0F3K0hZb3RGb242V1pvNjFlRUFRVFlCVUV3U1lJelJ4dFdxMkxvODNMeThYUkpyb1RjcEZsV1pnOWU1WktFSVFSeXBRcThBcUx3eWNpNkE5MVQ3cVlSTHhERkovdy80elhXSzBlR2hNVDB4dzRhTmxNV1d4MG43bVNkUnQvWEtscmFzODBqM2ZmZlhjWW9QVERVMERFN1B1SitJUGRVOXlkTHlvTCs3OEZuMlhMUHU0NWF0VG9ZelQzUUJEZGFSK05wVldDTE11eUxEZm40MHFTMUt5eEFlaDB1cUhLWENwUW9PQjhRZS9ldlh1NWhacG4ya2VqWUtPbHh1YnExU0pKVXN2Q1VwVktwVGdmemlMQ3drSzdGVGdBTUJnTStQbjVLcE9uUUFIZzcrL2ZwNVVaS25yOENLMDBOeVRKUldtazlxQXBFZ1JCdUVDWnlyTXAyTUs2Zll6QllGQW1Ub0VDTnpRYVRSSnRmV3lOeGZCTlRCK2VSZkdlR2hzblRod1BBeEs3ZXNIcTJscHlLK3B4bkM0bno5bTJxYXpWYkNhM3JCcXpRMVpXVElFQ0JaMUNFSVNFRjE1NDNxZWxZSk5ibTZOQ2N6NnVSL0FBRUl4R1k1ZUszcEhxdWV1VkZleTFhd24zY2xKbzEvUHY2NmN4SWt3UFdIbnVvMi81T3F1Y1VpbUFMVTlkUmJUN3NQZFhydVNOekRwNkJIaVJWMlZod1JXWGNPdUFNR1hsRkNoUTBDRW1UWnBrQkNwb0lweEVGQVFFRDgwTmFQYTF5YktFdXRGRzFXaTBYUk5zb29ZRnMyYVMxTU9WMXI3eXUxVXMybkNRMWZPR0F5b21qN3lRV3llYW1mam1uaGFIalVnZHhUVXp3OUdLa0g5MEQ1TlhiT1B5QVZkMFV0R21RSUdDUHp1aW9xSjZBcGx1UWRhaWN4VnRvcU11NFNhNkpaMmdVb2tEdW5ZWnJ5YWhCdEF6eUI5TEU4K01taUc5b2dqV3Q4MTg3aHNWM2xSckZ4YmtoK2l3WTVXVVJWT2dRRUhIOFBIeGlmTVFhcTFiOGpYbHNyazdXQ0ZKa3RDVTVDWUl3b0J1WDlGdTRyMmRXY3hKN2R1TmcyUSsyWHFRWWNPVE1DcWtJQW9VS09nRUdvMG1vWlZRYStGamE1Mm9LOHR5VXdtWUFIU1BWRTJ5OC9vWHEzRWtwTEtnZjljTnloMC9iK1hqY2o5ZW1EUkFXVEVGQ2hSMENsRVUrM2hvYVc2aEpudWFvOUFpZ09BU2JFSnBhVWtpNE5YMVN6bjVkTlZxdG9weHZESzFQMTFWdkE1bTdPS3huMnA1NTdvMGdoVlNEd1VLRkhRTlhpdFhmaEhpSWR4RVdhWUZoNlJuQUVHV1hla2UrUGo0SkhUOUdqTHA2OWZ6V1YwSTcxeVpncjZMVXUzRThRUDhmVk1CYjl3MGhSaHZ4UVpWb0VCQjE5RzNiOTlRVHArazZ5SFVYT2FvR2hEVWFuVjhsNjlnTG1IeHBpeHFkVjZrUGV1aStkV0c5bUw3d2drQVBQbjJCNlFYMjZpek9aaXhhQWxKZzRmeDRZeEIvR2YxRGdvclJhNTUrVVAzaWZTOGQ5ODhCdXFWUlZPZ1FFSEhDQWtKRFc5cmpyYlUyanpNVVZrUUJFSHZjTmhmRmtWeC9wOWhnbjVMMmlJRkNoU2NIWmpONW1YZTNvYWx1T2lMNm9BNk40V1JCYkFMZ3VBUVJWRlNxOVd5UnFPUlJRQkJFR0tWcVZPZ1FNSDVDbzFHRStuV3lzVFRtS0tlYVIrdUx3UkJpRkdtVG9FQ0JlY3JWQ3BWOUdtRW11QWgzQUFaa0p1K1ZBU2JBZ1VLemxzSWd0Q2psY1lteUhLTGxBOTM5UUhJTW9nblRod1BCM1RLMUNsUW9PQThodTdmLzM3SnAzT056V1dPaXNIQndaSEtuQ2xRb09COHg4Q0JBLzA4QkZtYmRJOUdvU2JMTXFLWGwxZjRtVnprVEdpTHpPWUdjc3VxTWRuL1BMUkZzdVJBa3BTaVdBVUtmaTBpSWlMOFRxT3R0ZjVCclZLcHVpZll6cEMyNktPdlZ2TG1VUlBodmxvS0swM2NPR01xQ3dmOXdaWEZ3azBzVDc0ZVZZOElaSnNGcjdnVWhyLzRFaEc5T3k5Qk0rMyttZ1BiSFl5OCswcGxSeXRRQVBqNys3ZlcyRTVuaWdxaUtJcWgzVHE3bTdabyt3UHpXSG4zZFR6UTM0dEZHdzY2djNUUkZxMWFjQkd0eWEydm5EcWQ3UTlkeDhvN3JpTDkycUc4K3MxUFZQd1pWc01ya1VsN2RqUDc0SDc2RG5Hdy9mLytYNHV2SFRWbDFPWVhJN1hROGlUc3hkbVVIdndGeWRFOWpVOEdjRmlveThuQmJwUGM1M045WjZzcW83NjBwczB4OXBveWFrL2w0N0FwbXFXQzh4ZmUzdDUrcHhGcVRkVGdqYVZWYWxFVXUwbUo1a1ZTaitheTBwNUIvbGhLV3RJV1VaUFQ1aWk5UjBkWUNWQ3J4QTRiN1A3eG9DWnNlQXFXelVkeEFpb3NISHY2TGc1dnlNTS9WRU50YlJBVFBsdENRR0FkTytmZlJzV0pIQnJLSk5iTjNRVUJTVXg0OTBtOEtDUzk3K1VNMzdPVFVBTlVmcm1ZYmVzTlhQYkdYMTBLNHBMN09iQlRRc3plaFZQampkVS9tWm1mL0pPOU42VlNJUXhCTmxYVGNEU0RpTCsveFlpYnh3S1EvY0pDOW4yVFMyQnNFTFcvbEhQaHFyV0VOKzBJQy92L3ZnRDFSWGVSTkYzcDg2UGc5NFZXcSszVXgrYlcyRkFMZ25EbXpTTWJhWXNtWGRhbFAvOXB6eTVlM1pYTnlRb3IvNWgzS1VGL2h0V1E2aWpldElscVN3MG5YL3VDdUd1ZVFnVlViM2lQakIwYUx0dTRCaTgxNUx3OG4zMXZyV0xDdzVkejRic3JxUG51VlRaL1pXWEsyL2QzNjNKVk80OXl5YVoxQkFUcmNGb3NUYXV1NlRlVkNRL093TEo3R1YvZXU0emhONDlGUlNsSGwvekloVnN5TUlZRERodk9GbVc4RWpXSDl1RTFzRnA1cWhUOC9xcUJXdTFIeDc0MW9WbU5nTUF6ZTJDN1QxczBzRzgvbmpMR3NHM3ZIbDdkdUorTGJoM1BINzUxaVZSTDhhcHZFWXFQVWFNZnl1UWJKZ0pRdG4wN0drUXlGLzhEQ2JEblZsQmxQUVQ4dXM3ckFSTm5FaERzeXQ1UjZacXplTUtHREFaQUZ4Mk5XRjJOSFZBUlJNU0lJSGJmZGdNOUo0MGxJdTFpSWdaRWV5ci9qRnVmb1R4UkNzNExxRlNxZGt4UkdSQ0UxZzRaRWZEci9pWE9qTGJJWVBDaGQyUVlOMDBkalYvK01YNnMrQk5FUjlWUkpQLzdKY1orc29wZWtjZlk5VnA2MCtRYmtsS0ptanFWSGxPbjBtdmhJNHg5L0phdVNNcm01V3NuSkszMWFaOVZRRkM3VjBsc2FSNFBlWGNkby83dkZyVDJBclpmT1prVGU4dVVKMGpCZVFsUkZIMW80MXRyV1ZMbC9neFJFSVJ1Q3JZem9TMlNLS294TmYxV1dWcE1ua05Mb083UDVHVVQ2WGYvQTVRc2VaN0tHb25RVVNPcHpUeUJmM0lLWVVOVENCczZHRU5Rcy82cTlqVmdMNitrcGVqeXhjdW5sb2JDQnBmV3QyL1ByeHlURFp0SkluajRXUHJmOHpnSlk4T296U3BwOGYzaEorN20yQVpGYTFQdyswTVFCSjlPVE5BbVhqWTFkTk1hUENQYW9yNjhzdlF6dHB0MWhPcEZjaXRNekpsK0VVUC9aQzAwTmJGcDlCMy9MQWYvazg2NEIyNGxhY2ZkcEkrYlRFQ3ZjT3B6ZnlIcWpwZEl1V3FFUzd0Tm1Vb2tOL0xOdUlsb0lsSzQ2TFBuME9GTDcrc25zWFBXeFJ4TENFZHJFTUhuMTR5b2xDMFhYNDdUbUlpV1NtcnI0MG1iM04vamV6dkYzMzZPTm13S2ZTWU9VcDRzQmIrM1lEUFFzdWk5VGFvSHpSSk9LZ0NNdjhYQVRBMG1LaXdPZ24xOU1XaCtIN0xKODQyMnlHbXFvYUdxRG4yWUViVzJhM05pTFN0RTBnV2c5L1UrQ3lPUU1CY1g0MENEVDBUb255eFNyZUIvREVXQ0lDNEVUTGlvaTJxQmVrRVF6SUJWRUFTN0lBaE9sVW9scVlIZmpPclI0RzNBNEsyc2ppZFVCbjk4RGY3ZE9zWXI5R3kraDBUMEVVWmxJUlQ4TDBEWGdSbnFBVmZ3UUdGT1ZLQkF3ZjhDV3N1cWRnME1XVVlSYkFvVUtQaWZFbXh0QWdidENiaEcvbkFGQ2hRb09OK2g2a0JqYXlIZ0dzc1NGSndESERwMEdKdk5wa3lFQWdWbkIySkhXbHA3ZjZoQWdRSUYvd3NRT3ZrZFFCQ0JibEk2T05tWmNaaEZLemR3Ny9KTnZMOHZsMmFkUkNZckw0OVB0KzNsMVkwSHFXM3ZjSWVKOXpmK3hKYjhHbVdKT29LdG1NeC9QVWZlL3R6ZjVmSy92SFF2NlpkTVl2bm9HMmc0aDljeFo2U1RQdjFTVmc0Znd0SHY4My9YS2EvUE9vU3BSdEd3ejJOMFdWYUpnTE43cDY3anE3MkY5SW1ONGRMK1VXemVzb0hIZjhocDNLYTh0MzRQUjRwTGVPdUh6SFlGMitvdDIzamp4d3kyRk5RcXk5VFJRN2JqYXc1OXNKVDkvL255ZDdsK3dqMHZNdTJUNXhHcktqbVhoVy82UWRPWTl1MHFlaVY1NDdEK3ZyUkpKNTVaUVBiT1ltWHpuYjl3bmtaYmE2TzFxUUVib09tNmxSdkE0aHNuTmYwYTJGREdYL2Jud3RoWXdKdG5icDRKTlRsOGMzQm5tME5yaTdOWld1akQ3RGp2YzZvRi9CR1F0M29OdmU1OWlQeVhQNmJXOWpmOHVoQzdydDZaenZIbDY3R2pJV0RrTlBwZk9iNXB4VTFIdG5OczJUZVlheVg4TDd5WWZsZFBSSVdGdkdVZlVyVDNLSGE3bXVCSnMrZ3pQYlhUSk4ySzdhdklYZjBqRFZVbWZBZU5vZTlOczJsa3BhcmJ1NDdTbWlDOFNuNGlkK3RSZk1aY3dlQzVhV2Y4Z2k3NWJpblphM2VCWHhUeHR5d2tOTmJGMlNBM2xITHM3WGNvUDFHRWx6R0dYamNzSkRqYXhRSm9PcnlWSXgrdXhHb1Y4UmswbHY2M3pPaHdnMXV6ZG5GaytRWktqcFlqcm5nVHh4NC8vRVplU3E5eFNVM25PN2IwSzh4V0xWRnpieVEydFE4QWhWKzhnMndjUk9sM0t6RmJmVW44MjkyRUdGMWpzT2JzSjNQSko1aXFyUmppaDlCMzRRM29kUjNmRTVnNDhmcFNncWRjU002U3BWZ2N2dlQ1Mi8wRUd3M0tBK0cyWTdxanNmMHEzZnRJYVRtSnhwQXU3RkViejMzN013dW5Ec05MU1cvdlpLNnF5RitYVGVUVU9VUW1scERmQlMxQ0x0bkpodm5QRXpyeld2cGNkd1dDdWFaSjA3SWNXY09hZVErZ0czb3hmVzZhZzFEVzZENm9vNmJRVHRUczYrZzlieHBGcjl6T3dUWEhPcjFXWFZZdWdXblQ2YmZnZXFUTXovamhtWSthdjl1M25yMzMvWTFUMlY3RXpKcUoybEYzeGhwZjlZYlgrT0haZEtMbTNreGtuSk10Vjk1RXJmdU5lUHpaMjhrdkRLVHY3UXVKSE5JRFM2VzdGdG1Xei9mejdzSTdiUTU5YjVtTEhoT09UcTZqRG9vaUxDME43eEFEUG9NdUpDd3REZis0OE9hNXUvNVJmTkpta25ERk9JN2VlejNaQjZzQUtQcm1YWFkrOXlHaGw4d21RSmZOMWdkZmM1K3hnWjAzWFkreno4WDBtMzhqL2dFU1Zudm45d1Ftc2w1N2tSLy83elg4UjE1TTlLZ0VMT1YxeXZOd2VzRW10L3EzaGNabTVneXBpMDVsSCtiTncwN2V1Yk5mcDMvNzg4NGRWUGRJWm15b2xuM0tBblVJYThaR0tueFNDVGRxa2RMR2NHVHRPdnFQdWI1aldkaFFpY09oUjIrTUppUStncERrNXU5eWxyNU42SFdQMG4rR1MzTUtTUjdtL2lhVUFYKzlpWXI5K3pGWDIvQWZGRWY1cm9Nd3BVK0gxNHE5L25acWoreW5wcUFjLzZUK0hGdXhHN2kyK1cyWmtNYUloMjlEQUtKL3hUemtMbDlCM08wdjBXUEVCVEJpRUlVckI1SDNVejREMHFLeFZsYWlpUXJCTDc0dklRT1NQTForTlZhVENsMVlCSUdENGdnZU5LelQ2NmdDalJoVGpaU0U2TkVrRHNHWTJyTjU3dDcvRDJFM1BFU3ZzY09RZ2I2emg1R2R2b200Z1M3SzlyanI3aVI2Ukgva3FLdkp1UHdEYklBV0s1WnFLNEZoWVFRTVNDSjRZSEtYN3NuMWlKcnBjKzl6eEE4TlZoNkV0ckIwUjJNN0k2dXdvaWlIQlo4ZllORU5VMGswZEJKY3RWWHdqNDNaREEzWHNQN3dTVTdXMk1rckxPWlFoVWxacW5aUXVHNHRHcjJGbzYrL1FVVmVQV1ZyMTJMdDdPR01tOFRJZThaejRNNDVMQitjeXJaL2ZkcmtrREFYRk9BYkY5ZldZVkdSeWRxME5ESlhyS2ZxMEdFYWl1dVJISjN0SFJPN3I3K1lINS85TDVYN0QxT1hYWVJrczdWNFpmb21KcDZWbWxOTFpTWGVJV0ZONzJCOVdDQ1cwbklBK2p6d0FsNTVYL1B0aUtGOGZjbTFGSjV3RTgzN0pESHlwZHM0K2VRQ3ZoaVF6S1lIWHNicU9QTXhtRW9LS2Z2eVRiYmNjQ1BmMzNBanYveFlqazl3czJub0ZlaGlJUkIwV2dTSHcrM2REbVRZcTg5US9zN0RmREV3bVhXM1BrNmRTZXIwbmx3TEdZSnZ2Q0xVMnJWS1pObmNqbmJXbmtFZ3EzRVZsSFlMZFJVRjNQTFJOdTZjTzROeEVWMG8vcFJWakIwWVMyN3VLWEtCN0hvNzl0SlNUbFRFa2hTcytBOWF2NVR5MTI4bGZNSzlxQXhhVkgxSEVwRCtUd29PbXVnMXNLTzVVdFB6bGdmcGVjdUQyRW96V0RkdU5rWFh6aVhhQ1BvZVVaUmtad010TmV2S2pTdHdETG1Cc2YrNjNXWGVQYkdMVXkya3BSclI0V2l4YytUOEhadzRITUdWZTE1R0M5UnVlSTNET3pKZGRIK05iOHN6U0NJUzFDcWtSbnZORFYxUUVBM2xwVUJQd0lHNXRBcS9NSmZid3l2MkFpNTg2MlBBUWRiaUJleC9hd1hHRnhjQUVIN1pRc0l2VzRpekpwOHQweWFRcy9jRytnenZvbEhTcXIrRUlkeEk1T2g3R0hIYm1HN2RUK0NZV1V3WU13dlpVc1dPZVpNNS90MGNVbVluZFhoUGRESi90b3BpYkE0dmZNSUQvNnlDemVRaHpEcjBjS2hsV2E0VmhHNjhYKzExM0xra0hWMTBIeW9Mc2xsYUFDcDlBUE9TWGVyNzlnT0hPRmxSanRWcDVzdnRHU1NFUnpJMUlaVDdab3h2T3NVckgrZFRsVENJeXhOREZUbldXb3ZLLzVIQzNKNU12ZSsycG9DQmZQQXI4amQrVDYrQmw1eGVLYzdhenBGTkJVU21Ec0NSdnhPck5nYWZBTGZwZU0xOERzOTdpc3g0SFdGeHZwUituMEhjWGJmZ0hkV0RoajNwRlB3OEdvcDNjZXpiZmVpbmUxekRweGVoc1VWa3ZQQWhFWDBpTVU2ZGpDNHdDbS96UWJMVzdTRFlZT0x3cXg4RFEzNzFmWWVtam1EWGYxL0JJRTNDZjlDRmhNU0YwblBPTERZOCtTL0M0eDVDeWxwTmZsRWlGMS9vTXRteVAzZ1ZvZWN3ZkVNMVZKekl3eWY1S3JjcGNZZ0R5L1lRUGlZRm9TYUxCcE12dmwxMHZ2djFUdURZOG5meEZjZmlIVGVJME40UnhONndnTU0zUE1iUnlDY0o2ZWxIOWQ0ZkVIdlBvTmVvdUE3T1ZNckJmNjBnYU54SXRGUlNYMm9uT01ibHMrdm9uanJETDA5ZVQyYnBTR1o5OXVTZlZiRFZkNkN0dFJCMnFpZWVlT0pLUVJBU3UrN1l0bE5sVXhGdTBHQ3hPN0RZSFZoRkxjT2pYUjBNanVXZUlzK3FabWhzS0RnY3FQVytKSVg1dGpsTmRIZzRzWDYvZmJjT3Npd0FBQ0FBU1VSQlZBTjZrOG1FMHluaDU5YzlmczNTMGpLQ2c0TlJxVlRuOUJoclFTSHF2c1Bva1J6ZjlKbDNsQkdIWFVOby85Z09WQjRuVmJ1MlU3UnBNN1dsQWdNWFBVMm8wV1VtcVVNVGlCazNnSksxNlJUL2ZBaDk3MVRDQjhiaTFYTXdnVUUxNUh5NUJqTkdrbTZiamFGSEFvRnhqUjBaTlJndnZnanpzUXdzSlNZQ2hxYWc5UTdGbUJwTHdjb3ZxY3F0cDk5ZHQrTWRIa1Y0Y3JQNTZSVVo3M0dPcnNFM2VRdytZaVcxV2Jtb0l4UHhqd3hBMzJzWW9VWWJwNzVLeDFRZnhKQi9MaUlvMUVWRzQ2ak1wV2pUWmtwKzNJY2hkUzdKdDE2Q1NnUkVnZHFNSFJSdDJVVGxMMVVrUHZnMDBmM0N1cVpsRFJ1UDJseE0zUzg1NEJkRllHd1k2ckFFWXNiMHBuaE5Pc1UvSFVEd2pjVTRiamc2Z3l2TzZ0c3ZCVU9nZXg5ckFnZ2I1bUtVTm1jZG9HalRKc29PNXhCOXk2TWtqazBBNlBDZVhOQVNOR3dvV25YN1l6VDBIa3pvZ05nLzUwdmY2VHo2OU5QLytCbFhFTUhhK0s4Z0NIYkFLUWlDSkFpQ0xBaUNMRGlkam85RVViem16ekk1dnlVZjI3bmljRk9nNEUvcHBMRllWdXIxM3YrbExSOWJBeTM0MkVSSmxHVzVVcGt5QlFvVW5POXdPQnkxSGlhbmZIcGZtNEFveTNLRk1tVUtGQ2c0MzJHMVdodkxsVm9MdERZQ1RuUTZuZVhLbENsUW9PQjhSME5EUXgwdGszSlBHeDBWN1haN2lUSmw1d1poWWFIZENod29VS0RnOUtpdXJqNmRLZG9rN0JvelBFU0x4VktxVE5tNUVteGhpbUJUb09Bc29haW9xSzYxUUJPRU5tVlZzaUNBV0ZSVVhIUkcwck8ybHR5S2VoeW5JMlJ3dHRJUUpSbUhVMnI2a2FRL3o0TEk3bngwdVIzV2xkTVZ1elY5TGlrYldvRUNnSXlNZy9YdVIwTnFGbTVDTzQrUGdIcnc0TUdsa3VTMDRPb0Ewem1rZXU1NlpRVjc3VnJDdlp3VTJ2WDgrL3BwakFqVEExYWUrK2hidnM0cXAxUUtZTXRUVnpYVkNuNjFialdQN0NqQXo1MmdNL3JDVWJ4d1VlSWZmelZxOXZERnBIOHo0K2NuU0I5d0Q1TU9yMnBxNUpxLzVCNU8xa3lnbi9FQUI0NGtNUEdwdVUySGJadVFST3lIaHlpOEo1blFwM2ZUcTU5YTJka0svc3l3M0gvLy9RMGRtS0l0L0cyTlQ4c3BvR3RTUnRTd1lOWk1rbnE0MHRwWGZyZUtSUnNPc25yZWNFREY1SkVYY3V0RU14UGZiTnVsZk9xRUNidzRQa0ZaSWdVS0ZIVFA2cEhsdkZZQ1RQTFEzRnJxYTRLQTZEcEc3Z1pOcTFlVFVBUG9HZVNQcGFuR1Q4MlFYbEVFNjl2WExxcXJxOWh5Sklmc0dzdWZhRWtFVkY1ZWdJaEtyMjlSSEM2cXZCQzFJb0pLaGRncTFWelU2MEVFMFV2djRqbFdvT0JQREtmVFdkQktxTFh5dFFteUlBZzBCZy9VZ0N4SlVzNFpPYm50SnQ3Ym1jV2NTWmQxK3FjYUx4MzJrbkpXN1M5aDYvSjFUSjh5aGNjOTZHSCtzUEMvZ011M0xnSGcwdDNMVzN4bHZIRXhybGJGMDJoTnhUanF1MTBBOVBoNGg3S3JGZnpwWWJQWml0clIyTnBOK1JBRVFWWURzdFBwek82MllKUHN2UDdGYWh3SnFTem8zem5OeXJRSmFVeHovMzlaN21FbXZMZWQ2eS9vU2F4R1dUUUZDaFIwalByNitxSjJUTkRUK3RsRXR6UTgyVTNGa0U5WHJXYXJHTWNyVS90M3U5VlZhSFFrVVk1NlRpbjg0QW9VS09nQ1NrdEx5K2lDajYzUkhCVUJ1YXFxS3F2cmw1QkpYNytleitwQ2VPZktGUFJpMTQ2cHJEYzMvWloxN0NRRittRDYrQ2dMcGtDQmdzNlJtWmxaNFNITXBFNU1VUVJCRUx3QnJTUTVpd0d2VHE5Z0xtYjBvaStvMVhuaEpib2NkZHJRWG14Zk9BR0FKOS8rZ1BSaUcxVm1CLzU2TDVJR0QrUERHUU80NzVYMzJPUHd3Vjhqa1ZjcmNlL3NxY3pyRS9LYlQ5QnZ5ZTZoUUlHQ3N3S3JJSWpYNG1walVJK0wyYU5PRUlSNjkyYzJRUkFjb2lnNlZTcFIxbWcwc2lBSWd0NHQyTFlBeWVkdWJCSmwxZldZblFMaEFiNTQvVTRKK1lwZ1U2RGdmd3VTSkdXb1ZPcEZ1Tm9ZZUFvMms0ZGdjN29FbTByV2FEUnlZNDZCTEVsU3BpaUs1MUN3aVlRRytDbXJwRUNCZ203QlpyTmwwZGEzMXRySEpudVlvWWlDSU1pQTdIQTRNcFVwVktCQXdmbUd1cnE2M0hZRVdwT1ByWFVPVzFQd0FKRE5adk5oWlFvVktGQnd2dUhVcVZNRnJRU2FrOU9rZkRRS3VjYVlwbno4K0FsRnNDbFFvT0M4dzlxMTYwcmNnc3ZwSWRUYXBIczBtYUdpNEtvOEFPVFUxTlJ5U1hLZUFIci9wcU4rNTlLMm4xMXdOYVRNVTFaVWdZSS9PV1JaL3VYUlJ4ODF0elpEM1hSRm5wcWFoM0FUbTRyZ1pVQ1NKR212S0lxOS84Z1Q1VldUaTZvd0U2cTcxNVRXNzlRcFJNY0pVQ3NzR3dvVS9GYXcyZXlIMnpWRFpTUUVXUUpCUnBaQmxtUkJsaEdjSURqa3B1QUJnR3kzMi9kMWZpa25Pek1PczJqbEJ1NWR2b24zOStWaWE1YXZaT1hsOGVtMnZieTY4U0MxclczbC9CeWUrWElqOTYzWXpFZVpoWCs2UlNyZnQ1bXhUMzdSNHJPVDI3NWwrcjlXdC92M1A2NVp3ZWpaZDVFODYxSDIxbmg4NGFobDBaUC9ZTkFWZDNQSjRxOS8yNXR3RkhQdFRROHk5SXFGWFB2R0QxMCs3SVVuSCtHL2U2dTZkYWxsLzNtTjBkZituZWdaejNBMjJWQy9XN242LzdOMzduRlIxZm4vZjU0ekY0WmhHRVlZWUVSRVJGSkRSRU15SkRVemM4M016Rnh6eTh5MXNqSXoxM1ZiYTExei9mVTF0MjI3bUd0bWRqTXoxOHpNVE0xWU5EUFh5c3pJQzVrUklSSWlJZ3pETU16bGZINS96SVVad0d2cVZzNzc4VGdQWmM3bDh6bm44em12ODc2K1BwelI3SE0zc0t1b2xCTXRLTC9talpmSkdUV1pubVAvU2NWNWUvQXU5dTByeHRhTW4yLzVpMDh6NS8xdnoraEtCYXRmcCsrNDZhUmQrd2QyMjg1aEZ4VWJVNmJQNDREOTNKRUlIcmZhRHJaaWhnYjcyUENUVFVwSXlGSlQ4QUIvWk5ScXRlNDZkZWZyV0xPcm5DNnBIYmdob3gyYnQrUXphMnVKYjJjREwzLzRCZnNyanJCbzY3NFFZRHRXZG9EZnZicU51TGJKREwwMEdkbmx2dWlBemUyb3AvUm9iY2h2c1IweXVPdnFMcTBjWGNmc2Y3N0h6UGxQc252Vi81RWQwN1NuL0xPUGVMazhnWjJybjJYOXd6ZGUySnRRVzFqMnl0K1pOeXFMR3J2cjlFSDlhQ1ZXdStlTW1ycjFuc2xzV3pnSmRhMlZjL0dxNUc5NGo0SUR4eml3NXh1cTdjZVovL0phcWs1bkd0cExHWDcvaTdTNk9JaTltQmt2RnJKczZiUHNYdlpITE9mdHdkY3ljZEpjaXBvUjQxaXJxNm11ZDUzUmxRYU92SjF0Uy85Q2txdnV4RVN4WnlHRm05YXlyMDBXbmZYbmpvNm1xUGpRRDgyMHRXQWZtNUQ4NE9ZRE9GK3FoMUFIMjZtalI5K3lhL1BtQWh0dzRtSW4yY1RqNDY4Ti9ObkdmcFQ3ZHY4QS9WTUJQZjgzWVFUVWxyRDI2MDlEVGx1eGJSZlhEUnJJdmJsSkZ4V1lPWTRmNXNtWDExSmNyMlZvdWk3a0M3enN0YmNvc2lwWUxzME9PV2ZudHYrdzVzdHZLYXgyczNybFcyeFRSVEx4enB0SmliU3orTVYzMkxYM2F4eFZHdVk4dDR6WWpwbE1HOWJ6WjNHdmJsc1ZpMWZtcy92N0NoU2RrZEUzM2NEZ2pQZ21jQ3Y5aG9mbXZJbE5uOENVMzQrZ2E1eTMwTVYrL0RBTDN0aklubklibWJsOW1UcThGNmRLZzFZYWpyTm8yWHZzK1A0WXNZbUpqQnM5Z3V5MitwTy8wQU91WXRuS3RiejhTU0ZibERVOE5QNG16S2Z3TEd6NVlCMzVYeGRqclQvTUU4OHRRNC9NcldQSGtORkdKdi85dFd6Wjh5MWxqZ2FXdlBRbWVsMGMwKzYrRHRNSnI5YkkwdGMzVWVPcTVxQTlnYUdkbkt6OC9CalQ3NytkakRnTnV6Ly9oQlVGZXlpdmJTRHQwaDVNSFhNMUpnM3MvdTltVnUwOFNJbTlua1dMbG1IUlNBeTk0VWJ5VWcwK0JiNktKeGNzWnM5UkdELzJ0d3k0cE0xUEdFUTd5OTlZdzZadmptRHBlQWxUYnh1S3hRZFVaVVc3ZVdMRlJ5aHRraG1lRlk4anRoUERlN1FMV0hLTC9sM0FyVk9mRHJIdVZpeC9CMk5xZTlaLzhDbTZ4STVNLy8zMVdIeDFtRFVsKzFtMjMwbU85a2VXRkJTUjBPa3laazY0Q2owdTFxOWV4Nm92ZnJDOXNXSHJrV1phbWdkUWhOY2M5Vk9EQzBsQ0tJcUNyY0dEcmRHRjdITzZDVUQ1NktPUEZDSEVqak41RHZzcnEraWNkS3JTS0JkN1MydUpFY2U1Yy9GYjNQcnlCajc0b2VaaThCQXdmZHBzRHVxN01HbFlOc3ZleVEvYXB5STdweWRkdFVkWmxCK2FRcGpjSVowaHVkMHdTUkhrNVdZekpLODdSZzJBaHQ2OUx5T3ZjeUlHY3lKRHJzeW0vNlZ0VDlvRDY2RUR6Rm40SnJPYmJadUt6djNpWk03cUNxcTFDWXkvWlRoais3Vm42b04vWVh0Vms1YTI1SjB0REJvMmhOeW9IeG55aHhleEF6UWNaZFNFUjZtTTZjeVVXNitoWk5QclRQLzMxNmRzYThuOHAxaC9KSnBwZDl6STBPNEpWQjF2T09VNXhRZjJzK09IT3BMajQwblFPZGoweWQ0V3BsMXpTZXQ4S1VONlg0Sk9ZNlQvbGRrTXViSW5DVHJ2aTVuZTlWS0c1S1NqMHhrWWVHVTJneS92Y2dvYTZrYVd2dkltY3FmZWxIKzhuTVY3dGVSR1ZmREV1MThCY0xDa2dwd3I4NWcyZGdnY0tHRE1zNXNBU0VycHhKQXJNNGpWYU9qZE81c2hWMTVHU3BzbTZGKzk3aitrOWVyTHNJNkMwWDk1aVovQ0xmSHFNLzlnZm1FOUUyOGRSdXlQWHpENHJ5dTg2bEZ0TVVNbnpTY2w5eXBHOXpJeWJmWjhWbjhaWk5EYmZtRFRnU2o2ZG9zT0FiWlZiNzdCak5jL1ovU282NGl0M01uSXVVMnVrNW9maXBqOTVIUE0vMjhOSTYrL2lsU2RDd2RRc0h3SlU5NzlqdHQrZTkwWFRwZGJhY1VFOVp1aGlpS0VrUERxYlkxdUJZMUdUWXhlRzRpS0JzRE43WGJ2MEdnMGcwN25JWlIrdjVmbjkzcDRjZktscC9vTVlITzVXYi92Q00rUEdZYXQvQnNtdkxhUmpnK040ZGRNRHE1VTdHWEY5M0hzZVdrZ0ZobG0zdDZmVVIvNEg3ZE1ScmNNNU1PNzRmdlE4eXp0TzJCcHI4T2dpU0NuVndhWkFhMUNRODhlR2FqTGQyTW9qNlJ2ZHNhcExVZU5sZ1J6U3gzQ29EbjNOVzM2bEV5bUQ2L2hzMisrd3laTVpDUTQrR3hmTlhuOXZWcmJtTnQreStEc1M2RG5IYno4MW4xc09UeUoxRDBGN0V2c3c2clJWeUFEYys0Y1NzYlRXNWwvUy9lVHRsVjkzSXErYlF4cHFSM28yU1h0dFBvbkd5ek1lK1ErWHA3N0RFTm0zQWRGM3lPZndtcEs2ZGlKbERnM1dtMDB1ZGtaSWFabWFxZExTSTJwUnhjUlRWNTJ4a2swdGVEdldSeUQrbDJLODBNelNxL0xHT0NwWjlVWDNvL01xTi9lUlBHM0J5bjZzWmJNcnFuTVgxY0VEQ2FoWFFvSjdmUVlOVnF5c3pQSWFhYVlEaHgySFNQN1pNRGwwY3hlT0k4U0oyU2NWZVZmRFV2WDcyZm1xNCtRbDZJaHI5TTRsdlNmeTI3N3JjZ2ZmNEl6YXhEVGgzaXRnd2xYZjBoaDhFZnR4ekxLWXhKSWFVVUR2dmZPMituZlBZYitLV05ZK0p0RkZEOTZFMm0rNCt5R05CYlBIT00xRWZNQUZKYS8vekZUSmovSFpSMjFlMW94UXoyQVI1Szg0Q1lFSUNIOGE3cW8xU29pSXlKUSszSS9oUGNnSWVycTZqNkxqWTA5NVNNNDltTUo5N3oxRlhQdUdFSG5xRlBaMUdyMGFoalcrekpTalpGZ3pLSlAxSFkrSzdmL3FvSE5XVk9MclUwY1p0L2pzY1RHQXhkMlVUQTVRb2ZGM05JME1lcFBIZDFkdHVCSlpxN2REOGc4OGR4OFJuZUpQUG1IYmxjK2cyYSt5NUJCdVNSRXFhbXllM0M0bS93L3lXYmZ2SktOV0dKY1ZOWTBJbGRXWWozNERTTWZQQlE0cm5mSFMxSGdwSFJZOTk1L1A0OHNXRUgyc05mUkpYWmsvditieXNDT0p5L1pTK3ZVQVlBaE4xOVBFbURzMnZIQ1R3cFpqVm9HV2FWQzFraG9aUlgyUmdFME1IUEtJMndScVF6cVpvSGpWVGhjcHhlQk54dDk5NjFXb1ZhNVVjUloreEtvckRWZ01mdElFaU5OSkVUWktEOE82dG9hTE9ZbVd2K0UySmpRanppZ3lGSXJGOVdRbE9BN05pYVdCTWxLcFIzU2ZGMU83cGpjek8vVlNFVlZJME1zSmc2VWZGdmNHcWdGKzllRWQwT1NaYlFvMURjNHNOa2RoUGpZQUdYU3BQdDNyRmp4WmkwUWM2TDdyenQybUR1WGJXUHltQnU1eXFJL2pTZW1vV09pQVpmYkhYZ01MbytFUnY1MUwwMm5qVFZoUEg2TUtnVXNNbFJVSGIzd1ByN3FvNnovNlBNV3p2Y2hwbFF5MjBhZjlOeXhrNmN6ZHZJSjdrMmp4dUVLRFFhc2VtY0RJeWRPWmQ2SVRvQ0w0aTN2aE93dnE2b0N6S0JZcWFqVmtSUWJRWEpDQWdsWmJkajQxTmdUYURncVpMZW5SVVRTMUw0ekMvOCtDL0N3YlA0L21QbmFGcmJQSG41YXo2UnJ0elBNYUpJbFpNVnp4Z0VNbTdXV0tyc2cxWElhdXR5UGUxbjRUUnlsSHp5SUFTaloralpQZkZFU2RJQUUwcG12N3VhMDJ5Zy8za2h5dXppYWtjK2pWU2s0Z29kUWJTQWh4a1pGbFF0U05HQ3ZvYkxlUUZJYjBKbmpLZDNXRlBNdHF6Z0tRZDhSWFdJOENjY3JLVmNnVFE1MVE1VWZxWUVVRTlSV1V5bU1tSU1nUTI0QmhoRll6QkdVVjlUVVB2cjRNMlVuQUxXUWtpclpWM0VRcWRQU1Jxc1JHaFZlalMxSXhNcVZLOTNMbDcveHNTekx3MXAzbDlVeCthWDMwU1Yzb2Zydzk3eCtHRlNSSm03dDZhWDUvdVNyUFJRZnE2TFIwOEE3bnhTU250aVc2OUxqdWJIWHBVd28rQzg5alRuVUh6N0k1NHFGdjdhTCtGVURtNXlRd2EzcHg1anh3bVltWDJIaXNUYytob1MrWHNDcFBjcTJmWWNwUGZBajlxTnE4dis3RzFOQ01qbWR6aTJWazZsVGR4Yi9yZnM1djdlczd0MG9ldWtkRm1mcFNVMXV6K0FlSFVocGw4Q0tyVnZZMlZWaTM4Y2ZzUDRISlVRalgvbkcyd3hPR1UzbHArOVQycUVmZmR2SzZFMERTVnYwQ05OZWE4ZXRWNlJRV1ZMTUhuc2JIaHFaNHowcHFoMEQyaDlqenZNYkdOekp6TUNCbHhPcmhsWC9YZ1h0dXRMWnJHYm45NVdrWjE1ei9nWlNuMGhYZFJrTFZueEVYdHNvY2k3UDRYUys1eHZmWE15WWRSNXM3ODA0OVJKd01mRWtPYjVqMlVkN3lORTdlT0tsRHduTmxUZVIwZDdEb3FVYnFleG1KaU1yaTdRMnA3WTNDemU5emVWemQvSHRaODhTdW94U0RQMTdSUEhVb3JjcDcyVWhMNjhQeVFZVDQ0WmV5bVBQTGlYMnp2NXNXL1VtdXY1WDAxTVBjcjkrSkQ4OWsrbXZwWkFUV2NXcm54NGhOM2h3amVrTTdsakw5cUlHMGpKQ05mdEZMeThqTS9JM2JGKzFrdVJyQjVCK1VrVlU1dGJyKzNIUDh5OTlldkQ3OG1BejFCMENic0svTXFXdlJsUW8xRHNFa2lTanVEMm8xR3ExSklSQUNDSDV0SC81NFljZlRsQ3IxYTM3MlJRWHg1MHFFcU0wT0Z4dUhDNDNqYktXM3NsZU0rT2JIMG81MUtnbUp6VWUzRzdVa2RGa0prUmpUa3lpbTc2UkRWLy93STlLSkErUDZFY25neHAydmRteWpiYmRJYW43ZVptampkWGxLSFZIMGV2MVozUmViVzB0MGRIUnlQS1poTEpWRE9pWHc0R2RPL2pQL3FQY2Njc3dPcVVra2R1NUxiYUtVbFordklkYUtab2VTVkdVVmxSaDE1ckk3aGdNYkZwNlpYY21xaFVOUHlvdWdaeU84Zjh6ME5hWlV4amMxY2dYUlQ5UXI0bWhkM29pR2QyekVPVUhlUHVqUXFJdTdjdTkxM1NrVTNwblV0cDRQMkRYWDNVNS84bmZ6QTlTSWd2K2ZDdUprU3JRUkhIemIzTDQ5c3N2V2ZmSlYxUTZ0UXpzY3hrZDR2UUJOOFkxQTNMNDhidGlTcW9hNk5HakM5RnFzTmRVc09tVFhlUi9mb0NVN0VITXZqV1hpUE8xNkkyazR6Zjl1MUY4c0pqaThtT2tYWnBCZkdUUW9HZ005T21SU212dmEzeFNDbGQxVHdreXExWDA2SkZPSkpEY3NSUEpNVnAwSmpPWFhaTEc0T3kyckZ1L2xjL0xHbmhnd2syMGl6ZlRyMXY3d0F0L1ZiOWVWSlY4ejdlSGo1S1lrazU3azlZWFhPaElla0pVWU03a1pIY2gyRHNVYmJZd29OY2xOSGNrOUwzeUN1b3JTdmp1eCtPa2RlMUdnbDZpWisvZTZLdS9aK1htTDlFa1o3TGd3WnVJMWtpZ01YTFRvQ3dPZkYxRWpiNDkvUklhT0dycXlnM2RMWUg3U2hCVkxOaFZ6MjE5T2dhQ0J5dmZmSThieG81aWUvNFdHaTBaTEhqZ0JxSTBUYzlPWnpMVE96MDBTYVpqOTU3RVdnKzk4ODcydlljQUo5QUlPSHovT2dHWEgrQlVzcXlvSkFtMVNrWlJCRTYzQjZjaUllbDBPdG50ZGt0Q0NGa0lvUkpDYUV0S3Z1K2VrcEt5N1lLOElSZTRwS3IyMjg5eGwrOGpMdTdNS2c5S1MwdEpTa3BDSGE0OENNdEZLa1hmZkVkcXAwNm9uY2U1OWZkL1pPak1weG5mUGNoajVhcGgxTDFQTWVmWjJXUVlaTURKcUJ2R01YYlJDa2FjR2YwaDcrUnZ2Mi9rSCtiOVNDZ0htMDJDZWlRYUpTU25KT0dSSkVsUnk3TFFxbVVSb2RVUUVhRVIvdUNCa0NRSjRZMHZDRUJKVGUxWXBDaWVQVUJtZURqREVwYXdBR3o5Y0EzalpwZWhTSkVNSFRXSmNkMmJ1ZUUxSmxhOU5DZkVMNWpldFJPeFo3aGdreUxFdnBGL21IZXNtUm5xcG1XNmg1QjhPV3orSUtoS2tsSEpFbXBabGdueXN3WEF6ZTEyRjZqVjZsOGRzTGtqWW5ESHBrRkM0cG1ac0xVU0lqNFZOT0ZsdGNKeWNjckVPUzh3OFF6UG1mZmFXMmZjVHIydC90TVQrTlk4U0pJWDFDUUVrb1FreTk0SXMxcUxTcU5GMWtZZ1IrZ0M2UjVJa3VSVDJyeUlhTFZhdDhUR3hrNzV0UTJPUjJmQ0pVZEJ3cG5weG8yVkxrVDhKUkNtQmc5TFdNNnJmRk82Y3graGFSNXV3Q05KVXBER0ppRkpzcEJrRlpKS2c2elJJbXQxeUZvZHFnaDlrOGJXTEo5Tk1admp0eW1LNXpEUTdyemVSZmJ2V3Y3V3RudDRkTU1TbG90UWhCRGxsMS9ldTdTWkNlcmZmSlJGVWdocnJpekxnVTJsVXFGU3lWNWdrMlZaZUR5ZVlGTlVBQjZQeC9PQlNxV2FjRjd2Sk15N0ZwYXdoTVVuRFEwTlcxdlQxb0syRUI0MldaYUZIOE84d09ZRk43azFqYzJQakhWMXR2d1RkYURHYXVXSFk3WVRzd040UXRPZkZVWEI3UW5kZnZXaVZMTmk4U0lXTFZyRSt1MUZ2N3JicXlrdll2V0s1U3hmZHlFQzZFNEtWcSttMG5FUnZOMk9LdGJuZjNiQzNmdTJiNlN3TkxUV2V2ZVdOUlJWdEY0bFdsbThrNVhMbDdObXkrNW04OVBKWndWcldiNXNHWHRLbTdoNFBpdFlUNVh6ZjNQckJ3OSs5MVV6VUhNRDdsQXpsQllhV3hPZ3FWQ3AxRjVnODI4UTREWVNnQkliRzVzUEhBNTlHRFllZVBwVnJsKzBqajhzZTRlK1Q2M2l2NVgrQXVSRy9yN3NiZkwrOWdMcGMxWlNGampKeFVQL2VvMis4M3piNHk5ejZjd2xmRlFqZnVVelZNWmdNRkM2NHkwV3J0N3hpK3U5dTJRTG82YzgxZnBPNng0RzVWM1A5cUpTS2lwck9QK2ZLVHRQVEh1UXdvdUFPMkhkTTM5aS9iNFRFNld0WC93d3E3ZVhoZnkyOGRXL3MrMkF0U1ZHbG13aWQrQ2Q3Q2t0bzdJNjlPR3RuZmQ3N24zaWJjcktLN0RhbTJvN2JIdldNSDMreHYrSkdkcWpSNC92ZmVEVjNBeHRLcVh5RllZR1k1Y1gwSm8ydFUrRms1clNQaVFoU1NoQ0NBVlFQQjdQQnBWS2RWZlR1NnJobmxFanlHenZMUk5admY0OTV1Ui96WVpiZXdNcUJ1ZmxjdGVnQmdZOS8wVlFselU4K2NEdkEzK1ZGMzNKeU0zSDZXT1NmdVc0Wm1MWXJXUFJWWDlDWWNrSnRKN0tNbXJjT2xLYk02UW9Uc3BLeTVBTlpwTE1vVFdRRGxzMTVaVld6RW5KR0hYbkthOU9VWERVbExGcCsxZTQzVzZRWmRUKzVHUkZ3VnEwazFMTFFPYk5uTzZkV0tkMVRVQUdlMDBWbFRaSVRXNjZaNmU5aHJJS0swbXBLZWlDTCtaMlVGSldpU1hsREpkdVZKeVVsWmFqajdVUWE5U0ZkS0t5ckJTMzNreFNyT0gwQU41aHBjb0dsbGd0WmVVMUpDVmJtdTdYTjA0NmN4Sm1RMmc3MVJYbFdKMXFVbElzSWM5SEFSUzdsYklxRzhrcFNhR0p2YzVTNWkzWnljTGRyN1I0ZUJXbHBlak1MV20vRkxlYjZVcytRYTJXVzFoSnhUdDJZT2g3QzdPbVQwT1cxU0huYk4rK2czRlROak41Y0doKzVzRHhrNWlhL1FDbFU0YVFjZ0ZqWlhhN2Zjc0pmR3VlSVArYUFnRWZXOEFNOVd0c2FyVUt0VnFOMm1lUEVteVMrc0tqQ3VDcHFhblpFQmNYMXdSc1JKRFp2cWtVS2lVMkJzY1JmNkd6bXN2UzJrRnR5VWx2NEsyZGV4bVdmVFVYZFh4UnNURjMvQTI4V3VnbVJWOURsYkV2RzljOGowVUg5cklkREI1MEc3cjBuc2pXTW1MNzM4K0t4OFlCc09YVnYzRFgzUFZrWmFaUWV1QUFNNVovenFnc3d6bnYzaE9UaDdOKzV3L1lEbFF4YU1oMXFPVkVGcTVkUm1jZFBEWnhDSnQySDZibVlBMURobHlIbkhvVkc1Zk1QQ1c0amUvZEJuMy9DV3pOMzRKZWRqQmd5Z3M4TVNHUHRmTWZaT3FDcldSME5sTlUyc2lyYTliVE44MklyWFE3Z3diOURsMTZGZzZIaTVvZ2pxRXhtWkdNV3RYQXFLNVFzMk1KWGFkK1NzV09Gd0U0c0cwcG84Yy9TbXpuTEp4VkpReWE5aUt6eC9UR1hyNkwwU051bzhxWUJsVUhTQjN4S010bmp6MXB2OGZudHFYRW5FdnBycy9vbXRzSGEvRlg5Sno0QWdzbURhUnkzeVpHanJrZmJYSUdOUWYzTVhENjh6dzVjUkJRd2Npc2ZsUW1kQ2FXR2c1VW0xaTUvbTJ5TERvMlBuTTNqNnc5UWl5TjJLdUtjR2JjeWZZVnN3THZRa25CS2lvNi80YVFJWFZXTVduRU5XeXJTY0NFQTdldG1zRkRmSXB6NFRwR1RudVdvbDNibUw3OFc2WU9TZmFkVk1XVWtiOWo1OEVERkZmS0RCbXlHVXZ1TFN4NzdDNUt0eTVqd3B6WEtOcFZqcUg4TnRZOXBXUGNySmNZMTk5YkZvbXhKNE03bDdPcW9JUnBRMUl2MkN1eGI5LytMMDlpaGdacGJLRkJneVlUMUd1R3F0VnFTRTV1aDlsc2xxS2pvNldJaUFoWnJWYXJaRm5XU0pJVUtVbVNVWktrQkNHVWZVSW9vc1htckJQM1BmT1NXTGozYU9qdk5jV2k1NnczeGFGV3puSFZIUko1czVlSy9RMnRYTzhDYkVlT1ZJaERodzZkOFhsZmYvMjFhR3gwbkZXYkh6NTNqN2orankrSC9QYkRCMCtLeEY2M2lGcVBJb1J3aUQ5ZmY2bDQ4SVd0UWdoRi9PZTVlOFhWOXkwTUhCdmM3dTJYeFloWFByZjYvbmFLeGtiM1Nkdis4YVBGb20xaW9raHN0ajM2eG1lbjdIZkQxOHRGVEs4N1d0MTMvUE9YUmVLVjk1elJjN2lqVjVTNDVyNW5oTXQvL1FhN3FQMXFsVWpzZUpYNHZ0WjdIMSs4TVVQMHVuMnVFRUlSejk3ZFIvenU4VFhlOXI1YUlXS2tSUEhoajk1emIra1dJZDdhNyt2TGZ4ZUx4Q3Z1OUxiaktoTlh0NDhYcjN4UzVtdlhMWTRkcnhGQ0tPTFJtN3VMKzU3Tjl4MVhKVzdzMWs2OCs2Mzk1SDIrSWxHOHRkOHBYdnZ6OWVMMmY2d1J4ejVaSXJyOWRvNFF3aVorZjNrNzhmZjM5d2doRk9HcDNTTjZ0YjlVZkZIckhjL2EycWJydnZibjY4VHR2dnZZOFBTZG9sMi9lMFc5VUlSb09DaDZ0V2tuUGo3YTFONWJmN3RGM1BqdzBwQStmUEhHSTZManRkTkVvMUNFYUNnVlY3WFRpRWZmTEF3NTVzL1hkeEJQYnlodE9XL2ZuQ1Y2M1BGRXEvZjJ4K3M3aU9jK0xHOTEzK3NQM3lodStkdktDL1plS29xbkNCZ05EQWNHQWJsQU55QlZrcVFFSHhaRnlyS3NVYXZWcW9pSUNEazZPbG95bTgxU2NuSTcwdFBUeWNyS29rK2ZQbHg3N2JXb1pWbmxqeWhJc2l3TFJWRWtYeERCYjQ1Nm5FN25lMXF0TnBSMFRYSHhyN2MzNEU2L2duc3lUcjg4YWR2Ty9jUmYycFd1T2k1cTJiWHJTM3IydlFhakRLQmx3T0E4SHR1NUd5YjJKYk4zZnc3TS9UUGo1Ukw2NXZWbDVNaWgrSW1rQmd6c3k1eTdidVRBeU92b08yZ29RL05PenNsbTZYOFg1UlYzL1d4OGptUEdqZzJZWGpxZGpoM2JDbEQwc0dqdVg3elRxcXFJUGJ0MEtNQ3VuWHNZT01GTEdtREtHa0JQODZrTlh2ZUJiWHdtOTJadFhsS2d6VmlURWFoa3k5WUR4Sm8vWU1hTUQ3MDZqZHRCNGU0U2hxZDNQY2tWOVJnTWFqQWFNQmxpTVJqdE9PdzJzTzVqeTI0N2NzSHJ6TmpxTlJXZDdsTDJITFNSbmExang2b25XYmppUXlxdERtb3Fpa2tkZFhQZ2lqMXplNk1IMENXUm1sQkRWUTNnczhxcnE2c3dKWWV5Z1JUdS9wSzhBWGQ2dFRwZE1nUHowcys3VDlNWWE2S3E3TUk1Tkd0cWFyYlFzdElneEJTVkpFa0pyQnNhRWcwTjhxMnAxV2cwR3E4cDJzd2NGVkpUdHE0Q2VNckx5OWVucHFZK0ZCVHlaTVY3Ry9oWTdzZ3IxMlZ3MnJYSFNpTXJzU09ncEFBQUlBQkpSRUZVZHhZemNzUkZsdUp4aHNYWkNiM0hzRzkzTGdYNUJheGUramVlWExHZGZXdm5JZ01Ubm55WC9ydTJVYkJsQ3pORzlXUDN3bzk0Wk1TSkMwUXFkNnhnOEwxL2IvSDd1Tm12TVcxRTFvVVBwaGhia2c5WTBub3hZb1IvN1lZYkdUVTU5cFNQek92Vjh6cnRGRVZwZXRGUGVxS2VBVU52b25lQzk2OFJJMjRrSlQzbDlBWlA5akZFZU9FVFVGQzBaZ2FQdkpFVTJYKzltMG5ycktkOHkwSW1MUGlDL0kzdjBUWEJ3UG9uNzJSK1JSTVVxZVVUKzBXTkpoTldxN1dWUHNnWGRLUnNWaXNtaytHQ3RiZDE2OGRmTlFNMTEwbk1VQkdhdHhia1cvTUJtK3hQYUdzQ3R3QlZlQ0E2bXBiV2FaK2lLSnQ4c1F2ZS8vQkQvbDFuNXNXYmV4RjVCcy83NkEvZjhJbW5MY1BUREJjVnJsbGkyMUpjWEJMeWxjM092b3pkMi82RFZRRndzbVhqZG5KeWVnWW1sU0VobFJHM1RtRHhNdzlUc1c4L0RwOEQyV3ExazU3ZG40blRadkhRK0w3czJYZmdwRzJiczRlemZ0MTdyR3UyM1RXNDZ5bjdyZFhwVUtxcmZIMDhmVm4yeEJUbUxzMC9yV096K3c2azZzQlhKR1gySmpjM2w5emNYTko4UVlYczNKNFViUEdta3RRVWJtRlhWVk5IWXMxR1NrdThrY0VkMjNZRW5xMDZ2Uys5bGM5WUdZZ2FLdFRVV0lFRUJ2UlA1bUNGTTlCT2RrYm5Wb0gyOUZTYVRBWm0yQ20xeGdhdWw1bWVodEVnVTFGYVNrTFhYblJOTUlCaVkrMjZndE8rYkU1MkwvYnRDYVdLejg2K2pPMWJ0bmxYZzNPVWtiLzk0UG4zZCszWlEwNTJ6Z1Y1UDl4dTkrWVJJMFljQ3dJMkZ5MFRjNE55MTZTUVpOeGczNXBHbzBhcjFhSldxOVYrVVBORlIyVWhTUXJOelZHN3ZXR3R3UkExbUlZalBGN3dIVlpkQkFQbjd2ZStBUEZwZkhMdjFRRE1YdndxNzFjNHFYTzZ1WEhPUzJUMnVKelhidlJxQm05L3ZwOSt2WHBoa2k4cVhDTnorQVR5WHI2SnRLNXZrVFgwUHRZK05abVVRUk9ac3Z4OWNuS3VJa1ZucGNyWW40M2p2R2JYWnl0bU0vR1pqOG5zbWtKeDRXNG1QZktTMTNUQnpVUERlN0JMU1NmSjZLU3d4TTN5OVlOUHJtOW85U1FsbjkzTEs2Y1BaR3J2WjhuSnVneWpJWlZsQmUvUTlUUXV0V1BUVyt4Tzc4d2o0MDdOTUcvTUdzSGlTUjh4c0dkM3VtYW1VMVZ5a0s2ai9zYXJNMGR4MXlOL1orWGczekZnNjRzNDNZTGtJRk4wM01TN0dUcStINXV5T21NeFJ5RGpXL3RCbmNTaTVmOWd6TGlyV05ZMUU2V3FqRUZUbjJmbW1ONDhOUDhWeG82OG5aemx5VmkwRGc2V0NaWnQzVXJPV1ZIZzZabjM2a3VNSG5NRGE1L3FpczVaU2FtdEhmazdWNUUxZER6bUo2NG5iL0NuNk94VldCTFNUdnVxNllOR1lwaDJHd2NkaitGZit5ZHIxQlNHTGIyR25MeHJpWlZkS09ZbW1wK1haOS9CeS9uRkZPK3JRRmR5RTZzZTB6Tmo0WHNNeXpLZS9ZUzFIMkRqTGlQTGw2VmZrUGZqMEtHeVQxb3hRVjBuTUVPRkpNbEIwZEFtVGMydnJXbTFXcVJ1M2JyUjBOQkFRME1EalkwT3FiSFJpY3Zsa2hSRmtSVkZrWVVRYWtEN2YvLzNtUEhoaHgvZUJyVC9KWU5NWldVbFRxZUw1T1F6cXhUYnMyY3ZuVHRmZ3ZZYzE0cldWSlZqZFd0SnNZUytYVTY3bGZMS2Frd0pTWmowMmhiblZOdGxVcEl0cUg4bEh3bTN3MFo1UlJXeGxpUU1PbTN3RHNyS3FraElTVWJiN0Y1dFZlWFlNR0l4dDJJQktFN0tTOHZSbVMzRUdrSWR1dFVWcFRqUVk3R1l6NEdCcDFCUlZncTZXQ3pCYVRtS2s5S1Njb3lXWkV6Nk0wdkpXVDdySm5hblBjd1Q0M3VIdEZOWlhvYk9sSFJhdE80L1JiWXZtY2FUcFRtc25uUCtYVVpDaUxLYmJocjU1M2ZmZmRkT0UwV1JEYkJKa21USHk4UG1sQ1RKTGN1eUlzdXlvdEZvUkVTRWxvZ0luWWlNakNReU1wS29xQ2dNQmdOR281SFkyRFpJUFhyMHdHNjMwOURRZ01QaGtCb2JHM0c1WEZJempqWU5vR3RzZER5aTBXaW1ob0V0TEdFNWY2SllpMW02cVlUeG93YitUOW92V1BVcTZVUEdrV0k0LzE5TnE5WDZVa3lNNlFPZ2dWRHV0WHBKa2hvQWh5UkpMa21Tdk54cmFyWHdBbHNFT3AwWDJQUjZQVkZSVVVSSFJ4TVRFME5jWEp6WEZQV2JveXFWU3FoVUtzbmo4UWhabHZCNFJIQ0psZnZRb1VOcjB0TFNwb2FuWGxoK1BWTEQ4b1hMcUc3Rmoyako3TXVvQVJkK3pWYlptTWI0VVduL3N5Y3ljTlQ0QzliVzVzMWJkalh6clozUXZ5YkxrdkNibno2c0NqSkIxV2kxR2lJaUlvaU0xUG1CVFVXUXI4MFhIWlh4eGtZRDBWRWxQZjJTL1c2M2E3VXN5eVBETDBSWWZoMWk0dFpKazhPUDRYOGdqWTJONjBhTUdGRkZxRi9OQmJna1NRcXdlUkNvRFExbDhRakdMcjl2VGFlTElESlNqNnpSYUFJSEJLZCtCQmZHK3dJSkhyeVZDRytIaHlRc1lRbkxUNVdpb3FKUFd0SFdnb01HbnRZb2lwcW5lR2cwR2pRYUxWcHRCRHFkRHIwK0FHeWFRTGpVcitLcFZMSm96dllCZU16bStBSWh4Q2ZoWVFsTFdNSnl0dUx4ZUhiMDdIblo5eWZSMWxxd2VhaFVUV2FvRjZ2VXFOV2FGdHFhd1JDRldxdlZvTkY0YlZTWHk0dUFicmNiYjBXQ2dxSW9BWEFUUW5nQWQzMTkvYi9kaW5KbHJVdW1YUnRENjVFNWp3QlZzeUozajR2eTR6WWlvZ3pFUllZcHRuL09zcnRnTlRzT1ZJSXVpWEhqaDZNUFA1S3duRU01ZEtqc1B5ZlIxdnlNdVVwb3Nic3F4QVQxNDViZnQ2YlRlUU1KMGRIUnFMVmFMUnFORnJYYTJVb1F3ZDFpb1JmQWs5SWw4KzFMSDV3N01USENrMW51aXVUcGNkZlRKeUVTTDIzUk90Nzlyb3BLeGNTV3Y5MkN2eVQzeUtGdkdiOXNHM0dXZUk1WEhxVnpyenorT2FnTGNuaU1XNVh5SFRCbkN5eWE4YjlwWDZ2VFk1QXJtZnJRRzR3SUExdFl6cUVvaXJLdlg3KytlMXJYMXBxVzFzTy9ZSXNrQ1ZtV1dna2ErRTFRdjdZV2ljRVFoZEVZZ3h3UkVZRlhhL09hcEUzZ0p2dTBOam1Rck9zSHR1UGxoOXo1RDl6MDV1b0hiK2VoakFqbTVIL3Q2N0tYdHVpOWU2NmgrUnJqYjJ6OWxPNTVWN1BzOThONGQ5SzFmTHA1TzE4MVhDUUQ2ZnZYV2dWbEZhSDc3RFZRWEVySVN1ZUtBclp5MkxvTDNHN09hUFZ2QmU5VUtTa0d1ek8wQTdicWx1MmZTREx5aGpCMjlGQk9GUEYzTzZ3VUY1ZGdkN2JzWEUxbEdTV2w1YlRZcFRncEt5bW12TW9hZnJzdllxbXNyTnhZVm5ZNEdOU2NCTllMRFNtaFVrSzF0ZUNnZ2Q4RWJkTFdvcUs4MmxxYk5pYmtpQWdkV20yRXp3SFhsTUdyVXFtRnZ5SWhLSWpnYXd6Mzh1WExWd0xmcGNURzRHZ01wUzJLaTJ5WlFHalFhbEg1bDdPWEFMVVdnK3JpR01qK0ZwajJFT1FOZ3VHRFlJR3ZPRzN4RE9qWkg2Wk1nS3plVUZUdC9mMmhNVEJ1TnBSc2dTRkRZUEFZOE8waTF3eTdmUnlFZTFaQXo3Rk43ZVF2Z0FGallIQXVqQmtMMlNPOHY4OFlDVU5Hd3NneE1DZ2JKaS84aVdicTJtZm8zTGtYVTZiY1E5Zk9QVmk1bzlTM3g4bVRFNitoNzlBN21EcjU5L1RNSG81L2o3MXNCMzB6TG1YODVEOHhmdVMxakptNU5QeUdYNFFpaENpZU5ldlJMMDloaHJZb2VQZVZUWW5nOUE0dnNFVVFFYUh6SmVrYWlJbUpJVFkyRm5Wa3BJNkdCcTg2NTNScWZMNDJkZk1JYWJCSjZnRThkOTg5MFhyYjZCR3Z2L3pwZDdOSFh6djhsRGQweDNYWDhNRHJteGhmdkpmcVl6WGNPZnBhTHJsWWNsM2RFdFd4Z2owK1ptYUhBNHJYdzJOYm9YQVhtTlN3ZGk0ODlCU3NmUXllWEFrSDE4Q0lGWkMvNHN5YTJya05kdTZHRExPM25jQ0hKUk5XellHYUhaQTZFWjZaQkdlVnY2NVVNbTNTLytPeHRkOXdhN2FaZmF0bU0yRGFZNHpZdmhodHpXNFdyTEt5cGVwelVtVlFuTTZBdHJwanpWSzBBLzlFL3NKN3ZSRG9kSWJmOG90UWpoNDkrdDZMTDc3WTJKcTJKa21TM3d6MTBFVC9MVUlqb2NHZ3BpVWlRa3RrcEM2Z3JabE1Kc3ptZU9USVNEMDZuWTRtWDV1R1prbTd3ZWtmSWFrZmsyYiszNy9kNlZjVW53NXQwWmJQdnFCU1orR2VxN0s1NS9KMnZKRy9rd0EvNWE5ZFpNR3RRWnFWVGdmYnRvQWVtRGNUWnN5QWpidGhUK0ZQYjZyblVDK28rZHZ4UzU2dk9zZVVBcnBxYjNyMzJUbi9DaW0wWnpBZzI5dEl4c0JCcUFzL3AxUUJqT24wVDY5a3pMRGJtZnZNSW5hWDFRVEFNN04zZnc2c2VaenhrMmV3WlBrNmJJbzYvSlpmZk5yYTkwODg4Y1FYelVBdFdHTnJrZUxSSE5SYSt0WjB2a2lvSVZCMVlMRWtJa2RGNmRIcEl2SDYyclQ0bzZTaHFSOHFFUVJxQ3Q0SXFmdVYrYzhjLy91QWprdFBIUUJvWk9XbjMzTGJ0VmZTSjlYQzlmMzYwczFWd3FhUytvc0UyTUJvYU9rTFMra0pJMFo0dDNIVFlOVVRaK2F6VTl3dDl4bFBVUHNjWU1vNW45RWFPWmFsMi9jeWYvb3R5Qlc3R056N2NyYVdlVFV6THhYVFI0ekk2OHpXcFg4amIvUk1sUEM3ZnJGcGEydi8rYytuSE0xTVVMKzIxdW9TZThFWUZGeGg0TlhXV3ZyV3pHWXphclVhMldBd29OZEhobWh0VFVtNzZ0YTQybnpnSm5ra1NYS3ZXYm5pVFNIRS9wUGZrZ3BEaElvZnFtcTlMNlNqbGtQMUVnYmR4ZnZWN2o4QURoUkMxeHpJemZWdUtVRjE4SG9qV0N0RGd3b0FDVVlvOVRIeWJQdnNQSGZTWU1ic0xxZWtPcWdYU1psazZmZXhaVmNWQVBzSzhuRm5YZTdsSkhQYXNMcjE5QjQ0akJuekZqSWkzVUZSaVZjM1BERVZVMWd1RW0zdG05bXpaKzlzQmRTY1FmNjFWbEk4WkVKTHAwSzFOYjArc3BtMjVtVStVVWRIRzZtcnE2TyszbzdEMFVCall5Tk9weGFOeG9YTDVVS3RWZ3UzMnkxNVBCNmhlTU56UWdnVUVJb1FlQ1pNdUxQMmhUckxhenVtWERjUFRreGJOUG42SzdsNzFYdDhzVE9lbXFvcWtyTDZNRFJvN1lTTFRkS0d3c3l0a0pNRm1lbmVLT2JRaDJEdU9COSs1SHI1a2JPeXdKQUVHemRDTERCaEl0dzFDQloyQmJNQk9KL1VkdXBVWnM4YXlxMDl1NkEzcGJGaSs0ZGtHaXc4dGVDdmpCclpoK1daYWV6WlY4NkM1ZTk3MlYxckN1bWZlenZtakN6a21oSnFFc1l3TDlmTC9YdGlLcWF3WEF6eTQ0OC9ybjMrK1VXbjhxMkZKT1FHMFJLSmxxQVdFV0QxaUk0MjBxWk5HK0xqNDlINS9DL1NhNis5U21scEtSVVZSemgycklxYW1scnE2cXpZYlBXbnkvcWh2ZTY2SWZwMTY5YXRraVNwOTBudnp1T2l2TGFlaU1pby8xbUM3cytOM2NOaGc0cHFzRmhBZDVxWHJxNEVSUWRtNC85dW9yb2ROc29xcWtoSVRrRWZuS0d0T0ttb0tNZXROcEdjRUVweGZUSXFwckQ4ZWtWUmxKMlptZDJmMnI5L3Z3TXZpMGU5YjdNQmRoK0xoL04wV0R3TUJpK1FtVXd4eE1XWnNWZ1NTVWxKNFpKTExxRkhqeDdvOWQ3UHBicE5temJVMU5SUVYyZkRicStub2NGQlkyTUVXcTBUbDhzYklWV3JWY0x0OXJOK3lIZzhua0N5THVEWnNHR2owMnExdmhvVEUzTnlZRk5wU0lvMWhVYzZTSFFHU0QxRHJTczI0WC9mYjdYT1FHcHJIWmUxV0pKU1d6MUhxemVTbW1vTUQvcEZKc1hGeGUvdjM3L2Z6YWtqb1FwTnE3djd0TFhtdnJVSUg0T0hWMXN6R3IzYVdrSkNRZ0RVQUdTejJZekpaQ0k2Mm9CZUgwVmtwSTZJaUFpZnI2MTFmMXRRMUNLdytJTEoxT1k5UlZIV2g0Y3hMR0VKaTE5Y0x0ZUhsMXpTZVg4elFEdWxiNjAxdjVwR293M1FFdW4xVVVSSEczenBIZWFBYnkwQWJBa0ppY1RHeG1JMHhtQXdST0ZOLzRpZ3FTSkI3VXNCVVlrZ0N2R1FFaXU4aXk2NEtpc3JYdzBQWlZqQ0VoYS9mUG5sbDVzSVRjWU5BSnRQVzNPZlhGdlROS3NIYlNwME54cTl5YmdKQ1lsRVJVV0ZBbHRTVWx2TVpqTnQycGlJam80bU5QMGpJa2hyMHpTUGtyYlEydHEyVGRydWNybVdoSWN6TEdFSlMzMTkvZklycnNnOTFBelVHaytrcmZtWDFHdGVOdVduSkRwUmVrZFNVdHVXSHBISXlFZ3NGZ3R4Y1hIRXhNVGdUZi93SnUxR1JHaDlLU0FCY3pTNHpFbzBxeUYxUzVMazJydDM3MUxnOEs5dGtESXp1NFZwd2NNU2x0TVVJY1RoTld2V2JHMU5VMnVtcllYa3JiVVdDZlZYR1BpNTFwcW5kMFJHUnJZRU5vQ2twQ1RpNCtOcDA2WU5ScU9ScUtnbzlQcElJaUw4NEtZNWJWL2JaWmRsZjJlMzIxOElEMjFZd25MeFNtVmw1Y3F4WTI4LzNreFRPNkcyZGlMZm10Y0UxUklSNGMxWkN3NFl4TWZIazVTVTFHcjczblhJdFZvc0ZxOUo2ZzBrUktQWDZ3T0JCSzAySWxoekU0b1FPTjBlNGZZb1FoRk5yQjkrZE83YUkzdnBzL21GbTBNNEhOd08zdnBvQjlOWGJPTHgvTjBjYVJUaDBROUxXSDZGNG5hN1A4N0p5Zm44TkxTMWtLWDEvTlVGdmxRUFh5VlVSRkRBSUxnZTFJekYwdmFFVmxRZ0FhbDkrMlQ4Z1lTWUdDTUdnd0YvSFdtdzFxYlJ5RGpkb05ab1VLbFVJQVRDMXprL3VCMDZlTUM1WU1OL2x3UUQyN0wzMS9ONmlaTXhmYktJc3g1aXdxclB3aVUxWVFuTHIxQUtDd3ZmTHlzNzNMeTZvQkZvREFZMUg2QXB3VFdoVFZIUUptMHR0QjdVR0FnWXRHK2ZmTUkraEZRT0ppVzFKVDQrSHBPcERkSFJYcE0wTXRKcmtqWnBiVHJNYmFLRklUS0NDSzFHcUZTeThHSmJ3RmIyU0JLdWcwL2Q5N0hMNmZ5WDk4cU41Tzg5d2wzWDVwSFR3Y0xFRy9yZytxYUlyeHZDa3lBc1lmazFpZFZxZmJWWHI1d1NIM2dGZzFwd3dYdHp2aldmdHFacVJWdlRoVlFZbUV4K0U3VHRTZnNSQW15SmlZbFlMQmJNNWpoTXBoaWZTZW9GTjUydXlSejFSVW1GV3ExR0JOR0xOR2x0a2h0d2Jpc29lRVVJOFNWNGNDc0NsY3JYbkt4Q0pXd1VWN3ZDTXlFc1lmbVZpS0lvWHozLy9LTG1BWU9BYjAyU0pDZXQrOVo4SnFoR05HbHJUV1ZUM3B5MWFFeW1HTXhtYjhBZ01USHg5SUVOb0YyN2RpUWtKUGh5MjR3WURGR0JJbmsvQTRnL2tBQUtpcEJRYTlRQklrcEpDakJndXNkZE43VGkrUEhqTDRDZVBwMWlXYlc5a0tNMk94OTgvQ1UvQ0ltR1JuZDROb1FsTEw4UytmYmJiMWZQbURIRDFncW8rVFUyUDZnRnAzaTBXSEdxaWJuRFgrUWU1VnZoUFphRWhBVGF0VHQxT1dRTFlJdUppU0VwS1Ftek9kNlgyOVpra2dhRG15eEJuY01qZEhvOUdwV3ExYVJkSk1rVkYyZmU0SEs1WHJ6N3hpRjA1d2lUWHQvQXAwb2lBMkpWNkhWaFRxNndoT1hYSURhYjdZMnVYUy85SnNnRWJXeW1yYldhak5zVU1OQ0k1cUFXV3VUdUpaQk1Ta29pSmlibWxQMXBGVm5hdDI5UGRYVTFWcXVWK3ZwNlh5RjhJMDZuRTZmVGlhT2huaU8yUm93bUUycVBrOFpHQlVWUkVFSUlSVkVVRUI0aGtDU1FrU1RWSjU5ODh2SlZWMTNWYTlwTnY4a0djTmVWYy9XMmFQNFVIMTZwS2l4aCtSV1lvTHRmZmZXMXphMzQxWUpCellVMzE5VWpTWkxTUEJtM3lhOFdXalpsTUVTSEZMeTNiOS8rdFByVUtyQnBOQnFTazVPcHJhM0ZacXZEYnJmamNEaThsRWFPQnI0K1ZvY3FNZ3BKdUdod0s4SXRKRW10VWdraEZEd2U4TklhU1lvQU53TFgxVmNQTE52ejVhNUZYM3FpRmlkcEZkNzUrSE95Y252VE1ZeHJZUW5MTDE2KytlYWIxUTg4OElEMUpDWm9pMlJjMzZwVExkSTd2SDYxbGxIUXhNUUVrcE9UMFdoT0R6Uk95S2Rxc1ZpYUplNUcrMnBKSTRtUGk4T2tqd0NWQ2ttbFFwSzlxQ3ZMS2lGSkNDUkpTSkt2WWwvQ0pVbVNNL095N0UybEpTWFByaTg2VE0vZWZYbDZjT2Z3akFoTFdIN2hVbHRidXlRam85dUJrMmhyZm1Eeis5WjhBWU1BcUlVdzRucWpvUDVhME9pUVJOem1oZTVuckxINUpTVWxKWWpTeU82ak5Hb2tQVm54Y2JiWnFLKzMwOURRSUJvYkd5V1B4NE5hcmNiajhRaWZCQlpabGlUSm1WaFQrdEtNMy8rK215ekxnOEpUSWl4aCtXV0wyKzNlOHVpanN6OXVCbW9PbW5MV1RoUUZEVFpCaFplMUk1ZzhVdTh6UVUwK0U5UkNTa3JLR2ZYdHBBejRVVkZSSkNjbms1aVk0RXZjamNGZ0NDNlVid29tK0d1N1ZMNUFnbitwUG9JcUV1NjY2KzdqaHc0ZGVnRW9EMCtMc0lUbEZ5MC9mdnJwcCs4OSsreXpEYTJZb0k1bUptaWd3aUEwWUtBV3dacWF2OERkWUlnT0xLUG5OMEdiczNmOEpJME52SUdFMnRyYWdOWVc4TFU1dmRUaGJyY2J0OXVOeCtOQlVacUNDRUlJZk9BbUNTSGNnQ1JKa3B5YTJ2RnpxN1YyUVhSMDlOenczQWhMV0g2WmN2anc0V1Y5Ky9Zcjg0RlhNS0ExTjBIZFFSVUdvbWxSbHRCZ2diL0FQU3JLNEV2dGFFTjh2RGUxNDNRREJtY0ViQUFkT25Ud1JVaHRORFEwME5qb3dPbDA0bkk1ZzRETmpjZmpFUjZQUndvR09KL1dKdmxNVXBja1NTcWpNZWJmalkyT05LMVdlMWQ0aW9RbExMOHNzZGxzYnlRbnQ5OUZhR3BIY3hQVVJXalpWQXNUdElsakxiakFQWlNPcUVPSERtZlZ4OU5hakMwNk9wcjI3ZHNIMFJzRk0rNzZxeEw4eEpTYVU1bWtUcUR4d3cvemx5aUtVaENlSm1FSnl5OUgzRzczUjRzV0xTcWc5UWhvUUdNN21RbnFCeld0TnFKWmRZR0JtQmhUZ0k2b2ZmdjJSRWRIbjFVL1R6dER0bjM3OWxpdDNrVmVRclUydjBucXdlUHg0UEVvSnpKSkVVSklQdFhVT1d6WXNQTHZ2eTkrdmtPSDFBNlNSS2Z3bEFsTFdIN2VJb1FvM3JGang5by8vZW1odWxaTVVBY3RBd2FlRTV1Z1hrMU5wNHYwc1hiNE9kYThCZTdKeWNsblpZS2VrY2JtbDQ0ZE85S3VuVGNGSkZLdkIwMGsrcWlvSUdMS0NMUWFEWklzQzFubFgwaytoRzAzRUVpUUpNblpzV1BhenBxYTQ4L1Jjdm5NaTBhc3BYdFl2MjNQdWJuTzluMFhwTS9iMXErZ3pQcHpmNjZ3ZnR1RmFzMU93Zm90T0g4aGM2VzVmTFpwTlFlclQva0t1b3UvL3UveWZ2MzZselhUMWxvelFmMkp1TDdxQXE4SnF0SDR0YlZRdjVxL1pLcE5tMWppNCtOcDF5NkpqaDA3L3FSN09pTmcwK3YxZEdodjVxMVBDbm45NnpJK0tTbG4wM2VWTktpOU5ySWtQSlJVMTNITTdzUnFkd2k3UzBGV3FZVXNTMEtTVUJUaFhZdFVDT0VXQXBja1NZMnhzWEh2TlRRMFBQVkxBYUluSm85a1c5bTVJMXlxTE16bm1aVmJmdkoxeWo5YnhTTUwxMTZRZTFydzBPL1o4VE9QYTFjV3dqTXJXM2xPTytEZWVlZTJyZDByNS9Ga3dVRzB2NUM1MGx4ZW5uTS8yNHB0SnozbTJMSHFGOU43OU4wVHBLazVnamRKa2hxRFFhM0pCSldFU3FVV1hsRFRpaFBWZ1hyejFjeTBiWnRFaHc0ZFFsYWNPdS9BQnRDMlhYc20vbTRNODM4L2dnZHVHRVMvOWtiMjF6aUppb3JDRUIzRHBSM2FrWjZVUUx1RU5raEN3WVdNTEt1RUlvUUFTY2l5djFCZStCa0FHbk56YzVlNFhLN1hmZ0grQlFxM2ZVaFpqVGRvRWlyZUNhdzRiQlFYbCtJTW1zLzJtaXFLaTB1d3UwTW51YUlvcEE2WnpNYjVrMXU5bHNOV1JVbFoxWm4xMFc2bHBMU2lCZGVkdzFaRFNYRXhOb2Y3RE83SnUzNW9jVWtwZG1mTEY3U21zb3lLNnBZdmhLMnF2TlYrSzA0N0pjWEZWRm50NTNXY0ZBVlNoOERHK1MxL3Q1WEQxbDNnZG52L0R0bnZnSklTc0xlaWVpbDQ3WXFTNHViNzdUejV4QnRNbWpUMmx6VlhGQ2RsSlNYWVdoblg1dU5rdDl2LzNhTkhqK0I4dFJZbUtDMVRPM3hyR0toRU1NZGE4MkNCbnppeUtWK3RQVzNidHYzSmMrQXNxdEFqdUs1dlQ3NzZTc1p1YnlERmtzQ250ZFVZREJHNFhHNGtXY2FHZ3NmalFhMVJDNkZTUzJvWkhJMU9aRmtTRWlLUUFpSzhLU0JTWWVIWGNrRkJ3WXVEQmcxS1VLbFUxLzBjUWExdzNUTk1lK1pkQ2cvYTJYM1hkU3d4cUJrMjlaOU1IWllGd0t2VGIyUjFUVWNxUDlzTWVoM3F6SnZadG1RR1Q5dzdpR1c3UGFRbDZOaXpyNXpacjc3TjJMN3BnSU5aNDRhVFgvZ050cXo3MkxOc1JxQ3RSVk4vdzRvRGNhamR4Nms2V0VqSzZNZFpPMi84S2Z0WVhiaUdBWU0rUUVjMUZmbzhDdFkvVDRJV1ZzNFp5NnpWMzlNNTFjekJ3aUxHUC9FR0Q0M0tPZVU5clZ2d0lGT2Uya1JHVm1mS0R4UXpkKzBYREVuMzZpWExabzluc2ZVSSszYnVZdXJMLzJINnNFeHdWek5yL00yc0xGSkkwZHVwTnZSbTNlcC9ZZEZCeGU0MURCNzFKMUl5czdCVkhpUjcvTk04TlhIZ2VSbXJXZU1ndnhCc1diQm5XZFB2RDQyQmJVVlFVZ0ZEaGdDeHNISWx4QUk3VnNMNEdaQ2VDUWVLWU81eUdKWGpQUzkvQWN6WkJycURZTlZDalFtS2ZBdE5Pb3JXVTJEUFlVbWE3aGN6VjVTYWc0d2MvQnNxREYyUjdRMDRLcDNrK3ZZMUg2ZWV0LzhqUDgzMXpZZUhEeDl1TFZldE5STlVDYTRGOWE4SnF0Rm9SZE1xVTVHQk90Q1lHQk94c1hFa0ppYVNuTnllVHAzT2tidGRDT1dzdHVQSHEvbDQ4d2YwdjJVODE5My9aKzY3N3o1R2ovNHQxMTU3TFZkY2NRV2RMMGxETnNRUmIybExiR3diU1ZLcEpKVldLMHV5ckpKa1dRTlNCSklVSlVtU1NaS2tSS0REdm4xN2h5dUs1MU52d2NMNTJZNGNxUkNIRGgwNjYvTnY2eEVsM3RydmJQSDdLMys4WHNUM0dpVitySGNMSVJUUjBHZ1hRaWlpdHJZbWNNejNHNTRRSGE2ZEduTGUvcmRtaVc2M3pRMzU3ZmtIcnhHWDN6WlhlSVFpWEljTFJMdTRLOFFQbnBQM2EvOWJzNFNtWFQ5eHFFRVJRampFSDMvVFVmenA5YzlhOUtGdS95b1IzK1ZtVVgrS2U2cjlhcFdJYTNlRjJIL000ZjJ0c1VZY3IvUGUyeTNkVk9LUEwyNFhRaWhpNzc5bmlrNDN6QkJDS0dMemM1TkVqNXNmRVkxQ0VVSzR4ZE4zWHluKzhPSTIzL081VHR6eGo3V0I2emMyT2s3K3JCdjNpVDV0RTBWaVl1aDI5ZjN6VDJ1YzlyK2xpRzYzdGZ6OTIzY1UwZTJXME44OFJ4WFJLVkVSbnh6Mi92M2p4NHBvMzA4Ukx0LytENTlUUkdRN1Jldzk2djI3b2FIcDNDOWVteUc2Lys2eFg5UmNlZmZ4c2FMZmZkN24ySGhraCtnVXFSS3ZmRjdkWXB6Y2J0Zk85OTViK3dEd1cyQTRNQmpvQzJRRFhZRU9raVFsK3Q3aEtGbVdJMVFxbFVhdFZxc2lJaUprZzhFZ3hjYkdTbTNidGlVdHJTT1ptZDI0NG9vcnVQYmFheGs5K3JmY2Q5OTkvTzF2ZitPVlYxN200NCszY3Z4NDlWbmpVZlB0ckhtRFRNWW90dXd0SnJKYkg0YkZleWd2Sy9ORlNOMDBOdFJ6eU9yQ2toaUh4dDJJUTNpRUpNbVNKS3VFMS95V0ZDRjVrTHhxcXdUSWtpUkpHUm5kdmk0ck83UXdLU2twVnBLazlGOWFJR0R3eUZ1eDZMM1d2VTdyL1lKWEZHNWk4ak92Y0tDc0dzVlJSYVdjZDFyWDZwMlhpd3pJU2NtWW5kVlluWUR1NU9lazVWNU5zZzVBUy8rQmVTemN1UnZHNW1BcjNjbU1lZjlpOThFS0ZMZU5tbW9qVnVCa1hveGRPd3BJSFhRelhXTjluaU90RVpPMlNkSHZuZWRWWjVKU1VyQlZmUTdBMXEyYjBkcHptRFhqWVFCS1MreFU2QXFCUExMNzltUEc1RDl4YjhWbjVQWHR6NmhoZ3pqcG1sL2FybXd2Ly9HQ2pGdkpkaWhYdzVyNXNOWnJwV0hkNHkyUDhSZnk5QndLR1didi8zVkI0MUJaZlJTak1ma1hOVmQyN2Z5Yy9pT25leDl6UWc1OU00eUJmVTNqOU9sM1NXMlQzbnAwK3YxSG1nVUtnaU9nSi9DcnlhSnBCWGQvc0tBcEFtb3dHSHhyZ3JZaEljRmJCNXFhbW9ySlpEcG5ZM3FXd09aaHhYc2IyQk9md3hQWEdQaitteUtjUGxvamg3Mk9UNDdXMFM0NW1XakZRWDI5MXo4Z3ExUklzcG9JTGNMamNlTlVFRWlTZ2k5eDF3OXd5Y250UDY2cU92cGNYRnpjVENEK2x3UnNPcU9obWJPcGtGR2ovc3BqNno5Z1dIWUs5bDFMc1V6NDhQUUdSZzRhR3ZuTUhkQ0szNE9xVkRGaCtHME1XL1FoOHdkbm9xN2NnaVh6cno4NURDMEg5OC9uckZLQXJOeHJHVEhZOTAwYWNTUEdoRlFBc2tiTVlGL09jUEkzRmJCMDNuMHMzZkpIOHArNTk4UU5PQTh5SXUrM2xEVHJhTmRoRDdEaXNRbm5mT3lNeVRCeVJOUGZJOGRBUXZCK1krdm5tWTNSMk96V1g5WmNrZVhXM0hUQjQxUzE3UFYvdi9IZzlQdS9KN1N3M2RHS1h5MUE5UjIwMkxId3J3bmFNZ0pxOEFVTHZQeHFiZHQ2azNDVGs1UFA2WGllQmJBSjN2L3dRLzVkWjJicDczcGhrQVdlaGdZY0RnY09XdzNyZGh3ak9TMmRSQnhZcmJWNHpGTmlBQUFnQUVsRVFWU0JVcXVveUFoUjV4U1NUcTFHOGJnQlNaRWxDUUY0Q3hTOC9qWWhoR1EyeDYrdnFUbHVpSW1KK2V1cDlaUUxLd2FqbnFyS2F1aWFjT3FEcThzb1ZhZlF0MmNLTXJCK3pidTQwWiszdmhYdjJFeVpZemJKT2lmYkNyYVRNL1lQNEs2a3ROcEkvN3hNMU1DTzlldXBWRTU5VDltNUF5bVo4dytLcXFkNHRUYTNsUnFIQVpQaHhQR21BZjJ2NXFGdHhXVFBHdXZWeGhRN1ZUWGV4cXhXSzdISkdZeWVrRUZ1a3B1OEo0dE9malBhVkJhdmZZL212bTJ0NGFkOTFmVkdzRlo2dmR6K3laK2FCNFpTa0ZPaHQ0OUFvcXJxOUNaZTE1NDVsRCt6QVNlMDBFQi9ybk9sZDA0djVtM2JDcmRtNGF6Y3liWWlLd044KzZ4V3E2TkJpbm5sd1VmKzN6NmEwam9jUUVNSXFMVk03ZkJyYThIOGFxSzF5Z0wvS2xOdDIxcElTZWxBNTg3bm51bm56SUd0NFFpUEYzeUhWUmZCd0xuN0FWQkZXM2lxZHdxRmhWOXlTTkdpUG5LTWIreDF1QnZzdE5GSFl0YnBpRFhGVUgva21LaHY5RWpDSTRSS3JaWmsvTVNVSWZXa2toQkNOcG5hdkdXejFVVkZSVVU5OG5NQ3RnbVQvc0Q0Q1ZleDJHUmd6Q012OHRESW5pYytPR1VBVS9JZXBXL3VOYVFaRk13cDhZRUhYckZqQmFPbS93dDdWUWtsVlRKOSs3NVA1ckFIV1RSajFGbjN6V0wyTUhiUTFhaXBwdEk0bElMUjJhQlZtRDZoTThOeis5QXpXWStjMUI2TGZPcDdNbWFONE5VWkh6RTBwd2NaV1oycExDM2xzWldmTWpqOXhBYmtnSWx6R1ByWmI4bnNlU1VaS1NZT0hpaG04b0wzdVhlUWdiVlBqT2V4OVVmSlNJMWxYMkVSanl4OCs1UlRNeUhwekwvaUZUdGcxSFN3VjBGSkZmVHRDNW5EWUpIUDM1NlVDNE9BckN3d0pNSEdqUkJyaHVYellWeWVOM2hnTFFkdER1UXZPbzBQWGMraDVMa2ZaV3VaazBISjJsL0VYQmx5N3l4ZUhuUTl1UU0vUU8xMFliUTBxYVBMSHYzZGkvYy9zMkZYTTFCekJJR2J0eGEwbFdDQmY2RmpYd1JVdEJZQmpZa3hCZFl0YU44K2hmVDBUa2lTZE03ZlUwbUljNU5uYytUSUVmYnUzY3QzMzMzSG9VTmxIRGxTd2JGanh6aCt2SWE2dWpycTY3MUY5UFgxRFRoZFRzbnRMYUNYUEI2UEpJU1FmWnNhMEFCYUlZUU9pTFRiNisrSmpJejh3N202NGNyS1NweE9GOG5KN1M0WUdGYVZsZURXbTdIRUdzNTdXMjY3bGZJYUI4bEpDU0c1UERXVlpkZ3drSnh3WmhxUDIyR2p2TElhc3lVWnZmYjBzb1BzTlpWVVdkMVlrcExRQm4wNkhiWXF5cXRzV0pKU1R2dGFGMUlVTjVTVmdkRU1wak1ZcW0xTHBqSy9OSStWYzBiL2d1YUttL0xTY2t4QjQzcjgrUEVYWW1QanRqUXpQUnNBdSs5ZnI5WW1TVTdKbTJRZkFEWmZaWUUvVDAwMEFacUI2R2h2L1dkY1hCeUppUmJhdDArbVU2ZE9kT3ZXN1pTTHNweXRxR2JQZnZUY21HZ0dBNUlrMGRqb0xZNTN1ZnlGOFFxSzR2R1hXUGxEc1Q1UUZVMi9CZHU2WHMwTmdLKysrbXJQeUpFalVhdlZ2YzlGUCt2cjYvRjRGSXduY3BxY0I5RWJUUmdpdFJla0xWa1RRVXgwRk0yL2dib29JOGFvTTdmcVpiV1dtSmdZTktyVC82cHFkRkhFeEVTamFvWmRhcTJlTmliVEdWM3JRb29rUTR3SmRHYzRWQ2xadldrOFhFYlhIbDFSL1dMbWlreDAwTGpXMXRhK1BHalF0WnQvL1BGSFZ5dkE1azNDOWZuVkpFbHlOVE0vQTZEbU56LzlDeHo3QXdWdDJyVHhyVm5RTm1CK25tdS8yamtJSHJRdXFhbXBPQndPbkU0dnJaSGI3UXBRR25rOGlnL2t2R0RXQkdwQ2VKTWxGY1ZYVjRvUXd1VjN1cTFiOTc3MCtPUHpsanp5eU1QcWlJaUllN2hvcFlibEM1ZFIzWXFDYmNuc3k2Z0JQUW5MLzBqVXNZd2ROK0lYTzFmcTZ1cGVlK0NCQnpaLzhjVVh6ZlBVbWtETkd3SDFhMm9lZk13ZC9naG84d1JjYndUVW42c1d1c0pVV2xwSFVsTlR6KytRbk9zTGR1blN4Y2ZaNWd5a2YvZ0w1UDJhbTI4VFFnaWYxa1pBbFZNVTRXY0NrZncrdHpsejV0VEV4NXVYM0gzMzNYSkVSTVRkRitmYlkrTFdTWlBESUJLV2N6cFg2dXJxWHYvclgyY1Z2UDc2c29ZZ1RhMGhlUE9ER2tHVkJiSXN0UllCRGZqVnZJU1JocUFhMElSQVdrZVhMbDNPLzdmbW5Ldnpra1NYTGwxb2JHejA4Ylc1L0Z4dEFjMnRLWkZPQklHYlFBaWgrSWhBUWt4VVNaSjQ0SUVweDdSYTdaSTc3cmlEaXhmY3doS1djeWQxZFhXdlAvYllZL25QUHZ0c1BhR0Jnb0EvelFkcUlmbHFYaE5VYmhFQjlTL0UwcHd3MHB1cjFwYlUxQTUwNmRMbHZBUUx6anV3QVVSR1J0SzVjK2NnV2lPdjF0YmthL09hcEQ2ejFBOXV3cWVsK1NPbHdlQW1TUkxTUGZmY2U3U3hzWEh4M1hmZnJlaDB1bnZDVXpNc1lUbHJVSHZ0cjMrZFZYQVNVR3VRcE5CVnBvS1h6Z3VPZ0RacGFrMEp1REV4eG9CZnpaK3Ixcmx6WnlJakl5L0kvWjJ6NEVGcjRLYlQ2UUxnNXZINHdTM0ExZWJYMnZ5YkQ4YkZpWFJCQWJCaHcwYVhKRWw3K3ZUSmRXczBtak1PS1B3dmdnZGhDY3ZQU1dwcmExK2VQSGx5d2VMRkw5cFBwS25SU21WQkU2akp3ci9BY1dnRU5LckZlZ1YrbjlxbGwxNksyV3krWVBkNEZqRjNENThXN21YTzZueit1TEtBVjc3OEljQkQxVmhmdy9LUFBtWEd2emZ4bDNlM1U2eEVjY2tsbDlDaFF3b0o1amdhRkluRDlZM1VDSzF2ZFhsOThPcnlRcVBSb0ZLcGhUK0QyUjkxb1luRHJSRndQUGJZWTdVMzN6enFCYnZkL3ZTRm5oUUg5K3lrMm5HdXJ1WmszNjdkMkU0NzQ2YWNrVG0vNGNCWkVIOVpLNG9wT2dQMmgyMnZQc0s5VDY3NTJiK2tJM09ncUpYbnNXOFhaL0JjVDBmY3pMdHJORnRLN0QvcHVaNUtLa3VMS0trOFM3STc5d0dHWk45TTJVa09PWDc4K0F2WFhETW9QOGluMWtKVG95VU5VWEJodTQrR0tOU25GaG1wOXlYZ2Vxc0s0dVBOV0N4dDZkQWhoVXN1dWVTOHBYV2NPMkJUNmxpenE1d3VxUjI0SWFNZG03ZmtNMnRyQ1FBL0ZKZndkYjNNMWQwN2t4MHJlT0NGVlJ3MnRDVTlQWjFvblliOURSTDFIc0VSUllQUmFNUmdhRVpTNlFNM3Rkb1BibDV5eW1ZRWxZMkFZOE9HRGZWUlVZYVhiRGJiNDc2QnVTQXllK3pWRkpTY0sxN01TaVlPdllraSsra0RZV2xKTWM2emVHRS9XL1U0MHhlc08rM2piVFZIcWFpeS9leUJiZnhVU0dobEZrOGN5aGs4MTlNWXFSMUxXVkdSUnY5VS9VOTZycWVTdGZQL3dMelZoV2Y5b1N3cExqMVJ1WnpqNk5Hano4WEd4bTBKaW42ZURxaDVKRW55K0lNRkxjM1BVTEpJZjFXQm40SW9QVDM5SnpIaFhqZ2ZtMnppOGZIWEJ2NXNZei9LZmJ0L2dQNnBkTzdlazhlNysvZWtzbXZ2ZnJaK1g4MUQyWjF3dVFZU2s5Q085emV1cDZEY2dja2srY3pTUU5vSFByOWF3TmZtZHVNckpjVVQ3SFB6cFlRQUVCMXRYSGI4ZUxYZFpESk40VHpXbHBidVhNZmlOWjlTV09IRS9zeWo3RGJMNUk2NG0yRTUzakxwZlZ0WHMyVDUrMWpsTm95NWR5cURzcnc1T29xOWdrWFB6R2RIMFdGaWt6c3k3dDVwWktjWTJaMi9qRlZidnFERVZzT2lPWC9Gb3BVWk91NFA1SFUrZFFMdDd2eWx6RisxbVlTTXE1ZytiVHdtTmJpdFpTeGU5REs3aTc1SDBjY3hlc0lVQm1lbmdMT2NwK1krejg0ZHV6aGdyV1Rtek8vUUpmZGk1cjBqQWk5RC9zckZyTnI0QlJqYU1tckNKQWIxOVBYZFdjMlN1WSt3N2VBeGhrMzRJNlA2K2twZjNGWldMSnpQcHAzZmt0RDVjcVpPbXhRbzZONjNiVFdMbHI2UERTMFpBMjVpMnEyRE9SK3B1UHUyd3ZKTjNobmNPK1Rad0tvdFVHS0RSWFBBb29XaDR5RFAxL1h0NjJEWkduQWJZT0kweVBGWHVUdmdtUVV3WkRBc1hnQjJBMHlmQmVtKzRYaDE4UXNNSC90QzA3MmM0cm5hcXc2d1lQNGk5cFRVa2pub3Qwd2ROeVJRY3JWajNXSmVYZjFmbkZvamVjTnY0NjZodlZHcTlqSG4vN2QzN3VGUmxIZjcvOHpzSVp2TlpyTXNJUWtoaVRGZ2lDSEVpQmdSSXlJaUlsSkVSS1NJaUpRaVdxcldvclZLS1M4dlB6elVJcVVVclZJOElaNFFFUkVwSXFVVUVSQVJNVWFNTWNRUVlnZ2hoR1d6MmV6T3p2UDdZL1l3dXptQWVLSytQdGMxMTU1blptZWV1ZWYrbnU3dndoZll0YldDdXJLL002dm1uNlFWWHNhTWNZTlB3TkpjTEYvNENCdEx2MkxJMkl1amtheWhnb1VMRjFOV2Zhd2hQam45cVNjZWZXQTMwYldmTFRIbVo3dWdwbXR3SEFWcWtVQkJBb21KMGFDbVZSWDArdlpraUw1ellJc1puOVkza0p0K1Z0c1AvTWVwT0tJeUtUVUpnTHk4UEJSRm9WdEtOK0piV2toT1J1ZHJDeTFoOEFxREcwQWcwQ200aVM1ZG5Lc09IYXByN3RhdDIyM2ZsU3FJUFNPUDRjTnRiSC94RVlwS0xtTkl0cG0wRE0xUFY3NWhFU1B1ZkkwRmkvNlhaRjhsTThaY3hkSnQ3MU9jWW1icGZUZXl6bmNGODJhT283NXlEdzBOYnNpeWs5NnJIOE10RnRZc2VaSGlJVmVRYjRPczVKTklvRldxV1BaeU9RL2Uva3RXekwrRHlYTXNySjQzSGw5OUpZMldiQ2JmTmdwZi9XNXVHMzBaUzNkK3lzQVVPNE9HWG9IczJrMWxiUitHRDc4QzJSYXBYWHh4OWczTTIyWm53Wnhic1hwcUtOMVhIZ2EyTFM4L3g4Z2xEekVoZXhzVHh0NU1jZlc3WkprVkhweHlCWnZOVnpEN3pqc29YZmtvSXlZM3N1dmwyVkMzbFJIai80Y0Z6LzZkYkx1UGJYczB3Y3ZPZ0czYnFzZlpzUGRRek0yeks3ZmRONE9VVG1ablNqWU1Id3BUUjhQWWV5RXQrTjMwWGpEY0FtdVdRUEVRZ3NjMWFGNHZnNmxQd01KSGdGb1lQd3cyN1lFc1N4RFk1c0c2N1RCMU10QUlqUzdBQWREQSt2V1YzRGV2VUhmbGRISmNQZFdNSFh3RitWTWY0dlpSYVN5Yit4dG1laXdzbWo2WXh0MHJHRDN6RlpZdmV3aUgyc0R1YXMyTWxhMHBEQjErQmQ3eURjaFpGekI4ZUJIVzVCTTNDVjQ1N3hjczNKdkJvdnQreWJwRjkxS2hvMnR6cHY2TStuTm5mWEg5OWJiblI0NjhKbFQ3R1p1bkZscGFPd0sxVUZWQlorYW5CbXBkU1V0TEpUTXprMTY5ZXBLWGwvZURNZmx2Qkd6Vit6L2hzVThDUERuajdGaDdsV2ZXYkNUdTdBRmMyU011L0c2ZlBuMUlUMDhub2JtWjFGUTZDaUlFdnkwRWhLT2xIWUliYUlDWW1wcTJmdi8rL2E2c3JNeGJaRmsrLzlzK1VJNjBYcFNrOVNMTlppUy8veUJLOGlLSGJ1bkN2ekJ4MXF1TUtNa0Qrak4xNkZPc1dMdUw0aWtEYVd4b3dKcVZRazV1QVVXRlJib0xNNStVYkR0MnM0VitKU1gwUDlrS0d0bkt6TGx6S000MlVqajN0NlNNZWc3WHZQSFlldzFpNXFROGR1N1pqVnROSVQvZHpjN2R0UXdja1VYL2toS2E5cVNUYk02bHBLUkVCNUxWTEZ5OGxRVjd2bVJZbGhrb1J2Y3BCU052Wk5xb0lVQXhBMmY5bWIyMWtHWFp5c0oxQ3Bzcjd5WGJEUDN1K3dOUDlQb1pwWjdaNUxzYmFGS3NwR1JrMFM4M25YNzlUL3gzTEE0bmFXbHRiaU1ZVDBEemtyT2dKQXRzeHJhQWw1SU5kalAwS3lIcXVDNTZCTzU2QWdZSDkydjAwN0I2Szl3K05QZ0ZEOXk3Q0lha3gyeXNxWkpLVndiWitpSmIyZGJoY1MxYit5eGxHZGV3Y3Zvb1pHRHV2YmVTZjgrTExKbytHRzlESTZyRlJscEdOZ1ZaL1FnZkltc3lKU1VsN0Z2dHBLbFhVZlI1NnRoaHdQSVZHNW01NmlBREM2d1V6NzJISmF2L0VQR25IV3I4b0xYVi9jcklrVGZ1cDIzdHA2NUVpbGFKamtITllEQUlrOG1JMld6U2dWcHNVWHVvWENvelhDNzFRNDVUQnJZalgxVnh5eXNmTWZlbTBlUW02R2VoWU1PbWpieDZQSm5sTnhaRzNhMGxTU0k3TzV2RTR5NHlNOUNab21xVU9ScGFqOGJnb0RQbUJoSWFlUlBpekRQUDNQYmhoN3ViK3ZidE85VmdNQXovdmc1aWRYVXRaWXQveDY1blEvL1d3dENoMnZQcGMvL09mYlArbDM2NTkyUEpLR0xSc3FjWWt2Y05va055Q3VsQmVtSkp5OERhVkU4ajBMVDFhWVpPZnBUaFk2NG14VzZtd2EzZzlaMGd5dUN1cFVaTkl5ZXIvUktlWkljelBFM01aZ1ZGQVc5ZERZM2VHdTRjZDAza2UwWG5vSHJCMkdza3o4N2F6YXhKVjFCZTQyWDQxUHQ1Zk03a1RuWFhiSTRVMHRKaXZpSGJ2NU04cE9wYVdEb0xWdW1JY1QvOWhoeVFtOTZ1WXhsRi9qcmIrUkpYNlhiR2pQNDAvRjV4M2tXb1FQclF5VHc0cG9LcEl5K2syaVV6K2Q1SG1ULzlWS2RxRTNYMUZqS1NOYitmTVMwTlozQS8vWDcveG9zbjNyN214aG0zSHRLWm4zcFFDeGUxUzdSUjZvZ0JOUk1tVTNzTldFS3kzbTFCN2Z2SVZmdldnZTM0a1lQOFl2bFdab3kvbWt2U29wMnA3NzczSC83eXVjelROMStNdlozQ09ZUFJnQ09ySnozUEZLaHFJSWF0aFlBczVHOExtNlFkZ1ZzSURVWElORDMzM0g2ZnJGcjE2cCt1dXVxcXcyYXorY1p2UGRvaXk2Z3hZdmxaV1JrVVRmOGI5NDVxYXdVN2NvcFpzdUlOUUdINXJKOHphOEZ5dGoxeFp5UjJJNnR0dFBjN0Q5N1VVMU9yVUpSanhGdFhnOGVaUVRMd3hMTEhHRFByS1I2YzNBL3dVYm5tejdFNzNtYS9zYVdUSWRkUldlMmpWOWJKMVNlYTB6Sncybko1ZXUxYllmTlBQNTFHelpqTHFCbHpjZFh0Wm5EaDVXeWVPcGxoblpRRVZ1N1p3dHB0QjJKV2swcnhpQ0hZdjRselRtN2IweUFySGNZc2h2RUZYek9VNXNnbXgxSkhUUVAwU3VHRXh6VXIvUXhTQnFTeWZ1VzhkclpoWThyc2hVeVp2WkQ2MGxVVURmdzlVNllPcDVkUlA3OU9OampsSUQzRlMwMkRCOUtzS0hWMU5LclE0dkc4OU5qU2Y3eDl4eDEvY0hVQ2FsNmRXYXFQZnJZQnRVaGhlN3hPcWNPdTYxV1FHaXhzejZGUG56NllUS1lmUEtqMDlZSE5mNXdaLzNnVFMwWnZHZy91NTdtRFlJaDNNS0VvaS8zbGU3ajFyYys1NGRMK3JQOUFpK3ljZGNhWkRFaFBSUFUwc2VLamFqNnBidUtJVDJWdk55ZjJ0RFBJVUtOOWJEcFFDejBYSWF2VDc5ZHkyYlJFWHdJUmJBc3pRaUdFRUdQR1hIc3dMeTl2d2Z2djc2eTMyV3gzOEMwbUl1Zm45Mkw1b2dWWVJoYlFxM0FnK1ZsT3B0NzVLNGJmOVV0eXpQOURybE5tNTZiMTVJeTZoNkg1ZGxZKy9pQmtEeVEzemN5dWZWWDA2bitUM25BaVAwZmg4UVZQVU44L2cvd0JROGc1a1o5TjliSmd6aXhTYmgvRml2bC9adGpFMzJFRHNyS3plWEh0OCt3cWtpbGI5d1RyeWhYMEtsZTV1WDNZdmVRbFhoeVFqQ010aCtFREM4Q1l4WjB6U3JocnlxMHNtUE1yck40YTlqWGFtRHF1NDE0RWNsb0pkdzcxTVhuNkhHWk5Id1dOTmF6ZFhzWGMyYmZqSzkvTW92WFZEQ2twd2xPOWxRWnpEdG5PenYvTzhDbXpHWDRLdXBHN3QwS2pGMXcrMkw0Skdxd3djSEJFRlRnL0J4NWZBUFg5SVg4QTVDVEQ3VE5oNmpTd3pkZUNDbHZXdytEYm9kOEpDWFFhdzRhbXNHMTdPWU5IUld1SHRYZGM4MGRPSW1mdXBkeTFJSThKUS9LcEw5OURxVHVOZTZhTW9HcnJhbGFWK3hqY0w1ZmEzYnVRczdKSjFzM092RjVuOCtDS2Y3QXF3MDF5Umg2RCtuWG1Ncll4Y2VKdzVzKytuNno3ZnM2YVJZOG94eFhseVV0emUvL25VTnNlQlhwQTgwcVMxQ3FFYUNmNVZoOG9NSWFZbW9pUEQ1bWZOaDFUMDBBdDFLdWdUNTgrV0N5bmgzemkxMC9RVmYwYzlSbElUVERoOVN0NC9RcXRzcG5pRENmSG0xdXcybXlZUkNEOFdWSVhKemxKRmtTcm15MzdEMk5MNnNMWlRpdCtJWkdYbTR2VEtGQVVCVldObEZ1cHFnaWJvanF5Um9pOUNkSGgzZ2xKa2dRZ0dob2ExQWNlZUtEc3R0dHVyYkphclQwbFNYTENOMC9RTFI1eUZVcmRQajZ0cUNLK1J4OXkwNVBvMm5NQVZ4WTVXZlBxcTJ4K3Z3eHJabCtHWG53ZWlYRXlub1pLTnF6L0p4czM3eVNyWkRKemZqMmFPRGxDRVM0WmNTVU41WHY0Zkg4MXFiMzZrOW4xQkJORFRtWFVzRE40L3BtVk9NLzlPUS9kTTU0NEdmSXZ1QlJSdFlOWDMvZ1hDZjNHTVgxMEVUMzdGSk9WckdWNkorV2N4NEFzaWQwZmZVcWR4OHpGNTJtTzNZSkxSNU5ycWVPMVYxL240Mm9YRncrOWd1eFU3ZGc0TTNwVGtKTWEzdGMreFJlVEhDOVRNbW9jbHJvUFdiVnFIWjhlT0VhL1M0WnlUcThlR0NTRkQ3ZjlpdzNyLzBuWlZ4Si9XUEFvNS9WSS9FNG03dHN2dzBjVjBQZENjQitFNmhvNGQxQUUyQzRaQVEzbDhQbCtTTzBGbVYwaDYxd1kwQjFXdlFvN1BvSzBQakQ0ZkxBWUlyZjVBUU1ocnAzdFpYZnhNK2ZwWFV3YmUwblUrKzBlVjFNUzE0Njdpcy9mWGMvYXR6WlIzeHJIa0tIRE9DUFZqb3lYN1p2ZjVxMzE3L0JsU3pjZS9zc0RuSmtVT2VlWjU1WndWdHd4UGl3cngyMTBjbjUrZHFmSDRleUxobUUvOUFFdnJYdTNNbWZ3MVkrdFgvblkrODNIajNlazBLRlA1L0FGQVMwcStUWTIraGxxdmhJZnI1bWZpWW4yb0FTUkpoU3BCUXA2VVZCUWdNMW00M1FaMzVvZTI2bU9ZOGVPVVZwYVNrWEZGeHc0Y0lDNnVqcU9IR21JMFhGckNSYld0K0x6K1NSL1VNdE5WVlZKVmRXUW5wc0JNS0RwdVptRUVIRm9jOVJTVnZaSlVXNXU3aFNEd1hEcEQ2SEg5dFA0TVF3UGQ0NitrbEVMMzJKSXR2VzAyak5GVWY2OWZmdjJOUjAwTSs2Z1Q0SHdDMEZBbHVXQVB2bTIvVHkxV0YyMVVFcUhGdjBzS0NnZ0tTbnB0RG9teGg5NkI1S1NrdWpUcDQvTzlOU2JsbEZFVFUvZkpOQjZKMmltYWRqSklVSit0NkJacWdKcWZuNmYzYzgvLzN6dG1ESFhWQUUzbjg2WFQvbXVUZXl0YW16bkV6dkR4ZzdqcDBLd0gycFlXYmo2MzkvN1ZuME5GYXpadktmZHozS0xoNUxqTkQ3LytPT1BiN3I3N251T0U1M09FV3QrNnR2aytTVkpEa2dTcXI1TXFyMktnbENlV3F6NXFSZUxQTjFBN2JRQU5nQ0h3MEdmUHZrNlVKTjBqMUlZNENSSkNpMUNraVJKODdrcFFVQlRVVlVoOVBsdElaOGJJRzY0NFlaYTRLK2ZmYmF2eW1wTm1BNTBQeDB2bjR5OEl1d1o3VVF6WlNPMm45RGwvOXd3MmpNWVZHS2pIYnZxSzdmSHRUd3hNVHNrNDYxUDU5Q2JvTzMxL2d3QUFhMnlSMWJiTDJqWGZHb2g4ek1VL2RTWVdnalU4ci9WemxJL09tQUQ2TktsU3pEM0pRSm1Hb2lGbUpzVWZoM0wzQUJKVlNVVlZDa0VhbnJtQnFoQjlpWjY5ODVidlduVHBxcnUzZE51TWhnTVEwNjNFMksxT2JIK2hHQS9qZEQ5ekd3aEpTYlJUMUdVelR0MjdIaWpwT1RpR2pydnpxNnZKR2l2OFVxb3FYR2Jpb0pJOG0xSGdZSjh1blRwY3RvZXQrOU0zZU5VUm54OFBIYTdQYXpmRmdva2hMSTZPZ2dhZEpZd0U3WnRRd0FIaUdlZWVlYXcxV3JkMGE5ZlA4K3BLSVQ4Tkg0YVA5UTRkdXpZMHZ2dXUvLzFXMjY1NVlqTzlEeFJ6V2RVTWJ0T2VpZ21uY09pNjlJZUt6Mms5Nm4xT2ExQkRVNkQ0RUVISjQ5UFBpbmppeSsrb0tibUFIVjFoemh5NUFoTlRVMjRYQzZhbTV2eGVEenRCQlQ4S0VvZ0ZGQ0lEU29ZMFlJS1pvSkJCU0R1d0lIcWkzdjA2REZaa3FSemY3cHNmaHFuNjFCVmRjOW5uMzIyS2orL1QzbVFwY1g2MC9RbWFKVHBpU2JqSFdKcUl0TFEyRVRIUGpXOStSbk4xRTVIbjlxM3h0aWFYQzRPdWYzWUxHWmtQV2NLS05RMkhzTWpETmpNMFJtNnJTMHRIR3hxSmk0dURwUGNNZEd5V0N3NEhJNXdUOUxvNmdUQ3ZyaVk1R2FwSS9JV1NnSFJtNmFoMTQ4Kyt1akJnb0tDblRrNU9YNmowZmk5ZzV1cnVwUjNQcTduckt5VWsvK1J0NTVWYTNiUTgrd3p2M0h6a05OcFZPM2R5dnAzdGxEWFlpR25SOWZ2ZndkTzhiaHVYZnNpY2xvQjlyanZacmZjYnZmelR6NjU5T1dSSTBjZXBQMTZUMzBxaDFmcXVPZW5ydTdUSEdacVF2Rmh0am13MnhKSVRJdzBYd2xKRDRWVU9nb0tDazZZSnJWM3l6b0NYWHVTYUpaQWJlVEZKNTloNi91N3FQZlpPQ3Z6KzlOaisvbytOdFhOci8reWt0MStNNmx4QVdyOThUdzY2U291VEltbjV2T1B1ZTdGSFRnZGRqeXU0M1R2MVplL1gxZE1vZ3hQclZyRmtyTGpaRHJpT0hEVXl5MWpSakMxVDhjWGMySmlJbjM3OWtXV1pXVFpFSHlNTEpLa2Y0d0VGQ1JKd3UvM2kyQ0ZnaEJDb0twcVZDQWhxUEdtQ2swNkpIRGRkZU5xZ0wvVjFCelltNTZlZnBNa1NkOXFaNVQxUzJkUmtUNmVHU1BhcHJ6WDc5M0l3ZzFHUnBRVW5Qd0tQVlhNZjNBcGc4Y013ZmxmQkZ4NzFpeGtWV01CY3ljUGJmTlozYlluR0RUbE9hWlAvaGx5aXVjNzI0ZmE3Uzh6ZDdQQzQvZE8rSmFPcThxS0JYOWtWTUY0TXI3bGtMV3FxaDk5L3ZubnEvTHl6djVNeDlKaU83TjN4TklVU1pJQ1FxaXFFQWpaYUZJTkJnT1JFcWxJbmxyZG9hOHdkYzBpTVRFeHFxQTlVaWFsVlJRa0pDUjBmbCtvM3N6a1dTK3daY3VJa0ljUW04M0czZzFQc2JiQ3dvaUJlYWN4c01rbWJoazdtb0pNTFJxeWF0MGJ6TjM0TVc5TktNYnFUT2ZWMzk1RXV0V0U2bk16YWNGenZGU2V4OVE4T3hkZWNCRTNqRTdGTEVQTnZnOFl0bklyMS9RWlEyZjM1WVNFQkFvTEM5Rk9pSXpCMEI3SVNVRmdrd21LVTZKRlRQM0JvRUs0SVROaHBOTVlteXBKVWlpb29BS0JqSXpNelU4OXRleVRjZVBHamJWYXJkUGF2WHMyMVZQdlVzbktTb3M2ZUNyZ2RUWFE0SmJKU285Y0ZxcWlVRjMyQWFXK0lTaUtnaXdia2VYd3hDVjcrQXpXanpTMnVWamNqZlg0ekU3c3NvYzZ0MHhHaWozOG1XTHZ4ODd0eTl0VUFDbEtkQ21PYkRSR3ZxUDZxS211d1pLY1RyTE5FcnM1a0ZYcXFxc3dPdEpKdG4vNzJlT3FxbEJYOVFtN2ErenRIQWVGbmR2ZW85L1lXN2huNW5oazQ4bE5TOFhyb3JxMmtiU01tRDZsS3FpS20rcmFKdEt6TThLMXFxcXE0cTZ0WU10dWIzQWZ0RGwwd3VQcWRkSGdoalNubVpyYUp0SXowc0xmVVJTVlJScy9iVk8wcnlwS1ZDUlQvMzhCbXVxcWNjdjJObjFlUTJvb0IvZVhQLzIzZjZ6WThzRC9tK3NtRWlEUWwwZnB6ZEQyVEU5VmtpUlZWVFhyUktnaXVwbXgyWXdzeThSWnJKaGtpRSt3NFhBNHRNVnV3MktPSXkwOWc5emNzNElWQldadER0VTJrcDZSUmtOTk5iYTBMS3k2VS9Yc3dnY1lNdmwvSXRGNzJjSElDUk94Tkw3TDNxb083dEZOOWRTNUZMS3kwcU91SjhYcnBxYTJIa2RLT283WStSbzhTbzIxMWZnc3pxZ2VyS3JQUTNWdHc2bEVSZU1veUl4dzdpeG5FdDVEZmdDY1hTTXdKWnNUeUxBYmFmRnBGMXRlajRpQ1pvclRqcXo0YVQyUnBrM1FMSTJBbXlFRzVDS3NMY0xncEJEQVNaSWtpZERGSGdRNGdTNWkyZzU3VTI2K2VVcmc1cHVuUEZsZS90a0hPVGs1RXd3R3d5V2hnL24wZlQ5bnp1cEs4dE5rS3R6cHJGNzNFdm5KWmxZL2NpT3pWaDdBYmpRZ2U2b3hGOTNDdW1Vek1WZHZZZmlVLzZWbTMyNmFiSGRUc2NwSjl1QWJXVHByRXVCbDlxUlJiTno3R2U3Q1d5bGRIbXhWN3Q1RGJ0YlBLQ2pKWS92ZVJnYjBTMlBmN3IzTVcvMHhZNG9jckh4NEJvK3YyY0cyS2lmVk5XOFRKdmMxV3hnKy92Nmc0cWFQMHAyN1diVDlLSlA2MmFndjI4Q1k4Yi9DbkpGUFUwVVpRMlkreGlQVE5OYWtsTDZJWS94elRNazl4dFlhZ2FkUlljV3VIZlQ3TnFQNDNuSW1qZm9WWmRXbFZMbTNNWHozQzFoeUwyZnRrbnZBVmNyNHNiK2h2THlVR25VWHc3Yy9ROUhvTzNoa3hzZ1Rzcjh4TS81R2ZtRU9lMHRyZWVURk54azNJSXVtN1V2Sm1mQVlSU2xXTEZhRmZlNTBObXg4aFY3Mkp1NFpmejFiOTFWUVZhY3lmUGg3NER5SGwxOStCQ2QwZUZ3bkQraE9WZklBcW5mdkpHL0FoYmdxUDZKbzJ0OVpmTnNReWpjczViYUhuMmZ2OXUwczJkUEMySEQxazR1N3h2Mk1YZlVhdEZYdjI4M1FXYSt3N000UnFLNUtwbzI5anQwZUp3NWZQUlQ4bkxYTDdnMVdUTlJ4Y1dyLy81d3hyT2pORjVhdnErcUFwZW5OVUY4UTBIeDZsaGE2YVV0YXVFM0VtUXlpVlZFSjlmMDBHK0dyMm9Pb0JoUHlWNGVRVkxBbUp0RzFxNU5Ebi95SDF5czlaR2VrOFB3enk3bmwwWmM1N3p3THkrKzlodm1ibXJHN1A4V1ljUjQyNVN2cWs2OWs5OHR6Z3BkSFBTKytYTWJzZTA4MkZ1ZmxpYWN4dkRnQUFDQUFTVVJCVkh0djRwRjFWZVNtbUtsMEpiTnEvU3ZrT1kxc2ZmbytKai84TmdXNTZWU1hsVEx3dHIrdytNN2dmR2phUlhiZXJZd2RuY3FHWFVkUVhJM01XL01SK2FXUE1QemhMUlE1QkUxTnRlZzZScDNDNGp2T3JRdi93WkpQRHJmNXJIWi9LUmZPZjRVRDN0amZCWGg2NVVvbXYvbngxOXFXcWdiNCtPTzl2UGJhYXl4YTlCZnV1Ky8zL1BLWHYrUzY2OFl5Yk5nd0xycG9JRVZGUmVUbDlTWTdPNXZ1M2J1VG5Kd3NKU1VsU1FrSlZpa3VMazQybVV3R2c4RmdsR1haSk10eW5DUkpWa21TRWlWSjZpSkpVZ3FRQWVRQVp3TkZ2WHIxR3REWWVPVC9DYUhXTkgrNlNuVHRmcUhZMzZ3SUlWVHh0MTlkS241Mi83TkNDRlc4OXFjYlJMY0xKb3ZqQVZVSWY0TzQrdXl1NHFrZERVSUlWUWloaWlkL2U0VzQ1YkV0NGRmNjVkTlhab3MrTjh5UHZIZDh0emlyeDZYaXNGREV6ZWNsaVgrODN5aGVlK0FHOGF2SE5rVytjM2lMNk5Iak1uRzRuZlVKb1lwM0h2dTFPUGZxZTdUOUVXNXg4L2s5eEVOdmxnb2hWQkU0VmlyT3l6eGJmSEJNKzY3LzR4WENZT2dpbm5xM1d2dTkzeU5hL08ydlZ3aFZ2UC84YkpHYW1ocXpkQmRQL3J1Mnc5K0VscmYvK2d0eDFlK1d0ZnZaRzMrNlNWejd4eFVuWEljUXFoQ0JPbkZwank3aStRL3FoUkNxK09TVjJhTGJoVk5GcTFERjBmZWVFSWI0czhTT3cxNGhoQ3IrL011THhFMFByUTMvOXZQWDVvcysxODl1ZjczdEhOZWJMa2dWcjN6cUU4Lzg3aXB4NDU5V2l5UHZMaFY5cnB1cis1MVBYTjhuUWJ6eWVmdjcrdFdISzBYdjNpWGk0K0QrUEhYM1ZlTEszeTRUQWFFS0lUemlqc3ZPRW45NXAxcW9hcUNtcnU2akJUTDhIQmdMakFhdUFpNEhCZ0VYQUVYQnVaa0RaRWlTbEJLY3U0bVNKRmxsV1k2VFpkbGtNQmlNSnBQSllKUWxHY2tnSmRrVEpBa2taMnAzc3JPelNYUEVZYktuY3RGRkE3bDg4UG1ZSkNpNWVoTDMzZmQ3SG5yb0lWNTc3VFUrL25ndnJyS1ZkT3Q5TGMxQzVibmZYYzJ2SDl2TWwyODhUT1pWZHlJQzVaeDc1aVVjQ2w2ZmdmM3I2Tkw5TWc2M2MrMisvZGRidU9xM3k2TGUrK0xOaDhtODhBYU8rclhYci8rLzYvblovU3NRUXVYNHNTWUNvZlVlM1U3UHJ1ZnlSZkI3NHVoT3pqQ1orTU1MdTRMcjh0TFNxdkRwSzNPSlAvTUtEcldxQ09INkJubHNxcCsvdmZvV1NxOEx1Q1UvMnFCc2J2eUtXMS8rZ1B0dnVJYU1HSWZxZXp2L3cvTU5kbDZZOHZYMG1pUkpvcUNnQUtQUmlORm93R0F3aGhtY0xPc2ZvM3h4WWIrYkpDa2g5aVpVVlEwcmh1allXNmkvUWlERTNpb3FLaFNucyt1cXQ5NWE5MzdYUTl0SE93ZGNlbE4yVUNsMjZKRExtUC9FYm1BaUFNV0RCbUdUQWRuSjRJRTU3TnBkeXVUaVFhZDBhR1diSFJzeWRvY2R1ODJPeldiRDdUazVtZTdxcmM4eWZVazU2N2E4b2UyUHE0ek5lenpJbTU3ajNpMGE4L1FwMVpSV3VPblhUNlB3NXB4QmpCOFlsT0F3V3VqTUVPMC9ZUTUxRStiOHNNNjYycjNzOWVRek9GaTluajlrS01iSnY2WmFoV1RBbmorUS9zbWFBVHBrME1Vc1c3c0xHSEdLRzdOaXN4bkJic05oYzJLemUvQ2U1TG53TlpReWJ2ejl6SC94WHhRRTkyZlR4aTM0Y3JPNTc5N1BBQ2gzcXh4NWYvdUtGVisxYnBrNDhjYWpKMkJwb1JwUG55UkpvVFNPZ0M3cUtmVDVhVDdGTDR4eDhaamo0akViUEtMVkQ5YXU4YmdQK2VuYW96dDJleEoyZXlLWjl0MGtkVTJoUjQ4TUVrUWpMeTVkVEhXREIxVngwOVJvSjlTQndXNnpZM1hZY2RvOElOdXc0aWJrRGZVMk5lQ3hPemhab3I5MTg3K3hJdlBnck45ckhMZXlubEx2SG1BOGFsTUY5OTcxSjNhV1ZlRlZmZFM3RzJod1EwNW81Wlo4Sm8zdEYzeGh4aEwwTldUM3Y0QVVNNER0VklFdHdJdHZ2TVYvNURONTZzcjhLR3V5MWQzQXJjOXU1TnFycitLcXJPaE0wNC8zdnM4ZnRydjR4OVFSZEQxRlpaTzh2RHhDemsrajBZakJFQUs2aUptcStlSEN2amdSZkpTQ0VWR2RiellLNEZRZHdJWEFMUUFvVjE0NVlqK3dKUE95WDc2cktNcTFScVB4aXBOeEtuL3pJVWRzOVpOWW5hZDJOK09uL0puRnEvOUZMNGN4dkIrcU9abGhZNjRtSzdpcTBhT3ZKU2MzVXU4b1cyMmNyRmR0NytvRlRKcnpYSnYzNzMzOG40d2ZrTUtQYjhqaGg4alpPQWxaSWFXSjI4ZmZRTW5zcHhoVGxCYTF2Z0ZEcjJaa2dRMUZVZDQrNjZ4ZUc2Wk9IWGRnZVFUUU9nSTF2WTlOMFptZVlYOXhxRStJTEJ1RTBTRHdla0gxdWtWRGF6TUlnYi9GUzBLQ2pUaXpqTWxxbzB1WExqaWREcXhHaWE2cFBlaDVabGZtL2ZJUFhMOXNNOU9IRldDczMweGF3UjlpL20zN2M5Sml0MlAydUhCQjI4Q0wzTjdWb1pKVmRER2pSNGR1L2xjejFaRUJLTnczNldvc2s1NW53eE9ETUZOTmNmSkYwZFBmYXNQU0RuTEpzdkViQkE4UXZQbjIyN3gwUEpsbmYzNGU4YnFkVmp4TjNQSFVlZ1lPR2NhTnZhUC8zdWZsSC9HYlRRZFo4b3VSbkdIOVppcjRQWHYyeEd3MkJ3SE9pTWtVRFhEdE1MY2d3RWxTUkhvOFVxRVFZbTI2d0VKQXg5N0NrK2pBTzA5K1lESTlXVnBUYytDZHQ5L1plRjIvL2xQQ1NyMDd0MnpCclU3R3BqYXllVnNsbzZaR1pLUnRWaHVORGZYZjdmWG5xMmY2dUJzWStlQUxETXZYSFh0N0FVUHlQVlM3bkl3YnJrbnV1QnNhTU5wTzdSemtEWnZLMnY3ajJzeGNaOHFKUS9sV2F5SU5EViszbzVPUGhUT25ZeDB5ZzJramduZnA5QUlLcldWczN0M0FoSDdKbEczYWlGSjRQbGt5ZUFCWDJWWjJOZmdvVGphemFjdC82Ti92OTVGOXNOdHcxZGVnOEYyVzNhZ3N2ZWRHYWdwL3paSUpBNkkrR1RKMElLOStYck5yMHVDU04zdWZsZnRwNk9ZWkEyanRnSnJrbHlRTitJUVFBUUVCT1p4d2l4b0lxQUxKZ05sb0VrYWpFZUZyQnRra3pzaE0xd1FpWlM4ZmYvWVZSbHNpNmFsZCtkenRvVnUzYmppdFhnNDJCUmllY1NiNXVRa2NjWGRsME1BQ2pNRDJkZXVvUDhuN3M1emRqMExmUHNvYW9TUUcyZEtjM2FuY1dCVWxFejlvOENYTW1mOFplZjN2UWJzSEs1cHNQaDZxcXoxTUxTbkdMRVBWcGpYc1BZV21YVi8vM0xZYzRvRk5YK0N5eERGa3ZxWVFhdTZXdzd2VEwyWEhoeCt5c2U0NEg3eStsbis4SG1RSGx3L2ovZ0daL1AydDk2aHRsTGxoNFRQQkZjV3piT1lFK3A1aS85VE16RXdkdUpuUWtnMk5ZVk0xbXNXRmdVNElJYVJnUGFtUXBFQW9WeTRjV05DeHR4REFSYkUzd0orUmtma3YyUmovM3I4L2VYNllFT0k2SUMrRlNvWU51Z3lqcHdaenllK1pNQ0J5ZG9lTnY0VkY0MzVGMGVvSHlCdDJDeS9PbjByZDloY1pPL052ZUJxcXFHcVFLU2w1azRLUmQvRDRqRTcwdDd6N0dEZnNsOVI2WGRUWFZ6T3k1R0xNR1JlejhjWDUxRzk2a2VXNzZpaWNlek12ejlWTzdid1YvMlprdnBVSG4vNEg0OGIvakRVTDhyRDQ2cWwyOTJEanJwVmtuTUp4TjF2dFpGaFBMYStoLzhoSk9CNi9nWUtpRjNBV1hjT1dwMmVkRkxCdFhQa2NqclJSRVdDVDAxaXcrQStNSFhNaEt3cHlLQzJyWmZHS056R2pBWnM5emM2OUl5L0ZhbFVwZDJldzdwR0lRbTM2Z05FTTVSb0tDOC9EbG40QjY5Y3Z3ZG5KY2Uxc3pKOTJCZXZLM095cjlMQjMzRVVzdERwWXNPcE5pdTE3ZVhEUmVzaXJvVi9SMzdUcllPWmYrZU1ORjMwMjlCZXoxdnlxNzZBUGV6OGNVSFJSVEwwaWh5K1dvVW5nRjVvYWh4S2NoMm9FMUNRaHl3aEZFVUpJTW1hemRqMGNiM1lKYzBKeXVBdWMxZXJFWVR5QXF6V080dUtMYUZqM1QxNSt6VVc4MFlTemF6d1pQZlBJN05tTG1WTnlHVFhnUW9veXJNanBtYVNkN1AxUHptRGM2Q3pXYjloRHlmam9iS21DVVZNWXVPd2Fjdkplb1hERXJheFpNSU9jRWJjemE4dk45Qzg4bjRKZTZWUlY3bVBFUFU4eWY5SWdicnR6QWxPSFg4Q3lnalM4MXU3ME9vV2NwdE95OHVEcmpLTkhqMUplWGs1VjFaZlUxdFpTWDE5UFkrTVJtcHFPQldXUFFsVUtMWGk5clhnOEhudytIMEtva3RhaFhpRVFDRWpCL2d1aGFnVXBXTEVnQjhIZkNCaURWUXNtdE1vRk14QjMzMzIvVHp6YlVuSDU2c0ExMXkyL2EyaE9nMWNtSStWMHpDNVRxYXVwQm91VHRPUWZoMGFJNG5WVFU5ZEFTa1lXMW1DK1JkUDJwZVROL0lEYVRYK2lwczVGZWt3YXdROHhoQkQ3RHg4K3ZHYk9uRG03SG52czhWYWRLZWxyeC9RTVBmcURFVTlGdDZoNlgxcXdpb0JnMG0zUWVqR0hHaGxqc1VTNnMydXF0NGs0SEVrNG5WMUpTZWxLdk5uQzJlZWNSMkdmM2xFbFVrMzFOYml4dFVsRk9kRndsYTJoWk1ZR2RtNWFmTkt1RGErN2licEdGMmxwR1ZoMEtUdnV4bm9hUERKWkdjbW4xT1hNK044K3VidDA2VUpoWVNGeGNYSEV4Wm5EZHl3OWc5TXpOeUhVVUljckljdCtTWlpsRkVVUmdVQVVld3NWMThzeDVta0FVSUxtcVIvd3o1Ly9nQTk0cmZjZzhZNzN6dUZEZTNSTHVoYm9lZm9kS1ptMGpPd2ZsZmZMYUxHUm5kMitZb0JzdHBHVlpmdWhBYTN5OE9IRGJ6ejg4TU1mL1BuUEM3dzZnUEozQUdpeGdRRkZIeHdJQXBzSWxVVUY1YnZSUUUzTFR3dFdFMFNCbXMybXFkNG1KWVg2RTJnZDJyT3pzK25kdXpmeDhkRm1reU1sZzFQSjlySG5qMkxoakVacVhTbzVKNm5yYnJFNXlMYTEzWnJObVlMdEcvQ0QvM3JHcHB0RWZQYlpaMVJXN3VmZ3dSb09IVHBFUTBPa3Z0VHRkdVB4ZUhDNWp0SFM0a1VJZ2MvbncrZno0ZmY3SlVWcGw3MUpRZ2c1Q0hDaG1sTkRrTDJaZ3V6TnJGL3V2bnRtNHU5Kzk3dExuVTduMVpJazllR244ZjJ5dUtZYXR1eHpNV1JBL2cvSGpWVzFyTDYrZnYzczJYLzg4TWtubjJ6dEJOQmlGMzhRMU5vRE5EMm9oVmxhRU5SRU1FY052ZVJRQk5UMDFRU3A5T2lSUVU3T21mVHUzZnNIYjdyeVhZMGZEYkNGUmxWVkZaV1ZsZFRVMUZCWFYwZERnNmJHNjNJZDQvaHhOMGVQSHNYajhTQ0VDQmJRdCtMeitmSDcvU0ZsM2lCekMwaXFLcVJnNURSa29vWkNRZ2FkZWRvdXdPWGs1SmkzYnYzUHhhbXBxVmZKc256aFQ1RHo0eCtCUUdEN2dRTTE3MXg4Y1VscFRjMUJKU1l3MEJtbzZRRXQ3RWNMVlE4QVFoL3hiTXZTVEpqTmNlZ1ZiNjFXZmQxbnBKRnhSa1lHT1RrNVpHZG4vNmpQaGZISDlvZXlzN09KajQvSFlva25MaTRPc3prdUhHUXdHazBFQWdGa1dVWUlvVE5UV3pFWURLRTdZWWk5aVVBZ2dDUkpvYnkza0VrcXh3WVhZc3hUSDJDdXJLdzBwNmYzZUFmWVVsNytXVkYyZHZaUWs4azA2cWZMLzhjM1dsdGIxKzdidCsvZG9xSno5K3ZBVE0vU2ZPMkFtcjhEUUF2b1VqakNabWNzU3pNYWpVR1dwb0dheFdMUnlYZ25ZTE1sa3BTVWhOT3BseDNLb21mUEhGSlRVMy8wNThUNFkveFRxYW1wV0szV0lNQlpzRmdpQUJjSUtCZ01CbFJWRFVkUXZWNWpDTnp3K1h4Q2x1WDJmRzhpYUpyR1JrOERCSnRpb0lYaVRYcUFBOHk1dWIxM0FudmVlV2ZqUzhYRkZ3eXkyUkt1Z2xNS1N2NDBUaC9YUjgzeDQ4Zi8rYTkvYmQ0OWV2VG9oZzRBclQxUTgzZkcwRG95TzBNc3JYM1RVKzlQMDRJRVNVa09uRTRuS1NuZDZONjlPMWxaWjlDclYwOFNFeFAvVDV5ZlV6WkZtMXd1anZsbGVuU3hSUmNBQnhScWp4N0hFSjlBYWtKMHI4cVdGZy8xYmgvSmppUVNUTkwzTWZrb0x5L255eSsxaU9taFEvVWNPRkROMGFOTnFHb0F0MXVMbUxhMFJKckZ0TGEyNHZmNzhQbTBoakU2M3h1aDVqRnFRS0FLSVFmYm1ZWk0xSTU4Y0hwVDFRU1lKMHlZWVBuVG54NitJQ1VsWllqUmFPeFF4WGZQNXRWWThvYVJsM2J5elVOcXk2QkNnVUdGUDY2SldyRnJNMnBHTWJuaFk2R2lLRkZsNWhpREUvRkVKY2lxcXVxSzM2TStvYjZtR3AvWjBTWWkyTlJRUTZNYjB0TFQvblhvWU0yN3Yvbk5iejU5L2ZYWC9TY0phUDUyQUMzUUFVTlRRL1hPd1FBQjBTd3Qwcnk0clQ4dG9xUG1kR3BCZ3ZUMGRNNDQ0d3h5YzNPL1UzOWE5ZDZ0dUoyRjVHZWNIaEgzNzAyMmFQbnFWVHkycjVuVVJETzFqYzFNdnZwS3BoZCt0MjBISkVtaWQrL2VKQ1FrQlBONTR2SDcvUmdNUmxRMUVKWGtHNWs4QmxwYmpSZ01QdngrdjlDK0wwdUtFa0JSRktINEF2aFZGVWtTS3RwTk5hd1dFc3gzTXdRbmE0akJHWU9BNWdzQjI0b1ZLMXBYckZqeEwyRHJ4bzF2UDNYKytlZGZrSmlZT0ZTU3BDaGRsL1ZQUDBUeWxBRmZDOWoyYllNVmpUOHVZRk5kNVV5Wit2OVlzZjN0OEhzcjU5M0F4QWZYayt5d2hhZnlJMnMrWW55L1JvcHQ1ekp2MzFHR3Q4ZUpQV1VVcEJWZ0gvY3cyNWZPakFCWHhWYkdqYnVKV21NR2RxVWV1ZkJtdGo1OUQzanJ1V1BDMVordC9zUzNPY25RL05ISG41WWYwWUZTZTREbTd3RFFsQk1BbW1nL09HREFhRFRwcFlhSWl6TVRGMmRweDUrbUtkNTI3WnBNYW1vcUdSazkyUDM2WXR6WExhTDNkeHdrc0NrMWpKbStsbTFySDhSOEdzeVpVMkJzclpRZWFJbVNMWHF5S1pXM0poVFRlT1FJM25oN2xHelI0TkUzTURYUFRrdXJqL2c0N1M4ZjJiK1hpNS8vZ3YvTXVvYnZTMDZ3cWFtSnlzcjlsSmFXVWx0YlN5QVE0T2pSUm80ZDA0SUtzZmx1UVdYZVVOUVVSVkh3Ky8xUzgvRUFmalZBbkRrU1BkVUZHQ1Foa0tGTmtNRVFaSERHR0JZWHRYejg4ZDY4bmoxN1hoZ2ZIejlFVlpSMFZjZENUZ29BVkcyUmpUR01KVWhoM0kzUTVJT010SzhKTEY2b3FvV01iQWlsR25tYW9LNFIwcktJa3E0SjFiNVVWMEZ5QmxoMXMxenhRblVkWkdXM3ZhT3F3YzlTMHFOL0E3QngwVFNXTkE1aDFaenhPbUQ3T1F0ckxtSHI0OU5qMWxSRi8wNkFyWEx0ZzR4ZHNndDMyV0UyVi95YmRDT0FtMG45ZTJLZjloS0xwdzBHb0xTMHJQYk1NOC9ZL05KRDB6Nzh4ZisrVUIzeXFaNEVvT2tYSmNqUUF1MlpuQVNGVDRNMXpURm1wd0dEd1JSc1dteWlJOU16SVNHQlJKc1ZDWWt1S2VuMHpNNElCZ2t5eWM3SzRwRnBBM0ZNZnBPN1JtUkh5MWdCN29aYUdyeG1zak9TMjh5VnhycHFGR3N5S2Zib202cW5xWjY2Smk5cDZSblJVbEg0bUQ2b0Q0TVh2cy80Zmo5OGc1ZnZUYllvQkdxaFkyYzB5SHlmZ1dhSHc4RTU1eFRTMnVyRlpES2hLSDdpNHkzRXhWbUNRUWJORWR2Y2JNSm9iTUZrTXVMMWFpek81L1BoYi9WenBNRWdWRldSQkFxdHJZcVE1QUJtazRxRUpIeCtEZHhDUVFaWkRnY1pBa0pnQUNsWXhTTkN6SzBOeVBYdFc3Z0grQVI0K29JTEx1aDc0TE1QejcvN2hZckJkdzdQU0QrWi96aHRPT3lxZ093SnNIcGU1UDE3eDhBZUdWUTNWSmZDMEZtdytMWVRyKy9wbWJDcUNlcDNBbFl3RnNEV3BmRHdkRmkrQjNKU29MUU01andORTB2QXZRY3l4c0hJWEdod3daNDYyTElMY3UxUXR4c0dqNGFNUXUyZjc5c01XNXNnRzlqK01reStGM29WUVBrK21MOEN4dllQd3lFclZyek82RVVQZnl2ellNM3FOeGc2NFZHOFM2OWw3ZllHcHBVazQ5MjNudFVWV2V5WmZFbXR4K1BaVWxIeHhVZm5uSFBPZmoyNzZnRFEyZ08yMEh1aG9GSWdER2l5ckVwQ3FHcW9JemdJSkVrWVRTWU1zaVM4TFMzSTVnUzZXT1BBM3l3YWpyckl6TTdHYXRGQXpXS0pJeTR1MUpIZFNrS0NqWGpKemVzdnY0RTE3UXppMUdaU2lzZng1SnpCMkJwMk0yNzhQWlR2cWNGWWVSTWJGbGtaTVA1dTVrMGRCa29qc3lkZnk4djdWTEtzSGhwdHhheGQ5VGZTTERCelJDYmJQSDB4bWczVVYrNWw5T3puZUhDeVZzLzU0dHdibVBWeUpZVzlrcW5ZVjg4VFczY3dJSXlKWmthTnVvZ2xMNjlsZkwrSlVjZmNWYmFlQ2ZjOHk3emxLeWh5bkxiQXBoditacGJ0K0lKeGw3Y045bjFWOVNsYmpqbDVXVmN6dXYyRDkxbjAvbjRxajdReWI4TFB2bmYxVjRQQlFNK2VQWW1McytEenRXSzFKZ1M3WE1jQ25KbVdGaTJLMnRyYXFvR2IwY2NaMlVhTzF2bUZLK0NuUzZJV1BRMEVBcUxGRndCSnhXeFNoYXFxa3FJZ0NSQ1NGSTZpQmdDREpLR0FaQWhPZkdQUVREVzJBM1RHSFR0MjdBTDIvT2JLcktjdTIvdFI3NXljbkNLcjFYcGhaN2x4U3pmQTJvV3d0SjF5VEZzQnJKd0xUZHNoZXhvc3ZPM2tUdjcyUGJCM082Ulp3UnZzQ2pqOVliZ242RXFwV2crRDU4TEVEY0U3ZWgzY3N4TUtIWERQY0ZpNUVlNGJBdy9mQzJNZmhIa1RvR29EOU5vWXZNazF3TVRiNGRuZE1EQWQ2clpDOFYwd2VrdHcvM3dWN0N5MWMzdEIyeXVpZE0xZkdGcnhxamFSMHk1ZzlmSjVuV2U4cTNXc1hsZkY3SG45OGRSZXl1TnIxekYxNE1TeThnLzM3ZkIwY1pUMWpEUG9tWm1xWTFtZEFacWlZMmVLSHN3a0NUWFlsRmhvaWd1U2tHUkpHTU9SVG9sV2I2dFFoWUY0czRuNE9CT05UY2RGZ0hpT0hXc2hMYXNuU2JiNHNEOHQwajNLaXMybXFkMGUrYlNVaEw0amVmaXVjZlRva1U1NmVqcFpXVm1RbTh2R2plT1pOZlpzSEpPZlorYkk3UEJoMlB6NGJOWjRMMkx2cm5tWVVWazQ3UkllWHI2TkJWTUhhaVJnd0RqV1BUd1pUL1ZHZXZXL20ybmpkNUJqcVdQSjRzMHMyM3VRUVdtQTRzTVhZMHdVRmhheDY4R2RoQlJ2d3JjbVZ4MjdkbjJFMi9mZkVCVTlCZG1pdm5sbjh6L3BaN0IxOXdjc2VtY1BsMDBkVE1JUFFGTlRVbEp3T3J1UW1KaUl6WllRRlVIVkp0RngzRzR6WnJPSGxoYU40WVZNMDJhekQ4bHZ4R0x4aTJCZ1FmSzRGUXltZ0RBYXRSNE5BVVVWSUNSWkRrZFJKUTNraEJ5OFVPVGdoV0FJbXFuaHNxMTJnTTVZV0hqT1IwRW05OUpiYjYzcmZ0NTU1K1U3SEk0aWs4bDBJWEJTblRVR0J2WC9IRmxnYVFRM25GUjIrYkF4R3FnQllYbVl1cjB3WXlHVTEyZ21aTDF1Z3R0eU5WQUR5TXFDVU8vblhidGg5dFBhOCt5QmtCR2NlVlhib05ZSXF4ZkJHa0QxZ2FzVWFvRXNBRmNEalVZSGpuYmNqRG1Ecm1QeG5LREV0OUYyUXQ5TzQvYTFsS1pkZHV6OHJvRWQ5VVhGZTkrWjlOY3ZEQTlOUGhMeWtYYkN6dG9ETmIzQ1JyVHZERlNCcEdxUFFvUjdic2l5TU1nSTdZYW9DSkMwM3BFR0l4YUxSUmlOUnRLTmNQQndBL2JVYkxwM3Rlc0NCQnFvMld6UnFSelpDZWZ6K3FLVlBMc3lnV0hEUnBCYmRHS2h4eTFiL29YWjA1L1o5LzQrNkRid1VHZlpDMmpBTm1TUVpvNWJzd1pTYkM5bGQ1VkNUbDR5UXdZbGM5dTRheGczOGpJR0R4L0ZvTUtzcVBYYW5RNWM5VWZhYk04NVlESjFkWk5QZDFNVVRsVzJLQ0hCeGxrSk5zNjZzb1EzNXE1ZzI1Rkx1THpyRDVQNWJMVmE2ZE9uRDNhN25jVEVSQklTYkZpdFZxeldlSnFhTkFibmRzZGhOamRqTnB2d2VrMTR2YTBjTnhzeDRDYytQdXg3RTdMa0IyTkFNcHMxQnVkcjFSaWNMR3NwSW9HQVFKS0ZoQWdIN0tUZ1hWM1dtSnprMS9uaURERWdwd2M2WTFCQzZRQ3c4Wnh6Q2szTGxqMlZrNU56Wm0rYnpWWm9OQnI3US90OWxjT0tMbCt6OE00U0crUnl3OWl4TUc4ZGpPd0hudDJRTnFXZDdjUnNTemFDVDRuNEl2U2VYWHNHakJrZGVUMW1QSVFGa093TzdJb0xseGRpNlpqVmtVNWUzZ2wxOU4yS29uemdjcmxLRno3K1ZPV1JEN2ZYMk0zTDFSaG1Gb2p4ZzNVRWFIb3cwLzlHMWZ2UGdvMGlWVWxDSUJDeUxLTUdBa0tXRGFoS3F4RElKTm9UTVp1TUhHdHNFQWFUQmw0bWt3bVA1d2l5TE9Ieks5Z1NiY1RIdE1RTDlmbDBPcDEwNjVaQ2V2cUZiTHZtSmo3NzlGTldQZnNnZjMzdEE4cld6Tzg4S2d3VURyaWMwY09DZ2d1anI4YWVrbjFDcUpqejh2dU0zcjZGTFpzMk1ISEkrVHk0N21NbUZFZWtxdHhOTG16TzA2T0QxZmNrVzZUeTFiRVd1aWRwL0t5eHZvNERpcGt1bGgrK25DTXpNeE9Id3hFRU9Gc1k0T0xqajJLeGFPQ21CUlphTUpsYU9CWm53b0NQaEFSanFHS0JoRGdqTHNVdkxIWURpaThndVlXQ3lSd1FKbGtsRUFqZzk2dElraURZVHliVTZGbHZwc3JCQzhRZ1NWSTQ2S0FEdWZiQXp2alJSM3VONTUxM1hpbXdEMWg3eGhsbkdHNGI5WHhXcStHc0hKOHZxYmZKWkNxUUpLblh0M3JBR3FIYUNDVkYyazZ2VzMxUzZtUU1HZ2pyMThDSUdiQjNQZFFvRWZabXF3WTVHNHFEUVkyR0JoMkdtWE1wem0ya3ROeERZZUdKbzhOQ2lBcFZpRStPSHE2cjJGeXg3OHNiYjV4MHFLYW1SbzFoWmUyeHM0NVlXdml6b05LTEVyTU9WUWloVDlVUVdndGNTY2d5QkZTRXdXQkE4ZnVGd1dSQ1ZWb3htT0t4eHNjSmd4UkFVU0UrVG10N0o3eE5mSFZNMEsrNG1PcTlIMURqeXViOE5JY3U0VllmOWRUcVBidDI2VUpxang2Y2ZlNkZETy9uSUcza2MzZzFsNmpHb0MwVzZoc2EwTHlaMmhnODZGTHUyVnBKdjlrVE5aYXJlbWhvaXR4cU5tM1p4TXlSVS9CVWIyT25xNEFGMlViQWg4dXRValJ3S0VVRGg5SlUray9LeW10QkIyeGxaYVVVOVcvTEdOM2xtNWd4ZnhYM0xGcE12djEwQmJaVGtpMUs1Uy9QdmNTN0xSYTZ4Y3Q4ZWFTWmNTTXZvMy9DYVFIdUpDWW1VbEJRUUZKU2tnN2dFckJhRzJscWlzZGljUkVYMTB4Y25KbkdPRE1tNGNWbU05SGFxa1ZOMHpKOXVDdE0xQi8ySTFSRnlHWUZlNElpQlpON2hkY2JRRGFxUWhhcUZFcjAxUVVhUWlBWFpuSEJ2RGcvMGJseGhoaUFhL1A4eXkrL05QenVyeVdmQVJWeEMza0hNRHp5eUo5c2g1b3VUMDkwOWNocWJiV2RhUkttWGlEM1JsTW8rZm9qQzI0ZkNDVURJTWNHeVZrbk40bnVlaGhHajRIOHBaRGJIN0tDZHFPY0RDc1d3YVNCV3ZEQVZRdm0vckR4OFloVGV1eTRLMWk1ZmlNVENrZEZoK2VGK016cjlYNXgvUGp4TDZ1cnF3Lys4NThiRHQxLy8vMHRnRHFoWDdvNEFaaDFCR3F4ejhOTDhQeEVKZElHMndNSmlLUnJJRWxDUXNKb2tJUmYwZEtLZksxZVRPWTRMQ1pWSEdseWM3akJDMExDYUpBd3g4VmpOY1BlZlhYazlSdElhbGM3R1lNdjR1Mk5PL0hrOXlhN1czSlFsY05KdDI3ZHdxVlJtWm1aYkhyaUxpNWUrQjhLOHJLbzNMdUgyKzc3QjNyNEh6dnRONHlkZGdNYkY5c1pQUGwvV0RCakJJT256V1hFenVzb0tMcUkvQ3dIRmVXVnpGajhKdE9IYW1TL2FmdkxEQnI2R2syVnBVeDYrQmx5TEFCMWpDKytGSGRHUG5ZYXFIVG5zbVprWVJSNVdidm0zNHlkTzYvTnVmZldsL1BNTXk4eDhjSHZEOWkrMTFyUlprOHpSN3dLWFJNVFNUREpQd2lJMWRmWDQvUDV5Y2pvMGY0K05qZFRYVjBkVHVnOWNpUlVhK29LeXlDMXRHaSt0OVpXYnhEY3RIcFRqOXVISWhTRXFxV0hoSXJxUTlVTHdScFVnaldvb1VKN1FrQ25lNVNEZ0NmcmxwQ01raUdtQ2ZTSm5odGlmdy9JcTFhOW1weVhsOWN0T2JsYnFzMldrRzR5bWJvYkRJWU1TWkl5MnhwOWJVZEREU2hXU1B1YUVTQkZBV29oYXlpVWwwZnNabFdCbWhxd0o0TWpZa3g3aFJBSFdnL3ZPamh3K0IrL1dySDI2YStVeHZyRFpXVmxSNjYvZnZ4UklocDY0ZlNKRHNDc0k0Ylc0Zk5ROGJudTkvb1VqWENxUnVneDJCMHRxTllzaVpCY3ZXNkpsRU1aWkFRUzFnUWJscmhRbmFjNUdQRU1CUWdTd3Uzd3VuUnhoRmxhS0RpZ2I0WG44N2lvclcvVU9qcFpUejZMek5OVVQ0TkxJUzA5SFhQdzdqUnplQ2JaTTk5bllxR0NZbkdTSEpYdW9kSlFXNHNiTTFucEtkR3BJL3ZXTW5ENk9yWnZYb0wxTkNBclA3b2krRzhLYktGUlYxY1hMS1EvUkVQRFlSb2JHNE1hYnhHbEVJK24vWW9Gdjk4ZnpuM1RWeTRFQW9vVUNLaGhnQXNFMUNDd3FhaHFHTlRRTWJxT1FDNE1VREdxSTUwdGNzeHpPZVo1YUJ2U280OHVzUFh0MjllZWxwWm1UMHBLc2x1dFZydlpiTFlialVhN3dXQ3d5N0pza3lUSkprbFNnaVJKOFVFZ0RBa0FHSFRldFJBdytHcTM0cHY1TE41emU0dVdiYStKNXZRSndyM3dsNm83RUFnY1Z4VEYxZHJhNnZKNFBNZWJtcHBjWDMzMTFmRzllejkyMzMzMzNSNGRlSWtZSUJPZGIrLzA0Z0FBQzh4SlJFRlVnSmtleURwaWFsRkxKMEFXQldaNklBT0VMRXRDNjVJbVlURElPa0NUTVJpTXNaVURSQkp0MjFZUWFNbTJtaUpIWXFJOXpOS1NrN3NGdTdGck9XcmY1UWdCMjR5aFgyODcrN2F0cGNGUlRFbis2U0VQL3hPd2RaYk40dmR6NE1DQnNJQ2xKb04wbEdQSFhPMktXRWFyaGZpQ0FLZTBBM0FSRnFkMXVsZEQ1VnJFTUxqT1FLNWRzTk9WZDhtZGdKcWhIV0NMWGZUYjZXeWhuY2ZZNTlGTzJyYlA5WStkTGJGQUZydDB4TkxhUEE5SnY3Y0hZaWNDczlEem1KNGFVZXlzTGFDRlFDMVN1TjZSR0dSU2toMkhvd3ZKeVYxeHlHNys4MkVsRG1jWERJYm8vdlQ5aDQxblFPNjMyMTE5Mzg3TldIc05KTXRwL3ErK3puOEN0cE1ZeDQ0ZDQrREJnOVRWMVhINGNJaTlSWFRlbXBzOU92TTBVclVRcVRtTkJyaEFJQkJscHFxcUdnVnlRcWlTcW9xd3FVcTQ0Yk9RaEVBUGRGSTdJQlFEVU1LZ1ZVTzB5OUk2QXplcEE0Q1Qyd0cxemdDdU0zQ0xCVFRhQWJIT0dKcmFBVnVMZXEybDJraWRnbGpRWjZick54djJtNFhBTEdocVNraFNOSmpwUUUyRUZHUDBnR1kwUmhoYXFIcWdiVjZhVFZmbkdmR2w5ZWpSZzZTa0pINGEzM2xVOVAvZVNFcEtJaWtwaWE1ZHUxSmIreFgxOVllQ09tOUhneVZaeDRNRjljM2hnbnF2VjErU3BXZHZJUk0xRUtVZW9nbGNCZ2dFVkZSVkZVR1FFNnFxU3FGK00xcS9CcUpZWFBBQ2ptVjBPZ0NTWkVtS0JUd2hCd0d5TTBEckROeStEblA3T3NEMmRjek9kZ0V1Q0VpZEFoalJ6YkxEb0tyM21ZVmVCd0V0aXBscFFDYUgyajZLRUZPTDFIWWF3d3JPRVpZV3FSNndSS1Z3aEZoYUVsMjZkQ0U1T1ptVWxGVFMwN3YvbjVBWCtnbllmdUJSV3ZvSnVibG5rWnFheW9FRE5kVFZmY1hodzRjNWN1UklsSkJseUR6Vks0Ym9hMDQxMzVzR2NvRkFHT0FJQkFKNmlTUkp4K0JFaE1tSjBLT0lNVlhSUjFjamJGeEk3WU5TRk5oRmZhY2RjMWM2QWJCMXhOcGlUVkxSQ2JoMUJuQnFlNjkxb05RWnM0djlUZFMyOUs5alRFMWtXZFlGQS9TQVppQ2t1aEVMYUFaRGhLSHBpOWJiVTdiVnpNNklFR1RYcmwyRExLMDdtWmsvS1ZyOUJHdy93TWpNekNBMU5ZWGEydHF3U205Yjg3UTVHRndJQVp3dnh2L1docjJGQWd4QmtGTTdCRGtkd0JITjVxUllvSXQ2M3M1bmJaWmdIbDBuekV4TDB2b3VmV3hCMW5XeVRLNmpCYjFwR2ZPYTlsaFppSm5wL0dmdGdGbkk3RFIyd3RMMGZqUnpVQk13WGljQ0dXMTJodFJ0MDlQVE1adk5QMTFnUHd5d0JkaXhkeC8vclBpS1k0cE13Vms5dWVIY016QURyYzFOdkxyck0vYldIY05nc1RHeXVKQUx1OGNrd2l2TlBQWHZqem16OTlrTXp2anY5UjJZeldheXM3TkpUVTF0WTU3cW82ZlIvamM5ZytzNGVxb29Db3EvbFpaV0NZdFppZ0k1WGJDaFBaQWowaVlWS2ZaUlZWVWtXUTRKMk1ReU96cGhZcnJYVWtqVzYyVEJyQ1BHRnZXZUNOblpKMlp5ZEFKZ2tkOExJVlJWWURESVVVeE01eTlEbjZJUkMyYWh3SUMrQ2JlZW9YVVc3WXo0MFN4dC9HaWhhR2VzMlJuYlVLVzlVYllic29xZzNaYXc3aW9tVEhtWXhTdVc0TlJkMWJYbGU1QlQ4a2x6ZkR1QTZTbGR4ZUM1dTlqNTh2eHZ2SjRoYzNleC9SVFdjekwvNlJUMDJJNnplbmN0UllYWnBKcFZscjI5a2MrT1g4YURnN0w1c3JLS2o1dGxMdTJiaS92SVFYNzk5NVVzdm1NaUE3cEVOdlBXNXEwc2VlOUxyckwxK0s4R3R0Q0lqNCtuWjg4YzB0SlNxYXVybzc2K1BtaWU2djF2SVlCcmFTT0wxRkgwdExuaENJY2JBK1JrcGVqVFE0VE9ENmNIT1lSUWhSWndVQWtHSHNKQUY3ek9KU0VFa2l3alJjQ09rMkZkTWNCM0lqQTcyWEtTTnFhcGlQdzRDcVJDN0tvanRxY0h4UER6NFA4ekdBemg5Mk1DQUVRZVk4Rk0xalhkMWdPYUlkaVl1Nk5vWjdTc1VFaUZRd08waUIrdGE5ZXVwS1Nra0phV0ZwV1BkcUl4YlFRc3JJRCs3UlROclZzeUI4dUE4VkdnQnJEa3ZwL2ptUHhXVkJIOE43cWhweFZ3KzZSdm50S2hlbDFVVlI4K3BkK2V6SC82K3NBbU8zaGc4dVhobDEwOGg3bDF6NWN3S0p2Y3ZrVTgwRGYwU1RhN1AvbVVMZnNiR2RCRk94Q3V1djA4VjJ2anVqT3RlSDVrMURjaElZR2VQWHZTdlh2M2NQVDBTTzFuUFAvQ2UvUXRLY0hlY2h6WG9VbzJmVkpMbjc2NUpMUzJCQU1Nc1F6T3k0RXZ2cURwV0ROQ0VSdzVjZ1JWTXBHUzRvUkFnSURpNWZEaFkxaXRSbkhNNVVKRnhwN2tRQloreWVWeW93UzBXSUlwemlKTVJna2hCQUcvRDE4Z0lBQkpsZzFJaE1CT1JWRlVMU0NocXFDeGxwTUZyVFlBcGtYWXBUQ2xDNmJrSTdjdmNpakMzd21CclBiOVlGNFlZWUFLN20yUTFXbUFKSVFxaE5CK0wwa3lScU1oQkhBRUZEOENDVW5Xb3BRaFVBdjRXMUV4b3JTMkVoQmd0ZG14eHBuQ1FOWk8yZ1p0ZldudE16U3Q3MEFRMEl6eDdQbkVTdTRaTm5ac1M2UmJUaEkzVDNTUTNrM3pveDJ0U09OdnoxaHh5VEIrT2d3dEJEeXdjQkdNdnhQU0xPQ3JoMGVlaFJsM1FlVW1XTGtacXR6dytGeElNOE9JU1RBd040UVNqU3grNGwvY3RXVnArT0EybFc5andiTnZzYm0wSHN2eVA5TzAzVUhlNEd1Wk9GUnJabHk1Y3kxYm01SkpxZDNDaTVzK0lYZkl6N2x2OG5BcWQyM2c2WmZmb3JxdWtmVGM4NWx4KzNUUzdScE1ySHY2WWJaVkhNZWFkWDdVaWF6WXZvYnRqWGE4ZXphd3RlSUlJNmY4bHJFbHVTZHgxZmhZdldRZWEzWitTYitSTjNIYjJCSmtvTDU4TzB1ZlhVVjU5U0djR2IyWmR2dWQ1S1ZaVC9pZlZFODl5eFl2Wm12cEFiNXgrdituOVEza3ByZVRTK00vVHNVUmxUNnBRVmFtK25obzdVNm1YM2srY1QvT2psK0FWbHlmazVQRE9lZWNRLzY1Z3pqSDBjQ0xHOHZJeWtwangvbzFtRFB5eVV4THBWdTNGSktUdStKME9uRTR1b1RMdWV4Mk82azlNa2gxSmlLWkUwaExTeU0xcFNzSlZvMEJ4TWNaY0x1UGMrUm9NM2FIRTd2Tmd0RWNSNXhSRnJJcFR0aVRrb1F0d1N4OExjMWdER2EwV3pRNUpzMDJNd21UeVNTTVJxTXdHaVFSQkFoaE1CcUUxc1JCVWcwR2d5ckxjbnRMSUxpRUd2ZEdMNXIybkNKSmtxWjRvZFZWaGwvSExBRkprZ0t5SkFWa1dRNG15V3JybG1VcHZCMkJVSVdHdW1wd3U2ckJZRkFsdEk1TkpwTlJTS2hDQ2FqQ2FEUUtrOGtrVENhek1FaUlnQ3AwaXJOeGlJQkNhMnVyc0NRa0NwdFpGbTdYY1JFWHIvbS9Jbzc5NEhHT2o4ZHF0WEM4c1o1RGh3NVJWMWRIYlcwdEJ3OGU1S3NqYnV4Mk8wbEpTVGdjWFlKK3NxNTA2NVpDYW1vcTZjbmRlVzlMQm1VTlozRDk5VGswN3N4bFcxMCs1NXh6RGtwRkR0ZmVhYVZrTEV3YUNYZU5nWjMxZ0JXeWZERHBIazBzZE5ZVWNLV0JYWWIwWGpCOE9Eak5VRHhFZTU2bHUrUjg1WnZZS2ZkblFIcUVwMWlTc3hnMi9BcXlVMnowNm5jeHc0ZGZRYjllRVZtL3lwMXZjdCswWDdDcXdzTDRpZGRqVlZ3QVZGV1UwMnZBbGR4KzF4MWt1ZDlqMkpSNVljR0N2SDZES2NrSzhNaXlOMktBN1ExbVRMc2J0V0FvRTRabU1uM3N6VlNmaEVSUjArNVZiSEQxWXZxVWExazkrem9XYjZnRW9LYXlBbWQrQ1hmZWRRY2xLWWNZTnVJVzNDZjZUNnFMR1NNdVpsMk5uV20zMy9ITmdnZlYrei9oc1U4Q1BEbmo3RmlpeVROck5oSjM5Z0N1N0tHVkpPN2M4UjVObVVVTTZtYm13LzhEemt1THhVSjJkalozTFg2QlR5Ky9tTWNmLzRER3pKSE12dTRTM0M1OWlvaW5UWW1XMVpxSVRiaW85UGpKeU1pSTlzRVp0Um1UY1ZadkVnMUNaNlphTU1mN2FQWTBvMGp4eUhLTFVERVFGMmRHbU0zRVdWUWFXcjJTMFJ4SG5DRm9zaXFDRnE5ZnhOc1NrSVdndGFVWlJZRFJhQ1Jpd1lxUU9Sb21Xa0VpRmtXK2hORGlwcW8vQUxLTWpDb0ZBbUF3R0pHbGprMVFqV1JKK0gwK0pJTVJveHg1RDBBRUFnUWtDWXNsTHNxa05KdE5CQlNGZ0Nvd0dtUjhBVUZjbkJsSmtwRXNGcFFXRjY1V1NWZ3NjV0Z6cy9XNGhDa3VpV1NuQTFsSzRIaGxMWEpjUFBGR2ZiV0FQakFnMDJwTEpJNW9jOVNjMkFXbnMwdVVEMDNmU01WT0VpYWpnOS8rMFVtLzFHNTBQNTdLcXpWR0xCWll1aEFtem9JUkpkci9uem9VVnF5RjRpa3daaFpzSGdGanhrQlRDbXdNeXBxbFpHdUwzUXo5U3RxYW9yWGxWVmh5TXFOa1hTek9ERXBLTWxpZllzV1JYMHhKU1Z1enpaaDNCWS9QdXgwWkdCNThiOGo0R2RSVzdHVnZlUTBaaGVkUzkreGJOQUxKUUU1aE1TbStNdVJsYlUzSWdwRTNNbTNVRUtDWWdiUCt6TjVhVFNtNTA1RStpUG4zanNjQnpKcHhEZmU4dUlyYmg4MmszL0NKWkZmdlkwOVpKZVplNTJDcGZJQUtOeFIxOHA5Y3UxZXp2RGFQbXMwenNRUC9IM2l4Z0ptUU81d3VBQUFBQUVsRlRrU3VRbUNDIl0sWzEsImRldGFpbHMtY29udGFpbmVyIl0sWzEsImRldGFpbHMiXSxbImhyZWYiLCJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvZGVidWdnaW5nL2V4cGVyaW1lbnRhbC9lbmFibGVfZHVtcF9kZWJ1Z19pbmZvIiwidGFyZ2V0IiwiYmxhbmsiLCJyZWwiLCJub3JlZmVycmVyIG5vb3BlbmVyIl0sWyJocmVmIiwiaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL2RlYnVnZ2luZyIsInRhcmdldCIsImJsYW5rIiwicmVsIiwibm9yZWZlcnJlciBub29wZW5lciJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiZGl2IiwwKSxSbSgxLCJkaXYiLDEpLGt1KDIsIkRlYnVnZ2VyIFYyIGlzIGluYWN0aXZlIGJlY2F1c2Ugbm8gZGF0YSBpcyBhdmFpbGFibGUuIiksQW0oKSxSbSgzLCJkaXYiKSxrdSg0LCJUbyB1c2UgdGhlIGRlYnVnZ2VyLCIpLEFtKCksUm0oNSwiZGl2IiksUm0oNiwib2wiKSxSbSg3LCJsaSIpLGt1KDgsIiBBZGQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHRoZSBiZWdpbm5pbmcgb2YgeW91ciBwcm9ncmFtOiAiKSxSbSg5LCJkaXYiLDIpLFJtKDEwLCJzcGFuIiksa3UoMTEsInRmLmRlYnVnZ2luZy5leHBlcmltZW50YWwuZW5hYmxlX2R1bXBfZGVidWdfaW5mbygiKSxBbSgpLFJtKDEyLCJzcGFuIiwzKSxrdSgxMywibG9nZGlyIiksQW0oKSxrdSgxNCwiLCAiKSxSbSgxNSwic3BhbiIsMyksa3UoMTYsJ3RlbnNvcl9kZWJ1Z19tb2RlPSJGVUxMX0hFQUxUSCInKSxBbSgpLGt1KDE3LCIsICIpLFJtKDE4LCJzcGFuIiwzKSxrdSgxOSwiY2lyY3VsYXJfYnVmZmVyX3NpemU9LTEiKSxBbSgpLFJtKDIwLCJzcGFuIiksa3UoMjEsIikiKSxBbSgpLEFtKCksQW0oKSxSbSgyMiwibGkiKSxrdSgyMywiUmUtcnVuIHRoZSBwcm9ncmFtLiIpLEFtKCksQW0oKSxBbSgpLFJtKDI0LCJkaXYiLDQpLFJtKDI1LCJkaXYiLDUpLFJtKDI2LCJkaXYiLDYpLFRtKDI3LCJpbWciLDcpLEFtKCksUm0oMjgsImRpdiIsOCksa3UoMjksIkF1dG8tYWxlcnRzIGZvciBwcm9ibGVtcyBmb3VuZCIpLEFtKCksQW0oKSxSbSgzMCwiZGl2Iiw1KSxSbSgzMSwiZGl2Iiw2KSxUbSgzMiwiaW1nIiw5KSxBbSgpLFJtKDMzLCJkaXYiLDgpLGt1KDM0LCIgSW50ZWdyYXRlZCBkZWJ1Z2dpbmcgdG8gdHJhY2UgcHJvYmxlbXMgdG8gdGhlaXIgY2F1c2VzICIpLEFtKCksQW0oKSxSbSgzNSwiZGl2Iiw1KSxSbSgzNiwiZGl2Iiw2KSxUbSgzNywiaW1nIiwxMCksQW0oKSxSbSgzOCwiZGl2Iiw4KSxrdSgzOSwiTGluayBsb2cgdG8gY29kZSIpLEFtKCksQW0oKSxBbSgpLFJtKDQwLCJkaXYiLDExKSxSbSg0MSwiZGl2IiwxMiksa3UoNDIsIiBUaGUgbG9nIGRpcmVjdG9yeSBtdXN0IGNvbnRhaW4gVGVuc29yRmxvdyBEZWJ1Z2dlciAoVjIpIGRhdGEuIHRmLmRlYnVnZ2luZy5leHBlcmltZW50YWwuZW5hYmxlX2R1bXBfZGVidWdfaW5mbygpIHdpbGwgY29sbGVjdCB0ZW5zb3IgZGF0YSwgZ3JhcGggc3RydWN0dXJlcywgdGhlIGFzc29jaWF0ZWQgc3RhY2sgdHJhY2VzLCBhbmQgc291cmNlIGNvZGUgdG8gdGhlIHNwZWNpZmljZWQgZGlyZWN0b3J5IGxvZ2RpciBhcyB0aGUgaW5zdHJ1bWVudGVkIFRlbnNvckZsb3cgcHJvZ3JhbSBleGVjdXRlcy4gIiksQW0oKSxSbSg0MywiZGl2IiwxMiksUm0oNDQsImRpdiIpLGt1KDQ1LCIgU2VlICIpLFJtKDQ2LCJhIiwxMyksa3UoNDcsIiBkb2N1bWVudGF0aW9uICIpLEFtKCksa3UoNDgsIiBvZiB0aGUgUHl0aG9uIEFQSSBvZiBEZWJ1Z2dlciBWMi4gIiksQW0oKSxSbSg0OSwiZGl2Iiksa3UoNTAsIiBTZWUgIiksUm0oNTEsImEiLDE0KSxrdSg1MiwiIGhlcmUgIiksQW0oKSxrdSg1MywiIGZvciBvdGhlciBUZW5zb3JGbG93IGRlYnVnZ2luZyBBUElzLiAiKSxBbSgpLEFtKCksQW0oKSxBbSgpKX0sc3R5bGVzOlsiLmFyZ1tfbmdjb250ZW50LSVDT01QJV0ge1xuICBjb2xvcjogbGlnaHRibHVlO1xuICBmb250LXN0eWxlOiBpdGFsaWM7XG4gIG1hcmdpbjogMnB4O1xufVxuXG4uY29kZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJywgbW9ub3NwYWNlO1xuICBtYXJnaW46IDEwcHg7XG59XG5cbi5jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBmb250LWZhbWlseTogUm9ib3RvO1xuICBmb250LXNpemU6IDE1cHg7XG4gIG92ZXJmbG93LXk6IGF1dG87XG4gIHBhZGRpbmc6IDUwcHg7XG59XG5cbi5kZXRhaWxzLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi5kZXRhaWxzW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luOiAxMHB4IDYwcHg7XG4gIHdpZHRoOiA1MCU7XG59XG5cbi5leGhpYml0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB3aWR0aDogMTAwJTtcbn1cblxuLmV4aGliaXRbX25nY29udGVudC0lQ09NUCVdIHtcbiAgYWxpZ24tY29udGVudDogY2VudGVyO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbjogMTBweCA2MHB4O1xuICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuICB3aWR0aDogMzEwcHg7XG59XG5cbi5leGhpYml0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV0ge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB3aWR0aDogMzEwcHg7XG59XG5cbi5leGhpYml0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5zY3JlZW5zaG90W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNhbnZhc1tfbmdjb250ZW50LSVDT01QJV0ge1xuICBoZWlnaHQ6IDIwMHB4O1xuICB3aWR0aDogMTAwJTtcbn1cblxuLnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGZvbnQtc2l6ZTogMTM1JTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIG1hcmdpbi1ib3R0b206IDI1cHg7XG59Il19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKERxLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImluYWN0aXZlLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vaW5hY3RpdmVfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vaW5hY3RpdmVfY29tcG9uZW50LmNzcyJdfV19XSxudWxsLG51bGwpO2NsYXNzIEVxe2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dH19RXEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEVxKShTbShJdykpfSxFcS7JtWNtcD10byh7dHlwZTpFcSxzZWxlY3RvcnM6W1sidGYtZGVidWdnZXItdjItaW5hY3RpdmUiXV0sZGVjbHM6MSx2YXJzOjAsdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmVG0oMCwiaW5hY3RpdmUtY29tcG9uZW50Iil9LGRpcmVjdGl2ZXM6W0RxXSxlbmNhcHN1bGF0aW9uOjJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEVxLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InRmLWRlYnVnZ2VyLXYyLWluYWN0aXZlIix0ZW1wbGF0ZToiIDxpbmFjdGl2ZS1jb21wb25lbnQ+PC9pbmFjdGl2ZS1jb21wb25lbnQ+ICJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y29uc3QgUnE9SlAoIltEZWJ1Z2dlcl0gRGVidWdnZXIgTG9hZGVkIiksQXE9SlAoIltEZWJ1Z2dlcl0gRGVidWdnZXIgVW5sb2FkZWQiKSxUcT1KUCgiW0RlYnVnZ2VyXSBBIE5ldyBEZWJ1Z2dlciBEYXRhIFBvbGxpbmcgRXZlbnQgQmVnaW5zIiksTnE9SlAoIltEZWJ1Z2dlcl0gRGVidWdnZXIgUnVucyBSZXF1ZXN0ZWQiKSx6cT1KUCgiW0RlYnVnZ2VyXSBEZWJ1Z2dlciBSdW5zIExvYWRlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLElxPUpQKCJbRGVidWdnZXJdIERlYnVnZ2VyIFJ1bnMgUmVxdWVzdCBGYWlsZWQiKSxIcT1KUCgiW0RlYnVnZ2VyXSBOdW1iZXIgYW5kIEJyZWFrZG93biBvZiBBbGVydHMgUmVxdWVzdGVkIiksRnE9SlAoIltEZWJ1Z2dlcl0gTnVtYmVyIGFuZCBCcmVha2Rvd24gb2YgQWxlcnRzIExvYWRlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLExxPUpQKCJbRGVidWdnZXJdIEFsZXJ0cyBEYXRhIG9mIGFuIEFsZXJ0VHlwZSBJcyBMb2FkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxCcT1KUCgiW0RlYnVnZ2VyXSBBbGVydCBUeXBlIEZvY3VzIFRvZ2dsZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxWcT1KUCgiW0RlYnVnZ2VyXSBOdW1iZXIgb2YgVG9wLUxldmVsIEV4ZWN1dGlvbnMgUmVxdWVzdGVkIiksanE9SlAoIltEZWJ1Z2dlcl0gTnVtYmVyIG9mIFRvcC1MZXZlbCBFeGVjdXRpb25zIExvYWRlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLFVxPUpQKCJbRGVidWdnZXJdIEV4ZWN1dGlvbkRpZ2VzdHMgUmVxdWVzdGVkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksR3E9SlAoIltEZWJ1Z2dlcl0gRXhlY3V0aW9uRGlnZXN0cyBMb2FkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxXcT1KUCgiW0RlYnVnZ2VyXSBTY3JvbGwgTGVmdHdhcmQgb24gdGhlIEV4ZWN1dGlvbiBUaW1lbGluZSIpLFlxPUpQKCJbRGVidWdnZXJdIFNjcm9sbCBSaWdodHdhcmQgb24gdGhlIEV4ZWN1dGlvbiBUaW1lbGluZSIpLHFxPUpQKCJbRGVidWdnZXJdIFNjcm9sbCB0aGUgRXhlY3V0aW9uIFRpbWVsaW5lIHRvIEdpdmVuIEluZGV4Iix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksWnE9SlAoIltEZWJ1Z2dlcl0gRXhlY3V0aW9uIERhdGEgT2JqZWN0cyBCZWluZyBGb2N1c2VkIE9uIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksWHE9SlAoIltEZWJ1Z2dlcl0gRXhlY3V0aW9uIERhdGEgT2JqZWN0cyBMb2FkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxLcT1KUCgiW0RlYnVnZ2VyXSBOdW1iZXIgb2YgSW50cmEtR3JhcGggRXhlY3V0aW9ucyBSZXF1ZXN0ZWQiKSxKcT1KUCgiW0RlYnVnZ2VyXSBOdW1iZXIgb2YgSW50cmEtR3JhcGggRXhlY3V0aW9ucyBMb2FkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxRcT1KUCgiW0RlYnVnZ2VyXSBJbnRyYS1HcmFwaCBFeGVjdXRpb24gRGF0YSBSZXF1ZXN0ZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSwkcT1KUCgiW0RlYnVnZ2VyXSBJbnRyYS1HcmFwaCBFeGVjdXRpb24gRGF0YSBMb2FkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSx0Wj1KUCgiW0RlYnVnZ2VyXSBTY3JvbGwgSW50cmEtR3JhcGggRXhlY3V0aW9uIExpc3QgdG8gR2l2ZW4gSW5kZXgiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxlWj1KUCgiW0RlYnVnZ2VyXSBHcmFwaCBFeGVjdXRpb24gaXMgRm9jdXNlZCBPbiIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLG5aPUpQKCJbRGVidWdnZXJdIEdyYXBoIE9wIElzIEZvY3VzZWQgT24iLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxvWj1KUCgiW0RlYnVnZ2VyXSBHcmFwaCBPcCBJbmZvIFJlcXVlc3RlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLGlaPUpQKCJbRGVidWdnZXJdIEdyYXBoIE9wIEluZm8gTG9hZGVkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksYVo9SlAoIltEZWJ1Z2dlcl0gU291cmNlIEZpbGUgTGlzdCBSZXF1ZXN0ZWQuIiksclo9SlAoIltEZWJ1Z2dlcl0gU291cmNlIEZpbGUgTGlzdCBMb2FkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxzWj1KUCgiW0RlYnVnZ2VyXSBTb3VyY2UgRmlsZSBMaW5lIElzIEZvY3VzZWQgb24iLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxsWj1KUCgiW0RlYnVnZ2VyXSBTb3VyY2UgRmlsZSBSZXF1ZXN0ZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxjWj1KUCgiW0RlYnVnZ2VyXSBTb3VyY2UgRmlsZSBMb2FkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxkWj1KUCgiW0RlYnVnZ2VyXSBBIFNldCBvZiBTdGFjayBGcmFtZXMgSGF2ZSBCZWVuIExvYWRlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLHBaPSJkZWJ1Z2dlciI7dmFyIG1aLHVaLGZaO2Z1bmN0aW9uIGdaKHQpe2lmKG51bGw9PT10LmNvZGVMb2NhdGlvbkZvY3VzVHlwZSlyZXR1cm4gbnVsbDtsZXQgZT1bXTtpZih0LmNvZGVMb2NhdGlvbkZvY3VzVHlwZT09PWZaLkVYRUNVVElPTil7Y29uc3R7Zm9jdXNJbmRleDpuLGV4ZWN1dGlvbkRhdGE6b309dC5leGVjdXRpb25zO2lmKG51bGw9PT1ufHx2b2lkIDA9PT1vW25dKXJldHVybiBudWxsO2U9b1tuXS5zdGFja19mcmFtZV9pZHN9ZWxzZXtpZihudWxsPT09dC5ncmFwaHMuZm9jdXNlZE9wKXJldHVybiBudWxsO2NvbnN0e2dyYXBoSWQ6bixvcE5hbWU6b309dC5ncmFwaHMuZm9jdXNlZE9wO2lmKHZvaWQgMD09PXQuZ3JhcGhzLm9wc1tuXXx8IXQuZ3JhcGhzLm9wc1tuXS5oYXMobykpcmV0dXJuIG51bGw7ZT10LmdyYXBocy5vcHNbbl0uZ2V0KG8pLnN0YWNrX2ZyYW1lX2lkc31jb25zdCBuPVtdO2Zvcihjb25zdCBvIG9mIGUpe2lmKG51bGw9PXQuc3RhY2tGcmFtZXNbb10pcmV0dXJuIG51bGw7bi5wdXNoKHQuc3RhY2tGcmFtZXNbb10pfXJldHVybiBufWZ1bmN0aW9uIGhaKHQsZSl7cmV0dXJuIHQuZmluZEluZGV4KCh0PT50Lmhvc3RfbmFtZT09PWUuaG9zdF9uYW1lJiZ0LmZpbGVfcGF0aD09PWUuZmlsZV9wYXRoKSl9ZnVuY3Rpb24gYloodCxlLG4pe2lmKGU+PW4pdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBiZWdpbiB0byBiZSBsZXNzIHRoYW4gZW5kLCBidXQgZ290IGJlZ2luPSR7ZX0sIGVuZD0ke259YCk7cmV0dXJuIHQuZmluZEluZGV4KCh0PT50LmJlZ2luPT09ZSYmdC5lbmQ9PT1uKSl9ZnVuY3Rpb24geVoodCl7Y29uc3QgZT10LnNvdXJjZUNvZGUuZm9jdXNMaW5lU3BlYztpZighdC5zdGlja1RvQm90dG9tbW9zdEZyYW1lSW5Gb2N1c2VkRmlsZSlyZXR1cm4gZTtjb25zdCBuPWdaKHQpO2lmKG51bGw9PT1uKXJldHVybiBlO2NvbnN0IG89KGZ1bmN0aW9uIGkodCxlKXtpZihudWxsPT09ZSlyZXR1cm4gbnVsbDtmb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wOy0tbil7Y29uc3Qgbz10W25dLHtob3N0X25hbWU6aSxmaWxlX3BhdGg6YX09bztpZihpPT09ZS5ob3N0X25hbWUmJmE9PT1lLmZpbGVfcGF0aClyZXR1cm4gb31yZXR1cm4gbnVsbH0pKG4sZSk7cmV0dXJuIG51bGw9PT1vP2U6b30hKGZ1bmN0aW9uKHQpe3RbdC5VTlNQRUNJRklFRD0wXT0iVU5TUEVDSUZJRUQiLHRbdC5OT19URU5TT1I9MV09Ik5PX1RFTlNPUiIsdFt0LkNVUlRfSEVBTFRIPTJdPSJDVVJUX0hFQUxUSCIsdFt0LkNPTkNJU0VfSEVBTFRIPTNdPSJDT05DSVNFX0hFQUxUSCIsdFt0LkZVTExfSEVBTFRIPTRdPSJGVUxMX0hFQUxUSCIsdFt0LlNIQVBFPTVdPSJTSEFQRSIsdFt0LkZVTExfTlVNRVJJQ1M9Nl09IkZVTExfTlVNRVJJQ1MiLHRbdC5GVUxMX1RFTlNPUj03XT0iRlVMTF9URU5TT1IiLHRbdC5SRURVQ0VfSU5GX05BTl9USFJFRV9TTE9UUz04XT0iUkVEVUNFX0lORl9OQU5fVEhSRUVfU0xPVFMifSkobVp8fChtWj17fSkpLChmdW5jdGlvbih0KXt0LkZVTkNUSU9OX1JFQ09NUElMRV9BTEVSVD0iRnVuY3Rpb25SZWNvbXBpbGVzQWxlcnQiLHQuSU5GX05BTl9BTEVSVD0iSW5mTmFuQWxlcnQiLHQuVEVOU09SX1NIQVBFX0FMRVJUPSJUZW5zb3JTaGFwZUFsZXJ0In0pKHVafHwodVo9e30pKSwoZnVuY3Rpb24odCl7dFt0LkVYRUNVVElPTj0wXT0iRVhFQ1VUSU9OIix0W3QuR1JBUEhfT1BfQ1JFQVRJT049MV09IkdSQVBIX09QX0NSRUFUSU9OIn0pKGZafHwoZlo9e30pKTtjb25zdCBfWj15ayh7cnVuczp7fSxydW5zTG9hZGVkOntzdGF0ZTp5RS5OT1RfTE9BREVELGxhc3RMb2FkZWRUaW1lSW5NczpudWxsfSxhY3RpdmVSdW5JZDpudWxsLGxhc3REYXRhUG9sbE9uc2V0VGltZU1zOi0xLGxhc3ROb25FbXB0eVBvbGxEYXRhVGltZU1zOjEsYWxlcnRzOnthbGVydHNMb2FkZWQ6e3N0YXRlOnlFLk5PVF9MT0FERUQsbGFzdExvYWRlZFRpbWVJbk1zOm51bGx9LG51bUFsZXJ0czowLGFsZXJ0c0JyZWFrZG93bjp7fSxhbGVydHM6e30sZXhlY3V0aW9uSW5kaWNlczp7fSxncmFwaEV4ZWN1dGlvbkluZGljZXM6e30sZm9jdXNUeXBlOm51bGx9LGV4ZWN1dGlvbnM6KGZ1bmN0aW9uIENaKCl7cmV0dXJue251bUV4ZWN1dGlvbnNMb2FkZWQ6e3N0YXRlOnlFLk5PVF9MT0FERUQsbGFzdExvYWRlZFRpbWVJbk1zOm51bGx9LGV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQ6e2xvYWRpbmdSYW5nZXM6W10sbnVtRXhlY3V0aW9uczowLHBhZ2VMb2FkZWRTaXplczp7fX0sZGlzcGxheUNvdW50OjUwLHBhZ2VTaXplOjEwMCxzY3JvbGxCZWdpbkluZGV4OjAsZm9jdXNJbmRleDpudWxsLGV4ZWN1dGlvbkRpZ2VzdHM6e30sZXhlY3V0aW9uRGF0YTp7fX19KSgpLGdyYXBoRXhlY3V0aW9uczooZnVuY3Rpb24gTVooKXtyZXR1cm57bnVtRXhlY3V0aW9uc0xvYWRlZDp7c3RhdGU6eUUuTk9UX0xPQURFRCxsYXN0TG9hZGVkVGltZUluTXM6bnVsbH0sZXhlY3V0aW9uRGlnZXN0c0xvYWRlZDp7bG9hZGluZ1JhbmdlczpbXSxudW1FeGVjdXRpb25zOjAscGFnZUxvYWRlZFNpemVzOnt9fSxkaXNwbGF5Q291bnQ6MTAwLHBhZ2VTaXplOjIwMCxzY3JvbGxCZWdpbkluZGV4OjAsZm9jdXNJbmRleDpudWxsLGdyYXBoRXhlY3V0aW9uRGlnZXN0czp7fSxncmFwaEV4ZWN1dGlvbkRhdGFMb2FkaW5nUGFnZXM6W10sZ3JhcGhFeGVjdXRpb25EYXRhUGFnZUxvYWRlZFNpemVzOnt9LGdyYXBoRXhlY3V0aW9uRGF0YTp7fX19KSgpLGdyYXBoczp7b3BzOnt9LGxvYWRpbmdPcHM6e30sZm9jdXNlZE9wOm51bGx9LHN0YWNrRnJhbWVzOnt9LGNvZGVMb2NhdGlvbkZvY3VzVHlwZTpudWxsLHN0aWNrVG9Cb3R0b21tb3N0RnJhbWVJbkZvY3VzZWRGaWxlOiExLHNvdXJjZUNvZGU6e3NvdXJjZUZpbGVMaXN0TG9hZGVkOntzdGF0ZTp5RS5OT1RfTE9BREVELGxhc3RMb2FkZWRUaW1lSW5NczpudWxsfSxzb3VyY2VGaWxlTGlzdDpbXSxmaWxlQ29udGVudHM6W10sZm9jdXNMaW5lU3BlYzpudWxsfX0sYmsoTnEsKHQ9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7cnVuc0xvYWRlZDpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5ydW5zTG9hZGVkKSx7c3RhdGU6eUUuTE9BRElOR30pfSkpKSxiayhJcSwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtydW5zTG9hZGVkOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnJ1bnNMb2FkZWQpLHtzdGF0ZTp5RS5GQUlMRUR9KX0pKSksYmsoenEsKCh0LHtydW5zOmV9KT0+e2NvbnN0IG49T2JqZWN0LmtleXMoZSksbz1uLmxlbmd0aD4wJiZudWxsPT09dC5hY3RpdmVSdW5JZDtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtsYXN0Tm9uRW1wdHlQb2xsRGF0YVRpbWVNczpvP0RhdGUubm93KCk6dC5sYXN0Tm9uRW1wdHlQb2xsRGF0YVRpbWVNcyxydW5zOmUscnVuc0xvYWRlZDp7c3RhdGU6eUUuTE9BREVELGxhc3RMb2FkZWRUaW1lSW5NczpEYXRlLm5vdygpfSxhY3RpdmVSdW5JZDpuLmxlbmd0aD4wP25bMF06bnVsbH0pfSkpLGJrKFRxLCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2xhc3REYXRhUG9sbE9uc2V0VGltZU1zOkRhdGUubm93KCl9KSkpLGJrKEhxLCh0PT5udWxsPT09dC5hY3RpdmVSdW5JZD90Ok9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7YWxlcnRzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmFsZXJ0cykse2FsZXJ0c0xvYWRlZDpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5hbGVydHMuYWxlcnRzTG9hZGVkKSx7c3RhdGU6eUUuTE9BRElOR30pfSl9KSkpLGJrKEZxLCgodCx7bnVtQWxlcnRzOmUsYWxlcnRzQnJlYWtkb3duOm59KT0+e2lmKG51bGw9PT10LmFjdGl2ZVJ1bklkKXJldHVybiB0O2NvbnN0IG89ZT50LmFsZXJ0cy5udW1BbGVydHM7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7bGFzdE5vbkVtcHR5UG9sbERhdGFUaW1lTXM6bz9EYXRlLm5vdygpOnQubGFzdE5vbkVtcHR5UG9sbERhdGFUaW1lTXMsYWxlcnRzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmFsZXJ0cykse2FsZXJ0c0xvYWRlZDpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5hbGVydHMuYWxlcnRzTG9hZGVkKSx7c3RhdGU6eUUuTE9BREVELGxhc3RMb2FkZWRUaW1lSW5NczpEYXRlLm5vdygpfSksbnVtQWxlcnRzOmUsYWxlcnRzQnJlYWtkb3duOm59KX0pfSkpLGJrKExxLCgodCx7bnVtQWxlcnRzOmUsYWxlcnRzQnJlYWtkb3duOm4sYWxlcnRUeXBlOm8sYmVnaW46aSxhbGVydHM6YX0pPT57aWYobnVsbD09PXQuYWN0aXZlUnVuSWQpcmV0dXJuIHQ7Y29uc3Qgcj17fSxzPXQuYWxlcnRzLmV4ZWN1dGlvbkluZGljZXNbb10/dC5hbGVydHMuZXhlY3V0aW9uSW5kaWNlc1tvXS5zbGljZSgpOltdLGw9dC5hbGVydHMuZ3JhcGhFeGVjdXRpb25JbmRpY2VzW29dP3QuYWxlcnRzLmdyYXBoRXhlY3V0aW9uSW5kaWNlc1tvXS5zbGljZSgpOltdO2ZvcihsZXQgdD0wO3Q8YS5sZW5ndGg7Kyt0KXtjb25zdCBlPWkrdCxuPWFbdF07aWYocltlXT1uLG4uYWxlcnRfdHlwZT09PXVaLklORl9OQU5fQUxFUlQpe2NvbnN0IHQ9bjtzW2VdPXQuZXhlY3V0aW9uX2luZGV4LG51bGwhPT10LmdyYXBoX2V4ZWN1dGlvbl90cmFjZV9pbmRleCYmKGxbZV09dC5ncmFwaF9leGVjdXRpb25fdHJhY2VfaW5kZXgpfX12b2lkIDAhPT10LmFsZXJ0cy5hbGVydHNbb10mJk9iamVjdC5hc3NpZ24ocix0LmFsZXJ0cy5hbGVydHNbb10pO2xldCBjPXQuZXhlY3V0aW9ucy5zY3JvbGxCZWdpbkluZGV4LGQ9dC5ncmFwaEV4ZWN1dGlvbnMuZm9jdXNJbmRleDtpZihvPT09dVouSU5GX05BTl9BTEVSVCYmMD09PWkpe2NvbnN0IGU9YVswXTtjPU1hdGgubWF4KDAsZS5leGVjdXRpb25faW5kZXgtTWF0aC5mbG9vcih0LmV4ZWN1dGlvbnMuZGlzcGxheUNvdW50LzIpKSxudWxsIT09ZS5ncmFwaF9leGVjdXRpb25fdHJhY2VfaW5kZXgmJihkPWUuZ3JhcGhfZXhlY3V0aW9uX3RyYWNlX2luZGV4KX1yZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtleGVjdXRpb25zOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmV4ZWN1dGlvbnMpLHtzY3JvbGxCZWdpbkluZGV4OmN9KSxncmFwaEV4ZWN1dGlvbnM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuZ3JhcGhFeGVjdXRpb25zKSx7Zm9jdXNJbmRleDpkfSksYWxlcnRzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmFsZXJ0cykse2FsZXJ0c0xvYWRlZDpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5hbGVydHMuYWxlcnRzTG9hZGVkKSx7c3RhdGU6eUUuTE9BREVELGxhc3RMb2FkZWRUaW1lSW5NczpEYXRlLm5vdygpfSksbnVtQWxlcnRzOmUsYWxlcnRzQnJlYWtkb3duOm4sYWxlcnRzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmFsZXJ0cy5hbGVydHMpLHtbb106cn0pLGV4ZWN1dGlvbkluZGljZXM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuYWxlcnRzLmV4ZWN1dGlvbkluZGljZXMpLHtbb106c30pLGdyYXBoRXhlY3V0aW9uSW5kaWNlczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5hbGVydHMuZ3JhcGhFeGVjdXRpb25JbmRpY2VzKSx7W29dOmx9KX0pfSl9KSksYmsoQnEsKCh0LHthbGVydFR5cGU6ZX0pPT57Y29uc3Qgbj1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2FsZXJ0czpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5hbGVydHMpLHtmb2N1c1R5cGU6dC5hbGVydHMuZm9jdXNUeXBlPT09ZT9udWxsOmV9KX0pLG89bi5hbGVydHMuZm9jdXNUeXBlO2lmKG51bGwhPT1vKXtjb25zdCB0PW4uYWxlcnRzLmV4ZWN1dGlvbkluZGljZXNbb118fFtdO3ZvaWQgMCE9PXRbMF0mJihuLmV4ZWN1dGlvbnM9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG4uZXhlY3V0aW9ucykse3Njcm9sbEJlZ2luSW5kZXg6TWF0aC5tYXgoMCxOdW1iZXIodFswXSktTWF0aC5mbG9vcihuLmV4ZWN1dGlvbnMuZGlzcGxheUNvdW50LzIpKX0pKX1yZXR1cm4gbn0pKSxiayhWcSwodD0+bnVsbD09PXQuYWN0aXZlUnVuSWQ/dDpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2V4ZWN1dGlvbnM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuZXhlY3V0aW9ucykse251bUV4ZWN1dGlvbnNMb2FkZWQ6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuZXhlY3V0aW9ucy5udW1FeGVjdXRpb25zTG9hZGVkKSx7c3RhdGU6eUUuTE9BRElOR30pfSl9KSkpLGJrKGpxLCgodCx7bnVtRXhlY3V0aW9uczplfSk9PntpZihudWxsPT09dC5hY3RpdmVSdW5JZClyZXR1cm4gdDtjb25zdCBuPWU+dC5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQubnVtRXhlY3V0aW9ucyxvPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7bGFzdE5vbkVtcHR5UG9sbERhdGFUaW1lTXM6bj9EYXRlLm5vdygpOnQubGFzdE5vbkVtcHR5UG9sbERhdGFUaW1lTXMsZXhlY3V0aW9uczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5leGVjdXRpb25zKSx7bnVtRXhlY3V0aW9uc0xvYWRlZDpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5leGVjdXRpb25zLm51bUV4ZWN1dGlvbnNMb2FkZWQpLHtzdGF0ZTp5RS5MT0FERUQsbGFzdExvYWRlZFRpbWVJbk1zOkRhdGUubm93KCl9KSxleGVjdXRpb25EaWdlc3RzTG9hZGVkOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmV4ZWN1dGlvbnMuZXhlY3V0aW9uRGlnZXN0c0xvYWRlZCkse251bUV4ZWN1dGlvbnM6ZX0pfSl9KTtyZXR1cm4gZT4wJiZudWxsPT09dC5leGVjdXRpb25zLmZvY3VzSW5kZXgmJihvLmV4ZWN1dGlvbnMuZm9jdXNJbmRleD0wKSxvfSkpLGJrKFVxLCgodCxlKT0+e2lmKG51bGw9PT10LmFjdGl2ZVJ1bklkKXJldHVybiB0O2NvbnN0IG49Wy4uLnQuZXhlY3V0aW9ucy5leGVjdXRpb25EaWdlc3RzTG9hZGVkLmxvYWRpbmdSYW5nZXNdO3JldHVybi0xPT09YloobixlLmJlZ2luLGUuZW5kKSYmbi5wdXNoKHtiZWdpbjplLmJlZ2luLGVuZDplLmVuZH0pLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7ZXhlY3V0aW9uczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5leGVjdXRpb25zKSx7ZXhlY3V0aW9uRGlnZXN0c0xvYWRlZDpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQpLHtsb2FkaW5nUmFuZ2VzOm59KX0pfSl9KSksYmsoR3EsKCh0LGUpPT57aWYobnVsbD09PXQuYWN0aXZlUnVuSWQpcmV0dXJuIHQ7Y29uc3Qgbj1bLi4udC5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQubG9hZGluZ1Jhbmdlc10sbz1iWihuLGUuYmVnaW4sZS5lbmQpOy0xIT09byYmbi5zcGxpY2UobywxKTtjb25zdCBpPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7ZXhlY3V0aW9uczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5leGVjdXRpb25zKSx7ZXhlY3V0aW9uRGlnZXN0c0xvYWRlZDpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQpLHtudW1FeGVjdXRpb25zOmUubnVtX2RpZ2VzdHMsbG9hZGluZ1JhbmdlczpufSksZXhlY3V0aW9uRGlnZXN0czpPYmplY3QuYXNzaWduKHt9LHQuZXhlY3V0aW9ucy5leGVjdXRpb25EaWdlc3RzKX0pfSk7Zm9yKGxldCB0PWUuYmVnaW47dDxlLmVuZDsrK3QpaS5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNbdF09ZS5leGVjdXRpb25fZGlnZXN0c1t0LWUuYmVnaW5dO2lmKGUuZW5kPmUuYmVnaW4pe2NvbnN0IG49ZS5iZWdpbi90LmV4ZWN1dGlvbnMucGFnZVNpemU7aS5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQucGFnZUxvYWRlZFNpemVzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpLmV4ZWN1dGlvbnMuZXhlY3V0aW9uRGlnZXN0c0xvYWRlZC5wYWdlTG9hZGVkU2l6ZXMpLHtbbl06ZS5lbmQtZS5iZWdpbn0pfXJldHVybiBpfSkpLGJrKFdxLCh0PT57aWYobnVsbD09PXQuYWN0aXZlUnVuSWQpcmV0dXJuIHQ7bGV0IGU9dC5leGVjdXRpb25zLnNjcm9sbEJlZ2luSW5kZXg7cmV0dXJuIGU+MCYmZS0tLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7ZXhlY3V0aW9uczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5leGVjdXRpb25zKSx7c2Nyb2xsQmVnaW5JbmRleDplfSl9KX0pKSxiayhZcSwodD0+e2lmKG51bGw9PT10LmFjdGl2ZVJ1bklkKXJldHVybiB0O2xldCBlPXQuZXhlY3V0aW9ucy5zY3JvbGxCZWdpbkluZGV4O3JldHVybiBlK3QuZXhlY3V0aW9ucy5kaXNwbGF5Q291bnQrMTw9dC5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQubnVtRXhlY3V0aW9ucyYmZSsrLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7ZXhlY3V0aW9uczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5leGVjdXRpb25zKSx7c2Nyb2xsQmVnaW5JbmRleDplfSl9KX0pKSxiayhxcSwoKHQsZSk9PntpZihlLmluZGV4PDB8fCFOdW1iZXIuaXNJbnRlZ2VyKGUuaW5kZXgpKXRocm93IG5ldyBFcnJvcihgQXR0ZW1wdCB0byBzY3JvbGwgdG8gbmVnYXRpdmUgb3Igbm9uLWludGVnZXIgZXhlY3V0aW9uIGluZGV4ICgke2UuaW5kZXh9KWApO2NvbnN0e2Rpc3BsYXlDb3VudDpufT10LmV4ZWN1dGlvbnMse251bUV4ZWN1dGlvbnM6b309dC5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQ7aWYoZS5pbmRleD5NYXRoLm1heCgwLG8tbikpdGhyb3cgbmV3IEVycm9yKGBBdHRlbXB0IHRvIHNjcm9sbCB0byBleGVjdXRpb24gaW5kZXggKCR7ZS5pbmRleH0pLCB3aGljaCBleGNlZWRzIG1heGltdW0gYWxsb3dlZCBpbmRleCAobnVtRXhlY3V0aW9ucz0ke299OyBkaXNwbGF5Q291bnQ9JHtufSlgKTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtleGVjdXRpb25zOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmV4ZWN1dGlvbnMpLHtzY3JvbGxCZWdpbkluZGV4OmUuaW5kZXh9KX0pfSkpLGJrKFpxLCgodCxlKT0+e2NvbnN0IG49T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtleGVjdXRpb25zOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmV4ZWN1dGlvbnMpLHtmb2N1c0luZGV4OnQuZXhlY3V0aW9ucy5zY3JvbGxCZWdpbkluZGV4K2UuZGlzcGxheUluZGV4fSksY29kZUxvY2F0aW9uRm9jdXNUeXBlOmZaLkVYRUNVVElPTixzb3VyY2VDb2RlOk9iamVjdC5hc3NpZ24oe30sdC5zb3VyY2VDb2RlKX0pO3JldHVybiBuLnNvdXJjZUNvZGUuZm9jdXNMaW5lU3BlYz15WihuKSxufSkpLGJrKFhxLCgodCxlKT0+e2lmKG51bGw9PT10LmFjdGl2ZVJ1bklkKXJldHVybiB0O2NvbnN0IG49T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtleGVjdXRpb25zOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmV4ZWN1dGlvbnMpLHtleGVjdXRpb25EYXRhOk9iamVjdC5hc3NpZ24oe30sdC5leGVjdXRpb25zLmV4ZWN1dGlvbkRhdGEpfSl9KTtmb3IobGV0IHQ9ZS5iZWdpbjt0PGUuZW5kOysrdCluLmV4ZWN1dGlvbnMuZXhlY3V0aW9uRGF0YVt0XT1lLmV4ZWN1dGlvbnNbdC1lLmJlZ2luXTtyZXR1cm4gbn0pKSxiayhLcSwodD0+bnVsbD09PXQuYWN0aXZlUnVuSWQ/dDpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2dyYXBoRXhlY3V0aW9uczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5ncmFwaEV4ZWN1dGlvbnMpLHtudW1FeGVjdXRpb25zTG9hZGVkOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmdyYXBoRXhlY3V0aW9ucy5udW1FeGVjdXRpb25zTG9hZGVkKSx7c3RhdGU6eUUuTE9BRElOR30pfSl9KSkpLGJrKEpxLCgodCx7bnVtR3JhcGhFeGVjdXRpb25zOmV9KT0+e2lmKG51bGw9PT10LmFjdGl2ZVJ1bklkKXJldHVybiB0O2NvbnN0IG49ZT50LmdyYXBoRXhlY3V0aW9ucy5leGVjdXRpb25EaWdlc3RzTG9hZGVkLm51bUV4ZWN1dGlvbnMsbz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2xhc3ROb25FbXB0eVBvbGxEYXRhVGltZU1zOm4/RGF0ZS5ub3coKTp0Lmxhc3ROb25FbXB0eVBvbGxEYXRhVGltZU1zLGdyYXBoRXhlY3V0aW9uczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5ncmFwaEV4ZWN1dGlvbnMpLHtudW1FeGVjdXRpb25zTG9hZGVkOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmdyYXBoRXhlY3V0aW9ucy5udW1FeGVjdXRpb25zTG9hZGVkKSx7c3RhdGU6eUUuTE9BREVELGxhc3RMb2FkZWRUaW1lSW5NczpEYXRlLm5vdygpfSksZXhlY3V0aW9uRGlnZXN0c0xvYWRlZDpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5ncmFwaEV4ZWN1dGlvbnMuZXhlY3V0aW9uRGlnZXN0c0xvYWRlZCkse251bUV4ZWN1dGlvbnM6ZX0pfSl9KTtyZXR1cm4gZT4wJiZudWxsPT09dC5ncmFwaEV4ZWN1dGlvbnMuZm9jdXNJbmRleCYmKG8uZ3JhcGhFeGVjdXRpb25zLmZvY3VzSW5kZXg9MCksb30pKSxiayhRcSwoKHQse3BhZ2VJbmRleDplfSk9PntpZihudWxsPT09dC5hY3RpdmVSdW5JZClyZXR1cm4gdDtjb25zdCBuPXQuZ3JhcGhFeGVjdXRpb25zLmdyYXBoRXhlY3V0aW9uRGF0YUxvYWRpbmdQYWdlcy5zbGljZSgpO3JldHVybi0xPT09bi5pbmRleE9mKGUpJiZuLnB1c2goZSksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtncmFwaEV4ZWN1dGlvbnM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuZ3JhcGhFeGVjdXRpb25zKSx7Z3JhcGhFeGVjdXRpb25EYXRhTG9hZGluZ1BhZ2VzOm59KX0pfSkpLGJrKCRxLCgodCxlKT0+e2lmKG51bGw9PT10LmFjdGl2ZVJ1bklkKXJldHVybiB0O2NvbnN0e3BhZ2VTaXplOm59PXQuZ3JhcGhFeGVjdXRpb25zLG89dC5ncmFwaEV4ZWN1dGlvbnMuZ3JhcGhFeGVjdXRpb25EYXRhTG9hZGluZ1BhZ2VzLnNsaWNlKCksaT1PYmplY3QuYXNzaWduKHt9LHQuZ3JhcGhFeGVjdXRpb25zLmdyYXBoRXhlY3V0aW9uRGF0YVBhZ2VMb2FkZWRTaXplcyksYT1PYmplY3QuYXNzaWduKHt9LHQuZ3JhcGhFeGVjdXRpb25zLmdyYXBoRXhlY3V0aW9uRGF0YSk7Zm9yKGxldCB0PWUuYmVnaW47dDxlLmVuZDsrK3Qpe2NvbnN0IHI9TWF0aC5mbG9vcih0L24pOy0xIT09by5pbmRleE9mKHIpJiZvLnNwbGljZShvLmluZGV4T2YociksMSksdm9pZCAwPT09aVtyXSYmKGlbcl09MCksdm9pZCAwPT09YVt0XSYmaVtyXSsrLGFbdF09ZS5ncmFwaF9leGVjdXRpb25zW3QtZS5iZWdpbl19cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7Z3JhcGhFeGVjdXRpb25zOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmdyYXBoRXhlY3V0aW9ucykse2dyYXBoRXhlY3V0aW9uRGF0YUxvYWRpbmdQYWdlczpvLGdyYXBoRXhlY3V0aW9uRGF0YVBhZ2VMb2FkZWRTaXplczppLGdyYXBoRXhlY3V0aW9uRGF0YTphfSl9KX0pKSxiayh0WiwoKHQsZSk9PntpZihlLmluZGV4PDB8fCFOdW1iZXIuaXNJbnRlZ2VyKGUuaW5kZXgpKXRocm93IG5ldyBFcnJvcihgQXR0ZW1wdCB0byBzY3JvbGwgdG8gbmVnYXRpdmUgb3Igbm9uLWludGVnZXIgZ3JhcGgtZXhlY3V0aW9uIGluZGV4ICgke2UuaW5kZXh9KWApO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2dyYXBoRXhlY3V0aW9uczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5ncmFwaEV4ZWN1dGlvbnMpLHtzY3JvbGxCZWdpbkluZGV4OmUuaW5kZXh9KX0pfSkpLGJrKGVaLCgodCxlKT0+dloodCxlLmdyYXBoX2lkLGUub3BfbmFtZSxlLmluZGV4KSkpLGJrKG5aLCgodCxlKT0+dloodCxlLmdyYXBoX2lkLGUub3BfbmFtZSkpKSxiayhvWiwoKHQsZSk9Pntjb25zdHtncmFwaF9pZDpuLG9wX25hbWU6b309ZSxpPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7Z3JhcGhzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmdyYXBocykse2xvYWRpbmdPcHM6T2JqZWN0LmFzc2lnbih7fSx0LmdyYXBocy5sb2FkaW5nT3BzKX0pfSk7cmV0dXJuIHZvaWQgMD09PWkuZ3JhcGhzLmxvYWRpbmdPcHNbbl0mJihpLmdyYXBocy5sb2FkaW5nT3BzW25dPW5ldyBNYXApLGkuZ3JhcGhzLmxvYWRpbmdPcHNbbl0uaGFzKG8pfHxpLmdyYXBocy5sb2FkaW5nT3BzW25dLnNldChvLHlFLkxPQURJTkcpLGl9KSksYmsoaVosKCh0LGUpPT57Y29uc3R7Z3JhcGhPcEluZm9SZXNwb25zZTpufT1lLHtncmFwaF9pZHM6b309bixpPW9bby5sZW5ndGgtMV0sYT1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2dyYXBoczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5ncmFwaHMpLHtvcHM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuZ3JhcGhzLm9wcykse1tpXTpuZXcgTWFwKHQuZ3JhcGhzLm9wc1tpXSl9KSxsb2FkaW5nT3BzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmdyYXBocy5sb2FkaW5nT3BzKSx7W2ldOm5ldyBNYXAodC5ncmFwaHMubG9hZGluZ09wc1tpXSl9KX0pfSk7Zm9yKGNvbnN0IHQgb2Ygbi5pbnB1dHMpdC5kYXRhJiZhLmdyYXBocy5vcHNbaV0uc2V0KHQub3BfbmFtZSx0LmRhdGEpO2ZvcihsZXQgdD0wO3Q8bi5jb25zdW1lcnMubGVuZ3RoOysrdClmb3IoY29uc3QgZSBvZiBuLmNvbnN1bWVyc1t0XSllLmRhdGEmJmEuZ3JhcGhzLm9wc1tpXS5zZXQoZS5vcF9uYW1lLGUuZGF0YSk7cmV0dXJuIGEuZ3JhcGhzLm9wc1tpXS5zZXQobi5vcF9uYW1lLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSx7aW5wdXRzOm4uaW5wdXRzLm1hcCgodD0+KHtvcF9uYW1lOnQub3BfbmFtZSxvdXRwdXRfc2xvdDp0Lm91dHB1dF9zbG90fSkpKSxjb25zdW1lcnM6bi5jb25zdW1lcnMubWFwKCh0PT50Lm1hcCgodD0+KHtvcF9uYW1lOnQub3BfbmFtZSxpbnB1dF9zbG90OnQuaW5wdXRfc2xvdH0pKSkpKX0pKSxhLmdyYXBocy5sb2FkaW5nT3BzW2ldLnNldChuLm9wX25hbWUseUUuTE9BREVEKSxhfSkpLGJrKGFaLCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NvdXJjZUNvZGU6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuc291cmNlQ29kZSkse3NvdXJjZUZpbGVMaXN0TG9hZGVkOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnNvdXJjZUNvZGUuc291cmNlRmlsZUxpc3RMb2FkZWQpLHtzdGF0ZTp5RS5MT0FESU5HfSl9KX0pKSksYmsoclosKCh0LGUpPT57dmFyIG47Y29uc3Qgbz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NvdXJjZUNvZGU6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuc291cmNlQ29kZSkse3NvdXJjZUZpbGVMaXN0TG9hZGVkOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnNvdXJjZUNvZGUuc291cmNlRmlsZUxpc3RMb2FkZWQpLHtzdGF0ZTp5RS5MT0FERUQsbGFzdExvYWRlZFRpbWVJbk1zOkRhdGUubm93KCl9KSxzb3VyY2VGaWxlTGlzdDplLnNvdXJjZUZpbGVzLGZpbGVDb250ZW50czp0LnNvdXJjZUNvZGUuZmlsZUNvbnRlbnRzLnNsaWNlKCl9KX0pLGk9ZS5zb3VyY2VGaWxlcy5sZW5ndGgse2ZpbGVDb250ZW50czphfT1vLnNvdXJjZUNvZGU7Zm9yKGxldCBlPTA7ZTxpOysrZSlhW2VdPW51bGwhPT0obj10LnNvdXJjZUNvZGUuZmlsZUNvbnRlbnRzW2VdKSYmdm9pZCAwIT09bj9uOntsb2FkU3RhdGU6eUUuTk9UX0xPQURFRCxsaW5lczpudWxsfTtyZXR1cm4gb30pKSxiayhzWiwoKHQsZSk9Pntjb25zdCBuPWdaKHQpLG89T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzb3VyY2VDb2RlOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnNvdXJjZUNvZGUpLHtmb2N1c0xpbmVTcGVjOmUuc3RhY2tGcmFtZX0pfSk7cmV0dXJuIG51bGwhPT1uJiYoby5zdGlja1RvQm90dG9tbW9zdEZyYW1lSW5Gb2N1c2VkRmlsZT0oZnVuY3Rpb24gaSh0LGUpe2xldCBuPS0xLG89LTE7aWYodC5mb3JFYWNoKCgoe2ZpbGVfcGF0aDp0LGxpbmVubzppfSxhKT0+e3Q9PT1lLmZpbGVfcGF0aCYmKG89YSxpPT09ZS5saW5lbm8mJihuPWEpKX0pKSwtMT09PW4pdGhyb3cgbmV3IEVycm9yKGBTdGFjayBmcmFtZSAke0pTT04uc3RyaW5naWZ5KGUpfSBpcyBub3QgZm91bmQuYCk7cmV0dXJuIG49PT1vfSkobixlLnN0YWNrRnJhbWUpKSxvfSkpLGJrKGxaLCgodCxlKT0+e2NvbnN0IG49T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzb3VyY2VDb2RlOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnNvdXJjZUNvZGUpLHtmaWxlQ29udGVudHM6dC5zb3VyY2VDb2RlLmZpbGVDb250ZW50cy5zbGljZSgpfSl9KSxvPWhaKG4uc291cmNlQ29kZS5zb3VyY2VGaWxlTGlzdCxlKTtpZighKG8+PTApKXRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgdGhlIGZvbGxvd2luZyBmaWxlIGluIGZpbGUgbGlzdDogaG9zdF9uYW1lPSIke2UuaG9zdF9uYW1lfSIsIGZpbGVfcGF0aD0iJHtlLmZpbGVfcGF0aH0iYCk7cmV0dXJuIG4uc291cmNlQ29kZS5maWxlQ29udGVudHMuc3BsaWNlKG8sMSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbi5zb3VyY2VDb2RlLmZpbGVDb250ZW50c1tvXSkse2xvYWRTdGF0ZTp5RS5MT0FESU5HfSkpLG59KSksYmsoY1osKCh0LGUpPT57Y29uc3Qgbj1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NvdXJjZUNvZGU6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuc291cmNlQ29kZSkse2ZpbGVDb250ZW50czp0LnNvdXJjZUNvZGUuZmlsZUNvbnRlbnRzLnNsaWNlKCl9KX0pLG89aFoobi5zb3VyY2VDb2RlLnNvdXJjZUZpbGVMaXN0LGUpO2lmKCEobz49MCkpdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCB0aGUgZm9sbG93aW5nIGZpbGUgaW4gZmlsZSBsaXN0OiBob3N0X25hbWU9IiR7ZS5ob3N0X25hbWV9IiwgZmlsZV9wYXRoPSIke2UuZmlsZV9wYXRofSJgKTtyZXR1cm4gbi5zb3VyY2VDb2RlLmZpbGVDb250ZW50cy5zcGxpY2UobywxLHtsb2FkU3RhdGU6eUUuTE9BREVELGxpbmVzOmUubGluZXN9KSxufSkpLGJrKGRaLCgodCxlKT0+e2lmKG51bGw9PT10LmFjdGl2ZVJ1bklkKXJldHVybiB0O2NvbnN0IG49T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzdGFja0ZyYW1lczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5zdGFja0ZyYW1lcyksZS5zdGFja0ZyYW1lcyksc291cmNlQ29kZTpPYmplY3QuYXNzaWduKHt9LHQuc291cmNlQ29kZSl9KTtyZXR1cm4gbi5zb3VyY2VDb2RlLmZvY3VzTGluZVNwZWM9eVoobiksbn0pKSk7ZnVuY3Rpb24gdloodCxlLG4sbyl7Y29uc3QgaT1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2dyYXBoczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5ncmFwaHMpLHtmb2N1c2VkT3A6e2dyYXBoSWQ6ZSxvcE5hbWU6bn19KSxjb2RlTG9jYXRpb25Gb2N1c1R5cGU6ZlouR1JBUEhfT1BfQ1JFQVRJT04sc291cmNlQ29kZTpPYmplY3QuYXNzaWduKHt9LHQuc291cmNlQ29kZSl9KTtyZXR1cm4gaS5zb3VyY2VDb2RlLmZvY3VzTGluZVNwZWM9eVooaSksdm9pZCAwIT09byYmKGkuZ3JhcGhFeGVjdXRpb25zPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmdyYXBoRXhlY3V0aW9ucykse2ZvY3VzSW5kZXg6b30pKSxpfWZ1bmN0aW9uIHhaKHQsZSl7cmV0dXJuIF9aKHQsZSl9Y29uc3QgT1o9S3cocFopLFBaPVp3KE9aLCh0PT50LnJ1bnMpKSx3Wj1adyhPWiwodD0+dC5ydW5zTG9hZGVkKSksa1o9WncoT1osKHQ9PnQuYWN0aXZlUnVuSWQpKSxTWj1adyhPWiwodD0+dC5sYXN0RGF0YVBvbGxPbnNldFRpbWVNcy10Lmxhc3ROb25FbXB0eVBvbGxEYXRhVGltZU1zKSksRFo9WncoT1osKHQ9PnQuYWxlcnRzKSksRVo9WncoRFosKHQ9PnQuYWxlcnRzTG9hZGVkKSksUlo9WncoRFosKHQ9PnQubnVtQWxlcnRzKSksQVo9WncoRFosKHQ9PnQuZm9jdXNUeXBlKSksVFo9WncoRFosKHQ9Pm51bGw9PT10LmZvY3VzVHlwZT8wOnQuYWxlcnRzQnJlYWtkb3duW3QuZm9jdXNUeXBlXXx8MCkpLE5aPVp3KERaLCh0PT5udWxsPT09dC5mb2N1c1R5cGV8fHZvaWQgMD09PXQuYWxlcnRzW3QuZm9jdXNUeXBlXT9udWxsOnQuYWxlcnRzW3QuZm9jdXNUeXBlXSkpLHpaPVp3KERaLCh0PT50LmFsZXJ0c0JyZWFrZG93bikpLElaPVp3KE9aLCh0PT50LmV4ZWN1dGlvbnMpKSxIWj1adyhJWiwodD0+dC5udW1FeGVjdXRpb25zTG9hZGVkKSksRlo9WncoSVosKHQ9PnQuZXhlY3V0aW9uRGlnZXN0c0xvYWRlZCkpLExaPVp3KElaLCh0PT50LmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQubnVtRXhlY3V0aW9ucykpLEJaPVp3KElaLCh0PT50LnNjcm9sbEJlZ2luSW5kZXgpKSxWWj1adyhJWiwodD0+dC5wYWdlU2l6ZSkpLGpaPVp3KElaLCh0PT50LmRpc3BsYXlDb3VudCkpLFVaPVp3KElaLCh0PT57Y29uc3QgZT1bXTtmb3IobGV0IG49dC5zY3JvbGxCZWdpbkluZGV4O248dC5zY3JvbGxCZWdpbkluZGV4K3QuZGlzcGxheUNvdW50OysrbillLnB1c2gobiBpbiB0LmV4ZWN1dGlvbkRpZ2VzdHM/dC5leGVjdXRpb25EaWdlc3RzW25dOm51bGwpO3JldHVybiBlfSkpLEdaPVp3KE9aLCh0PT50LmdyYXBoRXhlY3V0aW9ucykpLFdaPVp3KEdaLCh0PT50Lm51bUV4ZWN1dGlvbnNMb2FkZWQpKSxZWj1adyhPWiwodD0+dC5ncmFwaEV4ZWN1dGlvbnMuZXhlY3V0aW9uRGlnZXN0c0xvYWRlZC5udW1FeGVjdXRpb25zKSkscVo9WncoR1osKHQ9PnQuc2Nyb2xsQmVnaW5JbmRleCkpLFpaPVp3KEdaLCh0PT50LmRpc3BsYXlDb3VudCkpLFhaPVp3KEdaLCh0PT50LnBhZ2VTaXplKSksS1o9WncoR1osKHQ9PnQuZ3JhcGhFeGVjdXRpb25EYXRhTG9hZGluZ1BhZ2VzKSksSlo9WncoR1osKHQ9PnQuZ3JhcGhFeGVjdXRpb25EYXRhUGFnZUxvYWRlZFNpemVzKSksUVo9WncoR1osKHQ9PnQuZ3JhcGhFeGVjdXRpb25EYXRhKSksJFo9WncoR1osKHQ9PnQuZm9jdXNJbmRleCkpLHRYPVp3KE9aLCh0PT50LmdyYXBocykpLGVYPVp3KHRYLCh0PT57Y29uc3R7Zm9jdXNlZE9wOmUsb3BzOm59PXQ7cmV0dXJuIG51bGw9PT1lfHx2b2lkIDA9PT1uW2UuZ3JhcGhJZF0/bnVsbDpuW2UuZ3JhcGhJZF0uZ2V0KGUub3BOYW1lKXx8bnVsbH0pKSxuWD1adyh0WCwodD0+e2NvbnN0e2ZvY3VzZWRPcDplLG9wczpufT10O2lmKG51bGwhPT1lJiZ2b2lkIDAhPT1uW2UuZ3JhcGhJZF0mJm5bZS5ncmFwaElkXS5oYXMoZS5vcE5hbWUpKXtjb25zdCB0PW5bZS5ncmFwaElkXSx7aW5wdXRzOm99PXQuZ2V0KGUub3BOYW1lKTtyZXR1cm4gby5tYXAoKGU9Pntjb25zdCBuPU9iamVjdC5hc3NpZ24oe30sZSk7cmV0dXJuIHQuaGFzKGUub3BfbmFtZSkmJihuLmRhdGE9dC5nZXQoZS5vcF9uYW1lKSksbn0pKX1yZXR1cm4gbnVsbH0pKSxvWD1adygkWixRWixuWCwoKHQsZSxuKT0+e2lmKG51bGw9PT10fHxudWxsPT09bilyZXR1cm4gbnVsbDtjb25zdCBvPW4ubWFwKCh0PT4hMSkpLGk9W107aWYoMD09PW4ubGVuZ3RoKXJldHVybiBpO2NvbnN0IGE9ZVt0XS5ncmFwaF9pZCxyPU1hdGgubWF4KDAsdC0yMDApO2ZvcihsZXQgcz10LTE7cz49cjstLXMpaWYodm9pZCAwIT09ZVtzXSlmb3IobGV0IHQ9MDt0PG4ubGVuZ3RoJiYob1t0XXx8ZVtzXS5ncmFwaF9pZCE9PWF8fGVbc10ub3BfbmFtZSE9PW5bdF0ub3BfbmFtZXx8ZVtzXS5vdXRwdXRfc2xvdCE9PW5bdF0ub3V0cHV0X3Nsb3R8fChpLnB1c2gocyksb1t0XT0hMCxpLmxlbmd0aCE9PW4ubGVuZ3RoKSk7Kyt0KTtyZXR1cm4gaX0pKSxpWD1adyh0WCwodD0+e2NvbnN0e2ZvY3VzZWRPcDplLG9wczpufT10O2lmKG51bGwhPT1lJiZ2b2lkIDAhPT1uW2UuZ3JhcGhJZF0mJm5bZS5ncmFwaElkXS5oYXMoZS5vcE5hbWUpKXtjb25zdCB0PW5bZS5ncmFwaElkXSx7Y29uc3VtZXJzOm99PXQuZ2V0KGUub3BOYW1lKTtyZXR1cm4gby5tYXAoKGU9PmUubWFwKChlPT57Y29uc3Qgbj1PYmplY3QuYXNzaWduKHt9LGUpO3JldHVybiB0LmhhcyhlLm9wX25hbWUpJiYobi5kYXRhPXQuZ2V0KGUub3BfbmFtZSkpLG59KSkpKX1yZXR1cm4gbnVsbH0pKSxhWD1adyhPWiwodD0+e2NvbnN0IGU9dC5leGVjdXRpb25zLnNjcm9sbEJlZ2luSW5kZXgsbj10LmV4ZWN1dGlvbnMuc2Nyb2xsQmVnaW5JbmRleCt0LmV4ZWN1dGlvbnMuZGlzcGxheUNvdW50LG89bmV3IEFycmF5KG4tZSkuZmlsbChudWxsKSxpPXQuYWxlcnRzLmZvY3VzVHlwZTtpZihudWxsPT09aSlyZXR1cm4gbztjb25zdCBhPXQuYWxlcnRzLmV4ZWN1dGlvbkluZGljZXNbaV07aWYodm9pZCAwPT09YSlyZXR1cm4gbztmb3IobGV0IGk9ZTtpPG47KytpKWEuaW5jbHVkZXMoaSkmJihvW2ktZV09dC5hbGVydHMuZm9jdXNUeXBlKTtyZXR1cm4gb30pKSxyWD1adyhPWiwodD0+dC5leGVjdXRpb25zKSksc1g9WncoclgsKHQ9PnQuZm9jdXNJbmRleCkpLGxYPVp3KHJYLCh0PT57aWYobnVsbD09PXQuZm9jdXNJbmRleClyZXR1cm4gbnVsbDtjb25zdHtmb2N1c0luZGV4OmUsc2Nyb2xsQmVnaW5JbmRleDpuLGRpc3BsYXlDb3VudDpvfT10O3JldHVybiBlPG58fGU+PW4rbz9udWxsOmUtbn0pKSxjWD1adyhyWCwodD0+dC5leGVjdXRpb25EYXRhKSksZFg9WncoT1osKHQ9PnQuZ3JhcGhzLmxvYWRpbmdPcHMpKSxwWD1adyhPWiwodD0+dC5zdGFja0ZyYW1lcykpLG1YPVp3KHJYLCh0PT57Y29uc3R7Zm9jdXNJbmRleDplLGV4ZWN1dGlvbkRhdGE6bn09dDtyZXR1cm4gbnVsbD09PWV8fHZvaWQgMD09PW5bZV0/bnVsbDpuW2VdfSkpLHVYPVp3KE9aLHNYLG1YLGVYLCgodCxlLG4sbyk9Pntjb25zdHtjb2RlTG9jYXRpb25Gb2N1c1R5cGU6aX09dDtyZXR1cm4gbnVsbD09PWk/bnVsbDppPT09ZlouRVhFQ1VUSU9OP251bGw9PT1lfHxudWxsPT09bj9udWxsOntjb2RlTG9jYXRpb25UeXBlOmZaLkVYRUNVVElPTixvcFR5cGU6bi5vcF90eXBlLGV4ZWN1dGlvbkluZGV4OmV9Om51bGw9PT1vP251bGw6e2NvZGVMb2NhdGlvblR5cGU6ZlouR1JBUEhfT1BfQ1JFQVRJT04sb3BUeXBlOm8ub3BfdHlwZSxvcE5hbWU6by5vcF9uYW1lfX0pKSxmWD1adyhPWixnWiksZ1g9WncoT1osKHQ9PnQuc291cmNlQ29kZSkpLGhYPVp3KGdYLCh0PT50LnNvdXJjZUZpbGVMaXN0TG9hZGVkKSk7WncoZ1gsKHQ9PnQuc291cmNlRmlsZUxpc3QpKTtjb25zdCBiWD1adyhnWCwodD0+e2NvbnN0e3NvdXJjZUZpbGVMaXN0OmUsZm9jdXNMaW5lU3BlYzpufT10O3JldHVybiBudWxsPT09bj8tMTpoWihlLG4pfSkpLHlYPVp3KGdYLGJYLCgodCxlKT0+LTE9PT1lP251bGw6dC5maWxlQ29udGVudHNbZV18fG51bGwpKSxfWD1adyhPWiwodD0+dC5zb3VyY2VDb2RlLmZvY3VzTGluZVNwZWMpKSxDWD1adyhPWiwodD0+dC5zdGlja1RvQm90dG9tbW9zdEZyYW1lSW5Gb2N1c2VkRmlsZSkpLE1YPWZ1bmN0aW9uKHQpe3JldHVyblt0XX07ZnVuY3Rpb24gdlgodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDcpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUoKXtjb25zdCBuPWhpKHQpLiRpbXBsaWNpdDtyZXR1cm4gWW0oKS5vblRvZ2dsZUZvY3VzVHlwZS5lbWl0KG4udHlwZSl9KSksUm0oMSwiZGl2Iiw4KSxrdSgyKSxBbSgpLFJtKDMsImRpdiIsOSksa3UoNCksQW0oKSxUbSg1LCJkaXYiKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdCxuPVltKCk7RG0oIm5nQ2xhc3MiLE1oKDQsTVgsdC50eXBlPT09bi5mb2N1c1R5cGU/ImZvY3VzIjoiIikpLHJjKDIpLFN1KHQuZGlzcGxheU5hbWUpLHJjKDIpLEV1KCIgIix0LmRpc3BsYXlTeW1ib2wsIjogIix0LmNvdW50LCIgIil9fWNsYXNzIHhYe2NvbnN0cnVjdG9yKCl7dGhpcy5udW1BbGVydHM9MCx0aGlzLmFsZXJ0c0JyZWFrZG93bj1bXSx0aGlzLmZvY3VzVHlwZT1udWxsLHRoaXMub25Ub2dnbGVGb2N1c1R5cGU9bmV3IExofX14WC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8eFgpfSx4WC7JtWNtcD10byh7dHlwZTp4WCxzZWxlY3RvcnM6W1siYWxlcnRzLWNvbXBvbmVudCJdXSxpbnB1dHM6e251bUFsZXJ0czoibnVtQWxlcnRzIixhbGVydHNCcmVha2Rvd246ImFsZXJ0c0JyZWFrZG93biIsZm9jdXNUeXBlOiJmb2N1c1R5cGUifSxvdXRwdXRzOntvblRvZ2dsZUZvY3VzVHlwZToib25Ub2dnbGVGb2N1c1R5cGUifSxkZWNsczoxMCx2YXJzOjUsY29uc3RzOltbMSwiYWxlcnRzLWNvbnRhaW5lciJdLFsxLCJkZWJ1Z2dpbmctdGl0bGUiXSxbMSwibnVtLWFsZXJ0cy1jb250YWluZXIiXSxbMSwibnVtLWFsZXJ0cy1sYWJlbCJdLFsxLCJudW0tYWxlcnRzLXZhbHVlIiwzLCJuZ0NsYXNzIl0sWzEsImFsZXJ0cy1icmVha2Rvd24tY29udGFpbmVyIl0sWyJjbGFzcyIsImFsZXJ0cy1icmVha2Rvd24tdHlwZSIsMywibmdDbGFzcyIsImNsaWNrIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbMSwiYWxlcnRzLWJyZWFrZG93bi10eXBlIiwzLCJuZ0NsYXNzIiwiY2xpY2siXSxbMSwiYWxlcnQtdHlwZS1uYW1lIl0sWzEsImFsZXJ0LXR5cGUtY291bnQiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImRpdiIsMCksUm0oMSwiZGl2IiwxKSxrdSgyLCJEZWJ1Z2dpbmciKSxBbSgpLFJtKDMsImRpdiIsMiksUm0oNCwiZGl2IiwzKSxrdSg1LCJBbGVydHMiKSxBbSgpLFJtKDYsImRpdiIsNCksa3UoNyksQW0oKSxBbSgpLFJtKDgsImRpdiIsNSksUXAoOSx2WCw2LDYsImRpdiIsNiksQW0oKSxBbSgpKSwyJmUmJihyYyg2KSxEbSgibmdDbGFzcyIsTWgoMyxNWCxuLm51bUFsZXJ0cz4wPyJub24temVybyI6IiIpKSxyYygxKSxEdSgiICIsbi5udW1BbGVydHMsIiAiKSxyYygyKSxEbSgibmdGb3JPZiIsbi5hbGVydHNCcmVha2Rvd24pKX0sZGlyZWN0aXZlczpbYU0sbE1dLHN0eWxlczpbIi5hbGVydHMtYnJlYWtkb3duLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBmb250LXNpemU6IDEzcHg7XG4gIHBhZGRpbmc6IDEwcHggMTBweCAxMHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5hbGVydHMtYnJlYWtkb3duLXR5cGVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgYm9yZGVyLXJhZGl1czogMCAxMHB4IDEwcHggMDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBwYWRkaW5nOiA2cHggMCA2cHggNTBweDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLmFsZXJ0cy1icmVha2Rvd24tdHlwZS5mb2N1c1tfbmdjb250ZW50LSVDT01QJV0ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZlZWUwO1xufVxuXG4uYWxlcnRzLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBmb250LWZhbWlseTogJ1JvYm90bycsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7XG59XG5cbi5hbGVydC10eXBlLWNvdW50W19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTUyNTkyO1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIGNvbG9yOiAjZmZmO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBhZGRpbmc6IDNweDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICByaWdodDogMjBweDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLmFsZXJ0LXR5cGUtbmFtZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBhZGRpbmc6IDNweDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLmRlYnVnZ2luZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBmb250LXNpemU6IDE4cHg7XG59XG5cbi5udW0tYWxlcnRzLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgcGFkZGluZzogMTBweCAxMHB4IDEwcHggMzBweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4ubnVtLWFsZXJ0cy1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGZvbnQtc2l6ZTogMTNweDtcbn1cblxuLm51bS1hbGVydHMtdmFsdWVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250LXNpemU6IDEzcHg7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxpbmUtaGVpZ2h0OiAyNHB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHJpZ2h0OiAyMHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHdpZHRoOiAyNHB4O1xufVxuXG4ubnVtLWFsZXJ0cy12YWx1ZS5ub24temVyb1tfbmdjb250ZW50LSVDT01QJV0ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZiNzgwO1xuICBmb250LXdlaWdodDogYm9sZDtcbn0iXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoeFgsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiYWxlcnRzLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vYWxlcnRzX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyIuL2FsZXJ0c19jb21wb25lbnQuY3NzIl19XX1dLG51bGwse251bUFsZXJ0czpbe3R5cGU6eHl9XSxhbGVydHNCcmVha2Rvd246W3t0eXBlOnh5fV0sZm9jdXNUeXBlOlt7dHlwZTp4eX1dLG9uVG9nZ2xlRm9jdXNUeXBlOlt7dHlwZTpPeX1dfSk7Y29uc3QgT1g9e1t1Wi5GVU5DVElPTl9SRUNPTVBJTEVfQUxFUlRdOntkaXNwbGF5TmFtZToiRnVuY3Rpb24gcmVjb21waWxlcyIsZGlzcGxheVN5bWJvbDoiQyJ9LFt1Wi5JTkZfTkFOX0FMRVJUXTp7ZGlzcGxheU5hbWU6Ik5hTi/iiJ4iLGRpc3BsYXlTeW1ib2w6IuKIniJ9LFt1Wi5URU5TT1JfU0hBUEVfQUxFUlRdOntkaXNwbGF5TmFtZToiVGVuc29yIHNoYXBlIixkaXNwbGF5U3ltYm9sOiLilqAifX07Y2xhc3MgUFh7Y29uc3RydWN0b3IodCl7dGhpcy5zdG9yZT10LHRoaXMubnVtQWxlcnRzJD10aGlzLnN0b3JlLnBpcGUoRncoUlopKSx0aGlzLmFsZXJ0c0JyZWFrZG93biQ9dGhpcy5zdG9yZS5waXBlKEZ3KFp3KHpaLCh0PT57Y29uc3QgZT1PYmplY3Qua2V5cyh0KTtyZXR1cm4gZS5zb3J0KCksZS5tYXAoKGU9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7dHlwZTplfSxPWFtlXSkse2NvdW50OnRbZV19KSkpfSkpKSksdGhpcy5mb2N1c1R5cGUkPXRoaXMuc3RvcmUucGlwZShGdyhBWikpfW9uVG9nZ2xlRm9jdXNUeXBlKHQpe3RoaXMuc3RvcmUuZGlzcGF0Y2goQnEoe2FsZXJ0VHlwZTp0fSkpfX1QWC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8UFgpKFNtKEl3KSl9LFBYLsm1Y21wPXRvKHt0eXBlOlBYLHNlbGVjdG9yczpbWyJ0Zi1kZWJ1Z2dlci12Mi1hbGVydHMiXV0sZGVjbHM6NCx2YXJzOjksY29uc3RzOltbMywibnVtQWxlcnRzIiwiYWxlcnRzQnJlYWtkb3duIiwiZm9jdXNUeXBlIiwib25Ub2dnbGVGb2N1c1R5cGUiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImFsZXJ0cy1jb21wb25lbnQiLDApLFZtKCJvblRvZ2dsZUZvY3VzVHlwZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25Ub2dnbGVGb2N1c1R5cGUoZSl9KSksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQW0oKSksMiZlJiZEbSgibnVtQWxlcnRzIixUaCgxLDMsbi5udW1BbGVydHMkKSkoImFsZXJ0c0JyZWFrZG93biIsVGgoMiw1LG4uYWxlcnRzQnJlYWtkb3duJCkpKCJmb2N1c1R5cGUiLFRoKDMsNyxuLmZvY3VzVHlwZSQpKX0sZGlyZWN0aXZlczpbeFhdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChQWCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJ0Zi1kZWJ1Z2dlci12Mi1hbGVydHMiLHRlbXBsYXRlOidcbiAgICA8YWxlcnRzLWNvbXBvbmVudFxuICAgICAgW251bUFsZXJ0c109Im51bUFsZXJ0cyQgfCBhc3luYyJcbiAgICAgIFthbGVydHNCcmVha2Rvd25dPSJhbGVydHNCcmVha2Rvd24kIHwgYXN5bmMiXG4gICAgICBbZm9jdXNUeXBlXT0iZm9jdXNUeXBlJCB8IGFzeW5jIlxuICAgICAgKG9uVG9nZ2xlRm9jdXNUeXBlKT0ib25Ub2dnbGVGb2N1c1R5cGUoJGV2ZW50KSJcbiAgICA+XG4gICAgPC9hbGVydHMtY29tcG9uZW50PlxuICAnLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y29uc3Qgd1g9WyJzbGlkZXJXcmFwcGVyIl0sa1g9Tnooe3Bhc3NpdmU6ITF9KSxTWD17cHJvdmlkZTpJVix1c2VFeGlzdGluZzpxZSgoKCk9PlJYKSksbXVsdGk6ITB9O2NsYXNzIERYe31jb25zdCBFWD0kSShKSShLSShjbGFzc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl9lbGVtZW50UmVmPXR9fSksImFjY2VudCIpKTtjbGFzcyBSWCBleHRlbmRzIEVYe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIscyl7c3VwZXIodCksdGhpcy5fZm9jdXNNb25pdG9yPWUsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWY9bix0aGlzLl9kaXI9byx0aGlzLl9uZ1pvbmU9YSx0aGlzLl9hbmltYXRpb25Nb2RlPXMsdGhpcy5faW52ZXJ0PSExLHRoaXMuX21heD0xMDAsdGhpcy5fbWluPTAsdGhpcy5fc3RlcD0xLHRoaXMuX3RodW1iTGFiZWw9ITEsdGhpcy5fdGlja0ludGVydmFsPTAsdGhpcy5fdmFsdWU9bnVsbCx0aGlzLl92ZXJ0aWNhbD0hMSx0aGlzLmNoYW5nZT1uZXcgTGgsdGhpcy5pbnB1dD1uZXcgTGgsdGhpcy52YWx1ZUNoYW5nZT1uZXcgTGgsdGhpcy5vblRvdWNoZWQ9KCk9Pnt9LHRoaXMuX3BlcmNlbnQ9MCx0aGlzLl9pc1NsaWRpbmc9bnVsbCx0aGlzLl9pc0FjdGl2ZT0hMSx0aGlzLl90aWNrSW50ZXJ2YWxQZXJjZW50PTAsdGhpcy5fc2xpZGVyRGltZW5zaW9ucz1udWxsLHRoaXMuX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm49KCk9Pnt9LHRoaXMuX2RpckNoYW5nZVN1YnNjcmlwdGlvbj1tLkVNUFRZLHRoaXMuX3BvaW50ZXJEb3duPXQ9Pnt0aGlzLmRpc2FibGVkfHx0aGlzLl9pc1NsaWRpbmd8fCFBWCh0KSYmMCE9PXQuYnV0dG9ufHx0aGlzLl9uZ1pvbmUucnVuKCgoKT0+e3RoaXMuX3RvdWNoSWQ9QVgodCk/KGZ1bmN0aW9uIGUodCxuKXtmb3IobGV0IGU9MDtlPHQudG91Y2hlcy5sZW5ndGg7ZSsrKXtjb25zdCBvPXQudG91Y2hlc1tlXS50YXJnZXQ7aWYobj09PW98fG4uY29udGFpbnMobykpcmV0dXJuIHQudG91Y2hlc1tlXS5pZGVudGlmaWVyfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKSh0LHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk6dm9pZCAwO2NvbnN0IG49VFgodCx0aGlzLl90b3VjaElkKTtpZihuKXtjb25zdCBlPXRoaXMudmFsdWU7dGhpcy5faXNTbGlkaW5nPSJwb2ludGVyIix0aGlzLl9sYXN0UG9pbnRlckV2ZW50PXQsdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2ZvY3VzSG9zdEVsZW1lbnQoKSx0aGlzLl9vbk1vdXNlZW50ZXIoKSx0aGlzLl9iaW5kR2xvYmFsRXZlbnRzKHQpLHRoaXMuX2ZvY3VzSG9zdEVsZW1lbnQoKSx0aGlzLl91cGRhdGVWYWx1ZUZyb21Qb3NpdGlvbihuKSx0aGlzLl92YWx1ZU9uU2xpZGVTdGFydD1lLGUhPXRoaXMudmFsdWUmJnRoaXMuX2VtaXRJbnB1dEV2ZW50KCl9fSkpfSx0aGlzLl9wb2ludGVyTW92ZT10PT57aWYoInBvaW50ZXIiPT09dGhpcy5faXNTbGlkaW5nKXtjb25zdCBlPVRYKHQsdGhpcy5fdG91Y2hJZCk7aWYoZSl7dC5wcmV2ZW50RGVmYXVsdCgpO2NvbnN0IG49dGhpcy52YWx1ZTt0aGlzLl9sYXN0UG9pbnRlckV2ZW50PXQsdGhpcy5fdXBkYXRlVmFsdWVGcm9tUG9zaXRpb24oZSksbiE9dGhpcy52YWx1ZSYmdGhpcy5fZW1pdElucHV0RXZlbnQoKX19fSx0aGlzLl9wb2ludGVyVXA9dD0+eyJwb2ludGVyIj09PXRoaXMuX2lzU2xpZGluZyYmKEFYKHQpJiYibnVtYmVyIj09dHlwZW9mIHRoaXMuX3RvdWNoSWQmJiFOWCh0LmNoYW5nZWRUb3VjaGVzLHRoaXMuX3RvdWNoSWQpfHwodC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX3JlbW92ZUdsb2JhbEV2ZW50cygpLHRoaXMuX2lzU2xpZGluZz1udWxsLHRoaXMuX3RvdWNoSWQ9dm9pZCAwLHRoaXMuX3ZhbHVlT25TbGlkZVN0YXJ0PT10aGlzLnZhbHVlfHx0aGlzLmRpc2FibGVkfHx0aGlzLl9lbWl0Q2hhbmdlRXZlbnQoKSx0aGlzLl92YWx1ZU9uU2xpZGVTdGFydD10aGlzLl9sYXN0UG9pbnRlckV2ZW50PW51bGwpKX0sdGhpcy5fd2luZG93Qmx1cj0oKT0+e3RoaXMuX2xhc3RQb2ludGVyRXZlbnQmJnRoaXMuX3BvaW50ZXJVcCh0aGlzLl9sYXN0UG9pbnRlckV2ZW50KX0sdGhpcy5fZG9jdW1lbnQ9cix0aGlzLnRhYkluZGV4PXBhcnNlSW50KGkpfHwwLGEucnVuT3V0c2lkZUFuZ3VsYXIoKCgpPT57Y29uc3QgZT10Lm5hdGl2ZUVsZW1lbnQ7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuX3BvaW50ZXJEb3duLGtYKSxlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuX3BvaW50ZXJEb3duLGtYKX0pKX1nZXQgaW52ZXJ0KCl7cmV0dXJuIHRoaXMuX2ludmVydH1zZXQgaW52ZXJ0KHQpe3RoaXMuX2ludmVydD15eih0KX1nZXQgbWF4KCl7cmV0dXJuIHRoaXMuX21heH1zZXQgbWF4KHQpe3RoaXMuX21heD1feih0LHRoaXMuX21heCksdGhpcy5fcGVyY2VudD10aGlzLl9jYWxjdWxhdGVQZXJjZW50YWdlKHRoaXMuX3ZhbHVlKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX1nZXQgbWluKCl7cmV0dXJuIHRoaXMuX21pbn1zZXQgbWluKHQpe3RoaXMuX21pbj1feih0LHRoaXMuX21pbiksdGhpcy5fcGVyY2VudD10aGlzLl9jYWxjdWxhdGVQZXJjZW50YWdlKHRoaXMuX3ZhbHVlKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX1nZXQgc3RlcCgpe3JldHVybiB0aGlzLl9zdGVwfXNldCBzdGVwKHQpe3RoaXMuX3N0ZXA9X3oodCx0aGlzLl9zdGVwKSx0aGlzLl9zdGVwJTEhPTAmJih0aGlzLl9yb3VuZFRvRGVjaW1hbD10aGlzLl9zdGVwLnRvU3RyaW5nKCkuc3BsaXQoIi4iKS5wb3AoKS5sZW5ndGgpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfWdldCB0aHVtYkxhYmVsKCl7cmV0dXJuIHRoaXMuX3RodW1iTGFiZWx9c2V0IHRodW1iTGFiZWwodCl7dGhpcy5fdGh1bWJMYWJlbD15eih0KX1nZXQgdGlja0ludGVydmFsKCl7cmV0dXJuIHRoaXMuX3RpY2tJbnRlcnZhbH1zZXQgdGlja0ludGVydmFsKHQpe3RoaXMuX3RpY2tJbnRlcnZhbD0iYXV0byI9PT10PyJhdXRvIjoibnVtYmVyIj09dHlwZW9mIHR8fCJzdHJpbmciPT10eXBlb2YgdD9feih0LHRoaXMuX3RpY2tJbnRlcnZhbCk6MH1nZXQgdmFsdWUoKXtyZXR1cm4gbnVsbD09PXRoaXMuX3ZhbHVlJiYodGhpcy52YWx1ZT10aGlzLl9taW4pLHRoaXMuX3ZhbHVlfXNldCB2YWx1ZSh0KXtpZih0IT09dGhpcy5fdmFsdWUpe2xldCBlPV96KHQsMCk7dGhpcy5fcm91bmRUb0RlY2ltYWwmJmUhPT10aGlzLm1pbiYmZSE9PXRoaXMubWF4JiYoZT1wYXJzZUZsb2F0KGUudG9GaXhlZCh0aGlzLl9yb3VuZFRvRGVjaW1hbCkpKSx0aGlzLl92YWx1ZT1lLHRoaXMuX3BlcmNlbnQ9dGhpcy5fY2FsY3VsYXRlUGVyY2VudGFnZSh0aGlzLl92YWx1ZSksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9fWdldCB2ZXJ0aWNhbCgpe3JldHVybiB0aGlzLl92ZXJ0aWNhbH1zZXQgdmVydGljYWwodCl7dGhpcy5fdmVydGljYWw9eXoodCl9Z2V0IGRpc3BsYXlWYWx1ZSgpe3JldHVybiB0aGlzLmRpc3BsYXlXaXRoP3RoaXMuZGlzcGxheVdpdGgodGhpcy52YWx1ZSk6dGhpcy5fcm91bmRUb0RlY2ltYWwmJnRoaXMudmFsdWUmJnRoaXMudmFsdWUlMSE9MD90aGlzLnZhbHVlLnRvRml4ZWQodGhpcy5fcm91bmRUb0RlY2ltYWwpOnRoaXMudmFsdWV8fDB9Zm9jdXModCl7dGhpcy5fZm9jdXNIb3N0RWxlbWVudCh0KX1ibHVyKCl7dGhpcy5fYmx1ckhvc3RFbGVtZW50KCl9Z2V0IHBlcmNlbnQoKXtyZXR1cm4gdGhpcy5fY2xhbXAodGhpcy5fcGVyY2VudCl9X3Nob3VsZEludmVydEF4aXMoKXtyZXR1cm4gdGhpcy52ZXJ0aWNhbD8hdGhpcy5pbnZlcnQ6dGhpcy5pbnZlcnR9X2lzTWluVmFsdWUoKXtyZXR1cm4gMD09PXRoaXMucGVyY2VudH1fZ2V0VGh1bWJHYXAoKXtyZXR1cm4gdGhpcy5kaXNhYmxlZD83OnRoaXMuX2lzTWluVmFsdWUoKSYmIXRoaXMudGh1bWJMYWJlbD90aGlzLl9pc0FjdGl2ZT8xMDo3OjB9X2dldFRyYWNrQmFja2dyb3VuZFN0eWxlcygpe2NvbnN0IHQ9dGhpcy52ZXJ0aWNhbD9gMSwgJHsxLXRoaXMucGVyY2VudH0sIDFgOjEtdGhpcy5wZXJjZW50KyIsIDEsIDEiO3JldHVybnt0cmFuc2Zvcm06YHRyYW5zbGF0ZSR7dGhpcy52ZXJ0aWNhbD8iWSI6IlgifSgke3RoaXMuX3Nob3VsZEludmVydE1vdXNlQ29vcmRzKCk/Ii0iOiIifSR7dGhpcy5fZ2V0VGh1bWJHYXAoKX1weCkgc2NhbGUzZCgke3R9KWB9fV9nZXRUcmFja0ZpbGxTdHlsZXMoKXtjb25zdCB0PXRoaXMucGVyY2VudCxlPXRoaXMudmVydGljYWw/YDEsICR7dH0sIDFgOmAke3R9LCAxLCAxYDtyZXR1cm57dHJhbnNmb3JtOmB0cmFuc2xhdGUke3RoaXMudmVydGljYWw/IlkiOiJYIn0oJHt0aGlzLl9zaG91bGRJbnZlcnRNb3VzZUNvb3JkcygpPyIiOiItIn0ke3RoaXMuX2dldFRodW1iR2FwKCl9cHgpIHNjYWxlM2QoJHtlfSlgLGRpc3BsYXk6MD09PXQ/Im5vbmUiOiIifX1fZ2V0VGlja3NDb250YWluZXJTdHlsZXMoKXtyZXR1cm57dHJhbnNmb3JtOmB0cmFuc2xhdGUke3RoaXMudmVydGljYWw/IlkiOiJYIn0oJHt0aGlzLnZlcnRpY2FsfHwicnRsIiE9dGhpcy5fZ2V0RGlyZWN0aW9uKCk/Ii0iOiIifSR7dGhpcy5fdGlja0ludGVydmFsUGVyY2VudC8yKjEwMH0lKWB9fV9nZXRUaWNrc1N0eWxlcygpe2xldCB0PTEwMCp0aGlzLl90aWNrSW50ZXJ2YWxQZXJjZW50LGU9e2JhY2tncm91bmRTaXplOnRoaXMudmVydGljYWw/YDJweCAke3R9JWA6YCR7dH0lIDJweGAsdHJhbnNmb3JtOmB0cmFuc2xhdGVaKDApIHRyYW5zbGF0ZSR7dGhpcy52ZXJ0aWNhbD8iWSI6IlgifSgke3RoaXMudmVydGljYWx8fCJydGwiIT10aGlzLl9nZXREaXJlY3Rpb24oKT8iIjoiLSJ9JHt0LzJ9JSkke3RoaXMudmVydGljYWx8fCJydGwiIT10aGlzLl9nZXREaXJlY3Rpb24oKT8iIjoiIHJvdGF0ZSgxODBkZWcpIn1gfTtpZih0aGlzLl9pc01pblZhbHVlKCkmJnRoaXMuX2dldFRodW1iR2FwKCkpe2NvbnN0IHQ9dGhpcy5fc2hvdWxkSW52ZXJ0QXhpcygpO2xldCBuO249dGhpcy52ZXJ0aWNhbD90PyJCb3R0b20iOiJUb3AiOnQ/IlJpZ2h0IjoiTGVmdCIsZVtgcGFkZGluZyR7bn1gXT1gJHt0aGlzLl9nZXRUaHVtYkdhcCgpfXB4YH1yZXR1cm4gZX1fZ2V0VGh1bWJDb250YWluZXJTdHlsZXMoKXtjb25zdCB0PXRoaXMuX3Nob3VsZEludmVydEF4aXMoKTtyZXR1cm57dHJhbnNmb3JtOmB0cmFuc2xhdGUke3RoaXMudmVydGljYWw/IlkiOiJYIn0oLSR7MTAwKigoInJ0bCIhPXRoaXMuX2dldERpcmVjdGlvbigpfHx0aGlzLnZlcnRpY2FsP3Q6IXQpP3RoaXMucGVyY2VudDoxLXRoaXMucGVyY2VudCl9JSlgfX1fc2hvdWxkSW52ZXJ0TW91c2VDb29yZHMoKXtjb25zdCB0PXRoaXMuX3Nob3VsZEludmVydEF4aXMoKTtyZXR1cm4icnRsIiE9dGhpcy5fZ2V0RGlyZWN0aW9uKCl8fHRoaXMudmVydGljYWw/dDohdH1fZ2V0RGlyZWN0aW9uKCl7cmV0dXJuIHRoaXMuX2RpciYmInJ0bCI9PXRoaXMuX2Rpci52YWx1ZT8icnRsIjoibHRyIn1uZ0FmdGVyVmlld0luaXQoKXt0aGlzLl9mb2N1c01vbml0b3IubW9uaXRvcih0aGlzLl9lbGVtZW50UmVmLCEwKS5zdWJzY3JpYmUoKHQ9Pnt0aGlzLl9pc0FjdGl2ZT0hIXQmJiJrZXlib2FyZCIhPT10LHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKX0pKSx0aGlzLl9kaXImJih0aGlzLl9kaXJDaGFuZ2VTdWJzY3JpcHRpb249dGhpcy5fZGlyLmNoYW5nZS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9KSkpfW5nT25EZXN0cm95KCl7Y29uc3QgdD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7dC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuX3BvaW50ZXJEb3duLGtYKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuX3BvaW50ZXJEb3duLGtYKSx0aGlzLl9sYXN0UG9pbnRlckV2ZW50PW51bGwsdGhpcy5fcmVtb3ZlR2xvYmFsRXZlbnRzKCksdGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKHRoaXMuX2VsZW1lbnRSZWYpLHRoaXMuX2RpckNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpfV9vbk1vdXNlZW50ZXIoKXt0aGlzLmRpc2FibGVkfHwodGhpcy5fc2xpZGVyRGltZW5zaW9ucz10aGlzLl9nZXRTbGlkZXJEaW1lbnNpb25zKCksdGhpcy5fdXBkYXRlVGlja0ludGVydmFsUGVyY2VudCgpKX1fb25Gb2N1cygpe3RoaXMuX3NsaWRlckRpbWVuc2lvbnM9dGhpcy5fZ2V0U2xpZGVyRGltZW5zaW9ucygpLHRoaXMuX3VwZGF0ZVRpY2tJbnRlcnZhbFBlcmNlbnQoKX1fb25CbHVyKCl7dGhpcy5vblRvdWNoZWQoKX1fb25LZXlkb3duKHQpe2lmKHRoaXMuZGlzYWJsZWR8fGJ6KHQpfHx0aGlzLl9pc1NsaWRpbmcmJiJrZXlib2FyZCIhPT10aGlzLl9pc1NsaWRpbmcpcmV0dXJuO2NvbnN0IGU9dGhpcy52YWx1ZTtzd2l0Y2godC5rZXlDb2RlKXtjYXNlIDMzOnRoaXMuX2luY3JlbWVudCgxMCk7YnJlYWs7Y2FzZSAzNDp0aGlzLl9pbmNyZW1lbnQoLTEwKTticmVhaztjYXNlIDM1OnRoaXMudmFsdWU9dGhpcy5tYXg7YnJlYWs7Y2FzZSAzNjp0aGlzLnZhbHVlPXRoaXMubWluO2JyZWFrO2Nhc2UgMzc6dGhpcy5faW5jcmVtZW50KCJydGwiPT10aGlzLl9nZXREaXJlY3Rpb24oKT8xOi0xKTticmVhaztjYXNlIGd6OnRoaXMuX2luY3JlbWVudCgxKTticmVhaztjYXNlIDM5OnRoaXMuX2luY3JlbWVudCgicnRsIj09dGhpcy5fZ2V0RGlyZWN0aW9uKCk/LTE6MSk7YnJlYWs7Y2FzZSBoejp0aGlzLl9pbmNyZW1lbnQoLTEpO2JyZWFrO2RlZmF1bHQ6cmV0dXJufWUhPXRoaXMudmFsdWUmJih0aGlzLl9lbWl0SW5wdXRFdmVudCgpLHRoaXMuX2VtaXRDaGFuZ2VFdmVudCgpKSx0aGlzLl9pc1NsaWRpbmc9ImtleWJvYXJkIix0LnByZXZlbnREZWZhdWx0KCl9X29uS2V5dXAoKXsia2V5Ym9hcmQiPT09dGhpcy5faXNTbGlkaW5nJiYodGhpcy5faXNTbGlkaW5nPW51bGwpfV9nZXRXaW5kb3coKXtyZXR1cm4gdGhpcy5fZG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvd31fYmluZEdsb2JhbEV2ZW50cyh0KXtjb25zdCBlPXRoaXMuX2RvY3VtZW50LG49QVgodCksbz1uPyJ0b3VjaGVuZCI6Im1vdXNldXAiO2UuYWRkRXZlbnRMaXN0ZW5lcihuPyJ0b3VjaG1vdmUiOiJtb3VzZW1vdmUiLHRoaXMuX3BvaW50ZXJNb3ZlLGtYKSxlLmFkZEV2ZW50TGlzdGVuZXIobyx0aGlzLl9wb2ludGVyVXAsa1gpLG4mJmUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hjYW5jZWwiLHRoaXMuX3BvaW50ZXJVcCxrWCk7Y29uc3QgaT10aGlzLl9nZXRXaW5kb3coKTt2b2lkIDAhPT1pJiZpJiZpLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLHRoaXMuX3dpbmRvd0JsdXIpfV9yZW1vdmVHbG9iYWxFdmVudHMoKXtjb25zdCB0PXRoaXMuX2RvY3VtZW50O3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0aGlzLl9wb2ludGVyTW92ZSxrWCksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0aGlzLl9wb2ludGVyVXAsa1gpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIix0aGlzLl9wb2ludGVyTW92ZSxrWCksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsdGhpcy5fcG9pbnRlclVwLGtYKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoY2FuY2VsIix0aGlzLl9wb2ludGVyVXAsa1gpO2NvbnN0IGU9dGhpcy5fZ2V0V2luZG93KCk7dm9pZCAwIT09ZSYmZSYmZS5yZW1vdmVFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl93aW5kb3dCbHVyKX1faW5jcmVtZW50KHQpe3RoaXMudmFsdWU9dGhpcy5fY2xhbXAoKHRoaXMudmFsdWV8fDApK3RoaXMuc3RlcCp0LHRoaXMubWluLHRoaXMubWF4KX1fdXBkYXRlVmFsdWVGcm9tUG9zaXRpb24odCl7aWYoIXRoaXMuX3NsaWRlckRpbWVuc2lvbnMpcmV0dXJuO2xldCBlPXRoaXMuX2NsYW1wKCgodGhpcy52ZXJ0aWNhbD90Lnk6dC54KS0odGhpcy52ZXJ0aWNhbD90aGlzLl9zbGlkZXJEaW1lbnNpb25zLnRvcDp0aGlzLl9zbGlkZXJEaW1lbnNpb25zLmxlZnQpKS8odGhpcy52ZXJ0aWNhbD90aGlzLl9zbGlkZXJEaW1lbnNpb25zLmhlaWdodDp0aGlzLl9zbGlkZXJEaW1lbnNpb25zLndpZHRoKSk7aWYodGhpcy5fc2hvdWxkSW52ZXJ0TW91c2VDb29yZHMoKSYmKGU9MS1lKSwwPT09ZSl0aGlzLnZhbHVlPXRoaXMubWluO2Vsc2UgaWYoMT09PWUpdGhpcy52YWx1ZT10aGlzLm1heDtlbHNle2NvbnN0IHQ9dGhpcy5fY2FsY3VsYXRlVmFsdWUoZSksbj1NYXRoLnJvdW5kKCh0LXRoaXMubWluKS90aGlzLnN0ZXApKnRoaXMuc3RlcCt0aGlzLm1pbjt0aGlzLnZhbHVlPXRoaXMuX2NsYW1wKG4sdGhpcy5taW4sdGhpcy5tYXgpfX1fZW1pdENoYW5nZUV2ZW50KCl7dGhpcy5fY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbih0aGlzLnZhbHVlKSx0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSksdGhpcy5jaGFuZ2UuZW1pdCh0aGlzLl9jcmVhdGVDaGFuZ2VFdmVudCgpKX1fZW1pdElucHV0RXZlbnQoKXt0aGlzLmlucHV0LmVtaXQodGhpcy5fY3JlYXRlQ2hhbmdlRXZlbnQoKSl9X3VwZGF0ZVRpY2tJbnRlcnZhbFBlcmNlbnQoKXtpZih0aGlzLnRpY2tJbnRlcnZhbCYmdGhpcy5fc2xpZGVyRGltZW5zaW9ucylpZigiYXV0byI9PXRoaXMudGlja0ludGVydmFsKXtsZXQgdD10aGlzLnZlcnRpY2FsP3RoaXMuX3NsaWRlckRpbWVuc2lvbnMuaGVpZ2h0OnRoaXMuX3NsaWRlckRpbWVuc2lvbnMud2lkdGgsZT1NYXRoLmNlaWwoMzAvKHQqdGhpcy5zdGVwLyh0aGlzLm1heC10aGlzLm1pbikpKTt0aGlzLl90aWNrSW50ZXJ2YWxQZXJjZW50PWUqdGhpcy5zdGVwL3R9ZWxzZSB0aGlzLl90aWNrSW50ZXJ2YWxQZXJjZW50PXRoaXMudGlja0ludGVydmFsKnRoaXMuc3RlcC8odGhpcy5tYXgtdGhpcy5taW4pfV9jcmVhdGVDaGFuZ2VFdmVudCh0PXRoaXMudmFsdWUpe2xldCBlPW5ldyBEWDtyZXR1cm4gZS5zb3VyY2U9dGhpcyxlLnZhbHVlPXQsZX1fY2FsY3VsYXRlUGVyY2VudGFnZSh0KXtyZXR1cm4oKHR8fDApLXRoaXMubWluKS8odGhpcy5tYXgtdGhpcy5taW4pfV9jYWxjdWxhdGVWYWx1ZSh0KXtyZXR1cm4gdGhpcy5taW4rdCoodGhpcy5tYXgtdGhpcy5taW4pfV9jbGFtcCh0LGU9MCxuPTEpe3JldHVybiBNYXRoLm1heChlLE1hdGgubWluKHQsbikpfV9nZXRTbGlkZXJEaW1lbnNpb25zKCl7cmV0dXJuIHRoaXMuX3NsaWRlcldyYXBwZXI/dGhpcy5fc2xpZGVyV3JhcHBlci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOm51bGx9X2ZvY3VzSG9zdEVsZW1lbnQodCl7dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKHQpfV9ibHVySG9zdEVsZW1lbnQoKXt0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYmx1cigpfXdyaXRlVmFsdWUodCl7dGhpcy52YWx1ZT10fXJlZ2lzdGVyT25DaGFuZ2UodCl7dGhpcy5fY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbj10fXJlZ2lzdGVyT25Ub3VjaGVkKHQpe3RoaXMub25Ub3VjaGVkPXR9c2V0RGlzYWJsZWRTdGF0ZSh0KXt0aGlzLmRpc2FibGVkPXR9fWZ1bmN0aW9uIEFYKHQpe3JldHVybiJ0Ij09PXQudHlwZVswXX1mdW5jdGlvbiBUWCh0LGUpe2xldCBuO3JldHVybiBuPUFYKHQpPyJudW1iZXIiPT10eXBlb2YgZT9OWCh0LnRvdWNoZXMsZSl8fE5YKHQuY2hhbmdlZFRvdWNoZXMsZSk6dC50b3VjaGVzWzBdfHx0LmNoYW5nZWRUb3VjaGVzWzBdOnQsbj97eDpuLmNsaWVudFgseTpuLmNsaWVudFl9OnZvaWQgMH1mdW5jdGlvbiBOWCh0LGUpe2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKWlmKHRbbl0uaWRlbnRpZmllcj09PWUpcmV0dXJuIHRbbl19UlguybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFJYKShTbShoZyksU20oU0kpLFNtKFVnKSxTbShISSw4KSxOYSgidGFiaW5kZXgiKSxTbShhXyksU20oWl8pLFNtKFZQLDgpKX0sUlguybVjbXA9dG8oe3R5cGU6Ulgsc2VsZWN0b3JzOltbIm1hdC1zbGlkZXIiXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJlFoKHdYLDUpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uX3NsaWRlcldyYXBwZXI9dC5maXJzdCl9fSxob3N0QXR0cnM6WyJyb2xlIiwic2xpZGVyIiwxLCJtYXQtc2xpZGVyIiwibWF0LWZvY3VzLWluZGljYXRvciJdLGhvc3RWYXJzOjI5LGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgiZm9jdXMiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX29uRm9jdXMoKX0pKSgiYmx1ciIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5fb25CbHVyKCl9KSkoImtleWRvd24iLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9vbktleWRvd24oZSl9KSkoImtleXVwIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9vbktleXVwKCl9KSkoIm1vdXNlZW50ZXIiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX29uTW91c2VlbnRlcigpfSkpKCJzZWxlY3RzdGFydCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIGUucHJldmVudERlZmF1bHQoKX0pKSwyJmUmJihUdSgidGFiSW5kZXgiLG4udGFiSW5kZXgpLGpwKCJhcmlhLWRpc2FibGVkIixuLmRpc2FibGVkKSgiYXJpYS12YWx1ZW1heCIsbi5tYXgpKCJhcmlhLXZhbHVlbWluIixuLm1pbikoImFyaWEtdmFsdWVub3ciLG4udmFsdWUpKCJhcmlhLXZhbHVldGV4dCIsbnVsbD09bi52YWx1ZVRleHQ/bi5kaXNwbGF5VmFsdWU6bi52YWx1ZVRleHQpKCJhcmlhLW9yaWVudGF0aW9uIixuLnZlcnRpY2FsPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwiKSxwdSgibWF0LXNsaWRlci1kaXNhYmxlZCIsbi5kaXNhYmxlZCkoIm1hdC1zbGlkZXItaGFzLXRpY2tzIixuLnRpY2tJbnRlcnZhbCkoIm1hdC1zbGlkZXItaG9yaXpvbnRhbCIsIW4udmVydGljYWwpKCJtYXQtc2xpZGVyLWF4aXMtaW52ZXJ0ZWQiLG4uX3Nob3VsZEludmVydEF4aXMoKSkoIm1hdC1zbGlkZXItaW52ZXJ0LW1vdXNlLWNvb3JkcyIsbi5fc2hvdWxkSW52ZXJ0TW91c2VDb29yZHMoKSkoIm1hdC1zbGlkZXItc2xpZGluZyIsbi5faXNTbGlkaW5nKSgibWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nIixuLnRodW1iTGFiZWwpKCJtYXQtc2xpZGVyLXZlcnRpY2FsIixuLnZlcnRpY2FsKSgibWF0LXNsaWRlci1taW4tdmFsdWUiLG4uX2lzTWluVmFsdWUoKSkoIm1hdC1zbGlkZXItaGlkZS1sYXN0LXRpY2siLG4uZGlzYWJsZWR8fG4uX2lzTWluVmFsdWUoKSYmbi5fZ2V0VGh1bWJHYXAoKSYmbi5fc2hvdWxkSW52ZXJ0QXhpcygpKSgiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLCJOb29wQW5pbWF0aW9ucyI9PT1uLl9hbmltYXRpb25Nb2RlKSl9LGlucHV0czp7ZGlzYWJsZWQ6ImRpc2FibGVkIixjb2xvcjoiY29sb3IiLHRhYkluZGV4OiJ0YWJJbmRleCIsaW52ZXJ0OiJpbnZlcnQiLG1heDoibWF4IixtaW46Im1pbiIsc3RlcDoic3RlcCIsdGh1bWJMYWJlbDoidGh1bWJMYWJlbCIsdGlja0ludGVydmFsOiJ0aWNrSW50ZXJ2YWwiLHZhbHVlOiJ2YWx1ZSIsdmVydGljYWw6InZlcnRpY2FsIixkaXNwbGF5V2l0aDoiZGlzcGxheVdpdGgiLHZhbHVlVGV4dDoidmFsdWVUZXh0In0sb3V0cHV0czp7Y2hhbmdlOiJjaGFuZ2UiLGlucHV0OiJpbnB1dCIsdmFsdWVDaGFuZ2U6InZhbHVlQ2hhbmdlIn0sZXhwb3J0QXM6WyJtYXRTbGlkZXIiXSxmZWF0dXJlczpbcGcoW1NYXSkseHBdLGRlY2xzOjEzLHZhcnM6Nixjb25zdHM6W1sxLCJtYXQtc2xpZGVyLXdyYXBwZXIiXSxbInNsaWRlcldyYXBwZXIiLCIiXSxbMSwibWF0LXNsaWRlci10cmFjay13cmFwcGVyIl0sWzEsIm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCIsMywibmdTdHlsZSJdLFsxLCJtYXQtc2xpZGVyLXRyYWNrLWZpbGwiLDMsIm5nU3R5bGUiXSxbMSwibWF0LXNsaWRlci10aWNrcy1jb250YWluZXIiLDMsIm5nU3R5bGUiXSxbMSwibWF0LXNsaWRlci10aWNrcyIsMywibmdTdHlsZSJdLFsxLCJtYXQtc2xpZGVyLXRodW1iLWNvbnRhaW5lciIsMywibmdTdHlsZSJdLFsxLCJtYXQtc2xpZGVyLWZvY3VzLXJpbmciXSxbMSwibWF0LXNsaWRlci10aHVtYiJdLFsxLCJtYXQtc2xpZGVyLXRodW1iLWxhYmVsIl0sWzEsIm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiZGl2IiwwLDEpLFJtKDIsImRpdiIsMiksVG0oMywiZGl2IiwzKSxUbSg0LCJkaXYiLDQpLEFtKCksUm0oNSwiZGl2Iiw1KSxUbSg2LCJkaXYiLDYpLEFtKCksUm0oNywiZGl2Iiw3KSxUbSg4LCJkaXYiLDgpLFRtKDksImRpdiIsOSksUm0oMTAsImRpdiIsMTApLFJtKDExLCJzcGFuIiwxMSksa3UoMTIpLEFtKCksQW0oKSxBbSgpLEFtKCkpLDImZSYmKHJjKDMpLERtKCJuZ1N0eWxlIixuLl9nZXRUcmFja0JhY2tncm91bmRTdHlsZXMoKSkscmMoMSksRG0oIm5nU3R5bGUiLG4uX2dldFRyYWNrRmlsbFN0eWxlcygpKSxyYygxKSxEbSgibmdTdHlsZSIsbi5fZ2V0VGlja3NDb250YWluZXJTdHlsZXMoKSkscmMoMSksRG0oIm5nU3R5bGUiLG4uX2dldFRpY2tzU3R5bGVzKCkpLHJjKDEpLERtKCJuZ1N0eWxlIixuLl9nZXRUaHVtYkNvbnRhaW5lclN0eWxlcygpKSxyYyg1KSxTdShuLmRpc3BsYXlWYWx1ZSkpfSxkaXJlY3RpdmVzOltDTV0sc3R5bGVzOlsnLm1hdC1zbGlkZXJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246cmVsYXRpdmU7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6OHB4O291dGxpbmU6bm9uZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Lm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKTphY3RpdmUsLm1hdC1zbGlkZXIubWF0LXNsaWRlci1zbGlkaW5nOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCl7Y3Vyc29yOi13ZWJraXQtZ3JhYmJpbmc7Y3Vyc29yOmdyYWJiaW5nfS5tYXQtc2xpZGVyLXdyYXBwZXJ7LXdlYmtpdC1wcmludC1jb2xvci1hZGp1c3Q6ZXhhY3Q7Y29sb3ItYWRqdXN0OmV4YWN0O3Bvc2l0aW9uOmFic29sdXRlfS5tYXQtc2xpZGVyLXRyYWNrLXdyYXBwZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO292ZXJmbG93OmhpZGRlbn0ubWF0LXNsaWRlci10cmFjay1maWxse3Bvc2l0aW9uOmFic29sdXRlO3RyYW5zZm9ybS1vcmlnaW46MCAwO3RyYW5zaXRpb246dHJhbnNmb3JtIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJhY2tncm91bmQtY29sb3IgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtwb3NpdGlvbjphYnNvbHV0ZTt0cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMTAwJTt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxiYWNrZ3JvdW5kLWNvbG9yIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtc2xpZGVyLXRpY2tzLWNvbnRhaW5lcntwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dG9wOjA7b3ZlcmZsb3c6aGlkZGVufS5tYXQtc2xpZGVyLXRpY2tzey13ZWJraXQtYmFja2dyb3VuZC1jbGlwOmNvbnRlbnQtYm94O2JhY2tncm91bmQtY2xpcDpjb250ZW50LWJveDtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQ7Ym94LXNpemluZzpib3JkZXItYm94O29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1zbGlkZXItdGh1bWItY29udGFpbmVye3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LXNsaWRlci1mb2N1cy1yaW5ne3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjMwcHg7aGVpZ2h0OjMwcHg7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNmb3JtOnNjYWxlKDApO29wYWNpdHk6MDt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxiYWNrZ3JvdW5kLWNvbG9yIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLG9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1zbGlkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1zbGlkZXItZm9jdXMtcmluZywubWF0LXNsaWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7dHJhbnNmb3JtOnNjYWxlKDEpO29wYWNpdHk6MX0ubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpOm5vdCgubWF0LXNsaWRlci1zbGlkaW5nKSAubWF0LXNsaWRlci10aHVtYi1sYWJlbCwubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpOm5vdCgubWF0LXNsaWRlci1zbGlkaW5nKSAubWF0LXNsaWRlci10aHVtYntjdXJzb3I6LXdlYmtpdC1ncmFiO2N1cnNvcjpncmFifS5tYXQtc2xpZGVyLXRodW1ie3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0Oi0xMHB4O2JvdHRvbTotMTBweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7d2lkdGg6MjBweDtoZWlnaHQ6MjBweDtib3JkZXI6M3B4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zZm9ybTpzY2FsZSgwLjcpO3RyYW5zaXRpb246dHJhbnNmb3JtIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJhY2tncm91bmQtY29sb3IgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYm9yZGVyLWNvbG9yIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2Rpc3BsYXk6bm9uZTthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoyOHB4O2hlaWdodDoyOHB4O2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zaXRpb246dHJhbnNmb3JtIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJvcmRlci1yYWRpdXMgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYmFja2dyb3VuZC1jb2xvciA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse291dGxpbmU6c29saWQgMXB4fS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7ei1pbmRleDoxO29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1zbGlkZXItc2xpZGluZyAubWF0LXNsaWRlci10cmFjay1maWxsLC5tYXQtc2xpZGVyLXNsaWRpbmcgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCwubWF0LXNsaWRlci1zbGlkaW5nIC5tYXQtc2xpZGVyLXRodW1iLWNvbnRhaW5lcnt0cmFuc2l0aW9uLWR1cmF0aW9uOjBtc30ubWF0LXNsaWRlci1oYXMtdGlja3MgLm1hdC1zbGlkZXItd3JhcHBlcjo6YWZ0ZXJ7Y29udGVudDoiIjtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItd2lkdGg6MDtib3JkZXItc3R5bGU6c29saWQ7b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LXNsaWRlci1oYXMtdGlja3MuY2RrLWZvY3VzZWQ6bm90KC5tYXQtc2xpZGVyLWhpZGUtbGFzdC10aWNrKSAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlciwubWF0LXNsaWRlci1oYXMtdGlja3M6aG92ZXI6bm90KC5tYXQtc2xpZGVyLWhpZGUtbGFzdC10aWNrKSAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlcntvcGFjaXR5OjF9Lm1hdC1zbGlkZXItaGFzLXRpY2tzLmNkay1mb2N1c2VkOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCkgLm1hdC1zbGlkZXItdGlja3MsLm1hdC1zbGlkZXItaGFzLXRpY2tzOmhvdmVyOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCkgLm1hdC1zbGlkZXItdGlja3N7b3BhY2l0eToxfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcgLm1hdC1zbGlkZXItZm9jdXMtcmluZ3tkaXNwbGF5Om5vbmV9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtkaXNwbGF5OmZsZXh9Lm1hdC1zbGlkZXItYXhpcy1pbnZlcnRlZCAubWF0LXNsaWRlci10cmFjay1maWxse3RyYW5zZm9ybS1vcmlnaW46MTAwJSAxMDAlfS5tYXQtc2xpZGVyLWF4aXMtaW52ZXJ0ZWQgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHt0cmFuc2Zvcm0tb3JpZ2luOjAgMH0ubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpLmNkay1mb2N1c2VkLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyAubWF0LXNsaWRlci10aHVtYnt0cmFuc2Zvcm06c2NhbGUoMCl9Lm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKS5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtib3JkZXItcmFkaXVzOjUwJSA1MCUgMH0ubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7b3BhY2l0eToxfS5tYXQtc2xpZGVyOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCkuY2RrLW1vdXNlLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKS5jZGstdG91Y2gtZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYiwubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWJ7Ym9yZGVyLXdpZHRoOjJweDt0cmFuc2Zvcm06c2NhbGUoMSl9Lm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItZm9jdXMtcmluZ3t0cmFuc2Zvcm06c2NhbGUoMCk7b3BhY2l0eTowfS5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRodW1ie2JvcmRlci13aWR0aDo0cHg7dHJhbnNmb3JtOnNjYWxlKDAuNSl9Lm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7ZGlzcGxheTpub25lfS5tYXQtc2xpZGVyLWhvcml6b250YWx7aGVpZ2h0OjQ4cHg7bWluLXdpZHRoOjEyOHB4fS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItd3JhcHBlcntoZWlnaHQ6MnB4O3RvcDoyM3B4O2xlZnQ6OHB4O3JpZ2h0OjhweH0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVye2hlaWdodDoycHg7Ym9yZGVyLWxlZnQtd2lkdGg6MnB4O3JpZ2h0OjA7dG9wOjB9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10cmFjay13cmFwcGVye2hlaWdodDoycHg7d2lkdGg6MTAwJX0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGx7aGVpZ2h0OjJweDt3aWR0aDoxMDAlO3RyYW5zZm9ybTpzY2FsZVgoMCl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2hlaWdodDoycHg7d2lkdGg6MTAwJTt0cmFuc2Zvcm06c2NhbGVYKDEpfS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdGlja3MtY29udGFpbmVye2hlaWdodDoycHg7d2lkdGg6MTAwJX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdGlja3MtY29udGFpbmVye2hlaWdodDowO291dGxpbmU6c29saWQgMnB4O3RvcDoxcHh9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aWNrc3toZWlnaHQ6MnB4O3dpZHRoOjEwMCV9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aHVtYi1jb250YWluZXJ7d2lkdGg6MTAwJTtoZWlnaHQ6MDt0b3A6NTAlfS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItZm9jdXMtcmluZ3t0b3A6LTE1cHg7cmlnaHQ6LTE1cHh9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtyaWdodDotMTRweDt0b3A6LTQwcHg7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMjZweCkgc2NhbGUoMC4wMSkgcm90YXRlKDQ1ZGVnKX0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfS5tYXQtc2xpZGVyLWhvcml6b250YWwuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNsaWRlci1ob3Jpem9udGFsLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zbGlkZXItaG9yaXpvbnRhbC5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e3RyYW5zZm9ybTpub25lfS5tYXQtc2xpZGVyLXZlcnRpY2Fse3dpZHRoOjQ4cHg7bWluLWhlaWdodDoxMjhweH0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci13cmFwcGVye3dpZHRoOjJweDt0b3A6OHB4O2JvdHRvbTo4cHg7bGVmdDoyM3B4fS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVye3dpZHRoOjJweDtib3JkZXItdG9wLXdpZHRoOjJweDtib3R0b206MDtsZWZ0OjB9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdHJhY2std3JhcHBlcntoZWlnaHQ6MTAwJTt3aWR0aDoycHh9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdHJhY2stZmlsbHtoZWlnaHQ6MTAwJTt3aWR0aDoycHg7dHJhbnNmb3JtOnNjYWxlWSgwKX0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2hlaWdodDoxMDAlO3dpZHRoOjJweDt0cmFuc2Zvcm06c2NhbGVZKDEpfS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRpY2tzLWNvbnRhaW5lcnt3aWR0aDoycHg7aGVpZ2h0OjEwMCV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aWNrcy1jb250YWluZXJ7d2lkdGg6MDtvdXRsaW5lOnNvbGlkIDJweDtsZWZ0OjFweH0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci1mb2N1cy1yaW5ne2JvdHRvbTotMTVweDtsZWZ0Oi0xNXB4fS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRpY2tze3dpZHRoOjJweDtoZWlnaHQ6MTAwJX0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aHVtYi1jb250YWluZXJ7aGVpZ2h0OjEwMCU7d2lkdGg6MDtsZWZ0OjUwJX0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aHVtYnstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVufS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JvdHRvbTotMTRweDtsZWZ0Oi00MHB4O3RyYW5zZm9ybTp0cmFuc2xhdGVYKDI2cHgpIHNjYWxlKDAuMDEpIHJvdGF0ZSgtNDVkZWcpfS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9Lm1hdC1zbGlkZXItdmVydGljYWwuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfVtkaXI9cnRsXSAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlcntsZWZ0OjA7cmlnaHQ6YXV0b31bZGlyPXJ0bF0gLm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10cmFjay1maWxse3RyYW5zZm9ybS1vcmlnaW46MTAwJSAxMDAlfVtkaXI9cnRsXSAubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmR7dHJhbnNmb3JtLW9yaWdpbjowIDB9W2Rpcj1ydGxdIC5tYXQtc2xpZGVyLWhvcml6b250YWwubWF0LXNsaWRlci1heGlzLWludmVydGVkIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGx7dHJhbnNmb3JtLW9yaWdpbjowIDB9W2Rpcj1ydGxdIC5tYXQtc2xpZGVyLWhvcml6b250YWwubWF0LXNsaWRlci1heGlzLWludmVydGVkIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmR7dHJhbnNmb3JtLW9yaWdpbjoxMDAlIDEwMCV9Lm1hdC1zbGlkZXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXNsaWRlci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kLC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRpY2tzLC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRodW1iLWNvbnRhaW5lciwubWF0LXNsaWRlci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlci1mb2N1cy1yaW5nLC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHQsLm1hdC1zbGlkZXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZXItaGFzLXRpY2tzIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVye3RyYW5zaXRpb246bm9uZX1cbiddLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLFJYLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOlNJfSx7dHlwZTpVZ30se3R5cGU6SEksZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmphLGFyZ3M6WyJ0YWJpbmRleCJdfV19LHt0eXBlOmFffSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19XSxSWC5wcm9wRGVjb3JhdG9ycz17aW52ZXJ0Olt7dHlwZTp4eX1dLG1heDpbe3R5cGU6eHl9XSxtaW46W3t0eXBlOnh5fV0sc3RlcDpbe3R5cGU6eHl9XSx0aHVtYkxhYmVsOlt7dHlwZTp4eX1dLHRpY2tJbnRlcnZhbDpbe3R5cGU6eHl9XSx2YWx1ZTpbe3R5cGU6eHl9XSxkaXNwbGF5V2l0aDpbe3R5cGU6eHl9XSx2YWx1ZVRleHQ6W3t0eXBlOnh5fV0sdmVydGljYWw6W3t0eXBlOnh5fV0sY2hhbmdlOlt7dHlwZTpPeX1dLGlucHV0Olt7dHlwZTpPeX1dLHZhbHVlQ2hhbmdlOlt7dHlwZTpPeX1dLF9zbGlkZXJXcmFwcGVyOlt7dHlwZTpaYSxhcmdzOlsic2xpZGVyV3JhcHBlciJdfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUlgsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWF0LXNsaWRlciIsZXhwb3J0QXM6Im1hdFNsaWRlciIscHJvdmlkZXJzOltTWF0saG9zdDp7Iihmb2N1cykiOiJfb25Gb2N1cygpIiwiKGJsdXIpIjoiX29uQmx1cigpIiwiKGtleWRvd24pIjoiX29uS2V5ZG93bigkZXZlbnQpIiwiKGtleXVwKSI6Il9vbktleXVwKCkiLCIobW91c2VlbnRlcikiOiJfb25Nb3VzZWVudGVyKCkiLCIoc2VsZWN0c3RhcnQpIjoiJGV2ZW50LnByZXZlbnREZWZhdWx0KCkiLGNsYXNzOiJtYXQtc2xpZGVyIG1hdC1mb2N1cy1pbmRpY2F0b3IiLHJvbGU6InNsaWRlciIsIlt0YWJJbmRleF0iOiJ0YWJJbmRleCIsIlthdHRyLmFyaWEtZGlzYWJsZWRdIjoiZGlzYWJsZWQiLCJbYXR0ci5hcmlhLXZhbHVlbWF4XSI6Im1heCIsIlthdHRyLmFyaWEtdmFsdWVtaW5dIjoibWluIiwiW2F0dHIuYXJpYS12YWx1ZW5vd10iOiJ2YWx1ZSIsIlthdHRyLmFyaWEtdmFsdWV0ZXh0XSI6InZhbHVlVGV4dCA9PSBudWxsID8gZGlzcGxheVZhbHVlIDogdmFsdWVUZXh0IiwiW2F0dHIuYXJpYS1vcmllbnRhdGlvbl0iOid2ZXJ0aWNhbCA/ICJ2ZXJ0aWNhbCIgOiAiaG9yaXpvbnRhbCInLCJbY2xhc3MubWF0LXNsaWRlci1kaXNhYmxlZF0iOiJkaXNhYmxlZCIsIltjbGFzcy5tYXQtc2xpZGVyLWhhcy10aWNrc10iOiJ0aWNrSW50ZXJ2YWwiLCJbY2xhc3MubWF0LXNsaWRlci1ob3Jpem9udGFsXSI6IiF2ZXJ0aWNhbCIsIltjbGFzcy5tYXQtc2xpZGVyLWF4aXMtaW52ZXJ0ZWRdIjoiX3Nob3VsZEludmVydEF4aXMoKSIsIltjbGFzcy5tYXQtc2xpZGVyLWludmVydC1tb3VzZS1jb29yZHNdIjoiX3Nob3VsZEludmVydE1vdXNlQ29vcmRzKCkiLCJbY2xhc3MubWF0LXNsaWRlci1zbGlkaW5nXSI6Il9pc1NsaWRpbmciLCJbY2xhc3MubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nXSI6InRodW1iTGFiZWwiLCJbY2xhc3MubWF0LXNsaWRlci12ZXJ0aWNhbF0iOiJ2ZXJ0aWNhbCIsIltjbGFzcy5tYXQtc2xpZGVyLW1pbi12YWx1ZV0iOiJfaXNNaW5WYWx1ZSgpIiwiW2NsYXNzLm1hdC1zbGlkZXItaGlkZS1sYXN0LXRpY2tdIjoiZGlzYWJsZWQgfHwgX2lzTWluVmFsdWUoKSAmJiBfZ2V0VGh1bWJHYXAoKSAmJiBfc2hvdWxkSW52ZXJ0QXhpcygpIiwiW2NsYXNzLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlXSI6J19hbmltYXRpb25Nb2RlID09PSAiTm9vcEFuaW1hdGlvbnMiJ30sdGVtcGxhdGU6JzxkaXYgY2xhc3M9Im1hdC1zbGlkZXItd3JhcHBlciIgI3NsaWRlcldyYXBwZXI+XG4gIDxkaXYgY2xhc3M9Im1hdC1zbGlkZXItdHJhY2std3JhcHBlciI+XG4gICAgPGRpdiBjbGFzcz0ibWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kIiBbbmdTdHlsZV09Il9nZXRUcmFja0JhY2tncm91bmRTdHlsZXMoKSI+PC9kaXY+XG4gICAgPGRpdiBjbGFzcz0ibWF0LXNsaWRlci10cmFjay1maWxsIiBbbmdTdHlsZV09Il9nZXRUcmFja0ZpbGxTdHlsZXMoKSI+PC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPSJtYXQtc2xpZGVyLXRpY2tzLWNvbnRhaW5lciIgW25nU3R5bGVdPSJfZ2V0VGlja3NDb250YWluZXJTdHlsZXMoKSI+XG4gICAgPGRpdiBjbGFzcz0ibWF0LXNsaWRlci10aWNrcyIgW25nU3R5bGVdPSJfZ2V0VGlja3NTdHlsZXMoKSI+PC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPSJtYXQtc2xpZGVyLXRodW1iLWNvbnRhaW5lciIgW25nU3R5bGVdPSJfZ2V0VGh1bWJDb250YWluZXJTdHlsZXMoKSI+XG4gICAgPGRpdiBjbGFzcz0ibWF0LXNsaWRlci1mb2N1cy1yaW5nIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPSJtYXQtc2xpZGVyLXRodW1iIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPSJtYXQtc2xpZGVyLXRodW1iLWxhYmVsIj5cbiAgICAgIDxzcGFuIGNsYXNzPSJtYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHQiPnt7ZGlzcGxheVZhbHVlfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4nLGlucHV0czpbImRpc2FibGVkIiwiY29sb3IiLCJ0YWJJbmRleCJdLGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLHN0eWxlczpbJy5tYXQtc2xpZGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjhweDtvdXRsaW5lOm5vbmU7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtc2xpZGVyOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCk6YWN0aXZlLC5tYXQtc2xpZGVyLm1hdC1zbGlkZXItc2xpZGluZzpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpe2N1cnNvcjotd2Via2l0LWdyYWJiaW5nO2N1cnNvcjpncmFiYmluZ30ubWF0LXNsaWRlci13cmFwcGVyey13ZWJraXQtcHJpbnQtY29sb3ItYWRqdXN0OmV4YWN0O2NvbG9yLWFkanVzdDpleGFjdDtwb3NpdGlvbjphYnNvbHV0ZX0ubWF0LXNsaWRlci10cmFjay13cmFwcGVye3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtvdmVyZmxvdzpoaWRkZW59Lm1hdC1zbGlkZXItdHJhY2stZmlsbHtwb3NpdGlvbjphYnNvbHV0ZTt0cmFuc2Zvcm0tb3JpZ2luOjAgMDt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxiYWNrZ3JvdW5kLWNvbG9yIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmR7cG9zaXRpb246YWJzb2x1dGU7dHJhbnNmb3JtLW9yaWdpbjoxMDAlIDEwMCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYmFja2dyb3VuZC1jb2xvciA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LXNsaWRlci10aWNrcy1jb250YWluZXJ7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3RvcDowO292ZXJmbG93OmhpZGRlbn0ubWF0LXNsaWRlci10aWNrc3std2Via2l0LWJhY2tncm91bmQtY2xpcDpjb250ZW50LWJveDtiYWNrZ3JvdW5kLWNsaXA6Y29udGVudC1ib3g7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0O2JveC1zaXppbmc6Ym9yZGVyLWJveDtvcGFjaXR5OjA7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtc2xpZGVyLXRodW1iLWNvbnRhaW5lcntwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjE7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1zbGlkZXItZm9jdXMtcmluZ3twb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDozMHB4O2hlaWdodDozMHB4O2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zZm9ybTpzY2FsZSgwKTtvcGFjaXR5OjA7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYmFja2dyb3VuZC1jb2xvciA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtc2xpZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmcsLm1hdC1zbGlkZXIuY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LXNsaWRlci1mb2N1cy1yaW5ne3RyYW5zZm9ybTpzY2FsZSgxKTtvcGFjaXR5OjF9Lm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKTpub3QoLm1hdC1zbGlkZXItc2xpZGluZykgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwsLm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKTpub3QoLm1hdC1zbGlkZXItc2xpZGluZykgLm1hdC1zbGlkZXItdGh1bWJ7Y3Vyc29yOi13ZWJraXQtZ3JhYjtjdXJzb3I6Z3JhYn0ubWF0LXNsaWRlci10aHVtYntwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDotMTBweDtib3R0b206LTEwcHg7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Ym9yZGVyOjNweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjUwJTt0cmFuc2Zvcm06c2NhbGUoMC43KTt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxiYWNrZ3JvdW5kLWNvbG9yIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJvcmRlci1jb2xvciA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LXNsaWRlci10aHVtYi1sYWJlbHtkaXNwbGF5Om5vbmU7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtib3JkZXItcmFkaXVzOjUwJTt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxib3JkZXItcmFkaXVzIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJhY2tncm91bmQtY29sb3IgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtvdXRsaW5lOnNvbGlkIDFweH0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e3otaW5kZXg6MTtvcGFjaXR5OjA7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtc2xpZGVyLXNsaWRpbmcgLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXNsaWRlci1zbGlkaW5nIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmQsLm1hdC1zbGlkZXItc2xpZGluZyAubWF0LXNsaWRlci10aHVtYi1jb250YWluZXJ7dHJhbnNpdGlvbi1kdXJhdGlvbjowbXN9Lm1hdC1zbGlkZXItaGFzLXRpY2tzIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVye2NvbnRlbnQ6IiI7cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXdpZHRoOjA7Ym9yZGVyLXN0eWxlOnNvbGlkO29wYWNpdHk6MDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1zbGlkZXItaGFzLXRpY2tzLmNkay1mb2N1c2VkOm5vdCgubWF0LXNsaWRlci1oaWRlLWxhc3QtdGljaykgLm1hdC1zbGlkZXItd3JhcHBlcjo6YWZ0ZXIsLm1hdC1zbGlkZXItaGFzLXRpY2tzOmhvdmVyOm5vdCgubWF0LXNsaWRlci1oaWRlLWxhc3QtdGljaykgLm1hdC1zbGlkZXItd3JhcHBlcjo6YWZ0ZXJ7b3BhY2l0eToxfS5tYXQtc2xpZGVyLWhhcy10aWNrcy5jZGstZm9jdXNlZDpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpIC5tYXQtc2xpZGVyLXRpY2tzLC5tYXQtc2xpZGVyLWhhcy10aWNrczpob3Zlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpIC5tYXQtc2xpZGVyLXRpY2tze29wYWNpdHk6MX0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7ZGlzcGxheTpub25lfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7ZGlzcGxheTpmbGV4fS5tYXQtc2xpZGVyLWF4aXMtaW52ZXJ0ZWQgLm1hdC1zbGlkZXItdHJhY2stZmlsbHt0cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMTAwJX0ubWF0LXNsaWRlci1heGlzLWludmVydGVkIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmR7dHJhbnNmb3JtLW9yaWdpbjowIDB9Lm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKS5jZGstZm9jdXNlZC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcgLm1hdC1zbGlkZXItdGh1bWJ7dHJhbnNmb3JtOnNjYWxlKDApfS5tYXQtc2xpZGVyOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCkuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7Ym9yZGVyLXJhZGl1czo1MCUgNTAlIDB9Lm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKS5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e29wYWNpdHk6MX0ubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpLmNkay1tb3VzZS1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCkuY2RrLXRvdWNoLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKS5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1ie2JvcmRlci13aWR0aDoycHg7dHJhbnNmb3JtOnNjYWxlKDEpfS5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7dHJhbnNmb3JtOnNjYWxlKDApO29wYWNpdHk6MH0ubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYntib3JkZXItd2lkdGg6NHB4O3RyYW5zZm9ybTpzY2FsZSgwLjUpfS5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2Rpc3BsYXk6bm9uZX0ubWF0LXNsaWRlci1ob3Jpem9udGFse2hlaWdodDo0OHB4O21pbi13aWR0aDoxMjhweH0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXdyYXBwZXJ7aGVpZ2h0OjJweDt0b3A6MjNweDtsZWZ0OjhweDtyaWdodDo4cHh9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlcntoZWlnaHQ6MnB4O2JvcmRlci1sZWZ0LXdpZHRoOjJweDtyaWdodDowO3RvcDowfS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdHJhY2std3JhcHBlcntoZWlnaHQ6MnB4O3dpZHRoOjEwMCV9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10cmFjay1maWxse2hlaWdodDoycHg7d2lkdGg6MTAwJTt0cmFuc2Zvcm06c2NhbGVYKDApfS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtoZWlnaHQ6MnB4O3dpZHRoOjEwMCU7dHJhbnNmb3JtOnNjYWxlWCgxKX0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRpY2tzLWNvbnRhaW5lcntoZWlnaHQ6MnB4O3dpZHRoOjEwMCV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRpY2tzLWNvbnRhaW5lcntoZWlnaHQ6MDtvdXRsaW5lOnNvbGlkIDJweDt0b3A6MXB4fS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdGlja3N7aGVpZ2h0OjJweDt3aWR0aDoxMDAlfS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdGh1bWItY29udGFpbmVye3dpZHRoOjEwMCU7aGVpZ2h0OjA7dG9wOjUwJX0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7dG9wOi0xNXB4O3JpZ2h0Oi0xNXB4fS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7cmlnaHQ6LTE0cHg7dG9wOi00MHB4O3RyYW5zZm9ybTp0cmFuc2xhdGVZKDI2cHgpIHNjYWxlKDAuMDEpIHJvdGF0ZSg0NWRlZyl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX0ubWF0LXNsaWRlci1ob3Jpem9udGFsLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zbGlkZXItaG9yaXpvbnRhbC5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYi1sYWJlbCwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc2xpZGVyLWhvcml6b250YWwuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHt0cmFuc2Zvcm06bm9uZX0ubWF0LXNsaWRlci12ZXJ0aWNhbHt3aWR0aDo0OHB4O21pbi1oZWlnaHQ6MTI4cHh9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItd3JhcHBlcnt3aWR0aDoycHg7dG9wOjhweDtib3R0b206OHB4O2xlZnQ6MjNweH0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlcnt3aWR0aDoycHg7Ym9yZGVyLXRvcC13aWR0aDoycHg7Ym90dG9tOjA7bGVmdDowfS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRyYWNrLXdyYXBwZXJ7aGVpZ2h0OjEwMCU7d2lkdGg6MnB4fS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGx7aGVpZ2h0OjEwMCU7d2lkdGg6MnB4O3RyYW5zZm9ybTpzY2FsZVkoMCl9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtoZWlnaHQ6MTAwJTt3aWR0aDoycHg7dHJhbnNmb3JtOnNjYWxlWSgxKX0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aWNrcy1jb250YWluZXJ7d2lkdGg6MnB4O2hlaWdodDoxMDAlfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdGlja3MtY29udGFpbmVye3dpZHRoOjA7b3V0bGluZTpzb2xpZCAycHg7bGVmdDoxcHh9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItZm9jdXMtcmluZ3tib3R0b206LTE1cHg7bGVmdDotMTVweH0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aWNrc3t3aWR0aDoycHg7aGVpZ2h0OjEwMCV9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdGh1bWItY29udGFpbmVye2hlaWdodDoxMDAlO3dpZHRoOjA7bGVmdDo1MCV9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdGh1bWJ7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjtiYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbn0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtib3R0b206LTE0cHg7bGVmdDotNDBweDt0cmFuc2Zvcm06dHJhbnNsYXRlWCgyNnB4KSBzY2FsZSgwLjAxKSByb3RhdGUoLTQ1ZGVnKX0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfS5tYXQtc2xpZGVyLXZlcnRpY2FsLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKX1bZGlyPXJ0bF0gLm1hdC1zbGlkZXItd3JhcHBlcjo6YWZ0ZXJ7bGVmdDowO3JpZ2h0OmF1dG99W2Rpcj1ydGxdIC5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdHJhY2stZmlsbHt0cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMTAwJX1bZGlyPXJ0bF0gLm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke3RyYW5zZm9ybS1vcmlnaW46MCAwfVtkaXI9cnRsXSAubWF0LXNsaWRlci1ob3Jpem9udGFsLm1hdC1zbGlkZXItYXhpcy1pbnZlcnRlZCAubWF0LXNsaWRlci10cmFjay1maWxse3RyYW5zZm9ybS1vcmlnaW46MCAwfVtkaXI9cnRsXSAubWF0LXNsaWRlci1ob3Jpem9udGFsLm1hdC1zbGlkZXItYXhpcy1pbnZlcnRlZCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke3RyYW5zZm9ybS1vcmlnaW46MTAwJSAxMDAlfS5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsLm1hdC1zbGlkZXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCwubWF0LXNsaWRlci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlci10aWNrcywubWF0LXNsaWRlci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlci10aHVtYi1jb250YWluZXIsLm1hdC1zbGlkZXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZXItZm9jdXMtcmluZywubWF0LXNsaWRlci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlci10aHVtYiwubWF0LXNsaWRlci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlci10aHVtYi1sYWJlbCwubWF0LXNsaWRlci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0LC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLWhhcy10aWNrcyAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlcnt0cmFuc2l0aW9uOm5vbmV9XG4nXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTpTSX0se3R5cGU6VWd9LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpqYSxhcmdzOlsidGFiaW5kZXgiXX1dfSx7dHlwZTphX30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV19KSx7Y2hhbmdlOlt7dHlwZTpPeX1dLGlucHV0Olt7dHlwZTpPeX1dLHZhbHVlQ2hhbmdlOlt7dHlwZTpPeX1dLGludmVydDpbe3R5cGU6eHl9XSxtYXg6W3t0eXBlOnh5fV0sbWluOlt7dHlwZTp4eX1dLHN0ZXA6W3t0eXBlOnh5fV0sdGh1bWJMYWJlbDpbe3R5cGU6eHl9XSx0aWNrSW50ZXJ2YWw6W3t0eXBlOnh5fV0sdmFsdWU6W3t0eXBlOnh5fV0sdmVydGljYWw6W3t0eXBlOnh5fV0sZGlzcGxheVdpdGg6W3t0eXBlOnh5fV0sdmFsdWVUZXh0Olt7dHlwZTp4eX1dLF9zbGlkZXJXcmFwcGVyOlt7dHlwZTpaYSxhcmdzOlsic2xpZGVyV3JhcHBlciJdfV19KTtjbGFzcyB6WHt9elguybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHpYKX0selguybVtb2Q9YW8oe3R5cGU6elh9KSx6WC7JtWluaj12bih7aW1wb3J0czpbW1dNLFhJXSxYSV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHpYLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbV00sWEldLGV4cG9ydHM6W1JYLFhJXSxkZWNsYXJhdGlvbnM6W1JYXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKHpYLHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bUlhdfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1dNLFhJXX0sZXhwb3J0czpmdW5jdGlvbigpe3JldHVybltSWCxYSV19fSk7Y29uc3QgSVg9ezE5OiJmbG9hdDE2IiwxOiJmbG9hdDMyIiwyOiJmbG9hdDY0IiwzOiJpbnQzMiIsNDoidWludDgiLDE3OiJ1aW50MTYiLDIyOiJ1aW50MzIiLDIzOiJ1aW50NjQiLDU6ImludDE2Iiw2OiJpbnQ4Iiw3OiJzdHJpbmciLDg6ImNvbXBsZXg2NCIsMTg6ImNvbXBsZXgxMjgiLDk6ImludDY0IiwxMDoiYm9vbCIsMTE6InFpbnQ4IiwxMjoicXVpbnQ4IiwxNToicWludDE2IiwxNjoicXVpbnQxNiIsMTM6InFpbnQzMiIsMTQ6ImJmbG9hdDE2IiwyMDoicmVzb3VyY2UiLDIxOiJ2YXJpYW50IiwxMTk6ImZsb2F0MTZfcmVmIiwxMDE6ImZsb2F0MzJfcmVmIiwxMDI6ImZsb2F0NjRfcmVmIiwxMDM6ImludDMyX3JlZiIsMTIyOiJ1aW50MzJfcmVmIiwxMDQ6InVpbnQ4X3JlZiIsMTE3OiJ1aW50MTZfcmVmIiwxMDU6ImludDE2X3JlZiIsMTA2OiJpbnQ4X3JlZiIsMTA3OiJzdHJpbmdfcmVmIiwxMDg6ImNvbXBsZXg2NF9yZWYiLDExODoiY29tcGxleDEyOF9yZWYiLDEwOToiaW50NjRfcmVmIiwxMjM6InVpbnQ2NF9yZWYiLDExMDoiYm9vbF9yZWYiLDExMToicWludDhfcmVmIiwxMTI6InF1aW50OF9yZWYiLDExNToicWludDE2X3JlZiIsMTE2OiJxdWludDE2X3JlZiIsMTEzOiJxaW50MzJfcmVmIiwxMTQ6ImJmbG9hdDE2X3JlZiIsMTIwOiJyZXNvdXJjZV9yZWYiLDEyMToidmFyaWFudF9yZWYifTtmdW5jdGlvbiBIWCh0KXtjb25zdHt0ZW5zb3JEZWJ1Z01vZGU6ZSxhcnJheTpufT10O3N3aXRjaChlKXtjYXNlIG1aLk5PX1RFTlNPUjppZihudWxsIT09bil0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWRseSByZWNlaXZlZCBub24tbnVsbCBkZWJ1Zy10ZW5zb3ItdmFsdWUgYXJyYXkgdW5kZXIgTk9fVEVOU09SIG1vZGUiKTtyZXR1cm57fTtjYXNlIG1aLkNVUlRfSEVBTFRIOmlmKG51bGw9PT1ufHwyIT09bi5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBVbmRlciBDVVJUX0hFQUxUSCBtb2RlLCBleHBlY3RlZCBkZWJ1Zy10ZW5zb3ItdmFsdWUgYXJyYXkgdG8gaGF2ZSBsZW5ndGggMiwgYnV0IGdvdCAke0pTT04uc3RyaW5naWZ5KG4pfWApO3JldHVybntoYXNJbmZPck5hTjpCb29sZWFuKG5bMV0pfTtjYXNlIG1aLkNPTkNJU0VfSEVBTFRIOntpZihudWxsPT09bnx8NSE9PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgVW5kZXIgQ09OQ0lTRV9IRUFMVEggbW9kZSwgZXhwZWN0ZWQgZGVidWctdGVuc29yLXZhbHVlIGFycmF5IHRvIGhhdmUgbGVuZ3RoIDUsIGJ1dCBnb3QgJHtKU09OLnN0cmluZ2lmeShuKX1gKTtjb25zdCB0PXtzaXplOm5bMV19O3JldHVybiBuWzJdPjAmJih0Lm51bU5lZ2F0aXZlSW5mcz1uWzJdKSxuWzNdPjAmJih0Lm51bVBvc2l0aXZlSW5mcz1uWzNdKSxuWzRdPjAmJih0Lm51bU5hTnM9bls0XSksdH1jYXNlIG1aLlNIQVBFOntpZihudWxsPT09bnx8MTAhPT1uLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYFVuZGVyIFNIQVBFIG1vZGUsIGV4cGVjdGVkIGRlYnVnLXRlbnNvci12YWx1ZSBhcnJheSB0byBoYXZlIGxlbmd0aCAxMCwgYnV0IGdvdCAke0pTT04uc3RyaW5naWZ5KG4pfWApO2NvbnN0IHQ9blsyXTtsZXQgZT1uLnNsaWNlKDQsTWF0aC5taW4oNCt0LG4ubGVuZ3RoKSk7cmV0dXJuIGUubGVuZ3RoPHQmJihlPW5ldyBBcnJheSh0LWUubGVuZ3RoKS5jb25jYXQoZSkpLHtkdHlwZTpJWFtuWzFdXSxyYW5rOnQsc2l6ZTpuWzNdLHNoYXBlOmV9fWNhc2UgbVouRlVMTF9IRUFMVEg6e2lmKG51bGw9PT1ufHwxMSE9PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgVW5kZXIgRlVMTF9IRUFMVEggbW9kZSwgZXhwZWN0ZWQgZGVidWctdGVuc29yLXZhbHVlIGFycmF5IHRvIGhhdmUgbGVuZ3RoIDExLCBidXQgZ290ICR7SlNPTi5zdHJpbmdpZnkobil9YCk7Y29uc3QgdD17ZHR5cGU6SVhbblsyXV0scmFuazpuWzNdLHNpemU6bls0XX07cmV0dXJuIG5bNV0+MCYmKHQubnVtTmVnYXRpdmVJbmZzPW5bNV0pLG5bNl0+MCYmKHQubnVtUG9zaXRpdmVJbmZzPW5bNl0pLG5bN10+MCYmKHQubnVtTmFOcz1uWzddKSxuWzhdPjAmJih0Lm51bU5lZ2F0aXZlRmluaXRlcz1uWzhdKSxuWzldPjAmJih0Lm51bVplcm9zPW5bOV0pLG5bMTBdPjAmJih0Lm51bVBvc2l0aXZlRmluaXRlcz1uWzEwXSksdH1jYXNlIG1aLkZVTExfVEVOU09SOmlmKG51bGwhPT1uKXRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZGx5IHJlY2VpdmVkIG5vbi1udWxsIGRlYnVnLXRlbnNvci12YWx1ZSBhcnJheSB1bmRlciBGVUxMX1RFTlNPUiBtb2RlIik7cmV0dXJue307ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCB0ZW5zb3JEZWJ1Z01vZGU6ICR7ZX1gKX19Y29uc3QgRlg9Iltfbmdob3N0LSVDT01QJV0ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlM2U1ZTg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2MwYzBjMDtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubycsIG1vbm9zcGFjZTtcbiAgICBoZWlnaHQ6IDE0cHg7XG4gICAgbGluZS1oZWlnaHQ6IDE0cHg7XG4gICAgbWFyZ2luOiAwIDJweDtcbiAgICBwYWRkaW5nOiAxcHggM3B4O1xuICAgIHdpZHRoOiBtYXgtY29udGVudDtcbiAgfSI7ZnVuY3Rpb24gTFgodCxlKXsxJnQmJlRtKDAsImRpdiIsNCl9ZnVuY3Rpb24gQlgodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDcpLFJtKDEsInNwYW4iLDgpLGt1KDIsIk5hTiIpLEFtKCksUm0oMywic3BhbiIsOSksa3UoNCksQW0oKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMik7cmMoNCksRHUoIsOXIix0Lm51bU5hTnMsIiIpfX1mdW5jdGlvbiBWWCh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsNyksUm0oMSwic3BhbiIsOCksa3UoMiwiLeKIniIpLEFtKCksUm0oMywic3BhbiIsOSksa3UoNCksQW0oKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMik7cmMoNCksRHUoIsOXIix0Lm51bU5lZ2F0aXZlSW5mcywiIil9fWZ1bmN0aW9uIGpYKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2Iiw3KSxSbSgxLCJzcGFuIiw4KSxrdSgyLCIr4oieIiksQW0oKSxSbSgzLCJzcGFuIiw5KSxrdSg0KSxBbSgpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgyKTtyYyg0KSxEdSgiw5ciLHQubnVtUG9zaXRpdmVJbmZzLCIiKX19ZnVuY3Rpb24gVVgodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDcpLFJtKDEsInNwYW4iLDEwKSxrdSgyLCItIiksQW0oKSxSbSgzLCJzcGFuIiw5KSxrdSg0KSxBbSgpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgyKTtyYyg0KSxEdSgiw5ciLHQubnVtTmVnYXRpdmVGaW5pdGVzLCIiKX19ZnVuY3Rpb24gR1godCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDcpLFJtKDEsInNwYW4iLDEwKSxrdSgyLCIwIiksQW0oKSxSbSgzLCJzcGFuIiw5KSxrdSg0KSxBbSgpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgyKTtyYyg0KSxEdSgiw5ciLHQubnVtWmVyb3MsIiIpfX1mdW5jdGlvbiBXWCh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsNyksUm0oMSwic3BhbiIsMTApLGt1KDIsIisiKSxBbSgpLFJtKDMsInNwYW4iLDkpLGt1KDQpLEFtKCksQW0oKSksMiZ0KXtjb25zdCB0PVltKDIpO3JjKDQpLER1KCLDlyIsdC5udW1Qb3NpdGl2ZUZpbml0ZXMsIiIpfX1mdW5jdGlvbiBZWCh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsNSksUXAoMSxCWCw1LDEsImRpdiIsNiksUXAoMixWWCw1LDEsImRpdiIsNiksUXAoMyxqWCw1LDEsImRpdiIsNiksUXAoNCxVWCw1LDEsImRpdiIsNiksUXAoNSxHWCw1LDEsImRpdiIsNiksUXAoNixXWCw1LDEsImRpdiIsNiksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoMSksRG0oIm5nSWYiLHZvaWQgMCE9PXQubnVtTmFOcyYmdC5udW1OYU5zPjApLHJjKDEpLERtKCJuZ0lmIix2b2lkIDAhPT10Lm51bU5lZ2F0aXZlSW5mcyYmdC5udW1OZWdhdGl2ZUluZnM+MCkscmMoMSksRG0oIm5nSWYiLHZvaWQgMCE9PXQubnVtUG9zaXRpdmVJbmZzJiZ0Lm51bVBvc2l0aXZlSW5mcz4wKSxyYygxKSxEbSgibmdJZiIsdm9pZCAwIT09dC5udW1OZWdhdGl2ZUZpbml0ZXMmJnQubnVtTmVnYXRpdmVGaW5pdGVzPjApLHJjKDEpLERtKCJuZ0lmIix2b2lkIDAhPT10Lm51bVplcm9zJiZ0Lm51bVplcm9zPjApLHJjKDEpLERtKCJuZ0lmIix2b2lkIDAhPT10Lm51bVBvc2l0aXZlRmluaXRlcyYmdC5udW1Qb3NpdGl2ZUZpbml0ZXM+MCl9fWNvbnN0IHFYPWZ1bmN0aW9uKHQpe3JldHVyblsiY29udGFpbmVyIix0XX07ZnVuY3Rpb24gWlgodCxlKXsxJnQmJlRtKDAsImRlYnVnLXRlbnNvci1kdHlwZSIsNSksMiZ0JiZEbSgiZHR5cGUiLFltKCkuZGVidWdUZW5zb3JWYWx1ZS5kdHlwZSl9ZnVuY3Rpb24gWFgodCxlKXsxJnQmJlRtKDAsImRlYnVnLXRlbnNvci1yYW5rIiw2KSwyJnQmJkRtKCJyYW5rIixZbSgpLmRlYnVnVGVuc29yVmFsdWUucmFuayl9ZnVuY3Rpb24gS1godCxlKXsxJnQmJlRtKDAsImRlYnVnLXRlbnNvci1zaGFwZSIsNyksMiZ0JiZEbSgic2hhcGUiLFltKCkuZGVidWdUZW5zb3JWYWx1ZS5zaGFwZSl9ZnVuY3Rpb24gSlgodCxlKXsxJnQmJlRtKDAsImRlYnVnLXRlbnNvci1oYXMtaW5mLW9yLW5hbiIsOCksMiZ0JiZEbSgiaGFzSW5mT3JOYU4iLFltKCkuZGVidWdUZW5zb3JWYWx1ZS5oYXNJbmZPck5hTil9ZnVuY3Rpb24gUVgodCxlKXtpZigxJnQmJlRtKDAsImRlYnVnLXRlbnNvci1udW1lcmljLWJyZWFrZG93biIsOSksMiZ0KXtjb25zdCB0PVltKCk7S20oInNpemUiLHQuZGVidWdUZW5zb3JWYWx1ZS5zaXplKSxEbSgibnVtTmVnYXRpdmVJbmZzIix0LmRlYnVnVGVuc29yVmFsdWUubnVtTmVnYXRpdmVJbmZzKSgibnVtUG9zaXRpdmVJbmZzIix0LmRlYnVnVGVuc29yVmFsdWUubnVtUG9zaXRpdmVJbmZzKSgibnVtTmFOcyIsdC5kZWJ1Z1RlbnNvclZhbHVlLm51bU5hTnMpKCJudW1OZWdhdGl2ZUZpbml0ZXMiLHQuZGVidWdUZW5zb3JWYWx1ZS5udW1OZWdhdGl2ZUZpbml0ZXMpKCJudW1aZXJvcyIsdC5kZWJ1Z1RlbnNvclZhbHVlLm51bVplcm9zKSgibnVtUG9zaXRpdmVGaW5pdGVzIix0LmRlYnVnVGVuc29yVmFsdWUubnVtUG9zaXRpdmVGaW5pdGVzKX19Y29uc3QgJFg9IlxuICA6aG9zdCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2UzZTVlODtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjYzBjMGMwO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJywgbW9ub3NwYWNlO1xuICAgIGhlaWdodDogMTRweDtcbiAgICBsaW5lLWhlaWdodDogMTRweDtcbiAgICBtYXJnaW46IDAgMnB4O1xuICAgIHBhZGRpbmc6IDFweCAzcHg7XG4gICAgd2lkdGg6IG1heC1jb250ZW50O1xuICB9XG4iO2NsYXNzIHRLe310Sy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8dEspfSx0Sy7JtWNtcD10byh7dHlwZTp0SyxzZWxlY3RvcnM6W1siZGVidWctdGVuc29yLWR0eXBlIl1dLGlucHV0czp7ZHR5cGU6ImR0eXBlIn0sZGVjbHM6MSx2YXJzOjEsdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYma3UoMCksMiZlJiZEdSgiICIsbi5kdHlwZSwiICIpfSxzdHlsZXM6W0ZYXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodEssW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiZGVidWctdGVuc29yLWR0eXBlIix0ZW1wbGF0ZToiIHt7IGR0eXBlIH19ICIsc3R5bGVzOlskWF19XX1dLG51bGwse2R0eXBlOlt7dHlwZTp4eX1dfSk7Y2xhc3MgZUt7fWVLLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxlSyl9LGVLLsm1Y21wPXRvKHt0eXBlOmVLLHNlbGVjdG9yczpbWyJkZWJ1Zy10ZW5zb3ItcmFuayJdXSxpbnB1dHM6e3Jhbms6InJhbmsifSxkZWNsczoxLHZhcnM6MSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiZrdSgwKSwyJmUmJkR1KCIgIixuLnJhbmssIkQgIil9LHN0eWxlczpbRlhdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChlSyxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJkZWJ1Zy10ZW5zb3ItcmFuayIsdGVtcGxhdGU6IiB7eyByYW5rIH19RCAiLHN0eWxlczpbJFhdfV19XSxudWxsLHtyYW5rOlt7dHlwZTp4eX1dfSk7Y2xhc3Mgbkt7Z2V0IHNoYXBlU3RyaW5nKCl7cmV0dXJuIlsiK3RoaXMuc2hhcGUubWFwKCh0PT52b2lkIDA9PT10PyI/IjpTdHJpbmcodCkpKS5qb2luKCIsIikrIl0ifX1uSy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bkspfSxuSy7JtWNtcD10byh7dHlwZTpuSyxzZWxlY3RvcnM6W1siZGVidWctdGVuc29yLXNoYXBlIl1dLGlucHV0czp7c2hhcGU6InNoYXBlIn0sZGVjbHM6MSx2YXJzOjEsdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYma3UoMCksMiZlJiZEdSgiIHNoYXBlOiIsbi5zaGFwZVN0cmluZywiICIpfSxzdHlsZXM6W0ZYXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobkssW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiZGVidWctdGVuc29yLXNoYXBlIix0ZW1wbGF0ZToiIHNoYXBlOnt7IHNoYXBlU3RyaW5nIH19ICIsc3R5bGVzOlskWF19XX1dLG51bGwse3NoYXBlOlt7dHlwZTp4eX1dfSk7Y2xhc3Mgb0t7Z2V0IGJyZWFrZG93bkV4aXN0cygpe3JldHVybiB2b2lkIDAhPT10aGlzLm51bU5hTnN8fHZvaWQgMCE9PXRoaXMubnVtTmVnYXRpdmVJbmZzfHx2b2lkIDAhPT10aGlzLm51bVBvc2l0aXZlSW5mc3x8dm9pZCAwIT09dGhpcy5udW1OZWdhdGl2ZUZpbml0ZXN8fHZvaWQgMCE9PXRoaXMubnVtWmVyb3N8fHZvaWQgMCE9PXRoaXMubnVtUG9zaXRpdmVGaW5pdGVzfX1vSy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8b0spfSxvSy7JtWNtcD10byh7dHlwZTpvSyxzZWxlY3RvcnM6W1siZGVidWctdGVuc29yLW51bWVyaWMtYnJlYWtkb3duIl1dLGlucHV0czp7c2l6ZToic2l6ZSIsbnVtTmFOczoibnVtTmFOcyIsbnVtTmVnYXRpdmVJbmZzOiJudW1OZWdhdGl2ZUluZnMiLG51bVBvc2l0aXZlSW5mczoibnVtUG9zaXRpdmVJbmZzIixudW1OZWdhdGl2ZUZpbml0ZXM6Im51bU5lZ2F0aXZlRmluaXRlcyIsbnVtWmVyb3M6Im51bVplcm9zIixudW1Qb3NpdGl2ZUZpbml0ZXM6Im51bVBvc2l0aXZlRmluaXRlcyJ9LGRlY2xzOjcsdmFyczozLGNvbnN0czpbWzEsInNpemUiXSxbMSwic2l6ZS12YWx1ZSJdLFsiY2xhc3MiLCJicmVhayIsNCwibmdJZiJdLFsiY2xhc3MiLCJicmVha2Rvd24iLDQsIm5nSWYiXSxbMSwiYnJlYWsiXSxbMSwiYnJlYWtkb3duIl0sWyJjbGFzcyIsImNhdGVnb3J5Iiw0LCJuZ0lmIl0sWzEsImNhdGVnb3J5Il0sWzEsImNhdGVnb3J5LXRhZyIsImluZmluaXRlIl0sWzEsImNhdGVnb3J5LWNvdW50Il0sWzEsImNhdGVnb3J5LXRhZyIsImZpbml0ZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiZGl2IiwwKSxSbSgxLCJzcGFuIiksa3UoMiwic2l6ZToiKSxBbSgpLFJtKDMsInNwYW4iLDEpLGt1KDQpLEFtKCksQW0oKSxRcCg1LExYLDEsMCwiZGl2IiwyKSxRcCg2LFlYLDcsNiwiZGl2IiwzKSksMiZlJiYocmMoNCksU3Uobi5zaXplKSxyYygxKSxEbSgibmdJZiIsbi5icmVha2Rvd25FeGlzdHMpLHJjKDEpLERtKCJuZ0lmIixuLmJyZWFrZG93bkV4aXN0cykpfSxkaXJlY3RpdmVzOltkTV0sc3R5bGVzOlsiW19uZ2hvc3QtJUNPTVAlXSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlM2U1ZTg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjMGMwYzA7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubycsIG1vbm9zcGFjZTtcbiAgICAgICAgZm9udC1zaXplOiAxMHB4O1xuICAgICAgICBtYXJnaW46IDAgMnB4O1xuICAgICAgICBwYWRkaW5nOiAxcHg7XG4gICAgICB9XG4gICAgICAuYnJlYWtbX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgZmxleC1iYXNpczogMTAwJTtcbiAgICAgICAgd2lkdGg6IDA7XG4gICAgICB9XG4gICAgICAuc2l6ZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgaGVpZ2h0OiAxMXB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMTFweDtcbiAgICAgICAgbWFyZ2luOiAwIDNweDtcbiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICAgIH1cbiAgICAgIC5icmVha2Rvd25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xMik7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGhlaWdodDogMTFweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDExcHg7XG4gICAgICAgIHBhZGRpbmc6IDJweDtcbiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICAgIH1cbiAgICAgIC5jYXRlZ29yeVtfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAycHg7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiA0cHg7XG4gICAgICAgIG1hcmdpbi10b3A6IDJweDtcbiAgICAgICAgaGVpZ3RoOiAxMDAlO1xuICAgICAgICB3aWR0aDogbWF4LWNvbnRlbnQ7XG4gICAgICB9XG4gICAgICAuY2F0ZWdvcnktdGFnW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICAgICAgcGFkZGluZzogMCAycHg7XG4gICAgICB9XG4gICAgICAuZmluaXRlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNhYWE7XG4gICAgICAgIGNvbG9yOiAjZmVmZWZlO1xuICAgICAgfVxuICAgICAgLmluZmluaXRlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlNTI1OTI7XG4gICAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgfSJdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChvSyxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJkZWJ1Zy10ZW5zb3ItbnVtZXJpYy1icmVha2Rvd24iLHRlbXBsYXRlOidcbiAgICA8ZGl2IGNsYXNzPSJzaXplIj5cbiAgICAgIDxzcGFuPnNpemU6PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9InNpemUtdmFsdWUiPnt7IHNpemUgfX08L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj0iYnJlYWtkb3duRXhpc3RzIiBjbGFzcz0iYnJlYWsiPjwvZGl2PlxuICAgIDxkaXYgKm5nSWY9ImJyZWFrZG93bkV4aXN0cyIgY2xhc3M9ImJyZWFrZG93biI+XG4gICAgICA8ZGl2ICpuZ0lmPSJudW1OYU5zICE9PSB1bmRlZmluZWQgJiYgbnVtTmFOcyA+IDAiIGNsYXNzPSJjYXRlZ29yeSI+XG4gICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS10YWcgaW5maW5pdGUiPk5hTjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LWNvdW50Ij7Dl3t7IG51bU5hTnMgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9Im51bU5lZ2F0aXZlSW5mcyAhPT0gdW5kZWZpbmVkICYmIG51bU5lZ2F0aXZlSW5mcyA+IDAiXG4gICAgICAgIGNsYXNzPSJjYXRlZ29yeSJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LXRhZyBpbmZpbml0ZSI+LeKInjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LWNvdW50Ij7Dl3t7IG51bU5lZ2F0aXZlSW5mcyB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj0ibnVtUG9zaXRpdmVJbmZzICE9PSB1bmRlZmluZWQgJiYgbnVtUG9zaXRpdmVJbmZzID4gMCJcbiAgICAgICAgY2xhc3M9ImNhdGVnb3J5IlxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzcz0iY2F0ZWdvcnktdGFnIGluZmluaXRlIj4r4oiePC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz0iY2F0ZWdvcnktY291bnQiPsOXe3sgbnVtUG9zaXRpdmVJbmZzIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPSJudW1OZWdhdGl2ZUZpbml0ZXMgIT09IHVuZGVmaW5lZCAmJiBudW1OZWdhdGl2ZUZpbml0ZXMgPiAwIlxuICAgICAgICBjbGFzcz0iY2F0ZWdvcnkiXG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS10YWcgZmluaXRlIj4tPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz0iY2F0ZWdvcnktY291bnQiPsOXe3sgbnVtTmVnYXRpdmVGaW5pdGVzIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPSJudW1aZXJvcyAhPT0gdW5kZWZpbmVkICYmIG51bVplcm9zID4gMCIgY2xhc3M9ImNhdGVnb3J5Ij5cbiAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LXRhZyBmaW5pdGUiPjA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS1jb3VudCI+w5d7eyBudW1aZXJvcyB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj0ibnVtUG9zaXRpdmVGaW5pdGVzICE9PSB1bmRlZmluZWQgJiYgbnVtUG9zaXRpdmVGaW5pdGVzID4gMCJcbiAgICAgICAgY2xhc3M9ImNhdGVnb3J5IlxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzcz0iY2F0ZWdvcnktdGFnIGZpbml0ZSI+Kzwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LWNvdW50Ij7Dl3t7IG51bVBvc2l0aXZlRmluaXRlcyB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAnLHN0eWxlczpbIlxuICAgICAgOmhvc3Qge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTNlNWU4O1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjYzBjMGMwO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCBtb25vc3BhY2U7XG4gICAgICAgIGZvbnQtc2l6ZTogMTBweDtcbiAgICAgICAgbWFyZ2luOiAwIDJweDtcbiAgICAgICAgcGFkZGluZzogMXB4O1xuICAgICAgfVxuICAgICAgLmJyZWFrIHtcbiAgICAgICAgZmxleC1iYXNpczogMTAwJTtcbiAgICAgICAgd2lkdGg6IDA7XG4gICAgICB9XG4gICAgICAuc2l6ZSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBoZWlnaHQ6IDExcHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxMXB4O1xuICAgICAgICBtYXJnaW46IDAgM3B4O1xuICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgICAgfVxuICAgICAgLmJyZWFrZG93biB7XG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBoZWlnaHQ6IDExcHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxMXB4O1xuICAgICAgICBwYWRkaW5nOiAycHg7XG4gICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgICB9XG4gICAgICAuY2F0ZWdvcnkge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAycHg7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiA0cHg7XG4gICAgICAgIG1hcmdpbi10b3A6IDJweDtcbiAgICAgICAgaGVpZ3RoOiAxMDAlO1xuICAgICAgICB3aWR0aDogbWF4LWNvbnRlbnQ7XG4gICAgICB9XG4gICAgICAuY2F0ZWdvcnktdGFnIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgICAgICBwYWRkaW5nOiAwIDJweDtcbiAgICAgIH1cbiAgICAgIC5maW5pdGUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYWFhO1xuICAgICAgICBjb2xvcjogI2ZlZmVmZTtcbiAgICAgIH1cbiAgICAgIC5pbmZpbml0ZSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlNTI1OTI7XG4gICAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgfVxuICAgICJdfV19XSxudWxsLHtzaXplOlt7dHlwZTp4eX1dLG51bU5hTnM6W3t0eXBlOnh5fV0sbnVtTmVnYXRpdmVJbmZzOlt7dHlwZTp4eX1dLG51bVBvc2l0aXZlSW5mczpbe3R5cGU6eHl9XSxudW1OZWdhdGl2ZUZpbml0ZXM6W3t0eXBlOnh5fV0sbnVtWmVyb3M6W3t0eXBlOnh5fV0sbnVtUG9zaXRpdmVGaW5pdGVzOlt7dHlwZTp4eX1dfSk7Y2xhc3MgaUt7Z2V0IGluZm9TdHJpbmcoKXtyZXR1cm4gdGhpcy5oYXNJbmZPck5hTj8iSGFzIOKIni9OYU4iOiJObyDiiJ4vTmFOIn19aUsuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGlLKX0saUsuybVjbXA9dG8oe3R5cGU6aUssc2VsZWN0b3JzOltbImRlYnVnLXRlbnNvci1oYXMtaW5mLW9yLW5hbiJdXSxpbnB1dHM6e2hhc0luZk9yTmFOOiJoYXNJbmZPck5hTiJ9LGRlY2xzOjIsdmFyczo0LGNvbnN0czpbWzMsIm5nQ2xhc3MiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImRpdiIsMCksa3UoMSksQW0oKSksMiZlJiYoRG0oIm5nQ2xhc3MiLE1oKDIscVgsbi5oYXNJbmZPck5hTj8iaGFzLWluZi1vci1uYW4iOiIiKSkscmMoMSksRHUoIiAiLG4uaW5mb1N0cmluZywiICIpKX0sZGlyZWN0aXZlczpbYU1dLHN0eWxlczpbIi5jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UzZTVlODtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2MwYzBjMDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgICBjb2xvcjogIzY2NjY2NjtcbiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubycsIG1vbm9zcGFjZTtcbiAgICAgICAgaGVpZ2h0OiAxNHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMTRweDtcbiAgICAgICAgbWFyZ2luOiAwIDJweDtcbiAgICAgICAgcGFkZGluZzogMXB4IDNweDtcbiAgICAgICAgd2lkdGg6IG1heC1jb250ZW50O1xuICAgICAgfVxuICAgICAgLmhhcy1pbmYtb3ItbmFuW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlNTI1OTI7XG4gICAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgfSJdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChpSyxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJkZWJ1Zy10ZW5zb3ItaGFzLWluZi1vci1uYW4iLHRlbXBsYXRlOiJcbiAgICA8ZGl2IFtuZ0NsYXNzXT1cIlsnY29udGFpbmVyJywgaGFzSW5mT3JOYU4gPyAnaGFzLWluZi1vci1uYW4nIDogJyddXCI+XG4gICAgICB7eyBpbmZvU3RyaW5nIH19XG4gICAgPC9kaXY+XG4gICIsc3R5bGVzOlsiXG4gICAgICAuY29udGFpbmVyIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UzZTVlODtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2MwYzBjMDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgICBjb2xvcjogIzY2NjY2NjtcbiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubycsIG1vbm9zcGFjZTtcbiAgICAgICAgaGVpZ2h0OiAxNHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMTRweDtcbiAgICAgICAgbWFyZ2luOiAwIDJweDtcbiAgICAgICAgcGFkZGluZzogMXB4IDNweDtcbiAgICAgICAgd2lkdGg6IG1heC1jb250ZW50O1xuICAgICAgfVxuICAgICAgLmhhcy1pbmYtb3ItbmFuIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2U1MjU5MjtcbiAgICAgICAgY29sb3I6ICNmZmY7XG4gICAgICB9XG4gICAgIl19XX1dLG51bGwse2hhc0luZk9yTmFOOlt7dHlwZTp4eX1dfSk7Y2xhc3MgYUt7fWFLLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxhSyl9LGFLLsm1Y21wPXRvKHt0eXBlOmFLLHNlbGVjdG9yczpbWyJkZWJ1Zy10ZW5zb3ItdmFsdWUiXV0saW5wdXRzOntkZWJ1Z1RlbnNvclZhbHVlOiJkZWJ1Z1RlbnNvclZhbHVlIn0sZGVjbHM6NSx2YXJzOjUsY29uc3RzOltbMywiZHR5cGUiLDQsIm5nSWYiXSxbMywicmFuayIsNCwibmdJZiJdLFszLCJzaGFwZSIsNCwibmdJZiJdLFszLCJoYXNJbmZPck5hTiIsNCwibmdJZiJdLFszLCJzaXplIiwibnVtTmVnYXRpdmVJbmZzIiwibnVtUG9zaXRpdmVJbmZzIiwibnVtTmFOcyIsIm51bU5lZ2F0aXZlRmluaXRlcyIsIm51bVplcm9zIiwibnVtUG9zaXRpdmVGaW5pdGVzIiw0LCJuZ0lmIl0sWzMsImR0eXBlIl0sWzMsInJhbmsiXSxbMywic2hhcGUiXSxbMywiaGFzSW5mT3JOYU4iXSxbMywic2l6ZSIsIm51bU5lZ2F0aXZlSW5mcyIsIm51bVBvc2l0aXZlSW5mcyIsIm51bU5hTnMiLCJudW1OZWdhdGl2ZUZpbml0ZXMiLCJudW1aZXJvcyIsIm51bVBvc2l0aXZlRmluaXRlcyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUXAoMCxaWCwxLDEsImRlYnVnLXRlbnNvci1kdHlwZSIsMCksUXAoMSxYWCwxLDEsImRlYnVnLXRlbnNvci1yYW5rIiwxKSxRcCgyLEtYLDEsMSwiZGVidWctdGVuc29yLXNoYXBlIiwyKSxRcCgzLEpYLDEsMSwiZGVidWctdGVuc29yLWhhcy1pbmYtb3ItbmFuIiwzKSxRcCg0LFFYLDEsNywiZGVidWctdGVuc29yLW51bWVyaWMtYnJlYWtkb3duIiw0KSksMiZlJiYoRG0oIm5nSWYiLHZvaWQgMCE9PW4uZGVidWdUZW5zb3JWYWx1ZS5kdHlwZSkscmMoMSksRG0oIm5nSWYiLHZvaWQgMCE9PW4uZGVidWdUZW5zb3JWYWx1ZS5yYW5rKSxyYygxKSxEbSgibmdJZiIsdm9pZCAwIT09bi5kZWJ1Z1RlbnNvclZhbHVlLnNoYXBlKSxyYygxKSxEbSgibmdJZiIsdm9pZCAwIT09bi5kZWJ1Z1RlbnNvclZhbHVlLmhhc0luZk9yTmFOKSxyYygxKSxEbSgibmdJZiIsdm9pZCAwIT09bi5kZWJ1Z1RlbnNvclZhbHVlLnNpemUpKX0sZGlyZWN0aXZlczpbZE0sdEssZUssbkssaUssb0tdLHN0eWxlczpbIltfbmdob3N0LSVDT01QJV0ge1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gICAgICB9XG4gICAgICBkZWJ1Zy10ZW5zb3ItbnVtZXJpYy1icmVha2Rvd25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgfSJdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChhSyxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJkZWJ1Zy10ZW5zb3ItdmFsdWUiLHRlbXBsYXRlOidcbiAgICA8ZGVidWctdGVuc29yLWR0eXBlXG4gICAgICAqbmdJZj0iZGVidWdUZW5zb3JWYWx1ZS5kdHlwZSAhPT0gdW5kZWZpbmVkIlxuICAgICAgW2R0eXBlXT0iZGVidWdUZW5zb3JWYWx1ZS5kdHlwZSJcbiAgICA+XG4gICAgPC9kZWJ1Zy10ZW5zb3ItZHR5cGU+XG4gICAgPGRlYnVnLXRlbnNvci1yYW5rXG4gICAgICAqbmdJZj0iZGVidWdUZW5zb3JWYWx1ZS5yYW5rICE9PSB1bmRlZmluZWQiXG4gICAgICBbcmFua109ImRlYnVnVGVuc29yVmFsdWUucmFuayJcbiAgICA+XG4gICAgPC9kZWJ1Zy10ZW5zb3ItcmFuaz5cbiAgICA8ZGVidWctdGVuc29yLXNoYXBlXG4gICAgICAqbmdJZj0iZGVidWdUZW5zb3JWYWx1ZS5zaGFwZSAhPT0gdW5kZWZpbmVkIlxuICAgICAgW3NoYXBlXT0iZGVidWdUZW5zb3JWYWx1ZS5zaGFwZSJcbiAgICA+XG4gICAgPC9kZWJ1Zy10ZW5zb3Itc2hhcGU+XG4gICAgPGRlYnVnLXRlbnNvci1oYXMtaW5mLW9yLW5hblxuICAgICAgKm5nSWY9ImRlYnVnVGVuc29yVmFsdWUuaGFzSW5mT3JOYU4gIT09IHVuZGVmaW5lZCJcbiAgICAgIFtoYXNJbmZPck5hTl09ImRlYnVnVGVuc29yVmFsdWUuaGFzSW5mT3JOYU4iXG4gICAgPlxuICAgIDwvZGVidWctdGVuc29yLWhhcy1pbmYtb3ItbmFuPlxuICAgIDxkZWJ1Zy10ZW5zb3ItbnVtZXJpYy1icmVha2Rvd25cbiAgICAgICpuZ0lmPSJkZWJ1Z1RlbnNvclZhbHVlLnNpemUgIT09IHVuZGVmaW5lZCJcbiAgICAgIHNpemU9Int7IGRlYnVnVGVuc29yVmFsdWUuc2l6ZSB9fSJcbiAgICAgIFtudW1OZWdhdGl2ZUluZnNdPSJkZWJ1Z1RlbnNvclZhbHVlLm51bU5lZ2F0aXZlSW5mcyJcbiAgICAgIFtudW1Qb3NpdGl2ZUluZnNdPSJkZWJ1Z1RlbnNvclZhbHVlLm51bVBvc2l0aXZlSW5mcyJcbiAgICAgIFtudW1OYU5zXT0iZGVidWdUZW5zb3JWYWx1ZS5udW1OYU5zIlxuICAgICAgW251bU5lZ2F0aXZlRmluaXRlc109ImRlYnVnVGVuc29yVmFsdWUubnVtTmVnYXRpdmVGaW5pdGVzIlxuICAgICAgW251bVplcm9zXT0iZGVidWdUZW5zb3JWYWx1ZS5udW1aZXJvcyJcbiAgICAgIFtudW1Qb3NpdGl2ZUZpbml0ZXNdPSJkZWJ1Z1RlbnNvclZhbHVlLm51bVBvc2l0aXZlRmluaXRlcyJcbiAgICA+XG4gICAgPC9kZWJ1Zy10ZW5zb3ItbnVtZXJpYy1icmVha2Rvd24+XG4gICcsc3R5bGVzOlsiXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICAgIH1cbiAgICAgIGRlYnVnLXRlbnNvci1udW1lcmljLWJyZWFrZG93biB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIH1cbiAgICAiXX1dfV0sbnVsbCx7ZGVidWdUZW5zb3JWYWx1ZTpbe3R5cGU6eHl9XX0pO2NvbnN0IHJLPWZ1bmN0aW9uKHQsZSl7cmV0dXJue3RlbnNvckRlYnVnTW9kZTp0LGFycmF5OmV9fTtmdW5jdGlvbiBzSyh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsMTIpLFJtKDEsImRpdiIsMTMpLGt1KDIpLEFtKCksUm0oMywiZGl2IiwxNCksVG0oNCwiZGVidWctdGVuc29yLXZhbHVlIiwxNSksQW0oKSxBbSgpKSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQsbj1lLmluZGV4LG89WW0oMyk7cmMoMiksRHUoIk91dHB1dCBzbG90ICIsbiwiOiIpLHJjKDIpLERtKCJkZWJ1Z1RlbnNvclZhbHVlIixvLnBhcnNlRGVidWdUZW5zb3JWYWx1ZSh2aCgyLHJLLG8udGVuc29yRGVidWdNb2RlLHQpKSl9fWZ1bmN0aW9uIGxLKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2IiwxMCksUXAoMSxzSyw1LDUsImRpdiIsMTEpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgyKTtyYygxKSxEbSgibmdGb3JPZiIsdC5kZWJ1Z1RlbnNvclZhbHVlcyl9fWZ1bmN0aW9uIGNLKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2IiksUm0oMSwiZGl2IiksUm0oMiwiZGl2IiwzKSxSbSgzLCJzcGFuIiw0KSxrdSg0LCIgT3A6ICIpLEFtKCksUm0oNSwic3BhbiIsNSksa3UoNiksQW0oKSxBbSgpLFJtKDcsImRpdiIsMyksUm0oOCwic3BhbiIsNCksa3UoOSwiICMgb2YgaW5wdXQgdGVuc29yczogIiksQW0oKSxSbSgxMCwic3BhbiIsNiksa3UoMTEpLEFtKCksQW0oKSxSbSgxMiwiZGl2IiwzKSxSbSgxMywic3BhbiIsNCksa3UoMTQsIiAjIG9mIG91dHB1dCB0ZW5zb3JzOiAiKSxBbSgpLFJtKDE1LCJzcGFuIiw3KSxrdSgxNiksQW0oKSxSbSgxNywic3BhbiIsOCksa3UoMTgpLEFtKCksQW0oKSxRcCgxOSxsSywyLDEsImRpdiIsOSksQW0oKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtyYyg2KSxEdSgiICIsdC5mb2N1c2VkRXhlY3V0aW9uRGF0YS5vcF90eXBlLCIgIikscmMoNSksRHUoIiAiLG51bGw9PXQuZm9jdXNlZEV4ZWN1dGlvbkRhdGEuaW5wdXRfdGVuc29yX2lkcz8wOnQuZm9jdXNlZEV4ZWN1dGlvbkRhdGEuaW5wdXRfdGVuc29yX2lkcy5sZW5ndGgsIiAiKSxyYyg1KSxEdSgiICIsbnVsbD09dC5mb2N1c2VkRXhlY3V0aW9uRGF0YS5vdXRwdXRfdGVuc29yX2lkcz8wOnQuZm9jdXNlZEV4ZWN1dGlvbkRhdGEub3V0cHV0X3RlbnNvcl9pZHMubGVuZ3RoLCIgIikscmMoMiksRHUoIiAoZGVidWcgbW9kZTogIix0LlRlbnNvckRlYnVnTW9kZVt0LnRlbnNvckRlYnVnTW9kZV0sIikgIikscmMoMSksRG0oIm5nSWYiLHQuaGFzRGVidWdUZW5zb3JWYWx1ZXMpfX1mdW5jdGlvbiBkSyh0LGUpe31jbGFzcyBwS3tjb25zdHJ1Y3Rvcigpe3RoaXMudGVuc29yRGVidWdNb2RlPW1aLlVOU1BFQ0lGSUVELHRoaXMuaGFzRGVidWdUZW5zb3JWYWx1ZXM9ITEsdGhpcy5kZWJ1Z1RlbnNvclZhbHVlcz1udWxsLHRoaXMuZGVidWdUZW5zb3JEdHlwZXM9bnVsbCx0aGlzLlRlbnNvckRlYnVnTW9kZT1tWix0aGlzLnBhcnNlRGVidWdUZW5zb3JWYWx1ZT1IWH19cEsuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHBLKX0scEsuybVjbXA9dG8oe3R5cGU6cEssc2VsZWN0b3JzOltbImV4ZWN1dGlvbi1kYXRhLWNvbXBvbmVudCJdXSxpbnB1dHM6e2ZvY3VzZWRFeGVjdXRpb25JbmRleDoiZm9jdXNlZEV4ZWN1dGlvbkluZGV4Iixmb2N1c2VkRXhlY3V0aW9uRGF0YToiZm9jdXNlZEV4ZWN1dGlvbkRhdGEiLHRlbnNvckRlYnVnTW9kZToidGVuc29yRGVidWdNb2RlIixoYXNEZWJ1Z1RlbnNvclZhbHVlczoiaGFzRGVidWdUZW5zb3JWYWx1ZXMiLGRlYnVnVGVuc29yVmFsdWVzOiJkZWJ1Z1RlbnNvclZhbHVlcyIsZGVidWdUZW5zb3JEdHlwZXM6ImRlYnVnVGVuc29yRHR5cGVzIn0sZGVjbHM6Nyx2YXJzOjMsY29uc3RzOltbMSwiZm9jdXMtZXhlY3V0aW9uLWNvbnRhaW5lciJdLFs0LCJuZ0lmIiwibmdJZkVsc2UiXSxbImxvYWRpbmdfc2VjdGlvbiIsIiJdLFsxLCJleGVjdXRpb24tZGF0YS1maWVsZCJdLFsxLCJleGVjdXRpb24tZGF0YS1rZXkiXSxbMSwiZXhlY3V0aW9uLWRhdGEtdmFsdWUiLCJvcC10eXBlIl0sWzEsImV4ZWN1dGlvbi1kYXRhLXZhbHVlIiwiaW5wdXQtdGVuc29ycyJdLFsxLCJleGVjdXRpb24tZGF0YS12YWx1ZSIsIm91dHB1dC10ZW5zb3JzIl0sWzEsImV4ZWN1dGlvbi1kYXRhLXZhbHVlIl0sWyJjbGFzcyIsIm91dHB1dC1zbG90cyIsNCwibmdJZiJdLFsxLCJvdXRwdXQtc2xvdHMiXSxbImNsYXNzIiwib3V0cHV0LXNsb3QtY29udGFpbmVyIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbMSwib3V0cHV0LXNsb3QtY29udGFpbmVyIl0sWzEsIm91dHB1dC1zbG90LW51bWJlciJdLFsxLCJvdXRwdXQtc2xvdC1kZWJ1Zy10ZW5zb3ItdmFsdWUiXSxbMywiZGVidWdUZW5zb3JWYWx1ZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoUm0oMCwiZGl2IiwwKSxSbSgxLCJkaXYiKSxSbSgyLCJzcGFuIiksa3UoMyksQW0oKSxBbSgpLFFwKDQsY0ssMjAsNSwiZGl2IiwxKSxRcCg1LGRLLDAsMCwibmctdGVtcGxhdGUiLG51bGwsMixpYiksQW0oKSksMiZlKXtjb25zdCB0PSRwKDYpO3JjKDMpLER1KCIgUHl0aG9uIEV4ZWN1dGlvbiAjIixuLmZvY3VzZWRFeGVjdXRpb25JbmRleCwiICIpLHJjKDEpLERtKCJuZ0lmIixudWxsIT09bi5mb2N1c2VkRXhlY3V0aW9uRGF0YSkoIm5nSWZFbHNlIix0KX19LGRpcmVjdGl2ZXM6W2RNLGxNLGFLXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0uZGVidWctdGVuc29yLXZhbHVlcy10YWJsZVtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJX0uZGVidWctdGVuc29yLXZhbHVlcy10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0ZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgIzAwMDt0ZXh0LWFsaWduOmxlZnR9LmRlYnVnLXRlbnNvci12YWx1ZXMtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde3RleHQtYWxpZ246bGVmdH0uZXhlY3V0aW9uLWRhdGEtZmllbGRbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcH0uZXhlY3V0aW9uLWRhdGEta2V5W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmlubGluZS1ibG9jazttYXgtd2lkdGg6MTIwcHg7dGV4dC1hbGlnbjpyaWdodDt3aWR0aDoxMjBweH0uZXhlY3V0aW9uLWRhdGEtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1sZWZ0OjEwcHh9LmZvY3VzLWV4ZWN1dGlvbi1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmY2M4MDtib3JkZXItcmFkaXVzOjRweDtmb250LXNpemU6MTJweDtoZWlnaHQ6MTIwcHg7cGFkZGluZzo1cHg7d2lkdGg6MzYwcHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmZvY3VzLWV4ZWN1dGlvbi1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuZm9jdXMtZXhlY3V0aW9uLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTY1MTAwfS5vdXRwdXQtc2xvdHNbX25nY29udGVudC0lQ09NUCVde2hlaWdodDo2MHB4O292ZXJmbG93LXg6YXV0bztvdmVyZmxvdy15OmF1dG99Lm91dHB1dC1zbG90LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgI2ViZWJlYjttYXJnaW4tdG9wOjVweDtwYWRkaW5nOjJweCAwO3ZlcnRpY2FsLWFsaWduOnRvcH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAub3V0cHV0LXNsb3QtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLm91dHB1dC1zbG90LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgIzU1NX0ub3V0cHV0LXNsb3QtbnVtYmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO2ZvbnQtZmFtaWx5OiJSb2JvdG8gTW9ubyIsbW9ub3NwYWNlfS5vdXRwdXQtc2xvdC1kZWJ1Zy10ZW5zb3ItdmFsdWVbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjNweCAwIDNweCAzMHB4fS5vdXRwdXQtdGVuc29yc1tfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDo1cHh9J119KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHBLLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImV4ZWN1dGlvbi1kYXRhLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vZXhlY3V0aW9uX2RhdGFfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vZXhlY3V0aW9uX2RhdGFfY29tcG9uZW50LmNzcyJdfV19XSxudWxsLHtmb2N1c2VkRXhlY3V0aW9uSW5kZXg6W3t0eXBlOnh5fV0sZm9jdXNlZEV4ZWN1dGlvbkRhdGE6W3t0eXBlOnh5fV0sdGVuc29yRGVidWdNb2RlOlt7dHlwZTp4eX1dLGhhc0RlYnVnVGVuc29yVmFsdWVzOlt7dHlwZTp4eX1dLGRlYnVnVGVuc29yVmFsdWVzOlt7dHlwZTp4eX1dLGRlYnVnVGVuc29yRHR5cGVzOlt7dHlwZTp4eX1dfSk7Y29uc3QgbUs9IlVua25vd24gZHR5cGUiO2NsYXNzIHVLe2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLmZvY3VzZWRFeGVjdXRpb25EYXRhJD10aGlzLnN0b3JlLnBpcGUoRncobVgpKSx0aGlzLnRlbnNvckRlYnVnTW9kZSQ9dGhpcy5zdG9yZS5waXBlKEZ3KFp3KG1YLCh0PT5udWxsPT09dD9tWi5VTlNQRUNJRklFRDp0LnRlbnNvcl9kZWJ1Z19tb2RlKSkpKSx0aGlzLmhhc0RlYnVnVGVuc29yVmFsdWVzJD10aGlzLnN0b3JlLnBpcGUoRncoWncobVgsKHQ9PntpZihudWxsPT09dHx8bnVsbD09PXQuZGVidWdfdGVuc29yX3ZhbHVlcylyZXR1cm4hMTtmb3IoY29uc3QgZSBvZiB0LmRlYnVnX3RlbnNvcl92YWx1ZXMpaWYobnVsbCE9PWUmJmUubGVuZ3RoPjApcmV0dXJuITA7cmV0dXJuITF9KSkpKSx0aGlzLmRlYnVnVGVuc29yVmFsdWVzJD10aGlzLnN0b3JlLnBpcGUoRncoWncobVgsKHQ9Pm51bGw9PT10P251bGw6dC5kZWJ1Z190ZW5zb3JfdmFsdWVzKSkpKSx0aGlzLmRlYnVnVGVuc29yRHR5cGVzJD10aGlzLnN0b3JlLnBpcGUoRncoWncobVgsKHQ9PntpZihudWxsPT09dHx8bnVsbD09PXQuZGVidWdfdGVuc29yX3ZhbHVlcylyZXR1cm4gbnVsbDtpZih0LnRlbnNvcl9kZWJ1Z19tb2RlIT09bVouRlVMTF9IRUFMVEgmJnQudGVuc29yX2RlYnVnX21vZGUhPT1tWi5TSEFQRSlyZXR1cm4gbnVsbDtjb25zdCBlPVtdO2Zvcihjb25zdCBuIG9mIHQuZGVidWdfdGVuc29yX3ZhbHVlcylpZihudWxsPT09billLnB1c2gobUspO2Vsc2V7Y29uc3Qgbz1TdHJpbmcodC50ZW5zb3JfZGVidWdfbW9kZT09PW1aLkZVTExfSEVBTFRIP25bMl06blsxXSk7ZS5wdXNoKElYW29dfHxtSyl9cmV0dXJuIGV9KSkpKX19ZnVuY3Rpb24gZksodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJtYXQtc2xpZGVyIiwxMSksVm0oImlucHV0IiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oMikub25TbGlkZXJDaGFuZ2UuZW1pdChuLnZhbHVlKX0pKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgyKTtEbSgibWluIiwwKSgibWF4Iix0LnNjcm9sbEJlZ2luSW5kZXhVcHBlckxpbWl0KSgidmFsdWUiLHQuc2Nyb2xsQmVnaW5JbmRleCl9fWZ1bmN0aW9uIGdLKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2Iiw2KSxSbSgxLCJidXR0b24iLDcpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5vbk5hdmlnYXRlTGVmdC5lbWl0KCl9KSksa3UoMiwiIDwgIiksQW0oKSxSbSgzLCJkaXYiLDgpLGt1KDQpLEFtKCksUm0oNSwiYnV0dG9uIiw5KSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLFltKCkub25OYXZpZ2F0ZVJpZ2h0LmVtaXQoKX0pKSxrdSg2LCIgPiAiKSxBbSgpLFFwKDcsZkssMSwzLCJtYXQtc2xpZGVyIiwxMCksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKTtyYyg0KSxSdSgiICIsdC5zY3JvbGxCZWdpbkluZGV4LCIgfiAiLHQuc2Nyb2xsQmVnaW5JbmRleCt0LmRpc3BsYXlDb3VudC0xLCIgb2YgIix0Lm51bUV4ZWN1dGlvbnMsIiAiKSxyYygzKSxEbSgibmdJZiIsdC5zY3JvbGxCZWdpbkluZGV4VXBwZXJMaW1pdD4wKX19dUsuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHVLKShTbShJdykpfSx1Sy7JtWNtcD10byh7dHlwZTp1SyxzZWxlY3RvcnM6W1sidGYtZGVidWdnZXItdjItZXhlY3V0aW9uLWRhdGEiXV0saW5wdXRzOntmb2N1c2VkRXhlY3V0aW9uSW5kZXg6ImZvY3VzZWRFeGVjdXRpb25JbmRleCJ9LGRlY2xzOjYsdmFyczoxNixjb25zdHM6W1szLCJmb2N1c2VkRXhlY3V0aW9uSW5kZXgiLCJmb2N1c2VkRXhlY3V0aW9uRGF0YSIsInRlbnNvckRlYnVnTW9kZSIsImhhc0RlYnVnVGVuc29yVmFsdWVzIiwiZGVidWdUZW5zb3JWYWx1ZXMiLCJkZWJ1Z1RlbnNvckR0eXBlcyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwiZXhlY3V0aW9uLWRhdGEtY29tcG9uZW50IiwwKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQWgoMywiYXN5bmMiKSxBaCg0LCJhc3luYyIpLEFoKDUsImFzeW5jIikpLDImZSYmRG0oImZvY3VzZWRFeGVjdXRpb25JbmRleCIsbi5mb2N1c2VkRXhlY3V0aW9uSW5kZXgpKCJmb2N1c2VkRXhlY3V0aW9uRGF0YSIsVGgoMSw2LG4uZm9jdXNlZEV4ZWN1dGlvbkRhdGEkKSkoInRlbnNvckRlYnVnTW9kZSIsVGgoMiw4LG4udGVuc29yRGVidWdNb2RlJCkpKCJoYXNEZWJ1Z1RlbnNvclZhbHVlcyIsVGgoMywxMCxuLmhhc0RlYnVnVGVuc29yVmFsdWVzJCkpKCJkZWJ1Z1RlbnNvclZhbHVlcyIsVGgoNCwxMixuLmRlYnVnVGVuc29yVmFsdWVzJCkpKCJkZWJ1Z1RlbnNvckR0eXBlcyIsVGgoNSwxNCxuLmRlYnVnVGVuc29yRHR5cGVzJCkpfSxkaXJlY3RpdmVzOltwS10scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHVLLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InRmLWRlYnVnZ2VyLXYyLWV4ZWN1dGlvbi1kYXRhIix0ZW1wbGF0ZTonXG4gICAgPGV4ZWN1dGlvbi1kYXRhLWNvbXBvbmVudFxuICAgICAgW2ZvY3VzZWRFeGVjdXRpb25JbmRleF09ImZvY3VzZWRFeGVjdXRpb25JbmRleCJcbiAgICAgIFtmb2N1c2VkRXhlY3V0aW9uRGF0YV09ImZvY3VzZWRFeGVjdXRpb25EYXRhJCB8IGFzeW5jIlxuICAgICAgW3RlbnNvckRlYnVnTW9kZV09InRlbnNvckRlYnVnTW9kZSQgfCBhc3luYyJcbiAgICAgIFtoYXNEZWJ1Z1RlbnNvclZhbHVlc109Imhhc0RlYnVnVGVuc29yVmFsdWVzJCB8IGFzeW5jIlxuICAgICAgW2RlYnVnVGVuc29yVmFsdWVzXT0iZGVidWdUZW5zb3JWYWx1ZXMkIHwgYXN5bmMiXG4gICAgICBbZGVidWdUZW5zb3JEdHlwZXNdPSJkZWJ1Z1RlbnNvckR0eXBlcyQgfCBhc3luYyJcbiAgICA+PC9leGVjdXRpb24tZGF0YS1jb21wb25lbnQ+XG4gICd9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSkse2ZvY3VzZWRFeGVjdXRpb25JbmRleDpbe3R5cGU6eHl9XX0pO2NvbnN0IGhLPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm5bdCxlLG5dfTtmdW5jdGlvbiBiSyh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsImRpdiIsMTQpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUoKXtjb25zdCBuPWhpKHQpLmluZGV4O3JldHVybiBZbSgyKS5vbkV4ZWN1dGlvbkRpZ2VzdENsaWNrZWQuZW1pdChuKX0pKSxSbSgxLCJkaXYiLDE1KSxrdSgyKSxBbSgpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49ZS5pbmRleCxvPVltKDIpO3JjKDEpLEttKCJ0aXRsZSIsdC5vcF90eXBlKSxEbSgibmdDbGFzcyIseGgoMyxoSyx0LmlzX2dyYXBoPyJmdW5jLWdyYXBoLWV4ZWN1dGlvbiI6IiIsbj09PW8uZm9jdXNlZEV4ZWN1dGlvbkRpc3BsYXlJbmRleD8iZm9jdXNlZCI6IiIsby5kaXNwbGF5Rm9jdXNlZEFsZXJ0VHlwZXNbbl18fCIiKSkscmMoMSksRHUoIiAiLHQuc2hvcnRfb3BfdHlwZSwiICIpfX1mdW5jdGlvbiB5Syh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsMTIpLFFwKDEsYkssMyw3LCJkaXYiLDEzKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtyYygxKSxEbSgibmdGb3JPZiIsdC5kaXNwbGF5RXhlY3V0aW9uRGlnZXN0cyl9fWZ1bmN0aW9uIF9LKHQsZSl7aWYoMSZ0JiYoTm0oMCksVG0oMSwidGYtZGVidWdnZXItdjItZXhlY3V0aW9uLWRhdGEiLDE2KSx6bSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtyYygxKSxEbSgiZm9jdXNlZEV4ZWN1dGlvbkluZGV4Iix0LmZvY3VzZWRFeGVjdXRpb25JbmRleCl9fWNsYXNzIENLe2NvbnN0cnVjdG9yKCl7dGhpcy5hY3RpdmVSdW5JZD1udWxsLHRoaXMubG9hZGluZ051bUV4ZWN1dGlvbnM9ITEsdGhpcy5udW1FeGVjdXRpb25zPTAsdGhpcy5zY3JvbGxCZWdpbkluZGV4PTAsdGhpcy5zY3JvbGxCZWdpbkluZGV4VXBwZXJMaW1pdD0wLHRoaXMucGFnZVNpemU9MCx0aGlzLmRpc3BsYXlDb3VudD0wLHRoaXMuZGlzcGxheUV4ZWN1dGlvbkRpZ2VzdHM9W10sdGhpcy5kaXNwbGF5Rm9jdXNlZEFsZXJ0VHlwZXM9W10sdGhpcy5mb2N1c2VkRXhlY3V0aW9uSW5kZXg9bnVsbCx0aGlzLmZvY3VzZWRFeGVjdXRpb25EaXNwbGF5SW5kZXg9bnVsbCx0aGlzLmZvY3VzZWRFeGVjdXRpb25EYXRhPW51bGwsdGhpcy5vbk5hdmlnYXRlTGVmdD1uZXcgTGgsdGhpcy5vbk5hdmlnYXRlUmlnaHQ9bmV3IExoLHRoaXMub25FeGVjdXRpb25EaWdlc3RDbGlja2VkPW5ldyBMaCx0aGlzLm9uU2xpZGVyQ2hhbmdlPW5ldyBMaH19Q0suybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fENLKX0sQ0suybVjbXA9dG8oe3R5cGU6Q0ssc2VsZWN0b3JzOltbInRpbWVsaW5lLWNvbXBvbmVudCJdXSxpbnB1dHM6e2FjdGl2ZVJ1bklkOiJhY3RpdmVSdW5JZCIsbG9hZGluZ051bUV4ZWN1dGlvbnM6ImxvYWRpbmdOdW1FeGVjdXRpb25zIixudW1FeGVjdXRpb25zOiJudW1FeGVjdXRpb25zIixzY3JvbGxCZWdpbkluZGV4OiJzY3JvbGxCZWdpbkluZGV4IixzY3JvbGxCZWdpbkluZGV4VXBwZXJMaW1pdDoic2Nyb2xsQmVnaW5JbmRleFVwcGVyTGltaXQiLHBhZ2VTaXplOiJwYWdlU2l6ZSIsZGlzcGxheUNvdW50OiJkaXNwbGF5Q291bnQiLGRpc3BsYXlFeGVjdXRpb25EaWdlc3RzOiJkaXNwbGF5RXhlY3V0aW9uRGlnZXN0cyIsZGlzcGxheUZvY3VzZWRBbGVydFR5cGVzOiJkaXNwbGF5Rm9jdXNlZEFsZXJ0VHlwZXMiLGZvY3VzZWRFeGVjdXRpb25JbmRleDoiZm9jdXNlZEV4ZWN1dGlvbkluZGV4Iixmb2N1c2VkRXhlY3V0aW9uRGlzcGxheUluZGV4OiJmb2N1c2VkRXhlY3V0aW9uRGlzcGxheUluZGV4Iixmb2N1c2VkRXhlY3V0aW9uRGF0YToiZm9jdXNlZEV4ZWN1dGlvbkRhdGEifSxvdXRwdXRzOntvbk5hdmlnYXRlTGVmdDoib25OYXZpZ2F0ZUxlZnQiLG9uTmF2aWdhdGVSaWdodDoib25OYXZpZ2F0ZVJpZ2h0IixvbkV4ZWN1dGlvbkRpZ2VzdENsaWNrZWQ6Im9uRXhlY3V0aW9uRGlnZXN0Q2xpY2tlZCIsb25TbGlkZXJDaGFuZ2U6Im9uU2xpZGVyQ2hhbmdlIn0sZGVjbHM6OSx2YXJzOjQsY29uc3RzOltbMSwidGltZWxpbmUtdGl0bGUiXSxbMSwiZXhlY3V0aW9uLWNvdW50Il0sWzEsInRvcC1sZXZlbC1leGVjdXRpb25zIl0sWyJjbGFzcyIsIm5hdmlnYXRpb24tc2VjdGlvbiIsNCwibmdJZiJdLFsiY2xhc3MiLCJleGVjdXRpb24tdGltZWxpbmUiLDQsIm5nSWYiXSxbNCwibmdJZiJdLFsxLCJuYXZpZ2F0aW9uLXNlY3Rpb24iXSxbIm1hdC1idXR0b24iLCIiLDEsIm5hdmlnYXRpb24tYnV0dG9uLWxlZnQiLDMsImNsaWNrIl0sWzEsIm5hdmlnYXRpb24tcG9zaXRpb24taW5mbyJdLFsibWF0LWJ1dHRvbiIsIiIsMSwibmF2aWdhdGlvbi1idXR0b24tcmlnaHQiLDMsImNsaWNrIl0sWyJjbGFzcyIsInRpbWVsaW5lLXNsaWRlciIsInN0ZXAiLCIxIiwzLCJtaW4iLCJtYXgiLCJ2YWx1ZSIsImlucHV0Iiw0LCJuZ0lmIl0sWyJzdGVwIiwiMSIsMSwidGltZWxpbmUtc2xpZGVyIiwzLCJtaW4iLCJtYXgiLCJ2YWx1ZSIsImlucHV0Il0sWzEsImV4ZWN1dGlvbi10aW1lbGluZSJdLFszLCJjbGljayIsNCwibmdGb3IiLCJuZ0Zvck9mIl0sWzMsImNsaWNrIl0sWzEsImV4ZWN1dGlvbi1kaWdlc3QiLDMsIm5nQ2xhc3MiLCJ0aXRsZSJdLFszLCJmb2N1c2VkRXhlY3V0aW9uSW5kZXgiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImRpdiIpLFJtKDEsImRpdiIsMCksa3UoMiwiIFB5dGhvbiBFeGVjdXRpb24gVGltZWxpbmUgIiksUm0oMywic3BhbiIsMSksa3UoNCksQW0oKSxBbSgpLFJtKDUsImRpdiIsMiksUXAoNixnSyw4LDQsImRpdiIsMyksUXAoNyx5SywyLDEsImRpdiIsNCksUXAoOCxfSywyLDEsIm5nLWNvbnRhaW5lciIsNSksQW0oKSxBbSgpKSwyJmUmJihyYyg0KSxEdSgiICgiLG4ubnVtRXhlY3V0aW9ucywiKSAiKSxyYygyKSxEbSgibmdJZiIsbi5udW1FeGVjdXRpb25zKSxyYygxKSxEbSgibmdJZiIsbi5udW1FeGVjdXRpb25zKSxyYygxKSxEbSgibmdJZiIsbnVsbCE9PW4uYWN0aXZlUnVuSWQmJm51bGwhPT1uLmZvY3VzZWRFeGVjdXRpb25JbmRleCkpfSxkaXJlY3RpdmVzOltkTSxYSCxSWCxsTSxhTSx1S10sc3R5bGVzOlsiLmV4ZWN1dGlvbi1kaWdlc3RbX25nY29udGVudC0lQ09NUCVdIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2UzZTVlODtcbiAgYm9yZGVyOiAxcHggc29saWQgI2MwYzBjMDtcbiAgY29sb3I6ICM0MjUwNjY7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgZm9udC1zaXplOiAxMHB4O1xuICBoZWlnaHQ6IDE1cHg7XG4gIHBhZGRpbmc6IDFweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB3aWR0aDogMTJweDtcbn1cblxuLmV4ZWN1dGlvbi1kaWdlc3QuZnVuYy1ncmFwaC1leGVjdXRpb25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2M3ZGJmNTtcbiAgY29sb3I6ICM0ZTU2NjQ7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuXG4uZXhlY3V0aW9uLWRpZ2VzdC5mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmQ0YjM7XG4gIGJvcmRlcjogMXB4IHNvbGlkICMwMDA7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4uZXhlY3V0aW9uLWRpZ2VzdC5JbmZOYW5BbGVydFtfbmdjb250ZW50LSVDT01QJV0ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTUyNTkyO1xuICBjb2xvcjogI2ZmZjtcbn1cblxuXG4uZXhlY3V0aW9uLWRpZ2VzdFtfbmdjb250ZW50LSVDT01QJV06aG92ZXIge1xuICBib3JkZXI6IDFweCBzb2xpZCAjMDAwO1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLmV4ZWN1dGlvbi10aW1lbGluZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBmbGV4O1xuICBvdmVyZmxvdy14OiBoaWRkZW47XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXJnaW4tdG9wOiA1cHg7XG4gIG1hcmdpbi1ib3R0b206IDVweDtcbn1cblxuLnRpbWVsaW5lLXNsaWRlcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGhlaWdodDogNDhweDtcbiAgbGVmdDogMzQwcHg7IFxuICBwYWRkaW5nOiAwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHJpZ2h0OiA0MHB4O1xufVxuXG4gIC50aW1lbGluZS1zbGlkZXIgLm1hdC1zbGlkZXItdGh1bWIge1xuICBib3JkZXItcmFkaXVzOiA1cHg7XG4gIHJpZ2h0OiAtNDBweDtcbiAgd2lkdGg6IDgwcHg7XG59XG5cblxuLm5hdmlnYXRpb24tcG9zaXRpb24taW5mb1tfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogbm9ybWFsO1xuICBtYXgtd2lkdGg6IDIwMHB4O1xuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDEwcHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLm5hdmlnYXRpb24tc2VjdGlvbltfbmdjb250ZW50LSVDT01QJV0ge1xuICBoZWlnaHQ6IDQ4cHg7XG4gIGxpbmUtaGVpZ2h0OiA0OHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHdpZHRoOiAxMDAlO1xufSJdLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChDSyxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJ0aW1lbGluZS1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiIuL3RpbWVsaW5lX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyIuL3RpbWVsaW5lX2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSxudWxsLHthY3RpdmVSdW5JZDpbe3R5cGU6eHl9XSxsb2FkaW5nTnVtRXhlY3V0aW9uczpbe3R5cGU6eHl9XSxudW1FeGVjdXRpb25zOlt7dHlwZTp4eX1dLHNjcm9sbEJlZ2luSW5kZXg6W3t0eXBlOnh5fV0sc2Nyb2xsQmVnaW5JbmRleFVwcGVyTGltaXQ6W3t0eXBlOnh5fV0scGFnZVNpemU6W3t0eXBlOnh5fV0sZGlzcGxheUNvdW50Olt7dHlwZTp4eX1dLGRpc3BsYXlFeGVjdXRpb25EaWdlc3RzOlt7dHlwZTp4eX1dLGRpc3BsYXlGb2N1c2VkQWxlcnRUeXBlczpbe3R5cGU6eHl9XSxmb2N1c2VkRXhlY3V0aW9uSW5kZXg6W3t0eXBlOnh5fV0sZm9jdXNlZEV4ZWN1dGlvbkRpc3BsYXlJbmRleDpbe3R5cGU6eHl9XSxmb2N1c2VkRXhlY3V0aW9uRGF0YTpbe3R5cGU6eHl9XSxvbk5hdmlnYXRlTGVmdDpbe3R5cGU6T3l9XSxvbk5hdmlnYXRlUmlnaHQ6W3t0eXBlOk95fV0sb25FeGVjdXRpb25EaWdlc3RDbGlja2VkOlt7dHlwZTpPeX1dLG9uU2xpZGVyQ2hhbmdlOlt7dHlwZTpPeX1dfSk7Y29uc3QgTUs9WyJfX2ZvcndhcmRfIiwiX19iYWNrd2FyZF8iLCJfX2luZmVyZW5jZV8iXTtjbGFzcyB2S3tjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5hY3RpdmVSdW5JZCQ9dGhpcy5zdG9yZS5waXBlKEZ3KGtaKSksdGhpcy5sb2FkaW5nTnVtRXhlY3V0aW9ucyQ9dGhpcy5zdG9yZS5waXBlKEZ3KFp3KEhaLCh0PT50LnN0YXRlPT15RS5MT0FESU5HKSkpKSx0aGlzLnNjcm9sbEJlZ2luSW5kZXgkPXRoaXMuc3RvcmUucGlwZShGdyhCWikpLHRoaXMuc2Nyb2xsQmVnaW5JbmRleFVwcGVyTGltaXQkPXRoaXMuc3RvcmUucGlwZShGdyhadyhMWixqWiwoKHQsZSk9Pk1hdGgubWF4KDAsdC1lKSkpKSksdGhpcy5wYWdlU2l6ZSQ9dGhpcy5zdG9yZS5waXBlKEZ3KFZaKSksdGhpcy5kaXNwbGF5Q291bnQkPXRoaXMuc3RvcmUucGlwZShGdyhqWikpLHRoaXMuZGlzcGxheUV4ZWN1dGlvbkRpZ2VzdHMkPXRoaXMuc3RvcmUucGlwZShGdyhadyhVWiwodD0+dC5tYXAoKHQ9PihmdW5jdGlvbiBlKHQsbj0xKXtpZighdClyZXR1cm57b3BfdHlwZToiKE4vQSkiLHNob3J0X29wX3R5cGU6Ii4uIixpc19ncmFwaDohMX07Y29uc3Qgbz1NSy5maWx0ZXIoKGU9PnQub3BfdHlwZS5zdGFydHNXaXRoKGUpKSk7aWYoby5sZW5ndGgpe2NvbnN0IGU9dC5vcF90eXBlLnNsaWNlKG9bMF0ubGVuZ3RoKTtyZXR1cm57b3BfdHlwZTp0Lm9wX3R5cGUsc2hvcnRfb3BfdHlwZTplLnNsaWNlKDAsbiksaXNfZ3JhcGg6ITB9fXJldHVybntvcF90eXBlOnQub3BfdHlwZSxzaG9ydF9vcF90eXBlOnQub3BfdHlwZS5zbGljZSgwLG4pLGlzX2dyYXBoOiExfX0pKHQpKSkpKSkpLHRoaXMuZGlzcGxheUZvY3VzZWRBbGVydFR5cGVzJD10aGlzLnN0b3JlLnBpcGUoRncoYVgpKSx0aGlzLmZvY3VzZWRFeGVjdXRpb25JbmRleCQ9dGhpcy5zdG9yZS5waXBlKEZ3KHNYKSksdGhpcy5mb2N1c2VkRXhlY3V0aW9uRGlzcGxheUluZGV4JD10aGlzLnN0b3JlLnBpcGUoRncobFgpKSx0aGlzLm51bUV4ZWN1dGlvbnMkPXRoaXMuc3RvcmUucGlwZShGdyhMWikpfW9uTmF2aWdhdGVMZWZ0KCl7dGhpcy5zdG9yZS5kaXNwYXRjaChXcSgpKX1vbk5hdmlnYXRlUmlnaHQoKXt0aGlzLnN0b3JlLmRpc3BhdGNoKFlxKCkpfW9uRXhlY3V0aW9uRGlnZXN0Q2xpY2tlZCh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKFpxKHtkaXNwbGF5SW5kZXg6dH0pKX1vblNsaWRlckNoYW5nZSh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKHFxKHtpbmRleDp0fSkpfX1mdW5jdGlvbiB4Syh0LGUpezEmdCYmKFJtKDAsInNwYW4iKSxrdSgxLCIgT3V0cHV0ICIpLEFtKCkpfWZ1bmN0aW9uIE9LKHQsZSl7MSZ0JiYoUm0oMCwic3BhbiIpLGt1KDEsIiBJbnB1dCAiKSxBbSgpKX1mdW5jdGlvbiBQSyh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsNiksUm0oMSwic3BhbiIsNyksUXAoMix4SywyLDAsInNwYW4iLDgpLFFwKDMsT0ssMiwwLCJzcGFuIiw4KSxBbSgpLGt1KDQpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpO3JjKDEpLERtKCJuZ1N3aXRjaCIsdC5raW5kKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIiwiaW5wdXQiKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIiwiY29uc3VtZXIiKSxyYygxKSxEdSgiIHNsb3Q6ICIsdC5zbG90LCIgIil9fWZ1bmN0aW9uIHdLKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2Iiw5KSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtyYygxKSxEdSgiICIsdC5vcERhdGEub3BfdHlwZSwiICIpfX1mdW5jdGlvbiBrSyh0LGUpezEmdCYmKFJtKDAsInNwYW4iLDEwKSxrdSgxLCIgKE9wIGluZm8gdW5hdmFpbGFibGUuKSAiKSxBbSgpKX12Sy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8dkspKFNtKEl3KSl9LHZLLsm1Y21wPXRvKHt0eXBlOnZLLHNlbGVjdG9yczpbWyJ0Zi1kZWJ1Z2dlci12Mi10aW1lbGluZSJdXSxkZWNsczoxMix2YXJzOjMzLGNvbnN0czpbWzMsImFjdGl2ZVJ1bklkIiwibG9hZGluZ051bUV4ZWN1dGlvbnMiLCJudW1FeGVjdXRpb25zIiwic2Nyb2xsQmVnaW5JbmRleCIsInNjcm9sbEJlZ2luSW5kZXhVcHBlckxpbWl0IiwicGFnZVNpemUiLCJkaXNwbGF5Q291bnQiLCJkaXNwbGF5RXhlY3V0aW9uRGlnZXN0cyIsImRpc3BsYXlGb2N1c2VkQWxlcnRUeXBlcyIsImZvY3VzZWRFeGVjdXRpb25JbmRleCIsImZvY3VzZWRFeGVjdXRpb25EaXNwbGF5SW5kZXgiLCJvbk5hdmlnYXRlTGVmdCIsIm9uTmF2aWdhdGVSaWdodCIsIm9uRXhlY3V0aW9uRGlnZXN0Q2xpY2tlZCIsIm9uU2xpZGVyQ2hhbmdlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJ0aW1lbGluZS1jb21wb25lbnQiLDApLFZtKCJvbk5hdmlnYXRlTGVmdCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbk5hdmlnYXRlTGVmdCgpfSkpKCJvbk5hdmlnYXRlUmlnaHQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25OYXZpZ2F0ZVJpZ2h0KCl9KSkoIm9uRXhlY3V0aW9uRGlnZXN0Q2xpY2tlZCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25FeGVjdXRpb25EaWdlc3RDbGlja2VkKGUpfSkpKCJvblNsaWRlckNoYW5nZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25TbGlkZXJDaGFuZ2UoZSl9KSksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQWgoNCwiYXN5bmMiKSxBaCg1LCJhc3luYyIpLEFoKDYsImFzeW5jIiksQWgoNywiYXN5bmMiKSxBaCg4LCJhc3luYyIpLEFoKDksImFzeW5jIiksQWgoMTAsImFzeW5jIiksQWgoMTEsImFzeW5jIiksQW0oKSksMiZlJiZEbSgiYWN0aXZlUnVuSWQiLFRoKDEsMTEsbi5hY3RpdmVSdW5JZCQpKSgibG9hZGluZ051bUV4ZWN1dGlvbnMiLFRoKDIsMTMsbi5sb2FkaW5nTnVtRXhlY3V0aW9ucyQpKSgibnVtRXhlY3V0aW9ucyIsVGgoMywxNSxuLm51bUV4ZWN1dGlvbnMkKSkoInNjcm9sbEJlZ2luSW5kZXgiLFRoKDQsMTcsbi5zY3JvbGxCZWdpbkluZGV4JCkpKCJzY3JvbGxCZWdpbkluZGV4VXBwZXJMaW1pdCIsVGgoNSwxOSxuLnNjcm9sbEJlZ2luSW5kZXhVcHBlckxpbWl0JCkpKCJwYWdlU2l6ZSIsVGgoNiwyMSxuLnBhZ2VTaXplJCkpKCJkaXNwbGF5Q291bnQiLFRoKDcsMjMsbi5kaXNwbGF5Q291bnQkKSkoImRpc3BsYXlFeGVjdXRpb25EaWdlc3RzIixUaCg4LDI1LG4uZGlzcGxheUV4ZWN1dGlvbkRpZ2VzdHMkKSkoImRpc3BsYXlGb2N1c2VkQWxlcnRUeXBlcyIsVGgoOSwyNyxuLmRpc3BsYXlGb2N1c2VkQWxlcnRUeXBlcyQpKSgiZm9jdXNlZEV4ZWN1dGlvbkluZGV4IixUaCgxMCwyOSxuLmZvY3VzZWRFeGVjdXRpb25JbmRleCQpKSgiZm9jdXNlZEV4ZWN1dGlvbkRpc3BsYXlJbmRleCIsVGgoMTEsMzEsbi5mb2N1c2VkRXhlY3V0aW9uRGlzcGxheUluZGV4JCkpfSxkaXJlY3RpdmVzOltDS10scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHZLLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InRmLWRlYnVnZ2VyLXYyLXRpbWVsaW5lIix0ZW1wbGF0ZTonXG4gICAgPHRpbWVsaW5lLWNvbXBvbmVudFxuICAgICAgW2FjdGl2ZVJ1bklkXT0iYWN0aXZlUnVuSWQkIHwgYXN5bmMiXG4gICAgICBbbG9hZGluZ051bUV4ZWN1dGlvbnNdPSJsb2FkaW5nTnVtRXhlY3V0aW9ucyQgfCBhc3luYyJcbiAgICAgIFtudW1FeGVjdXRpb25zXT0ibnVtRXhlY3V0aW9ucyQgfCBhc3luYyJcbiAgICAgIFtzY3JvbGxCZWdpbkluZGV4XT0ic2Nyb2xsQmVnaW5JbmRleCQgfCBhc3luYyJcbiAgICAgIFtzY3JvbGxCZWdpbkluZGV4VXBwZXJMaW1pdF09InNjcm9sbEJlZ2luSW5kZXhVcHBlckxpbWl0JCB8IGFzeW5jIlxuICAgICAgW3BhZ2VTaXplXT0icGFnZVNpemUkIHwgYXN5bmMiXG4gICAgICBbZGlzcGxheUNvdW50XT0iZGlzcGxheUNvdW50JCB8IGFzeW5jIlxuICAgICAgW2Rpc3BsYXlFeGVjdXRpb25EaWdlc3RzXT0iZGlzcGxheUV4ZWN1dGlvbkRpZ2VzdHMkIHwgYXN5bmMiXG4gICAgICBbZGlzcGxheUZvY3VzZWRBbGVydFR5cGVzXT0iZGlzcGxheUZvY3VzZWRBbGVydFR5cGVzJCB8IGFzeW5jIlxuICAgICAgW2ZvY3VzZWRFeGVjdXRpb25JbmRleF09ImZvY3VzZWRFeGVjdXRpb25JbmRleCQgfCBhc3luYyJcbiAgICAgIFtmb2N1c2VkRXhlY3V0aW9uRGlzcGxheUluZGV4XT0iZm9jdXNlZEV4ZWN1dGlvbkRpc3BsYXlJbmRleCQgfCBhc3luYyJcbiAgICAgIChvbk5hdmlnYXRlTGVmdCk9Im9uTmF2aWdhdGVMZWZ0KCkiXG4gICAgICAob25OYXZpZ2F0ZVJpZ2h0KT0ib25OYXZpZ2F0ZVJpZ2h0KCkiXG4gICAgICAob25FeGVjdXRpb25EaWdlc3RDbGlja2VkKT0ib25FeGVjdXRpb25EaWdlc3RDbGlja2VkKCRldmVudCkiXG4gICAgICAob25TbGlkZXJDaGFuZ2UpPSJvblNsaWRlckNoYW5nZSgkZXZlbnQpIlxuICAgID48L3RpbWVsaW5lLWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NvbnN0IFNLPWZ1bmN0aW9uKHQpe3JldHVyblt0XX07Y2xhc3MgREt7Y29uc3RydWN0b3IoKXt0aGlzLm9uT3BOYW1lQ2xpY2s9bmV3IExofX1mdW5jdGlvbiBFSyh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsImRpdiIsMTMpLFJtKDEsImRpdiIsMTQpLGt1KDIpLEFtKCksUm0oMywiZ3JhcGgtb3AiLDE1KSxWbSgib25PcE5hbWVDbGljayIsKGZ1bmN0aW9uIGUobil7aGkodCk7Y29uc3Qgbz1ZbSgzKTtyZXR1cm4gby5vbkdyYXBoT3BOYXZpZ2F0ZS5lbWl0KHtvcF9uYW1lOm4ub3BfbmFtZSxncmFwaF9pZDpvLmdyYXBoSWR9KX0pKSxBbSgpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49ZS5pbmRleDtyYygyKSxEdSgiSW5wdXQgc2xvdCAiLG4sIjoiKSxyYygxKSxEbSgia2luZCIsImlucHV0IikoIm9wTmFtZSIsdC5vcF9uYW1lKSgic2xvdCIsdC5vdXRwdXRfc2xvdCkoIm9wRGF0YSIsdC5kYXRhKX19ZnVuY3Rpb24gUksodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDExKSxSbSgxLCJkaXYiKSxRcCgyLEVLLDQsNSwiZGl2IiwxMiksQW0oKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMik7cmMoMiksRG0oIm5nRm9yT2YiLHQuaW5wdXRPcHMpfX1mdW5jdGlvbiBBSyh0LGUpezEmdCYmKFJtKDAsImRpdiIsMTYpLGt1KDEsIiAoVGhpcyBvcCBoYXMgbm8gaW5wdXQgdGVuc29yLikgIiksQW0oKSl9ZnVuY3Rpb24gVEsodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDIzKSxSbSgxLCJncmFwaC1vcCIsMTUpLFZtKCJvbk9wTmFtZUNsaWNrIiwoZnVuY3Rpb24gZShuKXtoaSh0KTtjb25zdCBvPVltKDQpO3JldHVybiBvLm9uR3JhcGhPcE5hdmlnYXRlLmVtaXQoe29wX25hbWU6bi5vcF9uYW1lLGdyYXBoX2lkOm8uZ3JhcGhJZH0pfSkpLEFtKCksQW0oKX1pZigyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQ7cmMoMSksRG0oImtpbmQiLCJjb25zdW1lciIpKCJvcE5hbWUiLHQub3BfbmFtZSkoInNsb3QiLHQuaW5wdXRfc2xvdCkoIm9wRGF0YSIsdC5kYXRhKX19ZnVuY3Rpb24gTksodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDE5KSxSbSgxLCJkaXYiLDIwKSxrdSgyKSxSbSgzLCJzcGFuIiksdGcoNCwyMSksQW0oKSxrdSg1LCIpICIpLEFtKCksUXAoNixUSywyLDQsImRpdiIsMjIpLEFtKCkpLDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdCxuPWUuaW5kZXg7cmMoMiksRXUoIiBPdXRwdXQgc2xvdCAiLG4sIjogKCIsdC5sZW5ndGgsIiAiKSxyYygyKSxlZyh0Lmxlbmd0aCksbmcoNCkscmMoMiksRG0oIm5nRm9yT2YiLHQpfX1mdW5jdGlvbiB6Syh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsMTcpLFJtKDEsImRpdiIpLFFwKDIsTkssNyw0LCJkaXYiLDE4KSxBbSgpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgyKTtyYygyKSxEbSgibmdGb3JPZiIsdC5jb25zdW1lck9wcyl9fWZ1bmN0aW9uIElLKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2IiwyNCksa3UoMSksUm0oMiwic3BhbiIpLHRnKDMsMjUpLEFtKCksa3UoNCwiIGFuZCBubyBjb25zdW1lci4pICIpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgyKTtyYygxKSxEdSgiIChUaGlzIG9wIGhhcyAiLHQub3BJbmZvLmNvbnN1bWVycy5sZW5ndGgsIiBvdXRwdXQgIikscmMoMiksZWcodC5vcEluZm8uY29uc3VtZXJzLmxlbmd0aCksbmcoMyl9fWZ1bmN0aW9uIEhLKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2IiksUXAoMSxSSywzLDEsImRpdiIsNCksUXAoMixBSywyLDAsIm5nLXRlbXBsYXRlIixudWxsLDUsaWIpLFJtKDQsImRpdiIsNiksUm0oNSwiZGl2Iiw3KSxrdSg2LCJPcDoiKSxBbSgpLFJtKDcsImdyYXBoLW9wIiw4KSxWbSgib25PcE5hbWVDbGljayIsKGZ1bmN0aW9uIGUobil7aGkodCk7Y29uc3Qgbz1ZbSgpO3JldHVybiBvLm9uR3JhcGhPcE5hdmlnYXRlLmVtaXQoe29wX25hbWU6bi5vcF9uYW1lLGdyYXBoX2lkOm8uZ3JhcGhJZH0pfSkpLEFtKCksQW0oKSxRcCg4LHpLLDMsMSwiZGl2Iiw5KSxRcCg5LElLLDUsMiwibmctdGVtcGxhdGUiLG51bGwsMTAsaWIpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PSRwKDMpLGU9JHAoMTApLG49WW0oKTtyYygxKSxEbSgibmdJZiIsbi5pbnB1dE9wcy5sZW5ndGg+MCkoIm5nSWZFbHNlIix0KSxyYyg2KSxEbSgia2luZCIsInNlbGYiKSgib3BOYW1lIixuLm9wSW5mby5vcF9uYW1lKSgib3BEYXRhIixuLm9wSW5mbykscmMoMSksRG0oIm5nSWYiLG4udG90YWxOdW1Db25zdW1lcnM+MCkoIm5nSWZFbHNlIixlKX19ZnVuY3Rpb24gRksodCxlKXsxJnQmJihSbSgwLCJzcGFuIiwyNiksa3UoMSwiIChPcCBpbmZvIHVuYXZhaWxhYmxlLikgIiksQW0oKSl9ZnVuY3Rpb24gTEsodCxlKXsxJnQmJihSbSgwLCJkaXYiLDI3KSxrdSgxLCIgTm8gZ3JhcGggb3Agc2VsZWN0ZWQuIENsaWNrIGEgdGVuc29yIG5hbWUgaW4gdGhlIEdyYXBoIEV4ZWN1dGlvbnMgdGFibGUgdG8gdmlldyB0aGUgbmVpZ2hib3Job29kIG9mIHRoZSB0ZW5zb3IncyBvcCBpbiBpdHMgZ3JhcGguICIpLEFtKCkpfURLLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxESyl9LERLLsm1Y21wPXRvKHt0eXBlOkRLLHNlbGVjdG9yczpbWyJncmFwaC1vcCJdXSxpbnB1dHM6e2tpbmQ6ImtpbmQiLG9wTmFtZToib3BOYW1lIixzbG90OiJzbG90IixvcERhdGE6Im9wRGF0YSJ9LG91dHB1dHM6e29uT3BOYW1lQ2xpY2s6Im9uT3BOYW1lQ2xpY2sifSxkZWNsczo5LHZhcnM6Nyxjb25zdHM6W1sxLCJvcC1jb250YWluZXIiXSxbMSwiaW5wdXQtdGVuc29yLW5hbWUiXSxbMSwib3AtbmFtZSIsMywibmdDbGFzcyIsImNsaWNrIl0sWyJjbGFzcyIsInNsb3QiLDQsIm5nSWYiXSxbImNsYXNzIiwib3AtdHlwZSIsNCwibmdJZiIsIm5nSWZFbHNlIl0sWyJvcEluZm9NaXNzaW5nIiwiIl0sWzEsInNsb3QiXSxbMywibmdTd2l0Y2giXSxbNCwibmdTd2l0Y2hDYXNlIl0sWzEsIm9wLXR5cGUiXSxbMSwib3AtaW5mby1taXNzaW5nIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihSbSgwLCJidXR0b24iLDApLFJtKDEsImRpdiIsMSksUm0oMiwiYnV0dG9uIiwyKSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25PcE5hbWVDbGljay5lbWl0KHtvcF9uYW1lOm4ub3BOYW1lfSl9KSksUm0oMywic3BhbiIpLGt1KDQpLEFtKCksQW0oKSxRcCg1LFBLLDUsNCwiZGl2IiwzKSxBbSgpLFFwKDYsd0ssMiwxLCJkaXYiLDQpLFFwKDcsa0ssMiwwLCJuZy10ZW1wbGF0ZSIsbnVsbCw1LGliKSxBbSgpKSwyJmUpe2NvbnN0IHQ9JHAoOCk7cmMoMiksRG0oIm5nQ2xhc3MiLE1oKDUsU0ssInNlbGYiPT09bi5raW5kPyJzZWxmLW9wLW5hbWUiOiIiKSkscmMoMiksU3Uobi5vcE5hbWUpLHJjKDEpLERtKCJuZ0lmIiwic2VsZiIhPT1uLmtpbmQpLHJjKDEpLERtKCJuZ0lmIix2b2lkIDAhPT1uLm9wRGF0YSkoIm5nSWZFbHNlIix0KX19LGRpcmVjdGl2ZXM6W2FNLGRNLGZNLGdNXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ub3AtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm9wLW5hbWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZC1jb2xvcjppbmhlcml0fS5vcC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjoycHggc29saWQgI2ViZWJlYjtib3JkZXItcmFkaXVzOjRweDtib3gtc2hhZG93OjFweCAzcHggI2VlZTtjdXJzb3I6cG9pbnRlcjttYXJnaW46MCA1cHggMCAwO3BhZGRpbmc6MnB4IDZweDt0ZXh0LWFsaWduOnJpZ2h0O3dpZHRoOjIwMHB4fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5vcC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAub3AtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MnB4IHNvbGlkICM1NTV9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLm9wLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5vcC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MXB4IDNweCAjNzU3NTc1fS5vcC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3Vze291dGxpbmU6MH0ub3AtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcntib3JkZXI6MnB4IHNvbGlkICNmZmQzYjJ9Lm9wLWluZm8tbWlzc2luZ1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Z3JheX0ub3AtbmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOm5vbmU7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7b3ZlcmZsb3ctd3JhcDphbnl3aGVyZTtwYWRkaW5nOjA7dGV4dC1hbGlnbjpyaWdodDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO3doaXRlLXNwYWNlOnByZS13cmFwfS5vcC1uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tvdXRsaW5lOjB9Lm9wLXR5cGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2VjZWZmMTtib3JkZXI6MXB4IHNvbGlkICNlYmViZWI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1mYW1pbHk6IlJvYm90byBNb25vIixtb25vc3BhY2U7Zm9udC1zaXplOjEwcHg7aGVpZ2h0OjE0cHg7bGluZS1oZWlnaHQ6MTRweDtwYWRkaW5nOjFweCAzcHg7d2lkdGg6bWF4LWNvbnRlbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDozcHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLm9wLXR5cGVbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAub3AtdHlwZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjFweCBzb2xpZCAjNTU1fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5vcC10eXBlW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLm9wLXR5cGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzQ1NWE2NH0uc2VsZi1vcC1uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpib2xkO3RleHQtZGVjb3JhdGlvbjpub25lfS5zbG90W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5zbG90W19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLnNsb3RbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfSddfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChESyxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJncmFwaC1vcCIsdGVtcGxhdGVVcmw6ImdyYXBoX29wX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyIuL2dyYXBoX29wX2NvbXBvbmVudC5jc3MiXX1dfV0sbnVsbCx7a2luZDpbe3R5cGU6eHl9XSxvcE5hbWU6W3t0eXBlOnh5fV0sc2xvdDpbe3R5cGU6eHl9XSxvcERhdGE6W3t0eXBlOnh5fV0sb25PcE5hbWVDbGljazpbe3R5cGU6T3l9XX0pO2NsYXNzIEJLe2NvbnN0cnVjdG9yKCl7dGhpcy5vbkdyYXBoT3BOYXZpZ2F0ZT1uZXcgTGh9Z2V0IGdyYXBoSWQoKXtyZXR1cm4gdGhpcy5vcEluZm8uZ3JhcGhfaWRzW3RoaXMub3BJbmZvLmdyYXBoX2lkcy5sZW5ndGgtMV19Z2V0IHRvdGFsTnVtQ29uc3VtZXJzKCl7cmV0dXJuIHRoaXMuY29uc3VtZXJPcHMucmVkdWNlKCgodCxlKT0+dCtlLmxlbmd0aCksMCl9fUJLLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxCSyl9LEJLLsm1Y21wPXRvKHt0eXBlOkJLLHNlbGVjdG9yczpbWyJncmFwaC1jb21wb25lbnQiXV0saW5wdXRzOntvcEluZm86Im9wSW5mbyIsaW5wdXRPcHM6ImlucHV0T3BzIixjb25zdW1lck9wczoiY29uc3VtZXJPcHMifSxvdXRwdXRzOntvbkdyYXBoT3BOYXZpZ2F0ZToib25HcmFwaE9wTmF2aWdhdGUifSxkZWNsczo5LHZhcnM6Mixjb25zdHM6ZnVuY3Rpb24oKXtsZXQgdCxlLG4sbztyZXR1cm4gdD0idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZT9nb29nLmdldE1zZygie1ZBUl9QTFVSQUwsIHBsdXJhbCwgPTAge2NvbnN1bWVyfSA9MSB7Y29uc3VtZXJ9IG90aGVyIHtjb25zdW1lcnN9fSIpOiRsb2NhbGl6ZWA64pCfZmU1NWY5YjE5M2VhMjBhYWU1YjU2MzVlNjhkOTM4NjUwMzg0Nzc0NuKQnzQ5NTUxMzM3NDA4NDEyOTk4NTE6e1ZBUl9QTFVSQUwsIHBsdXJhbCwgPTAge2NvbnN1bWVyfSA9MSB7Y29uc3VtZXJ9IG90aGVyIHtjb25zdW1lcnN9fWAsdD1vZyh0LHtWQVJfUExVUkFMOiLvv70w77+9In0pLGU9InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSYmbmdJMThuQ2xvc3VyZU1vZGU/Z29vZy5nZXRNc2coIiB7JGljdX0iLHtpY3U6dH0pOiRsb2NhbGl6ZWA64pCfYmFhNDYwZTJmMmI4NTdlMjYyOTJiMjQ2ZmMxOGFlMGVhOWI1ZTUzN+KQnzU1NTYzNDAzNDM4NTAxNjU1MTY6ICR7dH06SUNVOmAsbj0idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZT9nb29nLmdldE1zZygie1ZBUl9QTFVSQUwsIHBsdXJhbCwgPTAge3RlbnNvcn0gPTEge3RlbnNvcn0gb3RoZXIge3RlbnNvcnN9fSIpOiRsb2NhbGl6ZWA64pCfNmFhNzVmNjI3ZTBkYzE2MTUwZWY0NDg0NjRlMGM4NTdhYWEwZGMxOOKQnzUxNTY3MTI5MzUxNTA1ODY4Nzg6e1ZBUl9QTFVSQUwsIHBsdXJhbCwgPTAge3RlbnNvcn0gPTEge3RlbnNvcn0gb3RoZXIge3RlbnNvcnN9fWAsbj1vZyhuLHtWQVJfUExVUkFMOiLvv70w77+9In0pLG89InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSYmbmdJMThuQ2xvc3VyZU1vZGU/Z29vZy5nZXRNc2coIiB7JGljdX0iLHtpY3U6bn0pOiRsb2NhbGl6ZWA64pCfODkzNDc2YzJjNDIxY2VlNDc2NjNjOTczMmZhNDFhNzUwZDNhNzNkZuKQnzI0NjA2NzA1MzczNTE2MjYzNDogJHtufTpJQ1U6YCxbWzEsImdyYXBoLXN0cnVjdHVyZS1jb250YWluZXIiXSxbNCwibmdJZiIsIm5nSWZFbHNlIl0sWyJvcEluZm9NaXNzaW5nIiwiIl0sWyJub09wRm9jdXNlZCIsIiJdLFsiY2xhc3MiLCJpbnB1dHMtY29udGFpbmVyIiw0LCJuZ0lmIiwibmdJZkVsc2UiXSxbIm5vSW5wdXRzIiwiIl0sWzEsInNlbGYtb3AtY29udGFpbmVyIl0sWzEsInNlbGYtb3AtaGVhZGVyIl0sWzMsImtpbmQiLCJvcE5hbWUiLCJvcERhdGEiLCJvbk9wTmFtZUNsaWNrIl0sWyJjbGFzcyIsImNvbnN1bWVycy1jb250YWluZXIiLDQsIm5nSWYiLCJuZ0lmRWxzZSJdLFsibm9Db25zdW1lcnMiLCIiXSxbMSwiaW5wdXRzLWNvbnRhaW5lciJdLFsiY2xhc3MiLCJpbnB1dC1vcC1zZWN0aW9uIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbMSwiaW5wdXQtb3Atc2VjdGlvbiJdLFsxLCJpbnB1dC1zbG90LWhlYWRlciJdLFszLCJraW5kIiwib3BOYW1lIiwic2xvdCIsIm9wRGF0YSIsIm9uT3BOYW1lQ2xpY2siXSxbMSwiaW5wdXRzLWNvbnRhaW5lciIsIm5vLWlucHV0cy1pbmRpY2F0b3IiXSxbMSwiY29uc3VtZXJzLWNvbnRhaW5lciJdLFsiY2xhc3MiLCJzbG90LWNvbnN1bWVycy1jb250YWluZXIiLDQsIm5nRm9yIiwibmdGb3JPZiJdLFsxLCJzbG90LWNvbnN1bWVycy1jb250YWluZXIiXSxbMSwic2xvdC1jb25zdW1lcnMtaGVhZGVyIl0sZSxbImNsYXNzIiwiY29uc3VtZXItc2VjdGlvbiIsNCwibmdGb3IiLCJuZ0Zvck9mIl0sWzEsImNvbnN1bWVyLXNlY3Rpb24iXSxbMSwib3AtY29uc3VtZXJzLWNvbnRhaW5lciJdLG8sWzEsIm9wLWluZm8tbWlzc2luZyJdLFsxLCJuby1vcC1mb2N1c2VkIl1dfSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoUm0oMCwiZGl2IiksUm0oMSwiZGl2Iiksa3UoMiwiR3JhcGggU3RydWN0dXJlIiksQW0oKSxSbSgzLCJkaXYiLDApLFFwKDQsSEssMTEsNywiZGl2IiwxKSxBbSgpLFFwKDUsRkssMiwwLCJuZy10ZW1wbGF0ZSIsbnVsbCwyLGliKSxRcCg3LExLLDIsMCwibmctdGVtcGxhdGUiLG51bGwsMyxpYiksQW0oKSksMiZlKXtjb25zdCB0PSRwKDgpO3JjKDQpLERtKCJuZ0lmIixudWxsIT1uLm9wSW5mbykoIm5nSWZFbHNlIix0KX19LGRpcmVjdGl2ZXM6W2RNLERLLGxNXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde292ZXJmbG93LXk6YXV0b30uY29uc3VtZXJzLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206NXB4O292ZXJmbG93LXg6YXV0bzt3aGl0ZS1zcGFjZTpub3dyYXB9LmNvbnN1bWVyLXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjVweCAwfS5ncmFwaC1zdHJ1Y3R1cmUtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtvdmVyZmxvdy15OmF1dG87d2hpdGUtc3BhY2U6bm93cmFwfS5pbnB1dHMtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMik7bWFyZ2luLXRvcDo1cHg7b3ZlcmZsb3cteDphdXRvO3BhZGRpbmctYm90dG9tOjA7d2hpdGUtc3BhY2U6bm93cmFwfS5pbnB1dC1vcC1zZWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQ6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKTtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tcmlnaHQ6NXB4O3BhZGRpbmctYm90dG9tOjVweH0uaW5wdXQtc2xvdC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjA5OTttYXJnaW4tYm90dG9tOjVweH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuaW5wdXQtc2xvdC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuaW5wdXQtc2xvdC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2U2NTEwMH0uaW5wdXQtdGVuc29yLW5hbWVbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwfS5uby1vcC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpncmF5O2ZvbnQtZmFtaWx5OiJSb2JvdG8iLEFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxM3B4O3doaXRlLXNwYWNlOm5vcm1hbH0uc2VsZi1vcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OmJvbGQ7bWFyZ2luLWJvdHRvbTo1cHh9LnNlbGYtb3AtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMik7cGFkZGluZy1ib3R0b206NXB4fS5zbG90LWNvbnN1bWVycy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodDoxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpO2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1yaWdodDo1cHg7cGFkZGluZy10b3A6NXB4O3ZlcnRpY2FsLWFsaWduOnRvcH0uc2xvdC1jb25zdW1lcnMtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXB9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEJLLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImdyYXBoLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vZ3JhcGhfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vZ3JhcGhfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse29wSW5mbzpbe3R5cGU6eHl9XSxpbnB1dE9wczpbe3R5cGU6eHl9XSxjb25zdW1lck9wczpbe3R5cGU6eHl9XSxvbkdyYXBoT3BOYXZpZ2F0ZTpbe3R5cGU6T3l9XX0pO2NsYXNzIFZLe2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLm9wSW5mbyQ9dGhpcy5zdG9yZS5waXBlKEZ3KGVYKSksdGhpcy5pbnB1dE9wcyQ9dGhpcy5zdG9yZS5waXBlKEZ3KG5YKSksdGhpcy5jb25zdW1lck9wcyQ9dGhpcy5zdG9yZS5waXBlKEZ3KGlYKSl9b25HcmFwaE9wTmF2aWdhdGUodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChuWih0KSl9fWZ1bmN0aW9uIGpLKHQsZSl7MSZ0JiYoUm0oMCwiZGl2IiwxMiksa3UoMSwi4pa2IiksQW0oKSl9VksuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFZLKShTbShJdykpfSxWSy7JtWNtcD10byh7dHlwZTpWSyxzZWxlY3RvcnM6W1sidGYtZGVidWdnZXItdjItZ3JhcGgiXV0sZGVjbHM6NCx2YXJzOjksY29uc3RzOltbMywib3BJbmZvIiwiaW5wdXRPcHMiLCJjb25zdW1lck9wcyIsIm9uR3JhcGhPcE5hdmlnYXRlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJncmFwaC1jb21wb25lbnQiLDApLFZtKCJvbkdyYXBoT3BOYXZpZ2F0ZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25HcmFwaE9wTmF2aWdhdGUoZSl9KSksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQW0oKSksMiZlJiZEbSgib3BJbmZvIixUaCgxLDMsbi5vcEluZm8kKSkoImlucHV0T3BzIixUaCgyLDUsbi5pbnB1dE9wcyQpKSgiY29uc3VtZXJPcHMiLFRoKDMsNyxuLmNvbnN1bWVyT3BzJCkpfSxkaXJlY3RpdmVzOltCS10scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFZLLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InRmLWRlYnVnZ2VyLXYyLWdyYXBoIix0ZW1wbGF0ZTonXG4gICAgPGdyYXBoLWNvbXBvbmVudFxuICAgICAgW29wSW5mb109Im9wSW5mbyQgfCBhc3luYyJcbiAgICAgIFtpbnB1dE9wc109ImlucHV0T3BzJCB8IGFzeW5jIlxuICAgICAgW2NvbnN1bWVyT3BzXT0iY29uc3VtZXJPcHMkIHwgYXN5bmMiXG4gICAgICAob25HcmFwaE9wTmF2aWdhdGUpPSJvbkdyYXBoT3BOYXZpZ2F0ZSgkZXZlbnQpIlxuICAgID48L2dyYXBoLWNvbXBvbmVudD5cbiAgJ31dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSxudWxsKTtjb25zdCBVSz1mdW5jdGlvbih0LGUpe3JldHVybnt0ZW5zb3JEZWJ1Z01vZGU6dCxhcnJheTplfX07ZnVuY3Rpb24gR0sodCxlKXtpZigxJnQmJlRtKDAsImRlYnVnLXRlbnNvci12YWx1ZSIsMTcpLDImdCl7Y29uc3QgdD1ZbSgyKS4kaW1wbGljaXQsZT1ZbSgyKTtEbSgiZGVidWdUZW5zb3JWYWx1ZSIsZS5wYXJzZURlYnVnVGVuc29yVmFsdWUodmgoMSxVSyxlLmdyYXBoRXhlY3V0aW9uRGF0YVt0XS50ZW5zb3JfZGVidWdfbW9kZSxlLmdyYXBoRXhlY3V0aW9uRGF0YVt0XS5kZWJ1Z190ZW5zb3JfdmFsdWUpKSl9fWZ1bmN0aW9uIFdLKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2IiksUm0oMSwiZGl2IiwxMyksUm0oMiwiYnV0dG9uIiwxNCksVm0oImNsaWNrIiwoZnVuY3Rpb24gZSgpe2hpKHQpO2NvbnN0IG49WW0oKS4kaW1wbGljaXQsbz1ZbSgyKTtyZXR1cm4gby5vblRlbnNvck5hbWVDbGljay5lbWl0KHtpbmRleDpuLGdyYXBoX2lkOm8uZ3JhcGhFeGVjdXRpb25EYXRhW25dLmdyYXBoX2lkLG9wX25hbWU6by5ncmFwaEV4ZWN1dGlvbkRhdGFbbl0ub3BfbmFtZX0pfSkpLGt1KDMpLEFtKCksUm0oNCwiZGl2IiwxNSksa3UoNSksQW0oKSxBbSgpLFFwKDYsR0ssMSw0LCJkZWJ1Zy10ZW5zb3ItdmFsdWUiLDE2KSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgpLiRpbXBsaWNpdCxlPVltKDIpO3JjKDIpLEttKCJ0aXRsZSIsZS5nZXRUZW5zb3JOYW1lKHQpKSxyYygxKSxEdSgiICIsZS5nZXRUZW5zb3JOYW1lKHQpLCIgIikscmMoMiksU3UoZS5ncmFwaEV4ZWN1dGlvbkRhdGFbdF0ub3BfdHlwZSkscmMoMSksRG0oIm5nSWYiLG51bGwhPT1lLmdyYXBoRXhlY3V0aW9uRGF0YVt0XS5kZWJ1Z190ZW5zb3JfdmFsdWUpfX1mdW5jdGlvbiBZSyh0LGUpezEmdCYmKFJtKDAsImRpdiIsMTgpLGt1KDEsIiBMb2FkaW5nLi4uICIpLEFtKCkpfWNvbnN0IHFLPWZ1bmN0aW9uKHQpe3JldHVybnsiaW5wdXQtb2YtZm9jdXMiOnR9fTtmdW5jdGlvbiBaSyh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsNSksUm0oMSwiZGl2Iiw2KSxSbSgyLCJkaXYiLDcpLFFwKDMsakssMiwwLCJkaXYiLDgpLGt1KDQpLEFtKCksUXAoNSxXSyw3LDQsImRpdiIsOSksUXAoNixZSywyLDAsIm5nLXRlbXBsYXRlIiwxMCwxMSxpYiksQW0oKSxBbSgpKSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQsbj0kcCg3KSxvPVltKDIpO3JjKDEpLERtKCJuZ0NsYXNzIixNaCg1LHFLLG8uaXNJbnB1dE9mRm9jdXModCkpKSxyYygyKSxEbSgibmdJZiIsdD09PW8uZm9jdXNJbmRleCkscmMoMSksRHUoIiAiLHQsIiAiKSxyYygxKSxEbSgibmdJZiIsby5ncmFwaEV4ZWN1dGlvbkRhdGFbdF0pKCJuZ0lmRWxzZSIsbil9fWZ1bmN0aW9uIFhLKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0IiwzKSxWbSgic2Nyb2xsZWRJbmRleENoYW5nZSIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkub25TY3JvbGxlZEluZGV4Q2hhbmdlLmVtaXQobil9KSksUXAoMSxaSyw4LDcsImRpdiIsNCksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKTtyYygxKSxEbSgiY2RrVmlydHVhbEZvck9mIix0LmdyYXBoRXhlY3V0aW9uSW5kaWNlcyl9fWNsYXNzIEtLe2NvbnN0cnVjdG9yKCl7dGhpcy5vblNjcm9sbGVkSW5kZXhDaGFuZ2U9bmV3IExoLHRoaXMub25UZW5zb3JOYW1lQ2xpY2s9bmV3IExoLHRoaXMucGFyc2VEZWJ1Z1RlbnNvclZhbHVlPUhYLHRoaXMuVEVTVF9PTkxZPXtnZXRWaWV3UG9ydDooKT0+dGhpcy52aWV3UG9ydH19bmdPbkNoYW5nZXModCl7aWYodGhpcy52aWV3UG9ydCYmdC5mb2N1c0luZGV4JiZudWxsIT09dC5mb2N1c0luZGV4LmN1cnJlbnRWYWx1ZSl7Y29uc3QgZT10aGlzLnZpZXdQb3J0LmdldFJlbmRlcmVkUmFuZ2UoKSxuPXQuZm9jdXNJbmRleC5jdXJyZW50VmFsdWUsbz1NYXRoLnJvdW5kKChlLmVuZC1lLnN0YXJ0KS8zKSxpPU1hdGgubWF4KG4tbywwKTt0aGlzLnZpZXdQb3J0LnNjcm9sbFRvSW5kZXgoaSxuPj1lLnN0YXJ0JiZuPGUuZW5kPyJzbW9vdGgiOnZvaWQgMCl9fWdldFRlbnNvck5hbWUodCl7cmV0dXJuYCR7dGhpcy5ncmFwaEV4ZWN1dGlvbkRhdGFbdF0ub3BfbmFtZX06JHt0aGlzLmdyYXBoRXhlY3V0aW9uRGF0YVt0XS5vdXRwdXRfc2xvdH1gfWlzSW5wdXRPZkZvY3VzKHQpe3JldHVybiBudWxsIT09dGhpcy5mb2N1c0lucHV0SW5kaWNlcyYmdGhpcy5mb2N1c0lucHV0SW5kaWNlcy5pbmNsdWRlcyh0KX19S0suybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEtLKX0sS0suybVjbXA9dG8oe3R5cGU6S0ssc2VsZWN0b3JzOltbImdyYXBoLWV4ZWN1dGlvbnMtY29tcG9uZW50Il1dLHZpZXdRdWVyeTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiZRaChnRiw1KSwyJmUpe2xldCB0O0poKHQ9dGIoKSkmJihuLnZpZXdQb3J0PXQuZmlyc3QpfX0saW5wdXRzOntudW1HcmFwaEV4ZWN1dGlvbnM6Im51bUdyYXBoRXhlY3V0aW9ucyIsZ3JhcGhFeGVjdXRpb25EYXRhOiJncmFwaEV4ZWN1dGlvbkRhdGEiLGdyYXBoRXhlY3V0aW9uSW5kaWNlczoiZ3JhcGhFeGVjdXRpb25JbmRpY2VzIixmb2N1c0luZGV4OiJmb2N1c0luZGV4Iixmb2N1c0lucHV0SW5kaWNlczoiZm9jdXNJbnB1dEluZGljZXMifSxvdXRwdXRzOntvblNjcm9sbGVkSW5kZXhDaGFuZ2U6Im9uU2Nyb2xsZWRJbmRleENoYW5nZSIsb25UZW5zb3JOYW1lQ2xpY2s6Im9uVGVuc29yTmFtZUNsaWNrIn0sZmVhdHVyZXM6W0JvXSxkZWNsczo0LHZhcnM6Mixjb25zdHM6W1sxLCJncmFwaC1leGVjdXRpb25zLWNvbnRhaW5lciJdLFsxLCJncmFwaC1leGVjdXRpb25zLXRpdGxlIl0sWyJpdGVtU2l6ZSIsIjM4IiwiY2xhc3MiLCJncmFwaC1leGVjdXRpb25zLXZpZXdwb3J0IiwzLCJzY3JvbGxlZEluZGV4Q2hhbmdlIiw0LCJuZ0lmIl0sWyJpdGVtU2l6ZSIsIjM4IiwxLCJncmFwaC1leGVjdXRpb25zLXZpZXdwb3J0IiwzLCJzY3JvbGxlZEluZGV4Q2hhbmdlIl0sWyJjbGFzcyIsInRlbnNvci1jb250YWluZXIiLDQsImNka1ZpcnR1YWxGb3IiLCJjZGtWaXJ0dWFsRm9yT2YiXSxbMSwidGVuc29yLWNvbnRhaW5lciJdLFsxLCJ0ZW5zb3ItaXRlbSIsMywibmdDbGFzcyJdLFsxLCJncmFwaC1leGVjdXRpb24taW5kZXgiXSxbImNsYXNzIiwiZ3JhcGgtZXhlY3V0aW9uLWZvY3VzIiw0LCJuZ0lmIl0sWzQsIm5nSWYiLCJuZ0lmRWxzZSJdLFsiY2xhc3MiLCJ0ZW5zb3ItaXRlbSJdLFsiZGF0YUxvYWRpbmciLCIiXSxbMSwiZ3JhcGgtZXhlY3V0aW9uLWZvY3VzIl0sWzEsInRlbnNvci1uYW1lLWFuZC1vcC10eXBlIl0sWzEsInRlbnNvci1uYW1lIiwzLCJ0aXRsZSIsImNsaWNrIl0sWzEsIm9wLXR5cGUiXSxbMywiZGVidWdUZW5zb3JWYWx1ZSIsNCwibmdJZiJdLFszLCJkZWJ1Z1RlbnNvclZhbHVlIl0sWzEsImxvYWRpbmctc3Bpbm5lciJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiZGl2IiwwKSxSbSgxLCJkaXYiLDEpLGt1KDIpLEFtKCksUXAoMyxYSywyLDEsImNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCIsMiksQW0oKSksMiZlJiYocmMoMiksRHUoIiBHcmFwaCBFeGVjdXRpb25zICgiLG4ubnVtR3JhcGhFeGVjdXRpb25zLCIpICIpLHJjKDEpLERtKCJuZ0lmIixudWxsIT09bi5udW1HcmFwaEV4ZWN1dGlvbnMmJm4ubnVtR3JhcGhFeGVjdXRpb25zPjApKX0sZGlyZWN0aXZlczpbZE0sZ0YsZEYsYkYsYU0sYUtdLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5ncmFwaC1leGVjdXRpb25zLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNlYmViZWI7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtoZWlnaHQ6MTAwJTttYXJnaW4tbGVmdDo4cHg7cGFkZGluZy1sZWZ0OjEwcHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmdyYXBoLWV4ZWN1dGlvbnMtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmdyYXBoLWV4ZWN1dGlvbnMtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDoxcHggc29saWQgIzU1NX0uZ3JhcGgtZXhlY3V0aW9uLWZvY3VzW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmlubGluZS1ibG9ja30uZ3JhcGgtZXhlY3V0aW9uLWluZGV4W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmctcmlnaHQ6NHB4O3RleHQtYWxpZ246cmlnaHQ7d2lkdGg6NDBweH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuZ3JhcGgtZXhlY3V0aW9uLWluZGV4W19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmdyYXBoLWV4ZWN1dGlvbi1pbmRleFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9LmdyYXBoLWV4ZWN1dGlvbnMtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MCA1cHggM3B4IC0zcHggI2NjYztwYWRkaW5nLWJvdHRvbTo1cHh9LmdyYXBoLWV4ZWN1dGlvbnMtdmlld3BvcnRbX25nY29udGVudC0lQ09NUCVde2ZsZXgtZ3JvdzoxO2ZvbnQtc2l6ZToxMnB4O3dpZHRoOjEwMCU7b3ZlcmZsb3cteDpoaWRkZW59LmlucHV0LW9mLWZvY3VzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmYwOTl9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmlucHV0LW9mLWZvY3VzW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmlucHV0LW9mLWZvY3VzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlNjUxMDB9LmxvYWRpbmctc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTppbmxpbmUtYmxvY2t9Lm9wLXR5cGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2VjZWZmMTtib3JkZXI6MXB4IHNvbGlkICNlYmViZWI7Ym9yZGVyLXJhZGl1czo0cHg7Zm9udC1mYW1pbHk6IlJvYm90byBNb25vIixtb25vc3BhY2U7Zm9udC1zaXplOjEwcHg7aGVpZ2h0OjE0cHg7bGluZS1oZWlnaHQ6MTRweDtwYWRkaW5nOjFweCAzcHg7d2lkdGg6bWF4LWNvbnRlbnQ7ZGlyZWN0aW9uOnJ0bDtkaXNwbGF5OmJsb2NrfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5vcC10eXBlW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLm9wLXR5cGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjoxcHggc29saWQgIzU1NX1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAub3AtdHlwZVtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5vcC10eXBlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiM0NTVhNjR9LnRlbnNvci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCV9LnRlbnNvci1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmViO2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6bm93cmFwO2hlaWdodDozOHB4O2xpbmUtaGVpZ2h0OjM4cHg7dGV4dC1hbGlnbjpsZWZ0O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTt3aGl0ZS1zcGFjZTpub3dyYXA7d2lkdGg6MTAwJX1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAudGVuc29yLWl0ZW1bX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAudGVuc29yLWl0ZW1bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkICM1NTV9LnRlbnNvci1uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlcjpub25lO2JveC1zaXppbmc6Ym9yZGVyLWJveDtjb2xvcjppbmhlcml0O2N1cnNvcjpwb2ludGVyO2RpcmVjdGlvbjpydGw7ZGlzcGxheTpibG9jaztoZWlnaHQ6MTZweDtsaW5lLWhlaWdodDoxNnB4O21hcmdpbjoycHggMCAxcHg7bWF4LXdpZHRoOmNhbGMoMTAwJSAtIDJweCk7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MCAycHg7dGV4dC1hbGlnbjpyaWdodDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwfS50ZW5zb3ItbmFtZVtfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7b3V0bGluZToxcHggc29saWQgI2M2Y2FkMX0udGVuc29yLW5hbWUtYW5kLW9wLXR5cGVbX25nY29udGVudC0lQ09NUCVde2RpcmVjdGlvbjpydGw7ZGlzcGxheTppbmxpbmUtYmxvY2s7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmctcmlnaHQ6OHB4O3RleHQtYWxpZ246cmlnaHQ7d2lkdGg6MjQwcHh9ZGVidWctdGVuc29yLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW46MnB4IDB9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEtLLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImdyYXBoLWV4ZWN1dGlvbnMtY29tcG9uZW50Iix0ZW1wbGF0ZVVybDoiLi9ncmFwaF9leGVjdXRpb25zX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyIuL2dyYXBoX2V4ZWN1dGlvbnNfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse251bUdyYXBoRXhlY3V0aW9uczpbe3R5cGU6eHl9XSxncmFwaEV4ZWN1dGlvbkRhdGE6W3t0eXBlOnh5fV0sZ3JhcGhFeGVjdXRpb25JbmRpY2VzOlt7dHlwZTp4eX1dLGZvY3VzSW5kZXg6W3t0eXBlOnh5fV0sZm9jdXNJbnB1dEluZGljZXM6W3t0eXBlOnh5fV0sb25TY3JvbGxlZEluZGV4Q2hhbmdlOlt7dHlwZTpPeX1dLG9uVGVuc29yTmFtZUNsaWNrOlt7dHlwZTpPeX1dLHZpZXdQb3J0Olt7dHlwZTpaYSxhcmdzOltnRix7c3RhdGljOiExfV19XX0pO2NsYXNzIEpLe2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLm51bUdyYXBoRXhlY3V0aW9ucyQ9dGhpcy5zdG9yZS5waXBlKEZ3KFlaKSksdGhpcy5ncmFwaEV4ZWN1dGlvbkRhdGEkPXRoaXMuc3RvcmUucGlwZShGdyhRWikpLHRoaXMuZ3JhcGhFeGVjdXRpb25JbmRpY2VzJD10aGlzLnN0b3JlLnBpcGUoRncoWncoWVosKHQ9PjA9PT10P251bGw6QXJyYXkuZnJvbSh7bGVuZ3RoOnR9KS5tYXAoKCh0LGUpPT5lKSkpKSkpLHRoaXMuZm9jdXNJbmRleCQ9dGhpcy5zdG9yZS5waXBlKEZ3KCRaKSksdGhpcy5mb2N1c0lucHV0SW5kaWNlcyQ9dGhpcy5zdG9yZS5waXBlKEZ3KG9YKSl9b25TY3JvbGxlZEluZGV4Q2hhbmdlKHQpe3RoaXMuc3RvcmUuZGlzcGF0Y2godFooe2luZGV4OnR9KSl9b25UZW5zb3JOYW1lQ2xpY2sodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChlWih0KSl9fUpLLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxKSykoU20oSXcpKX0sSksuybVjbXA9dG8oe3R5cGU6Skssc2VsZWN0b3JzOltbInRmLWRlYnVnZ2VyLXYyLWdyYXBoLWV4ZWN1dGlvbnMiXV0sZGVjbHM6Nix2YXJzOjE1LGNvbnN0czpbWzMsIm51bUdyYXBoRXhlY3V0aW9ucyIsImdyYXBoRXhlY3V0aW9uRGF0YSIsImdyYXBoRXhlY3V0aW9uSW5kaWNlcyIsImZvY3VzSW5kZXgiLCJmb2N1c0lucHV0SW5kaWNlcyIsIm9uU2Nyb2xsZWRJbmRleENoYW5nZSIsIm9uVGVuc29yTmFtZUNsaWNrIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJncmFwaC1leGVjdXRpb25zLWNvbXBvbmVudCIsMCksVm0oIm9uU2Nyb2xsZWRJbmRleENoYW5nZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25TY3JvbGxlZEluZGV4Q2hhbmdlKGUpfSkpKCJvblRlbnNvck5hbWVDbGljayIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25UZW5zb3JOYW1lQ2xpY2soZSl9KSksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQWgoNCwiYXN5bmMiKSxBaCg1LCJhc3luYyIpLEFtKCkpLDImZSYmRG0oIm51bUdyYXBoRXhlY3V0aW9ucyIsVGgoMSw1LG4ubnVtR3JhcGhFeGVjdXRpb25zJCkpKCJncmFwaEV4ZWN1dGlvbkRhdGEiLFRoKDIsNyxuLmdyYXBoRXhlY3V0aW9uRGF0YSQpKSgiZ3JhcGhFeGVjdXRpb25JbmRpY2VzIixUaCgzLDksbi5ncmFwaEV4ZWN1dGlvbkluZGljZXMkKSkoImZvY3VzSW5kZXgiLFRoKDQsMTEsbi5mb2N1c0luZGV4JCkpKCJmb2N1c0lucHV0SW5kaWNlcyIsVGgoNSwxMyxuLmZvY3VzSW5wdXRJbmRpY2VzJCkpfSxkaXJlY3RpdmVzOltLS10scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEpLLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InRmLWRlYnVnZ2VyLXYyLWdyYXBoLWV4ZWN1dGlvbnMiLHRlbXBsYXRlOidcbiAgICA8Z3JhcGgtZXhlY3V0aW9ucy1jb21wb25lbnRcbiAgICAgIFtudW1HcmFwaEV4ZWN1dGlvbnNdPSJudW1HcmFwaEV4ZWN1dGlvbnMkIHwgYXN5bmMiXG4gICAgICBbZ3JhcGhFeGVjdXRpb25EYXRhXT0iZ3JhcGhFeGVjdXRpb25EYXRhJCB8IGFzeW5jIlxuICAgICAgW2dyYXBoRXhlY3V0aW9uSW5kaWNlc109ImdyYXBoRXhlY3V0aW9uSW5kaWNlcyQgfCBhc3luYyJcbiAgICAgIFtmb2N1c0luZGV4XT0iZm9jdXNJbmRleCQgfCBhc3luYyJcbiAgICAgIFtmb2N1c0lucHV0SW5kaWNlc109ImZvY3VzSW5wdXRJbmRpY2VzJCB8IGFzeW5jIlxuICAgICAgKG9uU2Nyb2xsZWRJbmRleENoYW5nZSk9Im9uU2Nyb2xsZWRJbmRleENoYW5nZSgkZXZlbnQpIlxuICAgICAgKG9uVGVuc29yTmFtZUNsaWNrKT0ib25UZW5zb3JOYW1lQ2xpY2soJGV2ZW50KSJcbiAgICA+PC9ncmFwaC1leGVjdXRpb25zLWNvbXBvbmVudD5cbiAgJ31dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSxudWxsKTtjb25zdCBRSz1mdW5jdGlvbiAkSygpe3JldHVybiB3aW5kb3d9O2Z1bmN0aW9uIHRKKHQpe2NvbnN0IGU9UUsoKS5yZXF1aXJlO3JldHVybiBuZXcgUHJvbWlzZSgobj0+e2UodCxuKX0pKX1mdW5jdGlvbiBlSigpe3JldHVybiBnQSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9UUsoKTtpZih2b2lkIDA9PT10Lm1vbmFjbyl7aWYoIXQucmVxdWlyZSl0aHJvdyBuZXcgRXJyb3IoImxvYWRNb25hY28oKSBmYWlsZWQgYmVjYXVzZSBmdW5jdGlvbiByZXF1aXJlKCkgaXMgdW5hdmFpbGFibGUiKTt0LnJlcXVpcmUuY29uZmlnKHtwYXRoczp7dnM6Ii90Zi1pbXBvcnRzL3ZzIn19KSx5aWVsZCB0SihbInZzL2VkaXRvci9lZGl0b3IubWFpbiJdKSx5aWVsZCB0SihbInZzL3B5dGhvbi9weXRob24uY29udHJpYnV0aW9uIl0pfX0pKX1mdW5jdGlvbiBuSih0KXtyZXR1cm4gdD8idnMtZGFyayI6InZzIn1jbGFzcyBvSntjb25zdHJ1Y3Rvcih0KXt0aGlzLnJlc2l6ZUV2ZW50RGVib3VuY2VQZXJpb2RJbk1zPTEwMCx0aGlzLm9uUmVzaXplPW5ldyBMaCx0aGlzLm5nVW5zdWJzY3JpYmUkPW5ldyBJLHRoaXMub25SZXNpemUkPW5ldyBJO2NvbnN0IGU9bmV3IFJlc2l6ZU9ic2VydmVyKCgoKT0+e3RoaXMub25SZXNpemUkLm5leHQoKX0pKTtlLm9ic2VydmUodC5uYXRpdmVFbGVtZW50KSx0aGlzLm5nVW5zdWJzY3JpYmUkLnN1YnNjcmliZSgoKCk9PntlLnVub2JzZXJ2ZSh0Lm5hdGl2ZUVsZW1lbnQpfSkpfW5nT25Jbml0KCl7dGhpcy5vblJlc2l6ZSQucGlwZShUZSgxKSxnZSh0aGlzLnJlc2l6ZUV2ZW50RGVib3VuY2VQZXJpb2RJbk1zKSxJZSh0aGlzLm5nVW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKCgoKT0+e3RoaXMub25SZXNpemUuZW1pdCgpfSkpfW5nT25EZXN0cm95KCl7dGhpcy5uZ1Vuc3Vic2NyaWJlJC5uZXh0KCksdGhpcy5uZ1Vuc3Vic2NyaWJlJC5jb21wbGV0ZSgpfX1vSi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8b0opKFNtKGhnKSl9LG9KLsm1ZGlyPWxvKHt0eXBlOm9KLHNlbGVjdG9yczpbWyIiLCJkZXRlY3RSZXNpemUiLCIiXV0saW5wdXRzOntyZXNpemVFdmVudERlYm91bmNlUGVyaW9kSW5NczoicmVzaXplRXZlbnREZWJvdW5jZVBlcmlvZEluTXMifSxvdXRwdXRzOntvblJlc2l6ZToib25SZXNpemUifX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgob0osW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2RldGVjdFJlc2l6ZV0ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9XX0pLHtyZXNpemVFdmVudERlYm91bmNlUGVyaW9kSW5Nczpbe3R5cGU6eHl9XSxvblJlc2l6ZTpbe3R5cGU6T3l9XX0pO2NvbnN0IGlKPVsiY29kZVZpZXdlckNvbnRhaW5lciJdO2NsYXNzIGFKe2NvbnN0cnVjdG9yKCl7dGhpcy5saW5lcz1udWxsLHRoaXMuZm9jdXNlZExpbmVubz1udWxsLHRoaXMubW9uYWNvPW51bGwsdGhpcy5lZGl0b3I9bnVsbCx0aGlzLmRlY29yYXRpb25zPVtdLHRoaXMuUkVTSVpFX0RFQk9VTkNFX0lOVEVSVkFMX01TPTUwfW9uUmVzaXplKCl7dGhpcy5lZGl0b3ImJnRoaXMuZWRpdG9yLmxheW91dCgpfW5nT25DaGFuZ2VzKHQpe3ZhciBlO2lmKG51bGw9PT10aGlzLm1vbmFjbylyZXR1cm47Y29uc3Qgbj10Lm1vbmFjbyYmbnVsbD09PXRoaXMuZWRpdG9yO251bGw9PT10aGlzLmVkaXRvciYmKHRoaXMuZWRpdG9yPXRoaXMubW9uYWNvLmVkaXRvci5jcmVhdGUodGhpcy5jb2RlVmlld2VyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQse3ZhbHVlOihudWxsIT09KGU9dGhpcy5saW5lcykmJnZvaWQgMCE9PWU/ZTpbXSkuam9pbigiXG4iKSxsYW5ndWFnZToicHl0aG9uIixyZWFkT25seTohMCxmb250U2l6ZToxMCxtaW5pbWFwOntlbmFibGVkOiEwfSx0aGVtZTpuSih0aGlzLnVzZURhcmtNb2RlKX0pKSx0LmxpbmVzJiZ0aGlzLmxpbmVzJiZ0aGlzLmVkaXRvci5zZXRWYWx1ZSh0aGlzLmxpbmVzLmpvaW4oIlxuIikpO2NvbnN0IG89bnx8dC5mb2N1c2VkTGluZW5vP3RoaXMuZm9jdXNlZExpbmVubzpudWxsO2lmKG8mJnRoaXMubGluZXMpe3RoaXMuZWRpdG9yLnJldmVhbExpbmVJbkNlbnRlcihvLHRoaXMubW9uYWNvLmVkaXRvci5TY3JvbGxUeXBlLlNtb290aCk7Y29uc3QgdD10aGlzLmxpbmVzW28tMV0ubGVuZ3RoO3RoaXMuZGVjb3JhdGlvbnM9dGhpcy5lZGl0b3IuZGVsdGFEZWNvcmF0aW9ucyh0aGlzLmRlY29yYXRpb25zLFt7cmFuZ2U6bmV3IHRoaXMubW9uYWNvLlJhbmdlKG8sMSxvLDEpLG9wdGlvbnM6e2lzV2hvbGVMaW5lOiEwLGxpbmVzRGVjb3JhdGlvbnNDbGFzc05hbWU6ImhpZ2hsaWdodC1ndXR0ZXIifX0se3JhbmdlOm5ldyB0aGlzLm1vbmFjby5SYW5nZShvLDEsbyx0KzEpLG9wdGlvbnM6e2lubGluZUNsYXNzTmFtZToiaGlnaGxpZ2h0LWxpbmUifX1dKX10LnVzZURhcmtNb2RlJiZ0aGlzLm1vbmFjby5lZGl0b3Iuc2V0VGhlbWUobkoodGhpcy51c2VEYXJrTW9kZSkpfX1hSi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8YUopfSxhSi7JtWNtcD10byh7dHlwZTphSixzZWxlY3RvcnM6W1sic291cmNlLWNvZGUtY29tcG9uZW50Il1dLHZpZXdRdWVyeTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiZRaChpSiw3LGhnKSwyJmUpe2xldCB0O0poKHQ9dGIoKSkmJihuLmNvZGVWaWV3ZXJDb250YWluZXI9dC5maXJzdCl9fSxpbnB1dHM6e2xpbmVzOiJsaW5lcyIsZm9jdXNlZExpbmVubzoiZm9jdXNlZExpbmVubyIsbW9uYWNvOiJtb25hY28iLHVzZURhcmtNb2RlOiJ1c2VEYXJrTW9kZSJ9LGZlYXR1cmVzOltCb10sZGVjbHM6Mix2YXJzOjEsY29uc3RzOltbImRldGVjdFJlc2l6ZSIsIiIsMSwiY29kZS12aWV3ZXItY29udGFpbmVyIiwzLCJyZXNpemVFdmVudERlYm91bmNlUGVyaW9kSW5NcyIsIm9uUmVzaXplIl0sWyJjb2RlVmlld2VyQ29udGFpbmVyIiwiIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJkaXYiLDAsMSksVm0oIm9uUmVzaXplIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uUmVzaXplKCl9KSksQW0oKSksMiZlJiZEbSgicmVzaXplRXZlbnREZWJvdW5jZVBlcmlvZEluTXMiLG4uUkVTSVpFX0RFQk9VTkNFX0lOVEVSVkFMX01TKX0sZGlyZWN0aXZlczpbb0pdLHN0eWxlczpbIi5jb2RlLXZpZXdlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG5bX25naG9zdC0lQ09NUCVdICAgICAuaGlnaGxpZ2h0LWd1dHRlciB7XG4gIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAxMTEsIDAsIDAuNyk7XG4gIHdpZHRoOiA1cHggIWltcG9ydGFudDtcbn1cblxuW19uZ2hvc3QtJUNPTVAlXSAgICAgLmhpZ2hsaWdodC1saW5lIHtcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDExMSwgMCwgMC4zKTtcbn0iXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoYUosW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3Rvcjoic291cmNlLWNvZGUtY29tcG9uZW50Iix0ZW1wbGF0ZVVybDoiLi9zb3VyY2VfY29kZV9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9zb3VyY2VfY29kZV9jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7bGluZXM6W3t0eXBlOnh5fV0sZm9jdXNlZExpbmVubzpbe3R5cGU6eHl9XSxtb25hY286W3t0eXBlOnh5fV0sdXNlRGFya01vZGU6W3t0eXBlOnh5fV0sY29kZVZpZXdlckNvbnRhaW5lcjpbe3R5cGU6WmEsYXJnczpbImNvZGVWaWV3ZXJDb250YWluZXIiLHtzdGF0aWM6ITAscmVhZDpoZ31dfV19KTtjbGFzcyBySntjb25zdHJ1Y3Rvcigpe3RoaXMubGluZXM9bnVsbCx0aGlzLmZvY3VzZWRMaW5lbm89bnVsbCx0aGlzLnVzZURhcmtNb2RlPSExLHRoaXMubW9uYWNvJD1udWxsfW5nT25Jbml0KCl7dGhpcy5tb25hY28kPUN0KGVKKCkpLnBpcGUoSXQoKCgpPT53aW5kb3cubW9uYWNvKSkpfX1mdW5jdGlvbiBzSih0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsNiksa3UoMSksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoMSksRHUoIiAiLHQuZm9jdXNlZFNvdXJjZUxpbmVTcGVjLmZpbGVfcGF0aCwiICIpfX1mdW5jdGlvbiBsSih0LGUpezEmdCYmKFJtKDAsImRpdiIsNyksa3UoMSwiIE5vIGZpbGUgc2VsZWN0ZWQuIENsaWNrIGEgbGluZSBudW1iZXIgaW4gdGhlIFN0YWNrIFRyYWNlIHNlY3Rpb24gdG8gc2hvdyB0aGUgc291cmNlIGNvZGUuICIpLEFtKCkpfWZ1bmN0aW9uIGNKKHQsZSl7aWYoMSZ0JiZUbSgwLCJzb3VyY2UtY29kZSIsOCksMiZ0KXtjb25zdCB0PVltKCk7RG0oImxpbmVzIix0LmZvY3VzZWRTb3VyY2VGaWxlQ29udGVudC5saW5lcykoImZvY3VzZWRMaW5lbm8iLHQuZm9jdXNlZFNvdXJjZUxpbmVTcGVjLmxpbmVubykoInVzZURhcmtNb2RlIix0LnVzZURhcmtNb2RlKX19ckouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHJKKX0sckouybVjbXA9dG8oe3R5cGU6ckosc2VsZWN0b3JzOltbInNvdXJjZS1jb2RlIl1dLGlucHV0czp7bGluZXM6ImxpbmVzIixmb2N1c2VkTGluZW5vOiJmb2N1c2VkTGluZW5vIix1c2VEYXJrTW9kZToidXNlRGFya01vZGUifSxkZWNsczoyLHZhcnM6Nixjb25zdHM6W1szLCJsaW5lcyIsImZvY3VzZWRMaW5lbm8iLCJtb25hY28iLCJ1c2VEYXJrTW9kZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwic291cmNlLWNvZGUtY29tcG9uZW50IiwwKSxBaCgxLCJhc3luYyIpKSwyJmUmJkRtKCJsaW5lcyIsbi5saW5lcykoImZvY3VzZWRMaW5lbm8iLG4uZm9jdXNlZExpbmVubykoIm1vbmFjbyIsVGgoMSw0LG4ubW9uYWNvJCkpKCJ1c2VEYXJrTW9kZSIsbi51c2VEYXJrTW9kZSl9LGRpcmVjdGl2ZXM6W2FKXSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246Mn0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgockosW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3Rvcjoic291cmNlLWNvZGUiLHRlbXBsYXRlOidcbiAgICA8c291cmNlLWNvZGUtY29tcG9uZW50XG4gICAgICBbbGluZXNdPSJsaW5lcyJcbiAgICAgIFtmb2N1c2VkTGluZW5vXT0iZm9jdXNlZExpbmVubyJcbiAgICAgIFttb25hY29dPSJtb25hY28kIHwgYXN5bmMiXG4gICAgICBbdXNlRGFya01vZGVdPSJ1c2VEYXJrTW9kZSJcbiAgICA+PC9zb3VyY2UtY29kZS1jb21wb25lbnQ+XG4gICd9XX1dLChmdW5jdGlvbigpe3JldHVybltdfSkse2xpbmVzOlt7dHlwZTp4eX1dLGZvY3VzZWRMaW5lbm86W3t0eXBlOnh5fV0sdXNlRGFya01vZGU6W3t0eXBlOnh5fV19KTtjbGFzcyBkSntjb25zdHJ1Y3Rvcigpe3RoaXMuZm9jdXNlZFNvdXJjZUZpbGVDb250ZW50PW51bGwsdGhpcy5mb2N1c2VkU291cmNlTGluZVNwZWM9bnVsbH19ZEouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGRKKX0sZEouybVjbXA9dG8oe3R5cGU6ZEosc2VsZWN0b3JzOltbInNvdXJjZS1maWxlcy1jb21wb25lbnQiXV0saW5wdXRzOntmb2N1c2VkU291cmNlRmlsZUNvbnRlbnQ6ImZvY3VzZWRTb3VyY2VGaWxlQ29udGVudCIsZm9jdXNlZFNvdXJjZUxpbmVTcGVjOiJmb2N1c2VkU291cmNlTGluZVNwZWMiLHVzZURhcmtNb2RlOiJ1c2VEYXJrTW9kZSJ9LGRlY2xzOjgsdmFyczozLGNvbnN0czpbWzEsInNvdXJjZS1maWxlcy1jb250YWluZXIiXSxbMSwiaGVhZGVyLXNlY3Rpb24iXSxbMSwidGl0bGUtdGFnIl0sWyJjbGFzcyIsImZpbGUtbGFiZWwiLDQsIm5nSWYiLCJuZ0lmRWxzZSJdLFsibm9GaWxlU2VsZWN0ZWQiLCIiXSxbMywibGluZXMiLCJmb2N1c2VkTGluZW5vIiwidXNlRGFya01vZGUiLDQsIm5nSWYiXSxbMSwiZmlsZS1sYWJlbCJdLFsxLCJuby1maWxlLXNlbGVjdGVkIl0sWzMsImxpbmVzIiwiZm9jdXNlZExpbmVubyIsInVzZURhcmtNb2RlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihSbSgwLCJkaXYiLDApLFJtKDEsImRpdiIsMSksUm0oMiwiZGl2IiwyKSxrdSgzLCJTb3VyY2UgQ29kZSIpLEFtKCksUXAoNCxzSiwyLDEsImRpdiIsMyksUXAoNSxsSiwyLDAsIm5nLXRlbXBsYXRlIixudWxsLDQsaWIpLEFtKCksUXAoNyxjSiwxLDMsInNvdXJjZS1jb2RlIiw1KSxBbSgpKSwyJmUpe2NvbnN0IHQ9JHAoNik7cmMoNCksRG0oIm5nSWYiLG51bGwhPT1uLmZvY3VzZWRTb3VyY2VMaW5lU3BlYykoIm5nSWZFbHNlIix0KSxyYygzKSxEbSgibmdJZiIsbnVsbCE9PW4uZm9jdXNlZFNvdXJjZUZpbGVDb250ZW50JiZudWxsIT09bi5mb2N1c2VkU291cmNlTGluZVNwZWMmJm51bGwhPT1uLmZvY3VzZWRTb3VyY2VGaWxlQ29udGVudC5saW5lcyl9fSxkaXJlY3RpdmVzOltkTSxySl0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9LmhlYWRlci1zZWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmViO2Rpc3BsYXk6ZmxleDtoZWlnaHQ6MjRweDtwYWRkaW5nLWJvdHRvbTo2cHg7dmVydGljYWwtYWxpZ246bWlkZGxlO3doaXRlLXNwYWNlOm5vd3JhcDt3aWR0aDoxMDAlfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5oZWFkZXItc2VjdGlvbltfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5oZWFkZXItc2VjdGlvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzU1NX0uZmlsZS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC13ZWlnaHQ6bm9ybWFsO3doaXRlLXNwYWNlOm5vcm1hbDtvdmVyZmxvdy13cmFwOmFueXdoZXJlO292ZXJmbG93LXk6YXV0bztwYWRkaW5nOjAgMjBweH0ubm8tZmlsZS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTppbmxpbmUtYmxvY2s7Y29sb3I6IzY2NjtwYWRkaW5nOjAgMjBweDt3aGl0ZS1zcGFjZTpub3JtYWx9LnNvdXJjZS1maWxlcy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Zm9udC1mYW1pbHk6IlJvYm90byBNb25vIixtb25vc3BhY2U7Zm9udC1zaXplOjEwcHg7aGVpZ2h0OjEwMCV9LnRpdGxlLXRhZ1tfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC13ZWlnaHQ6Ym9sZDtoZWlnaHQ6MTAwJTtwYWRkaW5nLWxlZnQ6NnB4O3ZlcnRpY2FsLWFsaWduOnRvcH1zb3VyY2UtY29kZVtfbmdjb250ZW50LSVDT01QJV17ZmxleC1ncm93OjE7d2lkdGg6MTAwJX0nXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZEosW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3Rvcjoic291cmNlLWZpbGVzLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vc291cmNlX2ZpbGVzX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyIuL3NvdXJjZV9maWxlc19jb21wb25lbnQuY3NzIl19XX1dLG51bGwse2ZvY3VzZWRTb3VyY2VGaWxlQ29udGVudDpbe3R5cGU6eHl9XSxmb2N1c2VkU291cmNlTGluZVNwZWM6W3t0eXBlOnh5fV0sdXNlRGFya01vZGU6W3t0eXBlOnh5fV19KTtjbGFzcyBwSntjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5mb2N1c2VkU291cmNlRmlsZUNvbnRlbnQkPXRoaXMuc3RvcmUuc2VsZWN0KHlYKSx0aGlzLmZvY3VzZWRTb3VyY2VMaW5lU3BlYyQ9dGhpcy5zdG9yZS5zZWxlY3QoX1gpLHRoaXMudXNlRGFya01vZGUkPXRoaXMuc3RvcmUuc2VsZWN0KEpEKX19cEouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHBKKShTbShJdykpfSxwSi7JtWNtcD10byh7dHlwZTpwSixzZWxlY3RvcnM6W1sidGYtZGVidWdnZXItdjItc291cmNlLWZpbGVzIl1dLGRlY2xzOjQsdmFyczo5LGNvbnN0czpbWzMsImZvY3VzZWRTb3VyY2VGaWxlQ29udGVudCIsImZvY3VzZWRTb3VyY2VMaW5lU3BlYyIsInVzZURhcmtNb2RlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihUbSgwLCJzb3VyY2UtZmlsZXMtY29tcG9uZW50IiwwKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQWgoMywiYXN5bmMiKSksMiZlJiZEbSgiZm9jdXNlZFNvdXJjZUZpbGVDb250ZW50IixUaCgxLDMsbi5mb2N1c2VkU291cmNlRmlsZUNvbnRlbnQkKSkoImZvY3VzZWRTb3VyY2VMaW5lU3BlYyIsVGgoMiw1LG4uZm9jdXNlZFNvdXJjZUxpbmVTcGVjJCkpKCJ1c2VEYXJrTW9kZSIsVGgoMyw3LG4udXNlRGFya01vZGUkKSl9LGRpcmVjdGl2ZXM6W2RKXSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246Mn0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgocEosW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoidGYtZGVidWdnZXItdjItc291cmNlLWZpbGVzIix0ZW1wbGF0ZTonXG4gICAgPHNvdXJjZS1maWxlcy1jb21wb25lbnRcbiAgICAgIFtmb2N1c2VkU291cmNlRmlsZUNvbnRlbnRdPSJmb2N1c2VkU291cmNlRmlsZUNvbnRlbnQkIHwgYXN5bmMiXG4gICAgICBbZm9jdXNlZFNvdXJjZUxpbmVTcGVjXT0iZm9jdXNlZFNvdXJjZUxpbmVTcGVjJCB8IGFzeW5jIlxuICAgICAgW3VzZURhcmtNb2RlXT0idXNlRGFya01vZGUkIHwgYXN5bmMiXG4gICAgPjwvc291cmNlLWZpbGVzLWNvbXBvbmVudD5cbiAgJ31dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSxudWxsKTtjb25zdCBtSj1bInN0YWNrRnJhbWVBcnJheSJdO2Z1bmN0aW9uIHVKKHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIsMTMpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgzKTtyYygxKSxEdSgiICMiLHQuZXhlY3V0aW9uSW5kZXgsIjogIil9fWZ1bmN0aW9uIGZKKHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIsMTQpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgzKTtyYygxKSxEdSgiICIsdC5vcFR5cGUsIiAiKX19ZnVuY3Rpb24gZ0oodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiKSxrdSgxLCIgRWFnZXIgZXhlY3V0aW9uICIpLFFwKDIsdUosMiwxLCJzcGFuIiwxMSksUXAoMyxmSiwyLDEsInNwYW4iLDEyKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMik7cmMoMiksRG0oIm5nSWYiLG51bGwhPT10Lm9wVHlwZSkscmMoMSksRG0oIm5nSWYiLG51bGwhPT10Lm9wVHlwZSl9fWZ1bmN0aW9uIGhKKHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIsMTYpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgzKTtyYygxKSxEdSgnICInLHQub3BOYW1lLCciICcpfX1mdW5jdGlvbiBiSih0LGUpe2lmKDEmdCYmKFJtKDAsInNwYW4iLDE0KSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMyk7cmMoMSksRHUoIiAiLHQub3BUeXBlLCIgIil9fWZ1bmN0aW9uIHlKKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2Iiksa3UoMSwiIENyZWF0aW9uIG9mIGdyYXBoIG9wICIpLFFwKDIsaEosMiwxLCJzcGFuIiwxNSksUXAoMyxiSiwyLDEsInNwYW4iLDEyKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMik7cmMoMiksRG0oIm5nSWYiLG51bGwhPT10Lm9wTmFtZSkscmMoMSksRG0oIm5nSWYiLG51bGwhPT10Lm9wVHlwZSl9fWZ1bmN0aW9uIF9KKHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIsMTcpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgyKTtyYygxKSxEdSgiIChIb3N0IG5hbWU6ICIsdC5zdGFja0ZyYW1lc0ZvckRpc3BsYXlbMF0uaG9zdF9uYW1lLCIpICIpfX1mdW5jdGlvbiBDSih0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsNyksUm0oMSwic3BhbiIpLFJtKDIsInNwYW4iLDgpLFFwKDMsZ0osNCwyLCJkaXYiLDkpLFFwKDQseUosNCwyLCJkaXYiLDkpLEFtKCksQW0oKSxSbSg1LCJkaXYiKSxRcCg2LF9KLDIsMSwic3BhbiIsMTApLEFtKCksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoMiksRG0oIm5nU3dpdGNoIix0LmNvZGVMb2NhdGlvblR5cGUpLHJjKDEpLERtKCJuZ1N3aXRjaENhc2UiLHQuQ29kZUxvY2F0aW9uVHlwZS5FWEVDVVRJT04pLHJjKDEpLERtKCJuZ1N3aXRjaENhc2UiLHQuQ29kZUxvY2F0aW9uVHlwZS5HUkFQSF9PUF9DUkVBVElPTikscmMoMiksRG0oIm5nSWYiLG51bGwhPT10LnN0YWNrRnJhbWVzRm9yRGlzcGxheSYmdC5zdGFja0ZyYW1lc0ZvckRpc3BsYXkubGVuZ3RoPjApfX1mdW5jdGlvbiBNSih0LGUpezEmdCYmKFJtKDAsImRpdiIsMTgpLGt1KDEsIiBDbGljayBhbiBlYWdlciBleGVjdXRpb24gb3IgZ3JhcGggb3AgdG8gc2hvdyBpdHMgb3JpZ2luYWwgc3RhY2sgdHJhY2UuICIpLEFtKCkpfWZ1bmN0aW9uIHZKKHQsZSl7MSZ0JiYoUm0oMCwiZGl2IiwyOCksa3UoMSwiIOKkkyAiKSxBbSgpKX1jb25zdCB4Sj1mdW5jdGlvbih0LGUpe3JldHVyblt0LGVdfTtmdW5jdGlvbiBPSih0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsImRpdiIsMjIpLFJtKDEsImRpdiIsMjMpLGt1KDIpLEFtKCksUm0oMywiZGl2IiwyNCksUXAoNCx2SiwyLDAsImRpdiIsMjUpLFJtKDUsImRpdiIsMjYpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUoKXtjb25zdCBuPWhpKHQpLiRpbXBsaWNpdDtyZXR1cm4gWW0oMikub25Tb3VyY2VMaW5lQ2xpY2tlZC5lbWl0KG4pfSkpLGt1KDYpLEFtKCksUm0oNywiZGl2IiwyNyksa3UoOCksQW0oKSxBbSgpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oMik7RG0oIm5nQ2xhc3MiLHZoKDYseEosdC5iZWxvbmdzVG9Gb2N1c2VkRmlsZT8iZm9jdXNlZC1maWxlIjoiIix0LmZvY3VzZWQ/ImZvY3VzZWQtc3RhY2stZnJhbWUiOiIiKSkscmMoMSksS20oInRpdGxlIix0LmZpbGVfcGF0aCkscmMoMSksRHUoIiAiLHQuY29uY2lzZV9maWxlX3BhdGgsIiAiKSxyYygyKSxEbSgibmdJZiIsbi5zdGlja1RvQm90dG9tbW9zdEZyYW1lSW5Gb2N1c2VkRmlsZSYmdC5mb2N1c2VkKSxyYygyKSxEdSgiIExpbmUgIix0LmxpbmVubywiICIpLHJjKDIpLER1KCIgIix0LmZ1bmN0aW9uX25hbWUsIiAiKX19ZnVuY3Rpb24gUEoodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDE5LDIwKSxRcCgyLE9KLDksOSwiZGl2IiwyMSksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoMiksRG0oIm5nRm9yT2YiLHQuc3RhY2tGcmFtZXNGb3JEaXNwbGF5KX19ZnVuY3Rpb24gd0oodCxlKXt9Y2xhc3Mga0p7Y29uc3RydWN0b3IoKXt0aGlzLnN0YWNrRnJhbWVzRm9yRGlzcGxheT1udWxsLHRoaXMub25Tb3VyY2VMaW5lQ2xpY2tlZD1uZXcgTGgsdGhpcy5Db2RlTG9jYXRpb25UeXBlPWZafW5nQWZ0ZXJWaWV3Q2hlY2tlZCgpe2lmKHZvaWQgMD09PXRoaXMuc3RhY2tGcmFtZUFycmF5KXJldHVybjtjb25zdCB0PXRoaXMuc3RhY2tGcmFtZUFycmF5Lm5hdGl2ZUVsZW1lbnQsZT10LnF1ZXJ5U2VsZWN0b3IoIi5mb2N1c2VkLXN0YWNrLWZyYW1lIik7aWYobnVsbCE9PWUpcmV0dXJuIHZvaWQgdGhpcy5zY3JvbGxUb0VsZW1lbnQodCxlKTtjb25zdCBuPXQucXVlcnlTZWxlY3RvcigiLnN0YWNrLWZyYW1lLWNvbnRhaW5lcjpsYXN0LWNoaWxkIik7bnVsbCE9PW4mJnRoaXMuc2Nyb2xsVG9FbGVtZW50KHQsbil9c2Nyb2xsVG9FbGVtZW50KHQsZSl7dC5zY3JvbGxUb3A9ZS5vZmZzZXRUb3B9fWtKLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxrSil9LGtKLsm1Y21wPXRvKHt0eXBlOmtKLHNlbGVjdG9yczpbWyJzdGFjay10cmFjZS1jb21wb25lbnQiXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJlFoKG1KLDUpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uc3RhY2tGcmFtZUFycmF5PXQuZmlyc3QpfX0saW5wdXRzOntjb2RlTG9jYXRpb25UeXBlOiJjb2RlTG9jYXRpb25UeXBlIixvcFR5cGU6Im9wVHlwZSIsb3BOYW1lOiJvcE5hbWUiLGV4ZWN1dGlvbkluZGV4OiJleGVjdXRpb25JbmRleCIsc3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGU6InN0aWNrVG9Cb3R0b21tb3N0RnJhbWVJbkZvY3VzZWRGaWxlIixzdGFja0ZyYW1lc0ZvckRpc3BsYXk6InN0YWNrRnJhbWVzRm9yRGlzcGxheSJ9LG91dHB1dHM6e29uU291cmNlTGluZUNsaWNrZWQ6Im9uU291cmNlTGluZUNsaWNrZWQifSxkZWNsczoxMCx2YXJzOjQsY29uc3RzOltbMSwic3RhY2stdHJhY2UtY29udGFpbmVyIl0sWzEsInN0YWNrLXRyYWNlLWhlYWRlciJdLFsxLCJzdGFjay10cmFjZS10aXRsZSJdLFsiY2xhc3MiLCJzdGFjay10cmFjZS1hdXgtaW5mbyIsNCwibmdJZiIsIm5nSWZFbHNlIl0sWyJub1N0YWNrVHJhY2UiLCIiXSxbImNsYXNzIiwic3RhY2stZnJhbWUtYXJyYXkiLDQsIm5nSWYiLCJuZ0lmRWxzZSJdLFsibG9hZGluZ1NlY3Rpb24iLCIiXSxbMSwic3RhY2stdHJhY2UtYXV4LWluZm8iXSxbMSwiY29kZS1sb2NhdGlvbi1vcmlnaW4iLDMsIm5nU3dpdGNoIl0sWzQsIm5nU3dpdGNoQ2FzZSJdLFsiY2xhc3MiLCJzdGFjay10cmFjZS1ob3N0LW5hbWUiLDQsIm5nSWYiXSxbImNsYXNzIiwiZWFnZXItZXhlY3V0aW9uLWluZGV4Iiw0LCJuZ0lmIl0sWyJjbGFzcyIsIm9wLXR5cGUiLDQsIm5nSWYiXSxbMSwiZWFnZXItZXhlY3V0aW9uLWluZGV4Il0sWzEsIm9wLXR5cGUiXSxbImNsYXNzIiwib3AtbmFtZSIsNCwibmdJZiJdLFsxLCJvcC1uYW1lIl0sWzEsInN0YWNrLXRyYWNlLWhvc3QtbmFtZSJdLFsxLCJzdGFjay10cmFjZS1hdXgtaW5mbyIsIm5vLXN0YWNrLXRyYWNlIl0sWzEsInN0YWNrLWZyYW1lLWFycmF5Il0sWyJzdGFja0ZyYW1lQXJyYXkiLCIiXSxbImNsYXNzIiwic3RhY2stZnJhbWUtY29udGFpbmVyIiwzLCJuZ0NsYXNzIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbMSwic3RhY2stZnJhbWUtY29udGFpbmVyIiwzLCJuZ0NsYXNzIl0sWzEsInN0YWNrLWZyYW1lLWZpbGUtcGF0aCIsMywidGl0bGUiXSxbMSwic3RhY2stZnJhbWUtbGluZW5vLWZ1bmN0aW9uIl0sWyJjbGFzcyIsInN0aWNrLXRvLWJvdHRvbW1vc3QtaW5kaWNhdG9yIiwidGl0bGUiLCJTdGlja2luZyB0byB0aGUgYm90dG9tbW9zdCBmcmFtZSBpbiB0aGUgY3VycmVudCBzb3VyY2UgZmlsZSB3aGVuIG5hdmlnYXRpbmcgZXhlY3V0aW9ucyBhbmQgZ3JhcGggb3BzLiBUbyByZW1vdmUgdGhpcyBzdGlja2luZywgY2xpY2sgYW55IG5vbi1ib3R0b21tb3N0IHN0YWNrIGZyYW1lLiIsNCwibmdJZiJdLFsxLCJzdGFjay1mcmFtZS1saW5lbm8iLDMsImNsaWNrIl0sWzEsInN0YWNrLWZyYW1lLWZ1bmN0aW9uIl0sWyJ0aXRsZSIsIlN0aWNraW5nIHRvIHRoZSBib3R0b21tb3N0IGZyYW1lIGluIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlIHdoZW4gbmF2aWdhdGluZyBleGVjdXRpb25zIGFuZCBncmFwaCBvcHMuIFRvIHJlbW92ZSB0aGlzIHN0aWNraW5nLCBjbGljayBhbnkgbm9uLWJvdHRvbW1vc3Qgc3RhY2sgZnJhbWUuIiwxLCJzdGljay10by1ib3R0b21tb3N0LWluZGljYXRvciJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoUm0oMCwiZGl2IiwwKSxSbSgxLCJkaXYiLDEpLFJtKDIsInNwYW4iLDIpLGt1KDMsIiBTdGFjayBUcmFjZSAiKSxBbSgpLFFwKDQsQ0osNyw0LCJkaXYiLDMpLFFwKDUsTUosMiwwLCJuZy10ZW1wbGF0ZSIsbnVsbCw0LGliKSxBbSgpLFFwKDcsUEosMywxLCJkaXYiLDUpLFFwKDgsd0osMCwwLCJuZy10ZW1wbGF0ZSIsbnVsbCw2LGliKSxBbSgpKSwyJmUpe2NvbnN0IHQ9JHAoNiksZT0kcCg5KTtyYyg0KSxEbSgibmdJZiIsbnVsbCE9PW4uY29kZUxvY2F0aW9uVHlwZSkoIm5nSWZFbHNlIix0KSxyYygzKSxEbSgibmdJZiIsbnVsbCE9PW4uc3RhY2tGcmFtZXNGb3JEaXNwbGF5KSgibmdJZkVsc2UiLGUpfX0sZGlyZWN0aXZlczpbZE0sZk0sZ00sbE0sYU1dLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5mb2N1c2VkLWZpbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OmJvbGR9LmZvY3VzZWQtc3RhY2stZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTExLDAsLjMpfS5uby1zdGFjay10cmFjZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Z3JheX0ub3AtbmFtZVtfbmdjb250ZW50LSVDT01QJV17d29yZC13cmFwOmFueXdoZXJlfS5vcC10eXBlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlY2VmZjE7Ym9yZGVyOjFweCBzb2xpZCAjZWJlYmViO2JvcmRlci1yYWRpdXM6NHB4O2ZvbnQtZmFtaWx5OiJSb2JvdG8gTW9ubyIsbW9ub3NwYWNlO2ZvbnQtc2l6ZToxMHB4O2hlaWdodDoxNHB4O2xpbmUtaGVpZ2h0OjE0cHg7cGFkZGluZzoxcHggM3B4O3dpZHRoOm1heC1jb250ZW50fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5vcC10eXBlW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLm9wLXR5cGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjoxcHggc29saWQgIzU1NX1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAub3AtdHlwZVtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5vcC10eXBlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiM0NTVhNjR9LnN0YWNrLWZyYW1lLWFycmF5W19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87d2lkdGg6Y2FsYygxMDAlIC0gOHB4KX0uc3RhY2stZnJhbWUtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjYTBhMGEwfS5zdGFjay1mcmFtZS1maWxlLXBhdGhbX25nY29udGVudC0lQ09NUCVde21heC13aWR0aDoxODBweDt3aWR0aDoxODBweH0uc3RhY2stZnJhbWUtbGluZW5vLWZ1bmN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXt0ZXh0LWFsaWduOnJpZ2h0O3doaXRlLXNwYWNlOm5vd3JhcH0uc3RhY2stZnJhbWUtZnVuY3Rpb25bX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lLWJsb2NrO21heC13aWR0aDoyMDBweDtwYWRkaW5nLWxlZnQ6MTBweDt0ZXh0LWFsaWduOmxlZnQ7d2hpdGUtc3BhY2U6bm9ybWFsO3dpZHRoOjIwMHB4O3dvcmQtd3JhcDphbnl3aGVyZX0uc3RhY2stZnJhbWUtbGluZW5vW19uZ2NvbnRlbnQtJUNPTVAlXXtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmlubGluZS1ibG9jazttYXgtd2lkdGg6ODBweDt0ZXh0LWFsaWduOmxlZnQ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt3aWR0aDo4MHB4fS5zdGFjay10cmFjZS1hdXgtaW5mb1tfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDoxNXB4O3BhZGRpbmctbGVmdDoyNHB4fS5zdGFjay10cmFjZS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjZWJlYmViO2JveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmZsZXg7ZmxleC1mbG93OmNvbHVtbjtmb250LXNpemU6MTBweDtmb250LWZhbWlseToiUm9ib3RvIE1vbm8iLG1vbm9zcGFjZTtoZWlnaHQ6MTAwJTttYXJnaW4tbGVmdDo4cHg7bWF4LWhlaWdodDozNjBweDtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmhpZGRlbjtwYWRkaW5nLWxlZnQ6OHB4O3dpZHRoOjEwMCV9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLnN0YWNrLXRyYWNlLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5zdGFjay10cmFjZS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjNTU1fS5zdGFjay10cmFjZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MCA1cHggM3B4IC0zcHggI2NjYztwYWRkaW5nLWJvdHRvbTozcHh9LnN0YWNrLXRyYWNlLWhvc3QtbmFtZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Z3JheX0uc3RhY2stdHJhY2UtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OmJvbGR9LnN0aWNrLXRvLWJvdHRvbW1vc3QtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXdlaWdodDpib2xkO2ZvbnQtc2l6ZToxMnB4O3BhZGRpbmctcmlnaHQ6M3B4fSddfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChrSixbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJzdGFjay10cmFjZS1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiIuL3N0YWNrX3RyYWNlX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyIuL3N0YWNrX3RyYWNlX2NvbXBvbmVudC5jc3MiXX1dfV0sbnVsbCx7Y29kZUxvY2F0aW9uVHlwZTpbe3R5cGU6eHl9XSxvcFR5cGU6W3t0eXBlOnh5fV0sb3BOYW1lOlt7dHlwZTp4eX1dLGV4ZWN1dGlvbkluZGV4Olt7dHlwZTp4eX1dLHN0aWNrVG9Cb3R0b21tb3N0RnJhbWVJbkZvY3VzZWRGaWxlOlt7dHlwZTp4eX1dLHN0YWNrRnJhbWVzRm9yRGlzcGxheTpbe3R5cGU6eHl9XSxvblNvdXJjZUxpbmVDbGlja2VkOlt7dHlwZTpPeX1dLHN0YWNrRnJhbWVBcnJheTpbe3R5cGU6WmEsYXJnczpbInN0YWNrRnJhbWVBcnJheSJdfV19KTtjbGFzcyBTSntjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5jb2RlTG9jYXRpb25UeXBlJD10aGlzLnN0b3JlLnBpcGUoRncoWncodVgsKHQ9Pm51bGw9PT10P251bGw6dC5jb2RlTG9jYXRpb25UeXBlKSkpKSx0aGlzLm9wVHlwZSQ9dGhpcy5zdG9yZS5waXBlKEZ3KFp3KHVYLCh0PT5udWxsPT09dD9udWxsOnQub3BUeXBlKSkpKSx0aGlzLm9wTmFtZSQ9dGhpcy5zdG9yZS5waXBlKEZ3KFp3KHVYLCh0PT5udWxsPT09dHx8dC5jb2RlTG9jYXRpb25UeXBlIT09ZlouR1JBUEhfT1BfQ1JFQVRJT04/bnVsbDp0Lm9wTmFtZSkpKSksdGhpcy5leGVjdXRpb25JbmRleCQ9dGhpcy5zdG9yZS5waXBlKEZ3KFp3KHVYLCh0PT5udWxsPT09dHx8dC5jb2RlTG9jYXRpb25UeXBlIT09ZlouRVhFQ1VUSU9OP251bGw6dC5leGVjdXRpb25JbmRleCkpKSksdGhpcy5zdGlja1RvQm90dG9tbW9zdEZyYW1lSW5Gb2N1c2VkRmlsZSQ9dGhpcy5zdG9yZS5waXBlKEZ3KENYKSksdGhpcy5zdGFja0ZyYW1lc0ZvckRpc3BsYXkkPXRoaXMuc3RvcmUucGlwZShGdyhadyhmWCxfWCwoKHQsZSk9PntpZihudWxsPT09dClyZXR1cm4gbnVsbDtjb25zdCBuPVtdO2Zvcihjb25zdCBvIG9mIHQpe2NvbnN0e2hvc3RfbmFtZTp0LGZpbGVfcGF0aDppLGxpbmVubzphLGZ1bmN0aW9uX25hbWU6cn09byxzPWkuc3BsaXQoIi8iKSxsPW51bGwhPT1lJiZ0PT09ZS5ob3N0X25hbWUmJmk9PT1lLmZpbGVfcGF0aDtuLnB1c2goe2hvc3RfbmFtZTp0LGZpbGVfcGF0aDppLGNvbmNpc2VfZmlsZV9wYXRoOnNbcy5sZW5ndGgtMV0sbGluZW5vOmEsZnVuY3Rpb25fbmFtZTpyLGJlbG9uZ3NUb0ZvY3VzZWRGaWxlOmwsZm9jdXNlZDpsJiZhPT09ZS5saW5lbm99KX1yZXR1cm4gbn0pKSkpfW9uU291cmNlTGluZUNsaWNrZWQodCl7Y29uc3R7aG9zdF9uYW1lOmUsZmlsZV9wYXRoOm4sbGluZW5vOm8sZnVuY3Rpb25fbmFtZTppfT10O3RoaXMuc3RvcmUuZGlzcGF0Y2goc1ooe3N0YWNrRnJhbWU6e2hvc3RfbmFtZTplLGZpbGVfcGF0aDpuLGxpbmVubzpvLGZ1bmN0aW9uX25hbWU6aX19KSl9fWZ1bmN0aW9uIERKKHQsZSl7MSZ0JiZUbSgwLCJ0Zi1kZWJ1Z2dlci12Mi1pbmFjdGl2ZSIpfWZ1bmN0aW9uIEVKKHQsZSl7MSZ0JiYoUm0oMCwiZGl2IiwzKSxUbSgxLCJ0Zi1kZWJ1Z2dlci12Mi1hbGVydHMiKSxSbSgyLCJkaXYiLDQpLFRtKDMsInRmLWRlYnVnZ2VyLXYyLXRpbWVsaW5lIiksVG0oNCwidGYtZGVidWdnZXItdjItZ3JhcGgiKSxBbSgpLFRtKDUsInRmLWRlYnVnZ2VyLXYyLWdyYXBoLWV4ZWN1dGlvbnMiKSxBbSgpLFJtKDYsImRpdiIsNSksVG0oNywidGYtZGVidWdnZXItdjItc291cmNlLWZpbGVzIiksVG0oOCwidGYtZGVidWdnZXItdjItc3RhY2stdHJhY2UiKSxBbSgpKX1TSi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8U0opKFNtKEl3KSl9LFNKLsm1Y21wPXRvKHt0eXBlOlNKLHNlbGVjdG9yczpbWyJ0Zi1kZWJ1Z2dlci12Mi1zdGFjay10cmFjZSJdXSxkZWNsczo3LHZhcnM6MTgsY29uc3RzOltbMywiY29kZUxvY2F0aW9uVHlwZSIsIm9wVHlwZSIsIm9wTmFtZSIsImV4ZWN1dGlvbkluZGV4Iiwic3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGUiLCJzdGFja0ZyYW1lc0ZvckRpc3BsYXkiLCJvblNvdXJjZUxpbmVDbGlja2VkIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJzdGFjay10cmFjZS1jb21wb25lbnQiLDApLFZtKCJvblNvdXJjZUxpbmVDbGlja2VkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblNvdXJjZUxpbmVDbGlja2VkKGUpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBaCgzLCJhc3luYyIpLEFoKDQsImFzeW5jIiksQWgoNSwiYXN5bmMiKSxBaCg2LCJhc3luYyIpLEFtKCkpLDImZSYmRG0oImNvZGVMb2NhdGlvblR5cGUiLFRoKDEsNixuLmNvZGVMb2NhdGlvblR5cGUkKSkoIm9wVHlwZSIsVGgoMiw4LG4ub3BUeXBlJCkpKCJvcE5hbWUiLFRoKDMsMTAsbi5vcE5hbWUkKSkoImV4ZWN1dGlvbkluZGV4IixUaCg0LDEyLG4uZXhlY3V0aW9uSW5kZXgkKSkoInN0aWNrVG9Cb3R0b21tb3N0RnJhbWVJbkZvY3VzZWRGaWxlIixUaCg1LDE0LG4uc3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGUkKSkoInN0YWNrRnJhbWVzRm9yRGlzcGxheSIsVGgoNiwxNixuLnN0YWNrRnJhbWVzRm9yRGlzcGxheSQpKX0sZGlyZWN0aXZlczpba0pdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChTSixbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJ0Zi1kZWJ1Z2dlci12Mi1zdGFjay10cmFjZSIsdGVtcGxhdGU6J1xuICAgIDxzdGFjay10cmFjZS1jb21wb25lbnRcbiAgICAgIFtjb2RlTG9jYXRpb25UeXBlXT0iY29kZUxvY2F0aW9uVHlwZSQgfCBhc3luYyJcbiAgICAgIFtvcFR5cGVdPSJvcFR5cGUkIHwgYXN5bmMiXG4gICAgICBbb3BOYW1lXT0ib3BOYW1lJCB8IGFzeW5jIlxuICAgICAgW2V4ZWN1dGlvbkluZGV4XT0iZXhlY3V0aW9uSW5kZXgkIHwgYXN5bmMiXG4gICAgICBbc3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGVdPSJcbiAgICAgICAgc3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGUkIHwgYXN5bmNcbiAgICAgICJcbiAgICAgIFtzdGFja0ZyYW1lc0ZvckRpc3BsYXldPSJzdGFja0ZyYW1lc0ZvckRpc3BsYXkkIHwgYXN5bmMiXG4gICAgICAob25Tb3VyY2VMaW5lQ2xpY2tlZCk9Im9uU291cmNlTGluZUNsaWNrZWQoJGV2ZW50KSJcbiAgICA+PC9zdGFjay10cmFjZS1jb21wb25lbnQ+XG4gICd9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y2xhc3MgUkp7Y29uc3RydWN0b3IoKXt0aGlzLnJ1bnM9e30sdGhpcy5ydW5JZHM9W10sdGhpcy5hY3RpdmVSdW5JZD1udWxsfX1SSi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8UkopfSxSSi7JtWNtcD10byh7dHlwZTpSSixzZWxlY3RvcnM6W1siZGVidWdnZXItY29tcG9uZW50Il1dLGlucHV0czp7cnVuczoicnVucyIscnVuSWRzOiJydW5JZHMiLGFjdGl2ZVJ1bklkOiJhY3RpdmVSdW5JZCJ9LGRlY2xzOjQsdmFyczoyLGNvbnN0czpbWzEsImRlYnVnZ2VyLWNvbnRhaW5lciJdLFs0LCJuZ0lmIiwibmdJZkVsc2UiXSxbImRhdGFBdmFpbGFibGUiLCIiXSxbMSwidG9wLXNlY3Rpb24iXSxbMSwidG9wLWNlbnRlci1zZWN0aW9uIl0sWzEsImJvdHRvbS1zZWN0aW9uIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihSbSgwLCJkaXYiLDApLFFwKDEsREosMSwwLCJ0Zi1kZWJ1Z2dlci12Mi1pbmFjdGl2ZSIsMSksUXAoMixFSiw5LDAsIm5nLXRlbXBsYXRlIixudWxsLDIsaWIpLEFtKCkpLDImZSl7Y29uc3QgdD0kcCgzKTtyYygxKSxEbSgibmdJZiIsMD09PW4ucnVuSWRzLmxlbmd0aCkoIm5nSWZFbHNlIix0KX19LGRpcmVjdGl2ZXM6W2RNLEVxLFBYLHZLLFZLLEpLLHBKLFNKXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0uYm90dG9tLXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVde2JveC1zaXppbmc6Ym9yZGVyLWJveDtib3JkZXItdG9wOjFweCBzb2xpZCAjZWJlYmViO2Rpc3BsYXk6ZmxleDtmbGV4LWdyb3c6MTtoZWlnaHQ6MzQlO3BhZGRpbmctdG9wOjZweH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuYm90dG9tLXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuYm90dG9tLXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MXB4IHNvbGlkICM1NTV9LmRlYnVnZ2VyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNpemluZzpib3JkZXItYm94O2hlaWdodDoxMDAlO292ZXJmbG93OmhpZGRlbn0udG9wLXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVde2JveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmZsZXg7ZmxleC1ncm93OjE7aGVpZ2h0OjY2JTtwYWRkaW5nOjZweCAwfXRmLWRlYnVnZ2VyLXYyLWFsZXJ0c1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZWJlYmViO2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1yaWdodDoxMHB4O21pbi13aWR0aDoxNjBweDt3aWR0aDpjYWxjKDE1JSAtIDExcHgpfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIHRmLWRlYnVnZ2VyLXYyLWFsZXJ0c1tfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIHRmLWRlYnVnZ2VyLXYyLWFsZXJ0c1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjNTU1fXRmLWRlYnVnZ2VyLXYyLWdyYXBoLWV4ZWN1dGlvbnNbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZsZXgtZ3JvdzoxO21pbi13aWR0aDo1NDBweDt3aWR0aDo1NDBweH10Zi1kZWJ1Z2dlci12Mi1zb3VyY2UtZmlsZXNbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDoxMDAlO3dpZHRoOjcwJX10Zi1kZWJ1Z2dlci12Mi1zdGFjay10cmFjZVtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTppbmxpbmUtYmxvY2s7ZmxleC1ncm93OjE7aGVpZ2h0OjEwMCU7bWluLXdpZHRoOjU0MHB4O3dpZHRoOjU0MHB4fS50b3AtY2VudGVyLXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lLWJsb2NrO292ZXJmbG93OmF1dG87d2lkdGg6NTUlfXRmLWRlYnVnZ2VyLXYyLXRpbWVsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmJsb2NrfXRmLWRlYnVnZ2VyLXYyLWdyYXBoW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjFweCBzb2xpZCAjZWJlYmViO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDo1cHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgdGYtZGVidWdnZXItdjItZ3JhcGhbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICB0Zi1kZWJ1Z2dlci12Mi1ncmFwaFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgIzU1NX0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUkosW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiZGVidWdnZXItY29tcG9uZW50Iix0ZW1wbGF0ZVVybDoiLi9kZWJ1Z2dlcl9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9kZWJ1Z2dlcl9jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7cnVuczpbe3R5cGU6eHl9XSxydW5JZHM6W3t0eXBlOnh5fV0sYWN0aXZlUnVuSWQ6W3t0eXBlOnh5fV19KTtjbGFzcyBBSntjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5ydW5zJD10aGlzLnN0b3JlLnBpcGUoRncoUFopKSx0aGlzLnJ1bnNJZHMkPXRoaXMuc3RvcmUucGlwZShGdyhadyhQWiwodD0+T2JqZWN0LmtleXModCkpKSkpLHRoaXMuYWN0aXZlUnVuSWQkPXRoaXMuc3RvcmUucGlwZShGdyhrWikpfW5nT25Jbml0KCl7dGhpcy5zdG9yZS5kaXNwYXRjaChScSgpKX1uZ09uRGVzdHJveSgpe3RoaXMuc3RvcmUuZGlzcGF0Y2goQXEoKSl9fUFKLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxBSikoU20oSXcpKX0sQUouybVjbXA9dG8oe3R5cGU6QUosc2VsZWN0b3JzOltbInRmLWRlYnVnZ2VyLXYyIl1dLGRlY2xzOjQsdmFyczo5LGNvbnN0czpbWzMsInJ1bnMiLCJydW5JZHMiLCJhY3RpdmVSdW5JZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwiZGVidWdnZXItY29tcG9uZW50IiwwKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQWgoMywiYXN5bmMiKSksMiZlJiZEbSgicnVucyIsVGgoMSwzLG4ucnVucyQpKSgicnVuSWRzIixUaCgyLDUsbi5ydW5zSWRzJCkpKCJhY3RpdmVSdW5JZCIsVGgoMyw3LG4uYWN0aXZlUnVuSWQkKSl9LGRpcmVjdGl2ZXM6W1JKXSxwaXBlczpbd01dLHN0eWxlczpbIltfbmdob3N0LSVDT01QJV0ge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgfSJdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChBSixbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJ0Zi1kZWJ1Z2dlci12MiIsdGVtcGxhdGU6J1xuICAgIDxkZWJ1Z2dlci1jb21wb25lbnRcbiAgICAgIFtydW5zXT0icnVucyQgfCBhc3luYyJcbiAgICAgIFtydW5JZHNdPSJydW5zSWRzJCB8IGFzeW5jIlxuICAgICAgW2FjdGl2ZVJ1bklkXT0iYWN0aXZlUnVuSWQkIHwgYXN5bmMiXG4gICAgPjwvZGVidWdnZXItY29tcG9uZW50PlxuICAnLHN0eWxlczpbIlxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgfVxuICAgICJdfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NvbnN0IFRKPSJkZWJ1Z2dlci12MiI7ZnVuY3Rpb24gTkoodCxlLG4sbyxpKXtpZihuPD0wfHwhTnVtYmVyLmlzSW50ZWdlcihuKSl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFnZVNpemU6ICR7bn1gKTtpZihlPm8pdGhyb3cgbmV3IEVycm9yKGBlbmQgaW5kZXggKCR7ZX0pIGV4Y2VlZHMgdG90YWwgbnVtYmVyIG9mIGl0ZW1zICgke299KWApO2lmKGUtdD5uKXRocm93IG5ldyBFcnJvcigiYmVnaW4tZW5kIHNwYW4gZXhjZWVkcyBwYWdlIHNpemUsIHdoaWNoIGlzIG5vdCBhbGxvd2VkIik7Y29uc3QgYT1bXSxyPU1hdGguZmxvb3IodC9uKTsoIShyIGluIGkpfHxpW3JdPG4mJnIqbitpW3JdPG8pJiZhLnB1c2gocik7Y29uc3Qgcz1NYXRoLmZsb29yKChlLTEpL24pO3JldHVybiBzIT09ciYmKCEocyBpbiBpKXx8cypuK2lbc108ZSYmZTxvKSYmYS5wdXNoKHMpLGF9Y2xhc3Mgekp7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuYWN0aW9ucyQ9dCx0aGlzLnN0b3JlPWUsdGhpcy5kYXRhU291cmNlPW4sdGhpcy5sb2FkRGF0YSQ9TWsoKCgpPT57Y29uc3QgdD10aGlzLmxvYWREZWJ1Z2dlclJ1bnMocmUodGhpcy5vbkRlYnVnZ2VyRGF0YVBvbGwoKSx0aGlzLm9uQ29yZVJlbG9hZCgpKSkucGlwZShFZSgpKSxlPXRoaXMubG9hZFNvdXJjZUZpbGVMaXN0KHQpLG49dGhpcy5jcmVhdGVOdW1FeGVjdXRpb25Mb2FkZXIodCksbz10aGlzLmNyZWF0ZU51bUFsZXJ0c0FuZEJyZWFrZG93bkxvYWRlcih0KSxpPXRoaXMub25BbGVydFR5cGVGb2N1c2VkKCksYT10aGlzLmZldGNoRXhlY3V0aW9uRGlnZXN0c0ZvckFsZXJ0VHlwZUZvY3VzKGkpLHI9dGhpcy5jcmVhdGVJbml0aWFsRXhlY3V0aW9uRGV0ZWN0b3IobikucGlwZShFZSgpKSxzPXRoaXMuY3JlYXRlRXhlY3V0aW9uRGlnZXN0TG9hZGVyKHJlKHRoaXMub25FeGVjdXRpb25TY3JvbGwoKSx0aGlzLmNyZWF0ZUluaXRpYWxFeGVjdXRpb25EaWdlc3QociksYSkpLGw9dGhpcy5jcmVhdGVFeGVjdXRpb25EYXRhQW5kU3RhY2tGcmFtZXNMb2FkZXIocmUodGhpcy5vbkV4ZWN1dGlvbkRpZ2VzdEZvY3VzZWQoKSxyLnBpcGUoVmUodGhpcy5zdG9yZS5zZWxlY3Qoa1opLHRoaXMuc3RvcmUuc2VsZWN0KGNYKSksSXQoKChbLHQsZV0pPT4oe2FjdGl2ZVJ1bklkOnQsbG9hZGVkRXhlY3V0aW9uRGF0YTplLGZvY3VzSW5kZXg6MH0pKSkpKSk7cmV0dXJuIHJlKG8scyxsLHRoaXMuY3JlYXRlTnVtR3JhcGhFeGVjdXRpb25Mb2FkZXIodCksZSx0aGlzLm9uU291cmNlRmlsZUZvY3VzZWQoKSx0aGlzLmxvYWRHcmFwaEV4ZWN1dGlvblBhZ2VzKHRoaXMub25HcmFwaEV4ZWN1dGlvblNjcm9sbCgpKSx0aGlzLmxvYWRHcmFwaE9wU3RhY2tGcmFtZXModGhpcy5sb2FkR3JhcGhPcEluZm8oKSkpLnBpcGUoSXQoKCgpPT4oe30pKSkpfSkse2Rpc3BhdGNoOiExfSl9b25EZWJ1Z2dlckRhdGFQb2xsKCl7cmV0dXJuIHRoaXMuYWN0aW9ucyQucGlwZShEayhScSksemUoKHQ9PihmdW5jdGlvbiBlKHQsbixvKXtyZXR1cm4gdC5waXBlKChmdW5jdGlvbiBpKHQpe3JldHVybiBSKChmdW5jdGlvbihlLG4pe3ZhciBvLGksYT0hMSxyPSExLHM9ITEsbD1mdW5jdGlvbigpe3JldHVybiBzJiZyJiYobi5jb21wbGV0ZSgpLCEwKX0sYz1mdW5jdGlvbigpe3M9ITEsbz1lLnN1YnNjcmliZShuZXcgVChuLHZvaWQgMCwoZnVuY3Rpb24oKXtzPSEwLCFsKCkmJihpfHwoaT1uZXcgSSx0KGkpLnN1YnNjcmliZShuZXcgVChuLChmdW5jdGlvbigpe28/YygpOmE9ITB9KSwoZnVuY3Rpb24oKXtyPSEwLGwoKX0pKSkpLGkpLm5leHQoKX0pKSksYSYmKG8udW5zdWJzY3JpYmUoKSxvPW51bGwsYT0hMSxjKCkpfTtjKCl9KSl9KSgodD0+dC5waXBlKFZlKG4pLF9lKCgoWyx0XSk9PmFlKHQpKSkpKSksSWUobyksSXQoKCgpPT57fSkpKX0pKEV0KHQpLHRoaXMuc3RvcmUuc2VsZWN0KFNaKS5waXBlKEl0KCh0PT4oZnVuY3Rpb24gZSh0KXtyZXR1cm4gdD42ZTQ/NmU0OnQ+NGUzP3Q6MmUzfSkodCkpKSksdGhpcy5hY3Rpb25zJC5waXBlKERrKEFxKSkpKSksRmUoKCgpPT50aGlzLnN0b3JlLmRpc3BhdGNoKFRxKCkpKSksSXQoKCgpPT57fSkpKX1vbkNvcmVSZWxvYWQoKXtyZXR1cm4gcmUodGhpcy5hY3Rpb25zJC5waXBlKERrKHZFLHhFKSksdGhpcy5hY3Rpb25zJC5waXBlKERrKF9FKSkucGlwZShWZSh0aGlzLnN0b3JlLnNlbGVjdCh3WikpLGNlKCgoWyx0XSk9PnQuc3RhdGU9PT15RS5OT1RfTE9BREVEfHx0LnN0YXRlPT09eUUuRkFJTEVEJiZudWxsPT09dC5sYXN0TG9hZGVkVGltZUluTXMpKSkpLnBpcGUoVmUodGhpcy5zdG9yZS5zZWxlY3QoTVIpKSxjZSgoKFssdF0pPT50PT09VEopKSxGZSgoKCk9PnRoaXMuc3RvcmUuZGlzcGF0Y2goVHEoKSkpKSxJdCgoKCk9Pnt9KSkpfWxvYWREZWJ1Z2dlclJ1bnModCl7cmV0dXJuIHQucGlwZShWZSh0aGlzLnN0b3JlLnNlbGVjdCh3WikpLGNlKCgoWyx7c3RhdGU6dH1dKT0+dCE9PXlFLkxPQURJTkcpKSxGZSgoKCk9PnRoaXMuc3RvcmUuZGlzcGF0Y2goTnEoKSkpKSxadCgoKCk9PnRoaXMuZGF0YVNvdXJjZS5mZXRjaFJ1bnMoKS5waXBlKEZlKCh0PT57dGhpcy5zdG9yZS5kaXNwYXRjaCh6cSh7cnVuczp0fSkpfSkpLEl0KCgoKT0+e30pKSkpKSl9Y3JlYXRlTnVtRXhlY3V0aW9uTG9hZGVyKHQpe3JldHVybiB0LnBpcGUoVmUodGhpcy5zdG9yZS5zZWxlY3QoUFopLHRoaXMuc3RvcmUuc2VsZWN0KEhaKSksY2UoKChbLHQsZV0pPT5PYmplY3Qua2V5cyh0KS5sZW5ndGg+MCYmZS5zdGF0ZSE9PXlFLkxPQURJTkcpKSxGZSgoKCk9PnRoaXMuc3RvcmUuZGlzcGF0Y2goVnEoKSkpKSxadCgoKFssdF0pPT57Y29uc3QgZT1PYmplY3Qua2V5cyh0KVswXTtyZXR1cm4gdGhpcy5kYXRhU291cmNlLmZldGNoRXhlY3V0aW9uRGlnZXN0cyhlLDAsMCkucGlwZShGZSgodD0+e3RoaXMuc3RvcmUuZGlzcGF0Y2goanEoe251bUV4ZWN1dGlvbnM6dC5udW1fZGlnZXN0c30pKX0pKSxJdCgoKCk9Pnt9KSkpfSkpKX1jcmVhdGVOdW1HcmFwaEV4ZWN1dGlvbkxvYWRlcih0KXtyZXR1cm4gdC5waXBlKFZlKHRoaXMuc3RvcmUuc2VsZWN0KFBaKSx0aGlzLnN0b3JlLnNlbGVjdChXWikpLGNlKCgoWyx0LGVdKT0+T2JqZWN0LmtleXModCkubGVuZ3RoPjAmJmUuc3RhdGUhPT15RS5MT0FESU5HKSksRmUoKCgpPT50aGlzLnN0b3JlLmRpc3BhdGNoKEtxKCkpKSksWnQoKChbLHRdKT0+e2NvbnN0IGU9T2JqZWN0LmtleXModClbMF07cmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5mZXRjaEdyYXBoRXhlY3V0aW9uRGlnZXN0cyhlLDAsMCkucGlwZShGZSgodD0+e3RoaXMuc3RvcmUuZGlzcGF0Y2goSnEoe251bUdyYXBoRXhlY3V0aW9uczp0Lm51bV9kaWdlc3RzfSkpfSkpLEl0KCgoKT0+e30pKSl9KSkpfWNyZWF0ZU51bUFsZXJ0c0FuZEJyZWFrZG93bkxvYWRlcih0KXtyZXR1cm4gdC5waXBlKFZlKHRoaXMuc3RvcmUuc2VsZWN0KFBaKSx0aGlzLnN0b3JlLnNlbGVjdChFWikpLGNlKCgoWyx0LGVdKT0+T2JqZWN0LmtleXModCkubGVuZ3RoPjAmJmUuc3RhdGUhPT15RS5MT0FESU5HKSksRmUoKCgpPT50aGlzLnN0b3JlLmRpc3BhdGNoKEhxKCkpKSksWnQoKChbLHRdKT0+e2NvbnN0IGU9T2JqZWN0LmtleXModClbMF07cmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5mZXRjaEFsZXJ0cyhlLDAsMCkucGlwZShGZSgodD0+e3RoaXMuc3RvcmUuZGlzcGF0Y2goRnEoe251bUFsZXJ0czp0Lm51bV9hbGVydHMsYWxlcnRzQnJlYWtkb3duOnQuYWxlcnRzX2JyZWFrZG93bn0pKX0pKSxJdCgoKCk9Pnt9KSkpfSkpKX1jcmVhdGVJbml0aWFsRXhlY3V0aW9uRGV0ZWN0b3IodCl7cmV0dXJuIHQucGlwZShWZSh0aGlzLnN0b3JlLnNlbGVjdChMWiksdGhpcy5zdG9yZS5zZWxlY3QoRlopKSxjZSgoKFssdCxlXSk9PnQ+MCYmMD09PU9iamVjdC5rZXlzKGUucGFnZUxvYWRlZFNpemVzKS5sZW5ndGgpKSxJdCgoKCk9Pnt9KSkpfWNyZWF0ZUluaXRpYWxFeGVjdXRpb25EaWdlc3QodCl7cmV0dXJuIHQucGlwZShWZSh0aGlzLnN0b3JlLnNlbGVjdChMWiksdGhpcy5zdG9yZS5zZWxlY3Qoa1opLHRoaXMuc3RvcmUuc2VsZWN0KFZaKSksY2UoKChbLCx0XSk9Pm51bGwhPT10KSksSXQoKChbLHQsZSxuXSk9Pih7YmVnaW46MCxlbmQ6TWF0aC5taW4odCxuKSxydW5JZDplfSkpKSl9b25FeGVjdXRpb25TY3JvbGwoKXtyZXR1cm4gdGhpcy5hY3Rpb25zJC5waXBlKERrKFdxLFlxLHFxKSxWZSh0aGlzLnN0b3JlLnNlbGVjdChrWiksdGhpcy5zdG9yZS5zZWxlY3QoQlopLHRoaXMuc3RvcmUuc2VsZWN0KExaKSx0aGlzLnN0b3JlLnNlbGVjdChqWiksdGhpcy5zdG9yZS5zZWxlY3QoVlopKSxjZSgoKFt0XSk9Pm51bGwhPT10KSksSXQoKChbLHQsZSxuLG8saV0pPT4oe3J1bklkOnQsYmVnaW46ZSxlbmQ6TWF0aC5taW4obixlK28pLHBhZ2VTaXplOml9KSkpLFZlKHRoaXMuc3RvcmUuc2VsZWN0KEZaKSksSXQoKChbdCxlXSk9Pih7cHJvcHM6dCxsb2FkZWQ6ZSxtaXNzaW5nUGFnZXM6TkoodC5iZWdpbix0LmVuZCx0LnBhZ2VTaXplLGUubnVtRXhlY3V0aW9ucyxlLnBhZ2VMb2FkZWRTaXplcyl9KSkpLGNlKCgoe21pc3NpbmdQYWdlczp0fSk9PnQubGVuZ3RoPjApKSxJdCgoKHtwcm9wczp0LGxvYWRlZDplLG1pc3NpbmdQYWdlczpufSk9Pntjb25zdHtydW5JZDpvLHBhZ2VTaXplOml9PXQ7cmV0dXJue2JlZ2luOm5bMF0qaSxlbmQ6TWF0aC5taW4oZS5udW1FeGVjdXRpb25zLChuW24ubGVuZ3RoLTFdKzEpKmkpLHJ1bklkOm99fSkpKX1jcmVhdGVFeGVjdXRpb25EaWdlc3RMb2FkZXIodCl7cmV0dXJuIHQucGlwZShWZSh0aGlzLnN0b3JlLnNlbGVjdChGWikpLGNlKCgoW3tiZWdpbjp0LGVuZDplfSxuXSk9PmU+dCYmIShmdW5jdGlvbiBvKHQsZSxuKXtpZihlPj1uKXRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYmVnaW4gdG8gYmUgbGVzcyB0aGFuIGVuZCwgYnV0IGdvdCBiZWdpbj0ke2V9LCBlbmQ9JHtufWApO3JldHVybi0xIT09dC5maW5kSW5kZXgoKHQ9PnQuYmVnaW4+PWUmJnQuZW5kPD1uKSl9KShuLmxvYWRpbmdSYW5nZXMsdCxlKSkpLEZlKCgoW3tiZWdpbjp0LGVuZDplfV0pPT57dGhpcy5zdG9yZS5kaXNwYXRjaChVcSh7YmVnaW46dCxlbmQ6ZX0pKX0pKSxadCgoKFt7cnVuSWQ6dCxiZWdpbjplLGVuZDpufV0pPT50aGlzLmRhdGFTb3VyY2UuZmV0Y2hFeGVjdXRpb25EaWdlc3RzKHQsZSxuKS5waXBlKEZlKCh0PT57dGhpcy5zdG9yZS5kaXNwYXRjaChHcSh0KSl9KSksSXQoKCgpPT57fSkpKSkpKX1vbkV4ZWN1dGlvbkRpZ2VzdEZvY3VzZWQoKXtyZXR1cm4gdGhpcy5hY3Rpb25zJC5waXBlKERrKFpxKSxWZSh0aGlzLnN0b3JlLnNlbGVjdChrWiksdGhpcy5zdG9yZS5zZWxlY3QoY1gpLHRoaXMuc3RvcmUuc2VsZWN0KEJaKSksSXQoKChbdCxlLG4sb10pPT4oe2FjdGl2ZVJ1bklkOmUsbG9hZGVkRXhlY3V0aW9uRGF0YTpuLGZvY3VzSW5kZXg6byt0LmRpc3BsYXlJbmRleH0pKSkpfWNyZWF0ZUV4ZWN1dGlvbkRhdGFBbmRTdGFja0ZyYW1lc0xvYWRlcih0KXtyZXR1cm4gdC5waXBlKGNlKCgoe2FjdGl2ZVJ1bklkOnQsbG9hZGVkRXhlY3V0aW9uRGF0YTplLGZvY3VzSW5kZXg6bn0pPT5udWxsIT09dCYmbnVsbCE9PW4mJnZvaWQgMD09PWVbbl0pKSxadCgoKHthY3RpdmVSdW5JZDp0LGZvY3VzSW5kZXg6ZX0pPT57Y29uc3Qgbj1lLG89bisxO3JldHVybiB0aGlzLmRhdGFTb3VyY2UuZmV0Y2hFeGVjdXRpb25EYXRhKHQsbixvKS5waXBlKEZlKCh0PT57dGhpcy5zdG9yZS5kaXNwYXRjaChYcSh0KSl9KSksSXQoKHQ9Pih7ZXhlY3V0aW9uRGF0YTp0LGJlZ2luOm4sZW5kOm99KSkpKX0pKSxJdCgoKHtleGVjdXRpb25EYXRhOnR9KT0+dC5leGVjdXRpb25zWzBdKSksVmUodGhpcy5zdG9yZS5zZWxlY3Qoa1opLHRoaXMuc3RvcmUuc2VsZWN0KHBYKSksY2UoKChbdCxlLG5dKT0+e2lmKG51bGw9PT1lKXJldHVybiExO2Zvcihjb25zdCBlIG9mIHQuc3RhY2tfZnJhbWVfaWRzKWlmKHZvaWQgMD09PW5bZV0pcmV0dXJuITA7cmV0dXJuITF9KSksWnQoKChbdCxlXSk9Pntjb25zdCBuPXQuc3RhY2tfZnJhbWVfaWRzO3JldHVybiB0aGlzLmRhdGFTb3VyY2UuZmV0Y2hTdGFja0ZyYW1lcyhlLG4pLnBpcGUoRmUoKHQ9Pntjb25zdCBlPXt9O2ZvcihsZXQgbz0wO288bi5sZW5ndGg7KytvKWVbbltvXV09dC5zdGFja19mcmFtZXNbb107dGhpcy5zdG9yZS5kaXNwYXRjaChkWih7c3RhY2tGcmFtZXM6ZX0pKX0pKSxJdCgoKCk9Pnt9KSkpfSkpKX1vbkdyYXBoRXhlY3V0aW9uU2Nyb2xsKCl7cmV0dXJuIHRoaXMuYWN0aW9ucyQucGlwZShEayh0WiksZ2UoMTAwKSxWZSh0aGlzLnN0b3JlLnNlbGVjdChrWiksdGhpcy5zdG9yZS5zZWxlY3QoWVopLHRoaXMuc3RvcmUuc2VsZWN0KHFaKSksY2UoKChbLHQsZV0pPT5udWxsIT09dCYmZT4wKSksSXQoKChbLHQsZSxuXSk9Pih7cnVuSWQ6dCxudW1HcmFwaEV4ZWN1dGlvbnM6ZSxzY3JvbGxCZWdpbkluZGV4Om59KSkpLFZlKHRoaXMuc3RvcmUuc2VsZWN0KFhaKSx0aGlzLnN0b3JlLnNlbGVjdChaWiksdGhpcy5zdG9yZS5zZWxlY3QoS1opLHRoaXMuc3RvcmUuc2VsZWN0KEpaKSksSXQoKChbe3J1bklkOnQsbnVtR3JhcGhFeGVjdXRpb25zOmUsc2Nyb2xsQmVnaW5JbmRleDpufSxvLGksYSxyXSk9PntsZXQgcz1OSihuLE1hdGgubWluKG4raSxlKSxvLGUscik7cmV0dXJuIHM9cy5maWx0ZXIoKHQ9Pi0xPT09YS5pbmRleE9mKHQpKSkse3J1bklkOnQsbWlzc2luZ1BhZ2VzOnMscGFnZVNpemU6byxudW1HcmFwaEV4ZWN1dGlvbnM6ZX19KSkpfWxvYWRHcmFwaEV4ZWN1dGlvblBhZ2VzKHQpe3JldHVybiB0LnBpcGUoY2UoKCh7bWlzc2luZ1BhZ2VzOnR9KT0+dC5sZW5ndGg+MCkpLEZlKCgoe21pc3NpbmdQYWdlczp0fSk9Pnt0LmZvckVhY2goKHQ9Pnt0aGlzLnN0b3JlLmRpc3BhdGNoKFFxKHtwYWdlSW5kZXg6dH0pKX0pKX0pKSxadCgoKHtydW5JZDp0LG1pc3NpbmdQYWdlczplLHBhZ2VTaXplOm4sbnVtR3JhcGhFeGVjdXRpb25zOm99KT0+e2NvbnN0IGk9ZVswXSpuLGE9TWF0aC5taW4oKGVbZS5sZW5ndGgtMV0rMSkqbixvKTtyZXR1cm4gdGhpcy5kYXRhU291cmNlLmZldGNoR3JhcGhFeGVjdXRpb25EYXRhKHQsaSxhKS5waXBlKEZlKCh0PT57dGhpcy5zdG9yZS5kaXNwYXRjaCgkcSh0KSl9KSksSXQoKCgpPT57fSkpKX0pKSl9bG9hZEdyYXBoT3BJbmZvKCl7cmV0dXJuIHRoaXMuYWN0aW9ucyQucGlwZShEayhuWixlWiksVmUodGhpcy5zdG9yZS5zZWxlY3Qoa1opLHRoaXMuc3RvcmUuc2VsZWN0KGRYKSksY2UoKChbdCxlLG5dKT0+e2NvbnN0e2dyYXBoX2lkOm8sb3BfbmFtZTppfT10O3JldHVybiEobnVsbD09PWV8fHZvaWQgMCE9PW5bb10mJm5bb10uaGFzKGkpJiYobltvXS5nZXQoaSk9PT15RS5MT0FESU5HfHxuW29dLmdldChpKT09PXlFLkxPQURFRCkpfSkpLEZlKCgoW3tncmFwaF9pZDp0LG9wX25hbWU6ZX1dKT0+dGhpcy5zdG9yZS5kaXNwYXRjaChvWih7Z3JhcGhfaWQ6dCxvcF9uYW1lOmV9KSkpKSxadCgoKFt0LGVdKT0+e2NvbnN0e2dyYXBoX2lkOm4sb3BfbmFtZTpvfT10O3JldHVybiB0aGlzLmRhdGFTb3VyY2UuZmV0Y2hHcmFwaE9wSW5mbyhlLG4sbykucGlwZShGZSgodD0+dGhpcy5zdG9yZS5kaXNwYXRjaChpWih7Z3JhcGhPcEluZm9SZXNwb25zZTp0fSkpKSksSXQoKHQ9Pih7cnVuSWQ6ZSxzdGFja0ZyYW1lSWRzOnQuc3RhY2tfZnJhbWVfaWRzfSkpKSl9KSkpfWxvYWRHcmFwaE9wU3RhY2tGcmFtZXModCl7cmV0dXJuIHQucGlwZShWZSh0aGlzLnN0b3JlLnNlbGVjdChwWCkpLEl0KCgoW3tydW5JZDp0LHN0YWNrRnJhbWVJZHM6ZX0sbl0pPT4oe3J1bklkOnQsbWlzc2luZ1N0YWNrRnJhbWVJZHM6ZS5maWx0ZXIoKHQ9PnZvaWQgMD09PW5bdF0pKX0pKSksY2UoKCh7cnVuSWQ6dCxtaXNzaW5nU3RhY2tGcmFtZUlkczplfSk9Pm51bGwhPT10JiZlLmxlbmd0aD4wKSksWnQoKCh7cnVuSWQ6dCxtaXNzaW5nU3RhY2tGcmFtZUlkczplfSk9PnRoaXMuZGF0YVNvdXJjZS5mZXRjaFN0YWNrRnJhbWVzKHQsZSkucGlwZShGZSgodD0+e2NvbnN0IG49e307Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDsrK28pbltlW29dXT10LnN0YWNrX2ZyYW1lc1tvXTt0aGlzLnN0b3JlLmRpc3BhdGNoKGRaKHtzdGFja0ZyYW1lczpufSkpfSkpLEl0KCgoKT0+e30pKSkpKSl9b25BbGVydFR5cGVGb2N1c2VkKCl7cmV0dXJuIHRoaXMuYWN0aW9ucyQucGlwZShEayhCcSksVmUodGhpcy5zdG9yZS5zZWxlY3Qoa1opLHRoaXMuc3RvcmUuc2VsZWN0KEFaKSx0aGlzLnN0b3JlLnNlbGVjdChUWiksdGhpcy5zdG9yZS5zZWxlY3QoTlopLHRoaXMuc3RvcmUuc2VsZWN0KEVaKSksY2UoKChbLHQsZSxuLG8saV0pPT5udWxsIT09dCYmbnVsbCE9PWUmJm4+MCYmKG51bGw9PT1vfHxPYmplY3Qua2V5cyhvKS5sZW5ndGg8bikmJmkuc3RhdGUhPT15RS5MT0FESU5HKSksRmUoKCgpPT50aGlzLnN0b3JlLmRpc3BhdGNoKEhxKCkpKSksWnQoKChbLHQsZV0pPT50aGlzLmRhdGFTb3VyY2UuZmV0Y2hBbGVydHModCwwLC0xLGUpKSksRmUoKCh7bnVtX2FsZXJ0czp0LGFsZXJ0c19icmVha2Rvd246ZSxhbGVydF90eXBlOm4sYmVnaW46byxlbmQ6aSxhbGVydHM6YX0pPT57dGhpcy5zdG9yZS5kaXNwYXRjaChMcSh7bnVtQWxlcnRzOnQsYWxlcnRzQnJlYWtkb3duOmUsYWxlcnRUeXBlOm4sYmVnaW46byxlbmQ6aSxhbGVydHM6YX0pKX0pKSl9ZmV0Y2hFeGVjdXRpb25EaWdlc3RzRm9yQWxlcnRUeXBlRm9jdXModCl7cmV0dXJuIHQucGlwZShWZSh0aGlzLnN0b3JlLnNlbGVjdChWWiksdGhpcy5zdG9yZS5zZWxlY3QoalopLHRoaXMuc3RvcmUuc2VsZWN0KExaKSx0aGlzLnN0b3JlLnNlbGVjdChGWiksdGhpcy5zdG9yZS5zZWxlY3Qoa1opKSxJdCgoKFt0LGUsbixvLGksYV0pPT57Y29uc3Qgcj10LmFsZXJ0c1swXS5leGVjdXRpb25faW5kZXgscz1OSihNYXRoLm1heCgwLHItTWF0aC5mbG9vcihuLzIpKSxNYXRoLm1pbihyK01hdGguZmxvb3Iobi8yKSxvKSxlLG8saS5wYWdlTG9hZGVkU2l6ZXMpO3JldHVybiAwPT09cy5sZW5ndGg/e3J1bklkOmEsYmVnaW46MCxlbmQ6MH06e3J1bklkOmEsYmVnaW46c1swXSplLGVuZDpNYXRoLm1pbihpLm51bUV4ZWN1dGlvbnMsKHNbcy5sZW5ndGgtMV0rMSkqZSl9fSkpKX1sb2FkU291cmNlRmlsZUxpc3QodCl7cmV0dXJuIHQucGlwZShWZSh0aGlzLnN0b3JlLnNlbGVjdChrWiksdGhpcy5zdG9yZS5zZWxlY3QoaFgpKSxjZSgoKFssdCxlXSk9Pm51bGwhPT10JiZlLnN0YXRlIT09eUUuTE9BRElORykpLEZlKCgoKT0+dGhpcy5zdG9yZS5kaXNwYXRjaChhWigpKSkpLFp0KCgoWyx0XSk9PnRoaXMuZGF0YVNvdXJjZS5mZXRjaFNvdXJjZUZpbGVMaXN0KHQpLnBpcGUoRmUoKHQ9Pntjb25zdCBlPVtdO3QuZm9yRWFjaCgoKFt0LG5dKT0+e2UucHVzaCh7aG9zdF9uYW1lOnQsZmlsZV9wYXRoOm59KX0pKSx0aGlzLnN0b3JlLmRpc3BhdGNoKHJaKHtzb3VyY2VGaWxlczplfSkpfSkpLEl0KCgoKT0+e30pKSkpKSl9b25Tb3VyY2VGaWxlRm9jdXNlZCgpe3JldHVybiB0aGlzLmFjdGlvbnMkLnBpcGUoRGsoc1opLFZlKHRoaXMuc3RvcmUuc2VsZWN0KGtaKSx0aGlzLnN0b3JlLnNlbGVjdChiWCksdGhpcy5zdG9yZS5zZWxlY3QoeVgpKSxJdCgoKFt0LGUsbixvXSk9Pih7cnVuSWQ6ZSxzdGFja0ZyYW1lOnQuc3RhY2tGcmFtZSxmaWxlSW5kZXg6bixmaWxlQ29udGVudDpvfSkpKSxjZSgoKHtydW5JZDp0LGZpbGVDb250ZW50OmV9KT0+bnVsbCE9PXQmJm51bGwhPT1lJiZlLmxvYWRTdGF0ZT09PXlFLk5PVF9MT0FERUQpKSxGZSgoKHtzdGFja0ZyYW1lOnR9KT0+dGhpcy5zdG9yZS5kaXNwYXRjaChsWih7aG9zdF9uYW1lOnQuaG9zdF9uYW1lLGZpbGVfcGF0aDp0LmZpbGVfcGF0aH0pKSkpLFp0KCgoe2ZpbGVJbmRleDp0LHJ1bklkOmV9KT0+dGhpcy5kYXRhU291cmNlLmZldGNoU291cmNlRmlsZShlLHQpLnBpcGUoRmUoKHQ9Pnt0aGlzLnN0b3JlLmRpc3BhdGNoKGNaKHQpKX0pKSxJdCgoKCk9Pnt9KSkpKSkpfX16Si7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8ekopKHZyKFNrKSx2cihJdyksdnIoa3EpKX0sekouybVwcm92PU1uKHt0b2tlbjp6SixmYWN0b3J5OnpKLsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh6Sixbe3R5cGU6aW19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6U2t9LHt0eXBlOkl3fSx7dHlwZTprcX1dfSksbnVsbCk7Y2xhc3MgSUp7fUlKLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxJSil9LElKLsm1bW9kPWFvKHt0eXBlOklKfSksSUouybVpbmo9dm4oe2ltcG9ydHM6W1tXTV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChJSixbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbeFgsUFhdLGltcG9ydHM6W1dNXSxleHBvcnRzOltQWF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhJSix7ZGVjbGFyYXRpb25zOlt4WCxQWF0saW1wb3J0czpbV01dLGV4cG9ydHM6W1BYXX0pO2NsYXNzIEhKe31ISi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SEopfSxISi7JtW1vZD1hbyh7dHlwZTpISn0pLEhKLsm1aW5qPXZuKHtpbXBvcnRzOltbV01dXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoSEosW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W0JLLERLLFZLXSxpbXBvcnRzOltXTV0sZXhwb3J0czpbVktdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oSEose2RlY2xhcmF0aW9uczpbQkssREssVktdLGltcG9ydHM6W1dNXSxleHBvcnRzOltWS119KTtjbGFzcyBGSnt9RkouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEZKKX0sRkouybVtb2Q9YW8oe3R5cGU6Rkp9KSxGSi7JtWluaj12bih7aW1wb3J0czpbW1dNXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEZKLFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOlt0SyxpSyxvSyxlSyxuSyxhS10saW1wb3J0czpbV01dLGV4cG9ydHM6W2FLXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKEZKLHtkZWNsYXJhdGlvbnM6W3RLLGlLLG9LLGVLLG5LLGFLXSxpbXBvcnRzOltXTV0sZXhwb3J0czpbYUtdfSk7Y2xhc3MgTEp7fUxKLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxMSil9LExKLsm1bW9kPWFvKHt0eXBlOkxKfSksTEouybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxGSixfRl1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChMSixbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbS0ssSktdLGltcG9ydHM6W1dNLEZKLF9GXSxleHBvcnRzOltKS119XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhMSix7ZGVjbGFyYXRpb25zOltLSyxKS10saW1wb3J0czpbV00sRkosX0ZdLGV4cG9ydHM6W0pLXX0pO2NsYXNzIEJKe31CSi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8QkopfSxCSi7JtW1vZD1hbyh7dHlwZTpCSn0pLEJKLsm1aW5qPXZuKHt9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEJKLFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltEcSxFcV0sZXhwb3J0czpbRXFdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oQkose2RlY2xhcmF0aW9uczpbRHEsRXFdLGV4cG9ydHM6W0VxXX0pO2NsYXNzIFZKe31WSi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VkopfSxWSi7JtW1vZD1hbyh7dHlwZTpWSn0pLFZKLsm1aW5qPXZuKHt9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFZKLFt7dHlwZTpBeSxhcmdzOlt7ZXhwb3J0czpbb0pdLGRlY2xhcmF0aW9uczpbb0pdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oVkose2RlY2xhcmF0aW9uczpbb0pdLGV4cG9ydHM6W29KXX0pO2NvbnN0IGpKPVsiY29kZVZpZXdlckNvbnRhaW5lciJdO2NsYXNzIFVKe2NvbnN0cnVjdG9yKCl7dGhpcy5maXJzdFRleHQ9bnVsbCx0aGlzLnNlY29uZFRleHQ9bnVsbCx0aGlzLnJlbmRlclNpZGVCeVNpZGU9ITAsdGhpcy5tb25hY289bnVsbCx0aGlzLmVkaXRvcj1udWxsLHRoaXMuUkVTSVpFX0RFQk9VTkNFX0lOVEVSVkFMX01TPTUwfW9uUmVzaXplKCl7dGhpcy5lZGl0b3ImJnRoaXMuZWRpdG9yLmxheW91dCgpfW5nT25DaGFuZ2VzKHQpe2lmKCF0aGlzLm1vbmFjbylyZXR1cm47Y29uc3QgZT0hdGhpcy5lZGl0b3I7ZSYmKHRoaXMuZWRpdG9yPXRoaXMubW9uYWNvLmVkaXRvci5jcmVhdGVEaWZmRWRpdG9yKHRoaXMuY29kZVZpZXdlckNvbnRhaW5lci5uYXRpdmVFbGVtZW50LHtyZWFkT25seTohMCxmb250U2l6ZToxMCxtaW5pbWFwOntlbmFibGVkOiEwfSxyZW5kZXJTaWRlQnlTaWRlOnRoaXMucmVuZGVyU2lkZUJ5U2lkZSx0aGVtZTpuSih0aGlzLnVzZURhcmtNb2RlKX0pKSwoZXx8dC5maXJzdFRleHR8fHQuc2Vjb25kVGV4dCkmJnRoaXMuZWRpdG9yLnNldE1vZGVsKHtvcmlnaW5hbDp0aGlzLm1vbmFjby5lZGl0b3IuY3JlYXRlTW9kZWwodGhpcy5maXJzdFRleHR8fCIiKSxtb2RpZmllZDp0aGlzLm1vbmFjby5lZGl0b3IuY3JlYXRlTW9kZWwodGhpcy5zZWNvbmRUZXh0fHwiIil9KSx0LnJlbmRlclNpZGVCeVNpZGUmJnRoaXMuZWRpdG9yLnVwZGF0ZU9wdGlvbnMoe3JlbmRlclNpZGVCeVNpZGU6dGhpcy5yZW5kZXJTaWRlQnlTaWRlfSksdC51c2VEYXJrTW9kZSYmdGhpcy5tb25hY28uZWRpdG9yLnNldFRoZW1lKG5KKHRoaXMudXNlRGFya01vZGUpKX19VUouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFVKKX0sVUouybVjbXA9dG8oe3R5cGU6VUosc2VsZWN0b3JzOltbInNvdXJjZS1jb2RlLWRpZmYtY29tcG9uZW50Il1dLHZpZXdRdWVyeTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiZRaChqSiw3LGhnKSwyJmUpe2xldCB0O0poKHQ9dGIoKSkmJihuLmNvZGVWaWV3ZXJDb250YWluZXI9dC5maXJzdCl9fSxpbnB1dHM6e2ZpcnN0VGV4dDoiZmlyc3RUZXh0IixzZWNvbmRUZXh0OiJzZWNvbmRUZXh0IixyZW5kZXJTaWRlQnlTaWRlOiJyZW5kZXJTaWRlQnlTaWRlIixtb25hY286Im1vbmFjbyIsdXNlRGFya01vZGU6InVzZURhcmtNb2RlIn0sZmVhdHVyZXM6W0JvXSxkZWNsczoyLHZhcnM6MSxjb25zdHM6W1siZGV0ZWN0UmVzaXplIiwiIiwxLCJjb2RlLXZpZXdlci1jb250YWluZXIiLDMsInJlc2l6ZUV2ZW50RGVib3VuY2VQZXJpb2RJbk1zIiwib25SZXNpemUiXSxbImNvZGVWaWV3ZXJDb250YWluZXIiLCIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImRpdiIsMCwxKSxWbSgib25SZXNpemUiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25SZXNpemUoKX0pKSxBbSgpKSwyJmUmJkRtKCJyZXNpemVFdmVudERlYm91bmNlUGVyaW9kSW5NcyIsbi5SRVNJWkVfREVCT1VOQ0VfSU5URVJWQUxfTVMpfSxkaXJlY3RpdmVzOltvSl0sc3R5bGVzOlsiLmNvZGUtdmlld2VyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICB9Il0sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFVKLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InNvdXJjZS1jb2RlLWRpZmYtY29tcG9uZW50Iix0ZW1wbGF0ZTonXG4gICAgPGRpdlxuICAgICAgI2NvZGVWaWV3ZXJDb250YWluZXJcbiAgICAgIGNsYXNzPSJjb2RlLXZpZXdlci1jb250YWluZXIiXG4gICAgICBkZXRlY3RSZXNpemVcbiAgICAgIFtyZXNpemVFdmVudERlYm91bmNlUGVyaW9kSW5Nc109IlJFU0laRV9ERUJPVU5DRV9JTlRFUlZBTF9NUyJcbiAgICAgIChvblJlc2l6ZSk9Im9uUmVzaXplKCkiXG4gICAgPjwvZGl2PlxuICAnLHN0eWxlczpbIlxuICAgICAgLmNvZGUtdmlld2VyLWNvbnRhaW5lciB7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIH1cbiAgICAiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSxudWxsLHtmaXJzdFRleHQ6W3t0eXBlOnh5fV0sc2Vjb25kVGV4dDpbe3R5cGU6eHl9XSxyZW5kZXJTaWRlQnlTaWRlOlt7dHlwZTp4eX1dLG1vbmFjbzpbe3R5cGU6eHl9XSx1c2VEYXJrTW9kZTpbe3R5cGU6eHl9XSxjb2RlVmlld2VyQ29udGFpbmVyOlt7dHlwZTpaYSxhcmdzOlsiY29kZVZpZXdlckNvbnRhaW5lciIse3N0YXRpYzohMCxyZWFkOmhnfV19XX0pO2NsYXNzIEdKe2NvbnN0cnVjdG9yKCl7dGhpcy5maXJzdFRleHQ9bnVsbCx0aGlzLnNlY29uZFRleHQ9bnVsbCx0aGlzLnJlbmRlclNpZGVCeVNpZGU9ITAsdGhpcy51c2VEYXJrTW9kZT0hMSx0aGlzLm1vbmFjbyQ9bnVsbH1uZ09uSW5pdCgpe3RoaXMubW9uYWNvJD1DdChlSigpKS5waXBlKEl0KCgoKT0+d2luZG93Lm1vbmFjbykpKX19R0ouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEdKKX0sR0ouybVjbXA9dG8oe3R5cGU6R0osc2VsZWN0b3JzOltbInNvdXJjZS1jb2RlLWRpZmYiXV0saW5wdXRzOntmaXJzdFRleHQ6ImZpcnN0VGV4dCIsc2Vjb25kVGV4dDoic2Vjb25kVGV4dCIscmVuZGVyU2lkZUJ5U2lkZToicmVuZGVyU2lkZUJ5U2lkZSIsdXNlRGFya01vZGU6InVzZURhcmtNb2RlIn0sZGVjbHM6Mix2YXJzOjcsY29uc3RzOltbMywiZmlyc3RUZXh0Iiwic2Vjb25kVGV4dCIsInJlbmRlclNpZGVCeVNpZGUiLCJtb25hY28iLCJ1c2VEYXJrTW9kZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwic291cmNlLWNvZGUtZGlmZi1jb21wb25lbnQiLDApLEFoKDEsImFzeW5jIikpLDImZSYmRG0oImZpcnN0VGV4dCIsbi5maXJzdFRleHQpKCJzZWNvbmRUZXh0IixuLnNlY29uZFRleHQpKCJyZW5kZXJTaWRlQnlTaWRlIixuLnJlbmRlclNpZGVCeVNpZGUpKCJtb25hY28iLFRoKDEsNSxuLm1vbmFjbyQpKSgidXNlRGFya01vZGUiLG4udXNlRGFya01vZGUpfSxkaXJlY3RpdmVzOltVSl0scGlwZXM6W3dNXSxzdHlsZXM6WyJzb3VyY2UtY29kZS1kaWZmLWNvbXBvbmVudFtfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgfSJdLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChHSixbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJzb3VyY2UtY29kZS1kaWZmIix0ZW1wbGF0ZTonXG4gICAgPHNvdXJjZS1jb2RlLWRpZmYtY29tcG9uZW50XG4gICAgICBbZmlyc3RUZXh0XT0iZmlyc3RUZXh0IlxuICAgICAgW3NlY29uZFRleHRdPSJzZWNvbmRUZXh0IlxuICAgICAgW3JlbmRlclNpZGVCeVNpZGVdPSJyZW5kZXJTaWRlQnlTaWRlIlxuICAgICAgW21vbmFjb109Im1vbmFjbyQgfCBhc3luYyJcbiAgICAgIFt1c2VEYXJrTW9kZV09InVzZURhcmtNb2RlIlxuICAgID48L3NvdXJjZS1jb2RlLWRpZmYtY29tcG9uZW50PlxuICAnLHN0eWxlczpbIlxuICAgICAgc291cmNlLWNvZGUtZGlmZi1jb21wb25lbnQge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgfVxuICAgICJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse2ZpcnN0VGV4dDpbe3R5cGU6eHl9XSxzZWNvbmRUZXh0Olt7dHlwZTp4eX1dLHJlbmRlclNpZGVCeVNpZGU6W3t0eXBlOnh5fV0sdXNlRGFya01vZGU6W3t0eXBlOnh5fV19KTtjbGFzcyBXSnt9V0ouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFdKKX0sV0ouybVtb2Q9YW8oe3R5cGU6V0p9KSxXSi7JtWluaj12bih7aW1wb3J0czpbW1dNLFZKXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFdKLFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOlthSixySixVSixHSl0saW1wb3J0czpbV00sVkpdLGV4cG9ydHM6W3JKLEdKXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFdKLHtkZWNsYXJhdGlvbnM6W2FKLHJKLFVKLEdKXSxpbXBvcnRzOltXTSxWSl0sZXhwb3J0czpbckosR0pdfSk7Y2xhc3MgWUp7fVlKLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxZSil9LFlKLsm1bW9kPWFvKHt0eXBlOllKfSksWUouybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxXSl1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChZSixbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbZEoscEpdLGltcG9ydHM6W1dNLFdKXSxleHBvcnRzOltwSl19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhZSix7ZGVjbGFyYXRpb25zOltkSixwSl0saW1wb3J0czpbV00sV0pdLGV4cG9ydHM6W3BKXX0pO2NsYXNzIHFKe31xSi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8cUopfSxxSi7JtW1vZD1hbyh7dHlwZTpxSn0pLHFKLsm1aW5qPXZuKHtpbXBvcnRzOltbV00sV0pdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgocUosW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W2tKLFNKXSxpbXBvcnRzOltXTSxXSl0sZXhwb3J0czpbU0pdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8ocUose2RlY2xhcmF0aW9uczpba0osU0pdLGltcG9ydHM6W1dNLFdKXSxleHBvcnRzOltTSl19KTtjbGFzcyBaSnt9WkouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFpKKX0sWkouybVtb2Q9YW8oe3R5cGU6Wkp9KSxaSi7JtWluaj12bih7aW1wb3J0czpbW1dNLEZKXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFpKLFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltwSyx1S10saW1wb3J0czpbV00sRkpdLGV4cG9ydHM6W3VLXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFpKLHtkZWNsYXJhdGlvbnM6W3BLLHVLXSxpbXBvcnRzOltXTSxGSl0sZXhwb3J0czpbdUtdfSk7Y2xhc3MgWEp7fVhKLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxYSil9LFhKLsm1bW9kPWFvKHt0eXBlOlhKfSksWEouybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxaSixKSCx6WF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChYSixbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbQ0ssdktdLGltcG9ydHM6W1dNLFpKLEpILHpYXSxleHBvcnRzOlt2S119XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhYSix7ZGVjbGFyYXRpb25zOltDSyx2S10saW1wb3J0czpbV00sWkosSkgselhdLGV4cG9ydHM6W3ZLXX0pO2NsYXNzIEtKe31mdW5jdGlvbiBKSih0LGUpe2NvbnN0IG49e307Zm9yKGNvbnN0IG8gb2YgT2JqZWN0LmtleXModCkpbltvXT1lKHRbb10sbyk7cmV0dXJuIG59ZnVuY3Rpb24gUUoodCxlLG4pe2NvbnN0e3BsdWdpbjpvLHRhZzppLHJ1bklkOmEsc2FtcGxlOnJ9PWVbdF0scz1uVChuLG8saSxyKTtpZihzKXtpZihudWxsIT09YSYmcy5ydW5Ub1Nlcmllcy5oYXNPd25Qcm9wZXJ0eShhKSl7Y29uc3QgdD1zLnJ1blRvU2VyaWVzW2FdLmxlbmd0aDtyZXR1cm4gdD4wP3QtMTpudWxsfWNvbnN0IHQ9T2JqZWN0LnZhbHVlcyhzLnJ1blRvU2VyaWVzKS5tYXAoKHQ9PnQubGVuZ3RoKSk7aWYodC5sZW5ndGgpcmV0dXJuIE1hdGgubWF4KC4uLnQpLTF9cmV0dXJuIG51bGx9ZnVuY3Rpb24gJEoodCxlLG4sbyl7Y29uc3QgaT1PYmplY3QuYXNzaWduKHt9LGUpO2Zvcihjb25zdCBhIGluIHQpe2lmKCF0Lmhhc093blByb3BlcnR5KGEpKWNvbnRpbnVlO2NvbnN0IHI9UUooYSx0LG4pO2lmKG51bGw9PT1yKXtlLmhhc093blByb3BlcnR5KGEpJiYoaVthXT1udWxsKTtjb250aW51ZX1jb25zdCBzPWUuaGFzT3duUHJvcGVydHkoYSk/ZVthXTpudWxsLGw9UUooYSx0LG8pLGM9bnVsbCE9PXMmJnM9PT1sLGQ9bnVsbD09PXN8fGM7KG51bGwhPT1zJiZzPnJ8fGQpJiYoaVthXT1yKX1yZXR1cm4gaX1mdW5jdGlvbiB0USh0KXtjb25zdCBlPUpKKHQucnVuVG9Mb2FkU3RhdGUsKHQ9PnQ9PT15RS5MT0FESU5HP3lFLkxPQURJTkc6eUUuTk9UX0xPQURFRCkpO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3J1blRvTG9hZFN0YXRlOmV9KX1mdW5jdGlvbiBlUSh0LGUsbixvKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoW3QsZSxufHwiIixvXSl9S0ouybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEtKKX0sS0ouybVtb2Q9YW8oe3R5cGU6S0p9KSxLSi7JtWluaj12bih7aW1wb3J0czpbW0lKLFdNLEVSLExKLEhKLEJKLFlKLHFKLFNxLFhKLGRrLmZvckZlYXR1cmUocFoseFopLFdrLmZvckZlYXR1cmUoW3pKXSksd3EuZm9yUGx1Z2luKFRKLEFKKV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChLSixbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbUkosQUpdLGltcG9ydHM6W0lKLFdNLEVSLExKLEhKLEJKLFlKLHFKLFNxLFhKLGRrLmZvckZlYXR1cmUocFoseFopLFdrLmZvckZlYXR1cmUoW3pKXSksd3EuZm9yUGx1Z2luKFRKLEFKKV0sZXhwb3J0czpbQUpdLGVudHJ5Q29tcG9uZW50czpbQUpdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oS0ose2RlY2xhcmF0aW9uczpbUkosQUpdLGltcG9ydHM6W0lKLFdNLEVSLExKLEhKLEJKLFlKLHFKLFNxLFhKLGNrLEdrLHdxXSxleHBvcnRzOltBSl19KTtjb25zdHtpbml0aWFsU3RhdGU6blEscmVkdWNlcnM6b1F9PUhOKHt0YWdNZXRhZGF0YUxvYWRTdGF0ZTp7c3RhdGU6eUUuTk9UX0xPQURFRCxsYXN0TG9hZGVkVGltZUluTXM6bnVsbH0sdGFnTWV0YWRhdGE6e3NjYWxhcnM6e3RhZ0Rlc2NyaXB0aW9uczp7fSx0YWdUb1J1bnM6e319LGhpc3RvZ3JhbXM6e3RhZ0Rlc2NyaXB0aW9uczp7fSx0YWdUb1J1bnM6e319LGltYWdlczp7dGFnRGVzY3JpcHRpb25zOnt9LHRhZ1J1blNhbXBsZWRJbmZvOnt9fX0sY2FyZExpc3Q6W10sY2FyZFRvUGlubmVkQ29weTpuZXcgTWFwLHBpbm5lZENhcmRUb09yaWdpbmFsOm5ldyBNYXAsdW5yZXNvbHZlZEltcG9ydGVkUGlubmVkQ2FyZHM6W10sY2FyZE1ldGFkYXRhTWFwOnt9LGNhcmRTdGVwSW5kZXg6e30sdGFnRmlsdGVyOiIiLHRhZ0dyb3VwRXhwYW5kZWQ6bmV3IE1hcCxzZWxlY3RlZFRpbWU6bnVsbCxzZWxlY3RUaW1lRW5hYmxlZDohMSx1c2VSYW5nZVNlbGVjdFRpbWU6ITEsZmlsdGVyZWRQbHVnaW5UeXBlczpuZXcgU2V0LHN0ZXBNaW5NYXg6e21pbjoxLzAsbWF4Oi0xLzB9fSx7aXNTZXR0aW5nc1BhbmVPcGVuOiEwLHByb21vdGVUaW1lU2VyaWVzOiEwLHRpbWVTZXJpZXNEYXRhOntzY2FsYXJzOnt9LGhpc3RvZ3JhbXM6e30saW1hZ2VzOnt9fSxzZXR0aW5nczpwVCxzZXR0aW5nT3ZlcnJpZGVzOnt9LHZpc2libGVDYXJkTWFwOm5ldyBNYXB9LCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3Zpc2libGVDYXJkTWFwOm5ldyBNYXB9KSkpLGlRPW5RLGFRPXlrKG5RLGJrKHJTLCgodCx7cm91dGVLaW5kOmUscGFydGlhbFN0YXRlOm59KT0+e2lmKGUhPT1aay5FWFBFUklNRU5UJiZlIT09WmsuQ09NUEFSRV9FWFBFUklNRU5UKXJldHVybiB0O2NvbnN0IG89bmV3IFNldDtmb3IoY29uc3QgZSBvZiB0LnBpbm5lZENhcmRUb09yaWdpbmFsLmtleXMoKSl7Y29uc3R7cGx1Z2luOm4sdGFnOmkscnVuSWQ6YSxzYW1wbGU6cn09dC5jYXJkTWV0YWRhdGFNYXBbZV07by5hZGQoZVEobixpLGEscikpfWNvbnN0IGk9bixhPVtdO2Zvcihjb25zdCBlIG9mWy4uLnQudW5yZXNvbHZlZEltcG9ydGVkUGlubmVkQ2FyZHMsLi4uaS5tZXRyaWNzLnBpbm5lZENhcmRzXSl7Y29uc3QgdD1lUShlLnBsdWdpbixlLnRhZyxlLnJ1bklkLGUuc2FtcGxlKTtvLmhhcyh0KXx8KG8uYWRkKHQpLGEucHVzaChlKSl9Y29uc3Qgcj1zVChhLHQuY2FyZExpc3QsdC5jYXJkTWV0YWRhdGFNYXAsdC5jYXJkVG9QaW5uZWRDb3B5LHQucGlubmVkQ2FyZFRvT3JpZ2luYWwsdC5jYXJkU3RlcEluZGV4KSxzPWkubWV0cmljcy5zbW9vdGhpbmc7bGV0IGw9dC5zZXR0aW5nT3ZlcnJpZGVzO2lmKE51bWJlci5pc0Zpbml0ZShzKSYmbnVsbCE9PXMpe2NvbnN0IGU9TWF0aC5tYXgoMCxNYXRoLm1pbiguOTk5LE51bWJlcihzLnRvUHJlY2lzaW9uKDMpKSkpO2w9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuc2V0dGluZ092ZXJyaWRlcykse3NjYWxhclNtb290aGluZzplfSl9Y29uc3QgYz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSxyKSx7c2V0dGluZ092ZXJyaWRlczpsfSk7cmV0dXJuIG51bGwhPT1pLm1ldHJpY3MudGFnRmlsdGVyJiYoYy50YWdGaWx0ZXI9aS5tZXRyaWNzLnRhZ0ZpbHRlciksY30pKSxiayhXUywoKHQse3BhcnRpYWxTZXR0aW5nczplfSk9Pnt2YXIgbjtjb25zdCBvPXt9O2lmKGUudG9vbHRpcFNvcnRTdHJpbmcpc3dpdGNoKGUudG9vbHRpcFNvcnRTdHJpbmcpe2Nhc2UgYkEuQVNDRU5ESU5HOm8udG9vbHRpcFNvcnQ9YkEuQVNDRU5ESU5HO2JyZWFrO2Nhc2UgYkEuREVTQ0VORElORzpvLnRvb2x0aXBTb3J0PWJBLkRFU0NFTkRJTkc7YnJlYWs7Y2FzZSBiQS5ERUZBVUxUOm8udG9vbHRpcFNvcnQ9YkEuREVGQVVMVDticmVhaztjYXNlIGJBLk5FQVJFU1Q6by50b29sdGlwU29ydD1iQS5ORUFSRVNUfSJib29sZWFuIj09dHlwZW9mIGUuaWdub3JlT3V0bGllcnMmJihvLmlnbm9yZU91dGxpZXJzPWUuaWdub3JlT3V0bGllcnMpLCJudW1iZXIiPT10eXBlb2YgZS5zY2FsYXJTbW9vdGhpbmcmJihvLnNjYWxhclNtb290aGluZz1lLnNjYWxhclNtb290aGluZyk7Y29uc3QgaT0iYm9vbGVhbiI9PXR5cGVvZiBlLnRpbWVTZXJpZXNQcm9tb3Rpb25EaXNtaXNzZWQ/IWUudGltZVNlcmllc1Byb21vdGlvbkRpc21pc3NlZDp0LnByb21vdGVUaW1lU2VyaWVzLGE9bnVsbCE9PShuPWUudGltZVNlcmllc1NldHRpbmdzUGFuZU9wZW5lZCkmJnZvaWQgMCE9PW4/bjp0LmlzU2V0dGluZ3NQYW5lT3BlbjtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtwcm9tb3RlVGltZVNlcmllczppLGlzU2V0dGluZ3NQYW5lT3BlbjphLHNldHRpbmdzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnNldHRpbmdzKSxvKX0pfSkpLGJrKHhFLHZFLCh0PT57Y29uc3QgZT10LnRhZ01ldGFkYXRhTG9hZFN0YXRlLnN0YXRlPT09eUUuTE9BRElORz95RS5MT0FESU5HOnlFLk5PVF9MT0FERUQsbj1KSih0LnRpbWVTZXJpZXNEYXRhLCgodCxlKT0+SkoodCwodD0+TUEoZSk/SkoodCwodD0+dFEodCkpKTp0USh0KSkpKSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7dGFnTWV0YWRhdGFMb2FkU3RhdGU6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQudGFnTWV0YWRhdGFMb2FkU3RhdGUpLHtzdGF0ZTplfSksdGltZVNlcmllc0RhdGE6bn0pfSkpLGJrKElFLCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3RhZ01ldGFkYXRhTG9hZFN0YXRlOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnRhZ01ldGFkYXRhTG9hZFN0YXRlKSx7c3RhdGU6eUUuTE9BRElOR30pfSkpKSxiayhGRSwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHt0YWdNZXRhZGF0YUxvYWRTdGF0ZTpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC50YWdNZXRhZGF0YUxvYWRTdGF0ZSkse3N0YXRlOnlFLkZBSUxFRH0pfSkpKSxiayhIRSwoKHQse3RhZ01ldGFkYXRhOmV9KT0+e2NvbnN0IG49e3NjYWxhcnM6c1EoZSxoQS5TQ0FMQVJTKSxoaXN0b2dyYW1zOnNRKGUsaEEuSElTVE9HUkFNUyksaW1hZ2VzOmVbaEEuSU1BR0VTXX0sbz1PYmplY3QuYXNzaWduKHt9LHQuY2FyZE1ldGFkYXRhTWFwKSxpPShmdW5jdGlvbiBhKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuIG9mIE9iamVjdC5rZXlzKHQpKXtjb25zdCBvPW47bGV0IGk7aWYoTUEobykpe2lmKCF4QShvKSl0aHJvdyBuZXcgRXJyb3IoIk11bHRpLXJ1biwgc2FtcGxlZCBwbHVnaW4gc3VwcG9ydCBub3QgeWV0IGltcGxlbWVudGVkIik7e2NvbnN0IG49dFtvXS50YWdSdW5TYW1wbGVkSW5mbztmb3IoY29uc3QgdCBvZiBPYmplY3Qua2V5cyhuKSlmb3IoY29uc3QgaSBvZiBPYmplY3Qua2V5cyhuW3RdKSl7Y29uc3R7bWF4U2FtcGxlc1BlclN0ZXA6YX09blt0XVtpXTtmb3IobGV0IG49MDtuPGE7bisrKWUucHVzaCh7cGx1Z2luOm8sdGFnOnQscnVuSWQ6aSxzYW1wbGU6bixudW1TYW1wbGU6YX0pfX19ZWxzZSBpZih4QShvKSl7aT10W29dLnRhZ1RvUnVucztmb3IoY29uc3QgdCBvZiBPYmplY3Qua2V5cyhpKSlmb3IoY29uc3QgbiBvZiBpW3RdKWUucHVzaCh7cGx1Z2luOm8sdGFnOnQscnVuSWQ6bn0pfWVsc2V7aT10W29dLnRhZ1RvUnVucztmb3IoY29uc3QgdCBvZiBPYmplY3Qua2V5cyhpKSllLnB1c2goe3BsdWdpbjpvLHRhZzp0LHJ1bklkOm51bGx9KX19cmV0dXJuIGV9KShuKSxyPVtdO2Zvcihjb25zdCBlIG9mIGkpe2NvbnN0IG49aVQoZSk7dC5jYXJkTWV0YWRhdGFNYXAuaGFzT3duUHJvcGVydHkobil8fChvW25dPWUsci5wdXNoKG4pKX1jb25zdCBzPVsuLi50LmNhcmRMaXN0LC4uLnJdLGw9c1QodC51bnJlc29sdmVkSW1wb3J0ZWRQaW5uZWRDYXJkcyxyLG8sdC5jYXJkVG9QaW5uZWRDb3B5LHQucGlubmVkQ2FyZFRvT3JpZ2luYWwsdC5jYXJkU3RlcEluZGV4KTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCksbCkse3RhZ01ldGFkYXRhTG9hZFN0YXRlOntzdGF0ZTp5RS5MT0FERUQsbGFzdExvYWRlZFRpbWVJbk1zOkRhdGUubm93KCl9LHRhZ01ldGFkYXRhOm4sY2FyZExpc3Q6c30pfSkpLGJrKGVSLCgodCx7dGFnRmlsdGVyOmV9KT0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHt0YWdGaWx0ZXI6ZX0pKSksYmsoTEUsKCh0LHtzb3J0OmV9KT0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzZXR0aW5nT3ZlcnJpZGVzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnNldHRpbmdPdmVycmlkZXMpLHt0b29sdGlwU29ydDplfSl9KSkpLGJrKEJFLCh0PT57dmFyIGU7Y29uc3Qgbj0hKG51bGwhPT0oZT10LnNldHRpbmdPdmVycmlkZXMuaWdub3JlT3V0bGllcnMpJiZ2b2lkIDAhPT1lP2U6dC5zZXR0aW5ncy5pZ25vcmVPdXRsaWVycyk7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7c2V0dGluZ092ZXJyaWRlczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5zZXR0aW5nT3ZlcnJpZGVzKSx7aWdub3JlT3V0bGllcnM6bn0pfSl9KSksYmsoVkUsKCh0LHt4QXhpc1R5cGU6ZX0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NldHRpbmdPdmVycmlkZXM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuc2V0dGluZ092ZXJyaWRlcykse3hBeGlzVHlwZTplfSl9KSkpLGJrKGpFLCgodCx7c21vb3RoaW5nOmV9KT0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzZXR0aW5nT3ZlcnJpZGVzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnNldHRpbmdPdmVycmlkZXMpLHtzY2FsYXJTbW9vdGhpbmc6ZX0pfSkpKSxiayhVRSwodD0+e3ZhciBlO2NvbnN0IG49IShudWxsIT09KGU9dC5zZXR0aW5nT3ZlcnJpZGVzLnNjYWxhclBhcnRpdGlvbk5vbk1vbm90b25pY1gpJiZ2b2lkIDAhPT1lP2U6dC5zZXR0aW5ncy5zY2FsYXJQYXJ0aXRpb25Ob25Nb25vdG9uaWNYKTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzZXR0aW5nT3ZlcnJpZGVzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnNldHRpbmdPdmVycmlkZXMpLHtzY2FsYXJQYXJ0aXRpb25Ob25Nb25vdG9uaWNYOm59KX0pfSkpLGJrKEdFLCgodCx7YnJpZ2h0bmVzc0luTWlsbGk6ZX0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NldHRpbmdPdmVycmlkZXM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuc2V0dGluZ092ZXJyaWRlcykse2ltYWdlQnJpZ2h0bmVzc0luTWlsbGk6ZX0pfSkpKSxiayhXRSwoKHQse2NvbnRyYXN0SW5NaWxsaTplfSk9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7c2V0dGluZ092ZXJyaWRlczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5zZXR0aW5nT3ZlcnJpZGVzKSx7aW1hZ2VDb250cmFzdEluTWlsbGk6ZX0pfSkpKSxiayhZRSwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzZXR0aW5nT3ZlcnJpZGVzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnNldHRpbmdPdmVycmlkZXMpLHtpbWFnZUJyaWdodG5lc3NJbk1pbGxpOnZvaWQgMH0pfSkpKSxiayhxRSwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzZXR0aW5nT3ZlcnJpZGVzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LnNldHRpbmdPdmVycmlkZXMpLHtpbWFnZUNvbnRyYXN0SW5NaWxsaTp2b2lkIDB9KX0pKSksYmsoWkUsKHQ9Pnt2YXIgZTtjb25zdCBuPSEobnVsbCE9PShlPXQuc2V0dGluZ092ZXJyaWRlcy5pbWFnZVNob3dBY3R1YWxTaXplKSYmdm9pZCAwIT09ZT9lOnQuc2V0dGluZ3MuaW1hZ2VTaG93QWN0dWFsU2l6ZSk7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7c2V0dGluZ092ZXJyaWRlczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5zZXR0aW5nT3ZlcnJpZGVzKSx7aW1hZ2VTaG93QWN0dWFsU2l6ZTpufSl9KX0pKSxiayhYRSwoKHQse2hpc3RvZ3JhbU1vZGU6ZX0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NldHRpbmdPdmVycmlkZXM6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuc2V0dGluZ092ZXJyaWRlcykse2hpc3RvZ3JhbU1vZGU6ZX0pfSkpKSxiayhLRSwoKHQse3JlcXVlc3RzOmV9KT0+e2lmKCFlLmxlbmd0aClyZXR1cm4gdDtjb25zdCBuPU9iamVjdC5hc3NpZ24oe30sdC50aW1lU2VyaWVzRGF0YSk7Zm9yKGNvbnN0IG8gb2YgZSl7Y29uc3R7cGx1Z2luOmUsdGFnOmksc2FtcGxlOmF9PW87bltlXT1vVChuLGUsaSxhKTtjb25zdCByPW5UKG4sZSxpLGEpLHM9T0Eobyk/W28ucnVuSWRdOnJUKHQudGFnTWV0YWRhdGEsZSxpLGEpO3IucnVuVG9Mb2FkU3RhdGU9YVQoeUUuTE9BRElORyxzLHIucnVuVG9Mb2FkU3RhdGUpfXJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3RpbWVTZXJpZXNEYXRhOm59KX0pKSxiayhKRSwoKHQse3JlcXVlc3Q6ZX0pPT57Y29uc3Qgbj1PYmplY3QuYXNzaWduKHt9LHQudGltZVNlcmllc0RhdGEpLHtwbHVnaW46byx0YWc6aSxzYW1wbGU6YX09ZTtuW29dPW9UKG4sbyxpLGEpO2NvbnN0IHI9blQobixvLGksYSkscz1PQShlKT9bZS5ydW5JZF06clQodC50YWdNZXRhZGF0YSxvLGksYSk7cmV0dXJuIHIucnVuVG9Mb2FkU3RhdGU9YVQoeUUuRkFJTEVELHMsci5ydW5Ub0xvYWRTdGF0ZSksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHt0aW1lU2VyaWVzRGF0YTpufSl9KSksYmsoUUUsKCh0LHtyZXNwb25zZTplfSk9Pntjb25zdCBuPU9iamVjdC5hc3NpZ24oe30sdC5zdGVwTWluTWF4KSxvPU9iamVjdC5hc3NpZ24oe30sdC50aW1lU2VyaWVzRGF0YSkse3BsdWdpbjppLHRhZzphLHJ1bklkOnIsc2FtcGxlOnN9PWU7b1tpXT1vVChvLGksYSxzKTtjb25zdCBsPW5UKG8saSxhLHMpO2lmKHdBKGUpKXtjb25zdCBlPXI/W3JdOnJUKHQudGFnTWV0YWRhdGEsaSxhLHMpO2wucnVuVG9Mb2FkU3RhdGU9YVQoeUUuRkFJTEVELGUsbC5ydW5Ub0xvYWRTdGF0ZSl9ZWxzZXtjb25zdCB0PWUucnVuVG9TZXJpZXM7bC5ydW5Ub1Nlcmllcz1PYmplY3QuYXNzaWduKHt9LGwucnVuVG9TZXJpZXMpLGwucnVuVG9Mb2FkU3RhdGU9T2JqZWN0LmFzc2lnbih7fSxsLnJ1blRvTG9hZFN0YXRlKTtmb3IoY29uc3QgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpe2wucnVuVG9TZXJpZXNbZV09dFtlXSxsLnJ1blRvTG9hZFN0YXRlW2VdPXlFLkxPQURFRDtmb3IoY29uc3QgbyBvZiB0W2VdKW4ubWluPU1hdGgubWluKG4ubWluLG8uc3RlcCksbi5tYXg9TWF0aC5tYXgobi5tYXgsby5zdGVwKX19cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7dGltZVNlcmllc0RhdGE6byxjYXJkU3RlcEluZGV4OiRKKHQuY2FyZE1ldGFkYXRhTWFwLHQuY2FyZFN0ZXBJbmRleCxvLHQudGltZVNlcmllc0RhdGEpLHN0ZXBNaW5NYXg6bn0pfSkpLGJrKHRSLCgodCx7Y2FyZElkOmUsc3RlcEluZGV4Om59KT0+e2NvbnN0IG89UUooZSx0LmNhcmRNZXRhZGF0YU1hcCx0LnRpbWVTZXJpZXNEYXRhKTtsZXQgaT1uO3JldHVybiBudWxsPT09bz9pPW51bGw6bj5vJiYoaT1vKSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2NhcmRTdGVwSW5kZXg6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuY2FyZFN0ZXBJbmRleCkse1tlXTppfSl9KX0pKSxiayhuUiwoKHQse3RhZ0dyb3VwOmV9KT0+e2NvbnN0IG49bmV3IE1hcCh0LnRhZ0dyb3VwRXhwYW5kZWQpO3JldHVybiBuLnNldChlLCFuLmdldChlKSksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHt0YWdHcm91cEV4cGFuZGVkOm59KX0pKSxiaygkRSwoKHQse2VudGVyZWRDYXJkczplLGV4aXRlZENhcmRzOm59KT0+e2lmKCFlLmxlbmd0aCYmIW4ubGVuZ3RoKXJldHVybiB0O2NvbnN0IG89bmV3IE1hcCh0LnZpc2libGVDYXJkTWFwKTtyZXR1cm4gZS5mb3JFYWNoKCgoe2VsZW1lbnRJZDp0LGNhcmRJZDplfSk9Pnt2YXIgbjtjb25zdCBpPW51bGwhPT0obj1vLmdldCh0KSkmJnZvaWQgMCE9PW4/bjpudWxsO2lmKG51bGwhPT1pJiZpIT09ZSl0aHJvdyBuZXcgRXJyb3IoIkEgRE9NIGVsZW1lbnQgY2Fubm90IGJlIHJldXNlZCBmb3IgbW9yZSB0aGFuIDEgdW5pcXVlIGNhcmQgbWV0YWRhdGEiKTtvLnNldCh0LGUpfSkpLG4uZm9yRWFjaCgoKHtlbGVtZW50SWQ6dH0pPT57by5kZWxldGUodCl9KSksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHt2aXNpYmxlQ2FyZE1hcDpvfSl9KSksYmsob1IsKCh0LHtjYXJkSWQ6ZX0pPT57Y29uc3Qgbj10LnBpbm5lZENhcmRUb09yaWdpbmFsLmhhcyhlKSxvPSFuJiYhdC5jYXJkVG9QaW5uZWRDb3B5LmhhcyhlKTtpZihvJiYhY1QodCkpcmV0dXJuIHQ7bGV0IGk9bmV3IE1hcCh0LmNhcmRUb1Bpbm5lZENvcHkpLGE9bmV3IE1hcCh0LnBpbm5lZENhcmRUb09yaWdpbmFsKSxyPU9iamVjdC5hc3NpZ24oe30sdC5jYXJkTWV0YWRhdGFNYXApLHM9T2JqZWN0LmFzc2lnbih7fSx0LmNhcmRTdGVwSW5kZXgpO2lmKG4pe2NvbnN0IG49dC5waW5uZWRDYXJkVG9PcmlnaW5hbC5nZXQoZSk7aS5kZWxldGUobiksYS5kZWxldGUoZSksZGVsZXRlIHJbZV0sZGVsZXRlIHNbZV19ZWxzZSBpZihvKXtjb25zdCB0PWxUKGUsaSxhLHMscik7aT10LmNhcmRUb1Bpbm5lZENvcHksYT10LnBpbm5lZENhcmRUb09yaWdpbmFsLHI9dC5jYXJkTWV0YWRhdGFNYXAscz10LmNhcmRTdGVwSW5kZXh9ZWxzZXtjb25zdCBuPXQuY2FyZFRvUGlubmVkQ29weS5nZXQoZSk7aS5kZWxldGUoZSksYS5kZWxldGUobiksZGVsZXRlIHJbbl0sZGVsZXRlIHNbbl19cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7Y2FyZE1ldGFkYXRhTWFwOnIsY2FyZFN0ZXBJbmRleDpzLGNhcmRUb1Bpbm5lZENvcHk6aSxwaW5uZWRDYXJkVG9PcmlnaW5hbDphfSl9KSksYmsobFIsKHQ9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7c2VsZWN0VGltZUVuYWJsZWQ6IXQuc2VsZWN0VGltZUVuYWJsZWR9KSkpLGJrKHJSLCgodCxlKT0+e3ZhciBuLG8saSxhO2NvbnN0IHI9ZS5zdGFydFN0ZXA7bGV0IHM9bnVsbCE9PShhPW51bGwhPT0obj1lLmVuZFN0ZXApJiZ2b2lkIDAhPT1uP246bnVsbD09PShpPW51bGw9PT0obz10LnNlbGVjdGVkVGltZSl8fHZvaWQgMD09PW8/dm9pZCAwOm8uZW5kKXx8dm9pZCAwPT09aT92b2lkIDA6aS5zdGVwKSYmdm9pZCAwIT09YT9hOnQuc3RlcE1pbk1heC5tYXg7cmV0dXJuIHI+cyYmKHM9ciksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzZWxlY3RUaW1lRW5hYmxlZDohMCxzZWxlY3RlZFRpbWU6e3N0YXJ0OntzdGVwOnJ9LGVuZDp7c3RlcDpzfX19KX0pKSxiayhjUiwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHt1c2VSYW5nZVNlbGVjdFRpbWU6IXQudXNlUmFuZ2VTZWxlY3RUaW1lfSkpKSxiayhzUiwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzZWxlY3RlZFRpbWU6bnVsbH0pKSksYmsoaVIsKCh0LHtwbHVnaW46ZX0pPT57bGV0IG49bmV3IFNldCh0LmZpbHRlcmVkUGx1Z2luVHlwZXMpO3JldHVybiBuLmhhcyhlKT9uLmRlbGV0ZShlKTpuLmFkZChlKSxPYmplY3QudmFsdWVzKGhBKS5ldmVyeSgodD0+bi5oYXModCkpKSYmKG49bmV3IFNldCksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtmaWx0ZXJlZFBsdWdpblR5cGVzOm59KX0pKSxiayhhUiwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtmaWx0ZXJlZFBsdWdpblR5cGVzOm5ldyBTZXR9KSkpLGJrKGRSLCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3Byb21vdGVUaW1lU2VyaWVzOiExfSkpKSxiayh6RSwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtpc1NldHRpbmdzUGFuZU9wZW46IXQuaXNTZXR0aW5nc1BhbmVPcGVufSkpKSxiayhORSwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtpc1NldHRpbmdzUGFuZU9wZW46ITF9KSkpKTtmdW5jdGlvbiByUSh0LGUpe3JldHVybiBCTihhUSxvUSkodCxlKX1mdW5jdGlvbiBzUSh0LGUpe3JldHVybnt0YWdEZXNjcmlwdGlvbnM6dFtlXS50YWdEZXNjcmlwdGlvbnMsdGFnVG9SdW5zOmxRKHRbZV0ucnVuVGFnSW5mbyl9fWZ1bmN0aW9uIGxRKHQpe2NvbnN0IGU9e307Zm9yKGNvbnN0IG4gaW4gdClmb3IoY29uc3QgbyBvZiB0W25dKWVbb109Wy4uLmVbb118fFtdLG5dO3JldHVybiBlfWNvbnN0IGNRPVp3KGdULHlULCgodCxlLG4pPT5lP09iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7bG9hZFN0YXRlOnQsaWQ6bn0pOm51bGwpKSxkUT1KUCgiW01ldHJpY3MgRWZmZWN0c10gSW5pdCIpO2NsYXNzIHBRe2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLmFjdGlvbnMkPXQsdGhpcy5zdG9yZT1lLHRoaXMuZGF0YVNvdXJjZT1uLHRoaXMuZGFzaGJvYXJkU2hvd25XaXRob3V0RGF0YSQ9dGhpcy5hY3Rpb25zJC5waXBlKERrKGRRLF9FLFBFLGRTKSxWZSh0aGlzLnN0b3JlLnNlbGVjdChNUiksdGhpcy5zdG9yZS5zZWxlY3QodVQpKSxjZSgoKFssdCxlXSk9PnQ9PT1fQSYmZS5zdGF0ZT09PXlFLk5PVF9MT0FERUQpKSksdGhpcy5yZWxvYWRSZXF1ZXN0ZWRXaGlsZVNob3duJD10aGlzLmFjdGlvbnMkLnBpcGUoRGsoeEUsdkUpLFZlKHRoaXMuc3RvcmUuc2VsZWN0KE1SKSksY2UoKChbLHRdKT0+dD09PV9BKSkpLHRoaXMubG9hZFRhZ01ldGFkYXRhJD1yZSh0aGlzLmRhc2hib2FyZFNob3duV2l0aG91dERhdGEkLHRoaXMucmVsb2FkUmVxdWVzdGVkV2hpbGVTaG93biQpLnBpcGUoVmUodGhpcy5zdG9yZS5zZWxlY3QodVQpLHRoaXMuc3RvcmUuc2VsZWN0KFRTKSksY2UoKChbLHQsZV0pPT50LnN0YXRlIT09eUUuTE9BRElORyYmbnVsbCE9PWUpKSxGZSgoKCk9Pnt0aGlzLnN0b3JlLmRpc3BhdGNoKElFKCkpfSkpLHplKCgoWywsdF0pPT50aGlzLmRhdGFTb3VyY2UuZmV0Y2hUYWdNZXRhZGF0YSh0KS5waXBlKEZlKCh0PT57dGhpcy5zdG9yZS5kaXNwYXRjaChIRSh7dGFnTWV0YWRhdGE6dH0pKX0pKSxwZSgoKCk9Pih0aGlzLnN0b3JlLmRpc3BhdGNoKEZFKCkpLEV0KG51bGwpKSkpKSkpKSx0aGlzLnZpc2libGVDYXJkc1dpdGhvdXREYXRhQ2hhbmdlZCQ9dGhpcy5hY3Rpb25zJC5waXBlKERrKCRFKSx6ZSgoKCk9PnRoaXMuZ2V0VmlzaWJsZUNhcmRGZXRjaEluZm9zKCkucGlwZShiZSgxKSkpKSxJdCgodD0+dC5maWx0ZXIoKHQ9PnQubG9hZFN0YXRlPT09eUUuTk9UX0xPQURFRCkpKSkpLHRoaXMudmlzaWJsZUNhcmRzUmVsb2FkZWQkPXRoaXMucmVsb2FkUmVxdWVzdGVkV2hpbGVTaG93biQucGlwZSh6ZSgoKCk9PnRoaXMuZ2V0VmlzaWJsZUNhcmRGZXRjaEluZm9zKCkucGlwZShiZSgxKSkpKSxJdCgodD0+dC5maWx0ZXIoKHQ9PnQubG9hZFN0YXRlIT09eUUuTE9BRElORykpKSkpLHRoaXMubG9hZFRpbWVTZXJpZXMkPXJlKHRoaXMudmlzaWJsZUNhcmRzV2l0aG91dERhdGFDaGFuZ2VkJCx0aGlzLnZpc2libGVDYXJkc1JlbG9hZGVkJCkucGlwZShjZSgodD0+dC5sZW5ndGg+MCkpLFZlKHRoaXMuc3RvcmUuc2VsZWN0KFRTKS5waXBlKGNlKCh0PT5udWxsIT09dCkpKSksWnQoKChbdCxlXSk9PnRoaXMuZmV0Y2hUaW1lU2VyaWVzRm9yQ2FyZHModCxlKSkpKSx0aGlzLmRhdGFFZmZlY3RzJD1NaygoKCk9PnJlKHRoaXMubG9hZFRhZ01ldGFkYXRhJCx0aGlzLmxvYWRUaW1lU2VyaWVzJCkpLHtkaXNwYXRjaDohMX0pfW5ncnhPbkluaXRFZmZlY3RzKCl7cmV0dXJuIGRRKCl9Z2V0VmlzaWJsZUNhcmRGZXRjaEluZm9zKCl7cmV0dXJuIHRoaXMuc3RvcmUuc2VsZWN0KENUKS5waXBlKHplKCh0PT50LnNpemU/JHQoWy4uLnRdLm1hcCgodD0+dGhpcy5zdG9yZS5zZWxlY3QoY1EsdCkucGlwZShiZSgxKSkpKSk6RXQoW10pKSksSXQoKHQ9PnQuZmlsdGVyKEJvb2xlYW4pKSkpfWZldGNoVGltZVNlcmllcyh0KXtyZXR1cm4gdGhpcy5kYXRhU291cmNlLmZldGNoVGltZVNlcmllcyhbdF0pLnBpcGUoRmUoKHQ9Pntjb25zdCBlPXQuZmlsdGVyKHdBKTtlLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVGltZSBzZXJpZXMgcmVzcG9uc2UgY29udGFpbmVkIGVycm9yczoiLGUpLHRoaXMuc3RvcmUuZGlzcGF0Y2goUUUoe3Jlc3BvbnNlOnRbMF19KSl9KSkscGUoKCgpPT4odGhpcy5zdG9yZS5kaXNwYXRjaChKRSh7cmVxdWVzdDp0fSkpLEV0KG51bGwpKSkpKX1mZXRjaFRpbWVTZXJpZXNGb3JDYXJkcyh0LGUpe3JldHVybiBFdCh0Lm1hcCgodD0+e2NvbnN0e3BsdWdpbjpuLHRhZzpvLHJ1bklkOmksc2FtcGxlOmF9PXQ7cmV0dXJuIHhBKG4pP3twbHVnaW46bix0YWc6byxzYW1wbGU6YSxydW5JZDppfTp7cGx1Z2luOm4sdGFnOm8sc2FtcGxlOmEsZXhwZXJpbWVudElkczplfX0pKSkucGlwZShGZSgodD0+e3RoaXMuc3RvcmUuZGlzcGF0Y2goS0Uoe3JlcXVlc3RzOnR9KSl9KSksWnQoKHQ9PnJlKC4uLnQubWFwKCh0PT50aGlzLmZldGNoVGltZVNlcmllcyh0KSkpKSkpKX19cFEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHBRKSh2cihTayksdnIoSXcpLHZyKFBBKSl9LHBRLsm1cHJvdj1Nbih7dG9rZW46cFEsZmFjdG9yeTpwUS7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgocFEsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlNrfSx7dHlwZTpJd30se3R5cGU6UEF9XX0pLG51bGwpO2NvbnN0IG1RPW5ldyBHYSgiTWV0cmljcyBTdG9yZSBDb25maWciKSx1UT1uZXcgR2EoIk1ldHJpY3MgSW5pdGlhbCBTZXR0aW5ncyBDb25maWciKTtmdW5jdGlvbiBmUSh0KXtyZXR1cm4gdD97aW5pdGlhbFN0YXRlOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxpUSkse3NldHRpbmdzOnR9KX06e2luaXRpYWxTdGF0ZTppUX19dmFyIGdROyEoZnVuY3Rpb24odCl7dFt0LkxFRlQ9MV09IkxFRlQiLHRbdC5SSUdIVD0yXT0iUklHSFQiLHRbdC5NSURETEU9NF09Ik1JRERMRSIsdFt0LkZPVVJUSD04XT0iRk9VUlRIIix0W3QuRklGVEg9MzJdPSJGSUZUSCJ9KShnUXx8KGdRPXt9KSk7bGV0IGhRPTA7ZnVuY3Rpb24gYlEodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJidXR0b24iLDMpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5leHBhbmRTaWRlYmFyKCl9KSksVG0oMSwibWF0LWljb24iLDQpLEFtKCl9fWZ1bmN0aW9uIHlRKHQsZSl7aWYoMSZ0JiYoUm0oMCwibmF2Iiw1KSxBaCgxLCJhc3luYyIpLFhtKDIsMSksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7ZHUoIndpZHRoIixUaCgxLDQsdC53aWR0aCQpLCIlIikoIm1pbi13aWR0aCIsdC5NSU5JTVVNX1NJREVCQVJfV0lEVEhfSU5fUFgsInB4Iil9fWZ1bmN0aW9uIF9RKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2Iiw2KSxWbSgibW91c2Vkb3duIiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgpLnJlc2l6ZUdyYWJiZWQoKX0pKSxUbSgxLCJtYXQtaWNvbiIsNyksQW0oKX19Y29uc3QgQ1E9W1tbIiIsIm1haW4iLCIiXV0sW1siIiwic2lkZWJhciIsIiJdXV07Y2xhc3MgTVF7Y29uc3RydWN0b3IodCxlKXt0aGlzLnN0b3JlPXQsdGhpcy53aWR0aCQ9dGhpcy5zdG9yZS5zZWxlY3QoT1IpLHRoaXMubmdVbnN1YnNjcmliZT1uZXcgSSx0aGlzLnJlc2l6aW5nPSExLHRoaXMuTUlOSU1VTV9TSURFQkFSX1dJRFRIX0lOX1BYPTc1LG9lKGUubmF0aXZlRWxlbWVudCwibW91c2Vtb3ZlIikucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpLGNlKCgoKT0+dGhpcy5yZXNpemluZykpKS5zdWJzY3JpYmUoKHQ9PntpZigodC5idXR0b25zJmdRLkxFRlQpIT09Z1EuTEVGVClyZXR1cm4gdm9pZCh0aGlzLnJlc2l6aW5nPSExKTt0LnByZXZlbnREZWZhdWx0KCk7Y29uc3R7d2lkdGg6bn09ZS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMuc3RvcmUuZGlzcGF0Y2goVEUoe3dpZHRoSW5QZXJjZW50OnQuY2xpZW50WDw9dGhpcy5NSU5JTVVNX1NJREVCQVJfV0lEVEhfSU5fUFg/MDp0LmNsaWVudFgvbioxMDB9KSl9KSksb2UoZS5uYXRpdmVFbGVtZW50LCJtb3VzZXVwIix7cGFzc2l2ZTohMH0pLnBpcGUoSWUodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKCgoKT0+e3RoaXMucmVzaXppbmc9ITF9KSl9bmdPbkRlc3Ryb3koKXt0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpLHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpfXJlc2l6ZUdyYWJiZWQoKXt0aGlzLnJlc2l6aW5nPSEwfWV4cGFuZFNpZGViYXIoKXt0aGlzLnN0b3JlLmRpc3BhdGNoKFRFKHt3aWR0aEluUGVyY2VudDoyMH0pKX19dmFyIHZRO01RLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxNUSkoU20oSXcpLFNtKGhnKSl9LE1RLsm1Y21wPXRvKHt0eXBlOk1RLHNlbGVjdG9yczpbWyJ0Yi1kYXNoYm9hcmQtbGF5b3V0Il1dLG5nQ29udGVudFNlbGVjdG9yczpbIlttYWluXSIsIltzaWRlYmFyXSJdLGRlY2xzOjcsdmFyczo5LGNvbnN0czpbWyJjbGFzcyIsImV4cGFuZCIsMywiY2xpY2siLDQsIm5nSWYiXSxbImNsYXNzIiwic2lkZWJhciIsMywid2lkdGgiLCJtaW5XaWR0aCIsNCwibmdJZiJdLFsiY2xhc3MiLCJyZXNpemVyIiwzLCJtb3VzZWRvd24iLDQsIm5nSWYiXSxbMSwiZXhwYW5kIiwzLCJjbGljayJdLFsic3ZnSWNvbiIsImV4cGFuZF9tb3JlXzI0cHgiXSxbMSwic2lkZWJhciJdLFsxLCJyZXNpemVyIiwzLCJtb3VzZWRvd24iXSxbInN2Z0ljb24iLCJkcmFnX2luZGljYXRvcl8yNHB4Il1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabShDUSksUXAoMCxiUSwyLDAsImJ1dHRvbiIsMCksQWgoMSwiYXN5bmMiKSxRcCgyLHlRLDMsNiwibmF2IiwxKSxBaCgzLCJhc3luYyIpLFFwKDQsX1EsMiwwLCJkaXYiLDIpLEFoKDUsImFzeW5jIiksWG0oNikpLDImZSYmKERtKCJuZ0lmIiwwPT09VGgoMSwzLG4ud2lkdGgkKSkscmMoMiksRG0oIm5nSWYiLFRoKDMsNSxuLndpZHRoJCk+MCkscmMoMiksRG0oIm5nSWYiLFRoKDUsNyxuLndpZHRoJCk+MCkpfSxkaXJlY3RpdmVzOltkTSxEV10scGlwZXM6W3dNXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJTtwb3NpdGlvbjpyZWxhdGl2ZX0uc2lkZWJhcltfbmdjb250ZW50LSVDT01QJV17bWF4LXdpZHRoOjgwdnd9LnJlc2l6ZXJbX25nY29udGVudC0lQ09NUCVdLCAuZXhwYW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ViZWJlYjtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZmxleDowIDAgMjBweDtqdXN0aWZ5LXNlbGY6c3RyZXRjaDt3aWR0aDoyMHB4fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5yZXNpemVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLnJlc2l6ZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNTU1fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5leHBhbmRbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuZXhwYW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzU1NX0ucmVzaXplcltfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6MCAxcHg7Y3Vyc29yOmV3LXJlc2l6ZTtkaXNwbGF5OmZsZXg7anVzdGlmeS1zZWxmOnN0cmV0Y2h9LnJlc2l6ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlfS5leHBhbmRbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6MCAxcHggMCAwO2NvbG9yOmluaGVyaXQ7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpmbGV4O2p1c3RpZnktc2VsZjpzdHJldGNoO3BhZGRpbmc6MH0uZXhwYW5kW19uZ2NvbnRlbnQtJUNPTVAlXSAgIG1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06cm90YXRlKC05MGRlZyk7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXJ9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKE1RLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InRiLWRhc2hib2FyZC1sYXlvdXQiLHRlbXBsYXRlOidcbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj0iKHdpZHRoJCB8IGFzeW5jKSA9PT0gMCJcbiAgICAgIGNsYXNzPSJleHBhbmQiXG4gICAgICAoY2xpY2spPSJleHBhbmRTaWRlYmFyKCkiXG4gICAgPlxuICAgICAgPG1hdC1pY29uIHN2Z0ljb249ImV4cGFuZF9tb3JlXzI0cHgiPjwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPG5hdlxuICAgICAgKm5nSWY9Iih3aWR0aCQgfCBhc3luYykgPiAwIlxuICAgICAgY2xhc3M9InNpZGViYXIiXG4gICAgICBbc3R5bGUud2lkdGguJV09IndpZHRoJCB8IGFzeW5jIlxuICAgICAgW3N0eWxlLm1pbldpZHRoLnB4XT0iTUlOSU1VTV9TSURFQkFSX1dJRFRIX0lOX1BYIlxuICAgID5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD0iW3NpZGViYXJdIj48L25nLWNvbnRlbnQ+XG4gICAgPC9uYXY+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9Iih3aWR0aCQgfCBhc3luYykgPiAwIlxuICAgICAgY2xhc3M9InJlc2l6ZXIiXG4gICAgICAobW91c2Vkb3duKT0icmVzaXplR3JhYmJlZCgpIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbiBzdmdJY29uPSJkcmFnX2luZGljYXRvcl8yNHB4Ij48L21hdC1pY29uPlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD0iW21haW5dIj48L25nLWNvbnRlbnQ+XG4gICcsc3R5bGVVcmxzOlsibGF5b3V0X2NvbnRhaW5lci5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9LHt0eXBlOmhnfV19KSxudWxsKSwoZnVuY3Rpb24odCl7dC5DSEVDS0JPWD0iY2hlY2tib3giLHQuUlVOX05BTUU9InJ1bl9uYW1lIix0LkVYUEVSSU1FTlRfTkFNRT0iZXhwZXJpbWVudF9uYW1lIix0LlJVTl9DT0xPUj0icnVuX2NvbG9yIn0pKHZRfHwodlE9e30pKTtjb25zdCB4UT1LdyhUUiksT1E9WncoeFEsKCh0LGUpPT57Y29uc3Qgbj1bXTtmb3IoY29uc3QgbyBvZiBlKXQuc3BlY3Nbb10mJm4ucHVzaCh0LnNwZWNzW29dLmhwYXJhbS5kZWZhdWx0RmlsdGVycyk7cmV0dXJuIHRBKG4pfSkpLFBRPVp3KE9RLHhRLCgodCxlLG4pPT57dmFyIG87Y29uc3QgaT0kUihuKSxhPWUuZmlsdGVyc1tpXTtyZXR1cm4gbmV3IE1hcChbLi4udCwuLi5udWxsIT09KG89bnVsbD09YT92b2lkIDA6YS5ocGFyYW1zKSYmdm9pZCAwIT09bz9vOltdXSl9KSksd1E9WncoeFEsKCh0LGUpPT57Y29uc3Qgbj1bXTtmb3IoY29uc3QgbyBvZiBlKXQuc3BlY3Nbb10mJm4ucHVzaCh0LnNwZWNzW29dLm1ldHJpYy5kZWZhdWx0RmlsdGVycyk7cmV0dXJuIGVBKG4pfSkpLGtRPVp3KHdRLHhRLCgodCxlLG4pPT57dmFyIG87Y29uc3QgaT0kUihuKSxhPWUuZmlsdGVyc1tpXTtyZXR1cm4gbmV3IE1hcChbLi4udCwuLi5udWxsIT09KG89bnVsbD09YT92b2lkIDA6YS5tZXRyaWNzKSYmdm9pZCAwIT09bz9vOltdXSl9KSksU1E9WncoeFEsKCh0LGUpPT4oZnVuY3Rpb24gbiguLi50KXtjb25zdCBlPW5ldyBNYXAsbj1uZXcgTWFwLG89bmV3IE1hcCxpPW5ldyBNYXAsYT1bXTtmb3IoY29uc3QgciBvZiB0KXtmb3IoY29uc3QgdCBvZiByLmhwYXJhbXMpaWYobi5oYXModC5uYW1lKXx8bi5zZXQodC5uYW1lLG5ldyBTZXQpLG4uZ2V0KHQubmFtZSkuYWRkKHQuZGlzcGxheU5hbWUpLGUuaGFzKHQubmFtZSkpe2NvbnN0IG49ZS5nZXQodC5uYW1lKSxvPXQ7aWYobi50eXBlIT09by50eXBlJiZhLnB1c2goYEhwYXJhbSwgJHtvLm5hbWV9LCB0eXBlcyBoYXZlIHRvIG1hdGNoLiBHb3Q6ICR7bi50eXBlfSB2cy4gJHtvLnR5cGV9YCksbi5kb21haW4udHlwZT09PVpSLklOVEVSVkFMJiZvLmRvbWFpbi50eXBlPT09WlIuSU5URVJWQUwpbi5kb21haW4ubWluVmFsdWU9PT1vLmRvbWFpbi5taW5WYWx1ZSYmbi5kb21haW4ubWF4VmFsdWU9PT1vLmRvbWFpbi5tYXhWYWx1ZXx8YS5wdXNoKGBIcGFyYW0sICR7by5uYW1lfSwgZG9tYWlucyBoYXZlIHRvIG1hdGNoLiBHb3Q6ICR7bi5kb21haW59IHZzLiAke28uZG9tYWlufWApO2Vsc2UgaWYobi5kb21haW4udHlwZT09PVpSLkRJU0NSRVRFJiZvLmRvbWFpbi50eXBlPT09WlIuRElTQ1JFVEUpe2NvbnN0IHQ9bmV3IFNldChbLi4ubi5kb21haW4udmFsdWVzLC4uLm8uZG9tYWluLnZhbHVlc10pO24uZG9tYWluLnZhbHVlcy5sZW5ndGg9PT1vLmRvbWFpbi52YWx1ZXMubGVuZ3RoJiZuLmRvbWFpbi52YWx1ZXMubGVuZ3RoPT09dC5zaXplfHxhLnB1c2goYEhwYXJhbSwgJHtvLm5hbWV9LCBkb21haW5zIGhhdmUgdG8gbWF0Y2guIEdvdDogJHtuLmRvbWFpbn0gdnMuICR7by5kb21haW59YCl9ZWxzZSBhLnB1c2goYEhwYXJhbSwgJHtvLm5hbWV9LCBkb21haW5zIGhhdmUgdG8gbWF0Y2guIEdvdDogJHtuLmRvbWFpbn0gdnMuICR7by5kb21haW59YCl9ZWxzZSBlLnNldCh0Lm5hbWUsT2JqZWN0LmFzc2lnbih7fSx0KSk7Zm9yKGNvbnN0IHQgb2Ygci5tZXRyaWNzKWlmKGkuaGFzKHQudGFnKXx8aS5zZXQodC50YWcsbmV3IFNldCksaS5nZXQodC50YWcpLmFkZCh0LmRpc3BsYXlOYW1lKSxvLmhhcyh0LnRhZykpe2NvbnN0IGU9by5nZXQodC50YWcpLG49dDtlLmRhdGFzZXRUeXBlIT09bi5kYXRhc2V0VHlwZSYmYS5wdXNoKGBNZXRyaWMsICR7bi50YWd9LCBkYXRhc2V0VHlwZXMgaGF2ZSB0byBtYXRjaC4gR290OiAke2UuZGF0YXNldFR5cGV9IHZzLiAke24uZGF0YXNldFR5cGV9YCl9ZWxzZSBvLnNldCh0LnRhZyxPYmplY3QuYXNzaWduKHt9LHQpKX1pZihhLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoYFZhbGlkYXRpb24gZXJyb3I6XG4ke2Euam9pbigiXG4iKX1gKTtyZXR1cm57aHBhcmFtczpbLi4uZV0ubWFwKCgoW3QsZV0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSkse2Rpc3BsYXlOYW1lOlsuLi5uLmdldCh0KV0uam9pbigiIG9yICIpfSkpKSxtZXRyaWNzOlsuLi5vXS5tYXAoKChbdCxlXSk9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx7ZGlzcGxheU5hbWU6Wy4uLmkuZ2V0KHQpXS5qb2luKCIgb3IgIil9KSkpfX0pKC4uLmUuZXhwZXJpbWVudElkcy5tYXAoKGU9Pntjb25zdCBuPXQuc3BlY3NbZV07cmV0dXJuIG4/e2hwYXJhbXM6bi5ocGFyYW0uc3BlY3MsbWV0cmljczpuLm1ldHJpYy5zcGVjc306bnVsbH0pKS5maWx0ZXIoQm9vbGVhbikpKSksRFE9e3Rvb2x0aXBTdGF0ZTpueCgic3RhdGUiLFtyeCgiaW5pdGlhbCwgdm9pZCwgaGlkZGVuIixheCh7b3BhY2l0eTowLHRyYW5zZm9ybToic2NhbGUoMCkifSkpLHJ4KCJ2aXNpYmxlIixheCh7dHJhbnNmb3JtOiJzY2FsZSgxKSJ9KSksbHgoIiogPT4gdmlzaWJsZSIsb3goIjIwMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpIixzeChbYXgoe29wYWNpdHk6MCx0cmFuc2Zvcm06InNjYWxlKDApIixvZmZzZXQ6MH0pLGF4KHtvcGFjaXR5Oi41LHRyYW5zZm9ybToic2NhbGUoMC45OSkiLG9mZnNldDouNX0pLGF4KHtvcGFjaXR5OjEsdHJhbnNmb3JtOiJzY2FsZSgxKSIsb2Zmc2V0OjF9KV0pKSksbHgoIiogPT4gaGlkZGVuIixveCgiMTAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSkiLGF4KHtvcGFjaXR5OjB9KSkpXSl9LEVRPU56KHtwYXNzaXZlOiEwfSk7ZnVuY3Rpb24gUlEodCl7cmV0dXJuIEVycm9yKGBUb29sdGlwIHBvc2l0aW9uICIke3R9IiBpcyBpbnZhbGlkLmApfWNvbnN0IEFRPW5ldyBHYSgibWF0LXRvb2x0aXAtc2Nyb2xsLXN0cmF0ZWd5IiksVFE9e3Byb3ZpZGU6QVEsZGVwczpbcExdLHVzZUZhY3Rvcnk6ZnVuY3Rpb24gTlEodCl7cmV0dXJuKCk9PnQuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKHtzY3JvbGxUaHJvdHRsZToyMH0pfX0selE9bmV3IEdhKCJtYXQtdG9vbHRpcC1kZWZhdWx0LW9wdGlvbnMiLHtwcm92aWRlZEluOiJyb290IixmYWN0b3J5OmZ1bmN0aW9uIElRKCl7cmV0dXJue3Nob3dEZWxheTowLGhpZGVEZWxheTowLHRvdWNoZW5kSGlkZURlbGF5OjE1MDB9fX0pO2NsYXNzIEhRe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIscyxsLGMsZCxwKXt0aGlzLl9vdmVybGF5PXQsdGhpcy5fZWxlbWVudFJlZj1lLHRoaXMuX3Njcm9sbERpc3BhdGNoZXI9bix0aGlzLl92aWV3Q29udGFpbmVyUmVmPW8sdGhpcy5fbmdab25lPWksdGhpcy5fcGxhdGZvcm09YSx0aGlzLl9hcmlhRGVzY3JpYmVyPXIsdGhpcy5fZm9jdXNNb25pdG9yPXMsdGhpcy5fZGlyPWMsdGhpcy5fZGVmYXVsdE9wdGlvbnM9ZCx0aGlzLl9wb3NpdGlvbj0iYmVsb3ciLHRoaXMuX2Rpc2FibGVkPSExLHRoaXMuX3ZpZXdJbml0aWFsaXplZD0hMSx0aGlzLl9wb2ludGVyRXhpdEV2ZW50c0luaXRpYWxpemVkPSExLHRoaXMuX3ZpZXdwb3J0TWFyZ2luPTgsdGhpcy5fY3NzQ2xhc3NQcmVmaXg9Im1hdCIsdGhpcy5zaG93RGVsYXk9dGhpcy5fZGVmYXVsdE9wdGlvbnMuc2hvd0RlbGF5LHRoaXMuaGlkZURlbGF5PXRoaXMuX2RlZmF1bHRPcHRpb25zLmhpZGVEZWxheSx0aGlzLnRvdWNoR2VzdHVyZXM9ImF1dG8iLHRoaXMuX21lc3NhZ2U9IiIsdGhpcy5fcGFzc2l2ZUxpc3RlbmVycz1bXSx0aGlzLl9kZXN0cm95ZWQ9bmV3IEksdGhpcy5faGFuZGxlS2V5ZG93bj10PT57dGhpcy5faXNUb29sdGlwVmlzaWJsZSgpJiZ0LmtleUNvZGU9PT11eiYmIWJ6KHQpJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5fbmdab25lLnJ1bigoKCk9PnRoaXMuaGlkZSgwKSkpKX0sdGhpcy5fc2Nyb2xsU3RyYXRlZ3k9bCx0aGlzLl9kb2N1bWVudD1wLGQmJihkLnBvc2l0aW9uJiYodGhpcy5wb3NpdGlvbj1kLnBvc2l0aW9uKSxkLnRvdWNoR2VzdHVyZXMmJih0aGlzLnRvdWNoR2VzdHVyZXM9ZC50b3VjaEdlc3R1cmVzKSksYy5jaGFuZ2UucGlwZShJZSh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fb3ZlcmxheVJlZiYmdGhpcy5fdXBkYXRlUG9zaXRpb24odGhpcy5fb3ZlcmxheVJlZil9KSksaS5ydW5PdXRzaWRlQW5ndWxhcigoKCk9PntlLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5faGFuZGxlS2V5ZG93bil9KSl9Z2V0IHBvc2l0aW9uKCl7cmV0dXJuIHRoaXMuX3Bvc2l0aW9ufXNldCBwb3NpdGlvbih0KXt2YXIgZTt0IT09dGhpcy5fcG9zaXRpb24mJih0aGlzLl9wb3NpdGlvbj10LHRoaXMuX292ZXJsYXlSZWYmJih0aGlzLl91cGRhdGVQb3NpdGlvbih0aGlzLl9vdmVybGF5UmVmKSxudWxsPT09KGU9dGhpcy5fdG9vbHRpcEluc3RhbmNlKXx8dm9pZCAwPT09ZXx8ZS5zaG93KDApLHRoaXMuX292ZXJsYXlSZWYudXBkYXRlUG9zaXRpb24oKSkpfWdldCBkaXNhYmxlZCgpe3JldHVybiB0aGlzLl9kaXNhYmxlZH1zZXQgZGlzYWJsZWQodCl7dGhpcy5fZGlzYWJsZWQ9eXoodCksdGhpcy5fZGlzYWJsZWQ/dGhpcy5oaWRlKDApOnRoaXMuX3NldHVwUG9pbnRlckVudGVyRXZlbnRzSWZOZWVkZWQoKX1nZXQgbWVzc2FnZSgpe3JldHVybiB0aGlzLl9tZXNzYWdlfXNldCBtZXNzYWdlKHQpe3RoaXMuX2FyaWFEZXNjcmliZXIucmVtb3ZlRGVzY3JpcHRpb24odGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LHRoaXMuX21lc3NhZ2UsInRvb2x0aXAiKSx0aGlzLl9tZXNzYWdlPW51bGwhPXQ/U3RyaW5nKHQpLnRyaW0oKToiIiwhdGhpcy5fbWVzc2FnZSYmdGhpcy5faXNUb29sdGlwVmlzaWJsZSgpP3RoaXMuaGlkZSgwKToodGhpcy5fc2V0dXBQb2ludGVyRW50ZXJFdmVudHNJZk5lZWRlZCgpLHRoaXMuX3VwZGF0ZVRvb2x0aXBNZXNzYWdlKCksdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+e1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oKCgpPT57dGhpcy5fYXJpYURlc2NyaWJlci5kZXNjcmliZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsdGhpcy5tZXNzYWdlLCJ0b29sdGlwIil9KSl9KSkpfWdldCB0b29sdGlwQ2xhc3MoKXtyZXR1cm4gdGhpcy5fdG9vbHRpcENsYXNzfXNldCB0b29sdGlwQ2xhc3ModCl7dGhpcy5fdG9vbHRpcENsYXNzPXQsdGhpcy5fdG9vbHRpcEluc3RhbmNlJiZ0aGlzLl9zZXRUb29sdGlwQ2xhc3ModGhpcy5fdG9vbHRpcENsYXNzKX1uZ0FmdGVyVmlld0luaXQoKXt0aGlzLl92aWV3SW5pdGlhbGl6ZWQ9ITAsdGhpcy5fc2V0dXBQb2ludGVyRW50ZXJFdmVudHNJZk5lZWRlZCgpLHRoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHRoaXMuX2VsZW1lbnRSZWYpLnBpcGUoSWUodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCh0PT57dD8ia2V5Ym9hcmQiPT09dCYmdGhpcy5fbmdab25lLnJ1bigoKCk9PnRoaXMuc2hvdygpKSk6dGhpcy5fbmdab25lLnJ1bigoKCk9PnRoaXMuaGlkZSgwKSkpfSkpfW5nT25EZXN0cm95KCl7Y29uc3QgdD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7Y2xlYXJUaW1lb3V0KHRoaXMuX3RvdWNoc3RhcnRUaW1lb3V0KSx0aGlzLl9vdmVybGF5UmVmJiYodGhpcy5fb3ZlcmxheVJlZi5kaXNwb3NlKCksdGhpcy5fdG9vbHRpcEluc3RhbmNlPW51bGwpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5faGFuZGxlS2V5ZG93biksdGhpcy5fcGFzc2l2ZUxpc3RlbmVycy5mb3JFYWNoKCgoW2Usbl0pPT57dC5yZW1vdmVFdmVudExpc3RlbmVyKGUsbixFUSl9KSksdGhpcy5fcGFzc2l2ZUxpc3RlbmVycy5sZW5ndGg9MCx0aGlzLl9kZXN0cm95ZWQubmV4dCgpLHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpLHRoaXMuX2FyaWFEZXNjcmliZXIucmVtb3ZlRGVzY3JpcHRpb24odCx0aGlzLm1lc3NhZ2UsInRvb2x0aXAiKSx0aGlzLl9mb2N1c01vbml0b3Iuc3RvcE1vbml0b3JpbmcodCl9c2hvdyh0PXRoaXMuc2hvd0RlbGF5KXtpZih0aGlzLmRpc2FibGVkfHwhdGhpcy5tZXNzYWdlfHx0aGlzLl9pc1Rvb2x0aXBWaXNpYmxlKCkmJiF0aGlzLl90b29sdGlwSW5zdGFuY2UuX3Nob3dUaW1lb3V0SWQmJiF0aGlzLl90b29sdGlwSW5zdGFuY2UuX2hpZGVUaW1lb3V0SWQpcmV0dXJuO2NvbnN0IGU9dGhpcy5fY3JlYXRlT3ZlcmxheSgpO3RoaXMuX2RldGFjaCgpLHRoaXMuX3BvcnRhbD10aGlzLl9wb3J0YWx8fG5ldyB2Rih0aGlzLl90b29sdGlwQ29tcG9uZW50LHRoaXMuX3ZpZXdDb250YWluZXJSZWYpLHRoaXMuX3Rvb2x0aXBJbnN0YW5jZT1lLmF0dGFjaCh0aGlzLl9wb3J0YWwpLmluc3RhbmNlLHRoaXMuX3Rvb2x0aXBJbnN0YW5jZS5hZnRlckhpZGRlbigpLnBpcGUoSWUodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgoKT0+dGhpcy5fZGV0YWNoKCkpKSx0aGlzLl9zZXRUb29sdGlwQ2xhc3ModGhpcy5fdG9vbHRpcENsYXNzKSx0aGlzLl91cGRhdGVUb29sdGlwTWVzc2FnZSgpLHRoaXMuX3Rvb2x0aXBJbnN0YW5jZS5zaG93KHQpfWhpZGUodD10aGlzLmhpZGVEZWxheSl7dGhpcy5fdG9vbHRpcEluc3RhbmNlJiZ0aGlzLl90b29sdGlwSW5zdGFuY2UuaGlkZSh0KX10b2dnbGUoKXt0aGlzLl9pc1Rvb2x0aXBWaXNpYmxlKCk/dGhpcy5oaWRlKCk6dGhpcy5zaG93KCl9X2lzVG9vbHRpcFZpc2libGUoKXtyZXR1cm4hIXRoaXMuX3Rvb2x0aXBJbnN0YW5jZSYmdGhpcy5fdG9vbHRpcEluc3RhbmNlLmlzVmlzaWJsZSgpfV9jcmVhdGVPdmVybGF5KCl7aWYodGhpcy5fb3ZlcmxheVJlZilyZXR1cm4gdGhpcy5fb3ZlcmxheVJlZjtjb25zdCB0PXRoaXMuX3Njcm9sbERpc3BhdGNoZXIuZ2V0QW5jZXN0b3JTY3JvbGxDb250YWluZXJzKHRoaXMuX2VsZW1lbnRSZWYpLGU9dGhpcy5fb3ZlcmxheS5wb3NpdGlvbigpLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy5fZWxlbWVudFJlZikud2l0aFRyYW5zZm9ybU9yaWdpbk9uKGAuJHt0aGlzLl9jc3NDbGFzc1ByZWZpeH0tdG9vbHRpcGApLndpdGhGbGV4aWJsZURpbWVuc2lvbnMoITEpLndpdGhWaWV3cG9ydE1hcmdpbih0aGlzLl92aWV3cG9ydE1hcmdpbikud2l0aFNjcm9sbGFibGVDb250YWluZXJzKHQpO3JldHVybiBlLnBvc2l0aW9uQ2hhbmdlcy5waXBlKEllKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgodD0+e3RoaXMuX3VwZGF0ZUN1cnJlbnRQb3NpdGlvbkNsYXNzKHQuY29ubmVjdGlvblBhaXIpLHRoaXMuX3Rvb2x0aXBJbnN0YW5jZSYmdC5zY3JvbGxhYmxlVmlld1Byb3BlcnRpZXMuaXNPdmVybGF5Q2xpcHBlZCYmdGhpcy5fdG9vbHRpcEluc3RhbmNlLmlzVmlzaWJsZSgpJiZ0aGlzLl9uZ1pvbmUucnVuKCgoKT0+dGhpcy5oaWRlKDApKSl9KSksdGhpcy5fb3ZlcmxheVJlZj10aGlzLl9vdmVybGF5LmNyZWF0ZSh7ZGlyZWN0aW9uOnRoaXMuX2Rpcixwb3NpdGlvblN0cmF0ZWd5OmUscGFuZWxDbGFzczpgJHt0aGlzLl9jc3NDbGFzc1ByZWZpeH0tdG9vbHRpcC1wYW5lbGAsc2Nyb2xsU3RyYXRlZ3k6dGhpcy5fc2Nyb2xsU3RyYXRlZ3koKX0pLHRoaXMuX3VwZGF0ZVBvc2l0aW9uKHRoaXMuX292ZXJsYXlSZWYpLHRoaXMuX292ZXJsYXlSZWYuZGV0YWNobWVudHMoKS5waXBlKEllKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoKCk9PnRoaXMuX2RldGFjaCgpKSksdGhpcy5fb3ZlcmxheVJlZi5vdXRzaWRlUG9pbnRlckV2ZW50cygpLnBpcGUoSWUodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgoKT0+e3ZhciB0O3JldHVybiBudWxsPT09KHQ9dGhpcy5fdG9vbHRpcEluc3RhbmNlKXx8dm9pZCAwPT09dD92b2lkIDA6dC5faGFuZGxlQm9keUludGVyYWN0aW9uKCl9KSksdGhpcy5fb3ZlcmxheVJlZn1fZGV0YWNoKCl7dGhpcy5fb3ZlcmxheVJlZiYmdGhpcy5fb3ZlcmxheVJlZi5oYXNBdHRhY2hlZCgpJiZ0aGlzLl9vdmVybGF5UmVmLmRldGFjaCgpLHRoaXMuX3Rvb2x0aXBJbnN0YW5jZT1udWxsfV91cGRhdGVQb3NpdGlvbih0KXtjb25zdCBlPXQuZ2V0Q29uZmlnKCkucG9zaXRpb25TdHJhdGVneSxuPXRoaXMuX2dldE9yaWdpbigpLG89dGhpcy5fZ2V0T3ZlcmxheVBvc2l0aW9uKCk7ZS53aXRoUG9zaXRpb25zKFt0aGlzLl9hZGRPZmZzZXQoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG4ubWFpbiksby5tYWluKSksdGhpcy5fYWRkT2Zmc2V0KE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuLmZhbGxiYWNrKSxvLmZhbGxiYWNrKSldKX1fYWRkT2Zmc2V0KHQpe3JldHVybiB0fV9nZXRPcmlnaW4oKXtjb25zdCB0PSF0aGlzLl9kaXJ8fCJsdHIiPT10aGlzLl9kaXIudmFsdWUsZT10aGlzLnBvc2l0aW9uO2xldCBuO2lmKCJhYm92ZSI9PWV8fCJiZWxvdyI9PWUpbj17b3JpZ2luWDoiY2VudGVyIixvcmlnaW5ZOiJhYm92ZSI9PWU/InRvcCI6ImJvdHRvbSJ9O2Vsc2UgaWYoImJlZm9yZSI9PWV8fCJsZWZ0Ij09ZSYmdHx8InJpZ2h0Ij09ZSYmIXQpbj17b3JpZ2luWDoic3RhcnQiLG9yaWdpblk6ImNlbnRlciJ9O2Vsc2UgaWYoImFmdGVyIj09ZXx8InJpZ2h0Ij09ZSYmdHx8ImxlZnQiPT1lJiYhdCluPXtvcmlnaW5YOiJlbmQiLG9yaWdpblk6ImNlbnRlciJ9O2Vsc2UgaWYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSl0aHJvdyBSUShlKTtjb25zdHt4Om8seTppfT10aGlzLl9pbnZlcnRQb3NpdGlvbihuLm9yaWdpblgsbi5vcmlnaW5ZKTtyZXR1cm57bWFpbjpuLGZhbGxiYWNrOntvcmlnaW5YOm8sb3JpZ2luWTppfX19X2dldE92ZXJsYXlQb3NpdGlvbigpe2NvbnN0IHQ9IXRoaXMuX2Rpcnx8Imx0ciI9PXRoaXMuX2Rpci52YWx1ZSxlPXRoaXMucG9zaXRpb247bGV0IG47aWYoImFib3ZlIj09ZSluPXtvdmVybGF5WDoiY2VudGVyIixvdmVybGF5WToiYm90dG9tIn07ZWxzZSBpZigiYmVsb3ciPT1lKW49e292ZXJsYXlYOiJjZW50ZXIiLG92ZXJsYXlZOiJ0b3AifTtlbHNlIGlmKCJiZWZvcmUiPT1lfHwibGVmdCI9PWUmJnR8fCJyaWdodCI9PWUmJiF0KW49e292ZXJsYXlYOiJlbmQiLG92ZXJsYXlZOiJjZW50ZXIifTtlbHNlIGlmKCJhZnRlciI9PWV8fCJyaWdodCI9PWUmJnR8fCJsZWZ0Ij09ZSYmIXQpbj17b3ZlcmxheVg6InN0YXJ0IixvdmVybGF5WToiY2VudGVyIn07ZWxzZSBpZigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKXRocm93IFJRKGUpO2NvbnN0e3g6byx5Oml9PXRoaXMuX2ludmVydFBvc2l0aW9uKG4ub3ZlcmxheVgsbi5vdmVybGF5WSk7cmV0dXJue21haW46bixmYWxsYmFjazp7b3ZlcmxheVg6byxvdmVybGF5WTppfX19X3VwZGF0ZVRvb2x0aXBNZXNzYWdlKCl7dGhpcy5fdG9vbHRpcEluc3RhbmNlJiYodGhpcy5fdG9vbHRpcEluc3RhbmNlLm1lc3NhZ2U9dGhpcy5tZXNzYWdlLHRoaXMuX3Rvb2x0aXBJbnN0YW5jZS5fbWFya0ZvckNoZWNrKCksdGhpcy5fbmdab25lLm9uTWljcm90YXNrRW1wdHkucGlwZShiZSgxKSxJZSh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fdG9vbHRpcEluc3RhbmNlJiZ0aGlzLl9vdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCl9KSkpfV9zZXRUb29sdGlwQ2xhc3ModCl7dGhpcy5fdG9vbHRpcEluc3RhbmNlJiYodGhpcy5fdG9vbHRpcEluc3RhbmNlLnRvb2x0aXBDbGFzcz10LHRoaXMuX3Rvb2x0aXBJbnN0YW5jZS5fbWFya0ZvckNoZWNrKCkpfV9pbnZlcnRQb3NpdGlvbih0LGUpe3JldHVybiJhYm92ZSI9PT10aGlzLnBvc2l0aW9ufHwiYmVsb3ciPT09dGhpcy5wb3NpdGlvbj8idG9wIj09PWU/ZT0iYm90dG9tIjoiYm90dG9tIj09PWUmJihlPSJ0b3AiKToiZW5kIj09PXQ/dD0ic3RhcnQiOiJzdGFydCI9PT10JiYodD0iZW5kIikse3g6dCx5OmV9fV91cGRhdGVDdXJyZW50UG9zaXRpb25DbGFzcyh0KXtjb25zdHtvdmVybGF5WTplLG9yaWdpblg6bixvcmlnaW5ZOm99PXQ7bGV0IGk7aWYoaT0iY2VudGVyIj09PWU/dGhpcy5fZGlyJiYicnRsIj09PXRoaXMuX2Rpci52YWx1ZT8iZW5kIj09PW4/ImxlZnQiOiJyaWdodCI6InN0YXJ0Ij09PW4/ImxlZnQiOiJyaWdodCI6ImJvdHRvbSI9PT1lJiYidG9wIj09PW8/ImFib3ZlIjoiYmVsb3ciLGkhPT10aGlzLl9jdXJyZW50UG9zaXRpb24pe2NvbnN0IHQ9dGhpcy5fb3ZlcmxheVJlZjtpZih0KXtjb25zdCBlPWAke3RoaXMuX2Nzc0NsYXNzUHJlZml4fS10b29sdGlwLXBhbmVsLWA7dC5yZW1vdmVQYW5lbENsYXNzKGUrdGhpcy5fY3VycmVudFBvc2l0aW9uKSx0LmFkZFBhbmVsQ2xhc3MoZStpKX10aGlzLl9jdXJyZW50UG9zaXRpb249aX19X3NldHVwUG9pbnRlckVudGVyRXZlbnRzSWZOZWVkZWQoKXshdGhpcy5fZGlzYWJsZWQmJnRoaXMubWVzc2FnZSYmdGhpcy5fdmlld0luaXRpYWxpemVkJiYhdGhpcy5fcGFzc2l2ZUxpc3RlbmVycy5sZW5ndGgmJih0aGlzLl9wbGF0Zm9ybVN1cHBvcnRzTW91c2VFdmVudHMoKT90aGlzLl9wYXNzaXZlTGlzdGVuZXJzLnB1c2goWyJtb3VzZWVudGVyIiwoKT0+e3RoaXMuX3NldHVwUG9pbnRlckV4aXRFdmVudHNJZk5lZWRlZCgpLHRoaXMuc2hvdygpfV0pOiJvZmYiIT09dGhpcy50b3VjaEdlc3R1cmVzJiYodGhpcy5fZGlzYWJsZU5hdGl2ZUdlc3R1cmVzSWZOZWNlc3NhcnkoKSx0aGlzLl9wYXNzaXZlTGlzdGVuZXJzLnB1c2goWyJ0b3VjaHN0YXJ0IiwoKT0+e3RoaXMuX3NldHVwUG9pbnRlckV4aXRFdmVudHNJZk5lZWRlZCgpLGNsZWFyVGltZW91dCh0aGlzLl90b3VjaHN0YXJ0VGltZW91dCksdGhpcy5fdG91Y2hzdGFydFRpbWVvdXQ9c2V0VGltZW91dCgoKCk9PnRoaXMuc2hvdygpKSw1MDApfV0pKSx0aGlzLl9hZGRMaXN0ZW5lcnModGhpcy5fcGFzc2l2ZUxpc3RlbmVycykpfV9zZXR1cFBvaW50ZXJFeGl0RXZlbnRzSWZOZWVkZWQoKXtpZih0aGlzLl9wb2ludGVyRXhpdEV2ZW50c0luaXRpYWxpemVkKXJldHVybjt0aGlzLl9wb2ludGVyRXhpdEV2ZW50c0luaXRpYWxpemVkPSEwO2NvbnN0IHQ9W107aWYodGhpcy5fcGxhdGZvcm1TdXBwb3J0c01vdXNlRXZlbnRzKCkpdC5wdXNoKFsibW91c2VsZWF2ZSIsKCk9PnRoaXMuaGlkZSgpXSxbIndoZWVsIix0PT50aGlzLl93aGVlbExpc3RlbmVyKHQpXSk7ZWxzZSBpZigib2ZmIiE9PXRoaXMudG91Y2hHZXN0dXJlcyl7dGhpcy5fZGlzYWJsZU5hdGl2ZUdlc3R1cmVzSWZOZWNlc3NhcnkoKTtjb25zdCBlPSgpPT57Y2xlYXJUaW1lb3V0KHRoaXMuX3RvdWNoc3RhcnRUaW1lb3V0KSx0aGlzLmhpZGUodGhpcy5fZGVmYXVsdE9wdGlvbnMudG91Y2hlbmRIaWRlRGVsYXkpfTt0LnB1c2goWyJ0b3VjaGVuZCIsZV0sWyJ0b3VjaGNhbmNlbCIsZV0pfXRoaXMuX2FkZExpc3RlbmVycyh0KSx0aGlzLl9wYXNzaXZlTGlzdGVuZXJzLnB1c2goLi4udCl9X2FkZExpc3RlbmVycyh0KXt0LmZvckVhY2goKChbdCxlXSk9Pnt0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0LGUsRVEpfSkpfV9wbGF0Zm9ybVN1cHBvcnRzTW91c2VFdmVudHMoKXtyZXR1cm4hdGhpcy5fcGxhdGZvcm0uSU9TJiYhdGhpcy5fcGxhdGZvcm0uQU5EUk9JRH1fd2hlZWxMaXN0ZW5lcih0KXtpZih0aGlzLl9pc1Rvb2x0aXBWaXNpYmxlKCkpe2NvbnN0IGU9dGhpcy5fZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh0LmNsaWVudFgsdC5jbGllbnRZKSxuPXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtlPT09bnx8bi5jb250YWlucyhlKXx8dGhpcy5oaWRlKCl9fV9kaXNhYmxlTmF0aXZlR2VzdHVyZXNJZk5lY2Vzc2FyeSgpe2NvbnN0IHQ9dGhpcy50b3VjaEdlc3R1cmVzO2lmKCJvZmYiIT09dCl7Y29uc3QgZT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsbj1lLnN0eWxlOygib24iPT09dHx8IklOUFVUIiE9PWUubm9kZU5hbWUmJiJURVhUQVJFQSIhPT1lLm5vZGVOYW1lKSYmKG4udXNlclNlbGVjdD1uLm1zVXNlclNlbGVjdD1uLndlYmtpdFVzZXJTZWxlY3Q9bi5Nb3pVc2VyU2VsZWN0PSJub25lIiksIm9uIiE9PXQmJmUuZHJhZ2dhYmxlfHwobi53ZWJraXRVc2VyRHJhZz0ibm9uZSIpLG4udG91Y2hBY3Rpb249Im5vbmUiLG4ud2Via2l0VGFwSGlnaGxpZ2h0Q29sb3I9InRyYW5zcGFyZW50In19fUhRLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxIUSkoU20ocEwpLFNtKGhnKSxTbShwRiksU20oZWgpLFNtKGFfKSxTbSh3eiksU20oS3opLFNtKFNJKSxTbSh2b2lkIDApLFNtKEhJKSxTbSh2b2lkIDApLFNtKFpfKSl9LEhRLsm1ZGlyPWxvKHt0eXBlOkhRLGlucHV0czp7c2hvd0RlbGF5OlsibWF0VG9vbHRpcFNob3dEZWxheSIsInNob3dEZWxheSJdLGhpZGVEZWxheTpbIm1hdFRvb2x0aXBIaWRlRGVsYXkiLCJoaWRlRGVsYXkiXSx0b3VjaEdlc3R1cmVzOlsibWF0VG9vbHRpcFRvdWNoR2VzdHVyZXMiLCJ0b3VjaEdlc3R1cmVzIl0scG9zaXRpb246WyJtYXRUb29sdGlwUG9zaXRpb24iLCJwb3NpdGlvbiJdLGRpc2FibGVkOlsibWF0VG9vbHRpcERpc2FibGVkIiwiZGlzYWJsZWQiXSxtZXNzYWdlOlsibWF0VG9vbHRpcCIsIm1lc3NhZ2UiXSx0b29sdGlwQ2xhc3M6WyJtYXRUb29sdGlwQ2xhc3MiLCJ0b29sdGlwQ2xhc3MiXX19KSxIUS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnBMfSx7dHlwZTpoZ30se3R5cGU6cEZ9LHt0eXBlOmVofSx7dHlwZTphX30se3R5cGU6d3p9LHt0eXBlOkt6fSx7dHlwZTpTSX0se3R5cGU6dm9pZCAwfSx7dHlwZTpISX0se3R5cGU6dm9pZCAwfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XSxIUS5wcm9wRGVjb3JhdG9ycz17cG9zaXRpb246W3t0eXBlOnh5LGFyZ3M6WyJtYXRUb29sdGlwUG9zaXRpb24iXX1dLGRpc2FibGVkOlt7dHlwZTp4eSxhcmdzOlsibWF0VG9vbHRpcERpc2FibGVkIl19XSxzaG93RGVsYXk6W3t0eXBlOnh5LGFyZ3M6WyJtYXRUb29sdGlwU2hvd0RlbGF5Il19XSxoaWRlRGVsYXk6W3t0eXBlOnh5LGFyZ3M6WyJtYXRUb29sdGlwSGlkZURlbGF5Il19XSx0b3VjaEdlc3R1cmVzOlt7dHlwZTp4eSxhcmdzOlsibWF0VG9vbHRpcFRvdWNoR2VzdHVyZXMiXX1dLG1lc3NhZ2U6W3t0eXBlOnh5LGFyZ3M6WyJtYXRUb29sdGlwIl19XSx0b29sdGlwQ2xhc3M6W3t0eXBlOnh5LGFyZ3M6WyJtYXRUb29sdGlwQ2xhc3MiXX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEhRLFt7dHlwZTpDeX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpwTH0se3R5cGU6aGd9LHt0eXBlOnBGfSx7dHlwZTplaH0se3R5cGU6YV99LHt0eXBlOnd6fSx7dHlwZTpLen0se3R5cGU6U0l9LHt0eXBlOnZvaWQgMH0se3R5cGU6SEl9LHt0eXBlOnZvaWQgMH0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfV19KSx7c2hvd0RlbGF5Olt7dHlwZTp4eSxhcmdzOlsibWF0VG9vbHRpcFNob3dEZWxheSJdfV0saGlkZURlbGF5Olt7dHlwZTp4eSxhcmdzOlsibWF0VG9vbHRpcEhpZGVEZWxheSJdfV0sdG91Y2hHZXN0dXJlczpbe3R5cGU6eHksYXJnczpbIm1hdFRvb2x0aXBUb3VjaEdlc3R1cmVzIl19XSxwb3NpdGlvbjpbe3R5cGU6eHksYXJnczpbIm1hdFRvb2x0aXBQb3NpdGlvbiJdfV0sZGlzYWJsZWQ6W3t0eXBlOnh5LGFyZ3M6WyJtYXRUb29sdGlwRGlzYWJsZWQiXX1dLG1lc3NhZ2U6W3t0eXBlOnh5LGFyZ3M6WyJtYXRUb29sdGlwIl19XSx0b29sdGlwQ2xhc3M6W3t0eXBlOnh5LGFyZ3M6WyJtYXRUb29sdGlwQ2xhc3MiXX1dfSk7Y2xhc3MgRlEgZXh0ZW5kcyBIUXtjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyLHMsbCxjLGQscCl7c3VwZXIodCxlLG4sbyxpLGEscixzLGwsYyxkLHApLHRoaXMuX3Rvb2x0aXBDb21wb25lbnQ9QlF9fUZRLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxGUSkoU20ocEwpLFNtKGhnKSxTbShwRiksU20oZWgpLFNtKGFfKSxTbSh3eiksU20oS3opLFNtKFNJKSxTbShBUSksU20oSEksOCksU20oelEsOCksU20oWl8pKX0sRlEuybVkaXI9bG8oe3R5cGU6RlEsc2VsZWN0b3JzOltbIiIsIm1hdFRvb2x0aXAiLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtdG9vbHRpcC10cmlnZ2VyIl0sZXhwb3J0QXM6WyJtYXRUb29sdGlwIl0sZmVhdHVyZXM6W3hwXX0pLEZRLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6cEx9LHt0eXBlOmhnfSx7dHlwZTpwRn0se3R5cGU6ZWh9LHt0eXBlOmFffSx7dHlwZTp3en0se3R5cGU6S3p9LHt0eXBlOlNJfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbQVFdfV19LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbelFdfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRlEsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW21hdFRvb2x0aXBdIixleHBvcnRBczoibWF0VG9vbHRpcCIsaG9zdDp7Y2xhc3M6Im1hdC10b29sdGlwLXRyaWdnZXIifX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnBMfSx7dHlwZTpoZ30se3R5cGU6cEZ9LHt0eXBlOmVofSx7dHlwZTphX30se3R5cGU6d3p9LHt0eXBlOkt6fSx7dHlwZTpTSX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W0FRXX1dfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3pRXX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XX0pLG51bGwpO2NsYXNzIExRe2NvbnN0cnVjdG9yKHQpe3RoaXMuX2NoYW5nZURldGVjdG9yUmVmPXQsdGhpcy5fdmlzaWJpbGl0eT0iaW5pdGlhbCIsdGhpcy5fY2xvc2VPbkludGVyYWN0aW9uPSExLHRoaXMuX29uSGlkZT1uZXcgSX1zaG93KHQpe2NsZWFyVGltZW91dCh0aGlzLl9oaWRlVGltZW91dElkKSx0aGlzLl9jbG9zZU9uSW50ZXJhY3Rpb249ITAsdGhpcy5fc2hvd1RpbWVvdXRJZD1zZXRUaW1lb3V0KCgoKT0+e3RoaXMuX3Zpc2liaWxpdHk9InZpc2libGUiLHRoaXMuX3Nob3dUaW1lb3V0SWQ9dm9pZCAwLHRoaXMuX29uU2hvdygpLHRoaXMuX21hcmtGb3JDaGVjaygpfSksdCl9aGlkZSh0KXtjbGVhclRpbWVvdXQodGhpcy5fc2hvd1RpbWVvdXRJZCksdGhpcy5faGlkZVRpbWVvdXRJZD1zZXRUaW1lb3V0KCgoKT0+e3RoaXMuX3Zpc2liaWxpdHk9ImhpZGRlbiIsdGhpcy5faGlkZVRpbWVvdXRJZD12b2lkIDAsdGhpcy5fbWFya0ZvckNoZWNrKCl9KSx0KX1hZnRlckhpZGRlbigpe3JldHVybiB0aGlzLl9vbkhpZGV9aXNWaXNpYmxlKCl7cmV0dXJuInZpc2libGUiPT09dGhpcy5fdmlzaWJpbGl0eX1uZ09uRGVzdHJveSgpe2NsZWFyVGltZW91dCh0aGlzLl9zaG93VGltZW91dElkKSxjbGVhclRpbWVvdXQodGhpcy5faGlkZVRpbWVvdXRJZCksdGhpcy5fb25IaWRlLmNvbXBsZXRlKCl9X2FuaW1hdGlvblN0YXJ0KCl7dGhpcy5fY2xvc2VPbkludGVyYWN0aW9uPSExfV9hbmltYXRpb25Eb25lKHQpe2NvbnN0IGU9dC50b1N0YXRlOyJoaWRkZW4iIT09ZXx8dGhpcy5pc1Zpc2libGUoKXx8dGhpcy5fb25IaWRlLm5leHQoKSwidmlzaWJsZSIhPT1lJiYiaGlkZGVuIiE9PWV8fCh0aGlzLl9jbG9zZU9uSW50ZXJhY3Rpb249ITApfV9oYW5kbGVCb2R5SW50ZXJhY3Rpb24oKXt0aGlzLl9jbG9zZU9uSW50ZXJhY3Rpb24mJnRoaXMuaGlkZSgwKX1fbWFya0ZvckNoZWNrKCl7dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9X29uU2hvdygpe319TFEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fExRKShTbShVZykpfSxMUS7JtWRpcj1sbyh7dHlwZTpMUX0pLExRLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6VWd9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKExRLFt7dHlwZTpDeX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpVZ31dfSksbnVsbCk7Y2xhc3MgQlEgZXh0ZW5kcyBMUXtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQpLHRoaXMuX2JyZWFrcG9pbnRPYnNlcnZlcj1lLHRoaXMuX2lzSGFuZHNldD10aGlzLl9icmVha3BvaW50T2JzZXJ2ZXIub2JzZXJ2ZSgiKG1heC13aWR0aDogNTk5Ljk4cHgpIGFuZCAob3JpZW50YXRpb246IHBvcnRyYWl0KSwgKG1heC13aWR0aDogOTU5Ljk4cHgpIGFuZCAob3JpZW50YXRpb246IGxhbmRzY2FwZSkiKX19QlEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEJRKShTbShVZyksU20oUEwpKX0sQlEuybVjbXA9dG8oe3R5cGU6QlEsc2VsZWN0b3JzOltbIm1hdC10b29sdGlwLWNvbXBvbmVudCJdXSxob3N0QXR0cnM6WyJhcmlhLWhpZGRlbiIsInRydWUiXSxob3N0VmFyczoyLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZkdSgiem9vbSIsInZpc2libGUiPT09bi5fdmlzaWJpbGl0eT8xOm51bGwpfSxmZWF0dXJlczpbeHBdLGRlY2xzOjMsdmFyczo3LGNvbnN0czpbWzEsIm1hdC10b29sdGlwIiwzLCJuZ0NsYXNzIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihSbSgwLCJkaXYiLDApLFZtKCJAc3RhdGUuc3RhcnQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX2FuaW1hdGlvblN0YXJ0KCl9KSkoIkBzdGF0ZS5kb25lIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5fYW5pbWF0aW9uRG9uZShlKX0pKSxBaCgxLCJhc3luYyIpLGt1KDIpLEFtKCkpLDImZSl7bGV0IHQ7cHUoIm1hdC10b29sdGlwLWhhbmRzZXQiLG51bGw9PSh0PVRoKDEsNSxuLl9pc0hhbmRzZXQpKT9udWxsOnQubWF0Y2hlcyksRG0oIm5nQ2xhc3MiLG4udG9vbHRpcENsYXNzKSgiQHN0YXRlIixuLl92aXNpYmlsaXR5KSxyYygyKSxTdShuLm1lc3NhZ2UpfX0sZGlyZWN0aXZlczpbYU1dLHBpcGVzOlt3TV0sc3R5bGVzOlsiLm1hdC10b29sdGlwLXBhbmVse3BvaW50ZXItZXZlbnRzOm5vbmUgIWltcG9ydGFudH0ubWF0LXRvb2x0aXB7Y29sb3I6I2ZmZjtib3JkZXItcmFkaXVzOjRweDttYXJnaW46MTRweDttYXgtd2lkdGg6MjUwcHg7cGFkZGluZy1sZWZ0OjhweDtwYWRkaW5nLXJpZ2h0OjhweDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpc30uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdG9vbHRpcHtvdXRsaW5lOnNvbGlkIDFweH0ubWF0LXRvb2x0aXAtaGFuZHNldHttYXJnaW46MjRweDtwYWRkaW5nLWxlZnQ6MTZweDtwYWRkaW5nLXJpZ2h0OjE2cHh9XG4iXSxlbmNhcHN1bGF0aW9uOjIsZGF0YTp7YW5pbWF0aW9uOltEUS50b29sdGlwU3RhdGVdfSxjaGFuZ2VEZXRlY3Rpb246MH0pLEJRLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6VWd9LHt0eXBlOlBMfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChCUSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtYXQtdG9vbHRpcC1jb21wb25lbnQiLHRlbXBsYXRlOic8ZGl2IGNsYXNzPSJtYXQtdG9vbHRpcCJcbiAgICAgW25nQ2xhc3NdPSJ0b29sdGlwQ2xhc3MiXG4gICAgIFtjbGFzcy5tYXQtdG9vbHRpcC1oYW5kc2V0XT0iKF9pc0hhbmRzZXQgfCBhc3luYyk/Lm1hdGNoZXMiXG4gICAgIFtAc3RhdGVdPSJfdmlzaWJpbGl0eSJcbiAgICAgKEBzdGF0ZS5zdGFydCk9Il9hbmltYXRpb25TdGFydCgpIlxuICAgICAoQHN0YXRlLmRvbmUpPSJfYW5pbWF0aW9uRG9uZSgkZXZlbnQpIj57e21lc3NhZ2V9fTwvZGl2PlxuJyxlbmNhcHN1bGF0aW9uOkhuLk5vbmUsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaCxhbmltYXRpb25zOltEUS50b29sdGlwU3RhdGVdLGhvc3Q6eyJbc3R5bGUuem9vbV0iOidfdmlzaWJpbGl0eSA9PT0gInZpc2libGUiID8gMSA6IG51bGwnLCJhcmlhLWhpZGRlbiI6InRydWUifSxzdHlsZXM6WyIubWF0LXRvb2x0aXAtcGFuZWx7cG9pbnRlci1ldmVudHM6bm9uZSAhaW1wb3J0YW50fS5tYXQtdG9vbHRpcHtjb2xvcjojZmZmO2JvcmRlci1yYWRpdXM6NHB4O21hcmdpbjoxNHB4O21heC13aWR0aDoyNTBweDtwYWRkaW5nLWxlZnQ6OHB4O3BhZGRpbmctcmlnaHQ6OHB4O292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10b29sdGlwe291dGxpbmU6c29saWQgMXB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0e21hcmdpbjoyNHB4O3BhZGRpbmctbGVmdDoxNnB4O3BhZGRpbmctcmlnaHQ6MTZweH1cbiJdfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6VWd9LHt0eXBlOlBMfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIFZRe31mdW5jdGlvbiBqUSh0LGUpe2lmKDEmdCYmKFJtKDAsIm1hdC1vcHRpb24iLDE5KSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQ7RG0oInZhbHVlIix0KSxyYygxKSxEdSgiICIsdCwiICIpfX1mdW5jdGlvbiBVUSh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsIm1hdC1mb3JtLWZpZWxkIiwxNiksUm0oMSwibWF0LXNlbGVjdCIsMTcpLFZtKCJzZWxlY3Rpb25DaGFuZ2UiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgyKS5fY2hhbmdlUGFnZVNpemUobi52YWx1ZSl9KSksUXAoMixqUSwyLDIsIm1hdC1vcHRpb24iLDE4KSxBbSgpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKDIpO0RtKCJhcHBlYXJhbmNlIix0Ll9mb3JtRmllbGRBcHBlYXJhbmNlKSgiY29sb3IiLHQuY29sb3IpLHJjKDEpLERtKCJ2YWx1ZSIsdC5wYWdlU2l6ZSkoImRpc2FibGVkIix0LmRpc2FibGVkKSgiYXJpYS1sYWJlbCIsdC5faW50bC5pdGVtc1BlclBhZ2VMYWJlbCkscmMoMSksRG0oIm5nRm9yT2YiLHQuX2Rpc3BsYXllZFBhZ2VTaXplT3B0aW9ucyl9fWZ1bmN0aW9uIEdRKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2IiwyMCksa3UoMSksQW0oKSksMiZ0KXtjb25zdCB0PVltKDIpO3JjKDEpLFN1KHQucGFnZVNpemUpfX1mdW5jdGlvbiBXUSh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsMTIpLFJtKDEsImRpdiIsMTMpLGt1KDIpLEFtKCksUXAoMyxVUSwzLDYsIm1hdC1mb3JtLWZpZWxkIiwxNCksUXAoNCxHUSwyLDEsImRpdiIsMTUpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpO3JjKDIpLER1KCIgIix0Ll9pbnRsLml0ZW1zUGVyUGFnZUxhYmVsLCIgIikscmMoMSksRG0oIm5nSWYiLHQuX2Rpc3BsYXllZFBhZ2VTaXplT3B0aW9ucy5sZW5ndGg+MSkscmMoMSksRG0oIm5nSWYiLHQuX2Rpc3BsYXllZFBhZ2VTaXplT3B0aW9ucy5sZW5ndGg8PTEpfX1mdW5jdGlvbiBZUSh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsImJ1dHRvbiIsMjEpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5maXJzdFBhZ2UoKX0pKSxxaSgpLFJtKDEsInN2ZyIsNyksVG0oMiwicGF0aCIsMjIpLEFtKCksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKTtEbSgibWF0VG9vbHRpcCIsdC5faW50bC5maXJzdFBhZ2VMYWJlbCkoIm1hdFRvb2x0aXBEaXNhYmxlZCIsdC5fcHJldmlvdXNCdXR0b25zRGlzYWJsZWQoKSkoIm1hdFRvb2x0aXBQb3NpdGlvbiIsImFib3ZlIikoImRpc2FibGVkIix0Ll9wcmV2aW91c0J1dHRvbnNEaXNhYmxlZCgpKSxqcCgiYXJpYS1sYWJlbCIsdC5faW50bC5maXJzdFBhZ2VMYWJlbCl9fWZ1bmN0aW9uIHFRKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7cWkoKSxaaSgpLFJtKDAsImJ1dHRvbiIsMjMpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5sYXN0UGFnZSgpfSkpLHFpKCksUm0oMSwic3ZnIiw3KSxUbSgyLCJwYXRoIiwyNCksQW0oKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgpO0RtKCJtYXRUb29sdGlwIix0Ll9pbnRsLmxhc3RQYWdlTGFiZWwpKCJtYXRUb29sdGlwRGlzYWJsZWQiLHQuX25leHRCdXR0b25zRGlzYWJsZWQoKSkoIm1hdFRvb2x0aXBQb3NpdGlvbiIsImFib3ZlIikoImRpc2FibGVkIix0Ll9uZXh0QnV0dG9uc0Rpc2FibGVkKCkpLGpwKCJhcmlhLWxhYmVsIix0Ll9pbnRsLmxhc3RQYWdlTGFiZWwpfX1WUS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VlEpfSxWUS7JtW1vZD1hbyh7dHlwZTpWUX0pLFZRLsm1aW5qPXZuKHtwcm92aWRlcnM6W1RRXSxpbXBvcnRzOltbTkksV00seUwsWEldLFhJLHlGXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoVlEsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltOSSxXTSx5TCxYSV0sZXhwb3J0czpbRlEsQlEsWEkseUZdLGRlY2xhcmF0aW9uczpbRlEsQlFdLGVudHJ5Q29tcG9uZW50czpbQlFdLHByb3ZpZGVyczpbVFFdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oVlEse2RlY2xhcmF0aW9uczpmdW5jdGlvbigpe3JldHVybltGUSxCUV19LGltcG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bTkksV00seUwsWEldfSxleHBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW0ZRLEJRLFhJLHlGXX19KTtjbGFzcyBaUXtjb25zdHJ1Y3Rvcigpe3RoaXMuY2hhbmdlcz1uZXcgSSx0aGlzLml0ZW1zUGVyUGFnZUxhYmVsPSJJdGVtcyBwZXIgcGFnZToiLHRoaXMubmV4dFBhZ2VMYWJlbD0iTmV4dCBwYWdlIix0aGlzLnByZXZpb3VzUGFnZUxhYmVsPSJQcmV2aW91cyBwYWdlIix0aGlzLmZpcnN0UGFnZUxhYmVsPSJGaXJzdCBwYWdlIix0aGlzLmxhc3RQYWdlTGFiZWw9Ikxhc3QgcGFnZSIsdGhpcy5nZXRSYW5nZUxhYmVsPSh0LGUsbik9PntpZigwPT1ufHwwPT1lKXJldHVybmAwIG9mICR7bn1gO2NvbnN0IG89dCplO3JldHVybmAke28rMX0g4oCTICR7bzwobj1NYXRoLm1heChuLDApKT9NYXRoLm1pbihvK2Usbik6bytlfSBvZiAke259YH19fVpRLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxaUSl9LFpRLsm1cHJvdj1Nbih7ZmFjdG9yeTpmdW5jdGlvbiB0KCl7cmV0dXJuIG5ldyBaUX0sdG9rZW46WlEscHJvdmlkZWRJbjoicm9vdCJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFpRLFt7dHlwZTppbSxhcmdzOlt7cHJvdmlkZWRJbjoicm9vdCJ9XX1dLChmdW5jdGlvbigpe3JldHVybltdfSksbnVsbCk7Y29uc3QgWFE9e3Byb3ZpZGU6WlEsZGVwczpbW25ldyBTcixuZXcgRXIsWlFdXSx1c2VGYWN0b3J5OmZ1bmN0aW9uIEtRKHQpe3JldHVybiB0fHxuZXcgWlF9fSxKUT1uZXcgR2EoIk1BVF9QQUdJTkFUT1JfREVGQVVMVF9PUFRJT05TIiksUVE9S0koZUgoY2xhc3N7fSkpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyAkUSBleHRlbmRzIFFRe2NvbnN0cnVjdG9yKHQsZSxuKXtpZihzdXBlcigpLHRoaXMuX2ludGw9dCx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZj1lLHRoaXMuX3BhZ2VJbmRleD0wLHRoaXMuX2xlbmd0aD0wLHRoaXMuX3BhZ2VTaXplT3B0aW9ucz1bXSx0aGlzLl9oaWRlUGFnZVNpemU9ITEsdGhpcy5fc2hvd0ZpcnN0TGFzdEJ1dHRvbnM9ITEsdGhpcy5wYWdlPW5ldyBMaCx0aGlzLl9pbnRsQ2hhbmdlcz10LmNoYW5nZXMuc3Vic2NyaWJlKCgoKT0+dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpKSxuKXtjb25zdHtwYWdlU2l6ZTp0LHBhZ2VTaXplT3B0aW9uczplLGhpZGVQYWdlU2l6ZTpvLHNob3dGaXJzdExhc3RCdXR0b25zOml9PW47bnVsbCE9dCYmKHRoaXMuX3BhZ2VTaXplPXQpLG51bGwhPWUmJih0aGlzLl9wYWdlU2l6ZU9wdGlvbnM9ZSksbnVsbCE9byYmKHRoaXMuX2hpZGVQYWdlU2l6ZT1vKSxudWxsIT1pJiYodGhpcy5fc2hvd0ZpcnN0TGFzdEJ1dHRvbnM9aSl9fWdldCBwYWdlSW5kZXgoKXtyZXR1cm4gdGhpcy5fcGFnZUluZGV4fXNldCBwYWdlSW5kZXgodCl7dGhpcy5fcGFnZUluZGV4PU1hdGgubWF4KF96KHQpLDApLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5fbGVuZ3RofXNldCBsZW5ndGgodCl7dGhpcy5fbGVuZ3RoPV96KHQpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfWdldCBwYWdlU2l6ZSgpe3JldHVybiB0aGlzLl9wYWdlU2l6ZX1zZXQgcGFnZVNpemUodCl7dGhpcy5fcGFnZVNpemU9TWF0aC5tYXgoX3oodCksMCksdGhpcy5fdXBkYXRlRGlzcGxheWVkUGFnZVNpemVPcHRpb25zKCl9Z2V0IHBhZ2VTaXplT3B0aW9ucygpe3JldHVybiB0aGlzLl9wYWdlU2l6ZU9wdGlvbnN9c2V0IHBhZ2VTaXplT3B0aW9ucyh0KXt0aGlzLl9wYWdlU2l6ZU9wdGlvbnM9KHR8fFtdKS5tYXAoKHQ9Pl96KHQpKSksdGhpcy5fdXBkYXRlRGlzcGxheWVkUGFnZVNpemVPcHRpb25zKCl9Z2V0IGhpZGVQYWdlU2l6ZSgpe3JldHVybiB0aGlzLl9oaWRlUGFnZVNpemV9c2V0IGhpZGVQYWdlU2l6ZSh0KXt0aGlzLl9oaWRlUGFnZVNpemU9eXoodCl9Z2V0IHNob3dGaXJzdExhc3RCdXR0b25zKCl7cmV0dXJuIHRoaXMuX3Nob3dGaXJzdExhc3RCdXR0b25zfXNldCBzaG93Rmlyc3RMYXN0QnV0dG9ucyh0KXt0aGlzLl9zaG93Rmlyc3RMYXN0QnV0dG9ucz15eih0KX1uZ09uSW5pdCgpe3RoaXMuX2luaXRpYWxpemVkPSEwLHRoaXMuX3VwZGF0ZURpc3BsYXllZFBhZ2VTaXplT3B0aW9ucygpLHRoaXMuX21hcmtJbml0aWFsaXplZCgpfW5nT25EZXN0cm95KCl7dGhpcy5faW50bENoYW5nZXMudW5zdWJzY3JpYmUoKX1uZXh0UGFnZSgpe2lmKCF0aGlzLmhhc05leHRQYWdlKCkpcmV0dXJuO2NvbnN0IHQ9dGhpcy5wYWdlSW5kZXg7dGhpcy5wYWdlSW5kZXgrKyx0aGlzLl9lbWl0UGFnZUV2ZW50KHQpfXByZXZpb3VzUGFnZSgpe2lmKCF0aGlzLmhhc1ByZXZpb3VzUGFnZSgpKXJldHVybjtjb25zdCB0PXRoaXMucGFnZUluZGV4O3RoaXMucGFnZUluZGV4LS0sdGhpcy5fZW1pdFBhZ2VFdmVudCh0KX1maXJzdFBhZ2UoKXtpZighdGhpcy5oYXNQcmV2aW91c1BhZ2UoKSlyZXR1cm47Y29uc3QgdD10aGlzLnBhZ2VJbmRleDt0aGlzLnBhZ2VJbmRleD0wLHRoaXMuX2VtaXRQYWdlRXZlbnQodCl9bGFzdFBhZ2UoKXtpZighdGhpcy5oYXNOZXh0UGFnZSgpKXJldHVybjtjb25zdCB0PXRoaXMucGFnZUluZGV4O3RoaXMucGFnZUluZGV4PXRoaXMuZ2V0TnVtYmVyT2ZQYWdlcygpLTEsdGhpcy5fZW1pdFBhZ2VFdmVudCh0KX1oYXNQcmV2aW91c1BhZ2UoKXtyZXR1cm4gdGhpcy5wYWdlSW5kZXg+PTEmJjAhPXRoaXMucGFnZVNpemV9aGFzTmV4dFBhZ2UoKXtjb25zdCB0PXRoaXMuZ2V0TnVtYmVyT2ZQYWdlcygpLTE7cmV0dXJuIHRoaXMucGFnZUluZGV4PHQmJjAhPXRoaXMucGFnZVNpemV9Z2V0TnVtYmVyT2ZQYWdlcygpe3JldHVybiB0aGlzLnBhZ2VTaXplP01hdGguY2VpbCh0aGlzLmxlbmd0aC90aGlzLnBhZ2VTaXplKTowfV9jaGFuZ2VQYWdlU2l6ZSh0KXtjb25zdCBlPXRoaXMucGFnZUluZGV4O3RoaXMucGFnZUluZGV4PU1hdGguZmxvb3IodGhpcy5wYWdlSW5kZXgqdGhpcy5wYWdlU2l6ZS90KXx8MCx0aGlzLnBhZ2VTaXplPXQsdGhpcy5fZW1pdFBhZ2VFdmVudChlKX1fbmV4dEJ1dHRvbnNEaXNhYmxlZCgpe3JldHVybiB0aGlzLmRpc2FibGVkfHwhdGhpcy5oYXNOZXh0UGFnZSgpfV9wcmV2aW91c0J1dHRvbnNEaXNhYmxlZCgpe3JldHVybiB0aGlzLmRpc2FibGVkfHwhdGhpcy5oYXNQcmV2aW91c1BhZ2UoKX1fdXBkYXRlRGlzcGxheWVkUGFnZVNpemVPcHRpb25zKCl7dGhpcy5faW5pdGlhbGl6ZWQmJih0aGlzLnBhZ2VTaXplfHwodGhpcy5fcGFnZVNpemU9MCE9dGhpcy5wYWdlU2l6ZU9wdGlvbnMubGVuZ3RoP3RoaXMucGFnZVNpemVPcHRpb25zWzBdOjUwKSx0aGlzLl9kaXNwbGF5ZWRQYWdlU2l6ZU9wdGlvbnM9dGhpcy5wYWdlU2l6ZU9wdGlvbnMuc2xpY2UoKSwtMT09PXRoaXMuX2Rpc3BsYXllZFBhZ2VTaXplT3B0aW9ucy5pbmRleE9mKHRoaXMucGFnZVNpemUpJiZ0aGlzLl9kaXNwbGF5ZWRQYWdlU2l6ZU9wdGlvbnMucHVzaCh0aGlzLnBhZ2VTaXplKSx0aGlzLl9kaXNwbGF5ZWRQYWdlU2l6ZU9wdGlvbnMuc29ydCgoKHQsZSk9PnQtZSkpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKX1fZW1pdFBhZ2VFdmVudCh0KXt0aGlzLnBhZ2UuZW1pdCh7cHJldmlvdXNQYWdlSW5kZXg6dCxwYWdlSW5kZXg6dGhpcy5wYWdlSW5kZXgscGFnZVNpemU6dGhpcy5wYWdlU2l6ZSxsZW5ndGg6dGhpcy5sZW5ndGh9KX19JFEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fCRRKShTbShaUSksU20oVWcpLFNtKHZvaWQgMCkpfSwkUS7JtWRpcj1sbyh7dHlwZTokUSxpbnB1dHM6e3BhZ2VJbmRleDoicGFnZUluZGV4IixsZW5ndGg6Imxlbmd0aCIscGFnZVNpemU6InBhZ2VTaXplIixwYWdlU2l6ZU9wdGlvbnM6InBhZ2VTaXplT3B0aW9ucyIsaGlkZVBhZ2VTaXplOiJoaWRlUGFnZVNpemUiLHNob3dGaXJzdExhc3RCdXR0b25zOiJzaG93Rmlyc3RMYXN0QnV0dG9ucyIsY29sb3I6ImNvbG9yIn0sb3V0cHV0czp7cGFnZToicGFnZSJ9LGZlYXR1cmVzOlt4cF19KSwkUS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlpRfSx7dHlwZTpVZ30se3R5cGU6dm9pZCAwfV0sJFEucHJvcERlY29yYXRvcnM9e2NvbG9yOlt7dHlwZTp4eX1dLHBhZ2VJbmRleDpbe3R5cGU6eHl9XSxsZW5ndGg6W3t0eXBlOnh5fV0scGFnZVNpemU6W3t0eXBlOnh5fV0scGFnZVNpemVPcHRpb25zOlt7dHlwZTp4eX1dLGhpZGVQYWdlU2l6ZTpbe3R5cGU6eHl9XSxzaG93Rmlyc3RMYXN0QnV0dG9uczpbe3R5cGU6eHl9XSxwYWdlOlt7dHlwZTpPeX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKCRRLFt7dHlwZTpDeX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpaUX0se3R5cGU6VWd9LHt0eXBlOnZvaWQgMH1dfSkse3BhZ2U6W3t0eXBlOk95fV0scGFnZUluZGV4Olt7dHlwZTp4eX1dLGxlbmd0aDpbe3R5cGU6eHl9XSxwYWdlU2l6ZTpbe3R5cGU6eHl9XSxwYWdlU2l6ZU9wdGlvbnM6W3t0eXBlOnh5fV0saGlkZVBhZ2VTaXplOlt7dHlwZTp4eX1dLHNob3dGaXJzdExhc3RCdXR0b25zOlt7dHlwZTp4eX1dLGNvbG9yOlt7dHlwZTp4eX1dfSk7Y2xhc3MgdCQgZXh0ZW5kcyAkUXtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodCxlLG4pLG4mJm51bGwhPW4uZm9ybUZpZWxkQXBwZWFyYW5jZSYmKHRoaXMuX2Zvcm1GaWVsZEFwcGVhcmFuY2U9bi5mb3JtRmllbGRBcHBlYXJhbmNlKX19dCQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHQkKShTbShaUSksU20oVWcpLFNtKEpRLDgpKX0sdCQuybVjbXA9dG8oe3R5cGU6dCQsc2VsZWN0b3JzOltbIm1hdC1wYWdpbmF0b3IiXV0saG9zdEF0dHJzOlsicm9sZSIsImdyb3VwIiwxLCJtYXQtcGFnaW5hdG9yIl0saW5wdXRzOntkaXNhYmxlZDoiZGlzYWJsZWQifSxleHBvcnRBczpbIm1hdFBhZ2luYXRvciJdLGZlYXR1cmVzOlt4cF0sZGVjbHM6MTQsdmFyczoxNCxjb25zdHM6W1sxLCJtYXQtcGFnaW5hdG9yLW91dGVyLWNvbnRhaW5lciJdLFsxLCJtYXQtcGFnaW5hdG9yLWNvbnRhaW5lciJdLFsiY2xhc3MiLCJtYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSIsNCwibmdJZiJdLFsxLCJtYXQtcGFnaW5hdG9yLXJhbmdlLWFjdGlvbnMiXSxbMSwibWF0LXBhZ2luYXRvci1yYW5nZS1sYWJlbCJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwidHlwZSIsImJ1dHRvbiIsImNsYXNzIiwibWF0LXBhZ2luYXRvci1uYXZpZ2F0aW9uLWZpcnN0IiwzLCJtYXRUb29sdGlwIiwibWF0VG9vbHRpcERpc2FibGVkIiwibWF0VG9vbHRpcFBvc2l0aW9uIiwiZGlzYWJsZWQiLCJjbGljayIsNCwibmdJZiJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwidHlwZSIsImJ1dHRvbiIsMSwibWF0LXBhZ2luYXRvci1uYXZpZ2F0aW9uLXByZXZpb3VzIiwzLCJtYXRUb29sdGlwIiwibWF0VG9vbHRpcERpc2FibGVkIiwibWF0VG9vbHRpcFBvc2l0aW9uIiwiZGlzYWJsZWQiLCJjbGljayJdLFsidmlld0JveCIsIjAgMCAyNCAyNCIsImZvY3VzYWJsZSIsImZhbHNlIiwxLCJtYXQtcGFnaW5hdG9yLWljb24iXSxbImQiLCJNMTUuNDEgNy40MUwxNCA2bC02IDYgNiA2IDEuNDEtMS40MUwxMC44MyAxMnoiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsInR5cGUiLCJidXR0b24iLDEsIm1hdC1wYWdpbmF0b3ItbmF2aWdhdGlvbi1uZXh0IiwzLCJtYXRUb29sdGlwIiwibWF0VG9vbHRpcERpc2FibGVkIiwibWF0VG9vbHRpcFBvc2l0aW9uIiwiZGlzYWJsZWQiLCJjbGljayJdLFsiZCIsIk0xMCA2TDguNTkgNy40MSAxMy4xNyAxMmwtNC41OCA0LjU5TDEwIDE4bDYtNnoiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsInR5cGUiLCJidXR0b24iLCJjbGFzcyIsIm1hdC1wYWdpbmF0b3ItbmF2aWdhdGlvbi1sYXN0IiwzLCJtYXRUb29sdGlwIiwibWF0VG9vbHRpcERpc2FibGVkIiwibWF0VG9vbHRpcFBvc2l0aW9uIiwiZGlzYWJsZWQiLCJjbGljayIsNCwibmdJZiJdLFsxLCJtYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSJdLFsxLCJtYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZS1sYWJlbCJdLFsiY2xhc3MiLCJtYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZS1zZWxlY3QiLDMsImFwcGVhcmFuY2UiLCJjb2xvciIsNCwibmdJZiJdLFsiY2xhc3MiLCJtYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZS12YWx1ZSIsNCwibmdJZiJdLFsxLCJtYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZS1zZWxlY3QiLDMsImFwcGVhcmFuY2UiLCJjb2xvciJdLFszLCJ2YWx1ZSIsImRpc2FibGVkIiwiYXJpYS1sYWJlbCIsInNlbGVjdGlvbkNoYW5nZSJdLFszLCJ2YWx1ZSIsNCwibmdGb3IiLCJuZ0Zvck9mIl0sWzMsInZhbHVlIl0sWzEsIm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplLXZhbHVlIl0sWyJtYXQtaWNvbi1idXR0b24iLCIiLCJ0eXBlIiwiYnV0dG9uIiwxLCJtYXQtcGFnaW5hdG9yLW5hdmlnYXRpb24tZmlyc3QiLDMsIm1hdFRvb2x0aXAiLCJtYXRUb29sdGlwRGlzYWJsZWQiLCJtYXRUb29sdGlwUG9zaXRpb24iLCJkaXNhYmxlZCIsImNsaWNrIl0sWyJkIiwiTTE4LjQxIDE2LjU5TDEzLjgyIDEybDQuNTktNC41OUwxNyA2bC02IDYgNiA2ek02IDZoMnYxMkg2eiJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwidHlwZSIsImJ1dHRvbiIsMSwibWF0LXBhZ2luYXRvci1uYXZpZ2F0aW9uLWxhc3QiLDMsIm1hdFRvb2x0aXAiLCJtYXRUb29sdGlwRGlzYWJsZWQiLCJtYXRUb29sdGlwUG9zaXRpb24iLCJkaXNhYmxlZCIsImNsaWNrIl0sWyJkIiwiTTUuNTkgNy40MUwxMC4xOCAxMmwtNC41OSA0LjU5TDcgMThsNi02LTYtNnpNMTYgNmgydjEyaC0yeiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiZGl2IiwwKSxSbSgxLCJkaXYiLDEpLFFwKDIsV1EsNSwzLCJkaXYiLDIpLFJtKDMsImRpdiIsMyksUm0oNCwiZGl2Iiw0KSxrdSg1KSxBbSgpLFFwKDYsWVEsMyw1LCJidXR0b24iLDUpLFJtKDcsImJ1dHRvbiIsNiksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLnByZXZpb3VzUGFnZSgpfSkpLHFpKCksUm0oOCwic3ZnIiw3KSxUbSg5LCJwYXRoIiw4KSxBbSgpLEFtKCksWmkoKSxSbSgxMCwiYnV0dG9uIiw5KSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ubmV4dFBhZ2UoKX0pKSxxaSgpLFJtKDExLCJzdmciLDcpLFRtKDEyLCJwYXRoIiwxMCksQW0oKSxBbSgpLFFwKDEzLHFRLDMsNSwiYnV0dG9uIiwxMSksQW0oKSxBbSgpLEFtKCkpLDImZSYmKHJjKDIpLERtKCJuZ0lmIiwhbi5oaWRlUGFnZVNpemUpLHJjKDMpLER1KCIgIixuLl9pbnRsLmdldFJhbmdlTGFiZWwobi5wYWdlSW5kZXgsbi5wYWdlU2l6ZSxuLmxlbmd0aCksIiAiKSxyYygxKSxEbSgibmdJZiIsbi5zaG93Rmlyc3RMYXN0QnV0dG9ucykscmMoMSksRG0oIm1hdFRvb2x0aXAiLG4uX2ludGwucHJldmlvdXNQYWdlTGFiZWwpKCJtYXRUb29sdGlwRGlzYWJsZWQiLG4uX3ByZXZpb3VzQnV0dG9uc0Rpc2FibGVkKCkpKCJtYXRUb29sdGlwUG9zaXRpb24iLCJhYm92ZSIpKCJkaXNhYmxlZCIsbi5fcHJldmlvdXNCdXR0b25zRGlzYWJsZWQoKSksanAoImFyaWEtbGFiZWwiLG4uX2ludGwucHJldmlvdXNQYWdlTGFiZWwpLHJjKDMpLERtKCJtYXRUb29sdGlwIixuLl9pbnRsLm5leHRQYWdlTGFiZWwpKCJtYXRUb29sdGlwRGlzYWJsZWQiLG4uX25leHRCdXR0b25zRGlzYWJsZWQoKSkoIm1hdFRvb2x0aXBQb3NpdGlvbiIsImFib3ZlIikoImRpc2FibGVkIixuLl9uZXh0QnV0dG9uc0Rpc2FibGVkKCkpLGpwKCJhcmlhLWxhYmVsIixuLl9pbnRsLm5leHRQYWdlTGFiZWwpLHJjKDMpLERtKCJuZ0lmIixuLnNob3dGaXJzdExhc3RCdXR0b25zKSl9LGRpcmVjdGl2ZXM6W2RNLFhILEZRLEFWLEFHLGxNLEJIXSxzdHlsZXM6WyIubWF0LXBhZ2luYXRvcntkaXNwbGF5OmJsb2NrfS5tYXQtcGFnaW5hdG9yLW91dGVyLWNvbnRhaW5lcntkaXNwbGF5OmZsZXh9Lm1hdC1wYWdpbmF0b3ItY29udGFpbmVye2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO3BhZGRpbmc6MCA4cHg7ZmxleC13cmFwOndyYXAtcmV2ZXJzZTt3aWR0aDoxMDAlfS5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZXtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6YmFzZWxpbmU7bWFyZ2luLXJpZ2h0OjhweH1bZGlyPXJ0bF0gLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXple21hcmdpbi1yaWdodDowO21hcmdpbi1sZWZ0OjhweH0ubWF0LXBhZ2luYXRvci1wYWdlLXNpemUtbGFiZWx7bWFyZ2luOjAgNHB4fS5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZS1zZWxlY3R7bWFyZ2luOjZweCA0cHggMCA0cHg7d2lkdGg6NTZweH0ubWF0LXBhZ2luYXRvci1wYWdlLXNpemUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZXt3aWR0aDo2NHB4fS5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxse3dpZHRoOjY0cHh9Lm1hdC1wYWdpbmF0b3ItcmFuZ2UtbGFiZWx7bWFyZ2luOjAgMzJweCAwIDI0cHh9Lm1hdC1wYWdpbmF0b3ItcmFuZ2UtYWN0aW9uc3tkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyfS5tYXQtcGFnaW5hdG9yLWljb257d2lkdGg6MjhweDtmaWxsOmN1cnJlbnRDb2xvcn1bZGlyPXJ0bF0gLm1hdC1wYWdpbmF0b3ItaWNvbnt0cmFuc2Zvcm06cm90YXRlKDE4MGRlZyl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXBhZ2luYXRvci1pY29ue2ZpbGw6Q2FudmFzVGV4dH1cbiJdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLHQkLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6WlF9LHt0eXBlOlVnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W0pRXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh0JCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtYXQtcGFnaW5hdG9yIixleHBvcnRBczoibWF0UGFnaW5hdG9yIix0ZW1wbGF0ZTonPGRpdiBjbGFzcz0ibWF0LXBhZ2luYXRvci1vdXRlci1jb250YWluZXIiPlxuICA8ZGl2IGNsYXNzPSJtYXQtcGFnaW5hdG9yLWNvbnRhaW5lciI+XG4gICAgPGRpdiBjbGFzcz0ibWF0LXBhZ2luYXRvci1wYWdlLXNpemUiICpuZ0lmPSIhaGlkZVBhZ2VTaXplIj5cbiAgICAgIDxkaXYgY2xhc3M9Im1hdC1wYWdpbmF0b3ItcGFnZS1zaXplLWxhYmVsIj5cbiAgICAgICAge3tfaW50bC5pdGVtc1BlclBhZ2VMYWJlbH19XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgICpuZ0lmPSJfZGlzcGxheWVkUGFnZVNpemVPcHRpb25zLmxlbmd0aCA+IDEiXG4gICAgICAgIFthcHBlYXJhbmNlXT0iX2Zvcm1GaWVsZEFwcGVhcmFuY2UhIlxuICAgICAgICBbY29sb3JdPSJjb2xvciJcbiAgICAgICAgY2xhc3M9Im1hdC1wYWdpbmF0b3ItcGFnZS1zaXplLXNlbGVjdCI+XG4gICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgW3ZhbHVlXT0icGFnZVNpemUiXG4gICAgICAgICAgW2Rpc2FibGVkXT0iZGlzYWJsZWQiXG4gICAgICAgICAgW2FyaWEtbGFiZWxdPSJfaW50bC5pdGVtc1BlclBhZ2VMYWJlbCJcbiAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT0iX2NoYW5nZVBhZ2VTaXplKCRldmVudC52YWx1ZSkiPlxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj0ibGV0IHBhZ2VTaXplT3B0aW9uIG9mIF9kaXNwbGF5ZWRQYWdlU2l6ZU9wdGlvbnMiIFt2YWx1ZV09InBhZ2VTaXplT3B0aW9uIj5cbiAgICAgICAgICAgIHt7cGFnZVNpemVPcHRpb259fVxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz0ibWF0LXBhZ2luYXRvci1wYWdlLXNpemUtdmFsdWUiXG4gICAgICAgICpuZ0lmPSJfZGlzcGxheWVkUGFnZVNpemVPcHRpb25zLmxlbmd0aCA8PSAxIj57e3BhZ2VTaXplfX08L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9Im1hdC1wYWdpbmF0b3ItcmFuZ2UtYWN0aW9ucyI+XG4gICAgICA8ZGl2IGNsYXNzPSJtYXQtcGFnaW5hdG9yLXJhbmdlLWxhYmVsIj5cbiAgICAgICAge3tfaW50bC5nZXRSYW5nZUxhYmVsKHBhZ2VJbmRleCwgcGFnZVNpemUsIGxlbmd0aCl9fVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9ImJ1dHRvbiJcbiAgICAgICAgICAgICAgY2xhc3M9Im1hdC1wYWdpbmF0b3ItbmF2aWdhdGlvbi1maXJzdCJcbiAgICAgICAgICAgICAgKGNsaWNrKT0iZmlyc3RQYWdlKCkiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPSJfaW50bC5maXJzdFBhZ2VMYWJlbCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPSJfaW50bC5maXJzdFBhZ2VMYWJlbCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBEaXNhYmxlZF09Il9wcmV2aW91c0J1dHRvbnNEaXNhYmxlZCgpIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcFBvc2l0aW9uXT0iXCdhYm92ZVwnIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPSJfcHJldmlvdXNCdXR0b25zRGlzYWJsZWQoKSJcbiAgICAgICAgICAgICAgKm5nSWY9InNob3dGaXJzdExhc3RCdXR0b25zIj5cbiAgICAgICAgPHN2ZyBjbGFzcz0ibWF0LXBhZ2luYXRvci1pY29uIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZvY3VzYWJsZT0iZmFsc2UiPlxuICAgICAgICAgIDxwYXRoIGQ9Ik0xOC40MSAxNi41OUwxMy44MiAxMmw0LjU5LTQuNTlMMTcgNmwtNiA2IDYgNnpNNiA2aDJ2MTJINnoiLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9ImJ1dHRvbiJcbiAgICAgICAgICAgICAgY2xhc3M9Im1hdC1wYWdpbmF0b3ItbmF2aWdhdGlvbi1wcmV2aW91cyJcbiAgICAgICAgICAgICAgKGNsaWNrKT0icHJldmlvdXNQYWdlKCkiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPSJfaW50bC5wcmV2aW91c1BhZ2VMYWJlbCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPSJfaW50bC5wcmV2aW91c1BhZ2VMYWJlbCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBEaXNhYmxlZF09Il9wcmV2aW91c0J1dHRvbnNEaXNhYmxlZCgpIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcFBvc2l0aW9uXT0iXCdhYm92ZVwnIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPSJfcHJldmlvdXNCdXR0b25zRGlzYWJsZWQoKSI+XG4gICAgICAgIDxzdmcgY2xhc3M9Im1hdC1wYWdpbmF0b3ItaWNvbiIgdmlld0JveD0iMCAwIDI0IDI0IiBmb2N1c2FibGU9ImZhbHNlIj5cbiAgICAgICAgICA8cGF0aCBkPSJNMTUuNDEgNy40MUwxNCA2bC02IDYgNiA2IDEuNDEtMS40MUwxMC44MyAxMnoiLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIHR5cGU9ImJ1dHRvbiJcbiAgICAgICAgICAgICAgY2xhc3M9Im1hdC1wYWdpbmF0b3ItbmF2aWdhdGlvbi1uZXh0IlxuICAgICAgICAgICAgICAoY2xpY2spPSJuZXh0UGFnZSgpIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT0iX2ludGwubmV4dFBhZ2VMYWJlbCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPSJfaW50bC5uZXh0UGFnZUxhYmVsIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcERpc2FibGVkXT0iX25leHRCdXR0b25zRGlzYWJsZWQoKSJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBQb3NpdGlvbl09IlwnYWJvdmVcJyJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT0iX25leHRCdXR0b25zRGlzYWJsZWQoKSI+XG4gICAgICAgIDxzdmcgY2xhc3M9Im1hdC1wYWdpbmF0b3ItaWNvbiIgdmlld0JveD0iMCAwIDI0IDI0IiBmb2N1c2FibGU9ImZhbHNlIj5cbiAgICAgICAgICA8cGF0aCBkPSJNMTAgNkw4LjU5IDcuNDEgMTMuMTcgMTJsLTQuNTggNC41OUwxMCAxOGw2LTZ6Ii8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiB0eXBlPSJidXR0b24iXG4gICAgICAgICAgICAgIGNsYXNzPSJtYXQtcGFnaW5hdG9yLW5hdmlnYXRpb24tbGFzdCJcbiAgICAgICAgICAgICAgKGNsaWNrKT0ibGFzdFBhZ2UoKSJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09Il9pbnRsLmxhc3RQYWdlTGFiZWwiXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwXT0iX2ludGwubGFzdFBhZ2VMYWJlbCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBEaXNhYmxlZF09Il9uZXh0QnV0dG9uc0Rpc2FibGVkKCkiXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwUG9zaXRpb25dPSJcJ2Fib3ZlXCciXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09Il9uZXh0QnV0dG9uc0Rpc2FibGVkKCkiXG4gICAgICAgICAgICAgICpuZ0lmPSJzaG93Rmlyc3RMYXN0QnV0dG9ucyI+XG4gICAgICAgIDxzdmcgY2xhc3M9Im1hdC1wYWdpbmF0b3ItaWNvbiIgdmlld0JveD0iMCAwIDI0IDI0IiBmb2N1c2FibGU9ImZhbHNlIj5cbiAgICAgICAgICA8cGF0aCBkPSJNNS41OSA3LjQxTDEwLjE4IDEybC00LjU5IDQuNTlMNyAxOGw2LTYtNi02ek0xNiA2aDJ2MTJoLTJ6Ii8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4nLGlucHV0czpbImRpc2FibGVkIl0saG9zdDp7Y2xhc3M6Im1hdC1wYWdpbmF0b3IiLHJvbGU6Imdyb3VwIn0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaCxlbmNhcHN1bGF0aW9uOkhuLk5vbmUsc3R5bGVzOlsiLm1hdC1wYWdpbmF0b3J7ZGlzcGxheTpibG9ja30ubWF0LXBhZ2luYXRvci1vdXRlci1jb250YWluZXJ7ZGlzcGxheTpmbGV4fS5tYXQtcGFnaW5hdG9yLWNvbnRhaW5lcntkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpmbGV4LWVuZDtwYWRkaW5nOjAgOHB4O2ZsZXgtd3JhcDp3cmFwLXJldmVyc2U7d2lkdGg6MTAwJX0ubWF0LXBhZ2luYXRvci1wYWdlLXNpemV7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmJhc2VsaW5lO21hcmdpbi1yaWdodDo4cHh9W2Rpcj1ydGxdIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZXttYXJnaW4tcmlnaHQ6MDttYXJnaW4tbGVmdDo4cHh9Lm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplLWxhYmVse21hcmdpbjowIDRweH0ubWF0LXBhZ2luYXRvci1wYWdlLXNpemUtc2VsZWN0e21hcmdpbjo2cHggNHB4IDAgNHB4O3dpZHRoOjU2cHh9Lm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmV7d2lkdGg6NjRweH0ubWF0LXBhZ2luYXRvci1wYWdlLXNpemUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbHt3aWR0aDo2NHB4fS5tYXQtcGFnaW5hdG9yLXJhbmdlLWxhYmVse21hcmdpbjowIDMycHggMCAyNHB4fS5tYXQtcGFnaW5hdG9yLXJhbmdlLWFjdGlvbnN7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcn0ubWF0LXBhZ2luYXRvci1pY29ue3dpZHRoOjI4cHg7ZmlsbDpjdXJyZW50Q29sb3J9W2Rpcj1ydGxdIC5tYXQtcGFnaW5hdG9yLWljb257dHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1wYWdpbmF0b3ItaWNvbntmaWxsOkNhbnZhc1RleHR9XG4iXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlpRfSx7dHlwZTpVZ30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltKUV19XX1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBlJHt9ZnVuY3Rpb24gbiQodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDMpLFZtKCJAYXJyb3dQb3NpdGlvbi5zdGFydCIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5fZGlzYWJsZVZpZXdTdGF0ZUFuaW1hdGlvbj0hMH0pKSgiQGFycm93UG9zaXRpb24uZG9uZSIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5fZGlzYWJsZVZpZXdTdGF0ZUFuaW1hdGlvbj0hMX0pKSxUbSgxLCJkaXYiLDQpLFJtKDIsImRpdiIsNSksVG0oMywiZGl2Iiw2KSxUbSg0LCJkaXYiLDcpLFRtKDUsImRpdiIsOCksQW0oKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgpO0RtKCJAYXJyb3dPcGFjaXR5Iix0Ll9nZXRBcnJvd1ZpZXdTdGF0ZSgpKSgiQGFycm93UG9zaXRpb24iLHQuX2dldEFycm93Vmlld1N0YXRlKCkpKCJAYWxsb3dDaGlsZHJlbiIsdC5fZ2V0QXJyb3dEaXJlY3Rpb25TdGF0ZSgpKSxyYygyKSxEbSgiQGluZGljYXRvciIsdC5fZ2V0QXJyb3dEaXJlY3Rpb25TdGF0ZSgpKSxyYygxKSxEbSgiQGxlZnRQb2ludGVyIix0Ll9nZXRBcnJvd0RpcmVjdGlvblN0YXRlKCkpLHJjKDEpLERtKCJAcmlnaHRQb2ludGVyIix0Ll9nZXRBcnJvd0RpcmVjdGlvblN0YXRlKCkpfX1lJC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8ZSQpfSxlJC7JtW1vZD1hbyh7dHlwZTplJH0pLGUkLsm1aW5qPXZuKHtwcm92aWRlcnM6W1hRXSxpbXBvcnRzOltbV00sSkgsVEcsVlEsWEldXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZSQsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltXTSxKSCxURyxWUSxYSV0sZXhwb3J0czpbdCRdLGRlY2xhcmF0aW9uczpbdCRdLHByb3ZpZGVyczpbWFFdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oZSQse2RlY2xhcmF0aW9uczpmdW5jdGlvbigpe3JldHVyblt0JF19LGltcG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bV00sSkgsVEcsVlEsWEldfSxleHBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW3QkXX19KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IG8kPW5ldyBHYSgiTUFUX1NPUlRfREVGQVVMVF9PUFRJT05TIiksaSQ9ZUgoS0koY2xhc3N7fSkpO2NsYXNzIGEkIGV4dGVuZHMgaSR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLl9kZWZhdWx0T3B0aW9ucz10LHRoaXMuc29ydGFibGVzPW5ldyBNYXAsdGhpcy5fc3RhdGVDaGFuZ2VzPW5ldyBJLHRoaXMuc3RhcnQ9ImFzYyIsdGhpcy5fZGlyZWN0aW9uPSIiLHRoaXMuc29ydENoYW5nZT1uZXcgTGh9Z2V0IGRpcmVjdGlvbigpe3JldHVybiB0aGlzLl9kaXJlY3Rpb259c2V0IGRpcmVjdGlvbih0KXtpZih0JiYiYXNjIiE9PXQmJiJkZXNjIiE9PXQmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSl0aHJvdyhmdW5jdGlvbiBlKHQpe3JldHVybiBFcnJvcihgJHt0fSBpcyBub3QgYSB2YWxpZCBzb3J0IGRpcmVjdGlvbiAoJ2FzYycgb3IgJ2Rlc2MnKS5gKX0pKHQpO3RoaXMuX2RpcmVjdGlvbj10fWdldCBkaXNhYmxlQ2xlYXIoKXtyZXR1cm4gdGhpcy5fZGlzYWJsZUNsZWFyfXNldCBkaXNhYmxlQ2xlYXIodCl7dGhpcy5fZGlzYWJsZUNsZWFyPXl6KHQpfXJlZ2lzdGVyKHQpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpe2lmKCF0LmlkKXRocm93KGZ1bmN0aW9uIGUoKXtyZXR1cm4gRXJyb3IoIk1hdFNvcnRIZWFkZXIgbXVzdCBiZSBwcm92aWRlZCB3aXRoIGEgdW5pcXVlIGlkLiIpfSkoKTtpZih0aGlzLnNvcnRhYmxlcy5oYXModC5pZCkpdGhyb3coZnVuY3Rpb24gbih0KXtyZXR1cm4gRXJyb3IoYENhbm5vdCBoYXZlIHR3byBNYXRTb3J0YWJsZXMgd2l0aCB0aGUgc2FtZSBpZCAoJHt0fSkuYCl9KSh0LmlkKX10aGlzLnNvcnRhYmxlcy5zZXQodC5pZCx0KX1kZXJlZ2lzdGVyKHQpe3RoaXMuc29ydGFibGVzLmRlbGV0ZSh0LmlkKX1zb3J0KHQpe3RoaXMuYWN0aXZlIT10LmlkPyh0aGlzLmFjdGl2ZT10LmlkLHRoaXMuZGlyZWN0aW9uPXQuc3RhcnQ/dC5zdGFydDp0aGlzLnN0YXJ0KTp0aGlzLmRpcmVjdGlvbj10aGlzLmdldE5leHRTb3J0RGlyZWN0aW9uKHQpLHRoaXMuc29ydENoYW5nZS5lbWl0KHthY3RpdmU6dGhpcy5hY3RpdmUsZGlyZWN0aW9uOnRoaXMuZGlyZWN0aW9ufSl9Z2V0TmV4dFNvcnREaXJlY3Rpb24odCl7dmFyIGUsbixvO2lmKCF0KXJldHVybiIiO2NvbnN0IGk9bnVsbCE9PShuPW51bGwhPT0oZT1udWxsPT10P3ZvaWQgMDp0LmRpc2FibGVDbGVhcikmJnZvaWQgMCE9PWU/ZTp0aGlzLmRpc2FibGVDbGVhcikmJnZvaWQgMCE9PW4/bjohIShudWxsPT09KG89dGhpcy5fZGVmYXVsdE9wdGlvbnMpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLmRpc2FibGVDbGVhcik7bGV0IGE9KGZ1bmN0aW9uIHIodCxlKXtsZXQgbj1bImFzYyIsImRlc2MiXTtyZXR1cm4iZGVzYyI9PXQmJm4ucmV2ZXJzZSgpLGV8fG4ucHVzaCgiIiksbn0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovKSh0LnN0YXJ0fHx0aGlzLnN0YXJ0LGkpLHM9YS5pbmRleE9mKHRoaXMuZGlyZWN0aW9uKSsxO3JldHVybiBzPj1hLmxlbmd0aCYmKHM9MCksYVtzXX1uZ09uSW5pdCgpe3RoaXMuX21hcmtJbml0aWFsaXplZCgpfW5nT25DaGFuZ2VzKCl7dGhpcy5fc3RhdGVDaGFuZ2VzLm5leHQoKX1uZ09uRGVzdHJveSgpe3RoaXMuX3N0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpfX1hJC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8YSQpKFNtKG8kLDgpKX0sYSQuybVkaXI9bG8oe3R5cGU6YSQsc2VsZWN0b3JzOltbIiIsIm1hdFNvcnQiLCIiXV0saG9zdEF0dHJzOlsxLCJtYXQtc29ydCJdLGlucHV0czp7ZGlzYWJsZWQ6WyJtYXRTb3J0RGlzYWJsZWQiLCJkaXNhYmxlZCJdLHN0YXJ0OlsibWF0U29ydFN0YXJ0Iiwic3RhcnQiXSxkaXJlY3Rpb246WyJtYXRTb3J0RGlyZWN0aW9uIiwiZGlyZWN0aW9uIl0sZGlzYWJsZUNsZWFyOlsibWF0U29ydERpc2FibGVDbGVhciIsImRpc2FibGVDbGVhciJdLGFjdGl2ZTpbIm1hdFNvcnRBY3RpdmUiLCJhY3RpdmUiXX0sb3V0cHV0czp7c29ydENoYW5nZToibWF0U29ydENoYW5nZSJ9LGV4cG9ydEFzOlsibWF0U29ydCJdLGZlYXR1cmVzOlt4cCxCb119KSxhJC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbbyRdfV19XSxhJC5wcm9wRGVjb3JhdG9ycz17YWN0aXZlOlt7dHlwZTp4eSxhcmdzOlsibWF0U29ydEFjdGl2ZSJdfV0sc3RhcnQ6W3t0eXBlOnh5LGFyZ3M6WyJtYXRTb3J0U3RhcnQiXX1dLGRpcmVjdGlvbjpbe3R5cGU6eHksYXJnczpbIm1hdFNvcnREaXJlY3Rpb24iXX1dLGRpc2FibGVDbGVhcjpbe3R5cGU6eHksYXJnczpbIm1hdFNvcnREaXNhYmxlQ2xlYXIiXX1dLHNvcnRDaGFuZ2U6W3t0eXBlOk95LGFyZ3M6WyJtYXRTb3J0Q2hhbmdlIl19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChhJCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbWF0U29ydF0iLGV4cG9ydEFzOiJtYXRTb3J0Iixob3N0OntjbGFzczoibWF0LXNvcnQifSxpbnB1dHM6WyJkaXNhYmxlZDogbWF0U29ydERpc2FibGVkIl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W28kXX1dfV19KSx7c3RhcnQ6W3t0eXBlOnh5LGFyZ3M6WyJtYXRTb3J0U3RhcnQiXX1dLHNvcnRDaGFuZ2U6W3t0eXBlOk95LGFyZ3M6WyJtYXRTb3J0Q2hhbmdlIl19XSxkaXJlY3Rpb246W3t0eXBlOnh5LGFyZ3M6WyJtYXRTb3J0RGlyZWN0aW9uIl19XSxkaXNhYmxlQ2xlYXI6W3t0eXBlOnh5LGFyZ3M6WyJtYXRTb3J0RGlzYWJsZUNsZWFyIl19XSxhY3RpdmU6W3t0eXBlOnh5LGFyZ3M6WyJtYXRTb3J0QWN0aXZlIl19XX0pO2NvbnN0IHIkPVdJLkVOVEVSSU5HKyIgIitHSS5TVEFOREFSRF9DVVJWRSxzJD17aW5kaWNhdG9yOm54KCJpbmRpY2F0b3IiLFtyeCgiYWN0aXZlLWFzYywgYXNjIixheCh7dHJhbnNmb3JtOiJ0cmFuc2xhdGVZKDBweCkifSkpLHJ4KCJhY3RpdmUtZGVzYywgZGVzYyIsYXgoe3RyYW5zZm9ybToidHJhbnNsYXRlWSgxMHB4KSJ9KSksbHgoImFjdGl2ZS1hc2MgPD0+IGFjdGl2ZS1kZXNjIixveChyJCkpXSksbGVmdFBvaW50ZXI6bngoImxlZnRQb2ludGVyIixbcngoImFjdGl2ZS1hc2MsIGFzYyIsYXgoe3RyYW5zZm9ybToicm90YXRlKC00NWRlZykifSkpLHJ4KCJhY3RpdmUtZGVzYywgZGVzYyIsYXgoe3RyYW5zZm9ybToicm90YXRlKDQ1ZGVnKSJ9KSksbHgoImFjdGl2ZS1hc2MgPD0+IGFjdGl2ZS1kZXNjIixveChyJCkpXSkscmlnaHRQb2ludGVyOm54KCJyaWdodFBvaW50ZXIiLFtyeCgiYWN0aXZlLWFzYywgYXNjIixheCh7dHJhbnNmb3JtOiJyb3RhdGUoNDVkZWcpIn0pKSxyeCgiYWN0aXZlLWRlc2MsIGRlc2MiLGF4KHt0cmFuc2Zvcm06InJvdGF0ZSgtNDVkZWcpIn0pKSxseCgiYWN0aXZlLWFzYyA8PT4gYWN0aXZlLWRlc2MiLG94KHIkKSldKSxhcnJvd09wYWNpdHk6bngoImFycm93T3BhY2l0eSIsW3J4KCJkZXNjLXRvLWFjdGl2ZSwgYXNjLXRvLWFjdGl2ZSwgYWN0aXZlIixheCh7b3BhY2l0eToxfSkpLHJ4KCJkZXNjLXRvLWhpbnQsIGFzYy10by1oaW50LCBoaW50IixheCh7b3BhY2l0eTouNTR9KSkscngoImhpbnQtdG8tZGVzYywgYWN0aXZlLXRvLWRlc2MsIGRlc2MsIGhpbnQtdG8tYXNjLCBhY3RpdmUtdG8tYXNjLCBhc2MsIHZvaWQiLGF4KHtvcGFjaXR5OjB9KSksbHgoIiogPT4gYXNjLCAqID0+IGRlc2MsICogPT4gYWN0aXZlLCAqID0+IGhpbnQsICogPT4gdm9pZCIsb3goIjBtcyIpKSxseCgiKiA8PT4gKiIsb3gociQpKV0pLGFycm93UG9zaXRpb246bngoImFycm93UG9zaXRpb24iLFtseCgiKiA9PiBkZXNjLXRvLWhpbnQsICogPT4gZGVzYy10by1hY3RpdmUiLG94KHIkLHN4KFtheCh7dHJhbnNmb3JtOiJ0cmFuc2xhdGVZKC0yNSUpIn0pLGF4KHt0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMCkifSldKSkpLGx4KCIqID0+IGhpbnQtdG8tZGVzYywgKiA9PiBhY3RpdmUtdG8tZGVzYyIsb3gociQsc3goW2F4KHt0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMCkifSksYXgoe3RyYW5zZm9ybToidHJhbnNsYXRlWSgyNSUpIn0pXSkpKSxseCgiKiA9PiBhc2MtdG8taGludCwgKiA9PiBhc2MtdG8tYWN0aXZlIixveChyJCxzeChbYXgoe3RyYW5zZm9ybToidHJhbnNsYXRlWSgyNSUpIn0pLGF4KHt0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMCkifSldKSkpLGx4KCIqID0+IGhpbnQtdG8tYXNjLCAqID0+IGFjdGl2ZS10by1hc2MiLG94KHIkLHN4KFtheCh7dHJhbnNmb3JtOiJ0cmFuc2xhdGVZKDApIn0pLGF4KHt0cmFuc2Zvcm06InRyYW5zbGF0ZVkoLTI1JSkifSldKSkpLHJ4KCJkZXNjLXRvLWhpbnQsIGFzYy10by1oaW50LCBoaW50LCBkZXNjLXRvLWFjdGl2ZSwgYXNjLXRvLWFjdGl2ZSwgYWN0aXZlIixheCh7dHJhbnNmb3JtOiJ0cmFuc2xhdGVZKDApIn0pKSxyeCgiaGludC10by1kZXNjLCBhY3RpdmUtdG8tZGVzYywgZGVzYyIsYXgoe3RyYW5zZm9ybToidHJhbnNsYXRlWSgtMjUlKSJ9KSkscngoImhpbnQtdG8tYXNjLCBhY3RpdmUtdG8tYXNjLCBhc2MiLGF4KHt0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMjUlKSJ9KSldKSxhbGxvd0NoaWxkcmVuOm54KCJhbGxvd0NoaWxkcmVuIixbbHgoIiogPD0+ICoiLFtkeCgiQCoiLGN4KCkse29wdGlvbmFsOiEwfSldKV0pfTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIGwke2NvbnN0cnVjdG9yKCl7dGhpcy5jaGFuZ2VzPW5ldyBJfX1sJC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bCQpfSxsJC7JtXByb3Y9TW4oe2ZhY3Rvcnk6ZnVuY3Rpb24gdCgpe3JldHVybiBuZXcgbCR9LHRva2VuOmwkLHByb3ZpZGVkSW46InJvb3QifSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChsJCxbe3R5cGU6aW0sYXJnczpbe3Byb3ZpZGVkSW46InJvb3QifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5bXX0pLG51bGwpO2NvbnN0IGMkPXtwcm92aWRlOmwkLGRlcHM6W1tuZXcgU3IsbmV3IEVyLGwkXV0sdXNlRmFjdG9yeTpmdW5jdGlvbiBkJCh0KXtyZXR1cm4gdHx8bmV3IGwkfX0scCQ9S0koY2xhc3N7fSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NsYXNzIG0kIGV4dGVuZHMgcCR7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEpe2lmKHN1cGVyKCksdGhpcy5faW50bD10LHRoaXMuX2NoYW5nZURldGVjdG9yUmVmPWUsdGhpcy5fc29ydD1uLHRoaXMuX2NvbHVtbkRlZj1vLHRoaXMuX2ZvY3VzTW9uaXRvcj1pLHRoaXMuX2VsZW1lbnRSZWY9YSx0aGlzLl9zaG93SW5kaWNhdG9ySGludD0hMSx0aGlzLl92aWV3U3RhdGU9e30sdGhpcy5fYXJyb3dEaXJlY3Rpb249IiIsdGhpcy5fZGlzYWJsZVZpZXdTdGF0ZUFuaW1hdGlvbj0hMSx0aGlzLmFycm93UG9zaXRpb249ImFmdGVyIiwhbiYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93KGZ1bmN0aW9uIHIoKXtyZXR1cm4gRXJyb3IoIk1hdFNvcnRIZWFkZXIgbXVzdCBiZSBwbGFjZWQgd2l0aGluIGEgcGFyZW50IGVsZW1lbnQgd2l0aCB0aGUgTWF0U29ydCBkaXJlY3RpdmUuIil9KSgpO3RoaXMuX2hhbmRsZVN0YXRlQ2hhbmdlcygpfWdldCBkaXNhYmxlQ2xlYXIoKXtyZXR1cm4gdGhpcy5fZGlzYWJsZUNsZWFyfXNldCBkaXNhYmxlQ2xlYXIodCl7dGhpcy5fZGlzYWJsZUNsZWFyPXl6KHQpfW5nT25Jbml0KCl7IXRoaXMuaWQmJnRoaXMuX2NvbHVtbkRlZiYmKHRoaXMuaWQ9dGhpcy5fY29sdW1uRGVmLm5hbWUpLHRoaXMuX3VwZGF0ZUFycm93RGlyZWN0aW9uKCksdGhpcy5fc2V0QW5pbWF0aW9uVHJhbnNpdGlvblN0YXRlKHt0b1N0YXRlOnRoaXMuX2lzU29ydGVkKCk/ImFjdGl2ZSI6dGhpcy5fYXJyb3dEaXJlY3Rpb259KSx0aGlzLl9zb3J0LnJlZ2lzdGVyKHRoaXMpfW5nQWZ0ZXJWaWV3SW5pdCgpe3RoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHRoaXMuX2VsZW1lbnRSZWYsITApLnN1YnNjcmliZSgodD0+e2NvbnN0IGU9ISF0O2UhPT10aGlzLl9zaG93SW5kaWNhdG9ySGludCYmKHRoaXMuX3NldEluZGljYXRvckhpbnRWaXNpYmxlKGUpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKX0pKX1uZ09uRGVzdHJveSgpe3RoaXMuX2ZvY3VzTW9uaXRvci5zdG9wTW9uaXRvcmluZyh0aGlzLl9lbGVtZW50UmVmKSx0aGlzLl9zb3J0LmRlcmVnaXN0ZXIodGhpcyksdGhpcy5fcmVyZW5kZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKX1fc2V0SW5kaWNhdG9ySGludFZpc2libGUodCl7dGhpcy5faXNEaXNhYmxlZCgpJiZ0fHwodGhpcy5fc2hvd0luZGljYXRvckhpbnQ9dCx0aGlzLl9pc1NvcnRlZCgpfHwodGhpcy5fdXBkYXRlQXJyb3dEaXJlY3Rpb24oKSx0aGlzLl9zZXRBbmltYXRpb25UcmFuc2l0aW9uU3RhdGUodGhpcy5fc2hvd0luZGljYXRvckhpbnQ/e2Zyb21TdGF0ZTp0aGlzLl9hcnJvd0RpcmVjdGlvbix0b1N0YXRlOiJoaW50In06e2Zyb21TdGF0ZToiaGludCIsdG9TdGF0ZTp0aGlzLl9hcnJvd0RpcmVjdGlvbn0pKSl9X3NldEFuaW1hdGlvblRyYW5zaXRpb25TdGF0ZSh0KXt0aGlzLl92aWV3U3RhdGU9dHx8e30sdGhpcy5fZGlzYWJsZVZpZXdTdGF0ZUFuaW1hdGlvbiYmKHRoaXMuX3ZpZXdTdGF0ZT17dG9TdGF0ZTp0LnRvU3RhdGV9KX1fdG9nZ2xlT25JbnRlcmFjdGlvbigpe3RoaXMuX3NvcnQuc29ydCh0aGlzKSwiaGludCIhPT10aGlzLl92aWV3U3RhdGUudG9TdGF0ZSYmImFjdGl2ZSIhPT10aGlzLl92aWV3U3RhdGUudG9TdGF0ZXx8KHRoaXMuX2Rpc2FibGVWaWV3U3RhdGVBbmltYXRpb249ITApfV9oYW5kbGVDbGljaygpe3RoaXMuX2lzRGlzYWJsZWQoKXx8dGhpcy5fc29ydC5zb3J0KHRoaXMpfV9oYW5kbGVLZXlkb3duKHQpe3RoaXMuX2lzRGlzYWJsZWQoKXx8dC5rZXlDb2RlIT09ZnomJnQua2V5Q29kZSE9PW16fHwodC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX3RvZ2dsZU9uSW50ZXJhY3Rpb24oKSl9X2lzU29ydGVkKCl7cmV0dXJuIHRoaXMuX3NvcnQuYWN0aXZlPT10aGlzLmlkJiYoImFzYyI9PT10aGlzLl9zb3J0LmRpcmVjdGlvbnx8ImRlc2MiPT09dGhpcy5fc29ydC5kaXJlY3Rpb24pfV9nZXRBcnJvd0RpcmVjdGlvblN0YXRlKCl7cmV0dXJuYCR7dGhpcy5faXNTb3J0ZWQoKT8iYWN0aXZlLSI6IiJ9JHt0aGlzLl9hcnJvd0RpcmVjdGlvbn1gfV9nZXRBcnJvd1ZpZXdTdGF0ZSgpe2NvbnN0IHQ9dGhpcy5fdmlld1N0YXRlLmZyb21TdGF0ZTtyZXR1cm4odD9gJHt0fS10by1gOiIiKSt0aGlzLl92aWV3U3RhdGUudG9TdGF0ZX1fdXBkYXRlQXJyb3dEaXJlY3Rpb24oKXt0aGlzLl9hcnJvd0RpcmVjdGlvbj10aGlzLl9pc1NvcnRlZCgpP3RoaXMuX3NvcnQuZGlyZWN0aW9uOnRoaXMuc3RhcnR8fHRoaXMuX3NvcnQuc3RhcnR9X2lzRGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5fc29ydC5kaXNhYmxlZHx8dGhpcy5kaXNhYmxlZH1fZ2V0QXJpYVNvcnRBdHRyaWJ1dGUoKXtyZXR1cm4gdGhpcy5faXNTb3J0ZWQoKT8iYXNjIj09dGhpcy5fc29ydC5kaXJlY3Rpb24/ImFzY2VuZGluZyI6ImRlc2NlbmRpbmciOiJub25lIn1fcmVuZGVyQXJyb3coKXtyZXR1cm4hdGhpcy5faXNEaXNhYmxlZCgpfHx0aGlzLl9pc1NvcnRlZCgpfV9oYW5kbGVTdGF0ZUNoYW5nZXMoKXt0aGlzLl9yZXJlbmRlclN1YnNjcmlwdGlvbj1yZSh0aGlzLl9zb3J0LnNvcnRDaGFuZ2UsdGhpcy5fc29ydC5fc3RhdGVDaGFuZ2VzLHRoaXMuX2ludGwuY2hhbmdlcykuc3Vic2NyaWJlKCgoKT0+e3RoaXMuX2lzU29ydGVkKCkmJih0aGlzLl91cGRhdGVBcnJvd0RpcmVjdGlvbigpLCJoaW50IiE9PXRoaXMuX3ZpZXdTdGF0ZS50b1N0YXRlJiYiYWN0aXZlIiE9PXRoaXMuX3ZpZXdTdGF0ZS50b1N0YXRlfHwodGhpcy5fZGlzYWJsZVZpZXdTdGF0ZUFuaW1hdGlvbj0hMCksdGhpcy5fc2V0QW5pbWF0aW9uVHJhbnNpdGlvblN0YXRlKHtmcm9tU3RhdGU6dGhpcy5fYXJyb3dEaXJlY3Rpb24sdG9TdGF0ZToiYWN0aXZlIn0pLHRoaXMuX3Nob3dJbmRpY2F0b3JIaW50PSExKSwhdGhpcy5faXNTb3J0ZWQoKSYmdGhpcy5fdmlld1N0YXRlJiYiYWN0aXZlIj09PXRoaXMuX3ZpZXdTdGF0ZS50b1N0YXRlJiYodGhpcy5fZGlzYWJsZVZpZXdTdGF0ZUFuaW1hdGlvbj0hMSx0aGlzLl9zZXRBbmltYXRpb25UcmFuc2l0aW9uU3RhdGUoe2Zyb21TdGF0ZToiYWN0aXZlIix0b1N0YXRlOnRoaXMuX2Fycm93RGlyZWN0aW9ufSkpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfSkpfX1tJC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bSQpKFNtKGwkKSxTbShVZyksU20oYSQsOCksU20oIk1BVF9TT1JUX0hFQURFUl9DT0xVTU5fREVGIiw4KSxTbShTSSksU20oaGcpKX0sbSQuybVjbXA9dG8oe3R5cGU6bSQsc2VsZWN0b3JzOltbIiIsIm1hdC1zb3J0LWhlYWRlciIsIiJdXSxob3N0QXR0cnM6WzEsIm1hdC1zb3J0LWhlYWRlciJdLGhvc3RWYXJzOjMsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJlZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5faGFuZGxlQ2xpY2soKX0pKSgia2V5ZG93biIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX2hhbmRsZUtleWRvd24oZSl9KSkoIm1vdXNlZW50ZXIiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX3NldEluZGljYXRvckhpbnRWaXNpYmxlKCEwKX0pKSgibW91c2VsZWF2ZSIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5fc2V0SW5kaWNhdG9ySGludFZpc2libGUoITEpfSkpLDImZSYmKGpwKCJhcmlhLXNvcnQiLG4uX2dldEFyaWFTb3J0QXR0cmlidXRlKCkpLHB1KCJtYXQtc29ydC1oZWFkZXItZGlzYWJsZWQiLG4uX2lzRGlzYWJsZWQoKSkpfSxpbnB1dHM6e2Rpc2FibGVkOiJkaXNhYmxlZCIsYXJyb3dQb3NpdGlvbjoiYXJyb3dQb3NpdGlvbiIsZGlzYWJsZUNsZWFyOiJkaXNhYmxlQ2xlYXIiLGlkOlsibWF0LXNvcnQtaGVhZGVyIiwiaWQiXSxzdGFydDoic3RhcnQifSxleHBvcnRBczpbIm1hdFNvcnRIZWFkZXIiXSxmZWF0dXJlczpbeHBdLGF0dHJzOlsibWF0LXNvcnQtaGVhZGVyIiwiIl0sbmdDb250ZW50U2VsZWN0b3JzOlsiKiJdLGRlY2xzOjQsdmFyczo2LGNvbnN0czpbWyJyb2xlIiwiYnV0dG9uIiwxLCJtYXQtc29ydC1oZWFkZXItY29udGFpbmVyIiwibWF0LWZvY3VzLWluZGljYXRvciJdLFsxLCJtYXQtc29ydC1oZWFkZXItY29udGVudCJdLFsiY2xhc3MiLCJtYXQtc29ydC1oZWFkZXItYXJyb3ciLDQsIm5nSWYiXSxbMSwibWF0LXNvcnQtaGVhZGVyLWFycm93Il0sWzEsIm1hdC1zb3J0LWhlYWRlci1zdGVtIl0sWzEsIm1hdC1zb3J0LWhlYWRlci1pbmRpY2F0b3IiXSxbMSwibWF0LXNvcnQtaGVhZGVyLXBvaW50ZXItbGVmdCJdLFsxLCJtYXQtc29ydC1oZWFkZXItcG9pbnRlci1yaWdodCJdLFsxLCJtYXQtc29ydC1oZWFkZXItcG9pbnRlci1taWRkbGUiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFptKCksUm0oMCwiZGl2IiwwKSxSbSgxLCJkaXYiLDEpLFhtKDIpLEFtKCksUXAoMyxuJCw2LDYsImRpdiIsMiksQW0oKSksMiZlJiYocHUoIm1hdC1zb3J0LWhlYWRlci1zb3J0ZWQiLG4uX2lzU29ydGVkKCkpKCJtYXQtc29ydC1oZWFkZXItcG9zaXRpb24tYmVmb3JlIiwiYmVmb3JlIj09bi5hcnJvd1Bvc2l0aW9uKSxqcCgidGFiaW5kZXgiLG4uX2lzRGlzYWJsZWQoKT9udWxsOjApLHJjKDMpLERtKCJuZ0lmIixuLl9yZW5kZXJBcnJvdygpKSl9LGRpcmVjdGl2ZXM6W2RNXSxzdHlsZXM6WyIubWF0LXNvcnQtaGVhZGVyLWNvbnRhaW5lcntkaXNwbGF5OmZsZXg7Y3Vyc29yOnBvaW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO2xldHRlci1zcGFjaW5nOm5vcm1hbDtvdXRsaW5lOjB9W21hdC1zb3J0LWhlYWRlcl0uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1zb3J0LWhlYWRlci1jb250YWluZXIsW21hdC1zb3J0LWhlYWRlcl0uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LXNvcnQtaGVhZGVyLWNvbnRhaW5lcntib3JkZXItYm90dG9tOnNvbGlkIDFweCBjdXJyZW50Q29sb3J9Lm1hdC1zb3J0LWhlYWRlci1kaXNhYmxlZCAubWF0LXNvcnQtaGVhZGVyLWNvbnRhaW5lcntjdXJzb3I6ZGVmYXVsdH0ubWF0LXNvcnQtaGVhZGVyLWNvbnRlbnR7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcn0ubWF0LXNvcnQtaGVhZGVyLXBvc2l0aW9uLWJlZm9yZXtmbGV4LWRpcmVjdGlvbjpyb3ctcmV2ZXJzZX0ubWF0LXNvcnQtaGVhZGVyLWFycm93e2hlaWdodDoxMnB4O3dpZHRoOjEycHg7bWluLXdpZHRoOjEycHg7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpmbGV4O29wYWNpdHk6MH0ubWF0LXNvcnQtaGVhZGVyLWFycm93LFtkaXI9cnRsXSAubWF0LXNvcnQtaGVhZGVyLXBvc2l0aW9uLWJlZm9yZSAubWF0LXNvcnQtaGVhZGVyLWFycm93e21hcmdpbjowIDAgMCA2cHh9Lm1hdC1zb3J0LWhlYWRlci1wb3NpdGlvbi1iZWZvcmUgLm1hdC1zb3J0LWhlYWRlci1hcnJvdyxbZGlyPXJ0bF0gLm1hdC1zb3J0LWhlYWRlci1hcnJvd3ttYXJnaW46MCA2cHggMCAwfS5tYXQtc29ydC1oZWFkZXItc3RlbXtiYWNrZ3JvdW5kOmN1cnJlbnRDb2xvcjtoZWlnaHQ6MTBweDt3aWR0aDoycHg7bWFyZ2luOmF1dG87ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcn0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc29ydC1oZWFkZXItc3RlbXt3aWR0aDowO2JvcmRlci1sZWZ0OnNvbGlkIDJweH0ubWF0LXNvcnQtaGVhZGVyLWluZGljYXRvcnt3aWR0aDoxMDAlO2hlaWdodDoycHg7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjB9Lm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLW1pZGRsZXttYXJnaW46YXV0bztoZWlnaHQ6MnB4O3dpZHRoOjJweDtiYWNrZ3JvdW5kOmN1cnJlbnRDb2xvcjt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc29ydC1oZWFkZXItcG9pbnRlci1taWRkbGV7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXItdG9wOnNvbGlkIDJweDtib3JkZXItbGVmdDpzb2xpZCAycHh9Lm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLWxlZnQsLm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLXJpZ2h0e2JhY2tncm91bmQ6Y3VycmVudENvbG9yO3dpZHRoOjZweDtoZWlnaHQ6MnB4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDowfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLWxlZnQsLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNvcnQtaGVhZGVyLXBvaW50ZXItcmlnaHR7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXItbGVmdDpzb2xpZCA2cHg7Ym9yZGVyLXRvcDpzb2xpZCAycHh9Lm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLWxlZnR7dHJhbnNmb3JtLW9yaWdpbjpyaWdodDtsZWZ0OjB9Lm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLXJpZ2h0e3RyYW5zZm9ybS1vcmlnaW46bGVmdDtyaWdodDowfVxuIl0sZW5jYXBzdWxhdGlvbjoyLGRhdGE6e2FuaW1hdGlvbjpbcyQuaW5kaWNhdG9yLHMkLmxlZnRQb2ludGVyLHMkLnJpZ2h0UG9pbnRlcixzJC5hcnJvd09wYWNpdHkscyQuYXJyb3dQb3NpdGlvbixzJC5hbGxvd0NoaWxkcmVuXX0sY2hhbmdlRGV0ZWN0aW9uOjB9KSxtJC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmwkfSx7dHlwZTpVZ30se3R5cGU6YSQsZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6WyJNQVRfU09SVF9IRUFERVJfQ09MVU1OX0RFRiJdfSx7dHlwZTpTcn1dfSx7dHlwZTpTSX0se3R5cGU6aGd9XSxtJC5wcm9wRGVjb3JhdG9ycz17aWQ6W3t0eXBlOnh5LGFyZ3M6WyJtYXQtc29ydC1oZWFkZXIiXX1dLGFycm93UG9zaXRpb246W3t0eXBlOnh5fV0sc3RhcnQ6W3t0eXBlOnh5fV0sZGlzYWJsZUNsZWFyOlt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKG0kLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6IlttYXQtc29ydC1oZWFkZXJdIixleHBvcnRBczoibWF0U29ydEhlYWRlciIsdGVtcGxhdGU6J1x4M2MhLS1cbiAgV2Ugc2V0IHRoZSBgdGFiaW5kZXhgIG9uIGFuIGVsZW1lbnQgaW5zaWRlIHRoZSB0YWJsZSBoZWFkZXIsIHJhdGhlciB0aGFuIHRoZSBoZWFkZXIgaXRzZWxmLFxuICBiZWNhdXNlIG9mIGEgYnVnIGluIE5WREEgd2hlcmUgaGF2aW5nIGEgYHRhYmluZGV4YCBvbiBhIGB0aGAgYnJlYWtzIGtleWJvYXJkIG5hdmlnYXRpb24gaW4gdGhlXG4gIHRhYmxlIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL252YWNjZXNzL252ZGEvaXNzdWVzLzc3MTgpLiBUaGlzIGFsbG93cyBmb3IgdGhlIGhlYWRlciB0byBib3RoXG4gIGJlIGZvY3VzYWJsZSwgYW5kIGhhdmUgc2NyZWVuIHJlYWRlcnMgcmVhZCBvdXQgaXRzIGBhcmlhLXNvcnRgIHN0YXRlLiBXZSBwcmVmZXIgdGhpcyBhcHByb2FjaFxuICBvdmVyIGhhdmluZyBhIGJ1dHRvbiB3aXRoIGFuIGBhcmlhLWxhYmVsYCBpbnNpZGUgdGhlIGhlYWRlciwgYmVjYXVzZSB0aGUgYnV0dG9uXCdzIGBhcmlhLWxhYmVsYFxuICB3aWxsIGJlIHJlYWQgb3V0IGFzIHRoZSB1c2VyIGlzIG5hdmlnYXRpbmcgdGhlIHRhYmxlXCdzIGNlbGwgKHNlZSAjMTMwMTIpLlxuXG4gIFRoZSBhcHByb2FjaCBpcyBiYXNlZCBvZmYgb2Y6IGh0dHBzOi8vZGVxdWV1bml2ZXJzaXR5LmNvbS9saWJyYXJ5L2FyaWEvdGFibGVzL3NmLXNvcnRhYmxlLWdyaWRcbi0tXHgzZVxuPGRpdiBjbGFzcz0ibWF0LXNvcnQtaGVhZGVyLWNvbnRhaW5lciBtYXQtZm9jdXMtaW5kaWNhdG9yIlxuICAgICBbY2xhc3MubWF0LXNvcnQtaGVhZGVyLXNvcnRlZF09Il9pc1NvcnRlZCgpIlxuICAgICBbY2xhc3MubWF0LXNvcnQtaGVhZGVyLXBvc2l0aW9uLWJlZm9yZV09ImFycm93UG9zaXRpb24gPT0gXCdiZWZvcmVcJyJcbiAgICAgW2F0dHIudGFiaW5kZXhdPSJfaXNEaXNhYmxlZCgpID8gbnVsbCA6IDAiXG4gICAgIHJvbGU9ImJ1dHRvbiI+XG5cbiAgXHgzYyEtLVxuICAgIFRPRE8oY3Jpc2JldG8pOiB0aGlzIGRpdiBpc25cJ3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBidXQgd2UgaGF2ZSB0byBrZWVwIGl0IGR1ZSB0byBhIGxhcmdlXG4gICAgbnVtYmVyIG9mIHNjcmVlbnNob3QgZGlmZiBmYWlsdXJlcy4gSXQgc2hvdWxkIGJlIHJlbW92ZWQgZXZlbnR1YWxseS4gTm90ZSB0aGF0IHRoZSBkaWZmZXJlbmNlXG4gICAgaXNuXCd0IHZpc2libGUgd2l0aCBhIHNob3J0ZXIgaGVhZGVyLCBidXQgb25jZSBpdCBicmVha3MgdXAgaW50byBtdWx0aXBsZSBsaW5lcywgdGhpcyBlbGVtZW50XG4gICAgY2F1c2VzIGl0IHRvIGJlIGNlbnRlci1hbGlnbmVkLCB3aGVyZWFzIHJlbW92aW5nIGl0IHdpbGwga2VlcCB0aGUgdGV4dCB0byB0aGUgbGVmdC5cbiAgLS1ceDNlXG4gIDxkaXYgY2xhc3M9Im1hdC1zb3J0LWhlYWRlci1jb250ZW50Ij5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuXG4gIFx4M2MhLS0gRGlzYWJsZSBhbmltYXRpb25zIHdoaWxlIGEgY3VycmVudCBhbmltYXRpb24gaXMgcnVubmluZyAtLVx4M2VcbiAgPGRpdiBjbGFzcz0ibWF0LXNvcnQtaGVhZGVyLWFycm93IlxuICAgICAgICpuZ0lmPSJfcmVuZGVyQXJyb3coKSJcbiAgICAgICBbQGFycm93T3BhY2l0eV09Il9nZXRBcnJvd1ZpZXdTdGF0ZSgpIlxuICAgICAgIFtAYXJyb3dQb3NpdGlvbl09Il9nZXRBcnJvd1ZpZXdTdGF0ZSgpIlxuICAgICAgIFtAYWxsb3dDaGlsZHJlbl09Il9nZXRBcnJvd0RpcmVjdGlvblN0YXRlKCkiXG4gICAgICAgKEBhcnJvd1Bvc2l0aW9uLnN0YXJ0KT0iX2Rpc2FibGVWaWV3U3RhdGVBbmltYXRpb24gPSB0cnVlIlxuICAgICAgIChAYXJyb3dQb3NpdGlvbi5kb25lKT0iX2Rpc2FibGVWaWV3U3RhdGVBbmltYXRpb24gPSBmYWxzZSI+XG4gICAgPGRpdiBjbGFzcz0ibWF0LXNvcnQtaGVhZGVyLXN0ZW0iPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9Im1hdC1zb3J0LWhlYWRlci1pbmRpY2F0b3IiIFtAaW5kaWNhdG9yXT0iX2dldEFycm93RGlyZWN0aW9uU3RhdGUoKSI+XG4gICAgICA8ZGl2IGNsYXNzPSJtYXQtc29ydC1oZWFkZXItcG9pbnRlci1sZWZ0IiBbQGxlZnRQb2ludGVyXT0iX2dldEFycm93RGlyZWN0aW9uU3RhdGUoKSI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPSJtYXQtc29ydC1oZWFkZXItcG9pbnRlci1yaWdodCIgW0ByaWdodFBvaW50ZXJdPSJfZ2V0QXJyb3dEaXJlY3Rpb25TdGF0ZSgpIj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9Im1hdC1zb3J0LWhlYWRlci1wb2ludGVyLW1pZGRsZSI+PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4nLGhvc3Q6e2NsYXNzOiJtYXQtc29ydC1oZWFkZXIiLCIoY2xpY2spIjoiX2hhbmRsZUNsaWNrKCkiLCIoa2V5ZG93bikiOiJfaGFuZGxlS2V5ZG93bigkZXZlbnQpIiwiKG1vdXNlZW50ZXIpIjoiX3NldEluZGljYXRvckhpbnRWaXNpYmxlKHRydWUpIiwiKG1vdXNlbGVhdmUpIjoiX3NldEluZGljYXRvckhpbnRWaXNpYmxlKGZhbHNlKSIsIlthdHRyLmFyaWEtc29ydF0iOiJfZ2V0QXJpYVNvcnRBdHRyaWJ1dGUoKSIsIltjbGFzcy5tYXQtc29ydC1oZWFkZXItZGlzYWJsZWRdIjoiX2lzRGlzYWJsZWQoKSJ9LGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLGlucHV0czpbImRpc2FibGVkIl0sYW5pbWF0aW9uczpbcyQuaW5kaWNhdG9yLHMkLmxlZnRQb2ludGVyLHMkLnJpZ2h0UG9pbnRlcixzJC5hcnJvd09wYWNpdHkscyQuYXJyb3dQb3NpdGlvbixzJC5hbGxvd0NoaWxkcmVuXSxzdHlsZXM6WyIubWF0LXNvcnQtaGVhZGVyLWNvbnRhaW5lcntkaXNwbGF5OmZsZXg7Y3Vyc29yOnBvaW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO2xldHRlci1zcGFjaW5nOm5vcm1hbDtvdXRsaW5lOjB9W21hdC1zb3J0LWhlYWRlcl0uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1zb3J0LWhlYWRlci1jb250YWluZXIsW21hdC1zb3J0LWhlYWRlcl0uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LXNvcnQtaGVhZGVyLWNvbnRhaW5lcntib3JkZXItYm90dG9tOnNvbGlkIDFweCBjdXJyZW50Q29sb3J9Lm1hdC1zb3J0LWhlYWRlci1kaXNhYmxlZCAubWF0LXNvcnQtaGVhZGVyLWNvbnRhaW5lcntjdXJzb3I6ZGVmYXVsdH0ubWF0LXNvcnQtaGVhZGVyLWNvbnRlbnR7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcn0ubWF0LXNvcnQtaGVhZGVyLXBvc2l0aW9uLWJlZm9yZXtmbGV4LWRpcmVjdGlvbjpyb3ctcmV2ZXJzZX0ubWF0LXNvcnQtaGVhZGVyLWFycm93e2hlaWdodDoxMnB4O3dpZHRoOjEycHg7bWluLXdpZHRoOjEycHg7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpmbGV4O29wYWNpdHk6MH0ubWF0LXNvcnQtaGVhZGVyLWFycm93LFtkaXI9cnRsXSAubWF0LXNvcnQtaGVhZGVyLXBvc2l0aW9uLWJlZm9yZSAubWF0LXNvcnQtaGVhZGVyLWFycm93e21hcmdpbjowIDAgMCA2cHh9Lm1hdC1zb3J0LWhlYWRlci1wb3NpdGlvbi1iZWZvcmUgLm1hdC1zb3J0LWhlYWRlci1hcnJvdyxbZGlyPXJ0bF0gLm1hdC1zb3J0LWhlYWRlci1hcnJvd3ttYXJnaW46MCA2cHggMCAwfS5tYXQtc29ydC1oZWFkZXItc3RlbXtiYWNrZ3JvdW5kOmN1cnJlbnRDb2xvcjtoZWlnaHQ6MTBweDt3aWR0aDoycHg7bWFyZ2luOmF1dG87ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcn0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc29ydC1oZWFkZXItc3RlbXt3aWR0aDowO2JvcmRlci1sZWZ0OnNvbGlkIDJweH0ubWF0LXNvcnQtaGVhZGVyLWluZGljYXRvcnt3aWR0aDoxMDAlO2hlaWdodDoycHg7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjB9Lm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLW1pZGRsZXttYXJnaW46YXV0bztoZWlnaHQ6MnB4O3dpZHRoOjJweDtiYWNrZ3JvdW5kOmN1cnJlbnRDb2xvcjt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc29ydC1oZWFkZXItcG9pbnRlci1taWRkbGV7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXItdG9wOnNvbGlkIDJweDtib3JkZXItbGVmdDpzb2xpZCAycHh9Lm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLWxlZnQsLm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLXJpZ2h0e2JhY2tncm91bmQ6Y3VycmVudENvbG9yO3dpZHRoOjZweDtoZWlnaHQ6MnB4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDowfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLWxlZnQsLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNvcnQtaGVhZGVyLXBvaW50ZXItcmlnaHR7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXItbGVmdDpzb2xpZCA2cHg7Ym9yZGVyLXRvcDpzb2xpZCAycHh9Lm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLWxlZnR7dHJhbnNmb3JtLW9yaWdpbjpyaWdodDtsZWZ0OjB9Lm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLXJpZ2h0e3RyYW5zZm9ybS1vcmlnaW46bGVmdDtyaWdodDowfVxuIl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpsJH0se3R5cGU6VWd9LHt0eXBlOmEkLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOlsiTUFUX1NPUlRfSEVBREVSX0NPTFVNTl9ERUYiXX0se3R5cGU6U3J9XX0se3R5cGU6U0l9LHt0eXBlOmhnfV19KSx7YXJyb3dQb3NpdGlvbjpbe3R5cGU6eHl9XSxkaXNhYmxlQ2xlYXI6W3t0eXBlOnh5fV0saWQ6W3t0eXBlOnh5LGFyZ3M6WyJtYXQtc29ydC1oZWFkZXIiXX1dLHN0YXJ0Olt7dHlwZTp4eX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyB1JHt9dSQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHUkKX0sdSQuybVtb2Q9YW8oe3R5cGU6dSR9KSx1JC7JtWluaj12bih7cHJvdmlkZXJzOltjJF0saW1wb3J0czpbW1dNLFhJXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHUkLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbV00sWEldLGV4cG9ydHM6W2EkLG0kXSxkZWNsYXJhdGlvbnM6W2EkLG0kXSxwcm92aWRlcnM6W2MkXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKHUkLHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bYSQsbSRdfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1dNLFhJXX0sZXhwb3J0czpmdW5jdGlvbigpe3JldHVyblthJCxtJF19fSk7Y29uc3QgZiQ9W1tbImNhcHRpb24iXV0sW1siY29sZ3JvdXAiXSxbImNvbCJdXV07ZnVuY3Rpb24gZyQodCxlKXtpZigxJnQmJihSbSgwLCJ0aCIsMyksa3UoMSksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7ZHUoInRleHQtYWxpZ24iLHQuanVzdGlmeSkscmMoMSksRHUoIiAiLHQuaGVhZGVyVGV4dCwiICIpfX1mdW5jdGlvbiBoJCh0LGUpe2lmKDEmdCYmKFJtKDAsInRkIiw0KSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQsbj1ZbSgpO2R1KCJ0ZXh0LWFsaWduIixuLmp1c3RpZnkpLHJjKDEpLER1KCIgIixuLmRhdGFBY2Nlc3Nvcih0LG4ubmFtZSksIiAiKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2Z1bmN0aW9uIGIkKHQpe3JldHVybiBjbGFzcyBleHRlbmRzIHR7Y29uc3RydWN0b3IoLi4udCl7c3VwZXIoLi4udCksdGhpcy5fc3RpY2t5PSExLHRoaXMuX2hhc1N0aWNreUNoYW5nZWQ9ITF9Z2V0IHN0aWNreSgpe3JldHVybiB0aGlzLl9zdGlja3l9c2V0IHN0aWNreSh0KXtjb25zdCBlPXRoaXMuX3N0aWNreTt0aGlzLl9zdGlja3k9eXoodCksdGhpcy5faGFzU3RpY2t5Q2hhbmdlZD1lIT09dGhpcy5fc3RpY2t5fWhhc1N0aWNreUNoYW5nZWQoKXtjb25zdCB0PXRoaXMuX2hhc1N0aWNreUNoYW5nZWQ7cmV0dXJuIHRoaXMuX2hhc1N0aWNreUNoYW5nZWQ9ITEsdH1yZXNldFN0aWNreUNoYW5nZWQoKXt0aGlzLl9oYXNTdGlja3lDaGFuZ2VkPSExfX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL2NvbnN0IHkkPW5ldyBHYSgiQ0RLX1RBQkxFIiksXyQ9bmV3IEdhKCJ0ZXh0LWNvbHVtbi1vcHRpb25zIik7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBDJHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnRlbXBsYXRlPXR9fUMkLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxDJCkoU20oWGcpKX0sQyQuybVkaXI9bG8oe3R5cGU6QyQsc2VsZWN0b3JzOltbIiIsImNka0NlbGxEZWYiLCIiXV19KSxDJC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOlhnfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChDJCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbY2RrQ2VsbERlZl0ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6WGd9XX0pLG51bGwpO2NsYXNzIE0ke2NvbnN0cnVjdG9yKHQpe3RoaXMudGVtcGxhdGU9dH19TSQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fE0kKShTbShYZykpfSxNJC7JtWRpcj1sbyh7dHlwZTpNJCxzZWxlY3RvcnM6W1siIiwiY2RrSGVhZGVyQ2VsbERlZiIsIiJdXX0pLE0kLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6WGd9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKE0kLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IltjZGtIZWFkZXJDZWxsRGVmXSJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpYZ31dfSksbnVsbCk7Y2xhc3MgdiR7Y29uc3RydWN0b3IodCl7dGhpcy50ZW1wbGF0ZT10fX12JC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8diQpKFNtKFhnKSl9LHYkLsm1ZGlyPWxvKHt0eXBlOnYkLHNlbGVjdG9yczpbWyIiLCJjZGtGb290ZXJDZWxsRGVmIiwiIl1dfSksdiQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpYZ31dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodiQsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Nka0Zvb3RlckNlbGxEZWZdIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlhnfV19KSxudWxsKTtjb25zdCB4JD1iJChjbGFzc3t9KTtjbGFzcyBPJCBleHRlbmRzIHgke2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5fdGFibGU9dCx0aGlzLl9zdGlja3lFbmQ9ITF9Z2V0IG5hbWUoKXtyZXR1cm4gdGhpcy5fbmFtZX1zZXQgbmFtZSh0KXt0aGlzLl9zZXROYW1lSW5wdXQodCl9Z2V0IHN0aWNreUVuZCgpe3JldHVybiB0aGlzLl9zdGlja3lFbmR9c2V0IHN0aWNreUVuZCh0KXtjb25zdCBlPXRoaXMuX3N0aWNreUVuZDt0aGlzLl9zdGlja3lFbmQ9eXoodCksdGhpcy5faGFzU3RpY2t5Q2hhbmdlZD1lIT09dGhpcy5fc3RpY2t5RW5kfV91cGRhdGVDb2x1bW5Dc3NDbGFzc05hbWUoKXt0aGlzLl9jb2x1bW5Dc3NDbGFzc05hbWU9W2BjZGstY29sdW1uLSR7dGhpcy5jc3NDbGFzc0ZyaWVuZGx5TmFtZX1gXX1fc2V0TmFtZUlucHV0KHQpe3QmJih0aGlzLl9uYW1lPXQsdGhpcy5jc3NDbGFzc0ZyaWVuZGx5TmFtZT10LnJlcGxhY2UoL1teYS16MC05Xy1dL2dpLCItIiksdGhpcy5fdXBkYXRlQ29sdW1uQ3NzQ2xhc3NOYW1lKCkpfX1PJC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8TyQpKFNtKHkkLDgpKX0sTyQuybVkaXI9bG8oe3R5cGU6TyQsc2VsZWN0b3JzOltbIiIsImNka0NvbHVtbkRlZiIsIiJdXSxjb250ZW50UXVlcmllczpmdW5jdGlvbiB0KGUsbixvKXtpZigxJmUmJigkaChvLEMkLDUpLCRoKG8sTSQsNSksJGgobyx2JCw1KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5jZWxsPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLmhlYWRlckNlbGw9dC5maXJzdCksSmgodD10YigpKSYmKG4uZm9vdGVyQ2VsbD10LmZpcnN0KX19LGlucHV0czp7c3RpY2t5OiJzdGlja3kiLG5hbWU6WyJjZGtDb2x1bW5EZWYiLCJuYW1lIl0sc3RpY2t5RW5kOiJzdGlja3lFbmQifSxmZWF0dXJlczpbcGcoW3twcm92aWRlOiJNQVRfU09SVF9IRUFERVJfQ09MVU1OX0RFRiIsdXNlRXhpc3Rpbmc6TyR9XSkseHBdfSksTyQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbeSRdfSx7dHlwZTpTcn1dfV0sTyQucHJvcERlY29yYXRvcnM9e25hbWU6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb2x1bW5EZWYiXX1dLHN0aWNreUVuZDpbe3R5cGU6eHksYXJnczpbInN0aWNreUVuZCJdfV0sY2VsbDpbe3R5cGU6cWEsYXJnczpbQyRdfV0saGVhZGVyQ2VsbDpbe3R5cGU6cWEsYXJnczpbTSRdfV0sZm9vdGVyQ2VsbDpbe3R5cGU6cWEsYXJnczpbdiRdfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoTyQsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Nka0NvbHVtbkRlZl0iLGlucHV0czpbInN0aWNreSJdLHByb3ZpZGVyczpbe3Byb3ZpZGU6Ik1BVF9TT1JUX0hFQURFUl9DT0xVTU5fREVGIix1c2VFeGlzdGluZzpPJH1dfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3kkXX0se3R5cGU6U3J9XX1dfSkse25hbWU6W3t0eXBlOnh5LGFyZ3M6WyJjZGtDb2x1bW5EZWYiXX1dLHN0aWNreUVuZDpbe3R5cGU6eHksYXJnczpbInN0aWNreUVuZCJdfV0sY2VsbDpbe3R5cGU6cWEsYXJnczpbQyRdfV0saGVhZGVyQ2VsbDpbe3R5cGU6cWEsYXJnczpbTSRdfV0sZm9vdGVyQ2VsbDpbe3R5cGU6cWEsYXJnczpbdiRdfV19KTtjbGFzcyBQJHtjb25zdHJ1Y3Rvcih0LGUpe2NvbnN0IG49ZS5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdDtmb3IoY29uc3QgZSBvZiB0Ll9jb2x1bW5Dc3NDbGFzc05hbWUpbi5hZGQoZSl9fWNsYXNzIHckIGV4dGVuZHMgUCR7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpfX13JC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8dyQpKFNtKE8kKSxTbShoZykpfSx3JC7JtWRpcj1sbyh7dHlwZTp3JCxzZWxlY3RvcnM6W1siY2RrLWhlYWRlci1jZWxsIl0sWyJ0aCIsImNkay1oZWFkZXItY2VsbCIsIiJdXSxob3N0QXR0cnM6WyJyb2xlIiwiY29sdW1uaGVhZGVyIiwxLCJjZGstaGVhZGVyLWNlbGwiXSxmZWF0dXJlczpbeHBdfSksdyQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpPJH0se3R5cGU6aGd9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHckLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6ImNkay1oZWFkZXItY2VsbCwgdGhbY2RrLWhlYWRlci1jZWxsXSIsaG9zdDp7Y2xhc3M6ImNkay1oZWFkZXItY2VsbCIscm9sZToiY29sdW1uaGVhZGVyIn19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpPJH0se3R5cGU6aGd9XX0pLG51bGwpO2NsYXNzIGskIGV4dGVuZHMgUCR7Y29uc3RydWN0b3IodCxlKXt2YXIgbjtpZihzdXBlcih0LGUpLDE9PT0obnVsbD09PShuPXQuX3RhYmxlKXx8dm9pZCAwPT09bj92b2lkIDA6bi5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lm5vZGVUeXBlKSl7Y29uc3Qgbj10Ll90YWJsZS5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgicm9sZSIpO2UubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoInJvbGUiLCJncmlkIj09PW58fCJ0cmVlZ3JpZCI9PT1uPyJncmlkY2VsbCI6ImNlbGwiKX19fWskLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxrJCkoU20oTyQpLFNtKGhnKSl9LGskLsm1ZGlyPWxvKHt0eXBlOmskLHNlbGVjdG9yczpbWyJjZGstZm9vdGVyLWNlbGwiXSxbInRkIiwiY2RrLWZvb3Rlci1jZWxsIiwiIl1dLGhvc3RBdHRyczpbMSwiY2RrLWZvb3Rlci1jZWxsIl0sZmVhdHVyZXM6W3hwXX0pLGskLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6TyR9LHt0eXBlOmhnfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChrJCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJjZGstZm9vdGVyLWNlbGwsIHRkW2Nkay1mb290ZXItY2VsbF0iLGhvc3Q6e2NsYXNzOiJjZGstZm9vdGVyLWNlbGwifX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOk8kfSx7dHlwZTpoZ31dfSksbnVsbCk7Y2xhc3MgUyQgZXh0ZW5kcyBQJHtjb25zdHJ1Y3Rvcih0LGUpe3ZhciBuO2lmKHN1cGVyKHQsZSksMT09PShudWxsPT09KG49dC5fdGFibGUpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQubm9kZVR5cGUpKXtjb25zdCBuPXQuX3RhYmxlLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCJyb2xlIik7ZS5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgicm9sZSIsImdyaWQiPT09bnx8InRyZWVncmlkIj09PW4/ImdyaWRjZWxsIjoiY2VsbCIpfX19UyQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFMkKShTbShPJCksU20oaGcpKX0sUyQuybVkaXI9bG8oe3R5cGU6UyQsc2VsZWN0b3JzOltbImNkay1jZWxsIl0sWyJ0ZCIsImNkay1jZWxsIiwiIl1dLGhvc3RBdHRyczpbMSwiY2RrLWNlbGwiXSxmZWF0dXJlczpbeHBdfSksUyQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpPJH0se3R5cGU6aGd9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFMkLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6ImNkay1jZWxsLCB0ZFtjZGstY2VsbF0iLGhvc3Q6e2NsYXNzOiJjZGstY2VsbCJ9fV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6TyR9LHt0eXBlOmhnfV19KSxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIEQke2NvbnN0cnVjdG9yKCl7dGhpcy50YXNrcz1bXSx0aGlzLmVuZFRhc2tzPVtdfX1jb25zdCBFJD1uZXcgR2EoIl9DT0FMRVNDRURfU1RZTEVfU0NIRURVTEVSIik7Y2xhc3MgUiR7Y29uc3RydWN0b3IodCl7dGhpcy5fbmdab25lPXQsdGhpcy5fY3VycmVudFNjaGVkdWxlPW51bGwsdGhpcy5fZGVzdHJveWVkPW5ldyBJfXNjaGVkdWxlKHQpe3RoaXMuX2NyZWF0ZVNjaGVkdWxlSWZOZWVkZWQoKSx0aGlzLl9jdXJyZW50U2NoZWR1bGUudGFza3MucHVzaCh0KX1zY2hlZHVsZUVuZCh0KXt0aGlzLl9jcmVhdGVTY2hlZHVsZUlmTmVlZGVkKCksdGhpcy5fY3VycmVudFNjaGVkdWxlLmVuZFRhc2tzLnB1c2godCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9kZXN0cm95ZWQubmV4dCgpLHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpfV9jcmVhdGVTY2hlZHVsZUlmTmVlZGVkKCl7dGhpcy5fY3VycmVudFNjaGVkdWxlfHwodGhpcy5fY3VycmVudFNjaGVkdWxlPW5ldyBEJCx0aGlzLl9nZXRTY2hlZHVsZU9ic2VydmFibGUoKS5waXBlKEllKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoKCk9Pntmb3IoO3RoaXMuX2N1cnJlbnRTY2hlZHVsZS50YXNrcy5sZW5ndGh8fHRoaXMuX2N1cnJlbnRTY2hlZHVsZS5lbmRUYXNrcy5sZW5ndGg7KXtjb25zdCB0PXRoaXMuX2N1cnJlbnRTY2hlZHVsZTt0aGlzLl9jdXJyZW50U2NoZWR1bGU9bmV3IEQkO2Zvcihjb25zdCBlIG9mIHQudGFza3MpZSgpO2Zvcihjb25zdCBlIG9mIHQuZW5kVGFza3MpZSgpfXRoaXMuX2N1cnJlbnRTY2hlZHVsZT1udWxsfSkpKX1fZ2V0U2NoZWR1bGVPYnNlcnZhYmxlKCl7cmV0dXJuIHRoaXMuX25nWm9uZS5pc1N0YWJsZT9DdChQcm9taXNlLnJlc29sdmUodm9pZCAwKSk6dGhpcy5fbmdab25lLm9uU3RhYmxlLnBpcGUoYmUoMSkpfX1SJC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8UiQpKHZyKGFfKSl9LFIkLsm1cHJvdj1Nbih7dG9rZW46UiQsZmFjdG9yeTpSJC7JtWZhY30pLFIkLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6YV99XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFIkLFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTphX31dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBBJD0iPG5nLWNvbnRhaW5lciBjZGtDZWxsT3V0bGV0PjwvbmctY29udGFpbmVyPiI7Y2xhc3MgVCR7Y29uc3RydWN0b3IodCxlKXt0aGlzLnRlbXBsYXRlPXQsdGhpcy5fZGlmZmVycz1lfW5nT25DaGFuZ2VzKHQpe2lmKCF0aGlzLl9jb2x1bW5zRGlmZmVyKXtjb25zdCBlPXQuY29sdW1ucyYmdC5jb2x1bW5zLmN1cnJlbnRWYWx1ZXx8W107dGhpcy5fY29sdW1uc0RpZmZlcj10aGlzLl9kaWZmZXJzLmZpbmQoZSkuY3JlYXRlKCksdGhpcy5fY29sdW1uc0RpZmZlci5kaWZmKGUpfX1nZXRDb2x1bW5zRGlmZigpe3JldHVybiB0aGlzLl9jb2x1bW5zRGlmZmVyLmRpZmYodGhpcy5jb2x1bW5zKX1leHRyYWN0Q2VsbFRlbXBsYXRlKHQpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgeiQ/dC5oZWFkZXJDZWxsLnRlbXBsYXRlOnRoaXMgaW5zdGFuY2VvZiBIJD90LmZvb3RlckNlbGwudGVtcGxhdGU6dC5jZWxsLnRlbXBsYXRlfX1UJC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VCQpKFNtKFhnKSxTbShIZykpfSxUJC7JtWRpcj1sbyh7dHlwZTpUJCxmZWF0dXJlczpbQm9dfSksVCQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpYZ30se3R5cGU6SGd9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFQkLFt7dHlwZTpDeX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpYZ30se3R5cGU6SGd9XX0pLG51bGwpO2NvbnN0IE4kPWIkKGNsYXNzIGV4dGVuZHMgVCR7fSk7Y2xhc3MgeiQgZXh0ZW5kcyBOJHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodCxlKSx0aGlzLl90YWJsZT1ufW5nT25DaGFuZ2VzKHQpe3N1cGVyLm5nT25DaGFuZ2VzKHQpfX16JC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8eiQpKFNtKFhnKSxTbShIZyksU20oeSQsOCkpfSx6JC7JtWRpcj1sbyh7dHlwZTp6JCxzZWxlY3RvcnM6W1siIiwiY2RrSGVhZGVyUm93RGVmIiwiIl1dLGlucHV0czp7Y29sdW1uczpbImNka0hlYWRlclJvd0RlZiIsImNvbHVtbnMiXSxzdGlja3k6WyJjZGtIZWFkZXJSb3dEZWZTdGlja3kiLCJzdGlja3kiXX0sZmVhdHVyZXM6W3hwLEJvXX0pLHokLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6WGd9LHt0eXBlOkhnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbeSRdfSx7dHlwZTpTcn1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh6JCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbY2RrSGVhZGVyUm93RGVmXSIsaW5wdXRzOlsiY29sdW1uczogY2RrSGVhZGVyUm93RGVmIiwic3RpY2t5OiBjZGtIZWFkZXJSb3dEZWZTdGlja3kiXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlhnfSx7dHlwZTpIZ30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3kkXX0se3R5cGU6U3J9XX1dfSksbnVsbCk7Y29uc3QgSSQ9YiQoY2xhc3MgZXh0ZW5kcyBUJHt9KTtjbGFzcyBIJCBleHRlbmRzIEkke2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcih0LGUpLHRoaXMuX3RhYmxlPW59bmdPbkNoYW5nZXModCl7c3VwZXIubmdPbkNoYW5nZXModCl9fUgkLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxIJCkoU20oWGcpLFNtKEhnKSxTbSh5JCw4KSl9LEgkLsm1ZGlyPWxvKHt0eXBlOkgkLHNlbGVjdG9yczpbWyIiLCJjZGtGb290ZXJSb3dEZWYiLCIiXV0saW5wdXRzOntjb2x1bW5zOlsiY2RrRm9vdGVyUm93RGVmIiwiY29sdW1ucyJdLHN0aWNreTpbImNka0Zvb3RlclJvd0RlZlN0aWNreSIsInN0aWNreSJdfSxmZWF0dXJlczpbeHAsQm9dfSksSCQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpYZ30se3R5cGU6SGd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOlt5JF19LHt0eXBlOlNyfV19XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEgkLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IltjZGtGb290ZXJSb3dEZWZdIixpbnB1dHM6WyJjb2x1bW5zOiBjZGtGb290ZXJSb3dEZWYiLCJzdGlja3k6IGNka0Zvb3RlclJvd0RlZlN0aWNreSJdfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6WGd9LHt0eXBlOkhnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbeSRdfSx7dHlwZTpTcn1dfV19KSxudWxsKTtjbGFzcyBGJCBleHRlbmRzIFQke2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcih0LGUpLHRoaXMuX3RhYmxlPW59fUYkLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxGJCkoU20oWGcpLFNtKEhnKSxTbSh5JCw4KSl9LEYkLsm1ZGlyPWxvKHt0eXBlOkYkLHNlbGVjdG9yczpbWyIiLCJjZGtSb3dEZWYiLCIiXV0saW5wdXRzOntjb2x1bW5zOlsiY2RrUm93RGVmQ29sdW1ucyIsImNvbHVtbnMiXSx3aGVuOlsiY2RrUm93RGVmV2hlbiIsIndoZW4iXX0sZmVhdHVyZXM6W3hwXX0pLEYkLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6WGd9LHt0eXBlOkhnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbeSRdfSx7dHlwZTpTcn1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChGJCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbY2RrUm93RGVmXSIsaW5wdXRzOlsiY29sdW1uczogY2RrUm93RGVmQ29sdW1ucyIsIndoZW46IGNka1Jvd0RlZldoZW4iXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlhnfSx7dHlwZTpIZ30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3kkXX0se3R5cGU6U3J9XX1dfSksbnVsbCk7Y2xhc3MgTCR7Y29uc3RydWN0b3IodCl7dGhpcy5fdmlld0NvbnRhaW5lcj10LEwkLm1vc3RSZWNlbnRDZWxsT3V0bGV0PXRoaXN9bmdPbkRlc3Ryb3koKXtMJC5tb3N0UmVjZW50Q2VsbE91dGxldD09PXRoaXMmJihMJC5tb3N0UmVjZW50Q2VsbE91dGxldD1udWxsKX19TCQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEwkKShTbShlaCkpfSxMJC7JtWRpcj1sbyh7dHlwZTpMJCxzZWxlY3RvcnM6W1siIiwiY2RrQ2VsbE91dGxldCIsIiJdXX0pLEwkLm1vc3RSZWNlbnRDZWxsT3V0bGV0PW51bGwsTCQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTplaH1dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoTCQsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2Nka0NlbGxPdXRsZXRdIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmVofV19KSxudWxsKTtjbGFzcyBCJHt9QiQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEIkKX0sQiQuybVjbXA9dG8oe3R5cGU6QiQsc2VsZWN0b3JzOltbImNkay1oZWFkZXItcm93Il0sWyJ0ciIsImNkay1oZWFkZXItcm93IiwiIl1dLGhvc3RBdHRyczpbInJvbGUiLCJyb3ciLDEsImNkay1oZWFkZXItcm93Il0sZGVjbHM6MSx2YXJzOjAsY29uc3RzOltbImNka0NlbGxPdXRsZXQiLCIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmSW0oMCwwKX0sZGlyZWN0aXZlczpbTCRdLGVuY2Fwc3VsYXRpb246Mn0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQiQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiY2RrLWhlYWRlci1yb3csIHRyW2Nkay1oZWFkZXItcm93XSIsdGVtcGxhdGU6QSQsaG9zdDp7Y2xhc3M6ImNkay1oZWFkZXItcm93Iixyb2xlOiJyb3cifSxjaGFuZ2VEZXRlY3Rpb246em4uRGVmYXVsdCxlbmNhcHN1bGF0aW9uOkhuLk5vbmV9XX1dLG51bGwsbnVsbCk7Y2xhc3MgViR7fVYkLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxWJCl9LFYkLsm1Y21wPXRvKHt0eXBlOlYkLHNlbGVjdG9yczpbWyJjZGstZm9vdGVyLXJvdyJdLFsidHIiLCJjZGstZm9vdGVyLXJvdyIsIiJdXSxob3N0QXR0cnM6WyJyb2xlIiwicm93IiwxLCJjZGstZm9vdGVyLXJvdyJdLGRlY2xzOjEsdmFyczowLGNvbnN0czpbWyJjZGtDZWxsT3V0bGV0IiwiIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJkltKDAsMCl9LGRpcmVjdGl2ZXM6W0wkXSxlbmNhcHN1bGF0aW9uOjJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFYkLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImNkay1mb290ZXItcm93LCB0cltjZGstZm9vdGVyLXJvd10iLHRlbXBsYXRlOkEkLGhvc3Q6e2NsYXNzOiJjZGstZm9vdGVyLXJvdyIscm9sZToicm93In0sY2hhbmdlRGV0ZWN0aW9uOnpuLkRlZmF1bHQsZW5jYXBzdWxhdGlvbjpIbi5Ob25lfV19XSxudWxsLG51bGwpO2NsYXNzIGoke31qJC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8aiQpfSxqJC7JtWNtcD10byh7dHlwZTpqJCxzZWxlY3RvcnM6W1siY2RrLXJvdyJdLFsidHIiLCJjZGstcm93IiwiIl1dLGhvc3RBdHRyczpbInJvbGUiLCJyb3ciLDEsImNkay1yb3ciXSxkZWNsczoxLHZhcnM6MCxjb25zdHM6W1siY2RrQ2VsbE91dGxldCIsIiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiZJbSgwLDApfSxkaXJlY3RpdmVzOltMJF0sZW5jYXBzdWxhdGlvbjoyfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChqJCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJjZGstcm93LCB0cltjZGstcm93XSIsdGVtcGxhdGU6QSQsaG9zdDp7Y2xhc3M6ImNkay1yb3ciLHJvbGU6InJvdyJ9LGNoYW5nZURldGVjdGlvbjp6bi5EZWZhdWx0LGVuY2Fwc3VsYXRpb246SG4uTm9uZX1dfV0sbnVsbCxudWxsKTtjbGFzcyBVJHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnRlbXBsYXRlUmVmPXR9fVUkLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxVJCkoU20oWGcpKX0sVSQuybVkaXI9bG8oe3R5cGU6VSQsc2VsZWN0b3JzOltbIm5nLXRlbXBsYXRlIiwiY2RrTm9EYXRhUm93IiwiIl1dfSksVSQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpYZ31dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoVSQsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoibmctdGVtcGxhdGVbY2RrTm9EYXRhUm93XSJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpYZ31dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBHJD1bInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCJdO2NsYXNzIFcke2NvbnN0cnVjdG9yKHQsZSxuLG8saT0hMCxhPSEwLHIpe3RoaXMuX2lzTmF0aXZlSHRtbFRhYmxlPXQsdGhpcy5fc3RpY2tDZWxsQ3NzPWUsdGhpcy5kaXJlY3Rpb249bix0aGlzLl9jb2FsZXNjZWRTdHlsZVNjaGVkdWxlcj1vLHRoaXMuX2lzQnJvd3Nlcj1pLHRoaXMuX25lZWRzUG9zaXRpb25TdGlja3lPbkVsZW1lbnQ9YSx0aGlzLl9wb3NpdGlvbkxpc3RlbmVyPXIsdGhpcy5fY2FjaGVkQ2VsbFdpZHRocz1bXSx0aGlzLl9ib3JkZXJDZWxsQ3NzPXt0b3A6YCR7ZX0tYm9yZGVyLWVsZW0tdG9wYCxib3R0b206YCR7ZX0tYm9yZGVyLWVsZW0tYm90dG9tYCxsZWZ0OmAke2V9LWJvcmRlci1lbGVtLWxlZnRgLHJpZ2h0OmAke2V9LWJvcmRlci1lbGVtLXJpZ2h0YH19Y2xlYXJTdGlja3lQb3NpdGlvbmluZyh0LGUpe2NvbnN0IG49W107Zm9yKGNvbnN0IGUgb2YgdClpZihlLm5vZGVUeXBlPT09ZS5FTEVNRU5UX05PREUpe24ucHVzaChlKTtmb3IobGV0IHQ9MDt0PGUuY2hpbGRyZW4ubGVuZ3RoO3QrKyluLnB1c2goZS5jaGlsZHJlblt0XSl9dGhpcy5fY29hbGVzY2VkU3R5bGVTY2hlZHVsZXIuc2NoZWR1bGUoKCgpPT57Zm9yKGNvbnN0IHQgb2Ygbil0aGlzLl9yZW1vdmVTdGlja3lTdHlsZSh0LGUpfSkpfXVwZGF0ZVN0aWNreUNvbHVtbnModCxlLG4sbz0hMCl7aWYoIXQubGVuZ3RofHwhdGhpcy5faXNCcm93c2VyfHwhZS5zb21lKCh0PT50KSkmJiFuLnNvbWUoKHQ9PnQpKSlyZXR1cm4gdm9pZCh0aGlzLl9wb3NpdGlvbkxpc3RlbmVyJiYodGhpcy5fcG9zaXRpb25MaXN0ZW5lci5zdGlja3lDb2x1bW5zVXBkYXRlZCh7c2l6ZXM6W119KSx0aGlzLl9wb3NpdGlvbkxpc3RlbmVyLnN0aWNreUVuZENvbHVtbnNVcGRhdGVkKHtzaXplczpbXX0pKSk7Y29uc3QgaT10WzBdLGE9aS5jaGlsZHJlbi5sZW5ndGgscj10aGlzLl9nZXRDZWxsV2lkdGhzKGksbykscz10aGlzLl9nZXRTdGlja3lTdGFydENvbHVtblBvc2l0aW9ucyhyLGUpLGw9dGhpcy5fZ2V0U3RpY2t5RW5kQ29sdW1uUG9zaXRpb25zKHIsbiksYz1lLmxhc3RJbmRleE9mKCEwKSxkPW4uaW5kZXhPZighMCk7dGhpcy5fY29hbGVzY2VkU3R5bGVTY2hlZHVsZXIuc2NoZWR1bGUoKCgpPT57Y29uc3Qgbz0icnRsIj09PXRoaXMuZGlyZWN0aW9uLGk9bz8icmlnaHQiOiJsZWZ0IixwPW8/ImxlZnQiOiJyaWdodCI7Zm9yKGNvbnN0IG8gb2YgdClmb3IobGV0IHQ9MDt0PGE7dCsrKXtjb25zdCBhPW8uY2hpbGRyZW5bdF07ZVt0XSYmdGhpcy5fYWRkU3RpY2t5U3R5bGUoYSxpLHNbdF0sdD09PWMpLG5bdF0mJnRoaXMuX2FkZFN0aWNreVN0eWxlKGEscCxsW3RdLHQ9PT1kKX10aGlzLl9wb3NpdGlvbkxpc3RlbmVyJiYodGhpcy5fcG9zaXRpb25MaXN0ZW5lci5zdGlja3lDb2x1bW5zVXBkYXRlZCh7c2l6ZXM6LTE9PT1jP1tdOnIuc2xpY2UoMCxjKzEpLm1hcCgoKHQsbik9PmVbbl0/dDpudWxsKSl9KSx0aGlzLl9wb3NpdGlvbkxpc3RlbmVyLnN0aWNreUVuZENvbHVtbnNVcGRhdGVkKHtzaXplczotMT09PWQ/W106ci5zbGljZShkKS5tYXAoKCh0LGUpPT5uW2UrZF0/dDpudWxsKSkucmV2ZXJzZSgpfSkpfSkpfXN0aWNrUm93cyh0LGUsbil7aWYoIXRoaXMuX2lzQnJvd3NlcilyZXR1cm47Y29uc3Qgbz0iYm90dG9tIj09PW4/dC5zbGljZSgpLnJldmVyc2UoKTp0LGk9ImJvdHRvbSI9PT1uP2Uuc2xpY2UoKS5yZXZlcnNlKCk6ZSxhPVtdLHI9W10scz1bXTtmb3IobGV0IHQ9MCxlPTA7dDxvLmxlbmd0aDt0Kyspe2lmKCFpW3RdKWNvbnRpbnVlO2FbdF09ZTtjb25zdCBuPW9bdF07c1t0XT10aGlzLl9pc05hdGl2ZUh0bWxUYWJsZT9BcnJheS5mcm9tKG4uY2hpbGRyZW4pOltuXTtjb25zdCBsPW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O2UrPWwsclt0XT1sfWNvbnN0IGw9aS5sYXN0SW5kZXhPZighMCk7dGhpcy5fY29hbGVzY2VkU3R5bGVTY2hlZHVsZXIuc2NoZWR1bGUoKCgpPT57dmFyIHQsZTtmb3IobGV0IHQ9MDt0PG8ubGVuZ3RoO3QrKyl7aWYoIWlbdF0pY29udGludWU7Y29uc3QgZT1hW3RdLG89dD09PWw7Zm9yKGNvbnN0IGkgb2Ygc1t0XSl0aGlzLl9hZGRTdGlja3lTdHlsZShpLG4sZSxvKX0idG9wIj09PW4/bnVsbD09PSh0PXRoaXMuX3Bvc2l0aW9uTGlzdGVuZXIpfHx2b2lkIDA9PT10fHx0LnN0aWNreUhlYWRlclJvd3NVcGRhdGVkKHtzaXplczpyLG9mZnNldHM6YSxlbGVtZW50czpzfSk6bnVsbD09PShlPXRoaXMuX3Bvc2l0aW9uTGlzdGVuZXIpfHx2b2lkIDA9PT1lfHxlLnN0aWNreUZvb3RlclJvd3NVcGRhdGVkKHtzaXplczpyLG9mZnNldHM6YSxlbGVtZW50czpzfSl9KSl9dXBkYXRlU3RpY2t5Rm9vdGVyQ29udGFpbmVyKHQsZSl7aWYoIXRoaXMuX2lzTmF0aXZlSHRtbFRhYmxlKXJldHVybjtjb25zdCBuPXQucXVlcnlTZWxlY3RvcigidGZvb3QiKTt0aGlzLl9jb2FsZXNjZWRTdHlsZVNjaGVkdWxlci5zY2hlZHVsZSgoKCk9PntlLnNvbWUoKHQ9PiF0KSk/dGhpcy5fcmVtb3ZlU3RpY2t5U3R5bGUobixbImJvdHRvbSJdKTp0aGlzLl9hZGRTdGlja3lTdHlsZShuLCJib3R0b20iLDAsITEpfSkpfV9yZW1vdmVTdGlja3lTdHlsZSh0LGUpe2Zvcihjb25zdCBuIG9mIGUpdC5zdHlsZVtuXT0iIix0LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fYm9yZGVyQ2VsbENzc1tuXSk7RyQuc29tZSgobj0+LTE9PT1lLmluZGV4T2YobikmJnQuc3R5bGVbbl0pKT90LnN0eWxlLnpJbmRleD10aGlzLl9nZXRDYWxjdWxhdGVkWkluZGV4KHQpOih0LnN0eWxlLnpJbmRleD0iIix0aGlzLl9uZWVkc1Bvc2l0aW9uU3RpY2t5T25FbGVtZW50JiYodC5zdHlsZS5wb3NpdGlvbj0iIiksdC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX3N0aWNrQ2VsbENzcykpfV9hZGRTdGlja3lTdHlsZSh0LGUsbixvKXt0LmNsYXNzTGlzdC5hZGQodGhpcy5fc3RpY2tDZWxsQ3NzKSxvJiZ0LmNsYXNzTGlzdC5hZGQodGhpcy5fYm9yZGVyQ2VsbENzc1tlXSksdC5zdHlsZVtlXT1gJHtufXB4YCx0LnN0eWxlLnpJbmRleD10aGlzLl9nZXRDYWxjdWxhdGVkWkluZGV4KHQpLHRoaXMuX25lZWRzUG9zaXRpb25TdGlja3lPbkVsZW1lbnQmJih0LnN0eWxlLmNzc1RleHQrPSJwb3NpdGlvbjogLXdlYmtpdC1zdGlja3k7IHBvc2l0aW9uOiBzdGlja3k7ICIpfV9nZXRDYWxjdWxhdGVkWkluZGV4KHQpe2NvbnN0IGU9e3RvcDoxMDAsYm90dG9tOjEwLGxlZnQ6MSxyaWdodDoxfTtsZXQgbj0wO2Zvcihjb25zdCBvIG9mIEckKXQuc3R5bGVbb10mJihuKz1lW29dKTtyZXR1cm4gbj9gJHtufWA6IiJ9X2dldENlbGxXaWR0aHModCxlPSEwKXtpZighZSYmdGhpcy5fY2FjaGVkQ2VsbFdpZHRocy5sZW5ndGgpcmV0dXJuIHRoaXMuX2NhY2hlZENlbGxXaWR0aHM7Y29uc3Qgbj1bXSxvPXQuY2hpbGRyZW47Zm9yKGxldCB0PTA7dDxvLmxlbmd0aDt0Kyspbi5wdXNoKG9bdF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpO3JldHVybiB0aGlzLl9jYWNoZWRDZWxsV2lkdGhzPW4sbn1fZ2V0U3RpY2t5U3RhcnRDb2x1bW5Qb3NpdGlvbnModCxlKXtjb25zdCBuPVtdO2xldCBvPTA7Zm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspZVtpXSYmKG5baV09byxvKz10W2ldKTtyZXR1cm4gbn1fZ2V0U3RpY2t5RW5kQ29sdW1uUG9zaXRpb25zKHQsZSl7Y29uc3Qgbj1bXTtsZXQgbz0wO2ZvcihsZXQgaT10Lmxlbmd0aDtpPjA7aS0tKWVbaV0mJihuW2ldPW8sbys9dFtpXSk7cmV0dXJuIG59fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9mdW5jdGlvbiBZJCh0KXtyZXR1cm4gRXJyb3IoYENvdWxkIG5vdCBmaW5kIGNvbHVtbiB3aXRoIGlkICIke3R9Ii5gKX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNvbnN0IHEkPW5ldyBHYSgiQ0RLX1NQTCIpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi9jbGFzcyBaJHt9WiQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFokKX0sWiQuybVkaXI9bG8oe3R5cGU6WiQsc2VsZWN0b3JzOltbImNkay10YWJsZSIsInJlY3ljbGVSb3dzIiwiIl0sWyJ0YWJsZSIsImNkay10YWJsZSIsIiIsInJlY3ljbGVSb3dzIiwiIl1dLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6YUYsdXNlQ2xhc3M6bkZ9XSldfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChaJCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJjZGstdGFibGVbcmVjeWNsZVJvd3NdLCB0YWJsZVtjZGstdGFibGVdW3JlY3ljbGVSb3dzXSIscHJvdmlkZXJzOlt7cHJvdmlkZTphRix1c2VDbGFzczpuRn1dfV19XSxudWxsLG51bGwpO2NsYXNzIFgke2NvbnN0cnVjdG9yKHQsZSl7dGhpcy52aWV3Q29udGFpbmVyPXQsdGhpcy5lbGVtZW50UmVmPWV9fVgkLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxYJCkoU20oZWgpLFNtKGhnKSl9LFgkLsm1ZGlyPWxvKHt0eXBlOlgkLHNlbGVjdG9yczpbWyIiLCJyb3dPdXRsZXQiLCIiXV19KSxYJC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmVofSx7dHlwZTpoZ31dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWCQsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW3Jvd091dGxldF0ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6ZWh9LHt0eXBlOmhnfV19KSxudWxsKTtjbGFzcyBLJHtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMudmlld0NvbnRhaW5lcj10LHRoaXMuZWxlbWVudFJlZj1lfX1LJC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SyQpKFNtKGVoKSxTbShoZykpfSxLJC7JtWRpcj1sbyh7dHlwZTpLJCxzZWxlY3RvcnM6W1siIiwiaGVhZGVyUm93T3V0bGV0IiwiIl1dfSksSyQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTplaH0se3R5cGU6aGd9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEskLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IltoZWFkZXJSb3dPdXRsZXRdIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmVofSx7dHlwZTpoZ31dfSksbnVsbCk7Y2xhc3MgSiR7Y29uc3RydWN0b3IodCxlKXt0aGlzLnZpZXdDb250YWluZXI9dCx0aGlzLmVsZW1lbnRSZWY9ZX19SiQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEokKShTbShlaCksU20oaGcpKX0sSiQuybVkaXI9bG8oe3R5cGU6SiQsc2VsZWN0b3JzOltbIiIsImZvb3RlclJvd091dGxldCIsIiJdXX0pLEokLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6ZWh9LHt0eXBlOmhnfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChKJCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbZm9vdGVyUm93T3V0bGV0XSJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTplaH0se3R5cGU6aGd9XX0pLG51bGwpO2NsYXNzIFEke2NvbnN0cnVjdG9yKHQsZSl7dGhpcy52aWV3Q29udGFpbmVyPXQsdGhpcy5lbGVtZW50UmVmPWV9fVEkLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxRJCkoU20oZWgpLFNtKGhnKSl9LFEkLsm1ZGlyPWxvKHt0eXBlOlEkLHNlbGVjdG9yczpbWyIiLCJub0RhdGFSb3dPdXRsZXQiLCIiXV19KSxRJC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmVofSx7dHlwZTpoZ31dLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUSQsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW25vRGF0YVJvd091dGxldF0ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6ZWh9LHt0eXBlOmhnfV19KSxudWxsKTtjb25zdCAkJD0nXG4gIDxuZy1jb250ZW50IHNlbGVjdD0iY2FwdGlvbiI+PC9uZy1jb250ZW50PlxuICA8bmctY29udGVudCBzZWxlY3Q9ImNvbGdyb3VwLCBjb2wiPjwvbmctY29udGVudD5cbiAgPG5nLWNvbnRhaW5lciBoZWFkZXJSb3dPdXRsZXQ+PC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgcm93T3V0bGV0PjwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyIG5vRGF0YVJvd091dGxldD48L25nLWNvbnRhaW5lcj5cbiAgPG5nLWNvbnRhaW5lciBmb290ZXJSb3dPdXRsZXQ+PC9uZy1jb250YWluZXI+XG4nO2NsYXNzIHQwe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIscyxsLGMsZCl7dGhpcy5fZGlmZmVycz10LHRoaXMuX2NoYW5nZURldGVjdG9yUmVmPWUsdGhpcy5fZWxlbWVudFJlZj1uLHRoaXMuX2Rpcj1pLHRoaXMuX3BsYXRmb3JtPXIsdGhpcy5fdmlld1JlcGVhdGVyPXMsdGhpcy5fY29hbGVzY2VkU3R5bGVTY2hlZHVsZXI9bCx0aGlzLl92aWV3cG9ydFJ1bGVyPWMsdGhpcy5fc3RpY2t5UG9zaXRpb25pbmdMaXN0ZW5lcj1kLHRoaXMuX29uRGVzdHJveT1uZXcgSSx0aGlzLl9jb2x1bW5EZWZzQnlOYW1lPW5ldyBNYXAsdGhpcy5fY3VzdG9tQ29sdW1uRGVmcz1uZXcgU2V0LHRoaXMuX2N1c3RvbVJvd0RlZnM9bmV3IFNldCx0aGlzLl9jdXN0b21IZWFkZXJSb3dEZWZzPW5ldyBTZXQsdGhpcy5fY3VzdG9tRm9vdGVyUm93RGVmcz1uZXcgU2V0LHRoaXMuX2hlYWRlclJvd0RlZkNoYW5nZWQ9ITAsdGhpcy5fZm9vdGVyUm93RGVmQ2hhbmdlZD0hMCx0aGlzLl9zdGlja3lDb2x1bW5TdHlsZXNOZWVkUmVzZXQ9ITAsdGhpcy5fZm9yY2VSZWNhbGN1bGF0ZUNlbGxXaWR0aHM9ITAsdGhpcy5fY2FjaGVkUmVuZGVyUm93c01hcD1uZXcgTWFwLHRoaXMuc3RpY2t5Q3NzQ2xhc3M9ImNkay10YWJsZS1zdGlja3kiLHRoaXMubmVlZHNQb3NpdGlvblN0aWNreU9uRWxlbWVudD0hMCx0aGlzLl9pc1Nob3dpbmdOb0RhdGFSb3c9ITEsdGhpcy5fbXVsdGlUZW1wbGF0ZURhdGFSb3dzPSExLHRoaXMuX2ZpeGVkTGF5b3V0PSExLHRoaXMuY29udGVudENoYW5nZWQ9bmV3IExoLHRoaXMudmlld0NoYW5nZT1uZXcgRih7c3RhcnQ6MCxlbmQ6TnVtYmVyLk1BWF9WQUxVRX0pLG98fHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoInJvbGUiLCJ0YWJsZSIpLHRoaXMuX2RvY3VtZW50PWEsdGhpcy5faXNOYXRpdmVIdG1sVGFibGU9IlRBQkxFIj09PXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5ub2RlTmFtZX1nZXQgdHJhY2tCeSgpe3JldHVybiB0aGlzLl90cmFja0J5Rm59c2V0IHRyYWNrQnkodCl7InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0Rldk1vZGUmJiFuZ0Rldk1vZGV8fG51bGw9PXR8fCJmdW5jdGlvbiI9PXR5cGVvZiB0fHxjb25zb2xlLndhcm4oYHRyYWNrQnkgbXVzdCBiZSBhIGZ1bmN0aW9uLCBidXQgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeSh0KX0uYCksdGhpcy5fdHJhY2tCeUZuPXR9Z2V0IGRhdGFTb3VyY2UoKXtyZXR1cm4gdGhpcy5fZGF0YVNvdXJjZX1zZXQgZGF0YVNvdXJjZSh0KXt0aGlzLl9kYXRhU291cmNlIT09dCYmdGhpcy5fc3dpdGNoRGF0YVNvdXJjZSh0KX1nZXQgbXVsdGlUZW1wbGF0ZURhdGFSb3dzKCl7cmV0dXJuIHRoaXMuX211bHRpVGVtcGxhdGVEYXRhUm93c31zZXQgbXVsdGlUZW1wbGF0ZURhdGFSb3dzKHQpe3RoaXMuX211bHRpVGVtcGxhdGVEYXRhUm93cz15eih0KSx0aGlzLl9yb3dPdXRsZXQmJnRoaXMuX3Jvd091dGxldC52aWV3Q29udGFpbmVyLmxlbmd0aCYmKHRoaXMuX2ZvcmNlUmVuZGVyRGF0YVJvd3MoKSx0aGlzLnVwZGF0ZVN0aWNreUNvbHVtblN0eWxlcygpKX1nZXQgZml4ZWRMYXlvdXQoKXtyZXR1cm4gdGhpcy5fZml4ZWRMYXlvdXR9c2V0IGZpeGVkTGF5b3V0KHQpe3RoaXMuX2ZpeGVkTGF5b3V0PXl6KHQpLHRoaXMuX2ZvcmNlUmVjYWxjdWxhdGVDZWxsV2lkdGhzPSEwLHRoaXMuX3N0aWNreUNvbHVtblN0eWxlc05lZWRSZXNldD0hMH1uZ09uSW5pdCgpe3RoaXMuX3NldHVwU3RpY2t5U3R5bGVyKCksdGhpcy5faXNOYXRpdmVIdG1sVGFibGUmJnRoaXMuX2FwcGx5TmF0aXZlVGFibGVTZWN0aW9ucygpLHRoaXMuX2RhdGFEaWZmZXI9dGhpcy5fZGlmZmVycy5maW5kKFtdKS5jcmVhdGUoKCh0LGUpPT50aGlzLnRyYWNrQnk/dGhpcy50cmFja0J5KGUuZGF0YUluZGV4LGUuZGF0YSk6ZSkpLHRoaXMuX3ZpZXdwb3J0UnVsZXIuY2hhbmdlKCkucGlwZShJZSh0aGlzLl9vbkRlc3Ryb3kpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fZm9yY2VSZWNhbGN1bGF0ZUNlbGxXaWR0aHM9ITB9KSl9bmdBZnRlckNvbnRlbnRDaGVja2VkKCl7aWYodGhpcy5fY2FjaGVSb3dEZWZzKCksdGhpcy5fY2FjaGVDb2x1bW5EZWZzKCksIXRoaXMuX2hlYWRlclJvd0RlZnMubGVuZ3RoJiYhdGhpcy5fZm9vdGVyUm93RGVmcy5sZW5ndGgmJiF0aGlzLl9yb3dEZWZzLmxlbmd0aCYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93KGZ1bmN0aW9uIHQoKXtyZXR1cm4gRXJyb3IoIk1pc3NpbmcgZGVmaW5pdGlvbnMgZm9yIGhlYWRlciwgZm9vdGVyLCBhbmQgcm93OyBjYW5ub3QgZGV0ZXJtaW5lIHdoaWNoIGNvbHVtbnMgc2hvdWxkIGJlIHJlbmRlcmVkLiIpfSkoKTtjb25zdCBlPXRoaXMuX3JlbmRlclVwZGF0ZWRDb2x1bW5zKCl8fHRoaXMuX2hlYWRlclJvd0RlZkNoYW5nZWR8fHRoaXMuX2Zvb3RlclJvd0RlZkNoYW5nZWQ7dGhpcy5fc3RpY2t5Q29sdW1uU3R5bGVzTmVlZFJlc2V0PXRoaXMuX3N0aWNreUNvbHVtblN0eWxlc05lZWRSZXNldHx8ZSx0aGlzLl9mb3JjZVJlY2FsY3VsYXRlQ2VsbFdpZHRocz1lLHRoaXMuX2hlYWRlclJvd0RlZkNoYW5nZWQmJih0aGlzLl9mb3JjZVJlbmRlckhlYWRlclJvd3MoKSx0aGlzLl9oZWFkZXJSb3dEZWZDaGFuZ2VkPSExKSx0aGlzLl9mb290ZXJSb3dEZWZDaGFuZ2VkJiYodGhpcy5fZm9yY2VSZW5kZXJGb290ZXJSb3dzKCksdGhpcy5fZm9vdGVyUm93RGVmQ2hhbmdlZD0hMSksdGhpcy5kYXRhU291cmNlJiZ0aGlzLl9yb3dEZWZzLmxlbmd0aD4wJiYhdGhpcy5fcmVuZGVyQ2hhbmdlU3Vic2NyaXB0aW9uP3RoaXMuX29ic2VydmVSZW5kZXJDaGFuZ2VzKCk6dGhpcy5fc3RpY2t5Q29sdW1uU3R5bGVzTmVlZFJlc2V0JiZ0aGlzLnVwZGF0ZVN0aWNreUNvbHVtblN0eWxlcygpLHRoaXMuX2NoZWNrU3RpY2t5U3RhdGVzKCl9bmdPbkRlc3Ryb3koKXt0aGlzLl9yb3dPdXRsZXQudmlld0NvbnRhaW5lci5jbGVhcigpLHRoaXMuX25vRGF0YVJvd091dGxldC52aWV3Q29udGFpbmVyLmNsZWFyKCksdGhpcy5faGVhZGVyUm93T3V0bGV0LnZpZXdDb250YWluZXIuY2xlYXIoKSx0aGlzLl9mb290ZXJSb3dPdXRsZXQudmlld0NvbnRhaW5lci5jbGVhcigpLHRoaXMuX2NhY2hlZFJlbmRlclJvd3NNYXAuY2xlYXIoKSx0aGlzLl9vbkRlc3Ryb3kubmV4dCgpLHRoaXMuX29uRGVzdHJveS5jb21wbGV0ZSgpLCRIKHRoaXMuZGF0YVNvdXJjZSkmJnRoaXMuZGF0YVNvdXJjZS5kaXNjb25uZWN0KHRoaXMpfXJlbmRlclJvd3MoKXt0aGlzLl9yZW5kZXJSb3dzPXRoaXMuX2dldEFsbFJlbmRlclJvd3MoKTtjb25zdCB0PXRoaXMuX2RhdGFEaWZmZXIuZGlmZih0aGlzLl9yZW5kZXJSb3dzKTtpZighdClyZXR1cm4gdGhpcy5fdXBkYXRlTm9EYXRhUm93KCksdm9pZCB0aGlzLmNvbnRlbnRDaGFuZ2VkLm5leHQoKTtjb25zdCBlPXRoaXMuX3Jvd091dGxldC52aWV3Q29udGFpbmVyO3RoaXMuX3ZpZXdSZXBlYXRlci5hcHBseUNoYW5nZXModCxlLCgodCxlLG4pPT50aGlzLl9nZXRFbWJlZGRlZFZpZXdBcmdzKHQuaXRlbSxuKSksKHQ9PnQuaXRlbS5kYXRhKSwodD0+ezE9PT10Lm9wZXJhdGlvbiYmdC5jb250ZXh0JiZ0aGlzLl9yZW5kZXJDZWxsVGVtcGxhdGVGb3JJdGVtKHQucmVjb3JkLml0ZW0ucm93RGVmLHQuY29udGV4dCl9KSksdGhpcy5fdXBkYXRlUm93SW5kZXhDb250ZXh0KCksdC5mb3JFYWNoSWRlbnRpdHlDaGFuZ2UoKHQ9PntlLmdldCh0LmN1cnJlbnRJbmRleCkuY29udGV4dC4kaW1wbGljaXQ9dC5pdGVtLmRhdGF9KSksdGhpcy5fdXBkYXRlTm9EYXRhUm93KCksdGhpcy51cGRhdGVTdGlja3lDb2x1bW5TdHlsZXMoKSx0aGlzLmNvbnRlbnRDaGFuZ2VkLm5leHQoKX1hZGRDb2x1bW5EZWYodCl7dGhpcy5fY3VzdG9tQ29sdW1uRGVmcy5hZGQodCl9cmVtb3ZlQ29sdW1uRGVmKHQpe3RoaXMuX2N1c3RvbUNvbHVtbkRlZnMuZGVsZXRlKHQpfWFkZFJvd0RlZih0KXt0aGlzLl9jdXN0b21Sb3dEZWZzLmFkZCh0KX1yZW1vdmVSb3dEZWYodCl7dGhpcy5fY3VzdG9tUm93RGVmcy5kZWxldGUodCl9YWRkSGVhZGVyUm93RGVmKHQpe3RoaXMuX2N1c3RvbUhlYWRlclJvd0RlZnMuYWRkKHQpLHRoaXMuX2hlYWRlclJvd0RlZkNoYW5nZWQ9ITB9cmVtb3ZlSGVhZGVyUm93RGVmKHQpe3RoaXMuX2N1c3RvbUhlYWRlclJvd0RlZnMuZGVsZXRlKHQpLHRoaXMuX2hlYWRlclJvd0RlZkNoYW5nZWQ9ITB9YWRkRm9vdGVyUm93RGVmKHQpe3RoaXMuX2N1c3RvbUZvb3RlclJvd0RlZnMuYWRkKHQpLHRoaXMuX2Zvb3RlclJvd0RlZkNoYW5nZWQ9ITB9cmVtb3ZlRm9vdGVyUm93RGVmKHQpe3RoaXMuX2N1c3RvbUZvb3RlclJvd0RlZnMuZGVsZXRlKHQpLHRoaXMuX2Zvb3RlclJvd0RlZkNoYW5nZWQ9ITB9c2V0Tm9EYXRhUm93KHQpe3RoaXMuX2N1c3RvbU5vRGF0YVJvdz10fXVwZGF0ZVN0aWNreUhlYWRlclJvd1N0eWxlcygpe2NvbnN0IHQ9dGhpcy5fZ2V0UmVuZGVyZWRSb3dzKHRoaXMuX2hlYWRlclJvd091dGxldCksZT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigidGhlYWQiKTtlJiYoZS5zdHlsZS5kaXNwbGF5PXQubGVuZ3RoPyIiOiJub25lIik7Y29uc3Qgbj10aGlzLl9oZWFkZXJSb3dEZWZzLm1hcCgodD0+dC5zdGlja3kpKTt0aGlzLl9zdGlja3lTdHlsZXIuY2xlYXJTdGlja3lQb3NpdGlvbmluZyh0LFsidG9wIl0pLHRoaXMuX3N0aWNreVN0eWxlci5zdGlja1Jvd3ModCxuLCJ0b3AiKSx0aGlzLl9oZWFkZXJSb3dEZWZzLmZvckVhY2goKHQ9PnQucmVzZXRTdGlja3lDaGFuZ2VkKCkpKX11cGRhdGVTdGlja3lGb290ZXJSb3dTdHlsZXMoKXtjb25zdCB0PXRoaXMuX2dldFJlbmRlcmVkUm93cyh0aGlzLl9mb290ZXJSb3dPdXRsZXQpLGU9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoInRmb290Iik7ZSYmKGUuc3R5bGUuZGlzcGxheT10Lmxlbmd0aD8iIjoibm9uZSIpO2NvbnN0IG49dGhpcy5fZm9vdGVyUm93RGVmcy5tYXAoKHQ9PnQuc3RpY2t5KSk7dGhpcy5fc3RpY2t5U3R5bGVyLmNsZWFyU3RpY2t5UG9zaXRpb25pbmcodCxbImJvdHRvbSJdKSx0aGlzLl9zdGlja3lTdHlsZXIuc3RpY2tSb3dzKHQsbiwiYm90dG9tIiksdGhpcy5fc3RpY2t5U3R5bGVyLnVwZGF0ZVN0aWNreUZvb3RlckNvbnRhaW5lcih0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsbiksdGhpcy5fZm9vdGVyUm93RGVmcy5mb3JFYWNoKCh0PT50LnJlc2V0U3RpY2t5Q2hhbmdlZCgpKSl9dXBkYXRlU3RpY2t5Q29sdW1uU3R5bGVzKCl7Y29uc3QgdD10aGlzLl9nZXRSZW5kZXJlZFJvd3ModGhpcy5faGVhZGVyUm93T3V0bGV0KSxlPXRoaXMuX2dldFJlbmRlcmVkUm93cyh0aGlzLl9yb3dPdXRsZXQpLG49dGhpcy5fZ2V0UmVuZGVyZWRSb3dzKHRoaXMuX2Zvb3RlclJvd091dGxldCk7KHRoaXMuX2lzTmF0aXZlSHRtbFRhYmxlJiYhdGhpcy5fZml4ZWRMYXlvdXR8fHRoaXMuX3N0aWNreUNvbHVtblN0eWxlc05lZWRSZXNldCkmJih0aGlzLl9zdGlja3lTdHlsZXIuY2xlYXJTdGlja3lQb3NpdGlvbmluZyhbLi4udCwuLi5lLC4uLm5dLFsibGVmdCIsInJpZ2h0Il0pLHRoaXMuX3N0aWNreUNvbHVtblN0eWxlc05lZWRSZXNldD0hMSksdC5mb3JFYWNoKCgodCxlKT0+e3RoaXMuX2FkZFN0aWNreUNvbHVtblN0eWxlcyhbdF0sdGhpcy5faGVhZGVyUm93RGVmc1tlXSl9KSksdGhpcy5fcm93RGVmcy5mb3JFYWNoKCh0PT57Y29uc3Qgbj1bXTtmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rKyl0aGlzLl9yZW5kZXJSb3dzW29dLnJvd0RlZj09PXQmJm4ucHVzaChlW29dKTt0aGlzLl9hZGRTdGlja3lDb2x1bW5TdHlsZXMobix0KX0pKSxuLmZvckVhY2goKCh0LGUpPT57dGhpcy5fYWRkU3RpY2t5Q29sdW1uU3R5bGVzKFt0XSx0aGlzLl9mb290ZXJSb3dEZWZzW2VdKX0pKSxBcnJheS5mcm9tKHRoaXMuX2NvbHVtbkRlZnNCeU5hbWUudmFsdWVzKCkpLmZvckVhY2goKHQ9PnQucmVzZXRTdGlja3lDaGFuZ2VkKCkpKX1fZ2V0QWxsUmVuZGVyUm93cygpe2NvbnN0IHQ9W10sZT10aGlzLl9jYWNoZWRSZW5kZXJSb3dzTWFwO3RoaXMuX2NhY2hlZFJlbmRlclJvd3NNYXA9bmV3IE1hcDtmb3IobGV0IG49MDtuPHRoaXMuX2RhdGEubGVuZ3RoO24rKyl7bGV0IG89dGhpcy5fZGF0YVtuXTtjb25zdCBpPXRoaXMuX2dldFJlbmRlclJvd3NGb3JEYXRhKG8sbixlLmdldChvKSk7dGhpcy5fY2FjaGVkUmVuZGVyUm93c01hcC5oYXMobyl8fHRoaXMuX2NhY2hlZFJlbmRlclJvd3NNYXAuc2V0KG8sbmV3IFdlYWtNYXApO2ZvcihsZXQgZT0wO2U8aS5sZW5ndGg7ZSsrKXtsZXQgbj1pW2VdO2NvbnN0IG89dGhpcy5fY2FjaGVkUmVuZGVyUm93c01hcC5nZXQobi5kYXRhKTtvLmhhcyhuLnJvd0RlZik/by5nZXQobi5yb3dEZWYpLnB1c2gobik6by5zZXQobi5yb3dEZWYsW25dKSx0LnB1c2gobil9fXJldHVybiB0fV9nZXRSZW5kZXJSb3dzRm9yRGF0YSh0LGUsbil7cmV0dXJuIHRoaXMuX2dldFJvd0RlZnModCxlKS5tYXAoKG89Pntjb25zdCBpPW4mJm4uaGFzKG8pP24uZ2V0KG8pOltdO2lmKGkubGVuZ3RoKXtjb25zdCB0PWkuc2hpZnQoKTtyZXR1cm4gdC5kYXRhSW5kZXg9ZSx0fXJldHVybntkYXRhOnQscm93RGVmOm8sZGF0YUluZGV4OmV9fSkpfV9jYWNoZUNvbHVtbkRlZnMoKXt0aGlzLl9jb2x1bW5EZWZzQnlOYW1lLmNsZWFyKCksZTAodGhpcy5fZ2V0T3duRGVmcyh0aGlzLl9jb250ZW50Q29sdW1uRGVmcyksdGhpcy5fY3VzdG9tQ29sdW1uRGVmcykuZm9yRWFjaCgodD0+e2lmKHRoaXMuX2NvbHVtbkRlZnNCeU5hbWUuaGFzKHQubmFtZSkmJigidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSl0aHJvdyhmdW5jdGlvbiBlKHQpe3JldHVybiBFcnJvcihgRHVwbGljYXRlIGNvbHVtbiBkZWZpbml0aW9uIG5hbWUgcHJvdmlkZWQ6ICIke3R9Ii5gKX0pKHQubmFtZSk7dGhpcy5fY29sdW1uRGVmc0J5TmFtZS5zZXQodC5uYW1lLHQpfSkpfV9jYWNoZVJvd0RlZnMoKXt0aGlzLl9oZWFkZXJSb3dEZWZzPWUwKHRoaXMuX2dldE93bkRlZnModGhpcy5fY29udGVudEhlYWRlclJvd0RlZnMpLHRoaXMuX2N1c3RvbUhlYWRlclJvd0RlZnMpLHRoaXMuX2Zvb3RlclJvd0RlZnM9ZTAodGhpcy5fZ2V0T3duRGVmcyh0aGlzLl9jb250ZW50Rm9vdGVyUm93RGVmcyksdGhpcy5fY3VzdG9tRm9vdGVyUm93RGVmcyksdGhpcy5fcm93RGVmcz1lMCh0aGlzLl9nZXRPd25EZWZzKHRoaXMuX2NvbnRlbnRSb3dEZWZzKSx0aGlzLl9jdXN0b21Sb3dEZWZzKTtjb25zdCB0PXRoaXMuX3Jvd0RlZnMuZmlsdGVyKCh0PT4hdC53aGVuKSk7aWYoIXRoaXMubXVsdGlUZW1wbGF0ZURhdGFSb3dzJiZ0Lmxlbmd0aD4xJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkpdGhyb3coZnVuY3Rpb24gZSgpe3JldHVybiBFcnJvcigiVGhlcmUgY2FuIG9ubHkgYmUgb25lIGRlZmF1bHQgcm93IHdpdGhvdXQgYSB3aGVuIHByZWRpY2F0ZSBmdW5jdGlvbi4iKX0pKCk7dGhpcy5fZGVmYXVsdFJvd0RlZj10WzBdfV9yZW5kZXJVcGRhdGVkQ29sdW1ucygpe2NvbnN0IHQ9KHQsZSk9PnR8fCEhZS5nZXRDb2x1bW5zRGlmZigpLGU9dGhpcy5fcm93RGVmcy5yZWR1Y2UodCwhMSk7ZSYmdGhpcy5fZm9yY2VSZW5kZXJEYXRhUm93cygpO2NvbnN0IG49dGhpcy5faGVhZGVyUm93RGVmcy5yZWR1Y2UodCwhMSk7biYmdGhpcy5fZm9yY2VSZW5kZXJIZWFkZXJSb3dzKCk7Y29uc3Qgbz10aGlzLl9mb290ZXJSb3dEZWZzLnJlZHVjZSh0LCExKTtyZXR1cm4gbyYmdGhpcy5fZm9yY2VSZW5kZXJGb290ZXJSb3dzKCksZXx8bnx8b31fc3dpdGNoRGF0YVNvdXJjZSh0KXt0aGlzLl9kYXRhPVtdLCRIKHRoaXMuZGF0YVNvdXJjZSkmJnRoaXMuZGF0YVNvdXJjZS5kaXNjb25uZWN0KHRoaXMpLHRoaXMuX3JlbmRlckNoYW5nZVN1YnNjcmlwdGlvbiYmKHRoaXMuX3JlbmRlckNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX3JlbmRlckNoYW5nZVN1YnNjcmlwdGlvbj1udWxsKSx0fHwodGhpcy5fZGF0YURpZmZlciYmdGhpcy5fZGF0YURpZmZlci5kaWZmKFtdKSx0aGlzLl9yb3dPdXRsZXQudmlld0NvbnRhaW5lci5jbGVhcigpKSx0aGlzLl9kYXRhU291cmNlPXR9X29ic2VydmVSZW5kZXJDaGFuZ2VzKCl7aWYoIXRoaXMuZGF0YVNvdXJjZSlyZXR1cm47bGV0IHQ7aWYoJEgodGhpcy5kYXRhU291cmNlKT90PXRoaXMuZGF0YVNvdXJjZS5jb25uZWN0KHRoaXMpOk50KHRoaXMuZGF0YVNvdXJjZSk/dD10aGlzLmRhdGFTb3VyY2U6QXJyYXkuaXNBcnJheSh0aGlzLmRhdGFTb3VyY2UpJiYodD1FdCh0aGlzLmRhdGFTb3VyY2UpKSx2b2lkIDA9PT10JiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkpdGhyb3coZnVuY3Rpb24gZSgpe3JldHVybiBFcnJvcigiUHJvdmlkZWQgZGF0YSBzb3VyY2UgZGlkIG5vdCBtYXRjaCBhbiBhcnJheSwgT2JzZXJ2YWJsZSwgb3IgRGF0YVNvdXJjZSIpfSkoKTt0aGlzLl9yZW5kZXJDaGFuZ2VTdWJzY3JpcHRpb249dC5waXBlKEllKHRoaXMuX29uRGVzdHJveSkpLnN1YnNjcmliZSgodD0+e3RoaXMuX2RhdGE9dHx8W10sdGhpcy5yZW5kZXJSb3dzKCl9KSl9X2ZvcmNlUmVuZGVySGVhZGVyUm93cygpe3RoaXMuX2hlYWRlclJvd091dGxldC52aWV3Q29udGFpbmVyLmxlbmd0aD4wJiZ0aGlzLl9oZWFkZXJSb3dPdXRsZXQudmlld0NvbnRhaW5lci5jbGVhcigpLHRoaXMuX2hlYWRlclJvd0RlZnMuZm9yRWFjaCgoKHQsZSk9PnRoaXMuX3JlbmRlclJvdyh0aGlzLl9oZWFkZXJSb3dPdXRsZXQsdCxlKSkpLHRoaXMudXBkYXRlU3RpY2t5SGVhZGVyUm93U3R5bGVzKCl9X2ZvcmNlUmVuZGVyRm9vdGVyUm93cygpe3RoaXMuX2Zvb3RlclJvd091dGxldC52aWV3Q29udGFpbmVyLmxlbmd0aD4wJiZ0aGlzLl9mb290ZXJSb3dPdXRsZXQudmlld0NvbnRhaW5lci5jbGVhcigpLHRoaXMuX2Zvb3RlclJvd0RlZnMuZm9yRWFjaCgoKHQsZSk9PnRoaXMuX3JlbmRlclJvdyh0aGlzLl9mb290ZXJSb3dPdXRsZXQsdCxlKSkpLHRoaXMudXBkYXRlU3RpY2t5Rm9vdGVyUm93U3R5bGVzKCl9X2FkZFN0aWNreUNvbHVtblN0eWxlcyh0LGUpe2NvbnN0IG49QXJyYXkuZnJvbShlLmNvbHVtbnN8fFtdKS5tYXAoKHQ9Pntjb25zdCBlPXRoaXMuX2NvbHVtbkRlZnNCeU5hbWUuZ2V0KHQpO2lmKCFlJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkpdGhyb3cgWSQodCk7cmV0dXJuIGV9KSksbz1uLm1hcCgodD0+dC5zdGlja3kpKSxpPW4ubWFwKCh0PT50LnN0aWNreUVuZCkpO3RoaXMuX3N0aWNreVN0eWxlci51cGRhdGVTdGlja3lDb2x1bW5zKHQsbyxpLCF0aGlzLl9maXhlZExheW91dHx8dGhpcy5fZm9yY2VSZWNhbGN1bGF0ZUNlbGxXaWR0aHMpfV9nZXRSZW5kZXJlZFJvd3ModCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPHQudmlld0NvbnRhaW5lci5sZW5ndGg7bisrKXtjb25zdCBvPXQudmlld0NvbnRhaW5lci5nZXQobik7ZS5wdXNoKG8ucm9vdE5vZGVzWzBdKX1yZXR1cm4gZX1fZ2V0Um93RGVmcyh0LGUpe2lmKDE9PXRoaXMuX3Jvd0RlZnMubGVuZ3RoKXJldHVyblt0aGlzLl9yb3dEZWZzWzBdXTtsZXQgbj1bXTtpZih0aGlzLm11bHRpVGVtcGxhdGVEYXRhUm93cyluPXRoaXMuX3Jvd0RlZnMuZmlsdGVyKChuPT4hbi53aGVufHxuLndoZW4oZSx0KSkpO2Vsc2V7bGV0IG89dGhpcy5fcm93RGVmcy5maW5kKChuPT5uLndoZW4mJm4ud2hlbihlLHQpKSl8fHRoaXMuX2RlZmF1bHRSb3dEZWY7byYmbi5wdXNoKG8pfWlmKCFuLmxlbmd0aCYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93KGZ1bmN0aW9uIG8odCl7cmV0dXJuIEVycm9yKGBDb3VsZCBub3QgZmluZCBhIG1hdGNoaW5nIHJvdyBkZWZpbml0aW9uIGZvciB0aGVwcm92aWRlZCByb3cgZGF0YTogJHtKU09OLnN0cmluZ2lmeSh0KX1gKX0pKHQpO3JldHVybiBufV9nZXRFbWJlZGRlZFZpZXdBcmdzKHQsZSl7cmV0dXJue3RlbXBsYXRlUmVmOnQucm93RGVmLnRlbXBsYXRlLGNvbnRleHQ6eyRpbXBsaWNpdDp0LmRhdGF9LGluZGV4OmV9fV9yZW5kZXJSb3codCxlLG4sbz17fSl7Y29uc3QgaT10LnZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KGUudGVtcGxhdGUsbyxuKTtyZXR1cm4gdGhpcy5fcmVuZGVyQ2VsbFRlbXBsYXRlRm9ySXRlbShlLG8pLGl9X3JlbmRlckNlbGxUZW1wbGF0ZUZvckl0ZW0odCxlKXtmb3IobGV0IG4gb2YgdGhpcy5fZ2V0Q2VsbFRlbXBsYXRlcyh0KSlMJC5tb3N0UmVjZW50Q2VsbE91dGxldCYmTCQubW9zdFJlY2VudENlbGxPdXRsZXQuX3ZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KG4sZSk7dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9X3VwZGF0ZVJvd0luZGV4Q29udGV4dCgpe2NvbnN0IHQ9dGhpcy5fcm93T3V0bGV0LnZpZXdDb250YWluZXI7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXtjb25zdCBvPXQuZ2V0KGUpLmNvbnRleHQ7by5jb3VudD1uLG8uZmlyc3Q9MD09PWUsby5sYXN0PWU9PT1uLTEsby5ldmVuPWUlMj09MCxvLm9kZD0hby5ldmVuLHRoaXMubXVsdGlUZW1wbGF0ZURhdGFSb3dzPyhvLmRhdGFJbmRleD10aGlzLl9yZW5kZXJSb3dzW2VdLmRhdGFJbmRleCxvLnJlbmRlckluZGV4PWUpOm8uaW5kZXg9dGhpcy5fcmVuZGVyUm93c1tlXS5kYXRhSW5kZXh9fV9nZXRDZWxsVGVtcGxhdGVzKHQpe3JldHVybiB0JiZ0LmNvbHVtbnM/QXJyYXkuZnJvbSh0LmNvbHVtbnMsKGU9Pntjb25zdCBuPXRoaXMuX2NvbHVtbkRlZnNCeU5hbWUuZ2V0KGUpO2lmKCFuJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkpdGhyb3cgWSQoZSk7cmV0dXJuIHQuZXh0cmFjdENlbGxUZW1wbGF0ZShuKX0pKTpbXX1fYXBwbHlOYXRpdmVUYWJsZVNlY3Rpb25zKCl7Y29uc3QgdD10aGlzLl9kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksZT1be3RhZzoidGhlYWQiLG91dGxldHM6W3RoaXMuX2hlYWRlclJvd091dGxldF19LHt0YWc6InRib2R5IixvdXRsZXRzOlt0aGlzLl9yb3dPdXRsZXQsdGhpcy5fbm9EYXRhUm93T3V0bGV0XX0se3RhZzoidGZvb3QiLG91dGxldHM6W3RoaXMuX2Zvb3RlclJvd091dGxldF19XTtmb3IoY29uc3QgbiBvZiBlKXtjb25zdCBlPXRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQobi50YWcpO2Uuc2V0QXR0cmlidXRlKCJyb2xlIiwicm93Z3JvdXAiKTtmb3IoY29uc3QgdCBvZiBuLm91dGxldHMpZS5hcHBlbmRDaGlsZCh0LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7dC5hcHBlbmRDaGlsZChlKX10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQodCl9X2ZvcmNlUmVuZGVyRGF0YVJvd3MoKXt0aGlzLl9kYXRhRGlmZmVyLmRpZmYoW10pLHRoaXMuX3Jvd091dGxldC52aWV3Q29udGFpbmVyLmNsZWFyKCksdGhpcy5yZW5kZXJSb3dzKCl9X2NoZWNrU3RpY2t5U3RhdGVzKCl7Y29uc3QgdD0odCxlKT0+dHx8ZS5oYXNTdGlja3lDaGFuZ2VkKCk7dGhpcy5faGVhZGVyUm93RGVmcy5yZWR1Y2UodCwhMSkmJnRoaXMudXBkYXRlU3RpY2t5SGVhZGVyUm93U3R5bGVzKCksdGhpcy5fZm9vdGVyUm93RGVmcy5yZWR1Y2UodCwhMSkmJnRoaXMudXBkYXRlU3RpY2t5Rm9vdGVyUm93U3R5bGVzKCksQXJyYXkuZnJvbSh0aGlzLl9jb2x1bW5EZWZzQnlOYW1lLnZhbHVlcygpKS5yZWR1Y2UodCwhMSkmJih0aGlzLl9zdGlja3lDb2x1bW5TdHlsZXNOZWVkUmVzZXQ9ITAsdGhpcy51cGRhdGVTdGlja3lDb2x1bW5TdHlsZXMoKSl9X3NldHVwU3RpY2t5U3R5bGVyKCl7dGhpcy5fc3RpY2t5U3R5bGVyPW5ldyBXJCh0aGlzLl9pc05hdGl2ZUh0bWxUYWJsZSx0aGlzLnN0aWNreUNzc0NsYXNzLHRoaXMuX2Rpcj90aGlzLl9kaXIudmFsdWU6Imx0ciIsdGhpcy5fY29hbGVzY2VkU3R5bGVTY2hlZHVsZXIsdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyLHRoaXMubmVlZHNQb3NpdGlvblN0aWNreU9uRWxlbWVudCx0aGlzLl9zdGlja3lQb3NpdGlvbmluZ0xpc3RlbmVyKSwodGhpcy5fZGlyP3RoaXMuX2Rpci5jaGFuZ2U6RXQoKSkucGlwZShJZSh0aGlzLl9vbkRlc3Ryb3kpKS5zdWJzY3JpYmUoKHQ9Pnt0aGlzLl9zdGlja3lTdHlsZXIuZGlyZWN0aW9uPXQsdGhpcy51cGRhdGVTdGlja3lDb2x1bW5TdHlsZXMoKX0pKX1fZ2V0T3duRGVmcyh0KXtyZXR1cm4gdC5maWx0ZXIoKHQ9PiF0Ll90YWJsZXx8dC5fdGFibGU9PT10aGlzKSl9X3VwZGF0ZU5vRGF0YVJvdygpe2NvbnN0IHQ9dGhpcy5fY3VzdG9tTm9EYXRhUm93fHx0aGlzLl9ub0RhdGFSb3c7aWYodCl7Y29uc3QgZT0wPT09dGhpcy5fcm93T3V0bGV0LnZpZXdDb250YWluZXIubGVuZ3RoO2lmKGUhPT10aGlzLl9pc1Nob3dpbmdOb0RhdGFSb3cpe2NvbnN0IG49dGhpcy5fbm9EYXRhUm93T3V0bGV0LnZpZXdDb250YWluZXI7ZT9uLmNyZWF0ZUVtYmVkZGVkVmlldyh0LnRlbXBsYXRlUmVmKTpuLmNsZWFyKCksdGhpcy5faXNTaG93aW5nTm9EYXRhUm93PWV9fX19ZnVuY3Rpb24gZTAodCxlKXtyZXR1cm4gdC5jb25jYXQoQXJyYXkuZnJvbShlKSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqL3QwLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx0MCkoU20oSGcpLFNtKFVnKSxTbShoZyksTmEoInJvbGUiKSxTbShISSw4KSxTbShaXyksU20od3opLFNtKGFGKSxTbShFJCksU20odUYpLFNtKHEkLDEyKSl9LHQwLsm1Y21wPXRvKHt0eXBlOnQwLHNlbGVjdG9yczpbWyJjZGstdGFibGUiXSxbInRhYmxlIiwiY2RrLXRhYmxlIiwiIl1dLGNvbnRlbnRRdWVyaWVzOmZ1bmN0aW9uIHQoZSxuLG8pe2lmKDEmZSYmKCRoKG8sVSQsNSksJGgobyxPJCw1KSwkaChvLEYkLDUpLCRoKG8seiQsNSksJGgobyxIJCw1KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5fbm9EYXRhUm93PXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLl9jb250ZW50Q29sdW1uRGVmcz10KSxKaCh0PXRiKCkpJiYobi5fY29udGVudFJvd0RlZnM9dCksSmgodD10YigpKSYmKG4uX2NvbnRlbnRIZWFkZXJSb3dEZWZzPXQpLEpoKHQ9dGIoKSkmJihuLl9jb250ZW50Rm9vdGVyUm93RGVmcz10KX19LHZpZXdRdWVyeTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoUWgoWCQsNyksUWgoSyQsNyksUWgoSiQsNyksUWgoUSQsNykpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uX3Jvd091dGxldD10LmZpcnN0KSxKaCh0PXRiKCkpJiYobi5faGVhZGVyUm93T3V0bGV0PXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLl9mb290ZXJSb3dPdXRsZXQ9dC5maXJzdCksSmgodD10YigpKSYmKG4uX25vRGF0YVJvd091dGxldD10LmZpcnN0KX19LGhvc3RBdHRyczpbMSwiY2RrLXRhYmxlIl0saG9zdFZhcnM6Mixob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmcHUoImNkay10YWJsZS1maXhlZC1sYXlvdXQiLG4uZml4ZWRMYXlvdXQpfSxpbnB1dHM6e3RyYWNrQnk6InRyYWNrQnkiLGRhdGFTb3VyY2U6ImRhdGFTb3VyY2UiLG11bHRpVGVtcGxhdGVEYXRhUm93czoibXVsdGlUZW1wbGF0ZURhdGFSb3dzIixmaXhlZExheW91dDoiZml4ZWRMYXlvdXQifSxvdXRwdXRzOntjb250ZW50Q2hhbmdlZDoiY29udGVudENoYW5nZWQifSxleHBvcnRBczpbImNka1RhYmxlIl0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTp5JCx1c2VFeGlzdGluZzp0MH0se3Byb3ZpZGU6YUYsdXNlQ2xhc3M6ZUZ9LHtwcm92aWRlOkUkLHVzZUNsYXNzOlIkfSx7cHJvdmlkZTpxJCx1c2VWYWx1ZTpudWxsfV0pXSxuZ0NvbnRlbnRTZWxlY3RvcnM6WyJjYXB0aW9uIiwiY29sZ3JvdXAsIGNvbCJdLGRlY2xzOjYsdmFyczowLGNvbnN0czpbWyJoZWFkZXJSb3dPdXRsZXQiLCIiXSxbInJvd091dGxldCIsIiJdLFsibm9EYXRhUm93T3V0bGV0IiwiIl0sWyJmb290ZXJSb3dPdXRsZXQiLCIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFptKGYkKSxYbSgwKSxYbSgxLDEpLEltKDIsMCksSW0oMywxKSxJbSg0LDIpLEltKDUsMykpfSxkaXJlY3RpdmVzOltLJCxYJCxRJCxKJF0sc3R5bGVzOlsiLmNkay10YWJsZS1maXhlZC1sYXlvdXR7dGFibGUtbGF5b3V0OmZpeGVkfVxuIl0sZW5jYXBzdWxhdGlvbjoyfSksdDAuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpIZ30se3R5cGU6VWd9LHt0eXBlOmhnfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6amEsYXJnczpbInJvbGUiXX1dfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOnd6fSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbYUZdfV19LHt0eXBlOlIkLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W0UkXX1dfSx7dHlwZTp1Rn0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpFcn0se3R5cGU6a3IsYXJnczpbcSRdfV19XSx0MC5wcm9wRGVjb3JhdG9ycz17dHJhY2tCeTpbe3R5cGU6eHl9XSxkYXRhU291cmNlOlt7dHlwZTp4eX1dLG11bHRpVGVtcGxhdGVEYXRhUm93czpbe3R5cGU6eHl9XSxmaXhlZExheW91dDpbe3R5cGU6eHl9XSxjb250ZW50Q2hhbmdlZDpbe3R5cGU6T3l9XSxfcm93T3V0bGV0Olt7dHlwZTpaYSxhcmdzOltYJCx7c3RhdGljOiEwfV19XSxfaGVhZGVyUm93T3V0bGV0Olt7dHlwZTpaYSxhcmdzOltLJCx7c3RhdGljOiEwfV19XSxfZm9vdGVyUm93T3V0bGV0Olt7dHlwZTpaYSxhcmdzOltKJCx7c3RhdGljOiEwfV19XSxfbm9EYXRhUm93T3V0bGV0Olt7dHlwZTpaYSxhcmdzOltRJCx7c3RhdGljOiEwfV19XSxfY29udGVudENvbHVtbkRlZnM6W3t0eXBlOllhLGFyZ3M6W08kLHtkZXNjZW5kYW50czohMH1dfV0sX2NvbnRlbnRSb3dEZWZzOlt7dHlwZTpZYSxhcmdzOltGJCx7ZGVzY2VuZGFudHM6ITB9XX1dLF9jb250ZW50SGVhZGVyUm93RGVmczpbe3R5cGU6WWEsYXJnczpbeiQse2Rlc2NlbmRhbnRzOiEwfV19XSxfY29udGVudEZvb3RlclJvd0RlZnM6W3t0eXBlOllhLGFyZ3M6W0gkLHtkZXNjZW5kYW50czohMH1dfV0sX25vRGF0YVJvdzpbe3R5cGU6cWEsYXJnczpbVSRdfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodDAsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiY2RrLXRhYmxlLCB0YWJsZVtjZGstdGFibGVdIixleHBvcnRBczoiY2RrVGFibGUiLHRlbXBsYXRlOiQkLGhvc3Q6e2NsYXNzOiJjZGstdGFibGUiLCJbY2xhc3MuY2RrLXRhYmxlLWZpeGVkLWxheW91dF0iOiJmaXhlZExheW91dCJ9LGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uRGVmYXVsdCxwcm92aWRlcnM6W3twcm92aWRlOnkkLHVzZUV4aXN0aW5nOnQwfSx7cHJvdmlkZTphRix1c2VDbGFzczplRn0se3Byb3ZpZGU6RSQsdXNlQ2xhc3M6UiR9LHtwcm92aWRlOnEkLHVzZVZhbHVlOm51bGx9XSxzdHlsZXM6WyIuY2RrLXRhYmxlLWZpeGVkLWxheW91dHt0YWJsZS1sYXlvdXQ6Zml4ZWR9XG4iXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkhnfSx7dHlwZTpVZ30se3R5cGU6aGd9LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpqYSxhcmdzOlsicm9sZSJdfV19LHt0eXBlOkhJLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6d3p9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOlthRl19XX0se3R5cGU6UiQsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbRSRdfV19LHt0eXBlOnVGfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOkVyfSx7dHlwZTprcixhcmdzOltxJF19XX1dfSkse2NvbnRlbnRDaGFuZ2VkOlt7dHlwZTpPeX1dLHRyYWNrQnk6W3t0eXBlOnh5fV0sZGF0YVNvdXJjZTpbe3R5cGU6eHl9XSxtdWx0aVRlbXBsYXRlRGF0YVJvd3M6W3t0eXBlOnh5fV0sZml4ZWRMYXlvdXQ6W3t0eXBlOnh5fV0sX3Jvd091dGxldDpbe3R5cGU6WmEsYXJnczpbWCQse3N0YXRpYzohMH1dfV0sX2hlYWRlclJvd091dGxldDpbe3R5cGU6WmEsYXJnczpbSyQse3N0YXRpYzohMH1dfV0sX2Zvb3RlclJvd091dGxldDpbe3R5cGU6WmEsYXJnczpbSiQse3N0YXRpYzohMH1dfV0sX25vRGF0YVJvd091dGxldDpbe3R5cGU6WmEsYXJnczpbUSQse3N0YXRpYzohMH1dfV0sX2NvbnRlbnRDb2x1bW5EZWZzOlt7dHlwZTpZYSxhcmdzOltPJCx7ZGVzY2VuZGFudHM6ITB9XX1dLF9jb250ZW50Um93RGVmczpbe3R5cGU6WWEsYXJnczpbRiQse2Rlc2NlbmRhbnRzOiEwfV19XSxfY29udGVudEhlYWRlclJvd0RlZnM6W3t0eXBlOllhLGFyZ3M6W3okLHtkZXNjZW5kYW50czohMH1dfV0sX2NvbnRlbnRGb290ZXJSb3dEZWZzOlt7dHlwZTpZYSxhcmdzOltIJCx7ZGVzY2VuZGFudHM6ITB9XX1dLF9ub0RhdGFSb3c6W3t0eXBlOnFhLGFyZ3M6W1UkXX1dfSk7Y2xhc3MgbjB7Y29uc3RydWN0b3IodCxlKXt0aGlzLl90YWJsZT10LHRoaXMuX29wdGlvbnM9ZSx0aGlzLmp1c3RpZnk9InN0YXJ0Iix0aGlzLl9vcHRpb25zPWV8fHt9fWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuX25hbWV9c2V0IG5hbWUodCl7dGhpcy5fbmFtZT10LHRoaXMuX3N5bmNDb2x1bW5EZWZOYW1lKCl9bmdPbkluaXQoKXtpZih0aGlzLl9zeW5jQ29sdW1uRGVmTmFtZSgpLHZvaWQgMD09PXRoaXMuaGVhZGVyVGV4dCYmKHRoaXMuaGVhZGVyVGV4dD10aGlzLl9jcmVhdGVEZWZhdWx0SGVhZGVyVGV4dCgpKSx0aGlzLmRhdGFBY2Nlc3Nvcnx8KHRoaXMuZGF0YUFjY2Vzc29yPXRoaXMuX29wdGlvbnMuZGVmYXVsdERhdGFBY2Nlc3Nvcnx8KCh0LGUpPT50W2VdKSksdGhpcy5fdGFibGUpdGhpcy5jb2x1bW5EZWYuY2VsbD10aGlzLmNlbGwsdGhpcy5jb2x1bW5EZWYuaGVhZGVyQ2VsbD10aGlzLmhlYWRlckNlbGwsdGhpcy5fdGFibGUuYWRkQ29sdW1uRGVmKHRoaXMuY29sdW1uRGVmKTtlbHNlIGlmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpdGhyb3coZnVuY3Rpb24gdCgpe3JldHVybiBFcnJvcigiVGV4dCBjb2x1bW4gY291bGQgbm90IGZpbmQgYSBwYXJlbnQgdGFibGUgZm9yIHJlZ2lzdHJhdGlvbi4iKX0pKCl9bmdPbkRlc3Ryb3koKXt0aGlzLl90YWJsZSYmdGhpcy5fdGFibGUucmVtb3ZlQ29sdW1uRGVmKHRoaXMuY29sdW1uRGVmKX1fY3JlYXRlRGVmYXVsdEhlYWRlclRleHQoKXtjb25zdCB0PXRoaXMubmFtZTtpZighdCYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93KGZ1bmN0aW9uIGUoKXtyZXR1cm4gRXJyb3IoIlRhYmxlIHRleHQgY29sdW1uIG11c3QgaGF2ZSBhIG5hbWUuIil9KSgpO3JldHVybiB0aGlzLl9vcHRpb25zJiZ0aGlzLl9vcHRpb25zLmRlZmF1bHRIZWFkZXJUZXh0VHJhbnNmb3JtP3RoaXMuX29wdGlvbnMuZGVmYXVsdEhlYWRlclRleHRUcmFuc2Zvcm0odCk6dFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSl9X3N5bmNDb2x1bW5EZWZOYW1lKCl7dGhpcy5jb2x1bW5EZWYmJih0aGlzLmNvbHVtbkRlZi5uYW1lPXRoaXMubmFtZSl9fW4wLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxuMCkoU20odDAsOCksU20oXyQsOCkpfSxuMC7JtWNtcD10byh7dHlwZTpuMCxzZWxlY3RvcnM6W1siY2RrLXRleHQtY29sdW1uIl1dLHZpZXdRdWVyeTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoUWgoTyQsNyksUWgoQyQsNyksUWgoTSQsNykpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uY29sdW1uRGVmPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLmNlbGw9dC5maXJzdCksSmgodD10YigpKSYmKG4uaGVhZGVyQ2VsbD10LmZpcnN0KX19LGlucHV0czp7anVzdGlmeToianVzdGlmeSIsbmFtZToibmFtZSIsaGVhZGVyVGV4dDoiaGVhZGVyVGV4dCIsZGF0YUFjY2Vzc29yOiJkYXRhQWNjZXNzb3IifSxkZWNsczozLHZhcnM6MCxjb25zdHM6W1siY2RrQ29sdW1uRGVmIiwiIl0sWyJjZGstaGVhZGVyLWNlbGwiLCIiLDMsInRleHQtYWxpZ24iLDQsImNka0hlYWRlckNlbGxEZWYiXSxbImNkay1jZWxsIiwiIiwzLCJ0ZXh0LWFsaWduIiw0LCJjZGtDZWxsRGVmIl0sWyJjZGstaGVhZGVyLWNlbGwiLCIiXSxbImNkay1jZWxsIiwiIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihObSgwLDApLFFwKDEsZyQsMiwzLCJ0aCIsMSksUXAoMixoJCwyLDMsInRkIiwyKSx6bSgpKX0sZGlyZWN0aXZlczpbTyQsTSQsQyQsdyQsUyRdLGVuY2Fwc3VsYXRpb246Mn0pLG4wLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6dDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltfJF19XX1dLG4wLnByb3BEZWNvcmF0b3JzPXtuYW1lOlt7dHlwZTp4eX1dLGhlYWRlclRleHQ6W3t0eXBlOnh5fV0sZGF0YUFjY2Vzc29yOlt7dHlwZTp4eX1dLGp1c3RpZnk6W3t0eXBlOnh5fV0sY29sdW1uRGVmOlt7dHlwZTpaYSxhcmdzOltPJCx7c3RhdGljOiEwfV19XSxjZWxsOlt7dHlwZTpaYSxhcmdzOltDJCx7c3RhdGljOiEwfV19XSxoZWFkZXJDZWxsOlt7dHlwZTpaYSxhcmdzOltNJCx7c3RhdGljOiEwfV19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChuMCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJjZGstdGV4dC1jb2x1bW4iLHRlbXBsYXRlOidcbiAgICA8bmctY29udGFpbmVyIGNka0NvbHVtbkRlZj5cbiAgICAgIDx0aCBjZGstaGVhZGVyLWNlbGwgKmNka0hlYWRlckNlbGxEZWYgW3N0eWxlLnRleHQtYWxpZ25dPSJqdXN0aWZ5Ij5cbiAgICAgICAge3toZWFkZXJUZXh0fX1cbiAgICAgIDwvdGg+XG4gICAgICA8dGQgY2RrLWNlbGwgKmNka0NlbGxEZWY9ImxldCBkYXRhIiBbc3R5bGUudGV4dC1hbGlnbl09Imp1c3RpZnkiPlxuICAgICAgICB7e2RhdGFBY2Nlc3NvcihkYXRhLCBuYW1lKX19XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAnLGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uRGVmYXVsdH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnQwLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbXyRdfV19XX0pLHtqdXN0aWZ5Olt7dHlwZTp4eX1dLG5hbWU6W3t0eXBlOnh5fV0saGVhZGVyVGV4dDpbe3R5cGU6eHl9XSxkYXRhQWNjZXNzb3I6W3t0eXBlOnh5fV0sY29sdW1uRGVmOlt7dHlwZTpaYSxhcmdzOltPJCx7c3RhdGljOiEwfV19XSxjZWxsOlt7dHlwZTpaYSxhcmdzOltDJCx7c3RhdGljOiEwfV19XSxoZWFkZXJDZWxsOlt7dHlwZTpaYSxhcmdzOltNJCx7c3RhdGljOiEwfV19XX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgbzA9W3QwLEYkLEMkLEwkLE0kLHYkLE8kLFMkLGokLHckLGskLEIkLHokLFYkLEgkLFgkLEskLEokLG4wLFUkLFokLFEkXTtjbGFzcyBpMHt9aTAuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGkwKX0saTAuybVtb2Q9YW8oe3R5cGU6aTB9KSxpMC7JtWluaj12bih7aW1wb3J0czpbW19GXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGkwLFt7dHlwZTpBeSxhcmdzOlt7ZXhwb3J0czpvMCxkZWNsYXJhdGlvbnM6bzAsaW1wb3J0czpbX0ZdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oaTAse2RlY2xhcmF0aW9uczpmdW5jdGlvbigpe3JldHVyblt0MCxGJCxDJCxMJCxNJCx2JCxPJCxTJCxqJCx3JCxrJCxCJCx6JCxWJCxIJCxYJCxLJCxKJCxuMCxVJCxaJCxRJF19LGltcG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bX0ZdfSxleHBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW3QwLEYkLEMkLEwkLE0kLHYkLE8kLFMkLGokLHckLGskLEIkLHokLFYkLEgkLFgkLEskLEokLG4wLFUkLFokLFEkXX19KTtjb25zdCBhMD1bW1siY2FwdGlvbiJdXSxbWyJjb2xncm91cCJdLFsiY29sIl1dXTtmdW5jdGlvbiByMCh0LGUpe2lmKDEmdCYmKFJtKDAsInRoIiwzKSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtkdSgidGV4dC1hbGlnbiIsdC5qdXN0aWZ5KSxyYygxKSxEdSgiICIsdC5oZWFkZXJUZXh0LCIgIil9fWZ1bmN0aW9uIHMwKHQsZSl7aWYoMSZ0JiYoUm0oMCwidGQiLDQpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdCxuPVltKCk7ZHUoInRleHQtYWxpZ24iLG4uanVzdGlmeSkscmMoMSksRHUoIiAiLG4uZGF0YUFjY2Vzc29yKHQsbi5uYW1lKSwiICIpfX1jbGFzcyBsMHt9bDAuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGwwKX0sbDAuybVkaXI9bG8oe3R5cGU6bDAsc2VsZWN0b3JzOltbIm1hdC10YWJsZSIsInJlY3ljbGVSb3dzIiwiIl0sWyJ0YWJsZSIsIm1hdC10YWJsZSIsIiIsInJlY3ljbGVSb3dzIiwiIl1dLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6YUYsdXNlQ2xhc3M6bkZ9XSldfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChsMCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJtYXQtdGFibGVbcmVjeWNsZVJvd3NdLCB0YWJsZVttYXQtdGFibGVdW3JlY3ljbGVSb3dzXSIscHJvdmlkZXJzOlt7cHJvdmlkZTphRix1c2VDbGFzczpuRn1dfV19XSxudWxsLG51bGwpO2NsYXNzIGMwIGV4dGVuZHMgdDB7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuc3RpY2t5Q3NzQ2xhc3M9Im1hdC10YWJsZS1zdGlja3kiLHRoaXMubmVlZHNQb3NpdGlvblN0aWNreU9uRWxlbWVudD0hMX19YzAuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKGMwKSkpKG58fGMwKX19KSgpLGMwLsm1Y21wPXRvKHt0eXBlOmMwLHNlbGVjdG9yczpbWyJtYXQtdGFibGUiXSxbInRhYmxlIiwibWF0LXRhYmxlIiwiIl1dLGhvc3RBdHRyczpbMSwibWF0LXRhYmxlIl0saG9zdFZhcnM6Mixob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmcHUoIm1hdC10YWJsZS1maXhlZC1sYXlvdXQiLG4uZml4ZWRMYXlvdXQpfSxleHBvcnRBczpbIm1hdFRhYmxlIl0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTphRix1c2VDbGFzczplRn0se3Byb3ZpZGU6dDAsdXNlRXhpc3Rpbmc6YzB9LHtwcm92aWRlOnkkLHVzZUV4aXN0aW5nOmMwfSx7cHJvdmlkZTpFJCx1c2VDbGFzczpSJH0se3Byb3ZpZGU6cSQsdXNlVmFsdWU6bnVsbH1dKSx4cF0sbmdDb250ZW50U2VsZWN0b3JzOlsiY2FwdGlvbiIsImNvbGdyb3VwLCBjb2wiXSxkZWNsczo2LHZhcnM6MCxjb25zdHM6W1siaGVhZGVyUm93T3V0bGV0IiwiIl0sWyJyb3dPdXRsZXQiLCIiXSxbIm5vRGF0YVJvd091dGxldCIsIiJdLFsiZm9vdGVyUm93T3V0bGV0IiwiIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabShhMCksWG0oMCksWG0oMSwxKSxJbSgyLDApLEltKDMsMSksSW0oNCwyKSxJbSg1LDMpKX0sZGlyZWN0aXZlczpbSyQsWCQsUSQsSiRdLHN0eWxlczpbJ21hdC10YWJsZXtkaXNwbGF5OmJsb2NrfW1hdC1oZWFkZXItcm93e21pbi1oZWlnaHQ6NTZweH1tYXQtcm93LG1hdC1mb290ZXItcm93e21pbi1oZWlnaHQ6NDhweH1tYXQtcm93LG1hdC1oZWFkZXItcm93LG1hdC1mb290ZXItcm93e2Rpc3BsYXk6ZmxleDtib3JkZXItd2lkdGg6MDtib3JkZXItYm90dG9tLXdpZHRoOjFweDtib3JkZXItc3R5bGU6c29saWQ7YWxpZ24taXRlbXM6Y2VudGVyO2JveC1zaXppbmc6Ym9yZGVyLWJveH1tYXQtcm93OjphZnRlcixtYXQtaGVhZGVyLXJvdzo6YWZ0ZXIsbWF0LWZvb3Rlci1yb3c6OmFmdGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO21pbi1oZWlnaHQ6aW5oZXJpdDtjb250ZW50OiIifW1hdC1jZWxsOmZpcnN0LW9mLXR5cGUsbWF0LWhlYWRlci1jZWxsOmZpcnN0LW9mLXR5cGUsbWF0LWZvb3Rlci1jZWxsOmZpcnN0LW9mLXR5cGV7cGFkZGluZy1sZWZ0OjI0cHh9W2Rpcj1ydGxdIG1hdC1jZWxsOmZpcnN0LW9mLXR5cGU6bm90KDpvbmx5LW9mLXR5cGUpLFtkaXI9cnRsXSBtYXQtaGVhZGVyLWNlbGw6Zmlyc3Qtb2YtdHlwZTpub3QoOm9ubHktb2YtdHlwZSksW2Rpcj1ydGxdIG1hdC1mb290ZXItY2VsbDpmaXJzdC1vZi10eXBlOm5vdCg6b25seS1vZi10eXBlKXtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjI0cHh9bWF0LWNlbGw6bGFzdC1vZi10eXBlLG1hdC1oZWFkZXItY2VsbDpsYXN0LW9mLXR5cGUsbWF0LWZvb3Rlci1jZWxsOmxhc3Qtb2YtdHlwZXtwYWRkaW5nLXJpZ2h0OjI0cHh9W2Rpcj1ydGxdIG1hdC1jZWxsOmxhc3Qtb2YtdHlwZTpub3QoOm9ubHktb2YtdHlwZSksW2Rpcj1ydGxdIG1hdC1oZWFkZXItY2VsbDpsYXN0LW9mLXR5cGU6bm90KDpvbmx5LW9mLXR5cGUpLFtkaXI9cnRsXSBtYXQtZm9vdGVyLWNlbGw6bGFzdC1vZi10eXBlOm5vdCg6b25seS1vZi10eXBlKXtwYWRkaW5nLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjI0cHh9bWF0LWNlbGwsbWF0LWhlYWRlci1jZWxsLG1hdC1mb290ZXItY2VsbHtmbGV4OjE7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtvdmVyZmxvdzpoaWRkZW47d29yZC13cmFwOmJyZWFrLXdvcmQ7bWluLWhlaWdodDppbmhlcml0fXRhYmxlLm1hdC10YWJsZXtib3JkZXItc3BhY2luZzowfXRyLm1hdC1oZWFkZXItcm93e2hlaWdodDo1NnB4fXRyLm1hdC1yb3csdHIubWF0LWZvb3Rlci1yb3d7aGVpZ2h0OjQ4cHh9dGgubWF0LWhlYWRlci1jZWxse3RleHQtYWxpZ246bGVmdH1bZGlyPXJ0bF0gdGgubWF0LWhlYWRlci1jZWxse3RleHQtYWxpZ246cmlnaHR9dGgubWF0LWhlYWRlci1jZWxsLHRkLm1hdC1jZWxsLHRkLm1hdC1mb290ZXItY2VsbHtwYWRkaW5nOjA7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHg7Ym9yZGVyLWJvdHRvbS1zdHlsZTpzb2xpZH10aC5tYXQtaGVhZGVyLWNlbGw6Zmlyc3Qtb2YtdHlwZSx0ZC5tYXQtY2VsbDpmaXJzdC1vZi10eXBlLHRkLm1hdC1mb290ZXItY2VsbDpmaXJzdC1vZi10eXBle3BhZGRpbmctbGVmdDoyNHB4fVtkaXI9cnRsXSB0aC5tYXQtaGVhZGVyLWNlbGw6Zmlyc3Qtb2YtdHlwZTpub3QoOm9ubHktb2YtdHlwZSksW2Rpcj1ydGxdIHRkLm1hdC1jZWxsOmZpcnN0LW9mLXR5cGU6bm90KDpvbmx5LW9mLXR5cGUpLFtkaXI9cnRsXSB0ZC5tYXQtZm9vdGVyLWNlbGw6Zmlyc3Qtb2YtdHlwZTpub3QoOm9ubHktb2YtdHlwZSl7cGFkZGluZy1sZWZ0OjA7cGFkZGluZy1yaWdodDoyNHB4fXRoLm1hdC1oZWFkZXItY2VsbDpsYXN0LW9mLXR5cGUsdGQubWF0LWNlbGw6bGFzdC1vZi10eXBlLHRkLm1hdC1mb290ZXItY2VsbDpsYXN0LW9mLXR5cGV7cGFkZGluZy1yaWdodDoyNHB4fVtkaXI9cnRsXSB0aC5tYXQtaGVhZGVyLWNlbGw6bGFzdC1vZi10eXBlOm5vdCg6b25seS1vZi10eXBlKSxbZGlyPXJ0bF0gdGQubWF0LWNlbGw6bGFzdC1vZi10eXBlOm5vdCg6b25seS1vZi10eXBlKSxbZGlyPXJ0bF0gdGQubWF0LWZvb3Rlci1jZWxsOmxhc3Qtb2YtdHlwZTpub3QoOm9ubHktb2YtdHlwZSl7cGFkZGluZy1yaWdodDowO3BhZGRpbmctbGVmdDoyNHB4fS5tYXQtdGFibGUtc3RpY2t5e3Bvc2l0aW9uOi13ZWJraXQtc3RpY2t5ICFpbXBvcnRhbnQ7cG9zaXRpb246c3RpY2t5ICFpbXBvcnRhbnR9Lm1hdC10YWJsZS1maXhlZC1sYXlvdXR7dGFibGUtbGF5b3V0OmZpeGVkfVxuJ10sZW5jYXBzdWxhdGlvbjoyfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChjMCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtYXQtdGFibGUsIHRhYmxlW21hdC10YWJsZV0iLGV4cG9ydEFzOiJtYXRUYWJsZSIsdGVtcGxhdGU6JCQsaG9zdDp7Y2xhc3M6Im1hdC10YWJsZSIsIltjbGFzcy5tYXQtdGFibGUtZml4ZWQtbGF5b3V0XSI6ImZpeGVkTGF5b3V0In0scHJvdmlkZXJzOlt7cHJvdmlkZTphRix1c2VDbGFzczplRn0se3Byb3ZpZGU6dDAsdXNlRXhpc3Rpbmc6YzB9LHtwcm92aWRlOnkkLHVzZUV4aXN0aW5nOmMwfSx7cHJvdmlkZTpFJCx1c2VDbGFzczpSJH0se3Byb3ZpZGU6cSQsdXNlVmFsdWU6bnVsbH1dLGVuY2Fwc3VsYXRpb246SG4uTm9uZSxjaGFuZ2VEZXRlY3Rpb246em4uRGVmYXVsdCxzdHlsZXM6WydtYXQtdGFibGV7ZGlzcGxheTpibG9ja31tYXQtaGVhZGVyLXJvd3ttaW4taGVpZ2h0OjU2cHh9bWF0LXJvdyxtYXQtZm9vdGVyLXJvd3ttaW4taGVpZ2h0OjQ4cHh9bWF0LXJvdyxtYXQtaGVhZGVyLXJvdyxtYXQtZm9vdGVyLXJvd3tkaXNwbGF5OmZsZXg7Ym9yZGVyLXdpZHRoOjA7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHg7Ym9yZGVyLXN0eWxlOnNvbGlkO2FsaWduLWl0ZW1zOmNlbnRlcjtib3gtc2l6aW5nOmJvcmRlci1ib3h9bWF0LXJvdzo6YWZ0ZXIsbWF0LWhlYWRlci1yb3c6OmFmdGVyLG1hdC1mb290ZXItcm93OjphZnRlcntkaXNwbGF5OmlubGluZS1ibG9jazttaW4taGVpZ2h0OmluaGVyaXQ7Y29udGVudDoiIn1tYXQtY2VsbDpmaXJzdC1vZi10eXBlLG1hdC1oZWFkZXItY2VsbDpmaXJzdC1vZi10eXBlLG1hdC1mb290ZXItY2VsbDpmaXJzdC1vZi10eXBle3BhZGRpbmctbGVmdDoyNHB4fVtkaXI9cnRsXSBtYXQtY2VsbDpmaXJzdC1vZi10eXBlOm5vdCg6b25seS1vZi10eXBlKSxbZGlyPXJ0bF0gbWF0LWhlYWRlci1jZWxsOmZpcnN0LW9mLXR5cGU6bm90KDpvbmx5LW9mLXR5cGUpLFtkaXI9cnRsXSBtYXQtZm9vdGVyLWNlbGw6Zmlyc3Qtb2YtdHlwZTpub3QoOm9ubHktb2YtdHlwZSl7cGFkZGluZy1sZWZ0OjA7cGFkZGluZy1yaWdodDoyNHB4fW1hdC1jZWxsOmxhc3Qtb2YtdHlwZSxtYXQtaGVhZGVyLWNlbGw6bGFzdC1vZi10eXBlLG1hdC1mb290ZXItY2VsbDpsYXN0LW9mLXR5cGV7cGFkZGluZy1yaWdodDoyNHB4fVtkaXI9cnRsXSBtYXQtY2VsbDpsYXN0LW9mLXR5cGU6bm90KDpvbmx5LW9mLXR5cGUpLFtkaXI9cnRsXSBtYXQtaGVhZGVyLWNlbGw6bGFzdC1vZi10eXBlOm5vdCg6b25seS1vZi10eXBlKSxbZGlyPXJ0bF0gbWF0LWZvb3Rlci1jZWxsOmxhc3Qtb2YtdHlwZTpub3QoOm9ubHktb2YtdHlwZSl7cGFkZGluZy1yaWdodDowO3BhZGRpbmctbGVmdDoyNHB4fW1hdC1jZWxsLG1hdC1oZWFkZXItY2VsbCxtYXQtZm9vdGVyLWNlbGx7ZmxleDoxO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7b3ZlcmZsb3c6aGlkZGVuO3dvcmQtd3JhcDpicmVhay13b3JkO21pbi1oZWlnaHQ6aW5oZXJpdH10YWJsZS5tYXQtdGFibGV7Ym9yZGVyLXNwYWNpbmc6MH10ci5tYXQtaGVhZGVyLXJvd3toZWlnaHQ6NTZweH10ci5tYXQtcm93LHRyLm1hdC1mb290ZXItcm93e2hlaWdodDo0OHB4fXRoLm1hdC1oZWFkZXItY2VsbHt0ZXh0LWFsaWduOmxlZnR9W2Rpcj1ydGxdIHRoLm1hdC1oZWFkZXItY2VsbHt0ZXh0LWFsaWduOnJpZ2h0fXRoLm1hdC1oZWFkZXItY2VsbCx0ZC5tYXQtY2VsbCx0ZC5tYXQtZm9vdGVyLWNlbGx7cGFkZGluZzowO2JvcmRlci1ib3R0b20td2lkdGg6MXB4O2JvcmRlci1ib3R0b20tc3R5bGU6c29saWR9dGgubWF0LWhlYWRlci1jZWxsOmZpcnN0LW9mLXR5cGUsdGQubWF0LWNlbGw6Zmlyc3Qtb2YtdHlwZSx0ZC5tYXQtZm9vdGVyLWNlbGw6Zmlyc3Qtb2YtdHlwZXtwYWRkaW5nLWxlZnQ6MjRweH1bZGlyPXJ0bF0gdGgubWF0LWhlYWRlci1jZWxsOmZpcnN0LW9mLXR5cGU6bm90KDpvbmx5LW9mLXR5cGUpLFtkaXI9cnRsXSB0ZC5tYXQtY2VsbDpmaXJzdC1vZi10eXBlOm5vdCg6b25seS1vZi10eXBlKSxbZGlyPXJ0bF0gdGQubWF0LWZvb3Rlci1jZWxsOmZpcnN0LW9mLXR5cGU6bm90KDpvbmx5LW9mLXR5cGUpe3BhZGRpbmctbGVmdDowO3BhZGRpbmctcmlnaHQ6MjRweH10aC5tYXQtaGVhZGVyLWNlbGw6bGFzdC1vZi10eXBlLHRkLm1hdC1jZWxsOmxhc3Qtb2YtdHlwZSx0ZC5tYXQtZm9vdGVyLWNlbGw6bGFzdC1vZi10eXBle3BhZGRpbmctcmlnaHQ6MjRweH1bZGlyPXJ0bF0gdGgubWF0LWhlYWRlci1jZWxsOmxhc3Qtb2YtdHlwZTpub3QoOm9ubHktb2YtdHlwZSksW2Rpcj1ydGxdIHRkLm1hdC1jZWxsOmxhc3Qtb2YtdHlwZTpub3QoOm9ubHktb2YtdHlwZSksW2Rpcj1ydGxdIHRkLm1hdC1mb290ZXItY2VsbDpsYXN0LW9mLXR5cGU6bm90KDpvbmx5LW9mLXR5cGUpe3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MjRweH0ubWF0LXRhYmxlLXN0aWNreXtwb3NpdGlvbjotd2Via2l0LXN0aWNreSAhaW1wb3J0YW50O3Bvc2l0aW9uOnN0aWNreSAhaW1wb3J0YW50fS5tYXQtdGFibGUtZml4ZWQtbGF5b3V0e3RhYmxlLWxheW91dDpmaXhlZH1cbiddfV19XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgZDAgZXh0ZW5kcyBDJHt9ZDAuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKGQwKSkpKG58fGQwKX19KSgpLGQwLsm1ZGlyPWxvKHt0eXBlOmQwLHNlbGVjdG9yczpbWyIiLCJtYXRDZWxsRGVmIiwiIl1dLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6QyQsdXNlRXhpc3Rpbmc6ZDB9XSkseHBdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChkMCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbWF0Q2VsbERlZl0iLHByb3ZpZGVyczpbe3Byb3ZpZGU6QyQsdXNlRXhpc3Rpbmc6ZDB9XX1dfV0sbnVsbCxudWxsKTtjbGFzcyBwMCBleHRlbmRzIE0ke31wMC7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEocDApKSkobnx8cDApfX0pKCkscDAuybVkaXI9bG8oe3R5cGU6cDAsc2VsZWN0b3JzOltbIiIsIm1hdEhlYWRlckNlbGxEZWYiLCIiXV0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTpNJCx1c2VFeGlzdGluZzpwMH1dKSx4cF19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHAwLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IlttYXRIZWFkZXJDZWxsRGVmXSIscHJvdmlkZXJzOlt7cHJvdmlkZTpNJCx1c2VFeGlzdGluZzpwMH1dfV19XSxudWxsLG51bGwpO2NsYXNzIG0wIGV4dGVuZHMgdiR7fW0wLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYShtMCkpKShufHxtMCl9fSkoKSxtMC7JtWRpcj1sbyh7dHlwZTptMCxzZWxlY3RvcnM6W1siIiwibWF0Rm9vdGVyQ2VsbERlZiIsIiJdXSxmZWF0dXJlczpbcGcoW3twcm92aWRlOnYkLHVzZUV4aXN0aW5nOm0wfV0pLHhwXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobTAsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW21hdEZvb3RlckNlbGxEZWZdIixwcm92aWRlcnM6W3twcm92aWRlOnYkLHVzZUV4aXN0aW5nOm0wfV19XX1dLG51bGwsbnVsbCk7Y2xhc3MgdTAgZXh0ZW5kcyBPJHtnZXQgbmFtZSgpe3JldHVybiB0aGlzLl9uYW1lfXNldCBuYW1lKHQpe3RoaXMuX3NldE5hbWVJbnB1dCh0KX1fdXBkYXRlQ29sdW1uQ3NzQ2xhc3NOYW1lKCl7c3VwZXIuX3VwZGF0ZUNvbHVtbkNzc0NsYXNzTmFtZSgpLHRoaXMuX2NvbHVtbkNzc0NsYXNzTmFtZS5wdXNoKGBtYXQtY29sdW1uLSR7dGhpcy5jc3NDbGFzc0ZyaWVuZGx5TmFtZX1gKX19dTAuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKHUwKSkpKG58fHUwKX19KSgpLHUwLsm1ZGlyPWxvKHt0eXBlOnUwLHNlbGVjdG9yczpbWyIiLCJtYXRDb2x1bW5EZWYiLCIiXV0saW5wdXRzOntzdGlja3k6InN0aWNreSIsbmFtZTpbIm1hdENvbHVtbkRlZiIsIm5hbWUiXX0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTpPJCx1c2VFeGlzdGluZzp1MH0se3Byb3ZpZGU6Ik1BVF9TT1JUX0hFQURFUl9DT0xVTU5fREVGIix1c2VFeGlzdGluZzp1MH1dKSx4cF19KSx1MC5wcm9wRGVjb3JhdG9ycz17bmFtZTpbe3R5cGU6eHksYXJnczpbIm1hdENvbHVtbkRlZiJdfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodTAsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW21hdENvbHVtbkRlZl0iLGlucHV0czpbInN0aWNreSJdLHByb3ZpZGVyczpbe3Byb3ZpZGU6TyQsdXNlRXhpc3Rpbmc6dTB9LHtwcm92aWRlOiJNQVRfU09SVF9IRUFERVJfQ09MVU1OX0RFRiIsdXNlRXhpc3Rpbmc6dTB9XX1dfV0sbnVsbCx7bmFtZTpbe3R5cGU6eHksYXJnczpbIm1hdENvbHVtbkRlZiJdfV19KTtjbGFzcyBmMCBleHRlbmRzIHcke31mMC7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoZjApKSkobnx8ZjApfX0pKCksZjAuybVkaXI9bG8oe3R5cGU6ZjAsc2VsZWN0b3JzOltbIm1hdC1oZWFkZXItY2VsbCJdLFsidGgiLCJtYXQtaGVhZGVyLWNlbGwiLCIiXV0saG9zdEF0dHJzOlsicm9sZSIsImNvbHVtbmhlYWRlciIsMSwibWF0LWhlYWRlci1jZWxsIl0sZmVhdHVyZXM6W3hwXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZjAsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoibWF0LWhlYWRlci1jZWxsLCB0aFttYXQtaGVhZGVyLWNlbGxdIixob3N0OntjbGFzczoibWF0LWhlYWRlci1jZWxsIixyb2xlOiJjb2x1bW5oZWFkZXIifX1dfV0sbnVsbCxudWxsKTtjbGFzcyBnMCBleHRlbmRzIGske31nMC7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoZzApKSkobnx8ZzApfX0pKCksZzAuybVkaXI9bG8oe3R5cGU6ZzAsc2VsZWN0b3JzOltbIm1hdC1mb290ZXItY2VsbCJdLFsidGQiLCJtYXQtZm9vdGVyLWNlbGwiLCIiXV0saG9zdEF0dHJzOlsicm9sZSIsImdyaWRjZWxsIiwxLCJtYXQtZm9vdGVyLWNlbGwiXSxmZWF0dXJlczpbeHBdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChnMCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJtYXQtZm9vdGVyLWNlbGwsIHRkW21hdC1mb290ZXItY2VsbF0iLGhvc3Q6e2NsYXNzOiJtYXQtZm9vdGVyLWNlbGwiLHJvbGU6ImdyaWRjZWxsIn19XX1dLG51bGwsbnVsbCk7Y2xhc3MgaDAgZXh0ZW5kcyBTJHt9aDAuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKGgwKSkpKG58fGgwKX19KSgpLGgwLsm1ZGlyPWxvKHt0eXBlOmgwLHNlbGVjdG9yczpbWyJtYXQtY2VsbCJdLFsidGQiLCJtYXQtY2VsbCIsIiJdXSxob3N0QXR0cnM6WyJyb2xlIiwiZ3JpZGNlbGwiLDEsIm1hdC1jZWxsIl0sZmVhdHVyZXM6W3hwXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoaDAsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoibWF0LWNlbGwsIHRkW21hdC1jZWxsXSIsaG9zdDp7Y2xhc3M6Im1hdC1jZWxsIixyb2xlOiJncmlkY2VsbCJ9fV19XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY2xhc3MgYjAgZXh0ZW5kcyB6JHt9YjAuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKGIwKSkpKG58fGIwKX19KSgpLGIwLsm1ZGlyPWxvKHt0eXBlOmIwLHNlbGVjdG9yczpbWyIiLCJtYXRIZWFkZXJSb3dEZWYiLCIiXV0saW5wdXRzOntjb2x1bW5zOlsibWF0SGVhZGVyUm93RGVmIiwiY29sdW1ucyJdLHN0aWNreTpbIm1hdEhlYWRlclJvd0RlZlN0aWNreSIsInN0aWNreSJdfSxmZWF0dXJlczpbcGcoW3twcm92aWRlOnokLHVzZUV4aXN0aW5nOmIwfV0pLHhwXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoYjAsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW21hdEhlYWRlclJvd0RlZl0iLHByb3ZpZGVyczpbe3Byb3ZpZGU6eiQsdXNlRXhpc3Rpbmc6YjB9XSxpbnB1dHM6WyJjb2x1bW5zOiBtYXRIZWFkZXJSb3dEZWYiLCJzdGlja3k6IG1hdEhlYWRlclJvd0RlZlN0aWNreSJdfV19XSxudWxsLG51bGwpO2NsYXNzIHkwIGV4dGVuZHMgSCR7fXkwLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYSh5MCkpKShufHx5MCl9fSkoKSx5MC7JtWRpcj1sbyh7dHlwZTp5MCxzZWxlY3RvcnM6W1siIiwibWF0Rm9vdGVyUm93RGVmIiwiIl1dLGlucHV0czp7Y29sdW1uczpbIm1hdEZvb3RlclJvd0RlZiIsImNvbHVtbnMiXSxzdGlja3k6WyJtYXRGb290ZXJSb3dEZWZTdGlja3kiLCJzdGlja3kiXX0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTpIJCx1c2VFeGlzdGluZzp5MH1dKSx4cF19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHkwLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6IlttYXRGb290ZXJSb3dEZWZdIixwcm92aWRlcnM6W3twcm92aWRlOkgkLHVzZUV4aXN0aW5nOnkwfV0saW5wdXRzOlsiY29sdW1uczogbWF0Rm9vdGVyUm93RGVmIiwic3RpY2t5OiBtYXRGb290ZXJSb3dEZWZTdGlja3kiXX1dfV0sbnVsbCxudWxsKTtjbGFzcyBfMCBleHRlbmRzIEYke31fMC7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoXzApKSkobnx8XzApfX0pKCksXzAuybVkaXI9bG8oe3R5cGU6XzAsc2VsZWN0b3JzOltbIiIsIm1hdFJvd0RlZiIsIiJdXSxpbnB1dHM6e2NvbHVtbnM6WyJtYXRSb3dEZWZDb2x1bW5zIiwiY29sdW1ucyJdLHdoZW46WyJtYXRSb3dEZWZXaGVuIiwid2hlbiJdfSxmZWF0dXJlczpbcGcoW3twcm92aWRlOkYkLHVzZUV4aXN0aW5nOl8wfV0pLHhwXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoXzAsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW21hdFJvd0RlZl0iLHByb3ZpZGVyczpbe3Byb3ZpZGU6RiQsdXNlRXhpc3Rpbmc6XzB9XSxpbnB1dHM6WyJjb2x1bW5zOiBtYXRSb3dEZWZDb2x1bW5zIiwid2hlbjogbWF0Um93RGVmV2hlbiJdfV19XSxudWxsLG51bGwpO2NsYXNzIEMwIGV4dGVuZHMgQiR7fUMwLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYShDMCkpKShufHxDMCl9fSkoKSxDMC7JtWNtcD10byh7dHlwZTpDMCxzZWxlY3RvcnM6W1sibWF0LWhlYWRlci1yb3ciXSxbInRyIiwibWF0LWhlYWRlci1yb3ciLCIiXV0saG9zdEF0dHJzOlsicm9sZSIsInJvdyIsMSwibWF0LWhlYWRlci1yb3ciXSxleHBvcnRBczpbIm1hdEhlYWRlclJvdyJdLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6QiQsdXNlRXhpc3Rpbmc6QzB9XSkseHBdLGRlY2xzOjEsdmFyczowLGNvbnN0czpbWyJjZGtDZWxsT3V0bGV0IiwiIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJkltKDAsMCl9LGRpcmVjdGl2ZXM6W0wkXSxlbmNhcHN1bGF0aW9uOjJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEMwLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC1oZWFkZXItcm93LCB0clttYXQtaGVhZGVyLXJvd10iLHRlbXBsYXRlOkEkLGhvc3Q6e2NsYXNzOiJtYXQtaGVhZGVyLXJvdyIscm9sZToicm93In0sY2hhbmdlRGV0ZWN0aW9uOnpuLkRlZmF1bHQsZW5jYXBzdWxhdGlvbjpIbi5Ob25lLGV4cG9ydEFzOiJtYXRIZWFkZXJSb3ciLHByb3ZpZGVyczpbe3Byb3ZpZGU6QiQsdXNlRXhpc3Rpbmc6QzB9XX1dfV0sbnVsbCxudWxsKTtjbGFzcyBNMCBleHRlbmRzIFYke31NMC7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoTTApKSkobnx8TTApfX0pKCksTTAuybVjbXA9dG8oe3R5cGU6TTAsc2VsZWN0b3JzOltbIm1hdC1mb290ZXItcm93Il0sWyJ0ciIsIm1hdC1mb290ZXItcm93IiwiIl1dLGhvc3RBdHRyczpbInJvbGUiLCJyb3ciLDEsIm1hdC1mb290ZXItcm93Il0sZXhwb3J0QXM6WyJtYXRGb290ZXJSb3ciXSxmZWF0dXJlczpbcGcoW3twcm92aWRlOlYkLHVzZUV4aXN0aW5nOk0wfV0pLHhwXSxkZWNsczoxLHZhcnM6MCxjb25zdHM6W1siY2RrQ2VsbE91dGxldCIsIiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiZJbSgwLDApfSxkaXJlY3RpdmVzOltMJF0sZW5jYXBzdWxhdGlvbjoyfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChNMCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtYXQtZm9vdGVyLXJvdywgdHJbbWF0LWZvb3Rlci1yb3ddIix0ZW1wbGF0ZTpBJCxob3N0OntjbGFzczoibWF0LWZvb3Rlci1yb3ciLHJvbGU6InJvdyJ9LGNoYW5nZURldGVjdGlvbjp6bi5EZWZhdWx0LGVuY2Fwc3VsYXRpb246SG4uTm9uZSxleHBvcnRBczoibWF0Rm9vdGVyUm93Iixwcm92aWRlcnM6W3twcm92aWRlOlYkLHVzZUV4aXN0aW5nOk0wfV19XX1dLG51bGwsbnVsbCk7Y2xhc3MgdjAgZXh0ZW5kcyBqJHt9djAuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKHYwKSkpKG58fHYwKX19KSgpLHYwLsm1Y21wPXRvKHt0eXBlOnYwLHNlbGVjdG9yczpbWyJtYXQtcm93Il0sWyJ0ciIsIm1hdC1yb3ciLCIiXV0saG9zdEF0dHJzOlsicm9sZSIsInJvdyIsMSwibWF0LXJvdyJdLGV4cG9ydEFzOlsibWF0Um93Il0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTpqJCx1c2VFeGlzdGluZzp2MH1dKSx4cF0sZGVjbHM6MSx2YXJzOjAsY29uc3RzOltbImNka0NlbGxPdXRsZXQiLCIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmSW0oMCwwKX0sZGlyZWN0aXZlczpbTCRdLGVuY2Fwc3VsYXRpb246Mn0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodjAsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWF0LXJvdywgdHJbbWF0LXJvd10iLHRlbXBsYXRlOkEkLGhvc3Q6e2NsYXNzOiJtYXQtcm93Iixyb2xlOiJyb3cifSxjaGFuZ2VEZXRlY3Rpb246em4uRGVmYXVsdCxlbmNhcHN1bGF0aW9uOkhuLk5vbmUsZXhwb3J0QXM6Im1hdFJvdyIscHJvdmlkZXJzOlt7cHJvdmlkZTpqJCx1c2VFeGlzdGluZzp2MH1dfV19XSxudWxsLG51bGwpO2NsYXNzIHgwIGV4dGVuZHMgVSR7fXgwLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYSh4MCkpKShufHx4MCl9fSkoKSx4MC7JtWRpcj1sbyh7dHlwZTp4MCxzZWxlY3RvcnM6W1sibmctdGVtcGxhdGUiLCJtYXROb0RhdGFSb3ciLCIiXV0sZmVhdHVyZXM6W3BnKFt7cHJvdmlkZTpVJCx1c2VFeGlzdGluZzp4MH1dKSx4cF19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHgwLFt7dHlwZTpDeSxhcmdzOlt7c2VsZWN0b3I6Im5nLXRlbXBsYXRlW21hdE5vRGF0YVJvd10iLHByb3ZpZGVyczpbe3Byb3ZpZGU6VSQsdXNlRXhpc3Rpbmc6eDB9XX1dfV0sbnVsbCxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIE8wIGV4dGVuZHMgbjB7fU8wLsm1ZmFjPShmdW5jdGlvbigpe2xldCB0O3JldHVybiBmdW5jdGlvbiBlKG4pe3JldHVybih0fHwodD1BYShPMCkpKShufHxPMCl9fSkoKSxPMC7JtWNtcD10byh7dHlwZTpPMCxzZWxlY3RvcnM6W1sibWF0LXRleHQtY29sdW1uIl1dLGZlYXR1cmVzOlt4cF0sZGVjbHM6Myx2YXJzOjAsY29uc3RzOltbIm1hdENvbHVtbkRlZiIsIiJdLFsibWF0LWhlYWRlci1jZWxsIiwiIiwzLCJ0ZXh0LWFsaWduIiw0LCJtYXRIZWFkZXJDZWxsRGVmIl0sWyJtYXQtY2VsbCIsIiIsMywidGV4dC1hbGlnbiIsNCwibWF0Q2VsbERlZiJdLFsibWF0LWhlYWRlci1jZWxsIiwiIl0sWyJtYXQtY2VsbCIsIiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoTm0oMCwwKSxRcCgxLHIwLDIsMywidGgiLDEpLFFwKDIsczAsMiwzLCJ0ZCIsMiksem0oKSl9LGRpcmVjdGl2ZXM6W3UwLHAwLGQwLGYwLGgwXSxlbmNhcHN1bGF0aW9uOjJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKE8wLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1hdC10ZXh0LWNvbHVtbiIsdGVtcGxhdGU6J1xuICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPlxuICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbc3R5bGUudGV4dC1hbGlnbl09Imp1c3RpZnkiPlxuICAgICAgICB7e2hlYWRlclRleHR9fVxuICAgICAgPC90aD5cbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj0ibGV0IGRhdGEiIFtzdHlsZS50ZXh0LWFsaWduXT0ianVzdGlmeSI+XG4gICAgICAgIHt7ZGF0YUFjY2Vzc29yKGRhdGEsIG5hbWUpfX1cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICcsZW5jYXBzdWxhdGlvbjpIbi5Ob25lLGNoYW5nZURldGVjdGlvbjp6bi5EZWZhdWx0fV19XSxudWxsLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgUDA9W2MwLGwwLHAwLGIwLHUwLGQwLF8wLG0wLHkwLGYwLGgwLGcwLEMwLHYwLE0wLHgwLE8wXTtjbGFzcyB3MHt9dzAuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHcwKX0sdzAuybVtb2Q9YW8oe3R5cGU6dzB9KSx3MC7JtWluaj12bih7aW1wb3J0czpbW2kwLFhJXSxYSV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHcwLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbaTAsWEldLGV4cG9ydHM6W1hJLFAwXSxkZWNsYXJhdGlvbnM6UDB9XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyh3MCx7ZGVjbGFyYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuW2MwLGwwLHAwLGIwLHUwLGQwLF8wLG0wLHkwLGYwLGgwLGcwLEMwLHYwLE0wLHgwLE8wXX0saW1wb3J0czpmdW5jdGlvbigpe3JldHVybltpMCxYSV19LGV4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bWEksYzAsbDAscDAsYjAsdTAsZDAsXzAsbTAseTAsZjAsaDAsZzAsQzAsdjAsTTAseDAsTzBdfX0pO2NsYXNzIGswIGV4dGVuZHMgUUh7Y29uc3RydWN0b3IodD1bXSl7c3VwZXIoKSx0aGlzLl9yZW5kZXJEYXRhPW5ldyBGKFtdKSx0aGlzLl9maWx0ZXI9bmV3IEYoIiIpLHRoaXMuX2ludGVybmFsUGFnZUNoYW5nZXM9bmV3IEksdGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbj1udWxsLHRoaXMuc29ydGluZ0RhdGFBY2Nlc3Nvcj0odCxlKT0+e2NvbnN0IG49dFtlXTtpZihDeihuKSl7Y29uc3QgdD1OdW1iZXIobik7cmV0dXJuIHQ8OTAwNzE5OTI1NDc0MDk5MT90Om59cmV0dXJuIG59LHRoaXMuc29ydERhdGE9KHQsZSk9Pntjb25zdCBuPWUuYWN0aXZlLG89ZS5kaXJlY3Rpb247cmV0dXJuIG4mJiIiIT1vP3Quc29ydCgoKHQsZSk9PntsZXQgaT10aGlzLnNvcnRpbmdEYXRhQWNjZXNzb3IodCxuKSxhPXRoaXMuc29ydGluZ0RhdGFBY2Nlc3NvcihlLG4pO2NvbnN0IHI9dHlwZW9mIGkscz10eXBlb2YgYTtyIT09cyYmKCJudW1iZXIiPT09ciYmKGkrPSIiKSwibnVtYmVyIj09PXMmJihhKz0iIikpO2xldCBsPTA7cmV0dXJuIG51bGwhPWkmJm51bGwhPWE/aT5hP2w9MTppPGEmJihsPS0xKTpudWxsIT1pP2w9MTpudWxsIT1hJiYobD0tMSksbCooImFzYyI9PW8/MTotMSl9KSk6dH0sdGhpcy5maWx0ZXJQcmVkaWNhdGU9KHQsZSk9Pntjb25zdCBuPU9iamVjdC5rZXlzKHQpLnJlZHVjZSgoKGUsbik9PmUrdFtuXSsi4pesIiksIiIpLnRvTG93ZXJDYXNlKCksbz1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpO3JldHVybi0xIT1uLmluZGV4T2Yobyl9LHRoaXMuX2RhdGE9bmV3IEYodCksdGhpcy5fdXBkYXRlQ2hhbmdlU3Vic2NyaXB0aW9uKCl9Z2V0IGRhdGEoKXtyZXR1cm4gdGhpcy5fZGF0YS52YWx1ZX1zZXQgZGF0YSh0KXt0aGlzLl9kYXRhLm5leHQodCksdGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbnx8dGhpcy5fZmlsdGVyRGF0YSh0KX1nZXQgZmlsdGVyKCl7cmV0dXJuIHRoaXMuX2ZpbHRlci52YWx1ZX1zZXQgZmlsdGVyKHQpe3RoaXMuX2ZpbHRlci5uZXh0KHQpLHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb258fHRoaXMuX2ZpbHRlckRhdGEodGhpcy5kYXRhKX1nZXQgc29ydCgpe3JldHVybiB0aGlzLl9zb3J0fXNldCBzb3J0KHQpe3RoaXMuX3NvcnQ9dCx0aGlzLl91cGRhdGVDaGFuZ2VTdWJzY3JpcHRpb24oKX1nZXQgcGFnaW5hdG9yKCl7cmV0dXJuIHRoaXMuX3BhZ2luYXRvcn1zZXQgcGFnaW5hdG9yKHQpe3RoaXMuX3BhZ2luYXRvcj10LHRoaXMuX3VwZGF0ZUNoYW5nZVN1YnNjcmlwdGlvbigpfV91cGRhdGVDaGFuZ2VTdWJzY3JpcHRpb24oKXt2YXIgdDtjb25zdCBlPXRoaXMuX3NvcnQ/cmUodGhpcy5fc29ydC5zb3J0Q2hhbmdlLHRoaXMuX3NvcnQuaW5pdGlhbGl6ZWQpOkV0KG51bGwpLG49dGhpcy5fcGFnaW5hdG9yP3JlKHRoaXMuX3BhZ2luYXRvci5wYWdlLHRoaXMuX2ludGVybmFsUGFnZUNoYW5nZXMsdGhpcy5fcGFnaW5hdG9yLmluaXRpYWxpemVkKTpFdChudWxsKSxvPVd0KFt0aGlzLl9kYXRhLHRoaXMuX2ZpbHRlcl0pLnBpcGUoSXQoKChbdF0pPT50aGlzLl9maWx0ZXJEYXRhKHQpKSkpLGk9V3QoW28sZV0pLnBpcGUoSXQoKChbdF0pPT50aGlzLl9vcmRlckRhdGEodCkpKSksYT1XdChbaSxuXSkucGlwZShJdCgoKFt0XSk9PnRoaXMuX3BhZ2VEYXRhKHQpKSkpO251bGw9PT0odD10aGlzLl9yZW5kZXJDaGFuZ2VzU3Vic2NyaXB0aW9uKXx8dm9pZCAwPT09dHx8dC51bnN1YnNjcmliZSgpLHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb249YS5zdWJzY3JpYmUoKHQ9PnRoaXMuX3JlbmRlckRhdGEubmV4dCh0KSkpfV9maWx0ZXJEYXRhKHQpe3JldHVybiB0aGlzLmZpbHRlcmVkRGF0YT1udWxsPT10aGlzLmZpbHRlcnx8IiI9PT10aGlzLmZpbHRlcj90OnQuZmlsdGVyKCh0PT50aGlzLmZpbHRlclByZWRpY2F0ZSh0LHRoaXMuZmlsdGVyKSkpLHRoaXMucGFnaW5hdG9yJiZ0aGlzLl91cGRhdGVQYWdpbmF0b3IodGhpcy5maWx0ZXJlZERhdGEubGVuZ3RoKSx0aGlzLmZpbHRlcmVkRGF0YX1fb3JkZXJEYXRhKHQpe3JldHVybiB0aGlzLnNvcnQ/dGhpcy5zb3J0RGF0YSh0LnNsaWNlKCksdGhpcy5zb3J0KTp0fV9wYWdlRGF0YSh0KXtpZighdGhpcy5wYWdpbmF0b3IpcmV0dXJuIHQ7Y29uc3QgZT10aGlzLnBhZ2luYXRvci5wYWdlSW5kZXgqdGhpcy5wYWdpbmF0b3IucGFnZVNpemU7cmV0dXJuIHQuc2xpY2UoZSxlK3RoaXMucGFnaW5hdG9yLnBhZ2VTaXplKX1fdXBkYXRlUGFnaW5hdG9yKHQpe1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oKCgpPT57Y29uc3QgZT10aGlzLnBhZ2luYXRvcjtpZihlJiYoZS5sZW5ndGg9dCxlLnBhZ2VJbmRleD4wKSl7Y29uc3QgdD1NYXRoLmNlaWwoZS5sZW5ndGgvZS5wYWdlU2l6ZSktMXx8MCxuPU1hdGgubWluKGUucGFnZUluZGV4LHQpO24hPT1lLnBhZ2VJbmRleCYmKGUucGFnZUluZGV4PW4sdGhpcy5faW50ZXJuYWxQYWdlQ2hhbmdlcy5uZXh0KCkpfX0pKX1jb25uZWN0KCl7cmV0dXJuIHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb258fHRoaXMuX3VwZGF0ZUNoYW5nZVN1YnNjcmlwdGlvbigpLHRoaXMuX3JlbmRlckRhdGF9ZGlzY29ubmVjdCgpe3ZhciB0O251bGw9PT0odD10aGlzLl9yZW5kZXJDaGFuZ2VzU3Vic2NyaXB0aW9uKXx8dm9pZCAwPT09dHx8dC51bnN1YnNjcmliZSgpLHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb249bnVsbH19Y2xhc3MgUzAgZXh0ZW5kcyBrMHt9Y29uc3QgRDA9WyJwYW5lbCJdO2Z1bmN0aW9uIEUwKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2IiwwLDEpLFhtKDIpLEFtKCkpLDImdCl7Y29uc3QgdD1lLmlkLG49WW0oKTtEbSgiaWQiLG4uaWQpKCJuZ0NsYXNzIixuLl9jbGFzc0xpc3QpLGpwKCJhcmlhLWxhYmVsIixuLmFyaWFMYWJlbHx8bnVsbCkoImFyaWEtbGFiZWxsZWRieSIsbi5fZ2V0UGFuZWxBcmlhTGFiZWxsZWRieSh0KSl9fWxldCBSMD0wO2NsYXNzIEEwe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5zb3VyY2U9dCx0aGlzLm9wdGlvbj1lfX1jb25zdCBUMD1RSShjbGFzc3t9KSxOMD1uZXcgR2EoIm1hdC1hdXRvY29tcGxldGUtZGVmYXVsdC1vcHRpb25zIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbiB6MCgpe3JldHVybnthdXRvQWN0aXZlRmlyc3RPcHRpb246ITF9fX0pO2NsYXNzIEkwIGV4dGVuZHMgVDB7Y29uc3RydWN0b3IodCxlLG4sbyl7c3VwZXIoKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZj10LHRoaXMuX2VsZW1lbnRSZWY9ZSx0aGlzLl9hY3RpdmVPcHRpb25DaGFuZ2VzPW0uRU1QVFksdGhpcy5zaG93UGFuZWw9ITEsdGhpcy5faXNPcGVuPSExLHRoaXMuZGlzcGxheVdpdGg9bnVsbCx0aGlzLm9wdGlvblNlbGVjdGVkPW5ldyBMaCx0aGlzLm9wZW5lZD1uZXcgTGgsdGhpcy5jbG9zZWQ9bmV3IExoLHRoaXMub3B0aW9uQWN0aXZhdGVkPW5ldyBMaCx0aGlzLl9jbGFzc0xpc3Q9e30sdGhpcy5pZD0ibWF0LWF1dG9jb21wbGV0ZS0iK1IwKyssdGhpcy5pbmVydEdyb3Vwcz0obnVsbD09bz92b2lkIDA6by5TQUZBUkkpfHwhMSx0aGlzLl9hdXRvQWN0aXZlRmlyc3RPcHRpb249ISFuLmF1dG9BY3RpdmVGaXJzdE9wdGlvbn1nZXQgaXNPcGVuKCl7cmV0dXJuIHRoaXMuX2lzT3BlbiYmdGhpcy5zaG93UGFuZWx9Z2V0IGF1dG9BY3RpdmVGaXJzdE9wdGlvbigpe3JldHVybiB0aGlzLl9hdXRvQWN0aXZlRmlyc3RPcHRpb259c2V0IGF1dG9BY3RpdmVGaXJzdE9wdGlvbih0KXt0aGlzLl9hdXRvQWN0aXZlRmlyc3RPcHRpb249eXoodCl9c2V0IGNsYXNzTGlzdCh0KXt0aGlzLl9jbGFzc0xpc3Q9dCYmdC5sZW5ndGg/KGZ1bmN0aW9uIGUodCxuPS9ccysvKXtjb25zdCBvPVtdO2lmKG51bGwhPXQpe2NvbnN0IGU9QXJyYXkuaXNBcnJheSh0KT90OmAke3R9YC5zcGxpdChuKTtmb3IoY29uc3QgdCBvZiBlKXtjb25zdCBlPWAke3R9YC50cmltKCk7ZSYmby5wdXNoKGUpfX1yZXR1cm4gb30pKHQpLnJlZHVjZSgoKHQsZSk9Pih0W2VdPSEwLHQpKSx7fSk6e30sdGhpcy5fc2V0VmlzaWJpbGl0eUNsYXNzZXModGhpcy5fY2xhc3NMaXN0KSx0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NOYW1lPSIifW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX2tleU1hbmFnZXI9bmV3IHRJKHRoaXMub3B0aW9ucykud2l0aFdyYXAoKSx0aGlzLl9hY3RpdmVPcHRpb25DaGFuZ2VzPXRoaXMuX2tleU1hbmFnZXIuY2hhbmdlLnN1YnNjcmliZSgodD0+e3RoaXMub3B0aW9uQWN0aXZhdGVkLmVtaXQoe3NvdXJjZTp0aGlzLG9wdGlvbjp0aGlzLm9wdGlvbnMudG9BcnJheSgpW3RdfHxudWxsfSl9KSksdGhpcy5fc2V0VmlzaWJpbGl0eSgpfW5nT25EZXN0cm95KCl7dGhpcy5fYWN0aXZlT3B0aW9uQ2hhbmdlcy51bnN1YnNjcmliZSgpfV9zZXRTY3JvbGxUb3AodCl7dGhpcy5wYW5lbCYmKHRoaXMucGFuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A9dCl9X2dldFNjcm9sbFRvcCgpe3JldHVybiB0aGlzLnBhbmVsP3RoaXMucGFuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A6MH1fc2V0VmlzaWJpbGl0eSgpe3RoaXMuc2hvd1BhbmVsPSEhdGhpcy5vcHRpb25zLmxlbmd0aCx0aGlzLl9zZXRWaXNpYmlsaXR5Q2xhc3Nlcyh0aGlzLl9jbGFzc0xpc3QpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpfV9lbWl0U2VsZWN0RXZlbnQodCl7Y29uc3QgZT1uZXcgQTAodGhpcyx0KTt0aGlzLm9wdGlvblNlbGVjdGVkLmVtaXQoZSl9X2dldFBhbmVsQXJpYUxhYmVsbGVkYnkodCl7cmV0dXJuIHRoaXMuYXJpYUxhYmVsP251bGw6dGhpcy5hcmlhTGFiZWxsZWRieT8odD90KyIgIjoiIikrdGhpcy5hcmlhTGFiZWxsZWRieTp0fV9zZXRWaXNpYmlsaXR5Q2xhc3Nlcyh0KXt0W3RoaXMuX3Zpc2libGVDbGFzc109dGhpcy5zaG93UGFuZWwsdFt0aGlzLl9oaWRkZW5DbGFzc109IXRoaXMuc2hvd1BhbmVsfX1JMC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8STApKFNtKFVnKSxTbShoZyksU20oTjApLFNtKHd6KSl9LEkwLsm1ZGlyPWxvKHt0eXBlOkkwLHZpZXdRdWVyeTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoUWgoWGcsNyksUWgoRDAsNSkpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4udGVtcGxhdGU9dC5maXJzdCksSmgodD10YigpKSYmKG4ucGFuZWw9dC5maXJzdCl9fSxpbnB1dHM6e2Rpc3BsYXlXaXRoOiJkaXNwbGF5V2l0aCIsYXV0b0FjdGl2ZUZpcnN0T3B0aW9uOiJhdXRvQWN0aXZlRmlyc3RPcHRpb24iLGNsYXNzTGlzdDpbImNsYXNzIiwiY2xhc3NMaXN0Il0sYXJpYUxhYmVsOlsiYXJpYS1sYWJlbCIsImFyaWFMYWJlbCJdLGFyaWFMYWJlbGxlZGJ5OlsiYXJpYS1sYWJlbGxlZGJ5IiwiYXJpYUxhYmVsbGVkYnkiXSxwYW5lbFdpZHRoOiJwYW5lbFdpZHRoIn0sb3V0cHV0czp7b3B0aW9uU2VsZWN0ZWQ6Im9wdGlvblNlbGVjdGVkIixvcGVuZWQ6Im9wZW5lZCIsY2xvc2VkOiJjbG9zZWQiLG9wdGlvbkFjdGl2YXRlZDoib3B0aW9uQWN0aXZhdGVkIn0sZmVhdHVyZXM6W3hwXX0pLEkwLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6VWd9LHt0eXBlOmhnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbTjBdfV19LHt0eXBlOnd6fV0sSTAucHJvcERlY29yYXRvcnM9e3RlbXBsYXRlOlt7dHlwZTpaYSxhcmdzOltYZyx7c3RhdGljOiEwfV19XSxwYW5lbDpbe3R5cGU6WmEsYXJnczpbInBhbmVsIl19XSxhcmlhTGFiZWw6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsIl19XSxhcmlhTGFiZWxsZWRieTpbe3R5cGU6eHksYXJnczpbImFyaWEtbGFiZWxsZWRieSJdfV0sZGlzcGxheVdpdGg6W3t0eXBlOnh5fV0sYXV0b0FjdGl2ZUZpcnN0T3B0aW9uOlt7dHlwZTp4eX1dLHBhbmVsV2lkdGg6W3t0eXBlOnh5fV0sb3B0aW9uU2VsZWN0ZWQ6W3t0eXBlOk95fV0sb3BlbmVkOlt7dHlwZTpPeX1dLGNsb3NlZDpbe3R5cGU6T3l9XSxvcHRpb25BY3RpdmF0ZWQ6W3t0eXBlOk95fV0sY2xhc3NMaXN0Olt7dHlwZTp4eSxhcmdzOlsiY2xhc3MiXX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEkwLFt7dHlwZTpDeX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpVZ30se3R5cGU6aGd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltOMF19XX0se3R5cGU6d3p9XX0pLHtkaXNwbGF5V2l0aDpbe3R5cGU6eHl9XSxvcHRpb25TZWxlY3RlZDpbe3R5cGU6T3l9XSxvcGVuZWQ6W3t0eXBlOk95fV0sY2xvc2VkOlt7dHlwZTpPeX1dLG9wdGlvbkFjdGl2YXRlZDpbe3R5cGU6T3l9XSxhdXRvQWN0aXZlRmlyc3RPcHRpb246W3t0eXBlOnh5fV0sY2xhc3NMaXN0Olt7dHlwZTp4eSxhcmdzOlsiY2xhc3MiXX1dLHRlbXBsYXRlOlt7dHlwZTpaYSxhcmdzOltYZyx7c3RhdGljOiEwfV19XSxwYW5lbDpbe3R5cGU6WmEsYXJnczpbInBhbmVsIl19XSxhcmlhTGFiZWw6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsIl19XSxhcmlhTGFiZWxsZWRieTpbe3R5cGU6eHksYXJnczpbImFyaWEtbGFiZWxsZWRieSJdfV0scGFuZWxXaWR0aDpbe3R5cGU6eHl9XX0pO2NsYXNzIEgwIGV4dGVuZHMgSTB7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX3Zpc2libGVDbGFzcz0ibWF0LWF1dG9jb21wbGV0ZS12aXNpYmxlIix0aGlzLl9oaWRkZW5DbGFzcz0ibWF0LWF1dG9jb21wbGV0ZS1oaWRkZW4ifX1IMC7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoSDApKSkobnx8SDApfX0pKCksSDAuybVjbXA9dG8oe3R5cGU6SDAsc2VsZWN0b3JzOltbIm1hdC1hdXRvY29tcGxldGUiXV0sY29udGVudFF1ZXJpZXM6ZnVuY3Rpb24gdChlLG4sbyl7aWYoMSZlJiYoJGgobyx6SCw1KSwkaChvLEJILDUpKSwyJmUpe2xldCB0O0poKHQ9dGIoKSkmJihuLm9wdGlvbkdyb3Vwcz10KSxKaCh0PXRiKCkpJiYobi5vcHRpb25zPXQpfX0saG9zdEF0dHJzOlsxLCJtYXQtYXV0b2NvbXBsZXRlIl0saW5wdXRzOntkaXNhYmxlUmlwcGxlOiJkaXNhYmxlUmlwcGxlIn0sZXhwb3J0QXM6WyJtYXRBdXRvY29tcGxldGUiXSxmZWF0dXJlczpbcGcoW3twcm92aWRlOlJILHVzZUV4aXN0aW5nOkgwfV0pLHhwXSxuZ0NvbnRlbnRTZWxlY3RvcnM6WyIqIl0sZGVjbHM6MSx2YXJzOjAsY29uc3RzOltbInJvbGUiLCJsaXN0Ym94IiwxLCJtYXQtYXV0b2NvbXBsZXRlLXBhbmVsIiwzLCJpZCIsIm5nQ2xhc3MiXSxbInBhbmVsIiwiIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabSgpLFFwKDAsRTAsMyw0LCJuZy10ZW1wbGF0ZSIpKX0sZGlyZWN0aXZlczpbYU1dLHN0eWxlczpbIi5tYXQtYXV0b2NvbXBsZXRlLXBhbmVse21pbi13aWR0aDoxMTJweDttYXgtd2lkdGg6MjgwcHg7b3ZlcmZsb3c6YXV0bzstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaDt2aXNpYmlsaXR5OmhpZGRlbjttYXgtd2lkdGg6bm9uZTttYXgtaGVpZ2h0OjI1NnB4O3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjEwMCU7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHg7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NHB4fS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsLm1hdC1hdXRvY29tcGxldGUtdmlzaWJsZXt2aXNpYmlsaXR5OnZpc2libGV9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWwubWF0LWF1dG9jb21wbGV0ZS1oaWRkZW57dmlzaWJpbGl0eTpoaWRkZW59Lm1hdC1hdXRvY29tcGxldGUtcGFuZWwtYWJvdmUgLm1hdC1hdXRvY29tcGxldGUtcGFuZWx7Ym9yZGVyLXJhZGl1czowO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6NHB4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweH0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbCAubWF0LWRpdmlkZXItaG9yaXpvbnRhbHttYXJnaW4tdG9wOi0xcHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWF1dG9jb21wbGV0ZS1wYW5lbHtvdXRsaW5lOnNvbGlkIDFweH1tYXQtYXV0b2NvbXBsZXRle2Rpc3BsYXk6bm9uZX1cbiJdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLEgwLnByb3BEZWNvcmF0b3JzPXtvcHRpb25Hcm91cHM6W3t0eXBlOllhLGFyZ3M6W3pILHtkZXNjZW5kYW50czohMH1dfV0sb3B0aW9uczpbe3R5cGU6WWEsYXJnczpbQkgse2Rlc2NlbmRhbnRzOiEwfV19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChIMCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtYXQtYXV0b2NvbXBsZXRlIix0ZW1wbGF0ZTonPG5nLXRlbXBsYXRlIGxldC1mb3JtRmllbGRJZD0iaWQiPlxuICA8ZGl2IGNsYXNzPSJtYXQtYXV0b2NvbXBsZXRlLXBhbmVsIlxuICAgICAgIHJvbGU9Imxpc3Rib3giXG4gICAgICAgW2lkXT0iaWQiXG4gICAgICAgW2F0dHIuYXJpYS1sYWJlbF09ImFyaWFMYWJlbCB8fCBudWxsIlxuICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09Il9nZXRQYW5lbEFyaWFMYWJlbGxlZGJ5KGZvcm1GaWVsZElkKSJcbiAgICAgICBbbmdDbGFzc109Il9jbGFzc0xpc3QiXG4gICAgICAgI3BhbmVsPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuJyxlbmNhcHN1bGF0aW9uOkhuLk5vbmUsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaCxleHBvcnRBczoibWF0QXV0b2NvbXBsZXRlIixpbnB1dHM6WyJkaXNhYmxlUmlwcGxlIl0saG9zdDp7Y2xhc3M6Im1hdC1hdXRvY29tcGxldGUifSxwcm92aWRlcnM6W3twcm92aWRlOlJILHVzZUV4aXN0aW5nOkgwfV0sc3R5bGVzOlsiLm1hdC1hdXRvY29tcGxldGUtcGFuZWx7bWluLXdpZHRoOjExMnB4O21heC13aWR0aDoyODBweDtvdmVyZmxvdzphdXRvOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNoO3Zpc2liaWxpdHk6aGlkZGVuO21heC13aWR0aDpub25lO21heC1oZWlnaHQ6MjU2cHg7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJTtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjRweDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czo0cHh9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWwubWF0LWF1dG9jb21wbGV0ZS12aXNpYmxle3Zpc2liaWxpdHk6dmlzaWJsZX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbC5tYXQtYXV0b2NvbXBsZXRlLWhpZGRlbnt2aXNpYmlsaXR5OmhpZGRlbn0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbC1hYm92ZSAubWF0LWF1dG9jb21wbGV0ZS1wYW5lbHtib3JkZXItcmFkaXVzOjA7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czo0cHg7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6NHB4fS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsIC5tYXQtZGl2aWRlci1ob3Jpem9udGFse21hcmdpbi10b3A6LTFweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYXV0b2NvbXBsZXRlLXBhbmVse291dGxpbmU6c29saWQgMXB4fW1hdC1hdXRvY29tcGxldGV7ZGlzcGxheTpub25lfVxuIl19XX1dLG51bGwse29wdGlvbkdyb3Vwczpbe3R5cGU6WWEsYXJnczpbekgse2Rlc2NlbmRhbnRzOiEwfV19XSxvcHRpb25zOlt7dHlwZTpZYSxhcmdzOltCSCx7ZGVzY2VuZGFudHM6ITB9XX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBGMHtjb25zdHJ1Y3Rvcih0KXt0aGlzLmVsZW1lbnRSZWY9dH19RjAuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEYwKShTbShoZykpfSxGMC7JtWRpcj1sbyh7dHlwZTpGMH0pLEYwLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9XSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEYwLFt7dHlwZTpDeX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ31dfSksbnVsbCk7Y2xhc3MgTDAgZXh0ZW5kcyBGMHt9TDAuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKEwwKSkpKG58fEwwKX19KSgpLEwwLsm1ZGlyPWxvKHt0eXBlOkwwLHNlbGVjdG9yczpbWyIiLCJtYXRBdXRvY29tcGxldGVPcmlnaW4iLCIiXV0sZXhwb3J0QXM6WyJtYXRBdXRvY29tcGxldGVPcmlnaW4iXSxmZWF0dXJlczpbeHBdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChMMCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbbWF0QXV0b2NvbXBsZXRlT3JpZ2luXSIsZXhwb3J0QXM6Im1hdEF1dG9jb21wbGV0ZU9yaWdpbiJ9XX1dLG51bGwsbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBCMD1uZXcgR2EoIm1hdC1hdXRvY29tcGxldGUtc2Nyb2xsLXN0cmF0ZWd5IiksVjA9e3Byb3ZpZGU6QjAsZGVwczpbcExdLHVzZUZhY3Rvcnk6ZnVuY3Rpb24gajAodCl7cmV0dXJuKCk9PnQuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKCl9fSxVMD17cHJvdmlkZTpJVix1c2VFeGlzdGluZzpxZSgoKCk9PlcwKSksbXVsdGk6ITB9O2NsYXNzIEcwe2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIscyxsLGMsZCl7dGhpcy5fZWxlbWVudD10LHRoaXMuX292ZXJsYXk9ZSx0aGlzLl92aWV3Q29udGFpbmVyUmVmPW4sdGhpcy5fem9uZT1vLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmPWksdGhpcy5fZGlyPXIsdGhpcy5fZm9ybUZpZWxkPXMsdGhpcy5fZG9jdW1lbnQ9bCx0aGlzLl92aWV3cG9ydFJ1bGVyPWMsdGhpcy5fZGVmYXVsdHM9ZCx0aGlzLl9jb21wb25lbnREZXN0cm95ZWQ9ITEsdGhpcy5fYXV0b2NvbXBsZXRlRGlzYWJsZWQ9ITEsdGhpcy5fbWFudWFsbHlGbG9hdGluZ0xhYmVsPSExLHRoaXMuX3ZpZXdwb3J0U3Vic2NyaXB0aW9uPW0uRU1QVFksdGhpcy5fY2FuT3Blbk9uTmV4dEZvY3VzPSEwLHRoaXMuX2Nsb3NlS2V5RXZlbnRTdHJlYW09bmV3IEksdGhpcy5fd2luZG93Qmx1ckhhbmRsZXI9KCk9Pnt0aGlzLl9jYW5PcGVuT25OZXh0Rm9jdXM9dGhpcy5fZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PXRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudHx8dGhpcy5wYW5lbE9wZW59LHRoaXMuX29uQ2hhbmdlPSgpPT57fSx0aGlzLl9vblRvdWNoZWQ9KCk9Pnt9LHRoaXMucG9zaXRpb249ImF1dG8iLHRoaXMuYXV0b2NvbXBsZXRlQXR0cmlidXRlPSJvZmYiLHRoaXMuX292ZXJsYXlBdHRhY2hlZD0hMSx0aGlzLm9wdGlvblNlbGVjdGlvbnM9UXQoKCgpPT50aGlzLmF1dG9jb21wbGV0ZSYmdGhpcy5hdXRvY29tcGxldGUub3B0aW9ucz9yZSguLi50aGlzLmF1dG9jb21wbGV0ZS5vcHRpb25zLm1hcCgodD0+dC5vblNlbGVjdGlvbkNoYW5nZSkpKTp0aGlzLl96b25lLm9uU3RhYmxlLnBpcGUoYmUoMSksemUoKCgpPT50aGlzLm9wdGlvblNlbGVjdGlvbnMpKSkpKSx0aGlzLl9zY3JvbGxTdHJhdGVneT1hfWdldCBhdXRvY29tcGxldGVEaXNhYmxlZCgpe3JldHVybiB0aGlzLl9hdXRvY29tcGxldGVEaXNhYmxlZH1zZXQgYXV0b2NvbXBsZXRlRGlzYWJsZWQodCl7dGhpcy5fYXV0b2NvbXBsZXRlRGlzYWJsZWQ9eXoodCl9bmdBZnRlclZpZXdJbml0KCl7Y29uc3QgdD10aGlzLl9nZXRXaW5kb3coKTt2b2lkIDAhPT10JiZ0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgoKT0+dC5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl93aW5kb3dCbHVySGFuZGxlcikpKX1uZ09uQ2hhbmdlcyh0KXt0LnBvc2l0aW9uJiZ0aGlzLl9wb3NpdGlvblN0cmF0ZWd5JiYodGhpcy5fc2V0U3RyYXRlZ3lQb3NpdGlvbnModGhpcy5fcG9zaXRpb25TdHJhdGVneSksdGhpcy5wYW5lbE9wZW4mJnRoaXMuX292ZXJsYXlSZWYudXBkYXRlUG9zaXRpb24oKSl9bmdPbkRlc3Ryb3koKXtjb25zdCB0PXRoaXMuX2dldFdpbmRvdygpO3ZvaWQgMCE9PXQmJnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYmx1ciIsdGhpcy5fd2luZG93Qmx1ckhhbmRsZXIpLHRoaXMuX3ZpZXdwb3J0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5fY29tcG9uZW50RGVzdHJveWVkPSEwLHRoaXMuX2Rlc3Ryb3lQYW5lbCgpLHRoaXMuX2Nsb3NlS2V5RXZlbnRTdHJlYW0uY29tcGxldGUoKX1nZXQgcGFuZWxPcGVuKCl7cmV0dXJuIHRoaXMuX292ZXJsYXlBdHRhY2hlZCYmdGhpcy5hdXRvY29tcGxldGUuc2hvd1BhbmVsfW9wZW5QYW5lbCgpe3RoaXMuX2F0dGFjaE92ZXJsYXkoKSx0aGlzLl9mbG9hdExhYmVsKCl9Y2xvc2VQYW5lbCgpe3RoaXMuX3Jlc2V0TGFiZWwoKSx0aGlzLl9vdmVybGF5QXR0YWNoZWQmJih0aGlzLnBhbmVsT3BlbiYmdGhpcy5hdXRvY29tcGxldGUuY2xvc2VkLmVtaXQoKSx0aGlzLmF1dG9jb21wbGV0ZS5faXNPcGVuPXRoaXMuX292ZXJsYXlBdHRhY2hlZD0hMSx0aGlzLl9vdmVybGF5UmVmJiZ0aGlzLl9vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkmJih0aGlzLl9vdmVybGF5UmVmLmRldGFjaCgpLHRoaXMuX2Nsb3NpbmdBY3Rpb25zU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkpLHRoaXMuX2NvbXBvbmVudERlc3Ryb3llZHx8dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpKX11cGRhdGVQb3NpdGlvbigpe3RoaXMuX292ZXJsYXlBdHRhY2hlZCYmdGhpcy5fb3ZlcmxheVJlZi51cGRhdGVQb3NpdGlvbigpfWdldCBwYW5lbENsb3NpbmdBY3Rpb25zKCl7cmV0dXJuIHJlKHRoaXMub3B0aW9uU2VsZWN0aW9ucyx0aGlzLmF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci50YWJPdXQucGlwZShjZSgoKCk9PnRoaXMuX292ZXJsYXlBdHRhY2hlZCkpKSx0aGlzLl9jbG9zZUtleUV2ZW50U3RyZWFtLHRoaXMuX2dldE91dHNpZGVDbGlja1N0cmVhbSgpLHRoaXMuX292ZXJsYXlSZWY/dGhpcy5fb3ZlcmxheVJlZi5kZXRhY2htZW50cygpLnBpcGUoY2UoKCgpPT50aGlzLl9vdmVybGF5QXR0YWNoZWQpKSk6RXQoKSkucGlwZShJdCgodD0+dCBpbnN0YW5jZW9mIEZIP3Q6bnVsbCkpKX1nZXQgYWN0aXZlT3B0aW9uKCl7cmV0dXJuIHRoaXMuYXV0b2NvbXBsZXRlJiZ0aGlzLmF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlcj90aGlzLmF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5hY3RpdmVJdGVtOm51bGx9X2dldE91dHNpZGVDbGlja1N0cmVhbSgpe3JldHVybiByZShvZSh0aGlzLl9kb2N1bWVudCwiY2xpY2siKSxvZSh0aGlzLl9kb2N1bWVudCwiYXV4Y2xpY2siKSxvZSh0aGlzLl9kb2N1bWVudCwidG91Y2hlbmQiKSkucGlwZShjZSgodD0+e2NvbnN0IGU9THoodCksbj10aGlzLl9mb3JtRmllbGQ/dGhpcy5fZm9ybUZpZWxkLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ6bnVsbCxvPXRoaXMuY29ubmVjdGVkVG8/dGhpcy5jb25uZWN0ZWRUby5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ6bnVsbDtyZXR1cm4gdGhpcy5fb3ZlcmxheUF0dGFjaGVkJiZlIT09dGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50JiYoIW58fCFuLmNvbnRhaW5zKGUpKSYmKCFvfHwhby5jb250YWlucyhlKSkmJiEhdGhpcy5fb3ZlcmxheVJlZiYmIXRoaXMuX292ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuY29udGFpbnMoZSl9KSkpfXdyaXRlVmFsdWUodCl7UHJvbWlzZS5yZXNvbHZlKG51bGwpLnRoZW4oKCgpPT50aGlzLl9zZXRUcmlnZ2VyVmFsdWUodCkpKX1yZWdpc3Rlck9uQ2hhbmdlKHQpe3RoaXMuX29uQ2hhbmdlPXR9cmVnaXN0ZXJPblRvdWNoZWQodCl7dGhpcy5fb25Ub3VjaGVkPXR9c2V0RGlzYWJsZWRTdGF0ZSh0KXt0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZGlzYWJsZWQ9dH1faGFuZGxlS2V5ZG93bih0KXtjb25zdCBlPXQua2V5Q29kZTtpZihlIT09dXp8fGJ6KHQpfHx0LnByZXZlbnREZWZhdWx0KCksdGhpcy5hY3RpdmVPcHRpb24mJmU9PT1teiYmdGhpcy5wYW5lbE9wZW4pdGhpcy5hY3RpdmVPcHRpb24uX3NlbGVjdFZpYUludGVyYWN0aW9uKCksdGhpcy5fcmVzZXRBY3RpdmVJdGVtKCksdC5wcmV2ZW50RGVmYXVsdCgpO2Vsc2UgaWYodGhpcy5hdXRvY29tcGxldGUpe2NvbnN0IG49dGhpcy5hdXRvY29tcGxldGUuX2tleU1hbmFnZXIuYWN0aXZlSXRlbSxvPWU9PT1nenx8ZT09PWh6O3RoaXMucGFuZWxPcGVufHw5PT09ZT90aGlzLmF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5vbktleWRvd24odCk6byYmdGhpcy5fY2FuT3BlbigpJiZ0aGlzLm9wZW5QYW5lbCgpLChvfHx0aGlzLmF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5hY3RpdmVJdGVtIT09bikmJnRoaXMuX3Njcm9sbFRvT3B0aW9uKHRoaXMuYXV0b2NvbXBsZXRlLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW1JbmRleHx8MCl9fV9oYW5kbGVJbnB1dCh0KXtsZXQgZT10LnRhcmdldCxuPWUudmFsdWU7Im51bWJlciI9PT1lLnR5cGUmJihuPSIiPT1uP251bGw6cGFyc2VGbG9hdChuKSksdGhpcy5fcHJldmlvdXNWYWx1ZSE9PW4mJih0aGlzLl9wcmV2aW91c1ZhbHVlPW4sdGhpcy5fb25DaGFuZ2UobiksdGhpcy5fY2FuT3BlbigpJiZ0aGlzLl9kb2N1bWVudC5hY3RpdmVFbGVtZW50PT09dC50YXJnZXQmJnRoaXMub3BlblBhbmVsKCkpfV9oYW5kbGVGb2N1cygpe3RoaXMuX2Nhbk9wZW5Pbk5leHRGb2N1cz90aGlzLl9jYW5PcGVuKCkmJih0aGlzLl9wcmV2aW91c1ZhbHVlPXRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSx0aGlzLl9hdHRhY2hPdmVybGF5KCksdGhpcy5fZmxvYXRMYWJlbCghMCkpOnRoaXMuX2Nhbk9wZW5Pbk5leHRGb2N1cz0hMH1fZmxvYXRMYWJlbCh0PSExKXt0aGlzLl9mb3JtRmllbGQmJiJhdXRvIj09PXRoaXMuX2Zvcm1GaWVsZC5mbG9hdExhYmVsJiYodD90aGlzLl9mb3JtRmllbGQuX2FuaW1hdGVBbmRMb2NrTGFiZWwoKTp0aGlzLl9mb3JtRmllbGQuZmxvYXRMYWJlbD0iYWx3YXlzIix0aGlzLl9tYW51YWxseUZsb2F0aW5nTGFiZWw9ITApfV9yZXNldExhYmVsKCl7dGhpcy5fbWFudWFsbHlGbG9hdGluZ0xhYmVsJiYodGhpcy5fZm9ybUZpZWxkLmZsb2F0TGFiZWw9ImF1dG8iLHRoaXMuX21hbnVhbGx5RmxvYXRpbmdMYWJlbD0hMSl9X3N1YnNjcmliZVRvQ2xvc2luZ0FjdGlvbnMoKXtyZXR1cm4gcmUodGhpcy5fem9uZS5vblN0YWJsZS5waXBlKGJlKDEpKSx0aGlzLmF1dG9jb21wbGV0ZS5vcHRpb25zLmNoYW5nZXMucGlwZShGZSgoKCk9PnRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kucmVhcHBseUxhc3RQb3NpdGlvbigpKSksQ2UoMCkpKS5waXBlKHplKCgoKT0+e2NvbnN0IHQ9dGhpcy5wYW5lbE9wZW47cmV0dXJuIHRoaXMuX3Jlc2V0QWN0aXZlSXRlbSgpLHRoaXMuYXV0b2NvbXBsZXRlLl9zZXRWaXNpYmlsaXR5KCksdGhpcy5wYW5lbE9wZW4mJih0aGlzLl9vdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCksdCE9PXRoaXMucGFuZWxPcGVuJiZ0aGlzLmF1dG9jb21wbGV0ZS5vcGVuZWQuZW1pdCgpKSx0aGlzLnBhbmVsQ2xvc2luZ0FjdGlvbnN9KSksYmUoMSkpLnN1YnNjcmliZSgodD0+dGhpcy5fc2V0VmFsdWVBbmRDbG9zZSh0KSkpfV9kZXN0cm95UGFuZWwoKXt0aGlzLl9vdmVybGF5UmVmJiYodGhpcy5jbG9zZVBhbmVsKCksdGhpcy5fb3ZlcmxheVJlZi5kaXNwb3NlKCksdGhpcy5fb3ZlcmxheVJlZj1udWxsKX1fc2V0VHJpZ2dlclZhbHVlKHQpe2NvbnN0IGU9dGhpcy5hdXRvY29tcGxldGUmJnRoaXMuYXV0b2NvbXBsZXRlLmRpc3BsYXlXaXRoP3RoaXMuYXV0b2NvbXBsZXRlLmRpc3BsYXlXaXRoKHQpOnQsbj1udWxsIT1lP2U6IiI7dGhpcy5fZm9ybUZpZWxkP3RoaXMuX2Zvcm1GaWVsZC5fY29udHJvbC52YWx1ZT1uOnRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZT1uLHRoaXMuX3ByZXZpb3VzVmFsdWU9bn1fc2V0VmFsdWVBbmRDbG9zZSh0KXt0JiZ0LnNvdXJjZSYmKHRoaXMuX2NsZWFyUHJldmlvdXNTZWxlY3RlZE9wdGlvbih0LnNvdXJjZSksdGhpcy5fc2V0VHJpZ2dlclZhbHVlKHQuc291cmNlLnZhbHVlKSx0aGlzLl9vbkNoYW5nZSh0LnNvdXJjZS52YWx1ZSksdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCksdGhpcy5hdXRvY29tcGxldGUuX2VtaXRTZWxlY3RFdmVudCh0LnNvdXJjZSkpLHRoaXMuY2xvc2VQYW5lbCgpfV9jbGVhclByZXZpb3VzU2VsZWN0ZWRPcHRpb24odCl7dGhpcy5hdXRvY29tcGxldGUub3B0aW9ucy5mb3JFYWNoKChlPT57ZSE9PXQmJmUuc2VsZWN0ZWQmJmUuZGVzZWxlY3QoKX0pKX1fYXR0YWNoT3ZlcmxheSgpe3ZhciB0O2lmKCF0aGlzLmF1dG9jb21wbGV0ZSYmKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpKXRocm93KGZ1bmN0aW9uIGUoKXtyZXR1cm4gRXJyb3IoIkF0dGVtcHRpbmcgdG8gb3BlbiBhbiB1bmRlZmluZWQgaW5zdGFuY2Ugb2YgYG1hdC1hdXRvY29tcGxldGVgLiBNYWtlIHN1cmUgdGhhdCB0aGUgaWQgcGFzc2VkIHRvIHRoZSBgbWF0QXV0b2NvbXBsZXRlYCBpcyBjb3JyZWN0IGFuZCB0aGF0IHlvdSdyZSBhdHRlbXB0aW5nIHRvIG9wZW4gaXQgYWZ0ZXIgdGhlIG5nQWZ0ZXJDb250ZW50SW5pdCBob29rLiIpfSkoKTtsZXQgbj10aGlzLl9vdmVybGF5UmVmO24/KHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kuc2V0T3JpZ2luKHRoaXMuX2dldENvbm5lY3RlZEVsZW1lbnQoKSksbi51cGRhdGVTaXplKHt3aWR0aDp0aGlzLl9nZXRQYW5lbFdpZHRoKCl9KSk6KHRoaXMuX3BvcnRhbD1uZXcgeEYodGhpcy5hdXRvY29tcGxldGUudGVtcGxhdGUsdGhpcy5fdmlld0NvbnRhaW5lclJlZix7aWQ6bnVsbD09PSh0PXRoaXMuX2Zvcm1GaWVsZCl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuZ2V0TGFiZWxJZCgpfSksbj10aGlzLl9vdmVybGF5LmNyZWF0ZSh0aGlzLl9nZXRPdmVybGF5Q29uZmlnKCkpLHRoaXMuX292ZXJsYXlSZWY9bixuLmtleWRvd25FdmVudHMoKS5zdWJzY3JpYmUoKHQ9PnsodC5rZXlDb2RlPT09dXomJiFieih0KXx8dC5rZXlDb2RlPT09Z3omJmJ6KHQsImFsdEtleSIpKSYmKHRoaXMuX3Jlc2V0QWN0aXZlSXRlbSgpLHRoaXMuX2Nsb3NlS2V5RXZlbnRTdHJlYW0ubmV4dCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksdC5wcmV2ZW50RGVmYXVsdCgpKX0pKSx0aGlzLl92aWV3cG9ydFN1YnNjcmlwdGlvbj10aGlzLl92aWV3cG9ydFJ1bGVyLmNoYW5nZSgpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLnBhbmVsT3BlbiYmbiYmbi51cGRhdGVTaXplKHt3aWR0aDp0aGlzLl9nZXRQYW5lbFdpZHRoKCl9KX0pKSksbiYmIW4uaGFzQXR0YWNoZWQoKSYmKG4uYXR0YWNoKHRoaXMuX3BvcnRhbCksdGhpcy5fY2xvc2luZ0FjdGlvbnNTdWJzY3JpcHRpb249dGhpcy5fc3Vic2NyaWJlVG9DbG9zaW5nQWN0aW9ucygpKTtjb25zdCBvPXRoaXMucGFuZWxPcGVuO3RoaXMuYXV0b2NvbXBsZXRlLl9zZXRWaXNpYmlsaXR5KCksdGhpcy5hdXRvY29tcGxldGUuX2lzT3Blbj10aGlzLl9vdmVybGF5QXR0YWNoZWQ9ITAsdGhpcy5wYW5lbE9wZW4mJm8hPT10aGlzLnBhbmVsT3BlbiYmdGhpcy5hdXRvY29tcGxldGUub3BlbmVkLmVtaXQoKX1fZ2V0T3ZlcmxheUNvbmZpZygpe3ZhciB0O3JldHVybiBuZXcgVkYoe3Bvc2l0aW9uU3RyYXRlZ3k6dGhpcy5fZ2V0T3ZlcmxheVBvc2l0aW9uKCksc2Nyb2xsU3RyYXRlZ3k6dGhpcy5fc2Nyb2xsU3RyYXRlZ3koKSx3aWR0aDp0aGlzLl9nZXRQYW5lbFdpZHRoKCksZGlyZWN0aW9uOnRoaXMuX2RpcixwYW5lbENsYXNzOm51bGw9PT0odD10aGlzLl9kZWZhdWx0cyl8fHZvaWQgMD09PXQ/dm9pZCAwOnQub3ZlcmxheVBhbmVsQ2xhc3N9KX1fZ2V0T3ZlcmxheVBvc2l0aW9uKCl7Y29uc3QgdD10aGlzLl9vdmVybGF5LnBvc2l0aW9uKCkuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLl9nZXRDb25uZWN0ZWRFbGVtZW50KCkpLndpdGhGbGV4aWJsZURpbWVuc2lvbnMoITEpLndpdGhQdXNoKCExKTtyZXR1cm4gdGhpcy5fc2V0U3RyYXRlZ3lQb3NpdGlvbnModCksdGhpcy5fcG9zaXRpb25TdHJhdGVneT10LHR9X3NldFN0cmF0ZWd5UG9zaXRpb25zKHQpe2NvbnN0IGU9W3tvcmlnaW5YOiJzdGFydCIsb3JpZ2luWToiYm90dG9tIixvdmVybGF5WDoic3RhcnQiLG92ZXJsYXlZOiJ0b3AifSx7b3JpZ2luWDoiZW5kIixvcmlnaW5ZOiJib3R0b20iLG92ZXJsYXlYOiJlbmQiLG92ZXJsYXlZOiJ0b3AifV0sbj10aGlzLl9hYm92ZUNsYXNzLG89W3tvcmlnaW5YOiJzdGFydCIsb3JpZ2luWToidG9wIixvdmVybGF5WDoic3RhcnQiLG92ZXJsYXlZOiJib3R0b20iLHBhbmVsQ2xhc3M6bn0se29yaWdpblg6ImVuZCIsb3JpZ2luWToidG9wIixvdmVybGF5WDoiZW5kIixvdmVybGF5WToiYm90dG9tIixwYW5lbENsYXNzOm59XTtsZXQgaTtpPSJhYm92ZSI9PT10aGlzLnBvc2l0aW9uP286ImJlbG93Ij09PXRoaXMucG9zaXRpb24/ZTpbLi4uZSwuLi5vXSx0LndpdGhQb3NpdGlvbnMoaSl9X2dldENvbm5lY3RlZEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5jb25uZWN0ZWRUbz90aGlzLmNvbm5lY3RlZFRvLmVsZW1lbnRSZWY6dGhpcy5fZm9ybUZpZWxkP3RoaXMuX2Zvcm1GaWVsZC5nZXRDb25uZWN0ZWRPdmVybGF5T3JpZ2luKCk6dGhpcy5fZWxlbWVudH1fZ2V0UGFuZWxXaWR0aCgpe3JldHVybiB0aGlzLmF1dG9jb21wbGV0ZS5wYW5lbFdpZHRofHx0aGlzLl9nZXRIb3N0V2lkdGgoKX1fZ2V0SG9zdFdpZHRoKCl7cmV0dXJuIHRoaXMuX2dldENvbm5lY3RlZEVsZW1lbnQoKS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRofV9yZXNldEFjdGl2ZUl0ZW0oKXtjb25zdCB0PXRoaXMuYXV0b2NvbXBsZXRlO3QuYXV0b0FjdGl2ZUZpcnN0T3B0aW9uP3QuX2tleU1hbmFnZXIuc2V0Rmlyc3RJdGVtQWN0aXZlKCk6dC5fa2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKC0xKX1fY2FuT3Blbigpe2NvbnN0IHQ9dGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50O3JldHVybiF0LnJlYWRPbmx5JiYhdC5kaXNhYmxlZCYmIXRoaXMuX2F1dG9jb21wbGV0ZURpc2FibGVkfV9nZXRXaW5kb3coKXt2YXIgdDtyZXR1cm4obnVsbD09PSh0PXRoaXMuX2RvY3VtZW50KXx8dm9pZCAwPT09dD92b2lkIDA6dC5kZWZhdWx0Vmlldyl8fHdpbmRvd31fc2Nyb2xsVG9PcHRpb24odCl7Y29uc3QgZT10aGlzLmF1dG9jb21wbGV0ZSxuPVZIKHQsZS5vcHRpb25zLGUub3B0aW9uR3JvdXBzKTtpZigwPT09dCYmMT09PW4pZS5fc2V0U2Nyb2xsVG9wKDApO2Vsc2UgaWYoZS5wYW5lbCl7Y29uc3Qgbj1lLm9wdGlvbnMudG9BcnJheSgpW3RdO2lmKG4pe2NvbnN0IHQ9bi5fZ2V0SG9zdEVsZW1lbnQoKSxvPWpIKHQub2Zmc2V0VG9wLHQub2Zmc2V0SGVpZ2h0LGUuX2dldFNjcm9sbFRvcCgpLGUucGFuZWwubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQpO2UuX3NldFNjcm9sbFRvcChvKX19fX1HMC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8RzApKFNtKGhnKSxTbShwTCksU20oZWgpLFNtKGFfKSxTbShVZyksU20oQjApLFNtKEhJLDgpLFNtKFJWLDkpLFNtKFpfLDgpLFNtKHVGKSxTbShOMCw4KSl9LEcwLsm1ZGlyPWxvKHt0eXBlOkcwLGlucHV0czp7cG9zaXRpb246WyJtYXRBdXRvY29tcGxldGVQb3NpdGlvbiIsInBvc2l0aW9uIl0sYXV0b2NvbXBsZXRlQXR0cmlidXRlOlsiYXV0b2NvbXBsZXRlIiwiYXV0b2NvbXBsZXRlQXR0cmlidXRlIl0sYXV0b2NvbXBsZXRlRGlzYWJsZWQ6WyJtYXRBdXRvY29tcGxldGVEaXNhYmxlZCIsImF1dG9jb21wbGV0ZURpc2FibGVkIl0sYXV0b2NvbXBsZXRlOlsibWF0QXV0b2NvbXBsZXRlIiwiYXV0b2NvbXBsZXRlIl0sY29ubmVjdGVkVG86WyJtYXRBdXRvY29tcGxldGVDb25uZWN0ZWRUbyIsImNvbm5lY3RlZFRvIl19LGZlYXR1cmVzOltCb119KSxHMC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpwTH0se3R5cGU6ZWh9LHt0eXBlOmFffSx7dHlwZTpVZ30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W0IwXX1dfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpBVixkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbUlZdfSx7dHlwZTpScn1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTp1Rn0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltOMF19XX1dLEcwLnByb3BEZWNvcmF0b3JzPXthdXRvY29tcGxldGU6W3t0eXBlOnh5LGFyZ3M6WyJtYXRBdXRvY29tcGxldGUiXX1dLHBvc2l0aW9uOlt7dHlwZTp4eSxhcmdzOlsibWF0QXV0b2NvbXBsZXRlUG9zaXRpb24iXX1dLGNvbm5lY3RlZFRvOlt7dHlwZTp4eSxhcmdzOlsibWF0QXV0b2NvbXBsZXRlQ29ubmVjdGVkVG8iXX1dLGF1dG9jb21wbGV0ZUF0dHJpYnV0ZTpbe3R5cGU6eHksYXJnczpbImF1dG9jb21wbGV0ZSJdfV0sYXV0b2NvbXBsZXRlRGlzYWJsZWQ6W3t0eXBlOnh5LGFyZ3M6WyJtYXRBdXRvY29tcGxldGVEaXNhYmxlZCJdfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRzAsW3t0eXBlOkN5fV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTpwTH0se3R5cGU6ZWh9LHt0eXBlOmFffSx7dHlwZTpVZ30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W0IwXX1dfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpBVixkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbUlZdfSx7dHlwZTpScn1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTp1Rn0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltOMF19XX1dfSkse3Bvc2l0aW9uOlt7dHlwZTp4eSxhcmdzOlsibWF0QXV0b2NvbXBsZXRlUG9zaXRpb24iXX1dLGF1dG9jb21wbGV0ZUF0dHJpYnV0ZTpbe3R5cGU6eHksYXJnczpbImF1dG9jb21wbGV0ZSJdfV0sYXV0b2NvbXBsZXRlRGlzYWJsZWQ6W3t0eXBlOnh5LGFyZ3M6WyJtYXRBdXRvY29tcGxldGVEaXNhYmxlZCJdfV0sYXV0b2NvbXBsZXRlOlt7dHlwZTp4eSxhcmdzOlsibWF0QXV0b2NvbXBsZXRlIl19XSxjb25uZWN0ZWRUbzpbe3R5cGU6eHksYXJnczpbIm1hdEF1dG9jb21wbGV0ZUNvbm5lY3RlZFRvIl19XX0pO2NsYXNzIFcwIGV4dGVuZHMgRzB7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX2Fib3ZlQ2xhc3M9Im1hdC1hdXRvY29tcGxldGUtcGFuZWwtYWJvdmUifX1XMC7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoVzApKSkobnx8VzApfX0pKCksVzAuybVkaXI9bG8oe3R5cGU6VzAsc2VsZWN0b3JzOltbImlucHV0IiwibWF0QXV0b2NvbXBsZXRlIiwiIl0sWyJ0ZXh0YXJlYSIsIm1hdEF1dG9jb21wbGV0ZSIsIiJdXSxob3N0QXR0cnM6WzEsIm1hdC1hdXRvY29tcGxldGUtdHJpZ2dlciJdLGhvc3RWYXJzOjcsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJlZtKCJmb2N1c2luIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9oYW5kbGVGb2N1cygpfSkpKCJibHVyIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9vblRvdWNoZWQoKX0pKSgiaW5wdXQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9oYW5kbGVJbnB1dChlKX0pKSgia2V5ZG93biIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX2hhbmRsZUtleWRvd24oZSl9KSksMiZlJiZqcCgiYXV0b2NvbXBsZXRlIixuLmF1dG9jb21wbGV0ZUF0dHJpYnV0ZSkoInJvbGUiLG4uYXV0b2NvbXBsZXRlRGlzYWJsZWQ/bnVsbDoiY29tYm9ib3giKSgiYXJpYS1hdXRvY29tcGxldGUiLG4uYXV0b2NvbXBsZXRlRGlzYWJsZWQ/bnVsbDoibGlzdCIpKCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiLG4ucGFuZWxPcGVuJiZuLmFjdGl2ZU9wdGlvbj9uLmFjdGl2ZU9wdGlvbi5pZDpudWxsKSgiYXJpYS1leHBhbmRlZCIsbi5hdXRvY29tcGxldGVEaXNhYmxlZD9udWxsOm4ucGFuZWxPcGVuLnRvU3RyaW5nKCkpKCJhcmlhLW93bnMiLG4uYXV0b2NvbXBsZXRlRGlzYWJsZWR8fCFuLnBhbmVsT3Blbnx8bnVsbD09bi5hdXRvY29tcGxldGU/bnVsbDpuLmF1dG9jb21wbGV0ZS5pZCkoImFyaWEtaGFzcG9wdXAiLCFuLmF1dG9jb21wbGV0ZURpc2FibGVkKX0sZXhwb3J0QXM6WyJtYXRBdXRvY29tcGxldGVUcmlnZ2VyIl0sZmVhdHVyZXM6W3BnKFtVMF0pLHhwXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoVzAsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiaW5wdXRbbWF0QXV0b2NvbXBsZXRlXSwgdGV4dGFyZWFbbWF0QXV0b2NvbXBsZXRlXSIsaG9zdDp7Y2xhc3M6Im1hdC1hdXRvY29tcGxldGUtdHJpZ2dlciIsIlthdHRyLmF1dG9jb21wbGV0ZV0iOiJhdXRvY29tcGxldGVBdHRyaWJ1dGUiLCJbYXR0ci5yb2xlXSI6J2F1dG9jb21wbGV0ZURpc2FibGVkID8gbnVsbCA6ICJjb21ib2JveCInLCJbYXR0ci5hcmlhLWF1dG9jb21wbGV0ZV0iOidhdXRvY29tcGxldGVEaXNhYmxlZCA/IG51bGwgOiAibGlzdCInLCJbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdIjoiKHBhbmVsT3BlbiAmJiBhY3RpdmVPcHRpb24pID8gYWN0aXZlT3B0aW9uLmlkIDogbnVsbCIsIlthdHRyLmFyaWEtZXhwYW5kZWRdIjoiYXV0b2NvbXBsZXRlRGlzYWJsZWQgPyBudWxsIDogcGFuZWxPcGVuLnRvU3RyaW5nKCkiLCJbYXR0ci5hcmlhLW93bnNdIjoiKGF1dG9jb21wbGV0ZURpc2FibGVkIHx8ICFwYW5lbE9wZW4pID8gbnVsbCA6IGF1dG9jb21wbGV0ZT8uaWQiLCJbYXR0ci5hcmlhLWhhc3BvcHVwXSI6IiFhdXRvY29tcGxldGVEaXNhYmxlZCIsIihmb2N1c2luKSI6Il9oYW5kbGVGb2N1cygpIiwiKGJsdXIpIjoiX29uVG91Y2hlZCgpIiwiKGlucHV0KSI6Il9oYW5kbGVJbnB1dCgkZXZlbnQpIiwiKGtleWRvd24pIjoiX2hhbmRsZUtleWRvd24oJGV2ZW50KSJ9LGV4cG9ydEFzOiJtYXRBdXRvY29tcGxldGVUcmlnZ2VyIixwcm92aWRlcnM6W1UwXX1dfV0sbnVsbCxudWxsKTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCmNsYXNzIFkwe31ZMC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WTApfSxZMC7JtW1vZD1hbyh7dHlwZTpZMH0pLFkwLsm1aW5qPXZuKHtwcm92aWRlcnM6W1YwXSxpbXBvcnRzOltbeUwsVUgsWEksV01dLHlGLFVILFhJXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWTAsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOlt5TCxVSCxYSSxXTV0sZXhwb3J0czpbSDAsVzAsTDAseUYsVUgsWEldLGRlY2xhcmF0aW9uczpbSDAsVzAsTDBdLHByb3ZpZGVyczpbVjBdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oWTAse2RlY2xhcmF0aW9uczpmdW5jdGlvbigpe3JldHVybltIMCxXMCxMMF19LGltcG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5beUwsVUgsWEksV01dfSxleHBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW0gwLFcwLEwwLHlGLFVILFhJXX19KTtjbGFzcyBxMHtjb25zdHJ1Y3Rvcigpe3RoaXMudmFsdWU9IiIsdGhpcy5wbGFjZWhvbGRlcj0iIn1vbklucHV0S2V5VXAodCl7IkVudGVyIj09PXQua2V5JiZ0aGlzLmF1dG9jb21wbGV0ZVRyaWdnZXIuY2xvc2VQYW5lbCgpfX1mdW5jdGlvbiBaMCh0LGUpe2lmKDEmdCYmKHFpKCksVG0oMCwiY2lyY2xlIiwzKSksMiZ0KXtjb25zdCB0PVltKCk7ZHUoImFuaW1hdGlvbi1uYW1lIiwibWF0LXByb2dyZXNzLXNwaW5uZXItc3Ryb2tlLXJvdGF0ZS0iK3QuX3NwaW5uZXJBbmltYXRpb25MYWJlbCkoInN0cm9rZS1kYXNob2Zmc2V0Iix0Ll9nZXRTdHJva2VEYXNoT2Zmc2V0KCksInB4IikoInN0cm9rZS1kYXNoYXJyYXkiLHQuX2dldFN0cm9rZUNpcmN1bWZlcmVuY2UoKSwicHgiKSgic3Ryb2tlLXdpZHRoIix0Ll9nZXRDaXJjbGVTdHJva2VXaWR0aCgpLCIlIiksanAoInIiLHQuX2dldENpcmNsZVJhZGl1cygpKX19ZnVuY3Rpb24gWDAodCxlKXtpZigxJnQmJihxaSgpLFRtKDAsImNpcmNsZSIsMykpLDImdCl7Y29uc3QgdD1ZbSgpO2R1KCJzdHJva2UtZGFzaG9mZnNldCIsdC5fZ2V0U3Ryb2tlRGFzaE9mZnNldCgpLCJweCIpKCJzdHJva2UtZGFzaGFycmF5Iix0Ll9nZXRTdHJva2VDaXJjdW1mZXJlbmNlKCksInB4IikoInN0cm9rZS13aWR0aCIsdC5fZ2V0Q2lyY2xlU3Ryb2tlV2lkdGgoKSwiJSIpLGpwKCJyIix0Ll9nZXRDaXJjbGVSYWRpdXMoKSl9fWZ1bmN0aW9uIEswKHQsZSl7aWYoMSZ0JiYocWkoKSxUbSgwLCJjaXJjbGUiLDMpKSwyJnQpe2NvbnN0IHQ9WW0oKTtkdSgiYW5pbWF0aW9uLW5hbWUiLCJtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1zdHJva2Utcm90YXRlLSIrdC5fc3Bpbm5lckFuaW1hdGlvbkxhYmVsKSgic3Ryb2tlLWRhc2hvZmZzZXQiLHQuX2dldFN0cm9rZURhc2hPZmZzZXQoKSwicHgiKSgic3Ryb2tlLWRhc2hhcnJheSIsdC5fZ2V0U3Ryb2tlQ2lyY3VtZmVyZW5jZSgpLCJweCIpKCJzdHJva2Utd2lkdGgiLHQuX2dldENpcmNsZVN0cm9rZVdpZHRoKCksIiUiKSxqcCgiciIsdC5fZ2V0Q2lyY2xlUmFkaXVzKCkpfX1mdW5jdGlvbiBKMCh0LGUpe2lmKDEmdCYmKHFpKCksVG0oMCwiY2lyY2xlIiwzKSksMiZ0KXtjb25zdCB0PVltKCk7ZHUoInN0cm9rZS1kYXNob2Zmc2V0Iix0Ll9nZXRTdHJva2VEYXNoT2Zmc2V0KCksInB4IikoInN0cm9rZS1kYXNoYXJyYXkiLHQuX2dldFN0cm9rZUNpcmN1bWZlcmVuY2UoKSwicHgiKSgic3Ryb2tlLXdpZHRoIix0Ll9nZXRDaXJjbGVTdHJva2VXaWR0aCgpLCIlIiksanAoInIiLHQuX2dldENpcmNsZVJhZGl1cygpKX19cTAuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHEwKX0scTAuybVjbXA9dG8oe3R5cGU6cTAsc2VsZWN0b3JzOltbInRiLWZpbHRlci1pbnB1dCJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmUWgoVzAsNSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5hdXRvY29tcGxldGVUcmlnZ2VyPXQuZmlyc3QpfX0saW5wdXRzOnt2YWx1ZToidmFsdWUiLG1hdEF1dG9jb21wbGV0ZToibWF0QXV0b2NvbXBsZXRlIixwbGFjZWhvbGRlcjoicGxhY2Vob2xkZXIifSxkZWNsczoyLHZhcnM6NCxjb25zdHM6W1sic3ZnSWNvbiIsInNlYXJjaF8yNHB4Il0sWyJ0eXBlIiwidGV4dCIsImF1dG9jb21wbGV0ZSIsIm9mZiIsMywicGxhY2Vob2xkZXIiLCJtYXRBdXRvY29tcGxldGUiLCJtYXRBdXRvY29tcGxldGVEaXNhYmxlZCIsInZhbHVlIiwia2V5dXAiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFRtKDAsIm1hdC1pY29uIiwwKSxSbSgxLCJpbnB1dCIsMSksVm0oImtleXVwIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vbklucHV0S2V5VXAoZSl9KSksQW0oKSksMiZlJiYocmMoMSksRG0oInBsYWNlaG9sZGVyIixuLnBsYWNlaG9sZGVyKSgibWF0QXV0b2NvbXBsZXRlIixuLm1hdEF1dG9jb21wbGV0ZSkoIm1hdEF1dG9jb21wbGV0ZURpc2FibGVkIiwhbi5tYXRBdXRvY29tcGxldGUpKCJ2YWx1ZSIsbi52YWx1ZSkpfSxkaXJlY3RpdmVzOltEVyxXMF0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9W19uZ2hvc3QtJUNPTVAlXXtkaXNwbGF5OmZsZXg7Zm9udC1zaXplOjEzcHh9bWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjE7ZmxleDpub25lO21hcmdpbi1yaWdodDo1cHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgbWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICBtYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9aW5wdXRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6aW5oZXJpdDtjYXJldC1jb2xvcjpjdXJyZW50Q29sb3I7Y29sb3I6Y3VycmVudENvbG9yO2ZvbnQ6aW5oZXJpdDtib3JkZXI6bm9uZTtvdXRsaW5lOm5vbmU7cGFkZGluZzowO2ZsZXgtZ3JvdzoxfSddfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChxMCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJ0Yi1maWx0ZXItaW5wdXQiLHRlbXBsYXRlOidcbiAgICA8bWF0LWljb24gc3ZnSWNvbj0ic2VhcmNoXzI0cHgiPjwvbWF0LWljb24+XG5cbiAgICBceDNjIS0tIE5vdGU6IHRvIGFsbG93IGZhbHN5IFwnbWF0QXV0b2NvbXBsZXRlXCcgdmFsdWVzLCB3ZSBuZWVkIFwnbWF0QXV0b2NvbXBsZXRlRGlzYWJsZWRcJ1xuICAgIHRvIHByZXZlbnQgcnVudGltZSBlcnJvcnMuIC0tXHgzZVxuICAgIDxpbnB1dFxuICAgICAgdHlwZT0idGV4dCJcbiAgICAgIGF1dG9jb21wbGV0ZT0ib2ZmIlxuICAgICAgW3BsYWNlaG9sZGVyXT0icGxhY2Vob2xkZXIiXG4gICAgICBbbWF0QXV0b2NvbXBsZXRlXT0ibWF0QXV0b2NvbXBsZXRlIlxuICAgICAgW21hdEF1dG9jb21wbGV0ZURpc2FibGVkXT0iIW1hdEF1dG9jb21wbGV0ZSJcbiAgICAgIFt2YWx1ZV09InZhbHVlIlxuICAgICAgKGtleXVwKT0ib25JbnB1dEtleVVwKCRldmVudCkiXG4gICAgLz5cbiAgJyxzdHlsZVVybHM6WyJmaWx0ZXJfaW5wdXRfY29tcG9uZW50LmNzcyJdfV19XSxudWxsLHt2YWx1ZTpbe3R5cGU6eHl9XSxtYXRBdXRvY29tcGxldGU6W3t0eXBlOnh5fV0scGxhY2Vob2xkZXI6W3t0eXBlOnh5fV0sYXV0b2NvbXBsZXRlVHJpZ2dlcjpbe3R5cGU6WmEsYXJnczpbVzBdfV19KTtjb25zdCBRMD0iLm1hdC1wcm9ncmVzcy1zcGlubmVye2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246cmVsYXRpdmU7b3ZlcmZsb3c6aGlkZGVufS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBzdmd7cG9zaXRpb246YWJzb2x1dGU7dHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpO3RvcDowO2xlZnQ6MDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBjaXJjbGV7ZmlsbDp0cmFuc3BhcmVudDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjt0cmFuc2l0aW9uOnN0cm9rZS1kYXNob2Zmc2V0IDIyNW1zIGxpbmVhcn0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXByb2dyZXNzLXNwaW5uZXIgY2lyY2xle3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBjaXJjbGV7c3Ryb2tlOmN1cnJlbnRDb2xvcjtzdHJva2U6Q2FudmFzVGV4dH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBzdmd7YW5pbWF0aW9uOm1hdC1wcm9ncmVzcy1zcGlubmVyLWxpbmVhci1yb3RhdGUgMjAwMG1zIGxpbmVhciBpbmZpbml0ZX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBzdmd7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1pbmRldGVybWluYXRlLWFuaW1hdGlvblttb2RlPWluZGV0ZXJtaW5hdGVdIGNpcmNsZXt0cmFuc2l0aW9uLXByb3BlcnR5OnN0cm9rZTthbmltYXRpb24tZHVyYXRpb246NDAwMG1zO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpO2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6aW5maW5pdGV9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV0gY2lyY2xle3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1mYWxsYmFjay1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBzdmd7YW5pbWF0aW9uOm1hdC1wcm9ncmVzcy1zcGlubmVyLXN0cm9rZS1yb3RhdGUtZmFsbGJhY2sgMTAwMDBtcyBjdWJpYy1iZXppZXIoMC44NywgMC4wMywgMC4zMywgMSkgaW5maW5pdGV9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtZmFsbGJhY2stYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV0gc3Zne3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1mYWxsYmFjay1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBjaXJjbGV7dHJhbnNpdGlvbi1wcm9wZXJ0eTpzdHJva2V9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtZmFsbGJhY2stYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV0gY2lyY2xle3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX1Aa2V5ZnJhbWVzIG1hdC1wcm9ncmVzcy1zcGlubmVyLWxpbmVhci1yb3RhdGV7MCV7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19QGtleWZyYW1lcyBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1zdHJva2Utcm90YXRlLTEwMHswJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMi41JXtzdHJva2UtZGFzaG9mZnNldDo1Ni41NDg2Njc3cHg7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMi41MDAxJXtzdHJva2UtZGFzaG9mZnNldDo1Ni41NDg2Njc3cHg7dHJhbnNmb3JtOnJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoNzIuNWRlZyl9MjUle3N0cm9rZS1kYXNob2Zmc2V0OjI2OC42MDYxNzE1NzVweDt0cmFuc2Zvcm06cm90YXRlWCgxODBkZWcpIHJvdGF0ZSg3Mi41ZGVnKX0yNS4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgyNzBkZWcpfTM3LjUle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlKDI3MGRlZyl9MzcuNTAwMSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDE2MS41ZGVnKX01MCV7c3Ryb2tlLWRhc2hvZmZzZXQ6MjY4LjYwNjE3MTU3NXB4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDE2MS41ZGVnKX01MC4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpfTYyLjUle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlKDE4MGRlZyl9NjIuNTAwMSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDI1MS41ZGVnKX03NSV7c3Ryb2tlLWRhc2hvZmZzZXQ6MjY4LjYwNjE3MTU3NXB4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDI1MS41ZGVnKX03NS4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyl9ODcuNSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGUoOTBkZWcpfTg3LjUwMDEle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlWCgxODBkZWcpIHJvdGF0ZSgzNDEuNWRlZyl9MTAwJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMzQxLjVkZWcpfX1Aa2V5ZnJhbWVzIG1hdC1wcm9ncmVzcy1zcGlubmVyLXN0cm9rZS1yb3RhdGUtZmFsbGJhY2t7MCV7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX0yNSV7dHJhbnNmb3JtOnJvdGF0ZSgxMTcwZGVnKX01MCV7dHJhbnNmb3JtOnJvdGF0ZSgyMzQwZGVnKX03NSV7dHJhbnNmb3JtOnJvdGF0ZSgzNTEwZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoNDY4MGRlZyl9fVxuIiwkMD1KSShjbGFzc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl9lbGVtZW50UmVmPXR9fSwicHJpbWFyeSIpLHQxPW5ldyBHYSgibWF0LXByb2dyZXNzLXNwaW5uZXItZGVmYXVsdC1vcHRpb25zIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTpmdW5jdGlvbiBlMSgpe3JldHVybntkaWFtZXRlcjoxMDB9fX0pO2NsYXNzIG4xIGV4dGVuZHMgJDB7Y29uc3RydWN0b3IodCxlLG4sbyxpKXtzdXBlcih0KSx0aGlzLl9kb2N1bWVudD1uLHRoaXMuX2RpYW1ldGVyPTEwMCx0aGlzLl92YWx1ZT0wLHRoaXMuX2ZhbGxiYWNrQW5pbWF0aW9uPSExLHRoaXMubW9kZT0iZGV0ZXJtaW5hdGUiO2NvbnN0IGE9bjEuX2RpYW1ldGVyczt0aGlzLl9zcGlubmVyQW5pbWF0aW9uTGFiZWw9dGhpcy5fZ2V0U3Bpbm5lckFuaW1hdGlvbkxhYmVsKCksYS5oYXMobi5oZWFkKXx8YS5zZXQobi5oZWFkLG5ldyBTZXQoWzEwMF0pKSx0aGlzLl9mYWxsYmFja0FuaW1hdGlvbj1lLkVER0V8fGUuVFJJREVOVCx0aGlzLl9ub29wQW5pbWF0aW9ucz0iTm9vcEFuaW1hdGlvbnMiPT09byYmISFpJiYhaS5fZm9yY2VBbmltYXRpb25zLGkmJihpLmRpYW1ldGVyJiYodGhpcy5kaWFtZXRlcj1pLmRpYW1ldGVyKSxpLnN0cm9rZVdpZHRoJiYodGhpcy5zdHJva2VXaWR0aD1pLnN0cm9rZVdpZHRoKSl9Z2V0IGRpYW1ldGVyKCl7cmV0dXJuIHRoaXMuX2RpYW1ldGVyfXNldCBkaWFtZXRlcih0KXt0aGlzLl9kaWFtZXRlcj1feih0KSx0aGlzLl9zcGlubmVyQW5pbWF0aW9uTGFiZWw9dGhpcy5fZ2V0U3Bpbm5lckFuaW1hdGlvbkxhYmVsKCksIXRoaXMuX2ZhbGxiYWNrQW5pbWF0aW9uJiZ0aGlzLl9zdHlsZVJvb3QmJnRoaXMuX2F0dGFjaFN0eWxlTm9kZSgpfWdldCBzdHJva2VXaWR0aCgpe3JldHVybiB0aGlzLl9zdHJva2VXaWR0aHx8dGhpcy5kaWFtZXRlci8xMH1zZXQgc3Ryb2tlV2lkdGgodCl7dGhpcy5fc3Ryb2tlV2lkdGg9X3oodCl9Z2V0IHZhbHVlKCl7cmV0dXJuImRldGVybWluYXRlIj09PXRoaXMubW9kZT90aGlzLl92YWx1ZTowfXNldCB2YWx1ZSh0KXt0aGlzLl92YWx1ZT1NYXRoLm1heCgwLE1hdGgubWluKDEwMCxfeih0KSkpfW5nT25Jbml0KCl7Y29uc3QgdD10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7dGhpcy5fc3R5bGVSb290PUh6KHQpfHx0aGlzLl9kb2N1bWVudC5oZWFkLHRoaXMuX2F0dGFjaFN0eWxlTm9kZSgpLHQuY2xhc3NMaXN0LmFkZChgbWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZSR7dGhpcy5fZmFsbGJhY2tBbmltYXRpb24/Ii1mYWxsYmFjayI6IiJ9LWFuaW1hdGlvbmApfV9nZXRDaXJjbGVSYWRpdXMoKXtyZXR1cm4odGhpcy5kaWFtZXRlci0xMCkvMn1fZ2V0Vmlld0JveCgpe2NvbnN0IHQ9Mip0aGlzLl9nZXRDaXJjbGVSYWRpdXMoKSt0aGlzLnN0cm9rZVdpZHRoO3JldHVybmAwIDAgJHt0fSAke3R9YH1fZ2V0U3Ryb2tlQ2lyY3VtZmVyZW5jZSgpe3JldHVybiAyKk1hdGguUEkqdGhpcy5fZ2V0Q2lyY2xlUmFkaXVzKCl9X2dldFN0cm9rZURhc2hPZmZzZXQoKXtyZXR1cm4iZGV0ZXJtaW5hdGUiPT09dGhpcy5tb2RlP3RoaXMuX2dldFN0cm9rZUNpcmN1bWZlcmVuY2UoKSooMTAwLXRoaXMuX3ZhbHVlKS8xMDA6dGhpcy5fZmFsbGJhY2tBbmltYXRpb24mJiJpbmRldGVybWluYXRlIj09PXRoaXMubW9kZT8uMip0aGlzLl9nZXRTdHJva2VDaXJjdW1mZXJlbmNlKCk6bnVsbH1fZ2V0Q2lyY2xlU3Ryb2tlV2lkdGgoKXtyZXR1cm4gdGhpcy5zdHJva2VXaWR0aC90aGlzLmRpYW1ldGVyKjEwMH1fYXR0YWNoU3R5bGVOb2RlKCl7Y29uc3QgdD10aGlzLl9zdHlsZVJvb3QsZT10aGlzLl9kaWFtZXRlcixuPW4xLl9kaWFtZXRlcnM7bGV0IG89bi5nZXQodCk7aWYoIW98fCFvLmhhcyhlKSl7Y29uc3QgaT10aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO2kuc2V0QXR0cmlidXRlKCJtYXQtc3Bpbm5lci1hbmltYXRpb24iLHRoaXMuX3NwaW5uZXJBbmltYXRpb25MYWJlbCksaS50ZXh0Q29udGVudD10aGlzLl9nZXRBbmltYXRpb25UZXh0KCksdC5hcHBlbmRDaGlsZChpKSxvfHwobz1uZXcgU2V0LG4uc2V0KHQsbykpLG8uYWRkKGUpfX1fZ2V0QW5pbWF0aW9uVGV4dCgpe2NvbnN0IHQ9dGhpcy5fZ2V0U3Ryb2tlQ2lyY3VtZmVyZW5jZSgpO3JldHVybiJcbiBAa2V5ZnJhbWVzIG1hdC1wcm9ncmVzcy1zcGlubmVyLXN0cm9rZS1yb3RhdGUtRElBTUVURVIge1xuICAgIDAlICAgICAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZSgwKTsgfVxuICAgIDEyLjUlICAgeyBzdHJva2UtZGFzaG9mZnNldDogRU5EX1ZBTFVFOyAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwKTsgfVxuICAgIDEyLjUwMDElICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlWCgxODBkZWcpIHJvdGF0ZSg3Mi41ZGVnKTsgfVxuICAgIDI1JSAgICAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoNzIuNWRlZyk7IH1cblxuICAgIDI1LjAwMDElICAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOyB9XG4gICAgMzcuNSUgICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7IH1cbiAgICAzNy41MDAxJSAgeyBzdHJva2UtZGFzaG9mZnNldDogRU5EX1ZBTFVFOyAgICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMTYxLjVkZWcpOyB9XG4gICAgNTAlICAgICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBTVEFSVF9WQUxVRTsgIHRyYW5zZm9ybTogcm90YXRlWCgxODBkZWcpIHJvdGF0ZSgxNjEuNWRlZyk7IH1cblxuICAgIDUwLjAwMDElICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBTVEFSVF9WQUxVRTsgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7IH1cbiAgICA2Mi41JSAgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IEVORF9WQUxVRTsgICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTsgfVxuICAgIDYyLjUwMDElICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlWCgxODBkZWcpIHJvdGF0ZSgyNTEuNWRlZyk7IH1cbiAgICA3NSUgICAgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGVYKDE4MGRlZykgcm90YXRlKDI1MS41ZGVnKTsgfVxuXG4gICAgNzUuMDAwMSUgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpOyB9XG4gICAgODcuNSUgICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsgfVxuICAgIDg3LjUwMDElICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlWCgxODBkZWcpIHJvdGF0ZSgzNDEuNWRlZyk7IH1cbiAgICAxMDAlICAgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGVYKDE4MGRlZykgcm90YXRlKDM0MS41ZGVnKTsgfVxuICB9XG4iLnJlcGxhY2UoL1NUQVJUX1ZBTFVFL2csIiIrLjk1KnQpLnJlcGxhY2UoL0VORF9WQUxVRS9nLCIiKy4yKnQpLnJlcGxhY2UoL0RJQU1FVEVSL2csYCR7dGhpcy5fc3Bpbm5lckFuaW1hdGlvbkxhYmVsfWApfV9nZXRTcGlubmVyQW5pbWF0aW9uTGFiZWwoKXtyZXR1cm4gdGhpcy5kaWFtZXRlci50b1N0cmluZygpLnJlcGxhY2UoIi4iLCJfIil9fW4xLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxuMSkoU20oaGcpLFNtKHd6KSxTbShaXyw4KSxTbShWUCw4KSxTbSh0MSkpfSxuMS7JtWNtcD10byh7dHlwZTpuMSxzZWxlY3RvcnM6W1sibWF0LXByb2dyZXNzLXNwaW5uZXIiXV0saG9zdEF0dHJzOlsicm9sZSIsInByb2dyZXNzYmFyIiwidGFiaW5kZXgiLCItMSIsMSwibWF0LXByb2dyZXNzLXNwaW5uZXIiXSxob3N0VmFyczoxMCxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmKGpwKCJhcmlhLXZhbHVlbWluIiwiZGV0ZXJtaW5hdGUiPT09bi5tb2RlPzA6bnVsbCkoImFyaWEtdmFsdWVtYXgiLCJkZXRlcm1pbmF0ZSI9PT1uLm1vZGU/MTAwOm51bGwpKCJhcmlhLXZhbHVlbm93IiwiZGV0ZXJtaW5hdGUiPT09bi5tb2RlP24udmFsdWU6bnVsbCkoIm1vZGUiLG4ubW9kZSksZHUoIndpZHRoIixuLmRpYW1ldGVyLCJweCIpKCJoZWlnaHQiLG4uZGlhbWV0ZXIsInB4IikscHUoIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIixuLl9ub29wQW5pbWF0aW9ucykpfSxpbnB1dHM6e2NvbG9yOiJjb2xvciIsbW9kZToibW9kZSIsZGlhbWV0ZXI6ImRpYW1ldGVyIixzdHJva2VXaWR0aDoic3Ryb2tlV2lkdGgiLHZhbHVlOiJ2YWx1ZSJ9LGV4cG9ydEFzOlsibWF0UHJvZ3Jlc3NTcGlubmVyIl0sZmVhdHVyZXM6W3hwXSxkZWNsczozLHZhcnM6OCxjb25zdHM6W1sicHJlc2VydmVBc3BlY3RSYXRpbyIsInhNaWRZTWlkIG1lZXQiLCJmb2N1c2FibGUiLCJmYWxzZSIsImFyaWEtaGlkZGVuIiwidHJ1ZSIsMywibmdTd2l0Y2giXSxbImN4IiwiNTAlIiwiY3kiLCI1MCUiLDMsImFuaW1hdGlvbi1uYW1lIiwic3Ryb2tlLWRhc2hvZmZzZXQiLCJzdHJva2UtZGFzaGFycmF5Iiwic3Ryb2tlLXdpZHRoIiw0LCJuZ1N3aXRjaENhc2UiXSxbImN4IiwiNTAlIiwiY3kiLCI1MCUiLDMsInN0cm9rZS1kYXNob2Zmc2V0Iiwic3Ryb2tlLWRhc2hhcnJheSIsInN0cm9rZS13aWR0aCIsNCwibmdTd2l0Y2hDYXNlIl0sWyJjeCIsIjUwJSIsImN5IiwiNTAlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihxaSgpLFJtKDAsInN2ZyIsMCksUXAoMSxaMCwxLDksImNpcmNsZSIsMSksUXAoMixYMCwxLDcsImNpcmNsZSIsMiksQW0oKSksMiZlJiYoZHUoIndpZHRoIixuLmRpYW1ldGVyLCJweCIpKCJoZWlnaHQiLG4uZGlhbWV0ZXIsInB4IiksRG0oIm5nU3dpdGNoIiwiaW5kZXRlcm1pbmF0ZSI9PT1uLm1vZGUpLGpwKCJ2aWV3Qm94IixuLl9nZXRWaWV3Qm94KCkpLHJjKDEpLERtKCJuZ1N3aXRjaENhc2UiLCEwKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIiwhMSkpfSxkaXJlY3RpdmVzOltmTSxnTV0sc3R5bGVzOltRMF0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksbjEuX2RpYW1ldGVycz1uZXcgV2Vha01hcCxuMS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTp3en0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3QxXX1dfV0sbjEucHJvcERlY29yYXRvcnM9e2RpYW1ldGVyOlt7dHlwZTp4eX1dLHN0cm9rZVdpZHRoOlt7dHlwZTp4eX1dLG1vZGU6W3t0eXBlOnh5fV0sdmFsdWU6W3t0eXBlOnh5fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobjEsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWF0LXByb2dyZXNzLXNwaW5uZXIiLGV4cG9ydEFzOiJtYXRQcm9ncmVzc1NwaW5uZXIiLGhvc3Q6e3JvbGU6InByb2dyZXNzYmFyIixjbGFzczoibWF0LXByb2dyZXNzLXNwaW5uZXIiLHRhYmluZGV4OiItMSIsIltjbGFzcy5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZV0iOiJfbm9vcEFuaW1hdGlvbnMiLCJbc3R5bGUud2lkdGgucHhdIjoiZGlhbWV0ZXIiLCJbc3R5bGUuaGVpZ2h0LnB4XSI6ImRpYW1ldGVyIiwiW2F0dHIuYXJpYS12YWx1ZW1pbl0iOidtb2RlID09PSAiZGV0ZXJtaW5hdGUiID8gMCA6IG51bGwnLCJbYXR0ci5hcmlhLXZhbHVlbWF4XSI6J21vZGUgPT09ICJkZXRlcm1pbmF0ZSIgPyAxMDAgOiBudWxsJywiW2F0dHIuYXJpYS12YWx1ZW5vd10iOidtb2RlID09PSAiZGV0ZXJtaW5hdGUiID8gdmFsdWUgOiBudWxsJywiW2F0dHIubW9kZV0iOiJtb2RlIn0saW5wdXRzOlsiY29sb3IiXSx0ZW1wbGF0ZTonXHgzYyEtLVxuICBwcmVzZXJ2ZUFzcGVjdFJhdGlvIG9mIHhNaWRZTWlkIG1lZXQgYXMgdGhlIGNlbnRlciBvZiB0aGUgdmlld3BvcnQgaXMgdGhlIGNpcmNsZVwnc1xuICBjZW50ZXIuIFRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZSB3aWxsIHJlbWFpbiBhdCB0aGUgY2VudGVyIG9mIHRoZSBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxuICBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIFNWRy4gYGZvY3VzYWJsZT0iZmFsc2UiYCBwcmV2ZW50cyBJRSBmcm9tIGFsbG93aW5nIHRoZSB1c2VyIHRvXG4gIHRhYiBpbnRvIHRoZSBTVkcgZWxlbWVudC5cbi0tXHgzZVxuXHgzYyEtLVxuICBBbGwgY2hpbGRyZW4gbmVlZCB0byBiZSBoaWRkZW4gZm9yIHNjcmVlbiByZWFkZXJzIGluIG9yZGVyIHRvIHN1cHBvcnQgQ2hyb21lVm94LlxuICBNb3JlIGNvbnRleHQgaW4gdGhlIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy8yMjE2NS5cbi0tXHgzZVxuPHN2Z1xuICBbc3R5bGUud2lkdGgucHhdPSJkaWFtZXRlciJcbiAgW3N0eWxlLmhlaWdodC5weF09ImRpYW1ldGVyIlxuICBbYXR0ci52aWV3Qm94XT0iX2dldFZpZXdCb3goKSJcbiAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCJcbiAgZm9jdXNhYmxlPSJmYWxzZSJcbiAgW25nU3dpdGNoXT0ibW9kZSA9PT0gXCdpbmRldGVybWluYXRlXCciXG4gIGFyaWEtaGlkZGVuPSJ0cnVlIj5cblxuICBceDNjIS0tXG4gICAgVGVjaG5pY2FsbHkgd2UgY2FuIHJldXNlIHRoZSBzYW1lIGBjaXJjbGVgIGVsZW1lbnQsIGhvd2V2ZXIgU2FmYXJpIGhhcyBhbiBpc3N1ZSB0aGF0IGJyZWFrc1xuICAgIHRoZSBTVkcgcmVuZGVyaW5nIGluIGRldGVybWluYXRlIG1vZGUsIGFmdGVyIHN3aXRjaGluZyBiZXR3ZWVuIGluZGV0ZXJtaW5hdGUgYW5kIGRldGVybWluYXRlLlxuICAgIFVzaW5nIGEgZGlmZmVyZW50IGVsZW1lbnQgYXZvaWRzIHRoZSBpc3N1ZS4gQW4gYWx0ZXJuYXRpdmUgdG8gdGhpcyBpcyBhZGRpbmcgYGRpc3BsYXk6IG5vbmVgXG4gICAgZm9yIGEgc3BsaXQgc2Vjb25kIGFuZCB0aGVuIHJlbW92aW5nIGl0IHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gbW9kZXMsIGJ1dCBpdFwncyBoYXJkIHRvIGtub3dcbiAgICBmb3IgaG93IGxvbmcgdG8gaGlkZSB0aGUgZWxlbWVudCBhbmQgaXQgY2FuIGNhdXNlIHRoZSBVSSB0byBibGluay5cbiAgLS1ceDNlXG4gIDxjaXJjbGVcbiAgICAqbmdTd2l0Y2hDYXNlPSJ0cnVlIlxuICAgIGN4PSI1MCUiXG4gICAgY3k9IjUwJSJcbiAgICBbYXR0ci5yXT0iX2dldENpcmNsZVJhZGl1cygpIlxuICAgIFtzdHlsZS5hbmltYXRpb24tbmFtZV09IlwnbWF0LXByb2dyZXNzLXNwaW5uZXItc3Ryb2tlLXJvdGF0ZS1cJyArIF9zcGlubmVyQW5pbWF0aW9uTGFiZWwiXG4gICAgW3N0eWxlLnN0cm9rZS1kYXNob2Zmc2V0LnB4XT0iX2dldFN0cm9rZURhc2hPZmZzZXQoKSJcbiAgICBbc3R5bGUuc3Ryb2tlLWRhc2hhcnJheS5weF09Il9nZXRTdHJva2VDaXJjdW1mZXJlbmNlKCkiXG4gICAgW3N0eWxlLnN0cm9rZS13aWR0aC4lXT0iX2dldENpcmNsZVN0cm9rZVdpZHRoKCkiPjwvY2lyY2xlPlxuXG4gIDxjaXJjbGVcbiAgICAqbmdTd2l0Y2hDYXNlPSJmYWxzZSJcbiAgICBjeD0iNTAlIlxuICAgIGN5PSI1MCUiXG4gICAgW2F0dHIucl09Il9nZXRDaXJjbGVSYWRpdXMoKSJcbiAgICBbc3R5bGUuc3Ryb2tlLWRhc2hvZmZzZXQucHhdPSJfZ2V0U3Ryb2tlRGFzaE9mZnNldCgpIlxuICAgIFtzdHlsZS5zdHJva2UtZGFzaGFycmF5LnB4XT0iX2dldFN0cm9rZUNpcmN1bWZlcmVuY2UoKSJcbiAgICBbc3R5bGUuc3Ryb2tlLXdpZHRoLiVdPSJfZ2V0Q2lyY2xlU3Ryb2tlV2lkdGgoKSI+PC9jaXJjbGU+XG48L3N2Zz5cbicsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaCxlbmNhcHN1bGF0aW9uOkhuLk5vbmUsc3R5bGVzOlsiLm1hdC1wcm9ncmVzcy1zcGlubmVye2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246cmVsYXRpdmU7b3ZlcmZsb3c6aGlkZGVufS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBzdmd7cG9zaXRpb246YWJzb2x1dGU7dHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpO3RvcDowO2xlZnQ6MDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBjaXJjbGV7ZmlsbDp0cmFuc3BhcmVudDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjt0cmFuc2l0aW9uOnN0cm9rZS1kYXNob2Zmc2V0IDIyNW1zIGxpbmVhcn0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXByb2dyZXNzLXNwaW5uZXIgY2lyY2xle3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBjaXJjbGV7c3Ryb2tlOmN1cnJlbnRDb2xvcjtzdHJva2U6Q2FudmFzVGV4dH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBzdmd7YW5pbWF0aW9uOm1hdC1wcm9ncmVzcy1zcGlubmVyLWxpbmVhci1yb3RhdGUgMjAwMG1zIGxpbmVhciBpbmZpbml0ZX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBzdmd7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1pbmRldGVybWluYXRlLWFuaW1hdGlvblttb2RlPWluZGV0ZXJtaW5hdGVdIGNpcmNsZXt0cmFuc2l0aW9uLXByb3BlcnR5OnN0cm9rZTthbmltYXRpb24tZHVyYXRpb246NDAwMG1zO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpO2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6aW5maW5pdGV9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV0gY2lyY2xle3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1mYWxsYmFjay1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBzdmd7YW5pbWF0aW9uOm1hdC1wcm9ncmVzcy1zcGlubmVyLXN0cm9rZS1yb3RhdGUtZmFsbGJhY2sgMTAwMDBtcyBjdWJpYy1iZXppZXIoMC44NywgMC4wMywgMC4zMywgMSkgaW5maW5pdGV9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtZmFsbGJhY2stYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV0gc3Zne3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1mYWxsYmFjay1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBjaXJjbGV7dHJhbnNpdGlvbi1wcm9wZXJ0eTpzdHJva2V9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtZmFsbGJhY2stYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV0gY2lyY2xle3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX1Aa2V5ZnJhbWVzIG1hdC1wcm9ncmVzcy1zcGlubmVyLWxpbmVhci1yb3RhdGV7MCV7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19QGtleWZyYW1lcyBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1zdHJva2Utcm90YXRlLTEwMHswJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMi41JXtzdHJva2UtZGFzaG9mZnNldDo1Ni41NDg2Njc3cHg7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMi41MDAxJXtzdHJva2UtZGFzaG9mZnNldDo1Ni41NDg2Njc3cHg7dHJhbnNmb3JtOnJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoNzIuNWRlZyl9MjUle3N0cm9rZS1kYXNob2Zmc2V0OjI2OC42MDYxNzE1NzVweDt0cmFuc2Zvcm06cm90YXRlWCgxODBkZWcpIHJvdGF0ZSg3Mi41ZGVnKX0yNS4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgyNzBkZWcpfTM3LjUle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlKDI3MGRlZyl9MzcuNTAwMSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDE2MS41ZGVnKX01MCV7c3Ryb2tlLWRhc2hvZmZzZXQ6MjY4LjYwNjE3MTU3NXB4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDE2MS41ZGVnKX01MC4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpfTYyLjUle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlKDE4MGRlZyl9NjIuNTAwMSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDI1MS41ZGVnKX03NSV7c3Ryb2tlLWRhc2hvZmZzZXQ6MjY4LjYwNjE3MTU3NXB4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDI1MS41ZGVnKX03NS4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyl9ODcuNSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGUoOTBkZWcpfTg3LjUwMDEle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlWCgxODBkZWcpIHJvdGF0ZSgzNDEuNWRlZyl9MTAwJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMzQxLjVkZWcpfX1Aa2V5ZnJhbWVzIG1hdC1wcm9ncmVzcy1zcGlubmVyLXN0cm9rZS1yb3RhdGUtZmFsbGJhY2t7MCV7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX0yNSV7dHJhbnNmb3JtOnJvdGF0ZSgxMTcwZGVnKX01MCV7dHJhbnNmb3JtOnJvdGF0ZSgyMzQwZGVnKX03NSV7dHJhbnNmb3JtOnJvdGF0ZSgzNTEwZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoNDY4MGRlZyl9fVxuIl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6d3p9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOlt0MV19XX1dfSkse21vZGU6W3t0eXBlOnh5fV0sZGlhbWV0ZXI6W3t0eXBlOnh5fV0sc3Ryb2tlV2lkdGg6W3t0eXBlOnh5fV0sdmFsdWU6W3t0eXBlOnh5fV19KTtjbGFzcyBvMSBleHRlbmRzIG4xe2NvbnN0cnVjdG9yKHQsZSxuLG8saSl7c3VwZXIodCxlLG4sbyxpKSx0aGlzLm1vZGU9ImluZGV0ZXJtaW5hdGUifX1vMS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bzEpKFNtKGhnKSxTbSh3eiksU20oWl8sOCksU20oVlAsOCksU20odDEpKX0sbzEuybVjbXA9dG8oe3R5cGU6bzEsc2VsZWN0b3JzOltbIm1hdC1zcGlubmVyIl1dLGhvc3RBdHRyczpbInJvbGUiLCJwcm9ncmVzc2JhciIsIm1vZGUiLCJpbmRldGVybWluYXRlIiwxLCJtYXQtc3Bpbm5lciIsIm1hdC1wcm9ncmVzcy1zcGlubmVyIl0saG9zdFZhcnM6Nixob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmKGR1KCJ3aWR0aCIsbi5kaWFtZXRlciwicHgiKSgiaGVpZ2h0IixuLmRpYW1ldGVyLCJweCIpLHB1KCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsbi5fbm9vcEFuaW1hdGlvbnMpKX0saW5wdXRzOntjb2xvcjoiY29sb3IifSxmZWF0dXJlczpbeHBdLGRlY2xzOjMsdmFyczo4LGNvbnN0czpbWyJwcmVzZXJ2ZUFzcGVjdFJhdGlvIiwieE1pZFlNaWQgbWVldCIsImZvY3VzYWJsZSIsImZhbHNlIiwiYXJpYS1oaWRkZW4iLCJ0cnVlIiwzLCJuZ1N3aXRjaCJdLFsiY3giLCI1MCUiLCJjeSIsIjUwJSIsMywiYW5pbWF0aW9uLW5hbWUiLCJzdHJva2UtZGFzaG9mZnNldCIsInN0cm9rZS1kYXNoYXJyYXkiLCJzdHJva2Utd2lkdGgiLDQsIm5nU3dpdGNoQ2FzZSJdLFsiY3giLCI1MCUiLCJjeSIsIjUwJSIsMywic3Ryb2tlLWRhc2hvZmZzZXQiLCJzdHJva2UtZGFzaGFycmF5Iiwic3Ryb2tlLXdpZHRoIiw0LCJuZ1N3aXRjaENhc2UiXSxbImN4IiwiNTAlIiwiY3kiLCI1MCUiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKHFpKCksUm0oMCwic3ZnIiwwKSxRcCgxLEswLDEsOSwiY2lyY2xlIiwxKSxRcCgyLEowLDEsNywiY2lyY2xlIiwyKSxBbSgpKSwyJmUmJihkdSgid2lkdGgiLG4uZGlhbWV0ZXIsInB4IikoImhlaWdodCIsbi5kaWFtZXRlciwicHgiKSxEbSgibmdTd2l0Y2giLCJpbmRldGVybWluYXRlIj09PW4ubW9kZSksanAoInZpZXdCb3giLG4uX2dldFZpZXdCb3goKSkscmMoMSksRG0oIm5nU3dpdGNoQ2FzZSIsITApLHJjKDEpLERtKCJuZ1N3aXRjaENhc2UiLCExKSl9LGRpcmVjdGl2ZXM6W2ZNLGdNXSxzdHlsZXM6W1EwXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSxvMS5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTp3en0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W3QxXX1dfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChvMSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtYXQtc3Bpbm5lciIsaG9zdDp7cm9sZToicHJvZ3Jlc3NiYXIiLG1vZGU6ImluZGV0ZXJtaW5hdGUiLGNsYXNzOiJtYXQtc3Bpbm5lciBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lciIsIltjbGFzcy5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZV0iOiJfbm9vcEFuaW1hdGlvbnMiLCJbc3R5bGUud2lkdGgucHhdIjoiZGlhbWV0ZXIiLCJbc3R5bGUuaGVpZ2h0LnB4XSI6ImRpYW1ldGVyIn0saW5wdXRzOlsiY29sb3IiXSx0ZW1wbGF0ZTonXHgzYyEtLVxuICBwcmVzZXJ2ZUFzcGVjdFJhdGlvIG9mIHhNaWRZTWlkIG1lZXQgYXMgdGhlIGNlbnRlciBvZiB0aGUgdmlld3BvcnQgaXMgdGhlIGNpcmNsZVwnc1xuICBjZW50ZXIuIFRoZSBjZW50ZXIgb2YgdGhlIGNpcmNsZSB3aWxsIHJlbWFpbiBhdCB0aGUgY2VudGVyIG9mIHRoZSBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxuICBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIFNWRy4gYGZvY3VzYWJsZT0iZmFsc2UiYCBwcmV2ZW50cyBJRSBmcm9tIGFsbG93aW5nIHRoZSB1c2VyIHRvXG4gIHRhYiBpbnRvIHRoZSBTVkcgZWxlbWVudC5cbi0tXHgzZVxuXHgzYyEtLVxuICBBbGwgY2hpbGRyZW4gbmVlZCB0byBiZSBoaWRkZW4gZm9yIHNjcmVlbiByZWFkZXJzIGluIG9yZGVyIHRvIHN1cHBvcnQgQ2hyb21lVm94LlxuICBNb3JlIGNvbnRleHQgaW4gdGhlIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy8yMjE2NS5cbi0tXHgzZVxuPHN2Z1xuICBbc3R5bGUud2lkdGgucHhdPSJkaWFtZXRlciJcbiAgW3N0eWxlLmhlaWdodC5weF09ImRpYW1ldGVyIlxuICBbYXR0ci52aWV3Qm94XT0iX2dldFZpZXdCb3goKSJcbiAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCJcbiAgZm9jdXNhYmxlPSJmYWxzZSJcbiAgW25nU3dpdGNoXT0ibW9kZSA9PT0gXCdpbmRldGVybWluYXRlXCciXG4gIGFyaWEtaGlkZGVuPSJ0cnVlIj5cblxuICBceDNjIS0tXG4gICAgVGVjaG5pY2FsbHkgd2UgY2FuIHJldXNlIHRoZSBzYW1lIGBjaXJjbGVgIGVsZW1lbnQsIGhvd2V2ZXIgU2FmYXJpIGhhcyBhbiBpc3N1ZSB0aGF0IGJyZWFrc1xuICAgIHRoZSBTVkcgcmVuZGVyaW5nIGluIGRldGVybWluYXRlIG1vZGUsIGFmdGVyIHN3aXRjaGluZyBiZXR3ZWVuIGluZGV0ZXJtaW5hdGUgYW5kIGRldGVybWluYXRlLlxuICAgIFVzaW5nIGEgZGlmZmVyZW50IGVsZW1lbnQgYXZvaWRzIHRoZSBpc3N1ZS4gQW4gYWx0ZXJuYXRpdmUgdG8gdGhpcyBpcyBhZGRpbmcgYGRpc3BsYXk6IG5vbmVgXG4gICAgZm9yIGEgc3BsaXQgc2Vjb25kIGFuZCB0aGVuIHJlbW92aW5nIGl0IHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gbW9kZXMsIGJ1dCBpdFwncyBoYXJkIHRvIGtub3dcbiAgICBmb3IgaG93IGxvbmcgdG8gaGlkZSB0aGUgZWxlbWVudCBhbmQgaXQgY2FuIGNhdXNlIHRoZSBVSSB0byBibGluay5cbiAgLS1ceDNlXG4gIDxjaXJjbGVcbiAgICAqbmdTd2l0Y2hDYXNlPSJ0cnVlIlxuICAgIGN4PSI1MCUiXG4gICAgY3k9IjUwJSJcbiAgICBbYXR0ci5yXT0iX2dldENpcmNsZVJhZGl1cygpIlxuICAgIFtzdHlsZS5hbmltYXRpb24tbmFtZV09IlwnbWF0LXByb2dyZXNzLXNwaW5uZXItc3Ryb2tlLXJvdGF0ZS1cJyArIF9zcGlubmVyQW5pbWF0aW9uTGFiZWwiXG4gICAgW3N0eWxlLnN0cm9rZS1kYXNob2Zmc2V0LnB4XT0iX2dldFN0cm9rZURhc2hPZmZzZXQoKSJcbiAgICBbc3R5bGUuc3Ryb2tlLWRhc2hhcnJheS5weF09Il9nZXRTdHJva2VDaXJjdW1mZXJlbmNlKCkiXG4gICAgW3N0eWxlLnN0cm9rZS13aWR0aC4lXT0iX2dldENpcmNsZVN0cm9rZVdpZHRoKCkiPjwvY2lyY2xlPlxuXG4gIDxjaXJjbGVcbiAgICAqbmdTd2l0Y2hDYXNlPSJmYWxzZSJcbiAgICBjeD0iNTAlIlxuICAgIGN5PSI1MCUiXG4gICAgW2F0dHIucl09Il9nZXRDaXJjbGVSYWRpdXMoKSJcbiAgICBbc3R5bGUuc3Ryb2tlLWRhc2hvZmZzZXQucHhdPSJfZ2V0U3Ryb2tlRGFzaE9mZnNldCgpIlxuICAgIFtzdHlsZS5zdHJva2UtZGFzaGFycmF5LnB4XT0iX2dldFN0cm9rZUNpcmN1bWZlcmVuY2UoKSJcbiAgICBbc3R5bGUuc3Ryb2tlLXdpZHRoLiVdPSJfZ2V0Q2lyY2xlU3Ryb2tlV2lkdGgoKSI+PC9jaXJjbGU+XG48L3N2Zz5cbicsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaCxlbmNhcHN1bGF0aW9uOkhuLk5vbmUsc3R5bGVzOlsiLm1hdC1wcm9ncmVzcy1zcGlubmVye2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246cmVsYXRpdmU7b3ZlcmZsb3c6aGlkZGVufS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBzdmd7cG9zaXRpb246YWJzb2x1dGU7dHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpO3RvcDowO2xlZnQ6MDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBjaXJjbGV7ZmlsbDp0cmFuc3BhcmVudDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjt0cmFuc2l0aW9uOnN0cm9rZS1kYXNob2Zmc2V0IDIyNW1zIGxpbmVhcn0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXByb2dyZXNzLXNwaW5uZXIgY2lyY2xle3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBjaXJjbGV7c3Ryb2tlOmN1cnJlbnRDb2xvcjtzdHJva2U6Q2FudmFzVGV4dH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBzdmd7YW5pbWF0aW9uOm1hdC1wcm9ncmVzcy1zcGlubmVyLWxpbmVhci1yb3RhdGUgMjAwMG1zIGxpbmVhciBpbmZpbml0ZX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBzdmd7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1pbmRldGVybWluYXRlLWFuaW1hdGlvblttb2RlPWluZGV0ZXJtaW5hdGVdIGNpcmNsZXt0cmFuc2l0aW9uLXByb3BlcnR5OnN0cm9rZTthbmltYXRpb24tZHVyYXRpb246NDAwMG1zO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpO2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6aW5maW5pdGV9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV0gY2lyY2xle3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1mYWxsYmFjay1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBzdmd7YW5pbWF0aW9uOm1hdC1wcm9ncmVzcy1zcGlubmVyLXN0cm9rZS1yb3RhdGUtZmFsbGJhY2sgMTAwMDBtcyBjdWJpYy1iZXppZXIoMC44NywgMC4wMywgMC4zMywgMSkgaW5maW5pdGV9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtZmFsbGJhY2stYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV0gc3Zne3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1mYWxsYmFjay1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBjaXJjbGV7dHJhbnNpdGlvbi1wcm9wZXJ0eTpzdHJva2V9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtZmFsbGJhY2stYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV0gY2lyY2xle3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX1Aa2V5ZnJhbWVzIG1hdC1wcm9ncmVzcy1zcGlubmVyLWxpbmVhci1yb3RhdGV7MCV7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19QGtleWZyYW1lcyBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1zdHJva2Utcm90YXRlLTEwMHswJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMi41JXtzdHJva2UtZGFzaG9mZnNldDo1Ni41NDg2Njc3cHg7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMi41MDAxJXtzdHJva2UtZGFzaG9mZnNldDo1Ni41NDg2Njc3cHg7dHJhbnNmb3JtOnJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoNzIuNWRlZyl9MjUle3N0cm9rZS1kYXNob2Zmc2V0OjI2OC42MDYxNzE1NzVweDt0cmFuc2Zvcm06cm90YXRlWCgxODBkZWcpIHJvdGF0ZSg3Mi41ZGVnKX0yNS4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgyNzBkZWcpfTM3LjUle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlKDI3MGRlZyl9MzcuNTAwMSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDE2MS41ZGVnKX01MCV7c3Ryb2tlLWRhc2hvZmZzZXQ6MjY4LjYwNjE3MTU3NXB4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDE2MS41ZGVnKX01MC4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpfTYyLjUle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlKDE4MGRlZyl9NjIuNTAwMSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDI1MS41ZGVnKX03NSV7c3Ryb2tlLWRhc2hvZmZzZXQ6MjY4LjYwNjE3MTU3NXB4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDI1MS41ZGVnKX03NS4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyl9ODcuNSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGUoOTBkZWcpfTg3LjUwMDEle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlWCgxODBkZWcpIHJvdGF0ZSgzNDEuNWRlZyl9MTAwJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMzQxLjVkZWcpfX1Aa2V5ZnJhbWVzIG1hdC1wcm9ncmVzcy1zcGlubmVyLXN0cm9rZS1yb3RhdGUtZmFsbGJhY2t7MCV7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX0yNSV7dHJhbnNmb3JtOnJvdGF0ZSgxMTcwZGVnKX01MCV7dHJhbnNmb3JtOnJvdGF0ZSgyMzQwZGVnKX03NSV7dHJhbnNmb3JtOnJvdGF0ZSgzNTEwZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoNDY4MGRlZyl9fVxuIl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6d3p9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbWl9dfV19LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbVlBdfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOlt0MV19XX1dfSksbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBpMXt9aTEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGkxKX0saTEuybVtb2Q9YW8oe3R5cGU6aTF9KSxpMS7JtWluaj12bih7aW1wb3J0czpbW1hJLFdNXSxYSV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGkxLFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbWEksV01dLGV4cG9ydHM6W24xLG8xLFhJXSxkZWNsYXJhdGlvbnM6W24xLG8xXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKGkxLHtkZWNsYXJhdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm5bbjEsbzFdfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1hJLFdNXX0sZXhwb3J0czpmdW5jdGlvbigpe3JldHVybltuMSxvMSxYSV19fSk7Y29uc3QgYTE9WyJyZWdleFN0cmluZ0lucHV0Il07ZnVuY3Rpb24gcjEodCxlKXtpZigxJnQmJihObSgwKSxSbSgxLCJsaSIsMjIpLGt1KDIpLEFtKCksem0oKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0O3JjKDEpLERtKCJ0aXRsZSIsdC5uYW1lKSxyYygxKSxTdSh0Lm5hbWUpfX1mdW5jdGlvbiBzMSh0LGUpe2lmKDEmdCYmKFJtKDAsImxpIiwyMyksUm0oMSwiZW0iKSxrdSgyKSxBaCgzLCJudW1iZXIiKSxBbSgpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpLiRpbXBsaWNpdDtyYygyKSxEdSgiYW5kICIsVGgoMywxLHQucnVucy5sZW5ndGgtNSksIiBtb3JlIil9fWZ1bmN0aW9uIGwxKHQsZSl7MSZ0JiYoUm0oMCwibGkiLDI0KSxSbSgxLCJlbSIpLGt1KDIsIk5vIHJ1bnMgYXJlIGluIHRoZSBncm91cCIpLEFtKCksQW0oKSl9Y29uc3QgYzE9ZnVuY3Rpb24odCl7cmV0dXJue2JvcmRlckNvbG9yOnR9fSxkMT1mdW5jdGlvbih0KXtyZXR1cm57YmFja2dyb3VuZENvbG9yOnR9fTtmdW5jdGlvbiBwMSh0LGUpe2lmKDEmdCYmKFJtKDAsInVsIiwxNiksUm0oMSwibGkiKSxSbSgyLCJsYWJlbCIpLFRtKDMsInNwYW4iLDE3KSxSbSg0LCJjb2RlIiwxOCksa3UoNSksQW0oKSxBbSgpLFJtKDYsInVsIiksUXAoNyxyMSwzLDIsIm5nLWNvbnRhaW5lciIsMTkpLEFoKDgsInNsaWNlIiksUXAoOSxzMSw0LDMsImxpIiwyMCksUXAoMTAsbDEsMywwLCJsaSIsMjEpLEFtKCksQW0oKSxBbSgpKSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQ7RG0oIm5nU3R5bGUiLE1oKDExLGMxLHQuY29sb3IpKSxyYygzKSxEbSgibmdTdHlsZSIsTWgoMTMsZDEsdC5jb2xvcikpLHJjKDEpLERtKCJ0aXRsZSIsdC5ncm91cElkKSxyYygxKSxTdSh0Lmdyb3VwSWQpLHJjKDIpLERtKCJuZ0Zvck9mIix6aCg4LDcsdC5ydW5zLDAsNSkpLHJjKDIpLERtKCJuZ0lmIix0LnJ1bnMubGVuZ3RoPjUpLHJjKDEpLERtKCJuZ0lmIiwwPT09dC5ydW5zLmxlbmd0aCl9fWZ1bmN0aW9uIG0xKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2IiwxNCksUXAoMSxwMSwxMSwxNSwidWwiLDE1KSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMik7cmMoMSksRG0oIm5nRm9yT2YiLHQuY29sb3JSdW5QYWlyTGlzdCl9fWZ1bmN0aW9uIHUxKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2IiwyNSksa3UoMSwiIFRoZXJlIGFyZSBubyBydW5zIG1hdGNoaW5nIHRoZSByZWdleCwgIiksUm0oMiwiY29kZSIpLGt1KDMpLEFtKCksa3UoNCwiLiBQbGVhc2UgY2hlY2sgaWYgeW91ciByZWdleCBzdHJpbmcgaXMgY29ycmVjdC4gIiksQW0oKSksMiZ0KXtjb25zdCB0PVltKDIpO3JjKDMpLER1KCIvIix0LnJlZ2V4U3RyaW5nLCIvIil9fWZ1bmN0aW9uIGYxKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2IiwxMCksUm0oMSwiaDQiKSxrdSgyLCJDb2xvciBncm91cCBwcmV2aWV3IiksQW0oKSxSbSgzLCJkaXYiLDExKSxRcCg0LG0xLDIsMSwiZGl2IiwxMiksUXAoNSx1MSw1LDEsIm5nLXRlbXBsYXRlIixudWxsLDEzLGliKSxBbSgpLEFtKCkpLDImdCl7Y29uc3QgdD0kcCg2KSxlPVltKCk7cmMoNCksRG0oIm5nSWYiLGUuY29sb3JSdW5QYWlyTGlzdC5sZW5ndGgpKCJuZ0lmRWxzZSIsdCl9fWNsYXNzIGcxe2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5kaWFsb2dSZWY9dCx0aGlzLmhvc3RFbFJlZj1lLHRoaXMub25TYXZlPW5ldyBMaCx0aGlzLnJlZ2V4SW5wdXRPbkNoYW5nZT1uZXcgTGgsdGhpcy50aW1lT3V0SWQ9MH1yZXNldEZvY3VzKCl7dGhpcy5ob3N0RWxSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KXx8dGhpcy5yZWdleFN0cmluZ0lucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKX1vbkVudGVyKHQpe3RoaXMub25TYXZlQ2xpY2sodCksdGhpcy5kaWFsb2dSZWYuY2xvc2UoKX1vblNhdmVDbGljayh0KXt0aGlzLm9uU2F2ZS5lbWl0KHQpfWZpbGxFeGFtcGxlKHQpe3RoaXMucmVnZXhTdHJpbmc9dCx0aGlzLnJlZ2V4SW5wdXRDaGFuZ2UodCl9cmVnZXhJbnB1dENoYW5nZSh0KXt0aGlzLnJlZ2V4SW5wdXRPbkNoYW5nZS5lbWl0KHQpfWhhbmRsZUZvY3VzT3V0KCl7Y2xlYXJUaW1lb3V0KHRoaXMudGltZU91dElkKSx0aGlzLnRpbWVPdXRJZD1zZXRUaW1lb3V0KHRoaXMucmVzZXRGb2N1cy5iaW5kKHRoaXMpLDApfX1nMS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8ZzEpKFNtKFhHKSxTbShoZykpfSxnMS7JtWNtcD10byh7dHlwZTpnMSxzZWxlY3RvcnM6W1sicmVnZXgtZWRpdC1kaWFsb2ctY29tcG9uZW50Il1dLHZpZXdRdWVyeTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiZRaChhMSw3KSwyJmUpe2xldCB0O0poKHQ9dGIoKSkmJihuLnJlZ2V4U3RyaW5nSW5wdXQ9dC5maXJzdCl9fSxpbnB1dHM6e3JlZ2V4U3RyaW5nOiJyZWdleFN0cmluZyIsY29sb3JSdW5QYWlyTGlzdDoiY29sb3JSdW5QYWlyTGlzdCJ9LG91dHB1dHM6e29uU2F2ZToib25TYXZlIixyZWdleElucHV0T25DaGFuZ2U6InJlZ2V4SW5wdXRPbkNoYW5nZSJ9LGRlY2xzOjMwLHZhcnM6Mixjb25zdHM6ZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gdD0idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZT9nb29nLmdldE1zZygiQ29sb3IgUnVucyBieSBSZWdleCBRdWVyeSIpOiRsb2NhbGl6ZWA6Q29sb3IgUnVucyBieSBSZWdleCBRdWVyeeKQnzE1ZWQ5ZjZmZDJkNDkwNmE0ODAzZmMxMjU1ZGUzYzVkYjJjNTY1MzDikJ85MDg4OTg1MTEzOTYwMzEyODA4OkNvbG9yIFJ1bnMgYnkgUmVnZXggUXVlcnlgLFtbMSwicmVnZXgtZWRpdC1kaWFsb2ciLDMsImZvY3Vzb3V0Il0sWyJtYXQtZGlhbG9nLXRpdGxlIiwiIl0sWyJtYXRJbnB1dCIsIiIsImFyaWEtbGFiZWwiLHQsImNka0ZvY3VzSW5pdGlhbCIsIiIsMywidmFsdWUiLCJrZXlkb3duLmVudGVyIiwiaW5wdXQiXSxbInJlZ2V4U3RyaW5nSW5wdXQiLCIiXSxbMSwiZXhhbXBsZS1kZXRhaWxzIl0sWzMsImNsaWNrIl0sWyJjbGFzcyIsImdyb3VwLWNvbnRhaW5lciIsNCwibmdJZiJdLFsibWF0LWRpYWxvZy1hY3Rpb25zIiwiIiwiYWxpZ24iLCJlbmQiXSxbIm1hdC1idXR0b24iLCIiLCJtYXQtZGlhbG9nLWNsb3NlIiwiIl0sWyJtYXQtcmFpc2VkLWJ1dHRvbiIsIiIsImNvbG9yIiwicHJpbWFyeSIsIm1hdC1kaWFsb2ctY2xvc2UiLCIiLDMsImNsaWNrIl0sWzEsImdyb3VwLWNvbnRhaW5lciJdLFsxLCJncm91cGluZy1wcmV2aWV3Il0sWyJjbGFzcyIsIm1hdGNoLWNvbnRhaW5lciIsNCwibmdJZiIsIm5nSWZFbHNlIl0sWyJlbXB0eSIsIiJdLFsxLCJtYXRjaC1jb250YWluZXIiXSxbImNsYXNzIiwiZ3JvdXAiLDMsIm5nU3R5bGUiLDQsIm5nRm9yIiwibmdGb3JPZiJdLFsxLCJncm91cCIsMywibmdTdHlsZSJdLFsxLCJjb2xvci1zd2F0Y2giLDMsIm5nU3R5bGUiXSxbMSwiZ3JvdXAtaWQiLDMsInRpdGxlIl0sWzQsIm5nRm9yIiwibmdGb3JPZiJdLFsiY2xhc3MiLCJtb3JlIiw0LCJuZ0lmIl0sWyJjbGFzcyIsIm5vLW1hdGNoIiw0LCJuZ0lmIl0sWzMsInRpdGxlIl0sWzEsIm1vcmUiXSxbMSwibm8tbWF0Y2giXSxbMSwid2FybmluZyJdXX0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSl7Y29uc3QgdD1IbSgpO1JtKDAsImRpdiIsMCksVm0oImZvY3Vzb3V0IiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLmhhbmRsZUZvY3VzT3V0KCl9KSksUm0oMSwiaDEiLDEpLGt1KDIsIkNvbG9yIHJ1bnMgYnkgcmVnZXgiKSxBbSgpLFJtKDMsIm1hdC1kaWFsb2ctY29udGVudCIpLFJtKDQsInAiKSxrdSg1LCJFbnRlciBhIHJlZ2V4IHdpdGggY2FwdHVyaW5nIGdyb3VwcyB0byBtYXRjaCBhZ2FpbnN0IHJ1biBuYW1lczoiKSxBbSgpLFJtKDYsIm1hdC1mb3JtLWZpZWxkIiksUm0oNywiaW5wdXQiLDIsMyksVm0oImtleWRvd24uZW50ZXIiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uRW50ZXIoZS50YXJnZXQudmFsdWUpfSkpKCJpbnB1dCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ucmVnZXhJbnB1dENoYW5nZShlLnRhcmdldC52YWx1ZSl9KSksQW0oKSxBbSgpLEFtKCksUm0oOSwiZGl2Iiw0KSxSbSgxMCwicCIpLGt1KDExLCcgRWFjaCBtYXRjaGluZyBydW4gd2lsbCBiZSBhc3NpZ25lZCBhIGNvbG9yIGJhc2VkIG9uIHRoZSAia2V5IiBmb3JtZWQgYnkgaXRzIG1hdGNoZXMgdG8gdGhlIGNhcHR1cmluZyBncm91cHMuICcpLFRtKDEyLCJiciIpLFJtKDEzLCJidXR0b24iLDUpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5maWxsRXhhbXBsZSgiKHRyYWlufGV2YWwpIil9KSksa3UoMTQsIiBUcnkgIiksUm0oMTUsImNvZGUiKSxrdSgxNiwiKHRyYWlufGV2YWwpIiksQW0oKSxBbSgpLGt1KDE3LCIgdG8gYXNzaWduIGFsbCBydW5zIGNvbnRhaW5pbmcgIiksUm0oMTgsImNvZGUiKSxrdSgxOSwidHJhaW4iKSxBbSgpLGt1KDIwLCIgdG8gb25lIGNvbG9yIGFuZCBhbGwgcnVucyBjb250YWluaW5nICIpLFJtKDIxLCJjb2RlIiksa3UoMjIsImV2YWwiKSxBbSgpLGt1KDIzLCIgdG8gYW5vdGhlciBjb2xvci4gIiksQW0oKSxBbSgpLFFwKDI0LGYxLDcsMiwiZGl2Iiw2KSxSbSgyNSwiZGl2Iiw3KSxSbSgyNiwiYnV0dG9uIiw4KSxrdSgyNywiQ2FuY2VsIiksQW0oKSxSbSgyOCwiYnV0dG9uIiw5KSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7aGkodCk7Y29uc3Qgbz0kcCg4KTtyZXR1cm4gbi5vblNhdmVDbGljayhvLnZhbHVlKX0pKSxrdSgyOSwiIFNhdmUgIiksQW0oKSxBbSgpLEFtKCl9MiZlJiYocmMoNyksS20oInZhbHVlIixuLnJlZ2V4U3RyaW5nKSxyYygxNyksRG0oIm5nSWYiLG4ucmVnZXhTdHJpbmcpKX0sZGlyZWN0aXZlczpbclcsc1csQVYsTFksZE0sbFcsWEgsYVcsbE0sQ01dLHBpcGVzOltVTSxGTV0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9LmV4YW1wbGUtZGV0YWlsc1tfbmdjb250ZW50LSVDT01QJV0gICBidXR0b25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7cGFkZGluZzowO2JvcmRlcjpub25lO2N1cnNvcjpwb2ludGVyO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Y29sb3I6IzE5NzZkMn1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuZXhhbXBsZS1kZXRhaWxzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5leGFtcGxlLWRldGFpbHNbX25nY29udGVudC0lQ09NUCVdICAgYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNDJhNWY1fS5leGFtcGxlLWRldGFpbHNbX25nY29udGVudC0lQ09NUCVdICAgYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTp2aXNpdGVke2NvbG9yOiM3YjFmYTJ9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmV4YW1wbGUtZGV0YWlsc1tfbmdjb250ZW50LSVDT01QJV0gICBidXR0b25bX25nY29udGVudC0lQ09NUCVdOnZpc2l0ZWQsIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5leGFtcGxlLWRldGFpbHNbX25nY29udGVudC0lQ09NUCVdICAgYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTp2aXNpdGVke2NvbG9yOiNiYTY4Yzh9Lmdyb3VwLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjEwcHggMH0uZ3JvdXAtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOjEwcHh9Lmdyb3VwLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0gICAud2FybmluZ1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MTtmb250LXNpemU6LjllbX1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXAtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC53YXJuaW5nW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmdyb3VwLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0gICAud2FybmluZ1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9Lmdyb3VwaW5nLXByZXZpZXdbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjoxcHggc29saWQgI2ViZWJlYjttYXgtaGVpZ2h0OjUwdmg7b3ZlcmZsb3cteTphdXRvO3BhZGRpbmc6MjBweH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXBpbmctcHJldmlld1tfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cGluZy1wcmV2aWV3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MXB4IHNvbGlkICM1NTV9Lm1hdGNoLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6ZmxleC1zdGFydDtkaXNwbGF5OmdyaWQ7ZmxleC13cmFwOndyYXA7Z2FwOjEwcHg7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdCgyLCBtaW5tYXgoNTAlLCAxZnIpKX0uY29sb3Itc3dhdGNoW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmFkaXVzOjUwJTtib3gtc2hhZG93OjAgMCAycHggIzAwMDtkaXNwbGF5OmlubGluZS1ibG9jaztoZWlnaHQ6MTVweDt3aWR0aDoxNXB4fXVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaXN0LXN0eWxlLXR5cGU6bm9uZTtwYWRkaW5nOjB9bWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwMCV9Lmdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MXB4IHNvbGlkICNlYmViZWI7Ym9yZGVyLXJhZGl1czozcHg7bWFyZ2luOjA7cGFkZGluZzoxMHB4fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cFtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjFweCBzb2xpZCAjNTU1fS5ncm91cFtfbmdjb250ZW50LSVDT01QJV0gICBsYWJlbFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2ViZWJlYjthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpncmlkO2dhcDoxMHB4O2dyaWQtdGVtcGxhdGUtY29sdW1uczptYXgtY29udGVudCBhdXRvO3BhZGRpbmc6NXB4IDB9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjNTU1fS5ncm91cFtfbmdjb250ZW50LSVDT01QJV0gICBsYWJlbFtfbmdjb250ZW50LSVDT01QJV0gICAuZ3JvdXAtaWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTouOTVlbTtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9Lmdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6LjllbX0uZ3JvdXBbX25nY29udGVudC0lQ09NUCVdICAgdWxbX25nY29udGVudC0lQ09NUCVdICAgbGlbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcH0uZ3JvdXBbX25nY29udGVudC0lQ09NUCVdICAgLm1vcmVbX25nY29udGVudC0lQ09NUCVdLCAuZ3JvdXBbX25nY29udGVudC0lQ09NUCVdICAgLm5vLW1hdGNoW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxO21hcmdpbi10b3A6NXB4fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cFtfbmdjb250ZW50LSVDT01QJV0gICAubW9yZVtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cFtfbmdjb250ZW50LSVDT01QJV0gICAubW9yZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5uby1tYXRjaFtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cFtfbmdjb250ZW50LSVDT01QJV0gICAubm8tbWF0Y2hbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChnMSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJyZWdleC1lZGl0LWRpYWxvZy1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiJyZWdleF9lZGl0X2RpYWxvZy5uZy5odG1sIixzdHlsZVVybHM6WyJyZWdleF9lZGl0X2RpYWxvZ19jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlhHfSx7dHlwZTpoZ31dfSkse3JlZ2V4U3RyaW5nOlt7dHlwZTp4eX1dLGNvbG9yUnVuUGFpckxpc3Q6W3t0eXBlOnh5fV0sb25TYXZlOlt7dHlwZTpPeX1dLHJlZ2V4SW5wdXRPbkNoYW5nZTpbe3R5cGU6T3l9XSxyZWdleFN0cmluZ0lucHV0Olt7dHlwZTpaYSxhcmdzOlsicmVnZXhTdHJpbmdJbnB1dCIse3N0YXRpYzohMH1dfV19KTtjbGFzcyBoMXtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5zdG9yZT10LHRoaXMuZGlhbG9nUmVmPWUsdGhpcy50ZW50YXRpdmVSZWdleFN0cmluZyQ9bmV3IEksdGhpcy5ncm91cEJ5UmVnZXhTdHJpbmckPVF0KCgoKT0+cmUodGhpcy5zdG9yZS5zZWxlY3QoTU4pLnBpcGUoYmUoMSkpLHRoaXMudGVudGF0aXZlUmVnZXhTdHJpbmckKSkpLnBpcGUoTmUoIiIpKSx0aGlzLmNvbG9yUnVuUGFpckxpc3QkPVF0KCgoKT0+dGhpcy5ncm91cEJ5UmVnZXhTdHJpbmckLnBpcGUoZ2UoNTAwKSxjZSgodD0+e3RyeXtjb25zdCBlPW5ldyBSZWdFeHAodCk7cmV0dXJuIEJvb2xlYW4oZSl9Y2F0Y2godCl7cmV0dXJuITF9fSkpLGZlKHRoaXMuYWxsUnVucyQsdGhpcy5ydW5JZFRvRWlkJCx0aGlzLnN0b3JlLnNlbGVjdChBTiksdGhpcy5zdG9yZS5zZWxlY3QoSkQpKSxJdCgoKFt0LGUsbixvLGldKT0+e2NvbnN0IGE9bk4oe2tleTp0Ti5SRUdFWCxyZWdleFN0cmluZzp0fSxlLG4pLHI9bmV3IE1hcCxzPVtdO2Zvcihjb25zdFt0LGVdb2YgT2JqZWN0LmVudHJpZXMoYS5tYXRjaGVzKSl7bGV0IG49ci5nZXQodCk7aWYoIW4pe2NvbnN0IGU9by5jb2xvcnNbci5zaXplJW8uY29sb3JzLmxlbmd0aF07bj1pP2UuZGFya0hleDplLmxpZ2h0SGV4LHIuc2V0KHQsbil9cy5wdXNoKHtncm91cElkOnQsY29sb3I6bixydW5zOmV9KX1yZXR1cm4gc30pKSkpKS5waXBlKE5lKFtdKSksdGhpcy5leHBlcmltZW50SWRzPW4uZXhwZXJpbWVudElkcyx0aGlzLnJ1bklkVG9FaWQkPVd0KHRoaXMuZXhwZXJpbWVudElkcy5tYXAoKHQ9PnRoaXMuc3RvcmUuc2VsZWN0KGNOLHtleHBlcmltZW50SWQ6dH0pLnBpcGUoSXQoKGU9Pih7ZXhwZXJpbWVudElkOnQscnVuSWRzOmV9KSkpKSkpKS5waXBlKEl0KCh0PT57Y29uc3QgZT17fTtmb3IoY29uc3R7cnVuSWRzOm4sZXhwZXJpbWVudElkOm99b2YgdClmb3IoY29uc3QgdCBvZiBuKWVbdF09bztyZXR1cm4gZX0pKSksdGhpcy5hbGxSdW5zJD1XdCh0aGlzLmV4cGVyaW1lbnRJZHMubWFwKCh0PT50aGlzLnN0b3JlLnNlbGVjdChsTix7ZXhwZXJpbWVudElkOnR9KSkpKS5waXBlKEl0KCh0PT50LmZsYXQoKSkpKX1vblJlZ2V4SW5wdXRPbkNoYW5nZSh0KXt0aGlzLnRlbnRhdGl2ZVJlZ2V4U3RyaW5nJC5uZXh0KHQpfW9uU2F2ZSh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKEdSKHtleHBlcmltZW50SWRzOnRoaXMuZXhwZXJpbWVudElkcyxncm91cEJ5OntrZXk6dE4uUkVHRVgscmVnZXhTdHJpbmc6dH19KSl9fWZ1bmN0aW9uIGIxKHQsZSl7MSZ0JiZUbSgwLCJtYXQtaWNvbiIsMTEpfWZ1bmN0aW9uIHkxKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiYnV0dG9uIiwxMCksVm0oImNsaWNrIiwoZnVuY3Rpb24gZSgpe2hpKHQpO2NvbnN0IG49WW0oKTtyZXR1cm4gbi5vbkdyb3VwQnlDaGFuZ2UuZW1pdCh7a2V5Om4uR3JvdXBCeUtleS5FWFBFUklNRU5UfSl9KSksUm0oMSwic3BhbiIpLFFwKDIsYjEsMSwwLCJtYXQtaWNvbiIsNyksQW0oKSxSbSgzLCJsYWJlbCIpLGt1KDQsIkV4cGVyaW1lbnQiKSxBbSgpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKCk7anAoImFyaWEtY2hlY2tlZCIsdC5zZWxlY3RlZEdyb3VwQnkua2V5PT09dC5Hcm91cEJ5S2V5LkVYUEVSSU1FTlQpLHJjKDIpLERtKCJuZ0lmIix0LnNlbGVjdGVkR3JvdXBCeS5rZXk9PT10Lkdyb3VwQnlLZXkuRVhQRVJJTUVOVCl9fWZ1bmN0aW9uIF8xKHQsZSl7MSZ0JiZUbSgwLCJtYXQtaWNvbiIsMTEpfWZ1bmN0aW9uIEMxKHQsZSl7MSZ0JiZUbSgwLCJtYXQtaWNvbiIsMTEpfWZ1bmN0aW9uIE0xKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiYnV0dG9uIiwxMiksVm0oImNsaWNrIiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgpLm9uR3JvdXBCeVJlZ2V4Q2xpY2soKX0pKSxSbSgxLCJzcGFuIiksUXAoMixDMSwxLDAsIm1hdC1pY29uIiw3KSxBbSgpLFJtKDMsImxhYmVsIiksa3UoNCwiUmVnZXgiKSxBbSgpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKCk7anAoImFyaWEtY2hlY2tlZCIsdC5zZWxlY3RlZEdyb3VwQnkua2V5PT09dC5Hcm91cEJ5S2V5LlJFR0VYKSxyYygyKSxEbSgibmdJZiIsdC5zZWxlY3RlZEdyb3VwQnkua2V5PT09dC5Hcm91cEJ5S2V5LlJFR0VYKX19ZnVuY3Rpb24gdjEodCxlKXtpZigxJnQmJihSbSgwLCJsYWJlbCIpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgyKTtyYygxKSxTdSh0LnJlZ2V4U3RyaW5nKX19ZnVuY3Rpb24geDEodCxlKXsxJnQmJihSbSgwLCJsYWJlbCIsMTcpLGt1KDEsIihub25lIHNldCkiKSxBbSgpKX1mdW5jdGlvbiBPMSh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsImJ1dHRvbiIsMTMpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5vblJlZ2V4U3RyaW5nRWRpdCgpfSkpLFJtKDEsInNwYW4iKSxUbSgyLCJtYXQtaWNvbiIsMTQpLEFtKCksUXAoMyx2MSwyLDEsImxhYmVsIiwxNSksUXAoNCx4MSwyLDAsImxhYmVsIiwxNiksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKTtyYygzKSxEbSgibmdJZiIsdC5yZWdleFN0cmluZykscmMoMSksRG0oIm5nSWYiLCF0LnJlZ2V4U3RyaW5nKX19aDEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGgxKShTbShJdyksU20oWEcpLFNtKEpHKSl9LGgxLsm1Y21wPXRvKHt0eXBlOmgxLHNlbGVjdG9yczpbWyJyZWdleC1lZGl0LWRpYWxvZyJdXSxkZWNsczozLHZhcnM6Nixjb25zdHM6W1szLCJyZWdleFN0cmluZyIsImNvbG9yUnVuUGFpckxpc3QiLCJvblNhdmUiLCJyZWdleElucHV0T25DaGFuZ2UiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsInJlZ2V4LWVkaXQtZGlhbG9nLWNvbXBvbmVudCIsMCksVm0oIm9uU2F2ZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25TYXZlKGUpfSkpKCJyZWdleElucHV0T25DaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uUmVnZXhJbnB1dE9uQ2hhbmdlKGUpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBbSgpKSwyJmUmJkRtKCJyZWdleFN0cmluZyIsVGgoMSwyLG4uZ3JvdXBCeVJlZ2V4U3RyaW5nJCkpKCJjb2xvclJ1blBhaXJMaXN0IixUaCgyLDQsbi5jb2xvclJ1blBhaXJMaXN0JCkpfSxkaXJlY3RpdmVzOltnMV0scGlwZXM6W3dNXSxzdHlsZXM6WyJbX25naG9zdC0lQ09NUCVdLCByZWdleC1lZGl0LWRpYWxvZy1jb21wb25lbnRbX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB9Il19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGgxLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InJlZ2V4LWVkaXQtZGlhbG9nIix0ZW1wbGF0ZTonPHJlZ2V4LWVkaXQtZGlhbG9nLWNvbXBvbmVudFxuICAgIFtyZWdleFN0cmluZ109Imdyb3VwQnlSZWdleFN0cmluZyQgfCBhc3luYyJcbiAgICBbY29sb3JSdW5QYWlyTGlzdF09ImNvbG9yUnVuUGFpckxpc3QkIHwgYXN5bmMiXG4gICAgKG9uU2F2ZSk9Im9uU2F2ZSgkZXZlbnQpIlxuICAgIChyZWdleElucHV0T25DaGFuZ2UpPSJvblJlZ2V4SW5wdXRPbkNoYW5nZSgkZXZlbnQpIlxuICA+PC9yZWdleC1lZGl0LWRpYWxvZy1jb21wb25lbnQ+JyxzdHlsZXM6WyJcbiAgICAgIDpob3N0LFxuICAgICAgcmVnZXgtZWRpdC1kaWFsb2ctY29tcG9uZW50IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB9XG4gICAgIl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd30se3R5cGU6WEd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltKR119XX1dfSksbnVsbCk7Y2xhc3MgUDF7Y29uc3RydWN0b3IodCl7dGhpcy5kaWFsb2c9dCx0aGlzLkdyb3VwQnlLZXk9dE4sdGhpcy5vbkdyb3VwQnlDaGFuZ2U9bmV3IExofW9uUmVnZXhTdHJpbmdFZGl0KCl7dGhpcy5kaWFsb2cub3BlbihoMSx7bWF4SGVpZ2h0OiI5NXZoIixtYXhXaWR0aDoiODB2dyIsZGF0YTp7ZXhwZXJpbWVudElkczp0aGlzLmV4cGVyaW1lbnRJZHN9fSl9b25Hcm91cEJ5UmVnZXhDbGljaygpe3RoaXMucmVnZXhTdHJpbmc/dGhpcy5vbkdyb3VwQnlDaGFuZ2UuZW1pdCh7a2V5OnROLlJFR0VYLHJlZ2V4U3RyaW5nOnRoaXMucmVnZXhTdHJpbmd9KTp0aGlzLm9uUmVnZXhTdHJpbmdFZGl0KCl9fVAxLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxQMSkoU20ob1cpKX0sUDEuybVjbXA9dG8oe3R5cGU6UDEsc2VsZWN0b3JzOltbInJ1bnMtZ3JvdXAtbWVudS1idXR0b24tY29tcG9uZW50Il1dLGlucHV0czp7c2hvd0V4cGVyaW1lbnRzR3JvdXBCeToic2hvd0V4cGVyaW1lbnRzR3JvdXBCeSIsZXhwZXJpbWVudElkczoiZXhwZXJpbWVudElkcyIscmVnZXhTdHJpbmc6InJlZ2V4U3RyaW5nIixzZWxlY3RlZEdyb3VwQnk6InNlbGVjdGVkR3JvdXBCeSIsc2hvd0dyb3VwQnlSZWdleDoic2hvd0dyb3VwQnlSZWdleCJ9LG91dHB1dHM6e29uR3JvdXBCeUNoYW5nZToib25Hcm91cEJ5Q2hhbmdlIn0sZGVjbHM6MTQsdmFyczo2LGNvbnN0czpbWyJtYXQtaWNvbi1idXR0b24iLCIiLCJ0aXRsZSIsIkNvbG9yIHJ1bnMgYnkuLi4iLDMsIm1hdE1lbnVUcmlnZ2VyRm9yIl0sWyJzdmdJY29uIiwicGFsZXR0ZV8yNHB4Il0sWzEsInJ1bi10YWJsZS1jb2xvci1ncm91cC1ieSJdLFsiZ3JvdXBCeU1lbnUiLCJtYXRNZW51Il0sWzEsImxhYmVsIl0sWyJtYXQtbWVudS1pdGVtIiwiIiwicm9sZSIsIm1lbnVpdGVtcmFkaW8iLCJkYXRhLXZhbHVlIiwiZXhwZXJpbWVudCIsMywiY2xpY2siLDQsIm5nSWYiXSxbIm1hdC1tZW51LWl0ZW0iLCIiLCJyb2xlIiwibWVudWl0ZW1yYWRpbyIsImRhdGEtdmFsdWUiLCJydW4iLDMsImNsaWNrIl0sWyJzdmdJY29uIiwiZG9uZV8yNHB4Iiw0LCJuZ0lmIl0sWyJtYXQtbWVudS1pdGVtIiwiIiwicm9sZSIsIm1lbnVpdGVtcmFkaW8iLCJkYXRhLXZhbHVlIiwicmVnZXgiLDMsImNsaWNrIiw0LCJuZ0lmIl0sWyJtYXQtbWVudS1pdGVtIiwiIiwicm9sZSIsIm1lbnVpdGVtIiwiZGF0YS12YWx1ZSIsInJlZ2V4LWVkaXQiLCJjbGFzcyIsImRpc3BsYXktcmVnZXgtc3RyaW5nIiwzLCJjbGljayIsNCwibmdJZiJdLFsibWF0LW1lbnUtaXRlbSIsIiIsInJvbGUiLCJtZW51aXRlbXJhZGlvIiwiZGF0YS12YWx1ZSIsImV4cGVyaW1lbnQiLDMsImNsaWNrIl0sWyJzdmdJY29uIiwiZG9uZV8yNHB4Il0sWyJtYXQtbWVudS1pdGVtIiwiIiwicm9sZSIsIm1lbnVpdGVtcmFkaW8iLCJkYXRhLXZhbHVlIiwicmVnZXgiLDMsImNsaWNrIl0sWyJtYXQtbWVudS1pdGVtIiwiIiwicm9sZSIsIm1lbnVpdGVtIiwiZGF0YS12YWx1ZSIsInJlZ2V4LWVkaXQiLDEsImRpc3BsYXktcmVnZXgtc3RyaW5nIiwzLCJjbGljayJdLFsic3ZnSWNvbiIsImVkaXRfMjRweCJdLFs0LCJuZ0lmIl0sWyJjbGFzcyIsIm5vbmUtc2V0LXN0cmluZyIsNCwibmdJZiJdLFsxLCJub25lLXNldC1zdHJpbmciXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImJ1dHRvbiIsMCksVG0oMSwibWF0LWljb24iLDEpLEFtKCksUm0oMiwibWF0LW1lbnUiLDIsMyksUm0oNCwiZGl2Iiw0KSxrdSg1LCJDb2xvciBydW5zIGJ5IiksQW0oKSxRcCg2LHkxLDUsMiwiYnV0dG9uIiw1KSxSbSg3LCJidXR0b24iLDYpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkdyb3VwQnlDaGFuZ2UuZW1pdCh7a2V5Om4uR3JvdXBCeUtleS5SVU59KX0pKSxSbSg4LCJzcGFuIiksUXAoOSxfMSwxLDAsIm1hdC1pY29uIiw3KSxBbSgpLFJtKDEwLCJsYWJlbCIpLGt1KDExLCJSdW4iKSxBbSgpLEFtKCksUXAoMTIsTTEsNSwyLCJidXR0b24iLDgpLFFwKDEzLE8xLDUsMiwiYnV0dG9uIiw5KSxBbSgpKSwyJmUmJihEbSgibWF0TWVudVRyaWdnZXJGb3IiLCRwKDMpKSxyYyg2KSxEbSgibmdJZiIsbi5zaG93RXhwZXJpbWVudHNHcm91cEJ5KSxyYygxKSxqcCgiYXJpYS1jaGVja2VkIixuLnNlbGVjdGVkR3JvdXBCeS5rZXk9PT1uLkdyb3VwQnlLZXkuUlVOKSxyYygyKSxEbSgibmdJZiIsbi5zZWxlY3RlZEdyb3VwQnkua2V5PT09bi5Hcm91cEJ5S2V5LlJVTikscmMoMyksRG0oIm5nSWYiLG4uc2hvd0dyb3VwQnlSZWdleCkscmMoMSksRG0oIm5nSWYiLG4uc2hvd0dyb3VwQnlSZWdleCkpfSxkaXJlY3RpdmVzOltYSCxlWSxEVyxLVyxkTSxXV10sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9ICAucnVuLXRhYmxlLWNvbG9yLWdyb3VwLWJ5e2ZvbnQtc2l6ZToxNnB4fSAgLnJ1bi10YWJsZS1jb2xvci1ncm91cC1ieSAubGFiZWx7Y29sb3I6IzYxNjE2MTtmb250LXNpemU6LjllbTttYXJnaW46MTBweCAwO3BhZGRpbmc6MCAxNnB4O3BvaW50ZXItZXZlbnRzOm5vbmV9ICAucnVuLXRhYmxlLWNvbG9yLWdyb3VwLWJ5IGJ1dHRvbntkaXNwbGF5OmdyaWQ7Z2FwOjJweCAxMHB4O2dyaWQtdGVtcGxhdGUtY29sdW1uczoyMHB4IGF1dG99ICAucnVuLXRhYmxlLWNvbG9yLWdyb3VwLWJ5IG1hdC1pY29ue2hlaWdodDoyMHB4O3dpZHRoOjIwcHh9ICAucnVuLXRhYmxlLWNvbG9yLWdyb3VwLWJ5IC5kaXNwbGF5LXJlZ2V4LXN0cmluZ3twYWRkaW5nLWxlZnQ6NDBweH0gIC5ydW4tdGFibGUtY29sb3ItZ3JvdXAtYnkgLmRpc3BsYXktcmVnZXgtc3RyaW5nIC5ub25lLXNldC1zdHJpbmd7Y29sb3I6IzYxNjE2MX1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAgIC5ydW4tdGFibGUtY29sb3ItZ3JvdXAtYnkgLmRpc3BsYXktcmVnZXgtc3RyaW5nIC5ub25lLXNldC1zdHJpbmcsIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgICAgLnJ1bi10YWJsZS1jb2xvci1ncm91cC1ieSAuZGlzcGxheS1yZWdleC1zdHJpbmcgLm5vbmUtc2V0LXN0cmluZ3tjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUDEsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoicnVucy1ncm91cC1tZW51LWJ1dHRvbi1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiJydW5zX2dyb3VwX21lbnVfYnV0dG9uX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyJydW5zX2dyb3VwX21lbnVfYnV0dG9uX2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6b1d9XX0pLHtzaG93RXhwZXJpbWVudHNHcm91cEJ5Olt7dHlwZTp4eX1dLGV4cGVyaW1lbnRJZHM6W3t0eXBlOnh5fV0scmVnZXhTdHJpbmc6W3t0eXBlOnh5fV0sc2VsZWN0ZWRHcm91cEJ5Olt7dHlwZTp4eX1dLHNob3dHcm91cEJ5UmVnZXg6W3t0eXBlOnh5fV0sb25Hcm91cEJ5Q2hhbmdlOlt7dHlwZTpPeX1dfSk7Y2xhc3MgdzF7Y29uc3RydWN0b3IodCl7dGhpcy5zdG9yZT10LHRoaXMuc2hvd0dyb3VwQnlSZWdleCQ9dGhpcy5zdG9yZS5zZWxlY3QobkUpLHRoaXMuc2hvd0V4cGVyaW1lbnRzR3JvdXBCeSQ9dGhpcy5zdG9yZS5zZWxlY3QoRVMpLnBpcGUoSXQoKHQ9PnQuaGFzKFprLkNPTVBBUkVfRVhQRVJJTUVOVCkpKSksdGhpcy5zZWxlY3RlZEdyb3VwQnkkPXRoaXMuc3RvcmUuc2VsZWN0KGZOKSx0aGlzLmdyb3VwQnlSZWdleFN0cmluZyQ9dGhpcy5zdG9yZS5zZWxlY3QoTU4pfW9uR3JvdXBCeUNoYW5nZSh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKEdSKHtleHBlcmltZW50SWRzOnRoaXMuZXhwZXJpbWVudElkcyxncm91cEJ5OnR9KSl9fXcxLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx3MSkoU20oSXcpKX0sdzEuybVjbXA9dG8oe3R5cGU6dzEsc2VsZWN0b3JzOltbInJ1bnMtZ3JvdXAtbWVudS1idXR0b24iXV0saW5wdXRzOntleHBlcmltZW50SWRzOiJleHBlcmltZW50SWRzIn0sZGVjbHM6NSx2YXJzOjEzLGNvbnN0czpbWzMsInJlZ2V4U3RyaW5nIiwic2VsZWN0ZWRHcm91cEJ5Iiwic2hvd0dyb3VwQnlSZWdleCIsInNob3dFeHBlcmltZW50c0dyb3VwQnkiLCJleHBlcmltZW50SWRzIiwib25Hcm91cEJ5Q2hhbmdlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJydW5zLWdyb3VwLW1lbnUtYnV0dG9uLWNvbXBvbmVudCIsMCksVm0oIm9uR3JvdXBCeUNoYW5nZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25Hcm91cEJ5Q2hhbmdlKGUpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBaCgzLCJhc3luYyIpLEFoKDQsImFzeW5jIiksQW0oKSksMiZlJiZEbSgicmVnZXhTdHJpbmciLFRoKDEsNSxuLmdyb3VwQnlSZWdleFN0cmluZyQpKSgic2VsZWN0ZWRHcm91cEJ5IixUaCgyLDcsbi5zZWxlY3RlZEdyb3VwQnkkKSkoInNob3dHcm91cEJ5UmVnZXgiLFRoKDMsOSxuLnNob3dHcm91cEJ5UmVnZXgkKSkoInNob3dFeHBlcmltZW50c0dyb3VwQnkiLFRoKDQsMTEsbi5zaG93RXhwZXJpbWVudHNHcm91cEJ5JCkpKCJleHBlcmltZW50SWRzIixuLmV4cGVyaW1lbnRJZHMpfSxkaXJlY3RpdmVzOltQMV0scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHcxLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InJ1bnMtZ3JvdXAtbWVudS1idXR0b24iLHRlbXBsYXRlOidcbiAgICA8cnVucy1ncm91cC1tZW51LWJ1dHRvbi1jb21wb25lbnRcbiAgICAgIFtyZWdleFN0cmluZ109Imdyb3VwQnlSZWdleFN0cmluZyQgfCBhc3luYyJcbiAgICAgIFtzZWxlY3RlZEdyb3VwQnldPSJzZWxlY3RlZEdyb3VwQnkkIHwgYXN5bmMiXG4gICAgICBbc2hvd0dyb3VwQnlSZWdleF09InNob3dHcm91cEJ5UmVnZXgkIHwgYXN5bmMiXG4gICAgICBbc2hvd0V4cGVyaW1lbnRzR3JvdXBCeV09InNob3dFeHBlcmltZW50c0dyb3VwQnkkIHwgYXN5bmMiXG4gICAgICBbZXhwZXJpbWVudElkc109ImV4cGVyaW1lbnRJZHMiXG4gICAgICAob25Hcm91cEJ5Q2hhbmdlKT0ib25Hcm91cEJ5Q2hhbmdlKCRldmVudCkiXG4gICAgPjwvcnVucy1ncm91cC1tZW51LWJ1dHRvbi1jb21wb25lbnQ+XG4gICcsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSx7ZXhwZXJpbWVudElkczpbe3R5cGU6eHl9XX0pO2NvbnN0IGsxPVsiY29udGFpbmVyIl07dmFyIFMxOyEoZnVuY3Rpb24odCl7dFt0Lk5PTkU9MF09Ik5PTkUiLHRbdC5MRUZUPTFdPSJMRUZUIix0W3QuUklHSFQ9Ml09IlJJR0hUIn0pKFMxfHwoUzE9e30pKTtjbGFzcyBEMXtjb25zdHJ1Y3Rvcih0KXt0aGlzLmNoYW5nZURldGVjdG9yPXQsdGhpcy50aWNrQ291bnQ9MjAsdGhpcy52YWx1ZT1uZXcgTGgsdGhpcy5Qb3NpdGlvbj1TMSx0aGlzLmFjdGl2ZVRodW1iPVMxLk5PTkUsdGhpcy5vZmZzZXRYRnJvbU9yaWdpbk9mQWN0aXZlVGh1bWI9MCx0aGlzLm5nVW5zdWJzY3JpYmU9bmV3IEl9Z2V0VGh1bWJQb3NpdGlvbih0KXtjb25zdCBlPXRoaXMuZ2V0Q2xpcHBlZFZhbHVlKHQpLG49dGhpcy5tYXgtdGhpcy5taW47cmV0dXJuIG48PTA/IjUwJSI6KGUtdGhpcy5taW4pL24qMTAwKyIlIn1nZXRUcmFja1dpZHRoKCl7Y29uc3QgdD10aGlzLm1heC10aGlzLm1pbjtyZXR1cm4gdDw9MD8iMCUiOih0aGlzLmdldENsaXBwZWRWYWx1ZSh0aGlzLnVwcGVyVmFsdWUpLXRoaXMuZ2V0Q2xpcHBlZFZhbHVlKHRoaXMubG93ZXJWYWx1ZSkpL3QqMTAwKyIlIn1nZXRDbGlwcGVkVmFsdWUodCl7cmV0dXJuIE1hdGgubWluKE1hdGgubWF4KHQsdGhpcy5taW4pLHRoaXMubWF4KX1uZ09uRGVzdHJveSgpe3RoaXMubmdVbnN1YnNjcmliZS5uZXh0KCksdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCl9bmdPbkluaXQoKXtvZShkb2N1bWVudCwibW91c2Vtb3ZlIix7cGFzc2l2ZTohMH0pLnBpcGUoSWUodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKCh0PT57dGhpcy5oYW5kbGVNb3VzZU1vdmUodCl9KSksb2UoZG9jdW1lbnQsIm1vdXNldXAiLHtwYXNzaXZlOiEwfSkucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpKS5zdWJzY3JpYmUoKHQ9Pnt0aGlzLmhhbmRsZU1vdXNlT3V0KHQpfSkpfWhhbmRsZU1vdXNlRG93bih0LGUpe3RoaXMuYWN0aXZlVGh1bWI9ZSx0aGlzLm9mZnNldFhGcm9tT3JpZ2luT2ZBY3RpdmVUaHVtYj02LXQub2Zmc2V0WH1jYWxjdWxhdGVWYWx1ZUZyb21Nb3VzZUV2ZW50KHQpe2NvbnN0e2xlZnQ6ZSxyaWdodDpufT10aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG89dC5jbGllbnRYLWUrdGhpcy5vZmZzZXRYRnJvbU9yaWdpbk9mQWN0aXZlVGh1bWI7bGV0IGk7aWYobnVsbCE9PXRoaXMudGlja0NvdW50JiZ0aGlzLnRpY2tDb3VudD4wKXtjb25zdCB0PShuLWUpL3RoaXMudGlja0NvdW50O2k9TWF0aC5yb3VuZChvL3QpKnQvKG4tZSl9ZWxzZSBpPW8vKG4tZSk7Y29uc3QgYT10aGlzLmdldENsaXBwZWRWYWx1ZSh0aGlzLm1pbisodGhpcy5tYXgtdGhpcy5taW4pKmkpO3JldHVybiBOdW1iZXIoYS50b0ZpeGVkKDEwKSl9aGFuZGxlTW91c2VNb3ZlKHQpe2lmKHRoaXMuYWN0aXZlVGh1bWI9PT1TMS5OT05FKXJldHVybjtjb25zdCBlPXRoaXMuY2FsY3VsYXRlVmFsdWVGcm9tTW91c2VFdmVudCh0KTtsZXQgbj1bdGhpcy5sb3dlclZhbHVlLHRoaXMudXBwZXJWYWx1ZV07dGhpcy5hY3RpdmVUaHVtYj09PVMxLkxFRlQ/KGU+dGhpcy51cHBlclZhbHVlJiYodGhpcy5hY3RpdmVUaHVtYj1TMS5SSUdIVCksbj1bZSx0aGlzLnVwcGVyVmFsdWVdKTooZTx0aGlzLmxvd2VyVmFsdWUmJih0aGlzLmFjdGl2ZVRodW1iPVMxLkxFRlQpLG49W3RoaXMubG93ZXJWYWx1ZSxlXSksdGhpcy5tYXliZU5vdGlmeU5leHRWYWx1ZShuKSx0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpfW1heWJlTm90aWZ5TmV4dFZhbHVlKHQpe2NvbnN0W2Usbl09dC5zb3J0KCgodCxlKT0+dC1lKSk7dGhpcy5sb3dlclZhbHVlPT09ZSYmdGhpcy51cHBlclZhbHVlPT09bnx8dGhpcy52YWx1ZS5lbWl0KHtsb3dlclZhbHVlOmUsdXBwZXJWYWx1ZTpufSl9aGFuZGxlTW91c2VPdXQodCl7dGhpcy5hY3RpdmVUaHVtYiE9PVMxLk5PTkUmJih0aGlzLmFjdGl2ZVRodW1iPVMxLk5PTkUsdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKSl9aGFuZGxlSW5wdXRDaGFuZ2UodCxlKXtjb25zdCBuPXRoaXMuZ2V0Q2xpcHBlZFZhbHVlKE51bWJlcih0LnRhcmdldC52YWx1ZSkpO2lmKGlzTmFOKG4pKXJldHVybjtsZXQgbz1bdGhpcy5sb3dlclZhbHVlLHRoaXMudXBwZXJWYWx1ZV07bz1lPT09UzEuTEVGVD9bbix0aGlzLnVwcGVyVmFsdWVdOlt0aGlzLmxvd2VyVmFsdWUsbl0sdGhpcy5tYXliZU5vdGlmeU5leHRWYWx1ZShvKX1pc1RodW1iQWN0aXZlKHQpe3JldHVybiB0aGlzLmFjdGl2ZVRodW1iPT09dH19RDEuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEQxKShTbShVZykpfSxEMS7JtWNtcD10byh7dHlwZTpEMSxzZWxlY3RvcnM6W1sidGItcmFuZ2UtaW5wdXQiXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJlFoKGsxLDcsaGcpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uY29udGFpbmVyPXQuZmlyc3QpfX0saW5wdXRzOnttaW46Im1pbiIsbWF4OiJtYXgiLGxvd2VyVmFsdWU6Imxvd2VyVmFsdWUiLHVwcGVyVmFsdWU6InVwcGVyVmFsdWUiLHRpY2tDb3VudDoidGlja0NvdW50In0sb3V0cHV0czp7dmFsdWU6InZhbHVlIn0sZGVjbHM6OCx2YXJzOjE0LGNvbnN0czpbWyJ0eXBlIiwibnVtYmVyIiwxLCJsb3dlci1pbnB1dCIsMywidmFsdWUiLCJjaGFuZ2UiXSxbInR5cGUiLCJudW1iZXIiLDEsInVwcGVyLWlucHV0IiwzLCJ2YWx1ZSIsImNoYW5nZSJdLFsxLCJjb250YWluZXIiXSxbImNvbnRhaW5lciIsIiJdLFsxLCJzbGlkZXItdHJhY2siXSxbMSwic2xpZGVyLXRyYWNrLWZpbGwiXSxbMSwidGh1bWIiLDMsIm1vdXNlZG93biJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiaW5wdXQiLDApLFZtKCJjaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLmhhbmRsZUlucHV0Q2hhbmdlKGUsbi5Qb3NpdGlvbi5MRUZUKX0pKSxBbSgpLFJtKDEsImlucHV0IiwxKSxWbSgiY2hhbmdlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5oYW5kbGVJbnB1dENoYW5nZShlLG4uUG9zaXRpb24uUklHSFQpfSkpLEFtKCksUm0oMiwic3BhbiIsMiwzKSxUbSg0LCJzcGFuIiw0KSxUbSg1LCJzcGFuIiw1KSxSbSg2LCJzcGFuIiw2KSxWbSgibW91c2Vkb3duIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5oYW5kbGVNb3VzZURvd24oZSxuLlBvc2l0aW9uLkxFRlQpfSkpLEFtKCksUm0oNywic3BhbiIsNiksVm0oIm1vdXNlZG93biIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uaGFuZGxlTW91c2VEb3duKGUsbi5Qb3NpdGlvbi5SSUdIVCl9KSksQW0oKSxBbSgpKSwyJmUmJihEbSgidmFsdWUiLG4ubG93ZXJWYWx1ZSkscmMoMSksRG0oInZhbHVlIixuLnVwcGVyVmFsdWUpLHJjKDQpLGR1KCJsZWZ0IixuLmdldFRodW1iUG9zaXRpb24obi5sb3dlclZhbHVlKSkoIndpZHRoIixuLmdldFRyYWNrV2lkdGgoKSkscmMoMSksZHUoImxlZnQiLG4uZ2V0VGh1bWJQb3NpdGlvbihuLmxvd2VyVmFsdWUpKSxwdSgiYWN0aXZlIixuLmlzVGh1bWJBY3RpdmUobi5Qb3NpdGlvbi5MRUZUKSkscmMoMSksZHUoImxlZnQiLG4uZ2V0VGh1bWJQb3NpdGlvbihuLnVwcGVyVmFsdWUpKSxwdSgiYWN0aXZlIixuLmlzVGh1bWJBY3RpdmUobi5Qb3NpdGlvbi5SSUdIVCkpKX0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9W19uZ2hvc3QtJUNPTVAlXXtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTppbmxpbmUtZ3JpZDtncmlkLWdhcDoxMHB4O2dyaWQtdGVtcGxhdGUtYXJlYXM6Imxvd2VyLWlucHV0IHVwcGVyLWlucHV0IiAic2xpZGVyIHNsaWRlciI7Zm9udC1zaXplOjA7bWluLXdpZHRoOjEwMHB4O3BhZGRpbmc6NnB4fWlucHV0W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOmluaGVyaXQ7Ym9yZGVyLXN0eWxlOnNvbGlkO2JveC1zaXppbmc6Ym9yZGVyLWJveDtjb2xvcjppbmhlcml0O292ZXJmbG93OmhpZGRlbjt3aWR0aDoxMDAlfS5sb3dlci1pbnB1dFtfbmdjb250ZW50LSVDT01QJV17Z3JpZC1hcmVhOmxvd2VyLWlucHV0fS51cHBlci1pbnB1dFtfbmdjb250ZW50LSVDT01QJV17Z3JpZC1hcmVhOnVwcGVyLWlucHV0O2p1c3RpZnktc2VsZjpmbGV4LWVuZH0uY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtncmlkLWFyZWE6c2xpZGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTppbmxpbmUtZmxleDtoZWlnaHQ6MTJweDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjEwMCV9LnNsaWRlci10cmFja1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4yNik7aGVpZ2h0OjJweDt3aWR0aDoxMDAlfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5zbGlkZXItdHJhY2tbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuc2xpZGVyLXRyYWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjMpfS5zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7aGVpZ2h0OjJweH0udGh1bWJbX25nY29udGVudC0lQ09NUCVde2JveC1zYWRob3c6MCAwIDAgMXB4IHJnYmEoMCwwLDAsLjI2KTtib3JkZXItcmFkaXVzOjEwMCU7ZGlzcGxheTppbmxpbmUtYmxvY2s7aGVpZ2h0OjEycHg7bWFyZ2luLWxlZnQ6LTZweDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuM3MgZWFzZTt3aWR0aDoxMnB4O3dpbGwtY2hhbmdlOnRyYW5zZm9ybX1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAudGh1bWJbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAudGh1bWJbX25nY29udGVudC0lQ09NUCVde2JveC1zYWRob3c6MCAwIDAgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjMpfS50aHVtYi5hY3RpdmVbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTpzY2FsZSgxLjIpfS5zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC50aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZWY2YzAwfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC50aHVtYltfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC50aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZWY2YzAwfSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChEMSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJ0Yi1yYW5nZS1pbnB1dCIsdGVtcGxhdGVVcmw6Ii4vcmFuZ2VfaW5wdXRfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vcmFuZ2VfaW5wdXRfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpVZ31dfSkse2NvbnRhaW5lcjpbe3R5cGU6WmEsYXJnczpbImNvbnRhaW5lciIse3N0YXRpYzohMCxyZWFkOmhnfV19XSxtaW46W3t0eXBlOnh5fV0sbWF4Olt7dHlwZTp4eX1dLGxvd2VyVmFsdWU6W3t0eXBlOnh5fV0sdXBwZXJWYWx1ZTpbe3R5cGU6eHl9XSx0aWNrQ291bnQ6W3t0eXBlOnh5fV0sdmFsdWU6W3t0eXBlOk95fV19KTtjb25zdCBFMT1bImRpYWxvZ1BvcHVwIl0sUjE9WyJodWVTbGlkZXIiXSxBMT1bImFscGhhU2xpZGVyIl07ZnVuY3Rpb24gVDEodCxlKXtpZigxJnQmJlRtKDAsImRpdiIpLDImdCl7Y29uc3QgdD1ZbSgpO0F1KCJhcnJvdyBhcnJvdy0iLHQuY3BVc2VQb3NpdGlvbiwiIiksZHUoInRvcCIsdC5hcnJvd1RvcCwicHgiKX19ZnVuY3Rpb24gTjEodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDI2KSxWbSgibmV3VmFsdWUiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uQ29sb3JDaGFuZ2Uobil9KSkoImRyYWdTdGFydCIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5vbkRyYWdTdGFydCgic2F0dXJhdGlvbi1saWdodG5lc3MiKX0pKSgiZHJhZ0VuZCIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5vbkRyYWdFbmQoInNhdHVyYXRpb24tbGlnaHRuZXNzIil9KSksVG0oMSwiZGl2IiwxMyksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKTtkdSgiYmFja2dyb3VuZC1jb2xvciIsdC5odWVTbGlkZXJDb2xvciksRG0oInJnWCIsMSkoInJnWSIsMSkscmMoMSksZHUoInRvcCIsbnVsbD09dC5zbGlkZXI/bnVsbDp0LnNsaWRlci52LCJweCIpKCJsZWZ0IixudWxsPT10LnNsaWRlcj9udWxsOnQuc2xpZGVyLnMsInB4Iil9fWZ1bmN0aW9uIHoxKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiYnV0dG9uIiwyNyksVm0oImNsaWNrIiwoZnVuY3Rpb24gZShuKXtoaSh0KTtjb25zdCBvPVltKCk7cmV0dXJuIG8ub25BZGRQcmVzZXRDb2xvcihuLG8uc2VsZWN0ZWRDb2xvcil9KSksa3UoMSksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKTtmdSh0LmNwQWRkQ29sb3JCdXR0b25DbGFzcyksRG0oImRpc2FibGVkIix0LmNwUHJlc2V0Q29sb3JzJiZ0LmNwUHJlc2V0Q29sb3JzLmxlbmd0aD49dC5jcE1heFByZXNldENvbG9yc0xlbmd0aCkscmMoMSksRHUoIiAiLHQuY3BBZGRDb2xvckJ1dHRvblRleHQsIiAiKX19ZnVuY3Rpb24gSTEodCxlKXsxJnQmJlRtKDAsImRpdiIsMjgpfWZ1bmN0aW9uIEgxKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiaW5wdXQiLDM0KSxWbSgia2V5dXAuZW50ZXIiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgyKS5vbkFjY2VwdENvbG9yKG4pfSkpKCJuZXdWYWx1ZSIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKDIpLm9uQWxwaGFJbnB1dChuKX0pKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgyKTtEbSgicmciLDEpKCJ2YWx1ZSIsbnVsbD09dC5jbXlrVGV4dD9udWxsOnQuY215a1RleHQuYSl9fWZ1bmN0aW9uIEYxKHQsZSl7MSZ0JiYoUm0oMCwiZGl2Iiksa3UoMSwiQSIpLEFtKCkpfWZ1bmN0aW9uIEwxKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2IiwyOSksUm0oMSwiZGl2IiwzMCksUm0oMiwiaW5wdXQiLDMxKSxWbSgia2V5dXAuZW50ZXIiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uQWNjZXB0Q29sb3Iobil9KSkoIm5ld1ZhbHVlIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oKS5vbkN5YW5JbnB1dChuKX0pKSxBbSgpLFJtKDMsImlucHV0IiwzMSksVm0oImtleXVwLmVudGVyIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oKS5vbkFjY2VwdENvbG9yKG4pfSkpKCJuZXdWYWx1ZSIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkub25NYWdlbnRhSW5wdXQobil9KSksQW0oKSxSbSg0LCJpbnB1dCIsMzEpLFZtKCJrZXl1cC5lbnRlciIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkub25BY2NlcHRDb2xvcihuKX0pKSgibmV3VmFsdWUiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uWWVsbG93SW5wdXQobil9KSksQW0oKSxSbSg1LCJpbnB1dCIsMzEpLFZtKCJrZXl1cC5lbnRlciIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkub25BY2NlcHRDb2xvcihuKX0pKSgibmV3VmFsdWUiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uQmxhY2tJbnB1dChuKX0pKSxBbSgpLFFwKDYsSDEsMSwyLCJpbnB1dCIsMzIpLEFtKCksUm0oNywiZGl2IiwzMCksUm0oOCwiZGl2Iiksa3UoOSwiQyIpLEFtKCksUm0oMTAsImRpdiIpLGt1KDExLCJNIiksQW0oKSxSbSgxMiwiZGl2Iiksa3UoMTMsIlkiKSxBbSgpLFJtKDE0LCJkaXYiKSxrdSgxNSwiSyIpLEFtKCksUXAoMTYsRjEsMiwwLCJkaXYiLDMzKSxBbSgpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKCk7ZHUoImRpc3BsYXkiLDMhPT10LmZvcm1hdD8ibm9uZSI6ImJsb2NrIikscmMoMiksRG0oInJnIiwxMDApKCJ2YWx1ZSIsbnVsbD09dC5jbXlrVGV4dD9udWxsOnQuY215a1RleHQuYykscmMoMSksRG0oInJnIiwxMDApKCJ2YWx1ZSIsbnVsbD09dC5jbXlrVGV4dD9udWxsOnQuY215a1RleHQubSkscmMoMSksRG0oInJnIiwxMDApKCJ2YWx1ZSIsbnVsbD09dC5jbXlrVGV4dD9udWxsOnQuY215a1RleHQueSkscmMoMSksRG0oInJnIiwxMDApKCJ2YWx1ZSIsbnVsbD09dC5jbXlrVGV4dD9udWxsOnQuY215a1RleHQuaykscmMoMSksRG0oIm5nSWYiLCJkaXNhYmxlZCIhPT10LmNwQWxwaGFDaGFubmVsKSxyYygxMCksRG0oIm5nSWYiLCJkaXNhYmxlZCIhPT10LmNwQWxwaGFDaGFubmVsKX19ZnVuY3Rpb24gQjEodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJpbnB1dCIsMzQpLFZtKCJrZXl1cC5lbnRlciIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKDIpLm9uQWNjZXB0Q29sb3Iobil9KSkoIm5ld1ZhbHVlIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oMikub25BbHBoYUlucHV0KG4pfSkpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKDIpO0RtKCJyZyIsMSkoInZhbHVlIixudWxsPT10LmhzbGFUZXh0P251bGw6dC5oc2xhVGV4dC5hKX19ZnVuY3Rpb24gVjEodCxlKXsxJnQmJihSbSgwLCJkaXYiKSxrdSgxLCJBIiksQW0oKSl9ZnVuY3Rpb24gajEodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDM1KSxSbSgxLCJkaXYiLDMwKSxSbSgyLCJpbnB1dCIsMzYpLFZtKCJrZXl1cC5lbnRlciIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkub25BY2NlcHRDb2xvcihuKX0pKSgibmV3VmFsdWUiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uSHVlSW5wdXQobil9KSksQW0oKSxSbSgzLCJpbnB1dCIsMzEpLFZtKCJrZXl1cC5lbnRlciIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkub25BY2NlcHRDb2xvcihuKX0pKSgibmV3VmFsdWUiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uU2F0dXJhdGlvbklucHV0KG4pfSkpLEFtKCksUm0oNCwiaW5wdXQiLDMxKSxWbSgia2V5dXAuZW50ZXIiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uQWNjZXB0Q29sb3Iobil9KSkoIm5ld1ZhbHVlIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oKS5vbkxpZ2h0bmVzc0lucHV0KG4pfSkpLEFtKCksUXAoNSxCMSwxLDIsImlucHV0IiwzMiksQW0oKSxSbSg2LCJkaXYiLDMwKSxSbSg3LCJkaXYiKSxrdSg4LCJIIiksQW0oKSxSbSg5LCJkaXYiKSxrdSgxMCwiUyIpLEFtKCksUm0oMTEsImRpdiIpLGt1KDEyLCJMIiksQW0oKSxRcCgxMyxWMSwyLDAsImRpdiIsMzMpLEFtKCksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKTtkdSgiZGlzcGxheSIsMiE9PXQuZm9ybWF0PyJub25lIjoiYmxvY2siKSxyYygyKSxEbSgicmciLDM2MCkoInZhbHVlIixudWxsPT10LmhzbGFUZXh0P251bGw6dC5oc2xhVGV4dC5oKSxyYygxKSxEbSgicmciLDEwMCkoInZhbHVlIixudWxsPT10LmhzbGFUZXh0P251bGw6dC5oc2xhVGV4dC5zKSxyYygxKSxEbSgicmciLDEwMCkoInZhbHVlIixudWxsPT10LmhzbGFUZXh0P251bGw6dC5oc2xhVGV4dC5sKSxyYygxKSxEbSgibmdJZiIsImRpc2FibGVkIiE9PXQuY3BBbHBoYUNoYW5uZWwpLHJjKDgpLERtKCJuZ0lmIiwiZGlzYWJsZWQiIT09dC5jcEFscGhhQ2hhbm5lbCl9fWZ1bmN0aW9uIFUxKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiaW5wdXQiLDM0KSxWbSgia2V5dXAuZW50ZXIiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgyKS5vbkFjY2VwdENvbG9yKG4pfSkpKCJuZXdWYWx1ZSIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKDIpLm9uQWxwaGFJbnB1dChuKX0pKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgyKTtEbSgicmciLDEpKCJ2YWx1ZSIsbnVsbD09dC5yZ2JhVGV4dD9udWxsOnQucmdiYVRleHQuYSl9fWZ1bmN0aW9uIEcxKHQsZSl7MSZ0JiYoUm0oMCwiZGl2Iiksa3UoMSwiQSIpLEFtKCkpfWZ1bmN0aW9uIFcxKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2IiwzNyksUm0oMSwiZGl2IiwzMCksUm0oMiwiaW5wdXQiLDM4KSxWbSgia2V5dXAuZW50ZXIiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uQWNjZXB0Q29sb3Iobil9KSkoIm5ld1ZhbHVlIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oKS5vblJlZElucHV0KG4pfSkpLEFtKCksUm0oMywiaW5wdXQiLDM4KSxWbSgia2V5dXAuZW50ZXIiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uQWNjZXB0Q29sb3Iobil9KSkoIm5ld1ZhbHVlIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oKS5vbkdyZWVuSW5wdXQobil9KSksQW0oKSxSbSg0LCJpbnB1dCIsMzgpLFZtKCJrZXl1cC5lbnRlciIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkub25BY2NlcHRDb2xvcihuKX0pKSgibmV3VmFsdWUiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uQmx1ZUlucHV0KG4pfSkpLEFtKCksUXAoNSxVMSwxLDIsImlucHV0IiwzMiksQW0oKSxSbSg2LCJkaXYiLDMwKSxSbSg3LCJkaXYiKSxrdSg4LCJSIiksQW0oKSxSbSg5LCJkaXYiKSxrdSgxMCwiRyIpLEFtKCksUm0oMTEsImRpdiIpLGt1KDEyLCJCIiksQW0oKSxRcCgxMyxHMSwyLDAsImRpdiIsMzMpLEFtKCksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKTtkdSgiZGlzcGxheSIsMSE9PXQuZm9ybWF0PyJub25lIjoiYmxvY2siKSxyYygyKSxEbSgicmciLDI1NSkoInZhbHVlIixudWxsPT10LnJnYmFUZXh0P251bGw6dC5yZ2JhVGV4dC5yKSxyYygxKSxEbSgicmciLDI1NSkoInZhbHVlIixudWxsPT10LnJnYmFUZXh0P251bGw6dC5yZ2JhVGV4dC5nKSxyYygxKSxEbSgicmciLDI1NSkoInZhbHVlIixudWxsPT10LnJnYmFUZXh0P251bGw6dC5yZ2JhVGV4dC5iKSxyYygxKSxEbSgibmdJZiIsImRpc2FibGVkIiE9PXQuY3BBbHBoYUNoYW5uZWwpLHJjKDgpLERtKCJuZ0lmIiwiZGlzYWJsZWQiIT09dC5jcEFscGhhQ2hhbm5lbCl9fWZ1bmN0aW9uIFkxKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiaW5wdXQiLDM0KSxWbSgia2V5dXAuZW50ZXIiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgyKS5vbkFjY2VwdENvbG9yKG4pfSkpKCJuZXdWYWx1ZSIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKDIpLm9uQWxwaGFJbnB1dChuKX0pKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgyKTtEbSgicmciLDEpKCJ2YWx1ZSIsdC5oZXhBbHBoYSl9fWZ1bmN0aW9uIHExKHQsZSl7MSZ0JiYoUm0oMCwiZGl2Iiksa3UoMSwiQSIpLEFtKCkpfWZ1bmN0aW9uIFoxKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2IiwzOSksUm0oMSwiZGl2IiwzMCksUm0oMiwiaW5wdXQiLDQwKSxWbSgiYmx1ciIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5vbkhleElucHV0KG51bGwpfSkpKCJrZXl1cC5lbnRlciIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkub25BY2NlcHRDb2xvcihuKX0pKSgibmV3VmFsdWUiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uSGV4SW5wdXQobil9KSksQW0oKSxRcCgzLFkxLDEsMiwiaW5wdXQiLDMyKSxBbSgpLFJtKDQsImRpdiIsMzApLFJtKDUsImRpdiIpLGt1KDYsIkhleCIpLEFtKCksUXAoNyxxMSwyLDAsImRpdiIsMzMpLEFtKCksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKTtkdSgiZGlzcGxheSIsMCE9PXQuZm9ybWF0PyJub25lIjoiYmxvY2siKSxwdSgiaGV4LWFscGhhIiwiZm9yY2VkIj09PXQuY3BBbHBoYUNoYW5uZWwpLHJjKDIpLERtKCJ2YWx1ZSIsdC5oZXhUZXh0KSxyYygxKSxEbSgibmdJZiIsImZvcmNlZCI9PT10LmNwQWxwaGFDaGFubmVsKSxyYyg0KSxEbSgibmdJZiIsImZvcmNlZCI9PT10LmNwQWxwaGFDaGFubmVsKX19ZnVuY3Rpb24gWDEodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJpbnB1dCIsMzQpLFZtKCJrZXl1cC5lbnRlciIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKDIpLm9uQWNjZXB0Q29sb3Iobil9KSkoIm5ld1ZhbHVlIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oMikub25BbHBoYUlucHV0KG4pfSkpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKDIpO0RtKCJyZyIsMSkoInZhbHVlIixudWxsPT10LmhzbGFUZXh0P251bGw6dC5oc2xhVGV4dC5hKX19ZnVuY3Rpb24gSzEodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDQxKSxSbSgxLCJkaXYiLDMwKSxSbSgyLCJpbnB1dCIsMzEpLFZtKCJrZXl1cC5lbnRlciIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkub25BY2NlcHRDb2xvcihuKX0pKSgibmV3VmFsdWUiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uVmFsdWVJbnB1dChuKX0pKSxBbSgpLFFwKDMsWDEsMSwyLCJpbnB1dCIsMzIpLEFtKCksUm0oNCwiZGl2IiwzMCksUm0oNSwiZGl2Iiksa3UoNiwiViIpLEFtKCksUm0oNywiZGl2Iiksa3UoOCwiQSIpLEFtKCksQW0oKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgpO3JjKDIpLERtKCJyZyIsMTAwKSgidmFsdWUiLG51bGw9PXQuaHNsYVRleHQ/bnVsbDp0LmhzbGFUZXh0LmwpLHJjKDEpLERtKCJuZ0lmIiwiZGlzYWJsZWQiIT09dC5jcEFscGhhQ2hhbm5lbCl9fWZ1bmN0aW9uIEoxKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2Iiw0MiksUm0oMSwic3BhbiIsNDMpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5vbkZvcm1hdFRvZ2dsZSgtMSl9KSksQW0oKSxSbSgyLCJzcGFuIiw0MyksVm0oImNsaWNrIiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgpLm9uRm9ybWF0VG9nZ2xlKDEpfSkpLEFtKCksQW0oKX19ZnVuY3Rpb24gUTEodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJzcGFuIiw1MCksVm0oImNsaWNrIiwoZnVuY3Rpb24gZShuKXtoaSh0KTtjb25zdCBvPVltKCkuJGltcGxpY2l0O3JldHVybiBZbSgzKS5vblJlbW92ZVByZXNldENvbG9yKG4sbyl9KSksQW0oKX0yJnQmJmZ1KFltKDQpLmNwUmVtb3ZlQ29sb3JCdXR0b25DbGFzcyl9ZnVuY3Rpb24gJDEodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDQ4KSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7Y29uc3Qgbj1oaSh0KS4kaW1wbGljaXQ7cmV0dXJuIFltKDMpLnNldENvbG9yRnJvbVN0cmluZyhuKX0pKSxRcCgxLFExLDEsMywic3BhbiIsNDkpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oMyk7ZHUoImJhY2tncm91bmQtY29sb3IiLHQpLHJjKDEpLERtKCJuZ0lmIixuLmNwQWRkQ29sb3JCdXR0b24pfX1mdW5jdGlvbiB0Myh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIpLFFwKDEsJDEsMiwzLCJkaXYiLDQ3KSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMik7ZnUodC5jcFByZXNldENvbG9yc0NsYXNzKSxyYygxKSxEbSgibmdGb3JPZiIsdC5jcFByZXNldENvbG9ycyl9fWZ1bmN0aW9uIGUzKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2Iiksa3UoMSksQW0oKSksMiZ0KXtjb25zdCB0PVltKDIpO2Z1KHQuY3BQcmVzZXRFbXB0eU1lc3NhZ2VDbGFzcykscmMoMSksU3UodC5jcFByZXNldEVtcHR5TWVzc2FnZSl9fWZ1bmN0aW9uIG4zKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2Iiw0NCksVG0oMSwiaHIiKSxSbSgyLCJkaXYiLDQ1KSxrdSgzKSxBbSgpLFFwKDQsdDMsMiw0LCJkaXYiLDQ2KSxRcCg1LGUzLDIsNCwiZGl2Iiw0NiksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoMyksU3UodC5jcFByZXNldExhYmVsKSxyYygxKSxEbSgibmdJZiIsbnVsbD09dC5jcFByZXNldENvbG9ycz9udWxsOnQuY3BQcmVzZXRDb2xvcnMubGVuZ3RoKSxyYygxKSxEbSgibmdJZiIsIShudWxsIT10LmNwUHJlc2V0Q29sb3JzJiZ0LmNwUHJlc2V0Q29sb3JzLmxlbmd0aCkmJnQuY3BBZGRDb2xvckJ1dHRvbil9fWZ1bmN0aW9uIG8zKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiYnV0dG9uIiw1MyksVm0oImNsaWNrIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oMikub25DYW5jZWxDb2xvcihuKX0pKSxrdSgxKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgyKTtmdSh0LmNwQ2FuY2VsQnV0dG9uQ2xhc3MpLHJjKDEpLFN1KHQuY3BDYW5jZWxCdXR0b25UZXh0KX19ZnVuY3Rpb24gaTModCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJidXR0b24iLDUzKSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgyKS5vbkFjY2VwdENvbG9yKG4pfSkpLGt1KDEpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKDIpO2Z1KHQuY3BPS0J1dHRvbkNsYXNzKSxyYygxKSxTdSh0LmNwT0tCdXR0b25UZXh0KX19ZnVuY3Rpb24gYTModCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDUxKSxRcCgxLG8zLDIsNCwiYnV0dG9uIiw1MiksUXAoMixpMywyLDQsImJ1dHRvbiIsNTIpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpO3JjKDEpLERtKCJuZ0lmIix0LmNwQ2FuY2VsQnV0dG9uKSxyYygxKSxEbSgibmdJZiIsdC5jcE9LQnV0dG9uKX19dmFyIHIzOyEoZnVuY3Rpb24odCl7dFt0LkhFWD0wXT0iSEVYIix0W3QuUkdCQT0xXT0iUkdCQSIsdFt0LkhTTEE9Ml09IkhTTEEiLHRbdC5DTVlLPTNdPSJDTVlLIn0pKHIzfHwocjM9e30pKTtjbGFzcyBzM3tjb25zdHJ1Y3Rvcih0LGUsbixvKXt0aGlzLnI9dCx0aGlzLmc9ZSx0aGlzLmI9bix0aGlzLmE9b319Y2xhc3MgbDN7Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy5oPXQsdGhpcy5zPWUsdGhpcy52PW4sdGhpcy5hPW99fWNsYXNzIGMze2NvbnN0cnVjdG9yKHQsZSxuLG8pe3RoaXMuaD10LHRoaXMucz1lLHRoaXMubD1uLHRoaXMuYT1vfX1jbGFzcyBkM3tjb25zdHJ1Y3Rvcih0LGUsbixvLGk9MSl7dGhpcy5jPXQsdGhpcy5tPWUsdGhpcy55PW4sdGhpcy5rPW8sdGhpcy5hPWl9fWNsYXNzIHAze2NvbnN0cnVjdG9yKCl7dGhpcy5uZXdWYWx1ZT1uZXcgTGh9aW5wdXRDaGFuZ2UodCl7Y29uc3QgZT10LnRhcmdldC52YWx1ZTtpZih2b2lkIDA9PT10aGlzLnJnKXRoaXMubmV3VmFsdWUuZW1pdChlKTtlbHNle2NvbnN0IHQ9cGFyc2VGbG9hdChlKTt0aGlzLm5ld1ZhbHVlLmVtaXQoe3Y6dCxyZzp0aGlzLnJnfSl9fX1wMy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8cDMpfSxwMy7JtWRpcj1sbyh7dHlwZTpwMyxzZWxlY3RvcnM6W1siIiwidGV4dCIsIiJdXSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezEmZSYmVm0oImlucHV0IiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5pbnB1dENoYW5nZShlKX0pKX0saW5wdXRzOntyZzoicmciLHRleHQ6InRleHQifSxvdXRwdXRzOntuZXdWYWx1ZToibmV3VmFsdWUifX0pLHAzLnByb3BEZWNvcmF0b3JzPXtyZzpbe3R5cGU6eHl9XSx0ZXh0Olt7dHlwZTp4eX1dLG5ld1ZhbHVlOlt7dHlwZTpPeX1dLGlucHV0Q2hhbmdlOlt7dHlwZTp3eSxhcmdzOlsiaW5wdXQiLFsiJGV2ZW50Il1dfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgocDMsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW3RleHRdIn1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW119KSx7bmV3VmFsdWU6W3t0eXBlOk95fV0saW5wdXRDaGFuZ2U6W3t0eXBlOnd5LGFyZ3M6WyJpbnB1dCIsWyIkZXZlbnQiXV19XSxyZzpbe3R5cGU6eHl9XSx0ZXh0Olt7dHlwZTp4eX1dfSk7Y2xhc3MgbTN7Y29uc3RydWN0b3IodCl7dGhpcy5lbFJlZj10LHRoaXMuZHJhZ0VuZD1uZXcgTGgsdGhpcy5kcmFnU3RhcnQ9bmV3IExoLHRoaXMubmV3VmFsdWU9bmV3IExoLHRoaXMubGlzdGVuZXJNb3ZlPXQ9PnRoaXMubW92ZSh0KSx0aGlzLmxpc3RlbmVyU3RvcD0oKT0+dGhpcy5zdG9wKCl9bW91c2VEb3duKHQpe3RoaXMuc3RhcnQodCl9dG91Y2hTdGFydCh0KXt0aGlzLnN0YXJ0KHQpfW1vdmUodCl7dC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuc2V0Q3Vyc29yKHQpfXN0YXJ0KHQpe3RoaXMuc2V0Q3Vyc29yKHQpLHQuc3RvcFByb3BhZ2F0aW9uKCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsdGhpcy5saXN0ZW5lclN0b3ApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIix0aGlzLmxpc3RlbmVyU3RvcCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0aGlzLmxpc3RlbmVyTW92ZSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIix0aGlzLmxpc3RlbmVyTW92ZSksdGhpcy5kcmFnU3RhcnQuZW1pdCgpfXN0b3AoKXtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0aGlzLmxpc3RlbmVyU3RvcCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHRoaXMubGlzdGVuZXJTdG9wKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMubGlzdGVuZXJNb3ZlKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLHRoaXMubGlzdGVuZXJNb3ZlKSx0aGlzLmRyYWdFbmQuZW1pdCgpfWdldFgodCl7Y29uc3QgZT10aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuKHZvaWQgMCE9PXQucGFnZVg/dC5wYWdlWDp0LnRvdWNoZXNbMF0ucGFnZVgpLWUubGVmdC13aW5kb3cucGFnZVhPZmZzZXR9Z2V0WSh0KXtjb25zdCBlPXRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4odm9pZCAwIT09dC5wYWdlWT90LnBhZ2VZOnQudG91Y2hlc1swXS5wYWdlWSktZS50b3Atd2luZG93LnBhZ2VZT2Zmc2V0fXNldEN1cnNvcih0KXtjb25zdCBlPXRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCxuPXRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQsbz1NYXRoLm1heCgwLE1hdGgubWluKHRoaXMuZ2V0WCh0KSxlKSksaT1NYXRoLm1heCgwLE1hdGgubWluKHRoaXMuZ2V0WSh0KSxuKSk7dm9pZCAwIT09dGhpcy5yZ1gmJnZvaWQgMCE9PXRoaXMucmdZP3RoaXMubmV3VmFsdWUuZW1pdCh7czpvL2UsdjoxLWkvbixyZ1g6dGhpcy5yZ1gscmdZOnRoaXMucmdZfSk6dm9pZCAwPT09dGhpcy5yZ1gmJnZvaWQgMCE9PXRoaXMucmdZP3RoaXMubmV3VmFsdWUuZW1pdCh7djppL24scmdZOnRoaXMucmdZfSk6dm9pZCAwIT09dGhpcy5yZ1gmJnZvaWQgMD09PXRoaXMucmdZJiZ0aGlzLm5ld1ZhbHVlLmVtaXQoe3Y6by9lLHJnWDp0aGlzLnJnWH0pfX1tMy7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bTMpKFNtKGhnKSl9LG0zLsm1ZGlyPWxvKHt0eXBlOm0zLHNlbGVjdG9yczpbWyIiLCJzbGlkZXIiLCIiXV0saG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJlZtKCJtb3VzZWRvd24iLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm1vdXNlRG93bihlKX0pKSgidG91Y2hzdGFydCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4udG91Y2hTdGFydChlKX0pKX0saW5wdXRzOntyZ1g6InJnWCIscmdZOiJyZ1kiLHNsaWRlcjoic2xpZGVyIn0sb3V0cHV0czp7ZHJhZ0VuZDoiZHJhZ0VuZCIsZHJhZ1N0YXJ0OiJkcmFnU3RhcnQiLG5ld1ZhbHVlOiJuZXdWYWx1ZSJ9fSksbTMuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ31dLG0zLnByb3BEZWNvcmF0b3JzPXtyZ1g6W3t0eXBlOnh5fV0scmdZOlt7dHlwZTp4eX1dLHNsaWRlcjpbe3R5cGU6eHl9XSxkcmFnRW5kOlt7dHlwZTpPeX1dLGRyYWdTdGFydDpbe3R5cGU6T3l9XSxuZXdWYWx1ZTpbe3R5cGU6T3l9XSxtb3VzZURvd246W3t0eXBlOnd5LGFyZ3M6WyJtb3VzZWRvd24iLFsiJGV2ZW50Il1dfV0sdG91Y2hTdGFydDpbe3R5cGU6d3ksYXJnczpbInRvdWNoc3RhcnQiLFsiJGV2ZW50Il1dfV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobTMsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW3NsaWRlcl0ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9XX0pLHtkcmFnRW5kOlt7dHlwZTpPeX1dLGRyYWdTdGFydDpbe3R5cGU6T3l9XSxuZXdWYWx1ZTpbe3R5cGU6T3l9XSxtb3VzZURvd246W3t0eXBlOnd5LGFyZ3M6WyJtb3VzZWRvd24iLFsiJGV2ZW50Il1dfV0sdG91Y2hTdGFydDpbe3R5cGU6d3ksYXJnczpbInRvdWNoc3RhcnQiLFsiJGV2ZW50Il1dfV0scmdYOlt7dHlwZTp4eX1dLHJnWTpbe3R5cGU6eHl9XSxzbGlkZXI6W3t0eXBlOnh5fV19KTtjbGFzcyB1M3tjb25zdHJ1Y3Rvcih0LGUsbixvKXt0aGlzLmg9dCx0aGlzLnM9ZSx0aGlzLnY9bix0aGlzLmE9b319Y2xhc3MgZjN7Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy5oPXQsdGhpcy5zPWUsdGhpcy52PW4sdGhpcy5hPW99fWNsYXNzIGcze2NvbnN0cnVjdG9yKCl7dGhpcy5hY3RpdmU9bnVsbH1zZXRBY3RpdmUodCl7dGhpcy5hY3RpdmUmJnRoaXMuYWN0aXZlIT09dCYmImlubGluZSIhPT10aGlzLmFjdGl2ZS5jcERpYWxvZ0Rpc3BsYXkmJnRoaXMuYWN0aXZlLmNsb3NlRGlhbG9nKCksdGhpcy5hY3RpdmU9dH1oc3ZhMmhzbGEodCl7Y29uc3QgZT10Lmgsbj10LnMsbz10LnYsaT10LmE7aWYoMD09PW8pcmV0dXJuIG5ldyBjMyhlLDAsMCxpKTtpZigwPT09biYmMT09PW8pcmV0dXJuIG5ldyBjMyhlLDEsMSxpKTt7Y29uc3QgdD1vKigyLW4pLzI7cmV0dXJuIG5ldyBjMyhlLG8qbi8oMS1NYXRoLmFicygyKnQtMSkpLHQsaSl9fWhzbGEyaHN2YSh0KXtjb25zdCBlPU1hdGgubWluKHQuaCwxKSxuPU1hdGgubWluKHQucywxKSxvPU1hdGgubWluKHQubCwxKSxpPU1hdGgubWluKHQuYSwxKTtpZigwPT09bylyZXR1cm4gbmV3IGwzKGUsMCwwLGkpO3tjb25zdCB0PW8rbiooMS1NYXRoLmFicygyKm8tMSkpLzI7cmV0dXJuIG5ldyBsMyhlLDIqKHQtbykvdCx0LGkpfX1oc3ZhVG9SZ2JhKHQpe2xldCBlLG4sbztjb25zdCBpPXQuaCxhPXQucyxyPXQudixzPXQuYSxsPU1hdGguZmxvb3IoNippKSxjPTYqaS1sLGQ9ciooMS1hKSxwPXIqKDEtYyphKSxtPXIqKDEtKDEtYykqYSk7c3dpdGNoKGwlNil7Y2FzZSAwOmU9cixuPW0sbz1kO2JyZWFrO2Nhc2UgMTplPXAsbj1yLG89ZDticmVhaztjYXNlIDI6ZT1kLG49cixvPW07YnJlYWs7Y2FzZSAzOmU9ZCxuPXAsbz1yO2JyZWFrO2Nhc2UgNDplPW0sbj1kLG89cjticmVhaztjYXNlIDU6ZT1yLG49ZCxvPXA7YnJlYWs7ZGVmYXVsdDplPTAsbj0wLG89MH1yZXR1cm4gbmV3IHMzKGUsbixvLHMpfWNteWtUb1JnYih0KXtyZXR1cm4gbmV3IHMzKCgxLXQuYykqKDEtdC5rKSwoMS10Lm0pKigxLXQuayksKDEtdC55KSooMS10LmspLHQuYSl9cmdiYVRvQ215ayh0KXtjb25zdCBlPTEtTWF0aC5tYXgodC5yLHQuZyx0LmIpO3JldHVybiAxPT09ZT9uZXcgZDMoMCwwLDAsMSx0LmEpOm5ldyBkMygoMS10LnItZSkvKDEtZSksKDEtdC5nLWUpLygxLWUpLCgxLXQuYi1lKS8oMS1lKSxlLHQuYSl9cmdiYVRvSHN2YSh0KXtsZXQgZSxuO2NvbnN0IG89TWF0aC5taW4odC5yLDEpLGk9TWF0aC5taW4odC5nLDEpLGE9TWF0aC5taW4odC5iLDEpLHI9TWF0aC5taW4odC5hLDEpLHM9TWF0aC5tYXgobyxpLGEpLGw9TWF0aC5taW4obyxpLGEpLGM9cyxkPXMtbDtpZihuPTA9PT1zPzA6ZC9zLHM9PT1sKWU9MDtlbHNle3N3aXRjaChzKXtjYXNlIG86ZT0oaS1hKS9kKyhpPGE/NjowKTticmVhaztjYXNlIGk6ZT0oYS1vKS9kKzI7YnJlYWs7Y2FzZSBhOmU9KG8taSkvZCs0O2JyZWFrO2RlZmF1bHQ6ZT0wfWUvPTZ9cmV0dXJuIG5ldyBsMyhlLG4sYyxyKX1yZ2JhVG9IZXgodCxlKXtsZXQgbj0iIyIrKDE8PDI0fHQucjw8MTZ8dC5nPDw4fHQuYikudG9TdHJpbmcoMTYpLnN1YnN0cigxKTtyZXR1cm4gZSYmKG4rPSgyNTZ8TWF0aC5yb3VuZCgyNTUqdC5hKSkudG9TdHJpbmcoMTYpLnN1YnN0cigxKSksbn1ub3JtYWxpemVDTVlLKHQpe3JldHVybiBuZXcgZDModC5jLzEwMCx0Lm0vMTAwLHQueS8xMDAsdC5rLzEwMCx0LmEpfWRlbm9ybWFsaXplQ01ZSyh0KXtyZXR1cm4gbmV3IGQzKE1hdGguZmxvb3IoMTAwKnQuYyksTWF0aC5mbG9vcigxMDAqdC5tKSxNYXRoLmZsb29yKDEwMCp0LnkpLE1hdGguZmxvb3IoMTAwKnQuayksdC5hKX1kZW5vcm1hbGl6ZVJHQkEodCl7cmV0dXJuIG5ldyBzMyhNYXRoLnJvdW5kKDI1NSp0LnIpLE1hdGgucm91bmQoMjU1KnQuZyksTWF0aC5yb3VuZCgyNTUqdC5iKSx0LmEpfXN0cmluZ1RvSHN2YSh0PSIiLGU9ITEpe2xldCBuPW51bGw7dD0odHx8IiIpLnRvTG93ZXJDYXNlKCk7Y29uc3Qgbz1be3JlOi8ocmdiKWE/XChccyooXGR7MSwzfSlccyosXHMqKFxkezEsM30pXHMqJT8sXHMqKFxkezEsM30pXHMqJT8oPzosXHMqKFxkKyg/OlwuXGQrKT8pXHMqKT9cKS8scGFyc2U6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBzMyhwYXJzZUludCh0WzJdLDEwKS8yNTUscGFyc2VJbnQodFszXSwxMCkvMjU1LHBhcnNlSW50KHRbNF0sMTApLzI1NSxpc05hTihwYXJzZUZsb2F0KHRbNV0pKT8xOnBhcnNlRmxvYXQodFs1XSkpfX0se3JlOi8oaHNsKWE/XChccyooXGR7MSwzfSlccyosXHMqKFxkezEsM30pJVxzKixccyooXGR7MSwzfSklXHMqKD86LFxzKihcZCsoPzpcLlxkKyk/KVxzKik/XCkvLHBhcnNlOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgYzMocGFyc2VJbnQodFsyXSwxMCkvMzYwLHBhcnNlSW50KHRbM10sMTApLzEwMCxwYXJzZUludCh0WzRdLDEwKS8xMDAsaXNOYU4ocGFyc2VGbG9hdCh0WzVdKSk/MTpwYXJzZUZsb2F0KHRbNV0pKX19XTtvLnB1c2goZT97cmU6LyMoW2EtZkEtRjAtOV17Mn0pKFthLWZBLUYwLTldezJ9KShbYS1mQS1GMC05XXsyfSkoW2EtZkEtRjAtOV17Mn0pPyQvLHBhcnNlOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgczMocGFyc2VJbnQodFsxXSwxNikvMjU1LHBhcnNlSW50KHRbMl0sMTYpLzI1NSxwYXJzZUludCh0WzNdLDE2KS8yNTUscGFyc2VJbnQodFs0XXx8IkZGIiwxNikvMjU1KX19OntyZTovIyhbYS1mQS1GMC05XXsyfSkoW2EtZkEtRjAtOV17Mn0pKFthLWZBLUYwLTldezJ9KSQvLHBhcnNlOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgczMocGFyc2VJbnQodFsxXSwxNikvMjU1LHBhcnNlSW50KHRbMl0sMTYpLzI1NSxwYXJzZUludCh0WzNdLDE2KS8yNTUsMSl9fSksby5wdXNoKHtyZTovIyhbYS1mQS1GMC05XSkoW2EtZkEtRjAtOV0pKFthLWZBLUYwLTldKSQvLHBhcnNlOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgczMocGFyc2VJbnQodFsxXSt0WzFdLDE2KS8yNTUscGFyc2VJbnQodFsyXSt0WzJdLDE2KS8yNTUscGFyc2VJbnQodFszXSt0WzNdLDE2KS8yNTUsMSl9fSk7Zm9yKGNvbnN0IGUgaW4gbylpZihvLmhhc093blByb3BlcnR5KGUpKXtjb25zdCBpPW9bZV0sYT1pLnJlLmV4ZWModCkscj1hJiZpLnBhcnNlKGEpO2lmKHIpcmV0dXJuIHIgaW5zdGFuY2VvZiBzMz9uPXRoaXMucmdiYVRvSHN2YShyKTpyIGluc3RhbmNlb2YgYzMmJihuPXRoaXMuaHNsYTJoc3ZhKHIpKSxufXJldHVybiBufW91dHB1dEZvcm1hdCh0LGUsbil7c3dpdGNoKCJhdXRvIj09PWUmJihlPXQuYTwxPyJyZ2JhIjoiaGV4IiksZSl7Y2FzZSJoc2xhIjpjb25zdCBlPXRoaXMuaHN2YTJoc2xhKHQpLG89bmV3IGMzKE1hdGgucm91bmQoMzYwKmUuaCksTWF0aC5yb3VuZCgxMDAqZS5zKSxNYXRoLnJvdW5kKDEwMCplLmwpLE1hdGgucm91bmQoMTAwKmUuYSkvMTAwKTtyZXR1cm4gdC5hPDF8fCJhbHdheXMiPT09bj8iaHNsYSgiK28uaCsiLCIrby5zKyIlLCIrby5sKyIlLCIrby5hKyIpIjoiaHNsKCIrby5oKyIsIitvLnMrIiUsIitvLmwrIiUpIjtjYXNlInJnYmEiOmNvbnN0IGk9dGhpcy5kZW5vcm1hbGl6ZVJHQkEodGhpcy5oc3ZhVG9SZ2JhKHQpKTtyZXR1cm4gdC5hPDF8fCJhbHdheXMiPT09bj8icmdiYSgiK2kucisiLCIraS5nKyIsIitpLmIrIiwiK01hdGgucm91bmQoMTAwKmkuYSkvMTAwKyIpIjoicmdiKCIraS5yKyIsIitpLmcrIiwiK2kuYisiKSI7ZGVmYXVsdDpjb25zdCBhPSJhbHdheXMiPT09bnx8ImZvcmNlZCI9PT1uO3JldHVybiB0aGlzLnJnYmFUb0hleCh0aGlzLmRlbm9ybWFsaXplUkdCQSh0aGlzLmhzdmFUb1JnYmEodCkpLGEpfX19ZzMuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGczKX0sZzMuybVwcm92PU1uKHt0b2tlbjpnMyxmYWN0b3J5OmczLsm1ZmFjfSksZzMuY3RvclBhcmFtZXRlcnM9KCk9PltdLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZzMsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW119KSxudWxsKTtjbGFzcyBoM3tjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5lbFJlZj10LHRoaXMuY2RSZWY9ZSx0aGlzLnNlcnZpY2U9bix0aGlzLmlzSUUxMD0hMSx0aGlzLmRpYWxvZ0Fycm93U2l6ZT0xMCx0aGlzLmRpYWxvZ0Fycm93T2Zmc2V0PTE1LHRoaXMuZGlhbG9nSW5wdXRGaWVsZHM9W3IzLkhFWCxyMy5SR0JBLHIzLkhTTEEscjMuQ01ZS10sdGhpcy51c2VSb290Vmlld0NvbnRhaW5lcj0hMX1oYW5kbGVFc2ModCl7dGhpcy5zaG93JiYicG9wdXAiPT09dGhpcy5jcERpYWxvZ0Rpc3BsYXkmJnRoaXMub25DYW5jZWxDb2xvcih0KX1oYW5kbGVFbnRlcih0KXt0aGlzLnNob3cmJiJwb3B1cCI9PT10aGlzLmNwRGlhbG9nRGlzcGxheSYmdGhpcy5vbkFjY2VwdENvbG9yKHQpfW5nT25Jbml0KCl7dGhpcy5zbGlkZXI9bmV3IHUzKDAsMCwwLDApLHRoaXMuc2xpZGVyRGltTWF4PW5ldyBmMyh0aGlzLmh1ZVNsaWRlci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRofHwxNDAsdGhpcy5jcFdpZHRoLDEzMCx0aGlzLmFscGhhU2xpZGVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGh8fDE0MCksdGhpcy5mb3JtYXQ9dGhpcy5jcENteWtFbmFibGVkP3IzLkNNWUs6InJnYmEiPT09dGhpcy5jcE91dHB1dEZvcm1hdD9yMy5SR0JBOiJoc2xhIj09PXRoaXMuY3BPdXRwdXRGb3JtYXQ/cjMuSFNMQTpyMy5IRVgsdGhpcy5saXN0ZW5lck1vdXNlRG93bj10PT57dGhpcy5vbk1vdXNlRG93bih0KX0sdGhpcy5saXN0ZW5lclJlc2l6ZT0oKT0+e3RoaXMub25SZXNpemUoKX0sdGhpcy5vcGVuRGlhbG9nKHRoaXMuaW5pdGlhbENvbG9yLCExKX1uZ09uRGVzdHJveSgpe3RoaXMuY2xvc2VEaWFsb2coKX1uZ0FmdGVyVmlld0luaXQoKXsyMzA9PT10aGlzLmNwV2lkdGgmJiJpbmxpbmUiIT09dGhpcy5jcERpYWxvZ0Rpc3BsYXl8fCh0aGlzLnNsaWRlckRpbU1heD1uZXcgZjModGhpcy5odWVTbGlkZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aHx8MTQwLHRoaXMuY3BXaWR0aCwxMzAsdGhpcy5hbHBoYVNsaWRlci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRofHwxNDApLHRoaXMudXBkYXRlQ29sb3JQaWNrZXIoITEpLHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpKX1vcGVuRGlhbG9nKHQsZT0hMCl7dGhpcy5zZXJ2aWNlLnNldEFjdGl2ZSh0aGlzKSx0aGlzLndpZHRofHwodGhpcy5jcFdpZHRoPXRoaXMuZGlyZWN0aXZlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoKSx0aGlzLmhlaWdodHx8KHRoaXMuaGVpZ2h0PTMyMCksdGhpcy5zZXRJbml0aWFsQ29sb3IodCksdGhpcy5zZXRDb2xvckZyb21TdHJpbmcodCxlKSx0aGlzLm9wZW5Db2xvclBpY2tlcigpfWNsb3NlRGlhbG9nKCl7dGhpcy5jbG9zZUNvbG9yUGlja2VyKCl9c2V0dXBEaWFsb2codCxlLG4sbyxpLGEscixzLGwsYyxkLHAsbSx1LGYsZyxoLGIseSxfLEMsTSx2LHgsTyxQLHcsayxTLEQsRSxSLEEsVCxOLHope3RoaXMuc2V0SW5pdGlhbENvbG9yKG4pLHRoaXMuc2V0Q29sb3JNb2RlKHMpLHRoaXMuaXNJRTEwPTEwPT09KGZ1bmN0aW9uIEkoKXtsZXQgdD0iIjsidW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvciYmKHQ9bmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKTtjb25zdCBlPXQuaW5kZXhPZigibXNpZSAiKTtyZXR1cm4gZT4wJiZwYXJzZUludCh0LnN1YnN0cmluZyhlKzUsdC5pbmRleE9mKCIuIixlKSksMTApfSkoKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlPXQsdGhpcy5kaXJlY3RpdmVFbGVtZW50UmVmPWUsdGhpcy5jcERpc2FibGVJbnB1dD1wLHRoaXMuY3BDbXlrRW5hYmxlZD1sLHRoaXMuY3BBbHBoYUNoYW5uZWw9Yyx0aGlzLmNwT3V0cHV0Rm9ybWF0PWQsdGhpcy5jcERpYWxvZ0Rpc3BsYXk9YSx0aGlzLmNwSWdub3JlZEVsZW1lbnRzPW0sdGhpcy5jcFNhdmVDbGlja091dHNpZGU9dSx0aGlzLmNwQ2xvc2VDbGlja091dHNpZGU9Zix0aGlzLnVzZVJvb3RWaWV3Q29udGFpbmVyPWcsdGhpcy53aWR0aD10aGlzLmNwV2lkdGg9cGFyc2VJbnQobywxMCksdGhpcy5oZWlnaHQ9dGhpcy5jcEhlaWdodD1wYXJzZUludChpLDEwKSx0aGlzLmNwUG9zaXRpb249aCx0aGlzLmNwUG9zaXRpb25PZmZzZXQ9cGFyc2VJbnQoYiwxMCksdGhpcy5jcE9LQnV0dG9uPVAsdGhpcy5jcE9LQnV0dG9uVGV4dD1rLHRoaXMuY3BPS0J1dHRvbkNsYXNzPXcsdGhpcy5jcENhbmNlbEJ1dHRvbj1TLHRoaXMuY3BDYW5jZWxCdXR0b25UZXh0PUUsdGhpcy5jcENhbmNlbEJ1dHRvbkNsYXNzPUQsdGhpcy5mYWxsYmFja0NvbG9yPXJ8fCIjZmZmIix0aGlzLnNldFByZXNldENvbmZpZyhfLEMpLHRoaXMuY3BQcmVzZXRDb2xvcnNDbGFzcz1NLHRoaXMuY3BNYXhQcmVzZXRDb2xvcnNMZW5ndGg9dix0aGlzLmNwUHJlc2V0RW1wdHlNZXNzYWdlPXgsdGhpcy5jcFByZXNldEVtcHR5TWVzc2FnZUNsYXNzPU8sdGhpcy5jcEFkZENvbG9yQnV0dG9uPVIsdGhpcy5jcEFkZENvbG9yQnV0dG9uVGV4dD1ULHRoaXMuY3BBZGRDb2xvckJ1dHRvbkNsYXNzPUEsdGhpcy5jcFJlbW92ZUNvbG9yQnV0dG9uQ2xhc3M9Tix0aGlzLmNwVHJpZ2dlckVsZW1lbnQ9eix5fHwodGhpcy5kaWFsb2dBcnJvd09mZnNldD0wKSwiaW5saW5lIj09PWEmJih0aGlzLmRpYWxvZ0Fycm93U2l6ZT0wLHRoaXMuZGlhbG9nQXJyb3dPZmZzZXQ9MCksImhleCI9PT1kJiYiYWx3YXlzIiE9PWMmJiJmb3JjZWQiIT09YyYmKHRoaXMuY3BBbHBoYUNoYW5uZWw9ImRpc2FibGVkIil9c2V0Q29sb3JNb2RlKHQpe3N3aXRjaCh0LnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKSl7Y2FzZSIxIjpjYXNlIkMiOmNhc2UiQ09MT1IiOnRoaXMuY3BDb2xvck1vZGU9MTticmVhaztjYXNlIjIiOmNhc2UiRyI6Y2FzZSJHUkFZU0NBTEUiOnRoaXMuY3BDb2xvck1vZGU9MjticmVhaztjYXNlIjMiOmNhc2UiUCI6Y2FzZSJQUkVTRVRTIjp0aGlzLmNwQ29sb3JNb2RlPTM7YnJlYWs7ZGVmYXVsdDp0aGlzLmNwQ29sb3JNb2RlPTF9fXNldEluaXRpYWxDb2xvcih0KXt0aGlzLmluaXRpYWxDb2xvcj10fXNldFByZXNldENvbmZpZyh0LGUpe3RoaXMuY3BQcmVzZXRMYWJlbD10LHRoaXMuY3BQcmVzZXRDb2xvcnM9ZX1zZXRDb2xvckZyb21TdHJpbmcodCxlPSEwLG49ITApe2xldCBvOyJhbHdheXMiPT09dGhpcy5jcEFscGhhQ2hhbm5lbHx8ImZvcmNlZCI9PT10aGlzLmNwQWxwaGFDaGFubmVsPyhvPXRoaXMuc2VydmljZS5zdHJpbmdUb0hzdmEodCwhMCksb3x8dGhpcy5oc3ZhfHwobz10aGlzLnNlcnZpY2Uuc3RyaW5nVG9Ic3ZhKHQsITEpKSk6bz10aGlzLnNlcnZpY2Uuc3RyaW5nVG9Ic3ZhKHQsITEpLG98fHRoaXMuaHN2YXx8KG89dGhpcy5zZXJ2aWNlLnN0cmluZ1RvSHN2YSh0aGlzLmZhbGxiYWNrQ29sb3IsITEpKSxvJiYodGhpcy5oc3ZhPW8sdGhpcy5zbGlkZXJIPXRoaXMuaHN2YS5oLCJoZXgiPT09dGhpcy5jcE91dHB1dEZvcm1hdCYmImRpc2FibGVkIj09PXRoaXMuY3BBbHBoYUNoYW5uZWwmJih0aGlzLmhzdmEuYT0xKSx0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKGUsbikpfW9uUmVzaXplKCl7ImZpeGVkIj09PXRoaXMucG9zaXRpb24/dGhpcy5zZXREaWFsb2dQb3NpdGlvbigpOiJpbmxpbmUiIT09dGhpcy5jcERpYWxvZ0Rpc3BsYXkmJnRoaXMuY2xvc2VDb2xvclBpY2tlcigpfW9uRHJhZ0VuZCh0KXt0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLnNsaWRlckRyYWdFbmQoe3NsaWRlcjp0LGNvbG9yOnRoaXMub3V0cHV0Q29sb3J9KX1vbkRyYWdTdGFydCh0KXt0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLnNsaWRlckRyYWdTdGFydCh7c2xpZGVyOnQsY29sb3I6dGhpcy5vdXRwdXRDb2xvcn0pfW9uTW91c2VEb3duKHQpeyF0aGlzLnNob3d8fHRoaXMuaXNJRTEwfHwicG9wdXAiIT09dGhpcy5jcERpYWxvZ0Rpc3BsYXl8fHQudGFyZ2V0PT09dGhpcy5kaXJlY3RpdmVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnR8fHRoaXMuaXNEZXNjZW5kYW50KHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCx0LnRhcmdldCl8fHRoaXMuaXNEZXNjZW5kYW50KHRoaXMuZGlyZWN0aXZlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LHQudGFyZ2V0KXx8MCE9PXRoaXMuY3BJZ25vcmVkRWxlbWVudHMuZmlsdGVyKChlPT5lPT09dC50YXJnZXQpKS5sZW5ndGh8fCh0aGlzLmNwU2F2ZUNsaWNrT3V0c2lkZT90aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmNvbG9yU2VsZWN0ZWQodGhpcy5vdXRwdXRDb2xvcik6KHRoaXMuaHN2YT1udWxsLHRoaXMuc2V0Q29sb3JGcm9tU3RyaW5nKHRoaXMuaW5pdGlhbENvbG9yLCExKSx0aGlzLmNwQ215a0VuYWJsZWQmJnRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuY215a0NoYW5nZWQodGhpcy5jbXlrQ29sb3IpLHRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuY29sb3JDaGFuZ2VkKHRoaXMuaW5pdGlhbENvbG9yKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmNvbG9yQ2FuY2VsZWQoKSksdGhpcy5jcENsb3NlQ2xpY2tPdXRzaWRlJiZ0aGlzLmNsb3NlQ29sb3JQaWNrZXIoKSl9b25BY2NlcHRDb2xvcih0KXt0LnN0b3BQcm9wYWdhdGlvbigpLHRoaXMub3V0cHV0Q29sb3ImJnRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuY29sb3JTZWxlY3RlZCh0aGlzLm91dHB1dENvbG9yKSwicG9wdXAiPT09dGhpcy5jcERpYWxvZ0Rpc3BsYXkmJnRoaXMuY2xvc2VDb2xvclBpY2tlcigpfW9uQ2FuY2VsQ29sb3IodCl7dGhpcy5oc3ZhPW51bGwsdC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmNvbG9yQ2FuY2VsZWQoKSx0aGlzLnNldENvbG9yRnJvbVN0cmluZyh0aGlzLmluaXRpYWxDb2xvciwhMCksInBvcHVwIj09PXRoaXMuY3BEaWFsb2dEaXNwbGF5JiYodGhpcy5jcENteWtFbmFibGVkJiZ0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmNteWtDaGFuZ2VkKHRoaXMuY215a0NvbG9yKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmNvbG9yQ2hhbmdlZCh0aGlzLmluaXRpYWxDb2xvciwhMCksdGhpcy5jbG9zZUNvbG9yUGlja2VyKCkpfW9uRm9ybWF0VG9nZ2xlKHQpe2NvbnN0IGU9dGhpcy5kaWFsb2dJbnB1dEZpZWxkcy5sZW5ndGgtKHRoaXMuY3BDbXlrRW5hYmxlZD8wOjEpLG49KCh0aGlzLmRpYWxvZ0lucHV0RmllbGRzLmluZGV4T2YodGhpcy5mb3JtYXQpK3QpJWUrZSklZTt0aGlzLmZvcm1hdD10aGlzLmRpYWxvZ0lucHV0RmllbGRzW25dfW9uQ29sb3JDaGFuZ2UodCl7dGhpcy5oc3ZhLnM9dC5zL3QucmdYLHRoaXMuaHN2YS52PXQudi90LnJnWSx0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKCksdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5zbGlkZXJDaGFuZ2VkKHtzbGlkZXI6ImxpZ2h0bmVzcyIsdmFsdWU6dGhpcy5oc3ZhLnYsY29sb3I6dGhpcy5vdXRwdXRDb2xvcn0pLHRoaXMuZGlyZWN0aXZlSW5zdGFuY2Uuc2xpZGVyQ2hhbmdlZCh7c2xpZGVyOiJzYXR1cmF0aW9uIix2YWx1ZTp0aGlzLmhzdmEucyxjb2xvcjp0aGlzLm91dHB1dENvbG9yfSl9b25IdWVDaGFuZ2UodCl7dGhpcy5oc3ZhLmg9dC52L3QucmdYLHRoaXMuc2xpZGVySD10aGlzLmhzdmEuaCx0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKCksdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5zbGlkZXJDaGFuZ2VkKHtzbGlkZXI6Imh1ZSIsdmFsdWU6dGhpcy5oc3ZhLmgsY29sb3I6dGhpcy5vdXRwdXRDb2xvcn0pfW9uVmFsdWVDaGFuZ2UodCl7dGhpcy5oc3ZhLnY9dC52L3QucmdYLHRoaXMudXBkYXRlQ29sb3JQaWNrZXIoKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLnNsaWRlckNoYW5nZWQoe3NsaWRlcjoidmFsdWUiLHZhbHVlOnRoaXMuaHN2YS52LGNvbG9yOnRoaXMub3V0cHV0Q29sb3J9KX1vbkFscGhhQ2hhbmdlKHQpe3RoaXMuaHN2YS5hPXQudi90LnJnWCx0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKCksdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5zbGlkZXJDaGFuZ2VkKHtzbGlkZXI6ImFscGhhIix2YWx1ZTp0aGlzLmhzdmEuYSxjb2xvcjp0aGlzLm91dHB1dENvbG9yfSl9b25IZXhJbnB1dCh0KXtpZihudWxsPT09dCl0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKCk7ZWxzZXt0JiYiIyIhPT10WzBdJiYodD0iIyIrdCk7bGV0IGU9L14jKFthLWYwLTldezN9fFthLWYwLTldezZ9KSQvZ2k7ImFsd2F5cyI9PT10aGlzLmNwQWxwaGFDaGFubmVsJiYoZT0vXiMoW2EtZjAtOV17M318W2EtZjAtOV17Nn18W2EtZjAtOV17OH0pJC9naSk7Y29uc3Qgbj1lLnRlc3QodCk7biYmKHQubGVuZ3RoPDUmJih0PSIjIit0LnN1YnN0cmluZygxKS5zcGxpdCgiIikubWFwKCh0PT50K3QpKS5qb2luKCIiKSksImZvcmNlZCI9PT10aGlzLmNwQWxwaGFDaGFubmVsJiYodCs9TWF0aC5yb3VuZCgyNTUqdGhpcy5oc3ZhLmEpLnRvU3RyaW5nKDE2KSksdGhpcy5zZXRDb2xvckZyb21TdHJpbmcodCwhMCwhMSkpLHRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuaW5wdXRDaGFuZ2VkKHtpbnB1dDoiaGV4Iix2YWxpZDpuLHZhbHVlOnQsY29sb3I6dGhpcy5vdXRwdXRDb2xvcn0pfX1vblJlZElucHV0KHQpe2NvbnN0IGU9dGhpcy5zZXJ2aWNlLmhzdmFUb1JnYmEodGhpcy5oc3ZhKSxuPSFpc05hTih0LnYpJiZ0LnY+PTAmJnQudjw9dC5yZztuJiYoZS5yPXQudi90LnJnLHRoaXMuaHN2YT10aGlzLnNlcnZpY2UucmdiYVRvSHN2YShlKSx0aGlzLnNsaWRlckg9dGhpcy5oc3ZhLmgsdGhpcy51cGRhdGVDb2xvclBpY2tlcigpKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmlucHV0Q2hhbmdlZCh7aW5wdXQ6InJlZCIsdmFsaWQ6bix2YWx1ZTplLnIsY29sb3I6dGhpcy5vdXRwdXRDb2xvcn0pfW9uQmx1ZUlucHV0KHQpe2NvbnN0IGU9dGhpcy5zZXJ2aWNlLmhzdmFUb1JnYmEodGhpcy5oc3ZhKSxuPSFpc05hTih0LnYpJiZ0LnY+PTAmJnQudjw9dC5yZztuJiYoZS5iPXQudi90LnJnLHRoaXMuaHN2YT10aGlzLnNlcnZpY2UucmdiYVRvSHN2YShlKSx0aGlzLnNsaWRlckg9dGhpcy5oc3ZhLmgsdGhpcy51cGRhdGVDb2xvclBpY2tlcigpKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmlucHV0Q2hhbmdlZCh7aW5wdXQ6ImJsdWUiLHZhbGlkOm4sdmFsdWU6ZS5iLGNvbG9yOnRoaXMub3V0cHV0Q29sb3J9KX1vbkdyZWVuSW5wdXQodCl7Y29uc3QgZT10aGlzLnNlcnZpY2UuaHN2YVRvUmdiYSh0aGlzLmhzdmEpLG49IWlzTmFOKHQudikmJnQudj49MCYmdC52PD10LnJnO24mJihlLmc9dC52L3QucmcsdGhpcy5oc3ZhPXRoaXMuc2VydmljZS5yZ2JhVG9Ic3ZhKGUpLHRoaXMuc2xpZGVySD10aGlzLmhzdmEuaCx0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKCkpLHRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuaW5wdXRDaGFuZ2VkKHtpbnB1dDoiZ3JlZW4iLHZhbGlkOm4sdmFsdWU6ZS5nLGNvbG9yOnRoaXMub3V0cHV0Q29sb3J9KX1vbkh1ZUlucHV0KHQpe2NvbnN0IGU9IWlzTmFOKHQudikmJnQudj49MCYmdC52PD10LnJnO2UmJih0aGlzLmhzdmEuaD10LnYvdC5yZyx0aGlzLnNsaWRlckg9dGhpcy5oc3ZhLmgsdGhpcy51cGRhdGVDb2xvclBpY2tlcigpKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmlucHV0Q2hhbmdlZCh7aW5wdXQ6Imh1ZSIsdmFsaWQ6ZSx2YWx1ZTp0aGlzLmhzdmEuaCxjb2xvcjp0aGlzLm91dHB1dENvbG9yfSl9b25WYWx1ZUlucHV0KHQpe2NvbnN0IGU9IWlzTmFOKHQudikmJnQudj49MCYmdC52PD10LnJnO2UmJih0aGlzLmhzdmEudj10LnYvdC5yZyx0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKCkpLHRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuaW5wdXRDaGFuZ2VkKHtpbnB1dDoidmFsdWUiLHZhbGlkOmUsdmFsdWU6dGhpcy5oc3ZhLnYsY29sb3I6dGhpcy5vdXRwdXRDb2xvcn0pfW9uQWxwaGFJbnB1dCh0KXtjb25zdCBlPSFpc05hTih0LnYpJiZ0LnY+PTAmJnQudjw9dC5yZztlJiYodGhpcy5oc3ZhLmE9dC52L3QucmcsdGhpcy51cGRhdGVDb2xvclBpY2tlcigpKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmlucHV0Q2hhbmdlZCh7aW5wdXQ6ImFscGhhIix2YWxpZDplLHZhbHVlOnRoaXMuaHN2YS5hLGNvbG9yOnRoaXMub3V0cHV0Q29sb3J9KX1vbkxpZ2h0bmVzc0lucHV0KHQpe2NvbnN0IGU9dGhpcy5zZXJ2aWNlLmhzdmEyaHNsYSh0aGlzLmhzdmEpLG49IWlzTmFOKHQudikmJnQudj49MCYmdC52PD10LnJnO24mJihlLmw9dC52L3QucmcsdGhpcy5oc3ZhPXRoaXMuc2VydmljZS5oc2xhMmhzdmEoZSksdGhpcy5zbGlkZXJIPXRoaXMuaHN2YS5oLHRoaXMudXBkYXRlQ29sb3JQaWNrZXIoKSksdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5pbnB1dENoYW5nZWQoe2lucHV0OiJsaWdodG5lc3MiLHZhbGlkOm4sdmFsdWU6ZS5sLGNvbG9yOnRoaXMub3V0cHV0Q29sb3J9KX1vblNhdHVyYXRpb25JbnB1dCh0KXtjb25zdCBlPXRoaXMuc2VydmljZS5oc3ZhMmhzbGEodGhpcy5oc3ZhKSxuPSFpc05hTih0LnYpJiZ0LnY+PTAmJnQudjw9dC5yZztuJiYoZS5zPXQudi90LnJnLHRoaXMuaHN2YT10aGlzLnNlcnZpY2UuaHNsYTJoc3ZhKGUpLHRoaXMuc2xpZGVySD10aGlzLmhzdmEuaCx0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKCkpLHRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuaW5wdXRDaGFuZ2VkKHtpbnB1dDoic2F0dXJhdGlvbiIsdmFsaWQ6bix2YWx1ZTplLnMsY29sb3I6dGhpcy5vdXRwdXRDb2xvcn0pfW9uQ3lhbklucHV0KHQpeyFpc05hTih0LnYpJiZ0LnY+PTAmJnQudjw9dC5yZyYmKHRoaXMuY215ay5jPXQudix0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKCExLCEwLCEwKSksdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5pbnB1dENoYW5nZWQoe2lucHV0OiJjeWFuIix2YWxpZDohMCx2YWx1ZTp0aGlzLmNteWsuYyxjb2xvcjp0aGlzLm91dHB1dENvbG9yfSl9b25NYWdlbnRhSW5wdXQodCl7IWlzTmFOKHQudikmJnQudj49MCYmdC52PD10LnJnJiYodGhpcy5jbXlrLm09dC52LHRoaXMudXBkYXRlQ29sb3JQaWNrZXIoITEsITAsITApKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmlucHV0Q2hhbmdlZCh7aW5wdXQ6Im1hZ2VudGEiLHZhbGlkOiEwLHZhbHVlOnRoaXMuY215ay5tLGNvbG9yOnRoaXMub3V0cHV0Q29sb3J9KX1vblllbGxvd0lucHV0KHQpeyFpc05hTih0LnYpJiZ0LnY+PTAmJnQudjw9dC5yZyYmKHRoaXMuY215ay55PXQudix0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKCExLCEwLCEwKSksdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5pbnB1dENoYW5nZWQoe2lucHV0OiJ5ZWxsb3ciLHZhbGlkOiEwLHZhbHVlOnRoaXMuY215ay55LGNvbG9yOnRoaXMub3V0cHV0Q29sb3J9KX1vbkJsYWNrSW5wdXQodCl7IWlzTmFOKHQudikmJnQudj49MCYmdC52PD10LnJnJiYodGhpcy5jbXlrLms9dC52LHRoaXMudXBkYXRlQ29sb3JQaWNrZXIoITEsITAsITApKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmlucHV0Q2hhbmdlZCh7aW5wdXQ6ImJsYWNrIix2YWxpZDohMCx2YWx1ZTp0aGlzLmNteWsuayxjb2xvcjp0aGlzLm91dHB1dENvbG9yfSl9b25BZGRQcmVzZXRDb2xvcih0LGUpe3Quc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5jcFByZXNldENvbG9ycy5maWx0ZXIoKHQ9PnQ9PT1lKSkubGVuZ3RofHwodGhpcy5jcFByZXNldENvbG9ycz10aGlzLmNwUHJlc2V0Q29sb3JzLmNvbmNhdChlKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLnByZXNldENvbG9yc0NoYW5nZWQodGhpcy5jcFByZXNldENvbG9ycykpfW9uUmVtb3ZlUHJlc2V0Q29sb3IodCxlKXt0LnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuY3BQcmVzZXRDb2xvcnM9dGhpcy5jcFByZXNldENvbG9ycy5maWx0ZXIoKHQ9PnQhPT1lKSksdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5wcmVzZXRDb2xvcnNDaGFuZ2VkKHRoaXMuY3BQcmVzZXRDb2xvcnMpfW9wZW5Db2xvclBpY2tlcigpe3RoaXMuc2hvd3x8KHRoaXMuc2hvdz0hMCx0aGlzLmhpZGRlbj0hMCxzZXRUaW1lb3V0KCgoKT0+e3RoaXMuaGlkZGVuPSExLHRoaXMuc2V0RGlhbG9nUG9zaXRpb24oKSx0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKX0pLDApLHRoaXMuZGlyZWN0aXZlSW5zdGFuY2Uuc3RhdGVDaGFuZ2VkKCEwKSx0aGlzLmlzSUUxMHx8KGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5saXN0ZW5lck1vdXNlRG93biksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5saXN0ZW5lck1vdXNlRG93bikpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLHRoaXMubGlzdGVuZXJSZXNpemUpKX1jbG9zZUNvbG9yUGlja2VyKCl7dGhpcy5zaG93JiYodGhpcy5zaG93PSExLHRoaXMuZGlyZWN0aXZlSW5zdGFuY2Uuc3RhdGVDaGFuZ2VkKCExKSx0aGlzLmlzSUUxMHx8KGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5saXN0ZW5lck1vdXNlRG93biksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5saXN0ZW5lck1vdXNlRG93bikpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLHRoaXMubGlzdGVuZXJSZXNpemUpLHRoaXMuY2RSZWYuZGVzdHJveWVkfHx0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKSl9dXBkYXRlQ29sb3JQaWNrZXIodD0hMCxlPSEwLG49ITEpe2lmKHRoaXMuc2xpZGVyRGltTWF4KXtsZXQgbyxpLGE7Mj09PXRoaXMuY3BDb2xvck1vZGUmJih0aGlzLmhzdmEucz0wKTtjb25zdCByPXRoaXMub3V0cHV0Q29sb3I7aWYoaT10aGlzLnNlcnZpY2UuaHN2YTJoc2xhKHRoaXMuaHN2YSksdGhpcy5jcENteWtFbmFibGVkPyhuPyhhPXRoaXMuc2VydmljZS5jbXlrVG9SZ2IodGhpcy5zZXJ2aWNlLm5vcm1hbGl6ZUNNWUsodGhpcy5jbXlrKSksdGhpcy5oc3ZhPXRoaXMuc2VydmljZS5yZ2JhVG9Ic3ZhKGEpKTooYT10aGlzLnNlcnZpY2UuaHN2YVRvUmdiYSh0aGlzLmhzdmEpLHRoaXMuY215az10aGlzLnNlcnZpY2UuZGVub3JtYWxpemVDTVlLKHRoaXMuc2VydmljZS5yZ2JhVG9DbXlrKGEpKSksYT10aGlzLnNlcnZpY2UuZGVub3JtYWxpemVSR0JBKGEpLHRoaXMuc2xpZGVySD10aGlzLmhzdmEuaCk6YT10aGlzLnNlcnZpY2UuZGVub3JtYWxpemVSR0JBKHRoaXMuc2VydmljZS5oc3ZhVG9SZ2JhKHRoaXMuaHN2YSkpLG89dGhpcy5zZXJ2aWNlLmRlbm9ybWFsaXplUkdCQSh0aGlzLnNlcnZpY2UuaHN2YVRvUmdiYShuZXcgbDModGhpcy5zbGlkZXJIfHx0aGlzLmhzdmEuaCwxLDEsMSkpKSxlJiYodGhpcy5oc2xhVGV4dD1uZXcgYzMoTWF0aC5yb3VuZCgzNjAqaS5oKSxNYXRoLnJvdW5kKDEwMCppLnMpLE1hdGgucm91bmQoMTAwKmkubCksTWF0aC5yb3VuZCgxMDAqaS5hKS8xMDApLHRoaXMucmdiYVRleHQ9bmV3IHMzKGEucixhLmcsYS5iLE1hdGgucm91bmQoMTAwKmEuYSkvMTAwKSx0aGlzLmNwQ215a0VuYWJsZWQmJih0aGlzLmNteWtUZXh0PW5ldyBkMyh0aGlzLmNteWsuYyx0aGlzLmNteWsubSx0aGlzLmNteWsueSx0aGlzLmNteWsuayxNYXRoLnJvdW5kKDEwMCp0aGlzLmNteWsuYSkvMTAwKSksdGhpcy5oZXhUZXh0PXRoaXMuc2VydmljZS5yZ2JhVG9IZXgoYSwiYWx3YXlzIj09PXRoaXMuY3BBbHBoYUNoYW5uZWwpLHRoaXMuaGV4QWxwaGE9dGhpcy5yZ2JhVGV4dC5hKSwiYXV0byI9PT10aGlzLmNwT3V0cHV0Rm9ybWF0JiZ0aGlzLmZvcm1hdCE9PXIzLlJHQkEmJnRoaXMuZm9ybWF0IT09cjMuQ01ZSyYmdGhpcy5oc3ZhLmE8MSYmKHRoaXMuZm9ybWF0PXRoaXMuaHN2YS5hPDE/cjMuUkdCQTpyMy5IRVgpLHRoaXMuaHVlU2xpZGVyQ29sb3I9InJnYigiK28ucisiLCIrby5nKyIsIitvLmIrIikiLHRoaXMuYWxwaGFTbGlkZXJDb2xvcj0icmdiKCIrYS5yKyIsIithLmcrIiwiK2EuYisiKSIsdGhpcy5vdXRwdXRDb2xvcj10aGlzLnNlcnZpY2Uub3V0cHV0Rm9ybWF0KHRoaXMuaHN2YSx0aGlzLmNwT3V0cHV0Rm9ybWF0LHRoaXMuY3BBbHBoYUNoYW5uZWwpLHRoaXMuc2VsZWN0ZWRDb2xvcj10aGlzLnNlcnZpY2Uub3V0cHV0Rm9ybWF0KHRoaXMuaHN2YSwicmdiYSIsbnVsbCksdGhpcy5mb3JtYXQhPT1yMy5DTVlLKXRoaXMuY215a0NvbG9yPSIiO2Vsc2UgaWYoImFsd2F5cyI9PT10aGlzLmNwQWxwaGFDaGFubmVsfHwiZW5hYmxlZCI9PT10aGlzLmNwQWxwaGFDaGFubmVsfHwiZm9yY2VkIj09PXRoaXMuY3BBbHBoYUNoYW5uZWwpe2NvbnN0IHQ9TWF0aC5yb3VuZCgxMDAqdGhpcy5jbXlrLmEpLzEwMDt0aGlzLmNteWtDb2xvcj1gY215a2EoJHt0aGlzLmNteWsuY30sJHt0aGlzLmNteWsubX0sJHt0aGlzLmNteWsueX0sJHt0aGlzLmNteWsua30sJHt0fSlgfWVsc2UgdGhpcy5jbXlrQ29sb3I9YGNteWsoJHt0aGlzLmNteWsuY30sJHt0aGlzLmNteWsubX0sJHt0aGlzLmNteWsueX0sJHt0aGlzLmNteWsua30pYDt0aGlzLnNsaWRlcj1uZXcgdTMoKHRoaXMuc2xpZGVySHx8dGhpcy5oc3ZhLmgpKnRoaXMuc2xpZGVyRGltTWF4LmgtOCx0aGlzLmhzdmEucyp0aGlzLnNsaWRlckRpbU1heC5zLTgsKDEtdGhpcy5oc3ZhLnYpKnRoaXMuc2xpZGVyRGltTWF4LnYtOCx0aGlzLmhzdmEuYSp0aGlzLnNsaWRlckRpbU1heC5hLTgpLHQmJnIhPT10aGlzLm91dHB1dENvbG9yJiYodGhpcy5jcENteWtFbmFibGVkJiZ0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmNteWtDaGFuZ2VkKHRoaXMuY215a0NvbG9yKSx0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmNvbG9yQ2hhbmdlZCh0aGlzLm91dHB1dENvbG9yKSl9fXNldERpYWxvZ1Bvc2l0aW9uKCl7aWYoImlubGluZSI9PT10aGlzLmNwRGlhbG9nRGlzcGxheSl0aGlzLnBvc2l0aW9uPSJyZWxhdGl2ZSI7ZWxzZXtsZXQgdCxlPSJzdGF0aWMiLG49IiIsbz1udWxsLGk9bnVsbCxhPXRoaXMuZGlyZWN0aXZlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnBhcmVudE5vZGU7Y29uc3Qgcj10aGlzLmRpYWxvZ0VsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7Zm9yKDtudWxsIT09YSYmIkhUTUwiIT09YS50YWdOYW1lOyl7aWYodD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKSxlPXQuZ2V0UHJvcGVydHlWYWx1ZSgicG9zaXRpb24iKSxuPXQuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNmb3JtIiksInN0YXRpYyIhPT1lJiZudWxsPT09byYmKG89YSksbiYmIm5vbmUiIT09biYmbnVsbD09PWkmJihpPWEpLCJmaXhlZCI9PT1lKXtvPWk7YnJlYWt9YT1hLnBhcmVudE5vZGV9Y29uc3Qgcz10aGlzLmNyZWF0ZURpYWxvZ0JveCh0aGlzLmRpcmVjdGl2ZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwiZml4ZWQiIT09ZSk7aWYodGhpcy51c2VSb290Vmlld0NvbnRhaW5lcnx8ImZpeGVkIj09PWUmJighb3x8byBpbnN0YW5jZW9mIEhUTUxVbmtub3duRWxlbWVudCkpdGhpcy50b3A9cy50b3AsdGhpcy5sZWZ0PXMubGVmdDtlbHNle251bGw9PT1vJiYobz1hKTtjb25zdCB0PXRoaXMuY3JlYXRlRGlhbG9nQm94KG8sImZpeGVkIiE9PWUpO3RoaXMudG9wPXMudG9wLXQudG9wLHRoaXMubGVmdD1zLmxlZnQtdC5sZWZ0fSJmaXhlZCI9PT1lJiYodGhpcy5wb3NpdGlvbj0iZml4ZWQiKTtsZXQgbD10aGlzLmNwUG9zaXRpb247ImF1dG8iPT09dGhpcy5jcFBvc2l0aW9uJiYobD0oZnVuY3Rpb24gYyh0LGUpe2xldCBuPSJyaWdodCIsbz0iYm90dG9tIjtjb25zdHtoZWlnaHQ6aSx3aWR0aDphfT10LHt0b3A6cixsZWZ0OnN9PWUsbD1yK2UuaGVpZ2h0LGM9cytlLndpZHRoLGQ9ci1pPDAscD1sK2k+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCksbT1zLWE8MCx1PWMrYT4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk7cmV0dXJuIHAmJihvPSJ0b3AiKSxkJiYobz0iYm90dG9tIiksbSYmKG49InJpZ2h0IiksdSYmKG49ImxlZnQiKSxkJiZwJiZtJiZ1P1sibGVmdCIsInJpZ2h0IiwidG9wIiwiYm90dG9tIl0ucmVkdWNlKCgoZSxuKT0+dFtlXT50W25dP2U6bikpOm0mJnU/ZD8iYm90dG9tIjpwfHxyPmw/InRvcCI6ImJvdHRvbSI6ZCYmcD9tPyJyaWdodCI6dXx8cz5jPyJsZWZ0IjoicmlnaHQiOmAke299LSR7bn1gfSkodGhpcy5kaWFsb2dFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdGhpcy5jcFRyaWdnZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKSwidG9wIj09PWw/KHRoaXMuYXJyb3dUb3A9ci0xLHRoaXMudG9wLT1yK3RoaXMuZGlhbG9nQXJyb3dTaXplLHRoaXMubGVmdCs9dGhpcy5jcFBvc2l0aW9uT2Zmc2V0LzEwMCpzLndpZHRoLXRoaXMuZGlhbG9nQXJyb3dPZmZzZXQpOiJib3R0b20iPT09bD8odGhpcy50b3ArPXMuaGVpZ2h0K3RoaXMuZGlhbG9nQXJyb3dTaXplLHRoaXMubGVmdCs9dGhpcy5jcFBvc2l0aW9uT2Zmc2V0LzEwMCpzLndpZHRoLXRoaXMuZGlhbG9nQXJyb3dPZmZzZXQpOiJ0b3AtbGVmdCI9PT1sfHwibGVmdC10b3AiPT09bD8odGhpcy50b3AtPXItcy5oZWlnaHQrcy5oZWlnaHQqdGhpcy5jcFBvc2l0aW9uT2Zmc2V0LzEwMCx0aGlzLmxlZnQtPXRoaXMuY3BXaWR0aCt0aGlzLmRpYWxvZ0Fycm93U2l6ZS0yLXRoaXMuZGlhbG9nQXJyb3dPZmZzZXQpOiJ0b3AtcmlnaHQiPT09bHx8InJpZ2h0LXRvcCI9PT1sPyh0aGlzLnRvcC09ci1zLmhlaWdodCtzLmhlaWdodCp0aGlzLmNwUG9zaXRpb25PZmZzZXQvMTAwLHRoaXMubGVmdCs9cy53aWR0aCt0aGlzLmRpYWxvZ0Fycm93U2l6ZS0yLXRoaXMuZGlhbG9nQXJyb3dPZmZzZXQpOiJsZWZ0Ij09PWx8fCJib3R0b20tbGVmdCI9PT1sfHwibGVmdC1ib3R0b20iPT09bD8odGhpcy50b3ArPXMuaGVpZ2h0KnRoaXMuY3BQb3NpdGlvbk9mZnNldC8xMDAtdGhpcy5kaWFsb2dBcnJvd09mZnNldCx0aGlzLmxlZnQtPXRoaXMuY3BXaWR0aCt0aGlzLmRpYWxvZ0Fycm93U2l6ZS0yKToodGhpcy50b3ArPXMuaGVpZ2h0KnRoaXMuY3BQb3NpdGlvbk9mZnNldC8xMDAtdGhpcy5kaWFsb2dBcnJvd09mZnNldCx0aGlzLmxlZnQrPXMud2lkdGgrdGhpcy5kaWFsb2dBcnJvd1NpemUtMiksdGhpcy5jcFVzZVBvc2l0aW9uPWx9fWlzRGVzY2VuZGFudCh0LGUpe2xldCBuPWUucGFyZW50Tm9kZTtmb3IoO251bGwhPT1uOyl7aWYobj09PXQpcmV0dXJuITA7bj1uLnBhcmVudE5vZGV9cmV0dXJuITF9Y3JlYXRlRGlhbG9nQm94KHQsZSl7cmV0dXJue3RvcDp0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCsoZT93aW5kb3cucGFnZVlPZmZzZXQ6MCksbGVmdDp0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQrKGU/d2luZG93LnBhZ2VYT2Zmc2V0OjApLHdpZHRoOnQub2Zmc2V0V2lkdGgsaGVpZ2h0OnQub2Zmc2V0SGVpZ2h0fX19aDMuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGgzKShTbShoZyksU20oVWcpLFNtKGczKSl9LGgzLsm1Y21wPXRvKHt0eXBlOmgzLHNlbGVjdG9yczpbWyJjb2xvci1waWNrZXIiXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihRaChFMSw3KSxRaChSMSw3KSxRaChBMSw3KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5kaWFsb2dFbGVtZW50PXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLmh1ZVNsaWRlcj10LmZpcnN0KSxKaCh0PXRiKCkpJiYobi5hbHBoYVNsaWRlcj10LmZpcnN0KX19LGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgia2V5dXAuZXNjIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5oYW5kbGVFc2MoZSl9KSwhMSxpbCkoImtleXVwLmVudGVyIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5oYW5kbGVFbnRlcihlKX0pLCExLGlsKX0sZGVjbHM6MjgsdmFyczo0Nyxjb25zdHM6W1sxLCJjb2xvci1waWNrZXIiLDMsImNsaWNrIl0sWyJkaWFsb2dQb3B1cCIsIiJdLFszLCJjbGFzcyIsInRvcCIsNCwibmdJZiJdLFsiY2xhc3MiLCJzYXR1cmF0aW9uLWxpZ2h0bmVzcyIsMywic2xpZGVyIiwicmdYIiwicmdZIiwiYmFja2dyb3VuZC1jb2xvciIsIm5ld1ZhbHVlIiwiZHJhZ1N0YXJ0IiwiZHJhZ0VuZCIsNCwibmdJZiJdLFsxLCJodWUtYWxwaGEiLCJib3giXSxbMSwibGVmdCJdLFsxLCJzZWxlY3RlZC1jb2xvci1iYWNrZ3JvdW5kIl0sWzEsInNlbGVjdGVkLWNvbG9yIl0sWyJ0eXBlIiwiYnV0dG9uIiwzLCJjbGFzcyIsImRpc2FibGVkIiwiY2xpY2siLDQsIm5nSWYiXSxbMSwicmlnaHQiXSxbInN0eWxlIiwiaGVpZ2h0OiAxNnB4OyIsNCwibmdJZiJdLFsxLCJodWUiLDMsInNsaWRlciIsInJnWCIsIm5ld1ZhbHVlIiwiZHJhZ1N0YXJ0IiwiZHJhZ0VuZCJdLFsiaHVlU2xpZGVyIiwiIl0sWzEsImN1cnNvciJdLFsxLCJ2YWx1ZSIsMywic2xpZGVyIiwicmdYIiwibmV3VmFsdWUiLCJkcmFnU3RhcnQiLCJkcmFnRW5kIl0sWyJ2YWx1ZVNsaWRlciIsIiJdLFsxLCJhbHBoYSIsMywic2xpZGVyIiwicmdYIiwibmV3VmFsdWUiLCJkcmFnU3RhcnQiLCJkcmFnRW5kIl0sWyJhbHBoYVNsaWRlciIsIiJdLFsiY2xhc3MiLCJjbXlrLXRleHQiLDMsImRpc3BsYXkiLDQsIm5nSWYiXSxbImNsYXNzIiwiaHNsYS10ZXh0IiwzLCJkaXNwbGF5Iiw0LCJuZ0lmIl0sWyJjbGFzcyIsInJnYmEtdGV4dCIsMywiZGlzcGxheSIsNCwibmdJZiJdLFsiY2xhc3MiLCJoZXgtdGV4dCIsMywiaGV4LWFscGhhIiwiZGlzcGxheSIsNCwibmdJZiJdLFsiY2xhc3MiLCJ2YWx1ZS10ZXh0Iiw0LCJuZ0lmIl0sWyJjbGFzcyIsInR5cGUtcG9saWN5Iiw0LCJuZ0lmIl0sWyJjbGFzcyIsInByZXNldC1hcmVhIiw0LCJuZ0lmIl0sWyJjbGFzcyIsImJ1dHRvbi1hcmVhIiw0LCJuZ0lmIl0sWzEsInNhdHVyYXRpb24tbGlnaHRuZXNzIiwzLCJzbGlkZXIiLCJyZ1giLCJyZ1kiLCJuZXdWYWx1ZSIsImRyYWdTdGFydCIsImRyYWdFbmQiXSxbInR5cGUiLCJidXR0b24iLDMsImRpc2FibGVkIiwiY2xpY2siXSxbMiwiaGVpZ2h0IiwiMTZweCJdLFsxLCJjbXlrLXRleHQiXSxbMSwiYm94Il0sWyJ0eXBlIiwibnVtYmVyIiwicGF0dGVybiIsIlswLTldKiIsIm1pbiIsIjAiLCJtYXgiLCIxMDAiLDMsInRleHQiLCJyZyIsInZhbHVlIiwia2V5dXAuZW50ZXIiLCJuZXdWYWx1ZSJdLFsidHlwZSIsIm51bWJlciIsInBhdHRlcm4iLCJbMC05XSsoW1xcLixdWzAtOV17MSwyfSk/IiwibWluIiwiMCIsIm1heCIsIjEiLCJzdGVwIiwiMC4xIiwzLCJ0ZXh0IiwicmciLCJ2YWx1ZSIsImtleXVwLmVudGVyIiwibmV3VmFsdWUiLDQsIm5nSWYiXSxbNCwibmdJZiJdLFsidHlwZSIsIm51bWJlciIsInBhdHRlcm4iLCJbMC05XSsoW1xcLixdWzAtOV17MSwyfSk/IiwibWluIiwiMCIsIm1heCIsIjEiLCJzdGVwIiwiMC4xIiwzLCJ0ZXh0IiwicmciLCJ2YWx1ZSIsImtleXVwLmVudGVyIiwibmV3VmFsdWUiXSxbMSwiaHNsYS10ZXh0Il0sWyJ0eXBlIiwibnVtYmVyIiwicGF0dGVybiIsIlswLTldKiIsIm1pbiIsIjAiLCJtYXgiLCIzNjAiLDMsInRleHQiLCJyZyIsInZhbHVlIiwia2V5dXAuZW50ZXIiLCJuZXdWYWx1ZSJdLFsxLCJyZ2JhLXRleHQiXSxbInR5cGUiLCJudW1iZXIiLCJwYXR0ZXJuIiwiWzAtOV0qIiwibWluIiwiMCIsIm1heCIsIjI1NSIsMywidGV4dCIsInJnIiwidmFsdWUiLCJrZXl1cC5lbnRlciIsIm5ld1ZhbHVlIl0sWzEsImhleC10ZXh0Il0sWzMsInRleHQiLCJ2YWx1ZSIsImJsdXIiLCJrZXl1cC5lbnRlciIsIm5ld1ZhbHVlIl0sWzEsInZhbHVlLXRleHQiXSxbMSwidHlwZS1wb2xpY3kiXSxbMSwidHlwZS1wb2xpY3ktYXJyb3ciLDMsImNsaWNrIl0sWzEsInByZXNldC1hcmVhIl0sWzEsInByZXNldC1sYWJlbCJdLFszLCJjbGFzcyIsNCwibmdJZiJdLFsiY2xhc3MiLCJwcmVzZXQtY29sb3IiLDMsImJhY2tncm91bmRDb2xvciIsImNsaWNrIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbMSwicHJlc2V0LWNvbG9yIiwzLCJjbGljayJdLFszLCJjbGFzcyIsImNsaWNrIiw0LCJuZ0lmIl0sWzMsImNsaWNrIl0sWzEsImJ1dHRvbi1hcmVhIl0sWyJ0eXBlIiwiYnV0dG9uIiwzLCJjbGFzcyIsImNsaWNrIiw0LCJuZ0lmIl0sWyJ0eXBlIiwiYnV0dG9uIiwzLCJjbGljayJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiZGl2IiwwLDEpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCl9KSksUXAoMixUMSwxLDUsImRpdiIsMiksUXAoMyxOMSwyLDgsImRpdiIsMyksUm0oNCwiZGl2Iiw0KSxSbSg1LCJkaXYiLDUpLFRtKDYsImRpdiIsNiksVG0oNywiZGl2Iiw3KSxRcCg4LHoxLDIsNSwiYnV0dG9uIiw4KSxBbSgpLFJtKDksImRpdiIsOSksUXAoMTAsSTEsMSwwLCJkaXYiLDEwKSxSbSgxMSwiZGl2IiwxMSwxMiksVm0oIm5ld1ZhbHVlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vbkh1ZUNoYW5nZShlKX0pKSgiZHJhZ1N0YXJ0IiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uRHJhZ1N0YXJ0KCJodWUiKX0pKSgiZHJhZ0VuZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkRyYWdFbmQoImh1ZSIpfSkpLFRtKDEzLCJkaXYiLDEzKSxBbSgpLFJtKDE0LCJkaXYiLDE0LDE1KSxWbSgibmV3VmFsdWUiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uVmFsdWVDaGFuZ2UoZSl9KSkoImRyYWdTdGFydCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkRyYWdTdGFydCgidmFsdWUiKX0pKSgiZHJhZ0VuZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkRyYWdFbmQoInZhbHVlIil9KSksVG0oMTYsImRpdiIsMTMpLEFtKCksUm0oMTcsImRpdiIsMTYsMTcpLFZtKCJuZXdWYWx1ZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25BbHBoYUNoYW5nZShlKX0pKSgiZHJhZ1N0YXJ0IiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uRHJhZ1N0YXJ0KCJhbHBoYSIpfSkpKCJkcmFnRW5kIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uRHJhZ0VuZCgiYWxwaGEiKX0pKSxUbSgxOSwiZGl2IiwxMyksQW0oKSxBbSgpLEFtKCksUXAoMjAsTDEsMTcsMTIsImRpdiIsMTgpLFFwKDIxLGoxLDE0LDEwLCJkaXYiLDE5KSxRcCgyMixXMSwxNCwxMCwiZGl2IiwyMCksUXAoMjMsWjEsOCw3LCJkaXYiLDIxKSxRcCgyNCxLMSw5LDMsImRpdiIsMjIpLFFwKDI1LEoxLDMsMCwiZGl2IiwyMyksUXAoMjYsbjMsNiwzLCJkaXYiLDI0KSxRcCgyNyxhMywzLDIsImRpdiIsMjUpLEFtKCkpLDImZSYmKGR1KCJkaXNwbGF5IixuLnNob3c/ImJsb2NrIjoibm9uZSIpKCJ2aXNpYmlsaXR5IixuLmhpZGRlbj8iaGlkZGVuIjoidmlzaWJsZSIpKCJ0b3AiLG4udG9wLCJweCIpKCJsZWZ0IixuLmxlZnQsInB4IikoInBvc2l0aW9uIixuLnBvc2l0aW9uKSgiaGVpZ2h0IixuLmNwSGVpZ2h0LCJweCIpKCJ3aWR0aCIsbi5jcFdpZHRoLCJweCIpLHB1KCJvcGVuIixuLnNob3cpLHJjKDIpLERtKCJuZ0lmIiwicG9wdXAiPT1uLmNwRGlhbG9nRGlzcGxheSkscmMoMSksRG0oIm5nSWYiLDE9PT0obi5jcENvbG9yTW9kZXx8MSkpLHJjKDQpLGR1KCJiYWNrZ3JvdW5kLWNvbG9yIixuLnNlbGVjdGVkQ29sb3IpLHJjKDEpLERtKCJuZ0lmIixuLmNwQWRkQ29sb3JCdXR0b24pLHJjKDIpLERtKCJuZ0lmIiwiZGlzYWJsZWQiPT09bi5jcEFscGhhQ2hhbm5lbCkscmMoMSksZHUoImRpc3BsYXkiLDE9PT0obi5jcENvbG9yTW9kZXx8MSk/ImJsb2NrIjoibm9uZSIpLERtKCJyZ1giLDEpLHJjKDIpLGR1KCJsZWZ0IixudWxsPT1uLnNsaWRlcj9udWxsOm4uc2xpZGVyLmgsInB4IikscmMoMSksZHUoImRpc3BsYXkiLDI9PT0obi5jcENvbG9yTW9kZXx8MSk/ImJsb2NrIjoibm9uZSIpLERtKCJyZ1giLDEpLHJjKDIpLGR1KCJyaWdodCIsbnVsbD09bi5zbGlkZXI/bnVsbDpuLnNsaWRlci52LCJweCIpLHJjKDEpLGR1KCJkaXNwbGF5IiwiZGlzYWJsZWQiPT09bi5jcEFscGhhQ2hhbm5lbD8ibm9uZSI6ImJsb2NrIikoImJhY2tncm91bmQtY29sb3IiLG4uYWxwaGFTbGlkZXJDb2xvciksRG0oInJnWCIsMSkscmMoMiksZHUoImxlZnQiLG51bGw9PW4uc2xpZGVyP251bGw6bi5zbGlkZXIuYSwicHgiKSxyYygxKSxEbSgibmdJZiIsIW4uY3BEaXNhYmxlSW5wdXQmJjE9PT0obi5jcENvbG9yTW9kZXx8MSkpLHJjKDEpLERtKCJuZ0lmIiwhbi5jcERpc2FibGVJbnB1dCYmMT09PShuLmNwQ29sb3JNb2RlfHwxKSkscmMoMSksRG0oIm5nSWYiLCFuLmNwRGlzYWJsZUlucHV0JiYxPT09KG4uY3BDb2xvck1vZGV8fDEpKSxyYygxKSxEbSgibmdJZiIsIW4uY3BEaXNhYmxlSW5wdXQmJjE9PT0obi5jcENvbG9yTW9kZXx8MSkpLHJjKDEpLERtKCJuZ0lmIiwhbi5jcERpc2FibGVJbnB1dCYmMj09PShuLmNwQ29sb3JNb2RlfHwxKSkscmMoMSksRG0oIm5nSWYiLCFuLmNwRGlzYWJsZUlucHV0JiYxPT09KG4uY3BDb2xvck1vZGV8fDEpKSxyYygxKSxEbSgibmdJZiIsKG51bGw9PW4uY3BQcmVzZXRDb2xvcnM/bnVsbDpuLmNwUHJlc2V0Q29sb3JzLmxlbmd0aCl8fG4uY3BBZGRDb2xvckJ1dHRvbikscmMoMSksRG0oIm5nSWYiLG4uY3BPS0J1dHRvbnx8bi5jcENhbmNlbEJ1dHRvbikpfSxkaXJlY3RpdmVzOltkTSxtMyxwMyxsTV0sc3R5bGVzOlsnLmNvbG9yLXBpY2tlcnstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lO2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICM3Nzc7Y3Vyc29yOmRlZmF1bHQ7aGVpZ2h0OmF1dG87cG9zaXRpb246YWJzb2x1dGU7dXNlci1zZWxlY3Q6bm9uZTt3aWR0aDoyMzBweDt6LWluZGV4OjEwMDB9LmNvbG9yLXBpY2tlciAqe2JveC1zaXppbmc6Ym9yZGVyLWJveDtmb250LXNpemU6MTFweDttYXJnaW46MH0uY29sb3ItcGlja2VyIGlucHV0e2NvbG9yOiMwMDA7Zm9udC1zaXplOjEzcHg7aGVpZ2h0OjI2cHg7bWluLXdpZHRoOjA7dGV4dC1hbGlnbjpjZW50ZXI7d2lkdGg6MH0uY29sb3ItcGlja2VyIGlucHV0Oi1tb3otc3VibWl0LWludmFsaWQsLmNvbG9yLXBpY2tlciBpbnB1dDotbW96LXVpLWludmFsaWQsLmNvbG9yLXBpY2tlciBpbnB1dDppbnZhbGlke2JveC1zaGFkb3c6bm9uZX0uY29sb3ItcGlja2VyIGlucHV0Ojotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLC5jb2xvci1waWNrZXIgaW5wdXQ6Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7bWFyZ2luOjB9LmNvbG9yLXBpY2tlciAuYXJyb3d7Ym9yZGVyLXN0eWxlOnNvbGlkO2hlaWdodDowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjA7ei1pbmRleDo5OTk5OTl9LmNvbG9yLXBpY2tlciAuYXJyb3cuYXJyb3ctdG9we2JvcmRlci1jb2xvcjojNzc3IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O2JvcmRlci13aWR0aDoxMHB4IDVweDtsZWZ0OjhweH0uY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy1ib3R0b217Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICM3Nzc7Ym9yZGVyLXdpZHRoOjEwcHggNXB4O2xlZnQ6OHB4O3RvcDotMjBweH0uY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy1sZWZ0LXRvcCwuY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy10b3AtbGVmdHtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgIzc3Nztib3JkZXItd2lkdGg6NXB4IDEwcHg7Ym90dG9tOjhweDtyaWdodDotMjFweH0uY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy1yaWdodC10b3AsLmNvbG9yLXBpY2tlciAuYXJyb3cuYXJyb3ctdG9wLXJpZ2h0e2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudCAjNzc3IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O2JvcmRlci13aWR0aDo1cHggMTBweDtib3R0b206OHB4O2xlZnQ6LTIwcHh9LmNvbG9yLXBpY2tlciAuYXJyb3cuYXJyb3ctYm90dG9tLWxlZnQsLmNvbG9yLXBpY2tlciAuYXJyb3cuYXJyb3ctbGVmdCwuY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy1sZWZ0LWJvdHRvbXtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgIzc3Nztib3JkZXItd2lkdGg6NXB4IDEwcHg7cmlnaHQ6LTIxcHg7dG9wOjhweH0uY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy1ib3R0b20tcmlnaHQsLmNvbG9yLXBpY2tlciAuYXJyb3cuYXJyb3ctcmlnaHQsLmNvbG9yLXBpY2tlciAuYXJyb3cuYXJyb3ctcmlnaHQtYm90dG9te2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudCAjNzc3IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O2JvcmRlci13aWR0aDo1cHggMTBweDtsZWZ0Oi0yMHB4O3RvcDo4cHh9LmNvbG9yLXBpY2tlciAuY3Vyc29ye2JvcmRlcjoycHggc29saWQgIzIyMjtib3JkZXItcmFkaXVzOjUwJTtjdXJzb3I6ZGVmYXVsdDtoZWlnaHQ6MTZweDtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxNnB4fS5jb2xvci1waWNrZXIgLmJveHtkaXNwbGF5OmZsZXg7cGFkZGluZzo0cHggOHB4fS5jb2xvci1waWNrZXIgLmxlZnR7cGFkZGluZzoxNnB4IDhweDtwb3NpdGlvbjpyZWxhdGl2ZX0uY29sb3ItcGlja2VyIC5yaWdodHtmbGV4OjEgMSBhdXRvO3BhZGRpbmc6MTJweCA4cHh9LmNvbG9yLXBpY2tlciAuYnV0dG9uLWFyZWF7cGFkZGluZzowIDE2cHggMTZweDt0ZXh0LWFsaWduOnJpZ2h0fS5jb2xvci1waWNrZXIgLmJ1dHRvbi1hcmVhIGJ1dHRvbnttYXJnaW4tbGVmdDo4cHh9LmNvbG9yLXBpY2tlciAucHJlc2V0LWFyZWF7cGFkZGluZzo0cHggMTVweH0uY29sb3ItcGlja2VyIC5wcmVzZXQtYXJlYSAucHJlc2V0LWxhYmVse2NvbG9yOiM1NTU7Zm9udC1zaXplOjExcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6NHB4O3RleHQtYWxpZ246bGVmdDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDt3aWR0aDoxMDAlfS5jb2xvci1waWNrZXIgLnByZXNldC1hcmVhIC5wcmVzZXQtY29sb3J7Ym9yZGVyOjFweCBzb2xpZCAjYTlhOWE5O2JvcmRlci1yYWRpdXM6MjUlO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDoxOHB4O21hcmdpbjo0cHggNnB4IDhweDtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxOHB4fS5jb2xvci1waWNrZXIgLnByZXNldC1hcmVhIC5wcmVzZXQtZW1wdHktbWVzc2FnZXtmb250LXN0eWxlOml0YWxpYzttYXJnaW4tYm90dG9tOjhweDttYXJnaW4tdG9wOjRweDttaW4taGVpZ2h0OjE4cHg7dGV4dC1hbGlnbjpjZW50ZXJ9LmNvbG9yLXBpY2tlciAuaGV4LXRleHR7Zm9udC1zaXplOjExcHg7cGFkZGluZzo0cHggOHB4O3dpZHRoOjEwMCV9LmNvbG9yLXBpY2tlciAuaGV4LXRleHQgLmJveHtwYWRkaW5nOjAgMjRweCA4cHggOHB4fS5jb2xvci1waWNrZXIgLmhleC10ZXh0IC5ib3ggZGl2e2NsZWFyOmxlZnQ7Y29sb3I6IzU1NTtmbGV4OjEgMSBhdXRvO2Zsb2F0OmxlZnQ7dGV4dC1hbGlnbjpjZW50ZXJ9LmNvbG9yLXBpY2tlciAuaGV4LXRleHQgLmJveCBpbnB1dHtib3JkZXI6MXB4IHNvbGlkICNhOWE5YTk7ZmxleDoxIDEgYXV0bztwYWRkaW5nOjFweH0uY29sb3ItcGlja2VyIC5oZXgtYWxwaGEgLmJveCBkaXY6Zmlyc3QtY2hpbGQsLmNvbG9yLXBpY2tlciAuaGV4LWFscGhhIC5ib3ggaW5wdXQ6Zmlyc3QtY2hpbGR7ZmxleC1ncm93OjM7bWFyZ2luLXJpZ2h0OjhweH0uY29sb3ItcGlja2VyIC5jbXlrLXRleHQsLmNvbG9yLXBpY2tlciAuaHNsYS10ZXh0LC5jb2xvci1waWNrZXIgLnJnYmEtdGV4dCwuY29sb3ItcGlja2VyIC52YWx1ZS10ZXh0e2ZvbnQtc2l6ZToxMXB4O3BhZGRpbmc6NHB4IDhweDt3aWR0aDoxMDAlfS5jb2xvci1waWNrZXIgLmNteWstdGV4dCAuYm94LC5jb2xvci1waWNrZXIgLmhzbGEtdGV4dCAuYm94LC5jb2xvci1waWNrZXIgLnJnYmEtdGV4dCAuYm94e3BhZGRpbmc6MCAyNHB4IDhweCA4cHh9LmNvbG9yLXBpY2tlciAudmFsdWUtdGV4dCAuYm94e3BhZGRpbmc6MCA4cHggOHB4fS5jb2xvci1waWNrZXIgLmNteWstdGV4dCAuYm94IGRpdiwuY29sb3ItcGlja2VyIC5oc2xhLXRleHQgLmJveCBkaXYsLmNvbG9yLXBpY2tlciAucmdiYS10ZXh0IC5ib3ggZGl2LC5jb2xvci1waWNrZXIgLnZhbHVlLXRleHQgLmJveCBkaXZ7Y29sb3I6IzU1NTtmbGV4OjEgMSBhdXRvO21hcmdpbi1yaWdodDo4cHg7dGV4dC1hbGlnbjpjZW50ZXJ9LmNvbG9yLXBpY2tlciAuY215ay10ZXh0IC5ib3ggZGl2Omxhc3QtY2hpbGQsLmNvbG9yLXBpY2tlciAuaHNsYS10ZXh0IC5ib3ggZGl2Omxhc3QtY2hpbGQsLmNvbG9yLXBpY2tlciAucmdiYS10ZXh0IC5ib3ggZGl2Omxhc3QtY2hpbGQsLmNvbG9yLXBpY2tlciAudmFsdWUtdGV4dCAuYm94IGRpdjpsYXN0LWNoaWxke21hcmdpbi1yaWdodDowfS5jb2xvci1waWNrZXIgLmNteWstdGV4dCAuYm94IGlucHV0LC5jb2xvci1waWNrZXIgLmhzbGEtdGV4dCAuYm94IGlucHV0LC5jb2xvci1waWNrZXIgLnJnYmEtdGV4dCAuYm94IGlucHV0LC5jb2xvci1waWNrZXIgLnZhbHVlLXRleHQgLmJveCBpbnB1dHtib3JkZXI6MXB4IHNvbGlkICNhOWE5YTk7ZmxleDoxO2Zsb2F0OmxlZnQ7bWFyZ2luOjAgOHB4IDAgMDtwYWRkaW5nOjFweH0uY29sb3ItcGlja2VyIC5jbXlrLXRleHQgLmJveCBpbnB1dDpsYXN0LWNoaWxkLC5jb2xvci1waWNrZXIgLmhzbGEtdGV4dCAuYm94IGlucHV0Omxhc3QtY2hpbGQsLmNvbG9yLXBpY2tlciAucmdiYS10ZXh0IC5ib3ggaW5wdXQ6bGFzdC1jaGlsZCwuY29sb3ItcGlja2VyIC52YWx1ZS10ZXh0IC5ib3ggaW5wdXQ6bGFzdC1jaGlsZHttYXJnaW4tcmlnaHQ6MH0uY29sb3ItcGlja2VyIC5odWUtYWxwaGF7YWxpZ24taXRlbXM6Y2VudGVyO21hcmdpbi1ib3R0b206M3B4fS5jb2xvci1waWNrZXIgLmh1ZXtiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFKWUFBQUFRQ0FZQUFBRDA2SVluQUFBQUJtSkxSMFFBL3dEL0FQK2d2YWVUQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUFCM1JKVFVVSDRBSVdEd2tVRldiQ0NBQUFBRnhKUkVGVWFON3Qwa0VLZzBBUUFNRTJ4ODMvbjJxdTVxQ2dEMWlEaENvWWRwbmJRQzliYlkxcVZPL2p2YzZrM2FkOTFzNy83RjEvY3NnUHJ1anVRMTdCRFlTRnNCQVd3Z0poSVN5RUJjSkNXQWdMaElXd0VCWUlpMmY3QXIvMVRDZ0ZIMlg5QUFBQUFFbEZUa1N1UW1DQyIpO2RpcmVjdGlvbjpsdHJ9LmNvbG9yLXBpY2tlciAuaHVlLC5jb2xvci1waWNrZXIgLnZhbHVle2JhY2tncm91bmQtc2l6ZToxMDAlIDEwMCU7Ym9yZGVyOm5vbmU7Y3Vyc29yOnBvaW50ZXI7aGVpZ2h0OjE2cHg7bWFyZ2luLWJvdHRvbToxNnB4O3dpZHRoOjEwMCV9LmNvbG9yLXBpY2tlciAudmFsdWV7YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSllBQUFBUUNBWUFBQUQwNklZbkFBQUNUa2xFUVZSNDJ1M1NZVWNyQUJoQTRVMlNrbVJKTW1XU0prbEtKaVdaWnBLVUpKc2tLVW1hVEZJbUtaT1V6TXlTcEdSbWxpUk5KaWxKU3BLU0pFdG1TcElwbVdtU2RPNzM2LzZEK3g3T1AzZ1VDb1dDdjFjcWxTUWxKWkdjbkV4S1NncXBxYW1rcGFXUm5wNU9Sa1lHbVptWnFGUXFzckt5eU03T0ppY25oOXpjWE5ScU5YbDVlZVRuNTZQUmFDZ29LS0N3c0pDaW9pSzBXaTNGeGNXVWxKUlFXbHBLV1ZrWjVlWGxWRlJVVUZsWmlVNm5vNnFxaXVycWFtcHFhcWl0cmFXdXJnNjlYazk5ZlQwR2d3R2owVWhEUXdPTmpZMDBOVFhSM054TVMwc0xyYTJ0dExXMTBkN2Vqc2xrd213MjA5SFJRV2RuSjExZFhYUjNkOVBUMDBOdmJ5OTlmWDMwOS9jek1EREE0T0FnRm91Rm9hRWhyRllydzhQRGpJeU1NRG82eXRqWUdEYWJqZkh4Y1NZbUpwaWNuR1JxYWdxNzNjNzA5RFF6TXpQTXpzNHlOemZIL1B3OERvY0RwOU9KeStYQzdYYXpzTERBNHVJaVMwdExMQzh2czdLeXd1cnFLbXRyYTNnOEhyeGVMejZmRDcvZnovcjZPaHNiRzJ4dWJySzF0Y1gyOWphQlFJQ2RuUjJDd1NDN3U3dnM3ZTJ4djcvUHdjRUJoNGVISEIwZGNYeDh6TW5KQ2FlbnA1eWRuWEYrZnM3RnhRV1hsNWRjWFYxeGZYM056YzBOdDdlMzNOM2RFUXFGdUwrLzUrSGhnWEE0VENRUzRmSHhrYWVuSjU2Zm4zbDVlZUgxOVpWb05NcmIyeHZ2Nys5OGZId1FpOFdJeCtOOGZuNlNTQ1Q0K3ZyaSsvdWJuNThmZm45LytWY0tnU1d3QkpiQUVsZ0NTMkFKTElFbHNBU1d3QkpZQWt0Z0NTeUJKYkFFbHNBU1dBSkxZQWtzZ1NXd0JKYkFFbGdDUzJBSkxJRWxzUDQvV0g4QW1KNVo2akhTNGg4QUFBQUFTVVZPUks1Q1lJST0iKTtkaXJlY3Rpb246cnRsfS5jb2xvci1waWNrZXIgLmFscGhhe2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUpZQUFBQVFDQVlBQUFEMDZJWW5BQUFBQm1KTFIwUUEvd0QvQVArZ3ZhZVRBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBQUIzUkpUVVVINEFJV0R3WVFsWk1hM2dBQUFXVkpSRUZVYU43dG1FR082akFRUkNzT0FySGdCcHlBSllHamNHb2N4QW00QTJJSHBtb1dFMGVCSCtlem1GbE52VTA2c2hKM1c2VkVlbFdNVVFBSUlGOWY2cVpwaW1zQTFMWXRTMnVGNTEvdTI3WVZBRlpWUlVrRW9HSGRQVi9zSWNiSUVJSWtVZEkvOVhhN25leXY2MStTV0ZVVkFWQ1NjdDAwVFduMmZ2NnUzK0VjZmQzdFh6eS8wK25FVXUrU1Bqby9rcXpybWlRcFNjTjZ2OThYZXdmQTgvbE1raUxKMld4R1NVb3BjVDZmTTZVME5YOS9mcmZiamV2MVd0ZnJsWmZMaFlmRFFRSEcvQUlPbG5Hd2pJTmxIQ3hqSEN6allKbS9USldkQ3dxdUpYc2VGRnpHd0ROTmVpS01PSlRPOHhRZERRYWVCMjkrSzllZmVMYUJvOUo3dmR2dEpqMVJqRkZqZml2N3F2OTV0angvN2xlU1FnaDkzZTFmZk1lSXA2TytZUWpoby9ONzkxdDFYVk9TU0k3Ti8vSys0L0dveFdMQngrUEI1L09wNVhMSisvM09sSkpXcXhVM204M292djVpR2Y4S2pZTmxIQ3hqSEN6allCa0h5NWdmNWd1c3ZRVTdVMzdqVEFBQUFBQkpSVTVFcmtKZ2dnPT0iKTtiYWNrZ3JvdW5kLXNpemU6MTAwJSAxMDAlO2JvcmRlcjpub25lO2N1cnNvcjpwb2ludGVyO2RpcmVjdGlvbjpsdHI7aGVpZ2h0OjE2cHg7d2lkdGg6MTAwJX0uY29sb3ItcGlja2VyIC50eXBlLXBvbGljeXtiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCSUFBQUFnQ0FZQUFBQWZmQ2p4QUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUFDZXdBQUFuc0IwMUNPM0FBQUFCbDBSVmgwVTI5bWRIZGhjbVVBZDNkM0xtbHVhM05qWVhCbExtOXlaNXZ1UEJvQUFBSUFTVVJCVkVpSjdaWTlheFJSRklhZnN4TVN0ckxRSnBBZ3BCRmhpK0M5dzFZU28wMEk2UlovZzl2WnBCZi9RT3I0R3lSZ2tTS05TckFhZHNacVFHd0NrdUFXeVJaSnN5U3d2aFo3Ti92aHpyZ2JMSDNMZDg1OTdqbHp6NTB6Sm9reXhYSDhEcURWYXIwcWk2djhCYkl0cVNHcEVjZnhkbG1zRldYa3ZYOEFmQVZXZzNVS1BFblQ5R0t1ak16c0FGZ1pzVmFDTjFWVFFkNzdYVW5yZ0Uxa3YrNjkzNTI2OFdScHpybkhadllSV0M3WXZDM3BSWlpsM3dvenF0VnFpeUg5SWdqQXNwa2QxR3ExeFVKUXRWcmRCOVpLSUFPdGhkZy9RYzY1TFVrN3dOSU1vQ1ZKTzg2NXJZRmhrcWpYNi9kN3ZWNEdQSndCTXFvZlVSUzVKRWs2RllCZXIvZWVZYi9NbzlXd0ZuUE92UWJlQXZmdUFBSzRCTjRzQUp0QUcvZ0pJRWxtTnVpSnliYTNFR05tWmlQZVp1RVZtVmVsbC9ZLzZOK0N6RG4zQVhoRU9PbzdIdi8zQmVBejhJelFrTVBuSmJ1UHgxd0MreVlKNy8wbllJUDVTLzBGSEtkcCtyd0NFRVhSUy9yZjVIbDFHdGIyTTBpU3BDT3BDWnpQQVRtWDFFeVNwSE1MQXNpeTdNak1Eb0hyR1NEWFpuYVlaZG5Sd0JoN0o5MXV0d21jekFBNkNiRzNHZ1BsZVg0anFVSC9hMUNrdHFSR251YzNoU0NBTUIzMmdLc3BrQ3RnYjNLQ1FNbWtqZVA0V05KVGhyTk5admFsMVdwdFRJc3Y3SnRRNHRtSWRSYThxU29FcFdsNllXWk5vQU4wekt4Wk5QZWhwTFNCWnYydCtRMENKOWxMbkFSUUxBQUFBQUJKUlU1RXJrSmdnZz09Iik7YmFja2dyb3VuZC1wb3NpdGlvbjo1MCU7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtc2l6ZTo4cHggMTZweDtoZWlnaHQ6MjRweDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDoxMnB4O3RvcDoyMThweDt3aWR0aDoxNnB4fS5jb2xvci1waWNrZXIgLnR5cGUtcG9saWN5IC50eXBlLXBvbGljeS1hcnJvd3tkaXNwbGF5OmJsb2NrO2hlaWdodDo1MCU7d2lkdGg6MTAwJX0uY29sb3ItcGlja2VyIC5zZWxlY3RlZC1jb2xvcntib3JkZXI6MXB4IHNvbGlkICNhOWE5YTk7Ym9yZGVyLXJhZGl1czo1MCU7aGVpZ2h0OjQwcHg7bGVmdDo4cHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjE2cHg7d2lkdGg6NDBweH0uY29sb3ItcGlja2VyIC5zZWxlY3RlZC1jb2xvci1iYWNrZ3JvdW5ke2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUNnQUFBQW9DQVlBQUFDTS9yaHRBQUFBaDBsRVFWUllSKzJXMFFsQU1RZ0Q2MHpkZndPZHFhOFRtSS93UU1yNUswSTViWkxJekxPYTJudDM3VlZWYmQrZER4NW9iZ0NDM0tCTHdKMmZmNFBuVmlka2YrdWNJaHc4MEhRYUNMbzNETUgzQ1JLM2lGc21BV1ZsNmhQTkR3dDhFdk5FNXErWXVFWGNNZ2tvblZNNlNkeUNvRXZBblo4djFIang4MTdNaWxteFNVQjVyZExKRHljWmdVQVpVY2gvQUFBQUFFbEZUa1N1UW1DQyIpO2JvcmRlci1yYWRpdXM6NTAlO2hlaWdodDo0MHB4O3dpZHRoOjQwcHh9LmNvbG9yLXBpY2tlciAuc2F0dXJhdGlvbi1saWdodG5lc3N7YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBT1lBQUFDQ0NBWUFBQUJTRDdUM0FBQUFCbUpMUjBRQS93RC9BUCtndmFlVEFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFBQjNSSlRVVUg0QUlXRHdrc1BXUjZsZ0FBSUFCSlJFRlVlTnJ0blZ1VDQ3Z1JyQUhOK1AvL09yLzYxWTV3T05aN21aMXUzWEFlTE1qSlpHWlZnZEtzZmM1eFIzUzBSSUlVVytDSHpDcGMyTWNZbzdYR3YzZXg3VWlaZDU3cmp5enp2K3YrMzNYL1IvKzNyL2Y3dlIzODZZK1R2S05jZi93ZGhUTFBjdjlxVTJ3WmQ3NHV0aDB0MTgyMWprSVpMUGNzSS82bldhNFh2dXRxdVUwWjg1bW54ODBTL1p6Z3BuTG5PdEhOdDcvb2Z4MVRLWGNTTnpOLzdxYk1RM2p1N3JOUW1NWVlkLzRzMmo5YWErUCtnR2FNY1pyYjFNL3RkcnZmNy9kMnY5OVA5L3Q5M08vM2NidmR4dTEyRzlmcmRWd3VsM0UrbjhjLy8vblArMisvL1hiNjZhZWZ4bC8vK3RmeDV6Ly8yWUs1QWwycmd2ZjRVc2JwZEdyQjUyYkF2QXJYcHV6am1pcUFWU0d6NWVEbUdZWHpoYkFabUNybm16ZGRwVVUrOFkxZEFPWWVYQ3REVXdWd1Y3WUNHSDZ1QW15TWNaOWw1dmtVYUJQR01VWjcvSjV3Lzc5Mi9mdnY5WHE5MzI2M2RyL2ZUeFBFQ2VNRThuSzVqTS9Qei9IVFR6L2R2MzM3ZHZybGwxL0dQLzd4ai9HM3YvMXQvT1V2ZndrVnN3b25namRPcDlQekgzVTNEM3ptV0duWlZYbjRqQ3FzN3dDMkJLUDQvOHRBemtac29XeDZYcnFlSFp5bXZwNEFCQ0JKaFRRd0tmRFQ4Z3pyWkNJcWk1QWhpQUNqQmZFQjJyUDgvWDYzTU03ZjYvVjZ2OS92N1hhN2JZQzgzVzdqY3Jsc1ZISXE1ZmZ2MzArLy9mYmIrT1dYWDhaUFAvMDAvdjczdjQrZmYvNzVKU3ZiZXUrYkwyV01NYUZiQWxwQk5NODVRWCtjdDZxb1Nxa1BBd3VRbEJWS3FHTkZTVU9BQTNCbXU3Z0M1aE5PZDE1blN3dkFPVVc3QzRnaVVDVjhTZ241TDloTkZJcVRzcDBHeEkweXNpb3lqQWprWS90R0pWRXB6K2Z6K09XWFgrN2Z2MzgvL2Y3NzcrUGJ0Mi9qMTE5L0hULy8vUFA0OWRkZng4ZkhSd3JtVGpWNzc5RVh1MnB4Mnhoand0ZEpaUWNBV1FJUExQSVNzTUphU3dpRDhneklLcndTeUFURTVqNW5BYlI1YzFkQlV3QmxzRVdXMGg2THFpWXNxRlBBUXhDeVJaM3dPU0FSeG1sWE1YNWs2NHBRZnZ2MjdmNzUrZGsrUGo1T0h4OGY0L3YzNytQYnQyL2p0OTkrRzkrK2ZSc2ZIeC9qY3JtVUZMTzMxZ1lEV2JseFJJcy9UcWZUN291c3hKc0F4WEEyR2M3VEE5WGRnZmRvSGJGc2o3NlgyKzFXQXJnSTFhZ2VHd0EzcXVwcW9Ic21jYkk2RnU5M3F1Z2dGYTlkN0xlRHRnS2ZBRkhCSitORUJ5SWtjSjVLZXJ2ZFRtaGhHY2dKSlNaNXZuLy9maitmeisxOFBwOCtQei9INStmbm1HRCsvdnZ2NC92MzcrUGo0Mk44Zm42TzIrMVdzN0pqalA2d3JhTUk1RTRSWjh4MnZWNVRTd2txdW90VjcvZDdUejZIRldzRC9xTmNkdzBDUTNxLzMyMWM2ODZUd0RWSWRidXk3M3pObGRoU0hiOEkya2xaem5tK0luQlM0VTZuMDMwMmFCRnNMaEhEQUtKVkpWZ2xmSTlqaHZ1NTNXNTNzTEFOWU54QWlEQTZNQ2VVSHg4ZjkrdjEyaTZYUzd0Y0xxY1pXNTdQNXllWTgvZno4M09jeitmbnNTbVlVeWtuV0VHODVXQnN0OXN0elNMeU1kZnI5UWkwOGlZMTVVWjBMbERHTGhSM281eksyajdPUFVURDBFK25VM3RrN1hiLzE2TkZiaGxvQU11WTF6akxVT08zQktlSURlK1o4czMvSjRnRm80VE01alBtdVJnMjhmb1VLS1ZTd28xNlRnQTVucHl3Y1dMSGdZbC9QejgvNzMvNjA1L2FiNy85MW02M1c3dGNMaWUwc1pqNG1hbzVnVHlmejg4RTBmMStqOEVjWXp3VFBFRzJjcWp5ZkhORjBNOGZ1cUVpYU9WblJ6WlpRTmg1ZndReUhnL0hER2ZKbzg5UTF6Yi9xdXU1WEM2NzczSTJYS2ZUcWQvdjkrZDN3dXFXdmEvWVRkVWRFVjNmaEl2L1ZpeXBzNllFM3gzcjQzSzViSlFTNjZ6YXhWR0ZzdmQrLy9qNGFGKy9mbTNmdjM5dnQ5dXRmZjM2dGYzKysrL3RkcnVkdm4zN1p1TkxCYWFDTWdVekMrclpSaUZvd3hVdUpJOFlNcWNDcDlPcHE1dmFnYVlVNmxHSkExWFFxZWpjaHc2Q2owR3c1bllCckd3MDFBMk8yMDZuMDRCR291Tk55VGZwL0Z3RWxoVWV5Nm5YcklLdzdRUVdkZHh1TjJsZEw1Zkw4MzlnU1BGOGFodS9KdkJPNDhDUFN1cU1mOFZwOS9QNTNMNTgrZEx1OTNzN244L3RmcjgvMzkvdjkvYjUrVGtoUEozUDU2bVE0MzYvaisvZnYrL2lTZ2J6ZXIwK0FaeC81Kzg4YnY2T01kYTZTNXo2a2QyMWZZQzlkeHY3Y0lKSjJkOUFPUzMwZlBNenlIaVRNOEI0REY2WFVsWUhwNEtRVzNXKzF0NzdNTkIxdkdIeFdxN1hhN3ZmNzgreTUvTjVBK0gxZXQyOXh1UDVkYll0eWFSdTRBa3NiUHE2OTM2ZmpSelhSeEJiUHIvYitiMTgrZktsalRIYUJCQmZuOC9uMC8xK0gxKytmQm5uOHptMHNCOGZINXU0Y3I1R3VCaE1WazBFRW45UnNjdGdWaE0raXhsSnRNQTIzUjhCNnl5c0FzdEJPZ0ZYSUtLQ01JZ1RvTXFORXUyZllNSDd6dGM3MzJkUUtrQ2oxeXRBWnRZMEt4OHBJcjhHR0orQVQzVisySGlyaGwrK2ZCbVh5Mld6NzN3K2IxN1A4cCtmbjgvdFV3R1ZsZVZrVHlVYjY4RGtmYXlXWTR6eE5SaWhVNEVwTEpQWlZySyt1N0o0L21nZktxZUxXOVgyUkVXbEl0TDFkaXluYkREYjMralhnWWpRcW4wcnJ4V2MrTmtJTFA3Rjd4SWJNdng3dlY1M3g0MHhubGJXSkYxMlpTYWcvTjBwVzZ0K1p6bU9NekhqYWpLd0Rmb25kNzh6WVRkZnExOHVwOTd6cjJxOHYzSWlvQnByUnRCbDBFWjlvZzVXQlJHT2RPSGpJalhGN1VvdEZiZ09Xblh6SUp5ell2akc1SVlnc21NT3hIa3o4T3NNU3JWTldlcTVUOERhT2NiRXYxT2Q1cmJzOWFPN1l2TWV0NjNFa0YrK2ZNRXhxK01SbDQvTDViTFpOLytleitmblo2S2F6dU1xWFNRVk81c3BKWGZsSEFJemVzL3hKc2Vja1JKaURNb2c5ZDZWZlJycVhNcjZLcFZWMjdqUndKYWNHb3ZPQU0xek1kUU1ud0sxQXViSzYza2RDQ2h2STFDN2cwejluZi9EK1h6ZTJWajhIN0d4NFA5ZHVRbHNZQ3JxeU44WHFHM0htLzEwT2ozancvbitjcmxzdHVNK2pQbW14VDJkVHVQejgzUHp0MnBuMVhzRUhYL2JuUGFWcVZtaDB4d090MG82WExMQUhlUFVVMjAzd0hmY3JzcEN3bVYzVHJ5QjVzME1zZWVnOTd4L0J3ekNqQmxiQitwUkFQbGEwQlZRdVQ2VjZRSGRCbGozZDBLRzE0N2IrRHF4UWVVeW1ETzQzVzRkUWFyK1RJandtQWQwejgvaDY1dmYwL3lMdjNQYjVYTHBydS95ZERvOXM3RVQwSStQajZkS0s5VlVFSWVLV1FXUEFPcko4TEtkNHZFK3Q5MVkzZTdVRmxXYXRnMlZ3Sm5iK0hQbXR2bS9zZks1OS9PYVdGM3gvZVAxVVBIdkE1RERZRHBZWGZiMGRydjFWMkRrQmt4dHcvdEVXVlZsWFdkQzlwRllzNS9qZmg5ZFMvMTZ2VzdzNmxURytUZnFzeFNKSHhrWFhxL1hkcjFldTRMc2ZENlAzdnNUM043N0RrTCt6UG01alNkS0w0elIzQXhRZDZySGtMa1lsU293c3JxN3puenU2d1N3ZHNNSk9YbUE1ZkJjanh0Z01HQllIbHI1em9raHRzTUNUZ1hMUU9XNFhDNmRFeUVNcHJMOG1BUXpYUmdkdWl4Mnlaem9yeGtZc0RuM2hCMVZlTUxHc1hzVnRnbDJwVzhTM3N2azB2dzdSNGhOYUh2djRjQUNsNUhGendJSDBLYzZ6dTRYakRQUi9qcEFWeFd6TzFYazJERGIzdlRjeGVHVTFpV1pIa21JRFd6aVdLdmlyQ0o0RHJhdnM2SUovR0c2Y1RxV2RYRHkrZkFyUURWVmtMcWtWakFvWklJVGRtbUlxWHdxYTk1TjMrTUdZb1pRZFJWTk81M1kxeFJraE8xNnZZN2V1NTA3Q2E5bEpuYkdweE9lbVFoU3cvQVFzbW1wNXpVOUJpVThHNnd2WDc2TTYvVTZQajQrZG8wQno0Q3BnaWtuVFVlRHF3bEtCbWczdTRPVmpyWjFBK3JBY2dhZWpXcTZlSkN2Q1lGRE9OU3dPZ0hYNEVRUnc4bHhiekRPZEVLNmdaM0hrMWIrOGcybzFKRnRLWHl2L2ZFZFRYdVdqV1hkQVppQnA2QURlRHJDRmlpbTdCNlpGbmVlSTdHdm0vUE1rVURYNjdXN3hJOGIwRDcvdjhkQTlxZk41b2FDZjc0V1pqSDBtZjFjbWZZMVkwSlVGbVZyVFd1OHV6a05jTHRFajd1NUZYQlRrZkM2R09BNXE4WU14TzhLVnZGNnNBVkdkY3JVYnNLT0RjUUtrTE1PTWRtbHh1bTY0MllyUG0yNkFsaFpXMVlCMVIrcnJHc3dFOFRhWUFXZVVNeGRmK1dqd1N2WjJFZjN5dE95Zm41K1BwVlBBYXFPbjQzTXROQnF2bWpqeGJqTTRsWmpaWTRncU5NSTVrdGFXL3NZS053Uys5bEZRekdpaG1NQ0tQYTcrWjBWNkViMEdSbW9idHBYOEpsald1NUZNTE41amE2aEc5a3dRZ1pxZjUrMU5INVV4emtGUmVDZFdoSjhYZGxHVWt4TzdIUmxZUm00bVZPNDNXN3RlcjEyVFBKRXcvcm1FTjNMNVNLSElXWmc5bXorcFVvS09ZcTViSlRKZFgyZ21lMVVjeE1aUUZhRVFJbEhjdDMyTStZMUJ6R2tHdXpmaXlBTjl6K3VncGxaMXN5bUNyRENZWWtHeERUcEk5UnpCeTBySHllRFVDMW5XYWVVYUQ5bjR4a055WU1CRFp0elozQisrZkpsWTIxWEZET2NBUkpsYWJPeWlTM3VDcExJOWpyWmpDRGthVnZjQ0Nqd29nbktTaFdkelhaV2xaTXZWVGdEOExwcWxDTHJxZ2JjQitxWXdyZ0tZcFQwY2NDcWJLeUNWYWxrRWFibi9GeW5vZ0NyUEtmcWY1MXhKN3NHQjJaWGNabXhvU096dGp4MzAwRFppN2EwLzJBSVIwVWxCYWc5U3VEdzZLY0F6bGFCN3ZIWnZXcGpLOTBkeXJxNmJLeURVWlFiUjBCMDViaUxRa0hJY1NVbWdJSytTd3VxZ0hDbm9pbzJSUVUxeWorQm5CeTlwcGhWS0xHeUM3WnpGSzFweFdLK0U4SWhWQ1dMTi91THRuVVU0YXlvWUxvYUFOejhGZHRhU3ZZNHBWMEJFVzJsczYxY3pxbGxCS3BUeUtnTUFocloxY2RjMVJST3RQbXZXTmtkY0taN1pLeGFXamlQTEpNcHA3T1pLeEErcnFHL29KTGp4ZjBwbkpscUxvRFpvM2d5VTBtS0d5czJ0YUtlY2ovZDFDK3JKU3BsQnFsVHlBcWdSK0Q4S2pLbG1STDJndFVjQWRDdHNMK2lqQ05UMW9xcXFrSDJPSEViRzVzREZuVWc1QWEreUxvdTJWVTFwdGoxUzJaUXF2MU9SWk45SVd6UmZnYVJCeEtvQkU4VVd5cWxKRnRySWMwQXhOalNqZWQ5OUNUWS9YRGZTekN6NU0wSVpvVkVzV25QRk5Uc2w4b29WQzFUemJHZ3FGWk5EU2dWd0tLKzFzR0RNS3F4WkNXR1ZNRHlzaUVyMWpWU1FKVVl3ajVpSE9sVGhkSHQ0NFNRZzlDTitubDhEOTBOTUlnQWRncjQ2SnFSaVI5STh2UmRGdmJyMTdtL3l4VU1Lak5MTWlWVUFEd3UyQ1dHaGhpK0Y1NVRXTTlNOWNvZ3ptczFkbk00dU9GL0xBRVlXZGNxbk03eUZteXEzSWZ3bU9ST2Q3WTFpRld0T2pvWThUbzQxbVRWNUl5c2dGRnVSenNiV0ZHYk5JSUpDRHYxZE9vNGxaRzdqV0J3UkZ0VlRLdVd5ZUNCeUpLT2FuOG9aM2VwOVhkZE5sMHREdWF5d0x6OWNYUFllREFBMFNwa0JPOXNiVmNUT1ZXbGRQdjR1eXpFa3p4SHRqdm9uSG9Ta0ZFV05vbzFkOERoY1FwdXRkMnBwTm9uNEJ6b0FpSjFoQkZRZzBkVnRkYkdISERRV3VzaG1ORVF1a0xNMlFPMUcyWThiZ1RYcUZoY0JKajdFalBnY1B0czhVUzhxUHBQQi9kWHpuT2g1WjQzOHR6SDVlYzZRZ3JPS3JSUmZLbXlzQm1VREIrUGhZYWJNbFZQRVIrR0NTSVRUenI3YW0ydEFySDNiZ2NFelBKbStjcjVqSjRObkhORkRWckZYY0k1TGU5azVKbncrYmVkYlYrRmZSelpJSGFPT2FPc0xZMC83VUdzNThEanJHd0tNSU1GSUd6T0VXMS9qR3NkQXRDTjZoRUFJNGhCZTlZWGVSUk9CU1ZQQVZQQXF2SU01Yng1aFZLV0FNUDZ6QlJ5M2llc2NyaWRWZEZCaW5CeFhEbkcyR1JZMlhiQ3ZwMWxodkd0TzlCeHU1aDkwOFhRdTQybG5TQXJNRmRpek1pbTh1d1JDeFBHbm5PUzhsd3BuYk9pRHFUQWpzclJOL1Bjb0FTY0NiYUFDcVZNNDB5bG5qalRCcytid1dsQUcyMy9VS2Jka2l3S1dJUVBHeldhY3pwb1NseFBFajgyMmNOV2twUzdGeXpzRHJxcGZncEczamFodzJ2Z2JhU1FBeHVMV1pZdDdKenlOZThKb1pwTkFjdkRGT2R3MHdxWVQ5QUsxclp6L0RkYlNsTFBwMHJ5SXhnUUpsSzlBWmxFcTdJT1hwb2hnOVBJaHJDbmc4OEpzT3hpVjRaV0FZZmc0c2lreC84a3kyWjlsODYydXF3cmZzY0lIOCt1Z1RtVkd5aWRkZVZZVWdFTW40R1p6ZzE0RXdJc2g5c3gyY0tLaVdYUmV1T0U1Z3pHT1FnZGxSS1ZWZGxldnFiMjc5WHEwUW5zdHMyVkRhQk8wY29lenNydVd0SEFwdTZzS0c0SUJoTjBhR1Uya0xyTUtHUlROM0htYkNEd0tWMTR6dmtNRURHNFFmWlZzcFZsYU5VMm1oYzVURVozTjFoL3pxVGhldUxwVzA1WldUR1ZqYjNkYm5ObXhLWkJuTjhKcWlkYVZMS0FPeUFSTkxTK01CNTRaMitWYXFvTUxLcm9WQmxuZ2VmblRQQWNvSE5XQ1N2bGZBOENJMEhFbUJOQm5CbFh5TXJ6VTdBN1dWbTk0UFBxUTJnbXFLeCtXREdzbnZpbG1jU09CSnFPSzFuWXlBSXp1QXllc3EzVWRTSzNLZldjWUtEOTVIbWZZT1UzcXNlcjJDdFlFVUErRnBmcWROdmdQQlpVQmhEckdPTlJWbFFzaDhyTGNhVUN5a0hHME9PVXdUbExCcnNoNXNvRU1HZXppMUU0SFJWdDFpY3A1d1pFRlhkaWJDa0c4WTh2WDc1c2JPNEUwaW9tOXoraGpTaU9meTNEaHBYSXRwVmhFK1VHUWR2b1dqdENobXJHSGY0WUF6S2dCTm5HdHVKeEZDZUdkaFVBZlFMTEs4a0JZQVA2Z3ZGSlphak1HM1hreWN5OEt1QzBxNEV5eW13dHdkeGR2Mk0wbUlCdEswTEtuZjY0MGowMEF1cTRnVWtkV0dsaHMyMnFKYzZkWkNzTDE5b3hubFRKRzRTWVZSSUdwRDhUUEZCdU02T0VsYlMxcGxkaWQ0bUdBeU42Wkl1cGJDNWJYSk45ZmRwYlRoU3hMVWFJOElHMVhJWUJ4VzNUanM2S1Fvc0tjeGZ4Y1FtZG53UkdNMTBHbkZjQ3kyWFl1bkxNeUFrZGdrNG1lUGljenNMeWd0aGNCdXQ2Z29PcVM3WVZGWEFETGphb3NCNnM2b2ZjWldBWlNJUllxU1VraXpZd3R0WWFiM3ZVT1E5dzJIUnhJSWc4V3dSVmVFNjh4aTRVdEwzelJwaHhwbHp3dVpyY3FZQ3ExSTNqUEk1ZG5KSXlnRW9oTWJQcVZKU3pyd3p4QkpUczV6TitSZVVTZ3hpa1BRVkYzSlZCZU5ReGJIRU5yRU1OdkVkRlpWVjlsSDkrT1JHRXNOWlFweVROYzRDM0FHN1hGNG5nenErRHJPMnpidWFhT1hnZGFGY2RrRW90b1NGQlZYMnFKMEM4T1daZUc0S0dscGdoQTBYZlRPUENxVjJxcXdRMjZRV2ZGMlBNTGhJMncxbFZBYTJhUHNZZDB6YTI1TVFSd2djWk42dVFEQ2krWnhpRDRYRU0ya1p4T1Q0MUZuWm5hUmxjcFpvdXpsUnFxZGJRVldvcFFvU0I1OFJWNTBsQk5ySGkvQXdYUzVMcndEVmxwWTNGYzNCeWlZR2M1MlRyaXN0NmtPWGR3SW5BUXRKcHA1UWNoeWFxdVlPVjdTdStmeFZNYVYzZGMwUkUyUzZtVVkwZ0x0MnBNY1lxcktJUTl3MmwxZ3BRVU10UVljbW1idDVEVE54ZGhuVUNqUXF0Yks5U1VTenZyQzBtbWhoRTFlMkZTMitveHlweS9aQVN1dGttdGp4M3ZjQkMyNFBYNjVuYnFrQkNSaGZqUzlrSVlQbmVlOGNNYWdWT2hJLzNUMWZBbWR0QVdac0Nzd1RKQ2tRVk5hMHFXS1NLUE9wSEFVaEQ5RHJiVmN5b1lrd3FodmgxN3ZZQWF5WExReUtHWWR4bFVERnA0OTRyQlhSallnTzE3RERZZXROSVVqL2V6cDZTMGxubHBFd3NXbUpNa093c0tYZVpLRUFqSUhuMEVRSklTYVJCY082VU1JTno3cC9iRWpqbnc0ZnQreG1EdmtzeFg0RzJySXJpczdxYWVLd0FGTVAyT2k3bjRjcml1Wnd0cFNVd3BmTHhTbk9SU3JJcXVzYzVaRmFYeXNxUldqaVoyRHlBV0VJTDM1dFZTb1FFbEZBQ2pPZUdHU0U3QUhFUWdkby9MU3ZDT2dHQnZreHNtRGJ2bFMzRnA1dmhhQjJUQUdxUktyS0tNcmhMVnBhR3pFVmpaME9ReERoYUNUQStReVJSMWQxNWFRenJKbnRMM1JpYnNpcGpHNmpsZ0w0eXFiUzBzTllnMWU4NHZoYkJWckVsSzY0Q1VjV1lYRGZLeGhwSXV4aVZKWlV4c2JNeS91UkJLVE5SUTRrUTNMZFJZTFMwckpqUlBsVFBxWTZnZEpzRURjK2FRWEFuK0hnc05VQ2JSdUYwT2owenduQTdiV0RrYmhPNUVuczAwcWVRaFMxbGFCTWw1TS9jQWF4c0xGOHJLeXFsK1RmN0VMTEVHdS9peGlpbWRDdm8wVGpmcGpLd2FnZ2VuNGVoNXY3TG9rTEtiTHV5dkhoY1pHOGRoR3JFRHg3SGc5M1pwcEpGN3FCcU8zaVZ2ZVhFRFFOSW56ZW9lOFlxNmVQYVpCWjJKdmlNM1cyVUFHb3Rla1JDQUdxNEVrRjFYM0RPblIxMXlSc0JMMXRSYTBQVmNaaU5GWFoyYzM0RnNrdm9tSW5RUTZsenBKb1piSnhrNDNOd0tKRkJxdUpTc3JCeUh5ZHhLT25UeFFBU0JtUzNqK0pNbnNIU2xhM0VjNks5VldvSlZuOXpmandPTTdocVlBQXFKUXdFMmEzbkE0OEoyUUdlZ1JrcFpOaXZTWSt5czNFa0tkNG9KSXdzdklIbDNjV2dMdDVrNE5INk9tdExXZHB1ck9rd0VNdXBZYzdlTXREUmhPY0kydWk1SmhWSXpYekx5dG8vR0FQdVpveW84d2tvZHVWZ0pnbEN0N09oR2JnSUQ0TXE0c2krNjN6VVMxRnVGRlhGbHF5YWoyZW1IbExNY0JxWXUwRk11UjI4QmJCN2xPeFJNU2lDUVhGaENLdXdraForcFlEaUdTZ2JzS0tWOE1pU1JzdUhTSVdNOXJrbFJpSWxaWnVxWGpzUUs4b29ZSk1ncTNKS1dWa2hIYmhzVnhGVXp0aE9XUGtZaWpjYng1NElLc1NkVCt1THIzY3JHS3lvWWdGaUdSOWlCazRrZmxvVVgrSklsUVJRcWFibXBnbmhxdHBRcGI2UlZRMVdINURuclM0aEVvR1pxYWVyUTJkaEZiejhYZVB4U2htRGJvNzBlSVNqb29yTzJ2SzhTSlhJNFNVbUVVNHpXS0R6VUR0V1RZdzd4WGxiU1RFajRGUmc3ektuS29HUkFMdjBHczlUZ2MxQnBDeXdHWlJRQXRxVnoyeHJCY0FNekVwZlp3RlNhMkc1VzBRQkZqU01hcFdBRUZhM0hjR043Q3hEekVDeUlrSjk3cXdycVdOVFdWbzg3NlBQc2pQa2oyd3Zncm9NNWxMWktNRVRLVnFsL0N2bldWRmlGYS9TekpVUXdrb1pzcjY3WTZ2bFNSVjMvMnRtTlRPWTN2bmF4WXdNdW9QS3FkelIxdzdJcUh5bWxQeGFBVGhmVTdLbzJaWFlqNEFZSkhMK2tOZEt3UlFZRVNUUmE1ZnNVWi9yVkMxVE1UeVdWeVlvcU50dXphSHNNeXYydHZvYXJ4ZGZxd1lnVTFheEZvL2NucWwxRkdzcUsrdUFST1Y4Qlg0R1U4V2NaVEFUaTJxN1FjeWkwTzBWK0doV0JNTlJVa244SDFTc1dWRTVCeTNHaTBFQ3FVZUpvQmZBdERhNGFta2RYRzM3QUdQNUdnZWI4NHA3VWF6cG9LUnpkRnplUThIa29IR3hwckt5L0hwbTV0MTJwNDdKNnhUWURFejd1SU5FWFN1eFlYdkZza1lBYyt5U3hIOXNmNWZ0S3pVNklid1ZCY1VHZzVlNUZNQ0VYU0VyWlIwd0dheVYxOXdvTTlndVBqVHFKZFZUcVI0dUU0bkpuTGxkV1ZrRUNDWkxkMlZMRit4dGFtZXg3SXBpcmlTRFVwdnJwbjlscndHTUNIeXBwTUgrcHM2TElMc3VGR1VqMVhFT1hpcWJxU0hQVUtuQ2xwV1Y2OGtxdFVSVk5EWTRUTmFvY3lrb1llVFU1bmdHRVFhL1MxRG5uRTRBZVhNY0tqSFBBbUZWakNCRU5hZXlMVk5IZnIzcHg4eFVzdEo5NGhJcGZINEhLRS9lRGFBcks2bFN5VlZGYmR0MWd4VElWazNwcHBWbEZYaTRwRWhWQlRPYnF1b2hVODVNTFhuMWlhaHZVa0hKalNDTWMwMXRMRnZlVlZCeDBEb2RNNmpmdEN1N0RPdEl6WXhyYzBxcDFKR1AyYXlZRnoyR2I2SHZNck84Y25HdFY2R2ptM3VJbVNmRDJHcFdLNnVvd2JaR014RktRQ28xcE9NdGNNWEZwUnN0K2hYR29Bb21GM3NTVEJHZ1RnbGJCS1d3c1EzdFpxYVlTcDBaMUNpbVJEV0ZjQ0pVUFlKMDBCSTVGa0tZTm9pZnVReG1OODhTV1ZYV0xNYVVxcXFnQzBCbVFKUjZzazN1OU5DZjZqWUxYeEFmcXNZRWdWTEFoUlkyQXRndGZsWk5GbUZ5aHhkckxrQWRXbGs0RDg4TTJpeEh5ZXBJZGhNSHJHL2lSMVpHdHEwTUdwYkRiUlBZT1hlU1kxTTZOeTRac3R2R1NrdEsrWGJGUEFUajJEMzcxc2FQRXNBTVhoWHJzWjBrbS9YU3RraGhNeUJmc2E2dVhGWmUyVkNlK1lNcjErR0tnd3JReU5ZcTFWUnJCK0VpekFvdzZOc2ROS2N5VkVrWWVNNzN5czZxNGtBSHA2QmlGa2xUa0lyVkM1b1lWN3V6d09HQ3o0VUowU3RxMmxXTUp5NHd0YitSZXRMNnRaRmljbkptQnc1VWpDdlhYTVpWSlgyTVFrYmYrWE41RVdkNzhWejgvSkVzTVpUQmlLTnpzbTFpbkxSVVE3NEg0TmlkYXFJNjhqNXNBRmd4Y1J2ZUM3aWVMSlhmUVl4alpaMkNzaVdGZXdaWEptQklsWjF0ZHRyWDRoU3VhdGVLc28vUlpPdE9LVzJubXExb1R6ZUs2ZFJXQVd1Mk5SVmI0aHEwU1htMUd2dHVnSHJicjVJWHFtU2t0ZzVDdURFMk1TbFB3c1k1a05FMldwM0FxaVpiV1ZMQXhpQkYrMmlCWmJ1Tmo2TUI2cnNNTEM3Rnlhc2FZRHlvN0trb1B5RXR3M3BFTVhmUHZ4QUppMmpBUVFnanJ6MHJMSVpTV1psSW9OaHdkNXhLNEFSOW1ZTmpXQWFMcm51SW1KZUJWTjl6Qk9ST2JWdmJyK21UVGZGU0VKTFNSbkhvN2hFSm9JaThNRnFqeG12Z21GNVVSWno0ekxGZ1paOEN0dTJYN2dnVmNjS205Z1Z4SXNPSHF4WGdOTUtuRldaWW5mMWRCbk9oYXlYcTE3UXdGbFdXMDllTkt5VkpGbVhxYU9OR0E1YUNlZ01iSjNVVWtHWTFpYzNuS1dnanE4cWZWWUdRRzFnUnQ2cnM2MmE2SGlxcVVPcWRlc0s1Tm1YNG5Hb2ZKb2lFMWQwZEY5bFZWa3ZUMS9rRUVhYUNvWU93RnBjVmNvTE0rNzY2OVB4QzlyV3FrdEgwc1dVWWxkMFZDcHVCWi9zdFZSY0dneTlXWDIrVTFRdGhpOVN6QXFTeHpac3krT2lGekJZbnlTR1Y2R2t1NDRyRDhCQ09aQlYzQnZENStBS1JITndNRXNCNkV6SG5KcGtUQWVpVWxFR2tjRUNlQjZHRFpUcDVZRUpUbHZkcmtueFlqVGxsTWtmTnRYd0RqTTd1VmpLNUpYVVVuNDNycnFwSzJqeXRheEhXME01RzhEQzhydEhNWXM3S1NnZHVWUU1HVFlGcUZ2VlM2cmtEM3NESjQ2YWZkWUZ3b3ExMUFPS0NCTGh2d29VZ2M4SUdBTnljUjZrblpyZEpQZHN1eG55amZkM0ZvdlRsUk1kRWR0T2w1Q01WNUVIc1hRQmlzN1RPd3ZJRFphR2oyVm5wYmg3Y3BLNjNWd1lFTUx3cWJqenlsNjk5c2F3RkZrRjF5cWpVVTMxSGZDNnNXMVpGVkZ1WFZYVmd6OWtlRWF3MHlzMWxXZm0rYXpRQVFTV0EraEtZVmZzWmpQbmNBY1VCOW9JYXl5L1VaWFJOY2tER2ppNzdHc1didkJvNnRQcldQcU95VmtCVXErSU5lcXB6TmRZcy91MGlmaDVxbXBxSVcrMzNKVlNVY3dZNzBLTDRVOWxZZFU2bGp0U2xzN2xtZmk5ZzNZemVRZlZrYUdGYVYzT0RDbmFEMk44d3NFREZrbEUzUnpNM1pnaGRZa1dIc3N6cTcwRkllY25La1ZrdDhlek16UnE5YmtHdUtvalJMQlZTb2QzWTF5UHFLZ1lXN0pSUVRQVnl5NXhJWUxqT2d4Z1Q1MlJLSlVZMWRPcklpUmQ0ZnV0UXgvQTVBY1NtRWp6MHZGV3JrTHp2YldBdTlIT1diR2d4RmsxVk5UcG5CS2s2VGd3aXNJL0hjeFlYUDF1QVdPNzJVTEZsQlRxK2FTdTJWVFVzNmhyeE0yQ0YraEVvcjFWSUE5Wm1GVWFhYjFsU1NnWnNWczRzeHpIbFZMb0pIcjlINERoT05Ua0kxWEMwL3dpWTJOb1dBRzVSbG5IRm5xNm9MY2NwUWRkTXVKL08xN0pWQTVPSExpMEJxQ3p0cTdZMSsrdWNDZDk4cUxJOE1JSEJWL2NLanhRVG1lM2hGQlMzTXlDcW5Ec3V5bTJvODBIanZGRlR0clVSbU5hR0pzbVZhaEltalRzVVhLdFFaVEFWczdNdnY4LytmelVyWkFYY0xKNk00a29lNlhQMGI2U21XV05EenlVcFE4YmwrTHRXeDR0dXFaMzZjUllWM3l1VnhQTnd2SWlxaVFDU211N3NyZ1R6UjZua3locENhclh3RnkxdkdkNWlQMmNZMDZsRnI1TmpoaGcxWTYrTkIyOGZ0Yks4M3M4cmY3a0xKYkt3REZQYkxnMjVhMEFkWkpFaXFyNXBoaXhLTURsUlV0Y3NzcTFocmlMcUdvSCt6ZU5nVm05T2VtanNFVFY4SmRGME5IbmtJRnhXWTFPQjRZcnA3cnRXSjdOZ0FBQVBYa2xFUVZRM29OczVucGx5VmY4dTJGb0x1MUpySHZlYVpXUWpxQWtzaHRGYTJnenNTRzNacGtidmczSGFmRjlzbFBQbGxkakZsSzgwR3lzbThNcjRNUGhuZU5XRU5QR2pBSXBtaWxUUEFUZFRSVFhsQ0JZSFlBUXVQd0EzNnhJcFd0R040cTNZMk1oaUdzVXB1U1NubEVKUkQ4UG9yQzdDRllWdytGNTFxVGhnYWJ4c1R4V3pDR1kwWlNzYjNsZnFBeTBPUE5qTnk4eGlRUUtzSFlGUTJIQlpWdlZiQnVxM20xb1dLYWpxYW9uc002dVpVcjZDalhXTlowbDVFM2gzalVSbWE2a1AzTUpJaXkxTG0ra2FoUXE0MU4yaVpqYTVzanRsTFlOWkhackg2cVVHbTR2TWJEcDZSdzJDRm12dXlGa3JCY0N5TXRGcUJhRUNtc0hvSzlCWjJMQS9sSmNScVNhRHFuYVdiclpkR2F6M0RMZ0l2QmxuNHdvR3p0YnlKR3FzbHd4a2hoSHJUalRZRlhDdE9vS1M4dUxkb2ZWZEFiT3lsR1U2bmxZcFhXWnRzNG5YQnE2V3hKaXRNTm9rSFVKbmJuSnBsUW0rYUdwWTJhNUdNVjJRRDFoUnViQlBGS2R1bWY1T0hrTEh6MEY5bHVFNWtqQmpSYTBuRkU1Q1VHcUh3MzJNbWpaNnhrZ0lOVm5TbloxVlpTdEsycUtsUmFMbFFnSzd1VHE3SkZYSndNKzNTT0VLeWhaTkkrdEowSTVxTVl5OWsycUpEN2RWV2RxS1hhMENLTlIwQ2NqZytCMklZdTJmY0JaSlprTUZnTTExcjBYOTJ3aWxnaEZHZ3pWbmV4bHFCN3hMOW1TMjlTaVlVVlkyblhPWmpOQlJzeURzUVBSV1c1aHJaNFhjZEM0SFZXUmJqZ0pyNHNGb2ZLNVN6alE3cmhJMVVlYmRQZEViajZzcUl2VFpRWjV2YTA4ckFCc0FXMFV4ZVd5dEFrN0EyS0o5WnB4ekNpb0IyNFhGdFlBZVhZeHI2YW5TcWhMZ3BwRXFXYkd3THVuVGdyVitJaldsTDI5bGphQWw0RVFNR3NFcnA0YXBlWmlxdXdSWExYQXFPQ2VydTMybW15ZGM2b1dUU1dwRkFHZHplVEI4UlRIVk1FdGxNOTBDYmJRQ1loUGpxM2VnWXIxRkdkWUlRaml1REdaNXpaL0F6b2JLR095THh0aTZjNFJ3dHYyYW55V2xMSUNubExoeEpSWHQ2QTVlYkRCV0ZOT05ieFdaMmQwMm1udTRTOVlFQ3BlcHBWMXpTV1JCV3hIWXpWSXYxQ1hTb3V3cXFYM2pCQkJEWmRZUWJwVFFXNFpRbFM4cjVrSDRzdVNSbWcyKyszSk4xMHgxUGFBbUVrbXRZbEVkZUdwSkVNNmtPdUNxQ1IyMm9TdWpqNUlWMkhkVDB6ajVwckxLVGpYRkFQamRRbHlxN3hJQnhBUVA1eU1jekc0VnhBS3cwbjZpbFoyUUJjZTJwTHVsa3V4eHFub0l6RmZncXlxamlsOVMxVk53QnJGbWV5ZW9wczh5T2paVXliWmRmUzhDdWFUSUp1bXpzNXRPRGFOdExwRkRRL1BjSkd3ZUxobWVMMW5CMEtxaVVEU2NzaVVWRDg5RGkzSHRyS3RTVUx3M1JMaXlnWkQrN3NGOEpUT2JnWXNyR3ZETlVGUkdsMWl5MExsMVlrVWMyYUpZTW9nOTIwSThxVzZZRENnMU1xazBKSEpGS1hrYmdiUnJlSStxcFlOT1pIclZjRFViYTdwanNwaFNKTnRLNnVwZ1JOQVZvT1MwbXVnQmVONGJJWmdIaHVQWi9zMUVOYVg2S3NWcitZTnJoMU5iN2lwUjBQRTV6Yk5SZWdDYnJIUlV3NllmMDdkTEJKbDFmOEtCOWFzMlYxbk5xQXNsNjJMQkJoZWh3YWxlcmtIbUIxSkZJRVpLU0V1c2RsNUpRajFuSmxIWFNDRjM0MmdKOUNZR3JYZWxrbkpJWHFWUDhzRCtxdHBsQ1IzWEgycWZLcTB5Z01wK0tuVmtLeE5sWjhtMllrSWxWTWlDblhVd2w3cXpuQktTdlF6M20zUHQ2b1FiWE81YjVGaXhDaC9mSHhVUVcvQUVjSzZ6Q05xS1FuTDlzeXdxbUt1d3ZxU1l6VC9hUFZOTnBWeWh2UlcyMWFxY2lDc2pkV3ZCd0lMVXZoNVZ5Q3piV29DMXBKako2ODBDV3NsK3VkS0I2VDVSd0cxbWxvaG5scGJnNDdpejVVOWhhMEZHdG1STEZZQnRPOTl5OTdBcDB6K1pEVEFvZzZrU0xac01IZy9JRmtrZ3A2Q3B2VTJVMGNZVlNkbm1randCZE9tWGJ4VFdOV3p1SWJpcE1pb1Z4RWNrWkVvYWhTT2l5Mk0zSzBqY0MxTGhWRHdhcUcwWnZrY1dxQ25yRzRHSXh5a3JxbGJXZHc2TFF5QmFaUjhIbUxSSWhRV3NIc3dENDJaWFZMTmtmOWwrRmxXMEhWUTJsd0ZzQy9aMUZkemxRUjBLYVBmbytGZGZ1Ky9kd1ZSSUN1MUNHUjdBRUlpQWhjK0FaVUYwa09CYVB4bVVxZzRpNjR2UW5VNG5GRFlKOU56KzFmVlh2ZUg5cW1yK2tQSUx4OG9LY1JWL0JGYnhiRTBKTVQwa1NENHc2TC9sTlk4b2NzcWFnVmRVM0EzTWp4aHhjR3VxenNQSDRpcnBhb3cxcTZPeXJWanZwOU5wYzU5RTkxTGxkYm9ZVnpKV2RpbVdmQVcyU05FS2NEYVgyRm1CTExBL3VLeGxtaGg2MTNJczFVUlFBcGJLZnR0d3hMMDJxNk9ueDVwUXhTYlBvakFnK3Y1aEFuTjZMSFZSRFhJc3ZLdFJqaVMwcUpVeVpUQVhWYkFLODJFbEZKV2FRZFZvcVVDMVVudDdCVmFUUXVkTTZTdXFleGpRSk40KzBpY2F4di91dGJLdjgzRVRiVDhIOGdqY09LeE9KbWJVYTZPT1ZYaHQzZEZZNnJIdjlYb056RkxjZUVBMW84K3BLbTBMQUhQSFoycllLakZxMGhmWkZpeHNxSEpnRDNlRDVuK1Uwa2IxbUZqWGtuMmx2TVNTT3NORS9DZElBS0YwU3l0cTZ1ck9IVU41Z3dnNEdab3NnYm1nZ001dWNyYTJxclMySWcxY2JpQkJjeFl6Z3pVRE5MQ3ZMOEdiWlhOcDZPUnkzTG1TK0trODN6UklBSzZBMWlvS2EySTlOYXBJdWlVRmRmQzk3NjZQRlpVdHFVcjZLYldrK3paVTFhL1pySVhFenRyalRPZno3aHdLemlDZVhJYXJhSHRiWklNeisycEdnYXpDbXc0cVdBRnZFZGhvZFlwMFhxMHBWN0cxWVdZV2JPNHFoR3E0MitaOEJZdHJMV3ZsdU5QcFpBZWFGRlMxdnViUGdiZ3hzcWNwbkFhc3pCb3ZLYUZvRFE4Qkd0amZVT2w0TkFHMm5tUVYwNGZlSmd1bXZYMmZzclFFV1pnaEwwSm5WZFlrbjNET1pJZVJOODZScVBXQ21zdkdWcUVNUm53eFFBeHdTOEVNWW8zSXptWTIrQkNjTHA0TUtpdXl1aEltYW1sYlpGY05vTmw3dHArUkhkMThaalFJUkt5WGRGUmhOOTgvaHlLcXdYV05vN08xd2lhWG9ITjEwOFJFWlpXRXE2Z3JuSWZqemVnOGpkUmYxWEVMNGtrWGE1YkJqS3hvS2FsakJqZUhsVnhRNEdheWNwVzRsRE9BS3RuVHhIQXRPZnpPdFp3SEFNN3NxVlhrVjZ5dTZrYXAxbkhrWEtxV0YvNFhIcWplbk5LcUJqcFIzbDFjaDNFamcxK0VzZ2RRaHNkRzBCNEZNOXNXQVZXcHVBeWl3VFBsZVp4dDlWeVpWUzJxWGZSZVdxVEFpbHByOUFwb1dUanh5bWl0N053VjRKVHJpWnlPQTlCMGs3SEZmVUxvdXJtS1lIVm5SUXZxR0w1SE1IZHFGY1IycVdwbWNLNmVUd3gyZGlwV3J2aURpbHIrZktXcTNPV1JXZEhLd0E0ZXU4d2pjaGJlUnpGaWxxampaTjN1ZkNwZmtKMC9zY1ZwbllrNkwwUEk3N2x4ZFdDWjg3V2lXbTdCL0FHcXVRU251akdLc0I4Q0ptaUpxOHExcEtJVld5cU9pVEs2NnIxOEJOOHI3NC9BRTcxZmRDM3lQUzJNeGRPcG5FMXRsVnhEOUptVk9vZ2dOK3I0UGpBWFZGUGEzRWc1alZKR0ZWVUdOb2xIMjBHVnJVQjdCT3lTV3E2V3FZUWRXUjkycGNGTVlNd2NrYlNnQ0tDcUQ2N0RpaVd1MWc4TVFDOUJ5ZmNGcVcxTCtqTDcxNHFOQ3V6bm9TeHQwZGEyZ3RXTjFHOEYwQkswTk4wbnVpbWVsVUY5ZElkQWZqTzQ0VVQzQ2pRTG9VZUxISkZUTzNnbXBSdUlJT3Z3QlFDYnFOZW8zcXRaOWlGNnhWSzEzR1JsbzR6cWltcStDR2RUaVIxdVJZOG9xZ0UwMmhaQmE3OWtaWFBNcXV4UkhLbGEyc2FaV040bVJxWlVqMHZMQ0toa2pLbnFPUUhOdVNaVkpvS3ZBcVMxd3BFcXV2V0RDMUIyeXB3ckNQc1JNRVBWVE9ETUxKTUR2NnFlS1h3aTJKWVY1U3E0cUt5dmdHc0hDTGl1ajJqUjU5VjhnTXFTSjJGSlpSWEVIVlJIajNzRlByY3Q2T3BxbFcxR3BhdFFkdDBHdndmTTZuNjNJbnNHVkZoSkdhQnFncXFJVjZJc1hsbFpneVNQcTRSM2JudDN3aTVjditjTjJ5cVFMVzFUOTVLWVZzV1d0S2s0Y0I5VzUzV1FRZmxRWVI2V2w0SGFKWmp2VkUwRDV5dnErUktnWkNzNXFkQkVQNXNEOTRjQXZRTGxTZ05hU01BdEh4ODhCdU5RNDF6ZEZzWDMwektiY3MwTUxEL2loa3BRemwwd2lUcUtMVGZiS21DbXlZSUNuSzBJYmFpZUM0Q0c5aVN5TFE3Y0lNR1F3YXU2VEtvcTYwQXBsM1dONDBMWnBjYTFDS0tLOVZReXlJRW44dzBGOEY2Q0wyaDhvM2l4R3dDN3M3RVd6Q09xbWNBcFl4WUQ0anNBelZTMHNsMnQ5OHBBN3ZyS29waENWU29uYllwZ0g2bXZTbjI0cFRCVjRzZHRWM0J0TXE1azgyeStJQUR2VUowdUFsa0NWVHhJYVBtK1VOdS9xa1Y0RjFUekhYQ0dyWElBcUl0Qkt5cHFLOTlWdEFPVnM2NE80T2JYN3BITFZDcFlIY1Jtd3ZMUjdUdllBS0JCTjU4TEdWekR1RnoraFFiV2duY1F5Q1pBaytWYnNQU291ZjkzMjYxaVpnbWZDcHdSYkF2cW1TcXJpVTJQd2hqYW9PeVlxdEllZ1ZYVmlUc215dGE2Ykd5U3BZM2d5UnJwSXlBZWFXRER4dHBzWHdLeWFsTURLTlA3WUJYTXFFc2tVc2kydUM4Rk5BUHhBS1RWZlQxbzZWek0wRTBqRisxcldjVXVIdmR5Zzd2Z29GcGxYOEhwdkhwTUNPTVJVUEh6WmtJbnNxbEZLTlgvRUlPNTJFMFN4U3pPd29iMlZtUkxXNUQxWElVMHJiZ00xQXpXZ3lDN2ZlOEc3eFVBSy90YUVCYXQ3bHVxdHlQN0Vtc2FKUU9qNUYrbXJuWmZDdVlDZkJVQVd3U2h5ZDZwTVkvdkFIRzFVcU9ZcGJJL2d5NVQwQ01LbStVTzNnRnVDODVkZ2ZEVmVndVBEZklUcklCTHNMcmNnZGgzQ0ZnRlpqYUtKNEl2M0Y4QU5FcXZ1eFIxdFZLT2dMb0NhMWp4Ym9CQWtqNnY3ai9pY0ZiQTdmNHJmUm5RRExSVmlHMTNpMHZxQlFyWVZxQmJBRFpUMFpwaUhvU3p2UXBvcEtJRlMzc0UxSGZCV2xIWGQwSDdMbkFycXZvdWdNdGxqSEJnWm5oM0Vvei9CS2pMTUw0WjJBcTAraEVKcjlqYVZVQmJ2TnpDSVVpcm9DN0FXbW1GdzRvNUFLM010QjVWeXBaTVNGZ3MwNUp5R1Z3bHdCcXNFR0FBYTJaVTFDalVleFhHc0U0cktyaWlsQnZGek9LS28zQXVBcm9FNlFGUVUzdThZcE5Yd1M1aysxVFp0NVVyd291TjRLaVVFdytrM1pXRHAxUlhITlJxWGIyMVRzMzk5NDV5WlNnM1ZuWkZOUTlDRjNYZVp5cjVEZ0JYS2l3Q01hMk14ZVREWVhnUDFGc2Y5UU5LWmMwazgxUkprM3I2RVEzckNtQlZ5TEw3NUVqWjFwSVZESG9GdGlPQUhvQjBCZFRWeWxxQnNLS0tTK0FlQlhKVkxZK0NYQVN1R3ZPL0F1cTdHdUVqRGZHS2cxb0thMXovZG1taTlJOVNVR05obDBBdGZ1bEhBYXdvWXJuU2ttTlhBVnVHRWhyRVZYdlVGK0E1Q3QyUHFOT2pEZXR5bmE0Q21lVW9sbWVYTE40QXE3QzVTajEwUTd5amdsK3Q2Q054U1JIbUk1WCtDcHdyZVlCM1FmZHFuYTRxMjFLZEJ1YzRHb1pzbjQ5Wk9PaVZpbndIcUs5V3pqdmdld2VFaDJBVTUrdnR4WjlDZDlXcWtoNDlWMThFNW9qNnZWeW4wUlN0QXlHSU81ZWRYUktkNUIwVkdWWHEyeXIzeFlwKzVVdCtDNFFKNFAxTjMzOXBRTWpSZWpqNHZiL0RjcjZyUWMzTy8wcmptdFpwZVlDQmlDSGZDZW1SYk5oYksvcE5VUGMzd2ZLeTVmMkQ3T2xMMy91UGh2ZS9vVTRUMEY4ZitWTk0ydnlvaXYwaksrS0hRZmRIcSswYm5jejRvejczLytZNkxiS3cxby81QjdlT2YxUmwvMGR1OUI5dG4vOWJ2cmYvait2MGg2dHRuMnRwL3IvNDgxOXk0L3p2NTM5MXV2enpmd0RpZno2cGhUMU1QZ0FBQUFCSlJVNUVya0pnZ2c9PSIpO2JhY2tncm91bmQtc2l6ZToxMDAlIDEwMCU7Ym9yZGVyOm5vbmU7Y3Vyc29yOnBvaW50ZXI7ZGlyZWN0aW9uOmx0cjtoZWlnaHQ6MTMwcHg7dG91Y2gtYWN0aW9uOm1hbmlwdWxhdGlvbjt3aWR0aDoxMDAlfS5jb2xvci1waWNrZXIgLmNwLWFkZC1jb2xvci1idXR0b24tY2xhc3N7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtib3JkZXI6MDtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmlubGluZTttYXJnaW46M3B4IC0zcHg7cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlfS5jb2xvci1waWNrZXIgLmNwLWFkZC1jb2xvci1idXR0b24tY2xhc3M6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0uY29sb3ItcGlja2VyIC5jcC1hZGQtY29sb3ItYnV0dG9uLWNsYXNzOmRpc2FibGVke2NvbG9yOiM5OTk7Y3Vyc29yOm5vdC1hbGxvd2VkfS5jb2xvci1waWNrZXIgLmNwLWFkZC1jb2xvci1idXR0b24tY2xhc3M6ZGlzYWJsZWQ6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LmNvbG9yLXBpY2tlciAuY3AtcmVtb3ZlLWNvbG9yLWJ1dHRvbi1jbGFzc3tiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXJhZGl1czo1MCU7Ym94LXNoYWRvdzoxcHggMXB4IDVweCAjMzMzO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjEwcHg7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6LTVweDt0ZXh0LWFsaWduOmNlbnRlcjt0b3A6LTVweDt3aWR0aDoxMHB4fS5jb2xvci1waWNrZXIgLmNwLXJlbW92ZS1jb2xvci1idXR0b24tY2xhc3M6YmVmb3Jle2JvdHRvbTozLjVweDtjb250ZW50OiJ4IjtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6MTBweDtwb3NpdGlvbjpyZWxhdGl2ZX0nXSxlbmNhcHN1bGF0aW9uOjJ9KSxoMy5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpVZ30se3R5cGU6ZzN9XSxoMy5wcm9wRGVjb3JhdG9ycz17ZGlhbG9nRWxlbWVudDpbe3R5cGU6WmEsYXJnczpbImRpYWxvZ1BvcHVwIix7c3RhdGljOiEwfV19XSxodWVTbGlkZXI6W3t0eXBlOlphLGFyZ3M6WyJodWVTbGlkZXIiLHtzdGF0aWM6ITB9XX1dLGFscGhhU2xpZGVyOlt7dHlwZTpaYSxhcmdzOlsiYWxwaGFTbGlkZXIiLHtzdGF0aWM6ITB9XX1dLGhhbmRsZUVzYzpbe3R5cGU6d3ksYXJnczpbImRvY3VtZW50OmtleXVwLmVzYyIsWyIkZXZlbnQiXV19XSxoYW5kbGVFbnRlcjpbe3R5cGU6d3ksYXJnczpbImRvY3VtZW50OmtleXVwLmVudGVyIixbIiRldmVudCJdXX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGgzLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImNvbG9yLXBpY2tlciIsdGVtcGxhdGU6JzxkaXYgI2RpYWxvZ1BvcHVwIGNsYXNzPSJjb2xvci1waWNrZXIiIFtjbGFzcy5vcGVuXT0ic2hvdyIgW3N0eWxlLmRpc3BsYXldPSIhc2hvdyA/IFwnbm9uZVwnIDogXCdibG9ja1wnIiBbc3R5bGUudmlzaWJpbGl0eV09ImhpZGRlbiA/IFwnaGlkZGVuXCcgOiBcJ3Zpc2libGVcJyIgW3N0eWxlLnRvcC5weF09InRvcCIgW3N0eWxlLmxlZnQucHhdPSJsZWZ0IiBbc3R5bGUucG9zaXRpb25dPSJwb3NpdGlvbiIgW3N0eWxlLmhlaWdodC5weF09ImNwSGVpZ2h0IiBbc3R5bGUud2lkdGgucHhdPSJjcFdpZHRoIiAoY2xpY2spPSIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkiPlxuICA8ZGl2ICpuZ0lmPSJjcERpYWxvZ0Rpc3BsYXk9PVwncG9wdXBcJyIgY2xhc3M9ImFycm93IGFycm93LXt7Y3BVc2VQb3NpdGlvbn19IiBbc3R5bGUudG9wLnB4XT0iYXJyb3dUb3AiPjwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9IihjcENvbG9yTW9kZSB8fMKgMSkgPT09IDEiIGNsYXNzPSJzYXR1cmF0aW9uLWxpZ2h0bmVzcyIgW3NsaWRlcl0gW3JnWF09IjEiIFtyZ1ldPSIxIiBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09Imh1ZVNsaWRlckNvbG9yIiAobmV3VmFsdWUpPSJvbkNvbG9yQ2hhbmdlKCRldmVudCkiIChkcmFnU3RhcnQpPSJvbkRyYWdTdGFydChcJ3NhdHVyYXRpb24tbGlnaHRuZXNzXCcpIiAoZHJhZ0VuZCk9Im9uRHJhZ0VuZChcJ3NhdHVyYXRpb24tbGlnaHRuZXNzXCcpIj5cbiAgICA8ZGl2IGNsYXNzPSJjdXJzb3IiIFtzdHlsZS50b3AucHhdPSJzbGlkZXI/LnYiIFtzdHlsZS5sZWZ0LnB4XT0ic2xpZGVyPy5zIj48L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz0iaHVlLWFscGhhIGJveCI+XG4gICAgPGRpdiBjbGFzcz0ibGVmdCI+XG4gICAgICA8ZGl2IGNsYXNzPSJzZWxlY3RlZC1jb2xvci1iYWNrZ3JvdW5kIj48L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz0ic2VsZWN0ZWQtY29sb3IiIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT0ic2VsZWN0ZWRDb2xvciI+PC9kaXY+XG5cbiAgICAgIDxidXR0b24gKm5nSWY9ImNwQWRkQ29sb3JCdXR0b24iIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Int7Y3BBZGRDb2xvckJ1dHRvbkNsYXNzfX0iIFtkaXNhYmxlZF09ImNwUHJlc2V0Q29sb3JzICYmIGNwUHJlc2V0Q29sb3JzLmxlbmd0aCA+PSBjcE1heFByZXNldENvbG9yc0xlbmd0aCIgKGNsaWNrKT0ib25BZGRQcmVzZXRDb2xvcigkZXZlbnQsIHNlbGVjdGVkQ29sb3IpIj5cbiAgICAgICAge3tjcEFkZENvbG9yQnV0dG9uVGV4dH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9InJpZ2h0Ij5cbiAgICAgIDxkaXYgKm5nSWY9ImNwQWxwaGFDaGFubmVsPT09XCdkaXNhYmxlZFwnIiBzdHlsZT0iaGVpZ2h0OiAxNnB4OyI+PC9kaXY+XG5cbiAgICAgIDxkaXYgI2h1ZVNsaWRlciBjbGFzcz0iaHVlIiBbc2xpZGVyXSBbcmdYXT0iMSIgW3N0eWxlLmRpc3BsYXldPSIoY3BDb2xvck1vZGUgfHzCoDEpID09PSAxID8gXCdibG9ja1wnIDogXCdub25lXCciIChuZXdWYWx1ZSk9Im9uSHVlQ2hhbmdlKCRldmVudCkiIChkcmFnU3RhcnQpPSJvbkRyYWdTdGFydChcJ2h1ZVwnKSIgKGRyYWdFbmQpPSJvbkRyYWdFbmQoXCdodWVcJykiPlxuICAgICAgICA8ZGl2IGNsYXNzPSJjdXJzb3IiIFtzdHlsZS5sZWZ0LnB4XT0ic2xpZGVyPy5oIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICN2YWx1ZVNsaWRlciBjbGFzcz0idmFsdWUiIFtzbGlkZXJdIFtyZ1hdPSIxIiBbc3R5bGUuZGlzcGxheV09IihjcENvbG9yTW9kZSB8fMKgMSkgPT09IDIgPyBcJ2Jsb2NrXCc6IFwnbm9uZVwnIiAobmV3VmFsdWUpPSJvblZhbHVlQ2hhbmdlKCRldmVudCkiIChkcmFnU3RhcnQpPSJvbkRyYWdTdGFydChcJ3ZhbHVlXCcpIiAoZHJhZ0VuZCk9Im9uRHJhZ0VuZChcJ3ZhbHVlXCcpIj5cbiAgICAgICAgPGRpdiBjbGFzcz0iY3Vyc29yIiBbc3R5bGUucmlnaHQucHhdPSJzbGlkZXI/LnYiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgI2FscGhhU2xpZGVyIGNsYXNzPSJhbHBoYSIgW3NsaWRlcl0gW3JnWF09IjEiIFtzdHlsZS5kaXNwbGF5XT0iY3BBbHBoYUNoYW5uZWwgPT09IFwnZGlzYWJsZWRcJyA/IFwnbm9uZVwnIDogXCdibG9ja1wnIiBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09ImFscGhhU2xpZGVyQ29sb3IiIChuZXdWYWx1ZSk9Im9uQWxwaGFDaGFuZ2UoJGV2ZW50KSIgKGRyYWdTdGFydCk9Im9uRHJhZ1N0YXJ0KFwnYWxwaGFcJykiIChkcmFnRW5kKT0ib25EcmFnRW5kKFwnYWxwaGFcJykiPlxuICAgICAgICA8ZGl2IGNsYXNzPSJjdXJzb3IiIFtzdHlsZS5sZWZ0LnB4XT0ic2xpZGVyPy5hIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPSIhY3BEaXNhYmxlSW5wdXQgJiYgKGNwQ29sb3JNb2RlIHx8wqAxKSA9PT0gMSIgY2xhc3M9ImNteWstdGV4dCIgW3N0eWxlLmRpc3BsYXldPSJmb3JtYXQgIT09IDMgPyBcJ25vbmVcJyA6IFwnYmxvY2tcJyI+XG4gICAgPGRpdiBjbGFzcz0iYm94Ij5cbiAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIHBhdHRlcm49IlswLTldKiIgbWluPSIwIiBtYXg9IjEwMCIgW3RleHRdIFtyZ109IjEwMCIgW3ZhbHVlXT0iY215a1RleHQ/LmMiIChrZXl1cC5lbnRlcik9Im9uQWNjZXB0Q29sb3IoJGV2ZW50KSIgKG5ld1ZhbHVlKT0ib25DeWFuSW5wdXQoJGV2ZW50KSIgLz5cbiAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIHBhdHRlcm49IlswLTldKiIgbWluPSIwIiBtYXg9IjEwMCIgW3RleHRdIFtyZ109IjEwMCIgW3ZhbHVlXT0iY215a1RleHQ/Lm0iIChrZXl1cC5lbnRlcik9Im9uQWNjZXB0Q29sb3IoJGV2ZW50KSIgKG5ld1ZhbHVlKT0ib25NYWdlbnRhSW5wdXQoJGV2ZW50KSIgLz5cbiAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIHBhdHRlcm49IlswLTldKiIgbWluPSIwIiBtYXg9IjEwMCIgW3RleHRdIFtyZ109IjEwMCIgW3ZhbHVlXT0iY215a1RleHQ/LnkiIChrZXl1cC5lbnRlcik9Im9uQWNjZXB0Q29sb3IoJGV2ZW50KSIgKG5ld1ZhbHVlKT0ib25ZZWxsb3dJbnB1dCgkZXZlbnQpIiAvPlxuICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgcGF0dGVybj0iWzAtOV0qIiBtaW49IjAiIG1heD0iMTAwIiBbdGV4dF0gW3JnXT0iMTAwIiBbdmFsdWVdPSJjbXlrVGV4dD8uayIgKGtleXVwLmVudGVyKT0ib25BY2NlcHRDb2xvcigkZXZlbnQpIiAobmV3VmFsdWUpPSJvbkJsYWNrSW5wdXQoJGV2ZW50KSIgLz5cbiAgICAgIDxpbnB1dCAqbmdJZj0iY3BBbHBoYUNoYW5uZWwhPT1cJ2Rpc2FibGVkXCciIHR5cGU9Im51bWJlciIgcGF0dGVybj0iWzAtOV0rKFtcXC4sXVswLTldezEsMn0pPyIgbWluPSIwIiBtYXg9IjEiIHN0ZXA9IjAuMSIgW3RleHRdIFtyZ109IjEiIFt2YWx1ZV09ImNteWtUZXh0Py5hIiAoa2V5dXAuZW50ZXIpPSJvbkFjY2VwdENvbG9yKCRldmVudCkiIChuZXdWYWx1ZSk9Im9uQWxwaGFJbnB1dCgkZXZlbnQpIiAvPlxuICAgIDwvZGl2PlxuXG4gICAgIDxkaXYgY2xhc3M9ImJveCI+XG4gICAgICA8ZGl2PkM8L2Rpdj48ZGl2Pk08L2Rpdj48ZGl2Plk8L2Rpdj48ZGl2Pks8L2Rpdj48ZGl2ICpuZ0lmPSJjcEFscGhhQ2hhbm5lbCE9PVwnZGlzYWJsZWRcJyIgPkE8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj0iIWNwRGlzYWJsZUlucHV0ICYmIChjcENvbG9yTW9kZSB8fMKgMSkgPT09IDEgIiBjbGFzcz0iaHNsYS10ZXh0IiBbc3R5bGUuZGlzcGxheV09ImZvcm1hdCAhPT0gMiA/IFwnbm9uZVwnIDogXCdibG9ja1wnIj5cbiAgICA8ZGl2IGNsYXNzPSJib3giPlxuICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgcGF0dGVybj0iWzAtOV0qIiBtaW49IjAiIG1heD0iMzYwIiBbdGV4dF0gW3JnXT0iMzYwIiBbdmFsdWVdPSJoc2xhVGV4dD8uaCIgKGtleXVwLmVudGVyKT0ib25BY2NlcHRDb2xvcigkZXZlbnQpIiAobmV3VmFsdWUpPSJvbkh1ZUlucHV0KCRldmVudCkiIC8+XG4gICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBwYXR0ZXJuPSJbMC05XSoiIG1pbj0iMCIgbWF4PSIxMDAiIFt0ZXh0XSBbcmddPSIxMDAiIFt2YWx1ZV09ImhzbGFUZXh0Py5zIiAoa2V5dXAuZW50ZXIpPSJvbkFjY2VwdENvbG9yKCRldmVudCkiIChuZXdWYWx1ZSk9Im9uU2F0dXJhdGlvbklucHV0KCRldmVudCkiIC8+XG4gICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBwYXR0ZXJuPSJbMC05XSoiIG1pbj0iMCIgbWF4PSIxMDAiIFt0ZXh0XSBbcmddPSIxMDAiIFt2YWx1ZV09ImhzbGFUZXh0Py5sIiAoa2V5dXAuZW50ZXIpPSJvbkFjY2VwdENvbG9yKCRldmVudCkiIChuZXdWYWx1ZSk9Im9uTGlnaHRuZXNzSW5wdXQoJGV2ZW50KSIgLz5cbiAgICAgIDxpbnB1dCAqbmdJZj0iY3BBbHBoYUNoYW5uZWwhPT1cJ2Rpc2FibGVkXCciIHR5cGU9Im51bWJlciIgcGF0dGVybj0iWzAtOV0rKFtcXC4sXVswLTldezEsMn0pPyIgbWluPSIwIiBtYXg9IjEiIHN0ZXA9IjAuMSIgW3RleHRdIFtyZ109IjEiIFt2YWx1ZV09ImhzbGFUZXh0Py5hIiAoa2V5dXAuZW50ZXIpPSJvbkFjY2VwdENvbG9yKCRldmVudCkiIChuZXdWYWx1ZSk9Im9uQWxwaGFJbnB1dCgkZXZlbnQpIiAvPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz0iYm94Ij5cbiAgICAgIDxkaXY+SDwvZGl2PjxkaXY+UzwvZGl2PjxkaXY+TDwvZGl2PjxkaXYgKm5nSWY9ImNwQWxwaGFDaGFubmVsIT09XCdkaXNhYmxlZFwnIj5BPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9IiFjcERpc2FibGVJbnB1dCAmJiAoY3BDb2xvck1vZGUgfHzCoDEpID09PSAxICIgW3N0eWxlLmRpc3BsYXldPSJmb3JtYXQgIT09IDEgPyBcJ25vbmVcJyA6IFwnYmxvY2tcJyIgY2xhc3M9InJnYmEtdGV4dCI+XG4gICAgPGRpdiBjbGFzcz0iYm94Ij5cbiAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIHBhdHRlcm49IlswLTldKiIgbWluPSIwIiBtYXg9IjI1NSIgW3RleHRdIFtyZ109IjI1NSIgW3ZhbHVlXT0icmdiYVRleHQ/LnIiIChrZXl1cC5lbnRlcik9Im9uQWNjZXB0Q29sb3IoJGV2ZW50KSIgKG5ld1ZhbHVlKT0ib25SZWRJbnB1dCgkZXZlbnQpIiAvPlxuICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgcGF0dGVybj0iWzAtOV0qIiBtaW49IjAiIG1heD0iMjU1IiBbdGV4dF0gW3JnXT0iMjU1IiBbdmFsdWVdPSJyZ2JhVGV4dD8uZyIgKGtleXVwLmVudGVyKT0ib25BY2NlcHRDb2xvcigkZXZlbnQpIiAobmV3VmFsdWUpPSJvbkdyZWVuSW5wdXQoJGV2ZW50KSIgLz5cbiAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIHBhdHRlcm49IlswLTldKiIgbWluPSIwIiBtYXg9IjI1NSIgW3RleHRdIFtyZ109IjI1NSIgW3ZhbHVlXT0icmdiYVRleHQ/LmIiIChrZXl1cC5lbnRlcik9Im9uQWNjZXB0Q29sb3IoJGV2ZW50KSIgKG5ld1ZhbHVlKT0ib25CbHVlSW5wdXQoJGV2ZW50KSIgLz5cbiAgICAgIDxpbnB1dCAqbmdJZj0iY3BBbHBoYUNoYW5uZWwhPT1cJ2Rpc2FibGVkXCciIHR5cGU9Im51bWJlciIgcGF0dGVybj0iWzAtOV0rKFtcXC4sXVswLTldezEsMn0pPyIgbWluPSIwIiBtYXg9IjEiIHN0ZXA9IjAuMSIgW3RleHRdIFtyZ109IjEiIFt2YWx1ZV09InJnYmFUZXh0Py5hIiAoa2V5dXAuZW50ZXIpPSJvbkFjY2VwdENvbG9yKCRldmVudCkiIChuZXdWYWx1ZSk9Im9uQWxwaGFJbnB1dCgkZXZlbnQpIiAvPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz0iYm94Ij5cbiAgICAgIDxkaXY+UjwvZGl2PjxkaXY+RzwvZGl2PjxkaXY+QjwvZGl2PjxkaXYgKm5nSWY9ImNwQWxwaGFDaGFubmVsIT09XCdkaXNhYmxlZFwnIiA+QTwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPSIhY3BEaXNhYmxlSW5wdXQgJiYgKGNwQ29sb3JNb2RlIHx8wqAxKSA9PT0gMSIgY2xhc3M9ImhleC10ZXh0IiBbY2xhc3MuaGV4LWFscGhhXT0iY3BBbHBoYUNoYW5uZWw9PT1cJ2ZvcmNlZFwnIlxuICAgIFtzdHlsZS5kaXNwbGF5XT0iZm9ybWF0ICE9PSAwID8gXCdub25lXCcgOiBcJ2Jsb2NrXCciPlxuICAgIDxkaXYgY2xhc3M9ImJveCI+XG4gICAgICA8aW5wdXQgW3RleHRdIFt2YWx1ZV09ImhleFRleHQiIChibHVyKT0ib25IZXhJbnB1dChudWxsKSIgKGtleXVwLmVudGVyKT0ib25BY2NlcHRDb2xvcigkZXZlbnQpIiAobmV3VmFsdWUpPSJvbkhleElucHV0KCRldmVudCkiLz5cbiAgICAgIDxpbnB1dCAqbmdJZj0iY3BBbHBoYUNoYW5uZWw9PT1cJ2ZvcmNlZFwnIiB0eXBlPSJudW1iZXIiIHBhdHRlcm49IlswLTldKyhbXFwuLF1bMC05XXsxLDJ9KT8iIG1pbj0iMCIgbWF4PSIxIiBzdGVwPSIwLjEiIFt0ZXh0XSBbcmddPSIxIiBbdmFsdWVdPSJoZXhBbHBoYSIgKGtleXVwLmVudGVyKT0ib25BY2NlcHRDb2xvcigkZXZlbnQpIiAobmV3VmFsdWUpPSJvbkFscGhhSW5wdXQoJGV2ZW50KSIvPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz0iYm94Ij5cbiAgICAgIDxkaXY+SGV4PC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPSJjcEFscGhhQ2hhbm5lbD09PVwnZm9yY2VkXCciPkE8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj0iIWNwRGlzYWJsZUlucHV0ICYmIChjcENvbG9yTW9kZSB8fMKgMSkgPT09IDIiIGNsYXNzPSJ2YWx1ZS10ZXh0Ij5cbiAgICA8ZGl2IGNsYXNzPSJib3giPlxuICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgcGF0dGVybj0iWzAtOV0qIiBtaW49IjAiIG1heD0iMTAwIiBbdGV4dF0gW3JnXT0iMTAwIiBbdmFsdWVdPSJoc2xhVGV4dD8ubCIgKGtleXVwLmVudGVyKT0ib25BY2NlcHRDb2xvcigkZXZlbnQpIiAobmV3VmFsdWUpPSJvblZhbHVlSW5wdXQoJGV2ZW50KSIgLz5cbiAgICAgIDxpbnB1dCAqbmdJZj0iY3BBbHBoYUNoYW5uZWwhPT1cJ2Rpc2FibGVkXCciIHR5cGU9Im51bWJlciIgcGF0dGVybj0iWzAtOV0rKFtcXC4sXVswLTldezEsMn0pPyIgbWluPSIwIiBtYXg9IjEiIHN0ZXA9IjAuMSIgIFt0ZXh0XSBbcmddPSIxIiBbdmFsdWVdPSJoc2xhVGV4dD8uYSIgKGtleXVwLmVudGVyKT0ib25BY2NlcHRDb2xvcigkZXZlbnQpIiAobmV3VmFsdWUpPSJvbkFscGhhSW5wdXQoJGV2ZW50KSIgLz5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9ImJveCI+XG4gICAgICA8ZGl2PlY8L2Rpdj48ZGl2PkE8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj0iIWNwRGlzYWJsZUlucHV0ICYmIChjcENvbG9yTW9kZSB8fMKgMSkgPT09IDEiIGNsYXNzPSJ0eXBlLXBvbGljeSI+XG4gICAgPHNwYW4gY2xhc3M9InR5cGUtcG9saWN5LWFycm93IiAoY2xpY2spPSJvbkZvcm1hdFRvZ2dsZSgtMSkiPjwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz0idHlwZS1wb2xpY3ktYXJyb3ciIChjbGljayk9Im9uRm9ybWF0VG9nZ2xlKDEpIj48L3NwYW4+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9ImNwUHJlc2V0Q29sb3JzPy5sZW5ndGggfHwgY3BBZGRDb2xvckJ1dHRvbiIgY2xhc3M9InByZXNldC1hcmVhIj5cbiAgICA8aHI+XG5cbiAgICA8ZGl2IGNsYXNzPSJwcmVzZXQtbGFiZWwiPnt7Y3BQcmVzZXRMYWJlbH19PC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPSJjcFByZXNldENvbG9ycz8ubGVuZ3RoIiBjbGFzcz0ie3tjcFByZXNldENvbG9yc0NsYXNzfX0iPlxuICAgICAgPGRpdiAqbmdGb3I9ImxldCBjb2xvciBvZiBjcFByZXNldENvbG9ycyIgY2xhc3M9InByZXNldC1jb2xvciIgW3N0eWxlLmJhY2tncm91bmRDb2xvcl09ImNvbG9yIiAoY2xpY2spPSJzZXRDb2xvckZyb21TdHJpbmcoY29sb3IpIj5cbiAgICAgICAgPHNwYW4gKm5nSWY9ImNwQWRkQ29sb3JCdXR0b24iIGNsYXNzPSJ7e2NwUmVtb3ZlQ29sb3JCdXR0b25DbGFzc319IiAoY2xpY2spPSJvblJlbW92ZVByZXNldENvbG9yKCRldmVudCwgY29sb3IpIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9IiFjcFByZXNldENvbG9ycz8ubGVuZ3RoICYmIGNwQWRkQ29sb3JCdXR0b24iIGNsYXNzPSJ7e2NwUHJlc2V0RW1wdHlNZXNzYWdlQ2xhc3N9fSI+e3tjcFByZXNldEVtcHR5TWVzc2FnZX19PC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9ImNwT0tCdXR0b24gfHwgY3BDYW5jZWxCdXR0b24iIGNsYXNzPSJidXR0b24tYXJlYSI+XG4gICAgPGJ1dHRvbiAqbmdJZj0iY3BDYW5jZWxCdXR0b24iIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Int7Y3BDYW5jZWxCdXR0b25DbGFzc319IiAoY2xpY2spPSJvbkNhbmNlbENvbG9yKCRldmVudCkiPnt7Y3BDYW5jZWxCdXR0b25UZXh0fX08L2J1dHRvbj5cblxuICAgIDxidXR0b24gKm5nSWY9ImNwT0tCdXR0b24iIHR5cGU9ImJ1dHRvbiIgY2xhc3M9Int7Y3BPS0J1dHRvbkNsYXNzfX0iIChjbGljayk9Im9uQWNjZXB0Q29sb3IoJGV2ZW50KSI+e3tjcE9LQnV0dG9uVGV4dH19PC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG4nLGVuY2Fwc3VsYXRpb246SG4uTm9uZSxzdHlsZXM6WycuY29sb3ItcGlja2Vyey1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlcjoxcHggc29saWQgIzc3NztjdXJzb3I6ZGVmYXVsdDtoZWlnaHQ6YXV0bztwb3NpdGlvbjphYnNvbHV0ZTt1c2VyLXNlbGVjdDpub25lO3dpZHRoOjIzMHB4O3otaW5kZXg6MTAwMH0uY29sb3ItcGlja2VyICp7Ym94LXNpemluZzpib3JkZXItYm94O2ZvbnQtc2l6ZToxMXB4O21hcmdpbjowfS5jb2xvci1waWNrZXIgaW5wdXR7Y29sb3I6IzAwMDtmb250LXNpemU6MTNweDtoZWlnaHQ6MjZweDttaW4td2lkdGg6MDt0ZXh0LWFsaWduOmNlbnRlcjt3aWR0aDowfS5jb2xvci1waWNrZXIgaW5wdXQ6LW1vei1zdWJtaXQtaW52YWxpZCwuY29sb3ItcGlja2VyIGlucHV0Oi1tb3otdWktaW52YWxpZCwuY29sb3ItcGlja2VyIGlucHV0OmludmFsaWR7Ym94LXNoYWRvdzpub25lfS5jb2xvci1waWNrZXIgaW5wdXQ6Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sLmNvbG9yLXBpY2tlciBpbnB1dDo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTttYXJnaW46MH0uY29sb3ItcGlja2VyIC5hcnJvd3tib3JkZXItc3R5bGU6c29saWQ7aGVpZ2h0OjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MDt6LWluZGV4Ojk5OTk5OX0uY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy10b3B7Ym9yZGVyLWNvbG9yOiM3NzcgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXdpZHRoOjEwcHggNXB4O2xlZnQ6OHB4fS5jb2xvci1waWNrZXIgLmFycm93LmFycm93LWJvdHRvbXtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQgIzc3Nztib3JkZXItd2lkdGg6MTBweCA1cHg7bGVmdDo4cHg7dG9wOi0yMHB4fS5jb2xvci1waWNrZXIgLmFycm93LmFycm93LWxlZnQtdG9wLC5jb2xvci1waWNrZXIgLmFycm93LmFycm93LXRvcC1sZWZ0e2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAjNzc3O2JvcmRlci13aWR0aDo1cHggMTBweDtib3R0b206OHB4O3JpZ2h0Oi0yMXB4fS5jb2xvci1waWNrZXIgLmFycm93LmFycm93LXJpZ2h0LXRvcCwuY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy10b3AtcmlnaHR7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50ICM3NzcgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXdpZHRoOjVweCAxMHB4O2JvdHRvbTo4cHg7bGVmdDotMjBweH0uY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy1ib3R0b20tbGVmdCwuY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy1sZWZ0LC5jb2xvci1waWNrZXIgLmFycm93LmFycm93LWxlZnQtYm90dG9te2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCAjNzc3O2JvcmRlci13aWR0aDo1cHggMTBweDtyaWdodDotMjFweDt0b3A6OHB4fS5jb2xvci1waWNrZXIgLmFycm93LmFycm93LWJvdHRvbS1yaWdodCwuY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy1yaWdodCwuY29sb3ItcGlja2VyIC5hcnJvdy5hcnJvdy1yaWdodC1ib3R0b217Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50ICM3NzcgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXdpZHRoOjVweCAxMHB4O2xlZnQ6LTIwcHg7dG9wOjhweH0uY29sb3ItcGlja2VyIC5jdXJzb3J7Ym9yZGVyOjJweCBzb2xpZCAjMjIyO2JvcmRlci1yYWRpdXM6NTAlO2N1cnNvcjpkZWZhdWx0O2hlaWdodDoxNnB4O3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjE2cHh9LmNvbG9yLXBpY2tlciAuYm94e2Rpc3BsYXk6ZmxleDtwYWRkaW5nOjRweCA4cHh9LmNvbG9yLXBpY2tlciAubGVmdHtwYWRkaW5nOjE2cHggOHB4O3Bvc2l0aW9uOnJlbGF0aXZlfS5jb2xvci1waWNrZXIgLnJpZ2h0e2ZsZXg6MSAxIGF1dG87cGFkZGluZzoxMnB4IDhweH0uY29sb3ItcGlja2VyIC5idXR0b24tYXJlYXtwYWRkaW5nOjAgMTZweCAxNnB4O3RleHQtYWxpZ246cmlnaHR9LmNvbG9yLXBpY2tlciAuYnV0dG9uLWFyZWEgYnV0dG9ue21hcmdpbi1sZWZ0OjhweH0uY29sb3ItcGlja2VyIC5wcmVzZXQtYXJlYXtwYWRkaW5nOjRweCAxNXB4fS5jb2xvci1waWNrZXIgLnByZXNldC1hcmVhIC5wcmVzZXQtbGFiZWx7Y29sb3I6IzU1NTtmb250LXNpemU6MTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzo0cHg7dGV4dC1hbGlnbjpsZWZ0O3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwO3dpZHRoOjEwMCV9LmNvbG9yLXBpY2tlciAucHJlc2V0LWFyZWEgLnByZXNldC1jb2xvcntib3JkZXI6MXB4IHNvbGlkICNhOWE5YTk7Ym9yZGVyLXJhZGl1czoyNSU7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7aGVpZ2h0OjE4cHg7bWFyZ2luOjRweCA2cHggOHB4O3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjE4cHh9LmNvbG9yLXBpY2tlciAucHJlc2V0LWFyZWEgLnByZXNldC1lbXB0eS1tZXNzYWdle2ZvbnQtc3R5bGU6aXRhbGljO21hcmdpbi1ib3R0b206OHB4O21hcmdpbi10b3A6NHB4O21pbi1oZWlnaHQ6MThweDt0ZXh0LWFsaWduOmNlbnRlcn0uY29sb3ItcGlja2VyIC5oZXgtdGV4dHtmb250LXNpemU6MTFweDtwYWRkaW5nOjRweCA4cHg7d2lkdGg6MTAwJX0uY29sb3ItcGlja2VyIC5oZXgtdGV4dCAuYm94e3BhZGRpbmc6MCAyNHB4IDhweCA4cHh9LmNvbG9yLXBpY2tlciAuaGV4LXRleHQgLmJveCBkaXZ7Y2xlYXI6bGVmdDtjb2xvcjojNTU1O2ZsZXg6MSAxIGF1dG87ZmxvYXQ6bGVmdDt0ZXh0LWFsaWduOmNlbnRlcn0uY29sb3ItcGlja2VyIC5oZXgtdGV4dCAuYm94IGlucHV0e2JvcmRlcjoxcHggc29saWQgI2E5YTlhOTtmbGV4OjEgMSBhdXRvO3BhZGRpbmc6MXB4fS5jb2xvci1waWNrZXIgLmhleC1hbHBoYSAuYm94IGRpdjpmaXJzdC1jaGlsZCwuY29sb3ItcGlja2VyIC5oZXgtYWxwaGEgLmJveCBpbnB1dDpmaXJzdC1jaGlsZHtmbGV4LWdyb3c6MzttYXJnaW4tcmlnaHQ6OHB4fS5jb2xvci1waWNrZXIgLmNteWstdGV4dCwuY29sb3ItcGlja2VyIC5oc2xhLXRleHQsLmNvbG9yLXBpY2tlciAucmdiYS10ZXh0LC5jb2xvci1waWNrZXIgLnZhbHVlLXRleHR7Zm9udC1zaXplOjExcHg7cGFkZGluZzo0cHggOHB4O3dpZHRoOjEwMCV9LmNvbG9yLXBpY2tlciAuY215ay10ZXh0IC5ib3gsLmNvbG9yLXBpY2tlciAuaHNsYS10ZXh0IC5ib3gsLmNvbG9yLXBpY2tlciAucmdiYS10ZXh0IC5ib3h7cGFkZGluZzowIDI0cHggOHB4IDhweH0uY29sb3ItcGlja2VyIC52YWx1ZS10ZXh0IC5ib3h7cGFkZGluZzowIDhweCA4cHh9LmNvbG9yLXBpY2tlciAuY215ay10ZXh0IC5ib3ggZGl2LC5jb2xvci1waWNrZXIgLmhzbGEtdGV4dCAuYm94IGRpdiwuY29sb3ItcGlja2VyIC5yZ2JhLXRleHQgLmJveCBkaXYsLmNvbG9yLXBpY2tlciAudmFsdWUtdGV4dCAuYm94IGRpdntjb2xvcjojNTU1O2ZsZXg6MSAxIGF1dG87bWFyZ2luLXJpZ2h0OjhweDt0ZXh0LWFsaWduOmNlbnRlcn0uY29sb3ItcGlja2VyIC5jbXlrLXRleHQgLmJveCBkaXY6bGFzdC1jaGlsZCwuY29sb3ItcGlja2VyIC5oc2xhLXRleHQgLmJveCBkaXY6bGFzdC1jaGlsZCwuY29sb3ItcGlja2VyIC5yZ2JhLXRleHQgLmJveCBkaXY6bGFzdC1jaGlsZCwuY29sb3ItcGlja2VyIC52YWx1ZS10ZXh0IC5ib3ggZGl2Omxhc3QtY2hpbGR7bWFyZ2luLXJpZ2h0OjB9LmNvbG9yLXBpY2tlciAuY215ay10ZXh0IC5ib3ggaW5wdXQsLmNvbG9yLXBpY2tlciAuaHNsYS10ZXh0IC5ib3ggaW5wdXQsLmNvbG9yLXBpY2tlciAucmdiYS10ZXh0IC5ib3ggaW5wdXQsLmNvbG9yLXBpY2tlciAudmFsdWUtdGV4dCAuYm94IGlucHV0e2JvcmRlcjoxcHggc29saWQgI2E5YTlhOTtmbGV4OjE7ZmxvYXQ6bGVmdDttYXJnaW46MCA4cHggMCAwO3BhZGRpbmc6MXB4fS5jb2xvci1waWNrZXIgLmNteWstdGV4dCAuYm94IGlucHV0Omxhc3QtY2hpbGQsLmNvbG9yLXBpY2tlciAuaHNsYS10ZXh0IC5ib3ggaW5wdXQ6bGFzdC1jaGlsZCwuY29sb3ItcGlja2VyIC5yZ2JhLXRleHQgLmJveCBpbnB1dDpsYXN0LWNoaWxkLC5jb2xvci1waWNrZXIgLnZhbHVlLXRleHQgLmJveCBpbnB1dDpsYXN0LWNoaWxke21hcmdpbi1yaWdodDowfS5jb2xvci1waWNrZXIgLmh1ZS1hbHBoYXthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLWJvdHRvbTozcHh9LmNvbG9yLXBpY2tlciAuaHVle2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUpZQUFBQVFDQVlBQUFEMDZJWW5BQUFBQm1KTFIwUUEvd0QvQVArZ3ZhZVRBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBQUIzUkpUVVVINEFJV0R3a1VGV2JDQ0FBQUFGeEpSRUZVYU43dDBrRUtnMEFRQU1FMng4My9uMnF1NXFDZ0QxaURoQ29ZZHBuYlFDOWJiWTFxVk8vanZjNmszYWQ5MXM3LzdGMS9jc2dQcnVqdVExN0JEWVNGc0JBV3dnSmhJU3lFQmNKQ1dBZ0xoSVd3RUJZSWkyZjdBci8xVENnRkgyWDlBQUFBQUVsRlRrU3VRbUNDIik7ZGlyZWN0aW9uOmx0cn0uY29sb3ItcGlja2VyIC5odWUsLmNvbG9yLXBpY2tlciAudmFsdWV7YmFja2dyb3VuZC1zaXplOjEwMCUgMTAwJTtib3JkZXI6bm9uZTtjdXJzb3I6cG9pbnRlcjtoZWlnaHQ6MTZweDttYXJnaW4tYm90dG9tOjE2cHg7d2lkdGg6MTAwJX0uY29sb3ItcGlja2VyIC52YWx1ZXtiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFKWUFBQUFRQ0FZQUFBRDA2SVluQUFBQ1RrbEVRVlI0MnUzU1lVY3JBQmhBNFUyU2ttUkpNbVdTSmtsS0ppV1pacEtVSkpza0tVbWFURkltS1pPVXpNeVNwR1JtbGlSTkppbEpTcEtTSkV0bVNwSXBtV21TZE83MzYvNkQreDdPUDNnVUNvV0N2MWNxbFNRbEpaR2NuRXhLU2dxcHFhbWtwYVdSbnA1T1JrWUdtWm1acUZRcXNyS3l5TTdPSmljbmg5emNYTlJxTlhsNWVlVG41NlBSYUNnb0tLQ3dzSkNpb2lLMFdpM0Z4Y1dVbEpSUVdscEtXVmtaNWVYbFZGUlVVRmxaaVU2bm82cXFpdXJxYW1wcWFxaXRyYVd1cmc2OVhrOTlmVDBHZ3dHajBVaERRd09OalkwME5UWFIzTnhNUzBzTHJhMnR0TFcxMGQ3ZWpzbGt3bXcyMDlIUlFXZG5KMTFkWFhSM2Q5UFQwME52Ynk5OWZYMzA5L2N6TUREQTRPQWdGb3VGb2FFaHJGWXJ3OFBEakl5TU1EbzZ5dGpZR0RhYmpmSHhjU1ltSnBpY25HUnFhZ3E3M2M3MDlEUXpNelBNenM0eU56ZkgvUHc4RG9jRHA5T0p5K1hDN1hhenNMREE0dUlpUzB0TExDOHZzN0t5d3VycUttdHJhM2c4SHJ4ZUx6NmZENy9mei9yNk9oc2JHMnh1YnJLMXRjWDI5amFCUUlDZG5SMkN3U0M3dTd2czdlMnh2Ny9Qd2NFQmg0ZUhIQjBkY1h4OHpNbkpDYWVucDV5ZG5YRitmczdGeFFXWGw1ZGNYVjF4ZlgzTnpjME50N2UzM04zZEVRcUZ1TCsvNStIaGdYQTRUQ1FTNGZIeGthZW5KNTZmbjNsNWVlSDE5WlZvTk1yYjJ4dnY3Kzk4Zkh3UWk4V0l4K044Zm42U1NDVDQrdnJpKy91Ym41OGZmbjkvK1ZjS2dTV3dCSmJBRWxnQ1MyQUpMSUVsc0FTV3dCSllBa3RnQ1N5QkpiQUVsc0FTV0FKTFlBa3NnU1d3QkpiQUVsZ0NTMkFKTElFbHNQNC9XSDhBbUo1WjZqSFM0aDhBQUFBQVNVVk9SSzVDWUlJPSIpO2RpcmVjdGlvbjpydGx9LmNvbG9yLXBpY2tlciAuYWxwaGF7YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSllBQUFBUUNBWUFBQUQwNklZbkFBQUFCbUpMUjBRQS93RC9BUCtndmFlVEFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFBQjNSSlRVVUg0QUlXRHdZUWxaTWEzZ0FBQVdWSlJFRlVhTjd0bUVHTzZqQVFSQ3NPQXJIZ0JweUFKWUdqY0dvY3hBbTRBMklIcG1vV0UwZUJIK2V6bUZsTnZVMDZzaEozVzZWRWVsV01VUUFJSUY5ZjZxWnBpbXNBMUxZdFMydUY1MS91MjdZVkFGWlZSVWtFb0dIZFBWL3NJY2JJRUlJa1VkSS85WGE3bmV5djYxK1NXRlVWQVZDU2N0MDBUV24yZnY2dTMrRWNmZDN0WHp5LzArbkVVdStTUGpvL2txenJtaVFwU2NONnY5OFhld2ZBOC9sTWtpTEoyV3hHU1VvcGNUNmZNNlUwTlg5L2ZyZmJqZXYxV3RmcmxaZkxoWWZEUVFIRy9BSU9sbkd3aklObEhDeGpIQ3pqWUptL1RKV2RDd3F1SlhzZUZGekd3RE5OZWlLTU9KVE84eFFkRFFhZUIyOStLOWVmZUxhQm85Sjd2ZHZ0SmoxUmpGRmpmaXY3cXY5NXRqeC83bGVTUWdoOTNlMWZmTWVJcDZPK1lRamhvL043OTF0MVhWT1NTSTdOLy9LKzQvR294V0xCeCtQQjUvT3A1WExKKy8zT2xKSldxeFUzbTgzb3Z2NWlHZjhLallObEhDeGpIQ3pqWUJrSHk1Z2Y1Z3VzdlFVN1UzN2pUQUFBQUFCSlJVNUVya0pnZ2c9PSIpO2JhY2tncm91bmQtc2l6ZToxMDAlIDEwMCU7Ym9yZGVyOm5vbmU7Y3Vyc29yOnBvaW50ZXI7ZGlyZWN0aW9uOmx0cjtoZWlnaHQ6MTZweDt3aWR0aDoxMDAlfS5jb2xvci1waWNrZXIgLnR5cGUtcG9saWN5e2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJJQUFBQWdDQVlBQUFBZmZDanhBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBQWx3U0ZsekFBQUNld0FBQW5zQjAxQ08zQUFBQUJsMFJWaDBVMjltZEhkaGNtVUFkM2QzTG1sdWEzTmpZWEJsTG05eVo1dnVQQm9BQUFJQVNVUkJWRWlKN1pZOWF4UlJGSWFmc3hNU3RyTFFKcEFncEJGaGkrQzl3MVlTbzAwSTZSWi9nOXZacEJmL1FPcjRHeVJna1NLTlNyQWFkc1pxUUd3Q2t1QVd5UlpKc3lTd3ZoWjdOL3ZoenJnYkxIM0xkODU5N2pseno1MHpKb2t5eFhIOERxRFZhcjBxaTZ2OEJiSXRxU0dwRWNmeGRsbXNGV1hrdlg4QWZBVldnM1VLUEVuVDlHS3VqTXpzQUZnWnNWYUNOMVZUUWQ3N1hVbnJnRTFrdis2OTM1MjY4V1JwenJuSFp2WVJXQzdZdkMzcFJaWmwzd296cXRWcWl5SDlJZ2pBc3BrZDFHcTF4VUpRdFZyZEI5WktJQU90aGRnL1FjNjVMVWs3d05JTW9DVkpPODY1cllGaGtxalg2L2Q3dlY0R1BKd0JNcW9mVVJTNUpFazZGWUJlci9lZVliL01vOVd3Rm5QT3ZRYmVBdmZ1QUFLNEJONHNBSnRBRy9nSklFbG1OdWlKeWJhM0VHTm1aaVBlWnVFVm1WZWxsL1kvNk4rQ3pEbjNBWGhFT09vN0h2LzNCZUF6OEl6UWtNUG5KYnVQeDF3Qyt5WUo3LzBuWUlQNVMvMEZIS2RwK3J3Q0VFWFJTL3JmNUhsMUd0YjJNMGlTcENPcENaelBBVG1YMUV5U3BITUxBc2l5N01qTURvSHJHU0RYWm5hWVpkblJ3Qmg3SjkxdXR3bWN6QUE2Q2JHM0dnUGxlWDRqcVVIL2ExQ2t0cVJHbnVjM2hTQ0FNQjMyZ0tzcGtDdGdiM0tDUU1ta2plUDRXTkpUaHJOTlp2YWwxV3B0VElzdjdKdFE0dG1JZFJhOHFTb0VwV2w2WVdaTm9BTjB6S3haTlBlaHBMU0JadjJ0K1EwQ0o5bExuQVJRTEFBQUFBQkpSVTVFcmtKZ2dnPT0iKTtiYWNrZ3JvdW5kLXBvc2l0aW9uOjUwJTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1zaXplOjhweCAxNnB4O2hlaWdodDoyNHB4O3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjEycHg7dG9wOjIxOHB4O3dpZHRoOjE2cHh9LmNvbG9yLXBpY2tlciAudHlwZS1wb2xpY3kgLnR5cGUtcG9saWN5LWFycm93e2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjUwJTt3aWR0aDoxMDAlfS5jb2xvci1waWNrZXIgLnNlbGVjdGVkLWNvbG9ye2JvcmRlcjoxcHggc29saWQgI2E5YTlhOTtib3JkZXItcmFkaXVzOjUwJTtoZWlnaHQ6NDBweDtsZWZ0OjhweDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTZweDt3aWR0aDo0MHB4fS5jb2xvci1waWNrZXIgLnNlbGVjdGVkLWNvbG9yLWJhY2tncm91bmR7YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQ2dBQUFBb0NBWUFBQUNNL3JodEFBQUFoMGxFUVZSWVIrMlcwUWxBTVFnRDYwemRmd09kcWE4VG1JL3dRTXI1SzBJNWJaTEl6TE9hMm50MzdWVlZiZCtkRHg1b2JnQ0MzS0JMd0oyZmY0UG5WaWRrZit1Y0lodzgwSFFhQ0xvM0RNSDNDUkszaUZzbUFXVmw2aFBORHd0OEV2TkU1cStZdUVYY01na29uVk02U2R5Q29FdkFuWjh2MUhqeDgxN01pbG14U1VCNXJkTEpEeWNaZ1VBWlVjaC9BQUFBQUVsRlRrU3VRbUNDIik7Ym9yZGVyLXJhZGl1czo1MCU7aGVpZ2h0OjQwcHg7d2lkdGg6NDBweH0uY29sb3ItcGlja2VyIC5zYXR1cmF0aW9uLWxpZ2h0bmVzc3tiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFPWUFBQUNDQ0FZQUFBQlNEN1QzQUFBQUJtSkxSMFFBL3dEL0FQK2d2YWVUQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUFCM1JKVFVVSDRBSVdEd2tzUFdSNmxnQUFJQUJKUkVGVWVOcnRuVnVUNDdnUnJBSE4rUC8vT3IvNjFZNXdPTlo3bVoxdTNYQWVMTWpKWkdaVmdkS3NmYzV4UjNTMFJJSVVXK0NIekNwYzJNY1lvN1hHdjNleDdVaVpkNTdyanl6enYrdiszM1gvUi8rM3IvZjd2UjM4NlkrVHZLTmNmL3dkaFRMUGN2OXFVMndaZDc0dXRoMHQxODIxamtJWkxQY3NJLzZuV2E0WHZ1dHF1VTBaODVtbng4MFMvWnpncG5Mbk90SE50Ny9vZngxVEtYY1NOek4vN3FiTVEzanU3ck5RbU1ZWWQvNHMyajlhYStQK2dHYU1jWnJiMU0vdGRydmY3L2Qydjk5UDkvdDkzTy8zY2J2ZHh1MTJHOWZyZFZ3dWwzRStuOGMvLy9uUCsyKy8vWGI2NmFlZnhsLy8rdGZ4NXovLzJZSzVBbDJyZ3ZmNFVzYnBkR3JCNTJiQXZBclhwdXpqbWlxQVZTR3o1ZURtR1lYemhiQVptQ3JubXpkZHBVVSs4WTFkQU9ZZVhDdERVd1Z3VjdZQ0dINnVBbXlNY1o5bDV2a1VhQlBHTVVaNy9KNXcvNzkyL2Z2djlYcTkzMjYzZHIvZlR4UEVDZU1FOG5LNWpNL1B6L0hUVHovZHYzMzdkdnJsbDEvR1AvN3hqL0czdi8xdC9PVXZmd2tWc3dvbmdqZE9wOVB6SDNVM0Qzem1XR25aVlhuNGpDcXM3d0MyQktQNC84dEF6a1pzb1d4NlhycWVIWnltdnA0QUJDQkpoVFF3S2ZEVDhnenJaQ0lxaTVBaGlBQ2pCZkVCMnJQOC9YNjNNTTdmNi9WNnY5L3Y3WGE3YllDODNXN2pjcmxzVkhJcTVmZnYzMCsvL2ZiYitPV1hYOFpQUC8wMC92NzN2NCtmZi83NUpTdmJldStiTDJXTU1hRmJBbHBCTk04NVFYK2N0NnFvU3FrUEF3dVFsQlZLcUdORlNVT0FBM0JtdTdnQzVoTk9kMTVuU3d2QU9VVzdDNGdpVUNWOFNnbjVMOWhORklxVHNwMEd4STB5c2lveWpBamtZL3RHSlZFcHorZnorT1dYWCs3ZnYzOC8vZjc3NytQYnQyL2oxMTkvSFQvLy9QUDQ5ZGRmeDhmSFJ3cm1UalY3NzlFWHUycHgyeGhqd3RkSlpRY0FXUUlQTFBJU3NNSmFTd2lEOGd6SUtyd1N5QVRFNWo1bkFiUjVjMWRCVXdCbHNFV1cwaDZMcWlZc3FGUEFReEN5Ulozd09TQVJ4bWxYTVg1azY0cFFmdnYyN2Y3NStkaytQajVPSHg4ZjQvdjM3K1BidDIvanQ5OStHOSsrZlJzZkh4L2pjcm1VRkxPMzFnWURXYmx4UklzL1RxZlQ3b3VzeEpzQXhYQTJHYzdUQTlYZGdmZG9IYkZzajc2WDIrMVdBcmdJMWFnZUd3QTNxdXBxb0hzbWNiSTZGdTkzcXVnZ0ZhOWQ3TGVEdGdLZkFGSEJKK05FQnlJa2NKNUtlcnZkVG1oaEdjZ0pKU1o1dm4vL2ZqK2Z6KzE4UHA4K1B6L0g1K2ZubUdEKy92dnY0L3YzNytQajQyTjhmbjZPMisxV3M3SmpqUDZ3cmFNSTVFNFJaOHgydlY1VFN3a3F1b3RWNy9kN1R6NkhGV3NEL3FOY2R3MENRM3EvMzIxYzY4NlR3RFZJZGJ1eTczek5sZGhTSGI4STJrbFp6bm0rSW5CUzRVNm4wMzAyYUJGc0xoSERBS0pWSlZnbGZJOWpodnU1M1c1M3NMQU5ZTnhBaURBNk1DZVVIeDhmOSt2MTJpNlhTN3RjTHFjWlc1N1A1eWVZOC9mejgzT2N6K2Zuc1NtWVV5a25XRUc4NVdCc3Q5c3R6U0x5TWRmcjlRaTA4aVkxNVVaMExsREdMaFIzbzV6SzJqN09QVVREMEUrblUzdGs3WGIvMTZORmJobG9BTXVZMXpqTFVPTzNCS2VJRGUrWjhzMy9KNGdGbzRUTTVqUG11UmcyOGZvVUtLVlN3bzE2VGdBNW5weXdjV0xIZ1lsL1B6OC83My82MDUvYWI3LzkxbTYzVzd0Y0xpZTBzWmo0bWFvNWdUeWZ6ODhFMGYxK2o4RWNZendUUEVHMmNxanlmSE5GME04ZnVxRWlhT1ZuUnpaWlFOaDVmd1F5SGcvSERHZkpvODlRMXpiL3F1dTVYQzY3NzNJMlhLZlRxZC92OStkM3d1cVd2YS9ZVGRVZEVWM2ZoSXYvVml5cHM2WUUzeDNyNDNLNWJKUVM2NnpheFZHRnN2ZCsvL2o0YUYrL2ZtM2Z2Mzl2dDl1dGZmMzZ0ZjMrKysvdGRydWR2bjM3WnVOTEJhYUNNZ1V6QytyWlJpRm93eFV1Skk4WU1xY0NwOU9wcTV2YWdhWVU2bEdKQTFYUXFlamNodzZDajBHdzVuWUJyR3cwMUEyTzIwNm4wNEJHb3VOTnlUZnAvRndFbGhVZXk2blhySUt3N1FRV2RkeHVOMmxkTDVmTDgzOWdTUEY4YWh1L0p2Qk80OENQU3VxTWY4VnA5L1A1M0w1OCtkTHU5M3M3bjgvdGZyOC8zOS92OS9iNStUa2hQSjNQNTZtUTQzNi9qKy9mdisvaVNnYnplcjArQVp4LzUrODhidjZPTWRhNlM1ejZrZDIxZllDOWR4djdjSUpKMmQ5QU9TMzBmUE16eUhpVE04QjRERjZYVWxZSHA0S1FXM1crMXQ3N01OQjF2R0h4V3E3WGE3dmY3OCt5NS9ONUErSDFldDI5eHVQNWRiWXR5YVJ1NEFrc2JQcTY5MzZmalJ6WFJ4QmJQci9iK2IxOCtmS2xqVEhhQkJCZm44L24wLzErSDErK2ZCbm44em0wc0I4Zkg1dTRjcjVHdUJoTVZrMEVFbjlSc2N0Z1ZoTStpeGxKdE1BMjNSOEI2eXlzQXN0Qk9nRlhJS0tDTUlnVG9NcU5FdTJmWU1IN3p0YzczMmRRS2tDajF5dEFadFkwS3g4cElyOEdHSitBVDNWKzJIaXJobCsrZkJtWHkyV3o3M3crYjE3UDhwK2ZuOC90VXdHVmxlVmtUeVViNjhEa2ZheVdZNHp4TlJpaFU0RXBMSlBaVnJLK3U3SjQvbWdmS3FlTFc5WDJSRVdsSXRMMWRpeW5iRERiMytqWGdZalFxbjBycnhXYytOa0lMUDdGN3hJYk12eDd2VjUzeDQweG5sYldKRjEyWlNhZy9OMHBXNnQrWnptT016SGphakt3RGZvbmQ3OHpZVGRmcTE4dXA5N3pyMnE4djNJaW9CcHJSdEJsMEVaOW9nNVdCUkdPZE9IaklqWEY3VW90RmJnT1duWHpJSnl6WXZqRzVJWWdzbU1PeEhrejhPc01TclZOV2VxNVQ4RGFPY2JFdjFPZDVyYnM5YU83WXZNZXQ2M0VrRisrZk1FeHErTVJsNC9MNWJMWk4vK2V6K2ZuWjZLYXp1TXFYU1FWTzVzcEpYZmxIQUl6ZXMveEpzZWNrUkppRE1vZzlkNlZmUnJxWE1yNktwVlYyN2pSd0phY0dvdk9BTTF6TWRRTW53SzFBdWJLNjNrZENDaHZJMUM3ZzB6OW5mL0QrWHplMlZqOEg3R3g0UDlkdVFsc1lDcnF5TjhYcUczSG0vMTBPajNqdy9uK2NybHN0dU0ralBtbXhUMmRUdVB6ODNQenQycG4xWHNFSFgvYm5QYVZxVm1oMHh3T3QwbzZYTExBSGVQVVUyMDN3SGZjcnNwQ3dtVjNUcnlCNXMwTXNlZWc5N3gvQnd6Q2pCbGJCK3BSQVBsYTBCVlF1VDZWNlFIZEJsajNkMEtHMTQ3YitEcXhRZVV5bURPNDNXNGRRYXIrVElqd21BZDB6OC9oNjV2ZjAveUx2M1BiNVhMcHJ1L3lkRG85czdFVDBJK1BqNmRLSzlWVUVJZUtXUVdQQU9ySjhMS2Q0dkUrdDkxWTNlN1VGbFdhdGcyVndKbmIrSFBtdHZtL3NmSzU5L09hV0YzeC9lUDFVUEh2QTVERFlEcFlYZmIwZHJ2MVYyRGtCa3h0dy90RVdWVmxYV2RDOXBGWXM1L2pmaDlkUy8xNnZXN3M2bFRHK1RmcXN4U0pIeGtYWHEvWGRyMWV1NExzZkQ2UDN2c1QzTjc3RGtMK3pQbTVqU2RLTDR6UjNBeFFkNnJIa0xrWWxTb3dzcnE3em56dTZ3U3dkc01KT1htQTVmQmNqeHRnTUdCWUhscjV6b2todHNNQ1RnWExRT1c0WEM2ZEV5RU1wckw4bUFRelhSZ2R1aXgyeVp6b3J4a1lzRG4zaEIxVmVNTEdzWHNWdGdsMnBXOFMzc3ZrMHZ3N1I0aE5hSHZ2NGNBQ2w1SEZ6d0lIMEtjNnp1NFhqRFBSL2pwQVZ4V3pPMVhrMkREYjN2VGN4ZUdVMWlXWkhrbUlEV3ppV0t2aXJDSjREcmF2czZJSi9HRzZjVHFXZFhEeStmQXJRRFZWa0xxa1ZqQW9aSUlUZG1tSXFYd3FhOTVOMytNR1lvWlFkUlZOTzUzWTF4UmtoTzE2dlk3ZXU1MDdDYTlsSm5iR3B4T2VtUWhTdy9BUXNtbXA1elU5QmlVOEc2d3ZYNzZNNi9VNlBqNCtkbzBCejRDcGdpa25UVWVEcXdsS0JtZzN1NE9WanJaMUErckFjZ2FlaldxNmVKQ3ZDWUZET05Td09nSFg0RVFSdzhseGJ6RE9kRUs2Z1ozSGsxYis4ZzJvMUpGdEtYeXYvZkVkVFh1V2pXWGRBWmlCcDZBRGVEckNGaWltN0I2WkZuZWVJN0d2bS9QTWtVRFg2N1c3eEk4YjBENy92OGRBOXFmTjVvYUNmNzRXWmpIMG1mMWNtZlkxWTBKVUZtVnJUV3U4dXprTmNMdEVqN3U1RlhCVGtmQzZHT0E1cThZTXhPOEtWdkY2c0FWR2RjclVic0tPRGNRS2tMTU9NZG1seHVtNjQyWXJQbTI2QWxoWlcxWUIxUityckdzd0U4VGFZQVdlVU14ZGYrV2p3U3ZaMkVmM3l0T3lmbjUrUHBWUEFhcU9uNDNNdE5CcXZtamp4YmpNNGxaalpZNGdxTk1JNWt0YVcvc1lLTndTKzlsRlF6R2lobU1DS1BhNytaMFY2RWIwR1Jtb2J0cFg4SmxqV3U1Rk1MTjVqYTZoRzlrd1FnWnFmNSsxTkg1VXh6a0ZSZUNkV2hKOFhkbEdVa3hPN0hSbFlSbTRtVk80M1c3dGVyMTJUUEpFdy9ybUVOM0w1U0tISVdaZzlteitwVW9LT1lxNWJKVEpkWDJnbWUxVWN4TVpRRmFFUUlsSGN0MzJNK1kxQnpHa0d1emZpeUFOOXordWdwbFoxc3ltQ3JEQ1lZa0d4RFRwSTlSekJ5MHJIeWVEVUMxbldhZVVhRDluNHhrTnlZTUJEWnR6WjNCKytmSmxZMjFYRkRPY0FSSmxhYk95aVMzdUNwTEk5anJaakNEa2FWdmNDQ2p3b2duS1NoV2R6WFpXbFpNdlZUZ0Q4THBxbENMcnFnYmNCK3FZd3JnS1lwVDBjY0NxYkt5Q1ZhbGtFYWJuL0Z5bm9nQ3JQS2ZxZjUxeEo3c0dCMlpYY1pteG9TT3p0angzMDBEWmk3YTAvMkFJUjBVbEJhZzlTdUR3NktjQXpsYUI3dkhadldwaks5MGR5cnE2Ykt5RFVaUWJSMEIwNWJpTFFrSEljU1VtZ0lLK1N3dXFnSENub2lvMlJRVTF5aitCbkJ5OXBwaFZLTEd5QzdaekZLMXB4V0srRThJaFZDV0xOL3VMdG5VVTRheW9ZTG9hQU56OEZkdGFTdlk0cFYwQkVXMmxzNjFjenFsbEJLcFR5S2dNQWhyWjFjZGMxUlJPdFBtdldOa2RjS1o3Wkt4YVdqaVBMSk1wcDdPWkt4QStycUcvb0pManhmMHBuSmxxTG9EWm8zZ3lVMG1LR3lzMnRhS2Vjai9kMUMrckpTcGxCcWxUeUFxZ1IrRDhLaktsbVJMMmd0VWNBZEN0c0wraWpDTlQxb3FxcWtIMk9IRWJHNXNERm5VZzVBYSt5TG91MlZVMXB0ajFTMlpRcXYxT1JaTjlJV3pSZmdhUkJ4S29CRThVV3lxbEpGdHJJYzBBeE5qU2plZDk5Q1RZL1hEZlN6Q3o1TTBJWm9WRXNXblBGTlRzbDhvb1ZDMVR6YkdncUZaTkRTZ1Z3S0srMXNHRE1LcXhaQ1dHVk1EeXNpRXIxalZTUUpVWXdqNWlIT2xUaGRIdDQ0U1FnOUNOK25sOEQ5ME5NSWdBZGdyNDZKcVJpUjlJOHZSZEZ2YnIxN20veXhVTUtqTkxNaVZVQUR3dTJDV0doaGkrRjU1VFdNOU05Y29nem1zMWRuTTR1T0YvTEFFWVdkY3FuTTd5Rm15cTNJZndtT1JPZDdZMWlGV3RPam9ZOFRvNDFtVFY1SXlzZ0ZGdVJ6c2JXRkdiTklJSkNEdjFkT280bFpHN2pXQndSRnRWVEt1V3llQ0J5SktPYW44b1ozZXA5WGRkTmwwdER1YXl3THo5Y1hQWWVEQUEwU3BrQk85c2JWY1RPVldsZFB2NHV5ekVrenhIdGp2b25Ib1NrRkVXTm9vMWQ4RGhjUXB1dGQycHBOb240QnpvQWlKMWhCRlFnMGRWdGRiR0hIRFFXdXNobU5FUXVrTE0yUU8xRzJZOGJnVFhxRmhjQkpqN0VqUGdjUHRzOFVTOHFQcFBCL2RYem5PaDVaNDM4dHpINWVjNlFnck9LclJSZktteXNCbVVEQitQaFlhYk1sVlBFUitHQ1NJVFR6cjdhbTJ0QXJIM2JnY0V6UEptK2NyNWpKNE5uSE5GRFZyRlhjSTVMZTlrNUpudytiZWRiVitGZlJ6WklIYU9PYU9zTFkwLzdVR3M1OERqckd3S01JTUZJR3pPRVcxL2pHc2RBdENONmhFQUk0aEJlOVlYZVJST0JTVlBBVlBBcXZJTTVieDVoVktXQU1QNnpCUnkzaWVzY3JpZFZkRkJpbkJ4WERuRzJHUlkyWGJDdnAxbGh2R3RPOUJ4dTVoOTA4WFF1NDJsblNBck1GZGl6TWltOHV3UkN4UEdubk9TOGx3cG5iT2lEcVRBanNyUk4vUGNvQVNjQ2JhQUNxVk00MHlsbmpqVEJzK2J3V2xBRzIzL1VLYmRraXdLV0lRUEd6V2FjenBvU2x4UEVqODIyY05Xa3BTN0Z5enNEcnFwZmdwRzNqYWh3MnZnYmFTUUF4dUxXWll0N0p6eU5lOEpvWnBOQWN2REZPZHcwd3FZVDlBSzFyWnovRGRiU2xMUHAwcnlJeGdRSmxLOUFabEVxN0lPWHBvaGc5UElockNuZzg4SnNPeGlWNFpXQVlmZzRzaWt4LzhreTJaOWw4NjJ1cXdyZnNjSUg4K3VnVG1WR3lpZGRlVllVZ0VNbjRHWnpnMTRFd0lzaDlzeDJjS0tpV1hSZXVPRTVnekdPUWdkbFJLVlZkbGV2cWIyNzlYcTBRbnN0czJWRGFCTzBjb2V6c3J1V3RIQXB1NnNLRzRJQmhOMGFHVTJrTHJNS0dSVE4zSG1iQ0R3S1YxNHp2a01FREc0UWZaVnNwVmxhTlUybWhjNVRFWjNOMWgvenFUaGV1THBXMDVaV1RHVmpiM2Ribk5teEtaQm5OOEpxaWRhVkxLQU95QVJOTFMrTUI1NFoyK1ZhcW9NTEtyb1ZCbG5nZWZuVFBBY29ITldDU3ZsZkE4Q0kwSEVtQk5CbkJsWHlNcnpVN0E3V1ZtOTRQUHFRMmdtcUt4K1dER3NudmlsbWNTT0JKcU9LMW5ZeUFJenVBeWVzcTNVZFNLM0tmV2NZS0Q5NUhtZllPVTNxc2VyMkN0WUVVQStGcGZxZE52Z1BCWlVCaERyR09OUlZsUXNoOHJMY2FVQ3lrSEcwT09Vd1RsTEJyc2g1c29FTUdlemkxRTRIUlZ0MWljcDV3WkVGWGRpYkNrRzhZOHZYNzVzYk80RTBpb205eitoalNpT2Z5M0RocFhJdHBWaEUrVUdRZHZvV2p0Q2htckdIZjRZQXpLZ0JObkd0dUp4RkNlR2RoVUFmUUxMSzhrQllBUDZndkZKWmFqTUczWGt5Y3k4S3VDMHE0RXl5bXd0d2R4ZHYyTTBtSUJ0SzBMS25mNjQwajAwQXVxNGdVa2RXR2xoczIycUpjNmRaQ3NMMTlveG5sVEpHNFNZVlJJR3BEOFRQRkJ1TTZPRWxiUzFwbGRpZDRtR0F5TjZaSXVwYkM1YlhKTjlmZHBiVGhTeExVYUk4SUcxWElZQnhXM1RqczZLUW9zS2N4ZnhjUW1kbndSR00xMEduRmNDeTJYWXVuTE15QWtkZ2s0bWVQaWN6c0x5Z3RoY0J1dDZnb09xUzdZVkZYQURMamFvc0I2czZvZmNaV0FaU0lSWXFTVWtpell3dHRZYWIzdlVPUTl3MkhSeElJZzhXd1JWZUU2OHhpNFV0TDN6UnBoeHBsend1WnJjcVlDcTFJM2pQSTVkbkpJeWdFb2hNYlBxVkpTenJ3enhCSlRzNXpOK1JlVVNneGlrUFFWRjNKVkJlTlF4YkhFTnJFTU52RWRGWlZWOWxIOStPUkdFc05aUXB5VE5jNEMzQUc3WEY0bmd6cStEck8yemJ1YWFPWGdkYUZjZGtFb3RvU0ZCVlgycUowQzhPV1plRzRLR2xwZ2hBMFhmVE9QQ3FWMnFxd1EyNlFXZkYyUE1MaEkydzFsVkFhMmFQc1lkMHphMjVNUVJ3Z2NaTjZ1UURDaStaeGlENFhFTTJrWnhPVDQxRm5abmFSbGNwWm91emxScXFkYlFWV29wUW9TQjU4UlY1MGxCTnJIaS9Bd1hTNUxyd0RWbHBZM0ZjM0J5aVlHYzUyVHJpc3Q2a09YZHdJbkFRdEpwcDVRY2h5YXF1WU9WN1N1K2Z4Vk1hVjNkYzBSRTJTNm1VWTBnTHQycE1jWXFyS0lROXcybDFncFFVTXRRWWNtbWJ0NURUTnhkaG5VQ2pRcXRiSzlTVVN6dnJDMG1taGhFMWUyRlMyK294eXB5L1pBU3V0a210angzdmNCQzI0UFg2NW5icWtCQ1JoZmpTOWtJWVBuZWU4Y01hZ1ZPaEkvM1QxZkFtZHRBV1pzQ3N3VEpDa1FWTmEwcVdLU0tQT3BIQVVoRDlEcmJWY3lvWWt3cWh2aDE3dllBYXlYTFF5S0dZZHhsVURGcDQ5NHJCWFJqWWdPMTdERFlldE5JVWovZXpwNlMwbG5scEV3c1dtSk1rT3dzS1hlWktFQWpJSG4wRVFKSVNhUkJjTzZVTUlOejdwL2JFampudzRmdCt4bUR2a3N4WDRHMnJJcmlzN3FhZUt3QUZNUDJPaTduNGNyaXVad3RwU1V3cGZMeFNuT1JTcklxdXNjNVpGYVh5c3FSV2ppWjJEeUFXRUlMMzV0VlNvUUVsRkFDak9lR0dTRTdBSEVRZ2RvL0xTdkNPZ0dCdmt4c21EYnZsUzNGcDV2aGFCMlRBR3FSS3JLS01yaExWcGFHekVWalowT1F4RGhhQ1RBK1F5UlIxZDE1YVF6ckpudEwzUmlic2lwakc2amxnTDR5cWJTMHNOWWcxZTg0dmhiQlZyRWxLNjRDVWNXWVhEZkt4aHBJdXhpVkpaVXhzYk15L3VSQktUTlJRNGtRM0xkUllMUzBySmpSUGxUUHFZNmdkSnNFRGMrYVFYQW4rSGdzTlVDYlJ1RjBPajB6d25BN2JXRGtiaE81RW5zMDBxZVFoUzFsYUJNbDVNL2NBYXhzTEY4ckt5cWwrVGY3RUxMRUd1L2l4aWltZEN2bzBUamZwakt3YWdnZW40ZWg1djdMb2tMS2JMdXl2SGhjWkc4ZGhHckVEeDdIZzkzWnBwSkY3cUJxTzNpVnZlWEVEUU5Jbnplb2U4WXE2ZVBhWkJaMkp2aU0zVzJVQUdvdGVrUkNBR3E0RWtGMVgzRE9uUjExeVJzQkwxdFJhMFBWY1ppTkZYWjJjMzRGc2t2b21JblFRNmx6cEpvWmJKeGs0M053S0pGQnF1SlNzckJ5SHlkeEtPblR4UUFTQm1TM2orSk1uc0hTbGEzRWM2SzlWV29KVm45emZqd09NN2hxWUFBcUpRd0UyYTNuQTQ4SjJRR2VnUmtwWk5pdlNZK3lzM0VrS2Q0b0pJd3N2SUhsM2NXZ0x0NWs0Tkg2T210TFdkcHVyT2t3RU11cFljN2VNdERSaE9jSTJ1aTVKaFZJelh6THl0by9HQVB1Wm95bzh3a29kdVZnSmdsQ3Q3T2hHYmdJRDRNcTRzaSs2M3pVUzFGdUZGWEZscXlhajJlbUhsTE1jQnFZdTBGTXVSMjhCYkI3bE94Uk1TaUNRWEZoQ0t1d2toWitwWURpR1NnYnNLS1Y4TWlTUnN1SFNJV005cmtsUmlJbFpadXFYanNRSzhvb1lKTWdxM0pLV1ZraEhiaHNWeEZVenRoT1dQa1lpamNieDU0SUtzU2RUK3VMcjNjckdLeW9ZZ0ZpR1I5aUJrNGtmbG9VWCtKSWxRUlFxYWJtcGduaHF0cFFwYjZSVlExV0g1RG5yUzRoRW9HWnFhZXJRMmRoRmJ6OFhlUHhTaG1EYm83MGVJU2pvb3JPMnZLOFNKWEk0U1VtRVU0eldLRHpVRHRXVFl3N3hYbGJTVEVqNEZSZzd6S25Lb0dSQUx2MEdzOVRnYzFCcEN5d0daUlFBdHFWejJ4ckJjQU16RXBmWndGU2EyRzVXMFFCRmpTTWFwV0FFRmEzSGNHTjdDeER6RUN5SWtKOTdxd3JxV05UV1ZvODc2UFBzalBrajJ3dmdyb001bExaS01FVEtWcWwvQ3ZuV1ZGaUZhL1N6SlVRd2tvWnNyNjdZNnZsU1JWMy8ydG1OVE9ZM3ZuYXhZd011b1BLcWR6UjF3N0lxSHltbFB4YUFUaGZVN0tvMlpYWWo0QVlKSEwra05kS3dSUVlFU1RSYTVmc1VaL3JWQzFUTVR5V1Z5WW9xTnR1emFIc015djJ0dm9hcnhkZnF3WWdVMWF4Rm8vY25xbDFGR3NxSyt1QVJPVjhCWDRHVThXY1pUQVRpMnE3UWN5aTBPMFYrR2hXQk1OUlVrbjhIMVNzV1ZFNUJ5M0dpMEVDcVVlSm9CZkF0RGE0YW1rZFhHMzdBR1A1R2dlYjg0cDdVYXpwb0tSemRGemVROEhrb0hHeHByS3kvSHBtNXQxMnA0N0o2eFRZREV6N3VJTkVYU3V4WVh2RnNrWUFjK3lTeEg5c2Y1ZnRLelU2SWJ3VkJjVUdnNWU1Rk1DRVhTRXJaUjB3R2F5VjE5d29NOWd1UGpUcUpkVlRxUjR1RTRuSm5MbGRXVmtFQ0NaTGQyVkxGK3h0YW1leDdJcGlyaVNEVXB2cnBuOWxyd0dNQ0h5cHBNSCtwczZMSUxzdUZHVWoxWEVPWGlxYnFTSFBVS25DbHBXVjY4a3F0VVJWTkRZNFROYW9jeWtvWWVUVTVuZ0dFUWEvUzFEbm5FNEFlWE1jS2pIUEFtRlZqQ0JFTmFleUxWTkhmcjNweDh4VXN0Sjk0aElwZkg0SEtFL2VEYUFySzZsU3lWVkZiZHQxZ3hUSVZrM3BwcFZsRlhpNHBFaFZCVE9icXVvaFU4NU1MWG4xaWFodlVrSEpqU0NNYzAxdExGdmVWVkJ4MERvZE02amZ0Q3U3RE90SXpZeHJjMHFwMUpHUDJheVlGejJHYjZIdk1yTzhjbkd0VjZHam0zdUltU2ZEMkdwV0s2dW93YlpHTXhGS1FDbzFwT010Y01YRnBSc3QraFhHb0FvbUYzc1NUQkdnVGdsYkJLV3dzUTN0WnFhWVNwMFoxQ2ltUkRXRmNDSlVQWUowMEJJNUZrS1lOb2lmdVF4bU44OFNXVlhXTE1hVXFxcWdDMEJtUUpSNnNrM3U5TkNmNmpZTFh4QWZxc1lFZ1ZMQWhSWTJBdGd0ZmxaTkZtRnloeGRyTGtBZFdsazREODhNMml4SHllcElkaE1IckcvaVIxWkd0cTBNR3BiRGJSUFlPWGVTWTFNNk55NFpzdHZHU2t0SytYYkZQQVRqMkQzNzFzYVBFc0FNWGhYcnNaMGttL1hTdGtoaE15QmZzYTZ1WEZaZTJWQ2UrWU1yMStHS2d3clF5TllxMVZSckIrRWl6QW93Nk5zZE5LY3lWRWtZZU03M3lzNnE0a0FIcDZCaUZrbFRrSXJWQzVvWVY3dXp3T0dDejRVSjBTdHEybFdNSnk0d3RiK1JldEw2dFpGaWNuSm1CdzVVakN2WFhNWlZKWDJNUWtiZitYTjVFV2Q3OFZ6OC9KRXNNWlRCaUtOenNtMWluTFJVUTc0SDROaWRhcUk2OGo1c0FGZ3hjUnZlQzdpZUxKWGZRWXhqWloyQ3NpV0Zld1pYSm1CSWxaMXRkdHJYNGhTdWF0ZUtzby9SWk90T0tXMm5tcTFvVHplSzZkUldBV3UyTlJWYjRocTBTWG0xR3Z0dWdIcmJyNUlYcW1Ta3RnNUN1REUyTVNsUHdzWTVrTkUyV3AzQXFpWmJXVkxBeGlCRisyaUJaYnVOajZNQjZyc01MQzdGeWFzYVlEeW83S2tvUHlFdHczcEVNWGZQdnhBSmkyakFRUWdqcnowckxJWlNXWmxJb05od2Q1eEs0QVI5bVlOaldBYUxybnVJbUplQlZOOXpCT1JPYlZ2YnIrbVRUZkZTRUpMU1JuSG83aEVKb0lpOE1GcWp4bXZnbUY1VVJaejR6TEZnWlo4Q3R1Mlg3Z2dWY2NLbTlnVnhJc09IcXhYZ05NS25GV1pZbmYxZEJuT2hheVhxMTdRd0ZsV1cwOWVOS3lWSkZtWHFhT05HQTVhQ2VnTWJKM1VVa0dZMWljM25LV2dqcThxZlZZR1FHMWdSdDZyczYyYTZIaXFxVU9xZGVzSzVObVg0bkdvZkpvaUUxZDBkRjlsVlZrdlQxL2tFRWFhQ29ZT3dGcGNWY29MTSs3NjY5UHhDOXJXcWt0SDBzV1VZbGQwVkNwdUJaL3N0VlJjR2d5OVdYMitVMVF0aGk5U3pBcVN4elpzeStPaUZ6QllueVNHVjZHa3U0NHJEOEJDT1pCVjNCdkQ1K0FLUkhOd01Fc0I2RXpIbkpwa1RBZWlVbEVHa2NFQ2VCNkdEWlRwNVlFSlRsdmRya254WWpUbGxNa2ZOdFh3RGpNN3VWaks1SlhVVW40M3JycXBLMmp5dGF4SFcwTTVHOERDOHJ0SE1ZczdLU2dkdVZRTUdUWUZxRnZWUzZya0Qzc0RKNDZhZmRZRndvcTExQU9LQ0JMaHZ3b1VnYzhJR0FOeWNSNmtuWnJkSlBkc3V4bnlqZmQzRm92VGxSTWRFZHRPbDVDTVY1RUhzWFFCaXM3VE93dklEWmFHajJWbnBiaDdjcEs2M1Z3WUVNTHdxYmp6eWw2OTlzYXdGRmtGMXlxalVVMzFIZkM2c1cxWkZWRnVYVlhWZ3o5a2VFYXcweXMxbFdmbSthelFBUVNXQStoS1lWZnNaalBuY0FjVUI5b0lheXkvVVpYUk5ja0RHamk3N0dzV2J2Qm82dFByV1BxT3lWa0JVcStJTmVxcHpOZFlzL3UwaWZoNXFtcHFJVyszM0pWU1Vjd1k3MEtMNFU5bFlkVTZsanRTbHM3bG1maTlnM1l6ZVFmVmthR0ZhVjNPRENuYUQyTjh3c0VERmtsRTNSek0zWmdoZFlrV0hzc3pxNzBGSWVjbktrVmt0OGV6TXpScTlia0d1S29qUkxCVlNvZDNZMXlQcUtnWVc3SlJRVFBWeXk1eElZTGpPZ3hnVDUyUktKVVkxZE9ySWlSZDRmdXRReC9BNUFjU21FanowdkZXcmtMenZiV0F1OUhPV2JHZ3hGazFWTlRwbkJLazZUZ3dpc0kvSGN4WVhQMXVBV083MlVMRmxCVHErYVN1MlZUVXM2aHJ4TTJDRitoRW9yMVZJQTlabUZVYWFiMWxTU2dac1ZzNHN4ekhsVkxvSkhyOUg0RGhPTlRrSTFYQzAvd2lZMk5vV0FHNVJsbkhGbnE2b0xjY3BRZGRNdUovTzE3SlZBNU9ITGkwQnFDenRxN1kxKyt1Y0NkOThxTEk4TUlIQlYvY0tqeFFUbWUzaEZCUzNNeUNxbkRzdXltMm84MEhqdkZGVHRyVVJtTmFHSnNtVmFoSW1qVHNVWEt0UVpUQVZzN012djgvK2Z6VXJaQVhjTEo2TTRrb2U2WFAwYjZTbVdXTkR6eVVwUThibCtMdFd4NHR1cVozNmNSWVYzeXVWeFBOd3ZJaXFpUUNTbXU3c3JnVHpSNm5reWhwQ2FyWHdGeTF2R2Q1aVAyY1kwNmxGcjVOamhoZzFZNitOQjI4ZnRiSzgzczhyZjdrTEpiS3dERlBiTGcyNWEwQWRaSkVpcXI1cGhpeEtNRGxSVXRjc3NxMWhyaUxxR29IK3plTmdWbTlPZW1qc0VUVjhKZEYwTkhua0lGeFdZMU9CNFlycDdydFdKN05nQUFBUFhrbEVRVlEzb05zNW5wbHlWZjh1MkZvTHUxSnJIdmVhWldRanFBa3NodEZhMmd6c1NHM1pwa2J2ZzNIYWZGOXNsUFBsbGRqRmxLODBHeXNtOE1yNE1QaG5lTldFTlBHakFJcG1pbFRQQVRkVFJUWGxDQllIWUFRdVB3QTM2eElwV3RHTjRxM1kyTWhpR3NVcHVTU25sRUpSRDhQb3JDN0NGWVZ3K0Y1MXFUaGdhYnhzVHhXekNHWTBaU3NiM2xmcUF5ME9QTmpOeTh4aVFRS3NIWUZRMkhCWlZ2VmJCdXEzbTFvV0thanFhb25zTTZ1WlVyNkNqWFdOWjBsNUUzaDNqVVJtYTZrUDNNSklpeTFMbStrYWhRcTQxTjJpWmphNXNqdGxMWU5aSFpySDZxVUdtNHZNYkRwNlJ3MkNGbXZ1eUZrckJjQ3lNdEZxQmFFQ21zSG9LOUJaMkxBL2xKY1JxU2FEcW5hV2JyWmRHYXozRExnSXZCbG40d29HenRieUpHcXNsd3hraGhIclRqVFlGWEN0T29LUzh1TGRvZlZkQWJPeWxHVTZubFlwWFdadHM0blhCcTZXeEppdE1Ob2tIVUpuYm5KcGxRbSthR3BZMmE1R01WMlFEMWhSdWJCUEZLZHVtZjVPSGtMSHowRjlsdUU1a2pCalJhMG5GRTVDVUdxSHczMk1talo2eGtnSU5WblNuWjFWWlN0SzJxS2xSYUxsUWdLN3VUcTdKRlhKd00rM1NPRUt5aFpOSSt0SjBJNXFNWXk5azJxSkQ3ZFZXZHFLWGEwQ0tOUjBDY2pnK0IySVl1MmZjQlpKWmtNRmdNMTFyMFg5MndpbGdoRkdnelZuZXhscUI3eEw5bVMyOVNpWVVWWTJuWE9aak5CUnN5RHNRUFJXVzVoclo0WGNkQzRIVldSYmpnSnI0c0ZvZks1U3pqUTdyaEkxVWViZFBkRWJqNnNxSXZUWlFaNXZhMDhyQUJzQVcwVXhlV3l0QWs3QTJLSjlacHh6Q2lvQjI0WEZ0WUFlWFl4cjZhblNxaExncHBFcVdiR3dMdW5UZ3JWK0lqV2xMMjlsamFBbDRFUU1Hc0VycDRhcGVaaXF1d1JYTFhBcU9DZXJ1MzJtbXlkYzZvV1RTV3BGQUdkemVUQjhSVEhWTUV0bE05MENiYlFDWWhQanEzZWdZcjFGR2RZSVFqaXVER1o1elovQXpvYktHT3lMeHRpNmM0Und0djJhbnlXbExJQ25sTGh4SlJYdDZBNWViREJXRk5PTmJ4V1oyZDAybW51NFM5WUVDcGVwcFYxelNXUkJXeEhZelZJdjFDWFNvdXdxcVgzakJCQkRaZFlRYnBUUVc0WlFsUzhyNWtINHN1U1JtZzIrKzNKTjEweDFQYUFtRWttdFlsRWRlR3BKRU02a091Q3FDUjIyb1N1amo1SVYySGRUMHpqNXByTEtUalhGQVBqZFFseXE3eElCeEFRUDV5TWN6RzRWeEFLdzBuNmlsWjJRQmNlMnBMdWxrdXh4cW5vSXpGZmdxeXFqaWw5UzFWTndCckZtZXllb3BzOHlPalpVeWJaZGZTOEN1YVRJSnVtenM1dE9EYU50THBGRFEvUGNKR3dlTGhtZUwxbkIwS3FpVURTY3NpVVZEODlEaTNIdHJLdFNVTHczUkxpeWdaRCs3c0Y4SlRPYmdZc3JHdkROVUZSR2wxaXkwTGwxWWtVYzJhSllNb2c5MjBJOHFXNllEQ2cxTXFrMEpISkZLWGtiZ2JScmVJK3FwWU5PWkhyVmNEVWJhN3Bqc3BoU0pOdEs2dXBnUk5BVm9PUzBtdWdCZU40YklaZ0hodVBaL3MxRU5hWDZLc1ZyK1lOcmgxTmI3aXBSMFBFNXpiTlJlZ0NickhSVXc2WWYwN2RMQkpsMWY4S0I5YXMyVjFuTnFBc2w2MkxCQmhlaHdhbGVya0htQjFKRklFWktTRXVzZGw1SlFqMW5KbEhYU0NGMzQyZ0o5Q1lHclhlbGtuSklYcVZQOHNEK3F0cGxDUjNYSDJxZktxMHlnTXArS25Wa0t4TmxaOG0yWWtJbFZNaUNuWFV3bDdxem5CS1N2UXozbTNQdDZvUWJYTzViNUZpeENoL2ZIeFVRVy9BRWNLNnpDTnFLUW5MOXN5d3FtS3V3dnFTWXpUL2FQVk5OcFZ5aHZSVzIxYXFjaUNzamRXdkJ3SUxVdmg1VnlDemJXb0MxcEpqSjY4MENXc2wrdWRLQjZUNVJ3RzFtbG9obmxwYmc0N2l6NVU5aGEwRkd0bVJMRllCdE85OXk5N0FwMHorWkRUQW9nNmtTTFpzTUhnL0lGa2tncDZDcHZVMlUwY1lWU2RubWtqd0JkT21YYnhUV05XenVJYmlwTWlvVnhFY2taRW9haFNPaXkyTTNLMGpjQzFMaFZEd2FxRzBadmtjV3FDbnJHNEdJeHlrcnFsYldkdzZMUXlCYVpSOEhtTFJJaFFXc0hzd0Q0MlpYVkxOa2Y5bCtGbFcwSFZRMmx3RnNDL1oxRmR6bFFSMEthUGZvK0ZkZnUrL2R3VlJJQ3UxQ0dSN0FFSWlBaGMrQVpVRjBrT0JhUHhtVXFnNGk2NHZRblU0bkZEWUo5TnorMWZWWHZlSDlxbXIra1BJTHg4b0tjUlYvQkZieGJFMEpNVDBrU0Q0dzZML2xOWThvY3NxYWdWZFUzQTNNanhoeGNHdXF6c1BINGlycGFvdzFxNk95clZqdnA5TnBjNTlFOTFMbGRib1lWekpXZGltV2ZBVzJTTkVLY0RhWDJGbUJMTEEvdUt4bG1oaDYxM0lzMVVSUUFwYktmdHR3eEwwMnE2T254NXBReFNiUG9qQWcrdjVoQW5ONkxIVlJEWElzdkt0UmppUzBxSlV5WlRBWFZiQUs4MkVsRkpXYVFkVm9xVUMxVW50N0JWYVRRdWRNNlN1cWV4alFKTjQrMGljYXh2L3V0Ykt2ODNFVGJUOEg4Z2pjT0t4T0ptYlVhNk9PVlhodDNkRlk2ckh2OVhvTnpGTGNlRUExbzgrcEttMExBSFBIWjJyWUtqRnEwaGZaRml4c3FISmdEM2VENW4rVTBrYjFtRmpYa24ybHZNU1NPc05FL0NkSUFLRjBTeXRxNnVyT0hVTjVnd2c0R1pvc2dibWdnTTV1Y3JhMnFyUzJJZzFjYmlCQmN4WXpnelVETkxDdkw4R2JaWE5wNk9SeTNMbVMrS2s4M3pSSUFLNkExaW9LYTJJOU5hcEl1aVVGZGZDOTc2NlBGWlV0cVVyNktiV2srelpVMWEvWnJJWEV6dHJqVE9mejdod0t6aUNlWElhcmFIdGJaSU16KzJwR2dhekNtdzRxV0FGdkVkaG9kWXAwWHEwcFY3RzFZV1lXYk80cWhHcTQyK1o4Qll0ckxXdmx1TlBwWkFlYUZGUzF2dWJQZ2JneHNxY3BuQWFzekJvdkthRm9EUThCR3RqZlVPbDROQUcybm1RVjA0ZmVKZ3VtdlgyZnNyUUVXWmdoTDBKblZkWWtuM0RPWkllUk44NlJxUFdDbXN2R1ZxRU1Sbnd4UUF4d1M4RU1ZbzNJem1ZMitCQ2NMcDRNS2l1eXVoSW1hbWxiWkZjTm9ObDd0cCtSSGQxOFpqUUlSS3lYZEZSaE45OC9oeUtxd1hXTm83TzF3aWFYb0hOMTA4UkVaWldFcTZncm5JZmp6ZWc4amRSZjFYRUw0a2tYYTViQmpLeG9LYWxqQmplSGxWeFE0R2F5Y3BXNGxET0FLdG5UeEhBdE9mek90WndIQU03c3FWWGtWNnl1NmthcDFuSGtYS3FXRi80WEhxamVuTktxQmpwUjNsMWNoM0VqZzErRXNnZFFoc2RHMEI0Rk05c1dBVldwdUF5aXdUUGxlWnh0OVZ5WlZTMnFYZlJlV3FUQWlscHI5QXBvV1RqeHltaXQ3TndWNEpUcmlaeU9BOUIwazdIRmZVTG91cm1LWUhWblJRdnFHTDVITUhkcUZjUjJxV3BtY0s2ZVR3eDJkaXBXcnZpRGlscitmS1dxM09XUldkSEt3QTRldTh3amNoYmVSekZpbHFqalpOM3VmQ3Bma0owL3NjVnBuWWs2TDBQSTc3bHhkV0NaODdXaVdtN0IvQUdxdVFTbnVqR0tzQjhDSm1pSnE4cTFwS0lWV3lxT2lUSzY2cjE4Qk44cjc0L0FFNzFmZEMzeVBTMk14ZE9wbkUxdGxWeEQ5Sm1WT29nZ04rcjRQakFYVkZQYTNFZzVqVkpHRlZVR05vbEgyMEdWclVCN0JPeVNXcTZXcVlRZFdSOTJwY0ZNWU13Y2tiU2dDS0NxRDY3RGlpV3UxZzhNUUM5QnlmY0ZxVzFMK2pMNzE0cU5DdXpub1N4dDBkYTJndFdOMUc4RjBCSzBOTjBudWltZWxVRjlkSWRBZmpPNDRVVDNDalFMb1VlTEhKRlRPM2dtcFJ1SUlPdndCUUNicU5lbzNxdFo5aUY2eFZLMTNHUmxvNHpxaW1xK0NHZFRpUjF1Ulk4b3FnRTAyaFpCYTc5a1pYUE1xdXhSSEtsYTJzYVpXTjRtUnFaVWowdkxDS2hraktucU9RSE51U1pWSm9LdkFxUzF3cEVxdXZXREMxQjJ5cHdyQ1BzUk1FUFZUT0RNTEpNRHY2cWVLWHdpMkpZVjVTcTRxS3l2Z0dzSENMaXVqMmpSNTlWOGdNcVNKMkZKWlJYRUhWUkhqM3NGUHJjdDZPcHFsVzFHcGF0UWR0MEd2d2ZNNm42M0luc0dWRmhKR2FCcWdxcUlWNklzWGxsWmd5U1BxNFIzYm50M3dpNWN2K2NOMnlxUUxXMVQ5NUtZVnNXV3RLazRjQjlXNTNXUVFmbFFZUjZXbDRIYUpaanZWRTBENXl2cStSS2daQ3M1cWRCRVA1c0Q5NGNBdlFMbFNnTmFTTUF0SHg4OEJ1TlE0MXpkRnNYMzB6S2JjczBNTEQvaWhrcFF6bDB3aVRxS0xUZmJLbUNteVlJQ25LMEliYWllQzRDRzlpU3lMUTdjSU1HUXdhdTZUS29xNjBBcGwzV040MExacGNhMUNLS0s5VlF5eUlFbjh3MEY4RjZDTDJoOG8zaXhHd0M3czdFV3pDT3FtY0FwWXhZRDRqc0F6VlMwc2wydDk4cEE3dnJLb3BoQ1ZTb25iWXBnSDZtdlNuMjRwVEJWNHNkdFYzQnRNcTVrODJ5K0lBRHZVSjB1QWxrQ1ZUeElhUG0rVU51L3FrVjRGMVR6SFhDR3JYSUFxSXRCS3lwcUs5OVZ0QU9WczY0TzRPYlg3cEhMVkNwWUhjUm13dkxSN1R2WUFLQkJONThMR1Z6RHVGeitoUWJXZ25jUXlDWkFrK1Zic1BTb3VmOTMyNjFpWmdtZkNwd1JiQXZxbVNxcmlVMlB3aGphb095WXF0SWVnVlhWaVRzbXl0YTZiR3lTcFkzZ3lScnBJeUFlYVdERHh0cHNYd0t5YWxNREtOUDdZQlhNcUVza1VzaTJ1QzhGTkFQeEFLVFZmVDFvNlZ6TTBFMGpGKzFyV2NVdUh2ZHlnN3Znb0ZwbFg4SHB2SHBNQ09NUlVQSHpaa0luc3FsRktOWC9FSU81MkUwU3hTek93b2IyVm1STFc1RDFYSVUwcmJnTTFBeldneUM3ZmU4Rzd4VUFLL3RhRUJhdDdsdXF0eVA3RW1zYUpRT2o1Rittcm5aZkN1WUNmQlVBV3dTaHlkNnBNWS92QUhHMVVxT1lwYkkvZ3k1VDBDTUttK1VPM2dGdUM4NWRnZkRWZWd1UERmSVRySUJMc0xyY2dkaDNDRmdGWmphS0o0SXYzRjhBTkVxdnV4UjF0VktPZ0xvQ2Exanhib0JBa2o2djdqL2ljRmJBN2Y0cmZSblFETFJWaUcxM2kwdnFCUXJZVnFCYkFEWlQwWnBpSG9TenZRcG9wS0lGUzNzRTFIZkJXbEhYZDBIN0xuQXJxdm91Z010bGpIQmdabmgzRW96L0JLakxNTDRaMkFxMCtoRUpyOWphVlVCYnZOekNJVWlyb0M3QVdtbUZ3NG81QUszTXRCNVZ5cFpNU0ZnczA1SnlHVndsd0Jxc0VHQUFhMlpVMUNqVWV4WEdzRTRyS3JpaWxCdkZ6T0tLbzNBdUFyb0U2UUZRVTN1OFlwTlh3UzVrKzFUWnQ1VXJ3b3VONEtpVUV3K2szWldEcDFSWEhOUnFYYjIxVHMzOTk0NXlaU2czVm5aRk5ROUNGM1hlWnlyNURnQlhLaXdDTWEyTXhlVERZWGdQMUZzZjlRTktaYzBrODFSSmszcjZFUTNyQ21CVnlMTDc1RWpaMXBJVkRIb0Z0aU9BSG9CMEJkVFZ5bHFCc0tLS1MrQWVCWEpWTFkrQ1hBU3VHdk8vQXVxN0d1RWpEZkdLZzFvS2Exei9kbW1pOUk5U1VHTmhsMEF0ZnVsSEFhd29Zcm5Ta21OWEFWdUdFaHJFVlh2VUYrQTVDdDJQcU5PakRldHluYTRDbWVVb2xtZVhMTjRBcTdDNVNqMTBRN3lqZ2wrdDZDTnhTUkhtSTVYK0Nwd3JlWUIzUWZkcW5hNHEyMUtkQnVjNEdvWnNuNDlaT09pVmlud0hxSzlXemp2Z2V3ZUVoMkFVNSt2dHhaOUNkOVdxa2g0OVYxOEU1b2o2dlZ5bjBSU3RBeUdJTzVlZFhSS2Q1QjBWR1ZYcTJ5cjN4WXArNVV0K0M0UUo0UDFOMzM5cFFNalJlamo0dmIvRGNyNnJRYzNPLzByam10WnBlWUNCaUNIZkNlbVJiTmhiSy9wTlVQYzN3Zkt5NWYyRDdPbEwzL3VQaHZlL29VNFQwRjhmK1ZOTTJ2eW9pdjBqSytLSFFmZEhxKzBibmN6NG96NzMvK1k2TGJLdzFvLzVCN2VPZjFSbC8wZHU5Qjl0bi85YnZyZi9qK3YwaDZ0dG4ydHAvci80ODE5eTQvenY1MzkxdXZ6emZ3RGlmejZwaFQxTVBnQUFBQUJKUlU1RXJrSmdnZz09Iik7YmFja2dyb3VuZC1zaXplOjEwMCUgMTAwJTtib3JkZXI6bm9uZTtjdXJzb3I6cG9pbnRlcjtkaXJlY3Rpb246bHRyO2hlaWdodDoxMzBweDt0b3VjaC1hY3Rpb246bWFuaXB1bGF0aW9uO3dpZHRoOjEwMCV9LmNvbG9yLXBpY2tlciAuY3AtYWRkLWNvbG9yLWJ1dHRvbi1jbGFzc3tiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2JvcmRlcjowO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6aW5saW5lO21hcmdpbjozcHggLTNweDtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGV9LmNvbG9yLXBpY2tlciAuY3AtYWRkLWNvbG9yLWJ1dHRvbi1jbGFzczpob3Zlcnt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfS5jb2xvci1waWNrZXIgLmNwLWFkZC1jb2xvci1idXR0b24tY2xhc3M6ZGlzYWJsZWR7Y29sb3I6Izk5OTtjdXJzb3I6bm90LWFsbG93ZWR9LmNvbG9yLXBpY2tlciAuY3AtYWRkLWNvbG9yLWJ1dHRvbi1jbGFzczpkaXNhYmxlZDpob3Zlcnt0ZXh0LWRlY29yYXRpb246bm9uZX0uY29sb3ItcGlja2VyIC5jcC1yZW1vdmUtY29sb3ItYnV0dG9uLWNsYXNze2JhY2tncm91bmQ6I2ZmZjtib3JkZXItcmFkaXVzOjUwJTtib3gtc2hhZG93OjFweCAxcHggNXB4ICMzMzM7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpibG9jaztoZWlnaHQ6MTBweDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDotNXB4O3RleHQtYWxpZ246Y2VudGVyO3RvcDotNXB4O3dpZHRoOjEwcHh9LmNvbG9yLXBpY2tlciAuY3AtcmVtb3ZlLWNvbG9yLWJ1dHRvbi1jbGFzczpiZWZvcmV7Ym90dG9tOjMuNXB4O2NvbnRlbnQ6IngiO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtc2l6ZToxMHB4O3Bvc2l0aW9uOnJlbGF0aXZlfSddfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOlVnfSx7dHlwZTpnM31dfSkse2hhbmRsZUVzYzpbe3R5cGU6d3ksYXJnczpbImRvY3VtZW50OmtleXVwLmVzYyIsWyIkZXZlbnQiXV19XSxoYW5kbGVFbnRlcjpbe3R5cGU6d3ksYXJnczpbImRvY3VtZW50OmtleXVwLmVudGVyIixbIiRldmVudCJdXX1dLGRpYWxvZ0VsZW1lbnQ6W3t0eXBlOlphLGFyZ3M6WyJkaWFsb2dQb3B1cCIse3N0YXRpYzohMH1dfV0saHVlU2xpZGVyOlt7dHlwZTpaYSxhcmdzOlsiaHVlU2xpZGVyIix7c3RhdGljOiEwfV19XSxhbHBoYVNsaWRlcjpbe3R5cGU6WmEsYXJnczpbImFscGhhU2xpZGVyIix7c3RhdGljOiEwfV19XX0pO2NsYXNzIGIze2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhKXt0aGlzLmluamVjdG9yPXQsdGhpcy5jZnI9ZSx0aGlzLmFwcFJlZj1uLHRoaXMudmNSZWY9byx0aGlzLmVsUmVmPWksdGhpcy5fc2VydmljZT1hLHRoaXMuZGlhbG9nQ3JlYXRlZD0hMSx0aGlzLmlnbm9yZUNoYW5nZXM9ITEsdGhpcy52aWV3QXR0YWNoZWRUb0FwcFJlZj0hMSx0aGlzLmNwV2lkdGg9IjIzMHB4Iix0aGlzLmNwSGVpZ2h0PSJhdXRvIix0aGlzLmNwVG9nZ2xlPSExLHRoaXMuY3BEaXNhYmxlZD0hMSx0aGlzLmNwSWdub3JlZEVsZW1lbnRzPVtdLHRoaXMuY3BGYWxsYmFja0NvbG9yPSIiLHRoaXMuY3BDb2xvck1vZGU9ImNvbG9yIix0aGlzLmNwQ215a0VuYWJsZWQ9ITEsdGhpcy5jcE91dHB1dEZvcm1hdD0iYXV0byIsdGhpcy5jcEFscGhhQ2hhbm5lbD0iZW5hYmxlZCIsdGhpcy5jcERpc2FibGVJbnB1dD0hMSx0aGlzLmNwRGlhbG9nRGlzcGxheT0icG9wdXAiLHRoaXMuY3BTYXZlQ2xpY2tPdXRzaWRlPSEwLHRoaXMuY3BDbG9zZUNsaWNrT3V0c2lkZT0hMCx0aGlzLmNwVXNlUm9vdFZpZXdDb250YWluZXI9ITEsdGhpcy5jcFBvc2l0aW9uPSJhdXRvIix0aGlzLmNwUG9zaXRpb25PZmZzZXQ9IjAlIix0aGlzLmNwUG9zaXRpb25SZWxhdGl2ZVRvQXJyb3c9ITEsdGhpcy5jcE9LQnV0dG9uPSExLHRoaXMuY3BPS0J1dHRvblRleHQ9Ik9LIix0aGlzLmNwT0tCdXR0b25DbGFzcz0iY3Atb2stYnV0dG9uLWNsYXNzIix0aGlzLmNwQ2FuY2VsQnV0dG9uPSExLHRoaXMuY3BDYW5jZWxCdXR0b25UZXh0PSJDYW5jZWwiLHRoaXMuY3BDYW5jZWxCdXR0b25DbGFzcz0iY3AtY2FuY2VsLWJ1dHRvbi1jbGFzcyIsdGhpcy5jcFByZXNldExhYmVsPSJQcmVzZXQgY29sb3JzIix0aGlzLmNwUHJlc2V0Q29sb3JzQ2xhc3M9ImNwLXByZXNldC1jb2xvcnMtY2xhc3MiLHRoaXMuY3BNYXhQcmVzZXRDb2xvcnNMZW5ndGg9Nix0aGlzLmNwUHJlc2V0RW1wdHlNZXNzYWdlPSJObyBjb2xvcnMgYWRkZWQiLHRoaXMuY3BQcmVzZXRFbXB0eU1lc3NhZ2VDbGFzcz0icHJlc2V0LWVtcHR5LW1lc3NhZ2UiLHRoaXMuY3BBZGRDb2xvckJ1dHRvbj0hMSx0aGlzLmNwQWRkQ29sb3JCdXR0b25UZXh0PSJBZGQgY29sb3IiLHRoaXMuY3BBZGRDb2xvckJ1dHRvbkNsYXNzPSJjcC1hZGQtY29sb3ItYnV0dG9uLWNsYXNzIix0aGlzLmNwUmVtb3ZlQ29sb3JCdXR0b25DbGFzcz0iY3AtcmVtb3ZlLWNvbG9yLWJ1dHRvbi1jbGFzcyIsdGhpcy5jcElucHV0Q2hhbmdlPW5ldyBMaCghMCksdGhpcy5jcFRvZ2dsZUNoYW5nZT1uZXcgTGgoITApLHRoaXMuY3BTbGlkZXJDaGFuZ2U9bmV3IExoKCEwKSx0aGlzLmNwU2xpZGVyRHJhZ0VuZD1uZXcgTGgoITApLHRoaXMuY3BTbGlkZXJEcmFnU3RhcnQ9bmV3IExoKCEwKSx0aGlzLmNvbG9yUGlja2VyT3Blbj1uZXcgTGgoITApLHRoaXMuY29sb3JQaWNrZXJDbG9zZT1uZXcgTGgoITApLHRoaXMuY29sb3JQaWNrZXJDYW5jZWw9bmV3IExoKCEwKSx0aGlzLmNvbG9yUGlja2VyU2VsZWN0PW5ldyBMaCghMCksdGhpcy5jb2xvclBpY2tlckNoYW5nZT1uZXcgTGgoITEpLHRoaXMuY3BDbXlrQ29sb3JDaGFuZ2U9bmV3IExoKCEwKSx0aGlzLmNwUHJlc2V0Q29sb3JzQ2hhbmdlPW5ldyBMaCghMCl9aGFuZGxlQ2xpY2soKXt0aGlzLmlucHV0Rm9jdXMoKX1oYW5kbGVGb2N1cygpe3RoaXMuaW5wdXRGb2N1cygpfWhhbmRsZUlucHV0KHQpe3RoaXMuaW5wdXRDaGFuZ2UodCl9bmdPbkRlc3Ryb3koKXtudWxsIT10aGlzLmNtcFJlZiYmKHRoaXMudmlld0F0dGFjaGVkVG9BcHBSZWYmJnRoaXMuYXBwUmVmLmRldGFjaFZpZXcodGhpcy5jbXBSZWYuaG9zdFZpZXcpLHRoaXMuY21wUmVmLmRlc3Ryb3koKSx0aGlzLmNtcFJlZj1udWxsLHRoaXMuZGlhbG9nPW51bGwpfW5nT25DaGFuZ2VzKHQpe3QuY3BUb2dnbGUmJiF0aGlzLmNwRGlzYWJsZWQmJih0LmNwVG9nZ2xlLmN1cnJlbnRWYWx1ZT90aGlzLm9wZW5EaWFsb2coKTp0LmNwVG9nZ2xlLmN1cnJlbnRWYWx1ZXx8dGhpcy5jbG9zZURpYWxvZygpKSx0LmNvbG9yUGlja2VyJiYodGhpcy5kaWFsb2cmJiF0aGlzLmlnbm9yZUNoYW5nZXMmJigiaW5saW5lIj09PXRoaXMuY3BEaWFsb2dEaXNwbGF5JiZ0aGlzLmRpYWxvZy5zZXRJbml0aWFsQ29sb3IodC5jb2xvclBpY2tlci5jdXJyZW50VmFsdWUpLHRoaXMuZGlhbG9nLnNldENvbG9yRnJvbVN0cmluZyh0LmNvbG9yUGlja2VyLmN1cnJlbnRWYWx1ZSwhMSksdGhpcy5jcFVzZVJvb3RWaWV3Q29udGFpbmVyJiYiaW5saW5lIiE9PXRoaXMuY3BEaWFsb2dEaXNwbGF5JiZ0aGlzLmNtcFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCkpLHRoaXMuaWdub3JlQ2hhbmdlcz0hMSksKHQuY3BQcmVzZXRMYWJlbHx8dC5jcFByZXNldENvbG9ycykmJnRoaXMuZGlhbG9nJiZ0aGlzLmRpYWxvZy5zZXRQcmVzZXRDb25maWcodGhpcy5jcFByZXNldExhYmVsLHRoaXMuY3BQcmVzZXRDb2xvcnMpfW9wZW5EaWFsb2coKXtpZih0aGlzLmRpYWxvZ0NyZWF0ZWQpdGhpcy5kaWFsb2cmJnRoaXMuZGlhbG9nLm9wZW5EaWFsb2codGhpcy5jb2xvclBpY2tlcik7ZWxzZXtsZXQgdD10aGlzLnZjUmVmO2lmKHRoaXMuZGlhbG9nQ3JlYXRlZD0hMCx0aGlzLnZpZXdBdHRhY2hlZFRvQXBwUmVmPSExLHRoaXMuY3BVc2VSb290Vmlld0NvbnRhaW5lciYmImlubGluZSIhPT10aGlzLmNwRGlhbG9nRGlzcGxheSl7Y29uc3QgZT10aGlzLmluamVjdG9yLmdldCh0aGlzLmFwcFJlZi5jb21wb25lbnRUeXBlc1swXSxycC5OVUxMKTtlIT09cnAuTlVMTD8odD1lLnZjUmVmfHxlLnZpZXdDb250YWluZXJSZWZ8fHRoaXMudmNSZWYsdD09PXRoaXMudmNSZWYmJmNvbnNvbGUud2FybigiWW91IGFyZSB1c2luZyBjcFVzZVJvb3RWaWV3Q29udGFpbmVyLCBidXQgdGhlIHJvb3QgY29tcG9uZW50IGlzIG5vdCBleHBvc2luZyB2aWV3Q29udGFpbmVyUmVmIVBsZWFzZSBleHBvc2UgaXQgYnkgYWRkaW5nICdwdWJsaWMgdmNSZWY6IFZpZXdDb250YWluZXJSZWYnIHRvIHRoZSBjb25zdHJ1Y3Rvci4iKSk6dGhpcy52aWV3QXR0YWNoZWRUb0FwcFJlZj0hMH1jb25zdCBlPXRoaXMuY2ZyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGgzKTtpZih0aGlzLnZpZXdBdHRhY2hlZFRvQXBwUmVmKXRoaXMuY21wUmVmPWUuY3JlYXRlKHRoaXMuaW5qZWN0b3IpLHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcodGhpcy5jbXBSZWYuaG9zdFZpZXcpLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5jbXBSZWYuaG9zdFZpZXcucm9vdE5vZGVzWzBdKTtlbHNle2NvbnN0IG49d20uZnJvbVJlc29sdmVkUHJvdmlkZXJzKFtdLHQucGFyZW50SW5qZWN0b3IpO3RoaXMuY21wUmVmPXQuY3JlYXRlQ29tcG9uZW50KGUsMCxuLFtdKX10aGlzLmNtcFJlZi5pbnN0YW5jZS5zZXR1cERpYWxvZyh0aGlzLHRoaXMuZWxSZWYsdGhpcy5jb2xvclBpY2tlcix0aGlzLmNwV2lkdGgsdGhpcy5jcEhlaWdodCx0aGlzLmNwRGlhbG9nRGlzcGxheSx0aGlzLmNwRmFsbGJhY2tDb2xvcix0aGlzLmNwQ29sb3JNb2RlLHRoaXMuY3BDbXlrRW5hYmxlZCx0aGlzLmNwQWxwaGFDaGFubmVsLHRoaXMuY3BPdXRwdXRGb3JtYXQsdGhpcy5jcERpc2FibGVJbnB1dCx0aGlzLmNwSWdub3JlZEVsZW1lbnRzLHRoaXMuY3BTYXZlQ2xpY2tPdXRzaWRlLHRoaXMuY3BDbG9zZUNsaWNrT3V0c2lkZSx0aGlzLmNwVXNlUm9vdFZpZXdDb250YWluZXIsdGhpcy5jcFBvc2l0aW9uLHRoaXMuY3BQb3NpdGlvbk9mZnNldCx0aGlzLmNwUG9zaXRpb25SZWxhdGl2ZVRvQXJyb3csdGhpcy5jcFByZXNldExhYmVsLHRoaXMuY3BQcmVzZXRDb2xvcnMsdGhpcy5jcFByZXNldENvbG9yc0NsYXNzLHRoaXMuY3BNYXhQcmVzZXRDb2xvcnNMZW5ndGgsdGhpcy5jcFByZXNldEVtcHR5TWVzc2FnZSx0aGlzLmNwUHJlc2V0RW1wdHlNZXNzYWdlQ2xhc3MsdGhpcy5jcE9LQnV0dG9uLHRoaXMuY3BPS0J1dHRvbkNsYXNzLHRoaXMuY3BPS0J1dHRvblRleHQsdGhpcy5jcENhbmNlbEJ1dHRvbix0aGlzLmNwQ2FuY2VsQnV0dG9uQ2xhc3MsdGhpcy5jcENhbmNlbEJ1dHRvblRleHQsdGhpcy5jcEFkZENvbG9yQnV0dG9uLHRoaXMuY3BBZGRDb2xvckJ1dHRvbkNsYXNzLHRoaXMuY3BBZGRDb2xvckJ1dHRvblRleHQsdGhpcy5jcFJlbW92ZUNvbG9yQnV0dG9uQ2xhc3MsdGhpcy5lbFJlZiksdGhpcy5kaWFsb2c9dGhpcy5jbXBSZWYuaW5zdGFuY2UsdGhpcy52Y1JlZiE9PXQmJnRoaXMuY21wUmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKX19Y2xvc2VEaWFsb2coKXt0aGlzLmRpYWxvZyYmInBvcHVwIj09PXRoaXMuY3BEaWFsb2dEaXNwbGF5JiZ0aGlzLmRpYWxvZy5jbG9zZURpYWxvZygpfWNteWtDaGFuZ2VkKHQpe3RoaXMuY3BDbXlrQ29sb3JDaGFuZ2UuZW1pdCh0KX1zdGF0ZUNoYW5nZWQodCl7dGhpcy5jcFRvZ2dsZUNoYW5nZS5lbWl0KHQpLHQ/dGhpcy5jb2xvclBpY2tlck9wZW4uZW1pdCh0aGlzLmNvbG9yUGlja2VyKTp0aGlzLmNvbG9yUGlja2VyQ2xvc2UuZW1pdCh0aGlzLmNvbG9yUGlja2VyKX1jb2xvckNoYW5nZWQodCxlPSEwKXt0aGlzLmlnbm9yZUNoYW5nZXM9ZSx0aGlzLmNvbG9yUGlja2VyQ2hhbmdlLmVtaXQodCl9Y29sb3JTZWxlY3RlZCh0KXt0aGlzLmNvbG9yUGlja2VyU2VsZWN0LmVtaXQodCl9Y29sb3JDYW5jZWxlZCgpe3RoaXMuY29sb3JQaWNrZXJDYW5jZWwuZW1pdCgpfWlucHV0Rm9jdXMoKXtjb25zdCB0PXRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCxlPXRoaXMuY3BJZ25vcmVkRWxlbWVudHMuZmlsdGVyKChlPT5lPT09dCkpO3RoaXMuY3BEaXNhYmxlZHx8ZS5sZW5ndGh8fCgidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiZ0PT09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudD90aGlzLm9wZW5EaWFsb2coKTp0aGlzLmRpYWxvZyYmdGhpcy5kaWFsb2cuc2hvdz90aGlzLmNsb3NlRGlhbG9nKCk6dGhpcy5vcGVuRGlhbG9nKCkpfWlucHV0Q2hhbmdlKHQpe3RoaXMuZGlhbG9nP3RoaXMuZGlhbG9nLnNldENvbG9yRnJvbVN0cmluZyh0LnRhcmdldC52YWx1ZSwhMCk6KHRoaXMuY29sb3JQaWNrZXI9dC50YXJnZXQudmFsdWUsdGhpcy5jb2xvclBpY2tlckNoYW5nZS5lbWl0KHRoaXMuY29sb3JQaWNrZXIpKX1pbnB1dENoYW5nZWQodCl7dGhpcy5jcElucHV0Q2hhbmdlLmVtaXQodCl9c2xpZGVyQ2hhbmdlZCh0KXt0aGlzLmNwU2xpZGVyQ2hhbmdlLmVtaXQodCl9c2xpZGVyRHJhZ0VuZCh0KXt0aGlzLmNwU2xpZGVyRHJhZ0VuZC5lbWl0KHQpfXNsaWRlckRyYWdTdGFydCh0KXt0aGlzLmNwU2xpZGVyRHJhZ1N0YXJ0LmVtaXQodCl9cHJlc2V0Q29sb3JzQ2hhbmdlZCh0KXt0aGlzLmNwUHJlc2V0Q29sb3JzQ2hhbmdlLmVtaXQodCl9fWIzLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxiMykoU20ocnApLFNtKHVnKSxTbShPXyksU20oZWgpLFNtKGhnKSxTbShnMykpfSxiMy7JtWRpcj1sbyh7dHlwZTpiMyxzZWxlY3RvcnM6W1siIiwiY29sb3JQaWNrZXIiLCIiXV0saG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJlZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5oYW5kbGVDbGljaygpfSkpKCJmb2N1cyIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5oYW5kbGVGb2N1cygpfSkpKCJpbnB1dCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uaGFuZGxlSW5wdXQoZSl9KSl9LGlucHV0czp7Y3BXaWR0aDoiY3BXaWR0aCIsY3BIZWlnaHQ6ImNwSGVpZ2h0IixjcFRvZ2dsZToiY3BUb2dnbGUiLGNwRGlzYWJsZWQ6ImNwRGlzYWJsZWQiLGNwSWdub3JlZEVsZW1lbnRzOiJjcElnbm9yZWRFbGVtZW50cyIsY3BGYWxsYmFja0NvbG9yOiJjcEZhbGxiYWNrQ29sb3IiLGNwQ29sb3JNb2RlOiJjcENvbG9yTW9kZSIsY3BDbXlrRW5hYmxlZDoiY3BDbXlrRW5hYmxlZCIsY3BPdXRwdXRGb3JtYXQ6ImNwT3V0cHV0Rm9ybWF0IixjcEFscGhhQ2hhbm5lbDoiY3BBbHBoYUNoYW5uZWwiLGNwRGlzYWJsZUlucHV0OiJjcERpc2FibGVJbnB1dCIsY3BEaWFsb2dEaXNwbGF5OiJjcERpYWxvZ0Rpc3BsYXkiLGNwU2F2ZUNsaWNrT3V0c2lkZToiY3BTYXZlQ2xpY2tPdXRzaWRlIixjcENsb3NlQ2xpY2tPdXRzaWRlOiJjcENsb3NlQ2xpY2tPdXRzaWRlIixjcFVzZVJvb3RWaWV3Q29udGFpbmVyOiJjcFVzZVJvb3RWaWV3Q29udGFpbmVyIixjcFBvc2l0aW9uOiJjcFBvc2l0aW9uIixjcFBvc2l0aW9uT2Zmc2V0OiJjcFBvc2l0aW9uT2Zmc2V0IixjcFBvc2l0aW9uUmVsYXRpdmVUb0Fycm93OiJjcFBvc2l0aW9uUmVsYXRpdmVUb0Fycm93IixjcE9LQnV0dG9uOiJjcE9LQnV0dG9uIixjcE9LQnV0dG9uVGV4dDoiY3BPS0J1dHRvblRleHQiLGNwT0tCdXR0b25DbGFzczoiY3BPS0J1dHRvbkNsYXNzIixjcENhbmNlbEJ1dHRvbjoiY3BDYW5jZWxCdXR0b24iLGNwQ2FuY2VsQnV0dG9uVGV4dDoiY3BDYW5jZWxCdXR0b25UZXh0IixjcENhbmNlbEJ1dHRvbkNsYXNzOiJjcENhbmNlbEJ1dHRvbkNsYXNzIixjcFByZXNldExhYmVsOiJjcFByZXNldExhYmVsIixjcFByZXNldENvbG9yc0NsYXNzOiJjcFByZXNldENvbG9yc0NsYXNzIixjcE1heFByZXNldENvbG9yc0xlbmd0aDoiY3BNYXhQcmVzZXRDb2xvcnNMZW5ndGgiLGNwUHJlc2V0RW1wdHlNZXNzYWdlOiJjcFByZXNldEVtcHR5TWVzc2FnZSIsY3BQcmVzZXRFbXB0eU1lc3NhZ2VDbGFzczoiY3BQcmVzZXRFbXB0eU1lc3NhZ2VDbGFzcyIsY3BBZGRDb2xvckJ1dHRvbjoiY3BBZGRDb2xvckJ1dHRvbiIsY3BBZGRDb2xvckJ1dHRvblRleHQ6ImNwQWRkQ29sb3JCdXR0b25UZXh0IixjcEFkZENvbG9yQnV0dG9uQ2xhc3M6ImNwQWRkQ29sb3JCdXR0b25DbGFzcyIsY3BSZW1vdmVDb2xvckJ1dHRvbkNsYXNzOiJjcFJlbW92ZUNvbG9yQnV0dG9uQ2xhc3MiLGNvbG9yUGlja2VyOiJjb2xvclBpY2tlciIsY3BQcmVzZXRDb2xvcnM6ImNwUHJlc2V0Q29sb3JzIn0sb3V0cHV0czp7Y3BJbnB1dENoYW5nZToiY3BJbnB1dENoYW5nZSIsY3BUb2dnbGVDaGFuZ2U6ImNwVG9nZ2xlQ2hhbmdlIixjcFNsaWRlckNoYW5nZToiY3BTbGlkZXJDaGFuZ2UiLGNwU2xpZGVyRHJhZ0VuZDoiY3BTbGlkZXJEcmFnRW5kIixjcFNsaWRlckRyYWdTdGFydDoiY3BTbGlkZXJEcmFnU3RhcnQiLGNvbG9yUGlja2VyT3BlbjoiY29sb3JQaWNrZXJPcGVuIixjb2xvclBpY2tlckNsb3NlOiJjb2xvclBpY2tlckNsb3NlIixjb2xvclBpY2tlckNhbmNlbDoiY29sb3JQaWNrZXJDYW5jZWwiLGNvbG9yUGlja2VyU2VsZWN0OiJjb2xvclBpY2tlclNlbGVjdCIsY29sb3JQaWNrZXJDaGFuZ2U6ImNvbG9yUGlja2VyQ2hhbmdlIixjcENteWtDb2xvckNoYW5nZToiY3BDbXlrQ29sb3JDaGFuZ2UiLGNwUHJlc2V0Q29sb3JzQ2hhbmdlOiJjcFByZXNldENvbG9yc0NoYW5nZSJ9LGV4cG9ydEFzOlsibmd4Q29sb3JQaWNrZXIiXSxmZWF0dXJlczpbQm9dfSksYjMuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpycH0se3R5cGU6dWd9LHt0eXBlOk9ffSx7dHlwZTplaH0se3R5cGU6aGd9LHt0eXBlOmczfV0sYjMucHJvcERlY29yYXRvcnM9e2NvbG9yUGlja2VyOlt7dHlwZTp4eX1dLGNwV2lkdGg6W3t0eXBlOnh5fV0sY3BIZWlnaHQ6W3t0eXBlOnh5fV0sY3BUb2dnbGU6W3t0eXBlOnh5fV0sY3BEaXNhYmxlZDpbe3R5cGU6eHl9XSxjcElnbm9yZWRFbGVtZW50czpbe3R5cGU6eHl9XSxjcEZhbGxiYWNrQ29sb3I6W3t0eXBlOnh5fV0sY3BDb2xvck1vZGU6W3t0eXBlOnh5fV0sY3BDbXlrRW5hYmxlZDpbe3R5cGU6eHl9XSxjcE91dHB1dEZvcm1hdDpbe3R5cGU6eHl9XSxjcEFscGhhQ2hhbm5lbDpbe3R5cGU6eHl9XSxjcERpc2FibGVJbnB1dDpbe3R5cGU6eHl9XSxjcERpYWxvZ0Rpc3BsYXk6W3t0eXBlOnh5fV0sY3BTYXZlQ2xpY2tPdXRzaWRlOlt7dHlwZTp4eX1dLGNwQ2xvc2VDbGlja091dHNpZGU6W3t0eXBlOnh5fV0sY3BVc2VSb290Vmlld0NvbnRhaW5lcjpbe3R5cGU6eHl9XSxjcFBvc2l0aW9uOlt7dHlwZTp4eX1dLGNwUG9zaXRpb25PZmZzZXQ6W3t0eXBlOnh5fV0sY3BQb3NpdGlvblJlbGF0aXZlVG9BcnJvdzpbe3R5cGU6eHl9XSxjcE9LQnV0dG9uOlt7dHlwZTp4eX1dLGNwT0tCdXR0b25UZXh0Olt7dHlwZTp4eX1dLGNwT0tCdXR0b25DbGFzczpbe3R5cGU6eHl9XSxjcENhbmNlbEJ1dHRvbjpbe3R5cGU6eHl9XSxjcENhbmNlbEJ1dHRvblRleHQ6W3t0eXBlOnh5fV0sY3BDYW5jZWxCdXR0b25DbGFzczpbe3R5cGU6eHl9XSxjcFByZXNldExhYmVsOlt7dHlwZTp4eX1dLGNwUHJlc2V0Q29sb3JzOlt7dHlwZTp4eX1dLGNwUHJlc2V0Q29sb3JzQ2xhc3M6W3t0eXBlOnh5fV0sY3BNYXhQcmVzZXRDb2xvcnNMZW5ndGg6W3t0eXBlOnh5fV0sY3BQcmVzZXRFbXB0eU1lc3NhZ2U6W3t0eXBlOnh5fV0sY3BQcmVzZXRFbXB0eU1lc3NhZ2VDbGFzczpbe3R5cGU6eHl9XSxjcEFkZENvbG9yQnV0dG9uOlt7dHlwZTp4eX1dLGNwQWRkQ29sb3JCdXR0b25UZXh0Olt7dHlwZTp4eX1dLGNwQWRkQ29sb3JCdXR0b25DbGFzczpbe3R5cGU6eHl9XSxjcFJlbW92ZUNvbG9yQnV0dG9uQ2xhc3M6W3t0eXBlOnh5fV0sY3BJbnB1dENoYW5nZTpbe3R5cGU6T3l9XSxjcFRvZ2dsZUNoYW5nZTpbe3R5cGU6T3l9XSxjcFNsaWRlckNoYW5nZTpbe3R5cGU6T3l9XSxjcFNsaWRlckRyYWdFbmQ6W3t0eXBlOk95fV0sY3BTbGlkZXJEcmFnU3RhcnQ6W3t0eXBlOk95fV0sY29sb3JQaWNrZXJPcGVuOlt7dHlwZTpPeX1dLGNvbG9yUGlja2VyQ2xvc2U6W3t0eXBlOk95fV0sY29sb3JQaWNrZXJDYW5jZWw6W3t0eXBlOk95fV0sY29sb3JQaWNrZXJTZWxlY3Q6W3t0eXBlOk95fV0sY29sb3JQaWNrZXJDaGFuZ2U6W3t0eXBlOk95fV0sY3BDbXlrQ29sb3JDaGFuZ2U6W3t0eXBlOk95fV0sY3BQcmVzZXRDb2xvcnNDaGFuZ2U6W3t0eXBlOk95fV0saGFuZGxlQ2xpY2s6W3t0eXBlOnd5LGFyZ3M6WyJjbGljayJdfV0saGFuZGxlRm9jdXM6W3t0eXBlOnd5LGFyZ3M6WyJmb2N1cyJdfV0saGFuZGxlSW5wdXQ6W3t0eXBlOnd5LGFyZ3M6WyJpbnB1dCIsWyIkZXZlbnQiXV19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChiMyxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbY29sb3JQaWNrZXJdIixleHBvcnRBczoibmd4Q29sb3JQaWNrZXIifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6cnB9LHt0eXBlOnVnfSx7dHlwZTpPX30se3R5cGU6ZWh9LHt0eXBlOmhnfSx7dHlwZTpnM31dfSkse2NwV2lkdGg6W3t0eXBlOnh5fV0sY3BIZWlnaHQ6W3t0eXBlOnh5fV0sY3BUb2dnbGU6W3t0eXBlOnh5fV0sY3BEaXNhYmxlZDpbe3R5cGU6eHl9XSxjcElnbm9yZWRFbGVtZW50czpbe3R5cGU6eHl9XSxjcEZhbGxiYWNrQ29sb3I6W3t0eXBlOnh5fV0sY3BDb2xvck1vZGU6W3t0eXBlOnh5fV0sY3BDbXlrRW5hYmxlZDpbe3R5cGU6eHl9XSxjcE91dHB1dEZvcm1hdDpbe3R5cGU6eHl9XSxjcEFscGhhQ2hhbm5lbDpbe3R5cGU6eHl9XSxjcERpc2FibGVJbnB1dDpbe3R5cGU6eHl9XSxjcERpYWxvZ0Rpc3BsYXk6W3t0eXBlOnh5fV0sY3BTYXZlQ2xpY2tPdXRzaWRlOlt7dHlwZTp4eX1dLGNwQ2xvc2VDbGlja091dHNpZGU6W3t0eXBlOnh5fV0sY3BVc2VSb290Vmlld0NvbnRhaW5lcjpbe3R5cGU6eHl9XSxjcFBvc2l0aW9uOlt7dHlwZTp4eX1dLGNwUG9zaXRpb25PZmZzZXQ6W3t0eXBlOnh5fV0sY3BQb3NpdGlvblJlbGF0aXZlVG9BcnJvdzpbe3R5cGU6eHl9XSxjcE9LQnV0dG9uOlt7dHlwZTp4eX1dLGNwT0tCdXR0b25UZXh0Olt7dHlwZTp4eX1dLGNwT0tCdXR0b25DbGFzczpbe3R5cGU6eHl9XSxjcENhbmNlbEJ1dHRvbjpbe3R5cGU6eHl9XSxjcENhbmNlbEJ1dHRvblRleHQ6W3t0eXBlOnh5fV0sY3BDYW5jZWxCdXR0b25DbGFzczpbe3R5cGU6eHl9XSxjcFByZXNldExhYmVsOlt7dHlwZTp4eX1dLGNwUHJlc2V0Q29sb3JzQ2xhc3M6W3t0eXBlOnh5fV0sY3BNYXhQcmVzZXRDb2xvcnNMZW5ndGg6W3t0eXBlOnh5fV0sY3BQcmVzZXRFbXB0eU1lc3NhZ2U6W3t0eXBlOnh5fV0sY3BQcmVzZXRFbXB0eU1lc3NhZ2VDbGFzczpbe3R5cGU6eHl9XSxjcEFkZENvbG9yQnV0dG9uOlt7dHlwZTp4eX1dLGNwQWRkQ29sb3JCdXR0b25UZXh0Olt7dHlwZTp4eX1dLGNwQWRkQ29sb3JCdXR0b25DbGFzczpbe3R5cGU6eHl9XSxjcFJlbW92ZUNvbG9yQnV0dG9uQ2xhc3M6W3t0eXBlOnh5fV0sY3BJbnB1dENoYW5nZTpbe3R5cGU6T3l9XSxjcFRvZ2dsZUNoYW5nZTpbe3R5cGU6T3l9XSxjcFNsaWRlckNoYW5nZTpbe3R5cGU6T3l9XSxjcFNsaWRlckRyYWdFbmQ6W3t0eXBlOk95fV0sY3BTbGlkZXJEcmFnU3RhcnQ6W3t0eXBlOk95fV0sY29sb3JQaWNrZXJPcGVuOlt7dHlwZTpPeX1dLGNvbG9yUGlja2VyQ2xvc2U6W3t0eXBlOk95fV0sY29sb3JQaWNrZXJDYW5jZWw6W3t0eXBlOk95fV0sY29sb3JQaWNrZXJTZWxlY3Q6W3t0eXBlOk95fV0sY29sb3JQaWNrZXJDaGFuZ2U6W3t0eXBlOk95fV0sY3BDbXlrQ29sb3JDaGFuZ2U6W3t0eXBlOk95fV0sY3BQcmVzZXRDb2xvcnNDaGFuZ2U6W3t0eXBlOk95fV0saGFuZGxlQ2xpY2s6W3t0eXBlOnd5LGFyZ3M6WyJjbGljayJdfV0saGFuZGxlRm9jdXM6W3t0eXBlOnd5LGFyZ3M6WyJmb2N1cyJdfV0saGFuZGxlSW5wdXQ6W3t0eXBlOnd5LGFyZ3M6WyJpbnB1dCIsWyIkZXZlbnQiXV19XSxjb2xvclBpY2tlcjpbe3R5cGU6eHl9XSxjcFByZXNldENvbG9yczpbe3R5cGU6eHl9XX0pO2NsYXNzIHkze315My7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8eTMpfSx5My7JtW1vZD1hbyh7dHlwZTp5M30pLHkzLsm1aW5qPXZuKHtwcm92aWRlcnM6W2czXSxpbXBvcnRzOltbV01dXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoeTMsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltXTV0sZXhwb3J0czpbYjNdLHByb3ZpZGVyczpbZzNdLGRlY2xhcmF0aW9uczpbaDMsYjMscDMsbTNdLGVudHJ5Q29tcG9uZW50czpbaDNdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oeTMse2RlY2xhcmF0aW9uczpmdW5jdGlvbigpe3JldHVybltoMyxiMyxwMyxtM119LGltcG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bV01dfSxleHBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW2IzXX19KTtjb25zdCBfMz1bImZpbHRlciJdO2Z1bmN0aW9uIEMzKHQsZSl7MSZ0JiZJbSgwKX1mdW5jdGlvbiBNMyh0LGUpezEmdCYmSW0oMCl9Y29uc3QgdjM9ZnVuY3Rpb24odCl7cmV0dXJue2l0ZW06dH19O2Z1bmN0aW9uIHgzKHQsZSl7aWYoMSZ0JiYoTm0oMCksUXAoMSxNMywxLDAsIm5nLWNvbnRhaW5lciIsMTIpLHptKCkpLDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdDtZbSgpO2NvbnN0IG49JHAoMTQpO3JjKDEpLERtKCJuZ1RlbXBsYXRlT3V0bGV0IixuKSgibmdUZW1wbGF0ZU91dGxldENvbnRleHQiLE1oKDIsdjMsdCkpfX1mdW5jdGlvbiBPMyh0LGUpezEmdCYmKFJtKDAsImRpdiIsMTMpLFRtKDEsIm1hdC1zcGlubmVyIiwxNCksQW0oKSl9ZnVuY3Rpb24gUDModCxlKXsxJnQmJihSbSgwLCJkaXYiLDE1KSxrdSgxLCJObyBSdW5zIiksQW0oKSl9ZnVuY3Rpb24gdzModCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDE1KSxSbSgxLCJzcGFuIiksa3UoMiwnTm8gcnVucyBtYXRjaCAiJyksUm0oMywiY29kZSIpLGt1KDQpLEFtKCksa3UoNSwnIicpLEFtKCksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoNCksU3UodC5yZWdleEZpbHRlcil9fWNvbnN0IGszPWZ1bmN0aW9uKCl7cmV0dXJuWzUsMTAsMjBdfTtmdW5jdGlvbiBTMyh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsIm1hdC1wYWdpbmF0b3IiLDE2KSxWbSgicGFnZSIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkub25QYWdpbmF0aW9uQ2hhbmdlLmVtaXQobil9KSksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKTtEbSgicGFnZVNpemVPcHRpb25zIixDaCg0LGszKSkoInBhZ2VJbmRleCIsdC5wYWdpbmF0aW9uT3B0aW9uLnBhZ2VJbmRleCkoInBhZ2VTaXplIix0LnBhZ2luYXRpb25PcHRpb24ucGFnZVNpemUpKCJsZW5ndGgiLHQuZmlsdGVyZWRJdGVtc0xlbmd0aCl9fWZ1bmN0aW9uIEQzKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwibWF0LWNoZWNrYm94IiwyNiksVm0oImNoYW5nZSIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oMykuaGFuZGxlUGFnZVRvZ2dsZSgpfSkpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKDMpO0RtKCJjaGVja2VkIix0LmFsbFBhZ2VJdGVtc1NlbGVjdGVkKCkpKCJpbmRldGVybWluYXRlIiwhdC5hbGxQYWdlSXRlbXNTZWxlY3RlZCgpJiZ0LnNvbWVQYWdlSXRlbXNTZWxlY3RlZCgpKX19Y29uc3QgRTM9ZnVuY3Rpb24odCl7cmV0dXJue3R5cGU6dH19O2Z1bmN0aW9uIFIzKHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIsMjcpLGt1KDEsIkV4cGVyaW1lbnQiKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMyk7RG0oIm1hdC1zb3J0LWhlYWRlciIsTWgoMSxFMyx0LlNvcnRUeXBlLkVYUEVSSU1FTlRfTkFNRSkpfX1mdW5jdGlvbiBBMyh0LGUpe2lmKDEmdCYmKFJtKDAsInNwYW4iLDI3KSxrdSgxLCJSdW4iKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMyk7RG0oIm1hdC1zb3J0LWhlYWRlciIsTWgoMSxFMyx0LlNvcnRUeXBlLlJVTl9OQU1FKSl9fWZ1bmN0aW9uIFQzKHQsZSl7MSZ0JiZUbSgwLCJydW5zLWdyb3VwLW1lbnUtYnV0dG9uIiwyOSksMiZ0JiZEbSgiZXhwZXJpbWVudElkcyIsWW0oNCkuZXhwZXJpbWVudElkcyl9ZnVuY3Rpb24gTjModCxlKXtpZigxJnQmJihSbSgwLCJzcGFuIiksUXAoMSxUMywxLDEsInJ1bnMtZ3JvdXAtbWVudS1idXR0b24iLDI4KSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMyk7cmMoMSksRG0oIm5nSWYiLHQuc2hvd0dyb3VwQ29udHJvbCl9fWNvbnN0IHozPWZ1bmN0aW9uKHQpe3JldHVyblsiY29sdW1uIix0XX07ZnVuY3Rpb24gSTModCxlKXtpZigxJnQmJihSbSgwLCJzcGFuIiwyMSksTm0oMSwyMiksUXAoMixEMywxLDIsIm1hdC1jaGVja2JveCIsMjMpLFFwKDMsUjMsMiwzLCJzcGFuIiwyNCksUXAoNCxBMywyLDMsInNwYW4iLDI0KSxRcCg1LE4zLDIsMSwic3BhbiIsMjUpLHptKCksQW0oKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oMik7RG0oIm5nQ2xhc3MiLE1oKDYsejMsInRiLWNvbHVtbi0iK3QpKSxyYygxKSxEbSgibmdTd2l0Y2giLHQpLHJjKDEpLERtKCJuZ1N3aXRjaENhc2UiLG4uUnVuc1RhYmxlQ29sdW1uLkNIRUNLQk9YKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIixuLlJ1bnNUYWJsZUNvbHVtbi5FWFBFUklNRU5UX05BTUUpLHJjKDEpLERtKCJuZ1N3aXRjaENhc2UiLG4uUnVuc1RhYmxlQ29sdW1uLlJVTl9OQU1FKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIixuLlJ1bnNUYWJsZUNvbHVtbi5SVU5fQ09MT1IpfX1mdW5jdGlvbiBIMyh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO05tKDApLFJtKDEsImRpdiIsMzgpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCl9KSksUm0oMiwidGItcmFuZ2UtaW5wdXQiLDM5KSxWbSgidmFsdWUiLChmdW5jdGlvbiBlKG4pe2hpKHQpO2NvbnN0IG89WW0oMikuJGltcGxpY2l0O3JldHVybiBZbSgyKS5oYW5kbGVIcGFyYW1JbnRlcnZhbENoYW5nZWQobyxuKX0pKSxBbSgpLEFtKCksem0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oMikuJGltcGxpY2l0O3JjKDIpLERtKCJtaW4iLHQuZmlsdGVyLm1pblZhbHVlKSgibWF4Iix0LmZpbHRlci5tYXhWYWx1ZSkoImxvd2VyVmFsdWUiLHQuZmlsdGVyLmZpbHRlckxvd2VyVmFsdWUpKCJ1cHBlclZhbHVlIix0LmZpbHRlci5maWx0ZXJVcHBlclZhbHVlKX19ZnVuY3Rpb24gRjModCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDQxKSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KGUpe3JldHVybiBlLnN0b3BQcm9wYWdhdGlvbigpfSkpLFJtKDEsIm1hdC1jaGVja2JveCIsMzcpLFZtKCJjaGFuZ2UiLChmdW5jdGlvbiBlKCl7Y29uc3Qgbj1oaSh0KS4kaW1wbGljaXQsbz1ZbSgzKS4kaW1wbGljaXQ7cmV0dXJuIFltKDIpLmhhbmRsZUhwYXJhbURpc2NyZXRlQ2hhbmdlZChvLG4pfSkpLFJtKDIsInNwYW4iKSxrdSgzKSxBbSgpLEFtKCksQW0oKX1pZigyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQsbj1ZbSgzKS4kaW1wbGljaXQ7cmMoMSksRG0oImNoZWNrZWQiLG4uZmlsdGVyLmZpbHRlclZhbHVlcy5pbmNsdWRlcyh0KSkscmMoMiksU3UodCl9fWZ1bmN0aW9uIEwzKHQsZSl7aWYoMSZ0JiYoTm0oMCksUXAoMSxGMyw0LDIsImRpdiIsNDApLHptKCkpLDImdCl7Y29uc3QgdD1ZbSgyKS4kaW1wbGljaXQ7cmMoMSksRG0oIm5nRm9yT2YiLHQuZmlsdGVyLnBvc3NpYmxlVmFsdWVzKX19ZnVuY3Rpb24gQjModCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtObSgwKSxSbSgxLCJidXR0b24iLDMzKSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KGUpe3JldHVybiBlLnN0b3BQcm9wYWdhdGlvbigpfSkpLFRtKDIsIm1hdC1pY29uIiwzNCksQW0oKSxSbSgzLCJtYXQtbWVudSIsbnVsbCwzNSksUm0oNSwiZGl2IiwzNiksVm0oImNsaWNrIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gZS5zdG9wUHJvcGFnYXRpb24oKX0pKSxSbSg2LCJtYXQtY2hlY2tib3giLDM3KSxWbSgiY2hhbmdlIiwoZnVuY3Rpb24gZSgpe2hpKHQpO2NvbnN0IG49WW0oKS4kaW1wbGljaXQ7cmV0dXJuIFltKDIpLmhhbmRsZUhwYXJhbUluY2x1ZGVVbmRlZmluZWRUb2dnbGVkKG4pfSkpLFJtKDcsInNwYW4iKSxrdSg4LCIoc2hvdyBlbXB0eSB2YWx1ZSkiKSxBbSgpLEFtKCksQW0oKSxRcCg5LEgzLDMsNCwibmctY29udGFpbmVyIiwzMiksUXAoMTAsTDMsMiwxLCJuZy1jb250YWluZXIiLDMyKSxBbSgpLHptKCl9aWYoMiZ0KXtjb25zdCB0PSRwKDQpLGU9WW0oKS4kaW1wbGljaXQsbj1ZbSgyKTtyYygxKSxEbSgibWF0TWVudVRyaWdnZXJGb3IiLHQpLGpwKCJhcmlhLWxhYmVsIiwiRmlsdGVyIGhwYXJhbSAiKyhlLmRpc3BsYXlOYW1lfHxlLm5hbWUpKSxyYyg1KSxEbSgiY2hlY2tlZCIsZS5maWx0ZXIuaW5jbHVkZVVuZGVmaW5lZCkscmMoMyksRG0oIm5nSWYiLGUuZmlsdGVyLnR5cGU9PT1uLkRvbWFpblR5cGUuSU5URVJWQUwpLHJjKDEpLERtKCJuZ0lmIixlLmZpbHRlci50eXBlPT09bi5Eb21haW5UeXBlLkRJU0NSRVRFKX19Y29uc3QgVjM9ZnVuY3Rpb24odCxlKXtyZXR1cm57dHlwZTp0LG5hbWU6ZX19O2Z1bmN0aW9uIGozKHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIsMzApLFJtKDEsInNwYW4iLDMxKSxrdSgyKSxBbSgpLFFwKDMsQjMsMTEsNSwibmctY29udGFpbmVyIiwzMiksQW0oKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oMik7RG0oIm1hdC1zb3J0LWhlYWRlciIsdmgoMyxWMyxuLlNvcnRUeXBlLkhQQVJBTSx0Lm5hbWUpKSxyYygyKSxTdSh0LmRpc3BsYXlOYW1lfHx0Lm5hbWUpLHJjKDEpLERtKCJuZ0lmIix0LmZpbHRlcil9fWZ1bmN0aW9uIFUzKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Tm0oMCksUm0oMSwiYnV0dG9uIiwzMyksVm0oImNsaWNrIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gZS5zdG9wUHJvcGFnYXRpb24oKX0pKSxUbSgyLCJtYXQtaWNvbiIsMzQpLEFtKCksUm0oMywibWF0LW1lbnUiLG51bGwsMzUpLFJtKDUsImRpdiIsMzYpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCl9KSksUm0oNiwibWF0LWNoZWNrYm94IiwzNyksVm0oImNoYW5nZSIsKGZ1bmN0aW9uIGUoKXtoaSh0KTtjb25zdCBuPVltKCkuJGltcGxpY2l0O3JldHVybiBZbSgyKS5oYW5kbGVNZXRyaWNJbmNsdWRlVW5kZWZpbmVkQ2hhbmdlZChuKX0pKSxSbSg3LCJzcGFuIiksa3UoOCwiKHNob3cgZW1wdHkgdmFsdWUpIiksQW0oKSxBbSgpLEFtKCksUm0oOSwiZGl2IiwzOCksVm0oImNsaWNrIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gZS5zdG9wUHJvcGFnYXRpb24oKX0pKSxSbSgxMCwidGItcmFuZ2UtaW5wdXQiLDM5KSxWbSgidmFsdWUiLChmdW5jdGlvbiBlKG4pe2hpKHQpO2NvbnN0IG89WW0oKS4kaW1wbGljaXQ7cmV0dXJuIFltKDIpLmhhbmRsZU1ldHJpY0ZpbHRlckNoYW5nZWQobyxuKX0pKSxBbSgpLEFtKCksQW0oKSx6bSgpfWlmKDImdCl7Y29uc3QgdD0kcCg0KSxlPVltKCkuJGltcGxpY2l0O3JjKDEpLERtKCJtYXRNZW51VHJpZ2dlckZvciIsdCksanAoImFyaWEtbGFiZWwiLCJGaWx0ZXIgbWV0cmljICIrKGUuZGlzcGxheU5hbWV8fGUudGFnKSkscmMoNSksRG0oImNoZWNrZWQiLGUuZmlsdGVyLmluY2x1ZGVVbmRlZmluZWQpLHJjKDQpLERtKCJtaW4iLGUuZmlsdGVyLm1pblZhbHVlKSgibWF4IixlLmZpbHRlci5tYXhWYWx1ZSkoImxvd2VyVmFsdWUiLGUuZmlsdGVyLmZpbHRlckxvd2VyVmFsdWUpKCJ1cHBlclZhbHVlIixlLmZpbHRlci5maWx0ZXJVcHBlclZhbHVlKX19Y29uc3QgRzM9ZnVuY3Rpb24odCxlKXtyZXR1cm57dHlwZTp0LHRhZzplfX07ZnVuY3Rpb24gVzModCxlKXtpZigxJnQmJihSbSgwLCJzcGFuIiwzMCksUm0oMSwic3BhbiIsMzEpLGt1KDIpLEFtKCksUXAoMyxVMywxMSw3LCJuZy1jb250YWluZXIiLDMyKSxBbSgpKSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQsbj1ZbSgyKTtEbSgibWF0LXNvcnQtaGVhZGVyIix2aCgzLEczLG4uU29ydFR5cGUuTUVUUklDLHQudGFnKSkscmMoMiksU3UodC5kaXNwbGF5TmFtZXx8dC50YWcpLHJjKDEpLERtKCJuZ0lmIix0LmZpbHRlcil9fWZ1bmN0aW9uIFkzKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2IiwxNyksUm0oMSwiZGl2IiwxOCksVm0oIm1hdFNvcnRDaGFuZ2UiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLmhhbmRsZVNvcnRDaGFuZ2Uobil9KSksUXAoMixJMyw2LDgsInNwYW4iLDE5KSxRcCgzLGozLDQsNiwic3BhbiIsMjApLFFwKDQsVzMsNCw2LCJzcGFuIiwyMCksQW0oKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgpO3JjKDEpLERtKCJtYXRTb3J0QWN0aXZlIix0LnNvcnRPcHRpb24uY29sdW1uKSxyYygxKSxEbSgibmdGb3JPZiIsdC5jb2x1bW5zKSxyYygxKSxEbSgibmdGb3JPZiIsdC5ocGFyYW1Db2x1bW5zKSgibmdGb3JUcmFja0J5Iix0LnRyYWNrQnlIcGFyYW1Db2x1bW4pLHJjKDEpLERtKCJuZ0Zvck9mIix0Lm1ldHJpY0NvbHVtbnMpKCJuZ0ZvclRyYWNrQnkiLHQudHJhY2tCeU1ldHJpY0NvbHVtbil9fWZ1bmN0aW9uIHEzKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwic3BhbiIpLFJtKDEsIm1hdC1jaGVja2JveCIsMzcpLFZtKCJjaGFuZ2UiLChmdW5jdGlvbiBlKCl7aGkodCk7Y29uc3Qgbj1ZbSgyKS5pdGVtO3JldHVybiBZbSgpLm9uU2VsZWN0aW9uVG9nZ2xlLmVtaXQobil9KSksQW0oKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgyKS5pdGVtO3JjKDEpLERtKCJjaGVja2VkIix0LnNlbGVjdGVkKX19ZnVuY3Rpb24gWjModCxlKXtpZigxJnQmJihSbSgwLCJzcGFuIiwzMSksa3UoMSksQW0oKSksMiZ0KXtjb25zdCB0PVltKDIpLml0ZW07anAoInRpdGxlIix0LmV4cGVyaW1lbnROYW1lKSxyYygxKSxTdSh0LmV4cGVyaW1lbnRBbGlhcyl9fWZ1bmN0aW9uIFgzKHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIsMzEpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgyKS5pdGVtO3JjKDEpLFN1KHQucnVuLm5hbWUpfX1jb25zdCBLMz1mdW5jdGlvbih0KXtyZXR1cm57InJ1bi1jb2xvci1zd2F0Y2giOiEwLCJuby1jb2xvciI6dH19O2Z1bmN0aW9uIEozKHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwic3BhbiIpLFJtKDEsImJ1dHRvbiIsNDcpLFZtKCJjb2xvclBpY2tlckNoYW5nZSIsKGZ1bmN0aW9uIGUobil7aGkodCk7Y29uc3Qgbz1ZbSgyKS5pdGVtO3JldHVybiBZbSgpLm9uUnVuQ29sb3JDaGFuZ2UuZW1pdCh7cnVuSWQ6by5ydW4uaWQsbmV3Q29sb3I6bn0pfSkpLEFtKCksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oMikuaXRlbTtyYygxKSxkdSgiYmFja2dyb3VuZCIsdC5ydW5Db2xvciksRG0oIm5nQ2xhc3MiLE1oKDgsSzMsIXQucnVuQ29sb3IpKSgiY29sb3JQaWNrZXIiLHQucnVuQ29sb3IpKCJjcERpYWxvZ0Rpc3BsYXkiLCJwb3B1cCIpKCJjcFBvc2l0aW9uT2Zmc2V0IiwtMjApKCJjcFVzZVJvb3RWaWV3Q29udGFpbmVyIiwhMCkoImNwT3V0cHV0Rm9ybWF0IiwiaGV4Iil9fWZ1bmN0aW9uIFEzKHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIsNDUpLE5tKDEsMjIpLFFwKDIscTMsMiwxLCJzcGFuIiwyNSksUXAoMyxaMywyLDIsInNwYW4iLDQ2KSxRcCg0LFgzLDIsMSwic3BhbiIsNDYpLFFwKDUsSjMsMiwxMCwic3BhbiIsMjUpLHptKCksQW0oKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oMik7RG0oIm5nQ2xhc3MiLE1oKDYsejMsInRiLWNvbHVtbi0iK3QpKSxyYygxKSxEbSgibmdTd2l0Y2giLHQpLHJjKDEpLERtKCJuZ1N3aXRjaENhc2UiLG4uUnVuc1RhYmxlQ29sdW1uLkNIRUNLQk9YKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIixuLlJ1bnNUYWJsZUNvbHVtbi5FWFBFUklNRU5UX05BTUUpLHJjKDEpLERtKCJuZ1N3aXRjaENhc2UiLG4uUnVuc1RhYmxlQ29sdW1uLlJVTl9OQU1FKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIixuLlJ1bnNUYWJsZUNvbHVtbi5SVU5fQ09MT1IpfX1mdW5jdGlvbiAkMyh0LGUpe2lmKDEmdCYmKFJtKDAsInNwYW4iLDQ4KSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQsbj1ZbSgpLml0ZW07cmMoMSksU3Uobi5ocGFyYW1zLmdldCh0Lm5hbWUpKX19ZnVuY3Rpb24gdDIodCxlKXtpZigxJnQmJihSbSgwLCJzcGFuIiw0OCksa3UoMSksQW0oKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oKS5pdGVtO3JjKDEpLFN1KG4ubWV0cmljcy5nZXQodC50YWcpKX19ZnVuY3Rpb24gZTIodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDQyKSxRcCgxLFEzLDYsOCwic3BhbiIsNDMpLFFwKDIsJDMsMiwxLCJzcGFuIiw0NCksUXAoMyx0MiwyLDEsInNwYW4iLDQ0KSxBbSgpKSwyJnQpe2NvbnN0IHQ9ZS5pdGVtLG49WW0oKTtqcCgiZGF0YS1pZCIsdC5ydW4uaWQpLHJjKDEpLERtKCJuZ0Zvck9mIixuLmNvbHVtbnMpLHJjKDEpLERtKCJuZ0Zvck9mIixuLmhwYXJhbUNvbHVtbnMpLHJjKDEpLERtKCJuZ0Zvck9mIixuLm1ldHJpY0NvbHVtbnMpfX1jbGFzcyBuMiBleHRlbmRzIFpRe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLml0ZW1zUGVyUGFnZUxhYmVsPSJTaG93IHJ1bnM6In19bjIuybVmYWM9KGZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIGZ1bmN0aW9uIGUobil7cmV0dXJuKHR8fCh0PUFhKG4yKSkpKG58fG4yKX19KSgpLG4yLsm1cHJvdj1Nbih7dG9rZW46bjIsZmFjdG9yeTpuMi7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobjIsW3t0eXBlOmltfV0sbnVsbCxudWxsKTtjbGFzcyBvMntjb25zdHJ1Y3Rvcigpe3RoaXMuZGF0YVNvdXJjZT1uZXcgUzAsdGhpcy5Eb21haW5UeXBlPVpSLHRoaXMuUnVuc1RhYmxlQ29sdW1uPXZRLHRoaXMuU29ydFR5cGU9JFQsdGhpcy5vblJlZ2V4RmlsdGVyQ2hhbmdlPW5ldyBMaCx0aGlzLm9uU2VsZWN0aW9uVG9nZ2xlPW5ldyBMaCx0aGlzLm9uUGFnZVNlbGVjdGlvblRvZ2dsZT1uZXcgTGgsdGhpcy5vblBhZ2luYXRpb25DaGFuZ2U9bmV3IExoLHRoaXMub25Tb3J0Q2hhbmdlPW5ldyBMaCx0aGlzLm9uUnVuQ29sb3JDaGFuZ2U9bmV3IExoLHRoaXMub25IcGFyYW1EaXNjcmV0ZUZpbHRlckNoYW5nZWQ9bmV3IExoLHRoaXMub25IcGFyYW1JbnRlcnZhbEZpbHRlckNoYW5nZWQ9bmV3IExoLHRoaXMub25NZXRyaWNGaWx0ZXJDaGFuZ2VkPW5ldyBMaH1uZ09uQ2hhbmdlcygpe3RoaXMuZGF0YVNvdXJjZS5kYXRhPXRoaXMucGFnZUl0ZW1zfWdldEhwYXJhbUNvbHVtbklkKHQpe3JldHVybmBoOiR7dC5uYW1lfWB9Z2V0TWV0cmljQ29sdW1uSWQodCl7cmV0dXJuYG06JHt0LnRhZ31gfWdldENvbHVtbklkcygpe3JldHVyblsuLi50aGlzLmNvbHVtbnMsLi4udGhpcy5ocGFyYW1Db2x1bW5zLm1hcCh0aGlzLmdldEhwYXJhbUNvbHVtbklkKSwuLi50aGlzLm1ldHJpY0NvbHVtbnMubWFwKHRoaXMuZ2V0TWV0cmljQ29sdW1uSWQpXX1hbGxQYWdlSXRlbXNTZWxlY3RlZCgpe3JldHVybiBCb29sZWFuKHRoaXMucGFnZUl0ZW1zLmxlbmd0aCkmJnRoaXMucGFnZUl0ZW1zLmV2ZXJ5KCh0PT50LnNlbGVjdGVkKSl9c29tZVBhZ2VJdGVtc1NlbGVjdGVkKCl7cmV0dXJuIHRoaXMucGFnZUl0ZW1zLnNvbWUoKHQ9PnQuc2VsZWN0ZWQpKX1oYW5kbGVQYWdlVG9nZ2xlKCl7dGhpcy5vblBhZ2VTZWxlY3Rpb25Ub2dnbGUuZW1pdCh7aXRlbXM6dGhpcy5wYWdlSXRlbXN9KX1oYW5kbGVTb3J0Q2hhbmdlKHQpe2xldCBlO3N3aXRjaCh0LmRpcmVjdGlvbil7Y2FzZSJhc2MiOmU9Rk4uQVNDO2JyZWFrO2Nhc2UiZGVzYyI6ZT1GTi5ERVNDO2JyZWFrO2RlZmF1bHQ6ZT1GTi5VTlNFVH10aGlzLm9uU29ydENoYW5nZS5lbWl0KHtrZXk6dC5hY3RpdmUsZGlyZWN0aW9uOmV9KX1vbkZpbHRlcktleVVwKHQpe3RoaXMub25SZWdleEZpbHRlckNoYW5nZS5lbWl0KHQudGFyZ2V0LnZhbHVlKX10YWJsZVRyYWNrQnkodCxlKXtyZXR1cm4gZS5ydW4uaWR9aGFuZGxlSHBhcmFtSW5jbHVkZVVuZGVmaW5lZFRvZ2dsZWQodCl7Y29uc3R7bmFtZTplLGZpbHRlcjpufT10O2lmKCFuKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhcmlhbnQgZXJyb3I6IHJlcXVpcmUgZmlsdGVyIHRvIGV4aXN0IGZvciBpdCB0byBjaGFuZ2UiKTtuLnR5cGU9PT1aUi5ESVNDUkVURT90aGlzLm9uSHBhcmFtRGlzY3JldGVGaWx0ZXJDaGFuZ2VkLmVtaXQoe2hwYXJhbU5hbWU6ZSxpbmNsdWRlVW5kZWZpbmVkOiFuLmluY2x1ZGVVbmRlZmluZWQsZmlsdGVyVmFsdWVzOm4uZmlsdGVyVmFsdWVzfSk6dGhpcy5vbkhwYXJhbUludGVydmFsRmlsdGVyQ2hhbmdlZC5lbWl0KHtuYW1lOmUsaW5jbHVkZVVuZGVmaW5lZDohbi5pbmNsdWRlVW5kZWZpbmVkLGZpbHRlckxvd2VyVmFsdWU6bi5maWx0ZXJMb3dlclZhbHVlLGZpbHRlclVwcGVyVmFsdWU6bi5maWx0ZXJVcHBlclZhbHVlfSl9aGFuZGxlSHBhcmFtSW50ZXJ2YWxDaGFuZ2VkKHQsZSl7Y29uc3R7bmFtZTpuLGZpbHRlcjpvfT10O2lmKCFvKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhcmlhbnQgZXJyb3I6IHJlcXVpcmUgZmlsdGVyIHRvIGV4aXN0IGZvciBpdCB0byBjaGFuZ2UiKTt0aGlzLm9uSHBhcmFtSW50ZXJ2YWxGaWx0ZXJDaGFuZ2VkLmVtaXQoe25hbWU6bixpbmNsdWRlVW5kZWZpbmVkOm8uaW5jbHVkZVVuZGVmaW5lZCxmaWx0ZXJMb3dlclZhbHVlOmUubG93ZXJWYWx1ZSxmaWx0ZXJVcHBlclZhbHVlOmUudXBwZXJWYWx1ZX0pfWhhbmRsZUhwYXJhbURpc2NyZXRlQ2hhbmdlZCh0LGUpe2NvbnN0e25hbWU6bixmaWx0ZXI6b309dDtpZighbyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YXJpYW50IGVycm9yOiByZXF1aXJlIGZpbHRlciB0byBleGlzdCBmb3IgaXQgdG8gY2hhbmdlIik7aWYoby50eXBlIT09WlIuRElTQ1JFVEUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFyaWFudCBlcnJvcjogZXhwZWN0ZWQgZGlzY3JldGUgZG9tYWluIGZvciAke259YCk7Y29uc3QgaT1uZXcgU2V0KFsuLi5vLmZpbHRlclZhbHVlc10pO2kuaGFzKGUpP2kuZGVsZXRlKGUpOmkuYWRkKGUpLHRoaXMub25IcGFyYW1EaXNjcmV0ZUZpbHRlckNoYW5nZWQuZW1pdCh7aHBhcmFtTmFtZTpuLGluY2x1ZGVVbmRlZmluZWQ6by5pbmNsdWRlVW5kZWZpbmVkLGZpbHRlclZhbHVlczpbLi4uaV19KX1oYW5kbGVNZXRyaWNJbmNsdWRlVW5kZWZpbmVkQ2hhbmdlZCh0KXtpZighdC5maWx0ZXIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFyaWFudCBlcnJvcjogcmVxdWlyZSBmaWx0ZXIgdG8gZXhpc3QgZm9yIGl0IHRvIGNoYW5nZSIpO3RoaXMub25NZXRyaWNGaWx0ZXJDaGFuZ2VkLmVtaXQoe25hbWU6dC50YWcsaW5jbHVkZVVuZGVmaW5lZDohdC5maWx0ZXIuaW5jbHVkZVVuZGVmaW5lZCxmaWx0ZXJMb3dlclZhbHVlOnQuZmlsdGVyLmZpbHRlckxvd2VyVmFsdWUsZmlsdGVyVXBwZXJWYWx1ZTp0LmZpbHRlci5maWx0ZXJVcHBlclZhbHVlfSl9aGFuZGxlTWV0cmljRmlsdGVyQ2hhbmdlZCh0LGUpe2lmKCF0LmZpbHRlcil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YXJpYW50IGVycm9yOiByZXF1aXJlIGZpbHRlciB0byBleGlzdCBmb3IgaXQgdG8gY2hhbmdlIik7dGhpcy5vbk1ldHJpY0ZpbHRlckNoYW5nZWQuZW1pdCh7bmFtZTp0LnRhZyxpbmNsdWRlVW5kZWZpbmVkOnQuZmlsdGVyLmluY2x1ZGVVbmRlZmluZWQsZmlsdGVyTG93ZXJWYWx1ZTplLmxvd2VyVmFsdWUsZmlsdGVyVXBwZXJWYWx1ZTplLnVwcGVyVmFsdWV9KX10cmFja0J5SHBhcmFtQ29sdW1uKHQpe3JldHVybiB0Lm5hbWV9dHJhY2tCeU1ldHJpY0NvbHVtbih0KXtyZXR1cm4gdC50YWd9fW8yLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxvMil9LG8yLsm1Y21wPXRvKHt0eXBlOm8yLHNlbGVjdG9yczpbWyJydW5zLXRhYmxlLWNvbXBvbmVudCJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmKFFoKF8zLDcsaGcpLFFoKHQkLDcpLFFoKGEkLDcpKSwyJmUpe2xldCB0O0poKHQ9dGIoKSkmJihuLmZpbHRlcj10LmZpcnN0KSxKaCh0PXRiKCkpJiYobi5wYWdpbmF0b3I9dC5maXJzdCksSmgodD10YigpKSYmKG4uc29ydD10LmZpcnN0KX19LGhvc3RWYXJzOjIsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJnB1KCJmbGV4LWxheW91dCIsbi51c2VGbGV4aWJsZUxheW91dCl9LGlucHV0czp7ZXhwZXJpbWVudElkczoiZXhwZXJpbWVudElkcyIsc2hvd0V4cGVyaW1lbnROYW1lOiJzaG93RXhwZXJpbWVudE5hbWUiLGNvbHVtbnM6ImNvbHVtbnMiLGhwYXJhbUNvbHVtbnM6ImhwYXJhbUNvbHVtbnMiLG1ldHJpY0NvbHVtbnM6Im1ldHJpY0NvbHVtbnMiLGFsbEl0ZW1zTGVuZ3RoOiJhbGxJdGVtc0xlbmd0aCIsZmlsdGVyZWRJdGVtc0xlbmd0aDoiZmlsdGVyZWRJdGVtc0xlbmd0aCIsdXNlRmxleGlibGVMYXlvdXQ6InVzZUZsZXhpYmxlTGF5b3V0Iix1c2VQYWdpbmF0aW9uOiJ1c2VQYWdpbmF0aW9uIixzaG93R3JvdXBDb250cm9sOiJzaG93R3JvdXBDb250cm9sIixwYWdlSXRlbXM6InBhZ2VJdGVtcyIsbG9hZGluZzoibG9hZGluZyIsbnVtU2VsZWN0ZWRJdGVtczoibnVtU2VsZWN0ZWRJdGVtcyIsc29ydE9wdGlvbjoic29ydE9wdGlvbiIscGFnaW5hdGlvbk9wdGlvbjoicGFnaW5hdGlvbk9wdGlvbiIscmVnZXhGaWx0ZXI6InJlZ2V4RmlsdGVyIn0sb3V0cHV0czp7b25SZWdleEZpbHRlckNoYW5nZToib25SZWdleEZpbHRlckNoYW5nZSIsb25TZWxlY3Rpb25Ub2dnbGU6Im9uU2VsZWN0aW9uVG9nZ2xlIixvblBhZ2VTZWxlY3Rpb25Ub2dnbGU6Im9uUGFnZVNlbGVjdGlvblRvZ2dsZSIsb25QYWdpbmF0aW9uQ2hhbmdlOiJvblBhZ2luYXRpb25DaGFuZ2UiLG9uU29ydENoYW5nZToib25Tb3J0Q2hhbmdlIixvblJ1bkNvbG9yQ2hhbmdlOiJvblJ1bkNvbG9yQ2hhbmdlIixvbkhwYXJhbURpc2NyZXRlRmlsdGVyQ2hhbmdlZDoib25IcGFyYW1EaXNjcmV0ZUZpbHRlckNoYW5nZWQiLG9uSHBhcmFtSW50ZXJ2YWxGaWx0ZXJDaGFuZ2VkOiJvbkhwYXJhbUludGVydmFsRmlsdGVyQ2hhbmdlZCIsb25NZXRyaWNGaWx0ZXJDaGFuZ2VkOiJvbk1ldHJpY0ZpbHRlckNoYW5nZWQifSxmZWF0dXJlczpbcGcoW3twcm92aWRlOlpRLHVzZUNsYXNzOm4yfV0pLEJvXSxkZWNsczoxNSx2YXJzOjcsY29uc3RzOltbMSwiZmlsdGVyLXJvdyJdLFsicGxhY2Vob2xkZXIiLCJGaWx0ZXIgcnVucyAocmVnZXgpIiwxLCJydW4tZmlsdGVyIiwzLCJrZXl1cCJdLFsxLCJ0YWJsZS1jb250YWluZXIiXSxbInJvbGUiLCJ0YWJsZSJdLFs0LCJuZ1RlbXBsYXRlT3V0bGV0Il0sWyJyb2xlIiwicm93Z3JvdXAiLDEsInJvd3MiXSxbNCwibmdGb3IiLCJuZ0Zvck9mIiwibmdGb3JUcmFja0J5Il0sWyJjbGFzcyIsImxvYWRpbmciLDQsIm5nSWYiXSxbImNsYXNzIiwibm8tcnVucyIsNCwibmdJZiJdLFsic2hvd0ZpcnN0TGFzdEJ1dHRvbnMiLCIiLDMsInBhZ2VTaXplT3B0aW9ucyIsInBhZ2VJbmRleCIsInBhZ2VTaXplIiwibGVuZ3RoIiwicGFnZSIsNCwibmdJZiJdLFsiaGVhZGVyIiwiIl0sWyJyb3ciLCIiXSxbNCwibmdUZW1wbGF0ZU91dGxldCIsIm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0Il0sWzEsImxvYWRpbmciXSxbIm1vZGUiLCJpbmRldGVybWluYXRlIiwiZGlhbWV0ZXIiLCIyOCJdLFsxLCJuby1ydW5zIl0sWyJzaG93Rmlyc3RMYXN0QnV0dG9ucyIsIiIsMywicGFnZVNpemVPcHRpb25zIiwicGFnZUluZGV4IiwicGFnZVNpemUiLCJsZW5ndGgiLCJwYWdlIl0sWyJyb2xlIiwicm93Z3JvdXAiLDEsImhlYWRlciJdLFsibWF0U29ydCIsIiIsInJvbGUiLCJyb3ciLDMsIm1hdFNvcnRBY3RpdmUiLCJtYXRTb3J0Q2hhbmdlIl0sWyJyb2xlIiwiY29sdW1uaGVhZGVyIiwzLCJuZ0NsYXNzIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbInJvbGUiLCJjb2x1bW5oZWFkZXIiLCJjbGFzcyIsImNvbHVtbiIsMywibWF0LXNvcnQtaGVhZGVyIiw0LCJuZ0ZvciIsIm5nRm9yT2YiLCJuZ0ZvclRyYWNrQnkiXSxbInJvbGUiLCJjb2x1bW5oZWFkZXIiLDMsIm5nQ2xhc3MiXSxbMywibmdTd2l0Y2giXSxbMywiY2hlY2tlZCIsImluZGV0ZXJtaW5hdGUiLCJjaGFuZ2UiLDQsIm5nU3dpdGNoQ2FzZSJdLFszLCJtYXQtc29ydC1oZWFkZXIiLDQsIm5nU3dpdGNoQ2FzZSJdLFs0LCJuZ1N3aXRjaENhc2UiXSxbMywiY2hlY2tlZCIsImluZGV0ZXJtaW5hdGUiLCJjaGFuZ2UiXSxbMywibWF0LXNvcnQtaGVhZGVyIl0sWzMsImV4cGVyaW1lbnRJZHMiLDQsIm5nSWYiXSxbMywiZXhwZXJpbWVudElkcyJdLFsicm9sZSIsImNvbHVtbmhlYWRlciIsMSwiY29sdW1uIiwzLCJtYXQtc29ydC1oZWFkZXIiXSxbMSwibmFtZSJdLFs0LCJuZ0lmIl0sWyJtYXQtaWNvbi1idXR0b24iLCIiLDMsIm1hdE1lbnVUcmlnZ2VyRm9yIiwiY2xpY2siXSxbInN2Z0ljb24iLCJmaWx0ZXJfYWx0XzI0cHgiXSxbImZpbHRlck1lbnUiLCJtYXRNZW51Il0sWyJtYXQtbWVudS1pdGVtIiwiIiwicm9sZSIsIm1lbnVpdGVtY2hlY2tib3giLCJkaXNhYmxlUmlwcGxlIiwiIiwxLCJmaWx0ZXItbWVudS1jaGVja2JveC1yb3ciLDMsImNsaWNrIl0sWzMsImNoZWNrZWQiLCJjaGFuZ2UiXSxbImRpc2FibGVSaXBwbGUiLCIiLCJtYXQtbWVudS1pdGVtIiwiIiwxLCJyYW5nZS1pbnB1dC1jb250YWluZXIiLDMsImNsaWNrIl0sWzMsIm1pbiIsIm1heCIsImxvd2VyVmFsdWUiLCJ1cHBlclZhbHVlIiwidmFsdWUiXSxbIm1hdC1tZW51LWl0ZW0iLCIiLCJjbGFzcyIsImZpbHRlci1tZW51LWNoZWNrYm94LXJvdyIsInJvbGUiLCJtZW51aXRlbWNoZWNrYm94IiwzLCJjbGljayIsNCwibmdGb3IiLCJuZ0Zvck9mIl0sWyJtYXQtbWVudS1pdGVtIiwiIiwicm9sZSIsIm1lbnVpdGVtY2hlY2tib3giLDEsImZpbHRlci1tZW51LWNoZWNrYm94LXJvdyIsMywiY2xpY2siXSxbInJvbGUiLCJyb3ciXSxbInJvbGUiLCJjZWxsIiwzLCJuZ0NsYXNzIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbInJvbGUiLCJjZWxsIiwiY2xhc3MiLCJjb2x1bW4iLDQsIm5nRm9yIiwibmdGb3JPZiJdLFsicm9sZSIsImNlbGwiLDMsIm5nQ2xhc3MiXSxbImNsYXNzIiwibmFtZSIsNCwibmdTd2l0Y2hDYXNlIl0sWzMsIm5nQ2xhc3MiLCJjb2xvclBpY2tlciIsImNwRGlhbG9nRGlzcGxheSIsImNwUG9zaXRpb25PZmZzZXQiLCJjcFVzZVJvb3RWaWV3Q29udGFpbmVyIiwiY3BPdXRwdXRGb3JtYXQiLCJjb2xvclBpY2tlckNoYW5nZSJdLFsicm9sZSIsImNlbGwiLDEsImNvbHVtbiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoUm0oMCwiZGl2IiwwKSxSbSgxLCJ0Yi1maWx0ZXItaW5wdXQiLDEpLFZtKCJrZXl1cCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25GaWx0ZXJLZXlVcChlKX0pKSxBbSgpLEFtKCksUm0oMiwiZGl2IiwyKSxSbSgzLCJkaXYiLDMpLFFwKDQsQzMsMSwwLCJuZy1jb250YWluZXIiLDQpLFJtKDUsImRpdiIsNSksUXAoNix4MywyLDQsIm5nLWNvbnRhaW5lciIsNiksQW0oKSxBbSgpLFFwKDcsTzMsMiwwLCJkaXYiLDcpLFFwKDgsUDMsMiwwLCJkaXYiLDgpLFFwKDksdzMsNiwxLCJkaXYiLDgpLEFtKCksUXAoMTAsUzMsMSw1LCJtYXQtcGFnaW5hdG9yIiw5KSxRcCgxMSxZMyw1LDYsIm5nLXRlbXBsYXRlIixudWxsLDEwLGliKSxRcCgxMyxlMiw0LDQsIm5nLXRlbXBsYXRlIixudWxsLDExLGliKSksMiZlKXtjb25zdCB0PSRwKDEyKTtyYyg0KSxEbSgibmdUZW1wbGF0ZU91dGxldCIsdCkscmMoMiksRG0oIm5nRm9yT2YiLG4ucGFnZUl0ZW1zKSgibmdGb3JUcmFja0J5IixuLnRhYmxlVHJhY2tCeSkscmMoMSksRG0oIm5nSWYiLG4ubG9hZGluZykscmMoMSksRG0oIm5nSWYiLCFuLmxvYWRpbmcmJjA9PT1uLmFsbEl0ZW1zTGVuZ3RoKSxyYygxKSxEbSgibmdJZiIsIW4ubG9hZGluZyYmbi5hbGxJdGVtc0xlbmd0aD4wJiYwPT09bi5maWx0ZXJlZEl0ZW1zTGVuZ3RoKSxyYygxKSxEbSgibmdJZiIsbi51c2VQYWdpbmF0aW9uKX19LGRpcmVjdGl2ZXM6W3EwLE1NLGxNLGRNLG8xLHQkLGEkLGFNLGZNLGdNLE9ZLG0kLHcxLFhILGVZLERXLEtXLFdXLEQxLGIzXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Zm9udC1zaXplOjEzcHg7b3ZlcmZsb3c6aGlkZGVufS5maWx0ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4Om5vbmV9LnRhYmxlLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Y29udGFpbjpsYXlvdXQgcGFpbnQ7ZmxleC1ncm93OjE7bWF4LXdpZHRoOjEwMCU7b3ZlcmZsb3cteDphdXRvO292ZXJmbG93LXk6YXV0bzt3aWxsLWNoYW5nZTp0cmFuc2Zvcm0sc2Nyb2xsLXBvc2l0aW9ufS5mbGV4LWxheW91dFtfbmdob3N0LSVDT01QJV0gICAubmFtZVtfbmdjb250ZW50LSVDT01QJV17d29yZC1icmVhazpicmVhay13b3JkO292ZXJmbG93LXdyYXA6YnJlYWstd29yZH0uZmxleC1sYXlvdXRbX25naG9zdC0lQ09NUCVdICAgbWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgI2ViZWJlYjtwYWRkaW5nLWJvdHRvbToxMnB4fWJvZHkuZGFyay1tb2RlICAgLmZsZXgtbGF5b3V0W19uZ2hvc3QtJUNPTVAlXSAgIG1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MXB4IHNvbGlkICM1NTV9W3JvbGU9dGFibGVdW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OnRhYmxlO3dpZHRoOjEwMCV9W3JvbGU9dGFibGVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5oZWFkZXJbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcH1bcm9sZT10YWJsZV1bX25nY29udGVudC0lQ09NUCVdICAgLmhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICBbcm9sZT1jb2x1bW5oZWFkZXJdW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7cG9zaXRpb246c3RpY2t5O3RvcDowO3otaW5kZXg6MX1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICBbcm9sZT10YWJsZV1bX25nY29udGVudC0lQ09NUCVdICAgLmhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICBbcm9sZT1jb2x1bW5oZWFkZXJdW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgW3JvbGU9dGFibGVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgW3JvbGU9Y29sdW1uaGVhZGVyXVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMzAzMDMwfVtyb2xlPXRhYmxlXVtfbmdjb250ZW50LSVDT01QJV0gICBbcm9sZT1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXXtjb250YWluOnN0cmljdDtkaXNwbGF5OnRhYmxlLXJvdztoZWlnaHQ6NDNweH1bcm9sZT10YWJsZV1bX25nY29udGVudC0lQ09NUCVdICAgW3JvbGU9cm93XVtfbmdjb250ZW50LSVDT01QJV0gICAuY29sdW1uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmViO2Rpc3BsYXk6dGFibGUtY2VsbDtwYWRkaW5nOjVweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgW3JvbGU9dGFibGVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIFtyb2xlPXJvd11bX25nY29udGVudC0lQ09NUCVdICAgLmNvbHVtbltfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIFtyb2xlPXRhYmxlXVtfbmdjb250ZW50LSVDT01QJV0gICBbcm9sZT1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jb2x1bW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkICM1NTV9W3JvbGU9dGFibGVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIFtyb2xlPXJvd11bX25nY29udGVudC0lQ09NUCVdICAgLmNvbHVtbltfbmdjb250ZW50LSVDT01QJV06Zmlyc3QtY2hpbGR7cGFkZGluZy1sZWZ0OjI0cHh9W3JvbGU9dGFibGVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIFtyb2xlPXJvd11bX25nY29udGVudC0lQ09NUCVdICAgLmNvbHVtbltfbmdjb250ZW50LSVDT01QJV06bGFzdC1jaGlsZHtwYWRkaW5nLXJpZ2h0OjI0cHh9W3JvbGU9cm93Z3JvdXBdW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OnRhYmxlLXJvdy1ncm91cH1bcm9sZT1yb3dncm91cF0uaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OnRhYmxlLWhlYWRlci1ncm91cH0ubG9hZGluZ1tfbmdjb250ZW50LSVDT01QJV0sIC5uby1ydW5zW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7Ym9yZGVyOjA7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2ViZWJlYjtkaXNwbGF5OmZsZXg7aGVpZ2h0OjQ4cHg7cGFkZGluZzowIDI0cHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmxvYWRpbmdbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAubG9hZGluZ1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzU1NX1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAubm8tcnVuc1tfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5uby1ydW5zW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjNTU1fS5sb2FkaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5zZWxlY3QtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxMnB4O3BhZGRpbmctdG9wOjEycHh9LnNlbGVjdC1hbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV0sIC5zZWxlY3QtYWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS42O3RleHQtYWxpZ246bGVmdH0uc2VsZWN0LWFsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NTAwO3BhZGRpbmc6MCA0cHh9LmZpbHRlci1yb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWI7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtoZWlnaHQ6NDhweDtwYWRkaW5nOjAgMTZweCAwIDIxcHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmZpbHRlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuZmlsdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzU1NX0uZmlsdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0gICB0Yi1maWx0ZXItaW5wdXRbX25nY29udGVudC0lQ09NUCVde2ZsZXgtZ3JvdzoxfS50Yi1jb2x1bW4tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdLCAudGItY29sdW1uLXJ1bl9jb2xvcltfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjBweH0udGItY29sdW1uLXJ1bl9jb2xvcltfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpjZW50ZXJ9LnJ1bi1jb2xvci1zd2F0Y2hbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yYWRpdXM6MTAwJTtib3JkZXI6MXB4IHNvbGlkICNlYmViZWI7aGVpZ2h0OjIwcHg7d2lkdGg6MjBweDtvdXRsaW5lOm5vbmV9LnJ1bi1jb2xvci1zd2F0Y2gubm8tY29sb3JbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojYzZjYWQxO2JvcmRlci13aWR0aDoycHh9LnJhbmdlLWlucHV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OmF1dG99W19uZ2hvc3QtJUNPTVAlXSAgICAgbWF0LXBhZ2luYXRvciBtYXQtZm9ybS1maWVsZHttYXJnaW46MH0uZmlsdGVyLW1lbnUtY2hlY2tib3gtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIG1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV0gICAgIGxhYmVse2Rpc3BsYXk6ZmxleDtoZWlnaHQ6MTAwJTthbGlnbi1pdGVtczpjZW50ZXJ9LmZpbHRlci1tZW51LWNoZWNrYm94LXJvd1tfbmdjb250ZW50LSVDT01QJV0gICBtYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdICAgICBsYWJlbCAubWF0LWNoZWNrYm94LWlubmVyLWNvbnRhaW5lcnttYXJnaW4tbGVmdDowfS5maWx0ZXItbWVudS1jaGVja2JveC1yb3dbX25nY29udGVudC0lQ09NUCVdICAgbWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXSAgICAgbGFiZWwgLm1hdC1jaGVja2JveC1sYWJlbHtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpc31ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICBtYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgbWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMzAzMDMwfSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChvMixbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJydW5zLXRhYmxlLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6InJ1bnNfdGFibGVfY29tcG9uZW50Lm5nLmh0bWwiLGhvc3Q6eyJbY2xhc3MuZmxleC1sYXlvdXRdIjoidXNlRmxleGlibGVMYXlvdXQifSxzdHlsZVVybHM6WyJydW5zX3RhYmxlX2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLHByb3ZpZGVyczpbe3Byb3ZpZGU6WlEsdXNlQ2xhc3M6bjJ9XX1dfV0sbnVsbCx7ZXhwZXJpbWVudElkczpbe3R5cGU6eHl9XSxzaG93RXhwZXJpbWVudE5hbWU6W3t0eXBlOnh5fV0sY29sdW1uczpbe3R5cGU6eHl9XSxocGFyYW1Db2x1bW5zOlt7dHlwZTp4eX1dLG1ldHJpY0NvbHVtbnM6W3t0eXBlOnh5fV0sYWxsSXRlbXNMZW5ndGg6W3t0eXBlOnh5fV0sZmlsdGVyZWRJdGVtc0xlbmd0aDpbe3R5cGU6eHl9XSx1c2VGbGV4aWJsZUxheW91dDpbe3R5cGU6eHl9XSx1c2VQYWdpbmF0aW9uOlt7dHlwZTp4eX1dLHNob3dHcm91cENvbnRyb2w6W3t0eXBlOnh5fV0scGFnZUl0ZW1zOlt7dHlwZTp4eX1dLGxvYWRpbmc6W3t0eXBlOnh5fV0sbnVtU2VsZWN0ZWRJdGVtczpbe3R5cGU6eHl9XSxzb3J0T3B0aW9uOlt7dHlwZTp4eX1dLHBhZ2luYXRpb25PcHRpb246W3t0eXBlOnh5fV0scmVnZXhGaWx0ZXI6W3t0eXBlOnh5fV0sb25SZWdleEZpbHRlckNoYW5nZTpbe3R5cGU6T3l9XSxvblNlbGVjdGlvblRvZ2dsZTpbe3R5cGU6T3l9XSxvblBhZ2VTZWxlY3Rpb25Ub2dnbGU6W3t0eXBlOk95fV0sb25QYWdpbmF0aW9uQ2hhbmdlOlt7dHlwZTpPeX1dLG9uU29ydENoYW5nZTpbe3R5cGU6T3l9XSxvblJ1bkNvbG9yQ2hhbmdlOlt7dHlwZTpPeX1dLG9uSHBhcmFtRGlzY3JldGVGaWx0ZXJDaGFuZ2VkOlt7dHlwZTpPeX1dLG9uSHBhcmFtSW50ZXJ2YWxGaWx0ZXJDaGFuZ2VkOlt7dHlwZTpPeX1dLG9uTWV0cmljRmlsdGVyQ2hhbmdlZDpbe3R5cGU6T3l9XSxmaWx0ZXI6W3t0eXBlOlphLGFyZ3M6WyJmaWx0ZXIiLHtzdGF0aWM6ITAscmVhZDpoZ31dfV0scGFnaW5hdG9yOlt7dHlwZTpaYSxhcmdzOlt0JCx7c3RhdGljOiEwfV19XSxzb3J0Olt7dHlwZTpaYSxhcmdzOlthJCx7c3RhdGljOiEwfV19XX0pO2NvbnN0IGkyPVp3KHBOLCh0PT50LnN0YXRlPT09eUUuTE9BRElORykpO2Z1bmN0aW9uIGEyKHQsZSl7c3dpdGNoKGUudHlwZSl7Y2FzZSAkVC5FWFBFUklNRU5UX05BTUU6cmV0dXJuW3QuZXhwZXJpbWVudEFsaWFzLHQucnVuLm5hbWUsdC5ydW4uaWRdO2Nhc2UgJFQuUlVOX05BTUU6cmV0dXJuW3QucnVuLm5hbWUsdC5leHBlcmltZW50QWxpYXMsdC5ydW4uaWRdO2Nhc2UgJFQuSFBBUkFNOnJldHVyblt0LmhwYXJhbXMuZ2V0KGUubmFtZSksdC5ydW4ubmFtZSx0LmV4cGVyaW1lbnRBbGlhcyx0LnJ1bi5pZF07Y2FzZSAkVC5NRVRSSUM6cmV0dXJuW3QubWV0cmljcy5nZXQoZS50YWcpLHQucnVuLm5hbWUsdC5leHBlcmltZW50QWxpYXMsdC5ydW4uaWRdO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBOb3QgeWV0IGltcGxlbWVudGVkOiAke2V9YCl9fWZ1bmN0aW9uIHIyKHQsZSl7cmV0dXJuIHZvaWQgMD09PWU/dC5pbmNsdWRlVW5kZWZpbmVkOnQudHlwZT09PVpSLkRJU0NSRVRFP3QuZmlsdGVyVmFsdWVzLmluY2x1ZGVzKGUpOnQudHlwZT09PVpSLklOVEVSVkFMJiZ0LmZpbHRlckxvd2VyVmFsdWU8PWUmJmU8PXQuZmlsdGVyVXBwZXJWYWx1ZX1jbGFzcyBzMntjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5sb2FkaW5nJD1udWxsLHRoaXMuaHBhcmFtQ29sdW1ucyQ9RXQoW10pLHRoaXMubWV0cmljQ29sdW1ucyQ9RXQoW10pLHRoaXMudXNlRmxleGlibGVMYXlvdXQ9ITEsdGhpcy51c2VQYWdpbmF0aW9uPSExLHRoaXMuY29sdW1ucz1bdlEuUlVOX05BTUVdLHRoaXMuc2hvd0hwYXJhbXNBbmRNZXRyaWNzPSExLHRoaXMuc29ydE9wdGlvbiQ9dGhpcy5zdG9yZS5zZWxlY3QoeU4pLHRoaXMucGFnaW5hdGlvbk9wdGlvbiQ9dGhpcy5zdG9yZS5zZWxlY3QoYk4pLHRoaXMucmVnZXhGaWx0ZXIkPXRoaXMuc3RvcmUuc2VsZWN0KGdOKSx0aGlzLm5nVW5zdWJzY3JpYmU9bmV3IEl9aXNFeHBlcmltZW50TmFtZVZpc2libGUoKXtyZXR1cm4gdGhpcy5jb2x1bW5zLnNvbWUoKHQ9PnQ9PT12US5FWFBFUklNRU5UX05BTUUpKX1uZ09uSW5pdCgpe2NvbnN0IHQ9V3QodGhpcy5leHBlcmltZW50SWRzLm1hcCgodD0+dGhpcy5nZXRSdW5UYWJsZUl0ZW1zRm9yRXhwZXJpbWVudCh0KSkpKS5waXBlKEl0KCh0PT5bXS5jb25jYXQoLi4udCkpKSk7dGhpcy5hbGxVbnNvcnRlZFJ1blRhYmxlSXRlbXMkPXQucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpLEFlKDEpKSx0aGlzLmFsbEl0ZW1zTGVuZ3RoJD10aGlzLmFsbFVuc29ydGVkUnVuVGFibGVJdGVtcyQucGlwZShJdCgodD0+dC5sZW5ndGgpKSk7Y29uc3QgZT10aGlzLmdldEZpbHRlcmVkSXRlbXMkKHRoaXMuYWxsVW5zb3J0ZWRSdW5UYWJsZUl0ZW1zJCkucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpLEFlKDEpKTt0aGlzLmZpbHRlcmVkSXRlbXNMZW5ndGgkPWUucGlwZShJdCgodD0+dC5sZW5ndGgpKSksdGhpcy5wYWdlSXRlbXMkPXRoaXMuc29ydGVkQW5kU2xpY2VkSXRlbXMkKGUpLHRoaXMubnVtU2VsZWN0ZWRJdGVtcyQ9dGhpcy5hbGxVbnNvcnRlZFJ1blRhYmxlSXRlbXMkLnBpcGUoSXQoKHQ9PnQucmVkdWNlKCgodCxlKT0+dCtOdW1iZXIoZS5zZWxlY3RlZCkpLDApKSkpO2NvbnN0IG49dGhpcy5leHBlcmltZW50SWRzLm1hcCgodD0+dGhpcy5zdG9yZS5zZWxlY3QoaTIse2V4cGVyaW1lbnRJZDp0fSkpKTtpZih0aGlzLmxvYWRpbmckPVd0KG4pLnBpcGUoSXQoKHQ9PnQuc29tZSgodD0+dCkpKSkpLHRoaXMuc2hvd0hwYXJhbXNBbmRNZXRyaWNzKXtjb25zdCB0PXRoaXMuc3RvcmUuc2VsZWN0KFNRLHtleHBlcmltZW50SWRzOnRoaXMuZXhwZXJpbWVudElkc30pO3RoaXMuaHBhcmFtQ29sdW1ucyQ9V3QoW3RoaXMuc3RvcmUuc2VsZWN0KFBRLHRoaXMuZXhwZXJpbWVudElkcyksdF0pLnBpcGUoSXQoKChbdCx7aHBhcmFtczplfV0pPT5lLm1hcCgoKHtuYW1lOmUsZGlzcGxheU5hbWU6bn0pPT57Y29uc3Qgbz10LmdldChlKTtpZighbyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YXJpYW50IGVycm9yOiBhIGZpbHRlciBmb3IgJHtlfSBtdXN0IGV4aXN0IHdoZW4gdGhlIGhwYXJhbSBleGlzdHNgKTtyZXR1cm57ZGlzcGxheU5hbWU6bixuYW1lOmUsZmlsdGVyOm99fSkpKSkpLHRoaXMubWV0cmljQ29sdW1ucyQ9V3QoW3RoaXMuc3RvcmUuc2VsZWN0KGtRLHRoaXMuZXhwZXJpbWVudElkcyksdF0pLnBpcGUoSXQoKChbdCx7bWV0cmljczplfV0pPT5lLm1hcCgoKHt0YWc6ZSxkaXNwbGF5TmFtZTpufSk9Pntjb25zdCBvPXQuZ2V0KGUpO2lmKCFvKXRocm93IG5ldyBSYW5nZUVycm9yKGBJbnZhcmlhbnQgZXJyb3I6IGEgZmlsdGVyIGZvciAke2V9IG11c3QgZXhpc3Qgd2hlbiB0aGUgbWV0cmljIGV4aXN0c2ApO3JldHVybntkaXNwbGF5TmFtZTpuLHRhZzplLGZpbHRlcjpvfX0pKSkpKX10aGlzLmNvbHVtbnMuaW5jbHVkZXModlEuQ0hFQ0tCT1gpJiZ0aGlzLnN0b3JlLnNlbGVjdChOUykucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpLHplKCgoKT0+dC5waXBlKGNlKCh0PT50Lmxlbmd0aD41MDApKSxiZSgxKSkpKSkuc3Vic2NyaWJlKCgoKT0+e3RoaXMuc3RvcmUuZGlzcGF0Y2gobHooe2xvY2FsaXplZE1lc3NhZ2U6IlRoZSBudW1iZXIgb2YgcnVucyBleGNlZWRzIDUwMC4gTmV3IHJ1bnMgYXJlIHVuc2VsZWN0ZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIn0pKX0pKSx0aGlzLnNob3dHcm91cENvbnRyb2wkPXRoaXMuc3RvcmUuc2VsZWN0KGVFKS5waXBlKEl0KCh0PT50JiZ0aGlzLmNvbHVtbnMuaW5jbHVkZXModlEuUlVOX0NPTE9SKSkpKSx0aGlzLnN0b3JlLmRpc3BhdGNoKFVSKHtleHBlcmltZW50SWRzOnRoaXMuZXhwZXJpbWVudElkc30pKX1uZ09uRGVzdHJveSgpe3RoaXMubmdVbnN1YnNjcmliZS5uZXh0KCksdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCl9Z2V0RmlsdGVyZWRJdGVtcyQodCl7cmV0dXJuIFd0KFt0LHRoaXMuc3RvcmUuc2VsZWN0KGdOKV0pLnBpcGUoSXQoKChbdCxlXSk9PntpZighZSlyZXR1cm4gdDtjb25zdCBuPXRoaXMuY29sdW1ucy5pbmNsdWRlcyh2US5FWFBFUklNRU5UX05BTUUpO3JldHVybiB0LmZpbHRlcigodD0+VE4oe3J1bk5hbWU6dC5ydW4ubmFtZSxleHBlcmltZW50QWxpYXM6dC5leHBlcmltZW50QWxpYXMsZXhwZXJpbWVudE5hbWU6dC5leHBlcmltZW50TmFtZX0sZSxuKSkpfSkpLHplKCh0PT50aGlzLnNob3dIcGFyYW1zQW5kTWV0cmljcz9XdCh0aGlzLnN0b3JlLnNlbGVjdChQUSx0aGlzLmV4cGVyaW1lbnRJZHMpLHRoaXMuc3RvcmUuc2VsZWN0KGtRLHRoaXMuZXhwZXJpbWVudElkcykpLnBpcGUoSXQoKChbZSxuXSk9PnQuZmlsdGVyKCgoe2hwYXJhbXM6dCxtZXRyaWNzOm99KT0+Wy4uLmUuZW50cmllcygpXS5ldmVyeSgoKFtlLG5dKT0+cjIobix0LmdldChlKSkpKSYmWy4uLm4uZW50cmllcygpXS5ldmVyeSgoKFt0LGVdKT0+cjIoZSxvLmdldCh0KSkpKSkpKSkpOkV0KHQpKSkpfXNvcnRlZEFuZFNsaWNlZEl0ZW1zJCh0KXtjb25zdCBlPVd0KFt0LHRoaXMuc3RvcmUuc2VsZWN0KHlOKV0pLnBpcGUoSXQoKChbdCxlXSk9PihmdW5jdGlvbiBuKHQsZSl7Y29uc3Qgbj1lLmtleSxvPVsuLi50XTtyZXR1cm4gbnVsbD09PW58fGUuZGlyZWN0aW9uPT09Rk4uVU5TRVR8fG8uc29ydCgoKHQsbyk9Pntjb25zdCBpPWEyKHQsbiksYT1hMihvLG4pO2lmKGkubGVuZ3RoIT09YS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKGBJbnZhcmlhbnQgZXJyb3I6IGEgZ2l2ZW4gc29ydCBzaG91bGQgcmVzdWx0IGluIHNhbWUgbnVtYmVyIG9mIGl0ZW1zOiAke2V9YCk7Zm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0Kyspe2NvbnN0IG49aVt0XSxvPWFbdF07aWYobiE9PW8pe2lmKHZvaWQgMD09PW58fHZvaWQgMD09PW8pcmV0dXJuIHZvaWQgMD09PW8/LTE6MTtpZih0eXBlb2YgbiE9dHlwZW9mIG8pdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29tcGFyZSB2YWx1ZXMgb2YgZGlmZmVyZW50IHR5cGVzOiAke3R5cGVvZiBufSB2cy4gJHt0eXBlb2Ygb31gKTtyZXR1cm4gbjxvPT0oZS5kaXJlY3Rpb249PT1GTi5BU0MpPy0xOjF9fXJldHVybiAwfSkpLG99KSh0LGUpKSkpO3JldHVybiBXdChbZSx0aGlzLnN0b3JlLnNlbGVjdChiTildKS5waXBlKEl0KCgoW3QsZV0pPT57aWYoIXRoaXMudXNlUGFnaW5hdGlvbilyZXR1cm4gdC5zbGljZSgpO2NvbnN0e3BhZ2VTaXplOm4scGFnZUluZGV4Om99PWU7cmV0dXJuIHQuc2xpY2UobypuLChvKzEpKm4pfSkpLE5lKFtdKSl9Z2V0UnVuVGFibGVJdGVtc0ZvckV4cGVyaW1lbnQodCl7cmV0dXJuIFd0KFt0aGlzLnN0b3JlLnNlbGVjdChsTix7ZXhwZXJpbWVudElkOnR9KSx0aGlzLnN0b3JlLnNlbGVjdCh1QSx7ZXhwZXJpbWVudElkOnR9KSx0aGlzLnN0b3JlLnNlbGVjdChOTiksdGhpcy5zdG9yZS5zZWxlY3Qoek4pLHRoaXMuc3RvcmUuc2VsZWN0KHpTKV0pLnBpcGUoSXQoKChbZSxuLG8saSxhXSk9PmUubWFwKChlPT57Y29uc3Qgcj1uZXcgTWFwOyhlLmhwYXJhbXN8fFtdKS5mb3JFYWNoKCh0PT57ci5zZXQodC5uYW1lLHQudmFsdWUpfSkpO2NvbnN0IHM9bmV3IE1hcDtyZXR1cm4oZS5tZXRyaWNzfHxbXSkuZm9yRWFjaCgodD0+e3Muc2V0KHQudGFnLHQudmFsdWUpfSkpLHtydW46ZSxleHBlcmltZW50TmFtZToobnVsbD09bj92b2lkIDA6bi5uYW1lKXx8IiIsZXhwZXJpbWVudEFsaWFzOmFbdF0sc2VsZWN0ZWQ6Qm9vbGVhbihvJiZvLmdldChlLmlkKSkscnVuQ29sb3I6aVtlLmlkXSxocGFyYW1zOnIsbWV0cmljczpzfX0pKSkpKX1vblJ1blNlbGVjdGlvblRvZ2dsZSh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKEhSKHtleHBlcmltZW50SWRzOnRoaXMuZXhwZXJpbWVudElkcyxydW5JZDp0LnJ1bi5pZH0pKX1vblBhZ2VTZWxlY3Rpb25Ub2dnbGUodCl7Y29uc3R7aXRlbXM6ZX09dCxuPWUubWFwKCgoe3J1bjp0fSk9PnQuaWQpKTt0aGlzLnN0b3JlLmRpc3BhdGNoKEZSKHtleHBlcmltZW50SWRzOnRoaXMuZXhwZXJpbWVudElkcyxydW5JZHM6bn0pKX1vblBhZ2luYXRpb25DaGFuZ2UodCl7aWYoIXRoaXMudXNlUGFnaW5hdGlvbil0aHJvdyBuZXcgRXJyb3IoIlBhZ2luYXRpb24gZXZlbnRzIGNhbm5vdCBiZSBkaXNwYXRjaGVkIHdoZW4gcGFnaW5hdGlvbiBpcyBkaXNhYmxlZCIpO2NvbnN0e3BhZ2VJbmRleDplLHBhZ2VTaXplOm59PXQ7dGhpcy5zdG9yZS5kaXNwYXRjaChMUih7cGFnZUluZGV4OmUscGFnZVNpemU6bn0pKX1vblNvcnRDaGFuZ2UodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChCUih0KSl9b25SZWdleEZpbHRlckNoYW5nZSh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKFZSKHtyZWdleFN0cmluZzp0fSkpfW9uUnVuQ29sb3JDaGFuZ2Uoe3J1bklkOnQsbmV3Q29sb3I6ZX0pe3RoaXMuc3RvcmUuZGlzcGF0Y2goalIoe3J1bklkOnQsbmV3Q29sb3I6ZX0pKX1vbkhwYXJhbURpc2NyZXRlRmlsdGVyQ2hhbmdlZCh0KXtjb25zdHtocGFyYW1OYW1lOmUsZmlsdGVyVmFsdWVzOm4saW5jbHVkZVVuZGVmaW5lZDpvfT10O3RoaXMuc3RvcmUuZGlzcGF0Y2goS1Ioe2V4cGVyaW1lbnRJZHM6dGhpcy5leHBlcmltZW50SWRzLGhwYXJhbU5hbWU6ZSxmaWx0ZXJWYWx1ZXM6bixpbmNsdWRlVW5kZWZpbmVkOm99KSl9b25IcGFyYW1JbnRlcnZhbEZpbHRlckNoYW5nZWQodCl7Y29uc3R7bmFtZTplLGZpbHRlckxvd2VyVmFsdWU6bixmaWx0ZXJVcHBlclZhbHVlOm8saW5jbHVkZVVuZGVmaW5lZDppfT10O3RoaXMuc3RvcmUuZGlzcGF0Y2goSlIoe2V4cGVyaW1lbnRJZHM6dGhpcy5leHBlcmltZW50SWRzLGhwYXJhbU5hbWU6ZSxmaWx0ZXJMb3dlclZhbHVlOm4sZmlsdGVyVXBwZXJWYWx1ZTpvLGluY2x1ZGVVbmRlZmluZWQ6aX0pKX1vbk1ldHJpY0ZpbHRlckNoYW5nZWQodCl7Y29uc3R7bmFtZTplLGluY2x1ZGVVbmRlZmluZWQ6bixmaWx0ZXJMb3dlclZhbHVlOm8sZmlsdGVyVXBwZXJWYWx1ZTppfT10O3RoaXMuc3RvcmUuZGlzcGF0Y2goUVIoe2V4cGVyaW1lbnRJZHM6dGhpcy5leHBlcmltZW50SWRzLG1ldHJpY1RhZzplLGluY2x1ZGVVbmRlZmluZWQ6bixmaWx0ZXJMb3dlclZhbHVlOm8sZmlsdGVyVXBwZXJWYWx1ZTppfSkpfX1zMi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8czIpKFNtKEl3KSl9LHMyLsm1Y21wPXRvKHt0eXBlOnMyLHNlbGVjdG9yczpbWyJydW5zLXRhYmxlIl1dLGhvc3RWYXJzOjIsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJnB1KCJmbGV4LWxheW91dCIsbi51c2VGbGV4aWJsZUxheW91dCl9LGlucHV0czp7dXNlRmxleGlibGVMYXlvdXQ6InVzZUZsZXhpYmxlTGF5b3V0Iix1c2VQYWdpbmF0aW9uOiJ1c2VQYWdpbmF0aW9uIixjb2x1bW5zOiJjb2x1bW5zIixleHBlcmltZW50SWRzOiJleHBlcmltZW50SWRzIixzaG93SHBhcmFtc0FuZE1ldHJpY3M6InNob3dIcGFyYW1zQW5kTWV0cmljcyJ9LGRlY2xzOjEyLHZhcnM6MzgsY29uc3RzOltbMywiZXhwZXJpbWVudElkcyIsInVzZUZsZXhpYmxlTGF5b3V0IiwibnVtU2VsZWN0ZWRJdGVtcyIsImNvbHVtbnMiLCJocGFyYW1Db2x1bW5zIiwibWV0cmljQ29sdW1ucyIsInNob3dFeHBlcmltZW50TmFtZSIsInBhZ2VJdGVtcyIsImZpbHRlcmVkSXRlbXNMZW5ndGgiLCJhbGxJdGVtc0xlbmd0aCIsImxvYWRpbmciLCJwYWdpbmF0aW9uT3B0aW9uIiwicmVnZXhGaWx0ZXIiLCJzaG93R3JvdXBDb250cm9sIiwic29ydE9wdGlvbiIsInVzZVBhZ2luYXRpb24iLCJvblNlbGVjdGlvblRvZ2dsZSIsIm9uUGFnZVNlbGVjdGlvblRvZ2dsZSIsIm9uUGFnaW5hdGlvbkNoYW5nZSIsIm9uUmVnZXhGaWx0ZXJDaGFuZ2UiLCJvblNvcnRDaGFuZ2UiLCJvblJ1bkNvbG9yQ2hhbmdlIiwib25IcGFyYW1JbnRlcnZhbEZpbHRlckNoYW5nZWQiLCJvbkhwYXJhbURpc2NyZXRlRmlsdGVyQ2hhbmdlZCIsIm9uTWV0cmljRmlsdGVyQ2hhbmdlZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwicnVucy10YWJsZS1jb21wb25lbnQiLDApLFZtKCJvblNlbGVjdGlvblRvZ2dsZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25SdW5TZWxlY3Rpb25Ub2dnbGUoZSl9KSkoIm9uUGFnZVNlbGVjdGlvblRvZ2dsZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25QYWdlU2VsZWN0aW9uVG9nZ2xlKGUpfSkpKCJvblBhZ2luYXRpb25DaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uUGFnaW5hdGlvbkNoYW5nZShlKX0pKSgib25SZWdleEZpbHRlckNoYW5nZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25SZWdleEZpbHRlckNoYW5nZShlKX0pKSgib25Tb3J0Q2hhbmdlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblNvcnRDaGFuZ2UoZSl9KSkoIm9uUnVuQ29sb3JDaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uUnVuQ29sb3JDaGFuZ2UoZSl9KSkoIm9uSHBhcmFtSW50ZXJ2YWxGaWx0ZXJDaGFuZ2VkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vbkhwYXJhbUludGVydmFsRmlsdGVyQ2hhbmdlZChlKX0pKSgib25IcGFyYW1EaXNjcmV0ZUZpbHRlckNoYW5nZWQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uSHBhcmFtRGlzY3JldGVGaWx0ZXJDaGFuZ2VkKGUpfSkpKCJvbk1ldHJpY0ZpbHRlckNoYW5nZWQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uTWV0cmljRmlsdGVyQ2hhbmdlZChlKX0pKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQWgoMywiYXN5bmMiKSxBaCg0LCJhc3luYyIpLEFoKDUsImFzeW5jIiksQWgoNiwiYXN5bmMiKSxBaCg3LCJhc3luYyIpLEFoKDgsImFzeW5jIiksQWgoOSwiYXN5bmMiKSxBaCgxMCwiYXN5bmMiKSxBaCgxMSwiYXN5bmMiKSxBbSgpKSwyJmUmJkRtKCJleHBlcmltZW50SWRzIixuLmV4cGVyaW1lbnRJZHMpKCJ1c2VGbGV4aWJsZUxheW91dCIsbi51c2VGbGV4aWJsZUxheW91dCkoIm51bVNlbGVjdGVkSXRlbXMiLFRoKDEsMTYsbi5udW1TZWxlY3RlZEl0ZW1zJCkpKCJjb2x1bW5zIixuLmNvbHVtbnMpKCJocGFyYW1Db2x1bW5zIixUaCgyLDE4LG4uaHBhcmFtQ29sdW1ucyQpKSgibWV0cmljQ29sdW1ucyIsVGgoMywyMCxuLm1ldHJpY0NvbHVtbnMkKSkoInNob3dFeHBlcmltZW50TmFtZSIsbi5pc0V4cGVyaW1lbnROYW1lVmlzaWJsZSgpKSgicGFnZUl0ZW1zIixUaCg0LDIyLG4ucGFnZUl0ZW1zJCkpKCJmaWx0ZXJlZEl0ZW1zTGVuZ3RoIixUaCg1LDI0LG4uZmlsdGVyZWRJdGVtc0xlbmd0aCQpKSgiYWxsSXRlbXNMZW5ndGgiLFRoKDYsMjYsbi5hbGxJdGVtc0xlbmd0aCQpKSgibG9hZGluZyIsVGgoNywyOCxuLmxvYWRpbmckKSkoInBhZ2luYXRpb25PcHRpb24iLFRoKDgsMzAsbi5wYWdpbmF0aW9uT3B0aW9uJCkpKCJyZWdleEZpbHRlciIsVGgoOSwzMixuLnJlZ2V4RmlsdGVyJCkpKCJzaG93R3JvdXBDb250cm9sIixUaCgxMCwzNCxuLnNob3dHcm91cENvbnRyb2wkKSkoInNvcnRPcHRpb24iLFRoKDExLDM2LG4uc29ydE9wdGlvbiQpKSgidXNlUGFnaW5hdGlvbiIsbi51c2VQYWdpbmF0aW9uKX0sZGlyZWN0aXZlczpbbzJdLHBpcGVzOlt3TV0sc3R5bGVzOlsiLmZsZXgtbGF5b3V0W19uZ2hvc3QtJUNPTVAlXSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB9XG5cbiAgICAgIC5mbGV4LWxheW91dFtfbmdob3N0LSVDT01QJV0gICAgPiBydW5zLXRhYmxlLWNvbXBvbmVudFtfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH0iXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoczIsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoicnVucy10YWJsZSIsdGVtcGxhdGU6J1xuICAgIDxydW5zLXRhYmxlLWNvbXBvbmVudFxuICAgICAgW2V4cGVyaW1lbnRJZHNdPSJleHBlcmltZW50SWRzIlxuICAgICAgW3VzZUZsZXhpYmxlTGF5b3V0XT0idXNlRmxleGlibGVMYXlvdXQiXG4gICAgICBbbnVtU2VsZWN0ZWRJdGVtc109Im51bVNlbGVjdGVkSXRlbXMkIHwgYXN5bmMiXG4gICAgICBbY29sdW1uc109ImNvbHVtbnMiXG4gICAgICBbaHBhcmFtQ29sdW1uc109ImhwYXJhbUNvbHVtbnMkIHwgYXN5bmMiXG4gICAgICBbbWV0cmljQ29sdW1uc109Im1ldHJpY0NvbHVtbnMkIHwgYXN5bmMiXG4gICAgICBbc2hvd0V4cGVyaW1lbnROYW1lXT0iaXNFeHBlcmltZW50TmFtZVZpc2libGUoKSJcbiAgICAgIFtwYWdlSXRlbXNdPSJwYWdlSXRlbXMkIHwgYXN5bmMiXG4gICAgICBbZmlsdGVyZWRJdGVtc0xlbmd0aF09ImZpbHRlcmVkSXRlbXNMZW5ndGgkIHwgYXN5bmMiXG4gICAgICBbYWxsSXRlbXNMZW5ndGhdPSJhbGxJdGVtc0xlbmd0aCQgfCBhc3luYyJcbiAgICAgIFtsb2FkaW5nXT0ibG9hZGluZyQgfCBhc3luYyJcbiAgICAgIFtwYWdpbmF0aW9uT3B0aW9uXT0icGFnaW5hdGlvbk9wdGlvbiQgfCBhc3luYyJcbiAgICAgIFtyZWdleEZpbHRlcl09InJlZ2V4RmlsdGVyJCB8IGFzeW5jIlxuICAgICAgW3Nob3dHcm91cENvbnRyb2xdPSJzaG93R3JvdXBDb250cm9sJCB8IGFzeW5jIlxuICAgICAgW3NvcnRPcHRpb25dPSJzb3J0T3B0aW9uJCB8IGFzeW5jIlxuICAgICAgW3VzZVBhZ2luYXRpb25dPSJ1c2VQYWdpbmF0aW9uIlxuICAgICAgKG9uU2VsZWN0aW9uVG9nZ2xlKT0ib25SdW5TZWxlY3Rpb25Ub2dnbGUoJGV2ZW50KSJcbiAgICAgIChvblBhZ2VTZWxlY3Rpb25Ub2dnbGUpPSJvblBhZ2VTZWxlY3Rpb25Ub2dnbGUoJGV2ZW50KSJcbiAgICAgIChvblBhZ2luYXRpb25DaGFuZ2UpPSJvblBhZ2luYXRpb25DaGFuZ2UoJGV2ZW50KSJcbiAgICAgIChvblJlZ2V4RmlsdGVyQ2hhbmdlKT0ib25SZWdleEZpbHRlckNoYW5nZSgkZXZlbnQpIlxuICAgICAgKG9uU29ydENoYW5nZSk9Im9uU29ydENoYW5nZSgkZXZlbnQpIlxuICAgICAgKG9uUnVuQ29sb3JDaGFuZ2UpPSJvblJ1bkNvbG9yQ2hhbmdlKCRldmVudCkiXG4gICAgICAob25IcGFyYW1JbnRlcnZhbEZpbHRlckNoYW5nZWQpPSJvbkhwYXJhbUludGVydmFsRmlsdGVyQ2hhbmdlZCgkZXZlbnQpIlxuICAgICAgKG9uSHBhcmFtRGlzY3JldGVGaWx0ZXJDaGFuZ2VkKT0ib25IcGFyYW1EaXNjcmV0ZUZpbHRlckNoYW5nZWQoJGV2ZW50KSJcbiAgICAgIChvbk1ldHJpY0ZpbHRlckNoYW5nZWQpPSJvbk1ldHJpY0ZpbHRlckNoYW5nZWQoJGV2ZW50KSJcbiAgICA+PC9ydW5zLXRhYmxlLWNvbXBvbmVudD5cbiAgJyxob3N0OnsiW2NsYXNzLmZsZXgtbGF5b3V0XSI6InVzZUZsZXhpYmxlTGF5b3V0In0sc3R5bGVzOlsiXG4gICAgICA6aG9zdC5mbGV4LWxheW91dCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB9XG5cbiAgICAgIDpob3N0LmZsZXgtbGF5b3V0ID4gcnVucy10YWJsZS1jb21wb25lbnQge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH1cbiAgICAiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLHt1c2VGbGV4aWJsZUxheW91dDpbe3R5cGU6eHl9XSx1c2VQYWdpbmF0aW9uOlt7dHlwZTp4eX1dLGNvbHVtbnM6W3t0eXBlOnh5fV0sZXhwZXJpbWVudElkczpbe3R5cGU6eHl9XSxzaG93SHBhcmFtc0FuZE1ldHJpY3M6W3t0eXBlOnh5fV19KTtjbGFzcyBsMnt9bDIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGwyKX0sbDIuybVjbXA9dG8oe3R5cGU6bDIsc2VsZWN0b3JzOltbInJ1bnMtc2VsZWN0b3ItY29tcG9uZW50Il1dLGlucHV0czp7ZXhwZXJpbWVudElkczoiZXhwZXJpbWVudElkcyIsc2hvd0hwYXJhbXNBbmRNZXRyaWNzOiJzaG93SHBhcmFtc0FuZE1ldHJpY3MiLGNvbHVtbnM6ImNvbHVtbnMifSxkZWNsczoxLHZhcnM6NCxjb25zdHM6W1szLCJ1c2VGbGV4aWJsZUxheW91dCIsImNvbHVtbnMiLCJleHBlcmltZW50SWRzIiwic2hvd0hwYXJhbXNBbmRNZXRyaWNzIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJlRtKDAsInJ1bnMtdGFibGUiLDApLDImZSYmRG0oInVzZUZsZXhpYmxlTGF5b3V0IiwhMCkoImNvbHVtbnMiLG4uY29sdW1ucykoImV4cGVyaW1lbnRJZHMiLG4uZXhwZXJpbWVudElkcykoInNob3dIcGFyYW1zQW5kTWV0cmljcyIsbi5zaG93SHBhcmFtc0FuZE1ldHJpY3MpfSxkaXJlY3RpdmVzOltzMl0sc3R5bGVzOlsicnVucy10YWJsZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICB9Il0sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGwyLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InJ1bnMtc2VsZWN0b3ItY29tcG9uZW50Iix0ZW1wbGF0ZTonXG4gICAgPHJ1bnMtdGFibGVcbiAgICAgIFt1c2VGbGV4aWJsZUxheW91dF09InRydWUiXG4gICAgICBbY29sdW1uc109ImNvbHVtbnMiXG4gICAgICBbZXhwZXJpbWVudElkc109ImV4cGVyaW1lbnRJZHMiXG4gICAgICBbc2hvd0hwYXJhbXNBbmRNZXRyaWNzXT0ic2hvd0hwYXJhbXNBbmRNZXRyaWNzIlxuICAgID48L3J1bnMtdGFibGU+XG4gICcsc3R5bGVzOlsiXG4gICAgICBydW5zLXRhYmxlIHtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgfVxuICAgICJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse2V4cGVyaW1lbnRJZHM6W3t0eXBlOnh5fV0sc2hvd0hwYXJhbXNBbmRNZXRyaWNzOlt7dHlwZTp4eX1dLGNvbHVtbnM6W3t0eXBlOnh5fV19KTtjbGFzcyBjMntjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5leHBlcmltZW50SWRzJD10aGlzLnN0b3JlLnNlbGVjdChUUykucGlwZShJdCgodD0+bnVsbCE9dD90OltdKSkpLHRoaXMuY29sdW1ucyQ9dGhpcy5zdG9yZS5zZWxlY3QoVFMpLnBpcGUoSXQoKHQ9Plt2US5DSEVDS0JPWCx2US5SVU5fTkFNRSx0JiZ0Lmxlbmd0aD4xP3ZRLkVYUEVSSU1FTlRfTkFNRTpudWxsLHZRLlJVTl9DT0xPUl0uZmlsdGVyKCh0PT5udWxsIT09dCkpKSkpfX1jMi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8YzIpKFNtKEl3KSl9LGMyLsm1Y21wPXRvKHt0eXBlOmMyLHNlbGVjdG9yczpbWyJydW5zLXNlbGVjdG9yIl1dLGlucHV0czp7c2hvd0hwYXJhbXNBbmRNZXRyaWNzOiJzaG93SHBhcmFtc0FuZE1ldHJpY3MifSxkZWNsczozLHZhcnM6Nyxjb25zdHM6W1szLCJleHBlcmltZW50SWRzIiwiY29sdW1ucyIsInNob3dIcGFyYW1zQW5kTWV0cmljcyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwicnVucy1zZWxlY3Rvci1jb21wb25lbnQiLDApLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSksMiZlJiZEbSgiZXhwZXJpbWVudElkcyIsVGgoMSwzLG4uZXhwZXJpbWVudElkcyQpKSgiY29sdW1ucyIsVGgoMiw1LG4uY29sdW1ucyQpKSgic2hvd0hwYXJhbXNBbmRNZXRyaWNzIixuLnNob3dIcGFyYW1zQW5kTWV0cmljcyl9LGRpcmVjdGl2ZXM6W2wyXSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoYzIsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoicnVucy1zZWxlY3RvciIsdGVtcGxhdGU6J1xuICAgIDxydW5zLXNlbGVjdG9yLWNvbXBvbmVudFxuICAgICAgW2V4cGVyaW1lbnRJZHNdPSJleHBlcmltZW50SWRzJCB8IGFzeW5jIlxuICAgICAgW2NvbHVtbnNdPSJjb2x1bW5zJCB8IGFzeW5jIlxuICAgICAgW3Nob3dIcGFyYW1zQW5kTWV0cmljc109InNob3dIcGFyYW1zQW5kTWV0cmljcyJcbiAgICA+PC9ydW5zLXNlbGVjdG9yLWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLHtzaG93SHBhcmFtc0FuZE1ldHJpY3M6W3t0eXBlOnh5fV19KTtjb25zdCBkMj1uZXcgV2Vha01hcDtjbGFzcyBwMntjb25zdHJ1Y3Rvcih0LGUpe3RoaXMucm9vdD10LHRoaXMuYnVmZmVyPWUsdGhpcy5kZXN0cm95ZWRUYXJnZXRzPW5ldyBXZWFrU2V0fWluaXRpYWxpemUodCl7dGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlcnx8KHRoaXMuaW50ZXJzZWN0aW9uQ2FsbGJhY2s9dCx0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyPW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcih0aGlzLm9uQ2FyZEludGVyc2VjdGlvbi5iaW5kKHRoaXMpLHt0aHJlc2hvbGQ6MCxyb290OnRoaXMucm9vdCxyb290TWFyZ2luOnRoaXMuYnVmZmVyfSkpfWFkZCh0KXt0aGlzLmVuc3VyZUluaXRpYWxpemVkKCkmJnRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIub2JzZXJ2ZSh0KX13aWxsRGVzdHJveSh0KXt0aGlzLmVuc3VyZUluaXRpYWxpemVkKCkmJnRoaXMuZGVzdHJveWVkVGFyZ2V0cy5hZGQodCl9ZW5zdXJlSW5pdGlhbGl6ZWQoKXtpZighdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlcil0aHJvdyBuZXcgRXJyb3IoIkNhcmRPYnNlcnZlciBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB1c2UiKTtyZXR1cm4hMH1vbkNhcmRJbnRlcnNlY3Rpb24odCl7dC5zb3J0KCgodCxlKT0+dC50aW1lLWUudGltZSkpO2NvbnN0IGU9bmV3IFNldCxuPW5ldyBTZXQ7Zm9yKGNvbnN0e2lzSW50ZXJzZWN0aW5nOm8sdGFyZ2V0Oml9b2YgdClvPyhlLmFkZChpKSxuLmRlbGV0ZShpKSk6KGUuZGVsZXRlKGkpLG4uYWRkKGkpKSx0aGlzLmRlc3Ryb3llZFRhcmdldHMuaGFzKGkpJiYhbyYmKHRoaXMuZGVzdHJveWVkVGFyZ2V0cy5kZWxldGUoaSksdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlci51bm9ic2VydmUoaSkpO3RoaXMuaW50ZXJzZWN0aW9uQ2FsbGJhY2soZSxuKX1vbkNhcmRJbnRlcnNlY3Rpb25Gb3JUZXN0KHQpe3RoaXMub25DYXJkSW50ZXJzZWN0aW9uKHQpfX1jbGFzcyBtMntjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuaG9zdD10LHRoaXMuc3RvcmU9ZX1vbkNhcmRJbnRlcnNlY3Rpb24odCxlKXtjb25zdCBuPVsuLi50XS5tYXAoKHQ9Pntjb25zdCBlPWQyLmdldCh0KTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIkEgQ2FyZE9ic2VydmVyIGVsZW1lbnQgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgZWxlbWVudCBpZCBhbmQgY2FyZCBpZC4iKTtyZXR1cm57ZWxlbWVudElkOmUuZWxlbWVudElkLGNhcmRJZDplLmNhcmRJZH19KSksbz1bLi4uZV0ubWFwKCh0PT57Y29uc3QgZT1kMi5nZXQodCk7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJBIENhcmRPYnNlcnZlciBlbGVtZW50IG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGVsZW1lbnQgaWQgYW5kIGNhcmQgaWQuIik7cmV0dXJue2VsZW1lbnRJZDplLmVsZW1lbnRJZCxjYXJkSWQ6ZS5jYXJkSWR9fSkpO3RoaXMuc3RvcmUuZGlzcGF0Y2goJEUoe2VudGVyZWRDYXJkczpuLGV4aXRlZENhcmRzOm99KSl9bmdPbkluaXQoKXtjb25zdCB0PXRoaXMuaG9zdC5uYXRpdmVFbGVtZW50O2QyLnNldCh0LHtlbGVtZW50SWQ6KGhRKyssU3ltYm9sKGhRKSksY2FyZElkOnRoaXMuY2FyZElkfSksdGhpcy5jYXJkT2JzZXJ2ZXJ8fCh0aGlzLmNhcmRPYnNlcnZlcj1uZXcgcDIpLHRoaXMuY2FyZE9ic2VydmVyLmluaXRpYWxpemUodGhpcy5vbkNhcmRJbnRlcnNlY3Rpb24uYmluZCh0aGlzKSksdGhpcy5jYXJkT2JzZXJ2ZXIuYWRkKHQpfW5nT25EZXN0cm95KCl7dGhpcy5jYXJkT2JzZXJ2ZXImJnRoaXMuY2FyZE9ic2VydmVyLndpbGxEZXN0cm95KHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50KX1ob3N0Rm9yVGVzdCgpe3JldHVybiB0aGlzLmhvc3R9fW0yLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxtMikoU20oaGcpLFNtKEl3KSl9LG0yLsm1ZGlyPWxvKHt0eXBlOm0yLHNlbGVjdG9yczpbWyIiLCJjYXJkTGF6eUxvYWRlciIsIiJdXSxpbnB1dHM6e2NhcmRJZDpbImNhcmRMYXp5TG9hZGVyIiwiY2FyZElkIl0sY2FyZE9ic2VydmVyOiJjYXJkT2JzZXJ2ZXIifX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobTIsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW2NhcmRMYXp5TG9hZGVyXSJ9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6SXd9XX0pLHtjYXJkSWQ6W3t0eXBlOnh5LGFyZ3M6WyJjYXJkTGF6eUxvYWRlciJdfV0sY2FyZE9ic2VydmVyOlt7dHlwZTp4eX1dfSk7Y29uc3QgdTI9Ii9zY2FsYXJfc3VtbWFyeSI7ZnVuY3Rpb24gZjIodCxlKXtsZXQgbj10O3JldHVybiBlJiZ0LnN0YXJ0c1dpdGgoZSsiLyIpJiYobj10LnNsaWNlKGUubGVuZ3RoKzEpKSxuLmVuZHNXaXRoKHUyKSYmKG49bi5zbGljZSgwLC11Mi5sZW5ndGgpKSxufHx0fWZ1bmN0aW9uIGcyKHQsZSl7bGV0IG49MCxvPTA7Zm9yKDs7KXtpZihuPT09dC5sZW5ndGgpcmV0dXJuIG89PT1lLmxlbmd0aD8wOi0xO2lmKG89PT1lLmxlbmd0aClyZXR1cm4gMTtpZihiMih0W25dKSYmYjIoZVtvXSkpe2NvbnN0IGk9bixhPW87bj1oMih0LG4rMSksbz1oMihlLG8rMSk7Y29uc3Qgcj1OdW1iZXIodC5zbGljZShpLG4pKSxzPU51bWJlcihlLnNsaWNlKGEsbykpO2lmKHI8cylyZXR1cm4tMTtpZihyPnMpcmV0dXJuIDF9ZWxzZXtpZih5Mih0W25dKSl7aWYoIXkyKGVbb10pKXJldHVybi0xfWVsc2V7aWYoeTIoZVtvXSkpcmV0dXJuIDE7aWYodFtuXTxlW29dKXJldHVybi0xO2lmKHRbbl0+ZVtvXSlyZXR1cm4gMX1uKyssbysrfX19ZnVuY3Rpb24gaDIodCxlKXtsZXQgbjshKGZ1bmN0aW9uKHQpe3RbdC5OQVRVUkFMPTBdPSJOQVRVUkFMIix0W3QuUkVBTD0xXT0iUkVBTCIsdFt0LkVYUE9ORU5UX1NJR049Ml09IkVYUE9ORU5UX1NJR04iLHRbdC5FWFBPTkVOVD0zXT0iRVhQT05FTlQifSkobnx8KG49e30pKTtsZXQgbz1uLk5BVFVSQUwsaT1lO2Zvcig7aTx0Lmxlbmd0aDtpKyspaWYobz09PW4uTkFUVVJBTCl7aWYoIi4iPT09dFtpXSlvPW4uUkVBTDtlbHNlIGlmKCJlIj09PXRbaV18fCJFIj09PXRbaV0pbz1uLkVYUE9ORU5UX1NJR047ZWxzZSBpZighYjIodFtpXSkpYnJlYWt9ZWxzZSBpZihvPT09bi5SRUFMKXtpZigiZSI9PT10W2ldfHwiRSI9PT10W2ldKW89bi5FWFBPTkVOVF9TSUdOO2Vsc2UgaWYoIWIyKHRbaV0pKWJyZWFrfWVsc2UgaWYobz09PW4uRVhQT05FTlRfU0lHTil7aWYoIWIyKHRbaV0pJiYiKyIhPT10W2ldJiYiLSIhPT10W2ldKWJyZWFrO289bi5FWFBPTkVOVH1lbHNlIGlmKG89PT1uLkVYUE9ORU5UJiYhYjIodFtpXSkpYnJlYWs7cmV0dXJuIGl9ZnVuY3Rpb24gYjIodCl7cmV0dXJuIjAiPD10JiZ0PD0iOSJ9ZnVuY3Rpb24geTIodCl7cmV0dXJuIi8iPT09dHx8YjIodCl9ZnVuY3Rpb24gXzIodCxlKXsxJnQmJlRtKDAsIm1hdC1pY29uIiw3KX1mdW5jdGlvbiBDMih0LGUpe2lmKDEmdCYmKFJtKDAsIm1hdC1vcHRpb24iLDgpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdDtEbSgidmFsdWUiLHQpLGpwKCJ0aXRsZSIsdCkscmMoMSksU3UodCl9fWZ1bmN0aW9uIE0yKHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2Iiw5KSxSbSgxLCJlbSIpLGt1KDIpLEFoKDMsIm51bWJlciIpLEFtKCksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoMiksRHUoImFuZCAiLFRoKDMsMSx0LmNvbXBsZXRpb25zLmxlbmd0aC0yNSksIiBtb3JlIHRhZ3MgbWF0Y2hlZCIpfX1jbGFzcyB2Mntjb25zdHJ1Y3Rvcigpe3RoaXMub25SZWdleEZpbHRlclZhbHVlQ2hhbmdlPW5ldyBMaH1vbkNvbXBsZXRpb25BY2NlcHRlZCh0KXt0aGlzLm9uUmVnZXhGaWx0ZXJWYWx1ZUNoYW5nZS5lbWl0KChmdW5jdGlvbiBlKHQpe3JldHVybiB0LnJlcGxhY2UoQkwsIlxcJCYiKX0pKHQpKX19djIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHYyKX0sdjIuybVjbXA9dG8oe3R5cGU6djIsc2VsZWN0b3JzOltbIm1ldHJpY3MtdGFnLWZpbHRlci1jb21wb25lbnQiXV0saG9zdFZhcnM6Mixob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmcHUoInZhbGlkIixuLmlzUmVnZXhGaWx0ZXJWYWxpZCl9LGlucHV0czp7cmVnZXhGaWx0ZXJWYWx1ZToicmVnZXhGaWx0ZXJWYWx1ZSIsaXNSZWdleEZpbHRlclZhbGlkOiJpc1JlZ2V4RmlsdGVyVmFsaWQiLGNvbXBsZXRpb25zOiJjb21wbGV0aW9ucyJ9LG91dHB1dHM6e29uUmVnZXhGaWx0ZXJWYWx1ZUNoYW5nZToib25SZWdleEZpbHRlclZhbHVlQ2hhbmdlIn0sZGVjbHM6Nyx2YXJzOjUsY29uc3RzOltbMSwidGFnLWZpbHRlciJdLFsicGxhY2Vob2xkZXIiLCJGaWx0ZXIgdGFncyAocmVnZXgpIiwzLCJ2YWx1ZSIsIm1hdEF1dG9jb21wbGV0ZSIsImlucHV0Il0sWyJzdmdJY29uIiwiZXJyb3JfMjRweCIsImNsYXNzIiwiZXJyb3ItaWNvbiIsInRpdGxlIiwiSW52YWxpZCByZWdleCBmaWx0ZXIuIFRoZSByZXN1bHQgbWF5IGJlIHN0YWxlLiIsNCwibmdJZiJdLFsxLCJ0YWctb3B0aW9ucyIsMywib3B0aW9uU2VsZWN0ZWQiXSxbImZpbHRlck1hdGNoZXMiLCJtYXRBdXRvY29tcGxldGUiXSxbImNsYXNzIiwib3B0aW9uIiwzLCJ2YWx1ZSIsNCwibmdGb3IiLCJuZ0Zvck9mIl0sWyJjbGFzcyIsImFuZC1tb3JlIiw0LCJuZ0lmIl0sWyJzdmdJY29uIiwiZXJyb3JfMjRweCIsInRpdGxlIiwiSW52YWxpZCByZWdleCBmaWx0ZXIuIFRoZSByZXN1bHQgbWF5IGJlIHN0YWxlLiIsMSwiZXJyb3ItaWNvbiJdLFsxLCJvcHRpb24iLDMsInZhbHVlIl0sWzEsImFuZC1tb3JlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihSbSgwLCJkaXYiLDApLFJtKDEsInRiLWZpbHRlci1pbnB1dCIsMSksVm0oImlucHV0IiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UuZW1pdChlLnRhcmdldC52YWx1ZSl9KSksQW0oKSxRcCgyLF8yLDEsMCwibWF0LWljb24iLDIpLEFtKCksUm0oMywibWF0LWF1dG9jb21wbGV0ZSIsMyw0KSxWbSgib3B0aW9uU2VsZWN0ZWQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uQ29tcGxldGlvbkFjY2VwdGVkKGUub3B0aW9uLnZhbHVlKX0pKSxRcCg1LEMyLDIsMywibWF0LW9wdGlvbiIsNSksUXAoNixNMiw0LDMsImRpdiIsNiksQW0oKSksMiZlKXtjb25zdCB0PSRwKDQpO3JjKDEpLERtKCJ2YWx1ZSIsbi5yZWdleEZpbHRlclZhbHVlKSgibWF0QXV0b2NvbXBsZXRlIix0KSxyYygxKSxEbSgibmdJZiIsIW4uaXNSZWdleEZpbHRlclZhbGlkKSxyYygzKSxEbSgibmdGb3JPZiIsbnVsbD09bi5jb21wbGV0aW9ucz9udWxsOm4uY29tcGxldGlvbnMuc2xpY2UoMCwyNSkpLHJjKDEpLERtKCJuZ0lmIiwobnVsbD09bi5jb21wbGV0aW9ucz9udWxsOm4uY29tcGxldGlvbnMubGVuZ3RoKT4yNSl9fSxkaXJlY3RpdmVzOltxMCxkTSxIMCxsTSxEVyxCSF0scGlwZXM6W0ZNXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0udGFnLWZpbHRlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOnJlbGF0aXZlfXRiLWZpbHRlci1pbnB1dFtfbmdjb250ZW50LSVDT01QJV17ZmxleC1ncm93OjF9W19uZ2hvc3QtJUNPTVAlXXtjb2xvcjojMjEyMTIxfWJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXXtjb2xvcjojZmZmfVtfbmdob3N0LSVDT01QJV06bm90KC52YWxpZCl7Y29sb3I6I2M2MjgyOH1bX25naG9zdC0lQ09NUCVdOm5vdCgudmFsaWQpICAgLmVycm9yLWljb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNjNjI4Mjg7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MH0gIC50YWctb3B0aW9ucyAub3B0aW9uLCAgIC50YWctb3B0aW9ucyAuYW5kLW1vcmV7LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsOy13ZWJraXQtbGluZS1jbGFtcDozO2Rpc3BsYXk6LXdlYmtpdC1ib3g7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS40O3BhZGRpbmc6OHB4IDE2cHh9ICAudGFnLW9wdGlvbnMgLmFuZC1tb3Jle2NvbG9yOiM2MTYxNjF9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgICAudGFnLW9wdGlvbnMgLmFuZC1tb3JlLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAgIC50YWctb3B0aW9ucyAuYW5kLW1vcmV7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHYyLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1ldHJpY3MtdGFnLWZpbHRlci1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiJmaWx0ZXJfaW5wdXRfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbImZpbHRlcl9pbnB1dF9jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7cmVnZXhGaWx0ZXJWYWx1ZTpbe3R5cGU6eHl9XSxpc1JlZ2V4RmlsdGVyVmFsaWQ6W3t0eXBlOlB5LGFyZ3M6WyJjbGFzcy52YWxpZCJdfSx7dHlwZTp4eX1dLGNvbXBsZXRpb25zOlt7dHlwZTp4eX1dLG9uUmVnZXhGaWx0ZXJWYWx1ZUNoYW5nZTpbe3R5cGU6T3l9XX0pO2NsYXNzIHgye2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLnRhZ0ZpbHRlciQ9dGhpcy5zdG9yZS5zZWxlY3QoQlQpLHRoaXMuaXNUYWdGaWx0ZXJSZWdleFZhbGlkJD10aGlzLnRhZ0ZpbHRlciQucGlwZShJdCgodD0+e3RyeXtyZXR1cm4gbmV3IFJlZ0V4cCh0KSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KSkpLHRoaXMuY29tcGxldGlvbnMkPXRoaXMuc3RvcmUuc2VsZWN0KE1UKS5waXBlKGZlKHRoaXMuc3RvcmUuc2VsZWN0KHFUKSksSXQoKChbdCxlXSk9PnQuZmlsdGVyKCgoe3BsdWdpbjp0fSk9PiFlLnNpemV8fGUuaGFzKHQpKSkubWFwKCgoe3RhZzp0fSk9PnQpKSkpLEl0KCh0PT5bLi4ubmV3IFNldCh0KV0pKSxJdCgodD0+dC5zb3J0KGcyKSkpLGZlKHRoaXMuc3RvcmUuc2VsZWN0KEJUKSksSXQoKChbdCxlXSk9Pnt0cnl7cmV0dXJuW3QsbmV3IFJlZ0V4cChlLCJpIildfWNhdGNoKGUpe3JldHVyblt0LG51bGxdfX0pKSxjZSgoKFssdF0pPT5udWxsIT09dCkpLEl0KCgoW3QsZV0pPT50LmZpbHRlcigodD0+ZS50ZXN0KHQpKSkpKSl9b25UYWdGaWx0ZXJDaGFuZ2UodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChlUih7dGFnRmlsdGVyOnR9KSl9fXgyLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx4MikoU20oSXcpKX0seDIuybVjbXA9dG8oe3R5cGU6eDIsc2VsZWN0b3JzOltbIm1ldHJpY3MtdGFnLWZpbHRlciJdXSxkZWNsczo0LHZhcnM6OSxjb25zdHM6W1szLCJyZWdleEZpbHRlclZhbHVlIiwiaXNSZWdleEZpbHRlclZhbGlkIiwiY29tcGxldGlvbnMiLCJvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsIm1ldHJpY3MtdGFnLWZpbHRlci1jb21wb25lbnQiLDApLFZtKCJvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uVGFnRmlsdGVyQ2hhbmdlKGUpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBaCgzLCJhc3luYyIpLEFtKCkpLDImZSYmRG0oInJlZ2V4RmlsdGVyVmFsdWUiLFRoKDEsMyxuLnRhZ0ZpbHRlciQpKSgiaXNSZWdleEZpbHRlclZhbGlkIixUaCgyLDUsbi5pc1RhZ0ZpbHRlclJlZ2V4VmFsaWQkKSkoImNvbXBsZXRpb25zIixUaCgzLDcsbi5jb21wbGV0aW9ucyQpKX0sZGlyZWN0aXZlczpbdjJdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh4Mixbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtZXRyaWNzLXRhZy1maWx0ZXIiLHRlbXBsYXRlOidcbiAgICA8bWV0cmljcy10YWctZmlsdGVyLWNvbXBvbmVudFxuICAgICAgW3JlZ2V4RmlsdGVyVmFsdWVdPSJ0YWdGaWx0ZXIkIHwgYXN5bmMiXG4gICAgICBbaXNSZWdleEZpbHRlclZhbGlkXT0iaXNUYWdGaWx0ZXJSZWdleFZhbGlkJCB8IGFzeW5jIlxuICAgICAgW2NvbXBsZXRpb25zXT0iY29tcGxldGlvbnMkIHwgYXN5bmMiXG4gICAgICAob25SZWdleEZpbHRlclZhbHVlQ2hhbmdlKT0ib25UYWdGaWx0ZXJDaGFuZ2UoJGV2ZW50KSJcbiAgICA+PC9tZXRyaWNzLXRhZy1maWx0ZXItY29tcG9uZW50PlxuICAnLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y29uc3QgTzI9WyJidXR0b24iXSxQMj1uZXcgR2EoIk1BVF9CVVRUT05fVE9HR0xFX0RFRkFVTFRfT1BUSU9OUyIpLHcyPW5ldyBHYSgiTWF0QnV0dG9uVG9nZ2xlR3JvdXAiKSxrMj17cHJvdmlkZTpJVix1c2VFeGlzdGluZzpxZSgoKCk9PkUyKSksbXVsdGk6ITB9O2xldCBTMj0wO2NsYXNzIEQye2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5zb3VyY2U9dCx0aGlzLnZhbHVlPWV9fWNsYXNzIEUye2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fY2hhbmdlRGV0ZWN0b3I9dCx0aGlzLl92ZXJ0aWNhbD0hMSx0aGlzLl9tdWx0aXBsZT0hMSx0aGlzLl9kaXNhYmxlZD0hMSx0aGlzLl9jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuPSgpPT57fSx0aGlzLl9vblRvdWNoZWQ9KCk9Pnt9LHRoaXMuX25hbWU9Im1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLSIrUzIrKyx0aGlzLnZhbHVlQ2hhbmdlPW5ldyBMaCx0aGlzLmNoYW5nZT1uZXcgTGgsdGhpcy5hcHBlYXJhbmNlPWUmJmUuYXBwZWFyYW5jZT9lLmFwcGVhcmFuY2U6InN0YW5kYXJkIn1nZXQgbmFtZSgpe3JldHVybiB0aGlzLl9uYW1lfXNldCBuYW1lKHQpe3RoaXMuX25hbWU9dCx0aGlzLl9idXR0b25Ub2dnbGVzJiZ0aGlzLl9idXR0b25Ub2dnbGVzLmZvckVhY2goKHQ9Pnt0Lm5hbWU9dGhpcy5fbmFtZSx0Ll9tYXJrRm9yQ2hlY2soKX0pKX1nZXQgdmVydGljYWwoKXtyZXR1cm4gdGhpcy5fdmVydGljYWx9c2V0IHZlcnRpY2FsKHQpe3RoaXMuX3ZlcnRpY2FsPXl6KHQpfWdldCB2YWx1ZSgpe2NvbnN0IHQ9dGhpcy5fc2VsZWN0aW9uTW9kZWw/dGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQ6W107cmV0dXJuIHRoaXMubXVsdGlwbGU/dC5tYXAoKHQ9PnQudmFsdWUpKTp0WzBdP3RbMF0udmFsdWU6dm9pZCAwfXNldCB2YWx1ZSh0KXt0aGlzLl9zZXRTZWxlY3Rpb25CeVZhbHVlKHQpLHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKX1nZXQgc2VsZWN0ZWQoKXtjb25zdCB0PXRoaXMuX3NlbGVjdGlvbk1vZGVsP3RoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkOltdO3JldHVybiB0aGlzLm11bHRpcGxlP3Q6dFswXXx8bnVsbH1nZXQgbXVsdGlwbGUoKXtyZXR1cm4gdGhpcy5fbXVsdGlwbGV9c2V0IG11bHRpcGxlKHQpe3RoaXMuX211bHRpcGxlPXl6KHQpfWdldCBkaXNhYmxlZCgpe3JldHVybiB0aGlzLl9kaXNhYmxlZH1zZXQgZGlzYWJsZWQodCl7dGhpcy5fZGlzYWJsZWQ9eXoodCksdGhpcy5fYnV0dG9uVG9nZ2xlcyYmdGhpcy5fYnV0dG9uVG9nZ2xlcy5mb3JFYWNoKCh0PT50Ll9tYXJrRm9yQ2hlY2soKSkpfW5nT25Jbml0KCl7dGhpcy5fc2VsZWN0aW9uTW9kZWw9bmV3IG9GKHRoaXMubXVsdGlwbGUsdm9pZCAwLCExKX1uZ0FmdGVyQ29udGVudEluaXQoKXt0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3QoLi4udGhpcy5fYnV0dG9uVG9nZ2xlcy5maWx0ZXIoKHQ9PnQuY2hlY2tlZCkpKX13cml0ZVZhbHVlKHQpe3RoaXMudmFsdWU9dCx0aGlzLl9jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKX1yZWdpc3Rlck9uQ2hhbmdlKHQpe3RoaXMuX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm49dH1yZWdpc3Rlck9uVG91Y2hlZCh0KXt0aGlzLl9vblRvdWNoZWQ9dH1zZXREaXNhYmxlZFN0YXRlKHQpe3RoaXMuZGlzYWJsZWQ9dH1fZW1pdENoYW5nZUV2ZW50KCl7Y29uc3QgdD10aGlzLnNlbGVjdGVkLGU9QXJyYXkuaXNBcnJheSh0KT90W3QubGVuZ3RoLTFdOnQsbj1uZXcgRDIoZSx0aGlzLnZhbHVlKTt0aGlzLl9jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuKG4udmFsdWUpLHRoaXMuY2hhbmdlLmVtaXQobil9X3N5bmNCdXR0b25Ub2dnbGUodCxlLG49ITEsbz0hMSl7dGhpcy5tdWx0aXBsZXx8IXRoaXMuc2VsZWN0ZWR8fHQuY2hlY2tlZHx8KHRoaXMuc2VsZWN0ZWQuY2hlY2tlZD0hMSksdGhpcy5fc2VsZWN0aW9uTW9kZWw/ZT90aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3QodCk6dGhpcy5fc2VsZWN0aW9uTW9kZWwuZGVzZWxlY3QodCk6bz0hMCxvP1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oKCgpPT50aGlzLl91cGRhdGVNb2RlbFZhbHVlKG4pKSk6dGhpcy5fdXBkYXRlTW9kZWxWYWx1ZShuKX1faXNTZWxlY3RlZCh0KXtyZXR1cm4gdGhpcy5fc2VsZWN0aW9uTW9kZWwmJnRoaXMuX3NlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWQodCl9X2lzUHJlY2hlY2tlZCh0KXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fcmF3VmFsdWUmJih0aGlzLm11bHRpcGxlJiZBcnJheS5pc0FycmF5KHRoaXMuX3Jhd1ZhbHVlKT90aGlzLl9yYXdWYWx1ZS5zb21lKChlPT5udWxsIT10LnZhbHVlJiZlPT09dC52YWx1ZSkpOnQudmFsdWU9PT10aGlzLl9yYXdWYWx1ZSl9X3NldFNlbGVjdGlvbkJ5VmFsdWUodCl7aWYodGhpcy5fcmF3VmFsdWU9dCx0aGlzLl9idXR0b25Ub2dnbGVzKWlmKHRoaXMubXVsdGlwbGUmJnQpe2lmKCFBcnJheS5pc0FycmF5KHQpJiYoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkpdGhyb3cgRXJyb3IoIlZhbHVlIG11c3QgYmUgYW4gYXJyYXkgaW4gbXVsdGlwbGUtc2VsZWN0aW9uIG1vZGUuIik7dGhpcy5fY2xlYXJTZWxlY3Rpb24oKSx0LmZvckVhY2goKHQ9PnRoaXMuX3NlbGVjdFZhbHVlKHQpKSl9ZWxzZSB0aGlzLl9jbGVhclNlbGVjdGlvbigpLHRoaXMuX3NlbGVjdFZhbHVlKHQpfV9jbGVhclNlbGVjdGlvbigpe3RoaXMuX3NlbGVjdGlvbk1vZGVsLmNsZWFyKCksdGhpcy5fYnV0dG9uVG9nZ2xlcy5mb3JFYWNoKCh0PT50LmNoZWNrZWQ9ITEpKX1fc2VsZWN0VmFsdWUodCl7Y29uc3QgZT10aGlzLl9idXR0b25Ub2dnbGVzLmZpbmQoKGU9Pm51bGwhPWUudmFsdWUmJmUudmFsdWU9PT10KSk7ZSYmKGUuY2hlY2tlZD0hMCx0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3QoZSkpfV91cGRhdGVNb2RlbFZhbHVlKHQpe3QmJnRoaXMuX2VtaXRDaGFuZ2VFdmVudCgpLHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKX19RTIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEUyKShTbShVZyksU20oUDIsOCkpfSxFMi7JtWRpcj1sbyh7dHlwZTpFMixzZWxlY3RvcnM6W1sibWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAiXV0sY29udGVudFF1ZXJpZXM6ZnVuY3Rpb24gdChlLG4sbyl7aWYoMSZlJiYkaChvLEEyLDUpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uX2J1dHRvblRvZ2dsZXM9dCl9fSxob3N0QXR0cnM6WyJyb2xlIiwiZ3JvdXAiLDEsIm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIl0saG9zdFZhcnM6NSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmKGpwKCJhcmlhLWRpc2FibGVkIixuLmRpc2FibGVkKSxwdSgibWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWwiLG4udmVydGljYWwpKCJtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkIiwic3RhbmRhcmQiPT09bi5hcHBlYXJhbmNlKSl9LGlucHV0czp7YXBwZWFyYW5jZToiYXBwZWFyYW5jZSIsbmFtZToibmFtZSIsdmVydGljYWw6InZlcnRpY2FsIix2YWx1ZToidmFsdWUiLG11bHRpcGxlOiJtdWx0aXBsZSIsZGlzYWJsZWQ6ImRpc2FibGVkIn0sb3V0cHV0czp7dmFsdWVDaGFuZ2U6InZhbHVlQ2hhbmdlIixjaGFuZ2U6ImNoYW5nZSJ9LGV4cG9ydEFzOlsibWF0QnV0dG9uVG9nZ2xlR3JvdXAiXSxmZWF0dXJlczpbcGcoW2syLHtwcm92aWRlOncyLHVzZUV4aXN0aW5nOkUyfV0pXX0pLEUyLmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6VWd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbUDJdfV19XSxFMi5wcm9wRGVjb3JhdG9ycz17X2J1dHRvblRvZ2dsZXM6W3t0eXBlOllhLGFyZ3M6W3FlKCgoKT0+QTIpKSx7ZGVzY2VuZGFudHM6ITB9XX1dLGFwcGVhcmFuY2U6W3t0eXBlOnh5fV0sbmFtZTpbe3R5cGU6eHl9XSx2ZXJ0aWNhbDpbe3R5cGU6eHl9XSx2YWx1ZTpbe3R5cGU6eHl9XSx2YWx1ZUNoYW5nZTpbe3R5cGU6T3l9XSxtdWx0aXBsZTpbe3R5cGU6eHl9XSxkaXNhYmxlZDpbe3R5cGU6eHl9XSxjaGFuZ2U6W3t0eXBlOk95fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRTIsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoibWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAiLHByb3ZpZGVyczpbazIse3Byb3ZpZGU6dzIsdXNlRXhpc3Rpbmc6RTJ9XSxob3N0Ontyb2xlOiJncm91cCIsY2xhc3M6Im1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIiwiW2F0dHIuYXJpYS1kaXNhYmxlZF0iOiJkaXNhYmxlZCIsIltjbGFzcy5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbF0iOiJ2ZXJ0aWNhbCIsIltjbGFzcy5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkXSI6J2FwcGVhcmFuY2UgPT09ICJzdGFuZGFyZCInfSxleHBvcnRBczoibWF0QnV0dG9uVG9nZ2xlR3JvdXAifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6VWd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbUDJdfV19XX0pLHt2YWx1ZUNoYW5nZTpbe3R5cGU6T3l9XSxjaGFuZ2U6W3t0eXBlOk95fV0sYXBwZWFyYW5jZTpbe3R5cGU6eHl9XSxuYW1lOlt7dHlwZTp4eX1dLHZlcnRpY2FsOlt7dHlwZTp4eX1dLHZhbHVlOlt7dHlwZTp4eX1dLG11bHRpcGxlOlt7dHlwZTp4eX1dLGRpc2FibGVkOlt7dHlwZTp4eX1dLF9idXR0b25Ub2dnbGVzOlt7dHlwZTpZYSxhcmdzOltxZSgoKCk9PkEyKSkse2Rlc2NlbmRhbnRzOiEwfV19XX0pO2NvbnN0IFIyPVFJKGNsYXNze30pO2NsYXNzIEEyIGV4dGVuZHMgUjJ7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEpe3N1cGVyKCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWY9ZSx0aGlzLl9lbGVtZW50UmVmPW4sdGhpcy5fZm9jdXNNb25pdG9yPW8sdGhpcy5faXNTaW5nbGVTZWxlY3Rvcj0hMSx0aGlzLl9jaGVja2VkPSExLHRoaXMuYXJpYUxhYmVsbGVkYnk9bnVsbCx0aGlzLl9kaXNhYmxlZD0hMSx0aGlzLmNoYW5nZT1uZXcgTGg7Y29uc3Qgcj1OdW1iZXIoaSk7dGhpcy50YWJJbmRleD1yfHwwPT09cj9yOm51bGwsdGhpcy5idXR0b25Ub2dnbGVHcm91cD10LHRoaXMuYXBwZWFyYW5jZT1hJiZhLmFwcGVhcmFuY2U/YS5hcHBlYXJhbmNlOiJzdGFuZGFyZCJ9Z2V0IGJ1dHRvbklkKCl7cmV0dXJuYCR7dGhpcy5pZH0tYnV0dG9uYH1nZXQgYXBwZWFyYW5jZSgpe3JldHVybiB0aGlzLmJ1dHRvblRvZ2dsZUdyb3VwP3RoaXMuYnV0dG9uVG9nZ2xlR3JvdXAuYXBwZWFyYW5jZTp0aGlzLl9hcHBlYXJhbmNlfXNldCBhcHBlYXJhbmNlKHQpe3RoaXMuX2FwcGVhcmFuY2U9dH1nZXQgY2hlY2tlZCgpe3JldHVybiB0aGlzLmJ1dHRvblRvZ2dsZUdyb3VwP3RoaXMuYnV0dG9uVG9nZ2xlR3JvdXAuX2lzU2VsZWN0ZWQodGhpcyk6dGhpcy5fY2hlY2tlZH1zZXQgY2hlY2tlZCh0KXtjb25zdCBlPXl6KHQpO2UhPT10aGlzLl9jaGVja2VkJiYodGhpcy5fY2hlY2tlZD1lLHRoaXMuYnV0dG9uVG9nZ2xlR3JvdXAmJnRoaXMuYnV0dG9uVG9nZ2xlR3JvdXAuX3N5bmNCdXR0b25Ub2dnbGUodGhpcyx0aGlzLl9jaGVja2VkKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSl9Z2V0IGRpc2FibGVkKCl7cmV0dXJuIHRoaXMuX2Rpc2FibGVkfHx0aGlzLmJ1dHRvblRvZ2dsZUdyb3VwJiZ0aGlzLmJ1dHRvblRvZ2dsZUdyb3VwLmRpc2FibGVkfXNldCBkaXNhYmxlZCh0KXt0aGlzLl9kaXNhYmxlZD15eih0KX1uZ09uSW5pdCgpe2NvbnN0IHQ9dGhpcy5idXR0b25Ub2dnbGVHcm91cDt0aGlzLl9pc1NpbmdsZVNlbGVjdG9yPXQmJiF0Lm11bHRpcGxlLHRoaXMuaWQ9dGhpcy5pZHx8Im1hdC1idXR0b24tdG9nZ2xlLSIrUzIrKyx0aGlzLl9pc1NpbmdsZVNlbGVjdG9yJiYodGhpcy5uYW1lPXQubmFtZSksdCYmKHQuX2lzUHJlY2hlY2tlZCh0aGlzKT90aGlzLmNoZWNrZWQ9ITA6dC5faXNTZWxlY3RlZCh0aGlzKSE9PXRoaXMuX2NoZWNrZWQmJnQuX3N5bmNCdXR0b25Ub2dnbGUodGhpcyx0aGlzLl9jaGVja2VkKSl9bmdBZnRlclZpZXdJbml0KCl7dGhpcy5fZm9jdXNNb25pdG9yLm1vbml0b3IodGhpcy5fZWxlbWVudFJlZiwhMCl9bmdPbkRlc3Ryb3koKXtjb25zdCB0PXRoaXMuYnV0dG9uVG9nZ2xlR3JvdXA7dGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKHRoaXMuX2VsZW1lbnRSZWYpLHQmJnQuX2lzU2VsZWN0ZWQodGhpcykmJnQuX3N5bmNCdXR0b25Ub2dnbGUodGhpcywhMSwhMSwhMCl9Zm9jdXModCl7dGhpcy5fYnV0dG9uRWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKHQpfV9vbkJ1dHRvbkNsaWNrKCl7Y29uc3QgdD0hIXRoaXMuX2lzU2luZ2xlU2VsZWN0b3J8fCF0aGlzLl9jaGVja2VkO3QhPT10aGlzLl9jaGVja2VkJiYodGhpcy5fY2hlY2tlZD10LHRoaXMuYnV0dG9uVG9nZ2xlR3JvdXAmJih0aGlzLmJ1dHRvblRvZ2dsZUdyb3VwLl9zeW5jQnV0dG9uVG9nZ2xlKHRoaXMsdGhpcy5fY2hlY2tlZCwhMCksdGhpcy5idXR0b25Ub2dnbGVHcm91cC5fb25Ub3VjaGVkKCkpKSx0aGlzLmNoYW5nZS5lbWl0KG5ldyBEMih0aGlzLHRoaXMudmFsdWUpKX1fbWFya0ZvckNoZWNrKCl7dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9fUEyLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxBMikoU20odzIsOCksU20oVWcpLFNtKGhnKSxTbShTSSksTmEoInRhYmluZGV4IiksU20oUDIsOCkpfSxBMi7JtWNtcD10byh7dHlwZTpBMixzZWxlY3RvcnM6W1sibWF0LWJ1dHRvbi10b2dnbGUiXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJlFoKE8yLDUpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uX2J1dHRvbkVsZW1lbnQ9dC5maXJzdCl9fSxob3N0QXR0cnM6WyJyb2xlIiwicHJlc2VudGF0aW9uIiwxLCJtYXQtYnV0dG9uLXRvZ2dsZSJdLGhvc3RWYXJzOjEyLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgiZm9jdXMiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uZm9jdXMoKX0pKSwyJmUmJihqcCgiYXJpYS1sYWJlbCIsbnVsbCkoImFyaWEtbGFiZWxsZWRieSIsbnVsbCkoImlkIixuLmlkKSgibmFtZSIsbnVsbCkscHUoIm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUiLCFuLmJ1dHRvblRvZ2dsZUdyb3VwKSgibWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZCIsbi5jaGVja2VkKSgibWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQiLG4uZGlzYWJsZWQpKCJtYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkIiwic3RhbmRhcmQiPT09bi5hcHBlYXJhbmNlKSl9LGlucHV0czp7ZGlzYWJsZVJpcHBsZToiZGlzYWJsZVJpcHBsZSIsYXJpYUxhYmVsbGVkYnk6WyJhcmlhLWxhYmVsbGVkYnkiLCJhcmlhTGFiZWxsZWRieSJdLHRhYkluZGV4OiJ0YWJJbmRleCIsYXBwZWFyYW5jZToiYXBwZWFyYW5jZSIsY2hlY2tlZDoiY2hlY2tlZCIsZGlzYWJsZWQ6ImRpc2FibGVkIixpZDoiaWQiLG5hbWU6Im5hbWUiLGFyaWFMYWJlbDpbImFyaWEtbGFiZWwiLCJhcmlhTGFiZWwiXSx2YWx1ZToidmFsdWUifSxvdXRwdXRzOntjaGFuZ2U6ImNoYW5nZSJ9LGV4cG9ydEFzOlsibWF0QnV0dG9uVG9nZ2xlIl0sZmVhdHVyZXM6W3hwXSxuZ0NvbnRlbnRTZWxlY3RvcnM6WyIqIl0sZGVjbHM6Nix2YXJzOjksY29uc3RzOltbInR5cGUiLCJidXR0b24iLDEsIm1hdC1idXR0b24tdG9nZ2xlLWJ1dHRvbiIsIm1hdC1mb2N1cy1pbmRpY2F0b3IiLDMsImlkIiwiZGlzYWJsZWQiLCJjbGljayJdLFsiYnV0dG9uIiwiIl0sWzEsIm1hdC1idXR0b24tdG9nZ2xlLWxhYmVsLWNvbnRlbnQiXSxbMSwibWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheSJdLFsibWF0UmlwcGxlIiwiIiwxLCJtYXQtYnV0dG9uLXRvZ2dsZS1yaXBwbGUiLDMsIm1hdFJpcHBsZVRyaWdnZXIiLCJtYXRSaXBwbGVEaXNhYmxlZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoWm0oKSxSbSgwLCJidXR0b24iLDAsMSksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9vbkJ1dHRvbkNsaWNrKCl9KSksUm0oMiwic3BhbiIsMiksWG0oMyksQW0oKSxBbSgpLFRtKDQsInNwYW4iLDMpLFRtKDUsInNwYW4iLDQpKSwyJmUpe2NvbnN0IHQ9JHAoMSk7RG0oImlkIixuLmJ1dHRvbklkKSgiZGlzYWJsZWQiLG4uZGlzYWJsZWR8fG51bGwpLGpwKCJ0YWJpbmRleCIsbi5kaXNhYmxlZD8tMTpuLnRhYkluZGV4KSgiYXJpYS1wcmVzc2VkIixuLmNoZWNrZWQpKCJuYW1lIixuLm5hbWV8fG51bGwpKCJhcmlhLWxhYmVsIixuLmFyaWFMYWJlbCkoImFyaWEtbGFiZWxsZWRieSIsbi5hcmlhTGFiZWxsZWRieSkscmMoNSksRG0oIm1hdFJpcHBsZVRyaWdnZXIiLHQpKCJtYXRSaXBwbGVEaXNhYmxlZCIsbi5kaXNhYmxlUmlwcGxlfHxuLmRpc2FibGVkKX19LGRpcmVjdGl2ZXM6W2tIXSxzdHlsZXM6WyIubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZSwubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXB7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTppbmxpbmUtZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjtib3JkZXItcmFkaXVzOjJweDstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnR9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZSwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cHtvdXRsaW5lOnNvbGlkIDFweH0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJke2JvcmRlci1yYWRpdXM6NHB4fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJke291dGxpbmU6MH0ubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWx7ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbCAubWF0LWJ1dHRvbi10b2dnbGUtbGFiZWwtY29udGVudHtkaXNwbGF5OmJsb2NrfS5tYXQtYnV0dG9uLXRvZ2dsZXt3aGl0ZS1zcGFjZTpub3dyYXA7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1idXR0b24tdG9nZ2xlIC5tYXQtaWNvbiBzdmd7dmVydGljYWwtYWxpZ246dG9wfS5tYXQtYnV0dG9uLXRvZ2dsZS5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJ1dHRvbi10b2dnbGUuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTouNX0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZDpub3QoLm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkKTpob3ZlciAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4wNH0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkKSAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4xMn0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQpIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjV9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZDpub3QoLm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkKTpob3ZlciAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtkaXNwbGF5Om5vbmV9fS5tYXQtYnV0dG9uLXRvZ2dsZS1sYWJlbC1jb250ZW50ey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtkaXNwbGF5OmlubGluZS1ibG9jaztsaW5lLWhlaWdodDozNnB4O3BhZGRpbmc6MCAxNnB4O3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtYnV0dG9uLXRvZ2dsZS1sYWJlbC1jb250ZW50e3BhZGRpbmc6MCAxMnB4fS5tYXQtYnV0dG9uLXRvZ2dsZS1sYWJlbC1jb250ZW50Pip7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e2JvcmRlci1yYWRpdXM6aW5oZXJpdDtwb2ludGVyLWV2ZW50czpub25lO29wYWNpdHk6MDt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtib3JkZXItYm90dG9tOnNvbGlkIDM2cHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi41O2hlaWdodDowfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtib3JkZXItYm90dG9tOnNvbGlkIDUwMHB4fS5tYXQtYnV0dG9uLXRvZ2dsZSAubWF0LWJ1dHRvbi10b2dnbGUtcmlwcGxle3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1hdC1idXR0b24tdG9nZ2xlLWJ1dHRvbntib3JkZXI6MDtiYWNrZ3JvdW5kOm5vbmU7Y29sb3I6aW5oZXJpdDtwYWRkaW5nOjA7bWFyZ2luOjA7Zm9udDppbmhlcml0O291dGxpbmU6bm9uZTt3aWR0aDoxMDAlO2N1cnNvcjpwb2ludGVyfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZCAubWF0LWJ1dHRvbi10b2dnbGUtYnV0dG9ue2N1cnNvcjpkZWZhdWx0fS5tYXQtYnV0dG9uLXRvZ2dsZS1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9XG4iXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSxBMi5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOkUyLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOlt3Ml19XX0se3R5cGU6VWd9LHt0eXBlOmhnfSx7dHlwZTpTSX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmphLGFyZ3M6WyJ0YWJpbmRleCJdfV19LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTpTcn0se3R5cGU6a3IsYXJnczpbUDJdfV19XSxBMi5wcm9wRGVjb3JhdG9ycz17YXJpYUxhYmVsOlt7dHlwZTp4eSxhcmdzOlsiYXJpYS1sYWJlbCJdfV0sYXJpYUxhYmVsbGVkYnk6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsbGVkYnkiXX1dLF9idXR0b25FbGVtZW50Olt7dHlwZTpaYSxhcmdzOlsiYnV0dG9uIl19XSxpZDpbe3R5cGU6eHl9XSxuYW1lOlt7dHlwZTp4eX1dLHZhbHVlOlt7dHlwZTp4eX1dLHRhYkluZGV4Olt7dHlwZTp4eX1dLGFwcGVhcmFuY2U6W3t0eXBlOnh5fV0sY2hlY2tlZDpbe3R5cGU6eHl9XSxkaXNhYmxlZDpbe3R5cGU6eHl9XSxjaGFuZ2U6W3t0eXBlOk95fV19LCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQTIsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWF0LWJ1dHRvbi10b2dnbGUiLHRlbXBsYXRlOic8YnV0dG9uICNidXR0b24gY2xhc3M9Im1hdC1idXR0b24tdG9nZ2xlLWJ1dHRvbiBtYXQtZm9jdXMtaW5kaWNhdG9yIlxuICAgICAgICB0eXBlPSJidXR0b24iXG4gICAgICAgIFtpZF09ImJ1dHRvbklkIlxuICAgICAgICBbYXR0ci50YWJpbmRleF09ImRpc2FibGVkID8gLTEgOiB0YWJJbmRleCJcbiAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT0iY2hlY2tlZCJcbiAgICAgICAgW2Rpc2FibGVkXT0iZGlzYWJsZWQgfHwgbnVsbCJcbiAgICAgICAgW2F0dHIubmFtZV09Im5hbWUgfHwgbnVsbCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09ImFyaWFMYWJlbCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT0iYXJpYUxhYmVsbGVkYnkiXG4gICAgICAgIChjbGljayk9Il9vbkJ1dHRvbkNsaWNrKCkiPlxuICA8c3BhbiBjbGFzcz0ibWF0LWJ1dHRvbi10b2dnbGUtbGFiZWwtY29udGVudCI+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L3NwYW4+XG48L2J1dHRvbj5cblxuPHNwYW4gY2xhc3M9Im1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXkiPjwvc3Bhbj5cbjxzcGFuIGNsYXNzPSJtYXQtYnV0dG9uLXRvZ2dsZS1yaXBwbGUiIG1hdFJpcHBsZVxuICAgICBbbWF0UmlwcGxlVHJpZ2dlcl09ImJ1dHRvbiJcbiAgICAgW21hdFJpcHBsZURpc2FibGVkXT0idGhpcy5kaXNhYmxlUmlwcGxlIHx8IHRoaXMuZGlzYWJsZWQiPlxuPC9zcGFuPlxuJyxlbmNhcHN1bGF0aW9uOkhuLk5vbmUsZXhwb3J0QXM6Im1hdEJ1dHRvblRvZ2dsZSIsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaCxpbnB1dHM6WyJkaXNhYmxlUmlwcGxlIl0saG9zdDp7IltjbGFzcy5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lXSI6IiFidXR0b25Ub2dnbGVHcm91cCIsIltjbGFzcy5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkXSI6ImNoZWNrZWQiLCJbY2xhc3MubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWRdIjoiZGlzYWJsZWQiLCJbY2xhc3MubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZF0iOidhcHBlYXJhbmNlID09PSAic3RhbmRhcmQiJyxjbGFzczoibWF0LWJ1dHRvbi10b2dnbGUiLCJbYXR0ci5hcmlhLWxhYmVsXSI6Im51bGwiLCJbYXR0ci5hcmlhLWxhYmVsbGVkYnldIjoibnVsbCIsIlthdHRyLmlkXSI6ImlkIiwiW2F0dHIubmFtZV0iOiJudWxsIiwiKGZvY3VzKSI6ImZvY3VzKCkiLHJvbGU6InByZXNlbnRhdGlvbiJ9LHN0eWxlczpbIi5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cHtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1mbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdzt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO2JvcmRlci1yYWRpdXM6MnB4Oy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3Vwe291dGxpbmU6c29saWQgMXB4fS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQsLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmR7Ym9yZGVyLXJhZGl1czo0cHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmR7b3V0bGluZTowfS5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbHtmbGV4LWRpcmVjdGlvbjpjb2x1bW59Lm1hdC1idXR0b24tdG9nZ2xlLXZlcnRpY2FsIC5tYXQtYnV0dG9uLXRvZ2dsZS1sYWJlbC1jb250ZW50e2Rpc3BsYXk6YmxvY2t9Lm1hdC1idXR0b24tdG9nZ2xle3doaXRlLXNwYWNlOm5vd3JhcDtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWJ1dHRvbi10b2dnbGUgLm1hdC1pY29uIHN2Z3t2ZXJ0aWNhbC1hbGlnbjp0b3B9Lm1hdC1idXR0b24tdG9nZ2xlLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLXRvZ2dsZS5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi41fS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkOm5vdCgubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQpOmhvdmVyIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjA0fS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQpIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjEyfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZCkgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTouNX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkOm5vdCgubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQpOmhvdmVyIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e2Rpc3BsYXk6bm9uZX19Lm1hdC1idXR0b24tdG9nZ2xlLWxhYmVsLWNvbnRlbnR7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlLWxhYmVsLWNvbnRlbnR7cGFkZGluZzowIDEycHh9Lm1hdC1idXR0b24tdG9nZ2xlLWxhYmVsLWNvbnRlbnQ+Knt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Lm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7Ym9yZGVyLXJhZGl1czppbmhlcml0O3BvaW50ZXItZXZlbnRzOm5vbmU7b3BhY2l0eTowO3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e2JvcmRlci1ib3R0b206c29saWQgMzZweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjU7aGVpZ2h0OjB9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e2JvcmRlci1ib3R0b206c29saWQgNTAwcHh9Lm1hdC1idXR0b24tdG9nZ2xlIC5tYXQtYnV0dG9uLXRvZ2dsZS1yaXBwbGV7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6bm9uZX0ubWF0LWJ1dHRvbi10b2dnbGUtYnV0dG9ue2JvcmRlcjowO2JhY2tncm91bmQ6bm9uZTtjb2xvcjppbmhlcml0O3BhZGRpbmc6MDttYXJnaW46MDtmb250OmluaGVyaXQ7b3V0bGluZTpub25lO3dpZHRoOjEwMCU7Y3Vyc29yOnBvaW50ZXJ9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkIC5tYXQtYnV0dG9uLXRvZ2dsZS1idXR0b257Y3Vyc29yOmRlZmF1bHR9Lm1hdC1idXR0b24tdG9nZ2xlLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH1cbiJdfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6RTIsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3cyXX1dfSx7dHlwZTpVZ30se3R5cGU6aGd9LHt0eXBlOlNJfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6amEsYXJnczpbInRhYmluZGV4Il19XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltQMl19XX1dfSkse2FyaWFMYWJlbGxlZGJ5Olt7dHlwZTp4eSxhcmdzOlsiYXJpYS1sYWJlbGxlZGJ5Il19XSxjaGFuZ2U6W3t0eXBlOk95fV0sdGFiSW5kZXg6W3t0eXBlOnh5fV0sYXBwZWFyYW5jZTpbe3R5cGU6eHl9XSxjaGVja2VkOlt7dHlwZTp4eX1dLGRpc2FibGVkOlt7dHlwZTp4eX1dLGlkOlt7dHlwZTp4eX1dLG5hbWU6W3t0eXBlOnh5fV0sYXJpYUxhYmVsOlt7dHlwZTp4eSxhcmdzOlsiYXJpYS1sYWJlbCJdfV0sX2J1dHRvbkVsZW1lbnQ6W3t0eXBlOlphLGFyZ3M6WyJidXR0b24iXX1dLHZhbHVlOlt7dHlwZTp4eX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBUMnt9ZnVuY3Rpb24gTjIodCxlKXtpZigxJnQmJihSbSgwLCJzcGFuIiwyKSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtyYygxKSxTdSh0LmZpcnN0VGV4dFBhcnQoKSl9fVQyLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxUMil9LFQyLsm1bW9kPWFvKHt0eXBlOlQyfSksVDIuybVpbmo9dm4oe2ltcG9ydHM6W1tYSSxTSF0sWEldfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChUMixbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W1hJLFNIXSxleHBvcnRzOltYSSxFMixBMl0sZGVjbGFyYXRpb25zOltFMixBMl19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhUMix7ZGVjbGFyYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuW0UyLEEyXX0saW1wb3J0czpmdW5jdGlvbigpe3JldHVybltYSSxTSF19LGV4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bWEksRTIsQTJdfX0pO2NsYXNzIHoye3BhcnNlVmFsdWUoKXtjb25zdCB0PXRoaXMudmFsdWUubGFzdEluZGV4T2YoIi8iKTtyZXR1cm4tMT09PXQ/e2ZpcnN0OiIiLHNlY29uZDp0aGlzLnZhbHVlfTp7Zmlyc3Q6dGhpcy52YWx1ZS5zbGljZSgwLHQpLHNlY29uZDp0aGlzLnZhbHVlLnNsaWNlKHQpfX1maXJzdFRleHRQYXJ0KCl7cmV0dXJuIHRoaXMucGFyc2VWYWx1ZSgpLmZpcnN0fXNlY29uZFRleHRQYXJ0KCl7cmV0dXJuIHRoaXMucGFyc2VWYWx1ZSgpLnNlY29uZH19ZnVuY3Rpb24gSTIodCxlLG4pe3JldHVybiBlfHxuP1tuLGU/ZS5uYW1lOiIuLi4iXS5maWx0ZXIoQm9vbGVhbikuam9pbigiLyIpOnR9ZnVuY3Rpb24gSDIodCxlLG4pe3ZhciBvLGksYSxyO3JldHVybiB0LnN0YXJ0LnN0ZXA8PWUmJnQuZW5kJiZuPD10LmVuZC5zdGVwfHxlPD10LnN0YXJ0LnN0ZXAmJnQuc3RhcnQuc3RlcDw9bnx8dC5lbmQmJmU8PShudWxsPT09KG89dC5lbmQpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLnN0ZXApJiYobnVsbD09PShpPXQuZW5kKXx8dm9pZCAwPT09aT92b2lkIDA6aS5zdGVwKTw9bj97c3RhcnRTdGVwOnQuc3RhcnQuc3RlcCxlbmRTdGVwOm51bGwhPT0ocj1udWxsPT09KGE9dC5lbmQpfHx2b2lkIDA9PT1hP3ZvaWQgMDphLnN0ZXApJiZ2b2lkIDAhPT1yP3I6bnVsbCxjbGlwcGVkOiExfTpuPD10LnN0YXJ0LnN0ZXA/e3N0YXJ0U3RlcDpuLGVuZFN0ZXA6bnVsbCxjbGlwcGVkOiEwfTp7c3RhcnRTdGVwOmUsZW5kU3RlcDpudWxsLGNsaXBwZWQ6ITB9fXoyLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx6Mil9LHoyLsm1Y21wPXRvKHt0eXBlOnoyLHNlbGVjdG9yczpbWyJ0Yi10cnVuY2F0ZWQtcGF0aCJdXSxpbnB1dHM6e3ZhbHVlOiJ2YWx1ZSJ9LGRlY2xzOjMsdmFyczoyLGNvbnN0czpbWyJjbGFzcyIsImZpcnN0LXRleHQtcGFydCIsNCwibmdJZiJdLFsxLCJzZWNvbmQtdGV4dC1wYXJ0Il0sWzEsImZpcnN0LXRleHQtcGFydCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUXAoMCxOMiwyLDEsInNwYW4iLDApLFJtKDEsInNwYW4iLDEpLGt1KDIpLEFtKCkpLDImZSYmKERtKCJuZ0lmIixuLmZpcnN0VGV4dFBhcnQoKS5sZW5ndGg+MCkscmMoMiksU3Uobi5zZWNvbmRUZXh0UGFydCgpKSl9LGRpcmVjdGl2ZXM6W2RNXSxzdHlsZXM6WyJbX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lLWZsZXg7d2hpdGUtc3BhY2U6bm93cmFwfS5maXJzdC10ZXh0LXBhcnRbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MSAxIDRjaDttYXgtd2lkdGg6bWF4LWNvbnRlbnR9LmZpcnN0LXRleHQtcGFydFtfbmdjb250ZW50LSVDT01QJV0sIC5zZWNvbmQtdGV4dC1wYXJ0W19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpc30iXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoejIsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoidGItdHJ1bmNhdGVkLXBhdGgiLHRlbXBsYXRlOidcbiAgICA8c3BhbiAqbmdJZj0iZmlyc3RUZXh0UGFydCgpLmxlbmd0aCA+IDAiIGNsYXNzPSJmaXJzdC10ZXh0LXBhcnQiPnt7XG4gICAgICBmaXJzdFRleHRQYXJ0KClcbiAgICB9fTwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz0ic2Vjb25kLXRleHQtcGFydCI+e3sgc2Vjb25kVGV4dFBhcnQoKSB9fTwvc3Bhbj5cbiAgJyxzdHlsZVVybHM6WyJ0cnVuY2F0ZWRfcGF0aF9jb21wb25lbnQuY3NzIl19XX1dLG51bGwse3ZhbHVlOlt7dHlwZTp4eX1dfSk7Y2xhc3MgRjJ7fUYyLsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxGMil9LEYyLsm1Y21wPXRvKHt0eXBlOkYyLHNlbGVjdG9yczpbWyJjYXJkLXJ1bi1uYW1lLWNvbXBvbmVudCJdXSxpbnB1dHM6e25hbWU6Im5hbWUifSxkZWNsczoxLHZhcnM6MSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiZrdSgwKSwyJmUmJlN1KG4ubmFtZSl9LHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV17Y29sb3I6IzYxNjE2MX1ib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEYyLFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImNhcmQtcnVuLW5hbWUtY29tcG9uZW50Iix0ZW1wbGF0ZToie3sgbmFtZSB9fSIsc3R5bGVVcmxzOlsicnVuX25hbWVfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse25hbWU6W3t0eXBlOnh5fV19KTtjbGFzcyBMMntjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXR9bmdPbkluaXQoKXt0aGlzLm5hbWUkPVd0KFt0aGlzLnN0b3JlLnNlbGVjdChzTix7cnVuSWQ6dGhpcy5ydW5JZH0pLHRoaXMuc3RvcmUuc2VsZWN0KHJOLHtydW5JZDp0aGlzLnJ1bklkfSksdGhpcy5zdG9yZS5zZWxlY3QoelMpXSkucGlwZShJdCgoKFt0LGUsbl0pPT5JMih0aGlzLnJ1bklkLHQsZT9uW2VdOm51bGwpKSkpfX1mdW5jdGlvbiBCMih0LGUpe2lmKDEmdCYmKFJtKDAsInNwYW4iLDE3KSxrdSgxKSxBaCgyLCJudW1iZXIiKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtyYygxKSxEdSgiU3RlcCAiLFRoKDIsMSx0LnN0ZXBWYWx1ZXNbdC5zdGVwSW5kZXhdKSwiIil9fWZ1bmN0aW9uIFYyKHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIsMTgpLGt1KDEpLEFoKDIsIm51bWJlciIpLEFoKDMsIm51bWJlciIpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpO3JjKDEpLEV1KCJTYW1wbGUgIixUaCgyLDIsdC5zYW1wbGUrMSksIi8iLFRoKDMsNCx0Lm51bVNhbXBsZSksIiIpfX1mdW5jdGlvbiBqMih0LGUpezEmdCYmVG0oMCwibWF0LXNwaW5uZXIiLDE5KX1MMi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8TDIpKFNtKEl3KSl9LEwyLsm1Y21wPXRvKHt0eXBlOkwyLHNlbGVjdG9yczpbWyJjYXJkLXJ1bi1uYW1lIl1dLGlucHV0czp7cnVuSWQ6InJ1bklkIn0sZGVjbHM6Myx2YXJzOjYsY29uc3RzOltbMywibmFtZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwiY2FyZC1ydW4tbmFtZS1jb21wb25lbnQiLDApLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSksMiZlJiYoRG0oIm5hbWUiLFRoKDEsMixuLm5hbWUkKSksanAoInRpdGxlIixUaCgyLDQsbi5uYW1lJCkpKX0sZGlyZWN0aXZlczpbRjJdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChMMixbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJjYXJkLXJ1bi1uYW1lIix0ZW1wbGF0ZTonXG4gICAgPGNhcmQtcnVuLW5hbWUtY29tcG9uZW50XG4gICAgICBbbmFtZV09Im5hbWUkIHwgYXN5bmMiXG4gICAgICBbYXR0ci50aXRsZV09Im5hbWUkIHwgYXN5bmMiXG4gICAgPjwvY2FyZC1ydW4tbmFtZS1jb21wb25lbnQ+XG4gICcsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSx7cnVuSWQ6W3t0eXBlOnh5fV19KTtjb25zdCBVMj1mdW5jdGlvbih0KXtyZXR1cm57ZmlsdGVyOnR9fTtmdW5jdGlvbiBHMih0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO05tKDApLFJtKDEsImRpdiIsMjApLFJtKDIsIm1hdC1zbGlkZXIiLDIxKSxWbSgiaW5wdXQiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLm9uU2xpZGVySW5wdXQobil9KSksQW0oKSxBbSgpLFJtKDMsImRpdiIsMjIpLFRtKDQsImltZyIsMjMpLEFtKCksem0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKTtyYygyKSxEbSgiZGlzYWJsZWQiLHQuc3RlcFZhbHVlcy5sZW5ndGg8PTEpKCJtaW4iLDApKCJtYXgiLHQuc3RlcFZhbHVlcy5sZW5ndGgtMSkoInN0ZXAiLDEpKCJ0aWNrSW50ZXJ2YWwiLDEpKCJ2YWx1ZSIsdC5zdGVwSW5kZXgpLHJjKDIpLEptKCJhbHQiLCJJbWFnZSBhdCBzdGVwICIsdC5zdGVwVmFsdWVzW3Quc3RlcEluZGV4XSwiIiksS20oInNyYyIsdC5pbWFnZVVybCxUcyksRG0oIm5nU3R5bGUiLE1oKDksVTIsdC5jc3NGaWx0ZXIoKSkpfX1mdW5jdGlvbiBXMih0LGUpezEmdCYmKFJtKDAsImRpdiIsMjUpLGt1KDEsIiBEYXRhIGZhaWxlZCB0byBsb2FkLiAiKSxBbSgpKX1mdW5jdGlvbiBZMih0LGUpe2lmKDEmdCYmUXAoMCxXMiwyLDAsImRpdiIsMjQpLDImdCl7Y29uc3QgdD1ZbSgpO0RtKCJuZ0lmIix0LmxvYWRTdGF0ZT09PXQuRGF0YUxvYWRTdGF0ZS5GQUlMRUQpfX1jb25zdCBxMj1mdW5jdGlvbih0KXtyZXR1cm57YmFja2dyb3VuZENvbG9yOnR9fTtjbGFzcyBaMntjb25zdHJ1Y3Rvcigpe3RoaXMuRGF0YUxvYWRTdGF0ZT15RSx0aGlzLm9uQWN0dWFsU2l6ZVRvZ2dsZT1uZXcgTGgsdGhpcy5zdGVwSW5kZXhDaGFuZ2U9bmV3IExoLHRoaXMub25QaW5DbGlja2VkPW5ldyBMaH1jc3NGaWx0ZXIoKXtyZXR1cm5gY29udHJhc3QoJHt0aGlzLmNvbnRyYXN0SW5NaWxsaS8xMH0lKSBicmlnaHRuZXNzKCR7dGhpcy5icmlnaHRuZXNzSW5NaWxsaS8xZTN9KWB9b25TbGlkZXJJbnB1dCh0KXt0aGlzLnN0ZXBJbmRleENoYW5nZS5lbWl0KHQudmFsdWUpfX1aMi7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WjIpfSxaMi7JtWNtcD10byh7dHlwZTpaMixzZWxlY3RvcnM6W1siaW1hZ2UtY2FyZC1jb21wb25lbnQiXV0saG9zdFZhcnM6Mixob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezImZSYmcHUoImFjdHVhbC1zaXplIixuLnNob3dBY3R1YWxTaXplKX0saW5wdXRzOntsb2FkU3RhdGU6ImxvYWRTdGF0ZSIsdGl0bGU6InRpdGxlIix0YWc6InRhZyIscnVuSWQ6InJ1bklkIixzYW1wbGU6InNhbXBsZSIsbnVtU2FtcGxlOiJudW1TYW1wbGUiLGltYWdlVXJsOiJpbWFnZVVybCIsc3RlcEluZGV4OiJzdGVwSW5kZXgiLHN0ZXBWYWx1ZXM6InN0ZXBWYWx1ZXMiLGJyaWdodG5lc3NJbk1pbGxpOiJicmlnaHRuZXNzSW5NaWxsaSIsY29udHJhc3RJbk1pbGxpOiJjb250cmFzdEluTWlsbGkiLHNob3dBY3R1YWxTaXplOiJzaG93QWN0dWFsU2l6ZSIscnVuQ29sb3JTY2FsZToicnVuQ29sb3JTY2FsZSIsYWxsb3dUb2dnbGVBY3R1YWxTaXplOiJhbGxvd1RvZ2dsZUFjdHVhbFNpemUiLGlzUGlubmVkOiJpc1Bpbm5lZCJ9LG91dHB1dHM6e29uQWN0dWFsU2l6ZVRvZ2dsZToib25BY3R1YWxTaXplVG9nZ2xlIixzdGVwSW5kZXhDaGFuZ2U6InN0ZXBJbmRleENoYW5nZSIsb25QaW5DbGlja2VkOiJvblBpbkNsaWNrZWQifSxkZWNsczoxOSx2YXJzOjE0LGNvbnN0czpmdW5jdGlvbigpe2xldCB0LGU7cmV0dXJuIHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSYmbmdJMThuQ2xvc3VyZU1vZGU/Z29vZy5nZXRNc2coIlBpbiBjYXJkIik6JGxvY2FsaXplYDpBIGJ1dHRvbiB0byBwaW4gYSBjYXJkLuKQn2U2NjVkYzcxMmJkNWYxOGQ0ZGZhM2EyOWUxMjVkNTY1Y2M1MWUyZjbikJ83Mjg0NjA2NDI2MjM0Mzc1MzQ0OlBpbiBjYXJkYCxlPSJ1bmRlZmluZWQiIT10eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUmJm5nSTE4bkNsb3N1cmVNb2RlP2dvb2cuZ2V0TXNnKCJUb2dnbGUgYWN0dWFsIGltYWdlIHNpemUiKTokbG9jYWxpemVgOkEgYnV0dG9uIG9uIGFuIGltYWdlIGNhcmQgdGhhdCB0b2dnbGVzIGFjdHVhbCBpbWFnZSBzaXplLuKQnzNjYTA1ZWYzYTZlM2EzNzA2NWY1ZTBmNjljNWQ1YTIxNzhkOTA3OTHikJ83NjM1MTAxOTM2NjY0Nzg5MTQwOlRvZ2dsZSBhY3R1YWwgaW1hZ2Ugc2l6ZWAsW1sxLCJoZWFkaW5nIl0sWzEsImxpbmUiXSxbMSwidGFnIiwzLCJ0aXRsZSIsInZhbHVlIl0sWzEsImNvbnRyb2xzIl0sWyJtYXQtaWNvbi1idXR0b24iLCIiLCJhcmlhLWxhYmVsIix0LDEsInBpbi1idXR0b24iLDMsImNsaWNrIl0sWzMsInN2Z0ljb24iXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLGUsInRpdGxlIiwiVG9nZ2xlIGFjdHVhbCBpbWFnZSBzaXplIiwzLCJkaXNhYmxlZCIsImNsaWNrIl0sWyJzdmdJY29uIiwiaW1hZ2Vfc2VhcmNoXzI0cHgiXSxbMSwicnVuIl0sWzEsImRvdCIsMywibmdTdHlsZSJdLFsxLCJydW4tdGV4dCIsMywicnVuSWQiXSxbMSwibWV0YWRhdGEiXSxbImNsYXNzIiwic3RlcCIsNCwibmdJZiJdLFsiY2xhc3MiLCJzYW1wbGUiLDQsIm5nSWYiXSxbImNsYXNzIiwibG9hZGluZyIsImRpYW1ldGVyIiwiMTgiLDQsIm5nSWYiXSxbNCwibmdJZiIsIm5nSWZFbHNlIl0sWyJub0ltYWdlRGF0YSIsIiJdLFsxLCJzdGVwIl0sWzEsInNhbXBsZSJdLFsiZGlhbWV0ZXIiLCIxOCIsMSwibG9hZGluZyJdLFsxLCJzbGlkZXItcm93Il0sWyJjb2xvciIsInByaW1hcnkiLDEsInN0ZXAtc2xpZGVyIiwzLCJkaXNhYmxlZCIsIm1pbiIsIm1heCIsInN0ZXAiLCJ0aWNrSW50ZXJ2YWwiLCJ2YWx1ZSIsImlucHV0Il0sWzEsImltZy1jb250YWluZXIiXSxbMywiYWx0Iiwic3JjIiwibmdTdHlsZSJdLFsiY2xhc3MiLCJlbXB0eS1tZXNzYWdlIiw0LCJuZ0lmIl0sWzEsImVtcHR5LW1lc3NhZ2UiXV19LHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihSbSgwLCJkaXYiLDApLFJtKDEsImRpdiIsMSksVG0oMiwidGItdHJ1bmNhdGVkLXBhdGgiLDIpLFJtKDMsInNwYW4iLDMpLFJtKDQsImJ1dHRvbiIsNCksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uUGluQ2xpY2tlZC5lbWl0KCFuLmlzUGlubmVkKX0pKSxUbSg1LCJtYXQtaWNvbiIsNSksQW0oKSxSbSg2LCJidXR0b24iLDYpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkFjdHVhbFNpemVUb2dnbGUuZW1pdCgpfSkpLFRtKDcsIm1hdC1pY29uIiw3KSxBbSgpLEFtKCksQW0oKSxSbSg4LCJkaXYiLDEpLFJtKDksInNwYW4iLDgpLFRtKDEwLCJzcGFuIiw5KSxUbSgxMSwiY2FyZC1ydW4tbmFtZSIsMTApLEFtKCksUm0oMTIsImRpdiIsMTEpLFFwKDEzLEIyLDMsMywic3BhbiIsMTIpLFFwKDE0LFYyLDQsNiwic3BhbiIsMTMpLFFwKDE1LGoyLDEsMCwibWF0LXNwaW5uZXIiLDE0KSxBbSgpLEFtKCksQW0oKSxRcCgxNixHMiw1LDExLCJuZy1jb250YWluZXIiLDE1KSxRcCgxNyxZMiwxLDEsIm5nLXRlbXBsYXRlIixudWxsLDE2LGliKSksMiZlKXtjb25zdCB0PSRwKDE4KTtyYygyKSxLbSgidGl0bGUiLG4udGFnKSxLbSgidmFsdWUiLG4udGl0bGUpLHJjKDIpLGpwKCJ0aXRsZSIsbi5pc1Bpbm5lZD8iVW5waW4gY2FyZCI6IlBpbiBjYXJkIikscmMoMSksRG0oInN2Z0ljb24iLG4uaXNQaW5uZWQ/ImtlZXBfMjRweCI6ImtlZXBfb3V0bGluZV8yNHB4IikscmMoMSksRG0oImRpc2FibGVkIiwhbi5hbGxvd1RvZ2dsZUFjdHVhbFNpemUpLHJjKDQpLERtKCJuZ1N0eWxlIixNaCgxMixxMixuLnJ1bkNvbG9yU2NhbGUobi5ydW5JZCkpKSxyYygxKSxEbSgicnVuSWQiLG4ucnVuSWQpLHJjKDIpLERtKCJuZ0lmIixudWxsIT09bi5zdGVwSW5kZXgmJm4uc3RlcEluZGV4PG4uc3RlcFZhbHVlcy5sZW5ndGgpLHJjKDEpLERtKCJuZ0lmIixuLm51bVNhbXBsZT4xKSxyYygxKSxEbSgibmdJZiIsbi5sb2FkU3RhdGU9PT1uLkRhdGFMb2FkU3RhdGUuTE9BRElORykscmMoMSksRG0oIm5nSWYiLG51bGwhPT1uLnN0ZXBJbmRleCYmbi5zdGVwSW5kZXg8bi5zdGVwVmFsdWVzLmxlbmd0aCkoIm5nSWZFbHNlIix0KX19LGRpcmVjdGl2ZXM6W3oyLFhILERXLENNLEwyLGRNLG8xLFJYXSxwaXBlczpbRk1dLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtib3gtc2l6aW5nOmJvcmRlci1ib3g7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6YXV0bztwYWRkaW5nOjE2cHg7cGFkZGluZy10b3A6NHB4fS5hY3R1YWwtc2l6ZVtfbmdob3N0LSVDT01QJV17aGVpZ2h0OmF1dG99LmhlYWRpbmdbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtmb250LXNpemU6MTRweDttYXJnaW4tYm90dG9tOjRweDtwb3NpdGlvbjpyZWxhdGl2ZX0ubGluZVtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIG1heC1jb250ZW50fS5tZXRhZGF0YVtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2dhcDo1cHg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO21heC13aWR0aDoxNzVweDt0ZXh0LWFsaWduOmVuZH0udGFnW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW59LnBpbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgbWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxOHB4fS5ydW5bX25nY29udGVudC0lQ09NUCVde2FsaWduLXNlbGY6YmFzZWxpbmU7ZGlzcGxheTpmbGV4O292ZXJmbG93OmhpZGRlbjt3aGl0ZS1zcGFjZTpub3dyYXB9LnJ1bltfbmdjb250ZW50LSVDT01QJV0gICAuZG90W19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4Om5vbmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTNweDtoZWlnaHQ6MTNweDtib3JkZXItcmFkaXVzOjUwJTttYXJnaW4tcmlnaHQ6NHB4fS5ydW5bX25nY29udGVudC0lQ09NUCVdICAgLnJ1bi10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczttYXgtd2lkdGg6MTIwcHh9LnJ1bltfbmdjb250ZW50LSVDT01QJV0sIC5zYW1wbGVbX25nY29udGVudC0lQ09NUCVdLCAuc3RlcFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MTtmb250LXNpemU6MTNweH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAucnVuW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLnJ1bltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLnNhbXBsZVtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5zYW1wbGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5zdGVwW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLnN0ZXBbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfS5jb250cm9sc1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MTt3aGl0ZS1zcGFjZTpub3dyYXA7anVzdGlmeS1zZWxmOmZsZXgtZW5kO2ZsZXgtc2hyaW5rOjA7bWFyZ2luLXJpZ2h0Oi0xMnB4fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5jb250cm9sc1tfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5jb250cm9sc1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9LmltZy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MSAxIDA7b3ZlcmZsb3cteTphdXRvO3Bvc2l0aW9uOnJlbGF0aXZlfS5pbWctY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGltZ1tfbmdjb250ZW50LSVDT01QJV17aW1hZ2UtcmVuZGVyaW5nOi1tb3otY3Jpc3AtZWRnZXM7aW1hZ2UtcmVuZGVyaW5nOnBpeGVsYXRlZH0uYWN0dWFsLXNpemVbX25naG9zdC0lQ09NUCVdICAgLmltZy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmF1dG87ZmxleDpub25lfVtfbmdob3N0LSVDT01QJV06bm90KC5hY3R1YWwtc2l6ZSkgICBpbWdbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO21heC1oZWlnaHQ6MTAwJTttYXgtd2lkdGg6MTAwJTt3aWR0aDphdXRvO2hlaWdodDoxMDAlO29iamVjdC1maXQ6Y29udGFpbn0uc2xpZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtoZWlnaHQ6MjRweH0uc3RlcC1zbGlkZXJbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MX1bX25naG9zdC0lQ09NUCVdICAgICAubWF0LXNsaWRlci1taW4tdmFsdWUgLm1hdC1zbGlkZXItdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5lbXB0eS1tZXNzYWdlW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOjFlbTtmb250LXNpemU6MTNweH0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWjIsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiaW1hZ2UtY2FyZC1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiJpbWFnZV9jYXJkX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyJpbWFnZV9jYXJkX2NvbXBvbmVudC5jc3MiXSxob3N0OnsiW2NsYXNzLmFjdHVhbC1zaXplXSI6InNob3dBY3R1YWxTaXplIn0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7bG9hZFN0YXRlOlt7dHlwZTp4eX1dLHRpdGxlOlt7dHlwZTp4eX1dLHRhZzpbe3R5cGU6eHl9XSxydW5JZDpbe3R5cGU6eHl9XSxzYW1wbGU6W3t0eXBlOnh5fV0sbnVtU2FtcGxlOlt7dHlwZTp4eX1dLGltYWdlVXJsOlt7dHlwZTp4eX1dLHN0ZXBJbmRleDpbe3R5cGU6eHl9XSxzdGVwVmFsdWVzOlt7dHlwZTp4eX1dLGJyaWdodG5lc3NJbk1pbGxpOlt7dHlwZTp4eX1dLGNvbnRyYXN0SW5NaWxsaTpbe3R5cGU6eHl9XSxzaG93QWN0dWFsU2l6ZTpbe3R5cGU6eHl9XSxydW5Db2xvclNjYWxlOlt7dHlwZTp4eX1dLGFsbG93VG9nZ2xlQWN0dWFsU2l6ZTpbe3R5cGU6eHl9XSxpc1Bpbm5lZDpbe3R5cGU6eHl9XSxvbkFjdHVhbFNpemVUb2dnbGU6W3t0eXBlOk95fV0sc3RlcEluZGV4Q2hhbmdlOlt7dHlwZTpPeX1dLG9uUGluQ2xpY2tlZDpbe3R5cGU6T3l9XX0pO2NsYXNzIFgye2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5zdG9yZT10LHRoaXMuZGF0YVNvdXJjZT1lLHRoaXMuZnVsbFdpZHRoQ2hhbmdlZD1uZXcgTGgsdGhpcy5waW5TdGF0ZUNoYW5nZWQ9bmV3IExoLHRoaXMuYnJpZ2h0bmVzc0luTWlsbGkkPXRoaXMuc3RvcmUuc2VsZWN0KEhUKSx0aGlzLmNvbnRyYXN0SW5NaWxsaSQ9dGhpcy5zdG9yZS5zZWxlY3QoRlQpLHRoaXMuYWN0dWFsU2l6ZUdsb2JhbFNldHRpbmckPXRoaXMuc3RvcmUuc2VsZWN0KExUKSx0aGlzLnNob3dBY3R1YWxTaXplPSExLHRoaXMuYWN0dWFsU2l6ZVVpVG9nZ2xlZD0hMSx0aGlzLmFjdHVhbFNpemVVaVRvZ2dsZVN1YmplY3Q9bmV3IEYodGhpcy5hY3R1YWxTaXplVWlUb2dnbGVkKSx0aGlzLm5nVW5zdWJzY3JpYmU9bmV3IEl9b25TdGVwSW5kZXhDaGFuZ2VkKHQpe3RoaXMuc3RvcmUuZGlzcGF0Y2godFIoe2NhcmRJZDp0aGlzLmNhcmRJZCxzdGVwSW5kZXg6dH0pKX1pc0ltYWdlQ2FyZE1ldGFkYXRhKHQpe2NvbnN0e3BsdWdpbjplfT10O3JldHVybiBlPT09aEEuSU1BR0VTfW9uQWN0dWFsU2l6ZVRvZ2dsZSgpe3RoaXMuYWN0dWFsU2l6ZVVpVG9nZ2xlZD0hdGhpcy5hY3R1YWxTaXplVWlUb2dnbGVkLHRoaXMuYWN0dWFsU2l6ZVVpVG9nZ2xlU3ViamVjdC5uZXh0KHRoaXMuYWN0dWFsU2l6ZVVpVG9nZ2xlZCl9bmdPbkluaXQoKXtXdChbdGhpcy5hY3R1YWxTaXplR2xvYmFsU2V0dGluZyQsdGhpcy5hY3R1YWxTaXplVWlUb2dnbGVTdWJqZWN0XSkucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpLEZlKCgoW3QsZV0pPT57dGhpcy5zaG93QWN0dWFsU2l6ZT10fHxlLHRoaXMuZnVsbFdpZHRoQ2hhbmdlZC5lbWl0KHRoaXMuc2hvd0FjdHVhbFNpemUpfSkpKS5zdWJzY3JpYmUoKCgpPT57fSkpO2NvbnN0IHQ9dGhpcy5zdG9yZS5zZWxlY3QoeVQsdGhpcy5jYXJkSWQpLnBpcGUoSWUodGhpcy5uZ1Vuc3Vic2NyaWJlKSxjZSgodD0+ISF0JiZ0aGlzLmlzSW1hZ2VDYXJkTWV0YWRhdGEodCkpKSxJdCgodD0+dCkpLEFlKDEpKSxlPVd0KFt0LHRoaXMuc3RvcmUuc2VsZWN0KGhULHRoaXMuY2FyZElkKV0pLnBpcGUoSWUodGhpcy5uZ1Vuc3Vic2NyaWJlKSxJdCgoKFt0LGVdKT0+e2NvbnN0IG49dC5ydW5JZDtyZXR1cm4gZSYmZS5oYXNPd25Qcm9wZXJ0eShuKT9lW25dOltdfSkpLE1lKCgodCxlKT0+dC5sZW5ndGg9PT1lLmxlbmd0aCYmMD09PXQubGVuZ3RofHx0PT09ZSkpLEFlKDEpKTt0aGlzLnN0ZXBJbmRleCQ9dGhpcy5zdG9yZS5zZWxlY3QodlQsdGhpcy5jYXJkSWQpLHRoaXMubG9hZFN0YXRlJD10aGlzLnN0b3JlLnNlbGVjdChnVCx0aGlzLmNhcmRJZCk7Y29uc3Qgbj1XdChbZSx0aGlzLnN0ZXBJbmRleCRdKS5waXBlKEl0KCgoW3QsZV0pPT5udWxsIT09ZSYmdFtlXT90W2VdOm51bGwpKSk7dGhpcy50YWckPXQucGlwZShJdCgodD0+dC50YWcpKSksdGhpcy50aXRsZSQ9dGhpcy50YWckLnBpcGUoSXQoKHQ9PmYyKHQsdGhpcy5ncm91cE5hbWUpKSkpLHRoaXMucnVuSWQkPXQucGlwZShJdCgodD0+dC5ydW5JZCkpKSx0aGlzLnNhbXBsZSQ9dC5waXBlKEl0KCh0PT50LnNhbXBsZSkpKSx0aGlzLm51bVNhbXBsZSQ9dC5waXBlKEl0KCh0PT50Lm51bVNhbXBsZSkpKSx0aGlzLmltYWdlVXJsJD1uLnBpcGUoSXQoKHQ9PnQ/dGhpcy5kYXRhU291cmNlLmltYWdlVXJsKHQuaW1hZ2VJZCk6bnVsbCkpKSx0aGlzLnN0ZXBWYWx1ZXMkPWUucGlwZShJdCgodD0+dC5tYXAoKHQ9PnQuc3RlcCkpKSkpLHRoaXMuaXNQaW5uZWQkPXRoaXMuc3RvcmUuc2VsZWN0KHdULHRoaXMuY2FyZElkKX1uZ09uRGVzdHJveSgpe3RoaXMubmdVbnN1YnNjcmliZS5uZXh0KCksdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCl9fXZhciBLMixKMixRMjtmdW5jdGlvbiAkMih0LGUpezEmdCYmKFJtKDAsInNwYW4iKSxrdSgxLCJzY2FsYXIiKSxBbSgpKX1mdW5jdGlvbiB0NSh0LGUpezEmdCYmKFJtKDAsInNwYW4iKSxrdSgxLCJoaXN0b2dyYW0iKSxBbSgpKX1mdW5jdGlvbiBlNSh0LGUpezEmdCYmKFJtKDAsInNwYW4iKSxrdSgxLCJ1bmtub3duIiksQW0oKSl9ZnVuY3Rpb24gbjUodCxlKXtpZigxJnQmJihObSgwLDEzKSxRcCgxLCQyLDIsMCwic3BhbiIsMTQpLFFwKDIsdDUsMiwwLCJzcGFuIiwxNCksUXAoMyxlNSwyLDAsInNwYW4iLDE1KSx6bSgpKSwyJnQpe2NvbnN0IHQ9WW0oMik7RG0oIm5nU3dpdGNoIix0LmNhcmRNZXRhZGF0YS5wbHVnaW4pLHJjKDEpLERtKCJuZ1N3aXRjaENhc2UiLHQuUGx1Z2luVHlwZS5TQ0FMQVJTKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIix0LlBsdWdpblR5cGUuSElTVE9HUkFNUyl9fWZ1bmN0aW9uIG81KHQsZSl7MSZ0JiZJbSgwKX1mdW5jdGlvbiBpNSh0LGUpe2lmKDEmdCYmKFJtKDAsIm9wdGlvbiIsMTYpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdDtEbSgidmFsdWUiLHQuaWQpLHJjKDEpLFN1KHQubmFtZSl9fWZ1bmN0aW9uIGE1KHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Tm0oMCksUm0oMSwiaDIiKSxRcCgyLG41LDQsMywibmctdGVtcGxhdGUiLG51bGwsMixpYiksUm0oNCwic3BhbiIpLGt1KDUsIkRvd25sb2FkwqAiKSxBbSgpLFFwKDYsbzUsMSwwLCJuZy1jb250YWluZXIiLDMpLFJtKDcsInNwYW4iKSxrdSg4LCLCoGRhdGEgZm9ywqAiKSxBbSgpLFJtKDksImNvZGUiLDQpLGt1KDEwKSxBbSgpLEFtKCksUm0oMTEsIm1hdC1kaWFsb2ctY29udGVudCIpLFJtKDEyLCJtYXQtZm9ybS1maWVsZCIsNSksUm0oMTMsIm1hdC1sYWJlbCIpLGt1KDE0LCJTZWxlY3QgYSBydW4gdG8gZG93bmxvYWQgYSBkYXRhIGZvciBhIHNlcmllcyIpLEFtKCksUm0oMTUsInNlbGVjdCIsNiksVm0oImNoYW5nZSIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkucnVuU2VsZWN0ZWQuZW1pdChuLnRhcmdldC52YWx1ZSl9KSksUm0oMTYsIm9wdGlvbiIsNyksa3UoMTcsIi0iKSxBbSgpLFFwKDE4LGk1LDIsMiwib3B0aW9uIiw4KSxBbSgpLEFtKCksUm0oMTksImRpdiIsOSksUm0oMjAsInNwYW4iKSxrdSgyMSwiRG93bmxvYWQgYXPigKYiKSxBbSgpLGt1KDIyLCLCoCIpLFJtKDIzLCJhIiwxMCksa3UoMjQsIkpTT04iKSxBbSgpLFJtKDI1LCJhIiwxMCksa3UoMjYsIkNTViIpLEFtKCksQW0oKSxBbSgpLFJtKDI3LCJtYXQtZGlhbG9nLWFjdGlvbnMiLDExKSxSbSgyOCwiYnV0dG9uIiwxMiksa3UoMjksIkNsb3NlIiksQW0oKSxBbSgpLHptKCl9aWYoMiZ0KXtjb25zdCB0PSRwKDMpLGU9WW0oKTtyYyg2KSxEbSgibmdUZW1wbGF0ZU91dGxldCIsdCkscmMoMyksRG0oInRpdGxlIixlLmNhcmRNZXRhZGF0YS50YWcpLHJjKDEpLFN1KGUuY2FyZE1ldGFkYXRhLnRhZykscmMoNSksRG0oInZhbHVlIixlLnNlbGVjdGVkUnVuSWR8fCIiKSxyYygxKSxEbSgidmFsdWUiLCIiKSxyYygyKSxEbSgibmdGb3JPZiIsZS5ydW5zKSxyYyg1KSxEbSgiZGlzYWJsZWQiLCFlLmRvd25sb2FkVXJsSnNvbikoImRvd25sb2FkIixlLmdldERvd25sb2FkTmFtZSgianNvbiIpKSxqcCgiaHJlZiIsZS5kb3dubG9hZFVybEpzb24sVHMpLHJjKDIpLERtKCJkaXNhYmxlZCIsIWUuZG93bmxvYWRVcmxDc3YpKCJkb3dubG9hZCIsZS5nZXREb3dubG9hZE5hbWUoImNzdiIpKSxqcCgiaHJlZiIsZS5kb3dubG9hZFVybENzdixUcyl9fWZ1bmN0aW9uIHI1KHQsZSl7MSZ0JiZrdSgwLCJMb2FkaW5nLi4uIil9WDIuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFgyKShTbShJdyksU20oUEEpKX0sWDIuybVjbXA9dG8oe3R5cGU6WDIsc2VsZWN0b3JzOltbImltYWdlLWNhcmQiXV0saW5wdXRzOntjYXJkSWQ6ImNhcmRJZCIsZ3JvdXBOYW1lOiJncm91cE5hbWUiLHJ1bkNvbG9yU2NhbGU6InJ1bkNvbG9yU2NhbGUifSxvdXRwdXRzOntmdWxsV2lkdGhDaGFuZ2VkOiJmdWxsV2lkdGhDaGFuZ2VkIixwaW5TdGF0ZUNoYW5nZWQ6InBpblN0YXRlQ2hhbmdlZCJ9LGRlY2xzOjE0LHZhcnM6NDEsY29uc3RzOltbMywibG9hZFN0YXRlIiwidGl0bGUiLCJ0YWciLCJydW5JZCIsInNhbXBsZSIsIm51bVNhbXBsZSIsImltYWdlVXJsIiwic3RlcEluZGV4Iiwic3RlcFZhbHVlcyIsImJyaWdodG5lc3NJbk1pbGxpIiwiY29udHJhc3RJbk1pbGxpIiwicnVuQ29sb3JTY2FsZSIsInNob3dBY3R1YWxTaXplIiwiYWxsb3dUb2dnbGVBY3R1YWxTaXplIiwiaXNQaW5uZWQiLCJzdGVwSW5kZXhDaGFuZ2UiLCJvbkFjdHVhbFNpemVUb2dnbGUiLCJvblBpbkNsaWNrZWQiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImltYWdlLWNhcmQtY29tcG9uZW50IiwwKSxWbSgic3RlcEluZGV4Q2hhbmdlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblN0ZXBJbmRleENoYW5nZWQoZSl9KSkoIm9uQWN0dWFsU2l6ZVRvZ2dsZSIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkFjdHVhbFNpemVUb2dnbGUoKX0pKSgib25QaW5DbGlja2VkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5waW5TdGF0ZUNoYW5nZWQuZW1pdChlKX0pKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQWgoMywiYXN5bmMiKSxBaCg0LCJhc3luYyIpLEFoKDUsImFzeW5jIiksQWgoNiwiYXN5bmMiKSxBaCg3LCJhc3luYyIpLEFoKDgsImFzeW5jIiksQWgoOSwiYXN5bmMiKSxBaCgxMCwiYXN5bmMiKSxBaCgxMSwiYXN5bmMiKSxBaCgxMiwiYXN5bmMiKSxBaCgxMywiYXN5bmMiKSxBbSgpKSwyJmUmJkRtKCJsb2FkU3RhdGUiLFRoKDEsMTUsbi5sb2FkU3RhdGUkKSkoInRpdGxlIixUaCgyLDE3LG4udGl0bGUkKSkoInRhZyIsVGgoMywxOSxuLnRhZyQpKSgicnVuSWQiLFRoKDQsMjEsbi5ydW5JZCQpKSgic2FtcGxlIixUaCg1LDIzLG4uc2FtcGxlJCkpKCJudW1TYW1wbGUiLFRoKDYsMjUsbi5udW1TYW1wbGUkKSkoImltYWdlVXJsIixUaCg3LDI3LG4uaW1hZ2VVcmwkKSkoInN0ZXBJbmRleCIsVGgoOCwyOSxuLnN0ZXBJbmRleCQpKSgic3RlcFZhbHVlcyIsVGgoOSwzMSxuLnN0ZXBWYWx1ZXMkKSkoImJyaWdodG5lc3NJbk1pbGxpIixUaCgxMCwzMyxuLmJyaWdodG5lc3NJbk1pbGxpJCkpKCJjb250cmFzdEluTWlsbGkiLFRoKDExLDM1LG4uY29udHJhc3RJbk1pbGxpJCkpKCJydW5Db2xvclNjYWxlIixuLnJ1bkNvbG9yU2NhbGUpKCJzaG93QWN0dWFsU2l6ZSIsbi5zaG93QWN0dWFsU2l6ZSkoImFsbG93VG9nZ2xlQWN0dWFsU2l6ZSIsITE9PT1UaCgxMiwzNyxuLmFjdHVhbFNpemVHbG9iYWxTZXR0aW5nJCkpKCJpc1Bpbm5lZCIsVGgoMTMsMzksbi5pc1Bpbm5lZCQpKX0sZGlyZWN0aXZlczpbWjJdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChYMixbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJpbWFnZS1jYXJkIix0ZW1wbGF0ZTonXG4gICAgPGltYWdlLWNhcmQtY29tcG9uZW50XG4gICAgICBbbG9hZFN0YXRlXT0ibG9hZFN0YXRlJCB8IGFzeW5jIlxuICAgICAgW3RpdGxlXT0idGl0bGUkIHwgYXN5bmMiXG4gICAgICBbdGFnXT0idGFnJCB8IGFzeW5jIlxuICAgICAgW3J1bklkXT0icnVuSWQkIHwgYXN5bmMiXG4gICAgICBbc2FtcGxlXT0ic2FtcGxlJCB8IGFzeW5jIlxuICAgICAgW251bVNhbXBsZV09Im51bVNhbXBsZSQgfCBhc3luYyJcbiAgICAgIFtpbWFnZVVybF09ImltYWdlVXJsJCB8IGFzeW5jIlxuICAgICAgW3N0ZXBJbmRleF09InN0ZXBJbmRleCQgfCBhc3luYyJcbiAgICAgIFtzdGVwVmFsdWVzXT0ic3RlcFZhbHVlcyQgfCBhc3luYyJcbiAgICAgIChzdGVwSW5kZXhDaGFuZ2UpPSJvblN0ZXBJbmRleENoYW5nZWQoJGV2ZW50KSJcbiAgICAgIFticmlnaHRuZXNzSW5NaWxsaV09ImJyaWdodG5lc3NJbk1pbGxpJCB8IGFzeW5jIlxuICAgICAgW2NvbnRyYXN0SW5NaWxsaV09ImNvbnRyYXN0SW5NaWxsaSQgfCBhc3luYyJcbiAgICAgIFtydW5Db2xvclNjYWxlXT0icnVuQ29sb3JTY2FsZSJcbiAgICAgIFtzaG93QWN0dWFsU2l6ZV09InNob3dBY3R1YWxTaXplIlxuICAgICAgW2FsbG93VG9nZ2xlQWN0dWFsU2l6ZV09IihhY3R1YWxTaXplR2xvYmFsU2V0dGluZyQgfCBhc3luYykgPT09IGZhbHNlIlxuICAgICAgW2lzUGlubmVkXT0iaXNQaW5uZWQkIHwgYXN5bmMiXG4gICAgICAob25BY3R1YWxTaXplVG9nZ2xlKT0ib25BY3R1YWxTaXplVG9nZ2xlKCkiXG4gICAgICAob25QaW5DbGlja2VkKT0icGluU3RhdGVDaGFuZ2VkLmVtaXQoJGV2ZW50KSJcbiAgICA+PC9pbWFnZS1jYXJkLWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9LHt0eXBlOlBBfV19KSx7Y2FyZElkOlt7dHlwZTp4eX1dLGdyb3VwTmFtZTpbe3R5cGU6eHl9XSxydW5Db2xvclNjYWxlOlt7dHlwZTp4eX1dLGZ1bGxXaWR0aENoYW5nZWQ6W3t0eXBlOk95fV0scGluU3RhdGVDaGFuZ2VkOlt7dHlwZTpPeX1dfSksKGZ1bmN0aW9uKHQpe3RbdC5TVkc9MF09IlNWRyIsdFt0LldFQkdMPTFdPSJXRUJHTCJ9KShLMnx8KEsyPXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5MSU5FQVI9MF09IkxJTkVBUiIsdFt0LkxPRzEwPTFdPSJMT0cxMCIsdFt0LlRJTUU9Ml09IlRJTUUifSkoSjJ8fChKMj17fSkpO2NsYXNzIHM1e2NvbnN0cnVjdG9yKCl7dGhpcy5ydW5TZWxlY3RlZD1uZXcgTGgsdGhpcy5QbHVnaW5UeXBlPWhBfWdldERvd25sb2FkTmFtZSh0KXtjb25zdCBlPXRoaXMucnVucy5maW5kKCh0PT50LmlkPT09dGhpcy5zZWxlY3RlZFJ1bklkKSk7cmV0dXJuIGU/YCR7ZS5uYW1lfS4ke3R9YDoiIn19czUuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHM1KX0sczUuybVjbXA9dG8oe3R5cGU6czUsc2VsZWN0b3JzOltbImRhdGFfZG93bmxvYWRfZGlhbG9nX2NvbXBvbmVudCJdXSxpbnB1dHM6e2NhcmRNZXRhZGF0YToiY2FyZE1ldGFkYXRhIixydW5zOiJydW5zIixzZWxlY3RlZFJ1bklkOiJzZWxlY3RlZFJ1bklkIixkb3dubG9hZFVybENzdjoiZG93bmxvYWRVcmxDc3YiLGRvd25sb2FkVXJsSnNvbjoiZG93bmxvYWRVcmxKc29uIn0sb3V0cHV0czp7cnVuU2VsZWN0ZWQ6InJ1blNlbGVjdGVkIn0sZGVjbHM6Myx2YXJzOjIsY29uc3RzOltbNCwibmdJZiIsIm5nSWZFbHNlIl0sWyJub0NhcmRNZXRhZGF0YSIsIiJdLFsiZGF0YU5hbWUiLCIiXSxbNCwibmdUZW1wbGF0ZU91dGxldCJdLFsxLCJ0YWctbmFtZSIsMywidGl0bGUiXSxbImFwcGVhcmFuY2UiLCJmaWxsIiwxLCJydW4tc2VsZWN0b3IiXSxbIm1hdE5hdGl2ZUNvbnRyb2wiLCIiLCJuYW1lIiwicnVuIiwiY2RrRm9jdXNJbml0aWFsIiwiIiwicmVxdWlyZWQiLCIiLDMsInZhbHVlIiwiY2hhbmdlIl0sWyJzZWxlY3RlZCIsIiIsMywidmFsdWUiXSxbMywidmFsdWUiLDQsIm5nRm9yIiwibmdGb3JPZiJdLFsxLCJkb3dubG9hZC1jb250cm9scyJdLFsibWF0LXN0cm9rZWQtYnV0dG9uIiwiIiwzLCJkaXNhYmxlZCIsImRvd25sb2FkIl0sWyJhbGlnbiIsImVuZCJdLFsibWF0LWJ1dHRvbiIsIiIsIm1hdC1kaWFsb2ctY2xvc2UiLCIiXSxbMywibmdTd2l0Y2giXSxbNCwibmdTd2l0Y2hDYXNlIl0sWzQsIk5nU3dpdGNoRGVmYXVsdCJdLFszLCJ2YWx1ZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoUXAoMCxhNSwzMCwxMiwibmctY29udGFpbmVyIiwwKSxRcCgxLHI1LDEsMCwibmctdGVtcGxhdGUiLG51bGwsMSxpYikpLDImZSl7Y29uc3QgdD0kcCgyKTtEbSgibmdJZiIsbi5jYXJkTWV0YWRhdGEpKCJuZ0lmRWxzZSIsdCl9fSxkaXJlY3RpdmVzOltkTSxNTSxzVyxBVix2VixMWSxJVSxCVSxsTSxLSCxsVyxYSCxhVyxmTSxnTV0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9aDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxLjI1ZW07b3ZlcmZsb3ctd3JhcDpicmVhay13b3JkfS5ydW4tc2VsZWN0b3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTouOWVtO3dpZHRoOjEwMCV9LmRvd25sb2FkLWNvbnRyb2xzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6LjllbX0uZG93bmxvYWQtY29udHJvbHNbX25nY29udGVudC0lQ09NUCVdICAgYVtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjNweCAxMHB4IDNweCAwfSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChzNSxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJkYXRhX2Rvd25sb2FkX2RpYWxvZ19jb21wb25lbnQiLHRlbXBsYXRlVXJsOiJkYXRhX2Rvd25sb2FkX2RpYWxvZ19jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiZGF0YV9kb3dubG9hZF9kaWFsb2dfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse2NhcmRNZXRhZGF0YTpbe3R5cGU6eHl9XSxydW5zOlt7dHlwZTp4eX1dLHNlbGVjdGVkUnVuSWQ6W3t0eXBlOnh5fV0sZG93bmxvYWRVcmxDc3Y6W3t0eXBlOnh5fV0sZG93bmxvYWRVcmxKc29uOlt7dHlwZTp4eX1dLHJ1blNlbGVjdGVkOlt7dHlwZTpPeX1dfSk7Y2xhc3MgbDV7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuc2VsZWN0ZWRSdW5JZCQ9bmV3IEYobnVsbCksdGhpcy5jYXJkTWV0YWRhdGEkPXQuc2VsZWN0KHlULG4uY2FyZElkKS5waXBlKGNlKCh0PT5Cb29sZWFuKHQpKSkpLHRoaXMuZG93bmxvYWRVcmxDc3YkPVd0KFt0LnNlbGVjdCh5VCxuLmNhcmRJZCksdGhpcy5zZWxlY3RlZFJ1bklkJF0pLnBpcGUoSXQoKChbdCxuXSk9PnQmJm4/ZS5kb3dubG9hZFVybCh0LnBsdWdpbix0LnRhZyxuLCJjc3YiKTpudWxsKSksTmUobnVsbCkpLHRoaXMuZG93bmxvYWRVcmxKc29uJD1XdChbdC5zZWxlY3QoeVQsbi5jYXJkSWQpLHRoaXMuc2VsZWN0ZWRSdW5JZCRdKS5waXBlKEl0KCgoW3Qsbl0pPT50JiZuP2UuZG93bmxvYWRVcmwodC5wbHVnaW4sdC50YWcsbiwianNvbiIpOm51bGwpKSxOZShudWxsKSksdGhpcy5ydW5zJD1XdChbdC5zZWxlY3QoZE4pLHQuc2VsZWN0KGhULG4uY2FyZElkKV0pLnBpcGUoSXQoKChbdCxlXSk9PmU/T2JqZWN0LmtleXMoZSkubWFwKChlPT50LmdldChlKSkpLmZpbHRlcihCb29sZWFuKTpbXSkpKX19ZnVuY3Rpb24gYzUodCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOnQ+PWU/MDpOYU59ZnVuY3Rpb24gZDUodCl7cmV0dXJuIDE9PT10Lmxlbmd0aCYmKHQ9KGZ1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuIGM1KHQoZSksbil9fSkodCkpLHtsZWZ0OmZ1bmN0aW9uKGUsbixvLGkpe2ZvcihudWxsPT1vJiYobz0wKSxudWxsPT1pJiYoaT1lLmxlbmd0aCk7bzxpOyl7dmFyIGE9bytpPj4+MTt0KGVbYV0sbik8MD9vPWErMTppPWF9cmV0dXJuIG99LHJpZ2h0OmZ1bmN0aW9uKGUsbixvLGkpe2ZvcihudWxsPT1vJiYobz0wKSxudWxsPT1pJiYoaT1lLmxlbmd0aCk7bzxpOyl7dmFyIGE9bytpPj4+MTt0KGVbYV0sbik+MD9pPWE6bz1hKzF9cmV0dXJuIG99fX1sNS7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bDUpKFNtKEl3KSxTbShQQSksU20oSkcpKX0sbDUuybVjbXA9dG8oe3R5cGU6bDUsc2VsZWN0b3JzOltbImRhdGFfZG93bmxvYWRfZGlhbG9nIl1dLGRlY2xzOjYsdmFyczoxNSxjb25zdHM6W1szLCJjYXJkTWV0YWRhdGEiLCJydW5zIiwic2VsZWN0ZWRSdW5JZCIsImRvd25sb2FkVXJsQ3N2IiwiZG93bmxvYWRVcmxKc29uIiwicnVuU2VsZWN0ZWQiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImRhdGFfZG93bmxvYWRfZGlhbG9nX2NvbXBvbmVudCIsMCksVm0oInJ1blNlbGVjdGVkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5zZWxlY3RlZFJ1bklkJC5uZXh0KGUpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBaCgzLCJhc3luYyIpLEFoKDQsImFzeW5jIiksQWgoNSwiYXN5bmMiKSxBbSgpKSwyJmUmJkRtKCJjYXJkTWV0YWRhdGEiLFRoKDEsNSxuLmNhcmRNZXRhZGF0YSQpKSgicnVucyIsVGgoMiw3LG4ucnVucyQpKSgic2VsZWN0ZWRSdW5JZCIsVGgoMyw5LG4uc2VsZWN0ZWRSdW5JZCQpKSgiZG93bmxvYWRVcmxDc3YiLFRoKDQsMTEsbi5kb3dubG9hZFVybENzdiQpKSgiZG93bmxvYWRVcmxKc29uIixUaCg1LDEzLG4uZG93bmxvYWRVcmxKc29uJCkpfSxkaXJlY3RpdmVzOltzNV0scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGw1LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImRhdGFfZG93bmxvYWRfZGlhbG9nIix0ZW1wbGF0ZTonPGRhdGFfZG93bmxvYWRfZGlhbG9nX2NvbXBvbmVudFxuICAgIFtjYXJkTWV0YWRhdGFdPSJjYXJkTWV0YWRhdGEkIHwgYXN5bmMiXG4gICAgW3J1bnNdPSJydW5zJCB8IGFzeW5jIlxuICAgIFtzZWxlY3RlZFJ1bklkXT0ic2VsZWN0ZWRSdW5JZCQgfCBhc3luYyJcbiAgICBbZG93bmxvYWRVcmxDc3ZdPSJkb3dubG9hZFVybENzdiQgfCBhc3luYyJcbiAgICBbZG93bmxvYWRVcmxKc29uXT0iZG93bmxvYWRVcmxKc29uJCB8IGFzeW5jIlxuICAgIChydW5TZWxlY3RlZCk9InNlbGVjdGVkUnVuSWQkLm5leHQoJGV2ZW50KSJcbiAgPjwvZGF0YV9kb3dubG9hZF9kaWFsb2dfY29tcG9uZW50PicsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fSx7dHlwZTpQQX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W0pHXX1dfV19KSxudWxsKSwoZnVuY3Rpb24odCl7dFt0Lk9SSUdJTkFMPTBdPSJPUklHSU5BTCIsdFt0LkRFUklWRUQ9MV09IkRFUklWRUQifSkoUTJ8fChRMj17fSkpO3ZhciBwNT1kNShjNSkucmlnaHQ7ZnVuY3Rpb24gbTUodCxlKXt2YXIgbixvLGksYT10Lmxlbmd0aCxyPS0xO2lmKG51bGw9PWUpe2Zvcig7KytyPGE7KWlmKG51bGwhPShuPXRbcl0pJiZuPj1uKWZvcihvPWk9bjsrK3I8YTspbnVsbCE9KG49dFtyXSkmJihvPm4mJihvPW4pLGk8biYmKGk9bikpfWVsc2UgZm9yKDsrK3I8YTspaWYobnVsbCE9KG49ZSh0W3JdLHIsdCkpJiZuPj1uKWZvcihvPWk9bjsrK3I8YTspbnVsbCE9KG49ZSh0W3JdLHIsdCkpJiYobz5uJiYobz1uKSxpPG4mJihpPW4pKTtyZXR1cm5bbyxpXX12YXIgdTU9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIGY1KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBnNSh0KXtyZXR1cm4gdH1mdW5jdGlvbiBoNSh0LGUsbil7dD0rdCxlPStlLG49KGk9YXJndW1lbnRzLmxlbmd0aCk8Mj8oZT10LHQ9MCwxKTppPDM/MTorbjtmb3IodmFyIG89LTEsaT0wfE1hdGgubWF4KDAsTWF0aC5jZWlsKChlLXQpL24pKSxhPW5ldyBBcnJheShpKTsrK288aTspYVtvXT10K28qbjtyZXR1cm4gYX12YXIgYjU9TWF0aC5zcXJ0KDUwKSx5NT1NYXRoLnNxcnQoMTApLF81PU1hdGguc3FydCgyKTtmdW5jdGlvbiBDNSh0LGUsbil7dmFyIG8saSxhLHIscz0tMTtpZihuPStuLCh0PSt0KT09KGU9K2UpJiZuPjApcmV0dXJuW3RdO2lmKChvPWU8dCkmJihpPXQsdD1lLGU9aSksMD09PShyPU01KHQsZSxuKSl8fCFpc0Zpbml0ZShyKSlyZXR1cm5bXTtpZihyPjApZm9yKHQ9TWF0aC5jZWlsKHQvciksZT1NYXRoLmZsb29yKGUvciksYT1uZXcgQXJyYXkoaT1NYXRoLmNlaWwoZS10KzEpKTsrK3M8aTspYVtzXT0odCtzKSpyO2Vsc2UgZm9yKHQ9TWF0aC5mbG9vcih0KnIpLGU9TWF0aC5jZWlsKGUqciksYT1uZXcgQXJyYXkoaT1NYXRoLmNlaWwodC1lKzEpKTsrK3M8aTspYVtzXT0odC1zKS9yO3JldHVybiBvJiZhLnJldmVyc2UoKSxhfWZ1bmN0aW9uIE01KHQsZSxuKXt2YXIgbz0oZS10KS9NYXRoLm1heCgwLG4pLGk9TWF0aC5mbG9vcihNYXRoLmxvZyhvKS9NYXRoLkxOMTApLGE9by9NYXRoLnBvdygxMCxpKTtyZXR1cm4gaT49MD8oYT49YjU/MTA6YT49eTU/NTphPj1fNT8yOjEpKk1hdGgucG93KDEwLGkpOi1NYXRoLnBvdygxMCwtaSkvKGE+PWI1PzEwOmE+PXk1PzU6YT49XzU/MjoxKX1mdW5jdGlvbiB2NSh0LGUsbil7dmFyIG89TWF0aC5hYnMoZS10KS9NYXRoLm1heCgwLG4pLGk9TWF0aC5wb3coMTAsTWF0aC5mbG9vcihNYXRoLmxvZyhvKS9NYXRoLkxOMTApKSxhPW8vaTtyZXR1cm4gYT49YjU/aSo9MTA6YT49eTU/aSo9NTphPj1fNSYmKGkqPTIpLGU8dD8taTppfWZ1bmN0aW9uIHg1KHQpe3JldHVybiBNYXRoLmNlaWwoTWF0aC5sb2codC5sZW5ndGgpL01hdGguTE4yKSsxfWZ1bmN0aW9uIE81KCl7dmFyIHQ9ZzUsZT1tNSxuPXg1O2Z1bmN0aW9uIG8obyl7dmFyIGksYSxyPW8ubGVuZ3RoLHM9bmV3IEFycmF5KHIpO2ZvcihpPTA7aTxyOysraSlzW2ldPXQob1tpXSxpLG8pO3ZhciBsPWUocyksYz1sWzBdLGQ9bFsxXSxwPW4ocyxjLGQpO0FycmF5LmlzQXJyYXkocCl8fChwPXY1KGMsZCxwKSxwPWg1KE1hdGguY2VpbChjL3ApKnAsZCxwKSk7Zm9yKHZhciBtPXAubGVuZ3RoO3BbMF08PWM7KXAuc2hpZnQoKSwtLW07Zm9yKDtwW20tMV0+ZDspcC5wb3AoKSwtLW07dmFyIHUsZj1uZXcgQXJyYXkobSsxKTtmb3IoaT0wO2k8PW07KytpKSh1PWZbaV09W10pLngwPWk+MD9wW2ktMV06Yyx1LngxPWk8bT9wW2ldOmQ7Zm9yKGk9MDtpPHI7KytpKWM8PShhPXNbaV0pJiZhPD1kJiZmW3A1KHAsYSwwLG0pXS5wdXNoKG9baV0pO3JldHVybiBmfXJldHVybiBvLnZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6ZjUoZSksbyk6dH0sby5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmNShbdFswXSx0WzFdXSksbyk6ZX0sby50aHJlc2hvbGRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6QXJyYXkuaXNBcnJheSh0KT9mNSh1NS5jYWxsKHQpKTpmNSh0KSxvKTpufSxvfXZhciBQNT1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gdzUodCl7cmV0dXJuIHR9dmFyIGs1PTFlLTY7ZnVuY3Rpb24gUzUodCl7cmV0dXJuInRyYW5zbGF0ZSgiKyh0Ky41KSsiLDApIn1mdW5jdGlvbiBENSh0KXtyZXR1cm4idHJhbnNsYXRlKDAsIisodCsuNSkrIikifWZ1bmN0aW9uIEU1KHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4rdChlKX19ZnVuY3Rpb24gUjUodCl7dmFyIGU9TWF0aC5tYXgoMCx0LmJhbmR3aWR0aCgpLTEpLzI7cmV0dXJuIHQucm91bmQoKSYmKGU9TWF0aC5yb3VuZChlKSksZnVuY3Rpb24obil7cmV0dXJuK3QobikrZX19ZnVuY3Rpb24gQTUoKXtyZXR1cm4hdGhpcy5fX2F4aXN9ZnVuY3Rpb24gVDUodCxlKXt2YXIgbj1bXSxvPW51bGwsaT1udWxsLGE9NixyPTYscz0zLGw9MT09PXR8fDQ9PT10Py0xOjEsYz00PT09dHx8Mj09PXQ/IngiOiJ5IixkPTE9PT10fHwzPT09dD9TNTpENTtmdW5jdGlvbiBwKHApe3ZhciBtPW51bGw9PW8/ZS50aWNrcz9lLnRpY2tzLmFwcGx5KGUsbik6ZS5kb21haW4oKTpvLHU9bnVsbD09aT9lLnRpY2tGb3JtYXQ/ZS50aWNrRm9ybWF0LmFwcGx5KGUsbik6dzU6aSxmPU1hdGgubWF4KGEsMCkrcyxnPWUucmFuZ2UoKSxoPStnWzBdKy41LGI9K2dbZy5sZW5ndGgtMV0rLjUseT0oZS5iYW5kd2lkdGg/UjU6RTUpKGUuY29weSgpKSxfPXAuc2VsZWN0aW9uP3Auc2VsZWN0aW9uKCk6cCxDPV8uc2VsZWN0QWxsKCIuZG9tYWluIikuZGF0YShbbnVsbF0pLE09Xy5zZWxlY3RBbGwoIi50aWNrIikuZGF0YShtLGUpLm9yZGVyKCksdj1NLmV4aXQoKSx4PU0uZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInRpY2siKSxPPU0uc2VsZWN0KCJsaW5lIiksUD1NLnNlbGVjdCgidGV4dCIpO0M9Qy5tZXJnZShDLmVudGVyKCkuaW5zZXJ0KCJwYXRoIiwiLnRpY2siKS5hdHRyKCJjbGFzcyIsImRvbWFpbiIpLmF0dHIoInN0cm9rZSIsImN1cnJlbnRDb2xvciIpKSxNPU0ubWVyZ2UoeCksTz1PLm1lcmdlKHguYXBwZW5kKCJsaW5lIikuYXR0cigic3Ryb2tlIiwiY3VycmVudENvbG9yIikuYXR0cihjKyIyIixsKmEpKSxQPVAubWVyZ2UoeC5hcHBlbmQoInRleHQiKS5hdHRyKCJmaWxsIiwiY3VycmVudENvbG9yIikuYXR0cihjLGwqZikuYXR0cigiZHkiLDE9PT10PyIwZW0iOjM9PT10PyIwLjcxZW0iOiIwLjMyZW0iKSkscCE9PV8mJihDPUMudHJhbnNpdGlvbihwKSxNPU0udHJhbnNpdGlvbihwKSxPPU8udHJhbnNpdGlvbihwKSxQPVAudHJhbnNpdGlvbihwKSx2PXYudHJhbnNpdGlvbihwKS5hdHRyKCJvcGFjaXR5IixrNSkuYXR0cigidHJhbnNmb3JtIiwoZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9eSh0KSk/ZCh0KTp0aGlzLmdldEF0dHJpYnV0ZSgidHJhbnNmb3JtIil9KSkseC5hdHRyKCJvcGFjaXR5IixrNSkuYXR0cigidHJhbnNmb3JtIiwoZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wYXJlbnROb2RlLl9fYXhpcztyZXR1cm4gZChlJiZpc0Zpbml0ZShlPWUodCkpP2U6eSh0KSl9KSkpLHYucmVtb3ZlKCksQy5hdHRyKCJkIiw0PT09dHx8Mj09dD9yPyJNIitsKnIrIiwiK2grIkgwLjVWIitiKyJIIitsKnI6Ik0wLjUsIitoKyJWIitiOnI/Ik0iK2grIiwiK2wqcisiVjAuNUgiK2IrIlYiK2wqcjoiTSIraCsiLDAuNUgiK2IpLE0uYXR0cigib3BhY2l0eSIsMSkuYXR0cigidHJhbnNmb3JtIiwoZnVuY3Rpb24odCl7cmV0dXJuIGQoeSh0KSl9KSksTy5hdHRyKGMrIjIiLGwqYSksUC5hdHRyKGMsbCpmKS50ZXh0KHUpLF8uZmlsdGVyKEE1KS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoImZvbnQtc2l6ZSIsMTApLmF0dHIoImZvbnQtZmFtaWx5Iiwic2Fucy1zZXJpZiIpLmF0dHIoInRleHQtYW5jaG9yIiwyPT09dD8ic3RhcnQiOjQ9PT10PyJlbmQiOiJtaWRkbGUiKSxfLmVhY2goKGZ1bmN0aW9uKCl7dGhpcy5fX2F4aXM9eX0pKX1yZXR1cm4gcC5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LHApOmV9LHAudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gbj1QNS5jYWxsKGFyZ3VtZW50cykscH0scC50aWNrQXJndW1lbnRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPW51bGw9PXQ/W106UDUuY2FsbCh0KSxwKTpuLnNsaWNlKCl9LHAudGlja1ZhbHVlcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1udWxsPT10P251bGw6UDUuY2FsbCh0KSxwKTpvJiZvLnNsaWNlKCl9LHAudGlja0Zvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LHApOml9LHAudGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9cj0rdCxwKTphfSxwLnRpY2tTaXplSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9K3QscCk6YX0scC50aWNrU2l6ZU91dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0LHApOnJ9LHAudGlja1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9K3QscCk6c30scH1mdW5jdGlvbiBONSh0KXtyZXR1cm4gVDUoMix0KX1mdW5jdGlvbiB6NSh0KXtyZXR1cm4gVDUoMyx0KX12YXIgSTU9e3ZhbHVlOmZ1bmN0aW9uKCl7fX07ZnVuY3Rpb24gSDUoKXtmb3IodmFyIHQsZT0wLG49YXJndW1lbnRzLmxlbmd0aCxvPXt9O2U8bjsrK2Upe2lmKCEodD1hcmd1bWVudHNbZV0rIiIpfHx0IGluIG98fC9bXHMuXS8udGVzdCh0KSl0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgdHlwZTogIit0KTtvW3RdPVtdfXJldHVybiBuZXcgRjUobyl9ZnVuY3Rpb24gRjUodCl7dGhpcy5fPXR9ZnVuY3Rpb24gTDUodCxlKXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKChmdW5jdGlvbih0KXt2YXIgbj0iIixvPXQuaW5kZXhPZigiLiIpO2lmKG8+PTAmJihuPXQuc2xpY2UobysxKSx0PXQuc2xpY2UoMCxvKSksdCYmIWUuaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7cmV0dXJue3R5cGU6dCxuYW1lOm59fSkpfWZ1bmN0aW9uIEI1KHQsZSl7Zm9yKHZhciBuLG89MCxpPXQubGVuZ3RoO288aTsrK28paWYoKG49dFtvXSkubmFtZT09PWUpcmV0dXJuIG4udmFsdWV9ZnVuY3Rpb24gVjUodCxlLG4pe2Zvcih2YXIgbz0wLGk9dC5sZW5ndGg7bzxpOysrbylpZih0W29dLm5hbWU9PT1lKXt0W29dPUk1LHQ9dC5zbGljZSgwLG8pLmNvbmNhdCh0LnNsaWNlKG8rMSkpO2JyZWFrfXJldHVybiBudWxsIT1uJiZ0LnB1c2goe25hbWU6ZSx2YWx1ZTpufSksdH1GNS5wcm90b3R5cGU9SDUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpGNSxvbjpmdW5jdGlvbih0LGUpe3ZhciBuLG89dGhpcy5fLGk9TDUodCsiIixvKSxhPS0xLHI9aS5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrZSk7Zm9yKDsrK2E8cjspaWYobj0odD1pW2FdKS50eXBlKW9bbl09VjUob1tuXSx0Lm5hbWUsZSk7ZWxzZSBpZihudWxsPT1lKWZvcihuIGluIG8pb1tuXT1WNShvW25dLHQubmFtZSxudWxsKTtyZXR1cm4gdGhpc31mb3IoOysrYTxyOylpZigobj0odD1pW2FdKS50eXBlKSYmKG49QjUob1tuXSx0Lm5hbWUpKSlyZXR1cm4gbn0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LGU9dGhpcy5fO2Zvcih2YXIgbiBpbiBlKXRbbl09ZVtuXS5zbGljZSgpO3JldHVybiBuZXcgRjUodCl9LGNhbGw6ZnVuY3Rpb24odCxlKXtpZigobj1hcmd1bWVudHMubGVuZ3RoLTIpPjApZm9yKHZhciBuLG8saT1uZXcgQXJyYXkobiksYT0wO2E8bjsrK2EpaVthXT1hcmd1bWVudHNbYSsyXTtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2ZvcihhPTAsbj0obz10aGlzLl9bdF0pLmxlbmd0aDthPG47KythKW9bYV0udmFsdWUuYXBwbHkoZSxpKX0sYXBwbHk6ZnVuY3Rpb24odCxlLG4pe2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKHZhciBvPXRoaXMuX1t0XSxpPTAsYT1vLmxlbmd0aDtpPGE7KytpKW9baV0udmFsdWUuYXBwbHkoZSxuKX19O3ZhciBqNT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsVTU9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOmo1LHhsaW5rOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIix4bWw6Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIn07ZnVuY3Rpb24gRzUodCl7dmFyIGU9dCs9IiIsbj1lLmluZGV4T2YoIjoiKTtyZXR1cm4gbj49MCYmInhtbG5zIiE9PShlPXQuc2xpY2UoMCxuKSkmJih0PXQuc2xpY2UobisxKSksVTUuaGFzT3duUHJvcGVydHkoZSk/e3NwYWNlOlU1W2VdLGxvY2FsOnR9OnR9ZnVuY3Rpb24gVzUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vd25lckRvY3VtZW50LG49dGhpcy5uYW1lc3BhY2VVUkk7cmV0dXJuIG49PT1qNSYmZS5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJPT09ajU/ZS5jcmVhdGVFbGVtZW50KHQpOmUuY3JlYXRlRWxlbWVudE5TKG4sdCl9fWZ1bmN0aW9uIFk1KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIHE1KHQpe3ZhciBlPUc1KHQpO3JldHVybihlLmxvY2FsP1k1Olc1KShlKX1mdW5jdGlvbiBaNSgpe31mdW5jdGlvbiBYNSh0KXtyZXR1cm4gbnVsbD09dD9aNTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IodCl9fWZ1bmN0aW9uIEs1KCl7cmV0dXJuW119ZnVuY3Rpb24gSjUodCl7cmV0dXJuIG51bGw9PXQ/SzU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHQpfX1mdW5jdGlvbiBRNSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXRjaGVzKHQpfX1mdW5jdGlvbiAkNSh0KXtyZXR1cm4gbmV3IEFycmF5KHQubGVuZ3RoKX1mdW5jdGlvbiB0NCh0LGUpe3RoaXMub3duZXJEb2N1bWVudD10Lm93bmVyRG9jdW1lbnQsdGhpcy5uYW1lc3BhY2VVUkk9dC5uYW1lc3BhY2VVUkksdGhpcy5fbmV4dD1udWxsLHRoaXMuX3BhcmVudD10LHRoaXMuX19kYXRhX189ZX1mdW5jdGlvbiBlNCh0LGUsbixvLGksYSl7Zm9yKHZhciByLHM9MCxsPWUubGVuZ3RoLGM9YS5sZW5ndGg7czxjOysrcykocj1lW3NdKT8oci5fX2RhdGFfXz1hW3NdLG9bc109cik6bltzXT1uZXcgdDQodCxhW3NdKTtmb3IoO3M8bDsrK3MpKHI9ZVtzXSkmJihpW3NdPXIpfWZ1bmN0aW9uIG40KHQsZSxuLG8saSxhLHIpe3ZhciBzLGwsYyxkPXt9LHA9ZS5sZW5ndGgsbT1hLmxlbmd0aCx1PW5ldyBBcnJheShwKTtmb3Iocz0wO3M8cDsrK3MpKGw9ZVtzXSkmJih1W3NdPWM9IiQiK3IuY2FsbChsLGwuX19kYXRhX18scyxlKSxjIGluIGQ/aVtzXT1sOmRbY109bCk7Zm9yKHM9MDtzPG07KytzKShsPWRbYz0iJCIrci5jYWxsKHQsYVtzXSxzLGEpXSk/KG9bc109bCxsLl9fZGF0YV9fPWFbc10sZFtjXT1udWxsKTpuW3NdPW5ldyB0NCh0LGFbc10pO2ZvcihzPTA7czxwOysrcykobD1lW3NdKSYmZFt1W3NdXT09PWwmJihpW3NdPWwpfWZ1bmN0aW9uIG80KHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTp0Pj1lPzA6TmFOfWZ1bmN0aW9uIGk0KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX1mdW5jdGlvbiBhNCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIHI0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUodCxlKX19ZnVuY3Rpb24gczQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxlKX19ZnVuY3Rpb24gbDQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpOnRoaXMuc2V0QXR0cmlidXRlKHQsbil9fWZ1bmN0aW9uIGM0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk6dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsbil9fWZ1bmN0aW9uIGQ0KHQpe3JldHVybiB0Lm93bmVyRG9jdW1lbnQmJnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8dC5kb2N1bWVudCYmdHx8dC5kZWZhdWx0Vmlld31mdW5jdGlvbiBwNCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX1mdW5jdGlvbiBtNCh0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LGUsbil9fWZ1bmN0aW9uIHU0KHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1vP3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCk6dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LG8sbil9fWZ1bmN0aW9uIGY0KHQsZSl7cmV0dXJuIHQuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShlKXx8ZDQodCkuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpLmdldFByb3BlcnR5VmFsdWUoZSl9ZnVuY3Rpb24gZzQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbdF19fWZ1bmN0aW9uIGg0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpc1t0XT1lfX1mdW5jdGlvbiBiNCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PW4/ZGVsZXRlIHRoaXNbdF06dGhpc1t0XT1ufX1mdW5jdGlvbiB5NCh0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLyl9ZnVuY3Rpb24gXzQodCl7cmV0dXJuIHQuY2xhc3NMaXN0fHxuZXcgQzQodCl9ZnVuY3Rpb24gQzQodCl7dGhpcy5fbm9kZT10LHRoaXMuX25hbWVzPXk0KHQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9ZnVuY3Rpb24gTTQodCxlKXtmb3IodmFyIG49XzQodCksbz0tMSxpPWUubGVuZ3RoOysrbzxpOyluLmFkZChlW29dKX1mdW5jdGlvbiB2NCh0LGUpe2Zvcih2YXIgbj1fNCh0KSxvPS0xLGk9ZS5sZW5ndGg7KytvPGk7KW4ucmVtb3ZlKGVbb10pfWZ1bmN0aW9uIHg0KHQpe3JldHVybiBmdW5jdGlvbigpe000KHRoaXMsdCl9fWZ1bmN0aW9uIE80KHQpe3JldHVybiBmdW5jdGlvbigpe3Y0KHRoaXMsdCl9fWZ1bmN0aW9uIFA0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7KGUuYXBwbHkodGhpcyxhcmd1bWVudHMpP000OnY0KSh0aGlzLHQpfX1mdW5jdGlvbiB3NCgpe3RoaXMudGV4dENvbnRlbnQ9IiJ9ZnVuY3Rpb24gazQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD10fX1mdW5jdGlvbiBTNCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PWU/IiI6ZX19ZnVuY3Rpb24gRDQoKXt0aGlzLmlubmVySFRNTD0iIn1mdW5jdGlvbiBFNCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD10fX1mdW5jdGlvbiBSNCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT1lPyIiOmV9fWZ1bmN0aW9uIEE0KCl7dGhpcy5uZXh0U2libGluZyYmdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpfWZ1bmN0aW9uIFQ0KCl7dGhpcy5wcmV2aW91c1NpYmxpbmcmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcyx0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gTjQoKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiB6NCgpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTt0JiZ0LnJlbW92ZUNoaWxkKHRoaXMpfWZ1bmN0aW9uIEk0KCl7dmFyIHQ9dGhpcy5jbG9uZU5vZGUoITEpLGU9dGhpcy5wYXJlbnROb2RlO3JldHVybiBlP2UuaW5zZXJ0QmVmb3JlKHQsdGhpcy5uZXh0U2libGluZyk6dH1mdW5jdGlvbiBINCgpe3ZhciB0PXRoaXMuY2xvbmVOb2RlKCEwKSxlPXRoaXMucGFyZW50Tm9kZTtyZXR1cm4gZT9lLmluc2VydEJlZm9yZSh0LHRoaXMubmV4dFNpYmxpbmcpOnR9dDQucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp0NCxhcHBlbmRDaGlsZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LHRoaXMuX25leHQpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LGUpfSxxdWVyeVNlbGVjdG9yOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3Rvcih0KX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCl9fSxDNC5wcm90b3R5cGU9e2FkZDpmdW5jdGlvbih0KXt0aGlzLl9uYW1lcy5pbmRleE9mKHQpPDAmJih0aGlzLl9uYW1lcy5wdXNoKHQpLHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5fbmFtZXMuam9pbigiICIpKSl9LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9uYW1lcy5pbmRleE9mKHQpO2U+PTAmJih0aGlzLl9uYW1lcy5zcGxpY2UoZSwxKSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxjb250YWluczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZih0KT49MH19O3ZhciBGND17fSxMND1udWxsO2Z1bmN0aW9uIEI0KHQsZSxuKXtyZXR1cm4gdD1WNCh0LGUsbiksZnVuY3Rpb24oZSl7dmFyIG49ZS5yZWxhdGVkVGFyZ2V0O24mJihuPT09dGhpc3x8OCZuLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpKXx8dC5jYWxsKHRoaXMsZSl9fWZ1bmN0aW9uIFY0KHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24obyl7dmFyIGk9TDQ7TDQ9bzt0cnl7dC5jYWxsKHRoaXMsdGhpcy5fX2RhdGFfXyxlLG4pfWZpbmFsbHl7TDQ9aX19fWZ1bmN0aW9uIGo0KHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlPSIiLG49dC5pbmRleE9mKCIuIik7cmV0dXJuIG4+PTAmJihlPXQuc2xpY2UobisxKSx0PXQuc2xpY2UoMCxuKSkse3R5cGU6dCxuYW1lOmV9fSkpfWZ1bmN0aW9uIFU0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuX19vbjtpZihlKXtmb3IodmFyIG4sbz0wLGk9LTEsYT1lLmxlbmd0aDtvPGE7KytvKW49ZVtvXSx0LnR5cGUmJm4udHlwZSE9PXQudHlwZXx8bi5uYW1lIT09dC5uYW1lP2VbKytpXT1uOnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLnR5cGUsbi5saXN0ZW5lcixuLmNhcHR1cmUpOysraT9lLmxlbmd0aD1pOmRlbGV0ZSB0aGlzLl9fb259fX1mdW5jdGlvbiBHNCh0LGUsbil7dmFyIG89RjQuaGFzT3duUHJvcGVydHkodC50eXBlKT9CNDpWNDtyZXR1cm4gZnVuY3Rpb24oaSxhLHIpe3ZhciBzLGw9dGhpcy5fX29uLGM9byhlLGEscik7aWYobClmb3IodmFyIGQ9MCxwPWwubGVuZ3RoO2Q8cDsrK2QpaWYoKHM9bFtkXSkudHlwZT09PXQudHlwZSYmcy5uYW1lPT09dC5uYW1lKXJldHVybiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIocy50eXBlLHMubGlzdGVuZXIscy5jYXB0dXJlKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIocy50eXBlLHMubGlzdGVuZXI9YyxzLmNhcHR1cmU9biksdm9pZChzLnZhbHVlPWUpO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LnR5cGUsYyxuKSxzPXt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSx2YWx1ZTplLGxpc3RlbmVyOmMsY2FwdHVyZTpufSxsP2wucHVzaChzKTp0aGlzLl9fb249W3NdfX1mdW5jdGlvbiBXNCh0LGUsbil7dmFyIG89ZDQodCksaT1vLkN1c3RvbUV2ZW50OyJmdW5jdGlvbiI9PXR5cGVvZiBpP2k9bmV3IGkoZSxuKTooaT1vLmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLG4/KGkuaW5pdEV2ZW50KGUsbi5idWJibGVzLG4uY2FuY2VsYWJsZSksaS5kZXRhaWw9bi5kZXRhaWwpOmkuaW5pdEV2ZW50KGUsITEsITEpKSx0LmRpc3BhdGNoRXZlbnQoaSl9ZnVuY3Rpb24gWTQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gVzQodGhpcyx0LGUpfX1mdW5jdGlvbiBxNCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBXNCh0aGlzLHQsZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX0idW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiYoIm9ubW91c2VlbnRlciJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fChGND17bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9KSk7dmFyIFo0PVtudWxsXTtmdW5jdGlvbiBYNCh0LGUpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9ZX1mdW5jdGlvbiBLNCgpe3JldHVybiBuZXcgWDQoW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSxaNCl9ZnVuY3Rpb24gSjQodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P25ldyBYNChbW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCldXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IFg0KFtbdF1dLFo0KX1mdW5jdGlvbiBRNCgpe2Zvcih2YXIgdCxlPUw0O3Q9ZS5zb3VyY2VFdmVudDspZT10O3JldHVybiBlfWZ1bmN0aW9uICQ0KHQsZSl7dmFyIG49dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYobi5jcmVhdGVTVkdQb2ludCl7dmFyIG89bi5jcmVhdGVTVkdQb2ludCgpO3JldHVybiBvLng9ZS5jbGllbnRYLG8ueT1lLmNsaWVudFksWyhvPW8ubWF0cml4VHJhbnNmb3JtKHQuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSkueCxvLnldfXZhciBpPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW2UuY2xpZW50WC1pLmxlZnQtdC5jbGllbnRMZWZ0LGUuY2xpZW50WS1pLnRvcC10LmNsaWVudFRvcF19ZnVuY3Rpb24gdDYodCl7dmFyIGU9UTQoKTtyZXR1cm4gZS5jaGFuZ2VkVG91Y2hlcyYmKGU9ZS5jaGFuZ2VkVG91Y2hlc1swXSksJDQodCxlKX1mdW5jdGlvbiBlNigpe0w0LnByZXZlbnREZWZhdWx0KCksTDQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gbjYodCl7dmFyIGU9dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbj1KNCh0KS5vbigiZHJhZ3N0YXJ0LmRyYWciLGU2LCEwKTsib25zZWxlY3RzdGFydCJpbiBlP24ub24oInNlbGVjdHN0YXJ0LmRyYWciLGU2LCEwKTooZS5fX25vc2VsZWN0PWUuc3R5bGUuTW96VXNlclNlbGVjdCxlLnN0eWxlLk1velVzZXJTZWxlY3Q9Im5vbmUiKX1mdW5jdGlvbiBvNih0LGUpe3ZhciBuPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LG89SjQodCkub24oImRyYWdzdGFydC5kcmFnIixudWxsKTtlJiYoby5vbigiY2xpY2suZHJhZyIsZTYsITApLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7by5vbigiY2xpY2suZHJhZyIsbnVsbCl9KSwwKSksIm9uc2VsZWN0c3RhcnQiaW4gbj9vLm9uKCJzZWxlY3RzdGFydC5kcmFnIixudWxsKToobi5zdHlsZS5Nb3pVc2VyU2VsZWN0PW4uX19ub3NlbGVjdCxkZWxldGUgbi5fX25vc2VsZWN0KX1mdW5jdGlvbiBpNih0LGUsbil7dC5wcm90b3R5cGU9ZS5wcm90b3R5cGU9bixuLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24gYTYodCxlKXt2YXIgbj1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIG8gaW4gZSluW29dPWVbb107cmV0dXJuIG59ZnVuY3Rpb24gcjYoKXt9WDQucHJvdG90eXBlPUs0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6WDQsc2VsZWN0OmZ1bmN0aW9uIHM2KHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1YNSh0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLG89bmV3IEFycmF5KG4pLGk9MDtpPG47KytpKWZvcih2YXIgYSxyLHM9ZVtpXSxsPXMubGVuZ3RoLGM9b1tpXT1uZXcgQXJyYXkobCksZD0wO2Q8bDsrK2QpKGE9c1tkXSkmJihyPXQuY2FsbChhLGEuX19kYXRhX18sZCxzKSkmJigiX19kYXRhX18iaW4gYSYmKHIuX19kYXRhX189YS5fX2RhdGFfXyksY1tkXT1yKTtyZXR1cm4gbmV3IFg0KG8sdGhpcy5fcGFyZW50cyl9LHNlbGVjdEFsbDpmdW5jdGlvbiBsNih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9SjUodCkpO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj1lLmxlbmd0aCxvPVtdLGk9W10sYT0wO2E8bjsrK2EpZm9yKHZhciByLHM9ZVthXSxsPXMubGVuZ3RoLGM9MDtjPGw7KytjKShyPXNbY10pJiYoby5wdXNoKHQuY2FsbChyLHIuX19kYXRhX18sYyxzKSksaS5wdXNoKHIpKTtyZXR1cm4gbmV3IFg0KG8saSl9LGZpbHRlcjpmdW5jdGlvbiBjNih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9UTUodCkpO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj1lLmxlbmd0aCxvPW5ldyBBcnJheShuKSxpPTA7aTxuOysraSlmb3IodmFyIGEscj1lW2ldLHM9ci5sZW5ndGgsbD1vW2ldPVtdLGM9MDtjPHM7KytjKShhPXJbY10pJiZ0LmNhbGwoYSxhLl9fZGF0YV9fLGMscikmJmwucHVzaChhKTtyZXR1cm4gbmV3IFg0KG8sdGhpcy5fcGFyZW50cyl9LGRhdGE6ZnVuY3Rpb24gZDYodCxlKXtpZighdClyZXR1cm4gZj1uZXcgQXJyYXkodGhpcy5zaXplKCkpLGQ9LTEsdGhpcy5lYWNoKChmdW5jdGlvbih0KXtmWysrZF09dH0pKSxmO3ZhciBuPWU/bjQ6ZTQsbz10aGlzLl9wYXJlbnRzLGk9dGhpcy5fZ3JvdXBzOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD0oZnVuY3Rpb24gYSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KSh0KSk7Zm9yKHZhciByPWkubGVuZ3RoLHM9bmV3IEFycmF5KHIpLGw9bmV3IEFycmF5KHIpLGM9bmV3IEFycmF5KHIpLGQ9MDtkPHI7KytkKXt2YXIgcD1vW2RdLG09aVtkXSx1PW0ubGVuZ3RoLGY9dC5jYWxsKHAscCYmcC5fX2RhdGFfXyxkLG8pLGc9Zi5sZW5ndGgsaD1sW2RdPW5ldyBBcnJheShnKSxiPXNbZF09bmV3IEFycmF5KGcpO24ocCxtLGgsYixjW2RdPW5ldyBBcnJheSh1KSxmLGUpO2Zvcih2YXIgeSxfLEM9MCxNPTA7QzxnOysrQylpZih5PWhbQ10pe2ZvcihDPj1NJiYoTT1DKzEpOyEoXz1iW01dKSYmKytNPGc7KTt5Ll9uZXh0PV98fG51bGx9fXJldHVybihzPW5ldyBYNChzLG8pKS5fZW50ZXI9bCxzLl9leGl0PWMsc30sZW50ZXI6ZnVuY3Rpb24gcDYoKXtyZXR1cm4gbmV3IFg0KHRoaXMuX2VudGVyfHx0aGlzLl9ncm91cHMubWFwKCQ1KSx0aGlzLl9wYXJlbnRzKX0sZXhpdDpmdW5jdGlvbiBtNigpe3JldHVybiBuZXcgWDQodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcCgkNSksdGhpcy5fcGFyZW50cyl9LGpvaW46ZnVuY3Rpb24gdTYodCxlLG4pe3ZhciBvPXRoaXMuZW50ZXIoKSxpPXRoaXMsYT10aGlzLmV4aXQoKTtyZXR1cm4gbz0iZnVuY3Rpb24iPT10eXBlb2YgdD90KG8pOm8uYXBwZW5kKHQrIiIpLG51bGwhPWUmJihpPWUoaSkpLG51bGw9PW4/YS5yZW1vdmUoKTpuKGEpLG8mJmk/by5tZXJnZShpKS5vcmRlcigpOml9LG1lcmdlOmZ1bmN0aW9uIGY2KHQpe2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj10Ll9ncm91cHMsbz1lLmxlbmd0aCxpPU1hdGgubWluKG8sbi5sZW5ndGgpLGE9bmV3IEFycmF5KG8pLHI9MDtyPGk7KytyKWZvcih2YXIgcyxsPWVbcl0sYz1uW3JdLGQ9bC5sZW5ndGgscD1hW3JdPW5ldyBBcnJheShkKSxtPTA7bTxkOysrbSkocz1sW21dfHxjW21dKSYmKHBbbV09cyk7Zm9yKDtyPG87KytyKWFbcl09ZVtyXTtyZXR1cm4gbmV3IFg0KGEsdGhpcy5fcGFyZW50cyl9LG9yZGVyOmZ1bmN0aW9uIGc2KCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxlPS0xLG49dC5sZW5ndGg7KytlPG47KWZvcih2YXIgbyxpPXRbZV0sYT1pLmxlbmd0aC0xLHI9aVthXTstLWE+PTA7KShvPWlbYV0pJiYociYmNF5vLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpJiZyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG8scikscj1vKTtyZXR1cm4gdGhpc30sc29ydDpmdW5jdGlvbiBoNih0KXtmdW5jdGlvbiBlKGUsbil7cmV0dXJuIGUmJm4/dChlLl9fZGF0YV9fLG4uX19kYXRhX18pOiFlLSFufXR8fCh0PW80KTtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLG89bi5sZW5ndGgsaT1uZXcgQXJyYXkobyksYT0wO2E8bzsrK2Epe2Zvcih2YXIgcixzPW5bYV0sbD1zLmxlbmd0aCxjPWlbYV09bmV3IEFycmF5KGwpLGQ9MDtkPGw7KytkKShyPXNbZF0pJiYoY1tkXT1yKTtjLnNvcnQoZSl9cmV0dXJuIG5ldyBYNChpLHRoaXMuX3BhcmVudHMpLm9yZGVyKCl9LGNhbGw6ZnVuY3Rpb24gYjYoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGFyZ3VtZW50c1swXT10aGlzLHQuYXBwbHkobnVsbCxhcmd1bWVudHMpLHRoaXN9LG5vZGVzOmZ1bmN0aW9uIHk2KCl7dmFyIHQ9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSxlPS0xO3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7dFsrK2VdPXRoaXN9KSksdH0sbm9kZTpmdW5jdGlvbiBfNigpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsZT0wLG49dC5sZW5ndGg7ZTxuOysrZSlmb3IodmFyIG89dFtlXSxpPTAsYT1vLmxlbmd0aDtpPGE7KytpKXt2YXIgcj1vW2ldO2lmKHIpcmV0dXJuIHJ9cmV0dXJuIG51bGx9LHNpemU6ZnVuY3Rpb24gQzYoKXt2YXIgdD0wO3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7Kyt0fSkpLHR9LGVtcHR5OmZ1bmN0aW9uIE02KCl7cmV0dXJuIXRoaXMubm9kZSgpfSxlYWNoOmZ1bmN0aW9uIHY2KHQpe2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj0wLG89ZS5sZW5ndGg7bjxvOysrbilmb3IodmFyIGksYT1lW25dLHI9MCxzPWEubGVuZ3RoO3I8czsrK3IpKGk9YVtyXSkmJnQuY2FsbChpLGkuX19kYXRhX18scixhKTtyZXR1cm4gdGhpc30sYXR0cjpmdW5jdGlvbiB4Nih0LGUpe3ZhciBuPUc1KHQpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7dmFyIG89dGhpcy5ub2RlKCk7cmV0dXJuIG4ubG9jYWw/by5nZXRBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOm8uZ2V0QXR0cmlidXRlKG4pfXJldHVybiB0aGlzLmVhY2goKG51bGw9PWU/bi5sb2NhbD9hNDppNDoiZnVuY3Rpb24iPT10eXBlb2YgZT9uLmxvY2FsP2M0Omw0Om4ubG9jYWw/czQ6cjQpKG4sZSkpfSxzdHlsZTpmdW5jdGlvbiBPNih0LGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PWU/cDQ6ImZ1bmN0aW9uIj09dHlwZW9mIGU/dTQ6bTQpKHQsZSxudWxsPT1uPyIiOm4pKTpmNCh0aGlzLm5vZGUoKSx0KX0scHJvcGVydHk6ZnVuY3Rpb24gUDYodCxlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09ZT9nNDoiZnVuY3Rpb24iPT10eXBlb2YgZT9iNDpoNCkodCxlKSk6dGhpcy5ub2RlKClbdF19LGNsYXNzZWQ6ZnVuY3Rpb24gdzYodCxlKXt2YXIgbj15NCh0KyIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgbz1fNCh0aGlzLm5vZGUoKSksaT0tMSxhPW4ubGVuZ3RoOysraTxhOylpZighby5jb250YWlucyhuW2ldKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgZT9QNDplP3g0Ok80KShuLGUpKX0sdGV4dDpmdW5jdGlvbiBrNih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD93NDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/UzQ6azQpKHQpKTp0aGlzLm5vZGUoKS50ZXh0Q29udGVudH0saHRtbDpmdW5jdGlvbiBTNih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9ENDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/UjQ6RTQpKHQpKTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LHJhaXNlOmZ1bmN0aW9uIEQ2KCl7cmV0dXJuIHRoaXMuZWFjaChBNCl9LGxvd2VyOmZ1bmN0aW9uIEU2KCl7cmV0dXJuIHRoaXMuZWFjaChUNCl9LGFwcGVuZDpmdW5jdGlvbiBSNih0KXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnE1KHQpO3JldHVybiB0aGlzLnNlbGVjdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KSl9LGluc2VydDpmdW5jdGlvbiBBNih0LGUpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6cTUodCksbz1udWxsPT1lP040OiJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6WDUoZSk7cmV0dXJuIHRoaXMuc2VsZWN0KChmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxvLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8bnVsbCl9KSl9LHJlbW92ZTpmdW5jdGlvbiBUNigpe3JldHVybiB0aGlzLmVhY2goejQpfSxjbG9uZTpmdW5jdGlvbiBONih0KXtyZXR1cm4gdGhpcy5zZWxlY3QodD9INDpJNCl9LGRhdHVtOmZ1bmN0aW9uIHo2KHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIix0KTp0aGlzLm5vZGUoKS5fX2RhdGFfX30sb246ZnVuY3Rpb24gSTYodCxlLG4pe3ZhciBvLGksYT1qNCh0KyIiKSxyPWEubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7Zm9yKHM9ZT9HNDpVNCxudWxsPT1uJiYobj0hMSksbz0wO288cjsrK28pdGhpcy5lYWNoKHMoYVtvXSxlLG4pKTtyZXR1cm4gdGhpc312YXIgcz10aGlzLm5vZGUoKS5fX29uO2lmKHMpZm9yKHZhciBsLGM9MCxkPXMubGVuZ3RoO2M8ZDsrK2MpZm9yKG89MCxsPXNbY107bzxyOysrbylpZigoaT1hW29dKS50eXBlPT09bC50eXBlJiZpLm5hbWU9PT1sLm5hbWUpcmV0dXJuIGwudmFsdWV9LGRpc3BhdGNoOmZ1bmN0aW9uIEg2KHQsZSl7cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIGU/cTQ6WTQpKHQsZSkpfX07dmFyIEY2PS43LEw2PTEvRjYsQjY9IlxccyooWystXT9cXGQrKVxccyoiLFY2PSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLGo2PSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixVNj0vXiMoWzAtOWEtZl17Myw4fSkkLyxHNj1uZXcgUmVnRXhwKCJecmdiXFwoIitbQjYsQjYsQjZdKyJcXCkkIiksVzY9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW2o2LGo2LGo2XSsiXFwpJCIpLFk2PW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbQjYsQjYsQjYsVjZdKyJcXCkkIikscTY9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tqNixqNixqNixWNl0rIlxcKSQiKSxaNj1uZXcgUmVnRXhwKCJeaHNsXFwoIitbVjYsajYsajZdKyJcXCkkIiksWDY9bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1tWNixqNixqNixWNl0rIlxcKSQiKSxLNj17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtmdW5jdGlvbiBKNigpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpfWZ1bmN0aW9uIFE2KCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCl9ZnVuY3Rpb24gJDYodCl7dmFyIGUsbjtyZXR1cm4gdD0odCsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKGU9VTYuZXhlYyh0KSk/KG49ZVsxXS5sZW5ndGgsZT1wYXJzZUludChlWzFdLDE2KSw2PT09bj90NyhlKTozPT09bj9uZXcgaTcoZT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgxNSZlKTw8NHwxNSZlLDEpOjg9PT1uP2U3KGU+PjI0JjI1NSxlPj4xNiYyNTUsZT4+OCYyNTUsKDI1NSZlKS8yNTUpOjQ9PT1uP2U3KGU+PjEyJjE1fGU+PjgmMjQwLGU+PjgmMTV8ZT4+NCYyNDAsZT4+NCYxNXwyNDAmZSwoKDE1JmUpPDw0fDE1JmUpLzI1NSk6bnVsbCk6KGU9RzYuZXhlYyh0KSk/bmV3IGk3KGVbMV0sZVsyXSxlWzNdLDEpOihlPVc2LmV4ZWModCkpP25ldyBpNygyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCwxKTooZT1ZNi5leGVjKHQpKT9lNyhlWzFdLGVbMl0sZVszXSxlWzRdKTooZT1xNi5leGVjKHQpKT9lNygyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCxlWzRdKTooZT1aNi5leGVjKHQpKT9sNyhlWzFdLGVbMl0vMTAwLGVbM10vMTAwLDEpOihlPVg2LmV4ZWModCkpP2w3KGVbMV0sZVsyXS8xMDAsZVszXS8xMDAsZVs0XSk6SzYuaGFzT3duUHJvcGVydHkodCk/dDcoSzZbdF0pOiJ0cmFuc3BhcmVudCI9PT10P25ldyBpNyhOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIHQ3KHQpe3JldHVybiBuZXcgaTcodD4+MTYmMjU1LHQ+PjgmMjU1LDI1NSZ0LDEpfWZ1bmN0aW9uIGU3KHQsZSxuLG8pe3JldHVybiBvPD0wJiYodD1lPW49TmFOKSxuZXcgaTcodCxlLG4sbyl9ZnVuY3Rpb24gbjcodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiByNnx8KHQ9JDYodCkpLHQ/bmV3IGk3KCh0PXQucmdiKCkpLnIsdC5nLHQuYix0Lm9wYWNpdHkpOm5ldyBpN31mdW5jdGlvbiBvNyh0LGUsbixvKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/bjcodCk6bmV3IGk3KHQsZSxuLG51bGw9PW8/MTpvKX1mdW5jdGlvbiBpNyh0LGUsbixvKXt0aGlzLnI9K3QsdGhpcy5nPStlLHRoaXMuYj0rbix0aGlzLm9wYWNpdHk9K299ZnVuY3Rpb24gYTcoKXtyZXR1cm4iIyIrczcodGhpcy5yKStzNyh0aGlzLmcpK3M3KHRoaXMuYil9ZnVuY3Rpb24gcjcoKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX1mdW5jdGlvbiBzNyh0KXtyZXR1cm4oKHQ9TWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0KXx8MCkpKTwxNj8iMCI6IiIpK3QudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIGw3KHQsZSxuLG8pe3JldHVybiBvPD0wP3Q9ZT1uPU5hTjpuPD0wfHxuPj0xP3Q9ZT1OYU46ZTw9MCYmKHQ9TmFOKSxuZXcgcDcodCxlLG4sbyl9ZnVuY3Rpb24gYzcodCl7aWYodCBpbnN0YW5jZW9mIHA3KXJldHVybiBuZXcgcDcodC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YgcjZ8fCh0PSQ2KHQpKSwhdClyZXR1cm4gbmV3IHA3O2lmKHQgaW5zdGFuY2VvZiBwNylyZXR1cm4gdDt2YXIgZT0odD10LnJnYigpKS5yLzI1NSxuPXQuZy8yNTUsbz10LmIvMjU1LGk9TWF0aC5taW4oZSxuLG8pLGE9TWF0aC5tYXgoZSxuLG8pLHI9TmFOLHM9YS1pLGw9KGEraSkvMjtyZXR1cm4gcz8ocj1lPT09YT8obi1vKS9zKzYqKG48byk6bj09PWE/KG8tZSkvcysyOihlLW4pL3MrNCxzLz1sPC41P2EraToyLWEtaSxyKj02MCk6cz1sPjAmJmw8MT8wOnIsbmV3IHA3KHIscyxsLHQub3BhY2l0eSl9ZnVuY3Rpb24gZDcodCxlLG4sbyl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2M3KHQpOm5ldyBwNyh0LGUsbixudWxsPT1vPzE6byl9ZnVuY3Rpb24gcDcodCxlLG4sbyl7dGhpcy5oPSt0LHRoaXMucz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStvfWZ1bmN0aW9uIG03KHQsZSxuKXtyZXR1cm4gMjU1Kih0PDYwP2UrKG4tZSkqdC82MDp0PDE4MD9uOnQ8MjQwP2UrKG4tZSkqKDI0MC10KS82MDplKX1pNihyNiwkNix7Y29weTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3Rvcix0aGlzLHQpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCl9LGhleDpKNixmb3JtYXRIZXg6SjYsZm9ybWF0SHNsOmZ1bmN0aW9uIHU3KCl7cmV0dXJuIGM3KHRoaXMpLmZvcm1hdEhzbCgpfSxmb3JtYXRSZ2I6UTYsdG9TdHJpbmc6UTZ9KSxpNihpNyxvNyxhNihyNix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9MNjpNYXRoLnBvdyhMNix0KSxuZXcgaTcodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/RjY6TWF0aC5wb3coRjYsdCksbmV3IGk3KHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybi0uNTw9dGhpcy5yJiZ0aGlzLnI8MjU1LjUmJi0uNTw9dGhpcy5nJiZ0aGlzLmc8MjU1LjUmJi0uNTw9dGhpcy5iJiZ0aGlzLmI8MjU1LjUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxoZXg6YTcsZm9ybWF0SGV4OmE3LGZvcm1hdFJnYjpyNyx0b1N0cmluZzpyN30pKSxpNihwNyxkNyxhNihyNix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9MNjpNYXRoLnBvdyhMNix0KSxuZXcgcDcodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9GNjpNYXRoLnBvdyhGNix0KSxuZXcgcDcodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmglMzYwKzM2MCoodGhpcy5oPDApLGU9aXNOYU4odCl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsbj10aGlzLmwsbz1uKyhuPC41P246MS1uKSplLGk9MipuLW87cmV0dXJuIG5ldyBpNyhtNyh0Pj0yNDA/dC0yNDA6dCsxMjAsaSxvKSxtNyh0LGksbyksbTcodDwxMjA/dCsyNDA6dC0xMjAsaSxvKSx0aGlzLm9wYWNpdHkpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybigwPD10aGlzLnMmJnRoaXMuczw9MXx8aXNOYU4odGhpcy5zKSkmJjA8PXRoaXMubCYmdGhpcy5sPD0xJiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sZm9ybWF0SHNsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcGFjaXR5O3JldHVybigxPT09KHQ9aXNOYU4odCk/MTpNYXRoLm1heCgwLE1hdGgubWluKDEsdCkpKT8iaHNsKCI6ImhzbGEoIikrKHRoaXMuaHx8MCkrIiwgIisxMDAqKHRoaXMuc3x8MCkrIiUsICIrMTAwKih0aGlzLmx8fDApKyIlIisoMT09PXQ/IikiOiIsICIrdCsiKSIpfX0pKTt2YXIgZjc9TWF0aC5QSS8xODAsZzc9MTgwL01hdGguUEksaDc9Ljk2NDIyLGI3PS44MjUyMSx5Nz00LzI5LF83PTYvMjksQzc9MypfNypfNztmdW5jdGlvbiBNNyh0KXtpZih0IGluc3RhbmNlb2YgdjcpcmV0dXJuIG5ldyB2Nyh0LmwsdC5hLHQuYix0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiBENylyZXR1cm4gRTcodCk7dCBpbnN0YW5jZW9mIGk3fHwodD1uNyh0KSk7dmFyIGUsbixvPXc3KHQuciksaT13Nyh0LmcpLGE9dzcodC5iKSxyPXg3KCguMjIyNTA0NSpvKy43MTY4Nzg2KmkrLjA2MDYxNjkqYSkvMSk7cmV0dXJuIG89PT1pJiZpPT09YT9lPW49cjooZT14NygoLjQzNjA3NDcqbysuMzg1MDY0OSppKy4xNDMwODA0KmEpL2g3KSxuPXg3KCguMDEzOTMyMipvKy4wOTcxMDQ1KmkrLjcxNDE3MzMqYSkvYjcpKSxuZXcgdjcoMTE2KnItMTYsNTAwKihlLXIpLDIwMCooci1uKSx0Lm9wYWNpdHkpfWZ1bmN0aW9uIHY3KHQsZSxuLG8pe3RoaXMubD0rdCx0aGlzLmE9K2UsdGhpcy5iPStuLHRoaXMub3BhY2l0eT0rb31mdW5jdGlvbiB4Nyh0KXtyZXR1cm4gdD4uMDA4ODU2NDUxNjc5MDM1NjMxP01hdGgucG93KHQsMS8zKTp0L0M3K3k3fWZ1bmN0aW9uIE83KHQpe3JldHVybiB0Pl83P3QqdCp0OkM3Kih0LXk3KX1mdW5jdGlvbiBQNyh0KXtyZXR1cm4gMjU1Kih0PD0uMDAzMTMwOD8xMi45Mip0OjEuMDU1Kk1hdGgucG93KHQsMS8yLjQpLS4wNTUpfWZ1bmN0aW9uIHc3KHQpe3JldHVybih0Lz0yNTUpPD0uMDQwNDU/dC8xMi45MjpNYXRoLnBvdygodCsuMDU1KS8xLjA1NSwyLjQpfWZ1bmN0aW9uIGs3KHQpe2lmKHQgaW5zdGFuY2VvZiBENylyZXR1cm4gbmV3IEQ3KHQuaCx0LmMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIHY3fHwodD1NNyh0KSksMD09PXQuYSYmMD09PXQuYilyZXR1cm4gbmV3IEQ3KE5hTiwwPHQubCYmdC5sPDEwMD8wOk5hTix0LmwsdC5vcGFjaXR5KTt2YXIgZT1NYXRoLmF0YW4yKHQuYix0LmEpKmc3O3JldHVybiBuZXcgRDcoZTwwP2UrMzYwOmUsTWF0aC5zcXJ0KHQuYSp0LmErdC5iKnQuYiksdC5sLHQub3BhY2l0eSl9ZnVuY3Rpb24gUzcodCxlLG4sbyl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2s3KHQpOm5ldyBENyh0LGUsbixudWxsPT1vPzE6byl9ZnVuY3Rpb24gRDcodCxlLG4sbyl7dGhpcy5oPSt0LHRoaXMuYz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStvfWZ1bmN0aW9uIEU3KHQpe2lmKGlzTmFOKHQuaCkpcmV0dXJuIG5ldyB2Nyh0LmwsMCwwLHQub3BhY2l0eSk7dmFyIGU9dC5oKmY3O3JldHVybiBuZXcgdjcodC5sLE1hdGguY29zKGUpKnQuYyxNYXRoLnNpbihlKSp0LmMsdC5vcGFjaXR5KX1mdW5jdGlvbiBSNyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gQTcodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQrbiplfX1mdW5jdGlvbiBUNyh0LGUpe3ZhciBuPWUtdDtyZXR1cm4gbj9BNyh0LG4+MTgwfHxuPC0xODA/bi0zNjAqTWF0aC5yb3VuZChuLzM2MCk6bik6UjcoaXNOYU4odCk/ZTp0KX1mdW5jdGlvbiBONyh0LGUpe3ZhciBuPWUtdDtyZXR1cm4gbj9BNyh0LG4pOlI3KGlzTmFOKHQpP2U6dCl9aTYodjcsKGZ1bmN0aW9uIHo3KHQsZSxuLG8pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9NNyh0KTpuZXcgdjcodCxlLG4sbnVsbD09bz8xOm8pfSksYTYocjYse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgdjcodGhpcy5sKzE4KihudWxsPT10PzE6dCksdGhpcy5hLHRoaXMuYix0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB2Nyh0aGlzLmwtMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PSh0aGlzLmwrMTYpLzExNixlPWlzTmFOKHRoaXMuYSk/dDp0K3RoaXMuYS81MDAsbj1pc05hTih0aGlzLmIpP3Q6dC10aGlzLmIvMjAwO3JldHVybiBuZXcgaTcoUDcoMy4xMzM4NTYxKihlPWg3Kk83KGUpKS0xLjYxNjg2NjcqKHQ9MSpPNyh0KSktLjQ5MDYxNDYqKG49YjcqTzcobikpKSxQNygtLjk3ODc2ODQqZSsxLjkxNjE0MTUqdCsuMDMzNDU0Km4pLFA3KC4wNzE5NDUzKmUtLjIyODk5MTQqdCsxLjQwNTI0MjcqbiksdGhpcy5vcGFjaXR5KX19KSksaTYoRDcsUzcsYTYocjYse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRDcodGhpcy5oLHRoaXMuYyx0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBENyh0aGlzLmgsdGhpcy5jLHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiBFNyh0aGlzKS5yZ2IoKX19KSk7dmFyIEk3PShmdW5jdGlvbiB0KGUpe3ZhciBuPShmdW5jdGlvbiBvKHQpe3JldHVybiAxPT0odD0rdCk/Tjc6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gbi1lPyhmdW5jdGlvbiBvKHQsZSxuKXtyZXR1cm4gdD1NYXRoLnBvdyh0LG4pLGU9TWF0aC5wb3coZSxuKS10LG49MS9uLGZ1bmN0aW9uKG8pe3JldHVybiBNYXRoLnBvdyh0K28qZSxuKX19KShlLG4sdCk6UjcoaXNOYU4oZSk/bjplKX19KShlKTtmdW5jdGlvbiBpKHQsZSl7dmFyIG89bigodD1vNyh0KSkuciwoZT1vNyhlKSkuciksaT1uKHQuZyxlLmcpLGE9bih0LmIsZS5iKSxyPU43KHQub3BhY2l0eSxlLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5yPW8oZSksdC5nPWkoZSksdC5iPWEoZSksdC5vcGFjaXR5PXIoZSksdCsiIn19cmV0dXJuIGkuZ2FtbWE9dCxpfSkoMSksSDc9KGZ1bmN0aW9uIEw3KHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbixvLGk9ZS5sZW5ndGgsYT1uZXcgQXJyYXkoaSkscj1uZXcgQXJyYXkoaSkscz1uZXcgQXJyYXkoaSk7Zm9yKG49MDtuPGk7KytuKW89bzcoZVtuXSksYVtuXT1vLnJ8fDAscltuXT1vLmd8fDAsc1tuXT1vLmJ8fDA7cmV0dXJuIGE9dChhKSxyPXQocikscz10KHMpLG8ub3BhY2l0eT0xLGZ1bmN0aW9uKHQpe3JldHVybiBvLnI9YSh0KSxvLmc9cih0KSxvLmI9cyh0KSxvKyIifX19KSgoZnVuY3Rpb24gRjcodCl7dmFyIGU9dC5sZW5ndGgtMTtyZXR1cm4gZnVuY3Rpb24obil7dmFyIG89bjw9MD9uPTA6bj49MT8obj0xLGUtMSk6TWF0aC5mbG9vcihuKmUpLGk9dFtvXSxhPXRbbysxXTtyZXR1cm4oZnVuY3Rpb24gcih0LGUsbixvLGkpe3ZhciBhPXQqdCxyPWEqdDtyZXR1cm4oKDEtMyp0KzMqYS1yKSplKyg0LTYqYSszKnIpKm4rKDErMyp0KzMqYS0zKnIpKm8rcippKS82fSkoKG4tby9lKSplLG8+MD90W28tMV06MippLWEsaSxhLG88ZS0xP3RbbysyXToyKmEtaSl9fSkpO2Z1bmN0aW9uIEI3KHQsZSl7ZXx8KGU9W10pO3ZhciBuLG89dD9NYXRoLm1pbihlLmxlbmd0aCx0Lmxlbmd0aCk6MCxpPWUuc2xpY2UoKTtyZXR1cm4gZnVuY3Rpb24oYSl7Zm9yKG49MDtuPG87KytuKWlbbl09dFtuXSooMS1hKStlW25dKmE7cmV0dXJuIGl9fWZ1bmN0aW9uIFY3KHQsZSl7dmFyIG4sbz1lP2UubGVuZ3RoOjAsaT10P01hdGgubWluKG8sdC5sZW5ndGgpOjAsYT1uZXcgQXJyYXkoaSkscj1uZXcgQXJyYXkobyk7Zm9yKG49MDtuPGk7KytuKWFbbl09WjcodFtuXSxlW25dKTtmb3IoO248bzsrK24pcltuXT1lW25dO3JldHVybiBmdW5jdGlvbih0KXtmb3Iobj0wO248aTsrK24pcltuXT1hW25dKHQpO3JldHVybiByfX1mdW5jdGlvbiBqNyh0LGUpe3ZhciBuPW5ldyBEYXRlO3JldHVybiB0PSt0LGU9K2UsZnVuY3Rpb24obyl7cmV0dXJuIG4uc2V0VGltZSh0KigxLW8pK2Uqbyksbn19ZnVuY3Rpb24gVTcodCxlKXtyZXR1cm4gdD0rdCxlPStlLGZ1bmN0aW9uKG4pe3JldHVybiB0KigxLW4pK2Uqbn19ZnVuY3Rpb24gRzcodCxlKXt2YXIgbixvPXt9LGk9e307Zm9yKG4gaW4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdHx8KHQ9e30pLG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV8fChlPXt9KSxlKW4gaW4gdD9vW25dPVo3KHRbbl0sZVtuXSk6aVtuXT1lW25dO3JldHVybiBmdW5jdGlvbih0KXtmb3IobiBpbiBvKWlbbl09b1tuXSh0KTtyZXR1cm4gaX19dmFyIFc3PS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxZNz1uZXcgUmVnRXhwKFc3LnNvdXJjZSwiZyIpO2Z1bmN0aW9uIHE3KHQsZSl7dmFyIG4sbyxpLGE9VzcubGFzdEluZGV4PVk3Lmxhc3RJbmRleD0wLHI9LTEscz1bXSxsPVtdO2Zvcih0Kz0iIixlKz0iIjsobj1XNy5leGVjKHQpKSYmKG89WTcuZXhlYyhlKSk7KShpPW8uaW5kZXgpPmEmJihpPWUuc2xpY2UoYSxpKSxzW3JdP3Nbcl0rPWk6c1srK3JdPWkpLChuPW5bMF0pPT09KG89b1swXSk/c1tyXT9zW3JdKz1vOnNbKytyXT1vOihzWysrcl09bnVsbCxsLnB1c2goe2k6cix4OlU3KG4sbyl9KSksYT1ZNy5sYXN0SW5kZXg7cmV0dXJuIGE8ZS5sZW5ndGgmJihpPWUuc2xpY2UoYSksc1tyXT9zW3JdKz1pOnNbKytyXT1pKSxzLmxlbmd0aDwyP2xbMF0/KGZ1bmN0aW9uIGModCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpKyIifX0pKGxbMF0ueCk6KGZ1bmN0aW9uIGQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSkoZSk6KGU9bC5sZW5ndGgsZnVuY3Rpb24odCl7Zm9yKHZhciBuLG89MDtvPGU7KytvKXNbKG49bFtvXSkuaV09bi54KHQpO3JldHVybiBzLmpvaW4oIiIpfSl9ZnVuY3Rpb24gWjcodCxlKXt2YXIgbixvPXR5cGVvZiBlO3JldHVybiBudWxsPT1lfHwiYm9vbGVhbiI9PT1vP1I3KGUpOigibnVtYmVyIj09PW8/VTc6InN0cmluZyI9PT1vPyhuPSQ2KGUpKT8oZT1uLEk3KTpxNzplIGluc3RhbmNlb2YgJDY/STc6ZSBpbnN0YW5jZW9mIERhdGU/ajc6KGZ1bmN0aW9uIGkodCl7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyh0KSYmISh0IGluc3RhbmNlb2YgRGF0YVZpZXcpfSkoZSk/Qjc6QXJyYXkuaXNBcnJheShlKT9WNzoiZnVuY3Rpb24iIT10eXBlb2YgZS52YWx1ZU9mJiYiZnVuY3Rpb24iIT10eXBlb2YgZS50b1N0cmluZ3x8aXNOYU4oZSk/Rzc6VTcpKHQsZSl9ZnVuY3Rpb24gWDcodCxlKXtyZXR1cm4gdD0rdCxlPStlLGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnJvdW5kKHQqKDEtbikrZSpuKX19dmFyIEs3LEo3LFE3LCQ3LHQ4PTE4MC9NYXRoLlBJLGU4PXt0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTowLHJvdGF0ZTowLHNrZXdYOjAsc2NhbGVYOjEsc2NhbGVZOjF9O2Z1bmN0aW9uIG44KHQsZSxuLG8saSxhKXt2YXIgcixzLGw7cmV0dXJuKHI9TWF0aC5zcXJ0KHQqdCtlKmUpKSYmKHQvPXIsZS89ciksKGw9dCpuK2UqbykmJihuLT10Kmwsby09ZSpsKSwocz1NYXRoLnNxcnQobipuK28qbykpJiYobi89cyxvLz1zLGwvPXMpLHQqbzxlKm4mJih0PS10LGU9LWUsbD0tbCxyPS1yKSx7dHJhbnNsYXRlWDppLHRyYW5zbGF0ZVk6YSxyb3RhdGU6TWF0aC5hdGFuMihlLHQpKnQ4LHNrZXdYOk1hdGguYXRhbihsKSp0OCxzY2FsZVg6cixzY2FsZVk6c319ZnVuY3Rpb24gbzgodCxlLG4sbyl7ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdC5sZW5ndGg/dC5wb3AoKSsiICI6IiJ9cmV0dXJuIGZ1bmN0aW9uKGEscil7dmFyIHM9W10sbD1bXTtyZXR1cm4gYT10KGEpLHI9dChyKSwoZnVuY3Rpb24gYyh0LG8saSxhLHIscyl7aWYodCE9PWl8fG8hPT1hKXt2YXIgbD1yLnB1c2goInRyYW5zbGF0ZSgiLG51bGwsZSxudWxsLG4pO3MucHVzaCh7aTpsLTQseDpVNyh0LGkpfSx7aTpsLTIseDpVNyhvLGEpfSl9ZWxzZShpfHxhKSYmci5wdXNoKCJ0cmFuc2xhdGUoIitpK2UrYStuKX0pKGEudHJhbnNsYXRlWCxhLnRyYW5zbGF0ZVksci50cmFuc2xhdGVYLHIudHJhbnNsYXRlWSxzLGwpLChmdW5jdGlvbiBkKHQsZSxuLGEpe3QhPT1lPyh0LWU+MTgwP2UrPTM2MDplLXQ+MTgwJiYodCs9MzYwKSxhLnB1c2goe2k6bi5wdXNoKGkobikrInJvdGF0ZSgiLG51bGwsbyktMix4OlU3KHQsZSl9KSk6ZSYmbi5wdXNoKGkobikrInJvdGF0ZSgiK2Urbyl9KShhLnJvdGF0ZSxyLnJvdGF0ZSxzLGwpLChmdW5jdGlvbiBwKHQsZSxuLGEpe3QhPT1lP2EucHVzaCh7aTpuLnB1c2goaShuKSsic2tld1goIixudWxsLG8pLTIseDpVNyh0LGUpfSk6ZSYmbi5wdXNoKGkobikrInNrZXdYKCIrZStvKX0pKGEuc2tld1gsci5za2V3WCxzLGwpLChmdW5jdGlvbiBtKHQsZSxuLG8sYSxyKXtpZih0IT09bnx8ZSE9PW8pe3ZhciBzPWEucHVzaChpKGEpKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKTtyLnB1c2goe2k6cy00LHg6VTcodCxuKX0se2k6cy0yLHg6VTcoZSxvKX0pfWVsc2UgMT09PW4mJjE9PT1vfHxhLnB1c2goaShhKSsic2NhbGUoIituKyIsIitvKyIpIil9KShhLnNjYWxlWCxhLnNjYWxlWSxyLnNjYWxlWCxyLnNjYWxlWSxzLGwpLGE9cj1udWxsLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPS0xLG89bC5sZW5ndGg7KytuPG87KXNbKGU9bFtuXSkuaV09ZS54KHQpO3JldHVybiBzLmpvaW4oIiIpfX19dmFyIGk4LGE4LHI4PW84KChmdW5jdGlvbiBzOCh0KXtyZXR1cm4ibm9uZSI9PT10P2U4OihLN3x8KEs3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLEo3PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxRNz1kb2N1bWVudC5kZWZhdWx0VmlldyksSzcuc3R5bGUudHJhbnNmb3JtPXQsdD1RNy5nZXRDb21wdXRlZFN0eWxlKEo3LmFwcGVuZENoaWxkKEs3KSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKSxKNy5yZW1vdmVDaGlsZChLNyksbjgoKyh0PXQuc2xpY2UoNywtMSkuc3BsaXQoIiwiKSlbMF0sK3RbMV0sK3RbMl0sK3RbM10sK3RbNF0sK3RbNV0pKX0pLCJweCwgIiwicHgpIiwiZGVnKSIpLGw4PW84KChmdW5jdGlvbiBjOCh0KXtyZXR1cm4gbnVsbD09dD9lODooJDd8fCgkNz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwiZyIpKSwkNy5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsdCksKHQ9JDcudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKSk/bjgoKHQ9dC5tYXRyaXgpLmEsdC5iLHQuYyx0LmQsdC5lLHQuZik6ZTgpfSksIiwgIiwiKSIsIikiKSxkOD0oZnVuY3Rpb24gcDgodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIG89dCgoZT1kNyhlKSkuaCwobj1kNyhuKSkuaCksaT1ONyhlLnMsbi5zKSxhPU43KGUubCxuLmwpLHI9TjcoZS5vcGFjaXR5LG4ub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmg9byh0KSxlLnM9aSh0KSxlLmw9YSh0KSxlLm9wYWNpdHk9cih0KSxlKyIifX19KShUNyksbTg9KGZ1bmN0aW9uIHU4KHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciBvPXQoKGU9UzcoZSkpLmgsKG49UzcobikpLmgpLGk9TjcoZS5jLG4uYyksYT1ONyhlLmwsbi5sKSxyPU43KGUub3BhY2l0eSxuLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5oPW8odCksZS5jPWkodCksZS5sPWEodCksZS5vcGFjaXR5PXIodCksZSsiIn19fSkoVDcpLGY4PTAsZzg9MCxoOD0wLGI4PTAseTg9MCxfOD0wLEM4PSJvYmplY3QiPT10eXBlb2YgcGVyZm9ybWFuY2UmJnBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZTpEYXRlLE04PSJvYmplY3QiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lP3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpOmZ1bmN0aW9uKHQpe3NldFRpbWVvdXQodCwxNyl9O2Z1bmN0aW9uIHY4KCl7cmV0dXJuIHk4fHwoTTgoeDgpLHk4PUM4Lm5vdygpK184KX1mdW5jdGlvbiB4OCgpe3k4PTB9ZnVuY3Rpb24gTzgoKXt0aGlzLl9jYWxsPXRoaXMuX3RpbWU9dGhpcy5fbmV4dD1udWxsfWZ1bmN0aW9uIFA4KHQsZSxuKXt2YXIgbz1uZXcgTzg7cmV0dXJuIG8ucmVzdGFydCh0LGUsbiksb31mdW5jdGlvbiB3OCgpe3k4PShiOD1DOC5ub3coKSkrXzgsZjg9Zzg9MDt0cnl7IShmdW5jdGlvbiB0KCl7djgoKSwrK2Y4O2Zvcih2YXIgdCxlPWk4O2U7KSh0PXk4LWUuX3RpbWUpPj0wJiZlLl9jYWxsLmNhbGwobnVsbCx0KSxlPWUuX25leHQ7LS1mOH0pKCl9ZmluYWxseXtmOD0wLChmdW5jdGlvbiBlKCl7Zm9yKHZhciB0LGUsbj1pOCxvPTEvMDtuOyluLl9jYWxsPyhvPm4uX3RpbWUmJihvPW4uX3RpbWUpLHQ9bixuPW4uX25leHQpOihlPW4uX25leHQsbi5fbmV4dD1udWxsLG49dD90Ll9uZXh0PWU6aTg9ZSk7YTg9dCxTOChvKX0pKCkseTg9MH19ZnVuY3Rpb24gazgoKXt2YXIgdD1DOC5ub3coKSxlPXQtYjg7ZT4xZTMmJihfOC09ZSxiOD10KX1mdW5jdGlvbiBTOCh0KXtmOHx8KGc4JiYoZzg9Y2xlYXJUaW1lb3V0KGc4KSksdC15OD4yND8odDwxLzAmJihnOD1zZXRUaW1lb3V0KHc4LHQtQzgubm93KCktXzgpKSxoOCYmKGg4PWNsZWFySW50ZXJ2YWwoaDgpKSk6KGg4fHwoYjg9Qzgubm93KCksaDg9c2V0SW50ZXJ2YWwoazgsMWUzKSksZjg9MSxNOCh3OCkpKX1mdW5jdGlvbiBEOCh0LGUsbil7dmFyIG89bmV3IE84O3JldHVybiBvLnJlc3RhcnQoKGZ1bmN0aW9uKG4pe28uc3RvcCgpLHQobitlKX0pLGU9bnVsbD09ZT8wOitlLG4pLG99TzgucHJvdG90eXBlPVA4LnByb3RvdHlwZT17Y29uc3RydWN0b3I6TzgscmVzdGFydDpmdW5jdGlvbih0LGUsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24iKTtuPShudWxsPT1uP3Y4KCk6K24pKyhudWxsPT1lPzA6K2UpLHRoaXMuX25leHR8fGE4PT09dGhpc3x8KGE4P2E4Ll9uZXh0PXRoaXM6aTg9dGhpcyxhOD10aGlzKSx0aGlzLl9jYWxsPXQsdGhpcy5fdGltZT1uLFM4KCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9jYWxsJiYodGhpcy5fY2FsbD1udWxsLHRoaXMuX3RpbWU9MS8wLFM4KCkpfX07dmFyIEU4PUg1KCJzdGFydCIsImVuZCIsImNhbmNlbCIsImludGVycnVwdCIpLFI4PVtdO2Z1bmN0aW9uIEE4KHQsZSxuLG8saSxhKXt2YXIgcj10Ll9fdHJhbnNpdGlvbjtpZihyKXtpZihuIGluIHIpcmV0dXJufWVsc2UgdC5fX3RyYW5zaXRpb249e307IShmdW5jdGlvbiBzKHQsZSxuKXt2YXIgbyxpPXQuX190cmFuc2l0aW9uO2Z1bmN0aW9uIGEobCl7dmFyIGMsZCxwLG07aWYoMSE9PW4uc3RhdGUpcmV0dXJuIHMoKTtmb3IoYyBpbiBpKWlmKChtPWlbY10pLm5hbWU9PT1uLm5hbWUpe2lmKDM9PT1tLnN0YXRlKXJldHVybiBEOChhKTs0PT09bS5zdGF0ZT8obS5zdGF0ZT02LG0udGltZXIuc3RvcCgpLG0ub24uY2FsbCgiaW50ZXJydXB0Iix0LHQuX19kYXRhX18sbS5pbmRleCxtLmdyb3VwKSxkZWxldGUgaVtjXSk6K2M8ZSYmKG0uc3RhdGU9NixtLnRpbWVyLnN0b3AoKSxtLm9uLmNhbGwoImNhbmNlbCIsdCx0Ll9fZGF0YV9fLG0uaW5kZXgsbS5ncm91cCksZGVsZXRlIGlbY10pfWlmKEQ4KChmdW5jdGlvbigpezM9PT1uLnN0YXRlJiYobi5zdGF0ZT00LG4udGltZXIucmVzdGFydChyLG4uZGVsYXksbi50aW1lKSxyKGwpKX0pKSxuLnN0YXRlPTIsbi5vbi5jYWxsKCJzdGFydCIsdCx0Ll9fZGF0YV9fLG4uaW5kZXgsbi5ncm91cCksMj09PW4uc3RhdGUpe2ZvcihuLnN0YXRlPTMsbz1uZXcgQXJyYXkocD1uLnR3ZWVuLmxlbmd0aCksYz0wLGQ9LTE7YzxwOysrYykobT1uLnR3ZWVuW2NdLnZhbHVlLmNhbGwodCx0Ll9fZGF0YV9fLG4uaW5kZXgsbi5ncm91cCkpJiYob1srK2RdPW0pO28ubGVuZ3RoPWQrMX19ZnVuY3Rpb24gcihlKXtmb3IodmFyIGk9ZTxuLmR1cmF0aW9uP24uZWFzZS5jYWxsKG51bGwsZS9uLmR1cmF0aW9uKToobi50aW1lci5yZXN0YXJ0KHMpLG4uc3RhdGU9NSwxKSxhPS0xLHI9by5sZW5ndGg7KythPHI7KW9bYV0uY2FsbCh0LGkpOzU9PT1uLnN0YXRlJiYobi5vbi5jYWxsKCJlbmQiLHQsdC5fX2RhdGFfXyxuLmluZGV4LG4uZ3JvdXApLHMoKSl9ZnVuY3Rpb24gcygpe2Zvcih2YXIgbyBpbiBuLnN0YXRlPTYsbi50aW1lci5zdG9wKCksZGVsZXRlIGlbZV0saSlyZXR1cm47ZGVsZXRlIHQuX190cmFuc2l0aW9ufWlbZV09bixuLnRpbWVyPVA4KChmdW5jdGlvbiBsKHQpe24uc3RhdGU9MSxuLnRpbWVyLnJlc3RhcnQoYSxuLmRlbGF5LG4udGltZSksbi5kZWxheTw9dCYmYSh0LW4uZGVsYXkpfSksMCxuLnRpbWUpfSkodCxuLHtuYW1lOmUsaW5kZXg6byxncm91cDppLG9uOkU4LHR3ZWVuOlI4LHRpbWU6YS50aW1lLGRlbGF5OmEuZGVsYXksZHVyYXRpb246YS5kdXJhdGlvbixlYXNlOmEuZWFzZSx0aW1lcjpudWxsLHN0YXRlOjB9KX1mdW5jdGlvbiBUOCh0LGUpe3ZhciBuPXo4KHQsZSk7aWYobi5zdGF0ZT4wKXRocm93IG5ldyBFcnJvcigidG9vIGxhdGU7IGFscmVhZHkgc2NoZWR1bGVkIik7cmV0dXJuIG59ZnVuY3Rpb24gTjgodCxlKXt2YXIgbj16OCh0LGUpO2lmKG4uc3RhdGU+Myl0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHJ1bm5pbmciKTtyZXR1cm4gbn1mdW5jdGlvbiB6OCh0LGUpe3ZhciBuPXQuX190cmFuc2l0aW9uO2lmKCFufHwhKG49bltlXSkpdGhyb3cgbmV3IEVycm9yKCJ0cmFuc2l0aW9uIG5vdCBmb3VuZCIpO3JldHVybiBufWZ1bmN0aW9uIEk4KHQsZSl7dmFyIG4sbyxpLGE9dC5fX3RyYW5zaXRpb24scj0hMDtpZihhKXtmb3IoaSBpbiBlPW51bGw9PWU/bnVsbDplKyIiLGEpKG49YVtpXSkubmFtZT09PWU/KG89bi5zdGF0ZT4yJiZuLnN0YXRlPDUsbi5zdGF0ZT02LG4udGltZXIuc3RvcCgpLG4ub24uY2FsbChvPyJpbnRlcnJ1cHQiOiJjYW5jZWwiLHQsdC5fX2RhdGFfXyxuLmluZGV4LG4uZ3JvdXApLGRlbGV0ZSBhW2ldKTpyPSExO3ImJmRlbGV0ZSB0Ll9fdHJhbnNpdGlvbn19ZnVuY3Rpb24gSDgodCxlKXt2YXIgbixvO3JldHVybiBmdW5jdGlvbigpe3ZhciBpPU44KHRoaXMsdCksYT1pLnR3ZWVuO2lmKGEhPT1uKWZvcih2YXIgcj0wLHM9KG89bj1hKS5sZW5ndGg7cjxzOysrcilpZihvW3JdLm5hbWU9PT1lKXsobz1vLnNsaWNlKCkpLnNwbGljZShyLDEpO2JyZWFrfWkudHdlZW49b319ZnVuY3Rpb24gRjgodCxlLG4pe3ZhciBvLGk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEVycm9yO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPU44KHRoaXMsdCkscj1hLnR3ZWVuO2lmKHIhPT1vKXtpPShvPXIpLnNsaWNlKCk7Zm9yKHZhciBzPXtuYW1lOmUsdmFsdWU6bn0sbD0wLGM9aS5sZW5ndGg7bDxjOysrbClpZihpW2xdLm5hbWU9PT1lKXtpW2xdPXM7YnJlYWt9bD09PWMmJmkucHVzaChzKX1hLnR3ZWVuPWl9fWZ1bmN0aW9uIEw4KHQsZSxuKXt2YXIgbz10Ll9pZDtyZXR1cm4gdC5lYWNoKChmdW5jdGlvbigpe3ZhciB0PU44KHRoaXMsbyk7KHQudmFsdWV8fCh0LnZhbHVlPXt9KSlbZV09bi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSksZnVuY3Rpb24odCl7cmV0dXJuIHo4KHQsbykudmFsdWVbZV19fWZ1bmN0aW9uIEI4KHQsZSl7dmFyIG47cmV0dXJuKCJudW1iZXIiPT10eXBlb2YgZT9VNzplIGluc3RhbmNlb2YgJDY/STc6KG49JDYoZSkpPyhlPW4sSTcpOnE3KSh0LGUpfWZ1bmN0aW9uIFY4KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX1mdW5jdGlvbiBqOCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIFU4KHQsZSxuKXt2YXIgbyxpLGE9bisiIjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj10aGlzLmdldEF0dHJpYnV0ZSh0KTtyZXR1cm4gcj09PWE/bnVsbDpyPT09bz9pOmk9ZShvPXIsbil9fWZ1bmN0aW9uIEc4KHQsZSxuKXt2YXIgbyxpLGE9bisiIjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk7cmV0dXJuIHI9PT1hP251bGw6cj09PW8/aTppPWUobz1yLG4pfX1mdW5jdGlvbiBXOCh0LGUsbil7dmFyIG8saSxhO3JldHVybiBmdW5jdGlvbigpe3ZhciByLHMsbD1uKHRoaXMpO2lmKG51bGwhPWwpcmV0dXJuKHI9dGhpcy5nZXRBdHRyaWJ1dGUodCkpPT09KHM9bCsiIik/bnVsbDpyPT09byYmcz09PWk/YTooaT1zLGE9ZShvPXIsbCkpO3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX1mdW5jdGlvbiBZOCh0LGUsbil7dmFyIG8saSxhO3JldHVybiBmdW5jdGlvbigpe3ZhciByLHMsbD1uKHRoaXMpO2lmKG51bGwhPWwpcmV0dXJuKHI9dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpKT09PShzPWwrIiIpP251bGw6cj09PW8mJnM9PT1pP2E6KGk9cyxhPWUobz1yLGwpKTt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIHE4KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlKHQsZS5jYWxsKHRoaXMsbikpfX1mdW5jdGlvbiBaOCh0LGUpe3JldHVybiBmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxlLmNhbGwodGhpcyxuKSl9fWZ1bmN0aW9uIFg4KHQsZSl7dmFyIG4sbztmdW5jdGlvbiBpKCl7dmFyIGk9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGkhPT1vJiYobj0obz1pKSYmWjgodCxpKSksbn1yZXR1cm4gaS5fdmFsdWU9ZSxpfWZ1bmN0aW9uIEs4KHQsZSl7dmFyIG4sbztmdW5jdGlvbiBpKCl7dmFyIGk9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGkhPT1vJiYobj0obz1pKSYmcTgodCxpKSksbn1yZXR1cm4gaS5fdmFsdWU9ZSxpfWZ1bmN0aW9uIEo4KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7VDgodGhpcyx0KS5kZWxheT0rZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIFE4KHQsZSl7cmV0dXJuIGU9K2UsZnVuY3Rpb24oKXtUOCh0aGlzLHQpLmRlbGF5PWV9fWZ1bmN0aW9uICQ4KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7TjgodGhpcyx0KS5kdXJhdGlvbj0rZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIHQ5KHQsZSl7cmV0dXJuIGU9K2UsZnVuY3Rpb24oKXtOOCh0aGlzLHQpLmR1cmF0aW9uPWV9fWZ1bmN0aW9uIGU5KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO3JldHVybiBmdW5jdGlvbigpe044KHRoaXMsdCkuZWFzZT1lfX1mdW5jdGlvbiBuOSh0LGUsbil7dmFyIG8saSxhPShmdW5jdGlvbiByKHQpe3JldHVybih0KyIiKS50cmltKCkuc3BsaXQoL158XHMrLykuZXZlcnkoKGZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5kZXhPZigiLiIpO3JldHVybiBlPj0wJiYodD10LnNsaWNlKDAsZSkpLCF0fHwic3RhcnQiPT09dH0pKX0pKGUpP1Q4Ok44O3JldHVybiBmdW5jdGlvbigpe3ZhciByPWEodGhpcyx0KSxzPXIub247cyE9PW8mJihpPShvPXMpLmNvcHkoKSkub24oZSxuKSxyLm9uPWl9fXZhciBvOT1LNC5wcm90b3R5cGUuY29uc3RydWN0b3I7ZnVuY3Rpb24gaTkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KX19ZnVuY3Rpb24gYTkodCxlLG4pe3JldHVybiBmdW5jdGlvbihvKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsZS5jYWxsKHRoaXMsbyksbil9fWZ1bmN0aW9uIHI5KHQsZSxuKXt2YXIgbyxpO2Z1bmN0aW9uIGEoKXt2YXIgYT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gYSE9PWkmJihvPShpPWEpJiZhOSh0LGEsbikpLG99cmV0dXJuIGEuX3ZhbHVlPWUsYX1mdW5jdGlvbiBzOSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dGhpcy50ZXh0Q29udGVudD10LmNhbGwodGhpcyxlKX19ZnVuY3Rpb24gbDkodCl7dmFyIGUsbjtmdW5jdGlvbiBvKCl7dmFyIG89dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG8hPT1uJiYoZT0obj1vKSYmczkobykpLGV9cmV0dXJuIG8uX3ZhbHVlPXQsb312YXIgYzk9MDtmdW5jdGlvbiBkOSh0LGUsbixvKXt0aGlzLl9ncm91cHM9dCx0aGlzLl9wYXJlbnRzPWUsdGhpcy5fbmFtZT1uLHRoaXMuX2lkPW99ZnVuY3Rpb24gcDkoKXtyZXR1cm4rK2M5fXZhciBtOT1LNC5wcm90b3R5cGU7ZDkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpkOSxzZWxlY3Q6ZnVuY3Rpb24gdTkodCl7dmFyIGU9dGhpcy5fbmFtZSxuPXRoaXMuX2lkOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1YNSh0KSk7Zm9yKHZhciBvPXRoaXMuX2dyb3VwcyxpPW8ubGVuZ3RoLGE9bmV3IEFycmF5KGkpLHI9MDtyPGk7KytyKWZvcih2YXIgcyxsLGM9b1tyXSxkPWMubGVuZ3RoLHA9YVtyXT1uZXcgQXJyYXkoZCksbT0wO208ZDsrK20pKHM9Y1ttXSkmJihsPXQuY2FsbChzLHMuX19kYXRhX18sbSxjKSkmJigiX19kYXRhX18iaW4gcyYmKGwuX19kYXRhX189cy5fX2RhdGFfXykscFttXT1sLEE4KHBbbV0sZSxuLG0scCx6OChzLG4pKSk7cmV0dXJuIG5ldyBkOShhLHRoaXMuX3BhcmVudHMsZSxuKX0sc2VsZWN0QWxsOmZ1bmN0aW9uIGY5KHQpe3ZhciBlPXRoaXMuX25hbWUsbj10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9SjUodCkpO2Zvcih2YXIgbz10aGlzLl9ncm91cHMsaT1vLmxlbmd0aCxhPVtdLHI9W10scz0wO3M8aTsrK3MpZm9yKHZhciBsLGM9b1tzXSxkPWMubGVuZ3RoLHA9MDtwPGQ7KytwKWlmKGw9Y1twXSl7Zm9yKHZhciBtLHU9dC5jYWxsKGwsbC5fX2RhdGFfXyxwLGMpLGY9ejgobCxuKSxnPTAsaD11Lmxlbmd0aDtnPGg7KytnKShtPXVbZ10pJiZBOChtLGUsbixnLHUsZik7YS5wdXNoKHUpLHIucHVzaChsKX1yZXR1cm4gbmV3IGQ5KGEscixlLG4pfSxmaWx0ZXI6ZnVuY3Rpb24gZzkodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVE1KHQpKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49ZS5sZW5ndGgsbz1uZXcgQXJyYXkobiksaT0wO2k8bjsrK2kpZm9yKHZhciBhLHI9ZVtpXSxzPXIubGVuZ3RoLGw9b1tpXT1bXSxjPTA7YzxzOysrYykoYT1yW2NdKSYmdC5jYWxsKGEsYS5fX2RhdGFfXyxjLHIpJiZsLnB1c2goYSk7cmV0dXJuIG5ldyBkOShvLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LG1lcmdlOmZ1bmN0aW9uIGg5KHQpe2lmKHQuX2lkIT09dGhpcy5faWQpdGhyb3cgbmV3IEVycm9yO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj10Ll9ncm91cHMsbz1lLmxlbmd0aCxpPU1hdGgubWluKG8sbi5sZW5ndGgpLGE9bmV3IEFycmF5KG8pLHI9MDtyPGk7KytyKWZvcih2YXIgcyxsPWVbcl0sYz1uW3JdLGQ9bC5sZW5ndGgscD1hW3JdPW5ldyBBcnJheShkKSxtPTA7bTxkOysrbSkocz1sW21dfHxjW21dKSYmKHBbbV09cyk7Zm9yKDtyPG87KytyKWFbcl09ZVtyXTtyZXR1cm4gbmV3IGQ5KGEsdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sc2VsZWN0aW9uOmZ1bmN0aW9uIGI5KCl7cmV0dXJuIG5ldyBvOSh0aGlzLl9ncm91cHMsdGhpcy5fcGFyZW50cyl9LHRyYW5zaXRpb246ZnVuY3Rpb24geTkoKXtmb3IodmFyIHQ9dGhpcy5fbmFtZSxlPXRoaXMuX2lkLG49cDkoKSxvPXRoaXMuX2dyb3VwcyxpPW8ubGVuZ3RoLGE9MDthPGk7KythKWZvcih2YXIgcixzPW9bYV0sbD1zLmxlbmd0aCxjPTA7YzxsOysrYylpZihyPXNbY10pe3ZhciBkPXo4KHIsZSk7QTgocix0LG4sYyxzLHt0aW1lOmQudGltZStkLmRlbGF5K2QuZHVyYXRpb24sZGVsYXk6MCxkdXJhdGlvbjpkLmR1cmF0aW9uLGVhc2U6ZC5lYXNlfSl9cmV0dXJuIG5ldyBkOShvLHRoaXMuX3BhcmVudHMsdCxuKX0sY2FsbDptOS5jYWxsLG5vZGVzOm05Lm5vZGVzLG5vZGU6bTkubm9kZSxzaXplOm05LnNpemUsZW1wdHk6bTkuZW1wdHksZWFjaDptOS5lYWNoLG9uOmZ1bmN0aW9uIF85KHQsZSl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj96OCh0aGlzLm5vZGUoKSxuKS5vbi5vbih0KTp0aGlzLmVhY2gobjkobix0LGUpKX0sYXR0cjpmdW5jdGlvbiBDOSh0LGUpe3ZhciBuPUc1KHQpLG89InRyYW5zZm9ybSI9PT1uP2w4OkI4O3JldHVybiB0aGlzLmF0dHJUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBlPyhuLmxvY2FsP1k4Olc4KShuLG8sTDgodGhpcywiYXR0ci4iK3QsZSkpOm51bGw9PWU/KG4ubG9jYWw/ajg6VjgpKG4pOihuLmxvY2FsP0c4OlU4KShuLG8sZSkpfSxhdHRyVHdlZW46ZnVuY3Rpb24gTTkodCxlKXt2YXIgbj0iYXR0ci4iK3Q7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXJldHVybihuPXRoaXMudHdlZW4obikpJiZuLl92YWx1ZTtpZihudWxsPT1lKXJldHVybiB0aGlzLnR3ZWVuKG4sbnVsbCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO3ZhciBvPUc1KHQpO3JldHVybiB0aGlzLnR3ZWVuKG4sKG8ubG9jYWw/WDg6SzgpKG8sZSkpfSxzdHlsZTpmdW5jdGlvbiB2OSh0LGUsbil7dmFyIG89InRyYW5zZm9ybSI9PSh0Kz0iIik/cjg6Qjg7cmV0dXJuIG51bGw9PWU/dGhpcy5zdHlsZVR3ZWVuKHQsKGZ1bmN0aW9uIGkodCxlKXt2YXIgbixvLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9ZjQodGhpcyx0KSxyPSh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLGY0KHRoaXMsdCkpO3JldHVybiBhPT09cj9udWxsOmE9PT1uJiZyPT09bz9pOmk9ZShuPWEsbz1yKX19KSh0LG8pKS5vbigiZW5kLnN0eWxlLiIrdCxpOSh0KSk6ImZ1bmN0aW9uIj09dHlwZW9mIGU/dGhpcy5zdHlsZVR3ZWVuKHQsKGZ1bmN0aW9uIHIodCxlLG4pe3ZhciBvLGksYTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1mNCh0aGlzLHQpLHM9bih0aGlzKSxsPXMrIiI7cmV0dXJuIG51bGw9PXMmJih0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLGw9cz1mNCh0aGlzLHQpKSxyPT09bD9udWxsOnI9PT1vJiZsPT09aT9hOihpPWwsYT1lKG89cixzKSl9fSkodCxvLEw4KHRoaXMsInN0eWxlLiIrdCxlKSkpLmVhY2goKGZ1bmN0aW9uIGEodCxlKXt2YXIgbixvLGksYSxyPSJzdHlsZS4iK2Uscz0iZW5kLiIrcjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbD1OOCh0aGlzLHQpLGM9bC5vbixkPW51bGw9PWwudmFsdWVbcl0/YXx8KGE9aTkoZSkpOnZvaWQgMDtjPT09biYmaT09PWR8fChvPShuPWMpLmNvcHkoKSkub24ocyxpPWQpLGwub249b319KSh0aGlzLl9pZCx0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsKGZ1bmN0aW9uIHModCxlLG4pe3ZhciBvLGksYT1uKyIiO3JldHVybiBmdW5jdGlvbigpe3ZhciByPWY0KHRoaXMsdCk7cmV0dXJuIHI9PT1hP251bGw6cj09PW8/aTppPWUobz1yLG4pfX0pKHQsbyxlKSxuKS5vbigiZW5kLnN0eWxlLiIrdCxudWxsKX0sc3R5bGVUd2VlbjpmdW5jdGlvbiB4OSh0LGUsbil7dmFyIG89InN0eWxlLiIrKHQrPSIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKG89dGhpcy50d2VlbihvKSkmJm8uX3ZhbHVlO2lmKG51bGw9PWUpcmV0dXJuIHRoaXMudHdlZW4obyxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4obyxyOSh0LGUsbnVsbD09bj8iIjpuKSl9LHRleHQ6ZnVuY3Rpb24gTzkodCl7cmV0dXJuIHRoaXMudHdlZW4oInRleHQiLCJmdW5jdGlvbiI9PXR5cGVvZiB0PyhmdW5jdGlvbiBlKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQodGhpcyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT1lPyIiOmV9fSkoTDgodGhpcywidGV4dCIsdCkpOihmdW5jdGlvbiBuKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KShudWxsPT10PyIiOnQrIiIpKX0sdGV4dFR3ZWVuOmZ1bmN0aW9uIFA5KHQpe3ZhciBlPSJ0ZXh0IjtpZihhcmd1bWVudHMubGVuZ3RoPDEpcmV0dXJuKGU9dGhpcy50d2VlbihlKSkmJmUuX3ZhbHVlO2lmKG51bGw9PXQpcmV0dXJuIHRoaXMudHdlZW4oZSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4oZSxsOSh0KSl9LHJlbW92ZTpmdW5jdGlvbiB3OSgpe3JldHVybiB0aGlzLm9uKCJlbmQucmVtb3ZlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7Zm9yKHZhciBuIGluIHRoaXMuX190cmFuc2l0aW9uKWlmKCtuIT09ZSlyZXR1cm47dCYmdC5yZW1vdmVDaGlsZCh0aGlzKX19KSh0aGlzLl9pZCkpfSx0d2VlbjpmdW5jdGlvbiBrOSh0LGUpe3ZhciBuPXRoaXMuX2lkO2lmKHQrPSIiLGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciBvLGk9ejgodGhpcy5ub2RlKCksbikudHdlZW4sYT0wLHI9aS5sZW5ndGg7YTxyOysrYSlpZigobz1pW2FdKS5uYW1lPT09dClyZXR1cm4gby52YWx1ZTtyZXR1cm4gbnVsbH1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1lP0g4OkY4KShuLHQsZSkpfSxkZWxheTpmdW5jdGlvbiBTOSh0KXt2YXIgZT10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiB0P0o4OlE4KShlLHQpKTp6OCh0aGlzLm5vZGUoKSxlKS5kZWxheX0sZHVyYXRpb246ZnVuY3Rpb24gRDkodCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD8kODp0OSkoZSx0KSk6ejgodGhpcy5ub2RlKCksZSkuZHVyYXRpb259LGVhc2U6ZnVuY3Rpb24gRTkodCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKGU5KGUsdCkpOno4KHRoaXMubm9kZSgpLGUpLmVhc2V9LGVuZDpmdW5jdGlvbiBSOSgpe3ZhciB0LGUsbj10aGlzLG89bi5faWQsaT1uLnNpemUoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGEscil7dmFyIHM9e3ZhbHVlOnJ9LGw9e3ZhbHVlOmZ1bmN0aW9uKCl7MD09LS1pJiZhKCl9fTtuLmVhY2goKGZ1bmN0aW9uKCl7dmFyIG49TjgodGhpcyxvKSxpPW4ub247aSE9PXQmJigoZT0odD1pKS5jb3B5KCkpLl8uY2FuY2VsLnB1c2gocyksZS5fLmludGVycnVwdC5wdXNoKHMpLGUuXy5lbmQucHVzaChsKSksbi5vbj1lfSkpfSkpfX07dmFyIEE5PXt0aW1lOm51bGwsZGVsYXk6MCxkdXJhdGlvbjoyNTAsZWFzZTpmdW5jdGlvbiBUOSh0KXtyZXR1cm4oKHQqPTIpPD0xP3QqdCp0Oih0LT0yKSp0KnQrMikvMn19O2Z1bmN0aW9uIE45KHQsZSl7Zm9yKHZhciBuOyEobj10Ll9fdHJhbnNpdGlvbil8fCEobj1uW2VdKTspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuIEE5LnRpbWU9djgoKSxBOTtyZXR1cm4gbn1mdW5jdGlvbiB6OSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gSTkodCxlLG4pe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPWUsdGhpcy5zZWxlY3Rpb249bn1mdW5jdGlvbiBIOSgpe0w0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIEY5KCl7TDQucHJldmVudERlZmF1bHQoKSxMNC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1LNC5wcm90b3R5cGUuaW50ZXJydXB0PWZ1bmN0aW9uIEw5KHQpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7STgodGhpcyx0KX0pKX0sSzQucHJvdG90eXBlLnRyYW5zaXRpb249ZnVuY3Rpb24gQjkodCl7dmFyIGUsbjt0IGluc3RhbmNlb2YgZDk/KGU9dC5faWQsdD10Ll9uYW1lKTooZT1wOSgpLChuPUE5KS50aW1lPXY4KCksdD1udWxsPT10P251bGw6dCsiIik7Zm9yKHZhciBvPXRoaXMuX2dyb3VwcyxpPW8ubGVuZ3RoLGE9MDthPGk7KythKWZvcih2YXIgcixzPW9bYV0sbD1zLmxlbmd0aCxjPTA7YzxsOysrYykocj1zW2NdKSYmQTgocix0LGUsYyxzLG58fE45KHIsZSkpO3JldHVybiBuZXcgZDkobyx0aGlzLl9wYXJlbnRzLHQsZSl9O3ZhciBWOT17bmFtZToiZHJhZyJ9LGo5PXtuYW1lOiJzcGFjZSJ9LFU5PXtuYW1lOiJoYW5kbGUifSxHOT17bmFtZToiY2VudGVyIn07ZnVuY3Rpb24gVzkodCl7cmV0dXJuWyt0WzBdLCt0WzFdXX1mdW5jdGlvbiBZOSh0KXtyZXR1cm5bVzkodFswXSksVzkodFsxXSldfWZ1bmN0aW9uIHE5KHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4oZnVuY3Rpb24gbih0LGUsbyl7YXJndW1lbnRzLmxlbmd0aDwzJiYobz1lLGU9UTQoKS5jaGFuZ2VkVG91Y2hlcyk7Zm9yKHZhciBpLGE9MCxyPWU/ZS5sZW5ndGg6MDthPHI7KythKWlmKChpPWVbYV0pLmlkZW50aWZpZXI9PT1vKXJldHVybiAkNCh0LGkpO3JldHVybiBudWxsfSkoZSxMNC50b3VjaGVzLHQpfX12YXIgWjk9e25hbWU6IngiLGhhbmRsZXM6WyJ3IiwiZSJdLm1hcChldHQpLGlucHV0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/bnVsbDpbWyt0WzBdLGVbMF1bMV1dLFsrdFsxXSxlWzFdWzFdXV19LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmW3RbMF1bMF0sdFsxXVswXV19fSxYOT17bmFtZToieSIsaGFuZGxlczpbIm4iLCJzIl0ubWFwKGV0dCksaW5wdXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD9udWxsOltbZVswXVswXSwrdFswXV0sW2VbMV1bMF0sK3RbMV1dXX0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZbdFswXVsxXSx0WzFdWzFdXX19LEs5PXtvdmVybGF5OiJjcm9zc2hhaXIiLHNlbGVjdGlvbjoibW92ZSIsbjoibnMtcmVzaXplIixlOiJldy1yZXNpemUiLHM6Im5zLXJlc2l6ZSIsdzoiZXctcmVzaXplIixudzoibndzZS1yZXNpemUiLG5lOiJuZXN3LXJlc2l6ZSIsc2U6Im53c2UtcmVzaXplIixzdzoibmVzdy1yZXNpemUifSxKOT17ZToidyIsdzoiZSIsbnc6Im5lIixuZToibnciLHNlOiJzdyIsc3c6InNlIn0sUTk9e246InMiLHM6Im4iLG53OiJzdyIsbmU6InNlIixzZToibmUiLHN3OiJudyJ9LCQ5PXtvdmVybGF5OjEsc2VsZWN0aW9uOjEsbjpudWxsLGU6MSxzOm51bGwsdzotMSxudzotMSxuZToxLHNlOjEsc3c6LTF9LHR0dD17b3ZlcmxheToxLHNlbGVjdGlvbjoxLG46LTEsZTpudWxsLHM6MSx3Om51bGwsbnc6LTEsbmU6LTEsc2U6MSxzdzoxfTtmdW5jdGlvbiBldHQodCl7cmV0dXJue3R5cGU6dH19ZnVuY3Rpb24gbnR0KCl7cmV0dXJuIUw0LmN0cmxLZXkmJiFMNC5idXR0b259ZnVuY3Rpb24gb3R0KCl7dmFyIHQ9dGhpcy5vd25lclNWR0VsZW1lbnR8fHRoaXM7cmV0dXJuIHQuaGFzQXR0cmlidXRlKCJ2aWV3Qm94Iik/W1sodD10LnZpZXdCb3guYmFzZVZhbCkueCx0LnldLFt0LngrdC53aWR0aCx0LnkrdC5oZWlnaHRdXTpbWzAsMF0sW3Qud2lkdGguYmFzZVZhbC52YWx1ZSx0LmhlaWdodC5iYXNlVmFsLnZhbHVlXV19ZnVuY3Rpb24gaXR0KCl7cmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50c3x8Im9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIGF0dCh0KXtmb3IoOyF0Ll9fYnJ1c2g7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybjtyZXR1cm4gdC5fX2JydXNofWZ1bmN0aW9uIHJ0dCh0KXtyZXR1cm4gdFswXVswXT09PXRbMV1bMF18fHRbMF1bMV09PT10WzFdWzFdfXZhciBzdHQ9TWF0aC5QSSxsdHQ9MipzdHQsY3R0PTFlLTYsZHR0PWx0dC1jdHQ7ZnVuY3Rpb24gcHR0KCl7dGhpcy5feDA9dGhpcy5feTA9dGhpcy5feDE9dGhpcy5feTE9bnVsbCx0aGlzLl89IiJ9ZnVuY3Rpb24gbXR0KCl7cmV0dXJuIG5ldyBwdHR9cHR0LnByb3RvdHlwZT1tdHQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpwdHQsbW92ZVRvOmZ1bmN0aW9uKHQsZSl7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStlKX0sY2xvc2VQYXRoOmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuX3gxJiYodGhpcy5feDE9dGhpcy5feDAsdGhpcy5feTE9dGhpcy5feTAsdGhpcy5fKz0iWiIpfSxsaW5lVG86ZnVuY3Rpb24odCxlKXt0aGlzLl8rPSJMIisodGhpcy5feDE9K3QpKyIsIisodGhpcy5feTE9K2UpfSxxdWFkcmF0aWNDdXJ2ZVRvOmZ1bmN0aW9uKHQsZSxuLG8pe3RoaXMuXys9IlEiKyArdCsiLCIrICtlKyIsIisodGhpcy5feDE9K24pKyIsIisodGhpcy5feTE9K28pfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsZSxuLG8saSxhKXt0aGlzLl8rPSJDIisgK3QrIiwiKyArZSsiLCIrICtuKyIsIisgK28rIiwiKyh0aGlzLl94MT0raSkrIiwiKyh0aGlzLl95MT0rYSl9LGFyY1RvOmZ1bmN0aW9uKHQsZSxuLG8saSl7dmFyIGE9dGhpcy5feDEscj10aGlzLl95MSxzPShuPStuKS0odD0rdCksbD0obz0rbyktKGU9K2UpLGM9YS10LGQ9ci1lLHA9YypjK2QqZDtpZigoaT0raSk8MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIitpKTtpZihudWxsPT09dGhpcy5feDEpdGhpcy5fKz0iTSIrKHRoaXMuX3gxPXQpKyIsIisodGhpcy5feTE9ZSk7ZWxzZSBpZihwPmN0dClpZihNYXRoLmFicyhkKnMtbCpjKT5jdHQmJmkpe3ZhciBtPW4tYSx1PW8tcixmPXMqcytsKmwsZz1tKm0rdSp1LGg9TWF0aC5zcXJ0KGYpLGI9TWF0aC5zcXJ0KHApLHk9aSpNYXRoLnRhbigoc3R0LU1hdGguYWNvcygoZitwLWcpLygyKmgqYikpKS8yKSxfPXkvYixDPXkvaDtNYXRoLmFicyhfLTEpPmN0dCYmKHRoaXMuXys9IkwiKyh0K18qYykrIiwiKyhlK18qZCkpLHRoaXMuXys9IkEiK2krIiwiK2krIiwwLDAsIisgKyhkKm0+Yyp1KSsiLCIrKHRoaXMuX3gxPXQrQypzKSsiLCIrKHRoaXMuX3kxPWUrQypsKX1lbHNlIHRoaXMuXys9IkwiKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPWUpfSxhcmM6ZnVuY3Rpb24odCxlLG4sbyxpLGEpe3Q9K3QsZT0rZSxhPSEhYTt2YXIgcj0obj0rbikqTWF0aC5jb3Mobykscz1uKk1hdGguc2luKG8pLGw9dCtyLGM9ZStzLGQ9MV5hLHA9YT9vLWk6aS1vO2lmKG48MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIituKTtudWxsPT09dGhpcy5feDE/dGhpcy5fKz0iTSIrbCsiLCIrYzooTWF0aC5hYnModGhpcy5feDEtbCk+Y3R0fHxNYXRoLmFicyh0aGlzLl95MS1jKT5jdHQpJiYodGhpcy5fKz0iTCIrbCsiLCIrYyksbiYmKHA8MCYmKHA9cCVsdHQrbHR0KSxwPmR0dD90aGlzLl8rPSJBIituKyIsIituKyIsMCwxLCIrZCsiLCIrKHQtcikrIiwiKyhlLXMpKyJBIituKyIsIituKyIsMCwxLCIrZCsiLCIrKHRoaXMuX3gxPWwpKyIsIisodGhpcy5feTE9Yyk6cD5jdHQmJih0aGlzLl8rPSJBIituKyIsIituKyIsMCwiKyArKHA+PXN0dCkrIiwiK2QrIiwiKyh0aGlzLl94MT10K24qTWF0aC5jb3MoaSkpKyIsIisodGhpcy5feTE9ZStuKk1hdGguc2luKGkpKSkpfSxyZWN0OmZ1bmN0aW9uKHQsZSxuLG8pe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rZSkrImgiKyArbisidiIrICtvKyJoIistbisiWiJ9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX319O3ZhciB1dHQ9IiQiO2Z1bmN0aW9uIGZ0dCgpe31mdW5jdGlvbiBndHQodCxlKXt2YXIgbj1uZXcgZnR0O2lmKHQgaW5zdGFuY2VvZiBmdHQpdC5lYWNoKChmdW5jdGlvbih0LGUpe24uc2V0KGUsdCl9KSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgbyxpPS0xLGE9dC5sZW5ndGg7aWYobnVsbD09ZSlmb3IoOysraTxhOyluLnNldChpLHRbaV0pO2Vsc2UgZm9yKDsrK2k8YTspbi5zZXQoZShvPXRbaV0saSx0KSxvKX1lbHNlIGlmKHQpZm9yKHZhciByIGluIHQpbi5zZXQocix0W3JdKTtyZXR1cm4gbn1mdW5jdGlvbiBodHQoKXt9ZnR0LnByb3RvdHlwZT1ndHQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpmdHQsaGFzOmZ1bmN0aW9uKHQpe3JldHVybiB1dHQrdCBpbiB0aGlzfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbdXR0K3RdfSxzZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpc1t1dHQrdF09ZSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9dXR0K3Q7cmV0dXJuIGUgaW4gdGhpcyYmZGVsZXRlIHRoaXNbZV19LGNsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpdFswXT09PXV0dCYmZGVsZXRlIHRoaXNbdF19LGtleXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gdGhpcyllWzBdPT09dXR0JiZ0LnB1c2goZS5zbGljZSgxKSk7cmV0dXJuIHR9LHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT11dHQmJnQucHVzaCh0aGlzW2VdKTtyZXR1cm4gdH0sZW50cmllczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT11dHQmJnQucHVzaCh7a2V5OmUuc2xpY2UoMSksdmFsdWU6dGhpc1tlXX0pO3JldHVybiB0fSxzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9MDtmb3IodmFyIGUgaW4gdGhpcyllWzBdPT09dXR0JiYrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpaWYodFswXT09PXV0dClyZXR1cm4hMTtyZXR1cm4hMH0sZWFjaDpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdGhpcyllWzBdPT09dXR0JiZ0KHRoaXNbZV0sZS5zbGljZSgxKSx0aGlzKX19O3ZhciBidHQ9Z3R0LnByb3RvdHlwZTtmdW5jdGlvbiB5dHQodCxlKXtpZigobj0odD1lP3QudG9FeHBvbmVudGlhbChlLTEpOnQudG9FeHBvbmVudGlhbCgpKS5pbmRleE9mKCJlIikpPDApcmV0dXJuIG51bGw7dmFyIG4sbz10LnNsaWNlKDAsbik7cmV0dXJuW28ubGVuZ3RoPjE/b1swXStvLnNsaWNlKDIpOm8sK3Quc2xpY2UobisxKV19ZnVuY3Rpb24gX3R0KHQpe3JldHVybih0PXl0dChNYXRoLmFicyh0KSkpP3RbMV06TmFOfWh0dC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmh0dCxoYXM6YnR0LmhhcyxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbdXR0Kyh0Kz0iIildPXQsdGhpc30scmVtb3ZlOmJ0dC5yZW1vdmUsY2xlYXI6YnR0LmNsZWFyLHZhbHVlczpidHQua2V5cyxzaXplOmJ0dC5zaXplLGVtcHR5OmJ0dC5lbXB0eSxlYWNoOmJ0dC5lYWNofTt2YXIgQ3R0LE10dD0vXig/OiguKT8oWzw+PV5dKSk/KFsrXC0oIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KH4pPyhbYS16JV0pPyQvaTtmdW5jdGlvbiB2dHQodCl7aWYoIShlPU10dC5leGVjKHQpKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9ybWF0OiAiK3QpO3ZhciBlO3JldHVybiBuZXcgeHR0KHtmaWxsOmVbMV0sYWxpZ246ZVsyXSxzaWduOmVbM10sc3ltYm9sOmVbNF0semVybzplWzVdLHdpZHRoOmVbNl0sY29tbWE6ZVs3XSxwcmVjaXNpb246ZVs4XSYmZVs4XS5zbGljZSgxKSx0cmltOmVbOV0sdHlwZTplWzEwXX0pfWZ1bmN0aW9uIHh0dCh0KXt0aGlzLmZpbGw9dm9pZCAwPT09dC5maWxsPyIgIjp0LmZpbGwrIiIsdGhpcy5hbGlnbj12b2lkIDA9PT10LmFsaWduPyI+Ijp0LmFsaWduKyIiLHRoaXMuc2lnbj12b2lkIDA9PT10LnNpZ24/Ii0iOnQuc2lnbisiIix0aGlzLnN5bWJvbD12b2lkIDA9PT10LnN5bWJvbD8iIjp0LnN5bWJvbCsiIix0aGlzLnplcm89ISF0Lnplcm8sdGhpcy53aWR0aD12b2lkIDA9PT10LndpZHRoP3ZvaWQgMDordC53aWR0aCx0aGlzLmNvbW1hPSEhdC5jb21tYSx0aGlzLnByZWNpc2lvbj12b2lkIDA9PT10LnByZWNpc2lvbj92b2lkIDA6K3QucHJlY2lzaW9uLHRoaXMudHJpbT0hIXQudHJpbSx0aGlzLnR5cGU9dm9pZCAwPT09dC50eXBlPyIiOnQudHlwZSsiIn1mdW5jdGlvbiBPdHQodCxlKXt2YXIgbj15dHQodCxlKTtpZighbilyZXR1cm4gdCsiIjt2YXIgbz1uWzBdLGk9blsxXTtyZXR1cm4gaTwwPyIwLiIrbmV3IEFycmF5KC1pKS5qb2luKCIwIikrbzpvLmxlbmd0aD5pKzE/by5zbGljZSgwLGkrMSkrIi4iK28uc2xpY2UoaSsxKTpvK25ldyBBcnJheShpLW8ubGVuZ3RoKzIpLmpvaW4oIjAiKX12dHQucHJvdG90eXBlPXh0dC5wcm90b3R5cGUseHR0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbGwrdGhpcy5hbGlnbit0aGlzLnNpZ24rdGhpcy5zeW1ib2wrKHRoaXMuemVybz8iMCI6IiIpKyh2b2lkIDA9PT10aGlzLndpZHRoPyIiOk1hdGgubWF4KDEsMHx0aGlzLndpZHRoKSkrKHRoaXMuY29tbWE/IiwiOiIiKSsodm9pZCAwPT09dGhpcy5wcmVjaXNpb24/IiI6Ii4iK01hdGgubWF4KDAsMHx0aGlzLnByZWNpc2lvbikpKyh0aGlzLnRyaW0/In4iOiIiKSt0aGlzLnR5cGV9O3ZhciBQdHQ9eyIlIjpmdW5jdGlvbih0LGUpe3JldHVybigxMDAqdCkudG9GaXhlZChlKX0sYjpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZygyKX0sYzpmdW5jdGlvbih0KXtyZXR1cm4gdCsiIn0sZDpmdW5jdGlvbiB3dHQodCl7cmV0dXJuIE1hdGguYWJzKHQ9TWF0aC5yb3VuZCh0KSk+PTFlMjE/dC50b0xvY2FsZVN0cmluZygiZW4iKS5yZXBsYWNlKC8sL2csIiIpOnQudG9TdHJpbmcoMTApfSxlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9FeHBvbmVudGlhbChlKX0sZjpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRvRml4ZWQoZSl9LGc6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50b1ByZWNpc2lvbihlKX0sbzpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZyg4KX0scDpmdW5jdGlvbih0LGUpe3JldHVybiBPdHQoMTAwKnQsZSl9LHI6T3R0LHM6ZnVuY3Rpb24ga3R0KHQsZSl7dmFyIG49eXR0KHQsZSk7aWYoIW4pcmV0dXJuIHQrIiI7dmFyIG89blswXSxpPW5bMV0sYT1pLShDdHQ9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoaS8zKSkpKSsxLHI9by5sZW5ndGg7cmV0dXJuIGE9PT1yP286YT5yP28rbmV3IEFycmF5KGEtcisxKS5qb2luKCIwIik6YT4wP28uc2xpY2UoMCxhKSsiLiIrby5zbGljZShhKToiMC4iK25ldyBBcnJheSgxLWEpLmpvaW4oIjAiKSt5dHQodCxNYXRoLm1heCgwLGUrYS0xKSlbMF19LFg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LHg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpfX07ZnVuY3Rpb24gU3R0KHQpe3JldHVybiB0fXZhciBEdHQsRXR0LFJ0dCxBdHQ9QXJyYXkucHJvdG90eXBlLm1hcCxUdHQ9WyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCLCtSIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdO2Z1bmN0aW9uIE50dCh0LGUpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6YnJlYWs7Y2FzZSAxOnRoaXMucmFuZ2UodCk7YnJlYWs7ZGVmYXVsdDp0aGlzLnJhbmdlKGUpLmRvbWFpbih0KX1yZXR1cm4gdGhpc30hKGZ1bmN0aW9uIHp0dCh0KXtEdHQ9KGZ1bmN0aW9uIGUodCl7dmFyIGU9dm9pZCAwPT09dC5ncm91cGluZ3x8dm9pZCAwPT09dC50aG91c2FuZHM/U3R0OihmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4sbyl7Zm9yKHZhciBpPW4ubGVuZ3RoLGE9W10scj0wLHM9dFswXSxsPTA7aT4wJiZzPjAmJihsK3MrMT5vJiYocz1NYXRoLm1heCgxLG8tbCkpLGEucHVzaChuLnN1YnN0cmluZyhpLT1zLGkrcykpLCEoKGwrPXMrMSk+bykpOylzPXRbcj0ocisxKSV0Lmxlbmd0aF07cmV0dXJuIGEucmV2ZXJzZSgpLmpvaW4oZSl9fSkoQXR0LmNhbGwodC5ncm91cGluZyxOdW1iZXIpLHQudGhvdXNhbmRzKyIiKSxvPXZvaWQgMD09PXQuY3VycmVuY3k/IiI6dC5jdXJyZW5jeVswXSsiIixpPXZvaWQgMD09PXQuY3VycmVuY3k/IiI6dC5jdXJyZW5jeVsxXSsiIixhPXZvaWQgMD09PXQuZGVjaW1hbD8iLiI6dC5kZWNpbWFsKyIiLHI9dm9pZCAwPT09dC5udW1lcmFscz9TdHQ6KGZ1bmN0aW9uIHModCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1swLTldL2csKGZ1bmN0aW9uKGUpe3JldHVybiB0WytlXX0pKX19KShBdHQuY2FsbCh0Lm51bWVyYWxzLFN0cmluZykpLGw9dm9pZCAwPT09dC5wZXJjZW50PyIlIjp0LnBlcmNlbnQrIiIsYz12b2lkIDA9PT10Lm1pbnVzPyItIjp0Lm1pbnVzKyIiLGQ9dm9pZCAwPT09dC5uYW4/Ik5hTiI6dC5uYW4rIiI7ZnVuY3Rpb24gcCh0KXt2YXIgbj0odD12dHQodCkpLmZpbGwscz10LmFsaWduLHA9dC5zaWduLG09dC5zeW1ib2wsdT10Lnplcm8sZj10LndpZHRoLGc9dC5jb21tYSxoPXQucHJlY2lzaW9uLGI9dC50cmltLHk9dC50eXBlOyJuIj09PXk/KGc9ITAseT0iZyIpOlB0dFt5XXx8KHZvaWQgMD09PWgmJihoPTEyKSxiPSEwLHk9ImciKSwodXx8IjAiPT09biYmIj0iPT09cykmJih1PSEwLG49IjAiLHM9Ij0iKTt2YXIgXz0iJCI9PT1tP286IiMiPT09bSYmL1tib3hYXS8udGVzdCh5KT8iMCIreS50b0xvd2VyQ2FzZSgpOiIiLEM9IiQiPT09bT9pOi9bJXBdLy50ZXN0KHkpP2w6IiIsTT1QdHRbeV0sdj0vW2RlZmdwcnMlXS8udGVzdCh5KTtmdW5jdGlvbiB4KHQpe3ZhciBvLGksbCxtPV8seD1DO2lmKCJjIj09PXkpeD1NKHQpK3gsdD0iIjtlbHNle3ZhciBPPSh0PSt0KTwwfHwxL3Q8MDtpZih0PWlzTmFOKHQpP2Q6TShNYXRoLmFicyh0KSxoKSxiJiYodD0oZnVuY3Rpb24gUCh0KXt0OmZvcih2YXIgZSxuPXQubGVuZ3RoLG89MSxpPS0xO288bjsrK28pc3dpdGNoKHRbb10pe2Nhc2UiLiI6aT1lPW87YnJlYWs7Y2FzZSIwIjowPT09aSYmKGk9byksZT1vO2JyZWFrO2RlZmF1bHQ6aWYoISt0W29dKWJyZWFrIHQ7aT4wJiYoaT0wKX1yZXR1cm4gaT4wP3Quc2xpY2UoMCxpKSt0LnNsaWNlKGUrMSk6dH0pKHQpKSxPJiYwPT0rdCYmIisiIT09cCYmKE89ITEpLG09KE8/IigiPT09cD9wOmM6Ii0iPT09cHx8IigiPT09cD8iIjpwKSttLHg9KCJzIj09PXk/VHR0WzgrQ3R0LzNdOiIiKSt4KyhPJiYiKCI9PT1wPyIpIjoiIiksdilmb3Iobz0tMSxpPXQubGVuZ3RoOysrbzxpOylpZig0OD4obD10LmNoYXJDb2RlQXQobykpfHxsPjU3KXt4PSg0Nj09PWw/YSt0LnNsaWNlKG8rMSk6dC5zbGljZShvKSkreCx0PXQuc2xpY2UoMCxvKTticmVha319ZyYmIXUmJih0PWUodCwxLzApKTt2YXIgdz1tLmxlbmd0aCt0Lmxlbmd0aCt4Lmxlbmd0aCxrPXc8Zj9uZXcgQXJyYXkoZi13KzEpLmpvaW4obik6IiI7c3dpdGNoKGcmJnUmJih0PWUoayt0LGsubGVuZ3RoP2YteC5sZW5ndGg6MS8wKSxrPSIiKSxzKXtjYXNlIjwiOnQ9bSt0K3grazticmVhaztjYXNlIj0iOnQ9bStrK3QreDticmVhaztjYXNlIl4iOnQ9ay5zbGljZSgwLHc9ay5sZW5ndGg+PjEpK20rdCt4K2suc2xpY2Uodyk7YnJlYWs7ZGVmYXVsdDp0PWsrbSt0K3h9cmV0dXJuIHIodCl9cmV0dXJuIGg9dm9pZCAwPT09aD82Oi9bZ3Byc10vLnRlc3QoeSk/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxoKSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxoKSkseC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0KyIifSx4fXJldHVybntmb3JtYXQ6cCxmb3JtYXRQcmVmaXg6ZnVuY3Rpb24gbSh0LGUpe3ZhciBuPXAoKCh0PXZ0dCh0KSkudHlwZT0iZiIsdCkpLG89MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoX3R0KGUpLzMpKSksaT1NYXRoLnBvdygxMCwtbyksYT1UdHRbOCtvLzNdO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbihpKnQpK2F9fX19KSh0KSxFdHQ9RHR0LmZvcm1hdCxSdHQ9RHR0LmZvcm1hdFByZWZpeH0pKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXSxtaW51czoiLSJ9KTt2YXIgSXR0PUFycmF5LnByb3RvdHlwZSxIdHQ9SXR0Lm1hcCxGdHQ9SXR0LnNsaWNlLEx0dD17bmFtZToiaW1wbGljaXQifTtmdW5jdGlvbiBCdHQoKXt2YXIgdD1ndHQoKSxlPVtdLG49W10sbz1MdHQ7ZnVuY3Rpb24gaShpKXt2YXIgYT1pKyIiLHI9dC5nZXQoYSk7aWYoIXIpe2lmKG8hPT1MdHQpcmV0dXJuIG87dC5zZXQoYSxyPWUucHVzaChpKSl9cmV0dXJuIG5bKHItMSklbi5sZW5ndGhdfXJldHVybiBpLmRvbWFpbj1mdW5jdGlvbihuKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZS5zbGljZSgpO2U9W10sdD1ndHQoKTtmb3IodmFyIG8sYSxyPS0xLHM9bi5sZW5ndGg7KytyPHM7KXQuaGFzKGE9KG89bltyXSkrIiIpfHx0LnNldChhLGUucHVzaChvKSk7cmV0dXJuIGl9LGkucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49RnR0LmNhbGwodCksaSk6bi5zbGljZSgpfSxpLnVua25vd249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89dCxpKTpvfSxpLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gQnR0KGUsbikudW5rbm93bihvKX0sTnR0LmFwcGx5KGksYXJndW1lbnRzKSxpfWZ1bmN0aW9uIFZ0dCgpe3ZhciB0LGUsbj1CdHQoKS51bmtub3duKHZvaWQgMCksbz1uLmRvbWFpbixpPW4ucmFuZ2UsYT1bMCwxXSxyPSExLHM9MCxsPTAsYz0uNTtmdW5jdGlvbiBkKCl7dmFyIG49bygpLmxlbmd0aCxkPWFbMV08YVswXSxwPWFbZC0wXSxtPWFbMS1kXTt0PShtLXApL01hdGgubWF4KDEsbi1zKzIqbCksciYmKHQ9TWF0aC5mbG9vcih0KSkscCs9KG0tcC10KihuLXMpKSpjLGU9dCooMS1zKSxyJiYocD1NYXRoLnJvdW5kKHApLGU9TWF0aC5yb3VuZChlKSk7dmFyIHU9aDUobikubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gcCt0KmV9KSk7cmV0dXJuIGkoZD91LnJldmVyc2UoKTp1KX1yZXR1cm4gZGVsZXRlIG4udW5rbm93bixuLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obyh0KSxkKCkpOm8oKX0sbi5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1bK3RbMF0sK3RbMV1dLGQoKSk6YS5zbGljZSgpfSxuLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGE9Wyt0WzBdLCt0WzFdXSxyPSEwLGQoKX0sbi5iYW5kd2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sbi5zdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LG4ucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ISF0LGQoKSk6cn0sbi5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPU1hdGgubWluKDEsbD0rdCksZCgpKTpzfSxuLnBhZGRpbmdJbm5lcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1NYXRoLm1pbigxLHQpLGQoKSk6c30sbi5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9K3QsZCgpKTpsfSxuLmFsaWduPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSksZCgpKTpjfSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gVnR0KG8oKSxhKS5yb3VuZChyKS5wYWRkaW5nSW5uZXIocykucGFkZGluZ091dGVyKGwpLmFsaWduKGMpfSxOdHQuYXBwbHkoZCgpLGFyZ3VtZW50cyl9ZnVuY3Rpb24ganR0KHQpe3ZhciBlPXQuY29weTtyZXR1cm4gdC5wYWRkaW5nPXQucGFkZGluZ091dGVyLGRlbGV0ZSB0LnBhZGRpbmdJbm5lcixkZWxldGUgdC5wYWRkaW5nT3V0ZXIsdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGp0dChlKCkpfSx0fWZ1bmN0aW9uIFV0dCgpe3JldHVybiBqdHQoVnR0LmFwcGx5KG51bGwsYXJndW1lbnRzKS5wYWRkaW5nSW5uZXIoMSkpfWZ1bmN0aW9uIEd0dCh0KXtyZXR1cm4rdH12YXIgV3R0PVswLDFdO2Z1bmN0aW9uIFl0dCh0KXtyZXR1cm4gdH1mdW5jdGlvbiBxdHQodCxlKXtyZXR1cm4oZS09dD0rdCk/ZnVuY3Rpb24obil7cmV0dXJuKG4tdCkvZX06KGZ1bmN0aW9uIG4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSkoaXNOYU4oZSk/TmFOOi41KX1mdW5jdGlvbiBadHQodCl7dmFyIGUsbj10WzBdLG89dFt0Lmxlbmd0aC0xXTtyZXR1cm4gbj5vJiYoZT1uLG49byxvPWUpLGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLm1heChuLE1hdGgubWluKG8sdCkpfX1mdW5jdGlvbiBYdHQodCxlLG4pe3ZhciBvPXRbMF0saT10WzFdLGE9ZVswXSxyPWVbMV07cmV0dXJuIGk8bz8obz1xdHQoaSxvKSxhPW4ocixhKSk6KG89cXR0KG8saSksYT1uKGEscikpLGZ1bmN0aW9uKHQpe3JldHVybiBhKG8odCkpfX1mdW5jdGlvbiBLdHQodCxlLG4pe3ZhciBvPU1hdGgubWluKHQubGVuZ3RoLGUubGVuZ3RoKS0xLGk9bmV3IEFycmF5KG8pLGE9bmV3IEFycmF5KG8pLHI9LTE7Zm9yKHRbb108dFswXSYmKHQ9dC5zbGljZSgpLnJldmVyc2UoKSxlPWUuc2xpY2UoKS5yZXZlcnNlKCkpOysrcjxvOylpW3JdPXF0dCh0W3JdLHRbcisxXSksYVtyXT1uKGVbcl0sZVtyKzFdKTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49cDUodCxlLDEsbyktMTtyZXR1cm4gYVtuXShpW25dKGUpKX19ZnVuY3Rpb24gSnR0KHQsZSl7cmV0dXJuIGUuZG9tYWluKHQuZG9tYWluKCkpLnJhbmdlKHQucmFuZ2UoKSkuaW50ZXJwb2xhdGUodC5pbnRlcnBvbGF0ZSgpKS5jbGFtcCh0LmNsYW1wKCkpLnVua25vd24odC51bmtub3duKCkpfWZ1bmN0aW9uIFF0dCgpe3ZhciB0LGUsbixvLGksYSxyPVd0dCxzPVd0dCxsPVo3LGM9WXR0O2Z1bmN0aW9uIGQoKXtyZXR1cm4gbz1NYXRoLm1pbihyLmxlbmd0aCxzLmxlbmd0aCk+Mj9LdHQ6WHR0LGk9YT1udWxsLHB9ZnVuY3Rpb24gcChlKXtyZXR1cm4gaXNOYU4oZT0rZSk/bjooaXx8KGk9byhyLm1hcCh0KSxzLGwpKSkodChjKGUpKSl9cmV0dXJuIHAuaW52ZXJ0PWZ1bmN0aW9uKG4pe3JldHVybiBjKGUoKGF8fChhPW8ocyxyLm1hcCh0KSxVNykpKShuKSkpfSxwLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1IdHQuY2FsbCh0LEd0dCksYz09PVl0dHx8KGM9WnR0KHIpKSxkKCkpOnIuc2xpY2UoKX0scC5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1GdHQuY2FsbCh0KSxkKCkpOnMuc2xpY2UoKX0scC5yYW5nZVJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBzPUZ0dC5jYWxsKHQpLGw9WDcsZCgpfSxwLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPXQ/WnR0KHIpOll0dCxwKTpjIT09WXR0fSxwLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPXQsZCgpKTpsfSxwLnVua25vd249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxwKTpufSxmdW5jdGlvbihuLG8pe3JldHVybiB0PW4sZT1vLGQoKX19ZnVuY3Rpb24gJHR0KHQsZSl7cmV0dXJuIFF0dCgpKHQsZSl9ZnVuY3Rpb24gdGV0KHQpe3ZhciBlPXQuZG9tYWluO3JldHVybiB0LnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBuPWUoKTtyZXR1cm4gQzUoblswXSxuW24ubGVuZ3RoLTFdLG51bGw9PXQ/MTA6dCl9LHQudGlja0Zvcm1hdD1mdW5jdGlvbih0LG4pe3ZhciBvPWUoKTtyZXR1cm4oZnVuY3Rpb24gaSh0LGUsbixvKXt2YXIgaSxhPXY1KHQsZSxuKTtzd2l0Y2goKG89dnR0KG51bGw9PW8/IixmIjpvKSkudHlwZSl7Y2FzZSJzIjp2YXIgcj1NYXRoLm1heChNYXRoLmFicyh0KSxNYXRoLmFicyhlKSk7cmV0dXJuIG51bGwhPW8ucHJlY2lzaW9ufHxpc05hTihpPShmdW5jdGlvbiBzKHQsZSl7cmV0dXJuIE1hdGgubWF4KDAsMypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoX3R0KGUpLzMpKSktX3R0KE1hdGguYWJzKHQpKSl9KShhLHIpKXx8KG8ucHJlY2lzaW9uPWkpLFJ0dChvLHIpO2Nhc2UiIjpjYXNlImUiOmNhc2UiZyI6Y2FzZSJwIjpjYXNlInIiOm51bGwhPW8ucHJlY2lzaW9ufHxpc05hTihpPShmdW5jdGlvbiBsKHQsZSl7cmV0dXJuIHQ9TWF0aC5hYnModCksZT1NYXRoLmFicyhlKS10LE1hdGgubWF4KDAsX3R0KGUpLV90dCh0KSkrMX0pKGEsTWF0aC5tYXgoTWF0aC5hYnModCksTWF0aC5hYnMoZSkpKSl8fChvLnByZWNpc2lvbj1pLSgiZSI9PT1vLnR5cGUpKTticmVhaztjYXNlImYiOmNhc2UiJSI6bnVsbCE9by5wcmVjaXNpb258fGlzTmFOKGk9KGZ1bmN0aW9uIGModCl7cmV0dXJuIE1hdGgubWF4KDAsLV90dChNYXRoLmFicyh0KSkpfSkoYSkpfHwoby5wcmVjaXNpb249aS0yKigiJSI9PT1vLnR5cGUpKX1yZXR1cm4gRXR0KG8pfSkob1swXSxvW28ubGVuZ3RoLTFdLG51bGw9PXQ/MTA6dCxuKX0sdC5uaWNlPWZ1bmN0aW9uKG4pe251bGw9PW4mJihuPTEwKTt2YXIgbyxpPWUoKSxhPTAscj1pLmxlbmd0aC0xLHM9aVthXSxsPWlbcl07cmV0dXJuIGw8cyYmKG89cyxzPWwsbD1vLG89YSxhPXIscj1vKSwobz1NNShzLGwsbikpPjA/bz1NNShzPU1hdGguZmxvb3Iocy9vKSpvLGw9TWF0aC5jZWlsKGwvbykqbyxuKTpvPDAmJihvPU01KHM9TWF0aC5jZWlsKHMqbykvbyxsPU1hdGguZmxvb3IobCpvKS9vLG4pKSxvPjA/KGlbYV09TWF0aC5mbG9vcihzL28pKm8saVtyXT1NYXRoLmNlaWwobC9vKSpvLGUoaSkpOm88MCYmKGlbYV09TWF0aC5jZWlsKHMqbykvbyxpW3JdPU1hdGguZmxvb3IobCpvKS9vLGUoaSkpLHR9LHR9ZnVuY3Rpb24gZWV0KCl7dmFyIHQ9JHR0KFl0dCxZdHQpO3JldHVybiB0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gSnR0KHQsZWV0KCkpfSxOdHQuYXBwbHkodCxhcmd1bWVudHMpLHRldCh0KX1mdW5jdGlvbiBuZXQodCxlKXt2YXIgbixvPTAsaT0odD10LnNsaWNlKCkpLmxlbmd0aC0xLGE9dFtvXSxyPXRbaV07cmV0dXJuIHI8YSYmKG49byxvPWksaT1uLG49YSxhPXIscj1uKSx0W29dPWUuZmxvb3IoYSksdFtpXT1lLmNlaWwociksdH1mdW5jdGlvbiBvZXQodCl7cmV0dXJuIE1hdGgubG9nKHQpfWZ1bmN0aW9uIGlldCh0KXtyZXR1cm4gTWF0aC5leHAodCl9ZnVuY3Rpb24gYWV0KHQpe3JldHVybi1NYXRoLmxvZygtdCl9ZnVuY3Rpb24gcmV0KHQpe3JldHVybi1NYXRoLmV4cCgtdCl9ZnVuY3Rpb24gc2V0KHQpe3JldHVybiBpc0Zpbml0ZSh0KT8rKCIxZSIrdCk6dDwwPzA6dH1mdW5jdGlvbiBjZXQodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybi10KC1lKX19ZnVuY3Rpb24gZGV0KHQpe3ZhciBlLG4sbz10KG9ldCxpZXQpLGk9by5kb21haW4sYT0xMDtmdW5jdGlvbiByKCl7cmV0dXJuIGU9KGZ1bmN0aW9uIHIodCl7cmV0dXJuIHQ9PT1NYXRoLkU/TWF0aC5sb2c6MTA9PT10JiZNYXRoLmxvZzEwfHwyPT09dCYmTWF0aC5sb2cyfHwodD1NYXRoLmxvZyh0KSxmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5sb2coZSkvdH0pfSkoYSksbj0oZnVuY3Rpb24gcyh0KXtyZXR1cm4gMTA9PT10P3NldDp0PT09TWF0aC5FP01hdGguZXhwOmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnBvdyh0LGUpfX0pKGEpLGkoKVswXTwwPyhlPWNldChlKSxuPWNldChuKSx0KGFldCxyZXQpKTp0KG9ldCxpZXQpLG99cmV0dXJuIG8uYmFzZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rdCxyKCkpOmF9LG8uZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpKHQpLHIoKSk6aSgpfSxvLnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBvLHI9aSgpLHM9clswXSxsPXJbci5sZW5ndGgtMV07KG89bDxzKSYmKG09cyxzPWwsbD1tKTt2YXIgYyxkLHAsbT1lKHMpLHU9ZShsKSxmPW51bGw9PXQ/MTA6K3QsZz1bXTtpZighKGElMSkmJnUtbTxmKXtpZihtPU1hdGgucm91bmQobSktMSx1PU1hdGgucm91bmQodSkrMSxzPjApe2Zvcig7bTx1OysrbSlmb3IoZD0xLGM9bihtKTtkPGE7KytkKWlmKCEoKHA9YypkKTxzKSl7aWYocD5sKWJyZWFrO2cucHVzaChwKX19ZWxzZSBmb3IoO208dTsrK20pZm9yKGQ9YS0xLGM9bihtKTtkPj0xOy0tZClpZighKChwPWMqZCk8cykpe2lmKHA+bClicmVhaztnLnB1c2gocCl9fWVsc2UgZz1DNShtLHUsTWF0aC5taW4odS1tLGYpKS5tYXAobik7cmV0dXJuIG8/Zy5yZXZlcnNlKCk6Z30sby50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsaSl7aWYobnVsbD09aSYmKGk9MTA9PT1hPyIuMGUiOiIsIiksImZ1bmN0aW9uIiE9dHlwZW9mIGkmJihpPUV0dChpKSksdD09PTEvMClyZXR1cm4gaTtudWxsPT10JiYodD0xMCk7dmFyIHI9TWF0aC5tYXgoMSxhKnQvby50aWNrcygpLmxlbmd0aCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBvPXQvbihNYXRoLnJvdW5kKGUodCkpKTtyZXR1cm4gbyphPGEtLjUmJihvKj1hKSxvPD1yP2kodCk6IiJ9fSxvLm5pY2U9ZnVuY3Rpb24oKXtyZXR1cm4gaShuZXQoaSgpLHtmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gbihNYXRoLmZsb29yKGUodCkpKX0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gbihNYXRoLmNlaWwoZSh0KSkpfX0pKX0sb31mdW5jdGlvbiBwZXQoKXt2YXIgdD1kZXQoUXR0KCkpLmRvbWFpbihbMSwxMF0pO3JldHVybiB0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gSnR0KHQscGV0KCkpLmJhc2UodC5iYXNlKCkpfSxOdHQuYXBwbHkodCxhcmd1bWVudHMpLHR9dmFyIG1ldD1uZXcgRGF0ZSx1ZXQ9bmV3IERhdGU7ZnVuY3Rpb24gZmV0KHQsZSxuLG8pe2Z1bmN0aW9uIGkoZSl7cmV0dXJuIHQoZT0wPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgRGF0ZTpuZXcgRGF0ZSgrZSkpLGV9cmV0dXJuIGkuZmxvb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZT1uZXcgRGF0ZSgrZSkpLGV9LGkuY2VpbD1mdW5jdGlvbihuKXtyZXR1cm4gdChuPW5ldyBEYXRlKG4tMSkpLGUobiwxKSx0KG4pLG59LGkucm91bmQ9ZnVuY3Rpb24odCl7dmFyIGU9aSh0KSxuPWkuY2VpbCh0KTtyZXR1cm4gdC1lPG4tdD9lOm59LGkub2Zmc2V0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIGUodD1uZXcgRGF0ZSgrdCksbnVsbD09bj8xOk1hdGguZmxvb3IobikpLHR9LGkucmFuZ2U9ZnVuY3Rpb24obixvLGEpe3ZhciByLHM9W107aWYobj1pLmNlaWwobiksYT1udWxsPT1hPzE6TWF0aC5mbG9vcihhKSwhKG48byYmYT4wKSlyZXR1cm4gcztkb3tzLnB1c2gocj1uZXcgRGF0ZSgrbikpLGUobixhKSx0KG4pfXdoaWxlKHI8biYmbjxvKTtyZXR1cm4gc30saS5maWx0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIGZldCgoZnVuY3Rpb24oZSl7aWYoZT49ZSlmb3IoO3QoZSksIW4oZSk7KWUuc2V0VGltZShlLTEpfSksKGZ1bmN0aW9uKHQsbyl7aWYodD49dClpZihvPDApZm9yKDsrK288PTA7KWZvcig7ZSh0LC0xKSwhbih0KTspO2Vsc2UgZm9yKDstLW8+PTA7KWZvcig7ZSh0LDEpLCFuKHQpOyk7fSkpfSxuJiYoaS5jb3VudD1mdW5jdGlvbihlLG8pe3JldHVybiBtZXQuc2V0VGltZSgrZSksdWV0LnNldFRpbWUoK28pLHQobWV0KSx0KHVldCksTWF0aC5mbG9vcihuKG1ldCx1ZXQpKX0saS5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP2kuZmlsdGVyKG8/ZnVuY3Rpb24oZSl7cmV0dXJuIG8oZSkldD09MH06ZnVuY3Rpb24oZSl7cmV0dXJuIGkuY291bnQoMCxlKSV0PT0wfSk6aTpudWxsfSksaX12YXIgZ2V0PWZldCgoZnVuY3Rpb24oKXt9KSwoZnVuY3Rpb24odCxlKXt0LnNldFRpbWUoK3QrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS10fSkpO2dldC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP2ZldCgoZnVuY3Rpb24oZSl7ZS5zZXRUaW1lKE1hdGguZmxvb3IoZS90KSp0KX0pLChmdW5jdGlvbihlLG4pe2Uuc2V0VGltZSgrZStuKnQpfSksKGZ1bmN0aW9uKGUsbil7cmV0dXJuKG4tZSkvdH0pKTpnZXQ6bnVsbH07dmFyIGhldD1nZXQsYmV0PTFlMyx5ZXQ9NmU0LF9ldD0zNmU1LENldD04NjRlNSxNZXQ9NjA0OGU1LHZldD1mZXQoKGZ1bmN0aW9uKHQpe3Quc2V0VGltZSh0LXQuZ2V0TWlsbGlzZWNvbmRzKCkpfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UqYmV0KX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL2JldH0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENTZWNvbmRzKCl9KSkseGV0PWZldCgoZnVuY3Rpb24odCl7dC5zZXRUaW1lKHQtdC5nZXRNaWxsaXNlY29uZHMoKS10LmdldFNlY29uZHMoKSpiZXQpfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UqeWV0KX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL3lldH0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNaW51dGVzKCl9KSksT2V0PWZldCgoZnVuY3Rpb24odCl7dC5zZXRUaW1lKHQtdC5nZXRNaWxsaXNlY29uZHMoKS10LmdldFNlY29uZHMoKSpiZXQtdC5nZXRNaW51dGVzKCkqeWV0KX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKl9ldCl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS9fZXR9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0SG91cnMoKX0pKSxQZXQ9ZmV0KChmdW5jdGlvbih0KXt0LnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpK2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdC0oZS5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkqeWV0KS9DZXR9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RGF0ZSgpLTF9KSk7ZnVuY3Rpb24gd2V0KHQpe3JldHVybiBmZXQoKGZ1bmN0aW9uKGUpe2Uuc2V0RGF0ZShlLmdldERhdGUoKS0oZS5nZXREYXkoKSs3LXQpJTcpLGUuc2V0SG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldERhdGUodC5nZXREYXRlKCkrNyplKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQtKGUuZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKnlldCkvTWV0fSkpfXZhciBrZXQ9d2V0KDApLERldD13ZXQoMSk7d2V0KDIpLHdldCgzKTt2YXIgRWV0PXdldCg0KTt3ZXQoNSksd2V0KDYpO3ZhciBSZXQ9ZmV0KChmdW5jdGlvbih0KXt0LnNldERhdGUoMSksdC5zZXRIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0TW9udGgodC5nZXRNb250aCgpK2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZ2V0TW9udGgoKS10LmdldE1vbnRoKCkrMTIqKGUuZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCkpfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE1vbnRoKCl9KSksQWV0PWZldCgoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldEZ1bGxZZWFyKHQuZ2V0RnVsbFllYXIoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybiBlLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KSk7QWV0LmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PU1hdGguZmxvb3IodCkpJiZ0PjA/ZmV0KChmdW5jdGlvbihlKXtlLnNldEZ1bGxZZWFyKE1hdGguZmxvb3IoZS5nZXRGdWxsWWVhcigpL3QpKnQpLGUuc2V0TW9udGgoMCwxKSxlLnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKGUsbil7ZS5zZXRGdWxsWWVhcihlLmdldEZ1bGxZZWFyKCkrbip0KX0pKTpudWxsfTt2YXIgVGV0PUFldCxOZXQ9ZmV0KChmdW5jdGlvbih0KXt0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpK2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvQ2V0fSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0RhdGUoKS0xfSkpO2Z1bmN0aW9uIHpldCh0KXtyZXR1cm4gZmV0KChmdW5jdGlvbihlKXtlLnNldFVUQ0RhdGUoZS5nZXRVVENEYXRlKCktKGUuZ2V0VVRDRGF5KCkrNy10KSU3KSxlLnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpKzcqZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS9NZXR9KSl9dmFyIElldD16ZXQoMCksSGV0PXpldCgxKTt6ZXQoMiksemV0KDMpO3ZhciBGZXQ9emV0KDQpO3pldCg1KSx6ZXQoNik7dmFyIExldD1mZXQoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTW9udGgoMCwxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRVVENGdWxsWWVhcih0LmdldFVUQ0Z1bGxZZWFyKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5nZXRVVENGdWxsWWVhcigpLXQuZ2V0VVRDRnVsbFllYXIoKX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENGdWxsWWVhcigpfSkpO0xldC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP2ZldCgoZnVuY3Rpb24oZSl7ZS5zZXRVVENGdWxsWWVhcihNYXRoLmZsb29yKGUuZ2V0VVRDRnVsbFllYXIoKS90KSp0KSxlLnNldFVUQ01vbnRoKDAsMSksZS5zZXRVVENIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbihlLG4pe2Uuc2V0VVRDRnVsbFllYXIoZS5nZXRVVENGdWxsWWVhcigpK24qdCl9KSk6bnVsbH07dmFyIEJldD1MZXQ7ZnVuY3Rpb24gVmV0KHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIGU9bmV3IERhdGUoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpO3JldHVybiBlLnNldEZ1bGxZZWFyKHQueSksZX1yZXR1cm4gbmV3IERhdGUodC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKX1mdW5jdGlvbiBqZXQodCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgZT1uZXcgRGF0ZShEYXRlLlVUQygtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpO3JldHVybiBlLnNldFVUQ0Z1bGxZZWFyKHQueSksZX1yZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEModC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKSl9ZnVuY3Rpb24gVWV0KHQsZSxuKXtyZXR1cm57eTp0LG06ZSxkOm4sSDowLE06MCxTOjAsTDowfX12YXIgR2V0LFdldCxZZXQ9eyItIjoiIixfOiIgIiwwOiIwIn0scWV0PS9eXHMqXGQrLyxaZXQ9L14lLyxYZXQ9L1tcXF4kKis/fFtcXSgpLnt9XS9nO2Z1bmN0aW9uIEtldCh0LGUsbil7dmFyIG89dDwwPyItIjoiIixpPShvPy10OnQpKyIiLGE9aS5sZW5ndGg7cmV0dXJuIG8rKGE8bj9uZXcgQXJyYXkobi1hKzEpLmpvaW4oZSkraTppKX1mdW5jdGlvbiBKZXQodCl7cmV0dXJuIHQucmVwbGFjZShYZXQsIlxcJCYiKX1mdW5jdGlvbiBRZXQodCl7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK3QubWFwKEpldCkuam9pbigifCIpKyIpIiwiaSIpfWZ1bmN0aW9uICRldCh0KXtmb3IodmFyIGU9e30sbj0tMSxvPXQubGVuZ3RoOysrbjxvOyllW3Rbbl0udG9Mb3dlckNhc2UoKV09bjtyZXR1cm4gZX1mdW5jdGlvbiB0bnQodCxlLG4pe3ZhciBvPXFldC5leGVjKGUuc2xpY2UobixuKzEpKTtyZXR1cm4gbz8odC53PStvWzBdLG4rb1swXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGVudCh0LGUsbil7dmFyIG89cWV0LmV4ZWMoZS5zbGljZShuLG4rMSkpO3JldHVybiBvPyh0LnU9K29bMF0sbitvWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbm50KHQsZSxuKXt2YXIgbz1xZXQuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIG8/KHQuVT0rb1swXSxuK29bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBvbnQodCxlLG4pe3ZhciBvPXFldC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gbz8odC5WPStvWzBdLG4rb1swXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGludCh0LGUsbil7dmFyIG89cWV0LmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBvPyh0Llc9K29bMF0sbitvWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gYW50KHQsZSxuKXt2YXIgbz1xZXQuZXhlYyhlLnNsaWNlKG4sbis0KSk7cmV0dXJuIG8/KHQueT0rb1swXSxuK29bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBybnQodCxlLG4pe3ZhciBvPXFldC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gbz8odC55PStvWzBdKygrb1swXT42OD8xOTAwOjJlMyksbitvWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gc250KHQsZSxuKXt2YXIgbz0vXihaKXwoWystXVxkXGQpKD86Oj8oXGRcZCkpPy8uZXhlYyhlLnNsaWNlKG4sbis2KSk7cmV0dXJuIG8/KHQuWj1vWzFdPzA6LShvWzJdKyhvWzNdfHwiMDAiKSksbitvWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbG50KHQsZSxuKXt2YXIgbz1xZXQuZXhlYyhlLnNsaWNlKG4sbisxKSk7cmV0dXJuIG8/KHQucT0zKm9bMF0tMyxuK29bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBjbnQodCxlLG4pe3ZhciBvPXFldC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gbz8odC5tPW9bMF0tMSxuK29bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBkbnQodCxlLG4pe3ZhciBvPXFldC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gbz8odC5kPStvWzBdLG4rb1swXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHBudCh0LGUsbil7dmFyIG89cWV0LmV4ZWMoZS5zbGljZShuLG4rMykpO3JldHVybiBvPyh0Lm09MCx0LmQ9K29bMF0sbitvWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbW50KHQsZSxuKXt2YXIgbz1xZXQuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIG8/KHQuSD0rb1swXSxuK29bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1bnQodCxlLG4pe3ZhciBvPXFldC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gbz8odC5NPStvWzBdLG4rb1swXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGZudCh0LGUsbil7dmFyIG89cWV0LmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBvPyh0LlM9K29bMF0sbitvWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gZ250KHQsZSxuKXt2YXIgbz1xZXQuZXhlYyhlLnNsaWNlKG4sbiszKSk7cmV0dXJuIG8/KHQuTD0rb1swXSxuK29bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBobnQodCxlLG4pe3ZhciBvPXFldC5leGVjKGUuc2xpY2UobixuKzYpKTtyZXR1cm4gbz8odC5MPU1hdGguZmxvb3Iob1swXS8xZTMpLG4rb1swXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGJudCh0LGUsbil7dmFyIG89WmV0LmV4ZWMoZS5zbGljZShuLG4rMSkpO3JldHVybiBvP24rb1swXS5sZW5ndGg6LTF9ZnVuY3Rpb24geW50KHQsZSxuKXt2YXIgbz1xZXQuZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gbz8odC5RPStvWzBdLG4rb1swXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIF9udCh0LGUsbil7dmFyIG89cWV0LmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIG8/KHQucz0rb1swXSxuK29bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBDbnQodCxlKXtyZXR1cm4gS2V0KHQuZ2V0RGF0ZSgpLGUsMil9ZnVuY3Rpb24gTW50KHQsZSl7cmV0dXJuIEtldCh0LmdldEhvdXJzKCksZSwyKX1mdW5jdGlvbiB2bnQodCxlKXtyZXR1cm4gS2V0KHQuZ2V0SG91cnMoKSUxMnx8MTIsZSwyKX1mdW5jdGlvbiB4bnQodCxlKXtyZXR1cm4gS2V0KDErUGV0LmNvdW50KFRldCh0KSx0KSxlLDMpfWZ1bmN0aW9uIE9udCh0LGUpe3JldHVybiBLZXQodC5nZXRNaWxsaXNlY29uZHMoKSxlLDMpfWZ1bmN0aW9uIFBudCh0LGUpe3JldHVybiBPbnQodCxlKSsiMDAwIn1mdW5jdGlvbiB3bnQodCxlKXtyZXR1cm4gS2V0KHQuZ2V0TW9udGgoKSsxLGUsMil9ZnVuY3Rpb24ga250KHQsZSl7cmV0dXJuIEtldCh0LmdldE1pbnV0ZXMoKSxlLDIpfWZ1bmN0aW9uIFNudCh0LGUpe3JldHVybiBLZXQodC5nZXRTZWNvbmRzKCksZSwyKX1mdW5jdGlvbiBEbnQodCl7dmFyIGU9dC5nZXREYXkoKTtyZXR1cm4gMD09PWU/NzplfWZ1bmN0aW9uIEVudCh0LGUpe3JldHVybiBLZXQoa2V0LmNvdW50KFRldCh0KS0xLHQpLGUsMil9ZnVuY3Rpb24gUm50KHQpe3ZhciBlPXQuZ2V0RGF5KCk7cmV0dXJuIGU+PTR8fDA9PT1lP0VldCh0KTpFZXQuY2VpbCh0KX1mdW5jdGlvbiBBbnQodCxlKXtyZXR1cm4gdD1SbnQodCksS2V0KEVldC5jb3VudChUZXQodCksdCkrKDQ9PT1UZXQodCkuZ2V0RGF5KCkpLGUsMil9ZnVuY3Rpb24gVG50KHQpe3JldHVybiB0LmdldERheSgpfWZ1bmN0aW9uIE5udCh0LGUpe3JldHVybiBLZXQoRGV0LmNvdW50KFRldCh0KS0xLHQpLGUsMil9ZnVuY3Rpb24gem50KHQsZSl7cmV0dXJuIEtldCh0LmdldEZ1bGxZZWFyKCklMTAwLGUsMil9ZnVuY3Rpb24gSW50KHQsZSl7cmV0dXJuIEtldCgodD1SbnQodCkpLmdldEZ1bGxZZWFyKCklMTAwLGUsMil9ZnVuY3Rpb24gSG50KHQsZSl7cmV0dXJuIEtldCh0LmdldEZ1bGxZZWFyKCklMWU0LGUsNCl9ZnVuY3Rpb24gRm50KHQsZSl7dmFyIG49dC5nZXREYXkoKTtyZXR1cm4gS2V0KCh0PW4+PTR8fDA9PT1uP0VldCh0KTpFZXQuY2VpbCh0KSkuZ2V0RnVsbFllYXIoKSUxZTQsZSw0KX1mdW5jdGlvbiBMbnQodCl7dmFyIGU9dC5nZXRUaW1lem9uZU9mZnNldCgpO3JldHVybihlPjA/Ii0iOihlKj0tMSwiKyIpKStLZXQoZS82MHwwLCIwIiwyKStLZXQoZSU2MCwiMCIsMil9ZnVuY3Rpb24gQm50KHQsZSl7cmV0dXJuIEtldCh0LmdldFVUQ0RhdGUoKSxlLDIpfWZ1bmN0aW9uIFZudCh0LGUpe3JldHVybiBLZXQodC5nZXRVVENIb3VycygpLGUsMil9ZnVuY3Rpb24gam50KHQsZSl7cmV0dXJuIEtldCh0LmdldFVUQ0hvdXJzKCklMTJ8fDEyLGUsMil9ZnVuY3Rpb24gVW50KHQsZSl7cmV0dXJuIEtldCgxK05ldC5jb3VudChCZXQodCksdCksZSwzKX1mdW5jdGlvbiBHbnQodCxlKXtyZXR1cm4gS2V0KHQuZ2V0VVRDTWlsbGlzZWNvbmRzKCksZSwzKX1mdW5jdGlvbiBXbnQodCxlKXtyZXR1cm4gR250KHQsZSkrIjAwMCJ9ZnVuY3Rpb24gWW50KHQsZSl7cmV0dXJuIEtldCh0LmdldFVUQ01vbnRoKCkrMSxlLDIpfWZ1bmN0aW9uIHFudCh0LGUpe3JldHVybiBLZXQodC5nZXRVVENNaW51dGVzKCksZSwyKX1mdW5jdGlvbiBabnQodCxlKXtyZXR1cm4gS2V0KHQuZ2V0VVRDU2Vjb25kcygpLGUsMil9ZnVuY3Rpb24gWG50KHQpe3ZhciBlPXQuZ2V0VVRDRGF5KCk7cmV0dXJuIDA9PT1lPzc6ZX1mdW5jdGlvbiBLbnQodCxlKXtyZXR1cm4gS2V0KElldC5jb3VudChCZXQodCktMSx0KSxlLDIpfWZ1bmN0aW9uIEpudCh0KXt2YXIgZT10LmdldFVUQ0RheSgpO3JldHVybiBlPj00fHwwPT09ZT9GZXQodCk6RmV0LmNlaWwodCl9ZnVuY3Rpb24gUW50KHQsZSl7cmV0dXJuIHQ9Sm50KHQpLEtldChGZXQuY291bnQoQmV0KHQpLHQpKyg0PT09QmV0KHQpLmdldFVUQ0RheSgpKSxlLDIpfWZ1bmN0aW9uICRudCh0KXtyZXR1cm4gdC5nZXRVVENEYXkoKX1mdW5jdGlvbiB0b3QodCxlKXtyZXR1cm4gS2V0KEhldC5jb3VudChCZXQodCktMSx0KSxlLDIpfWZ1bmN0aW9uIGVvdCh0LGUpe3JldHVybiBLZXQodC5nZXRVVENGdWxsWWVhcigpJTEwMCxlLDIpfWZ1bmN0aW9uIG5vdCh0LGUpe3JldHVybiBLZXQoKHQ9Sm50KHQpKS5nZXRVVENGdWxsWWVhcigpJTEwMCxlLDIpfWZ1bmN0aW9uIG9vdCh0LGUpe3JldHVybiBLZXQodC5nZXRVVENGdWxsWWVhcigpJTFlNCxlLDQpfWZ1bmN0aW9uIGlvdCh0LGUpe3ZhciBuPXQuZ2V0VVRDRGF5KCk7cmV0dXJuIEtldCgodD1uPj00fHwwPT09bj9GZXQodCk6RmV0LmNlaWwodCkpLmdldFVUQ0Z1bGxZZWFyKCklMWU0LGUsNCl9ZnVuY3Rpb24gYW90KCl7cmV0dXJuIiswMDAwIn1mdW5jdGlvbiByb3QoKXtyZXR1cm4iJSJ9ZnVuY3Rpb24gc290KHQpe3JldHVybit0fWZ1bmN0aW9uIGxvdCh0KXtyZXR1cm4gTWF0aC5mbG9vcigrdC8xZTMpfSEoZnVuY3Rpb24gY290KHQpe0dldD0oZnVuY3Rpb24gZSh0KXt2YXIgZT10LmRhdGVUaW1lLG49dC5kYXRlLG89dC50aW1lLGk9dC5wZXJpb2RzLGE9dC5kYXlzLHI9dC5zaG9ydERheXMscz10Lm1vbnRocyxsPXQuc2hvcnRNb250aHMsYz1RZXQoaSksZD0kZXQoaSkscD1RZXQoYSksbT0kZXQoYSksdT1RZXQociksZj0kZXQociksZz1RZXQocyksaD0kZXQocyksYj1RZXQobCkseT0kZXQobCksXz17YTpmdW5jdGlvbiBDKHQpe3JldHVybiByW3QuZ2V0RGF5KCldfSxBOmZ1bmN0aW9uIE0odCl7cmV0dXJuIGFbdC5nZXREYXkoKV19LGI6ZnVuY3Rpb24gdih0KXtyZXR1cm4gbFt0LmdldE1vbnRoKCldfSxCOmZ1bmN0aW9uIHgodCl7cmV0dXJuIHNbdC5nZXRNb250aCgpXX0sYzpudWxsLGQ6Q250LGU6Q250LGY6UG50LGc6SW50LEc6Rm50LEg6TW50LEk6dm50LGo6eG50LEw6T250LG06d250LE06a250LHA6ZnVuY3Rpb24gTyh0KXtyZXR1cm4gaVsrKHQuZ2V0SG91cnMoKT49MTIpXX0scTpmdW5jdGlvbiBQKHQpe3JldHVybiAxK35+KHQuZ2V0TW9udGgoKS8zKX0sUTpzb3Qsczpsb3QsUzpTbnQsdTpEbnQsVTpFbnQsVjpBbnQsdzpUbnQsVzpObnQseDpudWxsLFg6bnVsbCx5OnpudCxZOkhudCxaOkxudCwiJSI6cm90fSx3PXthOmZ1bmN0aW9uIGsodCl7cmV0dXJuIHJbdC5nZXRVVENEYXkoKV19LEE6ZnVuY3Rpb24gUyh0KXtyZXR1cm4gYVt0LmdldFVUQ0RheSgpXX0sYjpmdW5jdGlvbiBEKHQpe3JldHVybiBsW3QuZ2V0VVRDTW9udGgoKV19LEI6ZnVuY3Rpb24gRSh0KXtyZXR1cm4gc1t0LmdldFVUQ01vbnRoKCldfSxjOm51bGwsZDpCbnQsZTpCbnQsZjpXbnQsZzpub3QsRzppb3QsSDpWbnQsSTpqbnQsajpVbnQsTDpHbnQsbTpZbnQsTTpxbnQscDpmdW5jdGlvbiBSKHQpe3JldHVybiBpWysodC5nZXRVVENIb3VycygpPj0xMildfSxxOmZ1bmN0aW9uIEEodCl7cmV0dXJuIDErfn4odC5nZXRVVENNb250aCgpLzMpfSxROnNvdCxzOmxvdCxTOlpudCx1OlhudCxVOktudCxWOlFudCx3OiRudCxXOnRvdCx4Om51bGwsWDpudWxsLHk6ZW90LFk6b290LFo6YW90LCIlIjpyb3R9LFQ9e2E6ZnVuY3Rpb24gTih0LGUsbil7dmFyIG89dS5leGVjKGUuc2xpY2UobikpO3JldHVybiBvPyh0Lnc9ZltvWzBdLnRvTG93ZXJDYXNlKCldLG4rb1swXS5sZW5ndGgpOi0xfSxBOmZ1bmN0aW9uIHoodCxlLG4pe3ZhciBvPXAuZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gbz8odC53PW1bb1swXS50b0xvd2VyQ2FzZSgpXSxuK29bMF0ubGVuZ3RoKTotMX0sYjpmdW5jdGlvbiBJKHQsZSxuKXt2YXIgbz1iLmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIG8/KHQubT15W29bMF0udG9Mb3dlckNhc2UoKV0sbitvWzBdLmxlbmd0aCk6LTF9LEI6ZnVuY3Rpb24gSCh0LGUsbil7dmFyIG89Zy5leGVjKGUuc2xpY2UobikpO3JldHVybiBvPyh0Lm09aFtvWzBdLnRvTG93ZXJDYXNlKCldLG4rb1swXS5sZW5ndGgpOi0xfSxjOmZ1bmN0aW9uIEYodCxuLG8pe3JldHVybiBHKHQsZSxuLG8pfSxkOmRudCxlOmRudCxmOmhudCxnOnJudCxHOmFudCxIOm1udCxJOm1udCxqOnBudCxMOmdudCxtOmNudCxNOnVudCxwOmZ1bmN0aW9uIEwodCxlLG4pe3ZhciBvPWMuZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gbz8odC5wPWRbb1swXS50b0xvd2VyQ2FzZSgpXSxuK29bMF0ubGVuZ3RoKTotMX0scTpsbnQsUTp5bnQsczpfbnQsUzpmbnQsdTplbnQsVTpubnQsVjpvbnQsdzp0bnQsVzppbnQseDpmdW5jdGlvbiBCKHQsZSxvKXtyZXR1cm4gRyh0LG4sZSxvKX0sWDpmdW5jdGlvbiBWKHQsZSxuKXtyZXR1cm4gRyh0LG8sZSxuKX0seTpybnQsWTphbnQsWjpzbnQsIiUiOmJudH07ZnVuY3Rpb24gaih0LGUpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgbyxpLGEscj1bXSxzPS0xLGw9MCxjPXQubGVuZ3RoO2ZvcihuIGluc3RhbmNlb2YgRGF0ZXx8KG49bmV3IERhdGUoK24pKTsrK3M8YzspMzc9PT10LmNoYXJDb2RlQXQocykmJihyLnB1c2godC5zbGljZShsLHMpKSxudWxsIT0oaT1ZZXRbbz10LmNoYXJBdCgrK3MpXSk/bz10LmNoYXJBdCgrK3MpOmk9ImUiPT09bz8iICI6IjAiLChhPWVbb10pJiYobz1hKG4saSkpLHIucHVzaChvKSxsPXMrMSk7cmV0dXJuIHIucHVzaCh0LnNsaWNlKGwscykpLHIuam9pbigiIil9fWZ1bmN0aW9uIFUodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIG8saSxhPVVldCgxOTAwLHZvaWQgMCwxKTtpZihHKGEsdCxuKz0iIiwwKSE9bi5sZW5ndGgpcmV0dXJuIG51bGw7aWYoIlEiaW4gYSlyZXR1cm4gbmV3IERhdGUoYS5RKTtpZigicyJpbiBhKXJldHVybiBuZXcgRGF0ZSgxZTMqYS5zKygiTCJpbiBhP2EuTDowKSk7aWYoZSYmISgiWiJpbiBhKSYmKGEuWj0wKSwicCJpbiBhJiYoYS5IPWEuSCUxMisxMiphLnApLHZvaWQgMD09PWEubSYmKGEubT0icSJpbiBhP2EucTowKSwiViJpbiBhKXtpZihhLlY8MXx8YS5WPjUzKXJldHVybiBudWxsOyJ3ImluIGF8fChhLnc9MSksIloiaW4gYT8oaT0obz1qZXQoVWV0KGEueSwwLDEpKSkuZ2V0VVRDRGF5KCksbz1pPjR8fDA9PT1pP0hldC5jZWlsKG8pOkhldChvKSxvPU5ldC5vZmZzZXQobyw3KihhLlYtMSkpLGEueT1vLmdldFVUQ0Z1bGxZZWFyKCksYS5tPW8uZ2V0VVRDTW9udGgoKSxhLmQ9by5nZXRVVENEYXRlKCkrKGEudys2KSU3KTooaT0obz1WZXQoVWV0KGEueSwwLDEpKSkuZ2V0RGF5KCksbz1pPjR8fDA9PT1pP0RldC5jZWlsKG8pOkRldChvKSxvPVBldC5vZmZzZXQobyw3KihhLlYtMSkpLGEueT1vLmdldEZ1bGxZZWFyKCksYS5tPW8uZ2V0TW9udGgoKSxhLmQ9by5nZXREYXRlKCkrKGEudys2KSU3KX1lbHNlKCJXImluIGF8fCJVImluIGEpJiYoInciaW4gYXx8KGEudz0idSJpbiBhP2EudSU3OiJXImluIGE/MTowKSxpPSJaImluIGE/amV0KFVldChhLnksMCwxKSkuZ2V0VVRDRGF5KCk6VmV0KFVldChhLnksMCwxKSkuZ2V0RGF5KCksYS5tPTAsYS5kPSJXImluIGE/KGEudys2KSU3KzcqYS5XLShpKzUpJTc6YS53KzcqYS5VLShpKzYpJTcpO3JldHVybiJaImluIGE/KGEuSCs9YS5aLzEwMHwwLGEuTSs9YS5aJTEwMCxqZXQoYSkpOlZldChhKX19ZnVuY3Rpb24gRyh0LGUsbixvKXtmb3IodmFyIGksYSxyPTAscz1lLmxlbmd0aCxsPW4ubGVuZ3RoO3I8czspe2lmKG8+PWwpcmV0dXJuLTE7aWYoMzc9PT0oaT1lLmNoYXJDb2RlQXQocisrKSkpe2lmKGk9ZS5jaGFyQXQocisrKSwhKGE9VFtpIGluIFlldD9lLmNoYXJBdChyKyspOmldKXx8KG89YSh0LG4sbykpPDApcmV0dXJuLTF9ZWxzZSBpZihpIT1uLmNoYXJDb2RlQXQobysrKSlyZXR1cm4tMX1yZXR1cm4gb31yZXR1cm4gXy54PWoobixfKSxfLlg9aihvLF8pLF8uYz1qKGUsXyksdy54PWoobix3KSx3Llg9aihvLHcpLHcuYz1qKGUsdykse2Zvcm1hdDpmdW5jdGlvbih0KXt2YXIgZT1qKHQrPSIiLF8pO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9LHBhcnNlOmZ1bmN0aW9uKHQpe3ZhciBlPVUodCs9IiIsITEpO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9LHV0Y0Zvcm1hdDpmdW5jdGlvbih0KXt2YXIgZT1qKHQrPSIiLHcpO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9LHV0Y1BhcnNlOmZ1bmN0aW9uKHQpe3ZhciBlPVUodCs9IiIsITApO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9fX0pKHQpLFdldD1HZXQuZm9ybWF0fSkoe2RhdGVUaW1lOiIleCwgJVgiLGRhdGU6IiUtbS8lLWQvJVkiLHRpbWU6IiUtSTolTTolUyAlcCIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTt2YXIgZG90PTMxNTM2ZTY7ZnVuY3Rpb24gcG90KHQpe3JldHVybiBuZXcgRGF0ZSh0KX1mdW5jdGlvbiBtb3QodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlPyt0OituZXcgRGF0ZSgrdCl9ZnVuY3Rpb24gdW90KHQsZSxuLG8saSxhLHIscyxsKXt2YXIgYz0kdHQoWXR0LFl0dCksZD1jLmludmVydCxwPWMuZG9tYWluLG09bCgiLiVMIiksdT1sKCI6JVMiKSxmPWwoIiVJOiVNIiksZz1sKCIlSSAlcCIpLGg9bCgiJWEgJWQiKSxiPWwoIiViICVkIikseT1sKCIlQiIpLF89bCgiJVkiKSxDPVtbciwxLDFlM10sW3IsNSw1ZTNdLFtyLDE1LDE1ZTNdLFtyLDMwLDNlNF0sW2EsMSw2ZTRdLFthLDUsM2U1XSxbYSwxNSw5ZTVdLFthLDMwLDE4ZTVdLFtpLDEsMzZlNV0sW2ksMywxMDhlNV0sW2ksNiwyMTZlNV0sW2ksMTIsNDMyZTVdLFtvLDEsODY0ZTVdLFtvLDIsMTcyOGU1XSxbbiwxLDYwNDhlNV0sW2UsMSwyNTkyZTZdLFtlLDMsNzc3NmU2XSxbdCwxLGRvdF1dO2Z1bmN0aW9uIE0ocyl7cmV0dXJuKHIocyk8cz9tOmEocyk8cz91Omkocyk8cz9mOm8ocyk8cz9nOmUocyk8cz9uKHMpPHM/aDpiOnQocyk8cz95Ol8pKHMpfWZ1bmN0aW9uIHYoZSxuLG8saSl7aWYobnVsbD09ZSYmKGU9MTApLCJudW1iZXIiPT10eXBlb2YgZSl7dmFyIGE9TWF0aC5hYnMoby1uKS9lLHI9ZDUoKGZ1bmN0aW9uKHQpe3JldHVybiB0WzJdfSkpLnJpZ2h0KEMsYSk7cj09PUMubGVuZ3RoPyhpPXY1KG4vZG90LG8vZG90LGUpLGU9dCk6cj8oaT0ocj1DW2EvQ1tyLTFdWzJdPENbcl1bMl0vYT9yLTE6cl0pWzFdLGU9clswXSk6KGk9TWF0aC5tYXgodjUobixvLGUpLDEpLGU9cyl9cmV0dXJuIG51bGw9PWk/ZTplLmV2ZXJ5KGkpfXJldHVybiBjLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IERhdGUoZCh0KSl9LGMuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3AoSHR0LmNhbGwodCxtb3QpKTpwKCkubWFwKHBvdCl9LGMudGlja3M9ZnVuY3Rpb24odCxlKXt2YXIgbixvPXAoKSxpPW9bMF0sYT1vW28ubGVuZ3RoLTFdLHI9YTxpO3JldHVybiByJiYobj1pLGk9YSxhPW4pLG49KG49dih0LGksYSxlKSk/bi5yYW5nZShpLGErMSk6W10scj9uLnJldmVyc2UoKTpufSxjLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09ZT9NOmwoZSl9LGMubmljZT1mdW5jdGlvbih0LGUpe3ZhciBuPXAoKTtyZXR1cm4odD12KHQsblswXSxuW24ubGVuZ3RoLTFdLGUpKT9wKG5ldChuLHQpKTpjfSxjLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gSnR0KGMsdW90KHQsZSxuLG8saSxhLHIscyxsKSl9LGN9ZnVuY3Rpb24gZm90KCl7cmV0dXJuIE50dC5hcHBseSh1b3QoVGV0LFJldCxrZXQsUGV0LE9ldCx4ZXQsdmV0LGhldCxXZXQpLmRvbWFpbihbbmV3IERhdGUoMmUzLDAsMSksbmV3IERhdGUoMmUzLDAsMildKSxhcmd1bWVudHMpfWZ1bmN0aW9uIGdvdCh0KXtmb3IodmFyIGU9dC5sZW5ndGgvNnwwLG49bmV3IEFycmF5KGUpLG89MDtvPGU7KW5bb109IiMiK3Quc2xpY2UoNipvLDYqKytvKTtyZXR1cm4gbn1mdW5jdGlvbiBob3QodCl7cmV0dXJuIEg3KHRbdC5sZW5ndGgtMV0pfXZhciBib3Q9aG90KG5ldyBBcnJheSgzKS5jb25jYXQoImRlZWJmNzllY2FlMTMxODJiZCIsImVmZjNmZmJkZDdlNzZiYWVkNjIxNzFiNSIsImVmZjNmZmJkZDdlNzZiYWVkNjMxODJiZDA4NTE5YyIsImVmZjNmZmM2ZGJlZjllY2FlMTZiYWVkNjMxODJiZDA4NTE5YyIsImVmZjNmZmM2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NDU5NCIsImY3ZmJmZmRlZWJmN2M2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NDU5NCIsImY3ZmJmZmRlZWJmN2M2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NTE5YzA4MzA2YiIpLm1hcChnb3QpKSx5b3Q9aG90KG5ldyBBcnJheSgzKS5jb25jYXQoImYwZjBmMGJkYmRiZDYzNjM2MyIsImY3ZjdmN2NjY2NjYzk2OTY5NjUyNTI1MiIsImY3ZjdmN2NjY2NjYzk2OTY5NjYzNjM2MzI1MjUyNSIsImY3ZjdmN2Q5ZDlkOWJkYmRiZDk2OTY5NjYzNjM2MzI1MjUyNSIsImY3ZjdmN2Q5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUyNTI1MjI1MjUyNSIsImZmZmZmZmYwZjBmMGQ5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUyNTI1MjI1MjUyNSIsImZmZmZmZmYwZjBmMGQ5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUyNTI1MjI1MjUyNTAwMDAwMCIpLm1hcChnb3QpKSxfb3Q9aG90KG5ldyBBcnJheSgzKS5jb25jYXQoImZlZTBkMmZjOTI3MmRlMmQyNiIsImZlZTVkOWZjYWU5MWZiNmE0YWNiMTgxZCIsImZlZTVkOWZjYWU5MWZiNmE0YWRlMmQyNmE1MGYxNSIsImZlZTVkOWZjYmJhMWZjOTI3MmZiNmE0YWRlMmQyNmE1MGYxNSIsImZlZTVkOWZjYmJhMWZjOTI3MmZiNmE0YWVmM2IyY2NiMTgxZDk5MDAwZCIsImZmZjVmMGZlZTBkMmZjYmJhMWZjOTI3MmZiNmE0YWVmM2IyY2NiMTgxZDk5MDAwZCIsImZmZjVmMGZlZTBkMmZjYmJhMWZjOTI3MmZiNmE0YWVmM2IyY2NiMTgxZGE1MGYxNTY3MDAwZCIpLm1hcChnb3QpKTtmdW5jdGlvbiBDb3QodCl7cmV0dXJuIGZ1bmN0aW9uIGUoKXtyZXR1cm4gdH19ZnVuY3Rpb24gTW90KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiB2b3QodCl7cmV0dXJuIG5ldyBNb3QodCl9ZnVuY3Rpb24geG90KHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIE9vdCh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBQb3QoKXt2YXIgdD14b3QsZT1Pb3Qsbj1Db3QoITApLG89bnVsbCxpPXZvdCxhPW51bGw7ZnVuY3Rpb24gcihyKXt2YXIgcyxsLGMsZD1yLmxlbmd0aCxwPSExO2ZvcihudWxsPT1vJiYoYT1pKGM9bXR0KCkpKSxzPTA7czw9ZDsrK3MpIShzPGQmJm4obD1yW3NdLHMscikpPT09cCYmKChwPSFwKT9hLmxpbmVTdGFydCgpOmEubGluZUVuZCgpKSxwJiZhLnBvaW50KCt0KGwscyxyKSwrZShsLHMscikpO2lmKGMpcmV0dXJuIGE9bnVsbCxjKyIifHxudWxsfXJldHVybiByLng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpDb3QoK2UpLHIpOnR9LHIueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkNvdCgrdCkscik6ZX0sci5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Q290KCEhdCkscik6bn0sci5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LG51bGwhPW8mJihhPWkobykpLHIpOml9LHIuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9vPWE9bnVsbDphPWkobz10KSxyKTpvfSxyfWZ1bmN0aW9uIHdvdCh0LGUsbil7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHQuX3gxK3QuX2sqKHQuX3gyLXQuX3gwKSx0Ll95MSt0Ll9rKih0Ll95Mi10Ll95MCksdC5feDIrdC5fayoodC5feDEtZSksdC5feTIrdC5fayoodC5feTEtbiksdC5feDIsdC5feTIpfWZ1bmN0aW9uIGtvdCh0LGUpe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9rPSgxLWUpLzZ9ZnVuY3Rpb24gU290KHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPWV9TW90LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsZSk7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7ZGVmYXVsdDp0aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpfX19LGtvdC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6d290KHRoaXMsdGhpcy5feDEsdGhpcy5feTEpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtzd2l0Y2godD0rdCxlPStlLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsZSk6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxlKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94MT10LHRoaXMuX3kxPWU7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7ZGVmYXVsdDp3b3QodGhpcyx0LGUpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9ZX19LFNvdC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95Mil9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LGUpe2lmKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7dmFyIG49dGhpcy5feDItdCxvPXRoaXMuX3kyLWU7dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhuKm4rbypvLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsZSk6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxlKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0OiEoZnVuY3Rpb24gaSh0LGUsbil7dmFyIG89dC5feDEsaT10Ll95MSxhPXQuX3gyLHI9dC5feTI7aWYodC5fbDAxX2E+MWUtMTIpe3ZhciBzPTIqdC5fbDAxXzJhKzMqdC5fbDAxX2EqdC5fbDEyX2ErdC5fbDEyXzJhLGw9Myp0Ll9sMDFfYSoodC5fbDAxX2ErdC5fbDEyX2EpO289KG8qcy10Ll94MCp0Ll9sMTJfMmErdC5feDIqdC5fbDAxXzJhKS9sLGk9KGkqcy10Ll95MCp0Ll9sMTJfMmErdC5feTIqdC5fbDAxXzJhKS9sfWlmKHQuX2wyM19hPjFlLTEyKXt2YXIgYz0yKnQuX2wyM18yYSszKnQuX2wyM19hKnQuX2wxMl9hK3QuX2wxMl8yYSxkPTMqdC5fbDIzX2EqKHQuX2wyM19hK3QuX2wxMl9hKTthPShhKmMrdC5feDEqdC5fbDIzXzJhLWUqdC5fbDEyXzJhKS9kLHI9KHIqYyt0Ll95MSp0Ll9sMjNfMmEtbip0Ll9sMTJfMmEpL2R9dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKG8saSxhLHIsdC5feDIsdC5feTIpfSkodGhpcyx0LGUpfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPWV9fTt2YXIgRG90PShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIGU/bmV3IFNvdCh0LGUpOm5ldyBrb3QodCwwKX1yZXR1cm4gbi5hbHBoYT1mdW5jdGlvbihlKXtyZXR1cm4gdCgrZSl9LG59KSguNSk7Y29uc3QgRW90PTFlNCxSb3Q9LjAwMSxBb3Q9RXR0KCIuMn5lIiksVG90PUV0dCgiLjR+ciIpLE5vdD1FdHQoIix+Iik7ZnVuY3Rpb24gem90KHQpe2lmKDA9PT10KXJldHVybiIwIjtjb25zdCBlPU1hdGguYWJzKHQpO3JldHVybiBlPj1Fb3R8fGU8Um90P0FvdCh0KTpUb3QodCl9Y29uc3QgSW90PXtmb3JtYXRUaWNrOnpvdCxmb3JtYXRTaG9ydDp6b3QsZm9ybWF0UmVhZGFibGUodCl7Y29uc3QgZT1NYXRoLmFicyh0KTtyZXR1cm4gZT49RW90fHxlPFJvdD9Bb3QodCk6Tm90KHQpfSxmb3JtYXRMb25nOk5vdH0sSG90PW5ldyBJbnRsLk51bWJlckZvcm1hdCh2b2lkIDAse21heGltdW1GcmFjdGlvbkRpZ2l0czozfSk7ZnVuY3Rpb24gRm90KHQpe3JldHVybiBIb3QuZm9ybWF0KHQpfWNvbnN0IExvdD17Zm9ybWF0VGljazpGb3QsZm9ybWF0U2hvcnQ6Rm90LGZvcm1hdFJlYWRhYmxlOkZvdCxmb3JtYXRMb25nOkZvdH0sQm90PUV0dCgiMC4zfnMiKSxWb3Q9RXR0KCIsLjN+ZiIpO2Z1bmN0aW9uIGpvdCh0KXtjb25zdCBlPU1hdGguYWJzKHQpO3JldHVybiBlPj1Fb3R8fGU8Um90P0JvdCh0KTpWb3QodCl9Y29uc3QgVW90PXtmb3JtYXRUaWNrOmpvdCxmb3JtYXRTaG9ydDpqb3QsZm9ybWF0UmVhZGFibGU6am90LGZvcm1hdExvbmc6am90fSxHb3Q9MzZlNSxXb3Q9ODY0ZTUsWW90PTMxNTM2ZTYscW90PUV0dCgiLjR+Iik7ZnVuY3Rpb24gWm90KHQpe2lmKDA9PT10KXJldHVybiIwIjtsZXQgZT1NYXRoLnNpZ24odCk+MD8iIjoiLSI7Y29uc3Qgbj1NYXRoLmFicyh0KTtyZXR1cm4gZSs9bjwxZTM/YCR7cW90KG4pfSBtc2A6bjw2ZTQ/YCR7cW90KG4vMWUzKX0gc2VjYDpuPEdvdD9gJHtxb3Qobi82ZTQpfSBtaW5gOm48V290P2Ake3FvdChuL0dvdCl9IGhyYDpuPFlvdD9gJHtxb3Qobi9Xb3QpfSBkYXlgOmAke3FvdChuL1lvdCl9IHlyYCxlfWNvbnN0IFhvdD17Zm9ybWF0VGljazpab3QsZm9ybWF0U2hvcnQ6Wm90LGZvcm1hdFJlYWRhYmxlOlpvdCxmb3JtYXRMb25nOlpvdH0sS290PWZvdCgpLnRpY2tGb3JtYXQoKTtsZXQgSm90O2NvbnN0IFFvdD17Zm9ybWF0VGljazp0PT5Lb3QobmV3IERhdGUodCkpLGZvcm1hdFNob3J0OnQ9Pm5ldyBEYXRlKHQpLnRvTG9jYWxlU3RyaW5nKEpvdCx7eWVhcjoibnVtZXJpYyIsbW9udGg6InNob3J0IixkYXk6Im51bWVyaWMiLGhvdXI6Im51bWVyaWMiLG1pbnV0ZToibnVtZXJpYyIsc2Vjb25kOiJudW1lcmljIn0pLGZvcm1hdFJlYWRhYmxlOnQ9Pm5ldyBEYXRlKHQpLnRvTG9jYWxlU3RyaW5nKEpvdCx7eWVhcjoibnVtZXJpYyIsbW9udGg6InNob3J0IixkYXk6Im51bWVyaWMiLGhvdXI6Im51bWVyaWMiLG1pbnV0ZToibnVtZXJpYyIsc2Vjb25kOiJudW1lcmljIix0aW1lWm9uZU5hbWU6InNob3J0In0pLGZvcm1hdExvbmc6dD0+bmV3IERhdGUodCkudG9Mb2NhbGVTdHJpbmcoSm90LHt5ZWFyOiJudW1lcmljIixtb250aDoibG9uZyIsZGF5OiJudW1lcmljIixob3VyOiJudW1lcmljIixtaW51dGU6Im51bWVyaWMiLHNlY29uZDoibnVtZXJpYyIsdGltZVpvbmVOYW1lOiJzaG9ydCIsZnJhY3Rpb25hbFNlY29uZERpZ2l0czozfSl9O2Z1bmN0aW9uICRvdCh0KXtzd2l0Y2godCl7Y2FzZSBKMi5MSU5FQVI6cmV0dXJuIG5ldyB0aXQ7Y2FzZSBKMi5MT0cxMDpyZXR1cm4gbmV3IGVpdDtjYXNlIEoyLlRJTUU6cmV0dXJuIG5ldyBuaXQ7ZGVmYXVsdDp0aHJvdyBuZXcgUmFuZ2VFcnJvcihgU2NhbGVUeXBlICR7dH0gbm90IHN1cHBvcnRlZC5gKX19Y2xhc3MgdGl0e2NvbnN0cnVjdG9yKCl7dGhpcy5kZWZhdWx0Rm9ybWF0dGVyPUlvdH10cmFuc2Zvcm0odCxlLG4pe2NvbnN0W28saV09dCxhPWktbyxbcixzXT1lO3JldHVybiAwPT09YT9yOihzLXIpL2EqKG4tbykrcn1mb3J3YXJkKHQsZSxuKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0odCxlLG4pfXJldmVyc2UodCxlLG4pe3JldHVybiB0aGlzLnRyYW5zZm9ybShlLHQsbil9bmljZURvbWFpbih0KXtsZXRbZSxuXT10O2lmKG48ZSl0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgaW5wdXQ6IG1pbiBpcyBsYXJnZXIgdGhhbiBtYXgiKTtpZihuPT09ZSlyZXR1cm4gMD09PWU/Wy0xLDFdOmU8MD9bMiplLDBdOlswLDIqZV07Y29uc3Qgbz1lZXQoKSxpPS4wNSoobi1lK051bWJlci5FUFNJTE9OKSxbYSxyXT1vLmRvbWFpbihbZS1pLG4raV0pLm5pY2UoKS5kb21haW4oKTtyZXR1cm5bYSxyXX10aWNrcyh0LGUpe3JldHVybiBlZXQoKS5kb21haW4odCkudGlja3MoZSl9aXNTYWZlTnVtYmVyKHQpe3JldHVybiBOdW1iZXIuaXNGaW5pdGUodCl9fWNsYXNzIGVpdHtjb25zdHJ1Y3Rvcigpe3RoaXMuZGVmYXVsdEZvcm1hdHRlcj1Jb3R9dHJhbnNmb3JtKHQpe3JldHVybiBNYXRoLmxvZzEwKHQ+MD90Ok51bWJlci5NSU5fVkFMVUUpfXVudHJhbnNmb3JtKHQpe3JldHVybiBNYXRoLmV4cCh0L01hdGguTE9HMTBFKX1mb3J3YXJkKHQsZSxuKXtpZihuPD0wKXJldHVybiBlWzBdO2NvbnN0W28saV09dCxbYSxyXT1lLHM9dGhpcy50cmFuc2Zvcm0obyksbD10aGlzLnRyYW5zZm9ybShpKS1zLGM9ci1hO3JldHVybiBuPXRoaXMudHJhbnNmb3JtKG4pLGMvKGwrTnVtYmVyLkVQU0lMT04pKihuLXMpK2F9cmV2ZXJzZSh0LGUsbil7Y29uc3RbbyxpXT10LFthLHJdPWUscz10aGlzLnRyYW5zZm9ybShvKSxsPXRoaXMudHJhbnNmb3JtKGkpO3JldHVybiB0aGlzLnVudHJhbnNmb3JtKChsLXMpLyhyLWErTnVtYmVyLkVQU0lMT04pKihuLWEpK3MpfW5pY2VEb21haW4odCl7Y29uc3RbZSxuXT10O2lmKGU+bil0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgaW5wdXQ6IG1pbiBpcyBsYXJnZXIgdGhhbiBtYXgiKTtjb25zdCBvPU1hdGgubWF4KGUsTnVtYmVyLk1JTl9WQUxVRSksaT1NYXRoLm1heChuLE51bWJlci5NSU5fVkFMVUUpO3JldHVybiBuPD0wP1tOdW1iZXIuTUlOX1ZBTFVFLDFdOltNYXRoLm1heChOdW1iZXIuTUlOX1ZBTFVFLC41Km8pLDIqaV19dGlja3ModCxlKXtjb25zdCBuPXRbMF08PTA/TnVtYmVyLk1JTl9WQUxVRTp0WzBdLG89dFsxXTw9MD9OdW1iZXIuTUlOX1ZBTFVFOnRbMV0saT1wZXQoKS5kb21haW4oW24sb10pLnRpY2tzKGUpO3JldHVybiBpLmxlbmd0aD9pOnR9aXNTYWZlTnVtYmVyKHQpe3JldHVybiBOdW1iZXIuaXNGaW5pdGUodCkmJnQ+MH19Y2xhc3Mgbml0e2NvbnN0cnVjdG9yKCl7dGhpcy5zY2FsZT1mb3QoKSx0aGlzLmRlZmF1bHRGb3JtYXR0ZXI9UW90fWZvcndhcmQodCxlLG4pe3JldHVybiB0aGlzLnNjYWxlLmRvbWFpbih0KS5yYW5nZShlKShuKX1yZXZlcnNlKHQsZSxuKXtyZXR1cm4gdGhpcy5zY2FsZS5kb21haW4odCkucmFuZ2UoZSkuaW52ZXJ0KG4pLmdldFRpbWUoKX1uaWNlRG9tYWluKHQpe2NvbnN0W2Usbl09dGhpcy5zY2FsZS5kb21haW4odCkubmljZSgpLmRvbWFpbigpO3JldHVybltlLmdldFRpbWUoKSxuLmdldFRpbWUoKV19dGlja3ModCxlKXtyZXR1cm4gdGhpcy5zY2FsZS5kb21haW4odCkudGlja3MoZSkubWFwKCh0PT50LmdldFRpbWUoKSkpfWlzU2FmZU51bWJlcih0KXtyZXR1cm4gTnVtYmVyLmlzRmluaXRlKHQpfX1jb25zdCBvaXQ9Qm9vbGVhbihzZWxmLmhhc093blByb3BlcnR5KCJkb2N1bWVudCIpJiZkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCJ3ZWJnbDIiKSk7ZnVuY3Rpb24gaWl0KCl7cmV0dXJuIHNlbGYuaGFzT3duUHJvcGVydHkoIk9mZnNjcmVlbkNhbnZhcyIpfWZ1bmN0aW9uIGFpdCh0LGUpe2lmKHQubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspaWYodFtuXSE9PWVbbl0pcmV0dXJuITE7cmV0dXJuITB9Y2xhc3Mgcml0e2NvbnN0cnVjdG9yKCl7dGhpcy54U2NhbGU9JG90KEoyLkxJTkVBUiksdGhpcy55U2NhbGU9JG90KEoyLkxJTkVBUiksdGhpcy5kb21Db250YWluZXJSZWN0PXt4OjAsd2lkdGg6MSx5OjAsaGVpZ2h0OjF9LHRoaXMubGFzdFVwZGF0ZWQ9MCx0aGlzLmN1cnJlbnRWaWV3Qm94UmVjdD17eDowLHdpZHRoOjEseTowLGhlaWdodDoxfX1nZXRVcGRhdGVJZGVudGlmaWVyKCl7cmV0dXJuIHRoaXMubGFzdFVwZGF0ZWR9dXBkYXRlSWRlbnRpZmllcigpe3RoaXMubGFzdFVwZGF0ZWQrK31pc1lBeGlzUG9pbnRlZERvd24oKXtyZXR1cm4hMH1zZXRYU2NhbGUodCl7dGhpcy54U2NhbGU9dCx0aGlzLnVwZGF0ZUlkZW50aWZpZXIoKX1zZXRZU2NhbGUodCl7dGhpcy55U2NhbGU9dCx0aGlzLnVwZGF0ZUlkZW50aWZpZXIoKX1nZXRDdXJyZW50Vmlld0JveFJlY3QoKXtyZXR1cm4gdGhpcy5jdXJyZW50Vmlld0JveFJlY3R9c2V0Vmlld0JveFJlY3QodCl7dGhpcy5jdXJyZW50Vmlld0JveFJlY3Q9dCx0aGlzLnVwZGF0ZUlkZW50aWZpZXIoKX1zZXREb21Db250YWluZXJSZWN0KHQpe3RoaXMuZG9tQ29udGFpbmVyUmVjdD10LHRoaXMudXBkYXRlSWRlbnRpZmllcigpfXRyYW5zZm9ybURhdGFUb1VpQ29vcmQodCxlKXtjb25zdCBuPXQsbz0oZnVuY3Rpb24gaSh0KXtyZXR1cm57eDpbdC54LHQueCt0LndpZHRoXSx5Olt0LnksdC55K3QuaGVpZ2h0XX19KSh0aGlzLmN1cnJlbnRWaWV3Qm94UmVjdCk7cmV0dXJuW3RoaXMueFNjYWxlLmZvcndhcmQoby54LFtuLngsbi54K24ud2lkdGhdLGVbMF0pLHRoaXMueVNjYWxlLmZvcndhcmQoby55LHRoaXMuaXNZQXhpc1BvaW50ZWREb3duKCk/W24ueStuLmhlaWdodCxuLnldOltuLnksbi55K24uaGVpZ2h0XSxlWzFdKV19fWZ1bmN0aW9uIHNpdCh0LGUsbixvKXtjb25zdHtjb2xvcjppLHZpc2libGU6YSxvcGFjaXR5OnJ9PW87bGV0IHM9dDtpZihzKXtpZighYSlyZXR1cm4gcy5zdHlsZS5kaXNwbGF5PSJub25lIixzfWVsc2V7aWYoIWEpcmV0dXJuIG51bGw7cz1lKCl9cmV0dXJuIHM9bihzKSxzLnN0eWxlLmRpc3BsYXk9IiIscy5zdHlsZS5zdHJva2U9aSxzLnN0eWxlLm9wYWNpdHk9U3RyaW5nKG51bGwhPXI/cjoxKSxzfWNsYXNzIGxpdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN2Zz10fWZsdXNoKCl7fW9uUmVzaXplKHQpe31kZXN0cm95T2JqZWN0KHQpe3RoaXMuc3ZnLnJlbW92ZUNoaWxkKHQuZG9tKX1zZXRVc2VEYXJrTW9kZSh0KXt9Y3JlYXRlUGF0aERTdHJpbmcodCl7aWYoIXQubGVuZ3RoKXJldHVybiIiO2NvbnN0IGU9bmV3IEFycmF5KHQubGVuZ3RoLzIpO2VbMF09YE0ke3RbMF19LCR7dFsxXX1gO2ZvcihsZXQgbj0xO248dC5sZW5ndGgvMjtuKyspZVtuXT1gTCR7dFsyKm5dfSwke3RbMipuKzFdfWA7cmV0dXJuIGUuam9pbigiIil9Y3JlYXRlT3JVcGRhdGVMaW5lT2JqZWN0KHQsZSxuKXtjb25zdCBvPXNpdChudWxsPT10P3ZvaWQgMDp0LmRvbSwoKCk9Pntjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJwYXRoIik7dC5zdHlsZS5maWxsPSJub25lIjtjb25zdCBuPXRoaXMuY3JlYXRlUGF0aERTdHJpbmcoZSk7cmV0dXJuIHQuc2V0QXR0cmlidXRlKCJkIixuKSx0aGlzLnN2Zy5hcHBlbmRDaGlsZCh0KSx0fSksKG49PntpZighKG51bGw9PXQ/dm9pZCAwOnQuZGF0YSl8fCFhaXQoZSxudWxsPT10P3ZvaWQgMDp0LmRhdGEpKXtjb25zdCB0PXRoaXMuY3JlYXRlUGF0aERTdHJpbmcoZSk7bi5zZXRBdHRyaWJ1dGUoImQiLHQpfXJldHVybiBufSksbik7cmV0dXJuIG51bGw9PT1vP251bGw6KG8uc3R5bGUuc3Ryb2tlV2lkdGg9U3RyaW5nKG4ud2lkdGgpLHtkb206byxkYXRhOmV9KX1jcmVhdGVPclVwZGF0ZVRyaWFuZ2xlT2JqZWN0KHQsZSxuKXtjb25zdHtzaXplOm8sY29sb3I6aX09bixhPW8qTWF0aC5zcXJ0KDMpLzIscj1uZXcgRmxvYXQzMkFycmF5KFtlLngtby8yLGUueSthLzMsZS54K28vMixlLnkrYS8zLGUueCxlLnktMiphLzNdKSxzPXNpdChudWxsPT10P3ZvaWQgMDp0LmRvbSwoKCk9Pntjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJwYXRoIik7dC5jbGFzc0xpc3QuYWRkKCJ0cmlhbmdsZSIpLHQuc3R5bGUuZmlsbD0ibm9uZSI7Y29uc3QgZT10aGlzLmNyZWF0ZVBhdGhEU3RyaW5nKHIpO3JldHVybiB0LnNldEF0dHJpYnV0ZSgiZCIsZSsiWiIpLHRoaXMuc3ZnLmFwcGVuZENoaWxkKHQpLHR9KSwodD0+e2NvbnN0IGU9dGhpcy5jcmVhdGVQYXRoRFN0cmluZyhyKTtyZXR1cm4gdC5zZXRBdHRyaWJ1dGUoImQiLGUrIloiKSx0fSksbik7cmV0dXJuIG51bGw9PT1zP251bGw6KHMuc3R5bGUuZmlsbD1pLHtkb206cyxkYXRhOnJ9KX1jcmVhdGVPclVwZGF0ZUNpcmNsZU9iamVjdCh0LGUsbil7Y29uc3R7Y29sb3I6byxyYWRpdXM6aX09bixhPXNpdChudWxsPT10P3ZvaWQgMDp0LmRvbSwoKCk9Pntjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJjaXJjbGUiKTtyZXR1cm4gdC5zdHlsZS5maWxsPW8sdC5zZXRBdHRyaWJ1dGUoImN4IixTdHJpbmcoZS54KSksdC5zZXRBdHRyaWJ1dGUoImN5IixTdHJpbmcoZS55KSksdC5zZXRBdHRyaWJ1dGUoInIiLFN0cmluZyhpKSksdGhpcy5zdmcuYXBwZW5kQ2hpbGQodCksdH0pLCh0PT4odC5zdHlsZS5maWxsPW8sdC5zZXRBdHRyaWJ1dGUoImN4IixTdHJpbmcoZS54KSksdC5zZXRBdHRyaWJ1dGUoImN5IixTdHJpbmcoZS55KSksdC5zZXRBdHRyaWJ1dGUoInIiLFN0cmluZyhpKSksdCkpLG4pO3JldHVybiBudWxsPT09YT9udWxsOntkb206YSxkYXRhOmV9fWNyZWF0ZU9yVXBkYXRlVHJhcGV6b2lkT2JqZWN0KHQsZSxuLG8pe2lmKGUueSE9PW4ueSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5wdXQgZXJyb3I6IHN0YXJ0LnkgIT0gZW5kLnkuIik7Y29uc3R7YWx0aXR1ZGU6aSxjb2xvcjphfT1vLHI9Mi9NYXRoLnNxcnQoMykqaSxzPW5ldyBGbG9hdDMyQXJyYXkoW2UueC1yLzIsZS55K2kvMixlLngsZS55LWkvMixuLngsbi55LWkvMixuLngrci8yLG4ueStpLzJdKSxsPXNpdChudWxsPT10P3ZvaWQgMDp0LmRvbSwoKCk9Pntjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJwYXRoIik7dC5jbGFzc0xpc3QuYWRkKCJ0cmFwZXpvaWQiKSx0LnN0eWxlLmZpbGw9Im5vbmUiO2NvbnN0IGU9dGhpcy5jcmVhdGVQYXRoRFN0cmluZyhzKTtyZXR1cm4gdC5zZXRBdHRyaWJ1dGUoImQiLGUrIloiKSx0aGlzLnN2Zy5hcHBlbmRDaGlsZCh0KSx0fSksKHQ9Pntjb25zdCBlPXRoaXMuY3JlYXRlUGF0aERTdHJpbmcocyk7cmV0dXJuIHQuc2V0QXR0cmlidXRlKCJkIixlKyJaIiksdH0pLG8pO3JldHVybiBudWxsPT09bD9udWxsOihsLnN0eWxlLmZpbGw9YSx7ZG9tOmwsZGF0YTpzfSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgMjAxMC0yMDIxIFRocmVlLmpzIEF1dGhvcnMKICAgICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICAgICAqL2NvbnN0IGNpdD0xMDAsZGl0PTMwMSxwaXQ9MzAyLG1pdD0zMDYsdWl0PTFlMyxmaXQ9MTAwMSxnaXQ9MTAwMixoaXQ9MTAwMyxiaXQ9MTAwNix5aXQ9MTAwOCxfaXQ9MTAwOSxDaXQ9MTAxMixNaXQ9MTAxNCx2aXQ9MTAxNSx4aXQ9MTAxNixPaXQ9MTAyMCxQaXQ9MTAyMix3aXQ9MTAyMyxraXQ9MTAyNixTaXQ9MTAyNyxEaXQ9MjMwMCxFaXQ9MjMwMSxSaXQ9MjMwMixBaXQ9MjQwMCxUaXQ9MjQwMSxOaXQ9MjQwMix6aXQ9M2UzLElpdD0zMDAxLEhpdD0zMDA3LEZpdD0zMDAyLExpdD03NjgwLEJpdD0zNTA0NCxWaXQ9MzUwNDgsaml0PSIzMDAgZXMiO2NsYXNzIFVpdHthZGRFdmVudExpc3RlbmVyKHQsZSl7dm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzJiYodGhpcy5fbGlzdGVuZXJzPXt9KTtjb25zdCBuPXRoaXMuX2xpc3RlbmVyczt2b2lkIDA9PT1uW3RdJiYoblt0XT1bXSksLTE9PT1uW3RdLmluZGV4T2YoZSkmJm5bdF0ucHVzaChlKX1oYXNFdmVudExpc3RlbmVyKHQsZSl7aWYodm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzKXJldHVybiExO2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzO3JldHVybiB2b2lkIDAhPT1uW3RdJiYtMSE9PW5bdF0uaW5kZXhPZihlKX1yZW1vdmVFdmVudExpc3RlbmVyKHQsZSl7aWYodm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzKXJldHVybjtjb25zdCBuPXRoaXMuX2xpc3RlbmVyc1t0XTtpZih2b2lkIDAhPT1uKXtjb25zdCB0PW4uaW5kZXhPZihlKTstMSE9PXQmJm4uc3BsaWNlKHQsMSl9fWRpc3BhdGNoRXZlbnQodCl7aWYodm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzKXJldHVybjtjb25zdCBlPXRoaXMuX2xpc3RlbmVyc1t0LnR5cGVdO2lmKHZvaWQgMCE9PWUpe3QudGFyZ2V0PXRoaXM7Y29uc3Qgbj1lLnNsaWNlKDApO2ZvcihsZXQgZT0wLG89bi5sZW5ndGg7ZTxvO2UrKyluW2VdLmNhbGwodGhpcyx0KTt0LnRhcmdldD1udWxsfX19Y29uc3QgR2l0PVtdO2ZvcihsZXQgdD0wO3Q8MjU2O3QrKylHaXRbdF09KHQ8MTY/IjAiOiIiKSt0LnRvU3RyaW5nKDE2KTtjb25zdCBXaXQ9TWF0aC5QSS8xODAsWWl0PTE4MC9NYXRoLlBJO2Z1bmN0aW9uIHFpdCgpe2NvbnN0IHQ9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAsZT00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxuPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLG89NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDA7cmV0dXJuKEdpdFsyNTUmdF0rR2l0W3Q+PjgmMjU1XStHaXRbdD4+MTYmMjU1XStHaXRbdD4+MjQmMjU1XSsiLSIrR2l0WzI1NSZlXStHaXRbZT4+OCYyNTVdKyItIitHaXRbZT4+MTYmMTV8NjRdK0dpdFtlPj4yNCYyNTVdKyItIitHaXRbNjMmbnwxMjhdK0dpdFtuPj44JjI1NV0rIi0iK0dpdFtuPj4xNiYyNTVdK0dpdFtuPj4yNCYyNTVdK0dpdFsyNTUmb10rR2l0W28+PjgmMjU1XStHaXRbbz4+MTYmMjU1XStHaXRbbz4+MjQmMjU1XSkudG9VcHBlckNhc2UoKX1mdW5jdGlvbiBaaXQodCxlLG4pe3JldHVybiBNYXRoLm1heChlLE1hdGgubWluKG4sdCkpfWZ1bmN0aW9uIFhpdCh0LGUsbil7cmV0dXJuKDEtbikqdCtuKmV9ZnVuY3Rpb24gS2l0KHQpe3JldHVybiAwPT0odCZ0LTEpJiYwIT09dH1mdW5jdGlvbiBKaXQodCl7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMikpfWNsYXNzIFFpdHtjb25zdHJ1Y3Rvcih0PTAsZT0wKXt0aGlzLng9dCx0aGlzLnk9ZX1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpcy54fXNldCB3aWR0aCh0KXt0aGlzLng9dH1nZXQgaGVpZ2h0KCl7cmV0dXJuIHRoaXMueX1zZXQgaGVpZ2h0KHQpe3RoaXMueT10fXNldCh0LGUpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Q29tcG9uZW50KHQsZSl7c3dpdGNoKHQpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnkpfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzfWFkZCh0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmFkZFZlY3RvcnModCxlKSk6KHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXMpfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXN9c3ViKHQsZSl7cmV0dXJuIHZvaWQgMCE9PWU/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuc3ViVmVjdG9ycyh0LGUpKToodGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcyl9c3ViU2NhbGFyKHQpe3JldHVybiB0aGlzLngtPXQsdGhpcy55LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXN9ZGl2aWRlKHQpe3JldHVybiB0aGlzLngvPXQueCx0aGlzLnkvPXQueSx0aGlzfWRpdmlkZVNjYWxhcih0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigxL3QpfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxvPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1vWzBdKmUrb1szXSpuK29bNl0sdGhpcy55PW9bMV0qZStvWzRdKm4rb1s3XSx0aGlzfW1pbih0KXtyZXR1cm4gdGhpcy54PU1hdGgubWluKHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1pbih0aGlzLnksdC55KSx0aGlzfW1heCh0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksdC55KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LngsTWF0aC5taW4oZS54LHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LnksTWF0aC5taW4oZS55LHRoaXMueSkpLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueSkpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KHQsTWF0aC5taW4oZSxuKSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD10aGlzLng8MD9NYXRoLmNlaWwodGhpcy54KTpNYXRoLmZsb29yKHRoaXMueCksdGhpcy55PXRoaXMueTwwP01hdGguY2VpbCh0aGlzLnkpOk1hdGguZmxvb3IodGhpcy55KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55fWNyb3NzKHQpe3JldHVybiB0aGlzLngqdC55LXRoaXMueSp0Lnh9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55KX1tYW5oYXR0YW5MZW5ndGgoKXtyZXR1cm4gTWF0aC5hYnModGhpcy54KStNYXRoLmFicyh0aGlzLnkpfW5vcm1hbGl6ZSgpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX1hbmdsZSgpe3JldHVybiBNYXRoLmF0YW4yKC10aGlzLnksLXRoaXMueCkrTWF0aC5QSX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LG49dGhpcy55LXQueTtyZXR1cm4gZSplK24qbn1tYW5oYXR0YW5EaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLngtdC54KStNYXRoLmFicyh0aGlzLnktdC55KX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsbil7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKm4sdGhpcy55PXQueSsoZS55LXQueSkqbix0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnl9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUsbil7cmV0dXJuIHZvaWQgMCE9PW4mJmNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpLHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzfXJvdGF0ZUFyb3VuZCh0LGUpe2NvbnN0IG49TWF0aC5jb3MoZSksbz1NYXRoLnNpbihlKSxpPXRoaXMueC10LngsYT10aGlzLnktdC55O3JldHVybiB0aGlzLng9aSpuLWEqbyt0LngsdGhpcy55PWkqbythKm4rdC55LHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXN9fVFpdC5wcm90b3R5cGUuaXNWZWN0b3IyPSEwO2NsYXNzICRpdHtjb25zdHJ1Y3Rvcigpe3RoaXMuZWxlbWVudHM9WzEsMCwwLDAsMSwwLDAsMCwxXSxhcmd1bWVudHMubGVuZ3RoPjAmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDM6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuIil9c2V0KHQsZSxuLG8saSxhLHIscyxsKXtjb25zdCBjPXRoaXMuZWxlbWVudHM7cmV0dXJuIGNbMF09dCxjWzFdPW8sY1syXT1yLGNbM109ZSxjWzRdPWksY1s1XT1zLGNbNl09bixjWzddPWEsY1s4XT1sLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwxLDAsMCwwLDEpLHRoaXN9Y29weSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO3JldHVybiBlWzBdPW5bMF0sZVsxXT1uWzFdLGVbMl09blsyXSxlWzNdPW5bM10sZVs0XT1uWzRdLGVbNV09bls1XSxlWzZdPW5bNl0sZVs3XT1uWzddLGVbOF09bls4XSx0aGlzfWV4dHJhY3RCYXNpcyh0LGUsbil7cmV0dXJuIHQuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywwKSxlLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMSksbi5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDIpLHRoaXN9c2V0RnJvbU1hdHJpeDQodCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnNldChlWzBdLGVbNF0sZVs4XSxlWzFdLGVbNV0sZVs5XSxlWzJdLGVbNl0sZVsxMF0pLHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLHQpfXByZW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModCx0aGlzKX1tdWx0aXBseU1hdHJpY2VzKHQsZSl7Y29uc3Qgbj10LmVsZW1lbnRzLG89ZS5lbGVtZW50cyxpPXRoaXMuZWxlbWVudHMsYT1uWzBdLHI9blszXSxzPW5bNl0sbD1uWzFdLGM9bls0XSxkPW5bN10scD1uWzJdLG09bls1XSx1PW5bOF0sZj1vWzBdLGc9b1szXSxoPW9bNl0sYj1vWzFdLHk9b1s0XSxfPW9bN10sQz1vWzJdLE09b1s1XSx2PW9bOF07cmV0dXJuIGlbMF09YSpmK3IqYitzKkMsaVszXT1hKmcrcip5K3MqTSxpWzZdPWEqaCtyKl8rcyp2LGlbMV09bCpmK2MqYitkKkMsaVs0XT1sKmcrYyp5K2QqTSxpWzddPWwqaCtjKl8rZCp2LGlbMl09cCpmK20qYit1KkMsaVs1XT1wKmcrbSp5K3UqTSxpWzhdPXAqaCttKl8rdSp2LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbM10qPXQsZVs2XSo9dCxlWzFdKj10LGVbNF0qPXQsZVs3XSo9dCxlWzJdKj10LGVbNV0qPXQsZVs4XSo9dCx0aGlzfWRldGVybWluYW50KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbMV0sbz10WzJdLGk9dFszXSxhPXRbNF0scj10WzVdLHM9dFs2XSxsPXRbN10sYz10WzhdO3JldHVybiBlKmEqYy1lKnIqbC1uKmkqYytuKnIqcytvKmkqbC1vKmEqc31pbnZlcnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFsxXSxvPXRbMl0saT10WzNdLGE9dFs0XSxyPXRbNV0scz10WzZdLGw9dFs3XSxjPXRbOF0sZD1jKmEtcipsLHA9cipzLWMqaSxtPWwqaS1hKnMsdT1lKmQrbipwK28qbTtpZigwPT09dSlyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDApO2NvbnN0IGY9MS91O3JldHVybiB0WzBdPWQqZix0WzFdPShvKmwtYypuKSpmLHRbMl09KHIqbi1vKmEpKmYsdFszXT1wKmYsdFs0XT0oYyplLW8qcykqZix0WzVdPShvKmktciplKSpmLHRbNl09bSpmLHRbN109KG4qcy1sKmUpKmYsdFs4XT0oYSplLW4qaSkqZix0aGlzfXRyYW5zcG9zZSgpe2xldCB0O2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gdD1lWzFdLGVbMV09ZVszXSxlWzNdPXQsdD1lWzJdLGVbMl09ZVs2XSxlWzZdPXQsdD1lWzVdLGVbNV09ZVs3XSxlWzddPXQsdGhpc31nZXROb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeDQodCkuaW52ZXJ0KCkudHJhbnNwb3NlKCl9dHJhbnNwb3NlSW50b0FycmF5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVszXSx0WzJdPWVbNl0sdFszXT1lWzFdLHRbNF09ZVs0XSx0WzVdPWVbN10sdFs2XT1lWzJdLHRbN109ZVs1XSx0WzhdPWVbOF0sdGhpc31zZXRVdlRyYW5zZm9ybSh0LGUsbixvLGksYSxyKXtjb25zdCBzPU1hdGguY29zKGkpLGw9TWF0aC5zaW4oaSk7cmV0dXJuIHRoaXMuc2V0KG4qcyxuKmwsLW4qKHMqYStsKnIpK2ErdCwtbypsLG8qcywtbyooLWwqYStzKnIpK3IrZSwwLDAsMSksdGhpc31zY2FsZSh0LGUpe2NvbnN0IG49dGhpcy5lbGVtZW50cztyZXR1cm4gblswXSo9dCxuWzNdKj10LG5bNl0qPXQsblsxXSo9ZSxuWzRdKj1lLG5bN10qPWUsdGhpc31yb3RhdGUodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpLG89dGhpcy5lbGVtZW50cyxpPW9bMF0sYT1vWzNdLHI9b1s2XSxzPW9bMV0sbD1vWzRdLGM9b1s3XTtyZXR1cm4gb1swXT1lKmkrbipzLG9bM109ZSphK24qbCxvWzZdPWUqcituKmMsb1sxXT0tbippK2UqcyxvWzRdPS1uKmErZSpsLG9bN109LW4qcitlKmMsdGhpc310cmFuc2xhdGUodCxlKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIG5bMF0rPXQqblsyXSxuWzNdKz10Km5bNV0sbls2XSs9dCpuWzhdLG5bMV0rPWUqblsyXSxuWzRdKz1lKm5bNV0sbls3XSs9ZSpuWzhdLHRoaXN9ZXF1YWxzKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7Zm9yKGxldCB0PTA7dDw5O3QrKylpZihlW3RdIT09blt0XSlyZXR1cm4hMTtyZXR1cm4hMH1mcm9tQXJyYXkodCxlPTApe2ZvcihsZXQgbj0wO248OTtuKyspdGhpcy5lbGVtZW50c1tuXT10W24rZV07cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO3JldHVybiB0W2VdPW5bMF0sdFtlKzFdPW5bMV0sdFtlKzJdPW5bMl0sdFtlKzNdPW5bM10sdFtlKzRdPW5bNF0sdFtlKzVdPW5bNV0sdFtlKzZdPW5bNl0sdFtlKzddPW5bN10sdFtlKzhdPW5bOF0sdH1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfX1sZXQgdGF0OyRpdC5wcm90b3R5cGUuaXNNYXRyaXgzPSEwO2NsYXNzIGVhdHtzdGF0aWMgZ2V0RGF0YVVSTCh0KXtpZigvXmRhdGE6L2kudGVzdCh0LnNyYykpcmV0dXJuIHQuc3JjO2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQpcmV0dXJuIHQuc3JjO2xldCBlO2lmKHQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCllPXQ7ZWxzZXt2b2lkIDA9PT10YXQmJih0YXQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiY2FudmFzIikpLHRhdC53aWR0aD10LndpZHRoLHRhdC5oZWlnaHQ9dC5oZWlnaHQ7Y29uc3Qgbj10YXQuZ2V0Q29udGV4dCgiMmQiKTt0IGluc3RhbmNlb2YgSW1hZ2VEYXRhP24ucHV0SW1hZ2VEYXRhKHQsMCwwKTpuLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KSxlPXRhdH1yZXR1cm4gZS53aWR0aD4yMDQ4fHxlLmhlaWdodD4yMDQ4Pyhjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlVXRpbHMuZ2V0RGF0YVVSTDogSW1hZ2UgY29udmVydGVkIHRvIGpwZyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyIsdCksZS50b0RhdGFVUkwoImltYWdlL2pwZWciLC42KSk6ZS50b0RhdGFVUkwoImltYWdlL3BuZyIpfX1sZXQgbmF0PTA7Y2xhc3Mgb2F0IGV4dGVuZHMgVWl0e2NvbnN0cnVjdG9yKHQ9b2F0LkRFRkFVTFRfSU1BR0UsZT1vYXQuREVGQVVMVF9NQVBQSU5HLG49MTAwMSxvPTEwMDEsaT0xMDA2LGE9MTAwOCxyPTEwMjMscz0xMDA5LGw9MSxjPTNlMyl7c3VwZXIoKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpuYXQrK30pLHRoaXMudXVpZD1xaXQoKSx0aGlzLm5hbWU9IiIsdGhpcy5pbWFnZT10LHRoaXMubWlwbWFwcz1bXSx0aGlzLm1hcHBpbmc9ZSx0aGlzLndyYXBTPW4sdGhpcy53cmFwVD1vLHRoaXMubWFnRmlsdGVyPWksdGhpcy5taW5GaWx0ZXI9YSx0aGlzLmFuaXNvdHJvcHk9bCx0aGlzLmZvcm1hdD1yLHRoaXMuaW50ZXJuYWxGb3JtYXQ9bnVsbCx0aGlzLnR5cGU9cyx0aGlzLm9mZnNldD1uZXcgUWl0KDAsMCksdGhpcy5yZXBlYXQ9bmV3IFFpdCgxLDEpLHRoaXMuY2VudGVyPW5ldyBRaXQoMCwwKSx0aGlzLnJvdGF0aW9uPTAsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPSEwLHRoaXMubWF0cml4PW5ldyAkaXQsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITAsdGhpcy5wcmVtdWx0aXBseUFscGhhPSExLHRoaXMuZmxpcFk9ITAsdGhpcy51bnBhY2tBbGlnbm1lbnQ9NCx0aGlzLmVuY29kaW5nPWMsdGhpcy52ZXJzaW9uPTAsdGhpcy5vblVwZGF0ZT1udWxsLHRoaXMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSExfXVwZGF0ZU1hdHJpeCgpe3RoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKHRoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueSx0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnksdGhpcy5yb3RhdGlvbix0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnkpfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMubmFtZT10Lm5hbWUsdGhpcy5pbWFnZT10LmltYWdlLHRoaXMubWlwbWFwcz10Lm1pcG1hcHMuc2xpY2UoMCksdGhpcy5tYXBwaW5nPXQubWFwcGluZyx0aGlzLndyYXBTPXQud3JhcFMsdGhpcy53cmFwVD10LndyYXBULHRoaXMubWFnRmlsdGVyPXQubWFnRmlsdGVyLHRoaXMubWluRmlsdGVyPXQubWluRmlsdGVyLHRoaXMuYW5pc290cm9weT10LmFuaXNvdHJvcHksdGhpcy5mb3JtYXQ9dC5mb3JtYXQsdGhpcy5pbnRlcm5hbEZvcm1hdD10LmludGVybmFsRm9ybWF0LHRoaXMudHlwZT10LnR5cGUsdGhpcy5vZmZzZXQuY29weSh0Lm9mZnNldCksdGhpcy5yZXBlYXQuY29weSh0LnJlcGVhdCksdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5yb3RhdGlvbj10LnJvdGF0aW9uLHRoaXMubWF0cml4QXV0b1VwZGF0ZT10Lm1hdHJpeEF1dG9VcGRhdGUsdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5nZW5lcmF0ZU1pcG1hcHM9dC5nZW5lcmF0ZU1pcG1hcHMsdGhpcy5wcmVtdWx0aXBseUFscGhhPXQucHJlbXVsdGlwbHlBbHBoYSx0aGlzLmZsaXBZPXQuZmxpcFksdGhpcy51bnBhY2tBbGlnbm1lbnQ9dC51bnBhY2tBbGlnbm1lbnQsdGhpcy5lbmNvZGluZz10LmVuY29kaW5nLHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9dm9pZCAwPT09dHx8InN0cmluZyI9PXR5cGVvZiB0O2lmKCFlJiZ2b2lkIDAhPT10LnRleHR1cmVzW3RoaXMudXVpZF0pcmV0dXJuIHQudGV4dHVyZXNbdGhpcy51dWlkXTtjb25zdCBuPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiVGV4dHVyZSIsZ2VuZXJhdG9yOiJUZXh0dXJlLnRvSlNPTiJ9LHV1aWQ6dGhpcy51dWlkLG5hbWU6dGhpcy5uYW1lLG1hcHBpbmc6dGhpcy5tYXBwaW5nLHJlcGVhdDpbdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55XSxvZmZzZXQ6W3RoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueV0sY2VudGVyOlt0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnldLHJvdGF0aW9uOnRoaXMucm90YXRpb24sd3JhcDpbdGhpcy53cmFwUyx0aGlzLndyYXBUXSxmb3JtYXQ6dGhpcy5mb3JtYXQsdHlwZTp0aGlzLnR5cGUsZW5jb2Rpbmc6dGhpcy5lbmNvZGluZyxtaW5GaWx0ZXI6dGhpcy5taW5GaWx0ZXIsbWFnRmlsdGVyOnRoaXMubWFnRmlsdGVyLGFuaXNvdHJvcHk6dGhpcy5hbmlzb3Ryb3B5LGZsaXBZOnRoaXMuZmxpcFkscHJlbXVsdGlwbHlBbHBoYTp0aGlzLnByZW11bHRpcGx5QWxwaGEsdW5wYWNrQWxpZ25tZW50OnRoaXMudW5wYWNrQWxpZ25tZW50fTtpZih2b2lkIDAhPT10aGlzLmltYWdlKXtjb25zdCBvPXRoaXMuaW1hZ2U7aWYodm9pZCAwPT09by51dWlkJiYoby51dWlkPXFpdCgpKSwhZSYmdm9pZCAwPT09dC5pbWFnZXNbby51dWlkXSl7bGV0IGU7aWYoQXJyYXkuaXNBcnJheShvKSl7ZT1bXTtmb3IobGV0IHQ9MCxuPW8ubGVuZ3RoO3Q8bjt0KyspZS5wdXNoKGlhdChvW3RdLmlzRGF0YVRleHR1cmU/b1t0XS5pbWFnZTpvW3RdKSl9ZWxzZSBlPWlhdChvKTt0LmltYWdlc1tvLnV1aWRdPXt1dWlkOm8udXVpZCx1cmw6ZX19bi5pbWFnZT1vLnV1aWR9cmV0dXJuIGV8fCh0LnRleHR1cmVzW3RoaXMudXVpZF09biksbn1kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXRyYW5zZm9ybVV2KHQpe2lmKDMwMCE9PXRoaXMubWFwcGluZylyZXR1cm4gdDtpZih0LmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCksdC54PDB8fHQueD4xKXN3aXRjaCh0aGlzLndyYXBTKXtjYXNlIHVpdDp0Lng9dC54LU1hdGguZmxvb3IodC54KTticmVhaztjYXNlIGZpdDp0Lng9dC54PDA/MDoxO2JyZWFrO2Nhc2UgZ2l0OnQueD0xPT09TWF0aC5hYnMoTWF0aC5mbG9vcih0LngpJTIpP01hdGguY2VpbCh0LngpLXQueDp0LngtTWF0aC5mbG9vcih0LngpfWlmKHQueTwwfHx0Lnk+MSlzd2l0Y2godGhpcy53cmFwVCl7Y2FzZSB1aXQ6dC55PXQueS1NYXRoLmZsb29yKHQueSk7YnJlYWs7Y2FzZSBmaXQ6dC55PXQueTwwPzA6MTticmVhaztjYXNlIGdpdDp0Lnk9MT09PU1hdGguYWJzKE1hdGguZmxvb3IodC55KSUyKT9NYXRoLmNlaWwodC55KS10Lnk6dC55LU1hdGguZmxvb3IodC55KX1yZXR1cm4gdGhpcy5mbGlwWSYmKHQueT0xLXQueSksdH1zZXQgbmVlZHNVcGRhdGUodCl7ITA9PT10JiZ0aGlzLnZlcnNpb24rK319ZnVuY3Rpb24gaWF0KHQpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTEltYWdlRWxlbWVudCYmdCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fCJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8InVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZUJpdG1hcCYmdCBpbnN0YW5jZW9mIEltYWdlQml0bWFwP2VhdC5nZXREYXRhVVJMKHQpOnQuZGF0YT97ZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0LmRhdGEpLHdpZHRoOnQud2lkdGgsaGVpZ2h0OnQuaGVpZ2h0LHR5cGU6dC5kYXRhLmNvbnN0cnVjdG9yLm5hbWV9Oihjb25zb2xlLndhcm4oIlRIUkVFLlRleHR1cmU6IFVuYWJsZSB0byBzZXJpYWxpemUgVGV4dHVyZS4iKSx7fSl9b2F0LkRFRkFVTFRfSU1BR0U9dm9pZCAwLG9hdC5ERUZBVUxUX01BUFBJTkc9MzAwLG9hdC5wcm90b3R5cGUuaXNUZXh0dXJlPSEwO2NsYXNzIGFhdHtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCxvPTEpe3RoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXMudz1vfWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnp9c2V0IHdpZHRoKHQpe3RoaXMuej10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy53fXNldCBoZWlnaHQodCl7dGhpcy53PXR9c2V0KHQsZSxuLG8pe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzLnc9byx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpcy53PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRXKHQpe3JldHVybiB0aGlzLnc9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztjYXNlIDM6dGhpcy53PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2Nhc2UgMzpyZXR1cm4gdGhpcy53O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56LHRoaXMudyl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXMuej10LnosdGhpcy53PXZvaWQgMCE9PXQudz90Lnc6MSx0aGlzfWFkZCh0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmFkZFZlY3RvcnModCxlKSk6KHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXMueis9dC56LHRoaXMudys9dC53LHRoaXMpfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzLnorPXQsdGhpcy53Kz10LHRoaXN9YWRkVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54K2UueCx0aGlzLnk9dC55K2UueSx0aGlzLno9dC56K2Uueix0aGlzLnc9dC53K2Uudyx0aGlzfWFkZFNjYWxlZFZlY3Rvcih0LGUpe3JldHVybiB0aGlzLngrPXQueCplLHRoaXMueSs9dC55KmUsdGhpcy56Kz10LnoqZSx0aGlzLncrPXQudyplLHRoaXN9c3ViKHQsZSl7cmV0dXJuIHZvaWQgMCE9PWU/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yNDogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuc3ViVmVjdG9ycyh0LGUpKToodGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpcy53LT10LncsdGhpcyl9c3ViU2NhbGFyKHQpe3JldHVybiB0aGlzLngtPXQsdGhpcy55LT10LHRoaXMuei09dCx0aGlzLnctPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXMuej10LnotZS56LHRoaXMudz10LnctZS53LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXMueio9dC56LHRoaXMudyo9dC53LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpcy56Kj10LHRoaXMudyo9dCx0aGlzfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxvPXRoaXMueixpPXRoaXMudyxhPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1hWzBdKmUrYVs0XSpuK2FbOF0qbythWzEyXSppLHRoaXMueT1hWzFdKmUrYVs1XSpuK2FbOV0qbythWzEzXSppLHRoaXMuej1hWzJdKmUrYVs2XSpuK2FbMTBdKm8rYVsxNF0qaSx0aGlzLnc9YVszXSplK2FbN10qbithWzExXSpvK2FbMTVdKmksdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1zZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbih0KXt0aGlzLnc9MipNYXRoLmFjb3ModC53KTtjb25zdCBlPU1hdGguc3FydCgxLXQudyp0LncpO3JldHVybiBlPDFlLTQ/KHRoaXMueD0xLHRoaXMueT0wLHRoaXMuej0wKToodGhpcy54PXQueC9lLHRoaXMueT10LnkvZSx0aGlzLno9dC56L2UpLHRoaXN9c2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4KHQpe2xldCBlLG4sbyxpO2NvbnN0IGE9LjAxLHI9LjEscz10LmVsZW1lbnRzLGw9c1swXSxjPXNbNF0sZD1zWzhdLHA9c1sxXSxtPXNbNV0sdT1zWzldLGY9c1syXSxnPXNbNl0saD1zWzEwXTtpZihNYXRoLmFicyhjLXApPGEmJk1hdGguYWJzKGQtZik8YSYmTWF0aC5hYnModS1nKTxhKXtpZihNYXRoLmFicyhjK3ApPHImJk1hdGguYWJzKGQrZik8ciYmTWF0aC5hYnModStnKTxyJiZNYXRoLmFicyhsK20raC0zKTxyKXJldHVybiB0aGlzLnNldCgxLDAsMCwwKSx0aGlzO2U9TWF0aC5QSTtjb25zdCB0PShsKzEpLzIscz0obSsxKS8yLGI9KGgrMSkvMix5PShjK3ApLzQsXz0oZCtmKS80LEM9KHUrZykvNDtyZXR1cm4gdD5zJiZ0PmI/dDxhPyhuPTAsbz0uNzA3MTA2NzgxLGk9LjcwNzEwNjc4MSk6KG49TWF0aC5zcXJ0KHQpLG89eS9uLGk9Xy9uKTpzPmI/czxhPyhuPS43MDcxMDY3ODEsbz0wLGk9LjcwNzEwNjc4MSk6KG89TWF0aC5zcXJ0KHMpLG49eS9vLGk9Qy9vKTpiPGE/KG49LjcwNzEwNjc4MSxvPS43MDcxMDY3ODEsaT0wKTooaT1NYXRoLnNxcnQoYiksbj1fL2ksbz1DL2kpLHRoaXMuc2V0KG4sbyxpLGUpLHRoaXN9bGV0IGI9TWF0aC5zcXJ0KChnLXUpKihnLXUpKyhkLWYpKihkLWYpKyhwLWMpKihwLWMpKTtyZXR1cm4gTWF0aC5hYnMoYik8LjAwMSYmKGI9MSksdGhpcy54PShnLXUpL2IsdGhpcy55PShkLWYpL2IsdGhpcy56PShwLWMpL2IsdGhpcy53PU1hdGguYWNvcygobCttK2gtMSkvMiksdGhpc31taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpcy56PU1hdGgubWluKHRoaXMueix0LnopLHRoaXMudz1NYXRoLm1pbih0aGlzLncsdC53KSx0aGlzfW1heCh0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksdC55KSx0aGlzLno9TWF0aC5tYXgodGhpcy56LHQueiksdGhpcy53PU1hdGgubWF4KHRoaXMudyx0LncpLHRoaXN9Y2xhbXAodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQueCxNYXRoLm1pbihlLngsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQueSxNYXRoLm1pbihlLnksdGhpcy55KSksdGhpcy56PU1hdGgubWF4KHQueixNYXRoLm1pbihlLnosdGhpcy56KSksdGhpcy53PU1hdGgubWF4KHQudyxNYXRoLm1pbihlLncsdGhpcy53KSksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy55KSksdGhpcy56PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnopKSx0aGlzLnc9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMudykpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KHQsTWF0aC5taW4oZSxuKSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXMudz1NYXRoLmZsb29yKHRoaXMudyksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpcy56PU1hdGguY2VpbCh0aGlzLnopLHRoaXMudz1NYXRoLmNlaWwodGhpcy53KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXMudz1NYXRoLnJvdW5kKHRoaXMudyksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9dGhpcy54PDA/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT10aGlzLnk8MD9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSksdGhpcy56PXRoaXMuejwwP01hdGguY2VpbCh0aGlzLnopOk1hdGguZmxvb3IodGhpcy56KSx0aGlzLnc9dGhpcy53PDA/TWF0aC5jZWlsKHRoaXMudyk6TWF0aC5mbG9vcih0aGlzLncpLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXMuej0tdGhpcy56LHRoaXMudz0tdGhpcy53LHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLngqdC54K3RoaXMueSp0LnkrdGhpcy56KnQueit0aGlzLncqdC53fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56K3RoaXMudyp0aGlzLnd9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53KX1tYW5oYXR0YW5MZW5ndGgoKXtyZXR1cm4gTWF0aC5hYnModGhpcy54KStNYXRoLmFicyh0aGlzLnkpK01hdGguYWJzKHRoaXMueikrTWF0aC5hYnModGhpcy53KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXMueis9KHQuei10aGlzLnopKmUsdGhpcy53Kz0odC53LXRoaXMudykqZSx0aGlzfWxlcnBWZWN0b3JzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQueCsoZS54LXQueCkqbix0aGlzLnk9dC55KyhlLnktdC55KSpuLHRoaXMuej10LnorKGUuei10LnopKm4sdGhpcy53PXQudysoZS53LXQudykqbix0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnkmJnQuej09PXRoaXMueiYmdC53PT09dGhpcy53fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpcy56PXRbZSsyXSx0aGlzLnc9dFtlKzNdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy54LHRbZSsxXT10aGlzLnksdFtlKzJdPXRoaXMueix0W2UrM109dGhpcy53LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUsbil7cmV0dXJuIHZvaWQgMCE9PW4mJmNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yNDogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpLHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXMudz10LmdldFcoZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpcy53PU1hdGgucmFuZG9tKCksdGhpc319YWF0LnByb3RvdHlwZS5pc1ZlY3RvcjQ9ITA7Y2xhc3MgcmF0IGV4dGVuZHMgVWl0e2NvbnN0cnVjdG9yKHQsZSxuPXt9KXtzdXBlcigpLHRoaXMud2lkdGg9dCx0aGlzLmhlaWdodD1lLHRoaXMuZGVwdGg9MSx0aGlzLnNjaXNzb3I9bmV3IGFhdCgwLDAsdCxlKSx0aGlzLnNjaXNzb3JUZXN0PSExLHRoaXMudmlld3BvcnQ9bmV3IGFhdCgwLDAsdCxlKSx0aGlzLnRleHR1cmU9bmV3IG9hdCh2b2lkIDAsbi5tYXBwaW5nLG4ud3JhcFMsbi53cmFwVCxuLm1hZ0ZpbHRlcixuLm1pbkZpbHRlcixuLmZvcm1hdCxuLnR5cGUsbi5hbmlzb3Ryb3B5LG4uZW5jb2RpbmcpLHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITAsdGhpcy50ZXh0dXJlLmltYWdlPXt3aWR0aDp0LGhlaWdodDplLGRlcHRoOjF9LHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9dm9pZCAwIT09bi5nZW5lcmF0ZU1pcG1hcHMmJm4uZ2VuZXJhdGVNaXBtYXBzLHRoaXMudGV4dHVyZS5taW5GaWx0ZXI9dm9pZCAwIT09bi5taW5GaWx0ZXI/bi5taW5GaWx0ZXI6Yml0LHRoaXMuZGVwdGhCdWZmZXI9dm9pZCAwPT09bi5kZXB0aEJ1ZmZlcnx8bi5kZXB0aEJ1ZmZlcix0aGlzLnN0ZW5jaWxCdWZmZXI9dm9pZCAwIT09bi5zdGVuY2lsQnVmZmVyJiZuLnN0ZW5jaWxCdWZmZXIsdGhpcy5kZXB0aFRleHR1cmU9dm9pZCAwIT09bi5kZXB0aFRleHR1cmU/bi5kZXB0aFRleHR1cmU6bnVsbH1zZXRUZXh0dXJlKHQpe3QuaW1hZ2U9e3dpZHRoOnRoaXMud2lkdGgsaGVpZ2h0OnRoaXMuaGVpZ2h0LGRlcHRoOnRoaXMuZGVwdGh9LHRoaXMudGV4dHVyZT10fXNldFNpemUodCxlLG49MSl7dGhpcy53aWR0aD09PXQmJnRoaXMuaGVpZ2h0PT09ZSYmdGhpcy5kZXB0aD09PW58fCh0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9ZSx0aGlzLmRlcHRoPW4sdGhpcy50ZXh0dXJlLmltYWdlLndpZHRoPXQsdGhpcy50ZXh0dXJlLmltYWdlLmhlaWdodD1lLHRoaXMudGV4dHVyZS5pbWFnZS5kZXB0aD1uLHRoaXMuZGlzcG9zZSgpKSx0aGlzLnZpZXdwb3J0LnNldCgwLDAsdCxlKSx0aGlzLnNjaXNzb3Iuc2V0KDAsMCx0LGUpfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMud2lkdGg9dC53aWR0aCx0aGlzLmhlaWdodD10LmhlaWdodCx0aGlzLmRlcHRoPXQuZGVwdGgsdGhpcy52aWV3cG9ydC5jb3B5KHQudmlld3BvcnQpLHRoaXMudGV4dHVyZT10LnRleHR1cmUuY2xvbmUoKSx0aGlzLnRleHR1cmUuaW1hZ2U9ey4uLnRoaXMudGV4dHVyZS5pbWFnZX0sdGhpcy5kZXB0aEJ1ZmZlcj10LmRlcHRoQnVmZmVyLHRoaXMuc3RlbmNpbEJ1ZmZlcj10LnN0ZW5jaWxCdWZmZXIsdGhpcy5kZXB0aFRleHR1cmU9dC5kZXB0aFRleHR1cmUsdGhpc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX1yYXQucHJvdG90eXBlLmlzV2ViR0xSZW5kZXJUYXJnZXQ9ITAsY2xhc3MgZXh0ZW5kcyByYXR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHQsZSk7Y29uc3Qgbz10aGlzLnRleHR1cmU7dGhpcy50ZXh0dXJlPVtdO2ZvcihsZXQgdD0wO3Q8bjt0KyspdGhpcy50ZXh0dXJlW3RdPW8uY2xvbmUoKX1zZXRTaXplKHQsZSxuPTEpe2lmKHRoaXMud2lkdGghPT10fHx0aGlzLmhlaWdodCE9PWV8fHRoaXMuZGVwdGghPT1uKXt0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9ZSx0aGlzLmRlcHRoPW47Zm9yKGxldCBvPTAsaT10aGlzLnRleHR1cmUubGVuZ3RoO288aTtvKyspdGhpcy50ZXh0dXJlW29dLmltYWdlLndpZHRoPXQsdGhpcy50ZXh0dXJlW29dLmltYWdlLmhlaWdodD1lLHRoaXMudGV4dHVyZVtvXS5pbWFnZS5kZXB0aD1uO3RoaXMuZGlzcG9zZSgpfXJldHVybiB0aGlzLnZpZXdwb3J0LnNldCgwLDAsdCxlKSx0aGlzLnNjaXNzb3Iuc2V0KDAsMCx0LGUpLHRoaXN9Y29weSh0KXt0aGlzLmRpc3Bvc2UoKSx0aGlzLndpZHRoPXQud2lkdGgsdGhpcy5oZWlnaHQ9dC5oZWlnaHQsdGhpcy5kZXB0aD10LmRlcHRoLHRoaXMudmlld3BvcnQuc2V0KDAsMCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KSx0aGlzLnNjaXNzb3Iuc2V0KDAsMCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KSx0aGlzLmRlcHRoQnVmZmVyPXQuZGVwdGhCdWZmZXIsdGhpcy5zdGVuY2lsQnVmZmVyPXQuc3RlbmNpbEJ1ZmZlcix0aGlzLmRlcHRoVGV4dHVyZT10LmRlcHRoVGV4dHVyZSx0aGlzLnRleHR1cmUubGVuZ3RoPTA7Zm9yKGxldCBlPTAsbj10LnRleHR1cmUubGVuZ3RoO2U8bjtlKyspdGhpcy50ZXh0dXJlW2VdPXQudGV4dHVyZVtlXS5jbG9uZSgpO3JldHVybiB0aGlzfX0ucHJvdG90eXBlLmlzV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHM9ITA7Y2xhc3Mgc2F0IGV4dGVuZHMgcmF0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcih0LGUsbiksdGhpcy5zYW1wbGVzPTR9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weS5jYWxsKHRoaXMsdCksdGhpcy5zYW1wbGVzPXQuc2FtcGxlcyx0aGlzfX1zYXQucHJvdG90eXBlLmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldD0hMDtjbGFzcyBsYXR7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAsbz0xKXt0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl93PW99c3RhdGljIHNsZXJwKHQsZSxuLG8pe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlF1YXRlcm5pb246IFN0YXRpYyAuc2xlcnAoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgcW0uc2xlcnBRdWF0ZXJuaW9ucyggcWEsIHFiLCB0ICkgaW5zdGVhZC4iKSxuLnNsZXJwUXVhdGVybmlvbnModCxlLG8pfXN0YXRpYyBzbGVycEZsYXQodCxlLG4sbyxpLGEscil7bGV0IHM9bltvKzBdLGw9bltvKzFdLGM9bltvKzJdLGQ9bltvKzNdO2NvbnN0IHA9aVthKzBdLG09aVthKzFdLHU9aVthKzJdLGY9aVthKzNdO2lmKDA9PT1yKXJldHVybiB0W2UrMF09cyx0W2UrMV09bCx0W2UrMl09Yyx2b2lkKHRbZSszXT1kKTtpZigxPT09cilyZXR1cm4gdFtlKzBdPXAsdFtlKzFdPW0sdFtlKzJdPXUsdm9pZCh0W2UrM109Zik7aWYoZCE9PWZ8fHMhPT1wfHxsIT09bXx8YyE9PXUpe2xldCB0PTEtcjtjb25zdCBlPXMqcCtsKm0rYyp1K2QqZixuPWU+PTA/MTotMSxvPTEtZSplO2lmKG8+TnVtYmVyLkVQU0lMT04pe2NvbnN0IGk9TWF0aC5zcXJ0KG8pLGE9TWF0aC5hdGFuMihpLGUqbik7dD1NYXRoLnNpbih0KmEpL2kscj1NYXRoLnNpbihyKmEpL2l9Y29uc3QgaT1yKm47aWYocz1zKnQrcCppLGw9bCp0K20qaSxjPWMqdCt1KmksZD1kKnQrZippLHQ9PT0xLXIpe2NvbnN0IHQ9MS9NYXRoLnNxcnQocypzK2wqbCtjKmMrZCpkKTtzKj10LGwqPXQsYyo9dCxkKj10fX10W2VdPXMsdFtlKzFdPWwsdFtlKzJdPWMsdFtlKzNdPWR9c3RhdGljIG11bHRpcGx5UXVhdGVybmlvbnNGbGF0KHQsZSxuLG8saSxhKXtjb25zdCByPW5bb10scz1uW28rMV0sbD1uW28rMl0sYz1uW28rM10sZD1pW2FdLHA9aVthKzFdLG09aVthKzJdLHU9aVthKzNdO3JldHVybiB0W2VdPXIqdStjKmQrcyptLWwqcCx0W2UrMV09cyp1K2MqcCtsKmQtciptLHRbZSsyXT1sKnUrYyptK3IqcC1zKmQsdFtlKzNdPWMqdS1yKmQtcypwLWwqbSx0fWdldCB4KCl7cmV0dXJuIHRoaXMuX3h9c2V0IHgodCl7dGhpcy5feD10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeSgpe3JldHVybiB0aGlzLl95fXNldCB5KHQpe3RoaXMuX3k9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fen1zZXQgeih0KXt0aGlzLl96PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB3KCl7cmV0dXJuIHRoaXMuX3d9c2V0IHcodCl7dGhpcy5fdz10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1zZXQodCxlLG4sbyl7cmV0dXJuIHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX3c9byx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl93KX1jb3B5KHQpe3JldHVybiB0aGlzLl94PXQueCx0aGlzLl95PXQueSx0aGlzLl96PXQueix0aGlzLl93PXQudyx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tRXVsZXIodCxlKXtpZighdHx8IXQuaXNFdWxlcil0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLiIpO2NvbnN0IG49dC5feCxvPXQuX3ksaT10Ll96LGE9dC5fb3JkZXIscj1NYXRoLmNvcyxzPU1hdGguc2luLGw9cihuLzIpLGM9cihvLzIpLGQ9cihpLzIpLHA9cyhuLzIpLG09cyhvLzIpLHU9cyhpLzIpO3N3aXRjaChhKXtjYXNlIlhZWiI6dGhpcy5feD1wKmMqZCtsKm0qdSx0aGlzLl95PWwqbSpkLXAqYyp1LHRoaXMuX3o9bCpjKnUrcCptKmQsdGhpcy5fdz1sKmMqZC1wKm0qdTticmVhaztjYXNlIllYWiI6dGhpcy5feD1wKmMqZCtsKm0qdSx0aGlzLl95PWwqbSpkLXAqYyp1LHRoaXMuX3o9bCpjKnUtcCptKmQsdGhpcy5fdz1sKmMqZCtwKm0qdTticmVhaztjYXNlIlpYWSI6dGhpcy5feD1wKmMqZC1sKm0qdSx0aGlzLl95PWwqbSpkK3AqYyp1LHRoaXMuX3o9bCpjKnUrcCptKmQsdGhpcy5fdz1sKmMqZC1wKm0qdTticmVhaztjYXNlIlpZWCI6dGhpcy5feD1wKmMqZC1sKm0qdSx0aGlzLl95PWwqbSpkK3AqYyp1LHRoaXMuX3o9bCpjKnUtcCptKmQsdGhpcy5fdz1sKmMqZCtwKm0qdTticmVhaztjYXNlIllaWCI6dGhpcy5feD1wKmMqZCtsKm0qdSx0aGlzLl95PWwqbSpkK3AqYyp1LHRoaXMuX3o9bCpjKnUtcCptKmQsdGhpcy5fdz1sKmMqZC1wKm0qdTticmVhaztjYXNlIlhaWSI6dGhpcy5feD1wKmMqZC1sKm0qdSx0aGlzLl95PWwqbSpkLXAqYyp1LHRoaXMuX3o9bCpjKnUrcCptKmQsdGhpcy5fdz1sKmMqZCtwKm0qdTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrYSl9cmV0dXJuITEhPT1lJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tQXhpc0FuZ2xlKHQsZSl7Y29uc3Qgbj1lLzIsbz1NYXRoLnNpbihuKTtyZXR1cm4gdGhpcy5feD10Lngqbyx0aGlzLl95PXQueSpvLHRoaXMuX3o9dC56Km8sdGhpcy5fdz1NYXRoLmNvcyhuKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUm90YXRpb25NYXRyaXgodCl7Y29uc3QgZT10LmVsZW1lbnRzLG49ZVswXSxvPWVbNF0saT1lWzhdLGE9ZVsxXSxyPWVbNV0scz1lWzldLGw9ZVsyXSxjPWVbNl0sZD1lWzEwXSxwPW4rcitkO2lmKHA+MCl7Y29uc3QgdD0uNS9NYXRoLnNxcnQocCsxKTt0aGlzLl93PS4yNS90LHRoaXMuX3g9KGMtcykqdCx0aGlzLl95PShpLWwpKnQsdGhpcy5fej0oYS1vKSp0fWVsc2UgaWYobj5yJiZuPmQpe2NvbnN0IHQ9MipNYXRoLnNxcnQoMStuLXItZCk7dGhpcy5fdz0oYy1zKS90LHRoaXMuX3g9LjI1KnQsdGhpcy5feT0obythKS90LHRoaXMuX3o9KGkrbCkvdH1lbHNlIGlmKHI+ZCl7Y29uc3QgdD0yKk1hdGguc3FydCgxK3Itbi1kKTt0aGlzLl93PShpLWwpL3QsdGhpcy5feD0obythKS90LHRoaXMuX3k9LjI1KnQsdGhpcy5fej0ocytjKS90fWVsc2V7Y29uc3QgdD0yKk1hdGguc3FydCgxK2Qtbi1yKTt0aGlzLl93PShhLW8pL3QsdGhpcy5feD0oaStsKS90LHRoaXMuX3k9KHMrYykvdCx0aGlzLl96PS4yNSp0fXJldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tVW5pdFZlY3RvcnModCxlKXtsZXQgbj10LmRvdChlKSsxO3JldHVybiBuPE51bWJlci5FUFNJTE9OPyhuPTAsTWF0aC5hYnModC54KT5NYXRoLmFicyh0LnopPyh0aGlzLl94PS10LnksdGhpcy5feT10LngsdGhpcy5fej0wLHRoaXMuX3c9bik6KHRoaXMuX3g9MCx0aGlzLl95PS10LnosdGhpcy5fej10LnksdGhpcy5fdz1uKSk6KHRoaXMuX3g9dC55KmUuei10LnoqZS55LHRoaXMuX3k9dC56KmUueC10LngqZS56LHRoaXMuX3o9dC54KmUueS10LnkqZS54LHRoaXMuX3c9biksdGhpcy5ub3JtYWxpemUoKX1hbmdsZVRvKHQpe3JldHVybiAyKk1hdGguYWNvcyhNYXRoLmFicyhaaXQodGhpcy5kb3QodCksLTEsMSkpKX1yb3RhdGVUb3dhcmRzKHQsZSl7Y29uc3Qgbj10aGlzLmFuZ2xlVG8odCk7aWYoMD09PW4pcmV0dXJuIHRoaXM7Y29uc3Qgbz1NYXRoLm1pbigxLGUvbik7cmV0dXJuIHRoaXMuc2xlcnAodCxvKSx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDAsMCwwLDEpfWludmVydCgpe3JldHVybiB0aGlzLmNvbmp1Z2F0ZSgpfWNvbmp1Z2F0ZSgpe3JldHVybiB0aGlzLl94Kj0tMSx0aGlzLl95Kj0tMSx0aGlzLl96Kj0tMSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31kb3QodCl7cmV0dXJuIHRoaXMuX3gqdC5feCt0aGlzLl95KnQuX3krdGhpcy5feip0Ll96K3RoaXMuX3cqdC5fd31sZW5ndGhTcSgpe3JldHVybiB0aGlzLl94KnRoaXMuX3grdGhpcy5feSp0aGlzLl95K3RoaXMuX3oqdGhpcy5feit0aGlzLl93KnRoaXMuX3d9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLl94KnRoaXMuX3grdGhpcy5feSp0aGlzLl95K3RoaXMuX3oqdGhpcy5feit0aGlzLl93KnRoaXMuX3cpfW5vcm1hbGl6ZSgpe2xldCB0PXRoaXMubGVuZ3RoKCk7cmV0dXJuIDA9PT10Pyh0aGlzLl94PTAsdGhpcy5feT0wLHRoaXMuX3o9MCx0aGlzLl93PTEpOih0PTEvdCx0aGlzLl94PXRoaXMuX3gqdCx0aGlzLl95PXRoaXMuX3kqdCx0aGlzLl96PXRoaXMuX3oqdCx0aGlzLl93PXRoaXMuX3cqdCksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9bXVsdGlwbHkodCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseVF1YXRlcm5pb25zKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5UXVhdGVybmlvbnModCxlKSk6dGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0LHRoaXMpfW11bHRpcGx5UXVhdGVybmlvbnModCxlKXtjb25zdCBuPXQuX3gsbz10Ll95LGk9dC5feixhPXQuX3cscj1lLl94LHM9ZS5feSxsPWUuX3osYz1lLl93O3JldHVybiB0aGlzLl94PW4qYythKnIrbypsLWkqcyx0aGlzLl95PW8qYythKnMraSpyLW4qbCx0aGlzLl96PWkqYythKmwrbipzLW8qcix0aGlzLl93PWEqYy1uKnItbypzLWkqbCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycCh0LGUpe2lmKDA9PT1lKXJldHVybiB0aGlzO2lmKDE9PT1lKXJldHVybiB0aGlzLmNvcHkodCk7Y29uc3Qgbj10aGlzLl94LG89dGhpcy5feSxpPXRoaXMuX3osYT10aGlzLl93O2xldCByPWEqdC5fdytuKnQuX3grbyp0Ll95K2kqdC5fejtpZihyPDA/KHRoaXMuX3c9LXQuX3csdGhpcy5feD0tdC5feCx0aGlzLl95PS10Ll95LHRoaXMuX3o9LXQuX3oscj0tcik6dGhpcy5jb3B5KHQpLHI+PTEpcmV0dXJuIHRoaXMuX3c9YSx0aGlzLl94PW4sdGhpcy5feT1vLHRoaXMuX3o9aSx0aGlzO2NvbnN0IHM9MS1yKnI7aWYoczw9TnVtYmVyLkVQU0lMT04pe2NvbnN0IHQ9MS1lO3JldHVybiB0aGlzLl93PXQqYStlKnRoaXMuX3csdGhpcy5feD10Km4rZSp0aGlzLl94LHRoaXMuX3k9dCpvK2UqdGhpcy5feSx0aGlzLl96PXQqaStlKnRoaXMuX3osdGhpcy5ub3JtYWxpemUoKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jb25zdCBsPU1hdGguc3FydChzKSxjPU1hdGguYXRhbjIobCxyKSxkPU1hdGguc2luKCgxLWUpKmMpL2wscD1NYXRoLnNpbihlKmMpL2w7cmV0dXJuIHRoaXMuX3c9YSpkK3RoaXMuX3cqcCx0aGlzLl94PW4qZCt0aGlzLl94KnAsdGhpcy5feT1vKmQrdGhpcy5feSpwLHRoaXMuX3o9aSpkK3RoaXMuX3oqcCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycFF1YXRlcm5pb25zKHQsZSxuKXt0aGlzLmNvcHkodCkuc2xlcnAoZSxuKX1lcXVhbHModCl7cmV0dXJuIHQuX3g9PT10aGlzLl94JiZ0Ll95PT09dGhpcy5feSYmdC5fej09PXRoaXMuX3omJnQuX3c9PT10aGlzLl93fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMuX3g9dFtlXSx0aGlzLl95PXRbZSsxXSx0aGlzLl96PXRbZSsyXSx0aGlzLl93PXRbZSszXSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLl94LHRbZSsxXT10aGlzLl95LHRbZSsyXT10aGlzLl96LHRbZSszXT10aGlzLl93LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLl94PXQuZ2V0WChlKSx0aGlzLl95PXQuZ2V0WShlKSx0aGlzLl96PXQuZ2V0WihlKSx0aGlzLl93PXQuZ2V0VyhlKSx0aGlzfV9vbkNoYW5nZSh0KXtyZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaz10LHRoaXN9X29uQ2hhbmdlQ2FsbGJhY2soKXt9fWxhdC5wcm90b3R5cGUuaXNRdWF0ZXJuaW9uPSEwO2NsYXNzIGNhdHtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCl7dGhpcy54PXQsdGhpcy55PWUsdGhpcy56PW59c2V0KHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49dGhpcy56KSx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztjYXNlIDI6dGhpcy56PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQueix0aGlzfWFkZCh0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmFkZFZlY3RvcnModCxlKSk6KHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXMueis9dC56LHRoaXMpfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzLnorPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXMuej10LnorZS56LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzLnorPXQueiplLHRoaXN9c3ViKHQsZSl7cmV0dXJuIHZvaWQgMCE9PWU/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuc3ViVmVjdG9ycyh0LGUpKToodGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpcyl9c3ViU2NhbGFyKHQpe3JldHVybiB0aGlzLngtPXQsdGhpcy55LT10LHRoaXMuei09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpcy56PXQuei1lLnosdGhpc31tdWx0aXBseSh0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5VmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5tdWx0aXBseVZlY3RvcnModCxlKSk6KHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXMueio9dC56LHRoaXMpfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXMueio9dCx0aGlzfW11bHRpcGx5VmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54KmUueCx0aGlzLnk9dC55KmUueSx0aGlzLno9dC56KmUueix0aGlzfWFwcGx5RXVsZXIodCl7cmV0dXJuIHQmJnQuaXNFdWxlcnx8Y29uc29sZS5lcnJvcigiVEhSRUUuVmVjdG9yMzogLmFwcGx5RXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLiIpLHRoaXMuYXBwbHlRdWF0ZXJuaW9uKHBhdC5zZXRGcm9tRXVsZXIodCkpfWFwcGx5QXhpc0FuZ2xlKHQsZSl7cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKHBhdC5zZXRGcm9tQXhpc0FuZ2xlKHQsZSkpfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxvPXRoaXMueixpPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1pWzBdKmUraVszXSpuK2lbNl0qbyx0aGlzLnk9aVsxXSplK2lbNF0qbitpWzddKm8sdGhpcy56PWlbMl0qZStpWzVdKm4raVs4XSpvLHRoaXN9YXBwbHlOb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXgzKHQpLm5vcm1hbGl6ZSgpfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxvPXRoaXMueixpPXQuZWxlbWVudHMsYT0xLyhpWzNdKmUraVs3XSpuK2lbMTFdKm8raVsxNV0pO3JldHVybiB0aGlzLng9KGlbMF0qZStpWzRdKm4raVs4XSpvK2lbMTJdKSphLHRoaXMueT0oaVsxXSplK2lbNV0qbitpWzldKm8raVsxM10pKmEsdGhpcy56PShpWzJdKmUraVs2XSpuK2lbMTBdKm8raVsxNF0pKmEsdGhpc31hcHBseVF1YXRlcm5pb24odCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnksbz10aGlzLnosaT10LngsYT10Lnkscj10Lnoscz10LncsbD1zKmUrYSpvLXIqbixjPXMqbityKmUtaSpvLGQ9cypvK2kqbi1hKmUscD0taSplLWEqbi1yKm87cmV0dXJuIHRoaXMueD1sKnMrcCotaStjKi1yLWQqLWEsdGhpcy55PWMqcytwKi1hK2QqLWktbCotcix0aGlzLno9ZCpzK3AqLXIrbCotYS1jKi1pLHRoaXN9cHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZEludmVyc2UpLmFwcGx5TWF0cml4NCh0LnByb2plY3Rpb25NYXRyaXgpfXVucHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSkuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpfXRyYW5zZm9ybURpcmVjdGlvbih0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxvPXRoaXMueixpPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1pWzBdKmUraVs0XSpuK2lbOF0qbyx0aGlzLnk9aVsxXSplK2lbNV0qbitpWzldKm8sdGhpcy56PWlbMl0qZStpWzZdKm4raVsxMF0qbyx0aGlzLm5vcm1hbGl6ZSgpfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpcy56Lz10LnosdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpcy56PU1hdGgubWluKHRoaXMueix0LnopLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LngsTWF0aC5taW4oZS54LHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LnksTWF0aC5taW4oZS55LHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LnosTWF0aC5taW4oZS56LHRoaXMueikpLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy56KSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IG49dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobnx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgodCxNYXRoLm1pbihlLG4pKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej1NYXRoLmZsb29yKHRoaXMueiksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpcy56PU1hdGguY2VpbCh0aGlzLnopLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXMuej1NYXRoLnJvdW5kKHRoaXMueiksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9dGhpcy54PDA/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT10aGlzLnk8MD9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSksdGhpcy56PXRoaXMuejwwP01hdGguY2VpbCh0aGlzLnopOk1hdGguZmxvb3IodGhpcy56KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzLno9LXRoaXMueix0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55K3RoaXMueip0Lnp9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnp9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueil9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopfW5vcm1hbGl6ZSgpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpcy56Kz0odC56LXRoaXMueikqZSx0aGlzfWxlcnBWZWN0b3JzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQueCsoZS54LXQueCkqbix0aGlzLnk9dC55KyhlLnktdC55KSpuLHRoaXMuej10LnorKGUuei10LnopKm4sdGhpc31jcm9zcyh0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5jcm9zcygpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmNyb3NzVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5jcm9zc1ZlY3RvcnModCxlKSk6dGhpcy5jcm9zc1ZlY3RvcnModGhpcyx0KX1jcm9zc1ZlY3RvcnModCxlKXtjb25zdCBuPXQueCxvPXQueSxpPXQueixhPWUueCxyPWUueSxzPWUuejtyZXR1cm4gdGhpcy54PW8qcy1pKnIsdGhpcy55PWkqYS1uKnMsdGhpcy56PW4qci1vKmEsdGhpc31wcm9qZWN0T25WZWN0b3IodCl7Y29uc3QgZT10Lmxlbmd0aFNxKCk7aWYoMD09PWUpcmV0dXJuIHRoaXMuc2V0KDAsMCwwKTtjb25zdCBuPXQuZG90KHRoaXMpL2U7cmV0dXJuIHRoaXMuY29weSh0KS5tdWx0aXBseVNjYWxhcihuKX1wcm9qZWN0T25QbGFuZSh0KXtyZXR1cm4gZGF0LmNvcHkodGhpcykucHJvamVjdE9uVmVjdG9yKHQpLHRoaXMuc3ViKGRhdCl9cmVmbGVjdCh0KXtyZXR1cm4gdGhpcy5zdWIoZGF0LmNvcHkodCkubXVsdGlwbHlTY2FsYXIoMip0aGlzLmRvdCh0KSkpfWFuZ2xlVG8odCl7Y29uc3QgZT1NYXRoLnNxcnQodGhpcy5sZW5ndGhTcSgpKnQubGVuZ3RoU3EoKSk7aWYoMD09PWUpcmV0dXJuIE1hdGguUEkvMjtjb25zdCBuPXRoaXMuZG90KHQpL2U7cmV0dXJuIE1hdGguYWNvcyhaaXQobiwtMSwxKSl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxuPXRoaXMueS10Lnksbz10aGlzLnotdC56O3JldHVybiBlKmUrbipuK28qb31tYW5oYXR0YW5EaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLngtdC54KStNYXRoLmFicyh0aGlzLnktdC55KStNYXRoLmFicyh0aGlzLnotdC56KX1zZXRGcm9tU3BoZXJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHModC5yYWRpdXMsdC5waGksdC50aGV0YSl9c2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LGUsbil7Y29uc3Qgbz1NYXRoLnNpbihlKSp0O3JldHVybiB0aGlzLng9bypNYXRoLnNpbihuKSx0aGlzLnk9TWF0aC5jb3MoZSkqdCx0aGlzLno9bypNYXRoLmNvcyhuKSx0aGlzfXNldEZyb21DeWxpbmRyaWNhbCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHModC5yYWRpdXMsdC50aGV0YSx0LnkpfXNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LGUsbil7cmV0dXJuIHRoaXMueD10Kk1hdGguc2luKGUpLHRoaXMueT1uLHRoaXMuej10Kk1hdGguY29zKGUpLHRoaXN9c2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWVbMTJdLHRoaXMueT1lWzEzXSx0aGlzLno9ZVsxNF0sdGhpc31zZXRGcm9tTWF0cml4U2NhbGUodCl7Y29uc3QgZT10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwwKS5sZW5ndGgoKSxuPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLG89dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMikubGVuZ3RoKCk7cmV0dXJuIHRoaXMueD1lLHRoaXMueT1uLHRoaXMuej1vLHRoaXN9c2V0RnJvbU1hdHJpeENvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLDQqZSl9c2V0RnJvbU1hdHJpeDNDb2x1bW4odCxlKXtyZXR1cm4gdGhpcy5mcm9tQXJyYXkodC5lbGVtZW50cywzKmUpfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnkmJnQuej09PXRoaXMuen1mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLng9dFtlXSx0aGlzLnk9dFtlKzFdLHRoaXMuej10W2UrMl0sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0W2UrMl09dGhpcy56LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUsbil7cmV0dXJuIHZvaWQgMCE9PW4mJmNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpLHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXN9fWNhdC5wcm90b3R5cGUuaXNWZWN0b3IzPSEwO2NvbnN0IGRhdD1uZXcgY2F0LHBhdD1uZXcgbGF0O2NsYXNzIG1hdHtjb25zdHJ1Y3Rvcih0PW5ldyBjYXQoMS8wLDEvMCwxLzApLGU9bmV3IGNhdCgtMS8wLC0xLzAsLTEvMCkpe3RoaXMubWluPXQsdGhpcy5tYXg9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5taW4uY29weSh0KSx0aGlzLm1heC5jb3B5KGUpLHRoaXN9c2V0RnJvbUFycmF5KHQpe2xldCBlPTEvMCxuPTEvMCxvPTEvMCxpPS0xLzAsYT0tMS8wLHI9LTEvMDtmb3IobGV0IHM9MCxsPXQubGVuZ3RoO3M8bDtzKz0zKXtjb25zdCBsPXRbc10sYz10W3MrMV0sZD10W3MrMl07bDxlJiYoZT1sKSxjPG4mJihuPWMpLGQ8byYmKG89ZCksbD5pJiYoaT1sKSxjPmEmJihhPWMpLGQ+ciYmKHI9ZCl9cmV0dXJuIHRoaXMubWluLnNldChlLG4sbyksdGhpcy5tYXguc2V0KGksYSxyKSx0aGlzfXNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCl7bGV0IGU9MS8wLG49MS8wLG89MS8wLGk9LTEvMCxhPS0xLzAscj0tMS8wO2ZvcihsZXQgcz0wLGw9dC5jb3VudDtzPGw7cysrKXtjb25zdCBsPXQuZ2V0WChzKSxjPXQuZ2V0WShzKSxkPXQuZ2V0WihzKTtsPGUmJihlPWwpLGM8biYmKG49YyksZDxvJiYobz1kKSxsPmkmJihpPWwpLGM+YSYmKGE9YyksZD5yJiYocj1kKX1yZXR1cm4gdGhpcy5taW4uc2V0KGUsbixvKSx0aGlzLm1heC5zZXQoaSxhLHIpLHRoaXN9c2V0RnJvbVBvaW50cyh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQodFtlXSk7cmV0dXJuIHRoaXN9c2V0RnJvbUNlbnRlckFuZFNpemUodCxlKXtjb25zdCBuPWZhdC5jb3B5KGUpLm11bHRpcGx5U2NhbGFyKC41KTtyZXR1cm4gdGhpcy5taW4uY29weSh0KS5zdWIobiksdGhpcy5tYXguY29weSh0KS5hZGQobiksdGhpc31zZXRGcm9tT2JqZWN0KHQpe3JldHVybiB0aGlzLm1ha2VFbXB0eSgpLHRoaXMuZXhwYW5kQnlPYmplY3QodCl9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpc31tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5taW4ueD10aGlzLm1pbi55PXRoaXMubWluLno9MS8wLHRoaXMubWF4Lng9dGhpcy5tYXgueT10aGlzLm1heC56PS0xLzAsdGhpc31pc0VtcHR5KCl7cmV0dXJuIHRoaXMubWF4Lng8dGhpcy5taW4ueHx8dGhpcy5tYXgueTx0aGlzLm1pbi55fHx0aGlzLm1heC56PHRoaXMubWluLnp9Z2V0Q2VudGVyKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDAsMCk6dC5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9Z2V0U2l6ZSh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwLDApOnQuc3ViVmVjdG9ycyh0aGlzLm1heCx0aGlzLm1pbil9ZXhwYW5kQnlQb2ludCh0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQpLHRoaXMubWF4Lm1heCh0KSx0aGlzfWV4cGFuZEJ5VmVjdG9yKHQpe3JldHVybiB0aGlzLm1pbi5zdWIodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXhwYW5kQnlTY2FsYXIodCl7cmV0dXJuIHRoaXMubWluLmFkZFNjYWxhcigtdCksdGhpcy5tYXguYWRkU2NhbGFyKHQpLHRoaXN9ZXhwYW5kQnlPYmplY3QodCl7dC51cGRhdGVXb3JsZE1hdHJpeCghMSwhMSk7Y29uc3QgZT10Lmdlb21ldHJ5O3ZvaWQgMCE9PWUmJihudWxsPT09ZS5ib3VuZGluZ0JveCYmZS5jb21wdXRlQm91bmRpbmdCb3goKSxnYXQuY29weShlLmJvdW5kaW5nQm94KSxnYXQuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMudW5pb24oZ2F0KSk7Y29uc3Qgbj10LmNoaWxkcmVuO2ZvcihsZXQgdD0wLGU9bi5sZW5ndGg7dDxlO3QrKyl0aGlzLmV4cGFuZEJ5T2JqZWN0KG5bdF0pO3JldHVybiB0aGlzfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuISh0Lng8dGhpcy5taW4ueHx8dC54PnRoaXMubWF4Lnh8fHQueTx0aGlzLm1pbi55fHx0Lnk+dGhpcy5tYXgueXx8dC56PHRoaXMubWluLnp8fHQuej50aGlzLm1heC56KX1jb250YWluc0JveCh0KXtyZXR1cm4gdGhpcy5taW4ueDw9dC5taW4ueCYmdC5tYXgueDw9dGhpcy5tYXgueCYmdGhpcy5taW4ueTw9dC5taW4ueSYmdC5tYXgueTw9dGhpcy5tYXgueSYmdGhpcy5taW4uejw9dC5taW4ueiYmdC5tYXguejw9dGhpcy5tYXguen1nZXRQYXJhbWV0ZXIodCxlKXtyZXR1cm4gZS5zZXQoKHQueC10aGlzLm1pbi54KS8odGhpcy5tYXgueC10aGlzLm1pbi54KSwodC55LXRoaXMubWluLnkpLyh0aGlzLm1heC55LXRoaXMubWluLnkpLCh0LnotdGhpcy5taW4ueikvKHRoaXMubWF4LnotdGhpcy5taW4ueikpfWludGVyc2VjdHNCb3godCl7cmV0dXJuISh0Lm1heC54PHRoaXMubWluLnh8fHQubWluLng+dGhpcy5tYXgueHx8dC5tYXgueTx0aGlzLm1pbi55fHx0Lm1pbi55PnRoaXMubWF4Lnl8fHQubWF4Lno8dGhpcy5taW4uenx8dC5taW4uej50aGlzLm1heC56KX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0aGlzLmNsYW1wUG9pbnQodC5jZW50ZXIsZmF0KSxmYXQuZGlzdGFuY2VUb1NxdWFyZWQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31pbnRlcnNlY3RzUGxhbmUodCl7bGV0IGUsbjtyZXR1cm4gdC5ub3JtYWwueD4wPyhlPXQubm9ybWFsLngqdGhpcy5taW4ueCxuPXQubm9ybWFsLngqdGhpcy5tYXgueCk6KGU9dC5ub3JtYWwueCp0aGlzLm1heC54LG49dC5ub3JtYWwueCp0aGlzLm1pbi54KSx0Lm5vcm1hbC55PjA/KGUrPXQubm9ybWFsLnkqdGhpcy5taW4ueSxuKz10Lm5vcm1hbC55KnRoaXMubWF4LnkpOihlKz10Lm5vcm1hbC55KnRoaXMubWF4Lnksbis9dC5ub3JtYWwueSp0aGlzLm1pbi55KSx0Lm5vcm1hbC56PjA/KGUrPXQubm9ybWFsLnoqdGhpcy5taW4ueixuKz10Lm5vcm1hbC56KnRoaXMubWF4LnopOihlKz10Lm5vcm1hbC56KnRoaXMubWF4Lnosbis9dC5ub3JtYWwueip0aGlzLm1pbi56KSxlPD0tdC5jb25zdGFudCYmbj49LXQuY29uc3RhbnR9aW50ZXJzZWN0c1RyaWFuZ2xlKHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiExO3RoaXMuZ2V0Q2VudGVyKHZhdCkseGF0LnN1YlZlY3RvcnModGhpcy5tYXgsdmF0KSxoYXQuc3ViVmVjdG9ycyh0LmEsdmF0KSxiYXQuc3ViVmVjdG9ycyh0LmIsdmF0KSx5YXQuc3ViVmVjdG9ycyh0LmMsdmF0KSxfYXQuc3ViVmVjdG9ycyhiYXQsaGF0KSxDYXQuc3ViVmVjdG9ycyh5YXQsYmF0KSxNYXQuc3ViVmVjdG9ycyhoYXQseWF0KTtsZXQgZT1bMCwtX2F0LnosX2F0LnksMCwtQ2F0LnosQ2F0LnksMCwtTWF0LnosTWF0LnksX2F0LnosMCwtX2F0LngsQ2F0LnosMCwtQ2F0LngsTWF0LnosMCwtTWF0LngsLV9hdC55LF9hdC54LDAsLUNhdC55LENhdC54LDAsLU1hdC55LE1hdC54LDBdO3JldHVybiEhd2F0KGUsaGF0LGJhdCx5YXQseGF0KSYmKGU9WzEsMCwwLDAsMSwwLDAsMCwxXSwhIXdhdChlLGhhdCxiYXQseWF0LHhhdCkmJihPYXQuY3Jvc3NWZWN0b3JzKF9hdCxDYXQpLGU9W09hdC54LE9hdC55LE9hdC56XSx3YXQoZSxoYXQsYmF0LHlhdCx4YXQpKSl9Y2xhbXBQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gZmF0LmNvcHkodCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpLnN1Yih0KS5sZW5ndGgoKX1nZXRCb3VuZGluZ1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5nZXRDZW50ZXIodC5jZW50ZXIpLHQucmFkaXVzPS41KnRoaXMuZ2V0U2l6ZShmYXQpLmxlbmd0aCgpLHR9aW50ZXJzZWN0KHQpe3JldHVybiB0aGlzLm1pbi5tYXgodC5taW4pLHRoaXMubWF4Lm1pbih0Lm1heCksdGhpcy5pc0VtcHR5KCkmJnRoaXMubWFrZUVtcHR5KCksdGhpc311bmlvbih0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQubWluKSx0aGlzLm1heC5tYXgodC5tYXgpLHRoaXN9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKXx8KHVhdFswXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSx1YXRbMV0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksdWF0WzJdLnNldCh0aGlzLm1pbi54LHRoaXMubWF4LnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLHVhdFszXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSx1YXRbNF0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksdWF0WzVdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLHVhdFs2XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSx1YXRbN10uc2V0KHRoaXMubWF4LngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksdGhpcy5zZXRGcm9tUG9pbnRzKHVhdCkpLHRoaXN9dHJhbnNsYXRlKHQpe3JldHVybiB0aGlzLm1pbi5hZGQodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm1pbi5lcXVhbHModGhpcy5taW4pJiZ0Lm1heC5lcXVhbHModGhpcy5tYXgpfX1tYXQucHJvdG90eXBlLmlzQm94Mz0hMDtjb25zdCB1YXQ9W25ldyBjYXQsbmV3IGNhdCxuZXcgY2F0LG5ldyBjYXQsbmV3IGNhdCxuZXcgY2F0LG5ldyBjYXQsbmV3IGNhdF0sZmF0PW5ldyBjYXQsZ2F0PW5ldyBtYXQsaGF0PW5ldyBjYXQsYmF0PW5ldyBjYXQseWF0PW5ldyBjYXQsX2F0PW5ldyBjYXQsQ2F0PW5ldyBjYXQsTWF0PW5ldyBjYXQsdmF0PW5ldyBjYXQseGF0PW5ldyBjYXQsT2F0PW5ldyBjYXQsUGF0PW5ldyBjYXQ7ZnVuY3Rpb24gd2F0KHQsZSxuLG8saSl7Zm9yKGxldCBhPTAscj10Lmxlbmd0aC0zO2E8PXI7YSs9Myl7UGF0LmZyb21BcnJheSh0LGEpO2NvbnN0IHI9aS54Kk1hdGguYWJzKFBhdC54KStpLnkqTWF0aC5hYnMoUGF0LnkpK2kueipNYXRoLmFicyhQYXQueikscz1lLmRvdChQYXQpLGw9bi5kb3QoUGF0KSxjPW8uZG90KFBhdCk7aWYoTWF0aC5tYXgoLU1hdGgubWF4KHMsbCxjKSxNYXRoLm1pbihzLGwsYykpPnIpcmV0dXJuITF9cmV0dXJuITB9Y29uc3Qga2F0PW5ldyBtYXQsU2F0PW5ldyBjYXQsRGF0PW5ldyBjYXQsRWF0PW5ldyBjYXQ7Y2xhc3MgUmF0e2NvbnN0cnVjdG9yKHQ9bmV3IGNhdCxlPS0xKXt0aGlzLmNlbnRlcj10LHRoaXMucmFkaXVzPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodCksdGhpcy5yYWRpdXM9ZSx0aGlzfXNldEZyb21Qb2ludHModCxlKXtjb25zdCBuPXRoaXMuY2VudGVyO3ZvaWQgMCE9PWU/bi5jb3B5KGUpOmthdC5zZXRGcm9tUG9pbnRzKHQpLmdldENlbnRlcihuKTtsZXQgbz0wO2ZvcihsZXQgZT0wLGk9dC5sZW5ndGg7ZTxpO2UrKylvPU1hdGgubWF4KG8sbi5kaXN0YW5jZVRvU3F1YXJlZCh0W2VdKSk7cmV0dXJuIHRoaXMucmFkaXVzPU1hdGguc3FydChvKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodC5jZW50ZXIpLHRoaXMucmFkaXVzPXQucmFkaXVzLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLnJhZGl1czwwfW1ha2VFbXB0eSgpe3JldHVybiB0aGlzLmNlbnRlci5zZXQoMCwwLDApLHRoaXMucmFkaXVzPS0xLHRoaXN9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdC5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcik8PXRoaXMucmFkaXVzKnRoaXMucmFkaXVzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdC5kaXN0YW5jZVRvKHRoaXMuY2VudGVyKS10aGlzLnJhZGl1c31pbnRlcnNlY3RzU3BoZXJlKHQpe2NvbnN0IGU9dGhpcy5yYWRpdXMrdC5yYWRpdXM7cmV0dXJuIHQuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9ZSplfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQuaW50ZXJzZWN0c1NwaGVyZSh0aGlzKX1pbnRlcnNlY3RzUGxhbmUodCl7cmV0dXJuIE1hdGguYWJzKHQuZGlzdGFuY2VUb1BvaW50KHRoaXMuY2VudGVyKSk8PXRoaXMucmFkaXVzfWNsYW1wUG9pbnQodCxlKXtjb25zdCBuPXRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHQpO3JldHVybiBlLmNvcHkodCksbj50aGlzLnJhZGl1cyp0aGlzLnJhZGl1cyYmKGUuc3ViKHRoaXMuY2VudGVyKS5ub3JtYWxpemUoKSxlLm11bHRpcGx5U2NhbGFyKHRoaXMucmFkaXVzKS5hZGQodGhpcy5jZW50ZXIpKSxlfWdldEJvdW5kaW5nQm94KHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT8odC5tYWtlRW1wdHkoKSx0KToodC5zZXQodGhpcy5jZW50ZXIsdGhpcy5jZW50ZXIpLHQuZXhwYW5kQnlTY2FsYXIodGhpcy5yYWRpdXMpLHQpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0KHQpLHRoaXMucmFkaXVzPXRoaXMucmFkaXVzKnQuZ2V0TWF4U2NhbGVPbkF4aXMoKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuYWRkKHQpLHRoaXN9ZXhwYW5kQnlQb2ludCh0KXtFYXQuc3ViVmVjdG9ycyh0LHRoaXMuY2VudGVyKTtjb25zdCBlPUVhdC5sZW5ndGhTcSgpO2lmKGU+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMpe2NvbnN0IHQ9TWF0aC5zcXJ0KGUpLG49LjUqKHQtdGhpcy5yYWRpdXMpO3RoaXMuY2VudGVyLmFkZChFYXQubXVsdGlwbHlTY2FsYXIobi90KSksdGhpcy5yYWRpdXMrPW59cmV0dXJuIHRoaXN9dW5pb24odCl7cmV0dXJuIERhdC5zdWJWZWN0b3JzKHQuY2VudGVyLHRoaXMuY2VudGVyKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0LnJhZGl1cyksdGhpcy5leHBhbmRCeVBvaW50KFNhdC5jb3B5KHQuY2VudGVyKS5hZGQoRGF0KSksdGhpcy5leHBhbmRCeVBvaW50KFNhdC5jb3B5KHQuY2VudGVyKS5zdWIoRGF0KSksdGhpc31lcXVhbHModCl7cmV0dXJuIHQuY2VudGVyLmVxdWFscyh0aGlzLmNlbnRlcikmJnQucmFkaXVzPT09dGhpcy5yYWRpdXN9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fWNvbnN0IEFhdD1uZXcgY2F0LFRhdD1uZXcgY2F0LE5hdD1uZXcgY2F0LHphdD1uZXcgY2F0LElhdD1uZXcgY2F0LEhhdD1uZXcgY2F0LEZhdD1uZXcgY2F0O2NsYXNzIExhdHtjb25zdHJ1Y3Rvcih0PW5ldyBjYXQsZT1uZXcgY2F0KDAsMCwtMSkpe3RoaXMub3JpZ2luPXQsdGhpcy5kaXJlY3Rpb249ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5vcmlnaW4uY29weSh0KSx0aGlzLmRpcmVjdGlvbi5jb3B5KGUpLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5vcmlnaW4uY29weSh0Lm9yaWdpbiksdGhpcy5kaXJlY3Rpb24uY29weSh0LmRpcmVjdGlvbiksdGhpc31hdCh0LGUpe3JldHVybiBlLmNvcHkodGhpcy5kaXJlY3Rpb24pLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLm9yaWdpbil9bG9va0F0KHQpe3JldHVybiB0aGlzLmRpcmVjdGlvbi5jb3B5KHQpLnN1Yih0aGlzLm9yaWdpbikubm9ybWFsaXplKCksdGhpc31yZWNhc3QodCl7cmV0dXJuIHRoaXMub3JpZ2luLmNvcHkodGhpcy5hdCh0LEFhdCkpLHRoaXN9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2Uuc3ViVmVjdG9ycyh0LHRoaXMub3JpZ2luKTtjb25zdCBuPWUuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gbjwwP2UuY29weSh0aGlzLm9yaWdpbik6ZS5jb3B5KHRoaXMuZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcihuKS5hZGQodGhpcy5vcmlnaW4pfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQodCkpfWRpc3RhbmNlU3FUb1BvaW50KHQpe2NvbnN0IGU9QWF0LnN1YlZlY3RvcnModCx0aGlzLm9yaWdpbikuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gZTwwP3RoaXMub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKHQpOihBYXQuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoZSkuYWRkKHRoaXMub3JpZ2luKSxBYXQuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlU3FUb1NlZ21lbnQodCxlLG4sbyl7VGF0LmNvcHkodCkuYWRkKGUpLm11bHRpcGx5U2NhbGFyKC41KSxOYXQuY29weShlKS5zdWIodCkubm9ybWFsaXplKCksemF0LmNvcHkodGhpcy5vcmlnaW4pLnN1YihUYXQpO2NvbnN0IGk9LjUqdC5kaXN0YW5jZVRvKGUpLGE9LXRoaXMuZGlyZWN0aW9uLmRvdChOYXQpLHI9emF0LmRvdCh0aGlzLmRpcmVjdGlvbikscz0temF0LmRvdChOYXQpLGw9emF0Lmxlbmd0aFNxKCksYz1NYXRoLmFicygxLWEqYSk7bGV0IGQscCxtLHU7aWYoYz4wKWlmKGQ9YSpzLXIscD1hKnItcyx1PWkqYyxkPj0wKWlmKHA+PS11KWlmKHA8PXUpe2NvbnN0IHQ9MS9jO2QqPXQscCo9dCxtPWQqKGQrYSpwKzIqcikrcCooYSpkK3ArMipzKStsfWVsc2UgcD1pLGQ9TWF0aC5tYXgoMCwtKGEqcCtyKSksbT0tZCpkK3AqKHArMipzKStsO2Vsc2UgcD0taSxkPU1hdGgubWF4KDAsLShhKnArcikpLG09LWQqZCtwKihwKzIqcykrbDtlbHNlIHA8PS11PyhkPU1hdGgubWF4KDAsLSgtYSppK3IpKSxwPWQ+MD8taTpNYXRoLm1pbihNYXRoLm1heCgtaSwtcyksaSksbT0tZCpkK3AqKHArMipzKStsKTpwPD11PyhkPTAscD1NYXRoLm1pbihNYXRoLm1heCgtaSwtcyksaSksbT1wKihwKzIqcykrbCk6KGQ9TWF0aC5tYXgoMCwtKGEqaStyKSkscD1kPjA/aTpNYXRoLm1pbihNYXRoLm1heCgtaSwtcyksaSksbT0tZCpkK3AqKHArMipzKStsKTtlbHNlIHA9YT4wPy1pOmksZD1NYXRoLm1heCgwLC0oYSpwK3IpKSxtPS1kKmQrcCoocCsyKnMpK2w7cmV0dXJuIG4mJm4uY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoZCkuYWRkKHRoaXMub3JpZ2luKSxvJiZvLmNvcHkoTmF0KS5tdWx0aXBseVNjYWxhcihwKS5hZGQoVGF0KSxtfWludGVyc2VjdFNwaGVyZSh0LGUpe0FhdC5zdWJWZWN0b3JzKHQuY2VudGVyLHRoaXMub3JpZ2luKTtjb25zdCBuPUFhdC5kb3QodGhpcy5kaXJlY3Rpb24pLG89QWF0LmRvdChBYXQpLW4qbixpPXQucmFkaXVzKnQucmFkaXVzO2lmKG8+aSlyZXR1cm4gbnVsbDtjb25zdCBhPU1hdGguc3FydChpLW8pLHI9bi1hLHM9bithO3JldHVybiByPDAmJnM8MD9udWxsOnRoaXMuYXQocjwwP3M6cixlKX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KHQuY2VudGVyKTw9dC5yYWRpdXMqdC5yYWRpdXN9ZGlzdGFuY2VUb1BsYW5lKHQpe2NvbnN0IGU9dC5ub3JtYWwuZG90KHRoaXMuZGlyZWN0aW9uKTtpZigwPT09ZSlyZXR1cm4gMD09PXQuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKT8wOm51bGw7Y29uc3Qgbj0tKHRoaXMub3JpZ2luLmRvdCh0Lm5vcm1hbCkrdC5jb25zdGFudCkvZTtyZXR1cm4gbj49MD9uOm51bGx9aW50ZXJzZWN0UGxhbmUodCxlKXtjb25zdCBuPXRoaXMuZGlzdGFuY2VUb1BsYW5lKHQpO3JldHVybiBudWxsPT09bj9udWxsOnRoaXMuYXQobixlKX1pbnRlcnNlY3RzUGxhbmUodCl7Y29uc3QgZT10LmRpc3RhbmNlVG9Qb2ludCh0aGlzLm9yaWdpbik7cmV0dXJuIDA9PT1lfHx0Lm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pKmU8MH1pbnRlcnNlY3RCb3godCxlKXtsZXQgbixvLGksYSxyLHM7Y29uc3QgbD0xL3RoaXMuZGlyZWN0aW9uLngsYz0xL3RoaXMuZGlyZWN0aW9uLnksZD0xL3RoaXMuZGlyZWN0aW9uLnoscD10aGlzLm9yaWdpbjtyZXR1cm4gbD49MD8obj0odC5taW4ueC1wLngpKmwsbz0odC5tYXgueC1wLngpKmwpOihuPSh0Lm1heC54LXAueCkqbCxvPSh0Lm1pbi54LXAueCkqbCksYz49MD8oaT0odC5taW4ueS1wLnkpKmMsYT0odC5tYXgueS1wLnkpKmMpOihpPSh0Lm1heC55LXAueSkqYyxhPSh0Lm1pbi55LXAueSkqYyksbj5hfHxpPm8/bnVsbDooKGk+bnx8biE9bikmJihuPWkpLChhPG98fG8hPW8pJiYobz1hKSxkPj0wPyhyPSh0Lm1pbi56LXAueikqZCxzPSh0Lm1heC56LXAueikqZCk6KHI9KHQubWF4LnotcC56KSpkLHM9KHQubWluLnotcC56KSpkKSxuPnN8fHI+bz9udWxsOigocj5ufHxuIT1uKSYmKG49ciksKHM8b3x8byE9bykmJihvPXMpLG88MD9udWxsOnRoaXMuYXQobj49MD9uOm8sZSkpKX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiBudWxsIT09dGhpcy5pbnRlcnNlY3RCb3godCxBYXQpfWludGVyc2VjdFRyaWFuZ2xlKHQsZSxuLG8saSl7SWF0LnN1YlZlY3RvcnMoZSx0KSxIYXQuc3ViVmVjdG9ycyhuLHQpLEZhdC5jcm9zc1ZlY3RvcnMoSWF0LEhhdCk7bGV0IGEscj10aGlzLmRpcmVjdGlvbi5kb3QoRmF0KTtpZihyPjApe2lmKG8pcmV0dXJuIG51bGw7YT0xfWVsc2V7aWYoIShyPDApKXJldHVybiBudWxsO2E9LTEscj0tcn16YXQuc3ViVmVjdG9ycyh0aGlzLm9yaWdpbix0KTtjb25zdCBzPWEqdGhpcy5kaXJlY3Rpb24uZG90KEhhdC5jcm9zc1ZlY3RvcnMoemF0LEhhdCkpO2lmKHM8MClyZXR1cm4gbnVsbDtjb25zdCBsPWEqdGhpcy5kaXJlY3Rpb24uZG90KElhdC5jcm9zcyh6YXQpKTtpZihsPDApcmV0dXJuIG51bGw7aWYocytsPnIpcmV0dXJuIG51bGw7Y29uc3QgYz0tYSp6YXQuZG90KEZhdCk7cmV0dXJuIGM8MD9udWxsOnRoaXMuYXQoYy9yLGkpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5vcmlnaW4uYXBwbHlNYXRyaXg0KHQpLHRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5vcmlnaW4uZXF1YWxzKHRoaXMub3JpZ2luKSYmdC5kaXJlY3Rpb24uZXF1YWxzKHRoaXMuZGlyZWN0aW9uKX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19Y2xhc3MgQmF0e2NvbnN0cnVjdG9yKCl7dGhpcy5lbGVtZW50cz1bMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV0sYXJndW1lbnRzLmxlbmd0aD4wJiZjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLiIpfXNldCh0LGUsbixvLGksYSxyLHMsbCxjLGQscCxtLHUsZixnKXtjb25zdCBoPXRoaXMuZWxlbWVudHM7cmV0dXJuIGhbMF09dCxoWzRdPWUsaFs4XT1uLGhbMTJdPW8saFsxXT1pLGhbNV09YSxoWzldPXIsaFsxM109cyxoWzJdPWwsaFs2XT1jLGhbMTBdPWQsaFsxNF09cCxoWzNdPW0saFs3XT11LGhbMTFdPWYsaFsxNV09Zyx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDEpLHRoaXN9Y2xvbmUoKXtyZXR1cm4obmV3IEJhdCkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfWNvcHkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVswXT1uWzBdLGVbMV09blsxXSxlWzJdPW5bMl0sZVszXT1uWzNdLGVbNF09bls0XSxlWzVdPW5bNV0sZVs2XT1uWzZdLGVbN109bls3XSxlWzhdPW5bOF0sZVs5XT1uWzldLGVbMTBdPW5bMTBdLGVbMTFdPW5bMTFdLGVbMTJdPW5bMTJdLGVbMTNdPW5bMTNdLGVbMTRdPW5bMTRdLGVbMTVdPW5bMTVdLHRoaXN9Y29weVBvc2l0aW9uKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7cmV0dXJuIGVbMTJdPW5bMTJdLGVbMTNdPW5bMTNdLGVbMTRdPW5bMTRdLHRoaXN9c2V0RnJvbU1hdHJpeDModCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnNldChlWzBdLGVbM10sZVs2XSwwLGVbMV0sZVs0XSxlWzddLDAsZVsyXSxlWzVdLGVbOF0sMCwwLDAsMCwxKSx0aGlzfWV4dHJhY3RCYXNpcyh0LGUsbil7cmV0dXJuIHQuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDEpLG4uc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDIpLHRoaXN9bWFrZUJhc2lzKHQsZSxuKXtyZXR1cm4gdGhpcy5zZXQodC54LGUueCxuLngsMCx0LnksZS55LG4ueSwwLHQueixlLnosbi56LDAsMCwwLDAsMSksdGhpc31leHRyYWN0Um90YXRpb24odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cyxvPTEvVmF0LnNldEZyb21NYXRyaXhDb2x1bW4odCwwKS5sZW5ndGgoKSxpPTEvVmF0LnNldEZyb21NYXRyaXhDb2x1bW4odCwxKS5sZW5ndGgoKSxhPTEvVmF0LnNldEZyb21NYXRyaXhDb2x1bW4odCwyKS5sZW5ndGgoKTtyZXR1cm4gZVswXT1uWzBdKm8sZVsxXT1uWzFdKm8sZVsyXT1uWzJdKm8sZVszXT0wLGVbNF09bls0XSppLGVbNV09bls1XSppLGVbNl09bls2XSppLGVbN109MCxlWzhdPW5bOF0qYSxlWzldPW5bOV0qYSxlWzEwXT1uWzEwXSphLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21FdWxlcih0KXt0JiZ0LmlzRXVsZXJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5tYWtlUm90YXRpb25Gcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuIik7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC54LG89dC55LGk9dC56LGE9TWF0aC5jb3Mobikscj1NYXRoLnNpbihuKSxzPU1hdGguY29zKG8pLGw9TWF0aC5zaW4obyksYz1NYXRoLmNvcyhpKSxkPU1hdGguc2luKGkpO2lmKCJYWVoiPT09dC5vcmRlcil7Y29uc3QgdD1hKmMsbj1hKmQsbz1yKmMsaT1yKmQ7ZVswXT1zKmMsZVs0XT0tcypkLGVbOF09bCxlWzFdPW4rbypsLGVbNV09dC1pKmwsZVs5XT0tcipzLGVbMl09aS10KmwsZVs2XT1vK24qbCxlWzEwXT1hKnN9ZWxzZSBpZigiWVhaIj09PXQub3JkZXIpe2NvbnN0IHQ9cypjLG49cypkLG89bCpjLGk9bCpkO2VbMF09dCtpKnIsZVs0XT1vKnItbixlWzhdPWEqbCxlWzFdPWEqZCxlWzVdPWEqYyxlWzldPS1yLGVbMl09bipyLW8sZVs2XT1pK3QqcixlWzEwXT1hKnN9ZWxzZSBpZigiWlhZIj09PXQub3JkZXIpe2NvbnN0IHQ9cypjLG49cypkLG89bCpjLGk9bCpkO2VbMF09dC1pKnIsZVs0XT0tYSpkLGVbOF09bytuKnIsZVsxXT1uK28qcixlWzVdPWEqYyxlWzldPWktdCpyLGVbMl09LWEqbCxlWzZdPXIsZVsxMF09YSpzfWVsc2UgaWYoIlpZWCI9PT10Lm9yZGVyKXtjb25zdCB0PWEqYyxuPWEqZCxvPXIqYyxpPXIqZDtlWzBdPXMqYyxlWzRdPW8qbC1uLGVbOF09dCpsK2ksZVsxXT1zKmQsZVs1XT1pKmwrdCxlWzldPW4qbC1vLGVbMl09LWwsZVs2XT1yKnMsZVsxMF09YSpzfWVsc2UgaWYoIllaWCI9PT10Lm9yZGVyKXtjb25zdCB0PWEqcyxuPWEqbCxvPXIqcyxpPXIqbDtlWzBdPXMqYyxlWzRdPWktdCpkLGVbOF09bypkK24sZVsxXT1kLGVbNV09YSpjLGVbOV09LXIqYyxlWzJdPS1sKmMsZVs2XT1uKmQrbyxlWzEwXT10LWkqZH1lbHNlIGlmKCJYWlkiPT09dC5vcmRlcil7Y29uc3QgdD1hKnMsbj1hKmwsbz1yKnMsaT1yKmw7ZVswXT1zKmMsZVs0XT0tZCxlWzhdPWwqYyxlWzFdPXQqZCtpLGVbNV09YSpjLGVbOV09bipkLW8sZVsyXT1vKmQtbixlWzZdPXIqYyxlWzEwXT1pKmQrdH1yZXR1cm4gZVszXT0wLGVbN109MCxlWzExXT0wLGVbMTJdPTAsZVsxM109MCxlWzE0XT0wLGVbMTVdPTEsdGhpc31tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy5jb21wb3NlKFVhdCx0LEdhdCl9bG9va0F0KHQsZSxuKXtjb25zdCBvPXRoaXMuZWxlbWVudHM7cmV0dXJuIHFhdC5zdWJWZWN0b3JzKHQsZSksMD09PXFhdC5sZW5ndGhTcSgpJiYocWF0Lno9MSkscWF0Lm5vcm1hbGl6ZSgpLFdhdC5jcm9zc1ZlY3RvcnMobixxYXQpLDA9PT1XYXQubGVuZ3RoU3EoKSYmKDE9PT1NYXRoLmFicyhuLnopP3FhdC54Kz0xZS00OnFhdC56Kz0xZS00LHFhdC5ub3JtYWxpemUoKSxXYXQuY3Jvc3NWZWN0b3JzKG4scWF0KSksV2F0Lm5vcm1hbGl6ZSgpLFlhdC5jcm9zc1ZlY3RvcnMocWF0LFdhdCksb1swXT1XYXQueCxvWzRdPVlhdC54LG9bOF09cWF0Lngsb1sxXT1XYXQueSxvWzVdPVlhdC55LG9bOV09cWF0Lnksb1syXT1XYXQueixvWzZdPVlhdC56LG9bMTBdPXFhdC56LHRoaXN9bXVsdGlwbHkodCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseU1hdHJpY2VzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5TWF0cmljZXModCxlKSk6dGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LHRoaXMpfW11bHRpcGx5TWF0cmljZXModCxlKXtjb25zdCBuPXQuZWxlbWVudHMsbz1lLmVsZW1lbnRzLGk9dGhpcy5lbGVtZW50cyxhPW5bMF0scj1uWzRdLHM9bls4XSxsPW5bMTJdLGM9blsxXSxkPW5bNV0scD1uWzldLG09blsxM10sdT1uWzJdLGY9bls2XSxnPW5bMTBdLGg9blsxNF0sYj1uWzNdLHk9bls3XSxfPW5bMTFdLEM9blsxNV0sTT1vWzBdLHY9b1s0XSx4PW9bOF0sTz1vWzEyXSxQPW9bMV0sdz1vWzVdLGs9b1s5XSxTPW9bMTNdLEQ9b1syXSxFPW9bNl0sUj1vWzEwXSxBPW9bMTRdLFQ9b1szXSxOPW9bN10sej1vWzExXSxJPW9bMTVdO3JldHVybiBpWzBdPWEqTStyKlArcypEK2wqVCxpWzRdPWEqdityKncrcypFK2wqTixpWzhdPWEqeCtyKmsrcypSK2wqeixpWzEyXT1hKk8rcipTK3MqQStsKkksaVsxXT1jKk0rZCpQK3AqRCttKlQsaVs1XT1jKnYrZCp3K3AqRSttKk4saVs5XT1jKngrZCprK3AqUittKnosaVsxM109YypPK2QqUytwKkErbSpJLGlbMl09dSpNK2YqUCtnKkQraCpULGlbNl09dSp2K2YqdytnKkUraCpOLGlbMTBdPXUqeCtmKmsrZypSK2gqeixpWzE0XT11Kk8rZipTK2cqQStoKkksaVszXT1iKk0reSpQK18qRCtDKlQsaVs3XT1iKnYreSp3K18qRStDKk4saVsxMV09Yip4K3kqaytfKlIrQyp6LGlbMTVdPWIqTyt5KlMrXypBK0MqSSx0aGlzfW11bHRpcGx5U2NhbGFyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gZVswXSo9dCxlWzRdKj10LGVbOF0qPXQsZVsxMl0qPXQsZVsxXSo9dCxlWzVdKj10LGVbOV0qPXQsZVsxM10qPXQsZVsyXSo9dCxlWzZdKj10LGVbMTBdKj10LGVbMTRdKj10LGVbM10qPXQsZVs3XSo9dCxlWzExXSo9dCxlWzE1XSo9dCx0aGlzfWRldGVybWluYW50KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbNF0sbz10WzhdLGk9dFsxMl0sYT10WzFdLHI9dFs1XSxzPXRbOV0sbD10WzEzXSxjPXRbMl0sZD10WzZdLHA9dFsxMF0sbT10WzE0XTtyZXR1cm4gdFszXSooK2kqcypkLW8qbCpkLWkqcipwK24qbCpwK28qciptLW4qcyptKSt0WzddKigrZSpzKm0tZSpsKnAraSphKnAtbyphKm0rbypsKmMtaSpzKmMpK3RbMTFdKigrZSpsKmQtZSpyKm0taSphKmQrbiphKm0raSpyKmMtbipsKmMpK3RbMTVdKigtbypyKmMtZSpzKmQrZSpyKnArbyphKmQtbiphKnArbipzKmMpfXRyYW5zcG9zZSgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cztsZXQgZTtyZXR1cm4gZT10WzFdLHRbMV09dFs0XSx0WzRdPWUsZT10WzJdLHRbMl09dFs4XSx0WzhdPWUsZT10WzZdLHRbNl09dFs5XSx0WzldPWUsZT10WzNdLHRbM109dFsxMl0sdFsxMl09ZSxlPXRbN10sdFs3XT10WzEzXSx0WzEzXT1lLGU9dFsxMV0sdFsxMV09dFsxNF0sdFsxNF09ZSx0aGlzfXNldFBvc2l0aW9uKHQsZSxuKXtjb25zdCBvPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQuaXNWZWN0b3IzPyhvWzEyXT10Lngsb1sxM109dC55LG9bMTRdPXQueik6KG9bMTJdPXQsb1sxM109ZSxvWzE0XT1uKSx0aGlzfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLG89dFsyXSxpPXRbM10sYT10WzRdLHI9dFs1XSxzPXRbNl0sbD10WzddLGM9dFs4XSxkPXRbOV0scD10WzEwXSxtPXRbMTFdLHU9dFsxMl0sZj10WzEzXSxnPXRbMTRdLGg9dFsxNV0sYj1kKmcqbC1mKnAqbCtmKnMqbS1yKmcqbS1kKnMqaCtyKnAqaCx5PXUqcCpsLWMqZypsLXUqcyptK2EqZyptK2MqcypoLWEqcCpoLF89YypmKmwtdSpkKmwrdSpyKm0tYSpmKm0tYypyKmgrYSpkKmgsQz11KmQqcy1jKmYqcy11KnIqcCthKmYqcCtjKnIqZy1hKmQqZyxNPWUqYituKnkrbypfK2kqQztpZigwPT09TSlyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3Qgdj0xL007cmV0dXJuIHRbMF09Yip2LHRbMV09KGYqcCppLWQqZyppLWYqbyptK24qZyptK2QqbypoLW4qcCpoKSp2LHRbMl09KHIqZyppLWYqcyppK2YqbypsLW4qZypsLXIqbypoK24qcypoKSp2LHRbM109KGQqcyppLXIqcCppLWQqbypsK24qcCpsK3IqbyptLW4qcyptKSp2LHRbNF09eSp2LHRbNV09KGMqZyppLXUqcCppK3UqbyptLWUqZyptLWMqbypoK2UqcCpoKSp2LHRbNl09KHUqcyppLWEqZyppLXUqbypsK2UqZypsK2EqbypoLWUqcypoKSp2LHRbN109KGEqcCppLWMqcyppK2MqbypsLWUqcCpsLWEqbyptK2UqcyptKSp2LHRbOF09Xyp2LHRbOV09KHUqZCppLWMqZippLXUqbiptK2UqZiptK2MqbipoLWUqZCpoKSp2LHRbMTBdPShhKmYqaS11KnIqaSt1Km4qbC1lKmYqbC1hKm4qaCtlKnIqaCkqdix0WzExXT0oYypyKmktYSpkKmktYypuKmwrZSpkKmwrYSpuKm0tZSpyKm0pKnYsdFsxMl09Qyp2LHRbMTNdPShjKmYqby11KmQqbyt1Km4qcC1lKmYqcC1jKm4qZytlKmQqZykqdix0WzE0XT0odSpyKm8tYSpmKm8tdSpuKnMrZSpmKnMrYSpuKmctZSpyKmcpKnYsdFsxNV09KGEqZCpvLWMqcipvK2MqbipzLWUqZCpzLWEqbipwK2UqcipwKSp2LHRoaXN9c2NhbGUodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC54LG89dC55LGk9dC56O3JldHVybiBlWzBdKj1uLGVbNF0qPW8sZVs4XSo9aSxlWzFdKj1uLGVbNV0qPW8sZVs5XSo9aSxlWzJdKj1uLGVbNl0qPW8sZVsxMF0qPWksZVszXSo9bixlWzddKj1vLGVbMTFdKj1pLHRoaXN9Z2V0TWF4U2NhbGVPbkF4aXMoKXtjb25zdCB0PXRoaXMuZWxlbWVudHM7cmV0dXJuIE1hdGguc3FydChNYXRoLm1heCh0WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSx0WzRdKnRbNF0rdFs1XSp0WzVdK3RbNl0qdFs2XSx0WzhdKnRbOF0rdFs5XSp0WzldK3RbMTBdKnRbMTBdKSl9bWFrZVRyYW5zbGF0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsdCwwLDEsMCxlLDAsMCwxLG4sMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25YKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLGUsLW4sMCwwLG4sZSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWSh0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsMCxuLDAsMCwxLDAsMCwtbiwwLGUsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbloodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLC1uLDAsMCxuLGUsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25BeGlzKHQsZSl7Y29uc3Qgbj1NYXRoLmNvcyhlKSxvPU1hdGguc2luKGUpLGk9MS1uLGE9dC54LHI9dC55LHM9dC56LGw9aSphLGM9aSpyO3JldHVybiB0aGlzLnNldChsKmErbixsKnItbypzLGwqcytvKnIsMCxsKnIrbypzLGMqcituLGMqcy1vKmEsMCxsKnMtbypyLGMqcytvKmEsaSpzKnMrbiwwLDAsMCwwLDEpLHRoaXN9bWFrZVNjYWxlKHQsZSxuKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCwwLGUsMCwwLDAsMCxuLDAsMCwwLDAsMSksdGhpc31tYWtlU2hlYXIodCxlLG4sbyxpLGEpe3JldHVybiB0aGlzLnNldCgxLG4saSwwLHQsMSxhLDAsZSxvLDEsMCwwLDAsMCwxKSx0aGlzfWNvbXBvc2UodCxlLG4pe2NvbnN0IG89dGhpcy5lbGVtZW50cyxpPWUuX3gsYT1lLl95LHI9ZS5feixzPWUuX3csbD1pK2ksYz1hK2EsZD1yK3IscD1pKmwsbT1pKmMsdT1pKmQsZj1hKmMsZz1hKmQsaD1yKmQsYj1zKmwseT1zKmMsXz1zKmQsQz1uLngsTT1uLnksdj1uLno7cmV0dXJuIG9bMF09KDEtKGYraCkpKkMsb1sxXT0obStfKSpDLG9bMl09KHUteSkqQyxvWzNdPTAsb1s0XT0obS1fKSpNLG9bNV09KDEtKHAraCkpKk0sb1s2XT0oZytiKSpNLG9bN109MCxvWzhdPSh1K3kpKnYsb1s5XT0oZy1iKSp2LG9bMTBdPSgxLShwK2YpKSp2LG9bMTFdPTAsb1sxMl09dC54LG9bMTNdPXQueSxvWzE0XT10Lnosb1sxNV09MSx0aGlzfWRlY29tcG9zZSh0LGUsbil7Y29uc3Qgbz10aGlzLmVsZW1lbnRzO2xldCBpPVZhdC5zZXQob1swXSxvWzFdLG9bMl0pLmxlbmd0aCgpO2NvbnN0IGE9VmF0LnNldChvWzRdLG9bNV0sb1s2XSkubGVuZ3RoKCkscj1WYXQuc2V0KG9bOF0sb1s5XSxvWzEwXSkubGVuZ3RoKCk7dGhpcy5kZXRlcm1pbmFudCgpPDAmJihpPS1pKSx0Lng9b1sxMl0sdC55PW9bMTNdLHQuej1vWzE0XSxqYXQuY29weSh0aGlzKTtjb25zdCBzPTEvaSxsPTEvYSxjPTEvcjtyZXR1cm4gamF0LmVsZW1lbnRzWzBdKj1zLGphdC5lbGVtZW50c1sxXSo9cyxqYXQuZWxlbWVudHNbMl0qPXMsamF0LmVsZW1lbnRzWzRdKj1sLGphdC5lbGVtZW50c1s1XSo9bCxqYXQuZWxlbWVudHNbNl0qPWwsamF0LmVsZW1lbnRzWzhdKj1jLGphdC5lbGVtZW50c1s5XSo9YyxqYXQuZWxlbWVudHNbMTBdKj1jLGUuc2V0RnJvbVJvdGF0aW9uTWF0cml4KGphdCksbi54PWksbi55PWEsbi56PXIsdGhpc31tYWtlUGVyc3BlY3RpdmUodCxlLG4sbyxpLGEpe3ZvaWQgMD09PWEmJmNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm1ha2VQZXJzcGVjdGl2ZSgpIGhhcyBiZWVuIHJlZGVmaW5lZCBhbmQgaGFzIGEgbmV3IHNpZ25hdHVyZS4gUGxlYXNlIGNoZWNrIHRoZSBkb2NzLiIpO2NvbnN0IHI9dGhpcy5lbGVtZW50cyxzPTIqaS8obi1vKSxsPShlK3QpLyhlLXQpLGM9KG4rbykvKG4tbyksZD0tKGEraSkvKGEtaSkscD0tMiphKmkvKGEtaSk7cmV0dXJuIHJbMF09MippLyhlLXQpLHJbNF09MCxyWzhdPWwsclsxMl09MCxyWzFdPTAscls1XT1zLHJbOV09YyxyWzEzXT0wLHJbMl09MCxyWzZdPTAsclsxMF09ZCxyWzE0XT1wLHJbM109MCxyWzddPTAsclsxMV09LTEsclsxNV09MCx0aGlzfW1ha2VPcnRob2dyYXBoaWModCxlLG4sbyxpLGEpe2NvbnN0IHI9dGhpcy5lbGVtZW50cyxzPTEvKGUtdCksbD0xLyhuLW8pLGM9MS8oYS1pKSxkPShlK3QpKnMscD0obitvKSpsLG09KGEraSkqYztyZXR1cm4gclswXT0yKnMscls0XT0wLHJbOF09MCxyWzEyXT0tZCxyWzFdPTAscls1XT0yKmwscls5XT0wLHJbMTNdPS1wLHJbMl09MCxyWzZdPTAsclsxMF09LTIqYyxyWzE0XT0tbSxyWzNdPTAscls3XT0wLHJbMTFdPTAsclsxNV09MSx0aGlzfWVxdWFscyh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO2ZvcihsZXQgdD0wO3Q8MTY7dCsrKWlmKGVbdF0hPT1uW3RdKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheSh0LGU9MCl7Zm9yKGxldCBuPTA7bjwxNjtuKyspdGhpcy5lbGVtZW50c1tuXT10W24rZV07cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO3JldHVybiB0W2VdPW5bMF0sdFtlKzFdPW5bMV0sdFtlKzJdPW5bMl0sdFtlKzNdPW5bM10sdFtlKzRdPW5bNF0sdFtlKzVdPW5bNV0sdFtlKzZdPW5bNl0sdFtlKzddPW5bN10sdFtlKzhdPW5bOF0sdFtlKzldPW5bOV0sdFtlKzEwXT1uWzEwXSx0W2UrMTFdPW5bMTFdLHRbZSsxMl09blsxMl0sdFtlKzEzXT1uWzEzXSx0W2UrMTRdPW5bMTRdLHRbZSsxNV09blsxNV0sdH19QmF0LnByb3RvdHlwZS5pc01hdHJpeDQ9ITA7Y29uc3QgVmF0PW5ldyBjYXQsamF0PW5ldyBCYXQsVWF0PW5ldyBjYXQoMCwwLDApLEdhdD1uZXcgY2F0KDEsMSwxKSxXYXQ9bmV3IGNhdCxZYXQ9bmV3IGNhdCxxYXQ9bmV3IGNhdCxaYXQ9bmV3IEJhdCxYYXQ9bmV3IGxhdDtjbGFzcyBLYXR7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAsbz1LYXQuRGVmYXVsdE9yZGVyKXt0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl9vcmRlcj1vfWdldCB4KCl7cmV0dXJuIHRoaXMuX3h9c2V0IHgodCl7dGhpcy5feD10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeSgpe3JldHVybiB0aGlzLl95fXNldCB5KHQpe3RoaXMuX3k9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fen1zZXQgeih0KXt0aGlzLl96PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCBvcmRlcigpe3JldHVybiB0aGlzLl9vcmRlcn1zZXQgb3JkZXIodCl7dGhpcy5fb3JkZXI9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9c2V0KHQsZSxuLG89dGhpcy5fb3JkZXIpe3JldHVybiB0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl9vcmRlcj1vLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX29yZGVyKX1jb3B5KHQpe3JldHVybiB0aGlzLl94PXQuX3gsdGhpcy5feT10Ll95LHRoaXMuX3o9dC5feix0aGlzLl9vcmRlcj10Ll9vcmRlcix0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUm90YXRpb25NYXRyaXgodCxlPXRoaXMuX29yZGVyLG49ITApe2NvbnN0IG89dC5lbGVtZW50cyxpPW9bMF0sYT1vWzRdLHI9b1s4XSxzPW9bMV0sbD1vWzVdLGM9b1s5XSxkPW9bMl0scD1vWzZdLG09b1sxMF07c3dpdGNoKGUpe2Nhc2UiWFlaIjp0aGlzLl95PU1hdGguYXNpbihaaXQociwtMSwxKSksTWF0aC5hYnMocik8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMigtYyxtKSx0aGlzLl96PU1hdGguYXRhbjIoLWEsaSkpOih0aGlzLl94PU1hdGguYXRhbjIocCxsKSx0aGlzLl96PTApO2JyZWFrO2Nhc2UiWVhaIjp0aGlzLl94PU1hdGguYXNpbigtWml0KGMsLTEsMSkpLE1hdGguYWJzKGMpPC45OTk5OTk5Pyh0aGlzLl95PU1hdGguYXRhbjIocixtKSx0aGlzLl96PU1hdGguYXRhbjIocyxsKSk6KHRoaXMuX3k9TWF0aC5hdGFuMigtZCxpKSx0aGlzLl96PTApO2JyZWFrO2Nhc2UiWlhZIjp0aGlzLl94PU1hdGguYXNpbihaaXQocCwtMSwxKSksTWF0aC5hYnMocCk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMigtZCxtKSx0aGlzLl96PU1hdGguYXRhbjIoLWEsbCkpOih0aGlzLl95PTAsdGhpcy5fej1NYXRoLmF0YW4yKHMsaSkpO2JyZWFrO2Nhc2UiWllYIjp0aGlzLl95PU1hdGguYXNpbigtWml0KGQsLTEsMSkpLE1hdGguYWJzKGQpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIocCxtKSx0aGlzLl96PU1hdGguYXRhbjIocyxpKSk6KHRoaXMuX3g9MCx0aGlzLl96PU1hdGguYXRhbjIoLWEsbCkpO2JyZWFrO2Nhc2UiWVpYIjp0aGlzLl96PU1hdGguYXNpbihaaXQocywtMSwxKSksTWF0aC5hYnMocyk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMigtYyxsKSx0aGlzLl95PU1hdGguYXRhbjIoLWQsaSkpOih0aGlzLl94PTAsdGhpcy5feT1NYXRoLmF0YW4yKHIsbSkpO2JyZWFrO2Nhc2UiWFpZIjp0aGlzLl96PU1hdGguYXNpbigtWml0KGEsLTEsMSkpLE1hdGguYWJzKGEpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIocCxsKSx0aGlzLl95PU1hdGguYXRhbjIocixpKSk6KHRoaXMuX3g9TWF0aC5hdGFuMigtYyxtKSx0aGlzLl95PTApO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrZSl9cmV0dXJuIHRoaXMuX29yZGVyPWUsITA9PT1uJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUXVhdGVybmlvbih0LGUsbil7cmV0dXJuIFphdC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KSx0aGlzLnNldEZyb21Sb3RhdGlvbk1hdHJpeChaYXQsZSxuKX1zZXRGcm9tVmVjdG9yMyh0LGU9dGhpcy5fb3JkZXIpe3JldHVybiB0aGlzLnNldCh0LngsdC55LHQueixlKX1yZW9yZGVyKHQpe3JldHVybiBYYXQuc2V0RnJvbUV1bGVyKHRoaXMpLHRoaXMuc2V0RnJvbVF1YXRlcm5pb24oWGF0LHQpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fb3JkZXI9PT10aGlzLl9vcmRlcn1mcm9tQXJyYXkodCl7cmV0dXJuIHRoaXMuX3g9dFswXSx0aGlzLl95PXRbMV0sdGhpcy5fej10WzJdLHZvaWQgMCE9PXRbM10mJih0aGlzLl9vcmRlcj10WzNdKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLl94LHRbZSsxXT10aGlzLl95LHRbZSsyXT10aGlzLl96LHRbZSszXT10aGlzLl9vcmRlcix0fXRvVmVjdG9yMyh0KXtyZXR1cm4gdD90LnNldCh0aGlzLl94LHRoaXMuX3ksdGhpcy5feik6bmV3IGNhdCh0aGlzLl94LHRoaXMuX3ksdGhpcy5feil9X29uQ2hhbmdlKHQpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPXQsdGhpc31fb25DaGFuZ2VDYWxsYmFjaygpe319S2F0LnByb3RvdHlwZS5pc0V1bGVyPSEwLEthdC5EZWZhdWx0T3JkZXI9IlhZWiIsS2F0LlJvdGF0aW9uT3JkZXJzPVsiWFlaIiwiWVpYIiwiWlhZIiwiWFpZIiwiWVhaIiwiWllYIl07Y2xhc3MgSmF0e2NvbnN0cnVjdG9yKCl7dGhpcy5tYXNrPTF9c2V0KHQpe3RoaXMubWFzaz0xPDx0fDB9ZW5hYmxlKHQpe3RoaXMubWFza3w9MTw8dHwwfWVuYWJsZUFsbCgpe3RoaXMubWFzaz0tMX10b2dnbGUodCl7dGhpcy5tYXNrXj0xPDx0fDB9ZGlzYWJsZSh0KXt0aGlzLm1hc2smPX4oMTw8dHwwKX1kaXNhYmxlQWxsKCl7dGhpcy5tYXNrPTB9dGVzdCh0KXtyZXR1cm4gMCE9KHRoaXMubWFzayZ0Lm1hc2spfX1sZXQgUWF0PTA7Y29uc3QgJGF0PW5ldyBjYXQsdHJ0PW5ldyBsYXQsZXJ0PW5ldyBCYXQsbnJ0PW5ldyBjYXQsb3J0PW5ldyBjYXQsaXJ0PW5ldyBjYXQsYXJ0PW5ldyBsYXQscnJ0PW5ldyBjYXQoMSwwLDApLHNydD1uZXcgY2F0KDAsMSwwKSxscnQ9bmV3IGNhdCgwLDAsMSksY3J0PXt0eXBlOiJhZGRlZCJ9LGRydD17dHlwZToicmVtb3ZlZCJ9O2NsYXNzIHBydCBleHRlbmRzIFVpdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6UWF0Kyt9KSx0aGlzLnV1aWQ9cWl0KCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iT2JqZWN0M0QiLHRoaXMucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbj1bXSx0aGlzLnVwPXBydC5EZWZhdWx0VXAuY2xvbmUoKTtjb25zdCB0PW5ldyBjYXQsZT1uZXcgS2F0LG49bmV3IGxhdCxvPW5ldyBjYXQoMSwxLDEpO2UuX29uQ2hhbmdlKChmdW5jdGlvbiBpKCl7bi5zZXRGcm9tRXVsZXIoZSwhMSl9KSksbi5fb25DaGFuZ2UoKGZ1bmN0aW9uIGEoKXtlLnNldEZyb21RdWF0ZXJuaW9uKG4sdm9pZCAwLCExKX0pKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtwb3NpdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dH0scm90YXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmV9LHF1YXRlcm5pb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm59LHNjYWxlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpvfSxtb2RlbFZpZXdNYXRyaXg6e3ZhbHVlOm5ldyBCYXR9LG5vcm1hbE1hdHJpeDp7dmFsdWU6bmV3ICRpdH19KSx0aGlzLm1hdHJpeD1uZXcgQmF0LHRoaXMubWF0cml4V29ybGQ9bmV3IEJhdCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9cHJ0LkRlZmF1bHRNYXRyaXhBdXRvVXBkYXRlLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSx0aGlzLmxheWVycz1uZXcgSmF0LHRoaXMudmlzaWJsZT0hMCx0aGlzLmNhc3RTaGFkb3c9ITEsdGhpcy5yZWNlaXZlU2hhZG93PSExLHRoaXMuZnJ1c3R1bUN1bGxlZD0hMCx0aGlzLnJlbmRlck9yZGVyPTAsdGhpcy5hbmltYXRpb25zPVtdLHRoaXMudXNlckRhdGE9e319b25CZWZvcmVSZW5kZXIoKXt9b25BZnRlclJlbmRlcigpe31hcHBseU1hdHJpeDQodCl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLHRoaXMubWF0cml4LnByZW11bHRpcGx5KHQpLHRoaXMubWF0cml4LmRlY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKX1hcHBseVF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSh0KSx0aGlzfXNldFJvdGF0aW9uRnJvbUF4aXNBbmdsZSh0LGUpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKHQsZSl9c2V0Um90YXRpb25Gcm9tRXVsZXIodCl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21FdWxlcih0LCEwKX1zZXRSb3RhdGlvbkZyb21NYXRyaXgodCl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCh0KX1zZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpe3RoaXMucXVhdGVybmlvbi5jb3B5KHQpfXJvdGF0ZU9uQXhpcyh0LGUpe3JldHVybiB0cnQuc2V0RnJvbUF4aXNBbmdsZSh0LGUpLHRoaXMucXVhdGVybmlvbi5tdWx0aXBseSh0cnQpLHRoaXN9cm90YXRlT25Xb3JsZEF4aXModCxlKXtyZXR1cm4gdHJ0LnNldEZyb21BeGlzQW5nbGUodCxlKSx0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkodHJ0KSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKHJydCx0KX1yb3RhdGVZKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhzcnQsdCl9cm90YXRlWih0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMobHJ0LHQpfXRyYW5zbGF0ZU9uQXhpcyh0LGUpe3JldHVybiAkYXQuY29weSh0KS5hcHBseVF1YXRlcm5pb24odGhpcy5xdWF0ZXJuaW9uKSx0aGlzLnBvc2l0aW9uLmFkZCgkYXQubXVsdGlwbHlTY2FsYXIoZSkpLHRoaXN9dHJhbnNsYXRlWCh0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMocnJ0LHQpfXRyYW5zbGF0ZVkodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKHNydCx0KX10cmFuc2xhdGVaKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhscnQsdCl9bG9jYWxUb1dvcmxkKHQpe3JldHVybiB0LmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKX13b3JsZFRvTG9jYWwodCl7cmV0dXJuIHQuYXBwbHlNYXRyaXg0KGVydC5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpKX1sb29rQXQodCxlLG4pe3QuaXNWZWN0b3IzP25ydC5jb3B5KHQpOm5ydC5zZXQodCxlLG4pO2NvbnN0IG89dGhpcy5wYXJlbnQ7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksb3J0LnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKSx0aGlzLmlzQ2FtZXJhfHx0aGlzLmlzTGlnaHQ/ZXJ0Lmxvb2tBdChvcnQsbnJ0LHRoaXMudXApOmVydC5sb29rQXQobnJ0LG9ydCx0aGlzLnVwKSx0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KGVydCksbyYmKGVydC5leHRyYWN0Um90YXRpb24oby5tYXRyaXhXb3JsZCksdHJ0LnNldEZyb21Sb3RhdGlvbk1hdHJpeChlcnQpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSh0cnQuaW52ZXJ0KCkpKX1hZGQodCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXRoaXMuYWRkKGFyZ3VtZW50c1t0XSk7cmV0dXJuIHRoaXN9cmV0dXJuIHQ9PT10aGlzPyhjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBjYW4ndCBiZSBhZGRlZCBhcyBhIGNoaWxkIG9mIGl0c2VsZi4iLHQpLHRoaXMpOih0JiZ0LmlzT2JqZWN0M0Q/KG51bGwhPT10LnBhcmVudCYmdC5wYXJlbnQucmVtb3ZlKHQpLHQucGFyZW50PXRoaXMsdGhpcy5jaGlsZHJlbi5wdXNoKHQpLHQuZGlzcGF0Y2hFdmVudChjcnQpKTpjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuT2JqZWN0M0QuIix0KSx0aGlzKX1yZW1vdmUodCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXRoaXMucmVtb3ZlKGFyZ3VtZW50c1t0XSk7cmV0dXJuIHRoaXN9Y29uc3QgZT10aGlzLmNoaWxkcmVuLmluZGV4T2YodCk7cmV0dXJuLTEhPT1lJiYodC5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuLnNwbGljZShlLDEpLHQuZGlzcGF0Y2hFdmVudChkcnQpKSx0aGlzfXJlbW92ZUZyb21QYXJlbnQoKXtjb25zdCB0PXRoaXMucGFyZW50O3JldHVybiBudWxsIT09dCYmdC5yZW1vdmUodGhpcyksdGhpc31jbGVhcigpe2ZvcihsZXQgdD0wO3Q8dGhpcy5jaGlsZHJlbi5sZW5ndGg7dCsrKXtjb25zdCBlPXRoaXMuY2hpbGRyZW5bdF07ZS5wYXJlbnQ9bnVsbCxlLmRpc3BhdGNoRXZlbnQoZHJ0KX1yZXR1cm4gdGhpcy5jaGlsZHJlbi5sZW5ndGg9MCx0aGlzfWF0dGFjaCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksZXJ0LmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksbnVsbCE9PXQucGFyZW50JiYodC5wYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLGVydC5tdWx0aXBseSh0LnBhcmVudC5tYXRyaXhXb3JsZCkpLHQuYXBwbHlNYXRyaXg0KGVydCksdGhpcy5hZGQodCksdC51cGRhdGVXb3JsZE1hdHJpeCghMSwhMCksdGhpc31nZXRPYmplY3RCeUlkKHQpe3JldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoImlkIix0KX1nZXRPYmplY3RCeU5hbWUodCl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgibmFtZSIsdCl9Z2V0T2JqZWN0QnlQcm9wZXJ0eSh0LGUpe2lmKHRoaXNbdF09PT1lKXJldHVybiB0aGlzO2ZvcihsZXQgbj0wLG89dGhpcy5jaGlsZHJlbi5sZW5ndGg7bjxvO24rKyl7Y29uc3Qgbz10aGlzLmNoaWxkcmVuW25dLmdldE9iamVjdEJ5UHJvcGVydHkodCxlKTtpZih2b2lkIDAhPT1vKXJldHVybiBvfX1nZXRXb3JsZFBvc2l0aW9uKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKX1nZXRXb3JsZFF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKG9ydCx0LGlydCksdH1nZXRXb3JsZFNjYWxlKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShvcnQsYXJ0LHQpLHR9Z2V0V29ybGREaXJlY3Rpb24odCl7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSk7Y29uc3QgZT10aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO3JldHVybiB0LnNldChlWzhdLGVbOV0sZVsxMF0pLm5vcm1hbGl6ZSgpfXJheWNhc3QoKXt9dHJhdmVyc2UodCl7dCh0aGlzKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAsbz1lLmxlbmd0aDtuPG87bisrKWVbbl0udHJhdmVyc2UodCl9dHJhdmVyc2VWaXNpYmxlKHQpe2lmKCExPT09dGhpcy52aXNpYmxlKXJldHVybjt0KHRoaXMpO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxvPWUubGVuZ3RoO248bztuKyspZVtuXS50cmF2ZXJzZVZpc2libGUodCl9dHJhdmVyc2VBbmNlc3RvcnModCl7Y29uc3QgZT10aGlzLnBhcmVudDtudWxsIT09ZSYmKHQoZSksZS50cmF2ZXJzZUFuY2VzdG9ycyh0KSl9dXBkYXRlTWF0cml4KCl7dGhpcy5tYXRyaXguY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9dXBkYXRlTWF0cml4V29ybGQodCl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLCh0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGV8fHQpJiYobnVsbD09PXRoaXMucGFyZW50P3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITEsdD0hMCk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLG89ZS5sZW5ndGg7bjxvO24rKyllW25dLnVwZGF0ZU1hdHJpeFdvcmxkKHQpfXVwZGF0ZVdvcmxkTWF0cml4KHQsZSl7Y29uc3Qgbj10aGlzLnBhcmVudDtpZighMD09PXQmJm51bGwhPT1uJiZuLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksbnVsbD09PXRoaXMucGFyZW50P3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KSwhMD09PWUpe2NvbnN0IHQ9dGhpcy5jaGlsZHJlbjtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspdFtlXS51cGRhdGVXb3JsZE1hdHJpeCghMSwhMCl9fXRvSlNPTih0KXtjb25zdCBlPXZvaWQgMD09PXR8fCJzdHJpbmciPT10eXBlb2YgdCxuPXt9O2UmJih0PXtnZW9tZXRyaWVzOnt9LG1hdGVyaWFsczp7fSx0ZXh0dXJlczp7fSxpbWFnZXM6e30sc2hhcGVzOnt9LHNrZWxldG9uczp7fSxhbmltYXRpb25zOnt9fSxuLm1ldGFkYXRhPXt2ZXJzaW9uOjQuNSx0eXBlOiJPYmplY3QiLGdlbmVyYXRvcjoiT2JqZWN0M0QudG9KU09OIn0pO2NvbnN0IG89e307ZnVuY3Rpb24gaShlLG4pe3JldHVybiB2b2lkIDA9PT1lW24udXVpZF0mJihlW24udXVpZF09bi50b0pTT04odCkpLG4udXVpZH1pZihvLnV1aWQ9dGhpcy51dWlkLG8udHlwZT10aGlzLnR5cGUsIiIhPT10aGlzLm5hbWUmJihvLm5hbWU9dGhpcy5uYW1lKSwhMD09PXRoaXMuY2FzdFNoYWRvdyYmKG8uY2FzdFNoYWRvdz0hMCksITA9PT10aGlzLnJlY2VpdmVTaGFkb3cmJihvLnJlY2VpdmVTaGFkb3c9ITApLCExPT09dGhpcy52aXNpYmxlJiYoby52aXNpYmxlPSExKSwhMT09PXRoaXMuZnJ1c3R1bUN1bGxlZCYmKG8uZnJ1c3R1bUN1bGxlZD0hMSksMCE9PXRoaXMucmVuZGVyT3JkZXImJihvLnJlbmRlck9yZGVyPXRoaXMucmVuZGVyT3JkZXIpLCJ7fSIhPT1KU09OLnN0cmluZ2lmeSh0aGlzLnVzZXJEYXRhKSYmKG8udXNlckRhdGE9dGhpcy51c2VyRGF0YSksby5sYXllcnM9dGhpcy5sYXllcnMubWFzayxvLm1hdHJpeD10aGlzLm1hdHJpeC50b0FycmF5KCksITE9PT10aGlzLm1hdHJpeEF1dG9VcGRhdGUmJihvLm1hdHJpeEF1dG9VcGRhdGU9ITEpLHRoaXMuaXNJbnN0YW5jZWRNZXNoJiYoby50eXBlPSJJbnN0YW5jZWRNZXNoIixvLmNvdW50PXRoaXMuY291bnQsby5pbnN0YW5jZU1hdHJpeD10aGlzLmluc3RhbmNlTWF0cml4LnRvSlNPTigpLG51bGwhPT10aGlzLmluc3RhbmNlQ29sb3ImJihvLmluc3RhbmNlQ29sb3I9dGhpcy5pbnN0YW5jZUNvbG9yLnRvSlNPTigpKSksdGhpcy5pc1NjZW5lKXRoaXMuYmFja2dyb3VuZCYmKHRoaXMuYmFja2dyb3VuZC5pc0NvbG9yP28uYmFja2dyb3VuZD10aGlzLmJhY2tncm91bmQudG9KU09OKCk6dGhpcy5iYWNrZ3JvdW5kLmlzVGV4dHVyZSYmKG8uYmFja2dyb3VuZD10aGlzLmJhY2tncm91bmQudG9KU09OKHQpLnV1aWQpKSx0aGlzLmVudmlyb25tZW50JiZ0aGlzLmVudmlyb25tZW50LmlzVGV4dHVyZSYmKG8uZW52aXJvbm1lbnQ9dGhpcy5lbnZpcm9ubWVudC50b0pTT04odCkudXVpZCk7ZWxzZSBpZih0aGlzLmlzTWVzaHx8dGhpcy5pc0xpbmV8fHRoaXMuaXNQb2ludHMpe28uZ2VvbWV0cnk9aSh0Lmdlb21ldHJpZXMsdGhpcy5nZW9tZXRyeSk7Y29uc3QgZT10aGlzLmdlb21ldHJ5LnBhcmFtZXRlcnM7aWYodm9pZCAwIT09ZSYmdm9pZCAwIT09ZS5zaGFwZXMpe2NvbnN0IG49ZS5zaGFwZXM7aWYoQXJyYXkuaXNBcnJheShuKSlmb3IobGV0IGU9MCxvPW4ubGVuZ3RoO2U8bztlKyspaSh0LnNoYXBlcyxuW2VdKTtlbHNlIGkodC5zaGFwZXMsbil9fWlmKHRoaXMuaXNTa2lubmVkTWVzaCYmKG8uYmluZE1vZGU9dGhpcy5iaW5kTW9kZSxvLmJpbmRNYXRyaXg9dGhpcy5iaW5kTWF0cml4LnRvQXJyYXkoKSx2b2lkIDAhPT10aGlzLnNrZWxldG9uJiYoaSh0LnNrZWxldG9ucyx0aGlzLnNrZWxldG9uKSxvLnNrZWxldG9uPXRoaXMuc2tlbGV0b24udXVpZCkpLHZvaWQgMCE9PXRoaXMubWF0ZXJpYWwpaWYoQXJyYXkuaXNBcnJheSh0aGlzLm1hdGVyaWFsKSl7Y29uc3QgZT1bXTtmb3IobGV0IG49MCxvPXRoaXMubWF0ZXJpYWwubGVuZ3RoO248bztuKyspZS5wdXNoKGkodC5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbFtuXSkpO28ubWF0ZXJpYWw9ZX1lbHNlIG8ubWF0ZXJpYWw9aSh0Lm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsKTtpZih0aGlzLmNoaWxkcmVuLmxlbmd0aD4wKXtvLmNoaWxkcmVuPVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5jaGlsZHJlbi5sZW5ndGg7ZSsrKW8uY2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2VdLnRvSlNPTih0KS5vYmplY3QpfWlmKHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg+MCl7by5hbmltYXRpb25zPVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5hbmltYXRpb25zLmxlbmd0aDtlKyspby5hbmltYXRpb25zLnB1c2goaSh0LmFuaW1hdGlvbnMsdGhpcy5hbmltYXRpb25zW2VdKSl9aWYoZSl7Y29uc3QgZT1hKHQuZ2VvbWV0cmllcyksbz1hKHQubWF0ZXJpYWxzKSxpPWEodC50ZXh0dXJlcykscj1hKHQuaW1hZ2VzKSxzPWEodC5zaGFwZXMpLGw9YSh0LnNrZWxldG9ucyksYz1hKHQuYW5pbWF0aW9ucyk7ZS5sZW5ndGg+MCYmKG4uZ2VvbWV0cmllcz1lKSxvLmxlbmd0aD4wJiYobi5tYXRlcmlhbHM9byksaS5sZW5ndGg+MCYmKG4udGV4dHVyZXM9aSksci5sZW5ndGg+MCYmKG4uaW1hZ2VzPXIpLHMubGVuZ3RoPjAmJihuLnNoYXBlcz1zKSxsLmxlbmd0aD4wJiYobi5za2VsZXRvbnM9bCksYy5sZW5ndGg+MCYmKG4uYW5pbWF0aW9ucz1jKX1yZXR1cm4gbi5vYmplY3Q9byxuO2Z1bmN0aW9uIGEodCl7Y29uc3QgZT1bXTtmb3IoY29uc3QgbiBpbiB0KXtjb25zdCBvPXRbbl07ZGVsZXRlIG8ubWV0YWRhdGEsZS5wdXNoKG8pfXJldHVybiBlfX1jbG9uZSh0KXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyx0KX1jb3B5KHQsZT0hMCl7aWYodGhpcy5uYW1lPXQubmFtZSx0aGlzLnVwLmNvcHkodC51cCksdGhpcy5wb3NpdGlvbi5jb3B5KHQucG9zaXRpb24pLHRoaXMucm90YXRpb24ub3JkZXI9dC5yb3RhdGlvbi5vcmRlcix0aGlzLnF1YXRlcm5pb24uY29weSh0LnF1YXRlcm5pb24pLHRoaXMuc2NhbGUuY29weSh0LnNjYWxlKSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLm1hdHJpeFdvcmxkLmNvcHkodC5tYXRyaXhXb3JsZCksdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9dC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlLHRoaXMubGF5ZXJzLm1hc2s9dC5sYXllcnMubWFzayx0aGlzLnZpc2libGU9dC52aXNpYmxlLHRoaXMuY2FzdFNoYWRvdz10LmNhc3RTaGFkb3csdGhpcy5yZWNlaXZlU2hhZG93PXQucmVjZWl2ZVNoYWRvdyx0aGlzLmZydXN0dW1DdWxsZWQ9dC5mcnVzdHVtQ3VsbGVkLHRoaXMucmVuZGVyT3JkZXI9dC5yZW5kZXJPcmRlcix0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLCEwPT09ZSlmb3IobGV0IGU9MDtlPHQuY2hpbGRyZW4ubGVuZ3RoO2UrKyl0aGlzLmFkZCh0LmNoaWxkcmVuW2VdLmNsb25lKCkpO3JldHVybiB0aGlzfX1wcnQuRGVmYXVsdFVwPW5ldyBjYXQoMCwxLDApLHBydC5EZWZhdWx0TWF0cml4QXV0b1VwZGF0ZT0hMCxwcnQucHJvdG90eXBlLmlzT2JqZWN0M0Q9ITA7Y29uc3QgbXJ0PW5ldyBjYXQsdXJ0PW5ldyBjYXQsZnJ0PW5ldyBjYXQsZ3J0PW5ldyBjYXQsaHJ0PW5ldyBjYXQsYnJ0PW5ldyBjYXQseXJ0PW5ldyBjYXQsX3J0PW5ldyBjYXQsQ3J0PW5ldyBjYXQsTXJ0PW5ldyBjYXQ7Y2xhc3MgdnJ0e2NvbnN0cnVjdG9yKHQ9bmV3IGNhdCxlPW5ldyBjYXQsbj1uZXcgY2F0KXt0aGlzLmE9dCx0aGlzLmI9ZSx0aGlzLmM9bn1zdGF0aWMgZ2V0Tm9ybWFsKHQsZSxuLG8pe28uc3ViVmVjdG9ycyhuLGUpLG1ydC5zdWJWZWN0b3JzKHQsZSksby5jcm9zcyhtcnQpO2NvbnN0IGk9by5sZW5ndGhTcSgpO3JldHVybiBpPjA/by5tdWx0aXBseVNjYWxhcigxL01hdGguc3FydChpKSk6by5zZXQoMCwwLDApfXN0YXRpYyBnZXRCYXJ5Y29vcmQodCxlLG4sbyxpKXttcnQuc3ViVmVjdG9ycyhvLGUpLHVydC5zdWJWZWN0b3JzKG4sZSksZnJ0LnN1YlZlY3RvcnModCxlKTtjb25zdCBhPW1ydC5kb3QobXJ0KSxyPW1ydC5kb3QodXJ0KSxzPW1ydC5kb3QoZnJ0KSxsPXVydC5kb3QodXJ0KSxjPXVydC5kb3QoZnJ0KSxkPWEqbC1yKnI7aWYoMD09PWQpcmV0dXJuIGkuc2V0KC0yLC0xLC0xKTtjb25zdCBwPTEvZCxtPShsKnMtcipjKSpwLHU9KGEqYy1yKnMpKnA7cmV0dXJuIGkuc2V0KDEtbS11LHUsbSl9c3RhdGljIGNvbnRhaW5zUG9pbnQodCxlLG4sbyl7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKHQsZSxuLG8sZ3J0KSxncnQueD49MCYmZ3J0Lnk+PTAmJmdydC54K2dydC55PD0xfXN0YXRpYyBnZXRVVih0LGUsbixvLGksYSxyLHMpe3JldHVybiB0aGlzLmdldEJhcnljb29yZCh0LGUsbixvLGdydCkscy5zZXQoMCwwKSxzLmFkZFNjYWxlZFZlY3RvcihpLGdydC54KSxzLmFkZFNjYWxlZFZlY3RvcihhLGdydC55KSxzLmFkZFNjYWxlZFZlY3RvcihyLGdydC56KSxzfXN0YXRpYyBpc0Zyb250RmFjaW5nKHQsZSxuLG8pe3JldHVybiBtcnQuc3ViVmVjdG9ycyhuLGUpLHVydC5zdWJWZWN0b3JzKHQsZSksbXJ0LmNyb3NzKHVydCkuZG90KG8pPDB9c2V0KHQsZSxuKXtyZXR1cm4gdGhpcy5hLmNvcHkodCksdGhpcy5iLmNvcHkoZSksdGhpcy5jLmNvcHkobiksdGhpc31zZXRGcm9tUG9pbnRzQW5kSW5kaWNlcyh0LGUsbixvKXtyZXR1cm4gdGhpcy5hLmNvcHkodFtlXSksdGhpcy5iLmNvcHkodFtuXSksdGhpcy5jLmNvcHkodFtvXSksdGhpc31jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLmEuY29weSh0LmEpLHRoaXMuYi5jb3B5KHQuYiksdGhpcy5jLmNvcHkodC5jKSx0aGlzfWdldEFyZWEoKXtyZXR1cm4gbXJ0LnN1YlZlY3RvcnModGhpcy5jLHRoaXMuYiksdXJ0LnN1YlZlY3RvcnModGhpcy5hLHRoaXMuYiksLjUqbXJ0LmNyb3NzKHVydCkubGVuZ3RoKCl9Z2V0TWlkcG9pbnQodCl7cmV0dXJuIHQuYWRkVmVjdG9ycyh0aGlzLmEsdGhpcy5iKS5hZGQodGhpcy5jKS5tdWx0aXBseVNjYWxhcigxLzMpfWdldE5vcm1hbCh0KXtyZXR1cm4gdnJ0LmdldE5vcm1hbCh0aGlzLmEsdGhpcy5iLHRoaXMuYyx0KX1nZXRQbGFuZSh0KXtyZXR1cm4gdC5zZXRGcm9tQ29wbGFuYXJQb2ludHModGhpcy5hLHRoaXMuYix0aGlzLmMpfWdldEJhcnljb29yZCh0LGUpe3JldHVybiB2cnQuZ2V0QmFyeWNvb3JkKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSl9Z2V0VVYodCxlLG4sbyxpKXtyZXR1cm4gdnJ0LmdldFVWKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSxuLG8saSl9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdnJ0LmNvbnRhaW5zUG9pbnQodCx0aGlzLmEsdGhpcy5iLHRoaXMuYyl9aXNGcm9udEZhY2luZyh0KXtyZXR1cm4gdnJ0LmlzRnJvbnRGYWNpbmcodGhpcy5hLHRoaXMuYix0aGlzLmMsdCl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzVHJpYW5nbGUodGhpcyl9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2NvbnN0IG49dGhpcy5hLG89dGhpcy5iLGk9dGhpcy5jO2xldCBhLHI7aHJ0LnN1YlZlY3RvcnMobyxuKSxicnQuc3ViVmVjdG9ycyhpLG4pLF9ydC5zdWJWZWN0b3JzKHQsbik7Y29uc3Qgcz1ocnQuZG90KF9ydCksbD1icnQuZG90KF9ydCk7aWYoczw9MCYmbDw9MClyZXR1cm4gZS5jb3B5KG4pO0NydC5zdWJWZWN0b3JzKHQsbyk7Y29uc3QgYz1ocnQuZG90KENydCksZD1icnQuZG90KENydCk7aWYoYz49MCYmZDw9YylyZXR1cm4gZS5jb3B5KG8pO2NvbnN0IHA9cypkLWMqbDtpZihwPD0wJiZzPj0wJiZjPD0wKXJldHVybiBhPXMvKHMtYyksZS5jb3B5KG4pLmFkZFNjYWxlZFZlY3RvcihocnQsYSk7TXJ0LnN1YlZlY3RvcnModCxpKTtjb25zdCBtPWhydC5kb3QoTXJ0KSx1PWJydC5kb3QoTXJ0KTtpZih1Pj0wJiZtPD11KXJldHVybiBlLmNvcHkoaSk7Y29uc3QgZj1tKmwtcyp1O2lmKGY8PTAmJmw+PTAmJnU8PTApcmV0dXJuIHI9bC8obC11KSxlLmNvcHkobikuYWRkU2NhbGVkVmVjdG9yKGJydCxyKTtjb25zdCBnPWMqdS1tKmQ7aWYoZzw9MCYmZC1jPj0wJiZtLXU+PTApcmV0dXJuIHlydC5zdWJWZWN0b3JzKGksbykscj0oZC1jKS8oZC1jKyhtLXUpKSxlLmNvcHkobykuYWRkU2NhbGVkVmVjdG9yKHlydCxyKTtjb25zdCBoPTEvKGcrZitwKTtyZXR1cm4gYT1mKmgscj1wKmgsZS5jb3B5KG4pLmFkZFNjYWxlZFZlY3RvcihocnQsYSkuYWRkU2NhbGVkVmVjdG9yKGJydCxyKX1lcXVhbHModCl7cmV0dXJuIHQuYS5lcXVhbHModGhpcy5hKSYmdC5iLmVxdWFscyh0aGlzLmIpJiZ0LmMuZXF1YWxzKHRoaXMuYyl9fWxldCB4cnQ9MDtjbGFzcyBPcnQgZXh0ZW5kcyBVaXR7Y29uc3RydWN0b3IoKXtzdXBlcigpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOnhydCsrfSksdGhpcy51dWlkPXFpdCgpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9Ik1hdGVyaWFsIix0aGlzLmZvZz0hMCx0aGlzLmJsZW5kaW5nPTEsdGhpcy5zaWRlPTAsdGhpcy52ZXJ0ZXhDb2xvcnM9ITEsdGhpcy5vcGFjaXR5PTEsdGhpcy50cmFuc3BhcmVudD0hMSx0aGlzLmJsZW5kU3JjPTIwNCx0aGlzLmJsZW5kRHN0PTIwNSx0aGlzLmJsZW5kRXF1YXRpb249Y2l0LHRoaXMuYmxlbmRTcmNBbHBoYT1udWxsLHRoaXMuYmxlbmREc3RBbHBoYT1udWxsLHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhPW51bGwsdGhpcy5kZXB0aEZ1bmM9Myx0aGlzLmRlcHRoVGVzdD0hMCx0aGlzLmRlcHRoV3JpdGU9ITAsdGhpcy5zdGVuY2lsV3JpdGVNYXNrPTI1NSx0aGlzLnN0ZW5jaWxGdW5jPTUxOSx0aGlzLnN0ZW5jaWxSZWY9MCx0aGlzLnN0ZW5jaWxGdW5jTWFzaz0yNTUsdGhpcy5zdGVuY2lsRmFpbD1MaXQsdGhpcy5zdGVuY2lsWkZhaWw9TGl0LHRoaXMuc3RlbmNpbFpQYXNzPUxpdCx0aGlzLnN0ZW5jaWxXcml0ZT0hMSx0aGlzLmNsaXBwaW5nUGxhbmVzPW51bGwsdGhpcy5jbGlwSW50ZXJzZWN0aW9uPSExLHRoaXMuY2xpcFNoYWRvd3M9ITEsdGhpcy5zaGFkb3dTaWRlPW51bGwsdGhpcy5jb2xvcldyaXRlPSEwLHRoaXMucHJlY2lzaW9uPW51bGwsdGhpcy5wb2x5Z29uT2Zmc2V0PSExLHRoaXMucG9seWdvbk9mZnNldEZhY3Rvcj0wLHRoaXMucG9seWdvbk9mZnNldFVuaXRzPTAsdGhpcy5kaXRoZXJpbmc9ITEsdGhpcy5hbHBoYVRlc3Q9MCx0aGlzLmFscGhhVG9Db3ZlcmFnZT0hMSx0aGlzLnByZW11bHRpcGxpZWRBbHBoYT0hMSx0aGlzLnZpc2libGU9ITAsdGhpcy50b25lTWFwcGVkPSEwLHRoaXMudXNlckRhdGE9e30sdGhpcy52ZXJzaW9uPTB9b25CdWlsZCgpe31vbkJlZm9yZUNvbXBpbGUoKXt9Y3VzdG9tUHJvZ3JhbUNhY2hlS2V5KCl7cmV0dXJuIHRoaXMub25CZWZvcmVDb21waWxlLnRvU3RyaW5nKCl9c2V0VmFsdWVzKHQpe2lmKHZvaWQgMCE9PXQpZm9yKGNvbnN0IGUgaW4gdCl7Y29uc3Qgbj10W2VdO2lmKHZvaWQgMD09PW4pe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6ICciK2UrIicgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZC4iKTtjb250aW51ZX1pZigic2hhZGluZyI9PT1lKXtjb25zb2xlLndhcm4oIlRIUkVFLiIrdGhpcy50eXBlKyI6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4iKSx0aGlzLmZsYXRTaGFkaW5nPTE9PT1uO2NvbnRpbnVlfWNvbnN0IG89dGhpc1tlXTt2b2lkIDAhPT1vP28mJm8uaXNDb2xvcj9vLnNldChuKTpvJiZvLmlzVmVjdG9yMyYmbiYmbi5pc1ZlY3RvcjM/by5jb3B5KG4pOnRoaXNbZV09bjpjb25zb2xlLndhcm4oIlRIUkVFLiIrdGhpcy50eXBlKyI6ICciK2UrIicgaXMgbm90IGEgcHJvcGVydHkgb2YgdGhpcyBtYXRlcmlhbC4iKX19dG9KU09OKHQpe2NvbnN0IGU9dm9pZCAwPT09dHx8InN0cmluZyI9PXR5cGVvZiB0O2UmJih0PXt0ZXh0dXJlczp7fSxpbWFnZXM6e319KTtjb25zdCBuPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiTWF0ZXJpYWwiLGdlbmVyYXRvcjoiTWF0ZXJpYWwudG9KU09OIn19O2Z1bmN0aW9uIG8odCl7Y29uc3QgZT1bXTtmb3IoY29uc3QgbiBpbiB0KXtjb25zdCBvPXRbbl07ZGVsZXRlIG8ubWV0YWRhdGEsZS5wdXNoKG8pfXJldHVybiBlfWlmKG4udXVpZD10aGlzLnV1aWQsbi50eXBlPXRoaXMudHlwZSwiIiE9PXRoaXMubmFtZSYmKG4ubmFtZT10aGlzLm5hbWUpLHRoaXMuY29sb3ImJnRoaXMuY29sb3IuaXNDb2xvciYmKG4uY29sb3I9dGhpcy5jb2xvci5nZXRIZXgoKSksdm9pZCAwIT09dGhpcy5yb3VnaG5lc3MmJihuLnJvdWdobmVzcz10aGlzLnJvdWdobmVzcyksdm9pZCAwIT09dGhpcy5tZXRhbG5lc3MmJihuLm1ldGFsbmVzcz10aGlzLm1ldGFsbmVzcyksdGhpcy5zaGVlbiYmdGhpcy5zaGVlbi5pc0NvbG9yJiYobi5zaGVlbj10aGlzLnNoZWVuLmdldEhleCgpKSx0aGlzLmVtaXNzaXZlJiZ0aGlzLmVtaXNzaXZlLmlzQ29sb3ImJihuLmVtaXNzaXZlPXRoaXMuZW1pc3NpdmUuZ2V0SGV4KCkpLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkmJjEhPT10aGlzLmVtaXNzaXZlSW50ZW5zaXR5JiYobi5lbWlzc2l2ZUludGVuc2l0eT10aGlzLmVtaXNzaXZlSW50ZW5zaXR5KSx0aGlzLnNwZWN1bGFyJiZ0aGlzLnNwZWN1bGFyLmlzQ29sb3ImJihuLnNwZWN1bGFyPXRoaXMuc3BlY3VsYXIuZ2V0SGV4KCkpLHZvaWQgMCE9PXRoaXMuc3BlY3VsYXJJbnRlbnNpdHkmJihuLnNwZWN1bGFySW50ZW5zaXR5PXRoaXMuc3BlY3VsYXJJbnRlbnNpdHkpLHRoaXMuc3BlY3VsYXJUaW50JiZ0aGlzLnNwZWN1bGFyVGludC5pc0NvbG9yJiYobi5zcGVjdWxhclRpbnQ9dGhpcy5zcGVjdWxhclRpbnQuZ2V0SGV4KCkpLHZvaWQgMCE9PXRoaXMuc2hpbmluZXNzJiYobi5zaGluaW5lc3M9dGhpcy5zaGluaW5lc3MpLHZvaWQgMCE9PXRoaXMuY2xlYXJjb2F0JiYobi5jbGVhcmNvYXQ9dGhpcy5jbGVhcmNvYXQpLHZvaWQgMCE9PXRoaXMuY2xlYXJjb2F0Um91Z2huZXNzJiYobi5jbGVhcmNvYXRSb3VnaG5lc3M9dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MpLHRoaXMuY2xlYXJjb2F0TWFwJiZ0aGlzLmNsZWFyY29hdE1hcC5pc1RleHR1cmUmJihuLmNsZWFyY29hdE1hcD10aGlzLmNsZWFyY29hdE1hcC50b0pTT04odCkudXVpZCksdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAmJnRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLmlzVGV4dHVyZSYmKG4uY2xlYXJjb2F0Um91Z2huZXNzTWFwPXRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmNsZWFyY29hdE5vcm1hbE1hcCYmdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAuaXNUZXh0dXJlJiYobi5jbGVhcmNvYXROb3JtYWxNYXA9dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAudG9KU09OKHQpLnV1aWQsbi5jbGVhcmNvYXROb3JtYWxTY2FsZT10aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLnRvQXJyYXkoKSksdGhpcy5tYXAmJnRoaXMubWFwLmlzVGV4dHVyZSYmKG4ubWFwPXRoaXMubWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLm1hdGNhcCYmdGhpcy5tYXRjYXAuaXNUZXh0dXJlJiYobi5tYXRjYXA9dGhpcy5tYXRjYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuYWxwaGFNYXAmJnRoaXMuYWxwaGFNYXAuaXNUZXh0dXJlJiYobi5hbHBoYU1hcD10aGlzLmFscGhhTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmxpZ2h0TWFwJiZ0aGlzLmxpZ2h0TWFwLmlzVGV4dHVyZSYmKG4ubGlnaHRNYXA9dGhpcy5saWdodE1hcC50b0pTT04odCkudXVpZCxuLmxpZ2h0TWFwSW50ZW5zaXR5PXRoaXMubGlnaHRNYXBJbnRlbnNpdHkpLHRoaXMuYW9NYXAmJnRoaXMuYW9NYXAuaXNUZXh0dXJlJiYobi5hb01hcD10aGlzLmFvTWFwLnRvSlNPTih0KS51dWlkLG4uYW9NYXBJbnRlbnNpdHk9dGhpcy5hb01hcEludGVuc2l0eSksdGhpcy5idW1wTWFwJiZ0aGlzLmJ1bXBNYXAuaXNUZXh0dXJlJiYobi5idW1wTWFwPXRoaXMuYnVtcE1hcC50b0pTT04odCkudXVpZCxuLmJ1bXBTY2FsZT10aGlzLmJ1bXBTY2FsZSksdGhpcy5ub3JtYWxNYXAmJnRoaXMubm9ybWFsTWFwLmlzVGV4dHVyZSYmKG4ubm9ybWFsTWFwPXRoaXMubm9ybWFsTWFwLnRvSlNPTih0KS51dWlkLG4ubm9ybWFsTWFwVHlwZT10aGlzLm5vcm1hbE1hcFR5cGUsbi5ub3JtYWxTY2FsZT10aGlzLm5vcm1hbFNjYWxlLnRvQXJyYXkoKSksdGhpcy5kaXNwbGFjZW1lbnRNYXAmJnRoaXMuZGlzcGxhY2VtZW50TWFwLmlzVGV4dHVyZSYmKG4uZGlzcGxhY2VtZW50TWFwPXRoaXMuZGlzcGxhY2VtZW50TWFwLnRvSlNPTih0KS51dWlkLG4uZGlzcGxhY2VtZW50U2NhbGU9dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSxuLmRpc3BsYWNlbWVudEJpYXM9dGhpcy5kaXNwbGFjZW1lbnRCaWFzKSx0aGlzLnJvdWdobmVzc01hcCYmdGhpcy5yb3VnaG5lc3NNYXAuaXNUZXh0dXJlJiYobi5yb3VnaG5lc3NNYXA9dGhpcy5yb3VnaG5lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubWV0YWxuZXNzTWFwJiZ0aGlzLm1ldGFsbmVzc01hcC5pc1RleHR1cmUmJihuLm1ldGFsbmVzc01hcD10aGlzLm1ldGFsbmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5lbWlzc2l2ZU1hcCYmdGhpcy5lbWlzc2l2ZU1hcC5pc1RleHR1cmUmJihuLmVtaXNzaXZlTWFwPXRoaXMuZW1pc3NpdmVNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuc3BlY3VsYXJNYXAmJnRoaXMuc3BlY3VsYXJNYXAuaXNUZXh0dXJlJiYobi5zcGVjdWxhck1hcD10aGlzLnNwZWN1bGFyTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwJiZ0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwLmlzVGV4dHVyZSYmKG4uc3BlY3VsYXJJbnRlbnNpdHlNYXA9dGhpcy5zcGVjdWxhckludGVuc2l0eU1hcC50b0pTT04odCkudXVpZCksdGhpcy5zcGVjdWxhclRpbnRNYXAmJnRoaXMuc3BlY3VsYXJUaW50TWFwLmlzVGV4dHVyZSYmKG4uc3BlY3VsYXJUaW50TWFwPXRoaXMuc3BlY3VsYXJUaW50TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVudk1hcCYmdGhpcy5lbnZNYXAuaXNUZXh0dXJlJiYobi5lbnZNYXA9dGhpcy5lbnZNYXAudG9KU09OKHQpLnV1aWQsdm9pZCAwIT09dGhpcy5jb21iaW5lJiYobi5jb21iaW5lPXRoaXMuY29tYmluZSkpLHZvaWQgMCE9PXRoaXMuZW52TWFwSW50ZW5zaXR5JiYobi5lbnZNYXBJbnRlbnNpdHk9dGhpcy5lbnZNYXBJbnRlbnNpdHkpLHZvaWQgMCE9PXRoaXMucmVmbGVjdGl2aXR5JiYobi5yZWZsZWN0aXZpdHk9dGhpcy5yZWZsZWN0aXZpdHkpLHZvaWQgMCE9PXRoaXMucmVmcmFjdGlvblJhdGlvJiYobi5yZWZyYWN0aW9uUmF0aW89dGhpcy5yZWZyYWN0aW9uUmF0aW8pLHRoaXMuZ3JhZGllbnRNYXAmJnRoaXMuZ3JhZGllbnRNYXAuaXNUZXh0dXJlJiYobi5ncmFkaWVudE1hcD10aGlzLmdyYWRpZW50TWFwLnRvSlNPTih0KS51dWlkKSx2b2lkIDAhPT10aGlzLnRyYW5zbWlzc2lvbiYmKG4udHJhbnNtaXNzaW9uPXRoaXMudHJhbnNtaXNzaW9uKSx0aGlzLnRyYW5zbWlzc2lvbk1hcCYmdGhpcy50cmFuc21pc3Npb25NYXAuaXNUZXh0dXJlJiYobi50cmFuc21pc3Npb25NYXA9dGhpcy50cmFuc21pc3Npb25NYXAudG9KU09OKHQpLnV1aWQpLHZvaWQgMCE9PXRoaXMudGhpY2tuZXNzJiYobi50aGlja25lc3M9dGhpcy50aGlja25lc3MpLHRoaXMudGhpY2tuZXNzTWFwJiZ0aGlzLnRoaWNrbmVzc01hcC5pc1RleHR1cmUmJihuLnRoaWNrbmVzc01hcD10aGlzLnRoaWNrbmVzc01hcC50b0pTT04odCkudXVpZCksdm9pZCAwIT09dGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlJiYobi5hdHRlbnVhdGlvbkRpc3RhbmNlPXRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSksdm9pZCAwIT09dGhpcy5hdHRlbnVhdGlvblRpbnQmJihuLmF0dGVudWF0aW9uVGludD10aGlzLmF0dGVudWF0aW9uVGludC5nZXRIZXgoKSksdm9pZCAwIT09dGhpcy5zaXplJiYobi5zaXplPXRoaXMuc2l6ZSksbnVsbCE9PXRoaXMuc2hhZG93U2lkZSYmKG4uc2hhZG93U2lkZT10aGlzLnNoYWRvd1NpZGUpLHZvaWQgMCE9PXRoaXMuc2l6ZUF0dGVudWF0aW9uJiYobi5zaXplQXR0ZW51YXRpb249dGhpcy5zaXplQXR0ZW51YXRpb24pLDEhPT10aGlzLmJsZW5kaW5nJiYobi5ibGVuZGluZz10aGlzLmJsZW5kaW5nKSwwIT09dGhpcy5zaWRlJiYobi5zaWRlPXRoaXMuc2lkZSksdGhpcy52ZXJ0ZXhDb2xvcnMmJihuLnZlcnRleENvbG9ycz0hMCksdGhpcy5vcGFjaXR5PDEmJihuLm9wYWNpdHk9dGhpcy5vcGFjaXR5KSwhMD09PXRoaXMudHJhbnNwYXJlbnQmJihuLnRyYW5zcGFyZW50PXRoaXMudHJhbnNwYXJlbnQpLG4uZGVwdGhGdW5jPXRoaXMuZGVwdGhGdW5jLG4uZGVwdGhUZXN0PXRoaXMuZGVwdGhUZXN0LG4uZGVwdGhXcml0ZT10aGlzLmRlcHRoV3JpdGUsbi5jb2xvcldyaXRlPXRoaXMuY29sb3JXcml0ZSxuLnN0ZW5jaWxXcml0ZT10aGlzLnN0ZW5jaWxXcml0ZSxuLnN0ZW5jaWxXcml0ZU1hc2s9dGhpcy5zdGVuY2lsV3JpdGVNYXNrLG4uc3RlbmNpbEZ1bmM9dGhpcy5zdGVuY2lsRnVuYyxuLnN0ZW5jaWxSZWY9dGhpcy5zdGVuY2lsUmVmLG4uc3RlbmNpbEZ1bmNNYXNrPXRoaXMuc3RlbmNpbEZ1bmNNYXNrLG4uc3RlbmNpbEZhaWw9dGhpcy5zdGVuY2lsRmFpbCxuLnN0ZW5jaWxaRmFpbD10aGlzLnN0ZW5jaWxaRmFpbCxuLnN0ZW5jaWxaUGFzcz10aGlzLnN0ZW5jaWxaUGFzcyx0aGlzLnJvdGF0aW9uJiYwIT09dGhpcy5yb3RhdGlvbiYmKG4ucm90YXRpb249dGhpcy5yb3RhdGlvbiksITA9PT10aGlzLnBvbHlnb25PZmZzZXQmJihuLnBvbHlnb25PZmZzZXQ9ITApLDAhPT10aGlzLnBvbHlnb25PZmZzZXRGYWN0b3ImJihuLnBvbHlnb25PZmZzZXRGYWN0b3I9dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yKSwwIT09dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMmJihuLnBvbHlnb25PZmZzZXRVbml0cz10aGlzLnBvbHlnb25PZmZzZXRVbml0cyksdGhpcy5saW5ld2lkdGgmJjEhPT10aGlzLmxpbmV3aWR0aCYmKG4ubGluZXdpZHRoPXRoaXMubGluZXdpZHRoKSx2b2lkIDAhPT10aGlzLmRhc2hTaXplJiYobi5kYXNoU2l6ZT10aGlzLmRhc2hTaXplKSx2b2lkIDAhPT10aGlzLmdhcFNpemUmJihuLmdhcFNpemU9dGhpcy5nYXBTaXplKSx2b2lkIDAhPT10aGlzLnNjYWxlJiYobi5zY2FsZT10aGlzLnNjYWxlKSwhMD09PXRoaXMuZGl0aGVyaW5nJiYobi5kaXRoZXJpbmc9ITApLHRoaXMuYWxwaGFUZXN0PjAmJihuLmFscGhhVGVzdD10aGlzLmFscGhhVGVzdCksITA9PT10aGlzLmFscGhhVG9Db3ZlcmFnZSYmKG4uYWxwaGFUb0NvdmVyYWdlPXRoaXMuYWxwaGFUb0NvdmVyYWdlKSwhMD09PXRoaXMucHJlbXVsdGlwbGllZEFscGhhJiYobi5wcmVtdWx0aXBsaWVkQWxwaGE9dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEpLCEwPT09dGhpcy53aXJlZnJhbWUmJihuLndpcmVmcmFtZT10aGlzLndpcmVmcmFtZSksdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg+MSYmKG4ud2lyZWZyYW1lTGluZXdpZHRoPXRoaXMud2lyZWZyYW1lTGluZXdpZHRoKSwicm91bmQiIT09dGhpcy53aXJlZnJhbWVMaW5lY2FwJiYobi53aXJlZnJhbWVMaW5lY2FwPXRoaXMud2lyZWZyYW1lTGluZWNhcCksInJvdW5kIiE9PXRoaXMud2lyZWZyYW1lTGluZWpvaW4mJihuLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWpvaW4pLCEwPT09dGhpcy5mbGF0U2hhZGluZyYmKG4uZmxhdFNoYWRpbmc9dGhpcy5mbGF0U2hhZGluZyksITE9PT10aGlzLnZpc2libGUmJihuLnZpc2libGU9ITEpLCExPT09dGhpcy50b25lTWFwcGVkJiYobi50b25lTWFwcGVkPSExKSwie30iIT09SlNPTi5zdHJpbmdpZnkodGhpcy51c2VyRGF0YSkmJihuLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLGUpe2NvbnN0IGU9byh0LnRleHR1cmVzKSxpPW8odC5pbWFnZXMpO2UubGVuZ3RoPjAmJihuLnRleHR1cmVzPWUpLGkubGVuZ3RoPjAmJihuLmltYWdlcz1pKX1yZXR1cm4gbn1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMubmFtZT10Lm5hbWUsdGhpcy5mb2c9dC5mb2csdGhpcy5ibGVuZGluZz10LmJsZW5kaW5nLHRoaXMuc2lkZT10LnNpZGUsdGhpcy52ZXJ0ZXhDb2xvcnM9dC52ZXJ0ZXhDb2xvcnMsdGhpcy5vcGFjaXR5PXQub3BhY2l0eSx0aGlzLnRyYW5zcGFyZW50PXQudHJhbnNwYXJlbnQsdGhpcy5ibGVuZFNyYz10LmJsZW5kU3JjLHRoaXMuYmxlbmREc3Q9dC5ibGVuZERzdCx0aGlzLmJsZW5kRXF1YXRpb249dC5ibGVuZEVxdWF0aW9uLHRoaXMuYmxlbmRTcmNBbHBoYT10LmJsZW5kU3JjQWxwaGEsdGhpcy5ibGVuZERzdEFscGhhPXQuYmxlbmREc3RBbHBoYSx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT10LmJsZW5kRXF1YXRpb25BbHBoYSx0aGlzLmRlcHRoRnVuYz10LmRlcHRoRnVuYyx0aGlzLmRlcHRoVGVzdD10LmRlcHRoVGVzdCx0aGlzLmRlcHRoV3JpdGU9dC5kZXB0aFdyaXRlLHRoaXMuc3RlbmNpbFdyaXRlTWFzaz10LnN0ZW5jaWxXcml0ZU1hc2ssdGhpcy5zdGVuY2lsRnVuYz10LnN0ZW5jaWxGdW5jLHRoaXMuc3RlbmNpbFJlZj10LnN0ZW5jaWxSZWYsdGhpcy5zdGVuY2lsRnVuY01hc2s9dC5zdGVuY2lsRnVuY01hc2ssdGhpcy5zdGVuY2lsRmFpbD10LnN0ZW5jaWxGYWlsLHRoaXMuc3RlbmNpbFpGYWlsPXQuc3RlbmNpbFpGYWlsLHRoaXMuc3RlbmNpbFpQYXNzPXQuc3RlbmNpbFpQYXNzLHRoaXMuc3RlbmNpbFdyaXRlPXQuc3RlbmNpbFdyaXRlO2NvbnN0IGU9dC5jbGlwcGluZ1BsYW5lcztsZXQgbj1udWxsO2lmKG51bGwhPT1lKXtjb25zdCB0PWUubGVuZ3RoO249bmV3IEFycmF5KHQpO2ZvcihsZXQgbz0wO28hPT10OysrbyluW29dPWVbb10uY2xvbmUoKX1yZXR1cm4gdGhpcy5jbGlwcGluZ1BsYW5lcz1uLHRoaXMuY2xpcEludGVyc2VjdGlvbj10LmNsaXBJbnRlcnNlY3Rpb24sdGhpcy5jbGlwU2hhZG93cz10LmNsaXBTaGFkb3dzLHRoaXMuc2hhZG93U2lkZT10LnNoYWRvd1NpZGUsdGhpcy5jb2xvcldyaXRlPXQuY29sb3JXcml0ZSx0aGlzLnByZWNpc2lvbj10LnByZWNpc2lvbix0aGlzLnBvbHlnb25PZmZzZXQ9dC5wb2x5Z29uT2Zmc2V0LHRoaXMucG9seWdvbk9mZnNldEZhY3Rvcj10LnBvbHlnb25PZmZzZXRGYWN0b3IsdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHM9dC5wb2x5Z29uT2Zmc2V0VW5pdHMsdGhpcy5kaXRoZXJpbmc9dC5kaXRoZXJpbmcsdGhpcy5hbHBoYVRlc3Q9dC5hbHBoYVRlc3QsdGhpcy5hbHBoYVRvQ292ZXJhZ2U9dC5hbHBoYVRvQ292ZXJhZ2UsdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9dC5wcmVtdWx0aXBsaWVkQWxwaGEsdGhpcy52aXNpYmxlPXQudmlzaWJsZSx0aGlzLnRvbmVNYXBwZWQ9dC50b25lTWFwcGVkLHRoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnVzZXJEYXRhKSksdGhpc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXNldCBuZWVkc1VwZGF0ZSh0KXshMD09PXQmJnRoaXMudmVyc2lvbisrfX1PcnQucHJvdG90eXBlLmlzTWF0ZXJpYWw9ITA7Y29uc3QgUHJ0PXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9LHdydD17aDowLHM6MCxsOjB9LGtydD17aDowLHM6MCxsOjB9O2Z1bmN0aW9uIFNydCh0LGUsbil7cmV0dXJuIG48MCYmKG4rPTEpLG4+MSYmKG4tPTEpLG48MS82P3QrNiooZS10KSpuOm48LjU/ZTpuPDIvMz90KzYqKGUtdCkqKDIvMy1uKTp0fWZ1bmN0aW9uIERydCh0KXtyZXR1cm4gdDwuMDQwNDU/LjA3NzM5OTM4MDgqdDpNYXRoLnBvdyguOTQ3ODY3Mjk4Nip0Ky4wNTIxMzI3MDE0LDIuNCl9ZnVuY3Rpb24gRXJ0KHQpe3JldHVybiB0PC4wMDMxMzA4PzEyLjkyKnQ6MS4wNTUqTWF0aC5wb3codCwuNDE2NjYpLS4wNTV9Y2xhc3MgUnJ0e2NvbnN0cnVjdG9yKHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09ZSYmdm9pZCAwPT09bj90aGlzLnNldCh0KTp0aGlzLnNldFJHQih0LGUsbil9c2V0KHQpe3JldHVybiB0JiZ0LmlzQ29sb3I/dGhpcy5jb3B5KHQpOiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnNldEhleCh0KToic3RyaW5nIj09dHlwZW9mIHQmJnRoaXMuc2V0U3R5bGUodCksdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMucj10LHRoaXMuZz10LHRoaXMuYj10LHRoaXN9c2V0SGV4KHQpe3JldHVybiB0PU1hdGguZmxvb3IodCksdGhpcy5yPSh0Pj4xNiYyNTUpLzI1NSx0aGlzLmc9KHQ+PjgmMjU1KS8yNTUsdGhpcy5iPSgyNTUmdCkvMjU1LHRoaXN9c2V0UkdCKHQsZSxuKXtyZXR1cm4gdGhpcy5yPXQsdGhpcy5nPWUsdGhpcy5iPW4sdGhpc31zZXRIU0wodCxlLG4pe2lmKHQ9KGZ1bmN0aW9uIG8odCxlKXtyZXR1cm4odCVlK2UpJWV9KSh0LDEpLGU9Wml0KGUsMCwxKSxuPVppdChuLDAsMSksMD09PWUpdGhpcy5yPXRoaXMuZz10aGlzLmI9bjtlbHNle2NvbnN0IG89bjw9LjU/biooMStlKTpuK2UtbiplLGk9MipuLW87dGhpcy5yPVNydChpLG8sdCsxLzMpLHRoaXMuZz1TcnQoaSxvLHQpLHRoaXMuYj1TcnQoaSxvLHQtMS8zKX1yZXR1cm4gdGhpc31zZXRTdHlsZSh0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMCE9PWUmJnBhcnNlRmxvYXQoZSk8MSYmY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogQWxwaGEgY29tcG9uZW50IG9mICIrdCsiIHdpbGwgYmUgaWdub3JlZC4iKX1sZXQgbjtpZihuPS9eKCg/OnJnYnxoc2wpYT8pXCgoW15cKV0qKVwpLy5leGVjKHQpKXtsZXQgdDtjb25zdCBvPW5bMl07c3dpdGNoKG5bMV0pe2Nhc2UicmdiIjpjYXNlInJnYmEiOmlmKHQ9L15ccyooXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhvKSlyZXR1cm4gdGhpcy5yPU1hdGgubWluKDI1NSxwYXJzZUludCh0WzFdLDEwKSkvMjU1LHRoaXMuZz1NYXRoLm1pbigyNTUscGFyc2VJbnQodFsyXSwxMCkpLzI1NSx0aGlzLmI9TWF0aC5taW4oMjU1LHBhcnNlSW50KHRbM10sMTApKS8yNTUsZSh0WzRdKSx0aGlzO2lmKHQ9L15ccyooXGQrKVwlXHMqLFxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhvKSlyZXR1cm4gdGhpcy5yPU1hdGgubWluKDEwMCxwYXJzZUludCh0WzFdLDEwKSkvMTAwLHRoaXMuZz1NYXRoLm1pbigxMDAscGFyc2VJbnQodFsyXSwxMCkpLzEwMCx0aGlzLmI9TWF0aC5taW4oMTAwLHBhcnNlSW50KHRbM10sMTApKS8xMDAsZSh0WzRdKSx0aGlzO2JyZWFrO2Nhc2UiaHNsIjpjYXNlImhzbGEiOmlmKHQ9L15ccyooXGQqXC4/XGQrKVxzKixccyooXGQrKVwlXHMqLFxzKihcZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMobykpe2NvbnN0IG49cGFyc2VGbG9hdCh0WzFdKS8zNjAsbz1wYXJzZUludCh0WzJdLDEwKS8xMDAsaT1wYXJzZUludCh0WzNdLDEwKS8xMDA7cmV0dXJuIGUodFs0XSksdGhpcy5zZXRIU0wobixvLGkpfX19ZWxzZSBpZihuPS9eXCMoW0EtRmEtZlxkXSspJC8uZXhlYyh0KSl7Y29uc3QgdD1uWzFdLGU9dC5sZW5ndGg7aWYoMz09PWUpcmV0dXJuIHRoaXMucj1wYXJzZUludCh0LmNoYXJBdCgwKSt0LmNoYXJBdCgwKSwxNikvMjU1LHRoaXMuZz1wYXJzZUludCh0LmNoYXJBdCgxKSt0LmNoYXJBdCgxKSwxNikvMjU1LHRoaXMuYj1wYXJzZUludCh0LmNoYXJBdCgyKSt0LmNoYXJBdCgyKSwxNikvMjU1LHRoaXM7aWYoNj09PWUpcmV0dXJuIHRoaXMucj1wYXJzZUludCh0LmNoYXJBdCgwKSt0LmNoYXJBdCgxKSwxNikvMjU1LHRoaXMuZz1wYXJzZUludCh0LmNoYXJBdCgyKSt0LmNoYXJBdCgzKSwxNikvMjU1LHRoaXMuYj1wYXJzZUludCh0LmNoYXJBdCg0KSt0LmNoYXJBdCg1KSwxNikvMjU1LHRoaXN9cmV0dXJuIHQmJnQubGVuZ3RoPjA/dGhpcy5zZXRDb2xvck5hbWUodCk6dGhpc31zZXRDb2xvck5hbWUodCl7Y29uc3QgZT1QcnRbdC50b0xvd2VyQ2FzZSgpXTtyZXR1cm4gdm9pZCAwIT09ZT90aGlzLnNldEhleChlKTpjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yICIrdCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnIsdGhpcy5nLHRoaXMuYil9Y29weSh0KXtyZXR1cm4gdGhpcy5yPXQucix0aGlzLmc9dC5nLHRoaXMuYj10LmIsdGhpc31jb3B5R2FtbWFUb0xpbmVhcih0LGU9Mil7cmV0dXJuIHRoaXMucj1NYXRoLnBvdyh0LnIsZSksdGhpcy5nPU1hdGgucG93KHQuZyxlKSx0aGlzLmI9TWF0aC5wb3codC5iLGUpLHRoaXN9Y29weUxpbmVhclRvR2FtbWEodCxlPTIpe2NvbnN0IG49ZT4wPzEvZToxO3JldHVybiB0aGlzLnI9TWF0aC5wb3codC5yLG4pLHRoaXMuZz1NYXRoLnBvdyh0LmcsbiksdGhpcy5iPU1hdGgucG93KHQuYixuKSx0aGlzfWNvbnZlcnRHYW1tYVRvTGluZWFyKHQpe3JldHVybiB0aGlzLmNvcHlHYW1tYVRvTGluZWFyKHRoaXMsdCksdGhpc31jb252ZXJ0TGluZWFyVG9HYW1tYSh0KXtyZXR1cm4gdGhpcy5jb3B5TGluZWFyVG9HYW1tYSh0aGlzLHQpLHRoaXN9Y29weVNSR0JUb0xpbmVhcih0KXtyZXR1cm4gdGhpcy5yPURydCh0LnIpLHRoaXMuZz1EcnQodC5nKSx0aGlzLmI9RHJ0KHQuYiksdGhpc31jb3B5TGluZWFyVG9TUkdCKHQpe3JldHVybiB0aGlzLnI9RXJ0KHQuciksdGhpcy5nPUVydCh0LmcpLHRoaXMuYj1FcnQodC5iKSx0aGlzfWNvbnZlcnRTUkdCVG9MaW5lYXIoKXtyZXR1cm4gdGhpcy5jb3B5U1JHQlRvTGluZWFyKHRoaXMpLHRoaXN9Y29udmVydExpbmVhclRvU1JHQigpe3JldHVybiB0aGlzLmNvcHlMaW5lYXJUb1NSR0IodGhpcyksdGhpc31nZXRIZXgoKXtyZXR1cm4gMjU1KnRoaXMucjw8MTZeMjU1KnRoaXMuZzw8OF4yNTUqdGhpcy5iPDwwfWdldEhleFN0cmluZygpe3JldHVybigiMDAwMDAwIit0aGlzLmdldEhleCgpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTYpfWdldEhTTCh0KXtjb25zdCBlPXRoaXMucixuPXRoaXMuZyxvPXRoaXMuYixpPU1hdGgubWF4KGUsbixvKSxhPU1hdGgubWluKGUsbixvKTtsZXQgcixzO2NvbnN0IGw9KGEraSkvMjtpZihhPT09aSlyPTAscz0wO2Vsc2V7Y29uc3QgdD1pLWE7c3dpdGNoKHM9bDw9LjU/dC8oaSthKTp0LygyLWktYSksaSl7Y2FzZSBlOnI9KG4tbykvdCsobjxvPzY6MCk7YnJlYWs7Y2FzZSBuOnI9KG8tZSkvdCsyO2JyZWFrO2Nhc2UgbzpyPShlLW4pL3QrNH1yLz02fXJldHVybiB0Lmg9cix0LnM9cyx0Lmw9bCx0fWdldFN0eWxlKCl7cmV0dXJuInJnYigiKygyNTUqdGhpcy5yfDApKyIsIisoMjU1KnRoaXMuZ3wwKSsiLCIrKDI1NSp0aGlzLmJ8MCkrIikifW9mZnNldEhTTCh0LGUsbil7cmV0dXJuIHRoaXMuZ2V0SFNMKHdydCksd3J0LmgrPXQsd3J0LnMrPWUsd3J0LmwrPW4sdGhpcy5zZXRIU0wod3J0Lmgsd3J0LnMsd3J0LmwpLHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLnIrPXQucix0aGlzLmcrPXQuZyx0aGlzLmIrPXQuYix0aGlzfWFkZENvbG9ycyh0LGUpe3JldHVybiB0aGlzLnI9dC5yK2Uucix0aGlzLmc9dC5nK2UuZyx0aGlzLmI9dC5iK2UuYix0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy5yKz10LHRoaXMuZys9dCx0aGlzLmIrPXQsdGhpc31zdWIodCl7cmV0dXJuIHRoaXMucj1NYXRoLm1heCgwLHRoaXMuci10LnIpLHRoaXMuZz1NYXRoLm1heCgwLHRoaXMuZy10LmcpLHRoaXMuYj1NYXRoLm1heCgwLHRoaXMuYi10LmIpLHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMucio9dC5yLHRoaXMuZyo9dC5nLHRoaXMuYio9dC5iLHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMucio9dCx0aGlzLmcqPXQsdGhpcy5iKj10LHRoaXN9bGVycCh0LGUpe3JldHVybiB0aGlzLnIrPSh0LnItdGhpcy5yKSplLHRoaXMuZys9KHQuZy10aGlzLmcpKmUsdGhpcy5iKz0odC5iLXRoaXMuYikqZSx0aGlzfWxlcnBDb2xvcnModCxlLG4pe3JldHVybiB0aGlzLnI9dC5yKyhlLnItdC5yKSpuLHRoaXMuZz10LmcrKGUuZy10LmcpKm4sdGhpcy5iPXQuYisoZS5iLXQuYikqbix0aGlzfWxlcnBIU0wodCxlKXt0aGlzLmdldEhTTCh3cnQpLHQuZ2V0SFNMKGtydCk7Y29uc3Qgbj1YaXQod3J0Lmgsa3J0LmgsZSksbz1YaXQod3J0LnMsa3J0LnMsZSksaT1YaXQod3J0Lmwsa3J0LmwsZSk7cmV0dXJuIHRoaXMuc2V0SFNMKG4sbyxpKSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5yPT09dGhpcy5yJiZ0Lmc9PT10aGlzLmcmJnQuYj09PXRoaXMuYn1mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLnI9dFtlXSx0aGlzLmc9dFtlKzFdLHRoaXMuYj10W2UrMl0sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLnIsdFtlKzFdPXRoaXMuZyx0W2UrMl09dGhpcy5iLHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLnI9dC5nZXRYKGUpLHRoaXMuZz10LmdldFkoZSksdGhpcy5iPXQuZ2V0WihlKSwhMD09PXQubm9ybWFsaXplZCYmKHRoaXMuci89MjU1LHRoaXMuZy89MjU1LHRoaXMuYi89MjU1KSx0aGlzfXRvSlNPTigpe3JldHVybiB0aGlzLmdldEhleCgpfX1ScnQuTkFNRVM9UHJ0LFJydC5wcm90b3R5cGUuaXNDb2xvcj0hMCxScnQucHJvdG90eXBlLnI9MSxScnQucHJvdG90eXBlLmc9MSxScnQucHJvdG90eXBlLmI9MTtjbGFzcyBBcnQgZXh0ZW5kcyBPcnR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9Ik1lc2hCYXNpY01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyBScnQoMTY3NzcyMTUpLHRoaXMubWFwPW51bGwsdGhpcy5saWdodE1hcD1udWxsLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9MSx0aGlzLmFvTWFwPW51bGwsdGhpcy5hb01hcEludGVuc2l0eT0xLHRoaXMuc3BlY3VsYXJNYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5lbnZNYXA9bnVsbCx0aGlzLmNvbWJpbmU9MCx0aGlzLnJlZmxlY3Rpdml0eT0xLHRoaXMucmVmcmFjdGlvblJhdGlvPS45OCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiLHRoaXMud2lyZWZyYW1lTGluZWpvaW49InJvdW5kIix0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSx0aGlzLm1hcD10Lm1hcCx0aGlzLmxpZ2h0TWFwPXQubGlnaHRNYXAsdGhpcy5saWdodE1hcEludGVuc2l0eT10LmxpZ2h0TWFwSW50ZW5zaXR5LHRoaXMuYW9NYXA9dC5hb01hcCx0aGlzLmFvTWFwSW50ZW5zaXR5PXQuYW9NYXBJbnRlbnNpdHksdGhpcy5zcGVjdWxhck1hcD10LnNwZWN1bGFyTWFwLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLmVudk1hcD10LmVudk1hcCx0aGlzLmNvbWJpbmU9dC5jb21iaW5lLHRoaXMucmVmbGVjdGl2aXR5PXQucmVmbGVjdGl2aXR5LHRoaXMucmVmcmFjdGlvblJhdGlvPXQucmVmcmFjdGlvblJhdGlvLHRoaXMud2lyZWZyYW1lPXQud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoLHRoaXMud2lyZWZyYW1lTGluZWNhcD10LndpcmVmcmFtZUxpbmVjYXAsdGhpcy53aXJlZnJhbWVMaW5lam9pbj10LndpcmVmcmFtZUxpbmVqb2luLHRoaXN9fUFydC5wcm90b3R5cGUuaXNNZXNoQmFzaWNNYXRlcmlhbD0hMDtjb25zdCBUcnQ9bmV3IGNhdCxOcnQ9bmV3IFFpdDtjbGFzcyB6cnR7Y29uc3RydWN0b3IodCxlLG4pe2lmKEFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTt0aGlzLm5hbWU9IiIsdGhpcy5hcnJheT10LHRoaXMuaXRlbVNpemU9ZSx0aGlzLmNvdW50PXZvaWQgMCE9PXQ/dC5sZW5ndGgvZTowLHRoaXMubm9ybWFsaXplZD0hMD09PW4sdGhpcy51c2FnZT1CaXQsdGhpcy51cGRhdGVSYW5nZT17b2Zmc2V0OjAsY291bnQ6LTF9LHRoaXMudmVyc2lvbj0wfW9uVXBsb2FkQ2FsbGJhY2soKXt9c2V0IG5lZWRzVXBkYXRlKHQpeyEwPT09dCYmdGhpcy52ZXJzaW9uKyt9c2V0VXNhZ2UodCl7cmV0dXJuIHRoaXMudXNhZ2U9dCx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMubmFtZT10Lm5hbWUsdGhpcy5hcnJheT1uZXcgdC5hcnJheS5jb25zdHJ1Y3Rvcih0LmFycmF5KSx0aGlzLml0ZW1TaXplPXQuaXRlbVNpemUsdGhpcy5jb3VudD10LmNvdW50LHRoaXMubm9ybWFsaXplZD10Lm5vcm1hbGl6ZWQsdGhpcy51c2FnZT10LnVzYWdlLHRoaXN9Y29weUF0KHQsZSxuKXt0Kj10aGlzLml0ZW1TaXplLG4qPWUuaXRlbVNpemU7Zm9yKGxldCBvPTAsaT10aGlzLml0ZW1TaXplO288aTtvKyspdGhpcy5hcnJheVt0K29dPWUuYXJyYXlbbitvXTtyZXR1cm4gdGhpc31jb3B5QXJyYXkodCl7cmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQpLHRoaXN9Y29weUNvbG9yc0FycmF5KHQpe2NvbnN0IGU9dGhpcy5hcnJheTtsZXQgbj0wO2ZvcihsZXQgbz0wLGk9dC5sZW5ndGg7bzxpO28rKyl7bGV0IGk9dFtvXTt2b2lkIDA9PT1pJiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weUNvbG9yc0FycmF5KCk6IGNvbG9yIGlzIHVuZGVmaW5lZCIsbyksaT1uZXcgUnJ0KSxlW24rK109aS5yLGVbbisrXT1pLmcsZVtuKytdPWkuYn1yZXR1cm4gdGhpc31jb3B5VmVjdG9yMnNBcnJheSh0KXtjb25zdCBlPXRoaXMuYXJyYXk7bGV0IG49MDtmb3IobGV0IG89MCxpPXQubGVuZ3RoO288aTtvKyspe2xldCBpPXRbb107dm9pZCAwPT09aSYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3Iyc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQiLG8pLGk9bmV3IFFpdCksZVtuKytdPWkueCxlW24rK109aS55fXJldHVybiB0aGlzfWNvcHlWZWN0b3Izc0FycmF5KHQpe2NvbnN0IGU9dGhpcy5hcnJheTtsZXQgbj0wO2ZvcihsZXQgbz0wLGk9dC5sZW5ndGg7bzxpO28rKyl7bGV0IGk9dFtvXTt2b2lkIDA9PT1pJiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCIsbyksaT1uZXcgY2F0KSxlW24rK109aS54LGVbbisrXT1pLnksZVtuKytdPWkuen1yZXR1cm4gdGhpc31jb3B5VmVjdG9yNHNBcnJheSh0KXtjb25zdCBlPXRoaXMuYXJyYXk7bGV0IG49MDtmb3IobGV0IG89MCxpPXQubGVuZ3RoO288aTtvKyspe2xldCBpPXRbb107dm9pZCAwPT09aSYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3I0c0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQiLG8pLGk9bmV3IGFhdCksZVtuKytdPWkueCxlW24rK109aS55LGVbbisrXT1pLnosZVtuKytdPWkud31yZXR1cm4gdGhpc31hcHBseU1hdHJpeDModCl7aWYoMj09PXRoaXMuaXRlbVNpemUpZm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspTnJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxOcnQuYXBwbHlNYXRyaXgzKHQpLHRoaXMuc2V0WFkoZSxOcnQueCxOcnQueSk7ZWxzZSBpZigzPT09dGhpcy5pdGVtU2l6ZSlmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylUcnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLFRydC5hcHBseU1hdHJpeDModCksdGhpcy5zZXRYWVooZSxUcnQueCxUcnQueSxUcnQueik7cmV0dXJuIHRoaXN9YXBwbHlNYXRyaXg0KHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKVRydC54PXRoaXMuZ2V0WChlKSxUcnQueT10aGlzLmdldFkoZSksVHJ0Lno9dGhpcy5nZXRaKGUpLFRydC5hcHBseU1hdHJpeDQodCksdGhpcy5zZXRYWVooZSxUcnQueCxUcnQueSxUcnQueik7cmV0dXJuIHRoaXN9YXBwbHlOb3JtYWxNYXRyaXgodCl7Zm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspVHJ0Lng9dGhpcy5nZXRYKGUpLFRydC55PXRoaXMuZ2V0WShlKSxUcnQuej10aGlzLmdldFooZSksVHJ0LmFwcGx5Tm9ybWFsTWF0cml4KHQpLHRoaXMuc2V0WFlaKGUsVHJ0LngsVHJ0LnksVHJ0LnopO3JldHVybiB0aGlzfXRyYW5zZm9ybURpcmVjdGlvbih0KXtmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKylUcnQueD10aGlzLmdldFgoZSksVHJ0Lnk9dGhpcy5nZXRZKGUpLFRydC56PXRoaXMuZ2V0WihlKSxUcnQudHJhbnNmb3JtRGlyZWN0aW9uKHQpLHRoaXMuc2V0WFlaKGUsVHJ0LngsVHJ0LnksVHJ0LnopO3JldHVybiB0aGlzfXNldCh0LGU9MCl7cmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQsZSksdGhpc31nZXRYKHQpe3JldHVybiB0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZV19c2V0WCh0LGUpe3JldHVybiB0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZV09ZSx0aGlzfWdldFkodCl7cmV0dXJuIHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzFdfXNldFkodCxlKXtyZXR1cm4gdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMV09ZSx0aGlzfWdldFoodCl7cmV0dXJuIHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzJdfXNldFoodCxlKXtyZXR1cm4gdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl09ZSx0aGlzfWdldFcodCl7cmV0dXJuIHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzNdfXNldFcodCxlKXtyZXR1cm4gdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrM109ZSx0aGlzfXNldFhZKHQsZSxuKXtyZXR1cm4gdGhpcy5hcnJheVswKyh0Kj10aGlzLml0ZW1TaXplKV09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzfXNldFhZWih0LGUsbixvKXtyZXR1cm4gdGhpcy5hcnJheVswKyh0Kj10aGlzLml0ZW1TaXplKV09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzLmFycmF5W3QrMl09byx0aGlzfXNldFhZWlcodCxlLG4sbyxpKXtyZXR1cm4gdGhpcy5hcnJheVswKyh0Kj10aGlzLml0ZW1TaXplKV09ZSx0aGlzLmFycmF5W3QrMV09bix0aGlzLmFycmF5W3QrMl09byx0aGlzLmFycmF5W3QrM109aSx0aGlzfW9uVXBsb2FkKHQpe3JldHVybiB0aGlzLm9uVXBsb2FkQ2FsbGJhY2s9dCx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuYXJyYXksdGhpcy5pdGVtU2l6ZSkuY29weSh0aGlzKX10b0pTT04oKXtjb25zdCB0PXtpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuYXJyYXkpLG5vcm1hbGl6ZWQ6dGhpcy5ub3JtYWxpemVkfTtyZXR1cm4iIiE9PXRoaXMubmFtZSYmKHQubmFtZT10aGlzLm5hbWUpLHRoaXMudXNhZ2UhPT1CaXQmJih0LnVzYWdlPXRoaXMudXNhZ2UpLDA9PT10aGlzLnVwZGF0ZVJhbmdlLm9mZnNldCYmLTE9PT10aGlzLnVwZGF0ZVJhbmdlLmNvdW50fHwodC51cGRhdGVSYW5nZT10aGlzLnVwZGF0ZVJhbmdlKSx0fX16cnQucHJvdG90eXBlLmlzQnVmZmVyQXR0cmlidXRlPSEwO2NsYXNzIElydCBleHRlbmRzIHpydHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQxNkFycmF5KHQpLGUsbil9fWNsYXNzIEhydCBleHRlbmRzIHpydHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQzMkFycmF5KHQpLGUsbil9fShjbGFzcyBleHRlbmRzIHpydHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQxNkFycmF5KHQpLGUsbil9fSkucHJvdG90eXBlLmlzRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZT0hMDtjbGFzcyBGcnQgZXh0ZW5kcyB6cnR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBGbG9hdDMyQXJyYXkodCksZSxuKX19ZnVuY3Rpb24gTHJ0KHQpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4tMS8wO2xldCBlPXRbMF07Zm9yKGxldCBuPTEsbz10Lmxlbmd0aDtuPG87KytuKXRbbl0+ZSYmKGU9dFtuXSk7cmV0dXJuIGV9bGV0IEJydD0wO2NvbnN0IFZydD1uZXcgQmF0LGpydD1uZXcgcHJ0LFVydD1uZXcgY2F0LEdydD1uZXcgbWF0LFdydD1uZXcgbWF0LFlydD1uZXcgY2F0O2NsYXNzIHFydCBleHRlbmRzIFVpdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6QnJ0Kyt9KSx0aGlzLnV1aWQ9cWl0KCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iQnVmZmVyR2VvbWV0cnkiLHRoaXMuaW5kZXg9bnVsbCx0aGlzLmF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaEF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT0hMSx0aGlzLmdyb3Vwcz1bXSx0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsLHRoaXMuZHJhd1JhbmdlPXtzdGFydDowLGNvdW50OjEvMH0sdGhpcy51c2VyRGF0YT17fX1nZXRJbmRleCgpe3JldHVybiB0aGlzLmluZGV4fXNldEluZGV4KHQpe3JldHVybiB0aGlzLmluZGV4PUFycmF5LmlzQXJyYXkodCk/bmV3KExydCh0KT42NTUzNT9IcnQ6SXJ0KSh0LDEpOnQsdGhpc31nZXRBdHRyaWJ1dGUodCl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XX1zZXRBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW3RdPWUsdGhpc31kZWxldGVBdHRyaWJ1dGUodCl7cmV0dXJuIGRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXNbdF0sdGhpc31oYXNBdHRyaWJ1dGUodCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuYXR0cmlidXRlc1t0XX1hZGRHcm91cCh0LGUsbj0wKXt0aGlzLmdyb3Vwcy5wdXNoKHtzdGFydDp0LGNvdW50OmUsbWF0ZXJpYWxJbmRleDpufSl9Y2xlYXJHcm91cHMoKXt0aGlzLmdyb3Vwcz1bXX1zZXREcmF3UmFuZ2UodCxlKXt0aGlzLmRyYXdSYW5nZS5zdGFydD10LHRoaXMuZHJhd1JhbmdlLmNvdW50PWV9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO3ZvaWQgMCE9PWUmJihlLmFwcGx5TWF0cml4NCh0KSxlLm5lZWRzVXBkYXRlPSEwKTtjb25zdCBuPXRoaXMuYXR0cmlidXRlcy5ub3JtYWw7aWYodm9pZCAwIT09bil7Y29uc3QgZT0obmV3ICRpdCkuZ2V0Tm9ybWFsTWF0cml4KHQpO24uYXBwbHlOb3JtYWxNYXRyaXgoZSksbi5uZWVkc1VwZGF0ZT0hMH1jb25zdCBvPXRoaXMuYXR0cmlidXRlcy50YW5nZW50O3JldHVybiB2b2lkIDAhPT1vJiYoby50cmFuc2Zvcm1EaXJlY3Rpb24odCksby5uZWVkc1VwZGF0ZT0hMCksbnVsbCE9PXRoaXMuYm91bmRpbmdCb3gmJnRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCksbnVsbCE9PXRoaXMuYm91bmRpbmdTcGhlcmUmJnRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksdGhpc31hcHBseVF1YXRlcm5pb24odCl7cmV0dXJuIFZydC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KSx0aGlzLmFwcGx5TWF0cml4NChWcnQpLHRoaXN9cm90YXRlWCh0KXtyZXR1cm4gVnJ0Lm1ha2VSb3RhdGlvblgodCksdGhpcy5hcHBseU1hdHJpeDQoVnJ0KSx0aGlzfXJvdGF0ZVkodCl7cmV0dXJuIFZydC5tYWtlUm90YXRpb25ZKHQpLHRoaXMuYXBwbHlNYXRyaXg0KFZydCksdGhpc31yb3RhdGVaKHQpe3JldHVybiBWcnQubWFrZVJvdGF0aW9uWih0KSx0aGlzLmFwcGx5TWF0cml4NChWcnQpLHRoaXN9dHJhbnNsYXRlKHQsZSxuKXtyZXR1cm4gVnJ0Lm1ha2VUcmFuc2xhdGlvbih0LGUsbiksdGhpcy5hcHBseU1hdHJpeDQoVnJ0KSx0aGlzfXNjYWxlKHQsZSxuKXtyZXR1cm4gVnJ0Lm1ha2VTY2FsZSh0LGUsbiksdGhpcy5hcHBseU1hdHJpeDQoVnJ0KSx0aGlzfWxvb2tBdCh0KXtyZXR1cm4ganJ0Lmxvb2tBdCh0KSxqcnQudXBkYXRlTWF0cml4KCksdGhpcy5hcHBseU1hdHJpeDQoanJ0Lm1hdHJpeCksdGhpc31jZW50ZXIoKXtyZXR1cm4gdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKSx0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlcihVcnQpLm5lZ2F0ZSgpLHRoaXMudHJhbnNsYXRlKFVydC54LFVydC55LFVydC56KSx0aGlzfXNldEZyb21Qb2ludHModCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MCxvPXQubGVuZ3RoO248bztuKyspe2NvbnN0IG89dFtuXTtlLnB1c2goby54LG8ueSxvLnp8fDApfXJldHVybiB0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBGcnQoZSwzKSksdGhpc31jb21wdXRlQm91bmRpbmdCb3goKXtudWxsPT09dGhpcy5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IG1hdCk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBib3guIEFsdGVybmF0aXZlbHkgc2V0ICJtZXNoLmZydXN0dW1DdWxsZWQiIHRvICJmYWxzZSIuJyx0aGlzKSx2b2lkIHRoaXMuYm91bmRpbmdCb3guc2V0KG5ldyBjYXQoLTEvMCwtMS8wLC0xLzApLG5ldyBjYXQoMS8wLDEvMCwxLzApKTtpZih2b2lkIDAhPT10KXtpZih0aGlzLmJvdW5kaW5nQm94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCksZSlmb3IobGV0IHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspR3J0LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUoZVt0XSksdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT8oWXJ0LmFkZFZlY3RvcnModGhpcy5ib3VuZGluZ0JveC5taW4sR3J0Lm1pbiksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KFlydCksWXJ0LmFkZFZlY3RvcnModGhpcy5ib3VuZGluZ0JveC5tYXgsR3J0Lm1heCksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KFlydCkpOih0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoR3J0Lm1pbiksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KEdydC5tYXgpKX1lbHNlIHRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7KGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLngpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi55KXx8aXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueikpJiZjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTogQ29tcHV0ZWQgbWluL21heCBoYXZlIE5hTiB2YWx1ZXMuIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsdGhpcyl9Y29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl7bnVsbD09PXRoaXMuYm91bmRpbmdTcGhlcmUmJih0aGlzLmJvdW5kaW5nU3BoZXJlPW5ldyBSYXQpO2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYodCYmdC5pc0dMQnVmZmVyQXR0cmlidXRlKXJldHVybiBjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogR0xCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgYSBtYW51YWwgYm91bmRpbmcgc3BoZXJlLiBBbHRlcm5hdGl2ZWx5IHNldCAibWVzaC5mcnVzdHVtQ3VsbGVkIiB0byAiZmFsc2UiLicsdGhpcyksdm9pZCB0aGlzLmJvdW5kaW5nU3BoZXJlLnNldChuZXcgY2F0LDEvMCk7aWYodCl7Y29uc3Qgbj10aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlcjtpZihHcnQuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh0KSxlKWZvcihsZXQgdD0wLG49ZS5sZW5ndGg7dDxuO3QrKylXcnQuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShlW3RdKSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPyhZcnQuYWRkVmVjdG9ycyhHcnQubWluLFdydC5taW4pLEdydC5leHBhbmRCeVBvaW50KFlydCksWXJ0LmFkZFZlY3RvcnMoR3J0Lm1heCxXcnQubWF4KSxHcnQuZXhwYW5kQnlQb2ludChZcnQpKTooR3J0LmV4cGFuZEJ5UG9pbnQoV3J0Lm1pbiksR3J0LmV4cGFuZEJ5UG9pbnQoV3J0Lm1heCkpO0dydC5nZXRDZW50ZXIobik7bGV0IG89MDtmb3IobGV0IGU9MCxpPXQuY291bnQ7ZTxpO2UrKylZcnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpLG89TWF0aC5tYXgobyxuLmRpc3RhbmNlVG9TcXVhcmVkKFlydCkpO2lmKGUpZm9yKGxldCBpPTAsYT1lLmxlbmd0aDtpPGE7aSsrKXtjb25zdCBhPWVbaV0scj10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2ZvcihsZXQgZT0wLGk9YS5jb3VudDtlPGk7ZSsrKVlydC5mcm9tQnVmZmVyQXR0cmlidXRlKGEsZSksciYmKFVydC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksWXJ0LmFkZChVcnQpKSxvPU1hdGgubWF4KG8sbi5kaXN0YW5jZVRvU3F1YXJlZChZcnQpKX10aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cz1NYXRoLnNxcnQobyksaXNOYU4odGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMpJiZjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogQ29tcHV0ZWQgcmFkaXVzIGlzIE5hTi4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX19Y29tcHV0ZUZhY2VOb3JtYWxzKCl7fWNvbXB1dGVUYW5nZW50cygpe2NvbnN0IHQ9dGhpcy5pbmRleCxlPXRoaXMuYXR0cmlidXRlcztpZihudWxsPT09dHx8dm9pZCAwPT09ZS5wb3NpdGlvbnx8dm9pZCAwPT09ZS5ub3JtYWx8fHZvaWQgMD09PWUudXYpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBmYWlsZWQuIE1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlcyAoaW5kZXgsIHBvc2l0aW9uLCBub3JtYWwgb3IgdXYpIik7Y29uc3Qgbj10LmFycmF5LG89ZS5wb3NpdGlvbi5hcnJheSxpPWUubm9ybWFsLmFycmF5LGE9ZS51di5hcnJheSxyPW8ubGVuZ3RoLzM7dm9pZCAwPT09ZS50YW5nZW50JiZ0aGlzLnNldEF0dHJpYnV0ZSgidGFuZ2VudCIsbmV3IHpydChuZXcgRmxvYXQzMkFycmF5KDQqciksNCkpO2NvbnN0IHM9ZS50YW5nZW50LmFycmF5LGw9W10sYz1bXTtmb3IobGV0IHQ9MDt0PHI7dCsrKWxbdF09bmV3IGNhdCxjW3RdPW5ldyBjYXQ7Y29uc3QgZD1uZXcgY2F0LHA9bmV3IGNhdCxtPW5ldyBjYXQsdT1uZXcgUWl0LGY9bmV3IFFpdCxnPW5ldyBRaXQsaD1uZXcgY2F0LGI9bmV3IGNhdDtmdW5jdGlvbiB5KHQsZSxuKXtkLmZyb21BcnJheShvLDMqdCkscC5mcm9tQXJyYXkobywzKmUpLG0uZnJvbUFycmF5KG8sMypuKSx1LmZyb21BcnJheShhLDIqdCksZi5mcm9tQXJyYXkoYSwyKmUpLGcuZnJvbUFycmF5KGEsMipuKSxwLnN1YihkKSxtLnN1YihkKSxmLnN1Yih1KSxnLnN1Yih1KTtjb25zdCBpPTEvKGYueCpnLnktZy54KmYueSk7aXNGaW5pdGUoaSkmJihoLmNvcHkocCkubXVsdGlwbHlTY2FsYXIoZy55KS5hZGRTY2FsZWRWZWN0b3IobSwtZi55KS5tdWx0aXBseVNjYWxhcihpKSxiLmNvcHkobSkubXVsdGlwbHlTY2FsYXIoZi54KS5hZGRTY2FsZWRWZWN0b3IocCwtZy54KS5tdWx0aXBseVNjYWxhcihpKSxsW3RdLmFkZChoKSxsW2VdLmFkZChoKSxsW25dLmFkZChoKSxjW3RdLmFkZChiKSxjW2VdLmFkZChiKSxjW25dLmFkZChiKSl9bGV0IF89dGhpcy5ncm91cHM7MD09PV8ubGVuZ3RoJiYoXz1be3N0YXJ0OjAsY291bnQ6bi5sZW5ndGh9XSk7Zm9yKGxldCB0PTAsZT1fLmxlbmd0aDt0PGU7Kyt0KXtjb25zdCBlPV9bdF0sbz1lLnN0YXJ0O2ZvcihsZXQgdD1vLGk9bytlLmNvdW50O3Q8aTt0Kz0zKXkoblt0KzBdLG5bdCsxXSxuW3QrMl0pfWNvbnN0IEM9bmV3IGNhdCxNPW5ldyBjYXQsdj1uZXcgY2F0LHg9bmV3IGNhdDtmdW5jdGlvbiBPKHQpe3YuZnJvbUFycmF5KGksMyp0KSx4LmNvcHkodik7Y29uc3QgZT1sW3RdO0MuY29weShlKSxDLnN1Yih2Lm11bHRpcGx5U2NhbGFyKHYuZG90KGUpKSkubm9ybWFsaXplKCksTS5jcm9zc1ZlY3RvcnMoeCxlKTtjb25zdCBuPU0uZG90KGNbdF0pPDA/LTE6MTtzWzQqdF09Qy54LHNbNCp0KzFdPUMueSxzWzQqdCsyXT1DLnosc1s0KnQrM109bn1mb3IobGV0IHQ9MCxlPV8ubGVuZ3RoO3Q8ZTsrK3Qpe2NvbnN0IGU9X1t0XSxvPWUuc3RhcnQ7Zm9yKGxldCB0PW8saT1vK2UuY291bnQ7dDxpO3QrPTMpTyhuW3QrMF0pLE8oblt0KzFdKSxPKG5bdCsyXSl9fWNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCl7Y29uc3QgdD10aGlzLmluZGV4LGU9dGhpcy5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7aWYodm9pZCAwIT09ZSl7bGV0IG49dGhpcy5nZXRBdHRyaWJ1dGUoIm5vcm1hbCIpO2lmKHZvaWQgMD09PW4pbj1uZXcgenJ0KG5ldyBGbG9hdDMyQXJyYXkoMyplLmNvdW50KSwzKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuKTtlbHNlIGZvcihsZXQgdD0wLGU9bi5jb3VudDt0PGU7dCsrKW4uc2V0WFlaKHQsMCwwLDApO2NvbnN0IG89bmV3IGNhdCxpPW5ldyBjYXQsYT1uZXcgY2F0LHI9bmV3IGNhdCxzPW5ldyBjYXQsbD1uZXcgY2F0LGM9bmV3IGNhdCxkPW5ldyBjYXQ7aWYodClmb3IobGV0IHA9MCxtPXQuY291bnQ7cDxtO3ArPTMpe2NvbnN0IG09dC5nZXRYKHArMCksdT10LmdldFgocCsxKSxmPXQuZ2V0WChwKzIpO28uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLG0pLGkuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHUpLGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGYpLGMuc3ViVmVjdG9ycyhhLGkpLGQuc3ViVmVjdG9ycyhvLGkpLGMuY3Jvc3MoZCksci5mcm9tQnVmZmVyQXR0cmlidXRlKG4sbSkscy5mcm9tQnVmZmVyQXR0cmlidXRlKG4sdSksbC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sZiksci5hZGQoYykscy5hZGQoYyksbC5hZGQoYyksbi5zZXRYWVoobSxyLngsci55LHIueiksbi5zZXRYWVoodSxzLngscy55LHMueiksbi5zZXRYWVooZixsLngsbC55LGwueil9ZWxzZSBmb3IobGV0IHQ9MCxyPWUuY291bnQ7dDxyO3QrPTMpby5mcm9tQnVmZmVyQXR0cmlidXRlKGUsdCswKSxpLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSx0KzEpLGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHQrMiksYy5zdWJWZWN0b3JzKGEsaSksZC5zdWJWZWN0b3JzKG8saSksYy5jcm9zcyhkKSxuLnNldFhZWih0KzAsYy54LGMueSxjLnopLG4uc2V0WFlaKHQrMSxjLngsYy55LGMueiksbi5zZXRYWVoodCsyLGMueCxjLnksYy56KTt0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKSxuLm5lZWRzVXBkYXRlPSEwfX1tZXJnZSh0LGUpe2lmKCF0fHwhdC5pc0J1ZmZlckdlb21ldHJ5KXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IGdlb21ldHJ5IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5CdWZmZXJHZW9tZXRyeS4iLHQpO3ZvaWQgMD09PWUmJihlPTAsY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS5tZXJnZSgpOiBPdmVyd3JpdGluZyBvcmlnaW5hbCBnZW9tZXRyeSwgc3RhcnRpbmcgYXQgb2Zmc2V0PTAuIFVzZSBCdWZmZXJHZW9tZXRyeVV0aWxzLm1lcmdlQnVmZmVyR2VvbWV0cmllcygpIGZvciBsb3NzbGVzcyBtZXJnZS4iKSk7Y29uc3Qgbj10aGlzLmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IG8gaW4gbil7aWYodm9pZCAwPT09dC5hdHRyaWJ1dGVzW29dKWNvbnRpbnVlO2NvbnN0IGk9bltvXS5hcnJheSxhPXQuYXR0cmlidXRlc1tvXSxyPWEuYXJyYXkscz1hLml0ZW1TaXplKmUsbD1NYXRoLm1pbihyLmxlbmd0aCxpLmxlbmd0aC1zKTtmb3IobGV0IHQ9MCxlPXM7dDxsO3QrKyxlKyspaVtlXT1yW3RdfXJldHVybiB0aGlzfW5vcm1hbGl6ZU5vcm1hbHMoKXtjb25zdCB0PXRoaXMuYXR0cmlidXRlcy5ub3JtYWw7Zm9yKGxldCBlPTAsbj10LmNvdW50O2U8bjtlKyspWXJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSxZcnQubm9ybWFsaXplKCksdC5zZXRYWVooZSxZcnQueCxZcnQueSxZcnQueil9dG9Ob25JbmRleGVkKCl7ZnVuY3Rpb24gdCh0LGUpe2NvbnN0IG49dC5hcnJheSxvPXQuaXRlbVNpemUsaT10Lm5vcm1hbGl6ZWQsYT1uZXcgbi5jb25zdHJ1Y3RvcihlLmxlbmd0aCpvKTtsZXQgcj0wLHM9MDtmb3IobGV0IGk9MCxsPWUubGVuZ3RoO2k8bDtpKyspe3I9dC5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlP2VbaV0qdC5kYXRhLnN0cmlkZSt0Lm9mZnNldDplW2ldKm87Zm9yKGxldCB0PTA7dDxvO3QrKylhW3MrK109bltyKytdfXJldHVybiBuZXcgenJ0KGEsbyxpKX1pZihudWxsPT09dGhpcy5pbmRleClyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTogQnVmZmVyR2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4iKSx0aGlzO2NvbnN0IGU9bmV3IHFydCxuPXRoaXMuaW5kZXguYXJyYXksbz10aGlzLmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGkgaW4gbyl7Y29uc3QgYT10KG9baV0sbik7ZS5zZXRBdHRyaWJ1dGUoaSxhKX1jb25zdCBpPXRoaXMubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCBvIGluIGkpe2NvbnN0IGE9W10scj1pW29dO2ZvcihsZXQgZT0wLG89ci5sZW5ndGg7ZTxvO2UrKyl7Y29uc3Qgbz10KHJbZV0sbik7YS5wdXNoKG8pfWUubW9ycGhBdHRyaWJ1dGVzW29dPWF9ZS5tb3JwaFRhcmdldHNSZWxhdGl2ZT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2NvbnN0IGE9dGhpcy5ncm91cHM7Zm9yKGxldCB0PTAsbj1hLmxlbmd0aDt0PG47dCsrKXtjb25zdCBuPWFbdF07ZS5hZGRHcm91cChuLnN0YXJ0LG4uY291bnQsbi5tYXRlcmlhbEluZGV4KX1yZXR1cm4gZX10b0pTT04oKXtjb25zdCB0PXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiQnVmZmVyR2VvbWV0cnkiLGdlbmVyYXRvcjoiQnVmZmVyR2VvbWV0cnkudG9KU09OIn19O2lmKHQudXVpZD10aGlzLnV1aWQsdC50eXBlPXRoaXMudHlwZSwiIiE9PXRoaXMubmFtZSYmKHQubmFtZT10aGlzLm5hbWUpLE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYodC51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSx2b2lkIDAhPT10aGlzLnBhcmFtZXRlcnMpe2NvbnN0IGU9dGhpcy5wYXJhbWV0ZXJzO2Zvcihjb25zdCBuIGluIGUpdm9pZCAwIT09ZVtuXSYmKHRbbl09ZVtuXSk7cmV0dXJuIHR9dC5kYXRhPXthdHRyaWJ1dGVzOnt9fTtjb25zdCBlPXRoaXMuaW5kZXg7bnVsbCE9PWUmJih0LmRhdGEuaW5kZXg9e3R5cGU6ZS5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUuYXJyYXkpfSk7Y29uc3Qgbj10aGlzLmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGUgaW4gbil0LmRhdGEuYXR0cmlidXRlc1tlXT1uW2VdLnRvSlNPTih0LmRhdGEpO2NvbnN0IG89e307bGV0IGk9ITE7Zm9yKGNvbnN0IGUgaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMpe2NvbnN0IG49dGhpcy5tb3JwaEF0dHJpYnV0ZXNbZV0sYT1bXTtmb3IobGV0IGU9MCxvPW4ubGVuZ3RoO2U8bztlKyspYS5wdXNoKG5bZV0udG9KU09OKHQuZGF0YSkpO2EubGVuZ3RoPjAmJihvW2VdPWEsaT0hMCl9aSYmKHQuZGF0YS5tb3JwaEF0dHJpYnV0ZXM9byx0LmRhdGEubW9ycGhUYXJnZXRzUmVsYXRpdmU9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZSk7Y29uc3QgYT10aGlzLmdyb3VwczthLmxlbmd0aD4wJiYodC5kYXRhLmdyb3Vwcz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGEpKSk7Y29uc3Qgcj10aGlzLmJvdW5kaW5nU3BoZXJlO3JldHVybiBudWxsIT09ciYmKHQuZGF0YS5ib3VuZGluZ1NwaGVyZT17Y2VudGVyOnIuY2VudGVyLnRvQXJyYXkoKSxyYWRpdXM6ci5yYWRpdXN9KSx0fWNsb25lKCl7cmV0dXJuKG5ldyBxcnQpLmNvcHkodGhpcyl9Y29weSh0KXt0aGlzLmluZGV4PW51bGwsdGhpcy5hdHRyaWJ1dGVzPXt9LHRoaXMubW9ycGhBdHRyaWJ1dGVzPXt9LHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGw7Y29uc3QgZT17fTt0aGlzLm5hbWU9dC5uYW1lO2NvbnN0IG49dC5pbmRleDtudWxsIT09biYmdGhpcy5zZXRJbmRleChuLmNsb25lKGUpKTtjb25zdCBvPXQuYXR0cmlidXRlcztmb3IoY29uc3QgdCBpbiBvKXRoaXMuc2V0QXR0cmlidXRlKHQsb1t0XS5jbG9uZShlKSk7Y29uc3QgaT10Lm1vcnBoQXR0cmlidXRlcztmb3IoY29uc3QgdCBpbiBpKXtjb25zdCBuPVtdLG89aVt0XTtmb3IobGV0IHQ9MCxpPW8ubGVuZ3RoO3Q8aTt0Kyspbi5wdXNoKG9bdF0uY2xvbmUoZSkpO3RoaXMubW9ycGhBdHRyaWJ1dGVzW3RdPW59dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT10Lm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2NvbnN0IGE9dC5ncm91cHM7Zm9yKGxldCB0PTAsZT1hLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPWFbdF07dGhpcy5hZGRHcm91cChlLnN0YXJ0LGUuY291bnQsZS5tYXRlcmlhbEluZGV4KX1jb25zdCByPXQuYm91bmRpbmdCb3g7bnVsbCE9PXImJih0aGlzLmJvdW5kaW5nQm94PXIuY2xvbmUoKSk7Y29uc3Qgcz10LmJvdW5kaW5nU3BoZXJlO3JldHVybiBudWxsIT09cyYmKHRoaXMuYm91bmRpbmdTcGhlcmU9cy5jbG9uZSgpKSx0aGlzLmRyYXdSYW5nZS5zdGFydD10LmRyYXdSYW5nZS5zdGFydCx0aGlzLmRyYXdSYW5nZS5jb3VudD10LmRyYXdSYW5nZS5jb3VudCx0aGlzLnVzZXJEYXRhPXQudXNlckRhdGEsdGhpc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX1xcnQucHJvdG90eXBlLmlzQnVmZmVyR2VvbWV0cnk9ITA7Y29uc3QgWnJ0PW5ldyBCYXQsWHJ0PW5ldyBMYXQsS3J0PW5ldyBSYXQsSnJ0PW5ldyBjYXQsUXJ0PW5ldyBjYXQsJHJ0PW5ldyBjYXQsdHN0PW5ldyBjYXQsZXN0PW5ldyBjYXQsbnN0PW5ldyBjYXQsb3N0PW5ldyBjYXQsaXN0PW5ldyBjYXQsYXN0PW5ldyBjYXQscnN0PW5ldyBRaXQsc3N0PW5ldyBRaXQsbHN0PW5ldyBRaXQsY3N0PW5ldyBjYXQsZHN0PW5ldyBjYXQ7Y2xhc3MgcHN0IGV4dGVuZHMgcHJ0e2NvbnN0cnVjdG9yKHQ9bmV3IHFydCxlPW5ldyBBcnQpe3N1cGVyKCksdGhpcy50eXBlPSJNZXNoIix0aGlzLmdlb21ldHJ5PXQsdGhpcy5tYXRlcmlhbD1lLHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx2b2lkIDAhPT10Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyYmKHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPXQubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCkpLHZvaWQgMCE9PXQubW9ycGhUYXJnZXREaWN0aW9uYXJ5JiYodGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9T2JqZWN0LmFzc2lnbih7fSx0Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeSkpLHRoaXMubWF0ZXJpYWw9dC5tYXRlcmlhbCx0aGlzLmdlb21ldHJ5PXQuZ2VvbWV0cnksdGhpc311cGRhdGVNb3JwaFRhcmdldHMoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnk7aWYodC5pc0J1ZmZlckdlb21ldHJ5KXtjb25zdCBlPXQubW9ycGhBdHRyaWJ1dGVzLG49T2JqZWN0LmtleXMoZSk7aWYobi5sZW5ndGg+MCl7Y29uc3QgdD1lW25bMF1dO2lmKHZvaWQgMCE9PXQpe3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPVtdLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXt9O2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgbj10W2VdLm5hbWV8fFN0cmluZyhlKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W25dPWV9fX19ZWxzZXtjb25zdCBlPXQubW9ycGhUYXJnZXRzO3ZvaWQgMCE9PWUmJmUubGVuZ3RoPjAmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1lc2gudXBkYXRlTW9ycGhUYXJnZXRzKCkgbm8gbG9uZ2VyIHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKX19cmF5Y2FzdCh0LGUpe2NvbnN0IG49dGhpcy5nZW9tZXRyeSxvPXRoaXMubWF0ZXJpYWwsaT10aGlzLm1hdHJpeFdvcmxkO2lmKHZvaWQgMD09PW8pcmV0dXJuO2lmKG51bGw9PT1uLmJvdW5kaW5nU3BoZXJlJiZuLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLEtydC5jb3B5KG4uYm91bmRpbmdTcGhlcmUpLEtydC5hcHBseU1hdHJpeDQoaSksITE9PT10LnJheS5pbnRlcnNlY3RzU3BoZXJlKEtydCkpcmV0dXJuO2lmKFpydC5jb3B5KGkpLmludmVydCgpLFhydC5jb3B5KHQucmF5KS5hcHBseU1hdHJpeDQoWnJ0KSxudWxsIT09bi5ib3VuZGluZ0JveCYmITE9PT1YcnQuaW50ZXJzZWN0c0JveChuLmJvdW5kaW5nQm94KSlyZXR1cm47bGV0IGE7aWYobi5pc0J1ZmZlckdlb21ldHJ5KXtjb25zdCBpPW4uaW5kZXgscj1uLmF0dHJpYnV0ZXMucG9zaXRpb24scz1uLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixsPW4ubW9ycGhUYXJnZXRzUmVsYXRpdmUsYz1uLmF0dHJpYnV0ZXMudXYsZD1uLmF0dHJpYnV0ZXMudXYyLHA9bi5ncm91cHMsbT1uLmRyYXdSYW5nZTtpZihudWxsIT09aSlpZihBcnJheS5pc0FycmF5KG8pKWZvcihsZXQgbj0wLHU9cC5sZW5ndGg7bjx1O24rKyl7Y29uc3QgdT1wW25dLGY9b1t1Lm1hdGVyaWFsSW5kZXhdO2ZvcihsZXQgbj1NYXRoLm1heCh1LnN0YXJ0LG0uc3RhcnQpLG89TWF0aC5taW4odS5zdGFydCt1LmNvdW50LG0uc3RhcnQrbS5jb3VudCk7bjxvO24rPTMpe2NvbnN0IG89aS5nZXRYKG4pLHA9aS5nZXRYKG4rMSksbT1pLmdldFgobisyKTthPW1zdCh0aGlzLGYsdCxYcnQscixzLGwsYyxkLG8scCxtKSxhJiYoYS5mYWNlSW5kZXg9TWF0aC5mbG9vcihuLzMpLGEuZmFjZS5tYXRlcmlhbEluZGV4PXUubWF0ZXJpYWxJbmRleCxlLnB1c2goYSkpfX1lbHNlIGZvcihsZXQgbj1NYXRoLm1heCgwLG0uc3RhcnQpLHA9TWF0aC5taW4oaS5jb3VudCxtLnN0YXJ0K20uY291bnQpO248cDtuKz0zKXtjb25zdCBwPWkuZ2V0WChuKSxtPWkuZ2V0WChuKzEpLHU9aS5nZXRYKG4rMik7YT1tc3QodGhpcyxvLHQsWHJ0LHIscyxsLGMsZCxwLG0sdSksYSYmKGEuZmFjZUluZGV4PU1hdGguZmxvb3Iobi8zKSxlLnB1c2goYSkpfWVsc2UgaWYodm9pZCAwIT09cilpZihBcnJheS5pc0FycmF5KG8pKWZvcihsZXQgbj0wLGk9cC5sZW5ndGg7bjxpO24rKyl7Y29uc3QgaT1wW25dLHU9b1tpLm1hdGVyaWFsSW5kZXhdO2ZvcihsZXQgbj1NYXRoLm1heChpLnN0YXJ0LG0uc3RhcnQpLG89TWF0aC5taW4oaS5zdGFydCtpLmNvdW50LG0uc3RhcnQrbS5jb3VudCk7bjxvO24rPTMpYT1tc3QodGhpcyx1LHQsWHJ0LHIscyxsLGMsZCxuLG4rMSxuKzIpLGEmJihhLmZhY2VJbmRleD1NYXRoLmZsb29yKG4vMyksYS5mYWNlLm1hdGVyaWFsSW5kZXg9aS5tYXRlcmlhbEluZGV4LGUucHVzaChhKSl9ZWxzZSBmb3IobGV0IG49TWF0aC5tYXgoMCxtLnN0YXJ0KSxpPU1hdGgubWluKHIuY291bnQsbS5zdGFydCttLmNvdW50KTtuPGk7bis9MylhPW1zdCh0aGlzLG8sdCxYcnQscixzLGwsYyxkLG4sbisxLG4rMiksYSYmKGEuZmFjZUluZGV4PU1hdGguZmxvb3Iobi8zKSxlLnB1c2goYSkpfWVsc2Ugbi5pc0dlb21ldHJ5JiZjb25zb2xlLmVycm9yKCJUSFJFRS5NZXNoLnJheWNhc3QoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpfX1mdW5jdGlvbiBtc3QodCxlLG4sbyxpLGEscixzLGwsYyxkLHApe0pydC5mcm9tQnVmZmVyQXR0cmlidXRlKGksYyksUXJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUoaSxkKSwkcnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLHApO2NvbnN0IG09dC5tb3JwaFRhcmdldEluZmx1ZW5jZXM7aWYoYSYmbSl7b3N0LnNldCgwLDAsMCksaXN0LnNldCgwLDAsMCksYXN0LnNldCgwLDAsMCk7Zm9yKGxldCB0PTAsZT1hLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPW1bdF0sbj1hW3RdOzAhPT1lJiYodHN0LmZyb21CdWZmZXJBdHRyaWJ1dGUobixjKSxlc3QuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLGQpLG5zdC5mcm9tQnVmZmVyQXR0cmlidXRlKG4scCkscj8ob3N0LmFkZFNjYWxlZFZlY3Rvcih0c3QsZSksaXN0LmFkZFNjYWxlZFZlY3Rvcihlc3QsZSksYXN0LmFkZFNjYWxlZFZlY3Rvcihuc3QsZSkpOihvc3QuYWRkU2NhbGVkVmVjdG9yKHRzdC5zdWIoSnJ0KSxlKSxpc3QuYWRkU2NhbGVkVmVjdG9yKGVzdC5zdWIoUXJ0KSxlKSxhc3QuYWRkU2NhbGVkVmVjdG9yKG5zdC5zdWIoJHJ0KSxlKSkpfUpydC5hZGQob3N0KSxRcnQuYWRkKGlzdCksJHJ0LmFkZChhc3QpfXQuaXNTa2lubmVkTWVzaCYmKHQuYm9uZVRyYW5zZm9ybShjLEpydCksdC5ib25lVHJhbnNmb3JtKGQsUXJ0KSx0LmJvbmVUcmFuc2Zvcm0ocCwkcnQpKTtjb25zdCB1PShmdW5jdGlvbiBmKHQsZSxuLG8saSxhLHIscyl7bGV0IGw7aWYobD0xPT09ZS5zaWRlP28uaW50ZXJzZWN0VHJpYW5nbGUocixhLGksITAscyk6by5pbnRlcnNlY3RUcmlhbmdsZShpLGEsciwyIT09ZS5zaWRlLHMpLG51bGw9PT1sKXJldHVybiBudWxsO2RzdC5jb3B5KHMpLGRzdC5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCk7Y29uc3QgYz1uLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhkc3QpO3JldHVybiBjPG4ubmVhcnx8Yz5uLmZhcj9udWxsOntkaXN0YW5jZTpjLHBvaW50OmRzdC5jbG9uZSgpLG9iamVjdDp0fX0pKHQsZSxuLG8sSnJ0LFFydCwkcnQsY3N0KTtpZih1KXtzJiYocnN0LmZyb21CdWZmZXJBdHRyaWJ1dGUocyxjKSxzc3QuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLGQpLGxzdC5mcm9tQnVmZmVyQXR0cmlidXRlKHMscCksdS51dj12cnQuZ2V0VVYoY3N0LEpydCxRcnQsJHJ0LHJzdCxzc3QsbHN0LG5ldyBRaXQpKSxsJiYocnN0LmZyb21CdWZmZXJBdHRyaWJ1dGUobCxjKSxzc3QuZnJvbUJ1ZmZlckF0dHJpYnV0ZShsLGQpLGxzdC5mcm9tQnVmZmVyQXR0cmlidXRlKGwscCksdS51djI9dnJ0LmdldFVWKGNzdCxKcnQsUXJ0LCRydCxyc3Qsc3N0LGxzdCxuZXcgUWl0KSk7Y29uc3QgdD17YTpjLGI6ZCxjOnAsbm9ybWFsOm5ldyBjYXQsbWF0ZXJpYWxJbmRleDowfTt2cnQuZ2V0Tm9ybWFsKEpydCxRcnQsJHJ0LHQubm9ybWFsKSx1LmZhY2U9dH1yZXR1cm4gdX1wc3QucHJvdG90eXBlLmlzTWVzaD0hMDtjbGFzcyB1c3QgZXh0ZW5kcyBxcnR7Y29uc3RydWN0b3IodD0xLGU9MSxuPTEsbz0xLGk9MSxhPTEpe3N1cGVyKCksdGhpcy50eXBlPSJCb3hHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXt3aWR0aDp0LGhlaWdodDplLGRlcHRoOm4sd2lkdGhTZWdtZW50czpvLGhlaWdodFNlZ21lbnRzOmksZGVwdGhTZWdtZW50czphfTtjb25zdCByPXRoaXM7bz1NYXRoLmZsb29yKG8pLGk9TWF0aC5mbG9vcihpKSxhPU1hdGguZmxvb3IoYSk7Y29uc3Qgcz1bXSxsPVtdLGM9W10sZD1bXTtsZXQgcD0wLG09MDtmdW5jdGlvbiB1KHQsZSxuLG8saSxhLHUsZixnLGgsYil7Y29uc3QgeT1hL2csXz11L2gsQz1hLzIsTT11LzIsdj1mLzIseD1nKzEsTz1oKzE7bGV0IFA9MCx3PTA7Y29uc3Qgaz1uZXcgY2F0O2ZvcihsZXQgYT0wO2E8TzthKyspe2NvbnN0IHI9YSpfLU07Zm9yKGxldCBzPTA7czx4O3MrKylrW3RdPShzKnktQykqbyxrW2VdPXIqaSxrW25dPXYsbC5wdXNoKGsueCxrLnksay56KSxrW3RdPTAsa1tlXT0wLGtbbl09Zj4wPzE6LTEsYy5wdXNoKGsueCxrLnksay56KSxkLnB1c2gocy9nKSxkLnB1c2goMS1hL2gpLFArPTF9Zm9yKGxldCB0PTA7dDxoO3QrKylmb3IobGV0IGU9MDtlPGc7ZSsrKXtjb25zdCBuPXArZSt4Kih0KzEpLG89cCsoZSsxKSt4Kih0KzEpLGk9cCsoZSsxKSt4KnQ7cy5wdXNoKHArZSt4KnQsbixpKSxzLnB1c2gobixvLGkpLHcrPTZ9ci5hZGRHcm91cChtLHcsYiksbSs9dyxwKz1QfXUoInoiLCJ5IiwieCIsLTEsLTEsbixlLHQsYSxpLDApLHUoInoiLCJ5IiwieCIsMSwtMSxuLGUsLXQsYSxpLDEpLHUoIngiLCJ6IiwieSIsMSwxLHQsbixlLG8sYSwyKSx1KCJ4IiwieiIsInkiLDEsLTEsdCxuLC1lLG8sYSwzKSx1KCJ4IiwieSIsInoiLDEsLTEsdCxlLG4sbyxpLDQpLHUoIngiLCJ5IiwieiIsLTEsLTEsdCxlLC1uLG8saSw1KSx0aGlzLnNldEluZGV4KHMpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IEZydChsLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgRnJ0KGMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IEZydChkLDIpKX1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyB1c3QodC53aWR0aCx0LmhlaWdodCx0LmRlcHRoLHQud2lkdGhTZWdtZW50cyx0LmhlaWdodFNlZ21lbnRzLHQuZGVwdGhTZWdtZW50cyl9fWZ1bmN0aW9uIGZzdCh0KXtjb25zdCBlPXt9O2Zvcihjb25zdCBuIGluIHQpe2Vbbl09e307Zm9yKGNvbnN0IG8gaW4gdFtuXSl7Y29uc3QgaT10W25dW29dO2Vbbl1bb109aSYmKGkuaXNDb2xvcnx8aS5pc01hdHJpeDN8fGkuaXNNYXRyaXg0fHxpLmlzVmVjdG9yMnx8aS5pc1ZlY3RvcjN8fGkuaXNWZWN0b3I0fHxpLmlzVGV4dHVyZXx8aS5pc1F1YXRlcm5pb24pP2kuY2xvbmUoKTpBcnJheS5pc0FycmF5KGkpP2kuc2xpY2UoKTppfX1yZXR1cm4gZX1mdW5jdGlvbiBnc3QodCl7Y29uc3QgZT17fTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3Qgbz1mc3QodFtuXSk7Zm9yKGNvbnN0IHQgaW4gbyllW3RdPW9bdF19cmV0dXJuIGV9Y29uc3QgaHN0PXtjbG9uZTpmc3QsbWVyZ2U6Z3N0fTtjbGFzcyBic3QgZXh0ZW5kcyBPcnR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9IlNoYWRlck1hdGVyaWFsIix0aGlzLmRlZmluZXM9e30sdGhpcy51bmlmb3Jtcz17fSx0aGlzLnZlcnRleFNoYWRlcj0idm9pZCBtYWluKCkge1xuXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XG59Iix0aGlzLmZyYWdtZW50U2hhZGVyPSJ2b2lkIG1haW4oKSB7XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIDEuMCwgMC4wLCAwLjAsIDEuMCApO1xufSIsdGhpcy5saW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMuZm9nPSExLHRoaXMubGlnaHRzPSExLHRoaXMuY2xpcHBpbmc9ITEsdGhpcy5leHRlbnNpb25zPXtkZXJpdmF0aXZlczohMSxmcmFnRGVwdGg6ITEsZHJhd0J1ZmZlcnM6ITEsc2hhZGVyVGV4dHVyZUxPRDohMX0sdGhpcy5kZWZhdWx0QXR0cmlidXRlVmFsdWVzPXtjb2xvcjpbMSwxLDFdLHV2OlswLDBdLHV2MjpbMCwwXX0sdGhpcy5pbmRleDBBdHRyaWJ1dGVOYW1lPXZvaWQgMCx0aGlzLnVuaWZvcm1zTmVlZFVwZGF0ZT0hMSx0aGlzLmdsc2xWZXJzaW9uPW51bGwsdm9pZCAwIT09dCYmKHZvaWQgMCE9PXQuYXR0cmlidXRlcyYmY29uc29sZS5lcnJvcigiVEhSRUUuU2hhZGVyTWF0ZXJpYWw6IGF0dHJpYnV0ZXMgc2hvdWxkIG5vdyBiZSBkZWZpbmVkIGluIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIiksdGhpcy5zZXRWYWx1ZXModCkpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5mcmFnbWVudFNoYWRlcj10LmZyYWdtZW50U2hhZGVyLHRoaXMudmVydGV4U2hhZGVyPXQudmVydGV4U2hhZGVyLHRoaXMudW5pZm9ybXM9ZnN0KHQudW5pZm9ybXMpLHRoaXMuZGVmaW5lcz1PYmplY3QuYXNzaWduKHt9LHQuZGVmaW5lcyksdGhpcy53aXJlZnJhbWU9dC53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy5saWdodHM9dC5saWdodHMsdGhpcy5jbGlwcGluZz10LmNsaXBwaW5nLHRoaXMuZXh0ZW5zaW9ucz1PYmplY3QuYXNzaWduKHt9LHQuZXh0ZW5zaW9ucyksdGhpcy5nbHNsVmVyc2lvbj10Lmdsc2xWZXJzaW9uLHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO2UuZ2xzbFZlcnNpb249dGhpcy5nbHNsVmVyc2lvbixlLnVuaWZvcm1zPXt9O2Zvcihjb25zdCBuIGluIHRoaXMudW5pZm9ybXMpe2NvbnN0IG89dGhpcy51bmlmb3Jtc1tuXS52YWx1ZTtlLnVuaWZvcm1zW25dPW8mJm8uaXNUZXh0dXJlP3t0eXBlOiJ0Iix2YWx1ZTpvLnRvSlNPTih0KS51dWlkfTpvJiZvLmlzQ29sb3I/e3R5cGU6ImMiLHZhbHVlOm8uZ2V0SGV4KCl9Om8mJm8uaXNWZWN0b3IyP3t0eXBlOiJ2MiIsdmFsdWU6by50b0FycmF5KCl9Om8mJm8uaXNWZWN0b3IzP3t0eXBlOiJ2MyIsdmFsdWU6by50b0FycmF5KCl9Om8mJm8uaXNWZWN0b3I0P3t0eXBlOiJ2NCIsdmFsdWU6by50b0FycmF5KCl9Om8mJm8uaXNNYXRyaXgzP3t0eXBlOiJtMyIsdmFsdWU6by50b0FycmF5KCl9Om8mJm8uaXNNYXRyaXg0P3t0eXBlOiJtNCIsdmFsdWU6by50b0FycmF5KCl9Ont2YWx1ZTpvfX1PYmplY3Qua2V5cyh0aGlzLmRlZmluZXMpLmxlbmd0aD4wJiYoZS5kZWZpbmVzPXRoaXMuZGVmaW5lcyksZS52ZXJ0ZXhTaGFkZXI9dGhpcy52ZXJ0ZXhTaGFkZXIsZS5mcmFnbWVudFNoYWRlcj10aGlzLmZyYWdtZW50U2hhZGVyO2NvbnN0IG49e307Zm9yKGNvbnN0IHQgaW4gdGhpcy5leHRlbnNpb25zKSEwPT09dGhpcy5leHRlbnNpb25zW3RdJiYoblt0XT0hMCk7cmV0dXJuIE9iamVjdC5rZXlzKG4pLmxlbmd0aD4wJiYoZS5leHRlbnNpb25zPW4pLGV9fWJzdC5wcm90b3R5cGUuaXNTaGFkZXJNYXRlcmlhbD0hMDtjbGFzcyB5c3QgZXh0ZW5kcyBwcnR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudHlwZT0iQ2FtZXJhIix0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZT1uZXcgQmF0LHRoaXMucHJvamVjdGlvbk1hdHJpeD1uZXcgQmF0LHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2U9bmV3IEJhdH1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KHQubWF0cml4V29ybGRJbnZlcnNlKSx0aGlzLnByb2plY3Rpb25NYXRyaXguY29weSh0LnByb2plY3Rpb25NYXRyaXgpLHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSh0LnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKSx0aGlzfWdldFdvcmxkRGlyZWN0aW9uKHQpe3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpO2NvbnN0IGU9dGhpcy5tYXRyaXhXb3JsZC5lbGVtZW50cztyZXR1cm4gdC5zZXQoLWVbOF0sLWVbOV0sLWVbMTBdKS5ub3JtYWxpemUoKX11cGRhdGVNYXRyaXhXb3JsZCh0KXtzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KSx0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpfXVwZGF0ZVdvcmxkTWF0cml4KHQsZSl7c3VwZXIudXBkYXRlV29ybGRNYXRyaXgodCxlKSx0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfX15c3QucHJvdG90eXBlLmlzQ2FtZXJhPSEwO2NsYXNzIF9zdCBleHRlbmRzIHlzdHtjb25zdHJ1Y3Rvcih0PTUwLGU9MSxuPS4xLG89MmUzKXtzdXBlcigpLHRoaXMudHlwZT0iUGVyc3BlY3RpdmVDYW1lcmEiLHRoaXMuZm92PXQsdGhpcy56b29tPTEsdGhpcy5uZWFyPW4sdGhpcy5mYXI9byx0aGlzLmZvY3VzPTEwLHRoaXMuYXNwZWN0PWUsdGhpcy52aWV3PW51bGwsdGhpcy5maWxtR2F1Z2U9MzUsdGhpcy5maWxtT2Zmc2V0PTAsdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5mb3Y9dC5mb3YsdGhpcy56b29tPXQuem9vbSx0aGlzLm5lYXI9dC5uZWFyLHRoaXMuZmFyPXQuZmFyLHRoaXMuZm9jdXM9dC5mb2N1cyx0aGlzLmFzcGVjdD10LmFzcGVjdCx0aGlzLnZpZXc9bnVsbD09PXQudmlldz9udWxsOk9iamVjdC5hc3NpZ24oe30sdC52aWV3KSx0aGlzLmZpbG1HYXVnZT10LmZpbG1HYXVnZSx0aGlzLmZpbG1PZmZzZXQ9dC5maWxtT2Zmc2V0LHRoaXN9c2V0Rm9jYWxMZW5ndGgodCl7Y29uc3QgZT0uNSp0aGlzLmdldEZpbG1IZWlnaHQoKS90O3RoaXMuZm92PTIqWWl0Kk1hdGguYXRhbihlKSx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1nZXRGb2NhbExlbmd0aCgpe2NvbnN0IHQ9TWF0aC50YW4oLjUqV2l0KnRoaXMuZm92KTtyZXR1cm4uNSp0aGlzLmdldEZpbG1IZWlnaHQoKS90fWdldEVmZmVjdGl2ZUZPVigpe3JldHVybiAyKllpdCpNYXRoLmF0YW4oTWF0aC50YW4oLjUqV2l0KnRoaXMuZm92KS90aGlzLnpvb20pfWdldEZpbG1XaWR0aCgpe3JldHVybiB0aGlzLmZpbG1HYXVnZSpNYXRoLm1pbih0aGlzLmFzcGVjdCwxKX1nZXRGaWxtSGVpZ2h0KCl7cmV0dXJuIHRoaXMuZmlsbUdhdWdlL01hdGgubWF4KHRoaXMuYXNwZWN0LDEpfXNldFZpZXdPZmZzZXQodCxlLG4sbyxpLGEpe3RoaXMuYXNwZWN0PXQvZSxudWxsPT09dGhpcy52aWV3JiYodGhpcy52aWV3PXtlbmFibGVkOiEwLGZ1bGxXaWR0aDoxLGZ1bGxIZWlnaHQ6MSxvZmZzZXRYOjAsb2Zmc2V0WTowLHdpZHRoOjEsaGVpZ2h0OjF9KSx0aGlzLnZpZXcuZW5hYmxlZD0hMCx0aGlzLnZpZXcuZnVsbFdpZHRoPXQsdGhpcy52aWV3LmZ1bGxIZWlnaHQ9ZSx0aGlzLnZpZXcub2Zmc2V0WD1uLHRoaXMudmlldy5vZmZzZXRZPW8sdGhpcy52aWV3LndpZHRoPWksdGhpcy52aWV3LmhlaWdodD1hLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfWNsZWFyVmlld09mZnNldCgpe251bGwhPT10aGlzLnZpZXcmJih0aGlzLnZpZXcuZW5hYmxlZD0hMSksdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9dXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpe2NvbnN0IHQ9dGhpcy5uZWFyO2xldCBlPXQqTWF0aC50YW4oLjUqV2l0KnRoaXMuZm92KS90aGlzLnpvb20sbj0yKmUsbz10aGlzLmFzcGVjdCpuLGk9LS41Km87Y29uc3QgYT10aGlzLnZpZXc7aWYobnVsbCE9PXRoaXMudmlldyYmdGhpcy52aWV3LmVuYWJsZWQpe2NvbnN0IHQ9YS5mdWxsV2lkdGgscj1hLmZ1bGxIZWlnaHQ7aSs9YS5vZmZzZXRYKm8vdCxlLT1hLm9mZnNldFkqbi9yLG8qPWEud2lkdGgvdCxuKj1hLmhlaWdodC9yfWNvbnN0IHI9dGhpcy5maWxtT2Zmc2V0OzAhPT1yJiYoaSs9dCpyL3RoaXMuZ2V0RmlsbVdpZHRoKCkpLHRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUoaSxpK28sZSxlLW4sdCx0aGlzLmZhciksdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMucHJvamVjdGlvbk1hdHJpeCkuaW52ZXJ0KCl9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO3JldHVybiBlLm9iamVjdC5mb3Y9dGhpcy5mb3YsZS5vYmplY3Quem9vbT10aGlzLnpvb20sZS5vYmplY3QubmVhcj10aGlzLm5lYXIsZS5vYmplY3QuZmFyPXRoaXMuZmFyLGUub2JqZWN0LmZvY3VzPXRoaXMuZm9jdXMsZS5vYmplY3QuYXNwZWN0PXRoaXMuYXNwZWN0LG51bGwhPT10aGlzLnZpZXcmJihlLm9iamVjdC52aWV3PU9iamVjdC5hc3NpZ24oe30sdGhpcy52aWV3KSksZS5vYmplY3QuZmlsbUdhdWdlPXRoaXMuZmlsbUdhdWdlLGUub2JqZWN0LmZpbG1PZmZzZXQ9dGhpcy5maWxtT2Zmc2V0LGV9fV9zdC5wcm90b3R5cGUuaXNQZXJzcGVjdGl2ZUNhbWVyYT0hMDtjb25zdCBDc3Q9OTA7Y2xhc3MgTXN0IGV4dGVuZHMgcHJ0e2NvbnN0cnVjdG9yKHQsZSxuKXtpZihzdXBlcigpLHRoaXMudHlwZT0iQ3ViZUNhbWVyYSIsITAhPT1uLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0KXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkN1YmVDYW1lcmE6IFRoZSBjb25zdHJ1Y3RvciBub3cgZXhwZWN0cyBhbiBpbnN0YW5jZSBvZiBXZWJHTEN1YmVSZW5kZXJUYXJnZXQgYXMgdGhpcmQgcGFyYW1ldGVyLiIpO3RoaXMucmVuZGVyVGFyZ2V0PW47Y29uc3Qgbz1uZXcgX3N0KENzdCwxLHQsZSk7by5sYXllcnM9dGhpcy5sYXllcnMsby51cC5zZXQoMCwtMSwwKSxvLmxvb2tBdChuZXcgY2F0KDEsMCwwKSksdGhpcy5hZGQobyk7Y29uc3QgaT1uZXcgX3N0KENzdCwxLHQsZSk7aS5sYXllcnM9dGhpcy5sYXllcnMsaS51cC5zZXQoMCwtMSwwKSxpLmxvb2tBdChuZXcgY2F0KC0xLDAsMCkpLHRoaXMuYWRkKGkpO2NvbnN0IGE9bmV3IF9zdChDc3QsMSx0LGUpO2EubGF5ZXJzPXRoaXMubGF5ZXJzLGEudXAuc2V0KDAsMCwxKSxhLmxvb2tBdChuZXcgY2F0KDAsMSwwKSksdGhpcy5hZGQoYSk7Y29uc3Qgcj1uZXcgX3N0KENzdCwxLHQsZSk7ci5sYXllcnM9dGhpcy5sYXllcnMsci51cC5zZXQoMCwwLC0xKSxyLmxvb2tBdChuZXcgY2F0KDAsLTEsMCkpLHRoaXMuYWRkKHIpO2NvbnN0IHM9bmV3IF9zdChDc3QsMSx0LGUpO3MubGF5ZXJzPXRoaXMubGF5ZXJzLHMudXAuc2V0KDAsLTEsMCkscy5sb29rQXQobmV3IGNhdCgwLDAsMSkpLHRoaXMuYWRkKHMpO2NvbnN0IGw9bmV3IF9zdChDc3QsMSx0LGUpO2wubGF5ZXJzPXRoaXMubGF5ZXJzLGwudXAuc2V0KDAsLTEsMCksbC5sb29rQXQobmV3IGNhdCgwLDAsLTEpKSx0aGlzLmFkZChsKX11cGRhdGUodCxlKXtudWxsPT09dGhpcy5wYXJlbnQmJnRoaXMudXBkYXRlTWF0cml4V29ybGQoKTtjb25zdCBuPXRoaXMucmVuZGVyVGFyZ2V0LFtvLGksYSxyLHMsbF09dGhpcy5jaGlsZHJlbixjPXQueHIuZW5hYmxlZCxkPXQuZ2V0UmVuZGVyVGFyZ2V0KCk7dC54ci5lbmFibGVkPSExO2NvbnN0IHA9bi50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztuLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPSExLHQuc2V0UmVuZGVyVGFyZ2V0KG4sMCksdC5yZW5kZXIoZSxvKSx0LnNldFJlbmRlclRhcmdldChuLDEpLHQucmVuZGVyKGUsaSksdC5zZXRSZW5kZXJUYXJnZXQobiwyKSx0LnJlbmRlcihlLGEpLHQuc2V0UmVuZGVyVGFyZ2V0KG4sMyksdC5yZW5kZXIoZSxyKSx0LnNldFJlbmRlclRhcmdldChuLDQpLHQucmVuZGVyKGUscyksbi50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz1wLHQuc2V0UmVuZGVyVGFyZ2V0KG4sNSksdC5yZW5kZXIoZSxsKSx0LnNldFJlbmRlclRhcmdldChkKSx0LnhyLmVuYWJsZWQ9Y319Y2xhc3MgdnN0IGV4dGVuZHMgb2F0e2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIscyxsLGMpe3N1cGVyKHQ9dm9pZCAwIT09dD90OltdLGU9dm9pZCAwIT09ZT9lOmRpdCxuLG8saSxhLHI9dm9pZCAwIT09cj9yOlBpdCxzLGwsYyksdGhpcy5mbGlwWT0hMX1nZXQgaW1hZ2VzKCl7cmV0dXJuIHRoaXMuaW1hZ2V9c2V0IGltYWdlcyh0KXt0aGlzLmltYWdlPXR9fXZzdC5wcm90b3R5cGUuaXNDdWJlVGV4dHVyZT0hMDtjbGFzcyB4c3QgZXh0ZW5kcyByYXR7Y29uc3RydWN0b3IodCxlLG4pe051bWJlci5pc0ludGVnZXIoZSkmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMQ3ViZVJlbmRlclRhcmdldDogY29uc3RydWN0b3Igc2lnbmF0dXJlIGlzIG5vdyBXZWJHTEN1YmVSZW5kZXJUYXJnZXQoIHNpemUsIG9wdGlvbnMgKSIpLGU9biksc3VwZXIodCx0LGUpLHRoaXMudGV4dHVyZT1uZXcgdnN0KHZvaWQgMCwoZT1lfHx7fSkubWFwcGluZyxlLndyYXBTLGUud3JhcFQsZS5tYWdGaWx0ZXIsZS5taW5GaWx0ZXIsZS5mb3JtYXQsZS50eXBlLGUuYW5pc290cm9weSxlLmVuY29kaW5nKSx0aGlzLnRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSEwLHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9dm9pZCAwIT09ZS5nZW5lcmF0ZU1pcG1hcHMmJmUuZ2VuZXJhdGVNaXBtYXBzLHRoaXMudGV4dHVyZS5taW5GaWx0ZXI9dm9pZCAwIT09ZS5taW5GaWx0ZXI/ZS5taW5GaWx0ZXI6Yml0LHRoaXMudGV4dHVyZS5fbmVlZHNGbGlwRW52TWFwPSExfWZyb21FcXVpcmVjdGFuZ3VsYXJUZXh0dXJlKHQsZSl7dGhpcy50ZXh0dXJlLnR5cGU9ZS50eXBlLHRoaXMudGV4dHVyZS5mb3JtYXQ9d2l0LHRoaXMudGV4dHVyZS5lbmNvZGluZz1lLmVuY29kaW5nLHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9ZS5nZW5lcmF0ZU1pcG1hcHMsdGhpcy50ZXh0dXJlLm1pbkZpbHRlcj1lLm1pbkZpbHRlcix0aGlzLnRleHR1cmUubWFnRmlsdGVyPWUubWFnRmlsdGVyO2NvbnN0IG49bmV3IHVzdCg1LDUsNSksbz1uZXcgYnN0KHtuYW1lOiJDdWJlbWFwRnJvbUVxdWlyZWN0Iix1bmlmb3Jtczpmc3Qoe3RFcXVpcmVjdDp7dmFsdWU6bnVsbH19KSx2ZXJ0ZXhTaGFkZXI6IlxuXG5cdFx0XHRcdHZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG5cblx0XHRcdFx0dmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcblxuXHRcdFx0XHRcdHJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2b2lkIG1haW4oKSB7XG5cblx0XHRcdFx0XHR2V29ybGREaXJlY3Rpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApO1xuXG5cdFx0XHRcdFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0XHRcdFx0XHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cblx0XHRcdFx0fVxuXHRcdFx0IixmcmFnbWVudFNoYWRlcjoiXG5cblx0XHRcdFx0dW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0O1xuXG5cdFx0XHRcdHZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG5cblx0XHRcdFx0I2luY2x1ZGUgPGNvbW1vbj5cblxuXHRcdFx0XHR2b2lkIG1haW4oKSB7XG5cblx0XHRcdFx0XHR2ZWMzIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdldvcmxkRGlyZWN0aW9uICk7XG5cblx0XHRcdFx0XHR2ZWMyIHNhbXBsZVVWID0gZXF1aXJlY3RVdiggZGlyZWN0aW9uICk7XG5cblx0XHRcdFx0XHRnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTtcblxuXHRcdFx0XHR9XG5cdFx0XHQiLHNpZGU6MSxibGVuZGluZzowfSk7by51bmlmb3Jtcy50RXF1aXJlY3QudmFsdWU9ZTtjb25zdCBpPW5ldyBwc3QobixvKSxhPWUubWluRmlsdGVyO3JldHVybiBlLm1pbkZpbHRlcj09PXlpdCYmKGUubWluRmlsdGVyPWJpdCksbmV3IE1zdCgxLDEwLHRoaXMpLnVwZGF0ZSh0LGkpLGUubWluRmlsdGVyPWEsaS5nZW9tZXRyeS5kaXNwb3NlKCksaS5tYXRlcmlhbC5kaXNwb3NlKCksdGhpc31jbGVhcih0LGUsbixvKXtjb25zdCBpPXQuZ2V0UmVuZGVyVGFyZ2V0KCk7Zm9yKGxldCBpPTA7aTw2O2krKyl0LnNldFJlbmRlclRhcmdldCh0aGlzLGkpLHQuY2xlYXIoZSxuLG8pO3Quc2V0UmVuZGVyVGFyZ2V0KGkpfX14c3QucHJvdG90eXBlLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0PSEwO2NvbnN0IE9zdD1uZXcgY2F0LFBzdD1uZXcgY2F0LHdzdD1uZXcgJGl0O2NsYXNzIGtzdHtjb25zdHJ1Y3Rvcih0PW5ldyBjYXQoMSwwLDApLGU9MCl7dGhpcy5ub3JtYWw9dCx0aGlzLmNvbnN0YW50PWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodCksdGhpcy5jb25zdGFudD1lLHRoaXN9c2V0Q29tcG9uZW50cyh0LGUsbixvKXtyZXR1cm4gdGhpcy5ub3JtYWwuc2V0KHQsZSxuKSx0aGlzLmNvbnN0YW50PW8sdGhpc31zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQpLHRoaXMuY29uc3RhbnQ9LWUuZG90KHRoaXMubm9ybWFsKSx0aGlzfXNldEZyb21Db3BsYW5hclBvaW50cyh0LGUsbil7Y29uc3Qgbz1Pc3Quc3ViVmVjdG9ycyhuLGUpLmNyb3NzKFBzdC5zdWJWZWN0b3JzKHQsZSkpLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KG8sdCksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQubm9ybWFsKSx0aGlzLmNvbnN0YW50PXQuY29uc3RhbnQsdGhpc31ub3JtYWxpemUoKXtjb25zdCB0PTEvdGhpcy5ub3JtYWwubGVuZ3RoKCk7cmV0dXJuIHRoaXMubm9ybWFsLm11bHRpcGx5U2NhbGFyKHQpLHRoaXMuY29uc3RhbnQqPXQsdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy5jb25zdGFudCo9LTEsdGhpcy5ub3JtYWwubmVnYXRlKCksdGhpc31kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHRoaXMubm9ybWFsLmRvdCh0KSt0aGlzLmNvbnN0YW50fWRpc3RhbmNlVG9TcGhlcmUodCl7cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KHQuY2VudGVyKS10LnJhZGl1c31wcm9qZWN0UG9pbnQodCxlKXtyZXR1cm4gZS5jb3B5KHRoaXMubm9ybWFsKS5tdWx0aXBseVNjYWxhcigtdGhpcy5kaXN0YW5jZVRvUG9pbnQodCkpLmFkZCh0KX1pbnRlcnNlY3RMaW5lKHQsZSl7Y29uc3Qgbj10LmRlbHRhKE9zdCksbz10aGlzLm5vcm1hbC5kb3Qobik7aWYoMD09PW8pcmV0dXJuIDA9PT10aGlzLmRpc3RhbmNlVG9Qb2ludCh0LnN0YXJ0KT9lLmNvcHkodC5zdGFydCk6bnVsbDtjb25zdCBpPS0odC5zdGFydC5kb3QodGhpcy5ub3JtYWwpK3RoaXMuY29uc3RhbnQpL287cmV0dXJuIGk8MHx8aT4xP251bGw6ZS5jb3B5KG4pLm11bHRpcGx5U2NhbGFyKGkpLmFkZCh0LnN0YXJ0KX1pbnRlcnNlY3RzTGluZSh0KXtjb25zdCBlPXRoaXMuZGlzdGFuY2VUb1BvaW50KHQuc3RhcnQpLG49dGhpcy5kaXN0YW5jZVRvUG9pbnQodC5lbmQpO3JldHVybiBlPDAmJm4+MHx8bjwwJiZlPjB9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzUGxhbmUodGhpcyl9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzUGxhbmUodGhpcyl9Y29wbGFuYXJQb2ludCh0KXtyZXR1cm4gdC5jb3B5KHRoaXMubm9ybWFsKS5tdWx0aXBseVNjYWxhcigtdGhpcy5jb25zdGFudCl9YXBwbHlNYXRyaXg0KHQsZSl7Y29uc3Qgbj1lfHx3c3QuZ2V0Tm9ybWFsTWF0cml4KHQpLG89dGhpcy5jb3BsYW5hclBvaW50KE9zdCkuYXBwbHlNYXRyaXg0KHQpLGk9dGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKG4pLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLmNvbnN0YW50PS1vLmRvdChpKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jb25zdGFudC09dC5kb3QodGhpcy5ub3JtYWwpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpJiZ0LmNvbnN0YW50PT09dGhpcy5jb25zdGFudH1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19a3N0LnByb3RvdHlwZS5pc1BsYW5lPSEwO2NvbnN0IFNzdD1uZXcgUmF0LERzdD1uZXcgY2F0O2NsYXNzIEVzdHtjb25zdHJ1Y3Rvcih0PW5ldyBrc3QsZT1uZXcga3N0LG49bmV3IGtzdCxvPW5ldyBrc3QsaT1uZXcga3N0LGE9bmV3IGtzdCl7dGhpcy5wbGFuZXM9W3QsZSxuLG8saSxhXX1zZXQodCxlLG4sbyxpLGEpe2NvbnN0IHI9dGhpcy5wbGFuZXM7cmV0dXJuIHJbMF0uY29weSh0KSxyWzFdLmNvcHkoZSksclsyXS5jb3B5KG4pLHJbM10uY29weShvKSxyWzRdLmNvcHkoaSkscls1XS5jb3B5KGEpLHRoaXN9Y29weSh0KXtjb25zdCBlPXRoaXMucGxhbmVzO2ZvcihsZXQgbj0wO248NjtuKyspZVtuXS5jb3B5KHQucGxhbmVzW25dKTtyZXR1cm4gdGhpc31zZXRGcm9tUHJvamVjdGlvbk1hdHJpeCh0KXtjb25zdCBlPXRoaXMucGxhbmVzLG49dC5lbGVtZW50cyxvPW5bMF0saT1uWzFdLGE9blsyXSxyPW5bM10scz1uWzRdLGw9bls1XSxjPW5bNl0sZD1uWzddLHA9bls4XSxtPW5bOV0sdT1uWzEwXSxmPW5bMTFdLGc9blsxMl0saD1uWzEzXSxiPW5bMTRdLHk9blsxNV07cmV0dXJuIGVbMF0uc2V0Q29tcG9uZW50cyhyLW8sZC1zLGYtcCx5LWcpLm5vcm1hbGl6ZSgpLGVbMV0uc2V0Q29tcG9uZW50cyhyK28sZCtzLGYrcCx5K2cpLm5vcm1hbGl6ZSgpLGVbMl0uc2V0Q29tcG9uZW50cyhyK2ksZCtsLGYrbSx5K2gpLm5vcm1hbGl6ZSgpLGVbM10uc2V0Q29tcG9uZW50cyhyLWksZC1sLGYtbSx5LWgpLm5vcm1hbGl6ZSgpLGVbNF0uc2V0Q29tcG9uZW50cyhyLWEsZC1jLGYtdSx5LWIpLm5vcm1hbGl6ZSgpLGVbNV0uc2V0Q29tcG9uZW50cyhyK2EsZCtjLGYrdSx5K2IpLm5vcm1hbGl6ZSgpLHRoaXN9aW50ZXJzZWN0c09iamVjdCh0KXtjb25zdCBlPXQuZ2VvbWV0cnk7cmV0dXJuIG51bGw9PT1lLmJvdW5kaW5nU3BoZXJlJiZlLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLFNzdC5jb3B5KGUuYm91bmRpbmdTcGhlcmUpLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKSx0aGlzLmludGVyc2VjdHNTcGhlcmUoU3N0KX1pbnRlcnNlY3RzU3ByaXRlKHQpe3JldHVybiBTc3QuY2VudGVyLnNldCgwLDAsMCksU3N0LnJhZGl1cz0uNzA3MTA2NzgxMTg2NTQ3NixTc3QuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMuaW50ZXJzZWN0c1NwaGVyZShTc3QpfWludGVyc2VjdHNTcGhlcmUodCl7Y29uc3QgZT10aGlzLnBsYW5lcyxuPXQuY2VudGVyLG89LXQucmFkaXVzO2ZvcihsZXQgdD0wO3Q8Njt0KyspaWYoZVt0XS5kaXN0YW5jZVRvUG9pbnQobik8bylyZXR1cm4hMTtyZXR1cm4hMH1pbnRlcnNlY3RzQm94KHQpe2NvbnN0IGU9dGhpcy5wbGFuZXM7Zm9yKGxldCBuPTA7bjw2O24rKyl7Y29uc3Qgbz1lW25dO2lmKERzdC54PW8ubm9ybWFsLng+MD90Lm1heC54OnQubWluLngsRHN0Lnk9by5ub3JtYWwueT4wP3QubWF4Lnk6dC5taW4ueSxEc3Quej1vLm5vcm1hbC56PjA/dC5tYXguejp0Lm1pbi56LG8uZGlzdGFuY2VUb1BvaW50KERzdCk8MClyZXR1cm4hMX1yZXR1cm4hMH1jb250YWluc1BvaW50KHQpe2NvbnN0IGU9dGhpcy5wbGFuZXM7Zm9yKGxldCBuPTA7bjw2O24rKylpZihlW25dLmRpc3RhbmNlVG9Qb2ludCh0KTwwKXJldHVybiExO3JldHVybiEwfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfX1mdW5jdGlvbiBSc3QoKXtsZXQgdD1udWxsLGU9ITEsbj1udWxsLG89bnVsbDtmdW5jdGlvbiBpKGUsYSl7bihlLGEpLG89dC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaSl9cmV0dXJue3N0YXJ0OmZ1bmN0aW9uKCl7ITAhPT1lJiZudWxsIT09biYmKG89dC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaSksZT0hMCl9LHN0b3A6ZnVuY3Rpb24oKXt0LmNhbmNlbEFuaW1hdGlvbkZyYW1lKG8pLGU9ITF9LHNldEFuaW1hdGlvbkxvb3A6ZnVuY3Rpb24odCl7bj10fSxzZXRDb250ZXh0OmZ1bmN0aW9uKGUpe3Q9ZX19fWZ1bmN0aW9uIEFzdCh0LGUpe2NvbnN0IG49ZS5pc1dlYkdMMixvPW5ldyBXZWFrTWFwO3JldHVybntnZXQ6ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdC5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYodD10LmRhdGEpLG8uZ2V0KHQpfSxyZW1vdmU6ZnVuY3Rpb24gYShlKXtlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihlPWUuZGF0YSk7Y29uc3Qgbj1vLmdldChlKTtuJiYodC5kZWxldGVCdWZmZXIobi5idWZmZXIpLG8uZGVsZXRlKGUpKX0sdXBkYXRlOmZ1bmN0aW9uIHIoZSxpKXtpZihlLmlzR0xCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IHQ9by5nZXQoZSk7cmV0dXJuIHZvaWQoKCF0fHx0LnZlcnNpb248ZS52ZXJzaW9uKSYmby5zZXQoZSx7YnVmZmVyOmUuYnVmZmVyLHR5cGU6ZS50eXBlLGJ5dGVzUGVyRWxlbWVudDplLmVsZW1lbnRTaXplLHZlcnNpb246ZS52ZXJzaW9ufSkpfWUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKGU9ZS5kYXRhKTtjb25zdCBhPW8uZ2V0KGUpO3ZvaWQgMD09PWE/by5zZXQoZSwoZnVuY3Rpb24gcihlLG8pe2NvbnN0IGk9ZS5hcnJheSxhPWUudXNhZ2Uscj10LmNyZWF0ZUJ1ZmZlcigpO3QuYmluZEJ1ZmZlcihvLHIpLHQuYnVmZmVyRGF0YShvLGksYSksZS5vblVwbG9hZENhbGxiYWNrKCk7bGV0IHM9NTEyNjtyZXR1cm4gaSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheT9zPTUxMjY6aSBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheT9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMQXR0cmlidXRlczogVW5zdXBwb3J0ZWQgZGF0YSBidWZmZXIgZm9ybWF0OiBGbG9hdDY0QXJyYXkuIik6aSBpbnN0YW5jZW9mIFVpbnQxNkFycmF5P2UuaXNGbG9hdDE2QnVmZmVyQXR0cmlidXRlP24/cz01MTMxOmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xBdHRyaWJ1dGVzOiBVc2FnZSBvZiBGbG9hdDE2QnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIFdlYkdMMi4iKTpzPTUxMjM6aSBpbnN0YW5jZW9mIEludDE2QXJyYXk/cz01MTIyOmkgaW5zdGFuY2VvZiBVaW50MzJBcnJheT9zPTUxMjU6aSBpbnN0YW5jZW9mIEludDMyQXJyYXk/cz01MTI0OmkgaW5zdGFuY2VvZiBJbnQ4QXJyYXk/cz01MTIwOihpIGluc3RhbmNlb2YgVWludDhBcnJheXx8aSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSYmKHM9NTEyMSkse2J1ZmZlcjpyLHR5cGU6cyxieXRlc1BlckVsZW1lbnQ6aS5CWVRFU19QRVJfRUxFTUVOVCx2ZXJzaW9uOmUudmVyc2lvbn19KShlLGkpKTphLnZlcnNpb248ZS52ZXJzaW9uJiYoKGZ1bmN0aW9uIHMoZSxvLGkpe2NvbnN0IGE9by5hcnJheSxyPW8udXBkYXRlUmFuZ2U7dC5iaW5kQnVmZmVyKGksZSksLTE9PT1yLmNvdW50P3QuYnVmZmVyU3ViRGF0YShpLDAsYSk6KG4/dC5idWZmZXJTdWJEYXRhKGksci5vZmZzZXQqYS5CWVRFU19QRVJfRUxFTUVOVCxhLHIub2Zmc2V0LHIuY291bnQpOnQuYnVmZmVyU3ViRGF0YShpLHIub2Zmc2V0KmEuQllURVNfUEVSX0VMRU1FTlQsYS5zdWJhcnJheShyLm9mZnNldCxyLm9mZnNldCtyLmNvdW50KSksci5jb3VudD0tMSl9KShhLmJ1ZmZlcixlLGkpLGEudmVyc2lvbj1lLnZlcnNpb24pfX19Y2xhc3MgVHN0IGV4dGVuZHMgcXJ0e2NvbnN0cnVjdG9yKHQ9MSxlPTEsbj0xLG89MSl7c3VwZXIoKSx0aGlzLnR5cGU9IlBsYW5lR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17d2lkdGg6dCxoZWlnaHQ6ZSx3aWR0aFNlZ21lbnRzOm4saGVpZ2h0U2VnbWVudHM6b307Y29uc3QgaT10LzIsYT1lLzIscj1NYXRoLmZsb29yKG4pLHM9TWF0aC5mbG9vcihvKSxsPXIrMSxjPXMrMSxkPXQvcixwPWUvcyxtPVtdLHU9W10sZj1bXSxnPVtdO2ZvcihsZXQgdD0wO3Q8Yzt0Kyspe2NvbnN0IGU9dCpwLWE7Zm9yKGxldCBuPTA7bjxsO24rKyl1LnB1c2gobipkLWksLWUsMCksZi5wdXNoKDAsMCwxKSxnLnB1c2gobi9yKSxnLnB1c2goMS10L3MpfWZvcihsZXQgdD0wO3Q8czt0KyspZm9yKGxldCBlPTA7ZTxyO2UrKyl7Y29uc3Qgbj1lK2wqKHQrMSksbz1lKzErbCoodCsxKSxpPWUrMStsKnQ7bS5wdXNoKGUrbCp0LG4saSksbS5wdXNoKG4sbyxpKX10aGlzLnNldEluZGV4KG0pLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IEZydCh1LDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgRnJ0KGYsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IEZydChnLDIpKX1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBUc3QodC53aWR0aCx0LmhlaWdodCx0LndpZHRoU2VnbWVudHMsdC5oZWlnaHRTZWdtZW50cyl9fWNvbnN0IE5zdD17YWxwaGFtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQUxQSEFNQVBcblx0ZGlmZnVzZUNvbG9yLmEgKj0gdGV4dHVyZTJEKCBhbHBoYU1hcCwgdlV2ICkuZztcbiNlbmRpZiIsYWxwaGFtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9BTFBIQU1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBhbHBoYU1hcDtcbiNlbmRpZiIsYWxwaGF0ZXN0X2ZyYWdtZW50OiIjaWZkZWYgQUxQSEFURVNUXG5cdGlmICggZGlmZnVzZUNvbG9yLmEgPCBBTFBIQVRFU1QgKSBkaXNjYXJkO1xuI2VuZGlmIixhb21hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9BT01BUFxuXHRmbG9hdCBhbWJpZW50T2NjbHVzaW9uID0gKCB0ZXh0dXJlMkQoIGFvTWFwLCB2VXYyICkuciAtIDEuMCApICogYW9NYXBJbnRlbnNpdHkgKyAxLjA7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBhbWJpZW50T2NjbHVzaW9uO1xuXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFNUQU5EQVJEIClcblx0XHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciAqPSBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGRvdE5WLCBhbWJpZW50T2NjbHVzaW9uLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xuXHQjZW5kaWZcbiNlbmRpZiIsYW9tYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9BT01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBhb01hcDtcblx0dW5pZm9ybSBmbG9hdCBhb01hcEludGVuc2l0eTtcbiNlbmRpZiIsYmVnaW5fdmVydGV4OiJ2ZWMzIHRyYW5zZm9ybWVkID0gdmVjMyggcG9zaXRpb24gKTsiLGJlZ2lubm9ybWFsX3ZlcnRleDoidmVjMyBvYmplY3ROb3JtYWwgPSB2ZWMzKCBub3JtYWwgKTtcbiNpZmRlZiBVU0VfVEFOR0VOVFxuXHR2ZWMzIG9iamVjdFRhbmdlbnQgPSB2ZWMzKCB0YW5nZW50Lnh5eiApO1xuI2VuZGlmIixic2RmczoidmVjMiBpbnRlZ3JhdGVTcGVjdWxhckJSREYoIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGNvbnN0IHZlYzQgYzAgPSB2ZWM0KCAtIDEsIC0gMC4wMjc1LCAtIDAuNTcyLCAwLjAyMiApO1xuXHRjb25zdCB2ZWM0IGMxID0gdmVjNCggMSwgMC4wNDI1LCAxLjA0LCAtIDAuMDQgKTtcblx0dmVjNCByID0gcm91Z2huZXNzICogYzAgKyBjMTtcblx0ZmxvYXQgYTAwNCA9IG1pbiggci54ICogci54LCBleHAyKCAtIDkuMjggKiBkb3ROViApICkgKiByLnggKyByLnk7XG5cdHJldHVybiB2ZWMyKCAtMS4wNCwgMS4wNCApICogYTAwNCArIHIuenc7XG59XG5mbG9hdCBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBjb25zdCBpbiBmbG9hdCBsaWdodERpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBjdXRvZmZEaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgZGVjYXlFeHBvbmVudCApIHtcbiNpZiBkZWZpbmVkICggUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUyApXG5cdGZsb2F0IGRpc3RhbmNlRmFsbG9mZiA9IDEuMCAvIG1heCggcG93KCBsaWdodERpc3RhbmNlLCBkZWNheUV4cG9uZW50ICksIDAuMDEgKTtcblx0aWYoIGN1dG9mZkRpc3RhbmNlID4gMC4wICkge1xuXHRcdGRpc3RhbmNlRmFsbG9mZiAqPSBwb3cyKCBzYXR1cmF0ZSggMS4wIC0gcG93NCggbGlnaHREaXN0YW5jZSAvIGN1dG9mZkRpc3RhbmNlICkgKSApO1xuXHR9XG5cdHJldHVybiBkaXN0YW5jZUZhbGxvZmY7XG4jZWxzZVxuXHRpZiggY3V0b2ZmRGlzdGFuY2UgPiAwLjAgJiYgZGVjYXlFeHBvbmVudCA+IDAuMCApIHtcblx0XHRyZXR1cm4gcG93KCBzYXR1cmF0ZSggLWxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSArIDEuMCApLCBkZWNheUV4cG9uZW50ICk7XG5cdH1cblx0cmV0dXJuIDEuMDtcbiNlbmRpZlxufVxudmVjMyBCUkRGX0RpZmZ1c2VfTGFtYmVydCggY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IgKSB7XG5cdHJldHVybiBSRUNJUFJPQ0FMX1BJICogZGlmZnVzZUNvbG9yO1xufVxudmVjMyBGX1NjaGxpY2soIGNvbnN0IGluIHZlYzMgZjAsIGNvbnN0IGluIHZlYzMgZjkwLCBjb25zdCBpbiBmbG9hdCBkb3RWSCApIHtcblx0ZmxvYXQgZnJlc25lbCA9IGV4cDIoICggLTUuNTU0NzMgKiBkb3RWSCAtIDYuOTgzMTYgKSAqIGRvdFZIICk7XG5cdHJldHVybiAoIGY5MCAtIGYwICkgKiBmcmVzbmVsICsgZjA7XG59XG52ZWMzIEZfU2NobGlja19Sb3VnaG5lc3NEZXBlbmRlbnQoIGNvbnN0IGluIHZlYzMgRjAsIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGZyZXNuZWwgPSBleHAyKCAoIC01LjU1NDczICogZG90TlYgLSA2Ljk4MzE2ICkgKiBkb3ROViApO1xuXHR2ZWMzIEZyID0gbWF4KCB2ZWMzKCAxLjAgLSByb3VnaG5lc3MgKSwgRjAgKSAtIEYwO1xuXHRyZXR1cm4gRnIgKiBmcmVzbmVsICsgRjA7XG59XG5mbG9hdCBHX0dHWF9TbWl0aCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5MLCBjb25zdCBpbiBmbG9hdCBkb3ROViApIHtcblx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xuXHRmbG9hdCBnbCA9IGRvdE5MICsgc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XG5cdGZsb2F0IGd2ID0gZG90TlYgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcblx0cmV0dXJuIDEuMCAvICggZ2wgKiBndiApO1xufVxuZmxvYXQgR19HR1hfU21pdGhDb3JyZWxhdGVkKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xuXHRmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGd2ID0gZG90TkwgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcblx0ZmxvYXQgZ2wgPSBkb3ROViAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TkwgKSApO1xuXHRyZXR1cm4gMC41IC8gbWF4KCBndiArIGdsLCBFUFNJTE9OICk7XG59XG5mbG9hdCBEX0dHWCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkge1xuXHRmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGRlbm9tID0gcG93MiggZG90TkggKSAqICggYTIgLSAxLjAgKSArIDEuMDtcblx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBhMiAvIHBvdzIoIGRlbm9tICk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfR0dYKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGluY2lkZW50TGlnaHQsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgZjAsIGNvbnN0IGluIHZlYzMgZjkwLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGFscGhhID0gcG93Miggcm91Z2huZXNzICk7XG5cdHZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKyB2aWV3RGlyICk7XG5cdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTtcblx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApO1xuXHRmbG9hdCBkb3RMSCA9IHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcblx0dmVjMyBGID0gRl9TY2hsaWNrKCBmMCwgZjkwLCBkb3RMSCApO1xuXHRmbG9hdCBHID0gR19HR1hfU21pdGhDb3JyZWxhdGVkKCBhbHBoYSwgZG90TkwsIGRvdE5WICk7XG5cdGZsb2F0IEQgPSBEX0dHWCggYWxwaGEsIGRvdE5IICk7XG5cdHJldHVybiBGICogKCBHICogRCApO1xufVxudmVjMiBMVENfVXYoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGNvbnN0IGZsb2F0IExVVF9TSVpFID0gNjQuMDtcblx0Y29uc3QgZmxvYXQgTFVUX1NDQUxFID0gKCBMVVRfU0laRSAtIDEuMCApIC8gTFVUX1NJWkU7XG5cdGNvbnN0IGZsb2F0IExVVF9CSUFTID0gMC41IC8gTFVUX1NJWkU7XG5cdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggTiwgViApICk7XG5cdHZlYzIgdXYgPSB2ZWMyKCByb3VnaG5lc3MsIHNxcnQoIDEuMCAtIGRvdE5WICkgKTtcblx0dXYgPSB1diAqIExVVF9TQ0FMRSArIExVVF9CSUFTO1xuXHRyZXR1cm4gdXY7XG59XG5mbG9hdCBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgZiApIHtcblx0ZmxvYXQgbCA9IGxlbmd0aCggZiApO1xuXHRyZXR1cm4gbWF4KCAoIGwgKiBsICsgZi56ICkgLyAoIGwgKyAxLjAgKSwgMC4wICk7XG59XG52ZWMzIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyB2MSwgY29uc3QgaW4gdmVjMyB2MiApIHtcblx0ZmxvYXQgeCA9IGRvdCggdjEsIHYyICk7XG5cdGZsb2F0IHkgPSBhYnMoIHggKTtcblx0ZmxvYXQgYSA9IDAuODU0Mzk4NSArICggMC40OTY1MTU1ICsgMC4wMTQ1MjA2ICogeSApICogeTtcblx0ZmxvYXQgYiA9IDMuNDE3NTk0MCArICggNC4xNjE2NzI0ICsgeSApICogeTtcblx0ZmxvYXQgdiA9IGEgLyBiO1xuXHRmbG9hdCB0aGV0YV9zaW50aGV0YSA9ICggeCA+IDAuMCApID8gdiA6IDAuNSAqIGludmVyc2VzcXJ0KCBtYXgoIDEuMCAtIHggKiB4LCAxZS03ICkgKSAtIHY7XG5cdHJldHVybiBjcm9zcyggdjEsIHYyICkgKiB0aGV0YV9zaW50aGV0YTtcbn1cbnZlYzMgTFRDX0V2YWx1YXRlKCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gdmVjMyBQLCBjb25zdCBpbiBtYXQzIG1JbnYsIGNvbnN0IGluIHZlYzMgcmVjdENvb3Jkc1sgNCBdICkge1xuXHR2ZWMzIHYxID0gcmVjdENvb3Jkc1sgMSBdIC0gcmVjdENvb3Jkc1sgMCBdO1xuXHR2ZWMzIHYyID0gcmVjdENvb3Jkc1sgMyBdIC0gcmVjdENvb3Jkc1sgMCBdO1xuXHR2ZWMzIGxpZ2h0Tm9ybWFsID0gY3Jvc3MoIHYxLCB2MiApO1xuXHRpZiggZG90KCBsaWdodE5vcm1hbCwgUCAtIHJlY3RDb29yZHNbIDAgXSApIDwgMC4wICkgcmV0dXJuIHZlYzMoIDAuMCApO1xuXHR2ZWMzIFQxLCBUMjtcblx0VDEgPSBub3JtYWxpemUoIFYgLSBOICogZG90KCBWLCBOICkgKTtcblx0VDIgPSAtIGNyb3NzKCBOLCBUMSApO1xuXHRtYXQzIG1hdCA9IG1JbnYgKiB0cmFuc3Bvc2VNYXQzKCBtYXQzKCBUMSwgVDIsIE4gKSApO1xuXHR2ZWMzIGNvb3Jkc1sgNCBdO1xuXHRjb29yZHNbIDAgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMCBdIC0gUCApO1xuXHRjb29yZHNbIDEgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMSBdIC0gUCApO1xuXHRjb29yZHNbIDIgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMiBdIC0gUCApO1xuXHRjb29yZHNbIDMgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMyBdIC0gUCApO1xuXHRjb29yZHNbIDAgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAwIF0gKTtcblx0Y29vcmRzWyAxIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMSBdICk7XG5cdGNvb3Jkc1sgMiBdID0gbm9ybWFsaXplKCBjb29yZHNbIDIgXSApO1xuXHRjb29yZHNbIDMgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAzIF0gKTtcblx0dmVjMyB2ZWN0b3JGb3JtRmFjdG9yID0gdmVjMyggMC4wICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDAgXSwgY29vcmRzWyAxIF0gKTtcblx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMSBdLCBjb29yZHNbIDIgXSApO1xuXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAyIF0sIGNvb3Jkc1sgMyBdICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDMgXSwgY29vcmRzWyAwIF0gKTtcblx0ZmxvYXQgcmVzdWx0ID0gTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCB2ZWN0b3JGb3JtRmFjdG9yICk7XG5cdHJldHVybiB2ZWMzKCByZXN1bHQgKTtcbn1cbnZlYzMgQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7XG5cdHZlYzIgYnJkZiA9IGludGVncmF0ZVNwZWN1bGFyQlJERiggZG90TlYsIHJvdWdobmVzcyApO1xuXHRyZXR1cm4gc3BlY3VsYXJDb2xvciAqIGJyZGYueCArIGJyZGYueTtcbn1cbnZvaWQgQlJERl9TcGVjdWxhcl9NdWx0aXNjYXR0ZXJpbmdfRW52aXJvbm1lbnQoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBpbm91dCB2ZWMzIHNpbmdsZVNjYXR0ZXIsIGlub3V0IHZlYzMgbXVsdGlTY2F0dGVyICkge1xuXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdHZlYzMgRiA9IEZfU2NobGlja19Sb3VnaG5lc3NEZXBlbmRlbnQoIHNwZWN1bGFyQ29sb3IsIGRvdE5WLCByb3VnaG5lc3MgKTtcblx0dmVjMiBicmRmID0gaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBkb3ROViwgcm91Z2huZXNzICk7XG5cdHZlYzMgRnNzRXNzID0gRiAqIGJyZGYueCArIGJyZGYueTtcblx0ZmxvYXQgRXNzID0gYnJkZi54ICsgYnJkZi55O1xuXHRmbG9hdCBFbXMgPSAxLjAgLSBFc3M7XG5cdHZlYzMgRmF2ZyA9IHNwZWN1bGFyQ29sb3IgKyAoIDEuMCAtIHNwZWN1bGFyQ29sb3IgKSAqIDAuMDQ3NjE5O1x0dmVjMyBGbXMgPSBGc3NFc3MgKiBGYXZnIC8gKCAxLjAgLSBFbXMgKiBGYXZnICk7XG5cdHNpbmdsZVNjYXR0ZXIgKz0gRnNzRXNzO1xuXHRtdWx0aVNjYXR0ZXIgKz0gRm1zICogRW1zO1xufVxuZmxvYXQgR19CbGlublBob25nX0ltcGxpY2l0KCApIHtcblx0cmV0dXJuIDAuMjU7XG59XG5mbG9hdCBEX0JsaW5uUGhvbmcoIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7XG5cdHJldHVybiBSRUNJUFJPQ0FMX1BJICogKCBzaGluaW5lc3MgKiAwLjUgKyAxLjAgKSAqIHBvdyggZG90TkgsIHNoaW5pbmVzcyApO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MgKSB7XG5cdHZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKyBnZW9tZXRyeS52aWV3RGlyICk7XG5cdGZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoYWxmRGlyICkgKTtcblx0ZmxvYXQgZG90TEggPSBzYXR1cmF0ZSggZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRpciApICk7XG5cdHZlYzMgRiA9IEZfU2NobGljayggc3BlY3VsYXJDb2xvciwgdmVjMyggMS4wICksIGRvdExIICk7XG5cdGZsb2F0IEcgPSBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICk7XG5cdGZsb2F0IEQgPSBEX0JsaW5uUGhvbmcoIHNoaW5pbmVzcywgZG90TkggKTtcblx0cmV0dXJuIEYgKiAoIEcgKiBEICk7XG59XG5mbG9hdCBHR1hSb3VnaG5lc3NUb0JsaW5uRXhwb25lbnQoIGNvbnN0IGluIGZsb2F0IGdneFJvdWdobmVzcyApIHtcblx0cmV0dXJuICggMi4wIC8gcG93MiggZ2d4Um91Z2huZXNzICsgMC4wMDAxICkgLSAyLjAgKTtcbn1cbmZsb2F0IEJsaW5uRXhwb25lbnRUb0dHWFJvdWdobmVzcyggY29uc3QgaW4gZmxvYXQgYmxpbm5FeHBvbmVudCApIHtcblx0cmV0dXJuIHNxcnQoIDIuMCAvICggYmxpbm5FeHBvbmVudCArIDIuMCApICk7XG59XG4jaWYgZGVmaW5lZCggVVNFX1NIRUVOIClcbmZsb2F0IERfQ2hhcmxpZShmbG9hdCByb3VnaG5lc3MsIGZsb2F0IE5vSCkge1xuXHRmbG9hdCBpbnZBbHBoYSA9IDEuMCAvIHJvdWdobmVzcztcblx0ZmxvYXQgY29zMmggPSBOb0ggKiBOb0g7XG5cdGZsb2F0IHNpbjJoID0gbWF4KDEuMCAtIGNvczJoLCAwLjAwNzgxMjUpO1x0cmV0dXJuICgyLjAgKyBpbnZBbHBoYSkgKiBwb3coc2luMmgsIGludkFscGhhICogMC41KSAvICgyLjAgKiBQSSk7XG59XG5mbG9hdCBWX05ldWJlbHQoZmxvYXQgTm9WLCBmbG9hdCBOb0wpIHtcblx0cmV0dXJuIHNhdHVyYXRlKDEuMCAvICg0LjAgKiAoTm9MICsgTm9WIC0gTm9MICogTm9WKSkpO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX1NoZWVuKCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIHZlYzMgTCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgdmVjMyBzcGVjdWxhckNvbG9yICkge1xuXHR2ZWMzIE4gPSBnZW9tZXRyeS5ub3JtYWw7XG5cdHZlYzMgViA9IGdlb21ldHJ5LnZpZXdEaXI7XG5cdHZlYzMgSCA9IG5vcm1hbGl6ZSggViArIEwgKTtcblx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBOLCBIICkgKTtcblx0cmV0dXJuIHNwZWN1bGFyQ29sb3IgKiBEX0NoYXJsaWUoIHJvdWdobmVzcywgZG90TkggKSAqIFZfTmV1YmVsdCggZG90KE4sIFYpLCBkb3QoTiwgTCkgKTtcbn1cbiNlbmRpZiIsYnVtcG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0JVTVBNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgYnVtcE1hcDtcblx0dW5pZm9ybSBmbG9hdCBidW1wU2NhbGU7XG5cdHZlYzIgZEhkeHlfZndkKCkge1xuXHRcdHZlYzIgZFNUZHggPSBkRmR4KCB2VXYgKTtcblx0XHR2ZWMyIGRTVGR5ID0gZEZkeSggdlV2ICk7XG5cdFx0ZmxvYXQgSGxsID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKS54O1xuXHRcdGZsb2F0IGRCeCA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHggKS54IC0gSGxsO1xuXHRcdGZsb2F0IGRCeSA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHkgKS54IC0gSGxsO1xuXHRcdHJldHVybiB2ZWMyKCBkQngsIGRCeSApO1xuXHR9XG5cdHZlYzMgcGVydHVyYk5vcm1hbEFyYiggdmVjMyBzdXJmX3BvcywgdmVjMyBzdXJmX25vcm0sIHZlYzIgZEhkeHksIGZsb2F0IGZhY2VEaXJlY3Rpb24gKSB7XG5cdFx0dmVjMyB2U2lnbWFYID0gdmVjMyggZEZkeCggc3VyZl9wb3MueCApLCBkRmR4KCBzdXJmX3Bvcy55ICksIGRGZHgoIHN1cmZfcG9zLnogKSApO1xuXHRcdHZlYzMgdlNpZ21hWSA9IHZlYzMoIGRGZHkoIHN1cmZfcG9zLnggKSwgZEZkeSggc3VyZl9wb3MueSApLCBkRmR5KCBzdXJmX3Bvcy56ICkgKTtcblx0XHR2ZWMzIHZOID0gc3VyZl9ub3JtO1xuXHRcdHZlYzMgUjEgPSBjcm9zcyggdlNpZ21hWSwgdk4gKTtcblx0XHR2ZWMzIFIyID0gY3Jvc3MoIHZOLCB2U2lnbWFYICk7XG5cdFx0ZmxvYXQgZkRldCA9IGRvdCggdlNpZ21hWCwgUjEgKSAqIGZhY2VEaXJlY3Rpb247XG5cdFx0dmVjMyB2R3JhZCA9IHNpZ24oIGZEZXQgKSAqICggZEhkeHkueCAqIFIxICsgZEhkeHkueSAqIFIyICk7XG5cdFx0cmV0dXJuIG5vcm1hbGl6ZSggYWJzKCBmRGV0ICkgKiBzdXJmX25vcm0gLSB2R3JhZCApO1xuXHR9XG4jZW5kaWYiLGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudDoiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXG5cdHZlYzQgcGxhbmU7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkge1xuXHRcdHBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTtcblx0XHRpZiAoIGRvdCggdkNsaXBQb3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgZGlzY2FyZDtcblx0fVxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuXHQjaWYgVU5JT05fQ0xJUFBJTkdfUExBTkVTIDwgTlVNX0NMSVBQSU5HX1BMQU5FU1xuXHRcdGJvb2wgY2xpcHBlZCA9IHRydWU7XG5cdFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxuXHRcdGZvciAoIGludCBpID0gVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpIDwgTlVNX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHtcblx0XHRcdHBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTtcblx0XHRcdGNsaXBwZWQgPSAoIGRvdCggdkNsaXBQb3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgJiYgY2xpcHBlZDtcblx0XHR9XG5cdFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcblx0XHRpZiAoIGNsaXBwZWQgKSBkaXNjYXJkO1xuXHQjZW5kaWZcbiNlbmRpZiIsY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMFxuXHR2YXJ5aW5nIHZlYzMgdkNsaXBQb3NpdGlvbjtcblx0dW5pZm9ybSB2ZWM0IGNsaXBwaW5nUGxhbmVzWyBOVU1fQ0xJUFBJTkdfUExBTkVTIF07XG4jZW5kaWYiLGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleDoiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXG5cdHZhcnlpbmcgdmVjMyB2Q2xpcFBvc2l0aW9uO1xuI2VuZGlmIixjbGlwcGluZ19wbGFuZXNfdmVydGV4OiIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcblx0dkNsaXBQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XG4jZW5kaWYiLGNvbG9yX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBIClcblx0ZGlmZnVzZUNvbG9yICo9IHZDb2xvcjtcbiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApXG5cdGRpZmZ1c2VDb2xvci5yZ2IgKj0gdkNvbG9yO1xuI2VuZGlmIixjb2xvcl9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBIClcblx0dmFyeWluZyB2ZWM0IHZDb2xvcjtcbiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApXG5cdHZhcnlpbmcgdmVjMyB2Q29sb3I7XG4jZW5kaWYiLGNvbG9yX3BhcnNfdmVydGV4OiIjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBIClcblx0dmFyeWluZyB2ZWM0IHZDb2xvcjtcbiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApIHx8IGRlZmluZWQoIFVTRV9JTlNUQU5DSU5HX0NPTE9SIClcblx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcbiNlbmRpZiIsY29sb3JfdmVydGV4OiIjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBIClcblx0dkNvbG9yID0gdmVjNCggMS4wICk7XG4jZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKSB8fCBkZWZpbmVkKCBVU0VfSU5TVEFOQ0lOR19DT0xPUiApXG5cdHZDb2xvciA9IHZlYzMoIDEuMCApO1xuI2VuZGlmXG4jaWZkZWYgVVNFX0NPTE9SXG5cdHZDb2xvciAqPSBjb2xvcjtcbiNlbmRpZlxuI2lmZGVmIFVTRV9JTlNUQU5DSU5HX0NPTE9SXG5cdHZDb2xvci54eXogKj0gaW5zdGFuY2VDb2xvci54eXo7XG4jZW5kaWYiLGNvbW1vbjoiI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5M1xuI2RlZmluZSBQSTIgNi4yODMxODUzMDcxNzk1ODZcbiNkZWZpbmUgUElfSEFMRiAxLjU3MDc5NjMyNjc5NDg5NjZcbiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NjE4Mzc5MDdcbiNkZWZpbmUgUkVDSVBST0NBTF9QSTIgMC4xNTkxNTQ5NDMwOTE4OTUzNVxuI2RlZmluZSBFUFNJTE9OIDFlLTZcbiNpZm5kZWYgc2F0dXJhdGVcbiNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcbiNlbmRpZlxuI2RlZmluZSB3aGl0ZUNvbXBsZW1lbnQoYSkgKCAxLjAgLSBzYXR1cmF0ZSggYSApIClcbmZsb2F0IHBvdzIoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4Kng7IH1cbmZsb2F0IHBvdzMoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4KngqeDsgfVxuZmxvYXQgcG93NCggY29uc3QgaW4gZmxvYXQgeCApIHsgZmxvYXQgeDIgPSB4Kng7IHJldHVybiB4Mip4MjsgfVxuZmxvYXQgYXZlcmFnZSggY29uc3QgaW4gdmVjMyBjb2xvciApIHsgcmV0dXJuIGRvdCggY29sb3IsIHZlYzMoIDAuMzMzMyApICk7IH1cbmhpZ2hwIGZsb2F0IHJhbmQoIGNvbnN0IGluIHZlYzIgdXYgKSB7XG5cdGNvbnN0IGhpZ2hwIGZsb2F0IGEgPSAxMi45ODk4LCBiID0gNzguMjMzLCBjID0gNDM3NTguNTQ1Mztcblx0aGlnaHAgZmxvYXQgZHQgPSBkb3QoIHV2Lnh5LCB2ZWMyKCBhLGIgKSApLCBzbiA9IG1vZCggZHQsIFBJICk7XG5cdHJldHVybiBmcmFjdChzaW4oc24pICogYyk7XG59XG4jaWZkZWYgSElHSF9QUkVDSVNJT05cblx0ZmxvYXQgcHJlY2lzaW9uU2FmZUxlbmd0aCggdmVjMyB2ICkgeyByZXR1cm4gbGVuZ3RoKCB2ICk7IH1cbiNlbHNlXG5cdGZsb2F0IG1heDMoIHZlYzMgdiApIHsgcmV0dXJuIG1heCggbWF4KCB2LngsIHYueSApLCB2LnogKTsgfVxuXHRmbG9hdCBwcmVjaXNpb25TYWZlTGVuZ3RoKCB2ZWMzIHYgKSB7XG5cdFx0ZmxvYXQgbWF4Q29tcG9uZW50ID0gbWF4MyggYWJzKCB2ICkgKTtcblx0XHRyZXR1cm4gbGVuZ3RoKCB2IC8gbWF4Q29tcG9uZW50ICkgKiBtYXhDb21wb25lbnQ7XG5cdH1cbiNlbmRpZlxuc3RydWN0IEluY2lkZW50TGlnaHQge1xuXHR2ZWMzIGNvbG9yO1xuXHR2ZWMzIGRpcmVjdGlvbjtcblx0Ym9vbCB2aXNpYmxlO1xufTtcbnN0cnVjdCBSZWZsZWN0ZWRMaWdodCB7XG5cdHZlYzMgZGlyZWN0RGlmZnVzZTtcblx0dmVjMyBkaXJlY3RTcGVjdWxhcjtcblx0dmVjMyBpbmRpcmVjdERpZmZ1c2U7XG5cdHZlYzMgaW5kaXJlY3RTcGVjdWxhcjtcbn07XG5zdHJ1Y3QgR2VvbWV0cmljQ29udGV4dCB7XG5cdHZlYzMgcG9zaXRpb247XG5cdHZlYzMgbm9ybWFsO1xuXHR2ZWMzIHZpZXdEaXI7XG4jaWZkZWYgQ0xFQVJDT0FUXG5cdHZlYzMgY2xlYXJjb2F0Tm9ybWFsO1xuI2VuZGlmXG59O1xudmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcblx0cmV0dXJuIG5vcm1hbGl6ZSggKCBtYXRyaXggKiB2ZWM0KCBkaXIsIDAuMCApICkueHl6ICk7XG59XG52ZWMzIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcblx0cmV0dXJuIG5vcm1hbGl6ZSggKCB2ZWM0KCBkaXIsIDAuMCApICogbWF0cml4ICkueHl6ICk7XG59XG52ZWMzIHByb2plY3RPblBsYW5lKGluIHZlYzMgcG9pbnQsIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xuXHRmbG9hdCBkaXN0YW5jZSA9IGRvdCggcGxhbmVOb3JtYWwsIHBvaW50IC0gcG9pbnRPblBsYW5lICk7XG5cdHJldHVybiAtIGRpc3RhbmNlICogcGxhbmVOb3JtYWwgKyBwb2ludDtcbn1cbmZsb2F0IHNpZGVPZlBsYW5lKCBpbiB2ZWMzIHBvaW50LCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcblx0cmV0dXJuIHNpZ24oIGRvdCggcG9pbnQgLSBwb2ludE9uUGxhbmUsIHBsYW5lTm9ybWFsICkgKTtcbn1cbnZlYzMgbGluZVBsYW5lSW50ZXJzZWN0KCBpbiB2ZWMzIHBvaW50T25MaW5lLCBpbiB2ZWMzIGxpbmVEaXJlY3Rpb24sIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xuXHRyZXR1cm4gbGluZURpcmVjdGlvbiAqICggZG90KCBwbGFuZU5vcm1hbCwgcG9pbnRPblBsYW5lIC0gcG9pbnRPbkxpbmUgKSAvIGRvdCggcGxhbmVOb3JtYWwsIGxpbmVEaXJlY3Rpb24gKSApICsgcG9pbnRPbkxpbmU7XG59XG5tYXQzIHRyYW5zcG9zZU1hdDMoIGNvbnN0IGluIG1hdDMgbSApIHtcblx0bWF0MyB0bXA7XG5cdHRtcFsgMCBdID0gdmVjMyggbVsgMCBdLngsIG1bIDEgXS54LCBtWyAyIF0ueCApO1xuXHR0bXBbIDEgXSA9IHZlYzMoIG1bIDAgXS55LCBtWyAxIF0ueSwgbVsgMiBdLnkgKTtcblx0dG1wWyAyIF0gPSB2ZWMzKCBtWyAwIF0ueiwgbVsgMSBdLnosIG1bIDIgXS56ICk7XG5cdHJldHVybiB0bXA7XG59XG5mbG9hdCBsaW5lYXJUb1JlbGF0aXZlTHVtaW5hbmNlKCBjb25zdCBpbiB2ZWMzIGNvbG9yICkge1xuXHR2ZWMzIHdlaWdodHMgPSB2ZWMzKCAwLjIxMjYsIDAuNzE1MiwgMC4wNzIyICk7XG5cdHJldHVybiBkb3QoIHdlaWdodHMsIGNvbG9yLnJnYiApO1xufVxuYm9vbCBpc1BlcnNwZWN0aXZlTWF0cml4KCBtYXQ0IG0gKSB7XG5cdHJldHVybiBtWyAyIF1bIDMgXSA9PSAtIDEuMDtcbn1cbnZlYzIgZXF1aXJlY3RVdiggaW4gdmVjMyBkaXIgKSB7XG5cdGZsb2F0IHUgPSBhdGFuKCBkaXIueiwgZGlyLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xuXHRmbG9hdCB2ID0gYXNpbiggY2xhbXAoIGRpci55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdHJldHVybiB2ZWMyKCB1LCB2ICk7XG59IixjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ6IiNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWXG5cdCNkZWZpbmUgY3ViZVVWX21heE1pcExldmVsIDguMFxuXHQjZGVmaW5lIGN1YmVVVl9taW5NaXBMZXZlbCA0LjBcblx0I2RlZmluZSBjdWJlVVZfbWF4VGlsZVNpemUgMjU2LjBcblx0I2RlZmluZSBjdWJlVVZfbWluVGlsZVNpemUgMTYuMFxuXHRmbG9hdCBnZXRGYWNlKCB2ZWMzIGRpcmVjdGlvbiApIHtcblx0XHR2ZWMzIGFic0RpcmVjdGlvbiA9IGFicyggZGlyZWN0aW9uICk7XG5cdFx0ZmxvYXQgZmFjZSA9IC0gMS4wO1xuXHRcdGlmICggYWJzRGlyZWN0aW9uLnggPiBhYnNEaXJlY3Rpb24ueiApIHtcblx0XHRcdGlmICggYWJzRGlyZWN0aW9uLnggPiBhYnNEaXJlY3Rpb24ueSApXG5cdFx0XHRcdGZhY2UgPSBkaXJlY3Rpb24ueCA+IDAuMCA/IDAuMCA6IDMuMDtcblx0XHRcdGVsc2Vcblx0XHRcdFx0ZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMS4wIDogNC4wO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIGFic0RpcmVjdGlvbi56ID4gYWJzRGlyZWN0aW9uLnkgKVxuXHRcdFx0XHRmYWNlID0gZGlyZWN0aW9uLnogPiAwLjAgPyAyLjAgOiA1LjA7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdGZhY2UgPSBkaXJlY3Rpb24ueSA+IDAuMCA/IDEuMCA6IDQuMDtcblx0XHR9XG5cdFx0cmV0dXJuIGZhY2U7XG5cdH1cblx0dmVjMiBnZXRVViggdmVjMyBkaXJlY3Rpb24sIGZsb2F0IGZhY2UgKSB7XG5cdFx0dmVjMiB1djtcblx0XHRpZiAoIGZhY2UgPT0gMC4wICkge1xuXHRcdFx0dXYgPSB2ZWMyKCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnggKTtcblx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDEuMCApIHtcblx0XHRcdHV2ID0gdmVjMiggLSBkaXJlY3Rpb24ueCwgLSBkaXJlY3Rpb24ueiApIC8gYWJzKCBkaXJlY3Rpb24ueSApO1xuXHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMi4wICkge1xuXHRcdFx0dXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueiApO1xuXHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMy4wICkge1xuXHRcdFx0dXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueCApO1xuXHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gNC4wICkge1xuXHRcdFx0dXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueiApIC8gYWJzKCBkaXJlY3Rpb24ueSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR1diA9IHZlYzIoIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueiApO1xuXHRcdH1cblx0XHRyZXR1cm4gMC41ICogKCB1diArIDEuMCApO1xuXHR9XG5cdHZlYzMgYmlsaW5lYXJDdWJlVVYoIHNhbXBsZXIyRCBlbnZNYXAsIHZlYzMgZGlyZWN0aW9uLCBmbG9hdCBtaXBJbnQgKSB7XG5cdFx0ZmxvYXQgZmFjZSA9IGdldEZhY2UoIGRpcmVjdGlvbiApO1xuXHRcdGZsb2F0IGZpbHRlckludCA9IG1heCggY3ViZVVWX21pbk1pcExldmVsIC0gbWlwSW50LCAwLjAgKTtcblx0XHRtaXBJbnQgPSBtYXgoIG1pcEludCwgY3ViZVVWX21pbk1pcExldmVsICk7XG5cdFx0ZmxvYXQgZmFjZVNpemUgPSBleHAyKCBtaXBJbnQgKTtcblx0XHRmbG9hdCB0ZXhlbFNpemUgPSAxLjAgLyAoIDMuMCAqIGN1YmVVVl9tYXhUaWxlU2l6ZSApO1xuXHRcdHZlYzIgdXYgPSBnZXRVViggZGlyZWN0aW9uLCBmYWNlICkgKiAoIGZhY2VTaXplIC0gMS4wICk7XG5cdFx0dmVjMiBmID0gZnJhY3QoIHV2ICk7XG5cdFx0dXYgKz0gMC41IC0gZjtcblx0XHRpZiAoIGZhY2UgPiAyLjAgKSB7XG5cdFx0XHR1di55ICs9IGZhY2VTaXplO1xuXHRcdFx0ZmFjZSAtPSAzLjA7XG5cdFx0fVxuXHRcdHV2LnggKz0gZmFjZSAqIGZhY2VTaXplO1xuXHRcdGlmICggbWlwSW50IDwgY3ViZVVWX21heE1pcExldmVsICkge1xuXHRcdFx0dXYueSArPSAyLjAgKiBjdWJlVVZfbWF4VGlsZVNpemU7XG5cdFx0fVxuXHRcdHV2LnkgKz0gZmlsdGVySW50ICogMi4wICogY3ViZVVWX21pblRpbGVTaXplO1xuXHRcdHV2LnggKz0gMy4wICogbWF4KCAwLjAsIGN1YmVVVl9tYXhUaWxlU2l6ZSAtIDIuMCAqIGZhY2VTaXplICk7XG5cdFx0dXYgKj0gdGV4ZWxTaXplO1xuXHRcdHZlYzMgdGwgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCB0ZXh0dXJlMkQoIGVudk1hcCwgdXYgKSApLnJnYjtcblx0XHR1di54ICs9IHRleGVsU2l6ZTtcblx0XHR2ZWMzIHRyID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEKCBlbnZNYXAsIHV2ICkgKS5yZ2I7XG5cdFx0dXYueSArPSB0ZXhlbFNpemU7XG5cdFx0dmVjMyBiciA9IGVudk1hcFRleGVsVG9MaW5lYXIoIHRleHR1cmUyRCggZW52TWFwLCB1diApICkucmdiO1xuXHRcdHV2LnggLT0gdGV4ZWxTaXplO1xuXHRcdHZlYzMgYmwgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCB0ZXh0dXJlMkQoIGVudk1hcCwgdXYgKSApLnJnYjtcblx0XHR2ZWMzIHRtID0gbWl4KCB0bCwgdHIsIGYueCApO1xuXHRcdHZlYzMgYm0gPSBtaXgoIGJsLCBiciwgZi54ICk7XG5cdFx0cmV0dXJuIG1peCggdG0sIGJtLCBmLnkgKTtcblx0fVxuXHQjZGVmaW5lIHIwIDEuMFxuXHQjZGVmaW5lIHYwIDAuMzM5XG5cdCNkZWZpbmUgbTAgLSAyLjBcblx0I2RlZmluZSByMSAwLjhcblx0I2RlZmluZSB2MSAwLjI3NlxuXHQjZGVmaW5lIG0xIC0gMS4wXG5cdCNkZWZpbmUgcjQgMC40XG5cdCNkZWZpbmUgdjQgMC4wNDZcblx0I2RlZmluZSBtNCAyLjBcblx0I2RlZmluZSByNSAwLjMwNVxuXHQjZGVmaW5lIHY1IDAuMDE2XG5cdCNkZWZpbmUgbTUgMy4wXG5cdCNkZWZpbmUgcjYgMC4yMVxuXHQjZGVmaW5lIHY2IDAuMDAzOFxuXHQjZGVmaW5lIG02IDQuMFxuXHRmbG9hdCByb3VnaG5lc3NUb01pcCggZmxvYXQgcm91Z2huZXNzICkge1xuXHRcdGZsb2F0IG1pcCA9IDAuMDtcblx0XHRpZiAoIHJvdWdobmVzcyA+PSByMSApIHtcblx0XHRcdG1pcCA9ICggcjAgLSByb3VnaG5lc3MgKSAqICggbTEgLSBtMCApIC8gKCByMCAtIHIxICkgKyBtMDtcblx0XHR9IGVsc2UgaWYgKCByb3VnaG5lc3MgPj0gcjQgKSB7XG5cdFx0XHRtaXAgPSAoIHIxIC0gcm91Z2huZXNzICkgKiAoIG00IC0gbTEgKSAvICggcjEgLSByNCApICsgbTE7XG5cdFx0fSBlbHNlIGlmICggcm91Z2huZXNzID49IHI1ICkge1xuXHRcdFx0bWlwID0gKCByNCAtIHJvdWdobmVzcyApICogKCBtNSAtIG00ICkgLyAoIHI0IC0gcjUgKSArIG00O1xuXHRcdH0gZWxzZSBpZiAoIHJvdWdobmVzcyA+PSByNiApIHtcblx0XHRcdG1pcCA9ICggcjUgLSByb3VnaG5lc3MgKSAqICggbTYgLSBtNSApIC8gKCByNSAtIHI2ICkgKyBtNTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWlwID0gLSAyLjAgKiBsb2cyKCAxLjE2ICogcm91Z2huZXNzICk7XHRcdH1cblx0XHRyZXR1cm4gbWlwO1xuXHR9XG5cdHZlYzQgdGV4dHVyZUN1YmVVViggc2FtcGxlcjJEIGVudk1hcCwgdmVjMyBzYW1wbGVEaXIsIGZsb2F0IHJvdWdobmVzcyApIHtcblx0XHRmbG9hdCBtaXAgPSBjbGFtcCggcm91Z2huZXNzVG9NaXAoIHJvdWdobmVzcyApLCBtMCwgY3ViZVVWX21heE1pcExldmVsICk7XG5cdFx0ZmxvYXQgbWlwRiA9IGZyYWN0KCBtaXAgKTtcblx0XHRmbG9hdCBtaXBJbnQgPSBmbG9vciggbWlwICk7XG5cdFx0dmVjMyBjb2xvcjAgPSBiaWxpbmVhckN1YmVVViggZW52TWFwLCBzYW1wbGVEaXIsIG1pcEludCApO1xuXHRcdGlmICggbWlwRiA9PSAwLjAgKSB7XG5cdFx0XHRyZXR1cm4gdmVjNCggY29sb3IwLCAxLjAgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmVjMyBjb2xvcjEgPSBiaWxpbmVhckN1YmVVViggZW52TWFwLCBzYW1wbGVEaXIsIG1pcEludCArIDEuMCApO1xuXHRcdFx0cmV0dXJuIHZlYzQoIG1peCggY29sb3IwLCBjb2xvcjEsIG1pcEYgKSwgMS4wICk7XG5cdFx0fVxuXHR9XG4jZW5kaWYiLGRlZmF1bHRub3JtYWxfdmVydGV4OiJ2ZWMzIHRyYW5zZm9ybWVkTm9ybWFsID0gb2JqZWN0Tm9ybWFsO1xuI2lmZGVmIFVTRV9JTlNUQU5DSU5HXG5cdG1hdDMgbSA9IG1hdDMoIGluc3RhbmNlTWF0cml4ICk7XG5cdHRyYW5zZm9ybWVkTm9ybWFsIC89IHZlYzMoIGRvdCggbVsgMCBdLCBtWyAwIF0gKSwgZG90KCBtWyAxIF0sIG1bIDEgXSApLCBkb3QoIG1bIDIgXSwgbVsgMiBdICkgKTtcblx0dHJhbnNmb3JtZWROb3JtYWwgPSBtICogdHJhbnNmb3JtZWROb3JtYWw7XG4jZW5kaWZcbnRyYW5zZm9ybWVkTm9ybWFsID0gbm9ybWFsTWF0cml4ICogdHJhbnNmb3JtZWROb3JtYWw7XG4jaWZkZWYgRkxJUF9TSURFRFxuXHR0cmFuc2Zvcm1lZE5vcm1hbCA9IC0gdHJhbnNmb3JtZWROb3JtYWw7XG4jZW5kaWZcbiNpZmRlZiBVU0VfVEFOR0VOVFxuXHR2ZWMzIHRyYW5zZm9ybWVkVGFuZ2VudCA9ICggbW9kZWxWaWV3TWF0cml4ICogdmVjNCggb2JqZWN0VGFuZ2VudCwgMC4wICkgKS54eXo7XG5cdCNpZmRlZiBGTElQX1NJREVEXG5cdFx0dHJhbnNmb3JtZWRUYW5nZW50ID0gLSB0cmFuc2Zvcm1lZFRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmIixkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGRpc3BsYWNlbWVudE1hcDtcblx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRTY2FsZTtcblx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRCaWFzO1xuI2VuZGlmIixkaXNwbGFjZW1lbnRtYXBfdmVydGV4OiIjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHR0cmFuc2Zvcm1lZCArPSBub3JtYWxpemUoIG9iamVjdE5vcm1hbCApICogKCB0ZXh0dXJlMkQoIGRpc3BsYWNlbWVudE1hcCwgdlV2ICkueCAqIGRpc3BsYWNlbWVudFNjYWxlICsgZGlzcGxhY2VtZW50QmlhcyApO1xuI2VuZGlmIixlbWlzc2l2ZW1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxuXHR2ZWM0IGVtaXNzaXZlQ29sb3IgPSB0ZXh0dXJlMkQoIGVtaXNzaXZlTWFwLCB2VXYgKTtcblx0ZW1pc3NpdmVDb2xvci5yZ2IgPSBlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXIoIGVtaXNzaXZlQ29sb3IgKS5yZ2I7XG5cdHRvdGFsRW1pc3NpdmVSYWRpYW5jZSAqPSBlbWlzc2l2ZUNvbG9yLnJnYjtcbiNlbmRpZiIsZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBlbWlzc2l2ZU1hcDtcbiNlbmRpZiIsZW5jb2RpbmdzX2ZyYWdtZW50OiJnbF9GcmFnQ29sb3IgPSBsaW5lYXJUb091dHB1dFRleGVsKCBnbF9GcmFnQ29sb3IgKTsiLGVuY29kaW5nc19wYXJzX2ZyYWdtZW50OiJcbnZlYzQgTGluZWFyVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2YWx1ZTtcbn1cbnZlYzQgR2FtbWFUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XG5cdHJldHVybiB2ZWM0KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggZ2FtbWFGYWN0b3IgKSApLCB2YWx1ZS5hICk7XG59XG52ZWM0IExpbmVhclRvR2FtbWEoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IGdhbW1hRmFjdG9yICkge1xuXHRyZXR1cm4gdmVjNCggcG93KCB2YWx1ZS5yZ2IsIHZlYzMoIDEuMCAvIGdhbW1hRmFjdG9yICkgKSwgdmFsdWUuYSApO1xufVxudmVjNCBzUkdCVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiICogMC45NDc4NjcyOTg2ICsgdmVjMyggMC4wNTIxMzI3MDE0ICksIHZlYzMoIDIuNCApICksIHZhbHVlLnJnYiAqIDAuMDc3Mzk5MzgwOCwgdmVjMyggbGVzc1RoYW5FcXVhbCggdmFsdWUucmdiLCB2ZWMzKCAwLjA0MDQ1ICkgKSApICksIHZhbHVlLmEgKTtcbn1cbnZlYzQgTGluZWFyVG9zUkdCKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMC40MTY2NiApICkgKiAxLjA1NSAtIHZlYzMoIDAuMDU1ICksIHZhbHVlLnJnYiAqIDEyLjkyLCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDAzMTMwOCApICkgKSApLCB2YWx1ZS5hICk7XG59XG52ZWM0IFJHQkVUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqIGV4cDIoIHZhbHVlLmEgKiAyNTUuMCAtIDEyOC4wICksIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQkUoIGluIHZlYzQgdmFsdWUgKSB7XG5cdGZsb2F0IG1heENvbXBvbmVudCA9IG1heCggbWF4KCB2YWx1ZS5yLCB2YWx1ZS5nICksIHZhbHVlLmIgKTtcblx0ZmxvYXQgZkV4cCA9IGNsYW1wKCBjZWlsKCBsb2cyKCBtYXhDb21wb25lbnQgKSApLCAtMTI4LjAsIDEyNy4wICk7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgLyBleHAyKCBmRXhwICksICggZkV4cCArIDEyOC4wICkgLyAyNTUuMCApO1xufVxudmVjNCBSR0JNVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogdmFsdWUuYSAqIG1heFJhbmdlLCAxLjAgKTtcbn1cbnZlYzQgTGluZWFyVG9SR0JNKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcblx0ZmxvYXQgbWF4UkdCID0gbWF4KCB2YWx1ZS5yLCBtYXgoIHZhbHVlLmcsIHZhbHVlLmIgKSApO1xuXHRmbG9hdCBNID0gY2xhbXAoIG1heFJHQiAvIG1heFJhbmdlLCAwLjAsIDEuMCApO1xuXHRNID0gY2VpbCggTSAqIDI1NS4wICkgLyAyNTUuMDtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvICggTSAqIG1heFJhbmdlICksIE0gKTtcbn1cbnZlYzQgUkdCRFRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICggKCBtYXhSYW5nZSAvIDI1NS4wICkgLyB2YWx1ZS5hICksIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQkQoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRmbG9hdCBtYXhSR0IgPSBtYXgoIHZhbHVlLnIsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XG5cdGZsb2F0IEQgPSBtYXgoIG1heFJhbmdlIC8gbWF4UkdCLCAxLjAgKTtcblx0RCA9IGNsYW1wKCBmbG9vciggRCApIC8gMjU1LjAsIDAuMCwgMS4wICk7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiAoIEQgKiAoIDI1NS4wIC8gbWF4UmFuZ2UgKSApLCBEICk7XG59XG5jb25zdCBtYXQzIGNMb2dMdXZNID0gbWF0MyggMC4yMjA5LCAwLjMzOTAsIDAuNDE4NCwgMC4xMTM4LCAwLjY3ODAsIDAuNzMxOSwgMC4wMTAyLCAwLjExMzAsIDAuMjk2OSApO1xudmVjNCBMaW5lYXJUb0xvZ0x1diggaW4gdmVjNCB2YWx1ZSApIHtcblx0dmVjMyBYcF9ZX1hZWnAgPSBjTG9nTHV2TSAqIHZhbHVlLnJnYjtcblx0WHBfWV9YWVpwID0gbWF4KCBYcF9ZX1hZWnAsIHZlYzMoIDFlLTYsIDFlLTYsIDFlLTYgKSApO1xuXHR2ZWM0IHZSZXN1bHQ7XG5cdHZSZXN1bHQueHkgPSBYcF9ZX1hZWnAueHkgLyBYcF9ZX1hZWnAuejtcblx0ZmxvYXQgTGUgPSAyLjAgKiBsb2cyKFhwX1lfWFlacC55KSArIDEyNy4wO1xuXHR2UmVzdWx0LncgPSBmcmFjdCggTGUgKTtcblx0dlJlc3VsdC56ID0gKCBMZSAtICggZmxvb3IoIHZSZXN1bHQudyAqIDI1NS4wICkgKSAvIDI1NS4wICkgLyAyNTUuMDtcblx0cmV0dXJuIHZSZXN1bHQ7XG59XG5jb25zdCBtYXQzIGNMb2dMdXZJbnZlcnNlTSA9IG1hdDMoIDYuMDAxNCwgLTIuNzAwOCwgLTEuNzk5NiwgLTEuMzMyMCwgMy4xMDI5LCAtNS43NzIxLCAwLjMwMDgsIC0xLjA4ODIsIDUuNjI2OCApO1xudmVjNCBMb2dMdXZUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0ZmxvYXQgTGUgPSB2YWx1ZS56ICogMjU1LjAgKyB2YWx1ZS53O1xuXHR2ZWMzIFhwX1lfWFlacDtcblx0WHBfWV9YWVpwLnkgPSBleHAyKCAoIExlIC0gMTI3LjAgKSAvIDIuMCApO1xuXHRYcF9ZX1hZWnAueiA9IFhwX1lfWFlacC55IC8gdmFsdWUueTtcblx0WHBfWV9YWVpwLnggPSB2YWx1ZS54ICogWHBfWV9YWVpwLno7XG5cdHZlYzMgdlJHQiA9IGNMb2dMdXZJbnZlcnNlTSAqIFhwX1lfWFlacC5yZ2I7XG5cdHJldHVybiB2ZWM0KCBtYXgoIHZSR0IsIDAuMCApLCAxLjAgKTtcbn0iLGVudm1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdHZlYzMgY2FtZXJhVG9GcmFnO1xuXHRcdGlmICggaXNPcnRob2dyYXBoaWMgKSB7XG5cdFx0XHRjYW1lcmFUb0ZyYWcgPSBub3JtYWxpemUoIHZlYzMoIC0gdmlld01hdHJpeFsgMCBdWyAyIF0sIC0gdmlld01hdHJpeFsgMSBdWyAyIF0sIC0gdmlld01hdHJpeFsgMiBdWyAyIF0gKSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjYW1lcmFUb0ZyYWcgPSBub3JtYWxpemUoIHZXb3JsZFBvc2l0aW9uIC0gY2FtZXJhUG9zaXRpb24gKTtcblx0XHR9XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0XHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCBjYW1lcmFUb0ZyYWcsIHdvcmxkTm9ybWFsICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZnJhY3QoIGNhbWVyYVRvRnJhZywgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xuXHRcdCNlbmRpZlxuXHQjZWxzZVxuXHRcdHZlYzMgcmVmbGVjdFZlYyA9IHZSZWZsZWN0O1xuXHQjZW5kaWZcblx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHR2ZWM0IGVudkNvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxuXHRcdHZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIHJlZmxlY3RWZWMsIDAuMCApO1xuXHQjZWxzZVxuXHRcdHZlYzQgZW52Q29sb3IgPSB2ZWM0KCAwLjAgKTtcblx0I2VuZGlmXG5cdCNpZm5kZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVlxuXHRcdGVudkNvbG9yID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52Q29sb3IgKTtcblx0I2VuZGlmXG5cdCNpZmRlZiBFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFlcblx0XHRvdXRnb2luZ0xpZ2h0ID0gbWl4KCBvdXRnb2luZ0xpZ2h0LCBvdXRnb2luZ0xpZ2h0ICogZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19NSVggKVxuXHRcdG91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfQkxFTkRJTkdfQUREIClcblx0XHRvdXRnb2luZ0xpZ2h0ICs9IGVudkNvbG9yLnh5eiAqIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHk7XG5cdCNlbmRpZlxuI2VuZGlmIixlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdHVuaWZvcm0gZmxvYXQgZW52TWFwSW50ZW5zaXR5O1xuXHR1bmlmb3JtIGZsb2F0IGZsaXBFbnZNYXA7XG5cdHVuaWZvcm0gaW50IG1heE1pcExldmVsO1xuXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxuXHRcdHVuaWZvcm0gc2FtcGxlckN1YmUgZW52TWFwO1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDtcblx0I2VuZGlmXG5cdFxuI2VuZGlmIixlbnZtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0dW5pZm9ybSBmbG9hdCByZWZsZWN0aXZpdHk7XG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApXG5cdFx0I2RlZmluZSBFTlZfV09STERQT1Ncblx0I2VuZGlmXG5cdCNpZmRlZiBFTlZfV09STERQT1Ncblx0XHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbHNlXG5cdFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xuXHQjZW5kaWZcbiNlbmRpZiIsZW52bWFwX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX0VOVk1BUFxuXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHxkZWZpbmVkKCBQSE9ORyApXG5cdFx0I2RlZmluZSBFTlZfV09STERQT1Ncblx0I2VuZGlmXG5cdCNpZmRlZiBFTlZfV09STERQT1Ncblx0XHRcblx0XHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG5cdCNlbHNlXG5cdFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xuXHRcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xuXHQjZW5kaWZcbiNlbmRpZiIsZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQIClcblx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRlJBQ1RJT05cblx0XHR1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbztcblx0I2VuZGlmXG5cdHZlYzMgZ2V0TGlnaHRQcm9iZUluZGlyZWN0SXJyYWRpYW5jZSggY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gaW50IG1heE1JUExldmVsICkge1xuXHRcdHZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBnZW9tZXRyeS5ub3JtYWwsIHZpZXdNYXRyaXggKTtcblx0XHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxuXHRcdFx0dmVjMyBxdWVyeVZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiB3b3JsZE5vcm1hbC54LCB3b3JsZE5vcm1hbC55eiApO1xuXHRcdFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVMb2RFWFQoIGVudk1hcCwgcXVlcnlWZWMsIGZsb2F0KCBtYXhNSVBMZXZlbCApICk7XG5cdFx0XHQjZWxzZVxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgcXVlcnlWZWMsIGZsb2F0KCBtYXhNSVBMZXZlbCApICk7XG5cdFx0XHQjZW5kaWZcblx0XHRcdGVudk1hcENvbG9yLnJnYiA9IGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxuXHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlVVYoIGVudk1hcCwgd29ybGROb3JtYWwsIDEuMCApO1xuXHRcdCNlbHNlXG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdmVjNCggMC4wICk7XG5cdFx0I2VuZGlmXG5cdFx0cmV0dXJuIFBJICogZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xuXHR9XG5cdGZsb2F0IGdldFNwZWN1bGFyTUlQTGV2ZWwoIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gaW50IG1heE1JUExldmVsICkge1xuXHRcdGZsb2F0IG1heE1JUExldmVsU2NhbGFyID0gZmxvYXQoIG1heE1JUExldmVsICk7XG5cdFx0ZmxvYXQgc2lnbWEgPSBQSSAqIHJvdWdobmVzcyAqIHJvdWdobmVzcyAvICggMS4wICsgcm91Z2huZXNzICk7XG5cdFx0ZmxvYXQgZGVzaXJlZE1JUExldmVsID0gbWF4TUlQTGV2ZWxTY2FsYXIgKyBsb2cyKCBzaWdtYSApO1xuXHRcdHJldHVybiBjbGFtcCggZGVzaXJlZE1JUExldmVsLCAwLjAsIG1heE1JUExldmVsU2NhbGFyICk7XG5cdH1cblx0dmVjMyBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XG5cdFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cblx0XHRcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZmxlY3QoIC12aWV3RGlyLCBub3JtYWwgKTtcblx0XHRcdHJlZmxlY3RWZWMgPSBub3JtYWxpemUoIG1peCggcmVmbGVjdFZlYywgbm9ybWFsLCByb3VnaG5lc3MgKiByb3VnaG5lc3MpICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZnJhY3QoIC12aWV3RGlyLCBub3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xuXHRcdCNlbmRpZlxuXHRcdHJlZmxlY3RWZWMgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCByZWZsZWN0VmVjLCB2aWV3TWF0cml4ICk7XG5cdFx0ZmxvYXQgc3BlY3VsYXJNSVBMZXZlbCA9IGdldFNwZWN1bGFyTUlQTGV2ZWwoIHJvdWdobmVzcywgbWF4TUlQTGV2ZWwgKTtcblx0XHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxuXHRcdFx0dmVjMyBxdWVyeVJlZmxlY3RWZWMgPSB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICk7XG5cdFx0XHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZUxvZEVYVCggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcblx0XHRcdCNlbHNlXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcblx0XHRcdCNlbmRpZlxuXHRcdFx0ZW52TWFwQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XG5cdFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVViggZW52TWFwLCByZWZsZWN0VmVjLCByb3VnaG5lc3MgKTtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xuXHR9XG4jZW5kaWYiLGVudm1hcF92ZXJ0ZXg6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpZmRlZiBFTlZfV09STERQT1Ncblx0XHR2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6O1xuXHQjZWxzZVxuXHRcdHZlYzMgY2FtZXJhVG9WZXJ0ZXg7XG5cdFx0aWYgKCBpc09ydGhvZ3JhcGhpYyApIHtcblx0XHRcdGNhbWVyYVRvVmVydGV4ID0gbm9ybWFsaXplKCB2ZWMzKCAtIHZpZXdNYXRyaXhbIDAgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDEgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDIgXVsgMiBdICkgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y2FtZXJhVG9WZXJ0ZXggPSBub3JtYWxpemUoIHdvcmxkUG9zaXRpb24ueHl6IC0gY2FtZXJhUG9zaXRpb24gKTtcblx0XHR9XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cblx0XHRcdHZSZWZsZWN0ID0gcmVmbGVjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZSZWZsZWN0ID0gcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZcblx0I2VuZGlmXG4jZW5kaWYiLGZvZ192ZXJ0ZXg6IiNpZmRlZiBVU0VfRk9HXG5cdGZvZ0RlcHRoID0gLSBtdlBvc2l0aW9uLno7XG4jZW5kaWYiLGZvZ19wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9GT0dcblx0dmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcbiNlbmRpZiIsZm9nX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0ZPR1xuXHQjaWZkZWYgRk9HX0VYUDJcblx0XHRmbG9hdCBmb2dGYWN0b3IgPSAxLjAgLSBleHAoIC0gZm9nRGVuc2l0eSAqIGZvZ0RlbnNpdHkgKiBmb2dEZXB0aCAqIGZvZ0RlcHRoICk7XG5cdCNlbHNlXG5cdFx0ZmxvYXQgZm9nRmFjdG9yID0gc21vb3Roc3RlcCggZm9nTmVhciwgZm9nRmFyLCBmb2dEZXB0aCApO1xuXHQjZW5kaWZcblx0Z2xfRnJhZ0NvbG9yLnJnYiA9IG1peCggZ2xfRnJhZ0NvbG9yLnJnYiwgZm9nQ29sb3IsIGZvZ0ZhY3RvciApO1xuI2VuZGlmIixmb2dfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9GT0dcblx0dW5pZm9ybSB2ZWMzIGZvZ0NvbG9yO1xuXHR2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoO1xuXHQjaWZkZWYgRk9HX0VYUDJcblx0XHR1bmlmb3JtIGZsb2F0IGZvZ0RlbnNpdHk7XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBmbG9hdCBmb2dOZWFyO1xuXHRcdHVuaWZvcm0gZmxvYXQgZm9nRmFyO1xuXHQjZW5kaWZcbiNlbmRpZiIsZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9HUkFESUVOVE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudE1hcDtcbiNlbmRpZlxudmVjMyBnZXRHcmFkaWVudElycmFkaWFuY2UoIHZlYzMgbm9ybWFsLCB2ZWMzIGxpZ2h0RGlyZWN0aW9uICkge1xuXHRmbG9hdCBkb3ROTCA9IGRvdCggbm9ybWFsLCBsaWdodERpcmVjdGlvbiApO1xuXHR2ZWMyIGNvb3JkID0gdmVjMiggZG90TkwgKiAwLjUgKyAwLjUsIDAuMCApO1xuXHQjaWZkZWYgVVNFX0dSQURJRU5UTUFQXG5cdFx0cmV0dXJuIHRleHR1cmUyRCggZ3JhZGllbnRNYXAsIGNvb3JkICkucmdiO1xuXHQjZWxzZVxuXHRcdHJldHVybiAoIGNvb3JkLnggPCAwLjcgKSA/IHZlYzMoIDAuNyApIDogdmVjMyggMS4wICk7XG5cdCNlbmRpZlxufSIsbGlnaHRtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTElHSFRNQVBcblx0dmVjNCBsaWdodE1hcFRleGVsPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICk7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBQSSAqIGxpZ2h0TWFwVGV4ZWxUb0xpbmVhciggbGlnaHRNYXBUZXhlbCApLnJnYiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xuI2VuZGlmIixsaWdodG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0xJR0hUTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGxpZ2h0TWFwO1xuXHR1bmlmb3JtIGZsb2F0IGxpZ2h0TWFwSW50ZW5zaXR5O1xuI2VuZGlmIixsaWdodHNfbGFtYmVydF92ZXJ0ZXg6InZlYzMgZGlmZnVzZSA9IHZlYzMoIDEuMCApO1xuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeTtcbmdlb21ldHJ5LnBvc2l0aW9uID0gbXZQb3NpdGlvbi54eXo7XG5nZW9tZXRyeS5ub3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG5nZW9tZXRyeS52aWV3RGlyID0gKCBpc09ydGhvZ3JhcGhpYyApID8gdmVjMyggMCwgMCwgMSApIDogbm9ybWFsaXplKCAtbXZQb3NpdGlvbi54eXogKTtcbkdlb21ldHJpY0NvbnRleHQgYmFja0dlb21ldHJ5O1xuYmFja0dlb21ldHJ5LnBvc2l0aW9uID0gZ2VvbWV0cnkucG9zaXRpb247XG5iYWNrR2VvbWV0cnkubm9ybWFsID0gLWdlb21ldHJ5Lm5vcm1hbDtcbmJhY2tHZW9tZXRyeS52aWV3RGlyID0gZ2VvbWV0cnkudmlld0RpcjtcbnZMaWdodEZyb250ID0gdmVjMyggMC4wICk7XG52SW5kaXJlY3RGcm9udCA9IHZlYzMoIDAuMCApO1xuI2lmZGVmIERPVUJMRV9TSURFRFxuXHR2TGlnaHRCYWNrID0gdmVjMyggMC4wICk7XG5cdHZJbmRpcmVjdEJhY2sgPSB2ZWMzKCAwLjAgKTtcbiNlbmRpZlxuSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodDtcbmZsb2F0IGRvdE5MO1xudmVjMyBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG52SW5kaXJlY3RGcm9udCArPSBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xudkluZGlyZWN0RnJvbnQgKz0gZ2V0TGlnaHRQcm9iZUlycmFkaWFuY2UoIGxpZ2h0UHJvYmUsIGdlb21ldHJ5ICk7XG4jaWZkZWYgRE9VQkxFX1NJREVEXG5cdHZJbmRpcmVjdEJhY2sgKz0gZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcblx0dkluZGlyZWN0QmFjayArPSBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggbGlnaHRQcm9iZSwgYmFja0dlb21ldHJ5ICk7XG4jZW5kaWZcbiNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XG5cdFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSA9IFBJICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0dkxpZ2h0RnJvbnQgKz0gc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2VuZGlmXG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcbiNlbmRpZlxuI2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XG5cdFx0Z2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggc3BvdExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHRkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgPSBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdHZMaWdodEZyb250ICs9IHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZMaWdodEJhY2sgKz0gc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNlbmRpZlxuXHR9XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG4jZW5kaWZcbiNpZiBOVU1fRElSX0xJR0hUUyA+IDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0ZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHR2TGlnaHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2TGlnaHRCYWNrICs9IHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjZW5kaWZcblx0fVxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuI2VuZGlmXG4jaWYgTlVNX0hFTUlfTElHSFRTID4gMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHtcblx0XHR2SW5kaXJlY3RGcm9udCArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5ICk7XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdFx0dkluZGlyZWN0QmFjayArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGJhY2tHZW9tZXRyeSApO1xuXHRcdCNlbmRpZlxuXHR9XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG4jZW5kaWYiLGxpZ2h0c19wYXJzX2JlZ2luOiJ1bmlmb3JtIGJvb2wgcmVjZWl2ZVNoYWRvdztcbnVuaWZvcm0gdmVjMyBhbWJpZW50TGlnaHRDb2xvcjtcbnVuaWZvcm0gdmVjMyBsaWdodFByb2JlWyA5IF07XG52ZWMzIHNoR2V0SXJyYWRpYW5jZUF0KCBpbiB2ZWMzIG5vcm1hbCwgaW4gdmVjMyBzaENvZWZmaWNpZW50c1sgOSBdICkge1xuXHRmbG9hdCB4ID0gbm9ybWFsLngsIHkgPSBub3JtYWwueSwgeiA9IG5vcm1hbC56O1xuXHR2ZWMzIHJlc3VsdCA9IHNoQ29lZmZpY2llbnRzWyAwIF0gKiAwLjg4NjIyNztcblx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyAxIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHk7XG5cdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgMiBdICogMi4wICogMC41MTE2NjQgKiB6O1xuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDMgXSAqIDIuMCAqIDAuNTExNjY0ICogeDtcblx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA0IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHggKiB5O1xuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDUgXSAqIDIuMCAqIDAuNDI5MDQzICogeSAqIHo7XG5cdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNiBdICogKCAwLjc0MzEyNSAqIHogKiB6IC0gMC4yNDc3MDggKTtcblx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA3IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHggKiB6O1xuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDggXSAqIDAuNDI5MDQzICogKCB4ICogeCAtIHkgKiB5ICk7XG5cdHJldHVybiByZXN1bHQ7XG59XG52ZWMzIGdldExpZ2h0UHJvYmVJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGxpZ2h0UHJvYmVbIDkgXSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSApIHtcblx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGdlb21ldHJ5Lm5vcm1hbCwgdmlld01hdHJpeCApO1xuXHR2ZWMzIGlycmFkaWFuY2UgPSBzaEdldElycmFkaWFuY2VBdCggd29ybGROb3JtYWwsIGxpZ2h0UHJvYmUgKTtcblx0cmV0dXJuIGlycmFkaWFuY2U7XG59XG52ZWMzIGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgYW1iaWVudExpZ2h0Q29sb3IgKSB7XG5cdHZlYzMgaXJyYWRpYW5jZSA9IGFtYmllbnRMaWdodENvbG9yO1xuXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRpcnJhZGlhbmNlICo9IFBJO1xuXHQjZW5kaWZcblx0cmV0dXJuIGlycmFkaWFuY2U7XG59XG4jaWYgTlVNX0RJUl9MSUdIVFMgPiAwXG5cdHN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0IHtcblx0XHR2ZWMzIGRpcmVjdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHR9O1xuXHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodHNbIE5VTV9ESVJfTElHSFRTIF07XG5cdHZvaWQgZ2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgKSB7XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBkaXJlY3Rpb25hbExpZ2h0LmNvbG9yO1xuXHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbmFsTGlnaHQuZGlyZWN0aW9uO1xuXHRcdGRpcmVjdExpZ2h0LnZpc2libGUgPSB0cnVlO1xuXHR9XG4jZW5kaWZcbiNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxuXHRzdHJ1Y3QgUG9pbnRMaWdodCB7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGZsb2F0IGRpc3RhbmNlO1xuXHRcdGZsb2F0IGRlY2F5O1xuXHR9O1xuXHR1bmlmb3JtIFBvaW50TGlnaHQgcG9pbnRMaWdodHNbIE5VTV9QT0lOVF9MSUdIVFMgXTtcblx0dm9pZCBnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gUG9pbnRMaWdodCBwb2ludExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCApIHtcblx0XHR2ZWMzIGxWZWN0b3IgPSBwb2ludExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnkucG9zaXRpb247XG5cdFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBsVmVjdG9yICk7XG5cdFx0ZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApO1xuXHRcdGRpcmVjdExpZ2h0LmNvbG9yID0gcG9pbnRMaWdodC5jb2xvcjtcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqPSBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBsaWdodERpc3RhbmNlLCBwb2ludExpZ2h0LmRpc3RhbmNlLCBwb2ludExpZ2h0LmRlY2F5ICk7XG5cdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9ICggZGlyZWN0TGlnaHQuY29sb3IgIT0gdmVjMyggMC4wICkgKTtcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1NQT1RfTElHSFRTID4gMFxuXHRzdHJ1Y3QgU3BvdExpZ2h0IHtcblx0XHR2ZWMzIHBvc2l0aW9uO1xuXHRcdHZlYzMgZGlyZWN0aW9uO1xuXHRcdHZlYzMgY29sb3I7XG5cdFx0ZmxvYXQgZGlzdGFuY2U7XG5cdFx0ZmxvYXQgZGVjYXk7XG5cdFx0ZmxvYXQgY29uZUNvcztcblx0XHRmbG9hdCBwZW51bWJyYUNvcztcblx0fTtcblx0dW5pZm9ybSBTcG90TGlnaHQgc3BvdExpZ2h0c1sgTlVNX1NQT1RfTElHSFRTIF07XG5cdHZvaWQgZ2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gU3BvdExpZ2h0IHNwb3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgKSB7XG5cdFx0dmVjMyBsVmVjdG9yID0gc3BvdExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnkucG9zaXRpb247XG5cdFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBsVmVjdG9yICk7XG5cdFx0ZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApO1xuXHRcdGZsb2F0IGFuZ2xlQ29zID0gZG90KCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIHNwb3RMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRpZiAoIGFuZ2xlQ29zID4gc3BvdExpZ2h0LmNvbmVDb3MgKSB7XG5cdFx0XHRmbG9hdCBzcG90RWZmZWN0ID0gc21vb3Roc3RlcCggc3BvdExpZ2h0LmNvbmVDb3MsIHNwb3RMaWdodC5wZW51bWJyYUNvcywgYW5nbGVDb3MgKTtcblx0XHRcdGRpcmVjdExpZ2h0LmNvbG9yID0gc3BvdExpZ2h0LmNvbG9yO1xuXHRcdFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gc3BvdEVmZmVjdCAqIHB1bmN0dWFsTGlnaHRJbnRlbnNpdHlUb0lycmFkaWFuY2VGYWN0b3IoIGxpZ2h0RGlzdGFuY2UsIHNwb3RMaWdodC5kaXN0YW5jZSwgc3BvdExpZ2h0LmRlY2F5ICk7XG5cdFx0XHRkaXJlY3RMaWdodC52aXNpYmxlID0gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGlyZWN0TGlnaHQuY29sb3IgPSB2ZWMzKCAwLjAgKTtcblx0XHRcdGRpcmVjdExpZ2h0LnZpc2libGUgPSBmYWxzZTtcblx0XHR9XG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxuXHRzdHJ1Y3QgUmVjdEFyZWFMaWdodCB7XG5cdFx0dmVjMyBjb2xvcjtcblx0XHR2ZWMzIHBvc2l0aW9uO1xuXHRcdHZlYzMgaGFsZldpZHRoO1xuXHRcdHZlYzMgaGFsZkhlaWdodDtcblx0fTtcblx0dW5pZm9ybSBzYW1wbGVyMkQgbHRjXzE7XHR1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMjtcblx0dW5pZm9ybSBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHRzWyBOVU1fUkVDVF9BUkVBX0xJR0hUUyBdO1xuI2VuZGlmXG4jaWYgTlVNX0hFTUlfTElHSFRTID4gMFxuXHRzdHJ1Y3QgSGVtaXNwaGVyZUxpZ2h0IHtcblx0XHR2ZWMzIGRpcmVjdGlvbjtcblx0XHR2ZWMzIHNreUNvbG9yO1xuXHRcdHZlYzMgZ3JvdW5kQ29sb3I7XG5cdH07XG5cdHVuaWZvcm0gSGVtaXNwaGVyZUxpZ2h0IGhlbWlzcGhlcmVMaWdodHNbIE5VTV9IRU1JX0xJR0hUUyBdO1xuXHR2ZWMzIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIEhlbWlzcGhlcmVMaWdodCBoZW1pTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnkgKSB7XG5cdFx0ZmxvYXQgZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgaGVtaUxpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGZsb2F0IGhlbWlEaWZmdXNlV2VpZ2h0ID0gMC41ICogZG90TkwgKyAwLjU7XG5cdFx0dmVjMyBpcnJhZGlhbmNlID0gbWl4KCBoZW1pTGlnaHQuZ3JvdW5kQ29sb3IsIGhlbWlMaWdodC5za3lDb2xvciwgaGVtaURpZmZ1c2VXZWlnaHQgKTtcblx0XHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRcdGlycmFkaWFuY2UgKj0gUEk7XG5cdFx0I2VuZGlmXG5cdFx0cmV0dXJuIGlycmFkaWFuY2U7XG5cdH1cbiNlbmRpZiIsbGlnaHRzX3Rvb25fZnJhZ21lbnQ6IlRvb25NYXRlcmlhbCBtYXRlcmlhbDtcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2I7IixsaWdodHNfdG9vbl9wYXJzX2ZyYWdtZW50OiJ2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbnN0cnVjdCBUb29uTWF0ZXJpYWwge1xuXHR2ZWMzIGRpZmZ1c2VDb2xvcjtcbn07XG52b2lkIFJFX0RpcmVjdF9Ub29uKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBUb29uTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHR2ZWMzIGlycmFkaWFuY2UgPSBnZXRHcmFkaWVudElycmFkaWFuY2UoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0aXJyYWRpYW5jZSAqPSBQSTtcblx0I2VuZGlmXG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX1Rvb24oIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gVG9vbk1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG59XG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X1Rvb25cbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9Ub29uXG4jZGVmaW5lIE1hdGVyaWFsX0xpZ2h0UHJvYmVMT0QoIG1hdGVyaWFsIClcdCgwKSIsbGlnaHRzX3Bob25nX2ZyYWdtZW50OiJCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWw7XG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiO1xubWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IHNwZWN1bGFyO1xubWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgPSBzaGluaW5lc3M7XG5tYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoID0gc3BlY3VsYXJTdHJlbmd0aDsiLGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50OiJ2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbnN0cnVjdCBCbGlublBob25nTWF0ZXJpYWwge1xuXHR2ZWMzIGRpZmZ1c2VDb2xvcjtcblx0dmVjMyBzcGVjdWxhckNvbG9yO1xuXHRmbG9hdCBzcGVjdWxhclNoaW5pbmVzcztcblx0ZmxvYXQgc3BlY3VsYXJTdHJlbmd0aDtcbn07XG52b2lkIFJFX0RpcmVjdF9CbGlublBob25nKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0dmVjMyBpcnJhZGlhbmNlID0gZG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0aXJyYWRpYW5jZSAqPSBQSTtcblx0I2VuZGlmXG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyApICogbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aDtcbn1cbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmcoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG59XG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X0JsaW5uUGhvbmdcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nXG4jZGVmaW5lIE1hdGVyaWFsX0xpZ2h0UHJvYmVMT0QoIG1hdGVyaWFsIClcdCgwKSIsbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50OiJQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsO1xubWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYiAqICggMS4wIC0gbWV0YWxuZXNzRmFjdG9yICk7XG52ZWMzIGR4eSA9IG1heCggYWJzKCBkRmR4KCBnZW9tZXRyeU5vcm1hbCApICksIGFicyggZEZkeSggZ2VvbWV0cnlOb3JtYWwgKSApICk7XG5mbG9hdCBnZW9tZXRyeVJvdWdobmVzcyA9IG1heCggbWF4KCBkeHkueCwgZHh5LnkgKSwgZHh5LnogKTtcbm1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzID0gbWF4KCByb3VnaG5lc3NGYWN0b3IsIDAuMDUyNSApO21hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzICs9IGdlb21ldHJ5Um91Z2huZXNzO1xubWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgPSBtaW4oIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLCAxLjAgKTtcbiNpZmRlZiBSRUZMRUNUSVZJVFlcblx0I2lmZGVmIFNQRUNVTEFSXG5cdFx0dmVjMyBzcGVjdWxhckludGVuc2l0eUZhY3RvciA9IHZlYzMoIHNwZWN1bGFySW50ZW5zaXR5ICk7XG5cdFx0dmVjMyBzcGVjdWxhclRpbnRGYWN0b3IgPSBzcGVjdWxhclRpbnQ7XG5cdFx0I2lmZGVmIFVTRV9TUEVDVUxBUklOVEVOU0lUWU1BUFxuXHRcdFx0c3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IgKj0gdGV4dHVyZTJEKCBzcGVjdWxhckludGVuc2l0eU1hcCwgdlV2ICkuYTtcblx0XHQjZW5kaWZcblx0XHQjaWZkZWYgVVNFX1NQRUNVTEFSVElOVE1BUFxuXHRcdFx0c3BlY3VsYXJUaW50RmFjdG9yICo9IHNwZWN1bGFyVGludE1hcFRleGVsVG9MaW5lYXIoIHRleHR1cmUyRCggc3BlY3VsYXJUaW50TWFwLCB2VXYgKSApLnJnYjtcblx0XHQjZW5kaWZcblx0XHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yRjkwID0gbWl4KCBzcGVjdWxhckludGVuc2l0eUZhY3RvciwgdmVjMyggMS4wICksIG1ldGFsbmVzc0ZhY3RvciApO1xuXHQjZWxzZVxuXHRcdHZlYzMgc3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IgPSB2ZWMzKCAxLjAgKTtcblx0XHR2ZWMzIHNwZWN1bGFyVGludEZhY3RvciA9IHZlYzMoIDEuMCApO1xuXHRcdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3JGOTAgPSB2ZWMzKCAxLjAgKTtcblx0I2VuZGlmXG5cdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIG1pbiggdmVjMyggTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAqIHBvdzIoIHJlZmxlY3Rpdml0eSApICkgKiBzcGVjdWxhclRpbnRGYWN0b3IsIHZlYzMoIDEuMCApICkgKiBzcGVjdWxhckludGVuc2l0eUZhY3RvciwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7XG4jZWxzZVxuXHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yID0gbWl4KCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xuXHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yRjkwID0gdmVjMyggMS4wICk7XG4jZW5kaWZcbiNpZmRlZiBDTEVBUkNPQVRcblx0bWF0ZXJpYWwuY2xlYXJjb2F0ID0gY2xlYXJjb2F0O1xuXHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgPSBjbGVhcmNvYXRSb3VnaG5lc3M7XG5cdCNpZmRlZiBVU0VfQ0xFQVJDT0FUTUFQXG5cdFx0bWF0ZXJpYWwuY2xlYXJjb2F0ICo9IHRleHR1cmUyRCggY2xlYXJjb2F0TWFwLCB2VXYgKS54O1xuXHQjZW5kaWZcblx0I2lmZGVmIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQXG5cdFx0bWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICo9IHRleHR1cmUyRCggY2xlYXJjb2F0Um91Z2huZXNzTWFwLCB2VXYgKS55O1xuXHQjZW5kaWZcblx0bWF0ZXJpYWwuY2xlYXJjb2F0ID0gc2F0dXJhdGUoIG1hdGVyaWFsLmNsZWFyY29hdCApO1x0bWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzID0gbWF4KCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIDAuMDUyNSApO1xuXHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKz0gZ2VvbWV0cnlSb3VnaG5lc3M7XG5cdG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IG1pbiggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCAxLjAgKTtcbiNlbmRpZlxuI2lmZGVmIFVTRV9TSEVFTlxuXHRtYXRlcmlhbC5zaGVlbkNvbG9yID0gc2hlZW47XG4jZW5kaWYiLGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50OiJzdHJ1Y3QgUGh5c2ljYWxNYXRlcmlhbCB7XG5cdHZlYzMgZGlmZnVzZUNvbG9yO1xuXHRmbG9hdCBzcGVjdWxhclJvdWdobmVzcztcblx0dmVjMyBzcGVjdWxhckNvbG9yO1xuXHR2ZWMzIHNwZWN1bGFyQ29sb3JGOTA7XG4jaWZkZWYgQ0xFQVJDT0FUXG5cdGZsb2F0IGNsZWFyY29hdDtcblx0ZmxvYXQgY2xlYXJjb2F0Um91Z2huZXNzO1xuI2VuZGlmXG4jaWZkZWYgVVNFX1NIRUVOXG5cdHZlYzMgc2hlZW5Db2xvcjtcbiNlbmRpZlxufTtcbiNkZWZpbmUgTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAwLjE2XG4jZGVmaW5lIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgMC4wNFxuZmxvYXQgY2xlYXJjb2F0REhSQXBwcm94KCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGZsb2F0IGRvdE5MICkge1xuXHRyZXR1cm4gREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCArICggMS4wIC0gREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApICogKCBwb3coIDEuMCAtIGRvdE5MLCA1LjAgKSAqIHBvdyggMS4wIC0gcm91Z2huZXNzLCAyLjAgKSApO1xufVxuI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxuXHR2b2lkIFJFX0RpcmVjdF9SZWN0QXJlYV9QaHlzaWNhbCggY29uc3QgaW4gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0XHR2ZWMzIG5vcm1hbCA9IGdlb21ldHJ5Lm5vcm1hbDtcblx0XHR2ZWMzIHZpZXdEaXIgPSBnZW9tZXRyeS52aWV3RGlyO1xuXHRcdHZlYzMgcG9zaXRpb24gPSBnZW9tZXRyeS5wb3NpdGlvbjtcblx0XHR2ZWMzIGxpZ2h0UG9zID0gcmVjdEFyZWFMaWdodC5wb3NpdGlvbjtcblx0XHR2ZWMzIGhhbGZXaWR0aCA9IHJlY3RBcmVhTGlnaHQuaGFsZldpZHRoO1xuXHRcdHZlYzMgaGFsZkhlaWdodCA9IHJlY3RBcmVhTGlnaHQuaGFsZkhlaWdodDtcblx0XHR2ZWMzIGxpZ2h0Q29sb3IgPSByZWN0QXJlYUxpZ2h0LmNvbG9yO1xuXHRcdGZsb2F0IHJvdWdobmVzcyA9IG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzO1xuXHRcdHZlYzMgcmVjdENvb3Jkc1sgNCBdO1xuXHRcdHJlY3RDb29yZHNbIDAgXSA9IGxpZ2h0UG9zICsgaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcdFx0cmVjdENvb3Jkc1sgMSBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1xuXHRcdHJlY3RDb29yZHNbIDIgXSA9IGxpZ2h0UG9zIC0gaGFsZldpZHRoICsgaGFsZkhlaWdodDtcblx0XHRyZWN0Q29vcmRzWyAzIF0gPSBsaWdodFBvcyArIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7XG5cdFx0dmVjMiB1diA9IExUQ19Vdiggbm9ybWFsLCB2aWV3RGlyLCByb3VnaG5lc3MgKTtcblx0XHR2ZWM0IHQxID0gdGV4dHVyZTJEKCBsdGNfMSwgdXYgKTtcblx0XHR2ZWM0IHQyID0gdGV4dHVyZTJEKCBsdGNfMiwgdXYgKTtcblx0XHRtYXQzIG1JbnYgPSBtYXQzKFxuXHRcdFx0dmVjMyggdDEueCwgMCwgdDEueSApLFxuXHRcdFx0dmVjMyggICAgMCwgMSwgICAgMCApLFxuXHRcdFx0dmVjMyggdDEueiwgMCwgdDEudyApXG5cdFx0KTtcblx0XHR2ZWMzIGZyZXNuZWwgPSAoIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKiB0Mi54ICsgKCB2ZWMzKCAxLjAgKSAtIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKSAqIHQyLnkgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBsaWdodENvbG9yICogZnJlc25lbCAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbUludiwgcmVjdENvb3JkcyApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gbGlnaHRDb2xvciAqIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbWF0MyggMS4wICksIHJlY3RDb29yZHMgKTtcblx0fVxuI2VuZGlmXG52b2lkIFJFX0RpcmVjdF9QaHlzaWNhbCggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xuXHR2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRpcnJhZGlhbmNlICo9IFBJO1xuXHQjZW5kaWZcblx0I2lmZGVmIENMRUFSQ09BVFxuXHRcdGZsb2F0IGNjRG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdFx0dmVjMyBjY0lycmFkaWFuY2UgPSBjY0RvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0XHRjY0lycmFkaWFuY2UgKj0gUEk7XG5cdFx0I2VuZGlmXG5cdFx0ZmxvYXQgY2xlYXJjb2F0REhSID0gbWF0ZXJpYWwuY2xlYXJjb2F0ICogY2xlYXJjb2F0REhSQXBwcm94KCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIGNjRG90TkwgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBjY0lycmFkaWFuY2UgKiBtYXRlcmlhbC5jbGVhcmNvYXQgKiBCUkRGX1NwZWN1bGFyX0dHWCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCB2ZWMzKCAxLjAgKSwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7XG5cdCNlbHNlXG5cdFx0ZmxvYXQgY2xlYXJjb2F0REhSID0gMC4wO1xuXHQjZW5kaWZcblx0I2lmZGVmIFVTRV9TSEVFTlxuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9ICggMS4wIC0gY2xlYXJjb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9TaGVlbihcblx0XHRcdG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLFxuXHRcdFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uLFxuXHRcdFx0Z2VvbWV0cnksXG5cdFx0XHRtYXRlcmlhbC5zaGVlbkNvbG9yXG5cdFx0KTtcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yRjkwLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyk7XG5cdCNlbmRpZlxuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9ICggMS4wIC0gY2xlYXJjb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xufVxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xufVxudm9pZCBSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsKCBjb25zdCBpbiB2ZWMzIHJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgY2xlYXJjb2F0UmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0KSB7XG5cdCNpZmRlZiBDTEVBUkNPQVRcblx0XHRmbG9hdCBjY0RvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IGNsZWFyY29hdFJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJjb2F0ICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTtcblx0XHRmbG9hdCBjY0RvdE5MID0gY2NEb3ROVjtcblx0XHRmbG9hdCBjbGVhcmNvYXRESFIgPSBtYXRlcmlhbC5jbGVhcmNvYXQgKiBjbGVhcmNvYXRESFJBcHByb3goIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgY2NEb3ROTCApO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGNsZWFyY29hdERIUiA9IDAuMDtcblx0I2VuZGlmXG5cdGZsb2F0IGNsZWFyY29hdEludiA9IDEuMCAtIGNsZWFyY29hdERIUjtcblx0dmVjMyBzaW5nbGVTY2F0dGVyaW5nID0gdmVjMyggMC4wICk7XG5cdHZlYzMgbXVsdGlTY2F0dGVyaW5nID0gdmVjMyggMC4wICk7XG5cdHZlYzMgY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlID0gaXJyYWRpYW5jZSAqIFJFQ0lQUk9DQUxfUEk7XG5cdEJSREZfU3BlY3VsYXJfTXVsdGlzY2F0dGVyaW5nX0Vudmlyb25tZW50KCBnZW9tZXRyeSwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MsIHNpbmdsZVNjYXR0ZXJpbmcsIG11bHRpU2NhdHRlcmluZyApO1xuXHR2ZWMzIGRpZmZ1c2UgPSBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiAoIDEuMCAtICggc2luZ2xlU2NhdHRlcmluZyArIG11bHRpU2NhdHRlcmluZyApICk7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gY2xlYXJjb2F0SW52ICogcmFkaWFuY2UgKiBzaW5nbGVTY2F0dGVyaW5nO1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IG11bHRpU2NhdHRlcmluZyAqIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZTtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGRpZmZ1c2UgKiBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2U7XG59XG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X1BoeXNpY2FsXG4jZGVmaW5lIFJFX0RpcmVjdF9SZWN0QXJlYVx0XHRSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWxcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbFxuI2RlZmluZSBSRV9JbmRpcmVjdFNwZWN1bGFyXHRcdFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWxcbmZsb2F0IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IGFtYmllbnRPY2NsdXNpb24sIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0cmV0dXJuIHNhdHVyYXRlKCBwb3coIGRvdE5WICsgYW1iaWVudE9jY2x1c2lvbiwgZXhwMiggLSAxNi4wICogcm91Z2huZXNzIC0gMS4wICkgKSAtIDEuMCArIGFtYmllbnRPY2NsdXNpb24gKTtcbn0iLGxpZ2h0c19mcmFnbWVudF9iZWdpbjoiXG5HZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5O1xuZ2VvbWV0cnkucG9zaXRpb24gPSAtIHZWaWV3UG9zaXRpb247XG5nZW9tZXRyeS5ub3JtYWwgPSBub3JtYWw7XG5nZW9tZXRyeS52aWV3RGlyID0gKCBpc09ydGhvZ3JhcGhpYyApID8gdmVjMyggMCwgMCwgMSApIDogbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XG4jaWZkZWYgQ0xFQVJDT0FUXG5cdGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCA9IGNsZWFyY29hdE5vcm1hbDtcbiNlbmRpZlxuSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodDtcbiNpZiAoIE5VTV9QT0lOVF9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcblx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xuXHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxuXHRQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHRTaGFkb3c7XG5cdCNlbmRpZlxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XG5cdFx0cG9pbnRMaWdodCA9IHBvaW50TGlnaHRzWyBpIF07XG5cdFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgKCBVTlJPTExFRF9MT09QX0lOREVYIDwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgKVxuXHRcdHBvaW50TGlnaHRTaGFkb3cgPSBwb2ludExpZ2h0U2hhZG93c1sgaSBdO1xuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICo9IGFsbCggYnZlYzIoIGRpcmVjdExpZ2h0LnZpc2libGUsIHJlY2VpdmVTaGFkb3cgKSApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dCaWFzLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xuXHRcdCNlbmRpZlxuXHRcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcblx0fVxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuI2VuZGlmXG4jaWYgKCBOVU1fU1BPVF9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcblx0U3BvdExpZ2h0IHNwb3RMaWdodDtcblx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMFxuXHRTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0U2hhZG93O1xuXHQjZW5kaWZcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XG5cdFx0c3BvdExpZ2h0ID0gc3BvdExpZ2h0c1sgaSBdO1xuXHRcdGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIHNwb3RMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIClcblx0XHRzcG90TGlnaHRTaGFkb3cgPSBzcG90TGlnaHRTaGFkb3dzWyBpIF07XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggZGlyZWN0TGlnaHQudmlzaWJsZSwgcmVjZWl2ZVNoYWRvdyApICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0U2hhZG93LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodFNoYWRvdy5zaGFkb3dCaWFzLCBzcG90TGlnaHRTaGFkb3cuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0XHQjZW5kaWZcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcbiNlbmRpZlxuI2lmICggTlVNX0RJUl9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcblx0RGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0O1xuXHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDBcblx0RGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93O1xuXHQjZW5kaWZcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcblx0XHRkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcblx0XHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fRElSX0xJR0hUX1NIQURPV1MgKVxuXHRcdGRpcmVjdGlvbmFsTGlnaHRTaGFkb3cgPSBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgaSBdO1xuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICo9IGFsbCggYnZlYzIoIGRpcmVjdExpZ2h0LnZpc2libGUsIHJlY2VpdmVTaGFkb3cgKSApID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3cuc2hhZG93QmlhcywgZGlyZWN0aW9uYWxMaWdodFNoYWRvdy5zaGFkb3dSYWRpdXMsIHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0XHQjZW5kaWZcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcbiNlbmRpZlxuI2lmICggTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0X1JlY3RBcmVhIClcblx0UmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9SRUNUX0FSRUFfTElHSFRTOyBpICsrICkge1xuXHRcdHJlY3RBcmVhTGlnaHQgPSByZWN0QXJlYUxpZ2h0c1sgaSBdO1xuXHRcdFJFX0RpcmVjdF9SZWN0QXJlYSggcmVjdEFyZWFMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG4jZW5kaWZcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHR2ZWMzIGlibElycmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTtcblx0dmVjMyBpcnJhZGlhbmNlID0gZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcblx0aXJyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggbGlnaHRQcm9iZSwgZ2VvbWV0cnkgKTtcblx0I2lmICggTlVNX0hFTUlfTElHSFRTID4gMCApXG5cdFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxuXHRcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHtcblx0XHRcdGlycmFkaWFuY2UgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeSApO1xuXHRcdH1cblx0XHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuXHQjZW5kaWZcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxuXHR2ZWMzIHJhZGlhbmNlID0gdmVjMyggMC4wICk7XG5cdHZlYzMgY2xlYXJjb2F0UmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTtcbiNlbmRpZiIsbGlnaHRzX2ZyYWdtZW50X21hcHM6IiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHQjaWZkZWYgVVNFX0xJR0hUTUFQXG5cdFx0dmVjNCBsaWdodE1hcFRleGVsPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICk7XG5cdFx0dmVjMyBsaWdodE1hcElycmFkaWFuY2UgPSBsaWdodE1hcFRleGVsVG9MaW5lYXIoIGxpZ2h0TWFwVGV4ZWwgKS5yZ2IgKiBsaWdodE1hcEludGVuc2l0eTtcblx0XHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRcdGxpZ2h0TWFwSXJyYWRpYW5jZSAqPSBQSTtcblx0XHQjZW5kaWZcblx0XHRpcnJhZGlhbmNlICs9IGxpZ2h0TWFwSXJyYWRpYW5jZTtcblx0I2VuZGlmXG5cdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggU1RBTkRBUkQgKSAmJiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRpYmxJcnJhZGlhbmNlICs9IGdldExpZ2h0UHJvYmVJbmRpcmVjdElycmFkaWFuY2UoIGdlb21ldHJ5LCBtYXhNaXBMZXZlbCApO1xuXHQjZW5kaWZcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcblx0cmFkaWFuY2UgKz0gZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5Lm5vcm1hbCwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MsIG1heE1pcExldmVsICk7XG5cdCNpZmRlZiBDTEVBUkNPQVRcblx0XHRjbGVhcmNvYXRSYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIG1heE1pcExldmVsICk7XG5cdCNlbmRpZlxuI2VuZGlmIixsaWdodHNfZnJhZ21lbnRfZW5kOiIjaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcblx0UkVfSW5kaXJlY3REaWZmdXNlKCBpcnJhZGlhbmNlLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG4jZW5kaWZcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcblx0UkVfSW5kaXJlY3RTcGVjdWxhciggcmFkaWFuY2UsIGlibElycmFkaWFuY2UsIGNsZWFyY29hdFJhZGlhbmNlLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG4jZW5kaWYiLGxvZ2RlcHRoYnVmX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGICkgJiYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGX0VYVCApXG5cdGdsX0ZyYWdEZXB0aEVYVCA9IHZJc1BlcnNwZWN0aXZlID09IDAuMCA/IGdsX0ZyYWdDb29yZC56IDogbG9nMiggdkZyYWdEZXB0aCApICogbG9nRGVwdGhCdWZGQyAqIDAuNTtcbiNlbmRpZiIsbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApICYmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKVxuXHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XG5cdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDtcblx0dmFyeWluZyBmbG9hdCB2SXNQZXJzcGVjdGl2ZTtcbiNlbmRpZiIsbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcblx0I2lmZGVmIFVTRV9MT0dERVBUSEJVRl9FWFRcblx0XHR2YXJ5aW5nIGZsb2F0IHZGcmFnRGVwdGg7XG5cdFx0dmFyeWluZyBmbG9hdCB2SXNQZXJzcGVjdGl2ZTtcblx0I2Vsc2Vcblx0XHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XG5cdCNlbmRpZlxuI2VuZGlmIixsb2dkZXB0aGJ1Zl92ZXJ0ZXg6IiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcblx0I2lmZGVmIFVTRV9MT0dERVBUSEJVRl9FWFRcblx0XHR2RnJhZ0RlcHRoID0gMS4wICsgZ2xfUG9zaXRpb24udztcblx0XHR2SXNQZXJzcGVjdGl2ZSA9IGZsb2F0KCBpc1BlcnNwZWN0aXZlTWF0cml4KCBwcm9qZWN0aW9uTWF0cml4ICkgKTtcblx0I2Vsc2Vcblx0XHRpZiAoIGlzUGVyc3BlY3RpdmVNYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKSApIHtcblx0XHRcdGdsX1Bvc2l0aW9uLnogPSBsb2cyKCBtYXgoIEVQU0lMT04sIGdsX1Bvc2l0aW9uLncgKyAxLjAgKSApICogbG9nRGVwdGhCdWZGQyAtIDEuMDtcblx0XHRcdGdsX1Bvc2l0aW9uLnogKj0gZ2xfUG9zaXRpb24udztcblx0XHR9XG5cdCNlbmRpZlxuI2VuZGlmIixtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTUFQXG5cdHZlYzQgdGV4ZWxDb2xvciA9IHRleHR1cmUyRCggbWFwLCB2VXYgKTtcblx0dGV4ZWxDb2xvciA9IG1hcFRleGVsVG9MaW5lYXIoIHRleGVsQ29sb3IgKTtcblx0ZGlmZnVzZUNvbG9yICo9IHRleGVsQ29sb3I7XG4jZW5kaWYiLG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XG4jZW5kaWYiLG1hcF9wYXJ0aWNsZV9mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9NQVAgKSB8fCBkZWZpbmVkKCBVU0VfQUxQSEFNQVAgKVxuXHR2ZWMyIHV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIGdsX1BvaW50Q29vcmQueCwgMS4wIC0gZ2xfUG9pbnRDb29yZC55LCAxICkgKS54eTtcbiNlbmRpZlxuI2lmZGVmIFVTRV9NQVBcblx0dmVjNCBtYXBUZXhlbCA9IHRleHR1cmUyRCggbWFwLCB1diApO1xuXHRkaWZmdXNlQ29sb3IgKj0gbWFwVGV4ZWxUb0xpbmVhciggbWFwVGV4ZWwgKTtcbiNlbmRpZlxuI2lmZGVmIFVTRV9BTFBIQU1BUFxuXHRkaWZmdXNlQ29sb3IuYSAqPSB0ZXh0dXJlMkQoIGFscGhhTWFwLCB1diApLmc7XG4jZW5kaWYiLG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApXG5cdHVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcbiNlbmRpZlxuI2lmZGVmIFVTRV9NQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xuI2VuZGlmXG4jaWZkZWYgVVNFX0FMUEhBTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwO1xuI2VuZGlmIixtZXRhbG5lc3NtYXBfZnJhZ21lbnQ6ImZsb2F0IG1ldGFsbmVzc0ZhY3RvciA9IG1ldGFsbmVzcztcbiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQXG5cdHZlYzQgdGV4ZWxNZXRhbG5lc3MgPSB0ZXh0dXJlMkQoIG1ldGFsbmVzc01hcCwgdlV2ICk7XG5cdG1ldGFsbmVzc0ZhY3RvciAqPSB0ZXhlbE1ldGFsbmVzcy5iO1xuI2VuZGlmIixtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwO1xuI2VuZGlmIixtb3JwaG5vcm1hbF92ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTXG5cdG9iamVjdE5vcm1hbCAqPSBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7XG5cdG9iamVjdE5vcm1hbCArPSBtb3JwaE5vcm1hbDAgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTtcblx0b2JqZWN0Tm9ybWFsICs9IG1vcnBoTm9ybWFsMSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMSBdO1xuXHRvYmplY3ROb3JtYWwgKz0gbW9ycGhOb3JtYWwyICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XG5cdG9iamVjdE5vcm1hbCArPSBtb3JwaE5vcm1hbDMgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDMgXTtcbiNlbmRpZiIsbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXG5cdHVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlO1xuXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0XHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgOCBdO1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA0IF07XG5cdCNlbmRpZlxuI2VuZGlmIixtb3JwaHRhcmdldF92ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXG5cdHRyYW5zZm9ybWVkICo9IG1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZTtcblx0dHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQwICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07XG5cdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0MSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMSBdO1xuXHR0cmFuc2Zvcm1lZCArPSBtb3JwaFRhcmdldDIgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcblx0dHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQzICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07XG5cdCNpZm5kZWYgVVNFX01PUlBITk9STUFMU1xuXHRcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NCAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNCBdO1xuXHRcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNSBdO1xuXHRcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNiBdO1xuXHRcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NyAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNyBdO1xuXHQjZW5kaWZcbiNlbmRpZiIsbm9ybWFsX2ZyYWdtZW50X2JlZ2luOiJmbG9hdCBmYWNlRGlyZWN0aW9uID0gZ2xfRnJvbnRGYWNpbmcgPyAxLjAgOiAtIDEuMDtcbiNpZmRlZiBGTEFUX1NIQURFRFxuXHR2ZWMzIGZkeCA9IHZlYzMoIGRGZHgoIHZWaWV3UG9zaXRpb24ueCApLCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnkgKSwgZEZkeCggdlZpZXdQb3NpdGlvbi56ICkgKTtcblx0dmVjMyBmZHkgPSB2ZWMzKCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeSggdlZpZXdQb3NpdGlvbi55ICksIGRGZHkoIHZWaWV3UG9zaXRpb24ueiApICk7XG5cdHZlYzMgbm9ybWFsID0gbm9ybWFsaXplKCBjcm9zcyggZmR4LCBmZHkgKSApO1xuI2Vsc2Vcblx0dmVjMyBub3JtYWwgPSBub3JtYWxpemUoIHZOb3JtYWwgKTtcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdG5vcm1hbCA9IG5vcm1hbCAqIGZhY2VEaXJlY3Rpb247XG5cdCNlbmRpZlxuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2ZWMzIHRhbmdlbnQgPSBub3JtYWxpemUoIHZUYW5nZW50ICk7XG5cdFx0dmVjMyBiaXRhbmdlbnQgPSBub3JtYWxpemUoIHZCaXRhbmdlbnQgKTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR0YW5nZW50ID0gdGFuZ2VudCAqIGZhY2VEaXJlY3Rpb247XG5cdFx0XHRiaXRhbmdlbnQgPSBiaXRhbmdlbnQgKiBmYWNlRGlyZWN0aW9uO1xuXHRcdCNlbmRpZlxuXHRcdCNpZiBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKVxuXHRcdFx0bWF0MyB2VEJOID0gbWF0MyggdGFuZ2VudCwgYml0YW5nZW50LCBub3JtYWwgKTtcblx0XHQjZW5kaWZcblx0I2VuZGlmXG4jZW5kaWZcbnZlYzMgZ2VvbWV0cnlOb3JtYWwgPSBub3JtYWw7Iixub3JtYWxfZnJhZ21lbnRfbWFwczoiI2lmZGVmIE9CSkVDVFNQQUNFX05PUk1BTE1BUFxuXHRub3JtYWwgPSB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xuXHQjaWZkZWYgRkxJUF9TSURFRFxuXHRcdG5vcm1hbCA9IC0gbm9ybWFsO1xuXHQjZW5kaWZcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdG5vcm1hbCA9IG5vcm1hbCAqIGZhY2VEaXJlY3Rpb247XG5cdCNlbmRpZlxuXHRub3JtYWwgPSBub3JtYWxpemUoIG5vcm1hbE1hdHJpeCAqIG5vcm1hbCApO1xuI2VsaWYgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXG5cdHZlYzMgbWFwTiA9IHRleHR1cmUyRCggbm9ybWFsTWFwLCB2VXYgKS54eXogKiAyLjAgLSAxLjA7XG5cdG1hcE4ueHkgKj0gbm9ybWFsU2NhbGU7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdG5vcm1hbCA9IG5vcm1hbGl6ZSggdlRCTiAqIG1hcE4gKTtcblx0I2Vsc2Vcblx0XHRub3JtYWwgPSBwZXJ0dXJiTm9ybWFsMkFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCwgbWFwTiwgZmFjZURpcmVjdGlvbiApO1xuXHQjZW5kaWZcbiNlbGlmIGRlZmluZWQoIFVTRV9CVU1QTUFQIClcblx0bm9ybWFsID0gcGVydHVyYk5vcm1hbEFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCwgZEhkeHlfZndkKCksIGZhY2VEaXJlY3Rpb24gKTtcbiNlbmRpZiIsbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTk9STUFMTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIG5vcm1hbE1hcDtcblx0dW5pZm9ybSB2ZWMyIG5vcm1hbFNjYWxlO1xuI2VuZGlmXG4jaWZkZWYgT0JKRUNUU1BBQ0VfTk9STUFMTUFQXG5cdHVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7XG4jZW5kaWZcbiNpZiAhIGRlZmluZWQgKCBVU0VfVEFOR0VOVCApICYmICggZGVmaW5lZCAoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkICggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKSApXG5cdHZlYzMgcGVydHVyYk5vcm1hbDJBcmIoIHZlYzMgZXllX3BvcywgdmVjMyBzdXJmX25vcm0sIHZlYzMgbWFwTiwgZmxvYXQgZmFjZURpcmVjdGlvbiApIHtcblx0XHR2ZWMzIHEwID0gdmVjMyggZEZkeCggZXllX3Bvcy54ICksIGRGZHgoIGV5ZV9wb3MueSApLCBkRmR4KCBleWVfcG9zLnogKSApO1xuXHRcdHZlYzMgcTEgPSB2ZWMzKCBkRmR5KCBleWVfcG9zLnggKSwgZEZkeSggZXllX3Bvcy55ICksIGRGZHkoIGV5ZV9wb3MueiApICk7XG5cdFx0dmVjMiBzdDAgPSBkRmR4KCB2VXYuc3QgKTtcblx0XHR2ZWMyIHN0MSA9IGRGZHkoIHZVdi5zdCApO1xuXHRcdHZlYzMgTiA9IHN1cmZfbm9ybTtcblx0XHR2ZWMzIHExcGVycCA9IGNyb3NzKCBxMSwgTiApO1xuXHRcdHZlYzMgcTBwZXJwID0gY3Jvc3MoIE4sIHEwICk7XG5cdFx0dmVjMyBUID0gcTFwZXJwICogc3QwLnggKyBxMHBlcnAgKiBzdDEueDtcblx0XHR2ZWMzIEIgPSBxMXBlcnAgKiBzdDAueSArIHEwcGVycCAqIHN0MS55O1xuXHRcdGZsb2F0IGRldCA9IG1heCggZG90KCBULCBUICksIGRvdCggQiwgQiApICk7XG5cdFx0ZmxvYXQgc2NhbGUgPSAoIGRldCA9PSAwLjAgKSA/IDAuMCA6IGZhY2VEaXJlY3Rpb24gKiBpbnZlcnNlc3FydCggZGV0ICk7XG5cdFx0cmV0dXJuIG5vcm1hbGl6ZSggVCAqICggbWFwTi54ICogc2NhbGUgKSArIEIgKiAoIG1hcE4ueSAqIHNjYWxlICkgKyBOICogbWFwTi56ICk7XG5cdH1cbiNlbmRpZiIsY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9iZWdpbjoiI2lmZGVmIENMRUFSQ09BVFxuXHR2ZWMzIGNsZWFyY29hdE5vcm1hbCA9IGdlb21ldHJ5Tm9ybWFsO1xuI2VuZGlmIixjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X21hcHM6IiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUFxuXHR2ZWMzIGNsZWFyY29hdE1hcE4gPSB0ZXh0dXJlMkQoIGNsZWFyY29hdE5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xuXHRjbGVhcmNvYXRNYXBOLnh5ICo9IGNsZWFyY29hdE5vcm1hbFNjYWxlO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHRjbGVhcmNvYXROb3JtYWwgPSBub3JtYWxpemUoIHZUQk4gKiBjbGVhcmNvYXRNYXBOICk7XG5cdCNlbHNlXG5cdFx0Y2xlYXJjb2F0Tm9ybWFsID0gcGVydHVyYk5vcm1hbDJBcmIoIC0gdlZpZXdQb3NpdGlvbiwgY2xlYXJjb2F0Tm9ybWFsLCBjbGVhcmNvYXRNYXBOLCBmYWNlRGlyZWN0aW9uICk7XG5cdCNlbmRpZlxuI2VuZGlmIixjbGVhcmNvYXRfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9DTEVBUkNPQVRNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgY2xlYXJjb2F0TWFwO1xuI2VuZGlmXG4jaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgY2xlYXJjb2F0Um91Z2huZXNzTWFwO1xuI2VuZGlmXG4jaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgY2xlYXJjb2F0Tm9ybWFsTWFwO1xuXHR1bmlmb3JtIHZlYzIgY2xlYXJjb2F0Tm9ybWFsU2NhbGU7XG4jZW5kaWYiLHBhY2tpbmc6InZlYzMgcGFja05vcm1hbFRvUkdCKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHtcblx0cmV0dXJuIG5vcm1hbGl6ZSggbm9ybWFsICkgKiAwLjUgKyAwLjU7XG59XG52ZWMzIHVucGFja1JHQlRvTm9ybWFsKCBjb25zdCBpbiB2ZWMzIHJnYiApIHtcblx0cmV0dXJuIDIuMCAqIHJnYi54eXogLSAxLjA7XG59XG5jb25zdCBmbG9hdCBQYWNrVXBzY2FsZSA9IDI1Ni4gLyAyNTUuO2NvbnN0IGZsb2F0IFVucGFja0Rvd25zY2FsZSA9IDI1NS4gLyAyNTYuO1xuY29uc3QgdmVjMyBQYWNrRmFjdG9ycyA9IHZlYzMoIDI1Ni4gKiAyNTYuICogMjU2LiwgMjU2LiAqIDI1Ni4sIDI1Ni4gKTtcbmNvbnN0IHZlYzQgVW5wYWNrRmFjdG9ycyA9IFVucGFja0Rvd25zY2FsZSAvIHZlYzQoIFBhY2tGYWN0b3JzLCAxLiApO1xuY29uc3QgZmxvYXQgU2hpZnRSaWdodDggPSAxLiAvIDI1Ni47XG52ZWM0IHBhY2tEZXB0aFRvUkdCQSggY29uc3QgaW4gZmxvYXQgdiApIHtcblx0dmVjNCByID0gdmVjNCggZnJhY3QoIHYgKiBQYWNrRmFjdG9ycyApLCB2ICk7XG5cdHIueXp3IC09IHIueHl6ICogU2hpZnRSaWdodDg7XHRyZXR1cm4gciAqIFBhY2tVcHNjYWxlO1xufVxuZmxvYXQgdW5wYWNrUkdCQVRvRGVwdGgoIGNvbnN0IGluIHZlYzQgdiApIHtcblx0cmV0dXJuIGRvdCggdiwgVW5wYWNrRmFjdG9ycyApO1xufVxudmVjNCBwYWNrMkhhbGZUb1JHQkEoIHZlYzIgdiApIHtcblx0dmVjNCByID0gdmVjNCggdi54LCBmcmFjdCggdi54ICogMjU1LjAgKSwgdi55LCBmcmFjdCggdi55ICogMjU1LjAgKSk7XG5cdHJldHVybiB2ZWM0KCByLnggLSByLnkgLyAyNTUuMCwgci55LCByLnogLSByLncgLyAyNTUuMCwgci53KTtcbn1cbnZlYzIgdW5wYWNrUkdCQVRvMkhhbGYoIHZlYzQgdiApIHtcblx0cmV0dXJuIHZlYzIoIHYueCArICggdi55IC8gMjU1LjAgKSwgdi56ICsgKCB2LncgLyAyNTUuMCApICk7XG59XG5mbG9hdCB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiAoIHZpZXdaICsgbmVhciApIC8gKCBuZWFyIC0gZmFyICk7XG59XG5mbG9hdCBvcnRob2dyYXBoaWNEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGxpbmVhckNsaXBaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiBsaW5lYXJDbGlwWiAqICggbmVhciAtIGZhciApIC0gbmVhcjtcbn1cbmZsb2F0IHZpZXdaVG9QZXJzcGVjdGl2ZURlcHRoKCBjb25zdCBpbiBmbG9hdCB2aWV3WiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xuXHRyZXR1cm4gKCggbmVhciArIHZpZXdaICkgKiBmYXIgKSAvICgoIGZhciAtIG5lYXIgKSAqIHZpZXdaICk7XG59XG5mbG9hdCBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgaW52Q2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuICggbmVhciAqIGZhciApIC8gKCAoIGZhciAtIG5lYXIgKSAqIGludkNsaXBaIC0gZmFyICk7XG59IixwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50OiIjaWZkZWYgUFJFTVVMVElQTElFRF9BTFBIQVxuXHRnbF9GcmFnQ29sb3IucmdiICo9IGdsX0ZyYWdDb2xvci5hO1xuI2VuZGlmIixwcm9qZWN0X3ZlcnRleDoidmVjNCBtdlBvc2l0aW9uID0gdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuI2lmZGVmIFVTRV9JTlNUQU5DSU5HXG5cdG12UG9zaXRpb24gPSBpbnN0YW5jZU1hdHJpeCAqIG12UG9zaXRpb247XG4jZW5kaWZcbm12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiBtdlBvc2l0aW9uO1xuZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjsiLGRpdGhlcmluZ19mcmFnbWVudDoiI2lmZGVmIERJVEhFUklOR1xuXHRnbF9GcmFnQ29sb3IucmdiID0gZGl0aGVyaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7XG4jZW5kaWYiLGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50OiIjaWZkZWYgRElUSEVSSU5HXG5cdHZlYzMgZGl0aGVyaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRcdGZsb2F0IGdyaWRfcG9zaXRpb24gPSByYW5kKCBnbF9GcmFnQ29vcmQueHkgKTtcblx0XHR2ZWMzIGRpdGhlcl9zaGlmdF9SR0IgPSB2ZWMzKCAwLjI1IC8gMjU1LjAsIC0wLjI1IC8gMjU1LjAsIDAuMjUgLyAyNTUuMCApO1xuXHRcdGRpdGhlcl9zaGlmdF9SR0IgPSBtaXgoIDIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIC0yLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCBncmlkX3Bvc2l0aW9uICk7XG5cdFx0cmV0dXJuIGNvbG9yICsgZGl0aGVyX3NoaWZ0X1JHQjtcblx0fVxuI2VuZGlmIixyb3VnaG5lc3NtYXBfZnJhZ21lbnQ6ImZsb2F0IHJvdWdobmVzc0ZhY3RvciA9IHJvdWdobmVzcztcbiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQXG5cdHZlYzQgdGV4ZWxSb3VnaG5lc3MgPSB0ZXh0dXJlMkQoIHJvdWdobmVzc01hcCwgdlV2ICk7XG5cdHJvdWdobmVzc0ZhY3RvciAqPSB0ZXhlbFJvdWdobmVzcy5nO1xuI2VuZGlmIixyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgcm91Z2huZXNzTWFwO1xuI2VuZGlmIixzaGFkb3dtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9TSEFET1dNQVBcblx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0XHRzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodFNoYWRvdyB7XG5cdFx0XHRmbG9hdCBzaGFkb3dCaWFzO1xuXHRcdFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcblx0XHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcblx0XHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0XHR9O1xuXHRcdHVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBzcG90U2hhZG93TWFwWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZTcG90U2hhZG93Q29vcmRbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0XHRzdHJ1Y3QgU3BvdExpZ2h0U2hhZG93IHtcblx0XHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0XHRmbG9hdCBzaGFkb3dOb3JtYWxCaWFzO1xuXHRcdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHRcdH07XG5cdFx0dW5pZm9ybSBTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0U2hhZG93c1sgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIHBvaW50U2hhZG93TWFwWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2UG9pbnRTaGFkb3dDb29yZFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcblx0XHRzdHJ1Y3QgUG9pbnRMaWdodFNoYWRvdyB7XG5cdFx0XHRmbG9hdCBzaGFkb3dCaWFzO1xuXHRcdFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcblx0XHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcblx0XHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0XHRcdGZsb2F0IHNoYWRvd0NhbWVyYU5lYXI7XG5cdFx0XHRmbG9hdCBzaGFkb3dDYW1lcmFGYXI7XG5cdFx0fTtcblx0XHR1bmlmb3JtIFBvaW50TGlnaHRTaGFkb3cgcG9pbnRMaWdodFNoYWRvd3NbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHRmbG9hdCB0ZXh0dXJlMkRDb21wYXJlKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkge1xuXHRcdHJldHVybiBzdGVwKCBjb21wYXJlLCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBkZXB0aHMsIHV2ICkgKSApO1xuXHR9XG5cdHZlYzIgdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2ICkge1xuXHRcdHJldHVybiB1bnBhY2tSR0JBVG8ySGFsZiggdGV4dHVyZTJEKCBzaGFkb3csIHV2ICkgKTtcblx0fVxuXHRmbG9hdCBWU01TaGFkb3cgKHNhbXBsZXIyRCBzaGFkb3csIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKXtcblx0XHRmbG9hdCBvY2NsdXNpb24gPSAxLjA7XG5cdFx0dmVjMiBkaXN0cmlidXRpb24gPSB0ZXh0dXJlMkREaXN0cmlidXRpb24oIHNoYWRvdywgdXYgKTtcblx0XHRmbG9hdCBoYXJkX3NoYWRvdyA9IHN0ZXAoIGNvbXBhcmUgLCBkaXN0cmlidXRpb24ueCApO1xuXHRcdGlmIChoYXJkX3NoYWRvdyAhPSAxLjAgKSB7XG5cdFx0XHRmbG9hdCBkaXN0YW5jZSA9IGNvbXBhcmUgLSBkaXN0cmlidXRpb24ueCA7XG5cdFx0XHRmbG9hdCB2YXJpYW5jZSA9IG1heCggMC4wMDAwMCwgZGlzdHJpYnV0aW9uLnkgKiBkaXN0cmlidXRpb24ueSApO1xuXHRcdFx0ZmxvYXQgc29mdG5lc3NfcHJvYmFiaWxpdHkgPSB2YXJpYW5jZSAvICh2YXJpYW5jZSArIGRpc3RhbmNlICogZGlzdGFuY2UgKTtcdFx0XHRzb2Z0bmVzc19wcm9iYWJpbGl0eSA9IGNsYW1wKCAoIHNvZnRuZXNzX3Byb2JhYmlsaXR5IC0gMC4zICkgLyAoIDAuOTUgLSAwLjMgKSwgMC4wLCAxLjAgKTtcdFx0XHRvY2NsdXNpb24gPSBjbGFtcCggbWF4KCBoYXJkX3NoYWRvdywgc29mdG5lc3NfcHJvYmFiaWxpdHkgKSwgMC4wLCAxLjAgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9jY2x1c2lvbjtcblx0fVxuXHRmbG9hdCBnZXRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkICkge1xuXHRcdGZsb2F0IHNoYWRvdyA9IDEuMDtcblx0XHRzaGFkb3dDb29yZC54eXogLz0gc2hhZG93Q29vcmQudztcblx0XHRzaGFkb3dDb29yZC56ICs9IHNoYWRvd0JpYXM7XG5cdFx0YnZlYzQgaW5GcnVzdHVtVmVjID0gYnZlYzQgKCBzaGFkb3dDb29yZC54ID49IDAuMCwgc2hhZG93Q29vcmQueCA8PSAxLjAsIHNoYWRvd0Nvb3JkLnkgPj0gMC4wLCBzaGFkb3dDb29yZC55IDw9IDEuMCApO1xuXHRcdGJvb2wgaW5GcnVzdHVtID0gYWxsKCBpbkZydXN0dW1WZWMgKTtcblx0XHRidmVjMiBmcnVzdHVtVGVzdFZlYyA9IGJ2ZWMyKCBpbkZydXN0dW0sIHNoYWRvd0Nvb3JkLnogPD0gMS4wICk7XG5cdFx0Ym9vbCBmcnVzdHVtVGVzdCA9IGFsbCggZnJ1c3R1bVRlc3RWZWMgKTtcblx0XHRpZiAoIGZydXN0dW1UZXN0ICkge1xuXHRcdCNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKVxuXHRcdFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XG5cdFx0XHRmbG9hdCBkeDAgPSAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHkwID0gLSB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR4MSA9ICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTEgPSArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHgyID0gZHgwIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHkyID0gZHkwIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHgzID0gZHgxIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHkzID0gZHkxIC8gMi4wO1xuXHRcdFx0c2hhZG93ID0gKFxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgzLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApXG5cdFx0XHQpICogKCAxLjAgLyAxNy4wICk7XG5cdFx0I2VsaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKVxuXHRcdFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XG5cdFx0XHRmbG9hdCBkeCA9IHRleGVsU2l6ZS54O1xuXHRcdFx0ZmxvYXQgZHkgPSB0ZXhlbFNpemUueTtcblx0XHRcdHZlYzIgdXYgPSBzaGFkb3dDb29yZC54eTtcblx0XHRcdHZlYzIgZiA9IGZyYWN0KCB1diAqIHNoYWRvd01hcFNpemUgKyAwLjUgKTtcblx0XHRcdHV2IC09IGYgKiB0ZXhlbFNpemU7XG5cdFx0XHRzaGFkb3cgPSAoXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYsIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCBkeCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAwLjAsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB0ZXhlbFNpemUsIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdG1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIC1keCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSwgXG5cdFx0XHRcdFx0IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAyLjAgKiBkeCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSxcblx0XHRcdFx0XHQgZi54ICkgK1xuXHRcdFx0XHRtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwgXG5cdFx0XHRcdFx0IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAyLjAgKiBkeCwgZHkgKSwgc2hhZG93Q29vcmQueiApLFxuXHRcdFx0XHRcdCBmLnggKSArXG5cdFx0XHRcdG1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDAuMCwgLWR5ICksIHNoYWRvd0Nvb3JkLnogKSwgXG5cdFx0XHRcdFx0IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAwLjAsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSxcblx0XHRcdFx0XHQgZi55ICkgK1xuXHRcdFx0XHRtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCBkeCwgLWR5ICksIHNoYWRvd0Nvb3JkLnogKSwgXG5cdFx0XHRcdFx0IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCBkeCwgMi4wICogZHkgKSwgc2hhZG93Q29vcmQueiApLFxuXHRcdFx0XHRcdCBmLnkgKSArXG5cdFx0XHRcdG1peCggbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCAtZHkgKSwgc2hhZG93Q29vcmQueiApLCBcblx0XHRcdFx0XHRcdCAgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCAtZHkgKSwgc2hhZG93Q29vcmQueiApLFxuXHRcdFx0XHRcdFx0ICBmLnggKSxcblx0XHRcdFx0XHQgbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCAyLjAgKiBkeSApLCBzaGFkb3dDb29yZC56ICksIFxuXHRcdFx0XHRcdFx0ICB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSxcblx0XHRcdFx0XHRcdCAgZi54ICksXG5cdFx0XHRcdFx0IGYueSApXG5cdFx0XHQpICogKCAxLjAgLyA5LjAgKTtcblx0XHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9WU00gKVxuXHRcdFx0c2hhZG93ID0gVlNNU2hhZG93KCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHNoYWRvdyA9IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKTtcblx0XHQjZW5kaWZcblx0XHR9XG5cdFx0cmV0dXJuIHNoYWRvdztcblx0fVxuXHR2ZWMyIGN1YmVUb1VWKCB2ZWMzIHYsIGZsb2F0IHRleGVsU2l6ZVkgKSB7XG5cdFx0dmVjMyBhYnNWID0gYWJzKCB2ICk7XG5cdFx0ZmxvYXQgc2NhbGVUb0N1YmUgPSAxLjAgLyBtYXgoIGFic1YueCwgbWF4KCBhYnNWLnksIGFic1YueiApICk7XG5cdFx0YWJzViAqPSBzY2FsZVRvQ3ViZTtcblx0XHR2ICo9IHNjYWxlVG9DdWJlICogKCAxLjAgLSAyLjAgKiB0ZXhlbFNpemVZICk7XG5cdFx0dmVjMiBwbGFuYXIgPSB2Lnh5O1xuXHRcdGZsb2F0IGFsbW9zdEFUZXhlbCA9IDEuNSAqIHRleGVsU2l6ZVk7XG5cdFx0ZmxvYXQgYWxtb3N0T25lID0gMS4wIC0gYWxtb3N0QVRleGVsO1xuXHRcdGlmICggYWJzVi56ID49IGFsbW9zdE9uZSApIHtcblx0XHRcdGlmICggdi56ID4gMC4wIClcblx0XHRcdFx0cGxhbmFyLnggPSA0LjAgLSB2Lng7XG5cdFx0fSBlbHNlIGlmICggYWJzVi54ID49IGFsbW9zdE9uZSApIHtcblx0XHRcdGZsb2F0IHNpZ25YID0gc2lnbiggdi54ICk7XG5cdFx0XHRwbGFuYXIueCA9IHYueiAqIHNpZ25YICsgMi4wICogc2lnblg7XG5cdFx0fSBlbHNlIGlmICggYWJzVi55ID49IGFsbW9zdE9uZSApIHtcblx0XHRcdGZsb2F0IHNpZ25ZID0gc2lnbiggdi55ICk7XG5cdFx0XHRwbGFuYXIueCA9IHYueCArIDIuMCAqIHNpZ25ZICsgMi4wO1xuXHRcdFx0cGxhbmFyLnkgPSB2LnogKiBzaWduWSAtIDIuMDtcblx0XHR9XG5cdFx0cmV0dXJuIHZlYzIoIDAuMTI1LCAwLjI1ICkgKiBwbGFuYXIgKyB2ZWMyKCAwLjM3NSwgMC43NSApO1xuXHR9XG5cdGZsb2F0IGdldFBvaW50U2hhZG93KCBzYW1wbGVyMkQgc2hhZG93TWFwLCB2ZWMyIHNoYWRvd01hcFNpemUsIGZsb2F0IHNoYWRvd0JpYXMsIGZsb2F0IHNoYWRvd1JhZGl1cywgdmVjNCBzaGFkb3dDb29yZCwgZmxvYXQgc2hhZG93Q2FtZXJhTmVhciwgZmxvYXQgc2hhZG93Q2FtZXJhRmFyICkge1xuXHRcdHZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyAoIHNoYWRvd01hcFNpemUgKiB2ZWMyKCA0LjAsIDIuMCApICk7XG5cdFx0dmVjMyBsaWdodFRvUG9zaXRpb24gPSBzaGFkb3dDb29yZC54eXo7XG5cdFx0ZmxvYXQgZHAgPSAoIGxlbmd0aCggbGlnaHRUb1Bvc2l0aW9uICkgLSBzaGFkb3dDYW1lcmFOZWFyICkgLyAoIHNoYWRvd0NhbWVyYUZhciAtIHNoYWRvd0NhbWVyYU5lYXIgKTtcdFx0ZHAgKz0gc2hhZG93Qmlhcztcblx0XHR2ZWMzIGJkM0QgPSBub3JtYWxpemUoIGxpZ2h0VG9Qb3NpdGlvbiApO1xuXHRcdCNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApIHx8IGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1ZTTSApXG5cdFx0XHR2ZWMyIG9mZnNldCA9IHZlYzIoIC0gMSwgMSApICogc2hhZG93UmFkaXVzICogdGV4ZWxTaXplLnk7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl5LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXh5LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKVxuXHRcdFx0KSAqICggMS4wIC8gOS4wICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHJldHVybiB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWYiLHNoYWRvd21hcF9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9TSEFET1dNQVBcblx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDBcblx0XHR1bmlmb3JtIG1hdDQgZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XG5cdFx0c3RydWN0IERpcmVjdGlvbmFsTGlnaHRTaGFkb3cge1xuXHRcdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRcdGZsb2F0IHNoYWRvd05vcm1hbEJpYXM7XG5cdFx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0XHR2ZWMyIHNoYWRvd01hcFNpemU7XG5cdFx0fTtcblx0XHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwXG5cdFx0dW5pZm9ybSBtYXQ0IHNwb3RTaGFkb3dNYXRyaXhbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlNwb3RTaGFkb3dDb29yZFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHN0cnVjdCBTcG90TGlnaHRTaGFkb3cge1xuXHRcdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRcdGZsb2F0IHNoYWRvd05vcm1hbEJpYXM7XG5cdFx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0XHR2ZWMyIHNoYWRvd01hcFNpemU7XG5cdFx0fTtcblx0XHR1bmlmb3JtIFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHRTaGFkb3dzWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwXG5cdFx0dW5pZm9ybSBtYXQ0IHBvaW50U2hhZG93TWF0cml4WyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2UG9pbnRTaGFkb3dDb29yZFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcblx0XHRzdHJ1Y3QgUG9pbnRMaWdodFNoYWRvdyB7XG5cdFx0XHRmbG9hdCBzaGFkb3dCaWFzO1xuXHRcdFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcblx0XHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcblx0XHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0XHRcdGZsb2F0IHNoYWRvd0NhbWVyYU5lYXI7XG5cdFx0XHRmbG9hdCBzaGFkb3dDYW1lcmFGYXI7XG5cdFx0fTtcblx0XHR1bmlmb3JtIFBvaW50TGlnaHRTaGFkb3cgcG9pbnRMaWdodFNoYWRvd3NbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuI2VuZGlmIixzaGFkb3dtYXBfdmVydGV4OiIjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMCB8fCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMCB8fCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcblx0XHR2ZWMzIHNoYWRvd1dvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggdHJhbnNmb3JtZWROb3JtYWwsIHZpZXdNYXRyaXggKTtcblx0XHR2ZWM0IHNoYWRvd1dvcmxkUG9zaXRpb247XG5cdCNlbmRpZlxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHRzaGFkb3dXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbiArIHZlYzQoIHNoYWRvd1dvcmxkTm9ybWFsICogZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIGkgXS5zaGFkb3dOb3JtYWxCaWFzLCAwICk7XG5cdFx0dkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSA9IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBpIF0gKiBzaGFkb3dXb3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHNoYWRvd1dvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uICsgdmVjNCggc2hhZG93V29ybGROb3JtYWwgKiBzcG90TGlnaHRTaGFkb3dzWyBpIF0uc2hhZG93Tm9ybWFsQmlhcywgMCApO1xuXHRcdHZTcG90U2hhZG93Q29vcmRbIGkgXSA9IHNwb3RTaGFkb3dNYXRyaXhbIGkgXSAqIHNoYWRvd1dvcmxkUG9zaXRpb247XG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHRzaGFkb3dXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbiArIHZlYzQoIHNoYWRvd1dvcmxkTm9ybWFsICogcG9pbnRMaWdodFNoYWRvd3NbIGkgXS5zaGFkb3dOb3JtYWxCaWFzLCAwICk7XG5cdFx0dlBvaW50U2hhZG93Q29vcmRbIGkgXSA9IHBvaW50U2hhZG93TWF0cml4WyBpIF0gKiBzaGFkb3dXb3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG5cdCNlbmRpZlxuI2VuZGlmIixzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ6ImZsb2F0IGdldFNoYWRvd01hc2soKSB7XG5cdGZsb2F0IHNoYWRvdyA9IDEuMDtcblx0I2lmZGVmIFVTRV9TSEFET1dNQVBcblx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDBcblx0RGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHRkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIGkgXTtcblx0XHRzaGFkb3cgKj0gcmVjZWl2ZVNoYWRvdyA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMFxuXHRTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0c3BvdExpZ2h0ID0gc3BvdExpZ2h0U2hhZG93c1sgaSBdO1xuXHRcdHNoYWRvdyAqPSByZWNlaXZlU2hhZG93ID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcblx0UG9pbnRMaWdodFNoYWRvdyBwb2ludExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHBvaW50TGlnaHQgPSBwb2ludExpZ2h0U2hhZG93c1sgaSBdO1xuXHRcdHNoYWRvdyAqPSByZWNlaXZlU2hhZG93ID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xuXHR9XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG5cdCNlbmRpZlxuXHQjZW5kaWZcblx0cmV0dXJuIHNoYWRvdztcbn0iLHNraW5iYXNlX3ZlcnRleDoiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHRtYXQ0IGJvbmVNYXRYID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnggKTtcblx0bWF0NCBib25lTWF0WSA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC55ICk7XG5cdG1hdDQgYm9uZU1hdFogPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueiApO1xuXHRtYXQ0IGJvbmVNYXRXID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LncgKTtcbiNlbmRpZiIsc2tpbm5pbmdfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXg7XG5cdHVuaWZvcm0gbWF0NCBiaW5kTWF0cml4SW52ZXJzZTtcblx0I2lmZGVmIEJPTkVfVEVYVFVSRVxuXHRcdHVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIGJvbmVUZXh0dXJlO1xuXHRcdHVuaWZvcm0gaW50IGJvbmVUZXh0dXJlU2l6ZTtcblx0XHRtYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7XG5cdFx0XHRmbG9hdCBqID0gaSAqIDQuMDtcblx0XHRcdGZsb2F0IHggPSBtb2QoIGosIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKSApO1xuXHRcdFx0ZmxvYXQgeSA9IGZsb29yKCBqIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XG5cdFx0XHRmbG9hdCBkeCA9IDEuMCAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKTtcblx0XHRcdGZsb2F0IGR5ID0gMS4wIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xuXHRcdFx0eSA9IGR5ICogKCB5ICsgMC41ICk7XG5cdFx0XHR2ZWM0IHYxID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAwLjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHYyID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAxLjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHYzID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAyLjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHY0ID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAzLjUgKSwgeSApICk7XG5cdFx0XHRtYXQ0IGJvbmUgPSBtYXQ0KCB2MSwgdjIsIHYzLCB2NCApO1xuXHRcdFx0cmV0dXJuIGJvbmU7XG5cdFx0fVxuXHQjZWxzZVxuXHRcdHVuaWZvcm0gbWF0NCBib25lTWF0cmljZXNbIE1BWF9CT05FUyBdO1xuXHRcdG1hdDQgZ2V0Qm9uZU1hdHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHtcblx0XHRcdG1hdDQgYm9uZSA9IGJvbmVNYXRyaWNlc1sgaW50KGkpIF07XG5cdFx0XHRyZXR1cm4gYm9uZTtcblx0XHR9XG5cdCNlbmRpZlxuI2VuZGlmIixza2lubmluZ192ZXJ0ZXg6IiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0dmVjNCBza2luVmVydGV4ID0gYmluZE1hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcblx0dmVjNCBza2lubmVkID0gdmVjNCggMC4wICk7XG5cdHNraW5uZWQgKz0gYm9uZU1hdFggKiBza2luVmVydGV4ICogc2tpbldlaWdodC54O1xuXHRza2lubmVkICs9IGJvbmVNYXRZICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueTtcblx0c2tpbm5lZCArPSBib25lTWF0WiAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lno7XG5cdHNraW5uZWQgKz0gYm9uZU1hdFcgKiBza2luVmVydGV4ICogc2tpbldlaWdodC53O1xuXHR0cmFuc2Zvcm1lZCA9ICggYmluZE1hdHJpeEludmVyc2UgKiBza2lubmVkICkueHl6O1xuI2VuZGlmIixza2lubm9ybWFsX3ZlcnRleDoiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHRtYXQ0IHNraW5NYXRyaXggPSBtYXQ0KCAwLjAgKTtcblx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnggKiBib25lTWF0WDtcblx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnkgKiBib25lTWF0WTtcblx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnogKiBib25lTWF0Wjtcblx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LncgKiBib25lTWF0Vztcblx0c2tpbk1hdHJpeCA9IGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbk1hdHJpeCAqIGJpbmRNYXRyaXg7XG5cdG9iamVjdE5vcm1hbCA9IHZlYzQoIHNraW5NYXRyaXggKiB2ZWM0KCBvYmplY3ROb3JtYWwsIDAuMCApICkueHl6O1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHRvYmplY3RUYW5nZW50ID0gdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdFRhbmdlbnQsIDAuMCApICkueHl6O1xuXHQjZW5kaWZcbiNlbmRpZiIsc3BlY3VsYXJtYXBfZnJhZ21lbnQ6ImZsb2F0IHNwZWN1bGFyU3RyZW5ndGg7XG4jaWZkZWYgVVNFX1NQRUNVTEFSTUFQXG5cdHZlYzQgdGV4ZWxTcGVjdWxhciA9IHRleHR1cmUyRCggc3BlY3VsYXJNYXAsIHZVdiApO1xuXHRzcGVjdWxhclN0cmVuZ3RoID0gdGV4ZWxTcGVjdWxhci5yO1xuI2Vsc2Vcblx0c3BlY3VsYXJTdHJlbmd0aCA9IDEuMDtcbiNlbmRpZiIsc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhck1hcDtcbiNlbmRpZiIsdG9uZW1hcHBpbmdfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBUT05FX01BUFBJTkcgKVxuXHRnbF9GcmFnQ29sb3IucmdiID0gdG9uZU1hcHBpbmcoIGdsX0ZyYWdDb2xvci5yZ2IgKTtcbiNlbmRpZiIsdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudDoiI2lmbmRlZiBzYXR1cmF0ZVxuI2RlZmluZSBzYXR1cmF0ZShhKSBjbGFtcCggYSwgMC4wLCAxLjAgKVxuI2VuZGlmXG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG52ZWMzIExpbmVhclRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRyZXR1cm4gdG9uZU1hcHBpbmdFeHBvc3VyZSAqIGNvbG9yO1xufVxudmVjMyBSZWluaGFyZFRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRjb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlO1xuXHRyZXR1cm4gc2F0dXJhdGUoIGNvbG9yIC8gKCB2ZWMzKCAxLjAgKSArIGNvbG9yICkgKTtcbn1cbnZlYzMgT3B0aW1pemVkQ2luZW9uVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdGNvbG9yID0gbWF4KCB2ZWMzKCAwLjAgKSwgY29sb3IgLSAwLjAwNCApO1xuXHRyZXR1cm4gcG93KCAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDAuNSApICkgLyAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDEuNyApICsgMC4wNiApLCB2ZWMzKCAyLjIgKSApO1xufVxudmVjMyBSUlRBbmRPRFRGaXQoIHZlYzMgdiApIHtcblx0dmVjMyBhID0gdiAqICggdiArIDAuMDI0NTc4NiApIC0gMC4wMDAwOTA1Mzc7XG5cdHZlYzMgYiA9IHYgKiAoIDAuOTgzNzI5ICogdiArIDAuNDMyOTUxMCApICsgMC4yMzgwODE7XG5cdHJldHVybiBhIC8gYjtcbn1cbnZlYzMgQUNFU0ZpbG1pY1RvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRjb25zdCBtYXQzIEFDRVNJbnB1dE1hdCA9IG1hdDMoXG5cdFx0dmVjMyggMC41OTcxOSwgMC4wNzYwMCwgMC4wMjg0MCApLFx0XHR2ZWMzKCAwLjM1NDU4LCAwLjkwODM0LCAwLjEzMzgzICksXG5cdFx0dmVjMyggMC4wNDgyMywgMC4wMTU2NiwgMC44Mzc3NyApXG5cdCk7XG5cdGNvbnN0IG1hdDMgQUNFU091dHB1dE1hdCA9IG1hdDMoXG5cdFx0dmVjMyggIDEuNjA0NzUsIC0wLjEwMjA4LCAtMC4wMDMyNyApLFx0XHR2ZWMzKCAtMC41MzEwOCwgIDEuMTA4MTMsIC0wLjA3Mjc2ICksXG5cdFx0dmVjMyggLTAuMDczNjcsIC0wLjAwNjA1LCAgMS4wNzYwMiApXG5cdCk7XG5cdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmUgLyAwLjY7XG5cdGNvbG9yID0gQUNFU0lucHV0TWF0ICogY29sb3I7XG5cdGNvbG9yID0gUlJUQW5kT0RURml0KCBjb2xvciApO1xuXHRjb2xvciA9IEFDRVNPdXRwdXRNYXQgKiBjb2xvcjtcblx0cmV0dXJuIHNhdHVyYXRlKCBjb2xvciApO1xufVxudmVjMyBDdXN0b21Ub25lTWFwcGluZyggdmVjMyBjb2xvciApIHsgcmV0dXJuIGNvbG9yOyB9Iix0cmFuc21pc3Npb25fZnJhZ21lbnQ6IiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OXG5cdGZsb2F0IHRyYW5zbWlzc2lvbkZhY3RvciA9IHRyYW5zbWlzc2lvbjtcblx0ZmxvYXQgdGhpY2tuZXNzRmFjdG9yID0gdGhpY2tuZXNzO1xuXHQjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTk1BUFxuXHRcdHRyYW5zbWlzc2lvbkZhY3RvciAqPSB0ZXh0dXJlMkQoIHRyYW5zbWlzc2lvbk1hcCwgdlV2ICkucjtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfVEhJQ0tORVNTTUFQXG5cdFx0dGhpY2tuZXNzRmFjdG9yICo9IHRleHR1cmUyRCggdGhpY2tuZXNzTWFwLCB2VXYgKS5nO1xuXHQjZW5kaWZcblx0dmVjMyBwb3MgPSB2V29ybGRQb3NpdGlvbi54eXogLyB2V29ybGRQb3NpdGlvbi53O1xuXHR2ZWMzIHYgPSBub3JtYWxpemUoIGNhbWVyYVBvc2l0aW9uIC0gcG9zICk7XG5cdHZlYzMgbiA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRmbG9hdCBpb3IgPSAoIDEuMCArIDAuNCAqIHJlZmxlY3Rpdml0eSApIC8gKCAxLjAgLSAwLjQgKiByZWZsZWN0aXZpdHkgKTtcblx0dmVjMyB0cmFuc21pc3Npb24gPSB0cmFuc21pc3Npb25GYWN0b3IgKiBnZXRJQkxWb2x1bWVSZWZyYWN0aW9uKFxuXHRcdG4sIHYsIHJvdWdobmVzc0ZhY3RvciwgbWF0ZXJpYWwuZGlmZnVzZUNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLFxuXHRcdHBvcywgbW9kZWxNYXRyaXgsIHZpZXdNYXRyaXgsIHByb2plY3Rpb25NYXRyaXgsIGlvciwgdGhpY2tuZXNzRmFjdG9yLFxuXHRcdGF0dGVudWF0aW9uVGludCwgYXR0ZW51YXRpb25EaXN0YW5jZSApO1xuXHR0b3RhbERpZmZ1c2UgPSBtaXgoIHRvdGFsRGlmZnVzZSwgdHJhbnNtaXNzaW9uLCB0cmFuc21pc3Npb25GYWN0b3IgKTtcbiNlbmRpZiIsdHJhbnNtaXNzaW9uX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OXG5cdCNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OTUFQXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgdHJhbnNtaXNzaW9uTWFwO1xuXHQjZW5kaWZcblx0I2lmZGVmIFVTRV9USElDS05FU1NNQVBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCB0aGlja25lc3NNYXA7XG5cdCNlbmRpZlxuXHR1bmlmb3JtIHZlYzIgdHJhbnNtaXNzaW9uU2FtcGxlclNpemU7XG5cdHVuaWZvcm0gc2FtcGxlcjJEIHRyYW5zbWlzc2lvblNhbXBsZXJNYXA7XG5cdHVuaWZvcm0gbWF0NCBtb2RlbE1hdHJpeDtcblx0dW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7XG5cdHZhcnlpbmcgdmVjNCB2V29ybGRQb3NpdGlvbjtcblx0dmVjMyBnZXRWb2x1bWVUcmFuc21pc3Npb25SYXkodmVjMyBuLCB2ZWMzIHYsIGZsb2F0IHRoaWNrbmVzcywgZmxvYXQgaW9yLCBtYXQ0IG1vZGVsTWF0cml4KSB7XG5cdFx0dmVjMyByZWZyYWN0aW9uVmVjdG9yID0gcmVmcmFjdCgtdiwgbm9ybWFsaXplKG4pLCAxLjAgLyBpb3IpO1xuXHRcdHZlYzMgbW9kZWxTY2FsZTtcblx0XHRtb2RlbFNjYWxlLnggPSBsZW5ndGgodmVjMyhtb2RlbE1hdHJpeFswXS54eXopKTtcblx0XHRtb2RlbFNjYWxlLnkgPSBsZW5ndGgodmVjMyhtb2RlbE1hdHJpeFsxXS54eXopKTtcblx0XHRtb2RlbFNjYWxlLnogPSBsZW5ndGgodmVjMyhtb2RlbE1hdHJpeFsyXS54eXopKTtcblx0XHRyZXR1cm4gbm9ybWFsaXplKHJlZnJhY3Rpb25WZWN0b3IpICogdGhpY2tuZXNzICogbW9kZWxTY2FsZTtcblx0fVxuXHRmbG9hdCBhcHBseUlvclRvUm91Z2huZXNzKGZsb2F0IHJvdWdobmVzcywgZmxvYXQgaW9yKSB7XG5cdFx0cmV0dXJuIHJvdWdobmVzcyAqIGNsYW1wKGlvciAqIDIuMCAtIDIuMCwgMC4wLCAxLjApO1xuXHR9XG5cdHZlYzMgZ2V0VHJhbnNtaXNzaW9uU2FtcGxlKHZlYzIgZnJhZ0Nvb3JkLCBmbG9hdCByb3VnaG5lc3MsIGZsb2F0IGlvcikge1xuXHRcdGZsb2F0IGZyYW1lYnVmZmVyTG9kID0gbG9nMih0cmFuc21pc3Npb25TYW1wbGVyU2l6ZS54KSAqIGFwcGx5SW9yVG9Sb3VnaG5lc3Mocm91Z2huZXNzLCBpb3IpO1xuXHRcdHJldHVybiB0ZXh0dXJlMkRMb2RFWFQodHJhbnNtaXNzaW9uU2FtcGxlck1hcCwgZnJhZ0Nvb3JkLnh5LCBmcmFtZWJ1ZmZlckxvZCkucmdiO1xuXHR9XG5cdHZlYzMgYXBwbHlWb2x1bWVBdHRlbnVhdGlvbih2ZWMzIHJhZGlhbmNlLCBmbG9hdCB0cmFuc21pc3Npb25EaXN0YW5jZSwgdmVjMyBhdHRlbnVhdGlvbkNvbG9yLCBmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlKSB7XG5cdFx0aWYgKGF0dGVudWF0aW9uRGlzdGFuY2UgPT0gMC4wKSB7XG5cdFx0XHRyZXR1cm4gcmFkaWFuY2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZlYzMgYXR0ZW51YXRpb25Db2VmZmljaWVudCA9IC1sb2coYXR0ZW51YXRpb25Db2xvcikgLyBhdHRlbnVhdGlvbkRpc3RhbmNlO1xuXHRcdFx0dmVjMyB0cmFuc21pdHRhbmNlID0gZXhwKC1hdHRlbnVhdGlvbkNvZWZmaWNpZW50ICogdHJhbnNtaXNzaW9uRGlzdGFuY2UpO1x0XHRcdHJldHVybiB0cmFuc21pdHRhbmNlICogcmFkaWFuY2U7XG5cdFx0fVxuXHR9XG5cdHZlYzMgZ2V0SUJMVm9sdW1lUmVmcmFjdGlvbih2ZWMzIG4sIHZlYzMgdiwgZmxvYXQgcGVyY2VwdHVhbFJvdWdobmVzcywgdmVjMyBiYXNlQ29sb3IsIHZlYzMgc3BlY3VsYXJDb2xvcixcblx0XHR2ZWMzIHBvc2l0aW9uLCBtYXQ0IG1vZGVsTWF0cml4LCBtYXQ0IHZpZXdNYXRyaXgsIG1hdDQgcHJvak1hdHJpeCwgZmxvYXQgaW9yLCBmbG9hdCB0aGlja25lc3MsXG5cdFx0dmVjMyBhdHRlbnVhdGlvbkNvbG9yLCBmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlKSB7XG5cdFx0dmVjMyB0cmFuc21pc3Npb25SYXkgPSBnZXRWb2x1bWVUcmFuc21pc3Npb25SYXkobiwgdiwgdGhpY2tuZXNzLCBpb3IsIG1vZGVsTWF0cml4KTtcblx0XHR2ZWMzIHJlZnJhY3RlZFJheUV4aXQgPSBwb3NpdGlvbiArIHRyYW5zbWlzc2lvblJheTtcblx0XHR2ZWM0IG5kY1BvcyA9IHByb2pNYXRyaXggKiB2aWV3TWF0cml4ICogdmVjNChyZWZyYWN0ZWRSYXlFeGl0LCAxLjApO1xuXHRcdHZlYzIgcmVmcmFjdGlvbkNvb3JkcyA9IG5kY1Bvcy54eSAvIG5kY1Bvcy53O1xuXHRcdHJlZnJhY3Rpb25Db29yZHMgKz0gMS4wO1xuXHRcdHJlZnJhY3Rpb25Db29yZHMgLz0gMi4wO1xuXHRcdHZlYzMgdHJhbnNtaXR0ZWRMaWdodCA9IGdldFRyYW5zbWlzc2lvblNhbXBsZShyZWZyYWN0aW9uQ29vcmRzLCBwZXJjZXB0dWFsUm91Z2huZXNzLCBpb3IpO1xuXHRcdHZlYzMgYXR0ZW51YXRlZENvbG9yID0gYXBwbHlWb2x1bWVBdHRlbnVhdGlvbih0cmFuc21pdHRlZExpZ2h0LCBsZW5ndGgodHJhbnNtaXNzaW9uUmF5KSwgYXR0ZW51YXRpb25Db2xvciwgYXR0ZW51YXRpb25EaXN0YW5jZSk7XG5cdFx0cmV0dXJuICgxLjAgLSBzcGVjdWxhckNvbG9yKSAqIGF0dGVudWF0ZWRDb2xvciAqIGJhc2VDb2xvcjtcblx0fVxuI2VuZGlmIix1dl9wYXJzX2ZyYWdtZW50OiIjaWYgKCBkZWZpbmVkKCBVU0VfVVYgKSAmJiAhIGRlZmluZWQoIFVWU19WRVJURVhfT05MWSApIClcblx0dmFyeWluZyB2ZWMyIHZVdjtcbiNlbmRpZiIsdXZfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfVVZcblx0I2lmZGVmIFVWU19WRVJURVhfT05MWVxuXHRcdHZlYzIgdlV2O1xuXHQjZWxzZVxuXHRcdHZhcnlpbmcgdmVjMiB2VXY7XG5cdCNlbmRpZlxuXHR1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XG4jZW5kaWYiLHV2X3ZlcnRleDoiI2lmZGVmIFVTRV9VVlxuXHR2VXYgPSAoIHV2VHJhbnNmb3JtICogdmVjMyggdXYsIDEgKSApLnh5O1xuI2VuZGlmIix1djJfcGFyc19mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXG5cdHZhcnlpbmcgdmVjMiB2VXYyO1xuI2VuZGlmIix1djJfcGFyc192ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxuXHRhdHRyaWJ1dGUgdmVjMiB1djI7XG5cdHZhcnlpbmcgdmVjMiB2VXYyO1xuXHR1bmlmb3JtIG1hdDMgdXYyVHJhbnNmb3JtO1xuI2VuZGlmIix1djJfdmVydGV4OiIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcblx0dlV2MiA9ICggdXYyVHJhbnNmb3JtICogdmVjMyggdXYyLCAxICkgKS54eTtcbiNlbmRpZiIsd29ybGRwb3NfdmVydGV4OiIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQoIERJU1RBTkNFICkgfHwgZGVmaW5lZCAoIFVTRV9TSEFET1dNQVAgKSB8fCBkZWZpbmVkICggVVNFX1RSQU5TTUlTU0lPTiApXG5cdHZlYzQgd29ybGRQb3NpdGlvbiA9IHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcblx0I2lmZGVmIFVTRV9JTlNUQU5DSU5HXG5cdFx0d29ybGRQb3NpdGlvbiA9IGluc3RhbmNlTWF0cml4ICogd29ybGRQb3NpdGlvbjtcblx0I2VuZGlmXG5cdHdvcmxkUG9zaXRpb24gPSBtb2RlbE1hdHJpeCAqIHdvcmxkUG9zaXRpb247XG4jZW5kaWYiLGJhY2tncm91bmRfZnJhZzoidW5pZm9ybSBzYW1wbGVyMkQgdDJEO1xudmFyeWluZyB2ZWMyIHZVdjtcbnZvaWQgbWFpbigpIHtcblx0dmVjNCB0ZXhDb2xvciA9IHRleHR1cmUyRCggdDJELCB2VXYgKTtcblx0Z2xfRnJhZ0NvbG9yID0gbWFwVGV4ZWxUb0xpbmVhciggdGV4Q29sb3IgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxufSIsYmFja2dyb3VuZF92ZXJ0OiJ2YXJ5aW5nIHZlYzIgdlV2O1xudW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xudm9pZCBtYWluKCkge1xuXHR2VXYgPSAoIHV2VHJhbnNmb3JtICogdmVjMyggdXYsIDEgKSApLnh5O1xuXHRnbF9Qb3NpdGlvbiA9IHZlYzQoIHBvc2l0aW9uLnh5LCAxLjAsIDEuMCApO1xufSIsY3ViZV9mcmFnOiIjaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PlxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdHZlYzMgdlJlZmxlY3QgPSB2V29ybGREaXJlY3Rpb247XG5cdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+XG5cdGdsX0ZyYWdDb2xvciA9IGVudkNvbG9yO1xuXHRnbF9GcmFnQ29sb3IuYSAqPSBvcGFjaXR5O1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG59IixjdWJlX3ZlcnQ6InZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG4jaW5jbHVkZSA8Y29tbW9uPlxudm9pZCBtYWluKCkge1xuXHR2V29ybGREaXJlY3Rpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApO1xuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdGdsX1Bvc2l0aW9uLnogPSBnbF9Qb3NpdGlvbi53O1xufSIsZGVwdGhfZnJhZzoiI2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMFxuXHR1bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZhcnlpbmcgdmVjMiB2SGlnaFByZWNpc2lvblpXO1xudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApO1xuXHQjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXG5cdFx0ZGlmZnVzZUNvbG9yLmEgPSBvcGFjaXR5O1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdGZsb2F0IGZyYWdDb29yZFogPSAwLjUgKiB2SGlnaFByZWNpc2lvblpXWzBdIC8gdkhpZ2hQcmVjaXNpb25aV1sxXSArIDAuNTtcblx0I2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMFxuXHRcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIHZlYzMoIDEuMCAtIGZyYWdDb29yZFogKSwgb3BhY2l0eSApO1xuXHQjZWxpZiBERVBUSF9QQUNLSU5HID09IDMyMDFcblx0XHRnbF9GcmFnQ29sb3IgPSBwYWNrRGVwdGhUb1JHQkEoIGZyYWdDb29yZFogKTtcblx0I2VuZGlmXG59IixkZXB0aF92ZXJ0OiIjaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52YXJ5aW5nIHZlYzIgdkhpZ2hQcmVjaXNpb25aVztcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cblx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0XHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHRcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxuXHQjZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdHZIaWdoUHJlY2lzaW9uWlcgPSBnbF9Qb3NpdGlvbi56dztcbn0iLGRpc3RhbmNlUkdCQV9mcmFnOiIjZGVmaW5lIERJU1RBTkNFXG51bmlmb3JtIHZlYzMgcmVmZXJlbmNlUG9zaXRpb247XG51bmlmb3JtIGZsb2F0IG5lYXJEaXN0YW5jZTtcbnVuaWZvcm0gZmxvYXQgZmFyRGlzdGFuY2U7XG52YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHBhY2tpbmc+XG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluICgpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCAxLjAgKTtcblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHRmbG9hdCBkaXN0ID0gbGVuZ3RoKCB2V29ybGRQb3NpdGlvbiAtIHJlZmVyZW5jZVBvc2l0aW9uICk7XG5cdGRpc3QgPSAoIGRpc3QgLSBuZWFyRGlzdGFuY2UgKSAvICggZmFyRGlzdGFuY2UgLSBuZWFyRGlzdGFuY2UgKTtcblx0ZGlzdCA9IHNhdHVyYXRlKCBkaXN0ICk7XG5cdGdsX0ZyYWdDb2xvciA9IHBhY2tEZXB0aFRvUkdCQSggZGlzdCApO1xufSIsZGlzdGFuY2VSR0JBX3ZlcnQ6IiNkZWZpbmUgRElTVEFOQ0VcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cblx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0XHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHRcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxuXHQjZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdHZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbi54eXo7XG59IixlcXVpcmVjdF9mcmFnOiJ1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7XG52YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2luY2x1ZGUgPGNvbW1vbj5cbnZvaWQgbWFpbigpIHtcblx0dmVjMyBkaXJlY3Rpb24gPSBub3JtYWxpemUoIHZXb3JsZERpcmVjdGlvbiApO1xuXHR2ZWMyIHNhbXBsZVVWID0gZXF1aXJlY3RVdiggZGlyZWN0aW9uICk7XG5cdHZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTtcblx0Z2xfRnJhZ0NvbG9yID0gbWFwVGV4ZWxUb0xpbmVhciggdGV4Q29sb3IgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxufSIsZXF1aXJlY3RfdmVydDoidmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIDxjb21tb24+XG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cbn0iLGxpbmVkYXNoZWRfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG51bmlmb3JtIGZsb2F0IGRhc2hTaXplO1xudW5pZm9ybSBmbG9hdCB0b3RhbFNpemU7XG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0aWYgKCBtb2QoIHZMaW5lRGlzdGFuY2UsIHRvdGFsU2l6ZSApID4gZGFzaFNpemUgKSB7XG5cdFx0ZGlzY2FyZDtcblx0fVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTtcblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXHRvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cbn0iLGxpbmVkYXNoZWRfdmVydDoidW5pZm9ybSBmbG9hdCBzY2FsZTtcbmF0dHJpYnV0ZSBmbG9hdCBsaW5lRGlzdGFuY2U7XG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdHZMaW5lRGlzdGFuY2UgPSBzY2FsZSAqIGxpbmVEaXN0YW5jZTtcblx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XG59IixtZXNoYmFzaWNfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD5cblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0I2lmZGVmIFVTRV9MSUdIVE1BUFxuXHRcblx0XHR2ZWM0IGxpZ2h0TWFwVGV4ZWw9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gbGlnaHRNYXBUZXhlbFRvTGluZWFyKCBsaWdodE1hcFRleGVsICkucmdiICogbGlnaHRNYXBJbnRlbnNpdHk7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IHZlYzMoIDEuMCApO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gZGlmZnVzZUNvbG9yLnJnYjtcblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlO1xuXHQjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50PlxufSIsbWVzaGJhc2ljX3ZlcnQ6IiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cblx0I2lmIGRlZmluZWQgKCBVU0VfRU5WTUFQICkgfHwgZGVmaW5lZCAoIFVTRV9TS0lOTklORyApXG5cdFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cblx0XHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHRcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxuXHRcdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cblx0I2VuZGlmXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn0iLG1lc2hsYW1iZXJ0X2ZyYWc6InVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xudmFyeWluZyB2ZWMzIHZMaWdodEZyb250O1xudmFyeWluZyB2ZWMzIHZJbmRpcmVjdEZyb250O1xuI2lmZGVmIERPVUJMRV9TSURFRFxuXHR2YXJ5aW5nIHZlYzMgdkxpZ2h0QmFjaztcblx0dmFyeWluZyB2ZWMzIHZJbmRpcmVjdEJhY2s7XG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJzZGZzPlxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNoYWRvd21hc2tfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSAoIGdsX0Zyb250RmFjaW5nICkgPyB2SW5kaXJlY3RGcm9udCA6IHZJbmRpcmVjdEJhY2s7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IHZJbmRpcmVjdEZyb250O1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgPGxpZ2h0bWFwX2ZyYWdtZW50PlxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gQlJERl9EaWZmdXNlX0xhbWJlcnQoIGRpZmZ1c2VDb2xvci5yZ2IgKTtcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgPSAoIGdsX0Zyb250RmFjaW5nICkgPyB2TGlnaHRGcm9udCA6IHZMaWdodEJhY2s7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSA9IHZMaWdodEZyb250O1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSAqPSBCUkRGX0RpZmZ1c2VfTGFtYmVydCggZGlmZnVzZUNvbG9yLnJnYiApICogZ2V0U2hhZG93TWFzaygpO1xuXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5cdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XG59IixtZXNobGFtYmVydF92ZXJ0OiIjZGVmaW5lIExBTUJFUlRcbnZhcnlpbmcgdmVjMyB2TGlnaHRGcm9udDtcbnZhcnlpbmcgdmVjMyB2SW5kaXJlY3RGcm9udDtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dmFyeWluZyB2ZWMzIHZMaWdodEJhY2s7XG5cdHZhcnlpbmcgdmVjMyB2SW5kaXJlY3RCYWNrO1xuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8YnNkZnM+XG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx1djJfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsaWdodHNfbGFtYmVydF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn0iLG1lc2htYXRjYXBfZnJhZzoiI2RlZmluZSBNQVRDQVBcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xudW5pZm9ybSBzYW1wbGVyMkQgbWF0Y2FwO1xudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxuXHR2ZWMzIHZpZXdEaXIgPSBub3JtYWxpemUoIHZWaWV3UG9zaXRpb24gKTtcblx0dmVjMyB4ID0gbm9ybWFsaXplKCB2ZWMzKCB2aWV3RGlyLnosIDAuMCwgLSB2aWV3RGlyLnggKSApO1xuXHR2ZWMzIHkgPSBjcm9zcyggdmlld0RpciwgeCApO1xuXHR2ZWMyIHV2ID0gdmVjMiggZG90KCB4LCBub3JtYWwgKSwgZG90KCB5LCBub3JtYWwgKSApICogMC40OTUgKyAwLjU7XG5cdCNpZmRlZiBVU0VfTUFUQ0FQXG5cdFx0dmVjNCBtYXRjYXBDb2xvciA9IHRleHR1cmUyRCggbWF0Y2FwLCB1diApO1xuXHRcdG1hdGNhcENvbG9yID0gbWF0Y2FwVGV4ZWxUb0xpbmVhciggbWF0Y2FwQ29sb3IgKTtcblx0I2Vsc2Vcblx0XHR2ZWM0IG1hdGNhcENvbG9yID0gdmVjNCggMS4wICk7XG5cdCNlbmRpZlxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiICogbWF0Y2FwQ29sb3IucmdiO1xuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50PlxufSIsbWVzaG1hdGNhcF92ZXJ0OiIjZGVmaW5lIE1BVENBUFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cblx0I2lmbmRlZiBGTEFUX1NIQURFRFxuXHRcdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG5cdFx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0XHR2VGFuZ2VudCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWRUYW5nZW50ICk7XG5cdFx0XHR2Qml0YW5nZW50ID0gbm9ybWFsaXplKCBjcm9zcyggdk5vcm1hbCwgdlRhbmdlbnQgKSAqIHRhbmdlbnQudyApO1xuXHRcdCNlbmRpZlxuXHQjZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxuXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcbn0iLG1lc2h0b29uX2ZyYWc6IiNkZWZpbmUgVE9PTlxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHBhY2tpbmc+XG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Z3JhZGllbnRtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxic2Rmcz5cbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cbiNpbmNsdWRlIDxsaWdodHNfdG9vbl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxuXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxsaWdodHNfdG9vbl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9iZWdpbj5cblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD5cblx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50PlxufSIsbWVzaHRvb25fdmVydDoiI2RlZmluZSBUT09OXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuI2VuZGlmXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufSIsbWVzaHBob25nX2ZyYWc6IiNkZWZpbmUgUEhPTkdcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xudW5pZm9ybSB2ZWMzIHNwZWN1bGFyO1xudW5pZm9ybSBmbG9hdCBzaGluaW5lc3M7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHBhY2tpbmc+XG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxic2Rmcz5cbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cbiNpbmNsdWRlIDxsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPlxuXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XG5cdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGxpZ2h0c19waG9uZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9iZWdpbj5cblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD5cblx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xuXHQjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50PlxufSIsbWVzaHBob25nX3ZlcnQ6IiNkZWZpbmUgUEhPTkdcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuI2VuZGlmXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn0iLG1lc2hwaHlzaWNhbF9mcmFnOiIjZGVmaW5lIFNUQU5EQVJEXG4jaWZkZWYgUEhZU0lDQUxcblx0I2RlZmluZSBSRUZMRUNUSVZJVFlcblx0I2RlZmluZSBDTEVBUkNPQVRcblx0I2RlZmluZSBTUEVDVUxBUlxuI2VuZGlmXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcbnVuaWZvcm0gZmxvYXQgcm91Z2huZXNzO1xudW5pZm9ybSBmbG9hdCBtZXRhbG5lc3M7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaWZkZWYgVVNFX1RSQU5TTUlTU0lPTlxuXHR1bmlmb3JtIGZsb2F0IHRyYW5zbWlzc2lvbjtcblx0dW5pZm9ybSBmbG9hdCB0aGlja25lc3M7XG5cdHVuaWZvcm0gZmxvYXQgYXR0ZW51YXRpb25EaXN0YW5jZTtcblx0dW5pZm9ybSB2ZWMzIGF0dGVudWF0aW9uVGludDtcbiNlbmRpZlxuI2lmZGVmIFJFRkxFQ1RJVklUWVxuXHR1bmlmb3JtIGZsb2F0IHJlZmxlY3Rpdml0eTtcbiNlbmRpZlxuI2lmZGVmIFNQRUNVTEFSXG5cdHVuaWZvcm0gZmxvYXQgc3BlY3VsYXJJbnRlbnNpdHk7XG5cdHVuaWZvcm0gdmVjMyBzcGVjdWxhclRpbnQ7XG5cdCNpZmRlZiBVU0VfU1BFQ1VMQVJJTlRFTlNJVFlNQVBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhckludGVuc2l0eU1hcDtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfU1BFQ1VMQVJUSU5UTUFQXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgc3BlY3VsYXJUaW50TWFwO1xuXHQjZW5kaWZcbiNlbmRpZlxuI2lmZGVmIENMRUFSQ09BVFxuXHR1bmlmb3JtIGZsb2F0IGNsZWFyY29hdDtcblx0dW5pZm9ybSBmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7XG4jZW5kaWZcbiNpZmRlZiBVU0VfU0hFRU5cblx0dW5pZm9ybSB2ZWMzIHNoZWVuO1xuI2VuZGlmXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxic2Rmcz5cbiNpbmNsdWRlIDx0cmFuc21pc3Npb25fcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxuI2luY2x1ZGUgPGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGVhcmNvYXRfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPHJvdWdobmVzc21hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG1ldGFsbmVzc21hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxuXHQjaW5jbHVkZSA8Y2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9iZWdpbj5cblx0I2luY2x1ZGUgPGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwcz5cblx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+XG5cdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPlxuXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XG5cdHZlYzMgdG90YWxEaWZmdXNlID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZTtcblx0dmVjMyB0b3RhbFNwZWN1bGFyID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyO1xuXHQjaW5jbHVkZSA8dHJhbnNtaXNzaW9uX2ZyYWdtZW50PlxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSB0b3RhbERpZmZ1c2UgKyB0b3RhbFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50PlxufSIsbWVzaHBoeXNpY2FsX3ZlcnQ6IiNkZWZpbmUgU1RBTkRBUkRcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZlxuI2lmZGVmIFVTRV9UUkFOU01JU1NJT05cblx0dmFyeWluZyB2ZWM0IHZXb3JsZFBvc2l0aW9uO1xuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx1djJfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dlRhbmdlbnQgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkVGFuZ2VudCApO1xuXHRcdHZCaXRhbmdlbnQgPSBub3JtYWxpemUoIGNyb3NzKCB2Tm9ybWFsLCB2VGFuZ2VudCApICogdGFuZ2VudC53ICk7XG5cdCNlbmRpZlxuI2VuZGlmXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxuI2lmZGVmIFVTRV9UUkFOU01JU1NJT05cblx0dldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uO1xuI2VuZGlmXG59Iixub3JtYWxfZnJhZzoiI2RlZmluZSBOT1JNQUxcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz5cblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggcGFja05vcm1hbFRvUkdCKCBub3JtYWwgKSwgb3BhY2l0eSApO1xufSIsbm9ybWFsX3ZlcnQ6IiNkZWZpbmUgTk9STUFMXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKVxuXHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNlbmRpZlxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dlRhbmdlbnQgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkVGFuZ2VudCApO1xuXHRcdHZCaXRhbmdlbnQgPSBub3JtYWxpemUoIGNyb3NzKCB2Tm9ybWFsLCB2VGFuZ2VudCApICogdGFuZ2VudC53ICk7XG5cdCNlbmRpZlxuI2VuZGlmXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XG4jZW5kaWZcbn0iLHBvaW50c19mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTtcblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG1hcF9wYXJ0aWNsZV9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHRvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cbn0iLHBvaW50c192ZXJ0OiJ1bmlmb3JtIGZsb2F0IHNpemU7XG51bmlmb3JtIGZsb2F0IHNjYWxlO1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdGdsX1BvaW50U2l6ZSA9IHNpemU7XG5cdCNpZmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OXG5cdFx0Ym9vbCBpc1BlcnNwZWN0aXZlID0gaXNQZXJzcGVjdGl2ZU1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApO1xuXHRcdGlmICggaXNQZXJzcGVjdGl2ZSApIGdsX1BvaW50U2l6ZSAqPSAoIHNjYWxlIC8gLSBtdlBvc2l0aW9uLnogKTtcblx0I2VuZGlmXG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn0iLHNoYWRvd19mcmFnOiJ1bmlmb3JtIHZlYzMgY29sb3I7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHBhY2tpbmc+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YnNkZnM+XG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFza19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBjb2xvciwgb3BhY2l0eSAqICggMS4wIC0gZ2V0U2hhZG93TWFzaygpICkgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxufSIsc2hhZG93X3ZlcnQ6IiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufSIsc3ByaXRlX2ZyYWc6InVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0b3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cbn0iLHNwcml0ZV92ZXJ0OiJ1bmlmb3JtIGZsb2F0IHJvdGF0aW9uO1xudW5pZm9ybSB2ZWMyIGNlbnRlcjtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0dmVjNCBtdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7XG5cdHZlYzIgc2NhbGU7XG5cdHNjYWxlLnggPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAwIF0ueCwgbW9kZWxNYXRyaXhbIDAgXS55LCBtb2RlbE1hdHJpeFsgMCBdLnogKSApO1xuXHRzY2FsZS55ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMSBdLngsIG1vZGVsTWF0cml4WyAxIF0ueSwgbW9kZWxNYXRyaXhbIDEgXS56ICkgKTtcblx0I2lmbmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OXG5cdFx0Ym9vbCBpc1BlcnNwZWN0aXZlID0gaXNQZXJzcGVjdGl2ZU1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApO1xuXHRcdGlmICggaXNQZXJzcGVjdGl2ZSApIHNjYWxlICo9IC0gbXZQb3NpdGlvbi56O1xuXHQjZW5kaWZcblx0dmVjMiBhbGlnbmVkUG9zaXRpb24gPSAoIHBvc2l0aW9uLnh5IC0gKCBjZW50ZXIgLSB2ZWMyKCAwLjUgKSApICkgKiBzY2FsZTtcblx0dmVjMiByb3RhdGVkUG9zaXRpb247XG5cdHJvdGF0ZWRQb3NpdGlvbi54ID0gY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggLSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTtcblx0cm90YXRlZFBvc2l0aW9uLnkgPSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCArIGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55O1xuXHRtdlBvc2l0aW9uLnh5ICs9IHJvdGF0ZWRQb3NpdGlvbjtcblx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufSJ9LHpzdD17Y29tbW9uOntkaWZmdXNlOnt2YWx1ZTpuZXcgUnJ0KDE2Nzc3MjE1KX0sb3BhY2l0eTp7dmFsdWU6MX0sbWFwOnt2YWx1ZTpudWxsfSx1dlRyYW5zZm9ybTp7dmFsdWU6bmV3ICRpdH0sdXYyVHJhbnNmb3JtOnt2YWx1ZTpuZXcgJGl0fSxhbHBoYU1hcDp7dmFsdWU6bnVsbH19LHNwZWN1bGFybWFwOntzcGVjdWxhck1hcDp7dmFsdWU6bnVsbH19LGVudm1hcDp7ZW52TWFwOnt2YWx1ZTpudWxsfSxmbGlwRW52TWFwOnt2YWx1ZTotMX0scmVmbGVjdGl2aXR5Ont2YWx1ZToxfSxyZWZyYWN0aW9uUmF0aW86e3ZhbHVlOi45OH0sbWF4TWlwTGV2ZWw6e3ZhbHVlOjB9fSxhb21hcDp7YW9NYXA6e3ZhbHVlOm51bGx9LGFvTWFwSW50ZW5zaXR5Ont2YWx1ZToxfX0sbGlnaHRtYXA6e2xpZ2h0TWFwOnt2YWx1ZTpudWxsfSxsaWdodE1hcEludGVuc2l0eTp7dmFsdWU6MX19LGVtaXNzaXZlbWFwOntlbWlzc2l2ZU1hcDp7dmFsdWU6bnVsbH19LGJ1bXBtYXA6e2J1bXBNYXA6e3ZhbHVlOm51bGx9LGJ1bXBTY2FsZTp7dmFsdWU6MX19LG5vcm1hbG1hcDp7bm9ybWFsTWFwOnt2YWx1ZTpudWxsfSxub3JtYWxTY2FsZTp7dmFsdWU6bmV3IFFpdCgxLDEpfX0sZGlzcGxhY2VtZW50bWFwOntkaXNwbGFjZW1lbnRNYXA6e3ZhbHVlOm51bGx9LGRpc3BsYWNlbWVudFNjYWxlOnt2YWx1ZToxfSxkaXNwbGFjZW1lbnRCaWFzOnt2YWx1ZTowfX0scm91Z2huZXNzbWFwOntyb3VnaG5lc3NNYXA6e3ZhbHVlOm51bGx9fSxtZXRhbG5lc3NtYXA6e21ldGFsbmVzc01hcDp7dmFsdWU6bnVsbH19LGdyYWRpZW50bWFwOntncmFkaWVudE1hcDp7dmFsdWU6bnVsbH19LGZvZzp7Zm9nRGVuc2l0eTp7dmFsdWU6MjVlLTV9LGZvZ05lYXI6e3ZhbHVlOjF9LGZvZ0Zhcjp7dmFsdWU6MmUzfSxmb2dDb2xvcjp7dmFsdWU6bmV3IFJydCgxNjc3NzIxNSl9fSxsaWdodHM6e2FtYmllbnRMaWdodENvbG9yOnt2YWx1ZTpbXX0sbGlnaHRQcm9iZTp7dmFsdWU6W119LGRpcmVjdGlvbmFsTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntkaXJlY3Rpb246e30sY29sb3I6e319fSxkaXJlY3Rpb25hbExpZ2h0U2hhZG93czp7dmFsdWU6W10scHJvcGVydGllczp7c2hhZG93Qmlhczp7fSxzaGFkb3dOb3JtYWxCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9fX0sZGlyZWN0aW9uYWxTaGFkb3dNYXA6e3ZhbHVlOltdfSxkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDp7dmFsdWU6W119LHNwb3RMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2NvbG9yOnt9LHBvc2l0aW9uOnt9LGRpcmVjdGlvbjp7fSxkaXN0YW5jZTp7fSxjb25lQ29zOnt9LHBlbnVtYnJhQ29zOnt9LGRlY2F5Ont9fX0sc3BvdExpZ2h0U2hhZG93czp7dmFsdWU6W10scHJvcGVydGllczp7c2hhZG93Qmlhczp7fSxzaGFkb3dOb3JtYWxCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9fX0sc3BvdFNoYWRvd01hcDp7dmFsdWU6W119LHNwb3RTaGFkb3dNYXRyaXg6e3ZhbHVlOltdfSxwb2ludExpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7Y29sb3I6e30scG9zaXRpb246e30sZGVjYXk6e30sZGlzdGFuY2U6e319fSxwb2ludExpZ2h0U2hhZG93czp7dmFsdWU6W10scHJvcGVydGllczp7c2hhZG93Qmlhczp7fSxzaGFkb3dOb3JtYWxCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9LHNoYWRvd0NhbWVyYU5lYXI6e30sc2hhZG93Q2FtZXJhRmFyOnt9fX0scG9pbnRTaGFkb3dNYXA6e3ZhbHVlOltdfSxwb2ludFNoYWRvd01hdHJpeDp7dmFsdWU6W119LGhlbWlzcGhlcmVMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2RpcmVjdGlvbjp7fSxza3lDb2xvcjp7fSxncm91bmRDb2xvcjp7fX19LHJlY3RBcmVhTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSxwb3NpdGlvbjp7fSx3aWR0aDp7fSxoZWlnaHQ6e319fSxsdGNfMTp7dmFsdWU6bnVsbH0sbHRjXzI6e3ZhbHVlOm51bGx9fSxwb2ludHM6e2RpZmZ1c2U6e3ZhbHVlOm5ldyBScnQoMTY3NzcyMTUpfSxvcGFjaXR5Ont2YWx1ZToxfSxzaXplOnt2YWx1ZToxfSxzY2FsZTp7dmFsdWU6MX0sbWFwOnt2YWx1ZTpudWxsfSxhbHBoYU1hcDp7dmFsdWU6bnVsbH0sdXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyAkaXR9fSxzcHJpdGU6e2RpZmZ1c2U6e3ZhbHVlOm5ldyBScnQoMTY3NzcyMTUpfSxvcGFjaXR5Ont2YWx1ZToxfSxjZW50ZXI6e3ZhbHVlOm5ldyBRaXQoLjUsLjUpfSxyb3RhdGlvbjp7dmFsdWU6MH0sbWFwOnt2YWx1ZTpudWxsfSxhbHBoYU1hcDp7dmFsdWU6bnVsbH0sdXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyAkaXR9fX0sSXN0PXtiYXNpYzp7dW5pZm9ybXM6Z3N0KFt6c3QuY29tbW9uLHpzdC5zcGVjdWxhcm1hcCx6c3QuZW52bWFwLHpzdC5hb21hcCx6c3QubGlnaHRtYXAsenN0LmZvZ10pLHZlcnRleFNoYWRlcjpOc3QubWVzaGJhc2ljX3ZlcnQsZnJhZ21lbnRTaGFkZXI6TnN0Lm1lc2hiYXNpY19mcmFnfSxsYW1iZXJ0Ont1bmlmb3Jtczpnc3QoW3pzdC5jb21tb24senN0LnNwZWN1bGFybWFwLHpzdC5lbnZtYXAsenN0LmFvbWFwLHpzdC5saWdodG1hcCx6c3QuZW1pc3NpdmVtYXAsenN0LmZvZyx6c3QubGlnaHRzLHtlbWlzc2l2ZTp7dmFsdWU6bmV3IFJydCgwKX19XSksdmVydGV4U2hhZGVyOk5zdC5tZXNobGFtYmVydF92ZXJ0LGZyYWdtZW50U2hhZGVyOk5zdC5tZXNobGFtYmVydF9mcmFnfSxwaG9uZzp7dW5pZm9ybXM6Z3N0KFt6c3QuY29tbW9uLHpzdC5zcGVjdWxhcm1hcCx6c3QuZW52bWFwLHpzdC5hb21hcCx6c3QubGlnaHRtYXAsenN0LmVtaXNzaXZlbWFwLHpzdC5idW1wbWFwLHpzdC5ub3JtYWxtYXAsenN0LmRpc3BsYWNlbWVudG1hcCx6c3QuZm9nLHpzdC5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgUnJ0KDApfSxzcGVjdWxhcjp7dmFsdWU6bmV3IFJydCgxMTE4NDgxKX0sc2hpbmluZXNzOnt2YWx1ZTozMH19XSksdmVydGV4U2hhZGVyOk5zdC5tZXNocGhvbmdfdmVydCxmcmFnbWVudFNoYWRlcjpOc3QubWVzaHBob25nX2ZyYWd9LHN0YW5kYXJkOnt1bmlmb3Jtczpnc3QoW3pzdC5jb21tb24senN0LmVudm1hcCx6c3QuYW9tYXAsenN0LmxpZ2h0bWFwLHpzdC5lbWlzc2l2ZW1hcCx6c3QuYnVtcG1hcCx6c3Qubm9ybWFsbWFwLHpzdC5kaXNwbGFjZW1lbnRtYXAsenN0LnJvdWdobmVzc21hcCx6c3QubWV0YWxuZXNzbWFwLHpzdC5mb2csenN0LmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyBScnQoMCl9LHJvdWdobmVzczp7dmFsdWU6MX0sbWV0YWxuZXNzOnt2YWx1ZTowfSxlbnZNYXBJbnRlbnNpdHk6e3ZhbHVlOjF9fV0pLHZlcnRleFNoYWRlcjpOc3QubWVzaHBoeXNpY2FsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6TnN0Lm1lc2hwaHlzaWNhbF9mcmFnfSx0b29uOnt1bmlmb3Jtczpnc3QoW3pzdC5jb21tb24senN0LmFvbWFwLHpzdC5saWdodG1hcCx6c3QuZW1pc3NpdmVtYXAsenN0LmJ1bXBtYXAsenN0Lm5vcm1hbG1hcCx6c3QuZGlzcGxhY2VtZW50bWFwLHpzdC5ncmFkaWVudG1hcCx6c3QuZm9nLHpzdC5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgUnJ0KDApfX1dKSx2ZXJ0ZXhTaGFkZXI6TnN0Lm1lc2h0b29uX3ZlcnQsZnJhZ21lbnRTaGFkZXI6TnN0Lm1lc2h0b29uX2ZyYWd9LG1hdGNhcDp7dW5pZm9ybXM6Z3N0KFt6c3QuY29tbW9uLHpzdC5idW1wbWFwLHpzdC5ub3JtYWxtYXAsenN0LmRpc3BsYWNlbWVudG1hcCx6c3QuZm9nLHttYXRjYXA6e3ZhbHVlOm51bGx9fV0pLHZlcnRleFNoYWRlcjpOc3QubWVzaG1hdGNhcF92ZXJ0LGZyYWdtZW50U2hhZGVyOk5zdC5tZXNobWF0Y2FwX2ZyYWd9LHBvaW50czp7dW5pZm9ybXM6Z3N0KFt6c3QucG9pbnRzLHpzdC5mb2ddKSx2ZXJ0ZXhTaGFkZXI6TnN0LnBvaW50c192ZXJ0LGZyYWdtZW50U2hhZGVyOk5zdC5wb2ludHNfZnJhZ30sZGFzaGVkOnt1bmlmb3Jtczpnc3QoW3pzdC5jb21tb24senN0LmZvZyx7c2NhbGU6e3ZhbHVlOjF9LGRhc2hTaXplOnt2YWx1ZToxfSx0b3RhbFNpemU6e3ZhbHVlOjJ9fV0pLHZlcnRleFNoYWRlcjpOc3QubGluZWRhc2hlZF92ZXJ0LGZyYWdtZW50U2hhZGVyOk5zdC5saW5lZGFzaGVkX2ZyYWd9LGRlcHRoOnt1bmlmb3Jtczpnc3QoW3pzdC5jb21tb24senN0LmRpc3BsYWNlbWVudG1hcF0pLHZlcnRleFNoYWRlcjpOc3QuZGVwdGhfdmVydCxmcmFnbWVudFNoYWRlcjpOc3QuZGVwdGhfZnJhZ30sbm9ybWFsOnt1bmlmb3Jtczpnc3QoW3pzdC5jb21tb24senN0LmJ1bXBtYXAsenN0Lm5vcm1hbG1hcCx6c3QuZGlzcGxhY2VtZW50bWFwLHtvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6TnN0Lm5vcm1hbF92ZXJ0LGZyYWdtZW50U2hhZGVyOk5zdC5ub3JtYWxfZnJhZ30sc3ByaXRlOnt1bmlmb3Jtczpnc3QoW3pzdC5zcHJpdGUsenN0LmZvZ10pLHZlcnRleFNoYWRlcjpOc3Quc3ByaXRlX3ZlcnQsZnJhZ21lbnRTaGFkZXI6TnN0LnNwcml0ZV9mcmFnfSxiYWNrZ3JvdW5kOnt1bmlmb3Jtczp7dXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyAkaXR9LHQyRDp7dmFsdWU6bnVsbH19LHZlcnRleFNoYWRlcjpOc3QuYmFja2dyb3VuZF92ZXJ0LGZyYWdtZW50U2hhZGVyOk5zdC5iYWNrZ3JvdW5kX2ZyYWd9LGN1YmU6e3VuaWZvcm1zOmdzdChbenN0LmVudm1hcCx7b3BhY2l0eTp7dmFsdWU6MX19XSksdmVydGV4U2hhZGVyOk5zdC5jdWJlX3ZlcnQsZnJhZ21lbnRTaGFkZXI6TnN0LmN1YmVfZnJhZ30sZXF1aXJlY3Q6e3VuaWZvcm1zOnt0RXF1aXJlY3Q6e3ZhbHVlOm51bGx9fSx2ZXJ0ZXhTaGFkZXI6TnN0LmVxdWlyZWN0X3ZlcnQsZnJhZ21lbnRTaGFkZXI6TnN0LmVxdWlyZWN0X2ZyYWd9LGRpc3RhbmNlUkdCQTp7dW5pZm9ybXM6Z3N0KFt6c3QuY29tbW9uLHpzdC5kaXNwbGFjZW1lbnRtYXAse3JlZmVyZW5jZVBvc2l0aW9uOnt2YWx1ZTpuZXcgY2F0fSxuZWFyRGlzdGFuY2U6e3ZhbHVlOjF9LGZhckRpc3RhbmNlOnt2YWx1ZToxZTN9fV0pLHZlcnRleFNoYWRlcjpOc3QuZGlzdGFuY2VSR0JBX3ZlcnQsZnJhZ21lbnRTaGFkZXI6TnN0LmRpc3RhbmNlUkdCQV9mcmFnfSxzaGFkb3c6e3VuaWZvcm1zOmdzdChbenN0LmxpZ2h0cyx6c3QuZm9nLHtjb2xvcjp7dmFsdWU6bmV3IFJydCgwKX0sb3BhY2l0eTp7dmFsdWU6MX19XSksdmVydGV4U2hhZGVyOk5zdC5zaGFkb3dfdmVydCxmcmFnbWVudFNoYWRlcjpOc3Quc2hhZG93X2ZyYWd9fTtmdW5jdGlvbiBIc3QodCxlLG4sbyxpKXtjb25zdCBhPW5ldyBScnQoMCk7bGV0IHIscyxsPTAsYz1udWxsLGQ9MCxwPW51bGw7ZnVuY3Rpb24gbSh0LGUpe24uYnVmZmVycy5jb2xvci5zZXRDbGVhcih0LnIsdC5nLHQuYixlLGkpfXJldHVybntnZXRDbGVhckNvbG9yOmZ1bmN0aW9uKCl7cmV0dXJuIGF9LHNldENsZWFyQ29sb3I6ZnVuY3Rpb24odCxlPTEpe2Euc2V0KHQpLGw9ZSxtKGEsbCl9LGdldENsZWFyQWxwaGE6ZnVuY3Rpb24oKXtyZXR1cm4gbH0sc2V0Q2xlYXJBbHBoYTpmdW5jdGlvbih0KXtsPXQsbShhLGwpfSxyZW5kZXI6ZnVuY3Rpb24gdShuLGkpe2xldCB1PSExLGY9ITA9PT1pLmlzU2NlbmU/aS5iYWNrZ3JvdW5kOm51bGw7ZiYmZi5pc1RleHR1cmUmJihmPWUuZ2V0KGYpKTtjb25zdCBnPXQueHIsaD1nLmdldFNlc3Npb24mJmcuZ2V0U2Vzc2lvbigpO2gmJiJhZGRpdGl2ZSI9PT1oLmVudmlyb25tZW50QmxlbmRNb2RlJiYoZj1udWxsKSxudWxsPT09Zj9tKGEsbCk6ZiYmZi5pc0NvbG9yJiYobShmLDEpLHU9ITApLCh0LmF1dG9DbGVhcnx8dSkmJnQuY2xlYXIodC5hdXRvQ2xlYXJDb2xvcix0LmF1dG9DbGVhckRlcHRoLHQuYXV0b0NsZWFyU3RlbmNpbCksZiYmKGYuaXNDdWJlVGV4dHVyZXx8Zi5tYXBwaW5nPT09bWl0KT8odm9pZCAwPT09cyYmKHM9bmV3IHBzdChuZXcgdXN0KDEsMSwxKSxuZXcgYnN0KHtuYW1lOiJCYWNrZ3JvdW5kQ3ViZU1hdGVyaWFsIix1bmlmb3Jtczpmc3QoSXN0LmN1YmUudW5pZm9ybXMpLHZlcnRleFNoYWRlcjpJc3QuY3ViZS52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6SXN0LmN1YmUuZnJhZ21lbnRTaGFkZXIsc2lkZToxLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExLGZvZzohMX0pKSxzLmdlb21ldHJ5LmRlbGV0ZUF0dHJpYnV0ZSgibm9ybWFsIikscy5nZW9tZXRyeS5kZWxldGVBdHRyaWJ1dGUoInV2Iikscy5vbkJlZm9yZVJlbmRlcj1mdW5jdGlvbih0LGUsbil7dGhpcy5tYXRyaXhXb3JsZC5jb3B5UG9zaXRpb24obi5tYXRyaXhXb3JsZCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLm1hdGVyaWFsLCJlbnZNYXAiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy5lbnZNYXAudmFsdWV9fSksby51cGRhdGUocykpLHMubWF0ZXJpYWwudW5pZm9ybXMuZW52TWFwLnZhbHVlPWYscy5tYXRlcmlhbC51bmlmb3Jtcy5mbGlwRW52TWFwLnZhbHVlPWYuaXNDdWJlVGV4dHVyZSYmITE9PT1mLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT8tMToxLGM9PT1mJiZkPT09Zi52ZXJzaW9uJiZwPT09dC50b25lTWFwcGluZ3x8KHMubWF0ZXJpYWwubmVlZHNVcGRhdGU9ITAsYz1mLGQ9Zi52ZXJzaW9uLHA9dC50b25lTWFwcGluZyksbi51bnNoaWZ0KHMscy5nZW9tZXRyeSxzLm1hdGVyaWFsLDAsMCxudWxsKSk6ZiYmZi5pc1RleHR1cmUmJih2b2lkIDA9PT1yJiYocj1uZXcgcHN0KG5ldyBUc3QoMiwyKSxuZXcgYnN0KHtuYW1lOiJCYWNrZ3JvdW5kTWF0ZXJpYWwiLHVuaWZvcm1zOmZzdChJc3QuYmFja2dyb3VuZC51bmlmb3JtcyksdmVydGV4U2hhZGVyOklzdC5iYWNrZ3JvdW5kLnZlcnRleFNoYWRlcixmcmFnbWVudFNoYWRlcjpJc3QuYmFja2dyb3VuZC5mcmFnbWVudFNoYWRlcixzaWRlOjAsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsZm9nOiExfSkpLHIuZ2VvbWV0cnkuZGVsZXRlQXR0cmlidXRlKCJub3JtYWwiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoci5tYXRlcmlhbCwibWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMudDJELnZhbHVlfX0pLG8udXBkYXRlKHIpKSxyLm1hdGVyaWFsLnVuaWZvcm1zLnQyRC52YWx1ZT1mLCEwPT09Zi5tYXRyaXhBdXRvVXBkYXRlJiZmLnVwZGF0ZU1hdHJpeCgpLHIubWF0ZXJpYWwudW5pZm9ybXMudXZUcmFuc2Zvcm0udmFsdWUuY29weShmLm1hdHJpeCksYz09PWYmJmQ9PT1mLnZlcnNpb24mJnA9PT10LnRvbmVNYXBwaW5nfHwoci5tYXRlcmlhbC5uZWVkc1VwZGF0ZT0hMCxjPWYsZD1mLnZlcnNpb24scD10LnRvbmVNYXBwaW5nKSxuLnVuc2hpZnQocixyLmdlb21ldHJ5LHIubWF0ZXJpYWwsMCwwLG51bGwpKX19fWZ1bmN0aW9uIEZzdCh0LGUsbixvKXtjb25zdCBpPXQuZ2V0UGFyYW1ldGVyKDM0OTIxKSxhPW8uaXNXZWJHTDI/bnVsbDplLmdldCgiT0VTX3ZlcnRleF9hcnJheV9vYmplY3QiKSxyPW8uaXNXZWJHTDJ8fG51bGwhPT1hLHM9e30sbD1tKG51bGwpO2xldCBjPWw7ZnVuY3Rpb24gZChlKXtyZXR1cm4gby5pc1dlYkdMMj90LmJpbmRWZXJ0ZXhBcnJheShlKTphLmJpbmRWZXJ0ZXhBcnJheU9FUyhlKX1mdW5jdGlvbiBwKGUpe3JldHVybiBvLmlzV2ViR0wyP3QuZGVsZXRlVmVydGV4QXJyYXkoZSk6YS5kZWxldGVWZXJ0ZXhBcnJheU9FUyhlKX1mdW5jdGlvbiBtKHQpe2NvbnN0IGU9W10sbj1bXSxvPVtdO2ZvcihsZXQgdD0wO3Q8aTt0KyspZVt0XT0wLG5bdF09MCxvW3RdPTA7cmV0dXJue2dlb21ldHJ5Om51bGwscHJvZ3JhbTpudWxsLHdpcmVmcmFtZTohMSxuZXdBdHRyaWJ1dGVzOmUsZW5hYmxlZEF0dHJpYnV0ZXM6bixhdHRyaWJ1dGVEaXZpc29yczpvLG9iamVjdDp0LGF0dHJpYnV0ZXM6e30saW5kZXg6bnVsbH19ZnVuY3Rpb24gdSgpe2NvbnN0IHQ9Yy5uZXdBdHRyaWJ1dGVzO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl0W2VdPTB9ZnVuY3Rpb24gZih0KXtnKHQsMCl9ZnVuY3Rpb24gZyhuLGkpe2NvbnN0IGE9Yy5lbmFibGVkQXR0cmlidXRlcyxyPWMuYXR0cmlidXRlRGl2aXNvcnM7Yy5uZXdBdHRyaWJ1dGVzW25dPTEsMD09PWFbbl0mJih0LmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG4pLGFbbl09MSkscltuXSE9PWkmJigoby5pc1dlYkdMMj90OmUuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpW28uaXNXZWJHTDI/InZlcnRleEF0dHJpYkRpdmlzb3IiOiJ2ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUiXShuLGkpLHJbbl09aSl9ZnVuY3Rpb24gaCgpe2NvbnN0IGU9Yy5uZXdBdHRyaWJ1dGVzLG49Yy5lbmFibGVkQXR0cmlidXRlcztmb3IobGV0IG89MCxpPW4ubGVuZ3RoO288aTtvKyspbltvXSE9PWVbb10mJih0LmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShvKSxuW29dPTApfWZ1bmN0aW9uIGIoZSxuLGksYSxyLHMpeyEwIT09by5pc1dlYkdMMnx8NTEyNCE9PWkmJjUxMjUhPT1pP3QudmVydGV4QXR0cmliUG9pbnRlcihlLG4saSxhLHIscyk6dC52ZXJ0ZXhBdHRyaWJJUG9pbnRlcihlLG4saSxyLHMpfWZ1bmN0aW9uIHkoKXtfKCksYyE9PWwmJihjPWwsZChjLm9iamVjdCkpfWZ1bmN0aW9uIF8oKXtsLmdlb21ldHJ5PW51bGwsbC5wcm9ncmFtPW51bGwsbC53aXJlZnJhbWU9ITF9cmV0dXJue3NldHVwOmZ1bmN0aW9uIEMoaSxsLHAseSxfKXtsZXQgQz0hMTtpZihyKXtjb25zdCBlPShmdW5jdGlvbiBNKGUsbixpKXtjb25zdCByPSEwPT09aS53aXJlZnJhbWU7bGV0IGw9c1tlLmlkXTt2b2lkIDA9PT1sJiYobD17fSxzW2UuaWRdPWwpO2xldCBjPWxbbi5pZF07dm9pZCAwPT09YyYmKGM9e30sbFtuLmlkXT1jKTtsZXQgZD1jW3JdO3JldHVybiB2b2lkIDA9PT1kJiYoZD1tKChmdW5jdGlvbiBwKCl7cmV0dXJuIG8uaXNXZWJHTDI/dC5jcmVhdGVWZXJ0ZXhBcnJheSgpOmEuY3JlYXRlVmVydGV4QXJyYXlPRVMoKX0pKCkpLGNbcl09ZCksZH0pKHkscCxsKTtjIT09ZSYmKGM9ZSxkKGMub2JqZWN0KSksQz0oZnVuY3Rpb24gdih0LGUpe2NvbnN0IG49Yy5hdHRyaWJ1dGVzLG89dC5hdHRyaWJ1dGVzO2xldCBpPTA7Zm9yKGNvbnN0IHQgaW4gbyl7Y29uc3QgZT1uW3RdLGE9b1t0XTtpZih2b2lkIDA9PT1lKXJldHVybiEwO2lmKGUuYXR0cmlidXRlIT09YSlyZXR1cm4hMDtpZihlLmRhdGEhPT1hLmRhdGEpcmV0dXJuITA7aSsrfXJldHVybiBjLmF0dHJpYnV0ZXNOdW0hPT1pfHxjLmluZGV4IT09ZX0pKHksXyksQyYmKGZ1bmN0aW9uIHgodCxlKXtjb25zdCBuPXt9LG89dC5hdHRyaWJ1dGVzO2xldCBpPTA7Zm9yKGNvbnN0IHQgaW4gbyl7Y29uc3QgZT1vW3RdLGE9e307YS5hdHRyaWJ1dGU9ZSxlLmRhdGEmJihhLmRhdGE9ZS5kYXRhKSxuW3RdPWEsaSsrfWMuYXR0cmlidXRlcz1uLGMuYXR0cmlidXRlc051bT1pLGMuaW5kZXg9ZX0pKHksXyl9ZWxzZXtjb25zdCB0PSEwPT09bC53aXJlZnJhbWU7Yy5nZW9tZXRyeT09PXkuaWQmJmMucHJvZ3JhbT09PXAuaWQmJmMud2lyZWZyYW1lPT09dHx8KGMuZ2VvbWV0cnk9eS5pZCxjLnByb2dyYW09cC5pZCxjLndpcmVmcmFtZT10LEM9ITApfSEwPT09aS5pc0luc3RhbmNlZE1lc2gmJihDPSEwKSxudWxsIT09XyYmbi51cGRhdGUoXywzNDk2MyksQyYmKChmdW5jdGlvbiBPKGksYSxyLHMpe2lmKCExPT09by5pc1dlYkdMMiYmKGkuaXNJbnN0YW5jZWRNZXNofHxzLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkpJiZudWxsPT09ZS5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSlyZXR1cm47dSgpO2NvbnN0IGw9cy5hdHRyaWJ1dGVzLGM9ci5nZXRBdHRyaWJ1dGVzKCksZD1hLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM7Zm9yKGNvbnN0IGUgaW4gYyl7Y29uc3Qgbz1jW2VdO2lmKG8+PTApe2NvbnN0IGE9bFtlXTtpZih2b2lkIDAhPT1hKXtjb25zdCBlPWEubm9ybWFsaXplZCxpPWEuaXRlbVNpemUscj1uLmdldChhKTtpZih2b2lkIDA9PT1yKWNvbnRpbnVlO2NvbnN0IGw9ci5idWZmZXIsYz1yLnR5cGUsZD1yLmJ5dGVzUGVyRWxlbWVudDtpZihhLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IG49YS5kYXRhLHI9bi5zdHJpZGUscD1hLm9mZnNldDtuJiZuLmlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI/KGcobyxuLm1lc2hQZXJBdHRyaWJ1dGUpLHZvaWQgMD09PXMuX21heEluc3RhbmNlQ291bnQmJihzLl9tYXhJbnN0YW5jZUNvdW50PW4ubWVzaFBlckF0dHJpYnV0ZSpuLmNvdW50KSk6ZihvKSx0LmJpbmRCdWZmZXIoMzQ5NjIsbCksYihvLGksYyxlLHIqZCxwKmQpfWVsc2UgYS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZT8oZyhvLGEubWVzaFBlckF0dHJpYnV0ZSksdm9pZCAwPT09cy5fbWF4SW5zdGFuY2VDb3VudCYmKHMuX21heEluc3RhbmNlQ291bnQ9YS5tZXNoUGVyQXR0cmlidXRlKmEuY291bnQpKTpmKG8pLHQuYmluZEJ1ZmZlcigzNDk2MixsKSxiKG8saSxjLGUsMCwwKX1lbHNlIGlmKCJpbnN0YW5jZU1hdHJpeCI9PT1lKXtjb25zdCBlPW4uZ2V0KGkuaW5zdGFuY2VNYXRyaXgpO2lmKHZvaWQgMD09PWUpY29udGludWU7Y29uc3QgYT1lLmJ1ZmZlcixyPWUudHlwZTtnKG8rMCwxKSxnKG8rMSwxKSxnKG8rMiwxKSxnKG8rMywxKSx0LmJpbmRCdWZmZXIoMzQ5NjIsYSksdC52ZXJ0ZXhBdHRyaWJQb2ludGVyKG8rMCw0LHIsITEsNjQsMCksdC52ZXJ0ZXhBdHRyaWJQb2ludGVyKG8rMSw0LHIsITEsNjQsMTYpLHQudmVydGV4QXR0cmliUG9pbnRlcihvKzIsNCxyLCExLDY0LDMyKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIobyszLDQsciwhMSw2NCw0OCl9ZWxzZSBpZigiaW5zdGFuY2VDb2xvciI9PT1lKXtjb25zdCBlPW4uZ2V0KGkuaW5zdGFuY2VDb2xvcik7aWYodm9pZCAwPT09ZSljb250aW51ZTtjb25zdCBhPWUuYnVmZmVyLHI9ZS50eXBlO2cobywxKSx0LmJpbmRCdWZmZXIoMzQ5NjIsYSksdC52ZXJ0ZXhBdHRyaWJQb2ludGVyKG8sMyxyLCExLDEyLDApfWVsc2UgaWYodm9pZCAwIT09ZCl7Y29uc3Qgbj1kW2VdO2lmKHZvaWQgMCE9PW4pc3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDI6dC52ZXJ0ZXhBdHRyaWIyZnYobyxuKTticmVhaztjYXNlIDM6dC52ZXJ0ZXhBdHRyaWIzZnYobyxuKTticmVhaztjYXNlIDQ6dC52ZXJ0ZXhBdHRyaWI0ZnYobyxuKTticmVhaztkZWZhdWx0OnQudmVydGV4QXR0cmliMWZ2KG8sbil9fX19aCgpfSkoaSxsLHAseSksbnVsbCE9PV8mJnQuYmluZEJ1ZmZlcigzNDk2MyxuLmdldChfKS5idWZmZXIpKX0scmVzZXQ6eSxyZXNldERlZmF1bHRTdGF0ZTpfLGRpc3Bvc2U6ZnVuY3Rpb24gTSgpe3koKTtmb3IoY29uc3QgdCBpbiBzKXtjb25zdCBlPXNbdF07Zm9yKGNvbnN0IHQgaW4gZSl7Y29uc3Qgbj1lW3RdO2Zvcihjb25zdCB0IGluIG4pcChuW3RdLm9iamVjdCksZGVsZXRlIG5bdF07ZGVsZXRlIGVbdF19ZGVsZXRlIHNbdF19fSxyZWxlYXNlU3RhdGVzT2ZHZW9tZXRyeTpmdW5jdGlvbiB2KHQpe2lmKHZvaWQgMD09PXNbdC5pZF0pcmV0dXJuO2NvbnN0IGU9c1t0LmlkXTtmb3IoY29uc3QgdCBpbiBlKXtjb25zdCBuPWVbdF07Zm9yKGNvbnN0IHQgaW4gbilwKG5bdF0ub2JqZWN0KSxkZWxldGUgblt0XTtkZWxldGUgZVt0XX1kZWxldGUgc1t0LmlkXX0scmVsZWFzZVN0YXRlc09mUHJvZ3JhbTpmdW5jdGlvbiB4KHQpe2Zvcihjb25zdCBlIGluIHMpe2NvbnN0IG49c1tlXTtpZih2b2lkIDA9PT1uW3QuaWRdKWNvbnRpbnVlO2NvbnN0IG89blt0LmlkXTtmb3IoY29uc3QgdCBpbiBvKXAob1t0XS5vYmplY3QpLGRlbGV0ZSBvW3RdO2RlbGV0ZSBuW3QuaWRdfX0saW5pdEF0dHJpYnV0ZXM6dSxlbmFibGVBdHRyaWJ1dGU6ZixkaXNhYmxlVW51c2VkQXR0cmlidXRlczpofX1mdW5jdGlvbiBMc3QodCxlLG4sbyl7Y29uc3QgaT1vLmlzV2ViR0wyO2xldCBhO3RoaXMuc2V0TW9kZT1mdW5jdGlvbiByKHQpe2E9dH0sdGhpcy5yZW5kZXI9ZnVuY3Rpb24gcyhlLG8pe3QuZHJhd0FycmF5cyhhLGUsbyksbi51cGRhdGUobyxhLDEpfSx0aGlzLnJlbmRlckluc3RhbmNlcz1mdW5jdGlvbiBsKG8scixzKXtpZigwPT09cylyZXR1cm47bGV0IGwsYztpZihpKWw9dCxjPSJkcmF3QXJyYXlzSW5zdGFuY2VkIjtlbHNlIGlmKGw9ZS5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSxjPSJkcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUiLG51bGw9PT1sKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLiIpO2xbY10oYSxvLHIscyksbi51cGRhdGUocixhLHMpfX1mdW5jdGlvbiBCc3QodCxlLG4pe2xldCBvO2Z1bmN0aW9uIGkoZSl7aWYoImhpZ2hwIj09PWUpe2lmKHQuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMzLDM2MzM4KS5wcmVjaXNpb24+MCYmdC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoMzU2MzIsMzYzMzgpLnByZWNpc2lvbj4wKXJldHVybiJoaWdocCI7ZT0ibWVkaXVtcCJ9cmV0dXJuIm1lZGl1bXAiPT09ZSYmdC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoMzU2MzMsMzYzMzcpLnByZWNpc2lvbj4wJiZ0LmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCgzNTYzMiwzNjMzNykucHJlY2lzaW9uPjA/Im1lZGl1bXAiOiJsb3dwIn1jb25zdCBhPSJ1bmRlZmluZWQiIT10eXBlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCYmdCBpbnN0YW5jZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHR8fCJ1bmRlZmluZWQiIT10eXBlb2YgV2ViR0wyQ29tcHV0ZVJlbmRlcmluZ0NvbnRleHQmJnQgaW5zdGFuY2VvZiBXZWJHTDJDb21wdXRlUmVuZGVyaW5nQ29udGV4dDtsZXQgcj12b2lkIDAhPT1uLnByZWNpc2lvbj9uLnByZWNpc2lvbjoiaGlnaHAiO2NvbnN0IHM9aShyKTtzIT09ciYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjoiLHIsIm5vdCBzdXBwb3J0ZWQsIHVzaW5nIixzLCJpbnN0ZWFkLiIpLHI9cyk7Y29uc3QgbD1hfHxlLmhhcygiV0VCR0xfZHJhd19idWZmZXJzIiksYz0hMD09PW4ubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcixkPXQuZ2V0UGFyYW1ldGVyKDM0OTMwKSxwPXQuZ2V0UGFyYW1ldGVyKDM1NjYwKSxtPXQuZ2V0UGFyYW1ldGVyKDMzNzkpLHU9dC5nZXRQYXJhbWV0ZXIoMzQwNzYpLGY9dC5nZXRQYXJhbWV0ZXIoMzQ5MjEpLGc9dC5nZXRQYXJhbWV0ZXIoMzYzNDcpLGg9dC5nZXRQYXJhbWV0ZXIoMzYzNDgpLGI9dC5nZXRQYXJhbWV0ZXIoMzYzNDkpLHk9cD4wLF89YXx8ZS5oYXMoIk9FU190ZXh0dXJlX2Zsb2F0Iik7cmV0dXJue2lzV2ViR0wyOmEsZHJhd0J1ZmZlcnM6bCxnZXRNYXhBbmlzb3Ryb3B5OmZ1bmN0aW9uIEMoKXtpZih2b2lkIDAhPT1vKXJldHVybiBvO2lmKCEwPT09ZS5oYXMoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpKXtjb25zdCBuPWUuZ2V0KCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTtvPXQuZ2V0UGFyYW1ldGVyKG4uTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUKX1lbHNlIG89MDtyZXR1cm4gb30sZ2V0TWF4UHJlY2lzaW9uOmkscHJlY2lzaW9uOnIsbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjpjLG1heFRleHR1cmVzOmQsbWF4VmVydGV4VGV4dHVyZXM6cCxtYXhUZXh0dXJlU2l6ZTptLG1heEN1YmVtYXBTaXplOnUsbWF4QXR0cmlidXRlczpmLG1heFZlcnRleFVuaWZvcm1zOmcsbWF4VmFyeWluZ3M6aCxtYXhGcmFnbWVudFVuaWZvcm1zOmIsdmVydGV4VGV4dHVyZXM6eSxmbG9hdEZyYWdtZW50VGV4dHVyZXM6XyxmbG9hdFZlcnRleFRleHR1cmVzOnkmJl8sbWF4U2FtcGxlczphP3QuZ2V0UGFyYW1ldGVyKDM2MTgzKTowfX1mdW5jdGlvbiBWc3QodCl7Y29uc3QgZT10aGlzO2xldCBuPW51bGwsbz0wLGk9ITEsYT0hMTtjb25zdCByPW5ldyBrc3Qscz1uZXcgJGl0LGw9e3ZhbHVlOm51bGwsbmVlZHNVcGRhdGU6ITF9O2Z1bmN0aW9uIGMoKXtsLnZhbHVlIT09biYmKGwudmFsdWU9bixsLm5lZWRzVXBkYXRlPW8+MCksZS5udW1QbGFuZXM9byxlLm51bUludGVyc2VjdGlvbj0wfWZ1bmN0aW9uIGQodCxuLG8saSl7Y29uc3QgYT1udWxsIT09dD90Lmxlbmd0aDowO2xldCBjPW51bGw7aWYoMCE9PWEpe2lmKGM9bC52YWx1ZSwhMCE9PWl8fG51bGw9PT1jKXtjb25zdCBlPW8rNCphLGk9bi5tYXRyaXhXb3JsZEludmVyc2U7cy5nZXROb3JtYWxNYXRyaXgoaSksKG51bGw9PT1jfHxjLmxlbmd0aDxlKSYmKGM9bmV3IEZsb2F0MzJBcnJheShlKSk7Zm9yKGxldCBlPTAsbj1vO2UhPT1hOysrZSxuKz00KXIuY29weSh0W2VdKS5hcHBseU1hdHJpeDQoaSxzKSxyLm5vcm1hbC50b0FycmF5KGMsbiksY1tuKzNdPXIuY29uc3RhbnR9bC52YWx1ZT1jLGwubmVlZHNVcGRhdGU9ITB9cmV0dXJuIGUubnVtUGxhbmVzPWEsZS5udW1JbnRlcnNlY3Rpb249MCxjfXRoaXMudW5pZm9ybT1sLHRoaXMubnVtUGxhbmVzPTAsdGhpcy5udW1JbnRlcnNlY3Rpb249MCx0aGlzLmluaXQ9ZnVuY3Rpb24odCxlLGEpe2NvbnN0IHI9MCE9PXQubGVuZ3RofHxlfHwwIT09b3x8aTtyZXR1cm4gaT1lLG49ZCh0LGEsMCksbz10Lmxlbmd0aCxyfSx0aGlzLmJlZ2luU2hhZG93cz1mdW5jdGlvbigpe2E9ITAsZChudWxsKX0sdGhpcy5lbmRTaGFkb3dzPWZ1bmN0aW9uKCl7YT0hMSxjKCl9LHRoaXMuc2V0U3RhdGU9ZnVuY3Rpb24oZSxyLHMpe2NvbnN0IHA9ZS5jbGlwcGluZ1BsYW5lcyxtPWUuY2xpcEludGVyc2VjdGlvbix1PWUuY2xpcFNoYWRvd3MsZj10LmdldChlKTtpZighaXx8bnVsbD09PXB8fDA9PT1wLmxlbmd0aHx8YSYmIXUpYT9kKG51bGwpOmMoKTtlbHNle2NvbnN0IHQ9YT8wOm8sZT00KnQ7bGV0IGk9Zi5jbGlwcGluZ1N0YXRlfHxudWxsO2wudmFsdWU9aSxpPWQocCxyLGUscyk7Zm9yKGxldCB0PTA7dCE9PWU7Kyt0KWlbdF09blt0XTtmLmNsaXBwaW5nU3RhdGU9aSx0aGlzLm51bUludGVyc2VjdGlvbj1tP3RoaXMubnVtUGxhbmVzOjAsdGhpcy5udW1QbGFuZXMrPXR9fX1mdW5jdGlvbiBqc3QodCl7bGV0IGU9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gbih0LGUpe3JldHVybiAzMDM9PT1lP3QubWFwcGluZz1kaXQ6MzA0PT09ZSYmKHQubWFwcGluZz1waXQpLHR9ZnVuY3Rpb24gbyh0KXtjb25zdCBuPXQudGFyZ2V0O24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsbyk7Y29uc3QgaT1lLmdldChuKTt2b2lkIDAhPT1pJiYoZS5kZWxldGUobiksaS5kaXNwb3NlKCkpfXJldHVybntnZXQ6ZnVuY3Rpb24gaShhKXtpZihhJiZhLmlzVGV4dHVyZSYmITE9PT1hLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSl7Y29uc3QgaT1hLm1hcHBpbmc7aWYoMzAzPT09aXx8MzA0PT09aSl7aWYoZS5oYXMoYSkpcmV0dXJuIG4oZS5nZXQoYSkudGV4dHVyZSxhLm1hcHBpbmcpO3tjb25zdCBpPWEuaW1hZ2U7aWYoaSYmaS5oZWlnaHQ+MCl7Y29uc3Qgcj10LmdldFJlbmRlclRhcmdldCgpLHM9bmV3IHhzdChpLmhlaWdodC8yKTtyZXR1cm4gcy5mcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZSh0LGEpLGUuc2V0KGEscyksdC5zZXRSZW5kZXJUYXJnZXQociksYS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixvKSxuKHMudGV4dHVyZSxhLm1hcHBpbmcpfXJldHVybiBudWxsfX19cmV0dXJuIGF9LGRpc3Bvc2U6ZnVuY3Rpb24gYSgpe2U9bmV3IFdlYWtNYXB9fX1Jc3QucGh5c2ljYWw9e3VuaWZvcm1zOmdzdChbSXN0LnN0YW5kYXJkLnVuaWZvcm1zLHtjbGVhcmNvYXQ6e3ZhbHVlOjB9LGNsZWFyY29hdE1hcDp7dmFsdWU6bnVsbH0sY2xlYXJjb2F0Um91Z2huZXNzOnt2YWx1ZTowfSxjbGVhcmNvYXRSb3VnaG5lc3NNYXA6e3ZhbHVlOm51bGx9LGNsZWFyY29hdE5vcm1hbFNjYWxlOnt2YWx1ZTpuZXcgUWl0KDEsMSl9LGNsZWFyY29hdE5vcm1hbE1hcDp7dmFsdWU6bnVsbH0sc2hlZW46e3ZhbHVlOm5ldyBScnQoMCl9LHRyYW5zbWlzc2lvbjp7dmFsdWU6MH0sdHJhbnNtaXNzaW9uTWFwOnt2YWx1ZTpudWxsfSx0cmFuc21pc3Npb25TYW1wbGVyU2l6ZTp7dmFsdWU6bmV3IFFpdH0sdHJhbnNtaXNzaW9uU2FtcGxlck1hcDp7dmFsdWU6bnVsbH0sdGhpY2tuZXNzOnt2YWx1ZTowfSx0aGlja25lc3NNYXA6e3ZhbHVlOm51bGx9LGF0dGVudWF0aW9uRGlzdGFuY2U6e3ZhbHVlOjB9LGF0dGVudWF0aW9uVGludDp7dmFsdWU6bmV3IFJydCgwKX0sc3BlY3VsYXJJbnRlbnNpdHk6e3ZhbHVlOjB9LHNwZWN1bGFySW50ZW5zaXR5TWFwOnt2YWx1ZTpudWxsfSxzcGVjdWxhclRpbnQ6e3ZhbHVlOm5ldyBScnQoMSwxLDEpfSxzcGVjdWxhclRpbnRNYXA6e3ZhbHVlOm51bGx9fV0pLHZlcnRleFNoYWRlcjpOc3QubWVzaHBoeXNpY2FsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6TnN0Lm1lc2hwaHlzaWNhbF9mcmFnfTtjbGFzcyBVc3QgZXh0ZW5kcyB5c3R7Y29uc3RydWN0b3IodD0tMSxlPTEsbj0xLG89LTEsaT0uMSxhPTJlMyl7c3VwZXIoKSx0aGlzLnR5cGU9Ik9ydGhvZ3JhcGhpY0NhbWVyYSIsdGhpcy56b29tPTEsdGhpcy52aWV3PW51bGwsdGhpcy5sZWZ0PXQsdGhpcy5yaWdodD1lLHRoaXMudG9wPW4sdGhpcy5ib3R0b209byx0aGlzLm5lYXI9aSx0aGlzLmZhcj1hLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHRoaXMubGVmdD10LmxlZnQsdGhpcy5yaWdodD10LnJpZ2h0LHRoaXMudG9wPXQudG9wLHRoaXMuYm90dG9tPXQuYm90dG9tLHRoaXMubmVhcj10Lm5lYXIsdGhpcy5mYXI9dC5mYXIsdGhpcy56b29tPXQuem9vbSx0aGlzLnZpZXc9bnVsbD09PXQudmlldz9udWxsOk9iamVjdC5hc3NpZ24oe30sdC52aWV3KSx0aGlzfXNldFZpZXdPZmZzZXQodCxlLG4sbyxpLGEpe251bGw9PT10aGlzLnZpZXcmJih0aGlzLnZpZXc9e2VuYWJsZWQ6ITAsZnVsbFdpZHRoOjEsZnVsbEhlaWdodDoxLG9mZnNldFg6MCxvZmZzZXRZOjAsd2lkdGg6MSxoZWlnaHQ6MX0pLHRoaXMudmlldy5lbmFibGVkPSEwLHRoaXMudmlldy5mdWxsV2lkdGg9dCx0aGlzLnZpZXcuZnVsbEhlaWdodD1lLHRoaXMudmlldy5vZmZzZXRYPW4sdGhpcy52aWV3Lm9mZnNldFk9byx0aGlzLnZpZXcud2lkdGg9aSx0aGlzLnZpZXcuaGVpZ2h0PWEsdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Y2xlYXJWaWV3T2Zmc2V0KCl7bnVsbCE9PXRoaXMudmlldyYmKHRoaXMudmlldy5lbmFibGVkPSExKSx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX11cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl7Y29uc3QgdD0odGhpcy5yaWdodC10aGlzLmxlZnQpLygyKnRoaXMuem9vbSksZT0odGhpcy50b3AtdGhpcy5ib3R0b20pLygyKnRoaXMuem9vbSksbj0odGhpcy5yaWdodCt0aGlzLmxlZnQpLzIsbz0odGhpcy50b3ArdGhpcy5ib3R0b20pLzI7bGV0IGk9bi10LGE9bit0LHI9bytlLHM9by1lO2lmKG51bGwhPT10aGlzLnZpZXcmJnRoaXMudmlldy5lbmFibGVkKXtjb25zdCB0PSh0aGlzLnJpZ2h0LXRoaXMubGVmdCkvdGhpcy52aWV3LmZ1bGxXaWR0aC90aGlzLnpvb20sZT0odGhpcy50b3AtdGhpcy5ib3R0b20pL3RoaXMudmlldy5mdWxsSGVpZ2h0L3RoaXMuem9vbTtpKz10KnRoaXMudmlldy5vZmZzZXRYLGE9aSt0KnRoaXMudmlldy53aWR0aCxyLT1lKnRoaXMudmlldy5vZmZzZXRZLHM9ci1lKnRoaXMudmlldy5oZWlnaHR9dGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VPcnRob2dyYXBoaWMoaSxhLHIscyx0aGlzLm5lYXIsdGhpcy5mYXIpLHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSh0aGlzLnByb2plY3Rpb25NYXRyaXgpLmludmVydCgpfXRvSlNPTih0KXtjb25zdCBlPXN1cGVyLnRvSlNPTih0KTtyZXR1cm4gZS5vYmplY3Quem9vbT10aGlzLnpvb20sZS5vYmplY3QubGVmdD10aGlzLmxlZnQsZS5vYmplY3QucmlnaHQ9dGhpcy5yaWdodCxlLm9iamVjdC50b3A9dGhpcy50b3AsZS5vYmplY3QuYm90dG9tPXRoaXMuYm90dG9tLGUub2JqZWN0Lm5lYXI9dGhpcy5uZWFyLGUub2JqZWN0LmZhcj10aGlzLmZhcixudWxsIT09dGhpcy52aWV3JiYoZS5vYmplY3Qudmlldz1PYmplY3QuYXNzaWduKHt9LHRoaXMudmlldykpLGV9fVVzdC5wcm90b3R5cGUuaXNPcnRob2dyYXBoaWNDYW1lcmE9ITA7Y2xhc3MgR3N0IGV4dGVuZHMgYnN0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMudHlwZT0iUmF3U2hhZGVyTWF0ZXJpYWwifX1Hc3QucHJvdG90eXBlLmlzUmF3U2hhZGVyTWF0ZXJpYWw9ITA7Y29uc3QgV3N0PU1hdGgucG93KDIsOCksWXN0PVsuMTI1LC4yMTUsLjM1LC40NDYsLjUyNiwuNTgyXSxxc3Q9NStZc3QubGVuZ3RoLFpzdD17W3ppdF06MCxbSWl0XToxLFtGaXRdOjIsMzAwNDozLDMwMDU6NCwzMDA2OjUsW0hpdF06Nn0sWHN0PW5ldyBBcnQoe3NpZGU6MSxkZXB0aFdyaXRlOiExLGRlcHRoVGVzdDohMX0pLEtzdD1uZXcgcHN0KG5ldyB1c3QsWHN0KSxKc3Q9bmV3IFVzdCx7X2xvZFBsYW5lczpRc3QsX3NpemVMb2RzOiRzdCxfc2lnbWFzOnRsdH09Y2x0KCksZWx0PW5ldyBScnQ7bGV0IG5sdD1udWxsO2NvbnN0IG9sdD0oMStNYXRoLnNxcnQoNSkpLzIsaWx0PTEvb2x0LGFsdD1bbmV3IGNhdCgxLDEsMSksbmV3IGNhdCgtMSwxLDEpLG5ldyBjYXQoMSwxLC0xKSxuZXcgY2F0KC0xLDEsLTEpLG5ldyBjYXQoMCxvbHQsaWx0KSxuZXcgY2F0KDAsb2x0LC1pbHQpLG5ldyBjYXQoaWx0LDAsb2x0KSxuZXcgY2F0KC1pbHQsMCxvbHQpLG5ldyBjYXQob2x0LGlsdCwwKSxuZXcgY2F0KC1vbHQsaWx0LDApXTtmdW5jdGlvbiBybHQodCl7Y29uc3QgZT1NYXRoLm1heCh0LnIsdC5nLHQuYiksbj1NYXRoLm1pbihNYXRoLm1heChNYXRoLmNlaWwoTWF0aC5sb2cyKGUpKSwtMTI4KSwxMjcpO3JldHVybiB0Lm11bHRpcGx5U2NhbGFyKE1hdGgucG93KDIsLW4pKSwobisxMjgpLzI1NX1jbGFzcyBzbHR7Y29uc3RydWN0b3IodCl7dGhpcy5fcmVuZGVyZXI9dCx0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldD1udWxsLHRoaXMuX2JsdXJNYXRlcmlhbD0oZnVuY3Rpb24gZSh0KXtjb25zdCBlPW5ldyBGbG9hdDMyQXJyYXkodCksbj1uZXcgY2F0KDAsMSwwKTtyZXR1cm4gbmV3IEdzdCh7bmFtZToiU3BoZXJpY2FsR2F1c3NpYW5CbHVyIixkZWZpbmVzOntuOnR9LHVuaWZvcm1zOntlbnZNYXA6e3ZhbHVlOm51bGx9LHNhbXBsZXM6e3ZhbHVlOjF9LHdlaWdodHM6e3ZhbHVlOmV9LGxhdGl0dWRpbmFsOnt2YWx1ZTohMX0sZFRoZXRhOnt2YWx1ZTowfSxtaXBJbnQ6e3ZhbHVlOjB9LHBvbGVBeGlzOnt2YWx1ZTpufSxpbnB1dEVuY29kaW5nOnt2YWx1ZTpac3RbM2UzXX0sb3V0cHV0RW5jb2Rpbmc6e3ZhbHVlOlpzdFszZTNdfX0sdmVydGV4U2hhZGVyOiJcblxuXHRcdHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXHRcdHByZWNpc2lvbiBtZWRpdW1wIGludDtcblxuXHRcdGF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uO1xuXHRcdGF0dHJpYnV0ZSB2ZWMyIHV2O1xuXHRcdGF0dHJpYnV0ZSBmbG9hdCBmYWNlSW5kZXg7XG5cblx0XHR2YXJ5aW5nIHZlYzMgdk91dHB1dERpcmVjdGlvbjtcblxuXHRcdC8vIFJIIGNvb3JkaW5hdGUgc3lzdGVtOyBQTVJFTSBmYWNlLWluZGV4aW5nIGNvbnZlbnRpb25cblx0XHR2ZWMzIGdldERpcmVjdGlvbiggdmVjMiB1diwgZmxvYXQgZmFjZSApIHtcblxuXHRcdFx0dXYgPSAyLjAgKiB1diAtIDEuMDtcblxuXHRcdFx0dmVjMyBkaXJlY3Rpb24gPSB2ZWMzKCB1diwgMS4wICk7XG5cblx0XHRcdGlmICggZmFjZSA9PSAwLjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnp5eDsgLy8gKCAxLCB2LCB1ICkgcG9zIHhcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSAxLjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnh6eTtcblx0XHRcdFx0ZGlyZWN0aW9uLnh6ICo9IC0xLjA7IC8vICggLXUsIDEsIC12ICkgcG9zIHlcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSAyLjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uLnggKj0gLTEuMDsgLy8gKCAtdSwgdiwgMSApIHBvcyB6XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMy4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi56eXg7XG5cdFx0XHRcdGRpcmVjdGlvbi54eiAqPSAtMS4wOyAvLyAoIC0xLCB2LCAtdSApIG5lZyB4XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gNC4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi54enk7XG5cdFx0XHRcdGRpcmVjdGlvbi54eSAqPSAtMS4wOyAvLyAoIC11LCAtMSwgdiApIG5lZyB5XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gNS4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbi56ICo9IC0xLjA7IC8vICggdSwgdiwgLTEgKSBuZWcgelxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkaXJlY3Rpb247XG5cblx0XHR9XG5cblx0XHR2b2lkIG1haW4oKSB7XG5cblx0XHRcdHZPdXRwdXREaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oIHV2LCBmYWNlSW5kZXggKTtcblx0XHRcdGdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24sIDEuMCApO1xuXG5cdFx0fVxuXHQiLGZyYWdtZW50U2hhZGVyOiJcblxuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBpbnQ7XG5cblx0XHRcdHZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uO1xuXG5cdFx0XHR1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7XG5cdFx0XHR1bmlmb3JtIGludCBzYW1wbGVzO1xuXHRcdFx0dW5pZm9ybSBmbG9hdCB3ZWlnaHRzWyBuIF07XG5cdFx0XHR1bmlmb3JtIGJvb2wgbGF0aXR1ZGluYWw7XG5cdFx0XHR1bmlmb3JtIGZsb2F0IGRUaGV0YTtcblx0XHRcdHVuaWZvcm0gZmxvYXQgbWlwSW50O1xuXHRcdFx0dW5pZm9ybSB2ZWMzIHBvbGVBeGlzO1xuXG5cdFx0XHRcblxuXHRcdHVuaWZvcm0gaW50IGlucHV0RW5jb2Rpbmc7XG5cdFx0dW5pZm9ybSBpbnQgb3V0cHV0RW5jb2Rpbmc7XG5cblx0XHQjaW5jbHVkZSA8ZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ+XG5cblx0XHR2ZWM0IGlucHV0VGV4ZWxUb0xpbmVhciggdmVjNCB2YWx1ZSApIHtcblxuXHRcdFx0aWYgKCBpbnB1dEVuY29kaW5nID09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDEgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHNSR0JUb0xpbmVhciggdmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW5wdXRFbmNvZGluZyA9PSAyICkge1xuXG5cdFx0XHRcdHJldHVybiBSR0JFVG9MaW5lYXIoIHZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gMyApIHtcblxuXHRcdFx0XHRyZXR1cm4gUkdCTVRvTGluZWFyKCB2YWx1ZSwgNy4wICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gNCApIHtcblxuXHRcdFx0XHRyZXR1cm4gUkdCTVRvTGluZWFyKCB2YWx1ZSwgMTYuMCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIFJHQkRUb0xpbmVhciggdmFsdWUsIDI1Ni4wICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIEdhbW1hVG9MaW5lYXIoIHZhbHVlLCAyLjIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmVjNCBsaW5lYXJUb091dHB1dFRleGVsKCB2ZWM0IHZhbHVlICkge1xuXG5cdFx0XHRpZiAoIG91dHB1dEVuY29kaW5nID09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvdXRwdXRFbmNvZGluZyA9PSAxICkge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb3NSR0IoIHZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDIgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvUkdCRSggdmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gMyApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9SR0JNKCB2YWx1ZSwgNy4wICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvUkdCTSggdmFsdWUsIDE2LjAgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gNSApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9SR0JEKCB2YWx1ZSwgMjU2LjAgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9HYW1tYSggdmFsdWUsIDIuMiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2ZWM0IGVudk1hcFRleGVsVG9MaW5lYXIoIHZlYzQgY29sb3IgKSB7XG5cblx0XHRcdHJldHVybiBpbnB1dFRleGVsVG9MaW5lYXIoIGNvbG9yICk7XG5cblx0XHR9XG5cdFxuXG5cdFx0XHQjZGVmaW5lIEVOVk1BUF9UWVBFX0NVQkVfVVZcblx0XHRcdCNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XG5cblx0XHRcdHZlYzMgZ2V0U2FtcGxlKCBmbG9hdCB0aGV0YSwgdmVjMyBheGlzICkge1xuXG5cdFx0XHRcdGZsb2F0IGNvc1RoZXRhID0gY29zKCB0aGV0YSApO1xuXHRcdFx0XHQvLyBSb2RyaWd1ZXMnIGF4aXMtYW5nbGUgcm90YXRpb25cblx0XHRcdFx0dmVjMyBzYW1wbGVEaXJlY3Rpb24gPSB2T3V0cHV0RGlyZWN0aW9uICogY29zVGhldGFcblx0XHRcdFx0XHQrIGNyb3NzKCBheGlzLCB2T3V0cHV0RGlyZWN0aW9uICkgKiBzaW4oIHRoZXRhIClcblx0XHRcdFx0XHQrIGF4aXMgKiBkb3QoIGF4aXMsIHZPdXRwdXREaXJlY3Rpb24gKSAqICggMS4wIC0gY29zVGhldGEgKTtcblxuXHRcdFx0XHRyZXR1cm4gYmlsaW5lYXJDdWJlVVYoIGVudk1hcCwgc2FtcGxlRGlyZWN0aW9uLCBtaXBJbnQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2b2lkIG1haW4oKSB7XG5cblx0XHRcdFx0dmVjMyBheGlzID0gbGF0aXR1ZGluYWwgPyBwb2xlQXhpcyA6IGNyb3NzKCBwb2xlQXhpcywgdk91dHB1dERpcmVjdGlvbiApO1xuXG5cdFx0XHRcdGlmICggYWxsKCBlcXVhbCggYXhpcywgdmVjMyggMC4wICkgKSApICkge1xuXG5cdFx0XHRcdFx0YXhpcyA9IHZlYzMoIHZPdXRwdXREaXJlY3Rpb24ueiwgMC4wLCAtIHZPdXRwdXREaXJlY3Rpb24ueCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRheGlzID0gbm9ybWFsaXplKCBheGlzICk7XG5cblx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7XG5cdFx0XHRcdGdsX0ZyYWdDb2xvci5yZ2IgKz0gd2VpZ2h0c1sgMCBdICogZ2V0U2FtcGxlKCAwLjAsIGF4aXMgKTtcblxuXHRcdFx0XHRmb3IgKCBpbnQgaSA9IDE7IGkgPCBuOyBpKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGkgPj0gc2FtcGxlcyApIHtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRmbG9hdCB0aGV0YSA9IGRUaGV0YSAqIGZsb2F0KCBpICk7XG5cdFx0XHRcdFx0Z2xfRnJhZ0NvbG9yLnJnYiArPSB3ZWlnaHRzWyBpIF0gKiBnZXRTYW1wbGUoIC0xLjAgKiB0aGV0YSwgYXhpcyApO1xuXHRcdFx0XHRcdGdsX0ZyYWdDb2xvci5yZ2IgKz0gd2VpZ2h0c1sgaSBdICogZ2V0U2FtcGxlKCB0aGV0YSwgYXhpcyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRnbF9GcmFnQ29sb3IgPSBsaW5lYXJUb091dHB1dFRleGVsKCBnbF9GcmFnQ29sb3IgKTtcblxuXHRcdFx0fVxuXHRcdCIsYmxlbmRpbmc6MCxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMX0pfSkoMjApLHRoaXMuX2VxdWlyZWN0U2hhZGVyPW51bGwsdGhpcy5fY3ViZW1hcFNoYWRlcj1udWxsLHRoaXMuX2NvbXBpbGVNYXRlcmlhbCh0aGlzLl9ibHVyTWF0ZXJpYWwpfWZyb21TY2VuZSh0LGU9MCxuPS4xLG89MTAwKXtubHQ9dGhpcy5fcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7Y29uc3QgaT10aGlzLl9hbGxvY2F0ZVRhcmdldHMoKTtyZXR1cm4gdGhpcy5fc2NlbmVUb0N1YmVVVih0LG4sbyxpKSxlPjAmJnRoaXMuX2JsdXIoaSwwLDAsZSksdGhpcy5fYXBwbHlQTVJFTShpKSx0aGlzLl9jbGVhbnVwKGkpLGl9ZnJvbUVxdWlyZWN0YW5ndWxhcih0KXtyZXR1cm4gdGhpcy5fZnJvbVRleHR1cmUodCl9ZnJvbUN1YmVtYXAodCl7cmV0dXJuIHRoaXMuX2Zyb21UZXh0dXJlKHQpfWNvbXBpbGVDdWJlbWFwU2hhZGVyKCl7bnVsbD09PXRoaXMuX2N1YmVtYXBTaGFkZXImJih0aGlzLl9jdWJlbWFwU2hhZGVyPXVsdCgpLHRoaXMuX2NvbXBpbGVNYXRlcmlhbCh0aGlzLl9jdWJlbWFwU2hhZGVyKSl9Y29tcGlsZUVxdWlyZWN0YW5ndWxhclNoYWRlcigpe251bGw9PT10aGlzLl9lcXVpcmVjdFNoYWRlciYmKHRoaXMuX2VxdWlyZWN0U2hhZGVyPW1sdCgpLHRoaXMuX2NvbXBpbGVNYXRlcmlhbCh0aGlzLl9lcXVpcmVjdFNoYWRlcikpfWRpc3Bvc2UoKXt0aGlzLl9ibHVyTWF0ZXJpYWwuZGlzcG9zZSgpLG51bGwhPT10aGlzLl9jdWJlbWFwU2hhZGVyJiZ0aGlzLl9jdWJlbWFwU2hhZGVyLmRpc3Bvc2UoKSxudWxsIT09dGhpcy5fZXF1aXJlY3RTaGFkZXImJnRoaXMuX2VxdWlyZWN0U2hhZGVyLmRpc3Bvc2UoKTtmb3IobGV0IHQ9MDt0PFFzdC5sZW5ndGg7dCsrKVFzdFt0XS5kaXNwb3NlKCl9X2NsZWFudXAodCl7dGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQuZGlzcG9zZSgpLHRoaXMuX3JlbmRlcmVyLnNldFJlbmRlclRhcmdldChubHQpLHQuc2Npc3NvclRlc3Q9ITEscGx0KHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpfV9mcm9tVGV4dHVyZSh0KXtubHQ9dGhpcy5fcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7Y29uc3QgZT10aGlzLl9hbGxvY2F0ZVRhcmdldHModCk7cmV0dXJuIHRoaXMuX3RleHR1cmVUb0N1YmVVVih0LGUpLHRoaXMuX2FwcGx5UE1SRU0oZSksdGhpcy5fY2xlYW51cChlKSxlfV9hbGxvY2F0ZVRhcmdldHModCl7Y29uc3QgZT17bWFnRmlsdGVyOmhpdCxtaW5GaWx0ZXI6aGl0LGdlbmVyYXRlTWlwbWFwczohMSx0eXBlOl9pdCxmb3JtYXQ6MTAyMyxlbmNvZGluZzpsbHQodCk/dC5lbmNvZGluZzpGaXQsZGVwdGhCdWZmZXI6ITF9LG49ZGx0KGUpO3JldHVybiBuLmRlcHRoQnVmZmVyPSF0LHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0PWRsdChlKSxufV9jb21waWxlTWF0ZXJpYWwodCl7Y29uc3QgZT1uZXcgcHN0KFFzdFswXSx0KTt0aGlzLl9yZW5kZXJlci5jb21waWxlKGUsSnN0KX1fc2NlbmVUb0N1YmVVVih0LGUsbixvKXtjb25zdCBpPW5ldyBfc3QoOTAsMSxlLG4pLGE9WzEsLTEsMSwxLDEsMV0scj1bMSwxLDEsLTEsLTEsLTFdLHM9dGhpcy5fcmVuZGVyZXIsbD1zLmF1dG9DbGVhcixjPXMub3V0cHV0RW5jb2RpbmcsZD1zLnRvbmVNYXBwaW5nO3MuZ2V0Q2xlYXJDb2xvcihlbHQpLHMudG9uZU1hcHBpbmc9MCxzLm91dHB1dEVuY29kaW5nPXppdCxzLmF1dG9DbGVhcj0hMTtsZXQgcD0hMTtjb25zdCBtPXQuYmFja2dyb3VuZDtpZihtKXtpZihtLmlzQ29sb3Ipe1hzdC5jb2xvci5jb3B5KG0pLmNvbnZlcnRTUkdCVG9MaW5lYXIoKSx0LmJhY2tncm91bmQ9bnVsbDtjb25zdCBlPXJsdChYc3QuY29sb3IpO1hzdC5vcGFjaXR5PWUscD0hMH19ZWxzZXtYc3QuY29sb3IuY29weShlbHQpLmNvbnZlcnRTUkdCVG9MaW5lYXIoKTtjb25zdCB0PXJsdChYc3QuY29sb3IpO1hzdC5vcGFjaXR5PXQscD0hMH1mb3IobGV0IGU9MDtlPDY7ZSsrKXtjb25zdCBuPWUlMzswPT1uPyhpLnVwLnNldCgwLGFbZV0sMCksaS5sb29rQXQocltlXSwwLDApKToxPT1uPyhpLnVwLnNldCgwLDAsYVtlXSksaS5sb29rQXQoMCxyW2VdLDApKTooaS51cC5zZXQoMCxhW2VdLDApLGkubG9va0F0KDAsMCxyW2VdKSkscGx0KG8sbipXc3QsZT4yP1dzdDowLFdzdCxXc3QpLHMuc2V0UmVuZGVyVGFyZ2V0KG8pLHAmJnMucmVuZGVyKEtzdCxpKSxzLnJlbmRlcih0LGkpfXMudG9uZU1hcHBpbmc9ZCxzLm91dHB1dEVuY29kaW5nPWMscy5hdXRvQ2xlYXI9bH1fdGV4dHVyZVRvQ3ViZVVWKHQsZSl7Y29uc3Qgbj10aGlzLl9yZW5kZXJlcjt0LmlzQ3ViZVRleHR1cmU/bnVsbD09dGhpcy5fY3ViZW1hcFNoYWRlciYmKHRoaXMuX2N1YmVtYXBTaGFkZXI9dWx0KCkpOm51bGw9PXRoaXMuX2VxdWlyZWN0U2hhZGVyJiYodGhpcy5fZXF1aXJlY3RTaGFkZXI9bWx0KCkpO2NvbnN0IG89dC5pc0N1YmVUZXh0dXJlP3RoaXMuX2N1YmVtYXBTaGFkZXI6dGhpcy5fZXF1aXJlY3RTaGFkZXIsaT1uZXcgcHN0KFFzdFswXSxvKSxhPW8udW5pZm9ybXM7YS5lbnZNYXAudmFsdWU9dCx0LmlzQ3ViZVRleHR1cmV8fGEudGV4ZWxTaXplLnZhbHVlLnNldCgxL3QuaW1hZ2Uud2lkdGgsMS90LmltYWdlLmhlaWdodCksYS5pbnB1dEVuY29kaW5nLnZhbHVlPVpzdFt0LmVuY29kaW5nXSxhLm91dHB1dEVuY29kaW5nLnZhbHVlPVpzdFtlLnRleHR1cmUuZW5jb2RpbmddLHBsdChlLDAsMCwzKldzdCwyKldzdCksbi5zZXRSZW5kZXJUYXJnZXQoZSksbi5yZW5kZXIoaSxKc3QpfV9hcHBseVBNUkVNKHQpe2NvbnN0IGU9dGhpcy5fcmVuZGVyZXIsbj1lLmF1dG9DbGVhcjtlLmF1dG9DbGVhcj0hMTtmb3IobGV0IGU9MTtlPHFzdDtlKyspe2NvbnN0IG49TWF0aC5zcXJ0KHRsdFtlXSp0bHRbZV0tdGx0W2UtMV0qdGx0W2UtMV0pO3RoaXMuX2JsdXIodCxlLTEsZSxuLGFsdFsoZS0xKSVhbHQubGVuZ3RoXSl9ZS5hdXRvQ2xlYXI9bn1fYmx1cih0LGUsbixvLGkpe2NvbnN0IGE9dGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQ7dGhpcy5faGFsZkJsdXIodCxhLGUsbixvLCJsYXRpdHVkaW5hbCIsaSksdGhpcy5faGFsZkJsdXIoYSx0LG4sbixvLCJsb25naXR1ZGluYWwiLGkpfV9oYWxmQmx1cih0LGUsbixvLGksYSxyKXtjb25zdCBzPXRoaXMuX3JlbmRlcmVyLGw9dGhpcy5fYmx1ck1hdGVyaWFsOyJsYXRpdHVkaW5hbCIhPT1hJiYibG9uZ2l0dWRpbmFsIiE9PWEmJmNvbnNvbGUuZXJyb3IoImJsdXIgZGlyZWN0aW9uIG11c3QgYmUgZWl0aGVyIGxhdGl0dWRpbmFsIG9yIGxvbmdpdHVkaW5hbCEiKTtjb25zdCBjPW5ldyBwc3QoUXN0W29dLGwpLGQ9bC51bmlmb3JtcyxwPSRzdFtuXS0xLG09aXNGaW5pdGUoaSk/TWF0aC5QSS8oMipwKToyKk1hdGguUEkvMzksdT1pL20sZj1pc0Zpbml0ZShpKT8xK01hdGguZmxvb3IoMyp1KToyMDtmPjIwJiZjb25zb2xlLndhcm4oYHNpZ21hUmFkaWFucywgJHtpfSwgaXMgdG9vIGxhcmdlIGFuZCB3aWxsIGNsaXAsIGFzIGl0IHJlcXVlc3RlZCAke2Z9IHNhbXBsZXMgd2hlbiB0aGUgbWF4aW11bSBpcyBzZXQgdG8gMjBgKTtjb25zdCBnPVtdO2xldCBoPTA7Zm9yKGxldCB0PTA7dDwyMDsrK3Qpe2NvbnN0IGU9dC91LG49TWF0aC5leHAoLWUqZS8yKTtnLnB1c2gobiksMD09dD9oKz1uOnQ8ZiYmKGgrPTIqbil9Zm9yKGxldCB0PTA7dDxnLmxlbmd0aDt0KyspZ1t0XT1nW3RdL2g7ZC5lbnZNYXAudmFsdWU9dC50ZXh0dXJlLGQuc2FtcGxlcy52YWx1ZT1mLGQud2VpZ2h0cy52YWx1ZT1nLGQubGF0aXR1ZGluYWwudmFsdWU9ImxhdGl0dWRpbmFsIj09PWEsciYmKGQucG9sZUF4aXMudmFsdWU9ciksZC5kVGhldGEudmFsdWU9bSxkLm1pcEludC52YWx1ZT04LW4sZC5pbnB1dEVuY29kaW5nLnZhbHVlPVpzdFt0LnRleHR1cmUuZW5jb2RpbmddLGQub3V0cHV0RW5jb2RpbmcudmFsdWU9WnN0W3QudGV4dHVyZS5lbmNvZGluZ107Y29uc3QgYj0kc3Rbb107cGx0KGUsMypNYXRoLm1heCgwLFdzdC0yKmIpLCgwPT09bz8wOjIqV3N0KSsyKmIqKG8+ND9vLTgrNDowKSwzKmIsMipiKSxzLnNldFJlbmRlclRhcmdldChlKSxzLnJlbmRlcihjLEpzdCl9fWZ1bmN0aW9uIGxsdCh0KXtyZXR1cm4gdm9pZCAwIT09dCYmdC50eXBlPT09X2l0JiYodC5lbmNvZGluZz09PXppdHx8dC5lbmNvZGluZz09PUlpdHx8dC5lbmNvZGluZz09PUhpdCl9ZnVuY3Rpb24gY2x0KCl7Y29uc3QgdD1bXSxlPVtdLG49W107bGV0IG89ODtmb3IobGV0IGk9MDtpPHFzdDtpKyspe2NvbnN0IGE9TWF0aC5wb3coMixvKTtlLnB1c2goYSk7bGV0IHI9MS9hO2k+ND9yPVlzdFtpLTgrNC0xXTowPT1pJiYocj0wKSxuLnB1c2gocik7Y29uc3Qgcz0xLyhhLTEpLGw9LXMvMixjPTErcy8yLGQ9W2wsbCxjLGwsYyxjLGwsbCxjLGMsbCxjXSxwPTYsbT02LHU9MyxmPTIsZz0xLGg9bmV3IEZsb2F0MzJBcnJheSh1Km0qcCksYj1uZXcgRmxvYXQzMkFycmF5KGYqbSpwKSx5PW5ldyBGbG9hdDMyQXJyYXkoZyptKnApO2ZvcihsZXQgdD0wO3Q8cDt0Kyspe2NvbnN0IGU9dCUzKjIvMy0xLG49dD4yPzA6LTE7aC5zZXQoW2UsbiwwLGUrMi8zLG4sMCxlKzIvMyxuKzEsMCxlLG4sMCxlKzIvMyxuKzEsMCxlLG4rMSwwXSx1Km0qdCksYi5zZXQoZCxmKm0qdCkseS5zZXQoW3QsdCx0LHQsdCx0XSxnKm0qdCl9Y29uc3QgXz1uZXcgcXJ0O18uc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IHpydChoLHUpKSxfLnNldEF0dHJpYnV0ZSgidXYiLG5ldyB6cnQoYixmKSksXy5zZXRBdHRyaWJ1dGUoImZhY2VJbmRleCIsbmV3IHpydCh5LGcpKSx0LnB1c2goXyksbz40JiZvLS19cmV0dXJue19sb2RQbGFuZXM6dCxfc2l6ZUxvZHM6ZSxfc2lnbWFzOm59fWZ1bmN0aW9uIGRsdCh0KXtjb25zdCBlPW5ldyByYXQoMypXc3QsMypXc3QsdCk7cmV0dXJuIGUudGV4dHVyZS5tYXBwaW5nPW1pdCxlLnRleHR1cmUubmFtZT0iUE1SRU0uY3ViZVV2IixlLnNjaXNzb3JUZXN0PSEwLGV9ZnVuY3Rpb24gcGx0KHQsZSxuLG8saSl7dC52aWV3cG9ydC5zZXQoZSxuLG8saSksdC5zY2lzc29yLnNldChlLG4sbyxpKX1mdW5jdGlvbiBtbHQoKXtjb25zdCB0PW5ldyBRaXQoMSwxKTtyZXR1cm4gbmV3IEdzdCh7bmFtZToiRXF1aXJlY3Rhbmd1bGFyVG9DdWJlVVYiLHVuaWZvcm1zOntlbnZNYXA6e3ZhbHVlOm51bGx9LHRleGVsU2l6ZTp7dmFsdWU6dH0saW5wdXRFbmNvZGluZzp7dmFsdWU6WnN0WzNlM119LG91dHB1dEVuY29kaW5nOnt2YWx1ZTpac3RbM2UzXX19LHZlcnRleFNoYWRlcjoiXG5cblx0XHRwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblx0XHRwcmVjaXNpb24gbWVkaXVtcCBpbnQ7XG5cblx0XHRhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjtcblx0XHRhdHRyaWJ1dGUgdmVjMiB1djtcblx0XHRhdHRyaWJ1dGUgZmxvYXQgZmFjZUluZGV4O1xuXG5cdFx0dmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247XG5cblx0XHQvLyBSSCBjb29yZGluYXRlIHN5c3RlbTsgUE1SRU0gZmFjZS1pbmRleGluZyBjb252ZW50aW9uXG5cdFx0dmVjMyBnZXREaXJlY3Rpb24oIHZlYzIgdXYsIGZsb2F0IGZhY2UgKSB7XG5cblx0XHRcdHV2ID0gMi4wICogdXYgLSAxLjA7XG5cblx0XHRcdHZlYzMgZGlyZWN0aW9uID0gdmVjMyggdXYsIDEuMCApO1xuXG5cdFx0XHRpZiAoIGZhY2UgPT0gMC4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi56eXg7IC8vICggMSwgdiwgdSApIHBvcyB4XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMS4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi54enk7XG5cdFx0XHRcdGRpcmVjdGlvbi54eiAqPSAtMS4wOyAvLyAoIC11LCAxLCAtdiApIHBvcyB5XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMi4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbi54ICo9IC0xLjA7IC8vICggLXUsIHYsIDEgKSBwb3MgelxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDMuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24uenl4O1xuXHRcdFx0XHRkaXJlY3Rpb24ueHogKj0gLTEuMDsgLy8gKCAtMSwgdiwgLXUgKSBuZWcgeFxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDQuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24ueHp5O1xuXHRcdFx0XHRkaXJlY3Rpb24ueHkgKj0gLTEuMDsgLy8gKCAtdSwgLTEsIHYgKSBuZWcgeVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDUuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24ueiAqPSAtMS4wOyAvLyAoIHUsIHYsIC0xICkgbmVnIHpcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGlyZWN0aW9uO1xuXG5cdFx0fVxuXG5cdFx0dm9pZCBtYWluKCkge1xuXG5cdFx0XHR2T3V0cHV0RGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKCB1diwgZmFjZUluZGV4ICk7XG5cdFx0XHRnbF9Qb3NpdGlvbiA9IHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcblxuXHRcdH1cblx0IixmcmFnbWVudFNoYWRlcjoiXG5cblx0XHRcdHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgaW50O1xuXG5cdFx0XHR2YXJ5aW5nIHZlYzMgdk91dHB1dERpcmVjdGlvbjtcblxuXHRcdFx0dW5pZm9ybSBzYW1wbGVyMkQgZW52TWFwO1xuXHRcdFx0dW5pZm9ybSB2ZWMyIHRleGVsU2l6ZTtcblxuXHRcdFx0XG5cblx0XHR1bmlmb3JtIGludCBpbnB1dEVuY29kaW5nO1xuXHRcdHVuaWZvcm0gaW50IG91dHB1dEVuY29kaW5nO1xuXG5cdFx0I2luY2x1ZGUgPGVuY29kaW5nc19wYXJzX2ZyYWdtZW50PlxuXG5cdFx0dmVjNCBpbnB1dFRleGVsVG9MaW5lYXIoIHZlYzQgdmFsdWUgKSB7XG5cblx0XHRcdGlmICggaW5wdXRFbmNvZGluZyA9PSAwICkge1xuXG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW5wdXRFbmNvZGluZyA9PSAxICkge1xuXG5cdFx0XHRcdHJldHVybiBzUkdCVG9MaW5lYXIoIHZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gMiApIHtcblxuXHRcdFx0XHRyZXR1cm4gUkdCRVRvTGluZWFyKCB2YWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDMgKSB7XG5cblx0XHRcdFx0cmV0dXJuIFJHQk1Ub0xpbmVhciggdmFsdWUsIDcuMCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIFJHQk1Ub0xpbmVhciggdmFsdWUsIDE2LjAgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW5wdXRFbmNvZGluZyA9PSA1ICkge1xuXG5cdFx0XHRcdHJldHVybiBSR0JEVG9MaW5lYXIoIHZhbHVlLCAyNTYuMCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBHYW1tYVRvTGluZWFyKCB2YWx1ZSwgMi4yICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZlYzQgbGluZWFyVG9PdXRwdXRUZXhlbCggdmVjNCB2YWx1ZSApIHtcblxuXHRcdFx0aWYgKCBvdXRwdXRFbmNvZGluZyA9PSAwICkge1xuXG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gMSApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9zUkdCKCB2YWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvdXRwdXRFbmNvZGluZyA9PSAyICkge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb1JHQkUoIHZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDMgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvUkdCTSggdmFsdWUsIDcuMCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvdXRwdXRFbmNvZGluZyA9PSA0ICkge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb1JHQk0oIHZhbHVlLCAxNi4wICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvUkdCRCggdmFsdWUsIDI1Ni4wICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvR2FtbWEoIHZhbHVlLCAyLjIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmVjNCBlbnZNYXBUZXhlbFRvTGluZWFyKCB2ZWM0IGNvbG9yICkge1xuXG5cdFx0XHRyZXR1cm4gaW5wdXRUZXhlbFRvTGluZWFyKCBjb2xvciApO1xuXG5cdFx0fVxuXHRcblxuXHRcdFx0I2luY2x1ZGUgPGNvbW1vbj5cblxuXHRcdFx0dm9pZCBtYWluKCkge1xuXG5cdFx0XHRcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIDAuMCwgMC4wLCAwLjAsIDEuMCApO1xuXG5cdFx0XHRcdHZlYzMgb3V0cHV0RGlyZWN0aW9uID0gbm9ybWFsaXplKCB2T3V0cHV0RGlyZWN0aW9uICk7XG5cdFx0XHRcdHZlYzIgdXYgPSBlcXVpcmVjdFV2KCBvdXRwdXREaXJlY3Rpb24gKTtcblxuXHRcdFx0XHR2ZWMyIGYgPSBmcmFjdCggdXYgLyB0ZXhlbFNpemUgLSAwLjUgKTtcblx0XHRcdFx0dXYgLT0gZiAqIHRleGVsU2l6ZTtcblx0XHRcdFx0dmVjMyB0bCA9IGVudk1hcFRleGVsVG9MaW5lYXIoIHRleHR1cmUyRCAoIGVudk1hcCwgdXYgKSApLnJnYjtcblx0XHRcdFx0dXYueCArPSB0ZXhlbFNpemUueDtcblx0XHRcdFx0dmVjMyB0ciA9IGVudk1hcFRleGVsVG9MaW5lYXIoIHRleHR1cmUyRCAoIGVudk1hcCwgdXYgKSApLnJnYjtcblx0XHRcdFx0dXYueSArPSB0ZXhlbFNpemUueTtcblx0XHRcdFx0dmVjMyBiciA9IGVudk1hcFRleGVsVG9MaW5lYXIoIHRleHR1cmUyRCAoIGVudk1hcCwgdXYgKSApLnJnYjtcblx0XHRcdFx0dXYueCAtPSB0ZXhlbFNpemUueDtcblx0XHRcdFx0dmVjMyBibCA9IGVudk1hcFRleGVsVG9MaW5lYXIoIHRleHR1cmUyRCAoIGVudk1hcCwgdXYgKSApLnJnYjtcblxuXHRcdFx0XHR2ZWMzIHRtID0gbWl4KCB0bCwgdHIsIGYueCApO1xuXHRcdFx0XHR2ZWMzIGJtID0gbWl4KCBibCwgYnIsIGYueCApO1xuXHRcdFx0XHRnbF9GcmFnQ29sb3IucmdiID0gbWl4KCB0bSwgYm0sIGYueSApO1xuXG5cdFx0XHRcdGdsX0ZyYWdDb2xvciA9IGxpbmVhclRvT3V0cHV0VGV4ZWwoIGdsX0ZyYWdDb2xvciApO1xuXG5cdFx0XHR9XG5cdFx0IixibGVuZGluZzowLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExfSl9ZnVuY3Rpb24gdWx0KCl7cmV0dXJuIG5ldyBHc3Qoe25hbWU6IkN1YmVtYXBUb0N1YmVVViIsdW5pZm9ybXM6e2Vudk1hcDp7dmFsdWU6bnVsbH0saW5wdXRFbmNvZGluZzp7dmFsdWU6WnN0WzNlM119LG91dHB1dEVuY29kaW5nOnt2YWx1ZTpac3RbM2UzXX19LHZlcnRleFNoYWRlcjoiXG5cblx0XHRwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblx0XHRwcmVjaXNpb24gbWVkaXVtcCBpbnQ7XG5cblx0XHRhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjtcblx0XHRhdHRyaWJ1dGUgdmVjMiB1djtcblx0XHRhdHRyaWJ1dGUgZmxvYXQgZmFjZUluZGV4O1xuXG5cdFx0dmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247XG5cblx0XHQvLyBSSCBjb29yZGluYXRlIHN5c3RlbTsgUE1SRU0gZmFjZS1pbmRleGluZyBjb252ZW50aW9uXG5cdFx0dmVjMyBnZXREaXJlY3Rpb24oIHZlYzIgdXYsIGZsb2F0IGZhY2UgKSB7XG5cblx0XHRcdHV2ID0gMi4wICogdXYgLSAxLjA7XG5cblx0XHRcdHZlYzMgZGlyZWN0aW9uID0gdmVjMyggdXYsIDEuMCApO1xuXG5cdFx0XHRpZiAoIGZhY2UgPT0gMC4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi56eXg7IC8vICggMSwgdiwgdSApIHBvcyB4XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMS4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi54enk7XG5cdFx0XHRcdGRpcmVjdGlvbi54eiAqPSAtMS4wOyAvLyAoIC11LCAxLCAtdiApIHBvcyB5XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMi4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbi54ICo9IC0xLjA7IC8vICggLXUsIHYsIDEgKSBwb3MgelxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDMuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24uenl4O1xuXHRcdFx0XHRkaXJlY3Rpb24ueHogKj0gLTEuMDsgLy8gKCAtMSwgdiwgLXUgKSBuZWcgeFxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDQuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24ueHp5O1xuXHRcdFx0XHRkaXJlY3Rpb24ueHkgKj0gLTEuMDsgLy8gKCAtdSwgLTEsIHYgKSBuZWcgeVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDUuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24ueiAqPSAtMS4wOyAvLyAoIHUsIHYsIC0xICkgbmVnIHpcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGlyZWN0aW9uO1xuXG5cdFx0fVxuXG5cdFx0dm9pZCBtYWluKCkge1xuXG5cdFx0XHR2T3V0cHV0RGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKCB1diwgZmFjZUluZGV4ICk7XG5cdFx0XHRnbF9Qb3NpdGlvbiA9IHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcblxuXHRcdH1cblx0IixmcmFnbWVudFNoYWRlcjoiXG5cblx0XHRcdHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgaW50O1xuXG5cdFx0XHR2YXJ5aW5nIHZlYzMgdk91dHB1dERpcmVjdGlvbjtcblxuXHRcdFx0dW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZNYXA7XG5cblx0XHRcdFxuXG5cdFx0dW5pZm9ybSBpbnQgaW5wdXRFbmNvZGluZztcblx0XHR1bmlmb3JtIGludCBvdXRwdXRFbmNvZGluZztcblxuXHRcdCNpbmNsdWRlIDxlbmNvZGluZ3NfcGFyc19mcmFnbWVudD5cblxuXHRcdHZlYzQgaW5wdXRUZXhlbFRvTGluZWFyKCB2ZWM0IHZhbHVlICkge1xuXG5cdFx0XHRpZiAoIGlucHV0RW5jb2RpbmcgPT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gMSApIHtcblxuXHRcdFx0XHRyZXR1cm4gc1JHQlRvTGluZWFyKCB2YWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDIgKSB7XG5cblx0XHRcdFx0cmV0dXJuIFJHQkVUb0xpbmVhciggdmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW5wdXRFbmNvZGluZyA9PSAzICkge1xuXG5cdFx0XHRcdHJldHVybiBSR0JNVG9MaW5lYXIoIHZhbHVlLCA3LjAgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW5wdXRFbmNvZGluZyA9PSA0ICkge1xuXG5cdFx0XHRcdHJldHVybiBSR0JNVG9MaW5lYXIoIHZhbHVlLCAxNi4wICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gNSApIHtcblxuXHRcdFx0XHRyZXR1cm4gUkdCRFRvTGluZWFyKCB2YWx1ZSwgMjU2LjAgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZXR1cm4gR2FtbWFUb0xpbmVhciggdmFsdWUsIDIuMiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2ZWM0IGxpbmVhclRvT3V0cHV0VGV4ZWwoIHZlYzQgdmFsdWUgKSB7XG5cblx0XHRcdGlmICggb3V0cHV0RW5jb2RpbmcgPT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDEgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvc1JHQiggdmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gMiApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9SR0JFKCB2YWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvdXRwdXRFbmNvZGluZyA9PSAzICkge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb1JHQk0oIHZhbHVlLCA3LjAgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gNCApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9SR0JNKCB2YWx1ZSwgMTYuMCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvdXRwdXRFbmNvZGluZyA9PSA1ICkge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb1JHQkQoIHZhbHVlLCAyNTYuMCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb0dhbW1hKCB2YWx1ZSwgMi4yICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZlYzQgZW52TWFwVGV4ZWxUb0xpbmVhciggdmVjNCBjb2xvciApIHtcblxuXHRcdFx0cmV0dXJuIGlucHV0VGV4ZWxUb0xpbmVhciggY29sb3IgKTtcblxuXHRcdH1cblx0XG5cblx0XHRcdHZvaWQgbWFpbigpIHtcblxuXHRcdFx0XHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTtcblx0XHRcdFx0Z2xfRnJhZ0NvbG9yLnJnYiA9IGVudk1hcFRleGVsVG9MaW5lYXIoIHRleHR1cmVDdWJlKCBlbnZNYXAsIHZlYzMoIC0gdk91dHB1dERpcmVjdGlvbi54LCB2T3V0cHV0RGlyZWN0aW9uLnl6ICkgKSApLnJnYjtcblx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbCggZ2xfRnJhZ0NvbG9yICk7XG5cblx0XHRcdH1cblx0XHQiLGJsZW5kaW5nOjAsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITF9KX1mdW5jdGlvbiBmbHQodCl7bGV0IGU9bmV3IFdlYWtNYXAsbj1udWxsO2Z1bmN0aW9uIG8odCl7Y29uc3Qgbj10LnRhcmdldDtuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLG8pO2NvbnN0IGk9ZS5nZXQobik7dm9pZCAwIT09aSYmKGkuZGVsZXRlKG4pLGkuZGlzcG9zZSgpKX1yZXR1cm57Z2V0OmZ1bmN0aW9uIGkoYSl7aWYoYSYmYS5pc1RleHR1cmUmJiExPT09YS5pc1JlbmRlclRhcmdldFRleHR1cmUpe2NvbnN0IGk9YS5tYXBwaW5nLHI9MzAzPT09aXx8MzA0PT09aSxzPWk9PT1kaXR8fGk9PT1waXQ7aWYocnx8cyl7aWYoZS5oYXMoYSkpcmV0dXJuIGUuZ2V0KGEpLnRleHR1cmU7e2NvbnN0IGk9YS5pbWFnZTtpZihyJiZpJiZpLmhlaWdodD4wfHxzJiZpJiYoZnVuY3Rpb24gcih0KXtsZXQgZT0wO2ZvcihsZXQgbj0wO248NjtuKyspdm9pZCAwIT09dFtuXSYmZSsrO3JldHVybiA2PT09ZX0pKGkpKXtjb25zdCBpPXQuZ2V0UmVuZGVyVGFyZ2V0KCk7bnVsbD09PW4mJihuPW5ldyBzbHQodCkpO2NvbnN0IHM9cj9uLmZyb21FcXVpcmVjdGFuZ3VsYXIoYSk6bi5mcm9tQ3ViZW1hcChhKTtyZXR1cm4gZS5zZXQoYSxzKSx0LnNldFJlbmRlclRhcmdldChpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLG8pLHMudGV4dHVyZX1yZXR1cm4gbnVsbH19fXJldHVybiBhfSxkaXNwb3NlOmZ1bmN0aW9uIGEoKXtlPW5ldyBXZWFrTWFwLG51bGwhPT1uJiYobi5kaXNwb3NlKCksbj1udWxsKX19fWZ1bmN0aW9uIGdsdCh0KXtjb25zdCBlPXt9O2Z1bmN0aW9uIG4obil7aWYodm9pZCAwIT09ZVtuXSlyZXR1cm4gZVtuXTtsZXQgbztzd2l0Y2gobil7Y2FzZSJXRUJHTF9kZXB0aF90ZXh0dXJlIjpvPXQuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9kZXB0aF90ZXh0dXJlIil8fHQuZ2V0RXh0ZW5zaW9uKCJNT1pfV0VCR0xfZGVwdGhfdGV4dHVyZSIpfHx0LmdldEV4dGVuc2lvbigiV0VCS0lUX1dFQkdMX2RlcHRoX3RleHR1cmUiKTticmVhaztjYXNlIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyI6bz10LmdldEV4dGVuc2lvbigiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIil8fHQuZ2V0RXh0ZW5zaW9uKCJNT1pfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIil8fHQuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik7YnJlYWs7Y2FzZSJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyI6bz10LmdldEV4dGVuc2lvbigiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKXx8dC5nZXRFeHRlbnNpb24oIk1PWl9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpfHx0LmdldEV4dGVuc2lvbigiV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIik7YnJlYWs7Y2FzZSJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiOm89dC5nZXRFeHRlbnNpb24oIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpfHx0LmdldEV4dGVuc2lvbigiV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpO2JyZWFrO2RlZmF1bHQ6bz10LmdldEV4dGVuc2lvbihuKX1yZXR1cm4gZVtuXT1vLG99cmV0dXJue2hhczpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9PW4odCl9LGluaXQ6ZnVuY3Rpb24odCl7dC5pc1dlYkdMMj9uKCJFWFRfY29sb3JfYnVmZmVyX2Zsb2F0Iik6KG4oIldFQkdMX2RlcHRoX3RleHR1cmUiKSxuKCJPRVNfdGV4dHVyZV9mbG9hdCIpLG4oIk9FU190ZXh0dXJlX2hhbGZfZmxvYXQiKSxuKCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhciIpLG4oIk9FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyIpLG4oIk9FU19lbGVtZW50X2luZGV4X3VpbnQiKSxuKCJPRVNfdmVydGV4X2FycmF5X29iamVjdCIpLG4oIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSksbigiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIiksbigiRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0Iil9LGdldDpmdW5jdGlvbih0KXtjb25zdCBlPW4odCk7cmV0dXJuIG51bGw9PT1lJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6ICIrdCsiIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLiIpLGV9fX1mdW5jdGlvbiBobHQodCxlLG4sbyl7Y29uc3QgaT17fSxhPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIHIodCl7Y29uc3Qgcz10LnRhcmdldDtudWxsIT09cy5pbmRleCYmZS5yZW1vdmUocy5pbmRleCk7Zm9yKGNvbnN0IHQgaW4gcy5hdHRyaWJ1dGVzKWUucmVtb3ZlKHMuYXR0cmlidXRlc1t0XSk7cy5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixyKSxkZWxldGUgaVtzLmlkXTtjb25zdCBsPWEuZ2V0KHMpO2wmJihlLnJlbW92ZShsKSxhLmRlbGV0ZShzKSksby5yZWxlYXNlU3RhdGVzT2ZHZW9tZXRyeShzKSwhMD09PXMuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSYmZGVsZXRlIHMuX21heEluc3RhbmNlQ291bnQsbi5tZW1vcnkuZ2VvbWV0cmllcy0tfWZ1bmN0aW9uIHModCl7Y29uc3Qgbj1bXSxvPXQuaW5kZXgsaT10LmF0dHJpYnV0ZXMucG9zaXRpb247bGV0IHI9MDtpZihudWxsIT09byl7Y29uc3QgdD1vLmFycmF5O3I9by52ZXJzaW9uO2ZvcihsZXQgZT0wLG89dC5sZW5ndGg7ZTxvO2UrPTMpe2NvbnN0IG89dFtlKzBdLGk9dFtlKzFdLGE9dFtlKzJdO24ucHVzaChvLGksaSxhLGEsbyl9fWVsc2V7cj1pLnZlcnNpb247Zm9yKGxldCB0PTAsZT1pLmFycmF5Lmxlbmd0aC8zLTE7dDxlO3QrPTMpe2NvbnN0IGU9dCswLG89dCsxLGk9dCsyO24ucHVzaChlLG8sbyxpLGksZSl9fWNvbnN0IHM9bmV3KExydChuKT42NTUzNT9IcnQ6SXJ0KShuLDEpO3MudmVyc2lvbj1yO2NvbnN0IGw9YS5nZXQodCk7bCYmZS5yZW1vdmUobCksYS5zZXQodCxzKX1yZXR1cm57Z2V0OmZ1bmN0aW9uIGwodCxlKXtyZXR1cm4hMD09PWlbZS5pZF18fChlLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHIpLGlbZS5pZF09ITAsbi5tZW1vcnkuZ2VvbWV0cmllcysrKSxlfSx1cGRhdGU6ZnVuY3Rpb24gYyh0KXtjb25zdCBuPXQuYXR0cmlidXRlcztmb3IoY29uc3QgdCBpbiBuKWUudXBkYXRlKG5bdF0sMzQ5NjIpO2NvbnN0IG89dC5tb3JwaEF0dHJpYnV0ZXM7Zm9yKGNvbnN0IHQgaW4gbyl7Y29uc3Qgbj1vW3RdO2ZvcihsZXQgdD0wLG89bi5sZW5ndGg7dDxvO3QrKyllLnVwZGF0ZShuW3RdLDM0OTYyKX19LGdldFdpcmVmcmFtZUF0dHJpYnV0ZTpmdW5jdGlvbiBkKHQpe2NvbnN0IGU9YS5nZXQodCk7aWYoZSl7Y29uc3Qgbj10LmluZGV4O251bGwhPT1uJiZlLnZlcnNpb248bi52ZXJzaW9uJiZzKHQpfWVsc2Ugcyh0KTtyZXR1cm4gYS5nZXQodCl9fX1mdW5jdGlvbiBibHQodCxlLG4sbyl7Y29uc3QgaT1vLmlzV2ViR0wyO2xldCBhLHIsczt0aGlzLnNldE1vZGU9ZnVuY3Rpb24gbCh0KXthPXR9LHRoaXMuc2V0SW5kZXg9ZnVuY3Rpb24gYyh0KXtyPXQudHlwZSxzPXQuYnl0ZXNQZXJFbGVtZW50fSx0aGlzLnJlbmRlcj1mdW5jdGlvbiBkKGUsbyl7dC5kcmF3RWxlbWVudHMoYSxvLHIsZSpzKSxuLnVwZGF0ZShvLGEsMSl9LHRoaXMucmVuZGVySW5zdGFuY2VzPWZ1bmN0aW9uIHAobyxsLGMpe2lmKDA9PT1jKXJldHVybjtsZXQgZCxwO2lmKGkpZD10LHA9ImRyYXdFbGVtZW50c0luc3RhbmNlZCI7ZWxzZSBpZihkPWUuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikscD0iZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUiLG51bGw9PT1kKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyOiB1c2luZyBUSFJFRS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNpb24gQU5HTEVfaW5zdGFuY2VkX2FycmF5cy4iKTtkW3BdKGEsbCxyLG8qcyxjKSxuLnVwZGF0ZShsLGEsYyl9fWZ1bmN0aW9uIHlsdCh0KXtjb25zdCBlPXtmcmFtZTowLGNhbGxzOjAsdHJpYW5nbGVzOjAscG9pbnRzOjAsbGluZXM6MH07cmV0dXJue21lbW9yeTp7Z2VvbWV0cmllczowLHRleHR1cmVzOjB9LHJlbmRlcjplLHByb2dyYW1zOm51bGwsYXV0b1Jlc2V0OiEwLHJlc2V0OmZ1bmN0aW9uIG4oKXtlLmZyYW1lKyssZS5jYWxscz0wLGUudHJpYW5nbGVzPTAsZS5wb2ludHM9MCxlLmxpbmVzPTB9LHVwZGF0ZTpmdW5jdGlvbiBvKHQsbixpKXtzd2l0Y2goZS5jYWxscysrLG4pe2Nhc2UgNDplLnRyaWFuZ2xlcys9aSoodC8zKTticmVhaztjYXNlIDE6ZS5saW5lcys9aSoodC8yKTticmVhaztjYXNlIDM6ZS5saW5lcys9aSoodC0xKTticmVhaztjYXNlIDI6ZS5saW5lcys9aSp0O2JyZWFrO2Nhc2UgMDplLnBvaW50cys9aSp0O2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xJbmZvOiBVbmtub3duIGRyYXcgbW9kZToiLG4pfX19fWZ1bmN0aW9uIF9sdCh0LGUpe3JldHVybiB0WzBdLWVbMF19ZnVuY3Rpb24gQ2x0KHQsZSl7cmV0dXJuIE1hdGguYWJzKGVbMV0pLU1hdGguYWJzKHRbMV0pfWZ1bmN0aW9uIE1sdCh0KXtjb25zdCBlPXt9LG49bmV3IEZsb2F0MzJBcnJheSg4KSxvPVtdO2ZvcihsZXQgdD0wO3Q8ODt0Kyspb1t0XT1bdCwwXTtyZXR1cm57dXBkYXRlOmZ1bmN0aW9uIGkoYSxyLHMsbCl7Y29uc3QgYz1hLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyxkPXZvaWQgMD09PWM/MDpjLmxlbmd0aDtsZXQgcD1lW3IuaWRdO2lmKHZvaWQgMD09PXB8fHAubGVuZ3RoIT09ZCl7cD1bXTtmb3IobGV0IHQ9MDt0PGQ7dCsrKXBbdF09W3QsMF07ZVtyLmlkXT1wfWZvcihsZXQgdD0wO3Q8ZDt0Kyspe2NvbnN0IGU9cFt0XTtlWzBdPXQsZVsxXT1jW3RdfXAuc29ydChDbHQpO2ZvcihsZXQgdD0wO3Q8ODt0KyspdDxkJiZwW3RdWzFdPyhvW3RdWzBdPXBbdF1bMF0sb1t0XVsxXT1wW3RdWzFdKToob1t0XVswXT1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUixvW3RdWzFdPTApO28uc29ydChfbHQpO2NvbnN0IG09ci5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24sdT1yLm1vcnBoQXR0cmlidXRlcy5ub3JtYWw7bGV0IGY9MDtmb3IobGV0IHQ9MDt0PDg7dCsrKXtjb25zdCBlPW9bdF0saT1lWzBdLGE9ZVsxXTtpIT09TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVImJmE/KG0mJnIuZ2V0QXR0cmlidXRlKCJtb3JwaFRhcmdldCIrdCkhPT1tW2ldJiZyLnNldEF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK3QsbVtpXSksdSYmci5nZXRBdHRyaWJ1dGUoIm1vcnBoTm9ybWFsIit0KSE9PXVbaV0mJnIuc2V0QXR0cmlidXRlKCJtb3JwaE5vcm1hbCIrdCx1W2ldKSxuW3RdPWEsZis9YSk6KG0mJiEwPT09ci5oYXNBdHRyaWJ1dGUoIm1vcnBoVGFyZ2V0Iit0KSYmci5kZWxldGVBdHRyaWJ1dGUoIm1vcnBoVGFyZ2V0Iit0KSx1JiYhMD09PXIuaGFzQXR0cmlidXRlKCJtb3JwaE5vcm1hbCIrdCkmJnIuZGVsZXRlQXR0cmlidXRlKCJtb3JwaE5vcm1hbCIrdCksblt0XT0wKX1jb25zdCBnPXIubW9ycGhUYXJnZXRzUmVsYXRpdmU/MToxLWY7bC5nZXRVbmlmb3JtcygpLnNldFZhbHVlKHQsIm1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZSIsZyksbC5nZXRVbmlmb3JtcygpLnNldFZhbHVlKHQsIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyIsbil9fX1mdW5jdGlvbiB2bHQodCxlLG4sbyl7bGV0IGk9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gYSh0KXtjb25zdCBlPXQudGFyZ2V0O2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYSksbi5yZW1vdmUoZS5pbnN0YW5jZU1hdHJpeCksbnVsbCE9PWUuaW5zdGFuY2VDb2xvciYmbi5yZW1vdmUoZS5pbnN0YW5jZUNvbG9yKX1yZXR1cm57dXBkYXRlOmZ1bmN0aW9uIHIodCl7Y29uc3Qgcj1vLnJlbmRlci5mcmFtZSxzPWUuZ2V0KHQsdC5nZW9tZXRyeSk7cmV0dXJuIGkuZ2V0KHMpIT09ciYmKGUudXBkYXRlKHMpLGkuc2V0KHMscikpLHQuaXNJbnN0YW5jZWRNZXNoJiYoITE9PT10Lmhhc0V2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGEpJiZ0LmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGEpLG4udXBkYXRlKHQuaW5zdGFuY2VNYXRyaXgsMzQ5NjIpLG51bGwhPT10Lmluc3RhbmNlQ29sb3ImJm4udXBkYXRlKHQuaW5zdGFuY2VDb2xvciwzNDk2MikpLHN9LGRpc3Bvc2U6ZnVuY3Rpb24gcygpe2k9bmV3IFdlYWtNYXB9fX1jbGFzcyB4bHQgZXh0ZW5kcyBvYXR7Y29uc3RydWN0b3IodD1udWxsLGU9MSxuPTEsbz0xKXtzdXBlcihudWxsKSx0aGlzLmltYWdlPXtkYXRhOnQsd2lkdGg6ZSxoZWlnaHQ6bixkZXB0aDpvfSx0aGlzLm1hZ0ZpbHRlcj1oaXQsdGhpcy5taW5GaWx0ZXI9aGl0LHRoaXMud3JhcFI9Zml0LHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExLHRoaXMuZmxpcFk9ITEsdGhpcy51bnBhY2tBbGlnbm1lbnQ9MSx0aGlzLm5lZWRzVXBkYXRlPSEwfX14bHQucHJvdG90eXBlLmlzRGF0YVRleHR1cmUyREFycmF5PSEwO2NsYXNzIE9sdCBleHRlbmRzIG9hdHtjb25zdHJ1Y3Rvcih0PW51bGwsZT0xLG49MSxvPTEpe3N1cGVyKG51bGwpLHRoaXMuaW1hZ2U9e2RhdGE6dCx3aWR0aDplLGhlaWdodDpuLGRlcHRoOm99LHRoaXMubWFnRmlsdGVyPWhpdCx0aGlzLm1pbkZpbHRlcj1oaXQsdGhpcy53cmFwUj1maXQsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITEsdGhpcy5mbGlwWT0hMSx0aGlzLnVucGFja0FsaWdubWVudD0xLHRoaXMubmVlZHNVcGRhdGU9ITB9fU9sdC5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZTNEPSEwO2NvbnN0IFBsdD1uZXcgb2F0LHdsdD1uZXcgeGx0LGtsdD1uZXcgT2x0LFNsdD1uZXcgdnN0LERsdD1bXSxFbHQ9W10sUmx0PW5ldyBGbG9hdDMyQXJyYXkoMTYpLEFsdD1uZXcgRmxvYXQzMkFycmF5KDkpLFRsdD1uZXcgRmxvYXQzMkFycmF5KDQpO2Z1bmN0aW9uIE5sdCh0LGUsbil7Y29uc3Qgbz10WzBdO2lmKG88PTB8fG8+MClyZXR1cm4gdDtjb25zdCBpPWUqbjtsZXQgYT1EbHRbaV07aWYodm9pZCAwPT09YSYmKGE9bmV3IEZsb2F0MzJBcnJheShpKSxEbHRbaV09YSksMCE9PWUpe28udG9BcnJheShhLDApO2ZvcihsZXQgbz0xLGk9MDtvIT09ZTsrK28paSs9bix0W29dLnRvQXJyYXkoYSxpKX1yZXR1cm4gYX1mdW5jdGlvbiB6bHQodCxlKXtpZih0Lmxlbmd0aCE9PWUubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgbj0wLG89dC5sZW5ndGg7bjxvO24rKylpZih0W25dIT09ZVtuXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBJbHQodCxlKXtmb3IobGV0IG49MCxvPWUubGVuZ3RoO248bztuKyspdFtuXT1lW25dfWZ1bmN0aW9uIEhsdCh0LGUpe2xldCBuPUVsdFtlXTt2b2lkIDA9PT1uJiYobj1uZXcgSW50MzJBcnJheShlKSxFbHRbZV09bik7Zm9yKGxldCBvPTA7byE9PWU7KytvKW5bb109dC5hbGxvY2F0ZVRleHR1cmVVbml0KCk7cmV0dXJuIG59ZnVuY3Rpb24gRmx0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlO25bMF0hPT1lJiYodC51bmlmb3JtMWYodGhpcy5hZGRyLGUpLG5bMF09ZSl9ZnVuY3Rpb24gTGx0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlO2lmKHZvaWQgMCE9PWUueCluWzBdPT09ZS54JiZuWzFdPT09ZS55fHwodC51bmlmb3JtMmYodGhpcy5hZGRyLGUueCxlLnkpLG5bMF09ZS54LG5bMV09ZS55KTtlbHNle2lmKHpsdChuLGUpKXJldHVybjt0LnVuaWZvcm0yZnYodGhpcy5hZGRyLGUpLElsdChuLGUpfX1mdW5jdGlvbiBCbHQodCxlKXtjb25zdCBuPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09ZS54KW5bMF09PT1lLngmJm5bMV09PT1lLnkmJm5bMl09PT1lLnp8fCh0LnVuaWZvcm0zZih0aGlzLmFkZHIsZS54LGUueSxlLnopLG5bMF09ZS54LG5bMV09ZS55LG5bMl09ZS56KTtlbHNlIGlmKHZvaWQgMCE9PWUuciluWzBdPT09ZS5yJiZuWzFdPT09ZS5nJiZuWzJdPT09ZS5ifHwodC51bmlmb3JtM2YodGhpcy5hZGRyLGUucixlLmcsZS5iKSxuWzBdPWUucixuWzFdPWUuZyxuWzJdPWUuYik7ZWxzZXtpZih6bHQobixlKSlyZXR1cm47dC51bmlmb3JtM2Z2KHRoaXMuYWRkcixlKSxJbHQobixlKX19ZnVuY3Rpb24gVmx0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlO2lmKHZvaWQgMCE9PWUueCluWzBdPT09ZS54JiZuWzFdPT09ZS55JiZuWzJdPT09ZS56JiZuWzNdPT09ZS53fHwodC51bmlmb3JtNGYodGhpcy5hZGRyLGUueCxlLnksZS56LGUudyksblswXT1lLngsblsxXT1lLnksblsyXT1lLnosblszXT1lLncpO2Vsc2V7aWYoemx0KG4sZSkpcmV0dXJuO3QudW5pZm9ybTRmdih0aGlzLmFkZHIsZSksSWx0KG4sZSl9fWZ1bmN0aW9uIGpsdCh0LGUpe2NvbnN0IG49dGhpcy5jYWNoZSxvPWUuZWxlbWVudHM7aWYodm9pZCAwPT09byl7aWYoemx0KG4sZSkpcmV0dXJuO3QudW5pZm9ybU1hdHJpeDJmdih0aGlzLmFkZHIsITEsZSksSWx0KG4sZSl9ZWxzZXtpZih6bHQobixvKSlyZXR1cm47VGx0LnNldChvKSx0LnVuaWZvcm1NYXRyaXgyZnYodGhpcy5hZGRyLCExLFRsdCksSWx0KG4sbyl9fWZ1bmN0aW9uIFVsdCh0LGUpe2NvbnN0IG49dGhpcy5jYWNoZSxvPWUuZWxlbWVudHM7aWYodm9pZCAwPT09byl7aWYoemx0KG4sZSkpcmV0dXJuO3QudW5pZm9ybU1hdHJpeDNmdih0aGlzLmFkZHIsITEsZSksSWx0KG4sZSl9ZWxzZXtpZih6bHQobixvKSlyZXR1cm47QWx0LnNldChvKSx0LnVuaWZvcm1NYXRyaXgzZnYodGhpcy5hZGRyLCExLEFsdCksSWx0KG4sbyl9fWZ1bmN0aW9uIEdsdCh0LGUpe2NvbnN0IG49dGhpcy5jYWNoZSxvPWUuZWxlbWVudHM7aWYodm9pZCAwPT09byl7aWYoemx0KG4sZSkpcmV0dXJuO3QudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsITEsZSksSWx0KG4sZSl9ZWxzZXtpZih6bHQobixvKSlyZXR1cm47Umx0LnNldChvKSx0LnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5hZGRyLCExLFJsdCksSWx0KG4sbyl9fWZ1bmN0aW9uIFdsdCh0LGUpe2NvbnN0IG49dGhpcy5jYWNoZTtuWzBdIT09ZSYmKHQudW5pZm9ybTFpKHRoaXMuYWRkcixlKSxuWzBdPWUpfWZ1bmN0aW9uIFlsdCh0LGUpe2NvbnN0IG49dGhpcy5jYWNoZTt6bHQobixlKXx8KHQudW5pZm9ybTJpdih0aGlzLmFkZHIsZSksSWx0KG4sZSkpfWZ1bmN0aW9uIHFsdCh0LGUpe2NvbnN0IG49dGhpcy5jYWNoZTt6bHQobixlKXx8KHQudW5pZm9ybTNpdih0aGlzLmFkZHIsZSksSWx0KG4sZSkpfWZ1bmN0aW9uIFpsdCh0LGUpe2NvbnN0IG49dGhpcy5jYWNoZTt6bHQobixlKXx8KHQudW5pZm9ybTRpdih0aGlzLmFkZHIsZSksSWx0KG4sZSkpfWZ1bmN0aW9uIFhsdCh0LGUpe2NvbnN0IG49dGhpcy5jYWNoZTtuWzBdIT09ZSYmKHQudW5pZm9ybTF1aSh0aGlzLmFkZHIsZSksblswXT1lKX1mdW5jdGlvbiBLbHQodCxlKXtjb25zdCBuPXRoaXMuY2FjaGU7emx0KG4sZSl8fCh0LnVuaWZvcm0ydWl2KHRoaXMuYWRkcixlKSxJbHQobixlKSl9ZnVuY3Rpb24gSmx0KHQsZSl7Y29uc3Qgbj10aGlzLmNhY2hlO3psdChuLGUpfHwodC51bmlmb3JtM3Vpdih0aGlzLmFkZHIsZSksSWx0KG4sZSkpfWZ1bmN0aW9uIFFsdCh0LGUpe2NvbnN0IG49dGhpcy5jYWNoZTt6bHQobixlKXx8KHQudW5pZm9ybTR1aXYodGhpcy5hZGRyLGUpLElsdChuLGUpKX1mdW5jdGlvbiAkbHQodCxlLG4pe2NvbnN0IG89dGhpcy5jYWNoZSxpPW4uYWxsb2NhdGVUZXh0dXJlVW5pdCgpO29bMF0hPT1pJiYodC51bmlmb3JtMWkodGhpcy5hZGRyLGkpLG9bMF09aSksbi5zYWZlU2V0VGV4dHVyZTJEKGV8fFBsdCxpKX1mdW5jdGlvbiB0Y3QodCxlLG4pe2NvbnN0IG89dGhpcy5jYWNoZSxpPW4uYWxsb2NhdGVUZXh0dXJlVW5pdCgpO29bMF0hPT1pJiYodC51bmlmb3JtMWkodGhpcy5hZGRyLGkpLG9bMF09aSksbi5zZXRUZXh0dXJlM0QoZXx8a2x0LGkpfWZ1bmN0aW9uIGVjdCh0LGUsbil7Y29uc3Qgbz10aGlzLmNhY2hlLGk9bi5hbGxvY2F0ZVRleHR1cmVVbml0KCk7b1swXSE9PWkmJih0LnVuaWZvcm0xaSh0aGlzLmFkZHIsaSksb1swXT1pKSxuLnNhZmVTZXRUZXh0dXJlQ3ViZShlfHxTbHQsaSl9ZnVuY3Rpb24gbmN0KHQsZSxuKXtjb25zdCBvPXRoaXMuY2FjaGUsaT1uLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtvWzBdIT09aSYmKHQudW5pZm9ybTFpKHRoaXMuYWRkcixpKSxvWzBdPWkpLG4uc2V0VGV4dHVyZTJEQXJyYXkoZXx8d2x0LGkpfWZ1bmN0aW9uIG9jdCh0LGUpe3QudW5pZm9ybTFmdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gaWN0KHQsZSl7Y29uc3Qgbj1ObHQoZSx0aGlzLnNpemUsMik7dC51bmlmb3JtMmZ2KHRoaXMuYWRkcixuKX1mdW5jdGlvbiBhY3QodCxlKXtjb25zdCBuPU5sdChlLHRoaXMuc2l6ZSwzKTt0LnVuaWZvcm0zZnYodGhpcy5hZGRyLG4pfWZ1bmN0aW9uIHJjdCh0LGUpe2NvbnN0IG49Tmx0KGUsdGhpcy5zaXplLDQpO3QudW5pZm9ybTRmdih0aGlzLmFkZHIsbil9ZnVuY3Rpb24gc2N0KHQsZSl7Y29uc3Qgbj1ObHQoZSx0aGlzLnNpemUsNCk7dC51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxuKX1mdW5jdGlvbiBsY3QodCxlKXtjb25zdCBuPU5sdChlLHRoaXMuc2l6ZSw5KTt0LnVuaWZvcm1NYXRyaXgzZnYodGhpcy5hZGRyLCExLG4pfWZ1bmN0aW9uIGNjdCh0LGUpe2NvbnN0IG49Tmx0KGUsdGhpcy5zaXplLDE2KTt0LnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5hZGRyLCExLG4pfWZ1bmN0aW9uIGRjdCh0LGUpe3QudW5pZm9ybTFpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gcGN0KHQsZSl7dC51bmlmb3JtMml2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBtY3QodCxlKXt0LnVuaWZvcm0zaXYodGhpcy5hZGRyLGUpfWZ1bmN0aW9uIHVjdCh0LGUpe3QudW5pZm9ybTRpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gZmN0KHQsZSl7dC51bmlmb3JtMXVpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gZ2N0KHQsZSl7dC51bmlmb3JtMnVpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gaGN0KHQsZSl7dC51bmlmb3JtM3Vpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gYmN0KHQsZSl7dC51bmlmb3JtNHVpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24geWN0KHQsZSxuKXtjb25zdCBvPWUubGVuZ3RoLGk9SGx0KG4sbyk7dC51bmlmb3JtMWl2KHRoaXMuYWRkcixpKTtmb3IobGV0IHQ9MDt0IT09bzsrK3Qpbi5zYWZlU2V0VGV4dHVyZTJEKGVbdF18fFBsdCxpW3RdKX1mdW5jdGlvbiBfY3QodCxlLG4pe2NvbnN0IG89ZS5sZW5ndGgsaT1IbHQobixvKTt0LnVuaWZvcm0xaXYodGhpcy5hZGRyLGkpO2ZvcihsZXQgdD0wO3QhPT1vOysrdCluLnNhZmVTZXRUZXh0dXJlQ3ViZShlW3RdfHxTbHQsaVt0XSl9ZnVuY3Rpb24gQ2N0KHQsZSxuKXt0aGlzLmlkPXQsdGhpcy5hZGRyPW4sdGhpcy5jYWNoZT1bXSx0aGlzLnNldFZhbHVlPShmdW5jdGlvbiBvKHQpe3N3aXRjaCh0KXtjYXNlIDUxMjY6cmV0dXJuIEZsdDtjYXNlIDM1NjY0OnJldHVybiBMbHQ7Y2FzZSAzNTY2NTpyZXR1cm4gQmx0O2Nhc2UgMzU2NjY6cmV0dXJuIFZsdDtjYXNlIDM1Njc0OnJldHVybiBqbHQ7Y2FzZSAzNTY3NTpyZXR1cm4gVWx0O2Nhc2UgMzU2NzY6cmV0dXJuIEdsdDtjYXNlIDUxMjQ6Y2FzZSAzNTY3MDpyZXR1cm4gV2x0O2Nhc2UgMzU2Njc6Y2FzZSAzNTY3MTpyZXR1cm4gWWx0O2Nhc2UgMzU2Njg6Y2FzZSAzNTY3MjpyZXR1cm4gcWx0O2Nhc2UgMzU2Njk6Y2FzZSAzNTY3MzpyZXR1cm4gWmx0O2Nhc2UgNTEyNTpyZXR1cm4gWGx0O2Nhc2UgMzYyOTQ6cmV0dXJuIEtsdDtjYXNlIDM2Mjk1OnJldHVybiBKbHQ7Y2FzZSAzNjI5NjpyZXR1cm4gUWx0O2Nhc2UgMzU2Nzg6Y2FzZSAzNjE5ODpjYXNlIDM2Mjk4OmNhc2UgMzYzMDY6Y2FzZSAzNTY4MjpyZXR1cm4gJGx0O2Nhc2UgMzU2Nzk6Y2FzZSAzNjI5OTpjYXNlIDM2MzA3OnJldHVybiB0Y3Q7Y2FzZSAzNTY4MDpjYXNlIDM2MzAwOmNhc2UgMzYzMDg6Y2FzZSAzNjI5MzpyZXR1cm4gZWN0O2Nhc2UgMzYyODk6Y2FzZSAzNjMwMzpjYXNlIDM2MzExOmNhc2UgMzYyOTI6cmV0dXJuIG5jdH19KShlLnR5cGUpfWZ1bmN0aW9uIE1jdCh0LGUsbil7dGhpcy5pZD10LHRoaXMuYWRkcj1uLHRoaXMuY2FjaGU9W10sdGhpcy5zaXplPWUuc2l6ZSx0aGlzLnNldFZhbHVlPShmdW5jdGlvbiBvKHQpe3N3aXRjaCh0KXtjYXNlIDUxMjY6cmV0dXJuIG9jdDtjYXNlIDM1NjY0OnJldHVybiBpY3Q7Y2FzZSAzNTY2NTpyZXR1cm4gYWN0O2Nhc2UgMzU2NjY6cmV0dXJuIHJjdDtjYXNlIDM1Njc0OnJldHVybiBzY3Q7Y2FzZSAzNTY3NTpyZXR1cm4gbGN0O2Nhc2UgMzU2NzY6cmV0dXJuIGNjdDtjYXNlIDUxMjQ6Y2FzZSAzNTY3MDpyZXR1cm4gZGN0O2Nhc2UgMzU2Njc6Y2FzZSAzNTY3MTpyZXR1cm4gcGN0O2Nhc2UgMzU2Njg6Y2FzZSAzNTY3MjpyZXR1cm4gbWN0O2Nhc2UgMzU2Njk6Y2FzZSAzNTY3MzpyZXR1cm4gdWN0O2Nhc2UgNTEyNTpyZXR1cm4gZmN0O2Nhc2UgMzYyOTQ6cmV0dXJuIGdjdDtjYXNlIDM2Mjk1OnJldHVybiBoY3Q7Y2FzZSAzNjI5NjpyZXR1cm4gYmN0O2Nhc2UgMzU2Nzg6Y2FzZSAzNjE5ODpjYXNlIDM2Mjk4OmNhc2UgMzYzMDY6Y2FzZSAzNTY4MjpyZXR1cm4geWN0O2Nhc2UgMzU2ODA6Y2FzZSAzNjMwMDpjYXNlIDM2MzA4OmNhc2UgMzYyOTM6cmV0dXJuIF9jdH19KShlLnR5cGUpfWZ1bmN0aW9uIHZjdCh0KXt0aGlzLmlkPXQsdGhpcy5zZXE9W10sdGhpcy5tYXA9e319TWN0LnByb3RvdHlwZS51cGRhdGVDYWNoZT1mdW5jdGlvbih0KXtjb25zdCBlPXRoaXMuY2FjaGU7dCBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSYmZS5sZW5ndGghPT10Lmxlbmd0aCYmKHRoaXMuY2FjaGU9bmV3IEZsb2F0MzJBcnJheSh0Lmxlbmd0aCkpLElsdChlLHQpfSx2Y3QucHJvdG90eXBlLnNldFZhbHVlPWZ1bmN0aW9uKHQsZSxuKXtjb25zdCBvPXRoaXMuc2VxO2ZvcihsZXQgaT0wLGE9by5sZW5ndGg7aSE9PWE7KytpKXtjb25zdCBhPW9baV07YS5zZXRWYWx1ZSh0LGVbYS5pZF0sbil9fTtjb25zdCB4Y3Q9LyhcdyspKFxdKT8oXFt8XC4pPy9nO2Z1bmN0aW9uIE9jdCh0LGUpe3Quc2VxLnB1c2goZSksdC5tYXBbZS5pZF09ZX1mdW5jdGlvbiBQY3QodCxlLG4pe2NvbnN0IG89dC5uYW1lLGk9by5sZW5ndGg7Zm9yKHhjdC5sYXN0SW5kZXg9MDs7KXtjb25zdCBhPXhjdC5leGVjKG8pLHI9eGN0Lmxhc3RJbmRleDtsZXQgcz1hWzFdO2NvbnN0IGw9YVszXTtpZigiXSI9PT1hWzJdJiYoc3w9MCksdm9pZCAwPT09bHx8IlsiPT09bCYmcisyPT09aSl7T2N0KG4sdm9pZCAwPT09bD9uZXcgQ2N0KHMsdCxlKTpuZXcgTWN0KHMsdCxlKSk7YnJlYWt9e2xldCB0PW4ubWFwW3NdO3ZvaWQgMD09PXQmJih0PW5ldyB2Y3QocyksT2N0KG4sdCkpLG49dH19fWZ1bmN0aW9uIHdjdCh0LGUpe3RoaXMuc2VxPVtdLHRoaXMubWFwPXt9O2NvbnN0IG49dC5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsMzU3MTgpO2ZvcihsZXQgbz0wO288bjsrK28pe2NvbnN0IG49dC5nZXRBY3RpdmVVbmlmb3JtKGUsbyk7UGN0KG4sdC5nZXRVbmlmb3JtTG9jYXRpb24oZSxuLm5hbWUpLHRoaXMpfX1mdW5jdGlvbiBrY3QodCxlLG4pe2NvbnN0IG89dC5jcmVhdGVTaGFkZXIoZSk7cmV0dXJuIHQuc2hhZGVyU291cmNlKG8sbiksdC5jb21waWxlU2hhZGVyKG8pLG99d2N0LnByb3RvdHlwZS5zZXRWYWx1ZT1mdW5jdGlvbih0LGUsbixvKXtjb25zdCBpPXRoaXMubWFwW2VdO3ZvaWQgMCE9PWkmJmkuc2V0VmFsdWUodCxuLG8pfSx3Y3QucHJvdG90eXBlLnNldE9wdGlvbmFsPWZ1bmN0aW9uKHQsZSxuKXtjb25zdCBvPWVbbl07dm9pZCAwIT09byYmdGhpcy5zZXRWYWx1ZSh0LG4sbyl9LHdjdC51cGxvYWQ9ZnVuY3Rpb24odCxlLG4sbyl7Zm9yKGxldCBpPTAsYT1lLmxlbmd0aDtpIT09YTsrK2kpe2NvbnN0IGE9ZVtpXSxyPW5bYS5pZF07ITEhPT1yLm5lZWRzVXBkYXRlJiZhLnNldFZhbHVlKHQsci52YWx1ZSxvKX19LHdjdC5zZXFXaXRoVmFsdWU9ZnVuY3Rpb24odCxlKXtjb25zdCBuPVtdO2ZvcihsZXQgbz0wLGk9dC5sZW5ndGg7byE9PWk7KytvKXtjb25zdCBpPXRbb107aS5pZCBpbiBlJiZuLnB1c2goaSl9cmV0dXJuIG59O2xldCBTY3Q9MDtmdW5jdGlvbiBEY3QodCl7c3dpdGNoKHQpe2Nhc2Ugeml0OnJldHVyblsiTGluZWFyIiwiKCB2YWx1ZSApIl07Y2FzZSBJaXQ6cmV0dXJuWyJzUkdCIiwiKCB2YWx1ZSApIl07Y2FzZSBGaXQ6cmV0dXJuWyJSR0JFIiwiKCB2YWx1ZSApIl07Y2FzZSAzMDA0OnJldHVyblsiUkdCTSIsIiggdmFsdWUsIDcuMCApIl07Y2FzZSAzMDA1OnJldHVyblsiUkdCTSIsIiggdmFsdWUsIDE2LjAgKSJdO2Nhc2UgMzAwNjpyZXR1cm5bIlJHQkQiLCIoIHZhbHVlLCAyNTYuMCApIl07Y2FzZSBIaXQ6cmV0dXJuWyJHYW1tYSIsIiggdmFsdWUsIGZsb2F0KCBHQU1NQV9GQUNUT1IgKSApIl07Y2FzZSAzMDAzOnJldHVyblsiTG9nTHV2IiwiKCB2YWx1ZSApIl07ZGVmYXVsdDpyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW06IFVuc3VwcG9ydGVkIGVuY29kaW5nOiIsdCksWyJMaW5lYXIiLCIoIHZhbHVlICkiXX19ZnVuY3Rpb24gRWN0KHQsZSxuKXtjb25zdCBvPXQuZ2V0U2hhZGVyUGFyYW1ldGVyKGUsMzU3MTMpLGk9dC5nZXRTaGFkZXJJbmZvTG9nKGUpLnRyaW0oKTtyZXR1cm4gbyYmIiI9PT1pPyIiOiJUSFJFRS5XZWJHTFNoYWRlcjogZ2wuZ2V0U2hhZGVySW5mb0xvZygpICIrbisiXG4iK2krKGZ1bmN0aW9uIGEodCl7Y29uc3QgZT10LnNwbGl0KCJcbiIpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF09dCsxKyI6ICIrZVt0XTtyZXR1cm4gZS5qb2luKCJcbiIpfSkodC5nZXRTaGFkZXJTb3VyY2UoZSkpfWZ1bmN0aW9uIFJjdCh0LGUpe2NvbnN0IG49RGN0KGUpO3JldHVybiJ2ZWM0ICIrdCsiKCB2ZWM0IHZhbHVlICkgeyByZXR1cm4gIituWzBdKyJUb0xpbmVhciIrblsxXSsiOyB9In1mdW5jdGlvbiBBY3QodCxlKXtjb25zdCBuPURjdChlKTtyZXR1cm4idmVjNCAiK3QrIiggdmVjNCB2YWx1ZSApIHsgcmV0dXJuIExpbmVhclRvIituWzBdK25bMV0rIjsgfSJ9ZnVuY3Rpb24gVGN0KHQsZSl7bGV0IG47c3dpdGNoKGUpe2Nhc2UgMTpuPSJMaW5lYXIiO2JyZWFrO2Nhc2UgMjpuPSJSZWluaGFyZCI7YnJlYWs7Y2FzZSAzOm49Ik9wdGltaXplZENpbmVvbiI7YnJlYWs7Y2FzZSA0Om49IkFDRVNGaWxtaWMiO2JyZWFrO2Nhc2UgNTpuPSJDdXN0b20iO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW06IFVuc3VwcG9ydGVkIHRvbmVNYXBwaW5nOiIsZSksbj0iTGluZWFyIn1yZXR1cm4idmVjMyAiK3QrIiggdmVjMyBjb2xvciApIHsgcmV0dXJuICIrbisiVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0ifWZ1bmN0aW9uIE5jdCh0KXtyZXR1cm4iIiE9PXR9ZnVuY3Rpb24gemN0KHQsZSl7cmV0dXJuIHQucmVwbGFjZSgvTlVNX0RJUl9MSUdIVFMvZyxlLm51bURpckxpZ2h0cykucmVwbGFjZSgvTlVNX1NQT1RfTElHSFRTL2csZS5udW1TcG90TGlnaHRzKS5yZXBsYWNlKC9OVU1fUkVDVF9BUkVBX0xJR0hUUy9nLGUubnVtUmVjdEFyZWFMaWdodHMpLnJlcGxhY2UoL05VTV9QT0lOVF9MSUdIVFMvZyxlLm51bVBvaW50TGlnaHRzKS5yZXBsYWNlKC9OVU1fSEVNSV9MSUdIVFMvZyxlLm51bUhlbWlMaWdodHMpLnJlcGxhY2UoL05VTV9ESVJfTElHSFRfU0hBRE9XUy9nLGUubnVtRGlyTGlnaHRTaGFkb3dzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9TSEFET1dTL2csZS5udW1TcG90TGlnaHRTaGFkb3dzKS5yZXBsYWNlKC9OVU1fUE9JTlRfTElHSFRfU0hBRE9XUy9nLGUubnVtUG9pbnRMaWdodFNoYWRvd3MpfWZ1bmN0aW9uIEljdCh0LGUpe3JldHVybiB0LnJlcGxhY2UoL05VTV9DTElQUElOR19QTEFORVMvZyxlLm51bUNsaXBwaW5nUGxhbmVzKS5yZXBsYWNlKC9VTklPTl9DTElQUElOR19QTEFORVMvZyxlLm51bUNsaXBwaW5nUGxhbmVzLWUubnVtQ2xpcEludGVyc2VjdGlvbil9Y29uc3QgSGN0PS9eWyBcdF0qI2luY2x1ZGUgKzwoW1x3XGQuL10rKT4vZ207ZnVuY3Rpb24gRmN0KHQpe3JldHVybiB0LnJlcGxhY2UoSGN0LExjdCl9ZnVuY3Rpb24gTGN0KHQsZSl7Y29uc3Qgbj1Oc3RbZV07aWYodm9pZCAwPT09bil0aHJvdyBuZXcgRXJyb3IoIkNhbiBub3QgcmVzb2x2ZSAjaW5jbHVkZSA8IitlKyI+Iik7cmV0dXJuIEZjdChuKX1jb25zdCBCY3Q9LyNwcmFnbWEgdW5yb2xsX2xvb3BbXHNdKz9mb3IgXCggaW50IGkgXD0gKFxkKylcOyBpIDwgKFxkKylcOyBpIFwrXCsgXCkgXHsoW1xzXFNdKz8pKD89XH0pXH0vZyxWY3Q9LyNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRccytmb3JccypcKFxzKmludFxzK2lccyo9XHMqKFxkKylccyo7XHMqaVxzKjxccyooXGQrKVxzKjtccyppXHMqXCtcK1xzKlwpXHMqeyhbXHNcU10rPyl9XHMrI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQvZztmdW5jdGlvbiBqY3QodCl7cmV0dXJuIHQucmVwbGFjZShWY3QsR2N0KS5yZXBsYWNlKEJjdCxVY3QpfWZ1bmN0aW9uIFVjdCh0LGUsbixvKXtyZXR1cm4gY29uc29sZS53YXJuKCJXZWJHTFByb2dyYW06ICNwcmFnbWEgdW5yb2xsX2xvb3Agc2hhZGVyIHN5bnRheCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlICNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQgc3ludGF4IGluc3RlYWQuIiksR2N0KDAsZSxuLG8pfWZ1bmN0aW9uIEdjdCh0LGUsbixvKXtsZXQgaT0iIjtmb3IobGV0IHQ9cGFyc2VJbnQoZSk7dDxwYXJzZUludChuKTt0KyspaSs9by5yZXBsYWNlKC9cW1xzKmlccypcXS9nLCJbICIrdCsiIF0iKS5yZXBsYWNlKC9VTlJPTExFRF9MT09QX0lOREVYL2csdCk7cmV0dXJuIGl9ZnVuY3Rpb24gV2N0KHQpe2xldCBlPSJwcmVjaXNpb24gIit0LnByZWNpc2lvbisiIGZsb2F0O1xucHJlY2lzaW9uICIrdC5wcmVjaXNpb24rIiBpbnQ7IjtyZXR1cm4iaGlnaHAiPT09dC5wcmVjaXNpb24/ZSs9IlxuI2RlZmluZSBISUdIX1BSRUNJU0lPTiI6Im1lZGl1bXAiPT09dC5wcmVjaXNpb24/ZSs9IlxuI2RlZmluZSBNRURJVU1fUFJFQ0lTSU9OIjoibG93cCI9PT10LnByZWNpc2lvbiYmKGUrPSJcbiNkZWZpbmUgTE9XX1BSRUNJU0lPTiIpLGV9ZnVuY3Rpb24gWWN0KHQsZSxuLG8pe2NvbnN0IGk9dC5nZXRDb250ZXh0KCksYT1uLmRlZmluZXM7bGV0IHI9bi52ZXJ0ZXhTaGFkZXIscz1uLmZyYWdtZW50U2hhZGVyO2NvbnN0IGw9KGZ1bmN0aW9uIGModCl7bGV0IGU9IlNIQURPV01BUF9UWVBFX0JBU0lDIjtyZXR1cm4gMT09PXQuc2hhZG93TWFwVHlwZT9lPSJTSEFET1dNQVBfVFlQRV9QQ0YiOjI9PT10LnNoYWRvd01hcFR5cGU/ZT0iU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQiOjM9PT10LnNoYWRvd01hcFR5cGUmJihlPSJTSEFET1dNQVBfVFlQRV9WU00iKSxlfSkobiksZD0oZnVuY3Rpb24gcCh0KXtsZXQgZT0iRU5WTUFQX1RZUEVfQ1VCRSI7aWYodC5lbnZNYXApc3dpdGNoKHQuZW52TWFwTW9kZSl7Y2FzZSBkaXQ6Y2FzZSBwaXQ6ZT0iRU5WTUFQX1RZUEVfQ1VCRSI7YnJlYWs7Y2FzZSBtaXQ6Y2FzZSAzMDc6ZT0iRU5WTUFQX1RZUEVfQ1VCRV9VViJ9cmV0dXJuIGV9KShuKSxtPShmdW5jdGlvbiB1KHQpe2xldCBlPSJFTlZNQVBfTU9ERV9SRUZMRUNUSU9OIjtpZih0LmVudk1hcClzd2l0Y2godC5lbnZNYXBNb2RlKXtjYXNlIHBpdDpjYXNlIDMwNzplPSJFTlZNQVBfTU9ERV9SRUZSQUNUSU9OIn1yZXR1cm4gZX0pKG4pLGY9KGZ1bmN0aW9uIGcodCl7bGV0IGU9IkVOVk1BUF9CTEVORElOR19OT05FIjtpZih0LmVudk1hcClzd2l0Y2godC5jb21iaW5lKXtjYXNlIDA6ZT0iRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZIjticmVhaztjYXNlIDE6ZT0iRU5WTUFQX0JMRU5ESU5HX01JWCI7YnJlYWs7Y2FzZSAyOmU9IkVOVk1BUF9CTEVORElOR19BREQifXJldHVybiBlfSkobiksaD10LmdhbW1hRmFjdG9yPjA/dC5nYW1tYUZhY3RvcjoxLGI9bi5pc1dlYkdMMj8iIjooZnVuY3Rpb24geSh0KXtyZXR1cm5bdC5leHRlbnNpb25EZXJpdmF0aXZlc3x8dC5lbnZNYXBDdWJlVVZ8fHQuYnVtcE1hcHx8dC50YW5nZW50U3BhY2VOb3JtYWxNYXB8fHQuY2xlYXJjb2F0Tm9ybWFsTWFwfHx0LmZsYXRTaGFkaW5nfHwicGh5c2ljYWwiPT09dC5zaGFkZXJJRD8iI2V4dGVuc2lvbiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgOiBlbmFibGUiOiIiLCh0LmV4dGVuc2lvbkZyYWdEZXB0aHx8dC5sb2dhcml0aG1pY0RlcHRoQnVmZmVyKSYmdC5yZW5kZXJlckV4dGVuc2lvbkZyYWdEZXB0aD8iI2V4dGVuc2lvbiBHTF9FWFRfZnJhZ19kZXB0aCA6IGVuYWJsZSI6IiIsdC5leHRlbnNpb25EcmF3QnVmZmVycyYmdC5yZW5kZXJlckV4dGVuc2lvbkRyYXdCdWZmZXJzPyIjZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlIjoiIiwodC5leHRlbnNpb25TaGFkZXJUZXh0dXJlTE9EfHx0LmVudk1hcHx8dC50cmFuc21pc3Npb24+MCkmJnQucmVuZGVyZXJFeHRlbnNpb25TaGFkZXJUZXh0dXJlTG9kPyIjZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgOiBlbmFibGUiOiIiXS5maWx0ZXIoTmN0KS5qb2luKCJcbiIpfSkobiksXz0oZnVuY3Rpb24gQyh0KXtjb25zdCBlPVtdO2Zvcihjb25zdCBuIGluIHQpe2NvbnN0IG89dFtuXTshMSE9PW8mJmUucHVzaCgiI2RlZmluZSAiK24rIiAiK28pfXJldHVybiBlLmpvaW4oIlxuIil9KShhKSxNPWkuY3JlYXRlUHJvZ3JhbSgpO2xldCB2LHgsTz1uLmdsc2xWZXJzaW9uPyIjdmVyc2lvbiAiK24uZ2xzbFZlcnNpb24rIlxuIjoiIjtuLmlzUmF3U2hhZGVyTWF0ZXJpYWw/KHY9W19dLmZpbHRlcihOY3QpLmpvaW4oIlxuIiksdi5sZW5ndGg+MCYmKHYrPSJcbiIpLHg9W2IsX10uZmlsdGVyKE5jdCkuam9pbigiXG4iKSx4Lmxlbmd0aD4wJiYoeCs9IlxuIikpOih2PVtXY3QobiksIiNkZWZpbmUgU0hBREVSX05BTUUgIituLnNoYWRlck5hbWUsXyxuLmluc3RhbmNpbmc/IiNkZWZpbmUgVVNFX0lOU1RBTkNJTkciOiIiLG4uaW5zdGFuY2luZ0NvbG9yPyIjZGVmaW5lIFVTRV9JTlNUQU5DSU5HX0NPTE9SIjoiIixuLnN1cHBvcnRzVmVydGV4VGV4dHVyZXM/IiNkZWZpbmUgVkVSVEVYX1RFWFRVUkVTIjoiIiwiI2RlZmluZSBHQU1NQV9GQUNUT1IgIitoLCIjZGVmaW5lIE1BWF9CT05FUyAiK24ubWF4Qm9uZXMsbi51c2VGb2cmJm4uZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLG4udXNlRm9nJiZuLmZvZ0V4cDI/IiNkZWZpbmUgRk9HX0VYUDIiOiIiLG4ubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLG4uZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLG4uZW52TWFwPyIjZGVmaW5lICIrbToiIixuLmxpZ2h0TWFwPyIjZGVmaW5lIFVTRV9MSUdIVE1BUCI6IiIsbi5hb01hcD8iI2RlZmluZSBVU0VfQU9NQVAiOiIiLG4uZW1pc3NpdmVNYXA/IiNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQIjoiIixuLmJ1bXBNYXA/IiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLG4ubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLG4ubm9ybWFsTWFwJiZuLm9iamVjdFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCI6IiIsbi5ub3JtYWxNYXAmJm4udGFuZ2VudFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAiOiIiLG4uY2xlYXJjb2F0TWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRNQVAiOiIiLG4uY2xlYXJjb2F0Um91Z2huZXNzTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQIjoiIixuLmNsZWFyY29hdE5vcm1hbE1hcD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCI6IiIsbi5kaXNwbGFjZW1lbnRNYXAmJm4uc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcz8iI2RlZmluZSBVU0VfRElTUExBQ0VNRU5UTUFQIjoiIixuLnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsbi5zcGVjdWxhckludGVuc2l0eU1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJJTlRFTlNJVFlNQVAiOiIiLG4uc3BlY3VsYXJUaW50TWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUlRJTlRNQVAiOiIiLG4ucm91Z2huZXNzTWFwPyIjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAiOiIiLG4ubWV0YWxuZXNzTWFwPyIjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAiOiIiLG4uYWxwaGFNYXA/IiNkZWZpbmUgVVNFX0FMUEhBTUFQIjoiIixuLnRyYW5zbWlzc2lvbj8iI2RlZmluZSBVU0VfVFJBTlNNSVNTSU9OIjoiIixuLnRyYW5zbWlzc2lvbk1hcD8iI2RlZmluZSBVU0VfVFJBTlNNSVNTSU9OTUFQIjoiIixuLnRoaWNrbmVzc01hcD8iI2RlZmluZSBVU0VfVEhJQ0tORVNTTUFQIjoiIixuLnZlcnRleFRhbmdlbnRzPyIjZGVmaW5lIFVTRV9UQU5HRU5UIjoiIixuLnZlcnRleENvbG9ycz8iI2RlZmluZSBVU0VfQ09MT1IiOiIiLG4udmVydGV4QWxwaGFzPyIjZGVmaW5lIFVTRV9DT0xPUl9BTFBIQSI6IiIsbi52ZXJ0ZXhVdnM/IiNkZWZpbmUgVVNFX1VWIjoiIixuLnV2c1ZlcnRleE9ubHk/IiNkZWZpbmUgVVZTX1ZFUlRFWF9PTkxZIjoiIixuLmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIixuLnNraW5uaW5nPyIjZGVmaW5lIFVTRV9TS0lOTklORyI6IiIsbi51c2VWZXJ0ZXhUZXh0dXJlPyIjZGVmaW5lIEJPTkVfVEVYVFVSRSI6IiIsbi5tb3JwaFRhcmdldHM/IiNkZWZpbmUgVVNFX01PUlBIVEFSR0VUUyI6IiIsbi5tb3JwaE5vcm1hbHMmJiExPT09bi5mbGF0U2hhZGluZz8iI2RlZmluZSBVU0VfTU9SUEhOT1JNQUxTIjoiIixuLmRvdWJsZVNpZGVkPyIjZGVmaW5lIERPVUJMRV9TSURFRCI6IiIsbi5mbGlwU2lkZWQ/IiNkZWZpbmUgRkxJUF9TSURFRCI6IiIsbi5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lIFVTRV9TSEFET1dNQVAiOiIiLG4uc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSAiK2w6IiIsbi5zaXplQXR0ZW51YXRpb24/IiNkZWZpbmUgVVNFX1NJWkVBVFRFTlVBVElPTiI6IiIsbi5sb2dhcml0aG1pY0RlcHRoQnVmZmVyPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRiI6IiIsbi5sb2dhcml0aG1pY0RlcHRoQnVmZmVyJiZuLnJlbmRlcmVyRXh0ZW5zaW9uRnJhZ0RlcHRoPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQiOiIiLCJ1bmlmb3JtIG1hdDQgbW9kZWxNYXRyaXg7IiwidW5pZm9ybSBtYXQ0IG1vZGVsVmlld01hdHJpeDsiLCJ1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsiLCJ1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsiLCJ1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4OyIsInVuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsiLCJ1bmlmb3JtIGJvb2wgaXNPcnRob2dyYXBoaWM7IiwiI2lmZGVmIFVTRV9JTlNUQU5DSU5HIiwiXHRhdHRyaWJ1dGUgbWF0NCBpbnN0YW5jZU1hdHJpeDsiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX0lOU1RBTkNJTkdfQ09MT1IiLCJcdGF0dHJpYnV0ZSB2ZWMzIGluc3RhbmNlQ29sb3I7IiwiI2VuZGlmIiwiYXR0cmlidXRlIHZlYzMgcG9zaXRpb247IiwiYXR0cmlidXRlIHZlYzMgbm9ybWFsOyIsImF0dHJpYnV0ZSB2ZWMyIHV2OyIsIiNpZmRlZiBVU0VfVEFOR0VOVCIsIlx0YXR0cmlidXRlIHZlYzQgdGFuZ2VudDsiLCIjZW5kaWYiLCIjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBICkiLCJcdGF0dHJpYnV0ZSB2ZWM0IGNvbG9yOyIsIiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApIiwiXHRhdHRyaWJ1dGUgdmVjMyBjb2xvcjsiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX01PUlBIVEFSR0VUUyIsIlx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQwOyIsIlx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQxOyIsIlx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQyOyIsIlx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQzOyIsIlx0I2lmZGVmIFVTRV9NT1JQSE5PUk1BTFMiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwwOyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDE7IiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMjsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwzOyIsIlx0I2Vsc2UiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ0OyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDU7IiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NjsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ3OyIsIlx0I2VuZGlmIiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9TS0lOTklORyIsIlx0YXR0cmlidXRlIHZlYzQgc2tpbkluZGV4OyIsIlx0YXR0cmlidXRlIHZlYzQgc2tpbldlaWdodDsiLCIjZW5kaWYiLCJcbiJdLmZpbHRlcihOY3QpLmpvaW4oIlxuIikseD1bYixXY3QobiksIiNkZWZpbmUgU0hBREVSX05BTUUgIituLnNoYWRlck5hbWUsXyxuLmFscGhhVGVzdD8iI2RlZmluZSBBTFBIQVRFU1QgIituLmFscGhhVGVzdCsobi5hbHBoYVRlc3QlMT8iIjoiLjAiKToiIiwiI2RlZmluZSBHQU1NQV9GQUNUT1IgIitoLG4udXNlRm9nJiZuLmZvZz8iI2RlZmluZSBVU0VfRk9HIjoiIixuLnVzZUZvZyYmbi5mb2dFeHAyPyIjZGVmaW5lIEZPR19FWFAyIjoiIixuLm1hcD8iI2RlZmluZSBVU0VfTUFQIjoiIixuLm1hdGNhcD8iI2RlZmluZSBVU0VfTUFUQ0FQIjoiIixuLmVudk1hcD8iI2RlZmluZSBVU0VfRU5WTUFQIjoiIixuLmVudk1hcD8iI2RlZmluZSAiK2Q6IiIsbi5lbnZNYXA/IiNkZWZpbmUgIittOiIiLG4uZW52TWFwPyIjZGVmaW5lICIrZjoiIixuLmxpZ2h0TWFwPyIjZGVmaW5lIFVTRV9MSUdIVE1BUCI6IiIsbi5hb01hcD8iI2RlZmluZSBVU0VfQU9NQVAiOiIiLG4uZW1pc3NpdmVNYXA/IiNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQIjoiIixuLmJ1bXBNYXA/IiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLG4ubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLG4ubm9ybWFsTWFwJiZuLm9iamVjdFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCI6IiIsbi5ub3JtYWxNYXAmJm4udGFuZ2VudFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAiOiIiLG4uY2xlYXJjb2F0TWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRNQVAiOiIiLG4uY2xlYXJjb2F0Um91Z2huZXNzTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQIjoiIixuLmNsZWFyY29hdE5vcm1hbE1hcD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCI6IiIsbi5zcGVjdWxhck1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAiOiIiLG4uc3BlY3VsYXJJbnRlbnNpdHlNYXA/IiNkZWZpbmUgVVNFX1NQRUNVTEFSSU5URU5TSVRZTUFQIjoiIixuLnNwZWN1bGFyVGludE1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJUSU5UTUFQIjoiIixuLnJvdWdobmVzc01hcD8iI2RlZmluZSBVU0VfUk9VR0hORVNTTUFQIjoiIixuLm1ldGFsbmVzc01hcD8iI2RlZmluZSBVU0VfTUVUQUxORVNTTUFQIjoiIixuLmFscGhhTWFwPyIjZGVmaW5lIFVTRV9BTFBIQU1BUCI6IiIsbi5zaGVlbj8iI2RlZmluZSBVU0VfU0hFRU4iOiIiLG4udHJhbnNtaXNzaW9uPyIjZGVmaW5lIFVTRV9UUkFOU01JU1NJT04iOiIiLG4udHJhbnNtaXNzaW9uTWFwPyIjZGVmaW5lIFVTRV9UUkFOU01JU1NJT05NQVAiOiIiLG4udGhpY2tuZXNzTWFwPyIjZGVmaW5lIFVTRV9USElDS05FU1NNQVAiOiIiLG4udmVydGV4VGFuZ2VudHM/IiNkZWZpbmUgVVNFX1RBTkdFTlQiOiIiLG4udmVydGV4Q29sb3JzfHxuLmluc3RhbmNpbmdDb2xvcj8iI2RlZmluZSBVU0VfQ09MT1IiOiIiLG4udmVydGV4QWxwaGFzPyIjZGVmaW5lIFVTRV9DT0xPUl9BTFBIQSI6IiIsbi52ZXJ0ZXhVdnM/IiNkZWZpbmUgVVNFX1VWIjoiIixuLnV2c1ZlcnRleE9ubHk/IiNkZWZpbmUgVVZTX1ZFUlRFWF9PTkxZIjoiIixuLmdyYWRpZW50TWFwPyIjZGVmaW5lIFVTRV9HUkFESUVOVE1BUCI6IiIsbi5mbGF0U2hhZGluZz8iI2RlZmluZSBGTEFUX1NIQURFRCI6IiIsbi5kb3VibGVTaWRlZD8iI2RlZmluZSBET1VCTEVfU0lERUQiOiIiLG4uZmxpcFNpZGVkPyIjZGVmaW5lIEZMSVBfU0lERUQiOiIiLG4uc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSBVU0VfU0hBRE9XTUFQIjoiIixuLnNoYWRvd01hcEVuYWJsZWQ/IiNkZWZpbmUgIitsOiIiLG4ucHJlbXVsdGlwbGllZEFscGhhPyIjZGVmaW5lIFBSRU1VTFRJUExJRURfQUxQSEEiOiIiLG4ucGh5c2ljYWxseUNvcnJlY3RMaWdodHM/IiNkZWZpbmUgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUyI6IiIsbi5sb2dhcml0aG1pY0RlcHRoQnVmZmVyPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRiI6IiIsbi5sb2dhcml0aG1pY0RlcHRoQnVmZmVyJiZuLnJlbmRlcmVyRXh0ZW5zaW9uRnJhZ0RlcHRoPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQiOiIiLChuLmV4dGVuc2lvblNoYWRlclRleHR1cmVMT0R8fG4uZW52TWFwKSYmbi5yZW5kZXJlckV4dGVuc2lvblNoYWRlclRleHR1cmVMb2Q/IiNkZWZpbmUgVEVYVFVSRV9MT0RfRVhUIjoiIiwidW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7IiwidW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOyIsInVuaWZvcm0gYm9vbCBpc09ydGhvZ3JhcGhpYzsiLDAhPT1uLnRvbmVNYXBwaW5nPyIjZGVmaW5lIFRPTkVfTUFQUElORyI6IiIsMCE9PW4udG9uZU1hcHBpbmc/TnN0LnRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IiIsMCE9PW4udG9uZU1hcHBpbmc/VGN0KCJ0b25lTWFwcGluZyIsbi50b25lTWFwcGluZyk6IiIsbi5kaXRoZXJpbmc/IiNkZWZpbmUgRElUSEVSSU5HIjoiIixOc3QuZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQsbi5tYXA/UmN0KCJtYXBUZXhlbFRvTGluZWFyIixuLm1hcEVuY29kaW5nKToiIixuLm1hdGNhcD9SY3QoIm1hdGNhcFRleGVsVG9MaW5lYXIiLG4ubWF0Y2FwRW5jb2RpbmcpOiIiLG4uZW52TWFwP1JjdCgiZW52TWFwVGV4ZWxUb0xpbmVhciIsbi5lbnZNYXBFbmNvZGluZyk6IiIsbi5lbWlzc2l2ZU1hcD9SY3QoImVtaXNzaXZlTWFwVGV4ZWxUb0xpbmVhciIsbi5lbWlzc2l2ZU1hcEVuY29kaW5nKToiIixuLnNwZWN1bGFyVGludE1hcD9SY3QoInNwZWN1bGFyVGludE1hcFRleGVsVG9MaW5lYXIiLG4uc3BlY3VsYXJUaW50TWFwRW5jb2RpbmcpOiIiLG4ubGlnaHRNYXA/UmN0KCJsaWdodE1hcFRleGVsVG9MaW5lYXIiLG4ubGlnaHRNYXBFbmNvZGluZyk6IiIsQWN0KCJsaW5lYXJUb091dHB1dFRleGVsIixuLm91dHB1dEVuY29kaW5nKSxuLmRlcHRoUGFja2luZz8iI2RlZmluZSBERVBUSF9QQUNLSU5HICIrbi5kZXB0aFBhY2tpbmc6IiIsIlxuIl0uZmlsdGVyKE5jdCkuam9pbigiXG4iKSkscj1GY3Qocikscj16Y3QocixuKSxyPUljdChyLG4pLHM9RmN0KHMpLHM9emN0KHMsbikscz1JY3QocyxuKSxyPWpjdChyKSxzPWpjdChzKSxuLmlzV2ViR0wyJiYhMCE9PW4uaXNSYXdTaGFkZXJNYXRlcmlhbCYmKE89IiN2ZXJzaW9uIDMwMCBlc1xuIix2PVsiI2RlZmluZSBhdHRyaWJ1dGUgaW4iLCIjZGVmaW5lIHZhcnlpbmcgb3V0IiwiI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZSJdLmpvaW4oIlxuIikrIlxuIit2LHg9WyIjZGVmaW5lIHZhcnlpbmcgaW4iLG4uZ2xzbFZlcnNpb249PT1qaXQ/IiI6Im91dCBoaWdocCB2ZWM0IHBjX2ZyYWdDb2xvcjsiLG4uZ2xzbFZlcnNpb249PT1qaXQ/IiI6IiNkZWZpbmUgZ2xfRnJhZ0NvbG9yIHBjX2ZyYWdDb2xvciIsIiNkZWZpbmUgZ2xfRnJhZ0RlcHRoRVhUIGdsX0ZyYWdEZXB0aCIsIiNkZWZpbmUgdGV4dHVyZTJEIHRleHR1cmUiLCIjZGVmaW5lIHRleHR1cmVDdWJlIHRleHR1cmUiLCIjZGVmaW5lIHRleHR1cmUyRFByb2ogdGV4dHVyZVByb2oiLCIjZGVmaW5lIHRleHR1cmUyRExvZEVYVCB0ZXh0dXJlTG9kIiwiI2RlZmluZSB0ZXh0dXJlMkRQcm9qTG9kRVhUIHRleHR1cmVQcm9qTG9kIiwiI2RlZmluZSB0ZXh0dXJlQ3ViZUxvZEVYVCB0ZXh0dXJlTG9kIiwiI2RlZmluZSB0ZXh0dXJlMkRHcmFkRVhUIHRleHR1cmVHcmFkIiwiI2RlZmluZSB0ZXh0dXJlMkRQcm9qR3JhZEVYVCB0ZXh0dXJlUHJvakdyYWQiLCIjZGVmaW5lIHRleHR1cmVDdWJlR3JhZEVYVCB0ZXh0dXJlR3JhZCJdLmpvaW4oIlxuIikrIlxuIit4KTtjb25zdCBQPU8reCtzLHc9a2N0KGksMzU2MzMsTyt2K3IpLGs9a2N0KGksMzU2MzIsUCk7aWYoaS5hdHRhY2hTaGFkZXIoTSx3KSxpLmF0dGFjaFNoYWRlcihNLGspLHZvaWQgMCE9PW4uaW5kZXgwQXR0cmlidXRlTmFtZT9pLmJpbmRBdHRyaWJMb2NhdGlvbihNLDAsbi5pbmRleDBBdHRyaWJ1dGVOYW1lKTohMD09PW4ubW9ycGhUYXJnZXRzJiZpLmJpbmRBdHRyaWJMb2NhdGlvbihNLDAsInBvc2l0aW9uIiksaS5saW5rUHJvZ3JhbShNKSx0LmRlYnVnLmNoZWNrU2hhZGVyRXJyb3JzKXtjb25zdCB0PWkuZ2V0UHJvZ3JhbUluZm9Mb2coTSkudHJpbSgpLGU9aS5nZXRTaGFkZXJJbmZvTG9nKHcpLnRyaW0oKSxuPWkuZ2V0U2hhZGVySW5mb0xvZyhrKS50cmltKCk7bGV0IG89ITAsYT0hMDtpZighMT09PWkuZ2V0UHJvZ3JhbVBhcmFtZXRlcihNLDM1NzE0KSl7bz0hMTtjb25zdCBlPUVjdChpLHcsInZlcnRleCIpLG49RWN0KGksaywiZnJhZ21lbnQiKTtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFByb2dyYW06IHNoYWRlciBlcnJvcjogIixpLmdldEVycm9yKCksIjM1NzE1IixpLmdldFByb2dyYW1QYXJhbWV0ZXIoTSwzNTcxNSksImdsLmdldFByb2dyYW1JbmZvTG9nIix0LGUsbil9ZWxzZSIiIT09dD9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUHJvZ3JhbTogZ2wuZ2V0UHJvZ3JhbUluZm9Mb2coKSIsdCk6IiIhPT1lJiYiIiE9PW58fChhPSExKTthJiYodGhpcy5kaWFnbm9zdGljcz17cnVubmFibGU6byxwcm9ncmFtTG9nOnQsdmVydGV4U2hhZGVyOntsb2c6ZSxwcmVmaXg6dn0sZnJhZ21lbnRTaGFkZXI6e2xvZzpuLHByZWZpeDp4fX0pfWxldCBTLEQ7cmV0dXJuIGkuZGVsZXRlU2hhZGVyKHcpLGkuZGVsZXRlU2hhZGVyKGspLHRoaXMuZ2V0VW5pZm9ybXM9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09UyYmKFM9bmV3IHdjdChpLE0pKSxTfSx0aGlzLmdldEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09RCYmKEQ9KGZ1bmN0aW9uIHQoZSxuKXtjb25zdCBvPXt9LGk9ZS5nZXRQcm9ncmFtUGFyYW1ldGVyKG4sMzU3MjEpO2ZvcihsZXQgdD0wO3Q8aTt0Kyspe2NvbnN0IGk9ZS5nZXRBY3RpdmVBdHRyaWIobix0KS5uYW1lO29baV09ZS5nZXRBdHRyaWJMb2NhdGlvbihuLGkpfXJldHVybiBvfSkoaSxNKSksRH0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7by5yZWxlYXNlU3RhdGVzT2ZQcm9ncmFtKHRoaXMpLGkuZGVsZXRlUHJvZ3JhbShNKSx0aGlzLnByb2dyYW09dm9pZCAwfSx0aGlzLm5hbWU9bi5zaGFkZXJOYW1lLHRoaXMuaWQ9U2N0KyssdGhpcy5jYWNoZUtleT1lLHRoaXMudXNlZFRpbWVzPTEsdGhpcy5wcm9ncmFtPU0sdGhpcy52ZXJ0ZXhTaGFkZXI9dyx0aGlzLmZyYWdtZW50U2hhZGVyPWssdGhpc31mdW5jdGlvbiBxY3QodCxlLG4sbyxpLGEscil7Y29uc3Qgcz1bXSxsPWkuaXNXZWJHTDIsYz1pLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIsZD1pLmZsb2F0VmVydGV4VGV4dHVyZXMscD1pLm1heFZlcnRleFVuaWZvcm1zLG09aS52ZXJ0ZXhUZXh0dXJlcztsZXQgdT1pLnByZWNpc2lvbjtjb25zdCBmPXtNZXNoRGVwdGhNYXRlcmlhbDoiZGVwdGgiLE1lc2hEaXN0YW5jZU1hdGVyaWFsOiJkaXN0YW5jZVJHQkEiLE1lc2hOb3JtYWxNYXRlcmlhbDoibm9ybWFsIixNZXNoQmFzaWNNYXRlcmlhbDoiYmFzaWMiLE1lc2hMYW1iZXJ0TWF0ZXJpYWw6ImxhbWJlcnQiLE1lc2hQaG9uZ01hdGVyaWFsOiJwaG9uZyIsTWVzaFRvb25NYXRlcmlhbDoidG9vbiIsTWVzaFN0YW5kYXJkTWF0ZXJpYWw6InBoeXNpY2FsIixNZXNoUGh5c2ljYWxNYXRlcmlhbDoicGh5c2ljYWwiLE1lc2hNYXRjYXBNYXRlcmlhbDoibWF0Y2FwIixMaW5lQmFzaWNNYXRlcmlhbDoiYmFzaWMiLExpbmVEYXNoZWRNYXRlcmlhbDoiZGFzaGVkIixQb2ludHNNYXRlcmlhbDoicG9pbnRzIixTaGFkb3dNYXRlcmlhbDoic2hhZG93IixTcHJpdGVNYXRlcmlhbDoic3ByaXRlIn0sZz1bInByZWNpc2lvbiIsImlzV2ViR0wyIiwic3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyIsIm91dHB1dEVuY29kaW5nIiwiaW5zdGFuY2luZyIsImluc3RhbmNpbmdDb2xvciIsIm1hcCIsIm1hcEVuY29kaW5nIiwibWF0Y2FwIiwibWF0Y2FwRW5jb2RpbmciLCJlbnZNYXAiLCJlbnZNYXBNb2RlIiwiZW52TWFwRW5jb2RpbmciLCJlbnZNYXBDdWJlVVYiLCJsaWdodE1hcCIsImxpZ2h0TWFwRW5jb2RpbmciLCJhb01hcCIsImVtaXNzaXZlTWFwIiwiZW1pc3NpdmVNYXBFbmNvZGluZyIsImJ1bXBNYXAiLCJub3JtYWxNYXAiLCJvYmplY3RTcGFjZU5vcm1hbE1hcCIsInRhbmdlbnRTcGFjZU5vcm1hbE1hcCIsImNsZWFyY29hdE1hcCIsImNsZWFyY29hdFJvdWdobmVzc01hcCIsImNsZWFyY29hdE5vcm1hbE1hcCIsImRpc3BsYWNlbWVudE1hcCIsInNwZWN1bGFyTWFwIiwic3BlY3VsYXJJbnRlbnNpdHlNYXAiLCJzcGVjdWxhclRpbnRNYXAiLCJzcGVjdWxhclRpbnRNYXBFbmNvZGluZyIsInJvdWdobmVzc01hcCIsIm1ldGFsbmVzc01hcCIsImdyYWRpZW50TWFwIiwiYWxwaGFNYXAiLCJjb21iaW5lIiwidmVydGV4Q29sb3JzIiwidmVydGV4QWxwaGFzIiwidmVydGV4VGFuZ2VudHMiLCJ2ZXJ0ZXhVdnMiLCJ1dnNWZXJ0ZXhPbmx5IiwiZm9nIiwidXNlRm9nIiwiZm9nRXhwMiIsImZsYXRTaGFkaW5nIiwic2l6ZUF0dGVudWF0aW9uIiwibG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciIsInNraW5uaW5nIiwibWF4Qm9uZXMiLCJ1c2VWZXJ0ZXhUZXh0dXJlIiwibW9ycGhUYXJnZXRzIiwibW9ycGhOb3JtYWxzIiwicHJlbXVsdGlwbGllZEFscGhhIiwibnVtRGlyTGlnaHRzIiwibnVtUG9pbnRMaWdodHMiLCJudW1TcG90TGlnaHRzIiwibnVtSGVtaUxpZ2h0cyIsIm51bVJlY3RBcmVhTGlnaHRzIiwibnVtRGlyTGlnaHRTaGFkb3dzIiwibnVtUG9pbnRMaWdodFNoYWRvd3MiLCJudW1TcG90TGlnaHRTaGFkb3dzIiwic2hhZG93TWFwRW5hYmxlZCIsInNoYWRvd01hcFR5cGUiLCJ0b25lTWFwcGluZyIsInBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzIiwiYWxwaGFUZXN0IiwiZG91YmxlU2lkZWQiLCJmbGlwU2lkZWQiLCJudW1DbGlwcGluZ1BsYW5lcyIsIm51bUNsaXBJbnRlcnNlY3Rpb24iLCJkZXB0aFBhY2tpbmciLCJkaXRoZXJpbmciLCJzaGVlbiIsInRyYW5zbWlzc2lvbiIsInRyYW5zbWlzc2lvbk1hcCIsInRoaWNrbmVzc01hcCJdO2Z1bmN0aW9uIGgodCl7bGV0IGU7cmV0dXJuIHQmJnQuaXNUZXh0dXJlP2U9dC5lbmNvZGluZzp0JiZ0LmlzV2ViR0xSZW5kZXJUYXJnZXQ/KGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtcy5nZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwOiBkb24ndCB1c2UgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLiIpLGU9dC50ZXh0dXJlLmVuY29kaW5nKTplPXppdCxlfXJldHVybntnZXRQYXJhbWV0ZXJzOmZ1bmN0aW9uIGIoYSxzLGcseSxfKXtjb25zdCBDPXkuZm9nLE09KGEuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD9uOmUpLmdldChhLmVudk1hcHx8KGEuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD95LmVudmlyb25tZW50Om51bGwpKSx2PWZbYS50eXBlXSx4PV8uaXNTa2lubmVkTWVzaD8oZnVuY3Rpb24gTyh0KXtjb25zdCBlPXQuc2tlbGV0b24uYm9uZXM7aWYoZClyZXR1cm4gMTAyNDt7Y29uc3QgdD1NYXRoLmZsb29yKChwLTIwKS80KSxuPU1hdGgubWluKHQsZS5sZW5ndGgpO3JldHVybiBuPGUubGVuZ3RoPyhjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFNrZWxldG9uIGhhcyAiK2UubGVuZ3RoKyIgYm9uZXMuIFRoaXMgR1BVIHN1cHBvcnRzICIrbisiLiIpLDApOm59fSkoXyk6MDtsZXQgUCx3O2lmKG51bGwhPT1hLnByZWNpc2lvbiYmKHU9aS5nZXRNYXhQcmVjaXNpb24oYS5wcmVjaXNpb24pLHUhPT1hLnByZWNpc2lvbiYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW0uZ2V0UGFyYW1ldGVyczoiLGEucHJlY2lzaW9uLCJub3Qgc3VwcG9ydGVkLCB1c2luZyIsdSwiaW5zdGVhZC4iKSksdil7Y29uc3QgdD1Jc3Rbdl07UD10LnZlcnRleFNoYWRlcix3PXQuZnJhZ21lbnRTaGFkZXJ9ZWxzZSBQPWEudmVydGV4U2hhZGVyLHc9YS5mcmFnbWVudFNoYWRlcjtjb25zdCBrPXQuZ2V0UmVuZGVyVGFyZ2V0KCk7cmV0dXJue2lzV2ViR0wyOmwsc2hhZGVySUQ6dixzaGFkZXJOYW1lOmEudHlwZSx2ZXJ0ZXhTaGFkZXI6UCxmcmFnbWVudFNoYWRlcjp3LGRlZmluZXM6YS5kZWZpbmVzLGlzUmF3U2hhZGVyTWF0ZXJpYWw6ITA9PT1hLmlzUmF3U2hhZGVyTWF0ZXJpYWwsZ2xzbFZlcnNpb246YS5nbHNsVmVyc2lvbixwcmVjaXNpb246dSxpbnN0YW5jaW5nOiEwPT09Xy5pc0luc3RhbmNlZE1lc2gsaW5zdGFuY2luZ0NvbG9yOiEwPT09Xy5pc0luc3RhbmNlZE1lc2gmJm51bGwhPT1fLmluc3RhbmNlQ29sb3Isc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczptLG91dHB1dEVuY29kaW5nOm51bGwhPT1rP2goay50ZXh0dXJlKTp0Lm91dHB1dEVuY29kaW5nLG1hcDohIWEubWFwLG1hcEVuY29kaW5nOmgoYS5tYXApLG1hdGNhcDohIWEubWF0Y2FwLG1hdGNhcEVuY29kaW5nOmgoYS5tYXRjYXApLGVudk1hcDohIU0sZW52TWFwTW9kZTpNJiZNLm1hcHBpbmcsZW52TWFwRW5jb2Rpbmc6aChNKSxlbnZNYXBDdWJlVVY6ISFNJiYoTS5tYXBwaW5nPT09bWl0fHwzMDc9PT1NLm1hcHBpbmcpLGxpZ2h0TWFwOiEhYS5saWdodE1hcCxsaWdodE1hcEVuY29kaW5nOmgoYS5saWdodE1hcCksYW9NYXA6ISFhLmFvTWFwLGVtaXNzaXZlTWFwOiEhYS5lbWlzc2l2ZU1hcCxlbWlzc2l2ZU1hcEVuY29kaW5nOmgoYS5lbWlzc2l2ZU1hcCksYnVtcE1hcDohIWEuYnVtcE1hcCxub3JtYWxNYXA6ISFhLm5vcm1hbE1hcCxvYmplY3RTcGFjZU5vcm1hbE1hcDoxPT09YS5ub3JtYWxNYXBUeXBlLHRhbmdlbnRTcGFjZU5vcm1hbE1hcDowPT09YS5ub3JtYWxNYXBUeXBlLGNsZWFyY29hdE1hcDohIWEuY2xlYXJjb2F0TWFwLGNsZWFyY29hdFJvdWdobmVzc01hcDohIWEuY2xlYXJjb2F0Um91Z2huZXNzTWFwLGNsZWFyY29hdE5vcm1hbE1hcDohIWEuY2xlYXJjb2F0Tm9ybWFsTWFwLGRpc3BsYWNlbWVudE1hcDohIWEuZGlzcGxhY2VtZW50TWFwLHJvdWdobmVzc01hcDohIWEucm91Z2huZXNzTWFwLG1ldGFsbmVzc01hcDohIWEubWV0YWxuZXNzTWFwLHNwZWN1bGFyTWFwOiEhYS5zcGVjdWxhck1hcCxzcGVjdWxhckludGVuc2l0eU1hcDohIWEuc3BlY3VsYXJJbnRlbnNpdHlNYXAsc3BlY3VsYXJUaW50TWFwOiEhYS5zcGVjdWxhclRpbnRNYXAsc3BlY3VsYXJUaW50TWFwRW5jb2Rpbmc6aChhLnNwZWN1bGFyVGludE1hcCksYWxwaGFNYXA6ISFhLmFscGhhTWFwLGdyYWRpZW50TWFwOiEhYS5ncmFkaWVudE1hcCxzaGVlbjohIWEuc2hlZW4sdHJhbnNtaXNzaW9uOiEhYS50cmFuc21pc3Npb24sdHJhbnNtaXNzaW9uTWFwOiEhYS50cmFuc21pc3Npb25NYXAsdGhpY2tuZXNzTWFwOiEhYS50aGlja25lc3NNYXAsY29tYmluZTphLmNvbWJpbmUsdmVydGV4VGFuZ2VudHM6ISFhLm5vcm1hbE1hcCYmISFfLmdlb21ldHJ5JiYhIV8uZ2VvbWV0cnkuYXR0cmlidXRlcy50YW5nZW50LHZlcnRleENvbG9yczphLnZlcnRleENvbG9ycyx2ZXJ0ZXhBbHBoYXM6ITA9PT1hLnZlcnRleENvbG9ycyYmISFfLmdlb21ldHJ5JiYhIV8uZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvciYmND09PV8uZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvci5pdGVtU2l6ZSx2ZXJ0ZXhVdnM6ISEoYS5tYXB8fGEuYnVtcE1hcHx8YS5ub3JtYWxNYXB8fGEuc3BlY3VsYXJNYXB8fGEuYWxwaGFNYXB8fGEuZW1pc3NpdmVNYXB8fGEucm91Z2huZXNzTWFwfHxhLm1ldGFsbmVzc01hcHx8YS5jbGVhcmNvYXRNYXB8fGEuY2xlYXJjb2F0Um91Z2huZXNzTWFwfHxhLmNsZWFyY29hdE5vcm1hbE1hcHx8YS5kaXNwbGFjZW1lbnRNYXB8fGEudHJhbnNtaXNzaW9uTWFwfHxhLnRoaWNrbmVzc01hcHx8YS5zcGVjdWxhckludGVuc2l0eU1hcHx8YS5zcGVjdWxhclRpbnRNYXApLHV2c1ZlcnRleE9ubHk6IShhLm1hcHx8YS5idW1wTWFwfHxhLm5vcm1hbE1hcHx8YS5zcGVjdWxhck1hcHx8YS5hbHBoYU1hcHx8YS5lbWlzc2l2ZU1hcHx8YS5yb3VnaG5lc3NNYXB8fGEubWV0YWxuZXNzTWFwfHxhLmNsZWFyY29hdE5vcm1hbE1hcHx8YS50cmFuc21pc3Npb258fGEudHJhbnNtaXNzaW9uTWFwfHxhLnRoaWNrbmVzc01hcHx8YS5zcGVjdWxhckludGVuc2l0eU1hcHx8YS5zcGVjdWxhclRpbnRNYXB8fCFhLmRpc3BsYWNlbWVudE1hcCksZm9nOiEhQyx1c2VGb2c6YS5mb2csZm9nRXhwMjpDJiZDLmlzRm9nRXhwMixmbGF0U2hhZGluZzohIWEuZmxhdFNoYWRpbmcsc2l6ZUF0dGVudWF0aW9uOmEuc2l6ZUF0dGVudWF0aW9uLGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6Yyxza2lubmluZzohMD09PV8uaXNTa2lubmVkTWVzaCYmeD4wLG1heEJvbmVzOngsdXNlVmVydGV4VGV4dHVyZTpkLG1vcnBoVGFyZ2V0czohIV8uZ2VvbWV0cnkmJiEhXy5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24sbW9ycGhOb3JtYWxzOiEhXy5nZW9tZXRyeSYmISFfLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5ub3JtYWwsbnVtRGlyTGlnaHRzOnMuZGlyZWN0aW9uYWwubGVuZ3RoLG51bVBvaW50TGlnaHRzOnMucG9pbnQubGVuZ3RoLG51bVNwb3RMaWdodHM6cy5zcG90Lmxlbmd0aCxudW1SZWN0QXJlYUxpZ2h0czpzLnJlY3RBcmVhLmxlbmd0aCxudW1IZW1pTGlnaHRzOnMuaGVtaS5sZW5ndGgsbnVtRGlyTGlnaHRTaGFkb3dzOnMuZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoLG51bVBvaW50TGlnaHRTaGFkb3dzOnMucG9pbnRTaGFkb3dNYXAubGVuZ3RoLG51bVNwb3RMaWdodFNoYWRvd3M6cy5zcG90U2hhZG93TWFwLmxlbmd0aCxudW1DbGlwcGluZ1BsYW5lczpyLm51bVBsYW5lcyxudW1DbGlwSW50ZXJzZWN0aW9uOnIubnVtSW50ZXJzZWN0aW9uLGRpdGhlcmluZzphLmRpdGhlcmluZyxzaGFkb3dNYXBFbmFibGVkOnQuc2hhZG93TWFwLmVuYWJsZWQmJmcubGVuZ3RoPjAsc2hhZG93TWFwVHlwZTp0LnNoYWRvd01hcC50eXBlLHRvbmVNYXBwaW5nOmEudG9uZU1hcHBlZD90LnRvbmVNYXBwaW5nOjAscGh5c2ljYWxseUNvcnJlY3RMaWdodHM6dC5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyxwcmVtdWx0aXBsaWVkQWxwaGE6YS5wcmVtdWx0aXBsaWVkQWxwaGEsYWxwaGFUZXN0OmEuYWxwaGFUZXN0LGRvdWJsZVNpZGVkOjI9PT1hLnNpZGUsZmxpcFNpZGVkOjE9PT1hLnNpZGUsZGVwdGhQYWNraW5nOnZvaWQgMCE9PWEuZGVwdGhQYWNraW5nJiZhLmRlcHRoUGFja2luZyxpbmRleDBBdHRyaWJ1dGVOYW1lOmEuaW5kZXgwQXR0cmlidXRlTmFtZSxleHRlbnNpb25EZXJpdmF0aXZlczphLmV4dGVuc2lvbnMmJmEuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcyxleHRlbnNpb25GcmFnRGVwdGg6YS5leHRlbnNpb25zJiZhLmV4dGVuc2lvbnMuZnJhZ0RlcHRoLGV4dGVuc2lvbkRyYXdCdWZmZXJzOmEuZXh0ZW5zaW9ucyYmYS5leHRlbnNpb25zLmRyYXdCdWZmZXJzLGV4dGVuc2lvblNoYWRlclRleHR1cmVMT0Q6YS5leHRlbnNpb25zJiZhLmV4dGVuc2lvbnMuc2hhZGVyVGV4dHVyZUxPRCxyZW5kZXJlckV4dGVuc2lvbkZyYWdEZXB0aDpsfHxvLmhhcygiRVhUX2ZyYWdfZGVwdGgiKSxyZW5kZXJlckV4dGVuc2lvbkRyYXdCdWZmZXJzOmx8fG8uaGFzKCJXRUJHTF9kcmF3X2J1ZmZlcnMiKSxyZW5kZXJlckV4dGVuc2lvblNoYWRlclRleHR1cmVMb2Q6bHx8by5oYXMoIkVYVF9zaGFkZXJfdGV4dHVyZV9sb2QiKSxjdXN0b21Qcm9ncmFtQ2FjaGVLZXk6YS5jdXN0b21Qcm9ncmFtQ2FjaGVLZXkoKX19LGdldFByb2dyYW1DYWNoZUtleTpmdW5jdGlvbiB5KGUpe2NvbnN0IG49W107aWYoZS5zaGFkZXJJRD9uLnB1c2goZS5zaGFkZXJJRCk6KG4ucHVzaChlLmZyYWdtZW50U2hhZGVyKSxuLnB1c2goZS52ZXJ0ZXhTaGFkZXIpKSx2b2lkIDAhPT1lLmRlZmluZXMpZm9yKGNvbnN0IHQgaW4gZS5kZWZpbmVzKW4ucHVzaCh0KSxuLnB1c2goZS5kZWZpbmVzW3RdKTtpZighMT09PWUuaXNSYXdTaGFkZXJNYXRlcmlhbCl7Zm9yKGxldCB0PTA7dDxnLmxlbmd0aDt0Kyspbi5wdXNoKGVbZ1t0XV0pO24ucHVzaCh0Lm91dHB1dEVuY29kaW5nKSxuLnB1c2godC5nYW1tYUZhY3Rvcil9cmV0dXJuIG4ucHVzaChlLmN1c3RvbVByb2dyYW1DYWNoZUtleSksbi5qb2luKCl9LGdldFVuaWZvcm1zOmZ1bmN0aW9uIF8odCl7Y29uc3QgZT1mW3QudHlwZV07bGV0IG47cmV0dXJuIG49ZT9oc3QuY2xvbmUoSXN0W2VdLnVuaWZvcm1zKTp0LnVuaWZvcm1zLG59LGFjcXVpcmVQcm9ncmFtOmZ1bmN0aW9uIEMoZSxuKXtsZXQgbztmb3IobGV0IHQ9MCxlPXMubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9c1t0XTtpZihlLmNhY2hlS2V5PT09bil7bz1lLCsrby51c2VkVGltZXM7YnJlYWt9fXJldHVybiB2b2lkIDA9PT1vJiYobz1uZXcgWWN0KHQsbixlLGEpLHMucHVzaChvKSksb30scmVsZWFzZVByb2dyYW06ZnVuY3Rpb24gTSh0KXtpZigwPT0tLXQudXNlZFRpbWVzKXtjb25zdCBlPXMuaW5kZXhPZih0KTtzW2VdPXNbcy5sZW5ndGgtMV0scy5wb3AoKSx0LmRlc3Ryb3koKX19LHByb2dyYW1zOnN9fWZ1bmN0aW9uIFpjdCgpe2xldCB0PW5ldyBXZWFrTWFwO3JldHVybntnZXQ6ZnVuY3Rpb24gZShuKXtsZXQgbz10LmdldChuKTtyZXR1cm4gdm9pZCAwPT09byYmKG89e30sdC5zZXQobixvKSksb30scmVtb3ZlOmZ1bmN0aW9uIG4oZSl7dC5kZWxldGUoZSl9LHVwZGF0ZTpmdW5jdGlvbiBvKGUsbixpKXt0LmdldChlKVtuXT1pfSxkaXNwb3NlOmZ1bmN0aW9uIGkoKXt0PW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24gWGN0KHQsZSl7cmV0dXJuIHQuZ3JvdXBPcmRlciE9PWUuZ3JvdXBPcmRlcj90Lmdyb3VwT3JkZXItZS5ncm91cE9yZGVyOnQucmVuZGVyT3JkZXIhPT1lLnJlbmRlck9yZGVyP3QucmVuZGVyT3JkZXItZS5yZW5kZXJPcmRlcjp0LnByb2dyYW0hPT1lLnByb2dyYW0/dC5wcm9ncmFtLmlkLWUucHJvZ3JhbS5pZDp0Lm1hdGVyaWFsLmlkIT09ZS5tYXRlcmlhbC5pZD90Lm1hdGVyaWFsLmlkLWUubWF0ZXJpYWwuaWQ6dC56IT09ZS56P3Quei1lLno6dC5pZC1lLmlkfWZ1bmN0aW9uIEtjdCh0LGUpe3JldHVybiB0Lmdyb3VwT3JkZXIhPT1lLmdyb3VwT3JkZXI/dC5ncm91cE9yZGVyLWUuZ3JvdXBPcmRlcjp0LnJlbmRlck9yZGVyIT09ZS5yZW5kZXJPcmRlcj90LnJlbmRlck9yZGVyLWUucmVuZGVyT3JkZXI6dC56IT09ZS56P2Uuei10Lno6dC5pZC1lLmlkfWZ1bmN0aW9uIEpjdCh0KXtjb25zdCBlPVtdO2xldCBuPTA7Y29uc3Qgbz1bXSxpPVtdLGE9W10scj17aWQ6LTF9O2Z1bmN0aW9uIHMobyxpLGEscyxsLGMpe2xldCBkPWVbbl07Y29uc3QgcD10LmdldChhKTtyZXR1cm4gdm9pZCAwPT09ZD8oZD17aWQ6by5pZCxvYmplY3Q6byxnZW9tZXRyeTppLG1hdGVyaWFsOmEscHJvZ3JhbTpwLnByb2dyYW18fHIsZ3JvdXBPcmRlcjpzLHJlbmRlck9yZGVyOm8ucmVuZGVyT3JkZXIsejpsLGdyb3VwOmN9LGVbbl09ZCk6KGQuaWQ9by5pZCxkLm9iamVjdD1vLGQuZ2VvbWV0cnk9aSxkLm1hdGVyaWFsPWEsZC5wcm9ncmFtPXAucHJvZ3JhbXx8cixkLmdyb3VwT3JkZXI9cyxkLnJlbmRlck9yZGVyPW8ucmVuZGVyT3JkZXIsZC56PWwsZC5ncm91cD1jKSxuKyssZH1yZXR1cm57b3BhcXVlOm8sdHJhbnNtaXNzaXZlOmksdHJhbnNwYXJlbnQ6YSxpbml0OmZ1bmN0aW9uIGwoKXtuPTAsby5sZW5ndGg9MCxpLmxlbmd0aD0wLGEubGVuZ3RoPTB9LHB1c2g6ZnVuY3Rpb24gYyh0LGUsbixyLGwsZCl7Y29uc3QgcD1zKHQsZSxuLHIsbCxkKTtuLnRyYW5zbWlzc2lvbj4wP2kucHVzaChwKTohMD09PW4udHJhbnNwYXJlbnQ/YS5wdXNoKHApOm8ucHVzaChwKX0sdW5zaGlmdDpmdW5jdGlvbiBkKHQsZSxuLHIsbCxjKXtjb25zdCBkPXModCxlLG4scixsLGMpO24udHJhbnNtaXNzaW9uPjA/aS51bnNoaWZ0KGQpOiEwPT09bi50cmFuc3BhcmVudD9hLnVuc2hpZnQoZCk6by51bnNoaWZ0KGQpfSxmaW5pc2g6ZnVuY3Rpb24gcCgpe2ZvcihsZXQgdD1uLG89ZS5sZW5ndGg7dDxvO3QrKyl7Y29uc3Qgbj1lW3RdO2lmKG51bGw9PT1uLmlkKWJyZWFrO24uaWQ9bnVsbCxuLm9iamVjdD1udWxsLG4uZ2VvbWV0cnk9bnVsbCxuLm1hdGVyaWFsPW51bGwsbi5wcm9ncmFtPW51bGwsbi5ncm91cD1udWxsfX0sc29ydDpmdW5jdGlvbiBtKHQsZSl7by5sZW5ndGg+MSYmby5zb3J0KHR8fFhjdCksaS5sZW5ndGg+MSYmaS5zb3J0KGV8fEtjdCksYS5sZW5ndGg+MSYmYS5zb3J0KGV8fEtjdCl9fX1mdW5jdGlvbiBRY3QodCl7bGV0IGU9bmV3IFdlYWtNYXA7cmV0dXJue2dldDpmdW5jdGlvbiBuKG8saSl7bGV0IGE7cmV0dXJuITE9PT1lLmhhcyhvKT8oYT1uZXcgSmN0KHQpLGUuc2V0KG8sW2FdKSk6aT49ZS5nZXQobykubGVuZ3RoPyhhPW5ldyBKY3QodCksZS5nZXQobykucHVzaChhKSk6YT1lLmdldChvKVtpXSxhfSxkaXNwb3NlOmZ1bmN0aW9uIG8oKXtlPW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24gJGN0KCl7Y29uc3QgdD17fTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUpe2lmKHZvaWQgMCE9PXRbZS5pZF0pcmV0dXJuIHRbZS5pZF07bGV0IG47c3dpdGNoKGUudHlwZSl7Y2FzZSJEaXJlY3Rpb25hbExpZ2h0IjpuPXtkaXJlY3Rpb246bmV3IGNhdCxjb2xvcjpuZXcgUnJ0fTticmVhaztjYXNlIlNwb3RMaWdodCI6bj17cG9zaXRpb246bmV3IGNhdCxkaXJlY3Rpb246bmV3IGNhdCxjb2xvcjpuZXcgUnJ0LGRpc3RhbmNlOjAsY29uZUNvczowLHBlbnVtYnJhQ29zOjAsZGVjYXk6MH07YnJlYWs7Y2FzZSJQb2ludExpZ2h0IjpuPXtwb3NpdGlvbjpuZXcgY2F0LGNvbG9yOm5ldyBScnQsZGlzdGFuY2U6MCxkZWNheTowfTticmVhaztjYXNlIkhlbWlzcGhlcmVMaWdodCI6bj17ZGlyZWN0aW9uOm5ldyBjYXQsc2t5Q29sb3I6bmV3IFJydCxncm91bmRDb2xvcjpuZXcgUnJ0fTticmVhaztjYXNlIlJlY3RBcmVhTGlnaHQiOm49e2NvbG9yOm5ldyBScnQscG9zaXRpb246bmV3IGNhdCxoYWxmV2lkdGg6bmV3IGNhdCxoYWxmSGVpZ2h0Om5ldyBjYXR9fXJldHVybiB0W2UuaWRdPW4sbn19fWxldCB0ZHQ9MDtmdW5jdGlvbiBlZHQodCxlKXtyZXR1cm4oZS5jYXN0U2hhZG93PzE6MCktKHQuY2FzdFNoYWRvdz8xOjApfWZ1bmN0aW9uIG5kdCh0LGUpe2NvbnN0IG49bmV3ICRjdCxvPShmdW5jdGlvbiBpKCl7Y29uc3QgdD17fTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUpe2lmKHZvaWQgMCE9PXRbZS5pZF0pcmV0dXJuIHRbZS5pZF07bGV0IG47c3dpdGNoKGUudHlwZSl7Y2FzZSJEaXJlY3Rpb25hbExpZ2h0IjpjYXNlIlNwb3RMaWdodCI6bj17c2hhZG93QmlhczowLHNoYWRvd05vcm1hbEJpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBRaXR9O2JyZWFrO2Nhc2UiUG9pbnRMaWdodCI6bj17c2hhZG93QmlhczowLHNoYWRvd05vcm1hbEJpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBRaXQsc2hhZG93Q2FtZXJhTmVhcjoxLHNoYWRvd0NhbWVyYUZhcjoxZTN9fXJldHVybiB0W2UuaWRdPW4sbn19fSkoKSxhPXt2ZXJzaW9uOjAsaGFzaDp7ZGlyZWN0aW9uYWxMZW5ndGg6LTEscG9pbnRMZW5ndGg6LTEsc3BvdExlbmd0aDotMSxyZWN0QXJlYUxlbmd0aDotMSxoZW1pTGVuZ3RoOi0xLG51bURpcmVjdGlvbmFsU2hhZG93czotMSxudW1Qb2ludFNoYWRvd3M6LTEsbnVtU3BvdFNoYWRvd3M6LTF9LGFtYmllbnQ6WzAsMCwwXSxwcm9iZTpbXSxkaXJlY3Rpb25hbDpbXSxkaXJlY3Rpb25hbFNoYWRvdzpbXSxkaXJlY3Rpb25hbFNoYWRvd01hcDpbXSxkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDpbXSxzcG90OltdLHNwb3RTaGFkb3c6W10sc3BvdFNoYWRvd01hcDpbXSxzcG90U2hhZG93TWF0cml4OltdLHJlY3RBcmVhOltdLHJlY3RBcmVhTFRDMTpudWxsLHJlY3RBcmVhTFRDMjpudWxsLHBvaW50OltdLHBvaW50U2hhZG93OltdLHBvaW50U2hhZG93TWFwOltdLHBvaW50U2hhZG93TWF0cml4OltdLGhlbWk6W119O2ZvcihsZXQgdD0wO3Q8OTt0KyspYS5wcm9iZS5wdXNoKG5ldyBjYXQpO2NvbnN0IHI9bmV3IGNhdCxzPW5ldyBCYXQsbD1uZXcgQmF0O3JldHVybntzZXR1cDpmdW5jdGlvbiBjKGkpe2xldCByPTAscz0wLGw9MDtmb3IobGV0IHQ9MDt0PDk7dCsrKWEucHJvYmVbdF0uc2V0KDAsMCwwKTtsZXQgYz0wLGQ9MCxwPTAsbT0wLHU9MCxmPTAsZz0wLGg9MDtpLnNvcnQoZWR0KTtmb3IobGV0IHQ9MCxlPWkubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9aVt0XSxiPWUuY29sb3IseT1lLmludGVuc2l0eSxfPWUuZGlzdGFuY2UsQz1lLnNoYWRvdyYmZS5zaGFkb3cubWFwP2Uuc2hhZG93Lm1hcC50ZXh0dXJlOm51bGw7aWYoZS5pc0FtYmllbnRMaWdodClyKz1iLnIqeSxzKz1iLmcqeSxsKz1iLmIqeTtlbHNlIGlmKGUuaXNMaWdodFByb2JlKWZvcihsZXQgdD0wO3Q8OTt0KyspYS5wcm9iZVt0XS5hZGRTY2FsZWRWZWN0b3IoZS5zaC5jb2VmZmljaWVudHNbdF0seSk7ZWxzZSBpZihlLmlzRGlyZWN0aW9uYWxMaWdodCl7Y29uc3QgdD1uLmdldChlKTtpZih0LmNvbG9yLmNvcHkoZS5jb2xvcikubXVsdGlwbHlTY2FsYXIoZS5pbnRlbnNpdHkpLGUuY2FzdFNoYWRvdyl7Y29uc3QgdD1lLnNoYWRvdyxuPW8uZ2V0KGUpO24uc2hhZG93Qmlhcz10LmJpYXMsbi5zaGFkb3dOb3JtYWxCaWFzPXQubm9ybWFsQmlhcyxuLnNoYWRvd1JhZGl1cz10LnJhZGl1cyxuLnNoYWRvd01hcFNpemU9dC5tYXBTaXplLGEuZGlyZWN0aW9uYWxTaGFkb3dbY109bixhLmRpcmVjdGlvbmFsU2hhZG93TWFwW2NdPUMsYS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeFtjXT1lLnNoYWRvdy5tYXRyaXgsZisrfWEuZGlyZWN0aW9uYWxbY109dCxjKyt9ZWxzZSBpZihlLmlzU3BvdExpZ2h0KXtjb25zdCB0PW4uZ2V0KGUpO2lmKHQucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGUubWF0cml4V29ybGQpLHQuY29sb3IuY29weShiKS5tdWx0aXBseVNjYWxhcih5KSx0LmRpc3RhbmNlPV8sdC5jb25lQ29zPU1hdGguY29zKGUuYW5nbGUpLHQucGVudW1icmFDb3M9TWF0aC5jb3MoZS5hbmdsZSooMS1lLnBlbnVtYnJhKSksdC5kZWNheT1lLmRlY2F5LGUuY2FzdFNoYWRvdyl7Y29uc3QgdD1lLnNoYWRvdyxuPW8uZ2V0KGUpO24uc2hhZG93Qmlhcz10LmJpYXMsbi5zaGFkb3dOb3JtYWxCaWFzPXQubm9ybWFsQmlhcyxuLnNoYWRvd1JhZGl1cz10LnJhZGl1cyxuLnNoYWRvd01hcFNpemU9dC5tYXBTaXplLGEuc3BvdFNoYWRvd1twXT1uLGEuc3BvdFNoYWRvd01hcFtwXT1DLGEuc3BvdFNoYWRvd01hdHJpeFtwXT1lLnNoYWRvdy5tYXRyaXgsaCsrfWEuc3BvdFtwXT10LHArK31lbHNlIGlmKGUuaXNSZWN0QXJlYUxpZ2h0KXtjb25zdCB0PW4uZ2V0KGUpO3QuY29sb3IuY29weShiKS5tdWx0aXBseVNjYWxhcih5KSx0LmhhbGZXaWR0aC5zZXQoLjUqZS53aWR0aCwwLDApLHQuaGFsZkhlaWdodC5zZXQoMCwuNSplLmhlaWdodCwwKSxhLnJlY3RBcmVhW21dPXQsbSsrfWVsc2UgaWYoZS5pc1BvaW50TGlnaHQpe2NvbnN0IHQ9bi5nZXQoZSk7aWYodC5jb2xvci5jb3B5KGUuY29sb3IpLm11bHRpcGx5U2NhbGFyKGUuaW50ZW5zaXR5KSx0LmRpc3RhbmNlPWUuZGlzdGFuY2UsdC5kZWNheT1lLmRlY2F5LGUuY2FzdFNoYWRvdyl7Y29uc3QgdD1lLnNoYWRvdyxuPW8uZ2V0KGUpO24uc2hhZG93Qmlhcz10LmJpYXMsbi5zaGFkb3dOb3JtYWxCaWFzPXQubm9ybWFsQmlhcyxuLnNoYWRvd1JhZGl1cz10LnJhZGl1cyxuLnNoYWRvd01hcFNpemU9dC5tYXBTaXplLG4uc2hhZG93Q2FtZXJhTmVhcj10LmNhbWVyYS5uZWFyLG4uc2hhZG93Q2FtZXJhRmFyPXQuY2FtZXJhLmZhcixhLnBvaW50U2hhZG93W2RdPW4sYS5wb2ludFNoYWRvd01hcFtkXT1DLGEucG9pbnRTaGFkb3dNYXRyaXhbZF09ZS5zaGFkb3cubWF0cml4LGcrK31hLnBvaW50W2RdPXQsZCsrfWVsc2UgaWYoZS5pc0hlbWlzcGhlcmVMaWdodCl7Y29uc3QgdD1uLmdldChlKTt0LnNreUNvbG9yLmNvcHkoZS5jb2xvcikubXVsdGlwbHlTY2FsYXIoeSksdC5ncm91bmRDb2xvci5jb3B5KGUuZ3JvdW5kQ29sb3IpLm11bHRpcGx5U2NhbGFyKHkpLGEuaGVtaVt1XT10LHUrK319bT4wJiYoZS5pc1dlYkdMMnx8ITA9PT10LmhhcygiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIik/KGEucmVjdEFyZWFMVEMxPXpzdC5MVENfRkxPQVRfMSxhLnJlY3RBcmVhTFRDMj16c3QuTFRDX0ZMT0FUXzIpOiEwPT09dC5oYXMoIk9FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyIik/KGEucmVjdEFyZWFMVEMxPXpzdC5MVENfSEFMRl8xLGEucmVjdEFyZWFMVEMyPXpzdC5MVENfSEFMRl8yKTpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBVbmFibGUgdG8gdXNlIFJlY3RBcmVhTGlnaHQuIE1pc3NpbmcgV2ViR0wgZXh0ZW5zaW9ucy4iKSksYS5hbWJpZW50WzBdPXIsYS5hbWJpZW50WzFdPXMsYS5hbWJpZW50WzJdPWw7Y29uc3QgYj1hLmhhc2g7Yi5kaXJlY3Rpb25hbExlbmd0aD09PWMmJmIucG9pbnRMZW5ndGg9PT1kJiZiLnNwb3RMZW5ndGg9PT1wJiZiLnJlY3RBcmVhTGVuZ3RoPT09bSYmYi5oZW1pTGVuZ3RoPT09dSYmYi5udW1EaXJlY3Rpb25hbFNoYWRvd3M9PT1mJiZiLm51bVBvaW50U2hhZG93cz09PWcmJmIubnVtU3BvdFNoYWRvd3M9PT1ofHwoYS5kaXJlY3Rpb25hbC5sZW5ndGg9YyxhLnNwb3QubGVuZ3RoPXAsYS5yZWN0QXJlYS5sZW5ndGg9bSxhLnBvaW50Lmxlbmd0aD1kLGEuaGVtaS5sZW5ndGg9dSxhLmRpcmVjdGlvbmFsU2hhZG93Lmxlbmd0aD1mLGEuZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoPWYsYS5wb2ludFNoYWRvdy5sZW5ndGg9ZyxhLnBvaW50U2hhZG93TWFwLmxlbmd0aD1nLGEuc3BvdFNoYWRvdy5sZW5ndGg9aCxhLnNwb3RTaGFkb3dNYXAubGVuZ3RoPWgsYS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC5sZW5ndGg9ZixhLnBvaW50U2hhZG93TWF0cml4Lmxlbmd0aD1nLGEuc3BvdFNoYWRvd01hdHJpeC5sZW5ndGg9aCxiLmRpcmVjdGlvbmFsTGVuZ3RoPWMsYi5wb2ludExlbmd0aD1kLGIuc3BvdExlbmd0aD1wLGIucmVjdEFyZWFMZW5ndGg9bSxiLmhlbWlMZW5ndGg9dSxiLm51bURpcmVjdGlvbmFsU2hhZG93cz1mLGIubnVtUG9pbnRTaGFkb3dzPWcsYi5udW1TcG90U2hhZG93cz1oLGEudmVyc2lvbj10ZHQrKyl9LHNldHVwVmlldzpmdW5jdGlvbiBkKHQsZSl7bGV0IG49MCxvPTAsaT0wLGM9MCxkPTA7Y29uc3QgcD1lLm1hdHJpeFdvcmxkSW52ZXJzZTtmb3IobGV0IGU9MCxtPXQubGVuZ3RoO2U8bTtlKyspe2NvbnN0IG09dFtlXTtpZihtLmlzRGlyZWN0aW9uYWxMaWdodCl7Y29uc3QgdD1hLmRpcmVjdGlvbmFsW25dO3QuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihtLm1hdHJpeFdvcmxkKSxyLnNldEZyb21NYXRyaXhQb3NpdGlvbihtLnRhcmdldC5tYXRyaXhXb3JsZCksdC5kaXJlY3Rpb24uc3ViKHIpLHQuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihwKSxuKyt9ZWxzZSBpZihtLmlzU3BvdExpZ2h0KXtjb25zdCB0PWEuc3BvdFtpXTt0LnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihtLm1hdHJpeFdvcmxkKSx0LnBvc2l0aW9uLmFwcGx5TWF0cml4NChwKSx0LmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24obS5tYXRyaXhXb3JsZCksci5zZXRGcm9tTWF0cml4UG9zaXRpb24obS50YXJnZXQubWF0cml4V29ybGQpLHQuZGlyZWN0aW9uLnN1YihyKSx0LmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24ocCksaSsrfWVsc2UgaWYobS5pc1JlY3RBcmVhTGlnaHQpe2NvbnN0IHQ9YS5yZWN0QXJlYVtjXTt0LnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihtLm1hdHJpeFdvcmxkKSx0LnBvc2l0aW9uLmFwcGx5TWF0cml4NChwKSxsLmlkZW50aXR5KCkscy5jb3B5KG0ubWF0cml4V29ybGQpLHMucHJlbXVsdGlwbHkocCksbC5leHRyYWN0Um90YXRpb24ocyksdC5oYWxmV2lkdGguc2V0KC41Km0ud2lkdGgsMCwwKSx0LmhhbGZIZWlnaHQuc2V0KDAsLjUqbS5oZWlnaHQsMCksdC5oYWxmV2lkdGguYXBwbHlNYXRyaXg0KGwpLHQuaGFsZkhlaWdodC5hcHBseU1hdHJpeDQobCksYysrfWVsc2UgaWYobS5pc1BvaW50TGlnaHQpe2NvbnN0IHQ9YS5wb2ludFtvXTt0LnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihtLm1hdHJpeFdvcmxkKSx0LnBvc2l0aW9uLmFwcGx5TWF0cml4NChwKSxvKyt9ZWxzZSBpZihtLmlzSGVtaXNwaGVyZUxpZ2h0KXtjb25zdCB0PWEuaGVtaVtkXTt0LmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24obS5tYXRyaXhXb3JsZCksdC5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKHApLHQuZGlyZWN0aW9uLm5vcm1hbGl6ZSgpLGQrK319fSxzdGF0ZTphfX1mdW5jdGlvbiBvZHQodCxlKXtjb25zdCBuPW5ldyBuZHQodCxlKSxvPVtdLGk9W107cmV0dXJue2luaXQ6ZnVuY3Rpb24gYSgpe28ubGVuZ3RoPTAsaS5sZW5ndGg9MH0sc3RhdGU6e2xpZ2h0c0FycmF5Om8sc2hhZG93c0FycmF5OmksbGlnaHRzOm59LHNldHVwTGlnaHRzOmZ1bmN0aW9uIHIoKXtuLnNldHVwKG8pfSxzZXR1cExpZ2h0c1ZpZXc6ZnVuY3Rpb24gcyh0KXtuLnNldHVwVmlldyhvLHQpfSxwdXNoTGlnaHQ6ZnVuY3Rpb24gbCh0KXtvLnB1c2godCl9LHB1c2hTaGFkb3c6ZnVuY3Rpb24gYyh0KXtpLnB1c2godCl9fX1mdW5jdGlvbiBpZHQodCxlKXtsZXQgbj1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uIG8oaSxhPTApe2xldCByO3JldHVybiExPT09bi5oYXMoaSk/KHI9bmV3IG9kdCh0LGUpLG4uc2V0KGksW3JdKSk6YT49bi5nZXQoaSkubGVuZ3RoPyhyPW5ldyBvZHQodCxlKSxuLmdldChpKS5wdXNoKHIpKTpyPW4uZ2V0KGkpW2FdLHJ9LGRpc3Bvc2U6ZnVuY3Rpb24gaSgpe249bmV3IFdlYWtNYXB9fX1jbGFzcyBhZHQgZXh0ZW5kcyBPcnR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9Ik1lc2hEZXB0aE1hdGVyaWFsIix0aGlzLmRlcHRoUGFja2luZz0zMjAwLHRoaXMubWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50TWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz0wLHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy5mb2c9ITEsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmRlcHRoUGFja2luZz10LmRlcHRoUGFja2luZyx0aGlzLm1hcD10Lm1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5kaXNwbGFjZW1lbnRNYXA9dC5kaXNwbGFjZW1lbnRNYXAsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT10LmRpc3BsYWNlbWVudFNjYWxlLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz10LmRpc3BsYWNlbWVudEJpYXMsdGhpcy53aXJlZnJhbWU9dC53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgsdGhpc319YWR0LnByb3RvdHlwZS5pc01lc2hEZXB0aE1hdGVyaWFsPSEwO2NsYXNzIHJkdCBleHRlbmRzIE9ydHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iTWVzaERpc3RhbmNlTWF0ZXJpYWwiLHRoaXMucmVmZXJlbmNlUG9zaXRpb249bmV3IGNhdCx0aGlzLm5lYXJEaXN0YW5jZT0xLHRoaXMuZmFyRGlzdGFuY2U9MWUzLHRoaXMubWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50TWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz0wLHRoaXMuZm9nPSExLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5yZWZlcmVuY2VQb3NpdGlvbi5jb3B5KHQucmVmZXJlbmNlUG9zaXRpb24pLHRoaXMubmVhckRpc3RhbmNlPXQubmVhckRpc3RhbmNlLHRoaXMuZmFyRGlzdGFuY2U9dC5mYXJEaXN0YW5jZSx0aGlzLm1hcD10Lm1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5kaXNwbGFjZW1lbnRNYXA9dC5kaXNwbGFjZW1lbnRNYXAsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT10LmRpc3BsYWNlbWVudFNjYWxlLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz10LmRpc3BsYWNlbWVudEJpYXMsdGhpc319ZnVuY3Rpb24gc2R0KHQsZSxuKXtsZXQgbz1uZXcgRXN0O2NvbnN0IGk9bmV3IFFpdCxhPW5ldyBRaXQscj1uZXcgYWF0LHM9bmV3IGFkdCh7ZGVwdGhQYWNraW5nOjMyMDF9KSxsPW5ldyByZHQsYz17fSxkPW4ubWF4VGV4dHVyZVNpemUscD17MDoxLDE6MCwyOjJ9LG09bmV3IGJzdCh7ZGVmaW5lczp7U0FNUExFX1JBVEU6Mi84LEhBTEZfU0FNUExFX1JBVEU6MS84fSx1bmlmb3Jtczp7c2hhZG93X3Bhc3M6e3ZhbHVlOm51bGx9LHJlc29sdXRpb246e3ZhbHVlOm5ldyBRaXR9LHJhZGl1czp7dmFsdWU6NH19LHZlcnRleFNoYWRlcjoidm9pZCBtYWluKCkge1xuXHRnbF9Qb3NpdGlvbiA9IHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcbn0iLGZyYWdtZW50U2hhZGVyOiJ1bmlmb3JtIHNhbXBsZXIyRCBzaGFkb3dfcGFzcztcbnVuaWZvcm0gdmVjMiByZXNvbHV0aW9uO1xudW5pZm9ybSBmbG9hdCByYWRpdXM7XG4jaW5jbHVkZSA8cGFja2luZz5cbnZvaWQgbWFpbigpIHtcblx0ZmxvYXQgbWVhbiA9IDAuMDtcblx0ZmxvYXQgc3F1YXJlZF9tZWFuID0gMC4wO1xuXHRmbG9hdCBkZXB0aCA9IHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIHNoYWRvd19wYXNzLCAoIGdsX0ZyYWdDb29yZC54eSApIC8gcmVzb2x1dGlvbiApICk7XG5cdGZvciAoIGZsb2F0IGkgPSAtMS4wOyBpIDwgMS4wIDsgaSArPSBTQU1QTEVfUkFURSkge1xuXHRcdCNpZmRlZiBIT1JJWk9OVEFMX1BBU1Ncblx0XHRcdHZlYzIgZGlzdHJpYnV0aW9uID0gdW5wYWNrUkdCQVRvMkhhbGYoIHRleHR1cmUyRCggc2hhZG93X3Bhc3MsICggZ2xfRnJhZ0Nvb3JkLnh5ICsgdmVjMiggaSwgMC4wICkgKiByYWRpdXMgKSAvIHJlc29sdXRpb24gKSApO1xuXHRcdFx0bWVhbiArPSBkaXN0cmlidXRpb24ueDtcblx0XHRcdHNxdWFyZWRfbWVhbiArPSBkaXN0cmlidXRpb24ueSAqIGRpc3RyaWJ1dGlvbi55ICsgZGlzdHJpYnV0aW9uLnggKiBkaXN0cmlidXRpb24ueDtcblx0XHQjZWxzZVxuXHRcdFx0ZmxvYXQgZGVwdGggPSB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCAwLjAsIGkgKSAqIHJhZGl1cyApIC8gcmVzb2x1dGlvbiApICk7XG5cdFx0XHRtZWFuICs9IGRlcHRoO1xuXHRcdFx0c3F1YXJlZF9tZWFuICs9IGRlcHRoICogZGVwdGg7XG5cdFx0I2VuZGlmXG5cdH1cblx0bWVhbiA9IG1lYW4gKiBIQUxGX1NBTVBMRV9SQVRFO1xuXHRzcXVhcmVkX21lYW4gPSBzcXVhcmVkX21lYW4gKiBIQUxGX1NBTVBMRV9SQVRFO1xuXHRmbG9hdCBzdGRfZGV2ID0gc3FydCggc3F1YXJlZF9tZWFuIC0gbWVhbiAqIG1lYW4gKTtcblx0Z2xfRnJhZ0NvbG9yID0gcGFjazJIYWxmVG9SR0JBKCB2ZWMyKCBtZWFuLCBzdGRfZGV2ICkgKTtcbn0ifSksdT1tLmNsb25lKCk7dS5kZWZpbmVzLkhPUklaT05UQUxfUEFTUz0xO2NvbnN0IGY9bmV3IHFydDtmLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyB6cnQobmV3IEZsb2F0MzJBcnJheShbLTEsLTEsLjUsMywtMSwuNSwtMSwzLC41XSksMykpO2NvbnN0IGc9bmV3IHBzdChmLG0pLGg9dGhpcztmdW5jdGlvbiBiKG4sbyl7Y29uc3QgaT1lLnVwZGF0ZShnKTttLnVuaWZvcm1zLnNoYWRvd19wYXNzLnZhbHVlPW4ubWFwLnRleHR1cmUsbS51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlPW4ubWFwU2l6ZSxtLnVuaWZvcm1zLnJhZGl1cy52YWx1ZT1uLnJhZGl1cyx0LnNldFJlbmRlclRhcmdldChuLm1hcFBhc3MpLHQuY2xlYXIoKSx0LnJlbmRlckJ1ZmZlckRpcmVjdChvLG51bGwsaSxtLGcsbnVsbCksdS51bmlmb3Jtcy5zaGFkb3dfcGFzcy52YWx1ZT1uLm1hcFBhc3MudGV4dHVyZSx1LnVuaWZvcm1zLnJlc29sdXRpb24udmFsdWU9bi5tYXBTaXplLHUudW5pZm9ybXMucmFkaXVzLnZhbHVlPW4ucmFkaXVzLHQuc2V0UmVuZGVyVGFyZ2V0KG4ubWFwKSx0LmNsZWFyKCksdC5yZW5kZXJCdWZmZXJEaXJlY3QobyxudWxsLGksdSxnLG51bGwpfWZ1bmN0aW9uIHkoZSxuLG8saSxhLHIsZCl7bGV0IG09bnVsbDtjb25zdCB1PSEwPT09aS5pc1BvaW50TGlnaHQ/ZS5jdXN0b21EaXN0YW5jZU1hdGVyaWFsOmUuY3VzdG9tRGVwdGhNYXRlcmlhbDtpZihtPXZvaWQgMCE9PXU/dTohMD09PWkuaXNQb2ludExpZ2h0P2w6cyx0LmxvY2FsQ2xpcHBpbmdFbmFibGVkJiYhMD09PW8uY2xpcFNoYWRvd3MmJjAhPT1vLmNsaXBwaW5nUGxhbmVzLmxlbmd0aCl7Y29uc3QgdD1tLnV1aWQsZT1vLnV1aWQ7bGV0IG49Y1t0XTt2b2lkIDA9PT1uJiYobj17fSxjW3RdPW4pO2xldCBpPW5bZV07dm9pZCAwPT09aSYmKGk9bS5jbG9uZSgpLG5bZV09aSksbT1pfXJldHVybiBtLnZpc2libGU9by52aXNpYmxlLG0ud2lyZWZyYW1lPW8ud2lyZWZyYW1lLG0uc2lkZT0zPT09ZD9udWxsIT09by5zaGFkb3dTaWRlP28uc2hhZG93U2lkZTpvLnNpZGU6bnVsbCE9PW8uc2hhZG93U2lkZT9vLnNoYWRvd1NpZGU6cFtvLnNpZGVdLG0uY2xpcFNoYWRvd3M9by5jbGlwU2hhZG93cyxtLmNsaXBwaW5nUGxhbmVzPW8uY2xpcHBpbmdQbGFuZXMsbS5jbGlwSW50ZXJzZWN0aW9uPW8uY2xpcEludGVyc2VjdGlvbixtLndpcmVmcmFtZUxpbmV3aWR0aD1vLndpcmVmcmFtZUxpbmV3aWR0aCxtLmxpbmV3aWR0aD1vLmxpbmV3aWR0aCwhMD09PWkuaXNQb2ludExpZ2h0JiYhMD09PW0uaXNNZXNoRGlzdGFuY2VNYXRlcmlhbCYmKG0ucmVmZXJlbmNlUG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGkubWF0cml4V29ybGQpLG0ubmVhckRpc3RhbmNlPWEsbS5mYXJEaXN0YW5jZT1yKSxtfWZ1bmN0aW9uIF8obixpLGEscixzKXtpZighMT09PW4udmlzaWJsZSlyZXR1cm47aWYobi5sYXllcnMudGVzdChpLmxheWVycykmJihuLmlzTWVzaHx8bi5pc0xpbmV8fG4uaXNQb2ludHMpJiYobi5jYXN0U2hhZG93fHxuLnJlY2VpdmVTaGFkb3cmJjM9PT1zKSYmKCFuLmZydXN0dW1DdWxsZWR8fG8uaW50ZXJzZWN0c09iamVjdChuKSkpe24ubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoYS5tYXRyaXhXb3JsZEludmVyc2Usbi5tYXRyaXhXb3JsZCk7Y29uc3Qgbz1lLnVwZGF0ZShuKSxpPW4ubWF0ZXJpYWw7aWYoQXJyYXkuaXNBcnJheShpKSl7Y29uc3QgZT1vLmdyb3Vwcztmb3IobGV0IGw9MCxjPWUubGVuZ3RoO2w8YztsKyspe2NvbnN0IGM9ZVtsXSxkPWlbYy5tYXRlcmlhbEluZGV4XTtpZihkJiZkLnZpc2libGUpe2NvbnN0IGU9eShuLDAsZCxyLGEubmVhcixhLmZhcixzKTt0LnJlbmRlckJ1ZmZlckRpcmVjdChhLG51bGwsbyxlLG4sYyl9fX1lbHNlIGlmKGkudmlzaWJsZSl7Y29uc3QgZT15KG4sMCxpLHIsYS5uZWFyLGEuZmFyLHMpO3QucmVuZGVyQnVmZmVyRGlyZWN0KGEsbnVsbCxvLGUsbixudWxsKX19Y29uc3QgbD1uLmNoaWxkcmVuO2ZvcihsZXQgdD0wLGU9bC5sZW5ndGg7dDxlO3QrKylfKGxbdF0saSxhLHIscyl9dGhpcy5lbmFibGVkPSExLHRoaXMuYXV0b1VwZGF0ZT0hMCx0aGlzLm5lZWRzVXBkYXRlPSExLHRoaXMudHlwZT0xLHRoaXMucmVuZGVyPWZ1bmN0aW9uKGUsbixzKXtpZighMT09PWguZW5hYmxlZClyZXR1cm47aWYoITE9PT1oLmF1dG9VcGRhdGUmJiExPT09aC5uZWVkc1VwZGF0ZSlyZXR1cm47aWYoMD09PWUubGVuZ3RoKXJldHVybjtjb25zdCBsPXQuZ2V0UmVuZGVyVGFyZ2V0KCksYz10LmdldEFjdGl2ZUN1YmVGYWNlKCkscD10LmdldEFjdGl2ZU1pcG1hcExldmVsKCksbT10LnN0YXRlO20uc2V0QmxlbmRpbmcoMCksbS5idWZmZXJzLmNvbG9yLnNldENsZWFyKDEsMSwxLDEpLG0uYnVmZmVycy5kZXB0aC5zZXRUZXN0KCEwKSxtLnNldFNjaXNzb3JUZXN0KCExKTtmb3IobGV0IGw9MCxjPWUubGVuZ3RoO2w8YztsKyspe2NvbnN0IGM9ZVtsXSxwPWMuc2hhZG93O2lmKHZvaWQgMD09PXApe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xTaGFkb3dNYXA6IixjLCJoYXMgbm8gc2hhZG93LiIpO2NvbnRpbnVlfWlmKCExPT09cC5hdXRvVXBkYXRlJiYhMT09PXAubmVlZHNVcGRhdGUpY29udGludWU7aS5jb3B5KHAubWFwU2l6ZSk7Y29uc3QgdT1wLmdldEZyYW1lRXh0ZW50cygpO2lmKGkubXVsdGlwbHkodSksYS5jb3B5KHAubWFwU2l6ZSksKGkueD5kfHxpLnk+ZCkmJihpLng+ZCYmKGEueD1NYXRoLmZsb29yKGQvdS54KSxpLng9YS54KnUueCxwLm1hcFNpemUueD1hLngpLGkueT5kJiYoYS55PU1hdGguZmxvb3IoZC91LnkpLGkueT1hLnkqdS55LHAubWFwU2l6ZS55PWEueSkpLG51bGw9PT1wLm1hcCYmIXAuaXNQb2ludExpZ2h0U2hhZG93JiYzPT09dGhpcy50eXBlKXtjb25zdCB0PXttaW5GaWx0ZXI6Yml0LG1hZ0ZpbHRlcjpiaXQsZm9ybWF0OndpdH07cC5tYXA9bmV3IHJhdChpLngsaS55LHQpLHAubWFwLnRleHR1cmUubmFtZT1jLm5hbWUrIi5zaGFkb3dNYXAiLHAubWFwUGFzcz1uZXcgcmF0KGkueCxpLnksdCkscC5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfW51bGw9PT1wLm1hcCYmKHAubWFwPW5ldyByYXQoaS54LGkueSx7bWluRmlsdGVyOmhpdCxtYWdGaWx0ZXI6aGl0LGZvcm1hdDp3aXR9KSxwLm1hcC50ZXh0dXJlLm5hbWU9Yy5uYW1lKyIuc2hhZG93TWFwIixwLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCkpLHQuc2V0UmVuZGVyVGFyZ2V0KHAubWFwKSx0LmNsZWFyKCk7Y29uc3QgZj1wLmdldFZpZXdwb3J0Q291bnQoKTtmb3IobGV0IHQ9MDt0PGY7dCsrKXtjb25zdCBlPXAuZ2V0Vmlld3BvcnQodCk7ci5zZXQoYS54KmUueCxhLnkqZS55LGEueCplLnosYS55KmUudyksbS52aWV3cG9ydChyKSxwLnVwZGF0ZU1hdHJpY2VzKGMsdCksbz1wLmdldEZydXN0dW0oKSxfKG4scyxwLmNhbWVyYSxjLHRoaXMudHlwZSl9cC5pc1BvaW50TGlnaHRTaGFkb3d8fDMhPT10aGlzLnR5cGV8fGIocCxzKSxwLm5lZWRzVXBkYXRlPSExfWgubmVlZHNVcGRhdGU9ITEsdC5zZXRSZW5kZXJUYXJnZXQobCxjLHApfX1mdW5jdGlvbiBsZHQodCxlLG4pe2NvbnN0IG89bi5pc1dlYkdMMixpPW5ldyhmdW5jdGlvbiBhKCl7bGV0IGU9ITE7Y29uc3Qgbj1uZXcgYWF0O2xldCBvPW51bGw7Y29uc3QgaT1uZXcgYWF0KDAsMCwwLDApO3JldHVybntzZXRNYXNrOmZ1bmN0aW9uKG4pe289PT1ufHxlfHwodC5jb2xvck1hc2sobixuLG4sbiksbz1uKX0sc2V0TG9ja2VkOmZ1bmN0aW9uKHQpe2U9dH0sc2V0Q2xlYXI6ZnVuY3Rpb24oZSxvLGEscixzKXshMD09PXMmJihlKj1yLG8qPXIsYSo9ciksbi5zZXQoZSxvLGEsciksITE9PT1pLmVxdWFscyhuKSYmKHQuY2xlYXJDb2xvcihlLG8sYSxyKSxpLmNvcHkobikpfSxyZXNldDpmdW5jdGlvbigpe2U9ITEsbz1udWxsLGkuc2V0KC0xLDAsMCwwKX19fSkscj1uZXcoZnVuY3Rpb24gcygpe2xldCBlPSExLG49bnVsbCxvPW51bGwsaT1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKHQpe3Q/QigyOTI5KTpWKDI5MjkpfSxzZXRNYXNrOmZ1bmN0aW9uKG8pe249PT1vfHxlfHwodC5kZXB0aE1hc2sobyksbj1vKX0sc2V0RnVuYzpmdW5jdGlvbihlKXtpZihvIT09ZSl7aWYoZSlzd2l0Y2goZSl7Y2FzZSAwOnQuZGVwdGhGdW5jKDUxMik7YnJlYWs7Y2FzZSAxOnQuZGVwdGhGdW5jKDUxOSk7YnJlYWs7Y2FzZSAyOnQuZGVwdGhGdW5jKDUxMyk7YnJlYWs7Y2FzZSAzOnQuZGVwdGhGdW5jKDUxNSk7YnJlYWs7Y2FzZSA0OnQuZGVwdGhGdW5jKDUxNCk7YnJlYWs7Y2FzZSA1OnQuZGVwdGhGdW5jKDUxOCk7YnJlYWs7Y2FzZSA2OnQuZGVwdGhGdW5jKDUxNik7YnJlYWs7Y2FzZSA3OnQuZGVwdGhGdW5jKDUxNyk7YnJlYWs7ZGVmYXVsdDp0LmRlcHRoRnVuYyg1MTUpfWVsc2UgdC5kZXB0aEZ1bmMoNTE1KTtvPWV9fSxzZXRMb2NrZWQ6ZnVuY3Rpb24odCl7ZT10fSxzZXRDbGVhcjpmdW5jdGlvbihlKXtpIT09ZSYmKHQuY2xlYXJEZXB0aChlKSxpPWUpfSxyZXNldDpmdW5jdGlvbigpe2U9ITEsbj1udWxsLG89bnVsbCxpPW51bGx9fX0pLGw9bmV3KGZ1bmN0aW9uIGMoKXtsZXQgZT0hMSxuPW51bGwsbz1udWxsLGk9bnVsbCxhPW51bGwscj1udWxsLHM9bnVsbCxsPW51bGwsYz1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKHQpe2V8fCh0P0IoMjk2MCk6VigyOTYwKSl9LHNldE1hc2s6ZnVuY3Rpb24obyl7bj09PW98fGV8fCh0LnN0ZW5jaWxNYXNrKG8pLG49byl9LHNldEZ1bmM6ZnVuY3Rpb24oZSxuLHIpe289PT1lJiZpPT09biYmYT09PXJ8fCh0LnN0ZW5jaWxGdW5jKGUsbixyKSxvPWUsaT1uLGE9cil9LHNldE9wOmZ1bmN0aW9uKGUsbixvKXtyPT09ZSYmcz09PW4mJmw9PT1vfHwodC5zdGVuY2lsT3AoZSxuLG8pLHI9ZSxzPW4sbD1vKX0sc2V0TG9ja2VkOmZ1bmN0aW9uKHQpe2U9dH0sc2V0Q2xlYXI6ZnVuY3Rpb24oZSl7YyE9PWUmJih0LmNsZWFyU3RlbmNpbChlKSxjPWUpfSxyZXNldDpmdW5jdGlvbigpe2U9ITEsbj1udWxsLG89bnVsbCxpPW51bGwsYT1udWxsLHI9bnVsbCxzPW51bGwsbD1udWxsLGM9bnVsbH19fSk7bGV0IGQ9e30scD1udWxsLG09e30sdT1udWxsLGY9ITEsZz1udWxsLGg9bnVsbCxiPW51bGwseT1udWxsLF89bnVsbCxDPW51bGwsTT1udWxsLHY9ITEseD1udWxsLE89bnVsbCxQPW51bGwsdz1udWxsLGs9bnVsbDtjb25zdCBTPXQuZ2V0UGFyYW1ldGVyKDM1NjYxKTtsZXQgRD0hMSxFPTA7Y29uc3QgUj10LmdldFBhcmFtZXRlcig3OTM4KTstMSE9PVIuaW5kZXhPZigiV2ViR0wiKT8oRT1wYXJzZUZsb2F0KC9eV2ViR0wgKFxkKS8uZXhlYyhSKVsxXSksRD1FPj0xKTotMSE9PVIuaW5kZXhPZigiT3BlbkdMIEVTIikmJihFPXBhcnNlRmxvYXQoL15PcGVuR0wgRVMgKFxkKS8uZXhlYyhSKVsxXSksRD1FPj0yKTtsZXQgQT1udWxsLFQ9e307Y29uc3QgTj10LmdldFBhcmFtZXRlcigzMDg4KSx6PXQuZ2V0UGFyYW1ldGVyKDI5NzgpLEk9KG5ldyBhYXQpLmZyb21BcnJheShOKSxIPShuZXcgYWF0KS5mcm9tQXJyYXkoeik7ZnVuY3Rpb24gRihlLG4sbyl7Y29uc3QgaT1uZXcgVWludDhBcnJheSg0KSxhPXQuY3JlYXRlVGV4dHVyZSgpO3QuYmluZFRleHR1cmUoZSxhKSx0LnRleFBhcmFtZXRlcmkoZSwxMDI0MSw5NzI4KSx0LnRleFBhcmFtZXRlcmkoZSwxMDI0MCw5NzI4KTtmb3IobGV0IGU9MDtlPG87ZSsrKXQudGV4SW1hZ2UyRChuK2UsMCw2NDA4LDEsMSwwLDY0MDgsNTEyMSxpKTtyZXR1cm4gYX1jb25zdCBMPXt9O2Z1bmN0aW9uIEIoZSl7ITAhPT1kW2VdJiYodC5lbmFibGUoZSksZFtlXT0hMCl9ZnVuY3Rpb24gVihlKXshMSE9PWRbZV0mJih0LmRpc2FibGUoZSksZFtlXT0hMSl9TFszNTUzXT1GKDM1NTMsMzU1MywxKSxMWzM0MDY3XT1GKDM0MDY3LDM0MDY5LDYpLGkuc2V0Q2xlYXIoMCwwLDAsMSksci5zZXRDbGVhcigxKSxsLnNldENsZWFyKDApLEIoMjkyOSksci5zZXRGdW5jKDMpLFcoITEpLFkoMSksQigyODg0KSxHKDApO2NvbnN0IGo9e1tjaXRdOjMyNzc0LDEwMTozMjc3OCwxMDI6MzI3Nzl9O2lmKG8palsxMDNdPTMyNzc1LGpbMTA0XT0zMjc3NjtlbHNle2NvbnN0IHQ9ZS5nZXQoIkVYVF9ibGVuZF9taW5tYXgiKTtudWxsIT09dCYmKGpbMTAzXT10Lk1JTl9FWFQsalsxMDRdPXQuTUFYX0VYVCl9Y29uc3QgVT17MjAwOjAsMjAxOjEsMjAyOjc2OCwyMDQ6NzcwLDIxMDo3NzYsMjA4Ojc3NCwyMDY6NzcyLDIwMzo3NjksMjA1Ojc3MSwyMDk6Nzc1LDIwNzo3NzN9O2Z1bmN0aW9uIEcoZSxuLG8saSxhLHIscyxsKXtpZigwIT09ZSl7aWYoITE9PT1mJiYoQigzMDQyKSxmPSEwKSw1PT09ZSlhPWF8fG4scj1yfHxvLHM9c3x8aSxuPT09aCYmYT09PV98fCh0LmJsZW5kRXF1YXRpb25TZXBhcmF0ZShqW25dLGpbYV0pLGg9bixfPWEpLG89PT1iJiZpPT09eSYmcj09PUMmJnM9PT1NfHwodC5ibGVuZEZ1bmNTZXBhcmF0ZShVW29dLFVbaV0sVVtyXSxVW3NdKSxiPW8seT1pLEM9cixNPXMpLGc9ZSx2PW51bGw7ZWxzZSBpZihlIT09Z3x8bCE9PXYpe2lmKGg9PT1jaXQmJl89PT1jaXR8fCh0LmJsZW5kRXF1YXRpb24oMzI3NzQpLGg9Y2l0LF89Y2l0KSxsKXN3aXRjaChlKXtjYXNlIDE6dC5ibGVuZEZ1bmNTZXBhcmF0ZSgxLDc3MSwxLDc3MSk7YnJlYWs7Y2FzZSAyOnQuYmxlbmRGdW5jKDEsMSk7YnJlYWs7Y2FzZSAzOnQuYmxlbmRGdW5jU2VwYXJhdGUoMCwwLDc2OSw3NzEpO2JyZWFrO2Nhc2UgNDp0LmJsZW5kRnVuY1NlcGFyYXRlKDAsNzY4LDAsNzcwKTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICIsZSl9ZWxzZSBzd2l0Y2goZSl7Y2FzZSAxOnQuYmxlbmRGdW5jU2VwYXJhdGUoNzcwLDc3MSwxLDc3MSk7YnJlYWs7Y2FzZSAyOnQuYmxlbmRGdW5jKDc3MCwxKTticmVhaztjYXNlIDM6dC5ibGVuZEZ1bmMoMCw3NjkpO2JyZWFrO2Nhc2UgNDp0LmJsZW5kRnVuYygwLDc2OCk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAiLGUpfWI9bnVsbCx5PW51bGwsQz1udWxsLE09bnVsbCxnPWUsdj1sfX1lbHNlITA9PT1mJiYoVigzMDQyKSxmPSExKX1mdW5jdGlvbiBXKGUpe3ghPT1lJiYodC5mcm9udEZhY2UoZT8yMzA0OjIzMDUpLHg9ZSl9ZnVuY3Rpb24gWShlKXswIT09ZT8oQigyODg0KSxlIT09TyYmdC5jdWxsRmFjZSgxPT09ZT8xMDI5OjI9PT1lPzEwMjg6MTAzMikpOlYoMjg4NCksTz1lfWZ1bmN0aW9uIHEoZSxuLG8pe2U/KEIoMzI4MjMpLHc9PT1uJiZrPT09b3x8KHQucG9seWdvbk9mZnNldChuLG8pLHc9bixrPW8pKTpWKDMyODIzKX1mdW5jdGlvbiBaKGUpe3ZvaWQgMD09PWUmJihlPTMzOTg0K1MtMSksQSE9PWUmJih0LmFjdGl2ZVRleHR1cmUoZSksQT1lKX1yZXR1cm57YnVmZmVyczp7Y29sb3I6aSxkZXB0aDpyLHN0ZW5jaWw6bH0sZW5hYmxlOkIsZGlzYWJsZTpWLGJpbmRGcmFtZWJ1ZmZlcjpmdW5jdGlvbiBYKGUsbil7cmV0dXJuIG51bGw9PT1uJiZudWxsIT09cCYmKG49cCksbVtlXSE9PW4mJih0LmJpbmRGcmFtZWJ1ZmZlcihlLG4pLG1bZV09bixvJiYoMzYwMDk9PT1lJiYobVszNjE2MF09biksMzYxNjA9PT1lJiYobVszNjAwOV09bikpLCEwKX0sYmluZFhSRnJhbWVidWZmZXI6ZnVuY3Rpb24gSyhlKXtlIT09cCYmKHQuYmluZEZyYW1lYnVmZmVyKDM2MTYwLGUpLHA9ZSl9LHVzZVByb2dyYW06ZnVuY3Rpb24gSihlKXtyZXR1cm4gdSE9PWUmJih0LnVzZVByb2dyYW0oZSksdT1lLCEwKX0sc2V0QmxlbmRpbmc6RyxzZXRNYXRlcmlhbDpmdW5jdGlvbiBRKHQsZSl7Mj09PXQuc2lkZT9WKDI4ODQpOkIoMjg4NCk7bGV0IG49MT09PXQuc2lkZTtlJiYobj0hbiksVyhuKSwxPT09dC5ibGVuZGluZyYmITE9PT10LnRyYW5zcGFyZW50P0coMCk6Ryh0LmJsZW5kaW5nLHQuYmxlbmRFcXVhdGlvbix0LmJsZW5kU3JjLHQuYmxlbmREc3QsdC5ibGVuZEVxdWF0aW9uQWxwaGEsdC5ibGVuZFNyY0FscGhhLHQuYmxlbmREc3RBbHBoYSx0LnByZW11bHRpcGxpZWRBbHBoYSksci5zZXRGdW5jKHQuZGVwdGhGdW5jKSxyLnNldFRlc3QodC5kZXB0aFRlc3QpLHIuc2V0TWFzayh0LmRlcHRoV3JpdGUpLGkuc2V0TWFzayh0LmNvbG9yV3JpdGUpO2NvbnN0IG89dC5zdGVuY2lsV3JpdGU7bC5zZXRUZXN0KG8pLG8mJihsLnNldE1hc2sodC5zdGVuY2lsV3JpdGVNYXNrKSxsLnNldEZ1bmModC5zdGVuY2lsRnVuYyx0LnN0ZW5jaWxSZWYsdC5zdGVuY2lsRnVuY01hc2spLGwuc2V0T3AodC5zdGVuY2lsRmFpbCx0LnN0ZW5jaWxaRmFpbCx0LnN0ZW5jaWxaUGFzcykpLHEodC5wb2x5Z29uT2Zmc2V0LHQucG9seWdvbk9mZnNldEZhY3Rvcix0LnBvbHlnb25PZmZzZXRVbml0cyksITA9PT10LmFscGhhVG9Db3ZlcmFnZT9CKDMyOTI2KTpWKDMyOTI2KX0sc2V0RmxpcFNpZGVkOlcsc2V0Q3VsbEZhY2U6WSxzZXRMaW5lV2lkdGg6ZnVuY3Rpb24gJChlKXtlIT09UCYmKEQmJnQubGluZVdpZHRoKGUpLFA9ZSl9LHNldFBvbHlnb25PZmZzZXQ6cSxzZXRTY2lzc29yVGVzdDpmdW5jdGlvbiB0dCh0KXt0P0IoMzA4OSk6VigzMDg5KX0sYWN0aXZlVGV4dHVyZTpaLGJpbmRUZXh0dXJlOmZ1bmN0aW9uIGV0KGUsbil7bnVsbD09PUEmJlooKTtsZXQgbz1UW0FdO3ZvaWQgMD09PW8mJihvPXt0eXBlOnZvaWQgMCx0ZXh0dXJlOnZvaWQgMH0sVFtBXT1vKSxvLnR5cGU9PT1lJiZvLnRleHR1cmU9PT1ufHwodC5iaW5kVGV4dHVyZShlLG58fExbZV0pLG8udHlwZT1lLG8udGV4dHVyZT1uKX0sdW5iaW5kVGV4dHVyZTpmdW5jdGlvbiBudCgpe2NvbnN0IGU9VFtBXTt2b2lkIDAhPT1lJiZ2b2lkIDAhPT1lLnR5cGUmJih0LmJpbmRUZXh0dXJlKGUudHlwZSxudWxsKSxlLnR5cGU9dm9pZCAwLGUudGV4dHVyZT12b2lkIDApfSxjb21wcmVzc2VkVGV4SW1hZ2UyRDpmdW5jdGlvbiBvdCgpe3RyeXt0LmNvbXByZXNzZWRUZXhJbWFnZTJELmFwcGx5KHQsYXJndW1lbnRzKX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIsdCl9fSx0ZXhJbWFnZTJEOmZ1bmN0aW9uIGl0KCl7dHJ5e3QudGV4SW1hZ2UyRC5hcHBseSh0LGFyZ3VtZW50cyl9Y2F0Y2godCl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLHQpfX0sdGV4SW1hZ2UzRDpmdW5jdGlvbiBhdCgpe3RyeXt0LnRleEltYWdlM0QuYXBwbHkodCxhcmd1bWVudHMpfWNhdGNoKHQpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6Iix0KX19LHNjaXNzb3I6ZnVuY3Rpb24gcnQoZSl7ITE9PT1JLmVxdWFscyhlKSYmKHQuc2Npc3NvcihlLngsZS55LGUueixlLncpLEkuY29weShlKSl9LHZpZXdwb3J0OmZ1bmN0aW9uIHN0KGUpeyExPT09SC5lcXVhbHMoZSkmJih0LnZpZXdwb3J0KGUueCxlLnksZS56LGUudyksSC5jb3B5KGUpKX0scmVzZXQ6ZnVuY3Rpb24gbHQoKXt0LmRpc2FibGUoMzA0MiksdC5kaXNhYmxlKDI4ODQpLHQuZGlzYWJsZSgyOTI5KSx0LmRpc2FibGUoMzI4MjMpLHQuZGlzYWJsZSgzMDg5KSx0LmRpc2FibGUoMjk2MCksdC5kaXNhYmxlKDMyOTI2KSx0LmJsZW5kRXF1YXRpb24oMzI3NzQpLHQuYmxlbmRGdW5jKDEsMCksdC5ibGVuZEZ1bmNTZXBhcmF0ZSgxLDAsMSwwKSx0LmNvbG9yTWFzayghMCwhMCwhMCwhMCksdC5jbGVhckNvbG9yKDAsMCwwLDApLHQuZGVwdGhNYXNrKCEwKSx0LmRlcHRoRnVuYyg1MTMpLHQuY2xlYXJEZXB0aCgxKSx0LnN0ZW5jaWxNYXNrKDQyOTQ5NjcyOTUpLHQuc3RlbmNpbEZ1bmMoNTE5LDAsNDI5NDk2NzI5NSksdC5zdGVuY2lsT3AoNzY4MCw3NjgwLDc2ODApLHQuY2xlYXJTdGVuY2lsKDApLHQuY3VsbEZhY2UoMTAyOSksdC5mcm9udEZhY2UoMjMwNSksdC5wb2x5Z29uT2Zmc2V0KDAsMCksdC5hY3RpdmVUZXh0dXJlKDMzOTg0KSx0LmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxudWxsKSwhMD09PW8mJih0LmJpbmRGcmFtZWJ1ZmZlcigzNjAwOSxudWxsKSx0LmJpbmRGcmFtZWJ1ZmZlcigzNjAwOCxudWxsKSksdC51c2VQcm9ncmFtKG51bGwpLHQubGluZVdpZHRoKDEpLHQuc2Npc3NvcigwLDAsdC5jYW52YXMud2lkdGgsdC5jYW52YXMuaGVpZ2h0KSx0LnZpZXdwb3J0KDAsMCx0LmNhbnZhcy53aWR0aCx0LmNhbnZhcy5oZWlnaHQpLGQ9e30sQT1udWxsLFQ9e30scD1udWxsLG09e30sdT1udWxsLGY9ITEsZz1udWxsLGg9bnVsbCxiPW51bGwseT1udWxsLF89bnVsbCxDPW51bGwsTT1udWxsLHY9ITEseD1udWxsLE89bnVsbCxQPW51bGwsdz1udWxsLGs9bnVsbCxJLnNldCgwLDAsdC5jYW52YXMud2lkdGgsdC5jYW52YXMuaGVpZ2h0KSxILnNldCgwLDAsdC5jYW52YXMud2lkdGgsdC5jYW52YXMuaGVpZ2h0KSxpLnJlc2V0KCksci5yZXNldCgpLGwucmVzZXQoKX19fWZ1bmN0aW9uIGNkdCh0LGUsbixvLGksYSxyKXtjb25zdCBzPWkuaXNXZWJHTDIsbD1pLm1heFRleHR1cmVzLGM9aS5tYXhDdWJlbWFwU2l6ZSxkPWkubWF4VGV4dHVyZVNpemUscD1pLm1heFNhbXBsZXMsbT1uZXcgV2Vha01hcDtsZXQgdSxmPSExO3RyeXtmPSJ1bmRlZmluZWQiIT10eXBlb2YgT2Zmc2NyZWVuQ2FudmFzJiZudWxsIT09bmV3IE9mZnNjcmVlbkNhbnZhcygxLDEpLmdldENvbnRleHQoIjJkIil9Y2F0Y2godCl7fWZ1bmN0aW9uIGcodCxlKXtyZXR1cm4gZj9uZXcgT2Zmc2NyZWVuQ2FudmFzKHQsZSk6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiY2FudmFzIil9ZnVuY3Rpb24gaCh0LGUsbixvKXtsZXQgaT0xO2lmKCh0LndpZHRoPm98fHQuaGVpZ2h0Pm8pJiYoaT1vL01hdGgubWF4KHQud2lkdGgsdC5oZWlnaHQpKSxpPDF8fCEwPT09ZSl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50JiZ0IGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudHx8InVuZGVmaW5lZCIhPXR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCYmdCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHwidW5kZWZpbmVkIiE9dHlwZW9mIEltYWdlQml0bWFwJiZ0IGluc3RhbmNlb2YgSW1hZ2VCaXRtYXApe2NvbnN0IG89ZT9KaXQ6TWF0aC5mbG9vcixhPW8oaSp0LndpZHRoKSxyPW8oaSp0LmhlaWdodCk7dm9pZCAwPT09dSYmKHU9ZyhhLHIpKTtjb25zdCBzPW4/ZyhhLHIpOnU7cmV0dXJuIHMud2lkdGg9YSxzLmhlaWdodD1yLHMuZ2V0Q29udGV4dCgiMmQiKS5kcmF3SW1hZ2UodCwwLDAsYSxyKSxjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgaGFzIGJlZW4gcmVzaXplZCBmcm9tICgiK3Qud2lkdGgrIngiK3QuaGVpZ2h0KyIpIHRvICgiK2ErIngiK3IrIikuIiksc31yZXR1cm4iZGF0YSJpbiB0JiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEltYWdlIGluIERhdGFUZXh0dXJlIGlzIHRvbyBiaWcgKCIrdC53aWR0aCsieCIrdC5oZWlnaHQrIikuIiksdH1yZXR1cm4gdH1mdW5jdGlvbiBiKHQpe3JldHVybiBLaXQodC53aWR0aCkmJktpdCh0LmhlaWdodCl9ZnVuY3Rpb24geSh0LGUpe3JldHVybiB0LmdlbmVyYXRlTWlwbWFwcyYmZSYmdC5taW5GaWx0ZXIhPT1oaXQmJnQubWluRmlsdGVyIT09Yml0fWZ1bmN0aW9uIF8oZSxuLGksYSxyPTEpe3QuZ2VuZXJhdGVNaXBtYXAoZSksby5nZXQobikuX19tYXhNaXBMZXZlbD1NYXRoLmxvZzIoTWF0aC5tYXgoaSxhLHIpKX1mdW5jdGlvbiBDKG4sbyxpKXtpZighMT09PXMpcmV0dXJuIG87aWYobnVsbCE9PW4pe2lmKHZvaWQgMCE9PXRbbl0pcmV0dXJuIHRbbl07Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIHVzZSBub24tZXhpc3RpbmcgV2ViR0wgaW50ZXJuYWwgZm9ybWF0ICciK24rIiciKX1sZXQgYT1vO3JldHVybiA2NDAzPT09byYmKDUxMjY9PT1pJiYoYT0zMzMyNiksNTEzMT09PWkmJihhPTMzMzI1KSw1MTIxPT09aSYmKGE9MzMzMjEpKSw2NDA3PT09byYmKDUxMjY9PT1pJiYoYT0zNDgzNyksNTEzMT09PWkmJihhPTM0ODQzKSw1MTIxPT09aSYmKGE9MzI4NDkpKSw2NDA4PT09byYmKDUxMjY9PT1pJiYoYT0zNDgzNiksNTEzMT09PWkmJihhPTM0ODQyKSw1MTIxPT09aSYmKGE9MzI4NTYpKSwzMzMyNSE9PWEmJjMzMzI2IT09YSYmMzQ4NDIhPT1hJiYzNDgzNiE9PWF8fGUuZ2V0KCJFWFRfY29sb3JfYnVmZmVyX2Zsb2F0IiksYX1mdW5jdGlvbiBNKHQpe3JldHVybiB0PT09aGl0fHwxMDA0PT09dHx8MTAwNT09PXQ/OTcyODo5NzI5fWZ1bmN0aW9uIHYoZSl7Y29uc3Qgbj1lLnRhcmdldDtuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHYpLChmdW5jdGlvbiBpKGUpe2NvbnN0IG49by5nZXQoZSk7dm9pZCAwIT09bi5fX3dlYmdsSW5pdCYmKHQuZGVsZXRlVGV4dHVyZShuLl9fd2ViZ2xUZXh0dXJlKSxvLnJlbW92ZShlKSl9KShuKSxuLmlzVmlkZW9UZXh0dXJlJiZtLmRlbGV0ZShuKSxyLm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIHgoZSl7Y29uc3Qgbj1lLnRhcmdldDtuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHgpLChmdW5jdGlvbiBpKGUpe2NvbnN0IG49ZS50ZXh0dXJlLGk9by5nZXQoZSksYT1vLmdldChuKTtpZihlKXtpZih2b2lkIDAhPT1hLl9fd2ViZ2xUZXh0dXJlJiYodC5kZWxldGVUZXh0dXJlKGEuX193ZWJnbFRleHR1cmUpLHIubWVtb3J5LnRleHR1cmVzLS0pLGUuZGVwdGhUZXh0dXJlJiZlLmRlcHRoVGV4dHVyZS5kaXNwb3NlKCksZS5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldClmb3IobGV0IGU9MDtlPDY7ZSsrKXQuZGVsZXRlRnJhbWVidWZmZXIoaS5fX3dlYmdsRnJhbWVidWZmZXJbZV0pLGkuX193ZWJnbERlcHRoYnVmZmVyJiZ0LmRlbGV0ZVJlbmRlcmJ1ZmZlcihpLl9fd2ViZ2xEZXB0aGJ1ZmZlcltlXSk7ZWxzZSB0LmRlbGV0ZUZyYW1lYnVmZmVyKGkuX193ZWJnbEZyYW1lYnVmZmVyKSxpLl9fd2ViZ2xEZXB0aGJ1ZmZlciYmdC5kZWxldGVSZW5kZXJidWZmZXIoaS5fX3dlYmdsRGVwdGhidWZmZXIpLGkuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyJiZ0LmRlbGV0ZUZyYW1lYnVmZmVyKGkuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKSxpLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlciYmdC5kZWxldGVSZW5kZXJidWZmZXIoaS5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIpLGkuX193ZWJnbERlcHRoUmVuZGVyYnVmZmVyJiZ0LmRlbGV0ZVJlbmRlcmJ1ZmZlcihpLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcik7aWYoZS5pc1dlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzKWZvcihsZXQgZT0wLGk9bi5sZW5ndGg7ZTxpO2UrKyl7Y29uc3QgaT1vLmdldChuW2VdKTtpLl9fd2ViZ2xUZXh0dXJlJiYodC5kZWxldGVUZXh0dXJlKGkuX193ZWJnbFRleHR1cmUpLHIubWVtb3J5LnRleHR1cmVzLS0pLG8ucmVtb3ZlKG5bZV0pfW8ucmVtb3ZlKG4pLG8ucmVtb3ZlKGUpfX0pKG4pfWxldCBPPTA7ZnVuY3Rpb24gUCh0LGUpe2NvbnN0IGk9by5nZXQodCk7aWYodC5pc1ZpZGVvVGV4dHVyZSYmKGZ1bmN0aW9uIGEodCl7Y29uc3QgZT1yLnJlbmRlci5mcmFtZTttLmdldCh0KSE9PWUmJihtLnNldCh0LGUpLHQudXBkYXRlKCkpfSkodCksdC52ZXJzaW9uPjAmJmkuX192ZXJzaW9uIT09dC52ZXJzaW9uKXtjb25zdCBuPXQuaW1hZ2U7aWYodm9pZCAwPT09biljb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIHVuZGVmaW5lZCIpO2Vsc2V7aWYoITEhPT1uLmNvbXBsZXRlKXJldHVybiB2b2lkIFIoaSx0LGUpO2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgaW5jb21wbGV0ZSIpfX1uLmFjdGl2ZVRleHR1cmUoMzM5ODQrZSksbi5iaW5kVGV4dHVyZSgzNTUzLGkuX193ZWJnbFRleHR1cmUpfWZ1bmN0aW9uIHcoZSxpKXtjb25zdCByPW8uZ2V0KGUpO2UudmVyc2lvbj4wJiZyLl9fdmVyc2lvbiE9PWUudmVyc2lvbj8oZnVuY3Rpb24gbChlLG8saSl7aWYoNiE9PW8uaW1hZ2UubGVuZ3RoKXJldHVybjtFKGUsbyksbi5hY3RpdmVUZXh0dXJlKDMzOTg0K2kpLG4uYmluZFRleHR1cmUoMzQwNjcsZS5fX3dlYmdsVGV4dHVyZSksdC5waXhlbFN0b3JlaSgzNzQ0MCxvLmZsaXBZKSx0LnBpeGVsU3RvcmVpKDM3NDQxLG8ucHJlbXVsdGlwbHlBbHBoYSksdC5waXhlbFN0b3JlaSgzMzE3LG8udW5wYWNrQWxpZ25tZW50KSx0LnBpeGVsU3RvcmVpKDM3NDQzLDApO2NvbnN0IHI9byYmKG8uaXNDb21wcmVzc2VkVGV4dHVyZXx8by5pbWFnZVswXS5pc0NvbXByZXNzZWRUZXh0dXJlKSxsPW8uaW1hZ2VbMF0mJm8uaW1hZ2VbMF0uaXNEYXRhVGV4dHVyZSxkPVtdO2ZvcihsZXQgdD0wO3Q8Njt0KyspZFt0XT1yfHxsP2w/by5pbWFnZVt0XS5pbWFnZTpvLmltYWdlW3RdOmgoby5pbWFnZVt0XSwhMSwhMCxjKTtjb25zdCBwPWRbMF0sbT1iKHApfHxzLHU9YS5jb252ZXJ0KG8uZm9ybWF0KSxmPWEuY29udmVydChvLnR5cGUpLGc9QyhvLmludGVybmFsRm9ybWF0LHUsZik7bGV0IE07aWYoRCgzNDA2NyxvLG0pLHIpe2ZvcihsZXQgdD0wO3Q8Njt0Kyspe009ZFt0XS5taXBtYXBzO2ZvcihsZXQgZT0wO2U8TS5sZW5ndGg7ZSsrKXtjb25zdCBpPU1bZV07by5mb3JtYXQhPT13aXQmJm8uZm9ybWF0IT09UGl0P251bGwhPT11P24uY29tcHJlc3NlZFRleEltYWdlMkQoMzQwNjkrdCxlLGcsaS53aWR0aCxpLmhlaWdodCwwLGkuZGF0YSk6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAuc2V0VGV4dHVyZUN1YmUoKSIpOm4udGV4SW1hZ2UyRCgzNDA2OSt0LGUsZyxpLndpZHRoLGkuaGVpZ2h0LDAsdSxmLGkuZGF0YSl9fWUuX19tYXhNaXBMZXZlbD1NLmxlbmd0aC0xfWVsc2V7TT1vLm1pcG1hcHM7Zm9yKGxldCB0PTA7dDw2O3QrKylpZihsKXtuLnRleEltYWdlMkQoMzQwNjkrdCwwLGcsZFt0XS53aWR0aCxkW3RdLmhlaWdodCwwLHUsZixkW3RdLmRhdGEpO2ZvcihsZXQgZT0wO2U8TS5sZW5ndGg7ZSsrKXtjb25zdCBvPU1bZV0uaW1hZ2VbdF0uaW1hZ2U7bi50ZXhJbWFnZTJEKDM0MDY5K3QsZSsxLGcsby53aWR0aCxvLmhlaWdodCwwLHUsZixvLmRhdGEpfX1lbHNle24udGV4SW1hZ2UyRCgzNDA2OSt0LDAsZyx1LGYsZFt0XSk7Zm9yKGxldCBlPTA7ZTxNLmxlbmd0aDtlKyspbi50ZXhJbWFnZTJEKDM0MDY5K3QsZSsxLGcsdSxmLE1bZV0uaW1hZ2VbdF0pfWUuX19tYXhNaXBMZXZlbD1NLmxlbmd0aH15KG8sbSkmJl8oMzQwNjcsbyxwLndpZHRoLHAuaGVpZ2h0KSxlLl9fdmVyc2lvbj1vLnZlcnNpb24sby5vblVwZGF0ZSYmby5vblVwZGF0ZShvKX0pKHIsZSxpKToobi5hY3RpdmVUZXh0dXJlKDMzOTg0K2kpLG4uYmluZFRleHR1cmUoMzQwNjcsci5fX3dlYmdsVGV4dHVyZSkpfWNvbnN0IGs9e1t1aXRdOjEwNDk3LFtmaXRdOjMzMDcxLFtnaXRdOjMzNjQ4fSxTPXtbaGl0XTo5NzI4LDEwMDQ6OTk4NCwxMDA1Ojk5ODYsW2JpdF06OTcyOSwxMDA3Ojk5ODUsW3lpdF06OTk4N307ZnVuY3Rpb24gRChuLGEscil7aWYocj8odC50ZXhQYXJhbWV0ZXJpKG4sMTAyNDIsa1thLndyYXBTXSksdC50ZXhQYXJhbWV0ZXJpKG4sMTAyNDMsa1thLndyYXBUXSksMzI4NzkhPT1uJiYzNTg2NiE9PW58fHQudGV4UGFyYW1ldGVyaShuLDMyODgyLGtbYS53cmFwUl0pLHQudGV4UGFyYW1ldGVyaShuLDEwMjQwLFNbYS5tYWdGaWx0ZXJdKSx0LnRleFBhcmFtZXRlcmkobiwxMDI0MSxTW2EubWluRmlsdGVyXSkpOih0LnRleFBhcmFtZXRlcmkobiwxMDI0MiwzMzA3MSksdC50ZXhQYXJhbWV0ZXJpKG4sMTAyNDMsMzMwNzEpLDMyODc5IT09biYmMzU4NjYhPT1ufHx0LnRleFBhcmFtZXRlcmkobiwzMjg4MiwzMzA3MSksYS53cmFwUz09PWZpdCYmYS53cmFwVD09PWZpdHx8Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLiIpLHQudGV4UGFyYW1ldGVyaShuLDEwMjQwLE0oYS5tYWdGaWx0ZXIpKSx0LnRleFBhcmFtZXRlcmkobiwxMDI0MSxNKGEubWluRmlsdGVyKSksYS5taW5GaWx0ZXIhPT1oaXQmJmEubWluRmlsdGVyIT09Yml0JiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgaXMgbm90IHBvd2VyIG9mIHR3by4gVGV4dHVyZS5taW5GaWx0ZXIgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5OZWFyZXN0RmlsdGVyIG9yIFRIUkVFLkxpbmVhckZpbHRlci4iKSksITA9PT1lLmhhcygiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIikpe2NvbnN0IHI9ZS5nZXQoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpO2lmKGEudHlwZT09PXZpdCYmITE9PT1lLmhhcygiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIikpcmV0dXJuO2lmKCExPT09cyYmYS50eXBlPT09eGl0JiYhMT09PWUuaGFzKCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhciIpKXJldHVybjsoYS5hbmlzb3Ryb3B5PjF8fG8uZ2V0KGEpLl9fY3VycmVudEFuaXNvdHJvcHkpJiYodC50ZXhQYXJhbWV0ZXJmKG4sci5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCxNYXRoLm1pbihhLmFuaXNvdHJvcHksaS5nZXRNYXhBbmlzb3Ryb3B5KCkpKSxvLmdldChhKS5fX2N1cnJlbnRBbmlzb3Ryb3B5PWEuYW5pc290cm9weSl9fWZ1bmN0aW9uIEUoZSxuKXt2b2lkIDA9PT1lLl9fd2ViZ2xJbml0JiYoZS5fX3dlYmdsSW5pdD0hMCxuLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHYpLGUuX193ZWJnbFRleHR1cmU9dC5jcmVhdGVUZXh0dXJlKCksci5tZW1vcnkudGV4dHVyZXMrKyl9ZnVuY3Rpb24gUihlLG8saSl7bGV0IHI9MzU1MztvLmlzRGF0YVRleHR1cmUyREFycmF5JiYocj0zNTg2Niksby5pc0RhdGFUZXh0dXJlM0QmJihyPTMyODc5KSxFKGUsbyksbi5hY3RpdmVUZXh0dXJlKDMzOTg0K2kpLG4uYmluZFRleHR1cmUocixlLl9fd2ViZ2xUZXh0dXJlKSx0LnBpeGVsU3RvcmVpKDM3NDQwLG8uZmxpcFkpLHQucGl4ZWxTdG9yZWkoMzc0NDEsby5wcmVtdWx0aXBseUFscGhhKSx0LnBpeGVsU3RvcmVpKDMzMTcsby51bnBhY2tBbGlnbm1lbnQpLHQucGl4ZWxTdG9yZWkoMzc0NDMsMCk7Y29uc3QgbD0oZnVuY3Rpb24gYyh0KXtyZXR1cm4hcyYmKHQud3JhcFMhPT1maXR8fHQud3JhcFQhPT1maXR8fHQubWluRmlsdGVyIT09aGl0JiZ0Lm1pbkZpbHRlciE9PWJpdCl9KShvKSYmITE9PT1iKG8uaW1hZ2UpLHA9aChvLmltYWdlLGwsITEsZCksbT1iKHApfHxzLHU9YS5jb252ZXJ0KG8uZm9ybWF0KTtsZXQgZixnPWEuY29udmVydChvLnR5cGUpLE09QyhvLmludGVybmFsRm9ybWF0LHUsZyk7RChyLG8sbSk7Y29uc3Qgdj1vLm1pcG1hcHM7aWYoby5pc0RlcHRoVGV4dHVyZSlNPTY0MDIscz9NPW8udHlwZT09PXZpdD8zNjAxMjpvLnR5cGU9PT1NaXQ/MzMxOTA6by50eXBlPT09T2l0PzM1MDU2OjMzMTg5Om8udHlwZT09PXZpdCYmY29uc29sZS5lcnJvcigiV2ViR0xSZW5kZXJlcjogRmxvYXRpbmcgcG9pbnQgZGVwdGggdGV4dHVyZSByZXF1aXJlcyBXZWJHTDIuIiksby5mb3JtYXQ9PT1raXQmJjY0MDI9PT1NJiZvLnR5cGUhPT1DaXQmJm8udHlwZSE9PU1pdCYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVXNlIFVuc2lnbmVkU2hvcnRUeXBlIG9yIFVuc2lnbmVkSW50VHlwZSBmb3IgRGVwdGhGb3JtYXQgRGVwdGhUZXh0dXJlLiIpLG8udHlwZT1DaXQsZz1hLmNvbnZlcnQoby50eXBlKSksby5mb3JtYXQ9PT1TaXQmJjY0MDI9PT1NJiYoTT0zNDA0MSxvLnR5cGUhPT1PaXQmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERlcHRoU3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuIiksby50eXBlPU9pdCxnPWEuY29udmVydChvLnR5cGUpKSksbi50ZXhJbWFnZTJEKDM1NTMsMCxNLHAud2lkdGgscC5oZWlnaHQsMCx1LGcsbnVsbCk7ZWxzZSBpZihvLmlzRGF0YVRleHR1cmUpaWYodi5sZW5ndGg+MCYmbSl7Zm9yKGxldCB0PTAsZT12Lmxlbmd0aDt0PGU7dCsrKWY9dlt0XSxuLnRleEltYWdlMkQoMzU1Myx0LE0sZi53aWR0aCxmLmhlaWdodCwwLHUsZyxmLmRhdGEpO28uZ2VuZXJhdGVNaXBtYXBzPSExLGUuX19tYXhNaXBMZXZlbD12Lmxlbmd0aC0xfWVsc2Ugbi50ZXhJbWFnZTJEKDM1NTMsMCxNLHAud2lkdGgscC5oZWlnaHQsMCx1LGcscC5kYXRhKSxlLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKG8uaXNDb21wcmVzc2VkVGV4dHVyZSl7Zm9yKGxldCB0PTAsZT12Lmxlbmd0aDt0PGU7dCsrKWY9dlt0XSxvLmZvcm1hdCE9PXdpdCYmby5mb3JtYXQhPT1QaXQ/bnVsbCE9PXU/bi5jb21wcmVzc2VkVGV4SW1hZ2UyRCgzNTUzLHQsTSxmLndpZHRoLGYuaGVpZ2h0LDAsZi5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC51cGxvYWRUZXh0dXJlKCkiKTpuLnRleEltYWdlMkQoMzU1Myx0LE0sZi53aWR0aCxmLmhlaWdodCwwLHUsZyxmLmRhdGEpO2UuX19tYXhNaXBMZXZlbD12Lmxlbmd0aC0xfWVsc2UgaWYoby5pc0RhdGFUZXh0dXJlMkRBcnJheSluLnRleEltYWdlM0QoMzU4NjYsMCxNLHAud2lkdGgscC5oZWlnaHQscC5kZXB0aCwwLHUsZyxwLmRhdGEpLGUuX19tYXhNaXBMZXZlbD0wO2Vsc2UgaWYoby5pc0RhdGFUZXh0dXJlM0Qpbi50ZXhJbWFnZTNEKDMyODc5LDAsTSxwLndpZHRoLHAuaGVpZ2h0LHAuZGVwdGgsMCx1LGcscC5kYXRhKSxlLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKHYubGVuZ3RoPjAmJm0pe2ZvcihsZXQgdD0wLGU9di5sZW5ndGg7dDxlO3QrKylmPXZbdF0sbi50ZXhJbWFnZTJEKDM1NTMsdCxNLHUsZyxmKTtvLmdlbmVyYXRlTWlwbWFwcz0hMSxlLl9fbWF4TWlwTGV2ZWw9di5sZW5ndGgtMX1lbHNlIG4udGV4SW1hZ2UyRCgzNTUzLDAsTSx1LGcscCksZS5fX21heE1pcExldmVsPTA7eShvLG0pJiZfKHIsbyxwLndpZHRoLHAuaGVpZ2h0KSxlLl9fdmVyc2lvbj1vLnZlcnNpb24sby5vblVwZGF0ZSYmby5vblVwZGF0ZShvKX1mdW5jdGlvbiBBKGUsaSxyLHMsbCl7Y29uc3QgYz1hLmNvbnZlcnQoci5mb3JtYXQpLGQ9YS5jb252ZXJ0KHIudHlwZSkscD1DKHIuaW50ZXJuYWxGb3JtYXQsYyxkKTszMjg3OT09PWx8fDM1ODY2PT09bD9uLnRleEltYWdlM0QobCwwLHAsaS53aWR0aCxpLmhlaWdodCxpLmRlcHRoLDAsYyxkLG51bGwpOm4udGV4SW1hZ2UyRChsLDAscCxpLndpZHRoLGkuaGVpZ2h0LDAsYyxkLG51bGwpLG4uYmluZEZyYW1lYnVmZmVyKDM2MTYwLGUpLHQuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAscyxsLG8uZ2V0KHIpLl9fd2ViZ2xUZXh0dXJlLDApLG4uYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWZ1bmN0aW9uIFQoZSxuLG8pe2lmKHQuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxlKSxuLmRlcHRoQnVmZmVyJiYhbi5zdGVuY2lsQnVmZmVyKXtsZXQgaT0zMzE4OTtpZihvKXtjb25zdCBlPW4uZGVwdGhUZXh0dXJlO2UmJmUuaXNEZXB0aFRleHR1cmUmJihlLnR5cGU9PT12aXQ/aT0zNjAxMjplLnR5cGU9PT1NaXQmJihpPTMzMTkwKSk7Y29uc3Qgbz1OKG4pO3QucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLG8saSxuLndpZHRoLG4uaGVpZ2h0KX1lbHNlIHQucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSxpLG4ud2lkdGgsbi5oZWlnaHQpO3QuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoMzYxNjAsMzYwOTYsMzYxNjEsZSl9ZWxzZSBpZihuLmRlcHRoQnVmZmVyJiZuLnN0ZW5jaWxCdWZmZXIpe2lmKG8pe2NvbnN0IGU9TihuKTt0LnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSxlLDM1MDU2LG4ud2lkdGgsbi5oZWlnaHQpfWVsc2UgdC5yZW5kZXJidWZmZXJTdG9yYWdlKDM2MTYxLDM0MDQxLG4ud2lkdGgsbi5oZWlnaHQpO3QuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoMzYxNjAsMzMzMDYsMzYxNjEsZSl9ZWxzZXtjb25zdCBlPSEwPT09bi5pc1dlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzP24udGV4dHVyZVswXTpuLnRleHR1cmUsaT1hLmNvbnZlcnQoZS5mb3JtYXQpLHI9YS5jb252ZXJ0KGUudHlwZSkscz1DKGUuaW50ZXJuYWxGb3JtYXQsaSxyKTtpZihvKXtjb25zdCBlPU4obik7dC5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoMzYxNjEsZSxzLG4ud2lkdGgsbi5oZWlnaHQpfWVsc2UgdC5yZW5kZXJidWZmZXJTdG9yYWdlKDM2MTYxLHMsbi53aWR0aCxuLmhlaWdodCl9dC5iaW5kUmVuZGVyYnVmZmVyKDM2MTYxLG51bGwpfWZ1bmN0aW9uIE4odCl7cmV0dXJuIHMmJnQuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0P01hdGgubWluKHAsdC5zYW1wbGVzKTowfWxldCB6PSExLEk9ITE7dGhpcy5hbGxvY2F0ZVRleHR1cmVVbml0PWZ1bmN0aW9uIEgoKXtjb25zdCB0PU87cmV0dXJuIHQ+PWwmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlczogVHJ5aW5nIHRvIHVzZSAiK3QrIiB0ZXh0dXJlIHVuaXRzIHdoaWxlIHRoaXMgR1BVIHN1cHBvcnRzIG9ubHkgIitsKSxPKz0xLHR9LHRoaXMucmVzZXRUZXh0dXJlVW5pdHM9ZnVuY3Rpb24gRigpe089MH0sdGhpcy5zZXRUZXh0dXJlMkQ9UCx0aGlzLnNldFRleHR1cmUyREFycmF5PWZ1bmN0aW9uIEwodCxlKXtjb25zdCBpPW8uZ2V0KHQpO3QudmVyc2lvbj4wJiZpLl9fdmVyc2lvbiE9PXQudmVyc2lvbj9SKGksdCxlKToobi5hY3RpdmVUZXh0dXJlKDMzOTg0K2UpLG4uYmluZFRleHR1cmUoMzU4NjYsaS5fX3dlYmdsVGV4dHVyZSkpfSx0aGlzLnNldFRleHR1cmUzRD1mdW5jdGlvbiBCKHQsZSl7Y29uc3QgaT1vLmdldCh0KTt0LnZlcnNpb24+MCYmaS5fX3ZlcnNpb24hPT10LnZlcnNpb24/UihpLHQsZSk6KG4uYWN0aXZlVGV4dHVyZSgzMzk4NCtlKSxuLmJpbmRUZXh0dXJlKDMyODc5LGkuX193ZWJnbFRleHR1cmUpKX0sdGhpcy5zZXRUZXh0dXJlQ3ViZT13LHRoaXMuc2V0dXBSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24gVihlKXtjb25zdCBsPWUudGV4dHVyZSxjPW8uZ2V0KGUpLGQ9by5nZXQobCk7ZS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIix4KSwhMCE9PWUuaXNXZWJHTE11bHRpcGxlUmVuZGVyVGFyZ2V0cyYmKGQuX193ZWJnbFRleHR1cmU9dC5jcmVhdGVUZXh0dXJlKCksZC5fX3ZlcnNpb249bC52ZXJzaW9uLHIubWVtb3J5LnRleHR1cmVzKyspO2NvbnN0IHA9ITA9PT1lLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0LG09ITA9PT1lLmlzV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHMsdT0hMD09PWUuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0LGY9bC5pc0RhdGFUZXh0dXJlM0R8fGwuaXNEYXRhVGV4dHVyZTJEQXJyYXksZz1iKGUpfHxzO2lmKCFzfHxsLmZvcm1hdCE9PVBpdHx8bC50eXBlIT09dml0JiZsLnR5cGUhPT14aXR8fChsLmZvcm1hdD13aXQsY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBSZW5kZXJpbmcgdG8gdGV4dHVyZXMgd2l0aCBSR0IgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuIFVzaW5nIFJHQkEgZm9ybWF0IGluc3RlYWQuIikpLHApe2MuX193ZWJnbEZyYW1lYnVmZmVyPVtdO2ZvcihsZXQgZT0wO2U8NjtlKyspYy5fX3dlYmdsRnJhbWVidWZmZXJbZV09dC5jcmVhdGVGcmFtZWJ1ZmZlcigpfWVsc2UgaWYoYy5fX3dlYmdsRnJhbWVidWZmZXI9dC5jcmVhdGVGcmFtZWJ1ZmZlcigpLG0paWYoaS5kcmF3QnVmZmVycyl7Y29uc3Qgbj1lLnRleHR1cmU7Zm9yKGxldCBlPTAsaT1uLmxlbmd0aDtlPGk7ZSsrKXtjb25zdCBpPW8uZ2V0KG5bZV0pO3ZvaWQgMD09PWkuX193ZWJnbFRleHR1cmUmJihpLl9fd2ViZ2xUZXh0dXJlPXQuY3JlYXRlVGV4dHVyZSgpLHIubWVtb3J5LnRleHR1cmVzKyspfX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHMgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFdlYkdMMiBvciBXRUJHTF9kcmF3X2J1ZmZlcnMgZXh0ZW5zaW9uLiIpO2Vsc2UgaWYodSlpZihzKXtjLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcj10LmNyZWF0ZUZyYW1lYnVmZmVyKCksYy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXI9dC5jcmVhdGVSZW5kZXJidWZmZXIoKSx0LmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsYy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIpO2NvbnN0IG89YS5jb252ZXJ0KGwuZm9ybWF0KSxpPWEuY29udmVydChsLnR5cGUpLHI9QyhsLmludGVybmFsRm9ybWF0LG8saSkscz1OKGUpO3QucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLHMscixlLndpZHRoLGUuaGVpZ2h0KSxuLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxjLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciksdC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzNjA2NCwzNjE2MSxjLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlciksdC5iaW5kUmVuZGVyYnVmZmVyKDM2MTYxLG51bGwpLGUuZGVwdGhCdWZmZXImJihjLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcj10LmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLFQoYy5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIsZSwhMCkpLG4uYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIik7aWYocCl7bi5iaW5kVGV4dHVyZSgzNDA2NyxkLl9fd2ViZ2xUZXh0dXJlKSxEKDM0MDY3LGwsZyk7Zm9yKGxldCB0PTA7dDw2O3QrKylBKGMuX193ZWJnbEZyYW1lYnVmZmVyW3RdLGUsbCwzNjA2NCwzNDA2OSt0KTt5KGwsZykmJl8oMzQwNjcsbCxlLndpZHRoLGUuaGVpZ2h0KSxuLmJpbmRUZXh0dXJlKDM0MDY3LG51bGwpfWVsc2UgaWYobSl7Y29uc3QgdD1lLnRleHR1cmU7Zm9yKGxldCBpPTAsYT10Lmxlbmd0aDtpPGE7aSsrKXtjb25zdCBhPXRbaV0scj1vLmdldChhKTtuLmJpbmRUZXh0dXJlKDM1NTMsci5fX3dlYmdsVGV4dHVyZSksRCgzNTUzLGEsZyksQShjLl9fd2ViZ2xGcmFtZWJ1ZmZlcixlLGEsMzYwNjQraSwzNTUzKSx5KGEsZykmJl8oMzU1MyxhLGUud2lkdGgsZS5oZWlnaHQpfW4uYmluZFRleHR1cmUoMzU1MyxudWxsKX1lbHNle2xldCB0PTM1NTM7ZiYmKHM/dD1sLmlzRGF0YVRleHR1cmUzRD8zMjg3OTozNTg2Njpjb25zb2xlLndhcm4oIlRIUkVFLkRhdGFUZXh0dXJlM0QgYW5kIFRIUkVFLkRhdGFUZXh0dXJlMkRBcnJheSBvbmx5IHN1cHBvcnRlZCB3aXRoIFdlYkdMMi4iKSksbi5iaW5kVGV4dHVyZSh0LGQuX193ZWJnbFRleHR1cmUpLEQodCxsLGcpLEEoYy5fX3dlYmdsRnJhbWVidWZmZXIsZSxsLDM2MDY0LHQpLHkobCxnKSYmXyh0LGwsZS53aWR0aCxlLmhlaWdodCxlLmRlcHRoKSxuLmJpbmRUZXh0dXJlKHQsbnVsbCl9ZS5kZXB0aEJ1ZmZlciYmKGZ1bmN0aW9uIGgoZSl7Y29uc3QgaT1vLmdldChlKSxhPSEwPT09ZS5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldDtpZihlLmRlcHRoVGV4dHVyZSl7aWYoYSl0aHJvdyBuZXcgRXJyb3IoInRhcmdldC5kZXB0aFRleHR1cmUgbm90IHN1cHBvcnRlZCBpbiBDdWJlIHJlbmRlciB0YXJnZXRzIik7IShmdW5jdGlvbiByKGUsaSl7aWYoaSYmaS5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCl0aHJvdyBuZXcgRXJyb3IoIkRlcHRoIFRleHR1cmUgd2l0aCBjdWJlIHJlbmRlciB0YXJnZXRzIGlzIG5vdCBzdXBwb3J0ZWQiKTtpZihuLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxlKSwhaS5kZXB0aFRleHR1cmV8fCFpLmRlcHRoVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSl0aHJvdyBuZXcgRXJyb3IoInJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBUSFJFRS5EZXB0aFRleHR1cmUiKTtvLmdldChpLmRlcHRoVGV4dHVyZSkuX193ZWJnbFRleHR1cmUmJmkuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoPT09aS53aWR0aCYmaS5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0PT09aS5oZWlnaHR8fChpLmRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aD1pLndpZHRoLGkuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodD1pLmhlaWdodCxpLmRlcHRoVGV4dHVyZS5uZWVkc1VwZGF0ZT0hMCksUChpLmRlcHRoVGV4dHVyZSwwKTtjb25zdCBhPW8uZ2V0KGkuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZTtpZihpLmRlcHRoVGV4dHVyZS5mb3JtYXQ9PT1raXQpdC5mcmFtZWJ1ZmZlclRleHR1cmUyRCgzNjE2MCwzNjA5NiwzNTUzLGEsMCk7ZWxzZXtpZihpLmRlcHRoVGV4dHVyZS5mb3JtYXQhPT1TaXQpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGRlcHRoVGV4dHVyZSBmb3JtYXQiKTt0LmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDMzMzA2LDM1NTMsYSwwKX19KShpLl9fd2ViZ2xGcmFtZWJ1ZmZlcixlKX1lbHNlIGlmKGEpe2kuX193ZWJnbERlcHRoYnVmZmVyPVtdO2ZvcihsZXQgbz0wO288NjtvKyspbi5iaW5kRnJhbWVidWZmZXIoMzYxNjAsaS5fX3dlYmdsRnJhbWVidWZmZXJbb10pLGkuX193ZWJnbERlcHRoYnVmZmVyW29dPXQuY3JlYXRlUmVuZGVyYnVmZmVyKCksVChpLl9fd2ViZ2xEZXB0aGJ1ZmZlcltvXSxlLCExKX1lbHNlIG4uYmluZEZyYW1lYnVmZmVyKDM2MTYwLGkuX193ZWJnbEZyYW1lYnVmZmVyKSxpLl9fd2ViZ2xEZXB0aGJ1ZmZlcj10LmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLFQoaS5fX3dlYmdsRGVwdGhidWZmZXIsZSwhMSk7bi5iaW5kRnJhbWVidWZmZXIoMzYxNjAsbnVsbCl9KShlKX0sdGhpcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA9ZnVuY3Rpb24gaih0KXtjb25zdCBlPWIodCl8fHMsaT0hMD09PXQuaXNXZWJHTE11bHRpcGxlUmVuZGVyVGFyZ2V0cz90LnRleHR1cmU6W3QudGV4dHVyZV07Zm9yKGxldCBhPTAscj1pLmxlbmd0aDthPHI7YSsrKXtjb25zdCByPWlbYV07aWYoeShyLGUpKXtjb25zdCBlPXQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQ/MzQwNjc6MzU1MyxpPW8uZ2V0KHIpLl9fd2ViZ2xUZXh0dXJlO24uYmluZFRleHR1cmUoZSxpKSxfKGUscix0LndpZHRoLHQuaGVpZ2h0KSxuLmJpbmRUZXh0dXJlKGUsbnVsbCl9fX0sdGhpcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldD1mdW5jdGlvbiBVKGUpe2lmKGUuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KWlmKHMpe2NvbnN0IGk9ZS53aWR0aCxhPWUuaGVpZ2h0O2xldCByPTE2Mzg0O2UuZGVwdGhCdWZmZXImJihyfD0yNTYpLGUuc3RlbmNpbEJ1ZmZlciYmKHJ8PTEwMjQpO2NvbnN0IHM9by5nZXQoZSk7bi5iaW5kRnJhbWVidWZmZXIoMzYwMDgscy5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIpLG4uYmluZEZyYW1lYnVmZmVyKDM2MDA5LHMuX193ZWJnbEZyYW1lYnVmZmVyKSx0LmJsaXRGcmFtZWJ1ZmZlcigwLDAsaSxhLDAsMCxpLGEsciw5NzI4KSxuLmJpbmRGcmFtZWJ1ZmZlcigzNjAwOCxudWxsKSxuLmJpbmRGcmFtZWJ1ZmZlcigzNjAwOSxzLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcil9ZWxzZSBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFdlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFdlYkdMMi4iKX0sdGhpcy5zYWZlU2V0VGV4dHVyZTJEPWZ1bmN0aW9uIEcodCxlKXt0JiZ0LmlzV2ViR0xSZW5kZXJUYXJnZXQmJighMT09PXomJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMVGV4dHVyZXMuc2FmZVNldFRleHR1cmUyRDogZG9uJ3QgdXNlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC4iKSx6PSEwKSx0PXQudGV4dHVyZSksUCh0LGUpfSx0aGlzLnNhZmVTZXRUZXh0dXJlQ3ViZT1mdW5jdGlvbiBXKHQsZSl7dCYmdC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCYmKCExPT09SSYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlcy5zYWZlU2V0VGV4dHVyZUN1YmU6IGRvbid0IHVzZSBjdWJlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC4iKSxJPSEwKSx0PXQudGV4dHVyZSksdyh0LGUpfX1mdW5jdGlvbiBkZHQodCxlLG4pe2NvbnN0IG89bi5pc1dlYkdMMjtyZXR1cm57Y29udmVydDpmdW5jdGlvbiBpKHQpe2xldCBuO2lmKHQ9PT1faXQpcmV0dXJuIDUxMjE7aWYoMTAxNz09PXQpcmV0dXJuIDMyODE5O2lmKDEwMTg9PT10KXJldHVybiAzMjgyMDtpZigxMDE5PT09dClyZXR1cm4gMzM2MzU7aWYoMTAxMD09PXQpcmV0dXJuIDUxMjA7aWYoMTAxMT09PXQpcmV0dXJuIDUxMjI7aWYodD09PUNpdClyZXR1cm4gNTEyMztpZigxMDEzPT09dClyZXR1cm4gNTEyNDtpZih0PT09TWl0KXJldHVybiA1MTI1O2lmKHQ9PT12aXQpcmV0dXJuIDUxMjY7aWYodD09PXhpdClyZXR1cm4gbz81MTMxOihuPWUuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IiksbnVsbCE9PW4/bi5IQUxGX0ZMT0FUX09FUzpudWxsKTtpZigxMDIxPT09dClyZXR1cm4gNjQwNjtpZih0PT09UGl0KXJldHVybiA2NDA3O2lmKHQ9PT13aXQpcmV0dXJuIDY0MDg7aWYoMTAyND09PXQpcmV0dXJuIDY0MDk7aWYoMTAyNT09PXQpcmV0dXJuIDY0MTA7aWYodD09PWtpdClyZXR1cm4gNjQwMjtpZih0PT09U2l0KXJldHVybiAzNDA0MTtpZigxMDI4PT09dClyZXR1cm4gNjQwMztpZigxMDI5PT09dClyZXR1cm4gMzYyNDQ7aWYoMTAzMD09PXQpcmV0dXJuIDMzMzE5O2lmKDEwMzE9PT10KXJldHVybiAzMzMyMDtpZigxMDMyPT09dClyZXR1cm4gMzYyNDg7aWYoMTAzMz09PXQpcmV0dXJuIDM2MjQ5O2lmKDMzNzc2PT09dHx8MzM3Nzc9PT10fHwzMzc3OD09PXR8fDMzNzc5PT09dCl7aWYobj1lLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKSxudWxsPT09bilyZXR1cm4gbnVsbDtpZigzMzc3Nj09PXQpcmV0dXJuIG4uQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVDtpZigzMzc3Nz09PXQpcmV0dXJuIG4uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ7aWYoMzM3Nzg9PT10KXJldHVybiBuLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUO2lmKDMzNzc5PT09dClyZXR1cm4gbi5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVH1pZigzNTg0MD09PXR8fDM1ODQxPT09dHx8MzU4NDI9PT10fHwzNTg0Mz09PXQpe2lmKG49ZS5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpLG51bGw9PT1uKXJldHVybiBudWxsO2lmKDM1ODQwPT09dClyZXR1cm4gbi5DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HO2lmKDM1ODQxPT09dClyZXR1cm4gbi5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HO2lmKDM1ODQyPT09dClyZXR1cm4gbi5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRztpZigzNTg0Mz09PXQpcmV0dXJuIG4uQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUd9aWYoMzYxOTY9PT10KXJldHVybiBuPWUuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMSIpLG51bGwhPT1uP24uQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTDpudWxsO2lmKCgzNzQ5Mj09PXR8fDM3NDk2PT09dCkmJihuPWUuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjIiksbnVsbCE9PW4pKXtpZigzNzQ5Mj09PXQpcmV0dXJuIG4uQ09NUFJFU1NFRF9SR0I4X0VUQzI7aWYoMzc0OTY9PT10KXJldHVybiBuLkNPTVBSRVNTRURfUkdCQThfRVRDMl9FQUN9cmV0dXJuIDM3ODA4PT09dHx8Mzc4MDk9PT10fHwzNzgxMD09PXR8fDM3ODExPT09dHx8Mzc4MTI9PT10fHwzNzgxMz09PXR8fDM3ODE0PT09dHx8Mzc4MTU9PT10fHwzNzgxNj09PXR8fDM3ODE3PT09dHx8Mzc4MTg9PT10fHwzNzgxOT09PXR8fDM3ODIwPT09dHx8Mzc4MjE9PT10fHwzNzg0MD09PXR8fDM3ODQxPT09dHx8Mzc4NDI9PT10fHwzNzg0Mz09PXR8fDM3ODQ0PT09dHx8Mzc4NDU9PT10fHwzNzg0Nj09PXR8fDM3ODQ3PT09dHx8Mzc4NDg9PT10fHwzNzg0OT09PXR8fDM3ODUwPT09dHx8Mzc4NTE9PT10fHwzNzg1Mj09PXR8fDM3ODUzPT09dD8obj1lLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiKSxudWxsIT09bj90Om51bGwpOjM2NDkyPT09dD8obj1lLmdldCgiRVhUX3RleHR1cmVfY29tcHJlc3Npb25fYnB0YyIpLG51bGwhPT1uP3Q6bnVsbCk6dD09PU9pdD9vPzM0MDQyOihuPWUuZ2V0KCJXRUJHTF9kZXB0aF90ZXh0dXJlIiksbnVsbCE9PW4/bi5VTlNJR05FRF9JTlRfMjRfOF9XRUJHTDpudWxsKTp2b2lkIDB9fX1yZHQucHJvdG90eXBlLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWw9ITA7Y2xhc3MgcGR0IGV4dGVuZHMgX3N0e2NvbnN0cnVjdG9yKHQ9W10pe3N1cGVyKCksdGhpcy5jYW1lcmFzPXR9fXBkdC5wcm90b3R5cGUuaXNBcnJheUNhbWVyYT0hMDtjbGFzcyBtZHQgZXh0ZW5kcyBwcnR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudHlwZT0iR3JvdXAifX1tZHQucHJvdG90eXBlLmlzR3JvdXA9ITA7Y29uc3QgdWR0PXt0eXBlOiJtb3ZlIn07Y2xhc3MgZmR0e2NvbnN0cnVjdG9yKCl7dGhpcy5fdGFyZ2V0UmF5PW51bGwsdGhpcy5fZ3JpcD1udWxsLHRoaXMuX2hhbmQ9bnVsbH1nZXRIYW5kU3BhY2UoKXtyZXR1cm4gbnVsbD09PXRoaXMuX2hhbmQmJih0aGlzLl9oYW5kPW5ldyBtZHQsdGhpcy5faGFuZC5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuX2hhbmQudmlzaWJsZT0hMSx0aGlzLl9oYW5kLmpvaW50cz17fSx0aGlzLl9oYW5kLmlucHV0U3RhdGU9e3BpbmNoaW5nOiExfSksdGhpcy5faGFuZH1nZXRUYXJnZXRSYXlTcGFjZSgpe3JldHVybiBudWxsPT09dGhpcy5fdGFyZ2V0UmF5JiYodGhpcy5fdGFyZ2V0UmF5PW5ldyBtZHQsdGhpcy5fdGFyZ2V0UmF5Lm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5fdGFyZ2V0UmF5LnZpc2libGU9ITEsdGhpcy5fdGFyZ2V0UmF5Lmhhc0xpbmVhclZlbG9jaXR5PSExLHRoaXMuX3RhcmdldFJheS5saW5lYXJWZWxvY2l0eT1uZXcgY2F0LHRoaXMuX3RhcmdldFJheS5oYXNBbmd1bGFyVmVsb2NpdHk9ITEsdGhpcy5fdGFyZ2V0UmF5LmFuZ3VsYXJWZWxvY2l0eT1uZXcgY2F0KSx0aGlzLl90YXJnZXRSYXl9Z2V0R3JpcFNwYWNlKCl7cmV0dXJuIG51bGw9PT10aGlzLl9ncmlwJiYodGhpcy5fZ3JpcD1uZXcgbWR0LHRoaXMuX2dyaXAubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLl9ncmlwLnZpc2libGU9ITEsdGhpcy5fZ3JpcC5oYXNMaW5lYXJWZWxvY2l0eT0hMSx0aGlzLl9ncmlwLmxpbmVhclZlbG9jaXR5PW5ldyBjYXQsdGhpcy5fZ3JpcC5oYXNBbmd1bGFyVmVsb2NpdHk9ITEsdGhpcy5fZ3JpcC5hbmd1bGFyVmVsb2NpdHk9bmV3IGNhdCksdGhpcy5fZ3JpcH1kaXNwYXRjaEV2ZW50KHQpe3JldHVybiBudWxsIT09dGhpcy5fdGFyZ2V0UmF5JiZ0aGlzLl90YXJnZXRSYXkuZGlzcGF0Y2hFdmVudCh0KSxudWxsIT09dGhpcy5fZ3JpcCYmdGhpcy5fZ3JpcC5kaXNwYXRjaEV2ZW50KHQpLG51bGwhPT10aGlzLl9oYW5kJiZ0aGlzLl9oYW5kLmRpc3BhdGNoRXZlbnQodCksdGhpc31kaXNjb25uZWN0KHQpe3JldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc2Nvbm5lY3RlZCIsZGF0YTp0fSksbnVsbCE9PXRoaXMuX3RhcmdldFJheSYmKHRoaXMuX3RhcmdldFJheS52aXNpYmxlPSExKSxudWxsIT09dGhpcy5fZ3JpcCYmKHRoaXMuX2dyaXAudmlzaWJsZT0hMSksbnVsbCE9PXRoaXMuX2hhbmQmJih0aGlzLl9oYW5kLnZpc2libGU9ITEpLHRoaXN9dXBkYXRlKHQsZSxuKXtsZXQgbz1udWxsLGk9bnVsbCxhPW51bGw7Y29uc3Qgcj10aGlzLl90YXJnZXRSYXkscz10aGlzLl9ncmlwLGw9dGhpcy5faGFuZDtpZih0JiYidmlzaWJsZS1ibHVycmVkIiE9PWUuc2Vzc2lvbi52aXNpYmlsaXR5U3RhdGUpaWYobnVsbCE9PXImJihvPWUuZ2V0UG9zZSh0LnRhcmdldFJheVNwYWNlLG4pLG51bGwhPT1vJiYoci5tYXRyaXguZnJvbUFycmF5KG8udHJhbnNmb3JtLm1hdHJpeCksci5tYXRyaXguZGVjb21wb3NlKHIucG9zaXRpb24sci5yb3RhdGlvbixyLnNjYWxlKSxvLmxpbmVhclZlbG9jaXR5PyhyLmhhc0xpbmVhclZlbG9jaXR5PSEwLHIubGluZWFyVmVsb2NpdHkuY29weShvLmxpbmVhclZlbG9jaXR5KSk6ci5oYXNMaW5lYXJWZWxvY2l0eT0hMSxvLmFuZ3VsYXJWZWxvY2l0eT8oci5oYXNBbmd1bGFyVmVsb2NpdHk9ITAsci5hbmd1bGFyVmVsb2NpdHkuY29weShvLmFuZ3VsYXJWZWxvY2l0eSkpOnIuaGFzQW5ndWxhclZlbG9jaXR5PSExLHRoaXMuZGlzcGF0Y2hFdmVudCh1ZHQpKSksbCYmdC5oYW5kKXthPSEwO2Zvcihjb25zdCBvIG9mIHQuaGFuZC52YWx1ZXMoKSl7Y29uc3QgdD1lLmdldEpvaW50UG9zZShvLG4pO2lmKHZvaWQgMD09PWwuam9pbnRzW28uam9pbnROYW1lXSl7Y29uc3QgdD1uZXcgbWR0O3QubWF0cml4QXV0b1VwZGF0ZT0hMSx0LnZpc2libGU9ITEsbC5qb2ludHNbby5qb2ludE5hbWVdPXQsbC5hZGQodCl9Y29uc3QgaT1sLmpvaW50c1tvLmpvaW50TmFtZV07bnVsbCE9PXQmJihpLm1hdHJpeC5mcm9tQXJyYXkodC50cmFuc2Zvcm0ubWF0cml4KSxpLm1hdHJpeC5kZWNvbXBvc2UoaS5wb3NpdGlvbixpLnJvdGF0aW9uLGkuc2NhbGUpLGkuam9pbnRSYWRpdXM9dC5yYWRpdXMpLGkudmlzaWJsZT1udWxsIT09dH1jb25zdCBvPWwuam9pbnRzWyJpbmRleC1maW5nZXItdGlwIl0ucG9zaXRpb24uZGlzdGFuY2VUbyhsLmpvaW50c1sidGh1bWItdGlwIl0ucG9zaXRpb24pLGk9LjAyLHI9LjAwNTtsLmlucHV0U3RhdGUucGluY2hpbmcmJm8+aStyPyhsLmlucHV0U3RhdGUucGluY2hpbmc9ITEsdGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJwaW5jaGVuZCIsaGFuZGVkbmVzczp0LmhhbmRlZG5lc3MsdGFyZ2V0OnRoaXN9KSk6IWwuaW5wdXRTdGF0ZS5waW5jaGluZyYmbzw9aS1yJiYobC5pbnB1dFN0YXRlLnBpbmNoaW5nPSEwLHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToicGluY2hzdGFydCIsaGFuZGVkbmVzczp0LmhhbmRlZG5lc3MsdGFyZ2V0OnRoaXN9KSl9ZWxzZSBudWxsIT09cyYmdC5ncmlwU3BhY2UmJihpPWUuZ2V0UG9zZSh0LmdyaXBTcGFjZSxuKSxudWxsIT09aSYmKHMubWF0cml4LmZyb21BcnJheShpLnRyYW5zZm9ybS5tYXRyaXgpLHMubWF0cml4LmRlY29tcG9zZShzLnBvc2l0aW9uLHMucm90YXRpb24scy5zY2FsZSksaS5saW5lYXJWZWxvY2l0eT8ocy5oYXNMaW5lYXJWZWxvY2l0eT0hMCxzLmxpbmVhclZlbG9jaXR5LmNvcHkoaS5saW5lYXJWZWxvY2l0eSkpOnMuaGFzTGluZWFyVmVsb2NpdHk9ITEsaS5hbmd1bGFyVmVsb2NpdHk/KHMuaGFzQW5ndWxhclZlbG9jaXR5PSEwLHMuYW5ndWxhclZlbG9jaXR5LmNvcHkoaS5hbmd1bGFyVmVsb2NpdHkpKTpzLmhhc0FuZ3VsYXJWZWxvY2l0eT0hMSkpO3JldHVybiBudWxsIT09ciYmKHIudmlzaWJsZT1udWxsIT09byksbnVsbCE9PXMmJihzLnZpc2libGU9bnVsbCE9PWkpLG51bGwhPT1sJiYobC52aXNpYmxlPW51bGwhPT1hKSx0aGlzfX1jbGFzcyBnZHQgZXh0ZW5kcyBVaXR7Y29uc3RydWN0b3IodCxlKXtzdXBlcigpO2NvbnN0IG49dGhpcyxvPXQuc3RhdGU7bGV0IGk9bnVsbCxhPTEscj1udWxsLHM9ImxvY2FsLWZsb29yIixsPW51bGwsYz1udWxsLGQ9bnVsbCxwPW51bGwsbT1udWxsO2NvbnN0IHU9W10sZj1uZXcgTWFwLGc9bmV3IF9zdDtnLmxheWVycy5lbmFibGUoMSksZy52aWV3cG9ydD1uZXcgYWF0O2NvbnN0IGg9bmV3IF9zdDtoLmxheWVycy5lbmFibGUoMiksaC52aWV3cG9ydD1uZXcgYWF0O2NvbnN0IGI9W2csaF0seT1uZXcgcGR0O3kubGF5ZXJzLmVuYWJsZSgxKSx5LmxheWVycy5lbmFibGUoMik7bGV0IF89bnVsbCxDPW51bGw7ZnVuY3Rpb24gTSh0KXtjb25zdCBlPWYuZ2V0KHQuaW5wdXRTb3VyY2UpO2UmJmUuZGlzcGF0Y2hFdmVudCh7dHlwZTp0LnR5cGUsZGF0YTp0LmlucHV0U291cmNlfSl9ZnVuY3Rpb24gdigpe2YuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt0LmRpc2Nvbm5lY3QoZSl9KSksZi5jbGVhcigpLF89bnVsbCxDPW51bGwsby5iaW5kWFJGcmFtZWJ1ZmZlcihudWxsKSx0LnNldFJlbmRlclRhcmdldCh0LmdldFJlbmRlclRhcmdldCgpKSxTLnN0b3AoKSxuLmlzUHJlc2VudGluZz0hMSxuLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9ZnVuY3Rpb24geCh0KXtjb25zdCBlPWkuaW5wdXRTb3VyY2VzO2ZvcihsZXQgdD0wO3Q8dS5sZW5ndGg7dCsrKWYuc2V0KGVbdF0sdVt0XSk7Zm9yKGxldCBlPTA7ZTx0LnJlbW92ZWQubGVuZ3RoO2UrKyl7Y29uc3Qgbj10LnJlbW92ZWRbZV0sbz1mLmdldChuKTtvJiYoby5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNjb25uZWN0ZWQiLGRhdGE6bn0pLGYuZGVsZXRlKG4pKX1mb3IobGV0IGU9MDtlPHQuYWRkZWQubGVuZ3RoO2UrKyl7Y29uc3Qgbj10LmFkZGVkW2VdLG89Zi5nZXQobik7byYmby5kaXNwYXRjaEV2ZW50KHt0eXBlOiJjb25uZWN0ZWQiLGRhdGE6bn0pfX10aGlzLmNhbWVyYUF1dG9VcGRhdGU9ITAsdGhpcy5lbmFibGVkPSExLHRoaXMuaXNQcmVzZW50aW5nPSExLHRoaXMuZ2V0Q29udHJvbGxlcj1mdW5jdGlvbih0KXtsZXQgZT11W3RdO3JldHVybiB2b2lkIDA9PT1lJiYoZT1uZXcgZmR0LHVbdF09ZSksZS5nZXRUYXJnZXRSYXlTcGFjZSgpfSx0aGlzLmdldENvbnRyb2xsZXJHcmlwPWZ1bmN0aW9uKHQpe2xldCBlPXVbdF07cmV0dXJuIHZvaWQgMD09PWUmJihlPW5ldyBmZHQsdVt0XT1lKSxlLmdldEdyaXBTcGFjZSgpfSx0aGlzLmdldEhhbmQ9ZnVuY3Rpb24odCl7bGV0IGU9dVt0XTtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9bmV3IGZkdCx1W3RdPWUpLGUuZ2V0SGFuZFNwYWNlKCl9LHRoaXMuc2V0RnJhbWVidWZmZXJTY2FsZUZhY3Rvcj1mdW5jdGlvbih0KXthPXQsITA9PT1uLmlzUHJlc2VudGluZyYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IENhbm5vdCBjaGFuZ2UgZnJhbWVidWZmZXIgc2NhbGUgd2hpbGUgcHJlc2VudGluZy4iKX0sdGhpcy5zZXRSZWZlcmVuY2VTcGFjZVR5cGU9ZnVuY3Rpb24odCl7cz10LCEwPT09bi5pc1ByZXNlbnRpbmcmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViWFJNYW5hZ2VyOiBDYW5ub3QgY2hhbmdlIHJlZmVyZW5jZSBzcGFjZSB0eXBlIHdoaWxlIHByZXNlbnRpbmcuIil9LHRoaXMuZ2V0UmVmZXJlbmNlU3BhY2U9ZnVuY3Rpb24oKXtyZXR1cm4gcn0sdGhpcy5nZXRTZXNzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGl9LHRoaXMuc2V0U2Vzc2lvbj1hc3luYyBmdW5jdGlvbih0KXtpZihpPXQsbnVsbCE9PWkpe2kuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0IixNKSxpLmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdHN0YXJ0IixNKSxpLmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGVuZCIsTSksaS5hZGRFdmVudExpc3RlbmVyKCJzcXVlZXplIixNKSxpLmFkZEV2ZW50TGlzdGVuZXIoInNxdWVlemVzdGFydCIsTSksaS5hZGRFdmVudExpc3RlbmVyKCJzcXVlZXplZW5kIixNKSxpLmFkZEV2ZW50TGlzdGVuZXIoImVuZCIsdiksaS5hZGRFdmVudExpc3RlbmVyKCJpbnB1dHNvdXJjZXNjaGFuZ2UiLHgpO2NvbnN0IHQ9ZS5nZXRDb250ZXh0QXR0cmlidXRlcygpO2lmKCEwIT09dC54ckNvbXBhdGlibGUmJmF3YWl0IGUubWFrZVhSQ29tcGF0aWJsZSgpLHZvaWQgMD09PWkucmVuZGVyU3RhdGUubGF5ZXJzKW09bmV3IFhSV2ViR0xMYXllcihpLGUse2FudGlhbGlhczp0LmFudGlhbGlhcyxhbHBoYTp0LmFscGhhLGRlcHRoOnQuZGVwdGgsc3RlbmNpbDp0LnN0ZW5jaWwsZnJhbWVidWZmZXJTY2FsZUZhY3RvcjphfSksaS51cGRhdGVSZW5kZXJTdGF0ZSh7YmFzZUxheWVyOm19KTtlbHNle2xldCBuPTA7aWYodC5hbnRpYWxpYXMpbT1uZXcgWFJXZWJHTExheWVyKGksZSx7YW50aWFsaWFzOiEwLGFscGhhOnQuYWxwaGEsZGVwdGg6dC5kZXB0aCxzdGVuY2lsOnQuc3RlbmNpbCxmcmFtZWJ1ZmZlclNjYWxlRmFjdG9yOmF9KSxpLnVwZGF0ZVJlbmRlclN0YXRlKHtsYXllcnM6W21dfSk7ZWxzZXt0LmRlcHRoJiYobj10LnN0ZW5jaWw/MzQwNDE6NjQwMik7Y29uc3Qgbz17Y29sb3JGb3JtYXQ6dC5hbHBoYT82NDA4OjY0MDcsZGVwdGhGb3JtYXQ6bixzY2FsZUZhY3RvcjphfTtjPW5ldyBYUldlYkdMQmluZGluZyhpLGUpLHA9Yy5jcmVhdGVQcm9qZWN0aW9uTGF5ZXIobyksZD1lLmNyZWF0ZUZyYW1lYnVmZmVyKCksaS51cGRhdGVSZW5kZXJTdGF0ZSh7bGF5ZXJzOltwXX0pfX1yPWF3YWl0IGkucmVxdWVzdFJlZmVyZW5jZVNwYWNlKHMpLFMuc2V0Q29udGV4dChpKSxTLnN0YXJ0KCksbi5pc1ByZXNlbnRpbmc9ITAsbi5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZXNzaW9uc3RhcnQifSl9fTtjb25zdCBPPW5ldyBjYXQsUD1uZXcgY2F0O2Z1bmN0aW9uIHcodCxlKXtudWxsPT09ZT90Lm1hdHJpeFdvcmxkLmNvcHkodC5tYXRyaXgpOnQubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyhlLm1hdHJpeFdvcmxkLHQubWF0cml4KSx0Lm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KHQubWF0cml4V29ybGQpLmludmVydCgpfXRoaXMudXBkYXRlQ2FtZXJhPWZ1bmN0aW9uKHQpe2lmKG51bGw9PT1pKXJldHVybjt5Lm5lYXI9aC5uZWFyPWcubmVhcj10Lm5lYXIseS5mYXI9aC5mYXI9Zy5mYXI9dC5mYXIsXz09PXkubmVhciYmQz09PXkuZmFyfHwoaS51cGRhdGVSZW5kZXJTdGF0ZSh7ZGVwdGhOZWFyOnkubmVhcixkZXB0aEZhcjp5LmZhcn0pLF89eS5uZWFyLEM9eS5mYXIpO2NvbnN0IGU9dC5wYXJlbnQsbj15LmNhbWVyYXM7dyh5LGUpO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKXcoblt0XSxlKTt5Lm1hdHJpeFdvcmxkLmRlY29tcG9zZSh5LnBvc2l0aW9uLHkucXVhdGVybmlvbix5LnNjYWxlKSx0LnBvc2l0aW9uLmNvcHkoeS5wb3NpdGlvbiksdC5xdWF0ZXJuaW9uLmNvcHkoeS5xdWF0ZXJuaW9uKSx0LnNjYWxlLmNvcHkoeS5zY2FsZSksdC5tYXRyaXguY29weSh5Lm1hdHJpeCksdC5tYXRyaXhXb3JsZC5jb3B5KHkubWF0cml4V29ybGQpO2NvbnN0IG89dC5jaGlsZHJlbjtmb3IobGV0IHQ9MCxlPW8ubGVuZ3RoO3Q8ZTt0Kyspb1t0XS51cGRhdGVNYXRyaXhXb3JsZCghMCk7Mj09PW4ubGVuZ3RoPyhmdW5jdGlvbiBhKHQsZSxuKXtPLnNldEZyb21NYXRyaXhQb3NpdGlvbihlLm1hdHJpeFdvcmxkKSxQLnNldEZyb21NYXRyaXhQb3NpdGlvbihuLm1hdHJpeFdvcmxkKTtjb25zdCBvPU8uZGlzdGFuY2VUbyhQKSxpPWUucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50cyxhPW4ucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50cyxyPWlbMTRdLyhpWzEwXS0xKSxzPWlbMTRdLyhpWzEwXSsxKSxsPShpWzldKzEpL2lbNV0sYz0oaVs5XS0xKS9pWzVdLGQ9KGlbOF0tMSkvaVswXSxwPShhWzhdKzEpL2FbMF0sbT1yKmQsdT1yKnAsZj1vLygtZCtwKSxnPWYqLWQ7ZS5tYXRyaXhXb3JsZC5kZWNvbXBvc2UodC5wb3NpdGlvbix0LnF1YXRlcm5pb24sdC5zY2FsZSksdC50cmFuc2xhdGVYKGcpLHQudHJhbnNsYXRlWihmKSx0Lm1hdHJpeFdvcmxkLmNvbXBvc2UodC5wb3NpdGlvbix0LnF1YXRlcm5pb24sdC5zY2FsZSksdC5tYXRyaXhXb3JsZEludmVyc2UuY29weSh0Lm1hdHJpeFdvcmxkKS5pbnZlcnQoKTtjb25zdCBoPXIrZixiPXMrZjt0LnByb2plY3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKG0tZyx1KyhvLWcpLGwqcy9iKmgsYypzL2IqaCxoLGIpfSkoeSxnLGgpOnkucHJvamVjdGlvbk1hdHJpeC5jb3B5KGcucHJvamVjdGlvbk1hdHJpeCl9LHRoaXMuZ2V0Q2FtZXJhPWZ1bmN0aW9uKCl7cmV0dXJuIHl9LHRoaXMuZ2V0Rm92ZWF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT1wP3AuZml4ZWRGb3ZlYXRpb246bnVsbCE9PW0/bS5maXhlZEZvdmVhdGlvbjp2b2lkIDB9LHRoaXMuc2V0Rm92ZWF0aW9uPWZ1bmN0aW9uKHQpe251bGwhPT1wJiYocC5maXhlZEZvdmVhdGlvbj10KSxudWxsIT09bSYmdm9pZCAwIT09bS5maXhlZEZvdmVhdGlvbiYmKG0uZml4ZWRGb3ZlYXRpb249dCl9O2xldCBrPW51bGw7Y29uc3QgUz1uZXcgUnN0O1Muc2V0QW5pbWF0aW9uTG9vcCgoZnVuY3Rpb24gRCh0LG4pe2lmKGw9bi5nZXRWaWV3ZXJQb3NlKHIpLG51bGwhPT1sKXtjb25zdCB0PWwudmlld3M7bnVsbCE9PW0mJm8uYmluZFhSRnJhbWVidWZmZXIobS5mcmFtZWJ1ZmZlcik7bGV0IG49ITE7dC5sZW5ndGghPT15LmNhbWVyYXMubGVuZ3RoJiYoeS5jYW1lcmFzLmxlbmd0aD0wLG49ITApO2ZvcihsZXQgaT0wO2k8dC5sZW5ndGg7aSsrKXtjb25zdCBhPXRbaV07bGV0IHI9bnVsbDtpZihudWxsIT09bSlyPW0uZ2V0Vmlld3BvcnQoYSk7ZWxzZXtjb25zdCB0PWMuZ2V0Vmlld1N1YkltYWdlKHAsYSk7by5iaW5kWFJGcmFtZWJ1ZmZlcihkKSx2b2lkIDAhPT10LmRlcHRoU3RlbmNpbFRleHR1cmUmJmUuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsMzYwOTYsMzU1Myx0LmRlcHRoU3RlbmNpbFRleHR1cmUsMCksZS5mcmFtZWJ1ZmZlclRleHR1cmUyRCgzNjE2MCwzNjA2NCwzNTUzLHQuY29sb3JUZXh0dXJlLDApLHI9dC52aWV3cG9ydH1jb25zdCBzPWJbaV07cy5tYXRyaXguZnJvbUFycmF5KGEudHJhbnNmb3JtLm1hdHJpeCkscy5wcm9qZWN0aW9uTWF0cml4LmZyb21BcnJheShhLnByb2plY3Rpb25NYXRyaXgpLHMudmlld3BvcnQuc2V0KHIueCxyLnksci53aWR0aCxyLmhlaWdodCksMD09PWkmJnkubWF0cml4LmNvcHkocy5tYXRyaXgpLCEwPT09biYmeS5jYW1lcmFzLnB1c2gocyl9fWNvbnN0IGE9aS5pbnB1dFNvdXJjZXM7Zm9yKGxldCB0PTA7dDx1Lmxlbmd0aDt0KyspdVt0XS51cGRhdGUoYVt0XSxuLHIpO2smJmsodCxuKX0pKSx0aGlzLnNldEFuaW1hdGlvbkxvb3A9ZnVuY3Rpb24odCl7az10fSx0aGlzLmRpc3Bvc2U9ZnVuY3Rpb24oKXt9fX1mdW5jdGlvbiBoZHQodCl7ZnVuY3Rpb24gZShlLG4pe2Uub3BhY2l0eS52YWx1ZT1uLm9wYWNpdHksbi5jb2xvciYmZS5kaWZmdXNlLnZhbHVlLmNvcHkobi5jb2xvciksbi5lbWlzc2l2ZSYmZS5lbWlzc2l2ZS52YWx1ZS5jb3B5KG4uZW1pc3NpdmUpLm11bHRpcGx5U2NhbGFyKG4uZW1pc3NpdmVJbnRlbnNpdHkpLG4ubWFwJiYoZS5tYXAudmFsdWU9bi5tYXApLG4uYWxwaGFNYXAmJihlLmFscGhhTWFwLnZhbHVlPW4uYWxwaGFNYXApLG4uc3BlY3VsYXJNYXAmJihlLnNwZWN1bGFyTWFwLnZhbHVlPW4uc3BlY3VsYXJNYXApO2NvbnN0IG89dC5nZXQobikuZW52TWFwO2lmKG8pe2UuZW52TWFwLnZhbHVlPW8sZS5mbGlwRW52TWFwLnZhbHVlPW8uaXNDdWJlVGV4dHVyZSYmITE9PT1vLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT8tMToxLGUucmVmbGVjdGl2aXR5LnZhbHVlPW4ucmVmbGVjdGl2aXR5LGUucmVmcmFjdGlvblJhdGlvLnZhbHVlPW4ucmVmcmFjdGlvblJhdGlvO2NvbnN0IGk9dC5nZXQobykuX19tYXhNaXBMZXZlbDt2b2lkIDAhPT1pJiYoZS5tYXhNaXBMZXZlbC52YWx1ZT1pKX1sZXQgaSxhO24ubGlnaHRNYXAmJihlLmxpZ2h0TWFwLnZhbHVlPW4ubGlnaHRNYXAsZS5saWdodE1hcEludGVuc2l0eS52YWx1ZT1uLmxpZ2h0TWFwSW50ZW5zaXR5KSxuLmFvTWFwJiYoZS5hb01hcC52YWx1ZT1uLmFvTWFwLGUuYW9NYXBJbnRlbnNpdHkudmFsdWU9bi5hb01hcEludGVuc2l0eSksbi5tYXA/aT1uLm1hcDpuLnNwZWN1bGFyTWFwP2k9bi5zcGVjdWxhck1hcDpuLmRpc3BsYWNlbWVudE1hcD9pPW4uZGlzcGxhY2VtZW50TWFwOm4ubm9ybWFsTWFwP2k9bi5ub3JtYWxNYXA6bi5idW1wTWFwP2k9bi5idW1wTWFwOm4ucm91Z2huZXNzTWFwP2k9bi5yb3VnaG5lc3NNYXA6bi5tZXRhbG5lc3NNYXA/aT1uLm1ldGFsbmVzc01hcDpuLmFscGhhTWFwP2k9bi5hbHBoYU1hcDpuLmVtaXNzaXZlTWFwP2k9bi5lbWlzc2l2ZU1hcDpuLmNsZWFyY29hdE1hcD9pPW4uY2xlYXJjb2F0TWFwOm4uY2xlYXJjb2F0Tm9ybWFsTWFwP2k9bi5jbGVhcmNvYXROb3JtYWxNYXA6bi5jbGVhcmNvYXRSb3VnaG5lc3NNYXA/aT1uLmNsZWFyY29hdFJvdWdobmVzc01hcDpuLnNwZWN1bGFySW50ZW5zaXR5TWFwP2k9bi5zcGVjdWxhckludGVuc2l0eU1hcDpuLnNwZWN1bGFyVGludE1hcCYmKGk9bi5zcGVjdWxhclRpbnRNYXApLHZvaWQgMCE9PWkmJihpLmlzV2ViR0xSZW5kZXJUYXJnZXQmJihpPWkudGV4dHVyZSksITA9PT1pLm1hdHJpeEF1dG9VcGRhdGUmJmkudXBkYXRlTWF0cml4KCksZS51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KGkubWF0cml4KSksbi5hb01hcD9hPW4uYW9NYXA6bi5saWdodE1hcCYmKGE9bi5saWdodE1hcCksdm9pZCAwIT09YSYmKGEuaXNXZWJHTFJlbmRlclRhcmdldCYmKGE9YS50ZXh0dXJlKSwhMD09PWEubWF0cml4QXV0b1VwZGF0ZSYmYS51cGRhdGVNYXRyaXgoKSxlLnV2MlRyYW5zZm9ybS52YWx1ZS5jb3B5KGEubWF0cml4KSl9ZnVuY3Rpb24gbihlLG4pe2Uucm91Z2huZXNzLnZhbHVlPW4ucm91Z2huZXNzLGUubWV0YWxuZXNzLnZhbHVlPW4ubWV0YWxuZXNzLG4ucm91Z2huZXNzTWFwJiYoZS5yb3VnaG5lc3NNYXAudmFsdWU9bi5yb3VnaG5lc3NNYXApLG4ubWV0YWxuZXNzTWFwJiYoZS5tZXRhbG5lc3NNYXAudmFsdWU9bi5tZXRhbG5lc3NNYXApLG4uZW1pc3NpdmVNYXAmJihlLmVtaXNzaXZlTWFwLnZhbHVlPW4uZW1pc3NpdmVNYXApLG4uYnVtcE1hcCYmKGUuYnVtcE1hcC52YWx1ZT1uLmJ1bXBNYXAsZS5idW1wU2NhbGUudmFsdWU9bi5idW1wU2NhbGUsMT09PW4uc2lkZSYmKGUuYnVtcFNjYWxlLnZhbHVlKj0tMSkpLG4ubm9ybWFsTWFwJiYoZS5ub3JtYWxNYXAudmFsdWU9bi5ub3JtYWxNYXAsZS5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KG4ubm9ybWFsU2NhbGUpLDE9PT1uLnNpZGUmJmUubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpLG4uZGlzcGxhY2VtZW50TWFwJiYoZS5kaXNwbGFjZW1lbnRNYXAudmFsdWU9bi5kaXNwbGFjZW1lbnRNYXAsZS5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1uLmRpc3BsYWNlbWVudFNjYWxlLGUuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1uLmRpc3BsYWNlbWVudEJpYXMpLHQuZ2V0KG4pLmVudk1hcCYmKGUuZW52TWFwSW50ZW5zaXR5LnZhbHVlPW4uZW52TWFwSW50ZW5zaXR5KX1yZXR1cm57cmVmcmVzaEZvZ1VuaWZvcm1zOmZ1bmN0aW9uIG8odCxlKXt0LmZvZ0NvbG9yLnZhbHVlLmNvcHkoZS5jb2xvciksZS5pc0ZvZz8odC5mb2dOZWFyLnZhbHVlPWUubmVhcix0LmZvZ0Zhci52YWx1ZT1lLmZhcik6ZS5pc0ZvZ0V4cDImJih0LmZvZ0RlbnNpdHkudmFsdWU9ZS5kZW5zaXR5KX0scmVmcmVzaE1hdGVyaWFsVW5pZm9ybXM6ZnVuY3Rpb24gaSh0LG8sYSxyLHMpe28uaXNNZXNoQmFzaWNNYXRlcmlhbD9lKHQsbyk6by5pc01lc2hMYW1iZXJ0TWF0ZXJpYWw/KGUodCxvKSwoZnVuY3Rpb24gbCh0LGUpe2UuZW1pc3NpdmVNYXAmJih0LmVtaXNzaXZlTWFwLnZhbHVlPWUuZW1pc3NpdmVNYXApfSkodCxvKSk6by5pc01lc2hUb29uTWF0ZXJpYWw/KGUodCxvKSwoZnVuY3Rpb24gYyh0LGUpe2UuZ3JhZGllbnRNYXAmJih0LmdyYWRpZW50TWFwLnZhbHVlPWUuZ3JhZGllbnRNYXApLGUuZW1pc3NpdmVNYXAmJih0LmVtaXNzaXZlTWFwLnZhbHVlPWUuZW1pc3NpdmVNYXApLGUuYnVtcE1hcCYmKHQuYnVtcE1hcC52YWx1ZT1lLmJ1bXBNYXAsdC5idW1wU2NhbGUudmFsdWU9ZS5idW1wU2NhbGUsMT09PWUuc2lkZSYmKHQuYnVtcFNjYWxlLnZhbHVlKj0tMSkpLGUubm9ybWFsTWFwJiYodC5ub3JtYWxNYXAudmFsdWU9ZS5ub3JtYWxNYXAsdC5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KGUubm9ybWFsU2NhbGUpLDE9PT1lLnNpZGUmJnQubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpLGUuZGlzcGxhY2VtZW50TWFwJiYodC5kaXNwbGFjZW1lbnRNYXAudmFsdWU9ZS5kaXNwbGFjZW1lbnRNYXAsdC5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1lLmRpc3BsYWNlbWVudFNjYWxlLHQuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1lLmRpc3BsYWNlbWVudEJpYXMpfSkodCxvKSk6by5pc01lc2hQaG9uZ01hdGVyaWFsPyhlKHQsbyksKGZ1bmN0aW9uIGQodCxlKXt0LnNwZWN1bGFyLnZhbHVlLmNvcHkoZS5zcGVjdWxhciksdC5zaGluaW5lc3MudmFsdWU9TWF0aC5tYXgoZS5zaGluaW5lc3MsMWUtNCksZS5lbWlzc2l2ZU1hcCYmKHQuZW1pc3NpdmVNYXAudmFsdWU9ZS5lbWlzc2l2ZU1hcCksZS5idW1wTWFwJiYodC5idW1wTWFwLnZhbHVlPWUuYnVtcE1hcCx0LmJ1bXBTY2FsZS52YWx1ZT1lLmJ1bXBTY2FsZSwxPT09ZS5zaWRlJiYodC5idW1wU2NhbGUudmFsdWUqPS0xKSksZS5ub3JtYWxNYXAmJih0Lm5vcm1hbE1hcC52YWx1ZT1lLm5vcm1hbE1hcCx0Lm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoZS5ub3JtYWxTY2FsZSksMT09PWUuc2lkZSYmdC5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKSksZS5kaXNwbGFjZW1lbnRNYXAmJih0LmRpc3BsYWNlbWVudE1hcC52YWx1ZT1lLmRpc3BsYWNlbWVudE1hcCx0LmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWUuZGlzcGxhY2VtZW50U2NhbGUsdC5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPWUuZGlzcGxhY2VtZW50Qmlhcyl9KSh0LG8pKTpvLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw/KGUodCxvKSxvLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWw/KGZ1bmN0aW9uIHAodCxlLG8pe24odCxlKSx0LnJlZmxlY3Rpdml0eS52YWx1ZT1lLnJlZmxlY3Rpdml0eSx0LmNsZWFyY29hdC52YWx1ZT1lLmNsZWFyY29hdCx0LmNsZWFyY29hdFJvdWdobmVzcy52YWx1ZT1lLmNsZWFyY29hdFJvdWdobmVzcyxlLnNoZWVuJiZ0LnNoZWVuLnZhbHVlLmNvcHkoZS5zaGVlbiksZS5jbGVhcmNvYXRNYXAmJih0LmNsZWFyY29hdE1hcC52YWx1ZT1lLmNsZWFyY29hdE1hcCksZS5jbGVhcmNvYXRSb3VnaG5lc3NNYXAmJih0LmNsZWFyY29hdFJvdWdobmVzc01hcC52YWx1ZT1lLmNsZWFyY29hdFJvdWdobmVzc01hcCksZS5jbGVhcmNvYXROb3JtYWxNYXAmJih0LmNsZWFyY29hdE5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoZS5jbGVhcmNvYXROb3JtYWxTY2FsZSksdC5jbGVhcmNvYXROb3JtYWxNYXAudmFsdWU9ZS5jbGVhcmNvYXROb3JtYWxNYXAsMT09PWUuc2lkZSYmdC5jbGVhcmNvYXROb3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKSksdC50cmFuc21pc3Npb24udmFsdWU9ZS50cmFuc21pc3Npb24sZS50cmFuc21pc3Npb25NYXAmJih0LnRyYW5zbWlzc2lvbk1hcC52YWx1ZT1lLnRyYW5zbWlzc2lvbk1hcCksZS50cmFuc21pc3Npb24+MCYmKHQudHJhbnNtaXNzaW9uU2FtcGxlck1hcC52YWx1ZT1vLnRleHR1cmUsdC50cmFuc21pc3Npb25TYW1wbGVyU2l6ZS52YWx1ZS5zZXQoby53aWR0aCxvLmhlaWdodCkpLHQudGhpY2tuZXNzLnZhbHVlPWUudGhpY2tuZXNzLGUudGhpY2tuZXNzTWFwJiYodC50aGlja25lc3NNYXAudmFsdWU9ZS50aGlja25lc3NNYXApLHQuYXR0ZW51YXRpb25EaXN0YW5jZS52YWx1ZT1lLmF0dGVudWF0aW9uRGlzdGFuY2UsdC5hdHRlbnVhdGlvblRpbnQudmFsdWUuY29weShlLmF0dGVudWF0aW9uVGludCksdC5zcGVjdWxhckludGVuc2l0eS52YWx1ZT1lLnNwZWN1bGFySW50ZW5zaXR5LHQuc3BlY3VsYXJUaW50LnZhbHVlLmNvcHkoZS5zcGVjdWxhclRpbnQpLGUuc3BlY3VsYXJJbnRlbnNpdHlNYXAmJih0LnNwZWN1bGFySW50ZW5zaXR5TWFwLnZhbHVlPWUuc3BlY3VsYXJJbnRlbnNpdHlNYXApLGUuc3BlY3VsYXJUaW50TWFwJiYodC5zcGVjdWxhclRpbnRNYXAudmFsdWU9ZS5zcGVjdWxhclRpbnRNYXApfSkodCxvLHMpOm4odCxvKSk6by5pc01lc2hNYXRjYXBNYXRlcmlhbD8oZSh0LG8pLChmdW5jdGlvbiBtKHQsZSl7ZS5tYXRjYXAmJih0Lm1hdGNhcC52YWx1ZT1lLm1hdGNhcCksZS5idW1wTWFwJiYodC5idW1wTWFwLnZhbHVlPWUuYnVtcE1hcCx0LmJ1bXBTY2FsZS52YWx1ZT1lLmJ1bXBTY2FsZSwxPT09ZS5zaWRlJiYodC5idW1wU2NhbGUudmFsdWUqPS0xKSksZS5ub3JtYWxNYXAmJih0Lm5vcm1hbE1hcC52YWx1ZT1lLm5vcm1hbE1hcCx0Lm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoZS5ub3JtYWxTY2FsZSksMT09PWUuc2lkZSYmdC5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKSksZS5kaXNwbGFjZW1lbnRNYXAmJih0LmRpc3BsYWNlbWVudE1hcC52YWx1ZT1lLmRpc3BsYWNlbWVudE1hcCx0LmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWUuZGlzcGxhY2VtZW50U2NhbGUsdC5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPWUuZGlzcGxhY2VtZW50Qmlhcyl9KSh0LG8pKTpvLmlzTWVzaERlcHRoTWF0ZXJpYWw/KGUodCxvKSwoZnVuY3Rpb24gdSh0LGUpe2UuZGlzcGxhY2VtZW50TWFwJiYodC5kaXNwbGFjZW1lbnRNYXAudmFsdWU9ZS5kaXNwbGFjZW1lbnRNYXAsdC5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1lLmRpc3BsYWNlbWVudFNjYWxlLHQuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1lLmRpc3BsYWNlbWVudEJpYXMpfSkodCxvKSk6by5pc01lc2hEaXN0YW5jZU1hdGVyaWFsPyhlKHQsbyksKGZ1bmN0aW9uIGYodCxlKXtlLmRpc3BsYWNlbWVudE1hcCYmKHQuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWUuZGlzcGxhY2VtZW50TWFwLHQuZGlzcGxhY2VtZW50U2NhbGUudmFsdWU9ZS5kaXNwbGFjZW1lbnRTY2FsZSx0LmRpc3BsYWNlbWVudEJpYXMudmFsdWU9ZS5kaXNwbGFjZW1lbnRCaWFzKSx0LnJlZmVyZW5jZVBvc2l0aW9uLnZhbHVlLmNvcHkoZS5yZWZlcmVuY2VQb3NpdGlvbiksdC5uZWFyRGlzdGFuY2UudmFsdWU9ZS5uZWFyRGlzdGFuY2UsdC5mYXJEaXN0YW5jZS52YWx1ZT1lLmZhckRpc3RhbmNlfSkodCxvKSk6by5pc01lc2hOb3JtYWxNYXRlcmlhbD8oZSh0LG8pLChmdW5jdGlvbiBnKHQsZSl7ZS5idW1wTWFwJiYodC5idW1wTWFwLnZhbHVlPWUuYnVtcE1hcCx0LmJ1bXBTY2FsZS52YWx1ZT1lLmJ1bXBTY2FsZSwxPT09ZS5zaWRlJiYodC5idW1wU2NhbGUudmFsdWUqPS0xKSksZS5ub3JtYWxNYXAmJih0Lm5vcm1hbE1hcC52YWx1ZT1lLm5vcm1hbE1hcCx0Lm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoZS5ub3JtYWxTY2FsZSksMT09PWUuc2lkZSYmdC5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKSksZS5kaXNwbGFjZW1lbnRNYXAmJih0LmRpc3BsYWNlbWVudE1hcC52YWx1ZT1lLmRpc3BsYWNlbWVudE1hcCx0LmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWUuZGlzcGxhY2VtZW50U2NhbGUsdC5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPWUuZGlzcGxhY2VtZW50Qmlhcyl9KSh0LG8pKTpvLmlzTGluZUJhc2ljTWF0ZXJpYWw/KChmdW5jdGlvbiBoKHQsZSl7dC5kaWZmdXNlLnZhbHVlLmNvcHkoZS5jb2xvciksdC5vcGFjaXR5LnZhbHVlPWUub3BhY2l0eX0pKHQsbyksby5pc0xpbmVEYXNoZWRNYXRlcmlhbCYmKGZ1bmN0aW9uIGIodCxlKXt0LmRhc2hTaXplLnZhbHVlPWUuZGFzaFNpemUsdC50b3RhbFNpemUudmFsdWU9ZS5kYXNoU2l6ZStlLmdhcFNpemUsdC5zY2FsZS52YWx1ZT1lLnNjYWxlfSkodCxvKSk6by5pc1BvaW50c01hdGVyaWFsPyhmdW5jdGlvbiB5KHQsZSxuLG8pe2xldCBpO3QuZGlmZnVzZS52YWx1ZS5jb3B5KGUuY29sb3IpLHQub3BhY2l0eS52YWx1ZT1lLm9wYWNpdHksdC5zaXplLnZhbHVlPWUuc2l6ZSpuLHQuc2NhbGUudmFsdWU9LjUqbyxlLm1hcCYmKHQubWFwLnZhbHVlPWUubWFwKSxlLmFscGhhTWFwJiYodC5hbHBoYU1hcC52YWx1ZT1lLmFscGhhTWFwKSxlLm1hcD9pPWUubWFwOmUuYWxwaGFNYXAmJihpPWUuYWxwaGFNYXApLHZvaWQgMCE9PWkmJighMD09PWkubWF0cml4QXV0b1VwZGF0ZSYmaS51cGRhdGVNYXRyaXgoKSx0LnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoaS5tYXRyaXgpKX0pKHQsbyxhLHIpOm8uaXNTcHJpdGVNYXRlcmlhbD8oZnVuY3Rpb24gXyh0LGUpe2xldCBuO3QuZGlmZnVzZS52YWx1ZS5jb3B5KGUuY29sb3IpLHQub3BhY2l0eS52YWx1ZT1lLm9wYWNpdHksdC5yb3RhdGlvbi52YWx1ZT1lLnJvdGF0aW9uLGUubWFwJiYodC5tYXAudmFsdWU9ZS5tYXApLGUuYWxwaGFNYXAmJih0LmFscGhhTWFwLnZhbHVlPWUuYWxwaGFNYXApLGUubWFwP249ZS5tYXA6ZS5hbHBoYU1hcCYmKG49ZS5hbHBoYU1hcCksdm9pZCAwIT09biYmKCEwPT09bi5tYXRyaXhBdXRvVXBkYXRlJiZuLnVwZGF0ZU1hdHJpeCgpLHQudXZUcmFuc2Zvcm0udmFsdWUuY29weShuLm1hdHJpeCkpfSkodCxvKTpvLmlzU2hhZG93TWF0ZXJpYWw/KHQuY29sb3IudmFsdWUuY29weShvLmNvbG9yKSx0Lm9wYWNpdHkudmFsdWU9by5vcGFjaXR5KTpvLmlzU2hhZGVyTWF0ZXJpYWwmJihvLnVuaWZvcm1zTmVlZFVwZGF0ZT0hMSl9fX1mdW5jdGlvbiBiZHQodD17fSl7Y29uc3QgZT12b2lkIDAhPT10LmNhbnZhcz90LmNhbnZhczooZnVuY3Rpb24gbigpe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiY2FudmFzIik7cmV0dXJuIHQuc3R5bGUuZGlzcGxheT0iYmxvY2siLHR9KSgpLG89dm9pZCAwIT09dC5jb250ZXh0P3QuY29udGV4dDpudWxsLGk9dm9pZCAwIT09dC5hbHBoYSYmdC5hbHBoYSxhPXZvaWQgMD09PXQuZGVwdGh8fHQuZGVwdGgscj12b2lkIDA9PT10LnN0ZW5jaWx8fHQuc3RlbmNpbCxzPXZvaWQgMCE9PXQuYW50aWFsaWFzJiZ0LmFudGlhbGlhcyxsPXZvaWQgMD09PXQucHJlbXVsdGlwbGllZEFscGhhfHx0LnByZW11bHRpcGxpZWRBbHBoYSxjPXZvaWQgMCE9PXQucHJlc2VydmVEcmF3aW5nQnVmZmVyJiZ0LnByZXNlcnZlRHJhd2luZ0J1ZmZlcixkPXZvaWQgMCE9PXQucG93ZXJQcmVmZXJlbmNlP3QucG93ZXJQcmVmZXJlbmNlOiJkZWZhdWx0IixwPXZvaWQgMCE9PXQuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCYmdC5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0O2xldCBtPW51bGwsdT1udWxsO2NvbnN0IGY9W10sZz1bXTt0aGlzLmRvbUVsZW1lbnQ9ZSx0aGlzLmRlYnVnPXtjaGVja1NoYWRlckVycm9yczohMH0sdGhpcy5hdXRvQ2xlYXI9ITAsdGhpcy5hdXRvQ2xlYXJDb2xvcj0hMCx0aGlzLmF1dG9DbGVhckRlcHRoPSEwLHRoaXMuYXV0b0NsZWFyU3RlbmNpbD0hMCx0aGlzLnNvcnRPYmplY3RzPSEwLHRoaXMuY2xpcHBpbmdQbGFuZXM9W10sdGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZD0hMSx0aGlzLmdhbW1hRmFjdG9yPTIsdGhpcy5vdXRwdXRFbmNvZGluZz16aXQsdGhpcy5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cz0hMSx0aGlzLnRvbmVNYXBwaW5nPTAsdGhpcy50b25lTWFwcGluZ0V4cG9zdXJlPTE7Y29uc3QgaD10aGlzO2xldCBiPSExLHk9MCxfPTAsQz1udWxsLE09LTEsdj1udWxsO2NvbnN0IHg9bmV3IGFhdCxPPW5ldyBhYXQ7bGV0IFA9bnVsbCx3PWUud2lkdGgsaz1lLmhlaWdodCxTPTEsRD1udWxsLEU9bnVsbDtjb25zdCBSPW5ldyBhYXQoMCwwLHcsayksQT1uZXcgYWF0KDAsMCx3LGspO2xldCBUPSExO2NvbnN0IE49W10sej1uZXcgRXN0O2xldCBJPSExLEg9ITEsRj1udWxsO2NvbnN0IEw9bmV3IEJhdCxCPW5ldyBjYXQsVj17YmFja2dyb3VuZDpudWxsLGZvZzpudWxsLGVudmlyb25tZW50Om51bGwsb3ZlcnJpZGVNYXRlcmlhbDpudWxsLGlzU2NlbmU6ITB9O2Z1bmN0aW9uIGooKXtyZXR1cm4gbnVsbD09PUM/UzoxfWxldCBVLEcsVyxZLHEsWixYLEssSixRLCQsdHQsZXQsbnQsb3QsaXQsYXQscnQsc3QsbHQsY3QsZHQscHQsbXQ9bztmdW5jdGlvbiB1dCh0LG4pe2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtjb25zdCBpPWUuZ2V0Q29udGV4dCh0W29dLG4pO2lmKG51bGwhPT1pKXJldHVybiBpfXJldHVybiBudWxsfXRyeXtjb25zdCB0PXthbHBoYTppLGRlcHRoOmEsc3RlbmNpbDpyLGFudGlhbGlhczpzLHByZW11bHRpcGxpZWRBbHBoYTpsLHByZXNlcnZlRHJhd2luZ0J1ZmZlcjpjLHBvd2VyUHJlZmVyZW5jZTpkLGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6cH07aWYoZS5hZGRFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRsb3N0IixodCwhMSksZS5hZGRFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRyZXN0b3JlZCIsYnQsITEpLG51bGw9PT1tdCl7Y29uc3QgZT1bIndlYmdsMiIsIndlYmdsIiwiZXhwZXJpbWVudGFsLXdlYmdsIl07aWYoITA9PT1oLmlzV2ViR0wxUmVuZGVyZXImJmUuc2hpZnQoKSxtdD11dChlLHQpLG51bGw9PT1tdCl0aHJvdyB1dChlKT9uZXcgRXJyb3IoIkVycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQgd2l0aCB5b3VyIHNlbGVjdGVkIGF0dHJpYnV0ZXMuIik6bmV3IEVycm9yKCJFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0LiIpfXZvaWQgMD09PW10LmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCYmKG10LmdldFNoYWRlclByZWNpc2lvbkZvcm1hdD1mdW5jdGlvbigpe3JldHVybntyYW5nZU1pbjoxLHJhbmdlTWF4OjEscHJlY2lzaW9uOjF9fSl9Y2F0Y2godCl7dGhyb3cgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlcjogIit0Lm1lc3NhZ2UpLHR9ZnVuY3Rpb24gZnQoKXtVPW5ldyBnbHQobXQpLEc9bmV3IEJzdChtdCxVLHQpLFUuaW5pdChHKSxkdD1uZXcgZGR0KG10LFUsRyksVz1uZXcgbGR0KG10LFUsRyksTlswXT0xMDI5LFk9bmV3IHlsdChtdCkscT1uZXcgWmN0LFo9bmV3IGNkdChtdCxVLFcscSxHLGR0LFkpLFg9bmV3IGpzdChoKSxLPW5ldyBmbHQoaCksSj1uZXcgQXN0KG10LEcpLHB0PW5ldyBGc3QobXQsVSxKLEcpLFE9bmV3IGhsdChtdCxKLFkscHQpLCQ9bmV3IHZsdChtdCxRLEosWSksc3Q9bmV3IE1sdChtdCksaXQ9bmV3IFZzdChxKSx0dD1uZXcgcWN0KGgsWCxLLFUsRyxwdCxpdCksZXQ9bmV3IGhkdChxKSxudD1uZXcgUWN0KHEpLG90PW5ldyBpZHQoVSxHKSxydD1uZXcgSHN0KGgsWCxXLCQsbCksYXQ9bmV3IHNkdChoLCQsRyksbHQ9bmV3IExzdChtdCxVLFksRyksY3Q9bmV3IGJsdChtdCxVLFksRyksWS5wcm9ncmFtcz10dC5wcm9ncmFtcyxoLmNhcGFiaWxpdGllcz1HLGguZXh0ZW5zaW9ucz1VLGgucHJvcGVydGllcz1xLGgucmVuZGVyTGlzdHM9bnQsaC5zaGFkb3dNYXA9YXQsaC5zdGF0ZT1XLGguaW5mbz1ZfWZ0KCk7Y29uc3QgZ3Q9bmV3IGdkdChoLG10KTtmdW5jdGlvbiBodCh0KXt0LnByZXZlbnREZWZhdWx0KCksY29uc29sZS5sb2coIlRIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgTG9zdC4iKSxiPSEwfWZ1bmN0aW9uIGJ0KCl7Y29uc29sZS5sb2coIlRIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgUmVzdG9yZWQuIiksYj0hMTtjb25zdCB0PVkuYXV0b1Jlc2V0LGU9YXQuZW5hYmxlZCxuPWF0LmF1dG9VcGRhdGUsbz1hdC5uZWVkc1VwZGF0ZSxpPWF0LnR5cGU7ZnQoKSxZLmF1dG9SZXNldD10LGF0LmVuYWJsZWQ9ZSxhdC5hdXRvVXBkYXRlPW4sYXQubmVlZHNVcGRhdGU9byxhdC50eXBlPWl9ZnVuY3Rpb24geXQodCl7Y29uc3QgZT10LnRhcmdldDtlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHl0KSwoZnVuY3Rpb24gbih0KXsoZnVuY3Rpb24gZSh0KXtjb25zdCBlPXEuZ2V0KHQpLnByb2dyYW1zO3ZvaWQgMCE9PWUmJmUuZm9yRWFjaCgoZnVuY3Rpb24odCl7dHQucmVsZWFzZVByb2dyYW0odCl9KSl9KSh0KSxxLnJlbW92ZSh0KX0pKGUpfXRoaXMueHI9Z3QsdGhpcy5nZXRDb250ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIG10fSx0aGlzLmdldENvbnRleHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7cmV0dXJuIG10LmdldENvbnRleHRBdHRyaWJ1dGVzKCl9LHRoaXMuZm9yY2VDb250ZXh0TG9zcz1mdW5jdGlvbigpe2NvbnN0IHQ9VS5nZXQoIldFQkdMX2xvc2VfY29udGV4dCIpO3QmJnQubG9zZUNvbnRleHQoKX0sdGhpcy5mb3JjZUNvbnRleHRSZXN0b3JlPWZ1bmN0aW9uKCl7Y29uc3QgdD1VLmdldCgiV0VCR0xfbG9zZV9jb250ZXh0Iik7dCYmdC5yZXN0b3JlQ29udGV4dCgpfSx0aGlzLmdldFBpeGVsUmF0aW89ZnVuY3Rpb24oKXtyZXR1cm4gU30sdGhpcy5zZXRQaXhlbFJhdGlvPWZ1bmN0aW9uKHQpe3ZvaWQgMCE9PXQmJihTPXQsdGhpcy5zZXRTaXplKHcsaywhMSkpfSx0aGlzLmdldFNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIHQuc2V0KHcsayl9LHRoaXMuc2V0U2l6ZT1mdW5jdGlvbih0LG4sbyl7Z3QuaXNQcmVzZW50aW5nP2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogQ2FuJ3QgY2hhbmdlIHNpemUgd2hpbGUgVlIgZGV2aWNlIGlzIHByZXNlbnRpbmcuIik6KHc9dCxrPW4sZS53aWR0aD1NYXRoLmZsb29yKHQqUyksZS5oZWlnaHQ9TWF0aC5mbG9vcihuKlMpLCExIT09byYmKGUuc3R5bGUud2lkdGg9dCsicHgiLGUuc3R5bGUuaGVpZ2h0PW4rInB4IiksdGhpcy5zZXRWaWV3cG9ydCgwLDAsdCxuKSl9LHRoaXMuZ2V0RHJhd2luZ0J1ZmZlclNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIHQuc2V0KHcqUyxrKlMpLmZsb29yKCl9LHRoaXMuc2V0RHJhd2luZ0J1ZmZlclNpemU9ZnVuY3Rpb24odCxuLG8pe3c9dCxrPW4sUz1vLGUud2lkdGg9TWF0aC5mbG9vcih0Km8pLGUuaGVpZ2h0PU1hdGguZmxvb3IobipvKSx0aGlzLnNldFZpZXdwb3J0KDAsMCx0LG4pfSx0aGlzLmdldEN1cnJlbnRWaWV3cG9ydD1mdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KHgpfSx0aGlzLmdldFZpZXdwb3J0PWZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoUil9LHRoaXMuc2V0Vmlld3BvcnQ9ZnVuY3Rpb24odCxlLG4sbyl7dC5pc1ZlY3RvcjQ/Ui5zZXQodC54LHQueSx0LnosdC53KTpSLnNldCh0LGUsbixvKSxXLnZpZXdwb3J0KHguY29weShSKS5tdWx0aXBseVNjYWxhcihTKS5mbG9vcigpKX0sdGhpcy5nZXRTY2lzc29yPWZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoQSl9LHRoaXMuc2V0U2Npc3Nvcj1mdW5jdGlvbih0LGUsbixvKXt0LmlzVmVjdG9yND9BLnNldCh0LngsdC55LHQueix0LncpOkEuc2V0KHQsZSxuLG8pLFcuc2Npc3NvcihPLmNvcHkoQSkubXVsdGlwbHlTY2FsYXIoUykuZmxvb3IoKSl9LHRoaXMuZ2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gVH0sdGhpcy5zZXRTY2lzc29yVGVzdD1mdW5jdGlvbih0KXtXLnNldFNjaXNzb3JUZXN0KFQ9dCl9LHRoaXMuc2V0T3BhcXVlU29ydD1mdW5jdGlvbih0KXtEPXR9LHRoaXMuc2V0VHJhbnNwYXJlbnRTb3J0PWZ1bmN0aW9uKHQpe0U9dH0sdGhpcy5nZXRDbGVhckNvbG9yPWZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkocnQuZ2V0Q2xlYXJDb2xvcigpKX0sdGhpcy5zZXRDbGVhckNvbG9yPWZ1bmN0aW9uKCl7cnQuc2V0Q2xlYXJDb2xvci5hcHBseShydCxhcmd1bWVudHMpfSx0aGlzLmdldENsZWFyQWxwaGE9ZnVuY3Rpb24oKXtyZXR1cm4gcnQuZ2V0Q2xlYXJBbHBoYSgpfSx0aGlzLnNldENsZWFyQWxwaGE9ZnVuY3Rpb24oKXtydC5zZXRDbGVhckFscGhhLmFwcGx5KHJ0LGFyZ3VtZW50cyl9LHRoaXMuY2xlYXI9ZnVuY3Rpb24odCxlLG4pe2xldCBvPTA7KHZvaWQgMD09PXR8fHQpJiYob3w9MTYzODQpLCh2b2lkIDA9PT1lfHxlKSYmKG98PTI1NiksKHZvaWQgMD09PW58fG4pJiYob3w9MTAyNCksbXQuY2xlYXIobyl9LHRoaXMuY2xlYXJDb2xvcj1mdW5jdGlvbigpe3RoaXMuY2xlYXIoITAsITEsITEpfSx0aGlzLmNsZWFyRGVwdGg9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCExLCEwLCExKX0sdGhpcy5jbGVhclN0ZW5jaWw9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCExLCExLCEwKX0sdGhpcy5kaXNwb3NlPWZ1bmN0aW9uKCl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRsb3N0IixodCwhMSksZS5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRyZXN0b3JlZCIsYnQsITEpLG50LmRpc3Bvc2UoKSxvdC5kaXNwb3NlKCkscS5kaXNwb3NlKCksWC5kaXNwb3NlKCksSy5kaXNwb3NlKCksJC5kaXNwb3NlKCkscHQuZGlzcG9zZSgpLGd0LmRpc3Bvc2UoKSxndC5yZW1vdmVFdmVudExpc3RlbmVyKCJzZXNzaW9uc3RhcnQiLEN0KSxndC5yZW1vdmVFdmVudExpc3RlbmVyKCJzZXNzaW9uZW5kIixNdCksRiYmKEYuZGlzcG9zZSgpLEY9bnVsbCksdnQuc3RvcCgpfSx0aGlzLnJlbmRlckJ1ZmZlckltbWVkaWF0ZT1mdW5jdGlvbih0LGUpe3B0LmluaXRBdHRyaWJ1dGVzKCk7Y29uc3Qgbj1xLmdldCh0KTt0Lmhhc1Bvc2l0aW9ucyYmIW4ucG9zaXRpb24mJihuLnBvc2l0aW9uPW10LmNyZWF0ZUJ1ZmZlcigpKSx0Lmhhc05vcm1hbHMmJiFuLm5vcm1hbCYmKG4ubm9ybWFsPW10LmNyZWF0ZUJ1ZmZlcigpKSx0Lmhhc1V2cyYmIW4udXYmJihuLnV2PW10LmNyZWF0ZUJ1ZmZlcigpKSx0Lmhhc0NvbG9ycyYmIW4uY29sb3ImJihuLmNvbG9yPW10LmNyZWF0ZUJ1ZmZlcigpKTtjb25zdCBvPWUuZ2V0QXR0cmlidXRlcygpO3QuaGFzUG9zaXRpb25zJiYobXQuYmluZEJ1ZmZlcigzNDk2MixuLnBvc2l0aW9uKSxtdC5idWZmZXJEYXRhKDM0OTYyLHQucG9zaXRpb25BcnJheSwzNTA0OCkscHQuZW5hYmxlQXR0cmlidXRlKG8ucG9zaXRpb24pLG10LnZlcnRleEF0dHJpYlBvaW50ZXIoby5wb3NpdGlvbiwzLDUxMjYsITEsMCwwKSksdC5oYXNOb3JtYWxzJiYobXQuYmluZEJ1ZmZlcigzNDk2MixuLm5vcm1hbCksbXQuYnVmZmVyRGF0YSgzNDk2Mix0Lm5vcm1hbEFycmF5LDM1MDQ4KSxwdC5lbmFibGVBdHRyaWJ1dGUoby5ub3JtYWwpLG10LnZlcnRleEF0dHJpYlBvaW50ZXIoby5ub3JtYWwsMyw1MTI2LCExLDAsMCkpLHQuaGFzVXZzJiYobXQuYmluZEJ1ZmZlcigzNDk2MixuLnV2KSxtdC5idWZmZXJEYXRhKDM0OTYyLHQudXZBcnJheSwzNTA0OCkscHQuZW5hYmxlQXR0cmlidXRlKG8udXYpLG10LnZlcnRleEF0dHJpYlBvaW50ZXIoby51diwyLDUxMjYsITEsMCwwKSksdC5oYXNDb2xvcnMmJihtdC5iaW5kQnVmZmVyKDM0OTYyLG4uY29sb3IpLG10LmJ1ZmZlckRhdGEoMzQ5NjIsdC5jb2xvckFycmF5LDM1MDQ4KSxwdC5lbmFibGVBdHRyaWJ1dGUoby5jb2xvciksbXQudmVydGV4QXR0cmliUG9pbnRlcihvLmNvbG9yLDMsNTEyNiwhMSwwLDApKSxwdC5kaXNhYmxlVW51c2VkQXR0cmlidXRlcygpLG10LmRyYXdBcnJheXMoNCwwLHQuY291bnQpLHQuY291bnQ9MH0sdGhpcy5yZW5kZXJCdWZmZXJEaXJlY3Q9ZnVuY3Rpb24odCxlLG4sbyxpLGEpe251bGw9PT1lJiYoZT1WKTtjb25zdCByPWkuaXNNZXNoJiZpLm1hdHJpeFdvcmxkLmRldGVybWluYW50KCk8MCxzPVN0KHQsZSxvLGkpO1cuc2V0TWF0ZXJpYWwobyxyKTtsZXQgbD1uLmluZGV4O2NvbnN0IGM9bi5hdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKG51bGw9PT1sKXtpZih2b2lkIDA9PT1jfHwwPT09Yy5jb3VudClyZXR1cm59ZWxzZSBpZigwPT09bC5jb3VudClyZXR1cm47bGV0IGQscD0xOyEwPT09by53aXJlZnJhbWUmJihsPVEuZ2V0V2lyZWZyYW1lQXR0cmlidXRlKG4pLHA9Miksdm9pZCAwPT09bi5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24mJnZvaWQgMD09PW4ubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbHx8c3QudXBkYXRlKGksbixvLHMpLHB0LnNldHVwKGksbyxzLG4sbCk7bGV0IG09bHQ7bnVsbCE9PWwmJihkPUouZ2V0KGwpLG09Y3QsbS5zZXRJbmRleChkKSk7Y29uc3QgdT1udWxsIT09bD9sLmNvdW50OmMuY291bnQsZj1uLmRyYXdSYW5nZS5zdGFydCpwLGc9bi5kcmF3UmFuZ2UuY291bnQqcCxoPW51bGwhPT1hP2Euc3RhcnQqcDowLGI9bnVsbCE9PWE/YS5jb3VudCpwOjEvMCx5PU1hdGgubWF4KGYsaCksXz1NYXRoLm1pbih1LGYrZyxoK2IpLTEsQz1NYXRoLm1heCgwLF8teSsxKTtpZigwIT09Qyl7aWYoaS5pc01lc2gpITA9PT1vLndpcmVmcmFtZT8oVy5zZXRMaW5lV2lkdGgoby53aXJlZnJhbWVMaW5ld2lkdGgqaigpKSxtLnNldE1vZGUoMSkpOm0uc2V0TW9kZSg0KTtlbHNlIGlmKGkuaXNMaW5lKXtsZXQgdD1vLmxpbmV3aWR0aDt2b2lkIDA9PT10JiYodD0xKSxXLnNldExpbmVXaWR0aCh0KmooKSksbS5zZXRNb2RlKGkuaXNMaW5lU2VnbWVudHM/MTppLmlzTGluZUxvb3A/MjozKX1lbHNlIGkuaXNQb2ludHM/bS5zZXRNb2RlKDApOmkuaXNTcHJpdGUmJm0uc2V0TW9kZSg0KTtpZihpLmlzSW5zdGFuY2VkTWVzaCltLnJlbmRlckluc3RhbmNlcyh5LEMsaS5jb3VudCk7ZWxzZSBpZihuLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkpe2NvbnN0IHQ9TWF0aC5taW4obi5pbnN0YW5jZUNvdW50LG4uX21heEluc3RhbmNlQ291bnQpO20ucmVuZGVySW5zdGFuY2VzKHksQyx0KX1lbHNlIG0ucmVuZGVyKHksQyl9fSx0aGlzLmNvbXBpbGU9ZnVuY3Rpb24odCxlKXt1PW90LmdldCh0KSx1LmluaXQoKSxnLnB1c2godSksdC50cmF2ZXJzZVZpc2libGUoKGZ1bmN0aW9uKHQpe3QuaXNMaWdodCYmdC5sYXllcnMudGVzdChlLmxheWVycykmJih1LnB1c2hMaWdodCh0KSx0LmNhc3RTaGFkb3cmJnUucHVzaFNoYWRvdyh0KSl9KSksdS5zZXR1cExpZ2h0cygpLHQudHJhdmVyc2UoKGZ1bmN0aW9uKGUpe2NvbnN0IG49ZS5tYXRlcmlhbDtpZihuKWlmKEFycmF5LmlzQXJyYXkobikpZm9yKGxldCBvPTA7bzxuLmxlbmd0aDtvKyspd3QobltvXSx0LGUpO2Vsc2Ugd3Qobix0LGUpfSkpLGcucG9wKCksdT1udWxsfTtsZXQgX3Q9bnVsbDtmdW5jdGlvbiBDdCgpe3Z0LnN0b3AoKX1mdW5jdGlvbiBNdCgpe3Z0LnN0YXJ0KCl9Y29uc3QgdnQ9bmV3IFJzdDtmdW5jdGlvbiB4dCh0LGUsbixvKXtpZighMT09PXQudmlzaWJsZSlyZXR1cm47aWYodC5sYXllcnMudGVzdChlLmxheWVycykpaWYodC5pc0dyb3VwKW49dC5yZW5kZXJPcmRlcjtlbHNlIGlmKHQuaXNMT0QpITA9PT10LmF1dG9VcGRhdGUmJnQudXBkYXRlKGUpO2Vsc2UgaWYodC5pc0xpZ2h0KXUucHVzaExpZ2h0KHQpLHQuY2FzdFNoYWRvdyYmdS5wdXNoU2hhZG93KHQpO2Vsc2UgaWYodC5pc1Nwcml0ZSl7aWYoIXQuZnJ1c3R1bUN1bGxlZHx8ei5pbnRlcnNlY3RzU3ByaXRlKHQpKXtvJiZCLnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKS5hcHBseU1hdHJpeDQoTCk7Y29uc3QgZT0kLnVwZGF0ZSh0KSxpPXQubWF0ZXJpYWw7aS52aXNpYmxlJiZtLnB1c2godCxlLGksbixCLnosbnVsbCl9fWVsc2UgaWYodC5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdClvJiZCLnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKS5hcHBseU1hdHJpeDQoTCksbS5wdXNoKHQsbnVsbCx0Lm1hdGVyaWFsLG4sQi56LG51bGwpO2Vsc2UgaWYoKHQuaXNNZXNofHx0LmlzTGluZXx8dC5pc1BvaW50cykmJih0LmlzU2tpbm5lZE1lc2gmJnQuc2tlbGV0b24uZnJhbWUhPT1ZLnJlbmRlci5mcmFtZSYmKHQuc2tlbGV0b24udXBkYXRlKCksdC5za2VsZXRvbi5mcmFtZT1ZLnJlbmRlci5mcmFtZSksIXQuZnJ1c3R1bUN1bGxlZHx8ei5pbnRlcnNlY3RzT2JqZWN0KHQpKSl7byYmQi5zZXRGcm9tTWF0cml4UG9zaXRpb24odC5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KEwpO2NvbnN0IGU9JC51cGRhdGUodCksaT10Lm1hdGVyaWFsO2lmKEFycmF5LmlzQXJyYXkoaSkpe2NvbnN0IG89ZS5ncm91cHM7Zm9yKGxldCBhPTAscj1vLmxlbmd0aDthPHI7YSsrKXtjb25zdCByPW9bYV0scz1pW3IubWF0ZXJpYWxJbmRleF07cyYmcy52aXNpYmxlJiZtLnB1c2godCxlLHMsbixCLnoscil9fWVsc2UgaS52aXNpYmxlJiZtLnB1c2godCxlLGksbixCLnosbnVsbCl9Y29uc3QgaT10LmNoaWxkcmVuO2ZvcihsZXQgdD0wLGE9aS5sZW5ndGg7dDxhO3QrKyl4dChpW3RdLGUsbixvKX1mdW5jdGlvbiBPdCh0LGUsbil7Y29uc3Qgbz0hMD09PWUuaXNTY2VuZT9lLm92ZXJyaWRlTWF0ZXJpYWw6bnVsbDtpZihuLmlzQXJyYXlDYW1lcmEpe2NvbnN0IGk9bi5jYW1lcmFzO2ZvcihsZXQgbj0wLGE9aS5sZW5ndGg7bjxhO24rKyl7Y29uc3QgYT1pW25dO1cudmlld3BvcnQoeC5jb3B5KGEudmlld3BvcnQpKSx1LnNldHVwTGlnaHRzVmlldyhhKTtmb3IobGV0IG49MCxpPXQubGVuZ3RoO248aTtuKyspe2NvbnN0IGk9dFtuXSxyPWkub2JqZWN0LHM9aS5nZW9tZXRyeSxsPW51bGw9PT1vP2kubWF0ZXJpYWw6byxjPWkuZ3JvdXA7ci5sYXllcnMudGVzdChhLmxheWVycykmJlB0KHIsZSxhLHMsbCxjKX19fWVsc2UgZm9yKGxldCBpPTAsYT10Lmxlbmd0aDtpPGE7aSsrKXtjb25zdCBhPXRbaV07UHQoYS5vYmplY3QsZSxuLGEuZ2VvbWV0cnksbnVsbD09PW8/YS5tYXRlcmlhbDpvLGEuZ3JvdXApfX1mdW5jdGlvbiBQdCh0LGUsbixvLGksYSl7aWYodC5vbkJlZm9yZVJlbmRlcihoLGUsbixvLGksYSksdC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyhuLm1hdHJpeFdvcmxkSW52ZXJzZSx0Lm1hdHJpeFdvcmxkKSx0Lm5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgodC5tb2RlbFZpZXdNYXRyaXgpLHQuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3Qpe2NvbnN0IG89U3QobixlLGksdCk7Vy5zZXRNYXRlcmlhbChpKSxwdC5yZXNldCgpLChmdW5jdGlvbiByKHQsZSl7dC5yZW5kZXIoKGZ1bmN0aW9uKHQpe2gucmVuZGVyQnVmZmVySW1tZWRpYXRlKHQsZSl9KSl9KSh0LG8pfWVsc2UhMD09PWkudHJhbnNwYXJlbnQmJjI9PT1pLnNpZGU/KGkuc2lkZT0xLGkubmVlZHNVcGRhdGU9ITAsaC5yZW5kZXJCdWZmZXJEaXJlY3QobixlLG8saSx0LGEpLGkuc2lkZT0wLGkubmVlZHNVcGRhdGU9ITAsaC5yZW5kZXJCdWZmZXJEaXJlY3QobixlLG8saSx0LGEpLGkuc2lkZT0yKTpoLnJlbmRlckJ1ZmZlckRpcmVjdChuLGUsbyxpLHQsYSk7dC5vbkFmdGVyUmVuZGVyKGgsZSxuLG8saSxhKX1mdW5jdGlvbiB3dCh0LGUsbil7ITAhPT1lLmlzU2NlbmUmJihlPVYpO2NvbnN0IG89cS5nZXQodCksaT11LnN0YXRlLmxpZ2h0cyxhPWkuc3RhdGUudmVyc2lvbixyPXR0LmdldFBhcmFtZXRlcnModCxpLnN0YXRlLHUuc3RhdGUuc2hhZG93c0FycmF5LGUsbikscz10dC5nZXRQcm9ncmFtQ2FjaGVLZXkocik7bGV0IGw9by5wcm9ncmFtcztvLmVudmlyb25tZW50PXQuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD9lLmVudmlyb25tZW50Om51bGwsby5mb2c9ZS5mb2csby5lbnZNYXA9KHQuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD9LOlgpLmdldCh0LmVudk1hcHx8by5lbnZpcm9ubWVudCksdm9pZCAwPT09bCYmKHQuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIseXQpLGw9bmV3IE1hcCxvLnByb2dyYW1zPWwpO2xldCBjPWwuZ2V0KHMpO2lmKHZvaWQgMCE9PWMpe2lmKG8uY3VycmVudFByb2dyYW09PT1jJiZvLmxpZ2h0c1N0YXRlVmVyc2lvbj09PWEpcmV0dXJuIGt0KHQsciksY31lbHNlIHIudW5pZm9ybXM9dHQuZ2V0VW5pZm9ybXModCksdC5vbkJ1aWxkKHIsaCksdC5vbkJlZm9yZUNvbXBpbGUocixoKSxjPXR0LmFjcXVpcmVQcm9ncmFtKHIscyksbC5zZXQocyxjKSxvLnVuaWZvcm1zPXIudW5pZm9ybXM7Y29uc3QgZD1vLnVuaWZvcm1zOyh0LmlzU2hhZGVyTWF0ZXJpYWx8fHQuaXNSYXdTaGFkZXJNYXRlcmlhbCkmJiEwIT09dC5jbGlwcGluZ3x8KGQuY2xpcHBpbmdQbGFuZXM9aXQudW5pZm9ybSksa3QodCxyKSxvLm5lZWRzTGlnaHRzPShmdW5jdGlvbiBwKHQpe3JldHVybiB0LmlzTWVzaExhbWJlcnRNYXRlcmlhbHx8dC5pc01lc2hUb29uTWF0ZXJpYWx8fHQuaXNNZXNoUGhvbmdNYXRlcmlhbHx8dC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsfHx0LmlzU2hhZG93TWF0ZXJpYWx8fHQuaXNTaGFkZXJNYXRlcmlhbCYmITA9PT10LmxpZ2h0c30pKHQpLG8ubGlnaHRzU3RhdGVWZXJzaW9uPWEsby5uZWVkc0xpZ2h0cyYmKGQuYW1iaWVudExpZ2h0Q29sb3IudmFsdWU9aS5zdGF0ZS5hbWJpZW50LGQubGlnaHRQcm9iZS52YWx1ZT1pLnN0YXRlLnByb2JlLGQuZGlyZWN0aW9uYWxMaWdodHMudmFsdWU9aS5zdGF0ZS5kaXJlY3Rpb25hbCxkLmRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzLnZhbHVlPWkuc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3csZC5zcG90TGlnaHRzLnZhbHVlPWkuc3RhdGUuc3BvdCxkLnNwb3RMaWdodFNoYWRvd3MudmFsdWU9aS5zdGF0ZS5zcG90U2hhZG93LGQucmVjdEFyZWFMaWdodHMudmFsdWU9aS5zdGF0ZS5yZWN0QXJlYSxkLmx0Y18xLnZhbHVlPWkuc3RhdGUucmVjdEFyZWFMVEMxLGQubHRjXzIudmFsdWU9aS5zdGF0ZS5yZWN0QXJlYUxUQzIsZC5wb2ludExpZ2h0cy52YWx1ZT1pLnN0YXRlLnBvaW50LGQucG9pbnRMaWdodFNoYWRvd3MudmFsdWU9aS5zdGF0ZS5wb2ludFNoYWRvdyxkLmhlbWlzcGhlcmVMaWdodHMudmFsdWU9aS5zdGF0ZS5oZW1pLGQuZGlyZWN0aW9uYWxTaGFkb3dNYXAudmFsdWU9aS5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcCxkLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4LnZhbHVlPWkuc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgsZC5zcG90U2hhZG93TWFwLnZhbHVlPWkuc3RhdGUuc3BvdFNoYWRvd01hcCxkLnNwb3RTaGFkb3dNYXRyaXgudmFsdWU9aS5zdGF0ZS5zcG90U2hhZG93TWF0cml4LGQucG9pbnRTaGFkb3dNYXAudmFsdWU9aS5zdGF0ZS5wb2ludFNoYWRvd01hcCxkLnBvaW50U2hhZG93TWF0cml4LnZhbHVlPWkuc3RhdGUucG9pbnRTaGFkb3dNYXRyaXgpO2NvbnN0IG09Yy5nZXRVbmlmb3JtcygpLGY9d2N0LnNlcVdpdGhWYWx1ZShtLnNlcSxkKTtyZXR1cm4gby5jdXJyZW50UHJvZ3JhbT1jLG8udW5pZm9ybXNMaXN0PWYsY31mdW5jdGlvbiBrdCh0LGUpe2NvbnN0IG49cS5nZXQodCk7bi5vdXRwdXRFbmNvZGluZz1lLm91dHB1dEVuY29kaW5nLG4uaW5zdGFuY2luZz1lLmluc3RhbmNpbmcsbi5za2lubmluZz1lLnNraW5uaW5nLG4ubW9ycGhUYXJnZXRzPWUubW9ycGhUYXJnZXRzLG4ubW9ycGhOb3JtYWxzPWUubW9ycGhOb3JtYWxzLG4ubnVtQ2xpcHBpbmdQbGFuZXM9ZS5udW1DbGlwcGluZ1BsYW5lcyxuLm51bUludGVyc2VjdGlvbj1lLm51bUNsaXBJbnRlcnNlY3Rpb24sbi52ZXJ0ZXhBbHBoYXM9ZS52ZXJ0ZXhBbHBoYXMsbi52ZXJ0ZXhUYW5nZW50cz1lLnZlcnRleFRhbmdlbnRzfWZ1bmN0aW9uIFN0KHQsZSxuLG8peyEwIT09ZS5pc1NjZW5lJiYoZT1WKSxaLnJlc2V0VGV4dHVyZVVuaXRzKCk7Y29uc3QgaT1lLmZvZyxhPW51bGw9PT1DP2gub3V0cHV0RW5jb2Rpbmc6Qy50ZXh0dXJlLmVuY29kaW5nLHI9KG4uaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD9LOlgpLmdldChuLmVudk1hcHx8KG4uaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD9lLmVudmlyb25tZW50Om51bGwpKSxzPSEwPT09bi52ZXJ0ZXhDb2xvcnMmJiEhby5nZW9tZXRyeSYmISFvLmdlb21ldHJ5LmF0dHJpYnV0ZXMuY29sb3ImJjQ9PT1vLmdlb21ldHJ5LmF0dHJpYnV0ZXMuY29sb3IuaXRlbVNpemUsbD0hIW8uZ2VvbWV0cnkmJiEhby5nZW9tZXRyeS5hdHRyaWJ1dGVzLnRhbmdlbnQsYz0hIW8uZ2VvbWV0cnkmJiEhby5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24sZD0hIW8uZ2VvbWV0cnkmJiEhby5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsLHA9cS5nZXQobiksbT11LnN0YXRlLmxpZ2h0czshMCE9PUl8fCEwIT09SCYmdD09PXZ8fGl0LnNldFN0YXRlKG4sdCx0PT09diYmbi5pZD09PU0pO2xldCBmPSExO24udmVyc2lvbj09PXAuX192ZXJzaW9uP3AubmVlZHNMaWdodHMmJnAubGlnaHRzU3RhdGVWZXJzaW9uIT09bS5zdGF0ZS52ZXJzaW9ufHxwLm91dHB1dEVuY29kaW5nIT09YXx8by5pc0luc3RhbmNlZE1lc2gmJiExPT09cC5pbnN0YW5jaW5nP2Y9ITA6by5pc0luc3RhbmNlZE1lc2h8fCEwIT09cC5pbnN0YW5jaW5nP28uaXNTa2lubmVkTWVzaCYmITE9PT1wLnNraW5uaW5nP2Y9ITA6by5pc1NraW5uZWRNZXNofHwhMCE9PXAuc2tpbm5pbmc/cC5lbnZNYXAhPT1yfHxuLmZvZyYmcC5mb2chPT1pP2Y9ITA6dm9pZCAwPT09cC5udW1DbGlwcGluZ1BsYW5lc3x8cC5udW1DbGlwcGluZ1BsYW5lcz09PWl0Lm51bVBsYW5lcyYmcC5udW1JbnRlcnNlY3Rpb249PT1pdC5udW1JbnRlcnNlY3Rpb24/KHAudmVydGV4QWxwaGFzIT09c3x8cC52ZXJ0ZXhUYW5nZW50cyE9PWx8fHAubW9ycGhUYXJnZXRzIT09Y3x8cC5tb3JwaE5vcm1hbHMhPT1kKSYmKGY9ITApOmY9ITA6Zj0hMDpmPSEwOihmPSEwLHAuX192ZXJzaW9uPW4udmVyc2lvbik7bGV0IGc9cC5jdXJyZW50UHJvZ3JhbTshMD09PWYmJihnPXd0KG4sZSxvKSk7bGV0IGI9ITEseT0hMSxfPSExO2NvbnN0IHg9Zy5nZXRVbmlmb3JtcygpLE89cC51bmlmb3JtcztpZihXLnVzZVByb2dyYW0oZy5wcm9ncmFtKSYmKGI9ITAseT0hMCxfPSEwKSxuLmlkIT09TSYmKE09bi5pZCx5PSEwKSxifHx2IT09dCl7aWYoeC5zZXRWYWx1ZShtdCwicHJvamVjdGlvbk1hdHJpeCIsdC5wcm9qZWN0aW9uTWF0cml4KSxHLmxvZ2FyaXRobWljRGVwdGhCdWZmZXImJnguc2V0VmFsdWUobXQsImxvZ0RlcHRoQnVmRkMiLDIvKE1hdGgubG9nKHQuZmFyKzEpL01hdGguTE4yKSksdiE9PXQmJih2PXQseT0hMCxfPSEwKSxuLmlzU2hhZGVyTWF0ZXJpYWx8fG4uaXNNZXNoUGhvbmdNYXRlcmlhbHx8bi5pc01lc2hUb29uTWF0ZXJpYWx8fG4uaXNNZXNoU3RhbmRhcmRNYXRlcmlhbHx8bi5lbnZNYXApe2NvbnN0IGU9eC5tYXAuY2FtZXJhUG9zaXRpb247dm9pZCAwIT09ZSYmZS5zZXRWYWx1ZShtdCxCLnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKSl9KG4uaXNNZXNoUGhvbmdNYXRlcmlhbHx8bi5pc01lc2hUb29uTWF0ZXJpYWx8fG4uaXNNZXNoTGFtYmVydE1hdGVyaWFsfHxuLmlzTWVzaEJhc2ljTWF0ZXJpYWx8fG4uaXNNZXNoU3RhbmRhcmRNYXRlcmlhbHx8bi5pc1NoYWRlck1hdGVyaWFsKSYmeC5zZXRWYWx1ZShtdCwiaXNPcnRob2dyYXBoaWMiLCEwPT09dC5pc09ydGhvZ3JhcGhpY0NhbWVyYSksKG4uaXNNZXNoUGhvbmdNYXRlcmlhbHx8bi5pc01lc2hUb29uTWF0ZXJpYWx8fG4uaXNNZXNoTGFtYmVydE1hdGVyaWFsfHxuLmlzTWVzaEJhc2ljTWF0ZXJpYWx8fG4uaXNNZXNoU3RhbmRhcmRNYXRlcmlhbHx8bi5pc1NoYWRlck1hdGVyaWFsfHxuLmlzU2hhZG93TWF0ZXJpYWx8fG8uaXNTa2lubmVkTWVzaCkmJnguc2V0VmFsdWUobXQsInZpZXdNYXRyaXgiLHQubWF0cml4V29ybGRJbnZlcnNlKX1pZihvLmlzU2tpbm5lZE1lc2gpe3guc2V0T3B0aW9uYWwobXQsbywiYmluZE1hdHJpeCIpLHguc2V0T3B0aW9uYWwobXQsbywiYmluZE1hdHJpeEludmVyc2UiKTtjb25zdCB0PW8uc2tlbGV0b247dCYmKEcuZmxvYXRWZXJ0ZXhUZXh0dXJlcz8obnVsbD09PXQuYm9uZVRleHR1cmUmJnQuY29tcHV0ZUJvbmVUZXh0dXJlKCkseC5zZXRWYWx1ZShtdCwiYm9uZVRleHR1cmUiLHQuYm9uZVRleHR1cmUsWikseC5zZXRWYWx1ZShtdCwiYm9uZVRleHR1cmVTaXplIix0LmJvbmVUZXh0dXJlU2l6ZSkpOnguc2V0T3B0aW9uYWwobXQsdCwiYm9uZU1hdHJpY2VzIikpfXJldHVybih5fHxwLnJlY2VpdmVTaGFkb3chPT1vLnJlY2VpdmVTaGFkb3cpJiYocC5yZWNlaXZlU2hhZG93PW8ucmVjZWl2ZVNoYWRvdyx4LnNldFZhbHVlKG10LCJyZWNlaXZlU2hhZG93IixvLnJlY2VpdmVTaGFkb3cpKSx5JiYoeC5zZXRWYWx1ZShtdCwidG9uZU1hcHBpbmdFeHBvc3VyZSIsaC50b25lTWFwcGluZ0V4cG9zdXJlKSxwLm5lZWRzTGlnaHRzJiYoZnVuY3Rpb24gUCh0LGUpe3QuYW1iaWVudExpZ2h0Q29sb3IubmVlZHNVcGRhdGU9ZSx0LmxpZ2h0UHJvYmUubmVlZHNVcGRhdGU9ZSx0LmRpcmVjdGlvbmFsTGlnaHRzLm5lZWRzVXBkYXRlPWUsdC5kaXJlY3Rpb25hbExpZ2h0U2hhZG93cy5uZWVkc1VwZGF0ZT1lLHQucG9pbnRMaWdodHMubmVlZHNVcGRhdGU9ZSx0LnBvaW50TGlnaHRTaGFkb3dzLm5lZWRzVXBkYXRlPWUsdC5zcG90TGlnaHRzLm5lZWRzVXBkYXRlPWUsdC5zcG90TGlnaHRTaGFkb3dzLm5lZWRzVXBkYXRlPWUsdC5yZWN0QXJlYUxpZ2h0cy5uZWVkc1VwZGF0ZT1lLHQuaGVtaXNwaGVyZUxpZ2h0cy5uZWVkc1VwZGF0ZT1lfSkoTyxfKSxpJiZuLmZvZyYmZXQucmVmcmVzaEZvZ1VuaWZvcm1zKE8saSksZXQucmVmcmVzaE1hdGVyaWFsVW5pZm9ybXMoTyxuLFMsayxGKSx3Y3QudXBsb2FkKG10LHAudW5pZm9ybXNMaXN0LE8sWikpLG4uaXNTaGFkZXJNYXRlcmlhbCYmITA9PT1uLnVuaWZvcm1zTmVlZFVwZGF0ZSYmKHdjdC51cGxvYWQobXQscC51bmlmb3Jtc0xpc3QsTyxaKSxuLnVuaWZvcm1zTmVlZFVwZGF0ZT0hMSksbi5pc1Nwcml0ZU1hdGVyaWFsJiZ4LnNldFZhbHVlKG10LCJjZW50ZXIiLG8uY2VudGVyKSx4LnNldFZhbHVlKG10LCJtb2RlbFZpZXdNYXRyaXgiLG8ubW9kZWxWaWV3TWF0cml4KSx4LnNldFZhbHVlKG10LCJub3JtYWxNYXRyaXgiLG8ubm9ybWFsTWF0cml4KSx4LnNldFZhbHVlKG10LCJtb2RlbE1hdHJpeCIsby5tYXRyaXhXb3JsZCksZ312dC5zZXRBbmltYXRpb25Mb29wKChmdW5jdGlvbiBEdCh0KXtfdCYmX3QodCl9KSksInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJnZ0LnNldENvbnRleHQod2luZG93KSx0aGlzLnNldEFuaW1hdGlvbkxvb3A9ZnVuY3Rpb24odCl7X3Q9dCxndC5zZXRBbmltYXRpb25Mb29wKHQpLG51bGw9PT10P3Z0LnN0b3AoKTp2dC5zdGFydCgpfSxndC5hZGRFdmVudExpc3RlbmVyKCJzZXNzaW9uc3RhcnQiLEN0KSxndC5hZGRFdmVudExpc3RlbmVyKCJzZXNzaW9uZW5kIixNdCksdGhpcy5yZW5kZXI9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1lJiYhMCE9PWUuaXNDYW1lcmEpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXI6IGNhbWVyYSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQ2FtZXJhLiIpO2lmKCEwPT09YilyZXR1cm47ITA9PT10LmF1dG9VcGRhdGUmJnQudXBkYXRlTWF0cml4V29ybGQoKSxudWxsPT09ZS5wYXJlbnQmJmUudXBkYXRlTWF0cml4V29ybGQoKSwhMD09PWd0LmVuYWJsZWQmJiEwPT09Z3QuaXNQcmVzZW50aW5nJiYoITA9PT1ndC5jYW1lcmFBdXRvVXBkYXRlJiZndC51cGRhdGVDYW1lcmEoZSksZT1ndC5nZXRDYW1lcmEoKSksITA9PT10LmlzU2NlbmUmJnQub25CZWZvcmVSZW5kZXIoaCx0LGUsQyksdT1vdC5nZXQodCxnLmxlbmd0aCksdS5pbml0KCksZy5wdXNoKHUpLEwubXVsdGlwbHlNYXRyaWNlcyhlLnByb2plY3Rpb25NYXRyaXgsZS5tYXRyaXhXb3JsZEludmVyc2UpLHouc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoTCksSD10aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkLEk9aXQuaW5pdCh0aGlzLmNsaXBwaW5nUGxhbmVzLEgsZSksbT1udC5nZXQodCxmLmxlbmd0aCksbS5pbml0KCksZi5wdXNoKG0pLHh0KHQsZSwwLGguc29ydE9iamVjdHMpLG0uZmluaXNoKCksITA9PT1oLnNvcnRPYmplY3RzJiZtLnNvcnQoRCxFKSwhMD09PUkmJml0LmJlZ2luU2hhZG93cygpLGF0LnJlbmRlcih1LnN0YXRlLnNoYWRvd3NBcnJheSx0LGUpLHUuc2V0dXBMaWdodHMoKSx1LnNldHVwTGlnaHRzVmlldyhlKSwhMD09PUkmJml0LmVuZFNoYWRvd3MoKSwhMD09PXRoaXMuaW5mby5hdXRvUmVzZXQmJnRoaXMuaW5mby5yZXNldCgpLHJ0LnJlbmRlcihtLHQpO2NvbnN0IG49bS5vcGFxdWUsbz1tLnRyYW5zbWlzc2l2ZSxpPW0udHJhbnNwYXJlbnQ7bi5sZW5ndGg+MCYmT3Qobix0LGUpLG8ubGVuZ3RoPjAmJihmdW5jdGlvbiBhKHQsZSxuLG8pe251bGw9PT1GJiYoRj1uZXcoITA9PT1zJiYhMD09PUcuaXNXZWJHTDI/c2F0OnJhdCkoMTAyNCwxMDI0LHtnZW5lcmF0ZU1pcG1hcHM6ITAsdHlwZTpudWxsIT09ZHQuY29udmVydCh4aXQpP3hpdDpfaXQsbWluRmlsdGVyOnlpdCxtYWdGaWx0ZXI6aGl0LHdyYXBTOmZpdCx3cmFwVDpmaXR9KSk7Y29uc3QgaT1oLmdldFJlbmRlclRhcmdldCgpO2guc2V0UmVuZGVyVGFyZ2V0KEYpLGguY2xlYXIoKTtjb25zdCBhPWgudG9uZU1hcHBpbmc7aC50b25lTWFwcGluZz0wLE90KHQsbixvKSxoLnRvbmVNYXBwaW5nPWEsWi51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldChGKSxaLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcChGKSxoLnNldFJlbmRlclRhcmdldChpKSxPdChlLG4sbyl9KShuLG8sdCxlKSxpLmxlbmd0aD4wJiZPdChpLHQsZSksbnVsbCE9PUMmJihaLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KEMpLFoudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKEMpKSwhMD09PXQuaXNTY2VuZSYmdC5vbkFmdGVyUmVuZGVyKGgsdCxlKSxXLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCghMCksVy5idWZmZXJzLmRlcHRoLnNldE1hc2soITApLFcuYnVmZmVycy5jb2xvci5zZXRNYXNrKCEwKSxXLnNldFBvbHlnb25PZmZzZXQoITEpLHB0LnJlc2V0RGVmYXVsdFN0YXRlKCksTT0tMSx2PW51bGwsZy5wb3AoKSx1PWcubGVuZ3RoPjA/Z1tnLmxlbmd0aC0xXTpudWxsLGYucG9wKCksbT1mLmxlbmd0aD4wP2ZbZi5sZW5ndGgtMV06bnVsbH0sdGhpcy5nZXRBY3RpdmVDdWJlRmFjZT1mdW5jdGlvbigpe3JldHVybiB5fSx0aGlzLmdldEFjdGl2ZU1pcG1hcExldmVsPWZ1bmN0aW9uKCl7cmV0dXJuIF99LHRoaXMuZ2V0UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIEN9LHRoaXMuc2V0UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKHQsZT0wLG49MCl7Qz10LHk9ZSxfPW4sdCYmdm9pZCAwPT09cS5nZXQodCkuX193ZWJnbEZyYW1lYnVmZmVyJiZaLnNldHVwUmVuZGVyVGFyZ2V0KHQpO2xldCBvPW51bGwsaT0hMSxhPSExO2lmKHQpe2NvbnN0IG49dC50ZXh0dXJlOyhuLmlzRGF0YVRleHR1cmUzRHx8bi5pc0RhdGFUZXh0dXJlMkRBcnJheSkmJihhPSEwKTtjb25zdCByPXEuZ2V0KHQpLl9fd2ViZ2xGcmFtZWJ1ZmZlcjt0LmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0PyhvPXJbZV0saT0hMCk6bz10LmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldD9xLmdldCh0KS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXI6cix4LmNvcHkodC52aWV3cG9ydCksTy5jb3B5KHQuc2Npc3NvciksUD10LnNjaXNzb3JUZXN0fWVsc2UgeC5jb3B5KFIpLm11bHRpcGx5U2NhbGFyKFMpLmZsb29yKCksTy5jb3B5KEEpLm11bHRpcGx5U2NhbGFyKFMpLmZsb29yKCksUD1UO2lmKFcuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG8pJiZHLmRyYXdCdWZmZXJzKXtsZXQgZT0hMTtpZih0KWlmKHQuaXNXZWJHTE11bHRpcGxlUmVuZGVyVGFyZ2V0cyl7Y29uc3Qgbj10LnRleHR1cmU7aWYoTi5sZW5ndGghPT1uLmxlbmd0aHx8MzYwNjQhPT1OWzBdKXtmb3IobGV0IHQ9MCxlPW4ubGVuZ3RoO3Q8ZTt0KyspTlt0XT0zNjA2NCt0O04ubGVuZ3RoPW4ubGVuZ3RoLGU9ITB9fWVsc2UgMT09PU4ubGVuZ3RoJiYzNjA2ND09PU5bMF18fChOWzBdPTM2MDY0LE4ubGVuZ3RoPTEsZT0hMCk7ZWxzZSAxPT09Ti5sZW5ndGgmJjEwMjk9PT1OWzBdfHwoTlswXT0xMDI5LE4ubGVuZ3RoPTEsZT0hMCk7ZSYmKEcuaXNXZWJHTDI/bXQuZHJhd0J1ZmZlcnMoTik6VS5nZXQoIldFQkdMX2RyYXdfYnVmZmVycyIpLmRyYXdCdWZmZXJzV0VCR0woTikpfWlmKFcudmlld3BvcnQoeCksVy5zY2lzc29yKE8pLFcuc2V0U2Npc3NvclRlc3QoUCksaSl7Y29uc3Qgbz1xLmdldCh0LnRleHR1cmUpO210LmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDM2MDY0LDM0MDY5K2Usby5fX3dlYmdsVGV4dHVyZSxuKX1lbHNlIGlmKGEpe2NvbnN0IG89cS5nZXQodC50ZXh0dXJlKTttdC5mcmFtZWJ1ZmZlclRleHR1cmVMYXllcigzNjE2MCwzNjA2NCxvLl9fd2ViZ2xUZXh0dXJlLG58fDAsZXx8MCl9fSx0aGlzLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM9ZnVuY3Rpb24odCxlLG4sbyxpLGEscil7aWYoIXR8fCF0LmlzV2ViR0xSZW5kZXJUYXJnZXQpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0LiIpO2xldCBzPXEuZ2V0KHQpLl9fd2ViZ2xGcmFtZWJ1ZmZlcjtpZih0LmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0JiZ2b2lkIDAhPT1yJiYocz1zW3JdKSxzKXtXLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxzKTt0cnl7Y29uc3Qgcj10LnRleHR1cmUscz1yLmZvcm1hdCxsPXIudHlwZTtpZihzIT09d2l0JiZkdC5jb252ZXJ0KHMpIT09bXQuZ2V0UGFyYW1ldGVyKDM1NzM5KSlyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZvcm1hdC4iKTtjb25zdCBjPWw9PT14aXQmJihVLmhhcygiRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0Iil8fEcuaXNXZWJHTDImJlUuaGFzKCJFWFRfY29sb3JfYnVmZmVyX2Zsb2F0IikpO2lmKCEobD09PV9pdHx8ZHQuY29udmVydChsKT09PW10LmdldFBhcmFtZXRlcigzNTczOCl8fGw9PT12aXQmJihHLmlzV2ViR0wyfHxVLmhhcygiT0VTX3RleHR1cmVfZmxvYXQiKXx8VS5oYXMoIldFQkdMX2NvbG9yX2J1ZmZlcl9mbG9hdCIpKXx8YykpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IGluIFVuc2lnbmVkQnl0ZVR5cGUgb3IgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB0eXBlLiIpOzM2MDUzPT09bXQuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cygzNjE2MCk/ZT49MCYmZTw9dC53aWR0aC1vJiZuPj0wJiZuPD10LmhlaWdodC1pJiZtdC5yZWFkUGl4ZWxzKGUsbixvLGksZHQuY29udmVydChzKSxkdC5jb252ZXJ0KGwpLGEpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVhZFBpeGVscyBmcm9tIHJlbmRlclRhcmdldCBmYWlsZWQuIEZyYW1lYnVmZmVyIG5vdCBjb21wbGV0ZS4iKX1maW5hbGx5e2NvbnN0IHQ9bnVsbCE9PUM/cS5nZXQoQykuX193ZWJnbEZyYW1lYnVmZmVyOm51bGw7Vy5iaW5kRnJhbWVidWZmZXIoMzYxNjAsdCl9fX0sdGhpcy5jb3B5RnJhbWVidWZmZXJUb1RleHR1cmU9ZnVuY3Rpb24odCxlLG49MCl7Y29uc3Qgbz1NYXRoLnBvdygyLC1uKSxpPU1hdGguZmxvb3IoZS5pbWFnZS53aWR0aCpvKSxhPU1hdGguZmxvb3IoZS5pbWFnZS5oZWlnaHQqbyk7bGV0IHI9ZHQuY29udmVydChlLmZvcm1hdCk7Ry5pc1dlYkdMMiYmKDY0MDc9PT1yJiYocj0zMjg0OSksNjQwOD09PXImJihyPTMyODU2KSksWi5zZXRUZXh0dXJlMkQoZSwwKSxtdC5jb3B5VGV4SW1hZ2UyRCgzNTUzLG4scix0LngsdC55LGksYSwwKSxXLnVuYmluZFRleHR1cmUoKX0sdGhpcy5jb3B5VGV4dHVyZVRvVGV4dHVyZT1mdW5jdGlvbih0LGUsbixvPTApe2NvbnN0IGk9ZS5pbWFnZS53aWR0aCxhPWUuaW1hZ2UuaGVpZ2h0LHI9ZHQuY29udmVydChuLmZvcm1hdCkscz1kdC5jb252ZXJ0KG4udHlwZSk7Wi5zZXRUZXh0dXJlMkQobiwwKSxtdC5waXhlbFN0b3JlaSgzNzQ0MCxuLmZsaXBZKSxtdC5waXhlbFN0b3JlaSgzNzQ0MSxuLnByZW11bHRpcGx5QWxwaGEpLG10LnBpeGVsU3RvcmVpKDMzMTcsbi51bnBhY2tBbGlnbm1lbnQpLGUuaXNEYXRhVGV4dHVyZT9tdC50ZXhTdWJJbWFnZTJEKDM1NTMsbyx0LngsdC55LGksYSxyLHMsZS5pbWFnZS5kYXRhKTplLmlzQ29tcHJlc3NlZFRleHR1cmU/bXQuY29tcHJlc3NlZFRleFN1YkltYWdlMkQoMzU1MyxvLHQueCx0LnksZS5taXBtYXBzWzBdLndpZHRoLGUubWlwbWFwc1swXS5oZWlnaHQscixlLm1pcG1hcHNbMF0uZGF0YSk6bXQudGV4U3ViSW1hZ2UyRCgzNTUzLG8sdC54LHQueSxyLHMsZS5pbWFnZSksMD09PW8mJm4uZ2VuZXJhdGVNaXBtYXBzJiZtdC5nZW5lcmF0ZU1pcG1hcCgzNTUzKSxXLnVuYmluZFRleHR1cmUoKX0sdGhpcy5jb3B5VGV4dHVyZVRvVGV4dHVyZTNEPWZ1bmN0aW9uKHQsZSxuLG8saT0wKXtpZihoLmlzV2ViR0wxUmVuZGVyZXIpcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyLmNvcHlUZXh0dXJlVG9UZXh0dXJlM0Q6IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIik7Y29uc3QgYT10Lm1heC54LXQubWluLngrMSxyPXQubWF4LnktdC5taW4ueSsxLHM9dC5tYXguei10Lm1pbi56KzEsbD1kdC5jb252ZXJ0KG8uZm9ybWF0KSxjPWR0LmNvbnZlcnQoby50eXBlKTtsZXQgZDtpZihvLmlzRGF0YVRleHR1cmUzRClaLnNldFRleHR1cmUzRChvLDApLGQ9MzI4Nzk7ZWxzZXtpZighby5pc0RhdGFUZXh0dXJlMkRBcnJheSlyZXR1cm4gdm9pZCBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXIuY29weVRleHR1cmVUb1RleHR1cmUzRDogb25seSBzdXBwb3J0cyBUSFJFRS5EYXRhVGV4dHVyZTNEIGFuZCBUSFJFRS5EYXRhVGV4dHVyZTJEQXJyYXkuIik7Wi5zZXRUZXh0dXJlMkRBcnJheShvLDApLGQ9MzU4NjZ9bXQucGl4ZWxTdG9yZWkoMzc0NDAsby5mbGlwWSksbXQucGl4ZWxTdG9yZWkoMzc0NDEsby5wcmVtdWx0aXBseUFscGhhKSxtdC5waXhlbFN0b3JlaSgzMzE3LG8udW5wYWNrQWxpZ25tZW50KTtjb25zdCBwPW10LmdldFBhcmFtZXRlcigzMzE0KSxtPW10LmdldFBhcmFtZXRlcigzMjg3OCksdT1tdC5nZXRQYXJhbWV0ZXIoMzMxNiksZj1tdC5nZXRQYXJhbWV0ZXIoMzMxNSksZz1tdC5nZXRQYXJhbWV0ZXIoMzI4NzcpLGI9bi5pc0NvbXByZXNzZWRUZXh0dXJlP24ubWlwbWFwc1swXTpuLmltYWdlO210LnBpeGVsU3RvcmVpKDMzMTQsYi53aWR0aCksbXQucGl4ZWxTdG9yZWkoMzI4NzgsYi5oZWlnaHQpLG10LnBpeGVsU3RvcmVpKDMzMTYsdC5taW4ueCksbXQucGl4ZWxTdG9yZWkoMzMxNSx0Lm1pbi55KSxtdC5waXhlbFN0b3JlaSgzMjg3Nyx0Lm1pbi56KSxuLmlzRGF0YVRleHR1cmV8fG4uaXNEYXRhVGV4dHVyZTNEP210LnRleFN1YkltYWdlM0QoZCxpLGUueCxlLnksZS56LGEscixzLGwsYyxiLmRhdGEpOm4uaXNDb21wcmVzc2VkVGV4dHVyZT8oY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyLmNvcHlUZXh0dXJlVG9UZXh0dXJlM0Q6IHVudGVzdGVkIHN1cHBvcnQgZm9yIGNvbXByZXNzZWQgc3JjVGV4dHVyZS4iKSxtdC5jb21wcmVzc2VkVGV4U3ViSW1hZ2UzRChkLGksZS54LGUueSxlLnosYSxyLHMsbCxiLmRhdGEpKTptdC50ZXhTdWJJbWFnZTNEKGQsaSxlLngsZS55LGUueixhLHIscyxsLGMsYiksbXQucGl4ZWxTdG9yZWkoMzMxNCxwKSxtdC5waXhlbFN0b3JlaSgzMjg3OCxtKSxtdC5waXhlbFN0b3JlaSgzMzE2LHUpLG10LnBpeGVsU3RvcmVpKDMzMTUsZiksbXQucGl4ZWxTdG9yZWkoMzI4NzcsZyksMD09PWkmJm8uZ2VuZXJhdGVNaXBtYXBzJiZtdC5nZW5lcmF0ZU1pcG1hcChkKSxXLnVuYmluZFRleHR1cmUoKX0sdGhpcy5pbml0VGV4dHVyZT1mdW5jdGlvbih0KXtaLnNldFRleHR1cmUyRCh0LDApLFcudW5iaW5kVGV4dHVyZSgpfSx0aGlzLnJlc2V0U3RhdGU9ZnVuY3Rpb24oKXt5PTAsXz0wLEM9bnVsbCxXLnJlc2V0KCkscHQucmVzZXQoKX0sInVuZGVmaW5lZCIhPXR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18mJl9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgib2JzZXJ2ZSIse2RldGFpbDp0aGlzfSkpfShjbGFzcyBleHRlbmRzIGJkdHt9KS5wcm90b3R5cGUuaXNXZWJHTDFSZW5kZXJlcj0hMDtjbGFzcyB5ZHQgZXh0ZW5kcyBwcnR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudHlwZT0iU2NlbmUiLHRoaXMuYmFja2dyb3VuZD1udWxsLHRoaXMuZW52aXJvbm1lbnQ9bnVsbCx0aGlzLmZvZz1udWxsLHRoaXMub3ZlcnJpZGVNYXRlcmlhbD1udWxsLHRoaXMuYXV0b1VwZGF0ZT0hMCwidW5kZWZpbmVkIiE9dHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyYmX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJvYnNlcnZlIix7ZGV0YWlsOnRoaXN9KSl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksbnVsbCE9PXQuYmFja2dyb3VuZCYmKHRoaXMuYmFja2dyb3VuZD10LmJhY2tncm91bmQuY2xvbmUoKSksbnVsbCE9PXQuZW52aXJvbm1lbnQmJih0aGlzLmVudmlyb25tZW50PXQuZW52aXJvbm1lbnQuY2xvbmUoKSksbnVsbCE9PXQuZm9nJiYodGhpcy5mb2c9dC5mb2cuY2xvbmUoKSksbnVsbCE9PXQub3ZlcnJpZGVNYXRlcmlhbCYmKHRoaXMub3ZlcnJpZGVNYXRlcmlhbD10Lm92ZXJyaWRlTWF0ZXJpYWwuY2xvbmUoKSksdGhpcy5hdXRvVXBkYXRlPXQuYXV0b1VwZGF0ZSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlLHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO3JldHVybiBudWxsIT09dGhpcy5mb2cmJihlLm9iamVjdC5mb2c9dGhpcy5mb2cudG9KU09OKCkpLGV9fXlkdC5wcm90b3R5cGUuaXNTY2VuZT0hMDtjbGFzcyBfZHR7Y29uc3RydWN0b3IodCxlKXt0aGlzLmFycmF5PXQsdGhpcy5zdHJpZGU9ZSx0aGlzLmNvdW50PXZvaWQgMCE9PXQ/dC5sZW5ndGgvZTowLHRoaXMudXNhZ2U9Qml0LHRoaXMudXBkYXRlUmFuZ2U9e29mZnNldDowLGNvdW50Oi0xfSx0aGlzLnZlcnNpb249MCx0aGlzLnV1aWQ9cWl0KCl9b25VcGxvYWRDYWxsYmFjaygpe31zZXQgbmVlZHNVcGRhdGUodCl7ITA9PT10JiZ0aGlzLnZlcnNpb24rK31zZXRVc2FnZSh0KXtyZXR1cm4gdGhpcy51c2FnZT10LHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5hcnJheT1uZXcgdC5hcnJheS5jb25zdHJ1Y3Rvcih0LmFycmF5KSx0aGlzLmNvdW50PXQuY291bnQsdGhpcy5zdHJpZGU9dC5zdHJpZGUsdGhpcy51c2FnZT10LnVzYWdlLHRoaXN9Y29weUF0KHQsZSxuKXt0Kj10aGlzLnN0cmlkZSxuKj1lLnN0cmlkZTtmb3IobGV0IG89MCxpPXRoaXMuc3RyaWRlO288aTtvKyspdGhpcy5hcnJheVt0K29dPWUuYXJyYXlbbitvXTtyZXR1cm4gdGhpc31zZXQodCxlPTApe3JldHVybiB0aGlzLmFycmF5LnNldCh0LGUpLHRoaXN9Y2xvbmUodCl7dm9pZCAwPT09dC5hcnJheUJ1ZmZlcnMmJih0LmFycmF5QnVmZmVycz17fSksdm9pZCAwPT09dGhpcy5hcnJheS5idWZmZXIuX3V1aWQmJih0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZD1xaXQoKSksdm9pZCAwPT09dC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdJiYodC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPXRoaXMuYXJyYXkuc2xpY2UoMCkuYnVmZmVyKTtjb25zdCBlPW5ldyB0aGlzLmFycmF5LmNvbnN0cnVjdG9yKHQuYXJyYXlCdWZmZXJzW3RoaXMuYXJyYXkuYnVmZmVyLl91dWlkXSksbj1uZXcgdGhpcy5jb25zdHJ1Y3RvcihlLHRoaXMuc3RyaWRlKTtyZXR1cm4gbi5zZXRVc2FnZSh0aGlzLnVzYWdlKSxufW9uVXBsb2FkKHQpe3JldHVybiB0aGlzLm9uVXBsb2FkQ2FsbGJhY2s9dCx0aGlzfXRvSlNPTih0KXtyZXR1cm4gdm9pZCAwPT09dC5hcnJheUJ1ZmZlcnMmJih0LmFycmF5QnVmZmVycz17fSksdm9pZCAwPT09dGhpcy5hcnJheS5idWZmZXIuX3V1aWQmJih0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZD1xaXQoKSksdm9pZCAwPT09dC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdJiYodC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG5ldyBVaW50MzJBcnJheSh0aGlzLmFycmF5LmJ1ZmZlcikpKSx7dXVpZDp0aGlzLnV1aWQsYnVmZmVyOnRoaXMuYXJyYXkuYnVmZmVyLl91dWlkLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLHN0cmlkZTp0aGlzLnN0cmlkZX19fV9kdC5wcm90b3R5cGUuaXNJbnRlcmxlYXZlZEJ1ZmZlcj0hMDtjb25zdCBDZHQ9bmV3IGNhdDtjbGFzcyBNZHR7Y29uc3RydWN0b3IodCxlLG4sbz0hMSl7dGhpcy5uYW1lPSIiLHRoaXMuZGF0YT10LHRoaXMuaXRlbVNpemU9ZSx0aGlzLm9mZnNldD1uLHRoaXMubm9ybWFsaXplZD0hMD09PW99Z2V0IGNvdW50KCl7cmV0dXJuIHRoaXMuZGF0YS5jb3VudH1nZXQgYXJyYXkoKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5fXNldCBuZWVkc1VwZGF0ZSh0KXt0aGlzLmRhdGEubmVlZHNVcGRhdGU9dH1hcHBseU1hdHJpeDQodCl7Zm9yKGxldCBlPTAsbj10aGlzLmRhdGEuY291bnQ7ZTxuO2UrKylDZHQueD10aGlzLmdldFgoZSksQ2R0Lnk9dGhpcy5nZXRZKGUpLENkdC56PXRoaXMuZ2V0WihlKSxDZHQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0WFlaKGUsQ2R0LngsQ2R0LnksQ2R0LnopO3JldHVybiB0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKUNkdC54PXRoaXMuZ2V0WChlKSxDZHQueT10aGlzLmdldFkoZSksQ2R0Lno9dGhpcy5nZXRaKGUpLENkdC5hcHBseU5vcm1hbE1hdHJpeCh0KSx0aGlzLnNldFhZWihlLENkdC54LENkdC55LENkdC56KTtyZXR1cm4gdGhpc310cmFuc2Zvcm1EaXJlY3Rpb24odCl7Zm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspQ2R0Lng9dGhpcy5nZXRYKGUpLENkdC55PXRoaXMuZ2V0WShlKSxDZHQuej10aGlzLmdldFooZSksQ2R0LnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzLnNldFhZWihlLENkdC54LENkdC55LENkdC56KTtyZXR1cm4gdGhpc31zZXRYKHQsZSl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXRdPWUsdGhpc31zZXRZKHQsZSl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMV09ZSx0aGlzfXNldFoodCxlKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCsyXT1lLHRoaXN9c2V0Vyh0LGUpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzNdPWUsdGhpc31nZXRYKHQpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0XX1nZXRZKHQpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzFdfWdldFoodCl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMl19Z2V0Vyh0KXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCszXX1zZXRYWSh0LGUsbil7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsodD10KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQpKzBdPWUsdGhpcy5kYXRhLmFycmF5W3QrMV09bix0aGlzfXNldFhZWih0LGUsbixvKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5Wyh0PXQqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCkrMF09ZSx0aGlzLmRhdGEuYXJyYXlbdCsxXT1uLHRoaXMuZGF0YS5hcnJheVt0KzJdPW8sdGhpc31zZXRYWVpXKHQsZSxuLG8saSl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsodD10KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQpKzBdPWUsdGhpcy5kYXRhLmFycmF5W3QrMV09bix0aGlzLmRhdGEuYXJyYXlbdCsyXT1vLHRoaXMuZGF0YS5hcnJheVt0KzNdPWksdGhpc31jbG9uZSh0KXtpZih2b2lkIDA9PT10KXtjb25zb2xlLmxvZygiVEhSRUUuSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUuY2xvbmUoKTogQ2xvbmluZyBhbiBpbnRlcmxhdmVkIGJ1ZmZlciBhdHRyaWJ1dGUgd2lsbCBkZWludGVybGVhdmUgYnVmZmVyIGRhdGEuIik7Y29uc3QgdD1bXTtmb3IobGV0IGU9MDtlPHRoaXMuY291bnQ7ZSsrKXtjb25zdCBuPWUqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldDtmb3IobGV0IGU9MDtlPHRoaXMuaXRlbVNpemU7ZSsrKXQucHVzaCh0aGlzLmRhdGEuYXJyYXlbbitlXSl9cmV0dXJuIG5ldyB6cnQobmV3IHRoaXMuYXJyYXkuY29uc3RydWN0b3IodCksdGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQpfXJldHVybiB2b2lkIDA9PT10LmludGVybGVhdmVkQnVmZmVycyYmKHQuaW50ZXJsZWF2ZWRCdWZmZXJzPXt9KSx2b2lkIDA9PT10LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF0mJih0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF09dGhpcy5kYXRhLmNsb25lKHQpKSxuZXcgTWR0KHQuaW50ZXJsZWF2ZWRCdWZmZXJzW3RoaXMuZGF0YS51dWlkXSx0aGlzLml0ZW1TaXplLHRoaXMub2Zmc2V0LHRoaXMubm9ybWFsaXplZCl9dG9KU09OKHQpe2lmKHZvaWQgMD09PXQpe2NvbnNvbGUubG9nKCJUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS50b0pTT04oKTogU2VyaWFsaXppbmcgYW4gaW50ZXJsYXZlZCBidWZmZXIgYXR0cmlidXRlIHdpbGwgZGVpbnRlcmxlYXZlIGJ1ZmZlciBkYXRhLiIpO2NvbnN0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLmNvdW50O2UrKyl7Y29uc3Qgbj1lKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQ7Zm9yKGxldCBlPTA7ZTx0aGlzLml0ZW1TaXplO2UrKyl0LnB1c2godGhpcy5kYXRhLmFycmF5W24rZV0pfXJldHVybntpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OnQsbm9ybWFsaXplZDp0aGlzLm5vcm1hbGl6ZWR9fXJldHVybiB2b2lkIDA9PT10LmludGVybGVhdmVkQnVmZmVycyYmKHQuaW50ZXJsZWF2ZWRCdWZmZXJzPXt9KSx2b2lkIDA9PT10LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF0mJih0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF09dGhpcy5kYXRhLnRvSlNPTih0KSkse2lzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6ITAsaXRlbVNpemU6dGhpcy5pdGVtU2l6ZSxkYXRhOnRoaXMuZGF0YS51dWlkLG9mZnNldDp0aGlzLm9mZnNldCxub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH19fU1kdC5wcm90b3R5cGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZT0hMDtjbGFzcyB2ZHQgZXh0ZW5kcyBPcnR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9IlNwcml0ZU1hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyBScnQoMTY3NzcyMTUpLHRoaXMubWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMucm90YXRpb249MCx0aGlzLnNpemVBdHRlbnVhdGlvbj0hMCx0aGlzLnRyYW5zcGFyZW50PSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubWFwPXQubWFwLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLnJvdGF0aW9uPXQucm90YXRpb24sdGhpcy5zaXplQXR0ZW51YXRpb249dC5zaXplQXR0ZW51YXRpb24sdGhpc319bGV0IHhkdDt2ZHQucHJvdG90eXBlLmlzU3ByaXRlTWF0ZXJpYWw9ITA7Y29uc3QgT2R0PW5ldyBjYXQsUGR0PW5ldyBjYXQsd2R0PW5ldyBjYXQsa2R0PW5ldyBRaXQsU2R0PW5ldyBRaXQsRGR0PW5ldyBCYXQsRWR0PW5ldyBjYXQsUmR0PW5ldyBjYXQsQWR0PW5ldyBjYXQsVGR0PW5ldyBRaXQsTmR0PW5ldyBRaXQsemR0PW5ldyBRaXQ7ZnVuY3Rpb24gSWR0KHQsZSxuLG8saSxhKXtrZHQuc3ViVmVjdG9ycyh0LG4pLmFkZFNjYWxhciguNSkubXVsdGlwbHkobyksdm9pZCAwIT09aT8oU2R0Lng9YSprZHQueC1pKmtkdC55LFNkdC55PWkqa2R0LngrYSprZHQueSk6U2R0LmNvcHkoa2R0KSx0LmNvcHkoZSksdC54Kz1TZHQueCx0LnkrPVNkdC55LHQuYXBwbHlNYXRyaXg0KERkdCl9KGNsYXNzIGV4dGVuZHMgcHJ0e2NvbnN0cnVjdG9yKHQpe2lmKHN1cGVyKCksdGhpcy50eXBlPSJTcHJpdGUiLHZvaWQgMD09PXhkdCl7eGR0PW5ldyBxcnQ7Y29uc3QgdD1uZXcgRmxvYXQzMkFycmF5KFstLjUsLS41LDAsMCwwLC41LC0uNSwwLDEsMCwuNSwuNSwwLDEsMSwtLjUsLjUsMCwwLDFdKSxlPW5ldyBfZHQodCw1KTt4ZHQuc2V0SW5kZXgoWzAsMSwyLDAsMiwzXSkseGR0LnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBNZHQoZSwzLDAsITEpKSx4ZHQuc2V0QXR0cmlidXRlKCJ1diIsbmV3IE1kdChlLDIsMywhMSkpfXRoaXMuZ2VvbWV0cnk9eGR0LHRoaXMubWF0ZXJpYWw9dm9pZCAwIT09dD90Om5ldyB2ZHQsdGhpcy5jZW50ZXI9bmV3IFFpdCguNSwuNSl9cmF5Y2FzdCh0LGUpe251bGw9PT10LmNhbWVyYSYmY29uc29sZS5lcnJvcignVEhSRUUuU3ByaXRlOiAiUmF5Y2FzdGVyLmNhbWVyYSIgbmVlZHMgdG8gYmUgc2V0IGluIG9yZGVyIHRvIHJheWNhc3QgYWdhaW5zdCBzcHJpdGVzLicpLFBkdC5zZXRGcm9tTWF0cml4U2NhbGUodGhpcy5tYXRyaXhXb3JsZCksRGR0LmNvcHkodC5jYW1lcmEubWF0cml4V29ybGQpLHRoaXMubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXModC5jYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLHRoaXMubWF0cml4V29ybGQpLHdkdC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tb2RlbFZpZXdNYXRyaXgpLHQuY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEmJiExPT09dGhpcy5tYXRlcmlhbC5zaXplQXR0ZW51YXRpb24mJlBkdC5tdWx0aXBseVNjYWxhcigtd2R0LnopO2NvbnN0IG49dGhpcy5tYXRlcmlhbC5yb3RhdGlvbjtsZXQgbyxpOzAhPT1uJiYoaT1NYXRoLmNvcyhuKSxvPU1hdGguc2luKG4pKTtjb25zdCBhPXRoaXMuY2VudGVyO0lkdChFZHQuc2V0KC0uNSwtLjUsMCksd2R0LGEsUGR0LG8saSksSWR0KFJkdC5zZXQoLjUsLS41LDApLHdkdCxhLFBkdCxvLGkpLElkdChBZHQuc2V0KC41LC41LDApLHdkdCxhLFBkdCxvLGkpLFRkdC5zZXQoMCwwKSxOZHQuc2V0KDEsMCksemR0LnNldCgxLDEpO2xldCByPXQucmF5LmludGVyc2VjdFRyaWFuZ2xlKEVkdCxSZHQsQWR0LCExLE9kdCk7aWYobnVsbD09PXImJihJZHQoUmR0LnNldCgtLjUsLjUsMCksd2R0LGEsUGR0LG8saSksTmR0LnNldCgwLDEpLHI9dC5yYXkuaW50ZXJzZWN0VHJpYW5nbGUoRWR0LEFkdCxSZHQsITEsT2R0KSxudWxsPT09cikpcmV0dXJuO2NvbnN0IHM9dC5yYXkub3JpZ2luLmRpc3RhbmNlVG8oT2R0KTtzPHQubmVhcnx8cz50LmZhcnx8ZS5wdXNoKHtkaXN0YW5jZTpzLHBvaW50Ok9kdC5jbG9uZSgpLHV2OnZydC5nZXRVVihPZHQsRWR0LFJkdCxBZHQsVGR0LE5kdCx6ZHQsbmV3IFFpdCksZmFjZTpudWxsLG9iamVjdDp0aGlzfSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx2b2lkIDAhPT10LmNlbnRlciYmdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5tYXRlcmlhbD10Lm1hdGVyaWFsLHRoaXN9fSkucHJvdG90eXBlLmlzU3ByaXRlPSEwO2NvbnN0IEhkdD1uZXcgY2F0LEZkdD1uZXcgYWF0LExkdD1uZXcgYWF0LEJkdD1uZXcgY2F0LFZkdD1uZXcgQmF0O2NsYXNzIGpkdCBleHRlbmRzIHBzdHtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy50eXBlPSJTa2lubmVkTWVzaCIsdGhpcy5iaW5kTW9kZT0iYXR0YWNoZWQiLHRoaXMuYmluZE1hdHJpeD1uZXcgQmF0LHRoaXMuYmluZE1hdHJpeEludmVyc2U9bmV3IEJhdH1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuYmluZE1vZGU9dC5iaW5kTW9kZSx0aGlzLmJpbmRNYXRyaXguY29weSh0LmJpbmRNYXRyaXgpLHRoaXMuYmluZE1hdHJpeEludmVyc2UuY29weSh0LmJpbmRNYXRyaXhJbnZlcnNlKSx0aGlzLnNrZWxldG9uPXQuc2tlbGV0b24sdGhpc31iaW5kKHQsZSl7dGhpcy5za2VsZXRvbj10LHZvaWQgMD09PWUmJih0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKSx0aGlzLnNrZWxldG9uLmNhbGN1bGF0ZUludmVyc2VzKCksZT10aGlzLm1hdHJpeFdvcmxkKSx0aGlzLmJpbmRNYXRyaXguY29weShlKSx0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkoZSkuaW52ZXJ0KCl9cG9zZSgpe3RoaXMuc2tlbGV0b24ucG9zZSgpfW5vcm1hbGl6ZVNraW5XZWlnaHRzKCl7Y29uc3QgdD1uZXcgYWF0LGU9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnNraW5XZWlnaHQ7Zm9yKGxldCBuPTAsbz1lLmNvdW50O248bztuKyspe3QueD1lLmdldFgobiksdC55PWUuZ2V0WShuKSx0Lno9ZS5nZXRaKG4pLHQudz1lLmdldFcobik7Y29uc3Qgbz0xL3QubWFuaGF0dGFuTGVuZ3RoKCk7byE9PTEvMD90Lm11bHRpcGx5U2NhbGFyKG8pOnQuc2V0KDEsMCwwLDApLGUuc2V0WFlaVyhuLHQueCx0LnksdC56LHQudyl9fXVwZGF0ZU1hdHJpeFdvcmxkKHQpe3N1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKHQpLCJhdHRhY2hlZCI9PT10aGlzLmJpbmRNb2RlP3RoaXMuYmluZE1hdHJpeEludmVyc2UuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKToiZGV0YWNoZWQiPT09dGhpcy5iaW5kTW9kZT90aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5iaW5kTWF0cml4KS5pbnZlcnQoKTpjb25zb2xlLndhcm4oIlRIUkVFLlNraW5uZWRNZXNoOiBVbnJlY29nbml6ZWQgYmluZE1vZGU6ICIrdGhpcy5iaW5kTW9kZSl9Ym9uZVRyYW5zZm9ybSh0LGUpe2NvbnN0IG49dGhpcy5za2VsZXRvbixvPXRoaXMuZ2VvbWV0cnk7RmR0LmZyb21CdWZmZXJBdHRyaWJ1dGUoby5hdHRyaWJ1dGVzLnNraW5JbmRleCx0KSxMZHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLmF0dHJpYnV0ZXMuc2tpbldlaWdodCx0KSxIZHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLmF0dHJpYnV0ZXMucG9zaXRpb24sdCkuYXBwbHlNYXRyaXg0KHRoaXMuYmluZE1hdHJpeCksZS5zZXQoMCwwLDApO2ZvcihsZXQgdD0wO3Q8NDt0Kyspe2NvbnN0IG89TGR0LmdldENvbXBvbmVudCh0KTtpZigwIT09byl7Y29uc3QgaT1GZHQuZ2V0Q29tcG9uZW50KHQpO1ZkdC5tdWx0aXBseU1hdHJpY2VzKG4uYm9uZXNbaV0ubWF0cml4V29ybGQsbi5ib25lSW52ZXJzZXNbaV0pLGUuYWRkU2NhbGVkVmVjdG9yKEJkdC5jb3B5KEhkdCkuYXBwbHlNYXRyaXg0KFZkdCksbyl9fXJldHVybiBlLmFwcGx5TWF0cml4NCh0aGlzLmJpbmRNYXRyaXhJbnZlcnNlKX19amR0LnByb3RvdHlwZS5pc1NraW5uZWRNZXNoPSEwLGNsYXNzIGV4dGVuZHMgcHJ0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnR5cGU9IkJvbmUifX0ucHJvdG90eXBlLmlzQm9uZT0hMCxjbGFzcyBleHRlbmRzIG9hdHtjb25zdHJ1Y3Rvcih0PW51bGwsZT0xLG49MSxvLGksYSxyLHMsbD0xMDAzLGM9MTAwMyxkLHApe3N1cGVyKG51bGwsYSxyLHMsbCxjLG8saSxkLHApLHRoaXMuaW1hZ2U9e2RhdGE6dCx3aWR0aDplLGhlaWdodDpufSx0aGlzLm1hZ0ZpbHRlcj1sLHRoaXMubWluRmlsdGVyPWMsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITEsdGhpcy5mbGlwWT0hMSx0aGlzLnVucGFja0FsaWdubWVudD0xLHRoaXMubmVlZHNVcGRhdGU9ITB9fS5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZT0hMDtjb25zdCBVZHQ9bmV3IEJhdCxHZHQ9bmV3IEJhdCxXZHQ9W10sWWR0PW5ldyBwc3Q7KGNsYXNzIGV4dGVuZHMgcHN0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcih0LGUpLHRoaXMuaW5zdGFuY2VNYXRyaXg9bmV3IHpydChuZXcgRmxvYXQzMkFycmF5KDE2Km4pLDE2KSx0aGlzLmluc3RhbmNlQ29sb3I9bnVsbCx0aGlzLmNvdW50PW4sdGhpcy5mcnVzdHVtQ3VsbGVkPSExfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5pbnN0YW5jZU1hdHJpeC5jb3B5KHQuaW5zdGFuY2VNYXRyaXgpLG51bGwhPT10Lmluc3RhbmNlQ29sb3ImJih0aGlzLmluc3RhbmNlQ29sb3I9dC5pbnN0YW5jZUNvbG9yLmNsb25lKCkpLHRoaXMuY291bnQ9dC5jb3VudCx0aGlzfWdldENvbG9yQXQodCxlKXtlLmZyb21BcnJheSh0aGlzLmluc3RhbmNlQ29sb3IuYXJyYXksMyp0KX1nZXRNYXRyaXhBdCh0LGUpe2UuZnJvbUFycmF5KHRoaXMuaW5zdGFuY2VNYXRyaXguYXJyYXksMTYqdCl9cmF5Y2FzdCh0LGUpe2NvbnN0IG49dGhpcy5tYXRyaXhXb3JsZCxvPXRoaXMuY291bnQ7aWYoWWR0Lmdlb21ldHJ5PXRoaXMuZ2VvbWV0cnksWWR0Lm1hdGVyaWFsPXRoaXMubWF0ZXJpYWwsdm9pZCAwIT09WWR0Lm1hdGVyaWFsKWZvcihsZXQgaT0wO2k8bztpKyspe3RoaXMuZ2V0TWF0cml4QXQoaSxVZHQpLEdkdC5tdWx0aXBseU1hdHJpY2VzKG4sVWR0KSxZZHQubWF0cml4V29ybGQ9R2R0LFlkdC5yYXljYXN0KHQsV2R0KTtmb3IobGV0IHQ9MCxuPVdkdC5sZW5ndGg7dDxuO3QrKyl7Y29uc3Qgbj1XZHRbdF07bi5pbnN0YW5jZUlkPWksbi5vYmplY3Q9dGhpcyxlLnB1c2gobil9V2R0Lmxlbmd0aD0wfX1zZXRDb2xvckF0KHQsZSl7bnVsbD09PXRoaXMuaW5zdGFuY2VDb2xvciYmKHRoaXMuaW5zdGFuY2VDb2xvcj1uZXcgenJ0KG5ldyBGbG9hdDMyQXJyYXkoMyp0aGlzLmluc3RhbmNlTWF0cml4LmNvdW50KSwzKSksZS50b0FycmF5KHRoaXMuaW5zdGFuY2VDb2xvci5hcnJheSwzKnQpfXNldE1hdHJpeEF0KHQsZSl7ZS50b0FycmF5KHRoaXMuaW5zdGFuY2VNYXRyaXguYXJyYXksMTYqdCl9dXBkYXRlTW9ycGhUYXJnZXRzKCl7fWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fSkucHJvdG90eXBlLmlzSW5zdGFuY2VkTWVzaD0hMDtjbGFzcyBxZHQgZXh0ZW5kcyBPcnR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9IkxpbmVCYXNpY01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyBScnQoMTY3NzcyMTUpLHRoaXMubGluZXdpZHRoPTEsdGhpcy5saW5lY2FwPSJyb3VuZCIsdGhpcy5saW5lam9pbj0icm91bmQiLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubGluZXdpZHRoPXQubGluZXdpZHRoLHRoaXMubGluZWNhcD10LmxpbmVjYXAsdGhpcy5saW5lam9pbj10LmxpbmVqb2luLHRoaXN9fXFkdC5wcm90b3R5cGUuaXNMaW5lQmFzaWNNYXRlcmlhbD0hMDtjb25zdCBaZHQ9bmV3IGNhdCxYZHQ9bmV3IGNhdCxLZHQ9bmV3IEJhdCxKZHQ9bmV3IExhdCxRZHQ9bmV3IFJhdDtjbGFzcyAkZHQgZXh0ZW5kcyBwcnR7Y29uc3RydWN0b3IodD1uZXcgcXJ0LGU9bmV3IHFkdCl7c3VwZXIoKSx0aGlzLnR5cGU9IkxpbmUiLHRoaXMuZ2VvbWV0cnk9dCx0aGlzLm1hdGVyaWFsPWUsdGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMubWF0ZXJpYWw9dC5tYXRlcmlhbCx0aGlzLmdlb21ldHJ5PXQuZ2VvbWV0cnksdGhpc31jb21wdXRlTGluZURpc3RhbmNlcygpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeTtpZih0LmlzQnVmZmVyR2VvbWV0cnkpaWYobnVsbD09PXQuaW5kZXgpe2NvbnN0IGU9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLG49WzBdO2ZvcihsZXQgdD0xLG89ZS5jb3VudDt0PG87dCsrKVpkdC5mcm9tQnVmZmVyQXR0cmlidXRlKGUsdC0xKSxYZHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHQpLG5bdF09blt0LTFdLG5bdF0rPVpkdC5kaXN0YW5jZVRvKFhkdCk7dC5zZXRBdHRyaWJ1dGUoImxpbmVEaXN0YW5jZSIsbmV3IEZydChuLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuIik7ZWxzZSB0LmlzR2VvbWV0cnkmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzfXJheWNhc3QodCxlKXtjb25zdCBuPXRoaXMuZ2VvbWV0cnksbz10aGlzLm1hdHJpeFdvcmxkLGk9dC5wYXJhbXMuTGluZS50aHJlc2hvbGQsYT1uLmRyYXdSYW5nZTtpZihudWxsPT09bi5ib3VuZGluZ1NwaGVyZSYmbi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxRZHQuY29weShuLmJvdW5kaW5nU3BoZXJlKSxRZHQuYXBwbHlNYXRyaXg0KG8pLFFkdC5yYWRpdXMrPWksITE9PT10LnJheS5pbnRlcnNlY3RzU3BoZXJlKFFkdCkpcmV0dXJuO0tkdC5jb3B5KG8pLmludmVydCgpLEpkdC5jb3B5KHQucmF5KS5hcHBseU1hdHJpeDQoS2R0KTtjb25zdCByPWkvKCh0aGlzLnNjYWxlLngrdGhpcy5zY2FsZS55K3RoaXMuc2NhbGUueikvMykscz1yKnIsbD1uZXcgY2F0LGM9bmV3IGNhdCxkPW5ldyBjYXQscD1uZXcgY2F0LG09dGhpcy5pc0xpbmVTZWdtZW50cz8yOjE7aWYobi5pc0J1ZmZlckdlb21ldHJ5KXtjb25zdCBvPW4uaW5kZXgsaT1uLmF0dHJpYnV0ZXMucG9zaXRpb247aWYobnVsbCE9PW8pZm9yKGxldCBuPU1hdGgubWF4KDAsYS5zdGFydCkscj1NYXRoLm1pbihvLmNvdW50LGEuc3RhcnQrYS5jb3VudCktMTtuPHI7bis9bSl7Y29uc3QgYT1vLmdldFgobikscj1vLmdldFgobisxKTtpZihsLmZyb21CdWZmZXJBdHRyaWJ1dGUoaSxhKSxjLmZyb21CdWZmZXJBdHRyaWJ1dGUoaSxyKSxKZHQuZGlzdGFuY2VTcVRvU2VnbWVudChsLGMscCxkKT5zKWNvbnRpbnVlO3AuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpO2NvbnN0IG09dC5yYXkub3JpZ2luLmRpc3RhbmNlVG8ocCk7bTx0Lm5lYXJ8fG0+dC5mYXJ8fGUucHVzaCh7ZGlzdGFuY2U6bSxwb2ludDpkLmNsb25lKCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLGluZGV4Om4sZmFjZTpudWxsLGZhY2VJbmRleDpudWxsLG9iamVjdDp0aGlzfSl9ZWxzZSBmb3IobGV0IG49TWF0aC5tYXgoMCxhLnN0YXJ0KSxvPU1hdGgubWluKGkuY291bnQsYS5zdGFydCthLmNvdW50KS0xO248bztuKz1tKXtpZihsLmZyb21CdWZmZXJBdHRyaWJ1dGUoaSxuKSxjLmZyb21CdWZmZXJBdHRyaWJ1dGUoaSxuKzEpLEpkdC5kaXN0YW5jZVNxVG9TZWdtZW50KGwsYyxwLGQpPnMpY29udGludWU7cC5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCk7Y29uc3Qgbz10LnJheS5vcmlnaW4uZGlzdGFuY2VUbyhwKTtvPHQubmVhcnx8bz50LmZhcnx8ZS5wdXNoKHtkaXN0YW5jZTpvLHBvaW50OmQuY2xvbmUoKS5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCksaW5kZXg6bixmYWNlOm51bGwsZmFjZUluZGV4Om51bGwsb2JqZWN0OnRoaXN9KX19ZWxzZSBuLmlzR2VvbWV0cnkmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLkxpbmUucmF5Y2FzdCgpIG5vIGxvbmdlciBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIil9dXBkYXRlTW9ycGhUYXJnZXRzKCl7Y29uc3QgdD10aGlzLmdlb21ldHJ5O2lmKHQuaXNCdWZmZXJHZW9tZXRyeSl7Y29uc3QgZT10Lm1vcnBoQXR0cmlidXRlcyxuPU9iamVjdC5rZXlzKGUpO2lmKG4ubGVuZ3RoPjApe2NvbnN0IHQ9ZVtuWzBdXTtpZih2b2lkIDAhPT10KXt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1bXSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT17fTtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspe2NvbnN0IG49dFtlXS5uYW1lfHxTdHJpbmcoZSk7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCgwKSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVtuXT1lfX19fWVsc2V7Y29uc3QgZT10Lm1vcnBoVGFyZ2V0czt2b2lkIDAhPT1lJiZlLmxlbmd0aD4wJiZjb25zb2xlLmVycm9yKCJUSFJFRS5MaW5lLnVwZGF0ZU1vcnBoVGFyZ2V0cygpIGRvZXMgbm90IHN1cHBvcnQgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpfX19JGR0LnByb3RvdHlwZS5pc0xpbmU9ITA7Y29uc3QgdHB0PW5ldyBjYXQsZXB0PW5ldyBjYXQ7Y2xhc3MgbnB0IGV4dGVuZHMgJGR0e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLnR5cGU9IkxpbmVTZWdtZW50cyJ9Y29tcHV0ZUxpbmVEaXN0YW5jZXMoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnk7aWYodC5pc0J1ZmZlckdlb21ldHJ5KWlmKG51bGw9PT10LmluZGV4KXtjb25zdCBlPXQuYXR0cmlidXRlcy5wb3NpdGlvbixuPVtdO2ZvcihsZXQgdD0wLG89ZS5jb3VudDt0PG87dCs9Mil0cHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHQpLGVwdC5mcm9tQnVmZmVyQXR0cmlidXRlKGUsdCsxKSxuW3RdPTA9PT10PzA6blt0LTFdLG5bdCsxXT1uW3RdK3RwdC5kaXN0YW5jZVRvKGVwdCk7dC5zZXRBdHRyaWJ1dGUoImxpbmVEaXN0YW5jZSIsbmV3IEZydChuLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZVNlZ21lbnRzLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4iKTtlbHNlIHQuaXNHZW9tZXRyeSYmY29uc29sZS5lcnJvcigiVEhSRUUuTGluZVNlZ21lbnRzLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCkgbm8gbG9uZ2VyIHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpc319bnB0LnByb3RvdHlwZS5pc0xpbmVTZWdtZW50cz0hMCxjbGFzcyBleHRlbmRzICRkdHtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy50eXBlPSJMaW5lTG9vcCJ9fS5wcm90b3R5cGUuaXNMaW5lTG9vcD0hMDtjbGFzcyBvcHQgZXh0ZW5kcyBPcnR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9IlBvaW50c01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyBScnQoMTY3NzcyMTUpLHRoaXMubWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuc2l6ZT0xLHRoaXMuc2l6ZUF0dGVudWF0aW9uPSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubWFwPXQubWFwLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLnNpemU9dC5zaXplLHRoaXMuc2l6ZUF0dGVudWF0aW9uPXQuc2l6ZUF0dGVudWF0aW9uLHRoaXN9fW9wdC5wcm90b3R5cGUuaXNQb2ludHNNYXRlcmlhbD0hMDtjb25zdCBpcHQ9bmV3IEJhdCxhcHQ9bmV3IExhdCxycHQ9bmV3IFJhdCxzcHQ9bmV3IGNhdDtmdW5jdGlvbiBscHQodCxlLG4sbyxpLGEscil7Y29uc3Qgcz1hcHQuZGlzdGFuY2VTcVRvUG9pbnQodCk7aWYoczxuKXtjb25zdCBuPW5ldyBjYXQ7YXB0LmNsb3Nlc3RQb2ludFRvUG9pbnQodCxuKSxuLmFwcGx5TWF0cml4NChvKTtjb25zdCBsPWkucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKG4pO2lmKGw8aS5uZWFyfHxsPmkuZmFyKXJldHVybjthLnB1c2goe2Rpc3RhbmNlOmwsZGlzdGFuY2VUb1JheTpNYXRoLnNxcnQocykscG9pbnQ6bixpbmRleDplLGZhY2U6bnVsbCxvYmplY3Q6cn0pfX0oY2xhc3MgZXh0ZW5kcyBwcnR7Y29uc3RydWN0b3IodD1uZXcgcXJ0LGU9bmV3IG9wdCl7c3VwZXIoKSx0aGlzLnR5cGU9IlBvaW50cyIsdGhpcy5nZW9tZXRyeT10LHRoaXMubWF0ZXJpYWw9ZSx0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5tYXRlcmlhbD10Lm1hdGVyaWFsLHRoaXMuZ2VvbWV0cnk9dC5nZW9tZXRyeSx0aGlzfXJheWNhc3QodCxlKXtjb25zdCBuPXRoaXMuZ2VvbWV0cnksbz10aGlzLm1hdHJpeFdvcmxkLGk9dC5wYXJhbXMuUG9pbnRzLnRocmVzaG9sZCxhPW4uZHJhd1JhbmdlO2lmKG51bGw9PT1uLmJvdW5kaW5nU3BoZXJlJiZuLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHJwdC5jb3B5KG4uYm91bmRpbmdTcGhlcmUpLHJwdC5hcHBseU1hdHJpeDQobykscnB0LnJhZGl1cys9aSwhMT09PXQucmF5LmludGVyc2VjdHNTcGhlcmUocnB0KSlyZXR1cm47aXB0LmNvcHkobykuaW52ZXJ0KCksYXB0LmNvcHkodC5yYXkpLmFwcGx5TWF0cml4NChpcHQpO2NvbnN0IHI9aS8oKHRoaXMuc2NhbGUueCt0aGlzLnNjYWxlLnkrdGhpcy5zY2FsZS56KS8zKSxzPXIqcjtpZihuLmlzQnVmZmVyR2VvbWV0cnkpe2NvbnN0IGk9bi5pbmRleCxyPW4uYXR0cmlidXRlcy5wb3NpdGlvbjtpZihudWxsIT09aSlmb3IobGV0IG49TWF0aC5tYXgoMCxhLnN0YXJ0KSxsPU1hdGgubWluKGkuY291bnQsYS5zdGFydCthLmNvdW50KTtuPGw7bisrKXtjb25zdCBhPWkuZ2V0WChuKTtzcHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLGEpLGxwdChzcHQsYSxzLG8sdCxlLHRoaXMpfWVsc2UgZm9yKGxldCBuPU1hdGgubWF4KDAsYS5zdGFydCksaT1NYXRoLm1pbihyLmNvdW50LGEuc3RhcnQrYS5jb3VudCk7bjxpO24rKylzcHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLG4pLGxwdChzcHQsbixzLG8sdCxlLHRoaXMpfWVsc2UgY29uc29sZS5lcnJvcigiVEhSRUUuUG9pbnRzLnJheWNhc3QoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpfXVwZGF0ZU1vcnBoVGFyZ2V0cygpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeTtpZih0LmlzQnVmZmVyR2VvbWV0cnkpe2NvbnN0IGU9dC5tb3JwaEF0dHJpYnV0ZXMsbj1PYmplY3Qua2V5cyhlKTtpZihuLmxlbmd0aD4wKXtjb25zdCB0PWVbblswXV07aWYodm9pZCAwIT09dCl7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9W10sdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9e307Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXtjb25zdCBuPXRbZV0ubmFtZXx8U3RyaW5nKGUpO3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goMCksdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbbl09ZX19fX1lbHNle2NvbnN0IGU9dC5tb3JwaFRhcmdldHM7dm9pZCAwIT09ZSYmZS5sZW5ndGg+MCYmY29uc29sZS5lcnJvcigiVEhSRUUuUG9pbnRzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpIGRvZXMgbm90IHN1cHBvcnQgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpfX19KS5wcm90b3R5cGUuaXNQb2ludHM9ITAsY2xhc3MgZXh0ZW5kcyBvYXR7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEscixzLGwpe3N1cGVyKHQsZSxuLG8saSxhLHIscyxsKSx0aGlzLmZvcm1hdD12b2lkIDAhPT1yP3I6UGl0LHRoaXMubWluRmlsdGVyPXZvaWQgMCE9PWE/YTpiaXQsdGhpcy5tYWdGaWx0ZXI9dm9pZCAwIT09aT9pOmJpdCx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMTtjb25zdCBjPXRoaXM7InJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2siaW4gdCYmdC5yZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrKChmdW5jdGlvbiBlKCl7Yy5uZWVkc1VwZGF0ZT0hMCx0LnJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2soZSl9KSl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5pbWFnZSkuY29weSh0aGlzKX11cGRhdGUoKXtjb25zdCB0PXRoaXMuaW1hZ2U7MD09InJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2siaW4gdCYmdC5yZWFkeVN0YXRlPj10LkhBVkVfQ1VSUkVOVF9EQVRBJiYodGhpcy5uZWVkc1VwZGF0ZT0hMCl9fS5wcm90b3R5cGUuaXNWaWRlb1RleHR1cmU9ITAsY2xhc3MgZXh0ZW5kcyBvYXR7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEscixzLGwsYyxkLHApe3N1cGVyKG51bGwsYSxyLHMsbCxjLG8saSxkLHApLHRoaXMuaW1hZ2U9e3dpZHRoOmUsaGVpZ2h0Om59LHRoaXMubWlwbWFwcz10LHRoaXMuZmxpcFk9ITEsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITF9fS5wcm90b3R5cGUuaXNDb21wcmVzc2VkVGV4dHVyZT0hMCxjbGFzcyBleHRlbmRzIG9hdHtjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSxyLHMsbCl7c3VwZXIodCxlLG4sbyxpLGEscixzLGwpLHRoaXMubmVlZHNVcGRhdGU9ITB9fS5wcm90b3R5cGUuaXNDYW52YXNUZXh0dXJlPSEwLGNsYXNzIGV4dGVuZHMgb2F0e2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIscyxsLGMpe2lmKChjPXZvaWQgMCE9PWM/YzpraXQpIT09a2l0JiZjIT09U2l0KXRocm93IG5ldyBFcnJvcigiRGVwdGhUZXh0dXJlIGZvcm1hdCBtdXN0IGJlIGVpdGhlciBUSFJFRS5EZXB0aEZvcm1hdCBvciBUSFJFRS5EZXB0aFN0ZW5jaWxGb3JtYXQiKTt2b2lkIDA9PT1uJiZjPT09a2l0JiYobj1DaXQpLHZvaWQgMD09PW4mJmM9PT1TaXQmJihuPU9pdCksc3VwZXIobnVsbCxvLGksYSxyLHMsYyxuLGwpLHRoaXMuaW1hZ2U9e3dpZHRoOnQsaGVpZ2h0OmV9LHRoaXMubWFnRmlsdGVyPXZvaWQgMCE9PXI/cjpoaXQsdGhpcy5taW5GaWx0ZXI9dm9pZCAwIT09cz9zOmhpdCx0aGlzLmZsaXBZPSExLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExfX0ucHJvdG90eXBlLmlzRGVwdGhUZXh0dXJlPSEwO2NsYXNzIGNwdCBleHRlbmRzIHFydHtjb25zdHJ1Y3Rvcih0PTEsZT04LG49MCxvPTIqTWF0aC5QSSl7c3VwZXIoKSx0aGlzLnR5cGU9IkNpcmNsZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czp0LHNlZ21lbnRzOmUsdGhldGFTdGFydDpuLHRoZXRhTGVuZ3RoOm99LGU9TWF0aC5tYXgoMyxlKTtjb25zdCBpPVtdLGE9W10scj1bXSxzPVtdLGw9bmV3IGNhdCxjPW5ldyBRaXQ7YS5wdXNoKDAsMCwwKSxyLnB1c2goMCwwLDEpLHMucHVzaCguNSwuNSk7Zm9yKGxldCBpPTAsZD0zO2k8PWU7aSsrLGQrPTMpe2NvbnN0IHA9bitpL2UqbztsLng9dCpNYXRoLmNvcyhwKSxsLnk9dCpNYXRoLnNpbihwKSxhLnB1c2gobC54LGwueSxsLnopLHIucHVzaCgwLDAsMSksYy54PShhW2RdL3QrMSkvMixjLnk9KGFbZCsxXS90KzEpLzIscy5wdXNoKGMueCxjLnkpfWZvcihsZXQgdD0xO3Q8PWU7dCsrKWkucHVzaCh0LHQrMSwwKTt0aGlzLnNldEluZGV4KGkpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IEZydChhLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgRnJ0KHIsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IEZydChzLDIpKX1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBjcHQodC5yYWRpdXMsdC5zZWdtZW50cyx0LnRoZXRhU3RhcnQsdC50aGV0YUxlbmd0aCl9fW5ldyBjYXQsbmV3IGNhdCxuZXcgY2F0LG5ldyB2cnQ7Y2xhc3MgZHB0e2NvbnN0cnVjdG9yKCl7dGhpcy50eXBlPSJDdXJ2ZSIsdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9MjAwfWdldFBvaW50KCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRlZC4iKSxudWxsfWdldFBvaW50QXQodCxlKXtjb25zdCBuPXRoaXMuZ2V0VXRvVG1hcHBpbmcodCk7cmV0dXJuIHRoaXMuZ2V0UG9pbnQobixlKX1nZXRQb2ludHModD01KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248PXQ7bisrKWUucHVzaCh0aGlzLmdldFBvaW50KG4vdCkpO3JldHVybiBlfWdldFNwYWNlZFBvaW50cyh0PTUpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjw9dDtuKyspZS5wdXNoKHRoaXMuZ2V0UG9pbnRBdChuL3QpKTtyZXR1cm4gZX1nZXRMZW5ndGgoKXtjb25zdCB0PXRoaXMuZ2V0TGVuZ3RocygpO3JldHVybiB0W3QubGVuZ3RoLTFdfWdldExlbmd0aHModD10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyl7aWYodGhpcy5jYWNoZUFyY0xlbmd0aHMmJnRoaXMuY2FjaGVBcmNMZW5ndGhzLmxlbmd0aD09PXQrMSYmIXRoaXMubmVlZHNVcGRhdGUpcmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzO3RoaXMubmVlZHNVcGRhdGU9ITE7Y29uc3QgZT1bXTtsZXQgbixvPXRoaXMuZ2V0UG9pbnQoMCksaT0wO2UucHVzaCgwKTtmb3IobGV0IGE9MTthPD10O2ErKyluPXRoaXMuZ2V0UG9pbnQoYS90KSxpKz1uLmRpc3RhbmNlVG8obyksZS5wdXNoKGkpLG89bjtyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM9ZSxlfXVwZGF0ZUFyY0xlbmd0aHMoKXt0aGlzLm5lZWRzVXBkYXRlPSEwLHRoaXMuZ2V0TGVuZ3RocygpfWdldFV0b1RtYXBwaW5nKHQsZSl7Y29uc3Qgbj10aGlzLmdldExlbmd0aHMoKTtsZXQgbz0wO2NvbnN0IGk9bi5sZW5ndGg7bGV0IGE7YT1lfHx0Km5baS0xXTtsZXQgcixzPTAsbD1pLTE7Zm9yKDtzPD1sOylpZihvPU1hdGguZmxvb3IocysobC1zKS8yKSxyPW5bb10tYSxyPDApcz1vKzE7ZWxzZXtpZighKHI+MCkpe2w9bzticmVha31sPW8tMX1pZihvPWwsbltvXT09PWEpcmV0dXJuIG8vKGktMSk7Y29uc3QgYz1uW29dO3JldHVybihvKyhhLWMpLyhuW28rMV0tYykpLyhpLTEpfWdldFRhbmdlbnQodCxlKXtjb25zdCBuPTFlLTQ7bGV0IG89dC1uLGk9dCtuO288MCYmKG89MCksaT4xJiYoaT0xKTtjb25zdCBhPXRoaXMuZ2V0UG9pbnQobykscj10aGlzLmdldFBvaW50KGkpLHM9ZXx8KGEuaXNWZWN0b3IyP25ldyBRaXQ6bmV3IGNhdCk7cmV0dXJuIHMuY29weShyKS5zdWIoYSkubm9ybWFsaXplKCksc31nZXRUYW5nZW50QXQodCxlKXtjb25zdCBuPXRoaXMuZ2V0VXRvVG1hcHBpbmcodCk7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudChuLGUpfWNvbXB1dGVGcmVuZXRGcmFtZXModCxlKXtjb25zdCBuPW5ldyBjYXQsbz1bXSxpPVtdLGE9W10scj1uZXcgY2F0LHM9bmV3IEJhdDtmb3IobGV0IGU9MDtlPD10O2UrKylvW2VdPXRoaXMuZ2V0VGFuZ2VudEF0KGUvdCxuZXcgY2F0KSxvW2VdLm5vcm1hbGl6ZSgpO2lbMF09bmV3IGNhdCxhWzBdPW5ldyBjYXQ7bGV0IGw9TnVtYmVyLk1BWF9WQUxVRTtjb25zdCBjPU1hdGguYWJzKG9bMF0ueCksZD1NYXRoLmFicyhvWzBdLnkpLHA9TWF0aC5hYnMob1swXS56KTtjPD1sJiYobD1jLG4uc2V0KDEsMCwwKSksZDw9bCYmKGw9ZCxuLnNldCgwLDEsMCkpLHA8PWwmJm4uc2V0KDAsMCwxKSxyLmNyb3NzVmVjdG9ycyhvWzBdLG4pLm5vcm1hbGl6ZSgpLGlbMF0uY3Jvc3NWZWN0b3JzKG9bMF0sciksYVswXS5jcm9zc1ZlY3RvcnMob1swXSxpWzBdKTtmb3IobGV0IGU9MTtlPD10O2UrKyl7aWYoaVtlXT1pW2UtMV0uY2xvbmUoKSxhW2VdPWFbZS0xXS5jbG9uZSgpLHIuY3Jvc3NWZWN0b3JzKG9bZS0xXSxvW2VdKSxyLmxlbmd0aCgpPk51bWJlci5FUFNJTE9OKXtyLm5vcm1hbGl6ZSgpO2NvbnN0IHQ9TWF0aC5hY29zKFppdChvW2UtMV0uZG90KG9bZV0pLC0xLDEpKTtpW2VdLmFwcGx5TWF0cml4NChzLm1ha2VSb3RhdGlvbkF4aXMocix0KSl9YVtlXS5jcm9zc1ZlY3RvcnMob1tlXSxpW2VdKX1pZighMD09PWUpe2xldCBlPU1hdGguYWNvcyhaaXQoaVswXS5kb3QoaVt0XSksLTEsMSkpO2UvPXQsb1swXS5kb3Qoci5jcm9zc1ZlY3RvcnMoaVswXSxpW3RdKSk+MCYmKGU9LWUpO2ZvcihsZXQgbj0xO248PXQ7bisrKWlbbl0uYXBwbHlNYXRyaXg0KHMubWFrZVJvdGF0aW9uQXhpcyhvW25dLGUqbikpLGFbbl0uY3Jvc3NWZWN0b3JzKG9bbl0saVtuXSl9cmV0dXJue3RhbmdlbnRzOm8sbm9ybWFsczppLGJpbm9ybWFsczphfX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz10LmFyY0xlbmd0aERpdmlzaW9ucyx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNSx0eXBlOiJDdXJ2ZSIsZ2VuZXJhdG9yOiJDdXJ2ZS50b0pTT04ifX07cmV0dXJuIHQuYXJjTGVuZ3RoRGl2aXNpb25zPXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zLHQudHlwZT10aGlzLnR5cGUsdH1mcm9tSlNPTih0KXtyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9dC5hcmNMZW5ndGhEaXZpc2lvbnMsdGhpc319Y2xhc3MgcHB0IGV4dGVuZHMgZHB0e2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0xLG89MSxpPTAsYT0yKk1hdGguUEkscj0hMSxzPTApe3N1cGVyKCksdGhpcy50eXBlPSJFbGxpcHNlQ3VydmUiLHRoaXMuYVg9dCx0aGlzLmFZPWUsdGhpcy54UmFkaXVzPW4sdGhpcy55UmFkaXVzPW8sdGhpcy5hU3RhcnRBbmdsZT1pLHRoaXMuYUVuZEFuZ2xlPWEsdGhpcy5hQ2xvY2t3aXNlPXIsdGhpcy5hUm90YXRpb249c31nZXRQb2ludCh0LGUpe2NvbnN0IG49ZXx8bmV3IFFpdCxvPTIqTWF0aC5QSTtsZXQgaT10aGlzLmFFbmRBbmdsZS10aGlzLmFTdGFydEFuZ2xlO2NvbnN0IGE9TWF0aC5hYnMoaSk8TnVtYmVyLkVQU0lMT047Zm9yKDtpPDA7KWkrPW87Zm9yKDtpPm87KWktPW87aTxOdW1iZXIuRVBTSUxPTiYmKGk9YT8wOm8pLCEwIT09dGhpcy5hQ2xvY2t3aXNlfHxhfHwoaT09PW8/aT0tbzppLT1vKTtjb25zdCByPXRoaXMuYVN0YXJ0QW5nbGUrdCppO2xldCBzPXRoaXMuYVgrdGhpcy54UmFkaXVzKk1hdGguY29zKHIpLGw9dGhpcy5hWSt0aGlzLnlSYWRpdXMqTWF0aC5zaW4ocik7aWYoMCE9PXRoaXMuYVJvdGF0aW9uKXtjb25zdCB0PU1hdGguY29zKHRoaXMuYVJvdGF0aW9uKSxlPU1hdGguc2luKHRoaXMuYVJvdGF0aW9uKSxuPXMtdGhpcy5hWCxvPWwtdGhpcy5hWTtzPW4qdC1vKmUrdGhpcy5hWCxsPW4qZStvKnQrdGhpcy5hWX1yZXR1cm4gbi5zZXQocyxsKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuYVg9dC5hWCx0aGlzLmFZPXQuYVksdGhpcy54UmFkaXVzPXQueFJhZGl1cyx0aGlzLnlSYWRpdXM9dC55UmFkaXVzLHRoaXMuYVN0YXJ0QW5nbGU9dC5hU3RhcnRBbmdsZSx0aGlzLmFFbmRBbmdsZT10LmFFbmRBbmdsZSx0aGlzLmFDbG9ja3dpc2U9dC5hQ2xvY2t3aXNlLHRoaXMuYVJvdGF0aW9uPXQuYVJvdGF0aW9uLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5hWD10aGlzLmFYLHQuYVk9dGhpcy5hWSx0LnhSYWRpdXM9dGhpcy54UmFkaXVzLHQueVJhZGl1cz10aGlzLnlSYWRpdXMsdC5hU3RhcnRBbmdsZT10aGlzLmFTdGFydEFuZ2xlLHQuYUVuZEFuZ2xlPXRoaXMuYUVuZEFuZ2xlLHQuYUNsb2Nrd2lzZT10aGlzLmFDbG9ja3dpc2UsdC5hUm90YXRpb249dGhpcy5hUm90YXRpb24sdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy5hWD10LmFYLHRoaXMuYVk9dC5hWSx0aGlzLnhSYWRpdXM9dC54UmFkaXVzLHRoaXMueVJhZGl1cz10LnlSYWRpdXMsdGhpcy5hU3RhcnRBbmdsZT10LmFTdGFydEFuZ2xlLHRoaXMuYUVuZEFuZ2xlPXQuYUVuZEFuZ2xlLHRoaXMuYUNsb2Nrd2lzZT10LmFDbG9ja3dpc2UsdGhpcy5hUm90YXRpb249dC5hUm90YXRpb24sdGhpc319cHB0LnByb3RvdHlwZS5pc0VsbGlwc2VDdXJ2ZT0hMDtjbGFzcyBtcHQgZXh0ZW5kcyBwcHR7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEpe3N1cGVyKHQsZSxuLG4sbyxpLGEpLHRoaXMudHlwZT0iQXJjQ3VydmUifX1mdW5jdGlvbiB1cHQoKXtsZXQgdD0wLGU9MCxuPTAsbz0wO2Z1bmN0aW9uIGkoaSxhLHIscyl7dD1pLGU9cixuPS0zKmkrMyphLTIqci1zLG89MippLTIqYStyK3N9cmV0dXJue2luaXRDYXRtdWxsUm9tOmZ1bmN0aW9uKHQsZSxuLG8sYSl7aShlLG4sYSoobi10KSxhKihvLWUpKX0saW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tOmZ1bmN0aW9uKHQsZSxuLG8sYSxyLHMpe2xldCBsPShlLXQpL2EtKG4tdCkvKGErcikrKG4tZSkvcixjPShuLWUpL3ItKG8tZSkvKHIrcykrKG8tbikvcztsKj1yLGMqPXIsaShlLG4sbCxjKX0sY2FsYzpmdW5jdGlvbihpKXtjb25zdCBhPWkqaTtyZXR1cm4gdCtlKmkrbiphK28qKGEqaSl9fX1tcHQucHJvdG90eXBlLmlzQXJjQ3VydmU9ITA7Y29uc3QgZnB0PW5ldyBjYXQsZ3B0PW5ldyB1cHQsaHB0PW5ldyB1cHQsYnB0PW5ldyB1cHQ7Y2xhc3MgeXB0IGV4dGVuZHMgZHB0e2NvbnN0cnVjdG9yKHQ9W10sZT0hMSxuPSJjZW50cmlwZXRhbCIsbz0uNSl7c3VwZXIoKSx0aGlzLnR5cGU9IkNhdG11bGxSb21DdXJ2ZTMiLHRoaXMucG9pbnRzPXQsdGhpcy5jbG9zZWQ9ZSx0aGlzLmN1cnZlVHlwZT1uLHRoaXMudGVuc2lvbj1vfWdldFBvaW50KHQsZT1uZXcgY2F0KXtjb25zdCBuPWUsbz10aGlzLnBvaW50cyxpPW8ubGVuZ3RoLGE9KGktKHRoaXMuY2xvc2VkPzA6MSkpKnQ7bGV0IHIscyxsPU1hdGguZmxvb3IoYSksYz1hLWw7dGhpcy5jbG9zZWQ/bCs9bD4wPzA6KE1hdGguZmxvb3IoTWF0aC5hYnMobCkvaSkrMSkqaTowPT09YyYmbD09PWktMSYmKGw9aS0yLGM9MSksdGhpcy5jbG9zZWR8fGw+MD9yPW9bKGwtMSklaV06KGZwdC5zdWJWZWN0b3JzKG9bMF0sb1sxXSkuYWRkKG9bMF0pLHI9ZnB0KTtjb25zdCBkPW9bbCVpXSxwPW9bKGwrMSklaV07aWYodGhpcy5jbG9zZWR8fGwrMjxpP3M9b1sobCsyKSVpXTooZnB0LnN1YlZlY3RvcnMob1tpLTFdLG9baS0yXSkuYWRkKG9baS0xXSkscz1mcHQpLCJjZW50cmlwZXRhbCI9PT10aGlzLmN1cnZlVHlwZXx8ImNob3JkYWwiPT09dGhpcy5jdXJ2ZVR5cGUpe2NvbnN0IHQ9ImNob3JkYWwiPT09dGhpcy5jdXJ2ZVR5cGU/LjU6LjI1O2xldCBlPU1hdGgucG93KHIuZGlzdGFuY2VUb1NxdWFyZWQoZCksdCksbj1NYXRoLnBvdyhkLmRpc3RhbmNlVG9TcXVhcmVkKHApLHQpLG89TWF0aC5wb3cocC5kaXN0YW5jZVRvU3F1YXJlZChzKSx0KTtuPDFlLTQmJihuPTEpLGU8MWUtNCYmKGU9biksbzwxZS00JiYobz1uKSxncHQuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKHIueCxkLngscC54LHMueCxlLG4sbyksaHB0LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShyLnksZC55LHAueSxzLnksZSxuLG8pLGJwdC5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oci56LGQueixwLnoscy56LGUsbixvKX1lbHNlImNhdG11bGxyb20iPT09dGhpcy5jdXJ2ZVR5cGUmJihncHQuaW5pdENhdG11bGxSb20oci54LGQueCxwLngscy54LHRoaXMudGVuc2lvbiksaHB0LmluaXRDYXRtdWxsUm9tKHIueSxkLnkscC55LHMueSx0aGlzLnRlbnNpb24pLGJwdC5pbml0Q2F0bXVsbFJvbShyLnosZC56LHAueixzLnosdGhpcy50ZW5zaW9uKSk7cmV0dXJuIG4uc2V0KGdwdC5jYWxjKGMpLGhwdC5jYWxjKGMpLGJwdC5jYWxjKGMpKSxufWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxuPXQucG9pbnRzLmxlbmd0aDtlPG47ZSsrKXRoaXMucG9pbnRzLnB1c2godC5wb2ludHNbZV0uY2xvbmUoKSk7cmV0dXJuIHRoaXMuY2xvc2VkPXQuY2xvc2VkLHRoaXMuY3VydmVUeXBlPXQuY3VydmVUeXBlLHRoaXMudGVuc2lvbj10LnRlbnNpb24sdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5wb2ludHMubGVuZ3RoO2U8bjtlKyspdC5wb2ludHMucHVzaCh0aGlzLnBvaW50c1tlXS50b0FycmF5KCkpO3JldHVybiB0LmNsb3NlZD10aGlzLmNsb3NlZCx0LmN1cnZlVHlwZT10aGlzLmN1cnZlVHlwZSx0LnRlbnNpb249dGhpcy50ZW5zaW9uLHR9ZnJvbUpTT04odCl7c3VwZXIuZnJvbUpTT04odCksdGhpcy5wb2ludHM9W107Zm9yKGxldCBlPTAsbj10LnBvaW50cy5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgbj10LnBvaW50c1tlXTt0aGlzLnBvaW50cy5wdXNoKChuZXcgY2F0KS5mcm9tQXJyYXkobikpfXJldHVybiB0aGlzLmNsb3NlZD10LmNsb3NlZCx0aGlzLmN1cnZlVHlwZT10LmN1cnZlVHlwZSx0aGlzLnRlbnNpb249dC50ZW5zaW9uLHRoaXN9fWZ1bmN0aW9uIF9wdCh0LGUsbixvLGkpe2NvbnN0IGE9LjUqKG8tZSkscj0uNSooaS1uKSxzPXQqdDtyZXR1cm4oMipuLTIqbythK3IpKih0KnMpKygtMypuKzMqby0yKmEtcikqcythKnQrbn1mdW5jdGlvbiBDcHQodCxlLG4sbyl7cmV0dXJuKGZ1bmN0aW9uIGkodCxlKXtjb25zdCBuPTEtdDtyZXR1cm4gbipuKmV9KSh0LGUpKyhmdW5jdGlvbiBhKHQsZSl7cmV0dXJuIDIqKDEtdCkqdCplfSkodCxuKSsoZnVuY3Rpb24gcih0LGUpe3JldHVybiB0KnQqZX0pKHQsbyl9ZnVuY3Rpb24gTXB0KHQsZSxuLG8saSl7cmV0dXJuKGZ1bmN0aW9uIGEodCxlKXtjb25zdCBuPTEtdDtyZXR1cm4gbipuKm4qZX0pKHQsZSkrKGZ1bmN0aW9uIHIodCxlKXtjb25zdCBuPTEtdDtyZXR1cm4gMypuKm4qdCplfSkodCxuKSsoZnVuY3Rpb24gcyh0LGUpe3JldHVybiAzKigxLXQpKnQqdCplfSkodCxvKSsoZnVuY3Rpb24gbCh0LGUpe3JldHVybiB0KnQqdCplfSkodCxpKX15cHQucHJvdG90eXBlLmlzQ2F0bXVsbFJvbUN1cnZlMz0hMDtjbGFzcyB2cHQgZXh0ZW5kcyBkcHR7Y29uc3RydWN0b3IodD1uZXcgUWl0LGU9bmV3IFFpdCxuPW5ldyBRaXQsbz1uZXcgUWl0KXtzdXBlcigpLHRoaXMudHlwZT0iQ3ViaWNCZXppZXJDdXJ2ZSIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW4sdGhpcy52Mz1vfWdldFBvaW50KHQsZT1uZXcgUWl0KXtjb25zdCBuPWUsbz10aGlzLnYwLGk9dGhpcy52MSxhPXRoaXMudjIscj10aGlzLnYzO3JldHVybiBuLnNldChNcHQodCxvLngsaS54LGEueCxyLngpLE1wdCh0LG8ueSxpLnksYS55LHIueSkpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYwLmNvcHkodC52MCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzLnYzLmNvcHkodC52MyksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0LnYzPXRoaXMudjMudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjAuZnJvbUFycmF5KHQudjApLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXMudjMuZnJvbUFycmF5KHQudjMpLHRoaXN9fXZwdC5wcm90b3R5cGUuaXNDdWJpY0JlemllckN1cnZlPSEwO2NsYXNzIHhwdCBleHRlbmRzIGRwdHtjb25zdHJ1Y3Rvcih0PW5ldyBjYXQsZT1uZXcgY2F0LG49bmV3IGNhdCxvPW5ldyBjYXQpe3N1cGVyKCksdGhpcy50eXBlPSJDdWJpY0JlemllckN1cnZlMyIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPW4sdGhpcy52Mz1vfWdldFBvaW50KHQsZT1uZXcgY2F0KXtjb25zdCBuPWUsbz10aGlzLnYwLGk9dGhpcy52MSxhPXRoaXMudjIscj10aGlzLnYzO3JldHVybiBuLnNldChNcHQodCxvLngsaS54LGEueCxyLngpLE1wdCh0LG8ueSxpLnksYS55LHIueSksTXB0KHQsby56LGkueixhLnosci56KSksbn1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXMudjMuY29weSh0LnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHQudjM9dGhpcy52My50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpcy52My5mcm9tQXJyYXkodC52MyksdGhpc319eHB0LnByb3RvdHlwZS5pc0N1YmljQmV6aWVyQ3VydmUzPSEwO2NsYXNzIE9wdCBleHRlbmRzIGRwdHtjb25zdHJ1Y3Rvcih0PW5ldyBRaXQsZT1uZXcgUWl0KXtzdXBlcigpLHRoaXMudHlwZT0iTGluZUN1cnZlIix0aGlzLnYxPXQsdGhpcy52Mj1lfWdldFBvaW50KHQsZT1uZXcgUWl0KXtjb25zdCBuPWU7cmV0dXJuIDE9PT10P24uY29weSh0aGlzLnYyKToobi5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSxuLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLnYxKSksbn1nZXRQb2ludEF0KHQsZSl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQodCxlKX1nZXRUYW5nZW50KHQsZSl7Y29uc3Qgbj1lfHxuZXcgUWl0O3JldHVybiBuLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLm5vcm1hbGl6ZSgpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXN9fU9wdC5wcm90b3R5cGUuaXNMaW5lQ3VydmU9ITA7Y2xhc3MgUHB0IGV4dGVuZHMgZHB0e2NvbnN0cnVjdG9yKHQ9bmV3IFFpdCxlPW5ldyBRaXQsbj1uZXcgUWl0KXtzdXBlcigpLHRoaXMudHlwZT0iUXVhZHJhdGljQmV6aWVyQ3VydmUiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1ufWdldFBvaW50KHQsZT1uZXcgUWl0KXtjb25zdCBuPWUsbz10aGlzLnYwLGk9dGhpcy52MSxhPXRoaXMudjI7cmV0dXJuIG4uc2V0KENwdCh0LG8ueCxpLngsYS54KSxDcHQodCxvLnksaS55LGEueSkpLG59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYwLmNvcHkodC52MCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjAuZnJvbUFycmF5KHQudjApLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXN9fVBwdC5wcm90b3R5cGUuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZT0hMDtjbGFzcyB3cHQgZXh0ZW5kcyBkcHR7Y29uc3RydWN0b3IodD1uZXcgY2F0LGU9bmV3IGNhdCxuPW5ldyBjYXQpe3N1cGVyKCksdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1ufWdldFBvaW50KHQsZT1uZXcgY2F0KXtjb25zdCBuPWUsbz10aGlzLnYwLGk9dGhpcy52MSxhPXRoaXMudjI7cmV0dXJuIG4uc2V0KENwdCh0LG8ueCxpLngsYS54KSxDcHQodCxvLnksaS55LGEueSksQ3B0KHQsby56LGkueixhLnopKSxufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MC5jb3B5KHQudjApLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYwLmZyb21BcnJheSh0LnYwKSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX13cHQucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUzPSEwO2NsYXNzIGtwdCBleHRlbmRzIGRwdHtjb25zdHJ1Y3Rvcih0PVtdKXtzdXBlcigpLHRoaXMudHlwZT0iU3BsaW5lQ3VydmUiLHRoaXMucG9pbnRzPXR9Z2V0UG9pbnQodCxlPW5ldyBRaXQpe2NvbnN0IG49ZSxvPXRoaXMucG9pbnRzLGk9KG8ubGVuZ3RoLTEpKnQsYT1NYXRoLmZsb29yKGkpLHI9aS1hLHM9b1swPT09YT9hOmEtMV0sbD1vW2FdLGM9b1thPm8ubGVuZ3RoLTI/by5sZW5ndGgtMTphKzFdLGQ9b1thPm8ubGVuZ3RoLTM/by5sZW5ndGgtMTphKzJdO3JldHVybiBuLnNldChfcHQocixzLngsbC54LGMueCxkLngpLF9wdChyLHMueSxsLnksYy55LGQueSkpLG59Y29weSh0KXtzdXBlci5jb3B5KHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspdGhpcy5wb2ludHMucHVzaCh0LnBvaW50c1tlXS5jbG9uZSgpKTtyZXR1cm4gdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dGhpcy5wb2ludHMubGVuZ3RoO2U8bjtlKyspdC5wb2ludHMucHVzaCh0aGlzLnBvaW50c1tlXS50b0FycmF5KCkpO3JldHVybiB0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLG49dC5wb2ludHMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IG49dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaCgobmV3IFFpdCkuZnJvbUFycmF5KG4pKX1yZXR1cm4gdGhpc319a3B0LnByb3RvdHlwZS5pc1NwbGluZUN1cnZlPSEwO3ZhciBTcHQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQXJjQ3VydmU6bXB0LENhdG11bGxSb21DdXJ2ZTM6eXB0LEN1YmljQmV6aWVyQ3VydmU6dnB0LEN1YmljQmV6aWVyQ3VydmUzOnhwdCxFbGxpcHNlQ3VydmU6cHB0LExpbmVDdXJ2ZTpPcHQsTGluZUN1cnZlMzpjbGFzcyBleHRlbmRzIGRwdHtjb25zdHJ1Y3Rvcih0PW5ldyBjYXQsZT1uZXcgY2F0KXtzdXBlcigpLHRoaXMudHlwZT0iTGluZUN1cnZlMyIsdGhpcy5pc0xpbmVDdXJ2ZTM9ITAsdGhpcy52MT10LHRoaXMudjI9ZX1nZXRQb2ludCh0LGU9bmV3IGNhdCl7Y29uc3Qgbj1lO3JldHVybiAxPT09dD9uLmNvcHkodGhpcy52Mik6KG4uY29weSh0aGlzLnYyKS5zdWIodGhpcy52MSksbi5tdWx0aXBseVNjYWxhcih0KS5hZGQodGhpcy52MSkpLG59Z2V0UG9pbnRBdCh0LGUpe3JldHVybiB0aGlzLmdldFBvaW50KHQsZSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXN9fSxRdWFkcmF0aWNCZXppZXJDdXJ2ZTpQcHQsUXVhZHJhdGljQmV6aWVyQ3VydmUzOndwdCxTcGxpbmVDdXJ2ZTprcHR9KTtmdW5jdGlvbiBEcHQodCxlLG4sbyxpKXtsZXQgYSxyO2lmKGk9PT0oZnVuY3Rpb24gcyh0LGUsbixvKXtsZXQgaT0wO2ZvcihsZXQgYT1lLHI9bi1vO2E8bjthKz1vKWkrPSh0W3JdLXRbYV0pKih0W2ErMV0rdFtyKzFdKSxyPWE7cmV0dXJuIGl9KSh0LGUsbixvKT4wKWZvcihhPWU7YTxuO2ErPW8pcj1LcHQoYSx0W2FdLHRbYSsxXSxyKTtlbHNlIGZvcihhPW4tbzthPj1lO2EtPW8pcj1LcHQoYSx0W2FdLHRbYSsxXSxyKTtyZXR1cm4gciYmR3B0KHIsci5uZXh0KSYmKEpwdChyKSxyPXIubmV4dCkscn1mdW5jdGlvbiBFcHQodCxlKXtpZighdClyZXR1cm4gdDtlfHwoZT10KTtsZXQgbixvPXQ7ZG97aWYobj0hMSxvLnN0ZWluZXJ8fCFHcHQobyxvLm5leHQpJiYwIT09VXB0KG8ucHJldixvLG8ubmV4dCkpbz1vLm5leHQ7ZWxzZXtpZihKcHQobyksbz1lPW8ucHJldixvPT09by5uZXh0KWJyZWFrO249ITB9fXdoaWxlKG58fG8hPT1lKTtyZXR1cm4gZX1mdW5jdGlvbiBScHQodCxlLG4sbyxpLGEscil7aWYoIXQpcmV0dXJuOyFyJiZhJiYoZnVuY3Rpb24gcyh0LGUsbixvKXtsZXQgaT10O2Rve251bGw9PT1pLnomJihpLno9THB0KGkueCxpLnksZSxuLG8pKSxpLnByZXZaPWkucHJldixpLm5leHRaPWkubmV4dCxpPWkubmV4dH13aGlsZShpIT09dCk7aS5wcmV2Wi5uZXh0Wj1udWxsLGkucHJldlo9bnVsbCwoZnVuY3Rpb24gYSh0KXtsZXQgZSxuLG8saSxhLHIscyxsLGM9MTtkb3tmb3Iobj10LHQ9bnVsbCxhPW51bGwscj0wO247KXtmb3IocisrLG89bixzPTAsZT0wO2U8YyYmKHMrKyxvPW8ubmV4dFosbyk7ZSsrKTtmb3IobD1jO3M+MHx8bD4wJiZvOykwIT09cyYmKDA9PT1sfHwhb3x8bi56PD1vLnopPyhpPW4sbj1uLm5leHRaLHMtLSk6KGk9byxvPW8ubmV4dFosbC0tKSxhP2EubmV4dFo9aTp0PWksaS5wcmV2Wj1hLGE9aTtuPW99YS5uZXh0Wj1udWxsLGMqPTJ9d2hpbGUocj4xKX0pKGkpfSkodCxvLGksYSk7bGV0IGwsYyxkPXQ7Zm9yKDt0LnByZXYhPT10Lm5leHQ7KWlmKGw9dC5wcmV2LGM9dC5uZXh0LGE/VHB0KHQsbyxpLGEpOkFwdCh0KSllLnB1c2gobC5pL24pLGUucHVzaCh0LmkvbiksZS5wdXNoKGMuaS9uKSxKcHQodCksdD1jLm5leHQsZD1jLm5leHQ7ZWxzZSBpZigodD1jKT09PWQpe3I/MT09PXI/UnB0KHQ9TnB0KEVwdCh0KSxlLG4pLGUsbixvLGksYSwyKToyPT09ciYmenB0KHQsZSxuLG8saSxhKTpScHQoRXB0KHQpLGUsbixvLGksYSwxKTticmVha319ZnVuY3Rpb24gQXB0KHQpe2NvbnN0IGU9dC5wcmV2LG49dCxvPXQubmV4dDtpZihVcHQoZSxuLG8pPj0wKXJldHVybiExO2xldCBpPXQubmV4dC5uZXh0O2Zvcig7aSE9PXQucHJldjspe2lmKFZwdChlLngsZS55LG4ueCxuLnksby54LG8ueSxpLngsaS55KSYmVXB0KGkucHJldixpLGkubmV4dCk+PTApcmV0dXJuITE7aT1pLm5leHR9cmV0dXJuITB9ZnVuY3Rpb24gVHB0KHQsZSxuLG8pe2NvbnN0IGk9dC5wcmV2LGE9dCxyPXQubmV4dDtpZihVcHQoaSxhLHIpPj0wKXJldHVybiExO2NvbnN0IHM9aS54PmEueD9pLng+ci54P2kueDpyLng6YS54PnIueD9hLng6ci54LGw9aS55PmEueT9pLnk+ci55P2kueTpyLnk6YS55PnIueT9hLnk6ci55LGM9THB0KGkueDxhLng/aS54PHIueD9pLng6ci54OmEueDxyLng/YS54OnIueCxpLnk8YS55P2kueTxyLnk/aS55OnIueTphLnk8ci55P2EueTpyLnksZSxuLG8pLGQ9THB0KHMsbCxlLG4sbyk7bGV0IHA9dC5wcmV2WixtPXQubmV4dFo7Zm9yKDtwJiZwLno+PWMmJm0mJm0uejw9ZDspe2lmKHAhPT10LnByZXYmJnAhPT10Lm5leHQmJlZwdChpLngsaS55LGEueCxhLnksci54LHIueSxwLngscC55KSYmVXB0KHAucHJldixwLHAubmV4dCk+PTApcmV0dXJuITE7aWYocD1wLnByZXZaLG0hPT10LnByZXYmJm0hPT10Lm5leHQmJlZwdChpLngsaS55LGEueCxhLnksci54LHIueSxtLngsbS55KSYmVXB0KG0ucHJldixtLG0ubmV4dCk+PTApcmV0dXJuITE7bT1tLm5leHRafWZvcig7cCYmcC56Pj1jOyl7aWYocCE9PXQucHJldiYmcCE9PXQubmV4dCYmVnB0KGkueCxpLnksYS54LGEueSxyLngsci55LHAueCxwLnkpJiZVcHQocC5wcmV2LHAscC5uZXh0KT49MClyZXR1cm4hMTtwPXAucHJldlp9Zm9yKDttJiZtLno8PWQ7KXtpZihtIT09dC5wcmV2JiZtIT09dC5uZXh0JiZWcHQoaS54LGkueSxhLngsYS55LHIueCxyLnksbS54LG0ueSkmJlVwdChtLnByZXYsbSxtLm5leHQpPj0wKXJldHVybiExO209bS5uZXh0Wn1yZXR1cm4hMH1mdW5jdGlvbiBOcHQodCxlLG4pe2xldCBvPXQ7ZG97Y29uc3QgaT1vLnByZXYsYT1vLm5leHQubmV4dDshR3B0KGksYSkmJldwdChpLG8sby5uZXh0LGEpJiZacHQoaSxhKSYmWnB0KGEsaSkmJihlLnB1c2goaS5pL24pLGUucHVzaChvLmkvbiksZS5wdXNoKGEuaS9uKSxKcHQobyksSnB0KG8ubmV4dCksbz10PWEpLG89by5uZXh0fXdoaWxlKG8hPT10KTtyZXR1cm4gRXB0KG8pfWZ1bmN0aW9uIHpwdCh0LGUsbixvLGksYSl7bGV0IHI9dDtkb3tsZXQgdD1yLm5leHQubmV4dDtmb3IoO3QhPT1yLnByZXY7KXtpZihyLmkhPT10LmkmJmpwdChyLHQpKXtsZXQgcz1YcHQocix0KTtyZXR1cm4gcj1FcHQocixyLm5leHQpLHM9RXB0KHMscy5uZXh0KSxScHQocixlLG4sbyxpLGEpLHZvaWQgUnB0KHMsZSxuLG8saSxhKX10PXQubmV4dH1yPXIubmV4dH13aGlsZShyIT09dCl9ZnVuY3Rpb24gSXB0KHQsZSl7cmV0dXJuIHQueC1lLnh9ZnVuY3Rpb24gSHB0KHQsZSl7aWYoZT0oZnVuY3Rpb24gbih0LGUpe2xldCBuPWU7Y29uc3Qgbz10LngsaT10Lnk7bGV0IGEscj0tMS8wO2Rve2lmKGk8PW4ueSYmaT49bi5uZXh0LnkmJm4ubmV4dC55IT09bi55KXtjb25zdCB0PW4ueCsoaS1uLnkpKihuLm5leHQueC1uLngpLyhuLm5leHQueS1uLnkpO2lmKHQ8PW8mJnQ+cil7aWYocj10LHQ9PT1vKXtpZihpPT09bi55KXJldHVybiBuO2lmKGk9PT1uLm5leHQueSlyZXR1cm4gbi5uZXh0fWE9bi54PG4ubmV4dC54P246bi5uZXh0fX1uPW4ubmV4dH13aGlsZShuIT09ZSk7aWYoIWEpcmV0dXJuIG51bGw7aWYobz09PXIpcmV0dXJuIGE7Y29uc3Qgcz1hLGw9YS54LGM9YS55O2xldCBkLHA9MS8wO249YTtkb3tvPj1uLngmJm4ueD49bCYmbyE9PW4ueCYmVnB0KGk8Yz9vOnIsaSxsLGMsaTxjP3I6byxpLG4ueCxuLnkpJiYoZD1NYXRoLmFicyhpLW4ueSkvKG8tbi54KSxacHQobix0KSYmKGQ8cHx8ZD09PXAmJihuLng+YS54fHxuLng9PT1hLngmJkZwdChhLG4pKSkmJihhPW4scD1kKSksbj1uLm5leHR9d2hpbGUobiE9PXMpO3JldHVybiBhfSkodCxlKSl7Y29uc3Qgbj1YcHQoZSx0KTtFcHQoZSxlLm5leHQpLEVwdChuLG4ubmV4dCl9fWZ1bmN0aW9uIEZwdCh0LGUpe3JldHVybiBVcHQodC5wcmV2LHQsZS5wcmV2KTwwJiZVcHQoZS5uZXh0LHQsdC5uZXh0KTwwfWZ1bmN0aW9uIExwdCh0LGUsbixvLGkpe3JldHVybih0PTE0MzE2NTU3NjUmKCh0PTg1ODk5MzQ1OSYoKHQ9MjUyNjQ1MTM1JigodD0xNjcxMTkzNSYoKHQ9MzI3NjcqKHQtbikqaSl8dDw8OCkpfHQ8PDQpKXx0PDwyKSl8dDw8MSkpfChlPTE0MzE2NTU3NjUmKChlPTg1ODk5MzQ1OSYoKGU9MjUyNjQ1MTM1JigoZT0xNjcxMTkzNSYoKGU9MzI3NjcqKGUtbykqaSl8ZTw8OCkpfGU8PDQpKXxlPDwyKSl8ZTw8MSkpPDwxfWZ1bmN0aW9uIEJwdCh0KXtsZXQgZT10LG49dDtkb3soZS54PG4ueHx8ZS54PT09bi54JiZlLnk8bi55KSYmKG49ZSksZT1lLm5leHR9d2hpbGUoZSE9PXQpO3JldHVybiBufWZ1bmN0aW9uIFZwdCh0LGUsbixvLGksYSxyLHMpe3JldHVybihpLXIpKihlLXMpLSh0LXIpKihhLXMpPj0wJiYodC1yKSooby1zKS0obi1yKSooZS1zKT49MCYmKG4tcikqKGEtcyktKGktcikqKG8tcyk+PTB9ZnVuY3Rpb24ganB0KHQsZSl7cmV0dXJuIHQubmV4dC5pIT09ZS5pJiZ0LnByZXYuaSE9PWUuaSYmIShmdW5jdGlvbiBuKHQsZSl7bGV0IG49dDtkb3tpZihuLmkhPT10LmkmJm4ubmV4dC5pIT09dC5pJiZuLmkhPT1lLmkmJm4ubmV4dC5pIT09ZS5pJiZXcHQobixuLm5leHQsdCxlKSlyZXR1cm4hMDtuPW4ubmV4dH13aGlsZShuIT09dCk7cmV0dXJuITF9KSh0LGUpJiYoWnB0KHQsZSkmJlpwdChlLHQpJiYoZnVuY3Rpb24gbyh0LGUpe2xldCBuPXQsbz0hMTtjb25zdCBpPSh0LngrZS54KS8yLGE9KHQueStlLnkpLzI7ZG97bi55PmEhPW4ubmV4dC55PmEmJm4ubmV4dC55IT09bi55JiZpPChuLm5leHQueC1uLngpKihhLW4ueSkvKG4ubmV4dC55LW4ueSkrbi54JiYobz0hbyksbj1uLm5leHR9d2hpbGUobiE9PXQpO3JldHVybiBvfSkodCxlKSYmKFVwdCh0LnByZXYsdCxlLnByZXYpfHxVcHQodCxlLnByZXYsZSkpfHxHcHQodCxlKSYmVXB0KHQucHJldix0LHQubmV4dCk+MCYmVXB0KGUucHJldixlLGUubmV4dCk+MCl9ZnVuY3Rpb24gVXB0KHQsZSxuKXtyZXR1cm4oZS55LXQueSkqKG4ueC1lLngpLShlLngtdC54KSoobi55LWUueSl9ZnVuY3Rpb24gR3B0KHQsZSl7cmV0dXJuIHQueD09PWUueCYmdC55PT09ZS55fWZ1bmN0aW9uIFdwdCh0LGUsbixvKXtjb25zdCBpPXFwdChVcHQodCxlLG4pKSxhPXFwdChVcHQodCxlLG8pKSxyPXFwdChVcHQobixvLHQpKSxzPXFwdChVcHQobixvLGUpKTtyZXR1cm4gaSE9PWEmJnIhPT1zfHwhKDAhPT1pfHwhWXB0KHQsbixlKSl8fCEoMCE9PWF8fCFZcHQodCxvLGUpKXx8ISgwIT09cnx8IVlwdChuLHQsbykpfHwhKDAhPT1zfHwhWXB0KG4sZSxvKSl9ZnVuY3Rpb24gWXB0KHQsZSxuKXtyZXR1cm4gZS54PD1NYXRoLm1heCh0Lngsbi54KSYmZS54Pj1NYXRoLm1pbih0Lngsbi54KSYmZS55PD1NYXRoLm1heCh0Lnksbi55KSYmZS55Pj1NYXRoLm1pbih0Lnksbi55KX1mdW5jdGlvbiBxcHQodCl7cmV0dXJuIHQ+MD8xOnQ8MD8tMTowfWZ1bmN0aW9uIFpwdCh0LGUpe3JldHVybiBVcHQodC5wcmV2LHQsdC5uZXh0KTwwP1VwdCh0LGUsdC5uZXh0KT49MCYmVXB0KHQsdC5wcmV2LGUpPj0wOlVwdCh0LGUsdC5wcmV2KTwwfHxVcHQodCx0Lm5leHQsZSk8MH1mdW5jdGlvbiBYcHQodCxlKXtjb25zdCBuPW5ldyBRcHQodC5pLHQueCx0LnkpLG89bmV3IFFwdChlLmksZS54LGUueSksaT10Lm5leHQsYT1lLnByZXY7cmV0dXJuIHQubmV4dD1lLGUucHJldj10LG4ubmV4dD1pLGkucHJldj1uLG8ubmV4dD1uLG4ucHJldj1vLGEubmV4dD1vLG8ucHJldj1hLG99ZnVuY3Rpb24gS3B0KHQsZSxuLG8pe2NvbnN0IGk9bmV3IFFwdCh0LGUsbik7cmV0dXJuIG8/KGkubmV4dD1vLm5leHQsaS5wcmV2PW8sby5uZXh0LnByZXY9aSxvLm5leHQ9aSk6KGkucHJldj1pLGkubmV4dD1pKSxpfWZ1bmN0aW9uIEpwdCh0KXt0Lm5leHQucHJldj10LnByZXYsdC5wcmV2Lm5leHQ9dC5uZXh0LHQucHJldlomJih0LnByZXZaLm5leHRaPXQubmV4dFopLHQubmV4dFomJih0Lm5leHRaLnByZXZaPXQucHJldlopfWZ1bmN0aW9uIFFwdCh0LGUsbil7dGhpcy5pPXQsdGhpcy54PWUsdGhpcy55PW4sdGhpcy5wcmV2PW51bGwsdGhpcy5uZXh0PW51bGwsdGhpcy56PW51bGwsdGhpcy5wcmV2Wj1udWxsLHRoaXMubmV4dFo9bnVsbCx0aGlzLnN0ZWluZXI9ITF9Y2xhc3MgJHB0e3N0YXRpYyBhcmVhKHQpe2NvbnN0IGU9dC5sZW5ndGg7bGV0IG49MDtmb3IobGV0IG89ZS0xLGk9MDtpPGU7bz1pKyspbis9dFtvXS54KnRbaV0ueS10W2ldLngqdFtvXS55O3JldHVybi41Km59c3RhdGljIGlzQ2xvY2tXaXNlKHQpe3JldHVybiAkcHQuYXJlYSh0KTwwfXN0YXRpYyB0cmlhbmd1bGF0ZVNoYXBlKHQsZSl7Y29uc3Qgbj1bXSxvPVtdLGk9W107dG10KHQpLGVtdChuLHQpO2xldCBhPXQubGVuZ3RoO2UuZm9yRWFjaCh0bXQpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKW8ucHVzaChhKSxhKz1lW3RdLmxlbmd0aCxlbXQobixlW3RdKTtjb25zdCByPShmdW5jdGlvbih0LGUsbj0yKXtjb25zdCBvPWUmJmUubGVuZ3RoLGk9bz9lWzBdKm46dC5sZW5ndGg7bGV0IGE9RHB0KHQsMCxpLG4sITApO2NvbnN0IHI9W107aWYoIWF8fGEubmV4dD09PWEucHJldilyZXR1cm4gcjtsZXQgcyxsLGMsZCxwLG0sdTtpZihvJiYoYT0oZnVuY3Rpb24gZih0LGUsbixvKXtjb25zdCBpPVtdO2xldCBhLHIscyxsLGM7Zm9yKGE9MCxyPWUubGVuZ3RoO2E8cjthKyspcz1lW2FdKm8sbD1hPHItMT9lW2ErMV0qbzp0Lmxlbmd0aCxjPURwdCh0LHMsbCxvLCExKSxjPT09Yy5uZXh0JiYoYy5zdGVpbmVyPSEwKSxpLnB1c2goQnB0KGMpKTtmb3IoaS5zb3J0KElwdCksYT0wO2E8aS5sZW5ndGg7YSsrKUhwdChpW2FdLG4pLG49RXB0KG4sbi5uZXh0KTtyZXR1cm4gbn0pKHQsZSxhLG4pKSx0Lmxlbmd0aD44MCpuKXtzPWM9dFswXSxsPWQ9dFsxXTtmb3IobGV0IGU9bjtlPGk7ZSs9bilwPXRbZV0sbT10W2UrMV0scDxzJiYocz1wKSxtPGwmJihsPW0pLHA+YyYmKGM9cCksbT5kJiYoZD1tKTt1PU1hdGgubWF4KGMtcyxkLWwpLHU9MCE9PXU/MS91OjB9cmV0dXJuIFJwdChhLHIsbixzLGwsdSkscn0pKG4sbyk7Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0Kz0zKWkucHVzaChyLnNsaWNlKHQsdCszKSk7cmV0dXJuIGl9fWZ1bmN0aW9uIHRtdCh0KXtjb25zdCBlPXQubGVuZ3RoO2U+MiYmdFtlLTFdLmVxdWFscyh0WzBdKSYmdC5wb3AoKX1mdW5jdGlvbiBlbXQodCxlKXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl0LnB1c2goZVtuXS54KSx0LnB1c2goZVtuXS55KX1jbGFzcyBubXQgZXh0ZW5kcyBxcnR7Y29uc3RydWN0b3IodCxlKXtzdXBlcigpLHRoaXMudHlwZT0iRXh0cnVkZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3NoYXBlczp0LG9wdGlvbnM6ZX0sdD1BcnJheS5pc0FycmF5KHQpP3Q6W3RdO2NvbnN0IG49dGhpcyxvPVtdLGk9W107Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKWEodFtlXSk7ZnVuY3Rpb24gYSh0KXtjb25zdCBhPVtdLHI9dm9pZCAwIT09ZS5jdXJ2ZVNlZ21lbnRzP2UuY3VydmVTZWdtZW50czoxMixzPXZvaWQgMCE9PWUuc3RlcHM/ZS5zdGVwczoxO2xldCBsPXZvaWQgMCE9PWUuZGVwdGg/ZS5kZXB0aDoxMDAsYz12b2lkIDA9PT1lLmJldmVsRW5hYmxlZHx8ZS5iZXZlbEVuYWJsZWQsZD12b2lkIDAhPT1lLmJldmVsVGhpY2tuZXNzP2UuYmV2ZWxUaGlja25lc3M6NixwPXZvaWQgMCE9PWUuYmV2ZWxTaXplP2UuYmV2ZWxTaXplOmQtMixtPXZvaWQgMCE9PWUuYmV2ZWxPZmZzZXQ/ZS5iZXZlbE9mZnNldDowLHU9dm9pZCAwIT09ZS5iZXZlbFNlZ21lbnRzP2UuYmV2ZWxTZWdtZW50czozO2NvbnN0IGY9ZS5leHRydWRlUGF0aCxnPXZvaWQgMCE9PWUuVVZHZW5lcmF0b3I/ZS5VVkdlbmVyYXRvcjpvbXQ7dm9pZCAwIT09ZS5hbW91bnQmJihjb25zb2xlLndhcm4oIlRIUkVFLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogYW1vdW50IGhhcyBiZWVuIHJlbmFtZWQgdG8gZGVwdGguIiksbD1lLmFtb3VudCk7bGV0IGgsYix5LF8sQyxNPSExO2YmJihoPWYuZ2V0U3BhY2VkUG9pbnRzKHMpLE09ITAsYz0hMSxiPWYuY29tcHV0ZUZyZW5ldEZyYW1lcyhzLCExKSx5PW5ldyBjYXQsXz1uZXcgY2F0LEM9bmV3IGNhdCksY3x8KHU9MCxkPTAscD0wLG09MCk7Y29uc3Qgdj10LmV4dHJhY3RQb2ludHMocik7bGV0IHg9di5zaGFwZTtjb25zdCBPPXYuaG9sZXM7aWYoISRwdC5pc0Nsb2NrV2lzZSh4KSl7eD14LnJldmVyc2UoKTtmb3IobGV0IHQ9MCxlPU8ubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9T1t0XTskcHQuaXNDbG9ja1dpc2UoZSkmJihPW3RdPWUucmV2ZXJzZSgpKX19Y29uc3QgUD0kcHQudHJpYW5ndWxhdGVTaGFwZSh4LE8pLHc9eDtmb3IobGV0IHQ9MCxlPU8ubGVuZ3RoO3Q8ZTt0KyspeD14LmNvbmNhdChPW3RdKTtmdW5jdGlvbiBrKHQsZSxuKXtyZXR1cm4gZXx8Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiB2ZWMgZG9lcyBub3QgZXhpc3QiKSxlLmNsb25lKCkubXVsdGlwbHlTY2FsYXIobikuYWRkKHQpfWNvbnN0IFM9eC5sZW5ndGgsRD1QLmxlbmd0aDtmdW5jdGlvbiBFKHQsZSxuKXtsZXQgbyxpLGE7Y29uc3Qgcj10LngtZS54LHM9dC55LWUueSxsPW4ueC10LngsYz1uLnktdC55LGQ9cipyK3MqcztpZihNYXRoLmFicyhyKmMtcypsKT5OdW1iZXIuRVBTSUxPTil7Y29uc3QgcD1NYXRoLnNxcnQoZCksbT1NYXRoLnNxcnQobCpsK2MqYyksdT1lLngtcy9wLGY9ZS55K3IvcCxnPSgobi54LWMvbS11KSpjLShuLnkrbC9tLWYpKmwpLyhyKmMtcypsKTtvPXUrcipnLXQueCxpPWYrcypnLXQueTtjb25zdCBoPW8qbytpKmk7aWYoaDw9MilyZXR1cm4gbmV3IFFpdChvLGkpO2E9TWF0aC5zcXJ0KGgvMil9ZWxzZXtsZXQgdD0hMTtyPk51bWJlci5FUFNJTE9OP2w+TnVtYmVyLkVQU0lMT04mJih0PSEwKTpyPC1OdW1iZXIuRVBTSUxPTj9sPC1OdW1iZXIuRVBTSUxPTiYmKHQ9ITApOk1hdGguc2lnbihzKT09PU1hdGguc2lnbihjKSYmKHQ9ITApLHQ/KG89LXMsaT1yLGE9TWF0aC5zcXJ0KGQpKToobz1yLGk9cyxhPU1hdGguc3FydChkLzIpKX1yZXR1cm4gbmV3IFFpdChvL2EsaS9hKX1jb25zdCBSPVtdO2ZvcihsZXQgdD0wLGU9dy5sZW5ndGgsbj1lLTEsbz10KzE7dDxlO3QrKyxuKyssbysrKW49PT1lJiYobj0wKSxvPT09ZSYmKG89MCksUlt0XT1FKHdbdF0sd1tuXSx3W29dKTtjb25zdCBBPVtdO2xldCBULE49Ui5jb25jYXQoKTtmb3IobGV0IHQ9MCxlPU8ubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9T1t0XTtUPVtdO2ZvcihsZXQgdD0wLG49ZS5sZW5ndGgsbz1uLTEsaT10KzE7dDxuO3QrKyxvKyssaSsrKW89PT1uJiYobz0wKSxpPT09biYmKGk9MCksVFt0XT1FKGVbdF0sZVtvXSxlW2ldKTtBLnB1c2goVCksTj1OLmNvbmNhdChUKX1mb3IobGV0IHQ9MDt0PHU7dCsrKXtjb25zdCBlPXQvdSxuPWQqTWF0aC5jb3MoZSpNYXRoLlBJLzIpLG89cCpNYXRoLnNpbihlKk1hdGguUEkvMikrbTtmb3IobGV0IHQ9MCxlPXcubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9ayh3W3RdLFJbdF0sbyk7SChlLngsZS55LC1uKX1mb3IobGV0IHQ9MCxlPU8ubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9T1t0XTtUPUFbdF07Zm9yKGxldCB0PTAsaT1lLmxlbmd0aDt0PGk7dCsrKXtjb25zdCBpPWsoZVt0XSxUW3RdLG8pO0goaS54LGkueSwtbil9fX1jb25zdCB6PXArbTtmb3IobGV0IHQ9MDt0PFM7dCsrKXtjb25zdCBlPWM/ayh4W3RdLE5bdF0seik6eFt0XTtNPyhfLmNvcHkoYi5ub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcihlLngpLHkuY29weShiLmJpbm9ybWFsc1swXSkubXVsdGlwbHlTY2FsYXIoZS55KSxDLmNvcHkoaFswXSkuYWRkKF8pLmFkZCh5KSxIKEMueCxDLnksQy56KSk6SChlLngsZS55LDApfWZvcihsZXQgdD0xO3Q8PXM7dCsrKWZvcihsZXQgZT0wO2U8UztlKyspe2NvbnN0IG49Yz9rKHhbZV0sTltlXSx6KTp4W2VdO00/KF8uY29weShiLm5vcm1hbHNbdF0pLm11bHRpcGx5U2NhbGFyKG4ueCkseS5jb3B5KGIuYmlub3JtYWxzW3RdKS5tdWx0aXBseVNjYWxhcihuLnkpLEMuY29weShoW3RdKS5hZGQoXykuYWRkKHkpLEgoQy54LEMueSxDLnopKTpIKG4ueCxuLnksbC9zKnQpfWZvcihsZXQgdD11LTE7dD49MDt0LS0pe2NvbnN0IGU9dC91LG49ZCpNYXRoLmNvcyhlKk1hdGguUEkvMiksbz1wKk1hdGguc2luKGUqTWF0aC5QSS8yKSttO2ZvcihsZXQgdD0wLGU9dy5sZW5ndGg7dDxlO3QrKyl7Y29uc3QgZT1rKHdbdF0sUlt0XSxvKTtIKGUueCxlLnksbCtuKX1mb3IobGV0IHQ9MCxlPU8ubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9T1t0XTtUPUFbdF07Zm9yKGxldCB0PTAsaT1lLmxlbmd0aDt0PGk7dCsrKXtjb25zdCBpPWsoZVt0XSxUW3RdLG8pO00/SChpLngsaS55K2hbcy0xXS55LGhbcy0xXS54K24pOkgoaS54LGkueSxsK24pfX19ZnVuY3Rpb24gSSh0LGUpe2xldCBuPXQubGVuZ3RoO2Zvcig7LS1uPj0wOyl7Y29uc3Qgbz1uO2xldCBpPW4tMTtpPDAmJihpPXQubGVuZ3RoLTEpO2ZvcihsZXQgdD0wLG49cysyKnU7dDxuO3QrKyl7Y29uc3Qgbj1TKnQsYT1TKih0KzEpO0woZStvK24sZStpK24sZStpK2EsZStvK2EpfX19ZnVuY3Rpb24gSCh0LGUsbil7YS5wdXNoKHQpLGEucHVzaChlKSxhLnB1c2gobil9ZnVuY3Rpb24gRih0LGUsaSl7Qih0KSxCKGUpLEIoaSk7Y29uc3QgYT1vLmxlbmd0aC8zLHI9Zy5nZW5lcmF0ZVRvcFVWKG4sbyxhLTMsYS0yLGEtMSk7VihyWzBdKSxWKHJbMV0pLFYoclsyXSl9ZnVuY3Rpb24gTCh0LGUsaSxhKXtCKHQpLEIoZSksQihhKSxCKGUpLEIoaSksQihhKTtjb25zdCByPW8ubGVuZ3RoLzMscz1nLmdlbmVyYXRlU2lkZVdhbGxVVihuLG8sci02LHItMyxyLTIsci0xKTtWKHNbMF0pLFYoc1sxXSksVihzWzNdKSxWKHNbMV0pLFYoc1syXSksVihzWzNdKX1mdW5jdGlvbiBCKHQpe28ucHVzaChhWzMqdCswXSksby5wdXNoKGFbMyp0KzFdKSxvLnB1c2goYVszKnQrMl0pfWZ1bmN0aW9uIFYodCl7aS5wdXNoKHQueCksaS5wdXNoKHQueSl9IShmdW5jdGlvbiBqKCl7Y29uc3QgdD1vLmxlbmd0aC8zO2lmKGMpe2xldCB0PTAsZT1TKnQ7Zm9yKGxldCB0PTA7dDxEO3QrKyl7Y29uc3Qgbj1QW3RdO0YoblsyXStlLG5bMV0rZSxuWzBdK2UpfXQ9cysyKnUsZT1TKnQ7Zm9yKGxldCB0PTA7dDxEO3QrKyl7Y29uc3Qgbj1QW3RdO0YoblswXStlLG5bMV0rZSxuWzJdK2UpfX1lbHNle2ZvcihsZXQgdD0wO3Q8RDt0Kyspe2NvbnN0IGU9UFt0XTtGKGVbMl0sZVsxXSxlWzBdKX1mb3IobGV0IHQ9MDt0PEQ7dCsrKXtjb25zdCBlPVBbdF07RihlWzBdK1MqcyxlWzFdK1MqcyxlWzJdK1Mqcyl9fW4uYWRkR3JvdXAodCxvLmxlbmd0aC8zLXQsMCl9KSgpLChmdW5jdGlvbiBVKCl7Y29uc3QgdD1vLmxlbmd0aC8zO2xldCBlPTA7SSh3LGUpLGUrPXcubGVuZ3RoO2ZvcihsZXQgdD0wLG49Ty5sZW5ndGg7dDxuO3QrKyl7Y29uc3Qgbj1PW3RdO0kobixlKSxlKz1uLmxlbmd0aH1uLmFkZEdyb3VwKHQsby5sZW5ndGgvMy10LDEpfSkoKX10aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBGcnQobywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgRnJ0KGksMikpLHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKX10b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybihmdW5jdGlvbiBlKHQsbixvKXtpZihvLnNoYXBlcz1bXSxBcnJheS5pc0FycmF5KHQpKWZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKylvLnNoYXBlcy5wdXNoKHRbZV0udXVpZCk7ZWxzZSBvLnNoYXBlcy5wdXNoKHQudXVpZCk7cmV0dXJuIHZvaWQgMCE9PW4uZXh0cnVkZVBhdGgmJihvLm9wdGlvbnMuZXh0cnVkZVBhdGg9bi5leHRydWRlUGF0aC50b0pTT04oKSksb30pKHRoaXMucGFyYW1ldGVycy5zaGFwZXMsdGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnMsdCl9c3RhdGljIGZyb21KU09OKHQsZSl7Y29uc3Qgbj1bXTtmb3IobGV0IG89MCxpPXQuc2hhcGVzLmxlbmd0aDtvPGk7bysrKW4ucHVzaChlW3Quc2hhcGVzW29dXSk7Y29uc3Qgbz10Lm9wdGlvbnMuZXh0cnVkZVBhdGg7cmV0dXJuIHZvaWQgMCE9PW8mJih0Lm9wdGlvbnMuZXh0cnVkZVBhdGg9KG5ldyBTcHRbby50eXBlXSkuZnJvbUpTT04obykpLG5ldyBubXQobix0Lm9wdGlvbnMpfX1jb25zdCBvbXQ9e2dlbmVyYXRlVG9wVVY6ZnVuY3Rpb24odCxlLG4sbyxpKXtjb25zdCBhPWVbMypvXSxyPWVbMypvKzFdLHM9ZVszKmldLGw9ZVszKmkrMV07cmV0dXJuW25ldyBRaXQoZVszKm5dLGVbMypuKzFdKSxuZXcgUWl0KGEsciksbmV3IFFpdChzLGwpXX0sZ2VuZXJhdGVTaWRlV2FsbFVWOmZ1bmN0aW9uKHQsZSxuLG8saSxhKXtjb25zdCByPWVbMypuXSxzPWVbMypuKzFdLGw9ZVszKm4rMl0sYz1lWzMqb10sZD1lWzMqbysxXSxwPWVbMypvKzJdLG09ZVszKmldLHU9ZVszKmkrMV0sZj1lWzMqaSsyXSxnPWVbMyphXSxoPWVbMyphKzFdLGI9ZVszKmErMl07cmV0dXJuIE1hdGguYWJzKHMtZCk8TWF0aC5hYnMoci1jKT9bbmV3IFFpdChyLDEtbCksbmV3IFFpdChjLDEtcCksbmV3IFFpdChtLDEtZiksbmV3IFFpdChnLDEtYildOltuZXcgUWl0KHMsMS1sKSxuZXcgUWl0KGQsMS1wKSxuZXcgUWl0KHUsMS1mKSxuZXcgUWl0KGgsMS1iKV19fTtjbGFzcyBpbXQgZXh0ZW5kcyBxcnR7Y29uc3RydWN0b3IodCxlPTEyKXtzdXBlcigpLHRoaXMudHlwZT0iU2hhcGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6dCxjdXJ2ZVNlZ21lbnRzOmV9O2NvbnN0IG49W10sbz1bXSxpPVtdLGE9W107bGV0IHI9MCxzPTA7aWYoITE9PT1BcnJheS5pc0FycmF5KHQpKWwodCk7ZWxzZSBmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKylsKHRbZV0pLHRoaXMuYWRkR3JvdXAocixzLGUpLHIrPXMscz0wO2Z1bmN0aW9uIGwodCl7Y29uc3Qgcj1vLmxlbmd0aC8zLGw9dC5leHRyYWN0UG9pbnRzKGUpO2xldCBjPWwuc2hhcGU7Y29uc3QgZD1sLmhvbGVzOyExPT09JHB0LmlzQ2xvY2tXaXNlKGMpJiYoYz1jLnJldmVyc2UoKSk7Zm9yKGxldCB0PTAsZT1kLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPWRbdF07ITA9PT0kcHQuaXNDbG9ja1dpc2UoZSkmJihkW3RdPWUucmV2ZXJzZSgpKX1jb25zdCBwPSRwdC50cmlhbmd1bGF0ZVNoYXBlKGMsZCk7Zm9yKGxldCB0PTAsZT1kLmxlbmd0aDt0PGU7dCsrKWM9Yy5jb25jYXQoZFt0XSk7Zm9yKGxldCB0PTAsZT1jLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPWNbdF07by5wdXNoKGUueCxlLnksMCksaS5wdXNoKDAsMCwxKSxhLnB1c2goZS54LGUueSl9Zm9yKGxldCB0PTAsZT1wLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPXBbdF07bi5wdXNoKGVbMF0rcixlWzFdK3IsZVsyXStyKSxzKz0zfX10aGlzLnNldEluZGV4KG4pLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IEZydChvLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgRnJ0KGksMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IEZydChhLDIpKX10b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybihmdW5jdGlvbiBlKHQsbil7aWYobi5zaGFwZXM9W10sQXJyYXkuaXNBcnJheSh0KSlmb3IobGV0IGU9MCxvPXQubGVuZ3RoO2U8bztlKyspbi5zaGFwZXMucHVzaCh0W2VdLnV1aWQpO2Vsc2Ugbi5zaGFwZXMucHVzaCh0LnV1aWQpO3JldHVybiBufSkodGhpcy5wYXJhbWV0ZXJzLnNoYXBlcyx0KX1zdGF0aWMgZnJvbUpTT04odCxlKXtjb25zdCBuPVtdO2ZvcihsZXQgbz0wLGk9dC5zaGFwZXMubGVuZ3RoO288aTtvKyspbi5wdXNoKGVbdC5zaGFwZXNbb11dKTtyZXR1cm4gbmV3IGltdChuLHQuY3VydmVTZWdtZW50cyl9fShjbGFzcyBleHRlbmRzIE9ydHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iU2hhZG93TWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IFJydCgwKSx0aGlzLnRyYW5zcGFyZW50PSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXN9fSkucHJvdG90eXBlLmlzU2hhZG93TWF0ZXJpYWw9ITA7Y2xhc3MgYW10IGV4dGVuZHMgT3J0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIn0sdGhpcy50eXBlPSJNZXNoU3RhbmRhcmRNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgUnJ0KDE2Nzc3MjE1KSx0aGlzLnJvdWdobmVzcz0xLHRoaXMubWV0YWxuZXNzPTAsdGhpcy5tYXA9bnVsbCx0aGlzLmxpZ2h0TWFwPW51bGwsdGhpcy5saWdodE1hcEludGVuc2l0eT0xLHRoaXMuYW9NYXA9bnVsbCx0aGlzLmFvTWFwSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZT1uZXcgUnJ0KDApLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlTWFwPW51bGwsdGhpcy5idW1wTWFwPW51bGwsdGhpcy5idW1wU2NhbGU9MSx0aGlzLm5vcm1hbE1hcD1udWxsLHRoaXMubm9ybWFsTWFwVHlwZT0wLHRoaXMubm9ybWFsU2NhbGU9bmV3IFFpdCgxLDEpLHRoaXMuZGlzcGxhY2VtZW50TWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz0wLHRoaXMucm91Z2huZXNzTWFwPW51bGwsdGhpcy5tZXRhbG5lc3NNYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5lbnZNYXA9bnVsbCx0aGlzLmVudk1hcEludGVuc2l0eT0xLHRoaXMucmVmcmFjdGlvblJhdGlvPS45OCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiLHRoaXMud2lyZWZyYW1lTGluZWpvaW49InJvdW5kIix0aGlzLmZsYXRTaGFkaW5nPSExLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIn0sdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMucm91Z2huZXNzPXQucm91Z2huZXNzLHRoaXMubWV0YWxuZXNzPXQubWV0YWxuZXNzLHRoaXMubWFwPXQubWFwLHRoaXMubGlnaHRNYXA9dC5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD10LmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSx0aGlzLmVtaXNzaXZlLmNvcHkodC5lbWlzc2l2ZSksdGhpcy5lbWlzc2l2ZU1hcD10LmVtaXNzaXZlTWFwLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9dC5lbWlzc2l2ZUludGVuc2l0eSx0aGlzLmJ1bXBNYXA9dC5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPXQuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPXQubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMucm91Z2huZXNzTWFwPXQucm91Z2huZXNzTWFwLHRoaXMubWV0YWxuZXNzTWFwPXQubWV0YWxuZXNzTWFwLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLmVudk1hcD10LmVudk1hcCx0aGlzLmVudk1hcEludGVuc2l0eT10LmVudk1hcEludGVuc2l0eSx0aGlzLnJlZnJhY3Rpb25SYXRpbz10LnJlZnJhY3Rpb25SYXRpbyx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbix0aGlzLmZsYXRTaGFkaW5nPXQuZmxhdFNoYWRpbmcsdGhpc319YW10LnByb3RvdHlwZS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsPSEwLGNsYXNzIGV4dGVuZHMgYW10e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIixQSFlTSUNBTDoiIn0sdGhpcy50eXBlPSJNZXNoUGh5c2ljYWxNYXRlcmlhbCIsdGhpcy5jbGVhcmNvYXQ9MCx0aGlzLmNsZWFyY29hdE1hcD1udWxsLHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzPTAsdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXA9bnVsbCx0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlPW5ldyBRaXQoMSwxKSx0aGlzLmNsZWFyY29hdE5vcm1hbE1hcD1udWxsLHRoaXMucmVmbGVjdGl2aXR5PS41LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpb3IiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4oMSsuNCp0aGlzLnJlZmxlY3Rpdml0eSkvKDEtLjQqdGhpcy5yZWZsZWN0aXZpdHkpfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5yZWZsZWN0aXZpdHk9Wml0KDIuNSoodC0xKS8odCsxKSwwLDEpfX0pLHRoaXMuc2hlZW49bnVsbCx0aGlzLnRyYW5zbWlzc2lvbj0wLHRoaXMudHJhbnNtaXNzaW9uTWFwPW51bGwsdGhpcy50aGlja25lc3M9LjAxLHRoaXMudGhpY2tuZXNzTWFwPW51bGwsdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlPTAsdGhpcy5hdHRlbnVhdGlvblRpbnQ9bmV3IFJydCgxLDEsMSksdGhpcy5zcGVjdWxhckludGVuc2l0eT0xLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXA9bnVsbCx0aGlzLnNwZWN1bGFyVGludD1uZXcgUnJ0KDEsMSwxKSx0aGlzLnNwZWN1bGFyVGludE1hcD1udWxsLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIixQSFlTSUNBTDoiIn0sdGhpcy5jbGVhcmNvYXQ9dC5jbGVhcmNvYXQsdGhpcy5jbGVhcmNvYXRNYXA9dC5jbGVhcmNvYXRNYXAsdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3M9dC5jbGVhcmNvYXRSb3VnaG5lc3MsdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXA9dC5jbGVhcmNvYXRSb3VnaG5lc3NNYXAsdGhpcy5jbGVhcmNvYXROb3JtYWxNYXA9dC5jbGVhcmNvYXROb3JtYWxNYXAsdGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZS5jb3B5KHQuY2xlYXJjb2F0Tm9ybWFsU2NhbGUpLHRoaXMucmVmbGVjdGl2aXR5PXQucmVmbGVjdGl2aXR5LHRoaXMuc2hlZW49dC5zaGVlbj8odGhpcy5zaGVlbnx8bmV3IFJydCkuY29weSh0LnNoZWVuKTpudWxsLHRoaXMudHJhbnNtaXNzaW9uPXQudHJhbnNtaXNzaW9uLHRoaXMudHJhbnNtaXNzaW9uTWFwPXQudHJhbnNtaXNzaW9uTWFwLHRoaXMudGhpY2tuZXNzPXQudGhpY2tuZXNzLHRoaXMudGhpY2tuZXNzTWFwPXQudGhpY2tuZXNzTWFwLHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZT10LmF0dGVudWF0aW9uRGlzdGFuY2UsdGhpcy5hdHRlbnVhdGlvblRpbnQuY29weSh0LmF0dGVudWF0aW9uVGludCksdGhpcy5zcGVjdWxhckludGVuc2l0eT10LnNwZWN1bGFySW50ZW5zaXR5LHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXA9dC5zcGVjdWxhckludGVuc2l0eU1hcCx0aGlzLnNwZWN1bGFyVGludC5jb3B5KHQuc3BlY3VsYXJUaW50KSx0aGlzLnNwZWN1bGFyVGludE1hcD10LnNwZWN1bGFyVGludE1hcCx0aGlzfX0ucHJvdG90eXBlLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWw9ITAsY2xhc3MgZXh0ZW5kcyBPcnR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9Ik1lc2hQaG9uZ01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyBScnQoMTY3NzcyMTUpLHRoaXMuc3BlY3VsYXI9bmV3IFJydCgxMTE4NDgxKSx0aGlzLnNoaW5pbmVzcz0zMCx0aGlzLm1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlPW5ldyBScnQoMCksdGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmVNYXA9bnVsbCx0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPTAsdGhpcy5ub3JtYWxTY2FsZT1uZXcgUWl0KDEsMSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy5zcGVjdWxhck1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmVudk1hcD1udWxsLHRoaXMuY29tYmluZT0wLHRoaXMucmVmbGVjdGl2aXR5PTEsdGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4LHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuZmxhdFNoYWRpbmc9ITEsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5zcGVjdWxhci5jb3B5KHQuc3BlY3VsYXIpLHRoaXMuc2hpbmluZXNzPXQuc2hpbmluZXNzLHRoaXMubWFwPXQubWFwLHRoaXMubGlnaHRNYXA9dC5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD10LmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSx0aGlzLmVtaXNzaXZlLmNvcHkodC5lbWlzc2l2ZSksdGhpcy5lbWlzc2l2ZU1hcD10LmVtaXNzaXZlTWFwLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9dC5lbWlzc2l2ZUludGVuc2l0eSx0aGlzLmJ1bXBNYXA9dC5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPXQuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPXQubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMuc3BlY3VsYXJNYXA9dC5zcGVjdWxhck1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5lbnZNYXA9dC5lbnZNYXAsdGhpcy5jb21iaW5lPXQuY29tYmluZSx0aGlzLnJlZmxlY3Rpdml0eT10LnJlZmxlY3Rpdml0eSx0aGlzLnJlZnJhY3Rpb25SYXRpbz10LnJlZnJhY3Rpb25SYXRpbyx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbix0aGlzLmZsYXRTaGFkaW5nPXQuZmxhdFNoYWRpbmcsdGhpc319LnByb3RvdHlwZS5pc01lc2hQaG9uZ01hdGVyaWFsPSEwLGNsYXNzIGV4dGVuZHMgT3J0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5kZWZpbmVzPXtUT09OOiIifSx0aGlzLnR5cGU9Ik1lc2hUb29uTWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IFJydCgxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmdyYWRpZW50TWFwPW51bGwsdGhpcy5saWdodE1hcD1udWxsLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9MSx0aGlzLmFvTWFwPW51bGwsdGhpcy5hb01hcEludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmU9bmV3IFJydCgwKSx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZU1hcD1udWxsLHRoaXMuYnVtcE1hcD1udWxsLHRoaXMuYnVtcFNjYWxlPTEsdGhpcy5ub3JtYWxNYXA9bnVsbCx0aGlzLm5vcm1hbE1hcFR5cGU9MCx0aGlzLm5vcm1hbFNjYWxlPW5ldyBRaXQoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIix0aGlzLndpcmVmcmFtZUxpbmVqb2luPSJyb3VuZCIsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXA9dC5tYXAsdGhpcy5ncmFkaWVudE1hcD10LmdyYWRpZW50TWFwLHRoaXMubGlnaHRNYXA9dC5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD10LmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSx0aGlzLmVtaXNzaXZlLmNvcHkodC5lbWlzc2l2ZSksdGhpcy5lbWlzc2l2ZU1hcD10LmVtaXNzaXZlTWFwLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9dC5lbWlzc2l2ZUludGVuc2l0eSx0aGlzLmJ1bXBNYXA9dC5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPXQuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPXQubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbix0aGlzfX0ucHJvdG90eXBlLmlzTWVzaFRvb25NYXRlcmlhbD0hMCxjbGFzcyBleHRlbmRzIE9ydHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iTWVzaE5vcm1hbE1hdGVyaWFsIix0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPTAsdGhpcy5ub3JtYWxTY2FsZT1uZXcgUWl0KDEsMSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLmZvZz0hMSx0aGlzLmZsYXRTaGFkaW5nPSExLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5idW1wTWFwPXQuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT10LmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD10Lm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9dC5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weSh0Lm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD10LmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPXQuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPXQuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLmZsYXRTaGFkaW5nPXQuZmxhdFNoYWRpbmcsdGhpc319LnByb3RvdHlwZS5pc01lc2hOb3JtYWxNYXRlcmlhbD0hMCxjbGFzcyBleHRlbmRzIE9ydHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iTWVzaExhbWJlcnRNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgUnJ0KDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlPW5ldyBScnQoMCksdGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmVNYXA9bnVsbCx0aGlzLnNwZWN1bGFyTWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZW52TWFwPW51bGwsdGhpcy5jb21iaW5lPTAsdGhpcy5yZWZsZWN0aXZpdHk9MSx0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTgsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIix0aGlzLndpcmVmcmFtZUxpbmVqb2luPSJyb3VuZCIsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXA9dC5tYXAsdGhpcy5saWdodE1hcD10LmxpZ2h0TWFwLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9dC5saWdodE1hcEludGVuc2l0eSx0aGlzLmFvTWFwPXQuYW9NYXAsdGhpcy5hb01hcEludGVuc2l0eT10LmFvTWFwSW50ZW5zaXR5LHRoaXMuZW1pc3NpdmUuY29weSh0LmVtaXNzaXZlKSx0aGlzLmVtaXNzaXZlTWFwPXQuZW1pc3NpdmVNYXAsdGhpcy5lbWlzc2l2ZUludGVuc2l0eT10LmVtaXNzaXZlSW50ZW5zaXR5LHRoaXMuc3BlY3VsYXJNYXA9dC5zcGVjdWxhck1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5lbnZNYXA9dC5lbnZNYXAsdGhpcy5jb21iaW5lPXQuY29tYmluZSx0aGlzLnJlZmxlY3Rpdml0eT10LnJlZmxlY3Rpdml0eSx0aGlzLnJlZnJhY3Rpb25SYXRpbz10LnJlZnJhY3Rpb25SYXRpbyx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbix0aGlzfX0ucHJvdG90eXBlLmlzTWVzaExhbWJlcnRNYXRlcmlhbD0hMCxjbGFzcyBleHRlbmRzIE9ydHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuZGVmaW5lcz17TUFUQ0FQOiIifSx0aGlzLnR5cGU9Ik1lc2hNYXRjYXBNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgUnJ0KDE2Nzc3MjE1KSx0aGlzLm1hdGNhcD1udWxsLHRoaXMubWFwPW51bGwsdGhpcy5idW1wTWFwPW51bGwsdGhpcy5idW1wU2NhbGU9MSx0aGlzLm5vcm1hbE1hcD1udWxsLHRoaXMubm9ybWFsTWFwVHlwZT0wLHRoaXMubm9ybWFsU2NhbGU9bmV3IFFpdCgxLDEpLHRoaXMuZGlzcGxhY2VtZW50TWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz0wLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmZsYXRTaGFkaW5nPSExLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5kZWZpbmVzPXtNQVRDQVA6IiJ9LHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSx0aGlzLm1hdGNhcD10Lm1hdGNhcCx0aGlzLm1hcD10Lm1hcCx0aGlzLmJ1bXBNYXA9dC5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPXQuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPXQubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMuYWxwaGFNYXA9dC5hbHBoYU1hcCx0aGlzLmZsYXRTaGFkaW5nPXQuZmxhdFNoYWRpbmcsdGhpc319LnByb3RvdHlwZS5pc01lc2hNYXRjYXBNYXRlcmlhbD0hMCxjbGFzcyBleHRlbmRzIHFkdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iTGluZURhc2hlZE1hdGVyaWFsIix0aGlzLnNjYWxlPTEsdGhpcy5kYXNoU2l6ZT0zLHRoaXMuZ2FwU2l6ZT0xLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5zY2FsZT10LnNjYWxlLHRoaXMuZGFzaFNpemU9dC5kYXNoU2l6ZSx0aGlzLmdhcFNpemU9dC5nYXBTaXplLHRoaXN9fS5wcm90b3R5cGUuaXNMaW5lRGFzaGVkTWF0ZXJpYWw9ITA7Y29uc3Qgcm10PXthcnJheVNsaWNlOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcm10LmlzVHlwZWRBcnJheSh0KT9uZXcgdC5jb25zdHJ1Y3Rvcih0LnN1YmFycmF5KGUsdm9pZCAwIT09bj9uOnQubGVuZ3RoKSk6dC5zbGljZShlLG4pfSxjb252ZXJ0QXJyYXk6ZnVuY3Rpb24odCxlLG4pe3JldHVybiF0fHwhbiYmdC5jb25zdHJ1Y3Rvcj09PWU/dDoibnVtYmVyIj09dHlwZW9mIGUuQllURVNfUEVSX0VMRU1FTlQ/bmV3IGUodCk6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCl9LGlzVHlwZWRBcnJheTpmdW5jdGlvbih0KXtyZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KHQpJiYhKHQgaW5zdGFuY2VvZiBEYXRhVmlldyl9LGdldEtleWZyYW1lT3JkZXI6ZnVuY3Rpb24odCl7Y29uc3QgZT10Lmxlbmd0aCxuPW5ldyBBcnJheShlKTtmb3IobGV0IHQ9MDt0IT09ZTsrK3Qpblt0XT10O3JldHVybiBuLnNvcnQoKGZ1bmN0aW9uIG8oZSxuKXtyZXR1cm4gdFtlXS10W25dfSkpLG59LHNvcnRlZEFycmF5OmZ1bmN0aW9uKHQsZSxuKXtjb25zdCBvPXQubGVuZ3RoLGk9bmV3IHQuY29uc3RydWN0b3Iobyk7Zm9yKGxldCBhPTAscj0wO3IhPT1vOysrYSl7Y29uc3Qgbz1uW2FdKmU7Zm9yKGxldCBuPTA7biE9PWU7KytuKWlbcisrXT10W28rbl19cmV0dXJuIGl9LGZsYXR0ZW5KU09OOmZ1bmN0aW9uKHQsZSxuLG8pe2xldCBpPTEsYT10WzBdO2Zvcig7dm9pZCAwIT09YSYmdm9pZCAwPT09YVtvXTspYT10W2krK107aWYodm9pZCAwPT09YSlyZXR1cm47bGV0IHI9YVtvXTtpZih2b2lkIDAhPT1yKWlmKEFycmF5LmlzQXJyYXkocikpZG97cj1hW29dLHZvaWQgMCE9PXImJihlLnB1c2goYS50aW1lKSxuLnB1c2guYXBwbHkobixyKSksYT10W2krK119d2hpbGUodm9pZCAwIT09YSk7ZWxzZSBpZih2b2lkIDAhPT1yLnRvQXJyYXkpZG97cj1hW29dLHZvaWQgMCE9PXImJihlLnB1c2goYS50aW1lKSxyLnRvQXJyYXkobixuLmxlbmd0aCkpLGE9dFtpKytdfXdoaWxlKHZvaWQgMCE9PWEpO2Vsc2UgZG97cj1hW29dLHZvaWQgMCE9PXImJihlLnB1c2goYS50aW1lKSxuLnB1c2gocikpLGE9dFtpKytdfXdoaWxlKHZvaWQgMCE9PWEpfSxzdWJjbGlwOmZ1bmN0aW9uKHQsZSxuLG8saT0zMCl7Y29uc3QgYT10LmNsb25lKCk7YS5uYW1lPWU7Y29uc3Qgcj1bXTtmb3IobGV0IHQ9MDt0PGEudHJhY2tzLmxlbmd0aDsrK3Qpe2NvbnN0IGU9YS50cmFja3NbdF0scz1lLmdldFZhbHVlU2l6ZSgpLGw9W10sYz1bXTtmb3IobGV0IHQ9MDt0PGUudGltZXMubGVuZ3RoOysrdCl7Y29uc3QgYT1lLnRpbWVzW3RdKmk7aWYoIShhPG58fGE+PW8pKXtsLnB1c2goZS50aW1lc1t0XSk7Zm9yKGxldCBuPTA7bjxzOysrbiljLnB1c2goZS52YWx1ZXNbdCpzK25dKX19MCE9PWwubGVuZ3RoJiYoZS50aW1lcz1ybXQuY29udmVydEFycmF5KGwsZS50aW1lcy5jb25zdHJ1Y3RvciksZS52YWx1ZXM9cm10LmNvbnZlcnRBcnJheShjLGUudmFsdWVzLmNvbnN0cnVjdG9yKSxyLnB1c2goZSkpfWEudHJhY2tzPXI7bGV0IHM9MS8wO2ZvcihsZXQgdD0wO3Q8YS50cmFja3MubGVuZ3RoOysrdClzPmEudHJhY2tzW3RdLnRpbWVzWzBdJiYocz1hLnRyYWNrc1t0XS50aW1lc1swXSk7Zm9yKGxldCB0PTA7dDxhLnRyYWNrcy5sZW5ndGg7Kyt0KWEudHJhY2tzW3RdLnNoaWZ0KC0xKnMpO3JldHVybiBhLnJlc2V0RHVyYXRpb24oKSxhfSxtYWtlQ2xpcEFkZGl0aXZlOmZ1bmN0aW9uKHQsZT0wLG49dCxvPTMwKXtvPD0wJiYobz0zMCk7Y29uc3QgaT1uLnRyYWNrcy5sZW5ndGgsYT1lL287Zm9yKGxldCBlPTA7ZTxpOysrZSl7Y29uc3Qgbz1uLnRyYWNrc1tlXSxpPW8uVmFsdWVUeXBlTmFtZTtpZigiYm9vbCI9PT1pfHwic3RyaW5nIj09PWkpY29udGludWU7Y29uc3Qgcj10LnRyYWNrcy5maW5kKChmdW5jdGlvbih0KXtyZXR1cm4gdC5uYW1lPT09by5uYW1lJiZ0LlZhbHVlVHlwZU5hbWU9PT1pfSkpO2lmKHZvaWQgMD09PXIpY29udGludWU7bGV0IHM9MDtjb25zdCBsPW8uZ2V0VmFsdWVTaXplKCk7by5jcmVhdGVJbnRlcnBvbGFudC5pc0ludGVycG9sYW50RmFjdG9yeU1ldGhvZEdMVEZDdWJpY1NwbGluZSYmKHM9bC8zKTtsZXQgYz0wO2NvbnN0IGQ9ci5nZXRWYWx1ZVNpemUoKTtyLmNyZWF0ZUludGVycG9sYW50LmlzSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kR0xURkN1YmljU3BsaW5lJiYoYz1kLzMpO2NvbnN0IHA9by50aW1lcy5sZW5ndGgtMTtsZXQgbTtpZihhPD1vLnRpbWVzWzBdKW09cm10LmFycmF5U2xpY2Uoby52YWx1ZXMscyxsLXMpO2Vsc2UgaWYoYT49by50aW1lc1twXSl7Y29uc3QgdD1wKmwrczttPXJtdC5hcnJheVNsaWNlKG8udmFsdWVzLHQsdCtsLXMpfWVsc2V7Y29uc3QgdD1vLmNyZWF0ZUludGVycG9sYW50KCksZT1zLG49bC1zO3QuZXZhbHVhdGUoYSksbT1ybXQuYXJyYXlTbGljZSh0LnJlc3VsdEJ1ZmZlcixlLG4pfSJxdWF0ZXJuaW9uIj09PWkmJihuZXcgbGF0KS5mcm9tQXJyYXkobSkubm9ybWFsaXplKCkuY29uanVnYXRlKCkudG9BcnJheShtKTtjb25zdCB1PXIudGltZXMubGVuZ3RoO2ZvcihsZXQgdD0wO3Q8dTsrK3Qpe2NvbnN0IGU9dCpkK2M7aWYoInF1YXRlcm5pb24iPT09aSlsYXQubXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQoci52YWx1ZXMsZSxtLDAsci52YWx1ZXMsZSk7ZWxzZXtjb25zdCB0PWQtMipjO2ZvcihsZXQgbj0wO248dDsrK24pci52YWx1ZXNbZStuXS09bVtuXX19fXJldHVybiB0LmJsZW5kTW9kZT0yNTAxLHR9fTtjbGFzcyBzbXR7Y29uc3RydWN0b3IodCxlLG4sbyl7dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnM9dCx0aGlzLl9jYWNoZWRJbmRleD0wLHRoaXMucmVzdWx0QnVmZmVyPXZvaWQgMCE9PW8/bzpuZXcgZS5jb25zdHJ1Y3RvcihuKSx0aGlzLnNhbXBsZVZhbHVlcz1lLHRoaXMudmFsdWVTaXplPW4sdGhpcy5zZXR0aW5ncz1udWxsLHRoaXMuRGVmYXVsdFNldHRpbmdzXz17fX1ldmFsdWF0ZSh0KXtjb25zdCBlPXRoaXMucGFyYW1ldGVyUG9zaXRpb25zO2xldCBuPXRoaXMuX2NhY2hlZEluZGV4LG89ZVtuXSxpPWVbbi0xXTt0OntlOntsZXQgYTtuOntvOmlmKCEodDxvKSl7Zm9yKGxldCBhPW4rMjs7KXtpZih2b2lkIDA9PT1vKXtpZih0PGkpYnJlYWsgbztyZXR1cm4gbj1lLmxlbmd0aCx0aGlzLl9jYWNoZWRJbmRleD1uLHRoaXMuYWZ0ZXJFbmRfKG4tMSx0LGkpfWlmKG49PT1hKWJyZWFrO2lmKGk9byxvPWVbKytuXSx0PG8pYnJlYWsgZX1hPWUubGVuZ3RoO2JyZWFrIG59aWYodD49aSlicmVhayB0O3tjb25zdCByPWVbMV07dDxyJiYobj0yLGk9cik7Zm9yKGxldCBhPW4tMjs7KXtpZih2b2lkIDA9PT1pKXJldHVybiB0aGlzLl9jYWNoZWRJbmRleD0wLHRoaXMuYmVmb3JlU3RhcnRfKDAsdCxvKTtpZihuPT09YSlicmVhaztpZihvPWksaT1lWy0tbi0xXSx0Pj1pKWJyZWFrIGV9YT1uLG49MH19Zm9yKDtuPGE7KXtjb25zdCBvPW4rYT4+PjE7dDxlW29dP2E9bzpuPW8rMX1pZihvPWVbbl0saT1lW24tMV0sdm9pZCAwPT09aSlyZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXg9MCx0aGlzLmJlZm9yZVN0YXJ0XygwLHQsbyk7aWYodm9pZCAwPT09bylyZXR1cm4gbj1lLmxlbmd0aCx0aGlzLl9jYWNoZWRJbmRleD1uLHRoaXMuYWZ0ZXJFbmRfKG4tMSxpLHQpfXRoaXMuX2NhY2hlZEluZGV4PW4sdGhpcy5pbnRlcnZhbENoYW5nZWRfKG4saSxvKX1yZXR1cm4gdGhpcy5pbnRlcnBvbGF0ZV8obixpLHQsbyl9Z2V0U2V0dGluZ3NfKCl7cmV0dXJuIHRoaXMuc2V0dGluZ3N8fHRoaXMuRGVmYXVsdFNldHRpbmdzX31jb3B5U2FtcGxlVmFsdWVfKHQpe2NvbnN0IGU9dGhpcy5yZXN1bHRCdWZmZXIsbj10aGlzLnNhbXBsZVZhbHVlcyxvPXRoaXMudmFsdWVTaXplLGk9dCpvO2ZvcihsZXQgdD0wO3QhPT1vOysrdCllW3RdPW5baSt0XTtyZXR1cm4gZX1pbnRlcnBvbGF0ZV8oKXt0aHJvdyBuZXcgRXJyb3IoImNhbGwgdG8gYWJzdHJhY3QgbWV0aG9kIil9aW50ZXJ2YWxDaGFuZ2VkXygpe319c210LnByb3RvdHlwZS5iZWZvcmVTdGFydF89c210LnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVfLHNtdC5wcm90b3R5cGUuYWZ0ZXJFbmRfPXNtdC5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXztjbGFzcyBsbXQgZXh0ZW5kcyBzbXR7Y29uc3RydWN0b3IodCxlLG4sbyl7c3VwZXIodCxlLG4sbyksdGhpcy5fd2VpZ2h0UHJldj0tMCx0aGlzLl9vZmZzZXRQcmV2PS0wLHRoaXMuX3dlaWdodE5leHQ9LTAsdGhpcy5fb2Zmc2V0TmV4dD0tMCx0aGlzLkRlZmF1bHRTZXR0aW5nc189e2VuZGluZ1N0YXJ0OkFpdCxlbmRpbmdFbmQ6QWl0fX1pbnRlcnZhbENoYW5nZWRfKHQsZSxuKXtjb25zdCBvPXRoaXMucGFyYW1ldGVyUG9zaXRpb25zO2xldCBpPXQtMixhPXQrMSxyPW9baV0scz1vW2FdO2lmKHZvaWQgMD09PXIpc3dpdGNoKHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nU3RhcnQpe2Nhc2UgVGl0Omk9dCxyPTIqZS1uO2JyZWFrO2Nhc2UgTml0Omk9by5sZW5ndGgtMixyPWUrb1tpXS1vW2krMV07YnJlYWs7ZGVmYXVsdDppPXQscj1ufWlmKHZvaWQgMD09PXMpc3dpdGNoKHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nRW5kKXtjYXNlIFRpdDphPXQscz0yKm4tZTticmVhaztjYXNlIE5pdDphPTEscz1uK29bMV0tb1swXTticmVhaztkZWZhdWx0OmE9dC0xLHM9ZX1jb25zdCBsPS41KihuLWUpLGM9dGhpcy52YWx1ZVNpemU7dGhpcy5fd2VpZ2h0UHJldj1sLyhlLXIpLHRoaXMuX3dlaWdodE5leHQ9bC8ocy1uKSx0aGlzLl9vZmZzZXRQcmV2PWkqYyx0aGlzLl9vZmZzZXROZXh0PWEqY31pbnRlcnBvbGF0ZV8odCxlLG4sbyl7Y29uc3QgaT10aGlzLnJlc3VsdEJ1ZmZlcixhPXRoaXMuc2FtcGxlVmFsdWVzLHI9dGhpcy52YWx1ZVNpemUscz10KnIsbD1zLXIsYz10aGlzLl9vZmZzZXRQcmV2LGQ9dGhpcy5fb2Zmc2V0TmV4dCxwPXRoaXMuX3dlaWdodFByZXYsbT10aGlzLl93ZWlnaHROZXh0LHU9KG4tZSkvKG8tZSksZj11KnUsZz1mKnUsaD0tcCpnKzIqcCpmLXAqdSxiPSgxK3ApKmcrKC0xLjUtMipwKSpmKygtLjUrcCkqdSsxLHk9KC0xLW0pKmcrKDEuNSttKSpmKy41KnUsXz1tKmctbSpmO2ZvcihsZXQgdD0wO3QhPT1yOysrdClpW3RdPWgqYVtjK3RdK2IqYVtsK3RdK3kqYVtzK3RdK18qYVtkK3RdO3JldHVybiBpfX1jbGFzcyBjbXQgZXh0ZW5kcyBzbXR7Y29uc3RydWN0b3IodCxlLG4sbyl7c3VwZXIodCxlLG4sbyl9aW50ZXJwb2xhdGVfKHQsZSxuLG8pe2NvbnN0IGk9dGhpcy5yZXN1bHRCdWZmZXIsYT10aGlzLnNhbXBsZVZhbHVlcyxyPXRoaXMudmFsdWVTaXplLHM9dCpyLGw9cy1yLGM9KG4tZSkvKG8tZSksZD0xLWM7Zm9yKGxldCB0PTA7dCE9PXI7Kyt0KWlbdF09YVtsK3RdKmQrYVtzK3RdKmM7cmV0dXJuIGl9fWNsYXNzIGRtdCBleHRlbmRzIHNtdHtjb25zdHJ1Y3Rvcih0LGUsbixvKXtzdXBlcih0LGUsbixvKX1pbnRlcnBvbGF0ZV8odCl7cmV0dXJuIHRoaXMuY29weVNhbXBsZVZhbHVlXyh0LTEpfX1jbGFzcyBwbXR7Y29uc3RydWN0b3IodCxlLG4sbyl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIG5hbWUgaXMgdW5kZWZpbmVkIik7aWYodm9pZCAwPT09ZXx8MD09PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogbm8ga2V5ZnJhbWVzIGluIHRyYWNrIG5hbWVkICIrdCk7dGhpcy5uYW1lPXQsdGhpcy50aW1lcz1ybXQuY29udmVydEFycmF5KGUsdGhpcy5UaW1lQnVmZmVyVHlwZSksdGhpcy52YWx1ZXM9cm10LmNvbnZlcnRBcnJheShuLHRoaXMuVmFsdWVCdWZmZXJUeXBlKSx0aGlzLnNldEludGVycG9sYXRpb24ob3x8dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil9c3RhdGljIHRvSlNPTih0KXtjb25zdCBlPXQuY29uc3RydWN0b3I7bGV0IG47aWYoZS50b0pTT04hPT10aGlzLnRvSlNPTiluPWUudG9KU09OKHQpO2Vsc2V7bj17bmFtZTp0Lm5hbWUsdGltZXM6cm10LmNvbnZlcnRBcnJheSh0LnRpbWVzLEFycmF5KSx2YWx1ZXM6cm10LmNvbnZlcnRBcnJheSh0LnZhbHVlcyxBcnJheSl9O2NvbnN0IGU9dC5nZXRJbnRlcnBvbGF0aW9uKCk7ZSE9PXQuRGVmYXVsdEludGVycG9sYXRpb24mJihuLmludGVycG9sYXRpb249ZSl9cmV0dXJuIG4udHlwZT10LlZhbHVlVHlwZU5hbWUsbn1JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZSh0KXtyZXR1cm4gbmV3IGRtdCh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksdCl9SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyKHQpe3JldHVybiBuZXcgY210KHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSx0KX1JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGgodCl7cmV0dXJuIG5ldyBsbXQodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLHQpfXNldEludGVycG9sYXRpb24odCl7bGV0IGU7c3dpdGNoKHQpe2Nhc2UgRGl0OmU9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTticmVhaztjYXNlIEVpdDplPXRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyO2JyZWFrO2Nhc2UgUml0OmU9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGh9aWYodm9pZCAwPT09ZSl7Y29uc3QgZT0idW5zdXBwb3J0ZWQgaW50ZXJwb2xhdGlvbiBmb3IgIit0aGlzLlZhbHVlVHlwZU5hbWUrIiBrZXlmcmFtZSB0cmFjayBuYW1lZCAiK3RoaXMubmFtZTtpZih2b2lkIDA9PT10aGlzLmNyZWF0ZUludGVycG9sYW50KXtpZih0PT09dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil0aHJvdyBuZXcgRXJyb3IoZSk7dGhpcy5zZXRJbnRlcnBvbGF0aW9uKHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pfXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLktleWZyYW1lVHJhY2s6IixlKSx0aGlzfXJldHVybiB0aGlzLmNyZWF0ZUludGVycG9sYW50PWUsdGhpc31nZXRJbnRlcnBvbGF0aW9uKCl7c3dpdGNoKHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQpe2Nhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTpyZXR1cm4gRGl0O2Nhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6cmV0dXJuIEVpdDtjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOnJldHVybiBSaXR9fWdldFZhbHVlU2l6ZSgpe3JldHVybiB0aGlzLnZhbHVlcy5sZW5ndGgvdGhpcy50aW1lcy5sZW5ndGh9c2hpZnQodCl7aWYoMCE9PXQpe2NvbnN0IGU9dGhpcy50aW1lcztmb3IobGV0IG49MCxvPWUubGVuZ3RoO24hPT1vOysrbillW25dKz10fXJldHVybiB0aGlzfXNjYWxlKHQpe2lmKDEhPT10KXtjb25zdCBlPXRoaXMudGltZXM7Zm9yKGxldCBuPTAsbz1lLmxlbmd0aDtuIT09bzsrK24pZVtuXSo9dH1yZXR1cm4gdGhpc310cmltKHQsZSl7Y29uc3Qgbj10aGlzLnRpbWVzLG89bi5sZW5ndGg7bGV0IGk9MCxhPW8tMTtmb3IoO2khPT1vJiZuW2ldPHQ7KSsraTtmb3IoOy0xIT09YSYmblthXT5lOyktLWE7aWYoKythLDAhPT1pfHxhIT09byl7aT49YSYmKGE9TWF0aC5tYXgoYSwxKSxpPWEtMSk7Y29uc3QgdD10aGlzLmdldFZhbHVlU2l6ZSgpO3RoaXMudGltZXM9cm10LmFycmF5U2xpY2UobixpLGEpLHRoaXMudmFsdWVzPXJtdC5hcnJheVNsaWNlKHRoaXMudmFsdWVzLGkqdCxhKnQpfXJldHVybiB0aGlzfXZhbGlkYXRlKCl7bGV0IHQ9ITA7Y29uc3QgZT10aGlzLmdldFZhbHVlU2l6ZSgpO2UtTWF0aC5mbG9vcihlKSE9MCYmKGNvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IEludmFsaWQgdmFsdWUgc2l6ZSBpbiB0cmFjay4iLHRoaXMpLHQ9ITEpO2NvbnN0IG49dGhpcy50aW1lcyxvPXRoaXMudmFsdWVzLGk9bi5sZW5ndGg7MD09PWkmJihjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBUcmFjayBpcyBlbXB0eS4iLHRoaXMpLHQ9ITEpO2xldCBhPW51bGw7Zm9yKGxldCBlPTA7ZSE9PWk7ZSsrKXtjb25zdCBvPW5bZV07aWYoIm51bWJlciI9PXR5cGVvZiBvJiZpc05hTihvKSl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVGltZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuIix0aGlzLGUsbyksdD0hMTticmVha31pZihudWxsIT09YSYmYT5vKXtjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBPdXQgb2Ygb3JkZXIga2V5cy4iLHRoaXMsZSxvLGEpLHQ9ITE7YnJlYWt9YT1vfWlmKHZvaWQgMCE9PW8mJnJtdC5pc1R5cGVkQXJyYXkobykpZm9yKGxldCBlPTAsbj1vLmxlbmd0aDtlIT09bjsrK2Upe2NvbnN0IG49b1tlXTtpZihpc05hTihuKSl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVmFsdWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLiIsdGhpcyxlLG4pLHQ9ITE7YnJlYWt9fXJldHVybiB0fW9wdGltaXplKCl7Y29uc3QgdD1ybXQuYXJyYXlTbGljZSh0aGlzLnRpbWVzKSxlPXJtdC5hcnJheVNsaWNlKHRoaXMudmFsdWVzKSxuPXRoaXMuZ2V0VmFsdWVTaXplKCksbz10aGlzLmdldEludGVycG9sYXRpb24oKT09PVJpdCxpPXQubGVuZ3RoLTE7bGV0IGE9MTtmb3IobGV0IHI9MTtyPGk7KytyKXtsZXQgaT0hMTtjb25zdCBzPXRbcl07aWYocyE9PXRbcisxXSYmKDEhPT1yfHxzIT09dFswXSkpaWYobylpPSEwO2Vsc2V7Y29uc3QgdD1yKm4sbz10LW4sYT10K247Zm9yKGxldCByPTA7ciE9PW47KytyKXtjb25zdCBuPWVbdCtyXTtpZihuIT09ZVtvK3JdfHxuIT09ZVthK3JdKXtpPSEwO2JyZWFrfX19aWYoaSl7aWYociE9PWEpe3RbYV09dFtyXTtjb25zdCBvPXIqbixpPWEqbjtmb3IobGV0IHQ9MDt0IT09bjsrK3QpZVtpK3RdPWVbbyt0XX0rK2F9fWlmKGk+MCl7dFthXT10W2ldO2ZvcihsZXQgdD1pKm4sbz1hKm4scj0wO3IhPT1uOysrcillW28rcl09ZVt0K3JdOysrYX1yZXR1cm4gYSE9PXQubGVuZ3RoPyh0aGlzLnRpbWVzPXJtdC5hcnJheVNsaWNlKHQsMCxhKSx0aGlzLnZhbHVlcz1ybXQuYXJyYXlTbGljZShlLDAsYSpuKSk6KHRoaXMudGltZXM9dCx0aGlzLnZhbHVlcz1lKSx0aGlzfWNsb25lKCl7Y29uc3QgdD1ybXQuYXJyYXlTbGljZSh0aGlzLnRpbWVzLDApLGU9cm10LmFycmF5U2xpY2UodGhpcy52YWx1ZXMsMCksbj1uZXcoMCx0aGlzLmNvbnN0cnVjdG9yKSh0aGlzLm5hbWUsdCxlKTtyZXR1cm4gbi5jcmVhdGVJbnRlcnBvbGFudD10aGlzLmNyZWF0ZUludGVycG9sYW50LG59fXBtdC5wcm90b3R5cGUuVGltZUJ1ZmZlclR5cGU9RmxvYXQzMkFycmF5LHBtdC5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlPUZsb2F0MzJBcnJheSxwbXQucHJvdG90eXBlLkRlZmF1bHRJbnRlcnBvbGF0aW9uPUVpdDtjbGFzcyBtbXQgZXh0ZW5kcyBwbXR7fW1tdC5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0iYm9vbCIsbW10LnByb3RvdHlwZS5WYWx1ZUJ1ZmZlclR5cGU9QXJyYXksbW10LnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbj1EaXQsbW10LnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI9dm9pZCAwLG1tdC5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoPXZvaWQgMDtjbGFzcyB1bXQgZXh0ZW5kcyBwbXR7fXVtdC5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0iY29sb3IiO2NsYXNzIGZtdCBleHRlbmRzIHBtdHt9Zm10LnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lPSJudW1iZXIiO2NsYXNzIGdtdCBleHRlbmRzIHNtdHtjb25zdHJ1Y3Rvcih0LGUsbixvKXtzdXBlcih0LGUsbixvKX1pbnRlcnBvbGF0ZV8odCxlLG4sbyl7Y29uc3QgaT10aGlzLnJlc3VsdEJ1ZmZlcixhPXRoaXMuc2FtcGxlVmFsdWVzLHI9dGhpcy52YWx1ZVNpemUscz0obi1lKS8oby1lKTtsZXQgbD10KnI7Zm9yKGxldCB0PWwrcjtsIT09dDtsKz00KWxhdC5zbGVycEZsYXQoaSwwLGEsbC1yLGEsbCxzKTtyZXR1cm4gaX19Y2xhc3MgaG10IGV4dGVuZHMgcG10e0ludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcih0KXtyZXR1cm4gbmV3IGdtdCh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksdCl9fWhtdC5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0icXVhdGVybmlvbiIsaG10LnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbj1FaXQsaG10LnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg9dm9pZCAwO2NsYXNzIGJtdCBleHRlbmRzIHBtdHt9Ym10LnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lPSJzdHJpbmciLGJtdC5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlPUFycmF5LGJtdC5wcm90b3R5cGUuRGVmYXVsdEludGVycG9sYXRpb249RGl0LGJtdC5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyPXZvaWQgMCxibXQucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aD12b2lkIDA7Y2xhc3MgeW10IGV4dGVuZHMgcG10e315bXQucHJvdG90eXBlLlZhbHVlVHlwZU5hbWU9InZlY3RvciI7Y2xhc3MgX210e2NvbnN0cnVjdG9yKHQsZT0tMSxuLG89MjUwMCl7dGhpcy5uYW1lPXQsdGhpcy50cmFja3M9bix0aGlzLmR1cmF0aW9uPWUsdGhpcy5ibGVuZE1vZGU9byx0aGlzLnV1aWQ9cWl0KCksdGhpcy5kdXJhdGlvbjwwJiZ0aGlzLnJlc2V0RHVyYXRpb24oKX1zdGF0aWMgcGFyc2UodCl7Y29uc3QgZT1bXSxuPXQudHJhY2tzLG89MS8odC5mcHN8fDEpO2ZvcihsZXQgdD0wLGk9bi5sZW5ndGg7dCE9PWk7Kyt0KWUucHVzaChDbXQoblt0XSkuc2NhbGUobykpO2NvbnN0IGk9bmV3IHRoaXModC5uYW1lLHQuZHVyYXRpb24sZSx0LmJsZW5kTW9kZSk7cmV0dXJuIGkudXVpZD10LnV1aWQsaX1zdGF0aWMgdG9KU09OKHQpe2NvbnN0IGU9W10sbj10LnRyYWNrcyxvPXtuYW1lOnQubmFtZSxkdXJhdGlvbjp0LmR1cmF0aW9uLHRyYWNrczplLHV1aWQ6dC51dWlkLGJsZW5kTW9kZTp0LmJsZW5kTW9kZX07Zm9yKGxldCB0PTAsbz1uLmxlbmd0aDt0IT09bzsrK3QpZS5wdXNoKHBtdC50b0pTT04oblt0XSkpO3JldHVybiBvfXN0YXRpYyBDcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZSh0LGUsbixvKXtjb25zdCBpPWUubGVuZ3RoLGE9W107Zm9yKGxldCB0PTA7dDxpO3QrKyl7bGV0IHI9W10scz1bXTtyLnB1c2goKHQraS0xKSVpLHQsKHQrMSklaSkscy5wdXNoKDAsMSwwKTtjb25zdCBsPXJtdC5nZXRLZXlmcmFtZU9yZGVyKHIpO3I9cm10LnNvcnRlZEFycmF5KHIsMSxsKSxzPXJtdC5zb3J0ZWRBcnJheShzLDEsbCksb3x8MCE9PXJbMF18fChyLnB1c2goaSkscy5wdXNoKHNbMF0pKSxhLnB1c2gobmV3IGZtdCgiLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1siK2VbdF0ubmFtZSsiXSIscixzKS5zY2FsZSgxL24pKX1yZXR1cm4gbmV3IHRoaXModCwtMSxhKX1zdGF0aWMgZmluZEJ5TmFtZSh0LGUpe2xldCBuPXQ7aWYoIUFycmF5LmlzQXJyYXkodCkpe2NvbnN0IGU9dDtuPWUuZ2VvbWV0cnkmJmUuZ2VvbWV0cnkuYW5pbWF0aW9uc3x8ZS5hbmltYXRpb25zfWZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKWlmKG5bdF0ubmFtZT09PWUpcmV0dXJuIG5bdF07cmV0dXJuIG51bGx9c3RhdGljIENyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2VzKHQsZSxuKXtjb25zdCBvPXt9LGk9L14oW1x3LV0qPykoW1xkXSspJC87Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXtjb25zdCBuPXRbZV0sYT1uLm5hbWUubWF0Y2goaSk7aWYoYSYmYS5sZW5ndGg+MSl7Y29uc3QgdD1hWzFdO2xldCBlPW9bdF07ZXx8KG9bdF09ZT1bXSksZS5wdXNoKG4pfX1jb25zdCBhPVtdO2Zvcihjb25zdCB0IGluIG8pYS5wdXNoKHRoaXMuQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UodCxvW3RdLGUsbikpO3JldHVybiBhfXN0YXRpYyBwYXJzZUFuaW1hdGlvbih0LGUpe2lmKCF0KXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5BbmltYXRpb25DbGlwOiBObyBhbmltYXRpb24gaW4gSlNPTkxvYWRlciBkYXRhLiIpLG51bGw7Y29uc3Qgbj1mdW5jdGlvbih0LGUsbixvLGkpe2lmKDAhPT1uLmxlbmd0aCl7Y29uc3QgYT1bXSxyPVtdO3JtdC5mbGF0dGVuSlNPTihuLGEscixvKSwwIT09YS5sZW5ndGgmJmkucHVzaChuZXcgdChlLGEscikpfX0sbz1bXSxpPXQubmFtZXx8ImRlZmF1bHQiLGE9dC5mcHN8fDMwLHI9dC5ibGVuZE1vZGU7bGV0IHM9dC5sZW5ndGh8fC0xO2NvbnN0IGw9dC5oaWVyYXJjaHl8fFtdO2ZvcihsZXQgdD0wO3Q8bC5sZW5ndGg7dCsrKXtjb25zdCBpPWxbdF0ua2V5cztpZihpJiYwIT09aS5sZW5ndGgpaWYoaVswXS5tb3JwaFRhcmdldHMpe2NvbnN0IHQ9e307bGV0IGU7Zm9yKGU9MDtlPGkubGVuZ3RoO2UrKylpZihpW2VdLm1vcnBoVGFyZ2V0cylmb3IobGV0IG49MDtuPGlbZV0ubW9ycGhUYXJnZXRzLmxlbmd0aDtuKyspdFtpW2VdLm1vcnBoVGFyZ2V0c1tuXV09LTE7Zm9yKGNvbnN0IG4gaW4gdCl7Y29uc3QgdD1bXSxhPVtdO2ZvcihsZXQgbz0wO28hPT1pW2VdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7KytvKXtjb25zdCBvPWlbZV07dC5wdXNoKG8udGltZSksYS5wdXNoKG8ubW9ycGhUYXJnZXQ9PT1uPzE6MCl9by5wdXNoKG5ldyBmbXQoIi5tb3JwaFRhcmdldEluZmx1ZW5jZVsiK24rIl0iLHQsYSkpfXM9dC5sZW5ndGgqKGF8fDEpfWVsc2V7Y29uc3QgYT0iLmJvbmVzWyIrZVt0XS5uYW1lKyJdIjtuKHltdCxhKyIucG9zaXRpb24iLGksInBvcyIsbyksbihobXQsYSsiLnF1YXRlcm5pb24iLGksInJvdCIsbyksbih5bXQsYSsiLnNjYWxlIixpLCJzY2wiLG8pfX1yZXR1cm4gMD09PW8ubGVuZ3RoP251bGw6bmV3IHRoaXMoaSxzLG8scil9cmVzZXREdXJhdGlvbigpe2xldCB0PTA7Zm9yKGxldCBlPTAsbj10aGlzLnRyYWNrcy5sZW5ndGg7ZSE9PW47KytlKXtjb25zdCBuPXRoaXMudHJhY2tzW2VdO3Q9TWF0aC5tYXgodCxuLnRpbWVzW24udGltZXMubGVuZ3RoLTFdKX1yZXR1cm4gdGhpcy5kdXJhdGlvbj10LHRoaXN9dHJpbSgpe2ZvcihsZXQgdD0wO3Q8dGhpcy50cmFja3MubGVuZ3RoO3QrKyl0aGlzLnRyYWNrc1t0XS50cmltKDAsdGhpcy5kdXJhdGlvbik7cmV0dXJuIHRoaXN9dmFsaWRhdGUoKXtsZXQgdD0hMDtmb3IobGV0IGU9MDtlPHRoaXMudHJhY2tzLmxlbmd0aDtlKyspdD10JiZ0aGlzLnRyYWNrc1tlXS52YWxpZGF0ZSgpO3JldHVybiB0fW9wdGltaXplKCl7Zm9yKGxldCB0PTA7dDx0aGlzLnRyYWNrcy5sZW5ndGg7dCsrKXRoaXMudHJhY2tzW3RdLm9wdGltaXplKCk7cmV0dXJuIHRoaXN9Y2xvbmUoKXtjb25zdCB0PVtdO2ZvcihsZXQgZT0wO2U8dGhpcy50cmFja3MubGVuZ3RoO2UrKyl0LnB1c2godGhpcy50cmFja3NbZV0uY2xvbmUoKSk7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMubmFtZSx0aGlzLmR1cmF0aW9uLHQsdGhpcy5ibGVuZE1vZGUpfXRvSlNPTigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvSlNPTih0aGlzKX19ZnVuY3Rpb24gQ210KHQpe2lmKHZvaWQgMD09PXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIHR5cGUgdW5kZWZpbmVkLCBjYW4gbm90IHBhcnNlIik7Y29uc3QgZT0oZnVuY3Rpb24gbih0KXtzd2l0Y2godC50b0xvd2VyQ2FzZSgpKXtjYXNlInNjYWxhciI6Y2FzZSJkb3VibGUiOmNhc2UiZmxvYXQiOmNhc2UibnVtYmVyIjpjYXNlImludGVnZXIiOnJldHVybiBmbXQ7Y2FzZSJ2ZWN0b3IiOmNhc2UidmVjdG9yMiI6Y2FzZSJ2ZWN0b3IzIjpjYXNlInZlY3RvcjQiOnJldHVybiB5bXQ7Y2FzZSJjb2xvciI6cmV0dXJuIHVtdDtjYXNlInF1YXRlcm5pb24iOnJldHVybiBobXQ7Y2FzZSJib29sIjpjYXNlImJvb2xlYW4iOnJldHVybiBtbXQ7Y2FzZSJzdHJpbmciOnJldHVybiBibXR9dGhyb3cgbmV3IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBVbnN1cHBvcnRlZCB0eXBlTmFtZTogIit0KX0pKHQudHlwZSk7aWYodm9pZCAwPT09dC50aW1lcyl7Y29uc3QgZT1bXSxuPVtdO3JtdC5mbGF0dGVuSlNPTih0LmtleXMsZSxuLCJ2YWx1ZSIpLHQudGltZXM9ZSx0LnZhbHVlcz1ufXJldHVybiB2b2lkIDAhPT1lLnBhcnNlP2UucGFyc2UodCk6bmV3IGUodC5uYW1lLHQudGltZXMsdC52YWx1ZXMsdC5pbnRlcnBvbGF0aW9uKX1jb25zdCBNbXQ9e2VuYWJsZWQ6ITEsZmlsZXM6e30sYWRkOmZ1bmN0aW9uKHQsZSl7ITEhPT10aGlzLmVuYWJsZWQmJih0aGlzLmZpbGVzW3RdPWUpfSxnZXQ6ZnVuY3Rpb24odCl7aWYoITEhPT10aGlzLmVuYWJsZWQpcmV0dXJuIHRoaXMuZmlsZXNbdF19LHJlbW92ZTpmdW5jdGlvbih0KXtkZWxldGUgdGhpcy5maWxlc1t0XX0sY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLmZpbGVzPXt9fX0sdm10PW5ldyBjbGFzc3tjb25zdHJ1Y3Rvcih0LGUsbil7Y29uc3Qgbz10aGlzO2xldCBpLGE9ITEscj0wLHM9MDtjb25zdCBsPVtdO3RoaXMub25TdGFydD12b2lkIDAsdGhpcy5vbkxvYWQ9dCx0aGlzLm9uUHJvZ3Jlc3M9ZSx0aGlzLm9uRXJyb3I9bix0aGlzLml0ZW1TdGFydD1mdW5jdGlvbih0KXtzKyssITE9PT1hJiZ2b2lkIDAhPT1vLm9uU3RhcnQmJm8ub25TdGFydCh0LHIscyksYT0hMH0sdGhpcy5pdGVtRW5kPWZ1bmN0aW9uKHQpe3IrKyx2b2lkIDAhPT1vLm9uUHJvZ3Jlc3MmJm8ub25Qcm9ncmVzcyh0LHIscykscj09PXMmJihhPSExLHZvaWQgMCE9PW8ub25Mb2FkJiZvLm9uTG9hZCgpKX0sdGhpcy5pdGVtRXJyb3I9ZnVuY3Rpb24odCl7dm9pZCAwIT09by5vbkVycm9yJiZvLm9uRXJyb3IodCl9LHRoaXMucmVzb2x2ZVVSTD1mdW5jdGlvbih0KXtyZXR1cm4gaT9pKHQpOnR9LHRoaXMuc2V0VVJMTW9kaWZpZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGk9dCx0aGlzfSx0aGlzLmFkZEhhbmRsZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbC5wdXNoKHQsZSksdGhpc30sdGhpcy5yZW1vdmVIYW5kbGVyPWZ1bmN0aW9uKHQpe2NvbnN0IGU9bC5pbmRleE9mKHQpO3JldHVybi0xIT09ZSYmbC5zcGxpY2UoZSwyKSx0aGlzfSx0aGlzLmdldEhhbmRsZXI9ZnVuY3Rpb24odCl7Zm9yKGxldCBlPTAsbj1sLmxlbmd0aDtlPG47ZSs9Mil7Y29uc3Qgbj1sW2VdLG89bFtlKzFdO2lmKG4uZ2xvYmFsJiYobi5sYXN0SW5kZXg9MCksbi50ZXN0KHQpKXJldHVybiBvfXJldHVybiBudWxsfX19O2NsYXNzIHhtdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLm1hbmFnZXI9dm9pZCAwIT09dD90OnZtdCx0aGlzLmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiLHRoaXMud2l0aENyZWRlbnRpYWxzPSExLHRoaXMucGF0aD0iIix0aGlzLnJlc291cmNlUGF0aD0iIix0aGlzLnJlcXVlc3RIZWFkZXI9e319bG9hZCgpe31sb2FkQXN5bmModCxlKXtjb25zdCBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGkpe24ubG9hZCh0LG8sZSxpKX0pKX1wYXJzZSgpe31zZXRDcm9zc09yaWdpbih0KXtyZXR1cm4gdGhpcy5jcm9zc09yaWdpbj10LHRoaXN9c2V0V2l0aENyZWRlbnRpYWxzKHQpe3JldHVybiB0aGlzLndpdGhDcmVkZW50aWFscz10LHRoaXN9c2V0UGF0aCh0KXtyZXR1cm4gdGhpcy5wYXRoPXQsdGhpc31zZXRSZXNvdXJjZVBhdGgodCl7cmV0dXJuIHRoaXMucmVzb3VyY2VQYXRoPXQsdGhpc31zZXRSZXF1ZXN0SGVhZGVyKHQpe3JldHVybiB0aGlzLnJlcXVlc3RIZWFkZXI9dCx0aGlzfX1jb25zdCBPbXQ9e307Y2xhc3MgUG10IGV4dGVuZHMgeG10e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4sbyl7dm9pZCAwPT09dCYmKHQ9IiIpLHZvaWQgMCE9PXRoaXMucGF0aCYmKHQ9dGhpcy5wYXRoK3QpLHQ9dGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwodCk7Y29uc3QgaT10aGlzLGE9TW10LmdldCh0KTtpZih2b2lkIDAhPT1hKXJldHVybiBpLm1hbmFnZXIuaXRlbVN0YXJ0KHQpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZSYmZShhKSxpLm1hbmFnZXIuaXRlbUVuZCh0KX0pLDApLGE7aWYodm9pZCAwIT09T210W3RdKXJldHVybiB2b2lkIE9tdFt0XS5wdXNoKHtvbkxvYWQ6ZSxvblByb2dyZXNzOm4sb25FcnJvcjpvfSk7Y29uc3Qgcj10Lm1hdGNoKC9eZGF0YTooLio/KSg7YmFzZTY0KT8sKC4qKSQvKTtsZXQgcztpZihyKXtjb25zdCBuPXJbMV0sYT0hIXJbMl07bGV0IHM9clszXTtzPWRlY29kZVVSSUNvbXBvbmVudChzKSxhJiYocz1hdG9iKHMpKTt0cnl7bGV0IG87Y29uc3QgYT0odGhpcy5yZXNwb25zZVR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpO3N3aXRjaChhKXtjYXNlImFycmF5YnVmZmVyIjpjYXNlImJsb2IiOmNvbnN0IHQ9bmV3IFVpbnQ4QXJyYXkocy5sZW5ndGgpO2ZvcihsZXQgZT0wO2U8cy5sZW5ndGg7ZSsrKXRbZV09cy5jaGFyQ29kZUF0KGUpO289ImJsb2IiPT09YT9uZXcgQmxvYihbdC5idWZmZXJdLHt0eXBlOm59KTp0LmJ1ZmZlcjticmVhaztjYXNlImRvY3VtZW50Ijpjb25zdCBlPW5ldyBET01QYXJzZXI7bz1lLnBhcnNlRnJvbVN0cmluZyhzLG4pO2JyZWFrO2Nhc2UianNvbiI6bz1KU09OLnBhcnNlKHMpO2JyZWFrO2RlZmF1bHQ6bz1zfXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZSYmZShvKSxpLm1hbmFnZXIuaXRlbUVuZCh0KX0pLDApfWNhdGNoKGUpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7byYmbyhlKSxpLm1hbmFnZXIuaXRlbUVycm9yKHQpLGkubWFuYWdlci5pdGVtRW5kKHQpfSksMCl9fWVsc2V7T210W3RdPVtdLE9tdFt0XS5wdXNoKHtvbkxvYWQ6ZSxvblByb2dyZXNzOm4sb25FcnJvcjpvfSkscz1uZXcgWE1MSHR0cFJlcXVlc3Qscy5vcGVuKCJHRVQiLHQsITApLHMuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKGZ1bmN0aW9uKGUpe2NvbnN0IG49dGhpcy5yZXNwb25zZSxvPU9tdFt0XTtpZihkZWxldGUgT210W3RdLDIwMD09PXRoaXMuc3RhdHVzfHwwPT09dGhpcy5zdGF0dXMpezA9PT10aGlzLnN0YXR1cyYmY29uc29sZS53YXJuKCJUSFJFRS5GaWxlTG9hZGVyOiBIVFRQIFN0YXR1cyAwIHJlY2VpdmVkLiIpLE1tdC5hZGQodCxuKTtmb3IobGV0IHQ9MCxlPW8ubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9b1t0XTtlLm9uTG9hZCYmZS5vbkxvYWQobil9aS5tYW5hZ2VyLml0ZW1FbmQodCl9ZWxzZXtmb3IobGV0IHQ9MCxuPW8ubGVuZ3RoO3Q8bjt0Kyspe2NvbnN0IG49b1t0XTtuLm9uRXJyb3ImJm4ub25FcnJvcihlKX1pLm1hbmFnZXIuaXRlbUVycm9yKHQpLGkubWFuYWdlci5pdGVtRW5kKHQpfX0pLCExKSxzLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIiwoZnVuY3Rpb24oZSl7Y29uc3Qgbj1PbXRbdF07Zm9yKGxldCB0PTAsbz1uLmxlbmd0aDt0PG87dCsrKXtjb25zdCBvPW5bdF07by5vblByb2dyZXNzJiZvLm9uUHJvZ3Jlc3MoZSl9fSksITEpLHMuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLChmdW5jdGlvbihlKXtjb25zdCBuPU9tdFt0XTtkZWxldGUgT210W3RdO2ZvcihsZXQgdD0wLG89bi5sZW5ndGg7dDxvO3QrKyl7Y29uc3Qgbz1uW3RdO28ub25FcnJvciYmby5vbkVycm9yKGUpfWkubWFuYWdlci5pdGVtRXJyb3IodCksaS5tYW5hZ2VyLml0ZW1FbmQodCl9KSwhMSkscy5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsKGZ1bmN0aW9uKGUpe2NvbnN0IG49T210W3RdO2RlbGV0ZSBPbXRbdF07Zm9yKGxldCB0PTAsbz1uLmxlbmd0aDt0PG87dCsrKXtjb25zdCBvPW5bdF07by5vbkVycm9yJiZvLm9uRXJyb3IoZSl9aS5tYW5hZ2VyLml0ZW1FcnJvcih0KSxpLm1hbmFnZXIuaXRlbUVuZCh0KX0pLCExKSx2b2lkIDAhPT10aGlzLnJlc3BvbnNlVHlwZSYmKHMucmVzcG9uc2VUeXBlPXRoaXMucmVzcG9uc2VUeXBlKSx2b2lkIDAhPT10aGlzLndpdGhDcmVkZW50aWFscyYmKHMud2l0aENyZWRlbnRpYWxzPXRoaXMud2l0aENyZWRlbnRpYWxzKSxzLm92ZXJyaWRlTWltZVR5cGUmJnMub3ZlcnJpZGVNaW1lVHlwZSh2b2lkIDAhPT10aGlzLm1pbWVUeXBlP3RoaXMubWltZVR5cGU6InRleHQvcGxhaW4iKTtmb3IoY29uc3QgdCBpbiB0aGlzLnJlcXVlc3RIZWFkZXIpcy5zZXRSZXF1ZXN0SGVhZGVyKHQsdGhpcy5yZXF1ZXN0SGVhZGVyW3RdKTtzLnNlbmQobnVsbCl9cmV0dXJuIGkubWFuYWdlci5pdGVtU3RhcnQodCksc31zZXRSZXNwb25zZVR5cGUodCl7cmV0dXJuIHRoaXMucmVzcG9uc2VUeXBlPXQsdGhpc31zZXRNaW1lVHlwZSh0KXtyZXR1cm4gdGhpcy5taW1lVHlwZT10LHRoaXN9fWNsYXNzIHdtdCBleHRlbmRzIHhtdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxuLG8pe3ZvaWQgMCE9PXRoaXMucGF0aCYmKHQ9dGhpcy5wYXRoK3QpLHQ9dGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwodCk7Y29uc3QgaT10aGlzLGE9TW10LmdldCh0KTtpZih2b2lkIDAhPT1hKXJldHVybiBpLm1hbmFnZXIuaXRlbVN0YXJ0KHQpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZSYmZShhKSxpLm1hbmFnZXIuaXRlbUVuZCh0KX0pLDApLGE7Y29uc3Qgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJpbWciKTtmdW5jdGlvbiBzKCl7ci5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixzLCExKSxyLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIixsLCExKSxNbXQuYWRkKHQsdGhpcyksZSYmZSh0aGlzKSxpLm1hbmFnZXIuaXRlbUVuZCh0KX1mdW5jdGlvbiBsKGUpe3IucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIscywhMSksci5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsbCwhMSksbyYmbyhlKSxpLm1hbmFnZXIuaXRlbUVycm9yKHQpLGkubWFuYWdlci5pdGVtRW5kKHQpfXJldHVybiByLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLHMsITEpLHIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGwsITEpLCJkYXRhOiIhPT10LnN1YnN0cigwLDUpJiZ2b2lkIDAhPT10aGlzLmNyb3NzT3JpZ2luJiYoci5jcm9zc09yaWdpbj10aGlzLmNyb3NzT3JpZ2luKSxpLm1hbmFnZXIuaXRlbVN0YXJ0KHQpLHIuc3JjPXQscn19Y2xhc3Mga210IGV4dGVuZHMgeG10e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4sbyl7Y29uc3QgaT1uZXcgdnN0LGE9bmV3IHdtdCh0aGlzLm1hbmFnZXIpO2Euc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbiksYS5zZXRQYXRoKHRoaXMucGF0aCk7bGV0IHI9MDtmdW5jdGlvbiBzKG4pe2EubG9hZCh0W25dLChmdW5jdGlvbih0KXtpLmltYWdlc1tuXT10LHIrKyw2PT09ciYmKGkubmVlZHNVcGRhdGU9ITAsZSYmZShpKSl9KSx2b2lkIDAsbyl9Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDsrK2UpcyhlKTtyZXR1cm4gaX19Y2xhc3MgU210IGV4dGVuZHMgeG10e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4sbyl7Y29uc3QgaT1uZXcgb2F0LGE9bmV3IHdtdCh0aGlzLm1hbmFnZXIpO3JldHVybiBhLnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pLGEuc2V0UGF0aCh0aGlzLnBhdGgpLGEubG9hZCh0LChmdW5jdGlvbihuKXtpLmltYWdlPW47Y29uc3Qgbz10LnNlYXJjaCgvXC5qcGU/ZygkfFw/KS9pKT4wfHwwPT09dC5zZWFyY2goL15kYXRhXDppbWFnZVwvanBlZy8pO2kuZm9ybWF0PW8/UGl0OndpdCxpLm5lZWRzVXBkYXRlPSEwLHZvaWQgMCE9PWUmJmUoaSl9KSxuLG8pLGl9fWNsYXNzIERtdCBleHRlbmRzIGRwdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy50eXBlPSJDdXJ2ZVBhdGgiLHRoaXMuY3VydmVzPVtdLHRoaXMuYXV0b0Nsb3NlPSExfWFkZCh0KXt0aGlzLmN1cnZlcy5wdXNoKHQpfWNsb3NlUGF0aCgpe2NvbnN0IHQ9dGhpcy5jdXJ2ZXNbMF0uZ2V0UG9pbnQoMCksZT10aGlzLmN1cnZlc1t0aGlzLmN1cnZlcy5sZW5ndGgtMV0uZ2V0UG9pbnQoMSk7dC5lcXVhbHMoZSl8fHRoaXMuY3VydmVzLnB1c2gobmV3IE9wdChlLHQpKX1nZXRQb2ludCh0KXtjb25zdCBlPXQqdGhpcy5nZXRMZW5ndGgoKSxuPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7bGV0IG89MDtmb3IoO288bi5sZW5ndGg7KXtpZihuW29dPj1lKXtjb25zdCB0PW5bb10tZSxpPXRoaXMuY3VydmVzW29dLGE9aS5nZXRMZW5ndGgoKTtyZXR1cm4gaS5nZXRQb2ludEF0KDA9PT1hPzA6MS10L2EpfW8rK31yZXR1cm4gbnVsbH1nZXRMZW5ndGgoKXtjb25zdCB0PXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7cmV0dXJuIHRbdC5sZW5ndGgtMV19dXBkYXRlQXJjTGVuZ3Rocygpe3RoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5jYWNoZUxlbmd0aHM9bnVsbCx0aGlzLmdldEN1cnZlTGVuZ3RocygpfWdldEN1cnZlTGVuZ3Rocygpe2lmKHRoaXMuY2FjaGVMZW5ndGhzJiZ0aGlzLmNhY2hlTGVuZ3Rocy5sZW5ndGg9PT10aGlzLmN1cnZlcy5sZW5ndGgpcmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzO2NvbnN0IHQ9W107bGV0IGU9MDtmb3IobGV0IG49MCxvPXRoaXMuY3VydmVzLmxlbmd0aDtuPG87bisrKWUrPXRoaXMuY3VydmVzW25dLmdldExlbmd0aCgpLHQucHVzaChlKTtyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM9dCx0fWdldFNwYWNlZFBvaW50cyh0PTQwKXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248PXQ7bisrKWUucHVzaCh0aGlzLmdldFBvaW50KG4vdCkpO3JldHVybiB0aGlzLmF1dG9DbG9zZSYmZS5wdXNoKGVbMF0pLGV9Z2V0UG9pbnRzKHQ9MTIpe2NvbnN0IGU9W107bGV0IG47Zm9yKGxldCBvPTAsaT10aGlzLmN1cnZlcztvPGkubGVuZ3RoO28rKyl7Y29uc3QgYT1pW29dLHI9YS5nZXRQb2ludHMoYSYmYS5pc0VsbGlwc2VDdXJ2ZT8yKnQ6YSYmKGEuaXNMaW5lQ3VydmV8fGEuaXNMaW5lQ3VydmUzKT8xOmEmJmEuaXNTcGxpbmVDdXJ2ZT90KmEucG9pbnRzLmxlbmd0aDp0KTtmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrKyl7Y29uc3Qgbz1yW3RdO24mJm4uZXF1YWxzKG8pfHwoZS5wdXNoKG8pLG49byl9fXJldHVybiB0aGlzLmF1dG9DbG9zZSYmZS5sZW5ndGg+MSYmIWVbZS5sZW5ndGgtMV0uZXF1YWxzKGVbMF0pJiZlLnB1c2goZVswXSksZX1jb3B5KHQpe3N1cGVyLmNvcHkodCksdGhpcy5jdXJ2ZXM9W107Zm9yKGxldCBlPTAsbj10LmN1cnZlcy5sZW5ndGg7ZTxuO2UrKyl0aGlzLmN1cnZlcy5wdXNoKHQuY3VydmVzW2VdLmNsb25lKCkpO3JldHVybiB0aGlzLmF1dG9DbG9zZT10LmF1dG9DbG9zZSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7dC5hdXRvQ2xvc2U9dGhpcy5hdXRvQ2xvc2UsdC5jdXJ2ZXM9W107Zm9yKGxldCBlPTAsbj10aGlzLmN1cnZlcy5sZW5ndGg7ZTxuO2UrKyl0LmN1cnZlcy5wdXNoKHRoaXMuY3VydmVzW2VdLnRvSlNPTigpKTtyZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLmF1dG9DbG9zZT10LmF1dG9DbG9zZSx0aGlzLmN1cnZlcz1bXTtmb3IobGV0IGU9MCxuPXQuY3VydmVzLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBuPXQuY3VydmVzW2VdO3RoaXMuY3VydmVzLnB1c2goKG5ldyBTcHRbbi50eXBlXSkuZnJvbUpTT04obikpfXJldHVybiB0aGlzfX1jbGFzcyBFbXQgZXh0ZW5kcyBEbXR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9IlBhdGgiLHRoaXMuY3VycmVudFBvaW50PW5ldyBRaXQsdCYmdGhpcy5zZXRGcm9tUG9pbnRzKHQpfXNldEZyb21Qb2ludHModCl7dGhpcy5tb3ZlVG8odFswXS54LHRbMF0ueSk7Zm9yKGxldCBlPTEsbj10Lmxlbmd0aDtlPG47ZSsrKXRoaXMubGluZVRvKHRbZV0ueCx0W2VdLnkpO3JldHVybiB0aGlzfW1vdmVUbyh0LGUpe3JldHVybiB0aGlzLmN1cnJlbnRQb2ludC5zZXQodCxlKSx0aGlzfWxpbmVUbyh0LGUpe2NvbnN0IG49bmV3IE9wdCh0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBRaXQodCxlKSk7cmV0dXJuIHRoaXMuY3VydmVzLnB1c2gobiksdGhpcy5jdXJyZW50UG9pbnQuc2V0KHQsZSksdGhpc31xdWFkcmF0aWNDdXJ2ZVRvKHQsZSxuLG8pe2NvbnN0IGk9bmV3IFBwdCh0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBRaXQodCxlKSxuZXcgUWl0KG4sbykpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKGkpLHRoaXMuY3VycmVudFBvaW50LnNldChuLG8pLHRoaXN9YmV6aWVyQ3VydmVUbyh0LGUsbixvLGksYSl7Y29uc3Qgcj1uZXcgdnB0KHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksbmV3IFFpdCh0LGUpLG5ldyBRaXQobixvKSxuZXcgUWl0KGksYSkpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKHIpLHRoaXMuY3VycmVudFBvaW50LnNldChpLGEpLHRoaXN9c3BsaW5lVGhydSh0KXtjb25zdCBlPVt0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpXS5jb25jYXQodCksbj1uZXcga3B0KGUpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKG4pLHRoaXMuY3VycmVudFBvaW50LmNvcHkodFt0Lmxlbmd0aC0xXSksdGhpc31hcmModCxlLG4sbyxpLGEpe3JldHVybiB0aGlzLmFic2FyYyh0K3RoaXMuY3VycmVudFBvaW50LngsZSt0aGlzLmN1cnJlbnRQb2ludC55LG4sbyxpLGEpLHRoaXN9YWJzYXJjKHQsZSxuLG8saSxhKXtyZXR1cm4gdGhpcy5hYnNlbGxpcHNlKHQsZSxuLG4sbyxpLGEpLHRoaXN9ZWxsaXBzZSh0LGUsbixvLGksYSxyLHMpe3JldHVybiB0aGlzLmFic2VsbGlwc2UodCt0aGlzLmN1cnJlbnRQb2ludC54LGUrdGhpcy5jdXJyZW50UG9pbnQueSxuLG8saSxhLHIscyksdGhpc31hYnNlbGxpcHNlKHQsZSxuLG8saSxhLHIscyl7Y29uc3QgbD1uZXcgcHB0KHQsZSxuLG8saSxhLHIscyk7aWYodGhpcy5jdXJ2ZXMubGVuZ3RoPjApe2NvbnN0IHQ9bC5nZXRQb2ludCgwKTt0LmVxdWFscyh0aGlzLmN1cnJlbnRQb2ludCl8fHRoaXMubGluZVRvKHQueCx0LnkpfXRoaXMuY3VydmVzLnB1c2gobCk7Y29uc3QgYz1sLmdldFBvaW50KDEpO3JldHVybiB0aGlzLmN1cnJlbnRQb2ludC5jb3B5KGMpLHRoaXN9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmN1cnJlbnRQb2ludC5jb3B5KHQuY3VycmVudFBvaW50KSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQuY3VycmVudFBvaW50PXRoaXMuY3VycmVudFBvaW50LnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLmN1cnJlbnRQb2ludC5mcm9tQXJyYXkodC5jdXJyZW50UG9pbnQpLHRoaXN9fWNsYXNzIFJtdCBleHRlbmRzIEVtdHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLnV1aWQ9cWl0KCksdGhpcy50eXBlPSJTaGFwZSIsdGhpcy5ob2xlcz1bXX1nZXRQb2ludHNIb2xlcyh0KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wLG89dGhpcy5ob2xlcy5sZW5ndGg7bjxvO24rKyllW25dPXRoaXMuaG9sZXNbbl0uZ2V0UG9pbnRzKHQpO3JldHVybiBlfWV4dHJhY3RQb2ludHModCl7cmV0dXJue3NoYXBlOnRoaXMuZ2V0UG9pbnRzKHQpLGhvbGVzOnRoaXMuZ2V0UG9pbnRzSG9sZXModCl9fWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLmhvbGVzPVtdO2ZvcihsZXQgZT0wLG49dC5ob2xlcy5sZW5ndGg7ZTxuO2UrKyl0aGlzLmhvbGVzLnB1c2godC5ob2xlc1tlXS5jbG9uZSgpKTtyZXR1cm4gdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QudXVpZD10aGlzLnV1aWQsdC5ob2xlcz1bXTtmb3IobGV0IGU9MCxuPXRoaXMuaG9sZXMubGVuZ3RoO2U8bjtlKyspdC5ob2xlcy5wdXNoKHRoaXMuaG9sZXNbZV0udG9KU09OKCkpO3JldHVybiB0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMudXVpZD10LnV1aWQsdGhpcy5ob2xlcz1bXTtmb3IobGV0IGU9MCxuPXQuaG9sZXMubGVuZ3RoO2U8bjtlKyspe2NvbnN0IG49dC5ob2xlc1tlXTt0aGlzLmhvbGVzLnB1c2goKG5ldyBFbXQpLmZyb21KU09OKG4pKX1yZXR1cm4gdGhpc319Y2xhc3MgQW10IGV4dGVuZHMgcHJ0e2NvbnN0cnVjdG9yKHQsZT0xKXtzdXBlcigpLHRoaXMudHlwZT0iTGlnaHQiLHRoaXMuY29sb3I9bmV3IFJydCh0KSx0aGlzLmludGVuc2l0eT1lfWRpc3Bvc2UoKXt9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5pbnRlbnNpdHk9dC5pbnRlbnNpdHksdGhpc310b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUub2JqZWN0LmNvbG9yPXRoaXMuY29sb3IuZ2V0SGV4KCksZS5vYmplY3QuaW50ZW5zaXR5PXRoaXMuaW50ZW5zaXR5LHZvaWQgMCE9PXRoaXMuZ3JvdW5kQ29sb3ImJihlLm9iamVjdC5ncm91bmRDb2xvcj10aGlzLmdyb3VuZENvbG9yLmdldEhleCgpKSx2b2lkIDAhPT10aGlzLmRpc3RhbmNlJiYoZS5vYmplY3QuZGlzdGFuY2U9dGhpcy5kaXN0YW5jZSksdm9pZCAwIT09dGhpcy5hbmdsZSYmKGUub2JqZWN0LmFuZ2xlPXRoaXMuYW5nbGUpLHZvaWQgMCE9PXRoaXMuZGVjYXkmJihlLm9iamVjdC5kZWNheT10aGlzLmRlY2F5KSx2b2lkIDAhPT10aGlzLnBlbnVtYnJhJiYoZS5vYmplY3QucGVudW1icmE9dGhpcy5wZW51bWJyYSksdm9pZCAwIT09dGhpcy5zaGFkb3cmJihlLm9iamVjdC5zaGFkb3c9dGhpcy5zaGFkb3cudG9KU09OKCkpLGV9fUFtdC5wcm90b3R5cGUuaXNMaWdodD0hMCxjbGFzcyBleHRlbmRzIEFtdHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodCxuKSx0aGlzLnR5cGU9IkhlbWlzcGhlcmVMaWdodCIsdGhpcy5wb3NpdGlvbi5jb3B5KHBydC5EZWZhdWx0VXApLHRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5ncm91bmRDb2xvcj1uZXcgUnJ0KGUpfWNvcHkodCl7cmV0dXJuIEFtdC5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsdCksdGhpcy5ncm91bmRDb2xvci5jb3B5KHQuZ3JvdW5kQ29sb3IpLHRoaXN9fS5wcm90b3R5cGUuaXNIZW1pc3BoZXJlTGlnaHQ9ITA7Y29uc3QgVG10PW5ldyBCYXQsTm10PW5ldyBjYXQsem10PW5ldyBjYXQ7Y2xhc3MgSW10e2NvbnN0cnVjdG9yKHQpe3RoaXMuY2FtZXJhPXQsdGhpcy5iaWFzPTAsdGhpcy5ub3JtYWxCaWFzPTAsdGhpcy5yYWRpdXM9MSx0aGlzLm1hcFNpemU9bmV3IFFpdCg1MTIsNTEyKSx0aGlzLm1hcD1udWxsLHRoaXMubWFwUGFzcz1udWxsLHRoaXMubWF0cml4PW5ldyBCYXQsdGhpcy5hdXRvVXBkYXRlPSEwLHRoaXMubmVlZHNVcGRhdGU9ITEsdGhpcy5fZnJ1c3R1bT1uZXcgRXN0LHRoaXMuX2ZyYW1lRXh0ZW50cz1uZXcgUWl0KDEsMSksdGhpcy5fdmlld3BvcnRDb3VudD0xLHRoaXMuX3ZpZXdwb3J0cz1bbmV3IGFhdCgwLDAsMSwxKV19Z2V0Vmlld3BvcnRDb3VudCgpe3JldHVybiB0aGlzLl92aWV3cG9ydENvdW50fWdldEZydXN0dW0oKXtyZXR1cm4gdGhpcy5fZnJ1c3R1bX11cGRhdGVNYXRyaWNlcyh0KXtjb25zdCBlPXRoaXMuY2FtZXJhLG49dGhpcy5tYXRyaXg7Tm10LnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKSxlLnBvc2l0aW9uLmNvcHkoTm10KSx6bXQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQudGFyZ2V0Lm1hdHJpeFdvcmxkKSxlLmxvb2tBdCh6bXQpLGUudXBkYXRlTWF0cml4V29ybGQoKSxUbXQubXVsdGlwbHlNYXRyaWNlcyhlLnByb2plY3Rpb25NYXRyaXgsZS5tYXRyaXhXb3JsZEludmVyc2UpLHRoaXMuX2ZydXN0dW0uc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoVG10KSxuLnNldCguNSwwLDAsLjUsMCwuNSwwLC41LDAsMCwuNSwuNSwwLDAsMCwxKSxuLm11bHRpcGx5KGUucHJvamVjdGlvbk1hdHJpeCksbi5tdWx0aXBseShlLm1hdHJpeFdvcmxkSW52ZXJzZSl9Z2V0Vmlld3BvcnQodCl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0c1t0XX1nZXRGcmFtZUV4dGVudHMoKXtyZXR1cm4gdGhpcy5fZnJhbWVFeHRlbnRzfWRpc3Bvc2UoKXt0aGlzLm1hcCYmdGhpcy5tYXAuZGlzcG9zZSgpLHRoaXMubWFwUGFzcyYmdGhpcy5tYXBQYXNzLmRpc3Bvc2UoKX1jb3B5KHQpe3JldHVybiB0aGlzLmNhbWVyYT10LmNhbWVyYS5jbG9uZSgpLHRoaXMuYmlhcz10LmJpYXMsdGhpcy5yYWRpdXM9dC5yYWRpdXMsdGhpcy5tYXBTaXplLmNvcHkodC5tYXBTaXplKSx0aGlzfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfXRvSlNPTigpe2NvbnN0IHQ9e307cmV0dXJuIDAhPT10aGlzLmJpYXMmJih0LmJpYXM9dGhpcy5iaWFzKSwwIT09dGhpcy5ub3JtYWxCaWFzJiYodC5ub3JtYWxCaWFzPXRoaXMubm9ybWFsQmlhcyksMSE9PXRoaXMucmFkaXVzJiYodC5yYWRpdXM9dGhpcy5yYWRpdXMpLDUxMj09PXRoaXMubWFwU2l6ZS54JiY1MTI9PT10aGlzLm1hcFNpemUueXx8KHQubWFwU2l6ZT10aGlzLm1hcFNpemUudG9BcnJheSgpKSx0LmNhbWVyYT10aGlzLmNhbWVyYS50b0pTT04oITEpLm9iamVjdCxkZWxldGUgdC5jYW1lcmEubWF0cml4LHR9fWNsYXNzIEhtdCBleHRlbmRzIEltdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKG5ldyBfc3QoNTAsMSwuNSw1MDApKSx0aGlzLmZvY3VzPTF9dXBkYXRlTWF0cmljZXModCl7Y29uc3QgZT10aGlzLmNhbWVyYSxuPTIqWWl0KnQuYW5nbGUqdGhpcy5mb2N1cyxvPXRoaXMubWFwU2l6ZS53aWR0aC90aGlzLm1hcFNpemUuaGVpZ2h0LGk9dC5kaXN0YW5jZXx8ZS5mYXI7bj09PWUuZm92JiZvPT09ZS5hc3BlY3QmJmk9PT1lLmZhcnx8KGUuZm92PW4sZS5hc3BlY3Q9byxlLmZhcj1pLGUudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpKSxzdXBlci51cGRhdGVNYXRyaWNlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuZm9jdXM9dC5mb2N1cyx0aGlzfX1IbXQucHJvdG90eXBlLmlzU3BvdExpZ2h0U2hhZG93PSEwLGNsYXNzIGV4dGVuZHMgQW10e2NvbnN0cnVjdG9yKHQsZSxuPTAsbz1NYXRoLlBJLzMsaT0wLGE9MSl7c3VwZXIodCxlKSx0aGlzLnR5cGU9IlNwb3RMaWdodCIsdGhpcy5wb3NpdGlvbi5jb3B5KHBydC5EZWZhdWx0VXApLHRoaXMudXBkYXRlTWF0cml4KCksdGhpcy50YXJnZXQ9bmV3IHBydCx0aGlzLmRpc3RhbmNlPW4sdGhpcy5hbmdsZT1vLHRoaXMucGVudW1icmE9aSx0aGlzLmRlY2F5PWEsdGhpcy5zaGFkb3c9bmV3IEhtdH1nZXQgcG93ZXIoKXtyZXR1cm4gdGhpcy5pbnRlbnNpdHkqTWF0aC5QSX1zZXQgcG93ZXIodCl7dGhpcy5pbnRlbnNpdHk9dC9NYXRoLlBJfWRpc3Bvc2UoKXt0aGlzLnNoYWRvdy5kaXNwb3NlKCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmRpc3RhbmNlPXQuZGlzdGFuY2UsdGhpcy5hbmdsZT10LmFuZ2xlLHRoaXMucGVudW1icmE9dC5wZW51bWJyYSx0aGlzLmRlY2F5PXQuZGVjYXksdGhpcy50YXJnZXQ9dC50YXJnZXQuY2xvbmUoKSx0aGlzLnNoYWRvdz10LnNoYWRvdy5jbG9uZSgpLHRoaXN9fS5wcm90b3R5cGUuaXNTcG90TGlnaHQ9ITA7Y29uc3QgRm10PW5ldyBCYXQsTG10PW5ldyBjYXQsQm10PW5ldyBjYXQ7Y2xhc3MgVm10IGV4dGVuZHMgSW10e2NvbnN0cnVjdG9yKCl7c3VwZXIobmV3IF9zdCg5MCwxLC41LDUwMCkpLHRoaXMuX2ZyYW1lRXh0ZW50cz1uZXcgUWl0KDQsMiksdGhpcy5fdmlld3BvcnRDb3VudD02LHRoaXMuX3ZpZXdwb3J0cz1bbmV3IGFhdCgyLDEsMSwxKSxuZXcgYWF0KDAsMSwxLDEpLG5ldyBhYXQoMywxLDEsMSksbmV3IGFhdCgxLDEsMSwxKSxuZXcgYWF0KDMsMCwxLDEpLG5ldyBhYXQoMSwwLDEsMSldLHRoaXMuX2N1YmVEaXJlY3Rpb25zPVtuZXcgY2F0KDEsMCwwKSxuZXcgY2F0KC0xLDAsMCksbmV3IGNhdCgwLDAsMSksbmV3IGNhdCgwLDAsLTEpLG5ldyBjYXQoMCwxLDApLG5ldyBjYXQoMCwtMSwwKV0sdGhpcy5fY3ViZVVwcz1bbmV3IGNhdCgwLDEsMCksbmV3IGNhdCgwLDEsMCksbmV3IGNhdCgwLDEsMCksbmV3IGNhdCgwLDEsMCksbmV3IGNhdCgwLDAsMSksbmV3IGNhdCgwLDAsLTEpXX11cGRhdGVNYXRyaWNlcyh0LGU9MCl7Y29uc3Qgbj10aGlzLmNhbWVyYSxvPXRoaXMubWF0cml4LGk9dC5kaXN0YW5jZXx8bi5mYXI7aSE9PW4uZmFyJiYobi5mYXI9aSxuLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSksTG10LnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKSxuLnBvc2l0aW9uLmNvcHkoTG10KSxCbXQuY29weShuLnBvc2l0aW9uKSxCbXQuYWRkKHRoaXMuX2N1YmVEaXJlY3Rpb25zW2VdKSxuLnVwLmNvcHkodGhpcy5fY3ViZVVwc1tlXSksbi5sb29rQXQoQm10KSxuLnVwZGF0ZU1hdHJpeFdvcmxkKCksby5tYWtlVHJhbnNsYXRpb24oLUxtdC54LC1MbXQueSwtTG10LnopLEZtdC5tdWx0aXBseU1hdHJpY2VzKG4ucHJvamVjdGlvbk1hdHJpeCxuLm1hdHJpeFdvcmxkSW52ZXJzZSksdGhpcy5fZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChGbXQpfX1WbXQucHJvdG90eXBlLmlzUG9pbnRMaWdodFNoYWRvdz0hMCxjbGFzcyBleHRlbmRzIEFtdHtjb25zdHJ1Y3Rvcih0LGUsbj0wLG89MSl7c3VwZXIodCxlKSx0aGlzLnR5cGU9IlBvaW50TGlnaHQiLHRoaXMuZGlzdGFuY2U9bix0aGlzLmRlY2F5PW8sdGhpcy5zaGFkb3c9bmV3IFZtdH1nZXQgcG93ZXIoKXtyZXR1cm4gNCp0aGlzLmludGVuc2l0eSpNYXRoLlBJfXNldCBwb3dlcih0KXt0aGlzLmludGVuc2l0eT10Lyg0Kk1hdGguUEkpfWRpc3Bvc2UoKXt0aGlzLnNoYWRvdy5kaXNwb3NlKCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmRpc3RhbmNlPXQuZGlzdGFuY2UsdGhpcy5kZWNheT10LmRlY2F5LHRoaXMuc2hhZG93PXQuc2hhZG93LmNsb25lKCksdGhpc319LnByb3RvdHlwZS5pc1BvaW50TGlnaHQ9ITA7Y2xhc3Mgam10IGV4dGVuZHMgSW10e2NvbnN0cnVjdG9yKCl7c3VwZXIobmV3IFVzdCgtNSw1LDUsLTUsLjUsNTAwKSl9fWptdC5wcm90b3R5cGUuaXNEaXJlY3Rpb25hbExpZ2h0U2hhZG93PSEwLGNsYXNzIGV4dGVuZHMgQW10e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLnR5cGU9IkRpcmVjdGlvbmFsTGlnaHQiLHRoaXMucG9zaXRpb24uY29weShwcnQuRGVmYXVsdFVwKSx0aGlzLnVwZGF0ZU1hdHJpeCgpLHRoaXMudGFyZ2V0PW5ldyBwcnQsdGhpcy5zaGFkb3c9bmV3IGptdH1kaXNwb3NlKCl7dGhpcy5zaGFkb3cuZGlzcG9zZSgpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy50YXJnZXQ9dC50YXJnZXQuY2xvbmUoKSx0aGlzLnNoYWRvdz10LnNoYWRvdy5jbG9uZSgpLHRoaXN9fS5wcm90b3R5cGUuaXNEaXJlY3Rpb25hbExpZ2h0PSEwLGNsYXNzIGV4dGVuZHMgQW10e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLnR5cGU9IkFtYmllbnRMaWdodCJ9fS5wcm90b3R5cGUuaXNBbWJpZW50TGlnaHQ9ITAsY2xhc3MgZXh0ZW5kcyBBbXR7Y29uc3RydWN0b3IodCxlLG49MTAsbz0xMCl7c3VwZXIodCxlKSx0aGlzLnR5cGU9IlJlY3RBcmVhTGlnaHQiLHRoaXMud2lkdGg9bix0aGlzLmhlaWdodD1vfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy53aWR0aD10LndpZHRoLHRoaXMuaGVpZ2h0PXQuaGVpZ2h0LHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO3JldHVybiBlLm9iamVjdC53aWR0aD10aGlzLndpZHRoLGUub2JqZWN0LmhlaWdodD10aGlzLmhlaWdodCxlfX0ucHJvdG90eXBlLmlzUmVjdEFyZWFMaWdodD0hMDtjbGFzcyBVbXR7Y29uc3RydWN0b3IoKXt0aGlzLmNvZWZmaWNpZW50cz1bXTtmb3IobGV0IHQ9MDt0PDk7dCsrKXRoaXMuY29lZmZpY2llbnRzLnB1c2gobmV3IGNhdCl9c2V0KHQpe2ZvcihsZXQgZT0wO2U8OTtlKyspdGhpcy5jb2VmZmljaWVudHNbZV0uY29weSh0W2VdKTtyZXR1cm4gdGhpc316ZXJvKCl7Zm9yKGxldCB0PTA7dDw5O3QrKyl0aGlzLmNvZWZmaWNpZW50c1t0XS5zZXQoMCwwLDApO3JldHVybiB0aGlzfWdldEF0KHQsZSl7Y29uc3Qgbj10Lngsbz10LnksaT10LnosYT10aGlzLmNvZWZmaWNpZW50cztyZXR1cm4gZS5jb3B5KGFbMF0pLm11bHRpcGx5U2NhbGFyKC4yODIwOTUpLGUuYWRkU2NhbGVkVmVjdG9yKGFbMV0sLjQ4ODYwMypvKSxlLmFkZFNjYWxlZFZlY3RvcihhWzJdLC40ODg2MDMqaSksZS5hZGRTY2FsZWRWZWN0b3IoYVszXSwuNDg4NjAzKm4pLGUuYWRkU2NhbGVkVmVjdG9yKGFbNF0sbipvKjEuMDkyNTQ4KSxlLmFkZFNjYWxlZFZlY3RvcihhWzVdLG8qaSoxLjA5MjU0OCksZS5hZGRTY2FsZWRWZWN0b3IoYVs2XSwuMzE1MzkyKigzKmkqaS0xKSksZS5hZGRTY2FsZWRWZWN0b3IoYVs3XSxuKmkqMS4wOTI1NDgpLGUuYWRkU2NhbGVkVmVjdG9yKGFbOF0sLjU0NjI3NCoobipuLW8qbykpLGV9Z2V0SXJyYWRpYW5jZUF0KHQsZSl7Y29uc3Qgbj10Lngsbz10LnksaT10LnosYT10aGlzLmNvZWZmaWNpZW50cztyZXR1cm4gZS5jb3B5KGFbMF0pLm11bHRpcGx5U2NhbGFyKC44ODYyMjcpLGUuYWRkU2NhbGVkVmVjdG9yKGFbMV0sMS4wMjMzMjgqbyksZS5hZGRTY2FsZWRWZWN0b3IoYVsyXSwxLjAyMzMyOCppKSxlLmFkZFNjYWxlZFZlY3RvcihhWzNdLDEuMDIzMzI4Km4pLGUuYWRkU2NhbGVkVmVjdG9yKGFbNF0sLjg1ODA4NipuKm8pLGUuYWRkU2NhbGVkVmVjdG9yKGFbNV0sLjg1ODA4NipvKmkpLGUuYWRkU2NhbGVkVmVjdG9yKGFbNl0sLjc0MzEyNSppKmktLjI0NzcwOCksZS5hZGRTY2FsZWRWZWN0b3IoYVs3XSwuODU4MDg2Km4qaSksZS5hZGRTY2FsZWRWZWN0b3IoYVs4XSwuNDI5MDQzKihuKm4tbypvKSksZX1hZGQodCl7Zm9yKGxldCBlPTA7ZTw5O2UrKyl0aGlzLmNvZWZmaWNpZW50c1tlXS5hZGQodC5jb2VmZmljaWVudHNbZV0pO3JldHVybiB0aGlzfWFkZFNjYWxlZFNIKHQsZSl7Zm9yKGxldCBuPTA7bjw5O24rKyl0aGlzLmNvZWZmaWNpZW50c1tuXS5hZGRTY2FsZWRWZWN0b3IodC5jb2VmZmljaWVudHNbbl0sZSk7cmV0dXJuIHRoaXN9c2NhbGUodCl7Zm9yKGxldCBlPTA7ZTw5O2UrKyl0aGlzLmNvZWZmaWNpZW50c1tlXS5tdWx0aXBseVNjYWxhcih0KTtyZXR1cm4gdGhpc31sZXJwKHQsZSl7Zm9yKGxldCBuPTA7bjw5O24rKyl0aGlzLmNvZWZmaWNpZW50c1tuXS5sZXJwKHQuY29lZmZpY2llbnRzW25dLGUpO3JldHVybiB0aGlzfWVxdWFscyh0KXtmb3IobGV0IGU9MDtlPDk7ZSsrKWlmKCF0aGlzLmNvZWZmaWNpZW50c1tlXS5lcXVhbHModC5jb2VmZmljaWVudHNbZV0pKXJldHVybiExO3JldHVybiEwfWNvcHkodCl7cmV0dXJuIHRoaXMuc2V0KHQuY29lZmZpY2llbnRzKX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1mcm9tQXJyYXkodCxlPTApe2NvbnN0IG49dGhpcy5jb2VmZmljaWVudHM7Zm9yKGxldCBvPTA7bzw5O28rKyluW29dLmZyb21BcnJheSh0LGUrMypvKTtyZXR1cm4gdGhpc310b0FycmF5KHQ9W10sZT0wKXtjb25zdCBuPXRoaXMuY29lZmZpY2llbnRzO2ZvcihsZXQgbz0wO288OTtvKyspbltvXS50b0FycmF5KHQsZSszKm8pO3JldHVybiB0fXN0YXRpYyBnZXRCYXNpc0F0KHQsZSl7Y29uc3Qgbj10Lngsbz10LnksaT10Lno7ZVswXT0uMjgyMDk1LGVbMV09LjQ4ODYwMypvLGVbMl09LjQ4ODYwMyppLGVbM109LjQ4ODYwMypuLGVbNF09MS4wOTI1NDgqbipvLGVbNV09MS4wOTI1NDgqbyppLGVbNl09LjMxNTM5MiooMyppKmktMSksZVs3XT0xLjA5MjU0OCpuKmksZVs4XT0uNTQ2Mjc0KihuKm4tbypvKX19VW10LnByb3RvdHlwZS5pc1NwaGVyaWNhbEhhcm1vbmljczM9ITA7Y2xhc3MgR210IGV4dGVuZHMgQW10e2NvbnN0cnVjdG9yKHQ9bmV3IFVtdCxlPTEpe3N1cGVyKHZvaWQgMCxlKSx0aGlzLnNoPXR9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnNoLmNvcHkodC5zaCksdGhpc31mcm9tSlNPTih0KXtyZXR1cm4gdGhpcy5pbnRlbnNpdHk9dC5pbnRlbnNpdHksdGhpcy5zaC5mcm9tQXJyYXkodC5zaCksdGhpc310b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUub2JqZWN0LnNoPXRoaXMuc2gudG9BcnJheSgpLGV9fWxldCBXbXQ7R210LnByb3RvdHlwZS5pc0xpZ2h0UHJvYmU9ITAsY2xhc3MgZXh0ZW5kcyBxcnR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudHlwZT0iSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkiLHRoaXMuaW5zdGFuY2VDb3VudD0xLzB9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmluc3RhbmNlQ291bnQ9dC5pbnN0YW5jZUNvdW50LHRoaXN9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04odGhpcyk7cmV0dXJuIHQuaW5zdGFuY2VDb3VudD10aGlzLmluc3RhbmNlQ291bnQsdC5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5PSEwLHR9fS5wcm90b3R5cGUuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT0hMCxjbGFzcyBleHRlbmRzIHpydHtjb25zdHJ1Y3Rvcih0LGUsbixvPTEpeyJudW1iZXIiPT10eXBlb2YgbiYmKG89bixuPSExLGNvbnNvbGUuZXJyb3IoIlRIUkVFLkluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZTogVGhlIGNvbnN0cnVjdG9yIG5vdyBleHBlY3RzIG5vcm1hbGl6ZWQgYXMgdGhlIHRoaXJkIGFyZ3VtZW50LiIpKSxzdXBlcih0LGUsbiksdGhpcy5tZXNoUGVyQXR0cmlidXRlPW99Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9dC5tZXNoUGVyQXR0cmlidXRlLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5tZXNoUGVyQXR0cmlidXRlPXRoaXMubWVzaFBlckF0dHJpYnV0ZSx0LmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlPSEwLHR9fS5wcm90b3R5cGUuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU9ITAsY2xhc3MgZXh0ZW5kcyB4bXR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksInVuZGVmaW5lZCI9PXR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcCYmY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogY3JlYXRlSW1hZ2VCaXRtYXAoKSBub3Qgc3VwcG9ydGVkLiIpLCJ1bmRlZmluZWQiPT10eXBlb2YgZmV0Y2gmJmNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGZldGNoKCkgbm90IHN1cHBvcnRlZC4iKSx0aGlzLm9wdGlvbnM9e3ByZW11bHRpcGx5QWxwaGE6Im5vbmUifX1zZXRPcHRpb25zKHQpe3JldHVybiB0aGlzLm9wdGlvbnM9dCx0aGlzfWxvYWQodCxlLG4sbyl7dm9pZCAwPT09dCYmKHQ9IiIpLHZvaWQgMCE9PXRoaXMucGF0aCYmKHQ9dGhpcy5wYXRoK3QpLHQ9dGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwodCk7Y29uc3QgaT10aGlzLGE9TW10LmdldCh0KTtpZih2b2lkIDAhPT1hKXJldHVybiBpLm1hbmFnZXIuaXRlbVN0YXJ0KHQpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZSYmZShhKSxpLm1hbmFnZXIuaXRlbUVuZCh0KX0pLDApLGE7Y29uc3Qgcj17fTtyLmNyZWRlbnRpYWxzPSJhbm9ueW1vdXMiPT09dGhpcy5jcm9zc09yaWdpbj8ic2FtZS1vcmlnaW4iOiJpbmNsdWRlIixyLmhlYWRlcnM9dGhpcy5yZXF1ZXN0SGVhZGVyLGZldGNoKHQscikudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIHQuYmxvYigpfSkpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiBjcmVhdGVJbWFnZUJpdG1hcCh0LE9iamVjdC5hc3NpZ24oaS5vcHRpb25zLHtjb2xvclNwYWNlQ29udmVyc2lvbjoibm9uZSJ9KSl9KSkudGhlbigoZnVuY3Rpb24obil7TW10LmFkZCh0LG4pLGUmJmUobiksaS5tYW5hZ2VyLml0ZW1FbmQodCl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28mJm8oZSksaS5tYW5hZ2VyLml0ZW1FcnJvcih0KSxpLm1hbmFnZXIuaXRlbUVuZCh0KX0pKSxpLm1hbmFnZXIuaXRlbVN0YXJ0KHQpfX0ucHJvdG90eXBlLmlzSW1hZ2VCaXRtYXBMb2FkZXI9ITA7Y2xhc3MgWW10IGV4dGVuZHMgeG10e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLG4sbyl7Y29uc3QgaT10aGlzLGE9bmV3IFBtdCh0aGlzLm1hbmFnZXIpO2Euc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpLGEuc2V0UGF0aCh0aGlzLnBhdGgpLGEuc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLGEuc2V0V2l0aENyZWRlbnRpYWxzKHRoaXMud2l0aENyZWRlbnRpYWxzKSxhLmxvYWQodCwoZnVuY3Rpb24obil7dHJ5e2NvbnN0IHQ9bi5zbGljZSgwKTsodm9pZCAwPT09V210JiYoV210PW5ldyh3aW5kb3cuQXVkaW9Db250ZXh0fHx3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0KSksV210KS5kZWNvZGVBdWRpb0RhdGEodCwoZnVuY3Rpb24odCl7ZSh0KX0pKX1jYXRjaChlKXtvP28oZSk6Y29uc29sZS5lcnJvcihlKSxpLm1hbmFnZXIuaXRlbUVycm9yKHQpfX0pLG4sbyl9fShjbGFzcyBleHRlbmRzIEdtdHtjb25zdHJ1Y3Rvcih0LGUsbj0xKXtzdXBlcih2b2lkIDAsbik7Y29uc3Qgbz0obmV3IFJydCkuc2V0KHQpLGk9KG5ldyBScnQpLnNldChlKSxhPW5ldyBjYXQoby5yLG8uZyxvLmIpLHI9bmV3IGNhdChpLnIsaS5nLGkuYikscz1NYXRoLnNxcnQoTWF0aC5QSSksbD1zKk1hdGguc3FydCguNzUpO3RoaXMuc2guY29lZmZpY2llbnRzWzBdLmNvcHkoYSkuYWRkKHIpLm11bHRpcGx5U2NhbGFyKHMpLHRoaXMuc2guY29lZmZpY2llbnRzWzFdLmNvcHkoYSkuc3ViKHIpLm11bHRpcGx5U2NhbGFyKGwpfX0pLnByb3RvdHlwZS5pc0hlbWlzcGhlcmVMaWdodFByb2JlPSEwLGNsYXNzIGV4dGVuZHMgR210e2NvbnN0cnVjdG9yKHQsZT0xKXtzdXBlcih2b2lkIDAsZSk7Y29uc3Qgbj0obmV3IFJydCkuc2V0KHQpO3RoaXMuc2guY29lZmZpY2llbnRzWzBdLnNldChuLnIsbi5nLG4uYikubXVsdGlwbHlTY2FsYXIoMipNYXRoLnNxcnQoTWF0aC5QSSkpfX0ucHJvdG90eXBlLmlzQW1iaWVudExpZ2h0UHJvYmU9ITA7Y2xhc3MgcW10e2NvbnN0cnVjdG9yKHQsZSxuKXtsZXQgbyxpLGE7c3dpdGNoKHRoaXMuYmluZGluZz10LHRoaXMudmFsdWVTaXplPW4sZSl7Y2FzZSJxdWF0ZXJuaW9uIjpvPXRoaXMuX3NsZXJwLGk9dGhpcy5fc2xlcnBBZGRpdGl2ZSxhPXRoaXMuX3NldEFkZGl0aXZlSWRlbnRpdHlRdWF0ZXJuaW9uLHRoaXMuYnVmZmVyPW5ldyBGbG9hdDY0QXJyYXkoNipuKSx0aGlzLl93b3JrSW5kZXg9NTticmVhaztjYXNlInN0cmluZyI6Y2FzZSJib29sIjpvPXRoaXMuX3NlbGVjdCxpPXRoaXMuX3NlbGVjdCxhPXRoaXMuX3NldEFkZGl0aXZlSWRlbnRpdHlPdGhlcix0aGlzLmJ1ZmZlcj1uZXcgQXJyYXkoNSpuKTticmVhaztkZWZhdWx0Om89dGhpcy5fbGVycCxpPXRoaXMuX2xlcnBBZGRpdGl2ZSxhPXRoaXMuX3NldEFkZGl0aXZlSWRlbnRpdHlOdW1lcmljLHRoaXMuYnVmZmVyPW5ldyBGbG9hdDY0QXJyYXkoNSpuKX10aGlzLl9taXhCdWZmZXJSZWdpb249byx0aGlzLl9taXhCdWZmZXJSZWdpb25BZGRpdGl2ZT1pLHRoaXMuX3NldElkZW50aXR5PWEsdGhpcy5fb3JpZ0luZGV4PTMsdGhpcy5fYWRkSW5kZXg9NCx0aGlzLmN1bXVsYXRpdmVXZWlnaHQ9MCx0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZT0wLHRoaXMudXNlQ291bnQ9MCx0aGlzLnJlZmVyZW5jZUNvdW50PTB9YWNjdW11bGF0ZSh0LGUpe2NvbnN0IG49dGhpcy5idWZmZXIsbz10aGlzLnZhbHVlU2l6ZSxpPXQqbytvO2xldCBhPXRoaXMuY3VtdWxhdGl2ZVdlaWdodDtpZigwPT09YSl7Zm9yKGxldCB0PTA7dCE9PW87Kyt0KW5baSt0XT1uW3RdO2E9ZX1lbHNlIGErPWUsdGhpcy5fbWl4QnVmZmVyUmVnaW9uKG4saSwwLGUvYSxvKTt0aGlzLmN1bXVsYXRpdmVXZWlnaHQ9YX1hY2N1bXVsYXRlQWRkaXRpdmUodCl7Y29uc3QgZT10aGlzLmJ1ZmZlcixuPXRoaXMudmFsdWVTaXplLG89bip0aGlzLl9hZGRJbmRleDswPT09dGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUmJnRoaXMuX3NldElkZW50aXR5KCksdGhpcy5fbWl4QnVmZmVyUmVnaW9uQWRkaXRpdmUoZSxvLDAsdCxuKSx0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSs9dH1hcHBseSh0KXtjb25zdCBlPXRoaXMudmFsdWVTaXplLG49dGhpcy5idWZmZXIsbz10KmUrZSxpPXRoaXMuY3VtdWxhdGl2ZVdlaWdodCxhPXRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlLHI9dGhpcy5iaW5kaW5nO3RoaXMuY3VtdWxhdGl2ZVdlaWdodD0wLHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlPTAsaTwxJiZ0aGlzLl9taXhCdWZmZXJSZWdpb24obixvLGUqdGhpcy5fb3JpZ0luZGV4LDEtaSxlKSxhPjAmJnRoaXMuX21peEJ1ZmZlclJlZ2lvbkFkZGl0aXZlKG4sbyx0aGlzLl9hZGRJbmRleCplLDEsZSk7Zm9yKGxldCB0PWUsaT1lK2U7dCE9PWk7Kyt0KWlmKG5bdF0hPT1uW3QrZV0pe3Iuc2V0VmFsdWUobixvKTticmVha319c2F2ZU9yaWdpbmFsU3RhdGUoKXtjb25zdCB0PXRoaXMuYnVmZmVyLGU9dGhpcy52YWx1ZVNpemUsbj1lKnRoaXMuX29yaWdJbmRleDt0aGlzLmJpbmRpbmcuZ2V0VmFsdWUodCxuKTtmb3IobGV0IG89ZSxpPW47byE9PWk7KytvKXRbb109dFtuK28lZV07dGhpcy5fc2V0SWRlbnRpdHkoKSx0aGlzLmN1bXVsYXRpdmVXZWlnaHQ9MCx0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZT0wfXJlc3RvcmVPcmlnaW5hbFN0YXRlKCl7dGhpcy5iaW5kaW5nLnNldFZhbHVlKHRoaXMuYnVmZmVyLDMqdGhpcy52YWx1ZVNpemUpfV9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYygpe2NvbnN0IHQ9dGhpcy5fYWRkSW5kZXgqdGhpcy52YWx1ZVNpemUsZT10K3RoaXMudmFsdWVTaXplO2ZvcihsZXQgbj10O248ZTtuKyspdGhpcy5idWZmZXJbbl09MH1fc2V0QWRkaXRpdmVJZGVudGl0eVF1YXRlcm5pb24oKXt0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYygpLHRoaXMuYnVmZmVyW3RoaXMuX2FkZEluZGV4KnRoaXMudmFsdWVTaXplKzNdPTF9X3NldEFkZGl0aXZlSWRlbnRpdHlPdGhlcigpe2NvbnN0IHQ9dGhpcy5fb3JpZ0luZGV4KnRoaXMudmFsdWVTaXplLGU9dGhpcy5fYWRkSW5kZXgqdGhpcy52YWx1ZVNpemU7Zm9yKGxldCBuPTA7bjx0aGlzLnZhbHVlU2l6ZTtuKyspdGhpcy5idWZmZXJbZStuXT10aGlzLmJ1ZmZlclt0K25dfV9zZWxlY3QodCxlLG4sbyxpKXtpZihvPj0uNSlmb3IobGV0IG89MDtvIT09aTsrK28pdFtlK29dPXRbbitvXX1fc2xlcnAodCxlLG4sbyl7bGF0LnNsZXJwRmxhdCh0LGUsdCxlLHQsbixvKX1fc2xlcnBBZGRpdGl2ZSh0LGUsbixvLGkpe2NvbnN0IGE9dGhpcy5fd29ya0luZGV4Kmk7bGF0Lm11bHRpcGx5UXVhdGVybmlvbnNGbGF0KHQsYSx0LGUsdCxuKSxsYXQuc2xlcnBGbGF0KHQsZSx0LGUsdCxhLG8pfV9sZXJwKHQsZSxuLG8saSl7Y29uc3QgYT0xLW87Zm9yKGxldCByPTA7ciE9PWk7KytyKXtjb25zdCBpPWUrcjt0W2ldPXRbaV0qYSt0W24rcl0qb319X2xlcnBBZGRpdGl2ZSh0LGUsbixvLGkpe2ZvcihsZXQgYT0wO2EhPT1pOysrYSl7Y29uc3QgaT1lK2E7dFtpXT10W2ldK3RbbithXSpvfX19Y29uc3QgWm10PW5ldyBSZWdFeHAoIltcXFtcXF1cXC46XFwvXSIsImciKSxYbXQ9IlteXFxbXFxdXFwuOlxcL10iLEttdD0iW14iKyJcXFtcXF1cXC46XFwvIi5yZXBsYWNlKCJcXC4iLCIiKSsiXSIsSm10PS8oKD86V0MrW1wvOl0pKikvLnNvdXJjZS5yZXBsYWNlKCJXQyIsWG10KSxRbXQ9LyhXQ09EKyk/Ly5zb3VyY2UucmVwbGFjZSgiV0NPRCIsS210KSwkbXQ9Lyg/OlwuKFdDKykoPzpcWyguKylcXSk/KT8vLnNvdXJjZS5yZXBsYWNlKCJXQyIsWG10KSx0dXQ9L1wuKFdDKykoPzpcWyguKylcXSk/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLFhtdCksZXV0PW5ldyBSZWdFeHAoIl4iK0ptdCtRbXQrJG10K3R1dCsiJCIpLG51dD1bIm1hdGVyaWFsIiwibWF0ZXJpYWxzIiwiYm9uZXMiXTtjbGFzcyBvdXR7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMucGF0aD1lLHRoaXMucGFyc2VkUGF0aD1ufHxvdXQucGFyc2VUcmFja05hbWUoZSksdGhpcy5ub2RlPW91dC5maW5kTm9kZSh0LHRoaXMucGFyc2VkUGF0aC5ub2RlTmFtZSl8fHQsdGhpcy5yb290Tm9kZT10LHRoaXMuZ2V0VmFsdWU9dGhpcy5fZ2V0VmFsdWVfdW5ib3VuZCx0aGlzLnNldFZhbHVlPXRoaXMuX3NldFZhbHVlX3VuYm91bmR9c3RhdGljIGNyZWF0ZSh0LGUsbil7cmV0dXJuIHQmJnQuaXNBbmltYXRpb25PYmplY3RHcm91cD9uZXcgb3V0LkNvbXBvc2l0ZSh0LGUsbik6bmV3IG91dCh0LGUsbil9c3RhdGljIHNhbml0aXplTm9kZU5hbWUodCl7cmV0dXJuIHQucmVwbGFjZSgvXHMvZywiXyIpLnJlcGxhY2UoWm10LCIiKX1zdGF0aWMgcGFyc2VUcmFja05hbWUodCl7Y29uc3QgZT1ldXQuZXhlYyh0KTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIlByb3BlcnR5QmluZGluZzogQ2Fubm90IHBhcnNlIHRyYWNrTmFtZTogIit0KTtjb25zdCBuPXtub2RlTmFtZTplWzJdLG9iamVjdE5hbWU6ZVszXSxvYmplY3RJbmRleDplWzRdLHByb3BlcnR5TmFtZTplWzVdLHByb3BlcnR5SW5kZXg6ZVs2XX0sbz1uLm5vZGVOYW1lJiZuLm5vZGVOYW1lLmxhc3RJbmRleE9mKCIuIik7aWYodm9pZCAwIT09byYmLTEhPT1vKXtjb25zdCB0PW4ubm9kZU5hbWUuc3Vic3RyaW5nKG8rMSk7LTEhPT1udXQuaW5kZXhPZih0KSYmKG4ubm9kZU5hbWU9bi5ub2RlTmFtZS5zdWJzdHJpbmcoMCxvKSxuLm9iamVjdE5hbWU9dCl9aWYobnVsbD09PW4ucHJvcGVydHlOYW1lfHwwPT09bi5wcm9wZXJ0eU5hbWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiUHJvcGVydHlCaW5kaW5nOiBjYW4gbm90IHBhcnNlIHByb3BlcnR5TmFtZSBmcm9tIHRyYWNrTmFtZTogIit0KTtyZXR1cm4gbn1zdGF0aWMgZmluZE5vZGUodCxlKXtpZighZXx8IiI9PT1lfHwiLiI9PT1lfHwtMT09PWV8fGU9PT10Lm5hbWV8fGU9PT10LnV1aWQpcmV0dXJuIHQ7aWYodC5za2VsZXRvbil7Y29uc3Qgbj10LnNrZWxldG9uLmdldEJvbmVCeU5hbWUoZSk7aWYodm9pZCAwIT09bilyZXR1cm4gbn1pZih0LmNoaWxkcmVuKXtjb25zdCBuPWZ1bmN0aW9uKHQpe2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtjb25zdCBpPXRbb107aWYoaS5uYW1lPT09ZXx8aS51dWlkPT09ZSlyZXR1cm4gaTtjb25zdCBhPW4oaS5jaGlsZHJlbik7aWYoYSlyZXR1cm4gYX1yZXR1cm4gbnVsbH0sbz1uKHQuY2hpbGRyZW4pO2lmKG8pcmV0dXJuIG99cmV0dXJuIG51bGx9X2dldFZhbHVlX3VuYXZhaWxhYmxlKCl7fV9zZXRWYWx1ZV91bmF2YWlsYWJsZSgpe31fZ2V0VmFsdWVfZGlyZWN0KHQsZSl7dFtlXT10aGlzLm5vZGVbdGhpcy5wcm9wZXJ0eU5hbWVdfV9nZXRWYWx1ZV9hcnJheSh0LGUpe2NvbnN0IG49dGhpcy5yZXNvbHZlZFByb3BlcnR5O2ZvcihsZXQgbz0wLGk9bi5sZW5ndGg7byE9PWk7KytvKXRbZSsrXT1uW29dfV9nZXRWYWx1ZV9hcnJheUVsZW1lbnQodCxlKXt0W2VdPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdfV9nZXRWYWx1ZV90b0FycmF5KHQsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LnRvQXJyYXkodCxlKX1fc2V0VmFsdWVfZGlyZWN0KHQsZSl7dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdPXRbZV19X3NldFZhbHVlX2RpcmVjdF9zZXROZWVkc1VwZGF0ZSh0LGUpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT10W2VdLHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9kaXJlY3Rfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSh0LGUpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT10W2VdLHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2FycmF5KHQsZSl7Y29uc3Qgbj10aGlzLnJlc29sdmVkUHJvcGVydHk7Zm9yKGxldCBvPTAsaT1uLmxlbmd0aDtvIT09aTsrK28pbltvXT10W2UrK119X3NldFZhbHVlX2FycmF5X3NldE5lZWRzVXBkYXRlKHQsZSl7Y29uc3Qgbj10aGlzLnJlc29sdmVkUHJvcGVydHk7Zm9yKGxldCBvPTAsaT1uLmxlbmd0aDtvIT09aTsrK28pbltvXT10W2UrK107dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2FycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUodCxlKXtjb25zdCBuPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtmb3IobGV0IG89MCxpPW4ubGVuZ3RoO28hPT1pOysrbyluW29dPXRbZSsrXTt0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9hcnJheUVsZW1lbnQodCxlKXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT10W2VdfV9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TmVlZHNVcGRhdGUodCxlKXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT10W2VdLHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSh0LGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdPXRbZV0sdGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1fc2V0VmFsdWVfZnJvbUFycmF5KHQsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSh0LGUpfV9zZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TmVlZHNVcGRhdGUodCxlKXt0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KHQsZSksdGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2Zyb21BcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKHQsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSh0LGUpLHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9X2dldFZhbHVlX3VuYm91bmQodCxlKXt0aGlzLmJpbmQoKSx0aGlzLmdldFZhbHVlKHQsZSl9X3NldFZhbHVlX3VuYm91bmQodCxlKXt0aGlzLmJpbmQoKSx0aGlzLnNldFZhbHVlKHQsZSl9YmluZCgpe2xldCB0PXRoaXMubm9kZTtjb25zdCBlPXRoaXMucGFyc2VkUGF0aCxuPWUub2JqZWN0TmFtZSxvPWUucHJvcGVydHlOYW1lO2xldCBpPWUucHJvcGVydHlJbmRleDtpZih0fHwodD1vdXQuZmluZE5vZGUodGhpcy5yb290Tm9kZSxlLm5vZGVOYW1lKXx8dGhpcy5yb290Tm9kZSx0aGlzLm5vZGU9dCksdGhpcy5nZXRWYWx1ZT10aGlzLl9nZXRWYWx1ZV91bmF2YWlsYWJsZSx0aGlzLnNldFZhbHVlPXRoaXMuX3NldFZhbHVlX3VuYXZhaWxhYmxlLCF0KXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIHVwZGF0ZSBub2RlIGZvciB0cmFjazogIit0aGlzLnBhdGgrIiBidXQgaXQgd2Fzbid0IGZvdW5kLiIpO2lmKG4pe2xldCBvPWUub2JqZWN0SW5kZXg7c3dpdGNoKG4pe2Nhc2UibWF0ZXJpYWxzIjppZighdC5tYXRlcmlhbClyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbCBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbC4iLHRoaXMpO2lmKCF0Lm1hdGVyaWFsLm1hdGVyaWFscylyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbC5tYXRlcmlhbHMgYXMgbm9kZS5tYXRlcmlhbCBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWxzIGFycmF5LiIsdGhpcyk7dD10Lm1hdGVyaWFsLm1hdGVyaWFsczticmVhaztjYXNlImJvbmVzIjppZighdC5za2VsZXRvbilyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBib25lcyBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBza2VsZXRvbi4iLHRoaXMpO3Q9dC5za2VsZXRvbi5ib25lcztmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKylpZih0W2VdLm5hbWU9PT1vKXtvPWU7YnJlYWt9YnJlYWs7ZGVmYXVsdDppZih2b2lkIDA9PT10W25dKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG9iamVjdE5hbWUgb2Ygbm9kZSB1bmRlZmluZWQuIix0aGlzKTt0PXRbbl19aWYodm9pZCAwIT09byl7aWYodm9pZCAwPT09dFtvXSlyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byBiaW5kIHRvIG9iamVjdEluZGV4IG9mIG9iamVjdE5hbWUsIGJ1dCBpcyB1bmRlZmluZWQuIix0aGlzLHQpO3Q9dFtvXX19Y29uc3QgYT10W29dO2lmKHZvaWQgMD09PWEpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIHByb3BlcnR5IGZvciB0cmFjazogIitlLm5vZGVOYW1lKyIuIitvKyIgYnV0IGl0IHdhc24ndCBmb3VuZC4iLHQpO2xldCByPXRoaXMuVmVyc2lvbmluZy5Ob25lO3RoaXMudGFyZ2V0T2JqZWN0PXQsdm9pZCAwIT09dC5uZWVkc1VwZGF0ZT9yPXRoaXMuVmVyc2lvbmluZy5OZWVkc1VwZGF0ZTp2b2lkIDAhPT10Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUmJihyPXRoaXMuVmVyc2lvbmluZy5NYXRyaXhXb3JsZE5lZWRzVXBkYXRlKTtsZXQgcz10aGlzLkJpbmRpbmdUeXBlLkRpcmVjdDtpZih2b2lkIDAhPT1pKXtpZigibW9ycGhUYXJnZXRJbmZsdWVuY2VzIj09PW8pe2lmKCF0Lmdlb21ldHJ5KXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5LiIsdGhpcyk7aWYoIXQuZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSlyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgb24gVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIsdGhpcyk7aWYoIXQuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy4iLHRoaXMpO3ZvaWQgMCE9PXQubW9ycGhUYXJnZXREaWN0aW9uYXJ5W2ldJiYoaT10Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeVtpXSl9cz10aGlzLkJpbmRpbmdUeXBlLkFycmF5RWxlbWVudCx0aGlzLnJlc29sdmVkUHJvcGVydHk9YSx0aGlzLnByb3BlcnR5SW5kZXg9aX1lbHNlIHZvaWQgMCE9PWEuZnJvbUFycmF5JiZ2b2lkIDAhPT1hLnRvQXJyYXk/KHM9dGhpcy5CaW5kaW5nVHlwZS5IYXNGcm9tVG9BcnJheSx0aGlzLnJlc29sdmVkUHJvcGVydHk9YSk6QXJyYXkuaXNBcnJheShhKT8ocz10aGlzLkJpbmRpbmdUeXBlLkVudGlyZUFycmF5LHRoaXMucmVzb2x2ZWRQcm9wZXJ0eT1hKTp0aGlzLnByb3BlcnR5TmFtZT1vO3RoaXMuZ2V0VmFsdWU9dGhpcy5HZXR0ZXJCeUJpbmRpbmdUeXBlW3NdLHRoaXMuc2V0VmFsdWU9dGhpcy5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZ1tzXVtyXX11bmJpbmQoKXt0aGlzLm5vZGU9bnVsbCx0aGlzLmdldFZhbHVlPXRoaXMuX2dldFZhbHVlX3VuYm91bmQsdGhpcy5zZXRWYWx1ZT10aGlzLl9zZXRWYWx1ZV91bmJvdW5kfX1vdXQuQ29tcG9zaXRlPWNsYXNze2NvbnN0cnVjdG9yKHQsZSxuKXtjb25zdCBvPW58fG91dC5wYXJzZVRyYWNrTmFtZShlKTt0aGlzLl90YXJnZXRHcm91cD10LHRoaXMuX2JpbmRpbmdzPXQuc3Vic2NyaWJlXyhlLG8pfWdldFZhbHVlKHQsZSl7dGhpcy5iaW5kKCk7Y29uc3Qgbj10aGlzLl9iaW5kaW5nc1t0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c19dO3ZvaWQgMCE9PW4mJm4uZ2V0VmFsdWUodCxlKX1zZXRWYWx1ZSh0LGUpe2NvbnN0IG49dGhpcy5fYmluZGluZ3M7Zm9yKGxldCBvPXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxpPW4ubGVuZ3RoO28hPT1pOysrbyluW29dLnNldFZhbHVlKHQsZSl9YmluZCgpe2NvbnN0IHQ9dGhpcy5fYmluZGluZ3M7Zm9yKGxldCBlPXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxuPXQubGVuZ3RoO2UhPT1uOysrZSl0W2VdLmJpbmQoKX11bmJpbmQoKXtjb25zdCB0PXRoaXMuX2JpbmRpbmdzO2ZvcihsZXQgZT10aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sbj10Lmxlbmd0aDtlIT09bjsrK2UpdFtlXS51bmJpbmQoKX19LG91dC5wcm90b3R5cGUuQmluZGluZ1R5cGU9e0RpcmVjdDowLEVudGlyZUFycmF5OjEsQXJyYXlFbGVtZW50OjIsSGFzRnJvbVRvQXJyYXk6M30sb3V0LnByb3RvdHlwZS5WZXJzaW9uaW5nPXtOb25lOjAsTmVlZHNVcGRhdGU6MSxNYXRyaXhXb3JsZE5lZWRzVXBkYXRlOjJ9LG91dC5wcm90b3R5cGUuR2V0dGVyQnlCaW5kaW5nVHlwZT1bb3V0LnByb3RvdHlwZS5fZ2V0VmFsdWVfZGlyZWN0LG91dC5wcm90b3R5cGUuX2dldFZhbHVlX2FycmF5LG91dC5wcm90b3R5cGUuX2dldFZhbHVlX2FycmF5RWxlbWVudCxvdXQucHJvdG90eXBlLl9nZXRWYWx1ZV90b0FycmF5XSxvdXQucHJvdG90eXBlLlNldHRlckJ5QmluZGluZ1R5cGVBbmRWZXJzaW9uaW5nPVtbb3V0LnByb3RvdHlwZS5fc2V0VmFsdWVfZGlyZWN0LG91dC5wcm90b3R5cGUuX3NldFZhbHVlX2RpcmVjdF9zZXROZWVkc1VwZGF0ZSxvdXQucHJvdG90eXBlLl9zZXRWYWx1ZV9kaXJlY3Rfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZV0sW291dC5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5LG91dC5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5X3NldE5lZWRzVXBkYXRlLG91dC5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGVdLFtvdXQucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheUVsZW1lbnQsb3V0LnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE5lZWRzVXBkYXRlLG91dC5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5RWxlbWVudF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlXSxbb3V0LnByb3RvdHlwZS5fc2V0VmFsdWVfZnJvbUFycmF5LG91dC5wcm90b3R5cGUuX3NldFZhbHVlX2Zyb21BcnJheV9zZXROZWVkc1VwZGF0ZSxvdXQucHJvdG90eXBlLl9zZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZV1dO2NsYXNzIGl1dHtjb25zdHJ1Y3Rvcih0LGUsbj1udWxsLG89ZS5ibGVuZE1vZGUpe3RoaXMuX21peGVyPXQsdGhpcy5fY2xpcD1lLHRoaXMuX2xvY2FsUm9vdD1uLHRoaXMuYmxlbmRNb2RlPW87Y29uc3QgaT1lLnRyYWNrcyxhPWkubGVuZ3RoLHI9bmV3IEFycmF5KGEpLHM9e2VuZGluZ1N0YXJ0OkFpdCxlbmRpbmdFbmQ6QWl0fTtmb3IobGV0IHQ9MDt0IT09YTsrK3Qpe2NvbnN0IGU9aVt0XS5jcmVhdGVJbnRlcnBvbGFudChudWxsKTtyW3RdPWUsZS5zZXR0aW5ncz1zfXRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M9cyx0aGlzLl9pbnRlcnBvbGFudHM9cix0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzPW5ldyBBcnJheShhKSx0aGlzLl9jYWNoZUluZGV4PW51bGwsdGhpcy5fYnlDbGlwQ2FjaGVJbmRleD1udWxsLHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PW51bGwsdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9bnVsbCx0aGlzLmxvb3A9MjIwMSx0aGlzLl9sb29wQ291bnQ9LTEsdGhpcy5fc3RhcnRUaW1lPW51bGwsdGhpcy50aW1lPTAsdGhpcy50aW1lU2NhbGU9MSx0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU9MSx0aGlzLndlaWdodD0xLHRoaXMuX2VmZmVjdGl2ZVdlaWdodD0xLHRoaXMucmVwZXRpdGlvbnM9MS8wLHRoaXMucGF1c2VkPSExLHRoaXMuZW5hYmxlZD0hMCx0aGlzLmNsYW1wV2hlbkZpbmlzaGVkPSExLHRoaXMuemVyb1Nsb3BlQXRTdGFydD0hMCx0aGlzLnplcm9TbG9wZUF0RW5kPSEwfXBsYXkoKXtyZXR1cm4gdGhpcy5fbWl4ZXIuX2FjdGl2YXRlQWN0aW9uKHRoaXMpLHRoaXN9c3RvcCgpe3JldHVybiB0aGlzLl9taXhlci5fZGVhY3RpdmF0ZUFjdGlvbih0aGlzKSx0aGlzLnJlc2V0KCl9cmVzZXQoKXtyZXR1cm4gdGhpcy5wYXVzZWQ9ITEsdGhpcy5lbmFibGVkPSEwLHRoaXMudGltZT0wLHRoaXMuX2xvb3BDb3VudD0tMSx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLnN0b3BGYWRpbmcoKS5zdG9wV2FycGluZygpfWlzUnVubmluZygpe3JldHVybiB0aGlzLmVuYWJsZWQmJiF0aGlzLnBhdXNlZCYmMCE9PXRoaXMudGltZVNjYWxlJiZudWxsPT09dGhpcy5fc3RhcnRUaW1lJiZ0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24odGhpcyl9aXNTY2hlZHVsZWQoKXtyZXR1cm4gdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKHRoaXMpfXN0YXJ0QXQodCl7cmV0dXJuIHRoaXMuX3N0YXJ0VGltZT10LHRoaXN9c2V0TG9vcCh0LGUpe3JldHVybiB0aGlzLmxvb3A9dCx0aGlzLnJlcGV0aXRpb25zPWUsdGhpc31zZXRFZmZlY3RpdmVXZWlnaHQodCl7cmV0dXJuIHRoaXMud2VpZ2h0PXQsdGhpcy5fZWZmZWN0aXZlV2VpZ2h0PXRoaXMuZW5hYmxlZD90OjAsdGhpcy5zdG9wRmFkaW5nKCl9Z2V0RWZmZWN0aXZlV2VpZ2h0KCl7cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdlaWdodH1mYWRlSW4odCl7cmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKHQsMCwxKX1mYWRlT3V0KHQpe3JldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyh0LDEsMCl9Y3Jvc3NGYWRlRnJvbSh0LGUsbil7aWYodC5mYWRlT3V0KGUpLHRoaXMuZmFkZUluKGUpLG4pe2NvbnN0IG49dGhpcy5fY2xpcC5kdXJhdGlvbixvPXQuX2NsaXAuZHVyYXRpb24saT1uL287dC53YXJwKDEsby9uLGUpLHRoaXMud2FycChpLDEsZSl9cmV0dXJuIHRoaXN9Y3Jvc3NGYWRlVG8odCxlLG4pe3JldHVybiB0LmNyb3NzRmFkZUZyb20odGhpcyxlLG4pfXN0b3BGYWRpbmcoKXtjb25zdCB0PXRoaXMuX3dlaWdodEludGVycG9sYW50O3JldHVybiBudWxsIT09dCYmKHRoaXMuX3dlaWdodEludGVycG9sYW50PW51bGwsdGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KHQpKSx0aGlzfXNldEVmZmVjdGl2ZVRpbWVTY2FsZSh0KXtyZXR1cm4gdGhpcy50aW1lU2NhbGU9dCx0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU9dGhpcy5wYXVzZWQ/MDp0LHRoaXMuc3RvcFdhcnBpbmcoKX1nZXRFZmZlY3RpdmVUaW1lU2NhbGUoKXtyZXR1cm4gdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlfXNldER1cmF0aW9uKHQpe3JldHVybiB0aGlzLnRpbWVTY2FsZT10aGlzLl9jbGlwLmR1cmF0aW9uL3QsdGhpcy5zdG9wV2FycGluZygpfXN5bmNXaXRoKHQpe3JldHVybiB0aGlzLnRpbWU9dC50aW1lLHRoaXMudGltZVNjYWxlPXQudGltZVNjYWxlLHRoaXMuc3RvcFdhcnBpbmcoKX1oYWx0KHQpe3JldHVybiB0aGlzLndhcnAodGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlLDAsdCl9d2FycCh0LGUsbil7Y29uc3Qgbz10aGlzLl9taXhlcixpPW8udGltZSxhPXRoaXMudGltZVNjYWxlO2xldCByPXRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O251bGw9PT1yJiYocj1vLl9sZW5kQ29udHJvbEludGVycG9sYW50KCksdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ9cik7Y29uc3Qgcz1yLnBhcmFtZXRlclBvc2l0aW9ucyxsPXIuc2FtcGxlVmFsdWVzO3JldHVybiBzWzBdPWksc1sxXT1pK24sbFswXT10L2EsbFsxXT1lL2EsdGhpc31zdG9wV2FycGluZygpe2NvbnN0IHQ9dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7cmV0dXJuIG51bGwhPT10JiYodGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ9bnVsbCx0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQodCkpLHRoaXN9Z2V0TWl4ZXIoKXtyZXR1cm4gdGhpcy5fbWl4ZXJ9Z2V0Q2xpcCgpe3JldHVybiB0aGlzLl9jbGlwfWdldFJvb3QoKXtyZXR1cm4gdGhpcy5fbG9jYWxSb290fHx0aGlzLl9taXhlci5fcm9vdH1fdXBkYXRlKHQsZSxuLG8pe2lmKCF0aGlzLmVuYWJsZWQpcmV0dXJuIHZvaWQgdGhpcy5fdXBkYXRlV2VpZ2h0KHQpO2NvbnN0IGk9dGhpcy5fc3RhcnRUaW1lO2lmKG51bGwhPT1pKXtjb25zdCBvPSh0LWkpKm47aWYobzwwfHwwPT09bilyZXR1cm47dGhpcy5fc3RhcnRUaW1lPW51bGwsZT1uKm99ZSo9dGhpcy5fdXBkYXRlVGltZVNjYWxlKHQpO2NvbnN0IGE9dGhpcy5fdXBkYXRlVGltZShlKSxyPXRoaXMuX3VwZGF0ZVdlaWdodCh0KTtpZihyPjApe2NvbnN0IHQ9dGhpcy5faW50ZXJwb2xhbnRzLGU9dGhpcy5fcHJvcGVydHlCaW5kaW5ncztzd2l0Y2godGhpcy5ibGVuZE1vZGUpe2Nhc2UgMjUwMTpmb3IobGV0IG49MCxvPXQubGVuZ3RoO24hPT1vOysrbil0W25dLmV2YWx1YXRlKGEpLGVbbl0uYWNjdW11bGF0ZUFkZGl0aXZlKHIpO2JyZWFrO2Nhc2UgMjUwMDpkZWZhdWx0OmZvcihsZXQgbj0wLGk9dC5sZW5ndGg7biE9PWk7KytuKXRbbl0uZXZhbHVhdGUoYSksZVtuXS5hY2N1bXVsYXRlKG8scil9fX1fdXBkYXRlV2VpZ2h0KHQpe2xldCBlPTA7aWYodGhpcy5lbmFibGVkKXtlPXRoaXMud2VpZ2h0O2NvbnN0IG49dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7aWYobnVsbCE9PW4pe2NvbnN0IG89bi5ldmFsdWF0ZSh0KVswXTtlKj1vLHQ+bi5wYXJhbWV0ZXJQb3NpdGlvbnNbMV0mJih0aGlzLnN0b3BGYWRpbmcoKSwwPT09byYmKHRoaXMuZW5hYmxlZD0hMSkpfX1yZXR1cm4gdGhpcy5fZWZmZWN0aXZlV2VpZ2h0PWUsZX1fdXBkYXRlVGltZVNjYWxlKHQpe2xldCBlPTA7aWYoIXRoaXMucGF1c2VkKXtlPXRoaXMudGltZVNjYWxlO2NvbnN0IG49dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7bnVsbCE9PW4mJihlKj1uLmV2YWx1YXRlKHQpWzBdLHQ+bi5wYXJhbWV0ZXJQb3NpdGlvbnNbMV0mJih0aGlzLnN0b3BXYXJwaW5nKCksMD09PWU/dGhpcy5wYXVzZWQ9ITA6dGhpcy50aW1lU2NhbGU9ZSkpfXJldHVybiB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU9ZSxlfV91cGRhdGVUaW1lKHQpe2NvbnN0IGU9dGhpcy5fY2xpcC5kdXJhdGlvbixuPXRoaXMubG9vcDtsZXQgbz10aGlzLnRpbWUrdCxpPXRoaXMuX2xvb3BDb3VudDtjb25zdCBhPTIyMDI9PT1uO2lmKDA9PT10KXJldHVybi0xPT09aT9vOmEmJjE9PSgxJmkpP2UtbzpvO2lmKDIyMDA9PT1uKXstMT09PWkmJih0aGlzLl9sb29wQ291bnQ9MCx0aGlzLl9zZXRFbmRpbmdzKCEwLCEwLCExKSk7dDp7aWYobz49ZSlvPWU7ZWxzZXtpZighKG88MCkpe3RoaXMudGltZT1vO2JyZWFrIHR9bz0wfXRoaXMuY2xhbXBXaGVuRmluaXNoZWQ/dGhpcy5wYXVzZWQ9ITA6dGhpcy5lbmFibGVkPSExLHRoaXMudGltZT1vLHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImZpbmlzaGVkIixhY3Rpb246dGhpcyxkaXJlY3Rpb246dDwwPy0xOjF9KX19ZWxzZXtpZigtMT09PWkmJih0Pj0wPyhpPTAsdGhpcy5fc2V0RW5kaW5ncyghMCwwPT09dGhpcy5yZXBldGl0aW9ucyxhKSk6dGhpcy5fc2V0RW5kaW5ncygwPT09dGhpcy5yZXBldGl0aW9ucywhMCxhKSksbz49ZXx8bzwwKXtjb25zdCBuPU1hdGguZmxvb3Ioby9lKTtvLT1lKm4saSs9TWF0aC5hYnMobik7Y29uc3Qgcj10aGlzLnJlcGV0aXRpb25zLWk7aWYocjw9MCl0aGlzLmNsYW1wV2hlbkZpbmlzaGVkP3RoaXMucGF1c2VkPSEwOnRoaXMuZW5hYmxlZD0hMSxvPXQ+MD9lOjAsdGhpcy50aW1lPW8sdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7dHlwZToiZmluaXNoZWQiLGFjdGlvbjp0aGlzLGRpcmVjdGlvbjp0PjA/MTotMX0pO2Vsc2V7aWYoMT09PXIpe2NvbnN0IGU9dDwwO3RoaXMuX3NldEVuZGluZ3MoZSwhZSxhKX1lbHNlIHRoaXMuX3NldEVuZGluZ3MoITEsITEsYSk7dGhpcy5fbG9vcENvdW50PWksdGhpcy50aW1lPW8sdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7dHlwZToibG9vcCIsYWN0aW9uOnRoaXMsbG9vcERlbHRhOm59KX19ZWxzZSB0aGlzLnRpbWU9bztpZihhJiYxPT0oMSZpKSlyZXR1cm4gZS1vfXJldHVybiBvfV9zZXRFbmRpbmdzKHQsZSxuKXtjb25zdCBvPXRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M7bj8oby5lbmRpbmdTdGFydD1UaXQsby5lbmRpbmdFbmQ9VGl0KTooby5lbmRpbmdTdGFydD10P3RoaXMuemVyb1Nsb3BlQXRTdGFydD9UaXQ6QWl0Ok5pdCxvLmVuZGluZ0VuZD1lP3RoaXMuemVyb1Nsb3BlQXRFbmQ/VGl0OkFpdDpOaXQpfV9zY2hlZHVsZUZhZGluZyh0LGUsbil7Y29uc3Qgbz10aGlzLl9taXhlcixpPW8udGltZTtsZXQgYT10aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtudWxsPT09YSYmKGE9by5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpLHRoaXMuX3dlaWdodEludGVycG9sYW50PWEpO2NvbnN0IHI9YS5wYXJhbWV0ZXJQb3NpdGlvbnMscz1hLnNhbXBsZVZhbHVlcztyZXR1cm4gclswXT1pLHNbMF09ZSxyWzFdPWkrdCxzWzFdPW4sdGhpc319KGNsYXNzIGV4dGVuZHMgVWl0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5fcm9vdD10LHRoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCksdGhpcy5fYWNjdUluZGV4PTAsdGhpcy50aW1lPTAsdGhpcy50aW1lU2NhbGU9MX1fYmluZEFjdGlvbih0LGUpe2NvbnN0IG49dC5fbG9jYWxSb290fHx0aGlzLl9yb290LG89dC5fY2xpcC50cmFja3MsaT1vLmxlbmd0aCxhPXQuX3Byb3BlcnR5QmluZGluZ3Mscj10Ll9pbnRlcnBvbGFudHMscz1uLnV1aWQsbD10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWU7bGV0IGM9bFtzXTt2b2lkIDA9PT1jJiYoYz17fSxsW3NdPWMpO2ZvcihsZXQgdD0wO3QhPT1pOysrdCl7Y29uc3QgaT1vW3RdLGw9aS5uYW1lO2xldCBkPWNbbF07aWYodm9pZCAwIT09ZClhW3RdPWQ7ZWxzZXtpZihkPWFbdF0sdm9pZCAwIT09ZCl7bnVsbD09PWQuX2NhY2hlSW5kZXgmJigrK2QucmVmZXJlbmNlQ291bnQsdGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKGQscyxsKSk7Y29udGludWV9ZD1uZXcgcW10KG91dC5jcmVhdGUobixsLGUmJmUuX3Byb3BlcnR5QmluZGluZ3NbdF0uYmluZGluZy5wYXJzZWRQYXRoKSxpLlZhbHVlVHlwZU5hbWUsaS5nZXRWYWx1ZVNpemUoKSksKytkLnJlZmVyZW5jZUNvdW50LHRoaXMuX2FkZEluYWN0aXZlQmluZGluZyhkLHMsbCksYVt0XT1kfXJbdF0ucmVzdWx0QnVmZmVyPWQuYnVmZmVyfX1fYWN0aXZhdGVBY3Rpb24odCl7aWYoIXRoaXMuX2lzQWN0aXZlQWN0aW9uKHQpKXtpZihudWxsPT09dC5fY2FjaGVJbmRleCl7Y29uc3QgZT0odC5fbG9jYWxSb290fHx0aGlzLl9yb290KS51dWlkLG49dC5fY2xpcC51dWlkLG89dGhpcy5fYWN0aW9uc0J5Q2xpcFtuXTt0aGlzLl9iaW5kQWN0aW9uKHQsbyYmby5rbm93bkFjdGlvbnNbMF0pLHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKHQsbixlKX1jb25zdCBlPXQuX3Byb3BlcnR5QmluZGluZ3M7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aDt0IT09bjsrK3Qpe2NvbnN0IG49ZVt0XTswPT1uLnVzZUNvdW50KysmJih0aGlzLl9sZW5kQmluZGluZyhuKSxuLnNhdmVPcmlnaW5hbFN0YXRlKCkpfXRoaXMuX2xlbmRBY3Rpb24odCl9fV9kZWFjdGl2YXRlQWN0aW9uKHQpe2lmKHRoaXMuX2lzQWN0aXZlQWN0aW9uKHQpKXtjb25zdCBlPXQuX3Byb3BlcnR5QmluZGluZ3M7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aDt0IT09bjsrK3Qpe2NvbnN0IG49ZVt0XTswPT0tLW4udXNlQ291bnQmJihuLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCksdGhpcy5fdGFrZUJhY2tCaW5kaW5nKG4pKX10aGlzLl90YWtlQmFja0FjdGlvbih0KX19X2luaXRNZW1vcnlNYW5hZ2VyKCl7dGhpcy5fYWN0aW9ucz1bXSx0aGlzLl9uQWN0aXZlQWN0aW9ucz0wLHRoaXMuX2FjdGlvbnNCeUNsaXA9e30sdGhpcy5fYmluZGluZ3M9W10sdGhpcy5fbkFjdGl2ZUJpbmRpbmdzPTAsdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lPXt9LHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHM9W10sdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHM9MDtjb25zdCB0PXRoaXM7dGhpcy5zdGF0cz17YWN0aW9uczp7Z2V0IHRvdGFsKCl7cmV0dXJuIHQuX2FjdGlvbnMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gdC5fbkFjdGl2ZUFjdGlvbnN9fSxiaW5kaW5nczp7Z2V0IHRvdGFsKCl7cmV0dXJuIHQuX2JpbmRpbmdzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIHQuX25BY3RpdmVCaW5kaW5nc319LGNvbnRyb2xJbnRlcnBvbGFudHM6e2dldCB0b3RhbCgpe3JldHVybiB0Ll9jb250cm9sSW50ZXJwb2xhbnRzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIHQuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzfX19fV9pc0FjdGl2ZUFjdGlvbih0KXtjb25zdCBlPXQuX2NhY2hlSW5kZXg7cmV0dXJuIG51bGwhPT1lJiZlPHRoaXMuX25BY3RpdmVBY3Rpb25zfV9hZGRJbmFjdGl2ZUFjdGlvbih0LGUsbil7Y29uc3Qgbz10aGlzLl9hY3Rpb25zLGk9dGhpcy5fYWN0aW9uc0J5Q2xpcDtsZXQgYT1pW2VdO2lmKHZvaWQgMD09PWEpYT17a25vd25BY3Rpb25zOlt0XSxhY3Rpb25CeVJvb3Q6e319LHQuX2J5Q2xpcENhY2hlSW5kZXg9MCxpW2VdPWE7ZWxzZXtjb25zdCBlPWEua25vd25BY3Rpb25zO3QuX2J5Q2xpcENhY2hlSW5kZXg9ZS5sZW5ndGgsZS5wdXNoKHQpfXQuX2NhY2hlSW5kZXg9by5sZW5ndGgsby5wdXNoKHQpLGEuYWN0aW9uQnlSb290W25dPXR9X3JlbW92ZUluYWN0aXZlQWN0aW9uKHQpe2NvbnN0IGU9dGhpcy5fYWN0aW9ucyxuPWVbZS5sZW5ndGgtMV0sbz10Ll9jYWNoZUluZGV4O24uX2NhY2hlSW5kZXg9byxlW29dPW4sZS5wb3AoKSx0Ll9jYWNoZUluZGV4PW51bGw7Y29uc3QgaT10Ll9jbGlwLnV1aWQsYT10aGlzLl9hY3Rpb25zQnlDbGlwLHI9YVtpXSxzPXIua25vd25BY3Rpb25zLGw9c1tzLmxlbmd0aC0xXSxjPXQuX2J5Q2xpcENhY2hlSW5kZXg7bC5fYnlDbGlwQ2FjaGVJbmRleD1jLHNbY109bCxzLnBvcCgpLHQuX2J5Q2xpcENhY2hlSW5kZXg9bnVsbCxkZWxldGUgci5hY3Rpb25CeVJvb3RbKHQuX2xvY2FsUm9vdHx8dGhpcy5fcm9vdCkudXVpZF0sMD09PXMubGVuZ3RoJiZkZWxldGUgYVtpXSx0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKHQpfV9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKHQpe2NvbnN0IGU9dC5fcHJvcGVydHlCaW5kaW5ncztmb3IobGV0IHQ9MCxuPWUubGVuZ3RoO3QhPT1uOysrdCl7Y29uc3Qgbj1lW3RdOzA9PS0tbi5yZWZlcmVuY2VDb3VudCYmdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKG4pfX1fbGVuZEFjdGlvbih0KXtjb25zdCBlPXRoaXMuX2FjdGlvbnMsbj10Ll9jYWNoZUluZGV4LG89dGhpcy5fbkFjdGl2ZUFjdGlvbnMrKyxpPWVbb107dC5fY2FjaGVJbmRleD1vLGVbb109dCxpLl9jYWNoZUluZGV4PW4sZVtuXT1pfV90YWtlQmFja0FjdGlvbih0KXtjb25zdCBlPXRoaXMuX2FjdGlvbnMsbj10Ll9jYWNoZUluZGV4LG89LS10aGlzLl9uQWN0aXZlQWN0aW9ucyxpPWVbb107dC5fY2FjaGVJbmRleD1vLGVbb109dCxpLl9jYWNoZUluZGV4PW4sZVtuXT1pfV9hZGRJbmFjdGl2ZUJpbmRpbmcodCxlLG4pe2NvbnN0IG89dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLGk9dGhpcy5fYmluZGluZ3M7bGV0IGE9b1tlXTt2b2lkIDA9PT1hJiYoYT17fSxvW2VdPWEpLGFbbl09dCx0Ll9jYWNoZUluZGV4PWkubGVuZ3RoLGkucHVzaCh0KX1fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKHQpe2NvbnN0IGU9dGhpcy5fYmluZGluZ3Msbj10LmJpbmRpbmcsbz1uLnJvb3ROb2RlLnV1aWQsaT1uLnBhdGgsYT10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUscj1hW29dLHM9ZVtlLmxlbmd0aC0xXSxsPXQuX2NhY2hlSW5kZXg7cy5fY2FjaGVJbmRleD1sLGVbbF09cyxlLnBvcCgpLGRlbGV0ZSByW2ldLDA9PT1PYmplY3Qua2V5cyhyKS5sZW5ndGgmJmRlbGV0ZSBhW29dfV9sZW5kQmluZGluZyh0KXtjb25zdCBlPXRoaXMuX2JpbmRpbmdzLG49dC5fY2FjaGVJbmRleCxvPXRoaXMuX25BY3RpdmVCaW5kaW5ncysrLGk9ZVtvXTt0Ll9jYWNoZUluZGV4PW8sZVtvXT10LGkuX2NhY2hlSW5kZXg9bixlW25dPWl9X3Rha2VCYWNrQmluZGluZyh0KXtjb25zdCBlPXRoaXMuX2JpbmRpbmdzLG49dC5fY2FjaGVJbmRleCxvPS0tdGhpcy5fbkFjdGl2ZUJpbmRpbmdzLGk9ZVtvXTt0Ll9jYWNoZUluZGV4PW8sZVtvXT10LGkuX2NhY2hlSW5kZXg9bixlW25dPWl9X2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKXtjb25zdCB0PXRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsZT10aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cysrO2xldCBuPXRbZV07cmV0dXJuIHZvaWQgMD09PW4mJihuPW5ldyBjbXQobmV3IEZsb2F0MzJBcnJheSgyKSxuZXcgRmxvYXQzMkFycmF5KDIpLDEsdGhpcy5fY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlciksbi5fX2NhY2hlSW5kZXg9ZSx0W2VdPW4pLG59X3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KHQpe2NvbnN0IGU9dGhpcy5fY29udHJvbEludGVycG9sYW50cyxuPXQuX19jYWNoZUluZGV4LG89LS10aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyxpPWVbb107dC5fX2NhY2hlSW5kZXg9byxlW29dPXQsaS5fX2NhY2hlSW5kZXg9bixlW25dPWl9Y2xpcEFjdGlvbih0LGUsbil7Y29uc3Qgbz1lfHx0aGlzLl9yb290LGk9by51dWlkO2xldCBhPSJzdHJpbmciPT10eXBlb2YgdD9fbXQuZmluZEJ5TmFtZShvLHQpOnQ7Y29uc3Qgcj1udWxsIT09YT9hLnV1aWQ6dCxzPXRoaXMuX2FjdGlvbnNCeUNsaXBbcl07bGV0IGw9bnVsbDtpZih2b2lkIDA9PT1uJiYobj1udWxsIT09YT9hLmJsZW5kTW9kZToyNTAwKSx2b2lkIDAhPT1zKXtjb25zdCB0PXMuYWN0aW9uQnlSb290W2ldO2lmKHZvaWQgMCE9PXQmJnQuYmxlbmRNb2RlPT09bilyZXR1cm4gdDtsPXMua25vd25BY3Rpb25zWzBdLG51bGw9PT1hJiYoYT1sLl9jbGlwKX1pZihudWxsPT09YSlyZXR1cm4gbnVsbDtjb25zdCBjPW5ldyBpdXQodGhpcyxhLGUsbik7cmV0dXJuIHRoaXMuX2JpbmRBY3Rpb24oYyxsKSx0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbihjLHIsaSksY31leGlzdGluZ0FjdGlvbih0LGUpe2NvbnN0IG49ZXx8dGhpcy5fcm9vdCxvPW4udXVpZCxpPSJzdHJpbmciPT10eXBlb2YgdD9fbXQuZmluZEJ5TmFtZShuLHQpOnQsYT10aGlzLl9hY3Rpb25zQnlDbGlwW2k/aS51dWlkOnRdO3JldHVybiB2b2lkIDAhPT1hJiZhLmFjdGlvbkJ5Um9vdFtvXXx8bnVsbH1zdG9wQWxsQWN0aW9uKCl7Y29uc3QgdD10aGlzLl9hY3Rpb25zO2ZvcihsZXQgZT10aGlzLl9uQWN0aXZlQWN0aW9ucy0xO2U+PTA7LS1lKXRbZV0uc3RvcCgpO3JldHVybiB0aGlzfXVwZGF0ZSh0KXtjb25zdCBlPXRoaXMuX2FjdGlvbnMsbj10aGlzLl9uQWN0aXZlQWN0aW9ucyxvPXRoaXMudGltZSs9dCo9dGhpcy50aW1lU2NhbGUsaT1NYXRoLnNpZ24odCksYT10aGlzLl9hY2N1SW5kZXhePTE7Zm9yKGxldCByPTA7ciE9PW47KytyKWVbcl0uX3VwZGF0ZShvLHQsaSxhKTtjb25zdCByPXRoaXMuX2JpbmRpbmdzLHM9dGhpcy5fbkFjdGl2ZUJpbmRpbmdzO2ZvcihsZXQgdD0wO3QhPT1zOysrdClyW3RdLmFwcGx5KGEpO3JldHVybiB0aGlzfXNldFRpbWUodCl7dGhpcy50aW1lPTA7Zm9yKGxldCB0PTA7dDx0aGlzLl9hY3Rpb25zLmxlbmd0aDt0KyspdGhpcy5fYWN0aW9uc1t0XS50aW1lPTA7cmV0dXJuIHRoaXMudXBkYXRlKHQpfWdldFJvb3QoKXtyZXR1cm4gdGhpcy5fcm9vdH11bmNhY2hlQ2xpcCh0KXtjb25zdCBlPXRoaXMuX2FjdGlvbnMsbj10LnV1aWQsbz10aGlzLl9hY3Rpb25zQnlDbGlwLGk9b1tuXTtpZih2b2lkIDAhPT1pKXtjb25zdCB0PWkua25vd25BY3Rpb25zO2ZvcihsZXQgbj0wLG89dC5sZW5ndGg7biE9PW87KytuKXtjb25zdCBvPXRbbl07dGhpcy5fZGVhY3RpdmF0ZUFjdGlvbihvKTtjb25zdCBpPW8uX2NhY2hlSW5kZXgsYT1lW2UubGVuZ3RoLTFdO28uX2NhY2hlSW5kZXg9bnVsbCxvLl9ieUNsaXBDYWNoZUluZGV4PW51bGwsYS5fY2FjaGVJbmRleD1pLGVbaV09YSxlLnBvcCgpLHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24obyl9ZGVsZXRlIG9bbl19fXVuY2FjaGVSb290KHQpe2NvbnN0IGU9dC51dWlkLG49dGhpcy5fYWN0aW9uc0J5Q2xpcDtmb3IoY29uc3QgdCBpbiBuKXtjb25zdCBvPW5bdF0uYWN0aW9uQnlSb290W2VdO3ZvaWQgMCE9PW8mJih0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKG8pLHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKG8pKX1jb25zdCBvPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZVtlXTtpZih2b2lkIDAhPT1vKWZvcihjb25zdCB0IGluIG8pe2NvbnN0IGU9b1t0XTtlLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCksdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKGUpfX11bmNhY2hlQWN0aW9uKHQsZSl7Y29uc3Qgbj10aGlzLmV4aXN0aW5nQWN0aW9uKHQsZSk7bnVsbCE9PW4mJih0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKG4pLHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKG4pKX19KS5wcm90b3R5cGUuX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXI9bmV3IEZsb2F0MzJBcnJheSgxKSxjbGFzcyBleHRlbmRzIF9kdHtjb25zdHJ1Y3Rvcih0LGUsbj0xKXtzdXBlcih0LGUpLHRoaXMubWVzaFBlckF0dHJpYnV0ZT1ufWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5tZXNoUGVyQXR0cmlidXRlPXQubWVzaFBlckF0dHJpYnV0ZSx0aGlzfWNsb25lKHQpe2NvbnN0IGU9c3VwZXIuY2xvbmUodCk7cmV0dXJuIGUubWVzaFBlckF0dHJpYnV0ZT10aGlzLm1lc2hQZXJBdHRyaWJ1dGUsZX10b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcj0hMCxlLm1lc2hQZXJBdHRyaWJ1dGU9dGhpcy5tZXNoUGVyQXR0cmlidXRlLGV9fS5wcm90b3R5cGUuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcj0hMCxjbGFzcyBleHRlbmRzIHBydHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMubWF0ZXJpYWw9dCx0aGlzLnJlbmRlcj1mdW5jdGlvbigpe30sdGhpcy5oYXNQb3NpdGlvbnM9ITEsdGhpcy5oYXNOb3JtYWxzPSExLHRoaXMuaGFzQ29sb3JzPSExLHRoaXMuaGFzVXZzPSExLHRoaXMucG9zaXRpb25BcnJheT1udWxsLHRoaXMubm9ybWFsQXJyYXk9bnVsbCx0aGlzLmNvbG9yQXJyYXk9bnVsbCx0aGlzLnV2QXJyYXk9bnVsbCx0aGlzLmNvdW50PTB9fS5wcm90b3R5cGUuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3Q9ITA7Y29uc3QgYXV0PW5ldyBjYXQscnV0PW5ldyBCYXQsc3V0PW5ldyBCYXQ7ZnVuY3Rpb24gbHV0KHQpe2NvbnN0IGU9W107dCYmdC5pc0JvbmUmJmUucHVzaCh0KTtmb3IobGV0IG49MDtuPHQuY2hpbGRyZW4ubGVuZ3RoO24rKyllLnB1c2guYXBwbHkoZSxsdXQodC5jaGlsZHJlbltuXSkpO3JldHVybiBlfWNvbnN0IGN1dD1uZXcgRmxvYXQzMkFycmF5KDEpO2Z1bmN0aW9uIGR1dCh0LGUsbil7aWYoMT09PW4pcmV0dXJuIG5ldyBScnQoZSk7Y29uc3Qgbz1kNyhlKTtpZighbyl0aHJvdyBuZXcgRXJyb3IoYGQzIGZhaWxlZCB0byByZWNvZ25pemUgdGhlIGNvbG9yOiAke2V9YCk7cmV0dXJuIG5ldyBScnQoZDgobyx0KSgxLW4pKX12YXIgcHV0LG11dCx1dXQsZnV0O2Z1bmN0aW9uIGd1dCh0LGUpe2NvbnN0IG49ZS5sZW5ndGgvMjtsZXQgbz10LmF0dHJpYnV0ZXMucG9zaXRpb247byYmby5jb3VudD09PTMqbnx8KG89bmV3IHpydChuZXcgRmxvYXQzMkFycmF5KDMqbiksMyksdC5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixvKSk7Y29uc3QgaT1vLmFycmF5O2ZvcihsZXQgdD0wO3Q8bjt0KyspaVszKnRdPWVbMip0XSxpWzMqdCsxXT1lWzIqdCsxXTtvLm5lZWRzVXBkYXRlPSEwLHQuc2V0RHJhd1JhbmdlKDAsMypuKSx0LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpfWZ1bmN0aW9uIGh1dCh0LGUsbil7Y29uc3Qgbz1NYXRoLm1heChlLmxlbmd0aC8yLTEsMCksaT0yKm8qMyxhPTMqaTtsZXQgcj10LmF0dHJpYnV0ZXMucG9zaXRpb247ciYmci5jb3VudD09PWl8fChyPW5ldyB6cnQobmV3IEZsb2F0MzJBcnJheShhKSwzKSx0LnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLHIpKTtjb25zdCBzPXIuYXJyYXk7Zm9yKGxldCB0PTA7dDxvO3QrKyl7Y29uc3RbbyxpLGEscl09W2VbMip0XSxlWzIqdCsxXSxlWzIqdCsyXSxlWzIqdCszXV0sbD1uZXcgUWl0KG8saSksYz1uZXcgUWl0KGEsciksZD1uZXcgUWl0KGEtbyxyLWkpLHA9bmV3IFFpdCgtZC55LGQueCkuc2V0TGVuZ3RoKG4vMiksbT1sLmNsb25lKCkuYWRkKHApLHU9bC5jbG9uZSgpLnN1YihwKSxmPWMuY2xvbmUoKS5hZGQocCksZz1jLmNsb25lKCkuc3ViKHApLGg9W20ueCxtLnksMCx1LngsdS55LDAsZi54LGYueSwwLGYueCxmLnksMCx1LngsdS55LDAsZy54LGcueSwwXTtzLnNldChoLHQqaC5sZW5ndGgpfXIubmVlZHNVcGRhdGU9ITAsdC5zZXREcmF3UmFuZ2UoMCxhKSx0LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpfWZ1bmN0aW9uIGJ1dCh0LGUsbixvKXtjb25zdHt2aXNpYmxlOmksY29sb3I6YSxvcGFjaXR5OnJ9PW87aWYoQXJyYXkuaXNBcnJheShlLm1hdGVyaWFsKSl0aHJvdyBuZXcgRXJyb3IoIkludmFyaWFudCBlcnJvcjogb25seSBleHBlY3Qgb25lIG1hdGVyaWFsIG9uIGFuIG9iamVjdCIpO2NvbnN0IHM9ZS5tYXRlcmlhbDtpZihzLnZpc2libGUhPT1pJiYocy52aXNpYmxlPWkscy5uZWVkc1VwZGF0ZT0hMCksIWkpcmV0dXJuITE7Y29uc3QgbD1kdXQodCxhLG51bGwhPXI/cjoxKSxjPW4oZS5nZW9tZXRyeSk7cmV0dXJuIGUuZ2VvbWV0cnkhPT1jJiYoZS5nZW9tZXRyeT1jKSxzLmNvbG9yLmVxdWFscyhsKXx8KHMuY29sb3Iuc2V0KGwpLHMubmVlZHNVcGRhdGU9ITApLCEwfW5ldyBJbnQzMkFycmF5KGN1dC5idWZmZXIpLGRwdC5jcmVhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gY29uc29sZS5sb2coIlRIUkVFLkN1cnZlLmNyZWF0ZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQiKSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGRwdC5wcm90b3R5cGUpLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXQsdC5wcm90b3R5cGUuZ2V0UG9pbnQ9ZSx0fSxFbXQucHJvdG90eXBlLmZyb21Qb2ludHM9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUGF0aDogLmZyb21Qb2ludHMoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tUG9pbnRzKCkuIiksdGhpcy5zZXRGcm9tUG9pbnRzKHQpfSxjbGFzcyBleHRlbmRzIG5wdHtjb25zdHJ1Y3Rvcih0PTEwLGU9MTAsbj00NDczOTI0LG89ODk0Nzg0OCl7bj1uZXcgUnJ0KG4pLG89bmV3IFJydChvKTtjb25zdCBpPWUvMixhPXQvZSxyPXQvMixzPVtdLGw9W107Zm9yKGxldCB0PTAsYz0wLGQ9LXI7dDw9ZTt0KyssZCs9YSl7cy5wdXNoKC1yLDAsZCxyLDAsZCkscy5wdXNoKGQsMCwtcixkLDAscik7Y29uc3QgZT10PT09aT9uOm87ZS50b0FycmF5KGwsYyksYys9MyxlLnRvQXJyYXkobCxjKSxjKz0zLGUudG9BcnJheShsLGMpLGMrPTMsZS50b0FycmF5KGwsYyksYys9M31jb25zdCBjPW5ldyBxcnQ7Yy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgRnJ0KHMsMykpLGMuc2V0QXR0cmlidXRlKCJjb2xvciIsbmV3IEZydChsLDMpKSxzdXBlcihjLG5ldyBxZHQoe3ZlcnRleENvbG9yczohMCx0b25lTWFwcGVkOiExfSkpLHRoaXMudHlwZT0iR3JpZEhlbHBlciJ9fS5wcm90b3R5cGUuc2V0Q29sb3JzPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuR3JpZEhlbHBlcjogc2V0Q29sb3JzKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCwgcGFzcyB0aGVtIGluIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkLiIpfSxjbGFzcyBleHRlbmRzIG5wdHtjb25zdHJ1Y3Rvcih0KXtjb25zdCBlPWx1dCh0KSxuPW5ldyBxcnQsbz1bXSxpPVtdLGE9bmV3IFJydCgwLDAsMSkscj1uZXcgUnJ0KDAsMSwwKTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7Y29uc3Qgbj1lW3RdO24ucGFyZW50JiZuLnBhcmVudC5pc0JvbmUmJihvLnB1c2goMCwwLDApLG8ucHVzaCgwLDAsMCksaS5wdXNoKGEucixhLmcsYS5iKSxpLnB1c2goci5yLHIuZyxyLmIpKX1uLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBGcnQobywzKSksbi5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgRnJ0KGksMykpLHN1cGVyKG4sbmV3IHFkdCh7dmVydGV4Q29sb3JzOiEwLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExLHRvbmVNYXBwZWQ6ITEsdHJhbnNwYXJlbnQ6ITB9KSksdGhpcy50eXBlPSJTa2VsZXRvbkhlbHBlciIsdGhpcy5pc1NrZWxldG9uSGVscGVyPSEwLHRoaXMucm9vdD10LHRoaXMuYm9uZXM9ZSx0aGlzLm1hdHJpeD10Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMX11cGRhdGVNYXRyaXhXb3JsZCh0KXtjb25zdCBlPXRoaXMuYm9uZXMsbj10aGlzLmdlb21ldHJ5LG89bi5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7c3V0LmNvcHkodGhpcy5yb290Lm1hdHJpeFdvcmxkKS5pbnZlcnQoKTtmb3IobGV0IHQ9MCxuPTA7dDxlLmxlbmd0aDt0Kyspe2NvbnN0IGk9ZVt0XTtpLnBhcmVudCYmaS5wYXJlbnQuaXNCb25lJiYocnV0Lm11bHRpcGx5TWF0cmljZXMoc3V0LGkubWF0cml4V29ybGQpLGF1dC5zZXRGcm9tTWF0cml4UG9zaXRpb24ocnV0KSxvLnNldFhZWihuLGF1dC54LGF1dC55LGF1dC56KSxydXQubXVsdGlwbHlNYXRyaWNlcyhzdXQsaS5wYXJlbnQubWF0cml4V29ybGQpLGF1dC5zZXRGcm9tTWF0cml4UG9zaXRpb24ocnV0KSxvLnNldFhZWihuKzEsYXV0LngsYXV0LnksYXV0LnopLG4rPTIpfW4uZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLm5lZWRzVXBkYXRlPSEwLHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKHQpfX0ucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNrZWxldG9uSGVscGVyOiB1cGRhdGUoKSBubyBsb25nZXIgbmVlZHMgdG8gYmUgY2FsbGVkLiIpfSx4bXQucHJvdG90eXBlLmV4dHJhY3RVcmxCYXNlPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkxvYWRlcjogLmV4dHJhY3RVcmxCYXNlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkxvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKCkgaW5zdGVhZC4iKSxjbGFzc3tzdGF0aWMgZGVjb2RlVGV4dCh0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIFRleHREZWNvZGVyKXJldHVybihuZXcgVGV4dERlY29kZXIpLmRlY29kZSh0KTtsZXQgZT0iIjtmb3IobGV0IG49MCxvPXQubGVuZ3RoO248bztuKyspZSs9U3RyaW5nLmZyb21DaGFyQ29kZSh0W25dKTt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoZSkpfWNhdGNoKHQpe3JldHVybiBlfX1zdGF0aWMgZXh0cmFjdFVybEJhc2UodCl7Y29uc3QgZT10Lmxhc3RJbmRleE9mKCIvIik7cmV0dXJuLTE9PT1lPyIuLyI6dC5zdWJzdHIoMCxlKzEpfX0uZXh0cmFjdFVybEJhc2UodCl9LHhtdC5IYW5kbGVycz17YWRkOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTG9hZGVyOiBIYW5kbGVycy5hZGQoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgTG9hZGluZ01hbmFnZXIuYWRkSGFuZGxlcigpIGluc3RlYWQuIil9LGdldDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkxvYWRlcjogSGFuZGxlcnMuZ2V0KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIExvYWRpbmdNYW5hZ2VyLmdldEhhbmRsZXIoKSBpbnN0ZWFkLiIpfX0sbWF0LnByb3RvdHlwZS5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLiIpLHRoaXMuZ2V0Q2VudGVyKHQpfSxtYXQucHJvdG90eXBlLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLiIpLHRoaXMuaXNFbXB0eSgpfSxtYXQucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uQm94PWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4iKSx0aGlzLmludGVyc2VjdHNCb3godCl9LG1hdC5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb25TcGhlcmU9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1NwaGVyZSgpLiIpLHRoaXMuaW50ZXJzZWN0c1NwaGVyZSh0KX0sbWF0LnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0U2l6ZSgpLiIpLHRoaXMuZ2V0U2l6ZSh0KX0sUmF0LnByb3RvdHlwZS5lbXB0eT1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlNwaGVyZTogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLiIpLHRoaXMuaXNFbXB0eSgpfSxFc3QucHJvdG90eXBlLnNldEZyb21NYXRyaXg9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuRnJ1c3R1bTogLnNldEZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeCgpLiIpLHRoaXMuc2V0RnJvbVByb2plY3Rpb25NYXRyaXgodCl9LCRpdC5wcm90b3R5cGUuZmxhdHRlblRvQXJyYXlPZmZzZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXgzOiAuZmxhdHRlblRvQXJyYXlPZmZzZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnRvQXJyYXkoKSBpbnN0ZWFkLiIpLHRoaXMudG9BcnJheSh0LGUpfSwkaXQucHJvdG90eXBlLm11bHRpcGx5VmVjdG9yMz1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDMoIG1hdHJpeCApIGluc3RlYWQuIiksdC5hcHBseU1hdHJpeDModGhpcyl9LCRpdC5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzQXJyYXk9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSwkaXQucHJvdG90eXBlLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGU9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4MzogLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYXR0cmlidXRlLmFwcGx5TWF0cml4MyggbWF0cml4ICkgaW5zdGVhZC4iKSx0LmFwcGx5TWF0cml4Myh0aGlzKX0sJGl0LnByb3RvdHlwZS5hcHBseVRvVmVjdG9yM0FycmF5PWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4MzogLmFwcGx5VG9WZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSwkaXQucHJvdG90eXBlLmdldEludmVyc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4MzogLmdldEludmVyc2UoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbWF0cml4SW52LmNvcHkoIG1hdHJpeCApLmludmVydCgpOyBpbnN0ZWFkLiIpLHRoaXMuY29weSh0KS5pbnZlcnQoKX0sQmF0LnByb3RvdHlwZS5leHRyYWN0UG9zaXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmV4dHJhY3RQb3NpdGlvbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmNvcHlQb3NpdGlvbigpLiIpLHRoaXMuY29weVBvc2l0aW9uKHQpfSxCYXQucHJvdG90eXBlLmZsYXR0ZW5Ub0FycmF5T2Zmc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmZsYXR0ZW5Ub0FycmF5T2Zmc2V0KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC50b0FycmF5KCkgaW5zdGVhZC4iKSx0aGlzLnRvQXJyYXkodCxlKX0sQmF0LnByb3RvdHlwZS5nZXRQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5nZXRQb3NpdGlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBWZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbWF0cml4ICkgaW5zdGVhZC4iKSwobmV3IGNhdCkuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDMpfSxCYXQucHJvdG90eXBlLnNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb249ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLnNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbigpLiIpLHRoaXMubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCl9LEJhdC5wcm90b3R5cGUubXVsdGlwbHlUb0FycmF5PWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlUb0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sQmF0LnByb3RvdHlwZS5tdWx0aXBseVZlY3RvcjM9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLiIpLHQuYXBwbHlNYXRyaXg0KHRoaXMpfSxCYXQucHJvdG90eXBlLm11bHRpcGx5VmVjdG9yND1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3I0KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuIiksdC5hcHBseU1hdHJpeDQodGhpcyl9LEJhdC5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzQXJyYXk9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxCYXQucHJvdG90eXBlLnJvdGF0ZUF4aXM9ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlQXhpcygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBWZWN0b3IzLnRyYW5zZm9ybURpcmVjdGlvbiggbWF0cml4ICkgaW5zdGVhZC4iKSx0LnRyYW5zZm9ybURpcmVjdGlvbih0aGlzKX0sQmF0LnByb3RvdHlwZS5jcm9zc1ZlY3Rvcj1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuY3Jvc3NWZWN0b3IoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4NCggbWF0cml4ICkgaW5zdGVhZC4iKSx0LmFwcGx5TWF0cml4NCh0aGlzKX0sQmF0LnByb3RvdHlwZS50cmFuc2xhdGU9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAudHJhbnNsYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sQmF0LnByb3RvdHlwZS5yb3RhdGVYPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLnJvdGF0ZVgoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxCYXQucHJvdG90eXBlLnJvdGF0ZVk9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlWSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LEJhdC5wcm90b3R5cGUucm90YXRlWj1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVaKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sQmF0LnByb3RvdHlwZS5yb3RhdGVCeUF4aXM9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlQnlBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sQmF0LnByb3RvdHlwZS5hcHBseVRvQnVmZmVyQXR0cmlidXRlPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGF0dHJpYnV0ZS5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuIiksdC5hcHBseU1hdHJpeDQodGhpcyl9LEJhdC5wcm90b3R5cGUuYXBwbHlUb1ZlY3RvcjNBcnJheT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sQmF0LnByb3RvdHlwZS5tYWtlRnJ1c3R1bT1mdW5jdGlvbih0LGUsbixvLGksYSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm1ha2VGcnVzdHVtKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5tYWtlUGVyc3BlY3RpdmUoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkgaW5zdGVhZC4iKSx0aGlzLm1ha2VQZXJzcGVjdGl2ZSh0LGUsbyxuLGksYSl9LEJhdC5wcm90b3R5cGUuZ2V0SW52ZXJzZT1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuZ2V0SW52ZXJzZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBtYXRyaXhJbnYuY29weSggbWF0cml4ICkuaW52ZXJ0KCk7IGluc3RlYWQuIiksdGhpcy5jb3B5KHQpLmludmVydCgpfSxrc3QucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uTGluZT1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5QbGFuZTogLmlzSW50ZXJzZWN0aW9uTGluZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNMaW5lKCkuIiksdGhpcy5pbnRlcnNlY3RzTGluZSh0KX0sbGF0LnByb3RvdHlwZS5tdWx0aXBseVZlY3RvcjM9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBpcyBub3cgdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApIGluc3RlYWQuIiksdC5hcHBseVF1YXRlcm5pb24odGhpcyl9LGxhdC5wcm90b3R5cGUuaW52ZXJzZT1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlF1YXRlcm5pb246IC5pbnZlcnNlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byBpbnZlcnQoKS4iKSx0aGlzLmludmVydCgpfSxMYXQucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uQm94PWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLiIpLHRoaXMuaW50ZXJzZWN0c0JveCh0KX0sTGF0LnByb3RvdHlwZS5pc0ludGVyc2VjdGlvblBsYW5lPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uUGxhbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzUGxhbmUoKS4iKSx0aGlzLmludGVyc2VjdHNQbGFuZSh0KX0sTGF0LnByb3RvdHlwZS5pc0ludGVyc2VjdGlvblNwaGVyZT1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4iKSx0aGlzLmludGVyc2VjdHNTcGhlcmUodCl9LHZydC5wcm90b3R5cGUuYXJlYT1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAuYXJlYSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEFyZWEoKS4iKSx0aGlzLmdldEFyZWEoKX0sdnJ0LnByb3RvdHlwZS5iYXJ5Y29vcmRGcm9tUG9pbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmJhcnljb29yZEZyb21Qb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEJhcnljb29yZCgpLiIpLHRoaXMuZ2V0QmFyeWNvb3JkKHQsZSl9LHZydC5wcm90b3R5cGUubWlkcG9pbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5taWRwb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE1pZHBvaW50KCkuIiksdGhpcy5nZXRNaWRwb2ludCh0KX0sdnJ0LnByb3RvdHlwZW5vcm1hbD1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLm5vcm1hbCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE5vcm1hbCgpLiIpLHRoaXMuZ2V0Tm9ybWFsKHQpfSx2cnQucHJvdG90eXBlLnBsYW5lPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAucGxhbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRQbGFuZSgpLiIpLHRoaXMuZ2V0UGxhbmUodCl9LHZydC5iYXJ5Y29vcmRGcm9tUG9pbnQ9ZnVuY3Rpb24odCxlLG4sbyxpKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmJhcnljb29yZEZyb21Qb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEJhcnljb29yZCgpLiIpLHZydC5nZXRCYXJ5Y29vcmQodCxlLG4sbyxpKX0sdnJ0Lm5vcm1hbD1mdW5jdGlvbih0LGUsbixvKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLm5vcm1hbCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE5vcm1hbCgpLiIpLHZydC5nZXROb3JtYWwodCxlLG4sbyl9LFJtdC5wcm90b3R5cGUuZXh0cmFjdEFsbFBvaW50cz1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5TaGFwZTogLmV4dHJhY3RBbGxQb2ludHMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmV4dHJhY3RQb2ludHMoKSBpbnN0ZWFkLiIpLHRoaXMuZXh0cmFjdFBvaW50cyh0KX0sUm10LnByb3RvdHlwZS5leHRydWRlPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlNoYXBlOiAuZXh0cnVkZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFeHRydWRlR2VvbWV0cnkoKSBpbnN0ZWFkLiIpLG5ldyBubXQodGhpcyx0KX0sUm10LnByb3RvdHlwZS5tYWtlR2VvbWV0cnk9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuU2hhcGU6IC5tYWtlR2VvbWV0cnkoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgU2hhcGVHZW9tZXRyeSgpIGluc3RlYWQuIiksbmV3IGltdCh0aGlzLHQpfSxRaXQucHJvdG90eXBlLmZyb21BdHRyaWJ1dGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpLHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUsbil9LFFpdC5wcm90b3R5cGUuZGlzdGFuY2VUb01hbmhhdHRhbj1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiAuZGlzdGFuY2VUb01hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkRpc3RhbmNlVG8oKS4iKSx0aGlzLm1hbmhhdHRhbkRpc3RhbmNlVG8odCl9LFFpdC5wcm90b3R5cGUubGVuZ3RoTWFuaGF0dGFuPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLiIpLHRoaXMubWFuaGF0dGFuTGVuZ3RoKCl9LGNhdC5wcm90b3R5cGUuc2V0RXVsZXJGcm9tUm90YXRpb25NYXRyaXg9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5WZWN0b3IzOiAuc2V0RXVsZXJGcm9tUm90YXRpb25NYXRyaXgoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXVsZXIuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgaW5zdGVhZC4iKX0sY2F0LnByb3RvdHlwZS5zZXRFdWxlckZyb21RdWF0ZXJuaW9uPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuVmVjdG9yMzogLnNldEV1bGVyRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXVsZXIuc2V0RnJvbVF1YXRlcm5pb24oKSBpbnN0ZWFkLiIpfSxjYXQucHJvdG90eXBlLmdldFBvc2l0aW9uRnJvbU1hdHJpeD1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZ2V0UG9zaXRpb25Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCkuIiksdGhpcy5zZXRGcm9tTWF0cml4UG9zaXRpb24odCl9LGNhdC5wcm90b3R5cGUuZ2V0U2NhbGVGcm9tTWF0cml4PWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5nZXRTY2FsZUZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4U2NhbGUoKS4iKSx0aGlzLnNldEZyb21NYXRyaXhTY2FsZSh0KX0sY2F0LnByb3RvdHlwZS5nZXRDb2x1bW5Gcm9tTWF0cml4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmdldENvbHVtbkZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4Q29sdW1uKCkuIiksdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKGUsdCl9LGNhdC5wcm90b3R5cGUuYXBwbHlQcm9qZWN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5hcHBseVByb2plY3Rpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmFwcGx5TWF0cml4NCggbSApIGluc3RlYWQuIiksdGhpcy5hcHBseU1hdHJpeDQodCl9LGNhdC5wcm90b3R5cGUuZnJvbUF0dHJpYnV0ZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuIiksdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSxuKX0sY2F0LnByb3RvdHlwZS5kaXN0YW5jZVRvTWFuaGF0dGFuPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5kaXN0YW5jZVRvTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuRGlzdGFuY2VUbygpLiIpLHRoaXMubWFuaGF0dGFuRGlzdGFuY2VUbyh0KX0sY2F0LnByb3RvdHlwZS5sZW5ndGhNYW5oYXR0YW49ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAubGVuZ3RoTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuTGVuZ3RoKCkuIiksdGhpcy5tYW5oYXR0YW5MZW5ndGgoKX0sYWF0LnByb3RvdHlwZS5mcm9tQXR0cmlidXRlPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3I0OiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKSx0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlLG4pfSxhYXQucHJvdG90eXBlLmxlbmd0aE1hbmhhdHRhbj1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4iKSx0aGlzLm1hbmhhdHRhbkxlbmd0aCgpfSxwcnQucHJvdG90eXBlLmdldENoaWxkQnlOYW1lPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuZ2V0Q2hpbGRCeU5hbWUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRPYmplY3RCeU5hbWUoKS4iKSx0aGlzLmdldE9iamVjdEJ5TmFtZSh0KX0scHJ0LnByb3RvdHlwZS5yZW5kZXJEZXB0aD1mdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5yZW5kZXJEZXB0aCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnJlbmRlck9yZGVyLCBpbnN0ZWFkLiIpfSxwcnQucHJvdG90eXBlLnRyYW5zbGF0ZT1mdW5jdGlvbih0LGUpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAudHJhbnNsYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC50cmFuc2xhdGVPbkF4aXMoIGF4aXMsIGRpc3RhbmNlICkgaW5zdGVhZC4iKSx0aGlzLnRyYW5zbGF0ZU9uQXhpcyhlLHQpfSxwcnQucHJvdG90eXBlLmdldFdvcmxkUm90YXRpb249ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUm90YXRpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuT2JqZWN0M0QuZ2V0V29ybGRRdWF0ZXJuaW9uKCB0YXJnZXQgKSBpbnN0ZWFkLiIpfSxwcnQucHJvdG90eXBlLmFwcGx5TWF0cml4PWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuYXBwbHlNYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5hcHBseU1hdHJpeDQoKS4iKSx0aGlzLmFwcGx5TWF0cml4NCh0KX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocHJ0LnByb3RvdHlwZSx7ZXVsZXJPcmRlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuIiksdGhpcy5yb3RhdGlvbi5vcmRlcn0sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuIiksdGhpcy5yb3RhdGlvbi5vcmRlcj10fX0sdXNlUXVhdGVybmlvbjp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnVzZVF1YXRlcm5pb24gaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIGxpYnJhcnkgbm93IHVzZXMgcXVhdGVybmlvbnMgYnkgZGVmYXVsdC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnVzZVF1YXRlcm5pb24gaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIGxpYnJhcnkgbm93IHVzZXMgcXVhdGVybmlvbnMgYnkgZGVmYXVsdC4iKX19fSkscHN0LnByb3RvdHlwZS5zZXREcmF3TW9kZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1lc2g6IC5zZXREcmF3TW9kZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSByZW5kZXJlciBub3cgYWx3YXlzIGFzc3VtZXMgVEhSRUUuVHJpYW5nbGVzRHJhd01vZGUuIFRyYW5zZm9ybSB5b3VyIGdlb21ldHJ5IHZpYSBCdWZmZXJHZW9tZXRyeVV0aWxzLnRvVHJpYW5nbGVzRHJhd01vZGUoKSBpZiBuZWNlc3NhcnkuIil9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHBzdC5wcm90b3R5cGUse2RyYXdNb2RlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuTWVzaDogLmRyYXdNb2RlIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSByZW5kZXJlciBub3cgYWx3YXlzIGFzc3VtZXMgVEhSRUUuVHJpYW5nbGVzRHJhd01vZGUuIiksMH0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWVzaDogLmRyYXdNb2RlIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSByZW5kZXJlciBub3cgYWx3YXlzIGFzc3VtZXMgVEhSRUUuVHJpYW5nbGVzRHJhd01vZGUuIFRyYW5zZm9ybSB5b3VyIGdlb21ldHJ5IHZpYSBCdWZmZXJHZW9tZXRyeVV0aWxzLnRvVHJpYW5nbGVzRHJhd01vZGUoKSBpZiBuZWNlc3NhcnkuIil9fX0pLGpkdC5wcm90b3R5cGUuaW5pdEJvbmVzPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2tpbm5lZE1lc2g6IGluaXRCb25lcygpIGhhcyBiZWVuIHJlbW92ZWQuIil9LF9zdC5wcm90b3R5cGUuc2V0TGVucz1mdW5jdGlvbih0LGUpe2NvbnNvbGUud2FybigiVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEuc2V0TGVucyBpcyBkZXByZWNhdGVkLiBVc2UgLnNldEZvY2FsTGVuZ3RoIGFuZCAuZmlsbUdhdWdlIGZvciBhIHBob3RvZ3JhcGhpYyBzZXR1cC4iKSx2b2lkIDAhPT1lJiYodGhpcy5maWxtR2F1Z2U9ZSksdGhpcy5zZXRGb2NhbExlbmd0aCh0KX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQW10LnByb3RvdHlwZSx7b25seVNoYWRvdzp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLm9ubHlTaGFkb3cgaGFzIGJlZW4gcmVtb3ZlZC4iKX19LHNoYWRvd0NhbWVyYUZvdjp7c2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGb3YgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZvdi4iKSx0aGlzLnNoYWRvdy5jYW1lcmEuZm92PXR9fSxzaGFkb3dDYW1lcmFMZWZ0OntzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUxlZnQgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmxlZnQuIiksdGhpcy5zaGFkb3cuY2FtZXJhLmxlZnQ9dH19LHNoYWRvd0NhbWVyYVJpZ2h0OntzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVJpZ2h0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5yaWdodC4iKSx0aGlzLnNoYWRvdy5jYW1lcmEucmlnaHQ9dH19LHNoYWRvd0NhbWVyYVRvcDp7c2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFUb3AgaXMgbm93IC5zaGFkb3cuY2FtZXJhLnRvcC4iKSx0aGlzLnNoYWRvdy5jYW1lcmEudG9wPXR9fSxzaGFkb3dDYW1lcmFCb3R0b206e3NldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhQm90dG9tIGlzIG5vdyAuc2hhZG93LmNhbWVyYS5ib3R0b20uIiksdGhpcy5zaGFkb3cuY2FtZXJhLmJvdHRvbT10fX0sc2hhZG93Q2FtZXJhTmVhcjp7c2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFOZWFyIGlzIG5vdyAuc2hhZG93LmNhbWVyYS5uZWFyLiIpLHRoaXMuc2hhZG93LmNhbWVyYS5uZWFyPXR9fSxzaGFkb3dDYW1lcmFGYXI6e3NldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhRmFyIGlzIG5vdyAuc2hhZG93LmNhbWVyYS5mYXIuIiksdGhpcy5zaGFkb3cuY2FtZXJhLmZhcj10fX0sc2hhZG93Q2FtZXJhVmlzaWJsZTp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVZpc2libGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5DYW1lcmFIZWxwZXIoIGxpZ2h0LnNoYWRvdy5jYW1lcmEgKSBpbnN0ZWFkLiIpfX0sc2hhZG93Qmlhczp7c2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dCaWFzIGlzIG5vdyAuc2hhZG93LmJpYXMuIiksdGhpcy5zaGFkb3cuYmlhcz10fX0sc2hhZG93RGFya25lc3M6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dEYXJrbmVzcyBoYXMgYmVlbiByZW1vdmVkLiIpfX0sc2hhZG93TWFwV2lkdGg6e3NldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93TWFwV2lkdGggaXMgbm93IC5zaGFkb3cubWFwU2l6ZS53aWR0aC4iKSx0aGlzLnNoYWRvdy5tYXBTaXplLndpZHRoPXR9fSxzaGFkb3dNYXBIZWlnaHQ6e3NldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93TWFwSGVpZ2h0IGlzIG5vdyAuc2hhZG93Lm1hcFNpemUuaGVpZ2h0LiIpLHRoaXMuc2hhZG93Lm1hcFNpemUuaGVpZ2h0PXR9fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHpydC5wcm90b3R5cGUse2xlbmd0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAubGVuZ3RoIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuY291bnQgaW5zdGVhZC4iKSx0aGlzLmFycmF5Lmxlbmd0aH19LGR5bmFtaWM6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmR5bmFtaWMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC51c2FnZSBpbnN0ZWFkLiIpLHRoaXMudXNhZ2U9PT1WaXR9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAuZHluYW1pYyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnVzYWdlIGluc3RlYWQuIiksdGhpcy5zZXRVc2FnZShWaXQpfX19KSx6cnQucHJvdG90eXBlLnNldER5bmFtaWM9ZnVuY3Rpb24odCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAuc2V0RHluYW1pYygpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuc2V0VXNhZ2UoKSBpbnN0ZWFkLiIpLHRoaXMuc2V0VXNhZ2UoITA9PT10P1ZpdDpCaXQpLHRoaXN9LHpydC5wcm90b3R5cGUuY29weUluZGljZXNBcnJheT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmNvcHlJbmRpY2VzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSx6cnQucHJvdG90eXBlLnNldEFycmF5PWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAuc2V0QXJyYXkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEJ1ZmZlckdlb21ldHJ5IC5zZXRBdHRyaWJ1dGUgdG8gcmVwbGFjZS9yZXNpemUgYXR0cmlidXRlIGJ1ZmZlcnMiKX0scXJ0LnByb3RvdHlwZS5hZGRJbmRleD1mdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkSW5kZXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRJbmRleCgpLiIpLHRoaXMuc2V0SW5kZXgodCl9LHFydC5wcm90b3R5cGUuYWRkQXR0cmlidXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRBdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRBdHRyaWJ1dGUoKS4iKSxlJiZlLmlzQnVmZmVyQXR0cmlidXRlfHxlJiZlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU/ImluZGV4Ij09PXQ/KGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnkuYWRkQXR0cmlidXRlOiBVc2UgLnNldEluZGV4KCkgZm9yIGluZGV4IGF0dHJpYnV0ZS4iKSx0aGlzLnNldEluZGV4KGUpLHRoaXMpOnRoaXMuc2V0QXR0cmlidXRlKHQsZSk6KGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRBdHRyaWJ1dGUoKSBub3cgZXhwZWN0cyAoIG5hbWUsIGF0dHJpYnV0ZSApLiIpLHRoaXMuc2V0QXR0cmlidXRlKHQsbmV3IHpydChhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKSkpfSxxcnQucHJvdG90eXBlLmFkZERyYXdDYWxsPWZ1bmN0aW9uKHQsZSxuKXt2b2lkIDAhPT1uJiZjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkRHJhd0NhbGwoKSBubyBsb25nZXIgc3VwcG9ydHMgaW5kZXhPZmZzZXQuIiksY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZERyYXdDYWxsKCkgaXMgbm93IC5hZGRHcm91cCgpLiIpLHRoaXMuYWRkR3JvdXAodCxlKX0scXJ0LnByb3RvdHlwZS5jbGVhckRyYXdDYWxscz1mdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jbGVhckRyYXdDYWxscygpIGlzIG5vdyAuY2xlYXJHcm91cHMoKS4iKSx0aGlzLmNsZWFyR3JvdXBzKCl9LHFydC5wcm90b3R5cGUuY29tcHV0ZU9mZnNldHM9ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZU9mZnNldHMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxxcnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZT1mdW5jdGlvbih0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLnJlbW92ZUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmRlbGV0ZUF0dHJpYnV0ZSgpLiIpLHRoaXMuZGVsZXRlQXR0cmlidXRlKHQpfSxxcnQucHJvdG90eXBlLmFwcGx5TWF0cml4PWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYXBwbHlNYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5hcHBseU1hdHJpeDQoKS4iKSx0aGlzLmFwcGx5TWF0cml4NCh0KX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocXJ0LnByb3RvdHlwZSx7ZHJhd2NhbGxzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5kcmF3Y2FsbHMgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ3JvdXBzLiIpLHRoaXMuZ3JvdXBzfX0sb2Zmc2V0czp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5vZmZzZXRzIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdyb3Vwcy4iKSx0aGlzLmdyb3Vwc319fSksX2R0LnByb3RvdHlwZS5zZXREeW5hbWljPWZ1bmN0aW9uKHQpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkludGVybGVhdmVkQnVmZmVyOiAuc2V0RHluYW1pYygpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuc2V0VXNhZ2UoKSBpbnN0ZWFkLiIpLHRoaXMuc2V0VXNhZ2UoITA9PT10P1ZpdDpCaXQpLHRoaXN9LF9kdC5wcm90b3R5cGUuc2V0QXJyYXk9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlcjogLnNldEFycmF5IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBCdWZmZXJHZW9tZXRyeSAuc2V0QXR0cmlidXRlIHRvIHJlcGxhY2UvcmVzaXplIGF0dHJpYnV0ZSBidWZmZXJzIil9LG5tdC5wcm90b3R5cGUuZ2V0QXJyYXlzPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiAuZ2V0QXJyYXlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sbm10LnByb3RvdHlwZS5hZGRTaGFwZUxpc3Q9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlR2VvbWV0cnk6IC5hZGRTaGFwZUxpc3QoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxubXQucHJvdG90eXBlLmFkZFNoYXBlPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiAuYWRkU2hhcGUoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSx5ZHQucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TY2VuZTogLmRpc3Bvc2UoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPcnQucHJvdG90eXBlLHt3cmFwQXJvdW5kOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLiIpfX0sb3ZlcmRyYXc6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6IC5vdmVyZHJhdyBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAub3ZlcmRyYXcgaGFzIGJlZW4gcmVtb3ZlZC4iKX19LHdyYXBSR0I6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcFJHQiBoYXMgYmVlbiByZW1vdmVkLiIpLG5ldyBScnR9fSxzaGFkaW5nOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS4iK3RoaXMudHlwZSsiOiAuc2hhZGluZyBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdGhlIGJvb2xlYW4gLmZsYXRTaGFkaW5nIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLiIrdGhpcy50eXBlKyI6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4iKSx0aGlzLmZsYXRTaGFkaW5nPTE9PT10fX0sc3RlbmNpbE1hc2s6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLiIrdGhpcy50eXBlKyI6IC5zdGVuY2lsTWFzayBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnN0ZW5jaWxGdW5jTWFzayBpbnN0ZWFkLiIpLHRoaXMuc3RlbmNpbEZ1bmNNYXNrfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS4iK3RoaXMudHlwZSsiOiAuc3RlbmNpbE1hc2sgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5zdGVuY2lsRnVuY01hc2sgaW5zdGVhZC4iKSx0aGlzLnN0ZW5jaWxGdW5jTWFzaz10fX0sdmVydGV4VGFuZ2VudHM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnZlcnRleFRhbmdlbnRzIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnZlcnRleFRhbmdlbnRzIGhhcyBiZWVuIHJlbW92ZWQuIil9fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGJzdC5wcm90b3R5cGUse2Rlcml2YXRpdmVzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5TaGFkZXJNYXRlcmlhbDogLmRlcml2YXRpdmVzIGhhcyBiZWVuIG1vdmVkIHRvIC5leHRlbnNpb25zLmRlcml2YXRpdmVzLiIpLHRoaXMuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlc30sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuIFNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuIiksdGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzPXR9fX0pLGJkdC5wcm90b3R5cGUuY2xlYXJUYXJnZXQ9ZnVuY3Rpb24odCxlLG4sbyl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuY2xlYXJUYXJnZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnNldFJlbmRlclRhcmdldCgpIGFuZCAuY2xlYXIoKSBpbnN0ZWFkLiIpLHRoaXMuc2V0UmVuZGVyVGFyZ2V0KHQpLHRoaXMuY2xlYXIoZSxuLG8pfSxiZHQucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYW5pbWF0ZSgpIGlzIG5vdyAuc2V0QW5pbWF0aW9uTG9vcCgpLiIpLHRoaXMuc2V0QW5pbWF0aW9uTG9vcCh0KX0sYmR0LnByb3RvdHlwZS5nZXRDdXJyZW50UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldEN1cnJlbnRSZW5kZXJUYXJnZXQoKSBpcyBub3cgLmdldFJlbmRlclRhcmdldCgpLiIpLHRoaXMuZ2V0UmVuZGVyVGFyZ2V0KCl9LGJkdC5wcm90b3R5cGUuZ2V0TWF4QW5pc290cm9weT1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRNYXhBbmlzb3Ryb3B5KCkgaXMgbm93IC5jYXBhYmlsaXRpZXMuZ2V0TWF4QW5pc290cm9weSgpLiIpLHRoaXMuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKX0sYmR0LnByb3RvdHlwZS5nZXRQcmVjaXNpb249ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0UHJlY2lzaW9uKCkgaXMgbm93IC5jYXBhYmlsaXRpZXMucHJlY2lzaW9uLiIpLHRoaXMuY2FwYWJpbGl0aWVzLnByZWNpc2lvbn0sYmR0LnByb3RvdHlwZS5yZXNldEdMU3RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAucmVzZXRHTFN0YXRlKCkgaXMgbm93IC5zdGF0ZS5yZXNldCgpLiIpLHRoaXMuc3RhdGUucmVzZXQoKX0sYmR0LnByb3RvdHlwZS5zdXBwb3J0c0Zsb2F0VGV4dHVyZXM9ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApLiIpLHRoaXMuZXh0ZW5zaW9ucy5nZXQoIk9FU190ZXh0dXJlX2Zsb2F0Iil9LGJkdC5wcm90b3R5cGUuc3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlcz1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0hhbGZGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnICkuIiksdGhpcy5leHRlbnNpb25zLmdldCgiT0VTX3RleHR1cmVfaGFsZl9mbG9hdCIpfSxiZHQucHJvdG90eXBlLnN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlcz1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyApLiIpLHRoaXMuZXh0ZW5zaW9ucy5nZXQoIk9FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyIpfSxiZHQucHJvdG90eXBlLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApLiIpLHRoaXMuZXh0ZW5zaW9ucy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil9LGJkdC5wcm90b3R5cGUuc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICkuIiksdGhpcy5leHRlbnNpb25zLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIil9LGJkdC5wcm90b3R5cGUuc3VwcG9ydHNCbGVuZE1pbk1heD1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0JsZW5kTWluTWF4KCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICkuIiksdGhpcy5leHRlbnNpb25zLmdldCgiRVhUX2JsZW5kX21pbm1heCIpfSxiZHQucHJvdG90eXBlLnN1cHBvcnRzVmVydGV4VGV4dHVyZXM9ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcygpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzLiIpLHRoaXMuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzfSxiZHQucHJvdG90eXBlLnN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzPWZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICkuIiksdGhpcy5leHRlbnNpb25zLmdldCgiQU5HTEVfaW5zdGFuY2VkX2FycmF5cyIpfSxiZHQucHJvdG90eXBlLmVuYWJsZVNjaXNzb3JUZXN0PWZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmVuYWJsZVNjaXNzb3JUZXN0KCkgaXMgbm93IC5zZXRTY2lzc29yVGVzdCgpLiIpLHRoaXMuc2V0U2Npc3NvclRlc3QodCl9LGJkdC5wcm90b3R5cGUuaW5pdE1hdGVyaWFsPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuaW5pdE1hdGVyaWFsKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYmR0LnByb3RvdHlwZS5hZGRQcmVQbHVnaW49ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQcmVQbHVnaW4oKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxiZHQucHJvdG90eXBlLmFkZFBvc3RQbHVnaW49ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQb3N0UGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYmR0LnByb3RvdHlwZS51cGRhdGVTaGFkb3dNYXA9ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC51cGRhdGVTaGFkb3dNYXAoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxiZHQucHJvdG90eXBlLnNldEZhY2VDdWxsaW5nPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0RmFjZUN1bGxpbmcoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxiZHQucHJvdG90eXBlLmFsbG9jVGV4dHVyZVVuaXQ9ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5hbGxvY1RleHR1cmVVbml0KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYmR0LnByb3RvdHlwZS5zZXRUZXh0dXJlPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGJkdC5wcm90b3R5cGUuc2V0VGV4dHVyZTJEPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZTJEKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYmR0LnByb3RvdHlwZS5zZXRUZXh0dXJlQ3ViZT1mdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldFRleHR1cmVDdWJlKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYmR0LnByb3RvdHlwZS5nZXRBY3RpdmVNaXBNYXBMZXZlbD1mdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRBY3RpdmVNaXBNYXBMZXZlbCgpIGlzIG5vdyAuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKS4iKSx0aGlzLmdldEFjdGl2ZU1pcG1hcExldmVsKCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGJkdC5wcm90b3R5cGUse3NoYWRvd01hcEVuYWJsZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNoYWRvd01hcC5lbmFibGVkfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwRW5hYmxlZCBpcyBub3cgLnNoYWRvd01hcC5lbmFibGVkLiIpLHRoaXMuc2hhZG93TWFwLmVuYWJsZWQ9dH19LHNoYWRvd01hcFR5cGU6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNoYWRvd01hcC50eXBlfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwVHlwZSBpcyBub3cgLnNoYWRvd01hcC50eXBlLiIpLHRoaXMuc2hhZG93TWFwLnR5cGU9dH19LHNoYWRvd01hcEN1bGxGYWNlOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBDdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBDdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX0sY29udGV4dDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmNvbnRleHQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5nZXRDb250ZXh0KCkgaW5zdGVhZC4iKSx0aGlzLmdldENvbnRleHQoKX19LHZyOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAudnIgaGFzIGJlZW4gcmVuYW1lZCB0byAueHIiKSx0aGlzLnhyfX0sZ2FtbWFJbnB1dDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdhbW1hSW5wdXQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IHRoZSBlbmNvZGluZyBmb3IgdGV4dHVyZXMgdmlhIFRleHR1cmUuZW5jb2RpbmcgaW5zdGVhZC4iKSwhMX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2FtbWFJbnB1dCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgdGhlIGVuY29kaW5nIGZvciB0ZXh0dXJlcyB2aWEgVGV4dHVyZS5lbmNvZGluZyBpbnN0ZWFkLiIpfX0sZ2FtbWFPdXRwdXQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5nYW1tYU91dHB1dCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgV2ViR0xSZW5kZXJlci5vdXRwdXRFbmNvZGluZyBpbnN0ZWFkLiIpLCExfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2FtbWFPdXRwdXQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IFdlYkdMUmVuZGVyZXIub3V0cHV0RW5jb2RpbmcgaW5zdGVhZC4iKSx0aGlzLm91dHB1dEVuY29kaW5nPSEwPT09dD9JaXQ6eml0fX0sdG9uZU1hcHBpbmdXaGl0ZVBvaW50OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAudG9uZU1hcHBpbmdXaGl0ZVBvaW50IGhhcyBiZWVuIHJlbW92ZWQuIiksMX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAudG9uZU1hcHBpbmdXaGl0ZVBvaW50IGhhcyBiZWVuIHJlbW92ZWQuIil9fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHNkdC5wcm90b3R5cGUse2N1bGxGYWNlOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAuY3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9fSxyZW5kZXJSZXZlcnNlU2lkZWQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclJldmVyc2VTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX0scmVuZGVyU2luZ2xlU2lkZWQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJTaW5nbGVTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyU2luZ2xlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX19fSksT2JqZWN0LmRlZmluZVByb3BlcnRpZXMocmF0LnByb3RvdHlwZSx7d3JhcFM6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLiIpLHRoaXMudGV4dHVyZS53cmFwU30sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwUyBpcyBub3cgLnRleHR1cmUud3JhcFMuIiksdGhpcy50ZXh0dXJlLndyYXBTPXR9fSx3cmFwVDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwVCBpcyBub3cgLnRleHR1cmUud3JhcFQuIiksdGhpcy50ZXh0dXJlLndyYXBUfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBUIGlzIG5vdyAudGV4dHVyZS53cmFwVC4iKSx0aGlzLnRleHR1cmUud3JhcFQ9dH19LG1hZ0ZpbHRlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5tYWdGaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1hZ0ZpbHRlci4iKSx0aGlzLnRleHR1cmUubWFnRmlsdGVyfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLiIpLHRoaXMudGV4dHVyZS5tYWdGaWx0ZXI9dH19LG1pbkZpbHRlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4iKSx0aGlzLnRleHR1cmUubWluRmlsdGVyfSxzZXQ6ZnVuY3Rpb24odCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1pbkZpbHRlciBpcyBub3cgLnRleHR1cmUubWluRmlsdGVyLiIpLHRoaXMudGV4dHVyZS5taW5GaWx0ZXI9dH19LGFuaXNvdHJvcHk6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4iKSx0aGlzLnRleHR1cmUuYW5pc290cm9weX0sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LiIpLHRoaXMudGV4dHVyZS5hbmlzb3Ryb3B5PXR9fSxvZmZzZXQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuIiksdGhpcy50ZXh0dXJlLm9mZnNldH0sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4iKSx0aGlzLnRleHR1cmUub2Zmc2V0PXR9fSxyZXBlYXQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuIiksdGhpcy50ZXh0dXJlLnJlcGVhdH0sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5yZXBlYXQgaXMgbm93IC50ZXh0dXJlLnJlcGVhdC4iKSx0aGlzLnRleHR1cmUucmVwZWF0PXR9fSxmb3JtYXQ6e2dldDpmdW5jdGlvbigpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZm9ybWF0IGlzIG5vdyAudGV4dHVyZS5mb3JtYXQuIiksdGhpcy50ZXh0dXJlLmZvcm1hdH0sc2V0OmZ1bmN0aW9uKHQpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5mb3JtYXQgaXMgbm93IC50ZXh0dXJlLmZvcm1hdC4iKSx0aGlzLnRleHR1cmUuZm9ybWF0PXR9fSx0eXBlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnR5cGUgaXMgbm93IC50ZXh0dXJlLnR5cGUuIiksdGhpcy50ZXh0dXJlLnR5cGV9LHNldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4iKSx0aGlzLnRleHR1cmUudHlwZT10fX0sZ2VuZXJhdGVNaXBtYXBzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmdlbmVyYXRlTWlwbWFwcyBpcyBub3cgLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzLiIpLHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHN9LHNldDpmdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZ2VuZXJhdGVNaXBtYXBzIGlzIG5vdyAudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMuIiksdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz10fX19KSxjbGFzcyBleHRlbmRzIHBydHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iQXVkaW8iLHRoaXMubGlzdGVuZXI9dCx0aGlzLmNvbnRleHQ9dC5jb250ZXh0LHRoaXMuZ2Fpbj10aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpLHRoaXMuZ2Fpbi5jb25uZWN0KHQuZ2V0SW5wdXQoKSksdGhpcy5hdXRvcGxheT0hMSx0aGlzLmJ1ZmZlcj1udWxsLHRoaXMuZGV0dW5lPTAsdGhpcy5sb29wPSExLHRoaXMubG9vcFN0YXJ0PTAsdGhpcy5sb29wRW5kPTAsdGhpcy5vZmZzZXQ9MCx0aGlzLmR1cmF0aW9uPXZvaWQgMCx0aGlzLnBsYXliYWNrUmF0ZT0xLHRoaXMuaXNQbGF5aW5nPSExLHRoaXMuaGFzUGxheWJhY2tDb250cm9sPSEwLHRoaXMuc291cmNlPW51bGwsdGhpcy5zb3VyY2VUeXBlPSJlbXB0eSIsdGhpcy5fc3RhcnRlZEF0PTAsdGhpcy5fcHJvZ3Jlc3M9MCx0aGlzLl9jb25uZWN0ZWQ9ITEsdGhpcy5maWx0ZXJzPVtdfWdldE91dHB1dCgpe3JldHVybiB0aGlzLmdhaW59c2V0Tm9kZVNvdXJjZSh0KXtyZXR1cm4gdGhpcy5oYXNQbGF5YmFja0NvbnRyb2w9ITEsdGhpcy5zb3VyY2VUeXBlPSJhdWRpb05vZGUiLHRoaXMuc291cmNlPXQsdGhpcy5jb25uZWN0KCksdGhpc31zZXRNZWRpYUVsZW1lbnRTb3VyY2UodCl7cmV0dXJuIHRoaXMuaGFzUGxheWJhY2tDb250cm9sPSExLHRoaXMuc291cmNlVHlwZT0ibWVkaWFOb2RlIix0aGlzLnNvdXJjZT10aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFFbGVtZW50U291cmNlKHQpLHRoaXMuY29ubmVjdCgpLHRoaXN9c2V0TWVkaWFTdHJlYW1Tb3VyY2UodCl7cmV0dXJuIHRoaXMuaGFzUGxheWJhY2tDb250cm9sPSExLHRoaXMuc291cmNlVHlwZT0ibWVkaWFTdHJlYW1Ob2RlIix0aGlzLnNvdXJjZT10aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFTdHJlYW1Tb3VyY2UodCksdGhpcy5jb25uZWN0KCksdGhpc31zZXRCdWZmZXIodCl7cmV0dXJuIHRoaXMuYnVmZmVyPXQsdGhpcy5zb3VyY2VUeXBlPSJidWZmZXIiLHRoaXMuYXV0b3BsYXkmJnRoaXMucGxheSgpLHRoaXN9cGxheSh0PTApe2lmKCEwPT09dGhpcy5pc1BsYXlpbmcpcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogQXVkaW8gaXMgYWxyZWFkeSBwbGF5aW5nLiIpO2lmKCExPT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wpcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTt0aGlzLl9zdGFydGVkQXQ9dGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lK3Q7Y29uc3QgZT10aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7cmV0dXJuIGUuYnVmZmVyPXRoaXMuYnVmZmVyLGUubG9vcD10aGlzLmxvb3AsZS5sb29wU3RhcnQ9dGhpcy5sb29wU3RhcnQsZS5sb29wRW5kPXRoaXMubG9vcEVuZCxlLm9uZW5kZWQ9dGhpcy5vbkVuZGVkLmJpbmQodGhpcyksZS5zdGFydCh0aGlzLl9zdGFydGVkQXQsdGhpcy5fcHJvZ3Jlc3MrdGhpcy5vZmZzZXQsdGhpcy5kdXJhdGlvbiksdGhpcy5pc1BsYXlpbmc9ITAsdGhpcy5zb3VyY2U9ZSx0aGlzLnNldERldHVuZSh0aGlzLmRldHVuZSksdGhpcy5zZXRQbGF5YmFja1JhdGUodGhpcy5wbGF5YmFja1JhdGUpLHRoaXMuY29ubmVjdCgpfXBhdXNlKCl7aWYoITEhPT10aGlzLmhhc1BsYXliYWNrQ29udHJvbClyZXR1cm4hMD09PXRoaXMuaXNQbGF5aW5nJiYodGhpcy5fcHJvZ3Jlc3MrPU1hdGgubWF4KHRoaXMuY29udGV4dC5jdXJyZW50VGltZS10aGlzLl9zdGFydGVkQXQsMCkqdGhpcy5wbGF5YmFja1JhdGUsITA9PT10aGlzLmxvb3AmJih0aGlzLl9wcm9ncmVzcz10aGlzLl9wcm9ncmVzcyUodGhpcy5kdXJhdGlvbnx8dGhpcy5idWZmZXIuZHVyYXRpb24pKSx0aGlzLnNvdXJjZS5zdG9wKCksdGhpcy5zb3VyY2Uub25lbmRlZD1udWxsLHRoaXMuaXNQbGF5aW5nPSExKSx0aGlzO2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIil9c3RvcCgpe2lmKCExIT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wpcmV0dXJuIHRoaXMuX3Byb2dyZXNzPTAsdGhpcy5zb3VyY2Uuc3RvcCgpLHRoaXMuc291cmNlLm9uZW5kZWQ9bnVsbCx0aGlzLmlzUGxheWluZz0hMSx0aGlzO2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIil9Y29ubmVjdCgpe2lmKHRoaXMuZmlsdGVycy5sZW5ndGg+MCl7dGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pO2ZvcihsZXQgdD0xLGU9dGhpcy5maWx0ZXJzLmxlbmd0aDt0PGU7dCsrKXRoaXMuZmlsdGVyc1t0LTFdLmNvbm5lY3QodGhpcy5maWx0ZXJzW3RdKTt0aGlzLmZpbHRlcnNbdGhpcy5maWx0ZXJzLmxlbmd0aC0xXS5jb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpfWVsc2UgdGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKTtyZXR1cm4gdGhpcy5fY29ubmVjdGVkPSEwLHRoaXN9ZGlzY29ubmVjdCgpe2lmKHRoaXMuZmlsdGVycy5sZW5ndGg+MCl7dGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pO2ZvcihsZXQgdD0xLGU9dGhpcy5maWx0ZXJzLmxlbmd0aDt0PGU7dCsrKXRoaXMuZmlsdGVyc1t0LTFdLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXJzW3RdKTt0aGlzLmZpbHRlcnNbdGhpcy5maWx0ZXJzLmxlbmd0aC0xXS5kaXNjb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpfWVsc2UgdGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKTtyZXR1cm4gdGhpcy5fY29ubmVjdGVkPSExLHRoaXN9Z2V0RmlsdGVycygpe3JldHVybiB0aGlzLmZpbHRlcnN9c2V0RmlsdGVycyh0KXtyZXR1cm4gdHx8KHQ9W10pLCEwPT09dGhpcy5fY29ubmVjdGVkPyh0aGlzLmRpc2Nvbm5lY3QoKSx0aGlzLmZpbHRlcnM9dC5zbGljZSgpLHRoaXMuY29ubmVjdCgpKTp0aGlzLmZpbHRlcnM9dC5zbGljZSgpLHRoaXN9c2V0RGV0dW5lKHQpe2lmKHRoaXMuZGV0dW5lPXQsdm9pZCAwIT09dGhpcy5zb3VyY2UuZGV0dW5lKXJldHVybiEwPT09dGhpcy5pc1BsYXlpbmcmJnRoaXMuc291cmNlLmRldHVuZS5zZXRUYXJnZXRBdFRpbWUodGhpcy5kZXR1bmUsdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLC4wMSksdGhpc31nZXREZXR1bmUoKXtyZXR1cm4gdGhpcy5kZXR1bmV9Z2V0RmlsdGVyKCl7cmV0dXJuIHRoaXMuZ2V0RmlsdGVycygpWzBdfXNldEZpbHRlcih0KXtyZXR1cm4gdGhpcy5zZXRGaWx0ZXJzKHQ/W3RdOltdKX1zZXRQbGF5YmFja1JhdGUodCl7aWYoITEhPT10aGlzLmhhc1BsYXliYWNrQ29udHJvbClyZXR1cm4gdGhpcy5wbGF5YmFja1JhdGU9dCwhMD09PXRoaXMuaXNQbGF5aW5nJiZ0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VGFyZ2V0QXRUaW1lKHRoaXMucGxheWJhY2tSYXRlLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXM7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKX1nZXRQbGF5YmFja1JhdGUoKXtyZXR1cm4gdGhpcy5wbGF5YmFja1JhdGV9b25FbmRlZCgpe3RoaXMuaXNQbGF5aW5nPSExfWdldExvb3AoKXtyZXR1cm4hMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sPyhjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpLCExKTp0aGlzLmxvb3B9c2V0TG9vcCh0KXtpZighMSE9PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKXJldHVybiB0aGlzLmxvb3A9dCwhMD09PXRoaXMuaXNQbGF5aW5nJiYodGhpcy5zb3VyY2UubG9vcD10aGlzLmxvb3ApLHRoaXM7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKX1zZXRMb29wU3RhcnQodCl7cmV0dXJuIHRoaXMubG9vcFN0YXJ0PXQsdGhpc31zZXRMb29wRW5kKHQpe3JldHVybiB0aGlzLmxvb3BFbmQ9dCx0aGlzfWdldFZvbHVtZSgpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZX1zZXRWb2x1bWUodCl7cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSh0LHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXN9fS5wcm90b3R5cGUubG9hZD1mdW5jdGlvbih0KXtjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiAubG9hZCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQXVkaW9Mb2FkZXIgaW5zdGVhZC4iKTtjb25zdCBlPXRoaXM7cmV0dXJuKG5ldyBZbXQpLmxvYWQodCwoZnVuY3Rpb24odCl7ZS5zZXRCdWZmZXIodCl9KSksdGhpc30sTXN0LnByb3RvdHlwZS51cGRhdGVDdWJlTWFwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQ3ViZUNhbWVyYTogLnVwZGF0ZUN1YmVNYXAoKSBpcyBub3cgLnVwZGF0ZSgpLiIpLHRoaXMudXBkYXRlKHQsZSl9LE1zdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24odCxlLG4sbyl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQ3ViZUNhbWVyYTogLmNsZWFyKCkgaXMgbm93IC5yZW5kZXJUYXJnZXQuY2xlYXIoKS4iKSx0aGlzLnJlbmRlclRhcmdldC5jbGVhcih0LGUsbixvKX0sZWF0LmNyb3NzT3JpZ2luPXZvaWQgMCxlYXQubG9hZFRleHR1cmU9ZnVuY3Rpb24odCxlLG4sbyl7Y29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRUZXh0dXJlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5UZXh0dXJlTG9hZGVyKCkgaW5zdGVhZC4iKTtjb25zdCBpPW5ldyBTbXQ7aS5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTtjb25zdCBhPWkubG9hZCh0LG4sdm9pZCAwLG8pO3JldHVybiBlJiYoYS5tYXBwaW5nPWUpLGF9LGVhdC5sb2FkVGV4dHVyZUN1YmU9ZnVuY3Rpb24odCxlLG4sbyl7Y29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRUZXh0dXJlQ3ViZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ3ViZVRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLiIpO2NvbnN0IGk9bmV3IGttdDtpLnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pO2NvbnN0IGE9aS5sb2FkKHQsbix2b2lkIDAsbyk7cmV0dXJuIGUmJihhLm1hcHBpbmc9ZSksYX0sZWF0LmxvYWRDb21wcmVzc2VkVGV4dHVyZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5ERFNMb2FkZXIgaW5zdGVhZC4iKX0sZWF0LmxvYWRDb21wcmVzc2VkVGV4dHVyZUN1YmU9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZUN1YmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkREU0xvYWRlciBpbnN0ZWFkLiIpfSwidW5kZWZpbmVkIiE9dHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyYmX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJyZWdpc3RlciIse2RldGFpbDp7cmV2aXNpb246IjEzMSJ9fSkpLCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYod2luZG93Ll9fVEhSRUVfXz9jb25zb2xlLndhcm4oIldBUk5JTkc6IE11bHRpcGxlIGluc3RhbmNlcyBvZiBUaHJlZS5qcyBiZWluZyBpbXBvcnRlZC4iKTp3aW5kb3cuX19USFJFRV9fPSIxMzEiKSwoZnVuY3Rpb24odCl7dFt0LkNJUkNMRT0wXT0iQ0lSQ0xFIix0W3QuTElORT0xXT0iTElORSIsdFt0LlRSSUFOR0xFPTJdPSJUUklBTkdMRSIsdFt0LlRSQVBFWk9JRD0zXT0iVFJBUEVaT0lEIn0pKHB1dHx8KHB1dD17fSkpO2NsYXNzIHl1dHtjb25zdHJ1Y3Rvcih0LGUsbixvKXt0aGlzLmNvb3JkaW5hdG9yPWUsdGhpcy5zY2VuZT1uZXcgeWR0LHRoaXMuYmFja2dyb3VuZENvbG9yPSIjZmZmIixpaXQoKSYmdCBpbnN0YW5jZW9mIE9mZnNjcmVlbkNhbnZhcyYmKHQuc3R5bGU9dC5zdHlsZXx8e30pLG8mJnQuYWRkRXZlbnRMaXN0ZW5lcigid2ViZ2xjb250ZXh0bG9zdCIsbyksdGhpcy5yZW5kZXJlcj1uZXcgYmR0KHtjYW52YXM6dCxjb250ZXh0OnQuZ2V0Q29udGV4dCgid2ViZ2wyIix7YW50aWFsaWFzOiEwLHByZWNpc2lvbjoiaGlnaHAiLGFscGhhOiEwfSl9KSx0aGlzLnJlbmRlcmVyLnNldFBpeGVsUmF0aW8obil9b25SZXNpemUodCl7dGhpcy5yZW5kZXJlci5zZXRTaXplKHQud2lkdGgsdC5oZWlnaHQpfWRlc3Ryb3lPYmplY3QodCl7Y29uc3QgZT10Lm9iajNkO2lmKHRoaXMuc2NlbmUucmVtb3ZlKGUpLGUgaW5zdGFuY2VvZiBwc3Qpe2UuZ2VvbWV0cnkuZGlzcG9zZSgpO2NvbnN0IHQ9QXJyYXkuaXNBcnJheShlLm1hdGVyaWFsKT9lLm1hdGVyaWFsOltlLm1hdGVyaWFsXTtmb3IoY29uc3QgZSBvZiB0KWUuZGlzcG9zZSgpfX1zZXRVc2VEYXJrTW9kZSh0KXt0aGlzLmJhY2tncm91bmRDb2xvcj10PyIjMzAzMDMwIjoiI2ZmZiJ9Y3JlYXRlT3JVcGRhdGVMaW5lT2JqZWN0KHQsZSxuKXt2YXIgbztpZighdCYmIW4udmlzaWJsZSlyZXR1cm4gbnVsbDtjb25zdHt2aXNpYmxlOmksd2lkdGg6YX09bjtpZighdCl7Y29uc3QgdD1kdXQodGhpcy5iYWNrZ3JvdW5kQ29sb3Isbi5jb2xvcixudWxsIT09KG89bi5vcGFjaXR5KSYmdm9pZCAwIT09bz9vOjEpLHI9bmV3IHFydCxzPW5ldyBxZHQoe2NvbG9yOnR9KSxsPW5ldyBwc3QocixzKTtyZXR1cm4gcy52aXNpYmxlPWksaHV0KHIsZSxhKSx0aGlzLnNjZW5lLmFkZChsKSx7dHlwZTpwdXQuTElORSxkYXRhOmUsb2JqM2Q6bCx3aWR0aDphfX1jb25zdHtkYXRhOnIsb2JqM2Q6cyx3aWR0aDpsfT10O3JldHVybiBidXQodGhpcy5iYWNrZ3JvdW5kQ29sb3IscywodD0+KGE9PT1sJiZyJiZhaXQocixlKXx8aHV0KHQsZSxhKSx0KSksbik/e3R5cGU6cHV0LkxJTkUsZGF0YTplLG9iajNkOnMsd2lkdGg6YX06dH1jcmVhdGVNZXNoKHQsZSl7aWYoIWUudmlzaWJsZSlyZXR1cm4gbnVsbDtjb25zdHt2aXNpYmxlOm4sY29sb3I6byxvcGFjaXR5Oml9PWUsYT1kdXQodGhpcy5iYWNrZ3JvdW5kQ29sb3IsbyxudWxsIT1pP2k6MSkscj1uZXcgQXJ0KHtjb2xvcjphLHZpc2libGU6bn0pO3JldHVybiBuZXcgcHN0KHQscil9Y3JlYXRlT3JVcGRhdGVUcmlhbmdsZU9iamVjdCh0LGUsbil7Y29uc3R7c2l6ZTpvfT1uLGk9bypNYXRoLnNxcnQoMykvMixhPW5ldyBGbG9hdDMyQXJyYXkoW2UueC1vLzIsZS55LWkvMyxlLngrby8yLGUueS1pLzMsZS54LGUueSsyKmkvM10pO2lmKCF0KXtjb25zdCB0PW5ldyBxcnQ7Z3V0KHQsYSk7Y29uc3Qgbz10aGlzLmNyZWF0ZU1lc2godCxuKTtyZXR1cm4gbnVsbD09PW8/bnVsbDoodGhpcy5zY2VuZS5hZGQobykse3R5cGU6cHV0LlRSSUFOR0xFLGRhdGE6ZSxvYmozZDpvfSl9cmV0dXJuIGJ1dCh0aGlzLmJhY2tncm91bmRDb2xvcix0Lm9iajNkLCh0PT4oZ3V0KHQsYSksdCkpLG4pP3t0eXBlOnB1dC5UUklBTkdMRSxkYXRhOmUsb2JqM2Q6dC5vYmozZH06dH1jcmVhdGVPclVwZGF0ZUNpcmNsZU9iamVjdCh0LGUsbil7Y29uc3R7cmFkaXVzOm99PW4saT1uZXcgY3B0KG4ucmFkaXVzKTtpZighdCl7Y29uc3QgdD10aGlzLmNyZWF0ZU1lc2goaSxuKTtyZXR1cm4gbnVsbD09PXQ/bnVsbDoodC5wb3NpdGlvbi5zZXQoZS54LGUueSwwKSx0aGlzLnNjZW5lLmFkZCh0KSx7dHlwZTpwdXQuQ0lSQ0xFLGRhdGE6e2xvYzplLHJhZGl1czpvfSxvYmozZDp0fSl9cmV0dXJuIGJ1dCh0aGlzLmJhY2tncm91bmRDb2xvcix0Lm9iajNkLCgoKT0+aSksbik/KHQub2JqM2QucG9zaXRpb24uc2V0KGUueCxlLnksMCkse3R5cGU6cHV0LkNJUkNMRSxkYXRhOntsb2M6ZSxyYWRpdXM6b30sb2JqM2Q6dC5vYmozZH0pOnR9Y3JlYXRlT3JVcGRhdGVUcmFwZXpvaWRPYmplY3QodCxlLG4sbyl7aWYoZS55IT09bi55KXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnB1dCBlcnJvcjogc3RhcnQueSAhPSBlbmQueS4iKTtjb25zdHthbHRpdHVkZTppfT1vLGE9Mi9NYXRoLnNxcnQoMykqaSxyPW5ldyBSbXQoW25ldyBRaXQoZS54LWEvMixlLnktaS8yKSxuZXcgUWl0KGUueCxlLnkraS8yKSxuZXcgUWl0KG4ueCxuLnkraS8yKSxuZXcgUWl0KG4ueCthLzIsbi55LWkvMildKTtyLmF1dG9DbG9zZT0hMDtjb25zdCBzPW5ldyBpbXQocik7aWYoIXQpe2NvbnN0IHQ9dGhpcy5jcmVhdGVNZXNoKHMsbyk7cmV0dXJuIG51bGw9PT10P251bGw6KHRoaXMuc2NlbmUuYWRkKHQpLHt0eXBlOnB1dC5UUkFQRVpPSUQsZGF0YTpbZSxuXSxvYmozZDp0fSl9cmV0dXJuIGJ1dCh0aGlzLmJhY2tncm91bmRDb2xvcix0Lm9iajNkLCgoKT0+cyksbyk/e3R5cGU6cHV0LlRSQVBFWk9JRCxkYXRhOltlLG5dLG9iajNkOnQub2JqM2R9OnR9Zmx1c2goKXt0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLHRoaXMuY29vcmRpbmF0b3IuZ2V0Q2FtZXJhKCkpfX1jbGFzcyBfdXR7Y29uc3RydWN0b3IodCxlKXt0aGlzLnJlbmRlckNhY2hlPXQsdGhpcy5yZW5kZXJlcj1lfXNldExpbmUodCxlLG4pe2NvbnN0IG89dGhpcy5yZW5kZXJlci5jcmVhdGVPclVwZGF0ZUxpbmVPYmplY3QodGhpcy5yZW5kZXJDYWNoZS5nZXRGcm9tUHJldmlvdXNGcmFtZSh0KSxlLG4pO28mJnRoaXMucmVuZGVyQ2FjaGUuc2V0VG9DdXJyZW50RnJhbWUodCxvKX1zZXRUcmlhbmdsZSh0LGUsbil7Y29uc3Qgbz10aGlzLnJlbmRlcmVyLmNyZWF0ZU9yVXBkYXRlVHJpYW5nbGVPYmplY3QodGhpcy5yZW5kZXJDYWNoZS5nZXRGcm9tUHJldmlvdXNGcmFtZSh0KSxlLG4pO28mJnRoaXMucmVuZGVyQ2FjaGUuc2V0VG9DdXJyZW50RnJhbWUodCxvKX1zZXRDaXJjbGUodCxlLG4pe2NvbnN0IG89dGhpcy5yZW5kZXJlci5jcmVhdGVPclVwZGF0ZUNpcmNsZU9iamVjdCh0aGlzLnJlbmRlckNhY2hlLmdldEZyb21QcmV2aW91c0ZyYW1lKHQpLGUsbik7byYmdGhpcy5yZW5kZXJDYWNoZS5zZXRUb0N1cnJlbnRGcmFtZSh0LG8pfXNldFRyYXBlem9pZCh0LGUsbixvKXtjb25zdCBpPXRoaXMucmVuZGVyZXIuY3JlYXRlT3JVcGRhdGVUcmFwZXpvaWRPYmplY3QodGhpcy5yZW5kZXJDYWNoZS5nZXRGcm9tUHJldmlvdXNGcmFtZSh0KSxlLG4sbyk7aSYmdGhpcy5yZW5kZXJDYWNoZS5zZXRUb0N1cnJlbnRGcmFtZSh0LGkpfX1jbGFzcyBDdXR7Y29uc3RydWN0b3IoKXt0aGlzLnByZXZGcmFtZUNhY2hlPW5ldyBNYXAsdGhpcy5jdXJyRnJhbWVDYWNoZT1uZXcgTWFwfWdldEZyb21QcmV2aW91c0ZyYW1lKHQpe2NvbnN0IGU9dGhpcy5wcmV2RnJhbWVDYWNoZS5nZXQodCk7cmV0dXJuIG51bGwhPWU/ZTpudWxsfXNldFRvQ3VycmVudEZyYW1lKHQsZSl7dGhpcy5jdXJyRnJhbWVDYWNoZS5zZXQodCxlKX1maW5hbGl6ZUZyYW1lQW5kR2V0UmVtb3ZlZCgpe2NvbnN0IHQ9W107Zm9yKGNvbnN0W2Usbl1vZiB0aGlzLnByZXZGcmFtZUNhY2hlLmVudHJpZXMoKSl0aGlzLmN1cnJGcmFtZUNhY2hlLmhhcyhlKXx8dC5wdXNoKG4pO3JldHVybiB0aGlzLnByZXZGcmFtZUNhY2hlPXRoaXMuY3VyckZyYW1lQ2FjaGUsdGhpcy5jdXJyRnJhbWVDYWNoZT1uZXcgTWFwLHR9fSEoZnVuY3Rpb24odCl7dFt0Lk5VTUJFUj0wXT0iTlVNQkVSIix0W3QuTkFOPTFdPSJOQU4ifSkobXV0fHwobXV0PXt9KSk7Y2xhc3MgTXV0IGV4dGVuZHMgY2xhc3N7Y29uc3RydWN0b3IodCl7dGhpcy5yYXdTZXJpZXNEYXRhPVtdLHRoaXMuc2VyaWVzPVtdLHRoaXMucGFpbnREaXJ0eT0hMCx0aGlzLnJlbmRlckNhY2hlPW5ldyBDdXQsdGhpcy5jb29yZGluYXRlSWRlbnRpZmllcj1udWxsLHRoaXMubGF5b3V0PXt4OjAsd2lkdGg6MSx5OjAsaGVpZ2h0OjF9LHRoaXMuZ2V0TWV0YWRhdGFNYXBJbXBsPXQuZ2V0TWV0YWRhdGFNYXAsdGhpcy5jb29yZGluYXRvcj10LmNvb3JkaW5hdG9yLHRoaXMucmVuZGVyZXI9dC5yZW5kZXJlcix0aGlzLnBhaW50QnJ1c2g9bmV3IF91dCh0aGlzLnJlbmRlckNhY2hlLHRoaXMucmVuZGVyZXIpfXNldExheW91dFJlY3QodCl7dGhpcy5sYXlvdXQueD09PXQueCYmdGhpcy5sYXlvdXQud2lkdGg9PT10LndpZHRoJiZ0aGlzLmxheW91dC55PT09dC55JiZ0aGlzLmxheW91dC5oZWlnaHQ9PT10LmhlaWdodHx8KHRoaXMucGFpbnREaXJ0eT0hMCksdGhpcy5sYXlvdXQ9dH1nZXRMYXlvdXRSZWN0KCl7cmV0dXJuIHRoaXMubGF5b3V0fWdldE1ldGFkYXRhTWFwKCl7cmV0dXJuIHRoaXMuZ2V0TWV0YWRhdGFNYXBJbXBsKCl9bWFya0FzUGFpbnREaXJ0eSgpe3RoaXMucGFpbnREaXJ0eT0hMH1yZW5kZXIoKXtpZih0aGlzLnRyYW5zZm9ybUNvb3JkaW5hdGVzSWZTdGFsZSgpLHRoaXMucGFpbnREaXJ0eSl7dGhpcy5yZWRyYXcoKTtmb3IoY29uc3QgdCBvZiB0aGlzLnJlbmRlckNhY2hlLmZpbmFsaXplRnJhbWVBbmRHZXRSZW1vdmVkKCkpdGhpcy5yZW5kZXJlci5kZXN0cm95T2JqZWN0KHQpO3RoaXMucGFpbnREaXJ0eT0hMX19aXNDb29yZGluYXRlVXBkYXRlZCgpe3JldHVybiB0aGlzLmNvb3JkaW5hdG9yLmdldFVwZGF0ZUlkZW50aWZpZXIoKSE9PXRoaXMuY29vcmRpbmF0ZUlkZW50aWZpZXJ9Y2xlYXJDb29yZGluYXRlSWRlbnRpZmllcigpe3RoaXMuY29vcmRpbmF0ZUlkZW50aWZpZXI9bnVsbH1zZXREYXRhKHQpe3RoaXMuY2xlYXJDb29yZGluYXRlSWRlbnRpZmllcigpLHRoaXMucmF3U2VyaWVzRGF0YT10fXRyYW5zZm9ybUNvb3JkaW5hdGVzSWZTdGFsZSgpe2lmKCF0aGlzLmlzQ29vcmRpbmF0ZVVwZGF0ZWQoKSlyZXR1cm47Y29uc3QgdD10aGlzLmdldExheW91dFJlY3QoKTt0aGlzLnNlcmllcz1uZXcgQXJyYXkodGhpcy5yYXdTZXJpZXNEYXRhLmxlbmd0aCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJhd1Nlcmllc0RhdGEubGVuZ3RoO2UrKyl7Y29uc3Qgbj10aGlzLnJhd1Nlcmllc0RhdGFbZV07dGhpcy5zZXJpZXNbZV09e2lkOm4uaWQscG9seWxpbmU6bmV3IEZsb2F0MzJBcnJheSgyKm4ucG9pbnRzLmxlbmd0aCl9O2ZvcihsZXQgbz0wO288bi5wb2ludHMubGVuZ3RoO28rKyl7Y29uc3RbaSxhXT10aGlzLmNvb3JkaW5hdG9yLnRyYW5zZm9ybURhdGFUb1VpQ29vcmQodCxbbi5wb2ludHNbb10ueCxuLnBvaW50c1tvXS55XSk7dGhpcy5zZXJpZXNbZV0ucG9seWxpbmVbMipvXT1pLHRoaXMuc2VyaWVzW2VdLnBvbHlsaW5lWzIqbysxXT1hfX10aGlzLmNvb3JkaW5hdGVJZGVudGlmaWVyPXRoaXMuY29vcmRpbmF0b3IuZ2V0VXBkYXRlSWRlbnRpZmllcigpLHRoaXMubWFya0FzUGFpbnREaXJ0eSgpfX17cmVjb3JkUGFydGl0aW9uKHQsZSxuKXtyZXR1cm4gdD97dHlwZTptdXQuTlVNQkVSLHBvbHlsaW5lOmV9Ont0eXBlOm11dC5OQU4scG9seWxpbmU6ZS5tYXAoKCh0LGUpPT5pc05hTih0KT9lJTI9PTA/bi54Om4ueTp0KSl9fXBhcnRpdGlvblBvbHlsaW5lKHQpe2NvbnN0IGU9W107bGV0IG49MCxvPSExO2NvbnN0IGk9dGhpcy5jb29yZGluYXRvci50cmFuc2Zvcm1EYXRhVG9VaUNvb3JkKHRoaXMuZ2V0TGF5b3V0UmVjdCgpLFswLDBdKSxhPXt4OmlbMF0seTppWzFdfTtsZXQgcj1udWxsO2ZvcihsZXQgaT0wO2k8dC5sZW5ndGg7aSs9Mil7Y29uc3QgYT10W2ldLHM9dFtpKzFdLGw9aXNOYU4oYSl8fGlzTmFOKHMpO2whPT1vJiZuIT09aSYmKGUucHVzaCh0aGlzLnJlY29yZFBhcnRpdGlvbighbyx0LnNsaWNlKG4saSksbnVsbD09PXI/e3g6YSx5OnN9OnIpKSxuPWkpLGx8fChyPXt4OmEseTpzfSksbz1sfXJldHVybiBuIT09dC5sZW5ndGgtMSYmZS5wdXNoKHRoaXMucmVjb3JkUGFydGl0aW9uKCFvLHQuc2xpY2Uobix0Lmxlbmd0aCksbnVsbCE9cj9yOmEpKSxlfXJlZHJhdygpe3ZhciB0LGUsbjtmb3IoY29uc3QgbyBvZiB0aGlzLnNlcmllcyl7Y29uc3QgaT10aGlzLmdldE1ldGFkYXRhTWFwKClbby5pZF07aWYoIWkpY29udGludWU7aWYoby5wb2x5bGluZS5sZW5ndGglMiE9MCl0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBoYXZlIG9kZCBsZW5ndGgtZWQgcG9seWxpbmU6ICR7by5wb2x5bGluZS5sZW5ndGh9YCk7Y29uc3QgYT10aGlzLnBhcnRpdGlvblBvbHlsaW5lKG8ucG9seWxpbmUpO2Zvcihjb25zdFtyLHt0eXBlOnMscG9seWxpbmU6bH1db2YgYS5lbnRyaWVzKCkpaWYocz09PW11dC5OVU1CRVIpMj09PWwubGVuZ3RoP3RoaXMucGFpbnRCcnVzaC5zZXRDaXJjbGUoSlNPTi5zdHJpbmdpZnkoWyJjaXJjbGUiLG8uaWQscl0pLHt4OmxbMF0seTpsWzFdfSx7Y29sb3I6aS5jb2xvcix2aXNpYmxlOmkudmlzaWJsZSxvcGFjaXR5Om51bGwhPT0odD1pLm9wYWNpdHkpJiZ2b2lkIDAhPT10P3Q6MSxyYWRpdXM6NH0pOnRoaXMucGFpbnRCcnVzaC5zZXRMaW5lKEpTT04uc3RyaW5naWZ5KFsibGluZSIsby5pZCxyXSksbCx7Y29sb3I6aS5jb2xvcix2aXNpYmxlOmkudmlzaWJsZSxvcGFjaXR5Om51bGwhPT0oZT1pLm9wYWNpdHkpJiZ2b2lkIDAhPT1lP2U6MSx3aWR0aDoyfSk7ZWxzZSBpZighaS5hdXgpZm9yKGxldCB0PTA7dDxsLmxlbmd0aDt0Kz0yKXRoaXMucGFpbnRCcnVzaC5zZXRUcmlhbmdsZShKU09OLnN0cmluZ2lmeShbIk5hTiIsby5pZCxsW3RdLGxbdCsxXV0pLHt4OmxbdF0seTpsW3QrMV19LHtjb2xvcjppLmNvbG9yLHZpc2libGU6aS52aXNpYmxlLG9wYWNpdHk6bnVsbCE9PShuPWkub3BhY2l0eSkmJnZvaWQgMCE9PW4/bjoxLHNpemU6MTJ9KX19fWNsYXNzIHZ1dCBleHRlbmRzIHJpdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jYW1lcmE9bmV3IFVzdCgwLDFlMywxZTMsMCwwLDEwMCl9aXNZQXhpc1BvaW50ZWREb3duKCl7cmV0dXJuITF9c2V0RG9tQ29udGFpbmVyUmVjdCh0KXtzdXBlci5zZXREb21Db250YWluZXJSZWN0KHQpLHRoaXMuY2FtZXJhLmxlZnQ9dC54LHRoaXMuY2FtZXJhLnJpZ2h0PXQueCt0LndpZHRoLHRoaXMuY2FtZXJhLnRvcD10LnkrdC5oZWlnaHQsdGhpcy5jYW1lcmEuYm90dG9tPXQueSx0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Z2V0Q2FtZXJhKCl7cmV0dXJuIHRoaXMuY2FtZXJhfX1jbGFzcyB4dXR7Y29uc3RydWN0b3IodCl7c3dpdGNoKHRoaXMubWV0YWRhdGFNYXA9e30sdGhpcy5zaG91bGRSZXBhaW50PSExLHRoaXMuY2FsbGJhY2tzPXQuY2FsbGJhY2tzLHQudHlwZSl7Y2FzZSBLMi5TVkc6dGhpcy5jb29yZGluYXRvcj1uZXcgcml0LHRoaXMucmVuZGVyZXI9bmV3IGxpdCh0LmNvbnRhaW5lcik7YnJlYWs7Y2FzZSBLMi5XRUJHTDp7Y29uc3QgZT1uZXcgdnV0O3RoaXMuY29vcmRpbmF0b3I9ZSx0aGlzLnJlbmRlcmVyPW5ldyB5dXQodC5jb250YWluZXIsZSx0LmRldmljZVBpeGVsUmF0aW8sdC5jYWxsYmFja3Mub25Db250ZXh0TG9zdCk7YnJlYWt9fXRoaXMucmVuZGVyZXIuc2V0VXNlRGFya01vZGUodC51c2VEYXJrTW9kZSksdGhpcy5zZXJpZXNMaW5lVmlldz1uZXcgTXV0KHtyZW5kZXJlcjp0aGlzLnJlbmRlcmVyLGNvb3JkaW5hdG9yOnRoaXMuY29vcmRpbmF0b3IsZ2V0TWV0YWRhdGFNYXA6KCk9PnRoaXMubWV0YWRhdGFNYXB9KSx0aGlzLnJlc2l6ZSh0LmRvbURpbWVuc2lvbil9ZGlzcG9zZSgpe31zZXRYU2NhbGVUeXBlKHQpe3RoaXMuY29vcmRpbmF0b3Iuc2V0WFNjYWxlKCRvdCh0KSksdGhpcy5zY2hlZHVsZVJlcGFpbnQoKX1zZXRZU2NhbGVUeXBlKHQpe3RoaXMuY29vcmRpbmF0b3Iuc2V0WVNjYWxlKCRvdCh0KSksdGhpcy5zY2hlZHVsZVJlcGFpbnQoKX1yZXNpemUodCl7dGhpcy5jb29yZGluYXRvci5zZXREb21Db250YWluZXJSZWN0KE9iamVjdC5hc3NpZ24oe3g6MCx5OjB9LHQpKSx0aGlzLnJlbmRlcmVyLm9uUmVzaXplKE9iamVjdC5hc3NpZ24oe3g6MCx5OjB9LHQpKSx0aGlzLnNlcmllc0xpbmVWaWV3LnNldExheW91dFJlY3QoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHt4OjAseTowfSkpLHRoaXMuc2NoZWR1bGVSZXBhaW50KCl9c2V0TWV0YWRhdGEodCl7bGV0IGU9ITE7T2JqZWN0LmVudHJpZXModCkuZm9yRWFjaCgoKFt0LG5dKT0+e2NvbnN0IG89dGhpcy5tZXRhZGF0YU1hcFt0XTtvJiZuLmNvbG9yPT09by5jb2xvciYmbi52aXNpYmxlPT09by52aXNpYmxlJiZuLm9wYWNpdHk9PT1vLm9wYWNpdHl8fChlPSEwKSx0aGlzLm1ldGFkYXRhTWFwW3RdPW59KSksZSYmdGhpcy5zZXJpZXNMaW5lVmlldy5tYXJrQXNQYWludERpcnR5KCksdGhpcy5zY2hlZHVsZVJlcGFpbnQoKX1zZXRWaWV3Qm94KHQpe3RoaXMuY29vcmRpbmF0b3Iuc2V0Vmlld0JveFJlY3Qoe3g6dC54WzBdLHdpZHRoOnQueFsxXS10LnhbMF0seTp0LnlbMF0saGVpZ2h0OnQueVsxXS10LnlbMF19KSx0aGlzLnNjaGVkdWxlUmVwYWludCgpfXNldERhdGEodCl7dGhpcy5zZXJpZXNMaW5lVmlldy5zZXREYXRhKHQpLHRoaXMuc2NoZWR1bGVSZXBhaW50KCl9c2V0VXNlRGFya01vZGUodCl7dGhpcy5yZW5kZXJlci5zZXRVc2VEYXJrTW9kZSh0KSx0aGlzLnNjaGVkdWxlUmVwYWludCgpfXNjaGVkdWxlUmVwYWludCgpe3RoaXMuc2hvdWxkUmVwYWludHx8KHRoaXMuc2hvdWxkUmVwYWludD0hMCxzZWxmLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKCk9Pnt0aGlzLnJlcGFpbnQoKSx0aGlzLnNob3VsZFJlcGFpbnQ9ITF9KSkpfXJlcGFpbnQoKXt0aGlzLnNlcmllc0xpbmVWaWV3LnJlbmRlcigpLHRoaXMucmVuZGVyZXIuZmx1c2goKSx0aGlzLmNhbGxiYWNrcy5vbkRyYXdFbmQoKX19ZnVuY3Rpb24gT3V0KHQpe2lmKHQuaW5jbHVkZXMoIi8iKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiV29ya2VyIGZhY3Rvcnkgb25seSBhbGxvd3MgZmlsZSBuYW1lIGFuZCBubyByZXNvdXJjZSBwYXRoLiIpO3JldHVybiBuZXcgV29ya2VyKHQpfSEoZnVuY3Rpb24odCl7dFt0LlNFUklFU19EQVRBX1VQREFURUQ9MF09IlNFUklFU19EQVRBX1VQREFURUQiLHRbdC5TRVJJRVNfTUVUQURBVEFfQ0hBTkdFRD0xXT0iU0VSSUVTX01FVEFEQVRBX0NIQU5HRUQiLHRbdC5TQ0FMRV9VUERBVEVEPTJdPSJTQ0FMRV9VUERBVEVEIix0W3QuVklFV19CT1hfVVBEQVRFRD0zXT0iVklFV19CT1hfVVBEQVRFRCIsdFt0LklOSVQ9NF09IklOSVQiLHRbdC5ET01fUkVTSVpFRD01XT0iRE9NX1JFU0laRUQiLHRbdC5EQVJLX01PREVfVVBEQVRFRD02XT0iREFSS19NT0RFX1VQREFURUQifSkodXV0fHwodXV0PXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5PTl9SRURSQVdfRU5EPTBdPSJPTl9SRURSQVdfRU5EIix0W3QuT05fQ09OVEVYVF9MT1NUPTFdPSJPTl9DT05URVhUX0xPU1QifSkoZnV0fHwoZnV0PXt9KSk7Y2xhc3MgUHV0e2NvbnN0cnVjdG9yKHQpe2lmKHRoaXMuY2FsbGJhY2tzPXQuY2FsbGJhY2tzLHQudHlwZSE9PUsyLldFQkdMKXRocm93IG5ldyBSYW5nZUVycm9yKGBDYW5ub3QgdXNlIG5vbiBXRUJHTCByZW5kZXJlciBmb3IgdGhlIG9mZnNjcmVlbiBsaW5lIGNoYXJ0LiBSZWNlaXZlZCAke0syW3QudHlwZV19IGApO2NvbnN0IGU9bmV3IE1lc3NhZ2VDaGFubmVsO2UucG9ydDEub25tZXNzYWdlPXQ9Pnt0aGlzLm9uTWVzc2FnZUZyb21Xb3JrZXIodC5kYXRhKX0sdGhpcy50eE1lc3NhZ2VQb3J0PWUucG9ydDE7Y29uc3Qgbj10LmNvbnRhaW5lci50cmFuc2ZlckNvbnRyb2xUb09mZnNjcmVlbigpO3RoaXMud29ya2VySW5zdGFuY2U9UHV0LndvcmtlclBvb2wuZ2V0TmV4dCgpO2NvbnN0IG89e3R5cGU6dXV0LklOSVQsY2FudmFzOm4sZGV2aWNlUGl4ZWxSYXRpbzp3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxkaW06dC5kb21EaW1lbnNpb24scmVuZGVyZXJUeXBlOnQudHlwZSx1c2VEYXJrTW9kZTp0LnVzZURhcmtNb2RlfTt0aGlzLndvcmtlckluc3RhbmNlLnBvc3RNZXNzYWdlKG8sW24sZS5wb3J0Ml0pfWRpc3Bvc2UoKXt0aGlzLndvcmtlckluc3RhbmNlLmZyZWUoKSx0aGlzLnR4TWVzc2FnZVBvcnQuY2xvc2UoKX1zZXRYU2NhbGVUeXBlKHQpe3RoaXMuc2VuZE1lc3NhZ2Uoe3R5cGU6dXV0LlNDQUxFX1VQREFURUQsYXhpczoieCIsc2NhbGVUeXBlOnR9KX1zZXRZU2NhbGVUeXBlKHQpe3RoaXMuc2VuZE1lc3NhZ2Uoe3R5cGU6dXV0LlNDQUxFX1VQREFURUQsYXhpczoieSIsc2NhbGVUeXBlOnR9KX1yZXNpemUodCl7dGhpcy5zZW5kTWVzc2FnZSh7dHlwZTp1dXQuRE9NX1JFU0laRUQsZGltOnR9KX1zZXRNZXRhZGF0YSh0KXt0aGlzLnNlbmRNZXNzYWdlKHt0eXBlOnV1dC5TRVJJRVNfTUVUQURBVEFfQ0hBTkdFRCxtZXRhZGF0YTp0fSl9c2V0Vmlld0JveCh0KXt0aGlzLnNlbmRNZXNzYWdlKHt0eXBlOnV1dC5WSUVXX0JPWF9VUERBVEVELGV4dGVudDp0fSl9c2V0RGF0YSh0KXtjb25zdCBlPShmdW5jdGlvbiBuKHQpe2NvbnN0IGU9dC5yZWR1Y2UoKCh0LGUpPT50K2UucG9pbnRzLmxlbmd0aCksMCk7bGV0IG49MDtjb25zdCBvPW5ldyBGbG9hdDY0QXJyYXkoMiplKSxpPVtdO2Zvcihjb25zdCBlIG9mIHQpe2kucHVzaCh7aWQ6ZS5pZCxsZW5ndGg6ZS5wb2ludHMubGVuZ3RofSk7Zm9yKGxldCB0PTA7dDxlLnBvaW50cy5sZW5ndGg7dCsrKW9bbisrXT1lLnBvaW50c1t0XS54LG9bbisrXT1lLnBvaW50c1t0XS55fXJldHVybntpZHNBbmRMZW5ndGhzOmksZmxhdHRlbmVkU2VyaWVzOm8uYnVmZmVyfX0pKHQpO3RoaXMuc2VuZE1lc3NhZ2Uoe3R5cGU6dXV0LlNFUklFU19EQVRBX1VQREFURUQsY29tcGFjdERhdGFTZXJpZXM6ZX0sW2UuZmxhdHRlbmVkU2VyaWVzXSl9c2V0VXNlRGFya01vZGUodCl7dGhpcy5zZW5kTWVzc2FnZSh7dHlwZTp1dXQuREFSS19NT0RFX1VQREFURUQsdXNlRGFya01vZGU6dH0pfXNlbmRNZXNzYWdlKHQsZSl7ZT90aGlzLnR4TWVzc2FnZVBvcnQucG9zdE1lc3NhZ2UodCxlKTp0aGlzLnR4TWVzc2FnZVBvcnQucG9zdE1lc3NhZ2UodCl9b25NZXNzYWdlRnJvbVdvcmtlcih0KXtzd2l0Y2godC50eXBlKXtjYXNlIGZ1dC5PTl9SRURSQVdfRU5EOnRoaXMuY2FsbGJhY2tzLm9uRHJhd0VuZCgpO2JyZWFrO2Nhc2UgZnV0Lk9OX0NPTlRFWFRfTE9TVDp0aGlzLmNhbGxiYWNrcy5vbkNvbnRleHRMb3N0KCl9fX1mdW5jdGlvbiB3dXQodCxlKXtyZXR1cm4ieCI9PT1lP1swLHQud2lkdGhdOlt0LmhlaWdodCwwXX1mdW5jdGlvbiBrdXQodCxlKXtjb25zdCBuPU1hdGguZmxvb3IodC81MCk7cmV0dXJuIE1hdGgubWluKG4sZSl9ZnVuY3Rpb24gU3V0KHQsZSl7aWYoMSZ0JiYocWkoKSxUbSgwLCJsaW5lIiwyKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oKTtwdSgiemVybyIsMD09PXQpLGpwKCJ4MSIsbi5nZXREb21YKHQpKSgieDIiLG4uZ2V0RG9tWCh0KSkoInkyIixuLmRvbURpbS5oZWlnaHQpfX1mdW5jdGlvbiBEdXQodCxlKXtpZigxJnQmJihxaSgpLFRtKDAsImxpbmUiLDMpKSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQsbj1ZbSgpO3B1KCJ6ZXJvIiwwPT09dCksanAoInkxIixuLmdldERvbVkodCkpKCJ4MiIsbi5kb21EaW0ud2lkdGgpKCJ5MiIsbi5nZXREb21ZKHQpKX19UHV0LndvcmtlclBvb2w9bmV3IGNsYXNze2NvbnN0cnVjdG9yKHQsZT0xMCxuPU91dCl7dGhpcy53b3JrZXJSZXNvdXJjZVBhdGg9dCx0aGlzLm1heFBvb2xTaXplPWUsdGhpcy53b3JrZXJGYWN0b3J5PW4sdGhpcy53b3JrZXJzPVtdfWdldE5leHQoKXtsZXQgdDtpZih0aGlzLndvcmtlcnMuZXZlcnkoKCh7YWN0aXZlQ291bnQ6dH0pPT50PjApKSYmdGhpcy53b3JrZXJzLmxlbmd0aDx0aGlzLm1heFBvb2xTaXplKXtjb25zdCBlPXRoaXMud29ya2VyRmFjdG9yeSh0aGlzLndvcmtlclJlc291cmNlUGF0aCk7dD17YWN0aXZlQ291bnQ6MCxwb3N0TWVzc2FnZToodCxuKT0+e2UucG9zdE1lc3NhZ2UodCxuKX0sZnJlZTooKT0+e3QuYWN0aXZlQ291bnQ9TWF0aC5tYXgodC5hY3RpdmVDb3VudC0xLDApfX0sdGhpcy53b3JrZXJzLnB1c2godCl9ZWxzZXtjb25zdCBlPXRoaXMud29ya2Vycy5tYXAoKCh7YWN0aXZlQ291bnQ6dH0pPT50KSksbj1lLmluZGV4T2YoTWF0aC5taW4oLi4uZSkpO3Q9dGhpcy53b3JrZXJzW25dfXJldHVybiB0LmFjdGl2ZUNvdW50KyssdH19KCJjaGFydF93b3JrZXIuanM/X2ZpbGVfaGFzaD0yNTMzODA2NSIpO2NsYXNzIEV1dHtnZXREb21YKHQpe3JldHVybiB0aGlzLnhTY2FsZS5mb3J3YXJkKHRoaXMudmlld0V4dGVudC54LHd1dCh0aGlzLmRvbURpbSwieCIpLHQpfWdldERvbVkodCl7cmV0dXJuIHRoaXMueVNjYWxlLmZvcndhcmQodGhpcy52aWV3RXh0ZW50Lnksd3V0KHRoaXMuZG9tRGltLCJ5IiksdCl9Z2V0WFRpY2tzKCl7cmV0dXJuIHRoaXMueFNjYWxlLnRpY2tzKHRoaXMudmlld0V4dGVudC54LGt1dCh0aGlzLmRvbURpbS53aWR0aCx0aGlzLnhHcmlkQ291bnQpKX1nZXRZVGlja3MoKXtyZXR1cm4gdGhpcy55U2NhbGUudGlja3ModGhpcy52aWV3RXh0ZW50Lnksa3V0KHRoaXMuZG9tRGltLmhlaWdodCx0aGlzLnlHcmlkQ291bnQpKX19ZnVuY3Rpb24gUnV0KHQsZSxuLG8saSxhKXtsZXQgcjtzd2l0Y2godC5kZWx0YU1vZGUpe2Nhc2UgV2hlZWxFdmVudC5ET01fREVMVEFfUElYRUw6cj0xO2JyZWFrO2Nhc2UgV2hlZWxFdmVudC5ET01fREVMVEFfTElORTpyPTg7YnJlYWs7Y2FzZSBXaGVlbEV2ZW50LkRPTV9ERUxUQV9QQUdFOnI9MjA7YnJlYWs7ZGVmYXVsdDpyPTEsY29uc29sZS53YXJuKGBVbmtub3duIFdoZWVsRXZlbnQgZGVsdGFNb2RlOiAke3QuZGVsdGFNb2RlfS5gKX1jb25zdCBzPXQuZGVsdGFZKnIsbD1zPDA/TWF0aC5tYXgocypvLC0uOTUpOnMqbyx7d2lkdGg6YyxoZWlnaHQ6ZH09bixwPVtpLnJldmVyc2UoZS54LFswLGNdLC10Lm9mZnNldFgqbCksaS5yZXZlcnNlKGUueCxbMCxjXSxjKyhjLXQub2Zmc2V0WCkqbCldLG09W2EucmV2ZXJzZShlLnksW2QsMF0sLXQub2Zmc2V0WSpsKSxhLnJldmVyc2UoZS55LFtkLDBdLGQrKGQtdC5vZmZzZXRZKSpsKV07cmV0dXJue3g6cFsxXTxwWzBdP1twWzFdLHBbMF1dOnAseTptWzFdPG1bMF0/W21bMV0sbVswXV06bX19RXV0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxFdXQpfSxFdXQuybVjbXA9dG8oe3R5cGU6RXV0LHNlbGVjdG9yczpbWyJsaW5lLWNoYXJ0LWdyaWQtdmlldyJdXSxpbnB1dHM6e3ZpZXdFeHRlbnQ6InZpZXdFeHRlbnQiLHhTY2FsZToieFNjYWxlIix4R3JpZENvdW50OiJ4R3JpZENvdW50Iix5U2NhbGU6InlTY2FsZSIseUdyaWRDb3VudDoieUdyaWRDb3VudCIsZG9tRGltOiJkb21EaW0ifSxkZWNsczozLHZhcnM6Mixjb25zdHM6W1sieTEiLCIwIiwzLCJ6ZXJvIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbIngxIiwiMCIsMywiemVybyIsNCwibmdGb3IiLCJuZ0Zvck9mIl0sWyJ5MSIsIjAiXSxbIngxIiwiMCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYocWkoKSxSbSgwLCJzdmciKSxRcCgxLFN1dCwxLDUsImxpbmUiLDApLFFwKDIsRHV0LDEsNSwibGluZSIsMSksQW0oKSksMiZlJiYocmMoMSksRG0oIm5nRm9yT2YiLG4uZ2V0WFRpY2tzKCkpLHJjKDEpLERtKCJuZ0Zvck9mIixuLmdldFlUaWNrcygpKSl9LGRpcmVjdGl2ZXM6W2xNXSxzdHlsZXM6WyJbX25naG9zdC0lQ09NUCVdIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIH1cblxuICAgICAgc3ZnW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB9XG5cbiAgICAgIGxpbmVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgc3Ryb2tlOiAjY2NjO1xuICAgICAgICBzdHJva2Utd2lkdGg6IDFweDtcbiAgICAgIH1cblxuICAgICAgLnplcm9bX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgc3Ryb2tlOiAjYWFhO1xuICAgICAgICBzdHJva2Utd2lkdGg6IDEuNXB4O1xuICAgICAgfSJdLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChFdXQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibGluZS1jaGFydC1ncmlkLXZpZXciLHRlbXBsYXRlOic8c3ZnPlxuICAgIDxsaW5lXG4gICAgICAqbmdGb3I9ImxldCB0aWNrIG9mIGdldFhUaWNrcygpIlxuICAgICAgW2NsYXNzLnplcm9dPSJ0aWNrID09PSAwIlxuICAgICAgW2F0dHIueDFdPSJnZXREb21YKHRpY2spIlxuICAgICAgeTE9IjAiXG4gICAgICBbYXR0ci54Ml09ImdldERvbVgodGljaykiXG4gICAgICBbYXR0ci55Ml09ImRvbURpbS5oZWlnaHQiXG4gICAgPjwvbGluZT5cbiAgICA8bGluZVxuICAgICAgKm5nRm9yPSJsZXQgdGljayBvZiBnZXRZVGlja3MoKSJcbiAgICAgIFtjbGFzcy56ZXJvXT0idGljayA9PT0gMCJcbiAgICAgIHgxPSIwIlxuICAgICAgW2F0dHIueTFdPSJnZXREb21ZKHRpY2spIlxuICAgICAgW2F0dHIueDJdPSJkb21EaW0ud2lkdGgiXG4gICAgICBbYXR0ci55Ml09ImdldERvbVkodGljaykiXG4gICAgPjwvbGluZT5cbiAgPC9zdmc+JyxzdHlsZXM6WyJcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIH1cblxuICAgICAgc3ZnIHtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH1cblxuICAgICAgbGluZSB7XG4gICAgICAgIHN0cm9rZTogI2NjYztcbiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxcHg7XG4gICAgICB9XG5cbiAgICAgIC56ZXJvIHtcbiAgICAgICAgc3Ryb2tlOiAjYWFhO1xuICAgICAgICBzdHJva2Utd2lkdGg6IDEuNXB4O1xuICAgICAgfVxuICAgICJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse3ZpZXdFeHRlbnQ6W3t0eXBlOnh5fV0seFNjYWxlOlt7dHlwZTp4eX1dLHhHcmlkQ291bnQ6W3t0eXBlOnh5fV0seVNjYWxlOlt7dHlwZTp4eX1dLHlHcmlkQ291bnQ6W3t0eXBlOnh5fV0sZG9tRGltOlt7dHlwZTp4eX1dfSk7Y29uc3QgQXV0PVsiZG90cyJdO2Z1bmN0aW9uIFR1dCh0LGUpe2lmKDEmdCYmKHFpKCksVG0oMCwiY2lyY2xlIiwxMikpLDImdCl7Y29uc3QgdD1ZbSgpLiRpbXBsaWNpdCxlPVltKDIpO2pwKCJjeCIsZS5nZXREb21YKHQucG9pbnQueCkpKCJjeSIsZS5nZXREb21ZKHQucG9pbnQueSkpKCJmaWxsIix0Lm1ldGFkYXRhLmNvbG9yKX19ZnVuY3Rpb24gTnV0KHQsZSl7aWYoMSZ0JiYocWkoKSxObSgwKSxRcCgxLFR1dCwxLDMsImNpcmNsZSIsMTEpLHptKCkpLDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdCxuPVltKDIpO3JjKDEpLERtKCJuZ0lmIixuLnNob3VsZFJlbmRlclRvb2x0aXBQb2ludCh0LnBvaW50KSl9fWZ1bmN0aW9uIHp1dCh0LGUpe2lmKDEmdCYmKHFpKCksTm0oMCksUXAoMSxOdXQsMiwxLCJuZy1jb250YWluZXIiLDEwKSx6bSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtyYygxKSxEbSgibmdGb3JPZiIsdC5jdXJzb3JlZERhdGEpKCJuZ0ZvclRyYWNrQnkiLHQudHJhY2tCeVNlcmllc05hbWUpfX1mdW5jdGlvbiBJdXQodCxlKXtpZigxJnQmJihxaSgpLFRtKDAsInJlY3QiLDEzKSksMiZ0KXtjb25zdCB0PVltKCk7anAoIngiLHQuem9vbUJveEluVWlDb29yZGluYXRlLngpKCJ3aWR0aCIsdC56b29tQm94SW5VaUNvb3JkaW5hdGUud2lkdGgpKCJ5Iix0Lnpvb21Cb3hJblVpQ29vcmRpbmF0ZS55KSgiaGVpZ2h0Iix0Lnpvb21Cb3hJblVpQ29vcmRpbmF0ZS5oZWlnaHQpfX1jb25zdCBIdXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm57ZGF0YTp0LGN1cnNvckxvY2F0aW9uSW5EYXRhQ29vcmQ6ZX19O2Z1bmN0aW9uIEZ1dCh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsMTQpLEltKDEsMTUpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpLGU9JHAoMTEpO3JjKDEpLERtKCJuZ1RlbXBsYXRlT3V0bGV0Iix0LnRvb2x0aXBUZW1wbGF0ZT90LnRvb2x0aXBUZW1wbGF0ZTplKSgibmdUZW1wbGF0ZU91dGxldENvbnRleHQiLHZoKDIsSHV0LHQuY3Vyc29yZWREYXRhLHQuY3Vyc29yTG9jYXRpb25JbkRhdGFDb29yZCkpfX1mdW5jdGlvbiBMdXQodCxlKXtpZigxJnQmJihObSgwKSxSbSgxLCJ0ciIsMTcpLFJtKDIsInRkIiwxOCksVG0oMywic3BhbiIpLEFtKCksUm0oNCwidGQiLDE5KSxrdSg1KSxBbSgpLFJtKDYsInRkIiksa3UoNyksQW0oKSxSbSg4LCJ0ZCIpLGt1KDkpLEFtKCksQW0oKSx6bSgpKSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQ7cmMoMyksZHUoImJhY2tncm91bmQtY29sb3IiLHQubWV0YWRhdGEuY29sb3IpLHJjKDIpLFN1KHQubWV0YWRhdGEuZGlzcGxheU5hbWUpLHJjKDIpLFN1KHQucG9pbnQueSkscmMoMiksU3UodC5wb2ludC54KX19ZnVuY3Rpb24gQnV0KHQsZSl7aWYoMSZ0JiYoUm0oMCwidGFibGUiKSxSbSgxLCJ0aGVhZCIpLFJtKDIsInRyIiksVG0oMywidGgiLDE2KSxSbSg0LCJ0aCIpLGt1KDUsIk5hbWUiKSxBbSgpLFJtKDYsInRoIiksa3UoNywiWSIpLEFtKCksUm0oOCwidGgiKSxrdSg5LCJYIiksQW0oKSxBbSgpLEFtKCksUm0oMTAsInRib2R5IiksUXAoMTEsTHV0LDEwLDUsIm5nLWNvbnRhaW5lciIsMTApLEFtKCksQW0oKSksMiZ0KXtjb25zdCB0PWUuZGF0YSxuPVltKCk7cmMoMTEpLERtKCJuZ0Zvck9mIix0KSgibmdGb3JUcmFja0J5IixuLnRyYWNrQnlTZXJpZXNOYW1lKX19dmFyIFZ1dDtmdW5jdGlvbiBqdXQodCl7cmV0dXJuIHQuc2Nyb2xsU3RyYXRlZ2llcy5yZXBvc2l0aW9uKCl9IShmdW5jdGlvbih0KXt0W3QuTk9ORT0wXT0iTk9ORSIsdFt0LkRSQUdfWk9PTUlORz0xXT0iRFJBR19aT09NSU5HIix0W3QuU0NST0xMX1pPT01JTkc9Ml09IlNDUk9MTF9aT09NSU5HIix0W3QuUEFOTklORz0zXT0iUEFOTklORyJ9KShWdXR8fChWdXQ9e30pKTtjbGFzcyBVdXR7Y29uc3RydWN0b3IodCxlKXt0aGlzLmNoYW5nZURldGVjdG9yPXQsdGhpcy5zY3JvbGxTdHJhdGVneT1lLHRoaXMub25WaWV3RXh0ZW50Q2hhbmdlPW5ldyBMaCx0aGlzLm9uVmlld0V4dGVudFJlc2V0PW5ldyBMaCx0aGlzLkludGVyYWN0aW9uU3RhdGU9VnV0LHRoaXMuc3RhdGU9VnV0Lk5PTkUsdGhpcy5zcGVjaWFsS2V5UHJlc3NlZD0hMSx0aGlzLnpvb21Cb3hJblVpQ29vcmRpbmF0ZT17eDowLHdpZHRoOjAsaGVpZ2h0OjAseTowfSx0aGlzLnRvb2x0aXBQb3NpdGlvbnM9W3tvZmZzZXRZOjUsb3JpZ2luWDoic3RhcnQiLG92ZXJsYXlYOiJzdGFydCIsb3JpZ2luWToiYm90dG9tIixvdmVybGF5WToidG9wIn0se29mZnNldFk6NSxvcmlnaW5YOiJlbmQiLG92ZXJsYXlYOiJlbmQiLG9yaWdpblk6ImJvdHRvbSIsb3ZlcmxheVk6InRvcCJ9LHtvZmZzZXRZOi0xNSxvcmlnaW5YOiJzdGFydCIsb3ZlcmxheVg6InN0YXJ0IixvcmlnaW5ZOiJ0b3AiLG92ZXJsYXlZOiJib3R0b20ifSx7b2Zmc2V0WTotMTUsb3JpZ2luWDoiZW5kIixvdmVybGF5WDoiZW5kIixvcmlnaW5ZOiJ0b3AiLG92ZXJsYXlZOiJib3R0b20ifSx7b2Zmc2V0WDo1LG9yaWdpblg6ImVuZCIsb3ZlcmxheVg6InN0YXJ0IixvcmlnaW5ZOiJ0b3AiLG92ZXJsYXlZOiJ0b3AifSx7b2Zmc2V0WDotNSxvcmlnaW5YOiJzdGFydCIsb3ZlcmxheVg6ImVuZCIsb3JpZ2luWToidG9wIixvdmVybGF5WToidG9wIn1dLHRoaXMuY3Vyc29yTG9jYXRpb25JbkRhdGFDb29yZD1udWxsLHRoaXMuY3Vyc29yZWREYXRhPVtdLHRoaXMudG9vbHRpcERpc3BsYXlBdHRhY2hlZD0hMSx0aGlzLnNob3dab29tSW5zdHJ1Y3Rpb249ITEsdGhpcy5kcmFnU3RhcnRDb29yZD1udWxsLHRoaXMuaXNDdXJzb3JJbnNpZGU9ITEsdGhpcy5uZ1Vuc3Vic2NyaWJlPW5ldyBJfW5nQWZ0ZXJWaWV3SW5pdCgpe29lKHRoaXMuZG90c0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LCJkYmxjbGljayIse3Bhc3NpdmU6ITB9KS5waXBlKEllKHRoaXMubmdVbnN1YnNjcmliZSkpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLm9uVmlld0V4dGVudFJlc2V0LmVtaXQoKSx0aGlzLnN0YXRlPVZ1dC5OT05FLHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCl9KSksb2Uod2luZG93LCJrZXlkb3duIix7cGFzc2l2ZTohMH0pLnBpcGUoSWUodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKCh0PT57Y29uc3QgZT10aGlzLnNob3VsZFBhbih0KTtlIT09dGhpcy5zcGVjaWFsS2V5UHJlc3NlZCYmKHRoaXMuc3BlY2lhbEtleVByZXNzZWQ9ZSx0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpKX0pKSxvZSh3aW5kb3csImtleXVwIix7cGFzc2l2ZTohMH0pLnBpcGUoSWUodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKCh0PT57Y29uc3QgZT10aGlzLnNob3VsZFBhbih0KTtlIT09dGhpcy5zcGVjaWFsS2V5UHJlc3NlZCYmKHRoaXMuc3BlY2lhbEtleVByZXNzZWQ9ZSx0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpKX0pKSxvZSh0aGlzLmRvdHNDb250YWluZXIubmF0aXZlRWxlbWVudCwibW91c2Vkb3duIix7cGFzc2l2ZTohMH0pLnBpcGUoSWUodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKCh0PT57Y29uc3QgZT10aGlzLnN0YXRlLG49dGhpcy5zaG91bGRQYW4odCk/VnV0LlBBTk5JTkc6VnV0LkRSQUdfWk9PTUlORztlPT09VnV0Lk5PTkUmJm49PT1WdXQuRFJBR19aT09NSU5HJiYodGhpcy5kcmFnU3RhcnRDb29yZD17eDp0Lm9mZnNldFgseTp0Lm9mZnNldFl9LHRoaXMuem9vbUJveEluVWlDb29yZGluYXRlPXt4OnQub2Zmc2V0WCx3aWR0aDowLHk6dC5vZmZzZXRZLGhlaWdodDowfSksZSE9PW4mJih0aGlzLnN0YXRlPW4sdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKSl9KSksb2UodGhpcy5kb3RzQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsIm1vdXNldXAiLHtwYXNzaXZlOiEwfSkucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpKS5zdWJzY3JpYmUoKHQ9Pntjb25zdCBlPSh0LmJ1dHRvbnMmZ1EuTEVGVCk9PT1nUS5MRUZUO3RoaXMuZHJhZ1N0YXJ0Q29vcmQ9bnVsbDtjb25zdCBuPXRoaXMuem9vbUJveEluVWlDb29yZGluYXRlO2lmKCFlJiZ0aGlzLnN0YXRlPT09VnV0LkRSQUdfWk9PTUlORyYmbi53aWR0aD4wJiZuLmhlaWdodD4wKXtjb25zdCB0PXRoaXMuZ2V0RGF0YVgobi54KSxlPXRoaXMuZ2V0RGF0YVgobi54K24ud2lkdGgpLG89dGhpcy5nZXREYXRhWShuLnkrbi5oZWlnaHQpLGk9dGhpcy5nZXREYXRhWShuLnkpO3RoaXMub25WaWV3RXh0ZW50Q2hhbmdlLmVtaXQoe2RhdGFFeHRlbnQ6e3g6W3QsZV0seTpbbyxpXX19KX10aGlzLnN0YXRlIT09VnV0Lk5PTkUmJih0aGlzLnN0YXRlPVZ1dC5OT05FLHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCkpfSkpLG9lKHRoaXMuZG90c0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LCJtb3VzZWVudGVyIix7cGFzc2l2ZTohMH0pLnBpcGUoSWUodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKCh0PT57dGhpcy5pc0N1cnNvckluc2lkZT0hMCx0aGlzLnVwZGF0ZVRvb2x0aXAodCksdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKX0pKSxvZSh0aGlzLmRvdHNDb250YWluZXIubmF0aXZlRWxlbWVudCwibW91c2VsZWF2ZSIse3Bhc3NpdmU6ITB9KS5waXBlKEllKHRoaXMubmdVbnN1YnNjcmliZSkpLnN1YnNjcmliZSgodD0+e3RoaXMuZHJhZ1N0YXJ0Q29vcmQ9bnVsbCx0aGlzLmlzQ3Vyc29ySW5zaWRlPSExLHRoaXMudXBkYXRlVG9vbHRpcCh0KSx0aGlzLnN0YXRlPVZ1dC5OT05FLHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCl9KSksb2UodGhpcy5kb3RzQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsIm1vdXNlbW92ZSIse3Bhc3NpdmU6ITB9KS5waXBlKEllKHRoaXMubmdVbnN1YnNjcmliZSkpLnN1YnNjcmliZSgodD0+e3N3aXRjaCh0aGlzLnN0YXRlKXtjYXNlIFZ1dC5TQ1JPTExfWk9PTUlORzp0aGlzLnN0YXRlPVZ1dC5OT05FLHRoaXMudXBkYXRlVG9vbHRpcCh0KSx0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO2JyZWFrO2Nhc2UgVnV0Lk5PTkU6dGhpcy51cGRhdGVUb29sdGlwKHQpLHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7YnJlYWs7Y2FzZSBWdXQuUEFOTklORzp7Y29uc3QgZT0tdC5tb3ZlbWVudFgsbj0tdC5tb3ZlbWVudFkse3dpZHRoOm8saGVpZ2h0Oml9PXRoaXMuZG9tRGltLGE9dGhpcy5nZXREYXRhWChlKSxyPXRoaXMuZ2V0RGF0YVgobytlKSxzPXRoaXMuZ2V0RGF0YVkoaStuKSxsPXRoaXMuZ2V0RGF0YVkobik7dGhpcy5vblZpZXdFeHRlbnRDaGFuZ2UuZW1pdCh7ZGF0YUV4dGVudDp7eDpbYSxyXSx5OltzLGxdfX0pO2JyZWFrfWNhc2UgVnV0LkRSQUdfWk9PTUlORzp7aWYoIXRoaXMuZHJhZ1N0YXJ0Q29vcmQpYnJlYWs7Y29uc3QgZT1bdGhpcy5kcmFnU3RhcnRDb29yZC54LHQub2Zmc2V0WF0sbj1bdGhpcy5kcmFnU3RhcnRDb29yZC55LHQub2Zmc2V0WV07dGhpcy56b29tQm94SW5VaUNvb3JkaW5hdGU9e3g6TWF0aC5taW4oLi4uZSksd2lkdGg6TWF0aC5tYXgoLi4uZSktTWF0aC5taW4oLi4uZSkseTpNYXRoLm1pbiguLi5uKSxoZWlnaHQ6TWF0aC5tYXgoLi4ubiktTWF0aC5taW4oLi4ubil9fXRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCl9fSkpLG9lKHRoaXMuZG90c0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LCJ3aGVlbCIse3Bhc3NpdmU6ITF9KS5waXBlKEllKHRoaXMubmdVbnN1YnNjcmliZSksemUoKHQ9Pntjb25zdCBlPSF0LmN0cmxLZXkmJiF0LnNoaWZ0S2V5JiZ0LmFsdEtleTtyZXR1cm4gdGhpcy5zaG93Wm9vbUluc3RydWN0aW9uPSFlLHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCksZT8odC5wcmV2ZW50RGVmYXVsdCgpLEV0KHQpKTphZSgzZTMpLnBpcGUoRmUoKCgpPT57dGhpcy5zaG93Wm9vbUluc3RydWN0aW9uPSExLHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCl9KSksSXQoKCgpPT5udWxsKSkpfSkpLGNlKCh0PT5Cb29sZWFuKHQpKSkpLnN1YnNjcmliZSgodD0+e3RoaXMub25WaWV3RXh0ZW50Q2hhbmdlLmVtaXQoe2RhdGFFeHRlbnQ6UnV0KHQsdGhpcy52aWV3RXh0ZW50LHRoaXMuZG9tRGltLC4wMSx0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSl9KSx0aGlzLnN0YXRlIT09VnV0LlNDUk9MTF9aT09NSU5HJiYodGhpcy5zdGF0ZT1WdXQuU0NST0xMX1pPT01JTkcsdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKSl9KSl9bmdPbkNoYW5nZXMoKXt0aGlzLnVwZGF0ZUN1cnNvcmVkRGF0YUFuZFRvb2x0aXBWaXNpYmlsaXR5KCl9bmdPbkRlc3Ryb3koKXt0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpLHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpfXNob3VsZFBhbih0KXtjb25zdCBlPXQuc2hpZnRLZXl8fHQuYWx0S2V5O2lmKHQgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50KXJldHVybiBlO2NvbnN0IG49KHQuYnV0dG9ucyZnUS5MRUZUKT09PWdRLkxFRlQsbz0odC5idXR0b25zJmdRLk1JRERMRSk9PT1nUS5NSURETEU7cmV0dXJuISghbiYmIW8pJiYobyYmIW58fGUpfXRyYWNrQnlTZXJpZXNOYW1lKHQsZSl7cmV0dXJuIGUuaWR9Z2V0RG9tWCh0KXtyZXR1cm4gdGhpcy54U2NhbGUuZm9yd2FyZCh0aGlzLnZpZXdFeHRlbnQueCx3dXQodGhpcy5kb21EaW0sIngiKSx0KX1nZXREYXRhWCh0KXtyZXR1cm4gdGhpcy54U2NhbGUucmV2ZXJzZSh0aGlzLnZpZXdFeHRlbnQueCx3dXQodGhpcy5kb21EaW0sIngiKSx0KX1nZXREb21ZKHQpe3JldHVybiB0aGlzLnlTY2FsZS5mb3J3YXJkKHRoaXMudmlld0V4dGVudC55LHd1dCh0aGlzLmRvbURpbSwieSIpLHQpfWdldERhdGFZKHQpe3JldHVybiB0aGlzLnlTY2FsZS5yZXZlcnNlKHRoaXMudmlld0V4dGVudC55LHd1dCh0aGlzLmRvbURpbSwieSIpLHQpfXNob3VsZFJlbmRlclRvb2x0aXBQb2ludCh0KXtyZXR1cm4gbnVsbCE9PXQmJiFpc05hTih0LngpJiYhaXNOYU4odC55KX11cGRhdGVUb29sdGlwKHQpe3RoaXMuY3Vyc29yTG9jYXRpb25JbkRhdGFDb29yZD17eDp0aGlzLmdldERhdGFYKHQub2Zmc2V0WCkseTp0aGlzLmdldERhdGFZKHQub2Zmc2V0WSl9LHRoaXMudXBkYXRlQ3Vyc29yZWREYXRhQW5kVG9vbHRpcFZpc2liaWxpdHkoKX1vblRvb2x0aXBEaXNwbGF5RGV0YWNoZWQoKXt0aGlzLnRvb2x0aXBEaXNwbGF5QXR0YWNoZWQ9ITF9dXBkYXRlQ3Vyc29yZWREYXRhQW5kVG9vbHRpcFZpc2liaWxpdHkoKXtjb25zdCB0PXRoaXMuY3Vyc29yTG9jYXRpb25JbkRhdGFDb29yZDtpZihudWxsPT09dClyZXR1cm4gdGhpcy5jdXJzb3JlZERhdGE9W10sdm9pZCh0aGlzLnRvb2x0aXBEaXNwbGF5QXR0YWNoZWQ9ITEpO3RoaXMuY3Vyc29yZWREYXRhPXRoaXMuaXNDdXJzb3JJbnNpZGU/dGhpcy5zZXJpZXNEYXRhLm1hcCgodD0+KHtzZXJpZXNEYXR1bTp0LG1ldGFkYXRhOnRoaXMuc2VyaWVzTWV0YWRhdGFNYXBbdC5pZF19KSkpLmZpbHRlcigoKHttZXRhZGF0YTp0fSk9PnQmJnQudmlzaWJsZSYmIUJvb2xlYW4odC5hdXgpKSkubWFwKCgoe3Nlcmllc0RhdHVtOmUsbWV0YWRhdGE6bn0pPT57Y29uc3Qgbz0oZnVuY3Rpb24gaSh0LGUpe2NvbnN0IG49TWF0aC5taW4ocDUodC5tYXAoKCh7eDp0fSk9PnQpKSxlKSx0Lmxlbmd0aC0xKSxvPU1hdGgubWF4KDAsbi0xKTtyZXR1cm4gTWF0aC5hYnModFtvXS54LWUpLU1hdGguYWJzKHRbbl0ueC1lKTw9MD9vOm59KShlLnBvaW50cyx0LngpO3JldHVybntpZDplLmlkLGNsb3Nlc3RQb2ludEluZGV4Om8scG9pbnQ6ZS5wb2ludHNbb10sbWV0YWRhdGE6bn19KSkuZmlsdGVyKCh0PT50KSk6W10sdGhpcy50b29sdGlwRGlzcGxheUF0dGFjaGVkPUJvb2xlYW4odGhpcy5jdXJzb3JlZERhdGEubGVuZ3RoKX19ZnVuY3Rpb24gR3V0KHQsZSxuLG8pe3JldHVybnttYWpvcjpbXSxtaW5vcjp0LnRpY2tzKG8sbikubWFwKCh0PT4oe3ZhbHVlOnQsdGlja0Zvcm1hdHRlZFN0cmluZzplLmZvcm1hdFRpY2sodCl9KSkpfX1VdXQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFV1dCkoU20oVWcpLFNtKExGKSl9LFV1dC7JtWNtcD10byh7dHlwZTpVdXQsc2VsZWN0b3JzOltbImxpbmUtY2hhcnQtaW50ZXJhY3RpdmUtdmlldyJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmKFFoKEF1dCw3LGhnKSxRaChnTCw1KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5kb3RzQ29udGFpbmVyPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLm92ZXJsYXk9dC5maXJzdCl9fSxob3N0VmFyczoyLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZwdSgic2hvdy16b29tLWluc3RydWN0aW9uIixuLnNob3dab29tSW5zdHJ1Y3Rpb24pfSxpbnB1dHM6e3Nlcmllc0RhdGE6InNlcmllc0RhdGEiLHNlcmllc01ldGFkYXRhTWFwOiJzZXJpZXNNZXRhZGF0YU1hcCIsdmlld0V4dGVudDoidmlld0V4dGVudCIseFNjYWxlOiJ4U2NhbGUiLHlTY2FsZToieVNjYWxlIixkb21EaW06ImRvbURpbSIsdG9vbHRpcE9yaWdpbkVsOiJ0b29sdGlwT3JpZ2luRWwiLHRvb2x0aXBUZW1wbGF0ZToidG9vbHRpcFRlbXBsYXRlIn0sb3V0cHV0czp7b25WaWV3RXh0ZW50Q2hhbmdlOiJvblZpZXdFeHRlbnRDaGFuZ2UiLG9uVmlld0V4dGVudFJlc2V0OiJvblZpZXdFeHRlbnRSZXNldCJ9LGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6TEYsdXNlRmFjdG9yeTpqdXQsZGVwczpbcExdfV0pLEJvXSxkZWNsczoxMix2YXJzOjE1LGNvbnN0czpbWzEsImRvdHMiXSxbImRvdHMiLCIiXSxbNCwibmdJZiJdLFsiY2xhc3MiLCJ6b29tLWJveCIsNCwibmdJZiJdLFsxLCJ6b29tLWluc3RydWN0aW9uIl0sWzEsImluc3RydWN0aW9uLWNvbnRlbnQiXSxbImNka092ZXJsYXlPcmlnaW4iLCIiLDEsInRvb2x0aXAtb3JpZ2luIl0sWyJ0b29sdGlwT3JpZ2luIiwiY2RrT3ZlcmxheU9yaWdpbiJdLFsiY2RrQ29ubmVjdGVkT3ZlcmxheSIsIiIsMywiY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbiIsImNka0Nvbm5lY3RlZE92ZXJsYXlPcGVuIiwiY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9ucyIsImNka0Nvbm5lY3RlZE92ZXJsYXlTY3JvbGxTdHJhdGVneSIsImNka0Nvbm5lY3RlZE92ZXJsYXlMb2NrUG9zaXRpb24iLCJjZGtDb25uZWN0ZWRPdmVybGF5RmxleGlibGVEaW1lbnNpb25zIiwiY2RrQ29ubmVjdGVkT3ZlcmxheUdyb3dBZnRlck9wZW4iLCJkZXRhY2giXSxbImRlZmF1bHRUb29sdGlwIiwiIl0sWzQsIm5nRm9yIiwibmdGb3JPZiIsIm5nRm9yVHJhY2tCeSJdLFsiciIsIjQiLDQsIm5nSWYiXSxbInIiLCI0Il0sWzEsInpvb20tYm94Il0sWzEsInRvb2x0aXAtY29udGFpbmVyIl0sWzMsIm5nVGVtcGxhdGVPdXRsZXQiLCJuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dCJdLFsxLCJjaXJjbGUtaGVhZGVyIl0sWzEsInRvb2x0aXAtcm93Il0sWzEsInRvb2x0aXAtcm93LWNpcmNsZSJdLFsxLCJuYW1lIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihxaSgpLFJtKDAsInN2ZyIsMCwxKSxRcCgyLHp1dCwyLDIsIm5nLWNvbnRhaW5lciIsMiksUXAoMyxJdXQsMSw0LCJyZWN0IiwzKSxBbSgpLFppKCksUm0oNCwiZGl2Iiw0KSxSbSg1LCJzcGFuIiw1KSxrdSg2LCJBbHQgKyBTY3JvbGwgdG8gWm9vbSIpLEFtKCksQW0oKSxUbSg3LCJkaXYiLDYsNyksUXAoOSxGdXQsMiw1LCJuZy10ZW1wbGF0ZSIsOCksVm0oImRldGFjaCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblRvb2x0aXBEaXNwbGF5RGV0YWNoZWQoKX0pKSxRcCgxMCxCdXQsMTIsMiwibmctdGVtcGxhdGUiLG51bGwsOSxpYikpLDImZSYmKHB1KCJwYW5uYWJsZSIsbi5zcGVjaWFsS2V5UHJlc3NlZCkoImRyYWdnYWJsZSIsbi5zdGF0ZT09PW4uSW50ZXJhY3Rpb25TdGF0ZS5OT05FfHxuLnN0YXRlPT09bi5JbnRlcmFjdGlvblN0YXRlLkRSQUdfWk9PTUlORykoInBhbm5pbmciLG4uc3RhdGU9PT1uLkludGVyYWN0aW9uU3RhdGUuUEFOTklORykscmMoMiksRG0oIm5nSWYiLG4uc3RhdGU9PT1uLkludGVyYWN0aW9uU3RhdGUuTk9ORSkscmMoMSksRG0oIm5nSWYiLG4uc3RhdGU9PT1uLkludGVyYWN0aW9uU3RhdGUuRFJBR19aT09NSU5HKSxyYyg2KSxEbSgiY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbiIsbi50b29sdGlwT3JpZ2luRWwpKCJjZGtDb25uZWN0ZWRPdmVybGF5T3BlbiIsbi50b29sdGlwRGlzcGxheUF0dGFjaGVkJiZuLnN0YXRlPT09bi5JbnRlcmFjdGlvblN0YXRlLk5PTkUpKCJjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25zIixuLnRvb2x0aXBQb3NpdGlvbnMpKCJjZGtDb25uZWN0ZWRPdmVybGF5U2Nyb2xsU3RyYXRlZ3kiLG4uc2Nyb2xsU3RyYXRlZ3kpKCJjZGtDb25uZWN0ZWRPdmVybGF5TG9ja1Bvc2l0aW9uIiwhMSkoImNka0Nvbm5lY3RlZE92ZXJsYXlGbGV4aWJsZURpbWVuc2lvbnMiLCEwKSgiY2RrQ29ubmVjdGVkT3ZlcmxheUdyb3dBZnRlck9wZW4iLCEwKSl9LGRpcmVjdGl2ZXM6W2RNLGZMLGdMLGxNLE1NXSxzdHlsZXM6WyJbX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjpyZWxhdGl2ZTt1c2VyLXNlbGVjdDpub25lfS5kb3RzW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5kb3RzLmRyYWdnYWJsZVtfbmdjb250ZW50LSVDT01QJV17Y3Vyc29yOmNyb3NzaGFpcn0uZG90cy5wYW5uYWJsZVtfbmdjb250ZW50LSVDT01QJV17Y3Vyc29yOmdyYWJ9LmRvdHMucGFubmluZ1tfbmdjb250ZW50LSVDT01QJV17Y3Vyc29yOmdyYWJiaW5nfS50b29sdGlwLXJvdy1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmlubGluZS1mbGV4O2hlaWdodDoxMnB4O3dpZHRoOjEycHh9LnRvb2x0aXAtcm93LWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0gPiBzcGFuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmFkaXVzOjUwJTtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsLjYpO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDoxMHB4O3dpZHRoOjEwcHh9LnRvb2x0aXAtb3JpZ2luW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MDtsZWZ0OjA7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MH0udG9vbHRpcC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuODUpO2JvcmRlci1yYWRpdXM6NHB4O2NvbG9yOiNmZmY7Y29udGFpbjpwYWludCBzdHlsZSBsYXlvdXQ7Zm9udC1zaXplOi45ZW07b3ZlcmZsb3c6YXV0bztwYWRkaW5nOjVweDtwb2ludGVyLWV2ZW50czpub25lO3dpZHRoOjEwMCV9dGhbX25nY29udGVudC0lQ09NUCVdLCB0ZFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggNXB4O3RleHQtYWxpZ246bGVmdH10aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NTAwO3BhZGRpbmctYm90dG9tOjVweH0uem9vbS1ib3hbX25nY29udGVudC0lQ09NUCVde2ZpbGwtb3BhY2l0eTouMDM7ZmlsbDojMDAwO3N0cm9rZTojY2NjfS56b29tLWluc3RydWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7bGVmdDowO29wYWNpdHk6MDtwb2ludGVyLWV2ZW50czpub25lO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7dG9wOjEwcHg7dHJhbnNpdGlvbjpvcGFjaXR5IC41czt6LWluZGV4OjF9Lmluc3RydWN0aW9uLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuNik7Ym9yZGVyLXJhZGl1czo1cHg7Y29sb3I6I2ZmZjtwYWRkaW5nOjVweCAxMHB4O3VzZXItc2VsZWN0Om5vbmV9LnNob3ctem9vbS1pbnN0cnVjdGlvbltfbmdob3N0LSVDT01QJV0gICAuem9vbS1pbnN0cnVjdGlvbltfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfSJdLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChVdXQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibGluZS1jaGFydC1pbnRlcmFjdGl2ZS12aWV3Iix0ZW1wbGF0ZVVybDoiLi9saW5lX2NoYXJ0X2ludGVyYWN0aXZlX3ZpZXcubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9saW5lX2NoYXJ0X2ludGVyYWN0aXZlX3ZpZXcuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaCxwcm92aWRlcnM6W3twcm92aWRlOkxGLHVzZUZhY3Rvcnk6anV0LGRlcHM6W3BMXX1dfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6VWd9LHt0eXBlOkxGfV19KSx7ZG90c0NvbnRhaW5lcjpbe3R5cGU6WmEsYXJnczpbImRvdHMiLHtzdGF0aWM6ITAscmVhZDpoZ31dfV0sb3ZlcmxheTpbe3R5cGU6WmEsYXJnczpbZ0xdfV0sc2VyaWVzRGF0YTpbe3R5cGU6eHl9XSxzZXJpZXNNZXRhZGF0YU1hcDpbe3R5cGU6eHl9XSx2aWV3RXh0ZW50Olt7dHlwZTp4eX1dLHhTY2FsZTpbe3R5cGU6eHl9XSx5U2NhbGU6W3t0eXBlOnh5fV0sZG9tRGltOlt7dHlwZTp4eX1dLHRvb2x0aXBPcmlnaW5FbDpbe3R5cGU6eHl9XSx0b29sdGlwVGVtcGxhdGU6W3t0eXBlOnh5fV0sb25WaWV3RXh0ZW50Q2hhbmdlOlt7dHlwZTpPeX1dLG9uVmlld0V4dGVudFJlc2V0Olt7dHlwZTpPeX1dLHNob3dab29tSW5zdHJ1Y3Rpb246W3t0eXBlOlB5LGFyZ3M6WyJjbGFzcy5zaG93LXpvb20taW5zdHJ1Y3Rpb24iXX1dfSk7Y29uc3QgV3V0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHQoIjJkIik7ZnVuY3Rpb24gWXV0KHQsZSl7aWYoMSZ0JiYocWkoKSxSbSgwLCJnIiwxNyksUm0oMSwidGV4dCIpLGt1KDIpLEFtKCksUm0oMywidGl0bGUiKSxrdSg0KSxBbSgpLEFtKCkpLDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdCxuPVltKCk7cmMoMSksZHUoImZvbnQiLG4uYXhpc0ZvbnQpLGpwKCJ4IixuLnRleHRYUG9zaXRpb24odC52YWx1ZSkpKCJ5IixuLnRleHRZUG9zaXRpb24odC52YWx1ZSkpLHJjKDEpLER1KCIgIix0LnRpY2tGb3JtYXR0ZWRTdHJpbmcsIiAiKSxyYygyKSxTdShuLmdldEZvcm1hdHRlcigpLmZvcm1hdExvbmcodC52YWx1ZSkpfX1mdW5jdGlvbiBxdXQodCxlKXtpZigxJnQmJihSbSgwLCJzcGFuIiwyMCksUm0oMSwic3BhbiIpLGt1KDIpLEFtKCksQW0oKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49ZS5pbmRleCxvPWUubGFzdCxpPVltKDIpO2R1KCJsZWZ0IixpLmdldE1ham9yWFBvc2l0aW9uKHQpLCJweCIpKCJ3aWR0aCIsaS5nZXRNYWpvcldpZHRoU3RyaW5nKHQsbyxpLm1ham9yVGlja3NbbisxXSkpKCJib3R0b20iLGkuZ2V0TWFqb3JZUG9zaXRpb24odCksInB4IikoImhlaWdodCIsaS5nZXRNYWpvckhlaWdodFN0cmluZyh0LG8saS5tYWpvclRpY2tzW24rMV0pKSgiZm9udCIsaS5heGlzRm9udCkscHUoIm1ham9yLWxhYmVsIiwhMCkoImxhc3QiLG8pLERtKCJ0aXRsZSIsaS5nZXRGb3JtYXR0ZXIoKS5mb3JtYXRMb25nKHQuc3RhcnQpKSxyYygyKSxTdSh0LnRpY2tGb3JtYXR0ZWRTdHJpbmcpfX1mdW5jdGlvbiBadXQodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDE4KSxRcCgxLHF1dCwzLDE2LCJzcGFuIiwxOSksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoMSksRG0oIm5nRm9yT2YiLHQubWFqb3JUaWNrcykoIm5nRm9yVHJhY2tCeSIsdC50cmFja0J5TWFqb3JUaWNrKX19Y2xhc3MgWHV0e2NvbnN0cnVjdG9yKCl7dGhpcy5vblZpZXdFeHRlbnRDaGFuZ2U9bmV3IExoLHRoaXMuZWRpdE1lbnVPcGVuZWQ9ITEsdGhpcy5tYWpvclRpY2tzPVtdLHRoaXMubWlub3JUaWNrcz1bXX1uZ09uQ2hhbmdlcygpe2xldCB0PW51bGw7Y29uc3QgZT1rdXQoIngiPT09dGhpcy5heGlzP3RoaXMuZG9tRGltLndpZHRoOnRoaXMuZG9tRGltLmhlaWdodCx0aGlzLmdyaWRDb3VudCk7dD10aGlzLnNjYWxlIGluc3RhbmNlb2YgdGl0PyhmdW5jdGlvbiBuKHQsZSxvLGkpe2NvbnN0W2Escl09aSxzPU1hdGguYWJzKHItYSk7aWYocz4uMDAxKXJldHVybiBHdXQodCxlLG8saSk7Y29uc3QgbD10LnRpY2tzKFthLHJdLG8pLGM9dC50aWNrcyhbYSxyXSwyKSxkPVtdO2xldCBwPShmdW5jdGlvbiBtKHQpe2NvbnN0IGU9dC50b0V4cG9uZW50aWFsKCkuc3BsaXQoImUtIiwyKTtyZXR1cm4gMj09PWUubGVuZ3RoP051bWJlcihlWzFdKS0xOjB9KShzKTtzPDEmJmMuZXZlcnkoKHQ9Pntjb25zdCBlPU1hdGguYWJzKHQpO3JldHVybiBlPj0wJiZlPDF9KSkmJihwKz0xKTtjb25zdCB1PW5ldyBNYXA7Zm9yKGNvbnN0IHQgb2YgYyl7Y29uc3RbbixvPSIiXT1TdHJpbmcodCkuc3BsaXQoIi4iLDIpLGk9TnVtYmVyKG4rIi4iK28uc2xpY2UoMCxwKSk7dS5zZXQoaSx7c3RhcnQ6aSx0aWNrRm9ybWF0dGVkU3RyaW5nOjA9PT1pPyLigJQiOmUuZm9ybWF0UmVhZGFibGUoaSl9KX1jb25zdCBmPTEwKk1hdGgucG93KDEwLC1wKTtmb3IoY29uc3QgdCBvZiBsKWZvcihjb25zdCBuIG9mWy4uLnUua2V5cygpXS5yZXZlcnNlKCkpe2NvbnN0IG89dC1uO2lmKG8+PTAmJm88Zil7aWYoMD09PW4pZC5wdXNoKHt2YWx1ZTp0LHRpY2tGb3JtYXR0ZWRTdHJpbmc6ZS5mb3JtYXRUaWNrKHQpfSk7ZWxzZXtjb25zdCBlPVN0cmluZyh0KS5zbGljZShTdHJpbmcobikubGVuZ3RoKTtkLnB1c2goe3ZhbHVlOnQsdGlja0Zvcm1hdHRlZFN0cmluZzpg4oCmJHtlfHwiMCJ9YH0pfWJyZWFrfX1yZXR1cm57bWFqb3I6QXJyYXkuZnJvbSh1LnZhbHVlcygpKSxtaW5vcjpkfX0pKHRoaXMuc2NhbGUsdGhpcy5nZXRGb3JtYXR0ZXIoKSxlLHRoaXMuYXhpc0V4dGVudCk6dGhpcy5zY2FsZSBpbnN0YW5jZW9mIG5pdD8oZnVuY3Rpb24gbyh0LGUsbixpKXtjb25zdFthLHJdPWk7bGV0IHM9dC50aWNrcyhpLDIpO2lmKHItYT49ODY0ZTV8fHMubGVuZ3RoPjIpcmV0dXJuIEd1dCh0LGUsbixpKTtjb25zdCBsPXQudGlja3MoaSxuKTtyZXR1cm57bWFqb3I6cy5tYXAoKHQ9Pih7c3RhcnQ6dCx0aWNrRm9ybWF0dGVkU3RyaW5nOmUuZm9ybWF0U2hvcnQodCl9KSkpLG1pbm9yOmwubWFwKCh0PT4oe3ZhbHVlOnQsdGlja0Zvcm1hdHRlZFN0cmluZzplLmZvcm1hdFRpY2sodCl9KSkpfX0pKHRoaXMuc2NhbGUsdGhpcy5nZXRGb3JtYXR0ZXIoKSxlLHRoaXMuYXhpc0V4dGVudCk6R3V0KHRoaXMuc2NhbGUsdGhpcy5nZXRGb3JtYXR0ZXIoKSxlLHRoaXMuYXhpc0V4dGVudCksdGhpcy5tYWpvclRpY2tzPXQubWFqb3IsdGhpcy5taW5vclRpY2tzPShmdW5jdGlvbiBpKHQsZSxuLG8sYT01KXtpZighdC5sZW5ndGh8fCFXdXQpcmV0dXJuIHQ7Y29uc3Qgcj0ieCI9PT1uPzE6LTE7bGV0IHM9bnVsbDtyZXR1cm4gdC5maWx0ZXIoKHQ9Pntjb25zdCBpPWUodCk7V3V0LmZvbnQ9bztjb25zdCBsPVd1dC5tZWFzdXJlVGV4dCh0LnRpY2tGb3JtYXR0ZWRTdHJpbmcpLGM9IngiPT09bj9sLndpZHRoOmwuYWN0dWFsQm91bmRpbmdCb3hBc2NlbnQtbC5hY3R1YWxCb3VuZGluZ0JveERlc2NlbnQ7cmV0dXJuIG51bGw9PT1zPyEoaStyKmM8MHx8KHM9aStyKmMsMCkpOiEocioocytyKmEtaSk+MHx8KHM9aStyKmMsMCkpfSkpfSkodC5taW5vciwodD0+dGhpcy5nZXREb21Qb3ModC52YWx1ZSkpLHRoaXMuYXhpcywiMTFweCBSb2JvdG8sIHNhbnMtc2VyaWYiKX1nZXRGb3JtYXR0ZXIoKXt2YXIgdDtyZXR1cm4gbnVsbCE9PSh0PXRoaXMuY3VzdG9tRm9ybWF0dGVyKSYmdm9pZCAwIT09dD90OnRoaXMuc2NhbGUuZGVmYXVsdEZvcm1hdHRlcn10cmFja0J5TWlub3JUaWNrKHQpe3JldHVybiB0LnZhbHVlfXRyYWNrQnlNYWpvclRpY2sodCl7cmV0dXJuIHQuc3RhcnR9Z2V0RG9tUG9zKHQpe3JldHVybiB0aGlzLnNjYWxlLmZvcndhcmQodGhpcy5heGlzRXh0ZW50LHd1dCh0aGlzLmRvbURpbSx0aGlzLmF4aXMpLHQpfXRleHRYUG9zaXRpb24odCl7cmV0dXJuIngiPT09dGhpcy5heGlzP1N0cmluZyh0aGlzLmdldERvbVBvcyh0KSk6IjEwMCUifXRleHRZUG9zaXRpb24odCl7cmV0dXJuIngiPT09dGhpcy5heGlzPyIiOlN0cmluZyh0aGlzLmdldERvbVBvcyh0KSl9Z2V0TWFqb3JYUG9zaXRpb24odCl7cmV0dXJuInkiPT09dGhpcy5heGlzPzA6TWF0aC5taW4odGhpcy5kb21EaW0ud2lkdGgsTWF0aC5tYXgoMCx0aGlzLmdldERvbVBvcyh0LnN0YXJ0KSkpfWdldE1ham9yV2lkdGhTdHJpbmcodCxlLG4pe3JldHVybiJ5Ij09PXRoaXMuYXhpcz8iIjooZXx8IW4/dGhpcy5kb21EaW0ud2lkdGg6dGhpcy5nZXRNYWpvclhQb3NpdGlvbihuKSktdGhpcy5nZXRNYWpvclhQb3NpdGlvbih0KSsicHgifWdldE1ham9yWVBvc2l0aW9uKHQpe3JldHVybiJ4Ij09PXRoaXMuYXhpcz8wOnRoaXMuZG9tRGltLmhlaWdodC1NYXRoLm1pbih0aGlzLmRvbURpbS5oZWlnaHQsTWF0aC5tYXgoMCx0aGlzLmdldERvbVBvcyh0LnN0YXJ0KSkpfWdldE1ham9ySGVpZ2h0U3RyaW5nKHQsZSxuKXtyZXR1cm4ieCI9PT10aGlzLmF4aXM/IiI6KGV8fCFuP3RoaXMuZG9tRGltLmhlaWdodDp0aGlzLmdldE1ham9yWVBvc2l0aW9uKG4pKS10aGlzLmdldE1ham9yWVBvc2l0aW9uKHQpKyJweCJ9a2V5ZG93blByZXZlbnRDbG9zZSh0KXsiRXNjYXBlIiE9PXQua2V5JiZ0LnN0b3BQcm9wYWdhdGlvbigpfWV4dGVudENoYW5nZWQodCxlKXtsZXQgbj1OdW1iZXIodCksbz1OdW1iZXIoZSk7aWYobzxuKXtjb25zdCB0PW47bj1vLG89dH1OdW1iZXIuaXNGaW5pdGUobikmJk51bWJlci5pc0Zpbml0ZShvKSYmdGhpcy5vblZpZXdFeHRlbnRDaGFuZ2UuZW1pdChbbixvXSl9b25BeGlzVXBkYXRlTWVudU9wZW4odCxlLG4pe3QudmFsdWU9U3RyaW5nKG5bMF0pLGUudmFsdWU9U3RyaW5nKG5bMV0pLHQuZm9jdXMoKX1zZXRFZGl0TWVudU9wZW5lZCh0KXt0aGlzLmVkaXRNZW51T3BlbmVkPXR9fVh1dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WHV0KX0sWHV0Lsm1Y21wPXRvKHt0eXBlOlh1dCxzZWxlY3RvcnM6W1sibGluZS1jaGFydC1heGlzIl1dLGlucHV0czp7YXhpc0V4dGVudDoiYXhpc0V4dGVudCIsYXhpczoiYXhpcyIsc2NhbGU6InNjYWxlIixncmlkQ291bnQ6ImdyaWRDb3VudCIsZG9tRGltOiJkb21EaW0iLGN1c3RvbUZvcm1hdHRlcjoiY3VzdG9tRm9ybWF0dGVyIn0sb3V0cHV0czp7b25WaWV3RXh0ZW50Q2hhbmdlOiJvblZpZXdFeHRlbnRDaGFuZ2UifSxmZWF0dXJlczpbQm9dLGRlY2xzOjI2LHZhcnM6MTMsY29uc3RzOltbMSwibGluZSJdLFsxLCJtaW5vciJdLFsxLCJ0aWNrcyJdLFsiY2xhc3MiLCJtaW5vci10aWNrLWxhYmVsIiw0LCJuZ0ZvciIsIm5nRm9yT2YiLCJuZ0ZvclRyYWNrQnkiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsInRpdGxlIiwiQ2xpY2sgdG8gbWFudWFsbHkgc2V0IG1pbiAmIG1heCB2YWx1ZXMiLDMsIm1hdE1lbnVUcmlnZ2VyRm9yIiwibWVudU9wZW5lZCIsIm1lbnVDbG9zZWQiXSxbIm1hdE1lbnVUcmlnZ2VyIiwibWF0TWVudVRyaWdnZXIiXSxbInN2Z0ljb24iLCJlZGl0XzI0cHgiXSxbImNsYXNzIiwibWFqb3IgdGlja3MiLDQsIm5nSWYiXSxbInhQb3NpdGlvbiIsImJlZm9yZSIsMywieVBvc2l0aW9uIl0sWyJtYW51YWxDb250cm9sIiwibWF0TWVudSJdLFsxLCJleHRlbnQtZWRpdC1pbnB1dCIsMywiY2xpY2siLCJrZXlkb3duIl0sWyJ0eXBlIiwibnVtYmVyIiwzLCJ2YWx1ZSJdLFsibWluSW5wdXQiLCIiXSxbIm1heElucHV0IiwiIl0sWzEsImV4dGVudC1lZGl0LWNvbnRyb2wiLDMsImtleWRvd24iXSxbIm1hdC1yYWlzZWQtYnV0dG9uIiwiIiwiY29sb3IiLCJwcmltYXJ5IiwxLCJleHRlbnQtZWRpdC1jaGFuZ2UiLDMsImNsaWNrIl0sWyJtYXQtc3Ryb2tlZC1idXR0b24iLCIiLDEsImV4dGVudC1lZGl0LWNhbmNlbCIsMywiY2xpY2siXSxbMSwibWlub3ItdGljay1sYWJlbCJdLFsxLCJtYWpvciIsInRpY2tzIl0sWzMsIm1ham9yLWxhYmVsIiwibGFzdCIsImxlZnQiLCJ3aWR0aCIsImJvdHRvbSIsImhlaWdodCIsImZvbnQiLCJ0aXRsZSIsNCwibmdGb3IiLCJuZ0Zvck9mIiwibmdGb3JUcmFja0J5Il0sWzMsInRpdGxlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiKSxUbSgxLCJkaXYiLDApLFJtKDIsImRpdiIsMSkscWkoKSxSbSgzLCJzdmciLDIpLFFwKDQsWXV0LDUsNiwiZyIsMyksQW0oKSxaaSgpLFJtKDUsImJ1dHRvbiIsNCw1KSxWbSgibWVudU9wZW5lZCIsKGZ1bmN0aW9uIGUoKXtoaSh0KTtjb25zdCBvPSRwKDE1KSxpPSRwKDIwKTtyZXR1cm4gbi5vbkF4aXNVcGRhdGVNZW51T3BlbihvLGksbi5heGlzRXh0ZW50KSxuLnNldEVkaXRNZW51T3BlbmVkKCEwKX0pKSgibWVudUNsb3NlZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5zZXRFZGl0TWVudU9wZW5lZCghMSl9KSksVG0oNywibWF0LWljb24iLDYpLEFtKCksQW0oKSxRcCg4LFp1dCwyLDIsImRpdiIsNyksQW0oKSxSbSg5LCJtYXQtbWVudSIsOCw5KSxSbSgxMSwiZGl2IiwxMCksVm0oImNsaWNrIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gZS5zdG9wUHJvcGFnYXRpb24oKX0pKSgia2V5ZG93biIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ua2V5ZG93blByZXZlbnRDbG9zZShlKX0pKSxSbSgxMiwibGFiZWwiKSxrdSgxMywibWluIiksQW0oKSxUbSgxNCwiaW5wdXQiLDExLDEyKSxBbSgpLFJtKDE2LCJkaXYiLDEwKSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KGUpe3JldHVybiBlLnN0b3BQcm9wYWdhdGlvbigpfSkpKCJrZXlkb3duIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5rZXlkb3duUHJldmVudENsb3NlKGUpfSkpLFJtKDE3LCJsYWJlbCIpLGt1KDE4LCJtYXgiKSxBbSgpLFRtKDE5LCJpbnB1dCIsMTEsMTMpLEFtKCksUm0oMjEsImRpdiIsMTQpLFZtKCJrZXlkb3duIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5rZXlkb3duUHJldmVudENsb3NlKGUpfSkpLFJtKDIyLCJidXR0b24iLDE1KSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7aGkodCk7Y29uc3Qgbz0kcCgxNSksaT0kcCgyMCksYT0kcCg2KTtyZXR1cm4gbi5leHRlbnRDaGFuZ2VkKG8udmFsdWUsaS52YWx1ZSksYS5jbG9zZU1lbnUoKX0pKSxrdSgyMywiIENoYW5nZSAiKSxBbSgpLFJtKDI0LCJidXR0b24iLDE2KSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLCRwKDYpLmNsb3NlTWVudSgpfSkpLGt1KDI1LCIgQ2FuY2VsICIpLEFtKCksQW0oKSxBbSgpfWlmKDImZSl7Y29uc3QgdD0kcCgxMCk7ZnUobi5heGlzKyItYXhpcyBheGlzIikscmMoNCksRG0oIm5nRm9yT2YiLG4ubWlub3JUaWNrcykoIm5nRm9yVHJhY2tCeSIsbi50cmFja0J5TWlub3JUaWNrKSxyYygxKSxwdSgiZXh0ZW50LWVkaXQtYnV0dG9uIiwhMCkoImV4dGVudC1lZGl0LW1lbnUtb3BlbmVkIixuLmVkaXRNZW51T3BlbmVkKSxEbSgibWF0TWVudVRyaWdnZXJGb3IiLHQpLHJjKDMpLERtKCJuZ0lmIixuLm1ham9yVGlja3MubGVuZ3RoKSxyYygxKSxEbSgieVBvc2l0aW9uIiwieSI9PT1uLmF4aXM/ImFib3ZlIjoiYmVsb3ciKSxyYyg1KSxEbSgidmFsdWUiLG4uYXhpc0V4dGVudFswXSkscmMoNSksRG0oInZhbHVlIixuLmF4aXNFeHRlbnRbMV0pfX0sZGlyZWN0aXZlczpbbE0sWEgsZVksRFcsZE0sS1ddLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV17Y29udGFpbjpzdHJpY3Q7ZGlzcGxheTpmbGV4O292ZXJmbG93OmhpZGRlbn0ubWFqb3ItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCB0ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOmN1cnJlbnRDb2xvcjtmb250LXNpemU6MTFweDt1c2VyLXNlbGVjdDpub25lfS5heGlzW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0ubWFqb3JbX25nY29udGVudC0lQ09NUCVdLCAubWlub3JbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MSAwO292ZXJmbG93OmhpZGRlbn0ubGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYWFhO2ZsZXg6MCAwIDFweDtqdXN0aWZ5LWNvbnRlbnQ6c3RyZXRjaH0udGlja3NbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlO3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjEwMCV9LngtYXhpc1tfbmdjb250ZW50LSVDT01QJV17ZmxleC1kaXJlY3Rpb246Y29sdW1ufS54LWF4aXNbX25nY29udGVudC0lQ09NUCVdICAgLmxpbmVbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1ib3R0b206M3B4fS54LWF4aXNbX25nY29udGVudC0lQ09NUCVdICAgdGV4dFtfbmdjb250ZW50LSVDT01QJV17ZG9taW5hbnQtYmFzZWxpbmU6dGV4dC1iZWZvcmUtZWRnZTt0ZXh0LWFuY2hvcjptaWRkbGV9LngtYXhpc1tfbmdjb250ZW50LSVDT01QJV0gICAudGlja3NbX25nY29udGVudC0lQ09NUCVdey13ZWJraXQtbWFzay1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICMwMDAwIDAlLCAjMDAwIDEwJSwgIzAwMCA5MCUsICMwMDAwIDEwMCUpO21hc2staW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAjMDAwMCAwJSwgIzAwMCAxMCUsICMwMDAgOTAlLCAjMDAwMCAxMDAlKX0ueS1heGlzW19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4LWRpcmVjdGlvbjpyb3ctcmV2ZXJzZX0ueS1heGlzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDo1cHh9LnktYXhpc1tfbmdjb250ZW50LSVDT01QJV0gICB0ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtkb21pbmFudC1iYXNlbGluZTpjZW50cmFsO3RleHQtYW5jaG9yOmVuZH0ueS1heGlzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC50aWNrc1tfbmdjb250ZW50LSVDT01QJV17LXdlYmtpdC1tYXNrLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICMwMDAwIDAlLCAjMDAwIDEwJSwgIzAwMCA5MCUsICMwMDAwIDEwMCUpO21hc2staW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgIzAwMDAgMCUsICMwMDAgMTAlLCAjMDAwIDkwJSwgIzAwMDAgMTAwJSl9LmV4dGVudC1lZGl0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZWVlO2Rpc3BsYXk6bm9uZTtmb250LXNpemU6MDtoZWlnaHQ6MjRweDtsaW5lLWhlaWdodDoyNHB4O3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjVweDt0b3A6NXB4O3dpZHRoOjI0cHh9LmV4dGVudC1lZGl0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICBtYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjE2cHg7d2lkdGg6MTZweDtsaW5lLWhlaWdodDoxNnB4fS5leHRlbnQtZWRpdC1pbnB1dFtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2NvbHVtbi1nYXA6NXB4O2Rpc3BsYXk6Z3JpZDtmb250LXNpemU6MTJweDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MzBweCBtaW5tYXgoYXV0bywgMTAwcHgpO2hlaWdodDozMHB4O21hcmdpbjoxMHB4IDIwcHh9LmV4dGVudC1lZGl0LWlucHV0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGlucHV0W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOmluaGVyaXQ7Ym9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXN0eWxlOnNvbGlkO2NvbG9yOmluaGVyaXR9LmV4dGVudC1lZGl0LWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93LXJldmVyc2U7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO21hcmdpbjoxMHB4IDIwcHh9LmV4dGVudC1lZGl0LWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdICAgYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtoZWlnaHQ6MzBweDtsaW5lLWhlaWdodDoxLjQ7bWFyZ2luLWxlZnQ6NXB4O3BhZGRpbmc6MCAxMHB4fS5heGlzW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5leHRlbnQtZWRpdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAuZXh0ZW50LWVkaXQtbWVudS1vcGVuZWRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6aW5pdGlhbH0ubWFqb3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlO292ZXJmbG93OmhpZGRlbjtjb250YWluOnN0cmljdH0ubWFqb3JbX25nY29udGVudC0lQ09NUCVdICAgLm1ham9yLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6aW5saW5lLWZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246YWJzb2x1dGU7d2hpdGUtc3BhY2U6bm93cmFwfS5tYWpvcltfbmdjb250ZW50LSVDT01QJV0gICAubWFqb3ItbGFiZWxbX25nY29udGVudC0lQ09NUCVdICAgc3Bhbltfbmdjb250ZW50LSVDT01QJV17bWF4LXdpZHRoOjEwMCV9LngtYXhpc1tfbmdjb250ZW50LSVDT01QJV0gICAubWFqb3ItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjOWU5ZTllO3BhZGRpbmc6MCA1cHh9LngtYXhpc1tfbmdjb250ZW50LSVDT01QJV0gICAubWFqb3ItbGFiZWwubGFzdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjOWU5ZTllfS55LWF4aXNbX25nY29udGVudC0lQ09NUCVdICAgLm1ham9yLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjOWU5ZTllO2hlaWdodDoxMDAlO3BhZGRpbmc6NXB4IDA7d2lkdGg6MTAwJX0ueS1heGlzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYWpvci1sYWJlbC5sYXN0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjFweCBzb2xpZCAjOWU5ZTllfS55LWF4aXNbX25nY29udGVudC0lQ09NUCVdICAgLm1ham9yLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSA+IHNwYW5bX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTpyb3RhdGUoLTkwZGVnKTt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcn0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWHV0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImxpbmUtY2hhcnQtYXhpcyIsdGVtcGxhdGVVcmw6ImxpbmVfY2hhcnRfYXhpc192aWV3Lm5nLmh0bWwiLHN0eWxlVXJsczpbImxpbmVfY2hhcnRfYXhpc192aWV3LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse2F4aXNFeHRlbnQ6W3t0eXBlOnh5fV0sYXhpczpbe3R5cGU6eHl9XSxzY2FsZTpbe3R5cGU6eHl9XSxncmlkQ291bnQ6W3t0eXBlOnh5fV0sZG9tRGltOlt7dHlwZTp4eX1dLGN1c3RvbUZvcm1hdHRlcjpbe3R5cGU6eHl9XSxvblZpZXdFeHRlbnRDaGFuZ2U6W3t0eXBlOk95fV19KTtjb25zdCBLdXQ9WyJzZXJpZXNWaWV3Il0sSnV0PVsieEF4aXMiXSxRdXQ9WyJ5QXhpcyJdLCR1dD1bImNoYXJ0RWwiXTtmdW5jdGlvbiB0ZnQodCxlKXtpZigxJnQmJlRtKDAsImxpbmUtY2hhcnQtZ3JpZC12aWV3IiwxNSksMiZ0KXtjb25zdCB0PVltKCk7RG0oInZpZXdFeHRlbnQiLHQudmlld0JveCkoInhTY2FsZSIsdC54U2NhbGUpKCJ5U2NhbGUiLHQueVNjYWxlKSgieEdyaWRDb3VudCIsdC5YX0dSSURfQ09VTlQpKCJ5R3JpZENvdW50Iix0LllfR1JJRF9DT1VOVCkoImRvbURpbSIsdC5kb21EaW1lbnNpb25zLm1haW4pfX1mdW5jdGlvbiBlZnQodCxlKXsxJnQmJihxaSgpLFRtKDAsInN2ZyIsbnVsbCwxNikpfWZ1bmN0aW9uIG5mdCh0LGUpezEmdCYmVG0oMCwiY2FudmFzIixudWxsLDE2KX1mdW5jdGlvbiBvZnQodCxlKXtpZigxJnQmJihObSgwKSxRcCgxLGVmdCwyLDAsInN2ZyIsNSksUXAoMixuZnQsMiwwLCJjYW52YXMiLDUpLHptKCkpLDImdCl7Y29uc3QgdD1ZbSgpO3JjKDEpLERtKCJuZ0lmIix0LmdldFJlbmRlcmVyVHlwZSgpPT09dC5SZW5kZXJlclR5cGUuU1ZHKSxyYygxKSxEbSgibmdJZiIsdC5nZXRSZW5kZXJlclR5cGUoKT09PXQuUmVuZGVyZXJUeXBlLldFQkdMKX19ZnVuY3Rpb24gaWZ0KHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwibGluZS1jaGFydC1pbnRlcmFjdGl2ZS12aWV3IiwxNyksVm0oIm9uVmlld0V4dGVudENoYW5nZSIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKCkub25WaWV3Qm94Q2hhbmdlZChuKX0pKSgib25WaWV3RXh0ZW50UmVzZXQiLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLFltKCkudmlld0JveFJlc2V0KCl9KSksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oKSxlPSRwKDEpO0RtKCJzZXJpZXNEYXRhIix0LnNlcmllc0RhdGEpKCJzZXJpZXNNZXRhZGF0YU1hcCIsdC5zZXJpZXNNZXRhZGF0YU1hcCkoInZpZXdFeHRlbnQiLHQudmlld0JveCkoInhTY2FsZSIsdC54U2NhbGUpKCJ5U2NhbGUiLHQueVNjYWxlKSgidG9vbHRpcE9yaWdpbkVsIixlKSgiZG9tRGltIix0LmRvbURpbWVuc2lvbnMubWFpbikoInRvb2x0aXBUZW1wbGF0ZSIsdC50b29sdGlwVGVtcGxhdGUpfX1jb25zdCBhZnQ9ZnVuY3Rpb24odCxlLG4sbyl7cmV0dXJue3hTY2FsZTp0LHlTY2FsZTplLGRvbURpbWVuc2lvbjpuLHZpZXdFeHRlbnQ6b319O2Z1bmN0aW9uIHJmdCh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsMTgpLEltKDEsMTkpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpO3JjKDEpLERtKCJuZ1RlbXBsYXRlT3V0bGV0Iix0LmN1c3RvbVZpc1RlbXBsYXRlKSgibmdUZW1wbGF0ZU91dGxldENvbnRleHQiLE9oKDIsYWZ0LHQueFNjYWxlLHQueVNjYWxlLHQuZG9tRGltZW5zaW9ucy5tYWluLHQudmlld0JveCkpfX1mdW5jdGlvbiBzZnQodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJsaW5lLWNoYXJ0LWF4aXMiLDIwKSxWbSgib25WaWV3RXh0ZW50Q2hhbmdlIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oKS5vblZpZXdCb3hDaGFuZ2VkRnJvbUF4aXMobiwieSIpfSkpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKCk7RG0oImF4aXNFeHRlbnQiLHQudmlld0JveC55KSgiY3VzdG9tRm9ybWF0dGVyIix0LmN1c3RvbVlGb3JtYXR0ZXIpKCJkb21EaW0iLHQuZG9tRGltZW5zaW9ucy55QXhpcykoImdyaWRDb3VudCIsdC5ZX0dSSURfQ09VTlQpKCJzY2FsZSIsdC55U2NhbGUpfX1mdW5jdGlvbiBsZnQodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJsaW5lLWNoYXJ0LWF4aXMiLDIxKSxWbSgib25WaWV3RXh0ZW50Q2hhbmdlIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oKS5vblZpZXdCb3hDaGFuZ2VkRnJvbUF4aXMobiwieCIpfSkpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKCk7RG0oImF4aXNFeHRlbnQiLHQudmlld0JveC54KSgiY3VzdG9tRm9ybWF0dGVyIix0LmN1c3RvbVhGb3JtYXR0ZXIpKCJkb21EaW0iLHQuZG9tRGltZW5zaW9ucy54QXhpcykoImdyaWRDb3VudCIsdC5YX0dSSURfQ09VTlQpKCJzY2FsZSIsdC54U2NhbGUpfX1jb25zdCBjZnQ9ZnVuY3Rpb24odCxlLG4sbyxpKXtyZXR1cm57eFNjYWxlOnQseVNjYWxlOmUsZG9tRGltZW5zaW9uOm4sdmlld0V4dGVudDpvLGZvcm1hdHRlcjppfX07ZnVuY3Rpb24gZGZ0KHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2IiwxOCksSW0oMSwxOSksQW0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoMSksRG0oIm5nVGVtcGxhdGVPdXRsZXQiLHQuY3VzdG9tWEF4aXNUZW1wbGF0ZSkoIm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0IixQaCgyLGNmdCx0LnhTY2FsZSx0LnlTY2FsZSx0LmRvbURpbWVuc2lvbnMueEF4aXMsdC52aWV3Qm94LHQuY3VzdG9tWEZvcm1hdHRlcnx8dC54U2NhbGUuZGVmYXVsdEZvcm1hdHRlcikpfX1mdW5jdGlvbiBwZnQodCxlKXsxJnQmJihSbSgwLCJkaXYiLDIyKSxUbSgxLCJzcGFuIiwyMyksQW0oKSl9Y29uc3QgbWZ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJue2NvbnRhaW5lcjohMCwiZGFyay1tb2RlIjp0LCJsaW5lLW9ubHktbW9kZSI6ZX19LHVmdD17eDpbMCwxXSx5OlswLDFdfTtjbGFzcyBmZnR7Y29uc3RydWN0b3IodCl7dGhpcy5jaGFuZ2VEZXRlY3Rvcj10LHRoaXMuUmVuZGVyZXJUeXBlPUsyLHRoaXMudXNlRGFya01vZGU9ITEsdGhpcy5wcmVmZXJyZWRSZW5kZXJlclR5cGU9SzIuV0VCR0wsdGhpcy54U2NhbGVUeXBlPUoyLkxJTkVBUix0aGlzLnlTY2FsZVR5cGU9SjIuTElORUFSLHRoaXMubGluZU9ubHk9ITEsdGhpcy5vblZpZXdCb3hPdmVycmlkZGVuPW5ldyBCKDEpLHRoaXMuaWdub3JlWU91dGxpZXJzPSExLHRoaXMuWV9HUklEX0NPVU5UPTYsdGhpcy5YX0dSSURfQ09VTlQ9MTAsdGhpcy54U2NhbGU9JG90KHRoaXMueFNjYWxlVHlwZSksdGhpcy55U2NhbGU9JG90KHRoaXMueFNjYWxlVHlwZSksdGhpcy52aWV3Qm94PXVmdCx0aGlzLmRvbURpbWVuc2lvbnM9e21haW46e3dpZHRoOjAsaGVpZ2h0OjB9LHhBeGlzOnt3aWR0aDowLGhlaWdodDowfSx5QXhpczp7d2lkdGg6MCxoZWlnaHQ6MH19LHRoaXMuc2hvd0NoYXJ0UmVuZGVyZXJFbGVtZW50PSEwLHRoaXMubGluZUNoYXJ0PW51bGwsdGhpcy5pc0RhdGFVcGRhdGVkPSExLHRoaXMuaXNNZXRhZGF0YVVwZGF0ZWQ9ITEsdGhpcy5pc0ZpeGVkVmlld0JveFVwZGF0ZWQ9ITEsdGhpcy5pc1ZpZXdCb3hPdmVycmlkZGVuPSExLHRoaXMudXNlRGFya01vZGVVcGRhdGVkPSExLHRoaXMuaXNWaWV3Qm94Q2hhbmdlZD0hMCx0aGlzLnNjYWxlVXBkYXRlZD0hMCx0aGlzLmlzUmVuZGVyaW5nQ29udGV4dExvc3Q9ITF9bmdPbkluaXQoKXt0aGlzLm9uVmlld0JveE92ZXJyaWRkZW4ubmV4dCh0aGlzLmlzVmlld0JveE92ZXJyaWRkZW4pfW5nT25DaGFuZ2VzKHQpe3QueFNjYWxlVHlwZSYmKHRoaXMueFNjYWxlPSRvdCh0aGlzLnhTY2FsZVR5cGUpLHRoaXMuc2NhbGVVcGRhdGVkPSEwKSx0LnlTY2FsZVR5cGUmJih0aGlzLnlTY2FsZT0kb3QodGhpcy55U2NhbGVUeXBlKSx0aGlzLnNjYWxlVXBkYXRlZD0hMCksdC5zZXJpZXNEYXRhJiYodGhpcy5pc0RhdGFVcGRhdGVkPSEwKSx0LmZpeGVkVmlld0JveCYmKHRoaXMuaXNGaXhlZFZpZXdCb3hVcGRhdGVkPSEwKSx0LnNlcmllc01ldGFkYXRhTWFwJiYodGhpcy5pc01ldGFkYXRhVXBkYXRlZD0hMCksdC51c2VEYXJrTW9kZSYmKHRoaXMudXNlRGFya01vZGVVcGRhdGVkPSEwKSx0aGlzLnNjYWxlVXBkYXRlZCYmdGhpcy5zZXRJc1ZpZXdCb3hPdmVycmlkZGVuKCExKSx0aGlzLmlzVmlld0JveENoYW5nZWQ9dGhpcy5pc1ZpZXdCb3hDaGFuZ2VkfHx0aGlzLnNjYWxlVXBkYXRlZHx8IXRoaXMuaXNWaWV3Qm94T3ZlcnJpZGRlbiYmdGhpcy5zaG91bGRVcGRhdGVEZWZhdWx0Vmlld0JveCh0KSx0aGlzLnVwZGF0ZUxpbmVDaGFydCgpfW5nQWZ0ZXJWaWV3SW5pdCgpe3RoaXMuaW5pdGlhbGl6ZUNoYXJ0KCksdGhpcy51cGRhdGVMaW5lQ2hhcnQoKSx0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKX1yZWNvdmVyUmVuZGVyZXJJZk5lZWRlZCgpe3RoaXMuaXNSZW5kZXJpbmdDb250ZXh0TG9zdCYmIXRoaXMuZGlzYWJsZVVwZGF0ZSYmKHRoaXMuc2hvd0NoYXJ0UmVuZGVyZXJFbGVtZW50PSExLHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpLHRoaXMuc2hvd0NoYXJ0UmVuZGVyZXJFbGVtZW50PSEwLHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpLHRoaXMuaW5pdGlhbGl6ZUNoYXJ0KCksdGhpcy5zY2FsZVVwZGF0ZWQ9ITAsdGhpcy5pc01ldGFkYXRhVXBkYXRlZD0hMCx0aGlzLmlzRGF0YVVwZGF0ZWQ9ITAsdGhpcy51c2VEYXJrTW9kZVVwZGF0ZWQ9ITAsdGhpcy5pc0ZpeGVkVmlld0JveFVwZGF0ZWQ9ITAsdGhpcy5pc1ZpZXdCb3hDaGFuZ2VkPSEwLHRoaXMuaXNSZW5kZXJpbmdDb250ZXh0TG9zdD0hMSl9b25WaWV3UmVzaXplKCl7dGhpcy5saW5lQ2hhcnQmJih0aGlzLnJlYWRBbmRVcGRhdGVEb21EaW1lbnNpb25zKCksdGhpcy5saW5lQ2hhcnQucmVzaXplKHRoaXMuZG9tRGltZW5zaW9ucy5tYWluKSx0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKSl9c2hvdWxkVXBkYXRlRGVmYXVsdFZpZXdCb3godCl7aWYodC54U2NhbGVUeXBlfHx0LnlTY2FsZVR5cGV8fHQuaWdub3JlWU91dGxpZXJzKXJldHVybiEwO2lmKHQuc2VyaWVzRGF0YSlyZXR1cm4hMDtjb25zdCBlPXQuc2VyaWVzTWV0YWRhdGFNYXA7aWYoZSl7Y29uc3QgdD1lLnByZXZpb3VzVmFsdWU7aWYoT2JqZWN0LmtleXModGhpcy5zZXJpZXNNZXRhZGF0YU1hcCkubGVuZ3RoIT09T2JqZWN0LmtleXMobnVsbCE9dD90Ont9KS5sZW5ndGgpcmV0dXJuITA7Zm9yKGNvbnN0W2Usbl1vZiBPYmplY3QuZW50cmllcyh0aGlzLnNlcmllc01ldGFkYXRhTWFwKSl7Y29uc3Qgbz10JiZ0W2VdO2lmKCFvfHxuLnZpc2libGUhPT1vLnZpc2libGUpcmV0dXJuITB9fXJldHVybiExfW9uQ29udGV4dExvc3QoKXt0aGlzLmlzUmVuZGVyaW5nQ29udGV4dExvc3Q9ITAsdGhpcy5saW5lQ2hhcnQmJih0aGlzLmxpbmVDaGFydC5kaXNwb3NlKCksdGhpcy5saW5lQ2hhcnQ9bnVsbCl9dHJpZ2dlckNvbnRleHRMb3N0Rm9yVGVzdCgpe3RoaXMub25Db250ZXh0TG9zdCgpfWdldExpbmVDaGFydEZvclRlc3QoKXtyZXR1cm4gdGhpcy5saW5lQ2hhcnR9aW5pdGlhbGl6ZUNoYXJ0KCl7dGhpcy5saW5lQ2hhcnQmJnRoaXMubGluZUNoYXJ0LmRpc3Bvc2UoKTtjb25zdCB0PXRoaXMuZ2V0UmVuZGVyZXJUeXBlKCksZT17b25EcmF3RW5kOigpPT57fSxvbkNvbnRleHRMb3N0OnRoaXMub25Db250ZXh0TG9zdC5iaW5kKHRoaXMpfTtsZXQgbj1udWxsO3N3aXRjaCh0aGlzLnJlYWRBbmRVcGRhdGVEb21EaW1lbnNpb25zKCksdCl7Y2FzZSBLMi5TVkc6bj17dHlwZTpLMi5TVkcsY29udGFpbmVyOnRoaXMuY2hhcnRFbC5uYXRpdmVFbGVtZW50LGNhbGxiYWNrczplLGRvbURpbWVuc2lvbjp0aGlzLmRvbURpbWVuc2lvbnMubWFpbix1c2VEYXJrTW9kZTp0aGlzLnVzZURhcmtNb2RlfTticmVhaztjYXNlIEsyLldFQkdMOm49e3R5cGU6SzIuV0VCR0wsY29udGFpbmVyOnRoaXMuY2hhcnRFbC5uYXRpdmVFbGVtZW50LGRldmljZVBpeGVsUmF0aW86d2luZG93LmRldmljZVBpeGVsUmF0aW8sY2FsbGJhY2tzOmUsZG9tRGltZW5zaW9uOnRoaXMuZG9tRGltZW5zaW9ucy5tYWluLHVzZURhcmtNb2RlOnRoaXMudXNlRGFya01vZGV9O2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGA8bGluZS1jaGFydD4gZG9lcyBub3QgeWV0IHN1cHBvcnQgcmVuZGVyZXJUeXBlOiAke3R9YCl9Y29uc3Qgbz10IT09SzIuU1ZHJiZpaXQoKTt0aGlzLmxpbmVDaGFydD1uZXcobz9QdXQ6eHV0KShuKX1uZ09uRGVzdHJveSgpe3RoaXMubGluZUNoYXJ0JiZ0aGlzLmxpbmVDaGFydC5kaXNwb3NlKCl9Z2V0UmVuZGVyZXJUeXBlKCl7cmV0dXJuKGZ1bmN0aW9uIHQoZSl7c3dpdGNoKGUpe2Nhc2UgSzIuU1ZHOnJldHVybiBLMi5TVkc7Y2FzZSBLMi5XRUJHTDpyZXR1cm4oZnVuY3Rpb24gdCgpe3JldHVybiBvaXR9KSgpP0syLldFQkdMOksyLlNWRztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5rbm93biByZW5kZXJlclR5cGU6ICR7ZX1gKX19KSh0aGlzLnByZWZlcnJlZFJlbmRlcmVyVHlwZSl9cmVhZEFuZFVwZGF0ZURvbURpbWVuc2lvbnMoKXt0aGlzLmRvbURpbWVuc2lvbnM9e21haW46e3dpZHRoOnRoaXMuc2VyaWVzVmlldy5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoLGhlaWdodDp0aGlzLnNlcmllc1ZpZXcubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHR9LHhBeGlzOnt3aWR0aDp0aGlzLnhBeGlzLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGgsaGVpZ2h0OnRoaXMueEF4aXMubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHR9LHlBeGlzOnt3aWR0aDp0aGlzLnlBeGlzLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGgsaGVpZ2h0OnRoaXMueUF4aXMubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHR9fX11cGRhdGVMaW5lQ2hhcnQoKXt2YXIgdCxlO2lmKHRoaXMucmVjb3ZlclJlbmRlcmVySWZOZWVkZWQoKSx0aGlzLmxpbmVDaGFydCYmIXRoaXMuZGlzYWJsZVVwZGF0ZSl7aWYodGhpcy5zY2FsZVVwZGF0ZWQmJih0aGlzLnNjYWxlVXBkYXRlZD0hMSx0aGlzLmxpbmVDaGFydC5zZXRYU2NhbGVUeXBlKHRoaXMueFNjYWxlVHlwZSksdGhpcy5saW5lQ2hhcnQuc2V0WVNjYWxlVHlwZSh0aGlzLnlTY2FsZVR5cGUpKSx0aGlzLmlzTWV0YWRhdGFVcGRhdGVkJiYodGhpcy5pc01ldGFkYXRhVXBkYXRlZD0hMSx0aGlzLmxpbmVDaGFydC5zZXRNZXRhZGF0YSh0aGlzLnNlcmllc01ldGFkYXRhTWFwKSksdGhpcy5pc0RhdGFVcGRhdGVkJiYodGhpcy5pc0RhdGFVcGRhdGVkPSExLHRoaXMubGluZUNoYXJ0LnNldERhdGEodGhpcy5zZXJpZXNEYXRhKSksdGhpcy51c2VEYXJrTW9kZVVwZGF0ZWQmJih0aGlzLnVzZURhcmtNb2RlVXBkYXRlZD0hMSx0aGlzLmxpbmVDaGFydC5zZXRVc2VEYXJrTW9kZSh0aGlzLnVzZURhcmtNb2RlKSksIXRoaXMuaXNWaWV3Qm94T3ZlcnJpZGRlbiYmdGhpcy5maXhlZFZpZXdCb3gpdGhpcy52aWV3Qm94PXRoaXMuZml4ZWRWaWV3Qm94O2Vsc2UgaWYoIXRoaXMuaXNWaWV3Qm94T3ZlcnJpZGRlbiYmdGhpcy5pc1ZpZXdCb3hDaGFuZ2VkKXtjb25zdCBuPShmdW5jdGlvbiBvKHQsZSxuLGksYSl7bGV0IHI9bnVsbCxzPW51bGwsbD1bXTtmb3IoY29uc3R7aWQ6bixwb2ludHM6b31vZiB0KXtjb25zdCB0PWVbbl07aWYodCYmIXQuYXV4JiZ0LnZpc2libGUpZm9yKGxldCB0PTA7dDxvLmxlbmd0aDt0Kyspe2NvbnN0e3g6ZSx5Om59PW9bdF07aShlKSYmKHI9bnVsbD09PXJ8fGU8cj9lOnIscz1udWxsPT09c3x8ZT5zP2U6cyksYShuKSYmbC5wdXNoKG4pfX1sLnNvcnQoYzUpO2xldCBjPWxbMF0sZD1sW2wubGVuZ3RoLTFdO3JldHVybiBuJiZsLmxlbmd0aD4yJiYoYz1sW01hdGguY2VpbCguMDUqKGwubGVuZ3RoLTEpKV0sZD1sW01hdGguZmxvb3IoLjk1KihsLmxlbmd0aC0xKSldKSx7eDpudWxsIT09ciYmbnVsbCE9PXM/W3Isc106dm9pZCAwLHk6dm9pZCAwIT09YyYmdm9pZCAwIT09ZD9bYyxkXTp2b2lkIDB9fSkodGhpcy5zZXJpZXNEYXRhLHRoaXMuc2VyaWVzTWV0YWRhdGFNYXAsdGhpcy5pZ25vcmVZT3V0bGllcnMsdGhpcy54U2NhbGUuaXNTYWZlTnVtYmVyLHRoaXMueVNjYWxlLmlzU2FmZU51bWJlcik7dGhpcy52aWV3Qm94PXt4OnRoaXMueFNjYWxlLm5pY2VEb21haW4obnVsbCE9PSh0PW4ueCkmJnZvaWQgMCE9PXQ/dDp1ZnQueCkseTp0aGlzLnlTY2FsZS5uaWNlRG9tYWluKG51bGwhPT0oZT1uLnkpJiZ2b2lkIDAhPT1lP2U6dWZ0LnkpfX0odGhpcy5pc0ZpeGVkVmlld0JveFVwZGF0ZWR8fHRoaXMuaXNWaWV3Qm94Q2hhbmdlZCkmJih0aGlzLmlzRml4ZWRWaWV3Qm94VXBkYXRlZD0hMSx0aGlzLmlzVmlld0JveENoYW5nZWQ9ITEsdGhpcy5saW5lQ2hhcnQuc2V0Vmlld0JveCh0aGlzLnZpZXdCb3gpKX19b25WaWV3Qm94Q2hhbmdlZCh7ZGF0YUV4dGVudDp0fSl7dGhpcy5zZXRJc1ZpZXdCb3hPdmVycmlkZGVuKCEwKSx0aGlzLmlzVmlld0JveENoYW5nZWQ9ITAsdGhpcy52aWV3Qm94PXQsdGhpcy51cGRhdGVMaW5lQ2hhcnQoKX12aWV3Qm94UmVzZXQoKXt0aGlzLnNldElzVmlld0JveE92ZXJyaWRkZW4oITEpLHRoaXMuaXNWaWV3Qm94Q2hhbmdlZD0hMCx0aGlzLnVwZGF0ZUxpbmVDaGFydCgpfXNldElzVmlld0JveE92ZXJyaWRkZW4odCl7Y29uc3QgZT10aGlzLmlzVmlld0JveE92ZXJyaWRkZW47dGhpcy5pc1ZpZXdCb3hPdmVycmlkZGVuPXQsZSE9PXQmJnRoaXMub25WaWV3Qm94T3ZlcnJpZGRlbi5uZXh0KHQpfWdldElzVmlld0JveE92ZXJyaWRkZW4oKXtyZXR1cm4gdGhpcy5vblZpZXdCb3hPdmVycmlkZGVufW9uVmlld0JveENoYW5nZWRGcm9tQXhpcyh0LGUpe2NvbnN0IG49T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHRoaXMudmlld0JveCkse1tlXTp0fSk7dGhpcy5vblZpZXdCb3hDaGFuZ2VkKHtkYXRhRXh0ZW50Om59KX19ZmZ0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxmZnQpKFNtKFVnKSl9LGZmdC7JtWNtcD10byh7dHlwZTpmZnQsc2VsZWN0b3JzOltbImxpbmUtY2hhcnQiXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihRaChLdXQsNyxoZyksUWgoSnV0LDcsaGcpLFFoKFF1dCw3LGhnKSxRaCgkdXQsNSxoZykpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uc2VyaWVzVmlldz10LmZpcnN0KSxKaCh0PXRiKCkpJiYobi54QXhpcz10LmZpcnN0KSxKaCh0PXRiKCkpJiYobi55QXhpcz10LmZpcnN0KSxKaCh0PXRiKCkpJiYobi5jaGFydEVsPXQuZmlyc3QpfX0saW5wdXRzOntjdXN0b21WaXNUZW1wbGF0ZToiY3VzdG9tVmlzVGVtcGxhdGUiLGN1c3RvbVhBeGlzVGVtcGxhdGU6ImN1c3RvbVhBeGlzVGVtcGxhdGUiLHVzZURhcmtNb2RlOiJ1c2VEYXJrTW9kZSIscHJlZmVycmVkUmVuZGVyZXJUeXBlOiJwcmVmZXJyZWRSZW5kZXJlclR5cGUiLHNlcmllc0RhdGE6InNlcmllc0RhdGEiLGZpeGVkVmlld0JveDoiZml4ZWRWaWV3Qm94IixzZXJpZXNNZXRhZGF0YU1hcDoic2VyaWVzTWV0YWRhdGFNYXAiLHhTY2FsZVR5cGU6InhTY2FsZVR5cGUiLHlTY2FsZVR5cGU6InlTY2FsZVR5cGUiLGN1c3RvbVhGb3JtYXR0ZXI6ImN1c3RvbVhGb3JtYXR0ZXIiLGN1c3RvbVlGb3JtYXR0ZXI6ImN1c3RvbVlGb3JtYXR0ZXIiLHRvb2x0aXBUZW1wbGF0ZToidG9vbHRpcFRlbXBsYXRlIixsaW5lT25seToibGluZU9ubHkiLGRpc2FibGVVcGRhdGU6ImRpc2FibGVVcGRhdGUiLGlnbm9yZVlPdXRsaWVyczoiaWdub3JlWU91dGxpZXJzIn0sZmVhdHVyZXM6W0JvXSxkZWNsczoxNix2YXJzOjEzLGNvbnN0czpbWyJkZXRlY3RSZXNpemUiLCIiLCJjZGtPdmVybGF5T3JpZ2luIiwiIiwzLCJuZ0NsYXNzIiwicmVzaXplRXZlbnREZWJvdW5jZVBlcmlvZEluTXMiLCJvblJlc2l6ZSJdLFsib3ZlcmxheVRhcmdldCIsImNka092ZXJsYXlPcmlnaW4iXSxbMSwic2VyaWVzLXZpZXciXSxbInNlcmllc1ZpZXciLCIiXSxbMywidmlld0V4dGVudCIsInhTY2FsZSIsInlTY2FsZSIsInhHcmlkQ291bnQiLCJ5R3JpZENvdW50IiwiZG9tRGltIiw0LCJuZ0lmIl0sWzQsIm5nSWYiXSxbMywic2VyaWVzRGF0YSIsInNlcmllc01ldGFkYXRhTWFwIiwidmlld0V4dGVudCIsInhTY2FsZSIsInlTY2FsZSIsInRvb2x0aXBPcmlnaW5FbCIsImRvbURpbSIsInRvb2x0aXBUZW1wbGF0ZSIsIm9uVmlld0V4dGVudENoYW5nZSIsIm9uVmlld0V4dGVudFJlc2V0Iiw0LCJuZ0lmIl0sWyJjbGFzcyIsImN1c3RvbS12aXMiLDQsIm5nSWYiXSxbMSwieS1heGlzIl0sWyJ5QXhpcyIsIiJdLFsiYXhpcyIsInkiLDMsImF4aXNFeHRlbnQiLCJjdXN0b21Gb3JtYXR0ZXIiLCJkb21EaW0iLCJncmlkQ291bnQiLCJzY2FsZSIsIm9uVmlld0V4dGVudENoYW5nZSIsNCwibmdJZiJdLFsxLCJ4LWF4aXMiXSxbInhBeGlzIiwiIl0sWyJheGlzIiwieCIsMywiYXhpc0V4dGVudCIsImN1c3RvbUZvcm1hdHRlciIsImRvbURpbSIsImdyaWRDb3VudCIsInNjYWxlIiwib25WaWV3RXh0ZW50Q2hhbmdlIiw0LCJuZ0lmIl0sWyJjbGFzcyIsImRvdCIsNCwibmdJZiJdLFszLCJ2aWV3RXh0ZW50IiwieFNjYWxlIiwieVNjYWxlIiwieEdyaWRDb3VudCIsInlHcmlkQ291bnQiLCJkb21EaW0iXSxbImNoYXJ0RWwiLCIiXSxbMywic2VyaWVzRGF0YSIsInNlcmllc01ldGFkYXRhTWFwIiwidmlld0V4dGVudCIsInhTY2FsZSIsInlTY2FsZSIsInRvb2x0aXBPcmlnaW5FbCIsImRvbURpbSIsInRvb2x0aXBUZW1wbGF0ZSIsIm9uVmlld0V4dGVudENoYW5nZSIsIm9uVmlld0V4dGVudFJlc2V0Il0sWzEsImN1c3RvbS12aXMiXSxbMywibmdUZW1wbGF0ZU91dGxldCIsIm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0Il0sWyJheGlzIiwieSIsMywiYXhpc0V4dGVudCIsImN1c3RvbUZvcm1hdHRlciIsImRvbURpbSIsImdyaWRDb3VudCIsInNjYWxlIiwib25WaWV3RXh0ZW50Q2hhbmdlIl0sWyJheGlzIiwieCIsMywiYXhpc0V4dGVudCIsImN1c3RvbUZvcm1hdHRlciIsImRvbURpbSIsImdyaWRDb3VudCIsInNjYWxlIiwib25WaWV3RXh0ZW50Q2hhbmdlIl0sWzEsImRvdCJdLFsxLCJyZWN0Il1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJkaXYiLDAsMSksVm0oIm9uUmVzaXplIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uVmlld1Jlc2l6ZSgpfSkpLFJtKDIsImRpdiIsMiwzKSxRcCg0LHRmdCwxLDYsImxpbmUtY2hhcnQtZ3JpZC12aWV3Iiw0KSxRcCg1LG9mdCwzLDIsIm5nLWNvbnRhaW5lciIsNSksUXAoNixpZnQsMSw4LCJsaW5lLWNoYXJ0LWludGVyYWN0aXZlLXZpZXciLDYpLFFwKDcscmZ0LDIsNywiZGl2Iiw3KSxBbSgpLFJtKDgsImRpdiIsOCw5KSxRcCgxMCxzZnQsMSw1LCJsaW5lLWNoYXJ0LWF4aXMiLDEwKSxBbSgpLFJtKDExLCJkaXYiLDExLDEyKSxRcCgxMyxsZnQsMSw1LCJsaW5lLWNoYXJ0LWF4aXMiLDEzKSxRcCgxNCxkZnQsMiw4LCJkaXYiLDcpLEFtKCksUXAoMTUscGZ0LDIsMCwiZGl2IiwxNCksQW0oKSksMiZlJiYoRG0oIm5nQ2xhc3MiLHZoKDEwLG1mdCxuLnVzZURhcmtNb2RlLG4ubGluZU9ubHkpKSgicmVzaXplRXZlbnREZWJvdW5jZVBlcmlvZEluTXMiLDApLHJjKDQpLERtKCJuZ0lmIiwhbi5saW5lT25seSkscmMoMSksRG0oIm5nSWYiLG4uc2hvd0NoYXJ0UmVuZGVyZXJFbGVtZW50KSxyYygxKSxEbSgibmdJZiIsIW4ubGluZU9ubHkpLHJjKDEpLERtKCJuZ0lmIixuLmN1c3RvbVZpc1RlbXBsYXRlKSxyYygzKSxEbSgibmdJZiIsIW4ubGluZU9ubHkpLHJjKDMpLERtKCJuZ0lmIiwhbi5saW5lT25seSkscmMoMSksRG0oIm5nSWYiLG4uY3VzdG9tWEF4aXNUZW1wbGF0ZSkscmMoMSksRG0oIm5nSWYiLCFuLmxpbmVPbmx5KSl9LGRpcmVjdGl2ZXM6W29KLGZMLGFNLGRNLEV1dCxVdXQsTU0sWHV0XSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2NvbnRhaW46c3RyaWN0O2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6aW5oZXJpdDtkaXNwbGF5OmdyaWQ7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVuO3dpZHRoOjEwMCU7Z3JpZC10ZW1wbGF0ZS1hcmVhczoieWF4aXMgc2VyaWVzIiAiZG90IHhheGlzIjtncmlkLXRlbXBsYXRlLWNvbHVtbnM6NTBweCAxZnI7Z3JpZC1hdXRvLXJvd3M6MWZyIDMwcHh9LmNvbnRhaW5lci5kYXJrLW1vZGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9LmNvbnRhaW5lci5saW5lLW9ubHktbW9kZVtfbmdjb250ZW50LSVDT01QJV17Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjAgMWZyO2dyaWQtYXV0by1yb3dzOjFmciAwfS5zZXJpZXMtdmlld1tfbmdjb250ZW50LSVDT01QJV17Z3JpZC1hcmVhOnNlcmllcztwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzpoaWRkZW59LnNlcmllcy12aWV3W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jdXN0b20tdmlzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLnNlcmllcy12aWV3W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNhbnZhc1tfbmdjb250ZW50LSVDT01QJV0sIC5zZXJpZXMtdmlld1tfbmdjb250ZW50LSVDT01QJV0gICBzdmdbX25nY29udGVudC0lQ09NUCVdLCAuc2VyaWVzLXZpZXdbX25nY29udGVudC0lQ09NUCVdICAgbGluZS1jaGFydC1ncmlkLXZpZXdbX25nY29udGVudC0lQ09NUCVdLCAuc2VyaWVzLXZpZXdbX25nY29udGVudC0lQ09NUCVdICAgbGluZS1jaGFydC1pbnRlcmFjdGl2ZS12aWV3W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTAwJTtsZWZ0OjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7d2lkdGg6MTAwJX0uc2VyaWVzLXZpZXdbX25nY29udGVudC0lQ09NUCVdICAgLmN1c3RvbS12aXNbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmV9LngtYXhpc1tfbmdjb250ZW50LSVDT01QJV0gICAuY3VzdG9tLXZpc1tfbmdjb250ZW50LSVDT01QJV0sIC55LWF4aXNbX25nY29udGVudC0lQ09NUCVdICAgLmN1c3RvbS12aXNbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlO2xlZnQ6MDtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7d2lkdGg6MTAwJTstd2Via2l0LW1hc2staW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAjMDAwMCAwJSwgIzAwMCAxMCUsICMwMDAgOTAlLCAjMDAwMCAxMDAlKTttYXNrLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgIzAwMDAgMCUsICMwMDAgMTAlLCAjMDAwIDkwJSwgIzAwMDAgMTAwJSl9LngtYXhpc1tfbmdjb250ZW50LSVDT01QJV0gICBsaW5lLWNoYXJ0LWF4aXNbX25nY29udGVudC0lQ09NUCVdLCAueS1heGlzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGxpbmUtY2hhcnQtYXhpc1tfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCV9LngtYXhpc1tfbmdjb250ZW50LSVDT01QJV17Z3JpZC1hcmVhOnhheGlzO3Bvc2l0aW9uOnJlbGF0aXZlfS55LWF4aXNbX25nY29udGVudC0lQ09NUCVde2dyaWQtYXJlYTp5YXhpc30uZG90W19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O2Rpc3BsYXk6ZmxleDtncmlkLWFyZWE6ZG90O2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0uZG90W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5yZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MXB4O3dpZHRoOjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNhYWF9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGZmdCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJsaW5lLWNoYXJ0Iix0ZW1wbGF0ZVVybDoibGluZV9jaGFydF9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsibGluZV9jaGFydF9jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlVnfV19KSx7c2VyaWVzVmlldzpbe3R5cGU6WmEsYXJnczpbInNlcmllc1ZpZXciLHtzdGF0aWM6ITAscmVhZDpoZ31dfV0seEF4aXM6W3t0eXBlOlphLGFyZ3M6WyJ4QXhpcyIse3N0YXRpYzohMCxyZWFkOmhnfV19XSx5QXhpczpbe3R5cGU6WmEsYXJnczpbInlBeGlzIix7c3RhdGljOiEwLHJlYWQ6aGd9XX1dLGNoYXJ0RWw6W3t0eXBlOlphLGFyZ3M6WyJjaGFydEVsIix7c3RhdGljOiExLHJlYWQ6aGd9XX1dLGN1c3RvbVZpc1RlbXBsYXRlOlt7dHlwZTp4eX1dLGN1c3RvbVhBeGlzVGVtcGxhdGU6W3t0eXBlOnh5fV0sdXNlRGFya01vZGU6W3t0eXBlOnh5fV0scHJlZmVycmVkUmVuZGVyZXJUeXBlOlt7dHlwZTp4eX1dLHNlcmllc0RhdGE6W3t0eXBlOnh5fV0sZml4ZWRWaWV3Qm94Olt7dHlwZTp4eX1dLHNlcmllc01ldGFkYXRhTWFwOlt7dHlwZTp4eX1dLHhTY2FsZVR5cGU6W3t0eXBlOnh5fV0seVNjYWxlVHlwZTpbe3R5cGU6eHl9XSxjdXN0b21YRm9ybWF0dGVyOlt7dHlwZTp4eX1dLGN1c3RvbVlGb3JtYXR0ZXI6W3t0eXBlOnh5fV0sdG9vbHRpcFRlbXBsYXRlOlt7dHlwZTp4eX1dLGxpbmVPbmx5Olt7dHlwZTp4eX1dLGRpc2FibGVVcGRhdGU6W3t0eXBlOnh5fV0saWdub3JlWU91dGxpZXJzOlt7dHlwZTp4eX1dfSk7Y2xhc3MgZ2Z0e31nZnQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGdmdCl9LGdmdC7JtWNtcD10byh7dHlwZTpnZnQsc2VsZWN0b3JzOltbInZpcy1zZWxlY3RlZC10aW1lLWNsaXBwZWQiXV0saW5wdXRzOntzZWxlY3RlZFRpbWU6InNlbGVjdGVkVGltZSJ9LGRlY2xzOjEsdmFyczowLGNvbnN0czpbWyJzdmdJY29uIiwiaW5mb19vdXRsaW5lXzI0cHgiLCJ0aXRsZSIsIkxpbmtlZCBzdGVwIGlzIG5vdCBmb3VuZCBpbiB0aGlzIHZpc3VhbGl6YXRpb24uIFdlIGhpZ2hsaWdodGVkIHRoZSBjbG9zZXN0IHN0ZXAgZm9yIHlvdS4iXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmVG0oMCwibWF0LWljb24iLDApfSxkaXJlY3RpdmVzOltEV10sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9W19uZ2hvc3QtJUNPTVAlXXtjb2xvcjojZDMyZjJmO2hlaWdodDoxZW07bGluZS1oZWlnaHQ6MDt3aWR0aDoxZW19Ym9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVde2NvbG9yOiNkMzJmMmZ9W19uZ2hvc3QtJUNPTVAlXSAgIG1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChnZnQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoidmlzLXNlbGVjdGVkLXRpbWUtY2xpcHBlZCIsdGVtcGxhdGU6J1xuICAgIDxtYXQtaWNvblxuICAgICAgc3ZnSWNvbj0iaW5mb19vdXRsaW5lXzI0cHgiXG4gICAgICB0aXRsZT0iTGlua2VkIHN0ZXAgaXMgbm90IGZvdW5kIGluIHRoaXMgdmlzdWFsaXphdGlvbi4gV2UgaGlnaGxpZ2h0ZWQgdGhlIGNsb3Nlc3Qgc3RlcCBmb3IgeW91LiJcbiAgICA+PC9tYXQtaWNvbj5cbiAgJyxzdHlsZVVybHM6WyJ2aXNfc2VsZWN0ZWRfdGltZV9jbGlwcGVkX2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSxudWxsLHtzZWxlY3RlZFRpbWU6W3t0eXBlOnh5fV19KTtjbGFzcyBoZnR7fWZ1bmN0aW9uIGJmdCh0LGUpezEmdCYmVG0oMCwidmlzLXNlbGVjdGVkLXRpbWUtY2xpcHBlZCIpfWZ1bmN0aW9uIHlmdCh0LGUpezEmdCYmVG0oMCwibWF0LXNwaW5uZXIiLDIzKX1mdW5jdGlvbiBfZnQodCxlKXsxJnQmJihSbSgwLCJ0aCIpLGt1KDEsIlNtb290aGVkIiksQW0oKSl9ZnVuY3Rpb24gQ2Z0KHQsZSl7aWYoMSZ0JiYoUm0oMCwidGQiKSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKS4kaW1wbGljaXQsZT1ZbSgyKTtyYygxKSxEdSgiICIsZS52YWx1ZUZvcm1hdHRlci5mb3JtYXRTaG9ydCh0LnBvaW50LnkpLCIgIil9fWZ1bmN0aW9uIE1mdCh0LGUpe2lmKDEmdCYmKE5tKDApLFJtKDEsInRyIiwyNyksUm0oMiwidGQiLDI4KSxUbSgzLCJzcGFuIiksQW0oKSxSbSg0LCJ0ZCIsMSksa3UoNSksQW0oKSxRcCg2LENmdCwyLDEsInRkIiwzKSxSbSg3LCJ0ZCIpLGt1KDgpLEFtKCksUm0oOSwidGQiKSxrdSgxMCksQW0oKSxSbSgxMSwidGQiKSxrdSgxMiksQWgoMTMsImRhdGUiKSxBbSgpLFJtKDE0LCJ0ZCIpLGt1KDE1KSxBbSgpLEFtKCksem0oKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oMik7cmMoMSkscHUoImNsb3Nlc3QiLHQubWV0YWRhdGEuY2xvc2VzdCkscmMoMiksZHUoImJhY2tncm91bmQtY29sb3IiLHQubWV0YWRhdGEuY29sb3IpLHJjKDIpLFN1KHQubWV0YWRhdGEuZGlzcGxheU5hbWUpLHJjKDEpLERtKCJuZ0lmIixuLnNtb290aGluZ0VuYWJsZWQpLHJjKDIpLFN1KG4udmFsdWVGb3JtYXR0ZXIuZm9ybWF0U2hvcnQodC5wb2ludC52YWx1ZSkpLHJjKDIpLFN1KG4uc3RlcEZvcm1hdHRlci5mb3JtYXRTaG9ydCh0LnBvaW50LnN0ZXApKSxyYygyKSxTdShOaCgxMywxMCx0LnBvaW50LndhbGxUaW1lLCJzaG9ydCIpKSxyYygzKSxEdSgiICIsbi5yZWxhdGl2ZVhGb3JtYXR0ZXIuZm9ybWF0UmVhZGFibGUodC5wb2ludC5yZWxhdGl2ZVRpbWVJbk1zKSwiICIpfX1mdW5jdGlvbiB2ZnQodCxlKXtpZigxJnQmJihSbSgwLCJ0YWJsZSIsMjQpLFJtKDEsInRoZWFkIiksUm0oMiwidHIiKSxUbSgzLCJ0aCIsMjUpLFJtKDQsInRoIiksa3UoNSwiUnVuIiksQW0oKSxRcCg2LF9mdCwyLDAsInRoIiwzKSxSbSg3LCJ0aCIpLGt1KDgsIlZhbHVlIiksQW0oKSxSbSg5LCJ0aCIpLGt1KDEwLCJTdGVwIiksQW0oKSxSbSgxMSwidGgiKSxrdSgxMiwiVGltZSIpLEFtKCksUm0oMTMsInRoIiksa3UoMTQsIlJlbGF0aXZlIiksQW0oKSxBbSgpLEFtKCksUm0oMTUsInRib2R5IiksUXAoMTYsTWZ0LDE2LDEzLCJuZy1jb250YWluZXIiLDI2KSxBbSgpLEFtKCkpLDImdCl7Y29uc3QgdD1lLmRhdGEsbj1lLmN1cnNvckxvY2F0aW9uSW5EYXRhQ29vcmQsbz1ZbSgpO3JjKDYpLERtKCJuZ0lmIixvLnNtb290aGluZ0VuYWJsZWQpLHJjKDEwKSxEbSgibmdGb3JPZiIsby5nZXRDdXJzb3JBd2FyZVRvb2x0aXBEYXRhKHQsbikpKCJuZ0ZvclRyYWNrQnkiLG8udHJhY2tCeVRvb2x0aXBEYXR1bSl9fWhmdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8aGZ0KX0saGZ0Lsm1Y21wPXRvKHt0eXBlOmhmdCxzZWxlY3RvcnM6W1sibGlua2VkLXRpbWUtZm9iIl1dLGlucHV0czp7c3RlcDoic3RlcCJ9LGRlY2xzOjMsdmFyczozLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJzcGFuIiksa3UoMSksQWgoMiwibnVtYmVyIiksQW0oKSksMiZlJiYocmMoMSksU3UoVGgoMiwxLG4uc3RlcCkpKX0scGlwZXM6W0ZNXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lLWJsb2NrfXNwYW5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtib3JkZXItcmFkaXVzOjI1cHg7Y29sb3I6aW5oZXJpdDtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6MTFweDtwYWRkaW5nOjJweCA1cHh9c3Bhbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIHNwYW5bX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZXtib3JkZXItY29sb3I6IzYxNjE2MX1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICBzcGFuW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgc3Bhbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojNjE2MTYxO2JvcmRlci1jb2xvcjojOGU5OGEzfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIHNwYW5bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICBzcGFuW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgYm9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgc3Bhbltfbmdjb250ZW50LSVDT01QJV06YWN0aXZlLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICBzcGFuW19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmV7Ym9yZGVyLWNvbG9yOiNlZWV9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGhmdCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJsaW5rZWQtdGltZS1mb2IiLHRlbXBsYXRlOiI8c3Bhbj57eyBzdGVwIHwgbnVtYmVyIH19PC9zcGFuPiIsc3R5bGVVcmxzOlsibGlua2VkX3RpbWVfZm9iX2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSxudWxsLHtzdGVwOlt7dHlwZTp4eX1dfSk7Y29uc3QgeGZ0PWZ1bmN0aW9uKHQpe3JldHVyblswLHRdfSxPZnQ9ZnVuY3Rpb24oKXtyZXR1cm57Im91dC1vZi1zZWxlY3RlZC10aW1lIjohMCxlbmQ6ITAscmFuZ2U6ITB9fTtmdW5jdGlvbiBQZnQodCxlKXtpZigxJnQmJlRtKDAsImRpdiIsMjkpLDImdCl7Y29uc3QgdD1ZbSgyKSxlPXQudmlld0V4dGVudCxuPXQuZG9tRGltZW5zaW9uLG89dC54U2NhbGUsaT1ZbSgpO2R1KCJsZWZ0IixvLmZvcndhcmQoZS54LE1oKDMseGZ0LG4ud2lkdGgpLGkuc2VsZWN0ZWRUaW1lLmVuZFN0ZXApKyJweCIpLERtKCJuZ0NsYXNzIixDaCg1LE9mdCkpfX1jb25zdCB3ZnQ9ZnVuY3Rpb24odCl7cmV0dXJuW3QsMF19LGtmdD1mdW5jdGlvbih0KXtyZXR1cm57Im91dC1vZi1zZWxlY3RlZC10aW1lIjohMCxzdGFydDohMCxyYW5nZTp0fX07ZnVuY3Rpb24gU2Z0KHQsZSl7aWYoMSZ0JiYoTm0oMCksVG0oMSwiZGl2IiwyOSksUXAoMixQZnQsMSw2LCJkaXYiLDMwKSx6bSgpKSwyJnQpe2NvbnN0IHQ9WW0oKSxlPXQudmlld0V4dGVudCxuPXQuZG9tRGltZW5zaW9uLG89dC54U2NhbGUsaT1ZbSgpO3JjKDEpLGR1KCJyaWdodCIsby5mb3J3YXJkKGUueCxNaCg0LHdmdCxuLndpZHRoKSxpLnNlbGVjdGVkVGltZS5zdGFydFN0ZXApKyJweCIpLERtKCJuZ0NsYXNzIixNaCg2LGtmdCwhIWkuc2VsZWN0ZWRUaW1lLmVuZFN0ZXApKSxyYygxKSxEbSgibmdJZiIsaS5zZWxlY3RlZFRpbWUuZW5kU3RlcCl9fWZ1bmN0aW9uIERmdCh0LGUpezEmdCYmUXAoMCxTZnQsMyw4LCJuZy1jb250YWluZXIiLDMpLDImdCYmRG0oIm5nSWYiLFltKCkuc2VsZWN0ZWRUaW1lKX1mdW5jdGlvbiBFZnQodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDMxKSxUbSgxLCJsaW5rZWQtdGltZS1mb2IiLDMyKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oMiksZT10LnZpZXdFeHRlbnQsbj10LmRvbURpbWVuc2lvbixvPXQueFNjYWxlLGk9WW0oKTtkdSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrby5mb3J3YXJkKGUueCxNaCgzLHhmdCxuLndpZHRoKSxpLnNlbGVjdGVkVGltZS5lbmRTdGVwKSsicHgsIDApIikscmMoMSksRG0oInN0ZXAiLGkuc2VsZWN0ZWRUaW1lLmVuZFN0ZXApfX1mdW5jdGlvbiBSZnQodCxlKXtpZigxJnQmJihObSgwKSxSbSgxLCJkaXYiLDMxKSxUbSgyLCJsaW5rZWQtdGltZS1mb2IiLDMyKSxBbSgpLFFwKDMsRWZ0LDIsNSwiZGl2IiwzMyksem0oKSksMiZ0KXtjb25zdCB0PVltKCksZT10LnZpZXdFeHRlbnQsbj10LmRvbURpbWVuc2lvbixvPXQueFNjYWxlLGk9WW0oKTtyYygxKSxkdSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrby5mb3J3YXJkKGUueCxNaCg0LHhmdCxuLndpZHRoKSxpLnNlbGVjdGVkVGltZS5zdGFydFN0ZXApKyJweCwgMCkiKSxyYygxKSxEbSgic3RlcCIsaS5zZWxlY3RlZFRpbWUuc3RhcnRTdGVwKSxyYygxKSxEbSgibmdJZiIsaS5zZWxlY3RlZFRpbWUuZW5kU3RlcCl9fWZ1bmN0aW9uIEFmdCh0LGUpezEmdCYmUXAoMCxSZnQsNCw2LCJuZy1jb250YWluZXIiLDMpLDImdCYmRG0oIm5nSWYiLFltKCkuc2VsZWN0ZWRUaW1lKX1jbGFzcyBUZnR7Y29uc3RydWN0b3IodCxlKXt0aGlzLnJlZj10LHRoaXMuZGlhbG9nPWUsdGhpcy5EYXRhTG9hZFN0YXRlPXlFLHRoaXMuUmVuZGVyZXJUeXBlPUsyLHRoaXMuU2NhbGVUeXBlPUoyLHRoaXMub25GdWxsU2l6ZVRvZ2dsZT1uZXcgTGgsdGhpcy5vblBpbkNsaWNrZWQ9bmV3IExoLHRoaXMueVNjYWxlVHlwZT1KMi5MSU5FQVIsdGhpcy5pc1ZpZXdCb3hPdmVycmlkZGVuPSExLHRoaXMucmVsYXRpdmVYRm9ybWF0dGVyPVhvdCx0aGlzLnZhbHVlRm9ybWF0dGVyPUlvdCx0aGlzLnN0ZXBGb3JtYXR0ZXI9TG90fXRvZ2dsZVlTY2FsZVR5cGUoKXt0aGlzLnlTY2FsZVR5cGU9dGhpcy55U2NhbGVUeXBlPT09SjIuTElORUFSP0oyLkxPRzEwOkoyLkxJTkVBUn1yZXNldERvbWFpbigpe3RoaXMubGluZUNoYXJ0JiZ0aGlzLmxpbmVDaGFydC52aWV3Qm94UmVzZXQoKX10cmFja0J5VG9vbHRpcERhdHVtKHQsZSl7cmV0dXJuIGUuaWR9Z2V0Q3VzdG9tWEZvcm1hdHRlcigpe3N3aXRjaCh0aGlzLnhBeGlzVHlwZSl7Y2FzZSB5QS5SRUxBVElWRTpyZXR1cm4gWG90O2Nhc2UgeUEuU1RFUDpyZXR1cm4gVW90O2Nhc2UgeUEuV0FMTF9USU1FOmRlZmF1bHQ6cmV0dXJufX1nZXRDdXJzb3JBd2FyZVRvb2x0aXBEYXRhKHQsZSl7Y29uc3Qgbj10Lm1hcCgodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHttZXRhZGF0YTpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5tZXRhZGF0YSkse2Nsb3Nlc3Q6ITEsZGlzdFNxVG9DdXJzb3I6TWF0aC5oeXBvdCh0LnBvaW50LngtZS54LHQucG9pbnQueS1lLnkpfSl9KSkpO2xldCBvPTEvMCxpPTA7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0Kyspbz5uW3RdLm1ldGFkYXRhLmRpc3RTcVRvQ3Vyc29yJiYobz1uW3RdLm1ldGFkYXRhLmRpc3RTcVRvQ3Vyc29yLGk9dCk7c3dpdGNoKG4ubGVuZ3RoJiYobltpXS5tZXRhZGF0YS5jbG9zZXN0PSEwKSx0aGlzLnRvb2x0aXBTb3J0KXtjYXNlIGJBLkRFRkFVTFQ6cmV0dXJuIG47Y2FzZSBiQS5BU0NFTkRJTkc6cmV0dXJuIG4uc29ydCgoKHQsZSk9PnQucG9pbnQueS1lLnBvaW50LnkpKTtjYXNlIGJBLkRFU0NFTkRJTkc6cmV0dXJuIG4uc29ydCgoKHQsZSk9PmUucG9pbnQueS10LnBvaW50LnkpKTtjYXNlIGJBLk5FQVJFU1Q6cmV0dXJuIG4uc29ydCgoKHQsZSk9PnQubWV0YWRhdGEuZGlzdFNxVG9DdXJzb3ItZS5tZXRhZGF0YS5kaXN0U3FUb0N1cnNvcikpfX1vcGVuRGF0YURvd25sb2FkRGlhbG9nKCl7dGhpcy5kaWFsb2cub3Blbih0aGlzLkRhdGFEb3dubG9hZENvbXBvbmVudCx7ZGF0YTp7Y2FyZElkOnRoaXMuY2FyZElkfX0pfX1UZnQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFRmdCkoU20oaGcpLFNtKG9XKSl9LFRmdC7JtWNtcD10byh7dHlwZTpUZnQsc2VsZWN0b3JzOltbInNjYWxhci1jYXJkLWNvbXBvbmVudCJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmUWgoZmZ0LDUpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4ubGluZUNoYXJ0PXQuZmlyc3QpfX0saW5wdXRzOntjYXJkSWQ6ImNhcmRJZCIsY2hhcnRNZXRhZGF0YU1hcDoiY2hhcnRNZXRhZGF0YU1hcCIsRGF0YURvd25sb2FkQ29tcG9uZW50OiJEYXRhRG93bmxvYWRDb21wb25lbnQiLGRhdGFTZXJpZXM6ImRhdGFTZXJpZXMiLGlnbm9yZU91dGxpZXJzOiJpZ25vcmVPdXRsaWVycyIsaXNDYXJkVmlzaWJsZToiaXNDYXJkVmlzaWJsZSIsaXNQaW5uZWQ6ImlzUGlubmVkIixsb2FkU3RhdGU6ImxvYWRTdGF0ZSIsc2hvd0Z1bGxTaXplOiJzaG93RnVsbFNpemUiLHNtb290aGluZ0VuYWJsZWQ6InNtb290aGluZ0VuYWJsZWQiLHRhZzoidGFnIix0aXRsZToidGl0bGUiLHRvb2x0aXBTb3J0OiJ0b29sdGlwU29ydCIseEF4aXNUeXBlOiJ4QXhpc1R5cGUiLHhTY2FsZVR5cGU6InhTY2FsZVR5cGUiLHVzZURhcmtNb2RlOiJ1c2VEYXJrTW9kZSIsc2VsZWN0ZWRUaW1lOiJzZWxlY3RlZFRpbWUifSxvdXRwdXRzOntvbkZ1bGxTaXplVG9nZ2xlOiJvbkZ1bGxTaXplVG9nZ2xlIixvblBpbkNsaWNrZWQ6Im9uUGluQ2xpY2tlZCJ9LGRlY2xzOjM0LHZhcnM6MjYsY29uc3RzOmZ1bmN0aW9uKCl7bGV0IHQsZSxuLG8saTtyZXR1cm4gdD0idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZT9nb29nLmdldE1zZygiRml0IGxpbmUgY2hhcnQgZG9tYWlucyB0byBkYXRhIik6JGxvY2FsaXplYDpBIGJ1dHRvbiB0aGF0IHJlc2V0cyBsaW5lIGNoYXJ0IGRvbWFpbiB0byB0aGUgZGF0YeKQn2U2OGE1NTI5NDFhYjQyN2E5OWU3NDM3ZTA4NDQzZjMwYWM3MWNjZDbikJ8zODMwNjQ2NTIxMDU4MjY4NTU4OkZpdCBsaW5lIGNoYXJ0IGRvbWFpbnMgdG8gZGF0YWAsZT0idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZT9nb29nLmdldE1zZygiUGluIGNhcmQiKTokbG9jYWxpemVgOkEgYnV0dG9uIHRvIHBpbiBhIGNhcmQu4pCfZTY2NWRjNzEyYmQ1ZjE4ZDRkZmEzYTI5ZTEyNWQ1NjVjYzUxZTJmNuKQnzcyODQ2MDY0MjYyMzQzNzUzNDQ6UGluIGNhcmRgLG49InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSYmbmdJMThuQ2xvc3VyZU1vZGU/Z29vZy5nZXRNc2coIlRvZ2dsZSBmdWxsIHNpemUgbW9kZSIpOiRsb2NhbGl6ZWA6QSBidXR0b24gb24gbGluZSBjaGFydCB0aGF0IHRvZ2dsZXMgZnVsbCBzaXplIG1vZGUu4pCfZmM4Zjc2N2QwYjlmOTMwMTg3YTFiYWUzNDQ3N2FkMjg3MzZlY2UzM+KQnzkxNTcyMTU2MzYzODkyNjU5NzpUb2dnbGUgZnVsbCBzaXplIG1vZGVgLG89InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSYmbmdJMThuQ2xvc3VyZU1vZGU/Z29vZy5nZXRNc2coIk1vcmUgbGluZSBjaGFydCBvcHRpb25zIik6JGxvY2FsaXplYDpBbiBvdmVyZmxvdyBtZW51IGJ1dHRvbiB0aGF0IG9wZW5zIG1vcmUgbGluZSBjaGFydCBvcHRpb25z4pCfYjI2MGZhYjk0NmEzMDc3Y2UyMGZkMjhlMzM2OTc5ZjU4NjcyMGU4ZOKQnzg3ODA1Mzc0MDIxMDMzNjQzNTpNb3JlIGxpbmUgY2hhcnQgb3B0aW9uc2AsaT0idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZT9nb29nLmdldE1zZygiVG9nZ2xlIFktYXhpcyBsb2cgc2NhbGUgb24gbGluZSBjaGFydCIpOiRsb2NhbGl6ZWA6QSBidXR0b24gdGhhdCB0b2dnbGVzIGxvZyBzY2FsZSBvbiB5LWF4aXMgb24gYSBsaW5lIGNoYXJ04pCfZmU5MWY5NmFiOWIzYmFjYTVhNDg5MTNmMmIwZmFlODQ0ODNkOTNlM+KQnzMzNzQ2NDU2MjA2Mzg4ODM5MjY6VG9nZ2xlIFktYXhpcyBsb2cgc2NhbGUgb24gbGluZSBjaGFydGAsW1sxLCJoZWFkaW5nIl0sWzEsIm5hbWUiXSxbMSwidGFnIiwzLCJ0aXRsZSIsInZhbHVlIl0sWzQsIm5nSWYiXSxbMSwiY29udHJvbHMiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLHQsMywiZGlzYWJsZWQiLCJ0aXRsZSIsImNsaWNrIl0sWyJzdmdJY29uIiwic2V0dGluZ3Nfb3ZlcnNjYW5fMjRweCJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsZSwxLCJwaW4tYnV0dG9uIiwzLCJjbGljayJdLFszLCJzdmdJY29uIl0sWyJtYXQtaWNvbi1idXR0b24iLCIiLCJhcmlhLWxhYmVsIixuLCJ0aXRsZSIsIlRvZ2dsZSBmdWxsIHNpemUgbW9kZSIsMywiY2xpY2siXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLG8sInRpdGxlIiwiTW9yZSBsaW5lIGNoYXJ0IG9wdGlvbnMiLDMsIm1hdE1lbnVUcmlnZ2VyRm9yIl0sWyJzdmdJY29uIiwibW9yZV92ZXJ0XzI0cHgiXSxbIm1lbnUiLCJtYXRNZW51Il0sWyJtYXQtbWVudS1pdGVtIiwiIiwiYXJpYS1sYWJlbCIsaSwzLCJjbGljayJdLFsic3ZnSWNvbiIsImxpbmVfd2VpZ2h0XzI0cHgiXSxbIm1hdC1tZW51LWl0ZW0iLCIiLCJhcmlhLWxhYmVsIiwiT3BlbiBkaWFsb2cgdG8gZG93bmxvYWQgZGF0YSIsMywiY2xpY2siXSxbInN2Z0ljb24iLCJnZXRfYXBwXzI0cHgiXSxbMSwiY2hhcnQtY29udGFpbmVyIl0sWyJkaWFtZXRlciIsIjE4Iiw0LCJuZ0lmIl0sWzMsImRpc2FibGVVcGRhdGUiLCJwcmVmZXJyZWRSZW5kZXJlclR5cGUiLCJzZXJpZXNEYXRhIiwic2VyaWVzTWV0YWRhdGFNYXAiLCJ4U2NhbGVUeXBlIiwieVNjYWxlVHlwZSIsImN1c3RvbVhGb3JtYXR0ZXIiLCJpZ25vcmVZT3V0bGllcnMiLCJ0b29sdGlwVGVtcGxhdGUiLCJ1c2VEYXJrTW9kZSIsImN1c3RvbVZpc1RlbXBsYXRlIiwiY3VzdG9tWEF4aXNUZW1wbGF0ZSIsIm9uVmlld0JveE92ZXJyaWRkZW4iXSxbInRvb2x0aXAiLCIiXSxbImxpbmVDaGFydEN1c3RvbVZpcyIsIiJdLFsibGluZUNoYXJ0Q3VzdG9tWEF4aXNWaXMiLCIiXSxbImRpYW1ldGVyIiwiMTgiXSxbMSwidG9vbHRpcCJdLFsxLCJjaXJjbGUtaGVhZGVyIl0sWzQsIm5nRm9yIiwibmdGb3JPZiIsIm5nRm9yVHJhY2tCeSJdLFsxLCJ0b29sdGlwLXJvdyJdLFsxLCJ0b29sdGlwLXJvdy1jaXJjbGUiXSxbMywibmdDbGFzcyJdLFszLCJuZ0NsYXNzIiwibGVmdCIsNCwibmdJZiJdLFsxLCJsaW5rZWQtdGltZS1mb2ItY29udGFpbmVyIl0sWzEsInNlbGVjdGVkLXRpbWUtZm9iIiwzLCJzdGVwIl0sWyJjbGFzcyIsImxpbmtlZC10aW1lLWZvYi1jb250YWluZXIiLDMsInRyYW5zZm9ybSIsNCwibmdJZiJdXX0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmKFJtKDAsImRpdiIsMCksUm0oMSwic3BhbiIsMSksVG0oMiwidGItdHJ1bmNhdGVkLXBhdGgiLDIpLFFwKDMsYmZ0LDEsMCwidmlzLXNlbGVjdGVkLXRpbWUtY2xpcHBlZCIsMyksQW0oKSxSbSg0LCJzcGFuIiw0KSxSbSg1LCJidXR0b24iLDUpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5yZXNldERvbWFpbigpfSkpLEFoKDYsImFzeW5jIiksQWgoNywiYXN5bmMiKSxUbSg4LCJtYXQtaWNvbiIsNiksQW0oKSxSbSg5LCJidXR0b24iLDcpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblBpbkNsaWNrZWQuZW1pdCghbi5pc1Bpbm5lZCl9KSksVG0oMTAsIm1hdC1pY29uIiw4KSxBbSgpLFJtKDExLCJidXR0b24iLDkpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkZ1bGxTaXplVG9nZ2xlLmVtaXQoKX0pKSxUbSgxMiwibWF0LWljb24iLDgpLEFtKCksUm0oMTMsImJ1dHRvbiIsMTApLFRtKDE0LCJtYXQtaWNvbiIsMTEpLEFtKCksUm0oMTUsIm1hdC1tZW51IixudWxsLDEyKSxSbSgxNywiYnV0dG9uIiwxMyksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLnRvZ2dsZVlTY2FsZVR5cGUoKX0pKSxUbSgxOCwibWF0LWljb24iLDE0KSxSbSgxOSwic3BhbiIpLGt1KDIwLCJUb2dnbGUgWS1heGlzIGxvZyBzY2FsZSIpLEFtKCksQW0oKSxSbSgyMSwiYnV0dG9uIiwxNSksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9wZW5EYXRhRG93bmxvYWREaWFsb2coKX0pKSxUbSgyMiwibWF0LWljb24iLDE2KSxSbSgyMywic3BhbiIpLGt1KDI0LCJEb3dubG9hZCBkYXRhIiksQW0oKSxBbSgpLEFtKCksQW0oKSxBbSgpLFJtKDI1LCJkaXYiLDE3KSxRcCgyNix5ZnQsMSwwLCJtYXQtc3Bpbm5lciIsMTgpLFJtKDI3LCJsaW5lLWNoYXJ0IiwxOSksVm0oIm9uVmlld0JveE92ZXJyaWRkZW4iLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLmlzVmlld0JveE92ZXJyaWRkZW49ZX0pKSxBbSgpLFFwKDI4LHZmdCwxNywzLCJuZy10ZW1wbGF0ZSIsbnVsbCwyMCxpYiksQW0oKSxRcCgzMCxEZnQsMSwxLCJuZy10ZW1wbGF0ZSIsbnVsbCwyMSxpYiksUXAoMzIsQWZ0LDEsMSwibmctdGVtcGxhdGUiLG51bGwsMjIsaWIpKSwyJmUpe2NvbnN0IHQ9JHAoMTYpLGU9JHAoMjkpLG89JHAoMzEpLGk9JHAoMzMpO3JjKDIpLEttKCJ0aXRsZSIsbi50YWcpLEttKCJ2YWx1ZSIsbi50aXRsZSkscmMoMSksRG0oIm5nSWYiLG4uc2VsZWN0ZWRUaW1lJiZuLnNlbGVjdGVkVGltZS5jbGlwcGVkKSxyYygyKSxEbSgiZGlzYWJsZWQiLCFuLmxpbmVDaGFydHx8IVRoKDYsMjIsbi5saW5lQ2hhcnQuZ2V0SXNWaWV3Qm94T3ZlcnJpZGRlbigpKSkoInRpdGxlIixuLmxpbmVDaGFydCYmVGgoNywyNCxuLmxpbmVDaGFydC5nZXRJc1ZpZXdCb3hPdmVycmlkZGVuKCkpPyJMaW5lIGNoYXJ0IGlzIGFscmVhZHkgZml0dGVkIHRvIGRhdGEuIFdoZW4gZGF0YSB1cGRhdGVzLCB0aGUgbGluZSBjaGFydCB3aWxsIGF1dG8gZml0IHRvIGl0cyBkb21haW4uIjoiRml0IGxpbmUgY2hhcnQgZG9tYWlucyB0byBkYXRhIikscmMoNCksanAoInRpdGxlIixuLmlzUGlubmVkPyJVbnBpbiBjYXJkIjoiUGluIGNhcmQiKSxyYygxKSxEbSgic3ZnSWNvbiIsbi5pc1Bpbm5lZD8ia2VlcF8yNHB4Ijoia2VlcF9vdXRsaW5lXzI0cHgiKSxyYygyKSxEbSgic3ZnSWNvbiIsbi5zaG93RnVsbFNpemU/ImZ1bGxzY3JlZW5fZXhpdF8yNHB4IjoiZnVsbHNjcmVlbl8yNHB4IikscmMoMSksRG0oIm1hdE1lbnVUcmlnZ2VyRm9yIix0KSxyYygxMyksRG0oIm5nSWYiLG4ubG9hZFN0YXRlPT09bi5EYXRhTG9hZFN0YXRlLkxPQURJTkcpLHJjKDEpLERtKCJkaXNhYmxlVXBkYXRlIiwhbi5pc0NhcmRWaXNpYmxlKSgicHJlZmVycmVkUmVuZGVyZXJUeXBlIixuLlJlbmRlcmVyVHlwZS5XRUJHTCkoInNlcmllc0RhdGEiLG4uZGF0YVNlcmllcykoInNlcmllc01ldGFkYXRhTWFwIixuLmNoYXJ0TWV0YWRhdGFNYXApKCJ4U2NhbGVUeXBlIixuLnhTY2FsZVR5cGUpKCJ5U2NhbGVUeXBlIixuLnlTY2FsZVR5cGUpKCJjdXN0b21YRm9ybWF0dGVyIixuLmdldEN1c3RvbVhGb3JtYXR0ZXIoKSkoImlnbm9yZVlPdXRsaWVycyIsbi5pZ25vcmVPdXRsaWVycykoInRvb2x0aXBUZW1wbGF0ZSIsZSkoInVzZURhcmtNb2RlIixuLnVzZURhcmtNb2RlKSgiY3VzdG9tVmlzVGVtcGxhdGUiLG8pKCJjdXN0b21YQXhpc1RlbXBsYXRlIixpKX19LGRpcmVjdGl2ZXM6W3oyLGRNLFhILERXLGVZLEtXLFdXLGZmdCxnZnQsbzEsbE0sYU0saGZ0XSxwaXBlczpbd00sUk1dLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtib3gtc2l6aW5nOmJvcmRlci1ib3g7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6YXV0bztwYWRkaW5nOjE2cHg7cGFkZGluZy10b3A6NHB4fS5oZWFkaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O2ZvbnQtc2l6ZToxNHB4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO21hcmdpbi1ib3R0b206NHB4O3Bvc2l0aW9uOnJlbGF0aXZlfS5oZWFkaW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpncmlkO2dhcDo1cHg7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOmF1dG8gYXV0b30uaGVhZGluZ1tfbmdjb250ZW50LSVDT01QJV0gICB2aXMtc2VsZWN0ZWQtdGltZS1jbGlwcGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MS4yZW07bGluZS1oZWlnaHQ6MH0udGFnW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW59LnBpbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgbWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxOHB4fS5jb250cm9sc1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MTt3aGl0ZS1zcGFjZTpub3dyYXA7ZmxleC1zaHJpbms6MDttYXJnaW4tcmlnaHQ6LTEycHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmNvbnRyb2xzW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmNvbnRyb2xzW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX0uY2hhcnQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZTtmbGV4OjF9LmNoYXJ0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0gICBtYXQtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MTFweDt0b3A6MTFweH0uY2hhcnQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGxpbmUtY2hhcnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjEwMCV9LnRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1zcGFjaW5nOjRweDtmb250LXNpemU6MTNweH0udG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17dGV4dC1hbGlnbjpsZWZ0fS50b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC50b29sdGlwLXJvd1tfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwfS50b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC50b29sdGlwLXJvdy1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmlubGluZS1mbGV4O2hlaWdodDoxMnB4O3dpZHRoOjEycHh9LnRvb2x0aXBbX25nY29udGVudC0lQ09NUCVdICAgLnRvb2x0aXAtcm93LWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0gPiBzcGFuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmFkaXVzOjUwJTtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsLjQpO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDoxMHB4O3dpZHRoOjEwcHh9LnRvb2x0aXBbX25nY29udGVudC0lQ09NUCVdICAgLmNsb3Nlc3RbX25nY29udGVudC0lQ09NUCVdICAgLnRvb2x0aXAtcm93LWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0gPiBzcGFuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZjtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5vdXQtb2Ytc2VsZWN0ZWQtdGltZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjAgZGFzaGVkIGN1cnJlbnRDb2xvcjtoZWlnaHQ6MTAwJTtwb3NpdGlvbjphYnNvbHV0ZX0ub3V0LW9mLXNlbGVjdGVkLXRpbWUuc3RhcnRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodC13aWR0aDoycHg7bWFyZ2luLWxlZnQ6LTFweH0ub3V0LW9mLXNlbGVjdGVkLXRpbWUuc3RhcnQucmFuZ2VbX25nY29udGVudC0lQ09NUCVde2xlZnQ6MH0ub3V0LW9mLXNlbGVjdGVkLXRpbWUuZW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdC13aWR0aDoycHg7bWFyZ2luLXJpZ2h0Oi0xcHg7cmlnaHQ6MH0ub3V0LW9mLXNlbGVjdGVkLXRpbWUucmFuZ2VbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLm91dC1vZi1zZWxlY3RlZC10aW1lLnJhbmdlW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLm91dC1vZi1zZWxlY3RlZC10aW1lLnJhbmdlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQpfS5saW5rZWQtdGltZS1mb2ItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmlubGluZS1ibG9jaztsZWZ0OjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjB9bGlua2VkLXRpbWUtZm9iW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKX0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoVGZ0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InNjYWxhci1jYXJkLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6InNjYWxhcl9jYXJkX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyJzY2FsYXJfY2FyZF9jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTpvV31dfSkse2NhcmRJZDpbe3R5cGU6eHl9XSxjaGFydE1ldGFkYXRhTWFwOlt7dHlwZTp4eX1dLERhdGFEb3dubG9hZENvbXBvbmVudDpbe3R5cGU6eHl9XSxkYXRhU2VyaWVzOlt7dHlwZTp4eX1dLGlnbm9yZU91dGxpZXJzOlt7dHlwZTp4eX1dLGlzQ2FyZFZpc2libGU6W3t0eXBlOnh5fV0saXNQaW5uZWQ6W3t0eXBlOnh5fV0sbG9hZFN0YXRlOlt7dHlwZTp4eX1dLHNob3dGdWxsU2l6ZTpbe3R5cGU6eHl9XSxzbW9vdGhpbmdFbmFibGVkOlt7dHlwZTp4eX1dLHRhZzpbe3R5cGU6eHl9XSx0aXRsZTpbe3R5cGU6eHl9XSx0b29sdGlwU29ydDpbe3R5cGU6eHl9XSx4QXhpc1R5cGU6W3t0eXBlOnh5fV0seFNjYWxlVHlwZTpbe3R5cGU6eHl9XSx1c2VEYXJrTW9kZTpbe3R5cGU6eHl9XSxzZWxlY3RlZFRpbWU6W3t0eXBlOnh5fV0sb25GdWxsU2l6ZVRvZ2dsZTpbe3R5cGU6T3l9XSxvblBpbkNsaWNrZWQ6W3t0eXBlOk95fV0sbGluZUNoYXJ0Olt7dHlwZTpaYSxhcmdzOltmZnRdfV19KTtjbGFzcyBOZnR7Y29uc3RydWN0b3IodCxlKXt0aGlzLnJlZj10LHRoaXMuY2RrU2Nyb2xsYWJsZT1lLHRoaXMub25WaXNpYmlsaXR5Q2hhbmdlPW5ldyBMaCx0aGlzLm5nVW5zdWJzY3JpYmUkPW5ldyBJLHRoaXMub25FdmVudCQ9bmV3IEl9bmdPbkluaXQoKXtjb25zdCB0PW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigodD0+e3RoaXMub25FdmVudCQubmV4dCh0KX0pLHtyb290OnRoaXMuY2RrU2Nyb2xsYWJsZT90aGlzLmNka1Njcm9sbGFibGUuZ2V0RWxlbWVudFJlZigpLm5hdGl2ZUVsZW1lbnQ6bnVsbCxyb290TWFyZ2luOnRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXJNYXJnaW59KTt0Lm9ic2VydmUodGhpcy5yZWYubmF0aXZlRWxlbWVudCksdGhpcy5uZ1Vuc3Vic2NyaWJlJC5zdWJzY3JpYmUoKCgpPT57dC51bm9ic2VydmUodGhpcy5yZWYubmF0aXZlRWxlbWVudCl9KSksdGhpcy5vbkV2ZW50JC5waXBlKEllKHRoaXMubmdVbnN1YnNjcmliZSQpKS5zdWJzY3JpYmUoKHQ9Pntjb25zdCBlPXQuc2xpY2UoLTEpWzBdO3RoaXMub25WaXNpYmlsaXR5Q2hhbmdlLmVtaXQoe3Zpc2libGU6ZS5pc0ludGVyc2VjdGluZ30pfSkpfW5nT25EZXN0cm95KCl7dGhpcy5uZ1Vuc3Vic2NyaWJlJC5uZXh0KCksdGhpcy5uZ1Vuc3Vic2NyaWJlJC5jb21wbGV0ZSgpfXdhaXRGb3JFdmVudEZvclRlc3RPbmx5KCl7cmV0dXJuIG5ldyBQcm9taXNlKCh0PT50aGlzLm9uRXZlbnQkLnBpcGUoYmUoMSkpLnN1YnNjcmliZSgoKCk9Pnt0KCl9KSkpKX19ZnVuY3Rpb24gemZ0KHQsZSl7cmV0dXJuIHQubGVuZ3RoPT09ZS5sZW5ndGgmJnQuZXZlcnkoKCh0LG4pPT57Y29uc3Qgbz1lW25dLGk9dC5wb2ludHMsYT1vLnBvaW50cztyZXR1cm4gdC5ydW5JZD09PW8ucnVuSWQmJmkubGVuZ3RoPT09YS5sZW5ndGgmJmkuZXZlcnkoKCh0LGUpPT57Y29uc3Qgbj1hW2VdO3JldHVybiB0Lng9PT1uLngmJnQueT09PW4ueX0pKX0pKX1OZnQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fE5mdCkoU20oaGcpLFNtKG1GLDgpKX0sTmZ0Lsm1ZGlyPWxvKHt0eXBlOk5mdCxzZWxlY3RvcnM6W1siIiwib2JzZXJ2ZUludGVyc2VjdGlvbiIsIiJdXSxpbnB1dHM6e2ludGVyc2VjdGlvbk9ic2VydmVyTWFyZ2luOiJpbnRlcnNlY3Rpb25PYnNlcnZlck1hcmdpbiJ9LG91dHB1dHM6e29uVmlzaWJpbGl0eUNoYW5nZToib25WaXNpYmlsaXR5Q2hhbmdlIn19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKE5mdCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJbb2JzZXJ2ZUludGVyc2VjdGlvbl0ifV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOm1GLGRlY29yYXRvcnM6W3t0eXBlOlNyfV19XX0pLHtpbnRlcnNlY3Rpb25PYnNlcnZlck1hcmdpbjpbe3R5cGU6eHl9XSxvblZpc2liaWxpdHlDaGFuZ2U6W3t0eXBlOk95fV19KTtjbGFzcyBJZnR7Y29uc3RydWN0b3IodCl7dGhpcy5zdG9yZT10LHRoaXMuRGF0YURvd25sb2FkQ29tcG9uZW50PWw1LHRoaXMuZnVsbFdpZHRoQ2hhbmdlZD1uZXcgTGgsdGhpcy5mdWxsSGVpZ2h0Q2hhbmdlZD1uZXcgTGgsdGhpcy5waW5TdGF0ZUNoYW5nZWQ9bmV3IExoLHRoaXMuaXNWaXNpYmxlPSExLHRoaXMudXNlRGFya01vZGUkPXRoaXMuc3RvcmUuc2VsZWN0KEpEKSx0aGlzLmlnbm9yZU91dGxpZXJzJD10aGlzLnN0b3JlLnNlbGVjdChBVCksdGhpcy50b29sdGlwU29ydCQ9dGhpcy5zdG9yZS5zZWxlY3QoUlQpLHRoaXMueEF4aXNUeXBlJD10aGlzLnN0b3JlLnNlbGVjdChUVCksdGhpcy54U2NhbGVUeXBlJD10aGlzLnN0b3JlLnNlbGVjdChUVCkucGlwZShJdCgodD0+e3N3aXRjaCh0KXtjYXNlIHlBLlNURVA6Y2FzZSB5QS5SRUxBVElWRTpyZXR1cm4gSjIuTElORUFSO2Nhc2UgeUEuV0FMTF9USU1FOnJldHVybiBKMi5USU1FO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHhBeGlzVHlwZSBmb3IgbGluZSBjaGFydC4gJHt0fWApfX0pKSksdGhpcy5zY2FsYXJTbW9vdGhpbmckPXRoaXMuc3RvcmUuc2VsZWN0KHpUKSx0aGlzLnNtb290aGluZ0VuYWJsZWQkPXRoaXMuc3RvcmUuc2VsZWN0KHpUKS5waXBlKEl0KCh0PT50PjApKSksdGhpcy5zaG93RnVsbFNpemU9ITEsdGhpcy5uZ1Vuc3Vic2NyaWJlPW5ldyBJfW9uVmlzaWJpbGl0eUNoYW5nZSh7dmlzaWJsZTp0fSl7dGhpcy5pc1Zpc2libGU9dH1pc1NjYWxhckNhcmRNZXRhZGF0YSh0KXtjb25zdHtwbHVnaW46ZX09dDtyZXR1cm4gZT09PWhBLlNDQUxBUlN9b25GdWxsU2l6ZVRvZ2dsZSgpe3RoaXMuc2hvd0Z1bGxTaXplPSF0aGlzLnNob3dGdWxsU2l6ZSx0aGlzLmZ1bGxXaWR0aENoYW5nZWQuZW1pdCh0aGlzLnNob3dGdWxsU2l6ZSksdGhpcy5mdWxsSGVpZ2h0Q2hhbmdlZC5lbWl0KHRoaXMuc2hvd0Z1bGxTaXplKX1uZ09uSW5pdCgpe2NvbnN0IHQ9dGhpcy5zdG9yZS5zZWxlY3QoeVQsdGhpcy5jYXJkSWQpLnBpcGUoY2UoKHQ9PiEhdCYmdGhpcy5pc1NjYWxhckNhcmRNZXRhZGF0YSh0KSkpLEl0KCh0PT50KSkpO2Z1bmN0aW9uIGUodCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KFsic21vb3RoZWQiLHRdKX1jb25zdCBuPXRoaXMuc3RvcmUuc2VsZWN0KGhULHRoaXMuY2FyZElkKS5waXBlKEllKHRoaXMubmdVbnN1YnNjcmliZSksY2UoKHQ9PkJvb2xlYW4odCkpKSxJdCgodD0+dCkpLEFlKDEpKS5waXBlKGZlKHRoaXMuc3RvcmUuc2VsZWN0KFRUKSksSXQoKChbdCxlXSk9Pk9iamVjdC5rZXlzKHQpLm1hcCgobj0+KHtydW5JZDpuLHBvaW50czp0aGlzLnN0ZXBTZXJpZXNUb0xpbmVTZXJpZXModFtuXSxlKX0pKSkpKSxNZSh6ZnQpKS5waXBlKGZlKHRoaXMuc3RvcmUuc2VsZWN0KElUKSksSWUodGhpcy5uZ1Vuc3Vic2NyaWJlKSxJdCgoKFt0LGVdKT0+ZT8oZnVuY3Rpb24gbih0KXt2YXIgZTtjb25zdCBuPVtdO2Zvcihjb25zdCBvIG9mIHQpe2NvbnN0IHQ9W107bGV0IGk9TnVtYmVyLmlzRmluaXRlKG51bGw9PT0oZT1vLnBvaW50c1swXSl8fHZvaWQgMD09PWU/dm9pZCAwOmUueCk/by5wb2ludHNbMF0ueDotMS8wLGE9W107Zm9yKGNvbnN0IGUgb2Ygby5wb2ludHMpTnVtYmVyLmlzRmluaXRlKGUueCk/KGUueDxpJiYodC5wdXNoKHtzZXJpZXNJZDpKU09OLnN0cmluZ2lmeShbby5ydW5JZCx0Lmxlbmd0aF0pLHJ1bklkOm8ucnVuSWQscG9pbnRzOmF9KSxhPVtdKSxhLnB1c2goZSksaT1lLngpOmEucHVzaChlKTt0LnB1c2goe3Nlcmllc0lkOkpTT04uc3RyaW5naWZ5KFtvLnJ1bklkLHQubGVuZ3RoXSkscnVuSWQ6by5ydW5JZCxwb2ludHM6YX0pO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKW4ucHVzaChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdFtlXSkse3BhcnRpdGlvbkluZGV4OmUscGFydGl0aW9uU2l6ZTp0Lmxlbmd0aH0pKX1yZXR1cm4gbn0pKHQpOnQubWFwKCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3Nlcmllc0lkOnQucnVuSWQscGFydGl0aW9uSW5kZXg6MCxwYXJ0aXRpb25TaXplOjF9KSkpKSksSXQoKHQ9PnQubWFwKCh0PT57dmFyIGU7Y29uc3Qgbj1udWxsPT09KGU9dC5wb2ludHNbMF0pfHx2b2lkIDA9PT1lP3ZvaWQgMDplLndhbGxUaW1lO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3BvaW50czp0LnBvaW50cy5tYXAoKHQ9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7cmVsYXRpdmVUaW1lSW5Nczp0LndhbGxUaW1lLW59KSkpfSl9KSkpKSxmZSh0aGlzLnN0b3JlLnNlbGVjdChUVCkpLEl0KCgoW3QsZV0pPT50Lm1hcCgodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtwb2ludHM6dC5wb2ludHMubWFwKCh0PT57bGV0IG47c3dpdGNoKGUpe2Nhc2UgeUEuUkVMQVRJVkU6bj10LnJlbGF0aXZlVGltZUluTXM7YnJlYWs7Y2FzZSB5QS5XQUxMX1RJTUU6bj10LndhbGxUaW1lO2JyZWFrO2Nhc2UgeUEuU1RFUDpkZWZhdWx0Om49dC5zdGVwfXJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3g6bn0pfSkpfSkpKSkpLEFlKDEpKTt0aGlzLmRhdGFTZXJpZXMkPW4ucGlwZShmZSh0aGlzLnN0b3JlLnNlbGVjdCh6VCkpLHplKCgoW3Qsbl0pPT57Y29uc3Qgbz10Lm1hcCgoKHtzZXJpZXNJZDp0LHBvaW50czplfSk9Pih7aWQ6dCxwb2ludHM6ZX0pKSk7cmV0dXJuIG48PTA/RXQobyk6Q3QoKGZ1bmN0aW9uIGkodCxlKXt2YXIgbjtyZXR1cm4gZ0EodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtOdW1iZXIuaXNGaW5pdGUoZSl8fChlPTApLGU9TWF0aC5tYXgoMCxNYXRoLm1pbihlLDEpKTtjb25zdCBvPVtdO2Zvcihjb25zdCBpIG9mIHQpe2NvbnN0IHQ9bnVsbD09PShuPWkucG9pbnRzWzBdKXx8dm9pZCAwPT09bj92b2lkIDA6bi55O2lmKGkucG9pbnRzLmV2ZXJ5KChlPT5lLnk9PXQpKSl7by5wdXNoKGkpO2NvbnRpbnVlfWxldCBhPWkucG9pbnRzLmxlbmd0aD4wPzA6TmFOLHI9MDtjb25zdCBzPWkucG9pbnRzLm1hcCgodD0+e2NvbnN0IG49dC55O2lmKE51bWJlci5pc0Zpbml0ZShuKSl7YT1hKmUrKDEtZSkqbixyKys7Y29uc3Qgbz0xPT09ZT8xOjEtTWF0aC5wb3coZSxyKTtyZXR1cm57eDp0LngseTphL299fXJldHVybnt4OnQueCx5Om59fSkpO28ucHVzaCh7aWQ6aS5pZCxwb2ludHM6c30pfXJldHVybiBvfSkpfSkobyxuKSkucGlwZShJdCgodD0+e2NvbnN0IG49by5tYXAoKChuLG8pPT4oe2lkOmUobi5pZCkscG9pbnRzOnRbb10ucG9pbnRzLm1hcCgoKHt5OnR9LGUpPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbi5wb2ludHNbZV0pLHt5OnR9KSkpfSkpKTtyZXR1cm5bLi4ubywuLi5uXX0pKSl9KSksTmUoW10pKSx0aGlzLnNlbGVjdGVkVGltZSQ9V3QoW24sdGhpcy5zdG9yZS5zZWxlY3QoWVQpLHRoaXMuc3RvcmUuc2VsZWN0KFRUKV0pLnBpcGUoSXQoKChbdCxlLG5dKT0+e2lmKG4hPT15QS5TVEVQfHwhZSlyZXR1cm4gbnVsbDtsZXQgbz0xLzAsaT0tMS8wO2Zvcihjb25zdHtwb2ludHM6ZX1vZiB0KWZvcihjb25zdCB0IG9mIGUpbz1vPnQueD90Lng6byxpPWk8dC54P3QueDppO3JldHVybiBIMihlLG8saSl9KSkpLHRoaXMuY2hhcnRNZXRhZGF0YU1hcCQ9bi5waXBlKHplKCh0PT5XdCh0Lm1hcCgodD0+dGhpcy5nZXRSdW5EaXNwbGF5TmFtZSh0LnJ1bklkKS5waXBlKEl0KChlPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2Rpc3BsYXlOYW1lOmV9KSkpKSkpKSkpLGZlKHRoaXMuc3RvcmUuc2VsZWN0KE5OKSx0aGlzLnN0b3JlLnNlbGVjdCh6TiksdGhpcy5zdG9yZS5zZWxlY3QoelQpKSxnZSgwKSxJdCgoKFt0LG4sbyxpXSk9Pnt2YXIgYTtjb25zdCByPXt9LHM9aT4wO2Zvcihjb25zdCBlIG9mIHQpe2NvbnN0e3Nlcmllc0lkOnQscnVuSWQ6aSxkaXNwbGF5TmFtZTpzLHBhcnRpdGlvbkluZGV4OmwscGFydGl0aW9uU2l6ZTpjfT1lO3JbdF09e3R5cGU6UTIuT1JJR0lOQUwsaWQ6dCxkaXNwbGF5TmFtZTpjPjE/YCR7c306ICR7bH1gOnMsdmlzaWJsZTpCb29sZWFuKG4mJm4uZ2V0KGkpKSxjb2xvcjpudWxsIT09KGE9b1tpXSkmJnZvaWQgMCE9PWE/YToiI2ZmZiIsYXV4OiExLG9wYWNpdHk6MX19aWYoIXMpcmV0dXJuIHI7Zm9yKGNvbnN0W3Qsbl1vZiBPYmplY3QuZW50cmllcyhyKSl7Y29uc3Qgbz1lKHQpO3Jbb109T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG4pLHtpZDpvLHR5cGU6UTIuREVSSVZFRCxhdXg6ITEsb3JpZ2luYWxTZXJpZXNJZDp0fSksbi5hdXg9ITAsbi5vcGFjaXR5PS4yNX1yZXR1cm4gcn0pKSxOZSh7fSkpLHRoaXMubG9hZFN0YXRlJD10aGlzLnN0b3JlLnNlbGVjdChnVCx0aGlzLmNhcmRJZCksdGhpcy50YWckPXQucGlwZShJdCgodD0+dC50YWcpKSksdGhpcy50aXRsZSQ9dGhpcy50YWckLnBpcGUoSXQoKHQ9PmYyKHQsdGhpcy5ncm91cE5hbWUpKSkpLHRoaXMuaXNQaW5uZWQkPXRoaXMuc3RvcmUuc2VsZWN0KHdULHRoaXMuY2FyZElkKX1uZ09uRGVzdHJveSgpe3RoaXMubmdVbnN1YnNjcmliZS5uZXh0KCksdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCl9Z2V0UnVuRGlzcGxheU5hbWUodCl7cmV0dXJuIFd0KFt0aGlzLnN0b3JlLnNlbGVjdChyTix7cnVuSWQ6dH0pLHRoaXMuc3RvcmUuc2VsZWN0KHpTKSx0aGlzLnN0b3JlLnNlbGVjdChzTix7cnVuSWQ6dH0pXSkucGlwZShJdCgoKFtlLG4sb10pPT5JMih0LG8sZT9uW2VdOm51bGwpKSkpfXN0ZXBTZXJpZXNUb0xpbmVTZXJpZXModCxlKXtjb25zdCBuPWU9PT15QS5TVEVQO3JldHVybiB0Lm1hcCgodD0+e2NvbnN0IGU9MWUzKnQud2FsbFRpbWU7cmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7eDpuP3Quc3RlcDplLHk6dC52YWx1ZSx3YWxsVGltZTplLHJlbGF0aXZlVGltZUluTXM6MH0pfSkpfX1mdW5jdGlvbiBIZnQodCxlLG4pe2NvbnN0IG89W10se2xlZnQ6aSxyaWdodDphfT1lLHI9KGEtaSkvbjtsZXQgcz0wLGw9MDtmb3IobGV0IGU9MDtlPG47ZSsrKXtjb25zdCBhPWkrZSpyLGM9YStyLGQ9ZT09PW4tMTtsZXQgcD1sO2ZvcihsPTA7czx0Lmxlbmd0aDspe2NvbnN0IGU9dFtzXSxuPUZmdChlLGEsYywhZCk7aWYocCs9bi5jdXJyLGwrPW4ubmV4dCxlLngrZS5keD5jKWJyZWFrO3MrK31vLnB1c2goe3g6YSxkeDpyLHk6cH0pfXJldHVybiBvfWZ1bmN0aW9uIEZmdCh0LGUsbixvKXtjb25zdCBpPXQueCxhPXQueCt0LmR4O2lmKGk+bnx8YTxlKXJldHVybntjdXJyOjAsbmV4dDowfTtpZigwPT09dC5keClyZXR1cm4gbyYmYT09PW4/e2N1cnI6LjUqdC55LG5leHQ6LjUqdC55fTp7Y3Vycjp0LnksbmV4dDowfTtjb25zdCByPU1hdGgubWluKGEsbiktTWF0aC5tYXgoaSxlKTtyZXR1cm57Y3Vycjp0Lnkqci90LmR4LG5leHQ6MH19SWZ0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxJZnQpKFNtKEl3KSl9LElmdC7JtWNtcD10byh7dHlwZTpJZnQsc2VsZWN0b3JzOltbInNjYWxhci1jYXJkIl1dLGlucHV0czp7RGF0YURvd25sb2FkQ29tcG9uZW50OiJEYXRhRG93bmxvYWRDb21wb25lbnQiLGNhcmRJZDoiY2FyZElkIixncm91cE5hbWU6Imdyb3VwTmFtZSJ9LG91dHB1dHM6e2Z1bGxXaWR0aENoYW5nZWQ6ImZ1bGxXaWR0aENoYW5nZWQiLGZ1bGxIZWlnaHRDaGFuZ2VkOiJmdWxsSGVpZ2h0Q2hhbmdlZCIscGluU3RhdGVDaGFuZ2VkOiJwaW5TdGF0ZUNoYW5nZWQifSxkZWNsczoxNCx2YXJzOjQzLGNvbnN0czpbWyJvYnNlcnZlSW50ZXJzZWN0aW9uIiwiIiwzLCJjYXJkSWQiLCJjaGFydE1ldGFkYXRhTWFwIiwiRGF0YURvd25sb2FkQ29tcG9uZW50IiwiZGF0YVNlcmllcyIsImlnbm9yZU91dGxpZXJzIiwiaXNDYXJkVmlzaWJsZSIsImlzUGlubmVkIiwibG9hZFN0YXRlIiwic2hvd0Z1bGxTaXplIiwic21vb3RoaW5nRW5hYmxlZCIsInRhZyIsInRpdGxlIiwidG9vbHRpcFNvcnQiLCJ4QXhpc1R5cGUiLCJ4U2NhbGVUeXBlIiwidXNlRGFya01vZGUiLCJzZWxlY3RlZFRpbWUiLCJvbkZ1bGxTaXplVG9nZ2xlIiwib25QaW5DbGlja2VkIiwib25WaXNpYmlsaXR5Q2hhbmdlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJzY2FsYXItY2FyZC1jb21wb25lbnQiLDApLFZtKCJvbkZ1bGxTaXplVG9nZ2xlIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uRnVsbFNpemVUb2dnbGUoKX0pKSgib25QaW5DbGlja2VkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5waW5TdGF0ZUNoYW5nZWQuZW1pdChlKX0pKSgib25WaXNpYmlsaXR5Q2hhbmdlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblZpc2liaWxpdHlDaGFuZ2UoZSl9KSksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQWgoNCwiYXN5bmMiKSxBaCg1LCJhc3luYyIpLEFoKDYsImFzeW5jIiksQWgoNywiYXN5bmMiKSxBaCg4LCJhc3luYyIpLEFoKDksImFzeW5jIiksQWgoMTAsImFzeW5jIiksQWgoMTEsImFzeW5jIiksQWgoMTIsImFzeW5jIiksQWgoMTMsImFzeW5jIiksQW0oKSksMiZlJiZEbSgiY2FyZElkIixuLmNhcmRJZCkoImNoYXJ0TWV0YWRhdGFNYXAiLFRoKDEsMTcsbi5jaGFydE1ldGFkYXRhTWFwJCkpKCJEYXRhRG93bmxvYWRDb21wb25lbnQiLG4uRGF0YURvd25sb2FkQ29tcG9uZW50KSgiZGF0YVNlcmllcyIsVGgoMiwxOSxuLmRhdGFTZXJpZXMkKSkoImlnbm9yZU91dGxpZXJzIixUaCgzLDIxLG4uaWdub3JlT3V0bGllcnMkKSkoImlzQ2FyZFZpc2libGUiLG4uaXNWaXNpYmxlKSgiaXNQaW5uZWQiLFRoKDQsMjMsbi5pc1Bpbm5lZCQpKSgibG9hZFN0YXRlIixUaCg1LDI1LG4ubG9hZFN0YXRlJCkpKCJzaG93RnVsbFNpemUiLG4uc2hvd0Z1bGxTaXplKSgic21vb3RoaW5nRW5hYmxlZCIsVGgoNiwyNyxuLnNtb290aGluZ0VuYWJsZWQkKSkoInRhZyIsVGgoNywyOSxuLnRhZyQpKSgidGl0bGUiLFRoKDgsMzEsbi50aXRsZSQpKSgidG9vbHRpcFNvcnQiLFRoKDksMzMsbi50b29sdGlwU29ydCQpKSgieEF4aXNUeXBlIixUaCgxMCwzNSxuLnhBeGlzVHlwZSQpKSgieFNjYWxlVHlwZSIsVGgoMTEsMzcsbi54U2NhbGVUeXBlJCkpKCJ1c2VEYXJrTW9kZSIsVGgoMTIsMzksbi51c2VEYXJrTW9kZSQpKSgic2VsZWN0ZWRUaW1lIixUaCgxMyw0MSxuLnNlbGVjdGVkVGltZSQpKX0sZGlyZWN0aXZlczpbVGZ0LE5mdF0scGlwZXM6W3dNXSxzdHlsZXM6WyJbX25naG9zdC0lQ09NUCVdIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIH0iXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoSWZ0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InNjYWxhci1jYXJkIix0ZW1wbGF0ZTonXG4gICAgPHNjYWxhci1jYXJkLWNvbXBvbmVudFxuICAgICAgW2NhcmRJZF09ImNhcmRJZCJcbiAgICAgIFtjaGFydE1ldGFkYXRhTWFwXT0iY2hhcnRNZXRhZGF0YU1hcCQgfCBhc3luYyJcbiAgICAgIFtEYXRhRG93bmxvYWRDb21wb25lbnRdPSJEYXRhRG93bmxvYWRDb21wb25lbnQiXG4gICAgICBbZGF0YVNlcmllc109ImRhdGFTZXJpZXMkIHwgYXN5bmMiXG4gICAgICBbaWdub3JlT3V0bGllcnNdPSJpZ25vcmVPdXRsaWVycyQgfCBhc3luYyJcbiAgICAgIFtpc0NhcmRWaXNpYmxlXT0iaXNWaXNpYmxlIlxuICAgICAgW2lzUGlubmVkXT0iaXNQaW5uZWQkIHwgYXN5bmMiXG4gICAgICBbbG9hZFN0YXRlXT0ibG9hZFN0YXRlJCB8IGFzeW5jIlxuICAgICAgW3Nob3dGdWxsU2l6ZV09InNob3dGdWxsU2l6ZSJcbiAgICAgIFtzbW9vdGhpbmdFbmFibGVkXT0ic21vb3RoaW5nRW5hYmxlZCQgfCBhc3luYyJcbiAgICAgIFt0YWddPSJ0YWckIHwgYXN5bmMiXG4gICAgICBbdGl0bGVdPSJ0aXRsZSQgfCBhc3luYyJcbiAgICAgIFt0b29sdGlwU29ydF09InRvb2x0aXBTb3J0JCB8IGFzeW5jIlxuICAgICAgW3hBeGlzVHlwZV09InhBeGlzVHlwZSQgfCBhc3luYyJcbiAgICAgIFt4U2NhbGVUeXBlXT0ieFNjYWxlVHlwZSQgfCBhc3luYyJcbiAgICAgIFt1c2VEYXJrTW9kZV09InVzZURhcmtNb2RlJCB8IGFzeW5jIlxuICAgICAgW3NlbGVjdGVkVGltZV09InNlbGVjdGVkVGltZSQgfCBhc3luYyJcbiAgICAgIChvbkZ1bGxTaXplVG9nZ2xlKT0ib25GdWxsU2l6ZVRvZ2dsZSgpIlxuICAgICAgKG9uUGluQ2xpY2tlZCk9InBpblN0YXRlQ2hhbmdlZC5lbWl0KCRldmVudCkiXG4gICAgICBvYnNlcnZlSW50ZXJzZWN0aW9uXG4gICAgICAob25WaXNpYmlsaXR5Q2hhbmdlKT0ib25WaXNpYmlsaXR5Q2hhbmdlKCRldmVudCkiXG4gICAgPjwvc2NhbGFyLWNhcmQtY29tcG9uZW50PlxuICAnLHN0eWxlczpbIlxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgfVxuICAgICJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSkse0RhdGFEb3dubG9hZENvbXBvbmVudDpbe3R5cGU6eHl9XSxjYXJkSWQ6W3t0eXBlOnh5fV0sZ3JvdXBOYW1lOlt7dHlwZTp4eX1dLGZ1bGxXaWR0aENoYW5nZWQ6W3t0eXBlOk95fV0sZnVsbEhlaWdodENoYW5nZWQ6W3t0eXBlOk95fV0scGluU3RhdGVDaGFuZ2VkOlt7dHlwZTpPeX1dfSk7Y29uc3QgTGZ0PVsibWFpbiJdLEJmdD1bInhBeGlzIl0sVmZ0PVsieUF4aXMiXSxqZnQ9WyJjb250ZW50Il0sVWZ0PVsiaGlzdG9ncmFtcyJdO2Z1bmN0aW9uIEdmdCh0LGUpe2lmKDEmdCYmKHFpKCksUm0oMCwiZyIpLFJtKDEsInRleHQiKSxrdSgyKSxBbSgpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpO2R1KCJ0cmFuc2Zvcm0iLHQuZ2V0Q3NzVHJhbnNsYXRlUHgodC50b29sdGlwRGF0YS54QXhpcy5wb3NpdGlvbiw5KSkscmMoMiksU3UodC50b29sdGlwRGF0YS54QXhpcy5sYWJlbCl9fWZ1bmN0aW9uIFdmdCh0LGUpe2lmKDEmdCYmKHFpKCksUm0oMCwiZyIpLFJtKDEsInRleHQiKSxrdSgyKSxBbSgpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpO2R1KCJ0cmFuc2Zvcm0iLHQuZ2V0R3JvdXBUcmFuc2Zvcm0odC50b29sdGlwRGF0YS5jbG9zZXN0RGF0dW0pKSxyYygxKSxqcCgieSIsdC50b29sdGlwRGF0YS55QXhpcy5wb3NpdGlvbikscmMoMSksRHUoIiAiLHQudG9vbHRpcERhdGEueUF4aXMubGFiZWwsIiAiKX19ZnVuY3Rpb24gWWZ0KHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2IiwxNiksVG0oMSwibGlua2VkLXRpbWUtZm9iIiwxNyksQW0oKSksMiZ0KXtjb25zdCB0PVltKDIpO2R1KCJ0cmFuc2Zvcm0iLHQuZ2V0Q3NzVHJhbnNsYXRlUHgoMCx0LnNjYWxlcy50ZW1wb3JhbFNjYWxlKHQubGlua2VkVGltZS5lbmRTdGVwKSkpLHJjKDEpLERtKCJzdGVwIix0LmxpbmtlZFRpbWUuZW5kU3RlcCl9fWZ1bmN0aW9uIHFmdCh0LGUpe2lmKDEmdCYmKHFpKCksWmkoKSxObSgwKSxSbSgxLCJkaXYiLDE2KSxUbSgyLCJsaW5rZWQtdGltZS1mb2IiLDE3KSxBbSgpLFFwKDMsWWZ0LDIsMywiZGl2IiwxOCksem0oKSksMiZ0KXtjb25zdCB0PVltKCk7cmMoMSksZHUoInRyYW5zZm9ybSIsdC5nZXRDc3NUcmFuc2xhdGVQeCgwLHQuc2NhbGVzLnRlbXBvcmFsU2NhbGUodC5saW5rZWRUaW1lLnN0YXJ0U3RlcCkpKSxyYygxKSxEbSgic3RlcCIsdC5saW5rZWRUaW1lLnN0YXJ0U3RlcCkscmMoMSksRG0oIm5nSWYiLHQubGlua2VkVGltZS5lbmRTdGVwKX19ZnVuY3Rpb24gWmZ0KHQsZSl7aWYoMSZ0JiYocWkoKSxSbSgwLCJnIiksVG0oMSwibGluZSIsMTkpLEFtKCkpLDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdDtkdSgidHJhbnNmb3JtIixZbSgpLmdldENzc1RyYW5zbGF0ZVB4KDAsdCkpfX1mdW5jdGlvbiBYZnQodCxlKXsxJnQmJihxaSgpLFRtKDAsImxpbmUiLDIyKSl9ZnVuY3Rpb24gS2Z0KHQsZSl7aWYoMSZ0JiYocWkoKSxUbSgwLCJjaXJjbGUiLDIzKSksMiZ0KXtjb25zdCB0PVltKCkuJGltcGxpY2l0LGU9WW0oKTtkdSgidHJhbnNmb3JtIixlLmdldENzc1RyYW5zbGF0ZVB4KGUuZ2V0VWlDb29yZEZyb21CaW5Gb3JDb250ZW50KGUuZ2V0Q2xvc2VzdEJpbkZyb21CaW5Db29yZGluYXRlKHQsZS50b29sdGlwRGF0YS54UG9zaXRpb25JbkJpbkNvb3JkKSkueCxlLmdldFVpQ29vcmRGcm9tQmluRm9yQ29udGVudChlLmdldENsb3Nlc3RCaW5Gcm9tQmluQ29vcmRpbmF0ZSh0LGUudG9vbHRpcERhdGEueFBvc2l0aW9uSW5CaW5Db29yZCkpLnkpKX19ZnVuY3Rpb24gSmZ0KHQsZSl7aWYoMSZ0JiYocWkoKSxSbSgwLCJnIiksUXAoMSxYZnQsMSwwLCJsaW5lIiwyMCksVG0oMiwicGF0aCIpLFFwKDMsS2Z0LDEsMiwiY2lyY2xlIiwyMSksQW0oKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oKTtkdSgidHJhbnNmb3JtIixuLmdldEdyb3VwVHJhbnNmb3JtKHQpKSgiY29sb3IiLG4uZ2V0SGlzdG9ncmFtRmlsbCh0KSkscHUoImhpc3RvZ3JhbSIsITApKCJuby1jb2xvciIsIW4uaXNEYXR1bUluTGlua2VkVGltZVJhbmdlKHQpKSxyYygxKSxEbSgibmdJZiIsbi5tb2RlPT09bi5IaXN0b2dyYW1Nb2RlLk9GRlNFVCkscmMoMSksanAoImQiLG4uZ2V0SGlzdG9ncmFtUGF0aCh0KSkscmMoMSksRG0oIm5nSWYiLG4udG9vbHRpcERhdGEpfX1mdW5jdGlvbiBRZnQodCxlKXtpZigxJnQmJihxaSgpLFRtKDAsImNpcmNsZSIsMjMpKSwyJnQpe2NvbnN0IHQ9WW0oMik7anAoImN4Iix0LmdldFVpQ29vcmRGcm9tQmluRm9yQ29udGVudCh0LnRvb2x0aXBEYXRhLmNsb3Nlc3RCaW4pLngpKCJjeSIsdC5nZXRVaUNvb3JkRnJvbUJpbkZvckNvbnRlbnQodC50b29sdGlwRGF0YS5jbG9zZXN0QmluKS55KX19ZnVuY3Rpb24gJGZ0KHQsZSl7aWYoMSZ0JiYocWkoKSxSbSgwLCJnIiw0KSxSbSgxLCJnIiksVG0oMiwicGF0aCIpLFFwKDMsUWZ0LDEsMiwiY2lyY2xlIiwyNCksQW0oKSxSbSg0LCJnIiwyNSksUm0oNSwidGV4dCIsMjYpLGt1KDYpLEFtKCksQW0oKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtyYygxKSxkdSgidHJhbnNmb3JtIix0LmdldEdyb3VwVHJhbnNmb3JtKHQudG9vbHRpcERhdGEuY2xvc2VzdERhdHVtKSkscmMoMSksanAoImQiLHQuZ2V0SGlzdG9ncmFtUGF0aCh0LnRvb2x0aXBEYXRhLmNsb3Nlc3REYXR1bSkpLHJjKDEpLERtKCJuZ0lmIix0LnRvb2x0aXBEYXRhLmNsb3Nlc3RCaW4pLHJjKDEpLGR1KCJ0cmFuc2Zvcm0iLHQuZ2V0Q3NzVHJhbnNsYXRlUHgodC50b29sdGlwRGF0YS52YWx1ZS5wb3NpdGlvbi54LHQudG9vbHRpcERhdGEudmFsdWUucG9zaXRpb24ueSkpLHJjKDIpLFN1KHQudG9vbHRpcERhdGEudmFsdWUubGFiZWwpfX1jbGFzcyB0Z3R7Y29uc3RydWN0b3IodCl7dGhpcy5jaGFuZ2VEZXRlY3Rvcj10LHRoaXMubW9kZT1wRS5PRkZTRVQsdGhpcy50aW1lUHJvcGVydHk9ZEUuU1RFUCx0aGlzLmxpbmtlZFRpbWU9bnVsbCx0aGlzLkhpc3RvZ3JhbU1vZGU9cEUsdGhpcy5UaW1lUHJvcGVydHk9ZEUsdGhpcy50b29sdGlwRGF0YT1udWxsLHRoaXMubmdVbnN1YnNjcmliZT1uZXcgSSx0aGlzLmxheW91dD17aGlzdG9ncmFtSGVpZ2h0OjAsY29udGVudENsaWVudFJlY3Q6e2hlaWdodDowLHdpZHRoOjB9fSx0aGlzLnNjYWxlcz1udWxsLHRoaXMuZm9ybWF0dGVycz17YmluTnVtYmVyOkV0dCgiLjN+cyIpLGNvdW50OkV0dCgiLjNuIiksd2FsbFRpbWU6V2V0KCIlbS8lZCAlWCIpLHN0ZXA6RXR0KCIuMGYiKSxyZWxhdGl2ZTp0PT5FdHQoIi4xciIpKHQvMzZlNSkrImgifSx0aGlzLmRvbVZpc2libGU9ITF9bmdPbkNoYW5nZXMoKXt0aGlzLnVwZGF0ZUNoYXJ0SWZWaXNpYmxlKCl9bmdPbkRlc3Ryb3koKXt0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpLHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpfW5nQWZ0ZXJWaWV3SW5pdCgpe29lKHRoaXMubWFpbi5uYXRpdmVFbGVtZW50LCJtb3VzZW1vdmUiLHtwYXNzaXZlOiEwfSkucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpKS5zdWJzY3JpYmUoKHQ9PnRoaXMub25Nb3VzZU1vdmUodCkpKX1nZXRDc3NUcmFuc2xhdGVQeCh0LGUpe3JldHVybmB0cmFuc2xhdGUoJHt0fXB4LCAke2V9cHgpYH1nZXRDbG9zZXN0QmluRnJvbUJpbkNvb3JkaW5hdGUodCxlKXtpZighdC5iaW5zLmxlbmd0aClyZXR1cm57eDowLGR4OjAseTowfTtjb25zdCBuPXQuYmluc1swXSxvPXQuYmlucy5zbGljZSgtMSlbMF07cmV0dXJuIGU8bi54P246ZT49by54K28uZHg/bzp0LmJpbnMuZmluZCgodD0+dC54PD1lJiZlPHQueCt0LmR4KSl9Z2V0VWlDb29yZEZyb21CaW5Gb3JDb250ZW50KHQpe3JldHVybiB0aGlzLnNjYWxlcz97eDp0aGlzLnNjYWxlcy5iaW5TY2FsZShvZ3QodCkpLHk6dGhpcy5zY2FsZXMuY291bnRTY2FsZSh0LnkpfTp7eDowLHk6MH19Z2V0SGlzdG9ncmFtUGF0aCh0KXtpZighdGhpcy5zY2FsZXN8fCF0LmJpbnMubGVuZ3RoKXJldHVybiIiO2NvbnN0IGU9dGhpcy5zY2FsZXMuYmluU2NhbGUsbj10aGlzLnNjYWxlcy5jb3VudFNjYWxlLG89dC5iaW5zWzBdLGk9dC5iaW5zLnNsaWNlKC0xKVswXSxhPVtgTSR7ZShvZ3QobykpfSwke24oMCl9YF07Zm9yKGNvbnN0IG8gb2YgdC5iaW5zKWEucHVzaChgTCR7ZShvZ3QobykpfSwke24oby55KX1gKTtyZXR1cm4gYS5wdXNoKGBMJHtlKG9ndChpKSl9LCR7bigwKX1gKSxhLmpvaW4oIiIpfXRyYWNrQnlXYWxsVGltZSh0KXtyZXR1cm4gdC53YWxsVGltZX1nZXRHcm91cFRyYW5zZm9ybSh0KXtyZXR1cm4gdGhpcy5zY2FsZXMmJnRoaXMubW9kZSE9PXBFLk9WRVJMQVk/dGhpcy5nZXRDc3NUcmFuc2xhdGVQeCgwLHRoaXMuc2NhbGVzLnRlbXBvcmFsU2NhbGUodGhpcy5nZXRUaW1lVmFsdWUodCkpKToiIn1pc0xpbmtlZFRpbWVFbmFibGVkKHQpe3JldHVybiBCb29sZWFuKHRoaXMubW9kZT09PXBFLk9GRlNFVCYmdGhpcy50aW1lUHJvcGVydHk9PT1kRS5TVEVQJiZ0aGlzLnNjYWxlcyYmdCl9aXNEYXR1bUluTGlua2VkVGltZVJhbmdlKHQpe3JldHVybiF0aGlzLmlzTGlua2VkVGltZUVuYWJsZWQodGhpcy5saW5rZWRUaW1lKXx8KG51bGw9PT10aGlzLmxpbmtlZFRpbWUuZW5kU3RlcD90aGlzLmxpbmtlZFRpbWUuc3RhcnRTdGVwPT09dC5zdGVwOnRoaXMubGlua2VkVGltZS5zdGFydFN0ZXA8PXQuc3RlcCYmdGhpcy5saW5rZWRUaW1lLmVuZFN0ZXA+PXQuc3RlcCl9Z2V0SGlzdG9ncmFtRmlsbCh0KXtyZXR1cm4gdGhpcy5zY2FsZXM/dGhpcy5zY2FsZXMuZDNDb2xvclNjYWxlKHRoaXMuZ2V0VGltZVZhbHVlKHQpKToiIn1nZXRHcmlkVGlja1lMb2NzKCl7aWYoIXRoaXMuc2NhbGVzfHx0aGlzLm1vZGU9PT1wRS5PRkZTRVQpcmV0dXJuW107Y29uc3QgdD10aGlzLnNjYWxlcy5jb3VudFNjYWxlO3JldHVybiB0LnRpY2tzKCkubWFwKChlPT50KGUpKSl9b25SZXNpemUoKXt0aGlzLnVwZGF0ZUNsaWVudFJlY3RzKCksdGhpcy51cGRhdGVDaGFydElmVmlzaWJsZSgpfW9uVmlzaWJpbGl0eUNoYW5nZSh7dmlzaWJsZTp0fSl7dGhpcy5kb21WaXNpYmxlPXQsdCYmKHRoaXMudXBkYXRlQ2xpZW50UmVjdHMoKSx0aGlzLnVwZGF0ZUNoYXJ0SWZWaXNpYmxlKCkpfWdldFRpbWVWYWx1ZSh0KXtzd2l0Y2godGhpcy50aW1lUHJvcGVydHkpe2Nhc2UgZEUuV0FMTF9USU1FOnJldHVybiB0LndhbGxUaW1lO2Nhc2UgZEUuU1RFUDpyZXR1cm4gdC5zdGVwO2Nhc2UgZEUuUkVMQVRJVkU6cmV0dXJuIHQud2FsbFRpbWUtdGhpcy5kYXRhWzBdLndhbGxUaW1lfX11cGRhdGVDbGllbnRSZWN0cygpe3RoaXMuY29udGVudCYmKHRoaXMubGF5b3V0LmNvbnRlbnRDbGllbnRSZWN0PXRoaXMuY29udGVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHRoaXMubGF5b3V0Lmhpc3RvZ3JhbUhlaWdodD10aGlzLmxheW91dC5jb250ZW50Q2xpZW50UmVjdC5oZWlnaHQvMi41KX11cGRhdGVDaGFydElmVmlzaWJsZSgpe3RoaXMuZG9tVmlzaWJsZSYmKHRoaXMuc2NhbGVzPXRoaXMuY29tcHV0ZVNjYWxlcyh0aGlzLmRhdGEpLHRoaXMucmVuZGVyWEF4aXMoKSx0aGlzLnJlbmRlcllBeGlzKCksdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCkpfWNvbXB1dGVTY2FsZXModCl7Y29uc3R7d2lkdGg6ZSxoZWlnaHQ6bn09dGhpcy5sYXlvdXQuY29udGVudENsaWVudFJlY3Qse21pbjpvLG1heDppfT1uZ3QodCwodD0+KGZ1bmN0aW9uIGUodCxuKXtyZXR1cm4gdC5yZWR1Y2UoKCh0LGUpPT5NYXRoLm1pbih0LG4oZSkpKSwxLzApfSkodC5iaW5zLCh0PT50LngpKSksKHQ9PmVndCh0LmJpbnMsKCh7eDp0LGR4OmV9KT0+dCtlKSkpKSxhPWVndCh0LCh0PT5lZ3QodC5iaW5zLCgoe3k6dH0pPT50KSkpKSxyPWVldCgpLmRvbWFpbihbbyxpXSkubmljZSgpLHM9dGhpcy5tb2RlIT09cEUuT1ZFUkxBWSYmdGhpcy50aW1lUHJvcGVydHk9PWRFLldBTExfVElNRT9mb3QoKTplZXQoKSxsPXQubWFwKCh0PT50aGlzLmdldFRpbWVWYWx1ZSh0KSkpLHttaW46YyxtYXg6ZH09bmd0KGwsKHQ9PnQpKSxwPVtjLGRdO3MuZG9tYWluKHApO2NvbnN0IG09ZWV0KCk7bS5kb21haW4oWzAsYV0pO2NvbnN0IHU9UzcodGhpcy5jb2xvcnx8IiMwMDAiKSxmPWVldCgpO3JldHVybiBmLmRvbWFpbihwKSxyLnJhbmdlKFswLGVdKSxmLnJhbmdlKFt1LmJyaWdodGVyKCksdS5kYXJrZXIoKV0pLGYuaW50ZXJwb2xhdGUobTgpLHRoaXMubW9kZT09PXBFLk9WRVJMQVk/KHMucmFuZ2UoW24sbl0pLG0ucmFuZ2UoW24sMF0pKToocy5yYW5nZShbbi0odGhpcy5tb2RlPT09cEUuT0ZGU0VUP24tdGhpcy5sYXlvdXQuaGlzdG9ncmFtSGVpZ2h0OjApLG5dKSxtLnJhbmdlKFswLC10aGlzLmxheW91dC5oaXN0b2dyYW1IZWlnaHRdKSkse2JpblNjYWxlOnIsZDNDb2xvclNjYWxlOmYsY291bnRTY2FsZTptLHRlbXBvcmFsU2NhbGU6c319cmVuZGVyWEF4aXMoKXtpZighdGhpcy5zY2FsZXMpcmV0dXJuO2NvbnN0e3dpZHRoOnR9PXRoaXMubGF5b3V0LmNvbnRlbnRDbGllbnRSZWN0LGU9ejUodGhpcy5zY2FsZXMuYmluU2NhbGUpLnRpY2tzKE1hdGgubWF4KDIsdC8yMCkpO2UudGlja0Zvcm1hdCh0aGlzLmZvcm1hdHRlcnMuYmluTnVtYmVyKSxlKEo0KHRoaXMueEF4aXMubmF0aXZlRWxlbWVudCkpfWdldFlBeGlzRm9ybWF0dGVyKCl7aWYodGhpcy5tb2RlPT09cEUuT1ZFUkxBWSlyZXR1cm4gdGhpcy5mb3JtYXR0ZXJzLmNvdW50O3N3aXRjaCh0aGlzLnRpbWVQcm9wZXJ0eSl7Y2FzZSBkRS5XQUxMX1RJTUU6cmV0dXJuIHRoaXMuZm9ybWF0dGVycy53YWxsVGltZTtjYXNlIGRFLlNURVA6cmV0dXJuIHRoaXMuZm9ybWF0dGVycy5zdGVwO2Nhc2UgZEUuUkVMQVRJVkU6cmV0dXJuIHRoaXMuZm9ybWF0dGVycy5yZWxhdGl2ZTtkZWZhdWx0OnRocm93IFJhbmdlRXJyb3IoYFkgYXhpcyBmb3JtYXR0ZXIgZm9yICR7dGhpcy50aW1lUHJvcGVydHl9IG11c3QgYmUgaW1wbGVtZW50ZWRgKX19cmVuZGVyWUF4aXMoKXtpZighdGhpcy5zY2FsZXMpcmV0dXJuO2NvbnN0IHQ9dGhpcy5tb2RlPT09cEUuT1ZFUkxBWT90aGlzLnNjYWxlcy5jb3VudFNjYWxlOnRoaXMuc2NhbGVzLnRlbXBvcmFsU2NhbGUse2hlaWdodDplfT10aGlzLmxheW91dC5jb250ZW50Q2xpZW50UmVjdCxuPU41KHQpLnRpY2tzKE1hdGgubWF4KDIsZS8xNSkpO24udGlja0Zvcm1hdCh0aGlzLmdldFlBeGlzRm9ybWF0dGVyKCkpLG4oSjQodGhpcy55QXhpcy5uYXRpdmVFbGVtZW50KSl9ZmluZENsb3Nlc3REYXR1bUluZGV4KHQpe2xldCBlPXQudGFyZ2V0LG49ZTtmb3IoO2UmJmUhPT10aGlzLmhpc3RvZ3JhbXMubmF0aXZlRWxlbWVudDspbj1lLGU9ZS5wYXJlbnRFbGVtZW50O3JldHVybiBlP0FycmF5LmZyb20oZS5jaGlsZHJlbikuaW5kZXhPZihuKTotMX1vbk1vdXNlTW92ZUZvclRlc3RPbmx5KHQpe3JldHVybiB0aGlzLm9uTW91c2VNb3ZlKHQpfW9uTW91c2VNb3ZlKHQpe2lmKCF0aGlzLnNjYWxlcylyZXR1cm47Y29uc3QgZT10Lm9mZnNldFgsbj10Lm9mZnNldFksbz10aGlzLmZpbmRDbG9zZXN0RGF0dW1JbmRleCh0KTtpZihvPDApcmV0dXJuO2NvbnN0IGk9dGhpcy5zY2FsZXMuYmluU2NhbGUuaW52ZXJ0KGUpLGE9dGhpcy5kYXRhW29dLHI9dGhpcy5nZXRDbG9zZXN0QmluRnJvbUJpbkNvb3JkaW5hdGUoYSxpKTt0aGlzLnRvb2x0aXBEYXRhPXt2YWx1ZTp7cG9zaXRpb246e3g6ZSx5Om59LGxhYmVsOnRoaXMubW9kZT09PXBFLk9GRlNFVD90aGlzLmZvcm1hdHRlcnMuY291bnQoci55KTpgU3RlcDogJHt0aGlzLmZvcm1hdHRlcnMuc3RlcChhLnN0ZXApfWB9LHhBeGlzOntwb3NpdGlvbjp0aGlzLmdldFVpQ29vcmRGcm9tQmluRm9yQ29udGVudChyKS54LGxhYmVsOnRoaXMuZm9ybWF0dGVycy5iaW5OdW1iZXIob2d0KHIpKX0seUF4aXM6e3Bvc2l0aW9uOnRoaXMuc2NhbGVzLmNvdW50U2NhbGUodGhpcy5tb2RlPT09cEUuT0ZGU0VUPzA6ci55KSxsYWJlbDp0aGlzLm1vZGU9PT1wRS5PRkZTRVQ/dGhpcy5nZXRZQXhpc0Zvcm1hdHRlcigpKHRoaXMuZ2V0VGltZVZhbHVlKGEpKTp0aGlzLmZvcm1hdHRlcnMuYmluTnVtYmVyKHIueSl9LHhQb3NpdGlvbkluQmluQ29vcmQ6aSxjbG9zZXN0RGF0dW06YSxjbG9zZXN0QmluOnJ9LHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpfX1mdW5jdGlvbiBlZ3QodCxlKXtyZXR1cm4gdC5yZWR1Y2UoKCh0LG4pPT5NYXRoLm1heCh0LGUobikpKSwtMS8wKX1mdW5jdGlvbiBuZ3QodCxlLG4pe258fChuPWUpO2xldCBvPTEvMCxpPS0xLzA7Zm9yKGNvbnN0IGEgb2YgdClvPU1hdGgubWluKG8sZShhKSksaT1NYXRoLm1heChpLG4oYSkpO3JldHVybnttaW46byxtYXg6aX19ZnVuY3Rpb24gb2d0KHQpe3JldHVybiB0LngrLjUqdC5keH1mdW5jdGlvbiBpZ3QodCxlKXsxJnQmJlRtKDAsInZpcy1zZWxlY3RlZC10aW1lLWNsaXBwZWQiKX1mdW5jdGlvbiBhZ3QodCxlKXsxJnQmJihSbSgwLCJzcGFuIiwxNCksVG0oMSwibWF0LXNwaW5uZXIiLDE1KSxBbSgpKX10Z3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHRndCkoU20oVWcpKX0sdGd0Lsm1Y21wPXRvKHt0eXBlOnRndCxzZWxlY3RvcnM6W1sidGItaGlzdG9ncmFtIl1dLHZpZXdRdWVyeTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoUWgoTGZ0LDUpLFFoKEJmdCw1KSxRaChWZnQsNSksUWgoamZ0LDUpLFFoKFVmdCw1KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5tYWluPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLnhBeGlzPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLnlBeGlzPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLmNvbnRlbnQ9dC5maXJzdCksSmgodD10YigpKSYmKG4uaGlzdG9ncmFtcz10LmZpcnN0KX19LGlucHV0czp7bW9kZToibW9kZSIsdGltZVByb3BlcnR5OiJ0aW1lUHJvcGVydHkiLGNvbG9yOiJjb2xvciIsZGF0YToiZGF0YSIsbGlua2VkVGltZToibGlua2VkVGltZSJ9LGZlYXR1cmVzOltCb10sZGVjbHM6MjIsdmFyczoxNyxjb25zdHM6W1siZGV0ZWN0UmVzaXplIiwiIiwib2JzZXJ2ZUludGVyc2VjdGlvbiIsIiIsMywib25SZXNpemUiLCJvblZpc2liaWxpdHlDaGFuZ2UiXSxbIm1haW4iLCIiXSxbMSwiYXhpcyIsIngtYXhpcyJdLFsieEF4aXMiLCIiXSxbMSwidG9vbHRpcCJdLFszLCJ0cmFuc2Zvcm0iLDQsIm5nSWYiXSxbMSwiYXhpcyIsInktYXhpcyJdLFsieUF4aXMiLCIiXSxbNCwibmdJZiJdLFsxLCJjb250ZW50Il0sWyJjb250ZW50IiwiIl0sWzEsImdyaWQiXSxbMywidHJhbnNmb3JtIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbImhpc3RvZ3JhbXMiLCIiXSxbMywidHJhbnNmb3JtIiwiaGlzdG9ncmFtIiwibm8tY29sb3IiLCJjb2xvciIsNCwibmdGb3IiLCJuZ0Zvck9mIiwibmdGb3JUcmFja0J5Il0sWyJjbGFzcyIsInRvb2x0aXAiLDQsIm5nSWYiXSxbMSwibGlua2VkLXRpbWUiXSxbMSwibGlua2VkLXRpbWUtZm9iIiwzLCJzdGVwIl0sWyJjbGFzcyIsImxpbmtlZC10aW1lIiwzLCJ0cmFuc2Zvcm0iLDQsIm5nSWYiXSxbIngyIiwiMTAwJSIsMSwidGljayJdLFsiY2xhc3MiLCJiYXNlbGluZSIsIngyIiwiMTAwJSIsNCwibmdJZiJdLFsiciIsIjIiLDMsInRyYW5zZm9ybSIsNCwibmdJZiJdLFsieDIiLCIxMDAlIiwxLCJiYXNlbGluZSJdLFsiciIsIjIiXSxbInIiLCIyIiw0LCJuZ0lmIl0sWzEsInZhbHVlLWxhYmVsIl0sWyJ4IiwiMyIsInkiLCItMyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiZGl2IiwwLDEpLFZtKCJvblJlc2l6ZSIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblJlc2l6ZSgpfSkpKCJvblZpc2liaWxpdHlDaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uVmlzaWJpbGl0eUNoYW5nZShlKX0pKSxxaSgpLFJtKDIsInN2ZyIsMiksVG0oMywiZyIsbnVsbCwzKSxSbSg1LCJnIiw0KSxRcCg2LEdmdCwzLDMsImciLDUpLEFtKCksQW0oKSxaaSgpLFJtKDcsImRpdiIsNikscWkoKSxSbSg4LCJzdmciKSxUbSg5LCJnIixudWxsLDcpLFJtKDExLCJnIiw0KSxRcCgxMixXZnQsMyw0LCJnIiw1KSxBbSgpLEFtKCksUXAoMTMscWZ0LDQsNCwibmctY29udGFpbmVyIiw4KSxBbSgpLFJtKDE0LCJzdmciLDksMTApLFJtKDE2LCJnIiwxMSksUXAoMTcsWmZ0LDIsMiwiZyIsMTIpLEFtKCksUm0oMTgsImciLG51bGwsMTMpLFFwKDIwLEpmdCw0LDExLCJnIiwxNCksQW0oKSxRcCgyMSwkZnQsNyw3LCJnIiwxNSksQW0oKSxBbSgpKSwyJmUmJihmdSgibWFpbiAiK24ubW9kZSsiICIrbi50aW1lUHJvcGVydHkpLHJjKDYpLERtKCJuZ0lmIixuLnRvb2x0aXBEYXRhKSxyYyg1KSxkdSgidHJhbnNmb3JtIixuLmdldENzc1RyYW5zbGF0ZVB4KDksMCkpLHJjKDEpLERtKCJuZ0lmIixuLnRvb2x0aXBEYXRhKSxyYygxKSxEbSgibmdJZiIsbi5pc0xpbmtlZFRpbWVFbmFibGVkKG4ubGlua2VkVGltZSkpLHJjKDQpLERtKCJuZ0Zvck9mIixuLmdldEdyaWRUaWNrWUxvY3MoKSkscmMoMSkscHUoImhpc3RvZ3JhbXMiLCEwKSgibGlua2VkLXRpbWUtZW5hYmxlZCIsbi5saW5rZWRUaW1lKSgibGlua2VkLXRpbWUtc2luZ2xlLXN0ZXAiLG4ubGlua2VkVGltZSYmIW4ubGlua2VkVGltZS5lbmRTdGVwKSxyYygyKSxEbSgibmdGb3JPZiIsbi5kYXRhKSgibmdGb3JUcmFja0J5IixuLnRyYWNrQnlXYWxsVGltZSkscmMoMSksRG0oIm5nSWYiLG4udG9vbHRpcERhdGEpKX0sZGlyZWN0aXZlczpbb0osTmZ0LGRNLGxNLGhmdF0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9W19uZ2hvc3QtJUNPTVAlXSwgLm1haW5bX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9W19uZ2hvc3QtJUNPTVAlXXtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzoxMHB4fS5tYWluW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1hcmVhczoiY29udGVudCB5LWF4aXMiICJ4LWF4aXMgLiI7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciA1MHB4O2dyaWQtdGVtcGxhdGUtcm93czoxZnIgMzBweH0ubWFpbi53YWxsX3RpbWVbX25nY29udGVudC0lQ09NUCVde2dyaWQtdGVtcGxhdGUtY29sdW1uczoxZnIgNzVweH0udG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV0sIC5iYXNlbGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzAwMH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAudG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC50b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5iYXNlbGluZVtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5iYXNlbGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubGlua2VkLXRpbWUtZm9iW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRleHRbX25nY29udGVudC0lQ09NUCVdLCAudG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV0gICB0ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpib2xkO2ZvbnQtc2l6ZToxMHB4fS5saW5rZWQtdGltZS1mb2JbX25nY29udGVudC0lQ09NUCVdICAgdGV4dFtfbmdjb250ZW50LSVDT01QJV0sIC5saW5rZWQtdGltZS1mb2JbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLnRvb2x0aXBbX25nY29udGVudC0lQ09NUCVdICAgdGV4dFtfbmdjb250ZW50LSVDT01QJV0sIC50b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17ZmlsbDpjdXJyZW50Q29sb3J9LmxpbmtlZC10aW1lLWZvYltfbmdjb250ZW50LSVDT01QJV0gICAudmFsdWUtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAudG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV0gICAudmFsdWUtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2RvbWluYW50LWJhc2VsaW5lOmlkZW9ncmFwaGljO3RleHQtYW5jaG9yOnN0YXJ0fS5saW5rZWQtdGltZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7bGVmdDo5cHg7dG9wOjA7aGVpZ2h0OjEwMCU7cmlnaHQ6MH0ubGlua2VkLXRpbWVbX25nY29udGVudC0lQ09NUCVdICAgLmxpbmtlZC10aW1lLWZvYltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTppbmxpbmUtYmxvY2s7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSl9LmF4aXNbX25nY29udGVudC0lQ09NUCVdICAgIHtjb2xvcjojNjE2MTYxO3Bvc2l0aW9uOnJlbGF0aXZlO292ZXJmbG93OmhpZGRlbn1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuYXhpc1tfbmdjb250ZW50LSVDT01QJV0gICAgLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuYXhpc1tfbmdjb250ZW50LSVDT01QJV0gICAge2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfS5heGlzW19uZ2NvbnRlbnQtJUNPTVAlXSAgICAgLmRvbWFpbiwgLmF4aXNbX25nY29udGVudC0lQ09NUCVdICAgICAudGljayB0ZXh0e2Rpc3BsYXk6bm9uZX0uYXhpc1tfbmdjb250ZW50LSVDT01QJV0gICAgIC50aWNrOm50aC1jaGlsZCgybisxKSB0ZXh0e2Rpc3BsYXk6aW5pdGlhbH1zdmdbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7cG9pbnRlci1ldmVudHM6dmlzaWJsZVBhaW50ZWR9c3ZnW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGxpbmVbX25nY29udGVudC0lQ09NUCVdLCBzdmdbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgc3ZnW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC50b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lfXN2Z1tfbmdjb250ZW50LSVDT01QJV0gICBnW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWxsLWNoYW5nZTp0cmFuc2Zvcm19LngtYXhpc1tfbmdjb250ZW50LSVDT01QJV17Z3JpZC1hcmVhOngtYXhpc30ueC1heGlzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC50b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtkb21pbmFudC1iYXNlbGluZTpoYW5naW5nO3RleHQtYW5jaG9yOm1pZGRsZX0ueS1heGlzW19uZ2NvbnRlbnQtJUNPTVAlXXtncmlkLWFyZWE6eS1heGlzOy13ZWJraXQtbWFzay1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjMDAwMCAwJSwgIzAwMCAxMCUsICMwMDAgOTAlLCAjMDAwMCAxMDAlKTttYXNrLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICMwMDAwIDAlLCAjMDAwIDEwJSwgIzAwMCA5MCUsICMwMDAwIDEwMCUpfS55LWF4aXNbX25nY29udGVudC0lQ09NUCVdICAgLnRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2RvbWluYW50LWJhc2VsaW5lOm1pZGRsZTt0ZXh0LWFuY2hvcjpzdGFydH0uY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAudGlja1tfbmdjb250ZW50LSVDT01QJV0sIC5heGlzW19uZ2NvbnRlbnQtJUNPTVAlXSAgICAgLnRpY2sgbGluZXtzdHJva2U6I2RkZH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAudGlja1tfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC50aWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6IzU1NX1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuYXhpc1tfbmdjb250ZW50LSVDT01QJV0gICAgIC50aWNrIGxpbmUsIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5heGlzW19uZ2NvbnRlbnQtJUNPTVAlXSAgICAgLnRpY2sgbGluZXtzdHJva2U6IzU1NX0uY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Z3JpZC1hcmVhOmNvbnRlbnR9LmNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLnRpY2tbX25nY29udGVudC0lQ09NUCVde3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlLWRhc2hhcnJheToyfS5jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBhdGhbX25nY29udGVudC0lQ09NUCVde2ZpbGw6Y3VycmVudENvbG9yO3N0cm9rZS1vcGFjaXR5Oi42O3N0cm9rZS13aWR0aDoxcHh9LmNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWx0ZXI6ZHJvcC1zaGFkb3coMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuNikpO3N0cm9rZTojZmZmO3dpbGwtY2hhbmdlOnRyYW5zZm9ybX0uY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAuYmFzZWxpbmVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZS1vcGFjaXR5Oi4xO3N0cm9rZS13aWR0aDoxcHg7c3Ryb2tlOmN1cnJlbnRDb2xvcjt3aWR0aDoxMDAlfS5jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC50b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBhdGhbX25nY29udGVudC0lQ09NUCVde3N0cm9rZS1vcGFjaXR5OjE7c3Ryb2tlOmN1cnJlbnRDb2xvcjtmaWxsOnRyYW5zcGFyZW50fS5jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5uby1jb2xvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyMjEsMjIxLDIyMSwuNCkgIWltcG9ydGFudH0uY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAubm8tY29sb3JbX25nY29udGVudC0lQ09NUCVdICAgcGF0aFtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlLW9wYWNpdHk6LjJ9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm5vLWNvbG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm5vLWNvbG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDUxLDUxLDUxLC40KSAhaW1wb3J0YW50fS5vZmZzZXRbX25nY29udGVudC0lQ09NUCVdICAgLmNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLmhpc3RvZ3JhbXNbX25nY29udGVudC0lQ09NUCVdICAgcGF0aFtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmZmZ9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLm9mZnNldFtfbmdjb250ZW50LSVDT01QJV0gICAuY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAuaGlzdG9ncmFtc1tfbmdjb250ZW50LSVDT01QJV0gICBwYXRoW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLm9mZnNldFtfbmdjb250ZW50LSVDT01QJV0gICAuY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAuaGlzdG9ncmFtc1tfbmdjb250ZW50LSVDT01QJV0gICBwYXRoW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6IzU1NX0ub2Zmc2V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5oaXN0b2dyYW1zLmxpbmtlZC10aW1lLXNpbmdsZS1zdGVwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIFtfbmdjb250ZW50LSVDT01QJV06bm90KC5uby1jb2xvcikgICBwYXRoW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6IzAwMH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAub2Zmc2V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5oaXN0b2dyYW1zLmxpbmtlZC10aW1lLXNpbmdsZS1zdGVwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIFtfbmdjb250ZW50LSVDT01QJV06bm90KC5uby1jb2xvcikgICBwYXRoW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLm9mZnNldFtfbmdjb250ZW50LSVDT01QJV0gICAuY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAuaGlzdG9ncmFtcy5saW5rZWQtdGltZS1zaW5nbGUtc3RlcFtfbmdjb250ZW50LSVDT01QJV0gICBbX25nY29udGVudC0lQ09NUCVdOm5vdCgubm8tY29sb3IpICAgcGF0aFtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmZmZ9Lm92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdICAgLngtYXhpc1tfbmdjb250ZW50LSVDT01QJV0gICAgIC50aWNrIGxpbmV7ZGlzcGxheTpub25lfS5vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBhdGhbX25nY29udGVudC0lQ09NUCVde2ZpbGwtb3BhY2l0eTowO3N0cm9rZTpjdXJyZW50Q29sb3J9LnRvb2x0aXBbX25nY29udGVudC0lQ09NUCVdLCAuY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0ubWFpbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAuY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWFpbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAudG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpibG9ja30nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodGd0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InRiLWhpc3RvZ3JhbSIsdGVtcGxhdGVVcmw6Imhpc3RvZ3JhbV9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiaGlzdG9ncmFtX2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6VWd9XX0pLHttYWluOlt7dHlwZTpaYSxhcmdzOlsibWFpbiJdfV0seEF4aXM6W3t0eXBlOlphLGFyZ3M6WyJ4QXhpcyJdfV0seUF4aXM6W3t0eXBlOlphLGFyZ3M6WyJ5QXhpcyJdfV0sY29udGVudDpbe3R5cGU6WmEsYXJnczpbImNvbnRlbnQiXX1dLGhpc3RvZ3JhbXM6W3t0eXBlOlphLGFyZ3M6WyJoaXN0b2dyYW1zIl19XSxtb2RlOlt7dHlwZTp4eX1dLHRpbWVQcm9wZXJ0eTpbe3R5cGU6eHl9XSxjb2xvcjpbe3R5cGU6eHl9XSxkYXRhOlt7dHlwZTp4eX1dLGxpbmtlZFRpbWU6W3t0eXBlOnh5fV19KTtjb25zdCByZ3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm57c3RhcnRTdGVwOnQsZW5kU3RlcDplfX07ZnVuY3Rpb24gc2d0KHQsZSl7aWYoMSZ0JiZUbSgwLCJ0Yi1oaXN0b2dyYW0iLDE2KSwyJnQpe2NvbnN0IHQ9WW0oKTtEbSgiZGF0YSIsdC5kYXRhKSgibW9kZSIsdC5tb2RlKSgidGltZVByb3BlcnR5Iix0LnRpbWVQcm9wZXJ0eSh0LnhBeGlzVHlwZSkpKCJjb2xvciIsdC5ydW5Db2xvclNjYWxlKHQucnVuSWQpKSgibGlua2VkVGltZSIsdC5zZWxlY3RlZFRpbWU/dmgoNSxyZ3QsdC5zZWxlY3RlZFRpbWUuc3RhcnRTdGVwLHQuc2VsZWN0ZWRUaW1lLmVuZFN0ZXApOm51bGwpfX1mdW5jdGlvbiBsZ3QodCxlKXsxJnQmJihSbSgwLCJkaXYiLDE4KSxrdSgxLCIgRGF0YSBmYWlsZWQgdG8gbG9hZC4gIiksQW0oKSl9ZnVuY3Rpb24gY2d0KHQsZSl7aWYoMSZ0JiZRcCgwLGxndCwyLDAsImRpdiIsMTcpLDImdCl7Y29uc3QgdD1ZbSgpO0RtKCJuZ0lmIix0LmxvYWRTdGF0ZT09PXQuRGF0YUxvYWRTdGF0ZS5GQUlMRUQpfX1jb25zdCBkZ3Q9ZnVuY3Rpb24odCl7cmV0dXJue2JhY2tncm91bmRDb2xvcjp0fX07Y2xhc3MgcGd0e2NvbnN0cnVjdG9yKCl7dGhpcy5EYXRhTG9hZFN0YXRlPXlFLHRoaXMub25GdWxsU2l6ZVRvZ2dsZT1uZXcgTGgsdGhpcy5vblBpbkNsaWNrZWQ9bmV3IExofXRpbWVQcm9wZXJ0eSh0KXtzd2l0Y2godCl7Y2FzZSB5QS5TVEVQOnJldHVybiBkRS5TVEVQO2Nhc2UgeUEuV0FMTF9USU1FOnJldHVybiBkRS5XQUxMX1RJTUU7Y2FzZSB5QS5SRUxBVElWRTpyZXR1cm4gZEUuUkVMQVRJVkU7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgeEF4aXNUeXBlIGZvciBoaXN0b2dyYW0gdGltZSBwcm9wZXJ0eS4iKX19fXBndC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8cGd0KX0scGd0Lsm1Y21wPXRvKHt0eXBlOnBndCxzZWxlY3RvcnM6W1siaGlzdG9ncmFtLWNhcmQtY29tcG9uZW50Il1dLGlucHV0czp7bG9hZFN0YXRlOiJsb2FkU3RhdGUiLHRpdGxlOiJ0aXRsZSIsdGFnOiJ0YWciLHJ1bklkOiJydW5JZCIsZGF0YToiZGF0YSIsbW9kZToibW9kZSIseEF4aXNUeXBlOiJ4QXhpc1R5cGUiLHJ1bkNvbG9yU2NhbGU6InJ1bkNvbG9yU2NhbGUiLHNob3dGdWxsU2l6ZToic2hvd0Z1bGxTaXplIixpc1Bpbm5lZDoiaXNQaW5uZWQiLHNlbGVjdGVkVGltZToic2VsZWN0ZWRUaW1lIn0sb3V0cHV0czp7b25GdWxsU2l6ZVRvZ2dsZToib25GdWxsU2l6ZVRvZ2dsZSIsb25QaW5DbGlja2VkOiJvblBpbkNsaWNrZWQifSxkZWNsczoxNix2YXJzOjEzLGNvbnN0czpmdW5jdGlvbigpe2xldCB0LGU7cmV0dXJuIHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSYmbmdJMThuQ2xvc3VyZU1vZGU/Z29vZy5nZXRNc2coIlBpbiBjYXJkIik6JGxvY2FsaXplYDpBIGJ1dHRvbiB0byBwaW4gYSBjYXJkLuKQn2U2NjVkYzcxMmJkNWYxOGQ0ZGZhM2EyOWUxMjVkNTY1Y2M1MWUyZjbikJ83Mjg0NjA2NDI2MjM0Mzc1MzQ0OlBpbiBjYXJkYCxlPSJ1bmRlZmluZWQiIT10eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUmJm5nSTE4bkNsb3N1cmVNb2RlP2dvb2cuZ2V0TXNnKCJUb2dnbGUgZnVsbCBzaXplIG1vZGUiKTokbG9jYWxpemVgOkEgYnV0dG9uIG9uIGEgaGlzdG9ncmFtIGNhcmQgdGhhdCB0b2dnbGVzIGZ1bGwgc2l6ZSBtb2RlLuKQn2ZjOGY3NjdkMGI5ZjkzMDE4N2ExYmFlMzQ0NzdhZDI4NzM2ZWNlMzPikJ85MTU3MjE1NjM2Mzg5MjY1OTc6VG9nZ2xlIGZ1bGwgc2l6ZSBtb2RlYCxbWzEsImhlYWRpbmciXSxbMSwidGFnIl0sWzMsInRpdGxlIiwidmFsdWUiXSxbNCwibmdJZiJdLFsxLCJydW4iXSxbMSwiZG90IiwzLCJuZ1N0eWxlIl0sWzEsInJ1bi10ZXh0IiwzLCJydW5JZCJdLFsxLCJjb250cm9scyJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsdCwxLCJwaW4tYnV0dG9uIiwzLCJjbGljayJdLFszLCJzdmdJY29uIl0sWyJtYXQtaWNvbi1idXR0b24iLCIiLCJhcmlhLWxhYmVsIixlLCJ0aXRsZSIsIlRvZ2dsZSBmdWxsIHNpemUgbW9kZSIsMywiY2xpY2siXSxbImNsYXNzIiwic3Bpbm5lciIsNCwibmdJZiJdLFszLCJkYXRhIiwibW9kZSIsInRpbWVQcm9wZXJ0eSIsImNvbG9yIiwibGlua2VkVGltZSIsNCwibmdJZiIsIm5nSWZFbHNlIl0sWyJub0RhdGEiLCIiXSxbMSwic3Bpbm5lciJdLFsiZGlhbWV0ZXIiLCIxOCJdLFszLCJkYXRhIiwibW9kZSIsInRpbWVQcm9wZXJ0eSIsImNvbG9yIiwibGlua2VkVGltZSJdLFsiY2xhc3MiLCJlbXB0eS1tZXNzYWdlIiw0LCJuZ0lmIl0sWzEsImVtcHR5LW1lc3NhZ2UiXV19LHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihSbSgwLCJkaXYiLDApLFJtKDEsImRpdiIsMSksVG0oMiwidGItdHJ1bmNhdGVkLXBhdGgiLDIpLFFwKDMsaWd0LDEsMCwidmlzLXNlbGVjdGVkLXRpbWUtY2xpcHBlZCIsMyksQW0oKSxSbSg0LCJkaXYiLDQpLFRtKDUsInNwYW4iLDUpLFRtKDYsImNhcmQtcnVuLW5hbWUiLDYpLEFtKCksUm0oNywic3BhbiIsNyksUm0oOCwiYnV0dG9uIiw4KSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25QaW5DbGlja2VkLmVtaXQoIW4uaXNQaW5uZWQpfSkpLFRtKDksIm1hdC1pY29uIiw5KSxBbSgpLFJtKDEwLCJidXR0b24iLDEwKSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25GdWxsU2l6ZVRvZ2dsZS5lbWl0KCl9KSksVG0oMTEsIm1hdC1pY29uIiw5KSxBbSgpLEFtKCksUXAoMTIsYWd0LDIsMCwic3BhbiIsMTEpLEFtKCksUXAoMTMsc2d0LDEsOCwidGItaGlzdG9ncmFtIiwxMiksUXAoMTQsY2d0LDEsMSwibmctdGVtcGxhdGUiLG51bGwsMTMsaWIpKSwyJmUpe2NvbnN0IHQ9JHAoMTUpO3JjKDIpLERtKCJ0aXRsZSIsbi50YWcpKCJ2YWx1ZSIsbi50aXRsZSkscmMoMSksRG0oIm5nSWYiLG4uc2VsZWN0ZWRUaW1lJiZuLnNlbGVjdGVkVGltZS5jbGlwcGVkKSxyYygyKSxEbSgibmdTdHlsZSIsTWgoMTEsZGd0LG4ucnVuQ29sb3JTY2FsZShuLnJ1bklkKSkpLHJjKDEpLERtKCJydW5JZCIsbi5ydW5JZCkscmMoMiksanAoInRpdGxlIixuLmlzUGlubmVkPyJVbnBpbiBjYXJkIjoiUGluIGNhcmQiKSxyYygxKSxEbSgic3ZnSWNvbiIsbi5pc1Bpbm5lZD8ia2VlcF8yNHB4Ijoia2VlcF9vdXRsaW5lXzI0cHgiKSxyYygyKSxEbSgic3ZnSWNvbiIsbi5zaG93RnVsbFNpemU/ImZ1bGxzY3JlZW5fZXhpdF8yNHB4IjoiZnVsbHNjcmVlbl8yNHB4IikscmMoMSksRG0oIm5nSWYiLG4ubG9hZFN0YXRlPT09bi5EYXRhTG9hZFN0YXRlLkxPQURJTkcpLHJjKDEpLERtKCJuZ0lmIixuLmRhdGEmJm4uZGF0YS5sZW5ndGgpKCJuZ0lmRWxzZSIsdCl9fSxkaXJlY3RpdmVzOlt6MixkTSxDTSxMMixYSCxEVyxnZnQsbzEsdGd0XSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Ym94LXNpemluZzpib3JkZXItYm94O2hlaWdodDoxMDAlO292ZXJmbG93OmF1dG87cGFkZGluZzoxNnB4O3BhZGRpbmctdG9wOjRweH0uaGVhZGluZ1tfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWFyZWFzOiJ0YWcgY29udHJvbHMiICJydW4gc3Bpbm5lciI7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciBhdXRvO2ZvbnQtc2l6ZToxNHB4O21hcmdpbi1ib3R0b206NHB4fS50YWdbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7Z2FwOjVweDtncmlkLWFyZWE6dGFnO292ZXJmbG93OmhpZGRlbn0udGFnW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHZpcy1zZWxlY3RlZC10aW1lLWNsaXBwZWRbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjB9LnBpbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgbWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxOHB4fS5ydW5bX25nY29udGVudC0lQ09NUCVde2dyaWQtYXJlYTpydW47ZGlzcGxheTpmbGV4O3doaXRlLXNwYWNlOm5vd3JhcDtmb250LXNpemU6MTNweH0ucnVuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5kb3RbX25nY29udGVudC0lQ09NUCVde2ZsZXg6bm9uZTtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxM3B4O2hlaWdodDoxM3B4O2JvcmRlci1yYWRpdXM6NTAlO21hcmdpbi1yaWdodDo0cHh9LnJ1bltfbmdjb250ZW50LSVDT01QJV0gICAucnVuLXRleHRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO21heC13aWR0aDoxMjBweH0uY29udHJvbHNbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjE7d2hpdGUtc3BhY2U6bm93cmFwO2dyaWQtYXJlYTpjb250cm9scztqdXN0aWZ5LXNlbGY6ZmxleC1lbmQ7ZmxleC1zaHJpbms6MDttYXJnaW4tcmlnaHQ6LTEycHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmNvbnRyb2xzW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmNvbnRyb2xzW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX0uc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2dyaWQtYXJlYTpzcGlubmVyO2hlaWdodDoxMDAlO2p1c3RpZnktY29udGVudDpjZW50ZXI7cG9zaXRpb246cmVsYXRpdmV9bWF0LXNwaW5uZXJbX25nY29udGVudC0lQ09NUCVde3RvcDowO3JpZ2h0OjA7cG9zaXRpb246YWJzb2x1dGV9dGItaGlzdG9ncmFtW19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4LWdyb3c6MTtvdmVyZmxvdzpoaWRkZW59LmVtcHR5LW1lc3NhZ2VbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6MWVtO2ZvbnQtc2l6ZToxM3B4fSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChwZ3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiaGlzdG9ncmFtLWNhcmQtY29tcG9uZW50Iix0ZW1wbGF0ZVVybDoiaGlzdG9ncmFtX2NhcmRfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbImhpc3RvZ3JhbV9jYXJkX2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSxudWxsLHtsb2FkU3RhdGU6W3t0eXBlOnh5fV0sdGl0bGU6W3t0eXBlOnh5fV0sdGFnOlt7dHlwZTp4eX1dLHJ1bklkOlt7dHlwZTp4eX1dLGRhdGE6W3t0eXBlOnh5fV0sbW9kZTpbe3R5cGU6eHl9XSx4QXhpc1R5cGU6W3t0eXBlOnh5fV0scnVuQ29sb3JTY2FsZTpbe3R5cGU6eHl9XSxzaG93RnVsbFNpemU6W3t0eXBlOnh5fV0saXNQaW5uZWQ6W3t0eXBlOnh5fV0sc2VsZWN0ZWRUaW1lOlt7dHlwZTp4eX1dLG9uRnVsbFNpemVUb2dnbGU6W3t0eXBlOk95fV0sb25QaW5DbGlja2VkOlt7dHlwZTpPeX1dfSk7Y2xhc3MgbWd0e2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLmZ1bGxXaWR0aENoYW5nZWQ9bmV3IExoLHRoaXMuZnVsbEhlaWdodENoYW5nZWQ9bmV3IExoLHRoaXMucGluU3RhdGVDaGFuZ2VkPW5ldyBMaCx0aGlzLm1vZGUkPXRoaXMuc3RvcmUuc2VsZWN0KE5UKSx0aGlzLnhBeGlzVHlwZSQ9dGhpcy5zdG9yZS5zZWxlY3QoVFQpLHRoaXMuc2hvd0Z1bGxTaXplPSExfWlzSGlzdG9ncmFtQ2FyZE1ldGFkYXRhKHQpe2NvbnN0e3BsdWdpbjplfT10O3JldHVybiBlPT09aEEuSElTVE9HUkFNU31vbkZ1bGxTaXplVG9nZ2xlKCl7dGhpcy5zaG93RnVsbFNpemU9IXRoaXMuc2hvd0Z1bGxTaXplLHRoaXMuZnVsbFdpZHRoQ2hhbmdlZC5lbWl0KHRoaXMuc2hvd0Z1bGxTaXplKSx0aGlzLmZ1bGxIZWlnaHRDaGFuZ2VkLmVtaXQodGhpcy5zaG93RnVsbFNpemUpfW5nT25Jbml0KCl7Y29uc3QgdD10aGlzLnN0b3JlLnNlbGVjdCh5VCx0aGlzLmNhcmRJZCkucGlwZShjZSgodD0+ISF0JiZ0aGlzLmlzSGlzdG9ncmFtQ2FyZE1ldGFkYXRhKHQpKSksSXQoKHQ9PnQpKSksZT1XdChbdCx0aGlzLnN0b3JlLnNlbGVjdChoVCx0aGlzLmNhcmRJZCldKTt0aGlzLmRhdGEkPWUucGlwZShJdCgoKFt0LGVdKT0+e2NvbnN0IG49dC5ydW5JZDtyZXR1cm4gZSYmZS5oYXNPd25Qcm9wZXJ0eShuKT8oZnVuY3Rpb24gbyh0LGU9MzApe2lmKCF0Lmxlbmd0aHx8ZTwxKXJldHVybltdO2NvbnN0IG49KGZ1bmN0aW9uIG8odCl7bGV0IGU9bnVsbCxuPW51bGw7Zm9yKGNvbnN0e2JpbnM6b31vZiB0KXtpZighby5sZW5ndGgpY29udGludWU7Y29uc3QgdD1vW28ubGVuZ3RoLTFdLGk9b1swXS54LGE9dC54K3QuZHg7KG51bGw9PT1lfHxpPGUpJiYoZT1pKSwobnVsbD09PW58fGE+bikmJihuPWEpfXJldHVybiBudWxsPT09ZXx8bnVsbD09PW4/bnVsbDp7bGVmdDplLHJpZ2h0Om59fSkodCk7cmV0dXJuIG4mJm4ubGVmdD09PW4ucmlnaHQmJihuLnJpZ2h0PTEuMSpuLnJpZ2h0KzEsbi5sZWZ0PW4ubGVmdC8xLjEtMSksdC5tYXAoKHQ9Pih7c3RlcDp0LnN0ZXAsd2FsbFRpbWU6dC53YWxsVGltZSxiaW5zOm4/SGZ0KHQuYmlucyxuLGUpOltdfSkpKX0pKGVbbl0ubWFwKCh0PT57Y29uc3R7d2FsbFRpbWU6ZSxzdGVwOm59PXQ7cmV0dXJue3dhbGxUaW1lOmUsc3RlcDpuLGJpbnM6dC5iaW5zLm1hcCgodD0+KHt4OnQubWluLGR4OnQubWF4LXQubWluLHk6dC5jb3VudH0pKSl9fSkpKTpbXX0pKSksdGhpcy5zZWxlY3RlZFRpbWUkPXRoaXMuc3RvcmUuc2VsZWN0KFlUKS5waXBlKGZlKHRoaXMuZGF0YSQpLEl0KCgoW3QsZV0pPT57aWYoIXQpcmV0dXJuIG51bGw7bGV0IG49MS8wLG89LTEvMDtmb3IoY29uc3QgdCBvZiBlKW49TWF0aC5taW4odC5zdGVwLG4pLG89TWF0aC5tYXgodC5zdGVwLG8pO3JldHVybiBIMih0LG4sbyl9KSkpLHRoaXMubG9hZFN0YXRlJD10aGlzLnN0b3JlLnNlbGVjdChnVCx0aGlzLmNhcmRJZCksdGhpcy50YWckPXQucGlwZShJdCgodD0+dC50YWcpKSksdGhpcy50aXRsZSQ9dGhpcy50YWckLnBpcGUoSXQoKHQ9PmYyKHQsdGhpcy5ncm91cE5hbWUpKSkpLHRoaXMucnVuSWQkPXQucGlwZShJdCgodD0+dC5ydW5JZCkpKSx0aGlzLmlzUGlubmVkJD10aGlzLnN0b3JlLnNlbGVjdCh3VCx0aGlzLmNhcmRJZCl9fWZ1bmN0aW9uIHVndCh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsImltYWdlLWNhcmQiLDYpLFZtKCJmdWxsV2lkdGhDaGFuZ2VkIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oMikub25GdWxsV2lkdGhDaGFuZ2VkKG4pfSkpKCJwaW5TdGF0ZUNoYW5nZWQiLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLFltKDIpLm9uUGluU3RhdGVDaGFuZ2VkKCl9KSksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oMik7RG0oImNhcmRJZCIsdC5jYXJkSWQpKCJncm91cE5hbWUiLHQuZ3JvdXBOYW1lKSgicnVuQ29sb3JTY2FsZSIsdC5ydW5Db2xvclNjYWxlKX19ZnVuY3Rpb24gZmd0KHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwic2NhbGFyLWNhcmQiLDcpLFZtKCJmdWxsV2lkdGhDaGFuZ2VkIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oMikub25GdWxsV2lkdGhDaGFuZ2VkKG4pfSkpKCJmdWxsSGVpZ2h0Q2hhbmdlZCIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKDIpLm9uRnVsbEhlaWdodENoYW5nZWQobil9KSkoInBpblN0YXRlQ2hhbmdlZCIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oMikub25QaW5TdGF0ZUNoYW5nZWQoKX0pKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgyKTtEbSgiY2FyZElkIix0LmNhcmRJZCkoImdyb3VwTmFtZSIsdC5ncm91cE5hbWUpfX1mdW5jdGlvbiBnZ3QodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJoaXN0b2dyYW0tY2FyZCIsOCksVm0oImZ1bGxXaWR0aENoYW5nZWQiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgyKS5vbkZ1bGxXaWR0aENoYW5nZWQobil9KSkoImZ1bGxIZWlnaHRDaGFuZ2VkIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oMikub25GdWxsSGVpZ2h0Q2hhbmdlZChuKX0pKSgicGluU3RhdGVDaGFuZ2VkIiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgyKS5vblBpblN0YXRlQ2hhbmdlZCgpfSkpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKDIpO0RtKCJjYXJkSWQiLHQuY2FyZElkKSgiZ3JvdXBOYW1lIix0Lmdyb3VwTmFtZSkoInJ1bkNvbG9yU2NhbGUiLHQucnVuQ29sb3JTY2FsZSl9fWZ1bmN0aW9uIGhndCh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgyKTtyYygxKSxEdSgiUGxhY2Vob2xkZXIgZXJyb3IgZm9yOiAiLHQuY2FyZElkLCIiKX19ZnVuY3Rpb24gYmd0KHQsZSl7aWYoMSZ0JiYoTm0oMCwxKSxRcCgxLHVndCwxLDMsImltYWdlLWNhcmQiLDIpLFFwKDIsZmd0LDEsMiwic2NhbGFyLWNhcmQiLDMpLFFwKDMsZ2d0LDEsMywiaGlzdG9ncmFtLWNhcmQiLDQpLFFwKDQsaGd0LDIsMSwiZGl2Iiw1KSx6bSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtEbSgibmdTd2l0Y2giLHQucGx1Z2luVHlwZSkscmMoMSksRG0oIm5nU3dpdGNoQ2FzZSIsdC5QbHVnaW5UeXBlLklNQUdFUykscmMoMSksRG0oIm5nU3dpdGNoQ2FzZSIsdC5QbHVnaW5UeXBlLlNDQUxBUlMpLHJjKDEpLERtKCJuZ1N3aXRjaENhc2UiLHQuUGx1Z2luVHlwZS5ISVNUT0dSQU1TKX19bWd0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxtZ3QpKFNtKEl3KSl9LG1ndC7JtWNtcD10byh7dHlwZTptZ3Qsc2VsZWN0b3JzOltbImhpc3RvZ3JhbS1jYXJkIl1dLGlucHV0czp7Y2FyZElkOiJjYXJkSWQiLGdyb3VwTmFtZToiZ3JvdXBOYW1lIixydW5Db2xvclNjYWxlOiJydW5Db2xvclNjYWxlIn0sb3V0cHV0czp7ZnVsbFdpZHRoQ2hhbmdlZDoiZnVsbFdpZHRoQ2hhbmdlZCIsZnVsbEhlaWdodENoYW5nZWQ6ImZ1bGxIZWlnaHRDaGFuZ2VkIixwaW5TdGF0ZUNoYW5nZWQ6InBpblN0YXRlQ2hhbmdlZCJ9LGRlY2xzOjEwLHZhcnM6MjksY29uc3RzOltbMywibG9hZFN0YXRlIiwidGl0bGUiLCJ0YWciLCJydW5JZCIsImRhdGEiLCJtb2RlIiwieEF4aXNUeXBlIiwicnVuQ29sb3JTY2FsZSIsInNob3dGdWxsU2l6ZSIsImlzUGlubmVkIiwic2VsZWN0ZWRUaW1lIiwib25GdWxsU2l6ZVRvZ2dsZSIsIm9uUGluQ2xpY2tlZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiaGlzdG9ncmFtLWNhcmQtY29tcG9uZW50IiwwKSxWbSgib25GdWxsU2l6ZVRvZ2dsZSIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkZ1bGxTaXplVG9nZ2xlKCl9KSkoIm9uUGluQ2xpY2tlZCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ucGluU3RhdGVDaGFuZ2VkLmVtaXQoZSl9KSksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQWgoNCwiYXN5bmMiKSxBaCg1LCJhc3luYyIpLEFoKDYsImFzeW5jIiksQWgoNywiYXN5bmMiKSxBaCg4LCJhc3luYyIpLEFoKDksImFzeW5jIiksQW0oKSksMiZlJiZEbSgibG9hZFN0YXRlIixUaCgxLDExLG4ubG9hZFN0YXRlJCkpKCJ0aXRsZSIsVGgoMiwxMyxuLnRpdGxlJCkpKCJ0YWciLFRoKDMsMTUsbi50YWckKSkoInJ1bklkIixUaCg0LDE3LG4ucnVuSWQkKSkoImRhdGEiLFRoKDUsMTksbi5kYXRhJCkpKCJtb2RlIixUaCg2LDIxLG4ubW9kZSQpKSgieEF4aXNUeXBlIixUaCg3LDIzLG4ueEF4aXNUeXBlJCkpKCJydW5Db2xvclNjYWxlIixuLnJ1bkNvbG9yU2NhbGUpKCJzaG93RnVsbFNpemUiLG4uc2hvd0Z1bGxTaXplKSgiaXNQaW5uZWQiLFRoKDgsMjUsbi5pc1Bpbm5lZCQpKSgic2VsZWN0ZWRUaW1lIixUaCg5LDI3LG4uc2VsZWN0ZWRUaW1lJCkpfSxkaXJlY3RpdmVzOltwZ3RdLHBpcGVzOlt3TV0sc3R5bGVzOlsiW19uZ2hvc3QtJUNPTVAlXSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICB9Il0sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKG1ndCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJoaXN0b2dyYW0tY2FyZCIsdGVtcGxhdGU6J1xuICAgIDxoaXN0b2dyYW0tY2FyZC1jb21wb25lbnRcbiAgICAgIFtsb2FkU3RhdGVdPSJsb2FkU3RhdGUkIHwgYXN5bmMiXG4gICAgICBbdGl0bGVdPSJ0aXRsZSQgfCBhc3luYyJcbiAgICAgIFt0YWddPSJ0YWckIHwgYXN5bmMiXG4gICAgICBbcnVuSWRdPSJydW5JZCQgfCBhc3luYyJcbiAgICAgIFtkYXRhXT0iZGF0YSQgfCBhc3luYyJcbiAgICAgIFttb2RlXT0ibW9kZSQgfCBhc3luYyJcbiAgICAgIFt4QXhpc1R5cGVdPSJ4QXhpc1R5cGUkIHwgYXN5bmMiXG4gICAgICBbcnVuQ29sb3JTY2FsZV09InJ1bkNvbG9yU2NhbGUiXG4gICAgICBbc2hvd0Z1bGxTaXplXT0ic2hvd0Z1bGxTaXplIlxuICAgICAgW2lzUGlubmVkXT0iaXNQaW5uZWQkIHwgYXN5bmMiXG4gICAgICBbc2VsZWN0ZWRUaW1lXT0ic2VsZWN0ZWRUaW1lJCB8IGFzeW5jIlxuICAgICAgKG9uRnVsbFNpemVUb2dnbGUpPSJvbkZ1bGxTaXplVG9nZ2xlKCkiXG4gICAgICAob25QaW5DbGlja2VkKT0icGluU3RhdGVDaGFuZ2VkLmVtaXQoJGV2ZW50KSJcbiAgICA+PC9oaXN0b2dyYW0tY2FyZC1jb21wb25lbnQ+XG4gICcsc3R5bGVzOlsiXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICB9XG4gICAgIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSx7Y2FyZElkOlt7dHlwZTp4eX1dLGdyb3VwTmFtZTpbe3R5cGU6eHl9XSxydW5Db2xvclNjYWxlOlt7dHlwZTp4eX1dLGZ1bGxXaWR0aENoYW5nZWQ6W3t0eXBlOk95fV0sZnVsbEhlaWdodENoYW5nZWQ6W3t0eXBlOk95fV0scGluU3RhdGVDaGFuZ2VkOlt7dHlwZTpPeX1dfSk7Y2xhc3MgeWd0e2NvbnN0cnVjdG9yKCl7dGhpcy5QbHVnaW5UeXBlPWhBLHRoaXMuZnVsbFdpZHRoQ2hhbmdlZD1uZXcgTGgsdGhpcy5mdWxsSGVpZ2h0Q2hhbmdlZD1uZXcgTGgsdGhpcy5waW5TdGF0ZUNoYW5nZWQ9bmV3IExofW9uRnVsbFdpZHRoQ2hhbmdlZCh0KXt0aGlzLmZ1bGxXaWR0aENoYW5nZWQuZW1pdCh0KX1vbkZ1bGxIZWlnaHRDaGFuZ2VkKHQpe3RoaXMuZnVsbEhlaWdodENoYW5nZWQuZW1pdCh0KX1vblBpblN0YXRlQ2hhbmdlZCgpe3RoaXMucGluU3RhdGVDaGFuZ2VkLmVtaXQoKX19eWd0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx5Z3QpfSx5Z3QuybVjbXA9dG8oe3R5cGU6eWd0LHNlbGVjdG9yczpbWyJjYXJkLXZpZXctY29tcG9uZW50Il1dLGlucHV0czp7aXNFdmVyVmlzaWJsZToiaXNFdmVyVmlzaWJsZSIsY2FyZElkOiJjYXJkSWQiLGdyb3VwTmFtZToiZ3JvdXBOYW1lIixwbHVnaW5UeXBlOiJwbHVnaW5UeXBlIixydW5Db2xvclNjYWxlOiJydW5Db2xvclNjYWxlIn0sb3V0cHV0czp7ZnVsbFdpZHRoQ2hhbmdlZDoiZnVsbFdpZHRoQ2hhbmdlZCIsZnVsbEhlaWdodENoYW5nZWQ6ImZ1bGxIZWlnaHRDaGFuZ2VkIixwaW5TdGF0ZUNoYW5nZWQ6InBpblN0YXRlQ2hhbmdlZCJ9LGRlY2xzOjEsdmFyczoxLGNvbnN0czpbWzMsIm5nU3dpdGNoIiw0LCJuZ0lmIl0sWzMsIm5nU3dpdGNoIl0sWzMsImNhcmRJZCIsImdyb3VwTmFtZSIsInJ1bkNvbG9yU2NhbGUiLCJmdWxsV2lkdGhDaGFuZ2VkIiwicGluU3RhdGVDaGFuZ2VkIiw0LCJuZ1N3aXRjaENhc2UiXSxbMywiY2FyZElkIiwiZ3JvdXBOYW1lIiwiZnVsbFdpZHRoQ2hhbmdlZCIsImZ1bGxIZWlnaHRDaGFuZ2VkIiwicGluU3RhdGVDaGFuZ2VkIiw0LCJuZ1N3aXRjaENhc2UiXSxbMywiY2FyZElkIiwiZ3JvdXBOYW1lIiwicnVuQ29sb3JTY2FsZSIsImZ1bGxXaWR0aENoYW5nZWQiLCJmdWxsSGVpZ2h0Q2hhbmdlZCIsInBpblN0YXRlQ2hhbmdlZCIsNCwibmdTd2l0Y2hDYXNlIl0sWzQsIm5nU3dpdGNoRGVmYXVsdCJdLFszLCJjYXJkSWQiLCJncm91cE5hbWUiLCJydW5Db2xvclNjYWxlIiwiZnVsbFdpZHRoQ2hhbmdlZCIsInBpblN0YXRlQ2hhbmdlZCJdLFszLCJjYXJkSWQiLCJncm91cE5hbWUiLCJmdWxsV2lkdGhDaGFuZ2VkIiwiZnVsbEhlaWdodENoYW5nZWQiLCJwaW5TdGF0ZUNoYW5nZWQiXSxbMywiY2FyZElkIiwiZ3JvdXBOYW1lIiwicnVuQ29sb3JTY2FsZSIsImZ1bGxXaWR0aENoYW5nZWQiLCJmdWxsSGVpZ2h0Q2hhbmdlZCIsInBpblN0YXRlQ2hhbmdlZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiZRcCgwLGJndCw1LDQsIm5nLWNvbnRhaW5lciIsMCksMiZlJiZEbSgibmdJZiIsbi5pc0V2ZXJWaXNpYmxlKX0sZGlyZWN0aXZlczpbZE0sZk0sZ00saE0sWDIsSWZ0LG1ndF0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh5Z3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiY2FyZC12aWV3LWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6ImNhcmRfdmlld19jb21wb25lbnQubmcuaHRtbCIsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7aXNFdmVyVmlzaWJsZTpbe3R5cGU6eHl9XSxjYXJkSWQ6W3t0eXBlOnh5fV0sZ3JvdXBOYW1lOlt7dHlwZTp4eX1dLHBsdWdpblR5cGU6W3t0eXBlOnh5fV0scnVuQ29sb3JTY2FsZTpbe3R5cGU6eHl9XSxmdWxsV2lkdGhDaGFuZ2VkOlt7dHlwZTpPeX1dLGZ1bGxIZWlnaHRDaGFuZ2VkOlt7dHlwZTpPeX1dLHBpblN0YXRlQ2hhbmdlZDpbe3R5cGU6T3l9XX0pO2NsYXNzIF9ndHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5pc0V2ZXJWaXNpYmxlPSExLHRoaXMuc2hvd0Z1bGxXaWR0aD0hMSx0aGlzLnNob3dGdWxsSGVpZ2h0PSExLHRoaXMucnVuQ29sb3JTY2FsZSQ9dGhpcy5zdG9yZS5zZWxlY3Qoek4pLnBpcGUoQmUoMzUwLHZvaWQgMCx7bGVhZGluZzohMCx0cmFpbGluZzohMH0pLEl0KCh0PT5lPT50Lmhhc093blByb3BlcnR5KGUpP3RbZV06IiNmZmYiKSkpfW9uVmlzaWJpbGl0eUNoYW5nZSh7dmlzaWJsZTp0fSl7dGhpcy5pc0V2ZXJWaXNpYmxlPXRoaXMuaXNFdmVyVmlzaWJsZXx8dH1vbkZ1bGxXaWR0aENoYW5nZWQodCl7dGhpcy5zaG93RnVsbFdpZHRoPXR9b25GdWxsSGVpZ2h0Q2hhbmdlZCh0KXt0aGlzLnNob3dGdWxsSGVpZ2h0PXR9b25QaW5TdGF0ZUNoYW5nZWQoKXt0aGlzLnN0b3JlLnNlbGVjdCh3VCx0aGlzLmNhcmRJZCkucGlwZShiZSgxKSxWZSh0aGlzLnN0b3JlLnNlbGVjdChTVCkpKS5zdWJzY3JpYmUoKChbdCxlXSk9Pnt0aGlzLnN0b3JlLmRpc3BhdGNoKG9SKHtjYXJkSWQ6dGhpcy5jYXJkSWQsY2FuQ3JlYXRlTmV3UGluczplLHdhc1Bpbm5lZDp0fSkpfSkpfX1mdW5jdGlvbiBDZ3QodCxlKXsxJnQmJkltKDApfWZ1bmN0aW9uIE1ndCh0LGUpe2lmKDEmdCYmVG0oMCwiY2FyZC12aWV3Iiw0KSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQsbj1ZbSgpO0RtKCJjYXJkSWQiLHQuY2FyZElkKSgiZ3JvdXBOYW1lIixuLmdyb3VwTmFtZSkoInBsdWdpblR5cGUiLHQucGx1Z2luKSgiY2FyZE9ic2VydmVyIixuLmNhcmRPYnNlcnZlcikoImNhcmRMYXp5TG9hZGVyIix0LmNhcmRJZCl9fWZ1bmN0aW9uIHZndCh0LGUpezEmdCYmSW0oMCl9ZnVuY3Rpb24geGd0KHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiYnV0dG9uIiwxMyksVm0oImNsaWNrIiwoZnVuY3Rpb24gZShuKXtoaSh0KTtjb25zdCBvPVltKDMpO3JldHVybiBvLmhhbmRsZVBhZ2VDaGFuZ2Uoby5wYWdlSW5kZXgtMSxuLnRhcmdldCl9KSksa3UoMSwiIFByZXZpb3VzICIpLEFtKCl9MiZ0JiZEbSgiZGlzYWJsZWQiLDA9PT1ZbSgzKS5wYWdlSW5kZXgpfWZ1bmN0aW9uIE9ndCh0LGUpezEmdCYmVG0oMCwibWF0LWljb24iLDE3KX1mdW5jdGlvbiBQZ3QodCxlKXsxJnQmJlRtKDAsIm1hdC1pY29uIiwxOCl9ZnVuY3Rpb24gd2d0KHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiYnV0dG9uIiwxNCksVm0oImNsaWNrIiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgzKS5ncm91cEV4cGFuc2lvblRvZ2dsZWQuZW1pdCgpfSkpLFFwKDEsT2d0LDEsMCwibWF0LWljb24iLDE1KSxRcCgyLFBndCwxLDAsIm5nLXRlbXBsYXRlIixudWxsLDE2LGliKSxBbSgpfWlmKDImdCl7Y29uc3QgdD0kcCgzKSxlPVltKDMpO3JjKDEpLERtKCJuZ0lmIixlLmlzR3JvdXBFeHBhbmRlZCkoIm5nSWZFbHNlIix0KX19ZnVuY3Rpb24ga2d0KHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwic3BhbiIsMjEpLFJtKDEsImlucHV0IiwyMiksVm0oImlucHV0IiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oNCkub25QYWdpbmF0aW9uSW5wdXRDaGFuZ2Uobil9KSkoImNoYW5nZSIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKDQpLm9uUGFnaW5hdGlvbklucHV0Q2hhbmdlKG4pfSkpLEFtKCksa3UoMiksQW0oKX1pZigyJnQpe2NvbnN0IHQ9WW0oNCk7cmMoMSksRG0oInZhbHVlIix0LnBhZ2VJbmRleCsxKSgibWF4Iix0Lm51bVBhZ2VzKSxyYygxKSxEdSgiIG9mICIsdC5udW1QYWdlcywiIil9fWZ1bmN0aW9uIFNndCh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsInNwYW4iKSxRcCgxLGtndCwzLDMsInNwYW4iLDE5KSxSbSgyLCJidXR0b24iLDIwKSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKG4pe2hpKHQpO2NvbnN0IG89WW0oMyk7cmV0dXJuIG8uaGFuZGxlUGFnZUNoYW5nZShvLnBhZ2VJbmRleCsxLG4udGFyZ2V0KX0pKSxrdSgzLCIgTmV4dCAiKSxBbSgpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKDIpLmlzQm90dG9tQ29udHJvbCxlPVltKCk7cmMoMSksRG0oIm5nSWYiLGUuc2hvd1BhZ2luYXRpb25JbnB1dCh0KSkscmMoMSksRG0oImRpc2FibGVkIixlLnBhZ2VJbmRleCsxPj1lLm51bVBhZ2VzKX19ZnVuY3Rpb24gRGd0KHQsZSl7aWYoMSZ0JiYoUm0oMCwiZGl2Iiw2KSxSbSgxLCJzcGFuIiw3KSxRcCgyLHhndCwyLDEsImJ1dHRvbiIsOCksQW0oKSxSbSgzLCJzcGFuIiw5KSxRcCg0LHdndCw0LDIsImJ1dHRvbiIsMTApLEFtKCksUm0oNSwic3BhbiIsMTEpLFFwKDYsU2d0LDQsMiwic3BhbiIsMTIpLEFtKCksQW0oKSksMiZ0KXtjb25zdCB0PVltKCkuaXNCb3R0b21Db250cm9sLGU9WW0oKTtyYygyKSxEbSgibmdJZiIsZS5zaG93UGFnaW5hdGlvbkNvbnRyb2xzKSxyYygyKSxEbSgibmdJZiIsZS5zaG93RXhwYW5kKHQpKSxyYygyKSxEbSgibmdJZiIsZS5zaG93UGFnaW5hdGlvbkNvbnRyb2xzKX19ZnVuY3Rpb24gRWd0KHQsZSl7aWYoMSZ0JiZRcCgwLERndCw3LDMsImRpdiIsNSksMiZ0KXtjb25zdCB0PWUuaXNCb3R0b21Db250cm9sLG49WW0oKTtEbSgibmdJZiIsbi5zaG93UGFnaW5hdGlvbkNvbnRyb2xzfHxuLnNob3dFeHBhbmQodCkpfX1fZ3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fF9ndCkoU20oSXcpKX0sX2d0Lsm1Y21wPXRvKHt0eXBlOl9ndCxzZWxlY3RvcnM6W1siY2FyZC12aWV3Il1dLGhvc3RWYXJzOjQsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJnB1KCJmdWxsLXdpZHRoIixuLnNob3dGdWxsV2lkdGgpKCJmdWxsLWhlaWdodCIsbi5zaG93RnVsbEhlaWdodCl9LGlucHV0czp7Y2FyZElkOiJjYXJkSWQiLGdyb3VwTmFtZToiZ3JvdXBOYW1lIixwbHVnaW5UeXBlOiJwbHVnaW5UeXBlIn0sZGVjbHM6Mix2YXJzOjcsY29uc3RzOltbIm9ic2VydmVJbnRlcnNlY3Rpb24iLCIiLCJpbnRlcnNlY3Rpb25PYnNlcnZlck1hcmdpbiIsIjIwMHB4IDIwMHB4IDIwMHB4IDIwMHB4IiwzLCJpc0V2ZXJWaXNpYmxlIiwiY2FyZElkIiwiZ3JvdXBOYW1lIiwicGx1Z2luVHlwZSIsInJ1bkNvbG9yU2NhbGUiLCJmdWxsV2lkdGhDaGFuZ2VkIiwiZnVsbEhlaWdodENoYW5nZWQiLCJwaW5TdGF0ZUNoYW5nZWQiLCJvblZpc2liaWxpdHlDaGFuZ2UiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImNhcmQtdmlldy1jb21wb25lbnQiLDApLFZtKCJmdWxsV2lkdGhDaGFuZ2VkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vbkZ1bGxXaWR0aENoYW5nZWQoZSl9KSkoImZ1bGxIZWlnaHRDaGFuZ2VkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vbkZ1bGxIZWlnaHRDaGFuZ2VkKGUpfSkpKCJwaW5TdGF0ZUNoYW5nZWQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25QaW5TdGF0ZUNoYW5nZWQoKX0pKSgib25WaXNpYmlsaXR5Q2hhbmdlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblZpc2liaWxpdHlDaGFuZ2UoZSl9KSksQWgoMSwiYXN5bmMiKSxBbSgpKSwyJmUmJkRtKCJpc0V2ZXJWaXNpYmxlIixuLmlzRXZlclZpc2libGUpKCJjYXJkSWQiLG4uY2FyZElkKSgiZ3JvdXBOYW1lIixuLmdyb3VwTmFtZSkoInBsdWdpblR5cGUiLG4ucGx1Z2luVHlwZSkoInJ1bkNvbG9yU2NhbGUiLFRoKDEsNSxuLnJ1bkNvbG9yU2NhbGUkKSl9LGRpcmVjdGl2ZXM6W3lndCxOZnRdLHBpcGVzOlt3TV0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9W19uZ2hvc3QtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzMwMzAzMH0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoX2d0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6ImNhcmQtdmlldyIsdGVtcGxhdGU6J1xuICAgIDxjYXJkLXZpZXctY29tcG9uZW50XG4gICAgICBbaXNFdmVyVmlzaWJsZV09ImlzRXZlclZpc2libGUiXG4gICAgICBbY2FyZElkXT0iY2FyZElkIlxuICAgICAgW2dyb3VwTmFtZV09Imdyb3VwTmFtZSJcbiAgICAgIFtwbHVnaW5UeXBlXT0icGx1Z2luVHlwZSJcbiAgICAgIFtydW5Db2xvclNjYWxlXT0icnVuQ29sb3JTY2FsZSQgfCBhc3luYyJcbiAgICAgIChmdWxsV2lkdGhDaGFuZ2VkKT0ib25GdWxsV2lkdGhDaGFuZ2VkKCRldmVudCkiXG4gICAgICAoZnVsbEhlaWdodENoYW5nZWQpPSJvbkZ1bGxIZWlnaHRDaGFuZ2VkKCRldmVudCkiXG4gICAgICAocGluU3RhdGVDaGFuZ2VkKT0ib25QaW5TdGF0ZUNoYW5nZWQoKSJcbiAgICAgIG9ic2VydmVJbnRlcnNlY3Rpb25cbiAgICAgIGludGVyc2VjdGlvbk9ic2VydmVyTWFyZ2luPSIyMDBweCAyMDBweCAyMDBweCAyMDBweCJcbiAgICAgIChvblZpc2liaWxpdHlDaGFuZ2UpPSJvblZpc2liaWxpdHlDaGFuZ2UoJGV2ZW50KSJcbiAgICA+XG4gICAgPC9jYXJkLXZpZXctY29tcG9uZW50PlxuICAnLHN0eWxlVXJsczpbImNhcmRfdmlld19jb250YWluZXIuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSx7Y2FyZElkOlt7dHlwZTp4eX1dLGdyb3VwTmFtZTpbe3R5cGU6eHl9XSxwbHVnaW5UeXBlOlt7dHlwZTp4eX1dLHNob3dGdWxsV2lkdGg6W3t0eXBlOlB5LGFyZ3M6WyJjbGFzcy5mdWxsLXdpZHRoIl19XSxzaG93RnVsbEhlaWdodDpbe3R5cGU6UHksYXJnczpbImNsYXNzLmZ1bGwtaGVpZ2h0Il19XX0pO2NvbnN0IFJndD1mdW5jdGlvbigpe3JldHVybntpc0JvdHRvbUNvbnRyb2w6ITF9fSxBZ3Q9ZnVuY3Rpb24oKXtyZXR1cm57aXNCb3R0b21Db250cm9sOiEwfX07Y2xhc3MgVGd0e2NvbnN0cnVjdG9yKHQpe3RoaXMuY2RrU2Nyb2xsYWJsZT10LHRoaXMuUGx1Z2luVHlwZT1oQSx0aGlzLnBhZ2VJbmRleENoYW5nZWQ9bmV3IExoLHRoaXMuZ3JvdXBFeHBhbnNpb25Ub2dnbGVkPW5ldyBMaH1zaG93RXhwYW5kKHQpe3JldHVybiEhdCYmdGhpcy5pc0dyb3VwRXhwYW5kYWJsZX1zaG93UGFnaW5hdGlvbklucHV0KHQpe3JldHVybiB0fWhhbmRsZVBhZ2VDaGFuZ2UodCxlKXtjb25zdCBuPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO3NldFRpbWVvdXQoKCgpPT57dGhpcy5zY3JvbGxUb0tlZXBUYXJnZXRQb3NpdGlvbihlLG4pfSksMCksdGhpcy5wYWdlSW5kZXhDaGFuZ2VkLmVtaXQodCl9c2Nyb2xsVG9LZWVwVGFyZ2V0UG9zaXRpb24odCxlKXt2YXIgbjtjb25zdCBvPW51bGw9PT0obj10aGlzLmNka1Njcm9sbGFibGUpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmdldEVsZW1lbnRSZWYoKS5uYXRpdmVFbGVtZW50O28mJm8uc2Nyb2xsVG8oMCx0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcC1lK28uc2Nyb2xsVG9wKX10cmFja0J5Q2FyZHModCxlKXtyZXR1cm4gZS5jYXJkSWR9b25QYWdpbmF0aW9uSW5wdXRDaGFuZ2UodCl7Y29uc3QgZT10LnRhcmdldDtpZigiaW5wdXQiPT09dC50eXBlJiYiIj09PWUudmFsdWUpcmV0dXJuO2NvbnN0IG49TnVtYmVyKGUudmFsdWUpLTEsbz1NYXRoLm1pbihNYXRoLm1heCgwLG4pLHRoaXMubnVtUGFnZXMtMSk7ZS52YWx1ZSE9PVN0cmluZyhvKzEpJiYoZS52YWx1ZT1TdHJpbmcobysxKSksdGhpcy5oYW5kbGVQYWdlQ2hhbmdlKG8sZSl9fVRndC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VGd0KShTbShtRiw4KSl9LFRndC7JtWNtcD10byh7dHlwZTpUZ3Qsc2VsZWN0b3JzOltbIm1ldHJpY3MtY2FyZC1ncmlkLWNvbXBvbmVudCJdXSxpbnB1dHM6e2lzR3JvdXBFeHBhbmRhYmxlOiJpc0dyb3VwRXhwYW5kYWJsZSIsaXNHcm91cEV4cGFuZGVkOiJpc0dyb3VwRXhwYW5kZWQiLGdyb3VwTmFtZToiZ3JvdXBOYW1lIixwYWdlSW5kZXg6InBhZ2VJbmRleCIsbnVtUGFnZXM6Im51bVBhZ2VzIixjYXJkSWRzV2l0aE1ldGFkYXRhOiJjYXJkSWRzV2l0aE1ldGFkYXRhIixjYXJkT2JzZXJ2ZXI6ImNhcmRPYnNlcnZlciIsc2hvd1BhZ2luYXRpb25Db250cm9sczoic2hvd1BhZ2luYXRpb25Db250cm9scyJ9LG91dHB1dHM6e3BhZ2VJbmRleENoYW5nZWQ6InBhZ2VJbmRleENoYW5nZWQiLGdyb3VwRXhwYW5zaW9uVG9nZ2xlZDoiZ3JvdXBFeHBhbnNpb25Ub2dnbGVkIn0sZGVjbHM6Nix2YXJzOjgsY29uc3RzOmZ1bmN0aW9uKCl7bGV0IHQsZSxuO3JldHVybiB0PSJ1bmRlZmluZWQiIT10eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUmJm5nSTE4bkNsb3N1cmVNb2RlP2dvb2cuZ2V0TXNnKCJQcmV2aW91cyBwYWdlIik6JGxvY2FsaXplYDpBIGJ1dHRvbiB0aGF0IHNldHMgYSBncm91cCB0byB0aGUgcHJldmlvdXMgcGFnZS7ikJ81NzVlNzgyZmQyN2YyZWU3MGEwMzRhNzc1ZWZlOWFkMTYyNDcyMjUw4pCfMzYyOTk2MDU0NDg3NTM2MDA0NjpQcmV2aW91cyBwYWdlYCxlPSJ1bmRlZmluZWQiIT10eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUmJm5nSTE4bkNsb3N1cmVNb2RlP2dvb2cuZ2V0TXNnKCJFeHBhbmQgZ3JvdXAiKTokbG9jYWxpemVgOkEgYnV0dG9uIHRoYXQgYWxsb3dzIHVzZXIgdG8gZXhwYW5kIGEgdGFnIGdyb3VwLuKQn2ZmYWExMTQ3MWI4NzhhNmRmZmUyZTY4YzZmMzcwNjRhOWUwNzQ4NTPikJ81Mzg2MDU0MzI1Mjc0Nzc5MjU4OkV4cGFuZCBncm91cGAsbj0idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZT9nb29nLmdldE1zZygiTmV4dCBwYWdlIik6JGxvY2FsaXplYDpBIGJ1dHRvbiB0aGF0IHNldHMgYSBncm91cCB0byB0aGUgbmV4dCBwYWdlLuKQn2NlM2NlZmIxY2QwMDk5YWE1MDAzZGRhMTZlYzllYjIxZmQ4YmE3ODnikJ8zMzM3MzAxNjk0MjEwMjg3NTk1Ok5leHQgcGFnZWAsW1s0LCJuZ1RlbXBsYXRlT3V0bGV0IiwibmdUZW1wbGF0ZU91dGxldENvbnRleHQiXSxbMSwiY2FyZC1ncmlkIl0sWzMsImNhcmRJZCIsImdyb3VwTmFtZSIsInBsdWdpblR5cGUiLCJjYXJkT2JzZXJ2ZXIiLCJjYXJkTGF6eUxvYWRlciIsNCwibmdGb3IiLCJuZ0Zvck9mIiwibmdGb3JUcmFja0J5Il0sWyJncm91cENvbnRyb2xzIiwiIl0sWzMsImNhcmRJZCIsImdyb3VwTmFtZSIsInBsdWdpblR5cGUiLCJjYXJkT2JzZXJ2ZXIiLCJjYXJkTGF6eUxvYWRlciJdLFsiY2xhc3MiLCJncm91cC1jb250cm9scyIsNCwibmdJZiJdLFsxLCJncm91cC1jb250cm9scyJdLFsxLCJwcmV2LWNvbnRhaW5lciJdLFsiY2xhc3MiLCJwcmV2IHBhZ2luYXRpb24tYnV0dG9uIiwibWF0LWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLHQsMywiZGlzYWJsZWQiLCJjbGljayIsNCwibmdJZiJdLFsxLCJleHBhbmQtY29udGFpbmVyIl0sWyJjbGFzcyIsImV4cGFuZC1ncm91cC1idXR0b24iLCJtYXQtaWNvbi1idXR0b24iLCIiLCJhcmlhLWxhYmVsIixlLDMsImNsaWNrIiw0LCJuZ0lmIl0sWzEsImlucHV0LWFuZC1uZXh0LWNvbnRhaW5lciJdLFs0LCJuZ0lmIl0sWyJtYXQtYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsdCwxLCJwcmV2IiwicGFnaW5hdGlvbi1idXR0b24iLDMsImRpc2FibGVkIiwiY2xpY2siXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLGUsMSwiZXhwYW5kLWdyb3VwLWJ1dHRvbiIsMywiY2xpY2siXSxbInN2Z0ljb24iLCJleHBhbmRfbGVzc18yNHB4Iiw0LCJuZ0lmIiwibmdJZkVsc2UiXSxbImV4cGFuZE1vcmUiLCIiXSxbInN2Z0ljb24iLCJleHBhbmRfbGVzc18yNHB4Il0sWyJzdmdJY29uIiwiZXhwYW5kX21vcmVfMjRweCJdLFsiY2xhc3MiLCJwYWdpbmF0aW9uLWlucHV0Iiw0LCJuZ0lmIl0sWyJtYXQtYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsbiwxLCJuZXh0IiwicGFnaW5hdGlvbi1idXR0b24iLDMsImRpc2FibGVkIiwiY2xpY2siXSxbMSwicGFnaW5hdGlvbi1pbnB1dCJdLFsidHlwZSIsIm51bWJlciIsIm1pbiIsIjEiLDMsInZhbHVlIiwibWF4IiwiaW5wdXQiLCJjaGFuZ2UiXV19LHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihRcCgwLENndCwxLDAsIm5nLWNvbnRhaW5lciIsMCksUm0oMSwiZGl2IiwxKSxRcCgyLE1ndCwxLDUsImNhcmQtdmlldyIsMiksQW0oKSxRcCgzLHZndCwxLDAsIm5nLWNvbnRhaW5lciIsMCksUXAoNCxFZ3QsMSwxLCJuZy10ZW1wbGF0ZSIsbnVsbCwzLGliKSksMiZlKXtjb25zdCB0PSRwKDUpO0RtKCJuZ1RlbXBsYXRlT3V0bGV0Iix0KSgibmdUZW1wbGF0ZU91dGxldENvbnRleHQiLENoKDYsUmd0KSkscmMoMiksRG0oIm5nRm9yT2YiLG4uY2FyZElkc1dpdGhNZXRhZGF0YSkoIm5nRm9yVHJhY2tCeSIsbi50cmFja0J5Q2FyZHMpLHJjKDEpLERtKCJuZ1RlbXBsYXRlT3V0bGV0Iix0KSgibmdUZW1wbGF0ZU91dGxldENvbnRleHQiLENoKDcsQWd0KSl9fSxkaXJlY3RpdmVzOltNTSxsTSxfZ3QsbTIsZE0sWEgsRFddLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV17Y29udGFpbjpjb250ZW50fS5jYXJkLWdyaWRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KDMzNXB4LCBhdXRvKSk7Z2FwOjE2cHg7cGFkZGluZzoxNnB4fWNhcmQtdmlld1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjFweCBzb2xpZCAjZWJlYmViO2JvcmRlci1yYWRpdXM6NHB4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtjb250YWluOnN0cmljdDtoZWlnaHQ6MTAwJTttaW4taGVpZ2h0OjMyMHB4fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIGNhcmQtdmlld1tfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIGNhcmQtdmlld1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjFweCBzb2xpZCAjNTU1fWNhcmQtdmlldy5mdWxsLXdpZHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtjb250YWluOmxheW91dCBwYWludDtncmlkLWNvbHVtbi1zdGFydDoxO2dyaWQtY29sdW1uLWVuZDotMX1jYXJkLXZpZXcuZnVsbC1oZWlnaHRbX25nY29udGVudC0lQ09NUCVde21pbi1oZWlnaHQ6NDgwcHh9Lmdyb3VwLWNvbnRyb2xzW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxO2Rpc3BsYXk6Z3JpZDthbGlnbi1pdGVtczpjZW50ZXI7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnIgMWZyO2dhcDoxNnB4O3BhZGRpbmc6MCAxNnB4fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cC1jb250cm9sc1tfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cC1jb250cm9sc1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9Lmdyb3VwLWNvbnRyb2xzW19uZ2NvbnRlbnQtJUNPTVAlXTpmaXJzdC1vZi10eXBle3BhZGRpbmctdG9wOjE2cHh9Lmdyb3VwLWNvbnRyb2xzW19uZ2NvbnRlbnQtJUNPTVAlXTpsYXN0LW9mLXR5cGV7cGFkZGluZy1ib3R0b206MTZweH0ucHJldi1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2p1c3RpZnktc2VsZjpmbGV4LXN0YXJ0fS5leHBhbmQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtqdXN0aWZ5LXNlbGY6Y2VudGVyfS5pbnB1dC1hbmQtbmV4dC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2p1c3RpZnktc2VsZjpmbGV4LWVuZH0ucGFnaW5hdGlvbi1pbnB1dFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXJpZ2h0OjE2cHh9LnBhZ2luYXRpb24taW5wdXRbX25nY29udGVudC0lQ09NUCVdICAgaW5wdXRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOjFweCBzb2xpZCBjdXJyZW50Q29sb3I7Y29sb3I6aW5oZXJpdDtmb250OmluaGVyaXR9LmV4cGFuZC1ncm91cC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAucGFnaW5hdGlvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjE7YmFja2dyb3VuZC1jb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5leHBhbmQtZ3JvdXAtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmV4cGFuZC1ncm91cC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5wYWdpbmF0aW9uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5wYWdpbmF0aW9uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9LmV4cGFuZC1ncm91cC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOmRpc2FibGVkLCAucGFnaW5hdGlvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdOmRpc2FibGVke2NvbG9yOiM3NTc1NzV9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmV4cGFuZC1ncm91cC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOmRpc2FibGVkLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuZXhwYW5kLWdyb3VwLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06ZGlzYWJsZWR7Y29sb3I6IzYxNjE2MX1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAucGFnaW5hdGlvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdOmRpc2FibGVkLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAucGFnaW5hdGlvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdOmRpc2FibGVke2NvbG9yOiM2MTYxNjF9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFRndCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtZXRyaWNzLWNhcmQtZ3JpZC1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiIuL2NhcmRfZ3JpZF9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9jYXJkX2dyaWRfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTptRixkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfV19KSx7aXNHcm91cEV4cGFuZGFibGU6W3t0eXBlOnh5fV0saXNHcm91cEV4cGFuZGVkOlt7dHlwZTp4eX1dLGdyb3VwTmFtZTpbe3R5cGU6eHl9XSxwYWdlSW5kZXg6W3t0eXBlOnh5fV0sbnVtUGFnZXM6W3t0eXBlOnh5fV0sY2FyZElkc1dpdGhNZXRhZGF0YTpbe3R5cGU6eHl9XSxjYXJkT2JzZXJ2ZXI6W3t0eXBlOnh5fV0sc2hvd1BhZ2luYXRpb25Db250cm9sczpbe3R5cGU6eHl9XSxwYWdlSW5kZXhDaGFuZ2VkOlt7dHlwZTpPeX1dLGdyb3VwRXhwYW5zaW9uVG9nZ2xlZDpbe3R5cGU6T3l9XX0pO2NsYXNzIE5ndHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5ncm91cE5hbWU9bnVsbCx0aGlzLmdyb3VwTmFtZSQ9bmV3IEYobnVsbCksdGhpcy5wYWdlSW5kZXgkPW5ldyBGKDApLHRoaXMuaXRlbXMkPW5ldyBGKFtdKSx0aGlzLm5nVW5zdWJzY3JpYmU9bmV3IEksdGhpcy5udW1QYWdlcyQ9V3QoW3RoaXMuaXRlbXMkLHRoaXMuc3RvcmUuc2VsZWN0KFJOKV0pLnBpcGUoSXQoKChbdCxlXSk9Pk1hdGguY2VpbCh0Lmxlbmd0aC9lKSkpKSx0aGlzLmlzR3JvdXBFeHBhbmRlZCQ9dGhpcy5ncm91cE5hbWUkLnBpcGUoemUoKHQ9Pm51bGwhPT10P3RoaXMuc3RvcmUuc2VsZWN0KFZULHQpOkV0KCEwKSkpKSx0aGlzLnNob3dQYWdpbmF0aW9uQ29udHJvbHMkPVd0KFt0aGlzLm51bVBhZ2VzJCx0aGlzLnN0b3JlLnNlbGVjdChSTiksdGhpcy5pc0dyb3VwRXhwYW5kZWQkXSkucGlwZShJdCgoKFt0LGUsbl0pPT4hKHQ8PTEpJiYoZTw9M3x8bikpKSksdGhpcy5pc0dyb3VwRXhwYW5kYWJsZSQ9V3QoW3RoaXMuaXRlbXMkLHRoaXMuc3RvcmUuc2VsZWN0KFJOKV0pLnBpcGUoSXQoKChbdCxlXSk9PiEobnVsbD09PXRoaXMuZ3JvdXBOYW1lfHxlPD0zfHx0Lmxlbmd0aDw9MykpKSksdGhpcy5ub3JtYWxpemVkUGFnZUluZGV4JD1XdChbdGhpcy5wYWdlSW5kZXgkLHRoaXMubnVtUGFnZXMkXSkucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpLEZlKCgoW3QsZV0pPT57MCE9PWUmJih0Pj1lP3RoaXMucGFnZUluZGV4JC5uZXh0KGUtMSk6dDwwJiZ0aGlzLnBhZ2VJbmRleCQubmV4dCgwKSl9KSksSXQoKChbdCxlXSk9Pk1hdGgubWluKE1hdGgubWF4KHQsMCksZS0xKSkpLEFlKDEpKSx0aGlzLnBhZ2VkSXRlbXMkPVd0KFt0aGlzLml0ZW1zJCx0aGlzLnN0b3JlLnNlbGVjdChSTiksdGhpcy5ub3JtYWxpemVkUGFnZUluZGV4JCx0aGlzLmlzR3JvdXBFeHBhbmRlZCRdKS5waXBlKEl0KCgoW3QsZSxuLG9dKT0+e2NvbnN0IGk9ZSpuLGE9ZSpuK01hdGgubWluKG8/ZTozLGUpO3JldHVybiB0LnNsaWNlKGksYSl9KSkpfW5nT25DaGFuZ2VzKHQpe3QuY2FyZElkc1dpdGhNZXRhZGF0YSYmdGhpcy5pdGVtcyQubmV4dCh0aGlzLmNhcmRJZHNXaXRoTWV0YWRhdGEpLHQuZ3JvdXBOYW1lJiZ0aGlzLmdyb3VwTmFtZSQubmV4dCh0aGlzLmdyb3VwTmFtZSl9bmdPbkRlc3Ryb3koKXt0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpLHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpfW9uUGFnZUluZGV4Q2hhbmdlZCh0KXt0aGlzLnBhZ2VJbmRleCQubmV4dCh0KX1vbkdyb3VwRXhwYW5zaW9uVG9nZ2xlZCgpe2lmKG51bGw9PT10aGlzLmdyb3VwTmFtZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YXJpYW50IGVycm9yOiBleHBhbnNpb24gY2Fubm90IGJlIHRvZ2dsZWQgd2hlbiBncm91cE5hbWUgaXMgbnVsbCIpO3RoaXMuc3RvcmUuZGlzcGF0Y2goblIoe3RhZ0dyb3VwOnRoaXMuZ3JvdXBOYW1lfSkpfX1mdW5jdGlvbiB6Z3QodCxlKXtpZigxJnQmJihSbSgwLCJzcGFuIiw4KSxrdSgxKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtyYygxKSxEdSgiIix0LmNhcmRJZHNXaXRoTWV0YWRhdGEubGVuZ3RoLCIgY2FyZHMiKX19ZnVuY3Rpb24gSWd0KHQsZSl7MSZ0JiYoUm0oMCwic3BhbiIsOSksa3UoMSwiTmV3IGNhcmQgcGlubmVkIiksQW0oKSksMiZ0JiZqcCgiZGF0YS1pZCIsZS4kaW1wbGljaXQpfWZ1bmN0aW9uIEhndCh0LGUpe2lmKDEmdCYmVG0oMCwibWV0cmljcy1jYXJkLWdyaWQiLDEwKSwyJnQpe2NvbnN0IHQ9WW0oKTtEbSgiY2FyZElkc1dpdGhNZXRhZGF0YSIsdC5jYXJkSWRzV2l0aE1ldGFkYXRhKSgiY2FyZE9ic2VydmVyIix0LmNhcmRPYnNlcnZlcil9fWZ1bmN0aW9uIEZndCh0LGUpezEmdCYmKFJtKDAsImRpdiIsMTEpLGt1KDEsIlBpbiBjYXJkcyBmb3IgYSBxdWljayB2aWV3IGFuZCBjb21wYXJpc29uIiksQW0oKSl9Tmd0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxOZ3QpKFNtKEl3KSl9LE5ndC7JtWNtcD10byh7dHlwZTpOZ3Qsc2VsZWN0b3JzOltbIm1ldHJpY3MtY2FyZC1ncmlkIl1dLGlucHV0czp7Z3JvdXBOYW1lOiJncm91cE5hbWUiLGNhcmRJZHNXaXRoTWV0YWRhdGE6ImNhcmRJZHNXaXRoTWV0YWRhdGEiLGNhcmRPYnNlcnZlcjoiY2FyZE9ic2VydmVyIn0sZmVhdHVyZXM6W0JvXSxkZWNsczo3LHZhcnM6MjAsY29uc3RzOltbMywiaXNHcm91cEV4cGFuZGFibGUiLCJpc0dyb3VwRXhwYW5kZWQiLCJncm91cE5hbWUiLCJwYWdlSW5kZXgiLCJudW1QYWdlcyIsInNob3dQYWdpbmF0aW9uQ29udHJvbHMiLCJjYXJkSWRzV2l0aE1ldGFkYXRhIiwiY2FyZE9ic2VydmVyIiwicGFnZUluZGV4Q2hhbmdlZCIsImdyb3VwRXhwYW5zaW9uVG9nZ2xlZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwibWV0cmljcy1jYXJkLWdyaWQtY29tcG9uZW50IiwwKSxWbSgicGFnZUluZGV4Q2hhbmdlZCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25QYWdlSW5kZXhDaGFuZ2VkKGUpfSkpKCJncm91cEV4cGFuc2lvblRvZ2dsZWQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25Hcm91cEV4cGFuc2lvblRvZ2dsZWQoKX0pKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQWgoMywiYXN5bmMiKSxBaCg0LCJhc3luYyIpLEFoKDUsImFzeW5jIiksQWgoNiwiYXN5bmMiKSxBbSgpKSwyJmUmJkRtKCJpc0dyb3VwRXhwYW5kYWJsZSIsVGgoMSw4LG4uaXNHcm91cEV4cGFuZGFibGUkKSkoImlzR3JvdXBFeHBhbmRlZCIsVGgoMiwxMCxuLmlzR3JvdXBFeHBhbmRlZCQpKSgiZ3JvdXBOYW1lIixuLmdyb3VwTmFtZSkoInBhZ2VJbmRleCIsVGgoMywxMixuLm5vcm1hbGl6ZWRQYWdlSW5kZXgkKSkoIm51bVBhZ2VzIixUaCg0LDE0LG4ubnVtUGFnZXMkKSkoInNob3dQYWdpbmF0aW9uQ29udHJvbHMiLFRoKDUsMTYsbi5zaG93UGFnaW5hdGlvbkNvbnRyb2xzJCkpKCJjYXJkSWRzV2l0aE1ldGFkYXRhIixUaCg2LDE4LG4ucGFnZWRJdGVtcyQpKSgiY2FyZE9ic2VydmVyIixuLmNhcmRPYnNlcnZlcil9LGRpcmVjdGl2ZXM6W1RndF0scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKE5ndCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtZXRyaWNzLWNhcmQtZ3JpZCIsdGVtcGxhdGU6J1xuICAgIDxtZXRyaWNzLWNhcmQtZ3JpZC1jb21wb25lbnRcbiAgICAgIFtpc0dyb3VwRXhwYW5kYWJsZV09ImlzR3JvdXBFeHBhbmRhYmxlJCB8IGFzeW5jIlxuICAgICAgW2lzR3JvdXBFeHBhbmRlZF09ImlzR3JvdXBFeHBhbmRlZCQgfCBhc3luYyJcbiAgICAgIFtncm91cE5hbWVdPSJncm91cE5hbWUiXG4gICAgICBbcGFnZUluZGV4XT0ibm9ybWFsaXplZFBhZ2VJbmRleCQgfCBhc3luYyJcbiAgICAgIFtudW1QYWdlc109Im51bVBhZ2VzJCB8IGFzeW5jIlxuICAgICAgW3Nob3dQYWdpbmF0aW9uQ29udHJvbHNdPSJzaG93UGFnaW5hdGlvbkNvbnRyb2xzJCB8IGFzeW5jIlxuICAgICAgW2NhcmRJZHNXaXRoTWV0YWRhdGFdPSJwYWdlZEl0ZW1zJCB8IGFzeW5jIlxuICAgICAgW2NhcmRPYnNlcnZlcl09ImNhcmRPYnNlcnZlciJcbiAgICAgIChwYWdlSW5kZXhDaGFuZ2VkKT0ib25QYWdlSW5kZXhDaGFuZ2VkKCRldmVudCkiXG4gICAgICAoZ3JvdXBFeHBhbnNpb25Ub2dnbGVkKT0ib25Hcm91cEV4cGFuc2lvblRvZ2dsZWQoKSJcbiAgICA+XG4gICAgPC9tZXRyaWNzLWNhcmQtZ3JpZC1jb21wb25lbnQ+XG4gICcsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSx7Z3JvdXBOYW1lOlt7dHlwZTp4eX1dLGNhcmRJZHNXaXRoTWV0YWRhdGE6W3t0eXBlOnh5fV0sY2FyZE9ic2VydmVyOlt7dHlwZTp4eX1dfSk7Y2xhc3MgTGd0e31MZ3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fExndCl9LExndC7JtWNtcD10byh7dHlwZTpMZ3Qsc2VsZWN0b3JzOltbIm1ldHJpY3MtcGlubmVkLXZpZXctY29tcG9uZW50Il1dLGlucHV0czp7Y2FyZE9ic2VydmVyOiJjYXJkT2JzZXJ2ZXIiLGNhcmRJZHNXaXRoTWV0YWRhdGE6ImNhcmRJZHNXaXRoTWV0YWRhdGEiLG5ld0NhcmRQaW5uZWRJZHM6Im5ld0NhcmRQaW5uZWRJZHMifSxkZWNsczoxMCx2YXJzOjQsY29uc3RzOltbMSwiZ3JvdXAtdG9vbGJhciJdLFsic3ZnSWNvbiIsImtlZXBfMjRweCJdLFsxLCJncm91cC10ZXh0Il0sWyJhcmlhLXJvbGUiLCJoZWFkaW5nIiwiYXJpYS1sZXZlbCIsIjMiLDEsImdyb3VwLXRpdGxlIl0sWyJjbGFzcyIsImdyb3VwLWNhcmQtY291bnQiLDQsIm5nSWYiXSxbImNsYXNzIiwibmV3LWNhcmQtcGlubmVkIiw0LCJuZ0ZvciIsIm5nRm9yT2YiXSxbMywiY2FyZElkc1dpdGhNZXRhZGF0YSIsImNhcmRPYnNlcnZlciIsNCwibmdJZiIsIm5nSWZFbHNlIl0sWyJlbXB0eVBpbm5lZFZpZXciLCIiXSxbMSwiZ3JvdXAtY2FyZC1jb3VudCJdLFsxLCJuZXctY2FyZC1waW5uZWQiXSxbMywiY2FyZElkc1dpdGhNZXRhZGF0YSIsImNhcmRPYnNlcnZlciJdLFsxLCJlbXB0eS1tZXNzYWdlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihSbSgwLCJkaXYiLDApLFRtKDEsIm1hdC1pY29uIiwxKSxSbSgyLCJzcGFuIiwyKSxSbSgzLCJzcGFuIiwzKSxrdSg0LCJQaW5uZWQiKSxBbSgpLFFwKDUsemd0LDIsMSwic3BhbiIsNCksUXAoNixJZ3QsMiwxLCJzcGFuIiw1KSxBbSgpLEFtKCksUXAoNyxIZ3QsMSwyLCJtZXRyaWNzLWNhcmQtZ3JpZCIsNiksUXAoOCxGZ3QsMiwwLCJuZy10ZW1wbGF0ZSIsbnVsbCw3LGliKSksMiZlKXtjb25zdCB0PSRwKDkpO3JjKDUpLERtKCJuZ0lmIixuLmNhcmRJZHNXaXRoTWV0YWRhdGEubGVuZ3RoPjEpLHJjKDEpLERtKCJuZ0Zvck9mIixuLm5ld0NhcmRQaW5uZWRJZHMpLHJjKDEpLERtKCJuZ0lmIixuLmNhcmRJZHNXaXRoTWV0YWRhdGEubGVuZ3RoKSgibmdJZkVsc2UiLHQpfX0sZGlyZWN0aXZlczpbRFcsZE0sbE0sTmd0XSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVdICAgLmdyb3VwLXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmViO2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7ZGlzcGxheTpmbGV4O2ZsZXg6bm9uZTtoZWlnaHQ6NDJweDttYXJnaW4tYm90dG9tOi0xcHg7cGFkZGluZzowIDE2cHg7cG9zaXRpb246c3RpY2t5O3RvcDowO3otaW5kZXg6MTtib3gtc2hhZG93OjBweCAycHggNHB4IDBweCByZ2JhKDAsMCwwLC4xNSl9Ym9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmdyb3VwLXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzMwMzAzMH1ib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXAtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzU1NX1ib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXAtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAwcHggcmdiYSgyNTUsMjU1LDI1NSwuMTUpfW1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxO2ZsZXg6bm9uZTttYXJnaW4tcmlnaHQ6NXB4fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIG1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgbWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfS5ncm91cC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6YmFzZWxpbmU7Z2FwOjZweH0uZ3JvdXAtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0uZ3JvdXAtY2FyZC1jb3VudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM2MTYxNjF9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLmdyb3VwLWNhcmQtY291bnRbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXAtY2FyZC1jb3VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9LmVtcHR5LW1lc3NhZ2VbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjE7Zm9udC1zaXplOjEzcHg7Zm9udC1zdHlsZTppdGFsaWM7cGFkZGluZzoxNnB4O3RleHQtYWxpZ246Y2VudGVyfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5lbXB0eS1tZXNzYWdlW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmVtcHR5LW1lc3NhZ2VbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfS5uZXctY2FyZC1waW5uZWRbX25nY29udGVudC0lQ09NUCVde2FuaW1hdGlvbjpwaW5uZWQtdmlldy1mYWRlLW91dCAzcyBsaW5lYXI7YmFja2dyb3VuZDojZjQ0MzM2O2JvcmRlci1yYWRpdXM6NXB4O2NvbG9yOiNmZmY7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOjEzcHg7b3BhY2l0eTowO3BhZGRpbmc6M3B4IDVweH1Aa2V5ZnJhbWVzIHBpbm5lZC12aWV3LWZhZGUtb3V0e2Zyb217b3BhY2l0eToxfTY2JXtvcGFjaXR5Oi45OX10b3tvcGFjaXR5OjB9fSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChMZ3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWV0cmljcy1waW5uZWQtdmlldy1jb21wb25lbnQiLHRlbXBsYXRlOidcbiAgICA8ZGl2IGNsYXNzPSJncm91cC10b29sYmFyIj5cbiAgICAgIDxtYXQtaWNvbiBzdmdJY29uPSJrZWVwXzI0cHgiPjwvbWF0LWljb24+XG4gICAgICA8c3BhbiBjbGFzcz0iZ3JvdXAtdGV4dCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPSJncm91cC10aXRsZSIgYXJpYS1yb2xlPSJoZWFkaW5nIiBhcmlhLWxldmVsPSIzIlxuICAgICAgICAgID5QaW5uZWQ8L3NwYW5cbiAgICAgICAgPlxuICAgICAgICA8c3BhbiAqbmdJZj0iY2FyZElkc1dpdGhNZXRhZGF0YS5sZW5ndGggPiAxIiBjbGFzcz0iZ3JvdXAtY2FyZC1jb3VudCJcbiAgICAgICAgICA+e3sgY2FyZElkc1dpdGhNZXRhZGF0YS5sZW5ndGggfX0gY2FyZHM8L3NwYW5cbiAgICAgICAgPlxuICAgICAgICA8c3BhblxuICAgICAgICAgICpuZ0Zvcj0ibGV0IGlkIG9mIG5ld0NhcmRQaW5uZWRJZHMiXG4gICAgICAgICAgW2F0dHIuZGF0YS1pZF09ImlkIlxuICAgICAgICAgIGNsYXNzPSJuZXctY2FyZC1waW5uZWQiXG4gICAgICAgICAgPk5ldyBjYXJkIHBpbm5lZDwvc3BhblxuICAgICAgICA+XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPG1ldHJpY3MtY2FyZC1ncmlkXG4gICAgICAqbmdJZj0iY2FyZElkc1dpdGhNZXRhZGF0YS5sZW5ndGg7IGVsc2UgZW1wdHlQaW5uZWRWaWV3IlxuICAgICAgW2NhcmRJZHNXaXRoTWV0YWRhdGFdPSJjYXJkSWRzV2l0aE1ldGFkYXRhIlxuICAgICAgW2NhcmRPYnNlcnZlcl09ImNhcmRPYnNlcnZlciJcbiAgICA+PC9tZXRyaWNzLWNhcmQtZ3JpZD5cbiAgICA8bmctdGVtcGxhdGUgI2VtcHR5UGlubmVkVmlldz5cbiAgICAgIDxkaXYgY2xhc3M9ImVtcHR5LW1lc3NhZ2UiPlBpbiBjYXJkcyBmb3IgYSBxdWljayB2aWV3IGFuZCBjb21wYXJpc29uPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgJyxzdHlsZVVybHM6WyJwaW5uZWRfdmlld19jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7Y2FyZE9ic2VydmVyOlt7dHlwZTp4eX1dLGNhcmRJZHNXaXRoTWV0YWRhdGE6W3t0eXBlOnh5fV0sbmV3Q2FyZFBpbm5lZElkczpbe3R5cGU6eHl9XX0pO2NsYXNzIEJndHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5jYXJkSWRzV2l0aE1ldGFkYXRhJD10aGlzLnN0b3JlLnNlbGVjdChQVCkucGlwZShOZShbXSkpLHRoaXMubmV3Q2FyZFBpbm5lZElkcyQ9dGhpcy5zdG9yZS5zZWxlY3QoUFQpLnBpcGUoVGUoMSksSXQoKHQ9PnQubWFwKCh0PT50LmNhcmRJZCkpKSksRGUoKSxJdCgoKFt0LGVdKT0+e2NvbnN0IG49bmV3IFNldCh0KSxvPW5ldyBTZXQoZSk7Zm9yKGNvbnN0IHQgb2YgbylpZighbi5oYXModCkpcmV0dXJuIERhdGUubm93KCk7cmV0dXJuIG51bGx9KSksTmUobnVsbCksRGUoKSxJdCgoKFt0LGVdKT0+bnVsbD09PXQmJm51bGw9PT1lP251bGw6bnVsbD09PWU/W3RdOltlXSkpLGNlKCh0PT5udWxsIT09dCkpLEl0KCh0PT5bdFswXV0pKSl9fUJndC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8Qmd0KShTbShJdykpfSxCZ3QuybVjbXA9dG8oe3R5cGU6Qmd0LHNlbGVjdG9yczpbWyJtZXRyaWNzLXBpbm5lZC12aWV3Il1dLGlucHV0czp7Y2FyZE9ic2VydmVyOiJjYXJkT2JzZXJ2ZXIifSxkZWNsczozLHZhcnM6Nyxjb25zdHM6W1szLCJjYXJkSWRzV2l0aE1ldGFkYXRhIiwibmV3Q2FyZFBpbm5lZElkcyIsImNhcmRPYnNlcnZlciJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwibWV0cmljcy1waW5uZWQtdmlldy1jb21wb25lbnQiLDApLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSksMiZlJiZEbSgiY2FyZElkc1dpdGhNZXRhZGF0YSIsVGgoMSwzLG4uY2FyZElkc1dpdGhNZXRhZGF0YSQpKSgibmV3Q2FyZFBpbm5lZElkcyIsVGgoMiw1LG4ubmV3Q2FyZFBpbm5lZElkcyQpKSgiY2FyZE9ic2VydmVyIixuLmNhcmRPYnNlcnZlcil9LGRpcmVjdGl2ZXM6W0xndF0scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEJndCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtZXRyaWNzLXBpbm5lZC12aWV3Iix0ZW1wbGF0ZTonXG4gICAgPG1ldHJpY3MtcGlubmVkLXZpZXctY29tcG9uZW50XG4gICAgICBbY2FyZElkc1dpdGhNZXRhZGF0YV09ImNhcmRJZHNXaXRoTWV0YWRhdGEkIHwgYXN5bmMiXG4gICAgICBbbmV3Q2FyZFBpbm5lZElkc109Im5ld0NhcmRQaW5uZWRJZHMkIHwgYXN5bmMiXG4gICAgICBbY2FyZE9ic2VydmVyXT0iY2FyZE9ic2VydmVyIlxuICAgID48L21ldHJpY3MtcGlubmVkLXZpZXctY29tcG9uZW50PlxuICAnLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSkse2NhcmRPYnNlcnZlcjpbe3R5cGU6eHl9XX0pO2NvbnN0IFZndD1adyhNVCxOTiwoKHQsZSk9PnQuZmlsdGVyKCh0PT4heEEodC5wbHVnaW4pfHxCb29sZWFuKGUmJmUuZ2V0KHQucnVuSWQpKSkpKSksamd0PVp3KFZndCwodD0+dC5zb3J0KCgodCxlKT0+ZzIodC50YWcsZS50YWcpKSkpKTtmdW5jdGlvbiBVZ3QodCxlKXtpZigxJnQmJihSbSgwLCJzcGFuIiw2KSxrdSgxKSxBaCgyLCJudW1iZXIiKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKS4kaW1wbGljaXQ7cmMoMSksRHUoIiIsVGgoMiwxLHQuaXRlbXMubGVuZ3RoKSwiIGNhcmRzIil9fWZ1bmN0aW9uIEdndCh0LGUpe2lmKDEmdCYmKFJtKDAsImRpdiIsMSksUm0oMSwiZGl2IiwyKSxSbSgyLCJzcGFuIiksUm0oMywic3BhbiIsMyksa3UoNCksQW0oKSxRcCg1LFVndCwzLDMsInNwYW4iLDQpLEFtKCksQW0oKSxUbSg2LCJtZXRyaWNzLWNhcmQtZ3JpZCIsNSksQW0oKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oKTtyYygzKSxLbSgidGl0bGUiLHQuZ3JvdXBOYW1lKSxyYygxKSxTdSh0Lmdyb3VwTmFtZSkscmMoMSksRG0oIm5nSWYiLHQuaXRlbXMubGVuZ3RoPjEpLHJjKDEpLERtKCJjYXJkSWRzV2l0aE1ldGFkYXRhIix0Lml0ZW1zKSgiY2FyZE9ic2VydmVyIixuLmNhcmRPYnNlcnZlcikoImdyb3VwTmFtZSIsdC5ncm91cE5hbWUpfX1jbGFzcyBXZ3R7Y29uc3RydWN0b3IoKXt0aGlzLlBsdWdpblR5cGU9aEF9dHJhY2tCeUdyb3VwKHQsZSl7cmV0dXJuIGUuZ3JvdXBOYW1lfX1XZ3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFdndCl9LFdndC7JtWNtcD10byh7dHlwZTpXZ3Qsc2VsZWN0b3JzOltbIm1ldHJpY3MtY2FyZC1ncm91cHMtY29tcG9uZW50Il1dLGlucHV0czp7Y2FyZEdyb3VwczoiY2FyZEdyb3VwcyIsY2FyZE9ic2VydmVyOiJjYXJkT2JzZXJ2ZXIifSxkZWNsczoxLHZhcnM6Mixjb25zdHM6W1siY2xhc3MiLCJjYXJkLWdyb3VwIiw0LCJuZ0ZvciIsIm5nRm9yT2YiLCJuZ0ZvclRyYWNrQnkiXSxbMSwiY2FyZC1ncm91cCJdLFsxLCJncm91cC10b29sYmFyIl0sWyJhcmlhLXJvbGUiLCJoZWFkaW5nIiwiYXJpYS1sZXZlbCIsIjMiLDEsImdyb3VwLXRpdGxlIiwzLCJ0aXRsZSJdLFsiY2xhc3MiLCJncm91cC1jYXJkLWNvdW50Iiw0LCJuZ0lmIl0sWzMsImNhcmRJZHNXaXRoTWV0YWRhdGEiLCJjYXJkT2JzZXJ2ZXIiLCJncm91cE5hbWUiXSxbMSwiZ3JvdXAtY2FyZC1jb3VudCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiZRcCgwLEdndCw3LDYsImRpdiIsMCksMiZlJiZEbSgibmdGb3JPZiIsbi5jYXJkR3JvdXBzKSgibmdGb3JUcmFja0J5IixuLnRyYWNrQnlHcm91cCl9LGRpcmVjdGl2ZXM6W2xNLGRNLE5ndF0scGlwZXM6W0ZNXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVdICAgLmdyb3VwLXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmViO2FsaWduLWl0ZW1zOmNlbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7ZGlzcGxheTpmbGV4O2ZsZXg6bm9uZTtoZWlnaHQ6NDJweDttYXJnaW4tYm90dG9tOi0xcHg7cGFkZGluZzowIDE2cHg7cG9zaXRpb246c3RpY2t5O3RvcDowO3otaW5kZXg6MTtib3gtc2hhZG93OjBweCAycHggNHB4IDBweCByZ2JhKDAsMCwwLC4xNSl9Ym9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmdyb3VwLXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzMwMzAzMH1ib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXAtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzU1NX1ib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXAtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAwcHggcmdiYSgyNTUsMjU1LDI1NSwuMTUpfVtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXAtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgI2ViZWJlYjt0b3A6LTFweH1ib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXAtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgIzU1NX0uY2FyZC1ncm91cFtfbmdjb250ZW50LSVDT01QJV06Zmlyc3Qtb2YtdHlwZSAgIC5ncm91cC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOm5vbmV9Lmdyb3VwLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lmdyb3VwLWNhcmQtY291bnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjQwMDtjb2xvcjojNjE2MTYxO21hcmdpbi1sZWZ0OjZweH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXAtY2FyZC1jb3VudFtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cC1jYXJkLWNvdW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoV2d0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1ldHJpY3MtY2FyZC1ncm91cHMtY29tcG9uZW50Iix0ZW1wbGF0ZTonXG4gICAgPGRpdlxuICAgICAgKm5nRm9yPSJsZXQgZ3JvdXAgb2YgY2FyZEdyb3VwczsgdHJhY2tCeTogdHJhY2tCeUdyb3VwIlxuICAgICAgY2xhc3M9ImNhcmQtZ3JvdXAiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz0iZ3JvdXAtdG9vbGJhciI+XG4gICAgICAgIDxzcGFuPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz0iZ3JvdXAtdGl0bGUiXG4gICAgICAgICAgICBhcmlhLXJvbGU9ImhlYWRpbmciXG4gICAgICAgICAgICBhcmlhLWxldmVsPSIzIlxuICAgICAgICAgICAgdGl0bGU9Int7IGdyb3VwLmdyb3VwTmFtZSB9fSJcbiAgICAgICAgICAgID57eyBncm91cC5ncm91cE5hbWUgfX08L3NwYW5cbiAgICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9Imdyb3VwLml0ZW1zLmxlbmd0aCA+IDEiIGNsYXNzPSJncm91cC1jYXJkLWNvdW50IlxuICAgICAgICAgICAgPnt7IGdyb3VwLml0ZW1zLmxlbmd0aCB8IG51bWJlciB9fSBjYXJkczwvc3BhblxuICAgICAgICAgID5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8bWV0cmljcy1jYXJkLWdyaWRcbiAgICAgICAgW2NhcmRJZHNXaXRoTWV0YWRhdGFdPSJncm91cC5pdGVtcyJcbiAgICAgICAgW2NhcmRPYnNlcnZlcl09ImNhcmRPYnNlcnZlciJcbiAgICAgICAgW2dyb3VwTmFtZV09Imdyb3VwLmdyb3VwTmFtZSJcbiAgICAgID48L21ldHJpY3MtY2FyZC1ncmlkPlxuICAgIDwvZGl2PlxuICAnLHN0eWxlVXJsczpbImNhcmRfZ3JvdXBzX2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSxudWxsLHtjYXJkR3JvdXBzOlt7dHlwZTp4eX1dLGNhcmRPYnNlcnZlcjpbe3R5cGU6eHl9XX0pO2NsYXNzIFlndHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5jYXJkR3JvdXBzJD10aGlzLnN0b3JlLnNlbGVjdChqZ3QpLnBpcGUoZmUodGhpcy5zdG9yZS5zZWxlY3QocVQpKSxJdCgoKFt0LGVdKT0+ZS5zaXplP3QuZmlsdGVyKCh0PT5lLmhhcyh0LnBsdWdpbikpKTp0KSksSXQoKHQ9PihmdW5jdGlvbiBlKHQpe2NvbnN0IGU9bmV3IE1hcCxuPXQuc2xpY2UoKS5zb3J0KCgodCxlKT0+ZzIodC50YWcsZS50YWcpKSk7Zm9yKGNvbnN0IHQgb2Ygbil7Y29uc3Qgbj10LnRhZy5zcGxpdCgiLyIsMSlbMF07ZS5oYXMobil8fGUuc2V0KG4se2dyb3VwTmFtZTpuLGl0ZW1zOltdfSksZS5nZXQobikuaXRlbXMucHVzaCh0KX1yZXR1cm5bLi4uZS52YWx1ZXMoKV19KSh0KSkpKX19ZnVuY3Rpb24gcWd0KHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1ZbSgpO3JjKDEpLER1KCIgYW5kICIsdC5nZXRQbHVnaW5UeXBlRmlsdGVyU3RyaW5nKHQucGx1Z2luVHlwZXMpLCIgdmlzdWFsaXphdGlvbiBmaWx0ZXIiKX19WWd0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxZZ3QpKFNtKEl3KSl9LFlndC7JtWNtcD10byh7dHlwZTpZZ3Qsc2VsZWN0b3JzOltbIm1ldHJpY3MtY2FyZC1ncm91cHMiXV0saW5wdXRzOntjYXJkT2JzZXJ2ZXI6ImNhcmRPYnNlcnZlciJ9LGRlY2xzOjIsdmFyczo0LGNvbnN0czpbWzMsImNhcmRHcm91cHMiLCJjYXJkT2JzZXJ2ZXIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFRtKDAsIm1ldHJpY3MtY2FyZC1ncm91cHMtY29tcG9uZW50IiwwKSxBaCgxLCJhc3luYyIpKSwyJmUmJkRtKCJjYXJkR3JvdXBzIixUaCgxLDIsbi5jYXJkR3JvdXBzJCkpKCJjYXJkT2JzZXJ2ZXIiLG4uY2FyZE9ic2VydmVyKX0sZGlyZWN0aXZlczpbV2d0XSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWWd0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1ldHJpY3MtY2FyZC1ncm91cHMiLHRlbXBsYXRlOidcbiAgICA8bWV0cmljcy1jYXJkLWdyb3Vwcy1jb21wb25lbnRcbiAgICAgIFtjYXJkR3JvdXBzXT0iY2FyZEdyb3VwcyQgfCBhc3luYyJcbiAgICAgIFtjYXJkT2JzZXJ2ZXJdPSJjYXJkT2JzZXJ2ZXIiXG4gICAgPjwvbWV0cmljcy1jYXJkLWdyb3Vwcy1jb21wb25lbnQ+XG4gICcsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSx7Y2FyZE9ic2VydmVyOlt7dHlwZTp4eX1dfSk7Y2xhc3MgWmd0e2NvbnN0cnVjdG9yKCl7dGhpcy5QbHVnaW5UeXBlPWhBLHRoaXMubGlzdEZvcm1hdHRlcj1uZXcgSW50bC5MaXN0Rm9ybWF0KHZvaWQgMCx7c3R5bGU6ImxvbmciLHR5cGU6ImRpc2p1bmN0aW9uIn0pfWdldFBsdWdpblR5cGVGaWx0ZXJTdHJpbmcodCl7Y29uc3QgZT1bLi4udF0ubWFwKCh0PT57c3dpdGNoKHQpe2Nhc2UgaEEuU0NBTEFSUzpyZXR1cm4ic2NhbGFyIjtjYXNlIGhBLklNQUdFUzpyZXR1cm4iaW1hZ2UiO2Nhc2UgaEEuSElTVE9HUkFNUzpyZXR1cm4iaGlzdG9ncmFtIjtkZWZhdWx0OnRocm93IG5ldyBSYW5nZUVycm9yKGBQbGVhc2UgaW1wbGVtZW50IGh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIHBsdWdpbiB0eXBlOiAke3R9YCl9fSkpO3JldHVybiB0aGlzLmxpc3RGb3JtYXR0ZXIuZm9ybWF0KGUpfX1aZ3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFpndCl9LFpndC7JtWNtcD10byh7dHlwZTpaZ3Qsc2VsZWN0b3JzOltbIm1ldHJpY3MtZW1wdHktdGFnLW1hdGNoLWNvbXBvbmVudCJdXSxpbnB1dHM6e3BsdWdpblR5cGVzOiJwbHVnaW5UeXBlcyIsdGFnRmlsdGVyUmVnZXg6InRhZ0ZpbHRlclJlZ2V4Iix0YWdDb3VudHM6InRhZ0NvdW50cyJ9LGRlY2xzOjYsdmFyczo1LGNvbnN0czpbWzQsIm5nSWYiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKGt1KDAsIk5vIG1hdGNoZXMgZm9yIHRhZyBmaWx0ZXIgIiksUm0oMSwiY29kZSIpLGt1KDIpLEFtKCksUXAoMyxxZ3QsMiwxLCJzcGFuIiwwKSxrdSg0KSxBaCg1LCJudW1iZXIiKSksMiZlJiYocmMoMiksRHUoIi8iLG4udGFnRmlsdGVyUmVnZXgsIi8iKSxyYygxKSxEbSgibmdJZiIsbi5wbHVnaW5UeXBlcy5zaXplKSxyYygxKSxEdSgiIG91dCBvZiAiLFRoKDUsMyxuLnRhZ0NvdW50cyksIiB0YWdzLiIpKX0sZGlyZWN0aXZlczpbZE1dLHBpcGVzOltGTV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChaZ3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWV0cmljcy1lbXB0eS10YWctbWF0Y2gtY29tcG9uZW50Iix0ZW1wbGF0ZTonTm8gbWF0Y2hlcyBmb3IgdGFnIGZpbHRlciA8Y29kZT4ve3sgdGFnRmlsdGVyUmVnZXggfX0vPC9jb2RlXG4gICAgPjxzcGFuICpuZ0lmPSJwbHVnaW5UeXBlcy5zaXplIj5cbiAgICAgIGFuZCB7eyBnZXRQbHVnaW5UeXBlRmlsdGVyU3RyaW5nKHBsdWdpblR5cGVzKSB9fSB2aXN1YWxpemF0aW9uXG4gICAgICBmaWx0ZXI8L3NwYW5cbiAgICA+XG4gICAgb3V0IG9mIHt7IHRhZ0NvdW50cyB8IG51bWJlciB9fSB0YWdzLicsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7cGx1Z2luVHlwZXM6W3t0eXBlOnh5fV0sdGFnRmlsdGVyUmVnZXg6W3t0eXBlOnh5fV0sdGFnQ291bnRzOlt7dHlwZTp4eX1dfSk7Y2xhc3MgWGd0e2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLnBsdWdpblR5cGVzJD10aGlzLnN0b3JlLnNlbGVjdChxVCksdGhpcy50YWdGaWx0ZXJSZWdleCQ9dGhpcy5zdG9yZS5zZWxlY3QoQlQpLHRoaXMudGFnQ291bnRzJD10aGlzLnN0b3JlLnNlbGVjdChqZ3QpLnBpcGUoSXQoKHQ9Pm5ldyBTZXQodC5tYXAoKCh7dGFnOnR9KT0+dCkpKS5zaXplKSkpfX1mdW5jdGlvbiBLZ3QodCxlKXtpZigxJnQmJihSbSgwLCJzcGFuIiw2KSxrdSgxKSxBaCgyLCJudW1iZXIiKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtyYygxKSxEdSgiIixUaCgyLDEsdC5jYXJkSWRzV2l0aE1ldGFkYXRhLmxlbmd0aCksIiBjYXJkcyIpfX1mdW5jdGlvbiBKZ3QodCxlKXsxJnQmJlRtKDAsIm1ldHJpY3MtZW1wdHktdGFnLW1hdGNoIiw3KX1YZ3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFhndCkoU20oSXcpKX0sWGd0Lsm1Y21wPXRvKHt0eXBlOlhndCxzZWxlY3RvcnM6W1sibWV0cmljcy1lbXB0eS10YWctbWF0Y2giXV0sZGVjbHM6NCx2YXJzOjksY29uc3RzOltbMywicGx1Z2luVHlwZXMiLCJ0YWdGaWx0ZXJSZWdleCIsInRhZ0NvdW50cyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwibWV0cmljcy1lbXB0eS10YWctbWF0Y2gtY29tcG9uZW50IiwwKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQWgoMywiYXN5bmMiKSksMiZlJiZEbSgicGx1Z2luVHlwZXMiLFRoKDEsMyxuLnBsdWdpblR5cGVzJCkpKCJ0YWdGaWx0ZXJSZWdleCIsVGgoMiw1LG4udGFnRmlsdGVyUmVnZXgkKSkoInRhZ0NvdW50cyIsVGgoMyw3LG4udGFnQ291bnRzJCkpfSxkaXJlY3RpdmVzOltaZ3RdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChYZ3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWV0cmljcy1lbXB0eS10YWctbWF0Y2giLHRlbXBsYXRlOidcbiAgICA8bWV0cmljcy1lbXB0eS10YWctbWF0Y2gtY29tcG9uZW50XG4gICAgICBbcGx1Z2luVHlwZXNdPSJwbHVnaW5UeXBlcyQgfCBhc3luYyJcbiAgICAgIFt0YWdGaWx0ZXJSZWdleF09InRhZ0ZpbHRlclJlZ2V4JCB8IGFzeW5jIlxuICAgICAgW3RhZ0NvdW50c109InRhZ0NvdW50cyQgfCBhc3luYyJcbiAgICA+PC9tZXRyaWNzLWVtcHR5LXRhZy1tYXRjaC1jb21wb25lbnQ+XG4gICcsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSxudWxsKTtjbGFzcyBRZ3R7fVFndC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8UWd0KX0sUWd0Lsm1Y21wPXRvKHt0eXBlOlFndCxzZWxlY3RvcnM6W1sibWV0cmljcy1maWx0ZXJlZC12aWV3LWNvbXBvbmVudCJdXSxpbnB1dHM6e2lzRW1wdHlNYXRjaDoiaXNFbXB0eU1hdGNoIixjYXJkT2JzZXJ2ZXI6ImNhcmRPYnNlcnZlciIsY2FyZElkc1dpdGhNZXRhZGF0YToiY2FyZElkc1dpdGhNZXRhZGF0YSJ9LGRlY2xzOjcsdmFyczo0LGNvbnN0czpbWzEsImdyb3VwLXRvb2xiYXIiXSxbMSwiZ3JvdXAtdGV4dCJdLFsiYXJpYS1yb2xlIiwiaGVhZGluZyIsImFyaWEtbGV2ZWwiLCIzIiwxLCJncm91cC10aXRsZSJdLFsiY2xhc3MiLCJncm91cC1jYXJkLWNvdW50Iiw0LCJuZ0lmIl0sWyJjbGFzcyIsIndhcm4iLDQsIm5nSWYiXSxbMywiY2FyZElkc1dpdGhNZXRhZGF0YSIsImNhcmRPYnNlcnZlciJdLFsxLCJncm91cC1jYXJkLWNvdW50Il0sWzEsIndhcm4iXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImRpdiIsMCksUm0oMSwic3BhbiIsMSksUm0oMiwic3BhbiIsMiksa3UoMywiVGFncyBtYXRjaGluZyBmaWx0ZXIiKSxBbSgpLFFwKDQsS2d0LDMsMywic3BhbiIsMyksQW0oKSxBbSgpLFFwKDUsSmd0LDEsMCwibWV0cmljcy1lbXB0eS10YWctbWF0Y2giLDQpLFRtKDYsIm1ldHJpY3MtY2FyZC1ncmlkIiw1KSksMiZlJiYocmMoNCksRG0oIm5nSWYiLG4uY2FyZElkc1dpdGhNZXRhZGF0YS5sZW5ndGg+MSkscmMoMSksRG0oIm5nSWYiLG4uaXNFbXB0eU1hdGNoKSxyYygxKSxEbSgiY2FyZElkc1dpdGhNZXRhZGF0YSIsbi5jYXJkSWRzV2l0aE1ldGFkYXRhKSgiY2FyZE9ic2VydmVyIixuLmNhcmRPYnNlcnZlcikpfSxkaXJlY3RpdmVzOltkTSxOZ3QsWGd0XSxwaXBlczpbRk1dLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXAtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWI7YWxpZ24taXRlbXM6Y2VudGVyO2JhY2tncm91bmQtY29sb3I6I2ZmZjtkaXNwbGF5OmZsZXg7ZmxleDpub25lO2hlaWdodDo0MnB4O21hcmdpbi1ib3R0b206LTFweDtwYWRkaW5nOjAgMTZweDtwb3NpdGlvbjpzdGlja3k7dG9wOjA7ei1pbmRleDoxO2JveC1zaGFkb3c6MHB4IDJweCA0cHggMHB4IHJnYmEoMCwwLDAsLjE1KX1ib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuZ3JvdXAtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMzAzMDMwfWJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjNTU1fWJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggNHB4IDBweCByZ2JhKDI1NSwyNTUsMjU1LC4xNSl9Lmdyb3VwLXRleHRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpiYXNlbGluZX0uZ3JvdXAtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0uZ3JvdXAtY2FyZC1jb3VudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM2MTYxNjE7bWFyZ2luLWxlZnQ6NnB4fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5ncm91cC1jYXJkLWNvdW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLmdyb3VwLWNhcmQtY291bnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfW1ldHJpY3MtZW1wdHktdGFnLW1hdGNoW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxO2ZvbnQtc2l6ZToxM3B4O2ZvbnQtc3R5bGU6aXRhbGljO3BhZGRpbmc6MTZweDt0ZXh0LWFsaWduOmNlbnRlcjtkaXNwbGF5OmJsb2NrfWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIG1ldHJpY3MtZW1wdHktdGFnLW1hdGNoW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgbWV0cmljcy1lbXB0eS10YWctbWF0Y2hbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChRZ3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWV0cmljcy1maWx0ZXJlZC12aWV3LWNvbXBvbmVudCIsdGVtcGxhdGU6J1xuICAgIDxkaXYgY2xhc3M9Imdyb3VwLXRvb2xiYXIiPlxuICAgICAgPHNwYW4gY2xhc3M9Imdyb3VwLXRleHQiPlxuICAgICAgICA8c3BhbiBjbGFzcz0iZ3JvdXAtdGl0bGUiIGFyaWEtcm9sZT0iaGVhZGluZyIgYXJpYS1sZXZlbD0iMyJcbiAgICAgICAgICA+VGFncyBtYXRjaGluZyBmaWx0ZXI8L3NwYW5cbiAgICAgICAgPlxuICAgICAgICA8c3BhbiAqbmdJZj0iY2FyZElkc1dpdGhNZXRhZGF0YS5sZW5ndGggPiAxIiBjbGFzcz0iZ3JvdXAtY2FyZC1jb3VudCJcbiAgICAgICAgICA+e3sgY2FyZElkc1dpdGhNZXRhZGF0YS5sZW5ndGggfCBudW1iZXIgfX0gY2FyZHM8L3NwYW5cbiAgICAgICAgPlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxtZXRyaWNzLWVtcHR5LXRhZy1tYXRjaFxuICAgICAgKm5nSWY9ImlzRW1wdHlNYXRjaCJcbiAgICAgIGNsYXNzPSJ3YXJuIlxuICAgID48L21ldHJpY3MtZW1wdHktdGFnLW1hdGNoPlxuICAgIDxtZXRyaWNzLWNhcmQtZ3JpZFxuICAgICAgW2NhcmRJZHNXaXRoTWV0YWRhdGFdPSJjYXJkSWRzV2l0aE1ldGFkYXRhIlxuICAgICAgW2NhcmRPYnNlcnZlcl09ImNhcmRPYnNlcnZlciJcbiAgICA+PC9tZXRyaWNzLWNhcmQtZ3JpZD5cbiAgJyxzdHlsZVVybHM6WyJmaWx0ZXJlZF92aWV3X2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSxudWxsLHtpc0VtcHR5TWF0Y2g6W3t0eXBlOnh5fV0sY2FyZE9ic2VydmVyOlt7dHlwZTp4eX1dLGNhcmRJZHNXaXRoTWV0YWRhdGE6W3t0eXBlOnh5fV19KTtjbGFzcyAkZ3R7Y29uc3RydWN0b3IodCl7dGhpcy5zdG9yZT10LHRoaXMuY2FyZElkc1dpdGhNZXRhZGF0YSQ9dGhpcy5zdG9yZS5zZWxlY3Qoamd0KS5waXBlKGZlKHRoaXMuc3RvcmUuc2VsZWN0KHFUKSksSXQoKChbdCxlXSk9PmUuc2l6ZT90LmZpbHRlcigodD0+ZS5oYXModC5wbHVnaW4pKSk6dCkpLGZlKHRoaXMuc3RvcmUuc2VsZWN0KEJUKSksZ2UoMjAwKSxJdCgoKFt0LGVdKT0+e3RyeXtyZXR1cm57Y2FyZExpc3Q6dCxyZWdleDpuZXcgUmVnRXhwKGUsImkiKX19Y2F0Y2goZSl7cmV0dXJue2NhcmRMaXN0OnQscmVnZXg6bnVsbH19fSkpLGNlKCgoe3JlZ2V4OnR9KT0+bnVsbCE9PXQpKSxJdCgoKHtjYXJkTGlzdDp0LHJlZ2V4OmV9KT0+dC5maWx0ZXIoKCh7dGFnOnR9KT0+ZS50ZXN0KHQpKSkpKSxNZSgoKHQsZSk9PnQubGVuZ3RoPT09ZS5sZW5ndGgmJnQuZXZlcnkoKCh0LG4pPT50LmNhcmRJZD09PWVbbl0uY2FyZElkKSkpKSxFZSgpLE5lKFtdKSksdGhpcy5pc0VtcHR5TWF0Y2gkPXRoaXMuY2FyZElkc1dpdGhNZXRhZGF0YSQucGlwZShmZSh0aGlzLnN0b3JlLnNlbGVjdChqZ3QpKSxJdCgoKFt0LGVdKT0+Qm9vbGVhbihlLmxlbmd0aCkmJjA9PT10Lmxlbmd0aCkpKX19ZnVuY3Rpb24gdGh0KHQsZSl7aWYoMSZ0JiYoUm0oMCwibWF0LW9wdGlvbiIsMiksa3UoMSksQW0oKSksMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0O0RtKCJ2YWx1ZSIsdC52YWx1ZSkoImRpc2FibGVkIix0LmRpc2FibGVkKSxyYygxKSxEdSgiICIsdC5kaXNwbGF5VGV4dCwiICIpfX0kZ3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fCRndCkoU20oSXcpKX0sJGd0Lsm1Y21wPXRvKHt0eXBlOiRndCxzZWxlY3RvcnM6W1sibWV0cmljcy1maWx0ZXJlZC12aWV3Il1dLGlucHV0czp7Y2FyZE9ic2VydmVyOiJjYXJkT2JzZXJ2ZXIifSxkZWNsczozLHZhcnM6Nyxjb25zdHM6W1szLCJpc0VtcHR5TWF0Y2giLCJjYXJkSWRzV2l0aE1ldGFkYXRhIiwiY2FyZE9ic2VydmVyIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihUbSgwLCJtZXRyaWNzLWZpbHRlcmVkLXZpZXctY29tcG9uZW50IiwwKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIikpLDImZSYmRG0oImlzRW1wdHlNYXRjaCIsVGgoMSwzLG4uaXNFbXB0eU1hdGNoJCkpKCJjYXJkSWRzV2l0aE1ldGFkYXRhIixUaCgyLDUsbi5jYXJkSWRzV2l0aE1ldGFkYXRhJCkpKCJjYXJkT2JzZXJ2ZXIiLG4uY2FyZE9ic2VydmVyKX0sZGlyZWN0aXZlczpbUWd0XSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoJGd0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1ldHJpY3MtZmlsdGVyZWQtdmlldyIsdGVtcGxhdGU6J1xuICAgIDxtZXRyaWNzLWZpbHRlcmVkLXZpZXctY29tcG9uZW50XG4gICAgICBbaXNFbXB0eU1hdGNoXT0iaXNFbXB0eU1hdGNoJCB8IGFzeW5jIlxuICAgICAgW2NhcmRJZHNXaXRoTWV0YWRhdGFdPSJjYXJkSWRzV2l0aE1ldGFkYXRhJCB8IGFzeW5jIlxuICAgICAgW2NhcmRPYnNlcnZlcl09ImNhcmRPYnNlcnZlciJcbiAgICA+PC9tZXRyaWNzLWZpbHRlcmVkLXZpZXctY29tcG9uZW50PlxuICAnLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSkse2NhcmRPYnNlcnZlcjpbe3R5cGU6eHl9XX0pO2NsYXNzIGVodHtjb25zdHJ1Y3Rvcigpe3RoaXMudmFsdWU9IiIsdGhpcy5vcHRpb25zPVtdLHRoaXMuc2VsZWN0aW9uQ2hhbmdlPW5ldyBMaH19ZnVuY3Rpb24gbmh0KHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwibWF0LXNsaWRlciIsMjYpLFZtKCJpbnB1dCIsKGZ1bmN0aW9uIGUobil7cmV0dXJuIGhpKHQpLFltKDIpLm9uU3RlcFN0YXJ0Q2hhbmdlZChuLnZhbHVlKX0pKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgyKTtEbSgiZGlzYWJsZWQiLCF0LnNlbGVjdFRpbWVFbmFibGVkKSgibWluIix0LnN0ZXBNaW5NYXgubWluKSgibWF4Iix0LnN0ZXBNaW5NYXgubWF4KSgic3RlcCIsMSkoInZhbHVlIixudWxsPT10LnNlbGVjdGVkVGltZT9udWxsOnQuc2VsZWN0ZWRUaW1lLnN0YXJ0LnN0ZXApKCJ0aHVtYkxhYmVsIiwhMCl9fWZ1bmN0aW9uIG9odCh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsInRiLXJhbmdlLWlucHV0IiwyNyksVm0oInZhbHVlIiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oMikub25TdGVwUmFuZ2VDaGFuZ2VkKG4pfSkpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PVltKDIpO0RtKCJtaW4iLHQuc3RlcE1pbk1heC5taW4pKCJtYXgiLHQuc3RlcE1pbk1heC5tYXgpKCJsb3dlclZhbHVlIixudWxsPT10LnNlbGVjdGVkVGltZT9udWxsOnQuc2VsZWN0ZWRUaW1lLnN0YXJ0LnN0ZXApKCJ1cHBlclZhbHVlIixudWxsPT10LnNlbGVjdGVkVGltZXx8bnVsbD09dC5zZWxlY3RlZFRpbWUuZW5kP251bGw6dC5zZWxlY3RlZFRpbWUuZW5kLnN0ZXApLGpwKCJkaXNhYmxlZCIsIXQuc2VsZWN0VGltZUVuYWJsZWQpfX1mdW5jdGlvbiBpaHQodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDIxKSxSbSgxLCJsYWJlbCIpLGt1KDIsIkxpbmsgdmlzdWFsaXphdGlvbiBieSBzdGVwIiksQW0oKSxSbSgzLCJkaXYiLDIyKSxSbSg0LCJkaXYiKSxSbSg1LCJtYXQtY2hlY2tib3giLDE1KSxWbSgiY2hhbmdlIiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgpLnNlbGVjdFRpbWVFbmFibGVUb2dnbGVkLmVtaXQoKX0pKSxrdSg2LCJFbmFibGVkIiksQW0oKSxBbSgpLFJtKDcsImRpdiIpLFJtKDgsIm1hdC1jaGVja2JveCIsMTUpLFZtKCJjaGFuZ2UiLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLFltKCkudXNlUmFuZ2VTZWxlY3RUaW1lVG9nZ2xlZC5lbWl0KCl9KSksa3UoOSwiVXNlIHJhbmdlIiksQW0oKSxBbSgpLFJtKDEwLCJkaXYiLDIzKSxRcCgxMSxuaHQsMSw2LCJtYXQtc2xpZGVyIiwyNCksUXAoMTIsb2h0LDEsNSwibmctdGVtcGxhdGUiLG51bGwsMjUsaWIpLEFtKCksQW0oKSxBbSgpfWlmKDImdCl7Y29uc3QgdD0kcCgxMyksZT1ZbSgpO3JjKDUpLERtKCJjaGVja2VkIixlLnNlbGVjdFRpbWVFbmFibGVkKSxyYygzKSxEbSgiY2hlY2tlZCIsZS51c2VSYW5nZVNlbGVjdFRpbWUpLHJjKDMpLERtKCJuZ0lmIiwhZS51c2VSYW5nZVNlbGVjdFRpbWUpKCJuZ0lmRWxzZSIsdCl9fWZ1bmN0aW9uIGFodCh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsInNlY3Rpb24iLDI4KSxSbSgxLCJoMyIsMSksa3UoMiwiSW1hZ2VzIiksQW0oKSxSbSgzLCJkaXYiLDI5KSxSbSg0LCJkaXYiLDMwKSxrdSg1LCJCcmlnaHRuZXNzIiksQW0oKSxSbSg2LCJkaXYiLDkpLFJtKDcsIm1hdC1zbGlkZXIiLDMxKSxWbSgiaW5wdXQiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLmltYWdlQnJpZ2h0bmVzc1NsaWRlckNoYW5nZWQkLmVtaXQobi52YWx1ZSl9KSksQW0oKSxSbSg4LCJidXR0b24iLDMyKSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLFltKCkuaW1hZ2VCcmlnaHRuZXNzUmVzZXQuZW1pdCgpfSkpLFRtKDksIm1hdC1pY29uIiwzMyksQW0oKSxBbSgpLEFtKCksUm0oMTAsImRpdiIsMzQpLFJtKDExLCJkaXYiLDM1KSxrdSgxMiwiQ29udHJhc3QiKSxBbSgpLFJtKDEzLCJkaXYiLDkpLFJtKDE0LCJtYXQtc2xpZGVyIiwzNiksVm0oImlucHV0IiwoZnVuY3Rpb24gZShuKXtyZXR1cm4gaGkodCksWW0oKS5pbWFnZUNvbnRyYXN0U2xpZGVyQ2hhbmdlZCQuZW1pdChuLnZhbHVlKX0pKSxBbSgpLFJtKDE1LCJidXR0b24iLDM3KSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLFltKCkuaW1hZ2VDb250cmFzdFJlc2V0LmVtaXQoKX0pKSxUbSgxNiwibWF0LWljb24iLDMzKSxBbSgpLEFtKCksQW0oKSxSbSgxNywiZGl2IiwzOCksUm0oMTgsIm1hdC1jaGVja2JveCIsMTUpLFZtKCJjaGFuZ2UiLChmdW5jdGlvbiBlKG4pe3JldHVybiBoaSh0KSxZbSgpLmltYWdlU2hvd0FjdHVhbFNpemVDaGFuZ2VkLmVtaXQobi5jaGVja2VkKX0pKSxrdSgxOSwiU2hvdyBhY3R1YWwgaW1hZ2Ugc2l6ZSIpLEFtKCksQW0oKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgpO3JjKDcpLERtKCJtYXgiLDJlMykoIm1pbiIsMCkoInN0ZXAiLDEwKSgidmFsdWUiLHQuaW1hZ2VCcmlnaHRuZXNzSW5NaWxsaSkoInRodW1iTGFiZWwiLCEwKSgiZGlzcGxheVdpdGgiLHQuZm9ybWF0TWlsbGlUb1plcm90aCkscmMoNyksRG0oIm1heCIsNWUzKSgibWluIiwwKSgic3RlcCIsMTApKCJ2YWx1ZSIsdC5pbWFnZUNvbnRyYXN0SW5NaWxsaSkoInRodW1iTGFiZWwiLCEwKSgiZGlzcGxheVdpdGgiLHQuZm9ybWF0TWlsbGlUb1plcm90aCkscmMoNCksRG0oImNoZWNrZWQiLHQuaW1hZ2VTaG93QWN0dWFsU2l6ZSl9fWVodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8ZWh0KX0sZWh0Lsm1Y21wPXRvKHt0eXBlOmVodCxzZWxlY3RvcnM6W1sidGItZHJvcGRvd24iXV0saW5wdXRzOnt2YWx1ZToidmFsdWUiLG9wdGlvbnM6Im9wdGlvbnMifSxvdXRwdXRzOntzZWxlY3Rpb25DaGFuZ2U6InNlbGVjdGlvbkNoYW5nZSJ9LGRlY2xzOjIsdmFyczoyLGNvbnN0czpbWzMsInZhbHVlIiwic2VsZWN0aW9uQ2hhbmdlIl0sWzMsInZhbHVlIiwiZGlzYWJsZWQiLDQsIm5nRm9yIiwibmdGb3JPZiJdLFszLCJ2YWx1ZSIsImRpc2FibGVkIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJtYXQtc2VsZWN0IiwwKSxWbSgic2VsZWN0aW9uQ2hhbmdlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5zZWxlY3Rpb25DaGFuZ2UuZW1pdChlLnZhbHVlKX0pKSxRcCgxLHRodCwyLDMsIm1hdC1vcHRpb24iLDEpLEFtKCkpLDImZSYmKERtKCJ2YWx1ZSIsbi52YWx1ZSkscmMoMSksRG0oIm5nRm9yT2YiLG4ub3B0aW9ucykpfSxkaXJlY3RpdmVzOltBRyxsTSxCSF0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9bWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjFweCBzb2xpZCAjOGU5OGEzO2JvcmRlci1yYWRpdXM6M3B4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjZweH1tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tvdXRsaW5lLWNvbG9yOi13ZWJraXQtZm9jdXMtcmluZy1jb2xvcjtvdXRsaW5lLXN0eWxlOmF1dG99ICAubWF0LXNlbGVjdC1wYW5lbHttYXgtd2lkdGg6NzB2d30gIG1hdC1vcHRpb24ubWF0LW9wdGlvbntoZWlnaHQ6YXV0b30gIC5tYXQtb3B0aW9uLXRleHR7d2hpdGUtc3BhY2U6bm9ybWFsO3dvcmQtYnJlYWs6YnJlYWstYWxsfSddfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChlaHQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoidGItZHJvcGRvd24iLHRlbXBsYXRlOidcbiAgICA8bWF0LXNlbGVjdFxuICAgICAgW3ZhbHVlXT0idmFsdWUiXG4gICAgICAoc2VsZWN0aW9uQ2hhbmdlKT0ic2VsZWN0aW9uQ2hhbmdlLmVtaXQoJGV2ZW50LnZhbHVlKSJcbiAgICA+XG4gICAgICA8bWF0LW9wdGlvblxuICAgICAgICAqbmdGb3I9ImxldCBvcHRpb24gb2Ygb3B0aW9ucyJcbiAgICAgICAgW3ZhbHVlXT0ib3B0aW9uLnZhbHVlIlxuICAgICAgICBbZGlzYWJsZWRdPSJvcHRpb24uZGlzYWJsZWQiXG4gICAgICA+XG4gICAgICAgIHt7IG9wdGlvbi5kaXNwbGF5VGV4dCB9fVxuICAgICAgPC9tYXQtb3B0aW9uPlxuICAgIDwvbWF0LXNlbGVjdD5cbiAgJyxzdHlsZVVybHM6WyJkcm9wZG93bl9jb21wb25lbnQuY3NzIl19XX1dLG51bGwse3ZhbHVlOlt7dHlwZTp4eX1dLG9wdGlvbnM6W3t0eXBlOnh5fV0sc2VsZWN0aW9uQ2hhbmdlOlt7dHlwZTpPeX1dfSk7Y2xhc3Mgcmh0e2NvbnN0cnVjdG9yKHQpe3RoaXMubG9jYWxlPXQsdGhpcy5zZWxlY3RUaW1lRW5hYmxlVG9nZ2xlZD1uZXcgTGgsdGhpcy51c2VSYW5nZVNlbGVjdFRpbWVUb2dnbGVkPW5ldyBMaCx0aGlzLnNlbGVjdFRpbWVDaGFuZ2VkPW5ldyBMaCx0aGlzLlRvb2x0aXBTb3J0RHJvcGRvd25PcHRpb25zPVt7dmFsdWU6YkEuREVGQVVMVCxkaXNwbGF5VGV4dDoiRGVmYXVsdCJ9LHt2YWx1ZTpiQS5BU0NFTkRJTkcsZGlzcGxheVRleHQ6IkFzY2VuZGluZyJ9LHt2YWx1ZTpiQS5ERVNDRU5ESU5HLGRpc3BsYXlUZXh0OiJEZXNjZW5kaW5nIn0se3ZhbHVlOmJBLk5FQVJFU1QsZGlzcGxheVRleHQ6Ik5lYXJlc3QifV0sdGhpcy50b29sdGlwU29ydENoYW5nZWQ9bmV3IExoLHRoaXMuaWdub3JlT3V0bGllcnNDaGFuZ2VkPW5ldyBMaCx0aGlzLlhBeGlzVHlwZT15QSx0aGlzLlhBeGlzVHlwZURyb3Bkb3duT3B0aW9ucz1be3ZhbHVlOnlBLlNURVAsZGlzcGxheVRleHQ6IlN0ZXAifSx7dmFsdWU6eUEuUkVMQVRJVkUsZGlzcGxheVRleHQ6IlJlbGF0aXZlIn0se3ZhbHVlOnlBLldBTExfVElNRSxkaXNwbGF5VGV4dDoiV2FsbCJ9XSx0aGlzLnhBeGlzVHlwZUNoYW5nZWQ9bmV3IExoLHRoaXMuSGlzdG9ncmFtTW9kZURyb3Bkb3duT3B0aW9ucz1be3ZhbHVlOnBFLk9GRlNFVCxkaXNwbGF5VGV4dDoiT2Zmc2V0In0se3ZhbHVlOnBFLk9WRVJMQVksZGlzcGxheVRleHQ6Ik92ZXJsYXkifV0sdGhpcy5oaXN0b2dyYW1Nb2RlQ2hhbmdlZD1uZXcgTGgsdGhpcy5NQVhfU01PT1RISU5HX1ZBTFVFPS45OTksdGhpcy5NQVhfU01PT1RISU5HX1NMSURFUl9WQUxVRT0uOTksdGhpcy5zY2FsYXJTbW9vdGhpbmdDb250cm9sQ2hhbmdlZCQ9bmV3IExoLHRoaXMuc2NhbGFyU21vb3RoaW5nQ2hhbmdlZD10aGlzLnNjYWxhclNtb290aGluZ0NvbnRyb2xDaGFuZ2VkJC5waXBlKGRlKDI1MCkpLHRoaXMuc2NhbGFyUGFydGl0aW9uWFRvZ2dsZWQ9bmV3IExoLHRoaXMuaW1hZ2VCcmlnaHRuZXNzU2xpZGVyQ2hhbmdlZCQ9bmV3IExoLHRoaXMuaW1hZ2VCcmlnaHRuZXNzSW5NaWxsaUNoYW5nZWQ9dGhpcy5pbWFnZUJyaWdodG5lc3NTbGlkZXJDaGFuZ2VkJC5waXBlKGRlKDI1MCkpLHRoaXMuaW1hZ2VCcmlnaHRuZXNzUmVzZXQ9bmV3IExoLHRoaXMuaW1hZ2VDb250cmFzdFNsaWRlckNoYW5nZWQkPW5ldyBMaCx0aGlzLmltYWdlQ29udHJhc3RJbk1pbGxpQ2hhbmdlZD10aGlzLmltYWdlQ29udHJhc3RTbGlkZXJDaGFuZ2VkJC5waXBlKGRlKDI1MCkpLHRoaXMuaW1hZ2VDb250cmFzdFJlc2V0PW5ldyBMaCx0aGlzLmltYWdlU2hvd0FjdHVhbFNpemVDaGFuZ2VkPW5ldyBMaH1vblNjYWxhclNtb290aGluZ0lucHV0KHQpe2NvbnN0IGU9dC50YXJnZXQ7aWYoIWUudmFsdWUpcmV0dXJuO2NvbnN0IG49TWF0aC5taW4oTWF0aC5tYXgoMCxwYXJzZUZsb2F0KGUudmFsdWUpKSwuOTk5KTtuIT09cGFyc2VGbG9hdChlLnZhbHVlKSYmKGUudmFsdWU9U3RyaW5nKG4pKSx0aGlzLnNjYWxhclNtb290aGluZ0NvbnRyb2xDaGFuZ2VkJC5lbWl0KG4pfWZvcm1hdE1pbGxpVG9aZXJvdGgodCl7cmV0dXJuIFFDKHQvMWUzLHRoaXMubG9jYWxlfHwiZW4tVVMiLCIxLjAtMiIpfW9uU3RlcFN0YXJ0Q2hhbmdlZCh0KXt0aGlzLnNlbGVjdFRpbWVDaGFuZ2VkLmVtaXQoe3N0YXJ0OntzdGVwOnR9LGVuZDpudWxsfSl9b25TdGVwUmFuZ2VDaGFuZ2VkKHtsb3dlclZhbHVlOnQsdXBwZXJWYWx1ZTplfSl7dGhpcy5zZWxlY3RUaW1lQ2hhbmdlZC5lbWl0KHtzdGFydDp7c3RlcDp0fSxlbmQ6e3N0ZXA6ZX19KX19cmh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxyaHQpKFNtKFd5KSl9LHJodC7JtWNtcD10byh7dHlwZTpyaHQsc2VsZWN0b3JzOltbIm1ldHJpY3MtZGFzaGJvYXJkLXNldHRpbmdzLWNvbXBvbmVudCJdXSxpbnB1dHM6e2lzTGlua2VkVGltZUZlYXR1cmVFbmFibGVkOiJpc0xpbmtlZFRpbWVGZWF0dXJlRW5hYmxlZCIsc2VsZWN0VGltZUVuYWJsZWQ6InNlbGVjdFRpbWVFbmFibGVkIix1c2VSYW5nZVNlbGVjdFRpbWU6InVzZVJhbmdlU2VsZWN0VGltZSIsc2VsZWN0ZWRUaW1lOiJzZWxlY3RlZFRpbWUiLHN0ZXBNaW5NYXg6InN0ZXBNaW5NYXgiLGlzSW1hZ2VTdXBwb3J0RW5hYmxlZDoiaXNJbWFnZVN1cHBvcnRFbmFibGVkIix0b29sdGlwU29ydDoidG9vbHRpcFNvcnQiLGlnbm9yZU91dGxpZXJzOiJpZ25vcmVPdXRsaWVycyIseEF4aXNUeXBlOiJ4QXhpc1R5cGUiLGhpc3RvZ3JhbU1vZGU6Imhpc3RvZ3JhbU1vZGUiLHNjYWxhclNtb290aGluZzoic2NhbGFyU21vb3RoaW5nIixzY2FsYXJQYXJ0aXRpb25YOiJzY2FsYXJQYXJ0aXRpb25YIixpbWFnZUJyaWdodG5lc3NJbk1pbGxpOiJpbWFnZUJyaWdodG5lc3NJbk1pbGxpIixpbWFnZUNvbnRyYXN0SW5NaWxsaToiaW1hZ2VDb250cmFzdEluTWlsbGkiLGltYWdlU2hvd0FjdHVhbFNpemU6ImltYWdlU2hvd0FjdHVhbFNpemUifSxvdXRwdXRzOntzZWxlY3RUaW1lRW5hYmxlVG9nZ2xlZDoic2VsZWN0VGltZUVuYWJsZVRvZ2dsZWQiLHVzZVJhbmdlU2VsZWN0VGltZVRvZ2dsZWQ6InVzZVJhbmdlU2VsZWN0VGltZVRvZ2dsZWQiLHNlbGVjdFRpbWVDaGFuZ2VkOiJzZWxlY3RUaW1lQ2hhbmdlZCIsdG9vbHRpcFNvcnRDaGFuZ2VkOiJ0b29sdGlwU29ydENoYW5nZWQiLGlnbm9yZU91dGxpZXJzQ2hhbmdlZDoiaWdub3JlT3V0bGllcnNDaGFuZ2VkIix4QXhpc1R5cGVDaGFuZ2VkOiJ4QXhpc1R5cGVDaGFuZ2VkIixoaXN0b2dyYW1Nb2RlQ2hhbmdlZDoiaGlzdG9ncmFtTW9kZUNoYW5nZWQiLHNjYWxhclNtb290aGluZ0NoYW5nZWQ6InNjYWxhclNtb290aGluZ0NoYW5nZWQiLHNjYWxhclBhcnRpdGlvblhUb2dnbGVkOiJzY2FsYXJQYXJ0aXRpb25YVG9nZ2xlZCIsaW1hZ2VCcmlnaHRuZXNzSW5NaWxsaUNoYW5nZWQ6ImltYWdlQnJpZ2h0bmVzc0luTWlsbGlDaGFuZ2VkIixpbWFnZUJyaWdodG5lc3NSZXNldDoiaW1hZ2VCcmlnaHRuZXNzUmVzZXQiLGltYWdlQ29udHJhc3RJbk1pbGxpQ2hhbmdlZDoiaW1hZ2VDb250cmFzdEluTWlsbGlDaGFuZ2VkIixpbWFnZUNvbnRyYXN0UmVzZXQ6ImltYWdlQ29udHJhc3RSZXNldCIsaW1hZ2VTaG93QWN0dWFsU2l6ZUNoYW5nZWQ6ImltYWdlU2hvd0FjdHVhbFNpemVDaGFuZ2VkIn0sZGVjbHM6MzYsdmFyczoxNyxjb25zdHM6ZnVuY3Rpb24oKXtsZXQgdCxlO3JldHVybiB0PSJ1bmRlZmluZWQiIT10eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUmJm5nSTE4bkNsb3N1cmVNb2RlP2dvb2cuZ2V0TXNnKCJSZXNldCBicmlnaHRuZXNzIik6JGxvY2FsaXplYDpBIGJ1dHRvbiB0byByZXNldCB0aGUgaW1hZ2UgYnJpZ2h0bmVzcyBzZXR0aW5n4pCfYzQ4MmIzYTQ3ZWEwOTc1ZmE4YmUwMWFmYjNmYmVjOWI3NjYyOGJkN+KQnzExODkxNjE4NTcyNDAzNzgzOTU6UmVzZXQgYnJpZ2h0bmVzc2AsZT0idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZT9nb29nLmdldE1zZygiUmVzZXQgY29udHJhc3QiKTokbG9jYWxpemVgOkEgYnV0dG9uIHRvIHJlc2V0IHRoZSBpbWFnZSBjb250cmFzdCBzZXR0aW5n4pCfZWQ3MTJhOGI5MjcwNDFiZTE1MjUyYjI5ZWI1MjFlYmIxMzc0YmFkOOKQnzUzNzA3MDMzNDI5MjM2MTE5NTU6UmVzZXQgY29udHJhc3RgLFtbMSwiZ2VuZXJhbCJdLFsxLCJzZWN0aW9uLXRpdGxlIl0sWzEsImNvbnRyb2wtcm93IiwieC1heGlzLXR5cGUiXSxbImlkIiwieC1heGlzLXR5cGUtbGFiZWwiLDEsImNvbnRyb2wtbmFtZSJdLFszLCJ2YWx1ZSIsIm9wdGlvbnMiLCJzZWxlY3Rpb25DaGFuZ2UiXSxbImNsYXNzIiwiY29udHJvbC1yb3cgbGlua2VkLXRpbWUiLDQsIm5nSWYiXSxbMSwic2NhbGFycyJdLFsxLCJjb250cm9sLXJvdyIsInNjYWxhcnMtc21vb3RoaW5nIl0sWyJpZCIsInNjYWxhcnMtc21vb3RoaW5nLWxhYmVsIiwxLCJjb250cm9sLW5hbWUiXSxbMSwic2xpZGVyLXJvdyJdLFsiYXJpYS1sYWJlbGxlZGJ5Iiwic2NhbGFycy1zbW9vdGhpbmctbGFiZWwiLCJjb2xvciIsInByaW1hcnkiLDMsIm1heCIsIm1pbiIsInN0ZXAiLCJ2YWx1ZSIsInRodW1iTGFiZWwiLCJpbnB1dCJdLFsiYXJpYS1sYWJlbGxlZGJ5Iiwic2NhbGFycy1zbW9vdGhpbmctbGFiZWwiLCJ0eXBlIiwibnVtYmVyIiwibWluIiwiMCIsInN0ZXAiLCIwLjAwMSIsMSwic2xpZGVyLWlucHV0IiwzLCJtYXgiLCJ2YWx1ZSIsImlucHV0Il0sWzEsImNvbnRyb2wtcm93IiwidG9vbHRpcC1zb3J0Il0sWzEsImNvbnRyb2wtbmFtZSJdLFsxLCJjb250cm9sLXJvdyIsInNjYWxhcnMtaWdub3JlLW91dGxpZXJzIl0sWzMsImNoZWNrZWQiLCJjaGFuZ2UiXSxbMSwiY29udHJvbC1yb3ciLCJzY2FsYXJzLXBhcnRpdGlvbi14Il0sWyJzdmdJY29uIiwiaGVscF9vdXRsaW5lXzI0cHgiLCJ0aXRsZSIsIk5vbi1tb25vdG9uaWMgc3RlcHMgY2FuIG9jY3VyIHdoZW4gcmV1c2luZyBhIGxvZ2RpciB3aXRoIG11bHRpcGxlIHN1bW1hcnkgd3JpdGVycyBhbmQgb3ZlcmxhcHBpbmcgc3RlcHMuIExpbmUgY2hhcnRzLCB3aXRob3V0IHRoaXMgb3B0aW9uIGVuYWJsZWQsIGNhbiBhcHBlYXIgemlnIHphZ2dlZC4gVGhpcyBpcyBjb21tb24gd2hlbiByZXN0YXJ0aW5nIGZyb20gYSBjaGVja3BvaW50LlxuXG5XaGVuIGVuYWJsZWQsIGEgbm9uLW1vbm90b25pYyB0aW1lIHNlcmllcyBjb21wb3NlZCBvZiBOIG1vbm90b25pYyBwaWVjZXMgd2lsbCBiZSBzaG93biBhcyBOIG1vbm90b25pYyBsaW5lcy4iLDEsImluZm8iXSxbMSwiSGlzdG9ncmFtcyJdLFsxLCJjb250cm9sLXJvdyIsImhpc3RvZ3JhbS1tb2RlIl0sWyJjbGFzcyIsImltYWdlIiw0LCJuZ0lmIl0sWzEsImNvbnRyb2wtcm93IiwibGlua2VkLXRpbWUiXSxbMSwiY29udHJvbHMiXSxbMSwic3RlcC1zZWxlY3RvciJdLFsiY29sb3IiLCJwcmltYXJ5IiwzLCJkaXNhYmxlZCIsIm1pbiIsIm1heCIsInN0ZXAiLCJ2YWx1ZSIsInRodW1iTGFiZWwiLCJpbnB1dCIsNCwibmdJZiIsIm5nSWZFbHNlIl0sWyJyYW5nZSIsIiJdLFsiY29sb3IiLCJwcmltYXJ5IiwzLCJkaXNhYmxlZCIsIm1pbiIsIm1heCIsInN0ZXAiLCJ2YWx1ZSIsInRodW1iTGFiZWwiLCJpbnB1dCJdLFszLCJtaW4iLCJtYXgiLCJsb3dlclZhbHVlIiwidXBwZXJWYWx1ZSIsInZhbHVlIl0sWzEsImltYWdlIl0sWzEsImNvbnRyb2wtcm93IiwiaW1hZ2UtYnJpZ2h0bmVzcyJdLFsiaWQiLCJpbWFnZS1icmlnaHRuZXNzLWxhYmVsIiwxLCJjb250cm9sLW5hbWUiXSxbImFyaWEtbGFiZWxsZWRieSIsImltYWdlLWJyaWdodG5lc3MtbGFiZWwiLCJjb2xvciIsInByaW1hcnkiLDMsIm1heCIsIm1pbiIsInN0ZXAiLCJ2YWx1ZSIsInRodW1iTGFiZWwiLCJkaXNwbGF5V2l0aCIsImlucHV0Il0sWyJtYXQtaWNvbi1idXR0b24iLCIiLCJhcmlhLWxhYmVsIix0LCJ0aXRsZSIsIlJlc2V0IGJyaWdodG5lc3MiLDEsInJlc2V0LWJ1dHRvbiIsMywiY2xpY2siXSxbInN2Z0ljb24iLCJzZXR0aW5nc19iYWNrdXBfcmVzdG9yZV8yNHB4Il0sWzEsImNvbnRyb2wtcm93IiwiaW1hZ2UtY29udHJhc3QiXSxbImlkIiwiaW1hZ2UtY29uc3RyYXN0LWxhYmVsIiwxLCJjb250cm9sLW5hbWUiXSxbImFyaWEtbGFiZWxsZWRieSIsImltYWdlLWNvbnN0cmFzdC1sYWJlbCIsImNvbG9yIiwicHJpbWFyeSIsMywibWF4IiwibWluIiwic3RlcCIsInZhbHVlIiwidGh1bWJMYWJlbCIsImRpc3BsYXlXaXRoIiwiaW5wdXQiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLGUsInRpdGxlIiwiUmVzZXQgY29udHJhc3QiLDEsInJlc2V0LWJ1dHRvbiIsMywiY2xpY2siXSxbMSwiY29udHJvbC1yb3ciLCJpbWFnZS1zaG93LWFjdHVhbC1zaXplIl1dfSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwic2VjdGlvbiIsMCksUm0oMSwiaDMiLDEpLGt1KDIsIkdlbmVyYWwiKSxBbSgpLFJtKDMsImRpdiIsMiksUm0oNCwiZGl2IiwzKSxrdSg1LCJIb3Jpem9udGFsIEF4aXMiKSxBbSgpLFJtKDYsInRiLWRyb3Bkb3duIiw0KSxWbSgic2VsZWN0aW9uQ2hhbmdlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi54QXhpc1R5cGVDaGFuZ2VkLmVtaXQoZSl9KSksQW0oKSxBbSgpLFFwKDcsaWh0LDE0LDQsImRpdiIsNSksQW0oKSxSbSg4LCJzZWN0aW9uIiw2KSxSbSg5LCJoMyIsMSksa3UoMTAsIlNjYWxhcnMiKSxBbSgpLFJtKDExLCJkaXYiLDcpLFJtKDEyLCJkaXYiLDgpLGt1KDEzLCJTbW9vdGhpbmciKSxBbSgpLFJtKDE0LCJkaXYiLDkpLFJtKDE1LCJtYXQtc2xpZGVyIiwxMCksVm0oImlucHV0IiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5zY2FsYXJTbW9vdGhpbmdDb250cm9sQ2hhbmdlZCQuZW1pdChlLnZhbHVlKX0pKSxBbSgpLFJtKDE2LCJpbnB1dCIsMTEpLFZtKCJpbnB1dCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25TY2FsYXJTbW9vdGhpbmdJbnB1dChlKX0pKSxBbSgpLEFtKCksQW0oKSxSbSgxNywiZGl2IiwxMiksUm0oMTgsImRpdiIsMTMpLGt1KDE5LCJUb29sdGlwIHNvcnRpbmcgbWV0aG9kIiksQW0oKSxSbSgyMCwidGItZHJvcGRvd24iLDQpLFZtKCJzZWxlY3Rpb25DaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLnRvb2x0aXBTb3J0Q2hhbmdlZC5lbWl0KGUpfSkpLEFtKCksQW0oKSxSbSgyMSwiZGl2IiwxNCksUm0oMjIsIm1hdC1jaGVja2JveCIsMTUpLFZtKCJjaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLmlnbm9yZU91dGxpZXJzQ2hhbmdlZC5lbWl0KGUuY2hlY2tlZCl9KSksa3UoMjMsIklnbm9yZSBvdXRsaWVycyBpbiBjaGFydCBzY2FsaW5nIiksQW0oKSxBbSgpLFJtKDI0LCJkaXYiLDE2KSxSbSgyNSwibWF0LWNoZWNrYm94IiwxNSksVm0oImNoYW5nZSIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5zY2FsYXJQYXJ0aXRpb25YVG9nZ2xlZC5lbWl0KCl9KSksa3UoMjYsIlBhcnRpdGlvbiBub24tbW9ub3RvbmljIFggYXhpcyIpLEFtKCksVG0oMjcsIm1hdC1pY29uIiwxNyksQW0oKSxBbSgpLFJtKDI4LCJzZWN0aW9uIiwxOCksUm0oMjksImgzIiwxKSxrdSgzMCwiSGlzdG9ncmFtcyIpLEFtKCksUm0oMzEsImRpdiIsMTkpLFJtKDMyLCJkaXYiLDEzKSxrdSgzMywiTW9kZSIpLEFtKCksUm0oMzQsInRiLWRyb3Bkb3duIiw0KSxWbSgic2VsZWN0aW9uQ2hhbmdlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5oaXN0b2dyYW1Nb2RlQ2hhbmdlZC5lbWl0KGUpfSkpLEFtKCksQW0oKSxBbSgpLFFwKDM1LGFodCwyMCwxMywic2VjdGlvbiIsMjApKSwyJmUmJihyYyg2KSxEbSgidmFsdWUiLG4ueEF4aXNUeXBlKSgib3B0aW9ucyIsbi5YQXhpc1R5cGVEcm9wZG93bk9wdGlvbnMpLHJjKDEpLERtKCJuZ0lmIixuLmlzTGlua2VkVGltZUZlYXR1cmVFbmFibGVkJiZuLnhBeGlzVHlwZT09bi5YQXhpc1R5cGUuU1RFUCkscmMoOCksRG0oIm1heCIsbi5NQVhfU01PT1RISU5HX1NMSURFUl9WQUxVRSkoIm1pbiIsMCkoInN0ZXAiLC4wMSkoInZhbHVlIixuLnNjYWxhclNtb290aGluZykoInRodW1iTGFiZWwiLCEwKSxyYygxKSxEbSgibWF4IixuLk1BWF9TTU9PVEhJTkdfVkFMVUUpKCJ2YWx1ZSIsbi5zY2FsYXJTbW9vdGhpbmcpLHJjKDQpLERtKCJ2YWx1ZSIsbi50b29sdGlwU29ydCkoIm9wdGlvbnMiLG4uVG9vbHRpcFNvcnREcm9wZG93bk9wdGlvbnMpLHJjKDIpLERtKCJjaGVja2VkIixuLmlnbm9yZU91dGxpZXJzKSxyYygzKSxEbSgiY2hlY2tlZCIsbi5zY2FsYXJQYXJ0aXRpb25YKSxyYyg5KSxEbSgidmFsdWUiLG4uaGlzdG9ncmFtTW9kZSkoIm9wdGlvbnMiLG4uSGlzdG9ncmFtTW9kZURyb3Bkb3duT3B0aW9ucykscmMoMSksRG0oIm5nSWYiLG4uaXNJbWFnZVN1cHBvcnRFbmFibGVkKSl9LGRpcmVjdGl2ZXM6W2VodCxkTSxSWCxPWSxEVyxEMSxYSF0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9W19uZ2hvc3QtJUNPTVAlXXtjb2xvcjojNjE2MTYxO2ZvbnQtc2l6ZToxMnB4fWJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1zZWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmViO3BhZGRpbmc6MTZweH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICBzZWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgc2VjdGlvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzU1NX0uc2VjdGlvbi10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Zm9udC13ZWlnaHQ6NTAwO2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0Om5vcm1hbDttYXJnaW46MCAwIDEycHggMH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuc2VjdGlvbi10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5zZWN0aW9uLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVdICAgLmNvbnRyb2wtcm93W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhc3QtY2hpbGQpe21hcmdpbi1ib3R0b206MTJweH0uY29udHJvbC1uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tYm90dG9tOjhweH0uc2xpZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtoZWlnaHQ6MjhweH0uc2xpZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0gICAucmVzZXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tbGVmdDo2cHh9LnNsaWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdICAgLnNsaWRlci1pbnB1dFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjppbmhlcml0O2JvcmRlcjoxcHggc29saWQgIzhlOThhMztib3JkZXItcmFkaXVzOjJweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7Y29sb3I6aW5oZXJpdDtoZWlnaHQ6MTAwJTttYXJnaW4tbGVmdDoxMnB4O3BhZGRpbmc6MCA0cHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLnNsaWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdICAgLnNsaWRlci1pbnB1dFtfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5zbGlkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5zbGlkZXItaW5wdXRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNDI1MDY2fS5zY2FsYXJzLXNtb290aGluZ1tfbmdjb250ZW50LSVDT01QJV0gICAuc2xpZGVyLWlucHV0W19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4Om5vbmU7d2lkdGg6NWVtfS5zY2FsYXJzLXBhcnRpdGlvbi14W19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4fS5zY2FsYXJzLXBhcnRpdGlvbi14W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5pbmZvW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTVweDttYXJnaW4tbGVmdDo1cHg7d2lkdGg6MTVweH1tYXQtc2xpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4OjE7bWFyZ2luLWxlZnQ6LThweDttYXJnaW4tcmlnaHQ6LThweH10Yi1kcm9wZG93bltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpibG9ja30ubGlua2VkLXRpbWVbX25nY29udGVudC0lQ09NUCVdICAgLnN0ZXAtc2VsZWN0b3JbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MCAxMHB4fS5saW5rZWQtdGltZVtfbmdjb250ZW50LSVDT01QJV0gICBtYXQtc2xpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmxpbmtlZC10aW1lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRiLXJhbmdlLWlucHV0W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlfS5saW5rZWQtdGltZVtfbmdjb250ZW50LSVDT01QJV0gICAuY29udHJvbHNbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6NXB4fSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChyaHQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWV0cmljcy1kYXNoYm9hcmQtc2V0dGluZ3MtY29tcG9uZW50Iix0ZW1wbGF0ZVVybDoic2V0dGluZ3Nfdmlld19jb21wb25lbnQubmcuaHRtbCIsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaCxzdHlsZVVybHM6WyJzZXR0aW5nc192aWV3X2NvbXBvbmVudC5jc3MiXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltXeV19XX1dfSkse2lzTGlua2VkVGltZUZlYXR1cmVFbmFibGVkOlt7dHlwZTp4eX1dLHNlbGVjdFRpbWVFbmFibGVkOlt7dHlwZTp4eX1dLHVzZVJhbmdlU2VsZWN0VGltZTpbe3R5cGU6eHl9XSxzZWxlY3RlZFRpbWU6W3t0eXBlOnh5fV0sc3RlcE1pbk1heDpbe3R5cGU6eHl9XSxzZWxlY3RUaW1lRW5hYmxlVG9nZ2xlZDpbe3R5cGU6T3l9XSx1c2VSYW5nZVNlbGVjdFRpbWVUb2dnbGVkOlt7dHlwZTpPeX1dLHNlbGVjdFRpbWVDaGFuZ2VkOlt7dHlwZTpPeX1dLGlzSW1hZ2VTdXBwb3J0RW5hYmxlZDpbe3R5cGU6eHl9XSx0b29sdGlwU29ydDpbe3R5cGU6eHl9XSx0b29sdGlwU29ydENoYW5nZWQ6W3t0eXBlOk95fV0saWdub3JlT3V0bGllcnM6W3t0eXBlOnh5fV0saWdub3JlT3V0bGllcnNDaGFuZ2VkOlt7dHlwZTpPeX1dLHhBeGlzVHlwZTpbe3R5cGU6eHl9XSx4QXhpc1R5cGVDaGFuZ2VkOlt7dHlwZTpPeX1dLGhpc3RvZ3JhbU1vZGU6W3t0eXBlOnh5fV0saGlzdG9ncmFtTW9kZUNoYW5nZWQ6W3t0eXBlOk95fV0sc2NhbGFyU21vb3RoaW5nOlt7dHlwZTp4eX1dLHNjYWxhclNtb290aGluZ0NoYW5nZWQ6W3t0eXBlOk95fV0sc2NhbGFyUGFydGl0aW9uWDpbe3R5cGU6eHl9XSxzY2FsYXJQYXJ0aXRpb25YVG9nZ2xlZDpbe3R5cGU6T3l9XSxpbWFnZUJyaWdodG5lc3NJbk1pbGxpOlt7dHlwZTp4eX1dLGltYWdlQnJpZ2h0bmVzc0luTWlsbGlDaGFuZ2VkOlt7dHlwZTpPeX1dLGltYWdlQnJpZ2h0bmVzc1Jlc2V0Olt7dHlwZTpPeX1dLGltYWdlQ29udHJhc3RJbk1pbGxpOlt7dHlwZTp4eX1dLGltYWdlQ29udHJhc3RJbk1pbGxpQ2hhbmdlZDpbe3R5cGU6T3l9XSxpbWFnZUNvbnRyYXN0UmVzZXQ6W3t0eXBlOk95fV0saW1hZ2VTaG93QWN0dWFsU2l6ZTpbe3R5cGU6eHl9XSxpbWFnZVNob3dBY3R1YWxTaXplQ2hhbmdlZDpbe3R5cGU6T3l9XX0pO2NsYXNzIHNodHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5pc0xpbmtlZFRpbWVGZWF0dXJlRW5hYmxlZCQ9dGhpcy5zdG9yZS5zZWxlY3QoaUUpLHRoaXMuc2VsZWN0VGltZUVuYWJsZWQkPXRoaXMuc3RvcmUuc2VsZWN0KGpUKSx0aGlzLnVzZVJhbmdlU2VsZWN0VGltZSQ9dGhpcy5zdG9yZS5zZWxlY3QoVVQpLHRoaXMuc2VsZWN0ZWRUaW1lJD10aGlzLnN0b3JlLnNlbGVjdChXVCksdGhpcy5zdGVwTWluTWF4JD10aGlzLnN0b3JlLnNlbGVjdChHVCksdGhpcy5pc0ltYWdlU3VwcG9ydEVuYWJsZWQkPXRoaXMuc3RvcmUuc2VsZWN0KHFEKS5waXBlKGNlKEJvb2xlYW4pLGJlKDEpLFZlKHRoaXMuc3RvcmUuc2VsZWN0KG9FKSksSXQoKChbLHRdKT0+dCkpKSx0aGlzLnRvb2x0aXBTb3J0JD10aGlzLnN0b3JlLnNlbGVjdChSVCksdGhpcy5pZ25vcmVPdXRsaWVycyQ9dGhpcy5zdG9yZS5zZWxlY3QoQVQpLHRoaXMueEF4aXNUeXBlJD10aGlzLnN0b3JlLnNlbGVjdChUVCksdGhpcy5oaXN0b2dyYW1Nb2RlJD10aGlzLnN0b3JlLnNlbGVjdChOVCksdGhpcy5zY2FsYXJTbW9vdGhpbmckPXRoaXMuc3RvcmUuc2VsZWN0KHpUKSx0aGlzLnNjYWxhclBhcnRpdGlvblgkPXRoaXMuc3RvcmUuc2VsZWN0KElUKSx0aGlzLmltYWdlQnJpZ2h0bmVzc0luTWlsbGkkPXRoaXMuc3RvcmUuc2VsZWN0KEhUKSx0aGlzLmltYWdlQ29udHJhc3RJbk1pbGxpJD10aGlzLnN0b3JlLnNlbGVjdChGVCksdGhpcy5pbWFnZVNob3dBY3R1YWxTaXplJD10aGlzLnN0b3JlLnNlbGVjdChMVCl9b25Ub29sdGlwU29ydENoYW5nZWQodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChMRSh7c29ydDp0fSkpfW9uSWdub3JlT3V0bGllcnNDaGFuZ2VkKCl7dGhpcy5zdG9yZS5kaXNwYXRjaChCRSgpKX1vblhBeGlzVHlwZUNoYW5nZWQodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChWRSh7eEF4aXNUeXBlOnR9KSl9b25IaXN0b2dyYW1Nb2RlQ2hhbmdlZCh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKFhFKHtoaXN0b2dyYW1Nb2RlOnR9KSl9b25TY2FsYXJTbW9vdGhpbmdDaGFuZ2VkKHQpe3RoaXMuc3RvcmUuZGlzcGF0Y2goakUoe3Ntb290aGluZzp0fSkpfW9uU2NhbGFyUGFydGl0aW9uWFRvZ2dsZWQoKXt0aGlzLnN0b3JlLmRpc3BhdGNoKFVFKCkpfW9uSW1hZ2VCcmlnaHRuZXNzSW5NaWxsaUNoYW5nZWQodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChHRSh7YnJpZ2h0bmVzc0luTWlsbGk6dH0pKX1vbkltYWdlQnJpZ2h0bmVzc1Jlc2V0KCl7dGhpcy5zdG9yZS5kaXNwYXRjaChZRSgpKX1vbkltYWdlQ29udHJhc3RSZXNldCgpe3RoaXMuc3RvcmUuZGlzcGF0Y2gocUUoKSl9b25JbWFnZUNvbnRyYXN0SW5NaWxsaUNoYW5nZWQodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChXRSh7Y29udHJhc3RJbk1pbGxpOnR9KSl9b25JbWFnZVNob3dBY3R1YWxTaXplQ2hhbmdlZCgpe3RoaXMuc3RvcmUuZGlzcGF0Y2goWkUoKSl9b25TZWxlY3RUaW1lRW5hYmxlVG9nZ2xlZCgpe3RoaXMuc3RvcmUuZGlzcGF0Y2gobFIoKSl9b25Vc2VSYW5nZVNlbGVjdFRpbWVUb2dnbGVkKCl7dGhpcy5zdG9yZS5kaXNwYXRjaChjUigpKX1vblNlbGVjdFRpbWVDaGFuZ2VkKHQpe3ZhciBlO3RoaXMuc3RvcmUuZGlzcGF0Y2goclIoe3N0YXJ0U3RlcDp0LnN0YXJ0LnN0ZXAsZW5kU3RlcDpudWxsPT09KGU9dC5lbmQpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnN0ZXB9KSl9fXNodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8c2h0KShTbShJdykpfSxzaHQuybVjbXA9dG8oe3R5cGU6c2h0LHNlbGVjdG9yczpbWyJtZXRyaWNzLWRhc2hib2FyZC1zZXR0aW5ncyJdXSxkZWNsczoxNix2YXJzOjQ1LGNvbnN0czpbWzMsImlzSW1hZ2VTdXBwb3J0RW5hYmxlZCIsInRvb2x0aXBTb3J0IiwiaWdub3JlT3V0bGllcnMiLCJ4QXhpc1R5cGUiLCJoaXN0b2dyYW1Nb2RlIiwic2NhbGFyU21vb3RoaW5nIiwic2NhbGFyUGFydGl0aW9uWCIsImltYWdlQnJpZ2h0bmVzc0luTWlsbGkiLCJpbWFnZUNvbnRyYXN0SW5NaWxsaSIsImltYWdlU2hvd0FjdHVhbFNpemUiLCJpc0xpbmtlZFRpbWVGZWF0dXJlRW5hYmxlZCIsInNlbGVjdFRpbWVFbmFibGVkIiwic2VsZWN0ZWRUaW1lIiwidXNlUmFuZ2VTZWxlY3RUaW1lIiwic3RlcE1pbk1heCIsInRvb2x0aXBTb3J0Q2hhbmdlZCIsImlnbm9yZU91dGxpZXJzQ2hhbmdlZCIsInhBeGlzVHlwZUNoYW5nZWQiLCJoaXN0b2dyYW1Nb2RlQ2hhbmdlZCIsInNjYWxhclNtb290aGluZ0NoYW5nZWQiLCJzY2FsYXJQYXJ0aXRpb25YVG9nZ2xlZCIsImltYWdlQnJpZ2h0bmVzc0luTWlsbGlDaGFuZ2VkIiwiaW1hZ2VCcmlnaHRuZXNzUmVzZXQiLCJpbWFnZUNvbnRyYXN0SW5NaWxsaUNoYW5nZWQiLCJpbWFnZUNvbnRyYXN0UmVzZXQiLCJpbWFnZVNob3dBY3R1YWxTaXplQ2hhbmdlZCIsInNlbGVjdFRpbWVFbmFibGVUb2dnbGVkIiwidXNlUmFuZ2VTZWxlY3RUaW1lVG9nZ2xlZCIsInNlbGVjdFRpbWVDaGFuZ2VkIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJtZXRyaWNzLWRhc2hib2FyZC1zZXR0aW5ncy1jb21wb25lbnQiLDApLFZtKCJ0b29sdGlwU29ydENoYW5nZWQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uVG9vbHRpcFNvcnRDaGFuZ2VkKGUpfSkpKCJpZ25vcmVPdXRsaWVyc0NoYW5nZWQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25JZ25vcmVPdXRsaWVyc0NoYW5nZWQoKX0pKSgieEF4aXNUeXBlQ2hhbmdlZCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25YQXhpc1R5cGVDaGFuZ2VkKGUpfSkpKCJoaXN0b2dyYW1Nb2RlQ2hhbmdlZCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25IaXN0b2dyYW1Nb2RlQ2hhbmdlZChlKX0pKSgic2NhbGFyU21vb3RoaW5nQ2hhbmdlZCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25TY2FsYXJTbW9vdGhpbmdDaGFuZ2VkKGUpfSkpKCJzY2FsYXJQYXJ0aXRpb25YVG9nZ2xlZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblNjYWxhclBhcnRpdGlvblhUb2dnbGVkKCl9KSkoImltYWdlQnJpZ2h0bmVzc0luTWlsbGlDaGFuZ2VkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vbkltYWdlQnJpZ2h0bmVzc0luTWlsbGlDaGFuZ2VkKGUpfSkpKCJpbWFnZUJyaWdodG5lc3NSZXNldCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkltYWdlQnJpZ2h0bmVzc1Jlc2V0KCl9KSkoImltYWdlQ29udHJhc3RJbk1pbGxpQ2hhbmdlZCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25JbWFnZUNvbnRyYXN0SW5NaWxsaUNoYW5nZWQoZSl9KSkoImltYWdlQ29udHJhc3RSZXNldCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkltYWdlQ29udHJhc3RSZXNldCgpfSkpKCJpbWFnZVNob3dBY3R1YWxTaXplQ2hhbmdlZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkltYWdlU2hvd0FjdHVhbFNpemVDaGFuZ2VkKCl9KSkoInNlbGVjdFRpbWVFbmFibGVUb2dnbGVkIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uU2VsZWN0VGltZUVuYWJsZVRvZ2dsZWQoKX0pKSgidXNlUmFuZ2VTZWxlY3RUaW1lVG9nZ2xlZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblVzZVJhbmdlU2VsZWN0VGltZVRvZ2dsZWQoKX0pKSgic2VsZWN0VGltZUNoYW5nZWQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uU2VsZWN0VGltZUNoYW5nZWQoZSl9KSksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQWgoNCwiYXN5bmMiKSxBaCg1LCJhc3luYyIpLEFoKDYsImFzeW5jIiksQWgoNywiYXN5bmMiKSxBaCg4LCJhc3luYyIpLEFoKDksImFzeW5jIiksQWgoMTAsImFzeW5jIiksQWgoMTEsImFzeW5jIiksQWgoMTIsImFzeW5jIiksQWgoMTMsImFzeW5jIiksQWgoMTQsImFzeW5jIiksQWgoMTUsImFzeW5jIiksQW0oKSksMiZlJiZEbSgiaXNJbWFnZVN1cHBvcnRFbmFibGVkIixUaCgxLDE1LG4uaXNJbWFnZVN1cHBvcnRFbmFibGVkJCkpKCJ0b29sdGlwU29ydCIsVGgoMiwxNyxuLnRvb2x0aXBTb3J0JCkpKCJpZ25vcmVPdXRsaWVycyIsVGgoMywxOSxuLmlnbm9yZU91dGxpZXJzJCkpKCJ4QXhpc1R5cGUiLFRoKDQsMjEsbi54QXhpc1R5cGUkKSkoImhpc3RvZ3JhbU1vZGUiLFRoKDUsMjMsbi5oaXN0b2dyYW1Nb2RlJCkpKCJzY2FsYXJTbW9vdGhpbmciLFRoKDYsMjUsbi5zY2FsYXJTbW9vdGhpbmckKSkoInNjYWxhclBhcnRpdGlvblgiLFRoKDcsMjcsbi5zY2FsYXJQYXJ0aXRpb25YJCkpKCJpbWFnZUJyaWdodG5lc3NJbk1pbGxpIixUaCg4LDI5LG4uaW1hZ2VCcmlnaHRuZXNzSW5NaWxsaSQpKSgiaW1hZ2VDb250cmFzdEluTWlsbGkiLFRoKDksMzEsbi5pbWFnZUNvbnRyYXN0SW5NaWxsaSQpKSgiaW1hZ2VTaG93QWN0dWFsU2l6ZSIsVGgoMTAsMzMsbi5pbWFnZVNob3dBY3R1YWxTaXplJCkpKCJpc0xpbmtlZFRpbWVGZWF0dXJlRW5hYmxlZCIsVGgoMTEsMzUsbi5pc0xpbmtlZFRpbWVGZWF0dXJlRW5hYmxlZCQpKSgic2VsZWN0VGltZUVuYWJsZWQiLFRoKDEyLDM3LG4uc2VsZWN0VGltZUVuYWJsZWQkKSkoInNlbGVjdGVkVGltZSIsVGgoMTMsMzksbi5zZWxlY3RlZFRpbWUkKSkoInVzZVJhbmdlU2VsZWN0VGltZSIsVGgoMTQsNDEsbi51c2VSYW5nZVNlbGVjdFRpbWUkKSkoInN0ZXBNaW5NYXgiLFRoKDE1LDQzLG4uc3RlcE1pbk1heCQpKX0sZGlyZWN0aXZlczpbcmh0XSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoc2h0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1ldHJpY3MtZGFzaGJvYXJkLXNldHRpbmdzIix0ZW1wbGF0ZTonXG4gICAgPG1ldHJpY3MtZGFzaGJvYXJkLXNldHRpbmdzLWNvbXBvbmVudFxuICAgICAgW2lzSW1hZ2VTdXBwb3J0RW5hYmxlZF09ImlzSW1hZ2VTdXBwb3J0RW5hYmxlZCQgfCBhc3luYyJcbiAgICAgIFt0b29sdGlwU29ydF09InRvb2x0aXBTb3J0JCB8IGFzeW5jIlxuICAgICAgKHRvb2x0aXBTb3J0Q2hhbmdlZCk9Im9uVG9vbHRpcFNvcnRDaGFuZ2VkKCRldmVudCkiXG4gICAgICBbaWdub3JlT3V0bGllcnNdPSJpZ25vcmVPdXRsaWVycyQgfCBhc3luYyJcbiAgICAgIChpZ25vcmVPdXRsaWVyc0NoYW5nZWQpPSJvbklnbm9yZU91dGxpZXJzQ2hhbmdlZCgpIlxuICAgICAgW3hBeGlzVHlwZV09InhBeGlzVHlwZSQgfCBhc3luYyJcbiAgICAgICh4QXhpc1R5cGVDaGFuZ2VkKT0ib25YQXhpc1R5cGVDaGFuZ2VkKCRldmVudCkiXG4gICAgICBbaGlzdG9ncmFtTW9kZV09Imhpc3RvZ3JhbU1vZGUkIHwgYXN5bmMiXG4gICAgICAoaGlzdG9ncmFtTW9kZUNoYW5nZWQpPSJvbkhpc3RvZ3JhbU1vZGVDaGFuZ2VkKCRldmVudCkiXG4gICAgICBbc2NhbGFyU21vb3RoaW5nXT0ic2NhbGFyU21vb3RoaW5nJCB8IGFzeW5jIlxuICAgICAgKHNjYWxhclNtb290aGluZ0NoYW5nZWQpPSJvblNjYWxhclNtb290aGluZ0NoYW5nZWQoJGV2ZW50KSJcbiAgICAgIFtzY2FsYXJQYXJ0aXRpb25YXT0ic2NhbGFyUGFydGl0aW9uWCQgfCBhc3luYyJcbiAgICAgIChzY2FsYXJQYXJ0aXRpb25YVG9nZ2xlZCk9Im9uU2NhbGFyUGFydGl0aW9uWFRvZ2dsZWQoKSJcbiAgICAgIFtpbWFnZUJyaWdodG5lc3NJbk1pbGxpXT0iaW1hZ2VCcmlnaHRuZXNzSW5NaWxsaSQgfCBhc3luYyJcbiAgICAgIChpbWFnZUJyaWdodG5lc3NJbk1pbGxpQ2hhbmdlZCk9Im9uSW1hZ2VCcmlnaHRuZXNzSW5NaWxsaUNoYW5nZWQoJGV2ZW50KSJcbiAgICAgIChpbWFnZUJyaWdodG5lc3NSZXNldCk9Im9uSW1hZ2VCcmlnaHRuZXNzUmVzZXQoKSJcbiAgICAgIFtpbWFnZUNvbnRyYXN0SW5NaWxsaV09ImltYWdlQ29udHJhc3RJbk1pbGxpJCB8IGFzeW5jIlxuICAgICAgKGltYWdlQ29udHJhc3RJbk1pbGxpQ2hhbmdlZCk9Im9uSW1hZ2VDb250cmFzdEluTWlsbGlDaGFuZ2VkKCRldmVudCkiXG4gICAgICAoaW1hZ2VDb250cmFzdFJlc2V0KT0ib25JbWFnZUNvbnRyYXN0UmVzZXQoKSJcbiAgICAgIFtpbWFnZVNob3dBY3R1YWxTaXplXT0iaW1hZ2VTaG93QWN0dWFsU2l6ZSQgfCBhc3luYyJcbiAgICAgIChpbWFnZVNob3dBY3R1YWxTaXplQ2hhbmdlZCk9Im9uSW1hZ2VTaG93QWN0dWFsU2l6ZUNoYW5nZWQoKSJcbiAgICAgIFtpc0xpbmtlZFRpbWVGZWF0dXJlRW5hYmxlZF09ImlzTGlua2VkVGltZUZlYXR1cmVFbmFibGVkJCB8IGFzeW5jIlxuICAgICAgW3NlbGVjdFRpbWVFbmFibGVkXT0ic2VsZWN0VGltZUVuYWJsZWQkIHwgYXN5bmMiXG4gICAgICBbc2VsZWN0ZWRUaW1lXT0ic2VsZWN0ZWRUaW1lJCB8IGFzeW5jIlxuICAgICAgW3VzZVJhbmdlU2VsZWN0VGltZV09InVzZVJhbmdlU2VsZWN0VGltZSQgfCBhc3luYyJcbiAgICAgIFtzdGVwTWluTWF4XT0ic3RlcE1pbk1heCQgfCBhc3luYyJcbiAgICAgIChzZWxlY3RUaW1lRW5hYmxlVG9nZ2xlZCk9Im9uU2VsZWN0VGltZUVuYWJsZVRvZ2dsZWQoKSJcbiAgICAgICh1c2VSYW5nZVNlbGVjdFRpbWVUb2dnbGVkKT0ib25Vc2VSYW5nZVNlbGVjdFRpbWVUb2dnbGVkKCkiXG4gICAgICAoc2VsZWN0VGltZUNoYW5nZWQpPSJvblNlbGVjdFRpbWVDaGFuZ2VkKCRldmVudCkiXG4gICAgPlxuICAgIDwvbWV0cmljcy1kYXNoYm9hcmQtc2V0dGluZ3MtY29tcG9uZW50PlxuICAnLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y2xhc3MgbGh0e31mdW5jdGlvbiBjaHQodCxlKXsxJnQmJlRtKDAsIm1ldHJpY3MtZmlsdGVyZWQtdmlldyIsOSksMiZ0JiZEbSgiY2FyZE9ic2VydmVyIixZbSgpLmNhcmRPYnNlcnZlcil9ZnVuY3Rpb24gZGh0KHQsZSl7MSZ0JiYoUm0oMCwiZGl2IiwxMiksVG0oMSwibWF0LXNwaW5uZXIiLDEzKSxBbSgpKX1mdW5jdGlvbiBwaHQodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDE0KSxSbSgxLCJkaXYiLDE1KSxSbSgyLCJoMiIsMTYpLGt1KDMsIlNldHRpbmdzIiksQW0oKSxSbSg0LCJidXR0b24iLDE3KSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLFltKCkub25DbG9zZVNpZGVwYW5lQnV0dG9uQ2xpY2tlZC5lbWl0KCl9KSksVG0oNSwibWF0LWljb24iLDE4KSxBbSgpLEFtKCksVG0oNiwibWV0cmljcy1kYXNoYm9hcmQtcmlnaHQtcGFuZSIpLEFtKCl9fWxodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bGh0KX0sbGh0Lsm1Y21wPXRvKHt0eXBlOmxodCxzZWxlY3RvcnM6W1sibWV0cmljcy1kYXNoYm9hcmQtcmlnaHQtcGFuZSJdXSxkZWNsczoxLHZhcnM6MCx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiZUbSgwLCJtZXRyaWNzLWRhc2hib2FyZC1zZXR0aW5ncyIpfSxkaXJlY3RpdmVzOltzaHRdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobGh0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1ldHJpY3MtZGFzaGJvYXJkLXJpZ2h0LXBhbmUiLHRlbXBsYXRlOiI8bWV0cmljcy1kYXNoYm9hcmQtc2V0dGluZ3M+PC9tZXRyaWNzLWRhc2hib2FyZC1zZXR0aW5ncz4iLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwsbnVsbCk7Y29uc3QgbWh0PWZ1bmN0aW9uKHQpe3JldHVybntjaGVja2VkOnQsInNldHRpbmdzLWJ1dHRvbiI6ITB9fTtjbGFzcyB1aHR7Y29uc3RydWN0b3IodCl7dGhpcy5ob3N0PXQsdGhpcy5vblNldHRpbmdzQnV0dG9uQ2xpY2tlZD1uZXcgTGgsdGhpcy5vbkNsb3NlU2lkZXBhbmVCdXR0b25DbGlja2VkPW5ldyBMaCx0aGlzLm9uUGx1Z2luVHlwZVRvZ2dsZWQ9bmV3IExoLHRoaXMub25QbHVnaW5UeXBlQWxsVG9nZ2xlZD1uZXcgTGgsdGhpcy5QbHVnaW5UeXBlPWhBLHRoaXMuY2FyZE9ic2VydmVyPW5ldyBwMih0aGlzLmhvc3QubmF0aXZlRWxlbWVudCwiNjAwcHggMHB4IDYwMHB4IDBweCIpfX11aHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHVodCkoU20oaGcpKX0sdWh0Lsm1Y21wPXRvKHt0eXBlOnVodCxzZWxlY3RvcnM6W1sibWV0cmljcy1tYWluLXZpZXctY29tcG9uZW50Il1dLGlucHV0czp7c2hvd0ZpbHRlcmVkVmlldzoic2hvd0ZpbHRlcmVkVmlldyIsaXNTaWRlcGFuZU9wZW46ImlzU2lkZXBhbmVPcGVuIixmaWx0ZXJlZFBsdWdpblR5cGVzOiJmaWx0ZXJlZFBsdWdpblR5cGVzIixpbml0aWFsVGFnc0xvYWRpbmc6ImluaXRpYWxUYWdzTG9hZGluZyJ9LG91dHB1dHM6e29uU2V0dGluZ3NCdXR0b25DbGlja2VkOiJvblNldHRpbmdzQnV0dG9uQ2xpY2tlZCIsb25DbG9zZVNpZGVwYW5lQnV0dG9uQ2xpY2tlZDoib25DbG9zZVNpZGVwYW5lQnV0dG9uQ2xpY2tlZCIsb25QbHVnaW5UeXBlVG9nZ2xlZDoib25QbHVnaW5UeXBlVG9nZ2xlZCIsb25QbHVnaW5UeXBlQWxsVG9nZ2xlZDoib25QbHVnaW5UeXBlQWxsVG9nZ2xlZCJ9LGRlY2xzOjIyLHZhcnM6MjEsY29uc3RzOmZ1bmN0aW9uKCl7bGV0IHQsZTtyZXR1cm4gdD0idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZT9nb29nLmdldE1zZygiVG9nZ2xlIHNldHRpbmdzIHNpZGUgcGFuZSIpOiRsb2NhbGl6ZWA6TGFiZWwgb24gYSB0b29sYmFyIGJ1dHRvbiB0byB0b2dnbGUgdGhlIHNldHRpbmdzIHNpZGUgcGFuZS7ikJ9kMzUxNmRiNmJiZTY4NjBhNTViZWFiNjZlNDk2OWRhYzYyNWI4ZDcy4pCfNzY1OTI4NTQ0NTU4MDgzODkyNTpUb2dnbGUgc2V0dGluZ3Mgc2lkZSBwYW5lYCxlPSJ1bmRlZmluZWQiIT10eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUmJm5nSTE4bkNsb3N1cmVNb2RlP2dvb2cuZ2V0TXNnKCJDbG9zZSBzaWRlIHBhbmUiKTokbG9jYWxpemVgOkxhYmVsIG9uIGEgYnV0dG9uIHRvIGNsb3NlIHRoZSBzZXR0aW5ncyBzaWRlIHBhbmUu4pCfMDQ1MjFkYzBiNmE2NWNmNWMzODI5NDRjOWE4YjRiODQ0YTNlOTU5OOKQnzgxNTY3NjY5OTc3NDcxNjU4NzE6Q2xvc2Ugc2lkZSBwYW5lYCxbWzEsInRvb2xiYXIiXSxbIm11bHRpcGxlIiwiIiwiYXBwZWFyYW5jZSIsInN0YW5kYXJkIiwxLCJmaWx0ZXItdmlldyJdLFszLCJjaGVja2VkIiwiY2xpY2siXSxbMSwicmlnaHQtaXRlbXMiXSxbIm1hdC1zdHJva2VkLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLHQsMywibmdDbGFzcyIsImNsaWNrIl0sWyJzdmdJY29uIiwic2V0dGluZ3NfMjRweCJdLFsxLCJzcGxpdC1jb250ZW50Il0sWyJjZGtTY3JvbGxhYmxlIiwiIl0sWzMsImNhcmRPYnNlcnZlciIsNCwibmdJZiJdLFszLCJjYXJkT2JzZXJ2ZXIiXSxbImNsYXNzIiwibG9hZGluZy1jb250YWluZXIiLDQsIm5nSWYiXSxbImNsYXNzIiwic2lkZWJhciIsNCwibmdJZiJdLFsxLCJsb2FkaW5nLWNvbnRhaW5lciJdLFsiZGlhbWV0ZXIiLCIzNiJdLFsxLCJzaWRlYmFyIl0sWzEsImhlYWRlciJdLFsxLCJ0aXRsZSJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsZSwzLCJjbGljayJdLFsic3ZnSWNvbiIsImNsb3NlXzI0cHgiXV19LHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJkaXYiLDApLFRtKDEsIm1ldHJpY3MtdGFnLWZpbHRlciIpLFJtKDIsIm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIiwxKSxSbSgzLCJtYXQtYnV0dG9uLXRvZ2dsZSIsMiksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uUGx1Z2luVHlwZUFsbFRvZ2dsZWQuZW1pdCgpfSkpLGt1KDQsIiBBbGwgIiksQW0oKSxSbSg1LCJtYXQtYnV0dG9uLXRvZ2dsZSIsMiksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uUGx1Z2luVHlwZVRvZ2dsZWQuZW1pdChuLlBsdWdpblR5cGUuU0NBTEFSUyl9KSksa3UoNiwiIFNjYWxhcnMgIiksQW0oKSxSbSg3LCJtYXQtYnV0dG9uLXRvZ2dsZSIsMiksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uUGx1Z2luVHlwZVRvZ2dsZWQuZW1pdChuLlBsdWdpblR5cGUuSU1BR0VTKX0pKSxrdSg4LCIgSW1hZ2UgIiksQW0oKSxSbSg5LCJtYXQtYnV0dG9uLXRvZ2dsZSIsMiksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uUGx1Z2luVHlwZVRvZ2dsZWQuZW1pdChuLlBsdWdpblR5cGUuSElTVE9HUkFNUyl9KSksa3UoMTAsIiBIaXN0b2dyYW0gIiksQW0oKSxBbSgpLFJtKDExLCJkaXYiLDMpLFJtKDEyLCJidXR0b24iLDQpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblNldHRpbmdzQnV0dG9uQ2xpY2tlZC5lbWl0KCl9KSksVG0oMTMsIm1hdC1pY29uIiw1KSxrdSgxNCwiIFNldHRpbmdzICIpLEFtKCksQW0oKSxBbSgpLFJtKDE1LCJkaXYiLDYpLFJtKDE2LCJkaXYiLDcpLFFwKDE3LGNodCwxLDEsIm1ldHJpY3MtZmlsdGVyZWQtdmlldyIsOCksVG0oMTgsIm1ldHJpY3MtcGlubmVkLXZpZXciLDkpLFFwKDE5LGRodCwyLDAsImRpdiIsMTApLFRtKDIwLCJtZXRyaWNzLWNhcmQtZ3JvdXBzIiw5KSxBbSgpLFFwKDIxLHBodCw3LDAsImRpdiIsMTEpLEFtKCkpLDImZSYmKHJjKDMpLERtKCJjaGVja2VkIiwwPT09bi5maWx0ZXJlZFBsdWdpblR5cGVzLnNpemUpLHJjKDIpLERtKCJjaGVja2VkIixuLmZpbHRlcmVkUGx1Z2luVHlwZXMuaGFzKG4uUGx1Z2luVHlwZS5TQ0FMQVJTKSkscmMoMiksRG0oImNoZWNrZWQiLG4uZmlsdGVyZWRQbHVnaW5UeXBlcy5oYXMobi5QbHVnaW5UeXBlLklNQUdFUykpLHJjKDIpLERtKCJjaGVja2VkIixuLmZpbHRlcmVkUGx1Z2luVHlwZXMuaGFzKG4uUGx1Z2luVHlwZS5ISVNUT0dSQU1TKSkscmMoMyksRG0oIm5nQ2xhc3MiLE1oKDE5LG1odCxuLmlzU2lkZXBhbmVPcGVuKSksanAoImFyaWEtcHJlc3NlZCIsbi5pc1NpZGVwYW5lT3BlbikscmMoNCkscHUoIm1haW4iLCEwKSgiZmlsdGVyLXZpZXciLG4uc2hvd0ZpbHRlcmVkVmlldykscmMoMSksRG0oIm5nSWYiLG4uc2hvd0ZpbHRlcmVkVmlldykscmMoMSksZHUoImRpc3BsYXkiLG4uc2hvd0ZpbHRlcmVkVmlldz8ibm9uZSI6IiIpLERtKCJjYXJkT2JzZXJ2ZXIiLG4uY2FyZE9ic2VydmVyKSxyYygxKSxEbSgibmdJZiIsbi5pbml0aWFsVGFnc0xvYWRpbmcpLHJjKDEpLGR1KCJkaXNwbGF5IixuLnNob3dGaWx0ZXJlZFZpZXc/Im5vbmUiOiIiKSxEbSgiY2FyZE9ic2VydmVyIixuLmNhcmRPYnNlcnZlcikscmMoMSksRG0oIm5nSWYiLG4uaXNTaWRlcGFuZU9wZW4pKX0sZGlyZWN0aXZlczpbeDIsRTIsQTIsWEgsYU0sRFcsbUYsZE0sQmd0LFlndCwkZ3QsbzEsbGh0XSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47aGVpZ2h0OjEwMCV9LnRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWI7ZmxleDpub25lO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47aGVpZ2h0OjQ4cHg7cGFkZGluZzowIDE2cHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLnRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAudG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzU1NX0udG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBtZXRyaWNzLXRhZy1maWx0ZXJbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MSAxIDEwMHB4fS50b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5yaWdodC1pdGVtc1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkICNlYmViZWI7bWFyZ2luLWxlZnQ6MTZweDtwYWRkaW5nLWxlZnQ6MTZweH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAudG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAucmlnaHQtaXRlbXNbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAudG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAucmlnaHQtaXRlbXNbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjNTU1fS5maWx0ZXItdmlld1tfbmdjb250ZW50LSVDT01QJV17ZmxleDpub25lO21hcmdpbi1yaWdodDo1cHh9LmZpbHRlci12aWV3W19uZ2NvbnRlbnQtJUNPTVAlXSAgIG1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MjVweDtmb250LXNpemU6MTJweH0uZmlsdGVyLXZpZXdbX25nY29udGVudC0lQ09NUCVdICAgbWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICAgICAubWF0LWJ1dHRvbi10b2dnbGUtbGFiZWwtY29udGVudHtsaW5lLWhlaWdodDoyNXB4fS5zcGxpdC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7b3ZlcmZsb3cteTphdXRvO2ZsZXg6MX0ubWFpbltfbmdjb250ZW50LSVDT01QJV0sIC5zaWRlYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb250YWluOnN0cmljdDtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87d2lsbC1jaGFuZ2U6dHJhbnNmb3JtLHNjcm9sbC1wb3NpdGlvbn0ubWFpbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjVmNmY3O2ZsZXg6MSAxO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW59Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLm1haW5bX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAubWFpbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojM2EzYTNhfS5tYWluW19uZ2NvbnRlbnQtJUNPTVAlXSAgIG1ldHJpY3MtZmlsdGVyZWQtdmlld1tfbmdjb250ZW50LSVDT01QJV0sIC5tYWluW19uZ2NvbnRlbnQtJUNPTVAlXSAgIG1ldHJpY3MtcGlubmVkLXZpZXdbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWJ9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgLm1haW5bX25nY29udGVudC0lQ09NUCVdICAgbWV0cmljcy1maWx0ZXJlZC12aWV3W19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLm1haW5bX25nY29udGVudC0lQ09NUCVdICAgbWV0cmljcy1maWx0ZXJlZC12aWV3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjNTU1fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5tYWluW19uZ2NvbnRlbnQtJUNPTVAlXSAgIG1ldHJpY3MtcGlubmVkLXZpZXdbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAubWFpbltfbmdjb250ZW50LSVDT01QJV0gICBtZXRyaWNzLXBpbm5lZC12aWV3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjNTU1fS5tYWluLmZpbHRlci12aWV3W19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW59Lm1haW4uZmlsdGVyLXZpZXdbX25nY29udGVudC0lQ09NUCVdICAgbWV0cmljcy1maWx0ZXJlZC12aWV3W19uZ2NvbnRlbnQtJUNPTVAlXXtjb250YWluOmNvbnRlbnQ7b3ZlcmZsb3c6YXV0bzt3aWxsLWNoYW5nZTp0cmFuc2Zvcm0sc2Nyb2xsLXBvc2l0aW9ufS5sb2FkaW5nLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbjoyMHB4IDB9LnNpZGViYXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjZWJlYmViO2ZsZXg6MCAwIDI1MHB4fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC5zaWRlYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLnNpZGViYXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjNTU1fS5zaWRlYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWI7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtoZWlnaHQ6NDJweDtwYWRkaW5nOjAgMTZweH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAuc2lkZWJhcltfbmdjb250ZW50LSVDT01QJV0gICAuaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLnNpZGViYXJbX25nY29udGVudC0lQ09NUCVdICAgLmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzU1NX0uc2lkZWJhcltfbmdjb250ZW50LSVDT01QJV0gICAuaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC50aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHg7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0Om5vcm1hbDttYXJnaW46MH1bX25naG9zdC0lQ09NUCVdICAgLnNldHRpbmdzLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MTtkaXNwbGF5OmlubGluZS1mbGV4fWJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC5zZXR0aW5ncy1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfVtfbmdob3N0LSVDT01QJV0gICAuc2V0dGluZ3MtYnV0dG9uLmNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtib3JkZXItY29sb3I6I2UwZTBlMH1ib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAuc2V0dGluZ3MtYnV0dG9uLmNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzIxMjEyMX1bX25naG9zdC0lQ09NUCVdICAgLnNldHRpbmdzLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAgIC5tYXQtYnV0dG9uLXdyYXBwZXJ7ZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXJ9W19uZ2hvc3QtJUNPTVAlXSAgIC5zZXR0aW5ncy1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgbWF0LWljb25bX25nY29udGVudC0lQ09NUCVde21hcmdpbi1yaWdodDo0cHh9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHVodCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJtZXRyaWNzLW1haW4tdmlldy1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiJtYWluX3ZpZXdfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIm1haW5fdmlld19jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfV19KSx7c2hvd0ZpbHRlcmVkVmlldzpbe3R5cGU6eHl9XSxpc1NpZGVwYW5lT3Blbjpbe3R5cGU6eHl9XSxmaWx0ZXJlZFBsdWdpblR5cGVzOlt7dHlwZTp4eX1dLGluaXRpYWxUYWdzTG9hZGluZzpbe3R5cGU6eHl9XSxvblNldHRpbmdzQnV0dG9uQ2xpY2tlZDpbe3R5cGU6T3l9XSxvbkNsb3NlU2lkZXBhbmVCdXR0b25DbGlja2VkOlt7dHlwZTpPeX1dLG9uUGx1Z2luVHlwZVRvZ2dsZWQ6W3t0eXBlOk95fV0sb25QbHVnaW5UeXBlQWxsVG9nZ2xlZDpbe3R5cGU6T3l9XX0pO2NsYXNzIGZodHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5pc1NpZGVwYW5lT3BlbiQ9dGhpcy5zdG9yZS5zZWxlY3QoWFQpLHRoaXMuaW5pdGlhbFRhZ3NMb2FkaW5nJD10aGlzLnN0b3JlLnNlbGVjdCh1VCkucGlwZShIZSgodD0+bnVsbD09PXQubGFzdExvYWRlZFRpbWVJbk1zKSwhMCksSXQoKHQ9PnQuc3RhdGU9PT15RS5MT0FESU5HJiZudWxsPT09dC5sYXN0TG9hZGVkVGltZUluTXMpKSksdGhpcy5zaG93RmlsdGVyZWRWaWV3JD10aGlzLnN0b3JlLnNlbGVjdChCVCkucGlwZShJdCgodD0+dC5sZW5ndGg+MCkpKSx0aGlzLmZpbHRlcmVkUGx1Z2luVHlwZXMkPXRoaXMuc3RvcmUuc2VsZWN0KHFUKX1vblNldHRpbmdzQnV0dG9uQ2xpY2tlZCgpe3RoaXMuc3RvcmUuZGlzcGF0Y2goekUoKSl9b25DbG9zZVNpZGVwYW5lQnV0dG9uQ2xpY2tlZCgpe3RoaXMuc3RvcmUuZGlzcGF0Y2goTkUoKSl9b25QbHVnaW5WaXNpYmlsaXR5VG9nZ2xlZCh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKGlSKHtwbHVnaW46dH0pKX1vblNob3dBbGxQbHVnaW5zKCl7dGhpcy5zdG9yZS5kaXNwYXRjaChhUigpKX19Zmh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxmaHQpKFNtKEl3KSl9LGZodC7JtWNtcD10byh7dHlwZTpmaHQsc2VsZWN0b3JzOltbIm1ldHJpY3MtbWFpbi12aWV3Il1dLGRlY2xzOjUsdmFyczoxMixjb25zdHM6W1szLCJzaG93RmlsdGVyZWRWaWV3IiwiaXNTaWRlcGFuZU9wZW4iLCJpbml0aWFsVGFnc0xvYWRpbmciLCJmaWx0ZXJlZFBsdWdpblR5cGVzIiwib25TZXR0aW5nc0J1dHRvbkNsaWNrZWQiLCJvbkNsb3NlU2lkZXBhbmVCdXR0b25DbGlja2VkIiwib25QbHVnaW5UeXBlVG9nZ2xlZCIsIm9uUGx1Z2luVHlwZUFsbFRvZ2dsZWQiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsIm1ldHJpY3MtbWFpbi12aWV3LWNvbXBvbmVudCIsMCksVm0oIm9uU2V0dGluZ3NCdXR0b25DbGlja2VkIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uU2V0dGluZ3NCdXR0b25DbGlja2VkKCl9KSkoIm9uQ2xvc2VTaWRlcGFuZUJ1dHRvbkNsaWNrZWQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25DbG9zZVNpZGVwYW5lQnV0dG9uQ2xpY2tlZCgpfSkpKCJvblBsdWdpblR5cGVUb2dnbGVkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblBsdWdpblZpc2liaWxpdHlUb2dnbGVkKGUpfSkpKCJvblBsdWdpblR5cGVBbGxUb2dnbGVkIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uU2hvd0FsbFBsdWdpbnMoKX0pKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQWgoMywiYXN5bmMiKSxBaCg0LCJhc3luYyIpLEFtKCkpLDImZSYmRG0oInNob3dGaWx0ZXJlZFZpZXciLFRoKDEsNCxuLnNob3dGaWx0ZXJlZFZpZXckKSkoImlzU2lkZXBhbmVPcGVuIixUaCgyLDYsbi5pc1NpZGVwYW5lT3BlbiQpKSgiaW5pdGlhbFRhZ3NMb2FkaW5nIixUaCgzLDgsbi5pbml0aWFsVGFnc0xvYWRpbmckKSkoImZpbHRlcmVkUGx1Z2luVHlwZXMiLFRoKDQsMTAsbi5maWx0ZXJlZFBsdWdpblR5cGVzJCkpfSxkaXJlY3RpdmVzOlt1aHRdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChmaHQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWV0cmljcy1tYWluLXZpZXciLHRlbXBsYXRlOidcbiAgICA8bWV0cmljcy1tYWluLXZpZXctY29tcG9uZW50XG4gICAgICBbc2hvd0ZpbHRlcmVkVmlld109InNob3dGaWx0ZXJlZFZpZXckIHwgYXN5bmMiXG4gICAgICBbaXNTaWRlcGFuZU9wZW5dPSJpc1NpZGVwYW5lT3BlbiQgfCBhc3luYyJcbiAgICAgIFtpbml0aWFsVGFnc0xvYWRpbmddPSJpbml0aWFsVGFnc0xvYWRpbmckIHwgYXN5bmMiXG4gICAgICBbZmlsdGVyZWRQbHVnaW5UeXBlc109ImZpbHRlcmVkUGx1Z2luVHlwZXMkIHwgYXN5bmMiXG4gICAgICAob25TZXR0aW5nc0J1dHRvbkNsaWNrZWQpPSJvblNldHRpbmdzQnV0dG9uQ2xpY2tlZCgpIlxuICAgICAgKG9uQ2xvc2VTaWRlcGFuZUJ1dHRvbkNsaWNrZWQpPSJvbkNsb3NlU2lkZXBhbmVCdXR0b25DbGlja2VkKCkiXG4gICAgICAob25QbHVnaW5UeXBlVG9nZ2xlZCk9Im9uUGx1Z2luVmlzaWJpbGl0eVRvZ2dsZWQoJGV2ZW50KSJcbiAgICAgIChvblBsdWdpblR5cGVBbGxUb2dnbGVkKT0ib25TaG93QWxsUGx1Z2lucygpIlxuICAgID48L21ldHJpY3MtbWFpbi12aWV3LWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NvbnN0IGdodD1uZXcgR2EoIltNZXRyaWNzXSBNRVRSSUNTX1Byb21vIE1lc3NhZ2UgQ29tcG9uZW50Iik7ZnVuY3Rpb24gaGh0KHQsZSl7MSZ0JiYoTm0oMCksWG0oMSksem0oKSl9Y2xhc3MgYmh0e2NvbnN0cnVjdG9yKHQsZSl7dGhpcy52aWV3Q29udGFpbmVyUmVmPXQsdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI9ZX1uZ09uSW5pdCgpe2lmKHRoaXMuY3VzdG9taXphYmxlQ29tcG9uZW50KXtjb25zdCB0PXRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KHRoaXMuY3VzdG9taXphYmxlQ29tcG9uZW50LmNvbnN0cnVjdG9yKTt0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KHQpfX19Ymh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxiaHQpKFNtKGVoKSxTbSh1ZykpfSxiaHQuybVjbXA9dG8oe3R5cGU6Ymh0LHNlbGVjdG9yczpbWyJ0Yi1jdXN0b21pemF0aW9uIl1dLGlucHV0czp7Y3VzdG9taXphYmxlQ29tcG9uZW50OiJjdXN0b21pemFibGVDb21wb25lbnQifSxuZ0NvbnRlbnRTZWxlY3RvcnM6WyIqIl0sZGVjbHM6MSx2YXJzOjEsY29uc3RzOltbNCwibmdJZiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoWm0oKSxRcCgwLGhodCwyLDAsIm5nLWNvbnRhaW5lciIsMCkpLDImZSYmRG0oIm5nSWYiLCFuLmN1c3RvbWl6YWJsZUNvbXBvbmVudCl9LGRpcmVjdGl2ZXM6W2RNXSxlbmNhcHN1bGF0aW9uOjJ9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGJodCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJ0Yi1jdXN0b21pemF0aW9uIix0ZW1wbGF0ZTonXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj0iIWN1c3RvbWl6YWJsZUNvbXBvbmVudCI+XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICd9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTplaH0se3R5cGU6dWd9XX0pLHtjdXN0b21pemFibGVDb21wb25lbnQ6W3t0eXBlOnh5fV19KTtjbGFzcyB5aHR7Y29uc3RydWN0b3IodCl7dGhpcy5jdXN0b21Qcm9tb01lc3NhZ2U9dCx0aGlzLm9uRGlzbWlzcz1uZXcgTGgsdGhpcy5vbkdvVG9TY2FsYXJzPW5ldyBMaH19eWh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx5aHQpKFNtKGdodCw4KSl9LHlodC7JtWNtcD10byh7dHlwZTp5aHQsc2VsZWN0b3JzOltbIm1ldHJpY3MtcHJvbW8tbm90aWNlLWNvbXBvbmVudCJdXSxvdXRwdXRzOntvbkRpc21pc3M6Im9uRGlzbWlzcyIsb25Hb1RvU2NhbGFyczoib25Hb1RvU2NhbGFycyJ9LGRlY2xzOjcsdmFyczoxLGNvbnN0czpbWzEsIm1lc3NhZ2UiLDMsImN1c3RvbWl6YWJsZUNvbXBvbmVudCJdLFsxLCJnby10by1zY2FsYXJzIiwzLCJjbGljayJdLFsxLCJkaXNtaXNzIiwzLCJjbGljayJdLFsiaW5saW5lIiwiIiwic3ZnSWNvbiIsImNsb3NlXzI0cHgiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsInRiLWN1c3RvbWl6YXRpb24iLDApLGt1KDEsIiBXZWxjb21lIHRvIG5ldyBkZWZhdWx0IGV4cGVyaWVuY2Ugb2YgVGVuc29yQm9hcmQuIFRpbWUgU2VyaWVzIGxldHMgeW91IHZpZXcgYWxsIHZpc3VhbGl6YXRpb25zIGF0IG9uY2UsIHB1dCB0aGVtIHNpZGUtYnktc2lkZSB3aXRoIHBpbnMsIGFuZCBjdXN0b21pemUgY29sb3JzLiBTY2FsYXJzIGFuZCBvdGhlciBwbHVnaW5zIGFyZSBzdGlsbCBhdmFpbGFibGUuICIpLFJtKDIsImJ1dHRvbiIsMSksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uR29Ub1NjYWxhcnMuZW1pdCgpfSkpLGt1KDMsIiBHbyB0byBTY2FsYXJzIHBsdWdpbiIpLEFtKCksa3UoNCwiLlxuIiksQW0oKSxSbSg1LCJidXR0b24iLDIpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkRpc21pc3MuZW1pdCgpfSkpLFRtKDYsIm1hdC1pY29uIiwzKSxBbSgpKSwyJmUmJkRtKCJjdXN0b21pemFibGVDb21wb25lbnQiLG4uY3VzdG9tUHJvbW9NZXNzYWdlKX0sZGlyZWN0aXZlczpbYmh0LERXXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmb250LXNpemU6MTRweDtnYXA6NXB4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2xpbmUtaGVpZ2h0OjIwcHg7cGFkZGluZzo1cHggMTBweH1idXR0b25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyOjA7Y29sb3I6aW5oZXJpdDtjdXJzb3I6cG9pbnRlcjtmb250OmluaGVyaXQ7cGFkZGluZzowfWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX10Yi1jdXN0b21pemF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzE5NzZkMn0uZGlzbWlzc1tfbmdjb250ZW50LSVDT01QJV17YWxpZ24tc2VsZjpiYXNlbGluZTtmbGV4Om5vbmU7aGVpZ2h0OjIwcHg7d2lkdGg6MjBweH0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoeWh0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1ldHJpY3MtcHJvbW8tbm90aWNlLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Im1ldHJpY3NfcHJvbW9fbm90aWNlX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyJtZXRyaWNzX3Byb21vX25vdGljZV9jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlFhLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltnaHRdfV19XX0pLHtvbkRpc21pc3M6W3t0eXBlOk95fV0sb25Hb1RvU2NhbGFyczpbe3R5cGU6T3l9XX0pO2NsYXNzIF9odHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXR9b25EaXNtaXNzKCl7dGhpcy5zdG9yZS5kaXNwYXRjaChkUigpKX1vbkdvVG9TY2FsYXJzKCl7dGhpcy5zdG9yZS5kaXNwYXRjaChwUigpKX19ZnVuY3Rpb24gQ2h0KHQsZSl7MSZ0JiZUbSgwLCJtZXRyaWNzLXByb21vLW5vdGljZSIsMyl9X2h0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxfaHQpKFNtKEl3KSl9LF9odC7JtWNtcD10byh7dHlwZTpfaHQsc2VsZWN0b3JzOltbIm1ldHJpY3MtcHJvbW8tbm90aWNlIl1dLGRlY2xzOjEsdmFyczowLGNvbnN0czpbWzMsIm9uRGlzbWlzcyIsIm9uR29Ub1NjYWxhcnMiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsIm1ldHJpY3MtcHJvbW8tbm90aWNlLWNvbXBvbmVudCIsMCksVm0oIm9uRGlzbWlzcyIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkRpc21pc3MoKX0pKSgib25Hb1RvU2NhbGFycyIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkdvVG9TY2FsYXJzKCl9KSksQW0oKSl9LGRpcmVjdGl2ZXM6W3lodF0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChfaHQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWV0cmljcy1wcm9tby1ub3RpY2UiLHRlbXBsYXRlOic8bWV0cmljcy1wcm9tby1ub3RpY2UtY29tcG9uZW50XG4gICAgKG9uRGlzbWlzcyk9Im9uRGlzbWlzcygpIlxuICAgIChvbkdvVG9TY2FsYXJzKT0ib25Hb1RvU2NhbGFycygpIlxuICA+PC9tZXRyaWNzLXByb21vLW5vdGljZS1jb21wb25lbnQ+JyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NsYXNzIE1odHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5pc0J1dHRlckJhckVuYWJsZWQkPXRoaXMuc3RvcmUuc2VsZWN0KGFFKS5waXBlKGZlKHRoaXMuc3RvcmUuc2VsZWN0KFpUKSksSXQoKChbdCxlXSk9PnQmJmUpKSl9fU1odC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8TWh0KShTbShJdykpfSxNaHQuybVjbXA9dG8oe3R5cGU6TWh0LHNlbGVjdG9yczpbWyJtZXRyaWNzLWRhc2hib2FyZCJdXSxkZWNsczo1LHZhcnM6Myxjb25zdHM6W1siY2xhc3MiLCJub3RpY2UiLDQsIm5nSWYiXSxbInNpZGViYXIiLCIiXSxbIm1haW4iLCIiXSxbMSwibm90aWNlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihRcCgwLENodCwxLDAsIm1ldHJpY3MtcHJvbW8tbm90aWNlIiwwKSxBaCgxLCJhc3luYyIpLFJtKDIsInRiLWRhc2hib2FyZC1sYXlvdXQiKSxUbSgzLCJydW5zLXNlbGVjdG9yIiwxKSxUbSg0LCJtZXRyaWNzLW1haW4tdmlldyIsMiksQW0oKSksMiZlJiZEbSgibmdJZiIsVGgoMSwxLG4uaXNCdXR0ZXJCYXJFbmFibGVkJCkpfSxkaXJlY3RpdmVzOltkTSxNUSxjMixmaHQsX2h0XSxwaXBlczpbd01dLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtoZWlnaHQ6MTAwJTtqdXN0aWZ5LWNvbnRlbnQ6c3RyZXRjaDtvdmVyZmxvdzpoaWRkZW59Lm5vdGljZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNDUsMTU3LC44NSk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2ZmZWIzYjtjb2xvcjojMjEyMTIxO2Rpc3BsYXk6YmxvY2s7ZmxleDowIDB9dGItZGFzaGJvYXJkLWxheW91dFtfbmdjb250ZW50LSVDT01QJV17ZmxleDoxIDE7b3ZlcmZsb3c6aGlkZGVufW5hdltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci1yaWdodDoxcHggc29saWQgI2ViZWJlYjtmbGV4Om5vbmU7d2lkdGg6MzQwcHh9Ym9keS5kYXJrLW1vZGVbX25naG9zdC0lQ09NUCVdICAgbmF2W19uZ2NvbnRlbnQtJUNPTVAlXSwgYm9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgbmF2W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMzMDMwMzA7Ym9yZGVyLXJpZ2h0LWNvbG9yOiM1NTV9bWV0cmljcy1tYWluLXZpZXdbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MSAxfSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChNaHQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWV0cmljcy1kYXNoYm9hcmQiLHRlbXBsYXRlOidcbiAgICA8bWV0cmljcy1wcm9tby1ub3RpY2VcbiAgICAgICpuZ0lmPSJpc0J1dHRlckJhckVuYWJsZWQkIHwgYXN5bmMiXG4gICAgICBjbGFzcz0ibm90aWNlIlxuICAgID48L21ldHJpY3MtcHJvbW8tbm90aWNlPlxuICAgIDx0Yi1kYXNoYm9hcmQtbGF5b3V0PlxuICAgICAgPHJ1bnMtc2VsZWN0b3Igc2lkZWJhcj48L3J1bnMtc2VsZWN0b3I+XG4gICAgICA8bWV0cmljcy1tYWluLXZpZXcgbWFpbj48L21ldHJpY3MtbWFpbi12aWV3PlxuICAgIDwvdGItZGFzaGJvYXJkLWxheW91dD5cbiAgJyxzdHlsZVVybHM6WyJtZXRyaWNzX2NvbnRhaW5lci5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NsYXNzIHZodHt9dmh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx2aHQpfSx2aHQuybVtb2Q9YW8oe3R5cGU6dmh0fSksdmh0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV00sRVcsSkhdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodmh0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltNUV0sZXhwb3J0czpbTVFdLGltcG9ydHM6W1dNLEVXLEpIXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKHZodCx7ZGVjbGFyYXRpb25zOltNUV0saW1wb3J0czpbV00sRVcsSkhdLGV4cG9ydHM6W01RXX0pO2NsYXNzIHhodHt9eGh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx4aHQpfSx4aHQuybVtb2Q9YW8oe3R5cGU6eGh0fSkseGh0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV01dXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoeGh0LFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbV01dLGRlY2xhcmF0aW9uczpbYmh0XSxleHBvcnRzOltiaHRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oeGh0LHtkZWNsYXJhdGlvbnM6W2JodF0saW1wb3J0czpbV01dLGV4cG9ydHM6W2JodF19KTtjbGFzcyBPaHR7fU9odC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8T2h0KX0sT2h0Lsm1bW9kPWFvKHt0eXBlOk9odH0pLE9odC7JtWluaj12bih7aW1wb3J0czpbW1dNLFkwLEVXXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKE9odCxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbcTBdLGV4cG9ydHM6W3EwXSxpbXBvcnRzOltXTSxZMCxFV119XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhPaHQse2RlY2xhcmF0aW9uczpbcTBdLGltcG9ydHM6W1dNLFkwLEVXXSxleHBvcnRzOltxMF19KTtjbGFzcyBQaHR7fVBodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8UGh0KX0sUGh0Lsm1bW9kPWFvKHt0eXBlOlBodH0pLFBodC7JtWluaj12bih7aW1wb3J0czpbW1dNXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFBodCxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W1dNXSxleHBvcnRzOltEMV0sZGVjbGFyYXRpb25zOltEMV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhQaHQse2RlY2xhcmF0aW9uczpbRDFdLGltcG9ydHM6W1dNXSxleHBvcnRzOltEMV19KTtjbGFzcyB3aHR7fXdodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8d2h0KX0sd2h0Lsm1bW9kPWFvKHt0eXBlOndodH0pLHdodC7JtWluaj12bih7aW1wb3J0czpbW3kzLFdNLE9odCxUVixKSCxTWSxkVyxCWSxFVyxvWSxlJCxpMSx1JCx3MCxQaHQsSkxdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgod2h0LFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbeTMsV00sT2h0LFRWLEpILFNZLGRXLEJZLEVXLG9ZLGUkLGkxLHUkLHcwLFBodCxKTF0sZXhwb3J0czpbczJdLGVudHJ5Q29tcG9uZW50czpbaDFdLGRlY2xhcmF0aW9uczpbZzEsaDEsUDEsdzEsbzIsczJdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8od2h0LHtkZWNsYXJhdGlvbnM6W2cxLGgxLFAxLHcxLG8yLHMyXSxpbXBvcnRzOlt5MyxXTSxPaHQsVFYsSkgsU1ksZFcsQlksRVcsb1ksZSQsaTEsdSQsdzAsUGh0LEpMXSxleHBvcnRzOltzMl19KTtjbGFzcyBraHR7fWtodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8a2h0KX0sa2h0Lsm1bW9kPWFvKHt0eXBlOmtodH0pLGtodC7JtWluaj12bih7aW1wb3J0czpbW1dNLHdodF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChraHQsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltXTSx3aHRdLGV4cG9ydHM6W2MyXSxkZWNsYXJhdGlvbnM6W2wyLGMyXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKGtodCx7ZGVjbGFyYXRpb25zOltsMixjMl0saW1wb3J0czpbV00sd2h0XSxleHBvcnRzOltjMl19KTtjbGFzcyBTaHR7fVNodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8U2h0KX0sU2h0Lsm1bW9kPWFvKHt0eXBlOlNodH0pLFNodC7JtWluaj12bih7fSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChTaHQsW3t0eXBlOkF5LGFyZ3M6W3tleHBvcnRzOltOZnRdLGRlY2xhcmF0aW9uczpbTmZ0XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFNodCx7ZGVjbGFyYXRpb25zOltOZnRdLGV4cG9ydHM6W05mdF19KTtjbGFzcyBEaHR7fURodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8RGh0KX0sRGh0Lsm1bW9kPWFvKHt0eXBlOkRodH0pLERodC7JtWluaj12bih7aW1wb3J0czpbW1dNXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKERodCxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbaGZ0XSxleHBvcnRzOltoZnRdLGltcG9ydHM6W1dNXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKERodCx7ZGVjbGFyYXRpb25zOltoZnRdLGltcG9ydHM6W1dNXSxleHBvcnRzOltoZnRdfSk7Y2xhc3MgRWh0e31FaHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEVodCl9LEVodC7JtW1vZD1hbyh7dHlwZTpFaHR9KSxFaHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxWSixTaHQsRGh0XV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEVodCxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbdGd0XSxleHBvcnRzOlt0Z3RdLGltcG9ydHM6W1dNLFZKLFNodCxEaHRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oRWh0LHtkZWNsYXJhdGlvbnM6W3RndF0saW1wb3J0czpbV00sVkosU2h0LERodF0sZXhwb3J0czpbdGd0XX0pO2NsYXNzIFJodHt9Umh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxSaHQpfSxSaHQuybVtb2Q9YW8oe3R5cGU6Umh0fSksUmh0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV01dXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUmh0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOlt6Ml0sZXhwb3J0czpbejJdLGltcG9ydHM6W1dNXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFJodCx7ZGVjbGFyYXRpb25zOlt6Ml0saW1wb3J0czpbV01dLGV4cG9ydHM6W3oyXX0pO2NsYXNzIEFodHt9QWh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxBaHQpfSxBaHQuybVtb2Q9YW8oe3R5cGU6QWh0fSksQWh0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV01dXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQWh0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltMMixGMl0sZXhwb3J0czpbTDJdLGltcG9ydHM6W1dNXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKEFodCx7ZGVjbGFyYXRpb25zOltMMixGMl0saW1wb3J0czpbV01dLGV4cG9ydHM6W0wyXX0pO2NsYXNzIFRodHt9VGh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxUaHQpfSxUaHQuybVtb2Q9YW8oe3R5cGU6VGh0fSksVGh0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV00sRVddXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoVGh0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltnZnRdLGV4cG9ydHM6W2dmdF0saW1wb3J0czpbV00sRVddfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oVGh0LHtkZWNsYXJhdGlvbnM6W2dmdF0saW1wb3J0czpbV00sRVddLGV4cG9ydHM6W2dmdF19KTtjbGFzcyBOaHR7fU5odC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8Tmh0KX0sTmh0Lsm1bW9kPWFvKHt0eXBlOk5odH0pLE5odC7JtWluaj12bih7aW1wb3J0czpbW1dNLEVodCxKSCxFVyxpMSxBaHQsUmh0LFRodF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChOaHQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W21ndCxwZ3RdLGV4cG9ydHM6W21ndF0saW1wb3J0czpbV00sRWh0LEpILEVXLGkxLEFodCxSaHQsVGh0XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKE5odCx7ZGVjbGFyYXRpb25zOlttZ3QscGd0XSxpbXBvcnRzOltXTSxFaHQsSkgsRVcsaTEsQWh0LFJodCxUaHRdLGV4cG9ydHM6W21ndF19KTtjbGFzcyB6aHR7fXpodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8emh0KX0semh0Lsm1bW9kPWFvKHt0eXBlOnpodH0pLHpodC7JtWluaj12bih7aW1wb3J0czpbW1dNLEpILEVXLGkxLHpYLEFodCxSaHRdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoemh0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltYMixaMl0sZXhwb3J0czpbWDJdLGltcG9ydHM6W1dNLEpILEVXLGkxLHpYLEFodCxSaHRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oemh0LHtkZWNsYXJhdGlvbnM6W1gyLFoyXSxpbXBvcnRzOltXTSxKSCxFVyxpMSx6WCxBaHQsUmh0XSxleHBvcnRzOltYMl19KTtjbGFzcyBJaHR7fUlodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SWh0KX0sSWh0Lsm1bW9kPWFvKHt0eXBlOklodH0pLElodC7JtWluaj12bih7aW1wb3J0czpbW1dNLHlMLEpILEVXLEJZLG9ZXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKElodCxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbWHV0LFV1dCxFdXRdLGV4cG9ydHM6W1h1dCxVdXQsRXV0XSxpbXBvcnRzOltXTSx5TCxKSCxFVyxCWSxvWV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhJaHQse2RlY2xhcmF0aW9uczpbWHV0LFV1dCxFdXRdLGltcG9ydHM6W1dNLHlMLEpILEVXLEJZLG9ZXSxleHBvcnRzOltYdXQsVXV0LEV1dF19KTtjbGFzcyBIaHR7fUhodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SGh0KX0sSGh0Lsm1bW9kPWFvKHt0eXBlOkhodH0pLEhodC7JtWluaj12bih7aW1wb3J0czpbW1dNLHlMLElodCxWSl1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChIaHQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W2ZmdF0sZXhwb3J0czpbZmZ0XSxpbXBvcnRzOltXTSx5TCxJaHQsVkpdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oSGh0LHtkZWNsYXJhdGlvbnM6W2ZmdF0saW1wb3J0czpbV00seUwsSWh0LFZKXSxleHBvcnRzOltmZnRdfSk7Y2xhc3MgRmh0e31GaHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEZodCl9LEZodC7JtW1vZD1hbyh7dHlwZTpGaHR9KSxGaHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxjRyxKSCxkVyxCWSxURyxlVF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChGaHQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W2w1LHM1XSxleHBvcnRzOltsNV0saW1wb3J0czpbV00sY0csSkgsZFcsQlksVEcsZVRdLGVudHJ5Q29tcG9uZW50czpbbDVdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oRmh0LHtkZWNsYXJhdGlvbnM6W2w1LHM1XSxpbXBvcnRzOltXTSxjRyxKSCxkVyxCWSxURyxlVF0sZXhwb3J0czpbbDVdfSk7Y2xhc3MgTGh0e31MaHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fExodCl9LExodC7JtW1vZD1hbyh7dHlwZTpMaHR9KSxMaHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxGaHQsU2h0LEhodCxEaHQsSkgsRVcsb1ksaTEsVkosUmh0LFRodF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChMaHQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W0lmdCxUZnRdLGV4cG9ydHM6W0lmdF0saW1wb3J0czpbV00sRmh0LFNodCxIaHQsRGh0LEpILEVXLG9ZLGkxLFZKLFJodCxUaHRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oTGh0LHtkZWNsYXJhdGlvbnM6W0lmdCxUZnRdLGltcG9ydHM6W1dNLEZodCxTaHQsSGh0LERodCxKSCxFVyxvWSxpMSxWSixSaHQsVGh0XSxleHBvcnRzOltJZnRdfSk7Y2xhc3MgQmh0e31CaHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEJodCl9LEJodC7JtW1vZD1hbyh7dHlwZTpCaHR9KSxCaHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSx6aHQsTGh0LE5odCxTaHRdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoQmh0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOlttMix5Z3QsX2d0XSxleHBvcnRzOlttMixfZ3RdLGltcG9ydHM6W1dNLHpodCxMaHQsTmh0LFNodF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhCaHQse2RlY2xhcmF0aW9uczpbbTIseWd0LF9ndF0saW1wb3J0czpbV00semh0LExodCxOaHQsU2h0XSxleHBvcnRzOlttMixfZ3RdfSk7Y2xhc3MgVmh0e31WaHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFZodCl9LFZodC7JtW1vZD1hbyh7dHlwZTpWaHR9KSxWaHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxUR11dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChWaHQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W2VodF0sZXhwb3J0czpbZWh0XSxpbXBvcnRzOltXTSxUR119XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhWaHQse2RlY2xhcmF0aW9uczpbZWh0XSxpbXBvcnRzOltXTSxUR10sZXhwb3J0czpbZWh0XX0pO2NsYXNzIGpodHt9amh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxqaHQpfSxqaHQuybVtb2Q9YW8oe3R5cGU6amh0fSksamh0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV00sVmh0LEpILFQyLFNZLEVXLFRHLHpYLHRULFBodF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChqaHQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W2xodCxyaHQsc2h0XSxleHBvcnRzOltsaHRdLGltcG9ydHM6W1dNLFZodCxKSCxUMixTWSxFVyxURyx6WCx0VCxQaHRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oamh0LHtkZWNsYXJhdGlvbnM6W2xodCxyaHQsc2h0XSxpbXBvcnRzOltXTSxWaHQsSkgsVDIsU1ksRVcsVEcselgsdFQsUGh0XSxleHBvcnRzOltsaHRdfSk7Y2xhc3MgVWh0e31VaHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFVodCl9LFVodC7JtW1vZD1hbyh7dHlwZTpVaHR9KSxVaHQuybVpbmo9dm4oe2ltcG9ydHM6W1tCaHQsV00sT2h0LFkwLEpILFQyLEVXLEJZLGkxLGpodCxfRl1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChVaHQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W1RndCxOZ3QsV2d0LFlndCxaZ3QsWGd0LFFndCwkZ3QsdWh0LGZodCx2Mix4MixMZ3QsQmd0XSxleHBvcnRzOltmaHRdLGltcG9ydHM6W0JodCxXTSxPaHQsWTAsSkgsVDIsRVcsQlksaTEsamh0LF9GXX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFVodCx7ZGVjbGFyYXRpb25zOltUZ3QsTmd0LFdndCxZZ3QsWmd0LFhndCxRZ3QsJGd0LHVodCxmaHQsdjIseDIsTGd0LEJndF0saW1wb3J0czpbQmh0LFdNLE9odCxZMCxKSCxUMixFVyxCWSxpMSxqaHQsX0ZdLGV4cG9ydHM6W2ZodF19KTtjbGFzcyBHaHR7fWZ1bmN0aW9uIFdodCgpe3JldHVyblt7YWN0aW9uQ3JlYXRvcjpvUixhbGVydEZyb21BY3Rpb246dD0+e2NvbnN0e3dhc1Bpbm5lZDplLGNhbkNyZWF0ZU5ld1BpbnM6bn09dDtyZXR1cm4gZXx8bj9udWxsOntsb2NhbGl6ZWRNZXNzYWdlOiJNYXggcGluIGxpbWl0IGV4Y2VlZGVkLiBSZW1vdmUgZXhpc3RpbmcgcGlucyBiZWZvcmUgYWRkaW5nIG1vcmUuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9pc3N1ZXMvNDI0MiJ9fX1dfWZ1bmN0aW9uIFlodCgpe3JldHVybiBadyh6VCwodD0+KHtzY2FsYXJTbW9vdGhpbmc6dH0pKSl9ZnVuY3Rpb24gcWh0KCl7cmV0dXJuIFp3KEFULCh0PT4oe2lnbm9yZU91dGxpZXJzOnR9KSkpfWZ1bmN0aW9uIFpodCgpe3JldHVybiBadyhSVCwodD0+KHt0b29sdGlwU29ydFN0cmluZzpTdHJpbmcodCl9KSkpfWZ1bmN0aW9uIFhodCgpe3JldHVybiBadyhaVCwodD0+KHt0aW1lU2VyaWVzUHJvbW90aW9uRGlzbWlzc2VkOiF0fSkpKX1mdW5jdGlvbiBLaHQoKXtyZXR1cm4gWncoWFQsKHQ9Pih7dGltZVNlcmllc1NldHRpbmdzUGFuZU9wZW5lZDp0fSkpKX1HaHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEdodCl9LEdodC7JtW1vZD1hbyh7dHlwZTpHaHR9KSxHaHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSx4aHQsdmh0LFVodCxFVyxqaHQsa2h0XV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEdodCxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbTWh0LHlodCxfaHRdLGV4cG9ydHM6W01odF0saW1wb3J0czpbV00seGh0LHZodCxVaHQsRVcsamh0LGtodF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhHaHQse2RlY2xhcmF0aW9uczpbTWh0LHlodCxfaHRdLGltcG9ydHM6W1dNLHhodCx2aHQsVWh0LEVXLGpodCxraHRdLGV4cG9ydHM6W01odF19KTtjbGFzcyBKaHR7fUpodC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8Smh0KX0sSmh0Lsm1bW9kPWFvKHt0eXBlOkpodH0pLEpodC7JtWluaj12bih7cHJvdmlkZXJzOlt7cHJvdmlkZTptUSx1c2VGYWN0b3J5OmZRLGRlcHM6W3VRXX0se3Byb3ZpZGU6dVEsdXNlVmFsdWU6cFR9XSxpbXBvcnRzOltbV00sQlMsRVIsd3EuZm9yUGx1Z2luKF9BLE1odCksZVQsR2h0LGRrLmZvckZlYXR1cmUoZFQsclEsbVEpLFdrLmZvckZlYXR1cmUoW3BRXSksQVIucmVnaXN0ZXJBbGVydEFjdGlvbnMoV2h0KSxxUy5kZWZpbmVHbG9iYWxTZXR0aW5nKFlodCkscVMuZGVmaW5lR2xvYmFsU2V0dGluZyhxaHQpLHFTLmRlZmluZUdsb2JhbFNldHRpbmcoWmh0KSxxUy5kZWZpbmVHbG9iYWxTZXR0aW5nKFhodCkscVMuZGVmaW5lR2xvYmFsU2V0dGluZyhLaHQpXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEpodCxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W1dNLEJTLEVSLHdxLmZvclBsdWdpbihfQSxNaHQpLGVULEdodCxkay5mb3JGZWF0dXJlKGRULHJRLG1RKSxXay5mb3JGZWF0dXJlKFtwUV0pLEFSLnJlZ2lzdGVyQWxlcnRBY3Rpb25zKFdodCkscVMuZGVmaW5lR2xvYmFsU2V0dGluZyhZaHQpLHFTLmRlZmluZUdsb2JhbFNldHRpbmcocWh0KSxxUy5kZWZpbmVHbG9iYWxTZXR0aW5nKFpodCkscVMuZGVmaW5lR2xvYmFsU2V0dGluZyhYaHQpLHFTLmRlZmluZUdsb2JhbFNldHRpbmcoS2h0KV0scHJvdmlkZXJzOlt7cHJvdmlkZTptUSx1c2VGYWN0b3J5OmZRLGRlcHM6W3VRXX0se3Byb3ZpZGU6dVEsdXNlVmFsdWU6cFR9XSxlbnRyeUNvbXBvbmVudHM6W01odF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhKaHQse2ltcG9ydHM6W1dNLEJTLEVSLHdxLGVULEdodCxjayxHayxBUixxUyxxUyxxUyxxUyxxU119KTtjb25zdCBRaHQ9Im5wbWkiO3ZhciAkaHQsdGJ0LGVidCxuYnQ7IShmdW5jdGlvbih0KXt0W3QuQU5EPTBdPSJBTkQifSkoJGh0fHwoJGh0PXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5NRVRSSUM9MF09Ik1FVFJJQyIsdFt0Lk9QRVJBVE9SPTFdPSJPUEVSQVRPUiJ9KSh0YnR8fCh0YnQ9e30pKSwoZnVuY3Rpb24odCl7dFt0LkRFRkFVTFQ9MF09IkRFRkFVTFQiLHRbdC5FTUJFRERJTkdTPTFdPSJFTUJFRERJTkdTIn0pKGVidHx8KGVidD17fSkpLChmdW5jdGlvbih0KXt0W3QuREVTQ0VORElORz0wXT0iREVTQ0VORElORyIsdFt0LkFTQ0VORE5HPTFdPSJBU0NFTkRORyIsdFt0LlNJTUlMQVI9Ml09IlNJTUlMQVIiLHRbdC5ESVNTSU1JTEFSPTNdPSJESVNTSU1JTEFSIn0pKG5idHx8KG5idD17fSkpO2NsYXNzIG9idHt9b2J0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxvYnQpfSxvYnQuybVjbXA9dG8oe3R5cGU6b2J0LHNlbGVjdG9yczpbWyJucG1pLWluYWN0aXZlLXZpZXciXV0sZGVjbHM6Nix2YXJzOjAsY29uc3RzOltbMSwiY29udGFpbmVyIl0sWzEsInRpdGxlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJkaXYiKSxSbSgxLCJkaXYiLDApLFJtKDIsImRpdiIsMSksa3UoMywiblBNSSBpcyBpbmFjdGl2ZSBiZWNhdXNlIG5vIGRhdGEgaXMgYXZhaWxhYmxlLiIpLEFtKCksUm0oNCwiZGl2Iiksa3UoNSwiIFRvIHVzZSB0aGUgblBNSSwgY2FsY3VsYXRlIG5QTUkgdmFsdWVzLCBhbmQgbG9nIHRoZW0gdXNpbmcgdGhlIHN1bW1hcnkgd3JpdGVyLiAiKSxBbSgpLEFtKCksQW0oKSl9LHN0eWxlczpbIi5jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBmb250LWZhbWlseTogUm9ib3RvO1xuICBmb250LXNpemU6IDE1cHg7XG4gIHBhZGRpbmc6IDUwcHg7XG59XG5cbi50aXRsZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBmb250LXNpemU6IDEzNSU7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBtYXJnaW4tYm90dG9tOiAyNXB4O1xufSJdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChvYnQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibnBtaS1pbmFjdGl2ZS12aWV3Iix0ZW1wbGF0ZVVybDoiLi9pbmFjdGl2ZV9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9pbmFjdGl2ZV9jb21wb25lbnQuY3NzIl19XX1dLG51bGwsbnVsbCk7Y29uc3QgaWJ0PUt3KFFodCksYWJ0PVp3KGlidCwodD0+dC5wbHVnaW5EYXRhTG9hZGVkLnN0YXRlKSkscmJ0PVp3KGlidCwodD0+dC5hbm5vdGF0aW9uRGF0YSkpLHNidD1adyhpYnQsKHQ9PnQucnVuVG9NZXRyaWNzKSksbGJ0PVp3KGlidCwodD0+dC5lbWJlZGRpbmdEYXRhU2V0KSksY2J0PVp3KGlidCwodD0+dC5zZWxlY3RlZEFubm90YXRpb25zKSksZGJ0PVp3KGlidCwodD0+dC5mbGFnZ2VkQW5ub3RhdGlvbnMpKSxwYnQ9WncoaWJ0LCh0PT50LmhpZGRlbkFubm90YXRpb25zKSksbWJ0PVp3KGlidCwodD0+dC5hbm5vdGF0aW9uc1JlZ2V4KSksdWJ0PVp3KGlidCwodD0+dC5tZXRyaWNzUmVnZXgpKSxmYnQ9WncoaWJ0LCh0PT50Lm1ldHJpY0FyaXRobWV0aWMpKSxnYnQ9WncoaWJ0LCh0PT50Lm1ldHJpY0ZpbHRlcnMpKSxoYnQ9WncoaWJ0LCh0PT50LnNvcnQpKSxiYnQ9WncoaWJ0LCh0PT50LnBjRXhwYW5kZWQpKSx5YnQ9WncoaWJ0LCh0PT50LmFubm90YXRpb25zRXhwYW5kZWQpKSxfYnQ9WncoaWJ0LCh0PT50LnNpZGViYXJFeHBhbmRlZCkpLENidD1adyhpYnQsKHQ9PnQuc2hvd0NvdW50cykpLE1idD1adyhpYnQsKHQ9PnQuc2hvd0hpZGRlbkFubm90YXRpb25zKSksdmJ0PVp3KGlidCwodD0+dC52aWV3QWN0aXZlKSkseGJ0PVp3KGlidCwodD0+dC5zaWRlYmFyV2lkdGgpKSxPYnQ9WncoaWJ0LCh0PT50LmVtYmVkZGluZ3NNZXRyaWMpKSxQYnQ9WncoaWJ0LCh0PT50LmVtYmVkZGluZ3NTaWRlYmFyV2lkdGgpKSx3YnQ9WncoaWJ0LCh0PT50LmVtYmVkZGluZ3NTaWRlYmFyRXhwYW5kZWQpKSxrYnQ9SlAoIltOUE1JXSBuUE1JIExvYWRlZCIpLFNidD1KUCgiW05QTUldIG5QTUkgUGx1Z2luIERhdGEgUmVxdWVzdGVkIiksRGJ0PUpQKCJbTlBNSV0gblBNSSBQbHVnaW4gRGF0YSBMb2FkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxFYnQ9SlAoIltOUE1JXSBuUE1JIFBsdWdpbiBEYXRhIFJlcXVlc3QgRmFpbGVkIiksUmJ0PUpQKCJbTlBNSV0gQWRkaW5nL1JlbW92aW5nIEFubm90YXRpb25zIHRvL2Zyb20gU2VsZWN0ZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxBYnQ9SlAoIltOUE1JXSBBbm5vdGF0aW9ucyBTZXQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxUYnQ9SlAoIltOUE1JXSBDbGVhcmluZyB0aGUgQW5ub3RhdGlvbiBTZWxlY3Rpb24iKSxOYnQ9SlAoIltOUE1JXSBBZGRpbmcvUmVtb3ZpbmcgQW5ub3RhdGlvbnMgdG8vZnJvbSBGbGFnZ2VkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksemJ0PUpQKCJbTlBNSV0gQWRkaW5nL1JlbW92aW5nIEFubm90YXRpb25zIHRvL2Zyb20gSGlkZGVuIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksSWJ0PUpQKCJbTlBNSV0gQW5ub3RhdGlvbnMgUmVnZXggQ2hhbmdlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLEhidD1KUCgiW05QTUldIE1ldHJpY3MgUmVnZXggQ2hhbmdlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLEZidD1KUCgiW05QTUldIE1ldHJpYyBGaWx0ZXIgQWRkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxMYnQ9SlAoIltOUE1JXSBNZXRyaWMgRmlsdGVyIFJlbW92ZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxCYnQ9SlAoIltOUE1JXSBNZXRyaWMgRmlsdGVyIENoYW5nZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxWYnQ9SlAoIltOUE1JXSBBbm5vdGF0aW9uIFNvcnQgQ2hhbmdlZCIse19hczoicHJvcHMiLF9wOnZvaWQgMH0pLGpidD1KUCgiW05QTUldIFNpbWlsYXJpdHkgU29ydCBDaGFuZ2VkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksVWJ0PUpQKCJbTlBNSV0gVG9nZ2xlIFBDIEV4cGFuZGVkIiksR2J0PUpQKCJbTlBNSV0gVG9nZ2xlIEFubm90YXRpb25zIEV4cGFuZGVkIiksV2J0PUpQKCJbTlBNSV0gVG9nZ2xlIFNpZGViYXIgRXhwYW5kZWQiKSxZYnQ9SlAoIltOUE1JXSBTaG93IENvdW50cyBUb2dnbGVkIikscWJ0PUpQKCJbTlBNSV0gU2hvdyBIaWRkZW4gQW5ub3RhdGlvbnMgVG9nZ2xlZCIpLFpidD1KUCgiW05QTUldIEVtYmVkZGluZ3MgVmlldyBUb2dnbGVkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksWGJ0PUpQKCJbTlBNSV0gU2lkZWJhciBXaWR0aCBDaGFuZ2VkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSksS2J0PUpQKCJbTlBNSV0gRW1iZWRkaW5ncyBTaWRlYmFyIFdpZHRoIENoYW5nZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxKYnQ9SlAoIltOUE1JXSBUb2dnbGUgRW1iZWRkaW5ncyBTaWRlYmFyIEV4cGFuZGVkIiksUWJ0PUpQKCJbTlBNSV0gQ2hhbmdlIEVtYmVkZGluZyBEYXRhU2V0Iix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSk7ZnVuY3Rpb24gJGJ0KHQpe3JldHVybiB0LnN0YXJ0c1dpdGgoImNvdW50QCIpfWZ1bmN0aW9uIHR5dCh0KXtyZXR1cm4gdC5zdGFydHNXaXRoKCJuUE1JQCIpfHx0LnN0YXJ0c1dpdGgoIm5QTUlfZGlmZkAiKX1mdW5jdGlvbiBleXQodCl7cmV0dXJuIHQuc3RhcnRzV2l0aCgiblBNSUAiKX1mdW5jdGlvbiBueXQodCl7cmV0dXJuIHQuc3BsaXQoIkAiLDIpWzFdfWNvbnN0IG95dD15ayh7cGx1Z2luRGF0YUxvYWRlZDp7c3RhdGU6eUUuTk9UX0xPQURFRCxsYXN0TG9hZGVkVGltZUluTXM6bnVsbH0sYW5ub3RhdGlvbkRhdGE6e30scnVuVG9NZXRyaWNzOnt9LHNlbGVjdGVkQW5ub3RhdGlvbnM6W10sZmxhZ2dlZEFubm90YXRpb25zOltdLGhpZGRlbkFubm90YXRpb25zOltdLGFubm90YXRpb25zUmVnZXg6IiIsbWV0cmljc1JlZ2V4OiIiLG1ldHJpY0FyaXRobWV0aWM6W10sbWV0cmljRmlsdGVyczp7fSxzb3J0OnttZXRyaWM6IiIsb3JkZXI6bmJ0LkRFU0NFTkRJTkd9LHBjRXhwYW5kZWQ6ITAsYW5ub3RhdGlvbnNFeHBhbmRlZDohMCxzaWRlYmFyRXhwYW5kZWQ6ITAsc2hvd0NvdW50czohMCxzaG93SGlkZGVuQW5ub3RhdGlvbnM6ITEsc2lkZWJhcldpZHRoOjMwMCx2aWV3QWN0aXZlOmVidC5ERUZBVUxULGVtYmVkZGluZ3NNZXRyaWM6IiIsZW1iZWRkaW5nc1NpZGViYXJXaWR0aDo1MDAsZW1iZWRkaW5nc1NpZGViYXJFeHBhbmRlZDohMH0sYmsoU2J0LCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3BsdWdpbkRhdGFMb2FkZWQ6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQucGx1Z2luRGF0YUxvYWRlZCkse3N0YXRlOnlFLkxPQURJTkd9KX0pKSksYmsoRWJ0LCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3BsdWdpbkRhdGFMb2FkZWQ6T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQucGx1Z2luRGF0YUxvYWRlZCkse3N0YXRlOnlFLkZBSUxFRH0pfSkpKSxiayhEYnQsKCh0LHthbm5vdGF0aW9uRGF0YTplLG1ldHJpY3M6bixlbWJlZGRpbmdEYXRhU2V0Om99KT0+e2NvbnN0IGk9e307Zm9yKGNvbnN0IHQgaW4gbil7aVt0XT1bXTtmb3IoY29uc3QgZSBvZiBuW3RdKXR5dChlKSYmaVt0XS5wdXNoKGUpfXJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3J1blRvTWV0cmljczppLGFubm90YXRpb25EYXRhOmUsZW1iZWRkaW5nRGF0YVNldDpvLHBsdWdpbkRhdGFMb2FkZWQ6e3N0YXRlOnlFLkxPQURFRCxsYXN0TG9hZGVkVGltZUluTXM6RGF0ZS5ub3coKX19KX0pKSxiayhSYnQsKCh0LHthbm5vdGF0aW9uczplfSk9Pntjb25zdCBuPW5ldyBTZXQoWy4uLnQuc2VsZWN0ZWRBbm5vdGF0aW9ucywuLi5lXSk7aWYobi5zaXplPT09dC5zZWxlY3RlZEFubm90YXRpb25zLmxlbmd0aClmb3IoY29uc3QgdCBvZiBlKW4uZGVsZXRlKHQpO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NlbGVjdGVkQW5ub3RhdGlvbnM6Wy4uLm5dfSl9KSksYmsoQWJ0LCgodCx7YW5ub3RhdGlvbnM6ZX0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NlbGVjdGVkQW5ub3RhdGlvbnM6ZX0pKSksYmsoVGJ0LCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NlbGVjdGVkQW5ub3RhdGlvbnM6W119KSkpLGJrKE5idCwoKHQse2Fubm90YXRpb25zOmV9KT0+e2NvbnN0IG49bmV3IFNldChbLi4udC5mbGFnZ2VkQW5ub3RhdGlvbnMsLi4uZV0pO2lmKG4uc2l6ZT09PXQuZmxhZ2dlZEFubm90YXRpb25zLmxlbmd0aClmb3IoY29uc3QgdCBvZiBlKW4uZGVsZXRlKHQpO3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2ZsYWdnZWRBbm5vdGF0aW9uczpbLi4ubl0sc2VsZWN0ZWRBbm5vdGF0aW9uczpbXX0pfSkpLGJrKHpidCwoKHQse2Fubm90YXRpb25zOmV9KT0+e2NvbnN0IG49bmV3IFNldChbLi4udC5oaWRkZW5Bbm5vdGF0aW9ucywuLi5lXSk7aWYobi5zaXplPT09dC5oaWRkZW5Bbm5vdGF0aW9ucy5sZW5ndGgpZm9yKGNvbnN0IHQgb2YgZSluLmRlbGV0ZSh0KTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtoaWRkZW5Bbm5vdGF0aW9uczpbLi4ubl0sc2VsZWN0ZWRBbm5vdGF0aW9uczpbXX0pfSkpLGJrKElidCwoKHQse3JlZ2V4OmV9KT0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHthbm5vdGF0aW9uc1JlZ2V4OmV9KSkpLGJrKEhidCwoKHQse3JlZ2V4OmV9KT0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHttZXRyaWNzUmVnZXg6ZX0pKSksYmsoRmJ0LCgodCx7bWV0cmljOmV9KT0+e2lmKHQubWV0cmljRmlsdGVyc1tlXSlyZXR1cm4gdDtjb25zdCBuPVtdO3JldHVybiAwIT09dC5tZXRyaWNBcml0aG1ldGljLmxlbmd0aCYmbi5wdXNoKHtraW5kOnRidC5PUEVSQVRPUixvcGVyYXRvcjokaHQuQU5EfSksbi5wdXNoKHtraW5kOnRidC5NRVRSSUMsbWV0cmljOmV9KSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse21ldHJpY0FyaXRobWV0aWM6Wy4uLnQubWV0cmljQXJpdGhtZXRpYywuLi5uXSxtZXRyaWNGaWx0ZXJzOk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0Lm1ldHJpY0ZpbHRlcnMpLHtbZV06e21heDoxLG1pbjotMSxpbmNsdWRlTmFOOiExfX0pLHNvcnQ6e21ldHJpYzplLG9yZGVyOm5idC5ERVNDRU5ESU5HfX0pfSkpLGJrKExidCwoKHQse21ldHJpYzplfSk9PntpZighdC5tZXRyaWNGaWx0ZXJzW2VdKXJldHVybiB0O2xldCBuPTAsbz0wLGk9Mjtjb25zdCBhPWZBKHQubWV0cmljRmlsdGVycyxbInN5bWJvbCI9PXR5cGVvZiBlP2U6ZSsiIl0pO2Zvcihjb25zdCBvIGluIHQubWV0cmljQXJpdGhtZXRpYyl7Y29uc3QgaT10Lm1ldHJpY0FyaXRobWV0aWNbb107aS5raW5kPT09dGJ0Lk1FVFJJQyYmaS5tZXRyaWM9PT1lJiYobj1wYXJzZUludChvKSl9cmV0dXJuIDAhPT1uJiYobz1uLTEsaT1uKzEpLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7bWV0cmljQXJpdGhtZXRpYzpbLi4udC5tZXRyaWNBcml0aG1ldGljLnNsaWNlKDAsbyksLi4udC5tZXRyaWNBcml0aG1ldGljLnNsaWNlKGkpXSxtZXRyaWNGaWx0ZXJzOmF9KX0pKSxiayhCYnQsKCh0LHttZXRyaWM6ZSxtYXg6bixtaW46byxpbmNsdWRlTmFOOml9KT0+dC5tZXRyaWNGaWx0ZXJzW2VdP09iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7bWV0cmljRmlsdGVyczpPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5tZXRyaWNGaWx0ZXJzKSx7W2VdOnttYXg6bixtaW46byxpbmNsdWRlTmFOOml9fSl9KTp0KSksYmsoVmJ0LCgodCx7bWV0cmljOmV9KT0+e2NvbnN0IG49e21ldHJpYzplLG9yZGVyOm5idC5ERVNDRU5ESU5HfTtyZXR1cm4gdC5zb3J0Lm1ldHJpYz09PWUmJnQuc29ydC5vcmRlcj09PW5idC5ERVNDRU5ESU5HJiYobi5vcmRlcj1uYnQuQVNDRU5ETkcpLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7c29ydDpufSl9KSksYmsoamJ0LCgodCx7YW5ub3RhdGlvbjplfSk9Pntjb25zdCBuPXttZXRyaWM6ZSxvcmRlcjpuYnQuU0lNSUxBUn07cmV0dXJuIHQuc29ydC5tZXRyaWM9PT1lJiZ0LnNvcnQub3JkZXI9PT1uYnQuU0lNSUxBUiYmKG4ub3JkZXI9bmJ0LkRJU1NJTUlMQVIpLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7c29ydDpufSl9KSksYmsoVWJ0LCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3BjRXhwYW5kZWQ6IXQucGNFeHBhbmRlZH0pKSksYmsoR2J0LCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2Fubm90YXRpb25zRXhwYW5kZWQ6IXQuYW5ub3RhdGlvbnNFeHBhbmRlZH0pKSksYmsoV2J0LCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NpZGViYXJFeHBhbmRlZDohdC5zaWRlYmFyRXhwYW5kZWR9KSkpLGJrKFlidCwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzaG93Q291bnRzOiF0LnNob3dDb3VudHN9KSkpLGJrKHFidCwodD0+T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtzaG93SGlkZGVuQW5ub3RhdGlvbnM6IXQuc2hvd0hpZGRlbkFubm90YXRpb25zfSkpKSxiayhaYnQsKCh0LHttZXRyaWM6ZX0pPT57bGV0IG49ZWJ0LkVNQkVERElOR1Msbz1lO3JldHVybiBlPT09dC5lbWJlZGRpbmdzTWV0cmljJiYobj1lYnQuREVGQVVMVCxvPSIiKSxPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3ZpZXdBY3RpdmU6bixlbWJlZGRpbmdzTWV0cmljOm99KX0pKSxiayhYYnQsKCh0LHtzaWRlYmFyV2lkdGg6ZX0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse3NpZGViYXJXaWR0aDplfSkpKSxiayhLYnQsKCh0LHtzaWRlYmFyV2lkdGg6ZX0pPT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2VtYmVkZGluZ3NTaWRlYmFyV2lkdGg6ZX0pKSksYmsoSmJ0LCh0PT5PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2VtYmVkZGluZ3NTaWRlYmFyRXhwYW5kZWQ6IXQuZW1iZWRkaW5nc1NpZGViYXJFeHBhbmRlZH0pKSksYmsoUWJ0LCgodCx7ZGF0YVNldDplfSk9Pk9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0KSx7ZW1iZWRkaW5nRGF0YVNldDplfSkpKSk7ZnVuY3Rpb24gaXl0KHQsZSl7cmV0dXJuIG95dCh0LGUpfWZ1bmN0aW9uIGF5dCh0LGUpezEmdCYmVG0oMCwibWF0LWljb24iLDcpfWZ1bmN0aW9uIHJ5dCh0LGUpe2lmKDEmdCYmKFJtKDAsIm1hdC1vcHRpb24iLDgpLGt1KDEpLEFtKCkpLDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdDtEbSgidmFsdWUiLHQpLHJjKDEpLFN1KHQpfX1jbGFzcyBzeXR7Y29uc3RydWN0b3IoKXt0aGlzLm9uUmVnZXhGaWx0ZXJWYWx1ZUNoYW5nZT1uZXcgTGgsdGhpcy5vbkFkZEZpbHRlcj1uZXcgTGh9b25PcHRpb25TZWxlY3RlZCh0LGUpe3RoaXMub25BZGRGaWx0ZXIuZW1pdCh0Lm9wdGlvbi52YWx1ZSksZS52YWx1ZT0iIn19c3l0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxzeXQpfSxzeXQuybVjbXA9dG8oe3R5cGU6c3l0LHNlbGVjdG9yczpbWyJtZXRyaWMtc2VhcmNoLWNvbXBvbmVudCJdXSxob3N0VmFyczoyLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZwdSgidmFsaWQiLG4uaXNSZWdleEZpbHRlclZhbGlkKX0saW5wdXRzOntjb21wbGV0aW9uczoiY29tcGxldGlvbnMiLHJlZ2V4RmlsdGVyVmFsdWU6InJlZ2V4RmlsdGVyVmFsdWUiLGlzUmVnZXhGaWx0ZXJWYWxpZDoiaXNSZWdleEZpbHRlclZhbGlkIn0sb3V0cHV0czp7b25SZWdleEZpbHRlclZhbHVlQ2hhbmdlOiJvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UiLG9uQWRkRmlsdGVyOiJvbkFkZEZpbHRlciJ9LGRlY2xzOjcsdmFyczo0LGNvbnN0czpbWyJzdmdJY29uIiwic2VhcmNoXzI0cHgiXSxbIm1hdElucHV0IiwiIiwiYXV0b2NvbXBsZXRlIiwib2ZmIiwicGxhY2Vob2xkZXIiLCJBZGQgTWV0cmljIEZpbHRlciIsMywidmFsdWUiLCJtYXRBdXRvY29tcGxldGUiLCJpbnB1dCJdLFsibWF0SW5wdXQiLCIiXSxbInN2Z0ljb24iLCJlcnJvcl8yNHB4IiwiY2xhc3MiLCJlcnJvci1pY29uIiwibWF0VG9vbHRpcCIsIkludmFsaWQgcmVnZXggZmlsdGVyLiBUaGUgcmVzdWx0IG1heSBiZSBzdGFsZS4iLDQsIm5nSWYiXSxbImF1dG9BY3RpdmVGaXJzdE9wdGlvbiIsIiIsMywib3B0aW9uU2VsZWN0ZWQiXSxbImZpbHRlck1hdGNoZXMiLCJtYXRBdXRvY29tcGxldGUiXSxbMywidmFsdWUiLDQsIm5nRm9yIiwibmdGb3JPZiJdLFsic3ZnSWNvbiIsImVycm9yXzI0cHgiLCJtYXRUb29sdGlwIiwiSW52YWxpZCByZWdleCBmaWx0ZXIuIFRoZSByZXN1bHQgbWF5IGJlIHN0YWxlLiIsMSwiZXJyb3ItaWNvbiJdLFszLCJ2YWx1ZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlKXtjb25zdCB0PUhtKCk7VG0oMCwibWF0LWljb24iLDApLFJtKDEsImlucHV0IiwxLDIpLFZtKCJpbnB1dCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25SZWdleEZpbHRlclZhbHVlQ2hhbmdlLmVtaXQoZS50YXJnZXQudmFsdWUpfSkpLEFtKCksUXAoMyxheXQsMSwwLCJtYXQtaWNvbiIsMyksUm0oNCwibWF0LWF1dG9jb21wbGV0ZSIsNCw1KSxWbSgib3B0aW9uU2VsZWN0ZWQiLChmdW5jdGlvbiBlKG8pe2hpKHQpO2NvbnN0IGk9JHAoMik7cmV0dXJuIG4ub25PcHRpb25TZWxlY3RlZChvLGkpfSkpLFFwKDYscnl0LDIsMiwibWF0LW9wdGlvbiIsNiksQW0oKX1pZigyJmUpe2NvbnN0IHQ9JHAoNSk7cmMoMSksRG0oInZhbHVlIixuLnJlZ2V4RmlsdGVyVmFsdWUpKCJtYXRBdXRvY29tcGxldGUiLHQpLHJjKDIpLERtKCJuZ0lmIiwhbi5pc1JlZ2V4RmlsdGVyVmFsaWQpLHJjKDMpLERtKCJuZ0Zvck9mIixuLmNvbXBsZXRpb25zKX19LGRpcmVjdGl2ZXM6W0RXLExZLFcwLGRNLEgwLGxNLEJIXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17ZmxleDpub25lO21hcmdpbi1yaWdodDo1cHh9W19uZ2hvc3QtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cGFkZGluZzowIDEwcHg7cG9zaXRpb246cmVsYXRpdmU7Zm9udC1zaXplOi45ZW19W19uZ2hvc3QtJUNPTVAlXTpub3QoLnZhbGlkKXtjb2xvcjojYzYyODI4fVtfbmdob3N0LSVDT01QJV06bm90KC52YWxpZCkgICBpbnB1dFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6Y3VycmVudENvbG9yfSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChzeXQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWV0cmljLXNlYXJjaC1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiIuL21ldHJpY19zZWFyY2hfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vbWV0cmljX3NlYXJjaF9jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7Y29tcGxldGlvbnM6W3t0eXBlOnh5fV0scmVnZXhGaWx0ZXJWYWx1ZTpbe3R5cGU6eHl9XSxpc1JlZ2V4RmlsdGVyVmFsaWQ6W3t0eXBlOlB5LGFyZ3M6WyJjbGFzcy52YWxpZCJdfSx7dHlwZTp4eX1dLG9uUmVnZXhGaWx0ZXJWYWx1ZUNoYW5nZTpbe3R5cGU6T3l9XSxvbkFkZEZpbHRlcjpbe3R5cGU6T3l9XX0pO2NsYXNzIGx5dHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5tZXRyaWNzUmVnZXgkPXRoaXMuc3RvcmUuc2VsZWN0KHVidCksdGhpcy5hY3RpdmVSdW5zJD10aGlzLnN0b3JlLnBpcGUoRncoTk4pKS5waXBlKEl0KCh0PT50P0FycmF5LmZyb20odC5lbnRyaWVzKCkpLmZpbHRlcigodD0+dFsxXSkpLm1hcCgodD0+dFswXSkpOltdKSkpLHRoaXMubWV0cmljc0ZvckFjdGl2ZVJ1bnMkPVd0KHRoaXMuYWN0aXZlUnVucyQsdGhpcy5zdG9yZS5zZWxlY3Qoc2J0KSkucGlwZShJdCgoKFt0LGVdKT0+e2NvbnN0IG49bmV3IFNldDtmb3IoY29uc3QgbyBvZiB0KWlmKGVbb10pZm9yKGNvbnN0IHQgb2YgZVtvXSluLmFkZCh0KTtyZXR1cm5bLi4ubl19KSkpLHRoaXMuaXNNZXRyaWNzRmlsdGVyVmFsaWQkPXRoaXMubWV0cmljc1JlZ2V4JC5waXBlKEl0KCh0PT57dHJ5e3JldHVybiBCb29sZWFuKG5ldyBSZWdFeHAodCkpfWNhdGNoKHQpe3JldHVybiExfX0pKSksdGhpcy5tZXRyaWNGaWx0ZXJLZXlzJD10aGlzLnN0b3JlLnBpcGUoRncoZ2J0KSkucGlwZShJdCgodD0+T2JqZWN0LmtleXModCkpKSksdGhpcy5jb21wbGV0aW9ucyQ9V3QodGhpcy5tZXRyaWNzRm9yQWN0aXZlUnVucyQsdGhpcy5tZXRyaWNzUmVnZXgkLHRoaXMubWV0cmljRmlsdGVyS2V5cyQpLnBpcGUoSXQoKChbdCxlLG5dKT0+e2NvbnN0IG89dC5maWx0ZXIoKHQ9PiFuLmluY2x1ZGVzKHQpKSk7dHJ5e2NvbnN0IHQ9bmV3IFJlZ0V4cChlLCJpIik7cmV0dXJuIG8uZmlsdGVyKChlPT50LnRlc3QoZSkpKS5zb3J0KCl9Y2F0Y2godCl7cmV0dXJuW119fSkpKX1vbkZpbHRlckNoYW5nZSh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKEhidCh7cmVnZXg6dH0pKX1vbkFkZEZpbHRlcih0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKEZidCh7bWV0cmljOnR9KSksdGhpcy5zdG9yZS5kaXNwYXRjaChIYnQoe3JlZ2V4OiIifSkpfX1mdW5jdGlvbiBjeXQodCxlLG4pe2NvbnN0IG89W1tlLC4uLm5dXTtpZighbi5sZW5ndGh8fCF0Lmxlbmd0aClyZXR1cm4iZGF0YTp0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04LCIrby5tYXAoKHQ9PnQuam9pbigiLCIpKSkuam9pbigiXG4iKTtjb25zdCBpPW4ubWFwKCh0PT5ueXQodCkpKTtmb3IoY29uc3RbbixhXW9mIHQpe2NvbnN0IHQ9YS5maWx0ZXIoKHQ9PnQucnVuPT09ZSkpO2lmKHQubGVuZ3RoKXtjb25zdCBlPVtuXTtmb3IoY29uc3QgbiBvZiBpKXtjb25zdCBvPXQuZmluZCgodD0+dC5tZXRyaWM9PT1uKSk7ZS5wdXNoKHZvaWQgMD09PW8/Im51bGwiOmAke28ublBNSVZhbHVlfWApfW8ucHVzaChlKX19cmV0dXJuImRhdGE6dGV4dC9jc3Y7Y2hhcnNldD11dGYtOCwiK28ubWFwKCh0PT50LmpvaW4oIiwiKSkpLmpvaW4oIlxuIil9bHl0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxseXQpKFNtKEl3KSl9LGx5dC7JtWNtcD10byh7dHlwZTpseXQsc2VsZWN0b3JzOltbIm5wbWktbWV0cmljLXNlYXJjaCJdXSxkZWNsczo0LHZhcnM6OSxjb25zdHM6W1szLCJyZWdleEZpbHRlclZhbHVlIiwiY29tcGxldGlvbnMiLCJpc1JlZ2V4RmlsdGVyVmFsaWQiLCJvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UiLCJvbkFkZEZpbHRlciJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwibWV0cmljLXNlYXJjaC1jb21wb25lbnQiLDApLFZtKCJvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uRmlsdGVyQ2hhbmdlKGUpfSkpKCJvbkFkZEZpbHRlciIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ub25BZGRGaWx0ZXIoZSl9KSksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQW0oKSksMiZlJiZEbSgicmVnZXhGaWx0ZXJWYWx1ZSIsVGgoMSwzLG4ubWV0cmljc1JlZ2V4JCkpKCJjb21wbGV0aW9ucyIsVGgoMiw1LG4uY29tcGxldGlvbnMkKSkoImlzUmVnZXhGaWx0ZXJWYWxpZCIsVGgoMyw3LG4uaXNNZXRyaWNzRmlsdGVyVmFsaWQkKSl9LGRpcmVjdGl2ZXM6W3N5dF0scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGx5dCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJucG1pLW1ldHJpYy1zZWFyY2giLHRlbXBsYXRlOidcbiAgICA8bWV0cmljLXNlYXJjaC1jb21wb25lbnRcbiAgICAgIFtyZWdleEZpbHRlclZhbHVlXT0ibWV0cmljc1JlZ2V4JCB8IGFzeW5jIlxuICAgICAgW2NvbXBsZXRpb25zXT0iY29tcGxldGlvbnMkIHwgYXN5bmMiXG4gICAgICBbaXNSZWdleEZpbHRlclZhbGlkXT0iaXNNZXRyaWNzRmlsdGVyVmFsaWQkIHwgYXN5bmMiXG4gICAgICAob25SZWdleEZpbHRlclZhbHVlQ2hhbmdlKT0ib25GaWx0ZXJDaGFuZ2UoJGV2ZW50KSJcbiAgICAgIChvbkFkZEZpbHRlcik9Im9uQWRkRmlsdGVyKCRldmVudCkiXG4gICAgPjwvbWV0cmljLXNlYXJjaC1jb21wb25lbnQ+XG4gICcsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSxudWxsKTtjb25zdCBkeXQ9ZnVuY3Rpb24odCl7cmV0dXJueyJhY3RpdmUtYnV0dG9uIjp0fX07Y2xhc3MgcHl0e2Rvd25sb2FkUmVzdWx0cygpe2Zvcihjb25zdCB0IG9mIHRoaXMucnVucyl7Y29uc3QgZT1jeXQodGhpcy5mbGFnZ2VkRGF0YSx0LHRoaXMubWV0cmljcyksbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7bi5zZXRBdHRyaWJ1dGUoImhyZWYiLGUpLG4uc2V0QXR0cmlidXRlKCJkb3dubG9hZCIsYHJlcG9ydF8ke3R9LmNzdmApLG4uY2xpY2soKX19fXB5dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8cHl0KX0scHl0Lsm1Y21wPXRvKHt0eXBlOnB5dCxzZWxlY3RvcnM6W1sicmVzdWx0cy1kb3dubG9hZC1jb21wb25lbnQiXV0saW5wdXRzOntudW1GbGFnZ2VkQW5ub3RhdGlvbnM6Im51bUZsYWdnZWRBbm5vdGF0aW9ucyIscnVuczoicnVucyIsZmxhZ2dlZERhdGE6ImZsYWdnZWREYXRhIixtZXRyaWNzOiJtZXRyaWNzIn0sZGVjbHM6NCx2YXJzOjUsY29uc3RzOltbIm1hdC1zdHJva2VkLWJ1dHRvbiIsIiIsInRpdGxlIiwiRXhwb3J0IENTViByZXBvcnRzIG9mIGFsbCBmbGFnZ2VkIGFubm90YXRpb25zLiBXaWxsIGdlbmVyYXRlIG9uZSBDU1YgcGVyIGFjdGl2ZSBydW4uIiwzLCJkaXNhYmxlZCIsIm5nQ2xhc3MiLCJjbGljayJdLFsxLCJidXR0b24tY29udGVudHMiXSxbInN2Z0ljb24iLCJnZXRfYXBwXzI0cHgiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImJ1dHRvbiIsMCksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLmRvd25sb2FkUmVzdWx0cygpfSkpLFJtKDEsInNwYW4iLDEpLFRtKDIsIm1hdC1pY29uIiwyKSxrdSgzKSxBbSgpLEFtKCkpLDImZSYmKERtKCJkaXNhYmxlZCIsMD09PW4ubnVtRmxhZ2dlZEFubm90YXRpb25zKSgibmdDbGFzcyIsTWgoMyxkeXQsbi5udW1GbGFnZ2VkQW5ub3RhdGlvbnM+MCkpLHJjKDMpLER1KCIgRmxhZ2dlZCBSb3dzICgiLG4ubnVtRmxhZ2dlZEFubm90YXRpb25zLCIpICIpKX0sZGlyZWN0aXZlczpbWEgsYU0sRFddLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5hY3RpdmUtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Ym9yZGVyOjFweCBzb2xpZCAjZWJlYmViO2NvbG9yOiNmZmZ9LmJ1dHRvbi1jb250ZW50c1tfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9bWF0LWljb25bX25nY29udGVudC0lQ09NUCVde21hcmdpbi1yaWdodDo2cHh9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHB5dCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJyZXN1bHRzLWRvd25sb2FkLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vcmVzdWx0c19kb3dubG9hZF9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9yZXN1bHRzX2Rvd25sb2FkX2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSxudWxsLHtudW1GbGFnZ2VkQW5ub3RhdGlvbnM6W3t0eXBlOnh5fV0scnVuczpbe3R5cGU6eHl9XSxmbGFnZ2VkRGF0YTpbe3R5cGU6eHl9XSxtZXRyaWNzOlt7dHlwZTp4eX1dfSk7Y2xhc3MgbXl0e2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLmZsYWdnZWRBbm5vdGF0aW9ucyQ9dGhpcy5zdG9yZS5zZWxlY3QoZGJ0KSx0aGlzLm51bUZsYWdnZWRBbm5vdGF0aW9ucyQ9dGhpcy5mbGFnZ2VkQW5ub3RhdGlvbnMkLnBpcGUoSXQoKHQ9PnQubGVuZ3RoKSkpLHRoaXMuYWN0aXZlUnVucyQ9dGhpcy5zdG9yZS5zZWxlY3QoTk4pLnBpcGUoSXQoKHQ9PnQ/QXJyYXkuZnJvbSh0LmVudHJpZXMoKSkuZmlsdGVyKCh0PT50WzFdKSkubWFwKCh0PT50WzBdKSk6W10pKSksdGhpcy5mbGFnZ2VkRGF0YSQ9V3QoW3RoaXMuc3RvcmUuc2VsZWN0KHJidCksdGhpcy5mbGFnZ2VkQW5ub3RhdGlvbnMkXSkucGlwZShJdCgoKFt0LGVdKT0+e2NvbnN0IG49bmV3IFNldChlKTtyZXR1cm4gT2JqZWN0LmVudHJpZXModCkuZmlsdGVyKCh0PT5uLmhhcyh0WzBdKSkpfSkpKSx0aGlzLm1ldHJpY3MkPVd0KFt0aGlzLnN0b3JlLnNlbGVjdChzYnQpLHRoaXMuYWN0aXZlUnVucyQsdGhpcy5zdG9yZS5zZWxlY3QoZ2J0KV0pLnBpcGUoSXQoKChbdCxlLG5dKT0+e2xldCBvPU9iamVjdC5rZXlzKG4pO2Zvcihjb25zdCBuIG9mIGUpdFtuXSYmKG89by5jb25jYXQodFtuXS5maWx0ZXIoKHQ9PmV5dCh0KSkpKSk7cmV0dXJuIG89Wy4uLm5ldyBTZXQobyldLG99KSkpfX1teXQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fG15dCkoU20oSXcpKX0sbXl0Lsm1Y21wPXRvKHt0eXBlOm15dCxzZWxlY3RvcnM6W1sibnBtaS1yZXN1bHRzLWRvd25sb2FkIl1dLGRlY2xzOjUsdmFyczoxMixjb25zdHM6W1szLCJudW1GbGFnZ2VkQW5ub3RhdGlvbnMiLCJydW5zIiwiZmxhZ2dlZERhdGEiLCJtZXRyaWNzIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihUbSgwLCJyZXN1bHRzLWRvd25sb2FkLWNvbXBvbmVudCIsMCksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQWgoNCwiYXN5bmMiKSksMiZlJiZEbSgibnVtRmxhZ2dlZEFubm90YXRpb25zIixUaCgxLDQsbi5udW1GbGFnZ2VkQW5ub3RhdGlvbnMkKSkoInJ1bnMiLFRoKDIsNixuLmFjdGl2ZVJ1bnMkKSkoImZsYWdnZWREYXRhIixUaCgzLDgsbi5mbGFnZ2VkRGF0YSQpKSgibWV0cmljcyIsVGgoNCwxMCxuLm1ldHJpY3MkKSl9LGRpcmVjdGl2ZXM6W3B5dF0scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKG15dCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJucG1pLXJlc3VsdHMtZG93bmxvYWQiLHRlbXBsYXRlOidcbiAgICA8cmVzdWx0cy1kb3dubG9hZC1jb21wb25lbnRcbiAgICAgIFtudW1GbGFnZ2VkQW5ub3RhdGlvbnNdPSJudW1GbGFnZ2VkQW5ub3RhdGlvbnMkIHwgYXN5bmMiXG4gICAgICBbcnVuc109ImFjdGl2ZVJ1bnMkIHwgYXN5bmMiXG4gICAgICBbZmxhZ2dlZERhdGFdPSJmbGFnZ2VkRGF0YSQgfCBhc3luYyJcbiAgICAgIFttZXRyaWNzXT0ibWV0cmljcyQgfCBhc3luYyJcbiAgICA+PC9yZXN1bHRzLWRvd25sb2FkLWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NvbnN0IHV5dD1uZXcgR2EoIk1hdENoaXBSZW1vdmUiKSxmeXQ9bmV3IEdhKCJNYXRDaGlwQXZhdGFyIiksZ3l0PW5ldyBHYSgiTWF0Q2hpcFRyYWlsaW5nSWNvbiIpLGh5dD0kSShKSShRSShjbGFzc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLl9lbGVtZW50UmVmPXR9fSksInByaW1hcnkiKSwtMSk7Y2xhc3MgYnl0e31ieXQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGJ5dCl9LGJ5dC7JtWRpcj1sbyh7dHlwZTpieXQsc2VsZWN0b3JzOltbIm1hdC1jaGlwLWF2YXRhciJdLFsiIiwibWF0Q2hpcEF2YXRhciIsIiJdXSxob3N0QXR0cnM6WzEsIm1hdC1jaGlwLWF2YXRhciJdLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6Znl0LHVzZUV4aXN0aW5nOmJ5dH1dKV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGJ5dCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJtYXQtY2hpcC1hdmF0YXIsIFttYXRDaGlwQXZhdGFyXSIsaG9zdDp7Y2xhc3M6Im1hdC1jaGlwLWF2YXRhciJ9LHByb3ZpZGVyczpbe3Byb3ZpZGU6Znl0LHVzZUV4aXN0aW5nOmJ5dH1dfV19XSxudWxsLG51bGwpO2NsYXNzIHl5dHt9eXl0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx5eXQpfSx5eXQuybVkaXI9bG8oe3R5cGU6eXl0LHNlbGVjdG9yczpbWyJtYXQtY2hpcC10cmFpbGluZy1pY29uIl0sWyIiLCJtYXRDaGlwVHJhaWxpbmdJY29uIiwiIl1dLGhvc3RBdHRyczpbMSwibWF0LWNoaXAtdHJhaWxpbmctaWNvbiJdLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6Z3l0LHVzZUV4aXN0aW5nOnl5dH1dKV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHl5dCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJtYXQtY2hpcC10cmFpbGluZy1pY29uLCBbbWF0Q2hpcFRyYWlsaW5nSWNvbl0iLGhvc3Q6e2NsYXNzOiJtYXQtY2hpcC10cmFpbGluZy1pY29uIn0scHJvdmlkZXJzOlt7cHJvdmlkZTpneXQsdXNlRXhpc3Rpbmc6eXl0fV19XX1dLG51bGwsbnVsbCk7Y2xhc3MgX3l0IGV4dGVuZHMgaHl0e2NvbnN0cnVjdG9yKHQsZSxuLG8saSxhLHIscyl7c3VwZXIodCksdGhpcy5fbmdab25lPWUsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWY9aSx0aGlzLl9oYXNGb2N1cz0hMSx0aGlzLmNoaXBMaXN0U2VsZWN0YWJsZT0hMCx0aGlzLl9jaGlwTGlzdE11bHRpcGxlPSExLHRoaXMuX2NoaXBMaXN0RGlzYWJsZWQ9ITEsdGhpcy5fc2VsZWN0ZWQ9ITEsdGhpcy5fc2VsZWN0YWJsZT0hMCx0aGlzLl9kaXNhYmxlZD0hMSx0aGlzLl9yZW1vdmFibGU9ITAsdGhpcy5fb25Gb2N1cz1uZXcgSSx0aGlzLl9vbkJsdXI9bmV3IEksdGhpcy5zZWxlY3Rpb25DaGFuZ2U9bmV3IExoLHRoaXMuZGVzdHJveWVkPW5ldyBMaCx0aGlzLnJlbW92ZWQ9bmV3IExoLHRoaXMuX2FkZEhvc3RDbGFzc05hbWUoKSx0aGlzLl9jaGlwUmlwcGxlVGFyZ2V0PWEuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5fY2hpcFJpcHBsZVRhcmdldC5jbGFzc0xpc3QuYWRkKCJtYXQtY2hpcC1yaXBwbGUiKSx0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fY2hpcFJpcHBsZVRhcmdldCksdGhpcy5fY2hpcFJpcHBsZT1uZXcgUEgodGhpcyxlLHRoaXMuX2NoaXBSaXBwbGVUYXJnZXQsbiksdGhpcy5fY2hpcFJpcHBsZS5zZXR1cFRyaWdnZXJFdmVudHModCksdGhpcy5yaXBwbGVDb25maWc9b3x8e30sdGhpcy5fYW5pbWF0aW9uc0Rpc2FibGVkPSJOb29wQW5pbWF0aW9ucyI9PT1yLHRoaXMudGFiSW5kZXg9bnVsbCE9cyYmcGFyc2VJbnQocyl8fC0xfWdldCByaXBwbGVEaXNhYmxlZCgpe3JldHVybiB0aGlzLmRpc2FibGVkfHx0aGlzLmRpc2FibGVSaXBwbGV8fHRoaXMuX2FuaW1hdGlvbnNEaXNhYmxlZHx8ISF0aGlzLnJpcHBsZUNvbmZpZy5kaXNhYmxlZH1nZXQgc2VsZWN0ZWQoKXtyZXR1cm4gdGhpcy5fc2VsZWN0ZWR9c2V0IHNlbGVjdGVkKHQpe2NvbnN0IGU9eXoodCk7ZSE9PXRoaXMuX3NlbGVjdGVkJiYodGhpcy5fc2VsZWN0ZWQ9ZSx0aGlzLl9kaXNwYXRjaFNlbGVjdGlvbkNoYW5nZSgpKX1nZXQgdmFsdWUoKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fdmFsdWU/dGhpcy5fdmFsdWU6dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnRleHRDb250ZW50fXNldCB2YWx1ZSh0KXt0aGlzLl92YWx1ZT10fWdldCBzZWxlY3RhYmxlKCl7cmV0dXJuIHRoaXMuX3NlbGVjdGFibGUmJnRoaXMuY2hpcExpc3RTZWxlY3RhYmxlfXNldCBzZWxlY3RhYmxlKHQpe3RoaXMuX3NlbGVjdGFibGU9eXoodCl9Z2V0IGRpc2FibGVkKCl7cmV0dXJuIHRoaXMuX2NoaXBMaXN0RGlzYWJsZWR8fHRoaXMuX2Rpc2FibGVkfXNldCBkaXNhYmxlZCh0KXt0aGlzLl9kaXNhYmxlZD15eih0KX1nZXQgcmVtb3ZhYmxlKCl7cmV0dXJuIHRoaXMuX3JlbW92YWJsZX1zZXQgcmVtb3ZhYmxlKHQpe3RoaXMuX3JlbW92YWJsZT15eih0KX1nZXQgYXJpYVNlbGVjdGVkKCl7cmV0dXJuIHRoaXMuc2VsZWN0YWJsZSYmKHRoaXMuX2NoaXBMaXN0TXVsdGlwbGV8fHRoaXMuc2VsZWN0ZWQpP3RoaXMuc2VsZWN0ZWQudG9TdHJpbmcoKTpudWxsfV9hZGRIb3N0Q2xhc3NOYW1lKCl7Y29uc3QgdD0ibWF0LWJhc2ljLWNoaXAiLGU9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O2UuaGFzQXR0cmlidXRlKHQpfHxlLnRhZ05hbWUudG9Mb3dlckNhc2UoKT09PXQ/ZS5jbGFzc0xpc3QuYWRkKHQpOmUuY2xhc3NMaXN0LmFkZCgibWF0LXN0YW5kYXJkLWNoaXAiKX1uZ09uRGVzdHJveSgpe3RoaXMuZGVzdHJveWVkLmVtaXQoe2NoaXA6dGhpc30pLHRoaXMuX2NoaXBSaXBwbGUuX3JlbW92ZVRyaWdnZXJFdmVudHMoKX1zZWxlY3QoKXt0aGlzLl9zZWxlY3RlZHx8KHRoaXMuX3NlbGVjdGVkPSEwLHRoaXMuX2Rpc3BhdGNoU2VsZWN0aW9uQ2hhbmdlKCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpfWRlc2VsZWN0KCl7dGhpcy5fc2VsZWN0ZWQmJih0aGlzLl9zZWxlY3RlZD0hMSx0aGlzLl9kaXNwYXRjaFNlbGVjdGlvbkNoYW5nZSgpLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKX1zZWxlY3RWaWFJbnRlcmFjdGlvbigpe3RoaXMuX3NlbGVjdGVkfHwodGhpcy5fc2VsZWN0ZWQ9ITAsdGhpcy5fZGlzcGF0Y2hTZWxlY3Rpb25DaGFuZ2UoITApLHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKX10b2dnbGVTZWxlY3RlZCh0PSExKXtyZXR1cm4gdGhpcy5fc2VsZWN0ZWQ9IXRoaXMuc2VsZWN0ZWQsdGhpcy5fZGlzcGF0Y2hTZWxlY3Rpb25DaGFuZ2UodCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCksdGhpcy5zZWxlY3RlZH1mb2N1cygpe3RoaXMuX2hhc0ZvY3VzfHwodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCksdGhpcy5fb25Gb2N1cy5uZXh0KHtjaGlwOnRoaXN9KSksdGhpcy5faGFzRm9jdXM9ITB9cmVtb3ZlKCl7dGhpcy5yZW1vdmFibGUmJnRoaXMucmVtb3ZlZC5lbWl0KHtjaGlwOnRoaXN9KX1faGFuZGxlQ2xpY2sodCl7dGhpcy5kaXNhYmxlZD90LnByZXZlbnREZWZhdWx0KCk6dC5zdG9wUHJvcGFnYXRpb24oKX1faGFuZGxlS2V5ZG93bih0KXtpZighdGhpcy5kaXNhYmxlZClzd2l0Y2godC5rZXlDb2RlKXtjYXNlIDQ2OmNhc2UgODp0aGlzLnJlbW92ZSgpLHQucHJldmVudERlZmF1bHQoKTticmVhaztjYXNlIGZ6OnRoaXMuc2VsZWN0YWJsZSYmdGhpcy50b2dnbGVTZWxlY3RlZCghMCksdC5wcmV2ZW50RGVmYXVsdCgpfX1fYmx1cigpe3RoaXMuX25nWm9uZS5vblN0YWJsZS5waXBlKGJlKDEpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5fbmdab25lLnJ1bigoKCk9Pnt0aGlzLl9oYXNGb2N1cz0hMSx0aGlzLl9vbkJsdXIubmV4dCh7Y2hpcDp0aGlzfSl9KSl9KSl9X2Rpc3BhdGNoU2VsZWN0aW9uQ2hhbmdlKHQ9ITEpe3RoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoe3NvdXJjZTp0aGlzLGlzVXNlcklucHV0OnQsc2VsZWN0ZWQ6dGhpcy5fc2VsZWN0ZWR9KX19X3l0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxfeXQpKFNtKGhnKSxTbShhXyksU20od3opLFNtKHdILDgpLFNtKFVnKSxTbShaXyksU20oVlAsOCksTmEoInRhYmluZGV4IikpfSxfeXQuybVkaXI9bG8oe3R5cGU6X3l0LHNlbGVjdG9yczpbWyJtYXQtYmFzaWMtY2hpcCJdLFsiIiwibWF0LWJhc2ljLWNoaXAiLCIiXSxbIm1hdC1jaGlwIl0sWyIiLCJtYXQtY2hpcCIsIiJdXSxjb250ZW50UXVlcmllczpmdW5jdGlvbiB0KGUsbixvKXtpZigxJmUmJigkaChvLGZ5dCw1KSwkaChvLGd5dCw1KSwkaChvLHV5dCw1KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5hdmF0YXI9dC5maXJzdCksSmgodD10YigpKSYmKG4udHJhaWxpbmdJY29uPXQuZmlyc3QpLEpoKHQ9dGIoKSkmJihuLnJlbW92ZUljb249dC5maXJzdCl9fSxob3N0QXR0cnM6WyJyb2xlIiwib3B0aW9uIiwxLCJtYXQtY2hpcCIsIm1hdC1mb2N1cy1pbmRpY2F0b3IiXSxob3N0VmFyczoxNCxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezEmZSYmVm0oImNsaWNrIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5faGFuZGxlQ2xpY2soZSl9KSkoImtleWRvd24iLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9oYW5kbGVLZXlkb3duKGUpfSkpKCJmb2N1cyIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5mb2N1cygpfSkpKCJibHVyIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9ibHVyKCl9KSksMiZlJiYoanAoInRhYmluZGV4IixuLmRpc2FibGVkP251bGw6bi50YWJJbmRleCkoImRpc2FibGVkIixuLmRpc2FibGVkfHxudWxsKSgiYXJpYS1kaXNhYmxlZCIsbi5kaXNhYmxlZC50b1N0cmluZygpKSgiYXJpYS1zZWxlY3RlZCIsbi5hcmlhU2VsZWN0ZWQpLHB1KCJtYXQtY2hpcC1zZWxlY3RlZCIsbi5zZWxlY3RlZCkoIm1hdC1jaGlwLXdpdGgtYXZhdGFyIixuLmF2YXRhcikoIm1hdC1jaGlwLXdpdGgtdHJhaWxpbmctaWNvbiIsbi50cmFpbGluZ0ljb258fG4ucmVtb3ZlSWNvbikoIm1hdC1jaGlwLWRpc2FibGVkIixuLmRpc2FibGVkKSgiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLG4uX2FuaW1hdGlvbnNEaXNhYmxlZCkpfSxpbnB1dHM6e2NvbG9yOiJjb2xvciIsZGlzYWJsZVJpcHBsZToiZGlzYWJsZVJpcHBsZSIsdGFiSW5kZXg6InRhYkluZGV4IixzZWxlY3RlZDoic2VsZWN0ZWQiLHZhbHVlOiJ2YWx1ZSIsc2VsZWN0YWJsZToic2VsZWN0YWJsZSIsZGlzYWJsZWQ6ImRpc2FibGVkIixyZW1vdmFibGU6InJlbW92YWJsZSJ9LG91dHB1dHM6e3NlbGVjdGlvbkNoYW5nZToic2VsZWN0aW9uQ2hhbmdlIixkZXN0cm95ZWQ6ImRlc3Ryb3llZCIscmVtb3ZlZDoicmVtb3ZlZCJ9LGV4cG9ydEFzOlsibWF0Q2hpcCJdLGZlYXR1cmVzOlt4cF19KSxfeXQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpoZ30se3R5cGU6YV99LHt0eXBlOnd6fSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W3dIXX1dfSx7dHlwZTpVZ30se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W1pfXX1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6amEsYXJnczpbInRhYmluZGV4Il19XX1dLF95dC5wcm9wRGVjb3JhdG9ycz17YXZhdGFyOlt7dHlwZTpxYSxhcmdzOltmeXRdfV0sdHJhaWxpbmdJY29uOlt7dHlwZTpxYSxhcmdzOltneXRdfV0scmVtb3ZlSWNvbjpbe3R5cGU6cWEsYXJnczpbdXl0XX1dLHNlbGVjdGVkOlt7dHlwZTp4eX1dLHZhbHVlOlt7dHlwZTp4eX1dLHNlbGVjdGFibGU6W3t0eXBlOnh5fV0sZGlzYWJsZWQ6W3t0eXBlOnh5fV0scmVtb3ZhYmxlOlt7dHlwZTp4eX1dLHNlbGVjdGlvbkNoYW5nZTpbe3R5cGU6T3l9XSxkZXN0cm95ZWQ6W3t0eXBlOk95fV0scmVtb3ZlZDpbe3R5cGU6T3l9XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChfeXQsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoibWF0LWJhc2ljLWNoaXAsIFttYXQtYmFzaWMtY2hpcF0sIG1hdC1jaGlwLCBbbWF0LWNoaXBdIixpbnB1dHM6WyJjb2xvciIsImRpc2FibGVSaXBwbGUiLCJ0YWJJbmRleCJdLGV4cG9ydEFzOiJtYXRDaGlwIixob3N0OntjbGFzczoibWF0LWNoaXAgbWF0LWZvY3VzLWluZGljYXRvciIsIlthdHRyLnRhYmluZGV4XSI6ImRpc2FibGVkID8gbnVsbCA6IHRhYkluZGV4Iixyb2xlOiJvcHRpb24iLCJbY2xhc3MubWF0LWNoaXAtc2VsZWN0ZWRdIjoic2VsZWN0ZWQiLCJbY2xhc3MubWF0LWNoaXAtd2l0aC1hdmF0YXJdIjoiYXZhdGFyIiwiW2NsYXNzLm1hdC1jaGlwLXdpdGgtdHJhaWxpbmctaWNvbl0iOiJ0cmFpbGluZ0ljb24gfHwgcmVtb3ZlSWNvbiIsIltjbGFzcy5tYXQtY2hpcC1kaXNhYmxlZF0iOiJkaXNhYmxlZCIsIltjbGFzcy5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZV0iOiJfYW5pbWF0aW9uc0Rpc2FibGVkIiwiW2F0dHIuZGlzYWJsZWRdIjoiZGlzYWJsZWQgfHwgbnVsbCIsIlthdHRyLmFyaWEtZGlzYWJsZWRdIjoiZGlzYWJsZWQudG9TdHJpbmcoKSIsIlthdHRyLmFyaWEtc2VsZWN0ZWRdIjoiYXJpYVNlbGVjdGVkIiwiKGNsaWNrKSI6Il9oYW5kbGVDbGljaygkZXZlbnQpIiwiKGtleWRvd24pIjoiX2hhbmRsZUtleWRvd24oJGV2ZW50KSIsIihmb2N1cykiOiJmb2N1cygpIiwiKGJsdXIpIjoiX2JsdXIoKSJ9fV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOmFffSx7dHlwZTp3en0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOlt3SF19XX0se3R5cGU6VWd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltaX119XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOmphLGFyZ3M6WyJ0YWJpbmRleCJdfV19XX0pLHtzZWxlY3Rpb25DaGFuZ2U6W3t0eXBlOk95fV0sZGVzdHJveWVkOlt7dHlwZTpPeX1dLHJlbW92ZWQ6W3t0eXBlOk95fV0sc2VsZWN0ZWQ6W3t0eXBlOnh5fV0sdmFsdWU6W3t0eXBlOnh5fV0sc2VsZWN0YWJsZTpbe3R5cGU6eHl9XSxkaXNhYmxlZDpbe3R5cGU6eHl9XSxyZW1vdmFibGU6W3t0eXBlOnh5fV0sYXZhdGFyOlt7dHlwZTpxYSxhcmdzOltmeXRdfV0sdHJhaWxpbmdJY29uOlt7dHlwZTpxYSxhcmdzOltneXRdfV0scmVtb3ZlSWNvbjpbe3R5cGU6cWEsYXJnczpbdXl0XX1dfSk7Y2xhc3MgQ3l0e2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fcGFyZW50Q2hpcD10LCJCVVRUT04iPT09ZS5uYXRpdmVFbGVtZW50Lm5vZGVOYW1lJiZlLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJ0eXBlIiwiYnV0dG9uIil9X2hhbmRsZUNsaWNrKHQpe2NvbnN0IGU9dGhpcy5fcGFyZW50Q2hpcDtlLnJlbW92YWJsZSYmIWUuZGlzYWJsZWQmJmUucmVtb3ZlKCksdC5zdG9wUHJvcGFnYXRpb24oKX19Q3l0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxDeXQpKFNtKF95dCksU20oaGcpKX0sQ3l0Lsm1ZGlyPWxvKHt0eXBlOkN5dCxzZWxlY3RvcnM6W1siIiwibWF0Q2hpcFJlbW92ZSIsIiJdXSxob3N0QXR0cnM6WzEsIm1hdC1jaGlwLXJlbW92ZSIsIm1hdC1jaGlwLXRyYWlsaW5nLWljb24iXSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezEmZSYmVm0oImNsaWNrIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5faGFuZGxlQ2xpY2soZSl9KSl9LGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6dXl0LHVzZUV4aXN0aW5nOkN5dH1dKV19KSxDeXQuY3RvclBhcmFtZXRlcnM9KCk9Plt7dHlwZTpfeXR9LHt0eXBlOmhnfV0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChDeXQsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoiW21hdENoaXBSZW1vdmVdIixob3N0OntjbGFzczoibWF0LWNoaXAtcmVtb3ZlIG1hdC1jaGlwLXRyYWlsaW5nLWljb24iLCIoY2xpY2spIjoiX2hhbmRsZUNsaWNrKCRldmVudCkifSxwcm92aWRlcnM6W3twcm92aWRlOnV5dCx1c2VFeGlzdGluZzpDeXR9XX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOl95dH0se3R5cGU6aGd9XX0pLG51bGwpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KY29uc3QgTXl0PW5ldyBHYSgibWF0LWNoaXBzLWRlZmF1bHQtb3B0aW9ucyIpLHZ5dD10SChjbGFzc3tjb25zdHJ1Y3Rvcih0LGUsbixvKXt0aGlzLl9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXI9dCx0aGlzLl9wYXJlbnRGb3JtPWUsdGhpcy5fcGFyZW50Rm9ybUdyb3VwPW4sdGhpcy5uZ0NvbnRyb2w9b319KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovbGV0IHh5dD0wO2NsYXNzIE95dHtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuc291cmNlPXQsdGhpcy52YWx1ZT1lfX1jbGFzcyBQeXQgZXh0ZW5kcyB2eXR7Y29uc3RydWN0b3IodCxlLG4sbyxpLGEscil7c3VwZXIoYSxvLGksciksdGhpcy5fZWxlbWVudFJlZj10LHRoaXMuX2NoYW5nZURldGVjdG9yUmVmPWUsdGhpcy5fZGlyPW4sdGhpcy5jb250cm9sVHlwZT0ibWF0LWNoaXAtbGlzdCIsdGhpcy5fbGFzdERlc3Ryb3llZENoaXBJbmRleD1udWxsLHRoaXMuX2Rlc3Ryb3llZD1uZXcgSSx0aGlzLl91aWQ9Im1hdC1jaGlwLWxpc3QtIit4eXQrKyx0aGlzLl90YWJJbmRleD0wLHRoaXMuX3VzZXJUYWJJbmRleD1udWxsLHRoaXMuX29uVG91Y2hlZD0oKT0+e30sdGhpcy5fb25DaGFuZ2U9KCk9Pnt9LHRoaXMuX211bHRpcGxlPSExLHRoaXMuX2NvbXBhcmVXaXRoPSh0LGUpPT50PT09ZSx0aGlzLl9yZXF1aXJlZD0hMSx0aGlzLl9kaXNhYmxlZD0hMSx0aGlzLmFyaWFPcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIsdGhpcy5fc2VsZWN0YWJsZT0hMCx0aGlzLmNoYW5nZT1uZXcgTGgsdGhpcy52YWx1ZUNoYW5nZT1uZXcgTGgsdGhpcy5uZ0NvbnRyb2wmJih0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yPXRoaXMpfWdldCBzZWxlY3RlZCgpe3JldHVybiB0aGlzLm11bHRpcGxlP3RoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkOnRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkWzBdfWdldCByb2xlKCl7cmV0dXJuIHRoaXMuZW1wdHk/bnVsbDoibGlzdGJveCJ9Z2V0IG11bHRpcGxlKCl7cmV0dXJuIHRoaXMuX211bHRpcGxlfXNldCBtdWx0aXBsZSh0KXt0aGlzLl9tdWx0aXBsZT15eih0KSx0aGlzLl9zeW5jQ2hpcHNTdGF0ZSgpfWdldCBjb21wYXJlV2l0aCgpe3JldHVybiB0aGlzLl9jb21wYXJlV2l0aH1zZXQgY29tcGFyZVdpdGgodCl7dGhpcy5fY29tcGFyZVdpdGg9dCx0aGlzLl9zZWxlY3Rpb25Nb2RlbCYmdGhpcy5faW5pdGlhbGl6ZVNlbGVjdGlvbigpfWdldCB2YWx1ZSgpe3JldHVybiB0aGlzLl92YWx1ZX1zZXQgdmFsdWUodCl7dGhpcy53cml0ZVZhbHVlKHQpLHRoaXMuX3ZhbHVlPXR9Z2V0IGlkKCl7cmV0dXJuIHRoaXMuX2NoaXBJbnB1dD90aGlzLl9jaGlwSW5wdXQuaWQ6dGhpcy5fdWlkfWdldCByZXF1aXJlZCgpe3JldHVybiB0aGlzLl9yZXF1aXJlZH1zZXQgcmVxdWlyZWQodCl7dGhpcy5fcmVxdWlyZWQ9eXoodCksdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpfWdldCBwbGFjZWhvbGRlcigpe3JldHVybiB0aGlzLl9jaGlwSW5wdXQ/dGhpcy5fY2hpcElucHV0LnBsYWNlaG9sZGVyOnRoaXMuX3BsYWNlaG9sZGVyfXNldCBwbGFjZWhvbGRlcih0KXt0aGlzLl9wbGFjZWhvbGRlcj10LHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKX1nZXQgZm9jdXNlZCgpe3JldHVybiB0aGlzLl9jaGlwSW5wdXQmJnRoaXMuX2NoaXBJbnB1dC5mb2N1c2VkfHx0aGlzLl9oYXNGb2N1c2VkQ2hpcCgpfWdldCBlbXB0eSgpe3JldHVybighdGhpcy5fY2hpcElucHV0fHx0aGlzLl9jaGlwSW5wdXQuZW1wdHkpJiYoIXRoaXMuY2hpcHN8fDA9PT10aGlzLmNoaXBzLmxlbmd0aCl9Z2V0IHNob3VsZExhYmVsRmxvYXQoKXtyZXR1cm4hdGhpcy5lbXB0eXx8dGhpcy5mb2N1c2VkfWdldCBkaXNhYmxlZCgpe3JldHVybiB0aGlzLm5nQ29udHJvbD8hIXRoaXMubmdDb250cm9sLmRpc2FibGVkOnRoaXMuX2Rpc2FibGVkfXNldCBkaXNhYmxlZCh0KXt0aGlzLl9kaXNhYmxlZD15eih0KSx0aGlzLl9zeW5jQ2hpcHNTdGF0ZSgpfWdldCBzZWxlY3RhYmxlKCl7cmV0dXJuIHRoaXMuX3NlbGVjdGFibGV9c2V0IHNlbGVjdGFibGUodCl7dGhpcy5fc2VsZWN0YWJsZT15eih0KSx0aGlzLmNoaXBzJiZ0aGlzLmNoaXBzLmZvckVhY2goKHQ9PnQuY2hpcExpc3RTZWxlY3RhYmxlPXRoaXMuX3NlbGVjdGFibGUpKX1zZXQgdGFiSW5kZXgodCl7dGhpcy5fdXNlclRhYkluZGV4PXQsdGhpcy5fdGFiSW5kZXg9dH1nZXQgY2hpcFNlbGVjdGlvbkNoYW5nZXMoKXtyZXR1cm4gcmUoLi4udGhpcy5jaGlwcy5tYXAoKHQ9PnQuc2VsZWN0aW9uQ2hhbmdlKSkpfWdldCBjaGlwRm9jdXNDaGFuZ2VzKCl7cmV0dXJuIHJlKC4uLnRoaXMuY2hpcHMubWFwKCh0PT50Ll9vbkZvY3VzKSkpfWdldCBjaGlwQmx1ckNoYW5nZXMoKXtyZXR1cm4gcmUoLi4udGhpcy5jaGlwcy5tYXAoKHQ9PnQuX29uQmx1cikpKX1nZXQgY2hpcFJlbW92ZUNoYW5nZXMoKXtyZXR1cm4gcmUoLi4udGhpcy5jaGlwcy5tYXAoKHQ9PnQuZGVzdHJveWVkKSkpfW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX2tleU1hbmFnZXI9bmV3IGVJKHRoaXMuY2hpcHMpLndpdGhXcmFwKCkud2l0aFZlcnRpY2FsT3JpZW50YXRpb24oKS53aXRoSG9tZUFuZEVuZCgpLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24odGhpcy5fZGlyP3RoaXMuX2Rpci52YWx1ZToibHRyIiksdGhpcy5fZGlyJiZ0aGlzLl9kaXIuY2hhbmdlLnBpcGUoSWUodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCh0PT50aGlzLl9rZXlNYW5hZ2VyLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24odCkpKSx0aGlzLl9rZXlNYW5hZ2VyLnRhYk91dC5waXBlKEllKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLl9hbGxvd0ZvY3VzRXNjYXBlKCl9KSksdGhpcy5jaGlwcy5jaGFuZ2VzLnBpcGUoTmUobnVsbCksSWUodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgoKT0+e3RoaXMuZGlzYWJsZWQmJlByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCgpPT57dGhpcy5fc3luY0NoaXBzU3RhdGUoKX0pKSx0aGlzLl9yZXNldENoaXBzKCksdGhpcy5faW5pdGlhbGl6ZVNlbGVjdGlvbigpLHRoaXMuX3VwZGF0ZVRhYkluZGV4KCksdGhpcy5fdXBkYXRlRm9jdXNGb3JEZXN0cm95ZWRDaGlwcygpLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKX0pKX1uZ09uSW5pdCgpe3RoaXMuX3NlbGVjdGlvbk1vZGVsPW5ldyBvRih0aGlzLm11bHRpcGxlLHZvaWQgMCwhMSksdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpfW5nRG9DaGVjaygpe3RoaXMubmdDb250cm9sJiYodGhpcy51cGRhdGVFcnJvclN0YXRlKCksdGhpcy5uZ0NvbnRyb2wuZGlzYWJsZWQhPT10aGlzLl9kaXNhYmxlZCYmKHRoaXMuZGlzYWJsZWQ9ISF0aGlzLm5nQ29udHJvbC5kaXNhYmxlZCkpfW5nT25EZXN0cm95KCl7dGhpcy5fZGVzdHJveWVkLm5leHQoKSx0aGlzLl9kZXN0cm95ZWQuY29tcGxldGUoKSx0aGlzLnN0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpLHRoaXMuX2Ryb3BTdWJzY3JpcHRpb25zKCl9cmVnaXN0ZXJJbnB1dCh0KXt0aGlzLl9jaGlwSW5wdXQ9dCx0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJkYXRhLW1hdC1jaGlwLWlucHV0Iix0LmlkKX1zZXREZXNjcmliZWRCeUlkcyh0KXt0aGlzLl9hcmlhRGVzY3JpYmVkYnk9dC5qb2luKCIgIil9d3JpdGVWYWx1ZSh0KXt0aGlzLmNoaXBzJiZ0aGlzLl9zZXRTZWxlY3Rpb25CeVZhbHVlKHQsITEpfXJlZ2lzdGVyT25DaGFuZ2UodCl7dGhpcy5fb25DaGFuZ2U9dH1yZWdpc3Rlck9uVG91Y2hlZCh0KXt0aGlzLl9vblRvdWNoZWQ9dH1zZXREaXNhYmxlZFN0YXRlKHQpe3RoaXMuZGlzYWJsZWQ9dCx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCl9b25Db250YWluZXJDbGljayh0KXt0aGlzLl9vcmlnaW5hdGVzRnJvbUNoaXAodCl8fHRoaXMuZm9jdXMoKX1mb2N1cyh0KXt0aGlzLmRpc2FibGVkfHx0aGlzLl9jaGlwSW5wdXQmJnRoaXMuX2NoaXBJbnB1dC5mb2N1c2VkfHwodGhpcy5jaGlwcy5sZW5ndGg+MD8odGhpcy5fa2V5TWFuYWdlci5zZXRGaXJzdEl0ZW1BY3RpdmUoKSx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCkpOih0aGlzLl9mb2N1c0lucHV0KHQpLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKSkpfV9mb2N1c0lucHV0KHQpe3RoaXMuX2NoaXBJbnB1dCYmdGhpcy5fY2hpcElucHV0LmZvY3VzKHQpfV9rZXlkb3duKHQpe2NvbnN0IGU9dC50YXJnZXQ7ZSYmZS5jbGFzc0xpc3QuY29udGFpbnMoIm1hdC1jaGlwIikmJih0aGlzLl9rZXlNYW5hZ2VyLm9uS2V5ZG93bih0KSx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCkpfV91cGRhdGVUYWJJbmRleCgpe3RoaXMuX3RhYkluZGV4PXRoaXMuX3VzZXJUYWJJbmRleHx8KDA9PT10aGlzLmNoaXBzLmxlbmd0aD8tMTowKX1fdXBkYXRlRm9jdXNGb3JEZXN0cm95ZWRDaGlwcygpe2lmKG51bGwhPXRoaXMuX2xhc3REZXN0cm95ZWRDaGlwSW5kZXgpaWYodGhpcy5jaGlwcy5sZW5ndGgpe2NvbnN0IHQ9TWF0aC5taW4odGhpcy5fbGFzdERlc3Ryb3llZENoaXBJbmRleCx0aGlzLmNoaXBzLmxlbmd0aC0xKTt0aGlzLl9rZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0odCl9ZWxzZSB0aGlzLmZvY3VzKCk7dGhpcy5fbGFzdERlc3Ryb3llZENoaXBJbmRleD1udWxsfV9pc1ZhbGlkSW5kZXgodCl7cmV0dXJuIHQ+PTAmJnQ8dGhpcy5jaGlwcy5sZW5ndGh9X3NldFNlbGVjdGlvbkJ5VmFsdWUodCxlPSEwKXtpZih0aGlzLl9jbGVhclNlbGVjdGlvbigpLHRoaXMuY2hpcHMuZm9yRWFjaCgodD0+dC5kZXNlbGVjdCgpKSksQXJyYXkuaXNBcnJheSh0KSl0LmZvckVhY2goKHQ9PnRoaXMuX3NlbGVjdFZhbHVlKHQsZSkpKSx0aGlzLl9zb3J0VmFsdWVzKCk7ZWxzZXtjb25zdCBuPXRoaXMuX3NlbGVjdFZhbHVlKHQsZSk7biYmZSYmdGhpcy5fa2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKG4pfX1fc2VsZWN0VmFsdWUodCxlPSEwKXtjb25zdCBuPXRoaXMuY2hpcHMuZmluZCgoZT0+bnVsbCE9ZS52YWx1ZSYmdGhpcy5fY29tcGFyZVdpdGgoZS52YWx1ZSx0KSkpO3JldHVybiBuJiYoZT9uLnNlbGVjdFZpYUludGVyYWN0aW9uKCk6bi5zZWxlY3QoKSx0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3QobikpLG59X2luaXRpYWxpemVTZWxlY3Rpb24oKXtQcm9taXNlLnJlc29sdmUoKS50aGVuKCgoKT0+eyh0aGlzLm5nQ29udHJvbHx8dGhpcy5fdmFsdWUpJiYodGhpcy5fc2V0U2VsZWN0aW9uQnlWYWx1ZSh0aGlzLm5nQ29udHJvbD90aGlzLm5nQ29udHJvbC52YWx1ZTp0aGlzLl92YWx1ZSwhMSksdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpKX0pKX1fY2xlYXJTZWxlY3Rpb24odCl7dGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKSx0aGlzLmNoaXBzLmZvckVhY2goKGU9PntlIT09dCYmZS5kZXNlbGVjdCgpfSkpLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKX1fc29ydFZhbHVlcygpe3RoaXMuX211bHRpcGxlJiYodGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKSx0aGlzLmNoaXBzLmZvckVhY2goKHQ9Pnt0LnNlbGVjdGVkJiZ0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3QodCl9KSksdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpKX1fcHJvcGFnYXRlQ2hhbmdlcyh0KXtsZXQgZT1udWxsO2U9QXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGVkKT90aGlzLnNlbGVjdGVkLm1hcCgodD0+dC52YWx1ZSkpOnRoaXMuc2VsZWN0ZWQ/dGhpcy5zZWxlY3RlZC52YWx1ZTp0LHRoaXMuX3ZhbHVlPWUsdGhpcy5jaGFuZ2UuZW1pdChuZXcgT3l0KHRoaXMsZSkpLHRoaXMudmFsdWVDaGFuZ2UuZW1pdChlKSx0aGlzLl9vbkNoYW5nZShlKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX1fYmx1cigpe3RoaXMuX2hhc0ZvY3VzZWRDaGlwKCl8fHRoaXMuX2tleU1hbmFnZXIuc2V0QWN0aXZlSXRlbSgtMSksdGhpcy5kaXNhYmxlZHx8KHRoaXMuX2NoaXBJbnB1dD9zZXRUaW1lb3V0KCgoKT0+e3RoaXMuZm9jdXNlZHx8dGhpcy5fbWFya0FzVG91Y2hlZCgpfSkpOnRoaXMuX21hcmtBc1RvdWNoZWQoKSl9X21hcmtBc1RvdWNoZWQoKXt0aGlzLl9vblRvdWNoZWQoKSx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSx0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCl9X2FsbG93Rm9jdXNFc2NhcGUoKXstMSE9PXRoaXMuX3RhYkluZGV4JiYodGhpcy5fdGFiSW5kZXg9LTEsc2V0VGltZW91dCgoKCk9Pnt0aGlzLl90YWJJbmRleD10aGlzLl91c2VyVGFiSW5kZXh8fDAsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9KSkpfV9yZXNldENoaXBzKCl7dGhpcy5fZHJvcFN1YnNjcmlwdGlvbnMoKSx0aGlzLl9saXN0ZW5Ub0NoaXBzRm9jdXMoKSx0aGlzLl9saXN0ZW5Ub0NoaXBzU2VsZWN0aW9uKCksdGhpcy5fbGlzdGVuVG9DaGlwc1JlbW92ZWQoKX1fZHJvcFN1YnNjcmlwdGlvbnMoKXt0aGlzLl9jaGlwRm9jdXNTdWJzY3JpcHRpb24mJih0aGlzLl9jaGlwRm9jdXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSx0aGlzLl9jaGlwRm9jdXNTdWJzY3JpcHRpb249bnVsbCksdGhpcy5fY2hpcEJsdXJTdWJzY3JpcHRpb24mJih0aGlzLl9jaGlwQmx1clN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX2NoaXBCbHVyU3Vic2NyaXB0aW9uPW51bGwpLHRoaXMuX2NoaXBTZWxlY3Rpb25TdWJzY3JpcHRpb24mJih0aGlzLl9jaGlwU2VsZWN0aW9uU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCksdGhpcy5fY2hpcFNlbGVjdGlvblN1YnNjcmlwdGlvbj1udWxsKSx0aGlzLl9jaGlwUmVtb3ZlU3Vic2NyaXB0aW9uJiYodGhpcy5fY2hpcFJlbW92ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpLHRoaXMuX2NoaXBSZW1vdmVTdWJzY3JpcHRpb249bnVsbCl9X2xpc3RlblRvQ2hpcHNTZWxlY3Rpb24oKXt0aGlzLl9jaGlwU2VsZWN0aW9uU3Vic2NyaXB0aW9uPXRoaXMuY2hpcFNlbGVjdGlvbkNoYW5nZXMuc3Vic2NyaWJlKCh0PT57dC5zb3VyY2Uuc2VsZWN0ZWQ/dGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0KHQuc291cmNlKTp0aGlzLl9zZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdCh0LnNvdXJjZSksdGhpcy5tdWx0aXBsZXx8dGhpcy5jaGlwcy5mb3JFYWNoKCh0PT57IXRoaXMuX3NlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWQodCkmJnQuc2VsZWN0ZWQmJnQuZGVzZWxlY3QoKX0pKSx0LmlzVXNlcklucHV0JiZ0aGlzLl9wcm9wYWdhdGVDaGFuZ2VzKCl9KSl9X2xpc3RlblRvQ2hpcHNGb2N1cygpe3RoaXMuX2NoaXBGb2N1c1N1YnNjcmlwdGlvbj10aGlzLmNoaXBGb2N1c0NoYW5nZXMuc3Vic2NyaWJlKCh0PT57bGV0IGU9dGhpcy5jaGlwcy50b0FycmF5KCkuaW5kZXhPZih0LmNoaXApO3RoaXMuX2lzVmFsaWRJbmRleChlKSYmdGhpcy5fa2V5TWFuYWdlci51cGRhdGVBY3RpdmVJdGVtKGUpLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKX0pKSx0aGlzLl9jaGlwQmx1clN1YnNjcmlwdGlvbj10aGlzLmNoaXBCbHVyQ2hhbmdlcy5zdWJzY3JpYmUoKCgpPT57dGhpcy5fYmx1cigpLHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKX0pKX1fbGlzdGVuVG9DaGlwc1JlbW92ZWQoKXt0aGlzLl9jaGlwUmVtb3ZlU3Vic2NyaXB0aW9uPXRoaXMuY2hpcFJlbW92ZUNoYW5nZXMuc3Vic2NyaWJlKCh0PT57Y29uc3QgZT10LmNoaXAsbj10aGlzLmNoaXBzLnRvQXJyYXkoKS5pbmRleE9mKHQuY2hpcCk7dGhpcy5faXNWYWxpZEluZGV4KG4pJiZlLl9oYXNGb2N1cyYmKHRoaXMuX2xhc3REZXN0cm95ZWRDaGlwSW5kZXg9bil9KSl9X29yaWdpbmF0ZXNGcm9tQ2hpcCh0KXtsZXQgZT10LnRhcmdldDtmb3IoO2UmJmUhPT10aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7KXtpZihlLmNsYXNzTGlzdC5jb250YWlucygibWF0LWNoaXAiKSlyZXR1cm4hMDtlPWUucGFyZW50RWxlbWVudH1yZXR1cm4hMX1faGFzRm9jdXNlZENoaXAoKXtyZXR1cm4gdGhpcy5jaGlwcyYmdGhpcy5jaGlwcy5zb21lKCh0PT50Ll9oYXNGb2N1cykpfV9zeW5jQ2hpcHNTdGF0ZSgpe3RoaXMuY2hpcHMmJnRoaXMuY2hpcHMuZm9yRWFjaCgodD0+e3QuX2NoaXBMaXN0RGlzYWJsZWQ9dGhpcy5fZGlzYWJsZWQsdC5fY2hpcExpc3RNdWx0aXBsZT10aGlzLm11bHRpcGxlfSkpfX1QeXQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFB5dCkoU20oaGcpLFNtKFVnKSxTbShISSw4KSxTbShpVSw4KSxTbShQVSw4KSxTbShiSCksU20oTWosMTApKX0sUHl0Lsm1Y21wPXRvKHt0eXBlOlB5dCxzZWxlY3RvcnM6W1sibWF0LWNoaXAtbGlzdCJdXSxjb250ZW50UXVlcmllczpmdW5jdGlvbiB0KGUsbixvKXtpZigxJmUmJiRoKG8sX3l0LDUpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uY2hpcHM9dCl9fSxob3N0QXR0cnM6WzEsIm1hdC1jaGlwLWxpc3QiXSxob3N0VmFyczoxNSxob3N0QmluZGluZ3M6ZnVuY3Rpb24gdChlLG4pezEmZSYmVm0oImZvY3VzIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLmZvY3VzKCl9KSkoImJsdXIiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX2JsdXIoKX0pKSgia2V5ZG93biIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX2tleWRvd24oZSl9KSksMiZlJiYoVHUoImlkIixuLl91aWQpLGpwKCJ0YWJpbmRleCIsbi5kaXNhYmxlZD9udWxsOm4uX3RhYkluZGV4KSgiYXJpYS1kZXNjcmliZWRieSIsbi5fYXJpYURlc2NyaWJlZGJ5fHxudWxsKSgiYXJpYS1yZXF1aXJlZCIsbi5yb2xlP24ucmVxdWlyZWQ6bnVsbCkoImFyaWEtZGlzYWJsZWQiLG4uZGlzYWJsZWQudG9TdHJpbmcoKSkoImFyaWEtaW52YWxpZCIsbi5lcnJvclN0YXRlKSgiYXJpYS1tdWx0aXNlbGVjdGFibGUiLG4ubXVsdGlwbGUpKCJyb2xlIixuLnJvbGUpKCJhcmlhLW9yaWVudGF0aW9uIixuLmFyaWFPcmllbnRhdGlvbikscHUoIm1hdC1jaGlwLWxpc3QtZGlzYWJsZWQiLG4uZGlzYWJsZWQpKCJtYXQtY2hpcC1saXN0LWludmFsaWQiLG4uZXJyb3JTdGF0ZSkoIm1hdC1jaGlwLWxpc3QtcmVxdWlyZWQiLG4ucmVxdWlyZWQpKX0saW5wdXRzOnthcmlhT3JpZW50YXRpb246WyJhcmlhLW9yaWVudGF0aW9uIiwiYXJpYU9yaWVudGF0aW9uIl0sbXVsdGlwbGU6Im11bHRpcGxlIixjb21wYXJlV2l0aDoiY29tcGFyZVdpdGgiLHZhbHVlOiJ2YWx1ZSIscmVxdWlyZWQ6InJlcXVpcmVkIixwbGFjZWhvbGRlcjoicGxhY2Vob2xkZXIiLGRpc2FibGVkOiJkaXNhYmxlZCIsc2VsZWN0YWJsZToic2VsZWN0YWJsZSIsdGFiSW5kZXg6InRhYkluZGV4IixlcnJvclN0YXRlTWF0Y2hlcjoiZXJyb3JTdGF0ZU1hdGNoZXIifSxvdXRwdXRzOntjaGFuZ2U6ImNoYW5nZSIsdmFsdWVDaGFuZ2U6InZhbHVlQ2hhbmdlIn0sZXhwb3J0QXM6WyJtYXRDaGlwTGlzdCJdLGZlYXR1cmVzOltwZyhbe3Byb3ZpZGU6YlYsdXNlRXhpc3Rpbmc6UHl0fV0pLHhwXSxuZ0NvbnRlbnRTZWxlY3RvcnM6WyIqIl0sZGVjbHM6Mix2YXJzOjAsY29uc3RzOltbMSwibWF0LWNoaXAtbGlzdC13cmFwcGVyIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihabSgpLFJtKDAsImRpdiIsMCksWG0oMSksQW0oKSl9LHN0eWxlczpbJy5tYXQtY2hpcHtwb3NpdGlvbjpyZWxhdGl2ZTtib3gtc2l6aW5nOmJvcmRlci1ib3g7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApO2JvcmRlcjpub25lOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5tYXQtc3RhbmRhcmQtY2hpcHt0cmFuc2l0aW9uOmJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtkaXNwbGF5OmlubGluZS1mbGV4O3BhZGRpbmc6N3B4IDEycHg7Ym9yZGVyLXJhZGl1czoxNnB4O2FsaWduLWl0ZW1zOmNlbnRlcjtjdXJzb3I6ZGVmYXVsdDttaW4taGVpZ2h0OjMycHg7aGVpZ2h0OjFweH0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXN0YW5kYXJkLWNoaXB7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtc3RhbmRhcmQtY2hpcCAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29ue3dpZHRoOjE4cHg7aGVpZ2h0OjE4cHh9Lm1hdC1zdGFuZGFyZC1jaGlwOjphZnRlcnt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOmluaGVyaXQ7b3BhY2l0eTowO2NvbnRlbnQ6IiI7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHkgMjAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpfS5tYXQtc3RhbmRhcmQtY2hpcDpob3Zlcjo6YWZ0ZXJ7b3BhY2l0eTouMTJ9Lm1hdC1zdGFuZGFyZC1jaGlwOmZvY3Vze291dGxpbmU6bm9uZX0ubWF0LXN0YW5kYXJkLWNoaXA6Zm9jdXM6OmFmdGVye29wYWNpdHk6LjE2fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zdGFuZGFyZC1jaGlwe291dGxpbmU6c29saWQgMXB4fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zdGFuZGFyZC1jaGlwOmZvY3Vze291dGxpbmU6ZG90dGVkIDJweH0ubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtZGlzYWJsZWQ6OmFmdGVye29wYWNpdHk6MH0ubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtZGlzYWJsZWQgLm1hdC1jaGlwLXJlbW92ZSwubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtZGlzYWJsZWQgLm1hdC1jaGlwLXRyYWlsaW5nLWljb257Y3Vyc29yOmRlZmF1bHR9Lm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXdpdGgtdHJhaWxpbmctaWNvbi5tYXQtY2hpcC13aXRoLWF2YXRhciwubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtd2l0aC1hdmF0YXJ7cGFkZGluZy10b3A6MDtwYWRkaW5nLWJvdHRvbTowfS5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC13aXRoLXRyYWlsaW5nLWljb24ubWF0LWNoaXAtd2l0aC1hdmF0YXJ7cGFkZGluZy1yaWdodDo4cHg7cGFkZGluZy1sZWZ0OjB9W2Rpcj1ydGxdIC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC13aXRoLXRyYWlsaW5nLWljb24ubWF0LWNoaXAtd2l0aC1hdmF0YXJ7cGFkZGluZy1sZWZ0OjhweDtwYWRkaW5nLXJpZ2h0OjB9Lm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXdpdGgtdHJhaWxpbmctaWNvbntwYWRkaW5nLXRvcDo3cHg7cGFkZGluZy1ib3R0b206N3B4O3BhZGRpbmctcmlnaHQ6OHB4O3BhZGRpbmctbGVmdDoxMnB4fVtkaXI9cnRsXSAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtd2l0aC10cmFpbGluZy1pY29ue3BhZGRpbmctbGVmdDo4cHg7cGFkZGluZy1yaWdodDoxMnB4fS5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC13aXRoLWF2YXRhcntwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjEycHh9W2Rpcj1ydGxdIC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC13aXRoLWF2YXRhcntwYWRkaW5nLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjEycHh9Lm1hdC1zdGFuZGFyZC1jaGlwIC5tYXQtY2hpcC1hdmF0YXJ7d2lkdGg6MjRweDtoZWlnaHQ6MjRweDttYXJnaW4tcmlnaHQ6OHB4O21hcmdpbi1sZWZ0OjRweH1bZGlyPXJ0bF0gLm1hdC1zdGFuZGFyZC1jaGlwIC5tYXQtY2hpcC1hdmF0YXJ7bWFyZ2luLWxlZnQ6OHB4O21hcmdpbi1yaWdodDo0cHh9Lm1hdC1zdGFuZGFyZC1jaGlwIC5tYXQtY2hpcC1yZW1vdmUsLm1hdC1zdGFuZGFyZC1jaGlwIC5tYXQtY2hpcC10cmFpbGluZy1pY29ue3dpZHRoOjE4cHg7aGVpZ2h0OjE4cHg7Y3Vyc29yOnBvaW50ZXJ9Lm1hdC1zdGFuZGFyZC1jaGlwIC5tYXQtY2hpcC1yZW1vdmUsLm1hdC1zdGFuZGFyZC1jaGlwIC5tYXQtY2hpcC10cmFpbGluZy1pY29ue21hcmdpbi1sZWZ0OjhweDttYXJnaW4tcmlnaHQ6MH1bZGlyPXJ0bF0gLm1hdC1zdGFuZGFyZC1jaGlwIC5tYXQtY2hpcC1yZW1vdmUsW2Rpcj1ydGxdIC5tYXQtc3RhbmRhcmQtY2hpcCAubWF0LWNoaXAtdHJhaWxpbmctaWNvbnttYXJnaW4tcmlnaHQ6OHB4O21hcmdpbi1sZWZ0OjB9Lm1hdC1jaGlwLXJpcHBsZXt0b3A6MDtsZWZ0OjA7cmlnaHQ6MDtib3R0b206MDtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lO2JvcmRlci1yYWRpdXM6aW5oZXJpdDtvdmVyZmxvdzpoaWRkZW59Lm1hdC1jaGlwLWxpc3Qtd3JhcHBlcntkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW46LTRweH0ubWF0LWNoaXAtbGlzdC13cmFwcGVyIGlucHV0Lm1hdC1pbnB1dC1lbGVtZW50LC5tYXQtY2hpcC1saXN0LXdyYXBwZXIgLm1hdC1zdGFuZGFyZC1jaGlwe21hcmdpbjo0cHh9Lm1hdC1jaGlwLWxpc3Qtc3RhY2tlZCAubWF0LWNoaXAtbGlzdC13cmFwcGVye2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjthbGlnbi1pdGVtczpmbGV4LXN0YXJ0fS5tYXQtY2hpcC1saXN0LXN0YWNrZWQgLm1hdC1jaGlwLWxpc3Qtd3JhcHBlciAubWF0LXN0YW5kYXJkLWNoaXB7d2lkdGg6MTAwJX0ubWF0LWNoaXAtYXZhdGFye2JvcmRlci1yYWRpdXM6NTAlO2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtvdmVyZmxvdzpoaWRkZW47b2JqZWN0LWZpdDpjb3Zlcn1pbnB1dC5tYXQtY2hpcC1pbnB1dHt3aWR0aDoxNTBweDttYXJnaW46NHB4O2ZsZXg6MSAwIDE1MHB4fVxuJ10sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksUHl0LmN0b3JQYXJhbWV0ZXJzPSgpPT5be3R5cGU6aGd9LHt0eXBlOlVnfSx7dHlwZTpISSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTppVSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpQVSxkZWNvcmF0b3JzOlt7dHlwZTpTcn1dfSx7dHlwZTpiSH0se3R5cGU6TWosZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOkRyfV19XSxQeXQucHJvcERlY29yYXRvcnM9e2Vycm9yU3RhdGVNYXRjaGVyOlt7dHlwZTp4eX1dLG11bHRpcGxlOlt7dHlwZTp4eX1dLGNvbXBhcmVXaXRoOlt7dHlwZTp4eX1dLHZhbHVlOlt7dHlwZTp4eX1dLHJlcXVpcmVkOlt7dHlwZTp4eX1dLHBsYWNlaG9sZGVyOlt7dHlwZTp4eX1dLGRpc2FibGVkOlt7dHlwZTp4eX1dLGFyaWFPcmllbnRhdGlvbjpbe3R5cGU6eHksYXJnczpbImFyaWEtb3JpZW50YXRpb24iXX1dLHNlbGVjdGFibGU6W3t0eXBlOnh5fV0sdGFiSW5kZXg6W3t0eXBlOnh5fV0sY2hhbmdlOlt7dHlwZTpPeX1dLHZhbHVlQ2hhbmdlOlt7dHlwZTpPeX1dLGNoaXBzOlt7dHlwZTpZYSxhcmdzOltfeXQse2Rlc2NlbmRhbnRzOiEwfV19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChQeXQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWF0LWNoaXAtbGlzdCIsdGVtcGxhdGU6JzxkaXYgY2xhc3M9Im1hdC1jaGlwLWxpc3Qtd3JhcHBlciI+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PjwvZGl2PicsZXhwb3J0QXM6Im1hdENoaXBMaXN0Iixob3N0OnsiW2F0dHIudGFiaW5kZXhdIjoiZGlzYWJsZWQgPyBudWxsIDogX3RhYkluZGV4IiwiW2F0dHIuYXJpYS1kZXNjcmliZWRieV0iOiJfYXJpYURlc2NyaWJlZGJ5IHx8IG51bGwiLCJbYXR0ci5hcmlhLXJlcXVpcmVkXSI6InJvbGUgPyByZXF1aXJlZCA6IG51bGwiLCJbYXR0ci5hcmlhLWRpc2FibGVkXSI6ImRpc2FibGVkLnRvU3RyaW5nKCkiLCJbYXR0ci5hcmlhLWludmFsaWRdIjoiZXJyb3JTdGF0ZSIsIlthdHRyLmFyaWEtbXVsdGlzZWxlY3RhYmxlXSI6Im11bHRpcGxlIiwiW2F0dHIucm9sZV0iOiJyb2xlIiwiW2NsYXNzLm1hdC1jaGlwLWxpc3QtZGlzYWJsZWRdIjoiZGlzYWJsZWQiLCJbY2xhc3MubWF0LWNoaXAtbGlzdC1pbnZhbGlkXSI6ImVycm9yU3RhdGUiLCJbY2xhc3MubWF0LWNoaXAtbGlzdC1yZXF1aXJlZF0iOiJyZXF1aXJlZCIsIlthdHRyLmFyaWEtb3JpZW50YXRpb25dIjoiYXJpYU9yaWVudGF0aW9uIixjbGFzczoibWF0LWNoaXAtbGlzdCIsIihmb2N1cykiOiJmb2N1cygpIiwiKGJsdXIpIjoiX2JsdXIoKSIsIihrZXlkb3duKSI6Il9rZXlkb3duKCRldmVudCkiLCJbaWRdIjoiX3VpZCJ9LHByb3ZpZGVyczpbe3Byb3ZpZGU6YlYsdXNlRXhpc3Rpbmc6UHl0fV0sZW5jYXBzdWxhdGlvbjpIbi5Ob25lLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2gsc3R5bGVzOlsnLm1hdC1jaGlwe3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Ym9yZGVyLWJveDstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7Ym9yZGVyOm5vbmU7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9Lm1hdC1zdGFuZGFyZC1jaGlwe3RyYW5zaXRpb246Ym94LXNoYWRvdyAyODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO2Rpc3BsYXk6aW5saW5lLWZsZXg7cGFkZGluZzo3cHggMTJweDtib3JkZXItcmFkaXVzOjE2cHg7YWxpZ24taXRlbXM6Y2VudGVyO2N1cnNvcjpkZWZhdWx0O21pbi1oZWlnaHQ6MzJweDtoZWlnaHQ6MXB4fS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtc3RhbmRhcmQtY2hpcHt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC1zdGFuZGFyZC1jaGlwIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb257d2lkdGg6MThweDtoZWlnaHQ6MThweH0ubWF0LXN0YW5kYXJkLWNoaXA6OmFmdGVye3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6aW5oZXJpdDtvcGFjaXR5OjA7Y29udGVudDoiIjtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSAyMDBtcyBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSl9Lm1hdC1zdGFuZGFyZC1jaGlwOmhvdmVyOjphZnRlcntvcGFjaXR5Oi4xMn0ubWF0LXN0YW5kYXJkLWNoaXA6Zm9jdXN7b3V0bGluZTpub25lfS5tYXQtc3RhbmRhcmQtY2hpcDpmb2N1czo6YWZ0ZXJ7b3BhY2l0eTouMTZ9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXN0YW5kYXJkLWNoaXB7b3V0bGluZTpzb2xpZCAxcHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXN0YW5kYXJkLWNoaXA6Zm9jdXN7b3V0bGluZTpkb3R0ZWQgMnB4fS5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZDo6YWZ0ZXJ7b3BhY2l0eTowfS5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZCAubWF0LWNoaXAtcmVtb3ZlLC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZCAubWF0LWNoaXAtdHJhaWxpbmctaWNvbntjdXJzb3I6ZGVmYXVsdH0ubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtd2l0aC10cmFpbGluZy1pY29uLm1hdC1jaGlwLXdpdGgtYXZhdGFyLC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC13aXRoLWF2YXRhcntwYWRkaW5nLXRvcDowO3BhZGRpbmctYm90dG9tOjB9Lm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXdpdGgtdHJhaWxpbmctaWNvbi5tYXQtY2hpcC13aXRoLWF2YXRhcntwYWRkaW5nLXJpZ2h0OjhweDtwYWRkaW5nLWxlZnQ6MH1bZGlyPXJ0bF0gLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXdpdGgtdHJhaWxpbmctaWNvbi5tYXQtY2hpcC13aXRoLWF2YXRhcntwYWRkaW5nLWxlZnQ6OHB4O3BhZGRpbmctcmlnaHQ6MH0ubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtd2l0aC10cmFpbGluZy1pY29ue3BhZGRpbmctdG9wOjdweDtwYWRkaW5nLWJvdHRvbTo3cHg7cGFkZGluZy1yaWdodDo4cHg7cGFkZGluZy1sZWZ0OjEycHh9W2Rpcj1ydGxdIC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC13aXRoLXRyYWlsaW5nLWljb257cGFkZGluZy1sZWZ0OjhweDtwYWRkaW5nLXJpZ2h0OjEycHh9Lm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXdpdGgtYXZhdGFye3BhZGRpbmctbGVmdDowO3BhZGRpbmctcmlnaHQ6MTJweH1bZGlyPXJ0bF0gLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXdpdGgtYXZhdGFye3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MTJweH0ubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLWF2YXRhcnt3aWR0aDoyNHB4O2hlaWdodDoyNHB4O21hcmdpbi1yaWdodDo4cHg7bWFyZ2luLWxlZnQ6NHB4fVtkaXI9cnRsXSAubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLWF2YXRhcnttYXJnaW4tbGVmdDo4cHg7bWFyZ2luLXJpZ2h0OjRweH0ubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLXJlbW92ZSwubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb257d2lkdGg6MThweDtoZWlnaHQ6MThweDtjdXJzb3I6cG9pbnRlcn0ubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLXJlbW92ZSwubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb257bWFyZ2luLWxlZnQ6OHB4O21hcmdpbi1yaWdodDowfVtkaXI9cnRsXSAubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLXJlbW92ZSxbZGlyPXJ0bF0gLm1hdC1zdGFuZGFyZC1jaGlwIC5tYXQtY2hpcC10cmFpbGluZy1pY29ue21hcmdpbi1yaWdodDo4cHg7bWFyZ2luLWxlZnQ6MH0ubWF0LWNoaXAtcmlwcGxle3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOm5vbmU7Ym9yZGVyLXJhZGl1czppbmhlcml0O292ZXJmbG93OmhpZGRlbn0ubWF0LWNoaXAtbGlzdC13cmFwcGVye2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7ZmxleC13cmFwOndyYXA7YWxpZ24taXRlbXM6Y2VudGVyO21hcmdpbjotNHB4fS5tYXQtY2hpcC1saXN0LXdyYXBwZXIgaW5wdXQubWF0LWlucHV0LWVsZW1lbnQsLm1hdC1jaGlwLWxpc3Qtd3JhcHBlciAubWF0LXN0YW5kYXJkLWNoaXB7bWFyZ2luOjRweH0ubWF0LWNoaXAtbGlzdC1zdGFja2VkIC5tYXQtY2hpcC1saXN0LXdyYXBwZXJ7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOmZsZXgtc3RhcnR9Lm1hdC1jaGlwLWxpc3Qtc3RhY2tlZCAubWF0LWNoaXAtbGlzdC13cmFwcGVyIC5tYXQtc3RhbmRhcmQtY2hpcHt3aWR0aDoxMDAlfS5tYXQtY2hpcC1hdmF0YXJ7Ym9yZGVyLXJhZGl1czo1MCU7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O292ZXJmbG93OmhpZGRlbjtvYmplY3QtZml0OmNvdmVyfWlucHV0Lm1hdC1jaGlwLWlucHV0e3dpZHRoOjE1MHB4O21hcmdpbjo0cHg7ZmxleDoxIDAgMTUwcHh9XG4nXX1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmhnfSx7dHlwZTpVZ30se3R5cGU6SEksZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6aVUsZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6UFUsZGVjb3JhdG9yczpbe3R5cGU6U3J9XX0se3R5cGU6Ykh9LHt0eXBlOk1qLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTpEcn1dfV19KSx7YXJpYU9yaWVudGF0aW9uOlt7dHlwZTp4eSxhcmdzOlsiYXJpYS1vcmllbnRhdGlvbiJdfV0sY2hhbmdlOlt7dHlwZTpPeX1dLHZhbHVlQ2hhbmdlOlt7dHlwZTpPeX1dLG11bHRpcGxlOlt7dHlwZTp4eX1dLGNvbXBhcmVXaXRoOlt7dHlwZTp4eX1dLHZhbHVlOlt7dHlwZTp4eX1dLHJlcXVpcmVkOlt7dHlwZTp4eX1dLHBsYWNlaG9sZGVyOlt7dHlwZTp4eX1dLGRpc2FibGVkOlt7dHlwZTp4eX1dLHNlbGVjdGFibGU6W3t0eXBlOnh5fV0sdGFiSW5kZXg6W3t0eXBlOnh5fV0sZXJyb3JTdGF0ZU1hdGNoZXI6W3t0eXBlOnh5fV0sY2hpcHM6W3t0eXBlOllhLGFyZ3M6W195dCx7ZGVzY2VuZGFudHM6ITB9XX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpsZXQgd3l0PTA7Y2xhc3Mga3l0e2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5fZWxlbWVudFJlZj10LHRoaXMuX2RlZmF1bHRPcHRpb25zPWUsdGhpcy5mb2N1c2VkPSExLHRoaXMuX2FkZE9uQmx1cj0hMSx0aGlzLnNlcGFyYXRvcktleUNvZGVzPXRoaXMuX2RlZmF1bHRPcHRpb25zLnNlcGFyYXRvcktleUNvZGVzLHRoaXMuY2hpcEVuZD1uZXcgTGgsdGhpcy5wbGFjZWhvbGRlcj0iIix0aGlzLmlkPSJtYXQtY2hpcC1saXN0LWlucHV0LSIrd3l0KyssdGhpcy5fZGlzYWJsZWQ9ITEsdGhpcy5pbnB1dEVsZW1lbnQ9dGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50fXNldCBjaGlwTGlzdCh0KXt0JiYodGhpcy5fY2hpcExpc3Q9dCx0aGlzLl9jaGlwTGlzdC5yZWdpc3RlcklucHV0KHRoaXMpKX1nZXQgYWRkT25CbHVyKCl7cmV0dXJuIHRoaXMuX2FkZE9uQmx1cn1zZXQgYWRkT25CbHVyKHQpe3RoaXMuX2FkZE9uQmx1cj15eih0KX1nZXQgZGlzYWJsZWQoKXtyZXR1cm4gdGhpcy5fZGlzYWJsZWR8fHRoaXMuX2NoaXBMaXN0JiZ0aGlzLl9jaGlwTGlzdC5kaXNhYmxlZH1zZXQgZGlzYWJsZWQodCl7dGhpcy5fZGlzYWJsZWQ9eXoodCl9Z2V0IGVtcHR5KCl7cmV0dXJuIXRoaXMuaW5wdXRFbGVtZW50LnZhbHVlfW5nT25DaGFuZ2VzKCl7dGhpcy5fY2hpcExpc3Quc3RhdGVDaGFuZ2VzLm5leHQoKX1uZ09uRGVzdHJveSgpe3RoaXMuY2hpcEVuZC5jb21wbGV0ZSgpfW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX2ZvY3VzTGFzdENoaXBPbkJhY2tzcGFjZT10aGlzLmVtcHR5fV9rZXlkb3duKHQpe2lmKHQpe2lmKDkhPT10LmtleUNvZGV8fGJ6KHQsInNoaWZ0S2V5Iil8fHRoaXMuX2NoaXBMaXN0Ll9hbGxvd0ZvY3VzRXNjYXBlKCksOD09PXQua2V5Q29kZSYmdGhpcy5fZm9jdXNMYXN0Q2hpcE9uQmFja3NwYWNlKXJldHVybiB0aGlzLl9jaGlwTGlzdC5fa2V5TWFuYWdlci5zZXRMYXN0SXRlbUFjdGl2ZSgpLHZvaWQgdC5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2ZvY3VzTGFzdENoaXBPbkJhY2tzcGFjZT0hMX10aGlzLl9lbWl0Q2hpcEVuZCh0KX1fa2V5dXAodCl7IXRoaXMuX2ZvY3VzTGFzdENoaXBPbkJhY2tzcGFjZSYmOD09PXQua2V5Q29kZSYmdGhpcy5lbXB0eSYmKHRoaXMuX2ZvY3VzTGFzdENoaXBPbkJhY2tzcGFjZT0hMCx0LnByZXZlbnREZWZhdWx0KCkpfV9ibHVyKCl7dGhpcy5hZGRPbkJsdXImJnRoaXMuX2VtaXRDaGlwRW5kKCksdGhpcy5mb2N1c2VkPSExLHRoaXMuX2NoaXBMaXN0LmZvY3VzZWR8fHRoaXMuX2NoaXBMaXN0Ll9ibHVyKCksdGhpcy5fY2hpcExpc3Quc3RhdGVDaGFuZ2VzLm5leHQoKX1fZm9jdXMoKXt0aGlzLmZvY3VzZWQ9ITAsdGhpcy5fZm9jdXNMYXN0Q2hpcE9uQmFja3NwYWNlPXRoaXMuZW1wdHksdGhpcy5fY2hpcExpc3Quc3RhdGVDaGFuZ2VzLm5leHQoKX1fZW1pdENoaXBFbmQodCl7IXRoaXMuaW5wdXRFbGVtZW50LnZhbHVlJiZ0JiZ0aGlzLl9jaGlwTGlzdC5fa2V5ZG93bih0KSx0JiYhdGhpcy5faXNTZXBhcmF0b3JLZXkodCl8fCh0aGlzLmNoaXBFbmQuZW1pdCh7aW5wdXQ6dGhpcy5pbnB1dEVsZW1lbnQsdmFsdWU6dGhpcy5pbnB1dEVsZW1lbnQudmFsdWUsY2hpcElucHV0OnRoaXN9KSxudWxsPT10fHx0LnByZXZlbnREZWZhdWx0KCkpfV9vbklucHV0KCl7dGhpcy5fY2hpcExpc3Quc3RhdGVDaGFuZ2VzLm5leHQoKX1mb2N1cyh0KXt0aGlzLmlucHV0RWxlbWVudC5mb2N1cyh0KX1jbGVhcigpe3RoaXMuaW5wdXRFbGVtZW50LnZhbHVlPSIiLHRoaXMuX2ZvY3VzTGFzdENoaXBPbkJhY2tzcGFjZT0hMH1faXNTZXBhcmF0b3JLZXkodCl7cmV0dXJuIWJ6KHQpJiZuZXcgU2V0KHRoaXMuc2VwYXJhdG9yS2V5Q29kZXMpLmhhcyh0LmtleUNvZGUpfX1reXQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGt5dCkoU20oaGcpLFNtKE15dCkpfSxreXQuybVkaXI9bG8oe3R5cGU6a3l0LHNlbGVjdG9yczpbWyJpbnB1dCIsIm1hdENoaXBJbnB1dEZvciIsIiJdXSxob3N0QXR0cnM6WzEsIm1hdC1jaGlwLWlucHV0IiwibWF0LWlucHV0LWVsZW1lbnQiXSxob3N0VmFyczo1LGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgia2V5ZG93biIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX2tleWRvd24oZSl9KSkoImtleXVwIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5fa2V5dXAoZSl9KSkoImJsdXIiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX2JsdXIoKX0pKSgiZm9jdXMiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uX2ZvY3VzKCl9KSkoImlucHV0IiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9vbklucHV0KCl9KSksMiZlJiYoVHUoImlkIixuLmlkKSxqcCgiZGlzYWJsZWQiLG4uZGlzYWJsZWR8fG51bGwpKCJwbGFjZWhvbGRlciIsbi5wbGFjZWhvbGRlcnx8bnVsbCkoImFyaWEtaW52YWxpZCIsbi5fY2hpcExpc3QmJm4uX2NoaXBMaXN0Lm5nQ29udHJvbD9uLl9jaGlwTGlzdC5uZ0NvbnRyb2wuaW52YWxpZDpudWxsKSgiYXJpYS1yZXF1aXJlZCIsbi5fY2hpcExpc3QmJm4uX2NoaXBMaXN0LnJlcXVpcmVkfHxudWxsKSl9LGlucHV0czp7c2VwYXJhdG9yS2V5Q29kZXM6WyJtYXRDaGlwSW5wdXRTZXBhcmF0b3JLZXlDb2RlcyIsInNlcGFyYXRvcktleUNvZGVzIl0scGxhY2Vob2xkZXI6InBsYWNlaG9sZGVyIixpZDoiaWQiLGNoaXBMaXN0OlsibWF0Q2hpcElucHV0Rm9yIiwiY2hpcExpc3QiXSxhZGRPbkJsdXI6WyJtYXRDaGlwSW5wdXRBZGRPbkJsdXIiLCJhZGRPbkJsdXIiXSxkaXNhYmxlZDoiZGlzYWJsZWQifSxvdXRwdXRzOntjaGlwRW5kOiJtYXRDaGlwSW5wdXRUb2tlbkVuZCJ9LGV4cG9ydEFzOlsibWF0Q2hpcElucHV0IiwibWF0Q2hpcElucHV0Rm9yIl0sZmVhdHVyZXM6W0JvXX0pLGt5dC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbTXl0XX1dfV0sa3l0LnByb3BEZWNvcmF0b3JzPXtjaGlwTGlzdDpbe3R5cGU6eHksYXJnczpbIm1hdENoaXBJbnB1dEZvciJdfV0sYWRkT25CbHVyOlt7dHlwZTp4eSxhcmdzOlsibWF0Q2hpcElucHV0QWRkT25CbHVyIl19XSxzZXBhcmF0b3JLZXlDb2Rlczpbe3R5cGU6eHksYXJnczpbIm1hdENoaXBJbnB1dFNlcGFyYXRvcktleUNvZGVzIl19XSxjaGlwRW5kOlt7dHlwZTpPeSxhcmdzOlsibWF0Q2hpcElucHV0VG9rZW5FbmQiXX1dLHBsYWNlaG9sZGVyOlt7dHlwZTp4eX1dLGlkOlt7dHlwZTp4eX1dLGRpc2FibGVkOlt7dHlwZTp4eX1dfSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGt5dCxbe3R5cGU6Q3ksYXJnczpbe3NlbGVjdG9yOiJpbnB1dFttYXRDaGlwSW5wdXRGb3JdIixleHBvcnRBczoibWF0Q2hpcElucHV0LCBtYXRDaGlwSW5wdXRGb3IiLGhvc3Q6e2NsYXNzOiJtYXQtY2hpcC1pbnB1dCBtYXQtaW5wdXQtZWxlbWVudCIsIihrZXlkb3duKSI6Il9rZXlkb3duKCRldmVudCkiLCIoa2V5dXApIjoiX2tleXVwKCRldmVudCkiLCIoYmx1cikiOiJfYmx1cigpIiwiKGZvY3VzKSI6Il9mb2N1cygpIiwiKGlucHV0KSI6Il9vbklucHV0KCkiLCJbaWRdIjoiaWQiLCJbYXR0ci5kaXNhYmxlZF0iOiJkaXNhYmxlZCB8fCBudWxsIiwiW2F0dHIucGxhY2Vob2xkZXJdIjoicGxhY2Vob2xkZXIgfHwgbnVsbCIsIlthdHRyLmFyaWEtaW52YWxpZF0iOiJfY2hpcExpc3QgJiYgX2NoaXBMaXN0Lm5nQ29udHJvbCA/IF9jaGlwTGlzdC5uZ0NvbnRyb2wuaW52YWxpZCA6IG51bGwiLCJbYXR0ci5hcmlhLXJlcXVpcmVkXSI6Il9jaGlwTGlzdCAmJiBfY2hpcExpc3QucmVxdWlyZWQgfHwgbnVsbCJ9fV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6aGd9LHt0eXBlOnZvaWQgMCxkZWNvcmF0b3JzOlt7dHlwZTprcixhcmdzOltNeXRdfV19XX0pLHtzZXBhcmF0b3JLZXlDb2Rlczpbe3R5cGU6eHksYXJnczpbIm1hdENoaXBJbnB1dFNlcGFyYXRvcktleUNvZGVzIl19XSxjaGlwRW5kOlt7dHlwZTpPeSxhcmdzOlsibWF0Q2hpcElucHV0VG9rZW5FbmQiXX1dLHBsYWNlaG9sZGVyOlt7dHlwZTp4eX1dLGlkOlt7dHlwZTp4eX1dLGNoaXBMaXN0Olt7dHlwZTp4eSxhcmdzOlsibWF0Q2hpcElucHV0Rm9yIl19XSxhZGRPbkJsdXI6W3t0eXBlOnh5LGFyZ3M6WyJtYXRDaGlwSW5wdXRBZGRPbkJsdXIiXX1dLGRpc2FibGVkOlt7dHlwZTp4eX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBTeXQ9W1B5dCxfeXQsa3l0LEN5dCxieXQseXl0XSxEeXQ9e3NlcGFyYXRvcktleUNvZGVzOlttel19O2NsYXNzIEV5dHt9RXl0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxFeXQpfSxFeXQuybVtb2Q9YW8oe3R5cGU6RXl0fSksRXl0Lsm1aW5qPXZuKHtwcm92aWRlcnM6W2JILHtwcm92aWRlOk15dCx1c2VWYWx1ZTpEeXR9XSxpbXBvcnRzOltbWEldXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoRXl0LFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbWEldLGV4cG9ydHM6U3l0LGRlY2xhcmF0aW9uczpTeXQscHJvdmlkZXJzOltiSCx7cHJvdmlkZTpNeXQsdXNlVmFsdWU6RHl0fV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhFeXQse2RlY2xhcmF0aW9uczpmdW5jdGlvbigpe3JldHVybltQeXQsX3l0LGt5dCxDeXQsYnl0LHl5dF19LGltcG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bWEldfSxleHBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW1B5dCxfeXQsa3l0LEN5dCxieXQseXl0XX19KTtjb25zdCBSeXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm57ImVtYmVkZGluZy1zZWxlY3RlZCI6dCwiZW1iZWRkaW5nLXVuc2VsZWN0ZWQiOmV9fTtmdW5jdGlvbiBBeXQodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJtYXQtaWNvbiIsNSksVm0oImNsaWNrIiwoZnVuY3Rpb24gZSgpe2hpKHQpO2NvbnN0IG49WW0oKTtyZXR1cm4gbi5vblNlbGVjdC5lbWl0KG4ubWV0cmljKX0pKSxBbSgpfWlmKDImdCl7Y29uc3QgdD1ZbSgpO0RtKCJuZ0NsYXNzIix2aCgxLFJ5dCx0LmVtYmVkZGluZ3NNZXRyaWM9PT10Lm1ldHJpYyx0LmVtYmVkZGluZ3NNZXRyaWMhPT10Lm1ldHJpYykpfX1jb25zdCBUeXQ9ZnVuY3Rpb24odCl7cmV0dXJue3dpZHRoOnR9fSxOeXQ9ZnVuY3Rpb24odCl7cmV0dXJueyJ2YWx1ZS1pbnZhbGlkIjp0fX07Y2xhc3Mgenl0e2NvbnN0cnVjdG9yKCl7dGhpcy5vblJlbW92ZT1uZXcgTGgsdGhpcy5vblNlbGVjdD1uZXcgTGgsdGhpcy5vbkZpbHRlckNoYW5nZT1uZXcgTGgsdGhpcy5mb2N1c01pbj0hMSx0aGlzLmZvY3VzTWF4PSExLHRoaXMubmdVbnN1YnNjcmliZT1uZXcgSX1uZ09uSW5pdCgpe3RoaXMubWluRm9ybUNvbnRyb2w9bmV3ICRqKHRoaXMuZmlsdGVyVmFsdWVzLm1pbixbcVYucmVxdWlyZWQscVYubWluKC0xKSxxVi5tYXgoMSksdGhpcy5taW5WYWx1ZVZhbGlkYXRvci5iaW5kKHRoaXMpXSksdGhpcy5tYXhGb3JtQ29udHJvbD1uZXcgJGoodGhpcy5maWx0ZXJWYWx1ZXMubWF4LFtxVi5yZXF1aXJlZCxxVi5taW4oLTEpLHFWLm1heCgxKSx0aGlzLm1heFZhbHVlVmFsaWRhdG9yLmJpbmQodGhpcyldKSx0aGlzLm1pbkZvcm1Db250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKEllKHRoaXMubmdVbnN1YnNjcmliZSkpLnN1YnNjcmliZSgoKCk9Pnt0aGlzLm1pbkZvcm1Db250cm9sLnZhbGlkJiZ0aGlzLm1heEZvcm1Db250cm9sLnZhbGlkJiZ0aGlzLm9uRmlsdGVyQ2hhbmdlLmVtaXQoe21pbjpwYXJzZUZsb2F0KHRoaXMubWluRm9ybUNvbnRyb2wudmFsdWUpLG1heDpwYXJzZUZsb2F0KHRoaXMubWF4Rm9ybUNvbnRyb2wudmFsdWUpfSl9KSksdGhpcy5tYXhGb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShJZSh0aGlzLm5nVW5zdWJzY3JpYmUpKS5zdWJzY3JpYmUoKCgpPT57dGhpcy5taW5Gb3JtQ29udHJvbC52YWxpZCYmdGhpcy5tYXhGb3JtQ29udHJvbC52YWxpZCYmdGhpcy5vbkZpbHRlckNoYW5nZS5lbWl0KHttaW46cGFyc2VGbG9hdCh0aGlzLm1pbkZvcm1Db250cm9sLnZhbHVlKSxtYXg6cGFyc2VGbG9hdCh0aGlzLm1heEZvcm1Db250cm9sLnZhbHVlKX0pfSkpfW5nT25DaGFuZ2VzKHQpe3RoaXMubWluRm9ybUNvbnRyb2wmJnRoaXMubWF4Rm9ybUNvbnRyb2wmJih0aGlzLm1pbkZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuZmlsdGVyVmFsdWVzLm1pbix7ZW1pdEV2ZW50OiExfSksdGhpcy5tYXhGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmZpbHRlclZhbHVlcy5tYXgse2VtaXRFdmVudDohMX0pKX1uZ09uRGVzdHJveSgpe3RoaXMubmdVbnN1YnNjcmliZS5uZXh0KCksdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCl9bWluVmFsdWVWYWxpZGF0b3IodCl7cmV0dXJuIHRoaXMubWF4Rm9ybUNvbnRyb2wmJiJOYU4iIT09dC52YWx1ZT9pc05hTihwYXJzZUZsb2F0KHQudmFsdWUpKT97dmFsdWU6InRoZSBzdHJpbmcgeW91IGVudGVyZWQgaXMgbmVpdGhlciBOYU4gbm9yIGEgbnVtYmVyIn06cGFyc2VGbG9hdCh0LnZhbHVlKT5wYXJzZUZsb2F0KHRoaXMubWF4Rm9ybUNvbnRyb2wudmFsdWUpP3t2YWx1ZToidGhlIG51bWJlciB5b3UgZW50ZXJlZCBpcyBsYXJnZXIgdGhhbiB0aGUgbWF4IHZhbHVlIn06bnVsbDpudWxsfW1heFZhbHVlVmFsaWRhdG9yKHQpe3JldHVybiB0aGlzLm1pbkZvcm1Db250cm9sPyJOYU4iPT09dGhpcy5taW5Gb3JtQ29udHJvbC52YWx1ZSYmIk5hTiI9PT10LnZhbHVlP251bGw6aXNOYU4ocGFyc2VGbG9hdCh0LnZhbHVlKSk/e3ZhbHVlOiJ0aGUgc3RyaW5nIHlvdSBlbnRlcmVkIGlzIG5laXRoZXIgTmFOIG5vciBhIG51bWJlciJ9OnQudmFsdWU8dGhpcy5taW5Gb3JtQ29udHJvbC52YWx1ZT97dmFsdWU6InRoZSBudW1iZXIgeW91IGVudGVyZWQgaXMgc21hbGxlciB0aGFuIHRoZSBtaW4gdmFsdWUifTpudWxsOm51bGx9Z2V0RXJyb3JEZXNjcmlwdGlvbih0KXtpZih0KXtjb25zdCBlPU9iamVjdC5rZXlzKHQpWzBdO3JldHVybiJyZXF1aXJlZCI9PT1lPyJ5b3UgZGlkIG5vdCBlbnRlciBhbnl0aGluZyI6Im1pbiI9PT1lPyJ0aGUgbnVtYmVyIG11c3QgYmUgYXQgbGVhc3QgLTEuMCI6Im1heCI9PT1lPyJ0aGUgbnVtYmVyIGlzIGJpZ2dlciB0aGFuIDEuMCI6dFtlXX1yZXR1cm4iIn19enl0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx6eXQpfSx6eXQuybVjbXA9dG8oe3R5cGU6enl0LHNlbGVjdG9yczpbWyJtZXRyaWMtYXJpdGhtZXRpYy1lbGVtZW50LWNvbXBvbmVudCJdXSxpbnB1dHM6e21ldHJpYzoibWV0cmljIixmaWx0ZXJWYWx1ZXM6ImZpbHRlclZhbHVlcyIsaGFzRW1iZWRkaW5nc0RhdGE6Imhhc0VtYmVkZGluZ3NEYXRhIixlbWJlZGRpbmdzTWV0cmljOiJlbWJlZGRpbmdzTWV0cmljIn0sb3V0cHV0czp7b25SZW1vdmU6Im9uUmVtb3ZlIixvblNlbGVjdDoib25TZWxlY3QiLG9uRmlsdGVyQ2hhbmdlOiJvbkZpbHRlckNoYW5nZSJ9LGZlYXR1cmVzOltCb10sZGVjbHM6MTAsdmFyczoyMixjb25zdHM6W1sxLCJmaWx0ZXItY2hpcCIsMywicmVtb3ZlZCJdLFsiY2xhc3MiLCJlbWJlZGRpbmdzLWJ1dHRvbiIsInN2Z0ljb24iLCJncm91cF93b3JrXzI0cHgiLDMsIm5nQ2xhc3MiLCJjbGljayIsNCwibmdJZiJdLFsxLCJtZXRyaWMtYXJpdGhtZXRpYy1lbGVtZW50LXJhbmdlIiwzLCJrZXlkb3duIl0sWyJtYXRJbnB1dCIsIiIsMSwiaW5wdXQtZmllbGQiLDMsInZhbHVlIiwibWF0VG9vbHRpcCIsIm1hdFRvb2x0aXBEaXNhYmxlZCIsIm5nU3R5bGUiLCJuZ0NsYXNzIiwiZm9ybUNvbnRyb2wiLCJmb2N1cyIsImZvY3Vzb3V0Il0sWyJtYXRDaGlwUmVtb3ZlIiwiIiwic3ZnSWNvbiIsImNhbmNlbF8yNHB4Il0sWyJzdmdJY29uIiwiZ3JvdXBfd29ya18yNHB4IiwxLCJlbWJlZGRpbmdzLWJ1dHRvbiIsMywibmdDbGFzcyIsImNsaWNrIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJtYXQtY2hpcCIsMCksVm0oInJlbW92ZWQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25SZW1vdmUuZW1pdChuLm1ldHJpYyl9KSksUXAoMSxBeXQsMSw0LCJtYXQtaWNvbiIsMSksa3UoMiksUm0oMywiZGl2IiwyKSxWbSgia2V5ZG93biIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIGUuc3RvcFByb3BhZ2F0aW9uKCl9KSksa3UoNCwiIFsgIiksUm0oNSwiaW5wdXQiLDMpLFZtKCJmb2N1cyIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5mb2N1c01pbj0hMH0pKSgiZm9jdXNvdXQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uZm9jdXNNaW49ITF9KSksQW0oKSxrdSg2LCIgOyAiKSxSbSg3LCJpbnB1dCIsMyksVm0oImZvY3VzIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLmZvY3VzTWF4PSEwfSkpKCJmb2N1c291dCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5mb2N1c01heD0hMX0pKSxBbSgpLGt1KDgsIiBdICIpLEFtKCksVG0oOSwibWF0LWljb24iLDQpLEFtKCkpLDImZSYmKHJjKDEpLERtKCJuZ0lmIixuLmhhc0VtYmVkZGluZ3NEYXRhKSxyYygxKSxEdSgiICIsbi5tZXRyaWMsIiAiKSxyYygzKSxEbSgidmFsdWUiLG4uZmlsdGVyVmFsdWVzLm1pbikoIm1hdFRvb2x0aXAiLG4uZ2V0RXJyb3JEZXNjcmlwdGlvbihuLm1pbkZvcm1Db250cm9sLmVycm9ycykpKCJtYXRUb29sdGlwRGlzYWJsZWQiLCFuLm1pbkZvcm1Db250cm9sLmludmFsaWQpKCJuZ1N0eWxlIixNaCgxNCxUeXQsbi5mb2N1c01pbj8iMTAwcHgiOm4ubWluRm9ybUNvbnRyb2wudmFsdWUudG9TdHJpbmcoKS5sZW5ndGgrImNoIikpKCJuZ0NsYXNzIixNaCgxNixOeXQsIW4ubWluRm9ybUNvbnRyb2wudmFsaWQpKSgiZm9ybUNvbnRyb2wiLG4ubWluRm9ybUNvbnRyb2wpLHJjKDIpLERtKCJ2YWx1ZSIsbi5maWx0ZXJWYWx1ZXMubWF4KSgibWF0VG9vbHRpcCIsbi5nZXRFcnJvckRlc2NyaXB0aW9uKG4ubWF4Rm9ybUNvbnRyb2wuZXJyb3JzKSkoIm1hdFRvb2x0aXBEaXNhYmxlZCIsIW4ubWF4Rm9ybUNvbnRyb2wuaW52YWxpZCkoIm5nU3R5bGUiLE1oKDE4LFR5dCxuLmZvY3VzTWF4PyIxMDBweCI6bi5tYXhGb3JtQ29udHJvbC52YWx1ZS50b1N0cmluZygpLmxlbmd0aCsiY2giKSkoIm5nQ2xhc3MiLE1oKDIwLE55dCwhbi5tYXhGb3JtQ29udHJvbC52YWxpZCkpKCJmb3JtQ29udHJvbCIsbi5tYXhGb3JtQ29udHJvbCkpfSxkaXJlY3RpdmVzOltfeXQsZE0sVlYsRlEsQ00sYU0seGoseFUsRFcsQ3l0XSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0uZmlsdGVyLWNoaXBbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7bWFyZ2luLWxlZnQ6NXB4fS5tZXRyaWMtYXJpdGhtZXRpYy1lbGVtZW50LXJhbmdlW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjojZmZmO2ZvbnQtc2l6ZTouOGVtO2hlaWdodDozMHB4O2p1c3RpZnktY29udGVudDpjZW50ZXI7bGluZS1oZWlnaHQ6MzBweDtwYWRkaW5nOjAgNXB4O21hcmdpbi1sZWZ0OjVweH0uaW5wdXQtZmllbGRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyOm5vbmU7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToxLjFlbTt0cmFuc2l0aW9uOndpZHRoIDFzfS5pbnB1dC1maWVsZFtfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMik7Ym9yZGVyOm5vbmU7b3V0bGluZTpub25lfS52YWx1ZS1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5lbWJlZGRpbmctc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDA7b3BhY2l0eToxfS5lbWJlZGRpbmctdW5zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNH0uZW1iZWRkaW5ncy1idXR0b25bX25nY29udGVudC0lQ09NUCVde3dpZHRoOjE4cHg7aGVpZ2h0OjE4cHg7bWFyZ2luLXJpZ2h0OjhweDtjdXJzb3I6cG9pbnRlcn0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoenl0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1ldHJpYy1hcml0aG1ldGljLWVsZW1lbnQtY29tcG9uZW50Iix0ZW1wbGF0ZVVybDoiLi9tZXRyaWNfYXJpdGhtZXRpY19lbGVtZW50X2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyIuL21ldHJpY19hcml0aG1ldGljX2VsZW1lbnRfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse21ldHJpYzpbe3R5cGU6eHl9XSxmaWx0ZXJWYWx1ZXM6W3t0eXBlOnh5fV0saGFzRW1iZWRkaW5nc0RhdGE6W3t0eXBlOnh5fV0sZW1iZWRkaW5nc01ldHJpYzpbe3R5cGU6eHl9XSxvblJlbW92ZTpbe3R5cGU6T3l9XSxvblNlbGVjdDpbe3R5cGU6T3l9XSxvbkZpbHRlckNoYW5nZTpbe3R5cGU6T3l9XX0pO2NsYXNzIEl5dHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5maWx0ZXJWYWx1ZXMkPXRoaXMuc3RvcmUucGlwZShGdyhnYnQpKS5waXBlKEl0KCh0PT57Y29uc3QgZT10W3RoaXMubWV0cmljXTtyZXR1cm4gZT97bWluOmUuaW5jbHVkZU5hTj8iTmFOIjp0aGlzLnJvdW5kVG9UaHJlZURlY2ltYWxQb2ludHMoZS5taW4pLG1heDplLm1heDxlLm1pbj8iTmFOIjp0aGlzLnJvdW5kVG9UaHJlZURlY2ltYWxQb2ludHMoZS5tYXgpfTp7bWluOi0xLG1heDoxfX0pKSksdGhpcy5oYXNFbWJlZGRpbmdzRGF0YSQ9dGhpcy5zdG9yZS5waXBlKEZ3KGxidCkpLnBpcGUoSXQoKHQ9PnZvaWQgMCE9PXQpKSksdGhpcy5lbWJlZGRpbmdzTWV0cmljJD10aGlzLnN0b3JlLnBpcGUoRncoT2J0KSl9cmVtb3ZlKHQpe3RoaXMuc3RvcmUuZGlzcGF0Y2goTGJ0KHttZXRyaWM6dH0pKX1zZWxlY3QodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChaYnQoe21ldHJpYzp0fSkpfWZpbHRlckNoYW5nZSh0KXtjb25zdCBlPWlzTmFOKHQubWluKT8tMTp0Lm1pbixuPWlzTmFOKHQubWF4KT8tMjp0Lm1heCxvPWlzTmFOKHQubWluKTt0aGlzLnN0b3JlLmRpc3BhdGNoKEJidCh7bWV0cmljOnRoaXMubWV0cmljLG1heDpuLG1pbjplLGluY2x1ZGVOYU46b30pKX1yb3VuZFRvVGhyZWVEZWNpbWFsUG9pbnRzKHQpe3JldHVybiBNYXRoLnJvdW5kKDFlMyoodCtOdW1iZXIuRVBTSUxPTikpLzFlM319SXl0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxJeXQpKFNtKEl3KSl9LEl5dC7JtWNtcD10byh7dHlwZTpJeXQsc2VsZWN0b3JzOltbIm5wbWktbWV0cmljLWFyaXRobWV0aWMtZWxlbWVudCJdXSxpbnB1dHM6e21ldHJpYzoibWV0cmljIn0sZGVjbHM6NCx2YXJzOjEwLGNvbnN0czpbWzMsIm1ldHJpYyIsImZpbHRlclZhbHVlcyIsImhhc0VtYmVkZGluZ3NEYXRhIiwiZW1iZWRkaW5nc01ldHJpYyIsIm9uUmVtb3ZlIiwib25TZWxlY3QiLCJvbkZpbHRlckNoYW5nZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwibWV0cmljLWFyaXRobWV0aWMtZWxlbWVudC1jb21wb25lbnQiLDApLFZtKCJvblJlbW92ZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ucmVtb3ZlKGUpfSkpKCJvblNlbGVjdCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uc2VsZWN0KGUpfSkpKCJvbkZpbHRlckNoYW5nZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uZmlsdGVyQ2hhbmdlKGUpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBaCgzLCJhc3luYyIpLEFtKCkpLDImZSYmRG0oIm1ldHJpYyIsbi5tZXRyaWMpKCJmaWx0ZXJWYWx1ZXMiLFRoKDEsNCxuLmZpbHRlclZhbHVlcyQpKSgiaGFzRW1iZWRkaW5nc0RhdGEiLFRoKDIsNixuLmhhc0VtYmVkZGluZ3NEYXRhJCkpKCJlbWJlZGRpbmdzTWV0cmljIixUaCgzLDgsbi5lbWJlZGRpbmdzTWV0cmljJCkpfSxkaXJlY3RpdmVzOlt6eXRdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChJeXQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibnBtaS1tZXRyaWMtYXJpdGhtZXRpYy1lbGVtZW50Iix0ZW1wbGF0ZTonXG4gICAgPG1ldHJpYy1hcml0aG1ldGljLWVsZW1lbnQtY29tcG9uZW50XG4gICAgICBbbWV0cmljXT0ibWV0cmljIlxuICAgICAgW2ZpbHRlclZhbHVlc109ImZpbHRlclZhbHVlcyQgfCBhc3luYyJcbiAgICAgIFtoYXNFbWJlZGRpbmdzRGF0YV09Imhhc0VtYmVkZGluZ3NEYXRhJCB8IGFzeW5jIlxuICAgICAgW2VtYmVkZGluZ3NNZXRyaWNdPSJlbWJlZGRpbmdzTWV0cmljJCB8IGFzeW5jIlxuICAgICAgKG9uUmVtb3ZlKT0icmVtb3ZlKCRldmVudCkiXG4gICAgICAob25TZWxlY3QpPSJzZWxlY3QoJGV2ZW50KSJcbiAgICAgIChvbkZpbHRlckNoYW5nZSk9ImZpbHRlckNoYW5nZSgkZXZlbnQpIlxuICAgID48L21ldHJpYy1hcml0aG1ldGljLWVsZW1lbnQtY29tcG9uZW50PlxuICAnLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSkse21ldHJpYzpbe3R5cGU6eHl9XX0pO2NsYXNzIEh5dHtjb25zdHJ1Y3Rvcigpe3RoaXMuT3BlcmF0b3I9JGh0fX1mdW5jdGlvbiBGeXQodCxlKXsxJnQmJlRtKDAsIm5wbWktbWV0cmljLWFyaXRobWV0aWMtZWxlbWVudCIsNCksMiZ0JiZEbSgibWV0cmljIixZbSgpLiRpbXBsaWNpdC5tZXRyaWMpfWZ1bmN0aW9uIEx5dCh0LGUpezEmdCYmVG0oMCwibnBtaS1tZXRyaWMtYXJpdGhtZXRpYy1vcGVyYXRvciIsNSksMiZ0JiZEbSgib3BlcmF0b3IiLFltKCkuJGltcGxpY2l0Lm9wZXJhdG9yKX1mdW5jdGlvbiBCeXQodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiKSxRcCgxLEZ5dCwxLDEsIm5wbWktbWV0cmljLWFyaXRobWV0aWMtZWxlbWVudCIsMiksUXAoMixMeXQsMSwxLCJucG1pLW1ldHJpYy1hcml0aG1ldGljLW9wZXJhdG9yIiwzKSxBbSgpKSwyJnQpe2NvbnN0IHQ9ZS4kaW1wbGljaXQsbj1ZbSgpO3JjKDEpLERtKCJuZ0lmIix0LmtpbmQ9PT1uLkFyaXRobWV0aWNLaW5kLk1FVFJJQykscmMoMSksRG0oIm5nSWYiLHQua2luZD09PW4uQXJpdGhtZXRpY0tpbmQuT1BFUkFUT1IpfX1IeXQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEh5dCl9LEh5dC7JtWNtcD10byh7dHlwZTpIeXQsc2VsZWN0b3JzOltbIm5wbWktbWV0cmljLWFyaXRobWV0aWMtb3BlcmF0b3IiXV0saW5wdXRzOntvcGVyYXRvcjoib3BlcmF0b3IifSxkZWNsczoyLHZhcnM6MSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwibWF0LWNoaXAiKSxrdSgxKSxBbSgpKSwyJmUmJihyYygxKSxEdSgiICIsbi5vcGVyYXRvcj09PW4uT3BlcmF0b3IuQU5EPyImIjoiIiwiICIpKX0sZGlyZWN0aXZlczpbX3l0XSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEh5dCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJucG1pLW1ldHJpYy1hcml0aG1ldGljLW9wZXJhdG9yIix0ZW1wbGF0ZToiXG4gICAgPG1hdC1jaGlwPlxuICAgICAge3sgb3BlcmF0b3IgPT09IE9wZXJhdG9yLkFORCA/ICcmJyA6ICcnIH19XG4gICAgPC9tYXQtY2hpcD5cbiAgIixjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSxudWxsLHtvcGVyYXRvcjpbe3R5cGU6eHl9XX0pO2NsYXNzIFZ5dHtjb25zdHJ1Y3Rvcigpe3RoaXMuQXJpdGhtZXRpY0tpbmQ9dGJ0fX1WeXQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFZ5dCl9LFZ5dC7JtWNtcD10byh7dHlwZTpWeXQsc2VsZWN0b3JzOltbIm1ldHJpYy1hcml0aG1ldGljLWNvbXBvbmVudCJdXSxpbnB1dHM6e21ldHJpY0FyaXRobWV0aWM6Im1ldHJpY0FyaXRobWV0aWMifSxkZWNsczoyLHZhcnM6Mixjb25zdHM6W1szLCJzZWxlY3RhYmxlIl0sWzQsIm5nRm9yIiwibmdGb3JPZiJdLFszLCJtZXRyaWMiLDQsIm5nSWYiXSxbMywib3BlcmF0b3IiLDQsIm5nSWYiXSxbMywibWV0cmljIl0sWzMsIm9wZXJhdG9yIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJtYXQtY2hpcC1saXN0IiwwKSxRcCgxLEJ5dCwzLDIsImRpdiIsMSksQW0oKSksMiZlJiYoRG0oInNlbGVjdGFibGUiLCExKSxyYygxKSxEbSgibmdGb3JPZiIsbi5tZXRyaWNBcml0aG1ldGljKSl9LGRpcmVjdGl2ZXM6W1B5dCxsTSxkTSxJeXQsSHl0XSxzdHlsZXM6WyJbX25naG9zdC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtd3JhcDp3cmFwfSJdLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChWeXQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWV0cmljLWFyaXRobWV0aWMtY29tcG9uZW50Iix0ZW1wbGF0ZVVybDoiLi9tZXRyaWNfYXJpdGhtZXRpY19jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9tZXRyaWNfYXJpdGhtZXRpY19jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7bWV0cmljQXJpdGhtZXRpYzpbe3R5cGU6eHl9XX0pO2NsYXNzIGp5dHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5tZXRyaWNBcml0aG1ldGljJD10aGlzLnN0b3JlLnBpcGUoRncoZmJ0KSl9fWp5dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8anl0KShTbShJdykpfSxqeXQuybVjbXA9dG8oe3R5cGU6anl0LHNlbGVjdG9yczpbWyJucG1pLW1ldHJpYy1hcml0aG1ldGljIl1dLGRlY2xzOjIsdmFyczozLGNvbnN0czpbWzMsIm1ldHJpY0FyaXRobWV0aWMiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFRtKDAsIm1ldHJpYy1hcml0aG1ldGljLWNvbXBvbmVudCIsMCksQWgoMSwiYXN5bmMiKSksMiZlJiZEbSgibWV0cmljQXJpdGhtZXRpYyIsVGgoMSwxLG4ubWV0cmljQXJpdGhtZXRpYyQpKX0sZGlyZWN0aXZlczpbVnl0XSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoanl0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im5wbWktbWV0cmljLWFyaXRobWV0aWMiLHRlbXBsYXRlOidcbiAgICA8bWV0cmljLWFyaXRobWV0aWMtY29tcG9uZW50XG4gICAgICBbbWV0cmljQXJpdGhtZXRpY109Im1ldHJpY0FyaXRobWV0aWMkIHwgYXN5bmMiXG4gICAgPjwvbWV0cmljLWFyaXRobWV0aWMtY29tcG9uZW50PlxuICAnLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y2xhc3MgVXl0e31mdW5jdGlvbiBHeXQodCxlLG4pe2lmKG4pcmV0dXJuIHQ7Y29uc3Qgbz1PYmplY3QuYXNzaWduKHt9LHQpO3JldHVybiBlLmZvckVhY2goKHQ9PmRlbGV0ZSBvW3RdKSksb31VeXQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFV5dCl9LFV5dC7JtWNtcD10byh7dHlwZTpVeXQsc2VsZWN0b3JzOltbIm5wbWktZGF0YS1zZWxlY3Rpb24iXV0sZGVjbHM6NCx2YXJzOjAsY29uc3RzOltbMSwiZGF0YS1zZWxlY3Rpb24iXSxbMSwibWV0cmljcy1zZWxlY3RvciJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiZGl2IiwwKSxUbSgxLCJucG1pLW1ldHJpYy1zZWFyY2giLDEpLFRtKDIsIm5wbWktcmVzdWx0cy1kb3dubG9hZCIpLEFtKCksVG0oMywibnBtaS1tZXRyaWMtYXJpdGhtZXRpYyIpKX0sZGlyZWN0aXZlczpbbHl0LG15dCxqeXRdLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZWJlYmViO3BhZGRpbmc6MTBweCAyMHB4fS5kYXRhLXNlbGVjdGlvbltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcn0ubWV0cmljcy1zZWxlY3Rvcltfbmdjb250ZW50LSVDT01QJV17ZmxleDoxIDF9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFV5dCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJucG1pLWRhdGEtc2VsZWN0aW9uIix0ZW1wbGF0ZVVybDoiLi9kYXRhX3NlbGVjdGlvbl9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9kYXRhX3NlbGVjdGlvbl9jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCxudWxsKTtjb25zdCBXeXQ9WyJjaGFydCJdO2NsYXNzIFl5dHtjb25zdHJ1Y3Rvcigpe3RoaXMub25SZW1vdmU9bmV3IExoLHRoaXMub25VcGRhdGVGaWx0ZXI9bmV3IExoLHRoaXMuaGVpZ2h0PTMwMCx0aGlzLmNoYXJ0V2lkdGg9MCx0aGlzLmNoYXJ0SGVpZ2h0PTAsdGhpcy5kcmF3SGVpZ2h0PTAsdGhpcy5kcmF3V2lkdGg9MCx0aGlzLm1hcmdpbj17dG9wOjIwLHJpZ2h0OjEwLGJvdHRvbToyMCxsZWZ0OjEwfSx0aGlzLmRyYXdNYXJnaW49e3RvcDowLHJpZ2h0OjAsYm90dG9tOjIwLGxlZnQ6MjB9LHRoaXMuYnJ1c2g9KGZ1bmN0aW9uIHQoKXtyZXR1cm4oZnVuY3Rpb24gdChlKXt2YXIgbixvPW90dCxpPW50dCxhPWl0dCxyPSEwLHM9SDUoInN0YXJ0IiwiYnJ1c2giLCJlbmQiKSxsPTY7ZnVuY3Rpb24gYyh0KXt2YXIgbj10LnByb3BlcnR5KCJfX2JydXNoIixoKS5zZWxlY3RBbGwoIi5vdmVybGF5IikuZGF0YShbZXR0KCJvdmVybGF5IildKTtuLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJvdmVybGF5IikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5hdHRyKCJjdXJzb3IiLEs5Lm92ZXJsYXkpLm1lcmdlKG4pLmVhY2goKGZ1bmN0aW9uKCl7dmFyIHQ9YXR0KHRoaXMpLmV4dGVudDtKNCh0aGlzKS5hdHRyKCJ4Iix0WzBdWzBdKS5hdHRyKCJ5Iix0WzBdWzFdKS5hdHRyKCJ3aWR0aCIsdFsxXVswXS10WzBdWzBdKS5hdHRyKCJoZWlnaHQiLHRbMV1bMV0tdFswXVsxXSl9KSksdC5zZWxlY3RBbGwoIi5zZWxlY3Rpb24iKS5kYXRhKFtldHQoInNlbGVjdGlvbiIpXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsInNlbGVjdGlvbiIpLmF0dHIoImN1cnNvciIsSzkuc2VsZWN0aW9uKS5hdHRyKCJmaWxsIiwiIzc3NyIpLmF0dHIoImZpbGwtb3BhY2l0eSIsLjMpLmF0dHIoInN0cm9rZSIsIiNmZmYiKS5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIik7dmFyIG89dC5zZWxlY3RBbGwoIi5oYW5kbGUiKS5kYXRhKGUuaGFuZGxlcywoZnVuY3Rpb24odCl7cmV0dXJuIHQudHlwZX0pKTtvLmV4aXQoKS5yZW1vdmUoKSxvLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLChmdW5jdGlvbih0KXtyZXR1cm4iaGFuZGxlIGhhbmRsZS0tIit0LnR5cGV9KSkuYXR0cigiY3Vyc29yIiwoZnVuY3Rpb24odCl7cmV0dXJuIEs5W3QudHlwZV19KSksdC5lYWNoKGQpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5vbigibW91c2Vkb3duLmJydXNoIix1KS5maWx0ZXIoYSkub24oInRvdWNoc3RhcnQuYnJ1c2giLHUpLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLGYpLm9uKCJ0b3VjaGVuZC5icnVzaCB0b3VjaGNhbmNlbC5icnVzaCIsZykuc3R5bGUoInRvdWNoLWFjdGlvbiIsIm5vbmUiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpfWZ1bmN0aW9uIGQoKXt2YXIgdD1KNCh0aGlzKSxlPWF0dCh0aGlzKS5zZWxlY3Rpb247ZT8odC5zZWxlY3RBbGwoIi5zZWxlY3Rpb24iKS5zdHlsZSgiZGlzcGxheSIsbnVsbCkuYXR0cigieCIsZVswXVswXSkuYXR0cigieSIsZVswXVsxXSkuYXR0cigid2lkdGgiLGVbMV1bMF0tZVswXVswXSkuYXR0cigiaGVpZ2h0IixlWzFdWzFdLWVbMF1bMV0pLHQuc2VsZWN0QWxsKCIuaGFuZGxlIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLChmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGVbdC50eXBlLmxlbmd0aC0xXT9lWzFdWzBdLWwvMjplWzBdWzBdLWwvMn0pKS5hdHRyKCJ5IiwoZnVuY3Rpb24odCl7cmV0dXJuInMiPT09dC50eXBlWzBdP2VbMV1bMV0tbC8yOmVbMF1bMV0tbC8yfSkpLmF0dHIoIndpZHRoIiwoZnVuY3Rpb24odCl7cmV0dXJuIm4iPT09dC50eXBlfHwicyI9PT10LnR5cGU/ZVsxXVswXS1lWzBdWzBdK2w6bH0pKS5hdHRyKCJoZWlnaHQiLChmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGV8fCJ3Ij09PXQudHlwZT9lWzFdWzFdLWVbMF1bMV0rbDpsfSkpKTp0LnNlbGVjdEFsbCgiLnNlbGVjdGlvbiwuaGFuZGxlIikuc3R5bGUoImRpc3BsYXkiLCJub25lIikuYXR0cigieCIsbnVsbCkuYXR0cigieSIsbnVsbCkuYXR0cigid2lkdGgiLG51bGwpLmF0dHIoImhlaWdodCIsbnVsbCl9ZnVuY3Rpb24gcCh0LGUsbil7dmFyIG89dC5fX2JydXNoLmVtaXR0ZXI7cmV0dXJuIW98fG4mJm8uY2xlYW4/bmV3IG0odCxlLG4pOm99ZnVuY3Rpb24gbSh0LGUsbil7dGhpcy50aGF0PXQsdGhpcy5hcmdzPWUsdGhpcy5zdGF0ZT10Ll9fYnJ1c2gsdGhpcy5hY3RpdmU9MCx0aGlzLmNsZWFuPW59ZnVuY3Rpb24gdSgpe2lmKCghbnx8TDQudG91Y2hlcykmJmkuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdCxvLGEscyxsLGMsbSx1LGYsZyxoLGI9dGhpcyx5PUw0LnRhcmdldC5fX2RhdGFfXy50eXBlLF89InNlbGVjdGlvbiI9PT0ociYmTDQubWV0YUtleT95PSJvdmVybGF5Ijp5KT9WOTpyJiZMNC5hbHRLZXk/Rzk6VTksQz1lPT09WDk/bnVsbDokOVt5XSxNPWU9PT1aOT9udWxsOnR0dFt5XSx2PWF0dChiKSx4PXYuZXh0ZW50LE89di5zZWxlY3Rpb24sUD14WzBdWzBdLHc9eFswXVsxXSxrPXhbMV1bMF0sUz14WzFdWzFdLEQ9MCxFPTAsUj1DJiZNJiZyJiZMNC5zaGlmdEtleSxBPUw0LnRvdWNoZXM/cTkoTDQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcik6dDYsVD1BKGIpLE49VCx6PXAoYixhcmd1bWVudHMsITApLmJlZm9yZXN0YXJ0KCk7Im92ZXJsYXkiPT09eT8oTyYmKGY9ITApLHYuc2VsZWN0aW9uPU89W1t0PWU9PT1YOT9QOlRbMF0sYT1lPT09Wjk/dzpUWzFdXSxbbD1lPT09WDk/azp0LG09ZT09PVo5P1M6YV1dKToodD1PWzBdWzBdLGE9T1swXVsxXSxsPU9bMV1bMF0sbT1PWzFdWzFdKSxvPXQscz1hLGM9bCx1PW07dmFyIEk9SjQoYikuYXR0cigicG9pbnRlci1ldmVudHMiLCJub25lIiksSD1JLnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5hdHRyKCJjdXJzb3IiLEs5W3ldKTtpZihMNC50b3VjaGVzKXoubW92ZWQ9TCx6LmVuZGVkPVY7ZWxzZXt2YXIgRj1KNChMNC52aWV3KS5vbigibW91c2Vtb3ZlLmJydXNoIixMLCEwKS5vbigibW91c2V1cC5icnVzaCIsViwhMCk7ciYmRi5vbigia2V5ZG93bi5icnVzaCIsaiwhMCkub24oImtleXVwLmJydXNoIixVLCEwKSxuNihMNC52aWV3KX1IOSgpLEk4KGIpLGQuY2FsbChiKSx6LnN0YXJ0KCl9ZnVuY3Rpb24gTCgpe3ZhciB0PUEoYik7IVJ8fGd8fGh8fChNYXRoLmFicyh0WzBdLU5bMF0pPk1hdGguYWJzKHRbMV0tTlsxXSk/aD0hMDpnPSEwKSxOPXQsZj0hMCxGOSgpLEIoKX1mdW5jdGlvbiBCKCl7dmFyIGU7c3dpdGNoKEQ9TlswXS1UWzBdLEU9TlsxXS1UWzFdLF8pe2Nhc2Ugajk6Y2FzZSBWOTpDJiYoRD1NYXRoLm1heChQLXQsTWF0aC5taW4oay1sLEQpKSxvPXQrRCxjPWwrRCksTSYmKEU9TWF0aC5tYXgody1hLE1hdGgubWluKFMtbSxFKSkscz1hK0UsdT1tK0UpO2JyZWFrO2Nhc2UgVTk6QzwwPyhEPU1hdGgubWF4KFAtdCxNYXRoLm1pbihrLXQsRCkpLG89dCtELGM9bCk6Qz4wJiYoRD1NYXRoLm1heChQLWwsTWF0aC5taW4oay1sLEQpKSxvPXQsYz1sK0QpLE08MD8oRT1NYXRoLm1heCh3LWEsTWF0aC5taW4oUy1hLEUpKSxzPWErRSx1PW0pOk0+MCYmKEU9TWF0aC5tYXgody1tLE1hdGgubWluKFMtbSxFKSkscz1hLHU9bStFKTticmVhaztjYXNlIEc5OkMmJihvPU1hdGgubWF4KFAsTWF0aC5taW4oayx0LUQqQykpLGM9TWF0aC5tYXgoUCxNYXRoLm1pbihrLGwrRCpDKSkpLE0mJihzPU1hdGgubWF4KHcsTWF0aC5taW4oUyxhLUUqTSkpLHU9TWF0aC5tYXgodyxNYXRoLm1pbihTLG0rRSpNKSkpfWM8byYmKEMqPS0xLGU9dCx0PWwsbD1lLGU9byxvPWMsYz1lLHkgaW4gSjkmJkguYXR0cigiY3Vyc29yIixLOVt5PUo5W3ldXSkpLHU8cyYmKE0qPS0xLGU9YSxhPW0sbT1lLGU9cyxzPXUsdT1lLHkgaW4gUTkmJkguYXR0cigiY3Vyc29yIixLOVt5PVE5W3ldXSkpLHYuc2VsZWN0aW9uJiYoTz12LnNlbGVjdGlvbiksZyYmKG89T1swXVswXSxjPU9bMV1bMF0pLGgmJihzPU9bMF1bMV0sdT1PWzFdWzFdKSxPWzBdWzBdPT09byYmT1swXVsxXT09PXMmJk9bMV1bMF09PT1jJiZPWzFdWzFdPT09dXx8KHYuc2VsZWN0aW9uPVtbbyxzXSxbYyx1XV0sZC5jYWxsKGIpLHouYnJ1c2goKSl9ZnVuY3Rpb24gVigpe2lmKEg5KCksTDQudG91Y2hlcyl7aWYoTDQudG91Y2hlcy5sZW5ndGgpcmV0dXJuO24mJmNsZWFyVGltZW91dChuKSxuPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bj1udWxsfSksNTAwKX1lbHNlIG82KEw0LnZpZXcsZiksRi5vbigia2V5ZG93bi5icnVzaCBrZXl1cC5icnVzaCBtb3VzZW1vdmUuYnJ1c2ggbW91c2V1cC5icnVzaCIsbnVsbCk7SS5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLEguYXR0cigiY3Vyc29yIixLOS5vdmVybGF5KSx2LnNlbGVjdGlvbiYmKE89di5zZWxlY3Rpb24pLHJ0dChPKSYmKHYuc2VsZWN0aW9uPW51bGwsZC5jYWxsKGIpKSx6LmVuZCgpfWZ1bmN0aW9uIGooKXtzd2l0Y2goTDQua2V5Q29kZSl7Y2FzZSAxNjpSPUMmJk07YnJlYWs7Y2FzZSAxODpfPT09VTkmJihDJiYobD1jLUQqQyx0PW8rRCpDKSxNJiYobT11LUUqTSxhPXMrRSpNKSxfPUc5LEIoKSk7YnJlYWs7Y2FzZSAzMjpfIT09VTkmJl8hPT1HOXx8KEM8MD9sPWMtRDpDPjAmJih0PW8tRCksTTwwP209dS1FOk0+MCYmKGE9cy1FKSxfPWo5LEguYXR0cigiY3Vyc29yIixLOS5zZWxlY3Rpb24pLEIoKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59RjkoKX1mdW5jdGlvbiBVKCl7c3dpdGNoKEw0LmtleUNvZGUpe2Nhc2UgMTY6UiYmKGc9aD1SPSExLEIoKSk7YnJlYWs7Y2FzZSAxODpfPT09RzkmJihDPDA/bD1jOkM+MCYmKHQ9byksTTwwP209dTpNPjAmJihhPXMpLF89VTksQigpKTticmVhaztjYXNlIDMyOl89PT1qOSYmKEw0LmFsdEtleT8oQyYmKGw9Yy1EKkMsdD1vK0QqQyksTSYmKG09dS1FKk0sYT1zK0UqTSksXz1HOSk6KEM8MD9sPWM6Qz4wJiYodD1vKSxNPDA/bT11Ok0+MCYmKGE9cyksXz1VOSksSC5hdHRyKCJjdXJzb3IiLEs5W3ldKSxCKCkpO2JyZWFrO2RlZmF1bHQ6cmV0dXJufUY5KCl9fWZ1bmN0aW9uIGYoKXtwKHRoaXMsYXJndW1lbnRzKS5tb3ZlZCgpfWZ1bmN0aW9uIGcoKXtwKHRoaXMsYXJndW1lbnRzKS5lbmRlZCgpfWZ1bmN0aW9uIGgoKXt2YXIgdD10aGlzLl9fYnJ1c2h8fHtzZWxlY3Rpb246bnVsbH07cmV0dXJuIHQuZXh0ZW50PVk5KG8uYXBwbHkodGhpcyxhcmd1bWVudHMpKSx0LmRpbT1lLHR9cmV0dXJuIGMubW92ZT1mdW5jdGlvbih0LG4pe3Quc2VsZWN0aW9uP3Qub24oInN0YXJ0LmJydXNoIiwoZnVuY3Rpb24oKXtwKHRoaXMsYXJndW1lbnRzKS5iZWZvcmVzdGFydCgpLnN0YXJ0KCl9KSkub24oImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2giLChmdW5jdGlvbigpe3AodGhpcyxhcmd1bWVudHMpLmVuZCgpfSkpLnR3ZWVuKCJicnVzaCIsKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxvPXQuX19icnVzaCxpPXAodCxhcmd1bWVudHMpLGE9by5zZWxlY3Rpb24scj1lLmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm4sby5leHRlbnQpLHM9WjcoYSxyKTtmdW5jdGlvbiBsKGUpe28uc2VsZWN0aW9uPTE9PT1lJiZudWxsPT09cj9udWxsOnMoZSksZC5jYWxsKHQpLGkuYnJ1c2goKX1yZXR1cm4gbnVsbCE9PWEmJm51bGwhPT1yP2w6bCgxKX0pKTp0LmVhY2goKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxvPWFyZ3VtZW50cyxpPXQuX19icnVzaCxhPWUuaW5wdXQoImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0LG8pOm4saS5leHRlbnQpLHI9cCh0LG8pLmJlZm9yZXN0YXJ0KCk7STgodCksaS5zZWxlY3Rpb249bnVsbD09PWE/bnVsbDphLGQuY2FsbCh0KSxyLnN0YXJ0KCkuYnJ1c2goKS5lbmQoKX0pKX0sYy5jbGVhcj1mdW5jdGlvbih0KXtjLm1vdmUodCxudWxsKX0sbS5wcm90b3R5cGU9e2JlZm9yZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLnN0YXRlLmVtaXR0ZXI9dGhpcyx0aGlzLnN0YXJ0aW5nPSEwKSx0aGlzfSxzdGFydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0aW5nPyh0aGlzLnN0YXJ0aW5nPSExLHRoaXMuZW1pdCgic3RhcnQiKSk6dGhpcy5lbWl0KCJicnVzaCIpLHRoaXN9LGJydXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW1pdCgiYnJ1c2giKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09LS10aGlzLmFjdGl2ZSYmKGRlbGV0ZSB0aGlzLnN0YXRlLmVtaXR0ZXIsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXshKGZ1bmN0aW9uIG4odCxlLG8saSl7dmFyIGE9TDQ7dC5zb3VyY2VFdmVudD1MNCxMND10O3RyeXtlLmFwcGx5KG8saSl9ZmluYWxseXtMND1hfX0pKG5ldyBJOShjLHQsZS5vdXRwdXQodGhpcy5zdGF0ZS5zZWxlY3Rpb24pKSxzLmFwcGx5LHMsW3QsdGhpcy50aGF0LHRoaXMuYXJnc10pfX0sYy5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp6OShZOSh0KSksYyk6b30sYy5maWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp6OSghIXQpLGMpOml9LGMudG91Y2hhYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ejkoISF0KSxjKTphfSxjLmhhbmRsZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9K3QsYyk6bH0sYy5rZXlNb2RpZmllcnM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ISF0LGMpOnJ9LGMub249ZnVuY3Rpb24oKXt2YXIgdD1zLm9uLmFwcGx5KHMsYXJndW1lbnRzKTtyZXR1cm4gdD09PXM/Yzp0fSxjfSkoWDkpfSkoKSx0aGlzLm1heEJpblNpemU9MCx0aGlzLmFyZWE9KGZ1bmN0aW9uIGUoKXt2YXIgdD14b3QsZT1udWxsLG49Q290KDApLG89T290LGk9Q290KCEwKSxhPW51bGwscj12b3Qscz1udWxsO2Z1bmN0aW9uIGwobCl7dmFyIGMsZCxwLG0sdSxmPWwubGVuZ3RoLGc9ITEsaD1uZXcgQXJyYXkoZiksYj1uZXcgQXJyYXkoZik7Zm9yKG51bGw9PWEmJihzPXIodT1tdHQoKSkpLGM9MDtjPD1mOysrYyl7aWYoIShjPGYmJmkobT1sW2NdLGMsbCkpPT09ZylpZihnPSFnKWQ9YyxzLmFyZWFTdGFydCgpLHMubGluZVN0YXJ0KCk7ZWxzZXtmb3Iocy5saW5lRW5kKCkscy5saW5lU3RhcnQoKSxwPWMtMTtwPj1kOy0tcClzLnBvaW50KGhbcF0sYltwXSk7cy5saW5lRW5kKCkscy5hcmVhRW5kKCl9ZyYmKGhbY109K3QobSxjLGwpLGJbY109K24obSxjLGwpLHMucG9pbnQoZT8rZShtLGMsbCk6aFtjXSxvPytvKG0sYyxsKTpiW2NdKSl9aWYodSlyZXR1cm4gcz1udWxsLHUrIiJ8fG51bGx9ZnVuY3Rpb24gYygpe3JldHVybiBQb3QoKS5kZWZpbmVkKGkpLmN1cnZlKHIpLmNvbnRleHQoYSl9cmV0dXJuIGwueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkNvdCgrbiksZT1udWxsLGwpOnR9LGwueDA9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpDb3QoK2UpLGwpOnR9LGwueDE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Q290KCt0KSxsKTplfSxsLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpDb3QoK3QpLG89bnVsbCxsKTpufSxsLnkwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Q290KCt0KSxsKTpufSxsLnkxPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OkNvdCgrdCksbCk6b30sbC5saW5lWDA9bC5saW5lWTA9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLngodCkueShuKX0sbC5saW5lWTE9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLngodCkueShvKX0sbC5saW5lWDE9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLngoZSkueShuKX0sbC5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Q290KCEhdCksbCk6aX0sbC5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG51bGwhPWEmJihzPXIoYSkpLGwpOnJ9LGwuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9hPXM9bnVsbDpzPXIoYT10KSxsKTphfSxsfSkoKS54MChmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54U2NhbGVOdW0oLXQubGVuZ3RoKX0uYmluZCh0aGlzKSkueDEoZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueFNjYWxlTnVtKHQubGVuZ3RoKX0uYmluZCh0aGlzKSkueShmdW5jdGlvbih0KXtyZXR1cm4gdC54MD09PS0xLzA/dGhpcy5jaGFydEhlaWdodC10aGlzLmRyYXdNYXJnaW4udG9wOnRoaXMueVNjYWxlKCh0LngxK3QueDApLzIpfS5iaW5kKHRoaXMpKS5jdXJ2ZShEb3QpfW5nQWZ0ZXJWaWV3SW5pdCgpe3RoaXMudXBkYXRlRGltZW5zaW9ucygpLHRoaXMuc3ZnPUo0KHRoaXMuY2hhcnRDb250YWluZXIubmF0aXZlRWxlbWVudCkuc2VsZWN0KCJzdmciKSx0aGlzLm1haW5Db250YWluZXI9dGhpcy5zdmcuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIixgdHJhbnNsYXRlKCR7dGhpcy5tYXJnaW4ubGVmdH0sICR7dGhpcy5tYXJnaW4udG9wfSlgKSx0aGlzLmRyYXdDb250YWluZXI9dGhpcy5tYWluQ29udGFpbmVyLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsYHRyYW5zbGF0ZSgke3RoaXMuZHJhd01hcmdpbi5sZWZ0fSwgJHt0aGlzLmRyYXdNYXJnaW4udG9wfSlgKSx0aGlzLmRvdHNHcm91cD10aGlzLmRyYXdDb250YWluZXIuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJkb3RzR3JvdXAiKSx0aGlzLnlBeGlzR3JvdXA9dGhpcy5tYWluQ29udGFpbmVyLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwiYXhpcyBheGlzLS15IiksdGhpcy54QXhpc0dyb3VwPXRoaXMubWFpbkNvbnRhaW5lci5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImF4aXMgYXhpcy0teCIpLHRoaXMubWlzY0dyb3VwPXRoaXMuZHJhd0NvbnRhaW5lci5hcHBlbmQoImciKSx0aGlzLnhTY2FsZT1WdHQoKS5wYWRkaW5nKC4wNSksdGhpcy54QXhpcz16NSh0aGlzLnhTY2FsZSksdGhpcy55U2NhbGU9ZWV0KCkucmFuZ2UoW3RoaXMuZHJhd0hlaWdodCwwXSksdGhpcy55QXhpcz0oZnVuY3Rpb24gdChlKXtyZXR1cm4gVDUoNCxlKX0pKHRoaXMueVNjYWxlKSx0aGlzLnhTY2FsZU51bT1lZXQoKSx0aGlzLmluaXRpYWxpemVCcnVzaCgpLHRoaXMuZHJhd01pc2MoKSx0aGlzLnJlZHJhdygpfW5nT25DaGFuZ2VzKHQpe3RoaXMuc3ZnJiZ0aGlzLnJlZHJhdygpfXJlZHJhdygpe3RoaXMudXBkYXRlRGltZW5zaW9ucygpLHRoaXMuc2V0TWF4QmluU2l6ZSgpLHRoaXMudXBkYXRlQXhlcygpLHRoaXMuZHJhdygpfXVwZGF0ZURpbWVuc2lvbnMoKXt0aGlzLmNoYXJ0V2lkdGg9dGhpcy53aWR0aC10aGlzLm1hcmdpbi5sZWZ0LXRoaXMubWFyZ2luLnJpZ2h0LHRoaXMuZHJhd1dpZHRoPXRoaXMuY2hhcnRXaWR0aC10aGlzLmRyYXdNYXJnaW4ubGVmdC10aGlzLmRyYXdNYXJnaW4ucmlnaHQsdGhpcy5jaGFydEhlaWdodD10aGlzLmhlaWdodC10aGlzLm1hcmdpbi50b3AtdGhpcy5tYXJnaW4uYm90dG9tLHRoaXMuZHJhd0hlaWdodD10aGlzLmNoYXJ0SGVpZ2h0LXRoaXMuZHJhd01hcmdpbi50b3AtdGhpcy5kcmF3TWFyZ2luLmJvdHRvbX1zZXRNYXhCaW5TaXplKCl7T2JqZWN0LnZhbHVlcyh0aGlzLmNoYXJ0RGF0YS52aW9saW5EYXRhKS5mb3JFYWNoKCh0PT57Y29uc3QgZT10Lm1hcCgodD0+dC5sZW5ndGgpKSxuPU1hdGgubWF4KC4uLmUpO3RoaXMubWF4QmluU2l6ZT1NYXRoLm1heChuLHRoaXMubWF4QmluU2l6ZSl9KSl9dXBkYXRlQXhlcygpe3RoaXMueFNjYWxlLnJhbmdlKFswLHRoaXMuZHJhd1dpZHRoXSkuZG9tYWluKE9iamVjdC5rZXlzKHRoaXMuY2hhcnREYXRhLnZpb2xpbkRhdGEpKSx0aGlzLnlTY2FsZS5kb21haW4oW3RoaXMuY2hhcnREYXRhLmV4dHJlbWVzLm1pbix0aGlzLmNoYXJ0RGF0YS5leHRyZW1lcy5tYXhdKSx0aGlzLnhTY2FsZU51bS5yYW5nZShbMCx0aGlzLnhTY2FsZS5iYW5kd2lkdGgoKV0pLmRvbWFpbihbLXRoaXMubWF4QmluU2l6ZSx0aGlzLm1heEJpblNpemVdKX1pbml0aWFsaXplQnJ1c2goKXt0aGlzLmJydXNoLm9uKCJlbmQiLHRoaXMuYnJ1c2hNb3ZlZC5iaW5kKHRoaXMpKX1kcmF3KCl7dGhpcy5kcmF3QXhlcygpLHRoaXMuZHJhd1Bsb3QoKSx0aGlzLnJlZnJlc2hNaXNjKCksdGhpcy5yZWZyZXNoQnJ1c2goKX1kcmF3QXhlcygpe3RoaXMueUF4aXNHcm91cC5hdHRyKCJ0cmFuc2Zvcm0iLGB0cmFuc2xhdGUoJHt0aGlzLmRyYXdNYXJnaW4ubGVmdH0sXG4gICAgICAke3RoaXMuZHJhd01hcmdpbi50b3B9KWApLmNhbGwodGhpcy55QXhpcyksdGhpcy54QXhpc0dyb3VwLmF0dHIoInRyYW5zZm9ybSIsYHRyYW5zbGF0ZSgke3RoaXMuZHJhd01hcmdpbi5sZWZ0fSxcbiAgICAgICR7dGhpcy5kcmF3TWFyZ2luLnRvcCt0aGlzLmNoYXJ0SGVpZ2h0fSlgKS5jYWxsKHRoaXMueEF4aXMpfWRyYXdQbG90KCl7Y29uc3QgdD10aGlzLmRvdHNHcm91cC5zZWxlY3RBbGwoIi52aW9saW4tcGxvdCIpLmRhdGEoT2JqZWN0LmVudHJpZXModGhpcy5jaGFydERhdGEudmlvbGluRGF0YSkpO3QuZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5hdHRyKCJjbGFzcyIsInZpb2xpbi1wbG90Iikuc3R5bGUoInN0cm9rZSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29sb3JTY2FsZSh0WzBdKX0uYmluZCh0aGlzKSkuc3R5bGUoImZpbGwiLGZ1bmN0aW9uKHQpe3JldHVybmAke3RoaXMuY29sb3JTY2FsZSh0WzBdKX0zM2B9LmJpbmQodGhpcykpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7cmV0dXJuYHRyYW5zbGF0ZSgke3RoaXMueFNjYWxlKHRbMF0pfSwgMClgfS5iaW5kKHRoaXMpKS5kYXR1bSgoZnVuY3Rpb24odCl7cmV0dXJuIHRbMV19KSkuYXR0cigiZCIsdGhpcy5hcmVhKSx0LmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7cmV0dXJuYHRyYW5zbGF0ZSgke3RoaXMueFNjYWxlKHRbMF0pfSwgMClgfS5iaW5kKHRoaXMpKS5kYXR1bSgoZnVuY3Rpb24odCl7cmV0dXJuIHRbMV19KSkuYXR0cigiZCIsdGhpcy5hcmVhKSx0LmV4aXQoKS5yZW1vdmUoKX1kcmF3TWlzYygpe3RoaXMuemVyb0xpbmU9dGhpcy5taXNjR3JvdXAuYXBwZW5kKCJsaW5lIikuc3R5bGUoInN0cm9rZSIsImJsYWNrIikuYXR0cigieDEiLDApLmF0dHIoInkxIix0aGlzLnlTY2FsZSgwKSkuYXR0cigieDIiLHRoaXMuZHJhd1dpZHRoKS5hdHRyKCJ5MiIsdGhpcy55U2NhbGUoMCkpLHRoaXMubmFuVGV4dD10aGlzLm1pc2NHcm91cC5hcHBlbmQoInRleHQiKS5zdHlsZSgiZmlsbCIsImJsYWNrIikudGV4dCgiTmFOIikuYXR0cigiZm9udC1zaXplIiwiMTBweCIpLmF0dHIoInRleHQtYW5jaG9yIiwiZW5kIikuYXR0cigiYWxpZ25tZW50LWJhc2VsaW5lIiwibWlkZGxlIikuYXR0cigieCIsLTUpLmF0dHIoInkiLHRoaXMuY2hhcnRIZWlnaHQtdGhpcy5kcmF3TWFyZ2luLnRvcCksdGhpcy5uYW5MaW5lPXRoaXMubWlzY0dyb3VwLmFwcGVuZCgibGluZSIpLnN0eWxlKCJzdHJva2UiLCJncmV5Iikuc3R5bGUoInN0cm9rZS1kYXNoYXJyYXkiLCIzLCAzIikuYXR0cigieDEiLDApLmF0dHIoInkxIix0aGlzLmNoYXJ0SGVpZ2h0LXRoaXMuZHJhd01hcmdpbi50b3ApLmF0dHIoIngyIix0aGlzLmRyYXdXaWR0aCkuYXR0cigieTIiLHRoaXMuY2hhcnRIZWlnaHQtdGhpcy5kcmF3TWFyZ2luLnRvcCl9cmVmcmVzaE1pc2MoKXt0aGlzLnplcm9MaW5lLmF0dHIoInkxIix0aGlzLnlTY2FsZSgwKSkuYXR0cigieDIiLHRoaXMuZHJhd1dpZHRoKS5hdHRyKCJ5MiIsdGhpcy55U2NhbGUoMCkpLHRoaXMubmFuVGV4dC5hdHRyKCJ5Iix0aGlzLmNoYXJ0SGVpZ2h0LXRoaXMuZHJhd01hcmdpbi50b3ApLHRoaXMubmFuTGluZS5hdHRyKCJ5MSIsdGhpcy5kcmF3SGVpZ2h0K3RoaXMuZHJhd01hcmdpbi50b3ApLmF0dHIoIngyIix0aGlzLmRyYXdXaWR0aCkuYXR0cigieTIiLHRoaXMuZHJhd0hlaWdodCt0aGlzLmRyYXdNYXJnaW4udG9wKX1yZWZyZXNoQnJ1c2goKXt0aGlzLmJydXNoLmV4dGVudChbWzAsMF0sW3RoaXMuZHJhd1dpZHRoLHRoaXMuZHJhd0hlaWdodCt0aGlzLm1hcmdpbi50b3BdXSk7Y29uc3QgdD1bMCx0aGlzLmRyYXdIZWlnaHQrdGhpcy5tYXJnaW4udG9wXTtpZih0aGlzLmZpbHRlci5tYXg8dGhpcy5maWx0ZXIubWluKXRbMF09dGhpcy5maWx0ZXIuaW5jbHVkZU5hTj90aGlzLnlTY2FsZSh0aGlzLmNoYXJ0RGF0YS5leHRyZW1lcy5taW4pOnRbMV07ZWxzZXtpZighdGhpcy5maWx0ZXIuaW5jbHVkZU5hTil7Y29uc3QgZT1NYXRoLm1heCh0aGlzLmNoYXJ0RGF0YS5leHRyZW1lcy5taW4sdGhpcy5maWx0ZXIubWluKTt0WzFdPXRoaXMueVNjYWxlKGUpfWNvbnN0IGU9TWF0aC5taW4odGhpcy5jaGFydERhdGEuZXh0cmVtZXMubWF4LHRoaXMuZmlsdGVyLm1heCk7dFswXT10aGlzLnlTY2FsZShlKX10aGlzLmRyYXdDb250YWluZXIuY2FsbCh0aGlzLmJydXNoKS5jYWxsKHRoaXMuYnJ1c2gubW92ZSx0KX1icnVzaE1vdmVkKCl7aWYoIUw0KXJldHVybjtpZighTDQuc291cmNlRXZlbnQpcmV0dXJuO2NvbnN0IHQ9TDQuc2VsZWN0aW9uO2lmKHQpe2xldCBlPSExLG49LTIsbz10aGlzLmNoYXJ0RGF0YS5leHRyZW1lcy5taW47dFswXTw9dGhpcy5kcmF3SGVpZ2h0K3RoaXMubWFyZ2luLnRvcCYmdFsxXT49dGhpcy5kcmF3SGVpZ2h0JiYoZT0hMCksdFswXTx0aGlzLmRyYXdIZWlnaHQmJihuPXRoaXMueVNjYWxlLmludmVydCh0WzBdKSksdFsxXTx0aGlzLmRyYXdIZWlnaHQmJihvPXRoaXMueVNjYWxlLmludmVydCh0WzFdKSksdGhpcy5vblVwZGF0ZUZpbHRlci5lbWl0KHttYXg6bixtaW46byxpbmNsdWRlTmFOOmV9KX1lbHNlIHRoaXMub25VcGRhdGVGaWx0ZXIuZW1pdCh7bWF4OjEsbWluOi0xLGluY2x1ZGVOYU46ITB9KX19WXl0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxZeXQpfSxZeXQuybVjbXA9dG8oe3R5cGU6WXl0LHNlbGVjdG9yczpbWyJ2aW9saW4tZmlsdGVyLWNvbXBvbmVudCJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmUWgoV3l0LDcsaGcpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uY2hhcnRDb250YWluZXI9dC5maXJzdCl9fSxpbnB1dHM6e21ldHJpY05hbWU6Im1ldHJpY05hbWUiLGZpbHRlcjoiZmlsdGVyIixjaGFydERhdGE6ImNoYXJ0RGF0YSIsd2lkdGg6IndpZHRoIixjb2xvclNjYWxlOiJjb2xvclNjYWxlIn0sb3V0cHV0czp7b25SZW1vdmU6Im9uUmVtb3ZlIixvblVwZGF0ZUZpbHRlcjoib25VcGRhdGVGaWx0ZXIifSxmZWF0dXJlczpbQm9dLGRlY2xzOjksdmFyczoxLGNvbnN0czpmdW5jdGlvbigpe2xldCB0O3JldHVybiB0PSJ1bmRlZmluZWQiIT10eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUmJm5nSTE4bkNsb3N1cmVNb2RlP2dvb2cuZ2V0TXNnKCJSZW1vdmUgRmlsdGVyIik6JGxvY2FsaXplYDpMYWJlbCBmb3IgYSBidXR0b24gdGhhdCByZW1vdmVzIGEgbWV0cmljIGZpbHRlci7ikJ9hNmJmYWQ1OGJiMzYzZDVjODkxZDBhNTQ3NGIxZDc3ZWY5MGEzNGRh4pCfODQ1NDk2MTc5Nzc2MjkwNzYyNDpSZW1vdmUgRmlsdGVyYCxbWzEsImNoYXJ0LWNvbnRhaW5lciJdLFsidGl0bGUiLCJTaG93cyB0aGUgblBNSSB2YWx1ZSBkaXN0cmlidXRpb24gcGVyIHJ1bi4gUmFuZ2VzIG9mIHNlbGVjdGVkIHZhbHVlcyBjYW4gYmUgbWFuaXB1bGF0ZWQgYnkgbW9kaWZ5aW5nIHRoZSBncmV5IGJveC4iLDEsImNoYXJ0LWhlYWQiXSxbMSwiY2hhcnQtaGVhZGluZyJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsdCwzLCJjbGljayJdLFsic3ZnSWNvbiIsImNsZWFyXzI0cHgiXSxbMSwiY2hhcnQiXSxbImNoYXJ0IiwiIl0sWzEsImRyYXctYXJlYSJdXX0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImRpdiIsMCksUm0oMSwiZGl2IiwxKSxSbSgyLCJkaXYiLDIpLGt1KDMpLEFtKCksUm0oNCwiYnV0dG9uIiwzKSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25SZW1vdmUuZW1pdCgpfSkpLFRtKDUsIm1hdC1pY29uIiw0KSxBbSgpLEFtKCksUm0oNiwiZGl2Iiw1LDYpLHFpKCksVG0oOCwic3ZnIiw3KSxBbSgpLEFtKCkpLDImZSYmKHJjKDMpLFN1KG4ubWV0cmljTmFtZSkpfSxkaXJlY3RpdmVzOltYSCxEV10sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9LmNoYXJ0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWI7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtvdmVyZmxvdzpoaWRkZW59LmNoYXJ0W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MzAwcHg7d2lkdGg6MTAwJX0uY2hhcnQtaGVhZFtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2Vlbn0uY2hhcnQtaGVhZGluZ1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHg7cGFkZGluZy1sZWZ0OjEwcHg7cGFkZGluZy10b3A6MTBweH0uZHJhdy1hcmVhW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5zdHJva2VkLWxpbmVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTpyZ2JhKDAsMCwwLC4xMik7c3Ryb2tlLWRhc2hhcnJheTozIDN9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFl5dCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJ2aW9saW4tZmlsdGVyLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vdmlvbGluX2ZpbHRlcl9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi92aW9saW5fZmlsdGVyX2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSxudWxsLHttZXRyaWNOYW1lOlt7dHlwZTp4eX1dLGZpbHRlcjpbe3R5cGU6eHl9XSxjaGFydERhdGE6W3t0eXBlOnh5fV0sd2lkdGg6W3t0eXBlOnh5fV0sY29sb3JTY2FsZTpbe3R5cGU6eHl9XSxvblJlbW92ZTpbe3R5cGU6T3l9XSxvblVwZGF0ZUZpbHRlcjpbe3R5cGU6T3l9XSxjaGFydENvbnRhaW5lcjpbe3R5cGU6WmEsYXJnczpbImNoYXJ0Iix7c3RhdGljOiEwLHJlYWQ6aGd9XX1dfSk7Y2xhc3MgcXl0e2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLmFjdGl2ZVJ1bnMkPXRoaXMuc3RvcmUucGlwZShGdyhOTikpLnBpcGUoSXQoKHQ9PnQ/QXJyYXkuZnJvbSh0LmVudHJpZXMoKSkuZmlsdGVyKCh0PT50WzFdKSkubWFwKCh0PT50WzBdKSk6W10pKSksdGhpcy52aXNpYmxlQW5ub3RhdGlvbnMkPVd0KFt0aGlzLnN0b3JlLnNlbGVjdChyYnQpLHRoaXMuc3RvcmUuc2VsZWN0KHBidCksdGhpcy5zdG9yZS5zZWxlY3QoTWJ0KV0pLnBpcGUoSXQoKChbdCxlLG5dKT0+R3l0KHQsZSxuKSkpKSx0aGlzLmNoYXJ0V2lkdGgkPXRoaXMuc3RvcmUucGlwZShGdyh4YnQpKS5waXBlKEl0KCh0PT5NYXRoLm1heCgxNTAsdCkpKSksdGhpcy5ydW5Db2xvclNjYWxlJD10aGlzLnN0b3JlLnNlbGVjdCh6TikucGlwZShJdCgodD0+ZT0+e2lmKCF0Lmhhc093blByb3BlcnR5KGUpKXRocm93IG5ldyBFcnJvcihgW0NvbG9yIHNjYWxlXSB1bmtub3duIHJ1bklkOiAke2V9LmApO3JldHVybiB0W2VdfSkpKX1uZ09uSW5pdCgpe3RoaXMuY2hhcnREYXRhJD1XdChbdGhpcy52aXNpYmxlQW5ub3RhdGlvbnMkLHRoaXMuYWN0aXZlUnVucyRdKS5waXBlKEl0KCgoW3QsZV0pPT4oZnVuY3Rpb24gbih0LGUsbyl7Y29uc3QgaT17fSxhPXt9LHI9bmV3IFNldChlKSxzPW55dChvKSxsPXttYXg6LTEsbWluOjF9O09iamVjdC52YWx1ZXModCkuZm9yRWFjaCgodD0+e3QuZm9yRWFjaCgodD0+e2NvbnN0IGU9dC5ydW47aWYoci5oYXMoZSkmJnQubWV0cmljPT09cylpZihudWxsPT09dC5uUE1JVmFsdWUpYVtlXT9hW2VdLnB1c2gobnVsbCk6YVtlXT1bbnVsbF07ZWxzZXtjb25zdCBuPXQublBNSVZhbHVlO2wubWF4PWwubWF4PG4/bjpsLm1heCxsLm1pbj1sLm1pbj5uP246bC5taW4saVt0LnJ1bl0/aVtlXS5wdXNoKG4pOmlbZV09W25dfX0pKX0pKTtjb25zdCBjPXt9LGQ9TzUoKS5kb21haW4oW2wubWluLGwubWF4XSkudmFsdWUoKHQ9PnQpKSxwPU81KCkuZG9tYWluKFstMS8wLDEvMF0pLnRocmVzaG9sZHMoMCkudmFsdWUoKHQ9PnQpKTtmb3IoY29uc3QgdCBvZiByKWlmKGNbdF09ZChpW3RdKSxhW3RdKXtjb25zdCBlPXAoYVt0XSk7Y1t0XS51bnNoaWZ0KGVbMF0pfXJldHVybnt2aW9saW5EYXRhOmMsZXh0cmVtZXM6bH19KSh0LGUsdGhpcy5tZXRyaWNOYW1lKSkpKX1yZW1vdmVNZXRyaWMoKXt0aGlzLnN0b3JlLmRpc3BhdGNoKExidCh7bWV0cmljOnRoaXMubWV0cmljTmFtZX0pKX11cGRhdGVGaWx0ZXIodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChCYnQoT2JqZWN0LmFzc2lnbih7bWV0cmljOnRoaXMubWV0cmljTmFtZX0sdCkpKX19ZnVuY3Rpb24gWnl0KHQsZSl7aWYoMSZ0JiZUbSgwLCJucG1pLXZpb2xpbi1maWx0ZXIiLDgpLDImdCl7Y29uc3QgdD1lLiRpbXBsaWNpdDtEbSgibWV0cmljTmFtZSIsdFswXSkoImZpbHRlciIsdFsxXSl9fWZ1bmN0aW9uIFh5dCh0LGUpezEmdCYmKFJtKDAsImRpdiIsOSksUm0oMSwic3BhbiIsMTApLGt1KDIsIiBZb3UgY2FuIGFkZCBtb3JlIGZpbHRlcnMgYXQgdGhlIHRvcC4gIiksQW0oKSxBbSgpKX1xeXQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHF5dCkoU20oSXcpKX0scXl0Lsm1Y21wPXRvKHt0eXBlOnF5dCxzZWxlY3RvcnM6W1sibnBtaS12aW9saW4tZmlsdGVyIl1dLGlucHV0czp7bWV0cmljTmFtZToibWV0cmljTmFtZSIsZmlsdGVyOiJmaWx0ZXIifSxkZWNsczo0LHZhcnM6MTEsY29uc3RzOltbMywibWV0cmljTmFtZSIsImZpbHRlciIsImNoYXJ0RGF0YSIsIndpZHRoIiwiY29sb3JTY2FsZSIsIm9uUmVtb3ZlIiwib25VcGRhdGVGaWx0ZXIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsInZpb2xpbi1maWx0ZXItY29tcG9uZW50IiwwKSxWbSgib25SZW1vdmUiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ucmVtb3ZlTWV0cmljKCl9KSkoIm9uVXBkYXRlRmlsdGVyIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi51cGRhdGVGaWx0ZXIoZSl9KSksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQW0oKSksMiZlJiZEbSgibWV0cmljTmFtZSIsbi5tZXRyaWNOYW1lKSgiZmlsdGVyIixuLmZpbHRlcikoImNoYXJ0RGF0YSIsVGgoMSw1LG4uY2hhcnREYXRhJCkpKCJ3aWR0aCIsVGgoMiw3LG4uY2hhcnRXaWR0aCQpKSgiY29sb3JTY2FsZSIsVGgoMyw5LG4ucnVuQ29sb3JTY2FsZSQpKX0sZGlyZWN0aXZlczpbWXl0XSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgocXl0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im5wbWktdmlvbGluLWZpbHRlciIsdGVtcGxhdGU6J1xuICAgIDx2aW9saW4tZmlsdGVyLWNvbXBvbmVudFxuICAgICAgW21ldHJpY05hbWVdPSJtZXRyaWNOYW1lIlxuICAgICAgW2ZpbHRlcl09ImZpbHRlciJcbiAgICAgIFtjaGFydERhdGFdPSJjaGFydERhdGEkIHwgYXN5bmMiXG4gICAgICBbd2lkdGhdPSJjaGFydFdpZHRoJCB8IGFzeW5jIlxuICAgICAgW2NvbG9yU2NhbGVdPSJydW5Db2xvclNjYWxlJCB8IGFzeW5jIlxuICAgICAgKG9uUmVtb3ZlKT0icmVtb3ZlTWV0cmljKCkiXG4gICAgICAob25VcGRhdGVGaWx0ZXIpPSJ1cGRhdGVGaWx0ZXIoJGV2ZW50KSJcbiAgICA+PC92aW9saW4tZmlsdGVyLWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLHttZXRyaWNOYW1lOlt7dHlwZTp4eX1dLGZpbHRlcjpbe3R5cGU6eHl9XX0pO2NsYXNzIEt5dHtjb25zdHJ1Y3Rvcigpe3RoaXMudG9nZ2xlU2lkZWJhckV4cGFuZGVkPW5ldyBMaH19S3l0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxLeXQpfSxLeXQuybVjbXA9dG8oe3R5cGU6S3l0LHNlbGVjdG9yczpbWyJ2aW9saW4tZmlsdGVycy1jb21wb25lbnQiXV0saW5wdXRzOntzaWRlYmFyRXhwYW5kZWQ6InNpZGViYXJFeHBhbmRlZCIsbWV0cmljRmlsdGVyczoibWV0cmljRmlsdGVycyJ9LG91dHB1dHM6e3RvZ2dsZVNpZGViYXJFeHBhbmRlZDoidG9nZ2xlU2lkZWJhckV4cGFuZGVkIn0sZGVjbHM6OSx2YXJzOjIsY29uc3RzOmZ1bmN0aW9uKCl7bGV0IHQ7cmV0dXJuIHQ9InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSYmbmdJMThuQ2xvc3VyZU1vZGU/Z29vZy5nZXRNc2coIkV4cGFuZC9IaWRlIFNpZGViYXIiKTokbG9jYWxpemVgOkxhYmVsIGZvciBhIGJ1dHRvbiB0aGF0IGV4cGFuZHMvaGlkZXMgdGhlIHNpZGViYXIu4pCfNDhjMjk5MDNjZTg4MWFiNjEwODhmOGQ0OWQ4MjcyMDM3MTZhYWVkNOKQnzQ2NTg2MDI5OTE5NzAyNjAyMTU6RXhwYW5kL0hpZGUgU2lkZWJhcmAsW1sxLCJmaWx0ZXJzLXRvb2xiYXIiXSxbMSwiZmlsdGVycy10aXRsZSJdLFsxLCJzaWRlLXRvZ2dsZSJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsdCwzLCJjbGljayJdLFsic3ZnSWNvbiIsImNoZXZyb25fbGVmdF8yNHB4Il0sWzEsImZpbHRlcnMiXSxbMywibWV0cmljTmFtZSIsImZpbHRlciIsNCwibmdGb3IiLCJuZ0Zvck9mIl0sWyJjbGFzcyIsImZpbHRlcnMtaGludCIsNCwibmdJZiJdLFszLCJtZXRyaWNOYW1lIiwiZmlsdGVyIl0sWzEsImZpbHRlcnMtaGludCJdLFsxLCJmaWx0ZXJzLWhpbnQtdGV4dCJdXX0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImRpdiIsMCksUm0oMSwiaDMiLDEpLGt1KDIsIkFjdGl2ZSBGaWx0ZXJzIiksQW0oKSxSbSgzLCJkaXYiLDIpLFJtKDQsImJ1dHRvbiIsMyksVm0oImNsaWNrIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLnRvZ2dsZVNpZGViYXJFeHBhbmRlZC5lbWl0KCl9KSksVG0oNSwibWF0LWljb24iLDQpLEFtKCksQW0oKSxBbSgpLFJtKDYsImRpdiIsNSksUXAoNyxaeXQsMSwyLCJucG1pLXZpb2xpbi1maWx0ZXIiLDYpLEFtKCksUXAoOCxYeXQsMywwLCJkaXYiLDcpKSwyJmUmJihyYyg3KSxEbSgibmdGb3JPZiIsbi5tZXRyaWNGaWx0ZXJzKSxyYygxKSxEbSgibmdJZiIsMD09PW4ubWV0cmljRmlsdGVycy5sZW5ndGgpKX0sZGlyZWN0aXZlczpbWEgsRFcsbE0sZE0scXl0XSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47aGVpZ2h0OjEwMCV9LmZpbHRlcnMtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWI7ZGlzcGxheTpmbGV4O2hlaWdodDo0MnB4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO3BhZGRpbmc6MCAxMHB4fS5maWx0ZXJzLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmlubGluZTtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9LnNpZGUtdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci1yYWRpdXM6M3B4O2JvcmRlcjoxcHggc29saWQgI2ViZWJlYjtkaXNwbGF5OmZsZXg7aGVpZ2h0OjMwcHg7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDozMHB4fS5maWx0ZXJzW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdy15OmF1dG99LmZpbHRlcnMtaGludFtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtoZWlnaHQ6NDJweDtwYWRkaW5nOjAgMTZweH0uZmlsdGVycy1oaW50LXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoS3l0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InZpb2xpbi1maWx0ZXJzLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vdmlvbGluX2ZpbHRlcnNfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vdmlvbGluX2ZpbHRlcnNfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse3NpZGViYXJFeHBhbmRlZDpbe3R5cGU6eHl9XSxtZXRyaWNGaWx0ZXJzOlt7dHlwZTp4eX1dLHRvZ2dsZVNpZGViYXJFeHBhbmRlZDpbe3R5cGU6T3l9XX0pO2NsYXNzIEp5dHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5zaWRlYmFyRXhwYW5kZWQkPXRoaXMuc3RvcmUuc2VsZWN0KF9idCksdGhpcy5tZXRyaWNGaWx0ZXJzJD10aGlzLnN0b3JlLnNlbGVjdChnYnQpLnBpcGUoSXQoKHQ9Pk9iamVjdC5lbnRyaWVzKHQpKSkpfW9uVG9nZ2xlU2lkZWJhckV4cGFuZGVkKCl7dGhpcy5zdG9yZS5kaXNwYXRjaChXYnQoKSl9fWZ1bmN0aW9uIFF5dCh0LGUsbil7cmV0dXJuIHQubGVuZ3RoIT1lLmxlbmd0aD9uOmUubWFwKCgoZSxuKT0+ZS10W25dKSkubWFwKCh0PT5NYXRoLnBvdyh0LDIpKSkucmVkdWNlKCgodCxlKT0+dCtlKSwwKX1KeXQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEp5dCkoU20oSXcpKX0sSnl0Lsm1Y21wPXRvKHt0eXBlOkp5dCxzZWxlY3RvcnM6W1sibnBtaS12aW9saW4tZmlsdGVycyJdXSxkZWNsczozLHZhcnM6Nixjb25zdHM6W1szLCJzaWRlYmFyRXhwYW5kZWQiLCJtZXRyaWNGaWx0ZXJzIiwidG9nZ2xlU2lkZWJhckV4cGFuZGVkIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJ2aW9saW4tZmlsdGVycy1jb21wb25lbnQiLDApLFZtKCJ0b2dnbGVTaWRlYmFyRXhwYW5kZWQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25Ub2dnbGVTaWRlYmFyRXhwYW5kZWQoKX0pKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQW0oKSksMiZlJiZEbSgic2lkZWJhckV4cGFuZGVkIixUaCgxLDIsbi5zaWRlYmFyRXhwYW5kZWQkKSkoIm1ldHJpY0ZpbHRlcnMiLFRoKDIsNCxuLm1ldHJpY0ZpbHRlcnMkKSl9LGRpcmVjdGl2ZXM6W0t5dF0scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEp5dCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJucG1pLXZpb2xpbi1maWx0ZXJzIix0ZW1wbGF0ZTonXG4gICAgPHZpb2xpbi1maWx0ZXJzLWNvbXBvbmVudFxuICAgICAgW3NpZGViYXJFeHBhbmRlZF09InNpZGViYXJFeHBhbmRlZCQgfCBhc3luYyJcbiAgICAgIFttZXRyaWNGaWx0ZXJzXT0ibWV0cmljRmlsdGVycyQgfCBhc3luYyJcbiAgICAgICh0b2dnbGVTaWRlYmFyRXhwYW5kZWQpPSJvblRvZ2dsZVNpZGViYXJFeHBhbmRlZCgpIlxuICAgID48L3Zpb2xpbi1maWx0ZXJzLWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NvbnN0ICR5dD1bInRodW1iQ29udGFpbmVyIl0sdF90PVsidG9nZ2xlQmFyIl0sZV90PVsiaW5wdXQiXSxuX3Q9ZnVuY3Rpb24odCl7cmV0dXJue2VudGVyRHVyYXRpb246dH19LG9fdD1uZXcgR2EoIm1hdC1zbGlkZS10b2dnbGUtZGVmYXVsdC1vcHRpb25zIix7cHJvdmlkZWRJbjoicm9vdCIsZmFjdG9yeTooKT0+KHtkaXNhYmxlVG9nZ2xlVmFsdWU6ITF9KX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KbGV0IGlfdD0wO2NvbnN0IGFfdD17cHJvdmlkZTpJVix1c2VFeGlzdGluZzpxZSgoKCk9PmxfdCkpLG11bHRpOiEwfTtjbGFzcyByX3R7Y29uc3RydWN0b3IodCxlKXt0aGlzLnNvdXJjZT10LHRoaXMuY2hlY2tlZD1lfX1jb25zdCBzX3Q9JEkoSkkoUUkoS0koY2xhc3N7Y29uc3RydWN0b3IodCl7dGhpcy5fZWxlbWVudFJlZj10fX0pKSkpO2NsYXNzIGxfdCBleHRlbmRzIHNfdHtjb25zdHJ1Y3Rvcih0LGUsbixvLGksYSl7c3VwZXIodCksdGhpcy5fZm9jdXNNb25pdG9yPWUsdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWY9bix0aGlzLmRlZmF1bHRzPWksdGhpcy5fb25DaGFuZ2U9dD0+e30sdGhpcy5fb25Ub3VjaGVkPSgpPT57fSx0aGlzLl91bmlxdWVJZD0ibWF0LXNsaWRlLXRvZ2dsZS0iKyArK2lfdCx0aGlzLl9yZXF1aXJlZD0hMSx0aGlzLl9jaGVja2VkPSExLHRoaXMubmFtZT1udWxsLHRoaXMuaWQ9dGhpcy5fdW5pcXVlSWQsdGhpcy5sYWJlbFBvc2l0aW9uPSJhZnRlciIsdGhpcy5hcmlhTGFiZWw9bnVsbCx0aGlzLmFyaWFMYWJlbGxlZGJ5PW51bGwsdGhpcy5jaGFuZ2U9bmV3IExoLHRoaXMudG9nZ2xlQ2hhbmdlPW5ldyBMaCx0aGlzLnRhYkluZGV4PXBhcnNlSW50KG8pfHwwLHRoaXMuY29sb3I9dGhpcy5kZWZhdWx0Q29sb3I9aS5jb2xvcnx8ImFjY2VudCIsdGhpcy5fbm9vcEFuaW1hdGlvbnM9Ik5vb3BBbmltYXRpb25zIj09PWF9Z2V0IHJlcXVpcmVkKCl7cmV0dXJuIHRoaXMuX3JlcXVpcmVkfXNldCByZXF1aXJlZCh0KXt0aGlzLl9yZXF1aXJlZD15eih0KX1nZXQgY2hlY2tlZCgpe3JldHVybiB0aGlzLl9jaGVja2VkfXNldCBjaGVja2VkKHQpe3RoaXMuX2NoZWNrZWQ9eXoodCksdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCl9Z2V0IGlucHV0SWQoKXtyZXR1cm5gJHt0aGlzLmlkfHx0aGlzLl91bmlxdWVJZH0taW5wdXRgfW5nQWZ0ZXJDb250ZW50SW5pdCgpe3RoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHRoaXMuX2VsZW1lbnRSZWYsITApLnN1YnNjcmliZSgodD0+eyJrZXlib2FyZCI9PT10fHwicHJvZ3JhbSI9PT10P3RoaXMuX2lucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk6dHx8UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKCk9PnRoaXMuX29uVG91Y2hlZCgpKSl9KSl9bmdPbkRlc3Ryb3koKXt0aGlzLl9mb2N1c01vbml0b3Iuc3RvcE1vbml0b3JpbmcodGhpcy5fZWxlbWVudFJlZil9X29uQ2hhbmdlRXZlbnQodCl7dC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLnRvZ2dsZUNoYW5nZS5lbWl0KCksdGhpcy5kZWZhdWx0cy5kaXNhYmxlVG9nZ2xlVmFsdWU/dGhpcy5faW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2hlY2tlZD10aGlzLmNoZWNrZWQ6KHRoaXMuY2hlY2tlZD10aGlzLl9pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5jaGVja2VkLHRoaXMuX2VtaXRDaGFuZ2VFdmVudCgpKX1fb25JbnB1dENsaWNrKHQpe3Quc3RvcFByb3BhZ2F0aW9uKCl9d3JpdGVWYWx1ZSh0KXt0aGlzLmNoZWNrZWQ9ISF0fXJlZ2lzdGVyT25DaGFuZ2UodCl7dGhpcy5fb25DaGFuZ2U9dH1yZWdpc3Rlck9uVG91Y2hlZCh0KXt0aGlzLl9vblRvdWNoZWQ9dH1zZXREaXNhYmxlZFN0YXRlKHQpe3RoaXMuZGlzYWJsZWQ9dCx0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKX1mb2N1cyh0LGUpe2U/dGhpcy5fZm9jdXNNb25pdG9yLmZvY3VzVmlhKHRoaXMuX2lucHV0RWxlbWVudCxlLHQpOnRoaXMuX2lucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKHQpfXRvZ2dsZSgpe3RoaXMuY2hlY2tlZD0hdGhpcy5jaGVja2VkLHRoaXMuX29uQ2hhbmdlKHRoaXMuY2hlY2tlZCl9X2VtaXRDaGFuZ2VFdmVudCgpe3RoaXMuX29uQ2hhbmdlKHRoaXMuY2hlY2tlZCksdGhpcy5jaGFuZ2UuZW1pdChuZXcgcl90KHRoaXMsdGhpcy5jaGVja2VkKSl9X29uTGFiZWxUZXh0Q2hhbmdlKCl7dGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpfX1sX3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGxfdCkoU20oaGcpLFNtKFNJKSxTbShVZyksTmEoInRhYmluZGV4IiksU20ob190KSxTbShWUCw4KSl9LGxfdC7JtWNtcD10byh7dHlwZTpsX3Qsc2VsZWN0b3JzOltbIm1hdC1zbGlkZS10b2dnbGUiXV0sdmlld1F1ZXJ5OmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihRaCgkeXQsNSksUWgodF90LDUpLFFoKGVfdCw1KSksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5fdGh1bWJFbD10LmZpcnN0KSxKaCh0PXRiKCkpJiYobi5fdGh1bWJCYXJFbD10LmZpcnN0KSxKaCh0PXRiKCkpJiYobi5faW5wdXRFbGVtZW50PXQuZmlyc3QpfX0saG9zdEF0dHJzOlsxLCJtYXQtc2xpZGUtdG9nZ2xlIl0saG9zdFZhcnM6MTIsaG9zdEJpbmRpbmdzOmZ1bmN0aW9uIHQoZSxuKXsyJmUmJihUdSgiaWQiLG4uaWQpLGpwKCJ0YWJpbmRleCIsbi5kaXNhYmxlZD9udWxsOi0xKSgiYXJpYS1sYWJlbCIsbnVsbCkoImFyaWEtbGFiZWxsZWRieSIsbnVsbCkscHUoIm1hdC1jaGVja2VkIixuLmNoZWNrZWQpKCJtYXQtZGlzYWJsZWQiLG4uZGlzYWJsZWQpKCJtYXQtc2xpZGUtdG9nZ2xlLWxhYmVsLWJlZm9yZSIsImJlZm9yZSI9PW4ubGFiZWxQb3NpdGlvbikoIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIixuLl9ub29wQW5pbWF0aW9ucykpfSxpbnB1dHM6e2Rpc2FibGVkOiJkaXNhYmxlZCIsZGlzYWJsZVJpcHBsZToiZGlzYWJsZVJpcHBsZSIsY29sb3I6ImNvbG9yIix0YWJJbmRleDoidGFiSW5kZXgiLG5hbWU6Im5hbWUiLGlkOiJpZCIsbGFiZWxQb3NpdGlvbjoibGFiZWxQb3NpdGlvbiIsYXJpYUxhYmVsOlsiYXJpYS1sYWJlbCIsImFyaWFMYWJlbCJdLGFyaWFMYWJlbGxlZGJ5OlsiYXJpYS1sYWJlbGxlZGJ5IiwiYXJpYUxhYmVsbGVkYnkiXSxyZXF1aXJlZDoicmVxdWlyZWQiLGNoZWNrZWQ6ImNoZWNrZWQiLGFyaWFEZXNjcmliZWRieTpbImFyaWEtZGVzY3JpYmVkYnkiLCJhcmlhRGVzY3JpYmVkYnkiXX0sb3V0cHV0czp7Y2hhbmdlOiJjaGFuZ2UiLHRvZ2dsZUNoYW5nZToidG9nZ2xlQ2hhbmdlIn0sZXhwb3J0QXM6WyJtYXRTbGlkZVRvZ2dsZSJdLGZlYXR1cmVzOltwZyhbYV90XSkseHBdLG5nQ29udGVudFNlbGVjdG9yczpbIioiXSxkZWNsczoxNix2YXJzOjIwLGNvbnN0czpbWzEsIm1hdC1zbGlkZS10b2dnbGUtbGFiZWwiXSxbImxhYmVsIiwiIl0sWzEsIm1hdC1zbGlkZS10b2dnbGUtYmFyIl0sWyJ0b2dnbGVCYXIiLCIiXSxbInR5cGUiLCJjaGVja2JveCIsInJvbGUiLCJzd2l0Y2giLDEsIm1hdC1zbGlkZS10b2dnbGUtaW5wdXQiLCJjZGstdmlzdWFsbHktaGlkZGVuIiwzLCJpZCIsInJlcXVpcmVkIiwidGFiSW5kZXgiLCJjaGVja2VkIiwiZGlzYWJsZWQiLCJjaGFuZ2UiLCJjbGljayJdLFsiaW5wdXQiLCIiXSxbMSwibWF0LXNsaWRlLXRvZ2dsZS10aHVtYi1jb250YWluZXIiXSxbInRodW1iQ29udGFpbmVyIiwiIl0sWzEsIm1hdC1zbGlkZS10b2dnbGUtdGh1bWIiXSxbIm1hdC1yaXBwbGUiLCIiLDEsIm1hdC1zbGlkZS10b2dnbGUtcmlwcGxlIiwibWF0LWZvY3VzLWluZGljYXRvciIsMywibWF0UmlwcGxlVHJpZ2dlciIsIm1hdFJpcHBsZURpc2FibGVkIiwibWF0UmlwcGxlQ2VudGVyZWQiLCJtYXRSaXBwbGVSYWRpdXMiLCJtYXRSaXBwbGVBbmltYXRpb24iXSxbMSwibWF0LXJpcHBsZS1lbGVtZW50IiwibWF0LXNsaWRlLXRvZ2dsZS1wZXJzaXN0ZW50LXJpcHBsZSJdLFsxLCJtYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnQiLDMsImNka09ic2VydmVDb250ZW50Il0sWyJsYWJlbENvbnRlbnQiLCIiXSxbMiwiZGlzcGxheSIsIm5vbmUiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmKFptKCksUm0oMCwibGFiZWwiLDAsMSksUm0oMiwiZGl2IiwyLDMpLFJtKDQsImlucHV0Iiw0LDUpLFZtKCJjaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLl9vbkNoYW5nZUV2ZW50KGUpfSkpKCJjbGljayIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uX29uSW5wdXRDbGljayhlKX0pKSxBbSgpLFJtKDYsImRpdiIsNiw3KSxUbSg4LCJkaXYiLDgpLFJtKDksImRpdiIsOSksVG0oMTAsImRpdiIsMTApLEFtKCksQW0oKSxBbSgpLFJtKDExLCJzcGFuIiwxMSwxMiksVm0oImNka09ic2VydmVDb250ZW50IiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLl9vbkxhYmVsVGV4dENoYW5nZSgpfSkpLFJtKDEzLCJzcGFuIiwxMyksa3UoMTQsIsKgIiksQW0oKSxYbSgxNSksQW0oKSxBbSgpKSwyJmUpe2NvbnN0IHQ9JHAoMSksZT0kcCgxMik7anAoImZvciIsbi5pbnB1dElkKSxyYygyKSxwdSgibWF0LXNsaWRlLXRvZ2dsZS1iYXItbm8tc2lkZS1tYXJnaW4iLCFlLnRleHRDb250ZW50fHwhZS50ZXh0Q29udGVudC50cmltKCkpLHJjKDIpLERtKCJpZCIsbi5pbnB1dElkKSgicmVxdWlyZWQiLG4ucmVxdWlyZWQpKCJ0YWJJbmRleCIsbi50YWJJbmRleCkoImNoZWNrZWQiLG4uY2hlY2tlZCkoImRpc2FibGVkIixuLmRpc2FibGVkKSxqcCgibmFtZSIsbi5uYW1lKSgiYXJpYS1jaGVja2VkIixuLmNoZWNrZWQudG9TdHJpbmcoKSkoImFyaWEtbGFiZWwiLG4uYXJpYUxhYmVsKSgiYXJpYS1sYWJlbGxlZGJ5IixuLmFyaWFMYWJlbGxlZGJ5KSgiYXJpYS1kZXNjcmliZWRieSIsbi5hcmlhRGVzY3JpYmVkYnkpLHJjKDUpLERtKCJtYXRSaXBwbGVUcmlnZ2VyIix0KSgibWF0UmlwcGxlRGlzYWJsZWQiLG4uZGlzYWJsZVJpcHBsZXx8bi5kaXNhYmxlZCkoIm1hdFJpcHBsZUNlbnRlcmVkIiwhMCkoIm1hdFJpcHBsZVJhZGl1cyIsMjApKCJtYXRSaXBwbGVBbmltYXRpb24iLE1oKDE4LG5fdCxuLl9ub29wQW5pbWF0aW9ucz8wOjE1MCkpfX0sZGlyZWN0aXZlczpba0gsanpdLHN0eWxlczpbIi5tYXQtc2xpZGUtdG9nZ2xle2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDoyNHB4O21heC13aWR0aDoxMDAlO2xpbmUtaGVpZ2h0OjI0cHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWItY29udGFpbmVye3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxNnB4LCAwLCAwKX1bZGlyPXJ0bF0gLm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWItY29udGFpbmVye3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTZweCwgMCwgMCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWRpc2FibGVke29wYWNpdHk6LjM4fS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1kaXNhYmxlZCAubWF0LXNsaWRlLXRvZ2dsZS1sYWJlbCwubWF0LXNsaWRlLXRvZ2dsZS5tYXQtZGlzYWJsZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWItY29udGFpbmVye2N1cnNvcjpkZWZhdWx0fS5tYXQtc2xpZGUtdG9nZ2xlLWxhYmVsey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtkaXNwbGF5OmZsZXg7ZmxleDoxO2ZsZXgtZGlyZWN0aW9uOnJvdzthbGlnbi1pdGVtczpjZW50ZXI7aGVpZ2h0OmluaGVyaXQ7Y3Vyc29yOnBvaW50ZXJ9Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudHt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9Lm1hdC1zbGlkZS10b2dnbGUtbGFiZWwtYmVmb3JlIC5tYXQtc2xpZGUtdG9nZ2xlLWxhYmVse29yZGVyOjF9Lm1hdC1zbGlkZS10b2dnbGUtbGFiZWwtYmVmb3JlIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcntvcmRlcjoyfVtkaXI9cnRsXSAubWF0LXNsaWRlLXRvZ2dsZS1sYWJlbC1iZWZvcmUgLm1hdC1zbGlkZS10b2dnbGUtYmFyLC5tYXQtc2xpZGUtdG9nZ2xlLWJhcnttYXJnaW4tcmlnaHQ6OHB4O21hcmdpbi1sZWZ0OjB9W2Rpcj1ydGxdIC5tYXQtc2xpZGUtdG9nZ2xlLWJhciwubWF0LXNsaWRlLXRvZ2dsZS1sYWJlbC1iZWZvcmUgLm1hdC1zbGlkZS10b2dnbGUtYmFye21hcmdpbi1sZWZ0OjhweDttYXJnaW4tcmlnaHQ6MH0ubWF0LXNsaWRlLXRvZ2dsZS1iYXItbm8tc2lkZS1tYXJnaW57bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MH0ubWF0LXNsaWRlLXRvZ2dsZS10aHVtYi1jb250YWluZXJ7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxO3dpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7dG9wOi0zcHg7bGVmdDowO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLCAwLCAwKTt0cmFuc2l0aW9uOmFsbCA4MG1zIGxpbmVhcjt0cmFuc2l0aW9uLXByb3BlcnR5OnRyYW5zZm9ybX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWItY29udGFpbmVye3RyYW5zaXRpb246bm9uZX1bZGlyPXJ0bF0gLm1hdC1zbGlkZS10b2dnbGUtdGh1bWItY29udGFpbmVye2xlZnQ6YXV0bztyaWdodDowfS5tYXQtc2xpZGUtdG9nZ2xlLXRodW1ie2hlaWdodDoyMHB4O3dpZHRoOjIwcHg7Ym9yZGVyLXJhZGl1czo1MCV9Lm1hdC1zbGlkZS10b2dnbGUtYmFye3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOjM2cHg7aGVpZ2h0OjE0cHg7ZmxleC1zaHJpbms6MDtib3JkZXItcmFkaXVzOjhweH0ubWF0LXNsaWRlLXRvZ2dsZS1pbnB1dHtib3R0b206MDtsZWZ0OjEwcHh9W2Rpcj1ydGxdIC5tYXQtc2xpZGUtdG9nZ2xlLWlucHV0e2xlZnQ6YXV0bztyaWdodDoxMHB4fS5tYXQtc2xpZGUtdG9nZ2xlLWJhciwubWF0LXNsaWRlLXRvZ2dsZS10aHVtYnt0cmFuc2l0aW9uOmFsbCA4MG1zIGxpbmVhcjt0cmFuc2l0aW9uLXByb3BlcnR5OmJhY2tncm91bmQtY29sb3I7dHJhbnNpdGlvbi1kZWxheTo1MG1zfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlLXRvZ2dsZS1iYXIsLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1ie3RyYW5zaXRpb246bm9uZX0ubWF0LXNsaWRlLXRvZ2dsZSAubWF0LXNsaWRlLXRvZ2dsZS1yaXBwbGV7cG9zaXRpb246YWJzb2x1dGU7dG9wOmNhbGMoNTAlIC0gMjBweCk7bGVmdDpjYWxjKDUwJSAtIDIwcHgpO2hlaWdodDo0MHB4O3dpZHRoOjQwcHg7ei1pbmRleDoxO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1hdC1zbGlkZS10b2dnbGUgLm1hdC1zbGlkZS10b2dnbGUtcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQ6bm90KC5tYXQtc2xpZGUtdG9nZ2xlLXBlcnNpc3RlbnQtcmlwcGxlKXtvcGFjaXR5Oi4xMn0ubWF0LXNsaWRlLXRvZ2dsZS1wZXJzaXN0ZW50LXJpcHBsZXt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3RyYW5zZm9ybTpub25lfS5tYXQtc2xpZGUtdG9nZ2xlLWJhcjpob3ZlciAubWF0LXNsaWRlLXRvZ2dsZS1wZXJzaXN0ZW50LXJpcHBsZXtvcGFjaXR5Oi4wNH0ubWF0LXNsaWRlLXRvZ2dsZTpub3QoLm1hdC1kaXNhYmxlZCkuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1zbGlkZS10b2dnbGUtcGVyc2lzdGVudC1yaXBwbGV7b3BhY2l0eTouMTJ9Lm1hdC1zbGlkZS10b2dnbGUtcGVyc2lzdGVudC1yaXBwbGUsLm1hdC1zbGlkZS10b2dnbGUubWF0LWRpc2FibGVkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcjpob3ZlciAubWF0LXNsaWRlLXRvZ2dsZS1wZXJzaXN0ZW50LXJpcHBsZXtvcGFjaXR5OjB9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LXNsaWRlLXRvZ2dsZS1iYXI6aG92ZXIgLm1hdC1zbGlkZS10b2dnbGUtcGVyc2lzdGVudC1yaXBwbGV7ZGlzcGxheTpub25lfX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JvcmRlcjoxcHggc29saWR9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNsaWRlLXRvZ2dsZS5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7b3V0bGluZToycHggZG90dGVkO291dGxpbmUtb2Zmc2V0OjVweH1cbiJdLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLGxfdC5jdG9yUGFyYW1ldGVycz0oKT0+W3t0eXBlOmhnfSx7dHlwZTpTSX0se3R5cGU6VWd9LHt0eXBlOlN0cmluZyxkZWNvcmF0b3JzOlt7dHlwZTpqYSxhcmdzOlsidGFiaW5kZXgiXX1dfSx7dHlwZTp2b2lkIDAsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbb190XX1dfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6U3J9LHt0eXBlOmtyLGFyZ3M6W1ZQXX1dfV0sbF90LnByb3BEZWNvcmF0b3JzPXtfdGh1bWJFbDpbe3R5cGU6WmEsYXJnczpbInRodW1iQ29udGFpbmVyIl19XSxfdGh1bWJCYXJFbDpbe3R5cGU6WmEsYXJnczpbInRvZ2dsZUJhciJdfV0sbmFtZTpbe3R5cGU6eHl9XSxpZDpbe3R5cGU6eHl9XSxsYWJlbFBvc2l0aW9uOlt7dHlwZTp4eX1dLGFyaWFMYWJlbDpbe3R5cGU6eHksYXJnczpbImFyaWEtbGFiZWwiXX1dLGFyaWFMYWJlbGxlZGJ5Olt7dHlwZTp4eSxhcmdzOlsiYXJpYS1sYWJlbGxlZGJ5Il19XSxhcmlhRGVzY3JpYmVkYnk6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWRlc2NyaWJlZGJ5Il19XSxyZXF1aXJlZDpbe3R5cGU6eHl9XSxjaGVja2VkOlt7dHlwZTp4eX1dLGNoYW5nZTpbe3R5cGU6T3l9XSx0b2dnbGVDaGFuZ2U6W3t0eXBlOk95fV0sX2lucHV0RWxlbWVudDpbe3R5cGU6WmEsYXJnczpbImlucHV0Il19XX0sKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChsX3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibWF0LXNsaWRlLXRvZ2dsZSIsZXhwb3J0QXM6Im1hdFNsaWRlVG9nZ2xlIixob3N0OntjbGFzczoibWF0LXNsaWRlLXRvZ2dsZSIsIltpZF0iOiJpZCIsIlthdHRyLnRhYmluZGV4XSI6ImRpc2FibGVkID8gbnVsbCA6IC0xIiwiW2F0dHIuYXJpYS1sYWJlbF0iOiJudWxsIiwiW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XSI6Im51bGwiLCJbY2xhc3MubWF0LWNoZWNrZWRdIjoiY2hlY2tlZCIsIltjbGFzcy5tYXQtZGlzYWJsZWRdIjoiZGlzYWJsZWQiLCJbY2xhc3MubWF0LXNsaWRlLXRvZ2dsZS1sYWJlbC1iZWZvcmVdIjonbGFiZWxQb3NpdGlvbiA9PSAiYmVmb3JlIicsIltjbGFzcy5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZV0iOiJfbm9vcEFuaW1hdGlvbnMifSx0ZW1wbGF0ZTonPGxhYmVsIFthdHRyLmZvcl09ImlucHV0SWQiIGNsYXNzPSJtYXQtc2xpZGUtdG9nZ2xlLWxhYmVsIiAjbGFiZWw+XG4gIDxkaXYgI3RvZ2dsZUJhciBjbGFzcz0ibWF0LXNsaWRlLXRvZ2dsZS1iYXIiXG4gICAgICAgW2NsYXNzLm1hdC1zbGlkZS10b2dnbGUtYmFyLW5vLXNpZGUtbWFyZ2luXT0iIWxhYmVsQ29udGVudC50ZXh0Q29udGVudCB8fCAhbGFiZWxDb250ZW50LnRleHRDb250ZW50LnRyaW0oKSI+XG5cbiAgICA8aW5wdXQgI2lucHV0IGNsYXNzPSJtYXQtc2xpZGUtdG9nZ2xlLWlucHV0IGNkay12aXN1YWxseS1oaWRkZW4iIHR5cGU9ImNoZWNrYm94IlxuICAgICAgICAgICByb2xlPSJzd2l0Y2giXG4gICAgICAgICAgIFtpZF09ImlucHV0SWQiXG4gICAgICAgICAgIFtyZXF1aXJlZF09InJlcXVpcmVkIlxuICAgICAgICAgICBbdGFiSW5kZXhdPSJ0YWJJbmRleCJcbiAgICAgICAgICAgW2NoZWNrZWRdPSJjaGVja2VkIlxuICAgICAgICAgICBbZGlzYWJsZWRdPSJkaXNhYmxlZCJcbiAgICAgICAgICAgW2F0dHIubmFtZV09Im5hbWUiXG4gICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09ImNoZWNrZWQudG9TdHJpbmcoKSJcbiAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09ImFyaWFMYWJlbCJcbiAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT0iYXJpYUxhYmVsbGVkYnkiXG4gICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPSJhcmlhRGVzY3JpYmVkYnkiXG4gICAgICAgICAgIChjaGFuZ2UpPSJfb25DaGFuZ2VFdmVudCgkZXZlbnQpIlxuICAgICAgICAgICAoY2xpY2spPSJfb25JbnB1dENsaWNrKCRldmVudCkiPlxuXG4gICAgPGRpdiBjbGFzcz0ibWF0LXNsaWRlLXRvZ2dsZS10aHVtYi1jb250YWluZXIiICN0aHVtYkNvbnRhaW5lcj5cbiAgICAgIDxkaXYgY2xhc3M9Im1hdC1zbGlkZS10b2dnbGUtdGh1bWIiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz0ibWF0LXNsaWRlLXRvZ2dsZS1yaXBwbGUgbWF0LWZvY3VzLWluZGljYXRvciIgbWF0LXJpcHBsZVxuICAgICAgICAgICBbbWF0UmlwcGxlVHJpZ2dlcl09ImxhYmVsIlxuICAgICAgICAgICBbbWF0UmlwcGxlRGlzYWJsZWRdPSJkaXNhYmxlUmlwcGxlIHx8IGRpc2FibGVkIlxuICAgICAgICAgICBbbWF0UmlwcGxlQ2VudGVyZWRdPSJ0cnVlIlxuICAgICAgICAgICBbbWF0UmlwcGxlUmFkaXVzXT0iMjAiXG4gICAgICAgICAgIFttYXRSaXBwbGVBbmltYXRpb25dPSJ7ZW50ZXJEdXJhdGlvbjogX25vb3BBbmltYXRpb25zID8gMCA6IDE1MH0iPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9Im1hdC1yaXBwbGUtZWxlbWVudCBtYXQtc2xpZGUtdG9nZ2xlLXBlcnNpc3RlbnQtcmlwcGxlIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuXG4gIDxzcGFuIGNsYXNzPSJtYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnQiICNsYWJlbENvbnRlbnQgKGNka09ic2VydmVDb250ZW50KT0iX29uTGFiZWxUZXh0Q2hhbmdlKCkiPlxuICAgIFx4M2MhLS0gQWRkIGFuIGludmlzaWJsZSBzcGFuIHNvIEpBV1MgY2FuIHJlYWQgdGhlIGxhYmVsIC0tXHgzZVxuICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmUiPiZuYnNwOzwvc3Bhbj5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvc3Bhbj5cbjwvbGFiZWw+XG4nLHByb3ZpZGVyczpbYV90XSxpbnB1dHM6WyJkaXNhYmxlZCIsImRpc2FibGVSaXBwbGUiLCJjb2xvciIsInRhYkluZGV4Il0sZW5jYXBzdWxhdGlvbjpIbi5Ob25lLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2gsc3R5bGVzOlsiLm1hdC1zbGlkZS10b2dnbGV7ZGlzcGxheTppbmxpbmUtYmxvY2s7aGVpZ2h0OjI0cHg7bWF4LXdpZHRoOjEwMCU7bGluZS1oZWlnaHQ6MjRweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTpub25lOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYi1jb250YWluZXJ7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDE2cHgsIDAsIDApfVtkaXI9cnRsXSAubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYi1jb250YWluZXJ7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xNnB4LCAwLCAwKX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtZGlzYWJsZWR7b3BhY2l0eTouMzh9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWRpc2FibGVkIC5tYXQtc2xpZGUtdG9nZ2xlLWxhYmVsLC5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1kaXNhYmxlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYi1jb250YWluZXJ7Y3Vyc29yOmRlZmF1bHR9Lm1hdC1zbGlkZS10b2dnbGUtbGFiZWx7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2Rpc3BsYXk6ZmxleDtmbGV4OjE7ZmxleC1kaXJlY3Rpb246cm93O2FsaWduLWl0ZW1zOmNlbnRlcjtoZWlnaHQ6aW5oZXJpdDtjdXJzb3I6cG9pbnRlcn0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50e3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpc30ubWF0LXNsaWRlLXRvZ2dsZS1sYWJlbC1iZWZvcmUgLm1hdC1zbGlkZS10b2dnbGUtbGFiZWx7b3JkZXI6MX0ubWF0LXNsaWRlLXRvZ2dsZS1sYWJlbC1iZWZvcmUgLm1hdC1zbGlkZS10b2dnbGUtYmFye29yZGVyOjJ9W2Rpcj1ydGxdIC5tYXQtc2xpZGUtdG9nZ2xlLWxhYmVsLWJlZm9yZSAubWF0LXNsaWRlLXRvZ2dsZS1iYXIsLm1hdC1zbGlkZS10b2dnbGUtYmFye21hcmdpbi1yaWdodDo4cHg7bWFyZ2luLWxlZnQ6MH1bZGlyPXJ0bF0gLm1hdC1zbGlkZS10b2dnbGUtYmFyLC5tYXQtc2xpZGUtdG9nZ2xlLWxhYmVsLWJlZm9yZSAubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7bWFyZ2luLWxlZnQ6OHB4O21hcmdpbi1yaWdodDowfS5tYXQtc2xpZGUtdG9nZ2xlLWJhci1uby1zaWRlLW1hcmdpbnttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowfS5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iLWNvbnRhaW5lcntwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjE7d2lkdGg6MjBweDtoZWlnaHQ6MjBweDt0b3A6LTNweDtsZWZ0OjA7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApO3RyYW5zaXRpb246YWxsIDgwbXMgbGluZWFyO3RyYW5zaXRpb24tcHJvcGVydHk6dHJhbnNmb3JtfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYi1jb250YWluZXJ7dHJhbnNpdGlvbjpub25lfVtkaXI9cnRsXSAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYi1jb250YWluZXJ7bGVmdDphdXRvO3JpZ2h0OjB9Lm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7aGVpZ2h0OjIwcHg7d2lkdGg6MjBweDtib3JkZXItcmFkaXVzOjUwJX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MzZweDtoZWlnaHQ6MTRweDtmbGV4LXNocmluazowO2JvcmRlci1yYWRpdXM6OHB4fS5tYXQtc2xpZGUtdG9nZ2xlLWlucHV0e2JvdHRvbTowO2xlZnQ6MTBweH1bZGlyPXJ0bF0gLm1hdC1zbGlkZS10b2dnbGUtaW5wdXR7bGVmdDphdXRvO3JpZ2h0OjEwcHh9Lm1hdC1zbGlkZS10b2dnbGUtYmFyLC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1ie3RyYW5zaXRpb246YWxsIDgwbXMgbGluZWFyO3RyYW5zaXRpb24tcHJvcGVydHk6YmFja2dyb3VuZC1jb2xvcjt0cmFuc2l0aW9uLWRlbGF5OjUwbXN9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGUtdG9nZ2xlLWJhciwuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7dHJhbnNpdGlvbjpub25lfS5tYXQtc2xpZGUtdG9nZ2xlIC5tYXQtc2xpZGUtdG9nZ2xlLXJpcHBsZXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6Y2FsYyg1MCUgLSAyMHB4KTtsZWZ0OmNhbGMoNTAlIC0gMjBweCk7aGVpZ2h0OjQwcHg7d2lkdGg6NDBweDt6LWluZGV4OjE7cG9pbnRlci1ldmVudHM6bm9uZX0ubWF0LXNsaWRlLXRvZ2dsZSAubWF0LXNsaWRlLXRvZ2dsZS1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudDpub3QoLm1hdC1zbGlkZS10b2dnbGUtcGVyc2lzdGVudC1yaXBwbGUpe29wYWNpdHk6LjEyfS5tYXQtc2xpZGUtdG9nZ2xlLXBlcnNpc3RlbnQtcmlwcGxle3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7dHJhbnNmb3JtOm5vbmV9Lm1hdC1zbGlkZS10b2dnbGUtYmFyOmhvdmVyIC5tYXQtc2xpZGUtdG9nZ2xlLXBlcnNpc3RlbnQtcmlwcGxle29wYWNpdHk6LjA0fS5tYXQtc2xpZGUtdG9nZ2xlOm5vdCgubWF0LWRpc2FibGVkKS5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LXNsaWRlLXRvZ2dsZS1wZXJzaXN0ZW50LXJpcHBsZXtvcGFjaXR5Oi4xMn0ubWF0LXNsaWRlLXRvZ2dsZS1wZXJzaXN0ZW50LXJpcHBsZSwubWF0LXNsaWRlLXRvZ2dsZS5tYXQtZGlzYWJsZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFyOmhvdmVyIC5tYXQtc2xpZGUtdG9nZ2xlLXBlcnNpc3RlbnQtcmlwcGxle29wYWNpdHk6MH1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtc2xpZGUtdG9nZ2xlLWJhcjpob3ZlciAubWF0LXNsaWRlLXRvZ2dsZS1wZXJzaXN0ZW50LXJpcHBsZXtkaXNwbGF5Om5vbmV9fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWIsLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7Ym9yZGVyOjFweCBzb2xpZH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc2xpZGUtdG9nZ2xlLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcntvdXRsaW5lOjJweCBkb3R0ZWQ7b3V0bGluZS1vZmZzZXQ6NXB4fVxuIl19XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpoZ30se3R5cGU6U0l9LHt0eXBlOlVnfSx7dHlwZTpTdHJpbmcsZGVjb3JhdG9yczpbe3R5cGU6amEsYXJnczpbInRhYmluZGV4Il19XX0se3R5cGU6dm9pZCAwLGRlY29yYXRvcnM6W3t0eXBlOmtyLGFyZ3M6W29fdF19XX0se3R5cGU6U3RyaW5nLGRlY29yYXRvcnM6W3t0eXBlOlNyfSx7dHlwZTprcixhcmdzOltWUF19XX1dfSkse25hbWU6W3t0eXBlOnh5fV0saWQ6W3t0eXBlOnh5fV0sbGFiZWxQb3NpdGlvbjpbe3R5cGU6eHl9XSxhcmlhTGFiZWw6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWxhYmVsIl19XSxhcmlhTGFiZWxsZWRieTpbe3R5cGU6eHksYXJnczpbImFyaWEtbGFiZWxsZWRieSJdfV0sY2hhbmdlOlt7dHlwZTpPeX1dLHRvZ2dsZUNoYW5nZTpbe3R5cGU6T3l9XSxyZXF1aXJlZDpbe3R5cGU6eHl9XSxjaGVja2VkOlt7dHlwZTp4eX1dLF90aHVtYkVsOlt7dHlwZTpaYSxhcmdzOlsidGh1bWJDb250YWluZXIiXX1dLF90aHVtYkJhckVsOlt7dHlwZTpaYSxhcmdzOlsidG9nZ2xlQmFyIl19XSxhcmlhRGVzY3JpYmVkYnk6W3t0eXBlOnh5LGFyZ3M6WyJhcmlhLWRlc2NyaWJlZGJ5Il19XSxfaW5wdXRFbGVtZW50Olt7dHlwZTpaYSxhcmdzOlsiaW5wdXQiXX1dfSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjb25zdCBjX3Q9e3Byb3ZpZGU6R1YsdXNlRXhpc3Rpbmc6cWUoKCgpPT5kX3QpKSxtdWx0aTohMH07Y2xhc3MgZF90IGV4dGVuZHMgS1V7fWRfdC7JtWZhYz0oZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gZnVuY3Rpb24gZShuKXtyZXR1cm4odHx8KHQ9QWEoZF90KSkpKG58fGRfdCl9fSkoKSxkX3QuybVkaXI9bG8oe3R5cGU6ZF90LHNlbGVjdG9yczpbWyJtYXQtc2xpZGUtdG9nZ2xlIiwicmVxdWlyZWQiLCIiLCJmb3JtQ29udHJvbE5hbWUiLCIiXSxbIm1hdC1zbGlkZS10b2dnbGUiLCJyZXF1aXJlZCIsIiIsImZvcm1Db250cm9sIiwiIl0sWyJtYXQtc2xpZGUtdG9nZ2xlIiwicmVxdWlyZWQiLCIiLCJuZ01vZGVsIiwiIl1dLGZlYXR1cmVzOltwZyhbY190XSkseHBdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChkX3QsW3t0eXBlOkN5LGFyZ3M6W3tzZWxlY3RvcjoibWF0LXNsaWRlLXRvZ2dsZVtyZXF1aXJlZF1bZm9ybUNvbnRyb2xOYW1lXSxcbiAgICAgICAgICAgICBtYXQtc2xpZGUtdG9nZ2xlW3JlcXVpcmVkXVtmb3JtQ29udHJvbF0sIG1hdC1zbGlkZS10b2dnbGVbcmVxdWlyZWRdW25nTW9kZWxdIixwcm92aWRlcnM6W2NfdF19XX1dLG51bGwsbnVsbCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwpjbGFzcyBwX3R7fXBfdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8cF90KX0scF90Lsm1bW9kPWFvKHt0eXBlOnBfdH0pLHBfdC7JtWluaj12bih7fSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChwX3QsW3t0eXBlOkF5LGFyZ3M6W3tleHBvcnRzOltkX3RdLGRlY2xhcmF0aW9uczpbZF90XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKHBfdCx7ZGVjbGFyYXRpb25zOltkX3RdLGV4cG9ydHM6W2RfdF19KTtjbGFzcyBtX3R7fWZ1bmN0aW9uIHVfdCh0LGUpezEmdCYmVG0oMCwibWF0LWljb24iLDMpfW1fdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bV90KX0sbV90Lsm1bW9kPWFvKHt0eXBlOm1fdH0pLG1fdC7JtWluaj12bih7aW1wb3J0czpbW3BfdCxTSCxYSSxVel0scF90LFhJXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobV90LFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbcF90LFNILFhJLFV6XSxleHBvcnRzOltwX3QsbF90LFhJXSxkZWNsYXJhdGlvbnM6W2xfdF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhtX3Qse2RlY2xhcmF0aW9uczpmdW5jdGlvbigpe3JldHVybltsX3RdfSxpbXBvcnRzOmZ1bmN0aW9uKCl7cmV0dXJuW3BfdCxTSCxYSSxVel19LGV4cG9ydHM6ZnVuY3Rpb24oKXtyZXR1cm5bcF90LGxfdCxYSV19fSk7Y2xhc3MgZl90e2NvbnN0cnVjdG9yKCl7dGhpcy5vblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2U9bmV3IExofX1mX3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGZfdCl9LGZfdC7JtWNtcD10byh7dHlwZTpmX3Qsc2VsZWN0b3JzOltbIm5wbWktYW5ub3RhdGlvbnMtc2VhcmNoLWNvbXBvbmVudCJdXSxob3N0VmFyczoyLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MiZlJiZwdSgidmFsaWQiLG4uaXNSZWdleEZpbHRlclZhbGlkKX0saW5wdXRzOntyZWdleEZpbHRlclZhbHVlOiJyZWdleEZpbHRlclZhbHVlIixpc1JlZ2V4RmlsdGVyVmFsaWQ6ImlzUmVnZXhGaWx0ZXJWYWxpZCJ9LG91dHB1dHM6e29uUmVnZXhGaWx0ZXJWYWx1ZUNoYW5nZToib25SZWdleEZpbHRlclZhbHVlQ2hhbmdlIn0sZGVjbHM6Myx2YXJzOjIsY29uc3RzOltbInN2Z0ljb24iLCJzZWFyY2hfMjRweCJdLFsiYXV0b2NvbXBsZXRlIiwib2ZmIiwicGxhY2Vob2xkZXIiLCJGaWx0ZXIgQW5ub3RhdGlvbnMiLDMsInZhbHVlIiwiaW5wdXQiXSxbInN2Z0ljb24iLCJlcnJvcl8yNHB4IiwiY2xhc3MiLCJlcnJvci1pY29uIiwibWF0VG9vbHRpcCIsIkludmFsaWQgcmVnZXggZmlsdGVyLiBUaGUgcmVzdWx0IG1heSBiZSBzdGFsZS4iLDQsIm5nSWYiXSxbInN2Z0ljb24iLCJlcnJvcl8yNHB4IiwibWF0VG9vbHRpcCIsIkludmFsaWQgcmVnZXggZmlsdGVyLiBUaGUgcmVzdWx0IG1heSBiZSBzdGFsZS4iLDEsImVycm9yLWljb24iXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFRtKDAsIm1hdC1pY29uIiwwKSxSbSgxLCJpbnB1dCIsMSksVm0oImlucHV0IiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UuZW1pdChlLnRhcmdldC52YWx1ZSl9KSksQW0oKSxRcCgyLHVfdCwxLDAsIm1hdC1pY29uIiwyKSksMiZlJiYocmMoMSksRG0oInZhbHVlIixuLnJlZ2V4RmlsdGVyVmFsdWUpLHJjKDEpLERtKCJuZ0lmIiwhbi5pc1JlZ2V4RmlsdGVyVmFsaWQpKX0sZGlyZWN0aXZlczpbRFcsZE1dLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV06bm90KC52YWxpZCl7Y29sb3I6I2M2MjgyOH1bX25naG9zdC0lQ09NUCVdOm5vdCgudmFsaWQpICAgaW5wdXRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOmN1cnJlbnRDb2xvcn1bX25naG9zdC0lQ09NUCVdOm5vdCgudmFsaWQpICAgLmVycm9yLWljb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNjNjI4Mjg7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MH0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZl90LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im5wbWktYW5ub3RhdGlvbnMtc2VhcmNoLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vYW5ub3RhdGlvbnNfc2VhcmNoX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyIuL2Fubm90YXRpb25zX3NlYXJjaF9jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7cmVnZXhGaWx0ZXJWYWx1ZTpbe3R5cGU6eHl9XSxvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2U6W3t0eXBlOk95fV0saXNSZWdleEZpbHRlclZhbGlkOlt7dHlwZTpQeSxhcmdzOlsiY2xhc3MudmFsaWQiXX0se3R5cGU6eHl9XX0pO2NsYXNzIGdfdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5hbm5vdGF0aW9uc0ZpbHRlciQ9dGhpcy5zdG9yZS5zZWxlY3QobWJ0KSx0aGlzLmlzQW5ub3RhdGlvbnNGaWx0ZXJWYWxpZCQ9dGhpcy5hbm5vdGF0aW9uc0ZpbHRlciQucGlwZShJdCgodD0+e3RyeXtyZXR1cm4gbmV3IFJlZ0V4cCh0KSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KSkpfWZpbHRlckNoYW5nZSh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKElidCh7cmVnZXg6dH0pKX19ZnVuY3Rpb24gaF90KHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Tm0oMCksUm0oMSwiYnV0dG9uIiw1KSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7aGkodCk7Y29uc3Qgbj1ZbSgpO3JldHVybiBuLm9uRmxhZ0Fubm90YXRpb25zLmVtaXQobi5zZWxlY3RlZEFubm90YXRpb25zKX0pKSxUbSgyLCJtYXQtaWNvbiIsNiksQW0oKSxSbSgzLCJidXR0b24iLDcpLFZtKCJjbGljayIsKGZ1bmN0aW9uIGUoKXtoaSh0KTtjb25zdCBuPVltKCk7cmV0dXJuIG4ub25IaWRlQW5ub3RhdGlvbnMuZW1pdChuLnNlbGVjdGVkQW5ub3RhdGlvbnMpfSkpLFRtKDQsIm1hdC1pY29uIiw4KSxBbSgpLHptKCl9aWYoMiZ0KXtjb25zdCB0PVltKCk7cmMoMSksRG0oImRpc2FibGVkIiwwPT09dC5zZWxlY3RlZEFubm90YXRpb25zLmxlbmd0aCkscmMoMiksRG0oImRpc2FibGVkIiwwPT09dC5zZWxlY3RlZEFubm90YXRpb25zLmxlbmd0aCl9fWZ1bmN0aW9uIGJfdCh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO05tKDApLFJtKDEsIm1hdC1zbGlkZS10b2dnbGUiLDkpLFZtKCJjaGFuZ2UiLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLFltKCkub25Ub2dnbGVTaG93Q291bnRzLmVtaXQoKX0pKSxrdSgyLCIgU2FtcGxlIENvdW50ICIpLEFtKCksUm0oMywibWF0LXNsaWRlLXRvZ2dsZSIsMTApLFZtKCJjaGFuZ2UiLChmdW5jdGlvbiBlKCl7cmV0dXJuIGhpKHQpLFltKCkub25Ub2dnbGVTaG93SGlkZGVuLmVtaXQoKX0pKSxrdSg0LCIgU2hvdyBIaWRkZW4gIiksQW0oKSxUbSg1LCJucG1pLWFubm90YXRpb25zLXNlYXJjaCIpLHptKCl9aWYoMiZ0KXtjb25zdCB0PVltKCk7cmMoMSksRG0oImNoZWNrZWQiLHQuc2hvd0NvdW50cykscmMoMiksRG0oImNoZWNrZWQiLHQuc2hvd0hpZGRlbil9fWdfdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8Z190KShTbShJdykpfSxnX3QuybVjbXA9dG8oe3R5cGU6Z190LHNlbGVjdG9yczpbWyJucG1pLWFubm90YXRpb25zLXNlYXJjaCJdXSxkZWNsczozLHZhcnM6Nixjb25zdHM6W1szLCJyZWdleEZpbHRlclZhbHVlIiwiaXNSZWdleEZpbHRlclZhbGlkIiwib25SZWdleEZpbHRlclZhbHVlQ2hhbmdlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJucG1pLWFubm90YXRpb25zLXNlYXJjaC1jb21wb25lbnQiLDApLFZtKCJvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLmZpbHRlckNoYW5nZShlKX0pKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQW0oKSksMiZlJiZEbSgicmVnZXhGaWx0ZXJWYWx1ZSIsVGgoMSwyLG4uYW5ub3RhdGlvbnNGaWx0ZXIkKSkoImlzUmVnZXhGaWx0ZXJWYWxpZCIsVGgoMiw0LG4uaXNBbm5vdGF0aW9uc0ZpbHRlclZhbGlkJCkpfSxkaXJlY3RpdmVzOltmX3RdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChnX3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibnBtaS1hbm5vdGF0aW9ucy1zZWFyY2giLHRlbXBsYXRlOidcbiAgICA8bnBtaS1hbm5vdGF0aW9ucy1zZWFyY2gtY29tcG9uZW50XG4gICAgICBbcmVnZXhGaWx0ZXJWYWx1ZV09ImFubm90YXRpb25zRmlsdGVyJCB8IGFzeW5jIlxuICAgICAgW2lzUmVnZXhGaWx0ZXJWYWxpZF09ImlzQW5ub3RhdGlvbnNGaWx0ZXJWYWxpZCQgfCBhc3luYyJcbiAgICAgIChvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UpPSJmaWx0ZXJDaGFuZ2UoJGV2ZW50KSJcbiAgICA+PC9ucG1pLWFubm90YXRpb25zLXNlYXJjaC1jb21wb25lbnQ+XG4gICcsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSxudWxsKTtjbGFzcyB5X3R7Y29uc3RydWN0b3IoKXt0aGlzLm9uRmxhZ0Fubm90YXRpb25zPW5ldyBMaCx0aGlzLm9uSGlkZUFubm90YXRpb25zPW5ldyBMaCx0aGlzLm9uVG9nZ2xlRXhwYW5kZWQ9bmV3IExoLHRoaXMub25Ub2dnbGVTaG93Q291bnRzPW5ldyBMaCx0aGlzLm9uVG9nZ2xlU2hvd0hpZGRlbj1uZXcgTGh9fXlfdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8eV90KX0seV90Lsm1Y21wPXRvKHt0eXBlOnlfdCxzZWxlY3RvcnM6W1sibnBtaS1hbm5vdGF0aW9ucy1saXN0LXRvb2xiYXItY29tcG9uZW50Il1dLGlucHV0czp7bnVtQW5ub3RhdGlvbnM6Im51bUFubm90YXRpb25zIixleHBhbmRlZDoiZXhwYW5kZWQiLHNlbGVjdGVkQW5ub3RhdGlvbnM6InNlbGVjdGVkQW5ub3RhdGlvbnMiLGFubm90YXRpb25zRXhwYW5kZWQ6ImFubm90YXRpb25zRXhwYW5kZWQiLHNob3dDb3VudHM6InNob3dDb3VudHMiLHNob3dIaWRkZW46InNob3dIaWRkZW4ifSxvdXRwdXRzOntvbkZsYWdBbm5vdGF0aW9uczoib25GbGFnQW5ub3RhdGlvbnMiLG9uSGlkZUFubm90YXRpb25zOiJvbkhpZGVBbm5vdGF0aW9ucyIsb25Ub2dnbGVFeHBhbmRlZDoib25Ub2dnbGVFeHBhbmRlZCIsb25Ub2dnbGVTaG93Q291bnRzOiJvblRvZ2dsZVNob3dDb3VudHMiLG9uVG9nZ2xlU2hvd0hpZGRlbjoib25Ub2dnbGVTaG93SGlkZGVuIn0sZGVjbHM6Nyx2YXJzOjQsY29uc3RzOmZ1bmN0aW9uKCl7bGV0IHQsZSxuO3JldHVybiB0PSJ1bmRlZmluZWQiIT10eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUmJm5nSTE4bkNsb3N1cmVNb2RlP2dvb2cuZ2V0TXNnKCJIaWRlcy9TaG93cyB0aGUgQW5ub3RhdGlvbnMgTGlzdCIpOiRsb2NhbGl6ZWA6TGFiZWwgZm9yIGEgYnV0dG9uIHRoYXQgaGlkZXMvc2hvd3MgdGhlIGFubm90YXRpb25zIGxpc3Qu4pCfYjM2MDNiYTMzZTUzMDhkZDhjNWU4MDVlNTA4YjJmNzIzM2RmODlkNOKQnzczMzYzNzQ0MTMwNTYzNDI0OTI6SGlkZXMvU2hvd3MgdGhlIEFubm90YXRpb25zIExpc3RgLGU9InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSYmbmdJMThuQ2xvc3VyZU1vZGU/Z29vZy5nZXRNc2coIkZsYWcgU2VsZWN0ZWQgQW5ub3RhdGlvbnMiKTokbG9jYWxpemVgOkxhYmVsIGZvciBhIGJ1dHRvbiB0aGF0IGZsYWdzIHNlbGVjdGVkIGFubm90YXRpb25zLuKQnzU2OTJhZDg4MzEwMzhhOTBjNTg2M2ExZTlhZGY5NzQ4Y2FjM2NhZDjikJ8yMjQ0MDk5ODkxMzEzMzM2NTk1OkZsYWcgU2VsZWN0ZWQgQW5ub3RhdGlvbnNgLG49InVuZGVmaW5lZCIhPXR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSYmbmdJMThuQ2xvc3VyZU1vZGU/Z29vZy5nZXRNc2coIkhpZGUgU2VsZWN0ZWQgQW5ub3RhdGlvbnMiKTokbG9jYWxpemVgOkxhYmVsIGZvciBhIGJ1dHRvbiB0aGF0IGhpZGVzIHNlbGVjdGVkIGFubm90YXRpb25zLuKQnzAzNDJjZGIzMzU4ZmE4ZTNmYTI3MjIwYTgyNThhNzI4NzQzMGI3MGbikJ81NDYyODMyMzkxMDkyMDg3NDg1OkhpZGUgU2VsZWN0ZWQgQW5ub3RhdGlvbnNgLFtbMSwiYW5ub3RhdGlvbnMtdGl0bGUtY29udGFpbmVyIl0sWzEsImFubm90YXRpb25zLXRpdGxlIl0sWzQsIm5nSWYiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLHQsMSwiZXhwYW5kLWJ1dHRvbiIsMywiY2xpY2siXSxbMywic3ZnSWNvbiJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsZSwidGl0bGUiLCJGbGFnZ2luZyBhbm5vdGF0aW9ucyBhZGRzIHRoZW0gdG8geW91ciBpbnZlc3RpZ2F0aW9uIHJlc3VsdHMsIHdoaWNoIGNhbiBsYXRlciBiZSBleHBvcnRlZC4iLDMsImRpc2FibGVkIiwiY2xpY2siXSxbInN2Z0ljb24iLCJmbGFnXzI0cHgiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLG4sInRpdGxlIiwiUmVtb3Zpbmcgbm9uLWNyaXRpY2FsIGFubm90YXRpb25zIHVuY2x1dHRlcnMgdGhlIHZpZXcuIFJlbW92ZWQgYW5ub3RhdGlvbnMgYXJlIHJlbW92ZWQgZnJvbSBhbGwgdmlzdWFsaXphdGlvbnMuIiwzLCJkaXNhYmxlZCIsImNsaWNrIl0sWyJzdmdJY29uIiwidmlzaWJpbGl0eV9vZmZfMjRweCJdLFsidGl0bGUiLCJIaWRlcyBhbmQgc2hvd3MgdGhlIHNhbXBsZSBjb3VudCB3aGVyZSBhcHBsaWNhYmxlIChob3cgbWFueSBzYW1wbGVzIGJlbG9uZyB0byBhIGNhdGVnb3J5KS4iLDEsInNob3ctdG9nZ2xlIiwzLCJjaGVja2VkIiwiY2hhbmdlIl0sWyJ0aXRsZSIsIkhpZGVzIGFuZCBzaG93cyBoaWRkZW4gYW5ub3RhdGlvbnMgaW4gYWxsIHZpc3VhbGl6YXRpb25zLiIsMSwic2hvdy10b2dnbGUiLDMsImNoZWNrZWQiLCJjaGFuZ2UiXV19LHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJkaXYiLDApLFJtKDEsImgzIiwxKSxrdSgyKSxBbSgpLFFwKDMsaF90LDUsMiwibmctY29udGFpbmVyIiwyKSxBbSgpLFFwKDQsYl90LDYsMiwibmctY29udGFpbmVyIiwyKSxSbSg1LCJidXR0b24iLDMpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblRvZ2dsZUV4cGFuZGVkLmVtaXQoKX0pKSxUbSg2LCJtYXQtaWNvbiIsNCksQW0oKSksMiZlJiYocmMoMiksRHUoIkFubm90YXRpb25zICgiLG4ubnVtQW5ub3RhdGlvbnMsIikiKSxyYygxKSxEbSgibmdJZiIsbi5leHBhbmRlZCkscmMoMSksRG0oIm5nSWYiLG4uZXhwYW5kZWQpLHJjKDIpLERtKCJzdmdJY29uIixuLmV4cGFuZGVkPyJleHBhbmRfbGVzc18yNHB4IjoiZXhwYW5kX21vcmVfMjRweCIpKX0sZGlyZWN0aXZlczpbZE0sWEgsRFcsbF90LGdfdF0sc3R5bGVzOlsnLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9Lm1hdC1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9W19uZ2hvc3QtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7cGFkZGluZzowIDE2cHg7d2lkdGg6MTAwJX0uYW5ub3RhdGlvbnMtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lO2ZvbnQtc2l6ZTouOWVtO2ZvbnQtd2VpZ2h0OjUwMDtwYWRkaW5nLXJpZ2h0OjEwcHh9LmFubm90YXRpb25zLXRpdGxlLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6bm93cmFwO2ZsZXg6MSAxO2hlaWdodDo0MnB4fS5zaG93LXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOi45ZW07bWFyZ2luLXJpZ2h0Oi44ZW19J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHlfdCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJucG1pLWFubm90YXRpb25zLWxpc3QtdG9vbGJhci1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiIuL2Fubm90YXRpb25zX2xpc3RfdG9vbGJhcl9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9hbm5vdGF0aW9uc19saXN0X3Rvb2xiYXJfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse251bUFubm90YXRpb25zOlt7dHlwZTp4eX1dLGV4cGFuZGVkOlt7dHlwZTp4eX1dLHNlbGVjdGVkQW5ub3RhdGlvbnM6W3t0eXBlOnh5fV0sYW5ub3RhdGlvbnNFeHBhbmRlZDpbe3R5cGU6eHl9XSxzaG93Q291bnRzOlt7dHlwZTp4eX1dLHNob3dIaWRkZW46W3t0eXBlOnh5fV0sb25GbGFnQW5ub3RhdGlvbnM6W3t0eXBlOk95fV0sb25IaWRlQW5ub3RhdGlvbnM6W3t0eXBlOk95fV0sb25Ub2dnbGVFeHBhbmRlZDpbe3R5cGU6T3l9XSxvblRvZ2dsZVNob3dDb3VudHM6W3t0eXBlOk95fV0sb25Ub2dnbGVTaG93SGlkZGVuOlt7dHlwZTpPeX1dfSk7Y2xhc3MgX190e2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLnNlbGVjdGVkQW5ub3RhdGlvbnMkPXRoaXMuc3RvcmUuc2VsZWN0KGNidCksdGhpcy5hbm5vdGF0aW9uc0V4cGFuZGVkJD10aGlzLnN0b3JlLnNlbGVjdCh5YnQpLHRoaXMuc2hvd0NvdW50cyQ9dGhpcy5zdG9yZS5zZWxlY3QoQ2J0KSx0aGlzLnNob3dIaWRkZW4kPXRoaXMuc3RvcmUuc2VsZWN0KE1idCksdGhpcy5hbm5vdGF0aW9uc0ZpbHRlciQ9dGhpcy5zdG9yZS5zZWxlY3QobWJ0KSx0aGlzLmlzQW5ub3RhdGlvbnNGaWx0ZXJWYWxpZCQ9dGhpcy5hbm5vdGF0aW9uc0ZpbHRlciQucGlwZShJdCgodD0+e3RyeXtyZXR1cm4gQm9vbGVhbihuZXcgUmVnRXhwKHQpKX1jYXRjaCh0KXtyZXR1cm4hMX19KSkpfWZpbHRlckNoYW5nZSh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKElidCh7cmVnZXg6dH0pKX1mbGFnQW5ub3RhdGlvbnModCl7dGhpcy5zdG9yZS5kaXNwYXRjaChOYnQoe2Fubm90YXRpb25zOnR9KSl9aGlkZUFubm90YXRpb25zKHQpe3RoaXMuc3RvcmUuZGlzcGF0Y2goemJ0KHthbm5vdGF0aW9uczp0fSkpfXRvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zdG9yZS5kaXNwYXRjaChHYnQoKSl9dG9nZ2xlU2hvd0NvdW50cygpe3RoaXMuc3RvcmUuZGlzcGF0Y2goWWJ0KCkpfXRvZ2dsZVNob3dIaWRkZW4oKXt0aGlzLnN0b3JlLmRpc3BhdGNoKHFidCgpKX19X190Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxfX3QpKFNtKEl3KSl9LF9fdC7JtWNtcD10byh7dHlwZTpfX3Qsc2VsZWN0b3JzOltbIm5wbWktYW5ub3RhdGlvbnMtbGlzdC10b29sYmFyIl1dLGlucHV0czp7bnVtQW5ub3RhdGlvbnM6Im51bUFubm90YXRpb25zIixleHBhbmRlZDoiZXhwYW5kZWQifSxkZWNsczo1LHZhcnM6MTQsY29uc3RzOltbMywibnVtQW5ub3RhdGlvbnMiLCJleHBhbmRlZCIsInNlbGVjdGVkQW5ub3RhdGlvbnMiLCJhbm5vdGF0aW9uc0V4cGFuZGVkIiwic2hvd0NvdW50cyIsInNob3dIaWRkZW4iLCJvbkZsYWdBbm5vdGF0aW9ucyIsIm9uSGlkZUFubm90YXRpb25zIiwib25Ub2dnbGVFeHBhbmRlZCIsIm9uVG9nZ2xlU2hvd0NvdW50cyIsIm9uVG9nZ2xlU2hvd0hpZGRlbiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwibnBtaS1hbm5vdGF0aW9ucy1saXN0LXRvb2xiYXItY29tcG9uZW50IiwwKSxWbSgib25GbGFnQW5ub3RhdGlvbnMiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLmZsYWdBbm5vdGF0aW9ucyhlKX0pKSgib25IaWRlQW5ub3RhdGlvbnMiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLmhpZGVBbm5vdGF0aW9ucyhlKX0pKSgib25Ub2dnbGVFeHBhbmRlZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi50b2dnbGVFeHBhbmRlZCgpfSkpKCJvblRvZ2dsZVNob3dDb3VudHMiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4udG9nZ2xlU2hvd0NvdW50cygpfSkpKCJvblRvZ2dsZVNob3dIaWRkZW4iLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4udG9nZ2xlU2hvd0hpZGRlbigpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBaCgzLCJhc3luYyIpLEFoKDQsImFzeW5jIiksQW0oKSksMiZlJiZEbSgibnVtQW5ub3RhdGlvbnMiLG4ubnVtQW5ub3RhdGlvbnMpKCJleHBhbmRlZCIsbi5leHBhbmRlZCkoInNlbGVjdGVkQW5ub3RhdGlvbnMiLFRoKDEsNixuLnNlbGVjdGVkQW5ub3RhdGlvbnMkKSkoImFubm90YXRpb25zRXhwYW5kZWQiLFRoKDIsOCxuLmFubm90YXRpb25zRXhwYW5kZWQkKSkoInNob3dDb3VudHMiLFRoKDMsMTAsbi5zaG93Q291bnRzJCkpKCJzaG93SGlkZGVuIixUaCg0LDEyLG4uc2hvd0hpZGRlbiQpKX0sZGlyZWN0aXZlczpbeV90XSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoX190LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im5wbWktYW5ub3RhdGlvbnMtbGlzdC10b29sYmFyIix0ZW1wbGF0ZTonXG4gICAgPG5wbWktYW5ub3RhdGlvbnMtbGlzdC10b29sYmFyLWNvbXBvbmVudFxuICAgICAgW251bUFubm90YXRpb25zXT0ibnVtQW5ub3RhdGlvbnMiXG4gICAgICBbZXhwYW5kZWRdPSJleHBhbmRlZCJcbiAgICAgIFtzZWxlY3RlZEFubm90YXRpb25zXT0ic2VsZWN0ZWRBbm5vdGF0aW9ucyQgfCBhc3luYyJcbiAgICAgIFthbm5vdGF0aW9uc0V4cGFuZGVkXT0iYW5ub3RhdGlvbnNFeHBhbmRlZCQgfCBhc3luYyJcbiAgICAgIFtzaG93Q291bnRzXT0ic2hvd0NvdW50cyQgfCBhc3luYyJcbiAgICAgIFtzaG93SGlkZGVuXT0ic2hvd0hpZGRlbiQgfCBhc3luYyJcbiAgICAgIChvbkZsYWdBbm5vdGF0aW9ucyk9ImZsYWdBbm5vdGF0aW9ucygkZXZlbnQpIlxuICAgICAgKG9uSGlkZUFubm90YXRpb25zKT0iaGlkZUFubm90YXRpb25zKCRldmVudCkiXG4gICAgICAob25Ub2dnbGVFeHBhbmRlZCk9InRvZ2dsZUV4cGFuZGVkKCkiXG4gICAgICAob25Ub2dnbGVTaG93Q291bnRzKT0idG9nZ2xlU2hvd0NvdW50cygpIlxuICAgICAgKG9uVG9nZ2xlU2hvd0hpZGRlbik9InRvZ2dsZVNob3dIaWRkZW4oKSJcbiAgICA+PC9ucG1pLWFubm90YXRpb25zLWxpc3QtdG9vbGJhci1jb21wb25lbnQ+XG4gICcsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSx7bnVtQW5ub3RhdGlvbnM6W3t0eXBlOnh5fV0sZXhwYW5kZWQ6W3t0eXBlOnh5fV19KTtjb25zdCBDX3Q9WyJnbHlwaCJdO2NsYXNzIE1fdHtuZ0FmdGVyVmlld0luaXQoKXt0aGlzLnN2Zz1KNCh0aGlzLmdseXBoU1ZHLm5hdGl2ZUVsZW1lbnQpLHRoaXMubWFpbkNvbnRhaW5lcj10aGlzLnN2Zy5hcHBlbmQoImciKSx0aGlzLmRyYXcoKX1kcmF3KCl7ImNpcmNsZSI9PXRoaXMuc2hhcGU/dGhpcy5tYWluQ29udGFpbmVyLmFwcGVuZCgiY2lyY2xlIikuYXR0cigiZmlsbCIsdGhpcy5jb2xvcikuYXR0cigic3Ryb2tlIiwiYmxhY2siKS5hdHRyKCJjeCIsNSkuYXR0cigiY3kiLDUpLmF0dHIoInIiLDUpOiJiYXIiPT10aGlzLnNoYXBlP3RoaXMubWFpbkNvbnRhaW5lci5hcHBlbmQoInJlY3QiKS5hdHRyKCJmaWxsIix0aGlzLmNvbG9yKS5hdHRyKCJ4IiwwKS5hdHRyKCJ5IiwwKS5hdHRyKCJ3aWR0aCIsMTApLmF0dHIoImhlaWdodCIsMTApOiJydW5JbmRpY2F0b3IiPT10aGlzLnNoYXBlJiZ0aGlzLm1haW5Db250YWluZXIuYXBwZW5kKCJnIikuYXBwZW5kKCJwYXRoIikuYXR0cigiZmlsbCIsdGhpcy5jb2xvcikuYXR0cigic3Ryb2tlIiwiYmxhY2siKS5hdHRyKCJkIiwiTSAyIDAgTCAxMCAwIEwgNyA1IEwgMTAgMTAgTCAyIDEwIFoiKX19TV90Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxNX3QpfSxNX3QuybVjbXA9dG8oe3R5cGU6TV90LHNlbGVjdG9yczpbWyJucG1pLWxlZ2VuZC1lbGVtZW50Il1dLHZpZXdRdWVyeTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiZRaChDX3QsNyxoZyksMiZlKXtsZXQgdDtKaCh0PXRiKCkpJiYobi5nbHlwaFNWRz10LmZpcnN0KX19LGlucHV0czp7dGV4dDoidGV4dCIsY29sb3I6ImNvbG9yIixzaGFwZToic2hhcGUifSxkZWNsczo0LHZhcnM6MSxjb25zdHM6W1sxLCJnbHlwaCJdLFsiZ2x5cGgiLCIiXSxbMSwibGVnZW5kLWVsZW1lbnQtdGl0bGUiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKHFpKCksVG0oMCwic3ZnIiwwLDEpLFppKCksUm0oMiwiZGl2IiwyKSxrdSgzKSxBbSgpKSwyJmUmJihyYygzKSxTdShuLnRleHQpKX0sc3R5bGVzOlsiW19uZ2hvc3QtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O3BhZGRpbmctcmlnaHQ6MTBweH0ubGVnZW5kLWVsZW1lbnQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTouOGVtO3BhZGRpbmctbGVmdDo1cHh9LmdseXBoW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMHB4O2hlaWdodDoxMHB4fSJdLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChNX3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibnBtaS1sZWdlbmQtZWxlbWVudCIsdGVtcGxhdGVVcmw6Ii4vbGVnZW5kX2VsZW1lbnRfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vbGVnZW5kX2VsZW1lbnRfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse3RleHQ6W3t0eXBlOnh5fV0sY29sb3I6W3t0eXBlOnh5fV0sc2hhcGU6W3t0eXBlOnh5fV0sZ2x5cGhTVkc6W3t0eXBlOlphLGFyZ3M6WyJnbHlwaCIse3N0YXRpYzohMCxyZWFkOmhnfV19XX0pO2NsYXNzIHZfdHt9ZnVuY3Rpb24geF90KHQsZSl7aWYoMSZ0JiZUbSgwLCJtYXQtaWNvbiIsOCksMiZ0KXtjb25zdCB0PVltKDIpO0RtKCJzdmdJY29uIix0LnNvcnQub3JkZXI9PT10LlNvcnRPcmRlci5ERVNDRU5ESU5HPyJhcnJvd19kb3dud2FyZF8yNHB4IjoiYXJyb3dfdXB3YXJkXzI0cHgiKSgibmdDbGFzcyIsdC5zb3J0Lm9yZGVyPT09dC5Tb3J0T3JkZXIuREVTQ0VORElORz8iZG93bi1pY29uIjoidXAtaWNvbiIpfX1mdW5jdGlvbiBPX3QodCxlKXtpZigxJnQpe2NvbnN0IHQ9SG0oKTtSbSgwLCJkaXYiLDQpLFJtKDEsImRpdiIsNSksUm0oMiwiZGl2Iiw2KSxWbSgiY2xpY2siLChmdW5jdGlvbiBlKCl7Y29uc3Qgbj1oaSh0KS4kaW1wbGljaXQ7cmV0dXJuIFltKCkub25DaGFuZ2VTb3J0LmVtaXQobil9KSksa3UoMyksUXAoNCx4X3QsMSwyLCJtYXQtaWNvbiIsNyksQW0oKSxBbSgpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oKTtyYygzKSxEdSgiICIsbi5zdHJpcE1ldHJpYyh0KSwiICIpLHJjKDEpLERtKCJuZ0lmIix0PT09bi5zb3J0Lm1ldHJpYyl9fXZfdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8dl90KX0sdl90Lsm1Y21wPXRvKHt0eXBlOnZfdCxzZWxlY3RvcnM6W1sibnBtaS1hbm5vdGF0aW9ucy1saXN0LWxlZ2VuZCJdXSxkZWNsczo0LHZhcnM6MCxjb25zdHM6W1sidGV4dCIsInJ1biBpbmRpY2F0b3IiLCJjb2xvciIsInJnYigwLDAsMCkiLCJzaGFwZSIsInJ1bkluZGljYXRvciJdLFsidGV4dCIsInBvc2l0aXZlIGNvcnJlbGF0aW9uIiwiY29sb3IiLCJyZ2IoMTA5LCAxNzQsIDIxMykiLCJzaGFwZSIsImJhciJdLFsidGV4dCIsIm5lZ2F0aXZlIGNvcnJlbGF0aW9uIiwiY29sb3IiLCJyZ2IoMjQ5LCAxMDUsIDc2KSIsInNoYXBlIiwiYmFyIl0sWyJ0ZXh0Iiwic2FtcGxlIGNvdW50IiwiY29sb3IiLCJyZ2IoMTUxLCAxNTEsIDE1MSkiLCJzaGFwZSIsImNpcmNsZSJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwibnBtaS1sZWdlbmQtZWxlbWVudCIsMCksVG0oMSwibnBtaS1sZWdlbmQtZWxlbWVudCIsMSksVG0oMiwibnBtaS1sZWdlbmQtZWxlbWVudCIsMiksVG0oMywibnBtaS1sZWdlbmQtZWxlbWVudCIsMykpfSxkaXJlY3RpdmVzOltNX3RdLHN0eWxlczpbIltfbmdob3N0LSVDT01QJV17ZGlzcGxheTpmbGV4O3BhZGRpbmc6MCAxNnB4fSJdfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh2X3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibnBtaS1hbm5vdGF0aW9ucy1saXN0LWxlZ2VuZCIsdGVtcGxhdGVVcmw6Ii4vbGVnZW5kX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyIuL2xlZ2VuZF9jb21wb25lbnQuY3NzIl19XX1dLG51bGwsbnVsbCk7Y2xhc3MgUF90e2NvbnN0cnVjdG9yKCl7dGhpcy5vbkNoYW5nZVNvcnQ9bmV3IExoLHRoaXMub25BbGxBbm5vdGF0aW9uc1RvZ2dsZWQ9bmV3IExoLHRoaXMuU29ydE9yZGVyPW5idH1zdHJpcE1ldHJpYyh0KXtyZXR1cm4gbnl0KHQpfX1QX3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFBfdCl9LFBfdC7JtWNtcD10byh7dHlwZTpQX3Qsc2VsZWN0b3JzOltbIm5wbWktYW5ub3RhdGlvbnMtbGlzdC1oZWFkZXItY29tcG9uZW50Il1dLGlucHV0czp7bnVtQW5ub3RhdGlvbnM6Im51bUFubm90YXRpb25zIixzZWxlY3RlZEFubm90YXRpb25zOiJzZWxlY3RlZEFubm90YXRpb25zIixhY3RpdmVNZXRyaWNzOiJhY3RpdmVNZXRyaWNzIixzb3J0OiJzb3J0In0sb3V0cHV0czp7b25DaGFuZ2VTb3J0OiJvbkNoYW5nZVNvcnQiLG9uQWxsQW5ub3RhdGlvbnNUb2dnbGVkOiJvbkFsbEFubm90YXRpb25zVG9nZ2xlZCJ9LGRlY2xzOjQsdmFyczoyLGNvbnN0czpbWzEsInRvZ2dsZS1hbGwtY29udGFpbmVyIl0sWzMsImNoZWNrZWQiLCJjaGFuZ2UiXSxbMSwiYW5ub3RhdGlvbnMtaGVhZGVyLWNvbnRhaW5lcnMiXSxbImNsYXNzIiwiaGVhZGVyLWNvbHVtbiIsNCwibmdGb3IiLCJuZ0Zvck9mIl0sWzEsImhlYWRlci1jb2x1bW4iXSxbMSwiaGVhZGVyLWNvbnRhaW5lciJdLFsidGFiaW5kZXgiLCIwIiwicm9sZSIsImJ1dHRvbiIsInRpdGxlIiwiQ2hhbmdlIHRoZSBzb3J0IGJ5IGNsaWNraW5nIGFueSBvZiB0aGUgbWV0cmljcy4iLDEsImhlYWRlci1jbGlja2FibGUiLDMsImNsaWNrIl0sWyJjbGFzcyIsInNvcnQtaWNvbiIsMywic3ZnSWNvbiIsIm5nQ2xhc3MiLDQsIm5nSWYiXSxbMSwic29ydC1pY29uIiwzLCJzdmdJY29uIiwibmdDbGFzcyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiZGl2IiwwKSxSbSgxLCJtYXQtY2hlY2tib3giLDEpLFZtKCJjaGFuZ2UiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uQWxsQW5ub3RhdGlvbnNUb2dnbGVkLmVtaXQoZS5jaGVja2VkKX0pKSxBbSgpLEFtKCksUm0oMiwiZGl2IiwyKSxRcCgzLE9fdCw1LDIsImRpdiIsMyksQW0oKSksMiZlJiYocmMoMSksRG0oImNoZWNrZWQiLG4uc2VsZWN0ZWRBbm5vdGF0aW9ucy5sZW5ndGg9PT1uLm51bUFubm90YXRpb25zKSxyYygyKSxEbSgibmdGb3JPZiIsbi5hY3RpdmVNZXRyaWNzKSl9LGRpcmVjdGl2ZXM6W09ZLGxNLGRNLERXLGFNXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2JvcmRlci1ib3R0b206MnB4IHNvbGlkICNlYmViZWI7ZGlzcGxheTpmbGV4O2hlaWdodDoyOHB4O2FsaWduLWl0ZW1zOmZsZXgtZW5kO21hcmdpbi10b3A6OHB4fS5hbm5vdGF0aW9ucy1oZWFkZXItY29udGFpbmVyc1tfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZvbnQtc2l6ZTouOWVtO2ZvbnQtd2VpZ2h0OjUwMDtmbGV4LWdyb3c6MX0uaGVhZGVyLWNvbHVtbltfbmdjb250ZW50LSVDT01QJV17ZmxleDoxIDF9LmhlYWRlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5oZWFkZXItY2xpY2thYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmZsZXg7b3V0bGluZTpub25lfS50b2dnbGUtYWxsLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6MTBweDt3aWR0aDo5MHB4fS5zb3J0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxNnB4fSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChQX3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibnBtaS1hbm5vdGF0aW9ucy1saXN0LWhlYWRlci1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiIuL2hlYWRlcl9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9oZWFkZXJfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse251bUFubm90YXRpb25zOlt7dHlwZTp4eX1dLHNlbGVjdGVkQW5ub3RhdGlvbnM6W3t0eXBlOnh5fV0sYWN0aXZlTWV0cmljczpbe3R5cGU6eHl9XSxzb3J0Olt7dHlwZTp4eX1dLG9uQ2hhbmdlU29ydDpbe3R5cGU6T3l9XSxvbkFsbEFubm90YXRpb25zVG9nZ2xlZDpbe3R5cGU6T3l9XX0pO2NsYXNzIHdfdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5zZWxlY3RlZEFubm90YXRpb25zJD10aGlzLnN0b3JlLnNlbGVjdChjYnQpLHRoaXMuYW5ub3RhdGlvblNvcnQkPXRoaXMuc3RvcmUuc2VsZWN0KGhidCl9Y2hhbmdlU29ydCh0KXt0aGlzLnN0b3JlLmRpc3BhdGNoKFZidCh7bWV0cmljOnR9KSl9YWxsQW5ub3RhdGlvbnNUb2dnbGVkKHQpe3RoaXMuc3RvcmUuZGlzcGF0Y2goQWJ0KHQ/e2Fubm90YXRpb25zOk9iamVjdC5rZXlzKHRoaXMuYW5ub3RhdGlvbnMpfTp7YW5ub3RhdGlvbnM6W119KSl9fXdfdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8d190KShTbShJdykpfSx3X3QuybVjbXA9dG8oe3R5cGU6d190LHNlbGVjdG9yczpbWyJucG1pLWFubm90YXRpb25zLWxpc3QtaGVhZGVyIl1dLGlucHV0czp7bnVtQW5ub3RhdGlvbnM6Im51bUFubm90YXRpb25zIixhbm5vdGF0aW9uczoiYW5ub3RhdGlvbnMiLGFjdGl2ZU1ldHJpY3M6ImFjdGl2ZU1ldHJpY3MifSxkZWNsczozLHZhcnM6OCxjb25zdHM6W1szLCJudW1Bbm5vdGF0aW9ucyIsInNlbGVjdGVkQW5ub3RhdGlvbnMiLCJzb3J0IiwiYWN0aXZlTWV0cmljcyIsIm9uQ2hhbmdlU29ydCIsIm9uQWxsQW5ub3RhdGlvbnNUb2dnbGVkIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJucG1pLWFubm90YXRpb25zLWxpc3QtaGVhZGVyLWNvbXBvbmVudCIsMCksVm0oIm9uQ2hhbmdlU29ydCIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4uY2hhbmdlU29ydChlKX0pKSgib25BbGxBbm5vdGF0aW9uc1RvZ2dsZWQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLmFsbEFubm90YXRpb25zVG9nZ2xlZChlKX0pKSxBaCgxLCJhc3luYyIpLEFoKDIsImFzeW5jIiksQW0oKSksMiZlJiZEbSgibnVtQW5ub3RhdGlvbnMiLG4ubnVtQW5ub3RhdGlvbnMpKCJzZWxlY3RlZEFubm90YXRpb25zIixUaCgxLDQsbi5zZWxlY3RlZEFubm90YXRpb25zJCkpKCJzb3J0IixUaCgyLDYsbi5hbm5vdGF0aW9uU29ydCQpKSgiYWN0aXZlTWV0cmljcyIsbi5hY3RpdmVNZXRyaWNzKX0sZGlyZWN0aXZlczpbUF90XSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgod190LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im5wbWktYW5ub3RhdGlvbnMtbGlzdC1oZWFkZXIiLHRlbXBsYXRlOidcbiAgICA8bnBtaS1hbm5vdGF0aW9ucy1saXN0LWhlYWRlci1jb21wb25lbnRcbiAgICAgIFtudW1Bbm5vdGF0aW9uc109Im51bUFubm90YXRpb25zIlxuICAgICAgW3NlbGVjdGVkQW5ub3RhdGlvbnNdPSJzZWxlY3RlZEFubm90YXRpb25zJCB8IGFzeW5jIlxuICAgICAgW3NvcnRdPSJhbm5vdGF0aW9uU29ydCQgfCBhc3luYyJcbiAgICAgIFthY3RpdmVNZXRyaWNzXT0iYWN0aXZlTWV0cmljcyJcbiAgICAgIChvbkNoYW5nZVNvcnQpPSJjaGFuZ2VTb3J0KCRldmVudCkiXG4gICAgICAob25BbGxBbm5vdGF0aW9uc1RvZ2dsZWQpPSJhbGxBbm5vdGF0aW9uc1RvZ2dsZWQoJGV2ZW50KSJcbiAgICA+PC9ucG1pLWFubm90YXRpb25zLWxpc3QtaGVhZGVyLWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLHtudW1Bbm5vdGF0aW9uczpbe3R5cGU6eHl9XSxhbm5vdGF0aW9uczpbe3R5cGU6eHl9XSxhY3RpdmVNZXRyaWNzOlt7dHlwZTp4eX1dfSk7Y29uc3Qga190PVsiY2hhcnQiXSxTX3Q9WyJoaW50Q2xpcCJdO2Z1bmN0aW9uIERfdCh0LGUpezEmdCYmVG0oMCwibWF0LWljb24iLDEyKX1mdW5jdGlvbiBFX3QodCxlKXsxJnQmJlRtKDAsIm1hdC1pY29uIiwxMyl9ZnVuY3Rpb24gUl90KHQsZSl7aWYoMSZ0JiZUbSgwLCJtYXQtaWNvbiIsMTQpLDImdCl7Y29uc3QgdD1ZbSgpO0RtKCJzdmdJY29uIix0LnNvcnQub3JkZXI9PT10LlNvcnRPcmRlci5TSU1JTEFSPyJhcnJvd19kb3dud2FyZF8yNHB4IjoiYXJyb3dfdXB3YXJkXzI0cHgiKSgibmdDbGFzcyIsdC5zb3J0Lm9yZGVyPT09dC5Tb3J0T3JkZXIuU0lNSUxBUj8iZG93bi1pY29uIjoidXAtaWNvbiIpfX1jbGFzcyBBX3R7Y29uc3RydWN0b3IoKXt0aGlzLnNlbGVjdGVkPSExLHRoaXMub25TaG93U2ltaWxhckFubm90YXRpb25zPW5ldyBMaCx0aGlzLlNvcnRPcmRlcj1uYnQsdGhpcy53aWR0aD0xMCx0aGlzLmNoYXJ0V2lkdGg9MTAsdGhpcy5jaGFydEhlaWdodD0xMCx0aGlzLm1heERvdFJhZGl1cz0xMCx0aGlzLmNvdW50RG90T2Zmc2V0PTcwLHRoaXMuY291bnRUZXh0UGFkZGluZz0yLHRoaXMubWFyZ2luPXt0b3A6MCxyaWdodDowLGJvdHRvbTowLGxlZnQ6MTAwfSx0aGlzLnN0cm9rZUNvbG9yPSIjZmZmIix0aGlzLnRleHRDbGFzcz0iZGVmYXVsdC10ZXh0Iix0aGlzLnJ1bnM9W119b25SZXNpemUodCl7dGhpcy5yZWRyYXcoKX1uZ0FmdGVyVmlld0luaXQoKXt0aGlzLnN2Zz1KNCh0aGlzLmFubm90YXRpb25Db250YWluZXIubmF0aXZlRWxlbWVudCkuc2VsZWN0KCJzdmciKSx0aGlzLnhTY2FsZT1VdHQoKS5wYWRkaW5nKDApLHRoaXMueVNjYWxlPVV0dCgpLnBhZGRpbmcoMCksdGhpcy5zaXplU2NhbGU9ZWV0KCkuZG9tYWluKFswLDFdKSx0aGlzLmNvdW50U2l6ZVNjYWxlPWVldCgpLnJhbmdlKFsyLHRoaXMubWF4RG90UmFkaXVzXSksdGhpcy5tYWluQ29udGFpbmVyPXRoaXMuc3ZnLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsYHRyYW5zbGF0ZSgke3RoaXMubWFyZ2luLmxlZnR9LCAke3RoaXMubWFyZ2luLnRvcH0pYCksdGhpcy5iYXJzR3JvdXA9dGhpcy5tYWluQ29udGFpbmVyLmFwcGVuZCgiZyIpLHRoaXMuY291bnREb3RzR3JvdXA9dGhpcy5tYWluQ29udGFpbmVyLmFwcGVuZCgiZyIpLHRoaXMudGV4dHNHcm91cD10aGlzLm1haW5Db250YWluZXIuYXBwZW5kKCJnIiksdGhpcy5jb3VudFRleHRzR3JvdXA9dGhpcy5tYWluQ29udGFpbmVyLmFwcGVuZCgiZyIpLHRoaXMucnVuSGludEdyb3VwPXRoaXMuc3ZnLmFwcGVuZCgiZyIpLHRoaXMucmVkcmF3KCl9bmdPbkNoYW5nZXModCl7dGhpcy5zdmcmJnRoaXMucmVkcmF3KCl9cmVkcmF3KCl7dGhpcy5zZWxlY3RlZD10aGlzLnNlbGVjdGVkQW5ub3RhdGlvbnMuaW5jbHVkZXModGhpcy5hbm5vdGF0aW9uKSx0aGlzLnVwZGF0ZURpbWVuc2lvbnMoKSx0aGlzLnNldFRleHRDbGFzcygpLHRoaXMudXBkYXRlQXhlcygpLHRoaXMuZHJhdygpfXVwZGF0ZURpbWVuc2lvbnMoKXtjb25zdCB0PW5ldyBTZXQ7dGhpcy5kYXRhLmZvckVhY2goKGU9Pnt0LmFkZChlLnJ1bil9KSksdGhpcy5ydW5zPVsuLi50XSx0aGlzLnN2Zy5zdHlsZSgiaGVpZ2h0Iix0aGlzLm51bUFjdGl2ZVJ1bnMqdGhpcy5ydW5IZWlnaHQrInB4IiksdGhpcy5jaGFydEhlaWdodD10aGlzLnJ1bnMubGVuZ3RoKnRoaXMucnVuSGVpZ2h0LXRoaXMubWFyZ2luLnRvcC10aGlzLm1hcmdpbi5ib3R0b20sdGhpcy53aWR0aD10aGlzLmFubm90YXRpb25Db250YWluZXIubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aHx8MTAsdGhpcy5jaGFydFdpZHRoPXRoaXMud2lkdGgtdGhpcy5tYXJnaW4ubGVmdC10aGlzLm1hcmdpbi5yaWdodH1zZXRUZXh0Q2xhc3MoKXt0aGlzLnRleHRDbGFzcz0iZGVmYXVsdC10ZXh0Iix0aGlzLmZsYWdnZWRBbm5vdGF0aW9ucy5pbmNsdWRlcyh0aGlzLmFubm90YXRpb24pP3RoaXMudGV4dENsYXNzPSJmbGFnLXRleHQiOnRoaXMuaGlkZGVuQW5ub3RhdGlvbnMuaW5jbHVkZXModGhpcy5hbm5vdGF0aW9uKSYmKHRoaXMudGV4dENsYXNzPSJoaWRkZW4tdGV4dCIpfXVwZGF0ZUF4ZXMoKXt0aGlzLnhTY2FsZS5yYW5nZVJvdW5kKFswLHRoaXMuY2hhcnRXaWR0aC10aGlzLmNoYXJ0V2lkdGgvdGhpcy5hY3RpdmVNZXRyaWNzLmxlbmd0aF0pLmRvbWFpbih0aGlzLmFjdGl2ZU1ldHJpY3MubWFwKCh0PT5ueXQodCkpKSksdGhpcy55U2NhbGUucmFuZ2VSb3VuZChbMCx0aGlzLmNoYXJ0SGVpZ2h0LXRoaXMucnVuSGVpZ2h0XSkuZG9tYWluKHRoaXMucnVucyksdGhpcy5zaXplU2NhbGUucmFuZ2UoWzAsdGhpcy5jaGFydFdpZHRoL3RoaXMuYWN0aXZlTWV0cmljcy5sZW5ndGhdKSx0aGlzLmNvdW50U2l6ZVNjYWxlLmRvbWFpbihbMCx0aGlzLm1heENvdW50XSl9ZHJhdygpe3RoaXMuZHJhd1J1bkluZGljYXRvcnMoKSx0aGlzLmRyYXdSdW5IaW50VGV4dHMoKSx0aGlzLmRyYXdCYXJzKCksdGhpcy5kcmF3VGV4dHMoKSx0aGlzLnNob3dDb3VudHM/KHRoaXMuZHJhd0NvdW50RG90cygpLHRoaXMuZHJhd0NvdW50VGV4dHMoKSk6KHRoaXMuY291bnREb3RzR3JvdXAuc2VsZWN0QWxsKCIuY291bnQtZG90IikucmVtb3ZlKCksdGhpcy5jb3VudFRleHRzR3JvdXAuc2VsZWN0QWxsKCIuY291bnQtYmFja2dyb3VuZC10ZXh0IikucmVtb3ZlKCksdGhpcy5jb3VudFRleHRzR3JvdXAuc2VsZWN0QWxsKCIuY291bnQtdGV4dCIpLnJlbW92ZSgpKX1kcmF3UnVuSW5kaWNhdG9ycygpe0o0KHRoaXMuY2xpcFBhdGhFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpLnNlbGVjdCgicmVjdCIpLmF0dHIoIndpZHRoIix0aGlzLm1hcmdpbi5sZWZ0LTMwKS5hdHRyKCJoZWlnaHQiLHRoaXMuY2hhcnRIZWlnaHQpO2NvbnN0IHQ9dGhpcy5ydW5IaW50R3JvdXAuc2VsZWN0QWxsKCIuaGludCIpLmRhdGEodGhpcy5ydW5zKSxlPXQuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImhpbnQiKTtlLmFwcGVuZCgicGF0aCIpLmF0dHIoImQiLCJNIDAgMCBMIDE1IDAgTCAxMCAxMCBMIDE1IDIwIEwgMCAyMCBaIiksZS5tZXJnZSh0KS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybmB0cmFuc2xhdGUoMTAsICR7dGhpcy55U2NhbGUodCkrNX0pYH0uYmluZCh0aGlzKSkuYXR0cigiZmlsbCIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY29sb3JTY2FsZSh0KX0uYmluZCh0aGlzKSksdC5leGl0KCkucmVtb3ZlKCl9ZHJhd1J1bkhpbnRUZXh0cygpe2NvbnN0IHQ9dGhpcy5ydW5IaW50R3JvdXAuc2VsZWN0QWxsKCIuaGludC10ZXh0IikuZGF0YSh0aGlzLnJ1bnMpO3QuZW50ZXIoKS5hcHBlbmQoInRleHQiKS5hdHRyKCJ4IiwyNSkuYXR0cigiZm9udC1zaXplIiwiMTBweCIpLmF0dHIoImFsaWdubWVudC1iYXNlbGluZSIsIm1pZGRsZSIpLmF0dHIoImNsaXAtcGF0aCIsInVybCgjaGludC1jbGlwKSIpLm1lcmdlKHQpLmF0dHIoInkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnlTY2FsZSh0KSsxNX0uYmluZCh0aGlzKSkuYXR0cigiY2xhc3MiLGBoaW50LXRleHQgJHt0aGlzLnRleHRDbGFzc31gKS50ZXh0KCh0PT57dmFyIGU7cmV0dXJuKG51bGw9PT0oZT10aGlzLnJ1bklkVG9SdW5zLmdldCh0KSl8fHZvaWQgMD09PWU/dm9pZCAwOmUubmFtZSl8fCIifSkpLHQuZXhpdCgpLnJlbW92ZSgpfWRyYXdCYXJzKCl7Y29uc3QgdD10aGlzLmJhcnNHcm91cC5zZWxlY3RBbGwoIi5iYXIiKS5kYXRhKHRoaXMuZGF0YSk7dC5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwiYmFyIikuYXR0cigiaGVpZ2h0IiwyMCkubWVyZ2UodCkuYXR0cigiZmlsbCIsKHQ9Pm51bGw9PT10Lm5QTUlWYWx1ZT8iIjp0Lm5QTUlWYWx1ZT49MD9ib3QodC5uUE1JVmFsdWUpOl9vdCgtMSp0Lm5QTUlWYWx1ZSkpKS5hdHRyKCJ4IixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54U2NhbGUodC5tZXRyaWMpfS5iaW5kKHRoaXMpKS5hdHRyKCJ5IixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy55U2NhbGUodC5ydW4pKzV9LmJpbmQodGhpcykpLmF0dHIoIndpZHRoIixmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09PXQublBNSVZhbHVlPzA6dGhpcy5zaXplU2NhbGUoTWF0aC5hYnModC5uUE1JVmFsdWUpKX0uYmluZCh0aGlzKSksdC5leGl0KCkucmVtb3ZlKCl9ZHJhd0NvdW50RG90cygpe2NvbnN0IHQ9dGhpcy5jb3VudERvdHNHcm91cC5zZWxlY3RBbGwoIi5jb3VudC1kb3QiKS5kYXRhKHRoaXMuZGF0YSk7dC5lbnRlcigpLmFwcGVuZCgiY2lyY2xlIikuYXR0cigiY2xhc3MiLCJjb3VudC1kb3QiKS5hdHRyKCJzdHJva2UiLCJibGFjayIpLm1lcmdlKHQpLmF0dHIoImZpbGwiLGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dC5jb3VudFZhbHVlPyIiOnlvdCh0LmNvdW50VmFsdWUvdGhpcy5tYXhDb3VudCl9LmJpbmQodGhpcykpLmF0dHIoImN4IixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54U2NhbGUodC5tZXRyaWMpK3RoaXMuY291bnREb3RPZmZzZXR9LmJpbmQodGhpcykpLmF0dHIoImN5IixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy55U2NhbGUodC5ydW4pK3RoaXMucnVuSGVpZ2h0LzJ9LmJpbmQodGhpcykpLmF0dHIoInIiLGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dC5jb3VudFZhbHVlPzA6dGhpcy5jb3VudFNpemVTY2FsZSh0LmNvdW50VmFsdWUpfS5iaW5kKHRoaXMpKSx0LmV4aXQoKS5yZW1vdmUoKX1kcmF3VGV4dHMoKXtjb25zdCB0PXRoaXMudGV4dHNHcm91cC5zZWxlY3RBbGwoIi5ucG1pLWJhY2tncm91bmQtdGV4dCIpLmRhdGEodGhpcy5kYXRhKTt0LmVudGVyKCkuYXBwZW5kKCJ0ZXh0IikuYXR0cigiY2xhc3MiLCJucG1pLWJhY2tncm91bmQtdGV4dCIpLmF0dHIoInN0cm9rZS13aWR0aCIsMykuYXR0cigic3Ryb2tlLWxpbmVqb2luIiwicm91bmQiKS5hdHRyKCJzdHJva2UiLHRoaXMuc3Ryb2tlQ29sb3IpLmF0dHIoImZvbnQtc2l6ZSIsIjEzcHgiKS5hdHRyKCJhbGlnbm1lbnQtYmFzZWxpbmUiLCJtaWRkbGUiKS5tZXJnZSh0KS5hdHRyKCJ4IixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54U2NhbGUodC5tZXRyaWMpKzV9LmJpbmQodGhpcykpLmF0dHIoInkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnlTY2FsZSh0LnJ1bikrdGhpcy5ydW5IZWlnaHQvMn0uYmluZCh0aGlzKSkudGV4dCgodD0+bnVsbD09PXQublBNSVZhbHVlPyJudWxsIjpNYXRoLnJvdW5kKDFlMyoodC5uUE1JVmFsdWUrTnVtYmVyLkVQU0lMT04pKS8xZTMpKSx0LmV4aXQoKS5yZW1vdmUoKTtjb25zdCBlPXRoaXMudGV4dHNHcm91cC5zZWxlY3RBbGwoIi5ucG1pLXRleHQiKS5kYXRhKHRoaXMuZGF0YSk7ZS5lbnRlcigpLmFwcGVuZCgidGV4dCIpLmF0dHIoImNsYXNzIiwibnBtaS10ZXh0IikuYXR0cigiZm9udC1zaXplIiwiMTNweCIpLmF0dHIoImFsaWdubWVudC1iYXNlbGluZSIsIm1pZGRsZSIpLm1lcmdlKGUpLmF0dHIoIngiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnhTY2FsZSh0Lm1ldHJpYykrNX0uYmluZCh0aGlzKSkuYXR0cigieSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueVNjYWxlKHQucnVuKSt0aGlzLnJ1bkhlaWdodC8yfS5iaW5kKHRoaXMpKS50ZXh0KCh0PT5udWxsPT09dC5uUE1JVmFsdWU/Im51bGwiOk1hdGgucm91bmQoMWUzKih0Lm5QTUlWYWx1ZStOdW1iZXIuRVBTSUxPTikpLzFlMykpLGUuZXhpdCgpLnJlbW92ZSgpfWRyYXdDb3VudFRleHRzKCl7Y29uc3QgdD10aGlzLmNvdW50VGV4dHNHcm91cC5zZWxlY3RBbGwoIi5jb3VudC1iYWNrZ3JvdW5kLXRleHQiKS5kYXRhKHRoaXMuZGF0YSk7dC5lbnRlcigpLmFwcGVuZCgidGV4dCIpLmF0dHIoImNsYXNzIiwiY291bnQtYmFja2dyb3VuZC10ZXh0IikuYXR0cigic3Ryb2tlLXdpZHRoIiwzKS5hdHRyKCJzdHJva2UtbGluZWpvaW4iLCJyb3VuZCIpLmF0dHIoInN0cm9rZSIsdGhpcy5zdHJva2VDb2xvcikuYXR0cigiZm9udC1zaXplIiwiMTBweCIpLmF0dHIoImFsaWdubWVudC1iYXNlbGluZSIsIm1pZGRsZSIpLm1lcmdlKHQpLmF0dHIoIngiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnhTY2FsZSh0Lm1ldHJpYykrdGhpcy5jb3VudERvdE9mZnNldCt0aGlzLmNvdW50VGV4dFBhZGRpbmcrdGhpcy5tYXhEb3RSYWRpdXN9LmJpbmQodGhpcykpLmF0dHIoInkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnlTY2FsZSh0LnJ1bikrdGhpcy5ydW5IZWlnaHQvMn0uYmluZCh0aGlzKSkudGV4dCgodD0+bnVsbD09PXQuY291bnRWYWx1ZT8iIjpJbnRsLk51bWJlckZvcm1hdCgpLmZvcm1hdCh0LmNvdW50VmFsdWUpKSksdC5leGl0KCkucmVtb3ZlKCk7Y29uc3QgZT10aGlzLmNvdW50VGV4dHNHcm91cC5zZWxlY3RBbGwoIi5jb3VudC10ZXh0IikuZGF0YSh0aGlzLmRhdGEpO2UuZW50ZXIoKS5hcHBlbmQoInRleHQiKS5hdHRyKCJjbGFzcyIsImNvdW50LXRleHQiKS5hdHRyKCJmb250LXNpemUiLCIxMHB4IikuYXR0cigiYWxpZ25tZW50LWJhc2VsaW5lIiwibWlkZGxlIikubWVyZ2UoZSkuYXR0cigieCIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueFNjYWxlKHQubWV0cmljKSt0aGlzLmNvdW50RG90T2Zmc2V0K3RoaXMuY291bnRUZXh0UGFkZGluZyt0aGlzLm1heERvdFJhZGl1c30uYmluZCh0aGlzKSkuYXR0cigieSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMueVNjYWxlKHQucnVuKSt0aGlzLnJ1bkhlaWdodC8yfS5iaW5kKHRoaXMpKS50ZXh0KCh0PT5udWxsPT09dC5jb3VudFZhbHVlPyIiOkludGwuTnVtYmVyRm9ybWF0KCkuZm9ybWF0KHQuY291bnRWYWx1ZSkpKSxlLmV4aXQoKS5yZW1vdmUoKX1zaW1pbGFyaXR5U29ydCh0KXt0aGlzLmhhc0VtYmVkZGluZyYmKHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5vblNob3dTaW1pbGFyQW5ub3RhdGlvbnMuZW1pdCgpKX19QV90Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxBX3QpfSxBX3QuybVjbXA9dG8oe3R5cGU6QV90LHNlbGVjdG9yczpbWyJhbm5vdGF0aW9uLWNvbXBvbmVudCJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmKFFoKGtfdCw3LGhnKSxRaChTX3QsNyxoZykpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uYW5ub3RhdGlvbkNvbnRhaW5lcj10LmZpcnN0KSxKaCh0PXRiKCkpJiYobi5jbGlwUGF0aEVsZW1lbnQ9dC5maXJzdCl9fSxob3N0VmFyczoyLGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgicmVzaXplIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uUmVzaXplKCl9KSwhMSxvbCksMiZlJiZwdSgic2VsZWN0ZWQtcm93IixuLnNlbGVjdGVkKX0saW5wdXRzOntkYXRhOiJkYXRhIixtYXhDb3VudDoibWF4Q291bnQiLHNlbGVjdGVkQW5ub3RhdGlvbnM6InNlbGVjdGVkQW5ub3RhdGlvbnMiLGZsYWdnZWRBbm5vdGF0aW9uczoiZmxhZ2dlZEFubm90YXRpb25zIixoaWRkZW5Bbm5vdGF0aW9uczoiaGlkZGVuQW5ub3RhdGlvbnMiLGFjdGl2ZU1ldHJpY3M6ImFjdGl2ZU1ldHJpY3MiLG51bUFjdGl2ZVJ1bnM6Im51bUFjdGl2ZVJ1bnMiLHNob3dDb3VudHM6InNob3dDb3VudHMiLGFubm90YXRpb246ImFubm90YXRpb24iLHJ1bkhlaWdodDoicnVuSGVpZ2h0IixoYXNFbWJlZGRpbmc6Imhhc0VtYmVkZGluZyIsc29ydDoic29ydCIsc2lkZWJhcldpZHRoOiJzaWRlYmFyV2lkdGgiLGNvbG9yU2NhbGU6ImNvbG9yU2NhbGUiLHJ1bklkVG9SdW5zOiJydW5JZFRvUnVucyJ9LG91dHB1dHM6e29uU2hvd1NpbWlsYXJBbm5vdGF0aW9uczoib25TaG93U2ltaWxhckFubm90YXRpb25zIn0sZmVhdHVyZXM6W0JvXSxkZWNsczoxNCx2YXJzOjEwLGNvbnN0czpbWzEsImFubm90YXRpb24tdGl0bGUiXSxbMSwiYW5ub3RhdGlvbi1jaGVja2JveCIsMywiY2hlY2tlZCIsImNsaWNrIl0sWzEsImFubm90YXRpb24tYnV0dG9uIiwzLCJuZ0NsYXNzIiwiY2xpY2siXSxbImNsYXNzIiwiZmxhZ2dlZC1pY29uIiwic3ZnSWNvbiIsImZsYWdfMjRweCIsNCwibmdJZiJdLFsiY2xhc3MiLCJoaWRkZW4taWNvbiIsInN2Z0ljb24iLCJ2aXNpYmlsaXR5X29mZl8yNHB4Iiw0LCJuZ0lmIl0sWyJjbGFzcyIsImFubm90YXRpb24taWNvbiIsMywic3ZnSWNvbiIsIm5nQ2xhc3MiLDQsIm5nSWYiXSxbMSwiY2hhcnQtZGl2Il0sWyJjaGFydCIsIiJdLFsxLCJjaGFydC1zdmciXSxbImlkIiwiaGludC1jbGlwIl0sWyJoaW50Q2xpcCIsIiJdLFsieCIsIjAiLCJ5IiwiMCJdLFsic3ZnSWNvbiIsImZsYWdfMjRweCIsMSwiZmxhZ2dlZC1pY29uIl0sWyJzdmdJY29uIiwidmlzaWJpbGl0eV9vZmZfMjRweCIsMSwiaGlkZGVuLWljb24iXSxbMSwiYW5ub3RhdGlvbi1pY29uIiwzLCJzdmdJY29uIiwibmdDbGFzcyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiZGl2IiwwKSxSbSgxLCJtYXQtY2hlY2tib3giLDEpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIGUucHJldmVudERlZmF1bHQoKX0pKSxBbSgpLFJtKDIsImJ1dHRvbiIsMiksVm0oImNsaWNrIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5zaW1pbGFyaXR5U29ydChlKX0pKSxrdSgzKSxBbSgpLFFwKDQsRF90LDEsMCwibWF0LWljb24iLDMpLFFwKDUsRV90LDEsMCwibWF0LWljb24iLDQpLFFwKDYsUl90LDEsMiwibWF0LWljb24iLDUpLEFtKCksUm0oNywiZGl2Iiw2LDcpLHFpKCksUm0oOSwic3ZnIiw4KSxSbSgxMCwiZGVmcyIpLFJtKDExLCJjbGlwUGF0aCIsOSwxMCksVG0oMTMsInJlY3QiLDExKSxBbSgpLEFtKCksQW0oKSxBbSgpKSwyJmUmJihwdSgiZmxhZ2dlZC1hbm5vdGF0aW9uIixuLmZsYWdnZWRBbm5vdGF0aW9ucy5pbmNsdWRlcyhuLmFubm90YXRpb24pKSgiaGlkZGVuLWFubm90YXRpb24iLG4uaGlkZGVuQW5ub3RhdGlvbnMuaW5jbHVkZXMobi5hbm5vdGF0aW9uKSYmIW4uZmxhZ2dlZEFubm90YXRpb25zLmluY2x1ZGVzKG4uYW5ub3RhdGlvbikpLHJjKDEpLERtKCJjaGVja2VkIixuLnNlbGVjdGVkQW5ub3RhdGlvbnMuaW5jbHVkZXMobi5hbm5vdGF0aW9uKSkscmMoMSksRG0oIm5nQ2xhc3MiLG4uaGFzRW1iZWRkaW5nPyJjbGlja2FibGUtYW5ub3RhdGlvbiI6IiIpLHJjKDEpLER1KCIgIixuLmFubm90YXRpb24sIiAiKSxyYygxKSxEbSgibmdJZiIsbi5mbGFnZ2VkQW5ub3RhdGlvbnMuaW5jbHVkZXMobi5hbm5vdGF0aW9uKSkscmMoMSksRG0oIm5nSWYiLG4uaGlkZGVuQW5ub3RhdGlvbnMuaW5jbHVkZXMobi5hbm5vdGF0aW9uKSkscmMoMSksRG0oIm5nSWYiLG4uYW5ub3RhdGlvbj09PW4uc29ydC5tZXRyaWMpKX0sZGlyZWN0aXZlczpbT1ksYU0sZE0sRFddLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudHtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGwgLm1hdC1iYWRnZS1jb250ZW50e2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZSAubWF0LWJhZGdlLWNvbnRlbnR7Zm9udC1zaXplOjI0cHh9Lm1hdC1oMSwubWF0LWhlYWRsaW5lLC5tYXQtdHlwb2dyYXBoeSBoMXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMiwubWF0LXRpdGxlLC5tYXQtdHlwb2dyYXBoeSBoMntmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMywubWF0LXN1YmhlYWRpbmctMiwubWF0LXR5cG9ncmFwaHkgaDN7Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDQsLm1hdC1zdWJoZWFkaW5nLTEsLm1hdC10eXBvZ3JhcGh5IGg0e2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1LC5tYXQtdHlwb2dyYXBoeSBoNXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNiwubWF0LXR5cG9ncmFwaHkgaDZ7Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmcsLm1hdC1ib2R5LTJ7Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5LC5tYXQtYm9keS0xLC5tYXQtdHlwb2dyYXBoeXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHkgcCwubWF0LWJvZHktMSBwLC5tYXQtdHlwb2dyYXBoeSBwe21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsLC5tYXQtY2FwdGlvbntmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNCwubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTR7Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zLC5tYXQtdHlwb2dyYXBoeSAubWF0LWRpc3BsYXktM3tmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yLC5tYXQtdHlwb2dyYXBoeSAubWF0LWRpc3BsYXktMntmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMSwubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTF7Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcntmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbiwubWF0LXJhaXNlZC1idXR0b24sLm1hdC1pY29uLWJ1dHRvbiwubWF0LXN0cm9rZWQtYnV0dG9uLC5tYXQtZmxhdC1idXR0b24sLm1hdC1mYWIsLm1hdC1taW5pLWZhYntmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJke2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGV7Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXIgLm1hdC1jYXJkLXRpdGxle2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZSwubWF0LWNhcmQtY29udGVudHtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94e2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dCAubWF0LWNoZWNrYm94LWxhYmVse2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwe2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb24sLm1hdC1jaGlwIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb257Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbHtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsLC5tYXQtZm9vdGVyLWNlbGx7Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcntmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5e2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbCwubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b257Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyIHRoe2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50e2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZHtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcntwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb257Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24tYnV0dG9uLC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbntoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbiwubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29ue2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcnt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWx7dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVye2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC13cmFwcGVye3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWluZml4e3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbCsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcnttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbCsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLWluZml4e3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcjpmb2N1cysubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLWluZml4e3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtbGFiZWx7dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcjpmb2N1cysubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlciwubWF0LWdyaWQtdGlsZS1mb290ZXJ7Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyIC5tYXQtbGluZSwubWF0LWdyaWQtdGlsZS1mb290ZXIgLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXIgLm1hdC1saW5lOm50aC1jaGlsZChuKzIpLC5tYXQtZ3JpZC10aWxlLWZvb3RlciAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnR7bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvciwubWF0LXBhZ2luYXRvci1wYWdlLXNpemUgLm1hdC1zZWxlY3QtdHJpZ2dlcntmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b257Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0e2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2Vye2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnR7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWwsLm1hdC1zdGVwcGVyLWhvcml6b250YWx7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbHtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcntmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9ye2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZHtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXB7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLWxpbmt7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXIsLm1hdC10b29sYmFyIGgxLC5tYXQtdG9vbGJhciBoMiwubWF0LXRvb2xiYXIgaDMsLm1hdC10b29sYmFyIGg0LC5tYXQtdG9vbGJhciBoNSwubWF0LXRvb2xiYXIgaDZ7Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwe2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0e2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb257Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1pdGVte2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1vcHRpb257Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpbmV7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlIC5tYXQtc3ViaGVhZGVye2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1pdGVte2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpbmV7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3QtaXRlbSAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb257Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtc3ViaGVhZGVye2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb257Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWx7Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbntsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGUsLm1hdC1uZXN0ZWQtdHJlZS1ub2Rle2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGU6bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWR7b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50e3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1yaXBwbGUtZWxlbWVudHtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW57Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyLC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcntwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJ7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXI6ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcntkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5le3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ3tvcGFjaXR5OjF9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ3tvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9we2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCwuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ3tvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3h7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja3twb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5ne3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3h7cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7LyohKi99QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7LyohKi99LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZDotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZDpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9ye3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtbWRjLWZvY3VzLWluZGljYXRvcntwb3NpdGlvbjpyZWxhdGl2ZX06aG9zdHtwYWRkaW5nLXRvcDo1cHh9LmFubm90YXRpb24tdGl0bGV7YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtmb250LXNpemU6MTNweDtoZWlnaHQ6MjBweDtwYWRkaW5nOjAgMTBweDt1c2VyLXNlbGVjdDpub25lfS5zZWxlY3RlZC1yb3d7YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2Rpc3BsYXk6YmxvY2t9LmZsYWdnZWQtYW5ub3RhdGlvbntjb2xvcjojZjU3YzAwfS5oaWRkZW4tYW5ub3RhdGlvbntjb2xvcjojNzU3NTc1fS5hbm5vdGF0aW9uLWNoZWNrYm94e3BhZGRpbmctcmlnaHQ6NXB4fS5mbGFnZ2VkLWljb257dHJhbnNmb3JtOnNjYWxlKDAuNil9LmhpZGRlbi1pY29ue3RyYW5zZm9ybTpzY2FsZSgwLjYpfS5hbm5vdGF0aW9uLWljb257dHJhbnNmb3JtOnNjYWxlKDAuNil9LmNoYXJ0LWRpdntib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmVifS5jaGFydC1zdmd7d2lkdGg6MTAwJTt1c2VyLXNlbGVjdDpub25lfS5kZWZhdWx0LXRleHR7ZmlsbDojMDAwfS5mbGFnLXRleHR7ZmlsbDojZjU3YzAwfS5oaWRkZW4tdGV4dHtmaWxsOiM3NTc1NzV9LmNsaWNrYWJsZS1hbm5vdGF0aW9ue2N1cnNvcjpwb2ludGVyfWJ1dHRvbnthbGw6dW5zZXR9XG4nXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEFfdCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJhbm5vdGF0aW9uLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vYW5ub3RhdGlvbl9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9hbm5vdGF0aW9uX2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNoLGVuY2Fwc3VsYXRpb246SG4uTm9uZX1dfV0sbnVsbCx7ZGF0YTpbe3R5cGU6eHl9XSxtYXhDb3VudDpbe3R5cGU6eHl9XSxzZWxlY3RlZEFubm90YXRpb25zOlt7dHlwZTp4eX1dLGZsYWdnZWRBbm5vdGF0aW9uczpbe3R5cGU6eHl9XSxoaWRkZW5Bbm5vdGF0aW9uczpbe3R5cGU6eHl9XSxhY3RpdmVNZXRyaWNzOlt7dHlwZTp4eX1dLG51bUFjdGl2ZVJ1bnM6W3t0eXBlOnh5fV0sc2hvd0NvdW50czpbe3R5cGU6eHl9XSxhbm5vdGF0aW9uOlt7dHlwZTp4eX1dLHJ1bkhlaWdodDpbe3R5cGU6eHl9XSxoYXNFbWJlZGRpbmc6W3t0eXBlOnh5fV0sc29ydDpbe3R5cGU6eHl9XSxzaWRlYmFyV2lkdGg6W3t0eXBlOnh5fV0sY29sb3JTY2FsZTpbe3R5cGU6eHl9XSxydW5JZFRvUnVuczpbe3R5cGU6eHl9XSxhbm5vdGF0aW9uQ29udGFpbmVyOlt7dHlwZTpaYSxhcmdzOlsiY2hhcnQiLHtzdGF0aWM6ITAscmVhZDpoZ31dfV0sY2xpcFBhdGhFbGVtZW50Olt7dHlwZTpaYSxhcmdzOlsiaGludENsaXAiLHtzdGF0aWM6ITAscmVhZDpoZ31dfV0sc2VsZWN0ZWQ6W3t0eXBlOlB5LGFyZ3M6WyJjbGFzcy5zZWxlY3RlZC1yb3ciXX1dLG9uUmVzaXplOlt7dHlwZTp3eSxhcmdzOlsid2luZG93OnJlc2l6ZSJdfV0sb25TaG93U2ltaWxhckFubm90YXRpb25zOlt7dHlwZTpPeX1dfSk7Y2xhc3MgVF90e2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLnNvcnQkPXRoaXMuc3RvcmUuc2VsZWN0KGhidCksdGhpcy5mbGFnZ2VkQW5ub3RhdGlvbnMkPXRoaXMuc3RvcmUuc2VsZWN0KGRidCksdGhpcy5oaWRkZW5Bbm5vdGF0aW9ucyQ9dGhpcy5zdG9yZS5zZWxlY3QocGJ0KSx0aGlzLnNlbGVjdGVkQW5ub3RhdGlvbnMkPXRoaXMuc3RvcmUuc2VsZWN0KGNidCksdGhpcy5zaG93Q291bnRzJD10aGlzLnN0b3JlLnNlbGVjdChDYnQpLHRoaXMuc2lkZWJhcldpZHRoJD10aGlzLnN0b3JlLnNlbGVjdCh4YnQpLHRoaXMucnVuQ29sb3JTY2FsZSQ9dGhpcy5zdG9yZS5zZWxlY3Qoek4pLnBpcGUoSXQoKHQ9PmU9PntpZighdC5oYXNPd25Qcm9wZXJ0eShlKSl0aHJvdyBuZXcgRXJyb3IoYFtDb2xvciBzY2FsZV0gdW5rbm93biBydW5JZDogJHtlfS5gKTtyZXR1cm4gdFtlXX0pKSksdGhpcy5ydW5JZFRvUnVucyQ9dGhpcy5zdG9yZS5zZWxlY3QoZE4pfXNob3dTaW1pbGFyQW5ub3RhdGlvbnMoKXt0aGlzLnN0b3JlLmRpc3BhdGNoKGpidCh7YW5ub3RhdGlvbjp0aGlzLmFubm90YXRpb259KSl9fWZ1bmN0aW9uIE5fdCh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsIm5wbWktYW5ub3RhdGlvbiIsNSksVm0oImNsaWNrIiwoZnVuY3Rpb24gZShuKXtjb25zdCBvPWhpKHQpLiRpbXBsaWNpdDtyZXR1cm4gWW0oMikucm93Q2xpY2tlZChuLG8pfSkpLEFtKCl9aWYoMiZ0KXtjb25zdCB0PWUuJGltcGxpY2l0LG49WW0oMik7RG0oImRhdGEiLG4uYW5ub3RhdGlvbnNbdF0pKCJhY3RpdmVNZXRyaWNzIixuLmFjdGl2ZU1ldHJpY3MpKCJudW1BY3RpdmVSdW5zIixuLm51bUFjdGl2ZVJ1bnMpKCJtYXhDb3VudCIsbi5tYXhDb3VudCkoImFubm90YXRpb24iLHQpKCJydW5IZWlnaHQiLG4ucnVuSGVpZ2h0KSgiaGFzRW1iZWRkaW5nIixuLmVtYmVkZGluZ0RhdGEmJnZvaWQgMCE9PW4uZW1iZWRkaW5nRGF0YVt0XSl9fWZ1bmN0aW9uIHpfdCh0LGUpe2lmKDEmdCYmKE5tKDApLFRtKDEsIm5wbWktYW5ub3RhdGlvbnMtbGlzdC1sZWdlbmQiKSxUbSgyLCJucG1pLWFubm90YXRpb25zLWxpc3QtaGVhZGVyIiwyKSxSbSgzLCJjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQiLDMpLFFwKDQsTl90LDEsNywibnBtaS1hbm5vdGF0aW9uIiw0KSxBbSgpLHptKCkpLDImdCl7Y29uc3QgdD1ZbSgpO3JjKDIpLERtKCJhbm5vdGF0aW9ucyIsdC5hbm5vdGF0aW9ucykoIm51bUFubm90YXRpb25zIix0Lm51bUFubm90YXRpb25zKSgiYWN0aXZlTWV0cmljcyIsdC5hY3RpdmVNZXRyaWNzKSxyYygxKSxLbSgiaXRlbVNpemUiLHQubnVtQWN0aXZlUnVucyp0LnJ1bkhlaWdodCsyNSkscmMoMSksRG0oImNka1ZpcnR1YWxGb3JPZiIsdC5zb3J0ZWRBbm5vdGF0aW9ucyl9fVRfdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VF90KShTbShJdykpfSxUX3QuybVjbXA9dG8oe3R5cGU6VF90LHNlbGVjdG9yczpbWyJucG1pLWFubm90YXRpb24iXV0saW5wdXRzOntkYXRhOiJkYXRhIixtYXhDb3VudDoibWF4Q291bnQiLGFjdGl2ZU1ldHJpY3M6ImFjdGl2ZU1ldHJpY3MiLG51bUFjdGl2ZVJ1bnM6Im51bUFjdGl2ZVJ1bnMiLGFubm90YXRpb246ImFubm90YXRpb24iLHJ1bkhlaWdodDoicnVuSGVpZ2h0IixoYXNFbWJlZGRpbmc6Imhhc0VtYmVkZGluZyJ9LGRlY2xzOjksdmFyczozMSxjb25zdHM6W1szLCJkYXRhIiwibWF4Q291bnQiLCJhY3RpdmVNZXRyaWNzIiwibnVtQWN0aXZlUnVucyIsImFubm90YXRpb24iLCJydW5IZWlnaHQiLCJoYXNFbWJlZGRpbmciLCJzb3J0Iiwic2VsZWN0ZWRBbm5vdGF0aW9ucyIsImZsYWdnZWRBbm5vdGF0aW9ucyIsImhpZGRlbkFubm90YXRpb25zIiwic2hvd0NvdW50cyIsInNpZGViYXJXaWR0aCIsImNvbG9yU2NhbGUiLCJydW5JZFRvUnVucyIsIm9uU2hvd1NpbWlsYXJBbm5vdGF0aW9ucyJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiYW5ub3RhdGlvbi1jb21wb25lbnQiLDApLFZtKCJvblNob3dTaW1pbGFyQW5ub3RhdGlvbnMiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4uc2hvd1NpbWlsYXJBbm5vdGF0aW9ucygpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBaCgzLCJhc3luYyIpLEFoKDQsImFzeW5jIiksQWgoNSwiYXN5bmMiKSxBaCg2LCJhc3luYyIpLEFoKDcsImFzeW5jIiksQWgoOCwiYXN5bmMiKSxBbSgpKSwyJmUmJkRtKCJkYXRhIixuLmRhdGEpKCJtYXhDb3VudCIsbi5tYXhDb3VudCkoImFjdGl2ZU1ldHJpY3MiLG4uYWN0aXZlTWV0cmljcykoIm51bUFjdGl2ZVJ1bnMiLG4ubnVtQWN0aXZlUnVucykoImFubm90YXRpb24iLG4uYW5ub3RhdGlvbikoInJ1bkhlaWdodCIsbi5ydW5IZWlnaHQpKCJoYXNFbWJlZGRpbmciLG4uaGFzRW1iZWRkaW5nKSgic29ydCIsVGgoMSwxNSxuLnNvcnQkKSkoInNlbGVjdGVkQW5ub3RhdGlvbnMiLFRoKDIsMTcsbi5zZWxlY3RlZEFubm90YXRpb25zJCkpKCJmbGFnZ2VkQW5ub3RhdGlvbnMiLFRoKDMsMTksbi5mbGFnZ2VkQW5ub3RhdGlvbnMkKSkoImhpZGRlbkFubm90YXRpb25zIixUaCg0LDIxLG4uaGlkZGVuQW5ub3RhdGlvbnMkKSkoInNob3dDb3VudHMiLFRoKDUsMjMsbi5zaG93Q291bnRzJCkpKCJzaWRlYmFyV2lkdGgiLFRoKDYsMjUsbi5zaWRlYmFyV2lkdGgkKSkoImNvbG9yU2NhbGUiLFRoKDcsMjcsbi5ydW5Db2xvclNjYWxlJCkpKCJydW5JZFRvUnVucyIsVGgoOCwyOSxuLnJ1bklkVG9SdW5zJCkpfSxkaXJlY3RpdmVzOltBX3RdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChUX3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibnBtaS1hbm5vdGF0aW9uIix0ZW1wbGF0ZTonXG4gICAgPGFubm90YXRpb24tY29tcG9uZW50XG4gICAgICBbZGF0YV09ImRhdGEiXG4gICAgICBbbWF4Q291bnRdPSJtYXhDb3VudCJcbiAgICAgIFthY3RpdmVNZXRyaWNzXT0iYWN0aXZlTWV0cmljcyJcbiAgICAgIFtudW1BY3RpdmVSdW5zXT0ibnVtQWN0aXZlUnVucyJcbiAgICAgIFthbm5vdGF0aW9uXT0iYW5ub3RhdGlvbiJcbiAgICAgIFtydW5IZWlnaHRdPSJydW5IZWlnaHQiXG4gICAgICBbaGFzRW1iZWRkaW5nXT0iaGFzRW1iZWRkaW5nIlxuICAgICAgW3NvcnRdPSJzb3J0JCB8IGFzeW5jIlxuICAgICAgW3NlbGVjdGVkQW5ub3RhdGlvbnNdPSJzZWxlY3RlZEFubm90YXRpb25zJCB8IGFzeW5jIlxuICAgICAgW2ZsYWdnZWRBbm5vdGF0aW9uc109ImZsYWdnZWRBbm5vdGF0aW9ucyQgfCBhc3luYyJcbiAgICAgIFtoaWRkZW5Bbm5vdGF0aW9uc109ImhpZGRlbkFubm90YXRpb25zJCB8IGFzeW5jIlxuICAgICAgW3Nob3dDb3VudHNdPSJzaG93Q291bnRzJCB8IGFzeW5jIlxuICAgICAgW3NpZGViYXJXaWR0aF09InNpZGViYXJXaWR0aCQgfCBhc3luYyJcbiAgICAgIFtjb2xvclNjYWxlXT0icnVuQ29sb3JTY2FsZSQgfCBhc3luYyJcbiAgICAgIFtydW5JZFRvUnVuc109InJ1bklkVG9SdW5zJCB8IGFzeW5jIlxuICAgICAgKG9uU2hvd1NpbWlsYXJBbm5vdGF0aW9ucyk9InNob3dTaW1pbGFyQW5ub3RhdGlvbnMoKSJcbiAgICA+PC9hbm5vdGF0aW9uLWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLHtkYXRhOlt7dHlwZTp4eX1dLG1heENvdW50Olt7dHlwZTp4eX1dLGFjdGl2ZU1ldHJpY3M6W3t0eXBlOnh5fV0sbnVtQWN0aXZlUnVuczpbe3R5cGU6eHl9XSxhbm5vdGF0aW9uOlt7dHlwZTp4eX1dLHJ1bkhlaWdodDpbe3R5cGU6eHl9XSxoYXNFbWJlZGRpbmc6W3t0eXBlOnh5fV19KTtjbGFzcyBJX3R7Y29uc3RydWN0b3IoKXt0aGlzLm9uUm93Q2xpY2s9bmV3IExoLHRoaXMucnVuSGVpZ2h0PTMwfXJvd0NsaWNrZWQodCxlKXtpZih0LnNoaWZ0S2V5KXtsZXQgdD10aGlzLnNvcnRlZEFubm90YXRpb25zLmluZGV4T2YoZSk7aWYoMD09PXRoaXMuc2VsZWN0ZWRBbm5vdGF0aW9ucy5sZW5ndGgpdGhpcy5vblJvd0NsaWNrLmVtaXQodGhpcy5zb3J0ZWRBbm5vdGF0aW9ucy5zbGljZSgwLHQrMSkpO2Vsc2V7Y29uc3QgZT10aGlzLnNvcnRlZEFubm90YXRpb25zLmluZGV4T2YodGhpcy5zZWxlY3RlZEFubm90YXRpb25zW3RoaXMuc2VsZWN0ZWRBbm5vdGF0aW9ucy5sZW5ndGgtMV0pO3RoaXMub25Sb3dDbGljay5lbWl0KGU8dD90aGlzLnNvcnRlZEFubm90YXRpb25zLnNsaWNlKGUsdCsxKTp0aGlzLnNvcnRlZEFubm90YXRpb25zLnNsaWNlKHQsZSsxKSl9fWVsc2UgdGhpcy5vblJvd0NsaWNrLmVtaXQoW2VdKX19SV90Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxJX3QpfSxJX3QuybVjbXA9dG8oe3R5cGU6SV90LHNlbGVjdG9yczpbWyJhbm5vdGF0aW9ucy1saXN0LWNvbXBvbmVudCJdXSxpbnB1dHM6e2Fubm90YXRpb25zOiJhbm5vdGF0aW9ucyIsZW1iZWRkaW5nRGF0YToiZW1iZWRkaW5nRGF0YSIsYW5ub3RhdGlvbnNFeHBhbmRlZDoiYW5ub3RhdGlvbnNFeHBhbmRlZCIsbnVtQW5ub3RhdGlvbnM6Im51bUFubm90YXRpb25zIixhbm5vdGF0aW9uU29ydDoiYW5ub3RhdGlvblNvcnQiLGFjdGl2ZU1ldHJpY3M6ImFjdGl2ZU1ldHJpY3MiLG51bUFjdGl2ZVJ1bnM6Im51bUFjdGl2ZVJ1bnMiLHNvcnRlZEFubm90YXRpb25zOiJzb3J0ZWRBbm5vdGF0aW9ucyIsc2VsZWN0ZWRBbm5vdGF0aW9uczoic2VsZWN0ZWRBbm5vdGF0aW9ucyIsbWF4Q291bnQ6Im1heENvdW50In0sb3V0cHV0czp7b25Sb3dDbGljazoib25Sb3dDbGljayJ9LGRlY2xzOjIsdmFyczozLGNvbnN0czpbWzMsIm51bUFubm90YXRpb25zIiwiZXhwYW5kZWQiXSxbNCwibmdJZiJdLFszLCJhbm5vdGF0aW9ucyIsIm51bUFubm90YXRpb25zIiwiYWN0aXZlTWV0cmljcyJdLFsibWluQnVmZmVyUHgiLCIzMDAiLCJtYXhCdWZmZXJQeCIsIjYwMCIsMSwiYW5ub3RhdGlvbi1yb3dzIiwzLCJpdGVtU2l6ZSJdLFszLCJkYXRhIiwiYWN0aXZlTWV0cmljcyIsIm51bUFjdGl2ZVJ1bnMiLCJtYXhDb3VudCIsImFubm90YXRpb24iLCJydW5IZWlnaHQiLCJoYXNFbWJlZGRpbmciLCJjbGljayIsNCwiY2RrVmlydHVhbEZvciIsImNka1ZpcnR1YWxGb3JPZiJdLFszLCJkYXRhIiwiYWN0aXZlTWV0cmljcyIsIm51bUFjdGl2ZVJ1bnMiLCJtYXhDb3VudCIsImFubm90YXRpb24iLCJydW5IZWlnaHQiLCJoYXNFbWJlZGRpbmciLCJjbGljayJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoVG0oMCwibnBtaS1hbm5vdGF0aW9ucy1saXN0LXRvb2xiYXIiLDApLFFwKDEsel90LDUsNSwibmctY29udGFpbmVyIiwxKSksMiZlJiYoRG0oIm51bUFubm90YXRpb25zIixuLm51bUFubm90YXRpb25zKSgiZXhwYW5kZWQiLG4uYW5ub3RhdGlvbnNFeHBhbmRlZCkscmMoMSksRG0oIm5nSWYiLG4uYW5ub3RhdGlvbnNFeHBhbmRlZCkpfSxkaXJlY3RpdmVzOltfX3QsZE0sdl90LHdfdCxnRixkRixiRixUX3RdLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlcjoxcHggc29saWQgI2ViZWJlYjtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2hlaWdodDpjYWxjKDEwMCUgLSAycHgpO3dpZHRoOmNhbGMoMTAwJSAtIDJweCl9LmFubm90YXRpb24tcm93c1tfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4OjEgMTtvdmVyZmxvdy15OmF1dG99J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKElfdCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJhbm5vdGF0aW9ucy1saXN0LWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vYW5ub3RhdGlvbnNfbGlzdF9jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsiLi9hbm5vdGF0aW9uc19saXN0X2NvbXBvbmVudC5jc3MiXSxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSxudWxsLHthbm5vdGF0aW9uczpbe3R5cGU6eHl9XSxlbWJlZGRpbmdEYXRhOlt7dHlwZTp4eX1dLGFubm90YXRpb25zRXhwYW5kZWQ6W3t0eXBlOnh5fV0sbnVtQW5ub3RhdGlvbnM6W3t0eXBlOnh5fV0sYW5ub3RhdGlvblNvcnQ6W3t0eXBlOnh5fV0sYWN0aXZlTWV0cmljczpbe3R5cGU6eHl9XSxudW1BY3RpdmVSdW5zOlt7dHlwZTp4eX1dLHNvcnRlZEFubm90YXRpb25zOlt7dHlwZTp4eX1dLHNlbGVjdGVkQW5ub3RhdGlvbnM6W3t0eXBlOnh5fV0sbWF4Q291bnQ6W3t0eXBlOnh5fV0sb25Sb3dDbGljazpbe3R5cGU6T3l9XX0pO2NsYXNzIEhfdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5hbm5vdGF0aW9uc0V4cGFuZGVkJD10aGlzLnN0b3JlLnBpcGUoRncoeWJ0KSksdGhpcy5hY3RpdmVSdW5zJD10aGlzLnN0b3JlLnBpcGUoRncoTk4pKS5waXBlKEl0KCh0PT50P0FycmF5LmZyb20odC5lbnRyaWVzKCkpLmZpbHRlcigodD0+dFsxXSkpLm1hcCgodD0+dFswXSkpOltdKSkpLHRoaXMuZW1iZWRkaW5nRGF0YSQ9dGhpcy5zdG9yZS5waXBlKEZ3KGxidCkpLHRoaXMubnVtQWN0aXZlUnVucyQ9dGhpcy5hY3RpdmVSdW5zJC5waXBlKEl0KCh0PT50Lmxlbmd0aCkpKSx0aGlzLmFjdGl2ZU1ldHJpY3MkPVd0KFt0aGlzLnN0b3JlLnNlbGVjdChzYnQpLHRoaXMuYWN0aXZlUnVucyQsdGhpcy5zdG9yZS5zZWxlY3QoZ2J0KV0pLnBpcGUoSXQoKChbdCxlLG5dKT0+e2xldCBvPVtdO2Zvcihjb25zdCBuIG9mIGUpdFtuXSYmKG89by5jb25jYXQodFtuXS5maWx0ZXIoKHQ9PmV5dCh0KSkpKSk7cmV0dXJuIG89Wy4uLm5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKG4pLC4uLm9dKV0sb30pKSksdGhpcy52aXNpYmxlQW5ub3RhdGlvbnMkPVd0KFt0aGlzLnN0b3JlLnNlbGVjdChyYnQpLHRoaXMuc3RvcmUuc2VsZWN0KHBidCksdGhpcy5zdG9yZS5zZWxlY3QoTWJ0KV0pLnBpcGUoSXQoKChbdCxlLG5dKT0+R3l0KHQsZSxuKSkpKSx0aGlzLmZpbHRlcmVkQW5ub3RhdGlvbnMkPVd0KFt0aGlzLnZpc2libGVBbm5vdGF0aW9ucyQsdGhpcy5zdG9yZS5zZWxlY3QoZmJ0KSx0aGlzLnN0b3JlLnNlbGVjdChnYnQpLHRoaXMuYWN0aXZlUnVucyQsdGhpcy5hY3RpdmVNZXRyaWNzJCx0aGlzLnN0b3JlLnNlbGVjdChtYnQpXSkucGlwZShJdCgoKFt0LGUsbixvLGksYV0pPT4oZnVuY3Rpb24gcih0LGUsbixvLGksYSl7Y29uc3Qgcj17fSxzPW5ldyBTZXQoZSksbD1uZXcgU2V0KGkubWFwKCh0PT5ueXQodCkpKSksYz1uZXcgUmVnRXhwKGEsImkiKTtyZXR1cm4gT2JqZWN0LmVudHJpZXModCkuZm9yRWFjaCgodD0+e2lmKCFjLnRlc3QodFswXSkpcmV0dXJuO2xldCBlPXRbMV07ZT1lLmZpbHRlcigodD0+cy5oYXModC5ydW4pJiZsLmhhcyh0Lm1ldHJpYykpKSwoZnVuY3Rpb24gaSh0LGUsbil7cmV0dXJuIHQuZXZlcnkoKHQ9PntpZih0LmtpbmQ9PT10YnQuT1BFUkFUT1IpcmV0dXJuITA7Y29uc3Qgbz1lW3QubWV0cmljXTtyZXR1cm4gdm9pZCAwPT09b3x8bi5zb21lKChlPT5lLm1ldHJpYz09PW55dCh0Lm1ldHJpYykmJihudWxsPT09ZS5uUE1JVmFsdWU/by5pbmNsdWRlTmFOOmUublBNSVZhbHVlPD1vLm1heCYmZS5uUE1JVmFsdWU+PW8ubWluKSkpfSkpfSkobixvLGUpJiYwIT09ZS5sZW5ndGgmJihyW3RbMF1dPWUpfSkpLHJ9KSh0LG8sZSxuLGksYSkpKSkucGlwZShFZSgpKSx0aGlzLm51bUFubm90YXRpb25zJD10aGlzLmZpbHRlcmVkQW5ub3RhdGlvbnMkLnBpcGUoSXQoKHQ9Pk9iamVjdC5rZXlzKHQpLmxlbmd0aCkpKSx0aGlzLnNvcnRlZEFubm90YXRpb25zJD1XdChbdGhpcy5maWx0ZXJlZEFubm90YXRpb25zJCx0aGlzLnN0b3JlLnBpcGUoRncoaGJ0KSksdGhpcy5lbWJlZGRpbmdEYXRhJF0pLnBpcGUoSXQoKChbdCxlLG5dKT0+KGZ1bmN0aW9uIG8odCxlLG4pe2NvbnN0IG89T2JqZWN0LmtleXModCksaT1lLm9yZGVyPT09bmJ0LkRJU1NJTUlMQVJ8fGUub3JkZXI9PT1uYnQuU0lNSUxBUjtyZXR1cm4iIj09PWUubWV0cmljfHwodm9pZCAwPT09bnx8dm9pZCAwPT09bi5wb2ludHNbZS5tZXRyaWNdKSYmaT9vOihmdW5jdGlvbiBzKHQsZSxuKXtyZXR1cm4gdC5zb3J0KG4/KHQsbik9PmVbdF0tZVtuXToodCxuKT0+ZVtuXS1lW3RdKX0pKG8saT8oZnVuY3Rpb24gYSh0LGUsbil7Y29uc3Qgbz17fTtsZXQgaT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksYT1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7bi5vcmRlcj09PW5idC5TSU1JTEFSJiYoaT1OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksYT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO2Zvcihjb25zdCByIG9mIHQpb1tyXT1yPT09bi5tZXRyaWM/aTp2b2lkIDA9PT1lLnBvaW50c1tyXT9hOmUucG9pbnRzW3JdLnZlY3Rvcj9ReXQoZS5wb2ludHNbbi5tZXRyaWNdLnZlY3RvcixlLnBvaW50c1tyXS52ZWN0b3IsYSk6YTtyZXR1cm4gb30pKG8sbixlKTooZnVuY3Rpb24gcih0LGUsbil7Y29uc3Qgbz1ueXQobi5tZXRyaWMpLGk9e307aWYobi5vcmRlcj09PW5idC5ERVNDRU5ESU5HKWZvcihjb25zdCBuIG9mIHQpaVtuXT1NYXRoLm1heCguLi5lW25dLmZpbHRlcigodD0+dC5tZXRyaWM9PT1vKSkubWFwKCh0PT5udWxsPT09dC5uUE1JVmFsdWU/LTEvMDp0Lm5QTUlWYWx1ZSkpKTtlbHNlIGZvcihjb25zdCBuIG9mIHQpaVtuXT1NYXRoLm1pbiguLi5lW25dLmZpbHRlcigodD0+dC5tZXRyaWM9PT1vKSkubWFwKCh0PT5udWxsPT09dC5uUE1JVmFsdWU/MS8wOnQublBNSVZhbHVlKSkpO3JldHVybiBpfSkobyx0LGUpLGUub3JkZXI9PT1uYnQuQVNDRU5ETkd8fGUub3JkZXI9PT1uYnQuU0lNSUxBUil9KSh0LGUsbikpKSksdGhpcy5zZWxlY3RlZEFubm90YXRpb25zJD10aGlzLnN0b3JlLnBpcGUoRncoY2J0KSksdGhpcy5tYXhDb3VudCQ9dGhpcy5maWx0ZXJlZEFubm90YXRpb25zJC5waXBlKEl0KCh0PT57bGV0IGU9MDtyZXR1cm4gT2JqZWN0LnZhbHVlcyh0KS5mb3JFYWNoKCh0PT57dC5mb3JFYWNoKCh0PT57dC5jb3VudFZhbHVlJiYoZT1NYXRoLm1heChlLHQuY291bnRWYWx1ZSkpfSkpfSkpLGV9KSkpfXJvd0NsaWNrZWQodCl7dGhpcy5zdG9yZS5kaXNwYXRjaChSYnQoe2Fubm90YXRpb25zOnR9KSl9fUhfdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8SF90KShTbShJdykpfSxIX3QuybVjbXA9dG8oe3R5cGU6SF90LHNlbGVjdG9yczpbWyJucG1pLWFubm90YXRpb25zLWxpc3QiXV0sZGVjbHM6MTAsdmFyczoyNyxjb25zdHM6W1szLCJhbm5vdGF0aW9ucyIsImVtYmVkZGluZ0RhdGEiLCJhbm5vdGF0aW9uc0V4cGFuZGVkIiwibnVtQW5ub3RhdGlvbnMiLCJhY3RpdmVNZXRyaWNzIiwibnVtQWN0aXZlUnVucyIsInNvcnRlZEFubm90YXRpb25zIiwic2VsZWN0ZWRBbm5vdGF0aW9ucyIsIm1heENvdW50Iiwib25Sb3dDbGljayJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiYW5ub3RhdGlvbnMtbGlzdC1jb21wb25lbnQiLDApLFZtKCJvblJvd0NsaWNrIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5yb3dDbGlja2VkKGUpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBaCgzLCJhc3luYyIpLEFoKDQsImFzeW5jIiksQWgoNSwiYXN5bmMiKSxBaCg2LCJhc3luYyIpLEFoKDcsImFzeW5jIiksQWgoOCwiYXN5bmMiKSxBaCg5LCJhc3luYyIpLEFtKCkpLDImZSYmRG0oImFubm90YXRpb25zIixUaCgxLDksbi5maWx0ZXJlZEFubm90YXRpb25zJCkpKCJlbWJlZGRpbmdEYXRhIixUaCgyLDExLG4uZW1iZWRkaW5nRGF0YSQpKSgiYW5ub3RhdGlvbnNFeHBhbmRlZCIsVGgoMywxMyxuLmFubm90YXRpb25zRXhwYW5kZWQkKSkoIm51bUFubm90YXRpb25zIixUaCg0LDE1LG4ubnVtQW5ub3RhdGlvbnMkKSkoImFjdGl2ZU1ldHJpY3MiLFRoKDUsMTcsbi5hY3RpdmVNZXRyaWNzJCkpKCJudW1BY3RpdmVSdW5zIixUaCg2LDE5LG4ubnVtQWN0aXZlUnVucyQpKSgic29ydGVkQW5ub3RhdGlvbnMiLFRoKDcsMjEsbi5zb3J0ZWRBbm5vdGF0aW9ucyQpKSgic2VsZWN0ZWRBbm5vdGF0aW9ucyIsVGgoOCwyMyxuLnNlbGVjdGVkQW5ub3RhdGlvbnMkKSkoIm1heENvdW50IixUaCg5LDI1LG4ubWF4Q291bnQkKSl9LGRpcmVjdGl2ZXM6W0lfdF0scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEhfdCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJucG1pLWFubm90YXRpb25zLWxpc3QiLHRlbXBsYXRlOidcbiAgICA8YW5ub3RhdGlvbnMtbGlzdC1jb21wb25lbnRcbiAgICAgIFthbm5vdGF0aW9uc109ImZpbHRlcmVkQW5ub3RhdGlvbnMkIHwgYXN5bmMiXG4gICAgICBbZW1iZWRkaW5nRGF0YV09ImVtYmVkZGluZ0RhdGEkIHwgYXN5bmMiXG4gICAgICBbYW5ub3RhdGlvbnNFeHBhbmRlZF09ImFubm90YXRpb25zRXhwYW5kZWQkIHwgYXN5bmMiXG4gICAgICBbbnVtQW5ub3RhdGlvbnNdPSJudW1Bbm5vdGF0aW9ucyQgfCBhc3luYyJcbiAgICAgIFthY3RpdmVNZXRyaWNzXT0iYWN0aXZlTWV0cmljcyQgfCBhc3luYyJcbiAgICAgIFtudW1BY3RpdmVSdW5zXT0ibnVtQWN0aXZlUnVucyQgfCBhc3luYyJcbiAgICAgIFtzb3J0ZWRBbm5vdGF0aW9uc109InNvcnRlZEFubm90YXRpb25zJCB8IGFzeW5jIlxuICAgICAgW3NlbGVjdGVkQW5ub3RhdGlvbnNdPSJzZWxlY3RlZEFubm90YXRpb25zJCB8IGFzeW5jIlxuICAgICAgW21heENvdW50XT0ibWF4Q291bnQkIHwgYXN5bmMiXG4gICAgICAob25Sb3dDbGljayk9InJvd0NsaWNrZWQoJGV2ZW50KSJcbiAgICA+PC9hbm5vdGF0aW9ucy1saXN0LWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NvbnN0IEZfdD1bImNoYXJ0Il07Y2xhc3MgTF90e2NvbnN0cnVjdG9yKCl7dGhpcy53aWR0aD0wLHRoaXMuY2hhcnRXaWR0aD0wLHRoaXMuaGVpZ2h0PTMwMCx0aGlzLm1hcmdpbj17dG9wOjIwLHJpZ2h0OjQwLGJvdHRvbToyMCxsZWZ0OjQwfSx0aGlzLmNoYXJ0SGVpZ2h0PXRoaXMuaGVpZ2h0LXRoaXMubWFyZ2luLnRvcC10aGlzLm1hcmdpbi5ib3R0b219b25SZXNpemUodCl7dGhpcy5yZWRyYXcoKX1uZ0FmdGVyVmlld0luaXQoKXt0aGlzLnN2Zz1KNCh0aGlzLnN2Z0VsZW1lbnQubmF0aXZlRWxlbWVudCksdGhpcy5tYWluQ29udGFpbmVyPXRoaXMuc3ZnLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsYHRyYW5zbGF0ZSgke3RoaXMubWFyZ2luLmxlZnR9LCAke3RoaXMubWFyZ2luLnRvcH0pYCksdGhpcy5jb29yZGluYXRlc0dyb3VwPXRoaXMubWFpbkNvbnRhaW5lci5hcHBlbmQoImciKSx0aGlzLmxhYmVsc0dyb3VwPXRoaXMubWFpbkNvbnRhaW5lci5hcHBlbmQoImciKSx0aGlzLmF4aXNHcm91cD10aGlzLm1haW5Db250YWluZXIuYXBwZW5kKCJnIiksdGhpcy54U2NhbGU9VXR0KCkucGFkZGluZyguMSksdGhpcy55U2NhbGU9ZWV0KCkucmFuZ2UoW3RoaXMuY2hhcnRIZWlnaHQsMF0pLHRoaXMueUF4aXM9TjUodGhpcy55U2NhbGUpLHRoaXMucmVkcmF3KCl9bmdPbkNoYW5nZXModCl7dGhpcy5zdmcmJnRoaXMucmVkcmF3KCl9cmVkcmF3KCl7dGhpcy51cGRhdGVEaW1lbnNpb25zKCksdGhpcy51cGRhdGVBeGVzKCksdGhpcy5kcmF3KCl9dXBkYXRlRGltZW5zaW9ucygpe3RoaXMud2lkdGg9dGhpcy5zdmdFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGh8fDEwLHRoaXMuY2hhcnRXaWR0aD10aGlzLndpZHRoLXRoaXMubWFyZ2luLmxlZnQtdGhpcy5tYXJnaW4ucmlnaHR9dXBkYXRlQXhlcygpe3RoaXMueFNjYWxlLnJhbmdlUm91bmQoWzAsdGhpcy5jaGFydFdpZHRoXSkuZG9tYWluKHRoaXMuYWN0aXZlTWV0cmljcyksdGhpcy55U2NhbGUuZG9tYWluKFt0aGlzLmNvb3JkaW5hdGVEYXRhLmV4dHJlbWVzLm1pbix0aGlzLmNvb3JkaW5hdGVEYXRhLmV4dHJlbWVzLm1heF0pfWRyYXcoKXt0aGlzLmRyYXdBeGVzKCksdGhpcy5kcmF3QXhpc0xhYmVscygpLHRoaXMuZHJhd0Nvb3JkaW5hdGVzKCksdGhpcy5kcmF3TGFiZWxzKCl9ZHJhd0F4ZXMoKXtjb25zdCB0PXRoaXMuYXhpc0dyb3VwLnNlbGVjdEFsbCgiLmF4aXMteSIpLmRhdGEodGhpcy5hY3RpdmVNZXRyaWNzKTt0LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJheGlzLXkiKS5tZXJnZSh0KS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybmB0cmFuc2xhdGUoJHt0aGlzLnhTY2FsZSh0KX0sIDApYH0uYmluZCh0aGlzKSkuY2FsbCh0aGlzLnlBeGlzKSx0LmV4aXQoKS5yZW1vdmUoKX1kcmF3QXhpc0xhYmVscygpe2NvbnN0IHQ9dGhpcy5heGlzR3JvdXAuc2VsZWN0QWxsKCIuYXhpcy1iZy10ZXh0IikuZGF0YSh0aGlzLmFjdGl2ZU1ldHJpY3MpO3QuZW50ZXIoKS5hcHBlbmQoInRleHQiKS5hdHRyKCJjbGFzcyIsImF4aXMtYmctdGV4dCIpLmF0dHIoImZvbnQtc2l6ZSIsIjEzcHgiKS5hdHRyKCJzdHJva2Utd2lkdGgiLDIpLmF0dHIoInN0cm9rZS1saW5lam9pbiIsInJvdW5kIikuYXR0cigic3Ryb2tlIiwid2hpdGUiKS5tZXJnZSh0KS50ZXh0KCh0PT50KSkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbih0KXtyZXR1cm5gdHJhbnNsYXRlKCR7dGhpcy54U2NhbGUodCktNX0sICR7dGhpcy55U2NhbGUodGhpcy5jb29yZGluYXRlRGF0YS5leHRyZW1lcy5taW4pfSkgcm90YXRlKC05MClgfS5iaW5kKHRoaXMpKSx0LmV4aXQoKS5yZW1vdmUoKTtjb25zdCBlPXRoaXMuYXhpc0dyb3VwLnNlbGVjdEFsbCgiLmF4aXMtdGV4dCIpLmRhdGEodGhpcy5hY3RpdmVNZXRyaWNzKTtlLmVudGVyKCkuYXBwZW5kKCJ0ZXh0IikuYXR0cigiZm9udC1zaXplIiwiMTNweCIpLmF0dHIoImNsYXNzIiwiYXhpcy10ZXh0IikubWVyZ2UoZSkudGV4dCgodD0+dCkpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7cmV0dXJuYHRyYW5zbGF0ZSgke3RoaXMueFNjYWxlKHQpLTV9LCAke3RoaXMueVNjYWxlKHRoaXMuY29vcmRpbmF0ZURhdGEuZXh0cmVtZXMubWluKX0pIHJvdGF0ZSgtOTApYH0uYmluZCh0aGlzKSksZS5leGl0KCkucmVtb3ZlKCl9ZHJhd0Nvb3JkaW5hdGVzKCl7Y29uc3QgdD10aGlzLmNvb3JkaW5hdGVzR3JvdXAuc2VsZWN0QWxsKCIuY29vcmQiKS5kYXRhKHRoaXMuY29vcmRpbmF0ZURhdGEuY29vcmRpbmF0ZXMpO3QuZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5hdHRyKCJjbGFzcyIsImNvb3JkIikuYXR0cigiZmlsbCIsIm5vbmUiKS5tZXJnZSh0KS5hdHRyKCJkIix0aGlzLnBhdGguYmluZCh0aGlzKSkuYXR0cigic3Ryb2tlIixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jb2xvclNjYWxlKHQucnVuSWQpfS5iaW5kKHRoaXMpKSx0LmV4aXQoKS5yZW1vdmUoKTtjb25zdCBlPXRoaXMuY29vcmRpbmF0ZXNHcm91cC5zZWxlY3RBbGwoIi5oaWRkZW5Db29yZCIpLmRhdGEodGhpcy5jb29yZGluYXRlRGF0YS5jb29yZGluYXRlcyk7ZS5lbnRlcigpLmFwcGVuZCgicGF0aCIpLmF0dHIoImNsYXNzIiwiaGlkZGVuQ29vcmQiKS5hdHRyKCJzdHJva2Utd2lkdGgiLCIxMHB4IikuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJzdHJva2UiLCJyZ2JhKDAsIDAsIDAsIDAuMCkiKS5vbigibW91c2VvdmVyIix0aGlzLmhhbmRsZUNvb3JkaW5hdGVNb3VzZU92ZXIuYmluZCh0aGlzKSkub24oIm1vdXNlb3V0Iix0aGlzLmhhbmRsZUNvb3JkaW5hdGVNb3VzZU91dC5iaW5kKHRoaXMpKS5tZXJnZShlKS5hdHRyKCJkIix0aGlzLnBhdGguYmluZCh0aGlzKSksZS5leGl0KCkucmVtb3ZlKCl9cGF0aCh0KXtyZXR1cm4gdC52YWx1ZXMuc29ydCgoKHQsZSk9PnRoaXMuYWN0aXZlTWV0cmljcy5pbmRleE9mKHQubWV0cmljKS10aGlzLmFjdGl2ZU1ldHJpY3MuaW5kZXhPZihlLm1ldHJpYykpKSxQb3QoKSh0LnZhbHVlcy5tYXAoZnVuY3Rpb24odCl7bGV0IGU9dGhpcy55U2NhbGUodC5uUE1JVmFsdWUpO3JldHVyblt0aGlzLnhTY2FsZSh0Lm1ldHJpYyksZV19LmJpbmQodGhpcykpKX1oYW5kbGVDb29yZGluYXRlTW91c2VPdmVyKHQsZSl7dGhpcy5sYWJlbHNHcm91cC5zZWxlY3RBbGwoIi5jb29yZGluYXRlLWxhYmVsIikuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4hKGUuYW5ub3RhdGlvbj09PXQuYW5ub3RhdGlvbil9KSkuc3R5bGUoIm9wYWNpdHkiLC4xKSx0aGlzLmNvb3JkaW5hdGVzR3JvdXAuc2VsZWN0QWxsKCIuY29vcmQiKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiEoZS5hbm5vdGF0aW9uPT09dC5hbm5vdGF0aW9uKX0pKS5zdHlsZSgib3BhY2l0eSIsLjEpfWhhbmRsZUNvb3JkaW5hdGVNb3VzZU91dCgpe3RoaXMubGFiZWxzR3JvdXAuc2VsZWN0QWxsKCIuY29vcmRpbmF0ZS1sYWJlbCIpLnN0eWxlKCJvcGFjaXR5IiwxKSx0aGlzLmNvb3JkaW5hdGVzR3JvdXAuc2VsZWN0QWxsKCIuY29vcmQiKS5zdHlsZSgib3BhY2l0eSIsMSl9ZHJhd0xhYmVscygpe2NvbnN0IHQ9MzAvdGhpcy54U2NhbGUuc3RlcCgpLGU9dGhpcy5jb29yZGluYXRlRGF0YS5jb29yZGluYXRlcy5sZW5ndGg8MzA/dGhpcy5jb29yZGluYXRlRGF0YS5jb29yZGluYXRlczpbXSxuPXRoaXMubGFiZWxzR3JvdXAuc2VsZWN0QWxsKCIuY29vcmRpbmF0ZS1sYWJlbCIpLmRhdGEoZSk7bi5lbnRlcigpLmFwcGVuZCgidGV4dCIpLmF0dHIoImNsYXNzIiwiY29vcmRpbmF0ZS1sYWJlbCIpLmF0dHIoImZvbnQtc2l6ZSIsIjEwcHgiKS5tZXJnZShuKS50ZXh0KChmdW5jdGlvbih0KXtyZXR1cm4gdC5hbm5vdGF0aW9ufSkpLmF0dHIoIngiLHRoaXMueFNjYWxlKHRoaXMuYWN0aXZlTWV0cmljc1swXSkrMzApLmF0dHIoInkiLGZ1bmN0aW9uKGUpe2NvbnN0IG49dGhpcy55U2NhbGUoZS52YWx1ZXNbMF0ublBNSVZhbHVlP2UudmFsdWVzWzBdLm5QTUlWYWx1ZTowKSxvPXRoaXMueVNjYWxlKGUudmFsdWVzWzFdLm5QTUlWYWx1ZT9lLnZhbHVlc1sxXS5uUE1JVmFsdWU6MCk7cmV0dXJuKDEtdCkqbit0Km99LmJpbmQodGhpcykpLG4uZXhpdCgpLnJlbW92ZSgpfX1MX3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fExfdCl9LExfdC7JtWNtcD10byh7dHlwZTpMX3Qsc2VsZWN0b3JzOltbInBhcmFsbGVsLWNvb3JkaW5hdGVzLWNvbXBvbmVudCJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmUWgoRl90LDcsaGcpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4uc3ZnRWxlbWVudD10LmZpcnN0KX19LGhvc3RCaW5kaW5nczpmdW5jdGlvbiB0KGUsbil7MSZlJiZWbSgicmVzaXplIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblJlc2l6ZShlKX0pLCExLG9sKX0saW5wdXRzOnthY3RpdmVNZXRyaWNzOiJhY3RpdmVNZXRyaWNzIixjb29yZGluYXRlRGF0YToiY29vcmRpbmF0ZURhdGEiLHNpZGViYXJXaWR0aDoic2lkZWJhcldpZHRoIixjb2xvclNjYWxlOiJjb2xvclNjYWxlIn0sZmVhdHVyZXM6W0JvXSxkZWNsczoyLHZhcnM6MCxjb25zdHM6W1sxLCJwYy1jaGFydCJdLFsiY2hhcnQiLCIiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKHFpKCksVG0oMCwic3ZnIiwwLDEpKX0sc3R5bGVzOlsiLnBjLWNoYXJ0W19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MzAwcHg7d2lkdGg6MTAwJX0iXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoTF90LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InBhcmFsbGVsLWNvb3JkaW5hdGVzLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vcGFyYWxsZWxfY29vcmRpbmF0ZXNfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vcGFyYWxsZWxfY29vcmRpbmF0ZXNfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse2FjdGl2ZU1ldHJpY3M6W3t0eXBlOnh5fV0sY29vcmRpbmF0ZURhdGE6W3t0eXBlOnh5fV0sc2lkZWJhcldpZHRoOlt7dHlwZTp4eX1dLGNvbG9yU2NhbGU6W3t0eXBlOnh5fV0sc3ZnRWxlbWVudDpbe3R5cGU6WmEsYXJnczpbImNoYXJ0Iix7c3RhdGljOiEwLHJlYWQ6aGd9XX1dLG9uUmVzaXplOlt7dHlwZTp3eSxhcmdzOlsid2luZG93OnJlc2l6ZSIsWyIkZXZlbnQiXV19XX0pO2NsYXNzIEJfdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5hY3RpdmVSdW5zJD10aGlzLnN0b3JlLnBpcGUoRncoTk4pKS5waXBlKEl0KCh0PT50P0FycmF5LmZyb20odC5lbnRyaWVzKCkpLmZpbHRlcigodD0+dFsxXSkpLm1hcCgodD0+dFswXSkpOltdKSkpLHRoaXMuYWN0aXZlTWV0cmljcyQ9V3QodGhpcy5zdG9yZS5zZWxlY3Qoc2J0KSx0aGlzLmFjdGl2ZVJ1bnMkLHRoaXMuc3RvcmUuc2VsZWN0KGdidCkpLnBpcGUoSXQoKChbdCxlLG5dKT0+e2xldCBvPVtdO2Zvcihjb25zdCBuIG9mIGUpdFtuXSYmKG89by5jb25jYXQodFtuXS5maWx0ZXIoKHQ9PmV5dCh0KSkpKSk7cmV0dXJuIG89Wy4uLm5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKG4pLC4uLm9dKV0sby5tYXAoKHQ9Pm55dCh0KSkpfSkpKSx0aGlzLmNvb3JkaW5hdGVEYXRhJD1XdChbdGhpcy5zdG9yZS5zZWxlY3QocmJ0KSx0aGlzLnN0b3JlLnNlbGVjdChjYnQpLHRoaXMuYWN0aXZlUnVucyQsdGhpcy5hY3RpdmVNZXRyaWNzJF0pLnBpcGUoSXQoKChbdCxlLG4sb10pPT4oZnVuY3Rpb24gaSh0LGUsbixvKXtjb25zdCBpPVtdLGE9e21heDotMSxtaW46MX0scj1uZXcgU2V0KG4pLHM9bmV3IFNldChvKTtyZXR1cm4gMD09PXIuc2l6ZXx8MD09PXMuc2l6ZXx8MD09PU9iamVjdC5rZXlzKHQpLmxlbmd0aD97Y29vcmRpbmF0ZXM6W10sZXh0cmVtZXM6e21pbjotMSxtYXg6MX19OihlLmZvckVhY2goKGU9Pntjb25zdCBuPXt9O3RbZV0uZm9yRWFjaCgodD0+e3IuaGFzKHQucnVuKSYmcy5oYXModC5tZXRyaWMpJiYoblt0LnJ1bl0/blt0LnJ1bl0ucHVzaCh0KTpuW3QucnVuXT1bdF0sbnVsbCE9PXQublBNSVZhbHVlPyhhLm1heD1NYXRoLm1heChhLm1heCx0Lm5QTUlWYWx1ZSksYS5taW49TWF0aC5taW4oYS5taW4sdC5uUE1JVmFsdWUpKTooYS5tYXg9TWF0aC5tYXgoYS5tYXgsMCksYS5taW49TWF0aC5taW4oYS5taW4sMCkpKX0pKTtmb3IoY29uc3QgdCBvZiBPYmplY3Qua2V5cyhuKSlpLnB1c2goe2Fubm90YXRpb246ZSxydW5JZDp0LHZhbHVlczpuW3RdfSl9KSksYS5tYXg8YS5taW4mJihhLm1heD0xLGEubWluPS0xKSx7Y29vcmRpbmF0ZXM6aSxleHRyZW1lczphfSl9KSh0LGUsbixvKSkpKSx0aGlzLnNpZGViYXJXaWR0aCQ9dGhpcy5zdG9yZS5zZWxlY3QoeGJ0KSx0aGlzLnJ1bkNvbG9yU2NhbGUkPXRoaXMuc3RvcmUuc2VsZWN0KHpOKS5waXBlKEl0KCh0PT5lPT57aWYoIXQuaGFzT3duUHJvcGVydHkoZSkpdGhyb3cgbmV3IEVycm9yKGBbQ29sb3Igc2NhbGVdIHVua25vd24gcnVuSWQ6ICR7ZX0uYCk7cmV0dXJuIHRbZV19KSkpfX1mdW5jdGlvbiBWX3QodCxlKXsxJnQmJlRtKDAsIm1hdC1pY29uIiw5KX1mdW5jdGlvbiBqX3QodCxlKXsxJnQmJlRtKDAsIm1hdC1pY29uIiwxMCl9ZnVuY3Rpb24gVV90KHQsZSl7MSZ0JiZUbSgwLCJucG1pLXBhcmFsbGVsLWNvb3JkaW5hdGVzIil9Ql90Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxCX3QpKFNtKEl3KSl9LEJfdC7JtWNtcD10byh7dHlwZTpCX3Qsc2VsZWN0b3JzOltbIm5wbWktcGFyYWxsZWwtY29vcmRpbmF0ZXMiXV0sZGVjbHM6NSx2YXJzOjEyLGNvbnN0czpbWzMsImFjdGl2ZU1ldHJpY3MiLCJjb29yZGluYXRlRGF0YSIsInNpZGViYXJXaWR0aCIsImNvbG9yU2NhbGUiXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFRtKDAsInBhcmFsbGVsLWNvb3JkaW5hdGVzLWNvbXBvbmVudCIsMCksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQWgoNCwiYXN5bmMiKSksMiZlJiZEbSgiYWN0aXZlTWV0cmljcyIsVGgoMSw0LG4uYWN0aXZlTWV0cmljcyQpKSgiY29vcmRpbmF0ZURhdGEiLFRoKDIsNixuLmNvb3JkaW5hdGVEYXRhJCkpKCJzaWRlYmFyV2lkdGgiLFRoKDMsOCxuLnNpZGViYXJXaWR0aCQpKSgiY29sb3JTY2FsZSIsVGgoNCwxMCxuLnJ1bkNvbG9yU2NhbGUkKSl9LGRpcmVjdGl2ZXM6W0xfdF0scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEJfdCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJucG1pLXBhcmFsbGVsLWNvb3JkaW5hdGVzIix0ZW1wbGF0ZTonXG4gICAgPHBhcmFsbGVsLWNvb3JkaW5hdGVzLWNvbXBvbmVudFxuICAgICAgW2FjdGl2ZU1ldHJpY3NdPSJhY3RpdmVNZXRyaWNzJCB8IGFzeW5jIlxuICAgICAgW2Nvb3JkaW5hdGVEYXRhXT0iY29vcmRpbmF0ZURhdGEkIHwgYXN5bmMiXG4gICAgICBbc2lkZWJhcldpZHRoXT0ic2lkZWJhcldpZHRoJCB8IGFzeW5jIlxuICAgICAgW2NvbG9yU2NhbGVdPSJydW5Db2xvclNjYWxlJCB8IGFzeW5jIlxuICAgID48L3BhcmFsbGVsLWNvb3JkaW5hdGVzLWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NsYXNzIEdfdHtjb25zdHJ1Y3Rvcigpe3RoaXMub25DbGVhclNlbGVjdGVkQW5ub3RhdGlvbnM9bmV3IExoLHRoaXMub25Ub2dnbGVFeHBhbmRlZD1uZXcgTGh9fUdfdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8R190KX0sR190Lsm1Y21wPXRvKHt0eXBlOkdfdCxzZWxlY3RvcnM6W1sic2VsZWN0ZWQtYW5ub3RhdGlvbnMtY29tcG9uZW50Il1dLGlucHV0czp7cGNFeHBhbmRlZDoicGNFeHBhbmRlZCIsc2VsZWN0ZWRBbm5vdGF0aW9uczoic2VsZWN0ZWRBbm5vdGF0aW9ucyJ9LG91dHB1dHM6e29uQ2xlYXJTZWxlY3RlZEFubm90YXRpb25zOiJvbkNsZWFyU2VsZWN0ZWRBbm5vdGF0aW9ucyIsb25Ub2dnbGVFeHBhbmRlZDoib25Ub2dnbGVFeHBhbmRlZCJ9LGRlY2xzOjExLHZhcnM6NCxjb25zdHM6ZnVuY3Rpb24oKXtsZXQgdCxlO3JldHVybiB0PSJ1bmRlZmluZWQiIT10eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUmJm5nSTE4bkNsb3N1cmVNb2RlP2dvb2cuZ2V0TXNnKCJDbGVhciBBbm5vdGF0aW9uIFNlbGVjdGlvbiIpOiRsb2NhbGl6ZWA6TGFiZWwgZm9yIGEgYnV0dG9uIHRoYXQgY2xlYXJzIHRoZSBhbm5vdGF0aW9uIHNlbGVjdGlvbi7ikJ8yYjUyMjg5ZjJjNGI3ZjViMTgyZWQyM2M5MTU0NzIyZWNkNDZhMmQ04pCfMjQ5NDY2MDUyMDM0MTMwODgzMDpDbGVhciBBbm5vdGF0aW9uIFNlbGVjdGlvbmAsZT0idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZT9nb29nLmdldE1zZygiRXhwYW5kL0hpZGUgU2VsZWN0ZWQgQW5ub3RhdGlvbnMiKTokbG9jYWxpemVgOkxhYmVsIGZvciBhIGJ1dHRvbiB0aGF0IGV4cGFuZHMgb3IgaGlkZXMgc2VsZWN0ZWQgYW5ub3RhdGlvbnMu4pCfOGY0YWQzMDVjMTllMzY1NWYzMTg5ZTNlMjY0ZTgzZmI3NmY3YmI5NeKQnzU2NzA3OTc3ODQwNzA5NTIwOTU6RXhwYW5kL0hpZGUgU2VsZWN0ZWQgQW5ub3RhdGlvbnNgLFtbMSwicGMtY29udGFpbmVyIl0sWzEsInBjLXRvb2xiYXIiXSxbMSwicGMtdGl0bGUiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLHQsInRpdGxlIiwiRGVzZWxlY3RzIGFsbCBzZWxlY3RlZCBhbm5vdGF0aW9ucy4iLDEsImNsZWFyLWJ1dHRvbiIsMywiZGlzYWJsZWQiLCJjbGljayJdLFsic3ZnSWNvbiIsImNsZWFyXzI0cHgiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLGUsMSwiZXhwYW5kLWJ1dHRvbiIsMywiY2xpY2siXSxbInN2Z0ljb24iLCJleHBhbmRfbGVzc18yNHB4IiwiY2xhc3MiLCJleHBhbmQtbGVzcy1pY29uIiw0LCJuZ0lmIiwibmdJZkVsc2UiXSxbIm5vdEV4cGFuZGVkIiwiIl0sWzQsIm5nSWYiXSxbInN2Z0ljb24iLCJleHBhbmRfbGVzc18yNHB4IiwxLCJleHBhbmQtbGVzcy1pY29uIl0sWyJzdmdJY29uIiwiZXhwYW5kX21vcmVfMjRweCIsMSwiZXhwYW5kLWljb24iXV19LHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihSbSgwLCJkaXYiLDApLFJtKDEsImRpdiIsMSksUm0oMiwiaDMiLDIpLGt1KDMsIlNlbGVjdGVkIEFubm90YXRpb25zIiksQW0oKSxSbSg0LCJidXR0b24iLDMpLFZtKCJjbGljayIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vbkNsZWFyU2VsZWN0ZWRBbm5vdGF0aW9ucy5lbWl0KCl9KSksVG0oNSwibWF0LWljb24iLDQpLEFtKCksUm0oNiwiYnV0dG9uIiw1KSxWbSgiY2xpY2siLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25Ub2dnbGVFeHBhbmRlZC5lbWl0KCl9KSksUXAoNyxWX3QsMSwwLCJtYXQtaWNvbiIsNiksUXAoOCxqX3QsMSwwLCJuZy10ZW1wbGF0ZSIsbnVsbCw3LGliKSxBbSgpLEFtKCksUXAoMTAsVV90LDEsMCwibnBtaS1wYXJhbGxlbC1jb29yZGluYXRlcyIsOCksQW0oKSksMiZlKXtjb25zdCB0PSRwKDkpO3JjKDQpLERtKCJkaXNhYmxlZCIsMD09PW4uc2VsZWN0ZWRBbm5vdGF0aW9ucy5sZW5ndGgpLHJjKDMpLERtKCJuZ0lmIixuLnBjRXhwYW5kZWQpKCJuZ0lmRWxzZSIsdCkscmMoMyksRG0oIm5nSWYiLG4ucGNFeHBhbmRlZCl9fSxkaXJlY3RpdmVzOltYSCxEVyxkTSxCX3RdLHN0eWxlczpbJy5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfS5tYXQtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5wYy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICNlYmViZWJ9LnBjLXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmViO2Rpc3BsYXk6ZmxleDtoZWlnaHQ6NDJweDtwYWRkaW5nOjAgMTZweH0ucGMtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMDtkaXNwbGF5OmlubGluZTtmbGV4OjEgMX0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoR190LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InNlbGVjdGVkLWFubm90YXRpb25zLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vc2VsZWN0ZWRfYW5ub3RhdGlvbnNfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vc2VsZWN0ZWRfYW5ub3RhdGlvbnNfY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse3BjRXhwYW5kZWQ6W3t0eXBlOnh5fV0sc2VsZWN0ZWRBbm5vdGF0aW9uczpbe3R5cGU6eHl9XSxvbkNsZWFyU2VsZWN0ZWRBbm5vdGF0aW9uczpbe3R5cGU6T3l9XSxvblRvZ2dsZUV4cGFuZGVkOlt7dHlwZTpPeX1dfSk7Y2xhc3MgV190e2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLnBjRXhwYW5kZWQkPXRoaXMuc3RvcmUucGlwZShGdyhiYnQpKSx0aGlzLnNlbGVjdGVkQW5ub3RhdGlvbnMkPXRoaXMuc3RvcmUuc2VsZWN0KGNidCl9Y2xlYXJTZWxlY3RlZEFubm90YXRpb25zKCl7dGhpcy5zdG9yZS5kaXNwYXRjaChUYnQoKSl9dG9nZ2xlRXhwYW5kZWQoKXt0aGlzLnN0b3JlLmRpc3BhdGNoKFVidCgpKX19ZnVuY3Rpb24gWV90KHQsZSl7MSZ0JiYoUm0oMCwiZGl2Iiw2KSxSbSgxLCJkaXYiLDcpLFRtKDIsIm5wbWktdmlvbGluLWZpbHRlcnMiLDgpLFJtKDMsImRpdiIsOSksVG0oNCwicnVucy1zZWxlY3RvciIpLEFtKCksQW0oKSxBbSgpKSwyJnQmJmR1KCJ3aWR0aCIsWW0oKS5zaWRlYmFyV2lkdGgsInB4Iil9ZnVuY3Rpb24gcV90KHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2IiwxMCksVm0oIm1vdXNlZG93biIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5yZXNpemVHcmFiYmVkLmVtaXQoKX0pKSxBbSgpfX1mdW5jdGlvbiBaX3QodCxlKXsxJnQmJihSbSgwLCJkaXYiLDExKSxUbSgxLCJucG1pLWFubm90YXRpb25zLWxpc3QiLDEyKSxUbSgyLCJucG1pLXNlbGVjdGVkLWFubm90YXRpb25zIiksQW0oKSl9ZnVuY3Rpb24gWF90KHQsZSl7MSZ0JiYoUm0oMCwiZGl2IiwxMyksa3UoMSwiWW91IG5lZWQgdG8gc2VsZWN0IGF0IGxlYXN0IG9uZSBydW4uIiksQW0oKSl9ZnVuY3Rpb24gS190KHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2IiwxNCksUm0oMSwiYnV0dG9uIiwxNSksVm0oImNsaWNrIiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgpLnRvZ2dsZVNpZGViYXJFeHBhbmRlZC5lbWl0KCl9KSksVG0oMiwibWF0LWljb24iLDE2KSxBbSgpLEFtKCl9fVdfdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8V190KShTbShJdykpfSxXX3QuybVjbXA9dG8oe3R5cGU6V190LHNlbGVjdG9yczpbWyJucG1pLXNlbGVjdGVkLWFubm90YXRpb25zIl1dLGRlY2xzOjMsdmFyczo2LGNvbnN0czpbWzMsInBjRXhwYW5kZWQiLCJzZWxlY3RlZEFubm90YXRpb25zIiwib25DbGVhclNlbGVjdGVkQW5ub3RhdGlvbnMiLCJvblRvZ2dsZUV4cGFuZGVkIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJzZWxlY3RlZC1hbm5vdGF0aW9ucy1jb21wb25lbnQiLDApLFZtKCJvbkNsZWFyU2VsZWN0ZWRBbm5vdGF0aW9ucyIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5jbGVhclNlbGVjdGVkQW5ub3RhdGlvbnMoKX0pKSgib25Ub2dnbGVFeHBhbmRlZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi50b2dnbGVFeHBhbmRlZCgpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBbSgpKSwyJmUmJkRtKCJwY0V4cGFuZGVkIixUaCgxLDIsbi5wY0V4cGFuZGVkJCkpKCJzZWxlY3RlZEFubm90YXRpb25zIixUaCgyLDQsbi5zZWxlY3RlZEFubm90YXRpb25zJCkpfSxkaXJlY3RpdmVzOltHX3RdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChXX3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibnBtaS1zZWxlY3RlZC1hbm5vdGF0aW9ucyIsdGVtcGxhdGU6J1xuICAgIDxzZWxlY3RlZC1hbm5vdGF0aW9ucy1jb21wb25lbnRcbiAgICAgIFtwY0V4cGFuZGVkXT0icGNFeHBhbmRlZCQgfCBhc3luYyJcbiAgICAgIFtzZWxlY3RlZEFubm90YXRpb25zXT0ic2VsZWN0ZWRBbm5vdGF0aW9ucyQgfCBhc3luYyJcbiAgICAgIChvbkNsZWFyU2VsZWN0ZWRBbm5vdGF0aW9ucyk9ImNsZWFyU2VsZWN0ZWRBbm5vdGF0aW9ucygpIlxuICAgICAgKG9uVG9nZ2xlRXhwYW5kZWQpPSJ0b2dnbGVFeHBhbmRlZCgpIlxuICAgID48L3NlbGVjdGVkLWFubm90YXRpb25zLWNvbXBvbmVudD5cbiAgJyxjaGFuZ2VEZXRlY3Rpb246em4uT25QdXNofV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO2NsYXNzIEpfdHtjb25zdHJ1Y3Rvcigpe3RoaXMudG9nZ2xlU2lkZWJhckV4cGFuZGVkPW5ldyBMaCx0aGlzLnJlc2l6ZVRyaWdnZXJlZD1uZXcgTGgsdGhpcy5yZXNpemVHcmFiYmVkPW5ldyBMaCx0aGlzLnJlc2l6ZVJlbGVhc2VkPW5ldyBMaH19Sl90Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxKX3QpfSxKX3QuybVjbXA9dG8oe3R5cGU6Sl90LHNlbGVjdG9yczpbWyJtYWluLWNvbXBvbmVudCJdXSxpbnB1dHM6e3J1bkFjdGl2ZToicnVuQWN0aXZlIixzaWRlYmFyRXhwYW5kZWQ6InNpZGViYXJFeHBhbmRlZCIsc2lkZWJhcldpZHRoOiJzaWRlYmFyV2lkdGgifSxvdXRwdXRzOnt0b2dnbGVTaWRlYmFyRXhwYW5kZWQ6InRvZ2dsZVNpZGViYXJFeHBhbmRlZCIscmVzaXplVHJpZ2dlcmVkOiJyZXNpemVUcmlnZ2VyZWQiLHJlc2l6ZUdyYWJiZWQ6InJlc2l6ZUdyYWJiZWQiLHJlc2l6ZVJlbGVhc2VkOiJyZXNpemVSZWxlYXNlZCJ9LGRlY2xzOjgsdmFyczo1LGNvbnN0czpmdW5jdGlvbigpe2xldCB0O3JldHVybiB0PSJ1bmRlZmluZWQiIT10eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUmJm5nSTE4bkNsb3N1cmVNb2RlP2dvb2cuZ2V0TXNnKCJUb2dnbGUgU2lkZWJhciIpOiRsb2NhbGl6ZWA6TGFiZWwgZm9yIGEgYnV0dG9uIHRoYXQgdG9nZ2xlcyB0aGUgc2lkZWJhci7ikJ9mNjNiNTc5MzJkMTc5Y2NhNjJhYzlmY2FlNjNkZDdmNWU2ZmEzODlm4pCfNDQ4NTAwOTM0NzQ0NDcwNDg3ODpUb2dnbGUgU2lkZWJhcmAsW1sxLCJjb250ZW50IiwzLCJtb3VzZXVwIiwibW91c2Vtb3ZlIl0sWyJjbGFzcyIsInNpZGViYXItY29udGFpbmVyIiwzLCJ3aWR0aCIsNCwibmdJZiJdLFsiY2xhc3MiLCJncmFiYmVyIiwzLCJtb3VzZWRvd24iLDQsIm5nSWYiXSxbImNsYXNzIiwiYW5hbHlzaXMtY29udGFpbmVyIiw0LCJuZ0lmIiwibmdJZkVsc2UiXSxbIm5vUnVuIiwiIl0sWyJjbGFzcyIsInNpZGUtdG9nZ2xlIiw0LCJuZ0lmIl0sWzEsInNpZGViYXItY29udGFpbmVyIl0sWzEsInNpZGViYXItY29udGVudHMiXSxbMSwidmlvbGluLWZpbHRlcnMiXSxbMSwicnVuLXNlbGVjdG9yIl0sWzEsImdyYWJiZXIiLDMsIm1vdXNlZG93biJdLFsxLCJhbmFseXNpcy1jb250YWluZXIiXSxbMSwiYW5ub3RhdGlvbnMtbGlzdCJdLFsxLCJub1J1biJdLFsxLCJzaWRlLXRvZ2dsZSJdLFsibWF0LWljb24tYnV0dG9uIiwiIiwiYXJpYS1sYWJlbCIsdCwzLCJjbGljayJdLFsic3ZnSWNvbiIsImNoZXZyb25fcmlnaHRfMjRweCJdXX0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmKFRtKDAsIm5wbWktZGF0YS1zZWxlY3Rpb24iKSxSbSgxLCJkaXYiLDApLFZtKCJtb3VzZXVwIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLnJlc2l6ZVJlbGVhc2VkLmVtaXQoKX0pKSgibW91c2Vtb3ZlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5yZXNpemVUcmlnZ2VyZWQuZW1pdChlKX0pKSxRcCgyLFlfdCw1LDIsImRpdiIsMSksUXAoMyxxX3QsMSwwLCJkaXYiLDIpLFFwKDQsWl90LDMsMCwiZGl2IiwzKSxRcCg1LFhfdCwyLDAsIm5nLXRlbXBsYXRlIixudWxsLDQsaWIpLEFtKCksUXAoNyxLX3QsMywwLCJkaXYiLDUpKSwyJmUpe2NvbnN0IHQ9JHAoNik7cmMoMiksRG0oIm5nSWYiLG4uc2lkZWJhckV4cGFuZGVkKSxyYygxKSxEbSgibmdJZiIsbi5zaWRlYmFyRXhwYW5kZWQpLHJjKDEpLERtKCJuZ0lmIiwhMD09PW4ucnVuQWN0aXZlKSgibmdJZkVsc2UiLHQpLHJjKDMpLERtKCJuZ0lmIiwhbi5zaWRlYmFyRXhwYW5kZWQpfX0sZGlyZWN0aXZlczpbVXl0LGRNLEp5dCxjMixIX3QsV190LFhILERXXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47aGVpZ2h0OjEwMCV9LmNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4OjE7bWluLWhlaWdodDowcHg7d2lkdGg6MTAwJX0uc2lkZWJhci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlO292ZXJmbG93OmhpZGRlbn0uc2lkZWJhci1jb250ZW50c1tfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCU7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MTUwcHh9LmFuYWx5c2lzLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtoZWlnaHQ6MTAwJTtmbGV4OjEgMX0ucnVuLXNlbGVjdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXttYXgtaGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0udmlvbGluLWZpbHRlcnNbX25nY29udGVudC0lQ09NUCVde21pbi1oZWlnaHQ6MHB4O3dpZHRoOjEwMCV9LnNpZGUtdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDozMHB4O2hlaWdodDozMHB4O3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MTBweDtib3R0b206MTBweDtib3JkZXI6MXB4IHNvbGlkICNlYmViZWI7Ym9yZGVyLXJhZGl1czozcHg7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5ncmFiYmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb250ZW50OiIiO2N1cnNvcjpldy1yZXNpemU7aGVpZ2h0OjEwMCU7d2lkdGg6M3B4O292ZXJmbG93OmhpZGRlbjtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0uYW5ub3RhdGlvbnMtbGlzdFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJTttaW4taGVpZ2h0OjBweDtmbGV4OjEgMX0nXSxjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoSl90LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im1haW4tY29tcG9uZW50Iix0ZW1wbGF0ZVVybDoiLi9tYWluX2NvbXBvbmVudC5uZy5odG1sIixzdHlsZVVybHM6WyIuL21haW5fY29tcG9uZW50LmNzcyJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwse3J1bkFjdGl2ZTpbe3R5cGU6eHl9XSxzaWRlYmFyRXhwYW5kZWQ6W3t0eXBlOnh5fV0sc2lkZWJhcldpZHRoOlt7dHlwZTp4eX1dLHRvZ2dsZVNpZGViYXJFeHBhbmRlZDpbe3R5cGU6T3l9XSxyZXNpemVUcmlnZ2VyZWQ6W3t0eXBlOk95fV0scmVzaXplR3JhYmJlZDpbe3R5cGU6T3l9XSxyZXNpemVSZWxlYXNlZDpbe3R5cGU6T3l9XX0pO2NsYXNzIFFfdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5ydW5BY3RpdmUkPXRoaXMuc3RvcmUucGlwZShGdyhOTikpLnBpcGUoSXQoKHQ9PiEhdCYmWy4uLnQudmFsdWVzKCldLmluY2x1ZGVzKCEwKSkpKSx0aGlzLnNpZGViYXJFeHBhbmRlZCQ9dGhpcy5zdG9yZS5waXBlKEZ3KF9idCkpLHRoaXMuc2lkZWJhcldpZHRoJD10aGlzLnN0b3JlLnBpcGUoRncoeGJ0KSksdGhpcy5yZXNpemluZz0hMX1vblRvZ2dsZVNpZGViYXJFeHBhbmRlZCgpe3RoaXMuc3RvcmUuZGlzcGF0Y2goV2J0KCkpfW9uUmVzaXplVHJpZ2dlcmVkKHQpe3RoaXMucmVzaXppbmcmJnRoaXMuc3RvcmUuZGlzcGF0Y2goWGJ0KHtzaWRlYmFyV2lkdGg6dC5jbGllbnRYfSkpfW9uUmVzaXplR3JhYmJlZCgpe3RoaXMucmVzaXppbmc9ITB9b25SZXNpemVSZWxlYXNlZCgpe3RoaXMucmVzaXppbmc9ITF9fWZ1bmN0aW9uICRfdCh0LGUpezEmdCYmKFJtKDAsImRpdiIsNiksUm0oMSwiZGl2Iiw3KSxSbSgyLCJkaXYiLDgpLFRtKDMsInJ1bnMtc2VsZWN0b3IiKSxBbSgpLEFtKCksQW0oKSksMiZ0JiZkdSgid2lkdGgiLFltKCkuc2lkZWJhcldpZHRoLCJweCIpfWZ1bmN0aW9uIHRDdCh0LGUpe2lmKDEmdCl7Y29uc3QgdD1IbSgpO1JtKDAsImRpdiIsOSksVm0oIm1vdXNlZG93biIsKGZ1bmN0aW9uIGUoKXtyZXR1cm4gaGkodCksWW0oKS5yZXNpemVHcmFiYmVkLmVtaXQoKX0pKSxBbSgpfX1mdW5jdGlvbiBlQ3QodCxlKXsxJnQmJihSbSgwLCJkaXYiLDEwKSxUbSgxLCJucG1pLWFubm90YXRpb25zLWxpc3QiLDExKSxUbSgyLCJucG1pLXNlbGVjdGVkLWFubm90YXRpb25zIiksQW0oKSl9ZnVuY3Rpb24gbkN0KHQsZSl7MSZ0JiYoUm0oMCwiZGl2IiwxMiksa3UoMSwiWW91IG5lZWQgdG8gc2VsZWN0IGF0IGxlYXN0IG9uZSBydW4uIiksQW0oKSl9ZnVuY3Rpb24gb0N0KHQsZSl7aWYoMSZ0KXtjb25zdCB0PUhtKCk7Um0oMCwiZGl2IiwxMyksUm0oMSwiYnV0dG9uIiwxNCksVm0oImNsaWNrIiwoZnVuY3Rpb24gZSgpe3JldHVybiBoaSh0KSxZbSgpLnRvZ2dsZVNpZGViYXJFeHBhbmRlZC5lbWl0KCl9KSksVG0oMiwibWF0LWljb24iLDE1KSxBbSgpLEFtKCl9fVFfdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8UV90KShTbShJdykpfSxRX3QuybVjbXA9dG8oe3R5cGU6UV90LHNlbGVjdG9yczpbWyJucG1pLW1haW4iXV0sZGVjbHM6NCx2YXJzOjksY29uc3RzOltbMywicnVuQWN0aXZlIiwic2lkZWJhckV4cGFuZGVkIiwic2lkZWJhcldpZHRoIiwidG9nZ2xlU2lkZWJhckV4cGFuZGVkIiwicmVzaXplVHJpZ2dlcmVkIiwicmVzaXplR3JhYmJlZCIsInJlc2l6ZVJlbGVhc2VkIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihSbSgwLCJtYWluLWNvbXBvbmVudCIsMCksVm0oInRvZ2dsZVNpZGViYXJFeHBhbmRlZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblRvZ2dsZVNpZGViYXJFeHBhbmRlZCgpfSkpKCJyZXNpemVUcmlnZ2VyZWQiLChmdW5jdGlvbiB0KGUpe3JldHVybiBuLm9uUmVzaXplVHJpZ2dlcmVkKGUpfSkpKCJyZXNpemVHcmFiYmVkIiwoZnVuY3Rpb24gdCgpe3JldHVybiBuLm9uUmVzaXplR3JhYmJlZCgpfSkpKCJyZXNpemVSZWxlYXNlZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblJlc2l6ZVJlbGVhc2VkKCl9KSksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQW0oKSksMiZlJiZEbSgicnVuQWN0aXZlIixUaCgxLDMsbi5ydW5BY3RpdmUkKSkoInNpZGViYXJFeHBhbmRlZCIsVGgoMiw1LG4uc2lkZWJhckV4cGFuZGVkJCkpKCJzaWRlYmFyV2lkdGgiLFRoKDMsNyxuLnNpZGViYXJXaWR0aCQpKX0sZGlyZWN0aXZlczpbSl90XSxwaXBlczpbd01dLGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUV90LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6Im5wbWktbWFpbiIsdGVtcGxhdGU6J1xuICAgIDxtYWluLWNvbXBvbmVudFxuICAgICAgW3J1bkFjdGl2ZV09InJ1bkFjdGl2ZSQgfCBhc3luYyJcbiAgICAgIFtzaWRlYmFyRXhwYW5kZWRdPSJzaWRlYmFyRXhwYW5kZWQkIHwgYXN5bmMiXG4gICAgICBbc2lkZWJhcldpZHRoXT0ic2lkZWJhcldpZHRoJCB8IGFzeW5jIlxuICAgICAgKHRvZ2dsZVNpZGViYXJFeHBhbmRlZCk9Im9uVG9nZ2xlU2lkZWJhckV4cGFuZGVkKCkiXG4gICAgICAocmVzaXplVHJpZ2dlcmVkKT0ib25SZXNpemVUcmlnZ2VyZWQoJGV2ZW50KSJcbiAgICAgIChyZXNpemVHcmFiYmVkKT0ib25SZXNpemVHcmFiYmVkKCkiXG4gICAgICAocmVzaXplUmVsZWFzZWQpPSJvblJlc2l6ZVJlbGVhc2VkKCkiXG4gICAgPjwvbWFpbi1jb21wb25lbnQ+XG4gICcsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSxudWxsKTtjbGFzcyBpQ3R7Y29uc3RydWN0b3IoKXt0aGlzLnRvZ2dsZVNpZGViYXJFeHBhbmRlZD1uZXcgTGgsdGhpcy5yZXNpemVUcmlnZ2VyZWQ9bmV3IExoLHRoaXMucmVzaXplR3JhYmJlZD1uZXcgTGgsdGhpcy5yZXNpemVSZWxlYXNlZD1uZXcgTGh9fWlDdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8aUN0KX0saUN0Lsm1Y21wPXRvKHt0eXBlOmlDdCxzZWxlY3RvcnM6W1siZW1iZWRkaW5ncy1jb21wb25lbnQiXV0saW5wdXRzOntydW5BY3RpdmU6InJ1bkFjdGl2ZSIsc2lkZWJhckV4cGFuZGVkOiJzaWRlYmFyRXhwYW5kZWQiLHNpZGViYXJXaWR0aDoic2lkZWJhcldpZHRoIn0sb3V0cHV0czp7dG9nZ2xlU2lkZWJhckV4cGFuZGVkOiJ0b2dnbGVTaWRlYmFyRXhwYW5kZWQiLHJlc2l6ZVRyaWdnZXJlZDoicmVzaXplVHJpZ2dlcmVkIixyZXNpemVHcmFiYmVkOiJyZXNpemVHcmFiYmVkIixyZXNpemVSZWxlYXNlZDoicmVzaXplUmVsZWFzZWQifSxkZWNsczo4LHZhcnM6NSxjb25zdHM6ZnVuY3Rpb24oKXtsZXQgdDtyZXR1cm4gdD0idW5kZWZpbmVkIiE9dHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlJiZuZ0kxOG5DbG9zdXJlTW9kZT9nb29nLmdldE1zZygiVG9nZ2xlIFNpZGViYXIiKTokbG9jYWxpemVgOkxhYmVsIGZvciBhIGJ1dHRvbiB0aGF0IHRvZ2dsZXMgdGhlIHNpZGViYXIu4pCfZjYzYjU3OTMyZDE3OWNjYTYyYWM5ZmNhZTYzZGQ3ZjVlNmZhMzg5ZuKQnzQ0ODUwMDkzNDc0NDQ3MDQ4Nzg6VG9nZ2xlIFNpZGViYXJgLFtbMSwiY29udGVudCIsMywibW91c2V1cCIsIm1vdXNlbW92ZSJdLFsiY2xhc3MiLCJzaWRlYmFyLWNvbnRhaW5lciIsMywid2lkdGgiLDQsIm5nSWYiXSxbImNsYXNzIiwiZ3JhYmJlciIsMywibW91c2Vkb3duIiw0LCJuZ0lmIl0sWyJjbGFzcyIsImFuYWx5c2lzLWNvbnRhaW5lciIsNCwibmdJZiIsIm5nSWZFbHNlIl0sWyJub1J1biIsIiJdLFsiY2xhc3MiLCJzaWRlLXRvZ2dsZSIsNCwibmdJZiJdLFsxLCJzaWRlYmFyLWNvbnRhaW5lciJdLFsxLCJzaWRlYmFyLWNvbnRlbnRzIl0sWzEsInJ1bi1zZWxlY3RvciJdLFsxLCJncmFiYmVyIiwzLCJtb3VzZWRvd24iXSxbMSwiYW5hbHlzaXMtY29udGFpbmVyIl0sWzEsImFubm90YXRpb25zLWxpc3QiXSxbMSwibm9SdW4iXSxbMSwic2lkZS10b2dnbGUiXSxbIm1hdC1pY29uLWJ1dHRvbiIsIiIsImFyaWEtbGFiZWwiLHQsMywiY2xpY2siXSxbInN2Z0ljb24iLCJjaGV2cm9uX3JpZ2h0XzI0cHgiXV19LHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXtpZigxJmUmJihUbSgwLCJucG1pLWRhdGEtc2VsZWN0aW9uIiksUm0oMSwiZGl2IiwwKSxWbSgibW91c2V1cCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5yZXNpemVSZWxlYXNlZC5lbWl0KCl9KSkoIm1vdXNlbW92ZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIG4ucmVzaXplVHJpZ2dlcmVkLmVtaXQoZSl9KSksUXAoMiwkX3QsNCwyLCJkaXYiLDEpLFFwKDMsdEN0LDEsMCwiZGl2IiwyKSxRcCg0LGVDdCwzLDAsImRpdiIsMyksUXAoNSxuQ3QsMiwwLCJuZy10ZW1wbGF0ZSIsbnVsbCw0LGliKSxBbSgpLFFwKDcsb0N0LDMsMCwiZGl2Iiw1KSksMiZlKXtjb25zdCB0PSRwKDYpO3JjKDIpLERtKCJuZ0lmIixuLnNpZGViYXJFeHBhbmRlZCkscmMoMSksRG0oIm5nSWYiLG4uc2lkZWJhckV4cGFuZGVkKSxyYygxKSxEbSgibmdJZiIsITA9PT1uLnJ1bkFjdGl2ZSkoIm5nSWZFbHNlIix0KSxyYygzKSxEbSgibmdJZiIsIW4uc2lkZWJhckV4cGFuZGVkKX19LGRpcmVjdGl2ZXM6W1V5dCxkTSxjMixIX3QsV190LFhILERXXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47aGVpZ2h0OjEwMCV9LmNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4OjE7bWluLWhlaWdodDowcHg7d2lkdGg6MTAwJX0uc2lkZWJhci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlO292ZXJmbG93OmhpZGRlbn0uc2lkZWJhci1jb250ZW50c1tfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCU7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MTUwcHh9LmFuYWx5c2lzLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtoZWlnaHQ6MTAwJTtmbGV4OjEgMX0ucnVuLXNlbGVjdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXttYXgtaGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uc2lkZS10b2dnbGVbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjMwcHg7aGVpZ2h0OjMwcHg7cG9zaXRpb246YWJzb2x1dGU7bGVmdDoxMHB4O2JvdHRvbToxMHB4O2JvcmRlcjoxcHggc29saWQgI2ViZWJlYjtib3JkZXItcmFkaXVzOjNweDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXJ9LmdyYWJiZXJbX25nY29udGVudC0lQ09NUCVde2NvbnRlbnQ6IiI7Y3Vyc29yOmV3LXJlc2l6ZTtoZWlnaHQ6MTAwJTt3aWR0aDozcHg7b3ZlcmZsb3c6aGlkZGVuO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5hbm5vdGF0aW9ucy1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxMDAlO21pbi1oZWlnaHQ6MHB4O2ZsZXg6MSAxfSddLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChpQ3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoiZW1iZWRkaW5ncy1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiIuL2VtYmVkZGluZ3NfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vZW1iZWRkaW5nc19jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7cnVuQWN0aXZlOlt7dHlwZTp4eX1dLHNpZGViYXJFeHBhbmRlZDpbe3R5cGU6eHl9XSxzaWRlYmFyV2lkdGg6W3t0eXBlOnh5fV0sdG9nZ2xlU2lkZWJhckV4cGFuZGVkOlt7dHlwZTpPeX1dLHJlc2l6ZVRyaWdnZXJlZDpbe3R5cGU6T3l9XSxyZXNpemVHcmFiYmVkOlt7dHlwZTpPeX1dLHJlc2l6ZVJlbGVhc2VkOlt7dHlwZTpPeX1dfSk7Y2xhc3MgYUN0e2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLnJ1bkFjdGl2ZSQ9dGhpcy5zdG9yZS5waXBlKEZ3KE5OKSkucGlwZShJdCgodD0+ISF0JiZbLi4udC52YWx1ZXMoKV0uaW5jbHVkZXMoITApKSkpLHRoaXMuc2lkZWJhckV4cGFuZGVkJD10aGlzLnN0b3JlLnBpcGUoRncod2J0KSksdGhpcy5zaWRlYmFyV2lkdGgkPXRoaXMuc3RvcmUucGlwZShGdyhQYnQpKSx0aGlzLnJlc2l6aW5nPSExfW9uVG9nZ2xlU2lkZWJhckV4cGFuZGVkKCl7dGhpcy5zdG9yZS5kaXNwYXRjaChKYnQoKSl9b25SZXNpemVUcmlnZ2VyZWQodCl7dGhpcy5yZXNpemluZyYmdGhpcy5zdG9yZS5kaXNwYXRjaChLYnQoe3NpZGViYXJXaWR0aDp0LmNsaWVudFh9KSl9b25SZXNpemVHcmFiYmVkKCl7dGhpcy5yZXNpemluZz0hMH1vblJlc2l6ZVJlbGVhc2VkKCl7dGhpcy5yZXNpemluZz0hMX19ZnVuY3Rpb24gckN0KHQsZSl7MSZ0JiZUbSgwLCJucG1pLWluYWN0aXZlLXZpZXciKX1mdW5jdGlvbiBzQ3QodCxlKXsxJnQmJlRtKDAsIm5wbWktbWFpbiIpfWZ1bmN0aW9uIGxDdCh0LGUpezEmdCYmVG0oMCwibnBtaS1lbWJlZGRpbmdzIil9ZnVuY3Rpb24gY0N0KHQsZSl7aWYoMSZ0JiYoUXAoMCxzQ3QsMSwwLCJucG1pLW1haW4iLDMpLFFwKDEsbEN0LDEsMCwibnBtaS1lbWJlZGRpbmdzIiwzKSksMiZ0KXtjb25zdCB0PVltKCk7RG0oIm5nSWYiLHQuYWN0aXZlVmlldz09PXQuVmlld0FjdGl2ZS5ERUZBVUxUKSxyYygxKSxEbSgibmdJZiIsdC5hY3RpdmVWaWV3PT09dC5WaWV3QWN0aXZlLkVNQkVERElOR1MpfX1hQ3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGFDdCkoU20oSXcpKX0sYUN0Lsm1Y21wPXRvKHt0eXBlOmFDdCxzZWxlY3RvcnM6W1sibnBtaS1lbWJlZGRpbmdzIl1dLGRlY2xzOjQsdmFyczo5LGNvbnN0czpbWzMsInJ1bkFjdGl2ZSIsInNpZGViYXJFeHBhbmRlZCIsInNpZGViYXJXaWR0aCIsInRvZ2dsZVNpZGViYXJFeHBhbmRlZCIsInJlc2l6ZVRyaWdnZXJlZCIsInJlc2l6ZUdyYWJiZWQiLCJyZXNpemVSZWxlYXNlZCJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiYoUm0oMCwiZW1iZWRkaW5ncy1jb21wb25lbnQiLDApLFZtKCJ0b2dnbGVTaWRlYmFyRXhwYW5kZWQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25Ub2dnbGVTaWRlYmFyRXhwYW5kZWQoKX0pKSgicmVzaXplVHJpZ2dlcmVkIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gbi5vblJlc2l6ZVRyaWdnZXJlZChlKX0pKSgicmVzaXplR3JhYmJlZCIsKGZ1bmN0aW9uIHQoKXtyZXR1cm4gbi5vblJlc2l6ZUdyYWJiZWQoKX0pKSgicmVzaXplUmVsZWFzZWQiLChmdW5jdGlvbiB0KCl7cmV0dXJuIG4ub25SZXNpemVSZWxlYXNlZCgpfSkpLEFoKDEsImFzeW5jIiksQWgoMiwiYXN5bmMiKSxBaCgzLCJhc3luYyIpLEFtKCkpLDImZSYmRG0oInJ1bkFjdGl2ZSIsVGgoMSwzLG4ucnVuQWN0aXZlJCkpKCJzaWRlYmFyRXhwYW5kZWQiLFRoKDIsNSxuLnNpZGViYXJFeHBhbmRlZCQpKSgic2lkZWJhcldpZHRoIixUaCgzLDcsbi5zaWRlYmFyV2lkdGgkKSl9LGRpcmVjdGl2ZXM6W2lDdF0scGlwZXM6W3dNXSxlbmNhcHN1bGF0aW9uOjIsY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGFDdCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJucG1pLWVtYmVkZGluZ3MiLHRlbXBsYXRlOidcbiAgICA8ZW1iZWRkaW5ncy1jb21wb25lbnRcbiAgICAgIFtydW5BY3RpdmVdPSJydW5BY3RpdmUkIHwgYXN5bmMiXG4gICAgICBbc2lkZWJhckV4cGFuZGVkXT0ic2lkZWJhckV4cGFuZGVkJCB8IGFzeW5jIlxuICAgICAgW3NpZGViYXJXaWR0aF09InNpZGViYXJXaWR0aCQgfCBhc3luYyJcbiAgICAgICh0b2dnbGVTaWRlYmFyRXhwYW5kZWQpPSJvblRvZ2dsZVNpZGViYXJFeHBhbmRlZCgpIlxuICAgICAgKHJlc2l6ZVRyaWdnZXJlZCk9Im9uUmVzaXplVHJpZ2dlcmVkKCRldmVudCkiXG4gICAgICAocmVzaXplR3JhYmJlZCk9Im9uUmVzaXplR3JhYmJlZCgpIlxuICAgICAgKHJlc2l6ZVJlbGVhc2VkKT0ib25SZXNpemVSZWxlYXNlZCgpIlxuICAgID48L2VtYmVkZGluZ3MtY29tcG9uZW50PlxuICAnLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd31dfSksbnVsbCk7Y2xhc3MgZEN0e2NvbnN0cnVjdG9yKCl7dGhpcy5WaWV3QWN0aXZlPWVidH19ZEN0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxkQ3QpfSxkQ3QuybVjbXA9dG8oe3R5cGU6ZEN0LHNlbGVjdG9yczpbWyJucG1pLWNvbXBvbmVudCJdXSxpbnB1dHM6e3J1bnM6InJ1bnMiLGFjdGl2ZVZpZXc6ImFjdGl2ZVZpZXcifSxkZWNsczo0LHZhcnM6Mixjb25zdHM6W1sxLCJucG1pLWNvbnRhaW5lciJdLFs0LCJuZ0lmIiwibmdJZkVsc2UiXSxbImRhdGFBdmFpbGFibGUiLCIiXSxbNCwibmdJZiJdXSx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7aWYoMSZlJiYoUm0oMCwiZGl2IiwwKSxRcCgxLHJDdCwxLDAsIm5wbWktaW5hY3RpdmUtdmlldyIsMSksUXAoMixjQ3QsMiwyLCJuZy10ZW1wbGF0ZSIsbnVsbCwyLGliKSxBbSgpKSwyJmUpe2NvbnN0IHQ9JHAoMyk7cmMoMSksRG0oIm5nSWYiLDA9PT1uLnJ1bnMuc2l6ZSkoIm5nSWZFbHNlIix0KX19LGRpcmVjdGl2ZXM6W2RNLG9idCxRX3QsYUN0XSxzdHlsZXM6WyJbX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtoZWlnaHQ6MTAwJX0ubnBtaS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MSAxfSJdLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChkQ3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibnBtaS1jb21wb25lbnQiLHRlbXBsYXRlVXJsOiIuL25wbWlfY29tcG9uZW50Lm5nLmh0bWwiLHN0eWxlVXJsczpbIi4vbnBtaV9jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCx7cnVuczpbe3R5cGU6eHl9XSxhY3RpdmVWaWV3Olt7dHlwZTp4eX1dfSk7Y2xhc3MgcEN0e2NvbnN0cnVjdG9yKHQpe3RoaXMuc3RvcmU9dCx0aGlzLnJ1bnMkPXRoaXMuc3RvcmUucGlwZShGdyhOTikpLHRoaXMuYWN0aXZlVmlldyQ9dGhpcy5zdG9yZS5waXBlKEZ3KHZidCkpfW5nT25Jbml0KCl7dGhpcy5zdG9yZS5kaXNwYXRjaChrYnQoKSl9fXBDdC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8cEN0KShTbShJdykpfSxwQ3QuybVjbXA9dG8oe3R5cGU6cEN0LHNlbGVjdG9yczpbWyJucG1pIl1dLGRlY2xzOjMsdmFyczo2LGNvbnN0czpbWzMsInJ1bnMiLCJhY3RpdmVWaWV3Il1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihUbSgwLCJucG1pLWNvbXBvbmVudCIsMCksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpKSwyJmUmJkRtKCJydW5zIixUaCgxLDIsbi5ydW5zJCkpKCJhY3RpdmVWaWV3IixUaCgyLDQsbi5hY3RpdmVWaWV3JCkpfSxkaXJlY3RpdmVzOltkQ3RdLHBpcGVzOlt3TV0sZW5jYXBzdWxhdGlvbjoyfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChwQ3QsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoibnBtaSIsdGVtcGxhdGU6J1xuICAgIDxucG1pLWNvbXBvbmVudFxuICAgICAgW3J1bnNdPSJydW5zJCB8IGFzeW5jIlxuICAgICAgW2FjdGl2ZVZpZXddPSJhY3RpdmVWaWV3JCB8IGFzeW5jIlxuICAgID48L25wbWktY29tcG9uZW50PlxuICAnfV19XSwoZnVuY3Rpb24oKXtyZXR1cm5be3R5cGU6SXd9XX0pLG51bGwpO3ZhciBtQ3Q9e30sdUN0PXt9LGZDdD17fSxnQ3Q9e30saEN0PVF2JiZRdi5fX3ZhbHVlc3x8ZnVuY3Rpb24odCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdLG49MDtyZXR1cm4gZT9lLmNhbGwodCk6e25leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdCYmbj49dC5sZW5ndGgmJih0PXZvaWQgMCkse3ZhbHVlOnQmJnRbbisrXSxkb25lOiF0fX19fTtmdW5jdGlvbiBiQ3QodCxlKXtyZXR1cm4gTWF0aC5mbG9vcihlKCkqdCl9ZnVuY3Rpb24geUN0KHQpe2Zvcih2YXIgZT1bXSxuPTA7bjx0O24rKyllLnB1c2godm9pZCAwKTtyZXR1cm4gZX1mdW5jdGlvbiBfQ3QodCxlKXtyZXR1cm4geUN0KHQpLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm4gZX0pKX1mdW5jdGlvbiBDQ3QodCl7cmV0dXJuIF9DdCh0LDApfWZ1bmN0aW9uIE1DdCh0KXtyZXR1cm4gdC5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZX0pKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZ0N0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxnQ3QudGF1UmFuZEludD1iQ3QsZ0N0LnRhdVJhbmQ9ZnVuY3Rpb24gdkN0KHQpe3JldHVybiB0KCl9LGdDdC5ub3JtPWZ1bmN0aW9uIHhDdCh0KXt2YXIgZSxuLG89MDt0cnl7Zm9yKHZhciBpPWhDdCh0KSxhPWkubmV4dCgpOyFhLmRvbmU7YT1pLm5leHQoKSlvKz1NYXRoLnBvdyhhLnZhbHVlLDIpfWNhdGNoKHQpe2U9e2Vycm9yOnR9fWZpbmFsbHl7dHJ5e2EmJiFhLmRvbmUmJihuPWkucmV0dXJuKSYmbi5jYWxsKGkpfWZpbmFsbHl7aWYoZSl0aHJvdyBlLmVycm9yfX1yZXR1cm4gTWF0aC5zcXJ0KG8pfSxnQ3QuZW1wdHk9eUN0LGdDdC5yYW5nZT1mdW5jdGlvbiBPQ3QodCl7cmV0dXJuIHlDdCh0KS5tYXAoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV9KSl9LGdDdC5maWxsZWQ9X0N0LGdDdC56ZXJvcz1DQ3QsZ0N0Lm9uZXM9ZnVuY3Rpb24gUEN0KHQpe3JldHVybiBfQ3QodCwxKX0sZ0N0LmxpbmVhcj1mdW5jdGlvbiB3Q3QodCxlLG4pe3JldHVybiB5Q3QobikubWFwKChmdW5jdGlvbihvLGkpe3JldHVybiB0K2kqKChlLXQpLyhuLTEpKX0pKX0sZ0N0LnN1bT1NQ3QsZ0N0Lm1lYW49ZnVuY3Rpb24ga0N0KHQpe3JldHVybiBNQ3QodCkvdC5sZW5ndGh9LGdDdC5tYXg9ZnVuY3Rpb24gU0N0KHQpe2Zvcih2YXIgZT0wLG49MDtuPHQubGVuZ3RoO24rKyllPXRbbl0+ZT90W25dOmU7cmV0dXJuIGV9LGdDdC5tYXgyZD1mdW5jdGlvbiBEQ3QodCl7Zm9yKHZhciBlPTAsbj0wO248dC5sZW5ndGg7bisrKWZvcih2YXIgbz0wO288dFtuXS5sZW5ndGg7bysrKWU9dFtuXVtvXT5lP3Rbbl1bb106ZTtyZXR1cm4gZX0sZ0N0LnJlamVjdGlvblNhbXBsZT1mdW5jdGlvbiBFQ3QodCxlLG4pe2Zvcih2YXIgbz1DQ3QodCksaT0wO2k8dDtpKyspZm9yKHZhciBhPSEwO2E7KXtmb3IodmFyIHI9YkN0KGUsbikscz0hMSxsPTA7bDxpO2wrKylpZihyPT09b1tsXSl7cz0hMDticmVha31zfHwoYT0hMSksb1tpXT1yfXJldHVybiBvfSxnQ3QucmVzaGFwZTJkPWZ1bmN0aW9uIFJDdCh0LGUsbil7dmFyIG89W10saT0wO2lmKHQubGVuZ3RoIT09ZSpuKXRocm93IG5ldyBFcnJvcigiQXJyYXkgZGltZW5zaW9ucyBtdXN0IG1hdGNoIGlucHV0IGxlbmd0aC4iKTtmb3IodmFyIGE9MDthPGU7YSsrKXtmb3IodmFyIHI9W10scz0wO3M8bjtzKyspci5wdXNoKHRbaV0pLGkrPTE7by5wdXNoKHIpfXJldHVybiBvfTt2YXIgQUN0PVF2JiZRdi5fX2ltcG9ydFN0YXJ8fGZ1bmN0aW9uKHQpe2lmKHQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgZT17fTtpZihudWxsIT10KWZvcih2YXIgbiBpbiB0KU9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJihlW25dPXRbbl0pO3JldHVybiBlLmRlZmF1bHQ9dCxlfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZkN0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgVEN0PUFDdChnQ3QpO2Z1bmN0aW9uIE5DdCh0LGUpe3ZhciBuPWZ1bmN0aW9uKG4pe3JldHVybiBUQ3QuZW1wdHkodCkubWFwKChmdW5jdGlvbigpe3JldHVybiBUQ3QuZmlsbGVkKGUsbil9KSl9LG89W107cmV0dXJuIG8ucHVzaChuKC0xKSksby5wdXNoKG4oMS8wKSksby5wdXNoKG4oMCkpLG99ZnVuY3Rpb24gekN0KHQsZSxuLG8saSl7ZT1NYXRoLmZsb29yKGUpO3ZhciBhPXRbMF1bZV07aWYobj49dFsxXVtlXVswXSlyZXR1cm4gMDtmb3IodmFyIHI9MDtyPGEubGVuZ3RoO3IrKylpZihvPT09YVtyXSlyZXR1cm4gMDtyZXR1cm4gSUN0KHQsZSxuLG8saSl9ZnVuY3Rpb24gSUN0KHQsZSxuLG8saSl7dmFyIGE9dFswXVtlXSxyPXRbMV1bZV0scz10WzJdW2VdO2lmKG4+PXJbMF0pcmV0dXJuIDA7clswXT1uLGFbMF09byxzWzBdPWk7Zm9yKHZhciBsPTAsYz0wOzspe3ZhciBkPTIqbCsxLHA9ZCsxLG09dFswXVswXS5sZW5ndGg7aWYoZD49bSlicmVhaztpZihwPj1tKXtpZighKHJbZF0+bikpYnJlYWs7Yz1kfWVsc2UgaWYocltkXT49cltwXSl7aWYoIShuPHJbZF0pKWJyZWFrO2M9ZH1lbHNle2lmKCEobjxyW3BdKSlicmVhaztjPXB9cltsXT1yW2NdLGFbbF09YVtjXSxzW2xdPXNbY10sbD1jfXJldHVybiByW2xdPW4sYVtsXT1vLHNbbF09aSwxfWZ1bmN0aW9uIEhDdCh0LGUsbixvKXtmb3IoOzIqbysxPG47KXt2YXIgaT0yKm8rMSxhPWkrMSxyPW87aWYodFtyXTx0W2ldJiYocj1pKSxhPG4mJnRbcl08dFthXSYmKHI9YSkscj09PW8pYnJlYWs7dmFyIHM9dFtvXTt0W29dPXRbcl0sdFtyXT1zO3ZhciBsPWVbb107ZVtvXT1lW3JdLGVbcl09bCxvPXJ9fWZDdC5tYWtlSGVhcD1OQ3QsZkN0LnJlamVjdGlvblNhbXBsZT1mdW5jdGlvbiBGQ3QodCxlLG4pe2Zvcih2YXIgbz1UQ3QuemVyb3ModCksaT0wO2k8dDtpKyspe2Zvcih2YXIgYT0hMCxyPTA7YTspe3I9VEN0LnRhdVJhbmRJbnQoZSxuKTtmb3IodmFyIHM9ITEsbD0wO2w8aTtsKyspaWYocj09PW9bbF0pe3M9ITA7YnJlYWt9c3x8KGE9ITEpfW9baV09cn1yZXR1cm4gb30sZkN0LmhlYXBQdXNoPXpDdCxmQ3QudW5jaGVja2VkSGVhcFB1c2g9SUN0LGZDdC5idWlsZENhbmRpZGF0ZXM9ZnVuY3Rpb24gTEN0KHQsZSxuLG8saSl7Zm9yKHZhciBhPU5DdChlLG8pLHI9MDtyPGU7cisrKWZvcih2YXIgcz0wO3M8bjtzKyspaWYoISh0WzBdW3JdW3NdPDApKXt2YXIgbD10WzBdW3JdW3NdLGM9dFsyXVtyXVtzXSxkPVRDdC50YXVSYW5kKGkpO3pDdChhLHIsZCxsLGMpLHpDdChhLGwsZCxyLGMpLHRbMl1bcl1bc109MH1yZXR1cm4gYX0sZkN0LmRlaGVhcFNvcnQ9ZnVuY3Rpb24gQkN0KHQpe2Zvcih2YXIgZT10WzBdLG49dFsxXSxvPTA7bzxlLmxlbmd0aDtvKyspZm9yKHZhciBpPWVbb10sYT1uW29dLHI9MDtyPGkubGVuZ3RoLTE7cisrKXt2YXIgcz1pLmxlbmd0aC1yLTEsbD1hLmxlbmd0aC1yLTEsYz1pWzBdO2lbMF09aVtzXSxpW3NdPWM7dmFyIGQ9YVswXTthWzBdPWFbbF0sYVtsXT1kLEhDdChhLGksbCwwKX1yZXR1cm57aW5kaWNlczplLHdlaWdodHM6bn19LGZDdC5zbWFsbGVzdEZsYWdnZWQ9ZnVuY3Rpb24gVkN0KHQsZSl7Zm9yKHZhciBuPXRbMF1bZV0sbz10WzFdW2VdLGk9dFsyXVtlXSxhPTEvMCxyPS0xLHM9MDtzPm4ubGVuZ3RoO3MrKykxPT09aVtzXSYmb1tzXTxhJiYoYT1vW3NdLHI9cyk7cmV0dXJuIHI+PTA/KGlbcl09MCxNYXRoLmZsb29yKG5bcl0pKTotMX07dmFyIGpDdCxVQ3Q9e30sR0N0PVF2JiZRdi5fX3JlYWR8fGZ1bmN0aW9uKHQsZSl7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdO2lmKCFuKXJldHVybiB0O3ZhciBvLGksYT1uLmNhbGwodCkscj1bXTt0cnl7Zm9yKDsodm9pZCAwPT09ZXx8ZS0tID4wKSYmIShvPWEubmV4dCgpKS5kb25lOylyLnB1c2goby52YWx1ZSl9Y2F0Y2godCl7aT17ZXJyb3I6dH19ZmluYWxseXt0cnl7byYmIW8uZG9uZSYmKG49YS5yZXR1cm4pJiZuLmNhbGwoYSl9ZmluYWxseXtpZihpKXRocm93IGkuZXJyb3J9fXJldHVybiByfSxXQ3Q9UXYmJlF2Ll9fdmFsdWVzfHxmdW5jdGlvbih0KXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0W1N5bWJvbC5pdGVyYXRvcl0sbj0wO3JldHVybiBlP2UuY2FsbCh0KTp7bmV4dDpmdW5jdGlvbigpe3JldHVybiB0JiZuPj10Lmxlbmd0aCYmKHQ9dm9pZCAwKSx7dmFsdWU6dCYmdFtuKytdLGRvbmU6IXR9fX19LFlDdD1RdiYmUXYuX19pbXBvcnRTdGFyfHxmdW5jdGlvbih0KXtpZih0JiZ0Ll9fZXNNb2R1bGUpcmV0dXJuIHQ7dmFyIGU9e307aWYobnVsbCE9dClmb3IodmFyIG4gaW4gdClPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LG4pJiYoZVtuXT10W25dKTtyZXR1cm4gZS5kZWZhdWx0PXQsZX07T2JqZWN0LmRlZmluZVByb3BlcnR5KFVDdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHFDdD1ZQ3QoZ0N0KSxaQ3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbixvKXtpZih0aGlzLmVudHJpZXM9bmV3IE1hcCx0aGlzLm5Sb3dzPTAsdGhpcy5uQ29scz0wLHQubGVuZ3RoIT09ZS5sZW5ndGh8fHQubGVuZ3RoIT09bi5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJyb3dzLCBjb2xzIGFuZCB2YWx1ZXMgYXJyYXlzIG11c3QgYWxsIGhhdmUgdGhlIHNhbWUgbGVuZ3RoIik7dGhpcy5uUm93cz1vWzBdLHRoaXMubkNvbHM9b1sxXTtmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKyl7dmFyIGE9dFtpXSxyPWVbaV07dGhpcy5jaGVja0RpbXMoYSxyKTt2YXIgcz10aGlzLm1ha2VLZXkoYSxyKTt0aGlzLmVudHJpZXMuc2V0KHMse3ZhbHVlOm5baV0scm93OmEsY29sOnJ9KX19cmV0dXJuIHQucHJvdG90eXBlLm1ha2VLZXk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCsiOiIrZX0sdC5wcm90b3R5cGUuY2hlY2tEaW1zPWZ1bmN0aW9uKHQsZSl7aWYoISh0PHRoaXMublJvd3MmJmU8dGhpcy5uQ29scykpdGhyb3cgbmV3IEVycm9yKCJyb3cgYW5kL29yIGNvbCBzcGVjaWZpZWQgb3V0c2lkZSBvZiBtYXRyaXggZGltZW5zaW9ucyIpfSx0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlLG4pe3RoaXMuY2hlY2tEaW1zKHQsZSk7dmFyIG89dGhpcy5tYWtlS2V5KHQsZSk7dGhpcy5lbnRyaWVzLmhhcyhvKT90aGlzLmVudHJpZXMuZ2V0KG8pLnZhbHVlPW46dGhpcy5lbnRyaWVzLnNldChvLHt2YWx1ZTpuLHJvdzp0LGNvbDplfSl9LHQucHJvdG90eXBlLmdldD1mdW5jdGlvbih0LGUsbil7dm9pZCAwPT09biYmKG49MCksdGhpcy5jaGVja0RpbXModCxlKTt2YXIgbz10aGlzLm1ha2VLZXkodCxlKTtyZXR1cm4gdGhpcy5lbnRyaWVzLmhhcyhvKT90aGlzLmVudHJpZXMuZ2V0KG8pLnZhbHVlOm59LHQucHJvdG90eXBlLmdldEFsbD1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD0hMCk7dmFyIGU9W107cmV0dXJuIHRoaXMuZW50cmllcy5mb3JFYWNoKChmdW5jdGlvbih0KXtlLnB1c2godCl9KSksdCYmZS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiB0LnJvdz09PWUucm93P3QuY29sLWUuY29sOnQucm93LWUucm93fSkpLGV9LHQucHJvdG90eXBlLmdldERpbXM9ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy5uUm93cyx0aGlzLm5Db2xzXX0sdC5wcm90b3R5cGUuZ2V0Um93cz1mdW5jdGlvbigpe3JldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcywoZnVuY3Rpb24odCl7cmV0dXJuIEdDdCh0LDIpWzFdLnJvd30pKX0sdC5wcm90b3R5cGUuZ2V0Q29scz1mdW5jdGlvbigpe3JldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcywoZnVuY3Rpb24odCl7cmV0dXJuIEdDdCh0LDIpWzFdLmNvbH0pKX0sdC5wcm90b3R5cGUuZ2V0VmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLChmdW5jdGlvbih0KXtyZXR1cm4gR0N0KHQsMilbMV0udmFsdWV9KSl9LHQucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCl7dGhpcy5lbnRyaWVzLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JldHVybiB0KGUudmFsdWUsZS5yb3csZS5jb2wpfSkpfSx0LnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24oZSl7dmFyIG49W107dGhpcy5lbnRyaWVzLmZvckVhY2goKGZ1bmN0aW9uKHQpe24ucHVzaChlKHQudmFsdWUsdC5yb3csdC5jb2wpKX0pKTt2YXIgbz1bdGhpcy5uUm93cyx0aGlzLm5Db2xzXTtyZXR1cm4gbmV3IHQodGhpcy5nZXRSb3dzKCksdGhpcy5nZXRDb2xzKCksbixvKX0sdC5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1xQ3QuZW1wdHkodGhpcy5uUm93cykubWFwKChmdW5jdGlvbigpe3JldHVybiBxQ3QuemVyb3ModC5uQ29scyl9KSk7cmV0dXJuIHRoaXMuZW50cmllcy5mb3JFYWNoKChmdW5jdGlvbih0KXtlW3Qucm93XVt0LmNvbF09dC52YWx1ZX0pKSxlfSx0fSkoKTtVQ3QuU3BhcnNlTWF0cml4PVpDdCxVQ3QudHJhbnNwb3NlPWZ1bmN0aW9uIFhDdCh0KXt2YXIgZT1bXSxuPVtdLG89W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxpLGEpe2UucHVzaChpKSxuLnB1c2goYSksby5wdXNoKHQpfSkpLG5ldyBaQ3QobixlLG8sW3QubkNvbHMsdC5uUm93c10pfSxVQ3QuaWRlbnRpdHk9ZnVuY3Rpb24gS0N0KHQpe2Zvcih2YXIgZT1HQ3QodCwxKVswXSxuPW5ldyBaQ3QoW10sW10sW10sdCksbz0wO288ZTtvKyspbi5zZXQobyxvLDEpO3JldHVybiBufSxVQ3QucGFpcndpc2VNdWx0aXBseT1mdW5jdGlvbiBKQ3QodCxlKXtyZXR1cm4gYU10KHQsZSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCplfSkpfSxVQ3QuYWRkPWZ1bmN0aW9uIFFDdCh0LGUpe3JldHVybiBhTXQodCxlLChmdW5jdGlvbih0LGUpe3JldHVybiB0K2V9KSl9LFVDdC5zdWJ0cmFjdD1mdW5jdGlvbiAkQ3QodCxlKXtyZXR1cm4gYU10KHQsZSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC1lfSkpfSxVQ3QubWF4aW11bT1mdW5jdGlvbiB0TXQodCxlKXtyZXR1cm4gYU10KHQsZSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gdD5lP3Q6ZX0pKX0sVUN0Lm11bHRpcGx5U2NhbGFyPWZ1bmN0aW9uIGVNdCh0LGUpe3JldHVybiB0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQqZX0pKX0sVUN0LmVsaW1pbmF0ZVplcm9zPWZ1bmN0aW9uIG5NdCh0KXtmb3IodmFyIGU9bmV3IFNldCxuPXQuZ2V0VmFsdWVzKCksbz10LmdldFJvd3MoKSxpPXQuZ2V0Q29scygpLGE9MDthPG4ubGVuZ3RoO2ErKykwPT09blthXSYmZS5hZGQoYSk7dmFyIHI9ZnVuY3Rpb24odCxuKXtyZXR1cm4hZS5oYXMobil9LHM9bi5maWx0ZXIociksbD1vLmZpbHRlcihyKSxjPWkuZmlsdGVyKHIpO3JldHVybiBuZXcgWkN0KGwsYyxzLHQuZ2V0RGltcygpKX0sVUN0Lm5vcm1hbGl6ZT1mdW5jdGlvbiBvTXQodCxlKXt2YXIgbixvO3ZvaWQgMD09PWUmJihlPSJsMiIpO3ZhciBpPWlNdFtlXSxhPW5ldyBNYXA7dC5mb3JFYWNoKChmdW5jdGlvbih0LGUsbil7dmFyIG89YS5nZXQoZSl8fFtdO28ucHVzaChuKSxhLnNldChlLG8pfSkpO3ZhciByPW5ldyBaQ3QoW10sW10sW10sdC5nZXREaW1zKCkpLHM9ZnVuY3Rpb24oZSl7Zm9yKHZhciBuPWEuZ2V0KGUpLnNvcnQoKSxvPW4ubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gdC5nZXQoZSxuKX0pKSxzPWkobyksbD0wO2w8cy5sZW5ndGg7bCsrKXIuc2V0KGUsbltsXSxzW2xdKX07dHJ5e2Zvcih2YXIgbD1XQ3QoYS5rZXlzKCkpLGM9bC5uZXh0KCk7IWMuZG9uZTtjPWwubmV4dCgpKXMoYy52YWx1ZSl9Y2F0Y2godCl7bj17ZXJyb3I6dH19ZmluYWxseXt0cnl7YyYmIWMuZG9uZSYmKG89bC5yZXR1cm4pJiZvLmNhbGwobCl9ZmluYWxseXtpZihuKXRocm93IG4uZXJyb3J9fXJldHVybiByfTt2YXIgaU10PSgoakN0PXt9KS5tYXg9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPS0xLzAsbj0wO248dC5sZW5ndGg7bisrKWU9dFtuXT5lP3Rbbl06ZTtyZXR1cm4gdC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0L2V9KSl9LGpDdC5sMT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPTA7bjx0Lmxlbmd0aDtuKyspZSs9dFtuXTtyZXR1cm4gdC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0L2V9KSl9LGpDdC5sMj1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPTA7bjx0Lmxlbmd0aDtuKyspZSs9TWF0aC5wb3codFtuXSwyKTtyZXR1cm4gdC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3codCwyKS9lKX0pKX0sakN0KTtmdW5jdGlvbiBhTXQodCxlLG4pe2Zvcih2YXIgbz1uZXcgU2V0LGk9W10sYT1bXSxyPVtdLHM9ZnVuY3Rpb24obyxzKXtpLnB1c2gobyksYS5wdXNoKHMpO3ZhciBsPW4odC5nZXQobyxzKSxlLmdldChvLHMpKTtyLnB1c2gobCl9LGw9dC5nZXRWYWx1ZXMoKSxjPXQuZ2V0Um93cygpLGQ9dC5nZXRDb2xzKCkscD0wO3A8bC5sZW5ndGg7cCsrKW8uYWRkKChnPWNbcF0pKyI6IisoaD1kW3BdKSkscyhnLGgpO3ZhciBtPWUuZ2V0VmFsdWVzKCksdT1lLmdldFJvd3MoKSxmPWUuZ2V0Q29scygpO2ZvcihwPTA7cDxtLmxlbmd0aDtwKyspe3ZhciBnLGg7by5oYXMoKGc9dVtwXSkrIjoiKyhoPWZbcF0pKXx8cyhnLGgpfXJldHVybiBuZXcgWkN0KGksYSxyLFt0Lm5Sb3dzLHQubkNvbHNdKX1VQ3QuZ2V0Q1NSPWZ1bmN0aW9uIHJNdCh0KXt2YXIgZT1bXTt0LmZvckVhY2goKGZ1bmN0aW9uKHQsbixvKXtlLnB1c2goe3ZhbHVlOnQscm93Om4sY29sOm99KX0pKSxlLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQucm93PT09ZS5yb3c/dC5jb2wtZS5jb2w6dC5yb3ctZS5yb3d9KSk7Zm9yKHZhciBuPVtdLG89W10saT1bXSxhPS0xLHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIHM9ZVtyXSxsPXMucm93LGM9cy5jb2wsZD1zLnZhbHVlO2whPT1hJiYoYT1sLGkucHVzaChyKSksbi5wdXNoKGMpLG8ucHVzaChkKX1yZXR1cm57aW5kaWNlczpuLHZhbHVlczpvLGluZHB0cjppfX07dmFyIHNNdD17fSxsTXQ9e30sY010PVF2JiZRdi5fX3JlYWR8fGZ1bmN0aW9uKHQsZSl7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdO2lmKCFuKXJldHVybiB0O3ZhciBvLGksYT1uLmNhbGwodCkscj1bXTt0cnl7Zm9yKDsodm9pZCAwPT09ZXx8ZS0tID4wKSYmIShvPWEubmV4dCgpKS5kb25lOylyLnB1c2goby52YWx1ZSl9Y2F0Y2godCl7aT17ZXJyb3I6dH19ZmluYWxseXt0cnl7byYmIW8uZG9uZSYmKG49YS5yZXR1cm4pJiZuLmNhbGwoYSl9ZmluYWxseXtpZihpKXRocm93IGkuZXJyb3J9fXJldHVybiByfSxkTXQ9UXYmJlF2Ll9fc3ByZWFkfHxmdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0PXQuY29uY2F0KGNNdChhcmd1bWVudHNbZV0pKTtyZXR1cm4gdH0scE10PVF2JiZRdi5fX3ZhbHVlc3x8ZnVuY3Rpb24odCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdFtTeW1ib2wuaXRlcmF0b3JdLG49MDtyZXR1cm4gZT9lLmNhbGwodCk6e25leHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdCYmbj49dC5sZW5ndGgmJih0PXZvaWQgMCkse3ZhbHVlOnQmJnRbbisrXSxkb25lOiF0fX19fSxtTXQ9UXYmJlF2Ll9faW1wb3J0U3Rhcnx8ZnVuY3Rpb24odCl7aWYodCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBlPXt9O2lmKG51bGwhPXQpZm9yKHZhciBuIGluIHQpT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGVbbl09dFtuXSk7cmV0dXJuIGUuZGVmYXVsdD10LGV9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShsTXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB1TXQsZk10PW1NdChnQ3QpO2Z1bmN0aW9uIGdNdCh0LGUsbixvLGkpe2lmKHZvaWQgMD09PW4mJihuPTMwKSxlLmxlbmd0aD5uKXt2YXIgYT0oZnVuY3Rpb24gcih0LGUsbil7Zm9yKHZhciBvPXRbMF0ubGVuZ3RoLGk9Zk10LnRhdVJhbmRJbnQoZS5sZW5ndGgsbiksYT1mTXQudGF1UmFuZEludChlLmxlbmd0aCxuKSxyPWVbaV0scz1lW2E9KGErPWk9PT1hPzE6MCklZS5sZW5ndGhdLGw9MCxjPWZNdC56ZXJvcyhvKSxkPTA7ZDxjLmxlbmd0aDtkKyspY1tkXT10W3JdW2RdLXRbc11bZF0sbC09Y1tkXSoodFtyXVtkXSt0W3NdW2RdKS8yO3ZhciBwPTAsbT0wLHU9Zk10Lnplcm9zKGUubGVuZ3RoKTtmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCsrKXtmb3IodmFyIGY9bCxnPTA7ZzxvO2crKylmKz1jW2ddKnRbZVtkXV1bZ107MD09PWY/KHVbZF09Zk10LnRhdVJhbmRJbnQoMixuKSwwPT09dVtkXT9wKz0xOm0rPTEpOmY+MD8odVtkXT0wLHArPTEpOih1W2RdPTEsbSs9MSl9dmFyIGg9Zk10Lnplcm9zKHApLGI9Zk10Lnplcm9zKG0pO2ZvcihwPTAsbT0wLGQ9MDtkPHUubGVuZ3RoO2QrKykwPT09dVtkXT8oaFtwXT1lW2RdLHArPTEpOihiW21dPWVbZF0sbSs9MSk7cmV0dXJue2luZGljZXNMZWZ0OmgsaW5kaWNlc1JpZ2h0OmIsaHlwZXJwbGFuZTpjLG9mZnNldDpsfX0pKHQsZSxpKSxzPWEuaW5kaWNlc1JpZ2h0LGw9YS5oeXBlcnBsYW5lLGM9YS5vZmZzZXQ7cmV0dXJue2xlZnRDaGlsZDpnTXQodCxhLmluZGljZXNMZWZ0LG4sbysxLGkpLHJpZ2h0Q2hpbGQ6Z010KHQscyxuLG8rMSxpKSxpc0xlYWY6ITEsaHlwZXJwbGFuZTpsLG9mZnNldDpjfX1yZXR1cm57aW5kaWNlczplLGlzTGVhZjohMH19ZnVuY3Rpb24gaE10KHQsZSxuLG8saSxhLHIpe3ZhciBzO2lmKHQuaXNMZWFmKXJldHVybiBvW2FdWzBdPS1yLChzPWlbcl0pLnNwbGljZS5hcHBseShzLGRNdChbMCx0LmluZGljZXMubGVuZ3RoXSx0LmluZGljZXMpKSx7bm9kZU51bTphLGxlYWZOdW06cis9MX07ZVthXT10Lmh5cGVycGxhbmUsblthXT10Lm9mZnNldCxvW2FdWzBdPWErMTt2YXIgbD1hLGM9aE10KHQubGVmdENoaWxkLGUsbixvLGksYSsxLHIpO3JldHVybiByPWMubGVhZk51bSxvW2xdWzFdPShhPWMubm9kZU51bSkrMSx7bm9kZU51bTooYz1oTXQodC5yaWdodENoaWxkLGUsbixvLGksYSsxLHIpKS5ub2RlTnVtLGxlYWZOdW06Yy5sZWFmTnVtfX1mdW5jdGlvbiBiTXQodCl7cmV0dXJuIHQuaXNMZWFmPzE6MStiTXQodC5sZWZ0Q2hpbGQpK2JNdCh0LnJpZ2h0Q2hpbGQpfWZ1bmN0aW9uIHlNdCh0KXtyZXR1cm4gdC5pc0xlYWY/MTp5TXQodC5sZWZ0Q2hpbGQpK3lNdCh0LnJpZ2h0Q2hpbGQpfWZ1bmN0aW9uIF9NdCh0LGUsbixvKXtmb3IodmFyIGk9ZSxhPTA7YTxuLmxlbmd0aDthKyspaSs9dFthXSpuW2FdO3JldHVybiAwPT09aT9mTXQudGF1UmFuZEludCgyLG8pOmk+MD8wOjF9bE10LkZsYXRUcmVlPXVNdD1mdW5jdGlvbiB1TXQodCxlLG4sbyl7dGhpcy5oeXBlcnBsYW5lcz10LHRoaXMub2Zmc2V0cz1lLHRoaXMuY2hpbGRyZW49bix0aGlzLmluZGljZXM9b30sbE10Lm1ha2VGb3Jlc3Q9ZnVuY3Rpb24gQ010KHQsZSxuLG8pe3ZhciBpPU1hdGgubWF4KDEwLGUpO3JldHVybiBmTXQucmFuZ2UobikubWFwKChmdW5jdGlvbihlLG4pe3JldHVybihmdW5jdGlvbiBhKHQsZSxuLG8pe3JldHVybiB2b2lkIDA9PT1lJiYoZT0zMCksZ010KHQsZk10LnJhbmdlKHQubGVuZ3RoKSxlLG4sbyl9KSh0LGksbixvKX0pKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybihmdW5jdGlvbiBlKHQsbil7dmFyIG89Yk10KHQpLGk9eU10KHQpLGE9Zk10LnJhbmdlKG8pLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm4gZk10Lnplcm9zKHQuaHlwZXJwbGFuZT90Lmh5cGVycGxhbmUubGVuZ3RoOjApfSkpLHI9Zk10Lnplcm9zKG8pLHM9Zk10LnJhbmdlKG8pLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm5bLTEsLTFdfSkpLGw9Zk10LnJhbmdlKGkpLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm4gZk10LnJhbmdlKG4pLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm4tMX0pKX0pKTtyZXR1cm4gaE10KHQsYSxyLHMsbCwwLDApLG5ldyB1TXQoYSxyLHMsbCl9KSh0LGkpfSkpfSxsTXQubWFrZUxlYWZBcnJheT1mdW5jdGlvbiBNTXQodCl7dmFyIGUsbjtpZih0Lmxlbmd0aD4wKXt2YXIgbz1bXTt0cnl7Zm9yKHZhciBpPXBNdCh0KSxhPWkubmV4dCgpOyFhLmRvbmU7YT1pLm5leHQoKSlvLnB1c2guYXBwbHkobyxkTXQoYS52YWx1ZS5pbmRpY2VzKSl9Y2F0Y2godCl7ZT17ZXJyb3I6dH19ZmluYWxseXt0cnl7YSYmIWEuZG9uZSYmKG49aS5yZXR1cm4pJiZuLmNhbGwoaSl9ZmluYWxseXtpZihlKXRocm93IGUuZXJyb3J9fXJldHVybiBvfXJldHVybltbLTFdXX0sbE10LnNlYXJjaEZsYXRUcmVlPWZ1bmN0aW9uIHZNdCh0LGUsbil7Zm9yKHZhciBvPTA7ZS5jaGlsZHJlbltvXVswXT4wOylvPTA9PT1fTXQoZS5oeXBlcnBsYW5lc1tvXSxlLm9mZnNldHNbb10sdCxuKT9lLmNoaWxkcmVuW29dWzBdOmUuY2hpbGRyZW5bb11bMV07cmV0dXJuIGUuaW5kaWNlc1stMSplLmNoaWxkcmVuW29dWzBdXX07dmFyIHhNdD1RdiYmUXYuX192YWx1ZXN8fGZ1bmN0aW9uKHQpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnRbU3ltYm9sLml0ZXJhdG9yXSxuPTA7cmV0dXJuIGU/ZS5jYWxsKHQpOntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIHQmJm4+PXQubGVuZ3RoJiYodD12b2lkIDApLHt2YWx1ZTp0JiZ0W24rK10sZG9uZTohdH19fX0sT010PVF2JiZRdi5fX2ltcG9ydFN0YXJ8fGZ1bmN0aW9uKHQpe2lmKHQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgZT17fTtpZihudWxsIT10KWZvcih2YXIgbiBpbiB0KU9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJihlW25dPXRbbl0pO3JldHVybiBlLmRlZmF1bHQ9dCxlfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoc010LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgUE10PU9NdChmQ3QpLHdNdD1PTXQoVUN0KSxrTXQ9T010KGxNdCksU010PU9NdChnQ3QpO3NNdC5tYWtlTk5EZXNjZW50PWZ1bmN0aW9uIERNdCh0LGUpe3JldHVybiBmdW5jdGlvbiBuKG8saSxhLHIscyxsLGMsZCl7dm9pZCAwPT09ciYmKHI9MTApLHZvaWQgMD09PXMmJihzPTUwKSx2b2lkIDA9PT1sJiYobD0uMDAxKSx2b2lkIDA9PT1jJiYoYz0uNSksdm9pZCAwPT09ZCYmKGQ9ITApO2Zvcih2YXIgcD1vLmxlbmd0aCxtPVBNdC5tYWtlSGVhcChvLmxlbmd0aCxhKSx1PTA7dTxvLmxlbmd0aDt1KyspZm9yKHZhciBmPVBNdC5yZWplY3Rpb25TYW1wbGUoYSxvLmxlbmd0aCxlKSxnPTA7ZzxmLmxlbmd0aDtnKyspe3ZhciBoPXQob1t1XSxvW2ZbZ11dKTtQTXQuaGVhcFB1c2gobSx1LGgsZltnXSwxKSxQTXQuaGVhcFB1c2gobSxmW2ddLGgsdSwxKX1pZihkKWZvcih2YXIgYj0wO2I8aS5sZW5ndGg7YisrKWZvcih1PTA7dTxpW2JdLmxlbmd0aCYmIShpW2JdW3VdPDApO3UrKylmb3IoZz11KzE7ZzxpW2JdLmxlbmd0aCYmIShpW2JdW2ddPDApO2crKyloPXQob1tpW2JdW3VdXSxvW2lbYl1bZ11dKSxQTXQuaGVhcFB1c2gobSxpW2JdW3VdLGgsaVtiXVtnXSwxKSxQTXQuaGVhcFB1c2gobSxpW2JdW2ddLGgsaVtiXVt1XSwxKTtmb3IoYj0wO2I8cjtiKyspe3ZhciB5PVBNdC5idWlsZENhbmRpZGF0ZXMobSxwLGEscyxlKSxfPTA7Zm9yKHU9MDt1PHA7dSsrKWZvcihnPTA7ZzxzO2crKyl7dmFyIEM9TWF0aC5mbG9vcih5WzBdW3VdW2ddKTtpZighKEM8MHx8U010LnRhdVJhbmQoZSk8YykpZm9yKHZhciBNPTA7TTxzO00rKyl7dmFyIHY9TWF0aC5mbG9vcih5WzBdW3VdW01dKTt2PDB8fCF5WzJdW3VdW2ddJiYheVsyXVt1XVtNXXx8KGg9dChvW0NdLG9bdl0pLF8rPVBNdC5oZWFwUHVzaChtLEMsaCx2LDEpLF8rPVBNdC5oZWFwUHVzaChtLHYsaCxDLDEpKX19aWYoXzw9bCphKm8ubGVuZ3RoKWJyZWFrfXJldHVybiBQTXQuZGVoZWFwU29ydChtKX19LHNNdC5tYWtlSW5pdGlhbGl6YXRpb25zPWZ1bmN0aW9uIEVNdCh0KXtyZXR1cm57aW5pdEZyb21SYW5kb206ZnVuY3Rpb24gZShuLG8saSxhLHIpe2Zvcih2YXIgcz0wO3M8aS5sZW5ndGg7cysrKWZvcih2YXIgbD1TTXQucmVqZWN0aW9uU2FtcGxlKG4sby5sZW5ndGgsciksYz0wO2M8bC5sZW5ndGg7YysrKWlmKCEobFtjXTwwKSl7dmFyIGQ9dChvW2xbY11dLGlbc10pO1BNdC5oZWFwUHVzaChhLHMsZCxsW2NdLDEpfX0saW5pdEZyb21UcmVlOmZ1bmN0aW9uIG4oZSxvLGksYSxyKXtmb3IodmFyIHM9MDtzPGkubGVuZ3RoO3MrKylmb3IodmFyIGw9a010LnNlYXJjaEZsYXRUcmVlKGlbc10sZSxyKSxjPTA7YzxsLmxlbmd0aDtjKyspe2lmKGxbY108MClyZXR1cm47dmFyIGQ9dChvW2xbY11dLGlbc10pO1BNdC5oZWFwUHVzaChhLHMsZCxsW2NdLDEpfX19fSxzTXQubWFrZUluaXRpYWxpemVkTk5TZWFyY2g9ZnVuY3Rpb24gUk10KHQpe3JldHVybiBmdW5jdGlvbiBlKG4sbyxpLGEpe2Zvcih2YXIgcixzLGw9d010LmdldENTUihvKSxjPWwuaW5kaWNlcyxkPWwuaW5kcHRyLHA9MDtwPGEubGVuZ3RoO3ArKylmb3IodmFyIG09bmV3IFNldChpWzBdW3BdKTs7KXt2YXIgdT1QTXQuc21hbGxlc3RGbGFnZ2VkKGkscCk7aWYoLTE9PT11KWJyZWFrO3ZhciBmPWMuc2xpY2UoZFt1XSxkW3UrMV0pO3RyeXtmb3IodmFyIGc9eE10KGYpLGg9Zy5uZXh0KCk7IWguZG9uZTtoPWcubmV4dCgpKXt2YXIgYj1oLnZhbHVlO2lmKGIhPT11JiYtMSE9PWImJiFtLmhhcyhiKSl7dmFyIHk9dChuW2JdLGFbcF0pO1BNdC51bmNoZWNrZWRIZWFwUHVzaChpLHAseSxiLDEpLG0uYWRkKGIpfX19Y2F0Y2godCl7cj17ZXJyb3I6dH19ZmluYWxseXt0cnl7aCYmIWguZG9uZSYmKHM9Zy5yZXR1cm4pJiZzLmNhbGwoZyl9ZmluYWxseXtpZihyKXRocm93IHIuZXJyb3J9fX1yZXR1cm4gaX19LHNNdC5pbml0aWFsaXplU2VhcmNoPWZ1bmN0aW9uIEFNdCh0LGUsbixvLGksYSxyKXt2YXIgcyxsLGM9UE10Lm1ha2VIZWFwKG4ubGVuZ3RoLG8pO2lmKGkobyxlLG4sYyxyKSx0KXRyeXtmb3IodmFyIGQ9eE10KHQpLHA9ZC5uZXh0KCk7IXAuZG9uZTtwPWQubmV4dCgpKWEocC52YWx1ZSxlLG4sYyxyKX1jYXRjaCh0KXtzPXtlcnJvcjp0fX1maW5hbGx5e3RyeXtwJiYhcC5kb25lJiYobD1kLnJldHVybikmJmwuY2FsbChkKX1maW5hbGx5e2lmKHMpdGhyb3cgcy5lcnJvcn19cmV0dXJuIGN9O2NvbnN0IFRNdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIE5NdCh0KXtyZXR1cm4gVE10LmNhbGwodCkuZW5kc1dpdGgoIkFycmF5XSIpfWZ1bmN0aW9uIHpNdCh0LGUsbil7bGV0IG89MDtjb25zdCBpPW4oZSk7Zm9yKGxldCBlPTA7ZTx0LngubGVuZ3RoO2UrKylvKz1NYXRoLmFicyh0LnlbZV0taSh0LnhbZV0pKTtyZXR1cm4gb31jb25zdCBJTXQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBITXQodCl7cmV0dXJuIElNdC5jYWxsKHQpLmVuZHNXaXRoKCJBcnJheV0iKX1mdW5jdGlvbiBGTXQodCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCFITXQodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBiZSBhbiBhcnJheSIpO2lmKDA9PT10Lmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJpbnB1dCBtdXN0IG5vdCBiZSBlbXB0eSIpO3ZhciBuPWUuZnJvbUluZGV4LG89dm9pZCAwPT09bj8wOm4saT1lLnRvSW5kZXgsYT12b2lkIDA9PT1pP3QubGVuZ3RoOmk7aWYobzwwfHxvPj10Lmxlbmd0aHx8IU51bWJlci5pc0ludGVnZXIobykpdGhyb3cgbmV3IEVycm9yKCJmcm9tSW5kZXggbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgc21hbGxlciB0aGFuIGxlbmd0aCIpO2lmKGE8PW98fGE+dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKGEpKXRocm93IG5ldyBFcnJvcigidG9JbmRleCBtdXN0IGJlIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIGZyb21JbmRleCBhbmQgYXQgbW9zdCBlcXVhbCB0byBsZW5ndGgiKTtmb3IodmFyIHI9dFtvXSxzPW8rMTtzPGE7cysrKXRbc10+ciYmKHI9dFtzXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gTE10KHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZighSE10KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTt2YXIgbj1lLmZyb21JbmRleCxvPXZvaWQgMD09PW4/MDpuLGk9ZS50b0luZGV4LGE9dm9pZCAwPT09aT90Lmxlbmd0aDppO2lmKG88MHx8bz49dC5sZW5ndGh8fCFOdW1iZXIuaXNJbnRlZ2VyKG8pKXRocm93IG5ldyBFcnJvcigiZnJvbUluZGV4IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIHNtYWxsZXIgdGhhbiBsZW5ndGgiKTtpZihhPD1vfHxhPnQubGVuZ3RofHwhTnVtYmVyLmlzSW50ZWdlcihhKSl0aHJvdyBuZXcgRXJyb3IoInRvSW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBmcm9tSW5kZXggYW5kIGF0IG1vc3QgZXF1YWwgdG8gbGVuZ3RoIik7Zm9yKHZhciByPXRbb10scz1vKzE7czxhO3MrKyl0W3NdPHImJihyPXRbc10pO3JldHVybiByfWZ1bmN0aW9uIEJNdCh0KXt2YXIgZSxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZighSE10KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoImlucHV0IG11c3QgYmUgYW4gYXJyYXkiKTtpZigwPT09dC5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiaW5wdXQgbXVzdCBub3QgYmUgZW1wdHkiKTtpZih2b2lkIDAhPT1uLm91dHB1dCl7aWYoIUhNdChuLm91dHB1dCkpdGhyb3cgbmV3IFR5cGVFcnJvcigib3V0cHV0IG9wdGlvbiBtdXN0IGJlIGFuIGFycmF5IGlmIHNwZWNpZmllZCIpO2U9bi5vdXRwdXR9ZWxzZSBlPW5ldyBBcnJheSh0Lmxlbmd0aCk7dmFyIG89TE10KHQpLGk9Rk10KHQpO2lmKG89PT1pKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW5pbXVtIGFuZCBtYXhpbXVtIGlucHV0IHZhbHVlcyBhcmUgZXF1YWwuIENhbm5vdCByZXNjYWxlIGEgY29uc3RhbnQgYXJyYXkiKTt2YXIgYT1uLm1pbixyPXZvaWQgMD09PWE/bi5hdXRvTWluTWF4P286MDphLHM9bi5tYXgsbD12b2lkIDA9PT1zP24uYXV0b01pbk1heD9pOjE6cztpZihyPj1sKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gb3B0aW9uIG11c3QgYmUgc21hbGxlciB0aGFuIG1heCBvcHRpb24iKTtmb3IodmFyIGM9KGwtcikvKGktbyksZD0wO2Q8dC5sZW5ndGg7ZCsrKWVbZF09KHRbZF0tbykqYytyO3JldHVybiBlfWNvbnN0IFZNdD0iICIucmVwZWF0KDIpLGpNdD0iICIucmVwZWF0KDQpO2Z1bmN0aW9uIFVNdCh0LGU9e30pe2NvbnN0e21heFJvd3M6bj0xNSxtYXhDb2x1bW5zOm89MTAsbWF4TnVtU2l6ZTppPTh9PWU7cmV0dXJuYCR7dC5jb25zdHJ1Y3Rvci5uYW1lfSB7XG4ke1ZNdH1bXG4ke2pNdH0keyhmdW5jdGlvbiBhKHQsZSxuLG8pe2NvbnN0e3Jvd3M6aSxjb2x1bW5zOmF9PXQscj1NYXRoLm1pbihpLGUpLHM9TWF0aC5taW4oYSxuKSxsPVtdO2ZvcihsZXQgZT0wO2U8cjtlKyspe2xldCBuPVtdO2ZvcihsZXQgaT0wO2k8cztpKyspbi5wdXNoKEdNdCh0LmdldChlLGkpLG8pKTtsLnB1c2goYCR7bi5qb2luKCIgIil9YCl9cmV0dXJuIHMhPT1hJiYobFtsLmxlbmd0aC0xXSs9YCAuLi4gJHthLW59IG1vcmUgY29sdW1uc2ApLHIhPT1pJiZsLnB1c2goYC4uLiAke2ktZX0gbW9yZSByb3dzYCksbC5qb2luKGBcbiR7ak10fWApfSkodCxuLG8saSl9XG4ke1ZNdH1dXG4ke1ZNdH1yb3dzOiAke3Qucm93c31cbiR7Vk10fWNvbHVtbnM6ICR7dC5jb2x1bW5zfVxufWB9ZnVuY3Rpb24gR010KHQsZSl7Y29uc3Qgbj1TdHJpbmcodCk7aWYobi5sZW5ndGg8PWUpcmV0dXJuIG4ucGFkRW5kKGUsIiAiKTtjb25zdCBvPXQudG9QcmVjaXNpb24oZS0yKTtpZihvLmxlbmd0aDw9ZSlyZXR1cm4gbztjb25zdCBpPXQudG9FeHBvbmVudGlhbChlLTIpLGE9aS5pbmRleE9mKCJlIikscj1pLnNsaWNlKGEpO3JldHVybiBpLnNsaWNlKDAsZS1yLmxlbmd0aCkrcn1mdW5jdGlvbiBXTXQodCxlLG4pe2lmKGU8MHx8ZT4obj90LnJvd3M6dC5yb3dzLTEpKXRocm93IG5ldyBSYW5nZUVycm9yKCJSb3cgaW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gWU10KHQsZSxuKXtpZihlPDB8fGU+KG4/dC5jb2x1bW5zOnQuY29sdW1ucy0xKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQ29sdW1uIGluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIHFNdCh0LGUpe2lmKGUudG8xREFycmF5JiYoZT1lLnRvMURBcnJheSgpKSxlLmxlbmd0aCE9PXQuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9yIHNpemUgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMiKTtyZXR1cm4gZX1mdW5jdGlvbiBaTXQodCxlKXtpZihlLnRvMURBcnJheSYmKGU9ZS50bzFEQXJyYXkoKSksZS5sZW5ndGghPT10LnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInZlY3RvciBzaXplIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiByb3dzIik7cmV0dXJuIGV9ZnVuY3Rpb24gWE10KHQsZSl7aWYoIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoInVuZXhwZWN0ZWQgdHlwZSBmb3Igcm93IGluZGljZXMiKTtpZihlLnNvbWUoKGU9PmU8MHx8ZT49dC5yb3dzKSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInJvdyBpbmRpY2VzIGFyZSBvdXQgb2YgcmFuZ2UiKTtyZXR1cm4gQXJyYXkuaXNBcnJheShlKXx8KGU9QXJyYXkuZnJvbShlKSksZX1mdW5jdGlvbiBLTXQodCxlKXtpZigib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigidW5leHBlY3RlZCB0eXBlIGZvciBjb2x1bW4gaW5kaWNlcyIpO2lmKGUuc29tZSgoZT0+ZTwwfHxlPj10LmNvbHVtbnMpKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiY29sdW1uIGluZGljZXMgYXJlIG91dCBvZiByYW5nZSIpO3JldHVybiBBcnJheS5pc0FycmF5KGUpfHwoZT1BcnJheS5mcm9tKGUpKSxlfWZ1bmN0aW9uIEpNdCh0LGUsbixvLGkpe2lmKDUhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJleHBlY3RlZCA0IGFyZ3VtZW50cyIpO2lmKCRNdCgic3RhcnRSb3ciLGUpLCRNdCgiZW5kUm93IixuKSwkTXQoInN0YXJ0Q29sdW1uIixvKSwkTXQoImVuZENvbHVtbiIsaSksZT5ufHxvPml8fGU8MHx8ZT49dC5yb3dzfHxuPDB8fG4+PXQucm93c3x8bzwwfHxvPj10LmNvbHVtbnN8fGk8MHx8aT49dC5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJTdWJtYXRyaXggaW5kaWNlcyBhcmUgb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gUU10KHQsZT0wKXtsZXQgbj1bXTtmb3IobGV0IG89MDtvPHQ7bysrKW4ucHVzaChlKTtyZXR1cm4gbn1mdW5jdGlvbiAkTXQodCxlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0fSBtdXN0IGJlIGEgbnVtYmVyYCl9ZnVuY3Rpb24gdHZ0KHQpe2lmKHQuaXNFbXB0eSgpKXRocm93IG5ldyBFcnJvcigiRW1wdHkgbWF0cml4IGhhcyBubyBlbGVtZW50cyB0byBpbmRleCIpfWNsYXNzIGV2dHtzdGF0aWMgZnJvbTFEQXJyYXkodCxlLG4pe2lmKHQqZSE9PW4ubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJkYXRhIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBnaXZlbiBkaW1lbnNpb25zIik7bGV0IG89bmV3IGl2dCh0LGUpO2ZvcihsZXQgaT0wO2k8dDtpKyspZm9yKGxldCB0PTA7dDxlO3QrKylvLnNldChpLHQsbltpKmUrdF0pO3JldHVybiBvfXN0YXRpYyByb3dWZWN0b3IodCl7bGV0IGU9bmV3IGl2dCgxLHQubGVuZ3RoKTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyllLnNldCgwLG4sdFtuXSk7cmV0dXJuIGV9c3RhdGljIGNvbHVtblZlY3Rvcih0KXtsZXQgZT1uZXcgaXZ0KHQubGVuZ3RoLDEpO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKWUuc2V0KG4sMCx0W25dKTtyZXR1cm4gZX1zdGF0aWMgemVyb3ModCxlKXtyZXR1cm4gbmV3IGl2dCh0LGUpfXN0YXRpYyBvbmVzKHQsZSl7cmV0dXJuIG5ldyBpdnQodCxlKS5maWxsKDEpfXN0YXRpYyByYW5kKHQsZSxuPXt9KXtpZigib2JqZWN0IiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2NvbnN0e3JhbmRvbTpvPU1hdGgucmFuZG9tfT1uO2xldCBpPW5ldyBpdnQodCxlKTtmb3IobGV0IG49MDtuPHQ7bisrKWZvcihsZXQgdD0wO3Q8ZTt0KyspaS5zZXQobix0LG8oKSk7cmV0dXJuIGl9c3RhdGljIHJhbmRJbnQodCxlLG49e30pe2lmKCJvYmplY3QiIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7bWluOm89MCxtYXg6aT0xZTMscmFuZG9tOmE9TWF0aC5yYW5kb219PW47aWYoIU51bWJlci5pc0ludGVnZXIobykpdGhyb3cgbmV3IFR5cGVFcnJvcigibWluIG11c3QgYmUgYW4gaW50ZWdlciIpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKGkpKXRocm93IG5ldyBUeXBlRXJyb3IoIm1heCBtdXN0IGJlIGFuIGludGVnZXIiKTtpZihvPj1pKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IHI9aS1vLHM9bmV3IGl2dCh0LGUpO2ZvcihsZXQgbj0wO248dDtuKyspZm9yKGxldCB0PTA7dDxlO3QrKyl7bGV0IGU9bytNYXRoLnJvdW5kKGEoKSpyKTtzLnNldChuLHQsZSl9cmV0dXJuIHN9c3RhdGljIGV5ZSh0LGUsbil7dm9pZCAwPT09ZSYmKGU9dCksdm9pZCAwPT09biYmKG49MSk7bGV0IG89TWF0aC5taW4odCxlKSxpPXRoaXMuemVyb3ModCxlKTtmb3IobGV0IHQ9MDt0PG87dCsrKWkuc2V0KHQsdCxuKTtyZXR1cm4gaX1zdGF0aWMgZGlhZyh0LGUsbil7bGV0IG89dC5sZW5ndGg7dm9pZCAwPT09ZSYmKGU9byksdm9pZCAwPT09biYmKG49ZSk7bGV0IGk9TWF0aC5taW4obyxlLG4pLGE9dGhpcy56ZXJvcyhlLG4pO2ZvcihsZXQgZT0wO2U8aTtlKyspYS5zZXQoZSxlLHRbZV0pO3JldHVybiBhfXN0YXRpYyBtaW4odCxlKXt0PXRoaXMuY2hlY2tNYXRyaXgodCksZT10aGlzLmNoZWNrTWF0cml4KGUpO2xldCBuPXQucm93cyxvPXQuY29sdW1ucyxpPW5ldyBpdnQobixvKTtmb3IobGV0IGE9MDthPG47YSsrKWZvcihsZXQgbj0wO248bztuKyspaS5zZXQoYSxuLE1hdGgubWluKHQuZ2V0KGEsbiksZS5nZXQoYSxuKSkpO3JldHVybiBpfXN0YXRpYyBtYXgodCxlKXt0PXRoaXMuY2hlY2tNYXRyaXgodCksZT10aGlzLmNoZWNrTWF0cml4KGUpO2xldCBuPXQucm93cyxvPXQuY29sdW1ucyxpPW5ldyB0aGlzKG4sbyk7Zm9yKGxldCBhPTA7YTxuO2ErKylmb3IobGV0IG49MDtuPG87bisrKWkuc2V0KGEsbixNYXRoLm1heCh0LmdldChhLG4pLGUuZ2V0KGEsbikpKTtyZXR1cm4gaX1zdGF0aWMgY2hlY2tNYXRyaXgodCl7cmV0dXJuIGV2dC5pc01hdHJpeCh0KT90Om5ldyBpdnQodCl9c3RhdGljIGlzTWF0cml4KHQpe3JldHVybiBudWxsIT10JiYiTWF0cml4Ij09PXQua2xhc3N9Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy5yb3dzKnRoaXMuY29sdW1uc31hcHBseSh0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24iKTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXQuY2FsbCh0aGlzLGUsbik7cmV0dXJuIHRoaXN9dG8xREFycmF5KCl7bGV0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0LnB1c2godGhpcy5nZXQoZSxuKSk7cmV0dXJuIHR9dG8yREFycmF5KCl7bGV0IHQ9W107Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKXt0LnB1c2goW10pO2ZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0W2VdLnB1c2godGhpcy5nZXQoZSxuKSl9cmV0dXJuIHR9dG9KU09OKCl7cmV0dXJuIHRoaXMudG8yREFycmF5KCl9aXNSb3dWZWN0b3IoKXtyZXR1cm4gMT09PXRoaXMucm93c31pc0NvbHVtblZlY3Rvcigpe3JldHVybiAxPT09dGhpcy5jb2x1bW5zfWlzVmVjdG9yKCl7cmV0dXJuIDE9PT10aGlzLnJvd3N8fDE9PT10aGlzLmNvbHVtbnN9aXNTcXVhcmUoKXtyZXR1cm4gdGhpcy5yb3dzPT09dGhpcy5jb2x1bW5zfWlzRW1wdHkoKXtyZXR1cm4gMD09PXRoaXMucm93c3x8MD09PXRoaXMuY29sdW1uc31pc1N5bW1ldHJpYygpe2lmKHRoaXMuaXNTcXVhcmUoKSl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8PXQ7ZSsrKWlmKHRoaXMuZ2V0KHQsZSkhPT10aGlzLmdldChlLHQpKXJldHVybiExO3JldHVybiEwfXJldHVybiExfWlzRWNoZWxvbkZvcm0oKXtsZXQgdD0wLGU9MCxuPS0xLG89ITAsaT0hMTtmb3IoO3Q8dGhpcy5yb3dzJiZvOyl7Zm9yKGU9MCxpPSExO2U8dGhpcy5jb2x1bW5zJiYhMT09PWk7KTA9PT10aGlzLmdldCh0LGUpP2UrKzoxPT09dGhpcy5nZXQodCxlKSYmZT5uPyhpPSEwLG49ZSk6KG89ITEsaT0hMCk7dCsrfXJldHVybiBvfWlzUmVkdWNlZEVjaGVsb25Gb3JtKCl7bGV0IHQ9MCxlPTAsbj0tMSxvPSEwLGk9ITE7Zm9yKDt0PHRoaXMucm93cyYmbzspe2ZvcihlPTAsaT0hMTtlPHRoaXMuY29sdW1ucyYmITE9PT1pOykwPT09dGhpcy5nZXQodCxlKT9lKys6MT09PXRoaXMuZ2V0KHQsZSkmJmU+bj8oaT0hMCxuPWUpOihvPSExLGk9ITApO2ZvcihsZXQgbj1lKzE7bjx0aGlzLnJvd3M7bisrKTAhPT10aGlzLmdldCh0LG4pJiYobz0hMSk7dCsrfXJldHVybiBvfWVjaGVsb25Gb3JtKCl7bGV0IHQ9dGhpcy5jbG9uZSgpLGU9MCxuPTA7Zm9yKDtlPHQucm93cyYmbjx0LmNvbHVtbnM7KXtsZXQgbz1lO2ZvcihsZXQgaT1lO2k8dC5yb3dzO2krKyl0LmdldChpLG4pPnQuZ2V0KG8sbikmJihvPWkpO2lmKDA9PT10LmdldChvLG4pKW4rKztlbHNle3Quc3dhcFJvd3MoZSxvKTtsZXQgaT10LmdldChlLG4pO2ZvcihsZXQgbz1uO288dC5jb2x1bW5zO28rKyl0LnNldChlLG8sdC5nZXQoZSxvKS9pKTtmb3IobGV0IG89ZSsxO288dC5yb3dzO28rKyl7bGV0IGk9dC5nZXQobyxuKS90LmdldChlLG4pO3Quc2V0KG8sbiwwKTtmb3IobGV0IGE9bisxO2E8dC5jb2x1bW5zO2ErKyl0LnNldChvLGEsdC5nZXQobyxhKS10LmdldChlLGEpKmkpfWUrKyxuKyt9fXJldHVybiB0fXJlZHVjZWRFY2hlbG9uRm9ybSgpe2xldCB0PXRoaXMuZWNoZWxvbkZvcm0oKSxlPXQuY29sdW1ucyxuPXQucm93cyxvPW4tMTtmb3IoO28+PTA7KWlmKDA9PT10Lm1heFJvdyhvKSlvLS07ZWxzZXtsZXQgaT0wLGE9ITE7Zm9yKDtpPG4mJiExPT09YTspMT09PXQuZ2V0KG8saSk/YT0hMDppKys7Zm9yKGxldCBuPTA7bjxvO24rKyl7bGV0IGE9dC5nZXQobixpKTtmb3IobGV0IHI9aTtyPGU7cisrKXtsZXQgZT10LmdldChuLHIpLWEqdC5nZXQobyxyKTt0LnNldChuLHIsZSl9fW8tLX1yZXR1cm4gdH1zZXQoKXt0aHJvdyBuZXcgRXJyb3IoInNldCBtZXRob2QgaXMgdW5pbXBsZW1lbnRlZCIpfWdldCgpe3Rocm93IG5ldyBFcnJvcigiZ2V0IG1ldGhvZCBpcyB1bmltcGxlbWVudGVkIil9cmVwZWF0KHQ9e30pe2lmKCJvYmplY3QiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Y29uc3R7cm93czplPTEsY29sdW1uczpuPTF9PXQ7aWYoIU51bWJlci5pc0ludGVnZXIoZSl8fGU8PTApdGhyb3cgbmV3IFR5cGVFcnJvcigicm93cyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIpO2lmKCFOdW1iZXIuaXNJbnRlZ2VyKG4pfHxuPD0wKXRocm93IG5ldyBUeXBlRXJyb3IoImNvbHVtbnMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiKTtsZXQgbz1uZXcgaXZ0KHRoaXMucm93cyplLHRoaXMuY29sdW1ucypuKTtmb3IobGV0IHQ9MDt0PGU7dCsrKWZvcihsZXQgZT0wO2U8bjtlKyspby5zZXRTdWJNYXRyaXgodGhpcyx0aGlzLnJvd3MqdCx0aGlzLmNvbHVtbnMqZSk7cmV0dXJuIG99ZmlsbCh0KXtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KGUsbix0KTtyZXR1cm4gdGhpc31uZWcoKXtyZXR1cm4gdGhpcy5tdWxTKC0xKX1nZXRSb3codCl7V010KHRoaXMsdCk7bGV0IGU9W107Zm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKWUucHVzaCh0aGlzLmdldCh0LG4pKTtyZXR1cm4gZX1nZXRSb3dWZWN0b3IodCl7cmV0dXJuIGl2dC5yb3dWZWN0b3IodGhpcy5nZXRSb3codCkpfXNldFJvdyh0LGUpe1dNdCh0aGlzLHQpLGU9cU10KHRoaXMsZSk7Zm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KHQsbixlW25dKTtyZXR1cm4gdGhpc31zd2FwUm93cyh0LGUpe1dNdCh0aGlzLHQpLFdNdCh0aGlzLGUpO2ZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl7bGV0IG89dGhpcy5nZXQodCxuKTt0aGlzLnNldCh0LG4sdGhpcy5nZXQoZSxuKSksdGhpcy5zZXQoZSxuLG8pfXJldHVybiB0aGlzfWdldENvbHVtbih0KXtZTXQodGhpcyx0KTtsZXQgZT1bXTtmb3IobGV0IG49MDtuPHRoaXMucm93cztuKyspZS5wdXNoKHRoaXMuZ2V0KG4sdCkpO3JldHVybiBlfWdldENvbHVtblZlY3Rvcih0KXtyZXR1cm4gaXZ0LmNvbHVtblZlY3Rvcih0aGlzLmdldENvbHVtbih0KSl9c2V0Q29sdW1uKHQsZSl7WU10KHRoaXMsdCksZT1aTXQodGhpcyxlKTtmb3IobGV0IG49MDtuPHRoaXMucm93cztuKyspdGhpcy5zZXQobix0LGVbbl0pO3JldHVybiB0aGlzfXN3YXBDb2x1bW5zKHQsZSl7WU10KHRoaXMsdCksWU10KHRoaXMsZSk7Zm9yKGxldCBuPTA7bjx0aGlzLnJvd3M7bisrKXtsZXQgbz10aGlzLmdldChuLHQpO3RoaXMuc2V0KG4sdCx0aGlzLmdldChuLGUpKSx0aGlzLnNldChuLGUsbyl9cmV0dXJuIHRoaXN9YWRkUm93VmVjdG9yKHQpe3Q9cU10KHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldChlLG4sdGhpcy5nZXQoZSxuKSt0W25dKTtyZXR1cm4gdGhpc31zdWJSb3dWZWN0b3IodCl7dD1xTXQodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KGUsbix0aGlzLmdldChlLG4pLXRbbl0pO3JldHVybiB0aGlzfW11bFJvd1ZlY3Rvcih0KXt0PXFNdCh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQoZSxuLHRoaXMuZ2V0KGUsbikqdFtuXSk7cmV0dXJuIHRoaXN9ZGl2Um93VmVjdG9yKHQpe3Q9cU10KHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldChlLG4sdGhpcy5nZXQoZSxuKS90W25dKTtyZXR1cm4gdGhpc31hZGRDb2x1bW5WZWN0b3IodCl7dD1aTXQodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KGUsbix0aGlzLmdldChlLG4pK3RbZV0pO3JldHVybiB0aGlzfXN1YkNvbHVtblZlY3Rvcih0KXt0PVpNdCh0aGlzLHQpO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQoZSxuLHRoaXMuZ2V0KGUsbiktdFtlXSk7cmV0dXJuIHRoaXN9bXVsQ29sdW1uVmVjdG9yKHQpe3Q9Wk10KHRoaXMsdCk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldChlLG4sdGhpcy5nZXQoZSxuKSp0W2VdKTtyZXR1cm4gdGhpc31kaXZDb2x1bW5WZWN0b3IodCl7dD1aTXQodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KGUsbix0aGlzLmdldChlLG4pL3RbZV0pO3JldHVybiB0aGlzfW11bFJvdyh0LGUpe1dNdCh0aGlzLHQpO2ZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldCh0LG4sdGhpcy5nZXQodCxuKSplKTtyZXR1cm4gdGhpc31tdWxDb2x1bW4odCxlKXtZTXQodGhpcyx0KTtmb3IobGV0IG49MDtuPHRoaXMucm93cztuKyspdGhpcy5zZXQobix0LHRoaXMuZ2V0KG4sdCkqZSk7cmV0dXJuIHRoaXN9bWF4KCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgdD10aGlzLmdldCgwLDApO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5nZXQoZSxuKT50JiYodD10aGlzLmdldChlLG4pKTtyZXR1cm4gdH1tYXhJbmRleCgpe3R2dCh0aGlzKTtsZXQgdD10aGlzLmdldCgwLDApLGU9WzAsMF07Zm9yKGxldCBuPTA7bjx0aGlzLnJvd3M7bisrKWZvcihsZXQgbz0wO288dGhpcy5jb2x1bW5zO28rKyl0aGlzLmdldChuLG8pPnQmJih0PXRoaXMuZ2V0KG4sbyksZVswXT1uLGVbMV09byk7cmV0dXJuIGV9bWluKCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgdD10aGlzLmdldCgwLDApO2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5nZXQoZSxuKTx0JiYodD10aGlzLmdldChlLG4pKTtyZXR1cm4gdH1taW5JbmRleCgpe3R2dCh0aGlzKTtsZXQgdD10aGlzLmdldCgwLDApLGU9WzAsMF07Zm9yKGxldCBuPTA7bjx0aGlzLnJvd3M7bisrKWZvcihsZXQgbz0wO288dGhpcy5jb2x1bW5zO28rKyl0aGlzLmdldChuLG8pPHQmJih0PXRoaXMuZ2V0KG4sbyksZVswXT1uLGVbMV09byk7cmV0dXJuIGV9bWF4Um93KHQpe2lmKFdNdCh0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQodCwwKTtmb3IobGV0IG49MTtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5nZXQodCxuKT5lJiYoZT10aGlzLmdldCh0LG4pKTtyZXR1cm4gZX1tYXhSb3dJbmRleCh0KXtXTXQodGhpcyx0KSx0dnQodGhpcyk7bGV0IGU9dGhpcy5nZXQodCwwKSxuPVt0LDBdO2ZvcihsZXQgbz0xO288dGhpcy5jb2x1bW5zO28rKyl0aGlzLmdldCh0LG8pPmUmJihlPXRoaXMuZ2V0KHQsbyksblsxXT1vKTtyZXR1cm4gbn1taW5Sb3codCl7aWYoV010KHRoaXMsdCksdGhpcy5pc0VtcHR5KCkpcmV0dXJuIE5hTjtsZXQgZT10aGlzLmdldCh0LDApO2ZvcihsZXQgbj0xO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLmdldCh0LG4pPGUmJihlPXRoaXMuZ2V0KHQsbikpO3JldHVybiBlfW1pblJvd0luZGV4KHQpe1dNdCh0aGlzLHQpLHR2dCh0aGlzKTtsZXQgZT10aGlzLmdldCh0LDApLG49W3QsMF07Zm9yKGxldCBvPTE7bzx0aGlzLmNvbHVtbnM7bysrKXRoaXMuZ2V0KHQsbyk8ZSYmKGU9dGhpcy5nZXQodCxvKSxuWzFdPW8pO3JldHVybiBufW1heENvbHVtbih0KXtpZihZTXQodGhpcyx0KSx0aGlzLmlzRW1wdHkoKSlyZXR1cm4gTmFOO2xldCBlPXRoaXMuZ2V0KDAsdCk7Zm9yKGxldCBuPTE7bjx0aGlzLnJvd3M7bisrKXRoaXMuZ2V0KG4sdCk+ZSYmKGU9dGhpcy5nZXQobix0KSk7cmV0dXJuIGV9bWF4Q29sdW1uSW5kZXgodCl7WU10KHRoaXMsdCksdHZ0KHRoaXMpO2xldCBlPXRoaXMuZ2V0KDAsdCksbj1bMCx0XTtmb3IobGV0IG89MTtvPHRoaXMucm93cztvKyspdGhpcy5nZXQobyx0KT5lJiYoZT10aGlzLmdldChvLHQpLG5bMF09byk7cmV0dXJuIG59bWluQ29sdW1uKHQpe2lmKFlNdCh0aGlzLHQpLHRoaXMuaXNFbXB0eSgpKXJldHVybiBOYU47bGV0IGU9dGhpcy5nZXQoMCx0KTtmb3IobGV0IG49MTtuPHRoaXMucm93cztuKyspdGhpcy5nZXQobix0KTxlJiYoZT10aGlzLmdldChuLHQpKTtyZXR1cm4gZX1taW5Db2x1bW5JbmRleCh0KXtZTXQodGhpcyx0KSx0dnQodGhpcyk7bGV0IGU9dGhpcy5nZXQoMCx0KSxuPVswLHRdO2ZvcihsZXQgbz0xO288dGhpcy5yb3dzO28rKyl0aGlzLmdldChvLHQpPGUmJihlPXRoaXMuZ2V0KG8sdCksblswXT1vKTtyZXR1cm4gbn1kaWFnKCl7bGV0IHQ9TWF0aC5taW4odGhpcy5yb3dzLHRoaXMuY29sdW1ucyksZT1bXTtmb3IobGV0IG49MDtuPHQ7bisrKWUucHVzaCh0aGlzLmdldChuLG4pKTtyZXR1cm4gZX1ub3JtKHQ9ImZyb2Jlbml1cyIpe2xldCBlPTA7aWYoIm1heCI9PT10KXJldHVybiB0aGlzLm1heCgpO2lmKCJmcm9iZW5pdXMiPT09dCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyllKz10aGlzLmdldCh0LG4pKnRoaXMuZ2V0KHQsbik7cmV0dXJuIE1hdGguc3FydChlKX10aHJvdyBuZXcgUmFuZ2VFcnJvcihgdW5rbm93biBub3JtIHR5cGU6ICR7dH1gKX1jdW11bGF0aXZlU3VtKCl7bGV0IHQ9MDtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXQrPXRoaXMuZ2V0KGUsbiksdGhpcy5zZXQoZSxuLHQpO3JldHVybiB0aGlzfWRvdCh0KXtldnQuaXNNYXRyaXgodCkmJih0PXQudG8xREFycmF5KCkpO2xldCBlPXRoaXMudG8xREFycmF5KCk7aWYoZS5sZW5ndGghPT10Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidmVjdG9ycyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBzaXplIik7bGV0IG49MDtmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rKyluKz1lW29dKnRbb107cmV0dXJuIG59bW11bCh0KXt0PWl2dC5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLnJvd3Msbj10aGlzLmNvbHVtbnMsbz10LmNvbHVtbnMsaT1uZXcgaXZ0KGUsbyksYT1uZXcgRmxvYXQ2NEFycmF5KG4pO2ZvcihsZXQgcj0wO3I8bztyKyspe2ZvcihsZXQgZT0wO2U8bjtlKyspYVtlXT10LmdldChlLHIpO2ZvcihsZXQgdD0wO3Q8ZTt0Kyspe2xldCBlPTA7Zm9yKGxldCBvPTA7bzxuO28rKyllKz10aGlzLmdldCh0LG8pKmFbb107aS5zZXQodCxyLGUpfX1yZXR1cm4gaX1zdHJhc3NlbjJ4Mih0KXt0PWl2dC5jaGVja01hdHJpeCh0KTtsZXQgZT1uZXcgaXZ0KDIsMik7Y29uc3Qgbj10aGlzLmdldCgwLDApLG89dC5nZXQoMCwwKSxpPXRoaXMuZ2V0KDAsMSksYT10LmdldCgwLDEpLHI9dGhpcy5nZXQoMSwwKSxzPXQuZ2V0KDEsMCksbD10aGlzLmdldCgxLDEpLGM9dC5nZXQoMSwxKSxkPShuK2wpKihvK2MpLHA9KHIrbCkqbyxtPW4qKGEtYyksdT1sKihzLW8pLGY9KG4raSkqYyxnPW0rZixoPXArdSxiPWQtcCttKyhyLW4pKihvK2EpO3JldHVybiBlLnNldCgwLDAsZCt1LWYrKGktbCkqKHMrYykpLGUuc2V0KDAsMSxnKSxlLnNldCgxLDAsaCksZS5zZXQoMSwxLGIpLGV9c3RyYXNzZW4zeDModCl7dD1pdnQuY2hlY2tNYXRyaXgodCk7bGV0IGU9bmV3IGl2dCgzLDMpO2NvbnN0IG49dGhpcy5nZXQoMCwwKSxvPXRoaXMuZ2V0KDAsMSksaT10aGlzLmdldCgwLDIpLGE9dGhpcy5nZXQoMSwwKSxyPXRoaXMuZ2V0KDEsMSkscz10aGlzLmdldCgxLDIpLGw9dGhpcy5nZXQoMiwwKSxjPXRoaXMuZ2V0KDIsMSksZD10aGlzLmdldCgyLDIpLHA9dC5nZXQoMCwwKSxtPXQuZ2V0KDAsMSksdT10LmdldCgwLDIpLGY9dC5nZXQoMSwwKSxnPXQuZ2V0KDEsMSksaD10LmdldCgxLDIpLGI9dC5nZXQoMiwwKSx5PXQuZ2V0KDIsMSksXz10LmdldCgyLDIpLEM9KG4tYSkqKC1tK2cpLE09KC1uK2ErcikqKHAtbStnKSx2PShhK3IpKigtcCttKSx4PW4qcCxPPSgtbitsK2MpKihwLXUraCksUD0oLW4rbCkqKHUtaCksdz0obCtjKSooLXArdSksaz0oLWkrYytkKSooZytiLXkpLFM9KGktZCkqKGcteSksRD1pKmIsRT0oYytkKSooLWIreSksUj0oLWkrcitzKSooaCtiLV8pLEE9KGktcykqKGgtXyksVD0ocitzKSooLWIrXyksTj0obitvK2ktYS1yLWMtZCkqZytNK3YreCtrK0QrRSx6PXgrTyt3KyhuK28raS1yLXMtbC1jKSpoK0QrUitULEk9QytyKigtcCttK2YtZy1oLWIrXykrTSt4K0QrUitBLEg9QytNK3YreCtzKnksRj1EK1IrQStUK2EqdSxMPXgrTytQK2MqKC1wK3UrZi1nLWgtYit5KStrK1MrRCxCPWsrUytEK0UrbCptLFY9eCtPK1ArdytkKl87cmV0dXJuIGUuc2V0KDAsMCx4K0QrbypmKSxlLnNldCgwLDEsTiksZS5zZXQoMCwyLHopLGUuc2V0KDEsMCxJKSxlLnNldCgxLDEsSCksZS5zZXQoMSwyLEYpLGUuc2V0KDIsMCxMKSxlLnNldCgyLDEsQiksZS5zZXQoMiwyLFYpLGV9bW11bFN0cmFzc2VuKHQpe3Q9aXZ0LmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMuY2xvbmUoKSxuPWUucm93cyxvPWUuY29sdW1ucyxpPXQucm93cyxhPXQuY29sdW1ucztmdW5jdGlvbiByKHQsZSxuKXtpZih0LnJvd3M9PT1lJiZ0LmNvbHVtbnM9PT1uKXJldHVybiB0O3tsZXQgbz1ldnQuemVyb3MoZSxuKTtyZXR1cm4gbz1vLnNldFN1Yk1hdHJpeCh0LDAsMCksb319byE9PWkmJmNvbnNvbGUud2FybihgTXVsdGlwbHlpbmcgJHtufSB4ICR7b30gYW5kICR7aX0geCAke2F9IG1hdHJpeDogZGltZW5zaW9ucyBkbyBub3QgbWF0Y2guYCk7bGV0IHM9TWF0aC5tYXgobixpKSxsPU1hdGgubWF4KG8sYSk7cmV0dXJuIGU9cihlLHMsbCksKGZ1bmN0aW9uIHQoZSxuLG8saSl7aWYobzw9NTEyfHxpPD01MTIpcmV0dXJuIGUubW11bChuKTtvJTI9PTEmJmklMj09MT8oZT1yKGUsbysxLGkrMSksbj1yKG4sbysxLGkrMSkpOm8lMj09MT8oZT1yKGUsbysxLGkpLG49cihuLG8rMSxpKSk6aSUyPT0xJiYoZT1yKGUsbyxpKzEpLG49cihuLG8saSsxKSk7bGV0IGE9cGFyc2VJbnQoZS5yb3dzLzIsMTApLHM9cGFyc2VJbnQoZS5jb2x1bW5zLzIsMTApLGw9ZS5zdWJNYXRyaXgoMCxhLTEsMCxzLTEpLGM9bi5zdWJNYXRyaXgoMCxhLTEsMCxzLTEpLGQ9ZS5zdWJNYXRyaXgoMCxhLTEscyxlLmNvbHVtbnMtMSkscD1uLnN1Yk1hdHJpeCgwLGEtMSxzLG4uY29sdW1ucy0xKSxtPWUuc3ViTWF0cml4KGEsZS5yb3dzLTEsMCxzLTEpLHU9bi5zdWJNYXRyaXgoYSxuLnJvd3MtMSwwLHMtMSksZj1lLnN1Yk1hdHJpeChhLGUucm93cy0xLHMsZS5jb2x1bW5zLTEpLGc9bi5zdWJNYXRyaXgoYSxuLnJvd3MtMSxzLG4uY29sdW1ucy0xKSxoPXQoZXZ0LmFkZChsLGYpLGV2dC5hZGQoYyxnKSxhLHMpLGI9dChldnQuYWRkKG0sZiksYyxhLHMpLHk9dChsLGV2dC5zdWIocCxnKSxhLHMpLF89dChmLGV2dC5zdWIodSxjKSxhLHMpLEM9dChldnQuYWRkKGwsZCksZyxhLHMpLE09dChldnQuc3ViKG0sbCksZXZ0LmFkZChjLHApLGEscyksdj10KGV2dC5zdWIoZCxmKSxldnQuYWRkKHUsZyksYSxzKSx4PWV2dC5hZGQoaCxfKTt4LnN1YihDKSx4LmFkZCh2KTtsZXQgTz1ldnQuYWRkKHksQyksUD1ldnQuYWRkKGIsXyksdz1ldnQuc3ViKGgsYik7dy5hZGQoeSksdy5hZGQoTSk7bGV0IGs9ZXZ0Lnplcm9zKDIqeC5yb3dzLDIqeC5jb2x1bW5zKTtyZXR1cm4gaz1rLnNldFN1Yk1hdHJpeCh4LDAsMCksaz1rLnNldFN1Yk1hdHJpeChPLHgucm93cywwKSxrPWsuc2V0U3ViTWF0cml4KFAsMCx4LmNvbHVtbnMpLGs9ay5zZXRTdWJNYXRyaXgodyx4LnJvd3MseC5jb2x1bW5zKSxrLnN1Yk1hdHJpeCgwLG8tMSwwLGktMSl9KShlLHQ9cih0LHMsbCkscyxsKX1zY2FsZVJvd3ModD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46ZT0wLG1heDpuPTF9PXQ7aWYoIU51bWJlci5pc0Zpbml0ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhIG51bWJlciIpO2lmKCFOdW1iZXIuaXNGaW5pdGUobikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYSBudW1iZXIiKTtpZihlPj1uKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IG89bmV3IGl2dCh0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKTtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0Kyspe2NvbnN0IGk9dGhpcy5nZXRSb3codCk7aS5sZW5ndGg+MCYmQk10KGkse21pbjplLG1heDpuLG91dHB1dDppfSksby5zZXRSb3codCxpKX1yZXR1cm4gb31zY2FsZUNvbHVtbnModD17fSl7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHttaW46ZT0wLG1heDpuPTF9PXQ7aWYoIU51bWJlci5pc0Zpbml0ZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJtaW4gbXVzdCBiZSBhIG51bWJlciIpO2lmKCFOdW1iZXIuaXNGaW5pdGUobikpdGhyb3cgbmV3IFR5cGVFcnJvcigibWF4IG11c3QgYmUgYSBudW1iZXIiKTtpZihlPj1uKXRocm93IG5ldyBSYW5nZUVycm9yKCJtaW4gbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4Iik7bGV0IG89bmV3IGl2dCh0aGlzLnJvd3MsdGhpcy5jb2x1bW5zKTtmb3IobGV0IHQ9MDt0PHRoaXMuY29sdW1uczt0Kyspe2NvbnN0IGk9dGhpcy5nZXRDb2x1bW4odCk7aS5sZW5ndGgmJkJNdChpLHttaW46ZSxtYXg6bixvdXRwdXQ6aX0pLG8uc2V0Q29sdW1uKHQsaSl9cmV0dXJuIG99ZmxpcFJvd3MoKXtjb25zdCB0PU1hdGguY2VpbCh0aGlzLmNvbHVtbnMvMik7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgbj0wO248dDtuKyspe2xldCB0PXRoaXMuZ2V0KGUsbiksbz10aGlzLmdldChlLHRoaXMuY29sdW1ucy0xLW4pO3RoaXMuc2V0KGUsbixvKSx0aGlzLnNldChlLHRoaXMuY29sdW1ucy0xLW4sdCl9cmV0dXJuIHRoaXN9ZmxpcENvbHVtbnMoKXtjb25zdCB0PU1hdGguY2VpbCh0aGlzLnJvd3MvMik7Zm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKWZvcihsZXQgbj0wO248dDtuKyspe2xldCB0PXRoaXMuZ2V0KG4sZSksbz10aGlzLmdldCh0aGlzLnJvd3MtMS1uLGUpO3RoaXMuc2V0KG4sZSxvKSx0aGlzLnNldCh0aGlzLnJvd3MtMS1uLGUsdCl9cmV0dXJuIHRoaXN9a3JvbmVja2VyUHJvZHVjdCh0KXt0PWl2dC5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLnJvd3Msbj10aGlzLmNvbHVtbnMsbz10LnJvd3MsaT10LmNvbHVtbnMsYT1uZXcgaXZ0KGUqbyxuKmkpO2ZvcihsZXQgcj0wO3I8ZTtyKyspZm9yKGxldCBlPTA7ZTxuO2UrKylmb3IobGV0IG49MDtuPG87bisrKWZvcihsZXQgcz0wO3M8aTtzKyspYS5zZXQobypyK24saSplK3MsdGhpcy5nZXQocixlKSp0LmdldChuLHMpKTtyZXR1cm4gYX1rcm9uZWNrZXJTdW0odCl7aWYodD1pdnQuY2hlY2tNYXRyaXgodCksIXRoaXMuaXNTcXVhcmUoKXx8IXQuaXNTcXVhcmUoKSl0aHJvdyBuZXcgRXJyb3IoIktyb25lY2tlciBTdW0gbmVlZHMgdHdvIFNxdWFyZSBNYXRyaWNlcyIpO2xldCBlPXRoaXMucm93cyxuPXQucm93cyxvPXRoaXMua3JvbmVja2VyUHJvZHVjdChpdnQuZXllKG4sbikpLGk9aXZ0LmV5ZShlLGUpLmtyb25lY2tlclByb2R1Y3QodCk7cmV0dXJuIG8uYWRkKGkpfXRyYW5zcG9zZSgpe2xldCB0PW5ldyBpdnQodGhpcy5jb2x1bW5zLHRoaXMucm93cyk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0LnNldChuLGUsdGhpcy5nZXQoZSxuKSk7cmV0dXJuIHR9c29ydFJvd3ModD1udnQpe2ZvcihsZXQgZT0wO2U8dGhpcy5yb3dzO2UrKyl0aGlzLnNldFJvdyhlLHRoaXMuZ2V0Um93KGUpLnNvcnQodCkpO3JldHVybiB0aGlzfXNvcnRDb2x1bW5zKHQ9bnZ0KXtmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXRDb2x1bW4oZSx0aGlzLmdldENvbHVtbihlKS5zb3J0KHQpKTtyZXR1cm4gdGhpc31zdWJNYXRyaXgodCxlLG4sbyl7Sk10KHRoaXMsdCxlLG4sbyk7bGV0IGk9bmV3IGl2dChlLXQrMSxvLW4rMSk7Zm9yKGxldCBhPXQ7YTw9ZTthKyspZm9yKGxldCBlPW47ZTw9bztlKyspaS5zZXQoYS10LGUtbix0aGlzLmdldChhLGUpKTtyZXR1cm4gaX1zdWJNYXRyaXhSb3codCxlLG4pe2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PW4mJihuPXRoaXMuY29sdW1ucy0xKSxlPm58fGU8MHx8ZT49dGhpcy5jb2x1bW5zfHxuPDB8fG4+PXRoaXMuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXJndW1lbnQgb3V0IG9mIHJhbmdlIik7bGV0IG89bmV3IGl2dCh0Lmxlbmd0aCxuLWUrMSk7Zm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspZm9yKGxldCBhPWU7YTw9bjthKyspe2lmKHRbaV08MHx8dFtpXT49dGhpcy5yb3dzKXRocm93IG5ldyBSYW5nZUVycm9yKGBSb3cgaW5kZXggb3V0IG9mIHJhbmdlOiAke3RbaV19YCk7by5zZXQoaSxhLWUsdGhpcy5nZXQodFtpXSxhKSl9cmV0dXJuIG99c3ViTWF0cml4Q29sdW1uKHQsZSxuKXtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1uJiYobj10aGlzLnJvd3MtMSksZT5ufHxlPDB8fGU+PXRoaXMucm93c3x8bjwwfHxuPj10aGlzLnJvd3MpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkFyZ3VtZW50IG91dCBvZiByYW5nZSIpO2xldCBvPW5ldyBpdnQobi1lKzEsdC5sZW5ndGgpO2ZvcihsZXQgaT0wO2k8dC5sZW5ndGg7aSsrKWZvcihsZXQgYT1lO2E8PW47YSsrKXtpZih0W2ldPDB8fHRbaV0+PXRoaXMuY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQ29sdW1uIGluZGV4IG91dCBvZiByYW5nZTogJHt0W2ldfWApO28uc2V0KGEtZSxpLHRoaXMuZ2V0KGEsdFtpXSkpfXJldHVybiBvfXNldFN1Yk1hdHJpeCh0LGUsbil7aWYoKHQ9aXZ0LmNoZWNrTWF0cml4KHQpKS5pc0VtcHR5KCkpcmV0dXJuIHRoaXM7Sk10KHRoaXMsZSxlK3Qucm93cy0xLG4sbit0LmNvbHVtbnMtMSk7Zm9yKGxldCBvPTA7bzx0LnJvd3M7bysrKWZvcihsZXQgaT0wO2k8dC5jb2x1bW5zO2krKyl0aGlzLnNldChlK28sbitpLHQuZ2V0KG8saSkpO3JldHVybiB0aGlzfXNlbGVjdGlvbih0LGUpe2xldCBuPShmdW5jdGlvbiBvKHQsZSxuKXtyZXR1cm57cm93OlhNdCh0LGUpLGNvbHVtbjpLTXQodCxuKX19KSh0aGlzLHQsZSksaT1uZXcgaXZ0KHQubGVuZ3RoLGUubGVuZ3RoKTtmb3IobGV0IHQ9MDt0PG4ucm93Lmxlbmd0aDt0Kyspe2xldCBlPW4ucm93W3RdO2ZvcihsZXQgbz0wO288bi5jb2x1bW4ubGVuZ3RoO28rKylpLnNldCh0LG8sdGhpcy5nZXQoZSxuLmNvbHVtbltvXSkpfXJldHVybiBpfXRyYWNlKCl7bGV0IHQ9TWF0aC5taW4odGhpcy5yb3dzLHRoaXMuY29sdW1ucyksZT0wO2ZvcihsZXQgbj0wO248dDtuKyspZSs9dGhpcy5nZXQobixuKTtyZXR1cm4gZX1jbG9uZSgpe2xldCB0PW5ldyBpdnQodGhpcy5yb3dzLHRoaXMuY29sdW1ucyk7Zm9yKGxldCBlPTA7ZTx0aGlzLnJvd3M7ZSsrKWZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0LnNldChlLG4sdGhpcy5nZXQoZSxuKSk7cmV0dXJuIHR9c3VtKHQpe3N3aXRjaCh0KXtjYXNlInJvdyI6cmV0dXJuKGZ1bmN0aW9uIGUodCl7bGV0IGU9UU10KHQucm93cyk7Zm9yKGxldCBuPTA7bjx0LnJvd3M7KytuKWZvcihsZXQgbz0wO288dC5jb2x1bW5zOysrbyllW25dKz10LmdldChuLG8pO3JldHVybiBlfSkodGhpcyk7Y2FzZSJjb2x1bW4iOnJldHVybihmdW5jdGlvbiBuKHQpe2xldCBlPVFNdCh0LmNvbHVtbnMpO2ZvcihsZXQgbj0wO248dC5yb3dzOysrbilmb3IobGV0IG89MDtvPHQuY29sdW1uczsrK28pZVtvXSs9dC5nZXQobixvKTtyZXR1cm4gZX0pKHRoaXMpO2Nhc2Ugdm9pZCAwOnJldHVybihmdW5jdGlvbiBvKHQpe2xldCBlPTA7Zm9yKGxldCBuPTA7bjx0LnJvd3M7bisrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyllKz10LmdldChuLG8pO3JldHVybiBlfSkodGhpcyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXByb2R1Y3QodCl7c3dpdGNoKHQpe2Nhc2Uicm93IjpyZXR1cm4oZnVuY3Rpb24gZSh0KXtsZXQgZT1RTXQodC5yb3dzLDEpO2ZvcihsZXQgbj0wO248dC5yb3dzOysrbilmb3IobGV0IG89MDtvPHQuY29sdW1uczsrK28pZVtuXSo9dC5nZXQobixvKTtyZXR1cm4gZX0pKHRoaXMpO2Nhc2UiY29sdW1uIjpyZXR1cm4oZnVuY3Rpb24gbih0KXtsZXQgZT1RTXQodC5jb2x1bW5zLDEpO2ZvcihsZXQgbj0wO248dC5yb3dzOysrbilmb3IobGV0IG89MDtvPHQuY29sdW1uczsrK28pZVtvXSo9dC5nZXQobixvKTtyZXR1cm4gZX0pKHRoaXMpO2Nhc2Ugdm9pZCAwOnJldHVybihmdW5jdGlvbiBvKHQpe2xldCBlPTE7Zm9yKGxldCBuPTA7bjx0LnJvd3M7bisrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyllKj10LmdldChuLG8pO3JldHVybiBlfSkodGhpcyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fW1lYW4odCl7Y29uc3QgZT10aGlzLnN1bSh0KTtzd2l0Y2godCl7Y2FzZSJyb3ciOmZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKyllW3RdLz10aGlzLmNvbHVtbnM7cmV0dXJuIGU7Y2FzZSJjb2x1bW4iOmZvcihsZXQgdD0wO3Q8dGhpcy5jb2x1bW5zO3QrKyllW3RdLz10aGlzLnJvd3M7cmV0dXJuIGU7Y2FzZSB2b2lkIDA6cmV0dXJuIGUvdGhpcy5zaXplO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX12YXJpYW5jZSh0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHt1bmJpYXNlZDpuPSEwLG1lYW46bz10aGlzLm1lYW4odCl9PWU7aWYoImJvb2xlYW4iIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJ1bmJpYXNlZCBtdXN0IGJlIGEgYm9vbGVhbiIpO3N3aXRjaCh0KXtjYXNlInJvdyI6aWYoIUFycmF5LmlzQXJyYXkobykpdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuKGZ1bmN0aW9uIGUodCxuLG8pe2NvbnN0IGk9dC5yb3dzLGE9dC5jb2x1bW5zLHI9W107Zm9yKGxldCBlPTA7ZTxpO2UrKyl7bGV0IGk9MCxzPTAsbD0wO2ZvcihsZXQgbj0wO248YTtuKyspbD10LmdldChlLG4pLW9bZV0saSs9bCxzKz1sKmw7ci5wdXNoKG4/KHMtaSppL2EpLyhhLTEpOihzLWkqaS9hKS9hKX1yZXR1cm4gcn0pKHRoaXMsbixvKTtjYXNlImNvbHVtbiI6aWYoIUFycmF5LmlzQXJyYXkobykpdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuKGZ1bmN0aW9uIGkodCxlLG4pe2NvbnN0IG89dC5yb3dzLGk9dC5jb2x1bW5zLGE9W107Zm9yKGxldCByPTA7cjxpO3IrKyl7bGV0IGk9MCxzPTAsbD0wO2ZvcihsZXQgZT0wO2U8bztlKyspbD10LmdldChlLHIpLW5bcl0saSs9bCxzKz1sKmw7YS5wdXNoKGU/KHMtaSppL28pLyhvLTEpOihzLWkqaS9vKS9vKX1yZXR1cm4gYX0pKHRoaXMsbixvKTtjYXNlIHZvaWQgMDppZigibnVtYmVyIiE9dHlwZW9mIG8pdGhyb3cgbmV3IFR5cGVFcnJvcigibWVhbiBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuKGZ1bmN0aW9uIGEodCxlLG4pe2NvbnN0IG89dC5yb3dzLGk9dC5jb2x1bW5zLGE9byppO2xldCByPTAscz0wLGw9MDtmb3IobGV0IGU9MDtlPG87ZSsrKWZvcihsZXQgbz0wO288aTtvKyspbD10LmdldChlLG8pLW4scis9bCxzKz1sKmw7cmV0dXJuIGU/KHMtcipyL2EpLyhhLTEpOihzLXIqci9hKS9hfSkodGhpcyxuLG8pO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1zdGFuZGFyZERldmlhdGlvbih0LGUpeyJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCk7Y29uc3Qgbj10aGlzLnZhcmlhbmNlKHQsZSk7aWYodm9pZCAwPT09dClyZXR1cm4gTWF0aC5zcXJ0KG4pO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKW5bdF09TWF0aC5zcXJ0KG5bdF0pO3JldHVybiBufWNlbnRlcih0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtjb25zdHtjZW50ZXI6bj10aGlzLm1lYW4odCl9PWU7c3dpdGNoKHQpe2Nhc2Uicm93IjppZighQXJyYXkuaXNBcnJheShuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJjZW50ZXIgbXVzdCBiZSBhbiBhcnJheSIpO3JldHVybihmdW5jdGlvbiBlKHQsbil7Zm9yKGxldCBlPTA7ZTx0LnJvd3M7ZSsrKWZvcihsZXQgbz0wO288dC5jb2x1bW5zO28rKyl0LnNldChlLG8sdC5nZXQoZSxvKS1uW2VdKX0pKHRoaXMsbiksdGhpcztjYXNlImNvbHVtbiI6aWYoIUFycmF5LmlzQXJyYXkobikpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2VudGVyIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4oZnVuY3Rpb24gbyh0LGUpe2ZvcihsZXQgbj0wO248dC5yb3dzO24rKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspdC5zZXQobixvLHQuZ2V0KG4sbyktZVtvXSl9KSh0aGlzLG4pLHRoaXM7Y2FzZSB2b2lkIDA6aWYoIm51bWJlciIhPXR5cGVvZiBuKXRocm93IG5ldyBUeXBlRXJyb3IoImNlbnRlciBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuKGZ1bmN0aW9uIGkodCxlKXtmb3IobGV0IG49MDtuPHQucm93cztuKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKXQuc2V0KG4sbyx0LmdldChuLG8pLWUpfSkodGhpcyxuKSx0aGlzO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wdGlvbjogJHt0fWApfX1zY2FsZSh0LGU9e30pe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtsZXQgbj1lLnNjYWxlO3N3aXRjaCh0KXtjYXNlInJvdyI6aWYodm9pZCAwPT09biluPShmdW5jdGlvbiBlKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjx0LnJvd3M7bisrKXtsZXQgbz0wO2ZvcihsZXQgZT0wO2U8dC5jb2x1bW5zO2UrKylvKz1NYXRoLnBvdyh0LmdldChuLGUpLDIpLyh0LmNvbHVtbnMtMSk7ZS5wdXNoKE1hdGguc3FydChvKSl9cmV0dXJuIGV9KSh0aGlzKTtlbHNlIGlmKCFBcnJheS5pc0FycmF5KG4pKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYW4gYXJyYXkiKTtyZXR1cm4oZnVuY3Rpb24gbyh0LGUpe2ZvcihsZXQgbj0wO248dC5yb3dzO24rKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspdC5zZXQobixvLHQuZ2V0KG4sbykvZVtuXSl9KSh0aGlzLG4pLHRoaXM7Y2FzZSJjb2x1bW4iOmlmKHZvaWQgMD09PW4pbj0oZnVuY3Rpb24gaSh0KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248dC5jb2x1bW5zO24rKyl7bGV0IG89MDtmb3IobGV0IGU9MDtlPHQucm93cztlKyspbys9TWF0aC5wb3codC5nZXQoZSxuKSwyKS8odC5yb3dzLTEpO2UucHVzaChNYXRoLnNxcnQobykpfXJldHVybiBlfSkodGhpcyk7ZWxzZSBpZighQXJyYXkuaXNBcnJheShuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJzY2FsZSBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuKGZ1bmN0aW9uIGEodCxlKXtmb3IobGV0IG49MDtuPHQucm93cztuKyspZm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKXQuc2V0KG4sbyx0LmdldChuLG8pL2Vbb10pfSkodGhpcyxuKSx0aGlzO2Nhc2Ugdm9pZCAwOmlmKHZvaWQgMD09PW4pbj0oZnVuY3Rpb24gcih0KXtjb25zdCBlPXQuc2l6ZS0xO2xldCBuPTA7Zm9yKGxldCBvPTA7bzx0LmNvbHVtbnM7bysrKWZvcihsZXQgaT0wO2k8dC5yb3dzO2krKyluKz1NYXRoLnBvdyh0LmdldChpLG8pLDIpL2U7cmV0dXJuIE1hdGguc3FydChuKX0pKHRoaXMpO2Vsc2UgaWYoIm51bWJlciIhPXR5cGVvZiBuKXRocm93IG5ldyBUeXBlRXJyb3IoInNjYWxlIG11c3QgYmUgYSBudW1iZXIiKTtyZXR1cm4oZnVuY3Rpb24gcyh0LGUpe2ZvcihsZXQgbj0wO248dC5yb3dzO24rKylmb3IobGV0IG89MDtvPHQuY29sdW1ucztvKyspdC5zZXQobixvLHQuZ2V0KG4sbykvZSl9KSh0aGlzLG4pLHRoaXM7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3B0aW9uOiAke3R9YCl9fXRvU3RyaW5nKHQpe3JldHVybiBVTXQodGhpcyx0KX19ZnVuY3Rpb24gbnZ0KHQsZSl7cmV0dXJuIHQtZX1ldnQucHJvdG90eXBlLmtsYXNzPSJNYXRyaXgiLCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiYoZXZ0LnByb3RvdHlwZVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXT1mdW5jdGlvbiBvdnQoKXtyZXR1cm4gVU10KHRoaXMpfSksZXZ0LnJhbmRvbT1ldnQucmFuZCxldnQucmFuZG9tSW50PWV2dC5yYW5kSW50LGV2dC5kaWFnb25hbD1ldnQuZGlhZyxldnQucHJvdG90eXBlLmRpYWdvbmFsPWV2dC5wcm90b3R5cGUuZGlhZyxldnQuaWRlbnRpdHk9ZXZ0LmV5ZSxldnQucHJvdG90eXBlLm5lZ2F0ZT1ldnQucHJvdG90eXBlLm5lZyxldnQucHJvdG90eXBlLnRlbnNvclByb2R1Y3Q9ZXZ0LnByb3RvdHlwZS5rcm9uZWNrZXJQcm9kdWN0O2NsYXNzIGl2dCBleHRlbmRzIGV2dHtjb25zdHJ1Y3Rvcih0LGUpe2lmKHN1cGVyKCksaXZ0LmlzTWF0cml4KHQpKXJldHVybiB0LmNsb25lKCk7aWYoTnVtYmVyLmlzSW50ZWdlcih0KSYmdD49MCl7aWYodGhpcy5kYXRhPVtdLCEoTnVtYmVyLmlzSW50ZWdlcihlKSYmZT49MCkpdGhyb3cgbmV3IFR5cGVFcnJvcigibkNvbHVtbnMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiKTtmb3IobGV0IG49MDtuPHQ7bisrKXRoaXMuZGF0YS5wdXNoKG5ldyBGbG9hdDY0QXJyYXkoZSkpfWVsc2V7aWYoIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciBvciBhbiBhcnJheSIpO3tjb25zdCBuPXQ7aWYoIm51bWJlciIhPXR5cGVvZihlPSh0PW4ubGVuZ3RoKT9uWzBdLmxlbmd0aDowKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJEYXRhIG11c3QgYmUgYSAyRCBhcnJheSB3aXRoIGF0IGxlYXN0IG9uZSBlbGVtZW50Iik7dGhpcy5kYXRhPVtdO2ZvcihsZXQgbz0wO288dDtvKyspe2lmKG5bb10ubGVuZ3RoIT09ZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5jb25zaXN0ZW50IGFycmF5IGRpbWVuc2lvbnMiKTt0aGlzLmRhdGEucHVzaChGbG9hdDY0QXJyYXkuZnJvbShuW29dKSl9fX10aGlzLnJvd3M9dCx0aGlzLmNvbHVtbnM9ZX1zZXQodCxlLG4pe3JldHVybiB0aGlzLmRhdGFbdF1bZV09bix0aGlzfWdldCh0LGUpe3JldHVybiB0aGlzLmRhdGFbdF1bZV19cmVtb3ZlUm93KHQpe3JldHVybiBXTXQodGhpcyx0KSx0aGlzLmRhdGEuc3BsaWNlKHQsMSksdGhpcy5yb3dzLT0xLHRoaXN9YWRkUm93KHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXQsdD10aGlzLnJvd3MpLFdNdCh0aGlzLHQsITApLGU9RmxvYXQ2NEFycmF5LmZyb20ocU10KHRoaXMsZSkpLHRoaXMuZGF0YS5zcGxpY2UodCwwLGUpLHRoaXMucm93cys9MSx0aGlzfXJlbW92ZUNvbHVtbih0KXtZTXQodGhpcyx0KTtmb3IobGV0IGU9MDtlPHRoaXMucm93cztlKyspe2NvbnN0IG49bmV3IEZsb2F0NjRBcnJheSh0aGlzLmNvbHVtbnMtMSk7Zm9yKGxldCBvPTA7bzx0O28rKyluW29dPXRoaXMuZGF0YVtlXVtvXTtmb3IobGV0IG89dCsxO288dGhpcy5jb2x1bW5zO28rKyluW28tMV09dGhpcy5kYXRhW2VdW29dO3RoaXMuZGF0YVtlXT1ufXJldHVybiB0aGlzLmNvbHVtbnMtPTEsdGhpc31hZGRDb2x1bW4odCxlKXt2b2lkIDA9PT1lJiYoZT10LHQ9dGhpcy5jb2x1bW5zKSxZTXQodGhpcyx0LCEwKSxlPVpNdCh0aGlzLGUpO2ZvcihsZXQgbj0wO248dGhpcy5yb3dzO24rKyl7Y29uc3Qgbz1uZXcgRmxvYXQ2NEFycmF5KHRoaXMuY29sdW1ucysxKTtsZXQgaT0wO2Zvcig7aTx0O2krKylvW2ldPXRoaXMuZGF0YVtuXVtpXTtmb3Iob1tpKytdPWVbbl07aTx0aGlzLmNvbHVtbnMrMTtpKyspb1tpXT10aGlzLmRhdGFbbl1baS0xXTt0aGlzLmRhdGFbbl09b31yZXR1cm4gdGhpcy5jb2x1bW5zKz0xLHRoaXN9fSEoZnVuY3Rpb24gYXZ0KHQsZSl7dC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlP3RoaXMuYWRkUyhlKTp0aGlzLmFkZE0oZSl9LHQucHJvdG90eXBlLmFkZFM9ZnVuY3Rpb24gdChlKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KHQsbix0aGlzLmdldCh0LG4pK2UpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5hZGRNPWZ1bmN0aW9uIHQobil7aWYobj1lLmNoZWNrTWF0cml4KG4pLHRoaXMucm93cyE9PW4ucm93c3x8dGhpcy5jb2x1bW5zIT09bi5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSx0aGlzLmdldCh0LGUpK24uZ2V0KHQsZSkpO3JldHVybiB0aGlzfSx0LmFkZD1mdW5jdGlvbiB0KG4sbyl7cmV0dXJuIG5ldyBlKG4pLmFkZChvKX0sdC5wcm90b3R5cGUuc3ViPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlP3RoaXMuc3ViUyhlKTp0aGlzLnN1Yk0oZSl9LHQucHJvdG90eXBlLnN1YlM9ZnVuY3Rpb24gdChlKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KHQsbix0aGlzLmdldCh0LG4pLWUpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5zdWJNPWZ1bmN0aW9uIHQobil7aWYobj1lLmNoZWNrTWF0cml4KG4pLHRoaXMucm93cyE9PW4ucm93c3x8dGhpcy5jb2x1bW5zIT09bi5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSx0aGlzLmdldCh0LGUpLW4uZ2V0KHQsZSkpO3JldHVybiB0aGlzfSx0LnN1Yj1mdW5jdGlvbiB0KG4sbyl7cmV0dXJuIG5ldyBlKG4pLnN1YihvKX0sdC5wcm90b3R5cGUuc3VidHJhY3Q9dC5wcm90b3R5cGUuc3ViLHQucHJvdG90eXBlLnN1YnRyYWN0Uz10LnByb3RvdHlwZS5zdWJTLHQucHJvdG90eXBlLnN1YnRyYWN0TT10LnByb3RvdHlwZS5zdWJNLHQuc3VidHJhY3Q9dC5zdWIsdC5wcm90b3R5cGUubXVsPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlP3RoaXMubXVsUyhlKTp0aGlzLm11bE0oZSl9LHQucHJvdG90eXBlLm11bFM9ZnVuY3Rpb24gdChlKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KHQsbix0aGlzLmdldCh0LG4pKmUpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5tdWxNPWZ1bmN0aW9uIHQobil7aWYobj1lLmNoZWNrTWF0cml4KG4pLHRoaXMucm93cyE9PW4ucm93c3x8dGhpcy5jb2x1bW5zIT09bi5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSx0aGlzLmdldCh0LGUpKm4uZ2V0KHQsZSkpO3JldHVybiB0aGlzfSx0Lm11bD1mdW5jdGlvbiB0KG4sbyl7cmV0dXJuIG5ldyBlKG4pLm11bChvKX0sdC5wcm90b3R5cGUubXVsdGlwbHk9dC5wcm90b3R5cGUubXVsLHQucHJvdG90eXBlLm11bHRpcGx5Uz10LnByb3RvdHlwZS5tdWxTLHQucHJvdG90eXBlLm11bHRpcGx5TT10LnByb3RvdHlwZS5tdWxNLHQubXVsdGlwbHk9dC5tdWwsdC5wcm90b3R5cGUuZGl2PWZ1bmN0aW9uIHQoZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlP3RoaXMuZGl2UyhlKTp0aGlzLmRpdk0oZSl9LHQucHJvdG90eXBlLmRpdlM9ZnVuY3Rpb24gdChlKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KHQsbix0aGlzLmdldCh0LG4pL2UpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5kaXZNPWZ1bmN0aW9uIHQobil7aWYobj1lLmNoZWNrTWF0cml4KG4pLHRoaXMucm93cyE9PW4ucm93c3x8dGhpcy5jb2x1bW5zIT09bi5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSx0aGlzLmdldCh0LGUpL24uZ2V0KHQsZSkpO3JldHVybiB0aGlzfSx0LmRpdj1mdW5jdGlvbiB0KG4sbyl7cmV0dXJuIG5ldyBlKG4pLmRpdihvKX0sdC5wcm90b3R5cGUuZGl2aWRlPXQucHJvdG90eXBlLmRpdix0LnByb3RvdHlwZS5kaXZpZGVTPXQucHJvdG90eXBlLmRpdlMsdC5wcm90b3R5cGUuZGl2aWRlTT10LnByb3RvdHlwZS5kaXZNLHQuZGl2aWRlPXQuZGl2LHQucHJvdG90eXBlLm1vZD1mdW5jdGlvbiB0KGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZT90aGlzLm1vZFMoZSk6dGhpcy5tb2RNKGUpfSx0LnByb3RvdHlwZS5tb2RTPWZ1bmN0aW9uIHQoZSl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgbj0wO248dGhpcy5jb2x1bW5zO24rKyl0aGlzLnNldCh0LG4sdGhpcy5nZXQodCxuKSVlKTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUubW9kTT1mdW5jdGlvbiB0KG4pe2lmKG49ZS5jaGVja01hdHJpeChuKSx0aGlzLnJvd3MhPT1uLnJvd3N8fHRoaXMuY29sdW1ucyE9PW4uY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsdGhpcy5nZXQodCxlKSVuLmdldCh0LGUpKTtyZXR1cm4gdGhpc30sdC5tb2Q9ZnVuY3Rpb24gdChuLG8pe3JldHVybiBuZXcgZShuKS5tb2Qobyl9LHQucHJvdG90eXBlLm1vZHVsdXM9dC5wcm90b3R5cGUubW9kLHQucHJvdG90eXBlLm1vZHVsdXNTPXQucHJvdG90eXBlLm1vZFMsdC5wcm90b3R5cGUubW9kdWx1c009dC5wcm90b3R5cGUubW9kTSx0Lm1vZHVsdXM9dC5tb2QsdC5wcm90b3R5cGUuYW5kPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlP3RoaXMuYW5kUyhlKTp0aGlzLmFuZE0oZSl9LHQucHJvdG90eXBlLmFuZFM9ZnVuY3Rpb24gdChlKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBuPTA7bjx0aGlzLmNvbHVtbnM7bisrKXRoaXMuc2V0KHQsbix0aGlzLmdldCh0LG4pJmUpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5hbmRNPWZ1bmN0aW9uIHQobil7aWYobj1lLmNoZWNrTWF0cml4KG4pLHRoaXMucm93cyE9PW4ucm93c3x8dGhpcy5jb2x1bW5zIT09bi5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSx0aGlzLmdldCh0LGUpJm4uZ2V0KHQsZSkpO3JldHVybiB0aGlzfSx0LmFuZD1mdW5jdGlvbiB0KG4sbyl7cmV0dXJuIG5ldyBlKG4pLmFuZChvKX0sdC5wcm90b3R5cGUub3I9ZnVuY3Rpb24gdChlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/dGhpcy5vclMoZSk6dGhpcy5vck0oZSl9LHQucHJvdG90eXBlLm9yUz1mdW5jdGlvbiB0KGUpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQodCxuLHRoaXMuZ2V0KHQsbil8ZSk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLm9yTT1mdW5jdGlvbiB0KG4pe2lmKG49ZS5jaGVja01hdHJpeChuKSx0aGlzLnJvd3MhPT1uLnJvd3N8fHRoaXMuY29sdW1ucyE9PW4uY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsdGhpcy5nZXQodCxlKXxuLmdldCh0LGUpKTtyZXR1cm4gdGhpc30sdC5vcj1mdW5jdGlvbiB0KG4sbyl7cmV0dXJuIG5ldyBlKG4pLm9yKG8pfSx0LnByb3RvdHlwZS54b3I9ZnVuY3Rpb24gdChlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/dGhpcy54b3JTKGUpOnRoaXMueG9yTShlKX0sdC5wcm90b3R5cGUueG9yUz1mdW5jdGlvbiB0KGUpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQodCxuLHRoaXMuZ2V0KHQsbileZSk7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnhvck09ZnVuY3Rpb24gdChuKXtpZihuPWUuY2hlY2tNYXRyaXgobiksdGhpcy5yb3dzIT09bi5yb3dzfHx0aGlzLmNvbHVtbnMhPT1uLmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLHRoaXMuZ2V0KHQsZSlebi5nZXQodCxlKSk7cmV0dXJuIHRoaXN9LHQueG9yPWZ1bmN0aW9uIHQobixvKXtyZXR1cm4gbmV3IGUobikueG9yKG8pfSx0LnByb3RvdHlwZS5sZWZ0U2hpZnQ9ZnVuY3Rpb24gdChlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/dGhpcy5sZWZ0U2hpZnRTKGUpOnRoaXMubGVmdFNoaWZ0TShlKX0sdC5wcm90b3R5cGUubGVmdFNoaWZ0Uz1mdW5jdGlvbiB0KGUpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQodCxuLHRoaXMuZ2V0KHQsbik8PGUpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5sZWZ0U2hpZnRNPWZ1bmN0aW9uIHQobil7aWYobj1lLmNoZWNrTWF0cml4KG4pLHRoaXMucm93cyE9PW4ucm93c3x8dGhpcy5jb2x1bW5zIT09bi5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSx0aGlzLmdldCh0LGUpPDxuLmdldCh0LGUpKTtyZXR1cm4gdGhpc30sdC5sZWZ0U2hpZnQ9ZnVuY3Rpb24gdChuLG8pe3JldHVybiBuZXcgZShuKS5sZWZ0U2hpZnQobyl9LHQucHJvdG90eXBlLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQ9ZnVuY3Rpb24gdChlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/dGhpcy5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0UyhlKTp0aGlzLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnRNKGUpfSx0LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0Uz1mdW5jdGlvbiB0KGUpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQodCxuLHRoaXMuZ2V0KHQsbik+PmUpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5zaWduUHJvcGFnYXRpbmdSaWdodFNoaWZ0TT1mdW5jdGlvbiB0KG4pe2lmKG49ZS5jaGVja01hdHJpeChuKSx0aGlzLnJvd3MhPT1uLnJvd3N8fHRoaXMuY29sdW1ucyE9PW4uY29sdW1ucyl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiTWF0cmljZXMgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIik7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsdGhpcy5nZXQodCxlKT4+bi5nZXQodCxlKSk7cmV0dXJuIHRoaXN9LHQuc2lnblByb3BhZ2F0aW5nUmlnaHRTaGlmdD1mdW5jdGlvbiB0KG4sbyl7cmV0dXJuIG5ldyBlKG4pLnNpZ25Qcm9wYWdhdGluZ1JpZ2h0U2hpZnQobyl9LHQucHJvdG90eXBlLnJpZ2h0U2hpZnQ9ZnVuY3Rpb24gdChlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/dGhpcy5yaWdodFNoaWZ0UyhlKTp0aGlzLnJpZ2h0U2hpZnRNKGUpfSx0LnByb3RvdHlwZS5yaWdodFNoaWZ0Uz1mdW5jdGlvbiB0KGUpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQodCxuLHRoaXMuZ2V0KHQsbik+Pj5lKTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUucmlnaHRTaGlmdE09ZnVuY3Rpb24gdChuKXtpZihuPWUuY2hlY2tNYXRyaXgobiksdGhpcy5yb3dzIT09bi5yb3dzfHx0aGlzLmNvbHVtbnMhPT1uLmNvbHVtbnMpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk1hdHJpY2VzIGRpbWVuc2lvbnMgbXVzdCBiZSBlcXVhbCIpO2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLHRoaXMuZ2V0KHQsZSk+Pj5uLmdldCh0LGUpKTtyZXR1cm4gdGhpc30sdC5yaWdodFNoaWZ0PWZ1bmN0aW9uIHQobixvKXtyZXR1cm4gbmV3IGUobikucmlnaHRTaGlmdChvKX0sdC5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0PXQucHJvdG90eXBlLnJpZ2h0U2hpZnQsdC5wcm90b3R5cGUuemVyb0ZpbGxSaWdodFNoaWZ0Uz10LnByb3RvdHlwZS5yaWdodFNoaWZ0Uyx0LnByb3RvdHlwZS56ZXJvRmlsbFJpZ2h0U2hpZnRNPXQucHJvdG90eXBlLnJpZ2h0U2hpZnRNLHQuemVyb0ZpbGxSaWdodFNoaWZ0PXQucmlnaHRTaGlmdCx0LnByb3RvdHlwZS5ub3Q9ZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLH50aGlzLmdldCh0LGUpKTtyZXR1cm4gdGhpc30sdC5ub3Q9ZnVuY3Rpb24gdChuKXtyZXR1cm4gbmV3IGUobikubm90KCl9LHQucHJvdG90eXBlLmFicz1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hYnModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFicz1mdW5jdGlvbiB0KG4pe3JldHVybiBuZXcgZShuKS5hYnMoKX0sdC5wcm90b3R5cGUuYWNvcz1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hY29zKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hY29zPWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLmFjb3MoKX0sdC5wcm90b3R5cGUuYWNvc2g9ZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYWNvc2godGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmFjb3NoPWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLmFjb3NoKCl9LHQucHJvdG90eXBlLmFzaW49ZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguYXNpbih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXNpbj1mdW5jdGlvbiB0KG4pe3JldHVybiBuZXcgZShuKS5hc2luKCl9LHQucHJvdG90eXBlLmFzaW5oPWZ1bmN0aW9uIHQoKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmFzaW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5hc2luaD1mdW5jdGlvbiB0KG4pe3JldHVybiBuZXcgZShuKS5hc2luaCgpfSx0LnByb3RvdHlwZS5hdGFuPWZ1bmN0aW9uIHQoKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmF0YW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmF0YW49ZnVuY3Rpb24gdChuKXtyZXR1cm4gbmV3IGUobikuYXRhbigpfSx0LnByb3RvdHlwZS5hdGFuaD1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5hdGFuaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuYXRhbmg9ZnVuY3Rpb24gdChuKXtyZXR1cm4gbmV3IGUobikuYXRhbmgoKX0sdC5wcm90b3R5cGUuY2JydD1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jYnJ0KHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jYnJ0PWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLmNicnQoKX0sdC5wcm90b3R5cGUuY2VpbD1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jZWlsKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jZWlsPWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLmNlaWwoKX0sdC5wcm90b3R5cGUuY2x6MzI9ZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguY2x6MzIodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNsejMyPWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLmNsejMyKCl9LHQucHJvdG90eXBlLmNvcz1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jb3ModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmNvcz1mdW5jdGlvbiB0KG4pe3JldHVybiBuZXcgZShuKS5jb3MoKX0sdC5wcm90b3R5cGUuY29zaD1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5jb3NoKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5jb3NoPWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLmNvc2goKX0sdC5wcm90b3R5cGUuZXhwPWZ1bmN0aW9uIHQoKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmV4cCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZXhwPWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLmV4cCgpfSx0LnByb3RvdHlwZS5leHBtMT1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5leHBtMSh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuZXhwbTE9ZnVuY3Rpb24gdChuKXtyZXR1cm4gbmV3IGUobikuZXhwbTEoKX0sdC5wcm90b3R5cGUuZmxvb3I9ZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguZmxvb3IodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmZsb29yPWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLmZsb29yKCl9LHQucHJvdG90eXBlLmZyb3VuZD1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5mcm91bmQodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmZyb3VuZD1mdW5jdGlvbiB0KG4pe3JldHVybiBuZXcgZShuKS5mcm91bmQoKX0sdC5wcm90b3R5cGUubG9nPWZ1bmN0aW9uIHQoKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLmxvZyh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nPWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLmxvZygpfSx0LnByb3RvdHlwZS5sb2cxcD1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC5sb2cxcCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nMXA9ZnVuY3Rpb24gdChuKXtyZXR1cm4gbmV3IGUobikubG9nMXAoKX0sdC5wcm90b3R5cGUubG9nMTA9ZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nMTAodGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LmxvZzEwPWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLmxvZzEwKCl9LHQucHJvdG90eXBlLmxvZzI9ZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgubG9nMih0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQubG9nMj1mdW5jdGlvbiB0KG4pe3JldHVybiBuZXcgZShuKS5sb2cyKCl9LHQucHJvdG90eXBlLnJvdW5kPWZ1bmN0aW9uIHQoKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnJvdW5kKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5yb3VuZD1mdW5jdGlvbiB0KG4pe3JldHVybiBuZXcgZShuKS5yb3VuZCgpfSx0LnByb3RvdHlwZS5zaWduPWZ1bmN0aW9uIHQoKXtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnNpZ24odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnNpZ249ZnVuY3Rpb24gdChuKXtyZXR1cm4gbmV3IGUobikuc2lnbigpfSx0LnByb3RvdHlwZS5zaW49ZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2luKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC5zaW49ZnVuY3Rpb24gdChuKXtyZXR1cm4gbmV3IGUobikuc2luKCl9LHQucHJvdG90eXBlLnNpbmg9ZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc2luaCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc2luaD1mdW5jdGlvbiB0KG4pe3JldHVybiBuZXcgZShuKS5zaW5oKCl9LHQucHJvdG90eXBlLnNxcnQ9ZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGguc3FydCh0aGlzLmdldCh0LGUpKSk7cmV0dXJuIHRoaXN9LHQuc3FydD1mdW5jdGlvbiB0KG4pe3JldHVybiBuZXcgZShuKS5zcXJ0KCl9LHQucHJvdG90eXBlLnRhbj1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50YW4odGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnRhbj1mdW5jdGlvbiB0KG4pe3JldHVybiBuZXcgZShuKS50YW4oKX0sdC5wcm90b3R5cGUudGFuaD1mdW5jdGlvbiB0KCl7Zm9yKGxldCB0PTA7dDx0aGlzLnJvd3M7dCsrKWZvcihsZXQgZT0wO2U8dGhpcy5jb2x1bW5zO2UrKyl0aGlzLnNldCh0LGUsTWF0aC50YW5oKHRoaXMuZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc30sdC50YW5oPWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLnRhbmgoKX0sdC5wcm90b3R5cGUudHJ1bmM9ZnVuY3Rpb24gdCgpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IGU9MDtlPHRoaXMuY29sdW1ucztlKyspdGhpcy5zZXQodCxlLE1hdGgudHJ1bmModGhpcy5nZXQodCxlKSkpO3JldHVybiB0aGlzfSx0LnRydW5jPWZ1bmN0aW9uIHQobil7cmV0dXJuIG5ldyBlKG4pLnRydW5jKCl9LHQucG93PWZ1bmN0aW9uIHQobixvKXtyZXR1cm4gbmV3IGUobikucG93KG8pfSx0LnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24gdChlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGU/dGhpcy5wb3dTKGUpOnRoaXMucG93TShlKX0sdC5wcm90b3R5cGUucG93Uz1mdW5jdGlvbiB0KGUpe2ZvcihsZXQgdD0wO3Q8dGhpcy5yb3dzO3QrKylmb3IobGV0IG49MDtuPHRoaXMuY29sdW1ucztuKyspdGhpcy5zZXQodCxuLE1hdGgucG93KHRoaXMuZ2V0KHQsbiksZSkpO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5wb3dNPWZ1bmN0aW9uIHQobil7aWYobj1lLmNoZWNrTWF0cml4KG4pLHRoaXMucm93cyE9PW4ucm93c3x8dGhpcy5jb2x1bW5zIT09bi5jb2x1bW5zKXRocm93IG5ldyBSYW5nZUVycm9yKCJNYXRyaWNlcyBkaW1lbnNpb25zIG11c3QgYmUgZXF1YWwiKTtmb3IobGV0IHQ9MDt0PHRoaXMucm93czt0KyspZm9yKGxldCBlPTA7ZTx0aGlzLmNvbHVtbnM7ZSsrKXRoaXMuc2V0KHQsZSxNYXRoLnBvdyh0aGlzLmdldCh0LGUpLG4uZ2V0KHQsZSkpKTtyZXR1cm4gdGhpc319KShldnQsaXZ0KTtjbGFzcyBydnQgZXh0ZW5kcyBldnR7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmRhdGE9dCx0aGlzLnJvd3M9dC5sZW5ndGgsdGhpcy5jb2x1bW5zPXRbMF0ubGVuZ3RofXNldCh0LGUsbil7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXT1uLHRoaXN9Z2V0KHQsZSl7cmV0dXJuIHRoaXMuZGF0YVt0XVtlXX19Y2xhc3Mgc3Z0e2NvbnN0cnVjdG9yKHQpe2xldCBlLG4sbyxpLGEscixzLGwsYyxkPSh0PXJ2dC5jaGVja01hdHJpeCh0KSkuY2xvbmUoKSxwPWQucm93cyxtPWQuY29sdW1ucyx1PW5ldyBGbG9hdDY0QXJyYXkocCksZj0xO2ZvcihlPTA7ZTxwO2UrKyl1W2VdPWU7Zm9yKGw9bmV3IEZsb2F0NjRBcnJheShwKSxuPTA7bjxtO24rKyl7Zm9yKGU9MDtlPHA7ZSsrKWxbZV09ZC5nZXQoZSxuKTtmb3IoZT0wO2U8cDtlKyspe2ZvcihjPU1hdGgubWluKGUsbiksYT0wLG89MDtvPGM7bysrKWErPWQuZ2V0KGUsbykqbFtvXTtsW2VdLT1hLGQuc2V0KGUsbixsW2VdKX1mb3IoaT1uLGU9bisxO2U8cDtlKyspTWF0aC5hYnMobFtlXSk+TWF0aC5hYnMobFtpXSkmJihpPWUpO2lmKGkhPT1uKXtmb3Iobz0wO288bTtvKyspcj1kLmdldChpLG8pLGQuc2V0KGksbyxkLmdldChuLG8pKSxkLnNldChuLG8scik7cz11W2ldLHVbaV09dVtuXSx1W25dPXMsZj0tZn1pZihuPHAmJjAhPT1kLmdldChuLG4pKWZvcihlPW4rMTtlPHA7ZSsrKWQuc2V0KGUsbixkLmdldChlLG4pL2QuZ2V0KG4sbikpfXRoaXMuTFU9ZCx0aGlzLnBpdm90VmVjdG9yPXUsdGhpcy5waXZvdFNpZ249Zn1pc1Npbmd1bGFyKCl7bGV0IHQ9dGhpcy5MVSxlPXQuY29sdW1ucztmb3IobGV0IG49MDtuPGU7bisrKWlmKDA9PT10LmdldChuLG4pKXJldHVybiEwO3JldHVybiExfXNvbHZlKHQpe3Q9aXZ0LmNoZWNrTWF0cml4KHQpO2xldCBlPXRoaXMuTFU7aWYoZS5yb3dzIT09dC5yb3dzKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBtYXRyaXggZGltZW5zaW9ucyIpO2lmKHRoaXMuaXNTaW5ndWxhcigpKXRocm93IG5ldyBFcnJvcigiTFUgbWF0cml4IGlzIHNpbmd1bGFyIik7bGV0IG4sbyxpLGE9dC5jb2x1bW5zLHI9dC5zdWJNYXRyaXhSb3codGhpcy5waXZvdFZlY3RvciwwLGEtMSkscz1lLmNvbHVtbnM7Zm9yKGk9MDtpPHM7aSsrKWZvcihuPWkrMTtuPHM7bisrKWZvcihvPTA7bzxhO28rKylyLnNldChuLG8sci5nZXQobixvKS1yLmdldChpLG8pKmUuZ2V0KG4saSkpO2ZvcihpPXMtMTtpPj0wO2ktLSl7Zm9yKG89MDtvPGE7bysrKXIuc2V0KGksbyxyLmdldChpLG8pL2UuZ2V0KGksaSkpO2ZvcihuPTA7bjxpO24rKylmb3Iobz0wO288YTtvKyspci5zZXQobixvLHIuZ2V0KG4sbyktci5nZXQoaSxvKSplLmdldChuLGkpKX1yZXR1cm4gcn1nZXQgZGV0ZXJtaW5hbnQoKXtsZXQgdD10aGlzLkxVO2lmKCF0LmlzU3F1YXJlKCkpdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggbXVzdCBiZSBzcXVhcmUiKTtsZXQgZT10aGlzLnBpdm90U2lnbixuPXQuY29sdW1ucztmb3IobGV0IG89MDtvPG47bysrKWUqPXQuZ2V0KG8sbyk7cmV0dXJuIGV9Z2V0IGxvd2VyVHJpYW5ndWxhck1hdHJpeCgpe2xldCB0PXRoaXMuTFUsZT10LnJvd3Msbj10LmNvbHVtbnMsbz1uZXcgaXZ0KGUsbik7Zm9yKGxldCBpPTA7aTxlO2krKylmb3IobGV0IGU9MDtlPG47ZSsrKW8uc2V0KGksZSxpPmU/dC5nZXQoaSxlKTppPT09ZT8xOjApO3JldHVybiBvfWdldCB1cHBlclRyaWFuZ3VsYXJNYXRyaXgoKXtsZXQgdD10aGlzLkxVLGU9dC5yb3dzLG49dC5jb2x1bW5zLG89bmV3IGl2dChlLG4pO2ZvcihsZXQgaT0wO2k8ZTtpKyspZm9yKGxldCBlPTA7ZTxuO2UrKylvLnNldChpLGUsaTw9ZT90LmdldChpLGUpOjApO3JldHVybiBvfWdldCBwaXZvdFBlcm11dGF0aW9uVmVjdG9yKCl7cmV0dXJuIEFycmF5LmZyb20odGhpcy5waXZvdFZlY3Rvcil9fWZ1bmN0aW9uIGx2dCh0LGUpe2xldCBuPTA7cmV0dXJuIE1hdGguYWJzKHQpPk1hdGguYWJzKGUpPyhuPWUvdCxNYXRoLmFicyh0KSpNYXRoLnNxcnQoMStuKm4pKTowIT09ZT8obj10L2UsTWF0aC5hYnMoZSkqTWF0aC5zcXJ0KDErbipuKSk6MH1jbGFzcyBjdnR7Y29uc3RydWN0b3IodCl7bGV0IGUsbixvLGksYT0odD1ydnQuY2hlY2tNYXRyaXgodCkpLmNsb25lKCkscj10LnJvd3Mscz10LmNvbHVtbnMsbD1uZXcgRmxvYXQ2NEFycmF5KHMpO2ZvcihvPTA7bzxzO28rKyl7bGV0IHQ9MDtmb3IoZT1vO2U8cjtlKyspdD1sdnQodCxhLmdldChlLG8pKTtpZigwIT09dCl7Zm9yKGEuZ2V0KG8sbyk8MCYmKHQ9LXQpLGU9bztlPHI7ZSsrKWEuc2V0KGUsbyxhLmdldChlLG8pL3QpO2ZvcihhLnNldChvLG8sYS5nZXQobyxvKSsxKSxuPW8rMTtuPHM7bisrKXtmb3IoaT0wLGU9bztlPHI7ZSsrKWkrPWEuZ2V0KGUsbykqYS5nZXQoZSxuKTtmb3IoaT0taS9hLmdldChvLG8pLGU9bztlPHI7ZSsrKWEuc2V0KGUsbixhLmdldChlLG4pK2kqYS5nZXQoZSxvKSl9fWxbb109LXR9dGhpcy5RUj1hLHRoaXMuUmRpYWc9bH1zb2x2ZSh0KXt0PWl2dC5jaGVja01hdHJpeCh0KTtsZXQgZT10aGlzLlFSLG49ZS5yb3dzO2lmKHQucm93cyE9PW4pdGhyb3cgbmV3IEVycm9yKCJNYXRyaXggcm93IGRpbWVuc2lvbnMgbXVzdCBhZ3JlZSIpO2lmKCF0aGlzLmlzRnVsbFJhbmsoKSl0aHJvdyBuZXcgRXJyb3IoIk1hdHJpeCBpcyByYW5rIGRlZmljaWVudCIpO2xldCBvLGksYSxyLHM9dC5jb2x1bW5zLGw9dC5jbG9uZSgpLGM9ZS5jb2x1bW5zO2ZvcihhPTA7YTxjO2ErKylmb3IoaT0wO2k8cztpKyspe2ZvcihyPTAsbz1hO288bjtvKyspcis9ZS5nZXQobyxhKSpsLmdldChvLGkpO2ZvcihyPS1yL2UuZ2V0KGEsYSksbz1hO288bjtvKyspbC5zZXQobyxpLGwuZ2V0KG8saSkrciplLmdldChvLGEpKX1mb3IoYT1jLTE7YT49MDthLS0pe2ZvcihpPTA7aTxzO2krKylsLnNldChhLGksbC5nZXQoYSxpKS90aGlzLlJkaWFnW2FdKTtmb3Iobz0wO288YTtvKyspZm9yKGk9MDtpPHM7aSsrKWwuc2V0KG8saSxsLmdldChvLGkpLWwuZ2V0KGEsaSkqZS5nZXQobyxhKSl9cmV0dXJuIGwuc3ViTWF0cml4KDAsYy0xLDAscy0xKX1pc0Z1bGxSYW5rKCl7bGV0IHQ9dGhpcy5RUi5jb2x1bW5zO2ZvcihsZXQgZT0wO2U8dDtlKyspaWYoMD09PXRoaXMuUmRpYWdbZV0pcmV0dXJuITE7cmV0dXJuITB9Z2V0IHVwcGVyVHJpYW5ndWxhck1hdHJpeCgpe2xldCB0LGUsbj10aGlzLlFSLG89bi5jb2x1bW5zLGk9bmV3IGl2dChvLG8pO2Zvcih0PTA7dDxvO3QrKylmb3IoZT0wO2U8bztlKyspaS5zZXQodCxlLHQ8ZT9uLmdldCh0LGUpOnQ9PT1lP3RoaXMuUmRpYWdbdF06MCk7cmV0dXJuIGl9Z2V0IG9ydGhvZ29uYWxNYXRyaXgoKXtsZXQgdCxlLG4sbyxpPXRoaXMuUVIsYT1pLnJvd3Mscj1pLmNvbHVtbnMscz1uZXcgaXZ0KGEscik7Zm9yKG49ci0xO24+PTA7bi0tKXtmb3IodD0wO3Q8YTt0Kyspcy5zZXQodCxuLDApO2ZvcihzLnNldChuLG4sMSksZT1uO2U8cjtlKyspaWYoMCE9PWkuZ2V0KG4sbikpe2ZvcihvPTAsdD1uO3Q8YTt0Kyspbys9aS5nZXQodCxuKSpzLmdldCh0LGUpO2ZvcihvPS1vL2kuZ2V0KG4sbiksdD1uO3Q8YTt0Kyspcy5zZXQodCxlLHMuZ2V0KHQsZSkrbyppLmdldCh0LG4pKX19cmV0dXJuIHN9fWNsYXNzIGR2dHtjb25zdHJ1Y3Rvcih0LGU9e30pe2lmKCh0PXJ2dC5jaGVja01hdHJpeCh0KSkuaXNFbXB0eSgpKXRocm93IG5ldyBFcnJvcigiTWF0cml4IG11c3QgYmUgbm9uLWVtcHR5Iik7bGV0IG49dC5yb3dzLG89dC5jb2x1bW5zO2NvbnN0e2NvbXB1dGVMZWZ0U2luZ3VsYXJWZWN0b3JzOmk9ITAsY29tcHV0ZVJpZ2h0U2luZ3VsYXJWZWN0b3JzOmE9ITAsYXV0b1RyYW5zcG9zZTpyPSExfT1lO2xldCBzLGw9Qm9vbGVhbihpKSxjPUJvb2xlYW4oYSksZD0hMTtpZihuPG8paWYocil7cz10LnRyYW5zcG9zZSgpLG49cy5yb3dzLG89cy5jb2x1bW5zLGQ9ITA7bGV0IGU9bDtsPWMsYz1lfWVsc2Ugcz10LmNsb25lKCksY29uc29sZS53YXJuKCJDb21wdXRpbmcgU1ZEIG9uIGEgbWF0cml4IHdpdGggbW9yZSBjb2x1bW5zIHRoYW4gcm93cy4gQ29uc2lkZXIgZW5hYmxpbmcgYXV0b1RyYW5zcG9zZSIpO2Vsc2Ugcz10LmNsb25lKCk7bGV0IHA9TWF0aC5taW4obixvKSxtPU1hdGgubWluKG4rMSxvKSx1PW5ldyBGbG9hdDY0QXJyYXkobSksZj1uZXcgaXZ0KG4scCksZz1uZXcgaXZ0KG8sbyksaD1uZXcgRmxvYXQ2NEFycmF5KG8pLGI9bmV3IEZsb2F0NjRBcnJheShuKSx5PW5ldyBGbG9hdDY0QXJyYXkobSk7Zm9yKGxldCB0PTA7dDxtO3QrKyl5W3RdPXQ7bGV0IF89TWF0aC5taW4obi0xLG8pLEM9TWF0aC5tYXgoMCxNYXRoLm1pbihvLTIsbikpLE09TWF0aC5tYXgoXyxDKTtmb3IobGV0IHQ9MDt0PE07dCsrKXtpZih0PF8pe3VbdF09MDtmb3IobGV0IGU9dDtlPG47ZSsrKXVbdF09bHZ0KHVbdF0scy5nZXQoZSx0KSk7aWYoMCE9PXVbdF0pe3MuZ2V0KHQsdCk8MCYmKHVbdF09LXVbdF0pO2ZvcihsZXQgZT10O2U8bjtlKyspcy5zZXQoZSx0LHMuZ2V0KGUsdCkvdVt0XSk7cy5zZXQodCx0LHMuZ2V0KHQsdCkrMSl9dVt0XT0tdVt0XX1mb3IobGV0IGU9dCsxO2U8bztlKyspe2lmKHQ8XyYmMCE9PXVbdF0pe2xldCBvPTA7Zm9yKGxldCBpPXQ7aTxuO2krKylvKz1zLmdldChpLHQpKnMuZ2V0KGksZSk7bz0tby9zLmdldCh0LHQpO2ZvcihsZXQgaT10O2k8bjtpKyspcy5zZXQoaSxlLHMuZ2V0KGksZSkrbypzLmdldChpLHQpKX1oW2VdPXMuZ2V0KHQsZSl9aWYobCYmdDxfKWZvcihsZXQgZT10O2U8bjtlKyspZi5zZXQoZSx0LHMuZ2V0KGUsdCkpO2lmKHQ8Qyl7aFt0XT0wO2ZvcihsZXQgZT10KzE7ZTxvO2UrKyloW3RdPWx2dChoW3RdLGhbZV0pO2lmKDAhPT1oW3RdKXtoW3QrMV08MCYmKGhbdF09MC1oW3RdKTtmb3IobGV0IGU9dCsxO2U8bztlKyspaFtlXS89aFt0XTtoW3QrMV0rPTF9aWYoaFt0XT0taFt0XSx0KzE8biYmMCE9PWhbdF0pe2ZvcihsZXQgZT10KzE7ZTxuO2UrKyliW2VdPTA7Zm9yKGxldCBlPXQrMTtlPG47ZSsrKWZvcihsZXQgbj10KzE7bjxvO24rKyliW2VdKz1oW25dKnMuZ2V0KGUsbik7Zm9yKGxldCBlPXQrMTtlPG87ZSsrKXtsZXQgbz0taFtlXS9oW3QrMV07Zm9yKGxldCBpPXQrMTtpPG47aSsrKXMuc2V0KGksZSxzLmdldChpLGUpK28qYltpXSl9fWlmKGMpZm9yKGxldCBlPXQrMTtlPG87ZSsrKWcuc2V0KGUsdCxoW2VdKX19bGV0IHY9TWF0aC5taW4obyxuKzEpO2lmKF88byYmKHVbX109cy5nZXQoXyxfKSksbjx2JiYodVt2LTFdPTApLEMrMTx2JiYoaFtDXT1zLmdldChDLHYtMSkpLGhbdi0xXT0wLGwpe2ZvcihsZXQgdD1fO3Q8cDt0Kyspe2ZvcihsZXQgZT0wO2U8bjtlKyspZi5zZXQoZSx0LDApO2Yuc2V0KHQsdCwxKX1mb3IobGV0IHQ9Xy0xO3Q+PTA7dC0tKWlmKDAhPT11W3RdKXtmb3IobGV0IGU9dCsxO2U8cDtlKyspe2xldCBvPTA7Zm9yKGxldCBpPXQ7aTxuO2krKylvKz1mLmdldChpLHQpKmYuZ2V0KGksZSk7bz0tby9mLmdldCh0LHQpO2ZvcihsZXQgaT10O2k8bjtpKyspZi5zZXQoaSxlLGYuZ2V0KGksZSkrbypmLmdldChpLHQpKX1mb3IobGV0IGU9dDtlPG47ZSsrKWYuc2V0KGUsdCwtZi5nZXQoZSx0KSk7Zi5zZXQodCx0LDErZi5nZXQodCx0KSk7Zm9yKGxldCBlPTA7ZTx0LTE7ZSsrKWYuc2V0KGUsdCwwKX1lbHNle2ZvcihsZXQgZT0wO2U8bjtlKyspZi5zZXQoZSx0LDApO2Yuc2V0KHQsdCwxKX19aWYoYylmb3IobGV0IHQ9by0xO3Q+PTA7dC0tKXtpZih0PEMmJjAhPT1oW3RdKWZvcihsZXQgZT10KzE7ZTxvO2UrKyl7bGV0IG49MDtmb3IobGV0IGk9dCsxO2k8bztpKyspbis9Zy5nZXQoaSx0KSpnLmdldChpLGUpO249LW4vZy5nZXQodCsxLHQpO2ZvcihsZXQgaT10KzE7aTxvO2krKylnLnNldChpLGUsZy5nZXQoaSxlKStuKmcuZ2V0KGksdCkpfWZvcihsZXQgZT0wO2U8bztlKyspZy5zZXQoZSx0LDApO2cuc2V0KHQsdCwxKX1sZXQgeD12LTEsTz1OdW1iZXIuRVBTSUxPTjtmb3IoO3Y+MDspe2xldCB0LGU7Zm9yKHQ9di0yO3Q+PS0xJiYtMSE9PXQ7dC0tKXtjb25zdCBlPU51bWJlci5NSU5fVkFMVUUrTypNYXRoLmFicyh1W3RdK01hdGguYWJzKHVbdCsxXSkpO2lmKE1hdGguYWJzKGhbdF0pPD1lfHxOdW1iZXIuaXNOYU4oaFt0XSkpe2hbdF09MDticmVha319aWYodD09PXYtMillPTQ7ZWxzZXtsZXQgbjtmb3Iobj12LTE7bj49dCYmbiE9PXQ7bi0tKXtsZXQgZT0obiE9PXY/TWF0aC5hYnMoaFtuXSk6MCkrKG4hPT10KzE/TWF0aC5hYnMoaFtuLTFdKTowKTtpZihNYXRoLmFicyh1W25dKTw9TyplKXt1W25dPTA7YnJlYWt9fW49PT10P2U9MzpuPT09di0xP2U9MTooZT0yLHQ9bil9c3dpdGNoKHQrKyxlKXtjYXNlIDE6e2xldCBlPWhbdi0yXTtoW3YtMl09MDtmb3IobGV0IG49di0yO24+PXQ7bi0tKXtsZXQgaT1sdnQodVtuXSxlKSxhPXVbbl0vaSxyPWUvaTtpZih1W25dPWksbiE9PXQmJihlPS1yKmhbbi0xXSxoW24tMV09YSpoW24tMV0pLGMpZm9yKGxldCB0PTA7dDxvO3QrKylpPWEqZy5nZXQodCxuKStyKmcuZ2V0KHQsdi0xKSxnLnNldCh0LHYtMSwtcipnLmdldCh0LG4pK2EqZy5nZXQodCx2LTEpKSxnLnNldCh0LG4saSl9YnJlYWt9Y2FzZSAyOntsZXQgZT1oW3QtMV07aFt0LTFdPTA7Zm9yKGxldCBvPXQ7bzx2O28rKyl7bGV0IGk9bHZ0KHVbb10sZSksYT11W29dL2kscj1lL2k7aWYodVtvXT1pLGU9LXIqaFtvXSxoW29dPWEqaFtvXSxsKWZvcihsZXQgZT0wO2U8bjtlKyspaT1hKmYuZ2V0KGUsbykrcipmLmdldChlLHQtMSksZi5zZXQoZSx0LTEsLXIqZi5nZXQoZSxvKSthKmYuZ2V0KGUsdC0xKSksZi5zZXQoZSxvLGkpfWJyZWFrfWNhc2UgMzp7Y29uc3QgZT1NYXRoLm1heChNYXRoLmFicyh1W3YtMV0pLE1hdGguYWJzKHVbdi0yXSksTWF0aC5hYnMoaFt2LTJdKSxNYXRoLmFicyh1W3RdKSxNYXRoLmFicyhoW3RdKSksaT11W3YtMV0vZSxhPXVbdi0yXS9lLHI9aFt2LTJdL2Uscz11W3RdL2UsZD1oW3RdL2UscD0oKGEraSkqKGEtaSkrcipyKS8yLG09aSpyKihpKnIpO2xldCBiPTA7MD09PXAmJjA9PT1tfHwoYj1wPDA/MC1NYXRoLnNxcnQocCpwK20pOk1hdGguc3FydChwKnArbSksYj1tLyhwK2IpKTtsZXQgeT0ocytpKSoocy1pKStiLF89cypkO2ZvcihsZXQgZT10O2U8di0xO2UrKyl7bGV0IGk9bHZ0KHksXyk7MD09PWkmJihpPU51bWJlci5NSU5fVkFMVUUpO2xldCBhPXkvaSxyPV8vaTtpZihlIT09dCYmKGhbZS0xXT1pKSx5PWEqdVtlXStyKmhbZV0saFtlXT1hKmhbZV0tcip1W2VdLF89cip1W2UrMV0sdVtlKzFdPWEqdVtlKzFdLGMpZm9yKGxldCB0PTA7dDxvO3QrKylpPWEqZy5nZXQodCxlKStyKmcuZ2V0KHQsZSsxKSxnLnNldCh0LGUrMSwtcipnLmdldCh0LGUpK2EqZy5nZXQodCxlKzEpKSxnLnNldCh0LGUsaSk7aWYoaT1sdnQoeSxfKSwwPT09aSYmKGk9TnVtYmVyLk1JTl9WQUxVRSksYT15L2kscj1fL2ksdVtlXT1pLHk9YSpoW2VdK3IqdVtlKzFdLHVbZSsxXT0tcipoW2VdK2EqdVtlKzFdLF89cipoW2UrMV0saFtlKzFdPWEqaFtlKzFdLGwmJmU8bi0xKWZvcihsZXQgdD0wO3Q8bjt0KyspaT1hKmYuZ2V0KHQsZSkrcipmLmdldCh0LGUrMSksZi5zZXQodCxlKzEsLXIqZi5nZXQodCxlKSthKmYuZ2V0KHQsZSsxKSksZi5zZXQodCxlLGkpfWhbdi0yXT15O2JyZWFrfWNhc2UgNDppZih1W3RdPD0wJiYodVt0XT11W3RdPDA/LXVbdF06MCxjKSlmb3IobGV0IGU9MDtlPD14O2UrKylnLnNldChlLHQsLWcuZ2V0KGUsdCkpO2Zvcig7dDx4JiYhKHVbdF0+PXVbdCsxXSk7KXtsZXQgZT11W3RdO2lmKHVbdF09dVt0KzFdLHVbdCsxXT1lLGMmJnQ8by0xKWZvcihsZXQgbj0wO248bztuKyspZT1nLmdldChuLHQrMSksZy5zZXQobix0KzEsZy5nZXQobix0KSksZy5zZXQobix0LGUpO2lmKGwmJnQ8bi0xKWZvcihsZXQgbz0wO288bjtvKyspZT1mLmdldChvLHQrMSksZi5zZXQobyx0KzEsZi5nZXQobyx0KSksZi5zZXQobyx0LGUpO3QrK312LS19fWlmKGQpe2xldCB0PWc7Zz1mLGY9dH10aGlzLm09bix0aGlzLm49byx0aGlzLnM9dSx0aGlzLlU9Zix0aGlzLlY9Z31zb2x2ZSh0KXtsZXQgZT10LG49dGhpcy50aHJlc2hvbGQsbz10aGlzLnMubGVuZ3RoLGk9aXZ0Lnplcm9zKG8sbyk7Zm9yKGxldCB0PTA7dDxvO3QrKylNYXRoLmFicyh0aGlzLnNbdF0pPD1uP2kuc2V0KHQsdCwwKTppLnNldCh0LHQsMS90aGlzLnNbdF0pO2xldCBhPXRoaXMuVSxyPXRoaXMucmlnaHRTaW5ndWxhclZlY3RvcnMscz1yLm1tdWwoaSksbD1yLnJvd3MsYz1hLnJvd3MsZD1pdnQuemVyb3MobCxjKTtmb3IobGV0IHQ9MDt0PGw7dCsrKWZvcihsZXQgZT0wO2U8YztlKyspe2xldCBuPTA7Zm9yKGxldCBpPTA7aTxvO2krKyluKz1zLmdldCh0LGkpKmEuZ2V0KGUsaSk7ZC5zZXQodCxlLG4pfXJldHVybiBkLm1tdWwoZSl9c29sdmVGb3JEaWFnb25hbCh0KXtyZXR1cm4gdGhpcy5zb2x2ZShpdnQuZGlhZyh0KSl9aW52ZXJzZSgpe2xldCB0PXRoaXMuVixlPXRoaXMudGhyZXNob2xkLG49dC5yb3dzLG89dC5jb2x1bW5zLGk9bmV3IGl2dChuLHRoaXMucy5sZW5ndGgpO2ZvcihsZXQgYT0wO2E8bjthKyspZm9yKGxldCBuPTA7bjxvO24rKylNYXRoLmFicyh0aGlzLnNbbl0pPmUmJmkuc2V0KGEsbix0LmdldChhLG4pL3RoaXMuc1tuXSk7bGV0IGE9dGhpcy5VLHI9YS5yb3dzLHM9YS5jb2x1bW5zLGw9bmV3IGl2dChuLHIpO2ZvcihsZXQgdD0wO3Q8bjt0KyspZm9yKGxldCBlPTA7ZTxyO2UrKyl7bGV0IG49MDtmb3IobGV0IG89MDtvPHM7bysrKW4rPWkuZ2V0KHQsbykqYS5nZXQoZSxvKTtsLnNldCh0LGUsbil9cmV0dXJuIGx9Z2V0IGNvbmRpdGlvbigpe3JldHVybiB0aGlzLnNbMF0vdGhpcy5zW01hdGgubWluKHRoaXMubSx0aGlzLm4pLTFdfWdldCBub3JtMigpe3JldHVybiB0aGlzLnNbMF19Z2V0IHJhbmsoKXtsZXQgdD1NYXRoLm1heCh0aGlzLm0sdGhpcy5uKSp0aGlzLnNbMF0qTnVtYmVyLkVQU0lMT04sZT0wLG49dGhpcy5zO2ZvcihsZXQgbz0wLGk9bi5sZW5ndGg7bzxpO28rKyluW29dPnQmJmUrKztyZXR1cm4gZX1nZXQgZGlhZ29uYWwoKXtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnMpfWdldCB0aHJlc2hvbGQoKXtyZXR1cm4gTnVtYmVyLkVQU0lMT04vMipNYXRoLm1heCh0aGlzLm0sdGhpcy5uKSp0aGlzLnNbMF19Z2V0IGxlZnRTaW5ndWxhclZlY3RvcnMoKXtyZXR1cm4gdGhpcy5VfWdldCByaWdodFNpbmd1bGFyVmVjdG9ycygpe3JldHVybiB0aGlzLlZ9Z2V0IGRpYWdvbmFsTWF0cml4KCl7cmV0dXJuIGl2dC5kaWFnKHRoaXMucyl9fWZ1bmN0aW9uIHB2dCh0LGUsbixvLGkpe2xldCBhPWl2dC5leWUoZS5sZW5ndGgsZS5sZW5ndGgsbipvKm8pO2NvbnN0IHI9aShlKTtsZXQgcz1uZXcgRmxvYXQ2NEFycmF5KHQueC5sZW5ndGgpO2ZvcihsZXQgZT0wO2U8dC54Lmxlbmd0aDtlKyspc1tlXT1yKHQueFtlXSk7bGV0IGw9KGZ1bmN0aW9uIGModCxlLG4sbyxpKXtjb25zdCBhPW4ubGVuZ3RoLHI9dC54Lmxlbmd0aDtsZXQgcz1uZXcgQXJyYXkoYSk7Zm9yKGxldCBsPTA7bDxhO2wrKyl7c1tsXT1uZXcgQXJyYXkocik7bGV0IGE9bi5zbGljZSgpO2FbbF0rPW87bGV0IGM9aShhKTtmb3IobGV0IG49MDtuPHI7bisrKXNbbF1bbl09ZVtuXS1jKHQueFtuXSl9cmV0dXJuIG5ldyBpdnQocyl9KSh0LHMsZSxvLGkpLGQ9KGZ1bmN0aW9uIHAodCxlKXtjb25zdCBuPXQueC5sZW5ndGg7bGV0IG89bmV3IEFycmF5KG4pO2ZvcihsZXQgaT0wO2k8bjtpKyspb1tpXT1bdC55W2ldLWVbaV1dO3JldHVybiBuZXcgaXZ0KG8pfSkodCxzKSxtPShmdW5jdGlvbiB1KHQsZT0hMSl7cmV0dXJuIHQ9cnZ0LmNoZWNrTWF0cml4KHQpLGU/bmV3IGR2dCh0KS5pbnZlcnNlKCk6KGZ1bmN0aW9uIG4odCxlLG89ITEpe3JldHVybiB0PXJ2dC5jaGVja01hdHJpeCh0KSxlPXJ2dC5jaGVja01hdHJpeChlKSxvP25ldyBkdnQodCkuc29sdmUoZSk6dC5pc1NxdWFyZSgpP25ldyBzdnQodCkuc29sdmUoZSk6bmV3IGN2dCh0KS5zb2x2ZShlKX0pKHQsaXZ0LmV5ZSh0LnJvd3MpKX0pKGEuYWRkKGwubW11bChsLnRyYW5zcG9zZSgpKSkpO3JldHVybihlPShlPW5ldyBpdnQoW2VdKSkuc3ViKG0ubW11bChsKS5tbXVsKGQpLm11bChvKS50cmFuc3Bvc2UoKSkpLnRvMURBcnJheSgpfXZhciBtdnQ9JHYoT2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZGVmYXVsdDpmdW5jdGlvbiB1dnQodCxlLG49e30pe2xldHttYXhJdGVyYXRpb25zOm89MTAwLGdyYWRpZW50RGlmZmVyZW5jZTppPS4xLGRhbXBpbmc6YT0wLGVycm9yVG9sZXJhbmNlOnI9LjAxLG1pblZhbHVlczpzLG1heFZhbHVlczpsLGluaXRpYWxWYWx1ZXM6Y309bjtpZihhPD0wKXRocm93IG5ldyBFcnJvcigiVGhlIGRhbXBpbmcgb3B0aW9uIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiKTtpZighdC54fHwhdC55KXRocm93IG5ldyBFcnJvcigiVGhlIGRhdGEgcGFyYW1ldGVyIG11c3QgaGF2ZSB4IGFuZCB5IGVsZW1lbnRzIik7aWYoIU5NdCh0LngpfHx0LngubGVuZ3RoPDJ8fCFOTXQodC55KXx8dC55Lmxlbmd0aDwyKXRocm93IG5ldyBFcnJvcigiVGhlIGRhdGEgcGFyYW1ldGVyIGVsZW1lbnRzIG11c3QgYmUgYW4gYXJyYXkgd2l0aCBtb3JlIHRoYW4gMiBwb2ludHMiKTtpZih0LngubGVuZ3RoIT09dC55Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlRoZSBkYXRhIHBhcmFtZXRlciBlbGVtZW50cyBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSIpO2xldCBkPWN8fG5ldyBBcnJheShlLmxlbmd0aCkuZmlsbCgxKSxwPWQubGVuZ3RoO2lmKGw9bHx8bmV3IEFycmF5KHApLmZpbGwoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLHM9c3x8bmV3IEFycmF5KHApLmZpbGwoTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIpLGwubGVuZ3RoIT09cy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJtaW5WYWx1ZXMgYW5kIG1heFZhbHVlcyBtdXN0IGJlIHRoZSBzYW1lIHNpemUiKTtpZighTk10KGQpKXRocm93IG5ldyBFcnJvcigiaW5pdGlhbFZhbHVlcyBtdXN0IGJlIGFuIGFycmF5Iik7bGV0IG0sdT16TXQodCxkLGUpLGY9dTw9cjtmb3IobT0wO208byYmIWY7bSsrKXtkPXB2dCh0LGQsYSxpLGUpO2ZvcihsZXQgdD0wO3Q8cDt0KyspZFt0XT1NYXRoLm1pbihNYXRoLm1heChzW3RdLGRbdF0pLGxbdF0pO2lmKHU9ek10KHQsZCxlKSxpc05hTih1KSlicmVhaztmPXU8PXJ9cmV0dXJue3BhcmFtZXRlclZhbHVlczpkLHBhcmFtZXRlckVycm9yOnUsaXRlcmF0aW9uczptfX19KSksZnZ0PVF2JiZRdi5fX2F3YWl0ZXJ8fGZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiBuZXcobnx8KG49UHJvbWlzZSkpKChmdW5jdGlvbihpLGEpe2Z1bmN0aW9uIHIodCl7dHJ5e2woby5uZXh0KHQpKX1jYXRjaCh0KXthKHQpfX1mdW5jdGlvbiBzKHQpe3RyeXtsKG8udGhyb3codCkpfWNhdGNoKHQpe2EodCl9fWZ1bmN0aW9uIGwodCl7dC5kb25lP2kodC52YWx1ZSk6bmV3IG4oKGZ1bmN0aW9uKGUpe2UodC52YWx1ZSl9KSkudGhlbihyLHMpfWwoKG89by5hcHBseSh0LGV8fFtdKSkubmV4dCgpKX0pKX0sZ3Z0PVF2JiZRdi5fX2dlbmVyYXRvcnx8ZnVuY3Rpb24odCxlKXt2YXIgbixvLGksYSxyPXtsYWJlbDowLHNlbnQ6ZnVuY3Rpb24oKXtpZigxJmlbMF0pdGhyb3cgaVsxXTtyZXR1cm4gaVsxXX0sdHJ5czpbXSxvcHM6W119O3JldHVybiBhPXtuZXh0OnMoMCksdGhyb3c6cygxKSxyZXR1cm46cygyKX0sImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKGFbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSksYTtmdW5jdGlvbiBzKGEpe3JldHVybiBmdW5jdGlvbihzKXtyZXR1cm4oZnVuY3Rpb24gbChhKXtpZihuKXRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4iKTtmb3IoO3I7KXRyeXtpZihuPTEsbyYmKGk9MiZhWzBdP28ucmV0dXJuOmFbMF0/by50aHJvd3x8KChpPW8ucmV0dXJuKSYmaS5jYWxsKG8pLDApOm8ubmV4dCkmJiEoaT1pLmNhbGwobyxhWzFdKSkuZG9uZSlyZXR1cm4gaTtzd2l0Y2gobz0wLGkmJihhPVsyJmFbMF0saS52YWx1ZV0pLGFbMF0pe2Nhc2UgMDpjYXNlIDE6aT1hO2JyZWFrO2Nhc2UgNDpyZXR1cm4gci5sYWJlbCsrLHt2YWx1ZTphWzFdLGRvbmU6ITF9O2Nhc2UgNTpyLmxhYmVsKyssbz1hWzFdLGE9WzBdO2NvbnRpbnVlO2Nhc2UgNzphPXIub3BzLnBvcCgpLHIudHJ5cy5wb3AoKTtjb250aW51ZTtkZWZhdWx0OmlmKCEoKGk9KGk9ci50cnlzKS5sZW5ndGg+MCYmaVtpLmxlbmd0aC0xXSl8fDYhPT1hWzBdJiYyIT09YVswXSkpe3I9MDtjb250aW51ZX1pZigzPT09YVswXSYmKCFpfHxhWzFdPmlbMF0mJmFbMV08aVszXSkpe3IubGFiZWw9YVsxXTticmVha31pZig2PT09YVswXSYmci5sYWJlbDxpWzFdKXtyLmxhYmVsPWlbMV0saT1hO2JyZWFrfWlmKGkmJnIubGFiZWw8aVsyXSl7ci5sYWJlbD1pWzJdLHIub3BzLnB1c2goYSk7YnJlYWt9aVsyXSYmci5vcHMucG9wKCksci50cnlzLnBvcCgpO2NvbnRpbnVlfWE9ZS5jYWxsKHQscil9Y2F0Y2godCl7YT1bNix0XSxvPTB9ZmluYWxseXtuPWk9MH1pZig1JmFbMF0pdGhyb3cgYVsxXTtyZXR1cm57dmFsdWU6YVswXT9hWzFdOnZvaWQgMCxkb25lOiEwfX0pKFthLHNdKX19fSxodnQ9UXYmJlF2Ll9fcmVhZHx8ZnVuY3Rpb24odCxlKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0W1N5bWJvbC5pdGVyYXRvcl07aWYoIW4pcmV0dXJuIHQ7dmFyIG8saSxhPW4uY2FsbCh0KSxyPVtdO3RyeXtmb3IoOyh2b2lkIDA9PT1lfHxlLS0gPjApJiYhKG89YS5uZXh0KCkpLmRvbmU7KXIucHVzaChvLnZhbHVlKX1jYXRjaCh0KXtpPXtlcnJvcjp0fX1maW5hbGx5e3RyeXtvJiYhby5kb25lJiYobj1hLnJldHVybikmJm4uY2FsbChhKX1maW5hbGx5e2lmKGkpdGhyb3cgaS5lcnJvcn19cmV0dXJuIHJ9LGJ2dD1RdiYmUXYuX19zcHJlYWR8fGZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXQ9dC5jb25jYXQoaHZ0KGFyZ3VtZW50c1tlXSkpO3JldHVybiB0fSx5dnQ9UXYmJlF2Ll9faW1wb3J0U3Rhcnx8ZnVuY3Rpb24odCl7aWYodCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBlPXt9O2lmKG51bGwhPXQpZm9yKHZhciBuIGluIHQpT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGVbbl09dFtuXSk7cmV0dXJuIGUuZGVmYXVsdD10LGV9LF92dD1RdiYmUXYuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh1Q3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBDdnQ9eXZ0KGZDdCksTXZ0PXl2dChVQ3QpLHZ2dD15dnQoc010KSx4dnQ9eXZ0KGxNdCksT3Z0PXl2dChnQ3QpLFB2dD1fdnQobXZ0KSx3dnQ9MWUtNSxrdnQ9LjAwMSxTdnQ9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2b2lkIDA9PT10JiYodD17fSk7dmFyIGU9dGhpczt0aGlzLmxlYXJuaW5nUmF0ZT0xLHRoaXMubG9jYWxDb25uZWN0aXZpdHk9MSx0aGlzLm1pbkRpc3Q9LjEsdGhpcy5uQ29tcG9uZW50cz0yLHRoaXMubkVwb2Nocz0wLHRoaXMubk5laWdoYm9ycz0xNSx0aGlzLm5lZ2F0aXZlU2FtcGxlUmF0ZT01LHRoaXMucmFuZG9tPU1hdGgucmFuZG9tLHRoaXMucmVwdWxzaW9uU3RyZW5ndGg9MSx0aGlzLnNldE9wTWl4UmF0aW89MSx0aGlzLnNwcmVhZD0xLHRoaXMudHJhbnNmb3JtUXVldWVTaXplPTQsdGhpcy50YXJnZXRNZXRyaWM9ImNhdGVnb3JpY2FsIix0aGlzLnRhcmdldFdlaWdodD0uNSx0aGlzLnRhcmdldE5OZWlnaGJvcnM9dGhpcy5uTmVpZ2hib3JzLHRoaXMuZGlzdGFuY2VGbj1EdnQsdGhpcy5pc0luaXRpYWxpemVkPSExLHRoaXMucnBGb3Jlc3Q9W10sdGhpcy5lbWJlZGRpbmc9W10sdGhpcy5vcHRpbWl6YXRpb25TdGF0ZT1uZXcgUnZ0O3ZhciBuPWZ1bmN0aW9uKG4pe3ZvaWQgMCE9PXRbbl0mJihlW25dPXRbbl0pfTtuKCJkaXN0YW5jZUZuIiksbigibGVhcm5pbmdSYXRlIiksbigibG9jYWxDb25uZWN0aXZpdHkiKSxuKCJtaW5EaXN0IiksbigibkNvbXBvbmVudHMiKSxuKCJuRXBvY2hzIiksbigibk5laWdoYm9ycyIpLG4oIm5lZ2F0aXZlU2FtcGxlUmF0ZSIpLG4oInJhbmRvbSIpLG4oInJlcHVsc2lvblN0cmVuZ3RoIiksbigic2V0T3BNaXhSYXRpbyIpLG4oInNwcmVhZCIpLG4oInRyYW5zZm9ybVF1ZXVlU2l6ZSIpfXJldHVybiB0LnByb3RvdHlwZS5maXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW5pdGlhbGl6ZUZpdCh0KSx0aGlzLm9wdGltaXplTGF5b3V0KCksdGhpcy5lbWJlZGRpbmd9LHQucHJvdG90eXBlLmZpdEFzeW5jPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPWZ1bmN0aW9uKCl7cmV0dXJuITB9KSxmdnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbigpe3JldHVybiBndnQodGhpcywoZnVuY3Rpb24obil7c3dpdGNoKG4ubGFiZWwpe2Nhc2UgMDpyZXR1cm4gdGhpcy5pbml0aWFsaXplRml0KHQpLFs0LHRoaXMub3B0aW1pemVMYXlvdXRBc3luYyhlKV07Y2FzZSAxOnJldHVybiBuLnNlbnQoKSxbMix0aGlzLmVtYmVkZGluZ119fSkpfSkpfSx0LnByb3RvdHlwZS5zZXRTdXBlcnZpc2VkUHJvamVjdGlvbj1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPXt9KSx0aGlzLlk9dCx0aGlzLnRhcmdldE1ldHJpYz1lLnRhcmdldE1ldHJpY3x8dGhpcy50YXJnZXRNZXRyaWMsdGhpcy50YXJnZXRXZWlnaHQ9ZS50YXJnZXRXZWlnaHR8fHRoaXMudGFyZ2V0V2VpZ2h0LHRoaXMudGFyZ2V0Tk5laWdoYm9ycz1lLnRhcmdldE5OZWlnaGJvcnN8fHRoaXMudGFyZ2V0Tk5laWdoYm9yc30sdC5wcm90b3R5cGUuc2V0UHJlY29tcHV0ZWRLTk49ZnVuY3Rpb24odCxlKXt0aGlzLmtubkluZGljZXM9dCx0aGlzLmtubkRpc3RhbmNlcz1lfSx0LnByb3RvdHlwZS5pbml0aWFsaXplRml0PWZ1bmN0aW9uKHQpe2lmKHQubGVuZ3RoPD10aGlzLm5OZWlnaGJvcnMpdGhyb3cgbmV3IEVycm9yKCJOb3QgZW5vdWdoIGRhdGEgcG9pbnRzICgiK3QubGVuZ3RoKyIpIHRvIGNyZWF0ZSBuTmVpZ2hib3JzOiAiK3RoaXMubk5laWdoYm9ycysiLiAgQWRkIG1vcmUgZGF0YSBwb2ludHMgb3IgYWRqdXN0IHRoZSBjb25maWd1cmF0aW9uLiIpO2lmKHRoaXMuWD09PXQmJnRoaXMuaXNJbml0aWFsaXplZClyZXR1cm4gdGhpcy5nZXRORXBvY2hzKCk7aWYodGhpcy5YPXQsIXRoaXMua25uSW5kaWNlcyYmIXRoaXMua25uRGlzdGFuY2VzKXt2YXIgZT10aGlzLm5lYXJlc3ROZWlnaGJvcnModCk7dGhpcy5rbm5JbmRpY2VzPWUua25uSW5kaWNlcyx0aGlzLmtubkRpc3RhbmNlcz1lLmtubkRpc3RhbmNlc310aGlzLmdyYXBoPXRoaXMuZnV6enlTaW1wbGljaWFsU2V0KHQsdGhpcy5uTmVpZ2hib3JzLHRoaXMuc2V0T3BNaXhSYXRpbyksdGhpcy5tYWtlU2VhcmNoRm5zKCksdGhpcy5zZWFyY2hHcmFwaD10aGlzLm1ha2VTZWFyY2hHcmFwaCh0KSx0aGlzLnByb2Nlc3NHcmFwaEZvclN1cGVydmlzZWRQcm9qZWN0aW9uKCk7dmFyIG49dGhpcy5pbml0aWFsaXplU2ltcGxpY2lhbFNldEVtYmVkZGluZygpLG89bi50YWlsLGk9bi5lcG9jaHNQZXJTYW1wbGU7cmV0dXJuIHRoaXMub3B0aW1pemF0aW9uU3RhdGUuaGVhZD1uLmhlYWQsdGhpcy5vcHRpbWl6YXRpb25TdGF0ZS50YWlsPW8sdGhpcy5vcHRpbWl6YXRpb25TdGF0ZS5lcG9jaHNQZXJTYW1wbGU9aSx0aGlzLmluaXRpYWxpemVPcHRpbWl6YXRpb24oKSx0aGlzLnByZXBhcmVGb3JPcHRpbWl6YXRpb25Mb29wKCksdGhpcy5pc0luaXRpYWxpemVkPSEwLHRoaXMuZ2V0TkVwb2NocygpfSx0LnByb3RvdHlwZS5tYWtlU2VhcmNoRm5zPWZ1bmN0aW9uKCl7dmFyIHQ9dnZ0Lm1ha2VJbml0aWFsaXphdGlvbnModGhpcy5kaXN0YW5jZUZuKSxlPXQuaW5pdEZyb21SYW5kb207dGhpcy5pbml0RnJvbVRyZWU9dC5pbml0RnJvbVRyZWUsdGhpcy5pbml0RnJvbVJhbmRvbT1lLHRoaXMuc2VhcmNoPXZ2dC5tYWtlSW5pdGlhbGl6ZWROTlNlYXJjaCh0aGlzLmRpc3RhbmNlRm4pfSx0LnByb3RvdHlwZS5tYWtlU2VhcmNoR3JhcGg9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMua25uSW5kaWNlcyxuPXRoaXMua25uRGlzdGFuY2VzLG89bmV3IE12dC5TcGFyc2VNYXRyaXgoW10sW10sW10sW3QubGVuZ3RoLHQubGVuZ3RoXSksaT0wO2k8ZS5sZW5ndGg7aSsrKWZvcih2YXIgYT1lW2ldLHI9bltpXSxzPTA7czxhLmxlbmd0aDtzKyspe3ZhciBsPXJbc107bD4wJiZvLnNldChpLGFbc10sbCl9dmFyIGM9TXZ0LnRyYW5zcG9zZShvKTtyZXR1cm4gTXZ0Lm1heGltdW0obyxjKX0sdC5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLlg7aWYodm9pZCAwPT09bnx8MD09PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiTm8gZGF0YSBoYXMgYmVlbiBmaXQuIik7dmFyIG89TWF0aC5mbG9vcih0aGlzLm5OZWlnaGJvcnMqdGhpcy50cmFuc2Zvcm1RdWV1ZVNpemUpO289TWF0aC5taW4obi5sZW5ndGgsbyk7dmFyIGk9dnZ0LmluaXRpYWxpemVTZWFyY2godGhpcy5ycEZvcmVzdCxuLHQsbyx0aGlzLmluaXRGcm9tUmFuZG9tLHRoaXMuaW5pdEZyb21UcmVlLHRoaXMucmFuZG9tKSxhPXRoaXMuc2VhcmNoKG4sdGhpcy5zZWFyY2hHcmFwaCxpLHQpLHI9Q3Z0LmRlaGVhcFNvcnQoYSkscz1yLmluZGljZXMsbD1yLndlaWdodHM7cz1zLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuc2xpY2UoMCxlLm5OZWlnaGJvcnMpfSkpLGw9bC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnNsaWNlKDAsZS5uTmVpZ2hib3JzKX0pKTt2YXIgYz1NYXRoLm1heCgwLHRoaXMubG9jYWxDb25uZWN0aXZpdHktMSksZD10aGlzLnNtb290aEtOTkRpc3RhbmNlKGwsdGhpcy5uTmVpZ2hib3JzLGMpLHA9dGhpcy5jb21wdXRlTWVtYmVyc2hpcFN0cmVuZ3RocyhzLGwsZC5zaWdtYXMsZC5yaG9zKSxtPW5ldyBNdnQuU3BhcnNlTWF0cml4KHAucm93cyxwLmNvbHMscC52YWxzLFt0Lmxlbmd0aCxuLmxlbmd0aF0pLHU9TXZ0Lm5vcm1hbGl6ZShtLCJsMSIpLGY9TXZ0LmdldENTUih1KSxnPXQubGVuZ3RoLGg9SHZ0KE92dC5yZXNoYXBlMmQoZi5pbmRpY2VzLGcsdGhpcy5uTmVpZ2hib3JzKSxPdnQucmVzaGFwZTJkKGYudmFsdWVzLGcsdGhpcy5uTmVpZ2hib3JzKSx0aGlzLmVtYmVkZGluZyksYj10aGlzLm5FcG9jaHM/dGhpcy5uRXBvY2hzLzM6bS5uUm93czw9MWU0PzEwMDozMCx5PW0uZ2V0VmFsdWVzKCkucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBlPnQ/ZTp0fSksMCk7bT1tLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQ8eS9iPzA6dH0pKSxtPU12dC5lbGltaW5hdGVaZXJvcyhtKTt2YXIgXz10aGlzLm1ha2VFcG9jaHNQZXJTYW1wbGUobS5nZXRWYWx1ZXMoKSxiKSxDPW0uZ2V0Um93cygpLE09bS5nZXRDb2xzKCk7cmV0dXJuIHRoaXMuYXNzaWduT3B0aW1pemF0aW9uU3RhdGVQYXJhbWV0ZXJzKHtoZWFkRW1iZWRkaW5nOmgsdGFpbEVtYmVkZGluZzp0aGlzLmVtYmVkZGluZyxoZWFkOkMsdGFpbDpNLGN1cnJlbnRFcG9jaDowLG5FcG9jaHM6YixuVmVydGljZXM6bS5nZXREaW1zKClbMV0sZXBvY2hzUGVyU2FtcGxlOl99KSx0aGlzLnByZXBhcmVGb3JPcHRpbWl6YXRpb25Mb29wKCksdGhpcy5vcHRpbWl6ZUxheW91dCgpfSx0LnByb3RvdHlwZS5wcm9jZXNzR3JhcGhGb3JTdXBlcnZpc2VkUHJvamVjdGlvbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuWTtpZih0KXtpZih0Lmxlbmd0aCE9PXRoaXMuWC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJMZW5ndGggb2YgWCBhbmQgeSBtdXN0IGJlIGVxdWFsIik7ImNhdGVnb3JpY2FsIj09PXRoaXMudGFyZ2V0TWV0cmljJiYodGhpcy5ncmFwaD10aGlzLmNhdGVnb3JpY2FsU2ltcGxpY2lhbFNldEludGVyc2VjdGlvbih0aGlzLmdyYXBoLHQsdGhpcy50YXJnZXRXZWlnaHQ8MT8xLygxLXRoaXMudGFyZ2V0V2VpZ2h0KSoyLjU6MWUxMikpfX0sdC5wcm90b3R5cGUuc3RlcD1mdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW1pemF0aW9uU3RhdGUuY3VycmVudEVwb2NoO3JldHVybiB0PHRoaXMuZ2V0TkVwb2NocygpJiZ0aGlzLm9wdGltaXplTGF5b3V0U3RlcCh0KSx0aGlzLm9wdGltaXphdGlvblN0YXRlLmN1cnJlbnRFcG9jaH0sdC5wcm90b3R5cGUuZ2V0RW1iZWRkaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW1iZWRkaW5nfSx0LnByb3RvdHlwZS5uZWFyZXN0TmVpZ2hib3JzPWZ1bmN0aW9uKHQpe3ZhciBlLG49dGhpcy5uTmVpZ2hib3JzLG89dnZ0Lm1ha2VOTkRlc2NlbnQodGhpcy5kaXN0YW5jZUZuLHRoaXMucmFuZG9tKSxpPTUrTWF0aC5mbG9vciguNT09KGU9TWF0aC5wb3codC5sZW5ndGgsLjUpLzIwKT8wOk1hdGgucm91bmQoZSkpLGE9TWF0aC5tYXgoNSxNYXRoLmZsb29yKE1hdGgucm91bmQoKGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmxvZyh0KS9NYXRoLmxvZygyKX0pKHQubGVuZ3RoKSkpKTt0aGlzLnJwRm9yZXN0PXh2dC5tYWtlRm9yZXN0KHQsbixpLHRoaXMucmFuZG9tKTt2YXIgcj1vKHQseHZ0Lm1ha2VMZWFmQXJyYXkodGhpcy5ycEZvcmVzdCksbixhKTtyZXR1cm57a25uSW5kaWNlczpyLmluZGljZXMsa25uRGlzdGFuY2VzOnIud2VpZ2h0c319LHQucHJvdG90eXBlLmZ1enp5U2ltcGxpY2lhbFNldD1mdW5jdGlvbih0LGUsbil7dm9pZCAwPT09biYmKG49MSk7dmFyIG89dGhpcyxpPW8ua25uSW5kaWNlcyxhPXZvaWQgMD09PWk/W106aSxyPW8ua25uRGlzdGFuY2VzLHM9dm9pZCAwPT09cj9bXTpyLGw9dGhpcy5zbW9vdGhLTk5EaXN0YW5jZShzLGUsby5sb2NhbENvbm5lY3Rpdml0eSksYz10aGlzLmNvbXB1dGVNZW1iZXJzaGlwU3RyZW5ndGhzKGEscyxsLnNpZ21hcyxsLnJob3MpLGQ9bmV3IE12dC5TcGFyc2VNYXRyaXgoYy5yb3dzLGMuY29scyxjLnZhbHMsW3QubGVuZ3RoLHQubGVuZ3RoXSkscD1NdnQudHJhbnNwb3NlKGQpLG09TXZ0LnBhaXJ3aXNlTXVsdGlwbHkoZCxwKSx1PU12dC5zdWJ0cmFjdChNdnQuYWRkKGQscCksbSksZj1NdnQubXVsdGlwbHlTY2FsYXIodSxuKSxnPU12dC5tdWx0aXBseVNjYWxhcihtLDEtbik7cmV0dXJuIE12dC5hZGQoZixnKX0sdC5wcm90b3R5cGUuY2F0ZWdvcmljYWxTaW1wbGljaWFsU2V0SW50ZXJzZWN0aW9uPWZ1bmN0aW9uKHQsZSxuLG8pe3ZvaWQgMD09PW8mJihvPTEpO3ZhciBpPXp2dCh0LGUsbyxuKTtyZXR1cm4gSXZ0KGk9TXZ0LmVsaW1pbmF0ZVplcm9zKGkpKX0sdC5wcm90b3R5cGUuc21vb3RoS05ORGlzdGFuY2U9ZnVuY3Rpb24odCxlLG4sbyxpKXt2b2lkIDA9PT1uJiYobj0xKSx2b2lkIDA9PT1vJiYobz02NCksdm9pZCAwPT09aSYmKGk9MSk7Zm9yKHZhciBhPU1hdGgubG9nKGUpL01hdGgubG9nKDIpKmkscj1PdnQuemVyb3ModC5sZW5ndGgpLHM9T3Z0Lnplcm9zKHQubGVuZ3RoKSxsPTA7bDx0Lmxlbmd0aDtsKyspe3ZhciBjPTAsZD0xLzAscD0xLG09dFtsXSx1PW0uZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdD4wfSkpO2lmKHUubGVuZ3RoPj1uKXt2YXIgZj1NYXRoLmZsb29yKG4pLGc9bi1mO2Y+MD8ocltsXT11W2YtMV0sZz53dnQmJihyW2xdKz1nKih1W2ZdLXVbZi0xXSkpKTpyW2xdPWcqdVswXX1lbHNlIHUubGVuZ3RoPjAmJihyW2xdPU92dC5tYXgodSkpO2Zvcih2YXIgaD0wO2g8bztoKyspe2Zvcih2YXIgYj0wLHk9MTt5PHRbbF0ubGVuZ3RoO3krKyl7dmFyIF89dFtsXVt5XS1yW2xdO2IrPV8+MD9NYXRoLmV4cCgtXy9wKToxfWlmKE1hdGguYWJzKGItYSk8d3Z0KWJyZWFrO2I+YT9wPShjKyhkPXApKS8yOihjPXAsZD09PTEvMD9wKj0yOnA9KGMrZCkvMil9aWYoc1tsXT1wLHJbbF0+MCl7dmFyIEM9T3Z0Lm1lYW4obSk7c1tsXTxrdnQqQyYmKHNbbF09a3Z0KkMpfWVsc2V7dmFyIE09T3Z0Lm1lYW4odC5tYXAoT3Z0Lm1lYW4pKTtzW2xdPGt2dCpNJiYoc1tsXT1rdnQqTSl9fXJldHVybntzaWdtYXM6cyxyaG9zOnJ9fSx0LnByb3RvdHlwZS5jb21wdXRlTWVtYmVyc2hpcFN0cmVuZ3Rocz1mdW5jdGlvbih0LGUsbixvKXtmb3IodmFyIGk9dC5sZW5ndGgsYT10WzBdLmxlbmd0aCxyPU92dC56ZXJvcyhpKmEpLHM9T3Z0Lnplcm9zKGkqYSksbD1PdnQuemVyb3MoaSphKSxjPTA7YzxpO2MrKylmb3IodmFyIGQ9MDtkPGE7ZCsrKXt2YXIgcD0wOy0xIT09dFtjXVtkXSYmKHA9dFtjXVtkXT09PWM/MDplW2NdW2RdLW9bY108PTA/MTpNYXRoLmV4cCgtKGVbY11bZF0tb1tjXSkvbltjXSkscltjKmErZF09YyxzW2MqYStkXT10W2NdW2RdLGxbYyphK2RdPXApfXJldHVybntyb3dzOnIsY29sczpzLHZhbHM6bH19LHQucHJvdG90eXBlLmluaXRpYWxpemVTaW1wbGljaWFsU2V0RW1iZWRkaW5nPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMsZT10aGlzLmdldE5FcG9jaHMoKSxuPXRoaXMubkNvbXBvbmVudHMsbz10aGlzLmdyYXBoLmdldFZhbHVlcygpLGk9MCxhPTA7YTxvLmxlbmd0aDthKyspaTxvW2FdJiYoaT1vW2FdKTt2YXIgcj10aGlzLmdyYXBoLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQ8aS9lPzA6dH0pKTt0aGlzLmVtYmVkZGluZz1PdnQuemVyb3Moci5uUm93cykubWFwKChmdW5jdGlvbigpe3JldHVybiBPdnQuemVyb3MobikubWFwKChmdW5jdGlvbigpe3JldHVybiAyMCpPdnQudGF1UmFuZCh0LnJhbmRvbSktMTB9KSl9KSk7dmFyIHM9W10sbD1bXSxjPVtdLGQ9ci5nZXRBbGwoKTtmb3IoYT0wO2E8ZC5sZW5ndGg7YSsrKXt2YXIgcD1kW2FdO3AudmFsdWUmJihzLnB1c2gocC52YWx1ZSksYy5wdXNoKHAucm93KSxsLnB1c2gocC5jb2wpKX1yZXR1cm57aGVhZDpsLHRhaWw6YyxlcG9jaHNQZXJTYW1wbGU6dGhpcy5tYWtlRXBvY2hzUGVyU2FtcGxlKHMsZSl9fSx0LnByb3RvdHlwZS5tYWtlRXBvY2hzUGVyU2FtcGxlPWZ1bmN0aW9uKHQsZSl7dmFyIG49T3Z0LmZpbGxlZCh0Lmxlbmd0aCwtMSksbz1PdnQubWF4KHQpLGk9dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0L28qZX0pKTtyZXR1cm4gaS5mb3JFYWNoKChmdW5jdGlvbih0LG8pe3Q+MCYmKG5bb109ZS9pW29dKX0pKSxufSx0LnByb3RvdHlwZS5hc3NpZ25PcHRpbWl6YXRpb25TdGF0ZVBhcmFtZXRlcnM9ZnVuY3Rpb24odCl7T2JqZWN0LmFzc2lnbih0aGlzLm9wdGltaXphdGlvblN0YXRlLHQpfSx0LnByb3RvdHlwZS5wcmVwYXJlRm9yT3B0aW1pemF0aW9uTG9vcD1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10LnJlcHVsc2lvblN0cmVuZ3RoLG49dC5sZWFybmluZ1JhdGUsbz10Lm5lZ2F0aXZlU2FtcGxlUmF0ZSxpPXRoaXMub3B0aW1pemF0aW9uU3RhdGUsYT1pLmVwb2Noc1BlclNhbXBsZSxyPWkuaGVhZEVtYmVkZGluZyxzPXJbMF0ubGVuZ3RoLGw9ci5sZW5ndGg9PT1pLnRhaWxFbWJlZGRpbmcubGVuZ3RoLGM9YS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0L299KSksZD1idnQoYykscD1idnQoYSk7dGhpcy5hc3NpZ25PcHRpbWl6YXRpb25TdGF0ZVBhcmFtZXRlcnMoe2Vwb2NoT2ZOZXh0U2FtcGxlOnAsZXBvY2hPZk5leHROZWdhdGl2ZVNhbXBsZTpkLGVwb2Noc1Blck5lZ2F0aXZlU2FtcGxlOmMsbW92ZU90aGVyOmwsaW5pdGlhbEFscGhhOm4sYWxwaGE6bixnYW1tYTplLGRpbTpzfSl9LHQucHJvdG90eXBlLmluaXRpYWxpemVPcHRpbWl6YXRpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVtYmVkZGluZyxlPXRoaXMuZW1iZWRkaW5nLG49dGhpcy5vcHRpbWl6YXRpb25TdGF0ZSxvPW4uaGVhZCxpPW4udGFpbCxhPW4uZXBvY2hzUGVyU2FtcGxlLHI9dGhpcy5nZXRORXBvY2hzKCkscz10aGlzLmdyYXBoLm5Db2xzLGw9TnZ0KHRoaXMuc3ByZWFkLHRoaXMubWluRGlzdCk7dGhpcy5hc3NpZ25PcHRpbWl6YXRpb25TdGF0ZVBhcmFtZXRlcnMoe2hlYWRFbWJlZGRpbmc6dCx0YWlsRW1iZWRkaW5nOmUsaGVhZDpvLHRhaWw6aSxlcG9jaHNQZXJTYW1wbGU6YSxhOmwuYSxiOmwuYixuRXBvY2hzOnIsblZlcnRpY2VzOnN9KX0sdC5wcm90b3R5cGUub3B0aW1pemVMYXlvdXRTdGVwPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLm9wdGltaXphdGlvblN0YXRlLG49ZS5oZWFkLG89ZS50YWlsLGk9ZS5oZWFkRW1iZWRkaW5nLGE9ZS50YWlsRW1iZWRkaW5nLHI9ZS5lcG9jaHNQZXJTYW1wbGUscz1lLmVwb2NoT2ZOZXh0U2FtcGxlLGw9ZS5lcG9jaE9mTmV4dE5lZ2F0aXZlU2FtcGxlLGM9ZS5lcG9jaHNQZXJOZWdhdGl2ZVNhbXBsZSxkPWUubW92ZU90aGVyLHA9ZS5pbml0aWFsQWxwaGEsbT1lLmFscGhhLHU9ZS5nYW1tYSxmPWUuYSxnPWUuYixoPWUuZGltLGI9ZS5uRXBvY2hzLHk9ZS5uVmVydGljZXMsXz0wO188ci5sZW5ndGg7XysrKWlmKCEoc1tfXT50KSl7dmFyIEM9bltfXSxNPWlbQ10sdj1hW29bX11dLHg9VHZ0KE0sdiksTz0wO3g+MCYmKE89LTIqZipnKk1hdGgucG93KHgsZy0xKSxPLz1mKk1hdGgucG93KHgsZykrMSk7Zm9yKHZhciBQPTA7UDxoO1ArKyl7dmFyIHc9QXZ0KE8qKE1bUF0tdltQXSksNCk7TVtQXSs9dyptLGQmJih2W1BdKz0tdyptKX1zW19dKz1yW19dO2Zvcih2YXIgaz1NYXRoLmZsb29yKCh0LWxbX10pL2NbX10pLFM9MDtTPGs7UysrKXt2YXIgRD1PdnQudGF1UmFuZEludCh5LHRoaXMucmFuZG9tKSxFPWFbRF0sUj1UdnQoTSxFKSxBPTA7aWYoUj4wKUE9Mip1KmcsQS89KC4wMDErUikqKGYqTWF0aC5wb3coUixnKSsxKTtlbHNlIGlmKEM9PT1EKWNvbnRpbnVlO2ZvcihQPTA7UDxoO1ArKyl3PTQsQT4wJiYodz1BdnQoQSooTVtQXS1FW1BdKSw0KSksTVtQXSs9dyptfWxbX10rPWsqY1tfXX1yZXR1cm4gZS5hbHBoYT1wKigxLXQvYiksZS5jdXJyZW50RXBvY2grPTEsaX0sdC5wcm90b3R5cGUub3B0aW1pemVMYXlvdXRBc3luYz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiB2b2lkIDA9PT10JiYodD1mdW5jdGlvbigpe3JldHVybiEwfSksbmV3IFByb21pc2UoKGZ1bmN0aW9uKG4sbyl7dmFyIGk9ZnVuY3Rpb24oKXtyZXR1cm4gZnZ0KGUsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24oKXt2YXIgZSxhLHIscyxsO3JldHVybiBndnQodGhpcywoZnVuY3Rpb24oYyl7dHJ5e2lmKGE9KGU9dGhpcy5vcHRpbWl6YXRpb25TdGF0ZSkubkVwb2Nocyx0aGlzLmVtYmVkZGluZz10aGlzLm9wdGltaXplTGF5b3V0U3RlcChlLmN1cnJlbnRFcG9jaCkscz0hMT09PXQocj10aGlzLm9wdGltaXphdGlvblN0YXRlLmN1cnJlbnRFcG9jaCksbD1yPT09YSxzfHxsKXJldHVyblsyLG4obCldO3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cmV0dXJuIGkoKX0pLDApfWNhdGNoKHQpe28odCl9cmV0dXJuWzJdfSkpfSkpfTtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3JldHVybiBpKCl9KSwwKX0pKX0sdC5wcm90b3R5cGUub3B0aW1pemVMYXlvdXQ9ZnVuY3Rpb24odCl7dm9pZCAwPT09dCYmKHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH0pO2Zvcih2YXIgZT0hMSxuPVtdOyFlOyl7dmFyIG89dGhpcy5vcHRpbWl6YXRpb25TdGF0ZSxpPW8ubkVwb2NocztuPXRoaXMub3B0aW1pemVMYXlvdXRTdGVwKG8uY3VycmVudEVwb2NoKTt2YXIgYT10aGlzLm9wdGltaXphdGlvblN0YXRlLmN1cnJlbnRFcG9jaCxyPSExPT09dChhKTtlPWE9PT1pfHxyfXJldHVybiBufSx0LnByb3RvdHlwZS5nZXRORXBvY2hzPWZ1bmN0aW9uKCl7aWYodGhpcy5uRXBvY2hzPjApcmV0dXJuIHRoaXMubkVwb2Noczt2YXIgdD10aGlzLmdyYXBoLm5Sb3dzO3JldHVybiB0PD0yNTAwPzUwMDp0PD01ZTM/NDAwOnQ8PTc1MDA/MzAwOjIwMH0sdH0pKCk7ZnVuY3Rpb24gRHZ0KHQsZSl7Zm9yKHZhciBuPTAsbz0wO288dC5sZW5ndGg7bysrKW4rPU1hdGgucG93KHRbb10tZVtvXSwyKTtyZXR1cm4gTWF0aC5zcXJ0KG4pfXVDdC5VTUFQPVN2dCx1Q3QuZXVjbGlkZWFuPUR2dCx1Q3QuY29zaW5lPWZ1bmN0aW9uIEV2dCh0LGUpe2Zvcih2YXIgbj0wLG89MCxpPTAsYT0wO2E8dC5sZW5ndGg7YSsrKW4rPXRbYV0qZVthXSxvKz1NYXRoLnBvdyh0W2FdLDIpLGkrPU1hdGgucG93KGVbYV0sMik7cmV0dXJuIDA9PT1vJiYwPT09aT8wOjA9PT1vfHwwPT09aT8xOjEtbi9NYXRoLnNxcnQobyppKX07dmFyIFJ2dD1mdW5jdGlvbiBSdnQoKXt0aGlzLmN1cnJlbnRFcG9jaD0wLHRoaXMuaGVhZEVtYmVkZGluZz1bXSx0aGlzLnRhaWxFbWJlZGRpbmc9W10sdGhpcy5oZWFkPVtdLHRoaXMudGFpbD1bXSx0aGlzLmVwb2Noc1BlclNhbXBsZT1bXSx0aGlzLmVwb2NoT2ZOZXh0U2FtcGxlPVtdLHRoaXMuZXBvY2hPZk5leHROZWdhdGl2ZVNhbXBsZT1bXSx0aGlzLmVwb2Noc1Blck5lZ2F0aXZlU2FtcGxlPVtdLHRoaXMubW92ZU90aGVyPSEwLHRoaXMuaW5pdGlhbEFscGhhPTEsdGhpcy5hbHBoYT0xLHRoaXMuZ2FtbWE9MSx0aGlzLmE9MS41NzY5NDM0NjAzMTEzMDc3LHRoaXMuYj0uODk1MDYwODc3OTEwOTczMyx0aGlzLmRpbT0yLHRoaXMubkVwb2Nocz01MDAsdGhpcy5uVmVydGljZXM9MH07ZnVuY3Rpb24gQXZ0KHQsZSl7cmV0dXJuIHQ+ZT9lOnQ8LWU/LWU6dH1mdW5jdGlvbiBUdnQodCxlKXtmb3IodmFyIG49MCxvPTA7bzx0Lmxlbmd0aDtvKyspbis9TWF0aC5wb3codFtvXS1lW29dLDIpO3JldHVybiBufWZ1bmN0aW9uIE52dCh0LGUpe3ZhciBuPU92dC5saW5lYXIoMCwzKnQsMzAwKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0PGU/MTp0fSkpLG89T3Z0Lnplcm9zKG4ubGVuZ3RoKS5tYXAoKGZ1bmN0aW9uKG8saSl7cmV0dXJuIG5baV0+PWU/TWF0aC5leHAoLShuW2ldLWUpL3QpOm99KSksaT1QdnQuZGVmYXVsdCh7eDpuLHk6b30sKGZ1bmN0aW9uKHQpe3ZhciBlPWh2dCh0LDIpLG49ZVswXSxvPWVbMV07cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiAxLygxK24qTWF0aC5wb3codCwyKm8pKX19KSx7ZGFtcGluZzoxLjUsaW5pdGlhbFZhbHVlczpbLjUsLjVdLGdyYWRpZW50RGlmZmVyZW5jZTouMSxtYXhJdGVyYXRpb25zOjEwMCxlcnJvclRvbGVyYW5jZTouMDF9KS5wYXJhbWV0ZXJWYWx1ZXMsYT1odnQoaSwyKTtyZXR1cm57YTphWzBdLGI6YVsxXX19ZnVuY3Rpb24genZ0KHQsZSxuLG8pe3JldHVybiB2b2lkIDA9PT1uJiYobj0xKSx2b2lkIDA9PT1vJiYobz01KSx0Lm1hcCgoZnVuY3Rpb24odCxpLGEpe3JldHVybi0xPT09ZVtpXXx8LTE9PT1lW2FdP3QqTWF0aC5leHAoLW4pOmVbaV0hPT1lW2FdP3QqTWF0aC5leHAoLW8pOnR9KSl9ZnVuY3Rpb24gSXZ0KHQpe3Q9TXZ0Lm5vcm1hbGl6ZSh0LCJtYXgiKTt2YXIgZT1NdnQudHJhbnNwb3NlKHQpLG49TXZ0LnBhaXJ3aXNlTXVsdGlwbHkoZSx0KTtyZXR1cm4gdD1NdnQuYWRkKHQsTXZ0LnN1YnRyYWN0KGUsbikpLE12dC5lbGltaW5hdGVaZXJvcyh0KX1mdW5jdGlvbiBIdnQodCxlLG4pe2Zvcih2YXIgbz1PdnQuemVyb3ModC5sZW5ndGgpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIE92dC56ZXJvcyhuWzBdLmxlbmd0aCl9KSksaT0wO2k8dC5sZW5ndGg7aSsrKWZvcih2YXIgYT0wO2E8dFswXS5sZW5ndGg7YSsrKWZvcih2YXIgcj0wO3I8blswXS5sZW5ndGg7cisrKW9baV1bcl0rPWVbaV1bYV0qblt0W2ldW2FdXVtyXTtyZXR1cm4gb31mdW5jdGlvbiBGdnQodCl7bGV0IGUsbixvPXQubGVuZ3RoO2Zvcig7bzspbj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqby0tKSxlPXRbb10sdFtvXT10W25dLHRbbl09ZTtyZXR1cm4gdH1mdW5jdGlvbiBMdnQodCxlKXtyZXR1cm5gJHtlfS8ke3R9YH11Q3QuZmluZEFCUGFyYW1zPU52dCx1Q3QuZmFzdEludGVyc2VjdGlvbj16dnQsdUN0LnJlc2V0TG9jYWxDb25uZWN0aXZpdHk9SXZ0LHVDdC5pbml0VHJhbnNmb3JtPUh2dCxPYmplY3QuZGVmaW5lUHJvcGVydHkobUN0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxtQ3QuVU1BUD11Q3QuVU1BUDtjbGFzcyBCdnR7Y29uc3RydWN0b3IodCl7dGhpcy5odHRwPXQsdGhpcy5odHRwUGF0aFByZWZpeD0iZGF0YS9wbHVnaW4vbnBtaSJ9ZmV0Y2hEYXRhKHQpe3JldHVybiAkdCh0aGlzLmZldGNoQW5ub3RhdGlvbnModCksdGhpcy5mZXRjaE1ldHJpY3ModCksdGhpcy5mZXRjaFZhbHVlcyh0KSx0aGlzLmZldGNoRW1iZWRkaW5ncyh0KSkucGlwZShJdCgoKFt0LGUsbixvXSk9Pntjb25zdCBpPXt9LGE9e307bGV0IHIscz0wO2Zvcihjb25zdCByIG9mIE9iamVjdC5rZXlzKHQpKWZvcihjb25zdCBsIGluIHRbcl0pe2NvbnN0IGM9dFtyXVtsXTtPYmplY3Qua2V5cyhvKS5sZW5ndGgmJiFhW2NdJiZvW3JdW2xdJiZvW3JdW2xdLnNvbWUoKHQ9PjAhPT10KSkmJihhW2NdPXt2ZWN0b3I6b1tyXVtsXSxpbmRleDpzLG5hbWU6Y30scys9MSk7Y29uc3QgZD1uZXcgTWFwO2Zvcihjb25zdCB0IGluIGVbcl0pe2NvbnN0IG89ZVtyXVt0XSxpPW55dChvKTtsZXQgYT1kLmdldChpKTthfHwoYT17blBNSVZhbHVlOm51bGwsY291bnRWYWx1ZTpudWxsLGFubm90YXRpb246YyxtZXRyaWM6aSxydW46cn0sZC5zZXQoaSxhKSksJGJ0KG8pP2EuY291bnRWYWx1ZT1uW3JdW2xdW3RdOnR5dChvKSYmKGEublBNSVZhbHVlPW5bcl1bbF1bdF0pfWlbY109Wy4uLmlbY10/aVtjXTpbXSwuLi5kLnZhbHVlcygpXX1yZXR1cm4gT2JqZWN0LmtleXMoYSkubGVuZ3RoJiYocj0oZnVuY3Rpb24gbCh0KXtjb25zdCBlPU9iamVjdC5rZXlzKHQpO3JldHVybntwb2ludHM6dCxwb2ludEtleXM6ZSxzaHVmZmxlZERhdGFJbmRpY2VzOkZ2dCgobj1lLmxlbmd0aCxbLi4ubmV3IEFycmF5KG4pXS5tYXAoKCh0LGUpPT5lKSkpKSxoYXNVbWFwUnVuOiExfTt2YXIgbn0pKGEpKSx7YW5ub3RhdGlvbkRhdGE6aSxtZXRyaWNzOmUsZW1iZWRkaW5nRGF0YVNldDpyfX0pKSxwZSgodD0+dCBpbnN0YW5jZW9mIHhEJiY0MDA8PXQuc3RhdHVzJiZ0LnN0YXR1czw1MDA/RXQoe2Fubm90YXRpb25EYXRhOnt9LG1ldHJpY3M6e30sZW1iZWRkaW5nRGF0YVNldDp2b2lkIDB9KTpSdCh0KSkpKX1mZXRjaEFubm90YXRpb25zKHQpe3JldHVybiAkdCh0Lm1hcCgodD0+dGhpcy5odHRwLmdldChgL2V4cGVyaW1lbnQvJHt0fS8ke3RoaXMuaHR0cFBhdGhQcmVmaXh9L2Fubm90YXRpb25zYCkucGlwZShJdCgoZT0+KGZ1bmN0aW9uIG4odCxlKXtyZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHQpLm1hcCgoKFt0LG5dKT0+W0x2dCh0LGUpLG5dKSkpfSkoZSx0KSkpKSkpKS5waXBlKEl0KCh0PT57bGV0IGU9e307Zm9yKGNvbnN0IG4gb2YgdCllPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSxuKTtyZXR1cm4gZX0pKSl9ZmV0Y2hNZXRyaWNzKHQpe3JldHVybiAkdCh0Lm1hcCgodD0+dGhpcy5odHRwLmdldChgL2V4cGVyaW1lbnQvJHt0fS8ke3RoaXMuaHR0cFBhdGhQcmVmaXh9L21ldHJpY3NgKS5waXBlKEl0KChlPT4oZnVuY3Rpb24gbih0LGUpe3JldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModCkubWFwKCgoW3Qsbl0pPT5bTHZ0KHQsZSksbl0pKSl9KShlLHQpKSkpKSkpLnBpcGUoSXQoKHQ9PntsZXQgZT17fTtmb3IoY29uc3QgbiBvZiB0KWU9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLG4pO3JldHVybiBlfSkpKX1mZXRjaFZhbHVlcyh0KXtyZXR1cm4gJHQodC5tYXAoKHQ9PnRoaXMuaHR0cC5nZXQoYC9leHBlcmltZW50LyR7dH0vJHt0aGlzLmh0dHBQYXRoUHJlZml4fS92YWx1ZXNgKS5waXBlKEl0KChlPT4oZnVuY3Rpb24gbih0LGUpe3JldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModCkubWFwKCgoW3Qsbl0pPT5bTHZ0KHQsZSksbl0pKSl9KShlLHQpKSkpKSkpLnBpcGUoSXQoKHQ9PntsZXQgZT17fTtmb3IoY29uc3QgbiBvZiB0KWU9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLG4pO3JldHVybiBlfSkpKX1mZXRjaEVtYmVkZGluZ3ModCl7cmV0dXJuICR0KHQubWFwKCh0PT50aGlzLmh0dHAuZ2V0KGAvZXhwZXJpbWVudC8ke3R9LyR7dGhpcy5odHRwUGF0aFByZWZpeH0vZW1iZWRkaW5nc2ApLnBpcGUoSXQoKGU9PihmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyh0KS5tYXAoKChbdCxuXSk9PltMdnQodCxlKSxuXSkpKX0pKGUsdCkpKSkpKSkucGlwZShJdCgodD0+e2xldCBlPXt9O2Zvcihjb25zdCBuIG9mIHQpZT1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSksbik7cmV0dXJuIGV9KSkpfX1CdnQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fEJ2dCkodnIobEUpKX0sQnZ0Lsm1cHJvdj1Nbih7dG9rZW46QnZ0LGZhY3Rvcnk6QnZ0Lsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChCdnQsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmxFfV19KSxudWxsKTtjbGFzcyBWdnR7fVZ2dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VnZ0KX0sVnZ0Lsm1bW9kPWFvKHt0eXBlOlZ2dH0pLFZ2dC7JtWluaj12bih7cHJvdmlkZXJzOltCdnRdLGltcG9ydHM6W1tjRV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChWdnQsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltjRV0scHJvdmlkZXJzOltCdnRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oVnZ0LHtpbXBvcnRzOltjRV19KTtjbGFzcyBqdnR7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuYWN0aW9ucyQ9dCx0aGlzLnN0b3JlPWUsdGhpcy5kYXRhU291cmNlPW4sdGhpcy5sb2FkRGF0YSQ9TWsoKCgpPT5yZSh0aGlzLmxvYWRQbHVnaW5EYXRhKCkpLnBpcGUoSXQoKCgpPT4oe30pKSkpKSx7ZGlzcGF0Y2g6ITF9KX1sb2FkUGx1Z2luRGF0YSgpe3JldHVybiB0aGlzLmFjdGlvbnMkLnBpcGUoRGsoa2J0KSxWZSh0aGlzLnN0b3JlLnNlbGVjdChhYnQpLHRoaXMuc3RvcmUuc2VsZWN0KFRTKSksY2UoKChbLHQsZV0pPT50IT09eUUuTE9BRElORyYmbnVsbCE9PWUpKSxGZSgoKCk9PnRoaXMuc3RvcmUuZGlzcGF0Y2goU2J0KCkpKSksWnQoKChbLCx0XSk9PnRoaXMuZGF0YVNvdXJjZS5mZXRjaERhdGEodCkucGlwZShGZSgodD0+e3RoaXMuc3RvcmUuZGlzcGF0Y2goRGJ0KHQpKX0pKSxJdCgoKCk9Pnt9KSkscGUoKCgpPT4odGhpcy5zdG9yZS5kaXNwYXRjaChFYnQoKSkscnQpKSkpKSkpfX1qdnQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGp2dCkodnIoU2spLHZyKEl3KSx2cihCdnQpKX0sanZ0Lsm1cHJvdj1Nbih7dG9rZW46anZ0LGZhY3Rvcnk6anZ0Lsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChqdnQsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOlNrfSx7dHlwZTpJd30se3R5cGU6QnZ0fV19KSxudWxsKTtjbGFzcyBVdnR7fVV2dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8VXZ0KX0sVXZ0Lsm1bW9kPWFvKHt0eXBlOlV2dH0pLFV2dC7JtWluaj12bih7fSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChVdnQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W29idF0sZXhwb3J0czpbb2J0XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFV2dCx7ZGVjbGFyYXRpb25zOltvYnRdLGV4cG9ydHM6W29idF19KTtjbGFzcyBHdnR7fUd2dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8R3Z0KX0sR3Z0Lsm1bW9kPWFvKHt0eXBlOkd2dH0pLEd2dC7JtWluaj12bih7aW1wb3J0czpbW1dNLEVXLEJZLFkwXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEd2dCxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbc3l0LGx5dF0saW1wb3J0czpbV00sRVcsQlksWTBdLGV4cG9ydHM6W2x5dF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhHdnQse2RlY2xhcmF0aW9uczpbc3l0LGx5dF0saW1wb3J0czpbV00sRVcsQlksWTBdLGV4cG9ydHM6W2x5dF19KTtjbGFzcyBXdnR7fVd2dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8V3Z0KX0sV3Z0Lsm1bW9kPWFvKHt0eXBlOld2dH0pLFd2dC7JtWluaj12bih7aW1wb3J0czpbW1dNLGNHLGRHLEVXLEV5dCxWUV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChXdnQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W3p5dCxJeXRdLGltcG9ydHM6W1dNLGNHLGRHLEVXLEV5dCxWUV0sZXhwb3J0czpbSXl0XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFd2dCx7ZGVjbGFyYXRpb25zOlt6eXQsSXl0XSxpbXBvcnRzOltXTSxjRyxkRyxFVyxFeXQsVlFdLGV4cG9ydHM6W0l5dF19KTtjbGFzcyBZdnR7fVl2dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WXZ0KX0sWXZ0Lsm1bW9kPWFvKHt0eXBlOll2dH0pLFl2dC7JtWluaj12bih7aW1wb3J0czpbW1dNLEV5dF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChZdnQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W0h5dF0saW1wb3J0czpbV00sRXl0XSxleHBvcnRzOltIeXRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oWXZ0LHtkZWNsYXJhdGlvbnM6W0h5dF0saW1wb3J0czpbV00sRXl0XSxleHBvcnRzOltIeXRdfSk7Y2xhc3MgcXZ0e31xdnQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHF2dCl9LHF2dC7JtW1vZD1hbyh7dHlwZTpxdnR9KSxxdnQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxFeXQsV3Z0LFl2dF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChxdnQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W1Z5dCxqeXRdLGltcG9ydHM6W1dNLEV5dCxXdnQsWXZ0XSxleHBvcnRzOltqeXRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8ocXZ0LHtkZWNsYXJhdGlvbnM6W1Z5dCxqeXRdLGltcG9ydHM6W1dNLEV5dCxXdnQsWXZ0XSxleHBvcnRzOltqeXRdfSk7Y2xhc3MgWnZ0e31adnQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFp2dCl9LFp2dC7JtW1vZD1hbyh7dHlwZTpadnR9KSxadnQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxFVyxKSF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChadnQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W3B5dCxteXRdLGltcG9ydHM6W1dNLEVXLEpIXSxleHBvcnRzOltteXRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oWnZ0LHtkZWNsYXJhdGlvbnM6W3B5dCxteXRdLGltcG9ydHM6W1dNLEVXLEpIXSxleHBvcnRzOltteXRdfSk7Y2xhc3MgWHZ0e31YdnQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFh2dCl9LFh2dC7JtW1vZD1hbyh7dHlwZTpYdnR9KSxYdnQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxHdnQscXZ0LFp2dF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChYdnQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W1V5dF0saW1wb3J0czpbV00sR3Z0LHF2dCxadnRdLGV4cG9ydHM6W1V5dF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhYdnQse2RlY2xhcmF0aW9uczpbVXl0XSxpbXBvcnRzOltXTSxHdnQscXZ0LFp2dF0sZXhwb3J0czpbVXl0XX0pO2NsYXNzIEt2dHt9S3Z0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxLdnQpfSxLdnQuybVtb2Q9YW8oe3R5cGU6S3Z0fSksS3Z0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV00sY0csSkgsRVddXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoS3Z0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltZeXQscXl0XSxpbXBvcnRzOltXTSxjRyxKSCxFV10sZXhwb3J0czpbcXl0XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKEt2dCx7ZGVjbGFyYXRpb25zOltZeXQscXl0XSxpbXBvcnRzOltXTSxjRyxKSCxFV10sZXhwb3J0czpbcXl0XX0pO2NsYXNzIEp2dHt9SnZ0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxKdnQpfSxKdnQuybVtb2Q9YW8oe3R5cGU6SnZ0fSksSnZ0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV00sY0csRVcsSkgsS3Z0XV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKEp2dCxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbS3l0LEp5dF0saW1wb3J0czpbV00sY0csRVcsSkgsS3Z0XSxleHBvcnRzOltKeXRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oSnZ0LHtkZWNsYXJhdGlvbnM6W0t5dCxKeXRdLGltcG9ydHM6W1dNLGNHLEVXLEpILEt2dF0sZXhwb3J0czpbSnl0XX0pO2NsYXNzIFF2dHt9UXZ0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxRdnQpfSxRdnQuybVtb2Q9YW8oe3R5cGU6UXZ0fSksUXZ0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV00sY0csRVcsQlldXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoUXZ0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltmX3QsZ190XSxpbXBvcnRzOltXTSxjRyxFVyxCWV0sZXhwb3J0czpbZ190XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKFF2dCx7ZGVjbGFyYXRpb25zOltmX3QsZ190XSxpbXBvcnRzOltXTSxjRyxFVyxCWV0sZXhwb3J0czpbZ190XX0pO2NsYXNzICR2dHt9JHZ0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHwkdnQpfSwkdnQuybVtb2Q9YW8oe3R5cGU6JHZ0fSksJHZ0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV00sY0csRVcsSkgsbV90LFF2dF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCgkdnQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W3lfdCxfX3RdLGltcG9ydHM6W1dNLGNHLEVXLEpILG1fdCxRdnRdLGV4cG9ydHM6W19fdF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybygkdnQse2RlY2xhcmF0aW9uczpbeV90LF9fdF0saW1wb3J0czpbV00sY0csRVcsSkgsbV90LFF2dF0sZXhwb3J0czpbX190XX0pO2NsYXNzIHR4dHt9dHh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx0eHQpfSx0eHQuybVtb2Q9YW8oe3R5cGU6dHh0fSksdHh0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV00sY0csU1ksRVddXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgodHh0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltQX3Qsd190XSxpbXBvcnRzOltXTSxjRyxTWSxFV10sZXhwb3J0czpbd190XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKHR4dCx7ZGVjbGFyYXRpb25zOltQX3Qsd190XSxpbXBvcnRzOltXTSxjRyxTWSxFV10sZXhwb3J0czpbd190XX0pO2NsYXNzIGV4dHt9ZXh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxleHQpfSxleHQuybVtb2Q9YW8oe3R5cGU6ZXh0fSksZXh0Lsm1aW5qPXZuKHtpbXBvcnRzOltbV01dXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZXh0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltNX3RdLGltcG9ydHM6W1dNXSxleHBvcnRzOltNX3RdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oZXh0LHtkZWNsYXJhdGlvbnM6W01fdF0saW1wb3J0czpbV01dLGV4cG9ydHM6W01fdF19KTtjbGFzcyBueHR7fW54dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bnh0KX0sbnh0Lsm1bW9kPWFvKHt0eXBlOm54dH0pLG54dC7JtWluaj12bih7aW1wb3J0czpbW2V4dF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChueHQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W3ZfdF0saW1wb3J0czpbZXh0XSxleHBvcnRzOlt2X3RdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8obnh0LHtkZWNsYXJhdGlvbnM6W3ZfdF0saW1wb3J0czpbZXh0XSxleHBvcnRzOlt2X3RdfSk7Y2xhc3Mgb3h0e31veHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fG94dCl9LG94dC7JtW1vZD1hbyh7dHlwZTpveHR9KSxveHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxjRyxTWSxFVyxKSF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChveHQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W1RfdCxBX3RdLGltcG9ydHM6W1dNLGNHLFNZLEVXLEpIXSxleHBvcnRzOltUX3RdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8ob3h0LHtkZWNsYXJhdGlvbnM6W1RfdCxBX3RdLGltcG9ydHM6W1dNLGNHLFNZLEVXLEpIXSxleHBvcnRzOltUX3RdfSk7Y2xhc3MgaXh0e31peHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGl4dCl9LGl4dC7JtW1vZD1hbyh7dHlwZTppeHR9KSxpeHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSwkdnQsdHh0LG54dCxfRixveHRdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoaXh0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltJX3QsSF90XSxpbXBvcnRzOltXTSwkdnQsdHh0LG54dCxfRixveHRdLGV4cG9ydHM6W0hfdF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhpeHQse2RlY2xhcmF0aW9uczpbSV90LEhfdF0saW1wb3J0czpbV00sJHZ0LHR4dCxueHQsX0Ysb3h0XSxleHBvcnRzOltIX3RdfSk7Y2xhc3MgYXh0e31heHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGF4dCl9LGF4dC7JtW1vZD1hbyh7dHlwZTpheHR9KSxheHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChheHQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W0xfdCxCX3RdLGltcG9ydHM6W1dNXSxleHBvcnRzOltCX3RdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oYXh0LHtkZWNsYXJhdGlvbnM6W0xfdCxCX3RdLGltcG9ydHM6W1dNXSxleHBvcnRzOltCX3RdfSk7Y2xhc3Mgcnh0e31yeHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHJ4dCl9LHJ4dC7JtW1vZD1hbyh7dHlwZTpyeHR9KSxyeHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxFVyxKSCxheHRdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgocnh0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltHX3QsV190XSxpbXBvcnRzOltXTSxFVyxKSCxheHRdLGV4cG9ydHM6W1dfdF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhyeHQse2RlY2xhcmF0aW9uczpbR190LFdfdF0saW1wb3J0czpbV00sRVcsSkgsYXh0XSxleHBvcnRzOltXX3RdfSk7Y2xhc3Mgc3h0e31zeHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHN4dCl9LHN4dC7JtW1vZD1hbyh7dHlwZTpzeHR9KSxzeHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxjRyxTWSxFVyxraHQsWHZ0LEpILEp2dCxpeHQscnh0XV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHN4dCxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbSl90LFFfdF0saW1wb3J0czpbV00sY0csU1ksRVcsa2h0LFh2dCxKSCxKdnQsaXh0LHJ4dF0sZXhwb3J0czpbUV90XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKHN4dCx7ZGVjbGFyYXRpb25zOltKX3QsUV90XSxpbXBvcnRzOltXTSxjRyxTWSxFVyxraHQsWHZ0LEpILEp2dCxpeHQscnh0XSxleHBvcnRzOltRX3RdfSk7Y2xhc3MgbHh0e31seHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGx4dCl9LGx4dC7JtW1vZD1hbyh7dHlwZTpseHR9KSxseHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxjRyxTWSxFVyxraHQsWHZ0LEpILGl4dCxyeHRdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgobHh0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltpQ3QsYUN0XSxpbXBvcnRzOltXTSxjRyxTWSxFVyxraHQsWHZ0LEpILGl4dCxyeHRdLGV4cG9ydHM6W2FDdF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhseHQse2RlY2xhcmF0aW9uczpbaUN0LGFDdF0saW1wb3J0czpbV00sY0csU1ksRVcsa2h0LFh2dCxKSCxpeHQscnh0XSxleHBvcnRzOlthQ3RdfSk7Y2xhc3MgY3h0e31jeHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGN4dCl9LGN4dC7JtW1vZD1hbyh7dHlwZTpjeHR9KSxjeHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxVdnQsc3h0LGx4dCxWdnQsZGsuZm9yRmVhdHVyZShRaHQsaXl0KSxXay5mb3JGZWF0dXJlKFtqdnRdKSx3cS5mb3JQbHVnaW4oIm5wbWkiLHBDdCldXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoY3h0LFt7dHlwZTpBeSxhcmdzOlt7ZGVjbGFyYXRpb25zOltkQ3QscEN0XSxpbXBvcnRzOltXTSxVdnQsc3h0LGx4dCxWdnQsZGsuZm9yRmVhdHVyZShRaHQsaXl0KSxXay5mb3JGZWF0dXJlKFtqdnRdKSx3cS5mb3JQbHVnaW4oIm5wbWkiLHBDdCldLGV4cG9ydHM6W3BDdF0sZW50cnlDb21wb25lbnRzOltwQ3RdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oY3h0LHtkZWNsYXJhdGlvbnM6W2RDdCxwQ3RdLGltcG9ydHM6W1dNLFV2dCxzeHQsbHh0LFZ2dCxjayxHayx3cV0sZXhwb3J0czpbcEN0XX0pO2NsYXNzIGR4dHt9ZHh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxkeHQpfSxkeHQuybVjbXA9dG8oe3R5cGU6ZHh0LHNlbGVjdG9yczpbWyJ0ZXh0LWRhc2hib2FyZCJdXSxkZWNsczoxLHZhcnM6MCx0ZW1wbGF0ZTpmdW5jdGlvbiB0KGUsbil7MSZlJiZrdSgwLCIgVGhpcyBpcyB0aGUgdGV4dCBkYXNoYm9hcmQgIil9LGVuY2Fwc3VsYXRpb246MixjaGFuZ2VEZXRlY3Rpb246MH0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoZHh0LFt7dHlwZTpNeSxhcmdzOlt7c2VsZWN0b3I6InRleHQtZGFzaGJvYXJkIix0ZW1wbGF0ZToiIFRoaXMgaXMgdGhlIHRleHQgZGFzaGJvYXJkICIsY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sbnVsbCxudWxsKTtjbGFzcyBweHR7fXB4dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8cHh0KX0scHh0Lsm1bW9kPWFvKHt0eXBlOnB4dH0pLHB4dC7JtWluaj12bih7fSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChweHQsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W2R4dF0sZXhwb3J0czpbZHh0XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKHB4dCx7ZGVjbGFyYXRpb25zOltkeHRdLGV4cG9ydHM6W2R4dF19KTtjbGFzcyBteHR7fW14dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8bXh0KX0sbXh0Lsm1cHJvdj1Nbih7dG9rZW46bXh0LGZhY3Rvcnk6bXh0Lsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChteHQsW3t0eXBlOmltfV0sbnVsbCxudWxsKTtjbGFzcyB1eHR7Y29uc3RydWN0b3IodCl7dGhpcy5odHRwPXQsdGhpcy5odHRwUGF0aFByZWZpeD0iZGF0YS9wbHVnaW4vdGV4dF92MiJ9ZmV0Y2hSdW5Ub1RhZygpe3JldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaHR0cFBhdGhQcmVmaXgrIi90YWdzIikucGlwZShJdCgodD0+e2NvbnN0IGU9bmV3IE1hcDtyZXR1cm4gT2JqZWN0LmVudHJpZXModCkuZm9yRWFjaCgoKFt0LG5dKT0+e2Uuc2V0KHQsbil9KSksZX0pKSl9ZmV0Y2hUZXh0RGF0YSh0LGUpe2NvbnN0IG49bmV3IFVSTFNlYXJjaFBhcmFtcyh7cnVuOnQsdGFnOmV9KTtyZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmh0dHBQYXRoUHJlZml4K2AvdGV4dD8ke24udG9TdHJpbmcoKX1gKS5waXBlKEl0KCh0PT50Lm1hcCgodD0+KHtvcmlnaW5hbFNoYXBlOnQub3JpZ2luYWxfc2hhcGUsc3RlcDp0LnN0ZXAsc3RyaW5nQXJyYXk6dC5zdHJpbmdfYXJyYXksd2FsbFRpbWVJbk1zOjFlMyp0LndhbGxfdGltZSx0cnVuY2F0ZWQ6dC50cnVuY2F0ZWR9KSkpKSkpfX11eHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHV4dCkodnIobEUpKX0sdXh0Lsm1cHJvdj1Nbih7dG9rZW46dXh0LGZhY3Rvcnk6dXh0Lsm1ZmFjfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaCh1eHQsW3t0eXBlOmltfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOmxFfV19KSxudWxsKTtjbGFzcyBmeHR7fWZ4dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8Znh0KX0sZnh0Lsm1bW9kPWFvKHt0eXBlOmZ4dH0pLGZ4dC7JtWluaj12bih7cHJvdmlkZXJzOlt1eHQse3Byb3ZpZGU6bXh0LHVzZUV4aXN0aW5nOnV4dH1dLGltcG9ydHM6W1tjRV1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChmeHQsW3t0eXBlOkF5LGFyZ3M6W3tpbXBvcnRzOltjRV0scHJvdmlkZXJzOlt1eHQse3Byb3ZpZGU6bXh0LHVzZUV4aXN0aW5nOnV4dH1dfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oZnh0LHtpbXBvcnRzOltjRV19KTtjb25zdCBneHQ9SlAoIltUZXh0XSBUZXh0IFBsdWdpbiBMb2FkZWQiKSxoeHQ9SlAoIltUZXh0XSBSdW5zIFRvIFRhZyBMb2FkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxieHQ9SlAoIltUZXh0XSBUYWcgR3JvdXAgVmlzaWJpbGl0eSBDaGFuZ2VkIix7X2FzOiJwcm9wcyIsX3A6dm9pZCAwfSkseXh0PUpQKCJbVGV4dF0gVGV4dCBEYXRhIExvYWRlZCBMb2FkZWQiLHtfYXM6InByb3BzIixfcDp2b2lkIDB9KSxfeHQ9InRleHQiLEN4dD1LdyhfeHQpO1p3KEN4dCwodD0+dC5ydW5Ub1RhZ3MpKTtjb25zdCBNeHQ9WncoQ3h0LCh0PT57Y29uc3QgZT1uZXcgU2V0LG49bmV3IFNldDtmb3IoY29uc3QgbyBvZiB0LnZpc2libGVSdW5UYWdzLnZhbHVlcygpKWZvcihjb25zdCB0IG9mIG8pe2NvbnN0IG89SlNPTi5zdHJpbmdpZnkodCk7ZS5oYXMobyl8fChlLmFkZChvKSxuLmFkZCh0KSl9cmV0dXJuWy4uLm5dfSkpLHZ4dD1adyhDeHQsKCh0LGUpPT57Y29uc3Qgbj10LmRhdGEuZ2V0KGUucnVuKTtyZXR1cm4gbiYmbi5nZXQoZS50YWcpfHxudWxsfSkpO2NsYXNzIHh4dHtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5hY3Rpb25zJD10LHRoaXMuc3RvcmU9ZSx0aGlzLmRhdGFTb3VyY2U9bix0aGlzLmxvYWRSdW5Ub1RhZ3MkPU1rKCgoKT0+dGhpcy5hY3Rpb25zJC5waXBlKERrKGd4dCksemUoKCgpPT50aGlzLmRhdGFTb3VyY2UuZmV0Y2hSdW5Ub1RhZygpLnBpcGUoRmUoKHQ9Pnt0aGlzLnN0b3JlLmRpc3BhdGNoKGh4dCh7cnVuVG9UYWdzOnR9KSl9KSksSXQoKCgpPT57fSkpKSkpKSkse2Rpc3BhdGNoOiExfSksdGhpcy5sb2FkRGF0YSQ9TWsoKCgpPT5yZSh0aGlzLmFjdGlvbnMkLnBpcGUoRGsoYnh0KSx6ZSgoKHt2aXNpYmxlVGV4dENhcmRzOnR9KT0+JHQodC5tYXAoKCh7cnVuOnQsdGFnOmV9KT0+dGhpcy5zdG9yZS5zZWxlY3Qodnh0LHtydW46dCx0YWc6ZX0pLnBpcGUoKGZ1bmN0aW9uIG4odCxlKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPj0yO3JldHVybiBmdW5jdGlvbihvKXtyZXR1cm4gby5waXBlKHQ/Y2UoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQoZSxuLG8pfSkpOncsU2UoMSksbj9oZShlKTp4ZSgoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHp0fSkpKX19KSgpLEl0KChuPT4oe3J1bjp0LHRhZzplLHRleHREYXRhOm59KSkpKSkpKS5waXBlKEl0KCh0PT50LmZpbHRlcigoKHt0ZXh0RGF0YTp0fSk9Pm51bGw9PT10KSkubWFwKCgoe3J1bjp0LHRhZzplfSk9Pih7cnVuOnQsdGFnOmV9KSkpKSkpKSkpLHRoaXMuYWN0aW9ucyQucGlwZShEayh2RSx4RSksVmUodGhpcy5zdG9yZS5zZWxlY3QoTXh0KSksSXQoKChbLHRdKT0+dCkpKSkucGlwZShadCgodD0+JHQodC5tYXAoKHQ9PnRoaXMuZmV0Y2hUZXh0RGF0YSh0KSkpKSkpKSkse2Rpc3BhdGNoOiExfSl9ZmV0Y2hUZXh0RGF0YSh0KXtjb25zdHtydW46ZSx0YWc6bn09dDtyZXR1cm4gdGhpcy5kYXRhU291cmNlLmZldGNoVGV4dERhdGEoZSxuKS5waXBlKEZlKCh0PT57dGhpcy5zdG9yZS5kaXNwYXRjaCh5eHQoe3J1bjplLHRhZzpuLHN0ZXBEYXRhOnR9KSl9KSksSXQoKCgpPT57fSkpKX19eHh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHx4eHQpKHZyKFNrKSx2cihJdyksdnIobXh0KSl9LHh4dC7JtXByb3Y9TW4oe3Rva2VuOnh4dCxmYWN0b3J5Onh4dC7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoeHh0LFt7dHlwZTppbX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpTa30se3R5cGU6SXd9LHt0eXBlOm14dH1dfSksbnVsbCk7Y29uc3QgT3h0PXlrKHtydW5Ub1RhZ3M6bmV3IE1hcChbWyJydW4xIixbImEvYiIsImEvYyJdXSxbInJ1bjIiLFsiYS9iIiwiYS9kIl1dLFsicnVuMyIsWyJjIiwiYS9iIl1dXSksZGF0YTpuZXcgTWFwKFtbInJ1bjEiLG5ldyBNYXAoW1siYS9iIixbe29yaWdpbmFsU2hhcGU6WzNdLHN0ZXA6MCxzdHJpbmdBcnJheTpbWyJmb28iLCJiYXIiLCJiYXoiXV0sd2FsbFRpbWVJbk1zOjE1Nzc4NjU2ZTUsdHJ1bmNhdGVkOiExfSx7b3JpZ2luYWxTaGFwZTpbM10sc3RlcDoxLHN0cmluZ0FycmF5OltbImZvbyIsImJheiJdXSx3YWxsVGltZUluTXM6MTU3Nzg2NTYwMWUzLHRydW5jYXRlZDohMX1dXSxbImEvYyIsW3tvcmlnaW5hbFNoYXBlOlszXSxzdGVwOjAsc3RyaW5nQXJyYXk6W1siV2UgY29uZHVjdGVkIGFuIGV4cGVyaW1lbnQgYW5kIGZvdW5kIHRoZSBmb2xsb3dpbmcgZGF0YTpcblxuUG91bmRzIG9mIGNob2NvbGF0ZSB8IEhhcHBpbmVzc1xuLS0tfC0tLVxuMCB8IDFcbjEgfCA0XG4yIHwgOVxuMyB8IDE2XG40IHwgMjVcbjUgfCAzNlxuNiB8IDQ5XG43IHwgNjRcbjggfCA4MVxuOSB8IDEwMFxuMTAgfCAxMjEiXV0sd2FsbFRpbWVJbk1zOjE1Nzc4NjU2ZTUsdHJ1bmNhdGVkOiExfSx7b3JpZ2luYWxTaGFwZTpbM10sc3RlcDoxLHN0cmluZ0FycmF5OltbIsOXIiwiKiowKioiLCIqKjEqKiIsIioqMioqIiwiKiozKioiLCIqKjQqKiIsIioqNSoqIl0sWyIqKjAqKiIsIjAiLCIwIiwiMCIsIjAiLCIwIiwiMCJdLFsiKioxKioiLCIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiXSxbIioqMioqIiwiMCIsIjIiLCI0IiwiNiIsIjgiLCIxMCJdLFsiKiozKioiLCIwIiwiMyIsIjYiLCI5IiwiMTIiLCIxNSJdLFsiKio0KioiLCIwIiwiNCIsIjgiLCIxMiIsIjE2IiwiMjAiXSxbIioqNSoqIiwiMCIsIjUiLCIxMCIsIjE1IiwiMjAiLCIyNSJdXSx3YWxsVGltZUluTXM6MTU3Nzg2NTYwMWUzLHRydW5jYXRlZDohMX1dXV0pXV0pLHZpc2libGVSdW5UYWdzOm5ldyBNYXB9KTtmdW5jdGlvbiBQeHQodCxlKXtyZXR1cm4gT3h0KHQsZSl9Y2xhc3Mgd3h0e313eHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fHd4dCl9LHd4dC7JtW1vZD1hbyh7dHlwZTp3eHR9KSx3eHQuybVpbmo9dm4oe2ltcG9ydHM6W1tXTSxweHQsd3EuZm9yUGx1Z2luKCJ0ZXh0X3YyIixkeHQpLGZ4dCxkay5mb3JGZWF0dXJlKF94dCxQeHQpLFdrLmZvckZlYXR1cmUoW3h4dF0pXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHd4dCxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W1dNLHB4dCx3cS5mb3JQbHVnaW4oInRleHRfdjIiLGR4dCksZnh0LGRrLmZvckZlYXR1cmUoX3h0LFB4dCksV2suZm9yRmVhdHVyZShbeHh0XSldLGVudHJ5Q29tcG9uZW50czpbZHh0XX1dfV0sbnVsbCxudWxsKSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0ppdE1vZGV8fG5nSml0TW9kZSkmJnJvKHd4dCx7aW1wb3J0czpbV00scHh0LHdxLGZ4dCxjayxHa119KTtjbGFzcyBreHR7fXZhciBTeHQ7a3h0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxreHQpfSxreHQuybVtb2Q9YW8oe3R5cGU6a3h0fSksa3h0Lsm1aW5qPXZuKHtpbXBvcnRzOltbS0osSmh0LGN4dCx3eHRdXX0pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoa3h0LFt7dHlwZTpBeSxhcmdzOlt7aW1wb3J0czpbS0osSmh0LGN4dCx3eHRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8oa3h0LHtpbXBvcnRzOltLSixKaHQsY3h0LHd4dF19KSwoZnVuY3Rpb24odCl7dC5DVVNUT01fRUxFTUVOVD0iQ1VTVE9NX0VMRU1FTlQiLHQuSUZSQU1FPSJJRlJBTUUiLHQuTkdfQ09NUE9ORU5UPSJOR19DT01QT05FTlQiLHQuTk9ORT0iTk9ORSJ9KShTeHR8fChTeHQ9e30pKTtjb25zdCBEeHQ9WyJwbHVnaW5Db250YWluZXIiXSxFeHQ9WyJuZ1BsdWdpbkNvbnRhaW5lciJdO2Z1bmN0aW9uIFJ4dCh0LGUpezEmdCYmSW0oMCl9ZnVuY3Rpb24gQXh0KHQsZSl7aWYoMSZ0JiYoTm0oMCksUXAoMSxSeHQsMSwwLCJuZy1jb250YWluZXIiLDkpLHptKCkpLDImdCl7Y29uc3QgdD1ZbSgyKSxlPSRwKDYpO3JjKDEpLERtKCJuZ1RlbXBsYXRlT3V0bGV0Iix0LmVudmlyb25tZW50RmFpbHVyZU5vdEZvdW5kVGVtcGxhdGU/dC5lbnZpcm9ubWVudEZhaWx1cmVOb3RGb3VuZFRlbXBsYXRlOmUpfX1mdW5jdGlvbiBUeHQodCxlKXsxJnQmJkltKDApfWZ1bmN0aW9uIE54dCh0LGUpe2lmKDEmdCYmKE5tKDApLFFwKDEsVHh0LDEsMCwibmctY29udGFpbmVyIiw5KSx6bSgpKSwyJnQpe2NvbnN0IHQ9WW0oMiksZT0kcCg2KTtyYygxKSxEbSgibmdUZW1wbGF0ZU91dGxldCIsdC5lbnZpcm9ubWVudEZhaWx1cmVVbmtub3duVGVtcGxhdGU/dC5lbnZpcm9ubWVudEZhaWx1cmVVbmtub3duVGVtcGxhdGU6ZSl9fWZ1bmN0aW9uIHp4dCh0LGUpe2lmKDEmdCYmKE5tKDApLFJtKDEsImgzIiwxMCksa3UoMiwiIFRoZXJl4oCZcyBubyBkYXNoYm9hcmQgYnkgdGhlIG5hbWUgb2Yg4oCcIiksUm0oMywiY29kZSIpLGt1KDQpLEFtKCksa3UoNSwi4oCdLiAiKSxBbSgpLFJtKDYsInAiKSxrdSg3LCJZb3UgY2FuIHNlbGVjdCBhIGRhc2hib2FyZCBmcm9tIHRoZSBsaXN0IGFib3ZlLiIpLEFtKCksUm0oOCwicCIpLEltKDksMTEpLEFtKCksem0oKSksMiZ0KXtjb25zdCB0PVltKDIpLGU9JHAoOCk7cmMoNCksU3UodC5hY3RpdmVQbHVnaW5JZCkscmMoNSksRG0oIm5nVGVtcGxhdGVPdXRsZXQiLGUpfX1mdW5jdGlvbiBJeHQodCxlKXtpZigxJnQmJihObSgwKSxSbSgxLCJoMyIsMTIpLGt1KDIsIiBObyBkYXNoYm9hcmRzIGFyZSBhY3RpdmUgZm9yIHRoZSBjdXJyZW50IGRhdGEgc2V0LiAiKSxBbSgpLFJtKDMsInAiKSxrdSg0LCJQcm9iYWJsZSBjYXVzZXM6IiksQW0oKSxSbSg1LCJ1bCIpLFJtKDYsImxpIiksa3UoNywiWW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuIiksQW0oKSxSbSg4LCJsaSIpLGt1KDksIlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLiIpLEFtKCksQW0oKSxrdSgxMCwiIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZSAiKSxSbSgxMSwiYSIsMTMpLGt1KDEyLCJSRUFETUUiKSxBbSgpLGt1KDEzLCIgYW5kIHBlcmhhcHMgdGhlICIpLFJtKDE0LCJhIiwxNCksa3UoMTUsIlRlbnNvckJvYXJkIHR1dG9yaWFsIiksQW0oKSxrdSgxNiwiLiAiKSxSbSgxNywicCIpLGt1KDE4LCIgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUgIiksUm0oMTksImEiLDE1KSxrdSgyMCwidGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtcyIpLEFtKCksa3UoMjEsIiBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4gIiksQW0oKSxSbSgyMiwicCIpLEltKDIzLDExKSxBbSgpLHptKCkpLDImdCl7WW0oMik7Y29uc3QgdD0kcCg4KTtyYygyMyksRG0oIm5nVGVtcGxhdGVPdXRsZXQiLHQpfX1mdW5jdGlvbiBIeHQodCxlKXtpZigxJnQmJihSbSgwLCJkaXYiLDYpLFJtKDEsImRpdiIsNyksUXAoMixBeHQsMiwxLCJuZy1jb250YWluZXIiLDgpLFFwKDMsTnh0LDIsMSwibmctY29udGFpbmVyIiw4KSxRcCg0LHp4dCwxMCwyLCJuZy1jb250YWluZXIiLDgpLFFwKDUsSXh0LDI0LDEsIm5nLWNvbnRhaW5lciIsOCksQW0oKSxBbSgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtEbSgibmdTd2l0Y2giLHQucGx1Z2luTG9hZFN0YXRlKSxyYygyKSxEbSgibmdTd2l0Y2hDYXNlIix0LlBsdWdpbkxvYWRTdGF0ZS5FTlZJUk9OTUVOVF9GQUlMVVJFX05PVF9GT1VORCkscmMoMSksRG0oIm5nU3dpdGNoQ2FzZSIsdC5QbHVnaW5Mb2FkU3RhdGUuRU5WSVJPTk1FTlRfRkFJTFVSRV9VTktOT1dOKSxyYygxKSxEbSgibmdTd2l0Y2hDYXNlIix0LlBsdWdpbkxvYWRTdGF0ZS5VTktOT1dOX1BMVUdJTl9JRCkscmMoMSksRG0oIm5nU3dpdGNoQ2FzZSIsdC5QbHVnaW5Mb2FkU3RhdGUuTk9fRU5BQkxFRF9QTFVHSU5TKX19ZnVuY3Rpb24gRnh0KHQsZSl7aWYoMSZ0JiYoUm0oMCwiaDMiLDE2KSxrdSgxLCJEYXRhIGNvdWxkIG5vdCBiZSBsb2FkZWQuIiksQW0oKSxSbSgyLCJwIiksa3UoMywiVGhlIFRlbnNvckJvYXJkIHNlcnZlciBtYXkgYmUgZG93biBvciBpbmFjY2Vzc2libGUuIiksQW0oKSxSbSg0LCJwIiksSW0oNSwxMSksQW0oKSksMiZ0KXtZbSgpO2NvbnN0IHQ9JHAoOCk7cmMoNSksRG0oIm5nVGVtcGxhdGVPdXRsZXQiLHQpfX1mdW5jdGlvbiBMeHQodCxlKXtpZigxJnQmJihSbSgwLCJwIiwxOSksUm0oMSwiaSIpLGt1KDIsIkxvZyBkaXJlY3Rvcnk6ICIpLFJtKDMsInNwYW4iKSxrdSg0KSxBbSgpLEFtKCksQW0oKSksMiZ0KXtjb25zdCB0PVltKDIpO3JjKDQpLFN1KHQuZGF0YUxvY2F0aW9uKX19ZnVuY3Rpb24gQnh0KHQsZSl7aWYoMSZ0JiYoUm0oMCwic3BhbiIsMTcpLGt1KDEpLEFoKDIsImRhdGUiKSxBbSgpLFFwKDMsTHh0LDUsMSwicCIsMTgpKSwyJnQpe2NvbnN0IHQ9WW0oKTtyYygxKSxEdSgiTGFzdCByZWxvYWQ6ICIsTmgoMiwyLHQubGFzdFVwZGF0ZWQsIm1lZGl1bSIpLCIiKSxyYygyKSxEbSgibmdJZiIsdC5kYXRhTG9jYXRpb24pfX1jb25zdCBWeHQ9ZnVuY3Rpb24odCl7cmV0dXJue3BsdWdpbnM6ITAsImlzLWZpcnN0LXBhcnR5LXBsdWdpbiI6dH19O3ZhciBqeHQ7IShmdW5jdGlvbih0KXt0W3QuRU5WSVJPTk1FTlRfRkFJTFVSRV9OT1RfRk9VTkQ9MF09IkVOVklST05NRU5UX0ZBSUxVUkVfTk9UX0ZPVU5EIix0W3QuRU5WSVJPTk1FTlRfRkFJTFVSRV9VTktOT1dOPTFdPSJFTlZJUk9OTUVOVF9GQUlMVVJFX1VOS05PV04iLHRbdC5OT19FTkFCTEVEX1BMVUdJTlM9Ml09Ik5PX0VOQUJMRURfUExVR0lOUyIsdFt0LlVOS05PV05fUExVR0lOX0lEPTNdPSJVTktOT1dOX1BMVUdJTl9JRCIsdFt0LkxPQURFRD00XT0iTE9BREVEIix0W3QuTE9BRElORz01XT0iTE9BRElORyJ9KShqeHR8fChqeHQ9e30pKTtjbGFzcyBVeHR7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyPXQsdGhpcy5wbHVnaW5SZWdpc3RyeT1lLHRoaXMucGx1Z2luQXBpSG9zdD1uLHRoaXMuUGx1Z2luTG9hZFN0YXRlPWp4dCx0aGlzLkxvYWRpbmdNZWNoYW5pc21UeXBlPVN4dCx0aGlzLnBsdWdpbkluc3RhbmNlcz1uZXcgTWFwfW5nT25DaGFuZ2VzKHQpe3ZhciBlO2lmKCF0aGlzLmlzRmVhdHVyZUZsYWdzTG9hZGVkfHwhdGhpcy5hY3RpdmVLbm93blBsdWdpbnx8dGhpcy5zZXR0aW5nc0xvYWRTdGF0ZT09PXlFLk5PVF9MT0FERUR8fHRoaXMuc2V0dGluZ3NMb2FkU3RhdGU9PT15RS5MT0FESU5HKXJldHVybjtjb25zdCBuPUJvb2xlYW4odGhpcy5hY3RpdmVLbm93blBsdWdpbiYmIXRoaXMucGx1Z2luSW5zdGFuY2VzLmhhcyh0aGlzLmFjdGl2ZUtub3duUGx1Z2luLmlkKSk7aWYodC5hY3RpdmVLbm93blBsdWdpbnx8dC5pc0ZlYXR1cmVGbGFnc0xvYWRlZHx8dC5zZXR0aW5nc0xvYWRTdGF0ZSl7Y29uc3Qgbz1udWxsPT09KGU9dC5hY3RpdmVLbm93blBsdWdpbil8fHZvaWQgMD09PWU/dm9pZCAwOmUucHJldmlvdXNWYWx1ZTtpZihvJiZvLmlkIT09dGhpcy5hY3RpdmVLbm93blBsdWdpbi5pZCYmdGhpcy5oaWRlUGx1Z2luKG8pLG4pe2NvbnN0IHQ9dGhpcy5jcmVhdGVQbHVnaW4odGhpcy5hY3RpdmVLbm93blBsdWdpbik7dCYmdGhpcy5wbHVnaW5JbnN0YW5jZXMuc2V0KHRoaXMuYWN0aXZlS25vd25QbHVnaW4uaWQsdCl9ZWxzZSB0aGlzLnNob3dQbHVnaW4odGhpcy5hY3RpdmVLbm93blBsdWdpbil9KG58fHQubGFzdFVwZGF0ZWQpJiZ0aGlzLnJlbG9hZCh0aGlzLmFjdGl2ZUtub3duUGx1Z2luLG4pfWhpZGVQbHVnaW4odCl7aWYoIXRoaXMucGx1Z2luSW5zdGFuY2VzLmhhcyh0LmlkKSlyZXR1cm47Y29uc3QgZT10aGlzLnBsdWdpbkluc3RhbmNlcy5nZXQodC5pZCk7T2JqZWN0LmFzc2lnbihlLnN0eWxlLHttYXhIZWlnaHQ6MCxvdmVyZmxvdzoiaGlkZGVuIix2aXNpYmlsaXR5OiJoaWRkZW4iLHBvc2l0aW9uOiJhYnNvbHV0ZSJ9KX1zaG93UGx1Z2luKHQpe2lmKCF0aGlzLnBsdWdpbkluc3RhbmNlcy5oYXModC5pZCkpcmV0dXJuO2NvbnN0IGU9dGhpcy5wbHVnaW5JbnN0YW5jZXMuZ2V0KHQuaWQpO09iamVjdC5hc3NpZ24oZS5zdHlsZSx7bWF4SGVpZ2h0Om51bGwsb3ZlcmZsb3c6bnVsbCx2aXNpYmlsaXR5Om51bGwscG9zaXRpb246bnVsbH0pfWNyZWF0ZVBsdWdpbih0KXtsZXQgZT1udWxsO3N3aXRjaCh0LmxvYWRpbmdfbWVjaGFuaXNtLnR5cGUpe2Nhc2UgU3h0LkNVU1RPTV9FTEVNRU5UOmU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0LmxvYWRpbmdfbWVjaGFuaXNtLmVsZW1lbnRfbmFtZSksZS5yZWxvYWRPblJlYWR5PSExLGUuZmVhdHVyZUZsYWdzPXRoaXMuZmVhdHVyZUZsYWdzLHRoaXMucGx1Z2luc0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKGUpO2JyZWFrO2Nhc2UgU3h0LklGUkFNRTppZighdGhpcy5wbHVnaW5BcGlIb3N0KXRocm93IEVycm9yKGBJRlJBTUUtYmFzZWQgcGx1Z2lucyBub3Qgc3VwcG9ydGVkOiAke3QuaWR9YCk7ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKSxlLnNldEF0dHJpYnV0ZSgic3JjIixgZGF0YS9wbHVnaW5fZW50cnkuaHRtbD9uYW1lPSR7dC5pZH1gKSx0aGlzLnBsdWdpbkFwaUhvc3QucmVnaXN0ZXJQbHVnaW5JZnJhbWUoZSx0LmlkKSx0aGlzLnBsdWdpbnNDb250YWluZXIubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChlKTticmVhaztjYXNlIFN4dC5OR19DT01QT05FTlQ6Y29uc3Qgbj10aGlzLnBsdWdpblJlZ2lzdHJ5LmdldENvbXBvbmVudCh0LmlkKTtpZihuKXtjb25zdCB0PXRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KG4pO2U9dGhpcy5uZ1BsdWdpbkNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQodCkubG9jYXRpb24ubmF0aXZlRWxlbWVudH1lbHNlIGNvbnNvbGUuZXJyb3IoYE5vIHJlZ2lzdGVyZWQgQW5ndWxhciBjb21wb25lbnQgZm9yIHBsdWdpbjogJHt0LmlkfWApO2JyZWFrO2Nhc2UgU3h0Lk5PTkU6YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmVycm9yKCJVbmV4cGVjdGVkIHBsdWdpbiIpfXJldHVybiBlfXJlbG9hZCh0LGUpe2lmKCFlJiZ0LmRpc2FibGVfcmVsb2FkKXJldHVybjtjb25zdCBuPXRoaXMucGx1Z2luSW5zdGFuY2VzLmdldCh0LmlkKTtuJiZuLnJlbG9hZCYmbi5yZWxvYWQoKX19VXh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxVeHQpKFNtKHVnKSxTbSh3cSksU20oc3osOCkpfSxVeHQuybVjbXA9dG8oe3R5cGU6VXh0LHNlbGVjdG9yczpbWyJwbHVnaW5zLWNvbXBvbmVudCJdXSx2aWV3UXVlcnk6ZnVuY3Rpb24gdChlLG4pe2lmKDEmZSYmKFFoKER4dCw3LGhnKSxRaChFeHQsNyxlaCkpLDImZSl7bGV0IHQ7SmgodD10YigpKSYmKG4ucGx1Z2luc0NvbnRhaW5lcj10LmZpcnN0KSxKaCh0PXRiKCkpJiYobi5uZ1BsdWdpbkNvbnRhaW5lcj10LmZpcnN0KX19LGlucHV0czp7YWN0aXZlUGx1Z2luSWQ6ImFjdGl2ZVBsdWdpbklkIixhY3RpdmVLbm93blBsdWdpbjoiYWN0aXZlS25vd25QbHVnaW4iLHBsdWdpbkxvYWRTdGF0ZToicGx1Z2luTG9hZFN0YXRlIixkYXRhTG9jYXRpb246ImRhdGFMb2NhdGlvbiIsaXNGZWF0dXJlRmxhZ3NMb2FkZWQ6ImlzRmVhdHVyZUZsYWdzTG9hZGVkIixzZXR0aW5nc0xvYWRTdGF0ZToic2V0dGluZ3NMb2FkU3RhdGUiLGZlYXR1cmVGbGFnczoiZmVhdHVyZUZsYWdzIixsYXN0VXBkYXRlZDoibGFzdFVwZGF0ZWQiLGVudmlyb25tZW50RmFpbHVyZU5vdEZvdW5kVGVtcGxhdGU6ImVudmlyb25tZW50RmFpbHVyZU5vdEZvdW5kVGVtcGxhdGUiLGVudmlyb25tZW50RmFpbHVyZVVua25vd25UZW1wbGF0ZToiZW52aXJvbm1lbnRGYWlsdXJlVW5rbm93blRlbXBsYXRlIn0sZmVhdHVyZXM6W0JvXSxkZWNsczo5LHZhcnM6NCxjb25zdHM6W1szLCJuZ0NsYXNzIl0sWyJwbHVnaW5Db250YWluZXIiLCIiXSxbIm5nUGx1Z2luQ29udGFpbmVyIiwiIl0sWyJjbGFzcyIsIndhcm5pbmciLDMsIm5nU3dpdGNoIiw0LCJuZ0lmIl0sWyJlbnZpcm9ubWVudEZhaWx1cmVEZWZhdWx0VGVtcGxhdGUiLCIiXSxbImRhdGVBbmREYXRhTG9jYXRpb24iLCIiXSxbMSwid2FybmluZyIsMywibmdTd2l0Y2giXSxbMSwid2FybmluZy1tZXNzYWdlIl0sWzQsIm5nU3dpdGNoQ2FzZSJdLFs0LCJuZ1RlbXBsYXRlT3V0bGV0Il0sWzEsInVua25vd24tcGx1Z2luIl0sWzMsIm5nVGVtcGxhdGVPdXRsZXQiXSxbMSwibm8tYWN0aXZlLXBsdWdpbiJdLFsiaHJlZiIsImh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCJdLFsiaHJlZiIsImh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiXSxbImhyZWYiLCJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIl0sWzEsImVudmlyb25tZW50LW5vdC1sb2FkZWQiXSxbMSwibGFzdC1yZWxvYWQtdGltZSJdLFsiY2xhc3MiLCJkYXRhLWxvY2F0aW9uIiw0LCJuZ0lmIl0sWzEsImRhdGEtbG9jYXRpb24iXV0sdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pezEmZSYmKFJtKDAsImRpdiIsMCwxKSxJbSgyLG51bGwsMiksQW0oKSxRcCg0LEh4dCw2LDUsImRpdiIsMyksUXAoNSxGeHQsNiwxLCJuZy10ZW1wbGF0ZSIsbnVsbCw0LGliKSxRcCg3LEJ4dCw0LDUsIm5nLXRlbXBsYXRlIixudWxsLDUsaWIpKSwyJmUmJihEbSgibmdDbGFzcyIsTWgoMixWeHQsKG51bGw9PW4uYWN0aXZlS25vd25QbHVnaW4/bnVsbDpuLmFjdGl2ZUtub3duUGx1Z2luLmxvYWRpbmdfbWVjaGFuaXNtLnR5cGUpIT09bi5Mb2FkaW5nTWVjaGFuaXNtVHlwZS5JRlJBTUUpKSxyYyg0KSxEbSgibmdJZiIsbi5wbHVnaW5Mb2FkU3RhdGUhPT1uLlBsdWdpbkxvYWRTdGF0ZS5MT0FERUQmJm4ucGx1Z2luTG9hZFN0YXRlIT09bi5QbHVnaW5Mb2FkU3RhdGUuTE9BRElORykpfSxkaXJlY3RpdmVzOlthTSxkTSxmTSxnTSxNTV0scGlwZXM6W1JNXSxzdHlsZXM6WycubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDt3aGl0ZS1zcGFjZTpub3dyYXA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1tZGMtZm9jdXMtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX1bX25naG9zdC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxO2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246cmVsYXRpdmV9Ym9keS5kYXJrLW1vZGUgICBbX25naG9zdC0lQ09NUCVdICAgLnBsdWdpbnMuaXMtZmlyc3QtcGFydHktcGx1Z2luW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMzMDMwMzA7Y29sb3I6I2ZmZn0ucGx1Z2luc1tfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCU7cG9zaXRpb246cmVsYXRpdmV9Lndhcm5pbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtib3R0b206MDtsZWZ0OjA7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MDt0b3A6MH1ib2R5LmRhcmstbW9kZVtfbmdob3N0LSVDT01QJV0gICAud2FybmluZ1tfbmdjb250ZW50LSVDT01QJV0sIGJvZHkuZGFyay1tb2RlICAgW19uZ2hvc3QtJUNPTVAlXSAgIC53YXJuaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiMzMDMwMzB9Lndhcm5pbmctbWVzc2FnZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTttYXJnaW46ODBweCBhdXRvIDA7bWF4LXdpZHRoOjU0MHB4fWJvZHkuZGFyay1tb2RlW19uZ2hvc3QtJUNPTVAlXSAgIC53YXJuaW5nLW1lc3NhZ2VbX25nY29udGVudC0lQ09NUCVdLCBib2R5LmRhcmstbW9kZSAgIFtfbmdob3N0LSVDT01QJV0gICAud2FybmluZy1tZXNzYWdlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5sYXN0LXJlbG9hZC10aW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXN0eWxlOml0YWxpY30ucGx1Z2luc1tfbmdjb250ZW50LSVDT01QJV0gICAgIGlmcmFtZXtib3JkZXI6MDtkaXNwbGF5OmJsb2NrO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9J10sY2hhbmdlRGV0ZWN0aW9uOjB9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFV4dCxbe3R5cGU6TXksYXJnczpbe3NlbGVjdG9yOiJwbHVnaW5zLWNvbXBvbmVudCIsdGVtcGxhdGVVcmw6Ii4vcGx1Z2luc19jb21wb25lbnQubmcuaHRtbCIsc3R5bGVVcmxzOlsicGx1Z2luc19jb21wb25lbnQuY3NzIl0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOnVnfSx7dHlwZTp3cX0se3R5cGU6c3osZGVjb3JhdG9yczpbe3R5cGU6U3J9XX1dfSkse3BsdWdpbnNDb250YWluZXI6W3t0eXBlOlphLGFyZ3M6WyJwbHVnaW5Db250YWluZXIiLHtzdGF0aWM6ITAscmVhZDpoZ31dfV0sbmdQbHVnaW5Db250YWluZXI6W3t0eXBlOlphLGFyZ3M6WyJuZ1BsdWdpbkNvbnRhaW5lciIse3N0YXRpYzohMCxyZWFkOmVofV19XSxhY3RpdmVQbHVnaW5JZDpbe3R5cGU6eHl9XSxhY3RpdmVLbm93blBsdWdpbjpbe3R5cGU6eHl9XSxwbHVnaW5Mb2FkU3RhdGU6W3t0eXBlOnh5fV0sZGF0YUxvY2F0aW9uOlt7dHlwZTp4eX1dLGlzRmVhdHVyZUZsYWdzTG9hZGVkOlt7dHlwZTp4eX1dLHNldHRpbmdzTG9hZFN0YXRlOlt7dHlwZTp4eX1dLGZlYXR1cmVGbGFnczpbe3R5cGU6eHl9XSxsYXN0VXBkYXRlZDpbe3R5cGU6eHl9XSxlbnZpcm9ubWVudEZhaWx1cmVOb3RGb3VuZFRlbXBsYXRlOlt7dHlwZTp4eX1dLGVudmlyb25tZW50RmFpbHVyZVVua25vd25UZW1wbGF0ZTpbe3R5cGU6eHl9XX0pO2NvbnN0IEd4dD1adyh2UixNUiwoKHQsZSk9PmUmJnRbZV0/T2JqZWN0LmFzc2lnbih7aWQ6ZX0sdFtlXSk6bnVsbCkpO2NsYXNzIFd4dHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnN0b3JlPXQsdGhpcy5hY3RpdmVLbm93blBsdWdpbiQ9dGhpcy5zdG9yZS5zZWxlY3QoR3h0KSx0aGlzLmFjdGl2ZVBsdWdpbklkJD10aGlzLnN0b3JlLnNlbGVjdChNUiksdGhpcy5wbHVnaW5Mb2FkU3RhdGUkPVd0KHRoaXMuYWN0aXZlS25vd25QbHVnaW4kLHRoaXMuYWN0aXZlUGx1Z2luSWQkLHRoaXMuc3RvcmUuc2VsZWN0KGJSKSkucGlwZShJdCgoKFt0LGUsbl0pPT5udWxsIT09bi5mYWlsdXJlQ29kZT9uLmZhaWx1cmVDb2RlPT09bUUuTk9UX0ZPVU5EP2p4dC5FTlZJUk9OTUVOVF9GQUlMVVJFX05PVF9GT1VORDpqeHQuRU5WSVJPTk1FTlRfRkFJTFVSRV9VTktOT1dOOm51bGwhPT10P2p4dC5MT0FERUQ6bnVsbD09PW4ubGFzdExvYWRlZFRpbWVJbk1zJiZuLnN0YXRlPT09eUUuTE9BRElORz9qeHQuTE9BRElORzplP2p4dC5VTktOT1dOX1BMVUdJTl9JRDpqeHQuTk9fRU5BQkxFRF9QTFVHSU5TKSkpLHRoaXMubGFzdExvYWRlZFRpbWVJbk1zJD10aGlzLnN0b3JlLnNlbGVjdChDUiksdGhpcy5kYXRhTG9jYXRpb24kPXRoaXMuc3RvcmUuc2VsZWN0KHhSKS5waXBlKEl0KCh0PT50LmRhdGFfbG9jYXRpb24pKSksdGhpcy5pc0ZlYXR1cmVGbGFnc0xvYWRlZCQ9dGhpcy5zdG9yZS5zZWxlY3QocUQpLHRoaXMuZmVhdHVyZUZsYWdzJD10aGlzLnN0b3JlLnNlbGVjdChaRCksdGhpcy5zZXR0aW5nc0xvYWRTdGF0ZSQ9dGhpcy5zdG9yZS5zZWxlY3QoU04pfX1XeHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFd4dCkoU20oSXcpKX0sV3h0Lsm1Y21wPXRvKHt0eXBlOld4dCxzZWxlY3RvcnM6W1sicGx1Z2lucyJdXSxpbnB1dHM6e2Vudmlyb25tZW50RmFpbHVyZU5vdEZvdW5kVGVtcGxhdGU6ImVudmlyb25tZW50RmFpbHVyZU5vdEZvdW5kVGVtcGxhdGUiLGVudmlyb25tZW50RmFpbHVyZVVua25vd25UZW1wbGF0ZToiZW52aXJvbm1lbnRGYWlsdXJlVW5rbm93blRlbXBsYXRlIn0sZGVjbHM6OSx2YXJzOjI2LGNvbnN0czpbWzMsImFjdGl2ZUtub3duUGx1Z2luIiwiYWN0aXZlUGx1Z2luSWQiLCJkYXRhTG9jYXRpb24iLCJsYXN0VXBkYXRlZCIsInBsdWdpbkxvYWRTdGF0ZSIsImlzRmVhdHVyZUZsYWdzTG9hZGVkIiwic2V0dGluZ3NMb2FkU3RhdGUiLCJmZWF0dXJlRmxhZ3MiLCJlbnZpcm9ubWVudEZhaWx1cmVOb3RGb3VuZFRlbXBsYXRlIiwiZW52aXJvbm1lbnRGYWlsdXJlVW5rbm93blRlbXBsYXRlIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihUbSgwLCJwbHVnaW5zLWNvbXBvbmVudCIsMCksQWgoMSwiYXN5bmMiKSxBaCgyLCJhc3luYyIpLEFoKDMsImFzeW5jIiksQWgoNCwiYXN5bmMiKSxBaCg1LCJhc3luYyIpLEFoKDYsImFzeW5jIiksQWgoNywiYXN5bmMiKSxBaCg4LCJhc3luYyIpKSwyJmUmJkRtKCJhY3RpdmVLbm93blBsdWdpbiIsVGgoMSwxMCxuLmFjdGl2ZUtub3duUGx1Z2luJCkpKCJhY3RpdmVQbHVnaW5JZCIsVGgoMiwxMixuLmFjdGl2ZVBsdWdpbklkJCkpKCJkYXRhTG9jYXRpb24iLFRoKDMsMTQsbi5kYXRhTG9jYXRpb24kKSkoImxhc3RVcGRhdGVkIixUaCg0LDE2LG4ubGFzdExvYWRlZFRpbWVJbk1zJCkpKCJwbHVnaW5Mb2FkU3RhdGUiLFRoKDUsMTgsbi5wbHVnaW5Mb2FkU3RhdGUkKSkoImlzRmVhdHVyZUZsYWdzTG9hZGVkIixUaCg2LDIwLG4uaXNGZWF0dXJlRmxhZ3NMb2FkZWQkKSkoInNldHRpbmdzTG9hZFN0YXRlIixUaCg3LDIyLG4uc2V0dGluZ3NMb2FkU3RhdGUkKSkoImZlYXR1cmVGbGFncyIsVGgoOCwyNCxuLmZlYXR1cmVGbGFncyQpKSgiZW52aXJvbm1lbnRGYWlsdXJlTm90Rm91bmRUZW1wbGF0ZSIsbi5lbnZpcm9ubWVudEZhaWx1cmVOb3RGb3VuZFRlbXBsYXRlKSgiZW52aXJvbm1lbnRGYWlsdXJlVW5rbm93blRlbXBsYXRlIixuLmVudmlyb25tZW50RmFpbHVyZVVua25vd25UZW1wbGF0ZSl9LHN0eWxlczpbInBsdWdpbnMtY29tcG9uZW50W19uZ2NvbnRlbnQtJUNPTVAlXSB7IGhlaWdodDogMTAwJTsgfSJdLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChXeHQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoicGx1Z2lucyIsdGVtcGxhdGU6J1xuICAgIDxwbHVnaW5zLWNvbXBvbmVudFxuICAgICAgW2FjdGl2ZUtub3duUGx1Z2luXT0iYWN0aXZlS25vd25QbHVnaW4kIHwgYXN5bmMiXG4gICAgICBbYWN0aXZlUGx1Z2luSWRdPSJhY3RpdmVQbHVnaW5JZCQgfCBhc3luYyJcbiAgICAgIFtkYXRhTG9jYXRpb25dPSJkYXRhTG9jYXRpb24kIHwgYXN5bmMiXG4gICAgICBbbGFzdFVwZGF0ZWRdPSJsYXN0TG9hZGVkVGltZUluTXMkIHwgYXN5bmMiXG4gICAgICBbcGx1Z2luTG9hZFN0YXRlXT0icGx1Z2luTG9hZFN0YXRlJCB8IGFzeW5jIlxuICAgICAgW2lzRmVhdHVyZUZsYWdzTG9hZGVkXT0iaXNGZWF0dXJlRmxhZ3NMb2FkZWQkIHwgYXN5bmMiXG4gICAgICBbc2V0dGluZ3NMb2FkU3RhdGVdPSJzZXR0aW5nc0xvYWRTdGF0ZSQgfCBhc3luYyJcbiAgICAgIFtmZWF0dXJlRmxhZ3NdPSJmZWF0dXJlRmxhZ3MkIHwgYXN5bmMiXG4gICAgICBbZW52aXJvbm1lbnRGYWlsdXJlTm90Rm91bmRUZW1wbGF0ZV09ImVudmlyb25tZW50RmFpbHVyZU5vdEZvdW5kVGVtcGxhdGUiXG4gICAgICBbZW52aXJvbm1lbnRGYWlsdXJlVW5rbm93blRlbXBsYXRlXT0iZW52aXJvbm1lbnRGYWlsdXJlVW5rbm93blRlbXBsYXRlIlxuICAgID48L3BsdWdpbnMtY29tcG9uZW50PlxuICAnLHN0eWxlczpbInBsdWdpbnMtY29tcG9uZW50IHsgaGVpZ2h0OiAxMDAlOyB9Il0sY2hhbmdlRGV0ZWN0aW9uOnpuLk9uUHVzaH1dfV0sKGZ1bmN0aW9uKCl7cmV0dXJuW3t0eXBlOkl3fV19KSx7ZW52aXJvbm1lbnRGYWlsdXJlTm90Rm91bmRUZW1wbGF0ZTpbe3R5cGU6eHl9XSxlbnZpcm9ubWVudEZhaWx1cmVVbmtub3duVGVtcGxhdGU6W3t0eXBlOnh5fV19KTtjbGFzcyBZeHR7fVl4dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8WXh0KX0sWXh0Lsm1bW9kPWFvKHt0eXBlOll4dH0pLFl4dC7JtWluaj12bih7aW1wb3J0czpbW0VSLFdNLHdxXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKFl4dCxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbV3h0LFV4dF0sZXhwb3J0czpbV3h0XSxpbXBvcnRzOltFUixXTSx3cV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhZeHQse2RlY2xhcmF0aW9uczpbV3h0LFV4dF0saW1wb3J0czpbRVIsV00sd3FdLGV4cG9ydHM6W1d4dF19KSxlbyhXeHQsW1V4dF0sW3dNXSk7Y2xhc3MgcXh0e2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5zdG9yZT10LHRoaXMuZG9jdW1lbnQ9ZSx0aGlzLm9uVmlzaWJpbGl0eUNoYW5nZT10aGlzLm9uVmlzaWJpbGl0eUNoYW5nZUltcGwuYmluZCh0aGlzKSx0aGlzLnJlbG9hZEVuYWJsZWQkPXRoaXMuc3RvcmUucGlwZShGdyhETikpLHRoaXMucmVsb2FkUGVyaW9kSW5NcyQ9dGhpcy5zdG9yZS5waXBlKEZ3KEVOKSksdGhpcy5yZWxvYWRUaW1lcklkPW51bGwsdGhpcy5taXNzZWRBdXRvUmVsb2FkPSExfW5nT25Jbml0KCl7dGhpcy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLm9uVmlzaWJpbGl0eUNoYW5nZSksV3QodGhpcy5yZWxvYWRFbmFibGVkJC5waXBlKE1lKCkpLHRoaXMucmVsb2FkUGVyaW9kSW5NcyQucGlwZShNZSgpKSkuc3Vic2NyaWJlKCgoW3QsZV0pPT57dGhpcy5jYW5jZWxMb2FkKCksdCYmdGhpcy5sb2FkKGUpfSkpfW9uVmlzaWJpbGl0eUNoYW5nZUltcGwoKXsidmlzaWJsZSI9PT10aGlzLmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSYmdGhpcy5taXNzZWRBdXRvUmVsb2FkJiYodGhpcy5taXNzZWRBdXRvUmVsb2FkPSExLHRoaXMuc3RvcmUuZGlzcGF0Y2goeEUoKSkpfWxvYWQodCl7dGhpcy5yZWxvYWRUaW1lcklkPXNldFRpbWVvdXQoKCgpPT57InZpc2libGUiPT09dGhpcy5kb2N1bWVudC52aXNpYmlsaXR5U3RhdGU/dGhpcy5zdG9yZS5kaXNwYXRjaCh4RSgpKTp0aGlzLm1pc3NlZEF1dG9SZWxvYWQ9ITAsdGhpcy5sb2FkKHQpfSksdCl9Y2FuY2VsTG9hZCgpe251bGwhPT10aGlzLnJlbG9hZFRpbWVySWQmJmNsZWFyVGltZW91dCh0aGlzLnJlbG9hZFRpbWVySWQpLHRoaXMucmVsb2FkVGltZXJJZD1udWxsfW5nT25EZXN0cm95KCl7dGhpcy5jYW5jZWxMb2FkKCksdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLm9uVmlzaWJpbGl0eUNoYW5nZSl9fXF4dC7JtWZhYz1mdW5jdGlvbiB0KGUpe3JldHVybiBuZXcoZXx8cXh0KShTbShJdyksU20oWl8pKX0scXh0Lsm1Y21wPXRvKHt0eXBlOnF4dCxzZWxlY3RvcnM6W1sicmVsb2FkZXIiXV0sZGVjbHM6MCx2YXJzOjAsdGVtcGxhdGU6ZnVuY3Rpb24gdChlLG4pe30sZW5jYXBzdWxhdGlvbjoyLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChxeHQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoicmVsb2FkZXIiLHRlbXBsYXRlOiIiLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLChmdW5jdGlvbigpe3JldHVyblt7dHlwZTpJd30se3R5cGU6RG9jdW1lbnQsZGVjb3JhdG9yczpbe3R5cGU6a3IsYXJnczpbWl9dfV19XX0pLG51bGwpO2NsYXNzIFp4dHt9Wnh0Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxaeHQpfSxaeHQuybVjbXA9dG8oe3R5cGU6Wnh0LHNlbGVjdG9yczpbWyJ0ZW5zb3Jib2FyZC13cmFwcGVyLWNvbXBvbmVudCJdXSxkZWNsczoyLHZhcnM6MCxjb25zdHM6W1sxLCJwbHVnaW5zIl1dLHRlbXBsYXRlOmZ1bmN0aW9uIHQoZSxuKXsxJmUmJihUbSgwLCJwbHVnaW5zIiwwKSxUbSgxLCJyZWxvYWRlciIpKX0sZGlyZWN0aXZlczpbV3h0LHF4dF0sc3R5bGVzOlsiW19uZ2hvc3QtJUNPTVAlXSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIH1cblxuICAgICAgLnBsdWdpbnNbX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgZmxleDogMSAxO1xuICAgICAgICBvdmVyZmxvdzogYXV0bztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfSJdLGNoYW5nZURldGVjdGlvbjowfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChaeHQsW3t0eXBlOk15LGFyZ3M6W3tzZWxlY3RvcjoidGVuc29yYm9hcmQtd3JhcHBlci1jb21wb25lbnQiLHRlbXBsYXRlOidcbiAgICA8cGx1Z2lucyBjbGFzcz0icGx1Z2lucyI+PC9wbHVnaW5zPlxuICAgIDxyZWxvYWRlcj48L3JlbG9hZGVyPlxuICAnLHN0eWxlczpbIlxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICB9XG5cbiAgICAgIC5wbHVnaW5zIHtcbiAgICAgICAgZmxleDogMSAxO1xuICAgICAgICBvdmVyZmxvdzogYXV0bztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgICJdLGNoYW5nZURldGVjdGlvbjp6bi5PblB1c2h9XX1dLG51bGwsbnVsbCk7Y2xhc3MgWHh0e31YeHQuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fFh4dCl9LFh4dC7JtXByb3Y9TW4oe3Rva2VuOlh4dCxmYWN0b3J5Olh4dC7JtWZhY30pLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nRGV2TW9kZXx8bmdEZXZNb2RlKSYmaGgoWHh0LFt7dHlwZTppbX1dLG51bGwsbnVsbCk7Y29uc3QgS3h0PSJzbW9vdGhpbmciLEp4dD0icnVuQ29sb3JHcm91cCIsUXh0PSJ0YWdGaWx0ZXIiLCR4dD0icmVnZXg6IjtsZXQgdE90PWNsYXNzIGV4dGVuZHMgWHh0e2dldE1ldHJpY3NQaW5uZWRDYXJkcyh0KXtyZXR1cm4gV3QoW3Quc2VsZWN0KFBUKSx0LnNlbGVjdChrVCldKS5waXBlKEl0KCgoW3QsZV0pPT57aWYoIXQubGVuZ3RoJiYhZS5sZW5ndGgpcmV0dXJuW107Y29uc3Qgbj1bLi4udC5tYXAoKCh7cGx1Z2luOnQsdGFnOmUsc2FtcGxlOm4scnVuSWQ6b30pPT57Y29uc3QgaT17cGx1Z2luOnQsdGFnOmV9O3JldHVybiB4QSh0KSYmKGkucnVuSWQ9byksTUEodCkmJihpLnNhbXBsZT1uKSxpfSkpLC4uLmVdO3JldHVyblt7a2V5OiJwaW5uZWRDYXJkcyIsdmFsdWU6SlNPTi5zdHJpbmdpZnkobil9XX0pKSl9Z2V0RmVhdHVyZUZsYWdTdGF0ZXModCl7cmV0dXJuIFd0KFt0LnNlbGVjdCgkRCksdC5zZWxlY3QoWEQpXSkucGlwZShJdCgoKFt0LGVdKT0+e2NvbnN0IG49dC5tYXAoKHQ9Pih7a2V5Ok5BLHZhbHVlOnR9KSkpO3JldHVybiJib29sZWFuIj09dHlwZW9mIGUuZW5hYmxlZENvbG9yR3JvdXAmJm4ucHVzaCh7a2V5OklBLHZhbHVlOlN0cmluZyhlLmVuYWJsZWRDb2xvckdyb3VwKX0pLCJib29sZWFuIj09dHlwZW9mIGUuZW5hYmxlZENvbG9yR3JvdXBCeVJlZ2V4JiZuLnB1c2goe2tleTpIQSx2YWx1ZTpTdHJpbmcoZS5lbmFibGVkQ29sb3JHcm91cEJ5UmVnZXgpfSksbn0pKSl9c2VyaWFsaXplU3RhdGVUb1F1ZXJ5UGFyYW1zKHQpe3JldHVybiBXdChbdGhpcy5nZXRNZXRyaWNzUGlubmVkQ2FyZHModCksdC5zZWxlY3QoQlQpLnBpcGUoSXQoKHQ9PnQ/W3trZXk6UXh0LHZhbHVlOnR9XTpbXSkpKSx0aGlzLmdldEZlYXR1cmVGbGFnU3RhdGVzKHQpLHQuc2VsZWN0KEVUKS5waXBlKEl0KCh0PT5OdW1iZXIuaXNGaW5pdGUodC5zY2FsYXJTbW9vdGhpbmcpP1t7a2V5Okt4dCx2YWx1ZTpTdHJpbmcodC5zY2FsYXJTbW9vdGhpbmcpfV06W10pKSksdC5zZWxlY3QodU4pLnBpcGUoSXQoKHQ9PntpZighdClyZXR1cm5bXTtsZXQgZTtzd2l0Y2godC5rZXkpe2Nhc2UgdE4uRVhQRVJJTUVOVDplPSJleHBlcmltZW50IjticmVhaztjYXNlIHROLlJVTjplPSJydW4iO2JyZWFrO2Nhc2UgdE4uUkVHRVg6ZT1gcmVnZXg6JHt0LnJlZ2V4U3RyaW5nfWA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgUmFuZ2VFcnJvcigiU2VyaWFsaXphdGlvbiBub3QgaW1wbGVtZW50ZWQiKX1yZXR1cm5be2tleTpKeHQsdmFsdWU6ZX1dfSkpKV0pLnBpcGUoSXQoKHQ9PnQuZmxhdCgpKSkpfWRlc2VyaWFsaXplUXVlcnlQYXJhbXModCl7bGV0IGU9bnVsbCxuPW51bGwsbz1udWxsLGk9bnVsbDtmb3IoY29uc3R7a2V5OmEsdmFsdWU6cn1vZiB0KXN3aXRjaChhKXtjYXNlInBpbm5lZENhcmRzIjplPWVPdChyKTticmVhaztjYXNlIEt4dDpuPU51bWJlcihyKTticmVhaztjYXNlIEp4dDpzd2l0Y2gocil7Y2FzZSJleHBlcmltZW50IjppPXtrZXk6dE4uRVhQRVJJTUVOVH07YnJlYWs7Y2FzZSJydW4iOmk9e2tleTp0Ti5SVU59fWlmKHIuc3RhcnRzV2l0aCgkeHQpKXtjb25zdCB0PXIuc2xpY2UoJHh0Lmxlbmd0aCk7aT17a2V5OnROLlJFR0VYLHJlZ2V4U3RyaW5nOnR9fWJyZWFrO2Nhc2UgUXh0Om89cn1yZXR1cm57bWV0cmljczp7cGlubmVkQ2FyZHM6ZXx8W10sc21vb3RoaW5nOm4sdGFnRmlsdGVyOm99LHJ1bnM6e2dyb3VwQnk6aX19fX07ZnVuY3Rpb24gZU90KHQpe2xldCBlO3RyeXtlPUpTT04ucGFyc2UodCl9Y2F0Y2godCl7cmV0dXJuIG51bGx9aWYoIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIG51bGw7Y29uc3Qgbj1bXTtmb3IoY29uc3QgdCBvZiBlKXtjb25zdCBlPSJzdHJpbmciPT10eXBlb2YgdC5ydW5JZCxpPSJudW1iZXIiPT10eXBlb2YgdC5zYW1wbGUsYT0ic3RyaW5nIj09dHlwZW9mIHQudGFnLHI9ZXx8dm9pZCAwPT09dC5ydW5JZCxzPWl8fHZvaWQgMD09PXQuc2FtcGxlO2lmKCEoInN0cmluZyI9PXR5cGVvZiB0LnBsdWdpbiYmYSYmciYmcykpY29udGludWU7aWYoKG89dC5wbHVnaW4pIT09aEEuU0NBTEFSUyYmbyE9PWhBLkhJU1RPR1JBTVMmJm8hPT1oQS5JTUFHRVMpY29udGludWU7aWYoIXQudGFnKWNvbnRpbnVlO2lmKHhBKHQucGx1Z2luKSl7aWYoIXQucnVuSWQpY29udGludWV9ZWxzZSBpZih0LnJ1bklkKWNvbnRpbnVlO2lmKGkpe2lmKCFNQSh0LnBsdWdpbikpY29udGludWU7aWYoIU51bWJlci5pc0ludGVnZXIodC5zYW1wbGUpfHx0LnNhbXBsZTwwKWNvbnRpbnVlfWNvbnN0IGw9e3BsdWdpbjp0LnBsdWdpbix0YWc6dC50YWd9O2UmJihsLnJ1bklkPXQucnVuSWQpLGkmJihsLnNhbXBsZT10LnNhbXBsZSksbi5wdXNoKGwpfXZhciBvO3JldHVybiBufWZ1bmN0aW9uIG5PdCgpe3JldHVyblt7cm91dGVLaW5kOlprLkVYUEVSSU1FTlQscGF0aDoiLyIsbmdDb21wb25lbnQ6Wnh0LGRlZmF1bHRSb3V0ZTohMCxkZWVwTGlua1Byb3ZpZGVyOm5ldyB0T3R9XX1mdW5jdGlvbiBvT3QodCl7cmV0dXJuKGUsbik9Pntjb25zdCBvPXQoZSxuKTtyZXR1cm4gY29uc29sZS5ncm91cENvbGxhcHNlZChuLnR5cGUpLGNvbnNvbGUubG9nKCJwcmV2IHN0YXRlIixlKSxjb25zb2xlLmxvZygiYWN0aW9uIixuKSxjb25zb2xlLmxvZygibmV4dCBzdGF0ZSIsbyksY29uc29sZS5ncm91cEVuZCgpLG99fWZ1bmN0aW9uIGlPdCgpe3JldHVybiB5XygpP29PdDp0PT4oZSxuKT0+dChlLG4pfXRPdD0oZnVuY3Rpb24gYU90KHQsZSxuLG8pe3ZhciBpLGE9YXJndW1lbnRzLmxlbmd0aCxyPWE8Mz9lOm51bGw9PT1vP289T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLG4pOm87aWYoIm9iamVjdCI9PXR5cGVvZiBSZWZsZWN0JiYiZnVuY3Rpb24iPT10eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSlyPVJlZmxlY3QuZGVjb3JhdGUodCxlLG4sbyk7ZWxzZSBmb3IodmFyIHM9dC5sZW5ndGgtMTtzPj0wO3MtLSkoaT10W3NdKSYmKHI9KGE8Mz9pKHIpOmE+Mz9pKGUsbixyKTppKGUsbikpfHxyKTtyZXR1cm4gYT4zJiZyJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLHIpLHJ9KShbaW0oKV0sdE90KTtjb25zdCByT3Q9bmV3IEdhKCJSb290IHJlZHVjZXJzIHRva2VuIix7ZmFjdG9yeTooKT0+KHt9KX0pO2NsYXNzIHNPdHt9c090Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxzT3QpfSxzT3QuybVtb2Q9YW8oe3R5cGU6c090fSksc090Lsm1aW5qPXZuKHtwcm92aWRlcnM6W3twcm92aWRlOmJ3LHVzZUZhY3Rvcnk6aU90LG11bHRpOiEwfV0saW1wb3J0czpbW2RrLmZvclJvb3Qock90LHtydW50aW1lQ2hlY2tzOntzdHJpY3RTdGF0ZUltbXV0YWJpbGl0eTohMCxzdHJpY3RBY3Rpb25JbW11dGFiaWxpdHk6ITAsc3RyaWN0QWN0aW9uU2VyaWFsaXphYmlsaXR5OiExLHN0cmljdFN0YXRlU2VyaWFsaXphYmlsaXR5OiExfX0pLFdrLmZvclJvb3QoW10pXV19KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKHNPdCxbe3R5cGU6QXksYXJnczpbe2ltcG9ydHM6W2RrLmZvclJvb3Qock90LHtydW50aW1lQ2hlY2tzOntzdHJpY3RTdGF0ZUltbXV0YWJpbGl0eTohMCxzdHJpY3RBY3Rpb25JbW11dGFiaWxpdHk6ITAsc3RyaWN0QWN0aW9uU2VyaWFsaXphYmlsaXR5OiExLHN0cmljdFN0YXRlU2VyaWFsaXphYmlsaXR5OiExfX0pLFdrLmZvclJvb3QoW10pXSxwcm92aWRlcnM6W3twcm92aWRlOmJ3LHVzZUZhY3Rvcnk6aU90LG11bHRpOiEwfV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhzT3Qse2ltcG9ydHM6W2xrLFVrXX0pO2NsYXNzIGxPdHt9bE90Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxsT3QpfSxsT3QuybVtb2Q9YW8oe3R5cGU6bE90fSksbE90Lsm1aW5qPXZuKHt9KSwoInVuZGVmaW5lZCI9PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJmhoKGxPdCxbe3R5cGU6QXksYXJnczpbe2RlY2xhcmF0aW9uczpbcXh0XSxleHBvcnRzOltxeHRdfV19XSxudWxsLG51bGwpLCgidW5kZWZpbmVkIj09dHlwZW9mIG5nSml0TW9kZXx8bmdKaXRNb2RlKSYmcm8obE90LHtkZWNsYXJhdGlvbnM6W3F4dF0sZXhwb3J0czpbcXh0XX0pO2NsYXNzIGNPdHt9Y090Lsm1ZmFjPWZ1bmN0aW9uIHQoZSl7cmV0dXJuIG5ldyhlfHxjT3QpfSxjT3QuybVtb2Q9YW8oe3R5cGU6Y090fSksY090Lsm1aW5qPXZuKHtpbXBvcnRzOltbV00sWXh0LGxPdF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChjT3QsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W1p4dF0saW1wb3J0czpbV00sWXh0LGxPdF0sZXhwb3J0czpbWnh0XSxlbnRyeUNvbXBvbmVudHM6W1p4dF19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhjT3Qse2RlY2xhcmF0aW9uczpbWnh0XSxpbXBvcnRzOltXTSxZeHQsbE90XSxleHBvcnRzOltaeHRdfSk7Y2xhc3MgZE90e31kT3QuybVmYWM9ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3KGV8fGRPdCl9LGRPdC7JtW1vZD1hbyh7dHlwZTpkT3QsYm9vdHN0cmFwOlthcV19KSxkT3QuybVpbmo9dm4oe2ltcG9ydHM6W1t0VCxVdixaUCxCUyxzcSxQUy5yZWdpc3RlclJvdXRlcyhuT3QpLEpMLEtMLGxxLGNPdCxFUixncSxkcSx2cSxhQSx4cSxwcSxyRCxzeixZeHQsS04sQ3Esc090LGt4dF1dfSksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdEZXZNb2RlfHxuZ0Rldk1vZGUpJiZoaChkT3QsW3t0eXBlOkF5LGFyZ3M6W3tkZWNsYXJhdGlvbnM6W2FxXSxpbXBvcnRzOlt0VCxVdixaUCxCUyxzcSxQUy5yZWdpc3RlclJvdXRlcyhuT3QpLEpMLEtMLGxxLGNPdCxFUixncSxkcSx2cSxhQSx4cSxwcSxyRCxzeixZeHQsS04sQ3Esc090LGt4dF0sYm9vdHN0cmFwOlthcV19XX1dLG51bGwsbnVsbCksKCJ1bmRlZmluZWQiPT10eXBlb2YgbmdKaXRNb2RlfHxuZ0ppdE1vZGUpJiZybyhkT3Qse2RlY2xhcmF0aW9uczpbYXFdLGltcG9ydHM6W3RULFV2LFpQLEJTLHNxLFBTLEpMLEtMLGxxLGNPdCxFUixncSxkcSx2cSxhQSx4cSxwcSxyRCxzeixZeHQsS04sQ3Esc090LGt4dF19KSwibG9hZGluZyIhPT1kb2N1bWVudC5yZWFkeVN0YXRlP0Z2KCkuYm9vdHN0cmFwTW9kdWxlKGRPdCk6d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCgoKT0+e0Z2KCkuYm9vdHN0cmFwTW9kdWxlKGRPdCl9KSksKGZ1bmN0aW9uIHBPdCgpe2lmKGJfKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGVuYWJsZSBwcm9kIG1vZGUgYWZ0ZXIgcGxhdGZvcm0gc2V0dXAuIik7KHZvaWQgMD09PXR5cGVvZiBuZ0Rldk1vZGV8fG5nRGV2TW9kZSkmJihqbi5uZ0Rldk1vZGU9ITEpLGhfPSExfQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8pKCl9KSgpOwo=", + "headers": [ + [ + "content-type", + "application/javascript; charset=utf-8" + ] + ], + "ok": true, + "status": 200, + "status_text": "" + } + } + }, + "id": "_wpQGXu9aONh", + "outputId": "8edb7bb8-0907-4f1f-ee6e-459cc4b3c8dc" + }, + "outputs": [ + { + "data": { + "application/javascript": "\n (async () => {\n const url = new URL(await google.colab.kernel.proxyPort(6006, {'cache': true}));\n url.searchParams.set('tensorboardColab', 'true');\n const iframe = document.createElement('iframe');\n iframe.src = url;\n iframe.setAttribute('width', '100%');\n iframe.setAttribute('height', '800');\n iframe.setAttribute('frameborder', 0);\n document.body.appendChild(iframe);\n })();\n ", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# load tensorboard in colab\n", + "%load_ext tensorboard\n", + "\n", + "# see curves in tensorboard\n", + "%tensorboard --logdir ./tutorial_exps" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MfQ-yspZLuuI" + }, + "source": [ + "From the tensorboard, we can observe that changes of loss and learning rate. We can see the losses of each branch gradually decrease as the training goes by.\n", + "\n", + "## Test the Trained Detector\n", + "\n", + "After finetuning the detector, let's visualize the prediction results!" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 443 + }, + "id": "_MuZurfGLq0p", + "outputId": "d035aec4-6bad-4e04-d105-d9557f058140" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/content/mmdetection/mmdet/datasets/utils.py:69: UserWarning: \"ImageToTensor\" pipeline is replaced by \"DefaultFormatBundle\" for batch inference. It is recommended to manually replace it in the test data pipeline in your config file.\n", + " 'data pipeline in your config file.', UserWarning)\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "img = mmcv.imread('kitti_tiny/training/image_2/000068.jpeg')\n", + "\n", + "model.cfg = cfg\n", + "result = inference_detector(model, img)\n", + "show_result_pyplot(model, img, result)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "F1L8o3rtc37M" + }, + "source": [ + "## What to Do Next?\n", + "\n", + "So far, we have learnt how to test and train a two-stage detector using MMDetection. To further explore MMDetection, you could do several other things as shown below:\n", + "\n", + "- Try single-stage detectors, e.g., [RetinaNet](https://github.com/open-mmlab/mmdetection/tree/master/configs/retinanet) and [SSD](https://github.com/open-mmlab/mmdetection/tree/master/configs/ssd) in [MMDetection model zoo](https://github.com/open-mmlab/mmdetection/blob/master/docs/en/model_zoo.md). Single-stage detectors are more commonly used than two-stage detectors in industry.\n", + "- Try anchor-free detectors, e.g., [FCOS](https://github.com/open-mmlab/mmdetection/tree/master/configs/fcos) and [RepPoints](https://github.com/open-mmlab/mmdetection/tree/master/configs/reppoints) in [MMDetection model zoo](https://github.com/open-mmlab/mmdetection/blob/master/docs/en/model_zoo.md). Anchor-free detector is a new trend in the object detection community.\n", + "- Try 3D object detection using [MMDetection3D](https://github.com/open-mmlab/mmdetection3d), also one of the OpenMMLab projects. In MMDetection3D, not only can you try all the methods supported in MMDetection but also some 3D object detectors.\n" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "collapsed_sections": [], + "name": "object_detection", + "provenance": [], + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.7" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/demo/create_result_gif.py b/demo/create_result_gif.py new file mode 100644 index 0000000..d2356e9 --- /dev/null +++ b/demo/create_result_gif.py @@ -0,0 +1,163 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os +import os.path as osp + +import matplotlib.patches as mpatches +import matplotlib.pyplot as plt +import mmcv +import numpy as np + +try: + import imageio +except ImportError: + imageio = None + + +def parse_args(): + parser = argparse.ArgumentParser(description='Create GIF for demo') + parser.add_argument( + 'image_dir', + help='directory where result ' + 'images save path generated by ‘analyze_results.py’') + parser.add_argument( + '--out', + type=str, + default='result.gif', + help='gif path where will be saved') + args = parser.parse_args() + return args + + +def _generate_batch_data(sampler, batch_size): + batch = [] + for idx in sampler: + batch.append(idx) + if len(batch) == batch_size: + yield batch + batch = [] + if len(batch) > 0: + yield batch + + +def create_gif(frames, gif_name, duration=2): + """Create gif through imageio. + + Args: + frames (list[ndarray]): Image frames + gif_name (str): Saved gif name + duration (int): Display interval (s), + Default: 2 + """ + if imageio is None: + raise RuntimeError('imageio is not installed,' + 'Please use “pip install imageio” to install') + imageio.mimsave(gif_name, frames, 'GIF', duration=duration) + + +def create_frame_by_matplotlib(image_dir, + nrows=1, + fig_size=(300, 300), + font_size=15): + """Create gif frame image through matplotlib. + + Args: + image_dir (str): Root directory of result images + nrows (int): Number of rows displayed, Default: 1 + fig_size (tuple): Figure size of the pyplot figure. + Default: (300, 300) + font_size (int): Font size of texts. Default: 15 + + Returns: + list[ndarray]: image frames + """ + + result_dir_names = os.listdir(image_dir) + assert len(result_dir_names) == 2 + # Longer length has higher priority + result_dir_names.reverse() + + images_list = [] + for dir_names in result_dir_names: + images_list.append(mmcv.scandir(osp.join(image_dir, dir_names))) + + frames = [] + for paths in _generate_batch_data(zip(*images_list), nrows): + + fig, axes = plt.subplots(nrows=nrows, ncols=2) + fig.suptitle('Good/bad case selected according ' + 'to the COCO mAP of the single image') + + det_patch = mpatches.Patch(color='salmon', label='prediction') + gt_patch = mpatches.Patch(color='royalblue', label='ground truth') + # bbox_to_anchor may need to be finetuned + plt.legend( + handles=[det_patch, gt_patch], + bbox_to_anchor=(1, -0.18), + loc='lower right', + borderaxespad=0.) + + if nrows == 1: + axes = [axes] + + dpi = fig.get_dpi() + # set fig size and margin + fig.set_size_inches( + (fig_size[0] * 2 + fig_size[0] // 20) / dpi, + (fig_size[1] * nrows + fig_size[1] // 3) / dpi, + ) + + fig.tight_layout() + # set subplot margin + plt.subplots_adjust( + hspace=.05, + wspace=0.05, + left=0.02, + right=0.98, + bottom=0.02, + top=0.98) + + for i, (path_tuple, ax_tuple) in enumerate(zip(paths, axes)): + image_path_left = osp.join( + osp.join(image_dir, result_dir_names[0], path_tuple[0])) + image_path_right = osp.join( + osp.join(image_dir, result_dir_names[1], path_tuple[1])) + image_left = mmcv.imread(image_path_left) + image_left = mmcv.rgb2bgr(image_left) + image_right = mmcv.imread(image_path_right) + image_right = mmcv.rgb2bgr(image_right) + + if i == 0: + ax_tuple[0].set_title( + result_dir_names[0], fontdict={'size': font_size}) + ax_tuple[1].set_title( + result_dir_names[1], fontdict={'size': font_size}) + ax_tuple[0].imshow( + image_left, extent=(0, *fig_size, 0), interpolation='bilinear') + ax_tuple[0].axis('off') + ax_tuple[1].imshow( + image_right, + extent=(0, *fig_size, 0), + interpolation='bilinear') + ax_tuple[1].axis('off') + + canvas = fig.canvas + s, (width, height) = canvas.print_to_buffer() + buffer = np.frombuffer(s, dtype='uint8') + img_rgba = buffer.reshape(height, width, 4) + rgb, alpha = np.split(img_rgba, [3], axis=2) + img = rgb.astype('uint8') + + frames.append(img) + + return frames + + +def main(): + args = parse_args() + frames = create_frame_by_matplotlib(args.image_dir) + create_gif(frames, args.out) + + +if __name__ == '__main__': + main() diff --git a/demo/demo.jpg b/demo/demo.jpg new file mode 100644 index 0000000..dd613ce Binary files /dev/null and b/demo/demo.jpg differ diff --git a/demo/demo.mp4 b/demo/demo.mp4 new file mode 100644 index 0000000..6c06d15 Binary files /dev/null and b/demo/demo.mp4 differ diff --git a/demo/image_demo.py b/demo/image_demo.py new file mode 100644 index 0000000..129b175 --- /dev/null +++ b/demo/image_demo.py @@ -0,0 +1,68 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import asyncio +from argparse import ArgumentParser + +from mmdet.apis import (async_inference_detector, inference_detector, + init_detector, show_result_pyplot) + + +def parse_args(): + parser = ArgumentParser() + parser.add_argument('img', help='Image file') + parser.add_argument('config', help='Config file') + parser.add_argument('checkpoint', help='Checkpoint file') + parser.add_argument('--out-file', default=None, help='Path to output file') + parser.add_argument( + '--device', default='cuda:0', help='Device used for inference') + parser.add_argument( + '--palette', + default='coco', + choices=['coco', 'voc', 'citys', 'random'], + help='Color palette used for visualization') + parser.add_argument( + '--score-thr', type=float, default=0.3, help='bbox score threshold') + parser.add_argument( + '--async-test', + action='store_true', + help='whether to set async options for async inference.') + args = parser.parse_args() + return args + + +def main(args): + # build the model from a config file and a checkpoint file + model = init_detector(args.config, args.checkpoint, device=args.device) + # test a single image + result = inference_detector(model, args.img) + # show the results + show_result_pyplot( + model, + args.img, + result, + palette=args.palette, + score_thr=args.score_thr, + out_file=args.out_file) + + +async def async_main(args): + # build the model from a config file and a checkpoint file + model = init_detector(args.config, args.checkpoint, device=args.device) + # test a single image + tasks = asyncio.create_task(async_inference_detector(model, args.img)) + result = await asyncio.gather(tasks) + # show the results + show_result_pyplot( + model, + args.img, + result[0], + palette=args.palette, + score_thr=args.score_thr, + out_file=args.out_file) + + +if __name__ == '__main__': + args = parse_args() + if args.async_test: + asyncio.run(async_main(args)) + else: + main(args) diff --git a/demo/inference_demo.ipynb b/demo/inference_demo.ipynb new file mode 100644 index 0000000..d18dced --- /dev/null +++ b/demo/inference_demo.ipynb @@ -0,0 +1,100 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from mmdet.apis import init_detector, inference_detector, show_result_pyplot\n", + "import mmcv" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "config_file = '../configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py'\n", + "# download the checkpoint from model zoo and put it in `checkpoints/`\n", + "# url: https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth\n", + "checkpoint_file = '../checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth'" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# build the model from a config file and a checkpoint file\n", + "model = init_detector(config_file, checkpoint_file, device='cuda:0')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# test a single image\n", + "img = 'demo.jpg'\n", + "result = inference_detector(model, img)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# show the results\n", + "show_result_pyplot(model, img, result)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + }, + "pycharm": { + "stem_cell": { + "cell_type": "raw", + "metadata": { + "collapsed": false + }, + "source": [] + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/demo/video_demo.py b/demo/video_demo.py new file mode 100644 index 0000000..4ee1fa6 --- /dev/null +++ b/demo/video_demo.py @@ -0,0 +1,61 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse + +import cv2 +import mmcv + +from mmdet.apis import inference_detector, init_detector + + +def parse_args(): + parser = argparse.ArgumentParser(description='MMDetection video demo') + parser.add_argument('video', help='Video file') + parser.add_argument('config', help='Config file') + parser.add_argument('checkpoint', help='Checkpoint file') + parser.add_argument( + '--device', default='cuda:0', help='Device used for inference') + parser.add_argument( + '--score-thr', type=float, default=0.3, help='Bbox score threshold') + parser.add_argument('--out', type=str, help='Output video file') + parser.add_argument('--show', action='store_true', help='Show video') + parser.add_argument( + '--wait-time', + type=float, + default=1, + help='The interval of show (s), 0 is block') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + assert args.out or args.show, \ + ('Please specify at least one operation (save/show the ' + 'video) with the argument "--out" or "--show"') + + model = init_detector(args.config, args.checkpoint, device=args.device) + + video_reader = mmcv.VideoReader(args.video) + video_writer = None + if args.out: + fourcc = cv2.VideoWriter_fourcc(*'mp4v') + video_writer = cv2.VideoWriter( + args.out, fourcc, video_reader.fps, + (video_reader.width, video_reader.height)) + + for frame in mmcv.track_iter_progress(video_reader): + result = inference_detector(model, frame) + frame = model.show_result(frame, result, score_thr=args.score_thr) + if args.show: + cv2.namedWindow('video', 0) + mmcv.imshow(frame, 'video', args.wait_time) + if args.out: + video_writer.write(frame) + + if video_writer: + video_writer.release() + cv2.destroyAllWindows() + + +if __name__ == '__main__': + main() diff --git a/demo/video_gpuaccel_demo.py b/demo/video_gpuaccel_demo.py new file mode 100644 index 0000000..e19eb98 --- /dev/null +++ b/demo/video_gpuaccel_demo.py @@ -0,0 +1,113 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse + +import cv2 +import mmcv +import numpy as np +import torch +from torchvision.transforms import functional as F + +from mmdet.apis import init_detector +from mmdet.datasets.pipelines import Compose + +try: + import ffmpegcv +except ImportError: + raise ImportError( + 'Please install ffmpegcv with:\n\n pip install ffmpegcv') + + +def parse_args(): + parser = argparse.ArgumentParser( + description='MMDetection video demo with GPU acceleration') + parser.add_argument('video', help='Video file') + parser.add_argument('config', help='Config file') + parser.add_argument('checkpoint', help='Checkpoint file') + parser.add_argument( + '--device', default='cuda:0', help='Device used for inference') + parser.add_argument( + '--score-thr', type=float, default=0.3, help='Bbox score threshold') + parser.add_argument('--out', type=str, help='Output video file') + parser.add_argument('--show', action='store_true', help='Show video') + parser.add_argument( + '--nvdecode', action='store_true', help='Use NVIDIA decoder') + parser.add_argument( + '--wait-time', + type=float, + default=1, + help='The interval of show (s), 0 is block') + args = parser.parse_args() + return args + + +def prefetch_img_metas(cfg, ori_wh): + w, h = ori_wh + cfg.data.test.pipeline[0].type = 'LoadImageFromWebcam' + test_pipeline = Compose(cfg.data.test.pipeline) + data = {'img': np.zeros((h, w, 3), dtype=np.uint8)} + data = test_pipeline(data) + img_metas = data['img_metas'][0].data + return img_metas + + +def process_img(frame_resize, img_metas, device): + assert frame_resize.shape == img_metas['pad_shape'] + frame_cuda = torch.from_numpy(frame_resize).to(device).float() + frame_cuda = frame_cuda.permute(2, 0, 1) # HWC to CHW + mean = torch.from_numpy(img_metas['img_norm_cfg']['mean']).to(device) + std = torch.from_numpy(img_metas['img_norm_cfg']['std']).to(device) + frame_cuda = F.normalize(frame_cuda, mean=mean, std=std, inplace=True) + frame_cuda = frame_cuda[None, :, :, :] # NCHW + data = {'img': [frame_cuda], 'img_metas': [[img_metas]]} + return data + + +def main(): + args = parse_args() + assert args.out or args.show, \ + ('Please specify at least one operation (save/show the ' + 'video) with the argument "--out" or "--show"') + + model = init_detector(args.config, args.checkpoint, device=args.device) + + if args.nvdecode: + VideoCapture = ffmpegcv.VideoCaptureNV + else: + VideoCapture = ffmpegcv.VideoCapture + video_origin = VideoCapture(args.video) + img_metas = prefetch_img_metas(model.cfg, + (video_origin.width, video_origin.height)) + resize_wh = img_metas['pad_shape'][1::-1] + video_resize = VideoCapture( + args.video, + resize=resize_wh, + resize_keepratio=True, + resize_keepratioalign='topleft', + pix_fmt='rgb24') + video_writer = None + if args.out: + video_writer = ffmpegcv.VideoWriter(args.out, fps=video_origin.fps) + + with torch.no_grad(): + for frame_resize, frame_origin in zip( + mmcv.track_iter_progress(video_resize), video_origin): + data = process_img(frame_resize, img_metas, args.device) + result = model(return_loss=False, rescale=True, **data)[0] + frame_mask = model.show_result( + frame_origin, result, score_thr=args.score_thr) + if args.show: + cv2.namedWindow('video', 0) + mmcv.imshow(frame_mask, 'video', args.wait_time) + if args.out: + video_writer.write(frame_mask) + + if video_writer: + video_writer.release() + video_origin.release() + video_resize.release() + + cv2.destroyAllWindows() + + +if __name__ == '__main__': + main() diff --git a/demo/webcam_demo.py b/demo/webcam_demo.py new file mode 100644 index 0000000..b9ead6e --- /dev/null +++ b/demo/webcam_demo.py @@ -0,0 +1,47 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse + +import cv2 +import torch + +from mmdet.apis import inference_detector, init_detector + + +def parse_args(): + parser = argparse.ArgumentParser(description='MMDetection webcam demo') + parser.add_argument('config', help='test config file path') + parser.add_argument('checkpoint', help='checkpoint file') + parser.add_argument( + '--device', type=str, default='cuda:0', help='CPU/CUDA device option') + parser.add_argument( + '--camera-id', type=int, default=0, help='camera device id') + parser.add_argument( + '--score-thr', type=float, default=0.5, help='bbox score threshold') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + + device = torch.device(args.device) + + model = init_detector(args.config, args.checkpoint, device=device) + + camera = cv2.VideoCapture(args.camera_id) + + print('Press "Esc", "q" or "Q" to exit.') + while True: + ret_val, img = camera.read() + result = inference_detector(model, img) + + ch = cv2.waitKey(1) + if ch == 27 or ch == ord('q') or ch == ord('Q'): + break + + model.show_result( + img, result, score_thr=args.score_thr, wait_time=1, show=True) + + +if __name__ == '__main__': + main() diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..af53cb5 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,29 @@ +ARG PYTORCH="1.6.0" +ARG CUDA="10.1" +ARG CUDNN="7" + +FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel + +ENV TORCH_CUDA_ARCH_LIST="6.0 6.1 7.0+PTX" +ENV TORCH_NVCC_FLAGS="-Xfatbin -compress-all" +ENV CMAKE_PREFIX_PATH="$(dirname $(which conda))/../" + +# To fix GPG key error when running apt-get update +RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub +RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub + +RUN apt-get update && apt-get install -y ffmpeg libsm6 libxext6 git ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Install MMCV +RUN pip install --no-cache-dir --upgrade pip wheel setuptools +RUN pip install --no-cache-dir mmcv-full==1.3.17 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.6.0/index.html + +# Install MMDetection +RUN conda clean --all +RUN git clone https://github.com/open-mmlab/mmdetection.git /mmdetection +WORKDIR /mmdetection +ENV FORCE_CUDA="1" +RUN pip install --no-cache-dir -r requirements/build.txt +RUN pip install --no-cache-dir -e . diff --git a/docker/serve/Dockerfile b/docker/serve/Dockerfile new file mode 100644 index 0000000..c53613c --- /dev/null +++ b/docker/serve/Dockerfile @@ -0,0 +1,49 @@ +ARG PYTORCH="1.6.0" +ARG CUDA="10.1" +ARG CUDNN="7" +FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel + +ARG MMCV="1.3.17" +ARG MMDET="2.28.2" + +ENV PYTHONUNBUFFERED TRUE + +RUN apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \ + ca-certificates \ + g++ \ + openjdk-11-jre-headless \ + # MMDet Requirements + ffmpeg libsm6 libxext6 git ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 \ + && rm -rf /var/lib/apt/lists/* + +ENV PATH="/opt/conda/bin:$PATH" +RUN export FORCE_CUDA=1 + +# TORCHSEVER +RUN pip install torchserve torch-model-archiver + +# MMLAB +ARG PYTORCH +ARG CUDA +RUN ["/bin/bash", "-c", "pip install mmcv-full==${MMCV} -f https://download.openmmlab.com/mmcv/dist/cu${CUDA//./}/torch${PYTORCH}/index.html"] +RUN pip install mmdet==${MMDET} + +RUN useradd -m model-server \ + && mkdir -p /home/model-server/tmp + +COPY entrypoint.sh /usr/local/bin/entrypoint.sh + +RUN chmod +x /usr/local/bin/entrypoint.sh \ + && chown -R model-server /home/model-server + +COPY config.properties /home/model-server/config.properties +RUN mkdir /home/model-server/model-store && chown -R model-server /home/model-server/model-store + +EXPOSE 8080 8081 8082 + +USER model-server +WORKDIR /home/model-server +ENV TEMP=/home/model-server/tmp +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] +CMD ["serve"] diff --git a/docker/serve/config.properties b/docker/serve/config.properties new file mode 100644 index 0000000..efb9c47 --- /dev/null +++ b/docker/serve/config.properties @@ -0,0 +1,5 @@ +inference_address=http://0.0.0.0:8080 +management_address=http://0.0.0.0:8081 +metrics_address=http://0.0.0.0:8082 +model_store=/home/model-server/model-store +load_models=all diff --git a/docker/serve/entrypoint.sh b/docker/serve/entrypoint.sh new file mode 100644 index 0000000..41ba00b --- /dev/null +++ b/docker/serve/entrypoint.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -e + +if [[ "$1" = "serve" ]]; then + shift 1 + torchserve --start --ts-config /home/model-server/config.properties +else + eval "$@" +fi + +# prevent docker exit +tail -f /dev/null diff --git a/docs/en/1_exist_data_model.md b/docs/en/1_exist_data_model.md new file mode 100644 index 0000000..28cd39a --- /dev/null +++ b/docs/en/1_exist_data_model.md @@ -0,0 +1,697 @@ +# 1: Inference and train with existing models and standard datasets + +MMDetection provides hundreds of existing and existing detection models in [Model Zoo](https://mmdetection.readthedocs.io/en/latest/model_zoo.html)), and supports multiple standard datasets, including Pascal VOC, COCO, CityScapes, LVIS, etc. This note will show how to perform common tasks on these existing models and standard datasets, including: + +- Use existing models to inference on given images. +- Test existing models on standard datasets. +- Train predefined models on standard datasets. + +## Inference with existing models + +By inference, we mean using trained models to detect objects on images. In MMDetection, a model is defined by a configuration file and existing model parameters are save in a checkpoint file. + +To start with, we recommend [Faster RCNN](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn) with this [configuration file](https://github.com/open-mmlab/mmdetection/blob/master/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py) and this [checkpoint file](https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth). It is recommended to download the checkpoint file to `checkpoints` directory. + +### High-level APIs for inference + +MMDetection provide high-level Python APIs for inference on images. Here is an example of building the model and inference on given images or videos. + +```python +from mmdet.apis import init_detector, inference_detector +import mmcv + +# Specify the path to model config and checkpoint file +config_file = 'configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +checkpoint_file = 'checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth' + +# build the model from a config file and a checkpoint file +model = init_detector(config_file, checkpoint_file, device='cuda:0') + +# test a single image and show the results +img = 'test.jpg' # or img = mmcv.imread(img), which will only load it once +result = inference_detector(model, img) +# visualize the results in a new window +model.show_result(img, result) +# or save the visualization results to image files +model.show_result(img, result, out_file='result.jpg') + +# test a video and show the results +video = mmcv.VideoReader('video.mp4') +for frame in video: + result = inference_detector(model, frame) + model.show_result(frame, result, wait_time=1) +``` + +A notebook demo can be found in [demo/inference_demo.ipynb](https://github.com/open-mmlab/mmdetection/blob/master/demo/inference_demo.ipynb). + +Note: `inference_detector` only supports single-image inference for now. + +### Asynchronous interface - supported for Python 3.7+ + +For Python 3.7+, MMDetection also supports async interfaces. +By utilizing CUDA streams, it allows not to block CPU on GPU bound inference code and enables better CPU/GPU utilization for single-threaded application. Inference can be done concurrently either between different input data samples or between different models of some inference pipeline. + +See `tests/async_benchmark.py` to compare the speed of synchronous and asynchronous interfaces. + +```python +import asyncio +import torch +from mmdet.apis import init_detector, async_inference_detector +from mmdet.utils.contextmanagers import concurrent + +async def main(): + config_file = 'configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' + checkpoint_file = 'checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth' + device = 'cuda:0' + model = init_detector(config_file, checkpoint=checkpoint_file, device=device) + + # queue is used for concurrent inference of multiple images + streamqueue = asyncio.Queue() + # queue size defines concurrency level + streamqueue_size = 3 + + for _ in range(streamqueue_size): + streamqueue.put_nowait(torch.cuda.Stream(device=device)) + + # test a single image and show the results + img = 'test.jpg' # or img = mmcv.imread(img), which will only load it once + + async with concurrent(streamqueue): + result = await async_inference_detector(model, img) + + # visualize the results in a new window + model.show_result(img, result) + # or save the visualization results to image files + model.show_result(img, result, out_file='result.jpg') + + +asyncio.run(main()) + +``` + +### Demos + +We also provide three demo scripts, implemented with high-level APIs and supporting functionality codes. +Source codes are available [here](https://github.com/open-mmlab/mmdetection/tree/master/demo). + +#### Image demo + +This script performs inference on a single image. + +```shell +python demo/image_demo.py \ + ${IMAGE_FILE} \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + [--device ${GPU_ID}] \ + [--score-thr ${SCORE_THR}] +``` + +Examples: + +```shell +python demo/image_demo.py demo/demo.jpg \ + configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \ + checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \ + --device cpu +``` + +#### Webcam demo + +This is a live demo from a webcam. + +```shell +python demo/webcam_demo.py \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + [--device ${GPU_ID}] \ + [--camera-id ${CAMERA-ID}] \ + [--score-thr ${SCORE_THR}] +``` + +Examples: + +```shell +python demo/webcam_demo.py \ + configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \ + checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth +``` + +#### Video demo + +This script performs inference on a video. + +```shell +python demo/video_demo.py \ + ${VIDEO_FILE} \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + [--device ${GPU_ID}] \ + [--score-thr ${SCORE_THR}] \ + [--out ${OUT_FILE}] \ + [--show] \ + [--wait-time ${WAIT_TIME}] +``` + +Examples: + +```shell +python demo/video_demo.py demo/demo.mp4 \ + configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \ + checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \ + --out result.mp4 +``` + +#### Video demo with GPU acceleration + +This script performs inference on a video with GPU acceleration. + +```shell +python demo/video_gpuaccel_demo.py \ + ${VIDEO_FILE} \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + [--device ${GPU_ID}] \ + [--score-thr ${SCORE_THR}] \ + [--nvdecode] \ + [--out ${OUT_FILE}] \ + [--show] \ + [--wait-time ${WAIT_TIME}] +``` + +Examples: + +```shell +python demo/video_gpuaccel_demo.py demo/demo.mp4 \ + configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \ + checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \ + --nvdecode --out result.mp4 +``` + +## Test existing models on standard datasets + +To evaluate a model's accuracy, one usually tests the model on some standard datasets. +MMDetection supports multiple public datasets including COCO, Pascal VOC, CityScapes, and [more](https://github.com/open-mmlab/mmdetection/tree/master/configs/_base_/datasets). +This section will show how to test existing models on supported datasets. + +### Prepare datasets + +Public datasets like [Pascal VOC](http://host.robots.ox.ac.uk/pascal/VOC/index.html) or mirror and [COCO](https://cocodataset.org/#download) are available from official websites or mirrors. Note: In the detection task, Pascal VOC 2012 is an extension of Pascal VOC 2007 without overlap, and we usually use them together. +It is recommended to download and extract the dataset somewhere outside the project directory and symlink the dataset root to `$MMDETECTION/data` as below. +If your folder structure is different, you may need to change the corresponding paths in config files. + +We provide a script to download datasets such as COCO , you can run `python tools/misc/download_dataset.py --dataset-name coco2017` to download COCO dataset. + +For more usage please refer to [dataset-download](https://github.com/open-mmlab/mmdetection/tree/master/docs/en/useful_tools.md#dataset-download) + +```text +mmdetection +├── mmdet +├── tools +├── configs +├── data +│ ├── coco +│ │ ├── annotations +│ │ ├── train2017 +│ │ ├── val2017 +│ │ ├── test2017 +│ ├── cityscapes +│ │ ├── annotations +│ │ ├── leftImg8bit +│ │ │ ├── train +│ │ │ ├── val +│ │ ├── gtFine +│ │ │ ├── train +│ │ │ ├── val +│ ├── VOCdevkit +│ │ ├── VOC2007 +│ │ ├── VOC2012 +``` + +Some models require additional [COCO-stuff](http://calvin.inf.ed.ac.uk/wp-content/uploads/data/cocostuffdataset/stuffthingmaps_trainval2017.zip) datasets, such as HTC, DetectoRS and SCNet, you can download and unzip then move to the coco folder. The directory should be like this. + +```text +mmdetection +├── data +│ ├── coco +│ │ ├── annotations +│ │ ├── train2017 +│ │ ├── val2017 +│ │ ├── test2017 +│ │ ├── stuffthingmaps +``` + +Panoptic segmentation models like PanopticFPN require additional [COCO Panoptic](http://images.cocodataset.org/annotations/panoptic_annotations_trainval2017.zip) datasets, you can download and unzip then move to the coco annotation folder. The directory should be like this. + +```text +mmdetection +├── data +│ ├── coco +│ │ ├── annotations +│ │ │ ├── panoptic_train2017.json +│ │ │ ├── panoptic_train2017 +│ │ │ ├── panoptic_val2017.json +│ │ │ ├── panoptic_val2017 +│ │ ├── train2017 +│ │ ├── val2017 +│ │ ├── test2017 +``` + +The [cityscapes](https://www.cityscapes-dataset.com/) annotations need to be converted into the coco format using `tools/dataset_converters/cityscapes.py`: + +```shell +pip install cityscapesscripts + +python tools/dataset_converters/cityscapes.py \ + ./data/cityscapes \ + --nproc 8 \ + --out-dir ./data/cityscapes/annotations +``` + +TODO: CHANGE TO THE NEW PATH + +### Test existing models + +We provide testing scripts for evaluating an existing model on the whole dataset (COCO, PASCAL VOC, Cityscapes, etc.). +The following testing environments are supported: + +- single GPU +- CPU +- single node multiple GPUs +- multiple nodes + +Choose the proper script to perform testing depending on the testing environment. + +```shell +# single-gpu testing +python tools/test.py \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + [--out ${RESULT_FILE}] \ + [--eval ${EVAL_METRICS}] \ + [--show] + +# CPU: disable GPUs and run single-gpu testing script +export CUDA_VISIBLE_DEVICES=-1 +python tools/test.py \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + [--out ${RESULT_FILE}] \ + [--eval ${EVAL_METRICS}] \ + [--show] + +# multi-gpu testing +bash tools/dist_test.sh \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + ${GPU_NUM} \ + [--out ${RESULT_FILE}] \ + [--eval ${EVAL_METRICS}] +``` + +`tools/dist_test.sh` also supports multi-node testing, but relies on PyTorch's [launch utility](https://pytorch.org/docs/stable/distributed.html#launch-utility). + +Optional arguments: + +- `RESULT_FILE`: Filename of the output results in pickle format. If not specified, the results will not be saved to a file. +- `EVAL_METRICS`: Items to be evaluated on the results. Allowed values depend on the dataset, e.g., `proposal_fast`, `proposal`, `bbox`, `segm` are available for COCO, `mAP`, `recall` for PASCAL VOC. Cityscapes could be evaluated by `cityscapes` as well as all COCO metrics. +- `--show`: If specified, detection results will be plotted on the images and shown in a new window. It is only applicable to single GPU testing and used for debugging and visualization. Please make sure that GUI is available in your environment. Otherwise, you may encounter an error like `cannot connect to X server`. +- `--show-dir`: If specified, detection results will be plotted on the images and saved to the specified directory. It is only applicable to single GPU testing and used for debugging and visualization. You do NOT need a GUI available in your environment for using this option. +- `--show-score-thr`: If specified, detections with scores below this threshold will be removed. +- `--cfg-options`: if specified, the key-value pair optional cfg will be merged into config file +- `--eval-options`: if specified, the key-value pair optional eval cfg will be kwargs for dataset.evaluate() function, it's only for evaluation + +### Examples + +Assuming that you have already downloaded the checkpoints to the directory `checkpoints/`. + +1. Test Faster R-CNN and visualize the results. Press any key for the next image. + Config and checkpoint files are available [here](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn). + + ```shell + python tools/test.py \ + configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \ + checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \ + --show + ``` + +2. Test Faster R-CNN and save the painted images for future visualization. + Config and checkpoint files are available [here](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn). + + ```shell + python tools/test.py \ + configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \ + checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \ + --show-dir faster_rcnn_r50_fpn_1x_results + ``` + +3. Test Faster R-CNN on PASCAL VOC (without saving the test results) and evaluate the mAP. + Config and checkpoint files are available [here](https://github.com/open-mmlab/mmdetection/tree/master/configs/pascal_voc). + + ```shell + python tools/test.py \ + configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc.py \ + checkpoints/faster_rcnn_r50_fpn_1x_voc0712_20200624-c9895d40.pth \ + --eval mAP + ``` + +4. Test Mask R-CNN with 8 GPUs, and evaluate the bbox and mask AP. + Config and checkpoint files are available [here](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn). + + ```shell + ./tools/dist_test.sh \ + configs/mask_rcnn_r50_fpn_1x_coco.py \ + checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth \ + 8 \ + --out results.pkl \ + --eval bbox segm + ``` + +5. Test Mask R-CNN with 8 GPUs, and evaluate the **classwise** bbox and mask AP. + Config and checkpoint files are available [here](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn). + + ```shell + ./tools/dist_test.sh \ + configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py \ + checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth \ + 8 \ + --out results.pkl \ + --eval bbox segm \ + --options "classwise=True" + ``` + +6. Test Mask R-CNN on COCO test-dev with 8 GPUs, and generate JSON files for submitting to the official evaluation server. + Config and checkpoint files are available [here](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn). + + ```shell + ./tools/dist_test.sh \ + configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py \ + checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth \ + 8 \ + --format-only \ + --options "jsonfile_prefix=./mask_rcnn_test-dev_results" + ``` + + This command generates two JSON files `mask_rcnn_test-dev_results.bbox.json` and `mask_rcnn_test-dev_results.segm.json`. + +7. Test Mask R-CNN on Cityscapes test with 8 GPUs, and generate txt and png files for submitting to the official evaluation server. + Config and checkpoint files are available [here](https://github.com/open-mmlab/mmdetection/tree/master/configs/cityscapes). + + ```shell + ./tools/dist_test.sh \ + configs/cityscapes/mask_rcnn_r50_fpn_1x_cityscapes.py \ + checkpoints/mask_rcnn_r50_fpn_1x_cityscapes_20200227-afe51d5a.pth \ + 8 \ + --format-only \ + --options "txtfile_prefix=./mask_rcnn_cityscapes_test_results" + ``` + + The generated png and txt would be under `./mask_rcnn_cityscapes_test_results` directory. + +### Test without Ground Truth Annotations + +MMDetection supports to test models without ground-truth annotations using `CocoDataset`. If your dataset format is not in COCO format, please convert them to COCO format. For example, if your dataset format is VOC, you can directly convert it to COCO format by the [script in tools.](https://github.com/open-mmlab/mmdetection/tree/master/tools/dataset_converters/pascal_voc.py) If your dataset format is Cityscapes, you can directly convert it to COCO format by the [script in tools.](https://github.com/open-mmlab/mmdetection/tree/master/tools/dataset_converters/cityscapes.py) The rest of the formats can be converted using [this script](https://github.com/open-mmlab/mmdetection/tree/master/tools/dataset_converters/images2coco.py). + +```shel +python tools/dataset_converters/images2coco.py \ + ${IMG_PATH} \ + ${CLASSES} \ + ${OUT} \ + [--exclude-extensions] +``` + +arguments: + +- `IMG_PATH`: The root path of images. +- `CLASSES`: The text file with a list of categories. +- `OUT`: The output annotation json file name. The save dir is in the same directory as `IMG_PATH`. +- `exclude-extensions`: The suffix of images to be excluded, such as 'png' and 'bmp'. + +After the conversion is complete, you can use the following command to test + +```shell +# single-gpu testing +python tools/test.py \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + --format-only \ + --options ${JSONFILE_PREFIX} \ + [--show] + +# CPU: disable GPUs and run single-gpu testing script +export CUDA_VISIBLE_DEVICES=-1 +python tools/test.py \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + [--out ${RESULT_FILE}] \ + [--eval ${EVAL_METRICS}] \ + [--show] + +# multi-gpu testing +bash tools/dist_test.sh \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + ${GPU_NUM} \ + --format-only \ + --options ${JSONFILE_PREFIX} \ + [--show] +``` + +Assuming that the checkpoints in the [model zoo](https://mmdetection.readthedocs.io/en/latest/modelzoo_statistics.html) have been downloaded to the directory `checkpoints/`, we can test Mask R-CNN on COCO test-dev with 8 GPUs, and generate JSON files using the following command. + +```sh +./tools/dist_test.sh \ + configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py \ + checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth \ + 8 \ + --format-only \ + --options "jsonfile_prefix=./mask_rcnn_test-dev_results" +``` + +This command generates two JSON files `mask_rcnn_test-dev_results.bbox.json` and `mask_rcnn_test-dev_results.segm.json`. + +### Batch Inference + +MMDetection supports inference with a single image or batched images in test mode. By default, we use single-image inference and you can use batch inference by modifying `samples_per_gpu` in the config of test data. You can do that either by modifying the config as below. + +```shell +data = dict(train=dict(...), val=dict(...), test=dict(samples_per_gpu=2, ...)) +``` + +Or you can set it through `--cfg-options` as `--cfg-options data.test.samples_per_gpu=2` + +### Deprecated ImageToTensor + +In test mode, `ImageToTensor` pipeline is deprecated, it's replaced by `DefaultFormatBundle` that recommended to manually replace it in the test data pipeline in your config file. examples: + +```python +# use ImageToTensor (deprecated) +pipelines = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', mean=[0, 0, 0], std=[1, 1, 1]), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) + ] + +# manually replace ImageToTensor to DefaultFormatBundle (recommended) +pipelines = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', mean=[0, 0, 0], std=[1, 1, 1]), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img']), + ]) + ] +``` + +## Train predefined models on standard datasets + +MMDetection also provides out-of-the-box tools for training detection models. +This section will show how to train _predefined_ models (under [configs](https://github.com/open-mmlab/mmdetection/tree/master/configs)) on standard datasets i.e. COCO. + +### Prepare datasets + +Training requires preparing datasets too. See section [Prepare datasets](#prepare-datasets) above for details. + +**Note**: +Currently, the config files under `configs/cityscapes` use COCO pretrained weights to initialize. +You could download the existing models in advance if the network connection is unavailable or slow. Otherwise, it would cause errors at the beginning of training. + +### Learning rate automatically scale + +**Important**: The default learning rate in config files is for 8 GPUs and 2 sample per gpu (batch size = 8 * 2 = 16). And it had been set to `auto_scale_lr.base_batch_size` in `config/_base_/default_runtime.py`. Learning rate will be automatically scaled base on this value when the batch size is `16`. Meanwhile, in order not to affect other codebase which based on mmdet, the flag `auto_scale_lr.enable` is set to `False` by default. + +If you want to enable this feature, you need to add argument `--auto-scale-lr`. And you need to check the config name which you want to use before you process the command, because the config name indicates the default batch size. +By default, it is `8 x 2 = 16 batch size`, like `faster_rcnn_r50_caffe_fpn_90k_coco.py` or `pisa_faster_rcnn_x101_32x4d_fpn_1x_coco.py`. In other cases, you will see the config file name have `_NxM_` in dictating, like `cornernet_hourglass104_mstest_32x3_210e_coco.py` which batch size is `32 x 3 = 96`, or `scnet_x101_64x4d_fpn_8x1_20e_coco.py` which batch size is `8 x 1 = 8`. + +**Please remember to check the bottom of the specific config file you want to use, it will have `auto_scale_lr.base_batch_size` if the batch size is not `16`. If you can't find those values, check the config file which in `_base_=[xxx]` and you will find it. Please do not modify its values if you want to automatically scale the LR.** + +Learning rate automatically scale basic usage is as follows. + +```shell +python tools/train.py \ + ${CONFIG_FILE} \ + --auto-scale-lr \ + [optional arguments] +``` + +If you enabled this feature, the learning rate will be automatically scaled according to the number of GPUs of the machine and the batch size of training. See [linear scaling rule](https://arxiv.org/abs/1706.02677) for details. For example, If there are 4 GPUs and 2 pictures on each GPU, `lr = 0.01`, then if there are 16 GPUs and 4 pictures on each GPU, it will automatically scale to `lr = 0.08`. + +If you don't want to use it, you need to calculate the learning rate according to the [linear scaling rule](https://arxiv.org/abs/1706.02677) manually then change `optimizer.lr` in specific config file. + +### Training on a single GPU + +We provide `tools/train.py` to launch training jobs on a single GPU. +The basic usage is as follows. + +```shell +python tools/train.py \ + ${CONFIG_FILE} \ + [optional arguments] +``` + +During training, log files and checkpoints will be saved to the working directory, which is specified by `work_dir` in the config file or via CLI argument `--work-dir`. + +By default, the model is evaluated on the validation set every epoch, the evaluation interval can be specified in the config file as shown below. + +```python +# evaluate the model every 12 epoch. +evaluation = dict(interval=12) +``` + +This tool accepts several optional arguments, including: + +- `--no-validate` (**not suggested**): Disable evaluation during training. +- `--work-dir ${WORK_DIR}`: Override the working directory. +- `--resume-from ${CHECKPOINT_FILE}`: Resume from a previous checkpoint file. +- `--options 'Key=value'`: Overrides other settings in the used config. + +**Note**: + +Difference between `resume-from` and `load-from`: + +`resume-from` loads both the model weights and optimizer status, and the epoch is also inherited from the specified checkpoint. It is usually used for resuming the training process that is interrupted accidentally. +`load-from` only loads the model weights and the training epoch starts from 0. It is usually used for finetuning. + +### Training on CPU + +The process of training on the CPU is consistent with single GPU training. We just need to disable GPUs before the training process. + +```shell +export CUDA_VISIBLE_DEVICES=-1 +``` + +And then run the script [above](#training-on-a-single-GPU). + +**Note**: + +We do not recommend users to use CPU for training because it is too slow. We support this feature to allow users to debug on machines without GPU for convenience. + +### Training on multiple GPUs + +We provide `tools/dist_train.sh` to launch training on multiple GPUs. +The basic usage is as follows. + +```shell +bash ./tools/dist_train.sh \ + ${CONFIG_FILE} \ + ${GPU_NUM} \ + [optional arguments] +``` + +Optional arguments remain the same as stated [above](#training-on-a-single-GPU). + +#### Launch multiple jobs simultaneously + +If you would like to launch multiple jobs on a single machine, e.g., 2 jobs of 4-GPU training on a machine with 8 GPUs, +you need to specify different ports (29500 by default) for each job to avoid communication conflict. + +If you use `dist_train.sh` to launch training jobs, you can set the port in commands. + +```shell +CUDA_VISIBLE_DEVICES=0,1,2,3 PORT=29500 ./tools/dist_train.sh ${CONFIG_FILE} 4 +CUDA_VISIBLE_DEVICES=4,5,6,7 PORT=29501 ./tools/dist_train.sh ${CONFIG_FILE} 4 +``` + +### Train with multiple machines + +If you launch with multiple machines simply connected with ethernet, you can simply run following commands: + +On the first machine: + +```shell +NNODES=2 NODE_RANK=0 PORT=$MASTER_PORT MASTER_ADDR=$MASTER_ADDR sh tools/dist_train.sh $CONFIG $GPUS +``` + +On the second machine: + +```shell +NNODES=2 NODE_RANK=1 PORT=$MASTER_PORT MASTER_ADDR=$MASTER_ADDR sh tools/dist_train.sh $CONFIG $GPUS +``` + +Usually it is slow if you do not have high speed networking like InfiniBand. + +### Manage jobs with Slurm + +[Slurm](https://slurm.schedmd.com/) is a good job scheduling system for computing clusters. +On a cluster managed by Slurm, you can use `slurm_train.sh` to spawn training jobs. It supports both single-node and multi-node training. + +The basic usage is as follows. + +```shell +[GPUS=${GPUS}] ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} ${WORK_DIR} +``` + +Below is an example of using 16 GPUs to train Mask R-CNN on a Slurm partition named _dev_, and set the work-dir to some shared file systems. + +```shell +GPUS=16 ./tools/slurm_train.sh dev mask_r50_1x configs/mask_rcnn_r50_fpn_1x_coco.py /nfs/xxxx/mask_rcnn_r50_fpn_1x +``` + +You can check [the source code](https://github.com/open-mmlab/mmdetection/blob/master/tools/slurm_train.sh) to review full arguments and environment variables. + +When using Slurm, the port option need to be set in one of the following ways: + +1. Set the port through `--options`. This is more recommended since it does not change the original configs. + + ```shell + CUDA_VISIBLE_DEVICES=0,1,2,3 GPUS=4 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config1.py ${WORK_DIR} --options 'dist_params.port=29500' + CUDA_VISIBLE_DEVICES=4,5,6,7 GPUS=4 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config2.py ${WORK_DIR} --options 'dist_params.port=29501' + ``` + +2. Modify the config files to set different communication ports. + + In `config1.py`, set + + ```python + dist_params = dict(backend='nccl', port=29500) + ``` + + In `config2.py`, set + + ```python + dist_params = dict(backend='nccl', port=29501) + ``` + + Then you can launch two jobs with `config1.py` and `config2.py`. + + ```shell + CUDA_VISIBLE_DEVICES=0,1,2,3 GPUS=4 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config1.py ${WORK_DIR} + CUDA_VISIBLE_DEVICES=4,5,6,7 GPUS=4 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config2.py ${WORK_DIR} + ``` diff --git a/docs/en/2_new_data_model.md b/docs/en/2_new_data_model.md new file mode 100644 index 0000000..408e8d1 --- /dev/null +++ b/docs/en/2_new_data_model.md @@ -0,0 +1,266 @@ +# 2: Train with customized datasets + +In this note, you will know how to inference, test, and train predefined models with customized datasets. We use the [balloon dataset](https://github.com/matterport/Mask_RCNN/tree/master/samples/balloon) as an example to describe the whole process. + +The basic steps are as below: + +1. Prepare the customized dataset +2. Prepare a config +3. Train, test, inference models on the customized dataset. + +## Prepare the customized dataset + +There are three ways to support a new dataset in MMDetection: + +1. reorganize the dataset into COCO format. +2. reorganize the dataset into a middle format. +3. implement a new dataset. + +Usually we recommend to use the first two methods which are usually easier than the third. + +In this note, we give an example for converting the data into COCO format. + +**Note**: MMDetection only supports evaluating mask AP of dataset in COCO format for now. +So for instance segmentation task users should convert the data into coco format. + +### COCO annotation format + +The necessary keys of COCO format for instance segmentation is as below, for the complete details, please refer [here](https://cocodataset.org/#format-data). + +```json +{ + "images": [image], + "annotations": [annotation], + "categories": [category] +} + + +image = { + "id": int, + "width": int, + "height": int, + "file_name": str, +} + +annotation = { + "id": int, + "image_id": int, + "category_id": int, + "segmentation": RLE or [polygon], + "area": float, + "bbox": [x,y,width,height], + "iscrowd": 0 or 1, +} + +categories = [{ + "id": int, + "name": str, + "supercategory": str, +}] +``` + +Assume we use the balloon dataset. +After downloading the data, we need to implement a function to convert the annotation format into the COCO format. Then we can use implemented COCODataset to load the data and perform training and evaluation. + +If you take a look at the dataset, you will find the dataset format is as below: + +```json +{'base64_img_data': '', + 'file_attributes': {}, + 'filename': '34020010494_e5cb88e1c4_k.jpg', + 'fileref': '', + 'regions': {'0': {'region_attributes': {}, + 'shape_attributes': {'all_points_x': [1020, + 1000, + 994, + 1003, + 1023, + 1050, + 1089, + 1134, + 1190, + 1265, + 1321, + 1361, + 1403, + 1428, + 1442, + 1445, + 1441, + 1427, + 1400, + 1361, + 1316, + 1269, + 1228, + 1198, + 1207, + 1210, + 1190, + 1177, + 1172, + 1174, + 1170, + 1153, + 1127, + 1104, + 1061, + 1032, + 1020], + 'all_points_y': [963, + 899, + 841, + 787, + 738, + 700, + 663, + 638, + 621, + 619, + 643, + 672, + 720, + 765, + 800, + 860, + 896, + 942, + 990, + 1035, + 1079, + 1112, + 1129, + 1134, + 1144, + 1153, + 1166, + 1166, + 1150, + 1136, + 1129, + 1122, + 1112, + 1084, + 1037, + 989, + 963], + 'name': 'polygon'}}}, + 'size': 1115004} +``` + +The annotation is a JSON file where each key indicates an image's all annotations. +The code to convert the balloon dataset into coco format is as below. + +```python +import os.path as osp +import mmcv + +def convert_balloon_to_coco(ann_file, out_file, image_prefix): + data_infos = mmcv.load(ann_file) + + annotations = [] + images = [] + obj_count = 0 + for idx, v in enumerate(mmcv.track_iter_progress(data_infos.values())): + filename = v['filename'] + img_path = osp.join(image_prefix, filename) + height, width = mmcv.imread(img_path).shape[:2] + + images.append(dict( + id=idx, + file_name=filename, + height=height, + width=width)) + + bboxes = [] + labels = [] + masks = [] + for _, obj in v['regions'].items(): + assert not obj['region_attributes'] + obj = obj['shape_attributes'] + px = obj['all_points_x'] + py = obj['all_points_y'] + poly = [(x + 0.5, y + 0.5) for x, y in zip(px, py)] + poly = [p for x in poly for p in x] + + x_min, y_min, x_max, y_max = ( + min(px), min(py), max(px), max(py)) + + + data_anno = dict( + image_id=idx, + id=obj_count, + category_id=0, + bbox=[x_min, y_min, x_max - x_min, y_max - y_min], + area=(x_max - x_min) * (y_max - y_min), + segmentation=[poly], + iscrowd=0) + annotations.append(data_anno) + obj_count += 1 + + coco_format_json = dict( + images=images, + annotations=annotations, + categories=[{'id':0, 'name': 'balloon'}]) + mmcv.dump(coco_format_json, out_file) + +``` + +Using the function above, users can successfully convert the annotation file into json format, then we can use `CocoDataset` to train and evaluate the model. + +## Prepare a config + +The second step is to prepare a config thus the dataset could be successfully loaded. Assume that we want to use Mask R-CNN with FPN, the config to train the detector on balloon dataset is as below. Assume the config is under directory `configs/balloon/` and named as `mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_balloon.py`, the config is as below. + +```python +# The new config inherits a base config to highlight the necessary modification +_base_ = 'mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py' + +# We also need to change the num_classes in head to match the dataset's annotation +model = dict( + roi_head=dict( + bbox_head=dict(num_classes=1), + mask_head=dict(num_classes=1))) + +# Modify dataset related settings +dataset_type = 'COCODataset' +classes = ('balloon',) +data = dict( + train=dict( + img_prefix='balloon/train/', + classes=classes, + ann_file='balloon/train/annotation_coco.json'), + val=dict( + img_prefix='balloon/val/', + classes=classes, + ann_file='balloon/val/annotation_coco.json'), + test=dict( + img_prefix='balloon/val/', + classes=classes, + ann_file='balloon/val/annotation_coco.json')) + +# We can use the pre-trained Mask RCNN model to obtain higher performance +load_from = 'checkpoints/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth' +``` + +This checkpoint file can be downloaded [here](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth) + +## Train a new model + +To train a model with the new config, you can simply run + +```shell +python tools/train.py configs/balloon/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_balloon.py +``` + +For more detailed usages, please refer to the [Case 1](1_exist_data_model.md). + +## Test and inference + +To test the trained model, you can simply run + +```shell +python tools/test.py configs/balloon/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_balloon.py work_dirs/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_balloon/latest.pth --eval bbox segm +``` + +For more detailed usages, please refer to the [Case 1](1_exist_data_model.md). diff --git a/docs/en/3_exist_data_new_model.md b/docs/en/3_exist_data_new_model.md new file mode 100644 index 0000000..b34c133 --- /dev/null +++ b/docs/en/3_exist_data_new_model.md @@ -0,0 +1,283 @@ +# 3: Train with customized models and standard datasets + +In this note, you will know how to train, test and inference your own customized models under standard datasets. We use the cityscapes dataset to train a customized Cascade Mask R-CNN R50 model as an example to demonstrate the whole process, which using [`AugFPN`](https://github.com/Gus-Guo/AugFPN) to replace the default `FPN` as neck, and add `Rotate` or `Translate` as training-time auto augmentation. + +The basic steps are as below: + +1. Prepare the standard dataset +2. Prepare your own customized model +3. Prepare a config +4. Train, test, and inference models on the standard dataset. + +## Prepare the standard dataset + +In this note, as we use the standard cityscapes dataset as an example. + +It is recommended to symlink the dataset root to `$MMDETECTION/data`. +If your folder structure is different, you may need to change the corresponding paths in config files. + +```none +mmdetection +├── mmdet +├── tools +├── configs +├── data +│ ├── coco +│ │ ├── annotations +│ │ ├── train2017 +│ │ ├── val2017 +│ │ ├── test2017 +│ ├── cityscapes +│ │ ├── annotations +│ │ ├── leftImg8bit +│ │ │ ├── train +│ │ │ ├── val +│ │ ├── gtFine +│ │ │ ├── train +│ │ │ ├── val +│ ├── VOCdevkit +│ │ ├── VOC2007 +│ │ ├── VOC2012 + +``` + +Or you can set your dataset root through + +```bash +export MMDET_DATASETS=$data_root +``` + +We will replace dataset root with `$MMDET_DATASETS`, so you don't have to modify the corresponding path in config files. + +The cityscapes annotations have to be converted into the coco format using `tools/dataset_converters/cityscapes.py`: + +```shell +pip install cityscapesscripts +python tools/dataset_converters/cityscapes.py ./data/cityscapes --nproc 8 --out-dir ./data/cityscapes/annotations +``` + +Currently the config files in `cityscapes` use COCO pre-trained weights to initialize. +You could download the pre-trained models in advance if network is unavailable or slow, otherwise it would cause errors at the beginning of training. + +## Prepare your own customized model + +The second step is to use your own module or training setting. Assume that we want to implement a new neck called `AugFPN` to replace with the default `FPN` under the existing detector Cascade Mask R-CNN R50. The following implements`AugFPN` under MMDetection. + +### 1. Define a new neck (e.g. AugFPN) + +Firstly create a new file `mmdet/models/necks/augfpn.py`. + +```python +from ..builder import NECKS + +@NECKS.register_module() +class AugFPN(nn.Module): + + def __init__(self, + in_channels, + out_channels, + num_outs, + start_level=0, + end_level=-1, + add_extra_convs=False): + pass + + def forward(self, inputs): + # implementation is ignored + pass +``` + +### 2. Import the module + +You can either add the following line to `mmdet/models/necks/__init__.py`, + +```python +from .augfpn import AugFPN +``` + +or alternatively add + +```python +custom_imports = dict( + imports=['mmdet.models.necks.augfpn.py'], + allow_failed_imports=False) +``` + +to the config file and avoid modifying the original code. + +### 3. Modify the config file + +```python +neck=dict( + type='AugFPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5) +``` + +For more detailed usages about customize your own models (e.g. implement a new backbone, head, loss, etc) and runtime training settings (e.g. define a new optimizer, use gradient clip, customize training schedules and hooks, etc), please refer to the guideline [Customize Models](tutorials/customize_models.md) and [Customize Runtime Settings](tutorials/customize_runtime.md) respectively. + +## Prepare a config + +The third step is to prepare a config for your own training setting. Assume that we want to add `AugFPN` and `Rotate` or `Translate` augmentation to existing Cascade Mask R-CNN R50 to train the cityscapes dataset, and assume the config is under directory `configs/cityscapes/` and named as `cascade_mask_rcnn_r50_augfpn_autoaug_10e_cityscapes.py`, the config is as below. + +```python +# The new config inherits the base configs to highlight the necessary modification +_base_ = [ + '../_base_/models/cascade_mask_rcnn_r50_fpn.py', + '../_base_/datasets/cityscapes_instance.py', '../_base_/default_runtime.py' +] + +model = dict( + # set None to avoid loading ImageNet pretrained backbone, + # instead here we set `load_from` to load from COCO pretrained detectors. + backbone=dict(init_cfg=None), + # replace neck from defaultly `FPN` to our new implemented module `AugFPN` + neck=dict( + type='AugFPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + # We also need to change the num_classes in head from 80 to 8, to match the + # cityscapes dataset's annotation. This modification involves `bbox_head` and `mask_head`. + roi_head=dict( + bbox_head=[ + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + # change the number of classes from defaultly COCO to cityscapes + num_classes=8, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + # change the number of classes from defaultly COCO to cityscapes + num_classes=8, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.05, 0.05, 0.1, 0.1]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + # change the number of classes from defaultly COCO to cityscapes + num_classes=8, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.033, 0.033, 0.067, 0.067]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)) + ], + mask_head=dict( + type='FCNMaskHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + # change the number of classes from defaultly COCO to cityscapes + num_classes=8, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0)))) + +# over-write `train_pipeline` for new added `AutoAugment` training setting +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='AutoAugment', + policies=[ + [dict( + type='Rotate', + level=5, + img_fill_val=(124, 116, 104), + prob=0.5, + scale=1) + ], + [dict(type='Rotate', level=7, img_fill_val=(124, 116, 104)), + dict( + type='Translate', + level=5, + prob=0.5, + img_fill_val=(124, 116, 104)) + ], + ]), + dict( + type='Resize', img_scale=[(2048, 800), (2048, 1024)], keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] + +# set batch_size per gpu, and set new training pipeline +data = dict( + samples_per_gpu=1, + workers_per_gpu=3, + # over-write `pipeline` with new training pipeline setting + train=dict(dataset=dict(pipeline=train_pipeline))) + +# Set optimizer +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# Set customized learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[8]) +runner = dict(type='EpochBasedRunner', max_epochs=10) + +# We can use the COCO pretrained Cascade Mask R-CNN R50 model for more stable performance initialization +load_from = 'https://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco/cascade_mask_rcnn_r50_fpn_1x_coco_20200203-9d4dcb24.pth' +``` + +## Train a new model + +To train a model with the new config, you can simply run + +```shell +python tools/train.py configs/cityscapes/cascade_mask_rcnn_r50_augfpn_autoaug_10e_cityscapes.py +``` + +For more detailed usages, please refer to the [Case 1](1_exist_data_model.md). + +## Test and inference + +To test the trained model, you can simply run + +```shell +python tools/test.py configs/cityscapes/cascade_mask_rcnn_r50_augfpn_autoaug_10e_cityscapes.py work_dirs/cascade_mask_rcnn_r50_augfpn_autoaug_10e_cityscapes.py/latest.pth --eval bbox segm +``` + +For more detailed usages, please refer to the [Case 1](1_exist_data_model.md). diff --git a/docs/en/Makefile b/docs/en/Makefile new file mode 100644 index 0000000..d4bb2cb --- /dev/null +++ b/docs/en/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/en/_static/css/readthedocs.css b/docs/en/_static/css/readthedocs.css new file mode 100644 index 0000000..57ed0ad --- /dev/null +++ b/docs/en/_static/css/readthedocs.css @@ -0,0 +1,6 @@ +.header-logo { + background-image: url("../image/mmdet-logo.png"); + background-size: 156px 40px; + height: 40px; + width: 156px; +} diff --git a/docs/en/_static/image/mmdet-logo.png b/docs/en/_static/image/mmdet-logo.png new file mode 100644 index 0000000..58e2b5e Binary files /dev/null and b/docs/en/_static/image/mmdet-logo.png differ diff --git a/docs/en/api.rst b/docs/en/api.rst new file mode 100644 index 0000000..e61c663 --- /dev/null +++ b/docs/en/api.rst @@ -0,0 +1,108 @@ +mmdet.apis +-------------- +.. automodule:: mmdet.apis + :members: + +mmdet.core +-------------- + +anchor +^^^^^^^^^^ +.. automodule:: mmdet.core.anchor + :members: + +bbox +^^^^^^^^^^ +.. automodule:: mmdet.core.bbox + :members: + +export +^^^^^^^^^^ +.. automodule:: mmdet.core.export + :members: + +mask +^^^^^^^^^^ +.. automodule:: mmdet.core.mask + :members: + +evaluation +^^^^^^^^^^ +.. automodule:: mmdet.core.evaluation + :members: + +post_processing +^^^^^^^^^^^^^^^ +.. automodule:: mmdet.core.post_processing + :members: + +utils +^^^^^^^^^^ +.. automodule:: mmdet.core.utils + :members: + +mmdet.datasets +-------------- + +datasets +^^^^^^^^^^ +.. automodule:: mmdet.datasets + :members: + +pipelines +^^^^^^^^^^ +.. automodule:: mmdet.datasets.pipelines + :members: + +samplers +^^^^^^^^^^ +.. automodule:: mmdet.datasets.samplers + :members: + +api_wrappers +^^^^^^^^^^^^ +.. automodule:: mmdet.datasets.api_wrappers + :members: + +mmdet.models +-------------- + +detectors +^^^^^^^^^^ +.. automodule:: mmdet.models.detectors + :members: + +backbones +^^^^^^^^^^ +.. automodule:: mmdet.models.backbones + :members: + +necks +^^^^^^^^^^^^ +.. automodule:: mmdet.models.necks + :members: + +dense_heads +^^^^^^^^^^^^ +.. automodule:: mmdet.models.dense_heads + :members: + +roi_heads +^^^^^^^^^^ +.. automodule:: mmdet.models.roi_heads + :members: + +losses +^^^^^^^^^^ +.. automodule:: mmdet.models.losses + :members: + +utils +^^^^^^^^^^ +.. automodule:: mmdet.models.utils + :members: + +mmdet.utils +-------------- +.. automodule::mmdet.utils + :members: diff --git a/docs/en/changelog.md b/docs/en/changelog.md new file mode 100644 index 0000000..473aec3 --- /dev/null +++ b/docs/en/changelog.md @@ -0,0 +1,1897 @@ +## Changelog + +### v2.28.2 (24/2/2023) + +#### New Features and Improvements + +- Add Twitter, Discord, Medium and YouTube link (#9774) +- Update `customize_runtime.md` (#9797) + +#### Bug Fixes + +- Fix `WIDERFace SSD` loss for Nan problem (#9734) +- Fix missing API documentation in Readthedoc (#9729) +- Fix the configuration file and log path of CenterNet (#9791) + +#### Contributors + +A total of 4 developers contributed to this release. +Thanks @co63oc, @Ginray, @vansin, @RangiLyu + +### v2.28.1 (1/2/2023) + +#### Bug Fixes + +- Enable to set float mlp_ratio in SwinTransformer (#8670) +- Fix import error that causes training failure (#9694) +- Fix isort version in lint (#9685) +- Fix init_cfg of YOLOF (#8243) + +#### Contributors + +A total of 4 developers contributed to this release. +Thanks @triple-Mu, @i-aki-y, @twmht, @RangiLyu + +### v2.28.0 (28/1/2023) + +#### Highlights + +- Support Objects365 Dataset and Separated and Occluded COCO metric +- Support acceleration of RetinaNet and SSD on Ascend +- Deprecate the support of Python 3.6 + +#### New Features and Improvements + +- Support Objects365 Dataset (#7525) +- Support [Separated and Occluded COCO metric](https://arxiv.org/abs/2210.10046) (#9574) +- Support acceleration of RetinaNet and SSD on Ascend with documentation (#9648, #9614) +- Added missing `-` to `--format-only` in documentation. + +#### Deprecations + +- Upgrade the minimum Python version to 3.7, the support of Python 3.6 is no longer guaranteed (#9604) + +#### Bug Fixes + +- Fix validation loss logging by (#9663) +- Fix inconsistent float precision between mmdet and mmcv (#9570) +- Fix argument name for fp32 in `DeformableDETRHead` (#9607) +- Fix typo of all config file path in Metafile.yml (#9627) + +#### Contributors + +A total of 11 developers contributed to this release. +Thanks @eantono, @akstt, @@lpizzinidev, @RangiLyu, @kbumsik, @tianleiSHI, @nijkah, @BIGWangYuDong, @wangjiangben-hw, @@jamiechoi1995, @ZwwWayne + +## New Contributors + +- @kbumsik made their first contribution in https://github.com/open-mmlab/mmdetection/pull/9627 +- @akstt made their first contribution in https://github.com/open-mmlab/mmdetection/pull/9614 +- @lpizzinidev made their first contribution in https://github.com/open-mmlab/mmdetection/pull/9649 +- @eantono made their first contribution in https://github.com/open-mmlab/mmdetection/pull/9663 + +### v2.27.0 (5/1/2023) + +#### Highlights + +- Support receptive field search of CNN models([TPAMI 2022: RF-Next](http://mftp.mmcheng.net/Papers/22TPAMI-ActionSeg.pdf)) (#8191) + +#### Bug Fixes + +- Fix deadlock issue related with MMDetWandbHook (#9476) + +#### Improvements + +- Add minimum GitHub token permissions for workflows (#8928) +- Delete compatible code for parrots in roi extractor (#9503) +- Deprecate np.bool Type Alias (#9498) +- Replace numpy transpose with torch permute to speed-up data pre-processing (#9533) + +#### Documents + +- Fix typo in docs/zh_cn/tutorials/config.md (#9416) +- Fix Faster RCNN FP16 config link in README (#9366) + +#### Contributors + +A total of 12 developers contributed to this release. +Thanks @Min-Sheng, @gasvn, @lzyhha, @jbwang1997, @zachcoleman, @chenyuwang814, @MilkClouds, @Fizzez, @boahc077, @apatsekin, @zytx121, @DonggeunYu + +### v2.26.0 (23/11/2022) + +#### Highlights + +- Support training on [NPU](docs/en/device/npu.md) (#9267) + +#### Bug Fixes + +- Fix RPN visualization (#9151) +- Fix readthedocs by freezing the dependency versions (#9154) +- Fix device argument error in MMDet_Tutorial.ipynb (#9112) +- Fix solov2 cannot dealing with empty gt image (#9185) +- Fix random flipping ratio comparison of mixup image (#9336) + +#### Improvements + +- Complement necessary argument of seg_suffix of cityscapes (#9330) +- Support copy paste based on bbox when there is no gt mask (#8905) +- Make scipy as a default dependency in runtime (#9186) + +#### Documents + +- Delete redundant Chinese characters in docs (#9175) +- Add MMEval in README (#9217) + +#### Contributors + +A total of 11 developers contributed to this release. +Thanks @wangjiangben-hw, @motokimura, @AdorableJiang, @BainOuO, @JarvisKevin, @wanghonglie, @zytx121, @BIGWangYuDong, @hhaAndroid, @RangiLyu, @ZwwWayne + +### v2.25.3 (25/10/2022) + +#### Bug Fixes + +- Skip remote sync when wandb is offline (#8755) +- Fix jpg to png bug when using seg maps (#9078) + +#### Improvements + +- Fix typo in warning (#8844) +- Fix CI for timm, pycocotools, onnx (#9034) +- Upgrade pre-commit hooks (#8964) + +#### Documents + +- Update BoundedIoULoss config in readme (#8808) +- Fix Faster R-CNN Readme (#8803) +- Update location of test_cfg and train_cfg (#8792) +- Fix issue template (#8966) +- Update random sampler docstring (#9033) +- Fix wrong image link (#9054) +- Fix FPG readme (#9041) + +#### Contributors + +A total of 13 developers contributed to this release. +Thanks @Zheng-LinXiao, @i-aki-y, @fbagci, @sudoAimer, @Czm369, @DrRyanHuang, @RangiLyu, @wanghonglie, @shinya7y, @Ryoo72, @akshaygulabrao, @gy-7, @Neesky + +### v2.25.2 (15/9/2022) + +#### Bug Fixes + +- Fix DyDCNv2 RuntimeError (#8485) +- Fix repeated import of CascadeRPNHead (#8578) +- Fix absolute positional embedding of swin backbone (#8127) +- Fix get train_pipeline method of val workflow (#8575) + +#### Improvements + +- Upgrade onnxsim to at least 0.4.0 (#8383) +- Support tuple format in analyze_results script (#8549) +- Fix floordiv warning (#8648) + +#### Documents + +- Fix typo in HTC link (#8487) +- Fix docstring of `BboxOverlaps2D` (#8512) +- Added missed Chinese tutorial link (#8564) +- Fix mistakes in gaussian radius formula (#8607) +- Update config documentation about how to Add WandB Hook (#8663) +- Add mmengine link in readme (#8799) +- Update issue template (#8802) + +#### Contributors + +A total of 16 developers contributed to this release. +Thanks @daquexian, @lyq10085, @ZwwWayne, @fbagci, @BubblyYi, @fathomson, @ShunchiZhang, @ceasona, @Happylkx, @normster, @chhluo, @Lehsuby, @JiayuXu0, @Nourollah, @hewanru-bit, @RangiLyu + +### v2.25.1 (29/7/2022) + +#### Bug Fixes + +- Fix single GPU distributed training of cuda device specifying (#8176) +- Fix PolygonMask bug in FilterAnnotations (#8136) +- Fix mdformat version to support python3.6 (#8195) +- Fix GPG key error in Dockerfile (#8215) +- Fix `WandbLoggerHook` error (#8273) +- Fix Pytorch 1.10 incompatibility issues (#8439) + +#### Improvements + +- Add `mim` to `extras_require` in setup.py (#8194) +- Support get image shape on macOS (#8434) +- Add test commands of `mim` in CI (#8230 & #8240) +- Update `maskformer` to be compatible when cfg is a dictionary (#8263) +- Clean `Pillow` version check in CI (#8229) + +#### Documents + +- Change example hook name in tutorials (#8118) +- Update projects (#8120) +- Update metafile and release new models (#8294) +- Add download link in tutorials (#8391) + +#### Contributors + +A total of 15 developers contributed to this release. +Thanks @ZwwWayne, @ayulockin, @Mxbonn, @p-mishra1, @Youth-Got, @MiXaiLL76, @chhluo, @jbwang1997, @atinfinity, @shinya7y, @duanzhihua, @STLAND-admin, @BIGWangYuDong, @grimoire, @xiaoyuan0203 + +### v2.25.0 (31/5/2022) + +#### Highlights + +- Support dedicated `WandbLogger` hook +- Support [ConvNeXt](configs/convnext), [DDOD](configs/ddod), [SOLOv2](configs/solov2) +- Support [Mask2Former](configs/mask2former) for instance segmentation +- Rename [config files of Mask2Former](configs/mask2former) + +#### Backwards incompatible changes + +- Rename [config files of Mask2Former](configs/mask2former) (#7571) + + + + + + + + + + + +
before v2.25.0after v2.25.0
+ + - `mask2former_xxx_coco.py` represents config files for **panoptic segmentation**. + + + + - `mask2former_xxx_coco.py` represents config files for **instance segmentation**. + - `mask2former_xxx_coco-panoptic.py` represents config files for **panoptic segmentation**. + +
+ +#### New Features + +- Support [ConvNeXt](https://arxiv.org/abs/2201.03545) (#7281) +- Support [DDOD](https://arxiv.org/abs/2107.02963) (#7279) +- Support [SOLOv2](https://arxiv.org/abs/2003.10152) (#7441) +- Support [Mask2Former](https://arxiv.org/abs/2112.01527) for instance segmentation (#7571, #8032) + +#### Bug Fixes + +- Enable YOLOX training on different devices (#7912) +- Fix the log plot error when evaluation with `interval != 1` (#7784) +- Fix RuntimeError of HTC (#8083) + +#### Improvements + +- Support dedicated `WandbLogger` hook (#7459) + + Users can set + + ```python + cfg.log_config.hooks = [ + dict(type='MMDetWandbHook', + init_kwargs={'project': 'MMDetection-tutorial'}, + interval=10, + log_checkpoint=True, + log_checkpoint_metadata=True, + num_eval_images=10)] + ``` + + in the config to use `MMDetWandbHook`. Example can be found in this [colab tutorial](https://colab.research.google.com/drive/1RCSXHZwDZvakFh3eo9RuNrJbCGqD0dru?usp=sharing#scrollTo=WTEdPDRaBz2C) + +- Add `AvoidOOM` to avoid OOM (#7434, #8091) + + Try to use `AvoidCUDAOOM` to avoid GPU out of memory. It will first retry after calling `torch.cuda.empty_cache()`. If it still fails, it will then retry by converting the type of inputs to FP16 format. If it still fails, it will try to copy inputs from GPUs to CPUs to continue computing. Try AvoidOOM in code to make the code continue to run when GPU memory runs out: + + ```python + from mmdet.utils import AvoidCUDAOOM + + output = AvoidCUDAOOM.retry_if_cuda_oom(some_function)(input1, input2) + ``` + + Users can also try `AvoidCUDAOOM` as a decorator to make the code continue to run when GPU memory runs out: + + ```python + from mmdet.utils import AvoidCUDAOOM + + @AvoidCUDAOOM.retry_if_cuda_oom + def function(*args, **kwargs): + ... + return xxx + ``` + +- Support reading `gpu_collect` from `cfg.evaluation.gpu_collect` (#7672) + +- Speedup the Video Inference by Accelerating data-loading Stage (#7832) + +- Support replacing the `${key}` with the value of `cfg.key` (#7492) + +- Accelerate result analysis in `analyze_result.py`. The evaluation time is speedup by 10 ~ 15 times and only tasks 10 ~ 15 minutes now. (#7891) + +- Support to set `block_dilations` in `DilatedEncoder` (#7812) + +- Support panoptic segmentation result analysis (#7922) + +- Release DyHead with Swin-Large backbone (#7733) + +- Documentations updating and adding + + - Fix wrong default type of `act_cfg` in `SwinTransformer` (#7794) + - Fix text errors in the tutorials (#7959) + - Rewrite the [installation guide](docs/en/get_started.md) (#7897) + - [Useful hooks](docs/en/tutorials/useful_hooks.md) (#7810) + - Fix heading anchor in documentation (#8006) + - Replace `markdownlint` with `mdformat` for avoiding installing ruby (#8009) + +#### Contributors + +A total of 20 developers contributed to this release. + +Thanks @ZwwWayne, @DarthThomas, @solyaH, @LutingWang, @chenxinfeng4, @Czm369, @Chenastron, @chhluo, @austinmw, @Shanyaliux @hellock, @Y-M-Y, @jbwang1997, @hhaAndroid, @Irvingao, @zhanggefan, @BIGWangYuDong, @Keiku, @PeterVennerstrom, @ayulockin + +### v2.24.0 (26/4/2022) + +#### Highlights + +- Support [Simple Copy-Paste is a Strong Data Augmentation Method for Instance Segmentation](https://arxiv.org/abs/2012.07177) +- Support automatically scaling LR according to GPU number and samples per GPU +- Support Class Aware Sampler that improves performance on OpenImages Dataset + +#### New Features + +- Support [Simple Copy-Paste is a Strong Data Augmentation Method for Instance Segmentation](https://arxiv.org/abs/2012.07177), see [example configs](configs/simple_copy_paste/mask_rcnn_r50_fpn_syncbn-all_rpn-2conv_ssj_scp_32x2_270k_coco.py) (#7501) + +- Support Class Aware Sampler, users can set + + ```python + data=dict(train_dataloader=dict(class_aware_sampler=dict(num_sample_class=1)))) + ``` + + in the config to use `ClassAwareSampler`. Examples can be found in [the configs of OpenImages Dataset](https://github.com/open-mmlab/mmdetection/tree/master/configs/openimages/faster_rcnn_r50_fpn_32x2_cas_1x_openimages.py). (#7436) + +- Support automatically scaling LR according to GPU number and samples per GPU. (#7482) + In each config, there is a corresponding config of auto-scaling LR as below, + + ```python + auto_scale_lr = dict(enable=True, base_batch_size=N) + ``` + + where `N` is the batch size used for the current learning rate in the config (also equals to `samples_per_gpu` * gpu number to train this config). + By default, we set `enable=False` so that the original usages will not be affected. Users can set `enable=True` in each config or add `--auto-scale-lr` after the command line to enable this feature and should check the correctness of `base_batch_size` in customized configs. + +- Support setting dataloader arguments in config and add functions to handle config compatibility. (#7668) + The comparison between the old and new usages is as below. + + + + + + + + + + + +
v2.23.0v2.24.0
+ + ```python + data = dict( + samples_per_gpu=64, workers_per_gpu=4, + train=dict(type='xxx', ...), + val=dict(type='xxx', samples_per_gpu=4, ...), + test=dict(type='xxx', ...), + ) + ``` + + + + ```python + # A recommended config that is clear + data = dict( + train=dict(type='xxx', ...), + val=dict(type='xxx', ...), + test=dict(type='xxx', ...), + # Use different batch size during inference. + train_dataloader=dict(samples_per_gpu=64, workers_per_gpu=4), + val_dataloader=dict(samples_per_gpu=8, workers_per_gpu=2), + test_dataloader=dict(samples_per_gpu=8, workers_per_gpu=2), + ) + + # Old style still works but allows to set more arguments about data loaders + data = dict( + samples_per_gpu=64, # only works for train_dataloader + workers_per_gpu=4, # only works for train_dataloader + train=dict(type='xxx', ...), + val=dict(type='xxx', ...), + test=dict(type='xxx', ...), + # Use different batch size during inference. + val_dataloader=dict(samples_per_gpu=8, workers_per_gpu=2), + test_dataloader=dict(samples_per_gpu=8, workers_per_gpu=2), + ) + ``` + +
+ +- Support memory profile hook. Users can use it to monitor the memory usages during training as below (#7560) + + ```python + custom_hooks = [ + dict(type='MemoryProfilerHook', interval=50) + ] + ``` + +- Support to run on PyTorch with MLU chip (#7578) + +- Support re-spliting data batch with tag (#7641) + +- Support the `DiceCost` used by [K-Net](https://arxiv.org/abs/2106.14855) in `MaskHungarianAssigner` (#7716) + +- Support splitting COCO data for Semi-supervised object detection (#7431) + +- Support Pathlib for Config.fromfile (#7685) + +- Support to use file client in OpenImages dataset (#7433) + +- Add a probability parameter to Mosaic transformation (#7371) + +- Support specifying interpolation mode in `Resize` pipeline (#7585) + +#### Bug Fixes + +- Avoid invalid bbox after deform_sampling (#7567) +- Fix the issue that argument color_theme does not take effect when exporting confusion matrix (#7701) +- Fix the `end_level` in Necks, which should be the index of the end input backbone level (#7502) +- Fix the bug that `mix_results` may be None in `MultiImageMixDataset` (#7530) +- Fix the bug in ResNet plugin when two plugins are used (#7797) + +#### Improvements + +- Enhance `load_json_logs` of analyze_logs.py for resumed training logs (#7732) +- Add argument `out_file` in image_demo.py (#7676) +- Allow mixed precision training with `SimOTAAssigner` (#7516) +- Updated INF to 100000.0 to be the same as that in the official YOLOX (#7778) +- Add documentations of: + - how to get channels of a new backbone (#7642) + - how to unfreeze the backbone network (#7570) + - how to train fast_rcnn model (#7549) + - proposals in Deformable DETR (#7690) + - from-scratch install script in get_started.md (#7575) +- Release pre-trained models of + - [Mask2Former](configs/mask2former) (#7595, #7709) + - RetinaNet with ResNet-18 and release models (#7387) + - RetinaNet with EfficientNet backbone (#7646) + +#### Contributors + +A total of 27 developers contributed to this release. +Thanks @jovialio, @zhangsanfeng2022, @HarryZJ, @jamiechoi1995, @nestiank, @PeterH0323, @RangeKing, @Y-M-Y, @mattcasey02, @weiji14, @Yulv-git, @xiefeifeihu, @FANG-MING, @meng976537406, @nijkah, @sudz123, @CCODING04, @SheffieldCao, @Czm369, @BIGWangYuDong, @zytx121, @jbwang1997, @chhluo, @jshilong, @RangiLyu, @hhaAndroid, @ZwwWayne + +### v2.23.0 (28/3/2022) + +#### Highlights + +- Support Mask2Former: [Masked-attention Mask Transformer for Universal Image Segmentation](https://arxiv.org/abs/2112.01527) +- Support EfficientNet: [EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks](https://arxiv.org/abs/1905.11946) +- Support setting data root through environment variable `MMDET_DATASETS`, users don't have to modify the corresponding path in config files anymore. +- Find a good recipe for fine-tuning high precision ResNet backbone pre-trained by Torchvision. + +#### New Features + +- Support [Mask2Former](configs/mask2former)(#6938)(#7466)(#7471) +- Support [EfficientNet](configs/efficientnet) (#7514) +- Support setting data root through environment variable `MMDET_DATASETS`, users don't have to modify the corresponding path in config files anymore. (#7386) +- Support setting different seeds to different ranks (#7432) +- Update the `dist_train.sh` so that the script can be used to support launching multi-node training on machines without slurm (#7415) +- Find a good recipe for fine-tuning high precision ResNet backbone pre-trained by Torchvision (#7489) + +#### Bug Fixes + +- Fix bug in VOC unit test which removes the data directory (#7270) +- Adjust the order of `get_classes` and `FileClient` (#7276) +- Force the inputs of `get_bboxes` in yolox_head to float32 (#7324) +- Fix misplaced arguments in LoadPanopticAnnotations (#7388) +- Fix reduction=mean in CELoss. (#7449) +- Update unit test of CrossEntropyCost (#7537) +- Fix memory leaking in panpotic segmentation evaluation (#7538) +- Fix the bug of shape broadcast in YOLOv3 (#7551) + +#### Improvements + +- Add Chinese version of onnx2tensorrt.md (#7219) +- Update colab tutorials (#7310) +- Update information about Localization Distillation (#7350) +- Add Chinese version of `finetune.md` (#7178) +- Update YOLOX log for non square input (#7235) +- Add `nproc` in `coco_panoptic.py` for panoptic quality computing (#7315) +- Allow to set channel_order in LoadImageFromFile (#7258) +- Take point sample related functions out of mask_point_head (#7353) +- Add instance evaluation for coco_panoptic (#7313) +- Enhance the robustness of analyze_logs.py (#7407) +- Supplementary notes of sync_random_seed (#7440) +- Update docstring of cross entropy loss (#7472) +- Update pascal voc result (#7503) +- We create How-to documentation to record any questions about How to xxx. In this version, we added + - How to use Mosaic augmentation (#7507) + - How to use backbone in mmcls (#7438) + - How to produce and submit the prediction results of panoptic segmentation models on COCO test-dev set (#7430)) + +#### Contributors + +A total of 27 developers contributed to this release. +Thanks @ZwwWayne, @haofanwang, @shinya7y, @chhluo, @yangrisheng, @triple-Mu, @jbwang1997, @HikariTJU, @imflash217, @274869388, @zytx121, @matrixgame2018, @jamiechoi1995, @BIGWangYuDong, @JingweiZhang12, @Xiangxu-0103, @hhaAndroid, @jshilong, @osbm, @ceroytres, @bunge-bedstraw-herb, @Youth-Got, @daavoo, @jiangyitong, @RangiLyu, @CCODING04, @yarkable + +### v2.22.0 (24/2/2022) + +#### Highlights + +- Support MaskFormer: [Per-Pixel Classification is Not All You Need for Semantic Segmentation](https://arxiv.org/abs/2107.06278) (#7212) +- Support DyHead: [Dynamic Head: Unifying Object Detection Heads with Attentions](https://arxiv.org/abs/2106.08322) (#6823) +- Release a good recipe of using ResNet in object detectors pre-trained by [ResNet Strikes Back](https://arxiv.org/abs/2110.00476), which consistently brings about 3~4 mAP improvements over RetinaNet, Faster/Mask/Cascade Mask R-CNN (#7001) +- Support [Open Images Dataset](https://storage.googleapis.com/openimages/web/index.html) (#6331) +- Support TIMM backbone: [PyTorch Image Models](https://github.com/rwightman/pytorch-image-models) (#7020) + +#### New Features + +- Support [MaskFormer](configs/maskformer) (#7212) +- Support [DyHead](configs/dyhead) (#6823) +- Support [ResNet Strikes Back](configs/resnet_strikes_back) (#7001) +- Support [OpenImages Dataset](configs/openimages) (#6331) +- Support [TIMM backbone](configs/timm_example) (#7020) +- Support visualization for Panoptic Segmentation (#7041) + +#### Breaking Changes + +In order to support the visualization for Panoptic Segmentation, the `num_classes` can not be `None` when using the `get_palette` function to determine whether to use the panoptic palette. + +#### Bug Fixes + +- Fix bug for the best checkpoints can not be saved when the `key_score` is None (#7101) +- Fix MixUp transform filter boxes failing case (#7080) +- Add missing properties in SABLHead (#7091) +- Fix bug when NaNs exist in confusion matrix (#7147) +- Fix PALETTE AttributeError in downstream task (#7230) + +#### Improvements + +- Speed up SimOTA matching (#7098) +- Add Chinese translation of `docs_zh-CN/tutorials/init_cfg.md` (#7188) + +#### Contributors + +A total of 20 developers contributed to this release. +Thanks @ZwwWayne, @hhaAndroid, @RangiLyu, @AronLin, @BIGWangYuDong, @jbwang1997, @zytx121, @chhluo, @shinya7y, @LuooChen, @dvansa, @siatwangmin, @del-zhenwu, @vikashranjan26, @haofanwang, @jamiechoi1995, @HJoonKwon, @yarkable, @zhijian-liu, @RangeKing + +### v2.21.0 (8/2/2022) + +### Breaking Changes + +To standardize the contents in config READMEs and meta files of OpenMMLab projects, the READMEs and meta files in each config directory have been significantly changed. The template will be released in the future, for now, you can refer to the examples of README for [algorithm](https://github.com/open-mmlab/mmdetection/blob/master/configs/faster_rcnn/README.md), [dataset](https://github.com/open-mmlab/mmdetection/blob/master/configs/deepfashion/README.md) and [backbone](https://github.com/open-mmlab/mmdetection/blob/master/configs/regnet/README.md). To align with the standard, the configs in dcn are put into to two directories named `dcn` and `dcnv2`. + +#### New Features + +- Allow to customize colors of different classes during visualization (#6716) +- Support CPU training (#7016) +- Add download script of COCO, LVIS, and VOC dataset (#7015) + +#### Bug Fixes + +- Fix weight conversion issue of RetinaNet with Swin-S (#6973) +- Update `__repr__` of `Compose` (#6951) +- Fix BadZipFile Error when build docker (#6966) +- Fix bug in non-distributed multi-gpu training/testing (#7019) +- Fix bbox clamp in PyTorch 1.10 (#7074) +- Relax the requirement of PALETTE in dataset wrappers (#7085) +- Keep the same weights before reassign in the PAA head (#7032) +- Update code demo in doc (#7092) + +#### Improvements + +- Speed-up training by allow to set variables of multi-processing (#6974, #7036) +- Add links of Chinese tutorials in readme (#6897) +- Disable cv2 multiprocessing by default for acceleration (#6867) +- Deprecate the support for "python setup.py test" (#6998) +- Re-organize metafiles and config readmes (#7051) +- Fix None grad problem during training TOOD by adding `SigmoidGeometricMean` (#7090) + +#### Contributors + +A total of 26 developers contributed to this release. +Thanks @del-zhenwu, @zimoqingfeng, @srishilesh, @imyhxy, @jenhaoyang, @jliu-ac, @kimnamu, @ShengliLiu, @garvan2021, @ciusji, @DIYer22, @kimnamu, @q3394101, @zhouzaida, @gaotongxiao, @topsy404, @AntoAndGar, @jbwang1997, @nijkah, @ZwwWayne, @Czm369, @jshilong, @RangiLyu, @BIGWangYuDong, @hhaAndroid, @AronLin + +### v2.20.0 (27/12/2021) + +#### New Features + +- Support [TOOD](configs/tood/README.md): Task-aligned One-stage Object Detection (ICCV 2021 Oral) (#6746) +- Support resuming from the latest checkpoint automatically (#6727) + +#### Bug Fixes + +- Fix wrong bbox `loss_weight` of the PAA head (#6744) +- Fix the padding value of `gt_semantic_seg` in batch collating (#6837) +- Fix test error of lvis when using `classwise` (#6845) +- Avoid BC-breaking of `get_local_path` (#6719) +- Fix bug in `sync_norm_hook` when the BN layer does not exist (#6852) +- Use pycocotools directly no matter what platform it is (#6838) + +#### Improvements + +- Add unit test for SimOTA with no valid bbox (#6770) +- Use precommit to check readme (#6802) +- Support selecting GPU-ids in non-distributed testing time (#6781) + +#### Contributors + +A total of 16 developers contributed to this release. +Thanks @ZwwWayne, @Czm369, @jshilong, @RangiLyu, @BIGWangYuDong, @hhaAndroid, @jamiechoi1995, @AronLin, @Keiku, @gkagkos, @fcakyon, @www516717402, @vansin, @zactodd, @kimnamu, @jenhaoyang + +### v2.19.1 (14/12/2021) + +#### New Features + +- Release [YOLOX](configs/yolox/README.md) COCO pretrained models (#6698) + +#### Bug Fixes + +- Fix DCN initialization in DenseHead (#6625) +- Fix initialization of ConvFCHead (#6624) +- Fix PseudoSampler in RCNN (#6622) +- Fix weight initialization in Swin and PVT (#6663) +- Fix dtype bug in BaseDenseHead (#6767) +- Fix SimOTA with no valid bbox (#6733) + +#### Improvements + +- Add an example of combining swin and one-stage models (#6621) +- Add `get_ann_info` to dataset_wrappers (#6526) +- Support keeping image ratio in the multi-scale training of YOLOX (#6732) +- Support `bbox_clip_border` for the augmentations of YOLOX (#6730) + +#### Documents + +- Update metafile (#6717) +- Add mmhuman3d in readme (#6699) +- Update FAQ docs (#6587) +- Add doc for `detect_anomalous_params` (#6697) + +#### Contributors + +A total of 11 developers contributed to this release. +Thanks @ZwwWayne, @LJoson, @Czm369, @jshilong, @ZCMax, @RangiLyu, @BIGWangYuDong, @hhaAndroid, @zhaoxin111, @GT9505, @shinya7y + +### v2.19.0 (29/11/2021) + +#### Highlights + +- Support [Label Assignment Distillation](https://arxiv.org/abs/2108.10520) +- Support `persistent_workers` for Pytorch >= 1.7 +- Align accuracy to the updated official YOLOX + +#### New Features + +- Support [Label Assignment Distillation](https://arxiv.org/abs/2108.10520) (#6342) +- Support `persistent_workers` for Pytorch >= 1.7 (#6435) + +#### Bug Fixes + +- Fix repeatedly output warning message (#6584) +- Avoid infinite GPU waiting in dist training (#6501) +- Fix SSD512 config error (#6574) +- Fix MMDetection model to ONNX command (#6558) + +#### Improvements + +- Refactor configs of FP16 models (#6592) +- Align accuracy to the updated official YOLOX (#6443) +- Speed up training and reduce memory cost when using PhotoMetricDistortion. (#6442) +- Make OHEM work with seesaw loss (#6514) + +#### Documents + +- Update README.md (#6567) + +#### Contributors + +A total of 11 developers contributed to this release. +Thanks @FloydHsiu, @RangiLyu, @ZwwWayne, @AndreaPi, @st9007a, @hachreak, @BIGWangYuDong, @hhaAndroid, @AronLin, @chhluo, @vealocia, @HarborYuan, @st9007a, @jshilong + +### v2.18.1 (15/11/2021) + +#### Highlights + +- Release [QueryInst](http://arxiv.org/abs/2105.01928) pre-trained weights (#6460) +- Support plot confusion matrix (#6344) + +#### New Features + +- Release [QueryInst](http://arxiv.org/abs/2105.01928) pre-trained weights (#6460) +- Support plot confusion matrix (#6344) + +#### Bug Fixes + +- Fix aug test error when the number of prediction bboxes is 0 (#6398) +- Fix SpatialReductionAttention in PVT (#6488) +- Fix wrong use of `trunc_normal_init` in PVT and Swin-Transformer (#6432) + +#### Improvements + +- Save the printed AP information of COCO API to logger (#6505) +- Always map location to cpu when load checkpoint (#6405) +- Set a random seed when the user does not set a seed (#6457) + +#### Documents + +- Chinese version of [Corruption Benchmarking](robustness_benchmarking.md) (#6375) +- Fix config path in docs (#6396) +- Update GRoIE readme (#6401) + +#### Contributors + +A total of 11 developers contributed to this release. +Thanks @st9007a, @hachreak, @HarborYuan, @vealocia, @chhluo, @AndreaPi, @AronLin, @BIGWangYuDong, @hhaAndroid, @RangiLyu, @ZwwWayne + +### v2.18.0 (27/10/2021) + +#### Highlights + +- Support [QueryInst](http://arxiv.org/abs/2105.01928) (#6050) +- Refactor dense heads to decouple onnx export logics from `get_bboxes` and speed up inference (#5317, #6003, #6369, #6268, #6315) + +#### New Features + +- Support [QueryInst](http://arxiv.org/abs/2105.01928) (#6050) +- Support infinite sampler (#5996) + +#### Bug Fixes + +- Fix init_weight in fcn_mask_head (#6378) +- Fix type error in imshow_bboxes of RPN (#6386) +- Fix broken colab link in MMDetection Tutorial (#6382) +- Make sure the device and dtype of scale_factor are the same as bboxes (#6374) +- Remove sampling hardcode (#6317) +- Fix RandomAffine bbox coordinate recorrection (#6293) +- Fix init bug of final cls/reg layer in convfc head (#6279) +- Fix img_shape broken in auto_augment (#6259) +- Fix kwargs parameter missing error in two_stage (#6256) + +#### Improvements + +- Unify the interface of stuff head and panoptic head (#6308) +- Polish readme (#6243) +- Add code-spell pre-commit hook and fix a typo (#6306) +- Fix typo (#6245, #6190) +- Fix sampler unit test (#6284) +- Fix `forward_dummy` of YOLACT to enable `get_flops` (#6079) +- Fix link error in the config documentation (#6252) +- Adjust the order to beautify the document (#6195) + +#### Refactors + +- Refactor one-stage get_bboxes logic (#5317) +- Refactor ONNX export of One-Stage models (#6003, #6369) +- Refactor dense_head and speedup (#6268) +- Migrate to use prior_generator in training of dense heads (#6315) + +#### Contributors + +A total of 18 developers contributed to this release. +Thanks @Boyden, @onnkeat, @st9007a, @vealocia, @yhcao6, @DapangpangX, @yellowdolphin, @cclauss, @kennymckormick, +@pingguokiller, @collinzrj, @AndreaPi, @AronLin, @BIGWangYuDong, @hhaAndroid, @jshilong, @RangiLyu, @ZwwWayne + +### v2.17.0 (28/9/2021) + +#### Highlights + +- Support [PVT](https://arxiv.org/abs/2102.12122) and [PVTv2](https://arxiv.org/abs/2106.13797) +- Support [SOLO](https://arxiv.org/abs/1912.04488) +- Support large scale jittering and New Mask R-CNN baselines +- Speed up `YOLOv3` inference + +#### New Features + +- Support [PVT](https://arxiv.org/abs/2102.12122) and [PVTv2](https://arxiv.org/abs/2106.13797) (#5780) +- Support [SOLO](https://arxiv.org/abs/1912.04488) (#5832) +- Support large scale jittering and New Mask R-CNN baselines (#6132) +- Add a general data structure for the results of models (#5508) +- Added a base class for one-stage instance segmentation (#5904) +- Speed up `YOLOv3` inference (#5991) +- Release Swin Transformer pre-trained models (#6100) +- Support mixed precision training in `YOLOX` (#5983) +- Support `val` workflow in `YOLACT` (#5986) +- Add script to test `torchserve` (#5936) +- Support `onnxsim` with dynamic input shape (#6117) + +#### Bug Fixes + +- Fix the function naming errors in `model_wrappers` (#5975) +- Fix regression loss bug when the input is an empty tensor (#5976) +- Fix scores not contiguous error in `centernet_head` (#6016) +- Fix missing parameters bug in `imshow_bboxes` (#6034) +- Fix bug in `aug_test` of `HTC` when the length of `det_bboxes` is 0 (#6088) +- Fix empty proposal errors in the training of some two-stage models (#5941) +- Fix `dynamic_axes` parameter error in `ONNX` dynamic shape export (#6104) +- Fix `dynamic_shape` bug of `SyncRandomSizeHook` (#6144) +- Fix the Swin Transformer config link error in the configuration (#6172) + +#### Improvements + +- Add filter rules in `Mosaic` transform (#5897) +- Add size divisor in get flops to avoid some potential bugs (#6076) +- Add Chinese translation of `docs_zh-CN/tutorials/customize_dataset.md` (#5915) +- Add Chinese translation of `conventions.md` (#5825) +- Add description of the output of data pipeline (#5886) +- Add dataset information in the README file for `PanopticFPN` (#5996) +- Add `extra_repr` for `DropBlock` layer to get details in the model printing (#6140) +- Fix CI out of memory and add PyTorch1.9 Python3.9 unit tests (#5862) +- Fix download links error of some model (#6069) +- Improve the generalization of XML dataset (#5943) +- Polish assertion error messages (#6017) +- Remove `opencv-python-headless` dependency by `albumentations` (#5868) +- Check dtype in transform unit tests (#5969) +- Replace the default theme of documentation with PyTorch Sphinx Theme (#6146) +- Update the paper and code fields in the metafile (#6043) +- Support to customize padding value of segmentation map (#6152) +- Support to resize multiple segmentation maps (#5747) + +#### Contributors + +A total of 24 developers contributed to this release. +Thanks @morkovka1337, @HarborYuan, @guillaumefrd, @guigarfr, @www516717402, @gaotongxiao, @ypwhs, @MartaYang, @shinya7y, @justiceeem, @zhaojinjian0000, @VVsssssk, @aravind-anantha, @wangbo-zhao, @czczup, @whai362, @czczup, @marijnl, @AronLin, @BIGWangYuDong, @hhaAndroid, @jshilong, @RangiLyu, @ZwwWayne + +### v2.16.0 (30/8/2021) + +#### Highlights + +- Support [Panoptic FPN](https://arxiv.org/abs/1901.02446) and [Swin Transformer](https://arxiv.org/abs/2103.14030) + +#### New Features + +- Support [Panoptic FPN](https://arxiv.org/abs/1901.02446) and release models (#5577, #5902) +- Support Swin Transformer backbone (#5748) +- Release RetinaNet models pre-trained with multi-scale 3x schedule (#5636) +- Add script to convert unlabeled image list to coco format (#5643) +- Add hook to check whether the loss value is valid (#5674) +- Add YOLO anchor optimizing tool (#5644) +- Support export onnx models without post process. (#5851) +- Support classwise evaluation in CocoPanopticDataset (#5896) +- Adapt browse_dataset for concatenated datasets. (#5935) +- Add `PatchEmbed` and `PatchMerging` with `AdaptivePadding` (#5952) + +#### Bug Fixes + +- Fix unit tests of YOLOX (#5859) +- Fix lose randomness in `imshow_det_bboxes` (#5845) +- Make output result of `ImageToTensor` contiguous (#5756) +- Fix inference bug when calling `regress_by_class` in RoIHead in some cases (#5884) +- Fix bug in CIoU loss where alpha should not have gradient. (#5835) +- Fix the bug that `multiscale_output` is defined but not used in HRNet (#5887) +- Set the priority of EvalHook to LOW. (#5882) +- Fix a YOLOX bug when applying bbox rescaling in test mode (#5899) +- Fix mosaic coordinate error (#5947) +- Fix dtype of bbox in RandomAffine. (#5930) + +#### Improvements + +- Add Chinese version of `data_pipeline` and (#5662) +- Support to remove state dicts of EMA when publishing models. (#5858) +- Refactor the loss function in HTC and SCNet (#5881) +- Use warnings instead of logger.warning (#5540) +- Use legacy coordinate in metric of VOC (#5627) +- Add Chinese version of customize_losses (#5826) +- Add Chinese version of model_zoo (#5827) + +#### Contributors + +A total of 19 developers contributed to this release. +Thanks @ypwhs, @zywvvd, @collinzrj, @OceanPang, @ddonatien, @@haotian-liu, @viibridges, @Muyun99, @guigarfr, @zhaojinjian0000, @jbwang1997,@wangbo-zhao, @xvjiarui, @RangiLyu, @jshilong, @AronLin, @BIGWangYuDong, @hhaAndroid, @ZwwWayne + +### v2.15.1 (11/8/2021) + +#### Highlights + +- Support [YOLOX](https://arxiv.org/abs/2107.08430) + +#### New Features + +- Support [YOLOX](https://arxiv.org/abs/2107.08430)(#5756, #5758, #5760, #5767, #5770, #5774, #5777, #5808, #5828, #5848) + +#### Bug Fixes + +- Update correct SSD models. (#5789) +- Fix casting error in mask structure (#5820) +- Fix MMCV deployment documentation links. (#5790) + +#### Improvements + +- Use dynamic MMCV download link in TorchServe dockerfile (#5779) +- Rename the function `upsample_like` to `interpolate_as` for more general usage (#5788) + +#### Contributors + +A total of 14 developers contributed to this release. +Thanks @HAOCHENYE, @xiaohu2015, @HsLOL, @zhiqwang, @Adamdad, @shinya7y, @Johnson-Wang, @RangiLyu, @jshilong, @mmeendez8, @AronLin, @BIGWangYuDong, @hhaAndroid, @ZwwWayne + +### v2.15.0 (02/8/2021) + +#### Highlights + +- Support adding [MIM](https://github.com/open-mmlab/mim) dependencies during pip installation +- Support MobileNetV2 for SSD-Lite and YOLOv3 +- Support Chinese Documentation + +#### New Features + +- Add function `upsample_like` (#5732) +- Support to output pdf and epub format documentation (#5738) +- Support and release Cascade Mask R-CNN 3x pre-trained models (#5645) +- Add `ignore_index` to CrossEntropyLoss (#5646) +- Support adding [MIM](https://github.com/open-mmlab/mim) dependencies during pip installation (#5676) +- Add MobileNetV2 config and models for YOLOv3 (#5510) +- Support COCO Panoptic Dataset (#5231) +- Support ONNX export of cascade models (#5486) +- Support DropBlock with RetinaNet (#5544) +- Support MobileNetV2 SSD-Lite (#5526) + +#### Bug Fixes + +- Fix the device of label in multiclass_nms (#5673) +- Fix error of backbone initialization from pre-trained checkpoint in config file (#5603, #5550) +- Fix download links of RegNet pretrained weights (#5655) +- Fix two-stage runtime error given empty proposal (#5559) +- Fix flops count error in DETR (#5654) +- Fix unittest for `NumClassCheckHook` when it is not used. (#5626) +- Fix description bug of using custom dataset (#5546) +- Fix bug of `multiclass_nms` that returns the global indices (#5592) +- Fix `valid_mask` logic error in RPNHead (#5562) +- Fix unit test error of pretrained configs (#5561) +- Fix typo error in anchor_head.py (#5555) +- Fix bug when using dataset wrappers (#5552) +- Fix a typo error in demo/MMDet_Tutorial.ipynb (#5511) +- Fixing crash in `get_root_logger` when `cfg.log_level` is not None (#5521) +- Fix docker version (#5502) +- Fix optimizer parameter error when using `IterBasedRunner` (#5490) + +#### Improvements + +- Add unit tests for MMTracking (#5620) +- Add Chinese translation of documentation (#5718, #5618, #5558, #5423, #5593, #5421, #5408. #5369, #5419, #5530, #5531) +- Update resource limit (#5697) +- Update docstring for InstaBoost (#5640) +- Support key `reduction_override` in all loss functions (#5515) +- Use repeatdataset to accelerate CenterNet training (#5509) +- Remove unnecessary code in autoassign (#5519) +- Add documentation about `init_cfg` (#5273) + +#### Contributors + +A total of 18 developers contributed to this release. +Thanks @OceanPang, @AronLin, @hellock, @Outsider565, @RangiLyu, @ElectronicElephant, @likyoo, @BIGWangYuDong, @hhaAndroid, @noobying, @yyz561, @likyoo, +@zeakey, @ZwwWayne, @ChenyangLiu, @johnson-magic, @qingswu, @BuxianChen + +### v2.14.0 (29/6/2021) + +#### Highlights + +- Add `simple_test` to dense heads to improve the consistency of single-stage and two-stage detectors +- Revert the `test_mixins` to single image test to improve efficiency and readability +- Add Faster R-CNN and Mask R-CNN config using multi-scale training with 3x schedule + +#### New Features + +- Support pretrained models from MoCo v2 and SwAV (#5286) +- Add Faster R-CNN and Mask R-CNN config using multi-scale training with 3x schedule (#5179, #5233) +- Add `reduction_override` in MSELoss (#5437) +- Stable support of exporting DETR to ONNX with dynamic shapes and batch inference (#5168) +- Stable support of exporting PointRend to ONNX with dynamic shapes and batch inference (#5440) + +#### Bug Fixes + +- Fix size mismatch bug in `multiclass_nms` (#4980) +- Fix the import path of `MultiScaleDeformableAttention` (#5338) +- Fix errors in config of GCNet ResNext101 models (#5360) +- Fix Grid-RCNN error when there is no bbox result (#5357) +- Fix errors in `onnx_export` of bbox_head when setting reg_class_agnostic (#5468) +- Fix type error of AutoAssign in the document (#5478) +- Fix web links ending with `.md` (#5315) + +#### Improvements + +- Add `simple_test` to dense heads to improve the consistency of single-stage and two-stage detectors (#5264) +- Add support for mask diagonal flip in TTA (#5403) +- Revert the `test_mixins` to single image test to improve efficiency and readability (#5249) +- Make YOLOv3 Neck more flexible (#5218) +- Refactor SSD to make it more general (#5291) +- Refactor `anchor_generator` and `point_generator` (#5349) +- Allow to configure out the `mask_head` of the HTC algorithm (#5389) +- Delete deprecated warning in FPN (#5311) +- Move `model.pretrained` to `model.backbone.init_cfg` (#5370) +- Make deployment tools more friendly to use (#5280) +- Clarify installation documentation (#5316) +- Add ImageNet Pretrained Models docs (#5268) +- Add FAQ about training loss=nan solution and COCO AP or AR =-1 (# 5312, #5313) +- Change all weight links of http to https (#5328) + +### v2.13.0 (01/6/2021) + +#### Highlights + +- Support new methods: [CenterNet](https://arxiv.org/abs/1904.07850), [Seesaw Loss](https://arxiv.org/abs/2008.10032), [MobileNetV2](https://arxiv.org/abs/1801.04381) + +#### New Features + +- Support paper [Objects as Points](https://arxiv.org/abs/1904.07850) (#4602) +- Support paper [Seesaw Loss for Long-Tailed Instance Segmentation (CVPR 2021)](https://arxiv.org/abs/2008.10032) (#5128) +- Support [MobileNetV2](https://arxiv.org/abs/1801.04381) backbone and inverted residual block (#5122) +- Support [MIM](https://github.com/open-mmlab/mim) (#5143) +- ONNX exportation with dynamic shapes of CornerNet (#5136) +- Add `mask_soft` config option to allow non-binary masks (#4615) +- Add PWC metafile (#5135) + +#### Bug Fixes + +- Fix YOLOv3 FP16 training error (#5172) +- Fix Cacscade R-CNN TTA test error when `det_bboxes` length is 0 (#5221) +- Fix `iou_thr` variable naming errors in VOC recall calculation function (#5195) +- Fix Faster R-CNN performance dropped in ONNX Runtime (#5197) +- Fix DETR dict changed error when using python 3.8 during iteration (#5226) + +#### Improvements + +- Refactor ONNX export of two stage detector (#5205) +- Replace MMDetection's EvalHook with MMCV's EvalHook for consistency (#4806) +- Update RoI extractor for ONNX (#5194) +- Use better parameter initialization in YOLOv3 head for higher performance (#5181) +- Release new DCN models of Mask R-CNN by mixed-precision training (#5201) +- Update YOLOv3 model weights (#5229) +- Add DetectoRS ResNet-101 model weights (#4960) +- Discard bboxes with sizes equals to `min_bbox_size` (#5011) +- Remove duplicated code in DETR head (#5129) +- Remove unnecessary object in class definition (#5180) +- Fix doc link (#5192) + +### v2.12.0 (01/5/2021) + +#### Highlights + +- Support new methods: [AutoAssign](https://arxiv.org/abs/2007.03496), [YOLOF](https://arxiv.org/abs/2103.09460), and [Deformable DETR](https://arxiv.org/abs/2010.04159) +- Stable support of exporting models to ONNX with batched images and dynamic shape (#5039) + +#### Backwards Incompatible Changes + +MMDetection is going through big refactoring for more general and convenient usages during the releases from v2.12.0 to v2.15.0 (maybe longer). +In v2.12.0 MMDetection inevitably brings some BC-breakings, including the MMCV dependency, model initialization, model registry, and mask AP evaluation. + +- MMCV version. MMDetection v2.12.0 relies on the newest features in MMCV 1.3.3, including `BaseModule` for unified parameter initialization, model registry, and the CUDA operator `MultiScaleDeformableAttn` for [Deformable DETR](https://arxiv.org/abs/2010.04159). Note that MMCV 1.3.2 already contains all the features used by MMDet but has known issues. Therefore, we recommend users skip MMCV v1.3.2 and use v1.3.3, though v1.3.2 might work for most cases. +- Unified model initialization (#4750). To unify the parameter initialization in OpenMMLab projects, MMCV supports `BaseModule` that accepts `init_cfg` to allow the modules' parameters initialized in a flexible and unified manner. Now the users need to explicitly call `model.init_weights()` in the training script to initialize the model (as in [here](https://github.com/open-mmlab/mmdetection/blob/master/tools/train.py#L162), previously this was handled by the detector. The models in MMDetection have been re-benchmarked to ensure accuracy based on PR #4750. __The downstream projects should update their code accordingly to use MMDetection v2.12.0__. +- Unified model registry (#5059). To easily use backbones implemented in other OpenMMLab projects, MMDetection migrates to inherit the model registry created in MMCV (#760). In this way, as long as the backbone is supported in an OpenMMLab project and that project also uses the registry in MMCV, users can use that backbone in MMDetection by simply modifying the config without copying the code of that backbone into MMDetection. +- Mask AP evaluation (#4898). Previous versions calculate the areas of masks through the bounding boxes when calculating the mask AP of small, medium, and large instances. To indeed use the areas of masks, we pop the key `bbox` during mask AP calculation. This change does not affect the overall mask AP evaluation and aligns the mask AP of similar models in other projects like Detectron2. + +#### New Features + +- Support paper [AutoAssign: Differentiable Label Assignment for Dense Object Detection](https://arxiv.org/abs/2007.03496) (#4295) +- Support paper [You Only Look One-level Feature](https://arxiv.org/abs/2103.09460) (#4295) +- Support paper [Deformable DETR: Deformable Transformers for End-to-End Object Detection](https://arxiv.org/abs/2010.04159) (#4778) +- Support calculating IoU with FP16 tensor in `bbox_overlaps` to save memory and keep speed (#4889) +- Add `__repr__` in custom dataset to count the number of instances (#4756) +- Add windows support by updating requirements.txt (#5052) +- Stable support of exporting models to ONNX with batched images and dynamic shape, including SSD, FSAF,FCOS, YOLOv3, RetinaNet, Faster R-CNN, and Mask R-CNN (#5039) + +#### Improvements + +- Use MMCV `MODEL_REGISTRY` (#5059) +- Unified parameter initialization for more flexible usage (#4750) +- Rename variable names and fix docstring in anchor head (#4883) +- Support training with empty GT in Cascade RPN (#4928) +- Add more details of usage of `test_robustness` in documentation (#4917) +- Changing to use `pycocotools` instead of `mmpycocotools` to fully support Detectron2 and MMDetection in one environment (#4939) +- Update torch serve dockerfile to support dockers of more versions (#4954) +- Add check for training with single class dataset (#4973) +- Refactor transformer and DETR Head (#4763) +- Update FPG model zoo (#5079) +- More accurate mask AP of small/medium/large instances (#4898) + +#### Bug Fixes + +- Fix bug in mean_ap.py when calculating mAP by 11 points (#4875) +- Fix error when key `meta` is not in old checkpoints (#4936) +- Fix hanging bug when training with empty GT in VFNet, GFL, and FCOS by changing the place of `reduce_mean` (#4923, #4978, #5058) +- Fix asyncronized inference error and provide related demo (#4941) +- Fix IoU losses dimensionality unmatch error (#4982) +- Fix torch.randperm whtn using PyTorch 1.8 (#5014) +- Fix empty bbox error in `mask_head` when using CARAFE (#5062) +- Fix `supplement_mask` bug when there are zero-size RoIs (#5065) +- Fix testing with empty rois in RoI Heads (#5081) + +### v2.11.0 (01/4/2021) + +__Highlights__ + +- Support new method: [Localization Distillation for Object Detection](https://arxiv.org/pdf/2102.12252.pdf) +- Support Pytorch2ONNX with batch inference and dynamic shape + +__New Features__ + +- Support [Localization Distillation for Object Detection](https://arxiv.org/pdf/2102.12252.pdf) (#4758) +- Support Pytorch2ONNX with batch inference and dynamic shape for Faster-RCNN and mainstream one-stage detectors (#4796) + +__Improvements__ + +- Support batch inference in head of RetinaNet (#4699) +- Add batch dimension in second stage of Faster-RCNN (#4785) +- Support batch inference in bbox coder (#4721) +- Add check for `ann_ids` in `COCODataset` to ensure it is unique (#4789) +- support for showing the FPN results (#4716) +- support dynamic shape for grid_anchor (#4684) +- Move pycocotools version check to when it is used (#4880) + +__Bug Fixes__ + +- Fix a bug of TridentNet when doing the batch inference (#4717) +- Fix a bug of Pytorch2ONNX in FASF (#4735) +- Fix a bug when show the image with float type (#4732) + +### v2.10.0 (01/03/2021) + +#### Highlights + +- Support new methods: [FPG](https://arxiv.org/abs/2004.03580) +- Support ONNX2TensorRT for SSD, FSAF, FCOS, YOLOv3, and Faster R-CNN. + +#### New Features + +- Support ONNX2TensorRT for SSD, FSAF, FCOS, YOLOv3, and Faster R-CNN (#4569) +- Support [Feature Pyramid Grids (FPG)](https://arxiv.org/abs/2004.03580) (#4645) +- Support video demo (#4420) +- Add seed option for sampler (#4665) +- Support to customize type of runner (#4570, #4669) +- Support synchronizing BN buffer in `EvalHook` (#4582) +- Add script for GIF demo (#4573) + +#### Bug Fixes + +- Fix ConfigDict AttributeError and add Colab link (#4643) +- Avoid crash in empty gt training of GFL head (#4631) +- Fix `iou_thrs` bug in RPN evaluation (#4581) +- Fix syntax error of config when upgrading model version (#4584) + +#### Improvements + +- Refactor unit test file structures (#4600) +- Refactor nms config (#4636) +- Get loading pipeline by checking the class directly rather than through config strings (#4619) +- Add doctests for mask target generation and mask structures (#4614) +- Use deep copy when copying pipeline arguments (#4621) +- Update documentations (#4642, #4650, #4620, #4630) +- Remove redundant code calling `import_modules_from_strings` (#4601) +- Clean deprecated FP16 API (#4571) +- Check whether `CLASSES` is correctly initialized in the initialization of `XMLDataset` (#4555) +- Support batch inference in the inference API (#4462, #4526) +- Clean deprecated warning and fix 'meta' error (#4695) + +### v2.9.0 (01/02/2021) + +#### Highlights + +- Support new methods: [SCNet](https://arxiv.org/abs/2012.10150), [Sparse R-CNN](https://arxiv.org/abs/2011.12450) +- Move `train_cfg` and `test_cfg` into model in configs +- Support to visualize results based on prediction quality + +#### New Features + +- Support [SCNet](https://arxiv.org/abs/2012.10150) (#4356) +- Support [Sparse R-CNN](https://arxiv.org/abs/2011.12450) (#4219) +- Support evaluate mAP by multiple IoUs (#4398) +- Support concatenate dataset for testing (#4452) +- Support to visualize results based on prediction quality (#4441) +- Add ONNX simplify option to Pytorch2ONNX script (#4468) +- Add hook for checking compatibility of class numbers in heads and datasets (#4508) + +#### Bug Fixes + +- Fix CPU inference bug of Cascade RPN (#4410) +- Fix NMS error of CornerNet when there is no prediction box (#4409) +- Fix TypeError in CornerNet inference (#4411) +- Fix bug of PAA when training with background images (#4391) +- Fix the error that the window data is not destroyed when `out_file is not None` and `show==False` (#4442) +- Fix order of NMS `score_factor` that will decrease the performance of YOLOv3 (#4473) +- Fix bug in HTC TTA when the number of detection boxes is 0 (#4516) +- Fix resize error in mask data structures (#4520) + +#### Improvements + +- Allow to customize classes in LVIS dataset (#4382) +- Add tutorials for building new models with existing datasets (#4396) +- Add CPU compatibility information in documentation (#4405) +- Add documentation of deprecated `ImageToTensor` for batch inference (#4408) +- Add more details in documentation for customizing dataset (#4430) +- Switch `imshow_det_bboxes` visualization backend from OpenCV to Matplotlib (#4389) +- Deprecate `ImageToTensor` in `image_demo.py` (#4400) +- Move train_cfg/test_cfg into model (#4347, #4489) +- Update docstring for `reg_decoded_bbox` option in bbox heads (#4467) +- Update dataset information in documentation (#4525) +- Release pre-trained R50 and R101 PAA detectors with multi-scale 3x training schedules (#4495) +- Add guidance for speed benchmark (#4537) + +### v2.8.0 (04/01/2021) + +#### Highlights + +- Support new methods: [Cascade RPN](https://arxiv.org/abs/1909.06720), [TridentNet](https://arxiv.org/abs/1901.01892) + +#### New Features + +- Support [Cascade RPN](https://arxiv.org/abs/1909.06720) (#1900) +- Support [TridentNet](https://arxiv.org/abs/1901.01892) (#3313) + +#### Bug Fixes + +- Fix bug of show result in async_benchmark (#4367) +- Fix scale factor in MaskTestMixin (#4366) +- Fix but when returning indices in `multiclass_nms` (#4362) +- Fix bug of empirical attention in resnext backbone error (#4300) +- Fix bug of `img_norm_cfg` in FCOS-HRNet models with updated performance and models (#4250) +- Fix invalid checkpoint and log in Mask R-CNN models on Cityscapes dataset (#4287) +- Fix bug in distributed sampler when dataset is too small (#4257) +- Fix bug of 'PAFPN has no attribute extra_convs_on_inputs' (#4235) + +#### Improvements + +- Update model url from aws to aliyun (#4349) +- Update ATSS for PyTorch 1.6+ (#4359) +- Update script to install ruby in pre-commit installation (#4360) +- Delete deprecated `mmdet.ops` (#4325) +- Refactor hungarian assigner for more general usage in Sparse R-CNN (#4259) +- Handle scipy import in DETR to reduce package dependencies (#4339) +- Update documentation of usages for config options after MMCV (1.2.3) supports overriding list in config (#4326) +- Update pre-train models of faster rcnn trained on COCO subsets (#4307) +- Avoid zero or too small value for beta in Dynamic R-CNN (#4303) +- Add doccumentation for Pytorch2ONNX (#4271) +- Add deprecated warning FPN arguments (#4264) +- Support returning indices of kept bboxes when using nms (#4251) +- Update type and device requirements when creating tensors `GFLHead` (#4210) +- Update device requirements when creating tensors in `CrossEntropyLoss` (#4224) + +### v2.7.0 (30/11/2020) + +- Support new method: [DETR](https://arxiv.org/abs/2005.12872), [ResNest](https://arxiv.org/abs/2004.08955), Faster R-CNN DC5. +- Support YOLO, Mask R-CNN, and Cascade R-CNN models exportable to ONNX. + +#### New Features + +- Support [DETR](https://arxiv.org/abs/2005.12872) (#4201, #4206) +- Support to link the best checkpoint in training (#3773) +- Support to override config through options in inference.py (#4175) +- Support YOLO, Mask R-CNN, and Cascade R-CNN models exportable to ONNX (#4087, #4083) +- Support [ResNeSt](https://arxiv.org/abs/2004.08955) backbone (#2959) +- Support unclip border bbox regression (#4076) +- Add tpfp func in evaluating AP (#4069) +- Support mixed precision training of SSD detector with other backbones (#4081) +- Add Faster R-CNN DC5 models (#4043) + +#### Bug Fixes + +- Fix bug of `gpu_id` in distributed training mode (#4163) +- Support Albumentations with version higher than 0.5 (#4032) +- Fix num_classes bug in faster rcnn config (#4088) +- Update code in docs/2_new_data_model.md (#4041) + +#### Improvements + +- Ensure DCN offset to have similar type as features in VFNet (#4198) +- Add config links in README files of models (#4190) +- Add tutorials for loss conventions (#3818) +- Add solution to installation issues in 30-series GPUs (#4176) +- Update docker version in get_started.md (#4145) +- Add model statistics and polish some titles in configs README (#4140) +- Clamp neg probability in FreeAnchor (#4082) +- Speed up expanding large images (#4089) +- Fix Pytorch 1.7 incompatibility issues (#4103) +- Update trouble shooting page to resolve segmentation fault (#4055) +- Update aLRP-Loss in project page (#4078) +- Clean duplicated `reduce_mean` function (#4056) +- Refactor Q&A (#4045) + +### v2.6.0 (1/11/2020) + +- Support new method: [VarifocalNet](https://arxiv.org/abs/2008.13367). +- Refactored documentation with more tutorials. + +#### New Features + +- Support GIoU calculation in `BboxOverlaps2D`, and re-implement `giou_loss` using `bbox_overlaps` (#3936) +- Support random sampling in CPU mode (#3948) +- Support VarifocalNet (#3666, #4024) + +#### Bug Fixes + +- Fix SABL validating bug in Cascade R-CNN (#3913) +- Avoid division by zero in PAA head when num_pos=0 (#3938) +- Fix temporary directory bug of multi-node testing error (#4034, #4017) +- Fix `--show-dir` option in test script (#4025) +- Fix GA-RetinaNet r50 model url (#3983) +- Update code in docs and fix broken urls (#3947) + +#### Improvements + +- Refactor pytorch2onnx API into `mmdet.core.export` and use `generate_inputs_and_wrap_model` for pytorch2onnx (#3857, #3912) +- Update RPN upgrade scripts for v2.5.0 compatibility (#3986) +- Use mmcv `tensor2imgs` (#4010) +- Update test robustness (#4000) +- Update trouble shooting page (#3994) +- Accelerate PAA training speed (#3985) +- Support batch_size > 1 in validation (#3966) +- Use RoIAlign implemented in MMCV for inference in CPU mode (#3930) +- Documentation refactoring (#4031) + +### v2.5.0 (5/10/2020) + +#### Highlights + +- Support new methods: [YOLACT](https://arxiv.org/abs/1904.02689), [CentripetalNet](https://arxiv.org/abs/2003.09119). +- Add more documentations for easier and more clear usage. + +#### Backwards Incompatible Changes + +__FP16 related methods are imported from mmcv instead of mmdet. (#3766, #3822)__ +Mixed precision training utils in `mmdet.core.fp16` are moved to `mmcv.runner`, including `force_fp32`, `auto_fp16`, `wrap_fp16_model`, and `Fp16OptimizerHook`. A deprecation warning will be raised if users attempt to import those methods from `mmdet.core.fp16`, and will be finally removed in V2.10.0. + +__\[0, N-1\] represents foreground classes and N indicates background classes for all models. (#3221)__ +Before v2.5.0, the background label for RPN is 0, and N for other heads. Now the behavior is consistent for all models. Thus `self.background_labels` in `dense_heads` is removed and all heads use `self.num_classes` to indicate the class index of background labels. +This change has no effect on the pre-trained models in the v2.x model zoo, but will affect the training of all models with RPN heads. Two-stage detectors whose RPN head uses softmax will be affected because the order of categories is changed. + +**Only call `get_subset_by_classes` when `test_mode=True` and `self.filter_empty_gt=True` (#3695)** +Function `get_subset_by_classes` in dataset is refactored and only filters out images when `test_mode=True` and `self.filter_empty_gt=True`. +In the original implementation, `get_subset_by_classes` is not related to the flag `self.filter_empty_gt` and will only be called when the classes is set during initialization no matter `test_mode` is `True` or `False`. This brings ambiguous behavior and potential bugs in many cases. After v2.5.0, if `filter_empty_gt=False`, no matter whether the classes are specified in a dataset, the dataset will use all the images in the annotations. If `filter_empty_gt=True` and `test_mode=True`, no matter whether the classes are specified, the dataset will call \`\`get_subset_by_classes\` to check the images and filter out images containing no GT boxes. Therefore, the users should be responsible for the data filtering/cleaning process for the test dataset. + +#### New Features + +- Test time augmentation for single stage detectors (#3844, #3638) +- Support to show the name of experiments during training (#3764) +- Add `Shear`, `Rotate`, `Translate` Augmentation (#3656, #3619, #3687) +- Add image-only transformations including `Constrast`, `Equalize`, `Color`, and `Brightness`. (#3643) +- Support [YOLACT](https://arxiv.org/abs/1904.02689) (#3456) +- Support [CentripetalNet](https://arxiv.org/abs/2003.09119) (#3390) +- Support PyTorch 1.6 in docker (#3905) + +#### Bug Fixes + +- Fix the bug of training ATSS when there is no ground truth boxes (#3702) +- Fix the bug of using Focal Loss when there is `num_pos` is 0 (#3702) +- Fix the label index mapping in dataset browser (#3708) +- Fix Mask R-CNN training stuck problem when their is no positive rois (#3713) +- Fix the bug of `self.rpn_head.test_cfg` in `RPNTestMixin` by using `self.rpn_head` in rpn head (#3808) +- Fix deprecated `Conv2d` from mmcv.ops (#3791) +- Fix device bug in RepPoints (#3836) +- Fix SABL validating bug (#3849) +- Use `https://download.openmmlab.com/mmcv/dist/index.html` for installing MMCV (#3840) +- Fix nonzero in NMS for PyTorch 1.6.0 (#3867) +- Fix the API change bug of PAA (#3883) +- Fix typo in bbox_flip (#3886) +- Fix cv2 import error of ligGL.so.1 in Dockerfile (#3891) + +#### Improvements + +- Change to use `mmcv.utils.collect_env` for collecting environment information to avoid duplicate codes (#3779) +- Update checkpoint file names to v2.0 models in documentation (#3795) +- Update tutorials for changing runtime settings (#3778), modifying loss (#3777) +- Improve the function of `simple_test_bboxes` in SABL (#3853) +- Convert mask to bool before using it as img's index for robustness and speedup (#3870) +- Improve documentation of modules and dataset customization (#3821) + +### v2.4.0 (5/9/2020) + +__Highlights__ + +- Fix lots of issues/bugs and reorganize the trouble shooting page +- Support new methods [SABL](https://arxiv.org/abs/1912.04260), [YOLOv3](https://arxiv.org/abs/1804.02767), and [PAA Assign](https://arxiv.org/abs/2007.08103) +- Support Batch Inference +- Start to publish `mmdet` package to PyPI since v2.3.0 +- Switch model zoo to download.openmmlab.com + +__Backwards Incompatible Changes__ + +- Support Batch Inference (#3564, #3686, #3705): Since v2.4.0, MMDetection could inference model with multiple images in a single GPU. + This change influences all the test APIs in MMDetection and downstream codebases. To help the users migrate their code, we use `replace_ImageToTensor` (#3686) to convert legacy test data pipelines during dataset initialization. +- Support RandomFlip with horizontal/vertical/diagonal direction (#3608): Since v2.4.0, MMDetection supports horizontal/vertical/diagonal flip in the data augmentation. This influences bounding box, mask, and image transformations in data augmentation process and the process that will map those data back to the original format. +- Migrate to use `mmlvis` and `mmpycocotools` for COCO and LVIS dataset (#3727). The APIs are fully compatible with the original `lvis` and `pycocotools`. Users need to uninstall the existing pycocotools and lvis packages in their environment first and install `mmlvis` & `mmpycocotools`. + +__Bug Fixes__ + +- Fix default mean/std for onnx (#3491) +- Fix coco evaluation and add metric items (#3497) +- Fix typo for install.md (#3516) +- Fix atss when sampler per gpu is 1 (#3528) +- Fix import of fuse_conv_bn (#3529) +- Fix bug of gaussian_target, update unittest of heatmap (#3543) +- Fixed VOC2012 evaluate (#3553) +- Fix scale factor bug of rescale (#3566) +- Fix with_xxx_attributes in base detector (#3567) +- Fix boxes scaling when number is 0 (#3575) +- Fix rfp check when neck config is a list (#3591) +- Fix import of fuse conv bn in benchmark.py (#3606) +- Fix webcam demo (#3634) +- Fix typo and itemize issues in tutorial (#3658) +- Fix error in distributed training when some levels of FPN are not assigned with bounding boxes (#3670) +- Fix the width and height orders of stride in valid flag generation (#3685) +- Fix weight initialization bug in Res2Net DCN (#3714) +- Fix bug in OHEMSampler (#3677) + +__New Features__ + +- Support Cutout augmentation (#3521) +- Support evaluation on multiple datasets through ConcatDataset (#3522) +- Support [PAA assign](https://arxiv.org/abs/2007.08103) #(3547) +- Support eval metric with pickle results (#3607) +- Support [YOLOv3](https://arxiv.org/abs/1804.02767) (#3083) +- Support [SABL](https://arxiv.org/abs/1912.04260) (#3603) +- Support to publish to Pypi in github-action (#3510) +- Support custom imports (#3641) + +__Improvements__ + +- Refactor common issues in documentation (#3530) +- Add pytorch 1.6 to CI config (#3532) +- Add config to runner meta (#3534) +- Add eval-option flag for testing (#3537) +- Add init_eval to evaluation hook (#3550) +- Add include_bkg in ClassBalancedDataset (#3577) +- Using config's loading in inference_detector (#3611) +- Add ATSS ResNet-101 models in model zoo (#3639) +- Update urls to download.openmmlab.com (#3665) +- Support non-mask training for CocoDataset (#3711) + +### v2.3.0 (5/8/2020) + +__Highlights__ + +- The CUDA/C++ operators have been moved to `mmcv.ops`. For backward compatibility `mmdet.ops` is kept as warppers of `mmcv.ops`. +- Support new methods [CornerNet](https://arxiv.org/abs/1808.01244), [DIOU](https://arxiv.org/abs/1911.08287)/[CIOU](https://arxiv.org/abs/2005.03572) loss, and new dataset: [LVIS V1](https://arxiv.org/abs/1908.03195) +- Provide more detailed colab training tutorials and more complete documentation. +- Support to convert RetinaNet from Pytorch to ONNX. + +__Bug Fixes__ + +- Fix the model initialization bug of DetectoRS (#3187) +- Fix the bug of module names in NASFCOSHead (#3205) +- Fix the filename bug in publish_model.py (#3237) +- Fix the dimensionality bug when `inside_flags.any()` is `False` in dense heads (#3242) +- Fix the bug of forgetting to pass flip directions in `MultiScaleFlipAug` (#3262) +- Fixed the bug caused by default value of `stem_channels` (#3333) +- Fix the bug of model checkpoint loading for CPU inference (#3318, #3316) +- Fix topk bug when box number is smaller than the expected topk number in ATSSAssigner (#3361) +- Fix the gt priority bug in center_region_assigner.py (#3208) +- Fix NaN issue of iou calculation in iou_loss.py (#3394) +- Fix the bug that `iou_thrs` is not actually used during evaluation in coco.py (#3407) +- Fix test-time augmentation of RepPoints (#3435) +- Fix runtimeError caused by incontiguous tensor in Res2Net+DCN (#3412) + +__New Features__ + +- Support [CornerNet](https://arxiv.org/abs/1808.01244) (#3036) +- Support [DIOU](https://arxiv.org/abs/1911.08287)/[CIOU](https://arxiv.org/abs/2005.03572) loss (#3151) +- Support [LVIS V1](https://arxiv.org/abs/1908.03195) dataset (#) +- Support customized hooks in training (#3395) +- Support fp16 training of generalized focal loss (#3410) +- Support to convert RetinaNet from Pytorch to ONNX (#3075) + +__Improvements__ + +- Support to process ignore boxes in ATSS assigner (#3082) +- Allow to crop images without ground truth in `RandomCrop` (#3153) +- Enable the the `Accuracy` module to set threshold (#3155) +- Refactoring unit tests (#3206) +- Unify the training settings of `to_float32` and `norm_cfg` in RegNets configs (#3210) +- Add colab training tutorials for beginners (#3213, #3273) +- Move CUDA/C++ operators into `mmcv.ops` and keep `mmdet.ops` as warppers for backward compatibility (#3232)(#3457) +- Update installation scripts in documentation (#3290) and dockerfile (#3320) +- Support to set image resize backend (#3392) +- Remove git hash in version file (#3466) +- Check mmcv version to force version compatibility (#3460) + +### v2.2.0 (1/7/2020) + +__Highlights__ + +- Support new methods: [DetectoRS](https://arxiv.org/abs/2006.02334), [PointRend](https://arxiv.org/abs/1912.08193), [Generalized Focal Loss](https://arxiv.org/abs/2006.04388), [Dynamic R-CNN](https://arxiv.org/abs/2004.06002) + +__Bug Fixes__ + +- Fix FreeAnchor when no gt in image (#3176) +- Clean up deprecated usage of `register_module()` (#3092, #3161) +- Fix pretrain bug in NAS FCOS (#3145) +- Fix `num_classes` in SSD (#3142) +- Fix FCOS warmup (#3119) +- Fix `rstrip` in `tools/publish_model.py` +- Fix `flip_ratio` default value in RandomFLip pipeline (#3106) +- Fix cityscapes eval with ms_rcnn (#3112) +- Fix RPN softmax (#3056) +- Fix filename of LVIS@v0.5 (#2998) +- Fix nan loss by filtering out-of-frame gt_bboxes in COCO (#2999) +- Fix bug in FSAF (#3018) +- Add FocalLoss `num_classes` check (#2964) +- Fix PISA Loss when there are no gts (#2992) +- Avoid nan in `iou_calculator` (#2975) +- Prevent possible bugs in loading and transforms caused by shallow copy (#2967) + +__New Features__ + +- Add DetectoRS (#3064) +- Support Generalize Focal Loss (#3097) +- Support PointRend (#2752) +- Support Dynamic R-CNN (#3040) +- Add DeepFashion dataset (#2968) +- Implement FCOS training tricks (#2935) +- Use BaseDenseHead as base class for anchor-base heads (#2963) +- Add `with_cp` for BasicBlock (#2891) +- Add `stem_channels` argument for ResNet (#2954) + +__Improvements__ + +- Add anchor free base head (#2867) +- Migrate to github action (#3137) +- Add docstring for datasets, pipelines, core modules and methods (#3130, #3125, #3120) +- Add VOC benchmark (#3060) +- Add `concat` mode in GRoI (#3098) +- Remove cmd arg `autorescale-lr` (#3080) +- Use `len(data['img_metas'])` to indicate `num_samples` (#3073, #3053) +- Switch to EpochBasedRunner (#2976) + +### v2.1.0 (8/6/2020) + +__Highlights__ + +- Support new backbones: [RegNetX](https://arxiv.org/abs/2003.13678), [Res2Net](https://arxiv.org/abs/1904.01169) +- Support new methods: [NASFCOS](https://arxiv.org/abs/1906.04423), [PISA](https://arxiv.org/abs/1904.04821), [GRoIE](https://arxiv.org/abs/2004.13665) +- Support new dataset: [LVIS](https://arxiv.org/abs/1908.03195) + +__Bug Fixes__ + +- Change the CLI argument `--validate` to `--no-validate` to enable validation after training epochs by default. (#2651) +- Add missing cython to docker file (#2713) +- Fix bug in nms cpu implementation (#2754) +- Fix bug when showing mask results (#2763) +- Fix gcc requirement (#2806) +- Fix bug in async test (#2820) +- Fix mask encoding-decoding bugs in test API (#2824) +- Fix bug in test time augmentation (#2858, #2921, #2944) +- Fix a typo in comment of apis/train (#2877) +- Fix the bug of returning None when no gt bboxes are in the original image in `RandomCrop`. Fix the bug that misses to handle `gt_bboxes_ignore`, `gt_label_ignore`, and `gt_masks_ignore` in `RandomCrop`, `MinIoURandomCrop` and `Expand` modules. (#2810) +- Fix bug of `base_channels` of regnet (#2917) +- Fix the bug of logger when loading pre-trained weights in base detector (#2936) + +__New Features__ + +- Add IoU models (#2666) +- Add colab demo for inference +- Support class agnostic nms (#2553) +- Add benchmark gathering scripts for development only (#2676) +- Add mmdet-based project links (#2736, #2767, #2895) +- Add config dump in training (#2779) +- Add ClassBalancedDataset (#2721) +- Add res2net backbone (#2237) +- Support RegNetX models (#2710) +- Use `mmcv.FileClient` to support different storage backends (#2712) +- Add ClassBalancedDataset (#2721) +- Code Release: Prime Sample Attention in Object Detection (CVPR 2020) (#2626) +- Implement NASFCOS (#2682) +- Add class weight in CrossEntropyLoss (#2797) +- Support LVIS dataset (#2088) +- Support GRoIE (#2584) + +__Improvements__ + +- Allow different x and y strides in anchor heads. (#2629) +- Make FSAF loss more robust to no gt (#2680) +- Compute pure inference time instead (#2657) and update inference speed (#2730) +- Avoided the possibility that a patch with 0 area is cropped. (#2704) +- Add warnings when deprecated `imgs_per_gpu` is used. (#2700) +- Add a mask rcnn example for config (#2645) +- Update model zoo (#2762, #2866, #2876, #2879, #2831) +- Add `ori_filename` to img_metas and use it in test show-dir (#2612) +- Use `img_fields` to handle multiple images during image transform (#2800) +- Add upsample_cfg support in FPN (#2787) +- Add `['img']` as default `img_fields` for back compatibility (#2809) +- Rename the pretrained model from `open-mmlab://resnet50_caffe` and `open-mmlab://resnet50_caffe_bgr` to `open-mmlab://detectron/resnet50_caffe` and `open-mmlab://detectron2/resnet50_caffe`. (#2832) +- Added sleep(2) in test.py to reduce hanging problem (#2847) +- Support `c10::half` in CARAFE (#2890) +- Improve documentations (#2918, #2714) +- Use optimizer constructor in mmcv and clean the original implementation in `mmdet.core.optimizer` (#2947) + +### v2.0.0 (6/5/2020) + +In this release, we made lots of major refactoring and modifications. + +1. __Faster speed__. We optimize the training and inference speed for common models, achieving up to 30% speedup for training and 25% for inference. Please refer to [model zoo](model_zoo.md#comparison-with-detectron2) for details. + +2. __Higher performance__. We change some default hyperparameters with no additional cost, which leads to a gain of performance for most models. Please refer to [compatibility](compatibility.md#training-hyperparameters) for details. + +3. __More documentation and tutorials__. We add a bunch of documentation and tutorials to help users get started more smoothly. Read it [here](https://mmdetection.readthedocs.io/en/latest/). + +4. __Support PyTorch 1.5__. The support for 1.1 and 1.2 is dropped, and we switch to some new APIs. + +5. __Better configuration system__. Inheritance is supported to reduce the redundancy of configs. + +6. __Better modular design__. Towards the goal of simplicity and flexibility, we simplify some encapsulation while add more other configurable modules like BBoxCoder, IoUCalculator, OptimizerConstructor, RoIHead. Target computation is also included in heads and the call hierarchy is simpler. + +7. Support new methods: [FSAF](https://arxiv.org/abs/1903.00621) and PAFPN (part of [PAFPN](https://arxiv.org/abs/1803.01534)). + +__Breaking Changes__ +Models training with MMDetection 1.x are not fully compatible with 2.0, please refer to the [compatibility doc](compatibility.md) for the details and how to migrate to the new version. + +__Improvements__ + +- Unify cuda and cpp API for custom ops. (#2277) +- New config files with inheritance. (#2216) +- Encapsulate the second stage into RoI heads. (#1999) +- Refactor GCNet/EmpericalAttention into plugins. (#2345) +- Set low quality match as an option in IoU-based bbox assigners. (#2375) +- Change the codebase's coordinate system. (#2380) +- Refactor the category order in heads. 0 means the first positive class instead of background now. (#2374) +- Add bbox sampler and assigner registry. (#2419) +- Speed up the inference of RPN. (#2420) +- Add `train_cfg` and `test_cfg` as class members in all anchor heads. (#2422) +- Merge target computation methods into heads. (#2429) +- Add bbox coder to support different bbox encoding and losses. (#2480) +- Unify the API for regression loss. (#2156) +- Refactor Anchor Generator. (#2474) +- Make `lr` an optional argument for optimizers. (#2509) +- Migrate to modules and methods in MMCV. (#2502, #2511, #2569, #2572) +- Support PyTorch 1.5. (#2524) +- Drop the support for Python 3.5 and use F-string in the codebase. (#2531) + +__Bug Fixes__ + +- Fix the scale factors for resized images without keep the aspect ratio. (#2039) +- Check if max_num > 0 before slicing in NMS. (#2486) +- Fix Deformable RoIPool when there is no instance. (#2490) +- Fix the default value of assigned labels. (#2536) +- Fix the evaluation of Cityscapes. (#2578) + +__New Features__ + +- Add deep_stem and avg_down option to ResNet, i.e., support ResNetV1d. (#2252) +- Add L1 loss. (#2376) +- Support both polygon and bitmap for instance masks. (#2353, #2540) +- Support CPU mode for inference. (#2385) +- Add optimizer constructor for complicated configuration of optimizers. (#2397, #2488) +- Implement PAFPN. (#2392) +- Support empty tensor input for some modules. (#2280) +- Support for custom dataset classes without overriding it. (#2408, #2443) +- Support to train subsets of coco dataset. (#2340) +- Add iou_calculator to potentially support more IoU calculation methods. (2405) +- Support class wise mean AP (was removed in the last version). (#2459) +- Add option to save the testing result images. (#2414) +- Support MomentumUpdaterHook. (#2571) +- Add a demo to inference a single image. (#2605) + +### v1.1.0 (24/2/2020) + +__Highlights__ + +- Dataset evaluation is rewritten with a unified api, which is used by both evaluation hooks and test scripts. +- Support new methods: [CARAFE](https://arxiv.org/abs/1905.02188). + +__Breaking Changes__ + +- The new MMDDP inherits from the official DDP, thus the `__init__` api is changed to be the same as official DDP. +- The `mask_head` field in HTC config files is modified. +- The evaluation and testing script is updated. +- In all transforms, instance masks are stored as a numpy array shaped (n, h, w) instead of a list of (h, w) arrays, where n is the number of instances. + +__Bug Fixes__ + +- Fix IOU assigners when ignore_iof_thr > 0 and there is no pred boxes. (#2135) +- Fix mAP evaluation when there are no ignored boxes. (#2116) +- Fix the empty RoI input for Deformable RoI Pooling. (#2099) +- Fix the dataset settings for multiple workflows. (#2103) +- Fix the warning related to `torch.uint8` in PyTorch 1.4. (#2105) +- Fix the inference demo on devices other than gpu:0. (#2098) +- Fix Dockerfile. (#2097) +- Fix the bug that `pad_val` is unused in Pad transform. (#2093) +- Fix the albumentation transform when there is no ground truth bbox. (#2032) + +__Improvements__ + +- Use torch instead of numpy for random sampling. (#2094) +- Migrate to the new MMDDP implementation in MMCV v0.3. (#2090) +- Add meta information in logs. (#2086) +- Rewrite Soft NMS with pytorch extension and remove cython as a dependency. (#2056) +- Rewrite dataset evaluation. (#2042, #2087, #2114, #2128) +- Use numpy array for masks in transforms. (#2030) + +__New Features__ + +- Implement "CARAFE: Content-Aware ReAssembly of FEatures". (#1583) +- Add `worker_init_fn()` in data_loader when seed is set. (#2066, #2111) +- Add logging utils. (#2035) + +### v1.0.0 (30/1/2020) + +This release mainly improves the code quality and add more docstrings. + +__Highlights__ + +- Documentation is online now: . +- Support new models: [ATSS](https://arxiv.org/abs/1912.02424). +- DCN is now available with the api `build_conv_layer` and `ConvModule` like the normal conv layer. +- A tool to collect environment information is available for trouble shooting. + +__Bug Fixes__ + +- Fix the incompatibility of the latest numpy and pycocotools. (#2024) +- Fix the case when distributed package is unavailable, e.g., on Windows. (#1985) +- Fix the dimension issue for `refine_bboxes()`. (#1962) +- Fix the typo when `seg_prefix` is a list. (#1906) +- Add segmentation map cropping to RandomCrop. (#1880) +- Fix the return value of `ga_shape_target_single()`. (#1853) +- Fix the loaded shape of empty proposals. (#1819) +- Fix the mask data type when using albumentation. (#1818) + +__Improvements__ + +- Enhance AssignResult and SamplingResult. (#1995) +- Add ability to overwrite existing module in Registry. (#1982) +- Reorganize requirements and make albumentations and imagecorruptions optional. (#1969) +- Check NaN in `SSDHead`. (#1935) +- Encapsulate the DCN in ResNe(X)t into a ConvModule & Conv_layers. (#1894) +- Refactoring for mAP evaluation and support multiprocessing and logging. (#1889) +- Init the root logger before constructing Runner to log more information. (#1865) +- Split `SegResizeFlipPadRescale` into different existing transforms. (#1852) +- Move `init_dist()` to MMCV. (#1851) +- Documentation and docstring improvements. (#1971, #1938, #1869, #1838) +- Fix the color of the same class for mask visualization. (#1834) +- Remove the option `keep_all_stages` in HTC and Cascade R-CNN. (#1806) + +__New Features__ + +- Add two test-time options `crop_mask` and `rle_mask_encode` for mask heads. (#2013) +- Support loading grayscale images as single channel. (#1975) +- Implement "Bridging the Gap Between Anchor-based and Anchor-free Detection via Adaptive Training Sample Selection". (#1872) +- Add sphinx generated docs. (#1859, #1864) +- Add GN support for flops computation. (#1850) +- Collect env info for trouble shooting. (#1812) + +### v1.0rc1 (13/12/2019) + +The RC1 release mainly focuses on improving the user experience, and fixing bugs. + +__Highlights__ + +- Support new models: [FoveaBox](https://arxiv.org/abs/1904.03797), [RepPoints](https://arxiv.org/abs/1904.11490) and [FreeAnchor](https://arxiv.org/abs/1909.02466). +- Add a Dockerfile. +- Add a jupyter notebook demo and a webcam demo. +- Setup the code style and CI. +- Add lots of docstrings and unit tests. +- Fix lots of bugs. + +__Breaking Changes__ + +- There was a bug for computing COCO-style mAP w.r.t different scales (AP_s, AP_m, AP_l), introduced by #621. (#1679) + +__Bug Fixes__ + +- Fix a sampling interval bug in Libra R-CNN. (#1800) +- Fix the learning rate in SSD300 WIDER FACE. (#1781) +- Fix the scaling issue when `keep_ratio=False`. (#1730) +- Fix typos. (#1721, #1492, #1242, #1108, #1107) +- Fix the shuffle argument in `build_dataloader`. (#1693) +- Clip the proposal when computing mask targets. (#1688) +- Fix the "index out of range" bug for samplers in some corner cases. (#1610, #1404) +- Fix the NMS issue on devices other than GPU:0. (#1603) +- Fix SSD Head and GHM Loss on CPU. (#1578) +- Fix the OOM error when there are too many gt bboxes. (#1575) +- Fix the wrong keyword argument `nms_cfg` in HTC. (#1573) +- Process masks and semantic segmentation in Expand and MinIoUCrop transforms. (#1550, #1361) +- Fix a scale bug in the Non Local op. (#1528) +- Fix a bug in transforms when `gt_bboxes_ignore` is None. (#1498) +- Fix a bug when `img_prefix` is None. (#1497) +- Pass the device argument to `grid_anchors` and `valid_flags`. (#1478) +- Fix the data pipeline for test_robustness. (#1476) +- Fix the argument type of deformable pooling. (#1390) +- Fix the coco_eval when there are only two classes. (#1376) +- Fix a bug in Modulated DeformableConv when deformable_group>1. (#1359) +- Fix the mask cropping in RandomCrop. (#1333) +- Fix zero outputs in DeformConv when not running on cuda:0. (#1326) +- Fix the type issue in Expand. (#1288) +- Fix the inference API. (#1255) +- Fix the inplace operation in Expand. (#1249) +- Fix the from-scratch training config. (#1196) +- Fix inplace add in RoIExtractor which cause an error in PyTorch 1.2. (#1160) +- Fix FCOS when input images has no positive sample. (#1136) +- Fix recursive imports. (#1099) + +__Improvements__ + +- Print the config file and mmdet version in the log. (#1721) +- Lint the code before compiling in travis CI. (#1715) +- Add a probability argument for the `Expand` transform. (#1651) +- Update the PyTorch and CUDA version in the docker file. (#1615) +- Raise a warning when specifying `--validate` in non-distributed training. (#1624, #1651) +- Beautify the mAP printing. (#1614) +- Add pre-commit hook. (#1536) +- Add the argument `in_channels` to backbones. (#1475) +- Add lots of docstrings and unit tests, thanks to [@Erotemic](https://github.com/Erotemic). (#1603, #1517, #1506, #1505, #1491, #1479, #1477, #1475, #1474) +- Add support for multi-node distributed test when there is no shared storage. (#1399) +- Optimize Dockerfile to reduce the image size. (#1306) +- Update new results of HRNet. (#1284, #1182) +- Add an argument `no_norm_on_lateral` in FPN. (#1240) +- Test the compiling in CI. (#1235) +- Move docs to a separate folder. (#1233) +- Add a jupyter notebook demo. (#1158) +- Support different type of dataset for training. (#1133) +- Use int64_t instead of long in cuda kernels. (#1131) +- Support unsquare RoIs for bbox and mask heads. (#1128) +- Manually add type promotion to make compatible to PyTorch 1.2. (#1114) +- Allowing validation dataset for computing validation loss. (#1093) +- Use `.scalar_type()` instead of `.type()` to suppress some warnings. (#1070) + +__New Features__ + +- Add an option `--with_ap` to compute the AP for each class. (#1549) +- Implement "FreeAnchor: Learning to Match Anchors for Visual Object Detection". (#1391) +- Support [Albumentations](https://github.com/albumentations-team/albumentations) for augmentations in the data pipeline. (#1354) +- Implement "FoveaBox: Beyond Anchor-based Object Detector". (#1339) +- Support horizontal and vertical flipping. (#1273, #1115) +- Implement "RepPoints: Point Set Representation for Object Detection". (#1265) +- Add test-time augmentation to HTC and Cascade R-CNN. (#1251) +- Add a COCO result analysis tool. (#1228) +- Add Dockerfile. (#1168) +- Add a webcam demo. (#1155, #1150) +- Add FLOPs counter. (#1127) +- Allow arbitrary layer order for ConvModule. (#1078) + +### v1.0rc0 (27/07/2019) + +- Implement lots of new methods and components (Mixed Precision Training, HTC, Libra R-CNN, Guided Anchoring, Empirical Attention, Mask Scoring R-CNN, Grid R-CNN (Plus), GHM, GCNet, FCOS, HRNet, Weight Standardization, etc.). Thank all collaborators! +- Support two additional datasets: WIDER FACE and Cityscapes. +- Refactoring for loss APIs and make it more flexible to adopt different losses and related hyper-parameters. +- Speed up multi-gpu testing. +- Integrate all compiling and installing in a single script. + +### v0.6.0 (14/04/2019) + +- Up to 30% speedup compared to the model zoo. +- Support both PyTorch stable and nightly version. +- Replace NMS and SigmoidFocalLoss with Pytorch CUDA extensions. + +### v0.6rc0(06/02/2019) + +- Migrate to PyTorch 1.0. + +### v0.5.7 (06/02/2019) + +- Add support for Deformable ConvNet v2. (Many thanks to the authors and [@chengdazhi](https://github.com/chengdazhi)) +- This is the last release based on PyTorch 0.4.1. + +### v0.5.6 (17/01/2019) + +- Add support for Group Normalization. +- Unify RPNHead and single stage heads (RetinaHead, SSDHead) with AnchorHead. + +### v0.5.5 (22/12/2018) + +- Add SSD for COCO and PASCAL VOC. +- Add ResNeXt backbones and detection models. +- Refactoring for Samplers/Assigners and add OHEM. +- Add VOC dataset and evaluation scripts. + +### v0.5.4 (27/11/2018) + +- Add SingleStageDetector and RetinaNet. + +### v0.5.3 (26/11/2018) + +- Add Cascade R-CNN and Cascade Mask R-CNN. +- Add support for Soft-NMS in config files. + +### v0.5.2 (21/10/2018) + +- Add support for custom datasets. +- Add a script to convert PASCAL VOC annotations to the expected format. + +### v0.5.1 (20/10/2018) + +- Add BBoxAssigner and BBoxSampler, the `train_cfg` field in config files are restructured. +- `ConvFCRoIHead` / `SharedFCRoIHead` are renamed to `ConvFCBBoxHead` / `SharedFCBBoxHead` for consistency. diff --git a/docs/en/compatibility.md b/docs/en/compatibility.md new file mode 100644 index 0000000..a545a49 --- /dev/null +++ b/docs/en/compatibility.md @@ -0,0 +1,178 @@ +# Compatibility of MMDetection 2.x + +## MMDetection 2.25.0 + +In order to support Mask2Former for instance segmentation, the original config files of Mask2Former for panpotic segmentation need to be renamed [PR #7571](https://github.com/open-mmlab/mmdetection/pull/7571). + + + + + + + + + + + +
before v2.25.0after v2.25.0
+ +``` +'mask2former_xxx_coco.py' represents config files for **panoptic segmentation**. +``` + + + +``` +'mask2former_xxx_coco.py' represents config files for **instance segmentation**. +'mask2former_xxx_coco-panoptic.py' represents config files for **panoptic segmentation**. +``` + +
+ +## MMDetection 2.21.0 + +In order to support CPU training, the logic of scatter in batch collating has been changed. We recommend to use +MMCV v1.4.4 or higher. For more details, please refer to [MMCV PR #1621](https://github.com/open-mmlab/mmcv/pull/1621). + +## MMDetection 2.18.1 + +### MMCV compatibility + +In order to fix the wrong weight reference bug in BaseTransformerLayer, the logic in batch first mode of MultiheadAttention has been changed. +We recommend to use MMCV v1.3.17 or higher. For more details, please refer to [MMCV PR #1418](https://github.com/open-mmlab/mmcv/pull/1418). + +## MMDetection 2.18.0 + +### DIIHead compatibility + +In order to support QueryInst, attn_feats is added into the returned tuple of DIIHead. + +## MMDetection 2.14.0 + +### MMCV Version + +In order to fix the problem that the priority of EvalHook is too low, all hook priorities have been re-adjusted in 1.3.8, so MMDetection 2.14.0 needs to rely on the latest MMCV 1.3.8 version. For related information, please refer to [#1120](https://github.com/open-mmlab/mmcv/pull/1120), for related issues, please refer to [#5343](https://github.com/open-mmlab/mmdetection/issues/5343). + +### SSD compatibility + +In v2.14.0, to make SSD more flexible to use, [PR5291](https://github.com/open-mmlab/mmdetection/pull/5291) refactored its backbone, neck and head. The users can use the script `tools/model_converters/upgrade_ssd_version.py` to convert their models. + +```bash +python tools/model_converters/upgrade_ssd_version.py ${OLD_MODEL_PATH} ${NEW_MODEL_PATH} +``` + +- OLD_MODEL_PATH: the path to load the old version SSD model. +- NEW_MODEL_PATH: the path to save the converted model weights. + +## MMDetection 2.12.0 + +MMDetection is going through big refactoring for more general and convenient usages during the releases from v2.12.0 to v2.18.0 (maybe longer). +In v2.12.0 MMDetection inevitably brings some BC-breakings, including the MMCV dependency, model initialization, model registry, and mask AP evaluation. + +### MMCV Version + +MMDetection v2.12.0 relies on the newest features in MMCV 1.3.3, including `BaseModule` for unified parameter initialization, model registry, and the CUDA operator `MultiScaleDeformableAttn` for [Deformable DETR](https://arxiv.org/abs/2010.04159). Note that MMCV 1.3.2 already contains all the features used by MMDet but has known issues. Therefore, we recommend users to skip MMCV v1.3.2 and use v1.3.2, though v1.3.2 might work for most of the cases. + +### Unified model initialization + +To unify the parameter initialization in OpenMMLab projects, MMCV supports `BaseModule` that accepts `init_cfg` to allow the modules' parameters initialized in a flexible and unified manner. Now the users need to explicitly call `model.init_weights()` in the training script to initialize the model (as in [here](https://github.com/open-mmlab/mmdetection/blob/master/tools/train.py#L162), previously this was handled by the detector. **The downstream projects must update their model initialization accordingly to use MMDetection v2.12.0**. Please refer to PR #4750 for details. + +### Unified model registry + +To easily use backbones implemented in other OpenMMLab projects, MMDetection v2.12.0 inherits the model registry created in MMCV (#760). In this way, as long as the backbone is supported in an OpenMMLab project and that project also uses the registry in MMCV, users can use that backbone in MMDetection by simply modifying the config without copying the code of that backbone into MMDetection. Please refer to PR #5059 for more details. + +### Mask AP evaluation + +Before [PR 4898](https://github.com/open-mmlab/mmdetection/pull/4898) and V2.12.0, the mask AP of small, medium, and large instances is calculated based on the bounding box area rather than the real mask area. This leads to higher `APs` and `APm` but lower `APl` but will not affect the overall mask AP. [PR 4898](https://github.com/open-mmlab/mmdetection/pull/4898) change it to use mask areas by deleting `bbox` in mask AP calculation. +The new calculation does not affect the overall mask AP evaluation and is consistent with [Detectron2](https://github.com/facebookresearch/detectron2/). + +## Compatibility with MMDetection 1.x + +MMDetection 2.0 goes through a big refactoring and addresses many legacy issues. It is not compatible with the 1.x version, i.e., running inference with the same model weights in these two versions will produce different results. Thus, MMDetection 2.0 re-benchmarks all the models and provides their links and logs in the model zoo. + +The major differences are in four folds: coordinate system, codebase conventions, training hyperparameters, and modular design. + +### Coordinate System + +The new coordinate system is consistent with [Detectron2](https://github.com/facebookresearch/detectron2/) and treats the center of the most left-top pixel as (0, 0) rather than the left-top corner of that pixel. +Accordingly, the system interprets the coordinates in COCO bounding box and segmentation annotations as coordinates in range `[0, width]` or `[0, height]`. +This modification affects all the computation related to the bbox and pixel selection, +which is more natural and accurate. + +- The height and width of a box with corners (x1, y1) and (x2, y2) in the new coordinate system is computed as `width = x2 - x1` and `height = y2 - y1`. + In MMDetection 1.x and previous version, a "+ 1" was added both height and width. + This modification are in three folds: + + 1. Box transformation and encoding/decoding in regression. + 2. IoU calculation. This affects the matching process between ground truth and bounding box and the NMS process. The effect to compatibility is very negligible, though. + 3. The corners of bounding box is in float type and no longer quantized. This should provide more accurate bounding box results. This also makes the bounding box and RoIs not required to have minimum size of 1, whose effect is small, though. + +- The anchors are center-aligned to feature grid points and in float type. + In MMDetection 1.x and previous version, the anchors are in `int` type and not center-aligned. + This affects the anchor generation in RPN and all the anchor-based methods. + +- ROIAlign is better aligned with the image coordinate system. The new implementation is adopted from [Detectron2](https://github.com/facebookresearch/detectron2/tree/master/detectron2/layers/csrc/ROIAlign). + The RoIs are shifted by half a pixel by default when they are used to cropping RoI features, compared to MMDetection 1.x. + The old behavior is still available by setting `aligned=False` instead of `aligned=True`. + +- Mask cropping and pasting are more accurate. + + 1. We use the new RoIAlign to crop mask targets. In MMDetection 1.x, the bounding box is quantized before it is used to crop mask target, and the crop process is implemented by numpy. In new implementation, the bounding box for crop is not quantized and sent to RoIAlign. This implementation accelerates the training speed by a large margin (~0.1s per iter, ~2 hour when training Mask R50 for 1x schedule) and should be more accurate. + + 2. In MMDetection 2.0, the "`paste_mask()`" function is different and should be more accurate than those in previous versions. This change follows the modification in [Detectron2](https://github.com/facebookresearch/detectron2/blob/master/detectron2/structures/masks.py) and can improve mask AP on COCO by ~0.5% absolute. + +### Codebase Conventions + +- MMDetection 2.0 changes the order of class labels to reduce unused parameters in regression and mask branch more naturally (without +1 and -1). + This effect all the classification layers of the model to have a different ordering of class labels. The final layers of regression branch and mask head no longer keep K+1 channels for K categories, and their class orders are consistent with the classification branch. + + - In MMDetection 2.0, label "K" means background, and labels \[0, K-1\] correspond to the K = num_categories object categories. + + - In MMDetection 1.x and previous version, label "0" means background, and labels \[1, K\] correspond to the K categories. + + - **Note**: The class order of softmax RPN is still the same as that in 1.x in versions\<=2.4.0 while sigmoid RPN is not affected. The class orders in all heads are unified since MMDetection v2.5.0. + +- Low quality matching in R-CNN is not used. In MMDetection 1.x and previous versions, the `max_iou_assigner` will match low quality boxes for each ground truth box in both RPN and R-CNN training. We observe this sometimes does not assign the most perfect GT box to some bounding boxes, + thus MMDetection 2.0 do not allow low quality matching by default in R-CNN training in the new system. This sometimes may slightly improve the box AP (~0.1% absolute). + +- Separate scale factors for width and height. In MMDetection 1.x and previous versions, the scale factor is a single float in mode `keep_ratio=True`. This is slightly inaccurate because the scale factors for width and height have slight difference. MMDetection 2.0 adopts separate scale factors for width and height, the improvement on AP ~0.1% absolute. + +- Configs name conventions are changed. MMDetection V2.0 adopts the new name convention to maintain the gradually growing model zoo as the following: + + ```shell + [model]_(model setting)_[backbone]_[neck]_(norm setting)_(misc)_(gpu x batch)_[schedule]_[dataset].py, + ``` + + where the (`misc`) includes DCN and GCBlock, etc. More details are illustrated in the [documentation for config](tutorials/config) + +- MMDetection V2.0 uses new ResNet Caffe backbones to reduce warnings when loading pre-trained models. Most of the new backbones' weights are the same as the former ones but do not have `conv.bias`, except that they use a different `img_norm_cfg`. Thus, the new backbone will not cause warning of unexpected keys. + +### Training Hyperparameters + +The change in training hyperparameters does not affect +model-level compatibility but slightly improves the performance. The major ones are: + +- The number of proposals after nms is changed from 2000 to 1000 by setting `nms_post=1000` and `max_num=1000`. + This slightly improves both mask AP and bbox AP by ~0.2% absolute. + +- The default box regression losses for Mask R-CNN, Faster R-CNN and RetinaNet are changed from smooth L1 Loss to L1 loss. This leads to an overall improvement in box AP (~0.6% absolute). However, using L1-loss for other methods such as Cascade R-CNN and HTC does not improve the performance, so we keep the original settings for these methods. + +- The sample num of RoIAlign layer is set to be 0 for simplicity. This leads to slightly improvement on mask AP (~0.2% absolute). + +- The default setting does not use gradient clipping anymore during training for faster training speed. This does not degrade performance of the most of models. For some models such as RepPoints we keep using gradient clipping to stabilize the training process and to obtain better performance. + +- The default warmup ratio is changed from 1/3 to 0.001 for a more smooth warming up process since the gradient clipping is usually not used. The effect is found negligible during our re-benchmarking, though. + +### Upgrade Models from 1.x to 2.0 + +To convert the models trained by MMDetection V1.x to MMDetection V2.0, the users can use the script `tools/model_converters/upgrade_model_version.py` to convert +their models. The converted models can be run in MMDetection V2.0 with slightly dropped performance (less than 1% AP absolute). +Details can be found in `configs/legacy`. + +## pycocotools compatibility + +`mmpycocotools` is the OpenMMlab's fork of official `pycocotools`, which works for both MMDetection and Detectron2. +Before [PR 4939](https://github.com/open-mmlab/mmdetection/pull/4939), since `pycocotools` and `mmpycocotool` have the same package name, if users already installed `pycocotools` (installed Detectron2 first under the same environment), then the setup of MMDetection will skip installing `mmpycocotool`. Thus MMDetection fails due to the missing `mmpycocotools`. +If MMDetection is installed before Detectron2, they could work under the same environment. +[PR 4939](https://github.com/open-mmlab/mmdetection/pull/4939) deprecates mmpycocotools in favor of official pycocotools. +Users may install MMDetection and Detectron2 under the same environment after [PR 4939](https://github.com/open-mmlab/mmdetection/pull/4939), no matter what the installation order is. diff --git a/docs/en/conf.py b/docs/en/conf.py new file mode 100644 index 0000000..e902e3f --- /dev/null +++ b/docs/en/conf.py @@ -0,0 +1,116 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import subprocess +import sys + +import pytorch_sphinx_theme + +sys.path.insert(0, os.path.abspath('../..')) + +# -- Project information ----------------------------------------------------- + +project = 'MMDetection' +copyright = '2018-2021, OpenMMLab' +author = 'MMDetection Authors' +version_file = '../../mmdet/version.py' + + +def get_version(): + with open(version_file, 'r') as f: + exec(compile(f.read(), version_file, 'exec')) + return locals()['__version__'] + + +# The full version, including alpha/beta/rc tags +release = get_version() + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.napoleon', + 'sphinx.ext.viewcode', + 'myst_parser', + 'sphinx_markdown_tables', + 'sphinx_copybutton', +] + +myst_enable_extensions = ['colon_fence'] +myst_heading_anchors = 3 + +autodoc_mock_imports = [ + 'matplotlib', 'pycocotools', 'terminaltables', 'mmdet.version', 'mmcv.ops' +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +source_suffix = { + '.rst': 'restructuredtext', + '.md': 'markdown', +} + +# The master toctree document. +master_doc = 'index' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +# html_theme = 'sphinx_rtd_theme' +html_theme = 'pytorch_sphinx_theme' +html_theme_path = [pytorch_sphinx_theme.get_html_theme_path()] + +html_theme_options = { + 'menu': [ + { + 'name': 'GitHub', + 'url': 'https://github.com/open-mmlab/mmdetection' + }, + ], + # Specify the language of shared menu + 'menu_lang': + 'en' +} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] +html_css_files = ['css/readthedocs.css'] + +# -- Extension configuration ------------------------------------------------- +# Ignore >>> when copying code +copybutton_prompt_text = r'>>> |\.\.\. ' +copybutton_prompt_is_regexp = True + + +def builder_inited_handler(app): + subprocess.run(['./stat.py']) + + +def setup(app): + app.connect('builder-inited', builder_inited_handler) diff --git a/docs/en/conventions.md b/docs/en/conventions.md new file mode 100644 index 0000000..97e5fd0 --- /dev/null +++ b/docs/en/conventions.md @@ -0,0 +1,78 @@ +# Conventions + +Please check the following conventions if you would like to modify MMDetection as your own project. + +## Loss + +In MMDetection, a `dict` containing losses and metrics will be returned by `model(**data)`. + +For example, in bbox head, + +```python +class BBoxHead(nn.Module): + ... + def loss(self, ...): + losses = dict() + # classification loss + losses['loss_cls'] = self.loss_cls(...) + # classification accuracy + losses['acc'] = accuracy(...) + # bbox regression loss + losses['loss_bbox'] = self.loss_bbox(...) + return losses +``` + +`bbox_head.loss()` will be called during model forward. +The returned dict contains `'loss_bbox'`, `'loss_cls'`, `'acc'` . +Only `'loss_bbox'`, `'loss_cls'` will be used during back propagation, +`'acc'` will only be used as a metric to monitor training process. + +By default, only values whose keys contain `'loss'` will be back propagated. +This behavior could be changed by modifying `BaseDetector.train_step()`. + +## Empty Proposals + +In MMDetection, We have added special handling and unit test for empty proposals of two-stage. We need to deal with the empty proposals of the entire batch and single image at the same time. For example, in CascadeRoIHead, + +```python +# simple_test method +... +# There is no proposal in the whole batch +if rois.shape[0] == 0: + bbox_results = [[ + np.zeros((0, 5), dtype=np.float32) + for _ in range(self.bbox_head[-1].num_classes) + ]] * num_imgs + if self.with_mask: + mask_classes = self.mask_head[-1].num_classes + segm_results = [[[] for _ in range(mask_classes)] + for _ in range(num_imgs)] + results = list(zip(bbox_results, segm_results)) + else: + results = bbox_results + return results +... + +# There is no proposal in the single image +for i in range(self.num_stages): + ... + if i < self.num_stages - 1: + for j in range(num_imgs): + # Handle empty proposal + if rois[j].shape[0] > 0: + bbox_label = cls_score[j][:, :-1].argmax(dim=1) + refine_roi = self.bbox_head[i].regress_by_class( + rois[j], bbox_label, bbox_pred[j], img_metas[j]) + refine_roi_list.append(refine_roi) +``` + +If you have customized `RoIHead`, you can refer to the above method to deal with empty proposals. + +## Coco Panoptic Dataset + +In MMDetection, we have supported COCO Panoptic dataset. We clarify a few conventions about the implementation of `CocoPanopticDataset` here. + +1. For mmdet\<=2.16.0, the range of foreground and background labels in semantic segmentation are different from the default setting of MMDetection. The label `0` stands for `VOID` label and the category labels start from `1`. + Since mmdet=2.17.0, the category labels of semantic segmentation start from `0` and label `255` stands for `VOID` for consistency with labels of bounding boxes. + To achieve that, the `Pad` pipeline supports setting the padding value for `seg`. +2. In the evaluation, the panoptic result is a map with the same shape as the original image. Each value in the result map has the format of `instance_id * INSTANCE_OFFSET + category_id`. diff --git a/docs/en/device/npu.md b/docs/en/device/npu.md new file mode 100644 index 0000000..b0129b7 --- /dev/null +++ b/docs/en/device/npu.md @@ -0,0 +1,55 @@ +# NPU (HUAWEI Ascend) + +## Usage + +Please refer to the [building documentation of MMCV](https://mmcv.readthedocs.io/en/latest/get_started/build.html#build-mmcv-full-on-ascend-npu-machine) to install MMCV on NPU devices + +Here we use 8 NPUs on your computer to train the model with the following command: + +```shell +bash tools/dist_train.sh configs/ssd/ssd300_coco.py 8 +``` + +Also, you can use only one NPU to train the model with the following command: + +```shell +python tools/train.py configs/ssd/ssd300_coco.py +``` + +## Models Results + +| Model | box AP | mask AP | Config | Download | +| :------------------: | :----: | :-----: | :---------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------- | +| [ssd300](<>) | 25.6 | --- | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/ssd/ssd300_fp16_coco.py) | [log](https://download.openmmlab.com/mmdetection/v2.0/npu/ssd300_coco.log.json) | +| [ssd512](<>) | 29.4 | --- | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/ssd/ssd512_fp16_coco.py) | [log](https://download.openmmlab.com/mmdetection/v2.0/npu/ssd512_coco.log.json) | +| [ssdlite-mbv2\*](<>) | 20.2 | --- | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco.py) | [log](https://download.openmmlab.com/mmdetection/v2.0/npu/ssdlite_mobilenetv2_scratch_600e_coco.log.json) | +| [retinanet-r18](<>) | 31.8 | --- | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/retinanet/retinanet_r18_fpn_1x8_1x_coco.py) | [log](https://download.openmmlab.com/mmdetection/v2.0/npu/retinanet_r18_fpn_1x8_1x_coco.log.json) | +| [retinanet-r50](<>) | 36.6 | --- | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/retinanet/retinanet_r50_fpn_fp16_1x_coco.py) | [log](https://download.openmmlab.com/mmdetection/v2.0/npu/retinanet_r50_fpn_1x_coco.log.json) | +| [yolov3-608](<>) | 34.7 | --- | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/yolo/yolov3_d53_fp16_mstrain-608_273e_coco.py) | [log](https://download.openmmlab.com/mmdetection/v2.0/npu/yolov3_d53_fp16_mstrain-608_273e_coco.log.json) | +| [yolox-s\*\*](<>) | 39.9 | --- | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/yolox/yolox_s_8x8_300e_coco.py) | [log](https://download.openmmlab.com/mmdetection/v2.0/npu/yolox_s_8x8_300e_coco.log.json) | +| [centernet-r18](<>) | 26.1 | --- | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/centernet/centernet_resnet18_140e_cocoo.py) | [log](https://download.openmmlab.com/mmdetection/v2.0/npu/centernet_resnet18_140e_coco.log.jsonn) | +| [fcos-r50\*](<>) | 36.1 | --- | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/fcos/fcos_r50_caffe_fpn_gn-head_fp16_1x_bs8x8_coco.py) | [log](https://download.openmmlab.com/mmdetection/v2.0/npu/fcos_r50_caffe_fpn_gn-head_1x_coco_bs8x8.log.json) | +| [solov2-r50](<>) | --- | 34.7 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/solov2/solov2_r50_fpn_1x_coco.py) | [log](https://download.openmmlab.com/mmdetection/v2.0/npu/solov2_r50_fpn_1x_coco.log.json) | + +**Notes:** + +- If not specially marked, the results on NPU are the same as those on the GPU with FP32. +- (\*) The results on the NPU of these models are aligned with the results of the mixed-precision training on the GPU, + but are lower than the results of the FP32. This situation is mainly related to the phase of the model itself in + mixed-precision training, users may need to adjust the hyperparameters to achieve better results. +- (\*\*) The accuracy of yolox-s on the GPU in mixed precision is 40.1, with `persister_woker=True` in the data loader config by default. + There are currently some bugs on NPUs that prevent the last few epochs from running, but the accuracy is less affected and the difference can be ignored. + +## High-performance Model Result on Ascend Device + +Introduction to optimization: + +1. Modify the loop calculation as a whole batch calculation to reduce the number of instructions issued. +2. Modify the index calculation to mask calculation, because the SIMD architecture is good at processing continuous data calculation. + +| Model | Config | v100 iter time | 910A iter time | +| :------------------------: | :-----------------------------------------------------------------------------------------------------------------------: | :------------: | :------------------------: | +| [ascend-ssd300](<>) | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/ssd/ascend_ssd300_fp16_coco.py) | 0.165s/iter | 0.383s/iter -> 0.13s/iter | +| [ascend-retinanet-r18](<>) | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/retinanet/ascend_retinanet_r18_fpn_1x8_1x_coco.py) | 0.567s/iter | 0.780s/iter -> 0.420s/iter | + +**All above models are provided by Huawei Ascend group.** diff --git a/docs/en/faq.md b/docs/en/faq.md new file mode 100644 index 0000000..b8afefc --- /dev/null +++ b/docs/en/faq.md @@ -0,0 +1,240 @@ +# Frequently Asked Questions + +We list some common troubles faced by many users and their corresponding solutions here. Feel free to enrich the list if you find any frequent issues and have ways to help others to solve them. If the contents here do not cover your issue, please create an issue using the [provided templates](https://github.com/open-mmlab/mmdetection/blob/master/.github/ISSUE_TEMPLATE/error-report.md/) and make sure you fill in all required information in the template. + +## Installation + +- Compatibility issue between MMCV and MMDetection; "ConvWS is already registered in conv layer"; "AssertionError: MMCV==xxx is used but incompatible. Please install mmcv>=xxx, \<=xxx." + + Compatible MMDetection and MMCV versions are shown as below. Please choose the correct version of MMCV to avoid installation issues. + +| MMDetection version | MMCV version | +| :-----------------: | :------------------------: | +| master | mmcv-full>=1.3.17, \<1.8.0 | +| 2.28.2 | mmcv-full>=1.3.17, \<1.8.0 | +| 2.28.1 | mmcv-full>=1.3.17, \<1.8.0 | +| 2.28.0 | mmcv-full>=1.3.17, \<1.8.0 | +| 2.27.0 | mmcv-full>=1.3.17, \<1.8.0 | +| 2.26.0 | mmcv-full>=1.3.17, \<1.8.0 | +| 2.25.3 | mmcv-full>=1.3.17, \<1.7.0 | +| 2.25.2 | mmcv-full>=1.3.17, \<1.7.0 | +| 2.25.1 | mmcv-full>=1.3.17, \<1.6.0 | +| 2.25.0 | mmcv-full>=1.3.17, \<1.6.0 | +| 2.24.1 | mmcv-full>=1.3.17, \<1.6.0 | +| 2.24.0 | mmcv-full>=1.3.17, \<1.6.0 | +| 2.23.0 | mmcv-full>=1.3.17, \<1.5.0 | +| 2.22.0 | mmcv-full>=1.3.17, \<1.5.0 | +| 2.21.0 | mmcv-full>=1.3.17, \<1.5.0 | +| 2.20.0 | mmcv-full>=1.3.17, \<1.5.0 | +| 2.19.1 | mmcv-full>=1.3.17, \<1.5.0 | +| 2.19.0 | mmcv-full>=1.3.17, \<1.5.0 | +| 2.18.0 | mmcv-full>=1.3.17, \<1.4.0 | +| 2.17.0 | mmcv-full>=1.3.14, \<1.4.0 | +| 2.16.0 | mmcv-full>=1.3.8, \<1.4.0 | +| 2.15.1 | mmcv-full>=1.3.8, \<1.4.0 | +| 2.15.0 | mmcv-full>=1.3.8, \<1.4.0 | +| 2.14.0 | mmcv-full>=1.3.8, \<1.4.0 | +| 2.13.0 | mmcv-full>=1.3.3, \<1.4.0 | +| 2.12.0 | mmcv-full>=1.3.3, \<1.4.0 | +| 2.11.0 | mmcv-full>=1.2.4, \<1.4.0 | +| 2.10.0 | mmcv-full>=1.2.4, \<1.4.0 | +| 2.9.0 | mmcv-full>=1.2.4, \<1.4.0 | +| 2.8.0 | mmcv-full>=1.2.4, \<1.4.0 | +| 2.7.0 | mmcv-full>=1.1.5, \<1.4.0 | +| 2.6.0 | mmcv-full>=1.1.5, \<1.4.0 | +| 2.5.0 | mmcv-full>=1.1.5, \<1.4.0 | +| 2.4.0 | mmcv-full>=1.1.1, \<1.4.0 | +| 2.3.0 | mmcv-full==1.0.5 | +| 2.3.0rc0 | mmcv-full>=1.0.2 | +| 2.2.1 | mmcv==0.6.2 | +| 2.2.0 | mmcv==0.6.2 | +| 2.1.0 | mmcv>=0.5.9, \<=0.6.1 | +| 2.0.0 | mmcv>=0.5.1, \<=0.5.8 | + +- "No module named 'mmcv.ops'"; "No module named 'mmcv.\_ext'". + + 1. Uninstall existing mmcv in the environment using `pip uninstall mmcv`. + 2. Install mmcv-full following the [installation instruction](get_started#best-practices). + +- Using albumentations + + If you would like to use `albumentations`, we suggest using `pip install -r requirements/albu.txt` or + `pip install -U albumentations --no-binary qudida,albumentations`. + If you simply use `pip install albumentations>=0.3.2`, it will install `opencv-python-headless` simultaneously (even though you have already installed `opencv-python`). + Please refer to the [official documentation](https://albumentations.ai/docs/getting_started/installation/#note-on-opencv-dependencies) for details. + +- ModuleNotFoundError is raised when using some algorithms + + Some extra dependencies are required for Instaboost, Panoptic Segmentation, LVIS dataset, etc. Please note the error message and install corresponding packages, e.g., + + ```shell + # for instaboost + pip install instaboostfast + # for panoptic segmentation + pip install git+https://github.com/cocodataset/panopticapi.git + # for LVIS dataset + pip install git+https://github.com/lvis-dataset/lvis-api.git + ``` + +## Coding + +- Do I need to reinstall mmdet after some code modifications + + If you follow the best practice and install mmdet with `pip install -e .`, any local modifications made to the code will take effect without reinstallation. + +- How to develop with multiple MMDetection versions + + You can have multiple folders like mmdet-2.21, mmdet-2.22. + When you run the train or test script, it will adopt the mmdet package in the current folder. + + To use the default MMDetection installed in the environment rather than the one you are working with, you can remove the following line in those scripts: + + ```shell + PYTHONPATH="$(dirname $0)/..":$PYTHONPATH + ``` + +## PyTorch/CUDA Environment + +- "RTX 30 series card fails when building MMCV or MMDet" + + 1. Temporary work-around: do `MMCV_WITH_OPS=1 MMCV_CUDA_ARGS='-gencode=arch=compute_80,code=sm_80' pip install -e .`. + The common issue is `nvcc fatal : Unsupported gpu architecture 'compute_86'`. This means that the compiler should optimize for sm_86, i.e., nvidia 30 series card, but such optimizations have not been supported by CUDA toolkit 11.0. + This work-around modifies the compile flag by adding `MMCV_CUDA_ARGS='-gencode=arch=compute_80,code=sm_80'`, which tells `nvcc` to optimize for **sm_80**, i.e., Nvidia A100. Although A100 is different from the 30 series card, they use similar ampere architecture. This may hurt the performance but it works. + 2. PyTorch developers have updated that the default compiler flags should be fixed by [pytorch/pytorch#47585](https://github.com/pytorch/pytorch/pull/47585). So using PyTorch-nightly may also be able to solve the problem, though we have not tested it yet. + +- "invalid device function" or "no kernel image is available for execution". + + 1. Check if your cuda runtime version (under `/usr/local/`), `nvcc --version` and `conda list cudatoolkit` version match. + 2. Run `python mmdet/utils/collect_env.py` to check whether PyTorch, torchvision, and MMCV are built for the correct GPU architecture. + You may need to set `TORCH_CUDA_ARCH_LIST` to reinstall MMCV. + The GPU arch table could be found [here](https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#gpu-feature-list), + i.e. run `TORCH_CUDA_ARCH_LIST=7.0 pip install mmcv-full` to build MMCV for Volta GPUs. + The compatibility issue could happen when using old GPUS, e.g., Tesla K80 (3.7) on colab. + 3. Check whether the running environment is the same as that when mmcv/mmdet has compiled. + For example, you may compile mmcv using CUDA 10.0 but run it on CUDA 9.0 environments. + +- "undefined symbol" or "cannot open xxx.so". + + 1. If those symbols are CUDA/C++ symbols (e.g., libcudart.so or GLIBCXX), check whether the CUDA/GCC runtimes are the same as those used for compiling mmcv, + i.e. run `python mmdet/utils/collect_env.py` to see if `"MMCV Compiler"`/`"MMCV CUDA Compiler"` is the same as `"GCC"`/`"CUDA_HOME"`. + 2. If those symbols are PyTorch symbols (e.g., symbols containing caffe, aten, and TH), check whether the PyTorch version is the same as that used for compiling mmcv. + 3. Run `python mmdet/utils/collect_env.py` to check whether PyTorch, torchvision, and MMCV are built by and running on the same environment. + +- setuptools.sandbox.UnpickleableException: DistutilsSetupError("each element of 'ext_modules' option must be an Extension instance or 2-tuple") + + 1. If you are using miniconda rather than anaconda, check whether Cython is installed as indicated in [#3379](https://github.com/open-mmlab/mmdetection/issues/3379). + You need to manually install Cython first and then run command `pip install -r requirements.txt`. + 2. You may also need to check the compatibility between the `setuptools`, `Cython`, and `PyTorch` in your environment. + +- "Segmentation fault". + + 1. Check you GCC version and use GCC 5.4. This usually caused by the incompatibility between PyTorch and the environment (e.g., GCC \< 4.9 for PyTorch). We also recommend the users to avoid using GCC 5.5 because many feedbacks report that GCC 5.5 will cause "segmentation fault" and simply changing it to GCC 5.4 could solve the problem. + + 2. Check whether PyTorch is correctly installed and could use CUDA op, e.g. type the following command in your terminal. + + ```shell + python -c 'import torch; print(torch.cuda.is_available())' + ``` + + And see whether they could correctly output results. + + 3. If Pytorch is correctly installed, check whether MMCV is correctly installed. + + ```shell + python -c 'import mmcv; import mmcv.ops' + ``` + + If MMCV is correctly installed, then there will be no issue of the above two commands. + + 4. If MMCV and Pytorch is correctly installed, you man use `ipdb`, `pdb` to set breakpoints or directly add 'print' in mmdetection code and see which part leads the segmentation fault. + +## Training + +- "Loss goes Nan" + + 1. Check if the dataset annotations are valid: zero-size bounding boxes will cause the regression loss to be Nan due to the commonly used transformation for box regression. Some small size (width or height are smaller than 1) boxes will also cause this problem after data augmentation (e.g., instaboost). So check the data and try to filter out those zero-size boxes and skip some risky augmentations on the small-size boxes when you face the problem. + 2. Reduce the learning rate: the learning rate might be too large due to some reasons, e.g., change of batch size. You can rescale them to the value that could stably train the model. + 3. Extend the warmup iterations: some models are sensitive to the learning rate at the start of the training. You can extend the warmup iterations, e.g., change the `warmup_iters` from 500 to 1000 or 2000. + 4. Add gradient clipping: some models requires gradient clipping to stabilize the training process. The default of `grad_clip` is `None`, you can add gradient clippint to avoid gradients that are too large, i.e., set `optimizer_config=dict(_delete_=True, grad_clip=dict(max_norm=35, norm_type=2))` in your config file. If your config does not inherits from any basic config that contains `optimizer_config=dict(grad_clip=None)`, you can simply add `optimizer_config=dict(grad_clip=dict(max_norm=35, norm_type=2))`. + +- "GPU out of memory" + + 1. There are some scenarios when there are large amount of ground truth boxes, which may cause OOM during target assignment. You can set `gpu_assign_thr=N` in the config of assigner thus the assigner will calculate box overlaps through CPU when there are more than N GT boxes. + + 2. Set `with_cp=True` in the backbone. This uses the sublinear strategy in PyTorch to reduce GPU memory cost in the backbone. + + 3. Try mixed precision training using following the examples in `config/fp16`. The `loss_scale` might need further tuning for different models. + + 4. Try to use `AvoidCUDAOOM` to avoid GPU out of memory. It will first retry after calling `torch.cuda.empty_cache()`. If it still fails, it will then retry by converting the type of inputs to FP16 format. If it still fails, it will try to copy inputs from GPUs to CPUs to continue computing. Try AvoidOOM in you code to make the code continue to run when GPU memory runs out: + + ```python + from mmdet.utils import AvoidCUDAOOM + + output = AvoidCUDAOOM.retry_if_cuda_oom(some_function)(input1, input2) + ``` + + You can also try `AvoidCUDAOOM` as a decorator to make the code continue to run when GPU memory runs out: + + ```python + from mmdet.utils import AvoidCUDAOOM + + @AvoidCUDAOOM.retry_if_cuda_oom + def function(*args, **kwargs): + ... + return xxx + ``` + +- "RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one" + + 1. This error indicates that your module has parameters that were not used in producing loss. This phenomenon may be caused by running different branches in your code in DDP mode. + 2. You can set `find_unused_parameters = True` in the config to solve the above problems(but this will slow down the training speed. + 3. If the version of your MMCV >= 1.4.1, you can get the name of those unused parameters with `detect_anomalous_params=True` in `optimizer_config` of config. + +- Save the best model + + It can be turned on by configuring `evaluation = dict(save_best=‘auto’)`. In the case of the `auto` parameter, the first key in the returned evaluation result will be used as the basis for selecting the best model. You can also directly set the key in the evaluation result to manually set it, for example, `evaluation = dict(save_best='mAP' )`. + +- Resume training with `ExpMomentumEMAHook` + + If you use `ExpMomentumEMAHook` in training, you can't just use command line parameters `--resume-from` nor `--cfg-options resume_from` to restore model parameters during resume, i.e., the command `python tools/train.py configs/yolox/yolox_s_8x8_300e_coco.py --resume-from ./work_dir/yolox_s_8x8_300e_coco/epoch_x.pth` will not work. Since `ExpMomentumEMAHook` needs to reload the weights, taking the `yolox_s` algorithm as an example, you should modify the values of `resume_from` in two places of the config as below: + + ```python + # Open configs/yolox/yolox_s_8x8_300e_coco.py directly and modify all resume_from fields + resume_from=./work_dir/yolox_s_8x8_300e_coco/epoch_x.pth + custom_hooks=[... + dict( + type='ExpMomentumEMAHook', + resume_from=./work_dir/yolox_s_8x8_300e_coco/epoch_x.pth, + momentum=0.0001, + priority=49) + ] + ``` + +## Evaluation + +- COCO Dataset, AP or AR = -1 + 1. According to the definition of COCO dataset, the small and medium areas in an image are less than 1024 (32\*32), 9216 (96\*96), respectively. + 2. If the corresponding area has no object, the result of AP and AR will set to -1. + +## Model + +- `style` in ResNet + + The `style` parameter in ResNet allows either `pytorch` or `caffe` style. It indicates the difference in the Bottleneck module. Bottleneck is a stacking structure of `1x1-3x3-1x1` convolutional layers. In the case of `caffe` mode, the convolution layer with `stride=2` is the first `1x1` convolution, while in `pyorch` mode, it is the second `3x3` convolution has `stride=2`. A sample code is as below: + + ```python + if self.style == 'pytorch': + self.conv1_stride = 1 + self.conv2_stride = stride + else: + self.conv1_stride = stride + self.conv2_stride = 1 + ``` + +- ResNeXt parameter description + + ResNeXt comes from the paper [`Aggregated Residual Transformations for Deep Neural Networks`](https://arxiv.org/abs/1611.05431). It introduces group and uses “cardinality” to control the number of groups to achieve a balance between accuracy and complexity. It controls the basic width and grouping parameters of the internal Bottleneck module through two hyperparameters `baseWidth` and `cardinality`. An example configuration name in MMDetection is `mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco.py`, where `mask_rcnn` represents the algorithm using Mask R-CNN, `x101` represents the backbone network using ResNeXt-101, and `64x4d` represents that the bottleneck block has 64 group and each group has basic width of 4. + +- `norm_eval` in backbone + + Since the detection model is usually large and the input image resolution is high, this will result in a small batch of the detection model, which will make the variance of the statistics calculated by BatchNorm during the training process very large and not as stable as the statistics obtained during the pre-training of the backbone network . Therefore, the `norm_eval=True` mode is generally used in training, and the BatchNorm statistics in the pre-trained backbone network are directly used. The few algorithms that use large batches are the `norm_eval=False` mode, such as NASFPN. For the backbone network without ImageNet pre-training and the batch is relatively small, you can consider using `SyncBN`. diff --git a/docs/en/get_started.md b/docs/en/get_started.md new file mode 100644 index 0000000..b7c6066 --- /dev/null +++ b/docs/en/get_started.md @@ -0,0 +1,208 @@ +# Prerequisites + +In this section we demonstrate how to prepare an environment with PyTorch. + +MMDetection works on Linux, Windows and macOS. It requires Python 3.7+, CUDA 9.2+ and PyTorch 1.5+. + +```{note} +If you are experienced with PyTorch and have already installed it, just skip this part and jump to the [next section](#installation). Otherwise, you can follow these steps for the preparation. +``` + +**Step 0.** Download and install Miniconda from the [official website](https://docs.conda.io/en/latest/miniconda.html). + +**Step 1.** Create a conda environment and activate it. + +```shell +conda create --name openmmlab python=3.8 -y +conda activate openmmlab +``` + +**Step 2.** Install PyTorch following [official instructions](https://pytorch.org/get-started/locally/), e.g. + +On GPU platforms: + +```shell +conda install pytorch torchvision -c pytorch +``` + +On CPU platforms: + +```shell +conda install pytorch torchvision cpuonly -c pytorch +``` + +# Installation + +We recommend that users follow our best practices to install MMDetection. However, the whole process is highly customizable. See [Customize Installation](#customize-installation) section for more information. + +## Best Practices + +**Step 0.** Install [MMCV](https://github.com/open-mmlab/mmcv) using [MIM](https://github.com/open-mmlab/mim). + +```shell +pip install -U openmim +mim install mmcv-full +``` + +**Step 1.** Install MMDetection. + +Case a: If you develop and run mmdet directly, install it from source: + +```shell +git clone https://github.com/open-mmlab/mmdetection.git +cd mmdetection +pip install -v -e . +# "-v" means verbose, or more output +# "-e" means installing a project in editable mode, +# thus any local modifications made to the code will take effect without reinstallation. +``` + +Case b: If you use mmdet as a dependency or third-party package, install it with pip: + +```shell +pip install mmdet +``` + +## Verify the installation + +To verify whether MMDetection is installed correctly, we provide some sample codes to run an inference demo. + +**Step 1.** We need to download config and checkpoint files. + +```shell +mim download mmdet --config yolov3_mobilenetv2_320_300e_coco --dest . +``` + +The downloading will take several seconds or more, depending on your network environment. When it is done, you will find two files `yolov3_mobilenetv2_320_300e_coco.py` and `yolov3_mobilenetv2_320_300e_coco_20210719_215349-d18dff72.pth` in your current folder. + +**Step 2.** Verify the inference demo. + +Option (a). If you install mmdetection from source, just run the following command. + +```shell +python demo/image_demo.py demo/demo.jpg yolov3_mobilenetv2_320_300e_coco.py yolov3_mobilenetv2_320_300e_coco_20210719_215349-d18dff72.pth --device cpu --out-file result.jpg +``` + +You will see a new image `result.jpg` on your current folder, where bounding boxes are plotted on cars, benches, etc. + +Option (b). If you install mmdetection with pip, open you python interpreter and copy&paste the following codes. + +```python +from mmdet.apis import init_detector, inference_detector + +config_file = 'yolov3_mobilenetv2_320_300e_coco.py' +checkpoint_file = 'yolov3_mobilenetv2_320_300e_coco_20210719_215349-d18dff72.pth' +model = init_detector(config_file, checkpoint_file, device='cpu') # or device='cuda:0' +inference_detector(model, 'demo/demo.jpg') +``` + +You will see a list of arrays printed, indicating the detected bounding boxes. + +## Customize Installation + +### CUDA versions + +When installing PyTorch, you need to specify the version of CUDA. If you are not clear on which to choose, follow our recommendations: + +- For Ampere-based NVIDIA GPUs, such as GeForce 30 series and NVIDIA A100, CUDA 11 is a must. +- For older NVIDIA GPUs, CUDA 11 is backward compatible, but CUDA 10.2 offers better compatibility and is more lightweight. + +Please make sure the GPU driver satisfies the minimum version requirements. See [this table](https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#cuda-major-component-versions__table-cuda-toolkit-driver-versions) for more information. + +```{note} +Installing CUDA runtime libraries is enough if you follow our best practices, because no CUDA code will be compiled locally. However if you hope to compile MMCV from source or develop other CUDA operators, you need to install the complete CUDA toolkit from NVIDIA's [website](https://developer.nvidia.com/cuda-downloads), and its version should match the CUDA version of PyTorch. i.e., the specified version of cudatoolkit in `conda install` command. +``` + +### Install MMCV without MIM + +MMCV contains C++ and CUDA extensions, thus depending on PyTorch in a complex way. MIM solves such dependencies automatically and makes the installation easier. However, it is not a must. + +To install MMCV with pip instead of MIM, please follow [MMCV installation guides](https://mmcv.readthedocs.io/en/latest/get_started/installation.html). This requires manually specifying a find-url based on PyTorch version and its CUDA version. + +For example, the following command install mmcv-full built for PyTorch 1.10.x and CUDA 11.3. + +```shell +pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.10/index.html +``` + +### Install on CPU-only platforms + +MMDetection can be built for CPU only environment. In CPU mode you can train (requires MMCV version >= 1.4.4), test or inference a model. + +However some functionalities are gone in this mode: + +- Deformable Convolution +- Modulated Deformable Convolution +- ROI pooling +- Deformable ROI pooling +- CARAFE +- SyncBatchNorm +- CrissCrossAttention +- MaskedConv2d +- Temporal Interlace Shift +- nms_cuda +- sigmoid_focal_loss_cuda +- bbox_overlaps + +If you try to train/test/inference a model containing above ops, an error will be raised. +The following table lists affected algorithms. + +| Operator | Model | +| :-----------------------------------------------------: | :--------------------------------------------------------------------------------------: | +| Deformable Convolution/Modulated Deformable Convolution | DCN、Guided Anchoring、RepPoints、CentripetalNet、VFNet、CascadeRPN、NAS-FCOS、DetectoRS | +| MaskedConv2d | Guided Anchoring | +| CARAFE | CARAFE | +| SyncBatchNorm | ResNeSt | + +### Install on Google Colab + +[Google Colab](https://research.google.com/) usually has PyTorch installed, +thus we only need to install MMCV and MMDetection with the following commands. + +**Step 1.** Install [MMCV](https://github.com/open-mmlab/mmcv) using [MIM](https://github.com/open-mmlab/mim). + +```shell +!pip3 install openmim +!mim install mmcv-full +``` + +**Step 2.** Install MMDetection from the source. + +```shell +!git clone https://github.com/open-mmlab/mmdetection.git +%cd mmdetection +!pip install -e . +``` + +**Step 3.** Verification. + +```python +import mmdet +print(mmdet.__version__) +# Example output: 2.23.0 +``` + +```{note} +Within Jupyter, the exclamation mark `!` is used to call external executables and `%cd` is a [magic command](https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-cd) to change the current working directory of Python. +``` + +### Using MMDetection with Docker + +We provide a [Dockerfile](https://github.com/open-mmlab/mmdetection/blob/master/docker/Dockerfile) to build an image. Ensure that your [docker version](https://docs.docker.com/engine/install/) >=19.03. + +```shell +# build an image with PyTorch 1.6, CUDA 10.1 +# If you prefer other versions, just modified the Dockerfile +docker build -t mmdetection docker/ +``` + +Run it with + +```shell +docker run --gpus all --shm-size=8g -it -v {DATA_DIR}:/mmdetection/data mmdetection +``` + +## Trouble shooting + +If you have some issues during the installation, please first view the [FAQ](faq.md) page. +You may [open an issue](https://github.com/open-mmlab/mmdetection/issues/new/choose) on GitHub if no solution is found. diff --git a/docs/en/index.rst b/docs/en/index.rst new file mode 100644 index 0000000..0089c87 --- /dev/null +++ b/docs/en/index.rst @@ -0,0 +1,63 @@ +Welcome to MMDetection's documentation! +======================================= + +.. toctree:: + :maxdepth: 2 + :caption: Get Started + + get_started.md + modelzoo_statistics.md + model_zoo.md + +.. toctree:: + :maxdepth: 2 + :caption: Quick Run + + 1_exist_data_model.md + 2_new_data_model.md + 3_exist_data_new_model.md + +.. toctree:: + :maxdepth: 2 + :caption: Tutorials + + tutorials/index.rst + +.. toctree:: + :maxdepth: 2 + :caption: Useful Tools and Scripts + + useful_tools.md + +.. toctree:: + :maxdepth: 2 + :caption: Notes + + conventions.md + compatibility.md + projects.md + changelog.md + faq.md + +.. toctree:: + :caption: Switch Language + + switch_language.md + +.. toctree:: + :maxdepth: 1 + :caption: API Reference + + api.rst + +.. toctree:: + :maxdepth: 1 + :caption: Device Support + + device/npu.md + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`search` diff --git a/docs/en/make.bat b/docs/en/make.bat new file mode 100644 index 0000000..922152e --- /dev/null +++ b/docs/en/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/en/model_zoo.md b/docs/en/model_zoo.md new file mode 100644 index 0000000..6e2f3b6 --- /dev/null +++ b/docs/en/model_zoo.md @@ -0,0 +1,362 @@ +# Benchmark and Model Zoo + +## Mirror sites + +We only use aliyun to maintain the model zoo since MMDetection V2.0. The model zoo of V1.x has been deprecated. + +## Common settings + +- All models were trained on `coco_2017_train`, and tested on the `coco_2017_val`. +- We use distributed training. +- All pytorch-style pretrained backbones on ImageNet are from PyTorch model zoo, caffe-style pretrained backbones are converted from the newly released model from detectron2. +- For fair comparison with other codebases, we report the GPU memory as the maximum value of `torch.cuda.max_memory_allocated()` for all 8 GPUs. Note that this value is usually less than what `nvidia-smi` shows. +- We report the inference time as the total time of network forwarding and post-processing, excluding the data loading time. Results are obtained with the script [benchmark.py](https://github.com/open-mmlab/mmdetection/blob/master/tools/analysis_tools/benchmark.py) which computes the average time on 2000 images. + +## ImageNet Pretrained Models + +It is common to initialize from backbone models pre-trained on ImageNet classification task. All pre-trained model links can be found at [open_mmlab](https://github.com/open-mmlab/mmcv/blob/master/mmcv/model_zoo/open_mmlab.json). According to `img_norm_cfg` and source of weight, we can divide all the ImageNet pre-trained model weights into some cases: + +- TorchVision: Corresponding to torchvision weight, including ResNet50, ResNet101. The `img_norm_cfg` is `dict(mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)`. +- Pycls: Corresponding to [pycls](https://github.com/facebookresearch/pycls) weight, including RegNetX. The `img_norm_cfg` is `dict( mean=[103.530, 116.280, 123.675], std=[57.375, 57.12, 58.395], to_rgb=False)`. +- MSRA styles: Corresponding to [MSRA](https://github.com/KaimingHe/deep-residual-networks) weights, including ResNet50_Caffe and ResNet101_Caffe. The `img_norm_cfg` is `dict( mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False)`. +- Caffe2 styles: Currently only contains ResNext101_32x8d. The `img_norm_cfg` is `dict(mean=[103.530, 116.280, 123.675], std=[57.375, 57.120, 58.395], to_rgb=False)`. +- Other styles: E.g SSD which corresponds to `img_norm_cfg` is `dict(mean=[123.675, 116.28, 103.53], std=[1, 1, 1], to_rgb=True)` and YOLOv3 which corresponds to `img_norm_cfg` is `dict(mean=[0, 0, 0], std=[255., 255., 255.], to_rgb=True)`. + +The detailed table of the commonly used backbone models in MMDetection is listed below : + +| model | source | link | description | +| ---------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| ResNet50 | TorchVision | [torchvision's ResNet-50](https://download.pytorch.org/models/resnet50-19c8e357.pth) | From [torchvision's ResNet-50](https://download.pytorch.org/models/resnet50-19c8e357.pth). | +| ResNet101 | TorchVision | [torchvision's ResNet-101](https://download.pytorch.org/models/resnet101-5d3b4d8f.pth) | From [torchvision's ResNet-101](https://download.pytorch.org/models/resnet101-5d3b4d8f.pth). | +| RegNetX | Pycls | [RegNetX_3.2gf](https://download.openmmlab.com/pretrain/third_party/regnetx_3.2gf-c2599b0f.pth), [RegNetX_800mf](https://download.openmmlab.com/pretrain/third_party/regnetx_800mf-1f4be4c7.pth). etc. | From [pycls](https://github.com/facebookresearch/pycls). | +| ResNet50_Caffe | MSRA | [MSRA's ResNet-50](https://download.openmmlab.com/pretrain/third_party/resnet50_caffe-788b5fa3.pth) | Converted copy of [Detectron2's R-50.pkl](https://dl.fbaipublicfiles.com/detectron2/ImageNetPretrained/MSRA/R-50.pkl) model. The original weight comes from [MSRA's original ResNet-50](https://github.com/KaimingHe/deep-residual-networks). | +| ResNet101_Caffe | MSRA | [MSRA's ResNet-101](https://download.openmmlab.com/pretrain/third_party/resnet101_caffe-3ad79236.pth) | Converted copy of [Detectron2's R-101.pkl](https://dl.fbaipublicfiles.com/detectron2/ImageNetPretrained/MSRA/R-101.pkl) model. The original weight comes from [MSRA's original ResNet-101](https://github.com/KaimingHe/deep-residual-networks). | +| ResNext101_32x8d | Caffe2 | [Caffe2 ResNext101_32x8d](https://download.openmmlab.com/pretrain/third_party/resnext101_32x8d-1516f1aa.pth) | Converted copy of [Detectron2's X-101-32x8d.pkl](https://dl.fbaipublicfiles.com/detectron2/ImageNetPretrained/FAIR/X-101-32x8d.pkl) model. The ResNeXt-101-32x8d model trained with Caffe2 at FB. | + +## Baselines + +### RPN + +Please refer to [RPN](https://github.com/open-mmlab/mmdetection/blob/master/configs/rpn) for details. + +### Faster R-CNN + +Please refer to [Faster R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/faster_rcnn) for details. + +### Mask R-CNN + +Please refer to [Mask R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask_rcnn) for details. + +### Fast R-CNN (with pre-computed proposals) + +Please refer to [Fast R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/fast_rcnn) for details. + +### RetinaNet + +Please refer to [RetinaNet](https://github.com/open-mmlab/mmdetection/blob/master/configs/retinanet) for details. + +### Cascade R-CNN and Cascade Mask R-CNN + +Please refer to [Cascade R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/cascade_rcnn) for details. + +### Hybrid Task Cascade (HTC) + +Please refer to [HTC](https://github.com/open-mmlab/mmdetection/blob/master/configs/htc) for details. + +### SSD + +Please refer to [SSD](https://github.com/open-mmlab/mmdetection/blob/master/configs/ssd) for details. + +### Group Normalization (GN) + +Please refer to [Group Normalization](https://github.com/open-mmlab/mmdetection/blob/master/configs/gn) for details. + +### Weight Standardization + +Please refer to [Weight Standardization](https://github.com/open-mmlab/mmdetection/blob/master/configs/gn+ws) for details. + +### Deformable Convolution v2 + +Please refer to [Deformable Convolutional Networks](https://github.com/open-mmlab/mmdetection/blob/master/configs/dcn) for details. + +### CARAFE: Content-Aware ReAssembly of FEatures + +Please refer to [CARAFE](https://github.com/open-mmlab/mmdetection/blob/master/configs/carafe) for details. + +### Instaboost + +Please refer to [Instaboost](https://github.com/open-mmlab/mmdetection/blob/master/configs/instaboost) for details. + +### Libra R-CNN + +Please refer to [Libra R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/libra_rcnn) for details. + +### Guided Anchoring + +Please refer to [Guided Anchoring](https://github.com/open-mmlab/mmdetection/blob/master/configs/guided_anchoring) for details. + +### FCOS + +Please refer to [FCOS](https://github.com/open-mmlab/mmdetection/blob/master/configs/fcos) for details. + +### FoveaBox + +Please refer to [FoveaBox](https://github.com/open-mmlab/mmdetection/blob/master/configs/foveabox) for details. + +### RepPoints + +Please refer to [RepPoints](https://github.com/open-mmlab/mmdetection/blob/master/configs/reppoints) for details. + +### FreeAnchor + +Please refer to [FreeAnchor](https://github.com/open-mmlab/mmdetection/blob/master/configs/free_anchor) for details. + +### Grid R-CNN (plus) + +Please refer to [Grid R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/grid_rcnn) for details. + +### GHM + +Please refer to [GHM](https://github.com/open-mmlab/mmdetection/blob/master/configs/ghm) for details. + +### GCNet + +Please refer to [GCNet](https://github.com/open-mmlab/mmdetection/blob/master/configs/gcnet) for details. + +### HRNet + +Please refer to [HRNet](https://github.com/open-mmlab/mmdetection/blob/master/configs/hrnet) for details. + +### Mask Scoring R-CNN + +Please refer to [Mask Scoring R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/ms_rcnn) for details. + +### Train from Scratch + +Please refer to [Rethinking ImageNet Pre-training](https://github.com/open-mmlab/mmdetection/blob/master/configs/scratch) for details. + +### NAS-FPN + +Please refer to [NAS-FPN](https://github.com/open-mmlab/mmdetection/blob/master/configs/nas_fpn) for details. + +### ATSS + +Please refer to [ATSS](https://github.com/open-mmlab/mmdetection/blob/master/configs/atss) for details. + +### FSAF + +Please refer to [FSAF](https://github.com/open-mmlab/mmdetection/blob/master/configs/fsaf) for details. + +### RegNetX + +Please refer to [RegNet](https://github.com/open-mmlab/mmdetection/blob/master/configs/regnet) for details. + +### Res2Net + +Please refer to [Res2Net](https://github.com/open-mmlab/mmdetection/blob/master/configs/res2net) for details. + +### GRoIE + +Please refer to [GRoIE](https://github.com/open-mmlab/mmdetection/blob/master/configs/groie) for details. + +### Dynamic R-CNN + +Please refer to [Dynamic R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/dynamic_rcnn) for details. + +### PointRend + +Please refer to [PointRend](https://github.com/open-mmlab/mmdetection/blob/master/configs/point_rend) for details. + +### DetectoRS + +Please refer to [DetectoRS](https://github.com/open-mmlab/mmdetection/blob/master/configs/detectors) for details. + +### Generalized Focal Loss + +Please refer to [Generalized Focal Loss](https://github.com/open-mmlab/mmdetection/blob/master/configs/gfl) for details. + +### CornerNet + +Please refer to [CornerNet](https://github.com/open-mmlab/mmdetection/blob/master/configs/cornernet) for details. + +### YOLOv3 + +Please refer to [YOLOv3](https://github.com/open-mmlab/mmdetection/blob/master/configs/yolo) for details. + +### PAA + +Please refer to [PAA](https://github.com/open-mmlab/mmdetection/blob/master/configs/paa) for details. + +### SABL + +Please refer to [SABL](https://github.com/open-mmlab/mmdetection/blob/master/configs/sabl) for details. + +### CentripetalNet + +Please refer to [CentripetalNet](https://github.com/open-mmlab/mmdetection/blob/master/configs/centripetalnet) for details. + +### ResNeSt + +Please refer to [ResNeSt](https://github.com/open-mmlab/mmdetection/blob/master/configs/resnest) for details. + +### DETR + +Please refer to [DETR](https://github.com/open-mmlab/mmdetection/blob/master/configs/detr) for details. + +### Deformable DETR + +Please refer to [Deformable DETR](https://github.com/open-mmlab/mmdetection/blob/master/configs/deformable_detr) for details. + +### AutoAssign + +Please refer to [AutoAssign](https://github.com/open-mmlab/mmdetection/blob/master/configs/autoassign) for details. + +### YOLOF + +Please refer to [YOLOF](https://github.com/open-mmlab/mmdetection/blob/master/configs/yolof) for details. + +### Seesaw Loss + +Please refer to [Seesaw Loss](https://github.com/open-mmlab/mmdetection/blob/master/configs/seesaw_loss) for details. + +### CenterNet + +Please refer to [CenterNet](https://github.com/open-mmlab/mmdetection/blob/master/configs/centernet) for details. + +### YOLOX + +Please refer to [YOLOX](https://github.com/open-mmlab/mmdetection/blob/master/configs/yolox) for details. + +### PVT + +Please refer to [PVT](https://github.com/open-mmlab/mmdetection/blob/master/configs/pvt) for details. + +### SOLO + +Please refer to [SOLO](https://github.com/open-mmlab/mmdetection/blob/master/configs/solo) for details. + +### QueryInst + +Please refer to [QueryInst](https://github.com/open-mmlab/mmdetection/blob/master/configs/queryinst) for details. + +### PanopticFPN + +Please refer to [PanopticFPN](https://github.com/open-mmlab/mmdetection/blob/master/configs/panoptic_fpn) for details. + +### MaskFormer + +Please refer to [MaskFormer](https://github.com/open-mmlab/mmdetection/blob/master/configs/maskformer) for details. + +### DyHead + +Please refer to [DyHead](https://github.com/open-mmlab/mmdetection/blob/master/configs/dyhead) for details. + +### Mask2Former + +Please refer to [Mask2Former](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask2former) for details. + +### Efficientnet + +Please refer to [Efficientnet](https://github.com/open-mmlab/mmdetection/blob/master/configs/efficientnet) for details. + +### RF-Next + +Please refer to [RF-Next](https://github.com/open-mmlab/mmdetection/blob/master/configs/rfnext) for details. + +### Other datasets + +We also benchmark some methods on [PASCAL VOC](https://github.com/open-mmlab/mmdetection/blob/master/configs/pascal_voc), [Cityscapes](https://github.com/open-mmlab/mmdetection/blob/master/configs/cityscapes), [OpenImages](https://github.com/open-mmlab/mmdetection/blob/master/configs/openimages) and [WIDER FACE](https://github.com/open-mmlab/mmdetection/blob/master/configs/wider_face). + +### Pre-trained Models + +We also train [Faster R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/faster_rcnn) and [Mask R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask_rcnn) using ResNet-50 and [RegNetX-3.2G](https://github.com/open-mmlab/mmdetection/blob/master/configs/regnet) with multi-scale training and longer schedules. These models serve as strong pre-trained models for downstream tasks for convenience. + +## Speed benchmark + +### Training Speed benchmark + +We provide [analyze_logs.py](https://github.com/open-mmlab/mmdetection/blob/master/tools/analysis_tools/analyze_logs.py) to get average time of iteration in training. You can find examples in [Log Analysis](https://mmdetection.readthedocs.io/en/latest/useful_tools.html#log-analysis). + +We compare the training speed of Mask R-CNN with some other popular frameworks (The data is copied from [detectron2](https://github.com/facebookresearch/detectron2/blob/master/docs/notes/benchmarks.md/)). +For mmdetection, we benchmark with [mask_rcnn_r50_caffe_fpn_poly_1x_coco_v1.py](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_poly_1x_coco_v1.py), which should have the same setting with [mask_rcnn_R_50_FPN_noaug_1x.yaml](https://github.com/facebookresearch/detectron2/blob/master/configs/Detectron1-Comparisons/mask_rcnn_R_50_FPN_noaug_1x.yaml) of detectron2. +We also provide the [checkpoint](https://download.openmmlab.com/mmdetection/v2.0/benchmark/mask_rcnn_r50_caffe_fpn_poly_1x_coco_no_aug/mask_rcnn_r50_caffe_fpn_poly_1x_coco_no_aug_compare_20200518-10127928.pth) and [training log](https://download.openmmlab.com/mmdetection/v2.0/benchmark/mask_rcnn_r50_caffe_fpn_poly_1x_coco_no_aug/mask_rcnn_r50_caffe_fpn_poly_1x_coco_no_aug_20200518_105755.log.json) for reference. The throughput is computed as the average throughput in iterations 100-500 to skip GPU warmup time. + +| Implementation | Throughput (img/s) | +| -------------------------------------------------------------------------------------- | ------------------ | +| [Detectron2](https://github.com/facebookresearch/detectron2) | 62 | +| [MMDetection](https://github.com/open-mmlab/mmdetection) | 61 | +| [maskrcnn-benchmark](https://github.com/facebookresearch/maskrcnn-benchmark/) | 53 | +| [tensorpack](https://github.com/tensorpack/tensorpack/tree/master/examples/FasterRCNN) | 50 | +| [simpledet](https://github.com/TuSimple/simpledet/) | 39 | +| [Detectron](https://github.com/facebookresearch/Detectron) | 19 | +| [matterport/Mask_RCNN](https://github.com/matterport/Mask_RCNN/) | 14 | + +### Inference Speed Benchmark + +We provide [benchmark.py](https://github.com/open-mmlab/mmdetection/blob/master/tools/analysis_tools/benchmark.py) to benchmark the inference latency. +The script benchmarkes the model with 2000 images and calculates the average time ignoring first 5 times. You can change the output log interval (defaults: 50) by setting `LOG-INTERVAL`. + +```shell +python tools/benchmark.py ${CONFIG} ${CHECKPOINT} [--log-interval $[LOG-INTERVAL]] [--fuse-conv-bn] +``` + +The latency of all models in our model zoo is benchmarked without setting `fuse-conv-bn`, you can get a lower latency by setting it. + +## Comparison with Detectron2 + +We compare mmdetection with [Detectron2](https://github.com/facebookresearch/detectron2.git) in terms of speed and performance. +We use the commit id [185c27e](https://github.com/facebookresearch/detectron2/tree/185c27e4b4d2d4c68b5627b3765420c6d7f5a659)(30/4/2020) of detectron. +For fair comparison, we install and run both frameworks on the same machine. + +### Hardware + +- 8 NVIDIA Tesla V100 (32G) GPUs +- Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz + +### Software environment + +- Python 3.7 +- PyTorch 1.4 +- CUDA 10.1 +- CUDNN 7.6.03 +- NCCL 2.4.08 + +### Performance + +| Type | Lr schd | Detectron2 | mmdetection | Download | +| -------------------------------------------------------------------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Faster R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py) | 1x | [37.9](https://github.com/facebookresearch/detectron2/blob/master/configs/COCO-Detection/faster_rcnn_R_50_FPN_1x.yaml) | 38.0 | [model](https://download.openmmlab.com/mmdetection/v2.0/benchmark/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-5324cff8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/benchmark/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco_20200429_234554.log.json) | +| [Mask R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py) | 1x | [38.6 & 35.2](https://github.com/facebookresearch/detectron2/blob/master/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml) | 38.8 & 35.4 | [model](https://download.openmmlab.com/mmdetection/v2.0/benchmark/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco-dbecf295.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/benchmark/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco_20200430_054239.log.json) | +| [Retinanet](https://github.com/open-mmlab/mmdetection/blob/master/configs/retinanet/retinanet_r50_caffe_fpn_mstrain_1x_coco.py) | 1x | [36.5](https://github.com/facebookresearch/detectron2/blob/master/configs/COCO-Detection/retinanet_R_50_FPN_1x.yaml) | 37.0 | [model](https://download.openmmlab.com/mmdetection/v2.0/benchmark/retinanet_r50_caffe_fpn_mstrain_1x_coco/retinanet_r50_caffe_fpn_mstrain_1x_coco-586977a0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/benchmark/retinanet_r50_caffe_fpn_mstrain_1x_coco/retinanet_r50_caffe_fpn_mstrain_1x_coco_20200430_014748.log.json) | + +### Training Speed + +The training speed is measure with s/iter. The lower, the better. + +| Type | Detectron2 | mmdetection | +| ------------ | ---------- | ----------- | +| Faster R-CNN | 0.210 | 0.216 | +| Mask R-CNN | 0.261 | 0.265 | +| Retinanet | 0.200 | 0.205 | + +### Inference Speed + +The inference speed is measured with fps (img/s) on a single GPU, the higher, the better. +To be consistent with Detectron2, we report the pure inference speed (without the time of data loading). +For Mask R-CNN, we exclude the time of RLE encoding in post-processing. +We also include the officially reported speed in the parentheses, which is slightly higher +than the results tested on our server due to differences of hardwares. + +| Type | Detectron2 | mmdetection | +| ------------ | ----------- | ----------- | +| Faster R-CNN | 25.6 (26.3) | 22.2 | +| Mask R-CNN | 22.5 (23.3) | 19.6 | +| Retinanet | 17.8 (18.2) | 20.6 | + +### Training memory + +| Type | Detectron2 | mmdetection | +| ------------ | ---------- | ----------- | +| Faster R-CNN | 3.0 | 3.8 | +| Mask R-CNN | 3.4 | 3.9 | +| Retinanet | 3.9 | 3.4 | diff --git a/docs/en/projects.md b/docs/en/projects.md new file mode 100644 index 0000000..fa8ecb7 --- /dev/null +++ b/docs/en/projects.md @@ -0,0 +1,58 @@ +# Projects based on MMDetection + +There are many projects built upon MMDetection. +We list some of them as examples of how to extend MMDetection for your own projects. +As the page might not be completed, please feel free to create a PR to update this page. + +## Projects as an extension + +Some projects extend the boundary of MMDetection for deployment or other research fields. +They reveal the potential of what MMDetection can do. We list several of them as below. + +- [OTEDetection](https://github.com/opencv/mmdetection): OpenVINO training extensions for object detection. +- [MMDetection3d](https://github.com/open-mmlab/mmdetection3d): OpenMMLab's next-generation platform for general 3D object detection. + +## Projects of papers + +There are also projects released with papers. +Some of the papers are published in top-tier conferences (CVPR, ICCV, and ECCV), the others are also highly influential. +To make this list also a reference for the community to develop and compare new object detection algorithms, we list them following the time order of top-tier conferences. +Methods already supported and maintained by MMDetection are not listed. + +- Anchor Pruning for Object Detection, CVIU 2022. [\[paper\]](https://doi.org/10.1016/j.cviu.2022.103445)[\[github\]](https://github.com/Mxbonn/anchor_pruning) +- Involution: Inverting the Inherence of Convolution for Visual Recognition, CVPR21. [\[paper\]](https://arxiv.org/abs/2103.06255)[\[github\]](https://github.com/d-li14/involution) +- Multiple Instance Active Learning for Object Detection, CVPR 2021. [\[paper\]](https://openaccess.thecvf.com/content/CVPR2021/papers/Yuan_Multiple_Instance_Active_Learning_for_Object_Detection_CVPR_2021_paper.pdf)[\[github\]](https://github.com/yuantn/MI-AOD) +- Adaptive Class Suppression Loss for Long-Tail Object Detection, CVPR 2021. [\[paper\]](https://arxiv.org/abs/2104.00885)[\[github\]](https://github.com/CASIA-IVA-Lab/ACSL) +- Generalizable Pedestrian Detection: The Elephant In The Room, CVPR2021. [\[paper\]](https://arxiv.org/abs/2003.08799)[\[github\]](https://github.com/hasanirtiza/Pedestron) +- Group Fisher Pruning for Practical Network Compression, ICML2021. [\[paper\]](https://github.com/jshilong/FisherPruning/blob/main/resources/paper.pdf)[\[github\]](https://github.com/jshilong/FisherPruning) +- Overcoming Classifier Imbalance for Long-tail Object Detection with Balanced Group Softmax, CVPR2020. [\[paper\]](http://openaccess.thecvf.com/content_CVPR_2020/papers/Li_Overcoming_Classifier_Imbalance_for_Long-Tail_Object_Detection_With_Balanced_Group_CVPR_2020_paper.pdf)[\[github\]](https://github.com/FishYuLi/BalancedGroupSoftmax) +- Coherent Reconstruction of Multiple Humans from a Single Image, CVPR2020. [\[paper\]](https://jiangwenpl.github.io/multiperson/)[\[github\]](https://github.com/JiangWenPL/multiperson) +- Look-into-Object: Self-supervised Structure Modeling for Object Recognition, CVPR 2020. [\[paper\]](http://openaccess.thecvf.com/content_CVPR_2020/papers/Zhou_Look-Into-Object_Self-Supervised_Structure_Modeling_for_Object_Recognition_CVPR_2020_paper.pdf)[\[github\]](https://github.com/JDAI-CV/LIO) +- Video Panoptic Segmentation, CVPR2020. [\[paper\]](https://arxiv.org/abs/2006.11339)[\[github\]](https://github.com/mcahny/vps) +- D2Det: Towards High Quality Object Detection and Instance Segmentation, CVPR2020. [\[paper\]](http://openaccess.thecvf.com/content_CVPR_2020/html/Cao_D2Det_Towards_High_Quality_Object_Detection_and_Instance_Segmentation_CVPR_2020_paper.html)[\[github\]](https://github.com/JialeCao001/D2Det) +- CentripetalNet: Pursuing High-quality Keypoint Pairs for Object Detection, CVPR2020. [\[paper\]](https://arxiv.org/abs/2003.09119)[\[github\]](https://github.com/KiveeDong/CentripetalNet) +- Learning a Unified Sample Weighting Network for Object Detection, CVPR 2020. [\[paper\]](http://openaccess.thecvf.com/content_CVPR_2020/html/Cai_Learning_a_Unified_Sample_Weighting_Network_for_Object_Detection_CVPR_2020_paper.html)[\[github\]](https://github.com/caiqi/sample-weighting-network) +- Scale-equalizing Pyramid Convolution for Object Detection, CVPR2020. [\[paper\]](https://arxiv.org/abs/2005.03101) [\[github\]](https://github.com/jshilong/SEPC) +- Revisiting the Sibling Head in Object Detector, CVPR2020. [\[paper\]](https://arxiv.org/abs/2003.07540)[\[github\]](https://github.com/Sense-X/TSD) +- PolarMask: Single Shot Instance Segmentation with Polar Representation, CVPR2020. [\[paper\]](https://arxiv.org/abs/1909.13226)[\[github\]](https://github.com/xieenze/PolarMask) +- Hit-Detector: Hierarchical Trinity Architecture Search for Object Detection, CVPR2020. [\[paper\]](https://arxiv.org/abs/2003.11818)[\[github\]](https://github.com/ggjy/HitDet.pytorch) +- ZeroQ: A Novel Zero Shot Quantization Framework, CVPR2020. [\[paper\]](https://arxiv.org/abs/2001.00281)[\[github\]](https://github.com/amirgholami/ZeroQ) +- CBNet: A Novel Composite Backbone Network Architecture for Object Detection, AAAI2020. [\[paper\]](https://aaai.org/Papers/AAAI/2020GB/AAAI-LiuY.1833.pdf)[\[github\]](https://github.com/VDIGPKU/CBNet) +- RDSNet: A New Deep Architecture for Reciprocal Object Detection and Instance Segmentation, AAAI2020. [\[paper\]](https://arxiv.org/abs/1912.05070)[\[github\]](https://github.com/wangsr126/RDSNet) +- Training-Time-Friendly Network for Real-Time Object Detection, AAAI2020. [\[paper\]](https://arxiv.org/abs/1909.00700)[\[github\]](https://github.com/ZJULearning/ttfnet) +- Cascade RPN: Delving into High-Quality Region Proposal Network with Adaptive Convolution, NeurIPS 2019. [\[paper\]](https://arxiv.org/abs/1909.06720)[\[github\]](https://github.com/thangvubk/Cascade-RPN) +- Reasoning R-CNN: Unifying Adaptive Global Reasoning into Large-scale Object Detection, CVPR2019. [\[paper\]](http://openaccess.thecvf.com/content_CVPR_2019/papers/Xu_Reasoning-RCNN_Unifying_Adaptive_Global_Reasoning_Into_Large-Scale_Object_Detection_CVPR_2019_paper.pdf)[\[github\]](https://github.com/chanyn/Reasoning-RCNN) +- Learning RoI Transformer for Oriented Object Detection in Aerial Images, CVPR2019. [\[paper\]](https://arxiv.org/abs/1812.00155)[\[github\]](https://github.com/dingjiansw101/AerialDetection) +- SOLO: Segmenting Objects by Locations. [\[paper\]](https://arxiv.org/abs/1912.04488)[\[github\]](https://github.com/WXinlong/SOLO) +- SOLOv2: Dynamic, Faster and Stronger. [\[paper\]](https://arxiv.org/abs/2003.10152)[\[github\]](https://github.com/WXinlong/SOLO) +- Dense Peppoints: Representing Visual Objects with Dense Point Sets. [\[paper\]](https://arxiv.org/abs/1912.11473)[\[github\]](https://github.com/justimyhxu/Dense-RepPoints) +- IterDet: Iterative Scheme for Object Detection in Crowded Environments. [\[paper\]](https://arxiv.org/abs/2005.05708)[\[github\]](https://github.com/saic-vul/iterdet) +- Cross-Iteration Batch Normalization. [\[paper\]](https://arxiv.org/abs/2002.05712)[\[github\]](https://github.com/Howal/Cross-iterationBatchNorm) +- A Ranking-based, Balanced Loss Function Unifying Classification and Localisation in Object Detection, NeurIPS2020 [\[paper\]](https://arxiv.org/abs/2009.13592)[\[github\]](https://github.com/kemaloksuz/aLRPLoss) +- RelationNet++: Bridging Visual Representations for Object Detection via Transformer Decoder, NeurIPS2020 [\[paper\]](https://arxiv.org/abs/2010.15831)[\[github\]](https://github.com/microsoft/RelationNet2) +- Generalized Focal Loss V2: Learning Reliable Localization Quality Estimation for Dense Object Detection, CVPR2021[\[paper\]](https://arxiv.org/abs/2011.12885)[\[github\]](https://github.com/implus/GFocalV2) +- Swin Transformer: Hierarchical Vision Transformer using Shifted Windows, ICCV2021[\[paper\]](https://arxiv.org/abs/2103.14030)[\[github\]](https://github.com/SwinTransformer/) +- Focal Transformer: Focal Self-attention for Local-Global Interactions in Vision Transformers, NeurIPS2021[\[paper\]](https://arxiv.org/abs/2107.00641)[\[github\]](https://github.com/microsoft/Focal-Transformer) +- End-to-End Semi-Supervised Object Detection with Soft Teacher, ICCV2021[\[paper\]](https://arxiv.org/abs/2106.09018)[\[github\]](https://github.com/microsoft/SoftTeacher) +- CBNetV2: A Novel Composite Backbone Network Architecture for Object Detection [\[paper\]](http://arxiv.org/abs/2107.00420)[\[github\]](https://github.com/VDIGPKU/CBNetV2) +- Instances as Queries, ICCV2021 [\[paper\]](https://openaccess.thecvf.com/content/ICCV2021/papers/Fang_Instances_As_Queries_ICCV_2021_paper.pdf)[\[github\]](https://github.com/hustvl/QueryInst) diff --git a/docs/en/robustness_benchmarking.md b/docs/en/robustness_benchmarking.md new file mode 100644 index 0000000..bb624ee --- /dev/null +++ b/docs/en/robustness_benchmarking.md @@ -0,0 +1,110 @@ +# Corruption Benchmarking + +## Introduction + +We provide tools to test object detection and instance segmentation models on the image corruption benchmark defined in [Benchmarking Robustness in Object Detection: Autonomous Driving when Winter is Coming](https://arxiv.org/abs/1907.07484). +This page provides basic tutorials how to use the benchmark. + +```latex +@article{michaelis2019winter, + title={Benchmarking Robustness in Object Detection: + Autonomous Driving when Winter is Coming}, + author={Michaelis, Claudio and Mitzkus, Benjamin and + Geirhos, Robert and Rusak, Evgenia and + Bringmann, Oliver and Ecker, Alexander S. and + Bethge, Matthias and Brendel, Wieland}, + journal={arXiv:1907.07484}, + year={2019} +} +``` + +![image corruption example](../resources/corruptions_sev_3.png) + +## About the benchmark + +To submit results to the benchmark please visit the [benchmark homepage](https://github.com/bethgelab/robust-detection-benchmark) + +The benchmark is modelled after the [imagenet-c benchmark](https://github.com/hendrycks/robustness) which was originally +published in [Benchmarking Neural Network Robustness to Common Corruptions and Perturbations](https://arxiv.org/abs/1903.12261) (ICLR 2019) by Dan Hendrycks and Thomas Dietterich. + +The image corruption functions are included in this library but can be installed separately using: + +```shell +pip install imagecorruptions +``` + +Compared to imagenet-c a few changes had to be made to handle images of arbitrary size and greyscale images. +We also modified the 'motion blur' and 'snow' corruptions to remove dependency from a linux specific library, +which would have to be installed separately otherwise. For details please refer to the [imagecorruptions repository](https://github.com/bethgelab/imagecorruptions). + +## Inference with pretrained models + +We provide a testing script to evaluate a models performance on any combination of the corruptions provided in the benchmark. + +### Test a dataset + +- [x] single GPU testing +- [ ] multiple GPU testing +- [ ] visualize detection results + +You can use the following commands to test a models performance under the 15 corruptions used in the benchmark. + +```shell +# single-gpu testing +python tools/analysis_tools/test_robustness.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] +``` + +Alternatively different group of corruptions can be selected. + +```shell +# noise +python tools/analysis_tools/test_robustness.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] --corruptions noise + +# blur +python tools/analysis_tools/test_robustness.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] --corruptions blur + +# wetaher +python tools/analysis_tools/test_robustness.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] --corruptions weather + +# digital +python tools/analysis_tools/test_robustness.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] --corruptions digital +``` + +Or a costom set of corruptions e.g.: + +```shell +# gaussian noise, zoom blur and snow +python tools/analysis_tools/test_robustness.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] --corruptions gaussian_noise zoom_blur snow +``` + +Finally the corruption severities to evaluate can be chosen. +Severity 0 corresponds to clean data and the effect increases from 1 to 5. + +```shell +# severity 1 +python tools/analysis_tools/test_robustness.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] --severities 1 + +# severities 0,2,4 +python tools/analysis_tools/test_robustness.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] --severities 0 2 4 +``` + +## Results for modelzoo models + +The results on COCO 2017val are shown in the below table. + +| Model | Backbone | Style | Lr schd | box AP clean | box AP corr. | box % | mask AP clean | mask AP corr. | mask % | +| :-----------------: | :-----------------: | :-----: | :-----: | :----------: | :----------: | :---: | :-----------: | :-----------: | :----: | +| Faster R-CNN | R-50-FPN | pytorch | 1x | 36.3 | 18.2 | 50.2 | - | - | - | +| Faster R-CNN | R-101-FPN | pytorch | 1x | 38.5 | 20.9 | 54.2 | - | - | - | +| Faster R-CNN | X-101-32x4d-FPN | pytorch | 1x | 40.1 | 22.3 | 55.5 | - | - | - | +| Faster R-CNN | X-101-64x4d-FPN | pytorch | 1x | 41.3 | 23.4 | 56.6 | - | - | - | +| Faster R-CNN | R-50-FPN-DCN | pytorch | 1x | 40.0 | 22.4 | 56.1 | - | - | - | +| Faster R-CNN | X-101-32x4d-FPN-DCN | pytorch | 1x | 43.4 | 26.7 | 61.6 | - | - | - | +| Mask R-CNN | R-50-FPN | pytorch | 1x | 37.3 | 18.7 | 50.1 | 34.2 | 16.8 | 49.1 | +| Mask R-CNN | R-50-FPN-DCN | pytorch | 1x | 41.1 | 23.3 | 56.7 | 37.2 | 20.7 | 55.7 | +| Cascade R-CNN | R-50-FPN | pytorch | 1x | 40.4 | 20.1 | 49.7 | - | - | - | +| Cascade Mask R-CNN | R-50-FPN | pytorch | 1x | 41.2 | 20.7 | 50.2 | 35.7 | 17.6 | 49.3 | +| RetinaNet | R-50-FPN | pytorch | 1x | 35.6 | 17.8 | 50.1 | - | - | - | +| Hybrid Task Cascade | X-101-64x4d-FPN-DCN | pytorch | 1x | 50.6 | 32.7 | 64.7 | 43.8 | 28.1 | 64.0 | + +Results may vary slightly due to the stochastic application of the corruptions. diff --git a/docs/en/stat.py b/docs/en/stat.py new file mode 100755 index 0000000..427c27b --- /dev/null +++ b/docs/en/stat.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python +import functools as func +import glob +import os.path as osp +import re + +import numpy as np + +url_prefix = 'https://github.com/open-mmlab/mmdetection/blob/master/configs' + +files = sorted(glob.glob('../../configs/*/README.md')) + +stats = [] +titles = [] +num_ckpts = 0 + +for f in files: + url = osp.dirname(f.replace('../../configs', url_prefix)) + + with open(f, 'r') as content_file: + content = content_file.read() + + title = content.split('\n')[0].replace('# ', '').strip() + ckpts = set(x.lower().strip() + for x in re.findall(r'\[model\]\((https?.*)\)', content)) + + if len(ckpts) == 0: + continue + + _papertype = [x for x in re.findall(r'\[([A-Z]+)\]', content)] + assert len(_papertype) > 0 + papertype = _papertype[0] + + paper = set([(papertype, title)]) + + titles.append(title) + num_ckpts += len(ckpts) + + statsmsg = f""" +\t* [{papertype}] [{title}]({url}) ({len(ckpts)} ckpts) +""" + stats.append((paper, ckpts, statsmsg)) + +allpapers = func.reduce(lambda a, b: a.union(b), [p for p, _, _ in stats]) +msglist = '\n'.join(x for _, _, x in stats) + +papertypes, papercounts = np.unique([t for t, _ in allpapers], + return_counts=True) +countstr = '\n'.join( + [f' - {t}: {c}' for t, c in zip(papertypes, papercounts)]) + +modelzoo = f""" +# Model Zoo Statistics + +* Number of papers: {len(set(titles))} +{countstr} + +* Number of checkpoints: {num_ckpts} + +{msglist} +""" + +with open('modelzoo_statistics.md', 'w') as f: + f.write(modelzoo) diff --git a/docs/en/switch_language.md b/docs/en/switch_language.md new file mode 100644 index 0000000..b2c4ad9 --- /dev/null +++ b/docs/en/switch_language.md @@ -0,0 +1,3 @@ +## English + +## 简体中文 diff --git a/docs/en/tutorials/config.md b/docs/en/tutorials/config.md new file mode 100644 index 0000000..8fd37db --- /dev/null +++ b/docs/en/tutorials/config.md @@ -0,0 +1,551 @@ +# Tutorial 1: Learn about Configs + +We incorporate modular and inheritance design into our config system, which is convenient to conduct various experiments. +If you wish to inspect the config file, you may run `python tools/misc/print_config.py /PATH/TO/CONFIG` to see the complete config. + +## Modify config through script arguments + +When submitting jobs using "tools/train.py" or "tools/test.py", you may specify `--cfg-options` to in-place modify the config. + +- Update config keys of dict chains. + + The config options can be specified following the order of the dict keys in the original config. + For example, `--cfg-options model.backbone.norm_eval=False` changes the all BN modules in model backbones to `train` mode. + +- Update keys inside a list of configs. + + Some config dicts are composed as a list in your config. For example, the training pipeline `data.train.pipeline` is normally a list + e.g. `[dict(type='LoadImageFromFile'), ...]`. If you want to change `'LoadImageFromFile'` to `'LoadImageFromWebcam'` in the pipeline, + you may specify `--cfg-options data.train.pipeline.0.type=LoadImageFromWebcam`. + +- Update values of list/tuples. + + If the value to be updated is a list or a tuple. For example, the config file normally sets `workflow=[('train', 1)]`. If you want to + change this key, you may specify `--cfg-options workflow="[(train,1),(val,1)]"`. Note that the quotation mark " is necessary to + support list/tuple data types, and that **NO** white space is allowed inside the quotation marks in the specified value. + +## Config File Structure + +There are 4 basic component types under `config/_base_`, dataset, model, schedule, default_runtime. +Many methods could be easily constructed with one of each like Faster R-CNN, Mask R-CNN, Cascade R-CNN, RPN, SSD. +The configs that are composed by components from `_base_` are called _primitive_. + +For all configs under the same folder, it is recommended to have only **one** _primitive_ config. All other configs should inherit from the _primitive_ config. In this way, the maximum of inheritance level is 3. + +For easy understanding, we recommend contributors to inherit from existing methods. +For example, if some modification is made base on Faster R-CNN, user may first inherit the basic Faster R-CNN structure by specifying `_base_ = ../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py`, then modify the necessary fields in the config files. + +If you are building an entirely new method that does not share the structure with any of the existing methods, you may create a folder `xxx_rcnn` under `configs`, + +Please refer to [mmcv](https://mmcv.readthedocs.io/en/latest/understand_mmcv/config.html) for detailed documentation. + +## Config Name Style + +We follow the below style to name config files. Contributors are advised to follow the same style. + +``` +{model}_[model setting]_{backbone}_{neck}_[norm setting]_[misc]_[gpu x batch_per_gpu]_{schedule}_{dataset} +``` + +`{xxx}` is required field and `[yyy]` is optional. + +- `{model}`: model type like `faster_rcnn`, `mask_rcnn`, etc. +- `[model setting]`: specific setting for some model, like `without_semantic` for `htc`, `moment` for `reppoints`, etc. +- `{backbone}`: backbone type like `r50` (ResNet-50), `x101` (ResNeXt-101). +- `{neck}`: neck type like `fpn`, `pafpn`, `nasfpn`, `c4`. +- `[norm_setting]`: `bn` (Batch Normalization) is used unless specified, other norm layer type could be `gn` (Group Normalization), `syncbn` (Synchronized Batch Normalization). + `gn-head`/`gn-neck` indicates GN is applied in head/neck only, while `gn-all` means GN is applied in the entire model, e.g. backbone, neck, head. +- `[misc]`: miscellaneous setting/plugins of model, e.g. `dconv`, `gcb`, `attention`, `albu`, `mstrain`. +- `[gpu x batch_per_gpu]`: GPUs and samples per GPU, `8x2` is used by default. +- `{schedule}`: training schedule, options are `1x`, `2x`, `20e`, etc. + `1x` and `2x` means 12 epochs and 24 epochs respectively. + `20e` is adopted in cascade models, which denotes 20 epochs. + For `1x`/`2x`, initial learning rate decays by a factor of 10 at the 8/16th and 11/22th epochs. + For `20e`, initial learning rate decays by a factor of 10 at the 16th and 19th epochs. +- `{dataset}`: dataset like `coco`, `cityscapes`, `voc_0712`, `wider_face`. + +## Deprecated train_cfg/test_cfg + +The `train_cfg` and `test_cfg` are deprecated in config file, please specify them in the model config. The original config structure is as below. + +```python +# deprecated +model = dict( + type=..., + ... +) +train_cfg=dict(...) +test_cfg=dict(...) +``` + +The migration example is as below. + +```python +# recommended +model = dict( + type=..., + ... +train_cfg=dict(...), + test_cfg=dict(...), +) +``` + +## An Example of Mask R-CNN + +To help the users have a basic idea of a complete config and the modules in a modern detection system, +we make brief comments on the config of Mask R-CNN using ResNet50 and FPN as the following. +For more detailed usage and the corresponding alternative for each modules, please refer to the API documentation. + +```python +model = dict( + type='MaskRCNN', # The name of detector + backbone=dict( # The config of backbone + type='ResNet', # The type of the backbone, refer to https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/backbones/resnet.py#L308 for more details. + depth=50, # The depth of backbone, usually it is 50 or 101 for ResNet and ResNext backbones. + num_stages=4, # Number of stages of the backbone. + out_indices=(0, 1, 2, 3), # The index of output feature maps produced in each stages + frozen_stages=1, # The weights in the first 1 stage are frozen + norm_cfg=dict( # The config of normalization layers. + type='BN', # Type of norm layer, usually it is BN or GN + requires_grad=True), # Whether to train the gamma and beta in BN + norm_eval=True, # Whether to freeze the statistics in BN + style='pytorch', # The style of backbone, 'pytorch' means that stride 2 layers are in 3x3 conv, 'caffe' means stride 2 layers are in 1x1 convs. + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), # The ImageNet pretrained backbone to be loaded + neck=dict( + type='FPN', # The neck of detector is FPN. We also support 'NASFPN', 'PAFPN', etc. Refer to https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/necks/fpn.py#L10 for more details. + in_channels=[256, 512, 1024, 2048], # The input channels, this is consistent with the output channels of backbone + out_channels=256, # The output channels of each level of the pyramid feature map + num_outs=5), # The number of output scales + rpn_head=dict( + type='RPNHead', # The type of RPN head is 'RPNHead', we also support 'GARPNHead', etc. Refer to https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/dense_heads/rpn_head.py#L12 for more details. + in_channels=256, # The input channels of each input feature map, this is consistent with the output channels of neck + feat_channels=256, # Feature channels of convolutional layers in the head. + anchor_generator=dict( # The config of anchor generator + type='AnchorGenerator', # Most of methods use AnchorGenerator, SSD Detectors uses `SSDAnchorGenerator`. Refer to https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/anchor/anchor_generator.py#L10 for more details + scales=[8], # Basic scale of the anchor, the area of the anchor in one position of a feature map will be scale * base_sizes + ratios=[0.5, 1.0, 2.0], # The ratio between height and width. + strides=[4, 8, 16, 32, 64]), # The strides of the anchor generator. This is consistent with the FPN feature strides. The strides will be taken as base_sizes if base_sizes is not set. + bbox_coder=dict( # Config of box coder to encode and decode the boxes during training and testing + type='DeltaXYWHBBoxCoder', # Type of box coder. 'DeltaXYWHBBoxCoder' is applied for most of methods. Refer to https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/bbox/coder/delta_xywh_bbox_coder.py#L9 for more details. + target_means=[0.0, 0.0, 0.0, 0.0], # The target means used to encode and decode boxes + target_stds=[1.0, 1.0, 1.0, 1.0]), # The standard variance used to encode and decode boxes + loss_cls=dict( # Config of loss function for the classification branch + type='CrossEntropyLoss', # Type of loss for classification branch, we also support FocalLoss etc. + use_sigmoid=True, # RPN usually perform two-class classification, so it usually uses sigmoid function. + loss_weight=1.0), # Loss weight of the classification branch. + loss_bbox=dict( # Config of loss function for the regression branch. + type='L1Loss', # Type of loss, we also support many IoU Losses and smooth L1-loss, etc. Refer to https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/losses/smooth_l1_loss.py#L56 for implementation. + loss_weight=1.0)), # Loss weight of the regression branch. + roi_head=dict( # RoIHead encapsulates the second stage of two-stage/cascade detectors. + type='StandardRoIHead', # Type of the RoI head. Refer to https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/roi_heads/standard_roi_head.py#L10 for implementation. + bbox_roi_extractor=dict( # RoI feature extractor for bbox regression. + type='SingleRoIExtractor', # Type of the RoI feature extractor, most of methods uses SingleRoIExtractor. Refer to https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/roi_heads/roi_extractors/single_level.py#L10 for details. + roi_layer=dict( # Config of RoI Layer + type='RoIAlign', # Type of RoI Layer, DeformRoIPoolingPack and ModulatedDeformRoIPoolingPack are also supported. Refer to https://github.com/open-mmlab/mmdetection/blob/master/mmdet/ops/roi_align/roi_align.py#L79 for details. + output_size=7, # The output size of feature maps. + sampling_ratio=0), # Sampling ratio when extracting the RoI features. 0 means adaptive ratio. + out_channels=256, # output channels of the extracted feature. + featmap_strides=[4, 8, 16, 32]), # Strides of multi-scale feature maps. It should be consistent to the architecture of the backbone. + bbox_head=dict( # Config of box head in the RoIHead. + type='Shared2FCBBoxHead', # Type of the bbox head, Refer to https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/roi_heads/bbox_heads/convfc_bbox_head.py#L177 for implementation details. + in_channels=256, # Input channels for bbox head. This is consistent with the out_channels in roi_extractor + fc_out_channels=1024, # Output feature channels of FC layers. + roi_feat_size=7, # Size of RoI features + num_classes=80, # Number of classes for classification + bbox_coder=dict( # Box coder used in the second stage. + type='DeltaXYWHBBoxCoder', # Type of box coder. 'DeltaXYWHBBoxCoder' is applied for most of methods. + target_means=[0.0, 0.0, 0.0, 0.0], # Means used to encode and decode box + target_stds=[0.1, 0.1, 0.2, 0.2]), # Standard variance for encoding and decoding. It is smaller since the boxes are more accurate. [0.1, 0.1, 0.2, 0.2] is a conventional setting. + reg_class_agnostic=False, # Whether the regression is class agnostic. + loss_cls=dict( # Config of loss function for the classification branch + type='CrossEntropyLoss', # Type of loss for classification branch, we also support FocalLoss etc. + use_sigmoid=False, # Whether to use sigmoid. + loss_weight=1.0), # Loss weight of the classification branch. + loss_bbox=dict( # Config of loss function for the regression branch. + type='L1Loss', # Type of loss, we also support many IoU Losses and smooth L1-loss, etc. + loss_weight=1.0)), # Loss weight of the regression branch. + mask_roi_extractor=dict( # RoI feature extractor for mask generation. + type='SingleRoIExtractor', # Type of the RoI feature extractor, most of methods uses SingleRoIExtractor. + roi_layer=dict( # Config of RoI Layer that extracts features for instance segmentation + type='RoIAlign', # Type of RoI Layer, DeformRoIPoolingPack and ModulatedDeformRoIPoolingPack are also supported + output_size=14, # The output size of feature maps. + sampling_ratio=0), # Sampling ratio when extracting the RoI features. + out_channels=256, # Output channels of the extracted feature. + featmap_strides=[4, 8, 16, 32]), # Strides of multi-scale feature maps. + mask_head=dict( # Mask prediction head + type='FCNMaskHead', # Type of mask head, refer to https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/roi_heads/mask_heads/fcn_mask_head.py#L21 for implementation details. + num_convs=4, # Number of convolutional layers in mask head. + in_channels=256, # Input channels, should be consistent with the output channels of mask roi extractor. + conv_out_channels=256, # Output channels of the convolutional layer. + num_classes=80, # Number of class to be segmented. + loss_mask=dict( # Config of loss function for the mask branch. + type='CrossEntropyLoss', # Type of loss used for segmentation + use_mask=True, # Whether to only train the mask in the correct class. + loss_weight=1.0))), # Loss weight of mask branch. + train_cfg = dict( # Config of training hyperparameters for rpn and rcnn + rpn=dict( # Training config of rpn + assigner=dict( # Config of assigner + type='MaxIoUAssigner', # Type of assigner, MaxIoUAssigner is used for many common detectors. Refer to https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/bbox/assigners/max_iou_assigner.py#L10 for more details. + pos_iou_thr=0.7, # IoU >= threshold 0.7 will be taken as positive samples + neg_iou_thr=0.3, # IoU < threshold 0.3 will be taken as negative samples + min_pos_iou=0.3, # The minimal IoU threshold to take boxes as positive samples + match_low_quality=True, # Whether to match the boxes under low quality (see API doc for more details). + ignore_iof_thr=-1), # IoF threshold for ignoring bboxes + sampler=dict( # Config of positive/negative sampler + type='RandomSampler', # Type of sampler, PseudoSampler and other samplers are also supported. Refer to https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/bbox/samplers/random_sampler.py#L8 for implementation details. + num=256, # Number of samples + pos_fraction=0.5, # The ratio of positive samples in the total samples. + neg_pos_ub=-1, # The upper bound of negative samples based on the number of positive samples. + add_gt_as_proposals=False), # Whether add GT as proposals after sampling. + allowed_border=-1, # The border allowed after padding for valid anchors. + pos_weight=-1, # The weight of positive samples during training. + debug=False), # Whether to set the debug mode + rpn_proposal=dict( # The config to generate proposals during training + nms_across_levels=False, # Whether to do NMS for boxes across levels. Only work in `GARPNHead`, naive rpn does not support do nms cross levels. + nms_pre=2000, # The number of boxes before NMS + nms_post=1000, # The number of boxes to be kept by NMS, Only work in `GARPNHead`. + max_per_img=1000, # The number of boxes to be kept after NMS. + nms=dict( # Config of NMS + type='nms', # Type of NMS + iou_threshold=0.7 # NMS threshold + ), + min_bbox_size=0), # The allowed minimal box size + rcnn=dict( # The config for the roi heads. + assigner=dict( # Config of assigner for second stage, this is different for that in rpn + type='MaxIoUAssigner', # Type of assigner, MaxIoUAssigner is used for all roi_heads for now. Refer to https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/bbox/assigners/max_iou_assigner.py#L10 for more details. + pos_iou_thr=0.5, # IoU >= threshold 0.5 will be taken as positive samples + neg_iou_thr=0.5, # IoU < threshold 0.5 will be taken as negative samples + min_pos_iou=0.5, # The minimal IoU threshold to take boxes as positive samples + match_low_quality=False, # Whether to match the boxes under low quality (see API doc for more details). + ignore_iof_thr=-1), # IoF threshold for ignoring bboxes + sampler=dict( + type='RandomSampler', # Type of sampler, PseudoSampler and other samplers are also supported. Refer to https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/bbox/samplers/random_sampler.py#L8 for implementation details. + num=512, # Number of samples + pos_fraction=0.25, # The ratio of positive samples in the total samples. + neg_pos_ub=-1, # The upper bound of negative samples based on the number of positive samples. + add_gt_as_proposals=True + ), # Whether add GT as proposals after sampling. + mask_size=28, # Size of mask + pos_weight=-1, # The weight of positive samples during training. + debug=False)), # Whether to set the debug mode + test_cfg = dict( # Config for testing hyperparameters for rpn and rcnn + rpn=dict( # The config to generate proposals during testing + nms_across_levels=False, # Whether to do NMS for boxes across levels. Only work in `GARPNHead`, naive rpn does not support do nms cross levels. + nms_pre=1000, # The number of boxes before NMS + nms_post=1000, # The number of boxes to be kept by NMS, Only work in `GARPNHead`. + max_per_img=1000, # The number of boxes to be kept after NMS. + nms=dict( # Config of NMS + type='nms', #Type of NMS + iou_threshold=0.7 # NMS threshold + ), + min_bbox_size=0), # The allowed minimal box size + rcnn=dict( # The config for the roi heads. + score_thr=0.05, # Threshold to filter out boxes + nms=dict( # Config of NMS in the second stage + type='nms', # Type of NMS + iou_thr=0.5), # NMS threshold + max_per_img=100, # Max number of detections of each image + mask_thr_binary=0.5))) # Threshold of mask prediction + +dataset_type = 'CocoDataset' # Dataset type, this will be used to define the dataset +data_root = 'data/coco/' # Root path of data +img_norm_cfg = dict( # Image normalization config to normalize the input images + mean=[123.675, 116.28, 103.53], # Mean values used to pre-training the pre-trained backbone models + std=[58.395, 57.12, 57.375], # Standard variance used to pre-training the pre-trained backbone models + to_rgb=True +) # The channel orders of image used to pre-training the pre-trained backbone models +train_pipeline = [ # Training pipeline + dict(type='LoadImageFromFile'), # First pipeline to load images from file path + dict( + type='LoadAnnotations', # Second pipeline to load annotations for current image + with_bbox=True, # Whether to use bounding box, True for detection + with_mask=True, # Whether to use instance mask, True for instance segmentation + poly2mask=False), # Whether to convert the polygon mask to instance mask, set False for acceleration and to save memory + dict( + type='Resize', # Augmentation pipeline that resize the images and their annotations + img_scale=(1333, 800), # The largest scale of image + keep_ratio=True + ), # whether to keep the ratio between height and width. + dict( + type='RandomFlip', # Augmentation pipeline that flip the images and their annotations + flip_ratio=0.5), # The ratio or probability to flip + dict( + type='Normalize', # Augmentation pipeline that normalize the input images + mean=[123.675, 116.28, 103.53], # These keys are the same of img_norm_cfg since the + std=[58.395, 57.12, 57.375], # keys of img_norm_cfg are used here as arguments + to_rgb=True), + dict( + type='Pad', # Padding config + size_divisor=32), # The number the padded images should be divisible + dict(type='DefaultFormatBundle'), # Default format bundle to gather data in the pipeline + dict( + type='Collect', # Pipeline that decides which keys in the data should be passed to the detector + keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), # First pipeline to load images from file path + dict( + type='MultiScaleFlipAug', # An encapsulation that encapsulates the testing augmentations + img_scale=(1333, 800), # Decides the largest scale for testing, used for the Resize pipeline + flip=False, # Whether to flip images during testing + transforms=[ + dict(type='Resize', # Use resize augmentation + keep_ratio=True), # Whether to keep the ratio between height and width, the img_scale set here will be suppressed by the img_scale set above. + dict(type='RandomFlip'), # Thought RandomFlip is added in pipeline, it is not used because flip=False + dict( + type='Normalize', # Normalization config, the values are from img_norm_cfg + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True), + dict( + type='Pad', # Padding config to pad images divisible by 32. + size_divisor=32), + dict( + type='ImageToTensor', # convert image to tensor + keys=['img']), + dict( + type='Collect', # Collect pipeline that collect necessary keys for testing. + keys=['img']) + ]) +] +data = dict( + samples_per_gpu=2, # Batch size of a single GPU + workers_per_gpu=2, # Worker to pre-fetch data for each single GPU + train=dict( # Train dataset config + type='CocoDataset', # Type of dataset, refer to https://github.com/open-mmlab/mmdetection/blob/master/mmdet/datasets/coco.py#L19 for details. + ann_file='data/coco/annotations/instances_train2017.json', # Path of annotation file + img_prefix='data/coco/train2017/', # Prefix of image path + pipeline=[ # pipeline, this is passed by the train_pipeline created before. + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', + with_bbox=True, + with_mask=True, + poly2mask=False), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='Normalize', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict( + type='Collect', + keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']) + ]), + val=dict( # Validation dataset config + type='CocoDataset', + ann_file='data/coco/annotations/instances_val2017.json', + img_prefix='data/coco/val2017/', + pipeline=[ # Pipeline is passed by test_pipeline created before + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict( + type='Normalize', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) + ]), + test=dict( # Test dataset config, modify the ann_file for test-dev/test submission + type='CocoDataset', + ann_file='data/coco/annotations/instances_val2017.json', + img_prefix='data/coco/val2017/', + pipeline=[ # Pipeline is passed by test_pipeline created before + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict( + type='Normalize', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) + ], + samples_per_gpu=2 # Batch size of a single GPU used in testing + )) +evaluation = dict( # The config to build the evaluation hook, refer to https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/evaluation/eval_hooks.py#L7 for more details. + interval=1, # Evaluation interval + metric=['bbox', 'segm']) # Metrics used during evaluation +optimizer = dict( # Config used to build optimizer, support all the optimizers in PyTorch whose arguments are also the same as those in PyTorch + type='SGD', # Type of optimizers, refer to https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/optimizer/default_constructor.py#L13 for more details + lr=0.02, # Learning rate of optimizers, see detail usages of the parameters in the documentation of PyTorch + momentum=0.9, # Momentum + weight_decay=0.0001) # Weight decay of SGD +optimizer_config = dict( # Config used to build the optimizer hook, refer to https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/optimizer.py#L8 for implementation details. + grad_clip=None) # Most of the methods do not use gradient clip +lr_config = dict( # Learning rate scheduler config used to register LrUpdater hook + policy='step', # The policy of scheduler, also support CosineAnnealing, Cyclic, etc. Refer to details of supported LrUpdater from https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/lr_updater.py#L9. + warmup='linear', # The warmup policy, also support `exp` and `constant`. + warmup_iters=500, # The number of iterations for warmup + warmup_ratio= + 0.001, # The ratio of the starting learning rate used for warmup + step=[8, 11]) # Steps to decay the learning rate +runner = dict( + type='EpochBasedRunner', # Type of runner to use (i.e. IterBasedRunner or EpochBasedRunner) + max_epochs=12) # Runner that runs the workflow in total max_epochs. For IterBasedRunner use `max_iters` +checkpoint_config = dict( # Config to set the checkpoint hook, Refer to https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/checkpoint.py for implementation. + interval=1) # The save interval is 1 +log_config = dict( # config to register logger hook + interval=50, # Interval to print the log + hooks=[ + dict(type='TextLoggerHook', by_epoch=False), + dict(type='TensorboardLoggerHook', by_epoch=False), + dict(type='MMDetWandbHook', by_epoch=False, # The Wandb logger is also supported, It requires `wandb` to be installed. + init_kwargs={'entity': "OpenMMLab", # The entity used to log on Wandb + 'project': "MMDet", # Project name in WandB + 'config': cfg_dict}), # Check https://docs.wandb.ai/ref/python/init for more init arguments. + # MMDetWandbHook is mmdet implementation of WandbLoggerHook. ClearMLLoggerHook, DvcliveLoggerHook, MlflowLoggerHook, NeptuneLoggerHook, PaviLoggerHook, SegmindLoggerHook are also supported based on MMCV implementation. + ]) # The logger used to record the training process. + +dist_params = dict(backend='nccl') # Parameters to setup distributed training, the port can also be set. +log_level = 'INFO' # The level of logging. +load_from = None # load models as a pre-trained model from a given path. This will not resume training. +resume_from = None # Resume checkpoints from a given path, the training will be resumed from the epoch when the checkpoint's is saved. +workflow = [('train', 1)] # Workflow for runner. [('train', 1)] means there is only one workflow and the workflow named 'train' is executed once. The workflow trains the model by 12 epochs according to the total_epochs. +work_dir = 'work_dir' # Directory to save the model checkpoints and logs for the current experiments. +``` + +## FAQ + +### Ignore some fields in the base configs + +Sometimes, you may set `_delete_=True` to ignore some of fields in base configs. +You may refer to [mmcv](https://mmcv.readthedocs.io/en/latest/understand_mmcv/config.html#inherit-from-base-config-with-ignored-fields) for simple illustration. + +In MMDetection, for example, to change the backbone of Mask R-CNN with the following config. + +```python +model = dict( + type='MaskRCNN', + pretrained='torchvision://resnet50', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch'), + neck=dict(...), + rpn_head=dict(...), + roi_head=dict(...)) +``` + +`ResNet` and `HRNet` use different keywords to construct. + +```python +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w32', + backbone=dict( + _delete_=True, + type='HRNet', + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(32, 64)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(32, 64, 128)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(32, 64, 128, 256)))), + neck=dict(...)) +``` + +The `_delete_=True` would replace all old keys in `backbone` field with new keys. + +### Use intermediate variables in configs + +Some intermediate variables are used in the configs files, like `train_pipeline`/`test_pipeline` in datasets. +It's worth noting that when modifying intermediate variables in the children configs, user need to pass the intermediate variables into corresponding fields again. +For example, we would like to use multi scale strategy to train a Mask R-CNN. `train_pipeline`/`test_pipeline` are intermediate variable we would like modify. + +```python +_base_ = './mask_rcnn_r50_fpn_1x_coco.py' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode="value", + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +``` + +We first define the new `train_pipeline`/`test_pipeline` and pass them into `data`. + +Similarly, if we would like to switch from `SyncBN` to `BN` or `MMSyncBN`, we need to substitute every `norm_cfg` in the config. + +```python +_base_ = './mask_rcnn_r50_fpn_1x_coco.py' +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + backbone=dict(norm_cfg=norm_cfg), + neck=dict(norm_cfg=norm_cfg), + ...) +``` diff --git a/docs/en/tutorials/customize_dataset.md b/docs/en/tutorials/customize_dataset.md new file mode 100644 index 0000000..3237f16 --- /dev/null +++ b/docs/en/tutorials/customize_dataset.md @@ -0,0 +1,542 @@ +# Tutorial 2: Customize Datasets + +## Support new data format + +To support a new data format, you can either convert them to existing formats (COCO format or PASCAL format) or directly convert them to the middle format. You could also choose to convert them offline (before training by a script) or online (implement a new dataset and do the conversion at training). In MMDetection, we recommend to convert the data into COCO formats and do the conversion offline, thus you only need to modify the config's data annotation paths and classes after the conversion of your data. + +### Reorganize new data formats to existing format + +The simplest way is to convert your dataset to existing dataset formats (COCO or PASCAL VOC). + +The annotation json files in COCO format has the following necessary keys: + +```python +'images': [ + { + 'file_name': 'COCO_val2014_000000001268.jpg', + 'height': 427, + 'width': 640, + 'id': 1268 + }, + ... +], + +'annotations': [ + { + 'segmentation': [[192.81, + 247.09, + ... + 219.03, + 249.06]], # if you have mask labels + 'area': 1035.749, + 'iscrowd': 0, + 'image_id': 1268, + 'bbox': [192.81, 224.8, 74.73, 33.43], + 'category_id': 16, + 'id': 42986 + }, + ... +], + +'categories': [ + {'id': 0, 'name': 'car'}, + ] +``` + +There are three necessary keys in the json file: + +- `images`: contains a list of images with their information like `file_name`, `height`, `width`, and `id`. +- `annotations`: contains the list of instance annotations. +- `categories`: contains the list of categories names and their ID. + +After the data pre-processing, there are two steps for users to train the customized new dataset with existing format (e.g. COCO format): + +1. Modify the config file for using the customized dataset. +2. Check the annotations of the customized dataset. + +Here we give an example to show the above two steps, which uses a customized dataset of 5 classes with COCO format to train an existing Cascade Mask R-CNN R50-FPN detector. + +#### 1. Modify the config file for using the customized dataset + +There are two aspects involved in the modification of config file: + +1. The `data` field. Specifically, you need to explicitly add the `classes` fields in `data.train`, `data.val` and `data.test`. +2. The `num_classes` field in the `model` part. Explicitly over-write all the `num_classes` from default value (e.g. 80 in COCO) to your classes number. + +In `configs/my_custom_config.py`: + +```python + +# the new config inherits the base configs to highlight the necessary modification +_base_ = './cascade_mask_rcnn_r50_fpn_1x_coco.py' + +# 1. dataset settings +dataset_type = 'CocoDataset' +classes = ('a', 'b', 'c', 'd', 'e') +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + # explicitly add your class names to the field `classes` + classes=classes, + ann_file='path/to/your/train/annotation_data', + img_prefix='path/to/your/train/image_data'), + val=dict( + type=dataset_type, + # explicitly add your class names to the field `classes` + classes=classes, + ann_file='path/to/your/val/annotation_data', + img_prefix='path/to/your/val/image_data'), + test=dict( + type=dataset_type, + # explicitly add your class names to the field `classes` + classes=classes, + ann_file='path/to/your/test/annotation_data', + img_prefix='path/to/your/test/image_data')) + +# 2. model settings + +# explicitly over-write all the `num_classes` field from default 80 to 5. +model = dict( + roi_head=dict( + bbox_head=[ + dict( + type='Shared2FCBBoxHead', + # explicitly over-write all the `num_classes` field from default 80 to 5. + num_classes=5), + dict( + type='Shared2FCBBoxHead', + # explicitly over-write all the `num_classes` field from default 80 to 5. + num_classes=5), + dict( + type='Shared2FCBBoxHead', + # explicitly over-write all the `num_classes` field from default 80 to 5. + num_classes=5)], + # explicitly over-write all the `num_classes` field from default 80 to 5. + mask_head=dict(num_classes=5))) +``` + +#### 2. Check the annotations of the customized dataset + +Assuming your customized dataset is COCO format, make sure you have the correct annotations in the customized dataset: + +1. The length for `categories` field in annotations should exactly equal the tuple length of `classes` fields in your config, meaning the number of classes (e.g. 5 in this example). +2. The `classes` fields in your config file should have exactly the same elements and the same order with the `name` in `categories` of annotations. MMDetection automatically maps the uncontinuous `id` in `categories` to the continuous label indices, so the string order of `name` in `categories` field affects the order of label indices. Meanwhile, the string order of `classes` in config affects the label text during visualization of predicted bounding boxes. +3. The `category_id` in `annotations` field should be valid, i.e., all values in `category_id` should belong to `id` in `categories`. + +Here is a valid example of annotations: + +```python + +'annotations': [ + { + 'segmentation': [[192.81, + 247.09, + ... + 219.03, + 249.06]], # if you have mask labels + 'area': 1035.749, + 'iscrowd': 0, + 'image_id': 1268, + 'bbox': [192.81, 224.8, 74.73, 33.43], + 'category_id': 16, + 'id': 42986 + }, + ... +], + +# MMDetection automatically maps the uncontinuous `id` to the continuous label indices. +'categories': [ + {'id': 1, 'name': 'a'}, {'id': 3, 'name': 'b'}, {'id': 4, 'name': 'c'}, {'id': 16, 'name': 'd'}, {'id': 17, 'name': 'e'}, + ] +``` + +We use this way to support CityScapes dataset. The script is in [cityscapes.py](https://github.com/open-mmlab/mmdetection/blob/master/tools/dataset_converters/cityscapes.py) and we also provide the finetuning [configs](https://github.com/open-mmlab/mmdetection/blob/master/configs/cityscapes). + +**Note** + +1. For instance segmentation datasets, **MMDetection only supports evaluating mask AP of dataset in COCO format for now**. +2. It is recommended to convert the data offline before training, thus you can still use `CocoDataset` and only need to modify the path of annotations and the training classes. + +### Reorganize new data format to middle format + +It is also fine if you do not want to convert the annotation format to COCO or PASCAL format. +Actually, we define a simple annotation format and all existing datasets are +processed to be compatible with it, either online or offline. + +The annotation of a dataset is a list of dict, each dict corresponds to an image. +There are 3 field `filename` (relative path), `width`, `height` for testing, +and an additional field `ann` for training. `ann` is also a dict containing at least 2 fields: +`bboxes` and `labels`, both of which are numpy arrays. Some datasets may provide +annotations like crowd/difficult/ignored bboxes, we use `bboxes_ignore` and `labels_ignore` +to cover them. + +Here is an example. + +```python + +[ + { + 'filename': 'a.jpg', + 'width': 1280, + 'height': 720, + 'ann': { + 'bboxes': (n, 4), + 'labels': (n, ), + 'bboxes_ignore': (k, 4), + 'labels_ignore': (k, ) (optional field) + } + }, + ... +] +``` + +There are two ways to work with custom datasets. + +- online conversion + + You can write a new Dataset class inherited from `CustomDataset`, and overwrite two methods + `load_annotations(self, ann_file)` and `get_ann_info(self, idx)`, + like [CocoDataset](https://github.com/open-mmlab/mmdetection/blob/master/mmdet/datasets/coco.py) and [VOCDataset](https://github.com/open-mmlab/mmdetection/blob/master/mmdet/datasets/voc.py). + +- offline conversion + + You can convert the annotation format to the expected format above and save it to + a pickle or json file, like [pascal_voc.py](https://github.com/open-mmlab/mmdetection/blob/master/tools/dataset_converters/pascal_voc.py). + Then you can simply use `CustomDataset`. + +### An example of customized dataset + +Assume the annotation is in a new format in text files. +The bounding boxes annotations are stored in text file `annotation.txt` as the following + +``` +# +000001.jpg +1280 720 +2 +10 20 40 60 1 +20 40 50 60 2 +# +000002.jpg +1280 720 +3 +50 20 40 60 2 +20 40 30 45 2 +30 40 50 60 3 +``` + +We can create a new dataset in `mmdet/datasets/my_dataset.py` to load the data. + +```python +import mmcv +import numpy as np + +from .builder import DATASETS +from .custom import CustomDataset + + +@DATASETS.register_module() +class MyDataset(CustomDataset): + + CLASSES = ('person', 'bicycle', 'car', 'motorcycle') + + def load_annotations(self, ann_file): + ann_list = mmcv.list_from_file(ann_file) + + data_infos = [] + for i, ann_line in enumerate(ann_list): + if ann_line != '#': + continue + + img_shape = ann_list[i + 2].split(' ') + width = int(img_shape[0]) + height = int(img_shape[1]) + bbox_number = int(ann_list[i + 3]) + + anns = ann_line.split(' ') + bboxes = [] + labels = [] + for anns in ann_list[i + 4:i + 4 + bbox_number]: + bboxes.append([float(ann) for ann in anns[:4]]) + labels.append(int(anns[4])) + + data_infos.append( + dict( + filename=ann_list[i + 1], + width=width, + height=height, + ann=dict( + bboxes=np.array(bboxes).astype(np.float32), + labels=np.array(labels).astype(np.int64)) + )) + + return data_infos + + def get_ann_info(self, idx): + return self.data_infos[idx]['ann'] + +``` + +Then in the config, to use `MyDataset` you can modify the config as the following + +```python +dataset_A_train = dict( + type='MyDataset', + ann_file = 'image_list.txt', + pipeline=train_pipeline +) +``` + +## Customize datasets by dataset wrappers + +MMDetection also supports many dataset wrappers to mix the dataset or modify the dataset distribution for training. +Currently it supports to three dataset wrappers as below: + +- `RepeatDataset`: simply repeat the whole dataset. +- `ClassBalancedDataset`: repeat dataset in a class balanced manner. +- `ConcatDataset`: concat datasets. + +### Repeat dataset + +We use `RepeatDataset` as wrapper to repeat the dataset. For example, suppose the original dataset is `Dataset_A`, to repeat it, the config looks like the following + +```python +dataset_A_train = dict( + type='RepeatDataset', + times=N, + dataset=dict( # This is the original config of Dataset_A + type='Dataset_A', + ... + pipeline=train_pipeline + ) + ) +``` + +### Class balanced dataset + +We use `ClassBalancedDataset` as wrapper to repeat the dataset based on category +frequency. The dataset to repeat needs to instantiate function `self.get_cat_ids(idx)` +to support `ClassBalancedDataset`. +For example, to repeat `Dataset_A` with `oversample_thr=1e-3`, the config looks like the following + +```python +dataset_A_train = dict( + type='ClassBalancedDataset', + oversample_thr=1e-3, + dataset=dict( # This is the original config of Dataset_A + type='Dataset_A', + ... + pipeline=train_pipeline + ) + ) +``` + +You may refer to [source code](https://github.com/open-mmlab/mmdetection/blob/master/mmdet/datasets/dataset_wrappers.py#L211) for details. + +### Concatenate dataset + +There are three ways to concatenate the dataset. + +1. If the datasets you want to concatenate are in the same type with different annotation files, you can concatenate the dataset configs like the following. + + ```python + dataset_A_train = dict( + type='Dataset_A', + ann_file = ['anno_file_1', 'anno_file_2'], + pipeline=train_pipeline + ) + ``` + + If the concatenated dataset is used for test or evaluation, this manner supports to evaluate each dataset separately. To test the concatenated datasets as a whole, you can set `separate_eval=False` as below. + + ```python + dataset_A_train = dict( + type='Dataset_A', + ann_file = ['anno_file_1', 'anno_file_2'], + separate_eval=False, + pipeline=train_pipeline + ) + ``` + +2. In case the dataset you want to concatenate is different, you can concatenate the dataset configs like the following. + + ```python + dataset_A_train = dict() + dataset_B_train = dict() + + data = dict( + imgs_per_gpu=2, + workers_per_gpu=2, + train = [ + dataset_A_train, + dataset_B_train + ], + val = dataset_A_val, + test = dataset_A_test + ) + ``` + + If the concatenated dataset is used for test or evaluation, this manner also supports to evaluate each dataset separately. + +3. We also support to define `ConcatDataset` explicitly as the following. + + ```python + dataset_A_val = dict() + dataset_B_val = dict() + + data = dict( + imgs_per_gpu=2, + workers_per_gpu=2, + train=dataset_A_train, + val=dict( + type='ConcatDataset', + datasets=[dataset_A_val, dataset_B_val], + separate_eval=False)) + ``` + + This manner allows users to evaluate all the datasets as a single one by setting `separate_eval=False`. + +**Note:** + +1. The option `separate_eval=False` assumes the datasets use `self.data_infos` during evaluation. Therefore, COCO datasets do not support this behavior since COCO datasets do not fully rely on `self.data_infos` for evaluation. Combining different types of datasets and evaluating them as a whole is not tested thus is not suggested. +2. Evaluating `ClassBalancedDataset` and `RepeatDataset` is not supported thus evaluating concatenated datasets of these types is also not supported. + +A more complex example that repeats `Dataset_A` and `Dataset_B` by N and M times, respectively, and then concatenates the repeated datasets is as the following. + +```python +dataset_A_train = dict( + type='RepeatDataset', + times=N, + dataset=dict( + type='Dataset_A', + ... + pipeline=train_pipeline + ) +) +dataset_A_val = dict( + ... + pipeline=test_pipeline +) +dataset_A_test = dict( + ... + pipeline=test_pipeline +) +dataset_B_train = dict( + type='RepeatDataset', + times=M, + dataset=dict( + type='Dataset_B', + ... + pipeline=train_pipeline + ) +) +data = dict( + imgs_per_gpu=2, + workers_per_gpu=2, + train = [ + dataset_A_train, + dataset_B_train + ], + val = dataset_A_val, + test = dataset_A_test +) + +``` + +## Modify Dataset Classes + +With existing dataset types, we can modify the class names of them to train subset of the annotations. +For example, if you want to train only three classes of the current dataset, +you can modify the classes of dataset. +The dataset will filter out the ground truth boxes of other classes automatically. + +```python +classes = ('person', 'bicycle', 'car') +data = dict( + train=dict(classes=classes), + val=dict(classes=classes), + test=dict(classes=classes)) +``` + +MMDetection V2.0 also supports to read the classes from a file, which is common in real applications. +For example, assume the `classes.txt` contains the name of classes as the following. + +``` +person +bicycle +car +``` + +Users can set the classes as a file path, the dataset will load it and convert it to a list automatically. + +```python +classes = 'path/to/classes.txt' +data = dict( + train=dict(classes=classes), + val=dict(classes=classes), + test=dict(classes=classes)) +``` + +**Note**: + +- Before MMDetection v2.5.0, the dataset will filter out the empty GT images automatically if the classes are set and there is no way to disable that through config. This is an undesirable behavior and introduces confusion because if the classes are not set, the dataset only filter the empty GT images when `filter_empty_gt=True` and `test_mode=False`. After MMDetection v2.5.0, we decouple the image filtering process and the classes modification, i.e., the dataset will only filter empty GT images when `filter_empty_gt=True` and `test_mode=False`, no matter whether the classes are set. Thus, setting the classes only influences the annotations of classes used for training and users could decide whether to filter empty GT images by themselves. +- Since the middle format only has box labels and does not contain the class names, when using `CustomDataset`, users cannot filter out the empty GT images through configs but only do this offline. +- Please remember to modify the `num_classes` in the head when specifying `classes` in dataset. We implemented [NumClassCheckHook](https://github.com/open-mmlab/mmdetection/blob/master/mmdet/datasets/utils.py) to check whether the numbers are consistent since v2.9.0(after PR#4508). +- The features for setting dataset classes and dataset filtering will be refactored to be more user-friendly in the future (depends on the progress). + +## COCO Panoptic Dataset + +Now we support COCO Panoptic Dataset, the format of panoptic annotations is different from COCO format. +Both the foreground and the background will exist in the annotation file. +The annotation json files in COCO Panoptic format has the following necessary keys: + +```python +'images': [ + { + 'file_name': '000000001268.jpg', + 'height': 427, + 'width': 640, + 'id': 1268 + }, + ... +] + +'annotations': [ + { + 'filename': '000000001268.jpg', + 'image_id': 1268, + 'segments_info': [ + { + 'id':8345037, # One-to-one correspondence with the id in the annotation map. + 'category_id': 51, + 'iscrowd': 0, + 'bbox': (x1, y1, w, h), # The bbox of the background is the outer rectangle of its mask. + 'area': 24315 + }, + ... + ] + }, + ... +] + +'categories': [ # including both foreground categories and background categories + {'id': 0, 'name': 'person'}, + ... + ] +``` + +Moreover, the `seg_prefix` must be set to the path of the panoptic annotation images. + +```python +data = dict( + type='CocoPanopticDataset', + train=dict( + seg_prefix = 'path/to/your/train/panoptic/image_annotation_data' + ), + val=dict( + seg_prefix = 'path/to/your/train/panoptic/image_annotation_data' + ) +) +``` diff --git a/docs/en/tutorials/customize_losses.md b/docs/en/tutorials/customize_losses.md new file mode 100644 index 0000000..5c00368 --- /dev/null +++ b/docs/en/tutorials/customize_losses.md @@ -0,0 +1,126 @@ +# Tutorial 6: Customize Losses + +MMDetection provides users with different loss functions. But the default configuration may be not applicable for different datasets or models, so users may want to modify a specific loss to adapt the new situation. + +This tutorial first elaborate the computation pipeline of losses, then give some instructions about how to modify each step. The modification can be categorized as tweaking and weighting. + +## Computation pipeline of a loss + +Given the input prediction and target, as well as the weights, a loss function maps the input tensor to the final loss scalar. The mapping can be divided into five steps: + +1. Set the sampling method to sample positive and negative samples. + +2. Get **element-wise** or **sample-wise** loss by the loss kernel function. + +3. Weighting the loss with a weight tensor **element-wisely**. + +4. Reduce the loss tensor to a **scalar**. + +5. Weighting the loss with a **scalar**. + +## Set sampling method (step 1) + +For some loss functions, sampling strategies are needed to avoid imbalance between positive and negative samples. + +For example, when using `CrossEntropyLoss` in RPN head, we need to set `RandomSampler` in `train_cfg` + +```python +train_cfg=dict( + rpn=dict( + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False)) +``` + +For some other losses which have positive and negative sample balance mechanism such as Focal Loss, GHMC, and QualityFocalLoss, the sampler is no more necessary. + +## Tweaking loss + +Tweaking a loss is more related with step 2, 4, 5, and most modifications can be specified in the config. +Here we take [Focal Loss (FL)](https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/losses/focal_loss.py) as an example. +The following code sniper are the construction method and config of FL respectively, they are actually one to one correspondence. + +```python +@LOSSES.register_module() +class FocalLoss(nn.Module): + + def __init__(self, + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + reduction='mean', + loss_weight=1.0): +``` + +```python +loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0) +``` + +### Tweaking hyper-parameters (step 2) + +`gamma` and `beta` are two hyper-parameters in the Focal Loss. Say if we want to change the value of `gamma` to be 1.5 and `alpha` to be 0.5, then we can specify them in the config as follows: + +```python +loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=1.5, + alpha=0.5, + loss_weight=1.0) +``` + +### Tweaking the way of reduction (step 3) + +The default way of reduction is `mean` for FL. Say if we want to change the reduction from `mean` to `sum`, we can specify it in the config as follows: + +```python +loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0, + reduction='sum') +``` + +### Tweaking loss weight (step 5) + +The loss weight here is a scalar which controls the weight of different losses in multi-task learning, e.g. classification loss and regression loss. Say if we want to change to loss weight of classification loss to be 0.5, we can specify it in the config as follows: + +```python +loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=0.5) +``` + +## Weighting loss (step 3) + +Weighting loss means we re-weight the loss element-wisely. To be more specific, we multiply the loss tensor with a weight tensor which has the same shape. As a result, different entries of the loss can be scaled differently, and so called element-wisely. +The loss weight varies across different models and highly context related, but overall there are two kinds of loss weights, `label_weights` for classification loss and `bbox_weights` for bbox regression loss. You can find them in the `get_target` method of the corresponding head. Here we take [ATSSHead](https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/dense_heads/atss_head.py#L530) as an example, which inherit [AnchorHead](https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/dense_heads/anchor_head.py) but overwrite its `get_targets` method which yields different `label_weights` and `bbox_weights`. + +``` +class ATSSHead(AnchorHead): + + ... + + def get_targets(self, + anchor_list, + valid_flag_list, + gt_bboxes_list, + img_metas, + gt_bboxes_ignore_list=None, + gt_labels_list=None, + label_channels=1, + unmap_outputs=True): +``` diff --git a/docs/en/tutorials/customize_models.md b/docs/en/tutorials/customize_models.md new file mode 100644 index 0000000..81c3912 --- /dev/null +++ b/docs/en/tutorials/customize_models.md @@ -0,0 +1,363 @@ +# Tutorial 4: Customize Models + +We basically categorize model components into 5 types. + +- backbone: usually an FCN network to extract feature maps, e.g., ResNet, MobileNet. +- neck: the component between backbones and heads, e.g., FPN, PAFPN. +- head: the component for specific tasks, e.g., bbox prediction and mask prediction. +- roi extractor: the part for extracting RoI features from feature maps, e.g., RoI Align. +- loss: the component in head for calculating losses, e.g., FocalLoss, L1Loss, and GHMLoss. + +## Develop new components + +### Add a new backbone + +Here we show how to develop new components with an example of MobileNet. + +#### 1. Define a new backbone (e.g. MobileNet) + +Create a new file `mmdet/models/backbones/mobilenet.py`. + +```python +import torch.nn as nn + +from ..builder import BACKBONES + + +@BACKBONES.register_module() +class MobileNet(nn.Module): + + def __init__(self, arg1, arg2): + pass + + def forward(self, x): # should return a tuple + pass +``` + +#### 2. Import the module + +You can either add the following line to `mmdet/models/backbones/__init__.py` + +```python +from .mobilenet import MobileNet +``` + +or alternatively add + +```python +custom_imports = dict( + imports=['mmdet.models.backbones.mobilenet'], + allow_failed_imports=False) +``` + +to the config file to avoid modifying the original code. + +#### 3. Use the backbone in your config file + +```python +model = dict( + ... + backbone=dict( + type='MobileNet', + arg1=xxx, + arg2=xxx), + ... +``` + +### Add new necks + +#### 1. Define a neck (e.g. PAFPN) + +Create a new file `mmdet/models/necks/pafpn.py`. + +```python +from ..builder import NECKS + +@NECKS.register_module() +class PAFPN(nn.Module): + + def __init__(self, + in_channels, + out_channels, + num_outs, + start_level=0, + end_level=-1, + add_extra_convs=False): + pass + + def forward(self, inputs): + # implementation is ignored + pass +``` + +#### 2. Import the module + +You can either add the following line to `mmdet/models/necks/__init__.py`, + +```python +from .pafpn import PAFPN +``` + +or alternatively add + +```python +custom_imports = dict( + imports=['mmdet.models.necks.pafpn.py'], + allow_failed_imports=False) +``` + +to the config file and avoid modifying the original code. + +#### 3. Modify the config file + +```python +neck=dict( + type='PAFPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5) +``` + +### Add new heads + +Here we show how to develop a new head with the example of [Double Head R-CNN](https://arxiv.org/abs/1904.06493) as the following. + +First, add a new bbox head in `mmdet/models/roi_heads/bbox_heads/double_bbox_head.py`. +Double Head R-CNN implements a new bbox head for object detection. +To implement a bbox head, basically we need to implement three functions of the new module as the following. + +```python +from mmdet.models.builder import HEADS +from .bbox_head import BBoxHead + +@HEADS.register_module() +class DoubleConvFCBBoxHead(BBoxHead): + r"""Bbox head used in Double-Head R-CNN + + /-> cls + /-> shared convs -> + \-> reg + roi features + /-> cls + \-> shared fc -> + \-> reg + """ # noqa: W605 + + def __init__(self, + num_convs=0, + num_fcs=0, + conv_out_channels=1024, + fc_out_channels=1024, + conv_cfg=None, + norm_cfg=dict(type='BN'), + **kwargs): + kwargs.setdefault('with_avg_pool', True) + super(DoubleConvFCBBoxHead, self).__init__(**kwargs) + + + def forward(self, x_cls, x_reg): + +``` + +Second, implement a new RoI Head if it is necessary. We plan to inherit the new `DoubleHeadRoIHead` from `StandardRoIHead`. We can find that a `StandardRoIHead` already implements the following functions. + +```python +import torch + +from mmdet.core import bbox2result, bbox2roi, build_assigner, build_sampler +from ..builder import HEADS, build_head, build_roi_extractor +from .base_roi_head import BaseRoIHead +from .test_mixins import BBoxTestMixin, MaskTestMixin + + +@HEADS.register_module() +class StandardRoIHead(BaseRoIHead, BBoxTestMixin, MaskTestMixin): + """Simplest base roi head including one bbox head and one mask head. + """ + + def init_assigner_sampler(self): + + def init_bbox_head(self, bbox_roi_extractor, bbox_head): + + def init_mask_head(self, mask_roi_extractor, mask_head): + + + def forward_dummy(self, x, proposals): + + + def forward_train(self, + x, + img_metas, + proposal_list, + gt_bboxes, + gt_labels, + gt_bboxes_ignore=None, + gt_masks=None): + + def _bbox_forward(self, x, rois): + + def _bbox_forward_train(self, x, sampling_results, gt_bboxes, gt_labels, + img_metas): + + def _mask_forward_train(self, x, sampling_results, bbox_feats, gt_masks, + img_metas): + + def _mask_forward(self, x, rois=None, pos_inds=None, bbox_feats=None): + + + def simple_test(self, + x, + proposal_list, + img_metas, + proposals=None, + rescale=False): + """Test without augmentation.""" + +``` + +Double Head's modification is mainly in the bbox_forward logic, and it inherits other logics from the `StandardRoIHead`. +In the `mmdet/models/roi_heads/double_roi_head.py`, we implement the new RoI Head as the following: + +```python +from ..builder import HEADS +from .standard_roi_head import StandardRoIHead + + +@HEADS.register_module() +class DoubleHeadRoIHead(StandardRoIHead): + """RoI head for Double Head RCNN + + https://arxiv.org/abs/1904.06493 + """ + + def __init__(self, reg_roi_scale_factor, **kwargs): + super(DoubleHeadRoIHead, self).__init__(**kwargs) + self.reg_roi_scale_factor = reg_roi_scale_factor + + def _bbox_forward(self, x, rois): + bbox_cls_feats = self.bbox_roi_extractor( + x[:self.bbox_roi_extractor.num_inputs], rois) + bbox_reg_feats = self.bbox_roi_extractor( + x[:self.bbox_roi_extractor.num_inputs], + rois, + roi_scale_factor=self.reg_roi_scale_factor) + if self.with_shared_head: + bbox_cls_feats = self.shared_head(bbox_cls_feats) + bbox_reg_feats = self.shared_head(bbox_reg_feats) + cls_score, bbox_pred = self.bbox_head(bbox_cls_feats, bbox_reg_feats) + + bbox_results = dict( + cls_score=cls_score, + bbox_pred=bbox_pred, + bbox_feats=bbox_cls_feats) + return bbox_results +``` + +Last, the users need to add the module in +`mmdet/models/bbox_heads/__init__.py` and `mmdet/models/roi_heads/__init__.py` thus the corresponding registry could find and load them. + +Alternatively, the users can add + +```python +custom_imports=dict( + imports=['mmdet.models.roi_heads.double_roi_head', 'mmdet.models.bbox_heads.double_bbox_head']) +``` + +to the config file and achieve the same goal. + +The config file of Double Head R-CNN is as the following + +```python +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + roi_head=dict( + type='DoubleHeadRoIHead', + reg_roi_scale_factor=1.3, + bbox_head=dict( + _delete_=True, + type='DoubleConvFCBBoxHead', + num_convs=4, + num_fcs=2, + in_channels=256, + conv_out_channels=1024, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=2.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=2.0)))) + +``` + +Since MMDetection 2.0, the config system supports to inherit configs such that the users can focus on the modification. +The Double Head R-CNN mainly uses a new DoubleHeadRoIHead and a new +`DoubleConvFCBBoxHead`, the arguments are set according to the `__init__` function of each module. + +### Add new loss + +Assume you want to add a new loss as `MyLoss`, for bounding box regression. +To add a new loss function, the users need implement it in `mmdet/models/losses/my_loss.py`. +The decorator `weighted_loss` enable the loss to be weighted for each element. + +```python +import torch +import torch.nn as nn + +from ..builder import LOSSES +from .utils import weighted_loss + +@weighted_loss +def my_loss(pred, target): + assert pred.size() == target.size() and target.numel() > 0 + loss = torch.abs(pred - target) + return loss + +@LOSSES.register_module() +class MyLoss(nn.Module): + + def __init__(self, reduction='mean', loss_weight=1.0): + super(MyLoss, self).__init__() + self.reduction = reduction + self.loss_weight = loss_weight + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None): + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + loss_bbox = self.loss_weight * my_loss( + pred, target, weight, reduction=reduction, avg_factor=avg_factor) + return loss_bbox +``` + +Then the users need to add it in the `mmdet/models/losses/__init__.py`. + +```python +from .my_loss import MyLoss, my_loss + +``` + +Alternatively, you can add + +```python +custom_imports=dict( + imports=['mmdet.models.losses.my_loss']) +``` + +to the config file and achieve the same goal. + +To use it, modify the `loss_xxx` field. +Since MyLoss is for regression, you need to modify the `loss_bbox` field in the head. + +```python +loss_bbox=dict(type='MyLoss', loss_weight=1.0)) +``` diff --git a/docs/en/tutorials/customize_runtime.md b/docs/en/tutorials/customize_runtime.md new file mode 100644 index 0000000..f08d90b --- /dev/null +++ b/docs/en/tutorials/customize_runtime.md @@ -0,0 +1,323 @@ +# Tutorial 5: Customize Runtime Settings + +## Customize optimization settings + +### Customize optimizer supported by Pytorch + +We already support to use all the optimizers implemented by PyTorch, and the only modification is to change the `optimizer` field of config files. +For example, if you want to use `ADAM` (note that the performance could drop a lot), the modification could be as the following. + +```python +optimizer = dict(type='Adam', lr=0.0003, weight_decay=0.0001) +``` + +To modify the learning rate of the model, the users only need to modify the `lr` in the config of optimizer. The users can directly set arguments following the [API doc](https://pytorch.org/docs/stable/optim.html?highlight=optim#module-torch.optim) of PyTorch. + +### Customize self-implemented optimizer + +#### 1. Define a new optimizer + +A customized optimizer could be defined as following. + +Assume you want to add a optimizer named `MyOptimizer`, which has arguments `a`, `b`, and `c`. +You need to create a new directory named `mmdet/core/optimizer`. +And then implement the new optimizer in a file, e.g., in `mmdet/core/optimizer/my_optimizer.py`: + +```python +from .registry import OPTIMIZERS +from torch.optim import Optimizer + + +@OPTIMIZERS.register_module() +class MyOptimizer(Optimizer): + + def __init__(self, a, b, c) + +``` + +#### 2. Add the optimizer to registry + +To find the above module defined above, this module should be imported into the main namespace at first. There are two options to achieve it. + +- Modify `mmdet/core/optimizer/__init__.py` to import it. + + The newly defined module should be imported in `mmdet/core/optimizer/__init__.py` so that the registry will + find the new module and add it: + +```python +from .my_optimizer import MyOptimizer +``` + +- Use `custom_imports` in the config to manually import it + +```python +custom_imports = dict(imports=['mmdet.core.optimizer.my_optimizer'], allow_failed_imports=False) +``` + +The module `mmdet.core.optimizer.my_optimizer` will be imported at the beginning of the program and the class `MyOptimizer` is then automatically registered. +Note that only the package containing the class `MyOptimizer` should be imported. +`mmdet.core.optimizer.my_optimizer.MyOptimizer` **cannot** be imported directly. + +Actually users can use a totally different file directory structure using this importing method, as long as the module root can be located in `PYTHONPATH`. + +#### 3. Specify the optimizer in the config file + +Then you can use `MyOptimizer` in `optimizer` field of config files. +In the configs, the optimizers are defined by the field `optimizer` like the following: + +```python +optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001) +``` + +To use your own optimizer, the field can be changed to + +```python +optimizer = dict(type='MyOptimizer', a=a_value, b=b_value, c=c_value) +``` + +### Customize optimizer constructor + +Some models may have some parameter-specific settings for optimization, e.g. weight decay for BatchNorm layers. +The users can do those fine-grained parameter tuning through customizing optimizer constructor. + +```python +from mmcv.utils import build_from_cfg + +from mmcv.runner.optimizer import OPTIMIZER_BUILDERS, OPTIMIZERS +from mmdet.utils import get_root_logger +from .my_optimizer import MyOptimizer + + +@OPTIMIZER_BUILDERS.register_module() +class MyOptimizerConstructor(object): + + def __init__(self, optimizer_cfg, paramwise_cfg=None): + + def __call__(self, model): + + return my_optimizer + +``` + +The default optimizer constructor is implemented [here](https://github.com/open-mmlab/mmcv/blob/9ecd6b0d5ff9d2172c49a182eaa669e9f27bb8e7/mmcv/runner/optimizer/default_constructor.py#L11), which could also serve as a template for new optimizer constructor. + +### Additional settings + +Tricks not implemented by the optimizer should be implemented through optimizer constructor (e.g., set parameter-wise learning rates) or hooks. We list some common settings that could stabilize the training or accelerate the training. Feel free to create PR, issue for more settings. + +- __Use gradient clip to stabilize training__: + Some models need gradient clip to clip the gradients to stabilize the training process. An example is as below: + + ```python + optimizer_config = dict( + _delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) + ``` + + If your config inherits the base config which already sets the `optimizer_config`, you might need `_delete_=True` to override the unnecessary settings. See the [config documentation](https://mmdetection.readthedocs.io/en/latest/tutorials/config.html) for more details. + +- __Use momentum schedule to accelerate model convergence__: + We support momentum scheduler to modify model's momentum according to learning rate, which could make the model converge in a faster way. + Momentum scheduler is usually used with LR scheduler, for example, the following config is used in 3D detection to accelerate convergence. + For more details, please refer to the implementation of [CyclicLrUpdater](https://github.com/open-mmlab/mmcv/blob/f48241a65aebfe07db122e9db320c31b685dc674/mmcv/runner/hooks/lr_updater.py#L327) and [CyclicMomentumUpdater](https://github.com/open-mmlab/mmcv/blob/f48241a65aebfe07db122e9db320c31b685dc674/mmcv/runner/hooks/momentum_updater.py#L130). + + ```python + lr_config = dict( + policy='cyclic', + target_ratio=(10, 1e-4), + cyclic_times=1, + step_ratio_up=0.4, + ) + momentum_config = dict( + policy='cyclic', + target_ratio=(0.85 / 0.95, 1), + cyclic_times=1, + step_ratio_up=0.4, + ) + ``` + +## Customize training schedules + +By default we use step learning rate with 1x schedule, this calls [`StepLRHook`](https://github.com/open-mmlab/mmcv/blob/f48241a65aebfe07db122e9db320c31b685dc674/mmcv/runner/hooks/lr_updater.py#L153) in MMCV. +We support many other learning rate schedule [here](https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/lr_updater.py), such as `CosineAnnealing` and `Poly` schedule. Here are some examples + +- Poly schedule: + + ```python + lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False) + ``` + +- ConsineAnnealing schedule: + + ```python + lr_config = dict( + policy='CosineAnnealing', + warmup='linear', + warmup_iters=1000, + warmup_ratio=1.0 / 10, + min_lr_ratio=1e-5) + ``` + +## Customize workflow + +Workflow is a list of (phase, epochs) to specify the running order and epochs. +By default it is set to be + +```python +workflow = [('train', 1)] +``` + +which means running 1 epoch for training. +Sometimes user may want to check some metrics (e.g. loss, accuracy) about the model on the validate set. +In such case, we can set the workflow as + +```python +[('train', 1), ('val', 1)] +``` + +so that 1 epoch for training and 1 epoch for validation will be run iteratively. + +**Note**: + +1. The parameters of model will not be updated during val epoch. +2. Keyword `total_epochs` in the config only controls the number of training epochs and will not affect the validation workflow. +3. Workflows `[('train', 1), ('val', 1)]` and `[('train', 1)]` will not change the behavior of `EvalHook` because `EvalHook` is called by `after_train_epoch` and validation workflow only affect hooks that are called through `after_val_epoch`. Therefore, the only difference between `[('train', 1), ('val', 1)]` and `[('train', 1)]` is that the runner will calculate losses on validation set after each training epoch. + +## Customize hooks + +### Customize self-implemented hooks + +#### 1. Implement a new hook + +There are some occasions when the users might need to implement a new hook. MMDetection supports customized hooks in training (#3395) since v2.3.0. Thus the users could implement a hook directly in mmdet or their mmdet-based codebases and use the hook by only modifying the config in training. +Before v2.3.0, the users need to modify the code to get the hook registered before training starts. +Here we give an example of creating a new hook in mmdet and using it in training. + +```python +from mmcv.runner import HOOKS, Hook + + +@HOOKS.register_module() +class MyHook(Hook): + + def __init__(self, a, b): + pass + + def before_run(self, runner): + pass + + def after_run(self, runner): + pass + + def before_epoch(self, runner): + pass + + def after_epoch(self, runner): + pass + + def before_iter(self, runner): + pass + + def after_iter(self, runner): + pass +``` + +Depending on the functionality of the hook, the users need to specify what the hook will do at each stage of the training in `before_run`, `after_run`, `before_epoch`, `after_epoch`, `before_iter`, and `after_iter`. + +#### 2. Register the new hook + +Then we need to make `MyHook` imported. Assuming the file is in `mmdet/core/utils/my_hook.py` there are two ways to do that: + +- Modify `mmdet/core/utils/__init__.py` to import it. + + The newly defined module should be imported in `mmdet/core/utils/__init__.py` so that the registry will + find the new module and add it: + +```python +from .my_hook import MyHook +``` + +- Use `custom_imports` in the config to manually import it + +```python +custom_imports = dict(imports=['mmdet.core.utils.my_hook'], allow_failed_imports=False) +``` + +#### 3. Modify the config + +```python +custom_hooks = [ + dict(type='MyHook', a=a_value, b=b_value) +] +``` + +You can also set the priority of the hook by adding key `priority` to `'NORMAL'` or `'HIGHEST'` as below + +```python +custom_hooks = [ + dict(type='MyHook', a=a_value, b=b_value, priority='NORMAL') +] +``` + +By default the hook's priority is set as `NORMAL` during registration. + +### Use hooks implemented in MMCV + +If the hook is already implemented in MMCV, you can directly modify the config to use the hook as below + +#### 4. Example: `NumClassCheckHook` + +We implement a customized hook named [NumClassCheckHook](https://github.com/open-mmlab/mmdetection/blob/master/mmdet/datasets/utils.py) to check whether the `num_classes` in head matches the length of `CLASSES` in `dataset`. + +We set it in [default_runtime.py](https://github.com/open-mmlab/mmdetection/blob/master/configs/_base_/default_runtime.py). + +```python +custom_hooks = [dict(type='NumClassCheckHook')] +``` + +### Modify default runtime hooks + +There are some common hooks that are not registered through `custom_hooks`, they are + +- log_config +- checkpoint_config +- evaluation +- lr_config +- optimizer_config +- momentum_config + +In those hooks, only the logger hook has the `VERY_LOW` priority, others' priority are `NORMAL`. +The above-mentioned tutorials already covers how to modify `optimizer_config`, `momentum_config`, and `lr_config`. +Here we reveal how what we can do with `log_config`, `checkpoint_config`, and `evaluation`. + +#### Checkpoint config + +The MMCV runner will use `checkpoint_config` to initialize [`CheckpointHook`](https://github.com/open-mmlab/mmcv/blob/9ecd6b0d5ff9d2172c49a182eaa669e9f27bb8e7/mmcv/runner/hooks/checkpoint.py#L9). + +```python +checkpoint_config = dict(interval=1) +``` + +The users could set `max_keep_ckpts` to save only small number of checkpoints or decide whether to store state dict of optimizer by `save_optimizer`. More details of the arguments are [here](https://mmcv.readthedocs.io/en/latest/api.html#mmcv.runner.CheckpointHook) + +#### Log config + +The `log_config` wraps multiple logger hooks and enables to set intervals. Now MMCV supports `WandbLoggerHook`, `MlflowLoggerHook`, and `TensorboardLoggerHook`. +The detail usages can be found in the [doc](https://mmcv.readthedocs.io/en/latest/api.html#mmcv.runner.LoggerHook). + +```python +log_config = dict( + interval=50, + hooks=[ + dict(type='TextLoggerHook'), + dict(type='TensorboardLoggerHook') + ]) +``` + +#### Evaluation config + +The config of `evaluation` will be used to initialize the [`EvalHook`](https://github.com/open-mmlab/mmdetection/blob/7a404a2c000620d52156774a5025070d9e00d918/mmdet/core/evaluation/eval_hooks.py#L8). +Except the key `interval`, other arguments such as `metric` will be passed to the `dataset.evaluate()` + +```python +evaluation = dict(interval=1, metric='bbox') +``` diff --git a/docs/en/tutorials/data_pipeline.md b/docs/en/tutorials/data_pipeline.md new file mode 100644 index 0000000..57a6db4 --- /dev/null +++ b/docs/en/tutorials/data_pipeline.md @@ -0,0 +1,199 @@ +# Tutorial 3: Customize Data Pipelines + +## Design of Data pipelines + +Following typical conventions, we use `Dataset` and `DataLoader` for data loading +with multiple workers. `Dataset` returns a dict of data items corresponding +the arguments of models' forward method. +Since the data in object detection may not be the same size (image size, gt bbox size, etc.), +we introduce a new `DataContainer` type in MMCV to help collect and distribute +data of different size. +See [here](https://github.com/open-mmlab/mmcv/blob/master/mmcv/parallel/data_container.py) for more details. + +The data preparation pipeline and the dataset is decomposed. Usually a dataset +defines how to process the annotations and a data pipeline defines all the steps to prepare a data dict. +A pipeline consists of a sequence of operations. Each operation takes a dict as input and also output a dict for the next transform. + +We present a classical pipeline in the following figure. The blue blocks are pipeline operations. With the pipeline going on, each operator can add new keys (marked as green) to the result dict or update the existing keys (marked as orange). +![pipeline figure](../../../resources/data_pipeline.png) + +The operations are categorized into data loading, pre-processing, formatting and test-time augmentation. + +Here is a pipeline example for Faster R-CNN. + +```python +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +``` + +For each operation, we list the related dict fields that are added/updated/removed. + +### Data loading + +`LoadImageFromFile` + +- add: img, img_shape, ori_shape + +`LoadAnnotations` + +- add: gt_bboxes, gt_bboxes_ignore, gt_labels, gt_masks, gt_semantic_seg, bbox_fields, mask_fields + +`LoadProposals` + +- add: proposals + +### Pre-processing + +`Resize` + +- add: scale, scale_idx, pad_shape, scale_factor, keep_ratio +- update: img, img_shape, \*bbox_fields, \*mask_fields, \*seg_fields + +`RandomFlip` + +- add: flip +- update: img, \*bbox_fields, \*mask_fields, \*seg_fields + +`Pad` + +- add: pad_fixed_size, pad_size_divisor +- update: img, pad_shape, \*mask_fields, \*seg_fields + +`RandomCrop` + +- update: img, pad_shape, gt_bboxes, gt_labels, gt_masks, \*bbox_fields + +`Normalize` + +- add: img_norm_cfg +- update: img + +`SegRescale` + +- update: gt_semantic_seg + +`PhotoMetricDistortion` + +- update: img + +`Expand` + +- update: img, gt_bboxes + +`MinIoURandomCrop` + +- update: img, gt_bboxes, gt_labels + +`Corrupt` + +- update: img + +### Formatting + +`ToTensor` + +- update: specified by `keys`. + +`ImageToTensor` + +- update: specified by `keys`. + +`Transpose` + +- update: specified by `keys`. + +`ToDataContainer` + +- update: specified by `fields`. + +`DefaultFormatBundle` + +- update: img, proposals, gt_bboxes, gt_bboxes_ignore, gt_labels, gt_masks, gt_semantic_seg + +`Collect` + +- add: img_meta (the keys of img_meta is specified by `meta_keys`) +- remove: all other keys except for those specified by `keys` + +### Test time augmentation + +`MultiScaleFlipAug` + +## Extend and use custom pipelines + +1. Write a new pipeline in a file, e.g., in `my_pipeline.py`. It takes a dict as input and returns a dict. + + ```python + import random + from mmdet.datasets import PIPELINES + + + @PIPELINES.register_module() + class MyTransform: + """Add your transform + + Args: + p (float): Probability of shifts. Default 0.5. + """ + + def __init__(self, p=0.5): + self.p = p + + def __call__(self, results): + if random.random() > self.p: + results['dummy'] = True + return results + ``` + +2. Import and use the pipeline in your config file. + Make sure the import is relative to where your train script is located. + + ```python + custom_imports = dict(imports=['path.to.my_pipeline'], allow_failed_imports=False) + + img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='MyTransform', p=0.2), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), + ] + ``` + +3. Visualize the output of your augmentation pipeline + + To visualize the output of your augmentation pipeline, `tools/misc/browse_dataset.py` + can help the user to browse a detection dataset (both images and bounding box annotations) + visually, or save the image to a designated directory. More details can refer to + [useful_tools](../useful_tools.md) diff --git a/docs/en/tutorials/finetune.md b/docs/en/tutorials/finetune.md new file mode 100644 index 0000000..afa5021 --- /dev/null +++ b/docs/en/tutorials/finetune.md @@ -0,0 +1,89 @@ +# Tutorial 7: Finetuning Models + +Detectors pre-trained on the COCO dataset can serve as a good pre-trained model for other datasets, e.g., CityScapes and KITTI Dataset. +This tutorial provides instruction for users to use the models provided in the [Model Zoo](../model_zoo.md) for other datasets to obtain better performance. + +There are two steps to finetune a model on a new dataset. + +- Add support for the new dataset following [Tutorial 2: Customize Datasets](customize_dataset.md). +- Modify the configs as will be discussed in this tutorial. + +Take the finetuning process on Cityscapes Dataset as an example, the users need to modify five parts in the config. + +## Inherit base configs + +To release the burden and reduce bugs in writing the whole configs, MMDetection V2.0 support inheriting configs from multiple existing configs. To finetune a Mask RCNN model, the new config needs to inherit +`_base_/models/mask_rcnn_r50_fpn.py` to build the basic structure of the model. To use the Cityscapes Dataset, the new config can also simply inherit `_base_/datasets/cityscapes_instance.py`. For runtime settings such as training schedules, the new config needs to inherit `_base_/default_runtime.py`. This configs are in the `configs` directory and the users can also choose to write the whole contents rather than use inheritance. + +```python +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/cityscapes_instance.py', '../_base_/default_runtime.py' +] +``` + +## Modify head + +Then the new config needs to modify the head according to the class numbers of the new datasets. By only changing `num_classes` in the roi_head, the weights of the pre-trained models are mostly reused except the final prediction head. + +```python +model = dict( + pretrained=None, + roi_head=dict( + bbox_head=dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=8, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)), + mask_head=dict( + type='FCNMaskHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=8, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0)))) +``` + +## Modify dataset + +The users may also need to prepare the dataset and write the configs about dataset. MMDetection V2.0 already support VOC, WIDER FACE, COCO and Cityscapes Dataset. + +## Modify training schedule + +The finetuning hyperparameters vary from the default schedule. It usually requires smaller learning rate and less training epochs + +```python +# optimizer +# lr is set for a batch size of 8 +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# learning policy +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[7]) +# the max_epochs and step in lr_config need specifically tuned for the customized dataset +runner = dict(max_epochs=8) +log_config = dict(interval=100) +``` + +## Use pre-trained model + +To use the pre-trained model, the new config add the link of pre-trained models in the `load_from`. The users might need to download the model weights before training to avoid the download time during training. + +```python +load_from = 'https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth' # noqa + +``` diff --git a/docs/en/tutorials/how_to.md b/docs/en/tutorials/how_to.md new file mode 100644 index 0000000..c5184dc --- /dev/null +++ b/docs/en/tutorials/how_to.md @@ -0,0 +1,204 @@ +# Tutorial 11: How to xxx + +This tutorial collects answers to any `How to xxx with MMDetection`. Feel free to update this doc if you meet new questions about `How to` and find the answers! + +## Use backbone network through MMClassification + +The model registry in MMDet, MMCls, MMSeg all inherit from the root registry in MMCV. This allows these repositories to directly use the modules already implemented by each other. Therefore, users can use backbone networks from MMClassification in MMDetection without implementing a network that already exists in MMClassification. + +### Use backbone network implemented in MMClassification + +Suppose you want to use `MobileNetV3-small` as the backbone network of `RetinaNet`, the example config is as the following. + +```python +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# please install mmcls>=0.20.0 +# import mmcls.models to trigger register_module in mmcls +custom_imports = dict(imports=['mmcls.models'], allow_failed_imports=False) +pretrained = 'https://download.openmmlab.com/mmclassification/v0/mobilenet_v3/convert/mobilenet_v3_small-8427ecf0.pth' +model = dict( + backbone=dict( + _delete_=True, # Delete the backbone field in _base_ + type='mmcls.MobileNetV3', # Using MobileNetV3 from mmcls + arch='small', + out_indices=(3, 8, 11), # Modify out_indices + init_cfg=dict( + type='Pretrained', + checkpoint=pretrained, + prefix='backbone.')), # The pre-trained weights of backbone network in MMCls have prefix='backbone.'. The prefix in the keys will be removed so that these weights can be normally loaded. + # Modify in_channels + neck=dict(in_channels=[24, 48, 96], start_level=0)) +``` + +### Use backbone network in TIMM through MMClassification + +MMClassification also provides a wrapper for the PyTorch Image Models (timm) backbone network, users can directly use the backbone network in timm through MMClassification. Suppose you want to use EfficientNet-B1 as the backbone network of RetinaNet, the example config is as the following. + +```python +# https://github.com/open-mmlab/mmdetection/blob/master/configs/timm_example/retinanet_timm_efficientnet_b1_fpn_1x_coco.py + +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +# please install mmcls>=0.20.0 +# import mmcls.models to trigger register_module in mmcls +custom_imports = dict(imports=['mmcls.models'], allow_failed_imports=False) +model = dict( + backbone=dict( + _delete_=True, # Delete the backbone field in _base_ + type='mmcls.TIMMBackbone', # Using timm from mmcls + model_name='efficientnet_b1', + features_only=True, + pretrained=True, + out_indices=(1, 2, 3, 4)), # Modify out_indices + neck=dict(in_channels=[24, 40, 112, 320])) # Modify in_channels + +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +``` + +`type='mmcls.TIMMBackbone'` means use the `TIMMBackbone` class from MMClassification in MMDetection, and the model used is `EfficientNet-B1`, where `mmcls` means the MMClassification repo and `TIMMBackbone` means the TIMMBackbone wrapper implemented in MMClassification. + +For the principle of the Hierarchy Registry, please refer to the [MMCV document](https://github.com/open-mmlab/mmcv/blob/master/docs/en/understand_mmcv/registry.md#hierarchy-registry). For how to use other backbones in MMClassification, you can refer to the [MMClassification document](https://github.com/open-mmlab/mmclassification/blob/master/docs/en/tutorials/config.md). + +## Use Mosaic augmentation + +If you want to use `Mosaic` in training, please make sure that you use `MultiImageMixDataset` at the same time. Taking the 'Faster R-CNN' algorithm as an example, you should modify the values of `train_pipeline` and `train_dataset` in the config as below: + +```python +# Open configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py directly and add the following fields +data_root = 'data/coco/' +dataset_type = 'CocoDataset' +img_scale=(1333, 800)​ +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +train_pipeline = [ + dict(type='Mosaic', img_scale=img_scale, pad_val=114.0), + dict( + type='RandomAffine', + scaling_ratio_range=(0.1, 2), + border=(-img_scale[0] // 2, -img_scale[1] // 2)), # The image will be enlarged by 4 times after Mosaic processing,so we use affine transformation to restore the image size. + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] + +train_dataset = dict( + _delete_ = True, # remove unnecessary Settings + type='MultiImageMixDataset', + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=[ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True) + ], + filter_empty_gt=False, + ), + pipeline=train_pipeline + ) +​ +data = dict( + train=train_dataset + ) +``` + +## Unfreeze backbone network after freezing the backbone in the config + +If you have freezed the backbone network in the config and want to unfreeze it after some epoches, you can write a hook function to do it. Taking the Faster R-CNN with the resnet backbone as an example, you can freeze one stage of the backbone network and add a `custom_hooks` in the config as below: + +```python +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + # freeze one stage of the backbone network. + backbone=dict(frozen_stages=1), +) +custom_hooks = [dict(type="UnfreezeBackboneEpochBasedHook", unfreeze_epoch=1)] +``` + +Meanwhile write the hook class `UnfreezeBackboneEpochBasedHook` in `mmdet/core/hook/unfreeze_backbone_epoch_based_hook.py` + +```python +from mmcv.parallel import is_module_wrapper +from mmcv.runner.hooks import HOOKS, Hook + + +@HOOKS.register_module() +class UnfreezeBackboneEpochBasedHook(Hook): + """Unfreeze backbone network Hook. + + Args: + unfreeze_epoch (int): The epoch unfreezing the backbone network. + """ + + def __init__(self, unfreeze_epoch=1): + self.unfreeze_epoch = unfreeze_epoch + + def before_train_epoch(self, runner): + # Unfreeze the backbone network. + # Only valid for resnet. + if runner.epoch == self.unfreeze_epoch: + model = runner.model + if is_module_wrapper(model): + model = model.module + backbone = model.backbone + if backbone.frozen_stages >= 0: + if backbone.deep_stem: + backbone.stem.train() + for param in backbone.stem.parameters(): + param.requires_grad = True + else: + backbone.norm1.train() + for m in [backbone.conv1, backbone.norm1]: + for param in m.parameters(): + param.requires_grad = True + + for i in range(1, backbone.frozen_stages + 1): + m = getattr(backbone, f'layer{i}') + m.train() + for param in m.parameters(): + param.requires_grad = True +``` + +## Get the channels of a new backbone + +If you want to get the channels of a new backbone, you can build this backbone alone and input a pseudo image to get each stage output. + +Take `ResNet` as an example: + +```python +from mmdet.models import ResNet +import torch +self = ResNet(depth=18) +self.eval() +inputs = torch.rand(1, 3, 32, 32) +level_outputs = self.forward(inputs) +for level_out in level_outputs: + print(tuple(level_out.shape)) + +``` + +Output of the above script is as below: + +```python +(1, 64, 8, 8) +(1, 128, 4, 4) +(1, 256, 2, 2) +(1, 512, 1, 1) +``` + +Users can get the channels of the new backbone by Replacing the `ResNet(depth=18)` in this script with their customized backbone. diff --git a/docs/en/tutorials/index.rst b/docs/en/tutorials/index.rst new file mode 100644 index 0000000..5513611 --- /dev/null +++ b/docs/en/tutorials/index.rst @@ -0,0 +1,17 @@ +.. toctree:: + :maxdepth: 2 + + config.md + customize_dataset.md + data_pipeline.md + customize_models.md + customize_runtime.md + customize_losses.md + finetune.md + robustness_benchmarking.md + pytorch2onnx.md + onnx2tensorrt.md + init_cfg.md + how_to.md + test_results_submission.md + useful_hooks.md diff --git a/docs/en/tutorials/init_cfg.md b/docs/en/tutorials/init_cfg.md new file mode 100644 index 0000000..b46b494 --- /dev/null +++ b/docs/en/tutorials/init_cfg.md @@ -0,0 +1,161 @@ +# Tutorial 10: Weight initialization + +During training, a proper initialization strategy is beneficial to speeding up the training or obtaining a higher performance. [MMCV](https://github.com/open-mmlab/mmcv/blob/master/mmcv/cnn/utils/weight_init.py) provide some commonly used methods for initializing modules like `nn.Conv2d`. Model initialization in MMdetection mainly uses `init_cfg`. Users can initialize models with following two steps: + +1. Define `init_cfg` for a model or its components in `model_cfg`, but `init_cfg` of children components have higher priority and will override `init_cfg` of parents modules. +2. Build model as usual, but call `model.init_weights()` method explicitly, and model parameters will be initialized as configuration. + +The high-level workflow of initialization in MMdetection is : + +model_cfg(init_cfg) -> build_from_cfg -> model -> init_weight() -> initialize(self, self.init_cfg) -> children's init_weight() + +### Description + +It is dict or list\[dict\], and contains the following keys and values: + +- `type` (str), containing the initializer name in `INTIALIZERS`, and followed by arguments of the initializer. +- `layer` (str or list\[str\]), containing the names of basiclayers in Pytorch or MMCV with learnable parameters that will be initialized, e.g. `'Conv2d'`,`'DeformConv2d'`. +- `override` (dict or list\[dict\]), containing the sub-modules that not inherit from BaseModule and whose initialization configuration is different from other layers' which are in `'layer'` key. Initializer defined in `type` will work for all layers defined in `layer`, so if sub-modules are not derived Classes of `BaseModule` but can be initialized as same ways of layers in `layer`, it does not need to use `override`. `override` contains: + - `type` followed by arguments of initializer; + - `name` to indicate sub-module which will be initialized. + +### Initialize parameters + +Inherit a new model from `mmcv.runner.BaseModule` or `mmdet.models` Here we show an example of FooModel. + +```python +import torch.nn as nn +from mmcv.runner import BaseModule + +class FooModel(BaseModule) + def __init__(self, + arg1, + arg2, + init_cfg=None): + super(FooModel, self).__init__(init_cfg) + ... +``` + +- Initialize model by using `init_cfg` directly in code + + ```python + import torch.nn as nn + from mmcv.runner import BaseModule + # or directly inherit mmdet models + + class FooModel(BaseModule) + def __init__(self, + arg1, + arg2, + init_cfg=XXX): + super(FooModel, self).__init__(init_cfg) + ... + ``` + +- Initialize model by using `init_cfg` directly in `mmcv.Sequential` or `mmcv.ModuleList` code + + ```python + from mmcv.runner import BaseModule, ModuleList + + class FooModel(BaseModule) + def __init__(self, + arg1, + arg2, + init_cfg=None): + super(FooModel, self).__init__(init_cfg) + ... + self.conv1 = ModuleList(init_cfg=XXX) + ``` + +- Initialize model by using `init_cfg` in config file + + ```python + model = dict( + ... + model = dict( + type='FooModel', + arg1=XXX, + arg2=XXX, + init_cfg=XXX), + ... + ``` + +### Usage of init_cfg + +1. Initialize model by `layer` key + + If we only define `layer`, it just initialize the layer in `layer` key. + + NOTE: Value of `layer` key is the class name with attributes weights and bias of Pytorch, (so such as `MultiheadAttention layer` is not supported). + +- Define `layer` key for initializing module with same configuration. + + ```python + init_cfg = dict(type='Constant', layer=['Conv1d', 'Conv2d', 'Linear'], val=1) + # initialize whole module with same configuration + ``` + +- Define `layer` key for initializing layer with different configurations. + +```python +init_cfg = [dict(type='Constant', layer='Conv1d', val=1), + dict(type='Constant', layer='Conv2d', val=2), + dict(type='Constant', layer='Linear', val=3)] +# nn.Conv1d will be initialized with dict(type='Constant', val=1) +# nn.Conv2d will be initialized with dict(type='Constant', val=2) +# nn.Linear will be initialized with dict(type='Constant', val=3) +``` + +2. Initialize model by `override` key + +- When initializing some specific part with its attribute name, we can use `override` key, and the value in `override` will ignore the value in init_cfg. + + ```python + # layers: + # self.feat = nn.Conv1d(3, 1, 3) + # self.reg = nn.Conv2d(3, 3, 3) + # self.cls = nn.Linear(1,2) + + init_cfg = dict(type='Constant', + layer=['Conv1d','Conv2d'], val=1, bias=2, + override=dict(type='Constant', name='reg', val=3, bias=4)) + # self.feat and self.cls will be initialized with dict(type='Constant', val=1, bias=2) + # The module called 'reg' will be initialized with dict(type='Constant', val=3, bias=4) + ``` + +- If `layer` is None in init_cfg, only sub-module with the name in override will be initialized, and type and other args in override can be omitted. + + ```python + # layers: + # self.feat = nn.Conv1d(3, 1, 3) + # self.reg = nn.Conv2d(3, 3, 3) + # self.cls = nn.Linear(1,2) + + init_cfg = dict(type='Constant', val=1, bias=2, override=dict(name='reg')) + + # self.feat and self.cls will be initialized by Pytorch + # The module called 'reg' will be initialized with dict(type='Constant', val=1, bias=2) + ``` + +- If we don't define `layer` key or `override` key, it will not initialize anything. + +- Invalid usage + + ```python + # It is invalid that override don't have name key + init_cfg = dict(type='Constant', layer=['Conv1d','Conv2d'], val=1, bias=2, + override=dict(type='Constant', val=3, bias=4)) + + # It is also invalid that override has name and other args except type + init_cfg = dict(type='Constant', layer=['Conv1d','Conv2d'], val=1, bias=2, + override=dict(name='reg', val=3, bias=4)) + ``` + +3. Initialize model with the pretrained model + + ```python + init_cfg = dict(type='Pretrained', + checkpoint='torchvision://resnet50') + ``` + +More details can refer to the documentation in [MMCV](https://mmcv.readthedocs.io/en/latest/cnn.html#weight-initialization) and MMCV [PR #780](https://github.com/open-mmlab/mmcv/pull/780) diff --git a/docs/en/tutorials/onnx2tensorrt.md b/docs/en/tutorials/onnx2tensorrt.md new file mode 100644 index 0000000..3848bb7 --- /dev/null +++ b/docs/en/tutorials/onnx2tensorrt.md @@ -0,0 +1,106 @@ +# Tutorial 9: ONNX to TensorRT (Experimental) + +> ## [Try the new MMDeploy to deploy your model](https://mmdeploy.readthedocs.io/) + + + +- [Tutorial 9: ONNX to TensorRT (Experimental)](#tutorial-9-onnx-to-tensorrt-experimental) + - [How to convert models from ONNX to TensorRT](#how-to-convert-models-from-onnx-to-tensorrt) + - [Prerequisite](#prerequisite) + - [Usage](#usage) + - [How to evaluate the exported models](#how-to-evaluate-the-exported-models) + - [List of supported models convertible to TensorRT](#list-of-supported-models-convertible-to-tensorrt) + - [Reminders](#reminders) + - [FAQs](#faqs) + + + +## How to convert models from ONNX to TensorRT + +### Prerequisite + +1. Please refer to [get_started.md](https://mmdetection.readthedocs.io/en/latest/get_started.html) for installation of MMCV and MMDetection from source. +2. Please refer to [ONNXRuntime in mmcv](https://mmcv.readthedocs.io/en/latest/deployment/onnxruntime_op.html) and [TensorRT plugin in mmcv](https://github.com/open-mmlab/mmcv/blob/master/docs/en/deployment/tensorrt_plugin.md/) to install `mmcv-full` with ONNXRuntime custom ops and TensorRT plugins. +3. Use our tool [pytorch2onnx](https://mmdetection.readthedocs.io/en/latest/tutorials/pytorch2onnx.html) to convert the model from PyTorch to ONNX. + +### Usage + +```bash +python tools/deployment/onnx2tensorrt.py \ + ${CONFIG} \ + ${MODEL} \ + --trt-file ${TRT_FILE} \ + --input-img ${INPUT_IMAGE_PATH} \ + --shape ${INPUT_IMAGE_SHAPE} \ + --min-shape ${MIN_IMAGE_SHAPE} \ + --max-shape ${MAX_IMAGE_SHAPE} \ + --workspace-size {WORKSPACE_SIZE} \ + --show \ + --verify \ +``` + +Description of all arguments: + +- `config` : The path of a model config file. +- `model` : The path of an ONNX model file. +- `--trt-file`: The Path of output TensorRT engine file. If not specified, it will be set to `tmp.trt`. +- `--input-img` : The path of an input image for tracing and conversion. By default, it will be set to `demo/demo.jpg`. +- `--shape`: The height and width of model input. If not specified, it will be set to `400 600`. +- `--min-shape`: The minimum height and width of model input. If not specified, it will be set to the same as `--shape`. +- `--max-shape`: The maximum height and width of model input. If not specified, it will be set to the same as `--shape`. +- `--workspace-size` : The required GPU workspace size in GiB to build TensorRT engine. If not specified, it will be set to `1` GiB. +- `--show`: Determines whether to show the outputs of the model. If not specified, it will be set to `False`. +- `--verify`: Determines whether to verify the correctness of models between ONNXRuntime and TensorRT. If not specified, it will be set to `False`. +- `--verbose`: Determines whether to print logging messages. It's useful for debugging. If not specified, it will be set to `False`. + +Example: + +```bash +python tools/deployment/onnx2tensorrt.py \ + configs/retinanet/retinanet_r50_fpn_1x_coco.py \ + checkpoints/retinanet_r50_fpn_1x_coco.onnx \ + --trt-file checkpoints/retinanet_r50_fpn_1x_coco.trt \ + --input-img demo/demo.jpg \ + --shape 400 600 \ + --show \ + --verify \ +``` + +## How to evaluate the exported models + +We prepare a tool `tools/deplopyment/test.py` to evaluate TensorRT models. + +Please refer to following links for more information. + +- [how-to-evaluate-the-exported-models](pytorch2onnx.md#how-to-evaluate-the-exported-models) +- [results-and-models](pytorch2onnx.md#results-and-models) + +## List of supported models convertible to TensorRT + +The table below lists the models that are guaranteed to be convertible to TensorRT. + +| Model | Config | Dynamic Shape | Batch Inference | Note | +| :----------------: | :--------------------------------------------------------------: | :-----------: | :-------------: | :--: | +| SSD | `configs/ssd/ssd300_coco.py` | Y | Y | | +| FSAF | `configs/fsaf/fsaf_r50_fpn_1x_coco.py` | Y | Y | | +| FCOS | `configs/fcos/fcos_r50_caffe_fpn_4x4_1x_coco.py` | Y | Y | | +| YOLOv3 | `configs/yolo/yolov3_d53_mstrain-608_273e_coco.py` | Y | Y | | +| RetinaNet | `configs/retinanet/retinanet_r50_fpn_1x_coco.py` | Y | Y | | +| Faster R-CNN | `configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py` | Y | Y | | +| Cascade R-CNN | `configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py` | Y | Y | | +| Mask R-CNN | `configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py` | Y | Y | | +| Cascade Mask R-CNN | `configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py` | Y | Y | | +| PointRend | `configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py` | Y | Y | | + +Notes: + +- *All models above are tested with Pytorch==1.6.0, onnx==1.7.0 and TensorRT-7.2.1.6.Ubuntu-16.04.x86_64-gnu.cuda-10.2.cudnn8.0* + +## Reminders + +- If you meet any problem with the listed models above, please create an issue and it would be taken care of soon. For models not included in the list, we may not provide much help here due to the limited resources. Please try to dig a little deeper and debug by yourself. +- Because this feature is experimental and may change fast, please always try with the latest `mmcv` and `mmdetecion`. + +## FAQs + +- None diff --git a/docs/en/tutorials/pytorch2onnx.md b/docs/en/tutorials/pytorch2onnx.md new file mode 100644 index 0000000..3561178 --- /dev/null +++ b/docs/en/tutorials/pytorch2onnx.md @@ -0,0 +1,334 @@ +# Tutorial 8: Pytorch to ONNX (Experimental) + +> ## [Try the new MMDeploy to deploy your model](https://mmdeploy.readthedocs.io/) + + + +- [Tutorial 8: Pytorch to ONNX (Experimental)](#tutorial-8-pytorch-to-onnx-experimental) + - [How to convert models from Pytorch to ONNX](#how-to-convert-models-from-pytorch-to-onnx) + - [Prerequisite](#prerequisite) + - [Usage](#usage) + - [Description of all arguments](#description-of-all-arguments) + - [How to evaluate the exported models](#how-to-evaluate-the-exported-models) + - [Prerequisite](#prerequisite-1) + - [Usage](#usage-1) + - [Description of all arguments](#description-of-all-arguments-1) + - [Results and Models](#results-and-models) + - [List of supported models exportable to ONNX](#list-of-supported-models-exportable-to-onnx) + - [The Parameters of Non-Maximum Suppression in ONNX Export](#the-parameters-of-non-maximum-suppression-in-onnx-export) + - [Reminders](#reminders) + - [FAQs](#faqs) + + + +## How to convert models from Pytorch to ONNX + +### Prerequisite + +1. Install the prerequisites following [get_started.md/Prepare environment](../get_started.md). +2. Build custom operators for ONNX Runtime and install MMCV manually following [How to build custom operators for ONNX Runtime](https://github.com/open-mmlab/mmcv/blob/master/docs/en/deployment/onnxruntime_op.md/#how-to-build-custom-operators-for-onnx-runtime) +3. Install MMdetection manually following steps 2-3 in [get_started.md/Install MMdetection](../get_started.md). + +### Usage + +```bash +python tools/deployment/pytorch2onnx.py \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + --output-file ${OUTPUT_FILE} \ + --input-img ${INPUT_IMAGE_PATH} \ + --shape ${IMAGE_SHAPE} \ + --test-img ${TEST_IMAGE_PATH} \ + --opset-version ${OPSET_VERSION} \ + --cfg-options ${CFG_OPTIONS} + --dynamic-export \ + --show \ + --verify \ + --simplify \ +``` + +### Description of all arguments + +- `config` : The path of a model config file. +- `checkpoint` : The path of a model checkpoint file. +- `--output-file`: The path of output ONNX model. If not specified, it will be set to `tmp.onnx`. +- `--input-img`: The path of an input image for tracing and conversion. By default, it will be set to `tests/data/color.jpg`. +- `--shape`: The height and width of input tensor to the model. If not specified, it will be set to `800 1216`. +- `--test-img` : The path of an image to verify the exported ONNX model. By default, it will be set to `None`, meaning it will use `--input-img` for verification. +- `--opset-version` : The opset version of ONNX. If not specified, it will be set to `11`. +- `--dynamic-export`: Determines whether to export ONNX model with dynamic input and output shapes. If not specified, it will be set to `False`. +- `--show`: Determines whether to print the architecture of the exported model and whether to show detection outputs when `--verify` is set to `True`. If not specified, it will be set to `False`. +- `--verify`: Determines whether to verify the correctness of an exported model. If not specified, it will be set to `False`. +- `--simplify`: Determines whether to simplify the exported ONNX model. If not specified, it will be set to `False`. +- `--cfg-options`: Override some settings in the used config file, the key-value pair in `xxx=yyy` format will be merged into config file. +- `--skip-postprocess`: Determines whether export model without post process. If not specified, it will be set to `False`. Notice: This is an experimental option. Only work for some single stage models. Users need to implement the post-process by themselves. We do not guarantee the correctness of the exported model. + +Example: + +```bash +python tools/deployment/pytorch2onnx.py \ + configs/yolo/yolov3_d53_mstrain-608_273e_coco.py \ + checkpoints/yolo/yolov3_d53_mstrain-608_273e_coco.pth \ + --output-file checkpoints/yolo/yolov3_d53_mstrain-608_273e_coco.onnx \ + --input-img demo/demo.jpg \ + --test-img tests/data/color.jpg \ + --shape 608 608 \ + --show \ + --verify \ + --dynamic-export \ + --cfg-options \ + model.test_cfg.deploy_nms_pre=-1 \ +``` + +## How to evaluate the exported models + +We prepare a tool `tools/deplopyment/test.py` to evaluate ONNX models with ONNXRuntime and TensorRT. + +### Prerequisite + +- Install onnx and onnxruntime (CPU version) + + ```shell + pip install onnx onnxruntime==1.5.1 + ``` + +- If you want to run the model on GPU, please remove the CPU version before using the GPU version. + + ```shell + pip uninstall onnxruntime + pip install onnxruntime-gpu + ``` + + Note: onnxruntime-gpu is version-dependent on CUDA and CUDNN, please ensure that your + environment meets the requirements. + +- Build custom operators for ONNX Runtime following [How to build custom operators for ONNX Runtime](https://github.com/open-mmlab/mmcv/blob/master/docs/en/deployment/onnxruntime_op.md/#how-to-build-custom-operators-for-onnx-runtime) + +- Install TensorRT by referring to [How to build TensorRT plugins in MMCV](https://mmcv.readthedocs.io/en/latest/deployment/tensorrt_plugin.html#how-to-build-tensorrt-plugins-in-mmcv) (optional) + +### Usage + +```bash +python tools/deployment/test.py \ + ${CONFIG_FILE} \ + ${MODEL_FILE} \ + --out ${OUTPUT_FILE} \ + --backend ${BACKEND} \ + --format-only ${FORMAT_ONLY} \ + --eval ${EVALUATION_METRICS} \ + --show-dir ${SHOW_DIRECTORY} \ + ----show-score-thr ${SHOW_SCORE_THRESHOLD} \ + ----cfg-options ${CFG_OPTIONS} \ + ----eval-options ${EVALUATION_OPTIONS} \ +``` + +### Description of all arguments + +- `config`: The path of a model config file. +- `model`: The path of an input model file. +- `--out`: The path of output result file in pickle format. +- `--backend`: Backend for input model to run and should be `onnxruntime` or `tensorrt`. +- `--format-only` : Format the output results without perform evaluation. It is useful when you want to format the result to a specific format and submit it to the test server. If not specified, it will be set to `False`. +- `--eval`: Evaluation metrics, which depends on the dataset, e.g., "bbox", "segm", "proposal" for COCO, and "mAP", "recall" for PASCAL VOC. +- `--show-dir`: Directory where painted images will be saved +- `--show-score-thr`: Score threshold. Default is set to `0.3`. +- `--cfg-options`: Override some settings in the used config file, the key-value pair in `xxx=yyy` format will be merged into config file. +- `--eval-options`: Custom options for evaluation, the key-value pair in `xxx=yyy` format will be kwargs for `dataset.evaluate()` function + +Notes: + +- If the deployed backend platform is TensorRT, please add environment variables before running the file: + + ```bash + export ONNX_BACKEND=MMCVTensorRT + ``` + +- If you want to use the `--dynamic-export` parameter in the TensorRT backend to export ONNX, please remove the `--simplify` parameter, and vice versa. + +### Results and Models + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ModelConfigMetricPyTorchONNX RuntimeTensorRT
FCOSconfigs/fcos/fcos_r50_caffe_fpn_gn-head_4x4_1x_coco.pyBox AP36.636.536.3
FSAFconfigs/fsaf/fsaf_r50_fpn_1x_coco.pyBox AP36.036.035.9
RetinaNetconfigs/retinanet/retinanet_r50_fpn_1x_coco.pyBox AP36.536.436.3
SSDconfigs/ssd/ssd300_coco.pyBox AP25.625.625.6
YOLOv3configs/yolo/yolov3_d53_mstrain-608_273e_coco.pyBox AP33.533.533.5
Faster R-CNNconfigs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.pyBox AP37.437.437.0
Cascade R-CNNconfigs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.pyBox AP40.340.340.1
Mask R-CNNconfigs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.pyBox AP38.238.137.7
Mask AP34.733.733.3
Cascade Mask R-CNNconfigs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.pyBox AP41.241.240.9
Mask AP35.934.834.5
CornerNetconfigs/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco.pyBox AP40.640.4-
DETRconfigs/detr/detr_r50_8x2_150e_coco.pyBox AP40.140.1-
PointRendconfigs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.pyBox AP38.438.4-
Mask AP36.335.2-
+ +Notes: + +- All ONNX models are evaluated with dynamic shape on coco dataset and images are preprocessed according to the original config file. Note that CornerNet is evaluated without test-time flip, since currently only single-scale evaluation is supported with ONNX Runtime. + +- Mask AP of Mask R-CNN drops by 1% for ONNXRuntime. The main reason is that the predicted masks are directly interpolated to original image in PyTorch, while they are at first interpolated to the preprocessed input image of the model and then to original image in other backend. + +## List of supported models exportable to ONNX + +The table below lists the models that are guaranteed to be exportable to ONNX and runnable in ONNX Runtime. + +| Model | Config | Dynamic Shape | Batch Inference | Note | +| :----------------: | :-----------------------------------------------------------------: | :-----------: | :-------------: | :---------------------------------------------------------------------------: | +| FCOS | `configs/fcos/fcos_r50_caffe_fpn_gn-head_4x4_1x_coco.py` | Y | Y | | +| FSAF | `configs/fsaf/fsaf_r50_fpn_1x_coco.py` | Y | Y | | +| RetinaNet | `configs/retinanet/retinanet_r50_fpn_1x_coco.py` | Y | Y | | +| SSD | `configs/ssd/ssd300_coco.py` | Y | Y | | +| YOLOv3 | `configs/yolo/yolov3_d53_mstrain-608_273e_coco.py` | Y | Y | | +| Faster R-CNN | `configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py` | Y | Y | | +| Cascade R-CNN | `configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py` | Y | Y | | +| Mask R-CNN | `configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py` | Y | Y | | +| Cascade Mask R-CNN | `configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py` | Y | Y | | +| CornerNet | `configs/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco.py` | Y | N | no flip, no batch inference, tested with torch==1.7.0 and onnxruntime==1.5.1. | +| DETR | `configs/detr/detr_r50_8x2_150e_coco.py` | Y | Y | batch inference is *not recommended* | +| PointRend | `configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py` | Y | Y | | + +Notes: + +- Minimum required version of MMCV is `1.3.5` + +- *All models above are tested with Pytorch==1.6.0 and onnxruntime==1.5.1*, except for CornerNet. For more details about the + torch version when exporting CornerNet to ONNX, which involves `mmcv::cummax`, please refer to the [Known Issues](https://github.com/open-mmlab/mmcv/blob/master/docs/en/deployment/onnxruntime_op.md#known-issues) in mmcv. + +- Though supported, it is *not recommended* to use batch inference in onnxruntime for `DETR`, because there is huge performance gap between ONNX and torch model (e.g. 33.5 vs 39.9 mAP on COCO for onnxruntime and torch respectively, with a batch size 2). The main reason for the gap is that these is non-negligible effect on the predicted regressions during batch inference for ONNX, since the predicted coordinates is normalized by `img_shape` (without padding) and should be converted to absolute format, but `img_shape` is not dynamically traceable thus the padded `img_shape_for_onnx` is used. + +- Currently only single-scale evaluation is supported with ONNX Runtime, also `mmcv::SoftNonMaxSuppression` is only supported for single image by now. + +## The Parameters of Non-Maximum Suppression in ONNX Export + +In the process of exporting the ONNX model, we set some parameters for the NMS op to control the number of output bounding boxes. The following will introduce the parameter setting of the NMS op in the supported models. You can set these parameters through `--cfg-options`. + +- `nms_pre`: The number of boxes before NMS. The default setting is `1000`. + +- `deploy_nms_pre`: The number of boxes before NMS when exporting to ONNX model. The default setting is `0`. + +- `max_per_img`: The number of boxes to be kept after NMS. The default setting is `100`. + +- `max_output_boxes_per_class`: Maximum number of output boxes per class of NMS. The default setting is `200`. + +## Reminders + +- When the input model has custom op such as `RoIAlign` and if you want to verify the exported ONNX model, you may have to build `mmcv` with [ONNXRuntime](https://mmcv.readthedocs.io/en/latest/deployment/onnxruntime_op.html) from source. +- `mmcv.onnx.simplify` feature is based on [onnx-simplifier](https://github.com/daquexian/onnx-simplifier). If you want to try it, please refer to [onnx in `mmcv`](https://mmcv.readthedocs.io/en/latest/deployment/onnx.html) and [onnxruntime op in `mmcv`](https://mmcv.readthedocs.io/en/latest/deployment/onnxruntime_op.html) for more information. +- If you meet any problem with the listed models above, please create an issue and it would be taken care of soon. For models not included in the list, please try to dig a little deeper and debug a little bit more and hopefully solve them by yourself. +- Because this feature is experimental and may change fast, please always try with the latest `mmcv` and `mmdetecion`. + +## FAQs + +- None diff --git a/docs/en/tutorials/test_results_submission.md b/docs/en/tutorials/test_results_submission.md new file mode 100644 index 0000000..aed595c --- /dev/null +++ b/docs/en/tutorials/test_results_submission.md @@ -0,0 +1,112 @@ +# Tutorial 12: Test Results Submission + +## Panoptic segmentation test results submission + +The following sections introduce how to produce the prediction results of panoptic segmentation models on the COCO test-dev set and submit the predictions to [COCO evaluation server](https://competitions.codalab.org/competitions/19507). + +### Prerequisites + +- Download [COCO test dataset images](http://images.cocodataset.org/zips/test2017.zip), [testing image info](http://images.cocodataset.org/annotations/image_info_test2017.zip), and [panoptic train/val annotations](http://images.cocodataset.org/annotations/panoptic_annotations_trainval2017.zip), then unzip them, put 'test2017' to `data/coco/`, put json files and annotation files to `data/coco/annotations/`. + +```shell +# suppose data/coco/ does not exist +mkdir -pv data/coco/ + +# download test2017 +wget -P data/coco/ http://images.cocodataset.org/zips/test2017.zip +wget -P data/coco/ http://images.cocodataset.org/annotations/image_info_test2017.zip +wget -P data/coco/ http://images.cocodataset.org/annotations/panoptic_annotations_trainval2017.zip + +# unzip them +unzip data/coco/test2017.zip -d data/coco/ +unzip data/coco/image_info_test2017.zip -d data/coco/ +unzip data/coco/panoptic_annotations_trainval2017.zip -d data/coco/ + +# remove zip files (optional) +rm -rf data/coco/test2017.zip data/coco/image_info_test2017.zip data/coco/panoptic_annotations_trainval2017.zip +``` + +- Run the following code to update category information in testing image info. Since the attribute `isthing` is missing in category information of 'image_info_test-dev2017.json', we need to update it with the category information in 'panoptic_val2017.json'. + +```shell +python tools/misc/gen_coco_panoptic_test_info.py data/coco/annotations +``` + +After completing the above preparations, your directory structure of `data` should be like this: + +```text +data +`-- coco + |-- annotations + | |-- image_info_test-dev2017.json + | |-- image_info_test2017.json + | |-- panoptic_image_info_test-dev2017.json + | |-- panoptic_train2017.json + | |-- panoptic_train2017.zip + | |-- panoptic_val2017.json + | `-- panoptic_val2017.zip + `-- test2017 +``` + +### Inference on coco test-dev + +The commands to perform inference on test2017 are as below: + +```shell +# test with single gpu +CUDA_VISIBLE_DEVICES=0 python tools/test.py \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + --format-only \ + --cfg-options data.test.ann_file=data/coco/annotations/panoptic_image_info_test-dev2017.json data.test.img_prefix=data/coco/test2017 \ + --eval-options jsonfile_prefix=${WORK_DIR}/results + +# test with four gpus +CUDA_VISIBLE_DEVICES=0,1,3,4 bash tools/dist_test.sh \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + 4 \ # four gpus + --format-only \ + --cfg-options data.test.ann_file=data/coco/annotations/panoptic_image_info_test-dev2017.json data.test.img_prefix=data/coco/test2017 \ + --eval-options jsonfile_prefix=${WORK_DIR}/results + +# test with slurm +GPUS=8 tools/slurm_test.sh \ + ${Partition} \ + ${JOB_NAME} \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + --format-only \ + --cfg-options data.test.ann_file=data/coco/annotations/panoptic_image_info_test-dev2017.json data.test.img_prefix=data/coco/test2017 \ + --eval-options jsonfile_prefix=${WORK_DIR}/results +``` + +Example + +Suppose we perform inference on `test2017` using pretrained MaskFormer with ResNet-50 backbone. + +```shell +# test with single gpu +CUDA_VISIBLE_DEVICES=0 python tools/test.py \ + configs/maskformer/maskformer_r50_mstrain_16x1_75e_coco.py \ + checkpoints/maskformer_r50_mstrain_16x1_75e_coco_20220221_141956-bc2699cb.pth \ + --format-only \ + --cfg-options data.test.ann_file=data/coco/annotations/panoptic_image_info_test-dev2017.json data.test.img_prefix=data/coco/test2017 \ + --eval-options jsonfile_prefix=work_dirs/maskformer/results +``` + +### Rename files and zip results + +After inference, the panoptic segmentation results (a json file and a directory where the masks are stored) will be in `WORK_DIR`. We should rename them according to the naming convention described on [COCO's Website](https://cocodataset.org/#upload). Finally, we need to compress the json and the directory where the masks are stored into a zip file, and rename the zip file according to the naming convention. Note that the zip file should **directly** contains the above two files. + +The commands to rename files and zip results: + +```shell +# In WORK_DIR, we have panoptic segmentation results: 'panoptic' and 'results.panoptic.json'. +cd ${WORK_DIR} + +# replace '[algorithm_name]' with the name of algorithm you used. +mv ./panoptic ./panoptic_test-dev2017_[algorithm_name]_results +mv ./results.panoptic.json ./panoptic_test-dev2017_[algorithm_name]_results.json +zip panoptic_test-dev2017_[algorithm_name]_results.zip -ur panoptic_test-dev2017_[algorithm_name]_results panoptic_test-dev2017_[algorithm_name]_results.json +``` diff --git a/docs/en/tutorials/useful_hooks.md b/docs/en/tutorials/useful_hooks.md new file mode 100644 index 0000000..2c8bd55 --- /dev/null +++ b/docs/en/tutorials/useful_hooks.md @@ -0,0 +1,83 @@ +# Tutorial 13: Useful Hooks + +MMDetection and MMCV provide users with various useful hooks including log hooks, evaluation hooks, NumClassCheckHook, etc. This tutorial introduces the functionalities and usages of hooks implemented in MMDetection. For using hooks in MMCV, please read the [API documentation in MMCV](https://github.com/open-mmlab/mmcv/blob/master/docs/en/understand_mmcv/runner.md). + +## CheckInvalidLossHook + +## EvalHook and DistEvalHook + +## ExpMomentumEMAHook and LinearMomentumEMAHook + +## NumClassCheckHook + +## [MemoryProfilerHook](https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/hook/memory_profiler_hook.py) + +Memory profiler hook records memory information including virtual memory, swap memory, and the memory of the current process. This hook helps grasp the memory usage of the system and discover potential memory leak bugs. To use this hook, users should install `memory_profiler` and `psutil` by `pip install memory_profiler psutil` first. + +### Usage + +To use this hook, users should add the following code to the config file. + +```python +custom_hooks = [ + dict(type='MemoryProfilerHook', interval=50) +] +``` + +### Result + +During training, you can see the messages in the log recorded by `MemoryProfilerHook` as below. The system has 250 GB (246360 MB + 9407 MB) of memory and 8 GB (5740 MB + 2452 MB) of swap memory in total. Currently 9407 MB (4.4%) of memory and 5740 MB (29.9%) of swap memory were consumed. And the current training process consumed 5434 MB of memory. + +```text +2022-04-21 08:49:56,881 - mmdet - INFO - Memory information available_memory: 246360 MB, used_memory: 9407 MB, memory_utilization: 4.4 %, available_swap_memory: 5740 MB, used_swap_memory: 2452 MB, swap_memory_utilization: 29.9 %, current_process_memory: 5434 MB +``` + +## SetEpochInfoHook + +## SyncNormHook + +## SyncRandomSizeHook + +## YOLOXLrUpdaterHook + +## YOLOXModeSwitchHook + +## How to implement a custom hook + +In general, there are 10 points where hooks can be inserted from the beginning to the end of model training. The users can implement custom hooks and insert them at different points in the process of training to do what they want. + +- global points: `before_run`, `after_run` +- points in training: `before_train_epoch`, `before_train_iter`, `after_train_iter`, `after_train_epoch` +- points in validation: `before_val_epoch`, `before_val_iter`, `after_val_iter`, `after_val_epoch` + +For example, users can implement a hook to check loss and terminate training when loss goes NaN. To achieve that, there are three steps to go: + +1. Implement a new hook that inherits the `Hook` class in MMCV, and implement `after_train_iter` method which checks whether loss goes NaN after every `n` training iterations. +2. The implemented hook should be registered in `HOOKS` by `@HOOKS.register_module()` as shown in the code below. +3. Add `custom_hooks = [dict(type='CheckInvalidLossHook', interval=50)]` in the config file. + +```python +import torch +from mmcv.runner.hooks import HOOKS, Hook + + +@HOOKS.register_module() +class CheckInvalidLossHook(Hook): + """Check invalid loss hook. + This hook will regularly check whether the loss is valid + during training. + Args: + interval (int): Checking interval (every k iterations). + Default: 50. + """ + + def __init__(self, interval=50): + self.interval = interval + + def after_train_iter(self, runner): + if self.every_n_iters(runner, self.interval): + assert torch.isfinite(runner.outputs['loss']), \ + runner.logger.info('loss become infinite or NaN!') +``` + +Please read [customize_runtime](https://mmdetection.readthedocs.io/en/latest/tutorials/customize_runtime.html#customize-self-implemented-hooks) for more about implementing a custom hook. diff --git a/docs/en/useful_tools.md b/docs/en/useful_tools.md new file mode 100644 index 0000000..8eacd72 --- /dev/null +++ b/docs/en/useful_tools.md @@ -0,0 +1,589 @@ +Apart from training/testing scripts, We provide lots of useful tools under the +`tools/` directory. + +## Log Analysis + +`tools/analysis_tools/analyze_logs.py` plots loss/mAP curves given a training +log file. Run `pip install seaborn` first to install the dependency. + +```shell +python tools/analysis_tools/analyze_logs.py plot_curve [--keys ${KEYS}] [--eval-interval ${EVALUATION_INTERVAL}] [--title ${TITLE}] [--legend ${LEGEND}] [--backend ${BACKEND}] [--style ${STYLE}] [--out ${OUT_FILE}] +``` + +![loss curve image](../../resources/loss_curve.png) + +Examples: + +- Plot the classification loss of some run. + + ```shell + python tools/analysis_tools/analyze_logs.py plot_curve log.json --keys loss_cls --legend loss_cls + ``` + +- Plot the classification and regression loss of some run, and save the figure to a pdf. + + ```shell + python tools/analysis_tools/analyze_logs.py plot_curve log.json --keys loss_cls loss_bbox --out losses.pdf + ``` + +- Compare the bbox mAP of two runs in the same figure. + + ```shell + python tools/analysis_tools/analyze_logs.py plot_curve log1.json log2.json --keys bbox_mAP --legend run1 run2 + ``` + +- Compute the average training speed. + + ```shell + python tools/analysis_tools/analyze_logs.py cal_train_time log.json [--include-outliers] + ``` + + The output is expected to be like the following. + + ```text + -----Analyze train time of work_dirs/some_exp/20190611_192040.log.json----- + slowest epoch 11, average time is 1.2024 + fastest epoch 1, average time is 1.1909 + time std over epochs is 0.0028 + average iter time: 1.1959 s/iter + ``` + +## Result Analysis + +`tools/analysis_tools/analyze_results.py` calculates single image mAP and saves or shows the topk images with the highest and lowest scores based on prediction results. + +**Usage** + +```shell +python tools/analysis_tools/analyze_results.py \ + ${CONFIG} \ + ${PREDICTION_PATH} \ + ${SHOW_DIR} \ + [--show] \ + [--wait-time ${WAIT_TIME}] \ + [--topk ${TOPK}] \ + [--show-score-thr ${SHOW_SCORE_THR}] \ + [--cfg-options ${CFG_OPTIONS}] +``` + +Description of all arguments: + +- `config` : The path of a model config file. +- `prediction_path`: Output result file in pickle format from `tools/test.py` +- `show_dir`: Directory where painted GT and detection images will be saved +- `--show`:Determines whether to show painted images, If not specified, it will be set to `False` +- `--wait-time`: The interval of show (s), 0 is block +- `--topk`: The number of saved images that have the highest and lowest `topk` scores after sorting. If not specified, it will be set to `20`. +- `--show-score-thr`: Show score threshold. If not specified, it will be set to `0`. +- `--cfg-options`: If specified, the key-value pair optional cfg will be merged into config file + +**Examples**: + +Assume that you have got result file in pickle format from `tools/test.py` in the path './result.pkl'. + +1. Test Faster R-CNN and visualize the results, save images to the directory `results/` + +```shell +python tools/analysis_tools/analyze_results.py \ + configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \ + result.pkl \ + results \ + --show +``` + +2. Test Faster R-CNN and specified topk to 50, save images to the directory `results/` + +```shell +python tools/analysis_tools/analyze_results.py \ + configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \ + result.pkl \ + results \ + --topk 50 +``` + +3. If you want to filter the low score prediction results, you can specify the `show-score-thr` parameter + +```shell +python tools/analysis_tools/analyze_results.py \ + configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \ + result.pkl \ + results \ + --show-score-thr 0.3 +``` + +## Visualization + +### Visualize Datasets + +`tools/misc/browse_dataset.py` helps the user to browse a detection dataset (both +images and bounding box annotations) visually, or save the image to a +designated directory. + +```shell +python tools/misc/browse_dataset.py ${CONFIG} [-h] [--skip-type ${SKIP_TYPE[SKIP_TYPE...]}] [--output-dir ${OUTPUT_DIR}] [--not-show] [--show-interval ${SHOW_INTERVAL}] +``` + +### Visualize Models + +First, convert the model to ONNX as described +[here](#convert-mmdetection-model-to-onnx-experimental). +Note that currently only RetinaNet is supported, support for other models +will be coming in later versions. +The converted model could be visualized by tools like [Netron](https://github.com/lutzroeder/netron). + +### Visualize Predictions + +If you need a lightweight GUI for visualizing the detection results, you can refer [DetVisGUI project](https://github.com/Chien-Hung/DetVisGUI/tree/mmdetection). + +## Error Analysis + +`tools/analysis_tools/coco_error_analysis.py` analyzes COCO results per category and by +different criterion. It can also make a plot to provide useful information. + +```shell +python tools/analysis_tools/coco_error_analysis.py ${RESULT} ${OUT_DIR} [-h] [--ann ${ANN}] [--types ${TYPES[TYPES...]}] +``` + +Example: + +Assume that you have got [Mask R-CNN checkpoint file](https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_fpn_1x_coco/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth) in the path 'checkpoint'. For other checkpoints, please refer to our [model zoo](./model_zoo.md). You can use the following command to get the results bbox and segmentation json file. + +```shell +# out: results.bbox.json and results.segm.json +python tools/test.py \ + configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py \ + checkpoint/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth \ + --format-only \ + --options "jsonfile_prefix=./results" +``` + +1. Get COCO bbox error results per category , save analyze result images to the directory `results/` + +```shell +python tools/analysis_tools/coco_error_analysis.py \ + results.bbox.json \ + results \ + --ann=data/coco/annotations/instances_val2017.json \ +``` + +2. Get COCO segmentation error results per category , save analyze result images to the directory `results/` + +```shell +python tools/analysis_tools/coco_error_analysis.py \ + results.segm.json \ + results \ + --ann=data/coco/annotations/instances_val2017.json \ + --types='segm' +``` + +## Model Serving + +In order to serve an `MMDetection` model with [`TorchServe`](https://pytorch.org/serve/), you can follow the steps: + +### 1. Convert model from MMDetection to TorchServe + +```shell +python tools/deployment/mmdet2torchserve.py ${CONFIG_FILE} ${CHECKPOINT_FILE} \ +--output-folder ${MODEL_STORE} \ +--model-name ${MODEL_NAME} +``` + +**Note**: ${MODEL_STORE} needs to be an absolute path to a folder. + +### 2. Build `mmdet-serve` docker image + +```shell +docker build -t mmdet-serve:latest docker/serve/ +``` + +### 3. Run `mmdet-serve` + +Check the official docs for [running TorchServe with docker](https://github.com/pytorch/serve/blob/master/docker/README.md#running-torchserve-in-a-production-docker-environment). + +In order to run in GPU, you need to install [nvidia-docker](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html). You can omit the `--gpus` argument in order to run in CPU. + +Example: + +```shell +docker run --rm \ +--cpus 8 \ +--gpus device=0 \ +-p8080:8080 -p8081:8081 -p8082:8082 \ +--mount type=bind,source=$MODEL_STORE,target=/home/model-server/model-store \ +mmdet-serve:latest +``` + +[Read the docs](https://github.com/pytorch/serve/blob/072f5d088cce9bb64b2a18af065886c9b01b317b/docs/rest_api.md/) about the Inference (8080), Management (8081) and Metrics (8082) APis + +### 4. Test deployment + +```shell +curl -O curl -O https://raw.githubusercontent.com/pytorch/serve/master/docs/images/3dogs.jpg +curl http://127.0.0.1:8080/predictions/${MODEL_NAME} -T 3dogs.jpg +``` + +You should obtain a response similar to: + +```json +[ + { + "class_name": "dog", + "bbox": [ + 294.63409423828125, + 203.99111938476562, + 417.048583984375, + 281.62744140625 + ], + "score": 0.9987992644309998 + }, + { + "class_name": "dog", + "bbox": [ + 404.26019287109375, + 126.0080795288086, + 574.5091552734375, + 293.6662292480469 + ], + "score": 0.9979367256164551 + }, + { + "class_name": "dog", + "bbox": [ + 197.2144775390625, + 93.3067855834961, + 307.8505554199219, + 276.7560119628906 + ], + "score": 0.993338406085968 + } +] +``` + +And you can use `test_torchserver.py` to compare result of torchserver and pytorch, and visualize them. + +```shell +python tools/deployment/test_torchserver.py ${IMAGE_FILE} ${CONFIG_FILE} ${CHECKPOINT_FILE} ${MODEL_NAME} +[--inference-addr ${INFERENCE_ADDR}] [--device ${DEVICE}] [--score-thr ${SCORE_THR}] +``` + +Example: + +```shell +python tools/deployment/test_torchserver.py \ +demo/demo.jpg \ +configs/yolo/yolov3_d53_320_273e_coco.py \ +checkpoint/yolov3_d53_320_273e_coco-421362b6.pth \ +yolov3 +``` + +## Model Complexity + +`tools/analysis_tools/get_flops.py` is a script adapted from [flops-counter.pytorch](https://github.com/sovrasov/flops-counter.pytorch) to compute the FLOPs and params of a given model. + +```shell +python tools/analysis_tools/get_flops.py ${CONFIG_FILE} [--shape ${INPUT_SHAPE}] +``` + +You will get the results like this. + +```text +============================== +Input shape: (3, 1280, 800) +Flops: 239.32 GFLOPs +Params: 37.74 M +============================== +``` + +**Note**: This tool is still experimental and we do not guarantee that the +number is absolutely correct. You may well use the result for simple +comparisons, but double check it before you adopt it in technical reports or papers. + +1. FLOPs are related to the input shape while parameters are not. The default + input shape is (1, 3, 1280, 800). +2. Some operators are not counted into FLOPs like GN and custom operators. Refer to [`mmcv.cnn.get_model_complexity_info()`](https://github.com/open-mmlab/mmcv/blob/master/mmcv/cnn/utils/flops_counter.py) for details. +3. The FLOPs of two-stage detectors is dependent on the number of proposals. + +## Model conversion + +### MMDetection model to ONNX (experimental) + +We provide a script to convert model to [ONNX](https://github.com/onnx/onnx) format. We also support comparing the output results between Pytorch and ONNX model for verification. + +```shell +python tools/deployment/pytorch2onnx.py ${CONFIG_FILE} ${CHECKPOINT_FILE} --output-file ${ONNX_FILE} [--shape ${INPUT_SHAPE} --verify] +``` + +**Note**: This tool is still experimental. Some customized operators are not supported for now. For a detailed description of the usage and the list of supported models, please refer to [pytorch2onnx](tutorials/pytorch2onnx.md). + +### MMDetection 1.x model to MMDetection 2.x + +`tools/model_converters/upgrade_model_version.py` upgrades a previous MMDetection checkpoint +to the new version. Note that this script is not guaranteed to work as some +breaking changes are introduced in the new version. It is recommended to +directly use the new checkpoints. + +```shell +python tools/model_converters/upgrade_model_version.py ${IN_FILE} ${OUT_FILE} [-h] [--num-classes NUM_CLASSES] +``` + +### RegNet model to MMDetection + +`tools/model_converters/regnet2mmdet.py` convert keys in pycls pretrained RegNet models to +MMDetection style. + +```shell +python tools/model_converters/regnet2mmdet.py ${SRC} ${DST} [-h] +``` + +### Detectron ResNet to Pytorch + +`tools/model_converters/detectron2pytorch.py` converts keys in the original detectron pretrained +ResNet models to PyTorch style. + +```shell +python tools/model_converters/detectron2pytorch.py ${SRC} ${DST} ${DEPTH} [-h] +``` + +### Prepare a model for publishing + +`tools/model_converters/publish_model.py` helps users to prepare their model for publishing. + +Before you upload a model to AWS, you may want to + +1. convert model weights to CPU tensors +2. delete the optimizer states and +3. compute the hash of the checkpoint file and append the hash id to the + filename. + +```shell +python tools/model_converters/publish_model.py ${INPUT_FILENAME} ${OUTPUT_FILENAME} +``` + +E.g., + +```shell +python tools/model_converters/publish_model.py work_dirs/faster_rcnn/latest.pth faster_rcnn_r50_fpn_1x_20190801.pth +``` + +The final output filename will be `faster_rcnn_r50_fpn_1x_20190801-{hash id}.pth`. + +## Dataset Conversion + +`tools/data_converters/` contains tools to convert the Cityscapes dataset +and Pascal VOC dataset to the COCO format. + +```shell +python tools/dataset_converters/cityscapes.py ${CITYSCAPES_PATH} [-h] [--img-dir ${IMG_DIR}] [--gt-dir ${GT_DIR}] [-o ${OUT_DIR}] [--nproc ${NPROC}] +python tools/dataset_converters/pascal_voc.py ${DEVKIT_PATH} [-h] [-o ${OUT_DIR}] +``` + +## Dataset Download + +`tools/misc/download_dataset.py` supports downloading datasets such as COCO, VOC, and LVIS. + +```shell +python tools/misc/download_dataset.py --dataset-name coco2017 +python tools/misc/download_dataset.py --dataset-name voc2007 +python tools/misc/download_dataset.py --dataset-name lvis +``` + +## Benchmark + +### Robust Detection Benchmark + +`tools/analysis_tools/test_robustness.py` and`tools/analysis_tools/robustness_eval.py` helps users to evaluate model robustness. The core idea comes from [Benchmarking Robustness in Object Detection: Autonomous Driving when Winter is Coming](https://arxiv.org/abs/1907.07484). For more information how to evaluate models on corrupted images and results for a set of standard models please refer to [robustness_benchmarking.md](robustness_benchmarking.md). + +### FPS Benchmark + +`tools/analysis_tools/benchmark.py` helps users to calculate FPS. The FPS value includes model forward and post-processing. In order to get a more accurate value, currently only supports single GPU distributed startup mode. + +```shell +python -m torch.distributed.launch --nproc_per_node=1 --master_port=${PORT} tools/analysis_tools/benchmark.py \ + ${CONFIG} \ + ${CHECKPOINT} \ + [--repeat-num ${REPEAT_NUM}] \ + [--max-iter ${MAX_ITER}] \ + [--log-interval ${LOG_INTERVAL}] \ + --launcher pytorch +``` + +Examples: Assuming that you have already downloaded the `Faster R-CNN` model checkpoint to the directory `checkpoints/`. + +```shell +python -m torch.distributed.launch --nproc_per_node=1 --master_port=29500 tools/analysis_tools/benchmark.py \ + configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \ + checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \ + --launcher pytorch +``` + +## Miscellaneous + +### Evaluating a metric + +`tools/analysis_tools/eval_metric.py` evaluates certain metrics of a pkl result file +according to a config file. + +```shell +python tools/analysis_tools/eval_metric.py ${CONFIG} ${PKL_RESULTS} [-h] [--format-only] [--eval ${EVAL[EVAL ...]}] + [--cfg-options ${CFG_OPTIONS [CFG_OPTIONS ...]}] + [--eval-options ${EVAL_OPTIONS [EVAL_OPTIONS ...]}] +``` + +### Print the entire config + +`tools/misc/print_config.py` prints the whole config verbatim, expanding all its +imports. + +```shell +python tools/misc/print_config.py ${CONFIG} [-h] [--options ${OPTIONS [OPTIONS...]}] +``` + +## Hyper-parameter Optimization + +### YOLO Anchor Optimization + +`tools/analysis_tools/optimize_anchors.py` provides two method to optimize YOLO anchors. + +One is k-means anchor cluster which refers from [darknet](https://github.com/AlexeyAB/darknet/blob/master/src/detector.c#L1421). + +```shell +python tools/analysis_tools/optimize_anchors.py ${CONFIG} --algorithm k-means --input-shape ${INPUT_SHAPE [WIDTH HEIGHT]} --output-dir ${OUTPUT_DIR} +``` + +Another is using differential evolution to optimize anchors. + +```shell +python tools/analysis_tools/optimize_anchors.py ${CONFIG} --algorithm differential_evolution --input-shape ${INPUT_SHAPE [WIDTH HEIGHT]} --output-dir ${OUTPUT_DIR} +``` + +E.g., + +```shell +python tools/analysis_tools/optimize_anchors.py configs/yolo/yolov3_d53_320_273e_coco.py --algorithm differential_evolution --input-shape 608 608 --device cuda --output-dir work_dirs +``` + +You will get: + +``` +loading annotations into memory... +Done (t=9.70s) +creating index... +index created! +2021-07-19 19:37:20,951 - mmdet - INFO - Collecting bboxes from annotation... +[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 117266/117266, 15874.5 task/s, elapsed: 7s, ETA: 0s + +2021-07-19 19:37:28,753 - mmdet - INFO - Collected 849902 bboxes. +differential_evolution step 1: f(x)= 0.506055 +differential_evolution step 2: f(x)= 0.506055 +...... + +differential_evolution step 489: f(x)= 0.386625 +2021-07-19 19:46:40,775 - mmdet - INFO Anchor evolution finish. Average IOU: 0.6133754253387451 +2021-07-19 19:46:40,776 - mmdet - INFO Anchor differential evolution result:[[10, 12], [15, 30], [32, 22], [29, 59], [61, 46], [57, 116], [112, 89], [154, 198], [349, 336]] +2021-07-19 19:46:40,798 - mmdet - INFO Result saved in work_dirs/anchor_optimize_result.json +``` + +## Confusion Matrix + +A confusion matrix is a summary of prediction results. + +`tools/analysis_tools/confusion_matrix.py` can analyze the prediction results and plot a confusion matrix table. + +First, run `tools/test.py` to save the `.pkl` detection results. + +Then, run + +``` +python tools/analysis_tools/confusion_matrix.py ${CONFIG} ${DETECTION_RESULTS} ${SAVE_DIR} --show +``` + +And you will get a confusion matrix like this: + +![confusion_matrix_example](https://user-images.githubusercontent.com/12907710/140513068-994cdbf4-3a4a-48f0-8fd8-2830d93fd963.png) + +## COCO Separated & Occluded Mask Metric + +Detecting occluded objects still remains a challenge for state-of-the-art object detectors. +We implemented the metric presented in paper [A Tri-Layer Plugin to Improve Occluded Detection](https://arxiv.org/abs/2210.10046) to calculate the recall of separated and occluded masks. + +There are two ways to use this metric: + +### Offline evaluation + +We provide a script to calculate the metric with a dumped prediction file. + +First, use the `tools/test.py` script to dump the detection results: + +```shell +python tools/test.py ${CONFIG} ${MODEL_PATH} --out results.pkl +``` + +Then, run the `tools/analysis_tools/coco_occluded_separated_recall.py` script to get the recall of separated and occluded masks: + +```shell +python tools/analysis_tools/coco_occluded_separated_recall.py results.pkl --out occluded_separated_recall.json +``` + +The output should be like this: + +``` +loading annotations into memory... +Done (t=0.51s) +creating index... +index created! +processing detection results... +[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 5000/5000, 109.3 task/s, elapsed: 46s, ETA: 0s +computing occluded mask recall... +[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 5550/5550, 780.5 task/s, elapsed: 7s, ETA: 0s +COCO occluded mask recall: 58.79% +COCO occluded mask success num: 3263 +computing separated mask recall... +[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 3522/3522, 778.3 task/s, elapsed: 5s, ETA: 0s +COCO separated mask recall: 31.94% +COCO separated mask success num: 1125 + ++-----------+--------+-------------+ +| mask type | recall | num correct | ++-----------+--------+-------------+ +| occluded | 58.79% | 3263 | +| separated | 31.94% | 1125 | ++-----------+--------+-------------+ +Evaluation results have been saved to occluded_separated_recall.json. +``` + +### Online evaluation + +We implement `OccludedSeparatedCocoDataset` which inherited from the `CocoDataset`. +To evaluate the recall of separated and occluded masks during training, just replace the validation dataset type with `'OccludedSeparatedCocoDataset'` in your config: + +```python +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=train_pipeline), + val=dict( + type='OccludedSeparatedCocoDataset', # modify this + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline), + test=dict( + type='OccludedSeparatedCocoDataset', # modify this + ann_file=data_root + 'annotations/instances_val2017.json', + img_prefix=data_root + 'val2017/', + pipeline=test_pipeline)) +``` + +Please cite the paper if you use this metric: + +```latex +@article{zhan2022triocc, + title={A Tri-Layer Plugin to Improve Occluded Detection}, + author={Zhan, Guanqi and Xie, Weidi and Zisserman, Andrew}, + journal={British Machine Vision Conference}, + year={2022} +} +``` diff --git a/docs/zh_cn/1_exist_data_model.md b/docs/zh_cn/1_exist_data_model.md new file mode 100644 index 0000000..e349343 --- /dev/null +++ b/docs/zh_cn/1_exist_data_model.md @@ -0,0 +1,678 @@ +# 1: 使用已有模型在标准数据集上进行推理 + +MMDetection 在 [Model Zoo](https://mmdetection.readthedocs.io/en/latest/model_zoo.html) 中提供了数以百计的检测模型,并支持多种标准数据集,包括 Pascal VOC,COCO,Cityscapes,LVIS 等。这份文档将会讲述如何使用这些模型和标准数据集来运行一些常见的任务,包括: + +- 使用现有模型在给定图片上进行推理 +- 在标准数据集上测试现有模型 +- 在标准数据集上训练预定义的模型 + +## 使用现有模型进行推理 + +推理是指使用训练好的模型来检测图像上的目标。在 MMDetection 中,一个模型被定义为一个配置文件和对应的存储在 checkpoint 文件内的模型参数的集合。 + +首先,我们建议从 [Faster RCNN](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn) 开始,其 [配置](https://github.com/open-mmlab/mmdetection/blob/master/configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py) 文件和 [checkpoint](http://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth) 文件在此。 +我们建议将 checkpoint 文件下载到 `checkpoints` 文件夹内。 + +### 推理的高层编程接口 + +MMDetection 为在图片上推理提供了 Python 的高层编程接口。下面是建立模型和在图像或视频上进行推理的例子。 + +```python +from mmdet.apis import init_detector, inference_detector +import mmcv + +# 指定模型的配置文件和 checkpoint 文件路径 +config_file = 'configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +checkpoint_file = 'checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth' + +# 根据配置文件和 checkpoint 文件构建模型 +model = init_detector(config_file, checkpoint_file, device='cuda:0') + +# 测试单张图片并展示结果 +img = 'test.jpg' # 或者 img = mmcv.imread(img),这样图片仅会被读一次 +result = inference_detector(model, img) +# 在一个新的窗口中将结果可视化 +model.show_result(img, result) +# 或者将可视化结果保存为图片 +model.show_result(img, result, out_file='result.jpg') + +# 测试视频并展示结果 +video = mmcv.VideoReader('video.mp4') +for frame in video: + result = inference_detector(model, frame) + model.show_result(frame, result, wait_time=1) +``` + +jupyter notebook 上的演示样例在 [demo/inference_demo.ipynb](https://github.com/open-mmlab/mmdetection/blob/master/demo/inference_demo.ipynb) 。 + +### 异步接口-支持 Python 3.7+ + +对于 Python 3.7+,MMDetection 也有异步接口。利用 CUDA 流,绑定 GPU 的推理代码不会阻塞 CPU,从而使得 CPU/GPU 在单线程应用中能达到更高的利用率。在推理流程中,不同数据样本的推理和不同模型的推理都能并发地运行。 + +您可以参考 `tests/async_benchmark.py` 来对比同步接口和异步接口的运行速度。 + +```python +import asyncio +import torch +from mmdet.apis import init_detector, async_inference_detector +from mmdet.utils.contextmanagers import concurrent + +async def main(): + config_file = 'configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' + checkpoint_file = 'checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth' + device = 'cuda:0' + model = init_detector(config_file, checkpoint=checkpoint_file, device=device) + + # 此队列用于并行推理多张图像 + streamqueue = asyncio.Queue() + # 队列大小定义了并行的数量 + streamqueue_size = 3 + + for _ in range(streamqueue_size): + streamqueue.put_nowait(torch.cuda.Stream(device=device)) + + # 测试单张图片并展示结果 + img = 'test.jpg' # or 或者 img = mmcv.imread(img),这样图片仅会被读一次 + + async with concurrent(streamqueue): + result = await async_inference_detector(model, img) + + # 在一个新的窗口中将结果可视化 + model.show_result(img, result) + # 或者将可视化结果保存为图片 + model.show_result(img, result, out_file='result.jpg') + + +asyncio.run(main()) + +``` + +### 演示样例 + +我们还提供了三个演示脚本,它们是使用高层编程接口实现的。 [源码在此](https://github.com/open-mmlab/mmdetection/tree/master/demo) 。 + +#### 图片样例 + +这是在单张图片上进行推理的脚本,可以开启 `--async-test` 来进行异步推理。 + +```shell +python demo/image_demo.py \ + ${IMAGE_FILE} \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + [--device ${GPU_ID}] \ + [--score-thr ${SCORE_THR}] \ + [--async-test] +``` + +运行样例: + +```shell +python demo/image_demo.py demo/demo.jpg \ + configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \ + checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \ + --device cpu +``` + +#### 摄像头样例 + +这是使用摄像头实时图片的推理脚本。 + +```shell +python demo/webcam_demo.py \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + [--device ${GPU_ID}] \ + [--camera-id ${CAMERA-ID}] \ + [--score-thr ${SCORE_THR}] +``` + +运行样例: + +```shell +python demo/webcam_demo.py \ + configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \ + checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth +``` + +#### 视频样例 + +这是在视频样例上进行推理的脚本。 + +```shell +python demo/video_demo.py \ + ${VIDEO_FILE} \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + [--device ${GPU_ID}] \ + [--score-thr ${SCORE_THR}] \ + [--out ${OUT_FILE}] \ + [--show] \ + [--wait-time ${WAIT_TIME}] +``` + +运行样例: + +```shell +python demo/video_demo.py demo/demo.mp4 \ + configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \ + checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \ + --out result.mp4 +``` + +#### 视频样例,显卡加速版本 + +这是在视频样例上进行推理的脚本,使用显卡加速。 + +```shell +python demo/video_gpuaccel_demo.py \ + ${VIDEO_FILE} \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + [--device ${GPU_ID}] \ + [--score-thr ${SCORE_THR}] \ + [--nvdecode] \ + [--out ${OUT_FILE}] \ + [--show] \ + [--wait-time ${WAIT_TIME}] + +``` + +运行样例: + +```shell +python demo/video_gpuaccel_demo.py demo/demo.mp4 \ + configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \ + checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \ + --nvdecode --out result.mp4 +``` + +## 在标准数据集上测试现有模型 + +为了测试一个模型的精度,我们通常会在标准数据集上对其进行测试。MMDetection 支持多个公共数据集,包括 [COCO](https://cocodataset.org/) , +[Pascal VOC](http://host.robots.ox.ac.uk/pascal/VOC) ,[Cityscapes](https://www.cityscapes-dataset.com/) 等等。 +这一部分将会介绍如何在支持的数据集上测试现有模型。 + +### 数据集准备 + +一些公共数据集,比如 Pascal VOC 及其镜像数据集,或者 COCO 等数据集都可以从官方网站或者镜像网站获取。 +注意:在检测任务中,Pascal VOC 2012 是 Pascal VOC 2007 的无交集扩展,我们通常将两者一起使用。 +我们建议将数据集下载,然后解压到项目外部的某个文件夹内,然后通过符号链接的方式,将数据集根目录链接到 `$MMDETECTION/data` 文件夹下,格式如下所示。 +如果你的文件夹结构和下方不同的话,你需要在配置文件中改变对应的路径。 +我们提供了下载 COCO 等数据集的脚本,你可以运行 `python tools/misc/download_dataset.py --dataset-name coco2017` 下载 COCO 数据集。 + +```plain +mmdetection +├── mmdet +├── tools +├── configs +├── data +│ ├── coco +│ │ ├── annotations +│ │ ├── train2017 +│ │ ├── val2017 +│ │ ├── test2017 +│ ├── cityscapes +│ │ ├── annotations +│ │ ├── leftImg8bit +│ │ │ ├── train +│ │ │ ├── val +│ │ ├── gtFine +│ │ │ ├── train +│ │ │ ├── val +│ ├── VOCdevkit +│ │ ├── VOC2007 +│ │ ├── VOC2012 +``` + +有些模型需要额外的 [COCO-stuff](http://calvin.inf.ed.ac.uk/wp-content/uploads/data/cocostuffdataset/stuffthingmaps_trainval2017.zip) 数据集,比如 HTC,DetectoRS 和 SCNet,你可以下载并解压它们到 `coco` 文件夹下。文件夹会是如下结构: + +```plain +mmdetection +├── data +│ ├── coco +│ │ ├── annotations +│ │ ├── train2017 +│ │ ├── val2017 +│ │ ├── test2017 +│ │ ├── stuffthingmaps +``` + +PanopticFPN 等全景分割模型需要额外的 [COCO Panoptic](http://images.cocodataset.org/annotations/panoptic_annotations_trainval2017.zip) 数据集,你可以下载并解压它们到 `coco/annotations` 文件夹下。文件夹会是如下结构: + +```text +mmdetection +├── data +│ ├── coco +│ │ ├── annotations +│ │ │ ├── panoptic_train2017.json +│ │ │ ├── panoptic_train2017 +│ │ │ ├── panoptic_val2017.json +│ │ │ ├── panoptic_val2017 +│ │ ├── train2017 +│ │ ├── val2017 +│ │ ├── test2017 +``` + +Cityscape 数据集的标注格式需要转换,以与 COCO 数据集标注格式保持一致,使用 `tools/dataset_converters/cityscapes.py` 来完成转换: + +```shell +pip install cityscapesscripts + +python tools/dataset_converters/cityscapes.py \ + ./data/cityscapes \ + --nproc 8 \ + --out-dir ./data/cityscapes/annotations +``` + +### 测试现有模型 + +我们提供了测试脚本,能够测试一个现有模型在所有数据集(COCO,Pascal VOC,Cityscapes 等)上的性能。我们支持在如下环境下测试: + +- 单 GPU 测试 +- CPU 测试 +- 单节点多 GPU 测试 +- 多节点测试 + +根据以上测试环境,选择合适的脚本来执行测试过程。 + +```shell +# 单 GPU 测试 +python tools/test.py \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + [--out ${RESULT_FILE}] \ + [--eval ${EVAL_METRICS}] \ + [--show] + +# CPU 测试:禁用 GPU 并运行单 GPU 测试脚本 +export CUDA_VISIBLE_DEVICES=-1 +python tools/test.py \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + [--out ${RESULT_FILE}] \ + [--eval ${EVAL_METRICS}] \ + [--show] + +# 单节点多 GPU 测试 +bash tools/dist_test.sh \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + ${GPU_NUM} \ + [--out ${RESULT_FILE}] \ + [--eval ${EVAL_METRICS}] +``` + +`tools/dist_test.sh` 也支持多节点测试,不过需要依赖 PyTorch 的 [启动工具](https://pytorch.org/docs/stable/distributed.html#launch-utility) 。 + +可选参数: + +- `RESULT_FILE`: 结果文件名称,需以 .pkl 形式存储。如果没有声明,则不将结果存储到文件。 +- `EVAL_METRICS`: 需要测试的度量指标。可选值是取决于数据集的,比如 `proposal_fast`,`proposal`,`bbox`,`segm` 是 COCO 数据集的可选值,`mAP`,`recall` 是 Pascal VOC 数据集的可选值。Cityscapes 数据集可以测试 `cityscapes` 和所有 COCO 数据集支持的度量指标。 +- `--show`: 如果开启,检测结果将被绘制在图像上,以一个新窗口的形式展示。它只适用于单 GPU 的测试,是用于调试和可视化的。请确保使用此功能时,你的 GUI 可以在环境中打开。否则,你可能会遇到这么一个错误 `cannot connect to X server`。 +- `--show-dir`: 如果指明,检测结果将会被绘制在图像上并保存到指定目录。它只适用于单 GPU 的测试,是用于调试和可视化的。即使你的环境中没有 GUI,这个选项也可使用。 +- `--show-score-thr`: 如果指明,得分低于此阈值的检测结果将会被移除。 +- `--cfg-options`: 如果指明,这里的键值对将会被合并到配置文件中。 +- `--eval-options`: 如果指明,这里的键值对将会作为字典参数被传入 `dataset.evaluation()` 函数中,仅在测试阶段使用。 + +### 样例 + +假设你已经下载了 checkpoint 文件到 `checkpoints/` 文件下了。 + +1. 测试 Faster R-CNN 并可视化其结果。按任意键继续下张图片的测试。配置文件和 checkpoint 文件 [在此](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn) 。 + + ```shell + python tools/test.py \ + configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \ + checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \ + --show + ``` + +2. 测试 Faster R-CNN,并为了之后的可视化保存绘制的图像。配置文件和 checkpoint 文件 [在此](https://github.com/open-mmlab/mmdetection/tree/master/configs/faster_rcnn) 。 + + ```shell + python tools/test.py \ + configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py \ + checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth \ + --show-dir faster_rcnn_r50_fpn_1x_results + ``` + +3. 在 Pascal VOC 数据集上测试 Faster R-CNN,不保存测试结果,测试 `mAP`。配置文件和 checkpoint 文件 [在此](https://github.com/open-mmlab/mmdetection/tree/master/configs/pascal_voc) 。 + + ```shell + python tools/test.py \ + configs/pascal_voc/faster_rcnn_r50_fpn_1x_voc.py \ + checkpoints/faster_rcnn_r50_fpn_1x_voc0712_20200624-c9895d40.pth \ + --eval mAP + ``` + +4. 使用 8 块 GPU 测试 Mask R-CNN,测试 `bbox` 和 `mAP` 。配置文件和 checkpoint 文件 [在此](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn) 。 + + ```shell + ./tools/dist_test.sh \ + configs/mask_rcnn_r50_fpn_1x_coco.py \ + checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth \ + 8 \ + --out results.pkl \ + --eval bbox segm + ``` + +5. 使用 8 块 GPU 测试 Mask R-CNN,测试**每类**的 `bbox` 和 `mAP`。配置文件和 checkpoint 文件 [在此](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn) 。 + + ```shell + ./tools/dist_test.sh \ + configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py \ + checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth \ + 8 \ + --out results.pkl \ + --eval bbox segm \ + --options "classwise=True" + ``` + +6. 在 COCO test-dev 数据集上,使用 8 块 GPU 测试 Mask R-CNN,并生成 JSON 文件提交到官方评测服务器。配置文件和 checkpoint 文件 [在此](https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn) 。 + + ```shell + ./tools/dist_test.sh \ + configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py \ + checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth \ + 8 \ + --format-only \ + --options "jsonfile_prefix=./mask_rcnn_test-dev_results" + ``` + +这行命令生成两个 JSON 文件 `mask_rcnn_test-dev_results.bbox.json` 和 `mask_rcnn_test-dev_results.segm.json`。 + +7. 在 Cityscapes 数据集上,使用 8 块 GPU 测试 Mask R-CNN,生成 txt 和 png 文件,并上传到官方评测服务器。配置文件和 checkpoint 文件 [在此](https://github.com/open-mmlab/mmdetection/tree/master/configs/cityscapes) 。 + + ```shell + ./tools/dist_test.sh \ + configs/cityscapes/mask_rcnn_r50_fpn_1x_cityscapes.py \ + checkpoints/mask_rcnn_r50_fpn_1x_cityscapes_20200227-afe51d5a.pth \ + 8 \ + --format-only \ + --options "txtfile_prefix=./mask_rcnn_cityscapes_test_results" + ``` + +生成的 png 和 txt 文件在 `./mask_rcnn_cityscapes_test_results` 文件夹下。 + +### 不使用 Ground Truth 标注进行测试 + +MMDetection 支持在不使用 ground-truth 标注的情况下对模型进行测试,这需要用到 `CocoDataset`。如果你的数据集格式不是 COCO 格式的,请将其转化成 COCO 格式。如果你的数据集格式是 VOC 或者 Cityscapes,你可以使用 [tools/dataset_converters](https://github.com/open-mmlab/mmdetection/tree/master/tools/dataset_converters) 内的脚本直接将其转化成 COCO 格式。如果是其他格式,可以使用 [images2coco 脚本](https://github.com/open-mmlab/mmdetection/tree/master/tools/dataset_converters/images2coco.py) 进行转换。 + +```shell +python tools/dataset_converters/images2coco.py \ + ${IMG_PATH} \ + ${CLASSES} \ + ${OUT} \ + [--exclude-extensions] +``` + +参数: + +- `IMG_PATH`: 图片根路径。 +- `CLASSES`: 类列表文本文件名。文本中每一行存储一个类别。 +- `OUT`: 输出 json 文件名。 默认保存目录和 `IMG_PATH` 在同一级。 +- `exclude-extensions`: 待排除的文件后缀名。 + +在转换完成后,使用如下命令进行测试 + +```shell +# 单 GPU 测试 +python tools/test.py \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + --format-only \ + --options ${JSONFILE_PREFIX} \ + [--show] + +# CPU 测试:禁用 GPU 并运行单 GPU 测试脚本 +export CUDA_VISIBLE_DEVICES=-1 +python tools/test.py \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + [--out ${RESULT_FILE}] \ + [--eval ${EVAL_METRICS}] \ + [--show] + +# 单节点多 GPU 测试 +bash tools/dist_test.sh \ + ${CONFIG_FILE} \ + ${CHECKPOINT_FILE} \ + ${GPU_NUM} \ + --format-only \ + --options ${JSONFILE_PREFIX} \ + [--show] +``` + +假设 [model zoo](https://mmdetection.readthedocs.io/en/latest/modelzoo_statistics.html) 中的 checkpoint 文件被下载到了 `checkpoints/` 文件夹下, +我们可以使用以下命令,用 8 块 GPU 在 COCO test-dev 数据集上测试 Mask R-CNN,并且生成 JSON 文件。 + +```sh +./tools/dist_test.sh \ + configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py \ + checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth \ + 8 \ + -format-only \ + --options "jsonfile_prefix=./mask_rcnn_test-dev_results" +``` + +这行命令生成两个 JSON 文件 `mask_rcnn_test-dev_results.bbox.json` 和 `mask_rcnn_test-dev_results.segm.json`。 + +### 批量推理 + +MMDetection 在测试模式下,既支持单张图片的推理,也支持对图像进行批量推理。默认情况下,我们使用单张图片的测试,你可以通过修改测试数据配置文件中的 `samples_per_gpu` 来开启批量测试。 +开启批量推理的配置文件修改方法为: + +```shell +data = dict(train=dict(...), val=dict(...), test=dict(samples_per_gpu=2, ...)) +``` + +或者你可以通过将 `--cfg-options` 设置为 `--cfg-options data.test.samples_per_gpu=2` 来开启它。 + +### 弃用 ImageToTensor + +在测试模式下,弃用 `ImageToTensor` 流程,取而代之的是 `DefaultFormatBundle`。建议在你的测试数据流程的配置文件中手动替换它,如: + +```python +# (已弃用)使用 ImageToTensor +pipelines = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', mean=[0, 0, 0], std=[1, 1, 1]), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) + ] + +# (建议使用)手动将 ImageToTensor 替换为 DefaultFormatBundle +pipelines = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', mean=[0, 0, 0], std=[1, 1, 1]), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img']), + ]) + ] +``` + +## 在标准数据集上训练预定义的模型 + +MMDetection 也为训练检测模型提供了开盖即食的工具。本节将展示在标准数据集(比如 COCO)上如何训练一个预定义的模型。 + +### 数据集 + +训练需要准备好数据集,细节请参考 [数据集准备](#%E6%95%B0%E6%8D%AE%E9%9B%86%E5%87%86%E5%A4%87) 。 + +**注意**: +目前,`configs/cityscapes` 文件夹下的配置文件都是使用 COCO 预训练权值进行初始化的。如果网络连接不可用或者速度很慢,你可以提前下载现存的模型。否则可能在训练的开始会有错误发生。 + +### 学习率自动缩放 + +**注意**:在配置文件中的学习率是在 8 块 GPU,每块 GPU 有 2 张图像(批大小为 8\*2=16)的情况下设置的。其已经设置在`config/_base_/default_runtime.py` 中的 `auto_scale_lr.base_batch_size`。当配置文件的批次大小为`16`时,学习率会基于该值进行自动缩放。同时,为了不影响其他基于 mmdet 的 codebase,启用自动缩放标志 `auto_scale_lr.enable` 默认设置为 `False`。 + +如果要启用此功能,需在命令添加参数 `--auto-scale-lr`。并且在启动命令之前,请检查下即将使用的配置文件的名称,因为配置名称指示默认的批处理大小。 +在默认情况下,批次大小是 `8 x 2 = 16`,例如:`faster_rcnn_r50_caffe_fpn_90k_coco.py` 或者 `pisa_faster_rcnn_x101_32x4d_fpn_1x_coco.py`;若不是默认批次,你可以在配置文件看到像 `_NxM_` 字样的,例如:`cornernet_hourglass104_mstest_32x3_210e_coco.py` 的批次大小是 `32 x 3 = 96`, 或者 `scnet_x101_64x4d_fpn_8x1_20e_coco.py` 的批次大小是 `8 x 1 = 8`。 + +**请记住:如果使用不是默认批次大小为`16`的配置文件,请检查配置文件中的底部,会有 `auto_scale_lr.base_batch_size`。如果找不到,可以在其继承的 `_base_=[xxx]` 文件中找到。另外,如果想使用自动缩放学习率的功能,请不要修改这些值。** + +学习率自动缩放基本用法如下: + +```shell +python tools/train.py \ + ${CONFIG_FILE} \ + --auto-scale-lr \ + [optional arguments] +``` + +执行命令之后,会根据机器的GPU数量和训练的批次大小对学习率进行自动缩放,缩放方式详见 [线性扩展规则](https://arxiv.org/abs/1706.02677) ,比如:在 4 块 GPU 并且每张 GPU 上有 2 张图片的情况下 `lr=0.01`,那么在 16 块 GPU 并且每张 GPU 上有 4 张图片的情况下, LR 会自动缩放至`lr=0.08`。 + +如果不启用该功能,则需要根据 [线性扩展规则](https://arxiv.org/abs/1706.02677) 来手动计算并修改配置文件里面 `optimizer.lr` 的值。 + +### 使用单 GPU 训练 + +我们提供了 `tools/train.py` 来开启在单张 GPU 上的训练任务。基本使用如下: + +```shell +python tools/train.py \ + ${CONFIG_FILE} \ + [optional arguments] +``` + +在训练期间,日志文件和 checkpoint 文件将会被保存在工作目录下,它需要通过配置文件中的 `work_dir` 或者 CLI 参数中的 `--work-dir` 来指定。 + +默认情况下,模型将在每轮训练之后在 validation 集上进行测试,测试的频率可以通过设置配置文件来指定: + +```python +# 每 12 轮迭代进行一次测试评估 +evaluation = dict(interval=12) +``` + +这个工具接受以下参数: + +- `--no-validate` (**不建议**): 在训练期间关闭测试. +- `--work-dir ${WORK_DIR}`: 覆盖工作目录. +- `--resume-from ${CHECKPOINT_FILE}`: 从某个 checkpoint 文件继续训练. +- `--options 'Key=value'`: 覆盖使用的配置文件中的其他设置. + +**注意**: +`resume-from` 和 `load-from` 的区别: + +`resume-from` 既加载了模型的权重和优化器的状态,也会继承指定 checkpoint 的迭代次数,不会重新开始训练。`load-from` 则是只加载模型的权重,它的训练是从头开始的,经常被用于微调模型。 + +### 使用 CPU 训练 + +使用 CPU 训练的流程和使用单 GPU 训练的流程一致,我们仅需要在训练流程开始前禁用 GPU。 + +```shell +export CUDA_VISIBLE_DEVICES=-1 +``` + +之后运行单 GPU 训练脚本即可。 + +**注意**: + +我们不推荐用户使用 CPU 进行训练,这太过缓慢。我们支持这个功能是为了方便用户在没有 GPU 的机器上进行调试。 + +### 在多 GPU 上训练 + +我们提供了 `tools/dist_train.sh` 来开启在多 GPU 上的训练。基本使用如下: + +```shell +bash ./tools/dist_train.sh \ + ${CONFIG_FILE} \ + ${GPU_NUM} \ + [optional arguments] +``` + +可选参数和单 GPU 训练的可选参数一致。 + +#### 同时启动多个任务 + +如果你想在一台机器上启动多个任务的话,比如在一个有 8 块 GPU 的机器上启动 2 个需要 4 块GPU的任务,你需要给不同的训练任务指定不同的端口(默认为 29500)来避免冲突。 + +如果你使用 `dist_train.sh` 来启动训练任务,你可以使用命令来设置端口。 + +```shell +CUDA_VISIBLE_DEVICES=0,1,2,3 PORT=29500 ./tools/dist_train.sh ${CONFIG_FILE} 4 +CUDA_VISIBLE_DEVICES=4,5,6,7 PORT=29501 ./tools/dist_train.sh ${CONFIG_FILE} 4 +``` + +### 使用多台机器训练 + +如果您想使用由 ethernet 连接起来的多台机器, 您可以使用以下命令: + +在第一台机器上: + +```shell +NNODES=2 NODE_RANK=0 PORT=$MASTER_PORT MASTER_ADDR=$MASTER_ADDR sh tools/dist_train.sh $CONFIG $GPUS +``` + +在第二台机器上: + +```shell +NNODES=2 NODE_RANK=1 PORT=$MASTER_PORT MASTER_ADDR=$MASTER_ADDR sh tools/dist_train.sh $CONFIG $GPUS +``` + +但是,如果您不使用高速网路连接这几台机器的话,训练将会非常慢。 + +### 使用 Slurm 来管理任务 + +Slurm 是一个常见的计算集群调度系统。在 Slurm 管理的集群上,你可以使用 `slurm.sh` 来开启训练任务。它既支持单节点训练也支持多节点训练。 + +基本使用如下: + +```shell +[GPUS=${GPUS}] ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} ${WORK_DIR} +``` + +以下是在一个名称为 _dev_ 的 Slurm 分区上,使用 16 块 GPU 来训练 Mask R-CNN 的例子,并且将 `work-dir` 设置在了某些共享文件系统下。 + +```shell +GPUS=16 ./tools/slurm_train.sh dev mask_r50_1x configs/mask_rcnn_r50_fpn_1x_coco.py /nfs/xxxx/mask_rcnn_r50_fpn_1x +``` + +你可以查看 [源码](https://github.com/open-mmlab/mmdetection/blob/master/tools/slurm_train.sh) 来检查全部的参数和环境变量. + +在使用 Slurm 时,端口需要以下方的某个方法之一来设置。 + +1. 通过 `--options` 来设置端口。我们非常建议用这种方法,因为它无需改变原始的配置文件。 + + ```shell + CUDA_VISIBLE_DEVICES=0,1,2,3 GPUS=4 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config1.py ${WORK_DIR} --options 'dist_params.port=29500' + CUDA_VISIBLE_DEVICES=4,5,6,7 GPUS=4 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config2.py ${WORK_DIR} --options 'dist_params.port=29501' + ``` + +2. 修改配置文件来设置不同的交流端口。 + + 在 `config1.py` 中,设置: + + ```python + dist_params = dict(backend='nccl', port=29500) + ``` + + 在 `config2.py` 中,设置: + + ```python + dist_params = dict(backend='nccl', port=29501) + ``` + + 然后你可以使用 `config1.py` 和 `config2.py` 来启动两个任务了。 + + ```shell + CUDA_VISIBLE_DEVICES=0,1,2,3 GPUS=4 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config1.py ${WORK_DIR} + CUDA_VISIBLE_DEVICES=4,5,6,7 GPUS=4 ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} config2.py ${WORK_DIR} + ``` diff --git a/docs/zh_cn/2_new_data_model.md b/docs/zh_cn/2_new_data_model.md new file mode 100644 index 0000000..f760c51 --- /dev/null +++ b/docs/zh_cn/2_new_data_model.md @@ -0,0 +1,267 @@ +# 2: 在自定义数据集上进行训练 + +通过本文档,你将会知道如何使用自定义数据集对预先定义好的模型进行推理,测试以及训练。我们使用 [balloon dataset](https://github.com/matterport/Mask_RCNN/tree/master/samples/balloon) 作为例子来描述整个过程。 + +基本步骤如下: + +1. 准备自定义数据集 +2. 准备配置文件 +3. 在自定义数据集上进行训练,测试和推理。 + +## 准备自定义数据集 + +MMDetection 一共支持三种形式应用新数据集: + +1. 将数据集重新组织为 COCO 格式。 +2. 将数据集重新组织为一个中间格式。 +3. 实现一个新的数据集。 + +我们通常建议使用前面两种方法,因为它们通常来说比第三种方法要简单。 + +在本文档中,我们展示一个例子来说明如何将数据转化为 COCO 格式。 + +**注意**:MMDetection 现只支持对 COCO 格式的数据集进行 mask AP 的评测。 + +所以用户如果要进行实例分割,只能将数据转成 COCO 格式。 + +### COCO标注格式 + +用于实例分割的 COCO 数据集格式如下所示,其中的键(key)都是必要的,参考[这里](https://cocodataset.org/#format-data)来获取更多细节。 + +```json +{ + "images": [image], + "annotations": [annotation], + "categories": [category] +} + + +image = { + "id": int, + "width": int, + "height": int, + "file_name": str, +} + +annotation = { + "id": int, + "image_id": int, + "category_id": int, + "segmentation": RLE or [polygon], + "area": float, + "bbox": [x,y,width,height], + "iscrowd": 0 or 1, +} + +categories = [{ + "id": int, + "name": str, + "supercategory": str, +}] +``` + +现在假设我们使用 balloon dataset。 + +下载了数据集之后,我们需要实现一个函数将标注格式转化为 COCO 格式。然后我们就可以使用已经实现的 `COCODataset` 类来加载数据并进行训练以及评测。 + +如果你浏览过新数据集,你会发现格式如下: + +```json +{'base64_img_data': '', + 'file_attributes': {}, + 'filename': '34020010494_e5cb88e1c4_k.jpg', + 'fileref': '', + 'regions': {'0': {'region_attributes': {}, + 'shape_attributes': {'all_points_x': [1020, + 1000, + 994, + 1003, + 1023, + 1050, + 1089, + 1134, + 1190, + 1265, + 1321, + 1361, + 1403, + 1428, + 1442, + 1445, + 1441, + 1427, + 1400, + 1361, + 1316, + 1269, + 1228, + 1198, + 1207, + 1210, + 1190, + 1177, + 1172, + 1174, + 1170, + 1153, + 1127, + 1104, + 1061, + 1032, + 1020], + 'all_points_y': [963, + 899, + 841, + 787, + 738, + 700, + 663, + 638, + 621, + 619, + 643, + 672, + 720, + 765, + 800, + 860, + 896, + 942, + 990, + 1035, + 1079, + 1112, + 1129, + 1134, + 1144, + 1153, + 1166, + 1166, + 1150, + 1136, + 1129, + 1122, + 1112, + 1084, + 1037, + 989, + 963], + 'name': 'polygon'}}}, + 'size': 1115004} +``` + +标注文件时是 JSON 格式的,其中所有键(key)组成了一张图片的所有标注。 + +其中将 balloon dataset 转化为 COCO 格式的代码如下所示。 + +```python + +import os.path as osp +import mmcv + +def convert_balloon_to_coco(ann_file, out_file, image_prefix): + data_infos = mmcv.load(ann_file) + + annotations = [] + images = [] + obj_count = 0 + for idx, v in enumerate(mmcv.track_iter_progress(data_infos.values())): + filename = v['filename'] + img_path = osp.join(image_prefix, filename) + height, width = mmcv.imread(img_path).shape[:2] + + images.append(dict( + id=idx, + file_name=filename, + height=height, + width=width)) + + bboxes = [] + labels = [] + masks = [] + for _, obj in v['regions'].items(): + assert not obj['region_attributes'] + obj = obj['shape_attributes'] + px = obj['all_points_x'] + py = obj['all_points_y'] + poly = [(x + 0.5, y + 0.5) for x, y in zip(px, py)] + poly = [p for x in poly for p in x] + + x_min, y_min, x_max, y_max = ( + min(px), min(py), max(px), max(py)) + + + data_anno = dict( + image_id=idx, + id=obj_count, + category_id=0, + bbox=[x_min, y_min, x_max - x_min, y_max - y_min], + area=(x_max - x_min) * (y_max - y_min), + segmentation=[poly], + iscrowd=0) + annotations.append(data_anno) + obj_count += 1 + + coco_format_json = dict( + images=images, + annotations=annotations, + categories=[{'id':0, 'name': 'balloon'}]) + mmcv.dump(coco_format_json, out_file) +``` + +使用如上的函数,用户可以成功将标注文件转化为 JSON 格式,之后可以使用 `CocoDataset` 对模型进行训练和评测。 + +## 准备配置文件 + +第二步需要准备一个配置文件来成功加载数据集。假设我们想要用 balloon dataset 来训练配备了 FPN 的 Mask R-CNN ,如下是我们的配置文件。假设配置文件命名为 `mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_balloon.py`,相应保存路径为 `configs/balloon/`,配置文件内容如下所示。 + +```python +# 这个新的配置文件继承自一个原始配置文件,只需要突出必要的修改部分即可 +_base_ = 'mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py' + +# 我们需要对头中的类别数量进行修改来匹配数据集的标注 +model = dict( + roi_head=dict( + bbox_head=dict(num_classes=1), + mask_head=dict(num_classes=1))) + +# 修改数据集相关设置 +dataset_type = 'CocoDataset' +classes = ('balloon',) +data = dict( + train=dict( + img_prefix='balloon/train/', + classes=classes, + ann_file='balloon/train/annotation_coco.json'), + val=dict( + img_prefix='balloon/val/', + classes=classes, + ann_file='balloon/val/annotation_coco.json'), + test=dict( + img_prefix='balloon/val/', + classes=classes, + ann_file='balloon/val/annotation_coco.json')) + +# 我们可以使用预训练的 Mask R-CNN 来获取更好的性能 +load_from = 'checkpoints/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth' +``` + +## 训练一个新的模型 + +为了使用新的配置方法来对模型进行训练,你只需要运行如下命令。 + +```shell +python tools/train.py configs/balloon/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_balloon.py +``` + +参考[情况 1](./1_exist_data_model.md)来获取更多详细的使用方法。 + +## 测试以及推理 + +为了测试训练完毕的模型,你只需要运行如下命令。 + +```shell +python tools/test.py configs/balloon/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_balloon.py work_dirs/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_balloon.py/latest.pth --eval bbox segm +``` + +参考[情况 1](./1_exist_data_model.md)来获取更多详细的使用方法。 diff --git a/docs/zh_cn/3_exist_data_new_model.md b/docs/zh_cn/3_exist_data_new_model.md new file mode 100644 index 0000000..e32e373 --- /dev/null +++ b/docs/zh_cn/3_exist_data_new_model.md @@ -0,0 +1,283 @@ +# 3: 在标准数据集上训练自定义模型 + +在本文中,你将知道如何在标准数据集上训练、测试和推理自定义模型。我们将在 cityscapes 数据集上以自定义 Cascade Mask R-CNN R50 模型为例演示整个过程,为了方便说明,我们将 neck 模块中的 `FPN` 替换为 `AugFPN`,并且在训练中的自动增强类中增加 `Rotate` 或 `Translate`。 + +基本步骤如下所示: + +1. 准备标准数据集 +2. 准备你的自定义模型 +3. 准备配置文件 +4. 在标准数据集上对模型进行训练、测试和推理 + +## 准备标准数据集 + +在本文中,我们使用 cityscapes 标准数据集为例进行说明。 + +推荐将数据集根路径采用符号链接方式链接到 `$MMDETECTION/data`。 + +如果你的文件结构不同,你可能需要在配置文件中进行相应的路径更改。标准的文件组织格式如下所示: + +```none +mmdetection +├── mmdet +├── tools +├── configs +├── data +│ ├── coco +│ │ ├── annotations +│ │ ├── train2017 +│ │ ├── val2017 +│ │ ├── test2017 +│ ├── cityscapes +│ │ ├── annotations +│ │ ├── leftImg8bit +│ │ │ ├── train +│ │ │ ├── val +│ │ ├── gtFine +│ │ │ ├── train +│ │ │ ├── val +│ ├── VOCdevkit +│ │ ├── VOC2007 +│ │ ├── VOC2012 +``` + +你也可以通过如下方式设定数据集根路径 + +```bash +export MMDET_DATASETS=$data_root +``` + +我们将会使用环境便变量 `$MMDET_DATASETS` 作为数据集的根目录,因此你无需再修改相应配置文件的路径信息。 + +你需要使用脚本 `tools/dataset_converters/cityscapes.py` 将 cityscapes 标注转化为 coco 标注格式。 + +```shell +pip install cityscapesscripts +python tools/dataset_converters/cityscapes.py ./data/cityscapes --nproc 8 --out-dir ./data/cityscapes/annotations +``` + +目前在 `cityscapes `文件夹中的配置文件所对应模型是采用 COCO 预训练权重进行初始化的。 + +如果你的网络不可用或者比较慢,建议你先手动下载对应的预训练权重,否则可能在训练开始时候出现错误。 + +## 准备你的自定义模型 + +第二步是准备你的自定义模型或者训练相关配置。假设你想在已有的 Cascade Mask R-CNN R50 检测模型基础上,新增一个新的 neck 模块 `AugFPN` 去代替默认的 `FPN`,以下是具体实现: + +### 1 定义新的 neck (例如 AugFPN) + +首先创建新文件 `mmdet/models/necks/augfpn.py`. + +```python +from ..builder import NECKS + +@NECKS.register_module() +class AugFPN(nn.Module): + + def __init__(self, + in_channels, + out_channels, + num_outs, + start_level=0, + end_level=-1, + add_extra_convs=False): + pass + + def forward(self, inputs): + # implementation is ignored + pass +``` + +### 2 导入模块 + +你可以采用两种方式导入模块,第一种是在 `mmdet/models/necks/__init__.py` 中添加如下内容 + +```python +from .augfpn import AugFPN +``` + +第二种是增加如下代码到对应配置中,这种方式的好处是不需要改动代码 + +```python +custom_imports = dict( + imports=['mmdet.models.necks.augfpn.py'], + allow_failed_imports=False) +``` + +### 3 修改配置 + +```python +neck=dict( + type='AugFPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5) +``` + +关于自定义模型其余相关细节例如实现新的骨架网络,头部网络、损失函数,以及运行时训练配置例如定义新的优化器、使用梯度裁剪、定制训练调度策略和钩子等,请参考文档 [自定义模型](tutorials/customize_models.md) 和 [自定义运行时训练配置](tutorials/customize_runtime.md)。 + +## 准备配置文件 + +第三步是准备训练配置所需要的配置文件。假设你打算基于 cityscapes 数据集,在 Cascade Mask R-CNN R50 中新增 `AugFPN` 模块,同时增加 `Rotate` 或者 `Translate` 数据增强策略,假设你的配置文件位于 `configs/cityscapes/` 目录下,并且取名为 `cascade_mask_rcnn_r50_augfpn_autoaug_10e_cityscapes.py`,则配置信息如下: + +```python +# 继承 base 配置,然后进行针对性修改 +_base_ = [ + '../_base_/models/cascade_mask_rcnn_r50_fpn.py', + '../_base_/datasets/cityscapes_instance.py', '../_base_/default_runtime.py' +] + +model = dict( + # 设置为 None,表示不加载 ImageNet 预训练权重, + # 后续可以设置 `load_from` 参数用来加载 COCO 预训练权重 + backbone=dict(init_cfg=None), + pretrained=None, + # 使用新增的 `AugFPN` 模块代替默认的 `FPN` + neck=dict( + type='AugFPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5), + # 我们也需要将 num_classes 从 80 修改为 8 来匹配 cityscapes 数据集标注 + # 这个修改包括 `bbox_head` 和 `mask_head`. + roi_head=dict( + bbox_head=[ + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + # 将 COCO 类别修改为 cityscapes 类别 + num_classes=8, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + # 将 COCO 类别修改为 cityscapes 类别 + num_classes=8, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.05, 0.05, 0.1, 0.1]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0)), + dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + # 将 COCO 类别修改为 cityscapes 类别 + num_classes=8, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.033, 0.033, 0.067, 0.067]), + reg_class_agnostic=True, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)) + ], + mask_head=dict( + type='FCNMaskHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + # 将 COCO 类别修改为 cityscapes 类别 + num_classes=8, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0)))) + +# 覆写 `train_pipeline`,然后新增 `AutoAugment` 训练配置 +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='AutoAugment', + policies=[ + [dict( + type='Rotate', + level=5, + img_fill_val=(124, 116, 104), + prob=0.5, + scale=1) + ], + [dict(type='Rotate', level=7, img_fill_val=(124, 116, 104)), + dict( + type='Translate', + level=5, + prob=0.5, + img_fill_val=(124, 116, 104)) + ], + ]), + dict( + type='Resize', img_scale=[(2048, 800), (2048, 1024)], keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] + +# 设置每张显卡的批处理大小,同时设置新的训练 pipeline +data = dict( + samples_per_gpu=1, + workers_per_gpu=3, + # 用新的训练 pipeline 配置覆写 pipeline + train=dict(dataset=dict(pipeline=train_pipeline))) + +# 设置优化器 +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# 设置定制的学习率策略 +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[8]) +runner = dict(type='EpochBasedRunner', max_epochs=10) + +# 我们采用 COCO 预训练过的 Cascade Mask R-CNN R50 模型权重作为初始化权重,可以得到更加稳定的性能 +load_from = 'http://download.openmmlab.com/mmdetection/v2.0/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco/cascade_mask_rcnn_r50_fpn_1x_coco_20200203-9d4dcb24.pth' +``` + +## 训练新模型 + +为了能够使用新增配置来训练模型,你可以运行如下命令: + +```shell +python tools/train.py configs/cityscapes/cascade_mask_rcnn_r50_augfpn_autoaug_10e_cityscapes.py +``` + +如果想了解更多用法,可以参考 [例子1](1_exist_data_model.md)。 + +## 测试和推理 + +为了能够测试训练好的模型,你可以运行如下命令: + +```shell +python tools/test.py configs/cityscapes/cascade_mask_rcnn_r50_augfpn_autoaug_10e_cityscapes.py work_dirs/cascade_mask_rcnn_r50_augfpn_autoaug_10e_cityscapes.py/latest.pth --eval bbox segm +``` + +如果想了解更多用法,可以参考 [例子1](1_exist_data_model.md)。 diff --git a/docs/zh_cn/Makefile b/docs/zh_cn/Makefile new file mode 100644 index 0000000..d4bb2cb --- /dev/null +++ b/docs/zh_cn/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/zh_cn/_static/css/readthedocs.css b/docs/zh_cn/_static/css/readthedocs.css new file mode 100644 index 0000000..57ed0ad --- /dev/null +++ b/docs/zh_cn/_static/css/readthedocs.css @@ -0,0 +1,6 @@ +.header-logo { + background-image: url("../image/mmdet-logo.png"); + background-size: 156px 40px; + height: 40px; + width: 156px; +} diff --git a/docs/zh_cn/_static/image/mmdet-logo.png b/docs/zh_cn/_static/image/mmdet-logo.png new file mode 100644 index 0000000..58e2b5e Binary files /dev/null and b/docs/zh_cn/_static/image/mmdet-logo.png differ diff --git a/docs/zh_cn/api.rst b/docs/zh_cn/api.rst new file mode 100644 index 0000000..c75a467 --- /dev/null +++ b/docs/zh_cn/api.rst @@ -0,0 +1,108 @@ +mmdet.apis +-------------- +.. automodule:: mmdet.apis + :members: + +mmdet.core +-------------- + +anchor +^^^^^^^^^^ +.. automodule:: mmdet.core.anchor + :members: + +bbox +^^^^^^^^^^ +.. automodule:: mmdet.core.bbox + :members: + +export +^^^^^^^^^^ +.. automodule:: mmdet.core.export + :members: + +mask +^^^^^^^^^^ +.. automodule:: mmdet.core.mask + :members: + +evaluation +^^^^^^^^^^ +.. automodule:: mmdet.core.evaluation + :members: + +post_processing +^^^^^^^^^^^^^^^ +.. automodule:: mmdet.core.post_processing + :members: + +utils +^^^^^^^^^^ +.. automodule:: mmdet.core.utils + :members: + +mmdet.datasets +-------------- + +datasets +^^^^^^^^^^ +.. automodule:: mmdet.datasets + :members: + +pipelines +^^^^^^^^^^ +.. automodule:: mmdet.datasets.pipelines + :members: + +samplers +^^^^^^^^^^ +.. automodule:: mmdet.datasets.samplers + :members: + +api_wrappers +^^^^^^^^^^ +.. automodule:: mmdet.datasets.api_wrappers + :members: + +mmdet.models +-------------- + +detectors +^^^^^^^^^^ +.. automodule:: mmdet.models.detectors + :members: + +backbones +^^^^^^^^^^ +.. automodule:: mmdet.models.backbones + :members: + +necks +^^^^^^^^^^^^ +.. automodule:: mmdet.models.necks + :members: + +dense_heads +^^^^^^^^^^^^ +.. automodule:: mmdet.models.dense_heads + :members: + +roi_heads +^^^^^^^^^^ +.. automodule:: mmdet.models.roi_heads + :members: + +losses +^^^^^^^^^^ +.. automodule:: mmdet.models.losses + :members: + +utils +^^^^^^^^^^ +.. automodule:: mmdet.models.utils + :members: + +mmdet.utils +-------------- +.. automodule::mmdet.utils + :members: diff --git a/docs/zh_cn/article.md b/docs/zh_cn/article.md new file mode 100644 index 0000000..9cd6fb6 --- /dev/null +++ b/docs/zh_cn/article.md @@ -0,0 +1,53 @@ +## 中文解读文案汇总 + +### 1 官方解读文案 + +#### 1.1 框架解读 + +- **[轻松掌握 MMDetection 整体构建流程(一)](https://zhuanlan.zhihu.com/p/337375549)** +- **[轻松掌握 MMDetection 整体构建流程(二)](https://zhuanlan.zhihu.com/p/341954021)** +- **[轻松掌握 MMDetection 中 Head 流程](https://zhuanlan.zhihu.com/p/343433169)** + +#### 1.2 算法解读 + +- **[轻松掌握 MMDetection 中常用算法(一):RetinaNet 及配置详解](https://zhuanlan.zhihu.com/p/346198300)** +- **[轻松掌握 MMDetection 中常用算法(二):Faster R-CNN|Mask R-CNN](https://zhuanlan.zhihu.com/p/349807581)** +- [轻松掌握 MMDetection 中常用算法(三):FCOS](https://zhuanlan.zhihu.com/p/358056615) +- [轻松掌握 MMDetection 中常用算法(四):ATSS](https://zhuanlan.zhihu.com/p/358125611) +- [轻松掌握 MMDetection 中常用算法(五):Cascade R-CNN](https://zhuanlan.zhihu.com/p/360952172) +- [轻松掌握 MMDetection 中常用算法(六):YOLOF](https://zhuanlan.zhihu.com/p/370758213) +- [轻松掌握 MMDetection 中常用算法(七):CenterNet](https://zhuanlan.zhihu.com/p/374891478) +- [轻松掌握 MMDetection 中常用算法(八):YOLACT](https://zhuanlan.zhihu.com/p/376347955) +- [轻松掌握 MMDetection 中常用算法(九):AutoAssign](https://zhuanlan.zhihu.com/p/378581552) +- [YOLOX 在 MMDetection 中复现全流程解析](https://zhuanlan.zhihu.com/p/398545304) +- [喂喂喂!你可以减重了!小模型 - MMDetection 新增SSDLite 、 MobileNetV2YOLOV3 两大经典算法](https://zhuanlan.zhihu.com/p/402781143) + +#### 1.3 工具解读 + +- [OpenMMLab 中混合精度训练 AMP 的正确打开方式](https://zhuanlan.zhihu.com/p/375224982) +- [小白都能看懂!手把手教你使用混淆矩阵分析目标检测](https://zhuanlan.zhihu.com/p/443499860) +- [MMDetection 图像缩放 Resize 详细说明 OpenMMLab](https://zhuanlan.zhihu.com/p/381117525) +- [拿什么拯救我的 4G 显卡](https://zhuanlan.zhihu.com/p/430123077) +- [MMDet居然能用MMCls的Backbone?论配置文件的打开方式](https://zhuanlan.zhihu.com/p/436865195) + +#### 1.4 知乎问答 + +- [COCO数据集上1x模式下为什么不采用多尺度训练?](https://www.zhihu.com/question/462170786/answer/1915119662) +- [MMDetection中SOTA论文源码中将训练过程中BN层的eval打开?](https://www.zhihu.com/question/471189603/answer/2195540892) +- [基于PyTorch的MMDetection中训练的随机性来自何处?](https://www.zhihu.com/question/453511684/answer/1839683634) +- [单阶段、双阶段、anchor-based、anchor-free 这四者之间有什么联系吗?](https://www.zhihu.com/question/428972054/answer/1619925296) +- [目标检测的深度学习方法,有推荐的书籍或资料吗?](https://www.zhihu.com/question/391577080/answer/1612593817) +- [大佬们,刚入学研究生,想入门目标检测,有什么学习路线可以入门的?](https://www.zhihu.com/question/343768934/answer/1612580715) +- [目标检测领域还有什么可以做的?](https://www.zhihu.com/question/280703314/answer/1627885518) +- [如何看待Transformer在CV上的应用前景,未来有可能替代CNN吗?](https://www.zhihu.com/question/437495132/answer/1686380553) +- [MMDetection如何学习源码?](https://www.zhihu.com/question/451585041/answer/1832498963) +- [如何具体上手实现目标检测呢?](https://www.zhihu.com/question/341401981/answer/1848561187) + +#### 1.5 其他 + +- **[不得不知的 MMDetection 学习路线(个人经验版)](https://zhuanlan.zhihu.com/p/369826931)** +- [OpenMMLab 社区专访之 YOLOX 复现篇](https://zhuanlan.zhihu.com/p/405913343) + +### 2 社区解读文案 + +- [手把手带你实现经典检测网络 Mask R-CNN 的推理](https://zhuanlan.zhihu.com/p/414082071) diff --git a/docs/zh_cn/compatibility.md b/docs/zh_cn/compatibility.md new file mode 100644 index 0000000..e9ebdd9 --- /dev/null +++ b/docs/zh_cn/compatibility.md @@ -0,0 +1,177 @@ +# MMDetection v2.x 兼容性说明 + +## MMDetection 2.25.0 + +为了加入 Mask2Former 实例分割模型,对 Mask2Former 的配置文件进行了重命名 [PR #7571](https://github.com/open-mmlab/mmdetection/pull/7571): + + + + + + + + + + + +
在 v2.25.0 之前v2.25.0 及之后
+ +``` +'mask2former_xxx_coco.py' 代表全景分割的配置文件 +``` + + + +``` +'mask2former_xxx_coco.py' 代表实例分割的配置文件 +'mask2former_xxx_coco-panoptic.py' 代表全景分割的配置文件 +``` + +
+ +## MMDetection 2.21.0 + +为了支持 CPU 训练,MMCV 中进行批处理的 scatter 的代码逻辑已经被修改。我们推荐使用 MMCV v1.4.4 或更高版本, +更多信息请参考 [MMCV PR #1621](https://github.com/open-mmlab/mmcv/pull/1621). + +## MMDetection 2.18.1 + +### MMCV compatibility + +为了修复 BaseTransformerLayer 中的权重引用问题, MultiheadAttention 中 batch first 的逻辑有所改变。 +我们推荐使用 MMCV v1.3.17 或更高版本。 更多信息请参考 [MMCV PR #1418](https://github.com/open-mmlab/mmcv/pull/1418) 。 + +## MMDetection 2.18.0 + +### DIIHead 兼容性 + +为了支持 QueryInst,在 DIIHead 的返回元组中加入了 attn_feats。 + +## MMDetection v2.14.0 + +### MMCV 版本 + +为了修复 EvalHook 优先级过低的问题,MMCV v1.3.8 中所有 hook 的优先级都重新进行了调整,因此 MMDetection v2.14.0 需要依赖最新的 MMCV v1.3.8 版本。 相关信息请参考[PR #1120](https://github.com/open-mmlab/mmcv/pull/1120) ,相关问题请参考[#5343](https://github.com/open-mmlab/mmdetection/issues/5343) 。 + +### SSD 兼容性 + +在 v2.14.0 中,为了使 SSD 能够被更灵活地使用,[PR #5291](https://github.com/open-mmlab/mmdetection/pull/5291) 重构了 SSD 的 backbone、neck 和 head。用户可以使用 tools/model_converters/upgrade_ssd_version.py 转换旧版本训练的模型。 + +```shell +python tools/model_converters/upgrade_ssd_version.py ${OLD_MODEL_PATH} ${NEW_MODEL_PATH} + +``` + +- OLD_MODEL_PATH:旧版 SSD 模型的路径。 +- NEW_MODEL_PATH:保存转换后模型权重的路径。 + +## MMDetection v2.12.0 + +在 v2.12.0 到 v2.18.0(或以上)版本的这段时间,为了提升通用性和便捷性,MMDetection 正在进行大规模重构。在升级到 v2.12.0 后 MMDetection 不可避免地带来了一些 BC Breaking,包括 MMCV 的版本依赖、模型初始化方式、模型 registry 和 mask AP 的评估。 + +### MMCV 版本 + +MMDetection v2.12.0 依赖 MMCV v1.3.3 中新增加的功能,包括:使用 `BaseModule` 统一参数初始化,模型 registry,以及[Deformable DETR](https://arxiv.org/abs/2010.04159) 中的 `MultiScaleDeformableAttn` CUDA 算子。 +注意,尽管 MMCV v1.3.2 已经包含了 MMDet 所需的功能,但是存在一些已知的问题。我们建议用户跳过 MMCV v1.3.2 使用 v1.3.3 版本。 + +### 统一模型初始化 + +为了统一 OpenMMLab 项目中的参数初始化方式,MMCV 新增加了 `BaseModule` 类,使用 `init_cfg` 参数对模块进行统一且灵活的初始化配置管理。 +现在用户需要在训练脚本中显式调用 `model.init_weights()` 来初始化模型(例如 [这行代码](https://github.com/open-mmlab/mmdetection/blob/master/tools/train.py#L162) ,在这之前则是在 detector 中进行处理的。 +**下游项目必须相应地更新模型初始化方式才能使用 MMDetection v2.12.0**。请参阅 [PR #4750](https://github.com/open-mmlab/mmdetection/pull/4750) 了解详情。 + +### 统一模型 registry + +为了能够使用在其他 OpenMMLab 项目中实现的 backbone,MMDetection v2.12.0 继承了在 MMCV (#760) 中创建的模型 registry。 +这样,只要 OpenMMLab 项目实现了某个 backbone,并且该项目也使用 MMCV 中的 registry,那么用户只需修改配置即可在 MMDetection 中使用该 backbone,不再需要将代码复制到 MMDetection 中。 更多详细信息,请参阅 [PR #5059](https://github.com/open-mmlab/mmdetection/pull/5059) 。 + +### Mask AP 评估 + +在 [PR #4898](https://github.com/open-mmlab/mmdetection/pull/4898) 和 v2.12.0 之前,对小、中、大目标的 mask AP 的评估是基于其边界框区域而不是真正的 mask 区域。 +这导致 `APs` 和 `APm` 变得更高但 `APl` 变得更低,但是不会影响整体的 mask AP。 [PR #4898](https://github.com/open-mmlab/mmdetection/pull/4898) 删除了 mask AP 计算中的 `bbox` ,改为使用 mask 区域。 +新的计算方式不会影响整体的 mask AP 评估,与 [Detectron2](https://github.com/facebookresearch/detectron2/)一致。 + +## 与 MMDetection v1.x 的兼容性 + +MMDetection v2.0 经过了大规模重构并解决了许多遗留问题。 MMDetection v2.0 不兼容 v1.x 版本,在这两个版本中使用相同的模型权重运行推理会产生不同的结果。 因此,MMDetection v2.0 重新对所有模型进行了 benchmark,并在 model zoo 中提供了新模型的权重和训练记录。 + +新旧版本的主要的区别有四方面:坐标系、代码库约定、训练超参和模块设计。 + +### 坐标系 + +新坐标系与 [Detectron2](https://github.com/facebookresearch/detectron2/) 一致, +将最左上角的像素的中心视为坐标原点 (0, 0) 而不是最左上角像素的左上角。 因此 COCO 边界框和分割标注中的坐标被解析为范围 `[0,width]` 和 `[0,height]` 中的坐标。 这个修改影响了所有与 bbox 及像素选择相关的计算,变得更加自然且更加准确。 + +- 在新坐标系中,左上角和右下角为 (x1, y1) (x2, y2) 的框的宽度及高度计算公式为 `width = x2 - x1` 和 `height = y2 - y1`。 + 在 MMDetection v1.x 和之前的版本中,高度和宽度都多了 `+ 1` 的操作。 + 本次修改包括三部分: + + 1. box 回归中的检测框变换以及编码/解码。 + 2. IoU 计算。这会影响 ground truth 和检测框之间的匹配以及 NMS 。但对兼容性的影响可以忽略不计。 + 3. Box 的角点坐标为浮点型,不再取整。这能使得检测结果更为准确,也使得检测框和 RoI 的最小尺寸不再为 1,但影响很小。 + +- Anchor 的中心与特征图的网格点对齐,类型变为 float。 + 在 MMDetection v1.x 和之前的版本中,anchors 是 `int` 类型且没有居中对齐。 + 这会影响 RPN 中的 Anchor 生成和所有基于 Anchor 的方法。 + +- ROIAlign 更好地与图像坐标系对齐。新的实现来自 [Detectron2](https://github.com/facebookresearch/detectron2/tree/master/detectron2/layers/csrc/ROIAlign) 。 + 当 RoI 用于提取 RoI 特征时,与 MMDetection v1.x 相比默认情况下相差半个像素。 + 能够通过设置 `aligned=False` 而不是 `aligned=True` 来维持旧版本的设置。 + +- Mask 的裁剪和粘贴更准确。 + + 1. 我们使用新的 RoIAlign 来提取 mask 目标。 在 MMDetection v1.x 中,bounding box 在提取 mask 目标之前被取整,裁剪过程是 numpy 实现的。 而在新版本中,裁剪的边界框不经过取整直接输入 RoIAlign。 此实现大大加快了训练速度(每次迭代约加速 0.1 秒,1x schedule 训练 Mask R50 时加速约 2 小时)并且理论上会更准确。 + 2. 在 MMDetection v2.0 中,修改后的 `paste_mask()` 函数应该比之前版本更准确。 此更改参考了 [Detectron2](https://github.com/facebookresearch/detectron2/blob/master/detectron2/structures/masks.py) 中的修改,可以将 COCO 上的 mask AP 提高约 0.5%。 + +### 代码库约定 + +- MMDetection v2.0 更改了类别标签的顺序,减少了回归和 mask 分支里的无用参数并使得顺序更加自然(没有 +1 和 -1)。 + 这会影响模型的所有分类层,使其输出的类别标签顺序发生改变。回归分支和 mask head 的最后一层不再为 K 个类别保留 K+1 个通道,类别顺序与分类分支一致。 + + - 在 MMDetection v2.0 中,标签 “K” 表示背景,标签 \[0, K-1\] 对应于 K = num_categories 个对象类别。 + + - 在 MMDetection v1.x 及之前的版本中,标签 “0” 表示背景,标签 \[1, K\] 对应 K 个类别。 + + - **注意**:softmax RPN 的类顺序在 version\<=2.4.0 中仍然和 1.x 中的一样,而 sigmoid RPN 不受影响。从 MMDetection v2.5.0 开始,所有 head 中的类顺序是统一的。 + +- 不使用 R-CNN 中的低质量匹配。在 MMDetection v1.x 和之前的版本中,`max_iou_assigner` 会在 RPN 和 R-CNN 训练时给每个 ground truth 匹配低质量框。我们发现这会导致最佳的 GT 框不会被分配给某些边界框, + 因此,在MMDetection v2.0 的 R-CNN 训练中默认不允许低质量匹配。这有时可能会稍微改善 box AP(约为 0.1%)。 + +- 单独的宽高比例系数。在 MMDetection v1.x 和以前的版本中,`keep_ratio=True` 时比例系数是单个浮点数,这并不准确,因为宽度和高度的比例系数会有一定的差异。 MMDetection v2.0 对宽度和高度使用单独的比例系数,对 AP 的提升约为 0.1%。 + +- 修改了 config 文件名称的规范。 由于 model zoo 中模型不断增多, MMDetection v2.0 采用新的命名规则: + + ```shell + [model]_(model setting)_[backbone]_[neck]_(norm setting)_(misc)_(gpu x batch)_[schedule]_[dataset].py + ``` + + 其中 (`misc`) 包括 DCN 和 GCBlock 等。更多详细信息在 [配置文件说明文档](config.md) 中说明 + +- MMDetection v2.0 使用新的 ResNet Caffe backbone 来减少加载预训练模型时的警告。新 backbone 中的大部分权重与以前的相同,但没有 `conv.bias`,且它们使用不同的 `img_norm_cfg`。因此,新的 backbone 不会报 `unexpected keys` 的警告。 + +### 训练超参 + +训练超参的调整不会影响模型的兼容性,但会略微提高性能。主要有: + +- 通过设置 `nms_post=1000` 和 `max_num=1000`,将 nms 之后的 proposal 数量从 2000 更改为 1000。使 mask AP 和 bbox AP 提高了约 0.2%。 + +- Mask R-CNN、Faster R-CNN 和 RetinaNet 的默认回归损失从 smooth L1 损失更改为 L1 损失,使得 box AP 整体上都有所提升(约 0.6%)。但是,将 L1-loss 用在 Cascade R-CNN 和 HTC 等其他方法上并不能提高性能,因此我们保留这些方法的原始设置。 + +- 为简单起见,RoIAlign 层的 `sampling_ratio` 设置为 0。略微提升了 AP(约 0.2% 绝对值)。 + +- 为了提升训练速度,默认设置在训练过程中不再使用梯度裁剪。大多数模型的性能不会受到影响。对于某些模型(例如 RepPoints),我们依旧使用梯度裁剪来稳定训练过程从而获得更好的性能。 + +- 因为不再默认使用梯度裁剪,默认 warmup 比率从 1/3 更改为 0.001,以使模型训练预热更加平缓。不过我们重新进行基准测试时发现这种影响可以忽略不计。 + +### 将模型从 v1.x 升级至 v2.0 + +用户可以使用脚本 `tools/model_converters/upgrade_model_version.py` 来将 MMDetection 1.x 训练的模型转换为 MMDetection v2.0。转换后的模型可以在 MMDetection v2.0 中运行,但性能略有下降(小于 1% AP)。 +详细信息可以在 `configs/legacy` 中找到。 + +## pycocotools 兼容性 + +`mmpycocotools` 是 OpenMMLab 维护的 `pycocotools` 的复刻版,适用于 MMDetection 和 Detectron2。 +在 [PR #4939](https://github.com/open-mmlab/mmdetection/pull/4939) 之前,由于 `pycocotools` 和 `mmpycocotool` 具有相同的包名,如果用户已经安装了 `pyccocotools`(在相同环境下先安装了 Detectron2 ),那么 MMDetection 的安装过程会跳过安装 `mmpycocotool`。 导致 MMDetection 缺少 `mmpycocotools` 而报错。 +但如果在 Detectron2 之前安装 MMDetection,则可以在相同的环境下工作。 +[PR #4939](https://github.com/open-mmlab/mmdetection/pull/4939) 弃用 mmpycocotools,使用官方 pycocotools。 +在 [PR #4939](https://github.com/open-mmlab/mmdetection/pull/4939) 之后,用户能够在相同环境下安装 MMDetection 和 Detectron2,不再需要关注安装顺序。 diff --git a/docs/zh_cn/conf.py b/docs/zh_cn/conf.py new file mode 100644 index 0000000..1bb57a4 --- /dev/null +++ b/docs/zh_cn/conf.py @@ -0,0 +1,118 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import subprocess +import sys + +import pytorch_sphinx_theme + +sys.path.insert(0, os.path.abspath('../../')) + +# -- Project information ----------------------------------------------------- + +project = 'MMDetection' +copyright = '2018-2021, OpenMMLab' +author = 'MMDetection Authors' +version_file = '../../mmdet/version.py' + + +def get_version(): + with open(version_file, 'r') as f: + exec(compile(f.read(), version_file, 'exec')) + return locals()['__version__'] + + +# The full version, including alpha/beta/rc tags +release = get_version() + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.napoleon', + 'sphinx.ext.viewcode', + 'myst_parser', + 'sphinx_markdown_tables', + 'sphinx_copybutton', +] + +myst_enable_extensions = ['colon_fence'] +myst_heading_anchors = 3 + +autodoc_mock_imports = [ + 'matplotlib', 'pycocotools', 'terminaltables', 'mmdet.version', 'mmcv.ops' +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +source_suffix = { + '.rst': 'restructuredtext', + '.md': 'markdown', +} + +# The master toctree document. +master_doc = 'index' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +# html_theme = 'sphinx_rtd_theme' +html_theme = 'pytorch_sphinx_theme' +html_theme_path = [pytorch_sphinx_theme.get_html_theme_path()] + +html_theme_options = { + 'menu': [ + { + 'name': 'GitHub', + 'url': 'https://github.com/open-mmlab/mmdetection' + }, + ], + # Specify the language of shared menu + 'menu_lang': + 'cn', +} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] +html_css_files = ['css/readthedocs.css'] + +language = 'zh_CN' + +# -- Extension configuration ------------------------------------------------- +# Ignore >>> when copying code +copybutton_prompt_text = r'>>> |\.\.\. ' +copybutton_prompt_is_regexp = True + + +def builder_inited_handler(app): + subprocess.run(['./stat.py']) + + +def setup(app): + app.connect('builder-inited', builder_inited_handler) diff --git a/docs/zh_cn/conventions.md b/docs/zh_cn/conventions.md new file mode 100644 index 0000000..acbb21e --- /dev/null +++ b/docs/zh_cn/conventions.md @@ -0,0 +1,75 @@ +# 默认约定 + +如果你想把 MMDetection 修改为自己的项目,请遵循下面的约定。 + +## 损失 + +在 MMDetection 中,`model(**data)` 的返回值是一个字典,包含着所有的损失和评价指标,他们将会由 `model(**data)` 返回。 + +例如,在 bbox head 中, + +```python +class BBoxHead(nn.Module): + ... + def loss(self, ...): + losses = dict() + # 分类损失 + losses['loss_cls'] = self.loss_cls(...) + # 分类准确率 + losses['acc'] = accuracy(...) + # 边界框损失 + losses['loss_bbox'] = self.loss_bbox(...) + return losses +``` + +`'bbox_head.loss()'` 在模型 forward 阶段会被调用。返回的字典中包含了 `'loss_bbox'`,`'loss_cls'`,`'acc'`。只有 `'loss_bbox'`, `'loss_cls'` 会被用于反向传播,`'acc'` 只会被作为评价指标来监控训练过程。 + +我们默认,只有那些键的名称中包含 `'loss'` 的值会被用于反向传播。这个行为可以通过修改 `BaseDetector.train_step()` 来改变。 + +## 空 proposals + +在 MMDetection 中,我们为两阶段方法中空 proposals 的情况增加了特殊处理和单元测试。我们同时需要处理整个 batch 和单一图片中空 proposals 的情况。例如,在 CascadeRoIHead 中, + +```python +# 简单的测试 +... + +# 在整个 batch中 都没有 proposals +if rois.shape[0] == 0: + bbox_results = [[ + np.zeros((0, 5), dtype=np.float32) + for _ in range(self.bbox_head[-1].num_classes) + ]] * num_imgs + if self.with_mask: + mask_classes = self.mask_head[-1].num_classes + segm_results = [[[] for _ in range(mask_classes)] + for _ in range(num_imgs)] + results = list(zip(bbox_results, segm_results)) + else: + results = bbox_results + return results +... + +# 在单张图片中没有 proposals +for i in range(self.num_stages): + ... + if i < self.num_stages - 1: + for j in range(num_imgs): + # 处理空 proposals + if rois[j].shape[0] > 0: + bbox_label = cls_score[j][:, :-1].argmax(dim=1) + refine_roi = self.bbox_head[i].regress_by_class( + rois[j], bbox_label[j], bbox_pred[j], img_metas[j]) + refine_roi_list.append(refine_roi) +``` + +如果你有自定义的 `RoIHead`, 你可以参考上面的方法来处理空 proposals 的情况。 + +## 全景分割数据集 + +在 MMDetection 中,我们支持了 COCO 全景分割数据集 `CocoPanopticDataset`。对于它的实现,我们在这里声明一些默认约定。 + +1. 在 mmdet\<=2.16.0 时,语义分割标注中的前景和背景标签范围与 MMDetection 中的默认规定有所不同。标签 `0` 代表 `VOID` 标签。 + 从 mmdet=2.17.0 开始,为了和框的类别标注保持一致,语义分割标注的类别标签也改为从 `0` 开始,标签 `255` 代表 `VOID` 类。 + 为了达成这一目标,我们在流程 `Pad` 里支持了设置 `seg` 的填充值的功能。 +2. 在评估中,全景分割结果必须是一个与原图大小相同的图。结果图中每个像素的值有如此形式:`instance_id * INSTANCE_OFFSET + category_id`。 diff --git a/docs/zh_cn/device/npu.md b/docs/zh_cn/device/npu.md new file mode 100644 index 0000000..b332b4f --- /dev/null +++ b/docs/zh_cn/device/npu.md @@ -0,0 +1,54 @@ +# NPU (华为 昇腾) + +## 使用方法 + +请参考 [MMCV 的安装文档](https://mmcv.readthedocs.io/en/latest/get_started/build.html#build-mmcv-full-on-ascend-npu-machine) 来安装 NPU 版本的 MMCV。 + +以下展示单机八卡场景的运行指令: + +```shell +bash tools/dist_train.sh configs/ssd/ssd300_coco.py 8 +``` + +以下展示单机单卡下的运行指令: + +```shell +python tools/train.py configs/ssd/ssd300_coco.py +``` + +## 模型验证结果 + +| Model | box AP | mask AP | Config | Download | +| :------------------: | :----: | :-----: | :---------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------- | +| [ssd300](<>) | 25.6 | --- | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/ssd/ssd300_fp16_coco.py) | [log](https://download.openmmlab.com/mmdetection/v2.0/npu/ssd300_coco.log.json) | +| [ssd512](<>) | 29.4 | --- | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/ssd/ssd512_fp16_coco.py) | [log](https://download.openmmlab.com/mmdetection/v2.0/npu/ssd512_coco.log.json) | +| [ssdlite-mbv2\*](<>) | 20.2 | --- | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco.py) | [log](https://download.openmmlab.com/mmdetection/v2.0/npu/ssdlite_mobilenetv2_scratch_600e_coco.log.json) | +| [retinanet-r18](<>) | 31.8 | --- | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/retinanet/retinanet_r18_fpn_1x8_1x_coco.py) | [log](https://download.openmmlab.com/mmdetection/v2.0/npu/retinanet_r18_fpn_1x8_1x_coco.log.json) | +| [retinanet-r50](<>) | 36.6 | --- | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/retinanet/retinanet_r50_fpn_fp16_1x_coco.py) | [log](https://download.openmmlab.com/mmdetection/v2.0/npu/retinanet_r50_fpn_1x_coco.log.json) | +| [yolov3-608](<>) | 34.7 | --- | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/yolo/yolov3_d53_fp16_mstrain-608_273e_coco.py) | [log](https://download.openmmlab.com/mmdetection/v2.0/npu/yolov3_d53_fp16_mstrain-608_273e_coco.log.json) | +| [yolox-s\*\*](<>) | 39.9 | --- | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/yolox/yolox_s_8x8_300e_coco.py) | [log](https://download.openmmlab.com/mmdetection/v2.0/npu/yolox_s_8x8_300e_coco.log.json) | +| [centernet-r18](<>) | 26.1 | --- | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/centernet/centernet_resnet18_140e_coco.py) | [log](https://download.openmmlab.com/mmdetection/v2.0/npu/centernet_resnet18_140e_coco.log.json) | +| [fcos-r50\*](<>) | 36.1 | --- | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/fcos/fcos_r50_caffe_fpn_gn-head_fp16_1x_bs8x8_coco.py) | [log](https://download.openmmlab.com/mmdetection/v2.0/npu/fcos_r50_caffe_fpn_gn-head_1x_coco_bs8x8.log.json) | +| [solov2-r50](<>) | --- | 34.7 | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/solov2/solov2_r50_fpn_1x_coco.py) | [log](https://download.openmmlab.com/mmdetection/v2.0/npu/solov2_r50_fpn_1x_coco.log.json) | + +**注意:** + +- 如果没有特别标记,NPU 上的结果与使用 FP32 的 GPU 上的结果结果相同。 +- (\*) 这些模型在 NPU 上的结果与 GPU 上的混合精度训练结果一致,但低于 FP32 的结果。这种情况主要与模型本身在混合精度训练中的特点有关, + 用户可以自行调整超参数来获得更高精度。 +- (\*\*) GPU 上 yolox-s 在混合精度下的精度为 40.1 低于readme中 40.5 的水平;默认情况下,yolox-s 启用 `persister_woker=True`,但这个参数 + 目前在NPU上存在一些bug,会导致在最后几个epoch由于资源耗尽报错退出,对整体精度影响有限可以忽略。 + +## Ascend加速模块验证结果 + +优化方案简介: + +1. 修改循环计算为一次整体计算,目的是减少下发指令数量。 +2. 修改索引计算为掩码计算,原因是SIMD架构芯片擅长处理连续数据计算。 + +| Model | Config | v100 iter time | 910A iter time | +| :------------------------: | :-----------------------------------------------------------------------------------------------------------------------: | :------------: | :------------------------: | +| [ascend-ssd300](<>) | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/ssd/ascend_ssd300_fp16_coco.py) | 0.165s/iter | 0.383s/iter -> 0.13s/iter | +| [ascend-retinanet-r18](<>) | [config](https://github.com/open-mmlab/mmdetection/blob/master/configs/retinanet/ascend_retinanet_r18_fpn_1x8_1x_coco.py) | 0.567s/iter | 0.780s/iter -> 0.420s/iter | + +**以上模型结果由华为昇腾团队提供** diff --git a/docs/zh_cn/faq.md b/docs/zh_cn/faq.md new file mode 100644 index 0000000..8f9bcf8 --- /dev/null +++ b/docs/zh_cn/faq.md @@ -0,0 +1,162 @@ +# 常见问题解答 + +我们在这里列出了使用时的一些常见问题及其相应的解决方案。 如果您发现有一些问题被遗漏,请随时提 PR 丰富这个列表。 如果您无法在此获得帮助,请使用 [issue模板](https://github.com/open-mmlab/mmdetection/blob/master/.github/ISSUE_TEMPLATE/error-report.md/)创建问题,但是请在模板中填写所有必填信息,这有助于我们更快定位问题。 + +## MMCV 安装相关 + +- MMCV 与 MMDetection 的兼容问题: "ConvWS is already registered in conv layer"; "AssertionError: MMCV==xxx is used but incompatible. Please install mmcv>=xxx, \<=xxx." + + 请按 [安装说明](https://mmdetection.readthedocs.io/zh_CN/latest/get_started.html#installation) 为你的 MMDetection 安装正确版本的 MMCV 。 + +- "No module named 'mmcv.ops'"; "No module named 'mmcv.\_ext'". + + 原因是安装了 `mmcv` 而不是 `mmcv-full`。 + + 1. `pip uninstall mmcv` 卸载安装的 `mmcv` + + 2. 安装 `mmcv-full` 根据 [安装说明](https://mmcv.readthedocs.io/zh/latest/#installation)。 + +## PyTorch/CUDA 环境相关 + +- "RTX 30 series card fails when building MMCV or MMDet" + + 1. 临时解决方案为使用命令 `MMCV_WITH_OPS=1 MMCV_CUDA_ARGS='-gencode=arch=compute_80,code=sm_80' pip install -e .` 进行编译。 常见报错信息为 `nvcc fatal : Unsupported gpu architecture 'compute_86'` 意思是你的编译器不支持 sm_86 架构(包括英伟达 30 系列的显卡)的优化,至 CUDA toolkit 11.0 依旧未支持. 这个命令是通过增加宏 `MMCV_CUDA_ARGS='-gencode=arch=compute_80,code=sm_80` 让 nvcc 编译器为英伟达 30 系列显卡进行 `sm_80` 的优化,虽然这有可能会无法发挥出显卡所有性能。 + + 2. 有开发者已经在 [pytorch/pytorch#47585](https://github.com/pytorch/pytorch/pull/47585) 更新了 PyTorch 默认的编译 flag, 但是我们对此并没有进行测试。 + +- "invalid device function" or "no kernel image is available for execution". + + 1. 检查您正常安装了 CUDA runtime (一般在`/usr/local/`),或者使用 `nvcc --version` 检查本地版本,有时安装 PyTorch 会顺带安装一个 CUDA runtime,并且实际优先使用 conda 环境中的版本,你可以使用 `conda list cudatoolkit` 查看其版本。 + + 2. 编译 extension 的 CUDA Toolkit 版本与运行时的 CUDA Toolkit 版本是否相符, + + - 如果您从源码自己编译的,使用 `python mmdet/utils/collect_env.py` 检查编译编译 extension 的 CUDA Toolkit 版本,然后使用 `conda list cudatoolkit` 检查当前 conda 环境是否有 CUDA Toolkit,若有检查版本是否匹配, 如不匹配,更换 conda 环境的 CUDA Toolkit,或者使用匹配的 CUDA Toolkit 中的 nvcc 编译即可,如环境中无 CUDA Toolkit,可以使用 `nvcc -V`。 + + 等命令查看当前使用的 CUDA runtime。 + + - 如果您是通过 pip 下载的预编译好的版本,请确保与当前 CUDA runtime 一致。 + + 3. 运行 `python mmdet/utils/collect_env.py` 检查是否为正确的 GPU 架构编译的 PyTorch, torchvision, 与 MMCV。 你或许需要设置 `TORCH_CUDA_ARCH_LIST` 来重新安装 MMCV,可以参考 [GPU 架构表](https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#gpu-feature-list), + 例如, 运行 `TORCH_CUDA_ARCH_LIST=7.0 pip install mmcv-full` 为 Volta GPU 编译 MMCV。这种架构不匹配的问题一般会出现在使用一些旧型号的 GPU 时候出现, 例如, Tesla K80。 + +- "undefined symbol" or "cannot open xxx.so". + + 1. 如果这些 symbol 属于 CUDA/C++ (如 libcudart.so 或者 GLIBCXX),使用 `python mmdet/utils/collect_env.py`检查 CUDA/GCC runtime 与编译 MMCV 的 CUDA 版本是否相同。 + 2. 如果这些 symbols 属于 PyTorch,(例如, symbols containing caffe, aten, and TH), 检查当前 Pytorch 版本是否与编译 MMCV 的版本一致。 + 3. 运行 `python mmdet/utils/collect_env.py` 检查 PyTorch, torchvision, MMCV 等的编译环境与运行环境一致。 + +- setuptools.sandbox.UnpickleableException: DistutilsSetupError("each element of 'ext_modules' option must be an Extension instance or 2-tuple") + + 1. 如果你在使用 miniconda 而不是 anaconda,检查是否正确的安装了 Cython 如 [#3379](https://github.com/open-mmlab/mmdetection/issues/3379). + 2. 检查环境中的 `setuptools`, `Cython`, and `PyTorch` 相互之间版本是否匹配。 + +- "Segmentation fault". + + 1. 检查 GCC 的版本,通常是因为 PyTorch 版本与 GCC 版本不匹配 (例如 GCC \< 4.9 ),我们推荐用户使用 GCC 5.4,我们也不推荐使用 GCC 5.5, 因为有反馈 GCC 5.5 会导致 "segmentation fault" 并且切换到 GCC 5.4 就可以解决问题。 + + 2. 检查是否正确安装了 CUDA 版本的 PyTorch 。 + + ```shell + python -c 'import torch; print(torch.cuda.is_available())' + ``` + + 是否返回True。 + + 3. 如果 `torch` 的安装是正确的,检查是否正确编译了 MMCV。 + + ```shell + python -c 'import mmcv; import mmcv.ops' + ``` + + 4. 如果 MMCV 与 PyTorch 都被正确安装了,则使用 `ipdb`, `pdb` 设置断点,直接查找哪一部分的代码导致了 `segmentation fault`。 + +## Training 相关 + +- "Loss goes Nan" + + 1. 检查数据的标注是否正常, 长或宽为 0 的框可能会导致回归 loss 变为 nan,一些小尺寸(宽度或高度小于 1)的框在数据增强(例如,instaboost)后也会导致此问题。 因此,可以检查标注并过滤掉那些特别小甚至面积为 0 的框,并关闭一些可能会导致 0 面积框出现数据增强。 + 2. 降低学习率:由于某些原因,例如 batch size 大小的变化, 导致当前学习率可能太大。 您可以降低为可以稳定训练模型的值。 + 3. 延长 warm up 的时间:一些模型在训练初始时对学习率很敏感,您可以把 `warmup_iters` 从 500 更改为 1000 或 2000。 + 4. 添加 gradient clipping: 一些模型需要梯度裁剪来稳定训练过程。 默认的 `grad_clip` 是 `None`, 你可以在 config 设置 `optimizer_config=dict(_delete_=True, grad_clip=dict(max_norm=35, norm_type=2))` 如果你的 config 没有继承任何包含 `optimizer_config=dict(grad_clip=None)`, 你可以直接设置`optimizer_config=dict(grad_clip=dict(max_norm=35, norm_type=2))`. + +- "GPU out of memory" + + 1. 存在大量 ground truth boxes 或者大量 anchor 的场景,可能在 assigner 会 OOM。 您可以在 assigner 的配置中设置 `gpu_assign_thr=N`,这样当超过 N 个 GT boxes 时,assigner 会通过 CPU 计算 IOU。 + + 2. 在 backbone 中设置 `with_cp=True`。 这使用 PyTorch 中的 `sublinear strategy` 来降低 backbone 占用的 GPU 显存。 + + 3. 使用 `config/fp16` 中的示例尝试混合精度训练。`loss_scale` 可能需要针对不同模型进行调整。 + + 4. 你也可以尝试使用 `AvoidCUDAOOM` 来避免该问题。首先它将尝试调用 `torch.cuda.empty_cache()`。如果失败,将会尝试把输入类型转换到 FP16。如果仍然失败,将会把输入从 GPUs 转换到 CPUs 进行计算。这里提供了两个使用的例子: + + ```python + from mmdet.utils import AvoidCUDAOOM + + output = AvoidCUDAOOM.retry_if_cuda_oom(some_function)(input1, input2) + ``` + + 你也可也使用 `AvoidCUDAOOM` 作为装饰器让代码遇到 OOM 的时候继续运行: + + ```python + from mmdet.utils import AvoidCUDAOOM + + @AvoidCUDAOOM.retry_if_cuda_oom + def function(*args, **kwargs): + ... + return xxx + ``` + +- "RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one" + + 1. 这个错误出现在存在参数没有在 forward 中使用,容易在 DDP 中运行不同分支时发生。 + 2. 你可以在 config 设置 `find_unused_parameters = True` 进行训练 (会降低训练速度)。 + 3. 你也可以通过在 config 中的 `optimizer_config` 里设置 `detect_anomalous_params=True` 查找哪些参数没有用到,但是需要 MMCV 的版本 >= 1.4.1。 + +- 训练中保存最好模型 + + 可以通过配置 `evaluation = dict(save_best=‘auto’)`开启。在 auto 参数情况下会根据返回的验证结果中的第一个 key 作为选择最优模型的依据,你也可以直接设置评估结果中的 key 来手动设置,例如 `evaluation = dict(save_best=‘mAP’)`。 + +- 在 Resume 训练中使用 `ExpMomentumEMAHook` + + 如果在训练中使用了 `ExpMomentumEMAHook`,那么 resume 时候不能仅仅通过命令行参数 `--resume-from` 或 `--cfg-options resume_from` 实现恢复模型参数功能例如 `python tools/train.py configs/yolox/yolox_s_8x8_300e_coco.py --resume-from ./work_dir/yolox_s_8x8_300e_coco/epoch_x.pth`。以 `yolox_s` 算法为例,由于 `ExpMomentumEMAHook` 需要重新加载权重,你可以通过如下做法实现: + + ```python + # 直接打开 configs/yolox/yolox_s_8x8_300e_coco.py 修改所有 resume_from 字段 + resume_from=./work_dir/yolox_s_8x8_300e_coco/epoch_x.pth + custom_hooks=[... + dict( + type='ExpMomentumEMAHook', + resume_from=./work_dir/yolox_s_8x8_300e_coco/epoch_x.pth, + momentum=0.0001, + priority=49) + ] + ``` + +## Evaluation 相关 + +- 使用 COCO Dataset 的测评接口时, 测评结果中 AP 或者 AR = -1 + 1. 根据COCO数据集的定义,一张图像中的中等物体与小物体面积的阈值分别为 9216(96\*96)与 1024(32\*32)。 + 2. 如果在某个区间没有检测框 AP 与 AR 认定为 -1. + +## Model 相关 + +- **ResNet style 参数说明** + + ResNet style 可选参数允许 `pytorch` 和 `caffe`,其差别在于 Bottleneck 模块。Bottleneck 是 `1x1-3x3-1x1` 堆叠结构,在 `caffe` 模式模式下 stride=2 参数放置在第一个 `1x1` 卷积处,而 `pyorch` 模式下 stride=2 放在第二个 `3x3` 卷积处。一个简单示例如下: + + ```python + if self.style == 'pytorch': + self.conv1_stride = 1 + self.conv2_stride = stride + else: + self.conv1_stride = stride + self.conv2_stride = 1 + ``` + +- **ResNeXt 参数说明** + + ResNeXt 来自论文 [`Aggregated Residual Transformations for Deep Neural Networks`](https://arxiv.org/abs/1611.05431). 其引入分组卷积,并且通过变量基数来控制组的数量达到精度和复杂度的平衡,其有两个超参 `baseWidth` 和 `cardinality `来控制内部 Bottleneck 模块的基本宽度和分组数参数。以 MMDetection 中配置名为 `mask_rcnn_x101_64x4d_fpn_mstrain-poly_3x_coco.py` 为例,其中 `mask_rcnn` 代表算法采用 Mask R-CNN,`x101` 代表骨架网络采用 ResNeXt-101,`64x4d`代表 Bottleneck 一共分成 64 组,每组的基本宽度是 4。 + +- **骨架网络 eval 模式说明** + + 因为检测模型通常比较大且输入图片分辨率很高,这会导致检测模型的 batch 很小,通常是 2,这会使得 BatchNorm 在训练过程计算的统计量方差非常大,不如主干网络预训练时得到的统计量稳定,因此在训练是一般都会使用 `norm_eval=True` 模式,直接使用预训练主干网络中的 BatchNorm 统计量,少数使用大 batch 的算法是 `norm_eval=False` 模式,例如 NASFPN。对于没有 ImageNet 预训练的骨架网络,如果 batch 比较小,可以考虑使用 `SyncBN`。 diff --git a/docs/zh_cn/get_started.md b/docs/zh_cn/get_started.md new file mode 100644 index 0000000..40d123a --- /dev/null +++ b/docs/zh_cn/get_started.md @@ -0,0 +1,264 @@ +## 依赖 + +- Linux 和 macOS (Windows 理论上支持) +- Python 3.7 + +- PyTorch 1.3+ +- CUDA 9.2+ (如果基于 PyTorch 源码安装,也能够支持 CUDA 9.0) +- GCC 5+ +- [MMCV](https://mmcv.readthedocs.io/en/latest/#installation) + +MMDetection 和 MMCV 版本兼容性如下所示,需要安装正确的 MMCV 版本以避免安装出现问题。 + +| MMDetection 版本 | MMCV 版本 | +| :--------------: | :------------------------: | +| master | mmcv-full>=1.3.17, \<1.8.0 | +| 2.28.2 | mmcv-full>=1.3.17, \<1.8.0 | +| 2.28.1 | mmcv-full>=1.3.17, \<1.8.0 | +| 2.28.0 | mmcv-full>=1.3.17, \<1.8.0 | +| 2.27.0 | mmcv-full>=1.3.17, \<1.8.0 | +| 2.26.0 | mmcv-full>=1.3.17, \<1.8.0 | +| 2.25.3 | mmcv-full>=1.3.17, \<1.7.0 | +| 2.25.2 | mmcv-full>=1.3.17, \<1.7.0 | +| 2.25.1 | mmcv-full>=1.3.17, \<1.6.0 | +| 2.25.0 | mmcv-full>=1.3.17, \<1.6.0 | +| 2.24.1 | mmcv-full>=1.3.17, \<1.6.0 | +| 2.24.0 | mmcv-full>=1.3.17, \<1.6.0 | +| 2.23.0 | mmcv-full>=1.3.17, \<1.5.0 | +| 2.22.0 | mmcv-full>=1.3.17, \<1.5.0 | +| 2.21.0 | mmcv-full>=1.3.17, \<1.5.0 | +| 2.20.0 | mmcv-full>=1.3.17, \<1.5.0 | +| 2.19.1 | mmcv-full>=1.3.17, \<1.5.0 | +| 2.19.0 | mmcv-full>=1.3.17, \<1.5.0 | +| 2.18.1 | mmcv-full>=1.3.17, \<1.4.0 | +| 2.18.0 | mmcv-full>=1.3.14, \<1.4.0 | +| 2.17.0 | mmcv-full>=1.3.14, \<1.4.0 | +| 2.16.0 | mmcv-full>=1.3.8, \<1.4.0 | +| 2.15.1 | mmcv-full>=1.3.8, \<1.4.0 | +| 2.15.0 | mmcv-full>=1.3.8, \<1.4.0 | +| 2.14.0 | mmcv-full>=1.3.8, \<1.4.0 | +| 2.13.0 | mmcv-full>=1.3.3, \<1.4.0 | +| 2.12.0 | mmcv-full>=1.3.3, \<1.4.0 | +| 2.11.0 | mmcv-full>=1.2.4, \<1.4.0 | +| 2.10.0 | mmcv-full>=1.2.4, \<1.4.0 | +| 2.9.0 | mmcv-full>=1.2.4, \<1.4.0 | +| 2.8.0 | mmcv-full>=1.2.4, \<1.4.0 | +| 2.7.0 | mmcv-full>=1.1.5, \<1.4.0 | +| 2.6.0 | mmcv-full>=1.1.5, \<1.4.0 | +| 2.5.0 | mmcv-full>=1.1.5, \<1.4.0 | +| 2.4.0 | mmcv-full>=1.1.1, \<1.4.0 | +| 2.3.0 | mmcv-full==1.0.5 | +| 2.3.0rc0 | mmcv-full>=1.0.2 | +| 2.2.1 | mmcv==0.6.2 | +| 2.2.0 | mmcv==0.6.2 | +| 2.1.0 | mmcv>=0.5.9, \<=0.6.1 | +| 2.0.0 | mmcv>=0.5.1, \<=0.5.8 | + +\*\*注意:\*\*如果已经安装了 mmcv,首先需要使用 `pip uninstall mmcv` 卸载已安装的 mmcv,如果同时安装了 mmcv 和 mmcv-full,将会报 `ModuleNotFoundError` 错误。 + +## 安装流程 + +### 从零开始设置脚本 + +假设当前已经成功安装 CUDA 10.1,这里提供了一个完整的基于 conda 安装 MMDetection 的脚本。您可以参考下一节中的分步安装说明。 + +```shell +conda create -n openmmlab python=3.7 pytorch==1.6.0 cudatoolkit=10.1 torchvision -c pytorch -y +conda activate openmmlab +pip install openmim +mim install mmcv-full +git clone https://github.com/open-mmlab/mmdetection.git +cd mmdetection +pip install -r requirements/build.txt +pip install -v -e . +``` + +### 准备环境 + +1. 使用 conda 新建虚拟环境,并进入该虚拟环境; + + ```shell + conda create -n open-mmlab python=3.7 -y + conda activate open-mmlab + ``` + +2. 基于 [PyTorch 官网](https://pytorch.org/)安装 PyTorch 和 torchvision,例如: + + ```shell + conda install pytorch torchvision -c pytorch + ``` + + **注意**:需要确保 CUDA 的编译版本和运行版本匹配。可以在 [PyTorch 官网](https://pytorch.org/)查看预编译包所支持的 CUDA 版本。 + + `例 1` 例如在 `/usr/local/cuda` 下安装了 CUDA 10.1, 并想安装 PyTorch 1.5,则需要安装支持 CUDA 10.1 的预构建 PyTorch: + + ```shell + conda install pytorch cudatoolkit=10.1 torchvision -c pytorch + ``` + + `例 2` 例如在 `/usr/local/cuda` 下安装了 CUDA 9.2, 并想安装 PyTorch 1.3.1,则需要安装支持 CUDA 9.2 的预构建 PyTorch: + + ```shell + conda install pytorch=1.3.1 cudatoolkit=9.2 torchvision=0.4.2 -c pytorch + ``` + + 如果不是安装预构建的包,而是从源码中构建 PyTorch,则可以使用更多的 CUDA 版本,例如 CUDA 9.0。 + +### 安装 MMDetection + +我们建议使用 [MIM](https://github.com/open-mmlab/mim) 来安装 MMDetection: + +```shell +pip install openmim +mim install mmdet +``` + +MIM 能够自动地安装 OpenMMLab 的项目以及对应的依赖包。 + +或者,可以手动安装 MMDetection: + +1. 安装 mmcv-full,我们建议使用预构建包来安装: + + ```shell + pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/{cu_version}/{torch_version}/index.html + ``` + + 需要把命令行中的 `{cu_version}` 和 `{torch_version}` 替换成对应的版本。例如:在 CUDA 11 和 PyTorch 1.7.0 的环境下,可以使用下面命令安装最新版本的 MMCV: + + ```shell + pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu110/torch1.7.0/index.html + ``` + + 请参考 [MMCV](https://mmcv.readthedocs.io/en/latest/#installation) 获取不同版本的 MMCV 所兼容的的不同的 PyTorch 和 CUDA 版本。同时,也可以通过以下命令行从源码编译 MMCV: + + ```shell + git clone https://github.com/open-mmlab/mmcv.git + cd mmcv + MMCV_WITH_OPS=1 pip install -e . # 安装好 mmcv-full + cd .. + ``` + + 或者,可以直接使用命令行安装: + + ```shell + pip install mmcv-full + ``` + + PyTorch 在 1.x.0 和 1.x.1 之间通常是兼容的,故 mmcv-full 只提供 1.x.0 的编译包。如果你的 PyTorch 版本是 1.x.1,你可以放心地安装在 1.x.0 版本编译的 mmcv-full。 + + ``` + # 我们可以忽略 PyTorch 的小版本号 + pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu110/torch1.7/index.html + ``` + +2. 安装 MMDetection: + + 你可以直接通过如下命令从 pip 安装使用 mmdetection: + + ```shell + pip install mmdet + ``` + + 或者从 git 仓库编译源码 + + ```shell + git clone https://github.com/open-mmlab/mmdetection.git + cd mmdetection + pip install -r requirements/build.txt + pip install -v -e . # or "python setup.py develop" + ``` + +3. 安装额外的依赖以使用 Instaboost, 全景分割, 或者 LVIS 数据集 + + ```shell + # 安装 instaboost 依赖 + pip install instaboostfast + # 安装全景分割依赖 + pip install git+https://github.com/cocodataset/panopticapi.git + # 安装 LVIS 数据集依赖 + pip install git+https://github.com/lvis-dataset/lvis-api.git + # 安装 albumentations 依赖 + pip install -r requirements/albu.txt + ``` + +**注意:** + +(1) 按照上述说明,MMDetection 安装在 `dev` 模式下,因此在本地对代码做的任何修改都会生效,无需重新安装; + +(2) 如果希望使用 `opencv-python-headless` 而不是 `opencv-python`, 可以在安装 MMCV 之前安装; + +(3) 一些安装依赖是可以选择的。例如只需要安装最低运行要求的版本,则可以使用 `pip install -v -e .` 命令。如果希望使用可选择的像 `albumentations` 和 `imagecorruptions` 这种依赖项,可以使用 `pip install -r requirements/optional.txt` 进行手动安装,或者在使用 `pip` 时指定所需的附加功能(例如 `pip install -v -e .[optional]`),支持附加功能的有效键值包括 `all`、`tests`、`build` 以及 `optional` 。 + +(4) 如果希望使用 `albumentations`,我们建议使用 `pip install -r requirements/albu.txt` 或者 `pip install -U albumentations --no-binary qudida,albumentations` 进行安装。 如果简单地使用 `pip install albumentations>=0.3.2` 进行安装,则会同时安装 `opencv-python-headless`(即便已经安装了 `opencv-python` 也会再次安装)。我们建议在安装 `albumentations` 后检查环境,以确保没有同时安装 `opencv-python` 和 `opencv-python-headless`,因为同时安装可能会导致一些问题。更多细节请参考[官方文档](https://albumentations.ai/docs/getting_started/installation/#note-on-opencv-dependencies)。 + +### 只在 CPU 安装 + +我们的代码能够建立在只使用 CPU 的环境(CUDA 不可用)。 + +在 CPU 模式下,可以进行模型训练(需要 MMCV 版本 >= 1.4.4)、测试或者推理,然而以下功能将在 CPU 模式下不能使用: + +- Deformable Convolution +- Modulated Deformable Convolution +- ROI pooling +- Deformable ROI pooling +- CARAFE: Content-Aware ReAssembly of FEatures +- SyncBatchNorm +- CrissCrossAttention: Criss-Cross Attention +- MaskedConv2d +- Temporal Interlace Shift +- nms_cuda +- sigmoid_focal_loss_cuda +- bbox_overlaps + +因此,如果尝试使用包含上述操作的模型进行训练/测试/推理,将会报错。下表列出了由于依赖上述算子而无法在 CPU 上运行的相关模型: + +| 操作 | 模型 | +| :-----------------------------------------------------: | :--------------------------------------------------------------------------------------: | +| Deformable Convolution/Modulated Deformable Convolution | DCN、Guided Anchoring、RepPoints、CentripetalNet、VFNet、CascadeRPN、NAS-FCOS、DetectoRS | +| MaskedConv2d | Guided Anchoring | +| CARAFE | CARAFE | +| SyncBatchNorm | ResNeSt | + +### 另一种选择: Docker 镜像 + +我们提供了 [Dockerfile](https://github.com/open-mmlab/mmdetection/blob/master/docker/Dockerfile) 来生成镜像,请确保 [docker](https://docs.docker.com/engine/install/) 的版本 >= 19.03。 + +```shell +# 基于 PyTorch 1.6, CUDA 10.1 生成镜像 +docker build -t mmdetection docker/ +``` + +运行命令: + +```shell +docker run --gpus all --shm-size=8g -it -v {DATA_DIR}:/mmdetection/data mmdetection +``` + +### 使用多个 MMDetection 版本进行开发 + +训练和测试的脚本已经在 PYTHONPATH 中进行了修改,以确保脚本使用当前目录中的 MMDetection。 + +要使环境中安装默认的 MMDetection 而不是当前正在在使用的,可以删除出现在相关脚本中的代码: + +```shell +PYTHONPATH="$(dirname $0)/..":$PYTHONPATH +``` + +## 验证 + +为了验证是否正确安装了 MMDetection 和所需的环境,我们可以运行示例的 Python 代码来初始化检测器并推理一个演示图像: + +```python +from mmdet.apis import init_detector, inference_detector + +config_file = 'configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +# 从 model zoo 下载 checkpoint 并放在 `checkpoints/` 文件下 +# 网址为: http://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth +checkpoint_file = 'checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth' +device = 'cuda:0' +# 初始化检测器 +model = init_detector(config_file, checkpoint_file, device=device) +# 推理演示图像 +inference_detector(model, 'demo/demo.jpg') +``` + +如果成功安装 MMDetection,则上面的代码可以完整地运行。 diff --git a/docs/zh_cn/index.rst b/docs/zh_cn/index.rst new file mode 100644 index 0000000..872606c --- /dev/null +++ b/docs/zh_cn/index.rst @@ -0,0 +1,62 @@ +Welcome to MMDetection's documentation! +======================================= + +.. toctree:: + :maxdepth: 2 + :caption: 开始你的第一步 + + get_started.md + model_zoo.md + article.md + +.. toctree:: + :maxdepth: 2 + :caption: 快速启动 + + 1_exist_data_model.md + 2_new_data_model.md + 3_exist_data_new_model.md + +.. toctree:: + :maxdepth: 2 + :caption: 教程 + + tutorials/index.rst + +.. toctree:: + :maxdepth: 2 + :caption: 实用工具与脚本 + + useful_tools.md + +.. toctree:: + :maxdepth: 2 + :caption: 说明 + + conventions.md + compatibility.md + faq.md + +.. toctree:: + :caption: 语言切换 + + switch_language.md + +.. toctree:: + :maxdepth: 1 + :caption: 接口文档(英文) + + api.rst + +.. toctree:: + :maxdepth: 1 + :caption: 设备支持 + + device/npu.md + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`search` diff --git a/docs/zh_cn/make.bat b/docs/zh_cn/make.bat new file mode 100644 index 0000000..922152e --- /dev/null +++ b/docs/zh_cn/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/zh_cn/model_zoo.md b/docs/zh_cn/model_zoo.md new file mode 100644 index 0000000..84f5727 --- /dev/null +++ b/docs/zh_cn/model_zoo.md @@ -0,0 +1,337 @@ +# 模型库 + +## 镜像地址 + +从 MMDetection V2.0 起,我们只通过阿里云维护模型库。V1.x 版本的模型已经弃用。 + +## 共同设置 + +- 所有模型都是在 `coco_2017_train` 上训练,在 `coco_2017_val` 上测试。 +- 我们使用分布式训练。 +- 所有 pytorch-style 的 ImageNet 预训练主干网络来自 PyTorch 的模型库,caffe-style 的预训练主干网络来自 detectron2 最新开源的模型。 +- 为了与其他代码库公平比较,文档中所写的 GPU 内存是8个 GPU 的 `torch.cuda.max_memory_allocated()` 的最大值,此值通常小于 nvidia-smi 显示的值。 +- 我们以网络 forward 和后处理的时间加和作为推理时间,不包含数据加载时间。所有结果通过 [benchmark.py](https://github.com/open-mmlab/mmdetection/blob/master/tools/analysis_tools/benchmark.py) 脚本计算所得。该脚本会计算推理 2000 张图像的平均时间。 + +## ImageNet 预训练模型 + +通过 ImageNet 分类任务预训练的主干网络进行初始化是很常见的操作。所有预训练模型的链接都可以在 [open_mmlab](https://github.com/open-mmlab/mmcv/blob/master/mmcv/model_zoo/open_mmlab.json) 中找到。根据 `img_norm_cfg` 和原始权重,我们可以将所有 ImageNet 预训练模型分为以下几种情况: + +- TorchVision:torchvision 模型权重,包含 ResNet50, ResNet101。`img_norm_cfg` 为 `dict(mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)`。 +- Pycls:[pycls](https://github.com/facebookresearch/pycls) 模型权重,包含 RegNetX。`img_norm_cfg` 为 `dict( mean=[103.530, 116.280, 123.675], std=[57.375, 57.12, 58.395], to_rgb=False)`。 +- MSRA styles:[MSRA](https://github.com/KaimingHe/deep-residual-networks) 模型权重,包含 ResNet50_Caffe,ResNet101_Caffe。`img_norm_cfg` 为 `dict( mean=[103.530, 116.280, 123.675], std=[1.0, 1.0, 1.0], to_rgb=False)`。 +- Caffe2 styles:现阶段只包含 ResNext101_32x8d。`img_norm_cfg` 为 `dict(mean=[103.530, 116.280, 123.675], std=[57.375, 57.120, 58.395], to_rgb=False)`。 +- Other styles: SSD 的 `img_norm_cfg` 为 `dict(mean=[123.675, 116.28, 103.53], std=[1, 1, 1], to_rgb=True)`,YOLOv3 的 `img_norm_cfg` 为 `dict(mean=[0, 0, 0], std=[255., 255., 255.], to_rgb=True)`。 + +MMdetection 常用到的主干网络细节如下表所示: + +| 模型 | 来源 | 链接 | 描述 | +| ---------------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ResNet50 | TorchVision | [torchvision 中的 ResNet-50](https://download.pytorch.org/models/resnet50-19c8e357.pth) | 来自 [torchvision 中的 ResNet-50](https://download.pytorch.org/models/resnet50-19c8e357.pth)。 | +| ResNet101 | TorchVision | [torchvision 中的 ResNet-101](https://download.pytorch.org/models/resnet101-5d3b4d8f.pth) | 来自 [torchvision 中的 ResNet-101](https://download.pytorch.org/models/resnet101-5d3b4d8f.pth)。 | +| RegNetX | Pycls | [RegNetX_3.2gf](https://download.openmmlab.com/pretrain/third_party/regnetx_3.2gf-c2599b0f.pth),[RegNetX_800mf](https://download.openmmlab.com/pretrain/third_party/regnetx_800mf-1f4be4c7.pth) 等 | 来自 [pycls](https://github.com/facebookresearch/pycls)。 | +| ResNet50_Caffe | MSRA | [MSRA 中的 ResNet-50](https://download.openmmlab.com/pretrain/third_party/resnet50_caffe-788b5fa3.pth) | 由 [Detectron2 中的 R-50.pkl](https://dl.fbaipublicfiles.com/detectron2/ImageNetPretrained/MSRA/R-50.pkl) 转化的副本。原始权重文件来自 [MSRA 中的原始 ResNet-50](https://github.com/KaimingHe/deep-residual-networks)。 | +| ResNet101_Caffe | MSRA | [MSRA 中的 ResNet-101](https://download.openmmlab.com/pretrain/third_party/resnet101_caffe-3ad79236.pth) | 由 [Detectron2 中的 R-101.pkl](https://dl.fbaipublicfiles.com/detectron2/ImageNetPretrained/MSRA/R-101.pkl) 转化的副本。原始权重文件来自 [MSRA 中的原始 ResNet-101](https://github.com/KaimingHe/deep-residual-networks)。 | +| ResNext101_32x8d | Caffe2 | [Caffe2 ResNext101_32x8d](https://download.openmmlab.com/pretrain/third_party/resnext101_32x8d-1516f1aa.pth) | 由 [Detectron2 中的 X-101-32x8d.pkl](https://dl.fbaipublicfiles.com/detectron2/ImageNetPretrained/FAIR/X-101-32x8d.pkl) 转化的副本。原始 ResNeXt-101-32x8d 由 FB 使用 Caffe2 训练。 | + +## Baselines + +### RPN + +请参考 [RPN](https://github.com/open-mmlab/mmdetection/blob/master/configs/rpn)。 + +### Faster R-CNN + +请参考 [Faster R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/faster_rcnn)。 + +### Mask R-CNN + +请参考 [Mask R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask_rcnn)。 + +### Fast R-CNN (使用提前计算的 proposals) + +请参考 [Fast R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/fast_rcnn)。 + +### RetinaNet + +请参考 [RetinaNet](https://github.com/open-mmlab/mmdetection/blob/master/configs/retinanet)。 + +### Cascade R-CNN and Cascade Mask R-CNN + +请参考 [Cascade R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/cascade_rcnn)。 + +### Hybrid Task Cascade (HTC) + +请参考 [HTC](https://github.com/open-mmlab/mmdetection/blob/master/configs/htc)。 + +### SSD + +请参考 [SSD](https://github.com/open-mmlab/mmdetection/blob/master/configs/ssd)。 + +### Group Normalization (GN) + +请参考 [Group Normalization](https://github.com/open-mmlab/mmdetection/blob/master/configs/gn)。 + +### Weight Standardization + +请参考 [Weight Standardization](https://github.com/open-mmlab/mmdetection/blob/master/configs/gn+ws)。 + +### Deformable Convolution v2 + +请参考 [Deformable Convolutional Networks](https://github.com/open-mmlab/mmdetection/blob/master/configs/dcn)。 + +### CARAFE: Content-Aware ReAssembly of FEatures + +请参考 [CARAFE](https://github.com/open-mmlab/mmdetection/blob/master/configs/carafe)。 + +### Instaboost + +请参考 [Instaboost](https://github.com/open-mmlab/mmdetection/blob/master/configs/instaboost)。 + +### Libra R-CNN + +请参考 [Libra R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/libra_rcnn)。 + +### Guided Anchoring + +请参考 [Guided Anchoring](https://github.com/open-mmlab/mmdetection/blob/master/configs/guided_anchoring)。 + +### FCOS + +请参考 [FCOS](https://github.com/open-mmlab/mmdetection/blob/master/configs/fcos)。 + +### FoveaBox + +请参考 [FoveaBox](https://github.com/open-mmlab/mmdetection/blob/master/configs/foveabox)。 + +### RepPoints + +请参考 [RepPoints](https://github.com/open-mmlab/mmdetection/blob/master/configs/reppoints)。 + +### FreeAnchor + +请参考 [FreeAnchor](https://github.com/open-mmlab/mmdetection/blob/master/configs/free_anchor)。 + +### Grid R-CNN (plus) + +请参考 [Grid R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/grid_rcnn)。 + +### GHM + +请参考 [GHM](https://github.com/open-mmlab/mmdetection/blob/master/configs/ghm)。 + +### GCNet + +请参考 [GCNet](https://github.com/open-mmlab/mmdetection/blob/master/configs/gcnet)。 + +### HRNet + +请参考 [HRNet](https://github.com/open-mmlab/mmdetection/blob/master/configs/hrnet)。 + +### Mask Scoring R-CNN + +请参考 [Mask Scoring R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/ms_rcnn)。 + +### Train from Scratch + +请参考 [Rethinking ImageNet Pre-training](https://github.com/open-mmlab/mmdetection/blob/master/configs/scratch)。 + +### NAS-FPN + +请参考 [NAS-FPN](https://github.com/open-mmlab/mmdetection/blob/master/configs/nas_fpn)。 + +### ATSS + +请参考 [ATSS](https://github.com/open-mmlab/mmdetection/blob/master/configs/atss)。 + +### FSAF + +请参考 [FSAF](https://github.com/open-mmlab/mmdetection/blob/master/configs/fsaf)。 + +### RegNetX + +请参考 [RegNet](https://github.com/open-mmlab/mmdetection/blob/master/configs/regnet)。 + +### Res2Net + +请参考 [Res2Net](https://github.com/open-mmlab/mmdetection/blob/master/configs/res2net)。 + +### GRoIE + +请参考 [GRoIE](https://github.com/open-mmlab/mmdetection/blob/master/configs/groie)。 + +### Dynamic R-CNN + +请参考 [Dynamic R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/dynamic_rcnn)。 + +### PointRend + +请参考 [PointRend](https://github.com/open-mmlab/mmdetection/blob/master/configs/point_rend)。 + +### DetectoRS + +请参考 [DetectoRS](https://github.com/open-mmlab/mmdetection/blob/master/configs/detectors)。 + +### Generalized Focal Loss + +请参考 [Generalized Focal Loss](https://github.com/open-mmlab/mmdetection/blob/master/configs/gfl)。 + +### CornerNet + +请参考 [CornerNet](https://github.com/open-mmlab/mmdetection/blob/master/configs/cornernet)。 + +### YOLOv3 + +请参考 [YOLOv3](https://github.com/open-mmlab/mmdetection/blob/master/configs/yolo)。 + +### PAA + +请参考 [PAA](https://github.com/open-mmlab/mmdetection/blob/master/configs/paa)。 + +### SABL + +请参考 [SABL](https://github.com/open-mmlab/mmdetection/blob/master/configs/sabl)。 + +### CentripetalNet + +请参考 [CentripetalNet](https://github.com/open-mmlab/mmdetection/blob/master/configs/centripetalnet)。 + +### ResNeSt + +请参考 [ResNeSt](https://github.com/open-mmlab/mmdetection/blob/master/configs/resnest)。 + +### DETR + +请参考 [DETR](https://github.com/open-mmlab/mmdetection/blob/master/configs/detr)。 + +### Deformable DETR + +请参考 [Deformable DETR](https://github.com/open-mmlab/mmdetection/blob/master/configs/deformable_detr)。 + +### AutoAssign + +请参考 [AutoAssign](https://github.com/open-mmlab/mmdetection/blob/master/configs/autoassign)。 + +### YOLOF + +请参考 [YOLOF](https://github.com/open-mmlab/mmdetection/blob/master/configs/yolof)。 + +### Seesaw Loss + +请参考 [Seesaw Loss](https://github.com/open-mmlab/mmdetection/blob/master/configs/seesaw_loss)。 + +### CenterNet + +请参考 [CenterNet](https://github.com/open-mmlab/mmdetection/blob/master/configs/centernet)。 + +### YOLOX + +请参考 [YOLOX](https://github.com/open-mmlab/mmdetection/blob/master/configs/yolox)。 + +### PVT + +请参考 [PVT](https://github.com/open-mmlab/mmdetection/blob/master/configs/pvt)。 + +### SOLO + +请参考 [SOLO](https://github.com/open-mmlab/mmdetection/blob/master/configs/solo)。 + +### QueryInst + +请参考 [QueryInst](https://github.com/open-mmlab/mmdetection/blob/master/configs/queryinst)。 + +### RF-Next + +请参考 [RF-Next](https://github.com/open-mmlab/mmdetection/blob/master/configs/rfnext). + +### Other datasets + +我们还在 [PASCAL VOC](https://github.com/open-mmlab/mmdetection/blob/master/configs/pascal_voc),[Cityscapes](https://github.com/open-mmlab/mmdetection/blob/master/configs/cityscapes) 和 [WIDER FACE](https://github.com/open-mmlab/mmdetection/blob/master/configs/wider_face) 上对一些方法进行了基准测试。 + +### Pre-trained Models + +我们还通过多尺度训练和更长的训练策略来训练用 ResNet-50 和 [RegNetX-3.2G](https://github.com/open-mmlab/mmdetection/blob/master/configs/regnet) 作为主干网络的 [Faster R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/faster_rcnn) 和 [Mask R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask_rcnn)。这些模型可以作为下游任务的预训练模型。 + +## 速度基准 + +### 训练速度基准 + +我们提供 [analyze_logs.py](https://github.com/open-mmlab/mmdetection/blob/master/tools/analysis_tools/analyze_logs.py) 来得到训练中每一次迭代的平均时间。示例请参考 [Log Analysis](https://mmdetection.readthedocs.io/en/latest/useful_tools.html#log-analysis)。 + +我们与其他流行框架的 Mask R-CNN 训练速度进行比较(数据是从 [detectron2](https://github.com/facebookresearch/detectron2/blob/master/docs/notes/benchmarks.md/) 复制而来)。在 mmdetection 中,我们使用 [mask_rcnn_r50_caffe_fpn_poly_1x_coco_v1.py](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_poly_1x_coco_v1.py) 进行基准测试。它与 detectron2 的 [mask_rcnn_R_50_FPN_noaug_1x.yaml](https://github.com/facebookresearch/detectron2/blob/master/configs/Detectron1-Comparisons/mask_rcnn_R_50_FPN_noaug_1x.yaml) 设置完全一样。同时,我们还提供了[模型权重](https://download.openmmlab.com/mmdetection/v2.0/benchmark/mask_rcnn_r50_caffe_fpn_poly_1x_coco_no_aug/mask_rcnn_r50_caffe_fpn_poly_1x_coco_no_aug_compare_20200518-10127928.pth)和[训练 log](https://download.openmmlab.com/mmdetection/v2.0/benchmark/mask_rcnn_r50_caffe_fpn_poly_1x_coco_no_aug/mask_rcnn_r50_caffe_fpn_poly_1x_coco_no_aug_20200518_105755.log.json) 作为参考。为了跳过 GPU 预热时间,吞吐量按照100-500次迭代之间的平均吞吐量来计算。 + +| 框架 | 吞吐量 (img/s) | +| -------------------------------------------------------------------------------------- | -------------- | +| [Detectron2](https://github.com/facebookresearch/detectron2) | 62 | +| [MMDetection](https://github.com/open-mmlab/mmdetection) | 61 | +| [maskrcnn-benchmark](https://github.com/facebookresearch/maskrcnn-benchmark/) | 53 | +| [tensorpack](https://github.com/tensorpack/tensorpack/tree/master/examples/FasterRCNN) | 50 | +| [simpledet](https://github.com/TuSimple/simpledet/) | 39 | +| [Detectron](https://github.com/facebookresearch/Detectron) | 19 | +| [matterport/Mask_RCNN](https://github.com/matterport/Mask_RCNN/) | 14 | + +### 推理时间基准 + +我们提供 [benchmark.py](https://github.com/open-mmlab/mmdetection/blob/master/tools/analysis_tools/benchmark.py) 对推理时间进行基准测试。此脚本将推理 2000 张图片并计算忽略前 5 次推理的平均推理时间。可以通过设置 `LOG-INTERVAL` 来改变 log 输出间隔(默认为 50)。 + +```shell +python tools/benchmark.py ${CONFIG} ${CHECKPOINT} [--log-interval $[LOG-INTERVAL]] [--fuse-conv-bn] +``` + +模型库中,所有模型在基准测量推理时间时都没设置 `fuse-conv-bn`, 此设置可以使推理时间更短。 + +## 与 Detectron2 对比 + +我们在速度和精度方面对 mmdetection 和 [Detectron2](https://github.com/facebookresearch/detectron2.git) 进行对比。对比所使用的 detectron2 的 commit id 为 [185c27e](https://github.com/facebookresearch/detectron2/tree/185c27e4b4d2d4c68b5627b3765420c6d7f5a659)(30/4/2020)。 +为了公平对比,我们所有的实验都在同一机器下进行。 + +### 硬件 + +- 8 NVIDIA Tesla V100 (32G) GPUs +- Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz + +### 软件环境 + +- Python 3.7 +- PyTorch 1.4 +- CUDA 10.1 +- CUDNN 7.6.03 +- NCCL 2.4.08 + +### 精度 + +| 模型 | 训练策略 | Detectron2 | mmdetection | 下载 | +| -------------------------------------------------------------------------------------------------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Faster R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/faster_rcnn/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco.py) | 1x | [37.9](https://github.com/facebookresearch/detectron2/blob/master/configs/COCO-Detection/faster_rcnn_R_50_FPN_1x.yaml) | 38.0 | [model](https://download.openmmlab.com/mmdetection/v2.0/benchmark/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco-5324cff8.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/benchmark/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco/faster_rcnn_r50_caffe_fpn_mstrain_1x_coco_20200429_234554.log.json) | +| [Mask R-CNN](https://github.com/open-mmlab/mmdetection/blob/master/configs/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py) | 1x | [38.6 & 35.2](https://github.com/facebookresearch/detectron2/blob/master/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml) | 38.8 & 35.4 | [model](https://download.openmmlab.com/mmdetection/v2.0/benchmark/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco-dbecf295.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/benchmark/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco_20200430_054239.log.json) | +| [Retinanet](https://github.com/open-mmlab/mmdetection/blob/master/configs/retinanet/retinanet_r50_caffe_fpn_mstrain_1x_coco.py) | 1x | [36.5](https://github.com/facebookresearch/detectron2/blob/master/configs/COCO-Detection/retinanet_R_50_FPN_1x.yaml) | 37.0 | [model](https://download.openmmlab.com/mmdetection/v2.0/benchmark/retinanet_r50_caffe_fpn_mstrain_1x_coco/retinanet_r50_caffe_fpn_mstrain_1x_coco-586977a0.pth) \| [log](https://download.openmmlab.com/mmdetection/v2.0/benchmark/retinanet_r50_caffe_fpn_mstrain_1x_coco/retinanet_r50_caffe_fpn_mstrain_1x_coco_20200430_014748.log.json) | + +### 训练速度 + +训练速度使用 s/iter 来度量。结果越低越好。 + +| 模型 | Detectron2 | mmdetection | +| ------------ | ---------- | ----------- | +| Faster R-CNN | 0.210 | 0.216 | +| Mask R-CNN | 0.261 | 0.265 | +| Retinanet | 0.200 | 0.205 | + +### 推理速度 + +推理速度通过单张 GPU 下的 fps(img/s) 来度量,越高越好。 +为了与 Detectron2 保持一致,我们所写的推理时间除去了数据加载时间。 +对于 Mask RCNN,我们去除了后处理中 RLE 编码的时间。 +我们在括号中给出了官方给出的速度。由于硬件差异,官方给出的速度会比我们所测试得到的速度快一些。 + +| 模型 | Detectron2 | mmdetection | +| ------------ | ----------- | ----------- | +| Faster R-CNN | 25.6 (26.3) | 22.2 | +| Mask R-CNN | 22.5 (23.3) | 19.6 | +| Retinanet | 17.8 (18.2) | 20.6 | + +### 训练内存 + +| 模型 | Detectron2 | mmdetection | +| ------------ | ---------- | ----------- | +| Faster R-CNN | 3.0 | 3.8 | +| Mask R-CNN | 3.4 | 3.9 | +| Retinanet | 3.9 | 3.4 | diff --git a/docs/zh_cn/projects.md b/docs/zh_cn/projects.md new file mode 100644 index 0000000..6b9d300 --- /dev/null +++ b/docs/zh_cn/projects.md @@ -0,0 +1,48 @@ +# 基于 MMDetection 的项目 + +有许多开源项目都是基于 MMDetection 搭建的,我们在这里列举一部分作为样例,展示如何基于 MMDetection 搭建您自己的项目。 +由于这个页面列举的项目并不完全,我们欢迎社区提交 Pull Request 来更新这个文档。 + +## MMDetection 的拓展项目 + +一些项目拓展了 MMDetection 的边界,如将 MMDetection 拓展支持 3D 检测或者将 MMDetection 用于部署。 +它们展示了 MMDetection 的许多可能性,所以我们在这里也列举一些。 + +- [OTEDetection](https://github.com/opencv/mmdetection): OpenVINO training extensions for object detection. +- [MMDetection3d](https://github.com/open-mmlab/mmdetection3d): OpenMMLab's next-generation platform for general 3D object detection. + +## 研究项目 + +同样有许多研究论文是基于 MMDetection 进行的。许多论文都发表在了顶级的会议或期刊上,或者对社区产生了深远的影响。 +为了向社区提供一个可以参考的论文列表,帮助大家开发或者比较新的前沿算法,我们在这里也遵循会议的时间顺序列举了一些论文。 +MMDetection 中已经支持的算法不在此列。 + +- Involution: Inverting the Inherence of Convolution for Visual Recognition, CVPR21. [\[paper\]](https://arxiv.org/abs/2103.06255)[\[github\]](https://github.com/d-li14/involution) +- Multiple Instance Active Learning for Object Detection, CVPR 2021. [\[paper\]](https://openaccess.thecvf.com/content/CVPR2021/papers/Yuan_Multiple_Instance_Active_Learning_for_Object_Detection_CVPR_2021_paper.pdf)[\[github\]](https://github.com/yuantn/MI-AOD) +- Adaptive Class Suppression Loss for Long-Tail Object Detection, CVPR 2021. [\[paper\]](https://arxiv.org/abs/2104.00885)[\[github\]](https://github.com/CASIA-IVA-Lab/ACSL) +- Generalizable Pedestrian Detection: The Elephant In The Room, CVPR2021. [\[paper\]](https://arxiv.org/abs/2003.08799)[\[github\]](https://github.com/hasanirtiza/Pedestron) +- Group Fisher Pruning for Practical Network Compression, ICML2021. [\[paper\]](https://github.com/jshilong/FisherPruning/blob/main/resources/paper.pdf)[\[github\]](https://github.com/jshilong/FisherPruning) +- Overcoming Classifier Imbalance for Long-tail Object Detection with Balanced Group Softmax, CVPR2020. [\[paper\]](http://openaccess.thecvf.com/content_CVPR_2020/papers/Li_Overcoming_Classifier_Imbalance_for_Long-Tail_Object_Detection_With_Balanced_Group_CVPR_2020_paper.pdf)[\[github\]](https://github.com/FishYuLi/BalancedGroupSoftmax) +- Coherent Reconstruction of Multiple Humans from a Single Image, CVPR2020. [\[paper\]](https://jiangwenpl.github.io/multiperson/)[\[github\]](https://github.com/JiangWenPL/multiperson) +- Look-into-Object: Self-supervised Structure Modeling for Object Recognition, CVPR 2020. [\[paper\]](http://openaccess.thecvf.com/content_CVPR_2020/papers/Zhou_Look-Into-Object_Self-Supervised_Structure_Modeling_for_Object_Recognition_CVPR_2020_paper.pdf)[\[github\]](https://github.com/JDAI-CV/LIO) +- Video Panoptic Segmentation, CVPR2020. [\[paper\]](https://arxiv.org/abs/2006.11339)[\[github\]](https://github.com/mcahny/vps) +- D2Det: Towards High Quality Object Detection and Instance Segmentation, CVPR2020. [\[paper\]](http://openaccess.thecvf.com/content_CVPR_2020/html/Cao_D2Det_Towards_High_Quality_Object_Detection_and_Instance_Segmentation_CVPR_2020_paper.html)[\[github\]](https://github.com/JialeCao001/D2Det) +- CentripetalNet: Pursuing High-quality Keypoint Pairs for Object Detection, CVPR2020. [\[paper\]](https://arxiv.org/abs/2003.09119)[\[github\]](https://github.com/KiveeDong/CentripetalNet) +- Learning a Unified Sample Weighting Network for Object Detection, CVPR 2020. [\[paper\]](http://openaccess.thecvf.com/content_CVPR_2020/html/Cai_Learning_a_Unified_Sample_Weighting_Network_for_Object_Detection_CVPR_2020_paper.html)[\[github\]](https://github.com/caiqi/sample-weighting-network) +- Scale-equalizing Pyramid Convolution for Object Detection, CVPR2020. [\[paper\]](https://arxiv.org/abs/2005.03101) [\[github\]](https://github.com/jshilong/SEPC) +- Revisiting the Sibling Head in Object Detector, CVPR2020. [\[paper\]](https://arxiv.org/abs/2003.07540)[\[github\]](https://github.com/Sense-X/TSD) +- PolarMask: Single Shot Instance Segmentation with Polar Representation, CVPR2020. [\[paper\]](https://arxiv.org/abs/1909.13226)[\[github\]](https://github.com/xieenze/PolarMask) +- Hit-Detector: Hierarchical Trinity Architecture Search for Object Detection, CVPR2020. [\[paper\]](https://arxiv.org/abs/2003.11818)[\[github\]](https://github.com/ggjy/HitDet.pytorch) +- ZeroQ: A Novel Zero Shot Quantization Framework, CVPR2020. [\[paper\]](https://arxiv.org/abs/2001.00281)[\[github\]](https://github.com/amirgholami/ZeroQ) +- CBNet: A Novel Composite Backbone Network Architecture for Object Detection, AAAI2020. [\[paper\]](https://aaai.org/Papers/AAAI/2020GB/AAAI-LiuY.1833.pdf)[\[github\]](https://github.com/VDIGPKU/CBNet) +- RDSNet: A New Deep Architecture for Reciprocal Object Detection and Instance Segmentation, AAAI2020. [\[paper\]](https://arxiv.org/abs/1912.05070)[\[github\]](https://github.com/wangsr126/RDSNet) +- Training-Time-Friendly Network for Real-Time Object Detection, AAAI2020. [\[paper\]](https://arxiv.org/abs/1909.00700)[\[github\]](https://github.com/ZJULearning/ttfnet) +- Cascade RPN: Delving into High-Quality Region Proposal Network with Adaptive Convolution, NeurIPS 2019. [\[paper\]](https://arxiv.org/abs/1909.06720)[\[github\]](https://github.com/thangvubk/Cascade-RPN) +- Reasoning R-CNN: Unifying Adaptive Global Reasoning into Large-scale Object Detection, CVPR2019. [\[paper\]](http://openaccess.thecvf.com/content_CVPR_2019/papers/Xu_Reasoning-RCNN_Unifying_Adaptive_Global_Reasoning_Into_Large-Scale_Object_Detection_CVPR_2019_paper.pdf)[\[github\]](https://github.com/chanyn/Reasoning-RCNN) +- Learning RoI Transformer for Oriented Object Detection in Aerial Images, CVPR2019. [\[paper\]](https://arxiv.org/abs/1812.00155)[\[github\]](https://github.com/dingjiansw101/AerialDetection) +- SOLO: Segmenting Objects by Locations. [\[paper\]](https://arxiv.org/abs/1912.04488)[\[github\]](https://github.com/WXinlong/SOLO) +- SOLOv2: Dynamic, Faster and Stronger. [\[paper\]](https://arxiv.org/abs/2003.10152)[\[github\]](https://github.com/WXinlong/SOLO) +- Dense Peppoints: Representing Visual Objects with Dense Point Sets. [\[paper\]](https://arxiv.org/abs/1912.11473)[\[github\]](https://github.com/justimyhxu/Dense-RepPoints) +- IterDet: Iterative Scheme for Object Detection in Crowded Environments. [\[paper\]](https://arxiv.org/abs/2005.05708)[\[github\]](https://github.com/saic-vul/iterdet) +- Cross-Iteration Batch Normalization. [\[paper\]](https://arxiv.org/abs/2002.05712)[\[github\]](https://github.com/Howal/Cross-iterationBatchNorm) +- A Ranking-based, Balanced Loss Function Unifying Classification and Localisation in Object Detection, NeurIPS2020 [\[paper\]](https://arxiv.org/abs/2009.13592)[\[github\]](https://github.com/kemaloksuz/aLRPLoss) diff --git a/docs/zh_cn/robustness_benchmarking.md b/docs/zh_cn/robustness_benchmarking.md new file mode 100644 index 0000000..28a6759 --- /dev/null +++ b/docs/zh_cn/robustness_benchmarking.md @@ -0,0 +1,109 @@ +# 检测器鲁棒性检查 + +## 介绍 + +我们提供了在 [Benchmarking Robustness in Object Detection: Autonomous Driving when Winter is Coming](https://arxiv.org/abs/1907.07484) 中定义的「图像损坏基准测试」上测试目标检测和实例分割模型的工具。 +此页面提供了如何使用该基准测试的基本教程。 + +```latex +@article{michaelis2019winter, + title={Benchmarking Robustness in Object Detection: + Autonomous Driving when Winter is Coming}, + author={Michaelis, Claudio and Mitzkus, Benjamin and + Geirhos, Robert and Rusak, Evgenia and + Bringmann, Oliver and Ecker, Alexander S. and + Bethge, Matthias and Brendel, Wieland}, + journal={arXiv:1907.07484}, + year={2019} +} +``` + +![image corruption example](../resources/corruptions_sev_3.png) + +## 关于基准测试 + +要将结果提交到基准测试,请访问[基准测试主页](https://github.com/bethgelab/robust-detection-benchmark) + +基准测试是仿照 [imagenet-c 基准测试](https://github.com/hendrycks/robustness),由 Dan Hendrycks 和 Thomas Dietterich 在[Benchmarking Neural Network Robustness to Common Corruptions and Perturbations](https://arxiv.org/abs/1903.12261)(ICLR 2019)中发表。 + +图像损坏变换功能包含在此库中,但可以使用以下方法单独安装: + +```shell +pip install imagecorruptions +``` + +与 imagenet-c 相比,我们必须进行一些更改以处理任意大小的图像和灰度图像。 +我们还修改了“运动模糊”和“雪”损坏,以解除对于 linux 特定库的依赖, +否则必须单独安装这些库。有关详细信息,请参阅 [imagecorruptions](https://github.com/bethgelab/imagecorruptions)。 + +## 使用预训练模型进行推理 + +我们提供了一个测试脚本来评估模型在基准测试中提供的各种损坏变换组合下的性能。 + +### 在数据集上测试 + +- [x] 单张 GPU 测试 +- [ ] 多张 GPU 测试 +- [ ] 可视化检测结果 + +您可以使用以下命令在基准测试中使用 15 种损坏变换来测试模型性能。 + +```shell +# single-gpu testing +python tools/analysis_tools/test_robustness.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] +``` + +也可以选择其它不同类型的损坏变换。 + +```shell +# noise +python tools/analysis_tools/test_robustness.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] --corruptions noise + +# blur +python tools/analysis_tools/test_robustness.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] --corruptions blur + +# wetaher +python tools/analysis_tools/test_robustness.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] --corruptions weather + +# digital +python tools/analysis_tools/test_robustness.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] --corruptions digital +``` + +或者使用一组自定义的损坏变换,例如: + +```shell +# gaussian noise, zoom blur and snow +python tools/analysis_tools/test_robustness.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] --corruptions gaussian_noise zoom_blur snow +``` + +最后,我们也可以选择施加在图像上的损坏变换的严重程度。 +严重程度从 1 到 5 逐级增强,0 表示不对图像施加损坏变换,即原始图像数据。 + +```shell +# severity 1 +python tools/analysis_tools/test_robustness.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] --severities 1 + +# severities 0,2,4 +python tools/analysis_tools/test_robustness.py ${CONFIG_FILE} ${CHECKPOINT_FILE} [--out ${RESULT_FILE}] [--eval ${EVAL_METRICS}] --severities 0 2 4 +``` + +## 模型测试结果 + +下表是各模型在 COCO 2017val 上的测试结果。 + +| Model | Backbone | Style | Lr schd | box AP clean | box AP corr. | box % | mask AP clean | mask AP corr. | mask % | +| :-----------------: | :-----------------: | :-----: | :-----: | :----------: | :----------: | :---: | :-----------: | :-----------: | :----: | +| Faster R-CNN | R-50-FPN | pytorch | 1x | 36.3 | 18.2 | 50.2 | - | - | - | +| Faster R-CNN | R-101-FPN | pytorch | 1x | 38.5 | 20.9 | 54.2 | - | - | - | +| Faster R-CNN | X-101-32x4d-FPN | pytorch | 1x | 40.1 | 22.3 | 55.5 | - | - | - | +| Faster R-CNN | X-101-64x4d-FPN | pytorch | 1x | 41.3 | 23.4 | 56.6 | - | - | - | +| Faster R-CNN | R-50-FPN-DCN | pytorch | 1x | 40.0 | 22.4 | 56.1 | - | - | - | +| Faster R-CNN | X-101-32x4d-FPN-DCN | pytorch | 1x | 43.4 | 26.7 | 61.6 | - | - | - | +| Mask R-CNN | R-50-FPN | pytorch | 1x | 37.3 | 18.7 | 50.1 | 34.2 | 16.8 | 49.1 | +| Mask R-CNN | R-50-FPN-DCN | pytorch | 1x | 41.1 | 23.3 | 56.7 | 37.2 | 20.7 | 55.7 | +| Cascade R-CNN | R-50-FPN | pytorch | 1x | 40.4 | 20.1 | 49.7 | - | - | - | +| Cascade Mask R-CNN | R-50-FPN | pytorch | 1x | 41.2 | 20.7 | 50.2 | 35.7 | 17.6 | 49.3 | +| RetinaNet | R-50-FPN | pytorch | 1x | 35.6 | 17.8 | 50.1 | - | - | - | +| Hybrid Task Cascade | X-101-64x4d-FPN-DCN | pytorch | 1x | 50.6 | 32.7 | 64.7 | 43.8 | 28.1 | 64.0 | + +由于对图像的损坏变换存在随机性,测试结果可能略有不同。 diff --git a/docs/zh_cn/stat.py b/docs/zh_cn/stat.py new file mode 100755 index 0000000..9625c62 --- /dev/null +++ b/docs/zh_cn/stat.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python +import functools as func +import glob +import os.path as osp +import re + +import numpy as np + +url_prefix = 'https://github.com/open-mmlab/mmdetection/blob/master/' + +files = sorted(glob.glob('../configs/*/README.md')) + +stats = [] +titles = [] +num_ckpts = 0 + +for f in files: + url = osp.dirname(f.replace('../', url_prefix)) + + with open(f, 'r') as content_file: + content = content_file.read() + + title = content.split('\n')[0].replace('# ', '').strip() + ckpts = set(x.lower().strip() + for x in re.findall(r'\[model\]\((https?.*)\)', content)) + + if len(ckpts) == 0: + continue + + _papertype = [x for x in re.findall(r'\[([A-Z]+)\]', content)] + assert len(_papertype) > 0 + papertype = _papertype[0] + + paper = set([(papertype, title)]) + + titles.append(title) + num_ckpts += len(ckpts) + + statsmsg = f""" +\t* [{papertype}] [{title}]({url}) ({len(ckpts)} ckpts) +""" + stats.append((paper, ckpts, statsmsg)) + +allpapers = func.reduce(lambda a, b: a.union(b), [p for p, _, _ in stats]) +msglist = '\n'.join(x for _, _, x in stats) + +papertypes, papercounts = np.unique([t for t, _ in allpapers], + return_counts=True) +countstr = '\n'.join( + [f' - {t}: {c}' for t, c in zip(papertypes, papercounts)]) + +modelzoo = f""" +# Model Zoo Statistics + +* Number of papers: {len(set(titles))} +{countstr} + +* Number of checkpoints: {num_ckpts} + +{msglist} +""" + +with open('modelzoo_statistics.md', 'w') as f: + f.write(modelzoo) diff --git a/docs/zh_cn/switch_language.md b/docs/zh_cn/switch_language.md new file mode 100644 index 0000000..b2c4ad9 --- /dev/null +++ b/docs/zh_cn/switch_language.md @@ -0,0 +1,3 @@ +## English + +## 简体中文 diff --git a/docs/zh_cn/tutorials/config.md b/docs/zh_cn/tutorials/config.md new file mode 100644 index 0000000..34ef58b --- /dev/null +++ b/docs/zh_cn/tutorials/config.md @@ -0,0 +1,528 @@ +# 教程 1: 学习配置文件 + +我们在配置文件中支持了继承和模块化,这便于进行各种实验。如果需要检查配置文件,可以通过运行 `python tools/misc/print_config.py /PATH/TO/CONFIG` 来查看完整的配置。 + +## 通过脚本参数修改配置 + +当运行 `tools/train.py` 和 `tools/test.py` 时,可以通过 `--cfg-options` 来修改配置文件。 + +- 更新字典链中的配置 + + 可以按照原始配置文件中的 dict 键顺序地指定配置预选项。例如,使用 `--cfg-options model.backbone.norm_eval=False` 将模型主干网络中的所有 BN 模块都改为 `train` 模式。 + +- 更新配置列表中的键 + + 在配置文件里,一些字典型的配置被包含在列表中。例如,数据训练流程 `data.train.pipeline` 通常是一个列表,比如 `[dict(type='LoadImageFromFile'), ...]`。如果需要将 `'LoadImageFromFile'` 改成 `'LoadImageFromWebcam'`,需要写成下述形式: `--cfg-options data.train.pipeline.0.type=LoadImageFromWebcam`。 + +- 更新列表或元组的值 + + 如果要更新的值是列表或元组。例如,配置文件通常设置 `workflow=[('train', 1)]`,如果需要改变这个键,可以通过 `--cfg-options workflow="[(train,1),(val,1)]"` 来重新设置。需要注意,引号 " 是支持列表或元组数据类型所必需的,并且在指定值的引号内**不允许**有空格。 + +## 配置文件结构 + +在 `config/_base_` 文件夹下有 4 个基本组件类型,分别是:数据集(dataset),模型(model),训练策略(schedule)和运行时的默认设置(default runtime)。许多方法,例如 Faster R-CNN、Mask R-CNN、Cascade R-CNN、RPN、SSD 能够很容易地构建出来。由 `_base_` 下的组件组成的配置,被我们称为 _原始配置(primitive)_。 + +对于同一文件夹下的所有配置,推荐**只有一个**对应的**原始配置**文件。所有其他的配置文件都应该继承自这个**原始配置**文件。这样就能保证配置文件的最大继承深度为 3。 + +为了便于理解,我们建议贡献者继承现有方法。例如,如果在 Faster R-CNN 的基础上做了一些修改,用户首先可以通过指定 `_base_ = ../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py` 来继承基础的 Faster R-CNN 结构,然后修改配置文件中的必要参数以完成继承。 + +如果你在构建一个与任何现有方法不共享结构的全新方法,那么可以在 `configs` 文件夹下创建一个新的例如 `xxx_rcnn` 文件夹。更多细节请参考 [MMCV](https://mmcv.readthedocs.io/en/latest/understand_mmcv/config.html) 文档。 + +## 配置文件名称风格 + +我们遵循以下样式来命名配置文件。建议贡献者遵循相同的风格。 + +``` +{model}_[model setting]_{backbone}_{neck}_[norm setting]_[misc]_[gpu x batch_per_gpu]_{schedule}_{dataset} +``` + +`{xxx}` 是被要求的文件 `[yyy]` 是可选的。 + +- `{model}`: 模型种类,例如 `faster_rcnn`, `mask_rcnn` 等。 +- `[model setting]`: 特定的模型,例如 `htc` 中的`without_semantic`, `reppoints` 中的 `moment` 等。 +- `{backbone}`: 主干网络种类例如 `r50` (ResNet-50), `x101` (ResNeXt-101) 等。 +- `{neck}`: Neck 模型的种类包括 `fpn`, `pafpn`, `nasfpn`, `c4 ` 等。 +- `[norm_setting]`: 默认使用 `bn` (Batch Normalization),其他指定可以有 `gn` (Group Normalization), `syncbn` (Synchronized Batch Normalization) 等。 + `gn-head`/`gn-neck` 表示 GN 仅应用于网络的 Head 或 Neck, `gn-all` 表示 GN 用于整个模型, 例如主干网络、Neck 和 Head。 +- `[misc]`: 模型中各式各样的设置/插件,例如 `dconv`、 `gcb`、 `attention`、`albu`、 `mstrain` 等。 +- `[gpu x batch_per_gpu]`:GPU 数量和每个 GPU 的样本数,默认使用 `8x2`。 +- `{schedule}`: 训练方案,选项是 `1x`、 `2x`、 `20e` 等。`1x` 和 `2x` 分别代表 12 epoch 和 24 epoch,`20e` 在级联模型中使用,表示 20 epoch。对于 `1x`/`2x`,初始学习率在第 8/16 和第 11/22 epoch 衰减 10 倍;对于 `20e` ,初始学习率在第 16 和第 19 epoch 衰减 10 倍。 +- `{dataset}`:数据集,例如 `coco`、 `cityscapes`、 `voc_0712`、 `wider_face` 等。 + +## 弃用的 train_cfg/test_cfg + +`train_cfg` 和 `test_cfg` 在配置文件中已弃用,请在模型配置中指定它们。原始配置结构如下: + +```python +# 已经弃用的形式 +model = dict( + type=..., + ... +) +train_cfg=dict(...) +test_cfg=dict(...) +``` + +推荐的配置结构如下: + +```python +# 推荐的形式 +model = dict( + type=..., + ... +train_cfg=dict(...), + test_cfg=dict(...), +) +``` + +## Mask R-CNN 配置文件示例 + +为了帮助用户对 MMDetection 检测系统中的完整配置和模块有一个基本的了解,我们对使用 ResNet50 和 FPN 的 Mask R-CNN 的配置文件进行简要注释说明。更详细的用法和各个模块对应的替代方案,请参考 API 文档。 + +```python +model = dict( + type='MaskRCNN', # 检测器(detector)名称 + backbone=dict( # 主干网络的配置文件 + type='ResNet', # 主干网络的类别,可用选项请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/backbones/resnet.py#L308 + depth=50, # 主干网络的深度,对于 ResNet 和 ResNext 通常设置为 50 或 101。 + num_stages=4, # 主干网络状态(stages)的数目,这些状态产生的特征图作为后续的 head 的输入。 + out_indices=(0, 1, 2, 3), # 每个状态产生的特征图输出的索引。 + frozen_stages=1, # 第一个状态的权重被冻结 + norm_cfg=dict( # 归一化层(norm layer)的配置项。 + type='BN', # 归一化层的类别,通常是 BN 或 GN。 + requires_grad=True), # 是否训练归一化里的 gamma 和 beta。 + norm_eval=True, # 是否冻结 BN 里的统计项。 + style='pytorch', # 主干网络的风格,'pytorch' 意思是步长为2的层为 3x3 卷积, 'caffe' 意思是步长为2的层为 1x1 卷积。 + init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')), # 加载通过 ImageNet 预训练的模型 + neck=dict( + type='FPN', # 检测器的 neck 是 FPN,我们同样支持 'NASFPN', 'PAFPN' 等,更多细节可以参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/necks/fpn.py#L10。 + in_channels=[256, 512, 1024, 2048], # 输入通道数,这与主干网络的输出通道一致 + out_channels=256, # 金字塔特征图每一层的输出通道 + num_outs=5), # 输出的范围(scales) + rpn_head=dict( + type='RPNHead', # RPN_head 的类型是 'RPNHead', 我们也支持 'GARPNHead' 等,更多细节可以参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/dense_heads/rpn_head.py#L12。 + in_channels=256, # 每个输入特征图的输入通道,这与 neck 的输出通道一致。 + feat_channels=256, # head 卷积层的特征通道。 + anchor_generator=dict( # 锚点(Anchor)生成器的配置。 + type='AnchorGenerator', # 大多是方法使用 AnchorGenerator 作为锚点生成器, SSD 检测器使用 `SSDAnchorGenerator`。更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/anchor/anchor_generator.py#L10。 + scales=[8], # 锚点的基本比例,特征图某一位置的锚点面积为 scale * base_sizes + ratios=[0.5, 1.0, 2.0], # 高度和宽度之间的比率。 + strides=[4, 8, 16, 32, 64]), # 锚生成器的步幅。这与 FPN 特征步幅一致。 如果未设置 base_sizes,则当前步幅值将被视为 base_sizes。 + bbox_coder=dict( # 在训练和测试期间对框进行编码和解码。 + type='DeltaXYWHBBoxCoder', # 框编码器的类别,'DeltaXYWHBBoxCoder' 是最常用的,更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/bbox/coder/delta_xywh_bbox_coder.py#L9。 + target_means=[0.0, 0.0, 0.0, 0.0], # 用于编码和解码框的目标均值 + target_stds=[1.0, 1.0, 1.0, 1.0]), # 用于编码和解码框的标准差 + loss_cls=dict( # 分类分支的损失函数配置 + type='CrossEntropyLoss', # 分类分支的损失类型,我们也支持 FocalLoss 等。 + use_sigmoid=True, # RPN通常进行二分类,所以通常使用sigmoid函数。 + los_weight=1.0), # 分类分支的损失权重。 + loss_bbox=dict( # 回归分支的损失函数配置。 + type='L1Loss', # 损失类型,我们还支持许多 IoU Losses 和 Smooth L1-loss 等,更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/losses/smooth_l1_loss.py#L56。 + loss_weight=1.0)), # 回归分支的损失权重。 + roi_head=dict( # RoIHead 封装了两步(two-stage)/级联(cascade)检测器的第二步。 + type='StandardRoIHead', # RoI head 的类型,更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/roi_heads/standard_roi_head.py#L10。 + bbox_roi_extractor=dict( # 用于 bbox 回归的 RoI 特征提取器。 + type='SingleRoIExtractor', # RoI 特征提取器的类型,大多数方法使用 SingleRoIExtractor,更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/roi_heads/roi_extractors/single_level.py#L10。 + roi_layer=dict( # RoI 层的配置 + type='RoIAlign', # RoI 层的类别, 也支持 DeformRoIPoolingPack 和 ModulatedDeformRoIPoolingPack,更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/ops/roi_align/roi_align.py#L79。 + output_size=7, # 特征图的输出大小。 + sampling_ratio=0), # 提取 RoI 特征时的采样率。0 表示自适应比率。 + out_channels=256, # 提取特征的输出通道。 + featmap_strides=[4, 8, 16, 32]), # 多尺度特征图的步幅,应该与主干的架构保持一致。 + bbox_head=dict( # RoIHead 中 box head 的配置. + type='Shared2FCBBoxHead', # bbox head 的类别,更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/roi_heads/bbox_heads/convfc_bbox_head.py#L177。 + in_channels=256, # bbox head 的输入通道。 这与 roi_extractor 中的 out_channels 一致。 + fc_out_channels=1024, # FC 层的输出特征通道。 + roi_feat_size=7, # 候选区域(Region of Interest)特征的大小。 + num_classes=80, # 分类的类别数量。 + bbox_coder=dict( # 第二阶段使用的框编码器。 + type='DeltaXYWHBBoxCoder', # 框编码器的类别,大多数情况使用 'DeltaXYWHBBoxCoder'。 + target_means=[0.0, 0.0, 0.0, 0.0], # 用于编码和解码框的均值 + target_stds=[0.1, 0.1, 0.2, 0.2]), # 编码和解码的标准差。因为框更准确,所以值更小,常规设置时 [0.1, 0.1, 0.2, 0.2]。 + reg_class_agnostic=False, # 回归是否与类别无关。 + loss_cls=dict( # 分类分支的损失函数配置 + type='CrossEntropyLoss', # 分类分支的损失类型,我们也支持 FocalLoss 等。 + use_sigmoid=False, # 是否使用 sigmoid。 + loss_weight=1.0), # 分类分支的损失权重。 + loss_bbox=dict( # 回归分支的损失函数配置。 + type='L1Loss', # 损失类型,我们还支持许多 IoU Losses 和 Smooth L1-loss 等。 + loss_weight=1.0)), # 回归分支的损失权重。 + mask_roi_extractor=dict( # 用于 mask 生成的 RoI 特征提取器。 + type='SingleRoIExtractor', # RoI 特征提取器的类型,大多数方法使用 SingleRoIExtractor。 + roi_layer=dict( # 提取实例分割特征的 RoI 层配置 + type='RoIAlign', # RoI 层的类型,也支持 DeformRoIPoolingPack 和 ModulatedDeformRoIPoolingPack。 + output_size=14, # 特征图的输出大小。 + sampling_ratio=0), # 提取 RoI 特征时的采样率。 + out_channels=256, # 提取特征的输出通道。 + featmap_strides=[4, 8, 16, 32]), # 多尺度特征图的步幅。 + mask_head=dict( # mask 预测 head 模型 + type='FCNMaskHead', # mask head 的类型,更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/roi_heads/mask_heads/fcn_mask_head.py#L21。 + num_convs=4, # mask head 中的卷积层数 + in_channels=256, # 输入通道,应与 mask roi extractor 的输出通道一致。 + conv_out_channels=256, # 卷积层的输出通道。 + num_classes=80, # 要分割的类别数。 + loss_mask=dict( # mask 分支的损失函数配置。 + type='CrossEntropyLoss', # 用于分割的损失类型。 + use_mask=True, # 是否只在正确的类中训练 mask。 + loss_weight=1.0))), # mask 分支的损失权重. + train_cfg = dict( # rpn 和 rcnn 训练超参数的配置 + rpn=dict( # rpn 的训练配置 + assigner=dict( # 分配器(assigner)的配置 + type='MaxIoUAssigner', # 分配器的类型,MaxIoUAssigner 用于许多常见的检测器,更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/bbox/assigners/max_iou_assigner.py#L10。 + pos_iou_thr=0.7, # IoU >= 0.7(阈值) 被视为正样本。 + neg_iou_thr=0.3, # IoU < 0.3(阈值) 被视为负样本。 + min_pos_iou=0.3, # 将框作为正样本的最小 IoU 阈值。 + match_low_quality=True, # 是否匹配低质量的框(更多细节见 API 文档). + ignore_iof_thr=-1), # 忽略 bbox 的 IoF 阈值。 + sampler=dict( # 正/负采样器(sampler)的配置 + type='RandomSampler', # 采样器类型,还支持 PseudoSampler 和其他采样器,更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/bbox/samplers/random_sampler.py#L8。 + num=256, # 样本数量。 + pos_fraction=0.5, # 正样本占总样本的比例。 + neg_pos_ub=-1, # 基于正样本数量的负样本上限。 + add_gt_as_proposals=False), # 采样后是否添加 GT 作为 proposal。 + allowed_border=-1, # 填充有效锚点后允许的边框。 + pos_weight=-1, # 训练期间正样本的权重。 + debug=False), # 是否设置调试(debug)模式 + rpn_proposal=dict( # 在训练期间生成 proposals 的配置 + nms_across_levels=False, # 是否对跨层的 box 做 NMS。仅适用于 `GARPNHead` ,naive rpn 不支持 nms cross levels。 + nms_pre=2000, # NMS 前的 box 数 + nms_post=1000, # NMS 要保留的 box 的数量,只在 GARPNHead 中起作用。 + max_per_img=1000, # NMS 后要保留的 box 数量。 + nms=dict( # NMS 的配置 + type='nms', # NMS 的类别 + iou_threshold=0.7 # NMS 的阈值 + ), + min_bbox_size=0), # 允许的最小 box 尺寸 + rcnn=dict( # roi head 的配置。 + assigner=dict( # 第二阶段分配器的配置,这与 rpn 中的不同 + type='MaxIoUAssigner', # 分配器的类型,MaxIoUAssigner 目前用于所有 roi_heads。更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/bbox/assigners/max_iou_assigner.py#L10。 + pos_iou_thr=0.5, # IoU >= 0.5(阈值)被认为是正样本。 + neg_iou_thr=0.5, # IoU < 0.5(阈值)被认为是负样本。 + min_pos_iou=0.5, # 将 box 作为正样本的最小 IoU 阈值 + match_low_quality=False, # 是否匹配低质量下的 box(有关更多详细信息,请参阅 API 文档)。 + ignore_iof_thr=-1), # 忽略 bbox 的 IoF 阈值 + sampler=dict( + type='RandomSampler', #采样器的类型,还支持 PseudoSampler 和其他采样器,更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/bbox/samplers/random_sampler.py#L8。 + num=512, # 样本数量 + pos_fraction=0.25, # 正样本占总样本的比例。. + neg_pos_ub=-1, # 基于正样本数量的负样本上限。. + add_gt_as_proposals=True + ), # 采样后是否添加 GT 作为 proposal。 + mask_size=28, # mask 的大小 + pos_weight=-1, # 训练期间正样本的权重。 + debug=False)), # 是否设置调试模式。 + test_cfg = dict( # 用于测试 rpn 和 rcnn 超参数的配置 + rpn=dict( # 测试阶段生成 proposals 的配置 + nms_across_levels=False, # 是否对跨层的 box 做 NMS。仅适用于`GARPNHead`,naive rpn 不支持做 NMS cross levels。 + nms_pre=1000, # NMS 前的 box 数 + nms_post=1000, # NMS 要保留的 box 的数量,只在`GARPNHead`中起作用。 + max_per_img=1000, # NMS 后要保留的 box 数量 + nms=dict( # NMS 的配置 + type='nms', # NMS 的类型 + iou_threshold=0.7 # NMS 阈值 + ), + min_bbox_size=0), # box 允许的最小尺寸 + rcnn=dict( # roi heads 的配置 + score_thr=0.05, # bbox 的分数阈值 + nms=dict( # 第二步的 NMS 配置 + type='nms', # NMS 的类型 + iou_thr=0.5), # NMS 的阈值 + max_per_img=100, # 每张图像的最大检测次数 + mask_thr_binary=0.5))) # mask 预处的阈值 + +dataset_type = 'CocoDataset' # 数据集类型,这将被用来定义数据集。 +data_root = 'data/coco/' # 数据的根路径。 +img_norm_cfg = dict( # 图像归一化配置,用来归一化输入的图像。 + mean=[123.675, 116.28, 103.53], # 预训练里用于预训练主干网络模型的平均值。 + std=[58.395, 57.12, 57.375], # 预训练里用于预训练主干网络模型的标准差。 + to_rgb=True +) # 预训练里用于预训练主干网络的图像的通道顺序。 +train_pipeline = [ # 训练流程 + dict(type='LoadImageFromFile'), # 第 1 个流程,从文件路径里加载图像。 + dict( + type='LoadAnnotations', # 第 2 个流程,对于当前图像,加载它的注释信息。 + with_bbox=True, # 是否使用标注框(bounding box), 目标检测需要设置为 True。 + with_mask=True, # 是否使用 instance mask,实例分割需要设置为 True。 + poly2mask=False), # 是否将 polygon mask 转化为 instance mask, 设置为 False 以加速和节省内存。 + dict( + type='Resize', # 变化图像和其注释大小的数据增广的流程。 + img_scale=(1333, 800), # 图像的最大规模。 + keep_ratio=True + ), # 是否保持图像的长宽比。 + dict( + type='RandomFlip', # 翻转图像和其注释大小的数据增广的流程。 + flip_ratio=0.5), # 翻转图像的概率。 + dict( + type='Normalize', # 归一化当前图像的数据增广的流程。 + mean=[123.675, 116.28, 103.53], # 这些键与 img_norm_cfg 一致,因为 img_norm_cfg 被 + std=[58.395, 57.12, 57.375], # 用作参数。 + to_rgb=True), + dict( + type='Pad', # 填充当前图像到指定大小的数据增广的流程。 + size_divisor=32), # 填充图像可以被当前值整除。 + dict(type='DefaultFormatBundle'), # 流程里收集数据的默认格式捆。 + dict( + type='Collect', # 决定数据中哪些键应该传递给检测器的流程 + keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']) +] +test_pipeline = [ + dict(type='LoadImageFromFile'), # 第 1 个流程,从文件路径里加载图像。 + dict( + type='MultiScaleFlipAug', # 封装测试时数据增广(test time augmentations)。 + img_scale=(1333, 800), # 决定测试时可改变图像的最大规模。用于改变图像大小的流程。 + flip=False, # 测试时是否翻转图像。 + transforms=[ + dict(type='Resize', # 使用改变图像大小的数据增广。 + keep_ratio=True), # 是否保持宽和高的比例,这里的图像比例设置将覆盖上面的图像规模大小的设置。 + dict(type='RandomFlip'), # 考虑到 RandomFlip 已经被添加到流程里,当 flip=False 时它将不被使用。 + dict( + type='Normalize', # 归一化配置项,值来自 img_norm_cfg。 + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True), + dict( + type='Pad', # 将配置传递给可被 32 整除的图像。 + size_divisor=32), + dict( + type='ImageToTensor', # 将图像转为张量 + keys=['img']), + dict( + type='Collect', # 收集测试时必须的键的收集流程。 + keys=['img']) + ]) +] +data = dict( + samples_per_gpu=2, # 单个 GPU 的 Batch size + workers_per_gpu=2, # 单个 GPU 分配的数据加载线程数 + train=dict( # 训练数据集配置 + type='CocoDataset', # 数据集的类别, 更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/datasets/coco.py#L19。 + ann_file='data/coco/annotations/instances_train2017.json', # 注释文件路径 + img_prefix='data/coco/train2017/', # 图片路径前缀 + pipeline=[ # 流程, 这是由之前创建的 train_pipeline 传递的。 + dict(type='LoadImageFromFile'), + dict( + type='LoadAnnotations', + with_bbox=True, + with_mask=True, + poly2mask=False), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict( + type='Normalize', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict( + type='Collect', + keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']) + ]), + val=dict( # 验证数据集的配置 + type='CocoDataset', + ann_file='data/coco/annotations/instances_val2017.json', + img_prefix='data/coco/val2017/', + pipeline=[ # 由之前创建的 test_pipeline 传递的流程。 + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict( + type='Normalize', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) + ]), + test=dict( # 测试数据集配置,修改测试开发/测试(test-dev/test)提交的 ann_file + type='CocoDataset', + ann_file='data/coco/annotations/instances_val2017.json', + img_prefix='data/coco/val2017/', + pipeline=[ # 由之前创建的 test_pipeline 传递的流程。 + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict( + type='Normalize', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']) + ]) + ], + samples_per_gpu=2 # 单个 GPU 测试时的 Batch size + )) +evaluation = dict( # evaluation hook 的配置,更多细节请参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/evaluation/eval_hooks.py#L7。 + interval=1, # 验证的间隔。 + metric=['bbox', 'segm']) # 验证期间使用的指标。 +optimizer = dict( # 用于构建优化器的配置文件。支持 PyTorch 中的所有优化器,同时它们的参数与 PyTorch 里的优化器参数一致。 + type='SGD', # 优化器种类,更多细节可参考 https://github.com/open-mmlab/mmdetection/blob/master/mmdet/core/optimizer/default_constructor.py#L13。 + lr=0.02, # 优化器的学习率,参数的使用细节请参照对应的 PyTorch 文档。 + momentum=0.9, # 动量(Momentum) + weight_decay=0.0001) # SGD 的衰减权重(weight decay)。 +optimizer_config = dict( # optimizer hook 的配置文件,执行细节请参考 https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/optimizer.py#L8。 + grad_clip=None) # 大多数方法不使用梯度限制(grad_clip)。 +lr_config = dict( # 学习率调整配置,用于注册 LrUpdater hook。 + policy='step', # 调度流程(scheduler)的策略,也支持 CosineAnnealing, Cyclic, 等。请从 https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/lr_updater.py#L9 参考 LrUpdater 的细节。 + warmup='linear', # 预热(warmup)策略,也支持 `exp` 和 `constant`。 + warmup_iters=500, # 预热的迭代次数 + warmup_ratio= + 0.001, # 用于热身的起始学习率的比率 + step=[8, 11]) # 衰减学习率的起止回合数 +runner = dict( + type='EpochBasedRunner', # 将使用的 runner 的类别 (例如 IterBasedRunner 或 EpochBasedRunner)。 + max_epochs=12) # runner 总回合数, 对于 IterBasedRunner 使用 `max_iters` +checkpoint_config = dict( # Checkpoint hook 的配置文件。执行时请参考 https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/checkpoint.py。 + interval=1) # 保存的间隔是 1。 +log_config = dict( # register logger hook 的配置文件。 + interval=50, # 打印日志的间隔 + hooks=[ # 训练期间执行的钩子 + dict(type='TextLoggerHook', by_epoch=False), + dict(type='TensorboardLoggerHook', by_epoch=False), + dict(type='MMDetWandbHook', by_epoch=False, # 还支持 Wandb 记录器,它需要安装 `wandb`。 + init_kwargs={'entity': "OpenMMLab", # 用于登录wandb的实体 + 'project': "MMDet", # WandB中的项目名称 + 'config': cfg_dict}), # 检查 https://docs.wandb.ai/ref/python/init 以获取更多初始化参数 + ]) # 用于记录训练过程的记录器(logger)。 + +dist_params = dict(backend='nccl') # 用于设置分布式训练的参数,端口也同样可被设置。 +log_level = 'INFO' # 日志的级别。 +load_from = None # 从一个给定路径里加载模型作为预训练模型,它并不会消耗训练时间。 +resume_from = None # 从给定路径里恢复检查点(checkpoints),训练模式将从检查点保存的轮次开始恢复训练。 +workflow = [('train', 1)] # runner 的工作流程,[('train', 1)] 表示只有一个工作流且工作流仅执行一次。根据 total_epochs 工作流训练 12个回合。 +work_dir = 'work_dir' # 用于保存当前实验的模型检查点和日志的目录。 +``` + +## 常问问题 (FAQ) + +### 忽略基础配置文件里的部分内容 + +有时,您也许会设置 `_delete_=True` 去忽略基础配置文件里的一些域内容。 您也许可以参照 [mmcv](https://mmcv.readthedocs.io/en/latest/understand_mmcv/config.html#inherit-from-base-config-with-ignored-fields) 来获得一些简单的指导。 + +在 MMDetection里,例如为了改变 Mask R-CNN 的主干网络的某些内容: + +```python +model = dict( + type='MaskRCNN', + pretrained='torchvision://resnet50', + backbone=dict( + type='ResNet', + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch'), + neck=dict(...), + rpn_head=dict(...), + roi_head=dict(...)) +``` + +基础配置的 `Mask R-CNN` 使用 `ResNet-50`,在需要将主干网络改成 `HRNet` 的时候,因为 `HRNet` 和 `ResNet` 中有不同的字段,需要使用 `_delete_=True` 将新的键去替换 `backbone` 域内所有老的键。 + +```python +_base_ = '../mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py' +model = dict( + pretrained='open-mmlab://msra/hrnetv2_w32', + backbone=dict( + _delete_=True, + type='HRNet', + extra=dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(32, 64)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(32, 64, 128)), + stage4=dict( + num_modules=3, + num_branches=4, + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(32, 64, 128, 256)))), + neck=dict(...)) +``` + +### 使用配置文件里的中间变量 + +配置文件里会使用一些中间变量,例如数据集里的 `train_pipeline`/`test_pipeline`。我们在定义新的 `train_pipeline`/`test_pipeline` 之后,需要将它们传递到 `data` 里。例如,我们想在训练或测试时,改变 Mask R-CNN 的多尺度策略 (multi scale strategy),`train_pipeline`/`test_pipeline` 是我们想要修改的中间变量。 + +```python +_base_ = './mask_rcnn_r50_fpn_1x_coco.py' +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True, with_mask=True), + dict( + type='Resize', + img_scale=[(1333, 640), (1333, 672), (1333, 704), (1333, 736), + (1333, 768), (1333, 800)], + multiscale_mode="value", + keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +data = dict( + train=dict(pipeline=train_pipeline), + val=dict(pipeline=test_pipeline), + test=dict(pipeline=test_pipeline)) +``` + +我们首先定义新的 `train_pipeline`/`test_pipeline` 然后传递到 `data` 里。 + +同样的,如果我们想从 `SyncBN` 切换到 `BN` 或者 `MMSyncBN`,我们需要修改配置文件里的每一个 `norm_cfg`。 + +```python +_base_ = './mask_rcnn_r50_fpn_1x_coco.py' +norm_cfg = dict(type='BN', requires_grad=True) +model = dict( + backbone=dict(norm_cfg=norm_cfg), + neck=dict(norm_cfg=norm_cfg), + ...) +``` diff --git a/docs/zh_cn/tutorials/customize_dataset.md b/docs/zh_cn/tutorials/customize_dataset.md new file mode 100644 index 0000000..8468e40 --- /dev/null +++ b/docs/zh_cn/tutorials/customize_dataset.md @@ -0,0 +1,456 @@ +# 教程 2: 自定义数据集 + +## 支持新的数据格式 + +为了支持新的数据格式,可以选择将数据转换成现成的格式(COCO 或者 PASCAL)或将其转换成中间格式。当然也可以选择以离线的形式(在训练之前使用脚本转换)或者在线的形式(实现一个新的 dataset 在训练中进行转换)来转换数据。 + +在 MMDetection 中,建议将数据转换成 COCO 格式并以离线的方式进行,因此在完成数据转换后只需修改配置文件中的标注数据的路径和类别即可。 + +### 将新的数据格式转换为现有的数据格式 + +最简单的方法就是将你的数据集转换成现有的数据格式(COCO 或者 PASCAL VOC) + +COCO 格式的 json 标注文件有如下必要的字段: + +```python +'images': [ + { + 'file_name': 'COCO_val2014_000000001268.jpg', + 'height': 427, + 'width': 640, + 'id': 1268 + }, + ... +], + +'annotations': [ + { + 'segmentation': [[192.81, + 247.09, + ... + 219.03, + 249.06]], # 如果有 mask 标签 + 'area': 1035.749, + 'iscrowd': 0, + 'image_id': 1268, + 'bbox': [192.81, 224.8, 74.73, 33.43], + 'category_id': 16, + 'id': 42986 + }, + ... +], + +'categories': [ + {'id': 0, 'name': 'car'}, + ] +``` + +在 json 文件中有三个必要的键: + +- `images`: 包含多个图片以及它们的信息的数组,例如 `file_name`、`height`、`width` 和 `id`。 +- `annotations`: 包含多个实例标注信息的数组。 +- `categories`: 包含多个类别名字和 ID 的数组。 + +在数据预处理之后,使用现有的数据格式来训练自定义的新数据集有如下两步(以 COCO 为例): + +1. 为自定义数据集修改配置文件。 +2. 检查自定义数据集的标注。 + +这里我们举一个例子来展示上面的两个步骤,这个例子使用包括 5 个类别的 COCO 格式的数据集来训练一个现有的 Cascade Mask R-CNN R50-FPN 检测器 + +#### 1. 为自定义数据集修改配置文件 + +配置文件的修改涉及两个方面: + +1. `data` 部分。需要在 `data.train`、`data.val` 和 `data.test` 中添加 `classes`。 +2. `model` 部分中的 `num_classes`。需要将默认值(COCO 数据集中为 80)修改为自定义数据集中的类别数。 + +`configs/my_custom_config.py` 内容如下: + +```python + +# 新的配置来自基础的配置以更好地说明需要修改的地方 +_base_ = './cascade_mask_rcnn_r50_fpn_1x_coco.py' + +# 1. 数据集设定 +dataset_type = 'CocoDataset' +classes = ('a', 'b', 'c', 'd', 'e') +data = dict( + samples_per_gpu=2, + workers_per_gpu=2, + train=dict( + type=dataset_type, + # 将类别名字添加至 `classes` 字段中 + classes=classes, + ann_file='path/to/your/train/annotation_data', + img_prefix='path/to/your/train/image_data'), + val=dict( + type=dataset_type, + # 将类别名字添加至 `classes` 字段中 + classes=classes, + ann_file='path/to/your/val/annotation_data', + img_prefix='path/to/your/val/image_data'), + test=dict( + type=dataset_type, + # 将类别名字添加至 `classes` 字段中 + classes=classes, + ann_file='path/to/your/test/annotation_data', + img_prefix='path/to/your/test/image_data')) + +# 2. 模型设置 + +# 将所有的 `num_classes` 默认值修改为5(原来为80) +model = dict( + roi_head=dict( + bbox_head=[ + dict( + type='Shared2FCBBoxHead', + # 将所有的 `num_classes` 默认值修改为 5(原来为 80) + num_classes=5), + dict( + type='Shared2FCBBoxHead', + # 将所有的 `num_classes` 默认值修改为 5(原来为 80) + num_classes=5), + dict( + type='Shared2FCBBoxHead', + # 将所有的 `num_classes` 默认值修改为 5(原来为 80) + num_classes=5)], + # 将所有的 `num_classes` 默认值修改为 5(原来为 80) + mask_head=dict(num_classes=5))) +``` + +#### 2. 检查自定义数据集的标注 + +假设你自己的数据集是 COCO 格式,那么需要保证数据的标注没有问题: + +1. 标注文件中 `categories` 的长度要与配置中的 `classes` 元组长度相匹配,它们都表示有几类。(如例子中有 5 个类别) +2. 配置文件中 `classes` 字段应与标注文件里 `categories` 下的 `name` 有相同的元素且顺序一致。MMDetection 会自动将 `categories` 中不连续的 `id` 映射成连续的索引,因此 `categories` 下的 `name`的字符串顺序会影响标签的索引。同时,配置文件中的 `classes` 的字符串顺序也会影响到预测框可视化时的标签。 +3. `annotations` 中的 `category_id` 必须是有效的值。比如所有 `category_id` 的值都应该属于 `categories` 中的 `id`。 + +下面是一个有效标注的例子: + +```python + +'annotations': [ + { + 'segmentation': [[192.81, + 247.09, + ... + 219.03, + 249.06]], #如果有 mask 标签。 + 'area': 1035.749, + 'iscrowd': 0, + 'image_id': 1268, + 'bbox': [192.81, 224.8, 74.73, 33.43], + 'category_id': 16, + 'id': 42986 + }, + ... +], + +# MMDetection 会自动将 `categories` 中不连续的 `id` 映射成连续的索引。 +'categories': [ + {'id': 1, 'name': 'a'}, {'id': 3, 'name': 'b'}, {'id': 4, 'name': 'c'}, {'id': 16, 'name': 'd'}, {'id': 17, 'name': 'e'}, + ] +``` + +我们使用这种方式来支持 CityScapes 数据集。脚本在[cityscapes.py](https://github.com/open-mmlab/mmdetection/blob/master/tools/dataset_converters/cityscapes.py) 并且我们提供了微调的[configs](https://github.com/open-mmlab/mmdetection/blob/master/configs/cityscapes). + +**注意** + +1. 对于实例分割数据集, **MMDetection 目前只支持评估 COCO 格式的 mask AP**. +2. 推荐训练之前进行离线转换,这样就可以继续使用 `CocoDataset` 且只需修改标注文件的路径以及训练的种类。 + +### 调整新的数据格式为中间格式 + +如果不想将标注格式转换为 COCO 或者 PASCAL 格式也是可行的。实际上,我们定义了一种简单的标注格式并且与所有现有的数据格式兼容,也能进行离线或者在线转换。 + +数据集的标注是包含多个字典(dict)的列表,每个字典(dict)都与一张图片对应。测试时需要用到 `filename`(相对路径)、`width` 和 `height` 三个字段;训练时则额外需要 `ann`。`ann` 也是至少包含了两个字段的字典:`bboxes` 和 `labels`,它们都是 numpy array。有些数据集可能会提供如:crowd/difficult/ignored bboxes 标注,那么我们使用 `bboxes_ignore` 以及 `labels_ignore` 来包含它们。 + +下面给出一个例子。 + +```python + +[ + { + 'filename': 'a.jpg', + 'width': 1280, + 'height': 720, + 'ann': { + 'bboxes': (n, 4), + 'labels': (n, ), + 'bboxes_ignore': (k, 4), + 'labels_ignore': (k, ) (可选字段) + } + }, + ... +] +``` + +有两种方法处理自定义数据。 + +- 在线转换(online conversion) + + 可以新写一个继承自 `CustomDataset` 的 Dataset 类,并重写 `load_annotations(self, ann_file)` 以及 `get_ann_info(self, idx)` 这两个方法,正如[CocoDataset](https://github.com/open-mmlab/mmdetection/blob/master/mmdet/datasets/coco.py)与[VOCDataset](https://github.com/open-mmlab/mmdetection/blob/master/mmdet/datasets/voc.py). + +- 离线转换(offline conversion) + + 可以将标注格式转换为上述的任意格式并将其保存为 pickle 或者 json 文件,例如[pascal_voc.py](https://github.com/open-mmlab/mmdetection/blob/master/tools/dataset_converters/pascal_voc.py)。 + 然后使用`CustomDataset`。 + +### 自定义数据集的例子: + +假设文本文件中表示的是一种全新的标注格式。边界框的标注信息保存在 `annotation.txt` 中,内容如下: + +``` +# +000001.jpg +1280 720 +2 +10 20 40 60 1 +20 40 50 60 2 +# +000002.jpg +1280 720 +3 +50 20 40 60 2 +20 40 30 45 2 +30 40 50 60 3 +``` + +我们可以在 `mmdet/datasets/my_dataset.py` 中创建一个新的 dataset 用以加载数据。 + +```python +import mmcv +import numpy as np + +from .builder import DATASETS +from .custom import CustomDataset + + +@DATASETS.register_module() +class MyDataset(CustomDataset): + + CLASSES = ('person', 'bicycle', 'car', 'motorcycle') + + def load_annotations(self, ann_file): + ann_list = mmcv.list_from_file(ann_file) + + data_infos = [] + for i, ann_line in enumerate(ann_list): + if ann_line != '#': + continue + + img_shape = ann_list[i + 2].split(' ') + width = int(img_shape[0]) + height = int(img_shape[1]) + bbox_number = int(ann_list[i + 3]) + + anns = ann_line.split(' ') + bboxes = [] + labels = [] + for anns in ann_list[i + 4:i + 4 + bbox_number]: + bboxes.append([float(ann) for ann in anns[:4]]) + labels.append(int(anns[4])) + + data_infos.append( + dict( + filename=ann_list[i + 1], + width=width, + height=height, + ann=dict( + bboxes=np.array(bboxes).astype(np.float32), + labels=np.array(labels).astype(np.int64)) + )) + + return data_infos + + def get_ann_info(self, idx): + return self.data_infos[idx]['ann'] + +``` + +配置文件中,可以使用 `MyDataset` 进行如下修改 + +```python +dataset_A_train = dict( + type='MyDataset', + ann_file = 'image_list.txt', + pipeline=train_pipeline +) +``` + +## 使用 dataset 包装器自定义数据集 + +MMDetection 也支持非常多的数据集包装器(wrapper)来混合数据集或在训练时修改数据集的分布。 +最近 MMDetection 支持如下三种数据集包装: + +- `RepeatDataset`:将整个数据集简单地重复。 +- `ClassBalancedDataset`:以类别均衡的方式重复数据集。 +- `ConcatDataset`:合并数据集。 + +### 重复数据集(Repeat dataset) + +使用 `RepeatDataset` 包装器来重复数据集。例如,假设原始数据集为 `Dataset_A`,重复它过后,其配置如下: + +```python +dataset_A_train = dict( + type='RepeatDataset', + times=N, + dataset=dict( # Dataset_A 的原始配置信息 + type='Dataset_A', + ... + pipeline=train_pipeline + ) + ) +``` + +### 类别均衡数据集(Class balanced dataset) + +使用 `ClassBalancedDataset` 作为包装器在类别的出现的频率上重复数据集。数据集需要实例化 `self.get_cat_ids(idx)` 函数以支持 `ClassBalancedDataset`。 +比如,以 `oversample_thr=1e-3` 来重复数据集 `Dataset_A`,其配置如下: + +```python +dataset_A_train = dict( + type='ClassBalancedDataset', + oversample_thr=1e-3, + dataset=dict( # Dataset_A 的原始配置信息 + type='Dataset_A', + ... + pipeline=train_pipeline + ) + ) +``` + +更多细节请参考[源码](../../mmdet/datasets/dataset_wrappers.py)。 + +### 合并数据集(Concatenate dataset) + +合并数据集有三种方法: + +1. 如果要合并的数据集类型一致但有多个的标注文件,那么可以使用如下配置将其合并。 + + ```python + dataset_A_train = dict( + type='Dataset_A', + ann_file = ['anno_file_1', 'anno_file_2'], + pipeline=train_pipeline + ) + ``` + + 如果合并的数据集适用于测试或者评估,那么这种方式支持每个数据集分开进行评估。如果想要将合并的数据集作为整体用于评估,那么可以像如下一样设置 `separate_eval=False`。 + + ```python + dataset_A_train = dict( + type='Dataset_A', + ann_file = ['anno_file_1', 'anno_file_2'], + separate_eval=False, + pipeline=train_pipeline + ) + ``` + +2. 如果想要合并的是不同数据集,那么可以使用如下配置。 + + ```python + dataset_A_val = dict() + dataset_B_val = dict() + + data = dict( + imgs_per_gpu=2, + workers_per_gpu=2, + train=dataset_A_train, + val=dict( + type='ConcatDataset', + datasets=[dataset_A_val, dataset_B_val], + separate_eval=False)) + ``` + + 只需设置 `separate_eval=False`,用户就可以将所有的数据集作为一个整体来评估。 + +**注意** + +1. 在做评估时,`separate_eval=False` 选项是假设数据集使用了 `self.data_infos`。因此COCO数据集不支持此项操作,因为COCO数据集在做评估时并不是所有都依赖 `self.data_infos`。组合不同类型的数据集并将其作为一个整体来评估,这种做法没有得到测试,也不建议这样做。 + +2. 因为不支持评估 `ClassBalancedDataset` 和 `RepeatDataset`,所以也不支持评估它们的组合。 + +一个更复杂的例子则是分别将 `Dataset_A` 和 `Dataset_B` 重复N和M次,然后进行如下合并。 + +```python +dataset_A_train = dict( + type='RepeatDataset', + times=N, + dataset=dict( + type='Dataset_A', + ... + pipeline=train_pipeline + ) +) +dataset_A_val = dict( + ... + pipeline=test_pipeline +) +dataset_A_test = dict( + ... + pipeline=test_pipeline +) +dataset_B_train = dict( + type='RepeatDataset', + times=M, + dataset=dict( + type='Dataset_B', + ... + pipeline=train_pipeline + ) +) +data = dict( + imgs_per_gpu=2, + workers_per_gpu=2, + train = [ + dataset_A_train, + dataset_B_train + ], + val = dataset_A_val, + test = dataset_A_test +) + +``` + +## 修改数据集的类别 + +根据现有数据集的类型,我们可以修改它们的类别名称来训练其标注的子集。 +例如,如果只想训练当前数据集中的三个类别,那么就可以修改数据集的类别元组。 +数据集就会自动屏蔽掉其他类别的真实框。 + +```python +classes = ('person', 'bicycle', 'car') +data = dict( + train=dict(classes=classes), + val=dict(classes=classes), + test=dict(classes=classes)) +``` + +MMDetection V2.0 也支持从文件中读取类别名称,这种方式在实际应用中很常见。 +假设存在文件 `classes.txt`,其包含了如下的类别名称。 + +``` +person +bicycle +car +``` + +用户可以将类别设置成文件路径,数据集就会自动将其加载并转换成一个列表。 + +```python +classes = 'path/to/classes.txt' +data = dict( + train=dict(classes=classes), + val=dict(classes=classes), + test=dict(classes=classes)) +``` + +**注意** + +- 在 MMDetection v2.5.0 之前,如果类别为集合时数据集将自动过滤掉不包含 GT 的图片,且没办法通过修改配置将其关闭。这是一种不可取的行为而且会引起混淆,因为当类别不是集合时数据集只有在 `filter_empty_gt=True` 以及 `test_mode=False` 的情况下才会过滤掉不包含 GT 的图片。在 MMDetection v2.5.0 之后,我们将图片的过滤以及类别的修改进行解耦,如,数据集只有在 `filter_empty_gt=True` 和 `test_mode=False` 的情况下才会过滤掉不包含 GT 的图片,无论类别是否为集合。设置类别只会影响用于训练的标注类别,用户可以自行决定是否过滤不包含 GT 的图片。 +- 因为中间格式只有框的标签并不包含类别的名字,所以使用 `CustomDataset` 时用户不能通过修改配置来过滤不含 GT 的图片。但是可以通过离线的方式来解决。 +- 当设置数据集中的 `classes` 时,记得修改 `num_classes`。从 v2.9.0 (PR#4508) 之后,我们实现了[NumClassCheckHook](https://github.com/open-mmlab/mmdetection/blob/master/mmdet/datasets/utils.py)来检查类别数是否一致。 +- 我们在未来将会重构设置数据集类别以及数据集过滤的特性,使其更加地方便用户使用。 diff --git a/docs/zh_cn/tutorials/customize_losses.md b/docs/zh_cn/tutorials/customize_losses.md new file mode 100644 index 0000000..f721e77 --- /dev/null +++ b/docs/zh_cn/tutorials/customize_losses.md @@ -0,0 +1,125 @@ +# 教程 6: 自定义损失函数 + +MMDetection 为用户提供了不同的损失函数。但是默认的配置可能无法适应不同的数据和模型,所以用户可能会希望修改某一个损失函数来适应新的情况。 + +本教程首先详细的解释计算损失的过程然后给出一些关于如何修改每一个步骤的指导。对损失的修改可以被分为微调和加权。 + +## 一个损失的计算过程 + +给定输入(包括预测和目标,以及权重),损失函数会把输入的张量映射到最后的损失标量。映射过程可以分为下面五个步骤: + +1. 设置采样方法为对正负样本进行采样。 + +2. 通过损失核函数获取**元素**或者**样本**损失。 + +3. 通过权重张量来给损失**逐元素**权重。 + +4. 把损失张量归纳为一个**标量**。 + +5. 用一个**张量**给当前损失一个权重。 + +## 设置采样方法(步骤 1) + +对于一些损失函数,需要采样策略来避免正负样本之间的不平衡。 + +例如,在RPN head中使用`CrossEntropyLoss`时,我们需要在`train_cfg`中设置`RandomSampler` + +```python +train_cfg=dict( + rpn=dict( + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False)) +``` + +对于其他一些具有正负样本平衡机制的损失,例如 Focal Loss、GHMC 和 QualityFocalLoss,不再需要进行采样。 + +## 微调损失 + +微调一个损失主要与步骤 2,4,5 有关,大部分的修改可以在配置文件中指定。这里我们用 [Focal Loss (FL)](https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/losses/focal_loss.py) 作为例子。 +下面的代码分别是构建 FL 的方法和它的配置文件,他们是一一对应的。 + +```python +@LOSSES.register_module() +class FocalLoss(nn.Module): + + def __init__(self, + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + reduction='mean', + loss_weight=1.0): +``` + +```python +loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0) +``` + +### 微调超参数(步骤2) + +`gamma` 和 `beta` 是 Focal Loss 中的两个超参数。如果我们想把 `gamma` 的值设为 1.5,把 `alpha` 的值设为 0.5,我们可以在配置文件中按照如下指定: + +```python +loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=1.5, + alpha=0.5, + loss_weight=1.0) +``` + +### 微调归纳方式(步骤4) + +Focal Loss 默认的归纳方式是 `mean`。如果我们想把归纳方式从 `mean` 改成 `sum`,我们可以在配置文件中按照如下指定: + +```python +loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0, + reduction='sum') +``` + +### 微调损失权重(步骤5) + +这里的损失权重是一个标量,他用来控制多任务学习中不同损失的重要程度,例如,分类损失和回归损失。如果我们想把分类损失的权重设为 0.5,我们可以在配置文件中如下指定: + +```python +loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=0.5) +``` + +## 加权损失(步骤3) + +加权损失就是我们逐元素修改损失权重。更具体来说,我们给损失张量乘以一个与他有相同形状的权重张量。所以,损失中不同的元素可以被赋予不同的比例,所以这里叫做逐元素。损失的权重在不同模型中变化很大,而且与上下文相关,但是总的来说主要有两种损失权重:分类损失的 `label_weights` 和边界框的 `bbox_weights`。你可以在相应的头中的 `get_target` 方法中找到他们。这里我们使用 [ATSSHead](https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/dense_heads/atss_head.py#L530) 作为一个例子。它继承了 [AnchorHead](https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/dense_heads/anchor_head.py),但是我们重写它的 +`get_targets` 方法来产生不同的 `label_weights` 和 `bbox_weights`。 + +``` +class ATSSHead(AnchorHead): + + ... + + def get_targets(self, + anchor_list, + valid_flag_list, + gt_bboxes_list, + img_metas, + gt_bboxes_ignore_list=None, + gt_labels_list=None, + label_channels=1, + unmap_outputs=True): +``` diff --git a/docs/zh_cn/tutorials/customize_models.md b/docs/zh_cn/tutorials/customize_models.md new file mode 100644 index 0000000..b29254a --- /dev/null +++ b/docs/zh_cn/tutorials/customize_models.md @@ -0,0 +1,359 @@ +# 教程 4: 自定义模型 + +我们简单地把模型的各个组件分为五类: + +- 主干网络 (backbone):通常是一个用来提取特征图 (feature map) 的全卷积网络 (FCN network),例如:ResNet, MobileNet。 +- Neck:主干网络和 Head 之间的连接部分,例如:FPN, PAFPN。 +- Head:用于具体任务的组件,例如:边界框预测和掩码预测。 +- 区域提取器 (roi extractor):从特征图中提取 RoI 特征,例如:RoI Align。 +- 损失 (loss):在 Head 组件中用于计算损失的部分,例如:FocalLoss, L1Loss, GHMLoss. + +## 开发新的组件 + +### 添加一个新的主干网络 + +这里,我们以 MobileNet 为例来展示如何开发新组件。 + +#### 1. 定义一个新的主干网络(以 MobileNet 为例) + +新建一个文件 `mmdet/models/backbones/mobilenet.py` + +```python +import torch.nn as nn + +from ..builder import BACKBONES + + +@BACKBONES.register_module() +class MobileNet(nn.Module): + + def __init__(self, arg1, arg2): + pass + + def forward(self, x): # should return a tuple + pass +``` + +#### 2. 导入该模块 + +你可以添加下述代码到 `mmdet/models/backbones/__init__.py` + +```python +from .mobilenet import MobileNet +``` + +或添加: + +```python +custom_imports = dict( + imports=['mmdet.models.backbones.mobilenet'], + allow_failed_imports=False) +``` + +到配置文件以避免原始代码被修改。 + +#### 3. 在你的配置文件中使用该主干网络 + +```python +model = dict( + ... + backbone=dict( + type='MobileNet', + arg1=xxx, + arg2=xxx), + ... +``` + +### 添加新的 Neck + +#### 1. 定义一个 Neck(以 PAFPN 为例) + +新建一个文件 `mmdet/models/necks/pafpn.py` + +```python +from ..builder import NECKS + +@NECKS.register_module() +class PAFPN(nn.Module): + + def __init__(self, + in_channels, + out_channels, + num_outs, + start_level=0, + end_level=-1, + add_extra_convs=False): + pass + + def forward(self, inputs): + # implementation is ignored + pass +``` + +#### 2. 导入该模块 + +你可以添加下述代码到 `mmdet/models/necks/__init__.py` + +```python +from .pafpn import PAFPN +``` + +或添加: + +```python +custom_imports = dict( + imports=['mmdet.models.necks.pafpn.py'], + allow_failed_imports=False) +``` + +到配置文件以避免原始代码被修改。 + +#### 3. 修改配置文件 + +```python +neck=dict( + type='PAFPN', + in_channels=[256, 512, 1024, 2048], + out_channels=256, + num_outs=5) +``` + +### 添加新的 Head + +我们以 [Double Head R-CNN](https://arxiv.org/abs/1904.06493) 为例来展示如何添加一个新的 Head。 + +首先,添加一个新的 bbox head 到 `mmdet/models/roi_heads/bbox_heads/double_bbox_head.py`。 +Double Head R-CNN 在目标检测上实现了一个新的 bbox head。为了实现 bbox head,我们需要使用如下的新模块中三个函数。 + +```python +from mmdet.models.builder import HEADS +from .bbox_head import BBoxHead + +@HEADS.register_module() +class DoubleConvFCBBoxHead(BBoxHead): + r"""Bbox head used in Double-Head R-CNN + + /-> cls + /-> shared convs -> + \-> reg + roi features + /-> cls + \-> shared fc -> + \-> reg + """ # noqa: W605 + + def __init__(self, + num_convs=0, + num_fcs=0, + conv_out_channels=1024, + fc_out_channels=1024, + conv_cfg=None, + norm_cfg=dict(type='BN'), + **kwargs): + kwargs.setdefault('with_avg_pool', True) + super(DoubleConvFCBBoxHead, self).__init__(**kwargs) + + + def forward(self, x_cls, x_reg): + +``` + +然后,如有必要,实现一个新的 bbox head。我们打算从 `StandardRoIHead` 来继承新的 `DoubleHeadRoIHead`。我们可以发现 `StandardRoIHead` 已经实现了下述函数。 + +```python +import torch + +from mmdet.core import bbox2result, bbox2roi, build_assigner, build_sampler +from ..builder import HEADS, build_head, build_roi_extractor +from .base_roi_head import BaseRoIHead +from .test_mixins import BBoxTestMixin, MaskTestMixin + + +@HEADS.register_module() +class StandardRoIHead(BaseRoIHead, BBoxTestMixin, MaskTestMixin): + """Simplest base roi head including one bbox head and one mask head. + """ + + def init_assigner_sampler(self): + + def init_bbox_head(self, bbox_roi_extractor, bbox_head): + + def init_mask_head(self, mask_roi_extractor, mask_head): + + + def forward_dummy(self, x, proposals): + + + def forward_train(self, + x, + img_metas, + proposal_list, + gt_bboxes, + gt_labels, + gt_bboxes_ignore=None, + gt_masks=None): + + def _bbox_forward(self, x, rois): + + def _bbox_forward_train(self, x, sampling_results, gt_bboxes, gt_labels, + img_metas): + + def _mask_forward_train(self, x, sampling_results, bbox_feats, gt_masks, + img_metas): + + def _mask_forward(self, x, rois=None, pos_inds=None, bbox_feats=None): + + + def simple_test(self, + x, + proposal_list, + img_metas, + proposals=None, + rescale=False): + """Test without augmentation.""" + +``` + +Double Head 的修改主要在 bbox_forward 的逻辑中,且它从 `StandardRoIHead` 中继承了其他逻辑。在 `mmdet/models/roi_heads/double_roi_head.py` 中,我们用下述代码实现新的 bbox head: + +```python +from ..builder import HEADS +from .standard_roi_head import StandardRoIHead + + +@HEADS.register_module() +class DoubleHeadRoIHead(StandardRoIHead): + """RoI head for Double Head RCNN + + https://arxiv.org/abs/1904.06493 + """ + + def __init__(self, reg_roi_scale_factor, **kwargs): + super(DoubleHeadRoIHead, self).__init__(**kwargs) + self.reg_roi_scale_factor = reg_roi_scale_factor + + def _bbox_forward(self, x, rois): + bbox_cls_feats = self.bbox_roi_extractor( + x[:self.bbox_roi_extractor.num_inputs], rois) + bbox_reg_feats = self.bbox_roi_extractor( + x[:self.bbox_roi_extractor.num_inputs], + rois, + roi_scale_factor=self.reg_roi_scale_factor) + if self.with_shared_head: + bbox_cls_feats = self.shared_head(bbox_cls_feats) + bbox_reg_feats = self.shared_head(bbox_reg_feats) + cls_score, bbox_pred = self.bbox_head(bbox_cls_feats, bbox_reg_feats) + + bbox_results = dict( + cls_score=cls_score, + bbox_pred=bbox_pred, + bbox_feats=bbox_cls_feats) + return bbox_results +``` + +最终,用户需要把该模块添加到 `mmdet/models/bbox_heads/__init__.py` 和 `mmdet/models/roi_heads/__init__.py` 以使相关的注册表可以找到并加载他们。 + +或者,用户可以添加: + +```python +custom_imports=dict( + imports=['mmdet.models.roi_heads.double_roi_head', 'mmdet.models.bbox_heads.double_bbox_head']) +``` + +到配置文件并实现相同的目的。 + +Double Head R-CNN 的配置文件如下: + +```python +_base_ = '../faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' +model = dict( + roi_head=dict( + type='DoubleHeadRoIHead', + reg_roi_scale_factor=1.3, + bbox_head=dict( + _delete_=True, + type='DoubleConvFCBBoxHead', + num_convs=4, + num_fcs=2, + in_channels=256, + conv_out_channels=1024, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=2.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=2.0)))) + +``` + +从 MMDetection 2.0 版本起,配置系统支持继承配置以使用户可以专注于修改。 +Double Head R-CNN 主要使用了一个新的 DoubleHeadRoIHead 和一个新的 `DoubleConvFCBBoxHead`,参数需要根据每个模块的 `__init__` 函数来设置。 + +### 添加新的损失 + +假设你想添加一个新的损失 `MyLoss` 用于边界框回归。 +为了添加一个新的损失函数,用户需要在 `mmdet/models/losses/my_loss.py` 中实现。 +装饰器 `weighted_loss` 可以使损失每个部分加权。 + +```python +import torch +import torch.nn as nn + +from ..builder import LOSSES +from .utils import weighted_loss + +@weighted_loss +def my_loss(pred, target): + assert pred.size() == target.size() and target.numel() > 0 + loss = torch.abs(pred - target) + return loss + +@LOSSES.register_module() +class MyLoss(nn.Module): + + def __init__(self, reduction='mean', loss_weight=1.0): + super(MyLoss, self).__init__() + self.reduction = reduction + self.loss_weight = loss_weight + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None): + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + loss_bbox = self.loss_weight * my_loss( + pred, target, weight, reduction=reduction, avg_factor=avg_factor) + return loss_bbox +``` + +然后,用户需要把它加到 `mmdet/models/losses/__init__.py`。 + +```python +from .my_loss import MyLoss, my_loss + +``` + +或者,你可以添加: + +```python +custom_imports=dict( + imports=['mmdet.models.losses.my_loss']) +``` + +到配置文件来实现相同的目的。 + +如使用,请修改 `loss_xxx` 字段。 +因为 MyLoss 是用于回归的,你需要在 Head 中修改 `loss_xxx` 字段。 + +```python +loss_bbox=dict(type='MyLoss', loss_weight=1.0)) +``` diff --git a/docs/zh_cn/tutorials/customize_runtime.md b/docs/zh_cn/tutorials/customize_runtime.md new file mode 100644 index 0000000..8d998c3 --- /dev/null +++ b/docs/zh_cn/tutorials/customize_runtime.md @@ -0,0 +1 @@ +# 教程 5: 自定义训练配置 diff --git a/docs/zh_cn/tutorials/data_pipeline.md b/docs/zh_cn/tutorials/data_pipeline.md new file mode 100644 index 0000000..2fd7f8f --- /dev/null +++ b/docs/zh_cn/tutorials/data_pipeline.md @@ -0,0 +1,190 @@ +# 教程 3: 自定义数据预处理流程 + +## 数据流程的设计 + +按照惯例,我们使用 `Dataset` 和 `DataLoader` 进行多进程的数据加载。`Dataset` 返回字典类型的数据,数据内容为模型 `forward` 方法的各个参数。由于在目标检测中,输入的图像数据具有不同的大小,我们在 `MMCV` 里引入一个新的 `DataContainer` 类去收集和分发不同大小的输入数据。更多细节请参考[这里](https://github.com/open-mmlab/mmcv/blob/master/mmcv/parallel/data_container.py)。 + +数据的准备流程和数据集是解耦的。通常一个数据集定义了如何处理标注数据(annotations)信息,而一个数据流程定义了准备一个数据字典的所有步骤。一个流程包括一系列的操作,每个操作都把一个字典作为输入,然后再输出一个新的字典给下一个变换操作。 + +我们在下图展示了一个经典的数据处理流程。蓝色块是数据处理操作,随着数据流程的处理,每个操作都可以在结果字典中加入新的键(标记为绿色)或更新现有的键(标记为橙色)。 + +![pipeline figure](../../../resources/data_pipeline.png) + +这些操作可以分为数据加载(data loading)、预处理(pre-processing)、格式变化(formatting)和测试时数据增强(test-time augmentation)。 + +下面的例子是 `Faster R-CNN` 的一个流程: + +```python +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) +train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), +] +test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) +] +``` + +对于每个操作,我们列出它添加、更新、移除的相关字典域 (dict fields): + +### 数据加载 Data loading + +`LoadImageFromFile` + +- 增加:img, img_shape, ori_shape + +`LoadAnnotations` + +- 增加:gt_bboxes, gt_bboxes_ignore, gt_labels, gt_masks, gt_semantic_seg, bbox_fields, mask_fields + +`LoadProposals` + +- 增加:proposals + +### 预处理 Pre-processing + +`Resize` + +- 增加:scale, scale_idx, pad_shape, scale_factor, keep_ratio +- 更新:img, img_shape, \*bbox_fields, \*mask_fields, \*seg_fields + +`RandomFlip` + +- 增加:flip +- 更新:img, \*bbox_fields, \*mask_fields, \*seg_fields + +`Pad` + +- 增加:pad_fixed_size, pad_size_divisor +- 更新:img, pad_shape, \*mask_fields, \*seg_fields + +`RandomCrop` + +- 更新:img, pad_shape, gt_bboxes, gt_labels, gt_masks, \*bbox_fields + +`Normalize` + +- 增加:img_norm_cfg +- 更新:img + +`SegRescale` + +- 更新:gt_semantic_seg + +`PhotoMetricDistortion` + +- 更新:img + +`Expand` + +- 更新:img, gt_bboxes + +`MinIoURandomCrop` + +- 更新:img, gt_bboxes, gt_labels + +`Corrupt` + +- 更新:img + +### 格式 Formatting + +`ToTensor` + +- 更新:由 `keys` 指定 + +`ImageToTensor` + +- 更新:由 `keys` 指定 + +`Transpose` + +- 更新:由 `keys` 指定 + +`ToDataContainer` + +- 更新:由 `keys` 指定 + +`DefaultFormatBundle` + +- 更新:img, proposals, gt_bboxes, gt_bboxes_ignore, gt_labels, gt_masks, gt_semantic_seg + +`Collect` + +- 增加:img_metas(img_metas 的键(key)被 `meta_keys` 指定) +- 移除:除了 `keys` 指定的键(key)之外的所有其他的键(key) + +### 测试时数据增强 Test time augmentation + +`MultiScaleFlipAug` + +## 拓展和使用自定义的流程 + +1. 在任意文件里写一个新的流程,例如在 `my_pipeline.py`,它以一个字典作为输入并且输出一个字典: + + ```python + import random + from mmdet.datasets import PIPELINES + + + @PIPELINES.register_module() + class MyTransform: + """Add your transform + + Args: + p (float): Probability of shifts. Default 0.5. + """ + + def __init__(self, p=0.5): + self.p = p + + def __call__(self, results): + if random.random() > self.p: + results['dummy'] = True + return results + ``` + +2. 在配置文件里调用并使用你写的数据处理流程,需要确保你的训练脚本能够正确导入新增模块: + + ```python + custom_imports = dict(imports=['path.to.my_pipeline'], allow_failed_imports=False) + + img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + train_pipeline = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='MyTransform', p=0.2), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']), + ] + ``` + +3. 可视化数据增强处理流程的结果 + + 如果想要可视化数据增强处理流程的结果,可以使用 `tools/misc/browse_dataset.py` 直观 + 地浏览检测数据集(图像和标注信息),或将图像保存到指定目录。 + 使用方法请参考[日志分析](../useful_tools.md) diff --git a/docs/zh_cn/tutorials/finetune.md b/docs/zh_cn/tutorials/finetune.md new file mode 100644 index 0000000..349660e --- /dev/null +++ b/docs/zh_cn/tutorials/finetune.md @@ -0,0 +1,87 @@ +# 教程 7: 模型微调 + +在 COCO 数据集上预训练的检测器可以作为其他数据集(例如 CityScapes 和 KITTI 数据集)优质的预训练模型。 +本教程将指导用户如何把 [ModelZoo](../model_zoo.md) 中提供的模型用于其他数据集中并使得当前所训练的模型获得更好性能。 + +以下是在新数据集中微调模型需要的两个步骤。 + +- 按 [教程2:自定义数据集的方法](customize_dataset.md) 中的方法对新数据集添加支持中的方法对新数据集添加支持 +- 按照本教程中所讨论方法,修改配置信息 + +接下来将会以 Cityscapes Dataset 上的微调过程作为例子,具体讲述用户需要在配置中修改的五个部分。 + +## 继承基础配置 + +为了减轻编写整个配置的负担并减少漏洞的数量, MMDetection V2.0 支持从多个现有配置中继承配置信息。微调 MaskRCNN 模型的时候,新的配置信息需要使用从 `_base_/models/mask_rcnn_r50_fpn.py`中继承的配置信息来构建模型的基本结构。当使用 Cityscapes 数据集时,新的配置信息可以简便地从`_base_/datasets/cityscapes_instance.py`中继承。对于训练过程的运行设置部分,新配置需要从 `_base_/default_runtime.py`中继承。这些配置文件`configs`的目录下,用户可以选择全部内容的重新编写而不是使用继承方法。 + +```python +_base_ = [ + '../_base_/models/mask_rcnn_r50_fpn.py', + '../_base_/datasets/cityscapes_instance.py', '../_base_/default_runtime.py' +] +``` + +## Head 的修改 + +接下来新的配置还需要根据新数据集的类别数量对 Head 进行修改。只需要对 roi_head 中的 `num_classes`进行修改。修改后除了最后的预测模型的 Head 之外,预训练模型的权重的大部分都会被重新使用。 + +```python +model = dict( + pretrained=None, + roi_head=dict( + bbox_head=dict( + type='Shared2FCBBoxHead', + in_channels=256, + fc_out_channels=1024, + roi_feat_size=7, + num_classes=8, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.0)), + mask_head=dict( + type='FCNMaskHead', + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=8, + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0)))) +``` + +## 数据集的修改 + +用户可能还需要准备数据集并编写有关数据集的配置。目前 MMDetection V2.0 的配置文件已经支持 VOC、WIDER FACE、COCO 和 Cityscapes Dataset 的数据集信息。 + +## 训练策略的修改 + +微调超参数与默认的训练策略不同。它通常需要更小的学习率和更少的训练回合。 + +```python +# 优化器 +# batch size 为 8 时的 lr 配置 +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +optimizer_config = dict(grad_clip=None) +# 学习策略 +lr_config = dict( + policy='step', + warmup='linear', + warmup_iters=500, + warmup_ratio=0.001, + step=[7]) +# lr_config 中的 max_epochs 和 step 需要针对自定义数据集进行专门调整 +runner = dict(max_epochs=8) +log_config = dict(interval=100) +``` + +## 使用预训练模型 + +如果要使用预训练模型时,可以在 `load_from` 中查阅新的配置信息,用户需要在训练开始之前下载好需要的模型权重,从而避免在训练过程中浪费了宝贵时间。 + +```python +load_from = 'https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth' # noqa +``` diff --git a/docs/zh_cn/tutorials/how_to.md b/docs/zh_cn/tutorials/how_to.md new file mode 100644 index 0000000..3587d32 --- /dev/null +++ b/docs/zh_cn/tutorials/how_to.md @@ -0,0 +1,203 @@ +# 教程 11: How to xxx + +本教程收集了任何如何使用 MMDetection 进行 xxx 的答案。 如果您遇到有关`如何做`的问题及答案,请随时更新此文档! + +## 使用 MMClassification 的骨干网络 + +MMDet、MMCls、MMSeg 中的模型注册表都继承自 MMCV 中的根注册表,允许这些存储库直接使用彼此已经实现的模块。 因此用户可以在 MMDetection 中使用来自 MMClassification 的骨干网络,而无需实现MMClassification 中已经存在的网络。 + +### 使用在 MMClassification 中实现的骨干网络 + +假设想将 `MobileNetV3-small` 作为 `RetinaNet` 的骨干网络,则配置文件如下。 + +```python +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +# please install mmcls>=0.20.0 +# import mmcls.models to trigger register_module in mmcls +custom_imports = dict(imports=['mmcls.models'], allow_failed_imports=False) +pretrained = 'https://download.openmmlab.com/mmclassification/v0/mobilenet_v3/convert/mobilenet_v3_small-8427ecf0.pth' +model = dict( + backbone=dict( + _delete_=True, # 将 _base_ 中关于 backbone 的字段删除 + type='mmcls.MobileNetV3', # 使用 mmcls 中的 MobileNetV3 + arch='small', + out_indices=(3, 8, 11), # 修改 out_indices + init_cfg=dict( + type='Pretrained', + checkpoint=pretrained, + prefix='backbone.')), # MMCls 中骨干网络的预训练权重含义 prefix='backbone.',为了正常加载权重,需要把这个 prefix 去掉。 + # 修改 in_channels + neck=dict(in_channels=[24, 48, 96], start_level=0)) +``` + +### 通过 MMClassification 使用 TIMM 中实现的骨干网络 + +由于 MMClassification 提供了 Py**T**orch **Im**age **M**odels (`timm`) 骨干网络的封装,用户也可以通过 MMClassification 直接使用 `timm` 中的骨干网络。假设想将 [`EfficientNet-B1`](https://github.com/open-mmlab/mmdetection/blob/master/configs/timm_example/retinanet_timm_efficientnet_b1_fpn_1x_coco.py) 作为 `RetinaNet` 的骨干网络,则配置文件如下。 + +```python +# https://github.com/open-mmlab/mmdetection/blob/master/configs/timm_example/retinanet_timm_efficientnet_b1_fpn_1x_coco.py +_base_ = [ + '../_base_/models/retinanet_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] + +# please install mmcls>=0.20.0 +# import mmcls.models to trigger register_module in mmcls +custom_imports = dict(imports=['mmcls.models'], allow_failed_imports=False) +model = dict( + backbone=dict( + _delete_=True, # 将 _base_ 中关于 backbone 的字段删除 + type='mmcls.TIMMBackbone', # 使用 mmcls 中 timm 骨干网络 + model_name='efficientnet_b1', + features_only=True, + pretrained=True, + out_indices=(1, 2, 3, 4)), # 修改 out_indices + neck=dict(in_channels=[24, 40, 112, 320])) # 修改 in_channels + +optimizer = dict(type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) +``` + +`type='mmcls.TIMMBackbone'` 表示在 MMDetection 中使用 MMClassification 中的 `TIMMBackbone` 类,并且使用的模型为` EfficientNet-B1`,其中 `mmcls` 表示 MMClassification 库,而 `TIMMBackbone ` 表示 MMClassification 中实现的 TIMMBackbone 包装器。 + +关于层次注册器的具体原理可以参考 [MMCV 文档](https://github.com/open-mmlab/mmcv/blob/master/docs/zh_cn/understand_mmcv/registry.md#%E6%B3%A8%E5%86%8C%E5%99%A8%E5%B1%82%E7%BB%93%E6%9E%84),关于如何使用 MMClassification 中的其他 backbone,可以参考 [MMClassification 文档](https://github.com/open-mmlab/mmclassification/blob/master/docs/zh_CN/tutorials/config.md)。 + +## 使用马赛克数据增强 + +如果你想在训练中使用 `Mosaic`,那么请确保你同时使用 `MultiImageMixDataset`。以 `Faster R-CNN` 算法为例,你可以通过如下做法实现: + +```python +# 直接打开 configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py ,增添如下字段 +data_root = 'data/coco/' +dataset_type = 'CocoDataset' +img_scale=(1333, 800)​ +img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) + +train_pipeline = [ + dict(type='Mosaic', img_scale=img_scale, pad_val=114.0), + dict( + type='RandomAffine', + scaling_ratio_range=(0.1, 2), + border=(-img_scale[0] // 2, -img_scale[1] // 2)), # 图像经过马赛克处理后会放大4倍,所以我们使用仿射变换来恢复图像的大小。 + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) +] + +train_dataset = dict( + _delete_ = True, # 删除不必要的设置 + type='MultiImageMixDataset', + dataset=dict( + type=dataset_type, + ann_file=data_root + 'annotations/instances_train2017.json', + img_prefix=data_root + 'train2017/', + pipeline=[ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True) + ], + filter_empty_gt=False, + ), + pipeline=train_pipeline + ) +​ +data = dict( + train=train_dataset + ) +``` + +## 在配置文件中冻结骨干网络后在训练中解冻骨干网络 + +如果你在配置文件中已经冻结了骨干网络并希望在几个训练周期后解冻它,你可以通过 hook 来实现这个功能。以用 ResNet 为骨干网络的 Faster R-CNN 为例,你可以冻结一个骨干网络的一个层并在配置文件中添加如下 `custom_hooks`: + +```python +_base_ = [ + '../_base_/models/faster_rcnn_r50_fpn.py', + '../_base_/datasets/coco_detection.py', + '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' +] +model = dict( + # freeze one stage of the backbone network. + backbone=dict(frozen_stages=1), +) +custom_hooks = [dict(type="UnfreezeBackboneEpochBasedHook", unfreeze_epoch=1)] +``` + +同时在 `mmdet/core/hook/unfreeze_backbone_epoch_based_hook.py` 当中书写 `UnfreezeBackboneEpochBasedHook` 类 + +```python +from mmcv.parallel import is_module_wrapper +from mmcv.runner.hooks import HOOKS, Hook + + +@HOOKS.register_module() +class UnfreezeBackboneEpochBasedHook(Hook): + """Unfreeze backbone network Hook. + + Args: + unfreeze_epoch (int): The epoch unfreezing the backbone network. + """ + + def __init__(self, unfreeze_epoch=1): + self.unfreeze_epoch = unfreeze_epoch + + def before_train_epoch(self, runner): + # Unfreeze the backbone network. + # Only valid for resnet. + if runner.epoch == self.unfreeze_epoch: + model = runner.model + if is_module_wrapper(model): + model = model.module + backbone = model.backbone + if backbone.frozen_stages >= 0: + if backbone.deep_stem: + backbone.stem.train() + for param in backbone.stem.parameters(): + param.requires_grad = True + else: + backbone.norm1.train() + for m in [backbone.conv1, backbone.norm1]: + for param in m.parameters(): + param.requires_grad = True + + for i in range(1, backbone.frozen_stages + 1): + m = getattr(backbone, f'layer{i}') + m.train() + for param in m.parameters(): + param.requires_grad = True +``` + +## 获得新的骨干网络的通道数 + +如果你想获得一个新骨干网络的通道数,你可以单独构建这个骨干网络并输入一个伪造的图片来获取每一个阶段的输出。 + +以 `ResNet` 为例: + +```python +from mmdet.models import ResNet +import torch +self = ResNet(depth=18) +self.eval() +inputs = torch.rand(1, 3, 32, 32) +level_outputs = self.forward(inputs) +for level_out in level_outputs: + print(tuple(level_out.shape)) + +``` + +以上脚本的输出为: + +```python +(1, 64, 8, 8) +(1, 128, 4, 4) +(1, 256, 2, 2) +(1, 512, 1, 1) +``` + +用户可以通过将脚本中的 `ResNet(depth=18)` 替换为自己的骨干网络配置来得到新的骨干网络的通道数。 diff --git a/docs/zh_cn/tutorials/index.rst b/docs/zh_cn/tutorials/index.rst new file mode 100644 index 0000000..eaf4907 --- /dev/null +++ b/docs/zh_cn/tutorials/index.rst @@ -0,0 +1,14 @@ +.. toctree:: + :maxdepth: 2 + + config.md + customize_dataset.md + data_pipeline.md + customize_models.md + customize_runtime.md + customize_losses.md + finetune.md + pytorch2onnx.md + onnx2tensorrt.md + init_cfg.md + how_to.md diff --git a/docs/zh_cn/tutorials/init_cfg.md b/docs/zh_cn/tutorials/init_cfg.md new file mode 100644 index 0000000..f6f5968 --- /dev/null +++ b/docs/zh_cn/tutorials/init_cfg.md @@ -0,0 +1,161 @@ +# 教程 10: 权重初始化 + +在训练过程中,适当的初始化策略有利于加快训练速度或获得更⾼的性能。 [MMCV](https://github.com/open-mmlab/mmcv/blob/master/mmcv/cnn/utils/weight_init.py) 提供了一些常⽤的初始化模块的⽅法,如 `nn.Conv2d`。 MMdetection 中的模型初始化主要使⽤ `init_cfg`。⽤⼾可以通过以下两个步骤来初始化模型: + +1. 在 `model_cfg` 中为模型或其组件定义 `init_cfg`,但⼦组件的 `init_cfg` 优先级更⾼,会覆盖⽗模块的 `init_cfg` 。 +2. 像往常一样构建模型,然后显式调⽤ `model.init_weights()` ⽅法,此时模型参数将会被按照配置文件写法进行初始化。 + +MMdetection 初始化工作流的高层 API 调用流程是: + +model_cfg(init_cfg) -> build_from_cfg -> model -> init_weight() -> initialize(self, self.init_cfg) -> children's init_weight() + +### 描述 + +它的数据类型是 dict 或者 list\[dict\],包含了下列键值: + +- `type` (str),包含 `INTIALIZERS` 中的初始化器名称,后面跟着初始化器的参数。 +- `layer`(str 或 list\[str\]),包含 Pytorch 或 MMCV 中基本层的名称,以及将被初始化的可学习参数,例如 `'Conv2d'`,`'DeformConv2d'`。 +- `override` (dict 或 list\[dict\]),包含不继承⾃ `BaseModule` 且其初始化配置与 `layer` 键中的其他层不同的⼦模块。 `type` 中定义的初始化器将适⽤于 `layer` 中定义的所有层,因此如果⼦模块不是 `BaseModule` 的派⽣类但可以与 `layer` 中的层相同的⽅式初始化,则不需要使⽤ `override`。`override` 包含了: + - `type` 后跟初始化器的参数; + - `name` 用以指⽰将被初始化的⼦模块。 + +### 初始化参数 + +从 `mmcv.runner.BaseModule` 或 `mmdet.models` 继承一个新模型。这里我们用 FooModel 来举个例子。 + +```python +import torch.nn as nn +from mmcv.runner import BaseModule + +class FooModel(BaseModule) + def __init__(self, + arg1, + arg2, + init_cfg=None): + super(FooModel, self).__init__(init_cfg) + ... +``` + +- 直接在代码中使⽤ `init_cfg` 初始化模型 + + ```python + import torch.nn as nn + from mmcv.runner import BaseModule + # or directly inherit mmdet models + + class FooModel(BaseModule) + def __init__(self, + arg1, + arg2, + init_cfg=XXX): + super(FooModel, self).__init__(init_cfg) + ... + ``` + +- 在 `mmcv.Sequential` 或 `mmcv.ModuleList` 代码中直接使⽤ `init_cfg` 初始化模型 + + ```python + from mmcv.runner import BaseModule, ModuleList + + class FooModel(BaseModule) + def __init__(self, + arg1, + arg2, + init_cfg=None): + super(FooModel, self).__init__(init_cfg) + ... + self.conv1 = ModuleList(init_cfg=XXX) + ``` + +- 使⽤配置⽂件中的 `init_cfg` 初始化模型 + + ```python + model = dict( + ... + model = dict( + type='FooModel', + arg1=XXX, + arg2=XXX, + init_cfg=XXX), + ... + ``` + +### init_cfg 的使用 + +1. 用 `layer` 键初始化模型 + + 如果我们只定义了 `layer`, 它只会在 `layer` 键中初始化网络层。 + + 注意: `layer` 键对应的值是 Pytorch 的带有 weights 和 bias 属性的类名(因此不⽀持 `MultiheadAttention` 层)。 + +- 定义⽤于初始化具有相同配置的模块的 `layer` 键。 + + ```python + init_cfg = dict(type='Constant', layer=['Conv1d', 'Conv2d', 'Linear'], val=1) + # ⽤相同的配置初始化整个模块 + ``` + +- 定义⽤于初始化具有不同配置的层的 `layer` 键。 + + ```python + init_cfg = [dict(type='Constant', layer='Conv1d', val=1), + dict(type='Constant', layer='Conv2d', val=2), + dict(type='Constant', layer='Linear', val=3)] + # nn.Conv1d 将被初始化为 dict(type='Constant', val=1) + # nn.Conv2d 将被初始化为 dict(type='Constant', val=2) + # nn.Linear 将被初始化为 dict(type='Constant', val=3) + ``` + +2. 使⽤ `override` 键初始化模型 + +- 当使⽤属性名初始化某些特定部分时,我们可以使⽤ `override` 键, `override` 中的值将忽略 init_cfg 中的值。 + + ```python + # layers: + # self.feat = nn.Conv1d(3, 1, 3) + # self.reg = nn.Conv2d(3, 3, 3) + # self.cls = nn.Linear(1,2) + + init_cfg = dict(type='Constant', + layer=['Conv1d','Conv2d'], val=1, bias=2, + override=dict(type='Constant', name='reg', val=3, bias=4)) + # self.feat and self.cls 将被初始化为 dict(type='Constant', val=1, bias=2) + # 叫 'reg' 的模块将被初始化为 dict(type='Constant', val=3, bias=4) + ``` + +- 如果 init_cfg 中的 `layer` 为 None,则只会初始化 override 中有 name 的⼦模块,⽽ override 中的 type 和其他参数可以省略。 + + ```python + # layers: + # self.feat = nn.Conv1d(3, 1, 3) + # self.reg = nn.Conv2d(3, 3, 3) + # self.cls = nn.Linear(1,2) + + init_cfg = dict(type='Constant', val=1, bias=2, override=dict(name='reg')) + + # self.feat and self.cls 将被 Pytorch 初始化 + # 叫 'reg' 的模块将被 dict(type='Constant', val=1, bias=2) 初始化 + ``` + +- 如果我们不定义 `layer` 或 `override` 键,它不会初始化任何东西。 + +- 无效的使用 + + ```python + # override 没有 name 键的话是无效的 + init_cfg = dict(type='Constant', layer=['Conv1d','Conv2d'], val=1, bias=2, + override=dict(type='Constant', val=3, bias=4)) + + # override 有 name 键和其他参数但是没有 type 键也是无效的 + init_cfg = dict(type='Constant', layer=['Conv1d','Conv2d'], val=1, bias=2, + override=dict(name='reg', val=3, bias=4)) + ``` + +3. 使⽤预训练模型初始化模型 + + ```python + init_cfg = dict(type='Pretrained', + checkpoint='torchvision://resnet50') + ``` + +更多细节可以参考 [MMCV](https://mmcv.readthedocs.io/en/latest/cnn.html#weight-initialization) 的文档和 MMCV [PR #780](https://github.com/open-mmlab/mmcv/pull/780) diff --git a/docs/zh_cn/tutorials/onnx2tensorrt.md b/docs/zh_cn/tutorials/onnx2tensorrt.md new file mode 100644 index 0000000..678a131 --- /dev/null +++ b/docs/zh_cn/tutorials/onnx2tensorrt.md @@ -0,0 +1,106 @@ +# 教程 9: ONNX 到 TensorRT 的模型转换(实验性支持) + +> ## [尝试使用新的 MMDeploy 来部署你的模型](https://mmdeploy.readthedocs.io/) + + + +- [教程 9: ONNX 到 TensorRT 的模型转换(实验性支持)](#%E6%95%99%E7%A8%8B-9-onnx-%E5%88%B0-tensorrt-%E7%9A%84%E6%A8%A1%E5%9E%8B%E8%BD%AC%E6%8D%A2%E5%AE%9E%E9%AA%8C%E6%80%A7%E6%94%AF%E6%8C%81) + - [如何将模型从 ONNX 转换为 TensorRT](#%E5%A6%82%E4%BD%95%E5%B0%86%E6%A8%A1%E5%9E%8B%E4%BB%8E-onnx-%E8%BD%AC%E6%8D%A2%E4%B8%BA-tensorrt) + - [先决条件](#%E5%85%88%E5%86%B3%E6%9D%A1%E4%BB%B6) + - [用法](#%E7%94%A8%E6%B3%95) + - [如何评估导出的模型](#%E5%A6%82%E4%BD%95%E8%AF%84%E4%BC%B0%E5%AF%BC%E5%87%BA%E7%9A%84%E6%A8%A1%E5%9E%8B) + - [支持转换为 TensorRT 的模型列表](#%E6%94%AF%E6%8C%81%E8%BD%AC%E6%8D%A2%E4%B8%BA-tensorrt-%E7%9A%84%E6%A8%A1%E5%9E%8B%E5%88%97%E8%A1%A8) + - [提醒](#%E6%8F%90%E9%86%92) + - [常见问题](#%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98) + + + +## 如何将模型从 ONNX 转换为 TensorRT + +### 先决条件 + +1. 请参考 [get_started.md](https://mmdetection.readthedocs.io/en/latest/get_started.html) 从源码安装 MMCV 和 MMDetection。 +2. 请参考 [ONNXRuntime in mmcv](https://mmcv.readthedocs.io/en/latest/deployment/onnxruntime_op.html) 和 [TensorRT plugin in mmcv](https://github.com/open-mmlab/mmcv/blob/master/docs/en/deployment/tensorrt_plugin.md/) 安装支持 ONNXRuntime 自定义操作和 TensorRT 插件的 `mmcv-full`。 +3. 使用工具 [pytorch2onnx](https://mmdetection.readthedocs.io/en/latest/tutorials/pytorch2onnx.html) 将模型从 PyTorch 转换为 ONNX。 + +### 用法 + +```bash +python tools/deployment/onnx2tensorrt.py \ + ${CONFIG} \ + ${MODEL} \ + --trt-file ${TRT_FILE} \ + --input-img ${INPUT_IMAGE_PATH} \ + --shape ${INPUT_IMAGE_SHAPE} \ + --min-shape ${MIN_IMAGE_SHAPE} \ + --max-shape ${MAX_IMAGE_SHAPE} \ + --workspace-size {WORKSPACE_SIZE} \ + --show \ + --verify \ +``` + +所有参数的说明: + +- `config`: 模型配置文件的路径。 +- `model`: ONNX 模型文件的路径。 +- `--trt-file`: 输出 TensorRT 引擎文件的路径。如果未指定,它将被设置为 `tmp.trt`。 +- `--input-img`: 用于追踪和转换的输入图像的路径。默认情况下,它将设置为 `demo/demo.jpg`。 +- `--shape`: 模型输入的高度和宽度。如果未指定,它将设置为 `400 600`。 +- `--min-shape`: 模型输入的最小高度和宽度。如果未指定,它将被设置为与 `--shape` 相同。 +- `--max-shape`: 模型输入的最大高度和宽度。如果未指定,它将被设置为与 `--shape` 相同。 +- `--workspace-size`: 构建 TensorRT 引擎所需的 GPU 工作空间大小(以 GiB 为单位)。如果未指定,它将设置为 `1` GiB。 +- `--show`: 确定是否显示模型的输出。如果未指定,它将设置为 `False`。 +- `--verify`: 确定是否在 ONNXRuntime 和 TensorRT 之间验证模型的正确性。如果未指定,它将设置为 `False`。 +- `--verbose`: 确定是否打印日志消息。它对调试很有用。如果未指定,它将设置为 `False`。 + +例子: + +```bash +python tools/deployment/onnx2tensorrt.py \ + configs/retinanet/retinanet_r50_fpn_1x_coco.py \ + checkpoints/retinanet_r50_fpn_1x_coco.onnx \ + --trt-file checkpoints/retinanet_r50_fpn_1x_coco.trt \ + --input-img demo/demo.jpg \ + --shape 400 600 \ + --show \ + --verify \ +``` + +## 如何评估导出的模型 + +我们准备了一个工具 `tools/deplopyment/test.py` 来评估 TensorRT 模型。 + +请参阅以下链接以获取更多信息。 + +- [如何评估导出的模型](pytorch2onnx.md#how-to-evaluate-the-exported-models) +- [结果和模型](pytorch2onnx.md#results-and-models) + +## 支持转换为 TensorRT 的模型列表 + +下表列出了确定可转换为 TensorRT 的模型。 + +| Model | Config | Dynamic Shape | Batch Inference | Note | +| :----------------: | :--------------------------------------------------------------: | :-----------: | :-------------: | :--: | +| SSD | `configs/ssd/ssd300_coco.py` | Y | Y | | +| FSAF | `configs/fsaf/fsaf_r50_fpn_1x_coco.py` | Y | Y | | +| FCOS | `configs/fcos/fcos_r50_caffe_fpn_4x4_1x_coco.py` | Y | Y | | +| YOLOv3 | `configs/yolo/yolov3_d53_mstrain-608_273e_coco.py` | Y | Y | | +| RetinaNet | `configs/retinanet/retinanet_r50_fpn_1x_coco.py` | Y | Y | | +| Faster R-CNN | `configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py` | Y | Y | | +| Cascade R-CNN | `configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py` | Y | Y | | +| Mask R-CNN | `configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py` | Y | Y | | +| Cascade Mask R-CNN | `configs/cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py` | Y | Y | | +| PointRend | `configs/point_rend/point_rend_r50_caffe_fpn_mstrain_1x_coco.py` | Y | Y | | + +注意: + +- *以上所有模型通过 Pytorch==1.6.0, onnx==1.7.0 与 TensorRT-7.2.1.6.Ubuntu-16.04.x86_64-gnu.cuda-10.2.cudnn8.0 测试* + +## 提醒 + +- 如果您在上面列出的模型中遇到任何问题,请创建 issue,我们会尽快处理。对于未包含在列表中的模型,由于资源有限,我们可能无法在此提供太多帮助。请尝试深入挖掘并自行调试。 +- 由于此功能是实验性的,并且可能会快速更改,因此请始终尝试使用最新的 `mmcv` 和 `mmdetecion`。 + +## 常见问题 + +- 空 diff --git a/docs/zh_cn/tutorials/pytorch2onnx.md b/docs/zh_cn/tutorials/pytorch2onnx.md new file mode 100644 index 0000000..93a647e --- /dev/null +++ b/docs/zh_cn/tutorials/pytorch2onnx.md @@ -0,0 +1,3 @@ +# 教程 8: Pytorch 到 ONNX 的模型转换(实验性支持) + +> ## [尝试使用新的 MMDeploy 來部署你的模型](https://mmdeploy.readthedocs.io/) diff --git a/docs/zh_cn/useful_tools.md b/docs/zh_cn/useful_tools.md new file mode 100644 index 0000000..922164c --- /dev/null +++ b/docs/zh_cn/useful_tools.md @@ -0,0 +1 @@ +## 日志分析 diff --git a/exp_note.md b/exp_note.md new file mode 100644 index 0000000..3677702 --- /dev/null +++ b/exp_note.md @@ -0,0 +1,93 @@ + + + + +# 注意事项 +* 在rstar上,启动程序的方法是:`CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.launch --nproc_per_node=2 --use_env object_detecion_qat/QAT_multi_GPU.py` + * 其中 CUDA_VISIBLE_DEVICES=0,1 表示可见的GPU序号为0,1。 + * --nproc_per_node=2 表示在一个机器上跑2张卡。 + * --use_env 表示从环境中加载distibuted配置。 + * 主要的程序就是QAT_multi_GPU.py。 + * 该指令在teql文件夹内执行。 +* 启动程序前务必确保config.py文件内的文件路径是否正确;如data_path、output_dir等。目前默认使用的config为/workspace/code/Quant/teql/mqbconfig/fp32/coco_fastrcnn_res50_fpn_fp32_config.yaml +* object_detecion_qat/QAT_multi_GPU.py内有管道arg,附上了对应的描述。默认即可。后续再从.sh脚本出发。 +* /workspace/code/Quant/teql/global_placeholder.py 内的“常值”变量需要主动改掉,否则一些路径会报错。目前看来是必须得加载backbone的预训练模型的。 + + +# 杂项 +* model_type: + + 4. 容器需要跑的实验: turn device + 1. COCO + 1. RetinaNet18 20G+ + 1. LSQ w4a4 0r d0 tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w4a4.sh + 2. LSQ w2a2 0r d1 tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w2a2.sh + 3. LSQ HQOD w4a4 0r d2 tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_HQOD_retinanet_18_coco_w4a4.sh + 4. LSQ HQOD w2a2 0r d3 tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_HQOD_retinanet_18_coco_w2a2.sh + 2. RetinaNet50 40G+ + 1. LSQ w4a4 0r d4 tools/starter_scripts/retinanet_50/qat/coco/dist_lsq_retinanet_50_coco_w4a4.sh + 2. LSQ w2a2 0r d5 tools/starter_scripts/retinanet_50/qat/coco/dist_lsq_retinanet_50_coco_w2a2.sh + 3. LSQ HQOD w4a4 0r d6 tools/starter_scripts/retinanet_50/qat/coco/dist_lsq_HQOD_retinanet_50_coco_w4a4.sh + 4. LSQ HQOD w2a2 2r d0 tools/starter_scripts/retinanet_50/qat/coco/dist_lsq_HQOD_retinanet_50_coco_w2a2.sh + 3. YOLOX_s_LSQ 40G+ + 1. LSQ w4a4 1r d0 tools/starter_scripts/yolox_s/qat/coco/dist_lsq_yolox_s_coco_w4a4.sh + 2. LSQ w2a2 1r d1 tools/starter_scripts/yolox_s/qat/coco/dist_lsq_yolox_s_coco_w2a2.sh + 3. LSQ HQOD w4a4 1r d2 tools/starter_scripts/yolox_s/qat/coco/dist_lsq_HQOD_yolox_s_coco_w4a4.sh + 4. LSQ HQOD w2a2 1r d3 tools/starter_scripts/yolox_s/qat/coco/dist_lsq_HQOD_yolox_s_coco_w2a2.sh + 4. RetinaNet18_AQD 20G+ + 1. fp32 pretrain 0r d7 tools/starter_scripts/retinanet_18/dist_train_retinanet_18_coco_AQD.sh + 2. LSQ HQOD w2a2 1r d4 tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w2a2_HQOD_AQD.sh + 3. LSQ HQOD w4a4 1r d5 tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w4a4_HQOD_AQD.sh + 5. ATSS50 40G+ + 1. TQT w4a4 1r d6 tools/starter_scripts/atss_50/qat/coco/dist_tqt_atss_50_coco_w4a4.sh + 2. TQT w2a2 2r d1 tools/starter_scripts/atss_50/qat/coco/dist_tqt_atss_50_coco_w2a2.sh + 3. TQT HQOD w4a4 1r d7 tools/starter_scripts/atss_50/qat/coco/dist_tqt_HQOD_atss_50_coco_w4a4.sh + 4. TQT HQOD w2a2 2r d2 tools/starter_scripts/atss_50/qat/coco/dist_tqt_HQOD_atss_50_coco_w2a2.sh + 6. ATSS50 40G+ + 1. LSQ w4a4 2r d3 tools/starter_scripts/atss_50/qat/coco/dist_lsq_atss_50_coco_w4a4.sh + 2. LSQ w2a2 2r d4 tools/starter_scripts/atss_50/qat/coco/dist_lsq_atss_50_coco_w2a2.sh + 3. LSQ HQOD w4a4 2r d5 tools/starter_scripts/atss_50/qat/coco/dist_lsq_HQOD_atss_50_coco_w4a4.sh + 4. LSQ HQOD w2a2 2r d6 tools/starter_scripts/atss_50/qat/coco/dist_lsq_HQOD_atss_50_coco_w2a2.sh + +检查一遍pretrain是否加载了 AQD的要提前设置一下 √ +batchsize √ +device √ + +注意一下,要把master_port设置一下 √ + + +commands_file=tools/starter_scripts/experiment1.txt tmux_s_name=hqod1 bash tools/starter_scripts/main.sh + +commands_file=tools/starter_scripts/experiment2.txt tmux_s_name=hqod2 bash tools/starter_scripts/main.sh + +commands_file=tools/starter_scripts/experiment3.txt tmux_s_name=hqod3 bash tools/starter_scripts/main.sh + +commands_file=tools/starter_scripts/experiment41.txt tmux_s_name=hqod41 bash tools/starter_scripts/main.sh + + + + + +commands_file=tools/starter_scripts/experiment52.txt tmux_s_name=hqod52 bash tools/starter_scripts/main.sh + +commands_file=tools/starter_scripts/experiment53.txt tmux_s_name=hqod53 bash tools/starter_scripts/main.sh + +commands_file=tools/starter_scripts/experiment54.txt tmux_s_name=hqod54 bash tools/starter_scripts/main.sh + +commands_file=tools/starter_scripts/experiment55.txt tmux_s_name=hqod55 bash tools/starter_scripts/main.sh + +commands_file=tools/starter_scripts/experiment61.txt tmux_s_name=hqod61 bash tools/starter_scripts/main.sh +: 记得换文件 +commands_file=tools/starter_scripts/experiment62.txt tmux_s_name=hqod62 bash tools/starter_scripts/main.sh + + +commands_file=tools/starter_scripts/experiment71.txt tmux_s_name=hqod71 bash tools/starter_scripts/main.sh + +commands_file=tools/starter_scripts/experiment72.txt tmux_s_name=hqod72 bash tools/starter_scripts/main.sh + + + + + + + diff --git a/fuser_method_mappings.py b/fuser_method_mappings.py new file mode 100644 index 0000000..ae87726 --- /dev/null +++ b/fuser_method_mappings.py @@ -0,0 +1,61 @@ +from typing import Optional, Type + +import torch +import torch.nn as nn +from torch.quantization.fx.fusion_patterns import ConvBNReLUFusion, ModuleReLUFusion +from torch.quantization.fx.quantization_types import QuantizerCls +from torch.fx.graph import Node + +import mqbench.nn as qnn +import mqbench.nn.intrinsic as qnni +import mqbench.nn.intrinsic.qat as qnniqat +from mqbench.utils.fusion import fuse_deconv_bn_eval +from mqbench.nn.modules import FrozenBatchNorm2d + + +fuse_custom_config_dict = { + "additional_fuser_method_mapping": { + (torch.nn.Linear, torch.nn.BatchNorm1d): fuse_linear_bn, + (torch.nn.ConvTranspose2d, torch.nn.BatchNorm2d): fuse_deconv_bn, + (torch.nn.ConvTranspose2d, torch.nn.BatchNorm2d, torch.nn.ReLU): fuse_deconv_bn_relu, + (torch.nn.ConvTranspose2d, torch.nn.ReLU): qnni.ConvTransposeReLU2d, + (nn.Conv2d, FrozenBatchNorm2d, nn.ReLU): fuse_conv_freezebn_relu, + (nn.Conv2d, FrozenBatchNorm2d): fuse_conv_freezebn, + (nn.ConvTranspose2d, FrozenBatchNorm2d, nn.ReLU): fuse_deconv_freezebn_relu, + (nn.ConvTranspose2d, FrozenBatchNorm2d): fuse_deconv_freezebn, + }, + "additional_fusion_pattern": { # 似乎这些都是torch官方的定义 + (torch.nn.BatchNorm1d, torch.nn.Linear): + ConvBNReLUFusion, + (torch.nn.BatchNorm2d, torch.nn.ConvTranspose2d): + ConvBNReLUFusion, + (torch.nn.ReLU, torch.nn.ConvTranspose2d): + ConvBNReLUFusion, + (torch.nn.ReLU, (torch.nn.BatchNorm2d, torch.nn.ConvTranspose2d)): + ConvBNReLUFusion, + (torch.nn.functional.relu, torch.nn.ConvTranspose2d): + ConvBNReLUFusion, + (torch.nn.functional.relu, (torch.nn.BatchNorm2d, torch.nn.ConvTranspose2d)): + ConvBNReLUFusion, + (torch.nn.ReLU, (FrozenBatchNorm2d, torch.nn.Conv2d)): + ConvFreezebnReLUFusion, + (FrozenBatchNorm2d, torch.nn.Conv2d): + ConvFreezebnReLUFusion, + (torch.nn.ReLU, (FrozenBatchNorm2d, torch.nn.ConvTranspose2d)): + ConvFreezebnReLUFusion, + (FrozenBatchNorm2d, torch.nn.ConvTranspose2d): + ConvFreezebnReLUFusion, + }, + "additional_qat_module_mappings": { + nn.ConvTranspose2d: qnn.qat.ConvTranspose2d, + qnni.LinearBn1d: qnniqat.LinearBn1d, + qnni.ConvTransposeBn2d: qnniqat.ConvTransposeBn2d, + qnni.ConvTransposeReLU2d: qnniqat.ConvTransposeReLU2d, + qnni.ConvTransposeBnReLU2d: qnniqat.ConvTransposeBnReLU2d, + qnni.ConvFreezebn2d: qnniqat.ConvFreezebn2d, + qnni.ConvFreezebnReLU2d: qnniqat.ConvFreezebnReLU2d, + qnni.ConvTransposeFreezebn2d: qnniqat.ConvTransposeFreezebn2d, + qnni.ConvTransposeFreezebnReLU2d: qnniqat.ConvTransposeFreezebnReLU2d, + nn.Embedding: qnn.qat.Embedding, + }, +} diff --git a/global_placeholder.py b/global_placeholder.py new file mode 100644 index 0000000..99ae5c6 --- /dev/null +++ b/global_placeholder.py @@ -0,0 +1,72 @@ + +#--------- 常值 +# res18_pretrained_path = '/workspace/share/pretrained/resnet18_imagenet.pth' +# res34_pretrained_path = '/workspace/share/pretrained/resnet34_imagenet.pth' +# res50_pretrained_path = '/workspace/share/pretrained/resnet50_imagenet.pth' +# mbnv2_pretrained_path = '/workspace/share/pretrained/mobilenetv2_imagenet.pth' +# vgg16_pretrained_path = '/workspace/share/pretrained/vgg16_imagenet.pth' + +# ssd300_pretrained_path = '/workspace/share/pretrained/nvidia_ssdpyt_amp_200703.pt' +#------------ 等着被初始化 +quant_bit = None +quant_algorithm = None +model_type = None +num_classes = None +pretrained_flag = None +mybuff_flag = 0 +qloss_flag = False +fold_bn_flag = False +aqd_mode = 0 + +def modify_quant_bit(bit_setting): + global quant_bit + print(f'\nModify the global bit hyparam as {bit_setting}') + quant_bit = bit_setting + +def modify_quant_algorithm(algorithm_setting): + global quant_algorithm + print(f'\nModify the global algorithm as {algorithm_setting}') + quant_algorithm = algorithm_setting + +def modify_model_type(model_type_setting): + global model_type + print(f'\nModify the global model type as {model_type_setting}') + model_type = model_type_setting + +def modify_buff_flag(my_buff_setting): + global mybuff_flag + if my_buff_setting == 0: + text = 'naive' + elif my_buff_setting == 1: + text = 'hqod' + elif my_buff_setting == 2: + text = 'hardet' + else: + raise NotImplementedError + print(f'\nModify the global buff flag as {my_buff_setting}:{text}') + mybuff_flag = my_buff_setting + +def modify_qloss_flag(qloss_setting): + global qloss_flag + print(f'\nModify the global qloss flag as {qloss_setting}') + qloss_flag = qloss_setting + +def modify_num_classes(num_classes_setting): + global num_classes + print(f'\nModify the global class num as {num_classes_setting}') + num_classes = num_classes_setting + +def modify_pretrained_flag(pretrained_flag_setting): + global pretrained_flag + print(f'\nModify the global pretrained flag as {pretrained_flag_setting}') + pretrained_flag = pretrained_flag_setting + +def modify_fold_bn_flag(fold_bn_flag_setting): + global fold_bn_flag + print(f'\nModify the global fold bn flag as {fold_bn_flag_setting}') + fold_bn_flag = fold_bn_flag_setting + +def modify_AQD_mode(AQD_mode_setting): + global aqd_mode + print(f'\nModify the global AQD mode flag as {AQD_mode_setting}') + aqd_mode = AQD_mode_setting \ No newline at end of file diff --git a/mmdet/__init__.py b/mmdet/__init__.py new file mode 100644 index 0000000..4df16af --- /dev/null +++ b/mmdet/__init__.py @@ -0,0 +1,29 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv + +from .version import __version__, short_version + + +def digit_version(version_str): + digit_version = [] + for x in version_str.split('.'): + if x.isdigit(): + digit_version.append(int(x)) + elif x.find('rc') != -1: + patch_version = x.split('rc') + digit_version.append(int(patch_version[0]) - 1) + digit_version.append(int(patch_version[1])) + return digit_version + + +mmcv_minimum_version = '1.3.17' +mmcv_maximum_version = '1.8.0' +mmcv_version = digit_version(mmcv.__version__) + + +assert (mmcv_version >= digit_version(mmcv_minimum_version) + and mmcv_version <= digit_version(mmcv_maximum_version)), \ + f'MMCV=={mmcv.__version__} is used but incompatible. ' \ + f'Please install mmcv>={mmcv_minimum_version}, <={mmcv_maximum_version}.' + +__all__ = ['__version__', 'short_version'] diff --git a/mmdet/apis/__init__.py b/mmdet/apis/__init__.py new file mode 100644 index 0000000..3821d9c --- /dev/null +++ b/mmdet/apis/__init__.py @@ -0,0 +1,12 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .inference import (async_inference_detector, inference_detector, + init_detector, show_result_pyplot) +from .test import multi_gpu_test, single_gpu_test +from .train import (get_root_logger, init_random_seed, set_random_seed, + train_detector, qat_detector) + +__all__ = [ + 'get_root_logger', 'set_random_seed', 'train_detector', 'qat_detector', 'init_detector', + 'async_inference_detector', 'inference_detector', 'show_result_pyplot', + 'multi_gpu_test', 'single_gpu_test', 'init_random_seed' +] diff --git a/mmdet/apis/inference.py b/mmdet/apis/inference.py new file mode 100644 index 0000000..f0858a7 --- /dev/null +++ b/mmdet/apis/inference.py @@ -0,0 +1,257 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings +from pathlib import Path + +import mmcv +import numpy as np +import torch +from mmcv.ops import RoIPool +from mmcv.parallel import collate, scatter +from mmcv.runner import load_checkpoint + +from mmdet.core import get_classes +from mmdet.datasets import replace_ImageToTensor +from mmdet.datasets.pipelines import Compose +from mmdet.models import build_detector + + +def init_detector(config, checkpoint=None, device='cuda:0', cfg_options=None): + """Initialize a detector from config file. + + Args: + config (str, :obj:`Path`, or :obj:`mmcv.Config`): Config file path, + :obj:`Path`, or the config object. + checkpoint (str, optional): Checkpoint path. If left as None, the model + will not load any weights. + cfg_options (dict): Options to override some settings in the used + config. + + Returns: + nn.Module: The constructed detector. + """ + if isinstance(config, (str, Path)): + config = mmcv.Config.fromfile(config) + elif not isinstance(config, mmcv.Config): + raise TypeError('config must be a filename or Config object, ' + f'but got {type(config)}') + if cfg_options is not None: + config.merge_from_dict(cfg_options) + if 'pretrained' in config.model: + config.model.pretrained = None + elif 'init_cfg' in config.model.backbone: + config.model.backbone.init_cfg = None + config.model.train_cfg = None + model = build_detector(config.model, test_cfg=config.get('test_cfg')) + if checkpoint is not None: + checkpoint = load_checkpoint(model, checkpoint, map_location='cpu') + if 'CLASSES' in checkpoint.get('meta', {}): + model.CLASSES = checkpoint['meta']['CLASSES'] + else: + warnings.simplefilter('once') + warnings.warn('Class names are not saved in the checkpoint\'s ' + 'meta data, use COCO classes by default.') + model.CLASSES = get_classes('coco') + model.cfg = config # save the config in the model for convenience + model.to(device) + model.eval() + + if device == 'npu': + from mmcv.device.npu import NPUDataParallel + model = NPUDataParallel(model) + model.cfg = config + + return model + + +class LoadImage: + """Deprecated. + + A simple pipeline to load image. + """ + + def __call__(self, results): + """Call function to load images into results. + + Args: + results (dict): A result dict contains the file name + of the image to be read. + Returns: + dict: ``results`` will be returned containing loaded image. + """ + warnings.simplefilter('once') + warnings.warn('`LoadImage` is deprecated and will be removed in ' + 'future releases. You may use `LoadImageFromWebcam` ' + 'from `mmdet.datasets.pipelines.` instead.') + if isinstance(results['img'], str): + results['filename'] = results['img'] + results['ori_filename'] = results['img'] + else: + results['filename'] = None + results['ori_filename'] = None + img = mmcv.imread(results['img']) + results['img'] = img + results['img_fields'] = ['img'] + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + return results + + +def inference_detector(model, imgs): + """Inference image(s) with the detector. + + Args: + model (nn.Module): The loaded detector. + imgs (str/ndarray or list[str/ndarray] or tuple[str/ndarray]): + Either image files or loaded images. + + Returns: + If imgs is a list or tuple, the same length list type results + will be returned, otherwise return the detection results directly. + """ + + if isinstance(imgs, (list, tuple)): + is_batch = True + else: + imgs = [imgs] + is_batch = False + + cfg = model.cfg + device = next(model.parameters()).device # model device + + if isinstance(imgs[0], np.ndarray): + cfg = cfg.copy() + # set loading pipeline type + cfg.data.test.pipeline[0].type = 'LoadImageFromWebcam' + + cfg.data.test.pipeline = replace_ImageToTensor(cfg.data.test.pipeline) + test_pipeline = Compose(cfg.data.test.pipeline) + + datas = [] + for img in imgs: + # prepare data + if isinstance(img, np.ndarray): + # directly add img + data = dict(img=img) + else: + # add information into dict + data = dict(img_info=dict(filename=img), img_prefix=None) + # build the data pipeline + data = test_pipeline(data) + datas.append(data) + + data = collate(datas, samples_per_gpu=len(imgs)) + # just get the actual data from DataContainer + data['img_metas'] = [img_metas.data[0] for img_metas in data['img_metas']] + data['img'] = [img.data[0] for img in data['img']] + if next(model.parameters()).is_cuda: + # scatter to specified GPU + data = scatter(data, [device])[0] + else: + for m in model.modules(): + assert not isinstance( + m, RoIPool + ), 'CPU inference with RoIPool is not supported currently.' + + # forward the model + with torch.no_grad(): + results = model(return_loss=False, rescale=True, **data) + + if not is_batch: + return results[0] + else: + return results + + +async def async_inference_detector(model, imgs): + """Async inference image(s) with the detector. + + Args: + model (nn.Module): The loaded detector. + img (str | ndarray): Either image files or loaded images. + + Returns: + Awaitable detection results. + """ + if not isinstance(imgs, (list, tuple)): + imgs = [imgs] + + cfg = model.cfg + device = next(model.parameters()).device # model device + + if isinstance(imgs[0], np.ndarray): + cfg = cfg.copy() + # set loading pipeline type + cfg.data.test.pipeline[0].type = 'LoadImageFromWebcam' + + cfg.data.test.pipeline = replace_ImageToTensor(cfg.data.test.pipeline) + test_pipeline = Compose(cfg.data.test.pipeline) + + datas = [] + for img in imgs: + # prepare data + if isinstance(img, np.ndarray): + # directly add img + data = dict(img=img) + else: + # add information into dict + data = dict(img_info=dict(filename=img), img_prefix=None) + # build the data pipeline + data = test_pipeline(data) + datas.append(data) + + data = collate(datas, samples_per_gpu=len(imgs)) + # just get the actual data from DataContainer + data['img_metas'] = [img_metas.data[0] for img_metas in data['img_metas']] + data['img'] = [img.data[0] for img in data['img']] + if next(model.parameters()).is_cuda: + # scatter to specified GPU + data = scatter(data, [device])[0] + else: + for m in model.modules(): + assert not isinstance( + m, RoIPool + ), 'CPU inference with RoIPool is not supported currently.' + + # We don't restore `torch.is_grad_enabled()` value during concurrent + # inference since execution can overlap + torch.set_grad_enabled(False) + results = await model.aforward_test(rescale=True, **data) + return results + + +def show_result_pyplot(model, + img, + result, + score_thr=0.3, + title='result', + wait_time=0, + palette=None, + out_file=None): + """Visualize the detection results on the image. + + Args: + model (nn.Module): The loaded detector. + img (str or np.ndarray): Image filename or loaded image. + result (tuple[list] or list): The detection result, can be either + (bbox, segm) or just bbox. + score_thr (float): The threshold to visualize the bboxes and masks. + title (str): Title of the pyplot figure. + wait_time (float): Value of waitKey param. Default: 0. + palette (str or tuple(int) or :obj:`Color`): Color. + The tuple of color should be in BGR order. + out_file (str or None): The path to write the image. + Default: None. + """ + if hasattr(model, 'module'): + model = model.module + model.show_result( + img, + result, + score_thr=score_thr, + show=True, + wait_time=wait_time, + win_name=title, + bbox_color=palette, + text_color=(200, 200, 200), + mask_color=palette, + out_file=out_file) diff --git a/mmdet/apis/test.py b/mmdet/apis/test.py new file mode 100644 index 0000000..973d362 --- /dev/null +++ b/mmdet/apis/test.py @@ -0,0 +1,209 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +import pickle +import shutil +import tempfile +import time + +import mmcv +import torch +import torch.distributed as dist +from mmcv.image import tensor2imgs +from mmcv.runner import get_dist_info + +from mmdet.core import encode_mask_results + + +def single_gpu_test(model, + data_loader, + show=False, + out_dir=None, + show_score_thr=0.3): + model.eval() + results = [] + dataset = data_loader.dataset + PALETTE = getattr(dataset, 'PALETTE', None) + prog_bar = mmcv.ProgressBar(len(dataset)) + for i, data in enumerate(data_loader): + with torch.no_grad(): + result = model(return_loss=False, rescale=True, **data) + + batch_size = len(result) + if show or out_dir: + if batch_size == 1 and isinstance(data['img'][0], torch.Tensor): + img_tensor = data['img'][0] + else: + img_tensor = data['img'][0].data[0] + img_metas = data['img_metas'][0].data[0] + imgs = tensor2imgs(img_tensor, **img_metas[0]['img_norm_cfg']) + assert len(imgs) == len(img_metas) + + for i, (img, img_meta) in enumerate(zip(imgs, img_metas)): + h, w, _ = img_meta['img_shape'] + img_show = img[:h, :w, :] + + ori_h, ori_w = img_meta['ori_shape'][:-1] + img_show = mmcv.imresize(img_show, (ori_w, ori_h)) + + if out_dir: + out_file = osp.join(out_dir, img_meta['ori_filename']) + else: + out_file = None + + model.module.show_result( + img_show, + result[i], + bbox_color=PALETTE, + text_color=PALETTE, + mask_color=PALETTE, + show=show, + out_file=out_file, + score_thr=show_score_thr) + + # encode mask results + if isinstance(result[0], tuple): + result = [(bbox_results, encode_mask_results(mask_results)) + for bbox_results, mask_results in result] + # This logic is only used in panoptic segmentation test. + elif isinstance(result[0], dict) and 'ins_results' in result[0]: + for j in range(len(result)): + bbox_results, mask_results = result[j]['ins_results'] + result[j]['ins_results'] = (bbox_results, + encode_mask_results(mask_results)) + + results.extend(result) + + for _ in range(batch_size): + prog_bar.update() + return results + + +def multi_gpu_test(model, data_loader, tmpdir=None, gpu_collect=False): + """Test model with multiple gpus. + + This method tests model with multiple gpus and collects the results + under two different modes: gpu and cpu modes. By setting 'gpu_collect=True' + it encodes results to gpu tensors and use gpu communication for results + collection. On cpu mode it saves the results on different gpus to 'tmpdir' + and collects them by the rank 0 worker. + + Args: + model (nn.Module): Model to be tested. + data_loader (nn.Dataloader): Pytorch data loader. + tmpdir (str): Path of directory to save the temporary results from + different gpus under cpu mode. + gpu_collect (bool): Option to use either gpu or cpu to collect results. + + Returns: + list: The prediction results. + """ + model.eval() + results = [] + dataset = data_loader.dataset + rank, world_size = get_dist_info() + if rank == 0: + prog_bar = mmcv.ProgressBar(len(dataset)) + time.sleep(2) # This line can prevent deadlock problem in some cases. + for i, data in enumerate(data_loader): + with torch.no_grad(): + result = model(return_loss=False, rescale=True, **data) + # encode mask results + if isinstance(result[0], tuple): + result = [(bbox_results, encode_mask_results(mask_results)) + for bbox_results, mask_results in result] + # This logic is only used in panoptic segmentation test. + elif isinstance(result[0], dict) and 'ins_results' in result[0]: + for j in range(len(result)): + bbox_results, mask_results = result[j]['ins_results'] + result[j]['ins_results'] = ( + bbox_results, encode_mask_results(mask_results)) + + results.extend(result) + + if rank == 0: + batch_size = len(result) + for _ in range(batch_size * world_size): + prog_bar.update() + + # collect results from all ranks + if gpu_collect: + results = collect_results_gpu(results, len(dataset)) + else: + results = collect_results_cpu(results, len(dataset), tmpdir) + return results + + +def collect_results_cpu(result_part, size, tmpdir=None): + rank, world_size = get_dist_info() + # create a tmp dir if it is not specified + if tmpdir is None: + MAX_LEN = 512 + # 32 is whitespace + dir_tensor = torch.full((MAX_LEN, ), + 32, + dtype=torch.uint8, + device='cuda') + if rank == 0: + mmcv.mkdir_or_exist('.dist_test') + tmpdir = tempfile.mkdtemp(dir='.dist_test') + tmpdir = torch.tensor( + bytearray(tmpdir.encode()), dtype=torch.uint8, device='cuda') + dir_tensor[:len(tmpdir)] = tmpdir + dist.broadcast(dir_tensor, 0) + tmpdir = dir_tensor.cpu().numpy().tobytes().decode().rstrip() + else: + mmcv.mkdir_or_exist(tmpdir) + # dump the part result to the dir + mmcv.dump(result_part, osp.join(tmpdir, f'part_{rank}.pkl')) + dist.barrier() + # collect all parts + if rank != 0: + return None + else: + # load results of all parts from tmp dir + part_list = [] + for i in range(world_size): + part_file = osp.join(tmpdir, f'part_{i}.pkl') + part_list.append(mmcv.load(part_file)) + # sort the results + ordered_results = [] + for res in zip(*part_list): + ordered_results.extend(list(res)) + # the dataloader may pad some samples + ordered_results = ordered_results[:size] + # remove tmp dir + shutil.rmtree(tmpdir) + return ordered_results + + +def collect_results_gpu(result_part, size): + rank, world_size = get_dist_info() + # dump result part to tensor with pickle + part_tensor = torch.tensor( + bytearray(pickle.dumps(result_part)), dtype=torch.uint8, device='cuda') + # gather all result part tensor shape + shape_tensor = torch.tensor(part_tensor.shape, device='cuda') + shape_list = [shape_tensor.clone() for _ in range(world_size)] + dist.all_gather(shape_list, shape_tensor) + # padding result part tensor to max length + shape_max = torch.tensor(shape_list).max() + part_send = torch.zeros(shape_max, dtype=torch.uint8, device='cuda') + part_send[:shape_tensor[0]] = part_tensor + part_recv_list = [ + part_tensor.new_zeros(shape_max) for _ in range(world_size) + ] + # gather all result part + dist.all_gather(part_recv_list, part_send) + + if rank == 0: + part_list = [] + for recv, shape in zip(part_recv_list, shape_list): + part_list.append( + pickle.loads(recv[:shape[0]].cpu().numpy().tobytes())) + # sort the results + ordered_results = [] + for res in zip(*part_list): + ordered_results.extend(list(res)) + # the dataloader may pad some samples + ordered_results = ordered_results[:size] + return ordered_results diff --git a/mmdet/apis/train.py b/mmdet/apis/train.py new file mode 100644 index 0000000..e15bcbf --- /dev/null +++ b/mmdet/apis/train.py @@ -0,0 +1,482 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os +import random + +import numpy as np +import torch +import torch.distributed as dist +from mmcv.runner import (DistSamplerSeedHook, EpochBasedRunner, load_checkpoint, + Fp16OptimizerHook, OptimizerHook, build_runner, + get_dist_info) +from mmdet.core import DistEvalHook, EvalHook, build_optimizer +from mmdet.datasets import (build_dataloader, build_dataset, + replace_ImageToTensor) +from mmdet.utils import (build_ddp, build_dp, compat_cfg, + find_latest_checkpoint, get_root_logger) +from mmdet.apis.test import single_gpu_test +from torch.fx import Tracer +import torch.fx as fx +from mqb_general_process import * +from mqbench.utils.state import * + +import mmcv +import torch +import torch.distributed as dist +from mmcv.image import tensor2imgs +from mmcv.runner import get_dist_info + +from mmdet.core import encode_mask_results +from copy import deepcopy + +def init_random_seed(seed=None, device='cuda'): + """Initialize random seed. + + If the seed is not set, the seed will be automatically randomized, + and then broadcast to all processes to prevent some potential bugs. + + Args: + seed (int, Optional): The seed. Default to None. + device (str): The device where the seed will be put on. + Default to 'cuda'. + + Returns: + int: Seed to be used. + """ + if seed is not None: + return seed + + # Make sure all ranks share the same random seed to prevent + # some potential bugs. Please refer to + # https://github.com/open-mmlab/mmdetection/issues/6339 + rank, world_size = get_dist_info() + seed = np.random.randint(2**31) + if world_size == 1: + return seed + + if rank == 0: + random_num = torch.tensor(seed, dtype=torch.int32, device=device) + else: + random_num = torch.tensor(0, dtype=torch.int32, device=device) + dist.broadcast(random_num, src=0) + return random_num.item() + + +def set_random_seed(seed, deterministic=False): + """Set random seed. + + Args: + seed (int): Seed to be used. + deterministic (bool): Whether to set the deterministic option for + CUDNN backend, i.e., set `torch.backends.cudnn.deterministic` + to True and `torch.backends.cudnn.benchmark` to False. + Default: False. + """ + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + if deterministic: + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + + +def auto_scale_lr(cfg, distributed, logger): + """Automatically scaling LR according to GPU number and sample per GPU. + + Args: + cfg (config): Training config. + distributed (bool): Using distributed or not. + logger (logging.Logger): Logger. + """ + # Get flag from config + if ('auto_scale_lr' not in cfg) or \ + (not cfg.auto_scale_lr.get('enable', False)): + logger.info('Automatic scaling of learning rate (LR)' + ' has been disabled.') + return + + # Get base batch size from config + base_batch_size = cfg.auto_scale_lr.get('base_batch_size', None) + if base_batch_size is None: + return + + # Get gpu number + if distributed: + _, world_size = get_dist_info() + num_gpus = len(range(world_size)) + else: + num_gpus = len(cfg.gpu_ids) + + # calculate the batch size + samples_per_gpu = cfg.data.train_dataloader.samples_per_gpu + batch_size = num_gpus * samples_per_gpu + logger.info(f'Training with {num_gpus} GPU(s) with {samples_per_gpu} ' + f'samples per GPU. The total batch size is {batch_size}.') + + if batch_size != base_batch_size: + # scale LR with + # [linear scaling rule](https://arxiv.org/abs/1706.02677) + scaled_lr = (batch_size / base_batch_size) * cfg.optimizer.lr + logger.info('LR has been automatically scaled ' + f'from {cfg.optimizer.lr} to {scaled_lr}') + cfg.optimizer.lr = scaled_lr + else: + logger.info('The batch size match the ' + f'base batch size: {base_batch_size}, ' + f'will not scaling the LR ({cfg.optimizer.lr}).') + +def calibrate(model, data_loader, cali_num): # TODO 这里给修改成达到一定次数后就break;然后只用eval_data + model.eval() + if isinstance(data_loader, list): + dataset = data_loader[0].dataset + data_loader = data_loader[0] + else: + dataset = data_loader.dataset + PALETTE = getattr(dataset, 'PALETTE', None) + + rank, world_size = get_dist_info() + + if rank == 0: + prog_bar = mmcv.ProgressBar(cali_num) + # prog_bar = mmcv.ProgressBar(cali_num) + steped_num = 0 + for i, data in enumerate(data_loader): + with torch.no_grad(): + data['img'] = data['img'].data + data['img_metas'] = data['img_metas'].data + data.pop('gt_bboxes') + data.pop('gt_labels') + result = model(return_loss=False, rescale=True, **data) + batch_size = len(result) + steped_num += batch_size * world_size + dist.barrier() + if rank == 0: + for _ in range(batch_size * world_size): + prog_bar.update() + if steped_num >= cali_num: + logger.info(f'Truly calibrate num {steped_num}') + break + + +def qat_detector(model, + dataset, + cfg, + quant_config, + distributed=False, + validate=False, + timestamp=None, + meta=None): + + cfg = compat_cfg(cfg) + logger = get_root_logger(log_level=cfg.log_level) + + # prepare data loaders + dataset = dataset if isinstance(dataset, (list, tuple)) else [dataset] + + runner_type = 'EpochBasedRunner' if 'runner' not in cfg else cfg.runner[ + 'type'] + + train_dataloader_default_args = dict( + samples_per_gpu=2, + workers_per_gpu=2, + # `num_gpus` will be ignored if distributed + num_gpus=len(cfg.gpu_ids), + dist=distributed, + seed=cfg.seed, + runner_type=runner_type, + persistent_workers=False) + + train_loader_cfg = { + **train_dataloader_default_args, + **cfg.data.get('train_dataloader', {}) + } + + + data_loaders = [build_dataloader(ds, **train_loader_cfg, pin_memory=True) for ds in dataset] + + # cali loader的设置 + cali_loader_cfg = deepcopy(train_loader_cfg) + cali_loader_cfg['samples_per_gpu'] = 1 + cali_loader_cfg['workers_per_gpu'] = 1 + cali_data_loader = [build_dataloader(ds, **cali_loader_cfg, pin_memory=True) for ds in dataset][0] + + resume_from = None + if cfg.resume_from is None and cfg.get('auto_resume'): + resume_from = find_latest_checkpoint(cfg.work_dir) + if resume_from is not None: + cfg.resume_from = resume_from + + elif cfg.load_from: # 这个应该可以解决所谓的quant baseline问题 + checkpoint = load_checkpoint(model, cfg.load_from, map_location='cpu') # TODO 测一下这样的evaluate对不对 + else: + checkpoint = {} + # old versions did not save class info in checkpoints, this walkaround is + # for backward compatibility + if 'CLASSES' in checkpoint.get('meta', {}): + model.CLASSES = checkpoint['meta']['CLASSES'] + else: + model.CLASSES = dataset[0].CLASSES + + + # print('\nGet FakeQuant model\n') + # model.backbone = get_quantize_model(model.backbone, quant_config, cfg.trace_config.backbone_detail) # QAT时,这个需要eval还是train + # model.neck = get_quantize_model(model.neck, quant_config, cfg.trace_config.neck_detail) # QAT时,这个需要eval还是train + # temp = get_quantize_model(model.bbox_head, quant_config, cfg.trace_config.bbox_head_detail) # QAT时,这个需要eval还是train + # model.bbox_head.forward = temp.forward # 太傻蛋勒 + # model.bbox_head = temp + model.train() # prepare 前一定得是train模式 + model = make_qmodel_for_mmd(model, quant_config, cfg.trace_config) + + if not hasattr(cfg, 'tune_from'): + cfg.tune_from = False + if cfg.tune_from: # 加载进行tune + _ = load_checkpoint(model, cfg.tune_from, map_location='cpu') + + # put model on gpus + if distributed: + find_unused_parameters = cfg.get('find_unused_parameters', False) + # Sets the `find_unused_parameters` parameter in + # torch.nn.parallel.DistributedDataParallel + model = build_ddp( # 细节不给看 + model, + cfg.device, + device_ids=[int(os.environ['LOCAL_RANK'])], + broadcast_buffers=False, + find_unused_parameters=find_unused_parameters) + else: + model = build_dp(model, cfg.device, device_ids=cfg.gpu_ids) + + # build optimizer + auto_scale_lr(cfg, distributed, logger) + optimizer = build_optimizer(model, cfg.optimizer) + + runner = build_runner( + cfg.runner, + default_args=dict( + model=model, + optimizer=optimizer, + work_dir=cfg.work_dir, + logger=logger, + meta=meta)) + + # an ugly workaround to make .log and .log.json filenames the same + runner.timestamp = timestamp + + # fp16 setting + fp16_cfg = cfg.get('fp16', None) + if fp16_cfg is None and cfg.get('device', None) == 'npu': + fp16_cfg = dict(loss_scale='dynamic') + if fp16_cfg is not None: + optimizer_config = Fp16OptimizerHook( + **cfg.optimizer_config, **fp16_cfg, distributed=distributed) + elif distributed and 'type' not in cfg.optimizer_config: + optimizer_config = OptimizerHook(**cfg.optimizer_config) + else: + optimizer_config = cfg.optimizer_config + + # register hooks + runner.register_training_hooks( + cfg.lr_config, + optimizer_config, + cfg.checkpoint_config, + cfg.log_config, + cfg.get('momentum_config', None), + custom_hooks_config=cfg.get('custom_hooks', None)) + + if distributed: + if isinstance(runner, EpochBasedRunner): + runner.register_hook(DistSamplerSeedHook()) + + # register eval hooks + if validate: + val_dataloader_default_args = dict( + samples_per_gpu=1, + workers_per_gpu=2, + dist=distributed, + shuffle=False, + persistent_workers=False) + + val_dataloader_args = { + **val_dataloader_default_args, + **cfg.data.get('val_dataloader', {}) + } + # Support batch_size > 1 in validation + + if val_dataloader_args['samples_per_gpu'] > 1: + # Replace 'ImageToTensor' to 'DefaultFormatBundle' + cfg.data.val.pipeline = replace_ImageToTensor( + cfg.data.val.pipeline) + val_dataset = build_dataset(cfg.data.val, dict(test_mode=True)) + + val_dataloader = build_dataloader(val_dataset, **val_dataloader_args) + eval_cfg = cfg.get('evaluation', {}) + eval_cfg['by_epoch'] = cfg.runner['type'] != 'IterBasedRunner' + eval_hook = DistEvalHook if distributed else EvalHook + # In this PR (https://github.com/open-mmlab/mmcv/pull/1193), the + # priority of IterTimerHook has been modified from 'NORMAL' to 'LOW'. + runner.register_hook( + eval_hook(val_dataloader, **eval_cfg), priority='LOW') + + # cali_data_loader = deepcopy(val_dataloader) # TODO 这里改成train的 + if not cfg.resume_from and not cfg.tune_from: + print('\nCalibrating\n') + enable_calibration(model.module.backbone) + enable_calibration(model.module.neck) + model_general_architecture = cfg.trace_config.get('model_general_architecture', None) + if model_general_architecture == 'FasterRCNN': + enable_calibration(model.module.rpn_head) + enable_calibration(model.module.roi_head.bbox_head) + else: + enable_calibration(model.module.bbox_head) + + calibrate(model, cali_data_loader + # , 1 + , quant_config.quantize.cali_batchnum + ) # NOTE 训练集的data确实全带container + # 清除cali loader,释放内存 + del cali_data_loader + + enable_quantization(model.module.backbone) + enable_quantization(model.module.neck) + model_general_architecture = cfg.trace_config.get('model_general_architecture', None) + if model_general_architecture == 'FasterRCNN': + enable_quantization(model.module.rpn_head) + enable_quantization(model.module.roi_head.bbox_head) + else: + enable_quantization(model.module.bbox_head) + + + if cfg.resume_from: + runner.resume(cfg.resume_from) + runner.run(data_loaders, cfg.workflow) + +def train_detector(model, + dataset, + cfg, + distributed=False, + validate=False, + timestamp=None, + meta=None): + + cfg = compat_cfg(cfg) + logger = get_root_logger(log_level=cfg.log_level) + + # prepare data loaders + dataset = dataset if isinstance(dataset, (list, tuple)) else [dataset] + + runner_type = 'EpochBasedRunner' if 'runner' not in cfg else cfg.runner[ + 'type'] + + train_dataloader_default_args = dict( + samples_per_gpu=2, + workers_per_gpu=2, + # `num_gpus` will be ignored if distributed + num_gpus=len(cfg.gpu_ids), + dist=distributed, + seed=cfg.seed, + runner_type=runner_type, + persistent_workers=False) + + train_loader_cfg = { + **train_dataloader_default_args, + **cfg.data.get('train_dataloader', {}) + } + + data_loaders = [build_dataloader(ds, **train_loader_cfg) for ds in dataset] + + # put model on gpus + if distributed: + find_unused_parameters = cfg.get('find_unused_parameters', False) + # Sets the `find_unused_parameters` parameter in + # torch.nn.parallel.DistributedDataParallel + model = build_ddp( # 细节不给看 + model, + cfg.device, + device_ids=[int(os.environ['LOCAL_RANK'])], + broadcast_buffers=False, + find_unused_parameters=find_unused_parameters) + else: + model = build_dp(model, cfg.device, device_ids=cfg.gpu_ids) + + # build optimizer + auto_scale_lr(cfg, distributed, logger) + optimizer = build_optimizer(model, cfg.optimizer) + + runner = build_runner( + cfg.runner, + default_args=dict( + model=model, + optimizer=optimizer, + work_dir=cfg.work_dir, + logger=logger, + meta=meta)) + + # an ugly workaround to make .log and .log.json filenames the same + runner.timestamp = timestamp + + # fp16 setting + fp16_cfg = cfg.get('fp16', None) + if fp16_cfg is None and cfg.get('device', None) == 'npu': + fp16_cfg = dict(loss_scale='dynamic') + if fp16_cfg is not None: + optimizer_config = Fp16OptimizerHook( + **cfg.optimizer_config, **fp16_cfg, distributed=distributed) + elif distributed and 'type' not in cfg.optimizer_config: + optimizer_config = OptimizerHook(**cfg.optimizer_config) + else: + optimizer_config = cfg.optimizer_config + + # register hooks + runner.register_training_hooks( + cfg.lr_config, + optimizer_config, + cfg.checkpoint_config, + cfg.log_config, + cfg.get('momentum_config', None), + custom_hooks_config=cfg.get('custom_hooks', None)) + + if distributed: + if isinstance(runner, EpochBasedRunner): + runner.register_hook(DistSamplerSeedHook()) + + # register eval hooks + if validate: + val_dataloader_default_args = dict( + samples_per_gpu=1, + workers_per_gpu=2, + dist=distributed, + shuffle=False, + persistent_workers=False) + + val_dataloader_args = { + **val_dataloader_default_args, + **cfg.data.get('val_dataloader', {}) + } + # Support batch_size > 1 in validation + + if val_dataloader_args['samples_per_gpu'] > 1: + # Replace 'ImageToTensor' to 'DefaultFormatBundle' + cfg.data.val.pipeline = replace_ImageToTensor( + cfg.data.val.pipeline) + val_dataset = build_dataset(cfg.data.val, dict(test_mode=True)) + + val_dataloader = build_dataloader(val_dataset, **val_dataloader_args) + eval_cfg = cfg.get('evaluation', {}) + eval_cfg['by_epoch'] = cfg.runner['type'] != 'IterBasedRunner' + eval_hook = DistEvalHook if distributed else EvalHook + # In this PR (https://github.com/open-mmlab/mmcv/pull/1193), the + # priority of IterTimerHook has been modified from 'NORMAL' to 'LOW'. + runner.register_hook( + eval_hook(val_dataloader, **eval_cfg), priority='LOW') + + resume_from = None + if cfg.resume_from is None and cfg.get('auto_resume'): + resume_from = find_latest_checkpoint(cfg.work_dir) + if resume_from is not None: + cfg.resume_from = resume_from + + if cfg.resume_from: + runner.resume(cfg.resume_from) + elif cfg.load_from: + runner.load_checkpoint(cfg.load_from) + runner.run(data_loaders, cfg.workflow) diff --git a/mmdet/core/__init__.py b/mmdet/core/__init__.py new file mode 100644 index 0000000..2a62038 --- /dev/null +++ b/mmdet/core/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .anchor import * # noqa: F401, F403 +from .bbox import * # noqa: F401, F403 +from .data_structures import * # noqa: F401, F403 +from .evaluation import * # noqa: F401, F403 +from .hook import * # noqa: F401, F403 +from .mask import * # noqa: F401, F403 +from .optimizers import * # noqa: F401, F403 +from .post_processing import * # noqa: F401, F403 +from .utils import * # noqa: F401, F403 diff --git a/mmdet/core/anchor/__init__.py b/mmdet/core/anchor/__init__.py new file mode 100644 index 0000000..fcc7e4a --- /dev/null +++ b/mmdet/core/anchor/__init__.py @@ -0,0 +1,14 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .anchor_generator import (AnchorGenerator, LegacyAnchorGenerator, + YOLOAnchorGenerator) +from .builder import (ANCHOR_GENERATORS, PRIOR_GENERATORS, + build_anchor_generator, build_prior_generator) +from .point_generator import MlvlPointGenerator, PointGenerator +from .utils import anchor_inside_flags, calc_region, images_to_levels + +__all__ = [ + 'AnchorGenerator', 'LegacyAnchorGenerator', 'anchor_inside_flags', + 'PointGenerator', 'images_to_levels', 'calc_region', + 'build_anchor_generator', 'ANCHOR_GENERATORS', 'YOLOAnchorGenerator', + 'build_prior_generator', 'PRIOR_GENERATORS', 'MlvlPointGenerator' +] diff --git a/mmdet/core/anchor/anchor_generator.py b/mmdet/core/anchor/anchor_generator.py new file mode 100644 index 0000000..20886fb --- /dev/null +++ b/mmdet/core/anchor/anchor_generator.py @@ -0,0 +1,866 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import mmcv +import numpy as np +import torch +from torch.nn.modules.utils import _pair + +from .builder import PRIOR_GENERATORS + + +@PRIOR_GENERATORS.register_module() +class AnchorGenerator: + """Standard anchor generator for 2D anchor-based detectors. + + Args: + strides (list[int] | list[tuple[int, int]]): Strides of anchors + in multiple feature levels in order (w, h). + ratios (list[float]): The list of ratios between the height and width + of anchors in a single level. + scales (list[int] | None): Anchor scales for anchors in a single level. + It cannot be set at the same time if `octave_base_scale` and + `scales_per_octave` are set. + base_sizes (list[int] | None): The basic sizes + of anchors in multiple levels. + If None is given, strides will be used as base_sizes. + (If strides are non square, the shortest stride is taken.) + scale_major (bool): Whether to multiply scales first when generating + base anchors. If true, the anchors in the same row will have the + same scales. By default it is True in V2.0 + octave_base_scale (int): The base scale of octave. + scales_per_octave (int): Number of scales for each octave. + `octave_base_scale` and `scales_per_octave` are usually used in + retinanet and the `scales` should be None when they are set. + centers (list[tuple[float, float]] | None): The centers of the anchor + relative to the feature grid center in multiple feature levels. + By default it is set to be None and not used. If a list of tuple of + float is given, they will be used to shift the centers of anchors. + center_offset (float): The offset of center in proportion to anchors' + width and height. By default it is 0 in V2.0. + + Examples: + >>> from mmdet.core import AnchorGenerator + >>> self = AnchorGenerator([16], [1.], [1.], [9]) + >>> all_anchors = self.grid_priors([(2, 2)], device='cpu') + >>> print(all_anchors) + [tensor([[-4.5000, -4.5000, 4.5000, 4.5000], + [11.5000, -4.5000, 20.5000, 4.5000], + [-4.5000, 11.5000, 4.5000, 20.5000], + [11.5000, 11.5000, 20.5000, 20.5000]])] + >>> self = AnchorGenerator([16, 32], [1.], [1.], [9, 18]) + >>> all_anchors = self.grid_priors([(2, 2), (1, 1)], device='cpu') + >>> print(all_anchors) + [tensor([[-4.5000, -4.5000, 4.5000, 4.5000], + [11.5000, -4.5000, 20.5000, 4.5000], + [-4.5000, 11.5000, 4.5000, 20.5000], + [11.5000, 11.5000, 20.5000, 20.5000]]), \ + tensor([[-9., -9., 9., 9.]])] + """ + + def __init__(self, + strides, + ratios, + scales=None, + base_sizes=None, + scale_major=True, + octave_base_scale=None, + scales_per_octave=None, + centers=None, + center_offset=0.): + # check center and center_offset + if center_offset != 0: + assert centers is None, 'center cannot be set when center_offset' \ + f'!=0, {centers} is given.' + if not (0 <= center_offset <= 1): + raise ValueError('center_offset should be in range [0, 1], ' + f'{center_offset} is given.') + if centers is not None: + assert len(centers) == len(strides), \ + 'The number of strides should be the same as centers, got ' \ + f'{strides} and {centers}' + + # calculate base sizes of anchors + self.strides = [_pair(stride) for stride in strides] + self.base_sizes = [min(stride) for stride in self.strides + ] if base_sizes is None else base_sizes + assert len(self.base_sizes) == len(self.strides), \ + 'The number of strides should be the same as base sizes, got ' \ + f'{self.strides} and {self.base_sizes}' + + # calculate scales of anchors + assert ((octave_base_scale is not None + and scales_per_octave is not None) ^ (scales is not None)), \ + 'scales and octave_base_scale with scales_per_octave cannot' \ + ' be set at the same time' + if scales is not None: + self.scales = torch.Tensor(scales) + elif octave_base_scale is not None and scales_per_octave is not None: + octave_scales = np.array( + [2**(i / scales_per_octave) for i in range(scales_per_octave)]) + scales = octave_scales * octave_base_scale + self.scales = torch.Tensor(scales) + else: + raise ValueError('Either scales or octave_base_scale with ' + 'scales_per_octave should be set') + + self.octave_base_scale = octave_base_scale + self.scales_per_octave = scales_per_octave + self.ratios = torch.Tensor(ratios) + self.scale_major = scale_major + self.centers = centers + self.center_offset = center_offset + self.base_anchors = self.gen_base_anchors() + + @property + def num_base_anchors(self): + """list[int]: total number of base anchors in a feature grid""" + return self.num_base_priors + + @property + def num_base_priors(self): + """list[int]: The number of priors (anchors) at a point + on the feature grid""" + return [base_anchors.size(0) for base_anchors in self.base_anchors] + + @property + def num_levels(self): + """int: number of feature levels that the generator will be applied""" + return len(self.strides) + + def gen_base_anchors(self): + """Generate base anchors. + + Returns: + list(torch.Tensor): Base anchors of a feature grid in multiple \ + feature levels. + """ + multi_level_base_anchors = [] + for i, base_size in enumerate(self.base_sizes): + center = None + if self.centers is not None: + center = self.centers[i] + multi_level_base_anchors.append( + self.gen_single_level_base_anchors( + base_size, + scales=self.scales, + ratios=self.ratios, + center=center)) + return multi_level_base_anchors + + def gen_single_level_base_anchors(self, + base_size, + scales, + ratios, + center=None): + """Generate base anchors of a single level. + + Args: + base_size (int | float): Basic size of an anchor. + scales (torch.Tensor): Scales of the anchor. + ratios (torch.Tensor): The ratio between between the height + and width of anchors in a single level. + center (tuple[float], optional): The center of the base anchor + related to a single feature grid. Defaults to None. + + Returns: + torch.Tensor: Anchors in a single-level feature maps. + """ + w = base_size + h = base_size + if center is None: + x_center = self.center_offset * w + y_center = self.center_offset * h + else: + x_center, y_center = center + + h_ratios = torch.sqrt(ratios) + w_ratios = 1 / h_ratios + if self.scale_major: + ws = (w * w_ratios[:, None] * scales[None, :]).view(-1) + hs = (h * h_ratios[:, None] * scales[None, :]).view(-1) + else: + ws = (w * scales[:, None] * w_ratios[None, :]).view(-1) + hs = (h * scales[:, None] * h_ratios[None, :]).view(-1) + + # use float anchor and the anchor's center is aligned with the + # pixel center + base_anchors = [ + x_center - 0.5 * ws, y_center - 0.5 * hs, x_center + 0.5 * ws, + y_center + 0.5 * hs + ] + base_anchors = torch.stack(base_anchors, dim=-1) + + return base_anchors + + def _meshgrid(self, x, y, row_major=True): + """Generate mesh grid of x and y. + + Args: + x (torch.Tensor): Grids of x dimension. + y (torch.Tensor): Grids of y dimension. + row_major (bool, optional): Whether to return y grids first. + Defaults to True. + + Returns: + tuple[torch.Tensor]: The mesh grids of x and y. + """ + # use shape instead of len to keep tracing while exporting to onnx + xx = x.repeat(y.shape[0]) + yy = y.view(-1, 1).repeat(1, x.shape[0]).view(-1) + if row_major: + return xx, yy + else: + return yy, xx + + def grid_priors(self, featmap_sizes, dtype=torch.float32, device='cuda'): + """Generate grid anchors in multiple feature levels. + + Args: + featmap_sizes (list[tuple]): List of feature map sizes in + multiple feature levels. + dtype (:obj:`torch.dtype`): Dtype of priors. + Default: torch.float32. + device (str): The device where the anchors will be put on. + + Return: + list[torch.Tensor]: Anchors in multiple feature levels. \ + The sizes of each tensor should be [N, 4], where \ + N = width * height * num_base_anchors, width and height \ + are the sizes of the corresponding feature level, \ + num_base_anchors is the number of anchors for that level. + """ + assert self.num_levels == len(featmap_sizes) + multi_level_anchors = [] + for i in range(self.num_levels): + anchors = self.single_level_grid_priors( + featmap_sizes[i], level_idx=i, dtype=dtype, device=device) + multi_level_anchors.append(anchors) + return multi_level_anchors + + def single_level_grid_priors(self, + featmap_size, + level_idx, + dtype=torch.float32, + device='cuda'): + """Generate grid anchors of a single level. + + Note: + This function is usually called by method ``self.grid_priors``. + + Args: + featmap_size (tuple[int]): Size of the feature maps. + level_idx (int): The index of corresponding feature map level. + dtype (obj:`torch.dtype`): Date type of points.Defaults to + ``torch.float32``. + device (str, optional): The device the tensor will be put on. + Defaults to 'cuda'. + + Returns: + torch.Tensor: Anchors in the overall feature maps. + """ + + base_anchors = self.base_anchors[level_idx].to(device).to(dtype) + feat_h, feat_w = featmap_size + stride_w, stride_h = self.strides[level_idx] + # First create Range with the default dtype, than convert to + # target `dtype` for onnx exporting. + shift_x = torch.arange(0, feat_w, device=device).to(dtype) * stride_w + shift_y = torch.arange(0, feat_h, device=device).to(dtype) * stride_h + + shift_xx, shift_yy = self._meshgrid(shift_x, shift_y) + shifts = torch.stack([shift_xx, shift_yy, shift_xx, shift_yy], dim=-1) + # first feat_w elements correspond to the first row of shifts + # add A anchors (1, A, 4) to K shifts (K, 1, 4) to get + # shifted anchors (K, A, 4), reshape to (K*A, 4) + + all_anchors = base_anchors[None, :, :] + shifts[:, None, :] + all_anchors = all_anchors.view(-1, 4) + # first A rows correspond to A anchors of (0, 0) in feature map, + # then (0, 1), (0, 2), ... + return all_anchors + + def sparse_priors(self, + prior_idxs, + featmap_size, + level_idx, + dtype=torch.float32, + device='cuda'): + """Generate sparse anchors according to the ``prior_idxs``. + + Args: + prior_idxs (Tensor): The index of corresponding anchors + in the feature map. + featmap_size (tuple[int]): feature map size arrange as (h, w). + level_idx (int): The level index of corresponding feature + map. + dtype (obj:`torch.dtype`): Date type of points.Defaults to + ``torch.float32``. + device (obj:`torch.device`): The device where the points is + located. + Returns: + Tensor: Anchor with shape (N, 4), N should be equal to + the length of ``prior_idxs``. + """ + + height, width = featmap_size + num_base_anchors = self.num_base_anchors[level_idx] + base_anchor_id = prior_idxs % num_base_anchors + x = (prior_idxs // + num_base_anchors) % width * self.strides[level_idx][0] + y = (prior_idxs // width // + num_base_anchors) % height * self.strides[level_idx][1] + priors = torch.stack([x, y, x, y], 1).to(dtype).to(device) + \ + self.base_anchors[level_idx][base_anchor_id, :].to(device) + + return priors + + def grid_anchors(self, featmap_sizes, device='cuda'): + """Generate grid anchors in multiple feature levels. + + Args: + featmap_sizes (list[tuple]): List of feature map sizes in + multiple feature levels. + device (str): Device where the anchors will be put on. + + Return: + list[torch.Tensor]: Anchors in multiple feature levels. \ + The sizes of each tensor should be [N, 4], where \ + N = width * height * num_base_anchors, width and height \ + are the sizes of the corresponding feature level, \ + num_base_anchors is the number of anchors for that level. + """ + warnings.warn('``grid_anchors`` would be deprecated soon. ' + 'Please use ``grid_priors`` ') + + assert self.num_levels == len(featmap_sizes) + multi_level_anchors = [] + for i in range(self.num_levels): + anchors = self.single_level_grid_anchors( + self.base_anchors[i].to(device), + featmap_sizes[i], + self.strides[i], + device=device) + multi_level_anchors.append(anchors) + return multi_level_anchors + + def single_level_grid_anchors(self, + base_anchors, + featmap_size, + stride=(16, 16), + device='cuda'): + """Generate grid anchors of a single level. + + Note: + This function is usually called by method ``self.grid_anchors``. + + Args: + base_anchors (torch.Tensor): The base anchors of a feature grid. + featmap_size (tuple[int]): Size of the feature maps. + stride (tuple[int], optional): Stride of the feature map in order + (w, h). Defaults to (16, 16). + device (str, optional): Device the tensor will be put on. + Defaults to 'cuda'. + + Returns: + torch.Tensor: Anchors in the overall feature maps. + """ + + warnings.warn( + '``single_level_grid_anchors`` would be deprecated soon. ' + 'Please use ``single_level_grid_priors`` ') + + # keep featmap_size as Tensor instead of int, so that we + # can convert to ONNX correctly + feat_h, feat_w = featmap_size + shift_x = torch.arange(0, feat_w, device=device) * stride[0] + shift_y = torch.arange(0, feat_h, device=device) * stride[1] + + shift_xx, shift_yy = self._meshgrid(shift_x, shift_y) + shifts = torch.stack([shift_xx, shift_yy, shift_xx, shift_yy], dim=-1) + shifts = shifts.type_as(base_anchors) + # first feat_w elements correspond to the first row of shifts + # add A anchors (1, A, 4) to K shifts (K, 1, 4) to get + # shifted anchors (K, A, 4), reshape to (K*A, 4) + + all_anchors = base_anchors[None, :, :] + shifts[:, None, :] + all_anchors = all_anchors.view(-1, 4) + # first A rows correspond to A anchors of (0, 0) in feature map, + # then (0, 1), (0, 2), ... + return all_anchors + + def valid_flags(self, featmap_sizes, pad_shape, device='cuda'): + """Generate valid flags of anchors in multiple feature levels. + + Args: + featmap_sizes (list(tuple)): List of feature map sizes in + multiple feature levels. + pad_shape (tuple): The padded shape of the image. + device (str): Device where the anchors will be put on. + + Return: + list(torch.Tensor): Valid flags of anchors in multiple levels. + """ + assert self.num_levels == len(featmap_sizes) + multi_level_flags = [] + for i in range(self.num_levels): + anchor_stride = self.strides[i] + feat_h, feat_w = featmap_sizes[i] + h, w = pad_shape[:2] + valid_feat_h = min(int(np.ceil(h / anchor_stride[1])), feat_h) + valid_feat_w = min(int(np.ceil(w / anchor_stride[0])), feat_w) + flags = self.single_level_valid_flags((feat_h, feat_w), + (valid_feat_h, valid_feat_w), + self.num_base_anchors[i], + device=device) + multi_level_flags.append(flags) + return multi_level_flags + + def single_level_valid_flags(self, + featmap_size, + valid_size, + num_base_anchors, + device='cuda'): + """Generate the valid flags of anchor in a single feature map. + + Args: + featmap_size (tuple[int]): The size of feature maps, arrange + as (h, w). + valid_size (tuple[int]): The valid size of the feature maps. + num_base_anchors (int): The number of base anchors. + device (str, optional): Device where the flags will be put on. + Defaults to 'cuda'. + + Returns: + torch.Tensor: The valid flags of each anchor in a single level \ + feature map. + """ + feat_h, feat_w = featmap_size + valid_h, valid_w = valid_size + assert valid_h <= feat_h and valid_w <= feat_w + valid_x = torch.zeros(feat_w, dtype=torch.bool, device=device) + valid_y = torch.zeros(feat_h, dtype=torch.bool, device=device) + valid_x[:valid_w] = 1 + valid_y[:valid_h] = 1 + valid_xx, valid_yy = self._meshgrid(valid_x, valid_y) + valid = valid_xx & valid_yy + valid = valid[:, None].expand(valid.size(0), + num_base_anchors).contiguous().view(-1) + return valid + + def __repr__(self): + """str: a string that describes the module""" + indent_str = ' ' + repr_str = self.__class__.__name__ + '(\n' + repr_str += f'{indent_str}strides={self.strides},\n' + repr_str += f'{indent_str}ratios={self.ratios},\n' + repr_str += f'{indent_str}scales={self.scales},\n' + repr_str += f'{indent_str}base_sizes={self.base_sizes},\n' + repr_str += f'{indent_str}scale_major={self.scale_major},\n' + repr_str += f'{indent_str}octave_base_scale=' + repr_str += f'{self.octave_base_scale},\n' + repr_str += f'{indent_str}scales_per_octave=' + repr_str += f'{self.scales_per_octave},\n' + repr_str += f'{indent_str}num_levels={self.num_levels}\n' + repr_str += f'{indent_str}centers={self.centers},\n' + repr_str += f'{indent_str}center_offset={self.center_offset})' + return repr_str + + +@PRIOR_GENERATORS.register_module() +class SSDAnchorGenerator(AnchorGenerator): + """Anchor generator for SSD. + + Args: + strides (list[int] | list[tuple[int, int]]): Strides of anchors + in multiple feature levels. + ratios (list[float]): The list of ratios between the height and width + of anchors in a single level. + min_sizes (list[float]): The list of minimum anchor sizes on each + level. + max_sizes (list[float]): The list of maximum anchor sizes on each + level. + basesize_ratio_range (tuple(float)): Ratio range of anchors. Being + used when not setting min_sizes and max_sizes. + input_size (int): Size of feature map, 300 for SSD300, 512 for + SSD512. Being used when not setting min_sizes and max_sizes. + scale_major (bool): Whether to multiply scales first when generating + base anchors. If true, the anchors in the same row will have the + same scales. It is always set to be False in SSD. + """ + + def __init__(self, + strides, + ratios, + min_sizes=None, + max_sizes=None, + basesize_ratio_range=(0.15, 0.9), + input_size=300, + scale_major=True): + assert len(strides) == len(ratios) + assert not (min_sizes is None) ^ (max_sizes is None) + self.strides = [_pair(stride) for stride in strides] + self.centers = [(stride[0] / 2., stride[1] / 2.) + for stride in self.strides] + + if min_sizes is None and max_sizes is None: + # use hard code to generate SSD anchors + self.input_size = input_size + assert mmcv.is_tuple_of(basesize_ratio_range, float) + self.basesize_ratio_range = basesize_ratio_range + # calculate anchor ratios and sizes + min_ratio, max_ratio = basesize_ratio_range + min_ratio = int(min_ratio * 100) + max_ratio = int(max_ratio * 100) + step = int(np.floor(max_ratio - min_ratio) / (self.num_levels - 2)) + min_sizes = [] + max_sizes = [] + for ratio in range(int(min_ratio), int(max_ratio) + 1, step): + min_sizes.append(int(self.input_size * ratio / 100)) + max_sizes.append(int(self.input_size * (ratio + step) / 100)) + if self.input_size == 300: + if basesize_ratio_range[0] == 0.15: # SSD300 COCO + min_sizes.insert(0, int(self.input_size * 7 / 100)) + max_sizes.insert(0, int(self.input_size * 15 / 100)) + elif basesize_ratio_range[0] == 0.2: # SSD300 VOC + min_sizes.insert(0, int(self.input_size * 10 / 100)) + max_sizes.insert(0, int(self.input_size * 20 / 100)) + else: + raise ValueError( + 'basesize_ratio_range[0] should be either 0.15' + 'or 0.2 when input_size is 300, got ' + f'{basesize_ratio_range[0]}.') + elif self.input_size == 512: + if basesize_ratio_range[0] == 0.1: # SSD512 COCO + min_sizes.insert(0, int(self.input_size * 4 / 100)) + max_sizes.insert(0, int(self.input_size * 10 / 100)) + elif basesize_ratio_range[0] == 0.15: # SSD512 VOC + min_sizes.insert(0, int(self.input_size * 7 / 100)) + max_sizes.insert(0, int(self.input_size * 15 / 100)) + else: + raise ValueError( + 'When not setting min_sizes and max_sizes,' + 'basesize_ratio_range[0] should be either 0.1' + 'or 0.15 when input_size is 512, got' + f' {basesize_ratio_range[0]}.') + else: + raise ValueError( + 'Only support 300 or 512 in SSDAnchorGenerator when ' + 'not setting min_sizes and max_sizes, ' + f'got {self.input_size}.') + + assert len(min_sizes) == len(max_sizes) == len(strides) + + anchor_ratios = [] + anchor_scales = [] + for k in range(len(self.strides)): + scales = [1., np.sqrt(max_sizes[k] / min_sizes[k])] + anchor_ratio = [1.] + for r in ratios[k]: + anchor_ratio += [1 / r, r] # 4 or 6 ratio + anchor_ratios.append(torch.Tensor(anchor_ratio)) + anchor_scales.append(torch.Tensor(scales)) + + self.base_sizes = min_sizes + self.scales = anchor_scales + self.ratios = anchor_ratios + self.scale_major = scale_major + self.center_offset = 0 + self.base_anchors = self.gen_base_anchors() + + def gen_base_anchors(self): + """Generate base anchors. + + Returns: + list(torch.Tensor): Base anchors of a feature grid in multiple \ + feature levels. + """ + multi_level_base_anchors = [] + for i, base_size in enumerate(self.base_sizes): + base_anchors = self.gen_single_level_base_anchors( + base_size, + scales=self.scales[i], + ratios=self.ratios[i], + center=self.centers[i]) + indices = list(range(len(self.ratios[i]))) + indices.insert(1, len(indices)) + base_anchors = torch.index_select(base_anchors, 0, + torch.LongTensor(indices)) + multi_level_base_anchors.append(base_anchors) + return multi_level_base_anchors + + def __repr__(self): + """str: a string that describes the module""" + indent_str = ' ' + repr_str = self.__class__.__name__ + '(\n' + repr_str += f'{indent_str}strides={self.strides},\n' + repr_str += f'{indent_str}scales={self.scales},\n' + repr_str += f'{indent_str}scale_major={self.scale_major},\n' + repr_str += f'{indent_str}input_size={self.input_size},\n' + repr_str += f'{indent_str}scales={self.scales},\n' + repr_str += f'{indent_str}ratios={self.ratios},\n' + repr_str += f'{indent_str}num_levels={self.num_levels},\n' + repr_str += f'{indent_str}base_sizes={self.base_sizes},\n' + repr_str += f'{indent_str}basesize_ratio_range=' + repr_str += f'{self.basesize_ratio_range})' + return repr_str + + +@PRIOR_GENERATORS.register_module() +class LegacyAnchorGenerator(AnchorGenerator): + """Legacy anchor generator used in MMDetection V1.x. + + Note: + Difference to the V2.0 anchor generator: + + 1. The center offset of V1.x anchors are set to be 0.5 rather than 0. + 2. The width/height are minused by 1 when calculating the anchors' \ + centers and corners to meet the V1.x coordinate system. + 3. The anchors' corners are quantized. + + Args: + strides (list[int] | list[tuple[int]]): Strides of anchors + in multiple feature levels. + ratios (list[float]): The list of ratios between the height and width + of anchors in a single level. + scales (list[int] | None): Anchor scales for anchors in a single level. + It cannot be set at the same time if `octave_base_scale` and + `scales_per_octave` are set. + base_sizes (list[int]): The basic sizes of anchors in multiple levels. + If None is given, strides will be used to generate base_sizes. + scale_major (bool): Whether to multiply scales first when generating + base anchors. If true, the anchors in the same row will have the + same scales. By default it is True in V2.0 + octave_base_scale (int): The base scale of octave. + scales_per_octave (int): Number of scales for each octave. + `octave_base_scale` and `scales_per_octave` are usually used in + retinanet and the `scales` should be None when they are set. + centers (list[tuple[float, float]] | None): The centers of the anchor + relative to the feature grid center in multiple feature levels. + By default it is set to be None and not used. It a list of float + is given, this list will be used to shift the centers of anchors. + center_offset (float): The offset of center in proportion to anchors' + width and height. By default it is 0.5 in V2.0 but it should be 0.5 + in v1.x models. + + Examples: + >>> from mmdet.core import LegacyAnchorGenerator + >>> self = LegacyAnchorGenerator( + >>> [16], [1.], [1.], [9], center_offset=0.5) + >>> all_anchors = self.grid_anchors(((2, 2),), device='cpu') + >>> print(all_anchors) + [tensor([[ 0., 0., 8., 8.], + [16., 0., 24., 8.], + [ 0., 16., 8., 24.], + [16., 16., 24., 24.]])] + """ + + def gen_single_level_base_anchors(self, + base_size, + scales, + ratios, + center=None): + """Generate base anchors of a single level. + + Note: + The width/height of anchors are minused by 1 when calculating \ + the centers and corners to meet the V1.x coordinate system. + + Args: + base_size (int | float): Basic size of an anchor. + scales (torch.Tensor): Scales of the anchor. + ratios (torch.Tensor): The ratio between between the height. + and width of anchors in a single level. + center (tuple[float], optional): The center of the base anchor + related to a single feature grid. Defaults to None. + + Returns: + torch.Tensor: Anchors in a single-level feature map. + """ + w = base_size + h = base_size + if center is None: + x_center = self.center_offset * (w - 1) + y_center = self.center_offset * (h - 1) + else: + x_center, y_center = center + + h_ratios = torch.sqrt(ratios) + w_ratios = 1 / h_ratios + if self.scale_major: + ws = (w * w_ratios[:, None] * scales[None, :]).view(-1) + hs = (h * h_ratios[:, None] * scales[None, :]).view(-1) + else: + ws = (w * scales[:, None] * w_ratios[None, :]).view(-1) + hs = (h * scales[:, None] * h_ratios[None, :]).view(-1) + + # use float anchor and the anchor's center is aligned with the + # pixel center + base_anchors = [ + x_center - 0.5 * (ws - 1), y_center - 0.5 * (hs - 1), + x_center + 0.5 * (ws - 1), y_center + 0.5 * (hs - 1) + ] + base_anchors = torch.stack(base_anchors, dim=-1).round() + + return base_anchors + + +@PRIOR_GENERATORS.register_module() +class LegacySSDAnchorGenerator(SSDAnchorGenerator, LegacyAnchorGenerator): + """Legacy anchor generator used in MMDetection V1.x. + + The difference between `LegacySSDAnchorGenerator` and `SSDAnchorGenerator` + can be found in `LegacyAnchorGenerator`. + """ + + def __init__(self, + strides, + ratios, + basesize_ratio_range, + input_size=300, + scale_major=True): + super(LegacySSDAnchorGenerator, self).__init__( + strides=strides, + ratios=ratios, + basesize_ratio_range=basesize_ratio_range, + input_size=input_size, + scale_major=scale_major) + self.centers = [((stride - 1) / 2., (stride - 1) / 2.) + for stride in strides] + self.base_anchors = self.gen_base_anchors() + + +@PRIOR_GENERATORS.register_module() +class YOLOAnchorGenerator(AnchorGenerator): + """Anchor generator for YOLO. + + Args: + strides (list[int] | list[tuple[int, int]]): Strides of anchors + in multiple feature levels. + base_sizes (list[list[tuple[int, int]]]): The basic sizes + of anchors in multiple levels. + """ + + def __init__(self, strides, base_sizes): + self.strides = [_pair(stride) for stride in strides] + self.centers = [(stride[0] / 2., stride[1] / 2.) + for stride in self.strides] + self.base_sizes = [] + num_anchor_per_level = len(base_sizes[0]) + for base_sizes_per_level in base_sizes: + assert num_anchor_per_level == len(base_sizes_per_level) + self.base_sizes.append( + [_pair(base_size) for base_size in base_sizes_per_level]) + self.base_anchors = self.gen_base_anchors() + + @property + def num_levels(self): + """int: number of feature levels that the generator will be applied""" + return len(self.base_sizes) + + def gen_base_anchors(self): + """Generate base anchors. + + Returns: + list(torch.Tensor): Base anchors of a feature grid in multiple \ + feature levels. + """ + multi_level_base_anchors = [] + for i, base_sizes_per_level in enumerate(self.base_sizes): + center = None + if self.centers is not None: + center = self.centers[i] + multi_level_base_anchors.append( + self.gen_single_level_base_anchors(base_sizes_per_level, + center)) + return multi_level_base_anchors + + def gen_single_level_base_anchors(self, base_sizes_per_level, center=None): + """Generate base anchors of a single level. + + Args: + base_sizes_per_level (list[tuple[int, int]]): Basic sizes of + anchors. + center (tuple[float], optional): The center of the base anchor + related to a single feature grid. Defaults to None. + + Returns: + torch.Tensor: Anchors in a single-level feature maps. + """ + x_center, y_center = center + base_anchors = [] + for base_size in base_sizes_per_level: + w, h = base_size + + # use float anchor and the anchor's center is aligned with the + # pixel center + base_anchor = torch.Tensor([ + x_center - 0.5 * w, y_center - 0.5 * h, x_center + 0.5 * w, + y_center + 0.5 * h + ]) + base_anchors.append(base_anchor) + base_anchors = torch.stack(base_anchors, dim=0) + + return base_anchors + + def responsible_flags(self, featmap_sizes, gt_bboxes, device='cuda'): + """Generate responsible anchor flags of grid cells in multiple scales. + + Args: + featmap_sizes (list(tuple)): List of feature map sizes in multiple + feature levels. + gt_bboxes (Tensor): Ground truth boxes, shape (n, 4). + device (str): Device where the anchors will be put on. + + Return: + list(torch.Tensor): responsible flags of anchors in multiple level + """ + assert self.num_levels == len(featmap_sizes) + multi_level_responsible_flags = [] + for i in range(self.num_levels): + anchor_stride = self.strides[i] + flags = self.single_level_responsible_flags( + featmap_sizes[i], + gt_bboxes, + anchor_stride, + self.num_base_anchors[i], + device=device) + multi_level_responsible_flags.append(flags) + return multi_level_responsible_flags + + def single_level_responsible_flags(self, + featmap_size, + gt_bboxes, + stride, + num_base_anchors, + device='cuda'): + """Generate the responsible flags of anchor in a single feature map. + + Args: + featmap_size (tuple[int]): The size of feature maps. + gt_bboxes (Tensor): Ground truth boxes, shape (n, 4). + stride (tuple(int)): stride of current level + num_base_anchors (int): The number of base anchors. + device (str, optional): Device where the flags will be put on. + Defaults to 'cuda'. + + Returns: + torch.Tensor: The valid flags of each anchor in a single level \ + feature map. + """ + feat_h, feat_w = featmap_size + gt_bboxes_cx = ((gt_bboxes[:, 0] + gt_bboxes[:, 2]) * 0.5).to(device) + gt_bboxes_cy = ((gt_bboxes[:, 1] + gt_bboxes[:, 3]) * 0.5).to(device) + gt_bboxes_grid_x = torch.floor(gt_bboxes_cx / stride[0]).long() + gt_bboxes_grid_y = torch.floor(gt_bboxes_cy / stride[1]).long() + + # row major indexing + gt_bboxes_grid_idx = gt_bboxes_grid_y * feat_w + gt_bboxes_grid_x + + responsible_grid = torch.zeros( + feat_h * feat_w, dtype=torch.uint8, device=device) + responsible_grid[gt_bboxes_grid_idx] = 1 + + responsible_grid = responsible_grid[:, None].expand( + responsible_grid.size(0), num_base_anchors).contiguous().view(-1) + return responsible_grid diff --git a/mmdet/core/anchor/builder.py b/mmdet/core/anchor/builder.py new file mode 100644 index 0000000..ddb25ad --- /dev/null +++ b/mmdet/core/anchor/builder.py @@ -0,0 +1,19 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +from mmcv.utils import Registry, build_from_cfg + +PRIOR_GENERATORS = Registry('Generator for anchors and points') + +ANCHOR_GENERATORS = PRIOR_GENERATORS + + +def build_prior_generator(cfg, default_args=None): + return build_from_cfg(cfg, PRIOR_GENERATORS, default_args) + + +def build_anchor_generator(cfg, default_args=None): + warnings.warn( + '``build_anchor_generator`` would be deprecated soon, please use ' + '``build_prior_generator`` ') + return build_prior_generator(cfg, default_args=default_args) diff --git a/mmdet/core/anchor/point_generator.py b/mmdet/core/anchor/point_generator.py new file mode 100644 index 0000000..cc9c388 --- /dev/null +++ b/mmdet/core/anchor/point_generator.py @@ -0,0 +1,263 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import torch +from torch.nn.modules.utils import _pair + +from .builder import PRIOR_GENERATORS + + +@PRIOR_GENERATORS.register_module() +class PointGenerator: + + def _meshgrid(self, x, y, row_major=True): + xx = x.repeat(len(y)) + yy = y.view(-1, 1).repeat(1, len(x)).view(-1) + if row_major: + return xx, yy + else: + return yy, xx + + def grid_points(self, featmap_size, stride=16, device='cuda'): + feat_h, feat_w = featmap_size + shift_x = torch.arange(0., feat_w, device=device) * stride + shift_y = torch.arange(0., feat_h, device=device) * stride + shift_xx, shift_yy = self._meshgrid(shift_x, shift_y) + stride = shift_x.new_full((shift_xx.shape[0], ), stride) + shifts = torch.stack([shift_xx, shift_yy, stride], dim=-1) + all_points = shifts.to(device) + return all_points + + def valid_flags(self, featmap_size, valid_size, device='cuda'): + feat_h, feat_w = featmap_size + valid_h, valid_w = valid_size + assert valid_h <= feat_h and valid_w <= feat_w + valid_x = torch.zeros(feat_w, dtype=torch.bool, device=device) + valid_y = torch.zeros(feat_h, dtype=torch.bool, device=device) + valid_x[:valid_w] = 1 + valid_y[:valid_h] = 1 + valid_xx, valid_yy = self._meshgrid(valid_x, valid_y) + valid = valid_xx & valid_yy + return valid + + +@PRIOR_GENERATORS.register_module() +class MlvlPointGenerator: + """Standard points generator for multi-level (Mlvl) feature maps in 2D + points-based detectors. + + Args: + strides (list[int] | list[tuple[int, int]]): Strides of anchors + in multiple feature levels in order (w, h). + offset (float): The offset of points, the value is normalized with + corresponding stride. Defaults to 0.5. + """ + + def __init__(self, strides, offset=0.5): + self.strides = [_pair(stride) for stride in strides] + self.offset = offset + + @property + def num_levels(self): + """int: number of feature levels that the generator will be applied""" + return len(self.strides) + + @property + def num_base_priors(self): + """list[int]: The number of priors (points) at a point + on the feature grid""" + return [1 for _ in range(len(self.strides))] + + def _meshgrid(self, x, y, row_major=True): + yy, xx = torch.meshgrid(y, x) + if row_major: + # warning .flatten() would cause error in ONNX exporting + # have to use reshape here + return xx.reshape(-1), yy.reshape(-1) + + else: + return yy.reshape(-1), xx.reshape(-1) + + def grid_priors(self, + featmap_sizes, + dtype=torch.float32, + device='cuda', + with_stride=False): + """Generate grid points of multiple feature levels. + + Args: + featmap_sizes (list[tuple]): List of feature map sizes in + multiple feature levels, each size arrange as + as (h, w). + dtype (:obj:`dtype`): Dtype of priors. Default: torch.float32. + device (str): The device where the anchors will be put on. + with_stride (bool): Whether to concatenate the stride to + the last dimension of points. + + Return: + list[torch.Tensor]: Points of multiple feature levels. + The sizes of each tensor should be (N, 2) when with stride is + ``False``, where N = width * height, width and height + are the sizes of the corresponding feature level, + and the last dimension 2 represent (coord_x, coord_y), + otherwise the shape should be (N, 4), + and the last dimension 4 represent + (coord_x, coord_y, stride_w, stride_h). + """ + + assert self.num_levels == len(featmap_sizes) + multi_level_priors = [] + for i in range(self.num_levels): + priors = self.single_level_grid_priors( + featmap_sizes[i], + level_idx=i, + dtype=dtype, + device=device, + with_stride=with_stride) + multi_level_priors.append(priors) + return multi_level_priors + + def single_level_grid_priors(self, + featmap_size, + level_idx, + dtype=torch.float32, + device='cuda', + with_stride=False): + """Generate grid Points of a single level. + + Note: + This function is usually called by method ``self.grid_priors``. + + Args: + featmap_size (tuple[int]): Size of the feature maps, arrange as + (h, w). + level_idx (int): The index of corresponding feature map level. + dtype (:obj:`dtype`): Dtype of priors. Default: torch.float32. + device (str, optional): The device the tensor will be put on. + Defaults to 'cuda'. + with_stride (bool): Concatenate the stride to the last dimension + of points. + + Return: + Tensor: Points of single feature levels. + The shape of tensor should be (N, 2) when with stride is + ``False``, where N = width * height, width and height + are the sizes of the corresponding feature level, + and the last dimension 2 represent (coord_x, coord_y), + otherwise the shape should be (N, 4), + and the last dimension 4 represent + (coord_x, coord_y, stride_w, stride_h). + """ + feat_h, feat_w = featmap_size + stride_w, stride_h = self.strides[level_idx] + shift_x = (torch.arange(0, feat_w, device=device) + + self.offset) * stride_w + # keep featmap_size as Tensor instead of int, so that we + # can convert to ONNX correctly + shift_x = shift_x.to(dtype) + + shift_y = (torch.arange(0, feat_h, device=device) + + self.offset) * stride_h + # keep featmap_size as Tensor instead of int, so that we + # can convert to ONNX correctly + shift_y = shift_y.to(dtype) + shift_xx, shift_yy = self._meshgrid(shift_x, shift_y) + if not with_stride: + shifts = torch.stack([shift_xx, shift_yy], dim=-1) + else: + # use `shape[0]` instead of `len(shift_xx)` for ONNX export + stride_w = shift_xx.new_full((shift_xx.shape[0], ), + stride_w).to(dtype) + stride_h = shift_xx.new_full((shift_yy.shape[0], ), + stride_h).to(dtype) + shifts = torch.stack([shift_xx, shift_yy, stride_w, stride_h], + dim=-1) + all_points = shifts.to(device) + return all_points + + def valid_flags(self, featmap_sizes, pad_shape, device='cuda'): + """Generate valid flags of points of multiple feature levels. + + Args: + featmap_sizes (list(tuple)): List of feature map sizes in + multiple feature levels, each size arrange as + as (h, w). + pad_shape (tuple(int)): The padded shape of the image, + arrange as (h, w). + device (str): The device where the anchors will be put on. + + Return: + list(torch.Tensor): Valid flags of points of multiple levels. + """ + assert self.num_levels == len(featmap_sizes) + multi_level_flags = [] + for i in range(self.num_levels): + point_stride = self.strides[i] + feat_h, feat_w = featmap_sizes[i] + h, w = pad_shape[:2] + valid_feat_h = min(int(np.ceil(h / point_stride[1])), feat_h) + valid_feat_w = min(int(np.ceil(w / point_stride[0])), feat_w) + flags = self.single_level_valid_flags((feat_h, feat_w), + (valid_feat_h, valid_feat_w), + device=device) + multi_level_flags.append(flags) + return multi_level_flags + + def single_level_valid_flags(self, + featmap_size, + valid_size, + device='cuda'): + """Generate the valid flags of points of a single feature map. + + Args: + featmap_size (tuple[int]): The size of feature maps, arrange as + as (h, w). + valid_size (tuple[int]): The valid size of the feature maps. + The size arrange as as (h, w). + device (str, optional): The device where the flags will be put on. + Defaults to 'cuda'. + + Returns: + torch.Tensor: The valid flags of each points in a single level \ + feature map. + """ + feat_h, feat_w = featmap_size + valid_h, valid_w = valid_size + assert valid_h <= feat_h and valid_w <= feat_w + valid_x = torch.zeros(feat_w, dtype=torch.bool, device=device) + valid_y = torch.zeros(feat_h, dtype=torch.bool, device=device) + valid_x[:valid_w] = 1 + valid_y[:valid_h] = 1 + valid_xx, valid_yy = self._meshgrid(valid_x, valid_y) + valid = valid_xx & valid_yy + return valid + + def sparse_priors(self, + prior_idxs, + featmap_size, + level_idx, + dtype=torch.float32, + device='cuda'): + """Generate sparse points according to the ``prior_idxs``. + + Args: + prior_idxs (Tensor): The index of corresponding anchors + in the feature map. + featmap_size (tuple[int]): feature map size arrange as (w, h). + level_idx (int): The level index of corresponding feature + map. + dtype (obj:`torch.dtype`): Date type of points. Defaults to + ``torch.float32``. + device (obj:`torch.device`): The device where the points is + located. + Returns: + Tensor: Anchor with shape (N, 2), N should be equal to + the length of ``prior_idxs``. And last dimension + 2 represent (coord_x, coord_y). + """ + height, width = featmap_size + x = (prior_idxs % width + self.offset) * self.strides[level_idx][0] + y = ((prior_idxs // width) % height + + self.offset) * self.strides[level_idx][1] + prioris = torch.stack([x, y], 1).to(dtype) + prioris = prioris.to(device) + return prioris diff --git a/mmdet/core/anchor/utils.py b/mmdet/core/anchor/utils.py new file mode 100644 index 0000000..c2f2024 --- /dev/null +++ b/mmdet/core/anchor/utils.py @@ -0,0 +1,72 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + + +def images_to_levels(target, num_levels): + """Convert targets by image to targets by feature level. + + [target_img0, target_img1] -> [target_level0, target_level1, ...] + """ + target = torch.stack(target, 0) + level_targets = [] + start = 0 + for n in num_levels: + end = start + n + # level_targets.append(target[:, start:end].squeeze(0)) + level_targets.append(target[:, start:end]) + start = end + return level_targets + + +def anchor_inside_flags(flat_anchors, + valid_flags, + img_shape, + allowed_border=0): + """Check whether the anchors are inside the border. + + Args: + flat_anchors (torch.Tensor): Flatten anchors, shape (n, 4). + valid_flags (torch.Tensor): An existing valid flags of anchors. + img_shape (tuple(int)): Shape of current image. + allowed_border (int, optional): The border to allow the valid anchor. + Defaults to 0. + + Returns: + torch.Tensor: Flags indicating whether the anchors are inside a \ + valid range. + """ + img_h, img_w = img_shape[:2] + if allowed_border >= 0: + inside_flags = valid_flags & \ + (flat_anchors[:, 0] >= -allowed_border) & \ + (flat_anchors[:, 1] >= -allowed_border) & \ + (flat_anchors[:, 2] < img_w + allowed_border) & \ + (flat_anchors[:, 3] < img_h + allowed_border) + else: + inside_flags = valid_flags + return inside_flags + + +def calc_region(bbox, ratio, featmap_size=None): + """Calculate a proportional bbox region. + + The bbox center are fixed and the new h' and w' is h * ratio and w * ratio. + + Args: + bbox (Tensor): Bboxes to calculate regions, shape (n, 4). + ratio (float): Ratio of the output region. + featmap_size (tuple): Feature map size used for clipping the boundary. + + Returns: + tuple: x1, y1, x2, y2 + """ + x1 = torch.round((1 - ratio) * bbox[0] + ratio * bbox[2]).long() + y1 = torch.round((1 - ratio) * bbox[1] + ratio * bbox[3]).long() + x2 = torch.round(ratio * bbox[0] + (1 - ratio) * bbox[2]).long() + y2 = torch.round(ratio * bbox[1] + (1 - ratio) * bbox[3]).long() + if featmap_size is not None: + x1 = x1.clamp(min=0, max=featmap_size[1]) + y1 = y1.clamp(min=0, max=featmap_size[0]) + x2 = x2.clamp(min=0, max=featmap_size[1]) + y2 = y2.clamp(min=0, max=featmap_size[0]) + return (x1, y1, x2, y2) diff --git a/mmdet/core/bbox/__init__.py b/mmdet/core/bbox/__init__.py new file mode 100644 index 0000000..371eba1 --- /dev/null +++ b/mmdet/core/bbox/__init__.py @@ -0,0 +1,28 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .assigners import (AssignResult, BaseAssigner, CenterRegionAssigner, + MaxIoUAssigner, RegionAssigner) +from .builder import build_assigner, build_bbox_coder, build_sampler +from .coder import (BaseBBoxCoder, DeltaXYWHBBoxCoder, DistancePointBBoxCoder, + PseudoBBoxCoder, TBLRBBoxCoder) +from .iou_calculators import BboxOverlaps2D, bbox_overlaps +from .samplers import (BaseSampler, CombinedSampler, + InstanceBalancedPosSampler, IoUBalancedNegSampler, + OHEMSampler, PseudoSampler, RandomSampler, + SamplingResult, ScoreHLRSampler) +from .transforms import (bbox2distance, bbox2result, bbox2roi, + bbox_cxcywh_to_xyxy, bbox_flip, bbox_mapping, + bbox_mapping_back, bbox_rescale, bbox_xyxy_to_cxcywh, + distance2bbox, find_inside_bboxes, roi2bbox) + +__all__ = [ + 'bbox_overlaps', 'BboxOverlaps2D', 'BaseAssigner', 'MaxIoUAssigner', + 'AssignResult', 'BaseSampler', 'PseudoSampler', 'RandomSampler', + 'InstanceBalancedPosSampler', 'IoUBalancedNegSampler', 'CombinedSampler', + 'OHEMSampler', 'SamplingResult', 'ScoreHLRSampler', 'build_assigner', + 'build_sampler', 'bbox_flip', 'bbox_mapping', 'bbox_mapping_back', + 'bbox2roi', 'roi2bbox', 'bbox2result', 'distance2bbox', 'bbox2distance', + 'build_bbox_coder', 'BaseBBoxCoder', 'PseudoBBoxCoder', + 'DeltaXYWHBBoxCoder', 'TBLRBBoxCoder', 'DistancePointBBoxCoder', + 'CenterRegionAssigner', 'bbox_rescale', 'bbox_cxcywh_to_xyxy', + 'bbox_xyxy_to_cxcywh', 'RegionAssigner', 'find_inside_bboxes' +] diff --git a/mmdet/core/bbox/assigners/__init__.py b/mmdet/core/bbox/assigners/__init__.py new file mode 100644 index 0000000..d6480a7 --- /dev/null +++ b/mmdet/core/bbox/assigners/__init__.py @@ -0,0 +1,25 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .approx_max_iou_assigner import ApproxMaxIoUAssigner +from .ascend_assign_result import AscendAssignResult +from .ascend_max_iou_assigner import AscendMaxIoUAssigner +from .assign_result import AssignResult +from .atss_assigner import ATSSAssigner +from .base_assigner import BaseAssigner +from .center_region_assigner import CenterRegionAssigner +from .grid_assigner import GridAssigner +from .hungarian_assigner import HungarianAssigner +from .mask_hungarian_assigner import MaskHungarianAssigner +from .max_iou_assigner import MaxIoUAssigner +from .point_assigner import PointAssigner +from .region_assigner import RegionAssigner +from .sim_ota_assigner import SimOTAAssigner +from .task_aligned_assigner import TaskAlignedAssigner +from .uniform_assigner import UniformAssigner + +__all__ = [ + 'BaseAssigner', 'MaxIoUAssigner', 'ApproxMaxIoUAssigner', 'AssignResult', + 'PointAssigner', 'ATSSAssigner', 'CenterRegionAssigner', 'GridAssigner', + 'HungarianAssigner', 'RegionAssigner', 'UniformAssigner', 'SimOTAAssigner', + 'TaskAlignedAssigner', 'MaskHungarianAssigner', 'AscendAssignResult', + 'AscendMaxIoUAssigner' +] diff --git a/mmdet/core/bbox/assigners/approx_max_iou_assigner.py b/mmdet/core/bbox/assigners/approx_max_iou_assigner.py new file mode 100644 index 0000000..304d09c --- /dev/null +++ b/mmdet/core/bbox/assigners/approx_max_iou_assigner.py @@ -0,0 +1,146 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from ..builder import BBOX_ASSIGNERS +from ..iou_calculators import build_iou_calculator +from .max_iou_assigner import MaxIoUAssigner + + +@BBOX_ASSIGNERS.register_module() +class ApproxMaxIoUAssigner(MaxIoUAssigner): + """Assign a corresponding gt bbox or background to each bbox. + + Each proposals will be assigned with an integer indicating the ground truth + index. (semi-positive index: gt label (0-based), -1: background) + + - -1: negative sample, no assigned gt + - semi-positive integer: positive sample, index (0-based) of assigned gt + + Args: + pos_iou_thr (float): IoU threshold for positive bboxes. + neg_iou_thr (float or tuple): IoU threshold for negative bboxes. + min_pos_iou (float): Minimum iou for a bbox to be considered as a + positive bbox. Positive samples can have smaller IoU than + pos_iou_thr due to the 4th step (assign max IoU sample to each gt). + gt_max_assign_all (bool): Whether to assign all bboxes with the same + highest overlap with some gt to that gt. + ignore_iof_thr (float): IoF threshold for ignoring bboxes (if + `gt_bboxes_ignore` is specified). Negative values mean not + ignoring any bboxes. + ignore_wrt_candidates (bool): Whether to compute the iof between + `bboxes` and `gt_bboxes_ignore`, or the contrary. + match_low_quality (bool): Whether to allow quality matches. This is + usually allowed for RPN and single stage detectors, but not allowed + in the second stage. + gpu_assign_thr (int): The upper bound of the number of GT for GPU + assign. When the number of gt is above this threshold, will assign + on CPU device. Negative values mean not assign on CPU. + """ + + def __init__(self, + pos_iou_thr, + neg_iou_thr, + min_pos_iou=.0, + gt_max_assign_all=True, + ignore_iof_thr=-1, + ignore_wrt_candidates=True, + match_low_quality=True, + gpu_assign_thr=-1, + iou_calculator=dict(type='BboxOverlaps2D')): + self.pos_iou_thr = pos_iou_thr + self.neg_iou_thr = neg_iou_thr + self.min_pos_iou = min_pos_iou + self.gt_max_assign_all = gt_max_assign_all + self.ignore_iof_thr = ignore_iof_thr + self.ignore_wrt_candidates = ignore_wrt_candidates + self.gpu_assign_thr = gpu_assign_thr + self.match_low_quality = match_low_quality + self.iou_calculator = build_iou_calculator(iou_calculator) + + def assign(self, + approxs, + squares, + approxs_per_octave, + gt_bboxes, + gt_bboxes_ignore=None, + gt_labels=None): + """Assign gt to approxs. + + This method assign a gt bbox to each group of approxs (bboxes), + each group of approxs is represent by a base approx (bbox) and + will be assigned with -1, or a semi-positive number. + background_label (-1) means negative sample, + semi-positive number is the index (0-based) of assigned gt. + The assignment is done in following steps, the order matters. + + 1. assign every bbox to background_label (-1) + 2. use the max IoU of each group of approxs to assign + 2. assign proposals whose iou with all gts < neg_iou_thr to background + 3. for each bbox, if the iou with its nearest gt >= pos_iou_thr, + assign it to that bbox + 4. for each gt bbox, assign its nearest proposals (may be more than + one) to itself + + Args: + approxs (Tensor): Bounding boxes to be assigned, + shape(approxs_per_octave*n, 4). + squares (Tensor): Base Bounding boxes to be assigned, + shape(n, 4). + approxs_per_octave (int): number of approxs per octave + gt_bboxes (Tensor): Groundtruth boxes, shape (k, 4). + gt_bboxes_ignore (Tensor, optional): Ground truth bboxes that are + labelled as `ignored`, e.g., crowd boxes in COCO. + gt_labels (Tensor, optional): Label of gt_bboxes, shape (k, ). + + Returns: + :obj:`AssignResult`: The assign result. + """ + num_squares = squares.size(0) + num_gts = gt_bboxes.size(0) + + if num_squares == 0 or num_gts == 0: + # No predictions and/or truth, return empty assignment + overlaps = approxs.new(num_gts, num_squares) + assign_result = self.assign_wrt_overlaps(overlaps, gt_labels) + return assign_result + + # re-organize anchors by approxs_per_octave x num_squares + approxs = torch.transpose( + approxs.view(num_squares, approxs_per_octave, 4), 0, + 1).contiguous().view(-1, 4) + assign_on_cpu = True if (self.gpu_assign_thr > 0) and ( + num_gts > self.gpu_assign_thr) else False + # compute overlap and assign gt on CPU when number of GT is large + if assign_on_cpu: + device = approxs.device + approxs = approxs.cpu() + gt_bboxes = gt_bboxes.cpu() + if gt_bboxes_ignore is not None: + gt_bboxes_ignore = gt_bboxes_ignore.cpu() + if gt_labels is not None: + gt_labels = gt_labels.cpu() + all_overlaps = self.iou_calculator(approxs, gt_bboxes) + + overlaps, _ = all_overlaps.view(approxs_per_octave, num_squares, + num_gts).max(dim=0) + overlaps = torch.transpose(overlaps, 0, 1) + + if (self.ignore_iof_thr > 0 and gt_bboxes_ignore is not None + and gt_bboxes_ignore.numel() > 0 and squares.numel() > 0): + if self.ignore_wrt_candidates: + ignore_overlaps = self.iou_calculator( + squares, gt_bboxes_ignore, mode='iof') + ignore_max_overlaps, _ = ignore_overlaps.max(dim=1) + else: + ignore_overlaps = self.iou_calculator( + gt_bboxes_ignore, squares, mode='iof') + ignore_max_overlaps, _ = ignore_overlaps.max(dim=0) + overlaps[:, ignore_max_overlaps > self.ignore_iof_thr] = -1 + + assign_result = self.assign_wrt_overlaps(overlaps, gt_labels) + if assign_on_cpu: + assign_result.gt_inds = assign_result.gt_inds.to(device) + assign_result.max_overlaps = assign_result.max_overlaps.to(device) + if assign_result.labels is not None: + assign_result.labels = assign_result.labels.to(device) + return assign_result diff --git a/mmdet/core/bbox/assigners/ascend_assign_result.py b/mmdet/core/bbox/assigners/ascend_assign_result.py new file mode 100644 index 0000000..03d33c2 --- /dev/null +++ b/mmdet/core/bbox/assigners/ascend_assign_result.py @@ -0,0 +1,34 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmdet.utils import util_mixins + + +class AscendAssignResult(util_mixins.NiceRepr): + """Stores ascend assignments between predicted and truth boxes. + + Arguments: + batch_num_gts (list[int]): the number of truth boxes considered. + batch_pos_mask (IntTensor): Positive samples mask in all images. + batch_neg_mask (IntTensor): Negative samples mask in all images. + batch_max_overlaps (FloatTensor): The max overlaps of all bboxes + and ground truth boxes. + batch_anchor_gt_indes(None | LongTensor): The assigned truth + box index of all anchors. + batch_anchor_gt_labels(None | LongTensor): The gt labels + of all anchors + """ + + def __init__(self, + batch_num_gts, + batch_pos_mask, + batch_neg_mask, + batch_max_overlaps, + batch_anchor_gt_indes=None, + batch_anchor_gt_labels=None): + self.batch_num_gts = batch_num_gts + self.batch_pos_mask = batch_pos_mask + self.batch_neg_mask = batch_neg_mask + self.batch_max_overlaps = batch_max_overlaps + self.batch_anchor_gt_indes = batch_anchor_gt_indes + self.batch_anchor_gt_labels = batch_anchor_gt_labels + # Interface for possible user-defined properties + self._extra_properties = {} diff --git a/mmdet/core/bbox/assigners/ascend_max_iou_assigner.py b/mmdet/core/bbox/assigners/ascend_max_iou_assigner.py new file mode 100644 index 0000000..f8f528a --- /dev/null +++ b/mmdet/core/bbox/assigners/ascend_max_iou_assigner.py @@ -0,0 +1,178 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from ....utils import masked_fill +from ..builder import BBOX_ASSIGNERS +from ..iou_calculators import build_iou_calculator +from .ascend_assign_result import AscendAssignResult +from .base_assigner import BaseAssigner + + +@BBOX_ASSIGNERS.register_module() +class AscendMaxIoUAssigner(BaseAssigner): + """Assign a corresponding gt bbox or background to each bbox. + + Each proposals will be assigned with `-1`, or a semi-positive integer + indicating the ground truth index. + + - -1: negative sample, no assigned gt + - semi-positive integer: positive sample, index (0-based) of assigned gt + + Args: + pos_iou_thr (float): IoU threshold for positive bboxes. + neg_iou_thr (float or tuple): IoU threshold for negative bboxes. + min_pos_iou (float): Minimum iou for a bbox to be considered as a + positive bbox. Positive samples can have smaller IoU than + pos_iou_thr due to the 4th step (assign max IoU sample to each gt). + `min_pos_iou` is set to avoid assigning bboxes that have extremely + small iou with GT as positive samples. It brings about 0.3 mAP + improvements in 1x schedule but does not affect the performance of + 3x schedule. More comparisons can be found in + `PR #7464 `_. + gt_max_assign_all (bool): Whether to assign all bboxes with the same + highest overlap with some gt to that gt. + ignore_iof_thr (float): IoF threshold for ignoring bboxes (if + `gt_bboxes_ignore` is specified). Negative values mean not + ignoring any bboxes. + ignore_wrt_candidates (bool): Whether to compute the iof between + `bboxes` and `gt_bboxes_ignore`, or the contrary. + match_low_quality (bool): Whether to allow low quality matches. This is + usually allowed for RPN and single stage detectors, but not allowed + in the second stage. Details are demonstrated in Step 4. + gpu_assign_thr (int): The upper bound of the number of GT for GPU + assign. When the number of gt is above this threshold, will assign + on CPU device. Negative values mean not assign on CPU. + """ + + def __init__(self, + pos_iou_thr, + neg_iou_thr, + min_pos_iou=.0, + gt_max_assign_all=True, + ignore_iof_thr=-1, + ignore_wrt_candidates=True, + match_low_quality=True, + gpu_assign_thr=-1, + iou_calculator=dict(type='BboxOverlaps2D')): + self.pos_iou_thr = pos_iou_thr + self.neg_iou_thr = neg_iou_thr + self.min_pos_iou = min_pos_iou + self.gt_max_assign_all = gt_max_assign_all + self.ignore_iof_thr = ignore_iof_thr + self.ignore_wrt_candidates = ignore_wrt_candidates + self.gpu_assign_thr = gpu_assign_thr + self.match_low_quality = match_low_quality + self.iou_calculator = build_iou_calculator(iou_calculator) + + def assign(self, + batch_bboxes, + batch_gt_bboxes, + batch_gt_bboxes_ignore=None, + batch_gt_labels=None, + batch_bboxes_ignore_mask=None, + batch_num_gts=None): + """Assign gt to bboxes. + + Args: + batch_bboxes (Tensor): Bounding boxes to be assigned, + shape(b, n, 4). + batch_gt_bboxes (Tensor): Ground truth boxes, + shape (b, k, 4). + batch_gt_bboxes_ignore (Tensor, optional): Ground truth + bboxes that are labelled as `ignored`, + e.g., crowd boxes in COCO. + batch_gt_labels (Tensor, optional): Label of gt_bboxes, + shape (b, k, ). + batch_bboxes_ignore_mask: (b, n) + batch_num_gts:(b, ) + Returns: + :obj:`AssignResult`: The assign result. + """ + batch_overlaps = self.iou_calculator(batch_gt_bboxes, batch_bboxes) + batch_overlaps = masked_fill( + batch_overlaps, + batch_bboxes_ignore_mask.unsqueeze(1).float(), + -1, + neg=True) + if self.ignore_iof_thr > 0 and batch_gt_bboxes_ignore is not None: + if self.ignore_wrt_candidates: + batch_ignore_overlaps = self.iou_calculator( + batch_bboxes, batch_gt_bboxes_ignore, mode='iof') + batch_ignore_overlaps = masked_fill(batch_ignore_overlaps, + batch_bboxes_ignore_mask, + -1) + batch_ignore_max_overlaps, _ = batch_ignore_overlaps.max(dim=2) + else: + batch_ignore_overlaps = self.iou_calculator( + batch_gt_bboxes_ignore, batch_bboxes, mode='iof') + batch_ignore_overlaps = masked_fill(batch_ignore_overlaps, + batch_bboxes_ignore_mask, + -1) + batch_ignore_max_overlaps, _ = \ + batch_ignore_overlaps.max(dim=1) + batch_ignore_mask = \ + batch_ignore_max_overlaps > self.ignore_iof_thr + batch_overlaps = masked_fill(batch_overlaps, batch_ignore_mask, -1) + batch_assign_result = self.batch_assign_wrt_overlaps( + batch_overlaps, batch_gt_labels, batch_num_gts) + return batch_assign_result + + def batch_assign_wrt_overlaps(self, + batch_overlaps, + batch_gt_labels=None, + batch_num_gts=None): + num_images, num_gts, num_bboxes = batch_overlaps.size() + batch_max_overlaps, batch_argmax_overlaps = batch_overlaps.max(dim=1) + if isinstance(self.neg_iou_thr, float): + batch_neg_mask = \ + ((batch_max_overlaps >= 0) + & (batch_max_overlaps < self.neg_iou_thr)).int() + elif isinstance(self.neg_iou_thr, tuple): + assert len(self.neg_iou_thr) == 2 + batch_neg_mask = \ + ((batch_max_overlaps >= self.neg_iou_thr[0]) + & (batch_max_overlaps < self.neg_iou_thr[1])).int() + else: + batch_neg_mask = torch.zeros( + batch_max_overlaps.size(), + dtype=torch.int, + device=batch_max_overlaps.device) + batch_pos_mask = (batch_max_overlaps >= self.pos_iou_thr).int() + if self.match_low_quality: + batch_gt_max_overlaps, batch_gt_argmax_overlaps = \ + batch_overlaps.max(dim=2) + batch_index_bool = (batch_gt_max_overlaps >= self.min_pos_iou) & \ + (batch_gt_max_overlaps > 0) + if self.gt_max_assign_all: + pos_inds_low_quality = \ + (batch_overlaps == batch_gt_max_overlaps.unsqueeze(2)) & \ + batch_index_bool.unsqueeze(2) + for i in range(num_gts): + pos_inds_low_quality_gt = pos_inds_low_quality[:, i, :] + batch_argmax_overlaps[pos_inds_low_quality_gt] = i + batch_pos_mask[pos_inds_low_quality_gt] = 1 + else: + index_temp = torch.arange( + 0, num_gts, device=batch_max_overlaps.device) + for index_image in range(num_images): + gt_argmax_overlaps = batch_gt_argmax_overlaps[index_image] + index_bool = batch_index_bool[index_image] + pos_inds_low_quality = gt_argmax_overlaps[index_bool] + batch_argmax_overlaps[index_image][pos_inds_low_quality] \ + = index_temp[index_bool] + batch_pos_mask[index_image][pos_inds_low_quality] = 1 + batch_neg_mask = batch_neg_mask * (1 - batch_pos_mask) + if batch_gt_labels is not None: + batch_anchor_gt_labels = torch.zeros((num_images, num_bboxes), + dtype=batch_gt_labels.dtype, + device=batch_gt_labels.device) + for index_image in range(num_images): + batch_anchor_gt_labels[index_image] = torch.index_select( + batch_gt_labels[index_image], 0, + batch_argmax_overlaps[index_image]) + else: + batch_anchor_gt_labels = None + return AscendAssignResult(batch_num_gts, batch_pos_mask, + batch_neg_mask, batch_max_overlaps, + batch_argmax_overlaps, + batch_anchor_gt_labels) diff --git a/mmdet/core/bbox/assigners/assign_result.py b/mmdet/core/bbox/assigners/assign_result.py new file mode 100644 index 0000000..488010b --- /dev/null +++ b/mmdet/core/bbox/assigners/assign_result.py @@ -0,0 +1,206 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from mmdet.utils import util_mixins + + +class AssignResult(util_mixins.NiceRepr): + """Stores assignments between predicted and truth boxes. + + Attributes: + num_gts (int): the number of truth boxes considered when computing this + assignment + + gt_inds (LongTensor): for each predicted box indicates the 1-based + index of the assigned truth box. 0 means unassigned and -1 means + ignore. + + max_overlaps (FloatTensor): the iou between the predicted box and its + assigned truth box. + + labels (None | LongTensor): If specified, for each predicted box + indicates the category label of the assigned truth box. + + Example: + >>> # An assign result between 4 predicted boxes and 9 true boxes + >>> # where only two boxes were assigned. + >>> num_gts = 9 + >>> max_overlaps = torch.LongTensor([0, .5, .9, 0]) + >>> gt_inds = torch.LongTensor([-1, 1, 2, 0]) + >>> labels = torch.LongTensor([0, 3, 4, 0]) + >>> self = AssignResult(num_gts, gt_inds, max_overlaps, labels) + >>> print(str(self)) # xdoctest: +IGNORE_WANT + + >>> # Force addition of gt labels (when adding gt as proposals) + >>> new_labels = torch.LongTensor([3, 4, 5]) + >>> self.add_gt_(new_labels) + >>> print(str(self)) # xdoctest: +IGNORE_WANT + + """ + + def __init__(self, num_gts, gt_inds, max_overlaps, labels=None): + self.num_gts = num_gts + self.gt_inds = gt_inds + self.max_overlaps = max_overlaps + self.labels = labels + # Interface for possible user-defined properties + self._extra_properties = {} + + @property + def num_preds(self): + """int: the number of predictions in this assignment""" + return len(self.gt_inds) + + def set_extra_property(self, key, value): + """Set user-defined new property.""" + assert key not in self.info + self._extra_properties[key] = value + + def get_extra_property(self, key): + """Get user-defined property.""" + return self._extra_properties.get(key, None) + + @property + def info(self): + """dict: a dictionary of info about the object""" + basic_info = { + 'num_gts': self.num_gts, + 'num_preds': self.num_preds, + 'gt_inds': self.gt_inds, + 'max_overlaps': self.max_overlaps, + 'labels': self.labels, + } + basic_info.update(self._extra_properties) + return basic_info + + def __nice__(self): + """str: a "nice" summary string describing this assign result""" + parts = [] + parts.append(f'num_gts={self.num_gts!r}') + if self.gt_inds is None: + parts.append(f'gt_inds={self.gt_inds!r}') + else: + parts.append(f'gt_inds.shape={tuple(self.gt_inds.shape)!r}') + if self.max_overlaps is None: + parts.append(f'max_overlaps={self.max_overlaps!r}') + else: + parts.append('max_overlaps.shape=' + f'{tuple(self.max_overlaps.shape)!r}') + if self.labels is None: + parts.append(f'labels={self.labels!r}') + else: + parts.append(f'labels.shape={tuple(self.labels.shape)!r}') + return ', '.join(parts) + + @classmethod + def random(cls, **kwargs): + """Create random AssignResult for tests or debugging. + + Args: + num_preds: number of predicted boxes + num_gts: number of true boxes + p_ignore (float): probability of a predicted box assigned to an + ignored truth + p_assigned (float): probability of a predicted box not being + assigned + p_use_label (float | bool): with labels or not + rng (None | int | numpy.random.RandomState): seed or state + + Returns: + :obj:`AssignResult`: Randomly generated assign results. + + Example: + >>> from mmdet.core.bbox.assigners.assign_result import * # NOQA + >>> self = AssignResult.random() + >>> print(self.info) + """ + from mmdet.core.bbox import demodata + rng = demodata.ensure_rng(kwargs.get('rng', None)) + + num_gts = kwargs.get('num_gts', None) + num_preds = kwargs.get('num_preds', None) + p_ignore = kwargs.get('p_ignore', 0.3) + p_assigned = kwargs.get('p_assigned', 0.7) + p_use_label = kwargs.get('p_use_label', 0.5) + num_classes = kwargs.get('p_use_label', 3) + + if num_gts is None: + num_gts = rng.randint(0, 8) + if num_preds is None: + num_preds = rng.randint(0, 16) + + if num_gts == 0: + max_overlaps = torch.zeros(num_preds, dtype=torch.float32) + gt_inds = torch.zeros(num_preds, dtype=torch.int64) + if p_use_label is True or p_use_label < rng.rand(): + labels = torch.zeros(num_preds, dtype=torch.int64) + else: + labels = None + else: + import numpy as np + + # Create an overlap for each predicted box + max_overlaps = torch.from_numpy(rng.rand(num_preds)) + + # Construct gt_inds for each predicted box + is_assigned = torch.from_numpy(rng.rand(num_preds) < p_assigned) + # maximum number of assignments constraints + n_assigned = min(num_preds, min(num_gts, is_assigned.sum())) + + assigned_idxs = np.where(is_assigned)[0] + rng.shuffle(assigned_idxs) + assigned_idxs = assigned_idxs[0:n_assigned] + assigned_idxs.sort() + + is_assigned[:] = 0 + is_assigned[assigned_idxs] = True + + is_ignore = torch.from_numpy( + rng.rand(num_preds) < p_ignore) & is_assigned + + gt_inds = torch.zeros(num_preds, dtype=torch.int64) + + true_idxs = np.arange(num_gts) + rng.shuffle(true_idxs) + true_idxs = torch.from_numpy(true_idxs) + gt_inds[is_assigned] = true_idxs[:n_assigned].long() + + gt_inds = torch.from_numpy( + rng.randint(1, num_gts + 1, size=num_preds)) + gt_inds[is_ignore] = -1 + gt_inds[~is_assigned] = 0 + max_overlaps[~is_assigned] = 0 + + if p_use_label is True or p_use_label < rng.rand(): + if num_classes == 0: + labels = torch.zeros(num_preds, dtype=torch.int64) + else: + labels = torch.from_numpy( + # remind that we set FG labels to [0, num_class-1] + # since mmdet v2.0 + # BG cat_id: num_class + rng.randint(0, num_classes, size=num_preds)) + labels[~is_assigned] = 0 + else: + labels = None + + self = cls(num_gts, gt_inds, max_overlaps, labels) + return self + + def add_gt_(self, gt_labels): + """Add ground truth as assigned results. + + Args: + gt_labels (torch.Tensor): Labels of gt boxes + """ + self_inds = torch.arange( + 1, len(gt_labels) + 1, dtype=torch.long, device=gt_labels.device) + self.gt_inds = torch.cat([self_inds, self.gt_inds]) + + self.max_overlaps = torch.cat( + [self.max_overlaps.new_ones(len(gt_labels)), self.max_overlaps]) + + if self.labels is not None: + self.labels = torch.cat([gt_labels, self.labels]) diff --git a/mmdet/core/bbox/assigners/atss_assigner.py b/mmdet/core/bbox/assigners/atss_assigner.py new file mode 100644 index 0000000..79c8281 --- /dev/null +++ b/mmdet/core/bbox/assigners/atss_assigner.py @@ -0,0 +1,234 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch + +from ..builder import BBOX_ASSIGNERS +from ..iou_calculators import build_iou_calculator +from .assign_result import AssignResult +from .base_assigner import BaseAssigner + + +@BBOX_ASSIGNERS.register_module() +class ATSSAssigner(BaseAssigner): + """Assign a corresponding gt bbox or background to each bbox. + + Each proposals will be assigned with `0` or a positive integer + indicating the ground truth index. + + - 0: negative sample, no assigned gt + - positive integer: positive sample, index (1-based) of assigned gt + + If ``alpha`` is not None, it means that the dynamic cost + ATSSAssigner is adopted, which is currently only used in the DDOD. + + Args: + topk (float): number of bbox selected in each level + """ + + def __init__(self, + topk, + alpha=None, + iou_calculator=dict(type='BboxOverlaps2D'), + ignore_iof_thr=-1): + self.topk = topk + self.alpha = alpha + self.iou_calculator = build_iou_calculator(iou_calculator) + self.ignore_iof_thr = ignore_iof_thr + + """Assign a corresponding gt bbox or background to each bbox. + + Args: + topk (int): number of bbox selected in each level. + alpha (float): param of cost rate for each proposal only in DDOD. + Default None. + iou_calculator (dict): builder of IoU calculator. + Default dict(type='BboxOverlaps2D'). + ignore_iof_thr (int): whether ignore max overlaps or not. + Default -1 (1 or -1). + """ + + # https://github.com/sfzhang15/ATSS/blob/master/atss_core/modeling/rpn/atss/loss.py + def assign(self, + bboxes, + num_level_bboxes, + gt_bboxes, + gt_bboxes_ignore=None, + gt_labels=None, + cls_scores=None, + bbox_preds=None): + """Assign gt to bboxes. + + The assignment is done in following steps + + 1. compute iou between all bbox (bbox of all pyramid levels) and gt + 2. compute center distance between all bbox and gt + 3. on each pyramid level, for each gt, select k bbox whose center + are closest to the gt center, so we total select k*l bbox as + candidates for each gt + 4. get corresponding iou for the these candidates, and compute the + mean and std, set mean + std as the iou threshold + 5. select these candidates whose iou are greater than or equal to + the threshold as positive + 6. limit the positive sample's center in gt + + If ``alpha`` is not None, and ``cls_scores`` and `bbox_preds` + are not None, the overlaps calculation in the first step + will also include dynamic cost, which is currently only used in + the DDOD. + + Args: + bboxes (Tensor): Bounding boxes to be assigned, shape(n, 4). + num_level_bboxes (List): num of bboxes in each level + gt_bboxes (Tensor): Groundtruth boxes, shape (k, 4). + gt_bboxes_ignore (Tensor, optional): Ground truth bboxes that are + labelled as `ignored`, e.g., crowd boxes in COCO. Default None. + gt_labels (Tensor, optional): Label of gt_bboxes, shape (k, ). + cls_scores (list[Tensor]): Classification scores for all scale + levels, each is a 4D-tensor, the channels number is + num_base_priors * num_classes. Default None. + bbox_preds (list[Tensor]): Box energies / deltas for all scale + levels, each is a 4D-tensor, the channels number is + num_base_priors * 4. Default None. + + Returns: + :obj:`AssignResult`: The assign result. + """ + INF = 100000000 + bboxes = bboxes[:, :4] + num_gt, num_bboxes = gt_bboxes.size(0), bboxes.size(0) + + message = 'Invalid alpha parameter because cls_scores or ' \ + 'bbox_preds are None. If you want to use the ' \ + 'cost-based ATSSAssigner, please set cls_scores, ' \ + 'bbox_preds and self.alpha at the same time. ' + + if self.alpha is None: + # ATSSAssigner + overlaps = self.iou_calculator(bboxes, gt_bboxes) + if cls_scores is not None or bbox_preds is not None: + warnings.warn(message) + else: + # Dynamic cost ATSSAssigner in DDOD + assert cls_scores is not None and bbox_preds is not None, message + + # compute cls cost for bbox and GT + cls_cost = torch.sigmoid(cls_scores[:, gt_labels]) + + # compute iou between all bbox and gt + overlaps = self.iou_calculator(bbox_preds, gt_bboxes) + + # make sure that we are in element-wise multiplication + assert cls_cost.shape == overlaps.shape + + # overlaps is actually a cost matrix + overlaps = cls_cost**(1 - self.alpha) * overlaps**self.alpha + + # assign 0 by default + assigned_gt_inds = overlaps.new_full((num_bboxes, ), + 0, + dtype=torch.long) + + if num_gt == 0 or num_bboxes == 0: + # No ground truth or boxes, return empty assignment + max_overlaps = overlaps.new_zeros((num_bboxes, )) + if num_gt == 0: + # No truth, assign everything to background + assigned_gt_inds[:] = 0 + if gt_labels is None: + assigned_labels = None + else: + assigned_labels = overlaps.new_full((num_bboxes, ), + -1, + dtype=torch.long) + return AssignResult( + num_gt, assigned_gt_inds, max_overlaps, labels=assigned_labels) + + # compute center distance between all bbox and gt + gt_cx = (gt_bboxes[:, 0] + gt_bboxes[:, 2]) / 2.0 + gt_cy = (gt_bboxes[:, 1] + gt_bboxes[:, 3]) / 2.0 + gt_points = torch.stack((gt_cx, gt_cy), dim=1) + + bboxes_cx = (bboxes[:, 0] + bboxes[:, 2]) / 2.0 + bboxes_cy = (bboxes[:, 1] + bboxes[:, 3]) / 2.0 + bboxes_points = torch.stack((bboxes_cx, bboxes_cy), dim=1) + + distances = (bboxes_points[:, None, :] - + gt_points[None, :, :]).pow(2).sum(-1).sqrt() + + if (self.ignore_iof_thr > 0 and gt_bboxes_ignore is not None + and gt_bboxes_ignore.numel() > 0 and bboxes.numel() > 0): + ignore_overlaps = self.iou_calculator( + bboxes, gt_bboxes_ignore, mode='iof') + ignore_max_overlaps, _ = ignore_overlaps.max(dim=1) + ignore_idxs = ignore_max_overlaps > self.ignore_iof_thr + distances[ignore_idxs, :] = INF + assigned_gt_inds[ignore_idxs] = -1 + + # Selecting candidates based on the center distance + candidate_idxs = [] + start_idx = 0 + for level, bboxes_per_level in enumerate(num_level_bboxes): + # on each pyramid level, for each gt, + # select k bbox whose center are closest to the gt center + end_idx = start_idx + bboxes_per_level + distances_per_level = distances[start_idx:end_idx, :] + selectable_k = min(self.topk, bboxes_per_level) + + _, topk_idxs_per_level = distances_per_level.topk( + selectable_k, dim=0, largest=False) + candidate_idxs.append(topk_idxs_per_level + start_idx) + start_idx = end_idx + candidate_idxs = torch.cat(candidate_idxs, dim=0) + + # get corresponding iou for the these candidates, and compute the + # mean and std, set mean + std as the iou threshold + candidate_overlaps = overlaps[candidate_idxs, torch.arange(num_gt)] + overlaps_mean_per_gt = candidate_overlaps.mean(0) + overlaps_std_per_gt = candidate_overlaps.std(0) + overlaps_thr_per_gt = overlaps_mean_per_gt + overlaps_std_per_gt + + is_pos = candidate_overlaps >= overlaps_thr_per_gt[None, :] + + # limit the positive sample's center in gt + for gt_idx in range(num_gt): + candidate_idxs[:, gt_idx] += gt_idx * num_bboxes + ep_bboxes_cx = bboxes_cx.view(1, -1).expand( + num_gt, num_bboxes).contiguous().view(-1) + ep_bboxes_cy = bboxes_cy.view(1, -1).expand( + num_gt, num_bboxes).contiguous().view(-1) + candidate_idxs = candidate_idxs.view(-1) + + # calculate the left, top, right, bottom distance between positive + # bbox center and gt side + l_ = ep_bboxes_cx[candidate_idxs].view(-1, num_gt) - gt_bboxes[:, 0] + t_ = ep_bboxes_cy[candidate_idxs].view(-1, num_gt) - gt_bboxes[:, 1] + r_ = gt_bboxes[:, 2] - ep_bboxes_cx[candidate_idxs].view(-1, num_gt) + b_ = gt_bboxes[:, 3] - ep_bboxes_cy[candidate_idxs].view(-1, num_gt) + is_in_gts = torch.stack([l_, t_, r_, b_], dim=1).min(dim=1)[0] > 0.01 + + is_pos = is_pos & is_in_gts + + # if an anchor box is assigned to multiple gts, + # the one with the highest IoU will be selected. + overlaps_inf = torch.full_like(overlaps, + -INF).t().contiguous().view(-1) + index = candidate_idxs.view(-1)[is_pos.view(-1)] + overlaps_inf[index] = overlaps.t().contiguous().view(-1)[index] + overlaps_inf = overlaps_inf.view(num_gt, -1).t() + + max_overlaps, argmax_overlaps = overlaps_inf.max(dim=1) + assigned_gt_inds[ + max_overlaps != -INF] = argmax_overlaps[max_overlaps != -INF] + 1 + + if gt_labels is not None: + assigned_labels = assigned_gt_inds.new_full((num_bboxes, ), -1) + pos_inds = torch.nonzero( + assigned_gt_inds > 0, as_tuple=False).squeeze() + if pos_inds.numel() > 0: + assigned_labels[pos_inds] = gt_labels[ + assigned_gt_inds[pos_inds] - 1] + else: + assigned_labels = None + return AssignResult( + num_gt, assigned_gt_inds, max_overlaps, labels=assigned_labels) diff --git a/mmdet/core/bbox/assigners/base_assigner.py b/mmdet/core/bbox/assigners/base_assigner.py new file mode 100644 index 0000000..3c2d597 --- /dev/null +++ b/mmdet/core/bbox/assigners/base_assigner.py @@ -0,0 +1,10 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from abc import ABCMeta, abstractmethod + + +class BaseAssigner(metaclass=ABCMeta): + """Base assigner that assigns boxes to ground truth boxes.""" + + @abstractmethod + def assign(self, bboxes, gt_bboxes, gt_bboxes_ignore=None, gt_labels=None): + """Assign boxes to either a ground truth boxes or a negative boxes.""" diff --git a/mmdet/core/bbox/assigners/center_region_assigner.py b/mmdet/core/bbox/assigners/center_region_assigner.py new file mode 100644 index 0000000..86e7859 --- /dev/null +++ b/mmdet/core/bbox/assigners/center_region_assigner.py @@ -0,0 +1,336 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from ..builder import BBOX_ASSIGNERS +from ..iou_calculators import build_iou_calculator +from .assign_result import AssignResult +from .base_assigner import BaseAssigner + + +def scale_boxes(bboxes, scale): + """Expand an array of boxes by a given scale. + + Args: + bboxes (Tensor): Shape (m, 4) + scale (float): The scale factor of bboxes + + Returns: + (Tensor): Shape (m, 4). Scaled bboxes + """ + assert bboxes.size(1) == 4 + w_half = (bboxes[:, 2] - bboxes[:, 0]) * .5 + h_half = (bboxes[:, 3] - bboxes[:, 1]) * .5 + x_c = (bboxes[:, 2] + bboxes[:, 0]) * .5 + y_c = (bboxes[:, 3] + bboxes[:, 1]) * .5 + + w_half *= scale + h_half *= scale + + boxes_scaled = torch.zeros_like(bboxes) + boxes_scaled[:, 0] = x_c - w_half + boxes_scaled[:, 2] = x_c + w_half + boxes_scaled[:, 1] = y_c - h_half + boxes_scaled[:, 3] = y_c + h_half + return boxes_scaled + + +def is_located_in(points, bboxes): + """Are points located in bboxes. + + Args: + points (Tensor): Points, shape: (m, 2). + bboxes (Tensor): Bounding boxes, shape: (n, 4). + + Return: + Tensor: Flags indicating if points are located in bboxes, shape: (m, n). + """ + assert points.size(1) == 2 + assert bboxes.size(1) == 4 + return (points[:, 0].unsqueeze(1) > bboxes[:, 0].unsqueeze(0)) & \ + (points[:, 0].unsqueeze(1) < bboxes[:, 2].unsqueeze(0)) & \ + (points[:, 1].unsqueeze(1) > bboxes[:, 1].unsqueeze(0)) & \ + (points[:, 1].unsqueeze(1) < bboxes[:, 3].unsqueeze(0)) + + +def bboxes_area(bboxes): + """Compute the area of an array of bboxes. + + Args: + bboxes (Tensor): The coordinates ox bboxes. Shape: (m, 4) + + Returns: + Tensor: Area of the bboxes. Shape: (m, ) + """ + assert bboxes.size(1) == 4 + w = (bboxes[:, 2] - bboxes[:, 0]) + h = (bboxes[:, 3] - bboxes[:, 1]) + areas = w * h + return areas + + +@BBOX_ASSIGNERS.register_module() +class CenterRegionAssigner(BaseAssigner): + """Assign pixels at the center region of a bbox as positive. + + Each proposals will be assigned with `-1`, `0`, or a positive integer + indicating the ground truth index. + - -1: negative samples + - semi-positive numbers: positive sample, index (0-based) of assigned gt + + Args: + pos_scale (float): Threshold within which pixels are + labelled as positive. + neg_scale (float): Threshold above which pixels are + labelled as positive. + min_pos_iof (float): Minimum iof of a pixel with a gt to be + labelled as positive. Default: 1e-2 + ignore_gt_scale (float): Threshold within which the pixels + are ignored when the gt is labelled as shadowed. Default: 0.5 + foreground_dominate (bool): If True, the bbox will be assigned as + positive when a gt's kernel region overlaps with another's shadowed + (ignored) region, otherwise it is set as ignored. Default to False. + """ + + def __init__(self, + pos_scale, + neg_scale, + min_pos_iof=1e-2, + ignore_gt_scale=0.5, + foreground_dominate=False, + iou_calculator=dict(type='BboxOverlaps2D')): + self.pos_scale = pos_scale + self.neg_scale = neg_scale + self.min_pos_iof = min_pos_iof + self.ignore_gt_scale = ignore_gt_scale + self.foreground_dominate = foreground_dominate + self.iou_calculator = build_iou_calculator(iou_calculator) + + def get_gt_priorities(self, gt_bboxes): + """Get gt priorities according to their areas. + + Smaller gt has higher priority. + + Args: + gt_bboxes (Tensor): Ground truth boxes, shape (k, 4). + + Returns: + Tensor: The priority of gts so that gts with larger priority is \ + more likely to be assigned. Shape (k, ) + """ + gt_areas = bboxes_area(gt_bboxes) + # Rank all gt bbox areas. Smaller objects has larger priority + _, sort_idx = gt_areas.sort(descending=True) + sort_idx = sort_idx.argsort() + return sort_idx + + def assign(self, bboxes, gt_bboxes, gt_bboxes_ignore=None, gt_labels=None): + """Assign gt to bboxes. + + This method assigns gts to every bbox (proposal/anchor), each bbox \ + will be assigned with -1, or a semi-positive number. -1 means \ + negative sample, semi-positive number is the index (0-based) of \ + assigned gt. + + Args: + bboxes (Tensor): Bounding boxes to be assigned, shape(n, 4). + gt_bboxes (Tensor): Groundtruth boxes, shape (k, 4). + gt_bboxes_ignore (tensor, optional): Ground truth bboxes that are + labelled as `ignored`, e.g., crowd boxes in COCO. + gt_labels (tensor, optional): Label of gt_bboxes, shape (num_gts,). + + Returns: + :obj:`AssignResult`: The assigned result. Note that \ + shadowed_labels of shape (N, 2) is also added as an \ + `assign_result` attribute. `shadowed_labels` is a tensor \ + composed of N pairs of anchor_ind, class_label], where N \ + is the number of anchors that lie in the outer region of a \ + gt, anchor_ind is the shadowed anchor index and class_label \ + is the shadowed class label. + + Example: + >>> self = CenterRegionAssigner(0.2, 0.2) + >>> bboxes = torch.Tensor([[0, 0, 10, 10], [10, 10, 20, 20]]) + >>> gt_bboxes = torch.Tensor([[0, 0, 10, 10]]) + >>> assign_result = self.assign(bboxes, gt_bboxes) + >>> expected_gt_inds = torch.LongTensor([1, 0]) + >>> assert torch.all(assign_result.gt_inds == expected_gt_inds) + """ + # There are in total 5 steps in the pixel assignment + # 1. Find core (the center region, say inner 0.2) + # and shadow (the relatively ourter part, say inner 0.2-0.5) + # regions of every gt. + # 2. Find all prior bboxes that lie in gt_core and gt_shadow regions + # 3. Assign prior bboxes in gt_core with a one-hot id of the gt in + # the image. + # 3.1. For overlapping objects, the prior bboxes in gt_core is + # assigned with the object with smallest area + # 4. Assign prior bboxes with class label according to its gt id. + # 4.1. Assign -1 to prior bboxes lying in shadowed gts + # 4.2. Assign positive prior boxes with the corresponding label + # 5. Find pixels lying in the shadow of an object and assign them with + # background label, but set the loss weight of its corresponding + # gt to zero. + assert bboxes.size(1) == 4, 'bboxes must have size of 4' + # 1. Find core positive and shadow region of every gt + gt_core = scale_boxes(gt_bboxes, self.pos_scale) + gt_shadow = scale_boxes(gt_bboxes, self.neg_scale) + + # 2. Find prior bboxes that lie in gt_core and gt_shadow regions + bbox_centers = (bboxes[:, 2:4] + bboxes[:, 0:2]) / 2 + # The center points lie within the gt boxes + is_bbox_in_gt = is_located_in(bbox_centers, gt_bboxes) + # Only calculate bbox and gt_core IoF. This enables small prior bboxes + # to match large gts + bbox_and_gt_core_overlaps = self.iou_calculator( + bboxes, gt_core, mode='iof') + # The center point of effective priors should be within the gt box + is_bbox_in_gt_core = is_bbox_in_gt & ( + bbox_and_gt_core_overlaps > self.min_pos_iof) # shape (n, k) + + is_bbox_in_gt_shadow = ( + self.iou_calculator(bboxes, gt_shadow, mode='iof') > + self.min_pos_iof) + # Rule out center effective positive pixels + is_bbox_in_gt_shadow &= (~is_bbox_in_gt_core) + + num_gts, num_bboxes = gt_bboxes.size(0), bboxes.size(0) + if num_gts == 0 or num_bboxes == 0: + # If no gts exist, assign all pixels to negative + assigned_gt_ids = \ + is_bbox_in_gt_core.new_zeros((num_bboxes,), + dtype=torch.long) + pixels_in_gt_shadow = assigned_gt_ids.new_empty((0, 2)) + else: + # Step 3: assign a one-hot gt id to each pixel, and smaller objects + # have high priority to assign the pixel. + sort_idx = self.get_gt_priorities(gt_bboxes) + assigned_gt_ids, pixels_in_gt_shadow = \ + self.assign_one_hot_gt_indices(is_bbox_in_gt_core, + is_bbox_in_gt_shadow, + gt_priority=sort_idx) + + if gt_bboxes_ignore is not None and gt_bboxes_ignore.numel() > 0: + # No ground truth or boxes, return empty assignment + gt_bboxes_ignore = scale_boxes( + gt_bboxes_ignore, scale=self.ignore_gt_scale) + is_bbox_in_ignored_gts = is_located_in(bbox_centers, + gt_bboxes_ignore) + is_bbox_in_ignored_gts = is_bbox_in_ignored_gts.any(dim=1) + assigned_gt_ids[is_bbox_in_ignored_gts] = -1 + + # 4. Assign prior bboxes with class label according to its gt id. + assigned_labels = None + shadowed_pixel_labels = None + if gt_labels is not None: + # Default assigned label is the background (-1) + assigned_labels = assigned_gt_ids.new_full((num_bboxes, ), -1) + pos_inds = torch.nonzero( + assigned_gt_ids > 0, as_tuple=False).squeeze() + if pos_inds.numel() > 0: + assigned_labels[pos_inds] = gt_labels[assigned_gt_ids[pos_inds] + - 1] + # 5. Find pixels lying in the shadow of an object + shadowed_pixel_labels = pixels_in_gt_shadow.clone() + if pixels_in_gt_shadow.numel() > 0: + pixel_idx, gt_idx =\ + pixels_in_gt_shadow[:, 0], pixels_in_gt_shadow[:, 1] + assert (assigned_gt_ids[pixel_idx] != gt_idx).all(), \ + 'Some pixels are dually assigned to ignore and gt!' + shadowed_pixel_labels[:, 1] = gt_labels[gt_idx - 1] + override = ( + assigned_labels[pixel_idx] == shadowed_pixel_labels[:, 1]) + if self.foreground_dominate: + # When a pixel is both positive and shadowed, set it as pos + shadowed_pixel_labels = shadowed_pixel_labels[~override] + else: + # When a pixel is both pos and shadowed, set it as shadowed + assigned_labels[pixel_idx[override]] = -1 + assigned_gt_ids[pixel_idx[override]] = 0 + + assign_result = AssignResult( + num_gts, assigned_gt_ids, None, labels=assigned_labels) + # Add shadowed_labels as assign_result property. Shape: (num_shadow, 2) + assign_result.set_extra_property('shadowed_labels', + shadowed_pixel_labels) + return assign_result + + def assign_one_hot_gt_indices(self, + is_bbox_in_gt_core, + is_bbox_in_gt_shadow, + gt_priority=None): + """Assign only one gt index to each prior box. + + Gts with large gt_priority are more likely to be assigned. + + Args: + is_bbox_in_gt_core (Tensor): Bool tensor indicating the bbox center + is in the core area of a gt (e.g. 0-0.2). + Shape: (num_prior, num_gt). + is_bbox_in_gt_shadow (Tensor): Bool tensor indicating the bbox + center is in the shadowed area of a gt (e.g. 0.2-0.5). + Shape: (num_prior, num_gt). + gt_priority (Tensor): Priorities of gts. The gt with a higher + priority is more likely to be assigned to the bbox when the bbox + match with multiple gts. Shape: (num_gt, ). + + Returns: + tuple: Returns (assigned_gt_inds, shadowed_gt_inds). + + - assigned_gt_inds: The assigned gt index of each prior bbox \ + (i.e. index from 1 to num_gts). Shape: (num_prior, ). + - shadowed_gt_inds: shadowed gt indices. It is a tensor of \ + shape (num_ignore, 2) with first column being the \ + shadowed prior bbox indices and the second column the \ + shadowed gt indices (1-based). + """ + num_bboxes, num_gts = is_bbox_in_gt_core.shape + + if gt_priority is None: + gt_priority = torch.arange( + num_gts, device=is_bbox_in_gt_core.device) + assert gt_priority.size(0) == num_gts + # The bigger gt_priority, the more preferable to be assigned + # The assigned inds are by default 0 (background) + assigned_gt_inds = is_bbox_in_gt_core.new_zeros((num_bboxes, ), + dtype=torch.long) + # Shadowed bboxes are assigned to be background. But the corresponding + # label is ignored during loss calculation, which is done through + # shadowed_gt_inds + shadowed_gt_inds = torch.nonzero(is_bbox_in_gt_shadow, as_tuple=False) + if is_bbox_in_gt_core.sum() == 0: # No gt match + shadowed_gt_inds[:, 1] += 1 # 1-based. For consistency issue + return assigned_gt_inds, shadowed_gt_inds + + # The priority of each prior box and gt pair. If one prior box is + # matched bo multiple gts. Only the pair with the highest priority + # is saved + pair_priority = is_bbox_in_gt_core.new_full((num_bboxes, num_gts), + -1, + dtype=torch.long) + + # Each bbox could match with multiple gts. + # The following codes deal with this situation + # Matched bboxes (to any gt). Shape: (num_pos_anchor, ) + inds_of_match = torch.any(is_bbox_in_gt_core, dim=1) + # The matched gt index of each positive bbox. Length >= num_pos_anchor + # , since one bbox could match multiple gts + matched_bbox_gt_inds = torch.nonzero( + is_bbox_in_gt_core, as_tuple=False)[:, 1] + # Assign priority to each bbox-gt pair. + pair_priority[is_bbox_in_gt_core] = gt_priority[matched_bbox_gt_inds] + _, argmax_priority = pair_priority[inds_of_match].max(dim=1) + assigned_gt_inds[inds_of_match] = argmax_priority + 1 # 1-based + # Zero-out the assigned anchor box to filter the shadowed gt indices + is_bbox_in_gt_core[inds_of_match, argmax_priority] = 0 + # Concat the shadowed indices due to overlapping with that out side of + # effective scale. shape: (total_num_ignore, 2) + shadowed_gt_inds = torch.cat( + (shadowed_gt_inds, torch.nonzero( + is_bbox_in_gt_core, as_tuple=False)), + dim=0) + # `is_bbox_in_gt_core` should be changed back to keep arguments intact. + is_bbox_in_gt_core[inds_of_match, argmax_priority] = 1 + # 1-based shadowed gt indices, to be consistent with `assigned_gt_inds` + if shadowed_gt_inds.numel() > 0: + shadowed_gt_inds[:, 1] += 1 + return assigned_gt_inds, shadowed_gt_inds diff --git a/mmdet/core/bbox/assigners/grid_assigner.py b/mmdet/core/bbox/assigners/grid_assigner.py new file mode 100644 index 0000000..a0c814e --- /dev/null +++ b/mmdet/core/bbox/assigners/grid_assigner.py @@ -0,0 +1,156 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from ..builder import BBOX_ASSIGNERS +from ..iou_calculators import build_iou_calculator +from .assign_result import AssignResult +from .base_assigner import BaseAssigner + + +@BBOX_ASSIGNERS.register_module() +class GridAssigner(BaseAssigner): + """Assign a corresponding gt bbox or background to each bbox. + + Each proposals will be assigned with `-1`, `0`, or a positive integer + indicating the ground truth index. + + - -1: don't care + - 0: negative sample, no assigned gt + - positive integer: positive sample, index (1-based) of assigned gt + + Args: + pos_iou_thr (float): IoU threshold for positive bboxes. + neg_iou_thr (float or tuple): IoU threshold for negative bboxes. + min_pos_iou (float): Minimum iou for a bbox to be considered as a + positive bbox. Positive samples can have smaller IoU than + pos_iou_thr due to the 4th step (assign max IoU sample to each gt). + gt_max_assign_all (bool): Whether to assign all bboxes with the same + highest overlap with some gt to that gt. + """ + + def __init__(self, + pos_iou_thr, + neg_iou_thr, + min_pos_iou=.0, + gt_max_assign_all=True, + iou_calculator=dict(type='BboxOverlaps2D')): + self.pos_iou_thr = pos_iou_thr + self.neg_iou_thr = neg_iou_thr + self.min_pos_iou = min_pos_iou + self.gt_max_assign_all = gt_max_assign_all + self.iou_calculator = build_iou_calculator(iou_calculator) + + def assign(self, bboxes, box_responsible_flags, gt_bboxes, gt_labels=None): + """Assign gt to bboxes. The process is very much like the max iou + assigner, except that positive samples are constrained within the cell + that the gt boxes fell in. + + This method assign a gt bbox to every bbox (proposal/anchor), each bbox + will be assigned with -1, 0, or a positive number. -1 means don't care, + 0 means negative sample, positive number is the index (1-based) of + assigned gt. + The assignment is done in following steps, the order matters. + + 1. assign every bbox to -1 + 2. assign proposals whose iou with all gts <= neg_iou_thr to 0 + 3. for each bbox within a cell, if the iou with its nearest gt > + pos_iou_thr and the center of that gt falls inside the cell, + assign it to that bbox + 4. for each gt bbox, assign its nearest proposals within the cell the + gt bbox falls in to itself. + + Args: + bboxes (Tensor): Bounding boxes to be assigned, shape(n, 4). + box_responsible_flags (Tensor): flag to indicate whether box is + responsible for prediction, shape(n, ) + gt_bboxes (Tensor): Groundtruth boxes, shape (k, 4). + gt_labels (Tensor, optional): Label of gt_bboxes, shape (k, ). + + Returns: + :obj:`AssignResult`: The assign result. + """ + num_gts, num_bboxes = gt_bboxes.size(0), bboxes.size(0) + + # compute iou between all gt and bboxes + overlaps = self.iou_calculator(gt_bboxes, bboxes) + + # 1. assign -1 by default + assigned_gt_inds = overlaps.new_full((num_bboxes, ), + -1, + dtype=torch.long) + + if num_gts == 0 or num_bboxes == 0: + # No ground truth or boxes, return empty assignment + max_overlaps = overlaps.new_zeros((num_bboxes, )) + if num_gts == 0: + # No truth, assign everything to background + assigned_gt_inds[:] = 0 + if gt_labels is None: + assigned_labels = None + else: + assigned_labels = overlaps.new_full((num_bboxes, ), + -1, + dtype=torch.long) + return AssignResult( + num_gts, + assigned_gt_inds, + max_overlaps, + labels=assigned_labels) + + # 2. assign negative: below + # for each anchor, which gt best overlaps with it + # for each anchor, the max iou of all gts + # shape of max_overlaps == argmax_overlaps == num_bboxes + max_overlaps, argmax_overlaps = overlaps.max(dim=0) + + if isinstance(self.neg_iou_thr, float): + assigned_gt_inds[(max_overlaps >= 0) + & (max_overlaps <= self.neg_iou_thr)] = 0 + elif isinstance(self.neg_iou_thr, (tuple, list)): + assert len(self.neg_iou_thr) == 2 + assigned_gt_inds[(max_overlaps > self.neg_iou_thr[0]) + & (max_overlaps <= self.neg_iou_thr[1])] = 0 + + # 3. assign positive: falls into responsible cell and above + # positive IOU threshold, the order matters. + # the prior condition of comparison is to filter out all + # unrelated anchors, i.e. not box_responsible_flags + overlaps[:, ~box_responsible_flags.type(torch.bool)] = -1. + + # calculate max_overlaps again, but this time we only consider IOUs + # for anchors responsible for prediction + max_overlaps, argmax_overlaps = overlaps.max(dim=0) + + # for each gt, which anchor best overlaps with it + # for each gt, the max iou of all proposals + # shape of gt_max_overlaps == gt_argmax_overlaps == num_gts + gt_max_overlaps, gt_argmax_overlaps = overlaps.max(dim=1) + + pos_inds = (max_overlaps > + self.pos_iou_thr) & box_responsible_flags.type(torch.bool) + assigned_gt_inds[pos_inds] = argmax_overlaps[pos_inds] + 1 + + # 4. assign positive to max overlapped anchors within responsible cell + for i in range(num_gts): + if gt_max_overlaps[i] > self.min_pos_iou: + if self.gt_max_assign_all: + max_iou_inds = (overlaps[i, :] == gt_max_overlaps[i]) & \ + box_responsible_flags.type(torch.bool) + assigned_gt_inds[max_iou_inds] = i + 1 + elif box_responsible_flags[gt_argmax_overlaps[i]]: + assigned_gt_inds[gt_argmax_overlaps[i]] = i + 1 + + # assign labels of positive anchors + if gt_labels is not None: + assigned_labels = assigned_gt_inds.new_full((num_bboxes, ), -1) + pos_inds = torch.nonzero( + assigned_gt_inds > 0, as_tuple=False).squeeze() + if pos_inds.numel() > 0: + assigned_labels[pos_inds] = gt_labels[ + assigned_gt_inds[pos_inds] - 1] + + else: + assigned_labels = None + + return AssignResult( + num_gts, assigned_gt_inds, max_overlaps, labels=assigned_labels) diff --git a/mmdet/core/bbox/assigners/hungarian_assigner.py b/mmdet/core/bbox/assigners/hungarian_assigner.py new file mode 100644 index 0000000..435612a --- /dev/null +++ b/mmdet/core/bbox/assigners/hungarian_assigner.py @@ -0,0 +1,139 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +from scipy.optimize import linear_sum_assignment + +from ..builder import BBOX_ASSIGNERS +from ..match_costs import build_match_cost +from ..transforms import bbox_cxcywh_to_xyxy +from .assign_result import AssignResult +from .base_assigner import BaseAssigner + + +@BBOX_ASSIGNERS.register_module() +class HungarianAssigner(BaseAssigner): + """Computes one-to-one matching between predictions and ground truth. + + This class computes an assignment between the targets and the predictions + based on the costs. The costs are weighted sum of three components: + classification cost, regression L1 cost and regression iou cost. The + targets don't include the no_object, so generally there are more + predictions than targets. After the one-to-one matching, the un-matched + are treated as backgrounds. Thus each query prediction will be assigned + with `0` or a positive integer indicating the ground truth index: + + - 0: negative sample, no assigned gt + - positive integer: positive sample, index (1-based) of assigned gt + + Args: + cls_weight (int | float, optional): The scale factor for classification + cost. Default 1.0. + bbox_weight (int | float, optional): The scale factor for regression + L1 cost. Default 1.0. + iou_weight (int | float, optional): The scale factor for regression + iou cost. Default 1.0. + iou_calculator (dict | optional): The config for the iou calculation. + Default type `BboxOverlaps2D`. + iou_mode (str | optional): "iou" (intersection over union), "iof" + (intersection over foreground), or "giou" (generalized + intersection over union). Default "giou". + """ + + def __init__(self, + cls_cost=dict(type='ClassificationCost', weight=1.), + reg_cost=dict(type='BBoxL1Cost', weight=1.0), + iou_cost=dict(type='IoUCost', iou_mode='giou', weight=1.0)): + self.cls_cost = build_match_cost(cls_cost) + self.reg_cost = build_match_cost(reg_cost) + self.iou_cost = build_match_cost(iou_cost) + + def assign(self, + bbox_pred, + cls_pred, + gt_bboxes, + gt_labels, + img_meta, + gt_bboxes_ignore=None, + eps=1e-7): + """Computes one-to-one matching based on the weighted costs. + + This method assign each query prediction to a ground truth or + background. The `assigned_gt_inds` with -1 means don't care, + 0 means negative sample, and positive number is the index (1-based) + of assigned gt. + The assignment is done in the following steps, the order matters. + + 1. assign every prediction to -1 + 2. compute the weighted costs + 3. do Hungarian matching on CPU based on the costs + 4. assign all to 0 (background) first, then for each matched pair + between predictions and gts, treat this prediction as foreground + and assign the corresponding gt index (plus 1) to it. + + Args: + bbox_pred (Tensor): Predicted boxes with normalized coordinates + (cx, cy, w, h), which are all in range [0, 1]. Shape + [num_query, 4]. + cls_pred (Tensor): Predicted classification logits, shape + [num_query, num_class]. + gt_bboxes (Tensor): Ground truth boxes with unnormalized + coordinates (x1, y1, x2, y2). Shape [num_gt, 4]. + gt_labels (Tensor): Label of `gt_bboxes`, shape (num_gt,). + img_meta (dict): Meta information for current image. + gt_bboxes_ignore (Tensor, optional): Ground truth bboxes that are + labelled as `ignored`. Default None. + eps (int | float, optional): A value added to the denominator for + numerical stability. Default 1e-7. + + Returns: + :obj:`AssignResult`: The assigned result. + """ + assert gt_bboxes_ignore is None, \ + 'Only case when gt_bboxes_ignore is None is supported.' + num_gts, num_bboxes = gt_bboxes.size(0), bbox_pred.size(0) + + # 1. assign -1 by default + assigned_gt_inds = bbox_pred.new_full((num_bboxes, ), + -1, + dtype=torch.long) + assigned_labels = bbox_pred.new_full((num_bboxes, ), + -1, + dtype=torch.long) + if num_gts == 0 or num_bboxes == 0: + # No ground truth or boxes, return empty assignment + if num_gts == 0: + # No ground truth, assign all to background + assigned_gt_inds[:] = 0 + return AssignResult( + num_gts, assigned_gt_inds, None, labels=assigned_labels) + img_h, img_w, _ = img_meta['img_shape'] + factor = gt_bboxes.new_tensor([img_w, img_h, img_w, + img_h]).unsqueeze(0) + + # 2. compute the weighted costs + # classification and bboxcost. + cls_cost = self.cls_cost(cls_pred, gt_labels) + # regression L1 cost + normalize_gt_bboxes = gt_bboxes / factor + reg_cost = self.reg_cost(bbox_pred, normalize_gt_bboxes) + # regression iou cost, defaultly giou is used in official DETR. + bboxes = bbox_cxcywh_to_xyxy(bbox_pred) * factor + iou_cost = self.iou_cost(bboxes, gt_bboxes) + # weighted sum of above three costs + cost = cls_cost + reg_cost + iou_cost + + # 3. do Hungarian matching on CPU using linear_sum_assignment + cost = cost.detach().cpu() + matched_row_inds, matched_col_inds = linear_sum_assignment(cost) + matched_row_inds = torch.from_numpy(matched_row_inds).to( + bbox_pred.device) + matched_col_inds = torch.from_numpy(matched_col_inds).to( + bbox_pred.device) + + # 4. assign backgrounds and foregrounds + # assign all indices to backgrounds first + assigned_gt_inds[:] = 0 + # assign foregrounds based on matching results + assigned_gt_inds[matched_row_inds] = matched_col_inds + 1 + assigned_labels[matched_row_inds] = gt_labels[matched_col_inds] + return AssignResult( + num_gts, assigned_gt_inds, None, labels=assigned_labels) diff --git a/mmdet/core/bbox/assigners/mask_hungarian_assigner.py b/mmdet/core/bbox/assigners/mask_hungarian_assigner.py new file mode 100644 index 0000000..d83def1 --- /dev/null +++ b/mmdet/core/bbox/assigners/mask_hungarian_assigner.py @@ -0,0 +1,125 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +from scipy.optimize import linear_sum_assignment + +from mmdet.core.bbox.builder import BBOX_ASSIGNERS +from mmdet.core.bbox.match_costs.builder import build_match_cost +from .assign_result import AssignResult +from .base_assigner import BaseAssigner + + +@BBOX_ASSIGNERS.register_module() +class MaskHungarianAssigner(BaseAssigner): + """Computes one-to-one matching between predictions and ground truth for + mask. + + This class computes an assignment between the targets and the predictions + based on the costs. The costs are weighted sum of three components: + classification cost, mask focal cost and mask dice cost. The + targets don't include the no_object, so generally there are more + predictions than targets. After the one-to-one matching, the un-matched + are treated as backgrounds. Thus each query prediction will be assigned + with `0` or a positive integer indicating the ground truth index: + + - 0: negative sample, no assigned gt + - positive integer: positive sample, index (1-based) of assigned gt + + Args: + cls_cost (:obj:`mmcv.ConfigDict` | dict): Classification cost config. + mask_cost (:obj:`mmcv.ConfigDict` | dict): Mask cost config. + dice_cost (:obj:`mmcv.ConfigDict` | dict): Dice cost config. + """ + + def __init__(self, + cls_cost=dict(type='ClassificationCost', weight=1.0), + mask_cost=dict( + type='FocalLossCost', weight=1.0, binary_input=True), + dice_cost=dict(type='DiceCost', weight=1.0)): + self.cls_cost = build_match_cost(cls_cost) + self.mask_cost = build_match_cost(mask_cost) + self.dice_cost = build_match_cost(dice_cost) + + def assign(self, + cls_pred, + mask_pred, + gt_labels, + gt_mask, + img_meta, + gt_bboxes_ignore=None, + eps=1e-7): + """Computes one-to-one matching based on the weighted costs. + + Args: + cls_pred (Tensor | None): Class prediction in shape + (num_query, cls_out_channels). + mask_pred (Tensor): Mask prediction in shape (num_query, H, W). + gt_labels (Tensor): Label of 'gt_mask'in shape = (num_gt, ). + gt_mask (Tensor): Ground truth mask in shape = (num_gt, H, W). + img_meta (dict): Meta information for current image. + gt_bboxes_ignore (Tensor, optional): Ground truth bboxes that are + labelled as `ignored`. Default None. + eps (int | float, optional): A value added to the denominator for + numerical stability. Default 1e-7. + + Returns: + :obj:`AssignResult`: The assigned result. + """ + assert gt_bboxes_ignore is None, \ + 'Only case when gt_bboxes_ignore is None is supported.' + # K-Net sometimes passes cls_pred=None to this assigner. + # So we should use the shape of mask_pred + num_gt, num_query = gt_labels.shape[0], mask_pred.shape[0] + + # 1. assign -1 by default + assigned_gt_inds = mask_pred.new_full((num_query, ), + -1, + dtype=torch.long) + assigned_labels = mask_pred.new_full((num_query, ), + -1, + dtype=torch.long) + if num_gt == 0 or num_query == 0: + # No ground truth or boxes, return empty assignment + if num_gt == 0: + # No ground truth, assign all to background + assigned_gt_inds[:] = 0 + return AssignResult( + num_gt, assigned_gt_inds, None, labels=assigned_labels) + + # 2. compute the weighted costs + # classification and maskcost. + if self.cls_cost.weight != 0 and cls_pred is not None: + cls_cost = self.cls_cost(cls_pred, gt_labels) + else: + cls_cost = 0 + + if self.mask_cost.weight != 0: + # mask_pred shape = [num_query, h, w] + # gt_mask shape = [num_gt, h, w] + # mask_cost shape = [num_query, num_gt] + mask_cost = self.mask_cost(mask_pred, gt_mask) + else: + mask_cost = 0 + + if self.dice_cost.weight != 0: + dice_cost = self.dice_cost(mask_pred, gt_mask) + else: + dice_cost = 0 + cost = cls_cost + mask_cost + dice_cost + + # 3. do Hungarian matching on CPU using linear_sum_assignment + cost = cost.detach().cpu() + + matched_row_inds, matched_col_inds = linear_sum_assignment(cost) + matched_row_inds = torch.from_numpy(matched_row_inds).to( + mask_pred.device) + matched_col_inds = torch.from_numpy(matched_col_inds).to( + mask_pred.device) + + # 4. assign backgrounds and foregrounds + # assign all indices to backgrounds first + assigned_gt_inds[:] = 0 + # assign foregrounds based on matching results + assigned_gt_inds[matched_row_inds] = matched_col_inds + 1 + assigned_labels[matched_row_inds] = gt_labels[matched_col_inds] + return AssignResult( + num_gt, assigned_gt_inds, None, labels=assigned_labels) diff --git a/mmdet/core/bbox/assigners/max_iou_assigner.py b/mmdet/core/bbox/assigners/max_iou_assigner.py new file mode 100644 index 0000000..676421f --- /dev/null +++ b/mmdet/core/bbox/assigners/max_iou_assigner.py @@ -0,0 +1,218 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from ..builder import BBOX_ASSIGNERS +from ..iou_calculators import build_iou_calculator +from .assign_result import AssignResult +from .base_assigner import BaseAssigner + + +@BBOX_ASSIGNERS.register_module() +class MaxIoUAssigner(BaseAssigner): + """Assign a corresponding gt bbox or background to each bbox. + + Each proposals will be assigned with `-1`, or a semi-positive integer + indicating the ground truth index. + + - -1: negative sample, no assigned gt + - semi-positive integer: positive sample, index (0-based) of assigned gt + + Args: + pos_iou_thr (float): IoU threshold for positive bboxes. + neg_iou_thr (float or tuple): IoU threshold for negative bboxes. + min_pos_iou (float): Minimum iou for a bbox to be considered as a + positive bbox. Positive samples can have smaller IoU than + pos_iou_thr due to the 4th step (assign max IoU sample to each gt). + `min_pos_iou` is set to avoid assigning bboxes that have extremely + small iou with GT as positive samples. It brings about 0.3 mAP + improvements in 1x schedule but does not affect the performance of + 3x schedule. More comparisons can be found in + `PR #7464 `_. + gt_max_assign_all (bool): Whether to assign all bboxes with the same + highest overlap with some gt to that gt. + ignore_iof_thr (float): IoF threshold for ignoring bboxes (if + `gt_bboxes_ignore` is specified). Negative values mean not + ignoring any bboxes. + ignore_wrt_candidates (bool): Whether to compute the iof between + `bboxes` and `gt_bboxes_ignore`, or the contrary. + match_low_quality (bool): Whether to allow low quality matches. This is + usually allowed for RPN and single stage detectors, but not allowed + in the second stage. Details are demonstrated in Step 4. + gpu_assign_thr (int): The upper bound of the number of GT for GPU + assign. When the number of gt is above this threshold, will assign + on CPU device. Negative values mean not assign on CPU. + """ + + def __init__(self, + pos_iou_thr, + neg_iou_thr, + min_pos_iou=.0, + gt_max_assign_all=True, + ignore_iof_thr=-1, + ignore_wrt_candidates=True, + match_low_quality=True, + gpu_assign_thr=-1, + iou_calculator=dict(type='BboxOverlaps2D')): + self.pos_iou_thr = pos_iou_thr + self.neg_iou_thr = neg_iou_thr + self.min_pos_iou = min_pos_iou + self.gt_max_assign_all = gt_max_assign_all + self.ignore_iof_thr = ignore_iof_thr + self.ignore_wrt_candidates = ignore_wrt_candidates + self.gpu_assign_thr = gpu_assign_thr + self.match_low_quality = match_low_quality + self.iou_calculator = build_iou_calculator(iou_calculator) + + def assign(self, bboxes, gt_bboxes, gt_bboxes_ignore=None, gt_labels=None): + """Assign gt to bboxes. + + This method assign a gt bbox to every bbox (proposal/anchor), each bbox + will be assigned with -1, or a semi-positive number. -1 means negative + sample, semi-positive number is the index (0-based) of assigned gt. + The assignment is done in following steps, the order matters. + + 1. assign every bbox to the background + 2. assign proposals whose iou with all gts < neg_iou_thr to 0 + 3. for each bbox, if the iou with its nearest gt >= pos_iou_thr, + assign it to that bbox + 4. for each gt bbox, assign its nearest proposals (may be more than + one) to itself + + Args: + bboxes (Tensor): Bounding boxes to be assigned, shape(n, 4). + gt_bboxes (Tensor): Groundtruth boxes, shape (k, 4). + gt_bboxes_ignore (Tensor, optional): Ground truth bboxes that are + labelled as `ignored`, e.g., crowd boxes in COCO. + gt_labels (Tensor, optional): Label of gt_bboxes, shape (k, ). + + Returns: + :obj:`AssignResult`: The assign result. + + Example: + >>> self = MaxIoUAssigner(0.5, 0.5) + >>> bboxes = torch.Tensor([[0, 0, 10, 10], [10, 10, 20, 20]]) + >>> gt_bboxes = torch.Tensor([[0, 0, 10, 9]]) + >>> assign_result = self.assign(bboxes, gt_bboxes) + >>> expected_gt_inds = torch.LongTensor([1, 0]) + >>> assert torch.all(assign_result.gt_inds == expected_gt_inds) + """ + assign_on_cpu = True if (self.gpu_assign_thr > 0) and ( + gt_bboxes.shape[0] > self.gpu_assign_thr) else False + # compute overlap and assign gt on CPU when number of GT is large + if assign_on_cpu: + device = bboxes.device + bboxes = bboxes.cpu() + gt_bboxes = gt_bboxes.cpu() + if gt_bboxes_ignore is not None: + gt_bboxes_ignore = gt_bboxes_ignore.cpu() + if gt_labels is not None: + gt_labels = gt_labels.cpu() + + overlaps = self.iou_calculator(gt_bboxes, bboxes) + + if (self.ignore_iof_thr > 0 and gt_bboxes_ignore is not None + and gt_bboxes_ignore.numel() > 0 and bboxes.numel() > 0): + if self.ignore_wrt_candidates: + ignore_overlaps = self.iou_calculator( + bboxes, gt_bboxes_ignore, mode='iof') + ignore_max_overlaps, _ = ignore_overlaps.max(dim=1) + else: + ignore_overlaps = self.iou_calculator( + gt_bboxes_ignore, bboxes, mode='iof') + ignore_max_overlaps, _ = ignore_overlaps.max(dim=0) + overlaps[:, ignore_max_overlaps > self.ignore_iof_thr] = -1 + + assign_result = self.assign_wrt_overlaps(overlaps, gt_labels) + if assign_on_cpu: + assign_result.gt_inds = assign_result.gt_inds.to(device) + assign_result.max_overlaps = assign_result.max_overlaps.to(device) + if assign_result.labels is not None: + assign_result.labels = assign_result.labels.to(device) + return assign_result + + def assign_wrt_overlaps(self, overlaps, gt_labels=None): + """Assign w.r.t. the overlaps of bboxes with gts. + + Args: + overlaps (Tensor): Overlaps between k gt_bboxes and n bboxes, + shape(k, n). + gt_labels (Tensor, optional): Labels of k gt_bboxes, shape (k, ). + + Returns: + :obj:`AssignResult`: The assign result. + """ + num_gts, num_bboxes = overlaps.size(0), overlaps.size(1) + + # 1. assign -1 by default + assigned_gt_inds = overlaps.new_full((num_bboxes, ), + -1, + dtype=torch.long) + + if num_gts == 0 or num_bboxes == 0: + # No ground truth or boxes, return empty assignment + max_overlaps = overlaps.new_zeros((num_bboxes, )) + if num_gts == 0: + # No truth, assign everything to background + assigned_gt_inds[:] = 0 + if gt_labels is None: + assigned_labels = None + else: + assigned_labels = overlaps.new_full((num_bboxes, ), + -1, + dtype=torch.long) + return AssignResult( + num_gts, + assigned_gt_inds, + max_overlaps, + labels=assigned_labels) + + # for each anchor, which gt best overlaps with it + # for each anchor, the max iou of all gts + max_overlaps, argmax_overlaps = overlaps.max(dim=0) + # for each gt, which anchor best overlaps with it + # for each gt, the max iou of all proposals + gt_max_overlaps, gt_argmax_overlaps = overlaps.max(dim=1) + + # 2. assign negative: below + # the negative inds are set to be 0 + if isinstance(self.neg_iou_thr, float): + assigned_gt_inds[(max_overlaps >= 0) + & (max_overlaps < self.neg_iou_thr)] = 0 + elif isinstance(self.neg_iou_thr, tuple): + assert len(self.neg_iou_thr) == 2 + assigned_gt_inds[(max_overlaps >= self.neg_iou_thr[0]) + & (max_overlaps < self.neg_iou_thr[1])] = 0 + + # 3. assign positive: above positive IoU threshold + pos_inds = max_overlaps >= self.pos_iou_thr + assigned_gt_inds[pos_inds] = argmax_overlaps[pos_inds] + 1 + + if self.match_low_quality: + # Low-quality matching will overwrite the assigned_gt_inds assigned + # in Step 3. Thus, the assigned gt might not be the best one for + # prediction. + # For example, if bbox A has 0.9 and 0.8 iou with GT bbox 1 & 2, + # bbox 1 will be assigned as the best target for bbox A in step 3. + # However, if GT bbox 2's gt_argmax_overlaps = A, bbox A's + # assigned_gt_inds will be overwritten to be bbox 2. + # This might be the reason that it is not used in ROI Heads. + for i in range(num_gts): + if gt_max_overlaps[i] >= self.min_pos_iou: + if self.gt_max_assign_all: + max_iou_inds = overlaps[i, :] == gt_max_overlaps[i] + assigned_gt_inds[max_iou_inds] = i + 1 + else: + assigned_gt_inds[gt_argmax_overlaps[i]] = i + 1 + + if gt_labels is not None: + assigned_labels = assigned_gt_inds.new_full((num_bboxes, ), -1) + pos_inds = torch.nonzero( + assigned_gt_inds > 0, as_tuple=False).squeeze() + if pos_inds.numel() > 0: + assigned_labels[pos_inds] = gt_labels[ + assigned_gt_inds[pos_inds] - 1] + else: + assigned_labels = None + + return AssignResult( + num_gts, assigned_gt_inds, max_overlaps, labels=assigned_labels) diff --git a/mmdet/core/bbox/assigners/point_assigner.py b/mmdet/core/bbox/assigners/point_assigner.py new file mode 100644 index 0000000..b0dc224 --- /dev/null +++ b/mmdet/core/bbox/assigners/point_assigner.py @@ -0,0 +1,134 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from ..builder import BBOX_ASSIGNERS +from .assign_result import AssignResult +from .base_assigner import BaseAssigner + + +@BBOX_ASSIGNERS.register_module() +class PointAssigner(BaseAssigner): + """Assign a corresponding gt bbox or background to each point. + + Each proposals will be assigned with `0`, or a positive integer + indicating the ground truth index. + + - 0: negative sample, no assigned gt + - positive integer: positive sample, index (1-based) of assigned gt + """ + + def __init__(self, scale=4, pos_num=3): + self.scale = scale + self.pos_num = pos_num + + def assign(self, points, gt_bboxes, gt_bboxes_ignore=None, gt_labels=None): + """Assign gt to points. + + This method assign a gt bbox to every points set, each points set + will be assigned with the background_label (-1), or a label number. + -1 is background, and semi-positive number is the index (0-based) of + assigned gt. + The assignment is done in following steps, the order matters. + + 1. assign every points to the background_label (-1) + 2. A point is assigned to some gt bbox if + (i) the point is within the k closest points to the gt bbox + (ii) the distance between this point and the gt is smaller than + other gt bboxes + + Args: + points (Tensor): points to be assigned, shape(n, 3) while last + dimension stands for (x, y, stride). + gt_bboxes (Tensor): Groundtruth boxes, shape (k, 4). + gt_bboxes_ignore (Tensor, optional): Ground truth bboxes that are + labelled as `ignored`, e.g., crowd boxes in COCO. + NOTE: currently unused. + gt_labels (Tensor, optional): Label of gt_bboxes, shape (k, ). + + Returns: + :obj:`AssignResult`: The assign result. + """ + num_points = points.shape[0] + num_gts = gt_bboxes.shape[0] + + if num_gts == 0 or num_points == 0: + # If no truth assign everything to the background + assigned_gt_inds = points.new_full((num_points, ), + 0, + dtype=torch.long) + if gt_labels is None: + assigned_labels = None + else: + assigned_labels = points.new_full((num_points, ), + -1, + dtype=torch.long) + return AssignResult( + num_gts, assigned_gt_inds, None, labels=assigned_labels) + + points_xy = points[:, :2] + points_stride = points[:, 2] + points_lvl = torch.log2( + points_stride).int() # [3...,4...,5...,6...,7...] + lvl_min, lvl_max = points_lvl.min(), points_lvl.max() + + # assign gt box + gt_bboxes_xy = (gt_bboxes[:, :2] + gt_bboxes[:, 2:]) / 2 + gt_bboxes_wh = (gt_bboxes[:, 2:] - gt_bboxes[:, :2]).clamp(min=1e-6) + scale = self.scale + gt_bboxes_lvl = ((torch.log2(gt_bboxes_wh[:, 0] / scale) + + torch.log2(gt_bboxes_wh[:, 1] / scale)) / 2).int() + gt_bboxes_lvl = torch.clamp(gt_bboxes_lvl, min=lvl_min, max=lvl_max) + + # stores the assigned gt index of each point + assigned_gt_inds = points.new_zeros((num_points, ), dtype=torch.long) + # stores the assigned gt dist (to this point) of each point + assigned_gt_dist = points.new_full((num_points, ), float('inf')) + points_range = torch.arange(points.shape[0]) + + for idx in range(num_gts): + gt_lvl = gt_bboxes_lvl[idx] + # get the index of points in this level + lvl_idx = gt_lvl == points_lvl + points_index = points_range[lvl_idx] + # get the points in this level + lvl_points = points_xy[lvl_idx, :] + # get the center point of gt + gt_point = gt_bboxes_xy[[idx], :] + # get width and height of gt + gt_wh = gt_bboxes_wh[[idx], :] + # compute the distance between gt center and + # all points in this level + points_gt_dist = ((lvl_points - gt_point) / gt_wh).norm(dim=1) + # find the nearest k points to gt center in this level + min_dist, min_dist_index = torch.topk( + points_gt_dist, self.pos_num, largest=False) + # the index of nearest k points to gt center in this level + min_dist_points_index = points_index[min_dist_index] + # The less_than_recorded_index stores the index + # of min_dist that is less then the assigned_gt_dist. Where + # assigned_gt_dist stores the dist from previous assigned gt + # (if exist) to each point. + less_than_recorded_index = min_dist < assigned_gt_dist[ + min_dist_points_index] + # The min_dist_points_index stores the index of points satisfy: + # (1) it is k nearest to current gt center in this level. + # (2) it is closer to current gt center than other gt center. + min_dist_points_index = min_dist_points_index[ + less_than_recorded_index] + # assign the result + assigned_gt_inds[min_dist_points_index] = idx + 1 + assigned_gt_dist[min_dist_points_index] = min_dist[ + less_than_recorded_index] + + if gt_labels is not None: + assigned_labels = assigned_gt_inds.new_full((num_points, ), -1) + pos_inds = torch.nonzero( + assigned_gt_inds > 0, as_tuple=False).squeeze() + if pos_inds.numel() > 0: + assigned_labels[pos_inds] = gt_labels[ + assigned_gt_inds[pos_inds] - 1] + else: + assigned_labels = None + + return AssignResult( + num_gts, assigned_gt_inds, None, labels=assigned_labels) diff --git a/mmdet/core/bbox/assigners/region_assigner.py b/mmdet/core/bbox/assigners/region_assigner.py new file mode 100644 index 0000000..1833b89 --- /dev/null +++ b/mmdet/core/bbox/assigners/region_assigner.py @@ -0,0 +1,222 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from mmdet.core import anchor_inside_flags +from ..builder import BBOX_ASSIGNERS +from .assign_result import AssignResult +from .base_assigner import BaseAssigner + + +def calc_region(bbox, ratio, stride, featmap_size=None): + """Calculate region of the box defined by the ratio, the ratio is from the + center of the box to every edge.""" + # project bbox on the feature + f_bbox = bbox / stride + x1 = torch.round((1 - ratio) * f_bbox[0] + ratio * f_bbox[2]) + y1 = torch.round((1 - ratio) * f_bbox[1] + ratio * f_bbox[3]) + x2 = torch.round(ratio * f_bbox[0] + (1 - ratio) * f_bbox[2]) + y2 = torch.round(ratio * f_bbox[1] + (1 - ratio) * f_bbox[3]) + if featmap_size is not None: + x1 = x1.clamp(min=0, max=featmap_size[1]) + y1 = y1.clamp(min=0, max=featmap_size[0]) + x2 = x2.clamp(min=0, max=featmap_size[1]) + y2 = y2.clamp(min=0, max=featmap_size[0]) + return (x1, y1, x2, y2) + + +def anchor_ctr_inside_region_flags(anchors, stride, region): + """Get the flag indicate whether anchor centers are inside regions.""" + x1, y1, x2, y2 = region + f_anchors = anchors / stride + x = (f_anchors[:, 0] + f_anchors[:, 2]) * 0.5 + y = (f_anchors[:, 1] + f_anchors[:, 3]) * 0.5 + flags = (x >= x1) & (x <= x2) & (y >= y1) & (y <= y2) + return flags + + +@BBOX_ASSIGNERS.register_module() +class RegionAssigner(BaseAssigner): + """Assign a corresponding gt bbox or background to each bbox. + + Each proposals will be assigned with `-1`, `0`, or a positive integer + indicating the ground truth index. + + - -1: don't care + - 0: negative sample, no assigned gt + - positive integer: positive sample, index (1-based) of assigned gt + + Args: + center_ratio: ratio of the region in the center of the bbox to + define positive sample. + ignore_ratio: ratio of the region to define ignore samples. + """ + + def __init__(self, center_ratio=0.2, ignore_ratio=0.5): + self.center_ratio = center_ratio + self.ignore_ratio = ignore_ratio + + def assign(self, + mlvl_anchors, + mlvl_valid_flags, + gt_bboxes, + img_meta, + featmap_sizes, + anchor_scale, + anchor_strides, + gt_bboxes_ignore=None, + gt_labels=None, + allowed_border=0): + """Assign gt to anchors. + + This method assign a gt bbox to every bbox (proposal/anchor), each bbox + will be assigned with -1, 0, or a positive number. -1 means don't care, + 0 means negative sample, positive number is the index (1-based) of + assigned gt. + + The assignment is done in following steps, and the order matters. + + 1. Assign every anchor to 0 (negative) + 2. (For each gt_bboxes) Compute ignore flags based on ignore_region + then assign -1 to anchors w.r.t. ignore flags + 3. (For each gt_bboxes) Compute pos flags based on center_region then + assign gt_bboxes to anchors w.r.t. pos flags + 4. (For each gt_bboxes) Compute ignore flags based on adjacent anchor + level then assign -1 to anchors w.r.t. ignore flags + 5. Assign anchor outside of image to -1 + + Args: + mlvl_anchors (list[Tensor]): Multi level anchors. + mlvl_valid_flags (list[Tensor]): Multi level valid flags. + gt_bboxes (Tensor): Ground truth bboxes of image + img_meta (dict): Meta info of image. + featmap_sizes (list[Tensor]): Feature mapsize each level + anchor_scale (int): Scale of the anchor. + anchor_strides (list[int]): Stride of the anchor. + gt_bboxes (Tensor): Groundtruth boxes, shape (k, 4). + gt_bboxes_ignore (Tensor, optional): Ground truth bboxes that are + labelled as `ignored`, e.g., crowd boxes in COCO. + gt_labels (Tensor, optional): Label of gt_bboxes, shape (k, ). + allowed_border (int, optional): The border to allow the valid + anchor. Defaults to 0. + + Returns: + :obj:`AssignResult`: The assign result. + """ + if gt_bboxes_ignore is not None: + raise NotImplementedError + + num_gts = gt_bboxes.shape[0] + num_bboxes = sum(x.shape[0] for x in mlvl_anchors) + + if num_gts == 0 or num_bboxes == 0: + # No ground truth or boxes, return empty assignment + max_overlaps = gt_bboxes.new_zeros((num_bboxes, )) + assigned_gt_inds = gt_bboxes.new_zeros((num_bboxes, ), + dtype=torch.long) + if gt_labels is None: + assigned_labels = None + else: + assigned_labels = gt_bboxes.new_full((num_bboxes, ), + -1, + dtype=torch.long) + return AssignResult( + num_gts, + assigned_gt_inds, + max_overlaps, + labels=assigned_labels) + + num_lvls = len(mlvl_anchors) + r1 = (1 - self.center_ratio) / 2 + r2 = (1 - self.ignore_ratio) / 2 + + scale = torch.sqrt((gt_bboxes[:, 2] - gt_bboxes[:, 0]) * + (gt_bboxes[:, 3] - gt_bboxes[:, 1])) + min_anchor_size = scale.new_full( + (1, ), float(anchor_scale * anchor_strides[0])) + target_lvls = torch.floor( + torch.log2(scale) - torch.log2(min_anchor_size) + 0.5) + target_lvls = target_lvls.clamp(min=0, max=num_lvls - 1).long() + + # 1. assign 0 (negative) by default + mlvl_assigned_gt_inds = [] + mlvl_ignore_flags = [] + for lvl in range(num_lvls): + h, w = featmap_sizes[lvl] + assert h * w == mlvl_anchors[lvl].shape[0] + assigned_gt_inds = gt_bboxes.new_full((h * w, ), + 0, + dtype=torch.long) + ignore_flags = torch.zeros_like(assigned_gt_inds) + mlvl_assigned_gt_inds.append(assigned_gt_inds) + mlvl_ignore_flags.append(ignore_flags) + + for gt_id in range(num_gts): + lvl = target_lvls[gt_id].item() + featmap_size = featmap_sizes[lvl] + stride = anchor_strides[lvl] + anchors = mlvl_anchors[lvl] + gt_bbox = gt_bboxes[gt_id, :4] + + # Compute regions + ignore_region = calc_region(gt_bbox, r2, stride, featmap_size) + ctr_region = calc_region(gt_bbox, r1, stride, featmap_size) + + # 2. Assign -1 to ignore flags + ignore_flags = anchor_ctr_inside_region_flags( + anchors, stride, ignore_region) + mlvl_assigned_gt_inds[lvl][ignore_flags] = -1 + + # 3. Assign gt_bboxes to pos flags + pos_flags = anchor_ctr_inside_region_flags(anchors, stride, + ctr_region) + mlvl_assigned_gt_inds[lvl][pos_flags] = gt_id + 1 + + # 4. Assign -1 to ignore adjacent lvl + if lvl > 0: + d_lvl = lvl - 1 + d_anchors = mlvl_anchors[d_lvl] + d_featmap_size = featmap_sizes[d_lvl] + d_stride = anchor_strides[d_lvl] + d_ignore_region = calc_region(gt_bbox, r2, d_stride, + d_featmap_size) + ignore_flags = anchor_ctr_inside_region_flags( + d_anchors, d_stride, d_ignore_region) + mlvl_ignore_flags[d_lvl][ignore_flags] = 1 + if lvl < num_lvls - 1: + u_lvl = lvl + 1 + u_anchors = mlvl_anchors[u_lvl] + u_featmap_size = featmap_sizes[u_lvl] + u_stride = anchor_strides[u_lvl] + u_ignore_region = calc_region(gt_bbox, r2, u_stride, + u_featmap_size) + ignore_flags = anchor_ctr_inside_region_flags( + u_anchors, u_stride, u_ignore_region) + mlvl_ignore_flags[u_lvl][ignore_flags] = 1 + + # 4. (cont.) Assign -1 to ignore adjacent lvl + for lvl in range(num_lvls): + ignore_flags = mlvl_ignore_flags[lvl] + mlvl_assigned_gt_inds[lvl][ignore_flags] = -1 + + # 5. Assign -1 to anchor outside of image + flat_assigned_gt_inds = torch.cat(mlvl_assigned_gt_inds) + flat_anchors = torch.cat(mlvl_anchors) + flat_valid_flags = torch.cat(mlvl_valid_flags) + assert (flat_assigned_gt_inds.shape[0] == flat_anchors.shape[0] == + flat_valid_flags.shape[0]) + inside_flags = anchor_inside_flags(flat_anchors, flat_valid_flags, + img_meta['img_shape'], + allowed_border) + outside_flags = ~inside_flags + flat_assigned_gt_inds[outside_flags] = -1 + + if gt_labels is not None: + assigned_labels = torch.zeros_like(flat_assigned_gt_inds) + pos_flags = assigned_gt_inds > 0 + assigned_labels[pos_flags] = gt_labels[ + flat_assigned_gt_inds[pos_flags] - 1] + else: + assigned_labels = None + + return AssignResult( + num_gts, flat_assigned_gt_inds, None, labels=assigned_labels) diff --git a/mmdet/core/bbox/assigners/sim_ota_assigner.py b/mmdet/core/bbox/assigners/sim_ota_assigner.py new file mode 100644 index 0000000..58bfef4 --- /dev/null +++ b/mmdet/core/bbox/assigners/sim_ota_assigner.py @@ -0,0 +1,257 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch +import torch.nn.functional as F + +from ..builder import BBOX_ASSIGNERS +from ..iou_calculators import bbox_overlaps +from .assign_result import AssignResult +from .base_assigner import BaseAssigner + + +@BBOX_ASSIGNERS.register_module() +class SimOTAAssigner(BaseAssigner): + """Computes matching between predictions and ground truth. + + Args: + center_radius (int | float, optional): Ground truth center size + to judge whether a prior is in center. Default 2.5. + candidate_topk (int, optional): The candidate top-k which used to + get top-k ious to calculate dynamic-k. Default 10. + iou_weight (int | float, optional): The scale factor for regression + iou cost. Default 3.0. + cls_weight (int | float, optional): The scale factor for classification + cost. Default 1.0. + """ + + def __init__(self, + center_radius=2.5, + candidate_topk=10, + iou_weight=3.0, + cls_weight=1.0): + self.center_radius = center_radius + self.candidate_topk = candidate_topk + self.iou_weight = iou_weight + self.cls_weight = cls_weight + + def assign(self, + pred_scores, + priors, + decoded_bboxes, + gt_bboxes, + gt_labels, + gt_bboxes_ignore=None, + eps=1e-7): + """Assign gt to priors using SimOTA. It will switch to CPU mode when + GPU is out of memory. + Args: + pred_scores (Tensor): Classification scores of one image, + a 2D-Tensor with shape [num_priors, num_classes] + priors (Tensor): All priors of one image, a 2D-Tensor with shape + [num_priors, 4] in [cx, xy, stride_w, stride_y] format. + decoded_bboxes (Tensor): Predicted bboxes, a 2D-Tensor with shape + [num_priors, 4] in [tl_x, tl_y, br_x, br_y] format. + gt_bboxes (Tensor): Ground truth bboxes of one image, a 2D-Tensor + with shape [num_gts, 4] in [tl_x, tl_y, br_x, br_y] format. + gt_labels (Tensor): Ground truth labels of one image, a Tensor + with shape [num_gts]. + gt_bboxes_ignore (Tensor, optional): Ground truth bboxes that are + labelled as `ignored`, e.g., crowd boxes in COCO. + eps (float): A value added to the denominator for numerical + stability. Default 1e-7. + Returns: + assign_result (obj:`AssignResult`): The assigned result. + """ + try: + assign_result = self._assign(pred_scores, priors, decoded_bboxes, + gt_bboxes, gt_labels, + gt_bboxes_ignore, eps) + return assign_result + except RuntimeError: + origin_device = pred_scores.device + warnings.warn('OOM RuntimeError is raised due to the huge memory ' + 'cost during label assignment. CPU mode is applied ' + 'in this batch. If you want to avoid this issue, ' + 'try to reduce the batch size or image size.') + torch.cuda.empty_cache() + + pred_scores = pred_scores.cpu() + priors = priors.cpu() + decoded_bboxes = decoded_bboxes.cpu() + gt_bboxes = gt_bboxes.cpu().float() + gt_labels = gt_labels.cpu() + + assign_result = self._assign(pred_scores, priors, decoded_bboxes, + gt_bboxes, gt_labels, + gt_bboxes_ignore, eps) + assign_result.gt_inds = assign_result.gt_inds.to(origin_device) + assign_result.max_overlaps = assign_result.max_overlaps.to( + origin_device) + assign_result.labels = assign_result.labels.to(origin_device) + + return assign_result + + def _assign(self, + pred_scores, + priors, + decoded_bboxes, + gt_bboxes, + gt_labels, + gt_bboxes_ignore=None, + eps=1e-7): + """Assign gt to priors using SimOTA. + Args: + pred_scores (Tensor): Classification scores of one image, + a 2D-Tensor with shape [num_priors, num_classes] + priors (Tensor): All priors of one image, a 2D-Tensor with shape + [num_priors, 4] in [cx, xy, stride_w, stride_y] format. + decoded_bboxes (Tensor): Predicted bboxes, a 2D-Tensor with shape + [num_priors, 4] in [tl_x, tl_y, br_x, br_y] format. + gt_bboxes (Tensor): Ground truth bboxes of one image, a 2D-Tensor + with shape [num_gts, 4] in [tl_x, tl_y, br_x, br_y] format. + gt_labels (Tensor): Ground truth labels of one image, a Tensor + with shape [num_gts]. + gt_bboxes_ignore (Tensor, optional): Ground truth bboxes that are + labelled as `ignored`, e.g., crowd boxes in COCO. + eps (float): A value added to the denominator for numerical + stability. Default 1e-7. + Returns: + :obj:`AssignResult`: The assigned result. + """ + INF = 100000.0 + num_gt = gt_bboxes.size(0) + num_bboxes = decoded_bboxes.size(0) + + # assign 0 by default + assigned_gt_inds = decoded_bboxes.new_full((num_bboxes, ), + 0, + dtype=torch.long) + valid_mask, is_in_boxes_and_center = self.get_in_gt_and_in_center_info( + priors, gt_bboxes) + valid_decoded_bbox = decoded_bboxes[valid_mask] + valid_pred_scores = pred_scores[valid_mask] + num_valid = valid_decoded_bbox.size(0) + + if num_gt == 0 or num_bboxes == 0 or num_valid == 0: + # No ground truth or boxes, return empty assignment + max_overlaps = decoded_bboxes.new_zeros((num_bboxes, )) + if num_gt == 0: + # No truth, assign everything to background + assigned_gt_inds[:] = 0 + if gt_labels is None: + assigned_labels = None + else: + assigned_labels = decoded_bboxes.new_full((num_bboxes, ), + -1, + dtype=torch.long) + return AssignResult( + num_gt, assigned_gt_inds, max_overlaps, labels=assigned_labels) + + pairwise_ious = bbox_overlaps(valid_decoded_bbox, gt_bboxes) + iou_cost = -torch.log(pairwise_ious + eps) + + gt_onehot_label = ( + F.one_hot(gt_labels.to(torch.int64), + pred_scores.shape[-1]).float().unsqueeze(0).repeat( + num_valid, 1, 1)) + + valid_pred_scores = valid_pred_scores.unsqueeze(1).repeat(1, num_gt, 1) + cls_cost = ( + F.binary_cross_entropy( + valid_pred_scores.to(dtype=torch.float32).sqrt_(), + gt_onehot_label, + reduction='none', + ).sum(-1).to(dtype=valid_pred_scores.dtype)) + + cost_matrix = ( + cls_cost * self.cls_weight + iou_cost * self.iou_weight + + (~is_in_boxes_and_center) * INF) + + matched_pred_ious, matched_gt_inds = \ + self.dynamic_k_matching( + cost_matrix, pairwise_ious, num_gt, valid_mask) + + # convert to AssignResult format + assigned_gt_inds[valid_mask] = matched_gt_inds + 1 + assigned_labels = assigned_gt_inds.new_full((num_bboxes, ), -1) + assigned_labels[valid_mask] = gt_labels[matched_gt_inds].long() + max_overlaps = assigned_gt_inds.new_full((num_bboxes, ), + -INF, + dtype=torch.float32) + max_overlaps[valid_mask] = matched_pred_ious + return AssignResult( + num_gt, assigned_gt_inds, max_overlaps, labels=assigned_labels) + + def get_in_gt_and_in_center_info(self, priors, gt_bboxes): + num_gt = gt_bboxes.size(0) + + repeated_x = priors[:, 0].unsqueeze(1).repeat(1, num_gt) + repeated_y = priors[:, 1].unsqueeze(1).repeat(1, num_gt) + repeated_stride_x = priors[:, 2].unsqueeze(1).repeat(1, num_gt) + repeated_stride_y = priors[:, 3].unsqueeze(1).repeat(1, num_gt) + + # is prior centers in gt bboxes, shape: [n_prior, n_gt] + l_ = repeated_x - gt_bboxes[:, 0] + t_ = repeated_y - gt_bboxes[:, 1] + r_ = gt_bboxes[:, 2] - repeated_x + b_ = gt_bboxes[:, 3] - repeated_y + + deltas = torch.stack([l_, t_, r_, b_], dim=1) + is_in_gts = deltas.min(dim=1).values > 0 + is_in_gts_all = is_in_gts.sum(dim=1) > 0 + + # is prior centers in gt centers + gt_cxs = (gt_bboxes[:, 0] + gt_bboxes[:, 2]) / 2.0 + gt_cys = (gt_bboxes[:, 1] + gt_bboxes[:, 3]) / 2.0 + ct_box_l = gt_cxs - self.center_radius * repeated_stride_x + ct_box_t = gt_cys - self.center_radius * repeated_stride_y + ct_box_r = gt_cxs + self.center_radius * repeated_stride_x + ct_box_b = gt_cys + self.center_radius * repeated_stride_y + + cl_ = repeated_x - ct_box_l + ct_ = repeated_y - ct_box_t + cr_ = ct_box_r - repeated_x + cb_ = ct_box_b - repeated_y + + ct_deltas = torch.stack([cl_, ct_, cr_, cb_], dim=1) + is_in_cts = ct_deltas.min(dim=1).values > 0 + is_in_cts_all = is_in_cts.sum(dim=1) > 0 + + # in boxes or in centers, shape: [num_priors] + is_in_gts_or_centers = is_in_gts_all | is_in_cts_all + + # both in boxes and centers, shape: [num_fg, num_gt] + is_in_boxes_and_centers = ( + is_in_gts[is_in_gts_or_centers, :] + & is_in_cts[is_in_gts_or_centers, :]) + return is_in_gts_or_centers, is_in_boxes_and_centers + + def dynamic_k_matching(self, cost, pairwise_ious, num_gt, valid_mask): + matching_matrix = torch.zeros_like(cost, dtype=torch.uint8) + # select candidate topk ious for dynamic-k calculation + candidate_topk = min(self.candidate_topk, pairwise_ious.size(0)) + topk_ious, _ = torch.topk(pairwise_ious, candidate_topk, dim=0) + # calculate dynamic k for each gt + dynamic_ks = torch.clamp(topk_ious.sum(0).int(), min=1) + for gt_idx in range(num_gt): + _, pos_idx = torch.topk( + cost[:, gt_idx], k=dynamic_ks[gt_idx], largest=False) + matching_matrix[:, gt_idx][pos_idx] = 1 + + del topk_ious, dynamic_ks, pos_idx + + prior_match_gt_mask = matching_matrix.sum(1) > 1 + if prior_match_gt_mask.sum() > 0: + cost_min, cost_argmin = torch.min( + cost[prior_match_gt_mask, :], dim=1) + matching_matrix[prior_match_gt_mask, :] *= 0 + matching_matrix[prior_match_gt_mask, cost_argmin] = 1 + # get foreground mask inside box and center prior + fg_mask_inboxes = matching_matrix.sum(1) > 0 + valid_mask[valid_mask.clone()] = fg_mask_inboxes + + matched_gt_inds = matching_matrix[fg_mask_inboxes, :].argmax(1) + matched_pred_ious = (matching_matrix * + pairwise_ious).sum(1)[fg_mask_inboxes] + return matched_pred_ious, matched_gt_inds diff --git a/mmdet/core/bbox/assigners/task_aligned_assigner.py b/mmdet/core/bbox/assigners/task_aligned_assigner.py new file mode 100644 index 0000000..1872de4 --- /dev/null +++ b/mmdet/core/bbox/assigners/task_aligned_assigner.py @@ -0,0 +1,151 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from ..builder import BBOX_ASSIGNERS +from ..iou_calculators import build_iou_calculator +from .assign_result import AssignResult +from .base_assigner import BaseAssigner + +INF = 100000000 + + +@BBOX_ASSIGNERS.register_module() +class TaskAlignedAssigner(BaseAssigner): + """Task aligned assigner used in the paper: + `TOOD: Task-aligned One-stage Object Detection. + `_. + + Assign a corresponding gt bbox or background to each predicted bbox. + Each bbox will be assigned with `0` or a positive integer + indicating the ground truth index. + + - 0: negative sample, no assigned gt + - positive integer: positive sample, index (1-based) of assigned gt + + Args: + topk (int): number of bbox selected in each level + iou_calculator (dict): Config dict for iou calculator. + Default: dict(type='BboxOverlaps2D') + """ + + def __init__(self, topk, iou_calculator=dict(type='BboxOverlaps2D')): + assert topk >= 1 + self.topk = topk + self.iou_calculator = build_iou_calculator(iou_calculator) + + def assign(self, + pred_scores, + decode_bboxes, + anchors, + gt_bboxes, + gt_bboxes_ignore=None, + gt_labels=None, + alpha=1, + beta=6): + """Assign gt to bboxes. + + The assignment is done in following steps + + 1. compute alignment metric between all bbox (bbox of all pyramid + levels) and gt + 2. select top-k bbox as candidates for each gt + 3. limit the positive sample's center in gt (because the anchor-free + detector only can predict positive distance) + + + Args: + pred_scores (Tensor): predicted class probability, + shape(n, num_classes) + decode_bboxes (Tensor): predicted bounding boxes, shape(n, 4) + anchors (Tensor): pre-defined anchors, shape(n, 4). + gt_bboxes (Tensor): Groundtruth boxes, shape (k, 4). + gt_bboxes_ignore (Tensor, optional): Ground truth bboxes that are + labelled as `ignored`, e.g., crowd boxes in COCO. + gt_labels (Tensor, optional): Label of gt_bboxes, shape (k, ). + + Returns: + :obj:`TaskAlignedAssignResult`: The assign result. + """ + anchors = anchors[:, :4] + num_gt, num_bboxes = gt_bboxes.size(0), anchors.size(0) + # compute alignment metric between all bbox and gt + overlaps = self.iou_calculator(decode_bboxes, gt_bboxes).detach() + bbox_scores = pred_scores[:, gt_labels].detach() + # assign 0 by default + assigned_gt_inds = anchors.new_full((num_bboxes, ), + 0, + dtype=torch.long) + assign_metrics = anchors.new_zeros((num_bboxes, )) + + if num_gt == 0 or num_bboxes == 0: + # No ground truth or boxes, return empty assignment + max_overlaps = anchors.new_zeros((num_bboxes, )) + if num_gt == 0: + # No gt boxes, assign everything to background + assigned_gt_inds[:] = 0 + if gt_labels is None: + assigned_labels = None + else: + assigned_labels = anchors.new_full((num_bboxes, ), + -1, + dtype=torch.long) + assign_result = AssignResult( + num_gt, assigned_gt_inds, max_overlaps, labels=assigned_labels) + assign_result.assign_metrics = assign_metrics + return assign_result + + # select top-k bboxes as candidates for each gt + alignment_metrics = bbox_scores**alpha * overlaps**beta + topk = min(self.topk, alignment_metrics.size(0)) + _, candidate_idxs = alignment_metrics.topk(topk, dim=0, largest=True) + candidate_metrics = alignment_metrics[candidate_idxs, + torch.arange(num_gt)] + is_pos = candidate_metrics > 0 + + # limit the positive sample's center in gt + anchors_cx = (anchors[:, 0] + anchors[:, 2]) / 2.0 + anchors_cy = (anchors[:, 1] + anchors[:, 3]) / 2.0 + for gt_idx in range(num_gt): + candidate_idxs[:, gt_idx] += gt_idx * num_bboxes + ep_anchors_cx = anchors_cx.view(1, -1).expand( + num_gt, num_bboxes).contiguous().view(-1) + ep_anchors_cy = anchors_cy.view(1, -1).expand( + num_gt, num_bboxes).contiguous().view(-1) + candidate_idxs = candidate_idxs.view(-1) + + # calculate the left, top, right, bottom distance between positive + # bbox center and gt side + l_ = ep_anchors_cx[candidate_idxs].view(-1, num_gt) - gt_bboxes[:, 0] + t_ = ep_anchors_cy[candidate_idxs].view(-1, num_gt) - gt_bboxes[:, 1] + r_ = gt_bboxes[:, 2] - ep_anchors_cx[candidate_idxs].view(-1, num_gt) + b_ = gt_bboxes[:, 3] - ep_anchors_cy[candidate_idxs].view(-1, num_gt) + is_in_gts = torch.stack([l_, t_, r_, b_], dim=1).min(dim=1)[0] > 0.01 + is_pos = is_pos & is_in_gts + + # if an anchor box is assigned to multiple gts, + # the one with the highest iou will be selected. + overlaps_inf = torch.full_like(overlaps, + -INF).t().contiguous().view(-1) + index = candidate_idxs.view(-1)[is_pos.view(-1)] + overlaps_inf[index] = overlaps.t().contiguous().view(-1)[index] + overlaps_inf = overlaps_inf.view(num_gt, -1).t() + + max_overlaps, argmax_overlaps = overlaps_inf.max(dim=1) + assigned_gt_inds[ + max_overlaps != -INF] = argmax_overlaps[max_overlaps != -INF] + 1 + assign_metrics[max_overlaps != -INF] = alignment_metrics[ + max_overlaps != -INF, argmax_overlaps[max_overlaps != -INF]] + + if gt_labels is not None: + assigned_labels = assigned_gt_inds.new_full((num_bboxes, ), -1) + pos_inds = torch.nonzero( + assigned_gt_inds > 0, as_tuple=False).squeeze() + if pos_inds.numel() > 0: + assigned_labels[pos_inds] = gt_labels[ + assigned_gt_inds[pos_inds] - 1] + else: + assigned_labels = None + assign_result = AssignResult( + num_gt, assigned_gt_inds, max_overlaps, labels=assigned_labels) + assign_result.assign_metrics = assign_metrics + return assign_result diff --git a/mmdet/core/bbox/assigners/uniform_assigner.py b/mmdet/core/bbox/assigners/uniform_assigner.py new file mode 100644 index 0000000..70294fc --- /dev/null +++ b/mmdet/core/bbox/assigners/uniform_assigner.py @@ -0,0 +1,135 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from ..builder import BBOX_ASSIGNERS +from ..iou_calculators import build_iou_calculator +from ..transforms import bbox_xyxy_to_cxcywh +from .assign_result import AssignResult +from .base_assigner import BaseAssigner + + +@BBOX_ASSIGNERS.register_module() +class UniformAssigner(BaseAssigner): + """Uniform Matching between the anchors and gt boxes, which can achieve + balance in positive anchors, and gt_bboxes_ignore was not considered for + now. + + Args: + pos_ignore_thr (float): the threshold to ignore positive anchors + neg_ignore_thr (float): the threshold to ignore negative anchors + match_times(int): Number of positive anchors for each gt box. + Default 4. + iou_calculator (dict): iou_calculator config + """ + + def __init__(self, + pos_ignore_thr, + neg_ignore_thr, + match_times=4, + iou_calculator=dict(type='BboxOverlaps2D')): + self.match_times = match_times + self.pos_ignore_thr = pos_ignore_thr + self.neg_ignore_thr = neg_ignore_thr + self.iou_calculator = build_iou_calculator(iou_calculator) + + def assign(self, + bbox_pred, + anchor, + gt_bboxes, + gt_bboxes_ignore=None, + gt_labels=None): + num_gts, num_bboxes = gt_bboxes.size(0), bbox_pred.size(0) + + # 1. assign -1 by default + assigned_gt_inds = bbox_pred.new_full((num_bboxes, ), + 0, + dtype=torch.long) + assigned_labels = bbox_pred.new_full((num_bboxes, ), + -1, + dtype=torch.long) + if num_gts == 0 or num_bboxes == 0: + # No ground truth or boxes, return empty assignment + if num_gts == 0: + # No ground truth, assign all to background + assigned_gt_inds[:] = 0 + assign_result = AssignResult( + num_gts, assigned_gt_inds, None, labels=assigned_labels) + assign_result.set_extra_property( + 'pos_idx', bbox_pred.new_empty(0, dtype=torch.bool)) + assign_result.set_extra_property('pos_predicted_boxes', + bbox_pred.new_empty((0, 4))) + assign_result.set_extra_property('target_boxes', + bbox_pred.new_empty((0, 4))) + return assign_result + + # 2. Compute the L1 cost between boxes + # Note that we use anchors and predict boxes both + cost_bbox = torch.cdist( + bbox_xyxy_to_cxcywh(bbox_pred), + bbox_xyxy_to_cxcywh(gt_bboxes), + p=1) + cost_bbox_anchors = torch.cdist( + bbox_xyxy_to_cxcywh(anchor), bbox_xyxy_to_cxcywh(gt_bboxes), p=1) + + # We found that topk function has different results in cpu and + # cuda mode. In order to ensure consistency with the source code, + # we also use cpu mode. + # TODO: Check whether the performance of cpu and cuda are the same. + C = cost_bbox.cpu() + C1 = cost_bbox_anchors.cpu() + + # self.match_times x n + index = torch.topk( + C, # c=b,n,x c[i]=n,x + k=self.match_times, + dim=0, + largest=False)[1] + + # self.match_times x n + index1 = torch.topk(C1, k=self.match_times, dim=0, largest=False)[1] + # (self.match_times*2) x n + indexes = torch.cat((index, index1), + dim=1).reshape(-1).to(bbox_pred.device) + + pred_overlaps = self.iou_calculator(bbox_pred, gt_bboxes) + anchor_overlaps = self.iou_calculator(anchor, gt_bboxes) + pred_max_overlaps, _ = pred_overlaps.max(dim=1) + anchor_max_overlaps, _ = anchor_overlaps.max(dim=0) + + # 3. Compute the ignore indexes use gt_bboxes and predict boxes + ignore_idx = pred_max_overlaps > self.neg_ignore_thr + assigned_gt_inds[ignore_idx] = -1 + + # 4. Compute the ignore indexes of positive sample use anchors + # and predict boxes + pos_gt_index = torch.arange( + 0, C1.size(1), + device=bbox_pred.device).repeat(self.match_times * 2) + pos_ious = anchor_overlaps[indexes, pos_gt_index] + pos_ignore_idx = pos_ious < self.pos_ignore_thr + + pos_gt_index_with_ignore = pos_gt_index + 1 + pos_gt_index_with_ignore[pos_ignore_idx] = -1 + assigned_gt_inds[indexes] = pos_gt_index_with_ignore + + if gt_labels is not None: + assigned_labels = assigned_gt_inds.new_full((num_bboxes, ), -1) + pos_inds = torch.nonzero( + assigned_gt_inds > 0, as_tuple=False).squeeze() + if pos_inds.numel() > 0: + assigned_labels[pos_inds] = gt_labels[ + assigned_gt_inds[pos_inds] - 1] + else: + assigned_labels = None + + assign_result = AssignResult( + num_gts, + assigned_gt_inds, + anchor_max_overlaps, + labels=assigned_labels) + assign_result.set_extra_property('pos_idx', ~pos_ignore_idx) + assign_result.set_extra_property('pos_predicted_boxes', + bbox_pred[indexes]) + assign_result.set_extra_property('target_boxes', + gt_bboxes[pos_gt_index]) + return assign_result diff --git a/mmdet/core/bbox/builder.py b/mmdet/core/bbox/builder.py new file mode 100644 index 0000000..9cfa055 --- /dev/null +++ b/mmdet/core/bbox/builder.py @@ -0,0 +1,21 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmcv.utils import Registry, build_from_cfg + +BBOX_ASSIGNERS = Registry('bbox_assigner') +BBOX_SAMPLERS = Registry('bbox_sampler') +BBOX_CODERS = Registry('bbox_coder') + + +def build_assigner(cfg, **default_args): + """Builder of box assigner.""" + return build_from_cfg(cfg, BBOX_ASSIGNERS, default_args) + + +def build_sampler(cfg, **default_args): + """Builder of box sampler.""" + return build_from_cfg(cfg, BBOX_SAMPLERS, default_args) + + +def build_bbox_coder(cfg, **default_args): + """Builder of box coder.""" + return build_from_cfg(cfg, BBOX_CODERS, default_args) diff --git a/mmdet/core/bbox/coder/__init__.py b/mmdet/core/bbox/coder/__init__.py new file mode 100644 index 0000000..e12fd64 --- /dev/null +++ b/mmdet/core/bbox/coder/__init__.py @@ -0,0 +1,15 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .base_bbox_coder import BaseBBoxCoder +from .bucketing_bbox_coder import BucketingBBoxCoder +from .delta_xywh_bbox_coder import DeltaXYWHBBoxCoder +from .distance_point_bbox_coder import DistancePointBBoxCoder +from .legacy_delta_xywh_bbox_coder import LegacyDeltaXYWHBBoxCoder +from .pseudo_bbox_coder import PseudoBBoxCoder +from .tblr_bbox_coder import TBLRBBoxCoder +from .yolo_bbox_coder import YOLOBBoxCoder + +__all__ = [ + 'BaseBBoxCoder', 'PseudoBBoxCoder', 'DeltaXYWHBBoxCoder', + 'LegacyDeltaXYWHBBoxCoder', 'TBLRBBoxCoder', 'YOLOBBoxCoder', + 'BucketingBBoxCoder', 'DistancePointBBoxCoder' +] diff --git a/mmdet/core/bbox/coder/base_bbox_coder.py b/mmdet/core/bbox/coder/base_bbox_coder.py new file mode 100644 index 0000000..a7ed041 --- /dev/null +++ b/mmdet/core/bbox/coder/base_bbox_coder.py @@ -0,0 +1,18 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from abc import ABCMeta, abstractmethod + + +class BaseBBoxCoder(metaclass=ABCMeta): + """Base bounding box coder.""" + + def __init__(self, **kwargs): + pass + + @abstractmethod + def encode(self, bboxes, gt_bboxes): + """Encode deltas between bboxes and ground truth boxes.""" + + @abstractmethod + def decode(self, bboxes, bboxes_pred): + """Decode the predicted bboxes according to prediction and base + boxes.""" diff --git a/mmdet/core/bbox/coder/bucketing_bbox_coder.py b/mmdet/core/bbox/coder/bucketing_bbox_coder.py new file mode 100644 index 0000000..4be0ada --- /dev/null +++ b/mmdet/core/bbox/coder/bucketing_bbox_coder.py @@ -0,0 +1,351 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import numpy as np +import torch +import torch.nn.functional as F + +from ..builder import BBOX_CODERS +from ..transforms import bbox_rescale +from .base_bbox_coder import BaseBBoxCoder + + +@BBOX_CODERS.register_module() +class BucketingBBoxCoder(BaseBBoxCoder): + """Bucketing BBox Coder for Side-Aware Boundary Localization (SABL). + + Boundary Localization with Bucketing and Bucketing Guided Rescoring + are implemented here. + + Please refer to https://arxiv.org/abs/1912.04260 for more details. + + Args: + num_buckets (int): Number of buckets. + scale_factor (int): Scale factor of proposals to generate buckets. + offset_topk (int): Topk buckets are used to generate + bucket fine regression targets. Defaults to 2. + offset_upperbound (float): Offset upperbound to generate + bucket fine regression targets. + To avoid too large offset displacements. Defaults to 1.0. + cls_ignore_neighbor (bool): Ignore second nearest bucket or Not. + Defaults to True. + clip_border (bool, optional): Whether clip the objects outside the + border of the image. Defaults to True. + """ + + def __init__(self, + num_buckets, + scale_factor, + offset_topk=2, + offset_upperbound=1.0, + cls_ignore_neighbor=True, + clip_border=True): + super(BucketingBBoxCoder, self).__init__() + self.num_buckets = num_buckets + self.scale_factor = scale_factor + self.offset_topk = offset_topk + self.offset_upperbound = offset_upperbound + self.cls_ignore_neighbor = cls_ignore_neighbor + self.clip_border = clip_border + + def encode(self, bboxes, gt_bboxes): + """Get bucketing estimation and fine regression targets during + training. + + Args: + bboxes (torch.Tensor): source boxes, e.g., object proposals. + gt_bboxes (torch.Tensor): target of the transformation, e.g., + ground truth boxes. + + Returns: + encoded_bboxes(tuple[Tensor]): bucketing estimation + and fine regression targets and weights + """ + + assert bboxes.size(0) == gt_bboxes.size(0) + assert bboxes.size(-1) == gt_bboxes.size(-1) == 4 + encoded_bboxes = bbox2bucket(bboxes, gt_bboxes, self.num_buckets, + self.scale_factor, self.offset_topk, + self.offset_upperbound, + self.cls_ignore_neighbor) + return encoded_bboxes + + def decode(self, bboxes, pred_bboxes, max_shape=None): + """Apply transformation `pred_bboxes` to `boxes`. + Args: + boxes (torch.Tensor): Basic boxes. + pred_bboxes (torch.Tensor): Predictions for bucketing estimation + and fine regression + max_shape (tuple[int], optional): Maximum shape of boxes. + Defaults to None. + + Returns: + torch.Tensor: Decoded boxes. + """ + assert len(pred_bboxes) == 2 + cls_preds, offset_preds = pred_bboxes + assert cls_preds.size(0) == bboxes.size(0) and offset_preds.size( + 0) == bboxes.size(0) + decoded_bboxes = bucket2bbox(bboxes, cls_preds, offset_preds, + self.num_buckets, self.scale_factor, + max_shape, self.clip_border) + + return decoded_bboxes + + +@mmcv.jit(coderize=True) +def generat_buckets(proposals, num_buckets, scale_factor=1.0): + """Generate buckets w.r.t bucket number and scale factor of proposals. + + Args: + proposals (Tensor): Shape (n, 4) + num_buckets (int): Number of buckets. + scale_factor (float): Scale factor to rescale proposals. + + Returns: + tuple[Tensor]: (bucket_w, bucket_h, l_buckets, r_buckets, + t_buckets, d_buckets) + + - bucket_w: Width of buckets on x-axis. Shape (n, ). + - bucket_h: Height of buckets on y-axis. Shape (n, ). + - l_buckets: Left buckets. Shape (n, ceil(side_num/2)). + - r_buckets: Right buckets. Shape (n, ceil(side_num/2)). + - t_buckets: Top buckets. Shape (n, ceil(side_num/2)). + - d_buckets: Down buckets. Shape (n, ceil(side_num/2)). + """ + proposals = bbox_rescale(proposals, scale_factor) + + # number of buckets in each side + side_num = int(np.ceil(num_buckets / 2.0)) + pw = proposals[..., 2] - proposals[..., 0] + ph = proposals[..., 3] - proposals[..., 1] + px1 = proposals[..., 0] + py1 = proposals[..., 1] + px2 = proposals[..., 2] + py2 = proposals[..., 3] + + bucket_w = pw / num_buckets + bucket_h = ph / num_buckets + + # left buckets + l_buckets = px1[:, None] + (0.5 + torch.arange( + 0, side_num).to(proposals).float())[None, :] * bucket_w[:, None] + # right buckets + r_buckets = px2[:, None] - (0.5 + torch.arange( + 0, side_num).to(proposals).float())[None, :] * bucket_w[:, None] + # top buckets + t_buckets = py1[:, None] + (0.5 + torch.arange( + 0, side_num).to(proposals).float())[None, :] * bucket_h[:, None] + # down buckets + d_buckets = py2[:, None] - (0.5 + torch.arange( + 0, side_num).to(proposals).float())[None, :] * bucket_h[:, None] + return bucket_w, bucket_h, l_buckets, r_buckets, t_buckets, d_buckets + + +@mmcv.jit(coderize=True) +def bbox2bucket(proposals, + gt, + num_buckets, + scale_factor, + offset_topk=2, + offset_upperbound=1.0, + cls_ignore_neighbor=True): + """Generate buckets estimation and fine regression targets. + + Args: + proposals (Tensor): Shape (n, 4) + gt (Tensor): Shape (n, 4) + num_buckets (int): Number of buckets. + scale_factor (float): Scale factor to rescale proposals. + offset_topk (int): Topk buckets are used to generate + bucket fine regression targets. Defaults to 2. + offset_upperbound (float): Offset allowance to generate + bucket fine regression targets. + To avoid too large offset displacements. Defaults to 1.0. + cls_ignore_neighbor (bool): Ignore second nearest bucket or Not. + Defaults to True. + + Returns: + tuple[Tensor]: (offsets, offsets_weights, bucket_labels, cls_weights). + + - offsets: Fine regression targets. \ + Shape (n, num_buckets*2). + - offsets_weights: Fine regression weights. \ + Shape (n, num_buckets*2). + - bucket_labels: Bucketing estimation labels. \ + Shape (n, num_buckets*2). + - cls_weights: Bucketing estimation weights. \ + Shape (n, num_buckets*2). + """ + assert proposals.size() == gt.size() + + # generate buckets + proposals = proposals.float() + gt = gt.float() + (bucket_w, bucket_h, l_buckets, r_buckets, t_buckets, + d_buckets) = generat_buckets(proposals, num_buckets, scale_factor) + + gx1 = gt[..., 0] + gy1 = gt[..., 1] + gx2 = gt[..., 2] + gy2 = gt[..., 3] + + # generate offset targets and weights + # offsets from buckets to gts + l_offsets = (l_buckets - gx1[:, None]) / bucket_w[:, None] + r_offsets = (r_buckets - gx2[:, None]) / bucket_w[:, None] + t_offsets = (t_buckets - gy1[:, None]) / bucket_h[:, None] + d_offsets = (d_buckets - gy2[:, None]) / bucket_h[:, None] + + # select top-k nearest buckets + l_topk, l_label = l_offsets.abs().topk( + offset_topk, dim=1, largest=False, sorted=True) + r_topk, r_label = r_offsets.abs().topk( + offset_topk, dim=1, largest=False, sorted=True) + t_topk, t_label = t_offsets.abs().topk( + offset_topk, dim=1, largest=False, sorted=True) + d_topk, d_label = d_offsets.abs().topk( + offset_topk, dim=1, largest=False, sorted=True) + + offset_l_weights = l_offsets.new_zeros(l_offsets.size()) + offset_r_weights = r_offsets.new_zeros(r_offsets.size()) + offset_t_weights = t_offsets.new_zeros(t_offsets.size()) + offset_d_weights = d_offsets.new_zeros(d_offsets.size()) + inds = torch.arange(0, proposals.size(0)).to(proposals).long() + + # generate offset weights of top-k nearest buckets + for k in range(offset_topk): + if k >= 1: + offset_l_weights[inds, l_label[:, + k]] = (l_topk[:, k] < + offset_upperbound).float() + offset_r_weights[inds, r_label[:, + k]] = (r_topk[:, k] < + offset_upperbound).float() + offset_t_weights[inds, t_label[:, + k]] = (t_topk[:, k] < + offset_upperbound).float() + offset_d_weights[inds, d_label[:, + k]] = (d_topk[:, k] < + offset_upperbound).float() + else: + offset_l_weights[inds, l_label[:, k]] = 1.0 + offset_r_weights[inds, r_label[:, k]] = 1.0 + offset_t_weights[inds, t_label[:, k]] = 1.0 + offset_d_weights[inds, d_label[:, k]] = 1.0 + + offsets = torch.cat([l_offsets, r_offsets, t_offsets, d_offsets], dim=-1) + offsets_weights = torch.cat([ + offset_l_weights, offset_r_weights, offset_t_weights, offset_d_weights + ], + dim=-1) + + # generate bucket labels and weight + side_num = int(np.ceil(num_buckets / 2.0)) + labels = torch.stack( + [l_label[:, 0], r_label[:, 0], t_label[:, 0], d_label[:, 0]], dim=-1) + + batch_size = labels.size(0) + bucket_labels = F.one_hot(labels.view(-1), side_num).view(batch_size, + -1).float() + bucket_cls_l_weights = (l_offsets.abs() < 1).float() + bucket_cls_r_weights = (r_offsets.abs() < 1).float() + bucket_cls_t_weights = (t_offsets.abs() < 1).float() + bucket_cls_d_weights = (d_offsets.abs() < 1).float() + bucket_cls_weights = torch.cat([ + bucket_cls_l_weights, bucket_cls_r_weights, bucket_cls_t_weights, + bucket_cls_d_weights + ], + dim=-1) + # ignore second nearest buckets for cls if necessary + if cls_ignore_neighbor: + bucket_cls_weights = (~((bucket_cls_weights == 1) & + (bucket_labels == 0))).float() + else: + bucket_cls_weights[:] = 1.0 + return offsets, offsets_weights, bucket_labels, bucket_cls_weights + + +@mmcv.jit(coderize=True) +def bucket2bbox(proposals, + cls_preds, + offset_preds, + num_buckets, + scale_factor=1.0, + max_shape=None, + clip_border=True): + """Apply bucketing estimation (cls preds) and fine regression (offset + preds) to generate det bboxes. + + Args: + proposals (Tensor): Boxes to be transformed. Shape (n, 4) + cls_preds (Tensor): bucketing estimation. Shape (n, num_buckets*2). + offset_preds (Tensor): fine regression. Shape (n, num_buckets*2). + num_buckets (int): Number of buckets. + scale_factor (float): Scale factor to rescale proposals. + max_shape (tuple[int, int]): Maximum bounds for boxes. specifies (H, W) + clip_border (bool, optional): Whether clip the objects outside the + border of the image. Defaults to True. + + Returns: + tuple[Tensor]: (bboxes, loc_confidence). + + - bboxes: predicted bboxes. Shape (n, 4) + - loc_confidence: localization confidence of predicted bboxes. + Shape (n,). + """ + + side_num = int(np.ceil(num_buckets / 2.0)) + cls_preds = cls_preds.view(-1, side_num) + offset_preds = offset_preds.view(-1, side_num) + + scores = F.softmax(cls_preds, dim=1) + score_topk, score_label = scores.topk(2, dim=1, largest=True, sorted=True) + + rescaled_proposals = bbox_rescale(proposals, scale_factor) + + pw = rescaled_proposals[..., 2] - rescaled_proposals[..., 0] + ph = rescaled_proposals[..., 3] - rescaled_proposals[..., 1] + px1 = rescaled_proposals[..., 0] + py1 = rescaled_proposals[..., 1] + px2 = rescaled_proposals[..., 2] + py2 = rescaled_proposals[..., 3] + + bucket_w = pw / num_buckets + bucket_h = ph / num_buckets + + score_inds_l = score_label[0::4, 0] + score_inds_r = score_label[1::4, 0] + score_inds_t = score_label[2::4, 0] + score_inds_d = score_label[3::4, 0] + l_buckets = px1 + (0.5 + score_inds_l.float()) * bucket_w + r_buckets = px2 - (0.5 + score_inds_r.float()) * bucket_w + t_buckets = py1 + (0.5 + score_inds_t.float()) * bucket_h + d_buckets = py2 - (0.5 + score_inds_d.float()) * bucket_h + + offsets = offset_preds.view(-1, 4, side_num) + inds = torch.arange(proposals.size(0)).to(proposals).long() + l_offsets = offsets[:, 0, :][inds, score_inds_l] + r_offsets = offsets[:, 1, :][inds, score_inds_r] + t_offsets = offsets[:, 2, :][inds, score_inds_t] + d_offsets = offsets[:, 3, :][inds, score_inds_d] + + x1 = l_buckets - l_offsets * bucket_w + x2 = r_buckets - r_offsets * bucket_w + y1 = t_buckets - t_offsets * bucket_h + y2 = d_buckets - d_offsets * bucket_h + + if clip_border and max_shape is not None: + x1 = x1.clamp(min=0, max=max_shape[1] - 1) + y1 = y1.clamp(min=0, max=max_shape[0] - 1) + x2 = x2.clamp(min=0, max=max_shape[1] - 1) + y2 = y2.clamp(min=0, max=max_shape[0] - 1) + bboxes = torch.cat([x1[:, None], y1[:, None], x2[:, None], y2[:, None]], + dim=-1) + + # bucketing guided rescoring + loc_confidence = score_topk[:, 0] + top2_neighbor_inds = (score_label[:, 0] - score_label[:, 1]).abs() == 1 + loc_confidence += score_topk[:, 1] * top2_neighbor_inds.float() + loc_confidence = loc_confidence.view(-1, 4).mean(dim=1) + + return bboxes, loc_confidence diff --git a/mmdet/core/bbox/coder/delta_xywh_bbox_coder.py b/mmdet/core/bbox/coder/delta_xywh_bbox_coder.py new file mode 100644 index 0000000..a7f1c62 --- /dev/null +++ b/mmdet/core/bbox/coder/delta_xywh_bbox_coder.py @@ -0,0 +1,392 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import mmcv +import numpy as np +import torch + +from ..builder import BBOX_CODERS +from .base_bbox_coder import BaseBBoxCoder + + +@BBOX_CODERS.register_module() +class DeltaXYWHBBoxCoder(BaseBBoxCoder): + """Delta XYWH BBox coder. + + Following the practice in `R-CNN `_, + this coder encodes bbox (x1, y1, x2, y2) into delta (dx, dy, dw, dh) and + decodes delta (dx, dy, dw, dh) back to original bbox (x1, y1, x2, y2). + + Args: + target_means (Sequence[float]): Denormalizing means of target for + delta coordinates + target_stds (Sequence[float]): Denormalizing standard deviation of + target for delta coordinates + clip_border (bool, optional): Whether clip the objects outside the + border of the image. Defaults to True. + add_ctr_clamp (bool): Whether to add center clamp, when added, the + predicted box is clamped is its center is too far away from + the original anchor's center. Only used by YOLOF. Default False. + ctr_clamp (int): the maximum pixel shift to clamp. Only used by YOLOF. + Default 32. + """ + + def __init__(self, + target_means=(0., 0., 0., 0.), + target_stds=(1., 1., 1., 1.), + clip_border=True, + add_ctr_clamp=False, + ctr_clamp=32): + super(BaseBBoxCoder, self).__init__() + self.means = target_means + self.stds = target_stds + self.clip_border = clip_border + self.add_ctr_clamp = add_ctr_clamp + self.ctr_clamp = ctr_clamp + + def encode(self, bboxes, gt_bboxes): + """Get box regression transformation deltas that can be used to + transform the ``bboxes`` into the ``gt_bboxes``. + + Args: + bboxes (torch.Tensor): Source boxes, e.g., object proposals. + gt_bboxes (torch.Tensor): Target of the transformation, e.g., + ground-truth boxes. + + Returns: + torch.Tensor: Box transformation deltas + """ + + assert bboxes.size(0) == gt_bboxes.size(0) + assert bboxes.size(-1) == gt_bboxes.size(-1) == 4 + encoded_bboxes = bbox2delta(bboxes, gt_bboxes, self.means, self.stds) + return encoded_bboxes + + def decode(self, + bboxes, + pred_bboxes, + max_shape=None, + wh_ratio_clip=16 / 1000): + """Apply transformation `pred_bboxes` to `boxes`. + + Args: + bboxes (torch.Tensor): Basic boxes. Shape (B, N, 4) or (N, 4) + pred_bboxes (Tensor): Encoded offsets with respect to each roi. + Has shape (B, N, num_classes * 4) or (B, N, 4) or + (N, num_classes * 4) or (N, 4). Note N = num_anchors * W * H + when rois is a grid of anchors.Offset encoding follows [1]_. + max_shape (Sequence[int] or torch.Tensor or Sequence[ + Sequence[int]],optional): Maximum bounds for boxes, specifies + (H, W, C) or (H, W). If bboxes shape is (B, N, 4), then + the max_shape should be a Sequence[Sequence[int]] + and the length of max_shape should also be B. + wh_ratio_clip (float, optional): The allowed ratio between + width and height. + + Returns: + torch.Tensor: Decoded boxes. + """ + + assert pred_bboxes.size(0) == bboxes.size(0) + if pred_bboxes.ndim == 3: + assert pred_bboxes.size(1) == bboxes.size(1) + + if pred_bboxes.ndim == 2 and not torch.onnx.is_in_onnx_export(): + # single image decode + decoded_bboxes = delta2bbox(bboxes, pred_bboxes, self.means, + self.stds, max_shape, wh_ratio_clip, + self.clip_border, self.add_ctr_clamp, + self.ctr_clamp) + else: + if pred_bboxes.ndim == 3 and not torch.onnx.is_in_onnx_export(): + warnings.warn( + 'DeprecationWarning: onnx_delta2bbox is deprecated ' + 'in the case of batch decoding and non-ONNX, ' + 'please use “delta2bbox” instead. In order to improve ' + 'the decoding speed, the batch function will no ' + 'longer be supported. ') + decoded_bboxes = onnx_delta2bbox(bboxes, pred_bboxes, self.means, + self.stds, max_shape, + wh_ratio_clip, self.clip_border, + self.add_ctr_clamp, + self.ctr_clamp) + + return decoded_bboxes + + +@mmcv.jit(coderize=True) +def bbox2delta(proposals, gt, means=(0., 0., 0., 0.), stds=(1., 1., 1., 1.)): + """Compute deltas of proposals w.r.t. gt. + + We usually compute the deltas of x, y, w, h of proposals w.r.t ground + truth bboxes to get regression target. + This is the inverse function of :func:`delta2bbox`. + + Args: + proposals (Tensor): Boxes to be transformed, shape (N, ..., 4) + gt (Tensor): Gt bboxes to be used as base, shape (N, ..., 4) + means (Sequence[float]): Denormalizing means for delta coordinates + stds (Sequence[float]): Denormalizing standard deviation for delta + coordinates + + Returns: + Tensor: deltas with shape (N, 4), where columns represent dx, dy, + dw, dh. + """ + assert proposals.size() == gt.size() + + proposals = proposals.float() + gt = gt.float() + px = (proposals[..., 0] + proposals[..., 2]) * 0.5 + py = (proposals[..., 1] + proposals[..., 3]) * 0.5 + pw = proposals[..., 2] - proposals[..., 0] + ph = proposals[..., 3] - proposals[..., 1] + + gx = (gt[..., 0] + gt[..., 2]) * 0.5 + gy = (gt[..., 1] + gt[..., 3]) * 0.5 + gw = gt[..., 2] - gt[..., 0] + gh = gt[..., 3] - gt[..., 1] + + dx = (gx - px) / pw + dy = (gy - py) / ph + dw = torch.log(gw / pw) + dh = torch.log(gh / ph) + deltas = torch.stack([dx, dy, dw, dh], dim=-1) + + means = deltas.new_tensor(means).unsqueeze(0) + stds = deltas.new_tensor(stds).unsqueeze(0) + deltas = deltas.sub_(means).div_(stds) + + return deltas + + +@mmcv.jit(coderize=True) +def delta2bbox(rois, + deltas, + means=(0., 0., 0., 0.), + stds=(1., 1., 1., 1.), + max_shape=None, + wh_ratio_clip=16 / 1000, + clip_border=True, + add_ctr_clamp=False, + ctr_clamp=32): + """Apply deltas to shift/scale base boxes. + + Typically the rois are anchor or proposed bounding boxes and the deltas are + network outputs used to shift/scale those boxes. + This is the inverse function of :func:`bbox2delta`. + + Args: + rois (Tensor): Boxes to be transformed. Has shape (N, 4). + deltas (Tensor): Encoded offsets relative to each roi. + Has shape (N, num_classes * 4) or (N, 4). Note + N = num_base_anchors * W * H, when rois is a grid of + anchors. Offset encoding follows [1]_. + means (Sequence[float]): Denormalizing means for delta coordinates. + Default (0., 0., 0., 0.). + stds (Sequence[float]): Denormalizing standard deviation for delta + coordinates. Default (1., 1., 1., 1.). + max_shape (tuple[int, int]): Maximum bounds for boxes, specifies + (H, W). Default None. + wh_ratio_clip (float): Maximum aspect ratio for boxes. Default + 16 / 1000. + clip_border (bool, optional): Whether clip the objects outside the + border of the image. Default True. + add_ctr_clamp (bool): Whether to add center clamp. When set to True, + the center of the prediction bounding box will be clamped to + avoid being too far away from the center of the anchor. + Only used by YOLOF. Default False. + ctr_clamp (int): the maximum pixel shift to clamp. Only used by YOLOF. + Default 32. + + Returns: + Tensor: Boxes with shape (N, num_classes * 4) or (N, 4), where 4 + represent tl_x, tl_y, br_x, br_y. + + References: + .. [1] https://arxiv.org/abs/1311.2524 + + Example: + >>> rois = torch.Tensor([[ 0., 0., 1., 1.], + >>> [ 0., 0., 1., 1.], + >>> [ 0., 0., 1., 1.], + >>> [ 5., 5., 5., 5.]]) + >>> deltas = torch.Tensor([[ 0., 0., 0., 0.], + >>> [ 1., 1., 1., 1.], + >>> [ 0., 0., 2., -1.], + >>> [ 0.7, -1.9, -0.5, 0.3]]) + >>> delta2bbox(rois, deltas, max_shape=(32, 32, 3)) + tensor([[0.0000, 0.0000, 1.0000, 1.0000], + [0.1409, 0.1409, 2.8591, 2.8591], + [0.0000, 0.3161, 4.1945, 0.6839], + [5.0000, 5.0000, 5.0000, 5.0000]]) + """ + num_bboxes, num_classes = deltas.size(0), deltas.size(1) // 4 + if num_bboxes == 0: + return deltas + + deltas = deltas.reshape(-1, 4) + + means = deltas.new_tensor(means).view(1, -1) + stds = deltas.new_tensor(stds).view(1, -1) + denorm_deltas = deltas * stds + means + + dxy = denorm_deltas[:, :2] + dwh = denorm_deltas[:, 2:] + + # Compute width/height of each roi + rois_ = rois.repeat(1, num_classes).reshape(-1, 4) + pxy = ((rois_[:, :2] + rois_[:, 2:]) * 0.5) + pwh = (rois_[:, 2:] - rois_[:, :2]) + + dxy_wh = pwh * dxy + + max_ratio = np.abs(np.log(wh_ratio_clip)) + if add_ctr_clamp: + dxy_wh = torch.clamp(dxy_wh, max=ctr_clamp, min=-ctr_clamp) + dwh = torch.clamp(dwh, max=max_ratio) + else: + dwh = dwh.clamp(min=-max_ratio, max=max_ratio) + + gxy = pxy + dxy_wh + gwh = pwh * dwh.exp() + x1y1 = gxy - (gwh * 0.5) + x2y2 = gxy + (gwh * 0.5) + bboxes = torch.cat([x1y1, x2y2], dim=-1) + if clip_border and max_shape is not None: + bboxes[..., 0::2].clamp_(min=0, max=max_shape[1]) + bboxes[..., 1::2].clamp_(min=0, max=max_shape[0]) + bboxes = bboxes.reshape(num_bboxes, -1) + return bboxes + + +def onnx_delta2bbox(rois, + deltas, + means=(0., 0., 0., 0.), + stds=(1., 1., 1., 1.), + max_shape=None, + wh_ratio_clip=16 / 1000, + clip_border=True, + add_ctr_clamp=False, + ctr_clamp=32): + """Apply deltas to shift/scale base boxes. + + Typically the rois are anchor or proposed bounding boxes and the deltas are + network outputs used to shift/scale those boxes. + This is the inverse function of :func:`bbox2delta`. + + Args: + rois (Tensor): Boxes to be transformed. Has shape (N, 4) or (B, N, 4) + deltas (Tensor): Encoded offsets with respect to each roi. + Has shape (B, N, num_classes * 4) or (B, N, 4) or + (N, num_classes * 4) or (N, 4). Note N = num_anchors * W * H + when rois is a grid of anchors.Offset encoding follows [1]_. + means (Sequence[float]): Denormalizing means for delta coordinates. + Default (0., 0., 0., 0.). + stds (Sequence[float]): Denormalizing standard deviation for delta + coordinates. Default (1., 1., 1., 1.). + max_shape (Sequence[int] or torch.Tensor or Sequence[ + Sequence[int]],optional): Maximum bounds for boxes, specifies + (H, W, C) or (H, W). If rois shape is (B, N, 4), then + the max_shape should be a Sequence[Sequence[int]] + and the length of max_shape should also be B. Default None. + wh_ratio_clip (float): Maximum aspect ratio for boxes. + Default 16 / 1000. + clip_border (bool, optional): Whether clip the objects outside the + border of the image. Default True. + add_ctr_clamp (bool): Whether to add center clamp, when added, the + predicted box is clamped is its center is too far away from + the original anchor's center. Only used by YOLOF. Default False. + ctr_clamp (int): the maximum pixel shift to clamp. Only used by YOLOF. + Default 32. + + Returns: + Tensor: Boxes with shape (B, N, num_classes * 4) or (B, N, 4) or + (N, num_classes * 4) or (N, 4), where 4 represent + tl_x, tl_y, br_x, br_y. + + References: + .. [1] https://arxiv.org/abs/1311.2524 + + Example: + >>> rois = torch.Tensor([[ 0., 0., 1., 1.], + >>> [ 0., 0., 1., 1.], + >>> [ 0., 0., 1., 1.], + >>> [ 5., 5., 5., 5.]]) + >>> deltas = torch.Tensor([[ 0., 0., 0., 0.], + >>> [ 1., 1., 1., 1.], + >>> [ 0., 0., 2., -1.], + >>> [ 0.7, -1.9, -0.5, 0.3]]) + >>> delta2bbox(rois, deltas, max_shape=(32, 32, 3)) + tensor([[0.0000, 0.0000, 1.0000, 1.0000], + [0.1409, 0.1409, 2.8591, 2.8591], + [0.0000, 0.3161, 4.1945, 0.6839], + [5.0000, 5.0000, 5.0000, 5.0000]]) + """ + means = deltas.new_tensor(means).view(1, + -1).repeat(1, + deltas.size(-1) // 4) + stds = deltas.new_tensor(stds).view(1, -1).repeat(1, deltas.size(-1) // 4) + denorm_deltas = deltas * stds + means + dx = denorm_deltas[..., 0::4] + dy = denorm_deltas[..., 1::4] + dw = denorm_deltas[..., 2::4] + dh = denorm_deltas[..., 3::4] + + x1, y1 = rois[..., 0], rois[..., 1] + x2, y2 = rois[..., 2], rois[..., 3] + # Compute center of each roi + px = ((x1 + x2) * 0.5).unsqueeze(-1).expand_as(dx) + py = ((y1 + y2) * 0.5).unsqueeze(-1).expand_as(dy) + # Compute width/height of each roi + pw = (x2 - x1).unsqueeze(-1).expand_as(dw) + ph = (y2 - y1).unsqueeze(-1).expand_as(dh) + + dx_width = pw * dx + dy_height = ph * dy + + max_ratio = np.abs(np.log(wh_ratio_clip)) + if add_ctr_clamp: + dx_width = torch.clamp(dx_width, max=ctr_clamp, min=-ctr_clamp) + dy_height = torch.clamp(dy_height, max=ctr_clamp, min=-ctr_clamp) + dw = torch.clamp(dw, max=max_ratio) + dh = torch.clamp(dh, max=max_ratio) + else: + dw = dw.clamp(min=-max_ratio, max=max_ratio) + dh = dh.clamp(min=-max_ratio, max=max_ratio) + # Use exp(network energy) to enlarge/shrink each roi + gw = pw * dw.exp() + gh = ph * dh.exp() + # Use network energy to shift the center of each roi + gx = px + dx_width + gy = py + dy_height + # Convert center-xy/width/height to top-left, bottom-right + x1 = gx - gw * 0.5 + y1 = gy - gh * 0.5 + x2 = gx + gw * 0.5 + y2 = gy + gh * 0.5 + + bboxes = torch.stack([x1, y1, x2, y2], dim=-1).view(deltas.size()) + + if clip_border and max_shape is not None: + # clip bboxes with dynamic `min` and `max` for onnx + if torch.onnx.is_in_onnx_export(): + from mmdet.core.export import dynamic_clip_for_onnx + x1, y1, x2, y2 = dynamic_clip_for_onnx(x1, y1, x2, y2, max_shape) + bboxes = torch.stack([x1, y1, x2, y2], dim=-1).view(deltas.size()) + return bboxes + if not isinstance(max_shape, torch.Tensor): + max_shape = x1.new_tensor(max_shape) + max_shape = max_shape[..., :2].type_as(x1) + if max_shape.ndim == 2: + assert bboxes.ndim == 3 + assert max_shape.size(0) == bboxes.size(0) + + min_xy = x1.new_tensor(0) + max_xy = torch.cat( + [max_shape] * (deltas.size(-1) // 2), + dim=-1).flip(-1).unsqueeze(-2) + bboxes = torch.where(bboxes < min_xy, min_xy, bboxes) + bboxes = torch.where(bboxes > max_xy, max_xy, bboxes) + + return bboxes diff --git a/mmdet/core/bbox/coder/distance_point_bbox_coder.py b/mmdet/core/bbox/coder/distance_point_bbox_coder.py new file mode 100644 index 0000000..9f308a8 --- /dev/null +++ b/mmdet/core/bbox/coder/distance_point_bbox_coder.py @@ -0,0 +1,63 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import BBOX_CODERS +from ..transforms import bbox2distance, distance2bbox +from .base_bbox_coder import BaseBBoxCoder + + +@BBOX_CODERS.register_module() +class DistancePointBBoxCoder(BaseBBoxCoder): + """Distance Point BBox coder. + + This coder encodes gt bboxes (x1, y1, x2, y2) into (top, bottom, left, + right) and decode it back to the original. + + Args: + clip_border (bool, optional): Whether clip the objects outside the + border of the image. Defaults to True. + """ + + def __init__(self, clip_border=True): + super(BaseBBoxCoder, self).__init__() + self.clip_border = clip_border + + def encode(self, points, gt_bboxes, max_dis=None, eps=0.1): + """Encode bounding box to distances. + + Args: + points (Tensor): Shape (N, 2), The format is [x, y]. + gt_bboxes (Tensor): Shape (N, 4), The format is "xyxy" + max_dis (float): Upper bound of the distance. Default None. + eps (float): a small value to ensure target < max_dis, instead <=. + Default 0.1. + + Returns: + Tensor: Box transformation deltas. The shape is (N, 4). + """ + assert points.size(0) == gt_bboxes.size(0) + assert points.size(-1) == 2 + assert gt_bboxes.size(-1) == 4 + return bbox2distance(points, gt_bboxes, max_dis, eps) + + def decode(self, points, pred_bboxes, max_shape=None): + """Decode distance prediction to bounding box. + + Args: + points (Tensor): Shape (B, N, 2) or (N, 2). + pred_bboxes (Tensor): Distance from the given point to 4 + boundaries (left, top, right, bottom). Shape (B, N, 4) + or (N, 4) + max_shape (Sequence[int] or torch.Tensor or Sequence[ + Sequence[int]],optional): Maximum bounds for boxes, specifies + (H, W, C) or (H, W). If priors shape is (B, N, 4), then + the max_shape should be a Sequence[Sequence[int]], + and the length of max_shape should also be B. + Default None. + Returns: + Tensor: Boxes with shape (N, 4) or (B, N, 4) + """ + assert points.size(0) == pred_bboxes.size(0) + assert points.size(-1) == 2 + assert pred_bboxes.size(-1) == 4 + if self.clip_border is False: + max_shape = None + return distance2bbox(points, pred_bboxes, max_shape) diff --git a/mmdet/core/bbox/coder/legacy_delta_xywh_bbox_coder.py b/mmdet/core/bbox/coder/legacy_delta_xywh_bbox_coder.py new file mode 100644 index 0000000..7fa348b --- /dev/null +++ b/mmdet/core/bbox/coder/legacy_delta_xywh_bbox_coder.py @@ -0,0 +1,216 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import numpy as np +import torch + +from ..builder import BBOX_CODERS +from .base_bbox_coder import BaseBBoxCoder + + +@BBOX_CODERS.register_module() +class LegacyDeltaXYWHBBoxCoder(BaseBBoxCoder): + """Legacy Delta XYWH BBox coder used in MMDet V1.x. + + Following the practice in R-CNN [1]_, this coder encodes bbox (x1, y1, x2, + y2) into delta (dx, dy, dw, dh) and decodes delta (dx, dy, dw, dh) + back to original bbox (x1, y1, x2, y2). + + Note: + The main difference between :class`LegacyDeltaXYWHBBoxCoder` and + :class:`DeltaXYWHBBoxCoder` is whether ``+ 1`` is used during width and + height calculation. We suggest to only use this coder when testing with + MMDet V1.x models. + + References: + .. [1] https://arxiv.org/abs/1311.2524 + + Args: + target_means (Sequence[float]): denormalizing means of target for + delta coordinates + target_stds (Sequence[float]): denormalizing standard deviation of + target for delta coordinates + """ + + def __init__(self, + target_means=(0., 0., 0., 0.), + target_stds=(1., 1., 1., 1.)): + super(BaseBBoxCoder, self).__init__() + self.means = target_means + self.stds = target_stds + + def encode(self, bboxes, gt_bboxes): + """Get box regression transformation deltas that can be used to + transform the ``bboxes`` into the ``gt_bboxes``. + + Args: + bboxes (torch.Tensor): source boxes, e.g., object proposals. + gt_bboxes (torch.Tensor): target of the transformation, e.g., + ground-truth boxes. + + Returns: + torch.Tensor: Box transformation deltas + """ + assert bboxes.size(0) == gt_bboxes.size(0) + assert bboxes.size(-1) == gt_bboxes.size(-1) == 4 + encoded_bboxes = legacy_bbox2delta(bboxes, gt_bboxes, self.means, + self.stds) + return encoded_bboxes + + def decode(self, + bboxes, + pred_bboxes, + max_shape=None, + wh_ratio_clip=16 / 1000): + """Apply transformation `pred_bboxes` to `boxes`. + + Args: + boxes (torch.Tensor): Basic boxes. + pred_bboxes (torch.Tensor): Encoded boxes with shape + max_shape (tuple[int], optional): Maximum shape of boxes. + Defaults to None. + wh_ratio_clip (float, optional): The allowed ratio between + width and height. + + Returns: + torch.Tensor: Decoded boxes. + """ + assert pred_bboxes.size(0) == bboxes.size(0) + decoded_bboxes = legacy_delta2bbox(bboxes, pred_bboxes, self.means, + self.stds, max_shape, wh_ratio_clip) + + return decoded_bboxes + + +@mmcv.jit(coderize=True) +def legacy_bbox2delta(proposals, + gt, + means=(0., 0., 0., 0.), + stds=(1., 1., 1., 1.)): + """Compute deltas of proposals w.r.t. gt in the MMDet V1.x manner. + + We usually compute the deltas of x, y, w, h of proposals w.r.t ground + truth bboxes to get regression target. + This is the inverse function of `delta2bbox()` + + Args: + proposals (Tensor): Boxes to be transformed, shape (N, ..., 4) + gt (Tensor): Gt bboxes to be used as base, shape (N, ..., 4) + means (Sequence[float]): Denormalizing means for delta coordinates + stds (Sequence[float]): Denormalizing standard deviation for delta + coordinates + + Returns: + Tensor: deltas with shape (N, 4), where columns represent dx, dy, + dw, dh. + """ + assert proposals.size() == gt.size() + + proposals = proposals.float() + gt = gt.float() + px = (proposals[..., 0] + proposals[..., 2]) * 0.5 + py = (proposals[..., 1] + proposals[..., 3]) * 0.5 + pw = proposals[..., 2] - proposals[..., 0] + 1.0 + ph = proposals[..., 3] - proposals[..., 1] + 1.0 + + gx = (gt[..., 0] + gt[..., 2]) * 0.5 + gy = (gt[..., 1] + gt[..., 3]) * 0.5 + gw = gt[..., 2] - gt[..., 0] + 1.0 + gh = gt[..., 3] - gt[..., 1] + 1.0 + + dx = (gx - px) / pw + dy = (gy - py) / ph + dw = torch.log(gw / pw) + dh = torch.log(gh / ph) + deltas = torch.stack([dx, dy, dw, dh], dim=-1) + + means = deltas.new_tensor(means).unsqueeze(0) + stds = deltas.new_tensor(stds).unsqueeze(0) + deltas = deltas.sub_(means).div_(stds) + + return deltas + + +@mmcv.jit(coderize=True) +def legacy_delta2bbox(rois, + deltas, + means=(0., 0., 0., 0.), + stds=(1., 1., 1., 1.), + max_shape=None, + wh_ratio_clip=16 / 1000): + """Apply deltas to shift/scale base boxes in the MMDet V1.x manner. + + Typically the rois are anchor or proposed bounding boxes and the deltas are + network outputs used to shift/scale those boxes. + This is the inverse function of `bbox2delta()` + + Args: + rois (Tensor): Boxes to be transformed. Has shape (N, 4) + deltas (Tensor): Encoded offsets with respect to each roi. + Has shape (N, 4 * num_classes). Note N = num_anchors * W * H when + rois is a grid of anchors. Offset encoding follows [1]_. + means (Sequence[float]): Denormalizing means for delta coordinates + stds (Sequence[float]): Denormalizing standard deviation for delta + coordinates + max_shape (tuple[int, int]): Maximum bounds for boxes. specifies (H, W) + wh_ratio_clip (float): Maximum aspect ratio for boxes. + + Returns: + Tensor: Boxes with shape (N, 4), where columns represent + tl_x, tl_y, br_x, br_y. + + References: + .. [1] https://arxiv.org/abs/1311.2524 + + Example: + >>> rois = torch.Tensor([[ 0., 0., 1., 1.], + >>> [ 0., 0., 1., 1.], + >>> [ 0., 0., 1., 1.], + >>> [ 5., 5., 5., 5.]]) + >>> deltas = torch.Tensor([[ 0., 0., 0., 0.], + >>> [ 1., 1., 1., 1.], + >>> [ 0., 0., 2., -1.], + >>> [ 0.7, -1.9, -0.5, 0.3]]) + >>> legacy_delta2bbox(rois, deltas, max_shape=(32, 32)) + tensor([[0.0000, 0.0000, 1.5000, 1.5000], + [0.0000, 0.0000, 5.2183, 5.2183], + [0.0000, 0.1321, 7.8891, 0.8679], + [5.3967, 2.4251, 6.0033, 3.7749]]) + """ + means = deltas.new_tensor(means).repeat(1, deltas.size(1) // 4) + stds = deltas.new_tensor(stds).repeat(1, deltas.size(1) // 4) + denorm_deltas = deltas * stds + means + dx = denorm_deltas[:, 0::4] + dy = denorm_deltas[:, 1::4] + dw = denorm_deltas[:, 2::4] + dh = denorm_deltas[:, 3::4] + max_ratio = np.abs(np.log(wh_ratio_clip)) + dw = dw.clamp(min=-max_ratio, max=max_ratio) + dh = dh.clamp(min=-max_ratio, max=max_ratio) + # Compute center of each roi + px = ((rois[:, 0] + rois[:, 2]) * 0.5).unsqueeze(1).expand_as(dx) + py = ((rois[:, 1] + rois[:, 3]) * 0.5).unsqueeze(1).expand_as(dy) + # Compute width/height of each roi + pw = (rois[:, 2] - rois[:, 0] + 1.0).unsqueeze(1).expand_as(dw) + ph = (rois[:, 3] - rois[:, 1] + 1.0).unsqueeze(1).expand_as(dh) + # Use exp(network energy) to enlarge/shrink each roi + gw = pw * dw.exp() + gh = ph * dh.exp() + # Use network energy to shift the center of each roi + gx = px + pw * dx + gy = py + ph * dy + # Convert center-xy/width/height to top-left, bottom-right + + # The true legacy box coder should +- 0.5 here. + # However, current implementation improves the performance when testing + # the models trained in MMDetection 1.X (~0.5 bbox AP, 0.2 mask AP) + x1 = gx - gw * 0.5 + y1 = gy - gh * 0.5 + x2 = gx + gw * 0.5 + y2 = gy + gh * 0.5 + if max_shape is not None: + x1 = x1.clamp(min=0, max=max_shape[1] - 1) + y1 = y1.clamp(min=0, max=max_shape[0] - 1) + x2 = x2.clamp(min=0, max=max_shape[1] - 1) + y2 = y2.clamp(min=0, max=max_shape[0] - 1) + bboxes = torch.stack([x1, y1, x2, y2], dim=-1).view_as(deltas) + return bboxes diff --git a/mmdet/core/bbox/coder/pseudo_bbox_coder.py b/mmdet/core/bbox/coder/pseudo_bbox_coder.py new file mode 100644 index 0000000..fe71f36 --- /dev/null +++ b/mmdet/core/bbox/coder/pseudo_bbox_coder.py @@ -0,0 +1,19 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import BBOX_CODERS +from .base_bbox_coder import BaseBBoxCoder + + +@BBOX_CODERS.register_module() +class PseudoBBoxCoder(BaseBBoxCoder): + """Pseudo bounding box coder.""" + + def __init__(self, **kwargs): + super(BaseBBoxCoder, self).__init__(**kwargs) + + def encode(self, bboxes, gt_bboxes): + """torch.Tensor: return the given ``bboxes``""" + return gt_bboxes + + def decode(self, bboxes, pred_bboxes): + """torch.Tensor: return the given ``pred_bboxes``""" + return pred_bboxes diff --git a/mmdet/core/bbox/coder/tblr_bbox_coder.py b/mmdet/core/bbox/coder/tblr_bbox_coder.py new file mode 100644 index 0000000..cb42066 --- /dev/null +++ b/mmdet/core/bbox/coder/tblr_bbox_coder.py @@ -0,0 +1,206 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch + +from ..builder import BBOX_CODERS +from .base_bbox_coder import BaseBBoxCoder + + +@BBOX_CODERS.register_module() +class TBLRBBoxCoder(BaseBBoxCoder): + """TBLR BBox coder. + + Following the practice in `FSAF `_, + this coder encodes gt bboxes (x1, y1, x2, y2) into (top, bottom, left, + right) and decode it back to the original. + + Args: + normalizer (list | float): Normalization factor to be + divided with when coding the coordinates. If it is a list, it should + have length of 4 indicating normalization factor in tblr dims. + Otherwise it is a unified float factor for all dims. Default: 4.0 + clip_border (bool, optional): Whether clip the objects outside the + border of the image. Defaults to True. + """ + + def __init__(self, normalizer=4.0, clip_border=True): + super(BaseBBoxCoder, self).__init__() + self.normalizer = normalizer + self.clip_border = clip_border + + def encode(self, bboxes, gt_bboxes): + """Get box regression transformation deltas that can be used to + transform the ``bboxes`` into the ``gt_bboxes`` in the (top, left, + bottom, right) order. + + Args: + bboxes (torch.Tensor): source boxes, e.g., object proposals. + gt_bboxes (torch.Tensor): target of the transformation, e.g., + ground truth boxes. + + Returns: + torch.Tensor: Box transformation deltas + """ + assert bboxes.size(0) == gt_bboxes.size(0) + assert bboxes.size(-1) == gt_bboxes.size(-1) == 4 + encoded_bboxes = bboxes2tblr( + bboxes, gt_bboxes, normalizer=self.normalizer) + return encoded_bboxes + + def decode(self, bboxes, pred_bboxes, max_shape=None): + """Apply transformation `pred_bboxes` to `boxes`. + + Args: + bboxes (torch.Tensor): Basic boxes.Shape (B, N, 4) or (N, 4) + pred_bboxes (torch.Tensor): Encoded boxes with shape + (B, N, 4) or (N, 4) + max_shape (Sequence[int] or torch.Tensor or Sequence[ + Sequence[int]],optional): Maximum bounds for boxes, specifies + (H, W, C) or (H, W). If bboxes shape is (B, N, 4), then + the max_shape should be a Sequence[Sequence[int]] + and the length of max_shape should also be B. + + Returns: + torch.Tensor: Decoded boxes. + """ + decoded_bboxes = tblr2bboxes( + bboxes, + pred_bboxes, + normalizer=self.normalizer, + max_shape=max_shape, + clip_border=self.clip_border) + + return decoded_bboxes + + +@mmcv.jit(coderize=True) +def bboxes2tblr(priors, gts, normalizer=4.0, normalize_by_wh=True): + """Encode ground truth boxes to tblr coordinate. + + It first convert the gt coordinate to tblr format, + (top, bottom, left, right), relative to prior box centers. + The tblr coordinate may be normalized by the side length of prior bboxes + if `normalize_by_wh` is specified as True, and it is then normalized by + the `normalizer` factor. + + Args: + priors (Tensor): Prior boxes in point form + Shape: (num_proposals,4). + gts (Tensor): Coords of ground truth for each prior in point-form + Shape: (num_proposals, 4). + normalizer (Sequence[float] | float): normalization parameter of + encoded boxes. If it is a list, it has to have length = 4. + Default: 4.0 + normalize_by_wh (bool): Whether to normalize tblr coordinate by the + side length (wh) of prior bboxes. + + Return: + encoded boxes (Tensor), Shape: (num_proposals, 4) + """ + + # dist b/t match center and prior's center + if not isinstance(normalizer, float): + normalizer = torch.tensor(normalizer, device=priors.device) + assert len(normalizer) == 4, 'Normalizer must have length = 4' + assert priors.size(0) == gts.size(0) + prior_centers = (priors[:, 0:2] + priors[:, 2:4]) / 2 + xmin, ymin, xmax, ymax = gts.split(1, dim=1) + top = prior_centers[:, 1].unsqueeze(1) - ymin + bottom = ymax - prior_centers[:, 1].unsqueeze(1) + left = prior_centers[:, 0].unsqueeze(1) - xmin + right = xmax - prior_centers[:, 0].unsqueeze(1) + loc = torch.cat((top, bottom, left, right), dim=1) + if normalize_by_wh: + # Normalize tblr by anchor width and height + wh = priors[:, 2:4] - priors[:, 0:2] + w, h = torch.split(wh, 1, dim=1) + loc[:, :2] /= h # tb is normalized by h + loc[:, 2:] /= w # lr is normalized by w + # Normalize tblr by the given normalization factor + return loc / normalizer + + +@mmcv.jit(coderize=True) +def tblr2bboxes(priors, + tblr, + normalizer=4.0, + normalize_by_wh=True, + max_shape=None, + clip_border=True): + """Decode tblr outputs to prediction boxes. + + The process includes 3 steps: 1) De-normalize tblr coordinates by + multiplying it with `normalizer`; 2) De-normalize tblr coordinates by the + prior bbox width and height if `normalize_by_wh` is `True`; 3) Convert + tblr (top, bottom, left, right) pair relative to the center of priors back + to (xmin, ymin, xmax, ymax) coordinate. + + Args: + priors (Tensor): Prior boxes in point form (x0, y0, x1, y1) + Shape: (N,4) or (B, N, 4). + tblr (Tensor): Coords of network output in tblr form + Shape: (N, 4) or (B, N, 4). + normalizer (Sequence[float] | float): Normalization parameter of + encoded boxes. By list, it represents the normalization factors at + tblr dims. By float, it is the unified normalization factor at all + dims. Default: 4.0 + normalize_by_wh (bool): Whether the tblr coordinates have been + normalized by the side length (wh) of prior bboxes. + max_shape (Sequence[int] or torch.Tensor or Sequence[ + Sequence[int]],optional): Maximum bounds for boxes, specifies + (H, W, C) or (H, W). If priors shape is (B, N, 4), then + the max_shape should be a Sequence[Sequence[int]] + and the length of max_shape should also be B. + clip_border (bool, optional): Whether clip the objects outside the + border of the image. Defaults to True. + + Return: + encoded boxes (Tensor): Boxes with shape (N, 4) or (B, N, 4) + """ + if not isinstance(normalizer, float): + normalizer = torch.tensor(normalizer, device=priors.device) + assert len(normalizer) == 4, 'Normalizer must have length = 4' + assert priors.size(0) == tblr.size(0) + if priors.ndim == 3: + assert priors.size(1) == tblr.size(1) + + loc_decode = tblr * normalizer + prior_centers = (priors[..., 0:2] + priors[..., 2:4]) / 2 + if normalize_by_wh: + wh = priors[..., 2:4] - priors[..., 0:2] + w, h = torch.split(wh, 1, dim=-1) + # Inplace operation with slice would failed for exporting to ONNX + th = h * loc_decode[..., :2] # tb + tw = w * loc_decode[..., 2:] # lr + loc_decode = torch.cat([th, tw], dim=-1) + # Cannot be exported using onnx when loc_decode.split(1, dim=-1) + top, bottom, left, right = loc_decode.split((1, 1, 1, 1), dim=-1) + xmin = prior_centers[..., 0].unsqueeze(-1) - left + xmax = prior_centers[..., 0].unsqueeze(-1) + right + ymin = prior_centers[..., 1].unsqueeze(-1) - top + ymax = prior_centers[..., 1].unsqueeze(-1) + bottom + + bboxes = torch.cat((xmin, ymin, xmax, ymax), dim=-1) + + if clip_border and max_shape is not None: + # clip bboxes with dynamic `min` and `max` for onnx + if torch.onnx.is_in_onnx_export(): + from mmdet.core.export import dynamic_clip_for_onnx + xmin, ymin, xmax, ymax = dynamic_clip_for_onnx( + xmin, ymin, xmax, ymax, max_shape) + bboxes = torch.cat([xmin, ymin, xmax, ymax], dim=-1) + return bboxes + if not isinstance(max_shape, torch.Tensor): + max_shape = priors.new_tensor(max_shape) + max_shape = max_shape[..., :2].type_as(priors) + if max_shape.ndim == 2: + assert bboxes.ndim == 3 + assert max_shape.size(0) == bboxes.size(0) + + min_xy = priors.new_tensor(0) + max_xy = torch.cat([max_shape, max_shape], + dim=-1).flip(-1).unsqueeze(-2) + bboxes = torch.where(bboxes < min_xy, min_xy, bboxes) + bboxes = torch.where(bboxes > max_xy, max_xy, bboxes) + + return bboxes diff --git a/mmdet/core/bbox/coder/yolo_bbox_coder.py b/mmdet/core/bbox/coder/yolo_bbox_coder.py new file mode 100644 index 0000000..2852eca --- /dev/null +++ b/mmdet/core/bbox/coder/yolo_bbox_coder.py @@ -0,0 +1,83 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch + +from ..builder import BBOX_CODERS +from .base_bbox_coder import BaseBBoxCoder + + +@BBOX_CODERS.register_module() +class YOLOBBoxCoder(BaseBBoxCoder): + """YOLO BBox coder. + + Following `YOLO `_, this coder divide + image into grids, and encode bbox (x1, y1, x2, y2) into (cx, cy, dw, dh). + cx, cy in [0., 1.], denotes relative center position w.r.t the center of + bboxes. dw, dh are the same as :obj:`DeltaXYWHBBoxCoder`. + + Args: + eps (float): Min value of cx, cy when encoding. + """ + + def __init__(self, eps=1e-6): + super(BaseBBoxCoder, self).__init__() + self.eps = eps + + @mmcv.jit(coderize=True) + def encode(self, bboxes, gt_bboxes, stride): + """Get box regression transformation deltas that can be used to + transform the ``bboxes`` into the ``gt_bboxes``. + + Args: + bboxes (torch.Tensor): Source boxes, e.g., anchors. + gt_bboxes (torch.Tensor): Target of the transformation, e.g., + ground-truth boxes. + stride (torch.Tensor | int): Stride of bboxes. + + Returns: + torch.Tensor: Box transformation deltas + """ + + assert bboxes.size(0) == gt_bboxes.size(0) + assert bboxes.size(-1) == gt_bboxes.size(-1) == 4 + x_center_gt = (gt_bboxes[..., 0] + gt_bboxes[..., 2]) * 0.5 + y_center_gt = (gt_bboxes[..., 1] + gt_bboxes[..., 3]) * 0.5 + w_gt = gt_bboxes[..., 2] - gt_bboxes[..., 0] + h_gt = gt_bboxes[..., 3] - gt_bboxes[..., 1] + x_center = (bboxes[..., 0] + bboxes[..., 2]) * 0.5 + y_center = (bboxes[..., 1] + bboxes[..., 3]) * 0.5 + w = bboxes[..., 2] - bboxes[..., 0] + h = bboxes[..., 3] - bboxes[..., 1] + w_target = torch.log((w_gt / w).clamp(min=self.eps)) + h_target = torch.log((h_gt / h).clamp(min=self.eps)) + x_center_target = ((x_center_gt - x_center) / stride + 0.5).clamp( + self.eps, 1 - self.eps) + y_center_target = ((y_center_gt - y_center) / stride + 0.5).clamp( + self.eps, 1 - self.eps) + encoded_bboxes = torch.stack( + [x_center_target, y_center_target, w_target, h_target], dim=-1) + return encoded_bboxes + + @mmcv.jit(coderize=True) + def decode(self, bboxes, pred_bboxes, stride): + """Apply transformation `pred_bboxes` to `boxes`. + + Args: + boxes (torch.Tensor): Basic boxes, e.g. anchors. + pred_bboxes (torch.Tensor): Encoded boxes with shape + stride (torch.Tensor | int): Strides of bboxes. + + Returns: + torch.Tensor: Decoded boxes. + """ + assert pred_bboxes.size(-1) == bboxes.size(-1) == 4 + xy_centers = (bboxes[..., :2] + bboxes[..., 2:]) * 0.5 + ( + pred_bboxes[..., :2] - 0.5) * stride + whs = (bboxes[..., 2:] - + bboxes[..., :2]) * 0.5 * pred_bboxes[..., 2:].exp() + decoded_bboxes = torch.stack( + (xy_centers[..., 0] - whs[..., 0], xy_centers[..., 1] - + whs[..., 1], xy_centers[..., 0] + whs[..., 0], + xy_centers[..., 1] + whs[..., 1]), + dim=-1) + return decoded_bboxes diff --git a/mmdet/core/bbox/demodata.py b/mmdet/core/bbox/demodata.py new file mode 100644 index 0000000..eb24b34 --- /dev/null +++ b/mmdet/core/bbox/demodata.py @@ -0,0 +1,42 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import torch + +from mmdet.utils.util_random import ensure_rng + + +def random_boxes(num=1, scale=1, rng=None): + """Simple version of ``kwimage.Boxes.random`` + + Returns: + Tensor: shape (n, 4) in x1, y1, x2, y2 format. + + References: + https://gitlab.kitware.com/computer-vision/kwimage/blob/master/kwimage/structs/boxes.py#L1390 + + Example: + >>> num = 3 + >>> scale = 512 + >>> rng = 0 + >>> boxes = random_boxes(num, scale, rng) + >>> print(boxes) + tensor([[280.9925, 278.9802, 308.6148, 366.1769], + [216.9113, 330.6978, 224.0446, 456.5878], + [405.3632, 196.3221, 493.3953, 270.7942]]) + """ + rng = ensure_rng(rng) + + tlbr = rng.rand(num, 4).astype(np.float32) + + tl_x = np.minimum(tlbr[:, 0], tlbr[:, 2]) + tl_y = np.minimum(tlbr[:, 1], tlbr[:, 3]) + br_x = np.maximum(tlbr[:, 0], tlbr[:, 2]) + br_y = np.maximum(tlbr[:, 1], tlbr[:, 3]) + + tlbr[:, 0] = tl_x * scale + tlbr[:, 1] = tl_y * scale + tlbr[:, 2] = br_x * scale + tlbr[:, 3] = br_y * scale + + boxes = torch.from_numpy(tlbr) + return boxes diff --git a/mmdet/core/bbox/iou_calculators/__init__.py b/mmdet/core/bbox/iou_calculators/__init__.py new file mode 100644 index 0000000..04ba925 --- /dev/null +++ b/mmdet/core/bbox/iou_calculators/__init__.py @@ -0,0 +1,5 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .builder import build_iou_calculator +from .iou2d_calculator import BboxOverlaps2D, bbox_overlaps + +__all__ = ['build_iou_calculator', 'BboxOverlaps2D', 'bbox_overlaps'] diff --git a/mmdet/core/bbox/iou_calculators/builder.py b/mmdet/core/bbox/iou_calculators/builder.py new file mode 100644 index 0000000..378ee26 --- /dev/null +++ b/mmdet/core/bbox/iou_calculators/builder.py @@ -0,0 +1,9 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmcv.utils import Registry, build_from_cfg + +IOU_CALCULATORS = Registry('IoU calculator') + + +def build_iou_calculator(cfg, default_args=None): + """Builder of IoU calculator.""" + return build_from_cfg(cfg, IOU_CALCULATORS, default_args) diff --git a/mmdet/core/bbox/iou_calculators/iou2d_calculator.py b/mmdet/core/bbox/iou_calculators/iou2d_calculator.py new file mode 100644 index 0000000..b71a555 --- /dev/null +++ b/mmdet/core/bbox/iou_calculators/iou2d_calculator.py @@ -0,0 +1,260 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from .builder import IOU_CALCULATORS + + +def cast_tensor_type(x, scale=1., dtype=None): + if dtype == 'fp16': + # scale is for preventing overflows + x = (x / scale).half() + return x + + +def fp16_clamp(x, min=None, max=None): + if not x.is_cuda and x.dtype == torch.float16: + # clamp for cpu float16, tensor fp16 has no clamp implementation + return x.float().clamp(min, max).half() + + return x.clamp(min, max) + + +@IOU_CALCULATORS.register_module() +class BboxOverlaps2D: + """2D Overlaps (e.g. IoUs, GIoUs) Calculator.""" + + def __init__(self, scale=1., dtype=None): + self.scale = scale + self.dtype = dtype + + def __call__(self, bboxes1, bboxes2, mode='iou', is_aligned=False): + """Calculate IoU between 2D bboxes. + + Args: + bboxes1 (Tensor): bboxes have shape (m, 4) in + format, or shape (m, 5) in format. + bboxes2 (Tensor): bboxes have shape (n, 4) in + format, shape (n, 5) in format, or be + empty. + mode (str): "iou" (intersection over union), "iof" (intersection + over foreground), or "giou" (generalized intersection over + union). + is_aligned (bool, optional): If True, then m and n must be equal. + Default False. + + Returns: + Tensor: shape (m, n) if ``is_aligned `` is False else shape (m,) + """ + assert bboxes1.size(-1) in [0, 4, 5] + assert bboxes2.size(-1) in [0, 4, 5] + if bboxes2.size(-1) == 5: + bboxes2 = bboxes2[..., :4] + if bboxes1.size(-1) == 5: + bboxes1 = bboxes1[..., :4] + + if self.dtype == 'fp16': + # change tensor type to save cpu and cuda memory and keep speed + bboxes1 = cast_tensor_type(bboxes1, self.scale, self.dtype) + bboxes2 = cast_tensor_type(bboxes2, self.scale, self.dtype) + overlaps = bbox_overlaps(bboxes1, bboxes2, mode, is_aligned) + if not overlaps.is_cuda and overlaps.dtype == torch.float16: + # resume cpu float32 + overlaps = overlaps.float() + return overlaps + + return bbox_overlaps(bboxes1, bboxes2, mode, is_aligned) + + def __repr__(self): + """str: a string describing the module""" + repr_str = self.__class__.__name__ + f'(' \ + f'scale={self.scale}, dtype={self.dtype})' + return repr_str + + +def bbox_overlaps(bboxes1, bboxes2, mode='iou', is_aligned=False, eps=1e-6): + """Calculate overlap between two set of bboxes. + + FP16 Contributed by https://github.com/open-mmlab/mmdetection/pull/4889 + Note: + Assume bboxes1 is M x 4, bboxes2 is N x 4, when mode is 'iou', + there are some new generated variable when calculating IOU + using bbox_overlaps function: + + 1) is_aligned is False + area1: M x 1 + area2: N x 1 + lt: M x N x 2 + rb: M x N x 2 + wh: M x N x 2 + overlap: M x N x 1 + union: M x N x 1 + ious: M x N x 1 + + Total memory: + S = (9 x N x M + N + M) * 4 Byte, + + When using FP16, we can reduce: + R = (9 x N x M + N + M) * 4 / 2 Byte + R large than (N + M) * 4 * 2 is always true when N and M >= 1. + Obviously, N + M <= N * M < 3 * N * M, when N >=2 and M >=2, + N + 1 < 3 * N, when N or M is 1. + + Given M = 40 (ground truth), N = 400000 (three anchor boxes + in per grid, FPN, R-CNNs), + R = 275 MB (one times) + + A special case (dense detection), M = 512 (ground truth), + R = 3516 MB = 3.43 GB + + When the batch size is B, reduce: + B x R + + Therefore, CUDA memory runs out frequently. + + Experiments on GeForce RTX 2080Ti (11019 MiB): + + | dtype | M | N | Use | Real | Ideal | + |:----:|:----:|:----:|:----:|:----:|:----:| + | FP32 | 512 | 400000 | 8020 MiB | -- | -- | + | FP16 | 512 | 400000 | 4504 MiB | 3516 MiB | 3516 MiB | + | FP32 | 40 | 400000 | 1540 MiB | -- | -- | + | FP16 | 40 | 400000 | 1264 MiB | 276MiB | 275 MiB | + + 2) is_aligned is True + area1: N x 1 + area2: N x 1 + lt: N x 2 + rb: N x 2 + wh: N x 2 + overlap: N x 1 + union: N x 1 + ious: N x 1 + + Total memory: + S = 11 x N * 4 Byte + + When using FP16, we can reduce: + R = 11 x N * 4 / 2 Byte + + So do the 'giou' (large than 'iou'). + + Time-wise, FP16 is generally faster than FP32. + + When gpu_assign_thr is not -1, it takes more time on cpu + but not reduce memory. + There, we can reduce half the memory and keep the speed. + + If ``is_aligned`` is ``False``, then calculate the overlaps between each + bbox of bboxes1 and bboxes2, otherwise the overlaps between each aligned + pair of bboxes1 and bboxes2. + + Args: + bboxes1 (Tensor): shape (B, m, 4) in format or empty. + bboxes2 (Tensor): shape (B, n, 4) in format or empty. + B indicates the batch dim, in shape (B1, B2, ..., Bn). + If ``is_aligned`` is ``True``, then m and n must be equal. + mode (str): "iou" (intersection over union), "iof" (intersection over + foreground) or "giou" (generalized intersection over union). + Default "iou". + is_aligned (bool, optional): If True, then m and n must be equal. + Default False. + eps (float, optional): A value added to the denominator for numerical + stability. Default 1e-6. + + Returns: + Tensor: shape (m, n) if ``is_aligned`` is False else shape (m,) + + Example: + >>> bboxes1 = torch.FloatTensor([ + >>> [0, 0, 10, 10], + >>> [10, 10, 20, 20], + >>> [32, 32, 38, 42], + >>> ]) + >>> bboxes2 = torch.FloatTensor([ + >>> [0, 0, 10, 20], + >>> [0, 10, 10, 19], + >>> [10, 10, 20, 20], + >>> ]) + >>> overlaps = bbox_overlaps(bboxes1, bboxes2) + >>> assert overlaps.shape == (3, 3) + >>> overlaps = bbox_overlaps(bboxes1, bboxes2, is_aligned=True) + >>> assert overlaps.shape == (3, ) + + Example: + >>> empty = torch.empty(0, 4) + >>> nonempty = torch.FloatTensor([[0, 0, 10, 9]]) + >>> assert tuple(bbox_overlaps(empty, nonempty).shape) == (0, 1) + >>> assert tuple(bbox_overlaps(nonempty, empty).shape) == (1, 0) + >>> assert tuple(bbox_overlaps(empty, empty).shape) == (0, 0) + """ + + assert mode in ['iou', 'iof', 'giou'], f'Unsupported mode {mode}' + # Either the boxes are empty or the length of boxes' last dimension is 4 + assert (bboxes1.size(-1) == 4 or bboxes1.size(0) == 0) + assert (bboxes2.size(-1) == 4 or bboxes2.size(0) == 0) + + # Batch dim must be the same + # Batch dim: (B1, B2, ... Bn) + assert bboxes1.shape[:-2] == bboxes2.shape[:-2] + batch_shape = bboxes1.shape[:-2] + + rows = bboxes1.size(-2) + cols = bboxes2.size(-2) + if is_aligned: + assert rows == cols + + if rows * cols == 0: + if is_aligned: + return bboxes1.new(batch_shape + (rows, )) + else: + return bboxes1.new(batch_shape + (rows, cols)) + + area1 = (bboxes1[..., 2] - bboxes1[..., 0]) * ( + bboxes1[..., 3] - bboxes1[..., 1]) + area2 = (bboxes2[..., 2] - bboxes2[..., 0]) * ( + bboxes2[..., 3] - bboxes2[..., 1]) + + if is_aligned: + lt = torch.max(bboxes1[..., :2], bboxes2[..., :2]) # [B, rows, 2] + rb = torch.min(bboxes1[..., 2:], bboxes2[..., 2:]) # [B, rows, 2] + + wh = fp16_clamp(rb - lt, min=0) + overlap = wh[..., 0] * wh[..., 1] + + if mode in ['iou', 'giou']: + union = area1 + area2 - overlap + else: + union = area1 + if mode == 'giou': + enclosed_lt = torch.min(bboxes1[..., :2], bboxes2[..., :2]) + enclosed_rb = torch.max(bboxes1[..., 2:], bboxes2[..., 2:]) + else: + lt = torch.max(bboxes1[..., :, None, :2], + bboxes2[..., None, :, :2]) # [B, rows, cols, 2] + rb = torch.min(bboxes1[..., :, None, 2:], + bboxes2[..., None, :, 2:]) # [B, rows, cols, 2] + + wh = fp16_clamp(rb - lt, min=0) + overlap = wh[..., 0] * wh[..., 1] + + if mode in ['iou', 'giou']: + union = area1[..., None] + area2[..., None, :] - overlap + else: + union = area1[..., None] + if mode == 'giou': + enclosed_lt = torch.min(bboxes1[..., :, None, :2], + bboxes2[..., None, :, :2]) + enclosed_rb = torch.max(bboxes1[..., :, None, 2:], + bboxes2[..., None, :, 2:]) + + eps = union.new_tensor([eps]) + union = torch.max(union, eps) + ious = overlap / union + if mode in ['iou', 'iof']: + return ious + # calculate gious + enclose_wh = fp16_clamp(enclosed_rb - enclosed_lt, min=0) + enclose_area = enclose_wh[..., 0] * enclose_wh[..., 1] + enclose_area = torch.max(enclose_area, eps) + gious = ious - (enclose_area - union) / enclose_area + return gious diff --git a/mmdet/core/bbox/match_costs/__init__.py b/mmdet/core/bbox/match_costs/__init__.py new file mode 100644 index 0000000..1b63679 --- /dev/null +++ b/mmdet/core/bbox/match_costs/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .builder import build_match_cost +from .match_cost import (BBoxL1Cost, ClassificationCost, CrossEntropyLossCost, + DiceCost, FocalLossCost, IoUCost) + +__all__ = [ + 'build_match_cost', 'ClassificationCost', 'BBoxL1Cost', 'IoUCost', + 'FocalLossCost', 'DiceCost', 'CrossEntropyLossCost' +] diff --git a/mmdet/core/bbox/match_costs/builder.py b/mmdet/core/bbox/match_costs/builder.py new file mode 100644 index 0000000..ea086ad --- /dev/null +++ b/mmdet/core/bbox/match_costs/builder.py @@ -0,0 +1,9 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmcv.utils import Registry, build_from_cfg + +MATCH_COST = Registry('Match Cost') + + +def build_match_cost(cfg, default_args=None): + """Builder of IoU calculator.""" + return build_from_cfg(cfg, MATCH_COST, default_args) diff --git a/mmdet/core/bbox/match_costs/match_cost.py b/mmdet/core/bbox/match_costs/match_cost.py new file mode 100644 index 0000000..4342b02 --- /dev/null +++ b/mmdet/core/bbox/match_costs/match_cost.py @@ -0,0 +1,359 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn.functional as F + +from mmdet.core.bbox.iou_calculators import bbox_overlaps +from mmdet.core.bbox.transforms import bbox_cxcywh_to_xyxy, bbox_xyxy_to_cxcywh +from .builder import MATCH_COST + + +@MATCH_COST.register_module() +class BBoxL1Cost: + """BBoxL1Cost. + + Args: + weight (int | float, optional): loss_weight + box_format (str, optional): 'xyxy' for DETR, 'xywh' for Sparse_RCNN + + Examples: + >>> from mmdet.core.bbox.match_costs.match_cost import BBoxL1Cost + >>> import torch + >>> self = BBoxL1Cost() + >>> bbox_pred = torch.rand(1, 4) + >>> gt_bboxes= torch.FloatTensor([[0, 0, 2, 4], [1, 2, 3, 4]]) + >>> factor = torch.tensor([10, 8, 10, 8]) + >>> self(bbox_pred, gt_bboxes, factor) + tensor([[1.6172, 1.6422]]) + """ + + def __init__(self, weight=1., box_format='xyxy'): + self.weight = weight + assert box_format in ['xyxy', 'xywh'] + self.box_format = box_format + + def __call__(self, bbox_pred, gt_bboxes): + """ + Args: + bbox_pred (Tensor): Predicted boxes with normalized coordinates + (cx, cy, w, h), which are all in range [0, 1]. Shape + (num_query, 4). + gt_bboxes (Tensor): Ground truth boxes with normalized + coordinates (x1, y1, x2, y2). Shape (num_gt, 4). + + Returns: + torch.Tensor: bbox_cost value with weight + """ + if self.box_format == 'xywh': + gt_bboxes = bbox_xyxy_to_cxcywh(gt_bboxes) + elif self.box_format == 'xyxy': + bbox_pred = bbox_cxcywh_to_xyxy(bbox_pred) + bbox_cost = torch.cdist(bbox_pred, gt_bboxes, p=1) + return bbox_cost * self.weight + + +@MATCH_COST.register_module() +class FocalLossCost: + """FocalLossCost. + + Args: + weight (int | float, optional): loss_weight + alpha (int | float, optional): focal_loss alpha + gamma (int | float, optional): focal_loss gamma + eps (float, optional): default 1e-12 + binary_input (bool, optional): Whether the input is binary, + default False. + + Examples: + >>> from mmdet.core.bbox.match_costs.match_cost import FocalLossCost + >>> import torch + >>> self = FocalLossCost() + >>> cls_pred = torch.rand(4, 3) + >>> gt_labels = torch.tensor([0, 1, 2]) + >>> factor = torch.tensor([10, 8, 10, 8]) + >>> self(cls_pred, gt_labels) + tensor([[-0.3236, -0.3364, -0.2699], + [-0.3439, -0.3209, -0.4807], + [-0.4099, -0.3795, -0.2929], + [-0.1950, -0.1207, -0.2626]]) + """ + + def __init__(self, + weight=1., + alpha=0.25, + gamma=2, + eps=1e-12, + binary_input=False): + self.weight = weight + self.alpha = alpha + self.gamma = gamma + self.eps = eps + self.binary_input = binary_input + + def _focal_loss_cost(self, cls_pred, gt_labels): + """ + Args: + cls_pred (Tensor): Predicted classification logits, shape + (num_query, num_class). + gt_labels (Tensor): Label of `gt_bboxes`, shape (num_gt,). + + Returns: + torch.Tensor: cls_cost value with weight + """ + cls_pred = cls_pred.sigmoid() + neg_cost = -(1 - cls_pred + self.eps).log() * ( + 1 - self.alpha) * cls_pred.pow(self.gamma) + pos_cost = -(cls_pred + self.eps).log() * self.alpha * ( + 1 - cls_pred).pow(self.gamma) + + cls_cost = pos_cost[:, gt_labels] - neg_cost[:, gt_labels] + return cls_cost * self.weight + + def _mask_focal_loss_cost(self, cls_pred, gt_labels): + """ + Args: + cls_pred (Tensor): Predicted classfication logits + in shape (num_query, d1, ..., dn), dtype=torch.float32. + gt_labels (Tensor): Ground truth in shape (num_gt, d1, ..., dn), + dtype=torch.long. Labels should be binary. + + Returns: + Tensor: Focal cost matrix with weight in shape\ + (num_query, num_gt). + """ + cls_pred = cls_pred.flatten(1) + gt_labels = gt_labels.flatten(1).float() + n = cls_pred.shape[1] + cls_pred = cls_pred.sigmoid() + neg_cost = -(1 - cls_pred + self.eps).log() * ( + 1 - self.alpha) * cls_pred.pow(self.gamma) + pos_cost = -(cls_pred + self.eps).log() * self.alpha * ( + 1 - cls_pred).pow(self.gamma) + + cls_cost = torch.einsum('nc,mc->nm', pos_cost, gt_labels) + \ + torch.einsum('nc,mc->nm', neg_cost, (1 - gt_labels)) + return cls_cost / n * self.weight + + def __call__(self, cls_pred, gt_labels): + """ + Args: + cls_pred (Tensor): Predicted classfication logits. + gt_labels (Tensor)): Labels. + + Returns: + Tensor: Focal cost matrix with weight in shape\ + (num_query, num_gt). + """ + if self.binary_input: + return self._mask_focal_loss_cost(cls_pred, gt_labels) + else: + return self._focal_loss_cost(cls_pred, gt_labels) + + +@MATCH_COST.register_module() +class ClassificationCost: + """ClsSoftmaxCost. + + Args: + weight (int | float, optional): loss_weight + + Examples: + >>> from mmdet.core.bbox.match_costs.match_cost import \ + ... ClassificationCost + >>> import torch + >>> self = ClassificationCost() + >>> cls_pred = torch.rand(4, 3) + >>> gt_labels = torch.tensor([0, 1, 2]) + >>> factor = torch.tensor([10, 8, 10, 8]) + >>> self(cls_pred, gt_labels) + tensor([[-0.3430, -0.3525, -0.3045], + [-0.3077, -0.2931, -0.3992], + [-0.3664, -0.3455, -0.2881], + [-0.3343, -0.2701, -0.3956]]) + """ + + def __init__(self, weight=1.): + self.weight = weight + + def __call__(self, cls_pred, gt_labels): + """ + Args: + cls_pred (Tensor): Predicted classification logits, shape + (num_query, num_class). + gt_labels (Tensor): Label of `gt_bboxes`, shape (num_gt,). + + Returns: + torch.Tensor: cls_cost value with weight + """ + # Following the official DETR repo, contrary to the loss that + # NLL is used, we approximate it in 1 - cls_score[gt_label]. + # The 1 is a constant that doesn't change the matching, + # so it can be omitted. + cls_score = cls_pred.softmax(-1) + cls_cost = -cls_score[:, gt_labels] + return cls_cost * self.weight + + +@MATCH_COST.register_module() +class IoUCost: + """IoUCost. + + Args: + iou_mode (str, optional): iou mode such as 'iou' | 'giou' + weight (int | float, optional): loss weight + + Examples: + >>> from mmdet.core.bbox.match_costs.match_cost import IoUCost + >>> import torch + >>> self = IoUCost() + >>> bboxes = torch.FloatTensor([[1,1, 2, 2], [2, 2, 3, 4]]) + >>> gt_bboxes = torch.FloatTensor([[0, 0, 2, 4], [1, 2, 3, 4]]) + >>> self(bboxes, gt_bboxes) + tensor([[-0.1250, 0.1667], + [ 0.1667, -0.5000]]) + """ + + def __init__(self, iou_mode='giou', weight=1.): + self.weight = weight + self.iou_mode = iou_mode + + def __call__(self, bboxes, gt_bboxes): + """ + Args: + bboxes (Tensor): Predicted boxes with unnormalized coordinates + (x1, y1, x2, y2). Shape (num_query, 4). + gt_bboxes (Tensor): Ground truth boxes with unnormalized + coordinates (x1, y1, x2, y2). Shape (num_gt, 4). + + Returns: + torch.Tensor: iou_cost value with weight + """ + # overlaps: [num_bboxes, num_gt] + overlaps = bbox_overlaps( + bboxes, gt_bboxes, mode=self.iou_mode, is_aligned=False) + # The 1 is a constant that doesn't change the matching, so omitted. + iou_cost = -overlaps + return iou_cost * self.weight + + +@MATCH_COST.register_module() +class DiceCost: + """Cost of mask assignments based on dice losses. + + Args: + weight (int | float, optional): loss_weight. Defaults to 1. + pred_act (bool, optional): Whether to apply sigmoid to mask_pred. + Defaults to False. + eps (float, optional): default 1e-12. + naive_dice (bool, optional): If True, use the naive dice loss + in which the power of the number in the denominator is + the first power. If Flase, use the second power that + is adopted by K-Net and SOLO. + Defaults to True. + """ + + def __init__(self, weight=1., pred_act=False, eps=1e-3, naive_dice=True): + self.weight = weight + self.pred_act = pred_act + self.eps = eps + self.naive_dice = naive_dice + + def binary_mask_dice_loss(self, mask_preds, gt_masks): + """ + Args: + mask_preds (Tensor): Mask prediction in shape (num_query, *). + gt_masks (Tensor): Ground truth in shape (num_gt, *) + store 0 or 1, 0 for negative class and 1 for + positive class. + + Returns: + Tensor: Dice cost matrix in shape (num_query, num_gt). + """ + mask_preds = mask_preds.flatten(1) + gt_masks = gt_masks.flatten(1).float() + numerator = 2 * torch.einsum('nc,mc->nm', mask_preds, gt_masks) + if self.naive_dice: + denominator = mask_preds.sum(-1)[:, None] + \ + gt_masks.sum(-1)[None, :] + else: + denominator = mask_preds.pow(2).sum(1)[:, None] + \ + gt_masks.pow(2).sum(1)[None, :] + loss = 1 - (numerator + self.eps) / (denominator + self.eps) + return loss + + def __call__(self, mask_preds, gt_masks): + """ + Args: + mask_preds (Tensor): Mask prediction logits in shape (num_query, *) + gt_masks (Tensor): Ground truth in shape (num_gt, *) + + Returns: + Tensor: Dice cost matrix with weight in shape (num_query, num_gt). + """ + if self.pred_act: + mask_preds = mask_preds.sigmoid() + dice_cost = self.binary_mask_dice_loss(mask_preds, gt_masks) + return dice_cost * self.weight + + +@MATCH_COST.register_module() +class CrossEntropyLossCost: + """CrossEntropyLossCost. + + Args: + weight (int | float, optional): loss weight. Defaults to 1. + use_sigmoid (bool, optional): Whether the prediction uses sigmoid + of softmax. Defaults to True. + Examples: + >>> from mmdet.core.bbox.match_costs import CrossEntropyLossCost + >>> import torch + >>> bce = CrossEntropyLossCost(use_sigmoid=True) + >>> cls_pred = torch.tensor([[7.6, 1.2], [-1.3, 10]]) + >>> gt_labels = torch.tensor([[1, 1], [1, 0]]) + >>> print(bce(cls_pred, gt_labels)) + """ + + def __init__(self, weight=1., use_sigmoid=True): + assert use_sigmoid, 'use_sigmoid = False is not supported yet.' + self.weight = weight + self.use_sigmoid = use_sigmoid + + def _binary_cross_entropy(self, cls_pred, gt_labels): + """ + Args: + cls_pred (Tensor): The prediction with shape (num_query, 1, *) or + (num_query, *). + gt_labels (Tensor): The learning label of prediction with + shape (num_gt, *). + + Returns: + Tensor: Cross entropy cost matrix in shape (num_query, num_gt). + """ + cls_pred = cls_pred.flatten(1).float() + gt_labels = gt_labels.flatten(1).float() + n = cls_pred.shape[1] + pos = F.binary_cross_entropy_with_logits( + cls_pred, torch.ones_like(cls_pred), reduction='none') + neg = F.binary_cross_entropy_with_logits( + cls_pred, torch.zeros_like(cls_pred), reduction='none') + cls_cost = torch.einsum('nc,mc->nm', pos, gt_labels) + \ + torch.einsum('nc,mc->nm', neg, 1 - gt_labels) + cls_cost = cls_cost / n + + return cls_cost + + def __call__(self, cls_pred, gt_labels): + """ + Args: + cls_pred (Tensor): Predicted classification logits. + gt_labels (Tensor): Labels. + + Returns: + Tensor: Cross entropy cost matrix with weight in + shape (num_query, num_gt). + """ + if self.use_sigmoid: + cls_cost = self._binary_cross_entropy(cls_pred, gt_labels) + else: + raise NotImplementedError + + return cls_cost * self.weight diff --git a/mmdet/core/bbox/samplers/__init__.py b/mmdet/core/bbox/samplers/__init__.py new file mode 100644 index 0000000..f58505b --- /dev/null +++ b/mmdet/core/bbox/samplers/__init__.py @@ -0,0 +1,19 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .base_sampler import BaseSampler +from .combined_sampler import CombinedSampler +from .instance_balanced_pos_sampler import InstanceBalancedPosSampler +from .iou_balanced_neg_sampler import IoUBalancedNegSampler +from .mask_pseudo_sampler import MaskPseudoSampler +from .mask_sampling_result import MaskSamplingResult +from .ohem_sampler import OHEMSampler +from .pseudo_sampler import PseudoSampler +from .random_sampler import RandomSampler +from .sampling_result import SamplingResult +from .score_hlr_sampler import ScoreHLRSampler + +__all__ = [ + 'BaseSampler', 'PseudoSampler', 'RandomSampler', + 'InstanceBalancedPosSampler', 'IoUBalancedNegSampler', 'CombinedSampler', + 'OHEMSampler', 'SamplingResult', 'ScoreHLRSampler', 'MaskPseudoSampler', + 'MaskSamplingResult' +] diff --git a/mmdet/core/bbox/samplers/base_sampler.py b/mmdet/core/bbox/samplers/base_sampler.py new file mode 100644 index 0000000..bd15c7c --- /dev/null +++ b/mmdet/core/bbox/samplers/base_sampler.py @@ -0,0 +1,102 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from abc import ABCMeta, abstractmethod + +import torch + +from .sampling_result import SamplingResult + + +class BaseSampler(metaclass=ABCMeta): + """Base class of samplers.""" + + def __init__(self, + num, + pos_fraction, + neg_pos_ub=-1, + add_gt_as_proposals=True, + **kwargs): + self.num = num + self.pos_fraction = pos_fraction + self.neg_pos_ub = neg_pos_ub + self.add_gt_as_proposals = add_gt_as_proposals + self.pos_sampler = self + self.neg_sampler = self + + @abstractmethod + def _sample_pos(self, assign_result, num_expected, **kwargs): + """Sample positive samples.""" + pass + + @abstractmethod + def _sample_neg(self, assign_result, num_expected, **kwargs): + """Sample negative samples.""" + pass + + def sample(self, + assign_result, + bboxes, + gt_bboxes, + gt_labels=None, + **kwargs): + """Sample positive and negative bboxes. + + This is a simple implementation of bbox sampling given candidates, + assigning results and ground truth bboxes. + + Args: + assign_result (:obj:`AssignResult`): Bbox assigning results. + bboxes (Tensor): Boxes to be sampled from. + gt_bboxes (Tensor): Ground truth bboxes. + gt_labels (Tensor, optional): Class labels of ground truth bboxes. + + Returns: + :obj:`SamplingResult`: Sampling result. + + Example: + >>> from mmdet.core.bbox import RandomSampler + >>> from mmdet.core.bbox import AssignResult + >>> from mmdet.core.bbox.demodata import ensure_rng, random_boxes + >>> rng = ensure_rng(None) + >>> assign_result = AssignResult.random(rng=rng) + >>> bboxes = random_boxes(assign_result.num_preds, rng=rng) + >>> gt_bboxes = random_boxes(assign_result.num_gts, rng=rng) + >>> gt_labels = None + >>> self = RandomSampler(num=32, pos_fraction=0.5, neg_pos_ub=-1, + >>> add_gt_as_proposals=False) + >>> self = self.sample(assign_result, bboxes, gt_bboxes, gt_labels) + """ + if len(bboxes.shape) < 2: + bboxes = bboxes[None, :] + + bboxes = bboxes[:, :4] + + gt_flags = bboxes.new_zeros((bboxes.shape[0], ), dtype=torch.uint8) + if self.add_gt_as_proposals and len(gt_bboxes) > 0: + if gt_labels is None: + raise ValueError( + 'gt_labels must be given when add_gt_as_proposals is True') + bboxes = torch.cat([gt_bboxes, bboxes], dim=0) + assign_result.add_gt_(gt_labels) + gt_ones = bboxes.new_ones(gt_bboxes.shape[0], dtype=torch.uint8) + gt_flags = torch.cat([gt_ones, gt_flags]) + + num_expected_pos = int(self.num * self.pos_fraction) + pos_inds = self.pos_sampler._sample_pos( + assign_result, num_expected_pos, bboxes=bboxes, **kwargs) + # We found that sampled indices have duplicated items occasionally. + # (may be a bug of PyTorch) + pos_inds = pos_inds.unique() + num_sampled_pos = pos_inds.numel() + num_expected_neg = self.num - num_sampled_pos + if self.neg_pos_ub >= 0: + _pos = max(1, num_sampled_pos) + neg_upper_bound = int(self.neg_pos_ub * _pos) + if num_expected_neg > neg_upper_bound: + num_expected_neg = neg_upper_bound + neg_inds = self.neg_sampler._sample_neg( + assign_result, num_expected_neg, bboxes=bboxes, **kwargs) + neg_inds = neg_inds.unique() + + sampling_result = SamplingResult(pos_inds, neg_inds, bboxes, gt_bboxes, + assign_result, gt_flags) + return sampling_result diff --git a/mmdet/core/bbox/samplers/combined_sampler.py b/mmdet/core/bbox/samplers/combined_sampler.py new file mode 100644 index 0000000..4f6d86f --- /dev/null +++ b/mmdet/core/bbox/samplers/combined_sampler.py @@ -0,0 +1,21 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import BBOX_SAMPLERS, build_sampler +from .base_sampler import BaseSampler + + +@BBOX_SAMPLERS.register_module() +class CombinedSampler(BaseSampler): + """A sampler that combines positive sampler and negative sampler.""" + + def __init__(self, pos_sampler, neg_sampler, **kwargs): + super(CombinedSampler, self).__init__(**kwargs) + self.pos_sampler = build_sampler(pos_sampler, **kwargs) + self.neg_sampler = build_sampler(neg_sampler, **kwargs) + + def _sample_pos(self, **kwargs): + """Sample positive samples.""" + raise NotImplementedError + + def _sample_neg(self, **kwargs): + """Sample negative samples.""" + raise NotImplementedError diff --git a/mmdet/core/bbox/samplers/instance_balanced_pos_sampler.py b/mmdet/core/bbox/samplers/instance_balanced_pos_sampler.py new file mode 100644 index 0000000..5e0d9cc --- /dev/null +++ b/mmdet/core/bbox/samplers/instance_balanced_pos_sampler.py @@ -0,0 +1,56 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import torch + +from ..builder import BBOX_SAMPLERS +from .random_sampler import RandomSampler + + +@BBOX_SAMPLERS.register_module() +class InstanceBalancedPosSampler(RandomSampler): + """Instance balanced sampler that samples equal number of positive samples + for each instance.""" + + def _sample_pos(self, assign_result, num_expected, **kwargs): + """Sample positive boxes. + + Args: + assign_result (:obj:`AssignResult`): The assigned results of boxes. + num_expected (int): The number of expected positive samples + + Returns: + Tensor or ndarray: sampled indices. + """ + pos_inds = torch.nonzero(assign_result.gt_inds > 0, as_tuple=False) + if pos_inds.numel() != 0: + pos_inds = pos_inds.squeeze(1) + if pos_inds.numel() <= num_expected: + return pos_inds + else: + unique_gt_inds = assign_result.gt_inds[pos_inds].unique() + num_gts = len(unique_gt_inds) + num_per_gt = int(round(num_expected / float(num_gts)) + 1) + sampled_inds = [] + for i in unique_gt_inds: + inds = torch.nonzero( + assign_result.gt_inds == i.item(), as_tuple=False) + if inds.numel() != 0: + inds = inds.squeeze(1) + else: + continue + if len(inds) > num_per_gt: + inds = self.random_choice(inds, num_per_gt) + sampled_inds.append(inds) + sampled_inds = torch.cat(sampled_inds) + if len(sampled_inds) < num_expected: + num_extra = num_expected - len(sampled_inds) + extra_inds = np.array( + list(set(pos_inds.cpu()) - set(sampled_inds.cpu()))) + if len(extra_inds) > num_extra: + extra_inds = self.random_choice(extra_inds, num_extra) + extra_inds = torch.from_numpy(extra_inds).to( + assign_result.gt_inds.device).long() + sampled_inds = torch.cat([sampled_inds, extra_inds]) + elif len(sampled_inds) > num_expected: + sampled_inds = self.random_choice(sampled_inds, num_expected) + return sampled_inds diff --git a/mmdet/core/bbox/samplers/iou_balanced_neg_sampler.py b/mmdet/core/bbox/samplers/iou_balanced_neg_sampler.py new file mode 100644 index 0000000..56e2874 --- /dev/null +++ b/mmdet/core/bbox/samplers/iou_balanced_neg_sampler.py @@ -0,0 +1,158 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import torch + +from ..builder import BBOX_SAMPLERS +from .random_sampler import RandomSampler + + +@BBOX_SAMPLERS.register_module() +class IoUBalancedNegSampler(RandomSampler): + """IoU Balanced Sampling. + + arXiv: https://arxiv.org/pdf/1904.02701.pdf (CVPR 2019) + + Sampling proposals according to their IoU. `floor_fraction` of needed RoIs + are sampled from proposals whose IoU are lower than `floor_thr` randomly. + The others are sampled from proposals whose IoU are higher than + `floor_thr`. These proposals are sampled from some bins evenly, which are + split by `num_bins` via IoU evenly. + + Args: + num (int): number of proposals. + pos_fraction (float): fraction of positive proposals. + floor_thr (float): threshold (minimum) IoU for IoU balanced sampling, + set to -1 if all using IoU balanced sampling. + floor_fraction (float): sampling fraction of proposals under floor_thr. + num_bins (int): number of bins in IoU balanced sampling. + """ + + def __init__(self, + num, + pos_fraction, + floor_thr=-1, + floor_fraction=0, + num_bins=3, + **kwargs): + super(IoUBalancedNegSampler, self).__init__(num, pos_fraction, + **kwargs) + assert floor_thr >= 0 or floor_thr == -1 + assert 0 <= floor_fraction <= 1 + assert num_bins >= 1 + + self.floor_thr = floor_thr + self.floor_fraction = floor_fraction + self.num_bins = num_bins + + def sample_via_interval(self, max_overlaps, full_set, num_expected): + """Sample according to the iou interval. + + Args: + max_overlaps (torch.Tensor): IoU between bounding boxes and ground + truth boxes. + full_set (set(int)): A full set of indices of boxes。 + num_expected (int): Number of expected samples。 + + Returns: + np.ndarray: Indices of samples + """ + max_iou = max_overlaps.max() + iou_interval = (max_iou - self.floor_thr) / self.num_bins + per_num_expected = int(num_expected / self.num_bins) + + sampled_inds = [] + for i in range(self.num_bins): + start_iou = self.floor_thr + i * iou_interval + end_iou = self.floor_thr + (i + 1) * iou_interval + tmp_set = set( + np.where( + np.logical_and(max_overlaps >= start_iou, + max_overlaps < end_iou))[0]) + tmp_inds = list(tmp_set & full_set) + if len(tmp_inds) > per_num_expected: + tmp_sampled_set = self.random_choice(tmp_inds, + per_num_expected) + else: + tmp_sampled_set = np.array(tmp_inds, dtype=np.int) + sampled_inds.append(tmp_sampled_set) + + sampled_inds = np.concatenate(sampled_inds) + if len(sampled_inds) < num_expected: + num_extra = num_expected - len(sampled_inds) + extra_inds = np.array(list(full_set - set(sampled_inds))) + if len(extra_inds) > num_extra: + extra_inds = self.random_choice(extra_inds, num_extra) + sampled_inds = np.concatenate([sampled_inds, extra_inds]) + + return sampled_inds + + def _sample_neg(self, assign_result, num_expected, **kwargs): + """Sample negative boxes. + + Args: + assign_result (:obj:`AssignResult`): The assigned results of boxes. + num_expected (int): The number of expected negative samples + + Returns: + Tensor or ndarray: sampled indices. + """ + neg_inds = torch.nonzero(assign_result.gt_inds == 0, as_tuple=False) + if neg_inds.numel() != 0: + neg_inds = neg_inds.squeeze(1) + if len(neg_inds) <= num_expected: + return neg_inds + else: + max_overlaps = assign_result.max_overlaps.cpu().numpy() + # balance sampling for negative samples + neg_set = set(neg_inds.cpu().numpy()) + + if self.floor_thr > 0: + floor_set = set( + np.where( + np.logical_and(max_overlaps >= 0, + max_overlaps < self.floor_thr))[0]) + iou_sampling_set = set( + np.where(max_overlaps >= self.floor_thr)[0]) + elif self.floor_thr == 0: + floor_set = set(np.where(max_overlaps == 0)[0]) + iou_sampling_set = set( + np.where(max_overlaps > self.floor_thr)[0]) + else: + floor_set = set() + iou_sampling_set = set( + np.where(max_overlaps > self.floor_thr)[0]) + # for sampling interval calculation + self.floor_thr = 0 + + floor_neg_inds = list(floor_set & neg_set) + iou_sampling_neg_inds = list(iou_sampling_set & neg_set) + num_expected_iou_sampling = int(num_expected * + (1 - self.floor_fraction)) + if len(iou_sampling_neg_inds) > num_expected_iou_sampling: + if self.num_bins >= 2: + iou_sampled_inds = self.sample_via_interval( + max_overlaps, set(iou_sampling_neg_inds), + num_expected_iou_sampling) + else: + iou_sampled_inds = self.random_choice( + iou_sampling_neg_inds, num_expected_iou_sampling) + else: + iou_sampled_inds = np.array( + iou_sampling_neg_inds, dtype=np.int) + num_expected_floor = num_expected - len(iou_sampled_inds) + if len(floor_neg_inds) > num_expected_floor: + sampled_floor_inds = self.random_choice( + floor_neg_inds, num_expected_floor) + else: + sampled_floor_inds = np.array(floor_neg_inds, dtype=np.int) + sampled_inds = np.concatenate( + (sampled_floor_inds, iou_sampled_inds)) + if len(sampled_inds) < num_expected: + num_extra = num_expected - len(sampled_inds) + extra_inds = np.array(list(neg_set - set(sampled_inds))) + if len(extra_inds) > num_extra: + extra_inds = self.random_choice(extra_inds, num_extra) + sampled_inds = np.concatenate((sampled_inds, extra_inds)) + sampled_inds = torch.from_numpy(sampled_inds).long().to( + assign_result.gt_inds.device) + return sampled_inds diff --git a/mmdet/core/bbox/samplers/mask_pseudo_sampler.py b/mmdet/core/bbox/samplers/mask_pseudo_sampler.py new file mode 100644 index 0000000..b5f6965 --- /dev/null +++ b/mmdet/core/bbox/samplers/mask_pseudo_sampler.py @@ -0,0 +1,44 @@ +# Copyright (c) OpenMMLab. All rights reserved. +"""copy from +https://github.com/ZwwWayne/K-Net/blob/main/knet/det/mask_pseudo_sampler.py.""" + +import torch + +from mmdet.core.bbox.builder import BBOX_SAMPLERS +from .base_sampler import BaseSampler +from .mask_sampling_result import MaskSamplingResult + + +@BBOX_SAMPLERS.register_module() +class MaskPseudoSampler(BaseSampler): + """A pseudo sampler that does not do sampling actually.""" + + def __init__(self, **kwargs): + pass + + def _sample_pos(self, **kwargs): + """Sample positive samples.""" + raise NotImplementedError + + def _sample_neg(self, **kwargs): + """Sample negative samples.""" + raise NotImplementedError + + def sample(self, assign_result, masks, gt_masks, **kwargs): + """Directly returns the positive and negative indices of samples. + + Args: + assign_result (:obj:`AssignResult`): Assigned results + masks (torch.Tensor): Bounding boxes + gt_masks (torch.Tensor): Ground truth boxes + Returns: + :obj:`SamplingResult`: sampler results + """ + pos_inds = torch.nonzero( + assign_result.gt_inds > 0, as_tuple=False).squeeze(-1).unique() + neg_inds = torch.nonzero( + assign_result.gt_inds == 0, as_tuple=False).squeeze(-1).unique() + gt_flags = masks.new_zeros(masks.shape[0], dtype=torch.uint8) + sampling_result = MaskSamplingResult(pos_inds, neg_inds, masks, + gt_masks, assign_result, gt_flags) + return sampling_result diff --git a/mmdet/core/bbox/samplers/mask_sampling_result.py b/mmdet/core/bbox/samplers/mask_sampling_result.py new file mode 100644 index 0000000..3d10943 --- /dev/null +++ b/mmdet/core/bbox/samplers/mask_sampling_result.py @@ -0,0 +1,60 @@ +# Copyright (c) OpenMMLab. All rights reserved. +"""copy from +https://github.com/ZwwWayne/K-Net/blob/main/knet/det/mask_pseudo_sampler.py.""" + +import torch + +from .sampling_result import SamplingResult + + +class MaskSamplingResult(SamplingResult): + """Mask sampling result.""" + + def __init__(self, pos_inds, neg_inds, masks, gt_masks, assign_result, + gt_flags): + self.pos_inds = pos_inds + self.neg_inds = neg_inds + self.pos_masks = masks[pos_inds] + self.neg_masks = masks[neg_inds] + self.pos_is_gt = gt_flags[pos_inds] + + self.num_gts = gt_masks.shape[0] + self.pos_assigned_gt_inds = assign_result.gt_inds[pos_inds] - 1 + + if gt_masks.numel() == 0: + # hack for index error case + assert self.pos_assigned_gt_inds.numel() == 0 + self.pos_gt_masks = torch.empty_like(gt_masks) + else: + self.pos_gt_masks = gt_masks[self.pos_assigned_gt_inds, :] + + if assign_result.labels is not None: + self.pos_gt_labels = assign_result.labels[pos_inds] + else: + self.pos_gt_labels = None + + @property + def masks(self): + """torch.Tensor: concatenated positive and negative boxes""" + return torch.cat([self.pos_masks, self.neg_masks]) + + def __nice__(self): + data = self.info.copy() + data['pos_masks'] = data.pop('pos_masks').shape + data['neg_masks'] = data.pop('neg_masks').shape + parts = [f"'{k}': {v!r}" for k, v in sorted(data.items())] + body = ' ' + ',\n '.join(parts) + return '{\n' + body + '\n}' + + @property + def info(self): + """Returns a dictionary of info about the object.""" + return { + 'pos_inds': self.pos_inds, + 'neg_inds': self.neg_inds, + 'pos_masks': self.pos_masks, + 'neg_masks': self.neg_masks, + 'pos_is_gt': self.pos_is_gt, + 'num_gts': self.num_gts, + 'pos_assigned_gt_inds': self.pos_assigned_gt_inds, + } diff --git a/mmdet/core/bbox/samplers/ohem_sampler.py b/mmdet/core/bbox/samplers/ohem_sampler.py new file mode 100644 index 0000000..7eb0666 --- /dev/null +++ b/mmdet/core/bbox/samplers/ohem_sampler.py @@ -0,0 +1,111 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from ..builder import BBOX_SAMPLERS +from ..transforms import bbox2roi +from .base_sampler import BaseSampler + + +@BBOX_SAMPLERS.register_module() +class OHEMSampler(BaseSampler): + r"""Online Hard Example Mining Sampler described in `Training Region-based + Object Detectors with Online Hard Example Mining + `_. + """ + + def __init__(self, + num, + pos_fraction, + context, + neg_pos_ub=-1, + add_gt_as_proposals=True, + loss_key='loss_cls', + **kwargs): + super(OHEMSampler, self).__init__(num, pos_fraction, neg_pos_ub, + add_gt_as_proposals) + self.context = context + if not hasattr(self.context, 'num_stages'): + self.bbox_head = self.context.bbox_head + else: + self.bbox_head = self.context.bbox_head[self.context.current_stage] + + self.loss_key = loss_key + + def hard_mining(self, inds, num_expected, bboxes, labels, feats): + with torch.no_grad(): + rois = bbox2roi([bboxes]) + if not hasattr(self.context, 'num_stages'): + bbox_results = self.context._bbox_forward(feats, rois) + else: + bbox_results = self.context._bbox_forward( + self.context.current_stage, feats, rois) + cls_score = bbox_results['cls_score'] + loss = self.bbox_head.loss( + cls_score=cls_score, + bbox_pred=None, + rois=rois, + labels=labels, + label_weights=cls_score.new_ones(cls_score.size(0)), + bbox_targets=None, + bbox_weights=None, + reduction_override='none')[self.loss_key] + _, topk_loss_inds = loss.topk(num_expected) + return inds[topk_loss_inds] + + def _sample_pos(self, + assign_result, + num_expected, + bboxes=None, + feats=None, + **kwargs): + """Sample positive boxes. + + Args: + assign_result (:obj:`AssignResult`): Assigned results + num_expected (int): Number of expected positive samples + bboxes (torch.Tensor, optional): Boxes. Defaults to None. + feats (list[torch.Tensor], optional): Multi-level features. + Defaults to None. + + Returns: + torch.Tensor: Indices of positive samples + """ + # Sample some hard positive samples + pos_inds = torch.nonzero(assign_result.gt_inds > 0, as_tuple=False) + if pos_inds.numel() != 0: + pos_inds = pos_inds.squeeze(1) + if pos_inds.numel() <= num_expected: + return pos_inds + else: + return self.hard_mining(pos_inds, num_expected, bboxes[pos_inds], + assign_result.labels[pos_inds], feats) + + def _sample_neg(self, + assign_result, + num_expected, + bboxes=None, + feats=None, + **kwargs): + """Sample negative boxes. + + Args: + assign_result (:obj:`AssignResult`): Assigned results + num_expected (int): Number of expected negative samples + bboxes (torch.Tensor, optional): Boxes. Defaults to None. + feats (list[torch.Tensor], optional): Multi-level features. + Defaults to None. + + Returns: + torch.Tensor: Indices of negative samples + """ + # Sample some hard negative samples + neg_inds = torch.nonzero(assign_result.gt_inds == 0, as_tuple=False) + if neg_inds.numel() != 0: + neg_inds = neg_inds.squeeze(1) + if len(neg_inds) <= num_expected: + return neg_inds + else: + neg_labels = assign_result.labels.new_empty( + neg_inds.size(0)).fill_(self.bbox_head.num_classes) + return self.hard_mining(neg_inds, num_expected, bboxes[neg_inds], + neg_labels, feats) diff --git a/mmdet/core/bbox/samplers/pseudo_sampler.py b/mmdet/core/bbox/samplers/pseudo_sampler.py new file mode 100644 index 0000000..dccd6ed --- /dev/null +++ b/mmdet/core/bbox/samplers/pseudo_sampler.py @@ -0,0 +1,42 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from ..builder import BBOX_SAMPLERS +from .base_sampler import BaseSampler +from .sampling_result import SamplingResult + + +@BBOX_SAMPLERS.register_module() +class PseudoSampler(BaseSampler): + """A pseudo sampler that does not do sampling actually.""" + + def __init__(self, **kwargs): + pass + + def _sample_pos(self, **kwargs): + """Sample positive samples.""" + raise NotImplementedError + + def _sample_neg(self, **kwargs): + """Sample negative samples.""" + raise NotImplementedError + + def sample(self, assign_result, bboxes, gt_bboxes, *args, **kwargs): + """Directly returns the positive and negative indices of samples. + + Args: + assign_result (:obj:`AssignResult`): Assigned results + bboxes (torch.Tensor): Bounding boxes + gt_bboxes (torch.Tensor): Ground truth boxes + + Returns: + :obj:`SamplingResult`: sampler results + """ + pos_inds = torch.nonzero( + assign_result.gt_inds > 0, as_tuple=False).squeeze(-1).unique() + neg_inds = torch.nonzero( + assign_result.gt_inds == 0, as_tuple=False).squeeze(-1).unique() + gt_flags = bboxes.new_zeros(bboxes.shape[0], dtype=torch.uint8) + sampling_result = SamplingResult(pos_inds, neg_inds, bboxes, gt_bboxes, + assign_result, gt_flags) # TODO 看到这里 + return sampling_result diff --git a/mmdet/core/bbox/samplers/random_sampler.py b/mmdet/core/bbox/samplers/random_sampler.py new file mode 100644 index 0000000..8d3effc --- /dev/null +++ b/mmdet/core/bbox/samplers/random_sampler.py @@ -0,0 +1,82 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from ..builder import BBOX_SAMPLERS +from .base_sampler import BaseSampler + + +@BBOX_SAMPLERS.register_module() +class RandomSampler(BaseSampler): + """Random sampler. + + Args: + num (int): Number of samples + pos_fraction (float): Fraction of positive samples + neg_pos_ub (int, optional): Upper bound number of negative and + positive samples. Defaults to -1. + add_gt_as_proposals (bool, optional): Whether to add ground truth + boxes as proposals. Defaults to True. + """ + + def __init__(self, + num, + pos_fraction, + neg_pos_ub=-1, + add_gt_as_proposals=True, + **kwargs): + from mmdet.core.bbox import demodata + super(RandomSampler, self).__init__(num, pos_fraction, neg_pos_ub, + add_gt_as_proposals) + self.rng = demodata.ensure_rng(kwargs.get('rng', None)) + + def random_choice(self, gallery, num): + """Random select some elements from the gallery. + + If `gallery` is a Tensor, the returned indices will be a Tensor; + If `gallery` is a ndarray or list, the returned indices will be a + ndarray. + + Args: + gallery (Tensor | ndarray | list): indices pool. + num (int): expected sample num. + + Returns: + Tensor or ndarray: sampled indices. + """ + assert len(gallery) >= num + + is_tensor = isinstance(gallery, torch.Tensor) + if not is_tensor: + if torch.cuda.is_available(): + device = torch.cuda.current_device() + else: + device = 'cpu' + gallery = torch.tensor(gallery, dtype=torch.long, device=device) + # This is a temporary fix. We can revert the following code + # when PyTorch fixes the abnormal return of torch.randperm. + # See: https://github.com/open-mmlab/mmdetection/pull/5014 + perm = torch.randperm(gallery.numel())[:num].to(device=gallery.device) + rand_inds = gallery[perm] + if not is_tensor: + rand_inds = rand_inds.cpu().numpy() + return rand_inds + + def _sample_pos(self, assign_result, num_expected, **kwargs): + """Randomly sample some positive samples.""" + pos_inds = torch.nonzero(assign_result.gt_inds > 0, as_tuple=False) + if pos_inds.numel() != 0: + pos_inds = pos_inds.squeeze(1) + if pos_inds.numel() <= num_expected: + return pos_inds + else: + return self.random_choice(pos_inds, num_expected) + + def _sample_neg(self, assign_result, num_expected, **kwargs): + """Randomly sample some negative samples.""" + neg_inds = torch.nonzero(assign_result.gt_inds == 0, as_tuple=False) + if neg_inds.numel() != 0: + neg_inds = neg_inds.squeeze(1) + if len(neg_inds) <= num_expected: + return neg_inds + else: + return self.random_choice(neg_inds, num_expected) diff --git a/mmdet/core/bbox/samplers/sampling_result.py b/mmdet/core/bbox/samplers/sampling_result.py new file mode 100644 index 0000000..11a02c5 --- /dev/null +++ b/mmdet/core/bbox/samplers/sampling_result.py @@ -0,0 +1,153 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from mmdet.utils import util_mixins + + +class SamplingResult(util_mixins.NiceRepr): + """Bbox sampling result. + + Example: + >>> # xdoctest: +IGNORE_WANT + >>> from mmdet.core.bbox.samplers.sampling_result import * # NOQA + >>> self = SamplingResult.random(rng=10) + >>> print(f'self = {self}') + self = + """ + + def __init__(self, pos_inds, neg_inds, bboxes, gt_bboxes, assign_result, + gt_flags): + self.pos_inds = pos_inds + self.neg_inds = neg_inds + self.pos_bboxes = bboxes[pos_inds] + self.neg_bboxes = bboxes[neg_inds] + self.pos_is_gt = gt_flags[pos_inds] + + self.num_gts = gt_bboxes.shape[0] + self.pos_assigned_gt_inds = assign_result.gt_inds[pos_inds] - 1 + + if gt_bboxes.numel() == 0: + # hack for index error case + assert self.pos_assigned_gt_inds.numel() == 0 + self.pos_gt_bboxes = torch.empty_like(gt_bboxes).view(-1, 4) + else: + if len(gt_bboxes.shape) < 2: + gt_bboxes = gt_bboxes.view(-1, 4) + + self.pos_gt_bboxes = gt_bboxes[self.pos_assigned_gt_inds.long(), :] + + if assign_result.labels is not None: + self.pos_gt_labels = assign_result.labels[pos_inds] + else: + self.pos_gt_labels = None + + @property + def bboxes(self): + """torch.Tensor: concatenated positive and negative boxes""" + return torch.cat([self.pos_bboxes, self.neg_bboxes]) + + def to(self, device): + """Change the device of the data inplace. + + Example: + >>> self = SamplingResult.random() + >>> print(f'self = {self.to(None)}') + >>> # xdoctest: +REQUIRES(--gpu) + >>> print(f'self = {self.to(0)}') + """ + _dict = self.__dict__ + for key, value in _dict.items(): + if isinstance(value, torch.Tensor): + _dict[key] = value.to(device) + return self + + def __nice__(self): + data = self.info.copy() + data['pos_bboxes'] = data.pop('pos_bboxes').shape + data['neg_bboxes'] = data.pop('neg_bboxes').shape + parts = [f"'{k}': {v!r}" for k, v in sorted(data.items())] + body = ' ' + ',\n '.join(parts) + return '{\n' + body + '\n}' + + @property + def info(self): + """Returns a dictionary of info about the object.""" + return { + 'pos_inds': self.pos_inds, + 'neg_inds': self.neg_inds, + 'pos_bboxes': self.pos_bboxes, + 'neg_bboxes': self.neg_bboxes, + 'pos_is_gt': self.pos_is_gt, + 'num_gts': self.num_gts, + 'pos_assigned_gt_inds': self.pos_assigned_gt_inds, + } + + @classmethod + def random(cls, rng=None, **kwargs): + """ + Args: + rng (None | int | numpy.random.RandomState): seed or state. + kwargs (keyword arguments): + - num_preds: number of predicted boxes + - num_gts: number of true boxes + - p_ignore (float): probability of a predicted box assigned to \ + an ignored truth. + - p_assigned (float): probability of a predicted box not being \ + assigned. + - p_use_label (float | bool): with labels or not. + + Returns: + :obj:`SamplingResult`: Randomly generated sampling result. + + Example: + >>> from mmdet.core.bbox.samplers.sampling_result import * # NOQA + >>> self = SamplingResult.random() + >>> print(self.__dict__) + """ + from mmdet.core.bbox import demodata + from mmdet.core.bbox.assigners.assign_result import AssignResult + from mmdet.core.bbox.samplers.random_sampler import RandomSampler + rng = demodata.ensure_rng(rng) + + # make probabilistic? + num = 32 + pos_fraction = 0.5 + neg_pos_ub = -1 + + assign_result = AssignResult.random(rng=rng, **kwargs) + + # Note we could just compute an assignment + bboxes = demodata.random_boxes(assign_result.num_preds, rng=rng) + gt_bboxes = demodata.random_boxes(assign_result.num_gts, rng=rng) + + if rng.rand() > 0.2: + # sometimes algorithms squeeze their data, be robust to that + gt_bboxes = gt_bboxes.squeeze() + bboxes = bboxes.squeeze() + + if assign_result.labels is None: + gt_labels = None + else: + gt_labels = None # todo + + if gt_labels is None: + add_gt_as_proposals = False + else: + add_gt_as_proposals = True # make probabilistic? + + sampler = RandomSampler( + num, + pos_fraction, + neg_pos_ub=neg_pos_ub, + add_gt_as_proposals=add_gt_as_proposals, + rng=rng) + self = sampler.sample(assign_result, bboxes, gt_bboxes, gt_labels) + return self diff --git a/mmdet/core/bbox/samplers/score_hlr_sampler.py b/mmdet/core/bbox/samplers/score_hlr_sampler.py new file mode 100644 index 0000000..f4be9b8 --- /dev/null +++ b/mmdet/core/bbox/samplers/score_hlr_sampler.py @@ -0,0 +1,265 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +from mmcv.ops import nms_match + +from ..builder import BBOX_SAMPLERS +from ..transforms import bbox2roi +from .base_sampler import BaseSampler +from .sampling_result import SamplingResult + + +@BBOX_SAMPLERS.register_module() +class ScoreHLRSampler(BaseSampler): + r"""Importance-based Sample Reweighting (ISR_N), described in `Prime Sample + Attention in Object Detection `_. + + Score hierarchical local rank (HLR) differentiates with RandomSampler in + negative part. It firstly computes Score-HLR in a two-step way, + then linearly maps score hlr to the loss weights. + + Args: + num (int): Total number of sampled RoIs. + pos_fraction (float): Fraction of positive samples. + context (:class:`BaseRoIHead`): RoI head that the sampler belongs to. + neg_pos_ub (int): Upper bound of the ratio of num negative to num + positive, -1 means no upper bound. + add_gt_as_proposals (bool): Whether to add ground truth as proposals. + k (float): Power of the non-linear mapping. + bias (float): Shift of the non-linear mapping. + score_thr (float): Minimum score that a negative sample is to be + considered as valid bbox. + """ + + def __init__(self, + num, + pos_fraction, + context, + neg_pos_ub=-1, + add_gt_as_proposals=True, + k=0.5, + bias=0, + score_thr=0.05, + iou_thr=0.5, + **kwargs): + super().__init__(num, pos_fraction, neg_pos_ub, add_gt_as_proposals) + self.k = k + self.bias = bias + self.score_thr = score_thr + self.iou_thr = iou_thr + self.context = context + # context of cascade detectors is a list, so distinguish them here. + if not hasattr(context, 'num_stages'): + self.bbox_roi_extractor = context.bbox_roi_extractor + self.bbox_head = context.bbox_head + self.with_shared_head = context.with_shared_head + if self.with_shared_head: + self.shared_head = context.shared_head + else: + self.bbox_roi_extractor = context.bbox_roi_extractor[ + context.current_stage] + self.bbox_head = context.bbox_head[context.current_stage] + + @staticmethod + def random_choice(gallery, num): + """Randomly select some elements from the gallery. + + If `gallery` is a Tensor, the returned indices will be a Tensor; + If `gallery` is a ndarray or list, the returned indices will be a + ndarray. + + Args: + gallery (Tensor | ndarray | list): indices pool. + num (int): expected sample num. + + Returns: + Tensor or ndarray: sampled indices. + """ + assert len(gallery) >= num + + is_tensor = isinstance(gallery, torch.Tensor) + if not is_tensor: + if torch.cuda.is_available(): + device = torch.cuda.current_device() + else: + device = 'cpu' + gallery = torch.tensor(gallery, dtype=torch.long, device=device) + perm = torch.randperm(gallery.numel(), device=gallery.device)[:num] + rand_inds = gallery[perm] + if not is_tensor: + rand_inds = rand_inds.cpu().numpy() + return rand_inds + + def _sample_pos(self, assign_result, num_expected, **kwargs): + """Randomly sample some positive samples.""" + pos_inds = torch.nonzero(assign_result.gt_inds > 0).flatten() + if pos_inds.numel() <= num_expected: + return pos_inds + else: + return self.random_choice(pos_inds, num_expected) + + def _sample_neg(self, + assign_result, + num_expected, + bboxes, + feats=None, + img_meta=None, + **kwargs): + """Sample negative samples. + + Score-HLR sampler is done in the following steps: + 1. Take the maximum positive score prediction of each negative samples + as s_i. + 2. Filter out negative samples whose s_i <= score_thr, the left samples + are called valid samples. + 3. Use NMS-Match to divide valid samples into different groups, + samples in the same group will greatly overlap with each other + 4. Rank the matched samples in two-steps to get Score-HLR. + (1) In the same group, rank samples with their scores. + (2) In the same score rank across different groups, + rank samples with their scores again. + 5. Linearly map Score-HLR to the final label weights. + + Args: + assign_result (:obj:`AssignResult`): result of assigner. + num_expected (int): Expected number of samples. + bboxes (Tensor): bbox to be sampled. + feats (Tensor): Features come from FPN. + img_meta (dict): Meta information dictionary. + """ + neg_inds = torch.nonzero(assign_result.gt_inds == 0).flatten() + num_neg = neg_inds.size(0) + if num_neg == 0: + return neg_inds, None + with torch.no_grad(): + neg_bboxes = bboxes[neg_inds] + neg_rois = bbox2roi([neg_bboxes]) + bbox_result = self.context._bbox_forward(feats, neg_rois) + cls_score, bbox_pred = bbox_result['cls_score'], bbox_result[ + 'bbox_pred'] + + ori_loss = self.bbox_head.loss( + cls_score=cls_score, + bbox_pred=None, + rois=None, + labels=neg_inds.new_full((num_neg, ), + self.bbox_head.num_classes), + label_weights=cls_score.new_ones(num_neg), + bbox_targets=None, + bbox_weights=None, + reduction_override='none')['loss_cls'] + + # filter out samples with the max score lower than score_thr + max_score, argmax_score = cls_score.softmax(-1)[:, :-1].max(-1) + valid_inds = (max_score > self.score_thr).nonzero().view(-1) + invalid_inds = (max_score <= self.score_thr).nonzero().view(-1) + num_valid = valid_inds.size(0) + num_invalid = invalid_inds.size(0) + + num_expected = min(num_neg, num_expected) + num_hlr = min(num_valid, num_expected) + num_rand = num_expected - num_hlr + if num_valid > 0: + valid_rois = neg_rois[valid_inds] + valid_max_score = max_score[valid_inds] + valid_argmax_score = argmax_score[valid_inds] + valid_bbox_pred = bbox_pred[valid_inds] + + # valid_bbox_pred shape: [num_valid, #num_classes, 4] + valid_bbox_pred = valid_bbox_pred.view( + valid_bbox_pred.size(0), -1, 4) + selected_bbox_pred = valid_bbox_pred[range(num_valid), + valid_argmax_score] + pred_bboxes = self.bbox_head.bbox_coder.decode( + valid_rois[:, 1:], selected_bbox_pred) + pred_bboxes_with_score = torch.cat( + [pred_bboxes, valid_max_score[:, None]], -1) + group = nms_match(pred_bboxes_with_score, self.iou_thr) + + # imp: importance + imp = cls_score.new_zeros(num_valid) + for g in group: + g_score = valid_max_score[g] + # g_score has already sorted + rank = g_score.new_tensor(range(g_score.size(0))) + imp[g] = num_valid - rank + g_score + _, imp_rank_inds = imp.sort(descending=True) + _, imp_rank = imp_rank_inds.sort() + hlr_inds = imp_rank_inds[:num_expected] + + if num_rand > 0: + rand_inds = torch.randperm(num_invalid)[:num_rand] + select_inds = torch.cat( + [valid_inds[hlr_inds], invalid_inds[rand_inds]]) + else: + select_inds = valid_inds[hlr_inds] + + neg_label_weights = cls_score.new_ones(num_expected) + + up_bound = max(num_expected, num_valid) + imp_weights = (up_bound - + imp_rank[hlr_inds].float()) / up_bound + neg_label_weights[:num_hlr] = imp_weights + neg_label_weights[num_hlr:] = imp_weights.min() + neg_label_weights = (self.bias + + (1 - self.bias) * neg_label_weights).pow( + self.k) + ori_selected_loss = ori_loss[select_inds] + new_loss = ori_selected_loss * neg_label_weights + norm_ratio = ori_selected_loss.sum() / new_loss.sum() + neg_label_weights *= norm_ratio + else: + neg_label_weights = cls_score.new_ones(num_expected) + select_inds = torch.randperm(num_neg)[:num_expected] + + return neg_inds[select_inds], neg_label_weights + + def sample(self, + assign_result, + bboxes, + gt_bboxes, + gt_labels=None, + img_meta=None, + **kwargs): + """Sample positive and negative bboxes. + + This is a simple implementation of bbox sampling given candidates, + assigning results and ground truth bboxes. + + Args: + assign_result (:obj:`AssignResult`): Bbox assigning results. + bboxes (Tensor): Boxes to be sampled from. + gt_bboxes (Tensor): Ground truth bboxes. + gt_labels (Tensor, optional): Class labels of ground truth bboxes. + + Returns: + tuple[:obj:`SamplingResult`, Tensor]: Sampling result and negative + label weights. + """ + bboxes = bboxes[:, :4] + + gt_flags = bboxes.new_zeros((bboxes.shape[0], ), dtype=torch.uint8) + if self.add_gt_as_proposals: + bboxes = torch.cat([gt_bboxes, bboxes], dim=0) + assign_result.add_gt_(gt_labels) + gt_ones = bboxes.new_ones(gt_bboxes.shape[0], dtype=torch.uint8) + gt_flags = torch.cat([gt_ones, gt_flags]) + + num_expected_pos = int(self.num * self.pos_fraction) + pos_inds = self.pos_sampler._sample_pos( + assign_result, num_expected_pos, bboxes=bboxes, **kwargs) + num_sampled_pos = pos_inds.numel() + num_expected_neg = self.num - num_sampled_pos + if self.neg_pos_ub >= 0: + _pos = max(1, num_sampled_pos) + neg_upper_bound = int(self.neg_pos_ub * _pos) + if num_expected_neg > neg_upper_bound: + num_expected_neg = neg_upper_bound + neg_inds, neg_label_weights = self.neg_sampler._sample_neg( + assign_result, + num_expected_neg, + bboxes, + img_meta=img_meta, + **kwargs) + + return SamplingResult(pos_inds, neg_inds, bboxes, gt_bboxes, + assign_result, gt_flags), neg_label_weights diff --git a/mmdet/core/bbox/transforms.py b/mmdet/core/bbox/transforms.py new file mode 100644 index 0000000..6d72076 --- /dev/null +++ b/mmdet/core/bbox/transforms.py @@ -0,0 +1,270 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import torch + + +def find_inside_bboxes(bboxes, img_h, img_w): + """Find bboxes as long as a part of bboxes is inside the image. + + Args: + bboxes (Tensor): Shape (N, 4). + img_h (int): Image height. + img_w (int): Image width. + + Returns: + Tensor: Index of the remaining bboxes. + """ + inside_inds = (bboxes[:, 0] < img_w) & (bboxes[:, 2] > 0) \ + & (bboxes[:, 1] < img_h) & (bboxes[:, 3] > 0) + return inside_inds + + +def bbox_flip(bboxes, img_shape, direction='horizontal'): + """Flip bboxes horizontally or vertically. + + Args: + bboxes (Tensor): Shape (..., 4*k) + img_shape (tuple): Image shape. + direction (str): Flip direction, options are "horizontal", "vertical", + "diagonal". Default: "horizontal" + + Returns: + Tensor: Flipped bboxes. + """ + assert bboxes.shape[-1] % 4 == 0 + assert direction in ['horizontal', 'vertical', 'diagonal'] + flipped = bboxes.clone() + if direction == 'horizontal': + flipped[..., 0::4] = img_shape[1] - bboxes[..., 2::4] + flipped[..., 2::4] = img_shape[1] - bboxes[..., 0::4] + elif direction == 'vertical': + flipped[..., 1::4] = img_shape[0] - bboxes[..., 3::4] + flipped[..., 3::4] = img_shape[0] - bboxes[..., 1::4] + else: + flipped[..., 0::4] = img_shape[1] - bboxes[..., 2::4] + flipped[..., 1::4] = img_shape[0] - bboxes[..., 3::4] + flipped[..., 2::4] = img_shape[1] - bboxes[..., 0::4] + flipped[..., 3::4] = img_shape[0] - bboxes[..., 1::4] + return flipped + + +def bbox_mapping(bboxes, + img_shape, + scale_factor, + flip, + flip_direction='horizontal'): + """Map bboxes from the original image scale to testing scale.""" + new_bboxes = bboxes * bboxes.new_tensor(scale_factor) + if flip: + new_bboxes = bbox_flip(new_bboxes, img_shape, flip_direction) + return new_bboxes + + +def bbox_mapping_back(bboxes, + img_shape, + scale_factor, + flip, + flip_direction='horizontal'): + """Map bboxes from testing scale to original image scale.""" + new_bboxes = bbox_flip(bboxes, img_shape, + flip_direction) if flip else bboxes + new_bboxes = new_bboxes.view(-1, 4) / new_bboxes.new_tensor(scale_factor) + return new_bboxes.view(bboxes.shape) + + +def bbox2roi(bbox_list): + """Convert a list of bboxes to roi format. + + Args: + bbox_list (list[Tensor]): a list of bboxes corresponding to a batch + of images. + + Returns: + Tensor: shape (n, 5), [batch_ind, x1, y1, x2, y2] + """ + rois_list = [] + for img_id, bboxes in enumerate(bbox_list): + if bboxes.size(0) > 0: + img_inds = bboxes.new_full((bboxes.size(0), 1), img_id) + rois = torch.cat([img_inds, bboxes[:, :4]], dim=-1) + else: + rois = bboxes.new_zeros((0, 5)) + rois_list.append(rois) + rois = torch.cat(rois_list, 0) + return rois + + +def roi2bbox(rois): + """Convert rois to bounding box format. + + Args: + rois (torch.Tensor): RoIs with the shape (n, 5) where the first + column indicates batch id of each RoI. + + Returns: + list[torch.Tensor]: Converted boxes of corresponding rois. + """ + bbox_list = [] + img_ids = torch.unique(rois[:, 0].cpu(), sorted=True) + for img_id in img_ids: + inds = (rois[:, 0] == img_id.item()) + bbox = rois[inds, 1:] + bbox_list.append(bbox) + return bbox_list + + +def bbox2result(bboxes, labels, num_classes): + """Convert detection results to a list of numpy arrays. + + Args: + bboxes (torch.Tensor | np.ndarray): shape (n, 5) + labels (torch.Tensor | np.ndarray): shape (n, ) + num_classes (int): class number, including background class + + Returns: + list(ndarray): bbox results of each class + """ + if bboxes.shape[0] == 0: + return [np.zeros((0, 5), dtype=np.float32) for i in range(num_classes)] + else: + if isinstance(bboxes, torch.Tensor): + bboxes = bboxes.detach().cpu().numpy() + labels = labels.detach().cpu().numpy() + return [bboxes[labels == i, :] for i in range(num_classes)] + + +def distance2bbox(points, distance, max_shape=None): + """Decode distance prediction to bounding box. + + Args: + points (Tensor): Shape (B, N, 2) or (N, 2). + distance (Tensor): Distance from the given point to 4 + boundaries (left, top, right, bottom). Shape (B, N, 4) or (N, 4) + max_shape (Sequence[int] or torch.Tensor or Sequence[ + Sequence[int]],optional): Maximum bounds for boxes, specifies + (H, W, C) or (H, W). If priors shape is (B, N, 4), then + the max_shape should be a Sequence[Sequence[int]] + and the length of max_shape should also be B. + + Returns: + Tensor: Boxes with shape (N, 4) or (B, N, 4) + """ + + x1 = points[..., 0] - distance[..., 0] + y1 = points[..., 1] - distance[..., 1] + x2 = points[..., 0] + distance[..., 2] + y2 = points[..., 1] + distance[..., 3] + + bboxes = torch.stack([x1, y1, x2, y2], -1) + + if max_shape is not None: + if bboxes.dim() == 2 and not torch.onnx.is_in_onnx_export(): + # speed up + bboxes[:, 0::2].clamp_(min=0, max=max_shape[1]) + bboxes[:, 1::2].clamp_(min=0, max=max_shape[0]) + return bboxes + + # clip bboxes with dynamic `min` and `max` for onnx + if torch.onnx.is_in_onnx_export(): + from mmdet.core.export import dynamic_clip_for_onnx + x1, y1, x2, y2 = dynamic_clip_for_onnx(x1, y1, x2, y2, max_shape) + bboxes = torch.stack([x1, y1, x2, y2], dim=-1) + return bboxes + if not isinstance(max_shape, torch.Tensor): + max_shape = x1.new_tensor(max_shape) + max_shape = max_shape[..., :2].type_as(x1) + if max_shape.ndim == 2: + assert bboxes.ndim == 3 + assert max_shape.size(0) == bboxes.size(0) + + min_xy = x1.new_tensor(0) + max_xy = torch.cat([max_shape, max_shape], + dim=-1).flip(-1).unsqueeze(-2) + bboxes = torch.where(bboxes < min_xy, min_xy, bboxes) + bboxes = torch.where(bboxes > max_xy, max_xy, bboxes) + + return bboxes + + +def bbox2distance(points, bbox, max_dis=None, eps=0.1): + """Decode bounding box based on distances. + + Args: + points (Tensor): Shape (n, 2), [x, y]. + bbox (Tensor): Shape (n, 4), "xyxy" format + max_dis (float): Upper bound of the distance. + eps (float): a small value to ensure target < max_dis, instead <= + + Returns: + Tensor: Decoded distances. + """ + left = points[:, 0] - bbox[:, 0] + top = points[:, 1] - bbox[:, 1] + right = bbox[:, 2] - points[:, 0] + bottom = bbox[:, 3] - points[:, 1] + if max_dis is not None: + left = left.clamp(min=0, max=max_dis - eps) + top = top.clamp(min=0, max=max_dis - eps) + right = right.clamp(min=0, max=max_dis - eps) + bottom = bottom.clamp(min=0, max=max_dis - eps) + return torch.stack([left, top, right, bottom], -1) + + +def bbox_rescale(bboxes, scale_factor=1.0): + """Rescale bounding box w.r.t. scale_factor. + + Args: + bboxes (Tensor): Shape (n, 4) for bboxes or (n, 5) for rois + scale_factor (float): rescale factor + + Returns: + Tensor: Rescaled bboxes. + """ + if bboxes.size(1) == 5: + bboxes_ = bboxes[:, 1:] + inds_ = bboxes[:, 0] + else: + bboxes_ = bboxes + cx = (bboxes_[:, 0] + bboxes_[:, 2]) * 0.5 + cy = (bboxes_[:, 1] + bboxes_[:, 3]) * 0.5 + w = bboxes_[:, 2] - bboxes_[:, 0] + h = bboxes_[:, 3] - bboxes_[:, 1] + w = w * scale_factor + h = h * scale_factor + x1 = cx - 0.5 * w + x2 = cx + 0.5 * w + y1 = cy - 0.5 * h + y2 = cy + 0.5 * h + if bboxes.size(1) == 5: + rescaled_bboxes = torch.stack([inds_, x1, y1, x2, y2], dim=-1) + else: + rescaled_bboxes = torch.stack([x1, y1, x2, y2], dim=-1) + return rescaled_bboxes + + +def bbox_cxcywh_to_xyxy(bbox): + """Convert bbox coordinates from (cx, cy, w, h) to (x1, y1, x2, y2). + + Args: + bbox (Tensor): Shape (n, 4) for bboxes. + + Returns: + Tensor: Converted bboxes. + """ + cx, cy, w, h = bbox.split((1, 1, 1, 1), dim=-1) + bbox_new = [(cx - 0.5 * w), (cy - 0.5 * h), (cx + 0.5 * w), (cy + 0.5 * h)] + return torch.cat(bbox_new, dim=-1) + + +def bbox_xyxy_to_cxcywh(bbox): + """Convert bbox coordinates from (x1, y1, x2, y2) to (cx, cy, w, h). + + Args: + bbox (Tensor): Shape (n, 4) for bboxes. + + Returns: + Tensor: Converted bboxes. + """ + x1, y1, x2, y2 = bbox.split((1, 1, 1, 1), dim=-1) + bbox_new = [(x1 + x2) / 2, (y1 + y2) / 2, (x2 - x1), (y2 - y1)] + return torch.cat(bbox_new, dim=-1) diff --git a/mmdet/core/data_structures/__init__.py b/mmdet/core/data_structures/__init__.py new file mode 100644 index 0000000..11ab96c --- /dev/null +++ b/mmdet/core/data_structures/__init__.py @@ -0,0 +1,5 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .general_data import GeneralData +from .instance_data import InstanceData + +__all__ = ['GeneralData', 'InstanceData'] diff --git a/mmdet/core/data_structures/general_data.py b/mmdet/core/data_structures/general_data.py new file mode 100644 index 0000000..978fdfd --- /dev/null +++ b/mmdet/core/data_structures/general_data.py @@ -0,0 +1,336 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy + +import numpy as np +import torch + +from mmdet.utils.util_mixins import NiceRepr + + +class GeneralData(NiceRepr): + """A general data structure of OpenMMlab. + + A data structure that stores the meta information, + the annotations of the images or the model predictions, + which can be used in communication between components. + + The attributes in `GeneralData` are divided into two parts, + the `meta_info_fields` and the `data_fields` respectively. + + - `meta_info_fields`: Usually contains the + information about the image such as filename, + image_shape, pad_shape, etc. All attributes in + it are immutable once set, + but the user can add new meta information with + `set_meta_info` function, all information can be accessed + with methods `meta_info_keys`, `meta_info_values`, + `meta_info_items`. + + - `data_fields`: Annotations or model predictions are + stored. The attributes can be accessed or modified by + dict-like or object-like operations, such as + `.` , `[]`, `in`, `del`, `pop(str)` `get(str)`, `keys()`, + `values()`, `items()`. Users can also apply tensor-like methods + to all obj:`torch.Tensor` in the `data_fileds`, + such as `.cuda()`, `.cpu()`, `.numpy()`, `device`, `.to()` + `.detach()`, `.numpy()` + + Args: + meta_info (dict, optional): A dict contains the meta information + of single image. such as `img_shape`, `scale_factor`, etc. + Default: None. + data (dict, optional): A dict contains annotations of single image or + model predictions. Default: None. + + Examples: + >>> from mmdet.core import GeneralData + >>> img_meta = dict(img_shape=(800, 1196, 3), pad_shape=(800, 1216, 3)) + >>> instance_data = GeneralData(meta_info=img_meta) + >>> img_shape in instance_data + True + >>> instance_data.det_labels = torch.LongTensor([0, 1, 2, 3]) + >>> instance_data["det_scores"] = torch.Tensor([0.01, 0.1, 0.2, 0.3]) + >>> print(results) + + >>> instance_data.det_scores + tensor([0.0100, 0.1000, 0.2000, 0.3000]) + >>> instance_data.det_labels + tensor([0, 1, 2, 3]) + >>> instance_data['det_labels'] + tensor([0, 1, 2, 3]) + >>> 'det_labels' in instance_data + True + >>> instance_data.img_shape + (800, 1196, 3) + >>> 'det_scores' in instance_data + True + >>> del instance_data.det_scores + >>> 'det_scores' in instance_data + False + >>> det_labels = instance_data.pop('det_labels', None) + >>> det_labels + tensor([0, 1, 2, 3]) + >>> 'det_labels' in instance_data + >>> False + """ + + def __init__(self, meta_info=None, data=None): + + self._meta_info_fields = set() + self._data_fields = set() + + if meta_info is not None: + self.set_meta_info(meta_info=meta_info) + if data is not None: + self.set_data(data) + + def set_meta_info(self, meta_info): + """Add meta information. + + Args: + meta_info (dict): A dict contains the meta information + of image. such as `img_shape`, `scale_factor`, etc. + Default: None. + """ + assert isinstance(meta_info, + dict), f'meta should be a `dict` but get {meta_info}' + meta = copy.deepcopy(meta_info) + for k, v in meta.items(): + # should be consistent with original meta_info + if k in self._meta_info_fields: + ori_value = getattr(self, k) + if isinstance(ori_value, (torch.Tensor, np.ndarray)): + if (ori_value == v).all(): + continue + else: + raise KeyError( + f'img_meta_info {k} has been set as ' + f'{getattr(self, k)} before, which is immutable ') + elif ori_value == v: + continue + else: + raise KeyError( + f'img_meta_info {k} has been set as ' + f'{getattr(self, k)} before, which is immutable ') + else: + self._meta_info_fields.add(k) + self.__dict__[k] = v + + def set_data(self, data): + """Update a dict to `data_fields`. + + Args: + data (dict): A dict contains annotations of image or + model predictions. Default: None. + """ + assert isinstance(data, + dict), f'meta should be a `dict` but get {data}' + for k, v in data.items(): + self.__setattr__(k, v) + + def new(self, meta_info=None, data=None): + """Return a new results with same image meta information. + + Args: + meta_info (dict, optional): A dict contains the meta information + of image. such as `img_shape`, `scale_factor`, etc. + Default: None. + data (dict, optional): A dict contains annotations of image or + model predictions. Default: None. + """ + new_data = self.__class__() + new_data.set_meta_info(dict(self.meta_info_items())) + if meta_info is not None: + new_data.set_meta_info(meta_info) + if data is not None: + new_data.set_data(data) + return new_data + + def keys(self): + """ + Returns: + list: Contains all keys in data_fields. + """ + return [key for key in self._data_fields] + + def meta_info_keys(self): + """ + Returns: + list: Contains all keys in meta_info_fields. + """ + return [key for key in self._meta_info_fields] + + def values(self): + """ + Returns: + list: Contains all values in data_fields. + """ + return [getattr(self, k) for k in self.keys()] + + def meta_info_values(self): + """ + Returns: + list: Contains all values in meta_info_fields. + """ + return [getattr(self, k) for k in self.meta_info_keys()] + + def items(self): + for k in self.keys(): + yield (k, getattr(self, k)) + + def meta_info_items(self): + for k in self.meta_info_keys(): + yield (k, getattr(self, k)) + + def __setattr__(self, name, val): + if name in ('_meta_info_fields', '_data_fields'): + if not hasattr(self, name): + super().__setattr__(name, val) + else: + raise AttributeError( + f'{name} has been used as a ' + f'private attribute, which is immutable. ') + else: + if name in self._meta_info_fields: + raise AttributeError(f'`{name}` is used in meta information,' + f'which is immutable') + + self._data_fields.add(name) + super().__setattr__(name, val) + + def __delattr__(self, item): + + if item in ('_meta_info_fields', '_data_fields'): + raise AttributeError(f'{item} has been used as a ' + f'private attribute, which is immutable. ') + + if item in self._meta_info_fields: + raise KeyError(f'{item} is used in meta information, ' + f'which is immutable.') + super().__delattr__(item) + if item in self._data_fields: + self._data_fields.remove(item) + + # dict-like methods + __setitem__ = __setattr__ + __delitem__ = __delattr__ + + def __getitem__(self, name): + return getattr(self, name) + + def get(self, *args): + assert len(args) < 3, '`get` get more than 2 arguments' + return self.__dict__.get(*args) + + def pop(self, *args): + assert len(args) < 3, '`pop` get more than 2 arguments' + name = args[0] + if name in self._meta_info_fields: + raise KeyError(f'{name} is a key in meta information, ' + f'which is immutable') + + if args[0] in self._data_fields: + self._data_fields.remove(args[0]) + return self.__dict__.pop(*args) + + # with default value + elif len(args) == 2: + return args[1] + else: + raise KeyError(f'{args[0]}') + + def __contains__(self, item): + return item in self._data_fields or \ + item in self._meta_info_fields + + # Tensor-like methods + def to(self, *args, **kwargs): + """Apply same name function to all tensors in data_fields.""" + new_data = self.new() + for k, v in self.items(): + if hasattr(v, 'to'): + v = v.to(*args, **kwargs) + new_data[k] = v + return new_data + + # Tensor-like methods + def cpu(self): + """Apply same name function to all tensors in data_fields.""" + new_data = self.new() + for k, v in self.items(): + if isinstance(v, torch.Tensor): + v = v.cpu() + new_data[k] = v + return new_data + + # Tensor-like methods + def npu(self): + """Apply same name function to all tensors in data_fields.""" + new_data = self.new() + for k, v in self.items(): + if isinstance(v, torch.Tensor): + v = v.npu() + new_data[k] = v + return new_data + + # Tensor-like methods + def mlu(self): + """Apply same name function to all tensors in data_fields.""" + new_data = self.new() + for k, v in self.items(): + if isinstance(v, torch.Tensor): + v = v.mlu() + new_data[k] = v + return new_data + + # Tensor-like methods + def cuda(self): + """Apply same name function to all tensors in data_fields.""" + new_data = self.new() + for k, v in self.items(): + if isinstance(v, torch.Tensor): + v = v.cuda() + new_data[k] = v + return new_data + + # Tensor-like methods + def detach(self): + """Apply same name function to all tensors in data_fields.""" + new_data = self.new() + for k, v in self.items(): + if isinstance(v, torch.Tensor): + v = v.detach() + new_data[k] = v + return new_data + + # Tensor-like methods + def numpy(self): + """Apply same name function to all tensors in data_fields.""" + new_data = self.new() + for k, v in self.items(): + if isinstance(v, torch.Tensor): + v = v.detach().cpu().numpy() + new_data[k] = v + return new_data + + def __nice__(self): + repr = '\n \n META INFORMATION \n' + for k, v in self.meta_info_items(): + repr += f'{k}: {v} \n' + repr += '\n DATA FIELDS \n' + for k, v in self.items(): + if isinstance(v, (torch.Tensor, np.ndarray)): + repr += f'shape of {k}: {v.shape} \n' + else: + repr += f'{k}: {v} \n' + return repr + '\n' diff --git a/mmdet/core/data_structures/instance_data.py b/mmdet/core/data_structures/instance_data.py new file mode 100644 index 0000000..eef2065 --- /dev/null +++ b/mmdet/core/data_structures/instance_data.py @@ -0,0 +1,188 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import itertools + +import numpy as np +import torch + +from .general_data import GeneralData + + +class InstanceData(GeneralData): + """Data structure for instance-level annnotations or predictions. + + Subclass of :class:`GeneralData`. All value in `data_fields` + should have the same length. This design refer to + https://github.com/facebookresearch/detectron2/blob/master/detectron2/structures/instances.py # noqa E501 + + Examples: + >>> from mmdet.core import InstanceData + >>> import numpy as np + >>> img_meta = dict(img_shape=(800, 1196, 3), pad_shape=(800, 1216, 3)) + >>> results = InstanceData(img_meta) + >>> img_shape in results + True + >>> results.det_labels = torch.LongTensor([0, 1, 2, 3]) + >>> results["det_scores"] = torch.Tensor([0.01, 0.7, 0.6, 0.3]) + >>> results["det_masks"] = np.ndarray(4, 2, 2) + >>> len(results) + 4 + >>> print(resutls) + + >>> sorted_results = results[results.det_scores.sort().indices] + >>> sorted_results.det_scores + tensor([0.0100, 0.3000, 0.6000, 0.7000]) + >>> sorted_results.det_labels + tensor([0, 3, 2, 1]) + >>> print(results[results.scores > 0.5]) + + >>> results[results.det_scores > 0.5].det_labels + tensor([1, 2]) + >>> results[results.det_scores > 0.5].det_scores + tensor([0.7000, 0.6000]) + """ + + def __setattr__(self, name, value): + + if name in ('_meta_info_fields', '_data_fields'): + if not hasattr(self, name): + super().__setattr__(name, value) + else: + raise AttributeError( + f'{name} has been used as a ' + f'private attribute, which is immutable. ') + + else: + assert isinstance(value, (torch.Tensor, np.ndarray, list)), \ + f'Can set {type(value)}, only support' \ + f' {(torch.Tensor, np.ndarray, list)}' + + if self._data_fields: + assert len(value) == len(self), f'the length of ' \ + f'values {len(value)} is ' \ + f'not consistent with' \ + f' the length ' \ + f'of this :obj:`InstanceData` ' \ + f'{len(self)} ' + super().__setattr__(name, value) + + def __getitem__(self, item): + """ + Args: + item (str, obj:`slice`, + obj`torch.LongTensor`, obj:`torch.BoolTensor`): + get the corresponding values according to item. + + Returns: + obj:`InstanceData`: Corresponding values. + """ + assert len(self), ' This is a empty instance' + + assert isinstance( + item, (str, slice, int, torch.LongTensor, torch.BoolTensor)) + + if isinstance(item, str): + return getattr(self, item) + + if type(item) == int: + if item >= len(self) or item < -len(self): + raise IndexError(f'Index {item} out of range!') + else: + # keep the dimension + item = slice(item, None, len(self)) + + new_data = self.new() + if isinstance(item, (torch.Tensor)): + assert item.dim() == 1, 'Only support to get the' \ + ' values along the first dimension.' + if isinstance(item, torch.BoolTensor): + assert len(item) == len(self), f'The shape of the' \ + f' input(BoolTensor)) ' \ + f'{len(item)} ' \ + f' does not match the shape ' \ + f'of the indexed tensor ' \ + f'in results_filed ' \ + f'{len(self)} at ' \ + f'first dimension. ' + + for k, v in self.items(): + if isinstance(v, torch.Tensor): + new_data[k] = v[item] + elif isinstance(v, np.ndarray): + new_data[k] = v[item.cpu().numpy()] + elif isinstance(v, list): + r_list = [] + # convert to indexes from boolTensor + if isinstance(item, torch.BoolTensor): + indexes = torch.nonzero(item).view(-1) + else: + indexes = item + for index in indexes: + r_list.append(v[index]) + new_data[k] = r_list + else: + # item is a slice + for k, v in self.items(): + new_data[k] = v[item] + return new_data + + @staticmethod + def cat(instances_list): + """Concat the predictions of all :obj:`InstanceData` in the list. + + Args: + instances_list (list[:obj:`InstanceData`]): A list + of :obj:`InstanceData`. + + Returns: + obj:`InstanceData` + """ + assert all( + isinstance(results, InstanceData) for results in instances_list) + assert len(instances_list) > 0 + if len(instances_list) == 1: + return instances_list[0] + + new_data = instances_list[0].new() + for k in instances_list[0]._data_fields: + values = [results[k] for results in instances_list] + v0 = values[0] + if isinstance(v0, torch.Tensor): + values = torch.cat(values, dim=0) + elif isinstance(v0, np.ndarray): + values = np.concatenate(values, axis=0) + elif isinstance(v0, list): + values = list(itertools.chain(*values)) + else: + raise ValueError( + f'Can not concat the {k} which is a {type(v0)}') + new_data[k] = values + return new_data + + def __len__(self): + if len(self._data_fields): + for v in self.values(): + return len(v) + else: + raise AssertionError('This is an empty `InstanceData`.') diff --git a/mmdet/core/evaluation/__init__.py b/mmdet/core/evaluation/__init__.py new file mode 100644 index 0000000..2b488a7 --- /dev/null +++ b/mmdet/core/evaluation/__init__.py @@ -0,0 +1,21 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .class_names import (cityscapes_classes, coco_classes, dataset_aliases, + get_classes, imagenet_det_classes, + imagenet_vid_classes, objects365v1_classes, + objects365v2_classes, oid_challenge_classes, + oid_v6_classes, voc_classes) +from .eval_hooks import DistEvalHook, EvalHook +from .mean_ap import average_precision, eval_map, print_map_summary +from .panoptic_utils import INSTANCE_OFFSET +from .recall import (eval_recalls, plot_iou_recall, plot_num_recall, + print_recall_summary) + +__all__ = [ + 'voc_classes', 'imagenet_det_classes', 'imagenet_vid_classes', + 'coco_classes', 'cityscapes_classes', 'dataset_aliases', 'get_classes', + 'DistEvalHook', 'EvalHook', 'average_precision', 'eval_map', + 'print_map_summary', 'eval_recalls', 'print_recall_summary', + 'plot_num_recall', 'plot_iou_recall', 'oid_v6_classes', + 'oid_challenge_classes', 'objects365v1_classes', 'objects365v2_classes', + 'INSTANCE_OFFSET' +] diff --git a/mmdet/core/evaluation/bbox_overlaps.py b/mmdet/core/evaluation/bbox_overlaps.py new file mode 100644 index 0000000..5d6eb82 --- /dev/null +++ b/mmdet/core/evaluation/bbox_overlaps.py @@ -0,0 +1,65 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np + + +def bbox_overlaps(bboxes1, + bboxes2, + mode='iou', + eps=1e-6, + use_legacy_coordinate=False): + """Calculate the ious between each bbox of bboxes1 and bboxes2. + + Args: + bboxes1 (ndarray): Shape (n, 4) + bboxes2 (ndarray): Shape (k, 4) + mode (str): IOU (intersection over union) or IOF (intersection + over foreground) + use_legacy_coordinate (bool): Whether to use coordinate system in + mmdet v1.x. which means width, height should be + calculated as 'x2 - x1 + 1` and 'y2 - y1 + 1' respectively. + Note when function is used in `VOCDataset`, it should be + True to align with the official implementation + `http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCdevkit_18-May-2011.tar` + Default: False. + + Returns: + ious (ndarray): Shape (n, k) + """ + + assert mode in ['iou', 'iof'] + if not use_legacy_coordinate: + extra_length = 0. + else: + extra_length = 1. + bboxes1 = bboxes1.astype(np.float32) + bboxes2 = bboxes2.astype(np.float32) + rows = bboxes1.shape[0] + cols = bboxes2.shape[0] + ious = np.zeros((rows, cols), dtype=np.float32) + if rows * cols == 0: + return ious + exchange = False + if bboxes1.shape[0] > bboxes2.shape[0]: + bboxes1, bboxes2 = bboxes2, bboxes1 + ious = np.zeros((cols, rows), dtype=np.float32) + exchange = True + area1 = (bboxes1[:, 2] - bboxes1[:, 0] + extra_length) * ( + bboxes1[:, 3] - bboxes1[:, 1] + extra_length) + area2 = (bboxes2[:, 2] - bboxes2[:, 0] + extra_length) * ( + bboxes2[:, 3] - bboxes2[:, 1] + extra_length) + for i in range(bboxes1.shape[0]): + x_start = np.maximum(bboxes1[i, 0], bboxes2[:, 0]) + y_start = np.maximum(bboxes1[i, 1], bboxes2[:, 1]) + x_end = np.minimum(bboxes1[i, 2], bboxes2[:, 2]) + y_end = np.minimum(bboxes1[i, 3], bboxes2[:, 3]) + overlap = np.maximum(x_end - x_start + extra_length, 0) * np.maximum( + y_end - y_start + extra_length, 0) + if mode == 'iou': + union = area1[i] + area2 - overlap + else: + union = area1[i] if not exchange else area2 + union = np.maximum(union, eps) + ious[i, :] = overlap / union + if exchange: + ious = ious.T + return ious diff --git a/mmdet/core/evaluation/class_names.py b/mmdet/core/evaluation/class_names.py new file mode 100644 index 0000000..c015c5d --- /dev/null +++ b/mmdet/core/evaluation/class_names.py @@ -0,0 +1,476 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv + + +def wider_face_classes(): + return ['face'] + + +def voc_classes(): + return [ + 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', + 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person', + 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor' + ] + + +def imagenet_det_classes(): + return [ + 'accordion', 'airplane', 'ant', 'antelope', 'apple', 'armadillo', + 'artichoke', 'axe', 'baby_bed', 'backpack', 'bagel', 'balance_beam', + 'banana', 'band_aid', 'banjo', 'baseball', 'basketball', 'bathing_cap', + 'beaker', 'bear', 'bee', 'bell_pepper', 'bench', 'bicycle', 'binder', + 'bird', 'bookshelf', 'bow_tie', 'bow', 'bowl', 'brassiere', 'burrito', + 'bus', 'butterfly', 'camel', 'can_opener', 'car', 'cart', 'cattle', + 'cello', 'centipede', 'chain_saw', 'chair', 'chime', 'cocktail_shaker', + 'coffee_maker', 'computer_keyboard', 'computer_mouse', 'corkscrew', + 'cream', 'croquet_ball', 'crutch', 'cucumber', 'cup_or_mug', 'diaper', + 'digital_clock', 'dishwasher', 'dog', 'domestic_cat', 'dragonfly', + 'drum', 'dumbbell', 'electric_fan', 'elephant', 'face_powder', 'fig', + 'filing_cabinet', 'flower_pot', 'flute', 'fox', 'french_horn', 'frog', + 'frying_pan', 'giant_panda', 'goldfish', 'golf_ball', 'golfcart', + 'guacamole', 'guitar', 'hair_dryer', 'hair_spray', 'hamburger', + 'hammer', 'hamster', 'harmonica', 'harp', 'hat_with_a_wide_brim', + 'head_cabbage', 'helmet', 'hippopotamus', 'horizontal_bar', 'horse', + 'hotdog', 'iPod', 'isopod', 'jellyfish', 'koala_bear', 'ladle', + 'ladybug', 'lamp', 'laptop', 'lemon', 'lion', 'lipstick', 'lizard', + 'lobster', 'maillot', 'maraca', 'microphone', 'microwave', 'milk_can', + 'miniskirt', 'monkey', 'motorcycle', 'mushroom', 'nail', 'neck_brace', + 'oboe', 'orange', 'otter', 'pencil_box', 'pencil_sharpener', 'perfume', + 'person', 'piano', 'pineapple', 'ping-pong_ball', 'pitcher', 'pizza', + 'plastic_bag', 'plate_rack', 'pomegranate', 'popsicle', 'porcupine', + 'power_drill', 'pretzel', 'printer', 'puck', 'punching_bag', 'purse', + 'rabbit', 'racket', 'ray', 'red_panda', 'refrigerator', + 'remote_control', 'rubber_eraser', 'rugby_ball', 'ruler', + 'salt_or_pepper_shaker', 'saxophone', 'scorpion', 'screwdriver', + 'seal', 'sheep', 'ski', 'skunk', 'snail', 'snake', 'snowmobile', + 'snowplow', 'soap_dispenser', 'soccer_ball', 'sofa', 'spatula', + 'squirrel', 'starfish', 'stethoscope', 'stove', 'strainer', + 'strawberry', 'stretcher', 'sunglasses', 'swimming_trunks', 'swine', + 'syringe', 'table', 'tape_player', 'tennis_ball', 'tick', 'tie', + 'tiger', 'toaster', 'traffic_light', 'train', 'trombone', 'trumpet', + 'turtle', 'tv_or_monitor', 'unicycle', 'vacuum', 'violin', + 'volleyball', 'waffle_iron', 'washer', 'water_bottle', 'watercraft', + 'whale', 'wine_bottle', 'zebra' + ] + + +def imagenet_vid_classes(): + return [ + 'airplane', 'antelope', 'bear', 'bicycle', 'bird', 'bus', 'car', + 'cattle', 'dog', 'domestic_cat', 'elephant', 'fox', 'giant_panda', + 'hamster', 'horse', 'lion', 'lizard', 'monkey', 'motorcycle', 'rabbit', + 'red_panda', 'sheep', 'snake', 'squirrel', 'tiger', 'train', 'turtle', + 'watercraft', 'whale', 'zebra' + ] + + +def coco_classes(): + return [ + 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', + 'truck', 'boat', 'traffic_light', 'fire_hydrant', 'stop_sign', + 'parking_meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', + 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', + 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', + 'sports_ball', 'kite', 'baseball_bat', 'baseball_glove', 'skateboard', + 'surfboard', 'tennis_racket', 'bottle', 'wine_glass', 'cup', 'fork', + 'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange', + 'broccoli', 'carrot', 'hot_dog', 'pizza', 'donut', 'cake', 'chair', + 'couch', 'potted_plant', 'bed', 'dining_table', 'toilet', 'tv', + 'laptop', 'mouse', 'remote', 'keyboard', 'cell_phone', 'microwave', + 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', + 'scissors', 'teddy_bear', 'hair_drier', 'toothbrush' + ] + + +def cityscapes_classes(): + return [ + 'person', 'rider', 'car', 'truck', 'bus', 'train', 'motorcycle', + 'bicycle' + ] + + +def oid_challenge_classes(): + return [ + 'Footwear', 'Jeans', 'House', 'Tree', 'Woman', 'Man', 'Land vehicle', + 'Person', 'Wheel', 'Bus', 'Human face', 'Bird', 'Dress', 'Girl', + 'Vehicle', 'Building', 'Cat', 'Car', 'Belt', 'Elephant', 'Dessert', + 'Butterfly', 'Train', 'Guitar', 'Poster', 'Book', 'Boy', 'Bee', + 'Flower', 'Window', 'Hat', 'Human head', 'Dog', 'Human arm', 'Drink', + 'Human mouth', 'Human hair', 'Human nose', 'Human hand', 'Table', + 'Marine invertebrates', 'Fish', 'Sculpture', 'Rose', 'Street light', + 'Glasses', 'Fountain', 'Skyscraper', 'Swimwear', 'Brassiere', 'Drum', + 'Duck', 'Countertop', 'Furniture', 'Ball', 'Human leg', 'Boat', + 'Balloon', 'Bicycle helmet', 'Goggles', 'Door', 'Human eye', 'Shirt', + 'Toy', 'Teddy bear', 'Pasta', 'Tomato', 'Human ear', + 'Vehicle registration plate', 'Microphone', 'Musical keyboard', + 'Tower', 'Houseplant', 'Flowerpot', 'Fruit', 'Vegetable', + 'Musical instrument', 'Suit', 'Motorcycle', 'Bagel', 'French fries', + 'Hamburger', 'Chair', 'Salt and pepper shakers', 'Snail', 'Airplane', + 'Horse', 'Laptop', 'Computer keyboard', 'Football helmet', 'Cocktail', + 'Juice', 'Tie', 'Computer monitor', 'Human beard', 'Bottle', + 'Saxophone', 'Lemon', 'Mouse', 'Sock', 'Cowboy hat', 'Sun hat', + 'Football', 'Porch', 'Sunglasses', 'Lobster', 'Crab', 'Picture frame', + 'Van', 'Crocodile', 'Surfboard', 'Shorts', 'Helicopter', 'Helmet', + 'Sports uniform', 'Taxi', 'Swan', 'Goose', 'Coat', 'Jacket', 'Handbag', + 'Flag', 'Skateboard', 'Television', 'Tire', 'Spoon', 'Palm tree', + 'Stairs', 'Salad', 'Castle', 'Oven', 'Microwave oven', 'Wine', + 'Ceiling fan', 'Mechanical fan', 'Cattle', 'Truck', 'Box', 'Ambulance', + 'Desk', 'Wine glass', 'Reptile', 'Tank', 'Traffic light', 'Billboard', + 'Tent', 'Insect', 'Spider', 'Treadmill', 'Cupboard', 'Shelf', + 'Seat belt', 'Human foot', 'Bicycle', 'Bicycle wheel', 'Couch', + 'Bookcase', 'Fedora', 'Backpack', 'Bench', 'Oyster', + 'Moths and butterflies', 'Lavender', 'Waffle', 'Fork', 'Animal', + 'Accordion', 'Mobile phone', 'Plate', 'Coffee cup', 'Saucer', + 'Platter', 'Dagger', 'Knife', 'Bull', 'Tortoise', 'Sea turtle', 'Deer', + 'Weapon', 'Apple', 'Ski', 'Taco', 'Traffic sign', 'Beer', 'Necklace', + 'Sunflower', 'Piano', 'Organ', 'Harpsichord', 'Bed', 'Cabinetry', + 'Nightstand', 'Curtain', 'Chest of drawers', 'Drawer', 'Parrot', + 'Sandal', 'High heels', 'Tableware', 'Cart', 'Mushroom', 'Kite', + 'Missile', 'Seafood', 'Camera', 'Paper towel', 'Toilet paper', + 'Sombrero', 'Radish', 'Lighthouse', 'Segway', 'Pig', 'Watercraft', + 'Golf cart', 'studio couch', 'Dolphin', 'Whale', 'Earrings', 'Otter', + 'Sea lion', 'Whiteboard', 'Monkey', 'Gondola', 'Zebra', + 'Baseball glove', 'Scarf', 'Adhesive tape', 'Trousers', 'Scoreboard', + 'Lily', 'Carnivore', 'Power plugs and sockets', 'Office building', + 'Sandwich', 'Swimming pool', 'Headphones', 'Tin can', 'Crown', 'Doll', + 'Cake', 'Frog', 'Beetle', 'Ant', 'Gas stove', 'Canoe', 'Falcon', + 'Blue jay', 'Egg', 'Fire hydrant', 'Raccoon', 'Muffin', 'Wall clock', + 'Coffee', 'Mug', 'Tea', 'Bear', 'Waste container', 'Home appliance', + 'Candle', 'Lion', 'Mirror', 'Starfish', 'Marine mammal', 'Wheelchair', + 'Umbrella', 'Alpaca', 'Violin', 'Cello', 'Brown bear', 'Canary', 'Bat', + 'Ruler', 'Plastic bag', 'Penguin', 'Watermelon', 'Harbor seal', 'Pen', + 'Pumpkin', 'Harp', 'Kitchen appliance', 'Roller skates', 'Bust', + 'Coffee table', 'Tennis ball', 'Tennis racket', 'Ladder', 'Boot', + 'Bowl', 'Stop sign', 'Volleyball', 'Eagle', 'Paddle', 'Chicken', + 'Skull', 'Lamp', 'Beehive', 'Maple', 'Sink', 'Goldfish', 'Tripod', + 'Coconut', 'Bidet', 'Tap', 'Bathroom cabinet', 'Toilet', + 'Filing cabinet', 'Pretzel', 'Table tennis racket', 'Bronze sculpture', + 'Rocket', 'Mouse', 'Hamster', 'Lizard', 'Lifejacket', 'Goat', + 'Washing machine', 'Trumpet', 'Horn', 'Trombone', 'Sheep', + 'Tablet computer', 'Pillow', 'Kitchen & dining room table', + 'Parachute', 'Raven', 'Glove', 'Loveseat', 'Christmas tree', + 'Shellfish', 'Rifle', 'Shotgun', 'Sushi', 'Sparrow', 'Bread', + 'Toaster', 'Watch', 'Asparagus', 'Artichoke', 'Suitcase', 'Antelope', + 'Broccoli', 'Ice cream', 'Racket', 'Banana', 'Cookie', 'Cucumber', + 'Dragonfly', 'Lynx', 'Caterpillar', 'Light bulb', 'Office supplies', + 'Miniskirt', 'Skirt', 'Fireplace', 'Potato', 'Light switch', + 'Croissant', 'Cabbage', 'Ladybug', 'Handgun', 'Luggage and bags', + 'Window blind', 'Snowboard', 'Baseball bat', 'Digital clock', + 'Serving tray', 'Infant bed', 'Sofa bed', 'Guacamole', 'Fox', 'Pizza', + 'Snowplow', 'Jet ski', 'Refrigerator', 'Lantern', 'Convenience store', + 'Sword', 'Rugby ball', 'Owl', 'Ostrich', 'Pancake', 'Strawberry', + 'Carrot', 'Tart', 'Dice', 'Turkey', 'Rabbit', 'Invertebrate', 'Vase', + 'Stool', 'Swim cap', 'Shower', 'Clock', 'Jellyfish', 'Aircraft', + 'Chopsticks', 'Orange', 'Snake', 'Sewing machine', 'Kangaroo', 'Mixer', + 'Food processor', 'Shrimp', 'Towel', 'Porcupine', 'Jaguar', 'Cannon', + 'Limousine', 'Mule', 'Squirrel', 'Kitchen knife', 'Tiara', 'Tiger', + 'Bow and arrow', 'Candy', 'Rhinoceros', 'Shark', 'Cricket ball', + 'Doughnut', 'Plumbing fixture', 'Camel', 'Polar bear', 'Coin', + 'Printer', 'Blender', 'Giraffe', 'Billiard table', 'Kettle', + 'Dinosaur', 'Pineapple', 'Zucchini', 'Jug', 'Barge', 'Teapot', + 'Golf ball', 'Binoculars', 'Scissors', 'Hot dog', 'Door handle', + 'Seahorse', 'Bathtub', 'Leopard', 'Centipede', 'Grapefruit', 'Snowman', + 'Cheetah', 'Alarm clock', 'Grape', 'Wrench', 'Wok', 'Bell pepper', + 'Cake stand', 'Barrel', 'Woodpecker', 'Flute', 'Corded phone', + 'Willow', 'Punching bag', 'Pomegranate', 'Telephone', 'Pear', + 'Common fig', 'Bench', 'Wood-burning stove', 'Burrito', 'Nail', + 'Turtle', 'Submarine sandwich', 'Drinking straw', 'Peach', 'Popcorn', + 'Frying pan', 'Picnic basket', 'Honeycomb', 'Envelope', 'Mango', + 'Cutting board', 'Pitcher', 'Stationary bicycle', 'Dumbbell', + 'Personal care', 'Dog bed', 'Snowmobile', 'Oboe', 'Briefcase', + 'Squash', 'Tick', 'Slow cooker', 'Coffeemaker', 'Measuring cup', + 'Crutch', 'Stretcher', 'Screwdriver', 'Flashlight', 'Spatula', + 'Pressure cooker', 'Ring binder', 'Beaker', 'Torch', 'Winter melon' + ] + + +def oid_v6_classes(): + return [ + 'Tortoise', 'Container', 'Magpie', 'Sea turtle', 'Football', + 'Ambulance', 'Ladder', 'Toothbrush', 'Syringe', 'Sink', 'Toy', + 'Organ (Musical Instrument)', 'Cassette deck', 'Apple', 'Human eye', + 'Cosmetics', 'Paddle', 'Snowman', 'Beer', 'Chopsticks', 'Human beard', + 'Bird', 'Parking meter', 'Traffic light', 'Croissant', 'Cucumber', + 'Radish', 'Towel', 'Doll', 'Skull', 'Washing machine', 'Glove', 'Tick', + 'Belt', 'Sunglasses', 'Banjo', 'Cart', 'Ball', 'Backpack', 'Bicycle', + 'Home appliance', 'Centipede', 'Boat', 'Surfboard', 'Boot', + 'Headphones', 'Hot dog', 'Shorts', 'Fast food', 'Bus', 'Boy', + 'Screwdriver', 'Bicycle wheel', 'Barge', 'Laptop', 'Miniskirt', + 'Drill (Tool)', 'Dress', 'Bear', 'Waffle', 'Pancake', 'Brown bear', + 'Woodpecker', 'Blue jay', 'Pretzel', 'Bagel', 'Tower', 'Teapot', + 'Person', 'Bow and arrow', 'Swimwear', 'Beehive', 'Brassiere', 'Bee', + 'Bat (Animal)', 'Starfish', 'Popcorn', 'Burrito', 'Chainsaw', + 'Balloon', 'Wrench', 'Tent', 'Vehicle registration plate', 'Lantern', + 'Toaster', 'Flashlight', 'Billboard', 'Tiara', 'Limousine', 'Necklace', + 'Carnivore', 'Scissors', 'Stairs', 'Computer keyboard', 'Printer', + 'Traffic sign', 'Chair', 'Shirt', 'Poster', 'Cheese', 'Sock', + 'Fire hydrant', 'Land vehicle', 'Earrings', 'Tie', 'Watercraft', + 'Cabinetry', 'Suitcase', 'Muffin', 'Bidet', 'Snack', 'Snowmobile', + 'Clock', 'Medical equipment', 'Cattle', 'Cello', 'Jet ski', 'Camel', + 'Coat', 'Suit', 'Desk', 'Cat', 'Bronze sculpture', 'Juice', 'Gondola', + 'Beetle', 'Cannon', 'Computer mouse', 'Cookie', 'Office building', + 'Fountain', 'Coin', 'Calculator', 'Cocktail', 'Computer monitor', + 'Box', 'Stapler', 'Christmas tree', 'Cowboy hat', 'Hiking equipment', + 'Studio couch', 'Drum', 'Dessert', 'Wine rack', 'Drink', 'Zucchini', + 'Ladle', 'Human mouth', 'Dairy Product', 'Dice', 'Oven', 'Dinosaur', + 'Ratchet (Device)', 'Couch', 'Cricket ball', 'Winter melon', 'Spatula', + 'Whiteboard', 'Pencil sharpener', 'Door', 'Hat', 'Shower', 'Eraser', + 'Fedora', 'Guacamole', 'Dagger', 'Scarf', 'Dolphin', 'Sombrero', + 'Tin can', 'Mug', 'Tap', 'Harbor seal', 'Stretcher', 'Can opener', + 'Goggles', 'Human body', 'Roller skates', 'Coffee cup', + 'Cutting board', 'Blender', 'Plumbing fixture', 'Stop sign', + 'Office supplies', 'Volleyball (Ball)', 'Vase', 'Slow cooker', + 'Wardrobe', 'Coffee', 'Whisk', 'Paper towel', 'Personal care', 'Food', + 'Sun hat', 'Tree house', 'Flying disc', 'Skirt', 'Gas stove', + 'Salt and pepper shakers', 'Mechanical fan', 'Face powder', 'Fax', + 'Fruit', 'French fries', 'Nightstand', 'Barrel', 'Kite', 'Tart', + 'Treadmill', 'Fox', 'Flag', 'French horn', 'Window blind', + 'Human foot', 'Golf cart', 'Jacket', 'Egg (Food)', 'Street light', + 'Guitar', 'Pillow', 'Human leg', 'Isopod', 'Grape', 'Human ear', + 'Power plugs and sockets', 'Panda', 'Giraffe', 'Woman', 'Door handle', + 'Rhinoceros', 'Bathtub', 'Goldfish', 'Houseplant', 'Goat', + 'Baseball bat', 'Baseball glove', 'Mixing bowl', + 'Marine invertebrates', 'Kitchen utensil', 'Light switch', 'House', + 'Horse', 'Stationary bicycle', 'Hammer', 'Ceiling fan', 'Sofa bed', + 'Adhesive tape', 'Harp', 'Sandal', 'Bicycle helmet', 'Saucer', + 'Harpsichord', 'Human hair', 'Heater', 'Harmonica', 'Hamster', + 'Curtain', 'Bed', 'Kettle', 'Fireplace', 'Scale', 'Drinking straw', + 'Insect', 'Hair dryer', 'Kitchenware', 'Indoor rower', 'Invertebrate', + 'Food processor', 'Bookcase', 'Refrigerator', 'Wood-burning stove', + 'Punching bag', 'Common fig', 'Cocktail shaker', 'Jaguar (Animal)', + 'Golf ball', 'Fashion accessory', 'Alarm clock', 'Filing cabinet', + 'Artichoke', 'Table', 'Tableware', 'Kangaroo', 'Koala', 'Knife', + 'Bottle', 'Bottle opener', 'Lynx', 'Lavender (Plant)', 'Lighthouse', + 'Dumbbell', 'Human head', 'Bowl', 'Humidifier', 'Porch', 'Lizard', + 'Billiard table', 'Mammal', 'Mouse', 'Motorcycle', + 'Musical instrument', 'Swim cap', 'Frying pan', 'Snowplow', + 'Bathroom cabinet', 'Missile', 'Bust', 'Man', 'Waffle iron', 'Milk', + 'Ring binder', 'Plate', 'Mobile phone', 'Baked goods', 'Mushroom', + 'Crutch', 'Pitcher (Container)', 'Mirror', 'Personal flotation device', + 'Table tennis racket', 'Pencil case', 'Musical keyboard', 'Scoreboard', + 'Briefcase', 'Kitchen knife', 'Nail (Construction)', 'Tennis ball', + 'Plastic bag', 'Oboe', 'Chest of drawers', 'Ostrich', 'Piano', 'Girl', + 'Plant', 'Potato', 'Hair spray', 'Sports equipment', 'Pasta', + 'Penguin', 'Pumpkin', 'Pear', 'Infant bed', 'Polar bear', 'Mixer', + 'Cupboard', 'Jacuzzi', 'Pizza', 'Digital clock', 'Pig', 'Reptile', + 'Rifle', 'Lipstick', 'Skateboard', 'Raven', 'High heels', 'Red panda', + 'Rose', 'Rabbit', 'Sculpture', 'Saxophone', 'Shotgun', 'Seafood', + 'Submarine sandwich', 'Snowboard', 'Sword', 'Picture frame', 'Sushi', + 'Loveseat', 'Ski', 'Squirrel', 'Tripod', 'Stethoscope', 'Submarine', + 'Scorpion', 'Segway', 'Training bench', 'Snake', 'Coffee table', + 'Skyscraper', 'Sheep', 'Television', 'Trombone', 'Tea', 'Tank', 'Taco', + 'Telephone', 'Torch', 'Tiger', 'Strawberry', 'Trumpet', 'Tree', + 'Tomato', 'Train', 'Tool', 'Picnic basket', 'Cooking spray', + 'Trousers', 'Bowling equipment', 'Football helmet', 'Truck', + 'Measuring cup', 'Coffeemaker', 'Violin', 'Vehicle', 'Handbag', + 'Paper cutter', 'Wine', 'Weapon', 'Wheel', 'Worm', 'Wok', 'Whale', + 'Zebra', 'Auto part', 'Jug', 'Pizza cutter', 'Cream', 'Monkey', 'Lion', + 'Bread', 'Platter', 'Chicken', 'Eagle', 'Helicopter', 'Owl', 'Duck', + 'Turtle', 'Hippopotamus', 'Crocodile', 'Toilet', 'Toilet paper', + 'Squid', 'Clothing', 'Footwear', 'Lemon', 'Spider', 'Deer', 'Frog', + 'Banana', 'Rocket', 'Wine glass', 'Countertop', 'Tablet computer', + 'Waste container', 'Swimming pool', 'Dog', 'Book', 'Elephant', 'Shark', + 'Candle', 'Leopard', 'Axe', 'Hand dryer', 'Soap dispenser', + 'Porcupine', 'Flower', 'Canary', 'Cheetah', 'Palm tree', 'Hamburger', + 'Maple', 'Building', 'Fish', 'Lobster', 'Garden Asparagus', + 'Furniture', 'Hedgehog', 'Airplane', 'Spoon', 'Otter', 'Bull', + 'Oyster', 'Horizontal bar', 'Convenience store', 'Bomb', 'Bench', + 'Ice cream', 'Caterpillar', 'Butterfly', 'Parachute', 'Orange', + 'Antelope', 'Beaker', 'Moths and butterflies', 'Window', 'Closet', + 'Castle', 'Jellyfish', 'Goose', 'Mule', 'Swan', 'Peach', 'Coconut', + 'Seat belt', 'Raccoon', 'Chisel', 'Fork', 'Lamp', 'Camera', + 'Squash (Plant)', 'Racket', 'Human face', 'Human arm', 'Vegetable', + 'Diaper', 'Unicycle', 'Falcon', 'Chime', 'Snail', 'Shellfish', + 'Cabbage', 'Carrot', 'Mango', 'Jeans', 'Flowerpot', 'Pineapple', + 'Drawer', 'Stool', 'Envelope', 'Cake', 'Dragonfly', 'Common sunflower', + 'Microwave oven', 'Honeycomb', 'Marine mammal', 'Sea lion', 'Ladybug', + 'Shelf', 'Watch', 'Candy', 'Salad', 'Parrot', 'Handgun', 'Sparrow', + 'Van', 'Grinder', 'Spice rack', 'Light bulb', 'Corded phone', + 'Sports uniform', 'Tennis racket', 'Wall clock', 'Serving tray', + 'Kitchen & dining room table', 'Dog bed', 'Cake stand', + 'Cat furniture', 'Bathroom accessory', 'Facial tissue holder', + 'Pressure cooker', 'Kitchen appliance', 'Tire', 'Ruler', + 'Luggage and bags', 'Microphone', 'Broccoli', 'Umbrella', 'Pastry', + 'Grapefruit', 'Band-aid', 'Animal', 'Bell pepper', 'Turkey', 'Lily', + 'Pomegranate', 'Doughnut', 'Glasses', 'Human nose', 'Pen', 'Ant', + 'Car', 'Aircraft', 'Human hand', 'Skunk', 'Teddy bear', 'Watermelon', + 'Cantaloupe', 'Dishwasher', 'Flute', 'Balance beam', 'Sandwich', + 'Shrimp', 'Sewing machine', 'Binoculars', 'Rays and skates', 'Ipod', + 'Accordion', 'Willow', 'Crab', 'Crown', 'Seahorse', 'Perfume', + 'Alpaca', 'Taxi', 'Canoe', 'Remote control', 'Wheelchair', + 'Rugby ball', 'Armadillo', 'Maracas', 'Helmet' + ] + + +def objects365v1_classes(): + return [ + 'person', 'sneakers', 'chair', 'hat', 'lamp', 'bottle', + 'cabinet/shelf', 'cup', 'car', 'glasses', 'picture/frame', 'desk', + 'handbag', 'street lights', 'book', 'plate', 'helmet', 'leather shoes', + 'pillow', 'glove', 'potted plant', 'bracelet', 'flower', 'tv', + 'storage box', 'vase', 'bench', 'wine glass', 'boots', 'bowl', + 'dining table', 'umbrella', 'boat', 'flag', 'speaker', 'trash bin/can', + 'stool', 'backpack', 'couch', 'belt', 'carpet', 'basket', + 'towel/napkin', 'slippers', 'barrel/bucket', 'coffee table', 'suv', + 'toy', 'tie', 'bed', 'traffic light', 'pen/pencil', 'microphone', + 'sandals', 'canned', 'necklace', 'mirror', 'faucet', 'bicycle', + 'bread', 'high heels', 'ring', 'van', 'watch', 'sink', 'horse', 'fish', + 'apple', 'camera', 'candle', 'teddy bear', 'cake', 'motorcycle', + 'wild bird', 'laptop', 'knife', 'traffic sign', 'cell phone', 'paddle', + 'truck', 'cow', 'power outlet', 'clock', 'drum', 'fork', 'bus', + 'hanger', 'nightstand', 'pot/pan', 'sheep', 'guitar', 'traffic cone', + 'tea pot', 'keyboard', 'tripod', 'hockey', 'fan', 'dog', 'spoon', + 'blackboard/whiteboard', 'balloon', 'air conditioner', 'cymbal', + 'mouse', 'telephone', 'pickup truck', 'orange', 'banana', 'airplane', + 'luggage', 'skis', 'soccer', 'trolley', 'oven', 'remote', + 'baseball glove', 'paper towel', 'refrigerator', 'train', 'tomato', + 'machinery vehicle', 'tent', 'shampoo/shower gel', 'head phone', + 'lantern', 'donut', 'cleaning products', 'sailboat', 'tangerine', + 'pizza', 'kite', 'computer box', 'elephant', 'toiletries', 'gas stove', + 'broccoli', 'toilet', 'stroller', 'shovel', 'baseball bat', + 'microwave', 'skateboard', 'surfboard', 'surveillance camera', 'gun', + 'life saver', 'cat', 'lemon', 'liquid soap', 'zebra', 'duck', + 'sports car', 'giraffe', 'pumpkin', 'piano', 'stop sign', 'radiator', + 'converter', 'tissue ', 'carrot', 'washing machine', 'vent', 'cookies', + 'cutting/chopping board', 'tennis racket', 'candy', + 'skating and skiing shoes', 'scissors', 'folder', 'baseball', + 'strawberry', 'bow tie', 'pigeon', 'pepper', 'coffee machine', + 'bathtub', 'snowboard', 'suitcase', 'grapes', 'ladder', 'pear', + 'american football', 'basketball', 'potato', 'paint brush', 'printer', + 'billiards', 'fire hydrant', 'goose', 'projector', 'sausage', + 'fire extinguisher', 'extension cord', 'facial mask', 'tennis ball', + 'chopsticks', 'electronic stove and gas stove', 'pie', 'frisbee', + 'kettle', 'hamburger', 'golf club', 'cucumber', 'clutch', 'blender', + 'tong', 'slide', 'hot dog', 'toothbrush', 'facial cleanser', 'mango', + 'deer', 'egg', 'violin', 'marker', 'ship', 'chicken', 'onion', + 'ice cream', 'tape', 'wheelchair', 'plum', 'bar soap', 'scale', + 'watermelon', 'cabbage', 'router/modem', 'golf ball', 'pine apple', + 'crane', 'fire truck', 'peach', 'cello', 'notepaper', 'tricycle', + 'toaster', 'helicopter', 'green beans', 'brush', 'carriage', 'cigar', + 'earphone', 'penguin', 'hurdle', 'swing', 'radio', 'CD', + 'parking meter', 'swan', 'garlic', 'french fries', 'horn', 'avocado', + 'saxophone', 'trumpet', 'sandwich', 'cue', 'kiwi fruit', 'bear', + 'fishing rod', 'cherry', 'tablet', 'green vegetables', 'nuts', 'corn', + 'key', 'screwdriver', 'globe', 'broom', 'pliers', 'volleyball', + 'hammer', 'eggplant', 'trophy', 'dates', 'board eraser', 'rice', + 'tape measure/ruler', 'dumbbell', 'hamimelon', 'stapler', 'camel', + 'lettuce', 'goldfish', 'meat balls', 'medal', 'toothpaste', 'antelope', + 'shrimp', 'rickshaw', 'trombone', 'pomegranate', 'coconut', + 'jellyfish', 'mushroom', 'calculator', 'treadmill', 'butterfly', + 'egg tart', 'cheese', 'pig', 'pomelo', 'race car', 'rice cooker', + 'tuba', 'crosswalk sign', 'papaya', 'hair drier', 'green onion', + 'chips', 'dolphin', 'sushi', 'urinal', 'donkey', 'electric drill', + 'spring rolls', 'tortoise/turtle', 'parrot', 'flute', 'measuring cup', + 'shark', 'steak', 'poker card', 'binoculars', 'llama', 'radish', + 'noodles', 'yak', 'mop', 'crab', 'microscope', 'barbell', 'bread/bun', + 'baozi', 'lion', 'red cabbage', 'polar bear', 'lighter', 'seal', + 'mangosteen', 'comb', 'eraser', 'pitaya', 'scallop', 'pencil case', + 'saw', 'table tennis paddle', 'okra', 'starfish', 'eagle', 'monkey', + 'durian', 'game board', 'rabbit', 'french horn', 'ambulance', + 'asparagus', 'hoverboard', 'pasta', 'target', 'hotair balloon', + 'chainsaw', 'lobster', 'iron', 'flashlight' + ] + + +def objects365v2_classes(): + return [ + 'Person', 'Sneakers', 'Chair', 'Other Shoes', 'Hat', 'Car', 'Lamp', + 'Glasses', 'Bottle', 'Desk', 'Cup', 'Street Lights', 'Cabinet/shelf', + 'Handbag/Satchel', 'Bracelet', 'Plate', 'Picture/Frame', 'Helmet', + 'Book', 'Gloves', 'Storage box', 'Boat', 'Leather Shoes', 'Flower', + 'Bench', 'Potted Plant', 'Bowl/Basin', 'Flag', 'Pillow', 'Boots', + 'Vase', 'Microphone', 'Necklace', 'Ring', 'SUV', 'Wine Glass', 'Belt', + 'Moniter/TV', 'Backpack', 'Umbrella', 'Traffic Light', 'Speaker', + 'Watch', 'Tie', 'Trash bin Can', 'Slippers', 'Bicycle', 'Stool', + 'Barrel/bucket', 'Van', 'Couch', 'Sandals', 'Bakset', 'Drum', + 'Pen/Pencil', 'Bus', 'Wild Bird', 'High Heels', 'Motorcycle', 'Guitar', + 'Carpet', 'Cell Phone', 'Bread', 'Camera', 'Canned', 'Truck', + 'Traffic cone', 'Cymbal', 'Lifesaver', 'Towel', 'Stuffed Toy', + 'Candle', 'Sailboat', 'Laptop', 'Awning', 'Bed', 'Faucet', 'Tent', + 'Horse', 'Mirror', 'Power outlet', 'Sink', 'Apple', 'Air Conditioner', + 'Knife', 'Hockey Stick', 'Paddle', 'Pickup Truck', 'Fork', + 'Traffic Sign', 'Ballon', 'Tripod', 'Dog', 'Spoon', 'Clock', 'Pot', + 'Cow', 'Cake', 'Dinning Table', 'Sheep', 'Hanger', + 'Blackboard/Whiteboard', 'Napkin', 'Other Fish', 'Orange/Tangerine', + 'Toiletry', 'Keyboard', 'Tomato', 'Lantern', 'Machinery Vehicle', + 'Fan', 'Green Vegetables', 'Banana', 'Baseball Glove', 'Airplane', + 'Mouse', 'Train', 'Pumpkin', 'Soccer', 'Skiboard', 'Luggage', + 'Nightstand', 'Tea pot', 'Telephone', 'Trolley', 'Head Phone', + 'Sports Car', 'Stop Sign', 'Dessert', 'Scooter', 'Stroller', 'Crane', + 'Remote', 'Refrigerator', 'Oven', 'Lemon', 'Duck', 'Baseball Bat', + 'Surveillance Camera', 'Cat', 'Jug', 'Broccoli', 'Piano', 'Pizza', + 'Elephant', 'Skateboard', 'Surfboard', 'Gun', + 'Skating and Skiing shoes', 'Gas stove', 'Donut', 'Bow Tie', 'Carrot', + 'Toilet', 'Kite', 'Strawberry', 'Other Balls', 'Shovel', 'Pepper', + 'Computer Box', 'Toilet Paper', 'Cleaning Products', 'Chopsticks', + 'Microwave', 'Pigeon', 'Baseball', 'Cutting/chopping Board', + 'Coffee Table', 'Side Table', 'Scissors', 'Marker', 'Pie', 'Ladder', + 'Snowboard', 'Cookies', 'Radiator', 'Fire Hydrant', 'Basketball', + 'Zebra', 'Grape', 'Giraffe', 'Potato', 'Sausage', 'Tricycle', 'Violin', + 'Egg', 'Fire Extinguisher', 'Candy', 'Fire Truck', 'Billards', + 'Converter', 'Bathtub', 'Wheelchair', 'Golf Club', 'Briefcase', + 'Cucumber', 'Cigar/Cigarette ', 'Paint Brush', 'Pear', 'Heavy Truck', + 'Hamburger', 'Extractor', 'Extention Cord', 'Tong', 'Tennis Racket', + 'Folder', 'American Football', 'earphone', 'Mask', 'Kettle', 'Tennis', + 'Ship', 'Swing', 'Coffee Machine', 'Slide', 'Carriage', 'Onion', + 'Green beans', 'Projector', 'Frisbee', + 'Washing Machine/Drying Machine', 'Chicken', 'Printer', 'Watermelon', + 'Saxophone', 'Tissue', 'Toothbrush', 'Ice cream', 'Hotair ballon', + 'Cello', 'French Fries', 'Scale', 'Trophy', 'Cabbage', 'Hot dog', + 'Blender', 'Peach', 'Rice', 'Wallet/Purse', 'Volleyball', 'Deer', + 'Goose', 'Tape', 'Tablet', 'Cosmetics', 'Trumpet', 'Pineapple', + 'Golf Ball', 'Ambulance', 'Parking meter', 'Mango', 'Key', 'Hurdle', + 'Fishing Rod', 'Medal', 'Flute', 'Brush', 'Penguin', 'Megaphone', + 'Corn', 'Lettuce', 'Garlic', 'Swan', 'Helicopter', 'Green Onion', + 'Sandwich', 'Nuts', 'Speed Limit Sign', 'Induction Cooker', 'Broom', + 'Trombone', 'Plum', 'Rickshaw', 'Goldfish', 'Kiwi fruit', + 'Router/modem', 'Poker Card', 'Toaster', 'Shrimp', 'Sushi', 'Cheese', + 'Notepaper', 'Cherry', 'Pliers', 'CD', 'Pasta', 'Hammer', 'Cue', + 'Avocado', 'Hamimelon', 'Flask', 'Mushroon', 'Screwdriver', 'Soap', + 'Recorder', 'Bear', 'Eggplant', 'Board Eraser', 'Coconut', + 'Tape Measur/ Ruler', 'Pig', 'Showerhead', 'Globe', 'Chips', 'Steak', + 'Crosswalk Sign', 'Stapler', 'Campel', 'Formula 1 ', 'Pomegranate', + 'Dishwasher', 'Crab', 'Hoverboard', 'Meat ball', 'Rice Cooker', 'Tuba', + 'Calculator', 'Papaya', 'Antelope', 'Parrot', 'Seal', 'Buttefly', + 'Dumbbell', 'Donkey', 'Lion', 'Urinal', 'Dolphin', 'Electric Drill', + 'Hair Dryer', 'Egg tart', 'Jellyfish', 'Treadmill', 'Lighter', + 'Grapefruit', 'Game board', 'Mop', 'Radish', 'Baozi', 'Target', + 'French', 'Spring Rolls', 'Monkey', 'Rabbit', 'Pencil Case', 'Yak', + 'Red Cabbage', 'Binoculars', 'Asparagus', 'Barbell', 'Scallop', + 'Noddles', 'Comb', 'Dumpling', 'Oyster', 'Table Teniis paddle', + 'Cosmetics Brush/Eyeliner Pencil', 'Chainsaw', 'Eraser', 'Lobster', + 'Durian', 'Okra', 'Lipstick', 'Cosmetics Mirror', 'Curling', + 'Table Tennis ' + ] + + +dataset_aliases = { + 'voc': ['voc', 'pascal_voc', 'voc07', 'voc12'], + 'imagenet_det': ['det', 'imagenet_det', 'ilsvrc_det'], + 'imagenet_vid': ['vid', 'imagenet_vid', 'ilsvrc_vid'], + 'coco': ['coco', 'mscoco', 'ms_coco'], + 'wider_face': ['WIDERFaceDataset', 'wider_face', 'WIDERFace'], + 'cityscapes': ['cityscapes'], + 'oid_challenge': ['oid_challenge', 'openimages_challenge'], + 'oid_v6': ['oid_v6', 'openimages_v6'], + 'objects365v1': ['objects365v1', 'obj365v1'], + 'objects365v2': ['objects365v2', 'obj365v2'] +} + + +def get_classes(dataset): + """Get class names of a dataset.""" + alias2name = {} + for name, aliases in dataset_aliases.items(): + for alias in aliases: + alias2name[alias] = name + + if mmcv.is_str(dataset): + if dataset in alias2name: + labels = eval(alias2name[dataset] + '_classes()') + else: + raise ValueError(f'Unrecognized dataset: {dataset}') + else: + raise TypeError(f'dataset must a str, but got {type(dataset)}') + return labels diff --git a/mmdet/core/evaluation/eval_hooks.py b/mmdet/core/evaluation/eval_hooks.py new file mode 100644 index 0000000..2d56df4 --- /dev/null +++ b/mmdet/core/evaluation/eval_hooks.py @@ -0,0 +1,189 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import bisect +import os.path as osp + +import mmcv +import torch.distributed as dist +from mmcv.runner import DistEvalHook as BaseDistEvalHook +from mmcv.runner import EvalHook as BaseEvalHook +from torch.nn.modules.batchnorm import _BatchNorm + + +def _calc_dynamic_intervals(start_interval, dynamic_interval_list): + assert mmcv.is_list_of(dynamic_interval_list, tuple) + + dynamic_milestones = [0] + dynamic_milestones.extend( + [dynamic_interval[0] for dynamic_interval in dynamic_interval_list]) + dynamic_intervals = [start_interval] + dynamic_intervals.extend( + [dynamic_interval[1] for dynamic_interval in dynamic_interval_list]) + return dynamic_milestones, dynamic_intervals + + +class EvalHook(BaseEvalHook): + + def __init__(self, *args, dynamic_intervals=None, **kwargs): + super(EvalHook, self).__init__(*args, **kwargs) + self.latest_results = None + + self.use_dynamic_intervals = dynamic_intervals is not None + if self.use_dynamic_intervals: + self.dynamic_milestones, self.dynamic_intervals = \ + _calc_dynamic_intervals(self.interval, dynamic_intervals) + + def _decide_interval(self, runner): + if self.use_dynamic_intervals: + progress = runner.epoch if self.by_epoch else runner.iter + step = bisect.bisect(self.dynamic_milestones, (progress + 1)) + # Dynamically modify the evaluation interval + self.interval = self.dynamic_intervals[step - 1] + + def before_train_epoch(self, runner): + """Evaluate the model only at the start of training by epoch.""" + self._decide_interval(runner) + super().before_train_epoch(runner) + + def before_train_iter(self, runner): + self._decide_interval(runner) + super().before_train_iter(runner) + + def _do_evaluate(self, runner): + """perform evaluation and save ckpt.""" + if not self._should_evaluate(runner): + return + + from mmdet.apis import single_gpu_test + + # Changed results to self.results so that MMDetWandbHook can access + # the evaluation results and log them to wandb. + results = single_gpu_test(runner.model, self.dataloader, show=False) + self.latest_results = results + runner.log_buffer.output['eval_iter_num'] = len(self.dataloader) + key_score = self.evaluate(runner, results) + # the key_score may be `None` so it needs to skip the action to save + # the best checkpoint + if self.save_best and key_score: + self._save_ckpt(runner, key_score) + + +# Note: Considering that MMCV's EvalHook updated its interface in V1.3.16, +# in order to avoid strong version dependency, we did not directly +# inherit EvalHook but BaseDistEvalHook. +class DistEvalHook(BaseDistEvalHook): + + def __init__(self, *args, dynamic_intervals=None, **kwargs): + super(DistEvalHook, self).__init__(*args, **kwargs) + self.latest_results = None + + self.use_dynamic_intervals = dynamic_intervals is not None + if self.use_dynamic_intervals: + self.dynamic_milestones, self.dynamic_intervals = \ + _calc_dynamic_intervals(self.interval, dynamic_intervals) + + def _decide_interval(self, runner): + if self.use_dynamic_intervals: + progress = runner.epoch if self.by_epoch else runner.iter + step = bisect.bisect(self.dynamic_milestones, (progress + 1)) + # Dynamically modify the evaluation interval + self.interval = self.dynamic_intervals[step - 1] + + def before_train_epoch(self, runner): + """Evaluate the model only at the start of training by epoch.""" + self._decide_interval(runner) + super().before_train_epoch(runner) + + def before_train_iter(self, runner): + self._decide_interval(runner) + super().before_train_iter(runner) + + def _do_evaluate(self, runner): + """perform evaluation and save ckpt.""" + # Synchronization of BatchNorm's buffer (running_mean + # and running_var) is not supported in the DDP of pytorch, + # which may cause the inconsistent performance of models in + # different ranks, so we broadcast BatchNorm's buffers + # of rank 0 to other ranks to avoid this. + if self.broadcast_bn_buffer: + model = runner.model + for name, module in model.named_modules(): + if isinstance(module, + _BatchNorm) and module.track_running_stats: + dist.broadcast(module.running_var, 0) + dist.broadcast(module.running_mean, 0) + + if not self._should_evaluate(runner): + return + + tmpdir = self.tmpdir + if tmpdir is None: + tmpdir = osp.join(runner.work_dir, '.eval_hook') + + from mmdet.apis import multi_gpu_test + + # Changed results to self.results so that MMDetWandbHook can access + # the evaluation results and log them to wandb. + results = multi_gpu_test( + runner.model, + self.dataloader, + tmpdir=tmpdir, + gpu_collect=self.gpu_collect) + self.latest_results = results + if runner.rank == 0: + print('\n') + runner.log_buffer.output['eval_iter_num'] = len(self.dataloader) + key_score = self.evaluate(runner, results) + + # the key_score may be `None` so it needs to skip + # the action to save the best checkpoint + if self.save_best and key_score: + big_flag = self._save_ckpt(runner, key_score) + if big_flag: + result_path = self.best_ckpt_path[:-4] + '.pkl' # 上一步已经更新了best_ckpt_path了 + print(f'\nwriting results to {result_path}') + mmcv.dump(results, result_path) + + def _save_ckpt(self, runner, key_score): + """Save the best checkpoint. + + It will compare the score according to the compare function, write + related information (best score, best checkpoint path) and save the + best checkpoint into ``work_dir``. + """ + if self.by_epoch: + current = f'epoch_{runner.epoch + 1}' + cur_type, cur_time = 'epoch', runner.epoch + 1 + else: + current = f'iter_{runner.iter + 1}' + cur_type, cur_time = 'iter', runner.iter + 1 + + best_score = runner.meta['hook_msgs'].get( + 'best_score', self.init_value_map[self.rule]) + if self.compare_func(key_score, best_score): + best_score = key_score + runner.meta['hook_msgs']['best_score'] = best_score + + if self.best_ckpt_path and self.file_client.isfile( + self.best_ckpt_path): + self.file_client.remove(self.best_ckpt_path) + runner.logger.info( + f'The previous best checkpoint {self.best_ckpt_path} was ' + 'removed') + + best_ckpt_name = f'best_{self.key_indicator}_{current}.pth' + self.best_ckpt_path = self.file_client.join_path( + self.out_dir, best_ckpt_name) + runner.meta['hook_msgs']['best_ckpt'] = self.best_ckpt_path + + runner.save_checkpoint( + self.out_dir, + filename_tmpl=best_ckpt_name, + create_symlink=False) + runner.logger.info( + f'Now best checkpoint is saved as {best_ckpt_name}.') + runner.logger.info( + f'Best {self.key_indicator} is {best_score:0.4f} ' + f'at {cur_time} {cur_type}.') + return True + return False + diff --git a/mmdet/core/evaluation/mean_ap.py b/mmdet/core/evaluation/mean_ap.py new file mode 100644 index 0000000..9568912 --- /dev/null +++ b/mmdet/core/evaluation/mean_ap.py @@ -0,0 +1,782 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from multiprocessing import Pool + +import mmcv +import numpy as np +from mmcv.utils import print_log +from terminaltables import AsciiTable + +from .bbox_overlaps import bbox_overlaps +from .class_names import get_classes + + +def average_precision(recalls, precisions, mode='area'): + """Calculate average precision (for single or multiple scales). + + Args: + recalls (ndarray): shape (num_scales, num_dets) or (num_dets, ) + precisions (ndarray): shape (num_scales, num_dets) or (num_dets, ) + mode (str): 'area' or '11points', 'area' means calculating the area + under precision-recall curve, '11points' means calculating + the average precision of recalls at [0, 0.1, ..., 1] + + Returns: + float or ndarray: calculated average precision + """ + no_scale = False + if recalls.ndim == 1: + no_scale = True + recalls = recalls[np.newaxis, :] + precisions = precisions[np.newaxis, :] + assert recalls.shape == precisions.shape and recalls.ndim == 2 + num_scales = recalls.shape[0] + ap = np.zeros(num_scales, dtype=np.float32) + if mode == 'area': + zeros = np.zeros((num_scales, 1), dtype=recalls.dtype) + ones = np.ones((num_scales, 1), dtype=recalls.dtype) + mrec = np.hstack((zeros, recalls, ones)) + mpre = np.hstack((zeros, precisions, zeros)) + for i in range(mpre.shape[1] - 1, 0, -1): + mpre[:, i - 1] = np.maximum(mpre[:, i - 1], mpre[:, i]) + for i in range(num_scales): + ind = np.where(mrec[i, 1:] != mrec[i, :-1])[0] + ap[i] = np.sum( + (mrec[i, ind + 1] - mrec[i, ind]) * mpre[i, ind + 1]) + elif mode == '11points': + for i in range(num_scales): + for thr in np.arange(0, 1 + 1e-3, 0.1): + precs = precisions[i, recalls[i, :] >= thr] + prec = precs.max() if precs.size > 0 else 0 + ap[i] += prec + ap /= 11 + else: + raise ValueError( + 'Unrecognized mode, only "area" and "11points" are supported') + if no_scale: + ap = ap[0] + return ap + + +def tpfp_imagenet(det_bboxes, + gt_bboxes, + gt_bboxes_ignore=None, + default_iou_thr=0.5, + area_ranges=None, + use_legacy_coordinate=False, + **kwargs): + """Check if detected bboxes are true positive or false positive. + + Args: + det_bbox (ndarray): Detected bboxes of this image, of shape (m, 5). + gt_bboxes (ndarray): GT bboxes of this image, of shape (n, 4). + gt_bboxes_ignore (ndarray): Ignored gt bboxes of this image, + of shape (k, 4). Default: None + default_iou_thr (float): IoU threshold to be considered as matched for + medium and large bboxes (small ones have special rules). + Default: 0.5. + area_ranges (list[tuple] | None): Range of bbox areas to be evaluated, + in the format [(min1, max1), (min2, max2), ...]. Default: None. + use_legacy_coordinate (bool): Whether to use coordinate system in + mmdet v1.x. which means width, height should be + calculated as 'x2 - x1 + 1` and 'y2 - y1 + 1' respectively. + Default: False. + + Returns: + tuple[np.ndarray]: (tp, fp) whose elements are 0 and 1. The shape of + each array is (num_scales, m). + """ + + if not use_legacy_coordinate: + extra_length = 0. + else: + extra_length = 1. + + # an indicator of ignored gts + gt_ignore_inds = np.concatenate( + (np.zeros(gt_bboxes.shape[0], + dtype=bool), np.ones(gt_bboxes_ignore.shape[0], dtype=bool))) + # stack gt_bboxes and gt_bboxes_ignore for convenience + gt_bboxes = np.vstack((gt_bboxes, gt_bboxes_ignore)) + + num_dets = det_bboxes.shape[0] + num_gts = gt_bboxes.shape[0] + if area_ranges is None: + area_ranges = [(None, None)] + num_scales = len(area_ranges) + # tp and fp are of shape (num_scales, num_gts), each row is tp or fp + # of a certain scale. + tp = np.zeros((num_scales, num_dets), dtype=np.float32) + fp = np.zeros((num_scales, num_dets), dtype=np.float32) + if gt_bboxes.shape[0] == 0: + if area_ranges == [(None, None)]: + fp[...] = 1 + else: + det_areas = ( + det_bboxes[:, 2] - det_bboxes[:, 0] + extra_length) * ( + det_bboxes[:, 3] - det_bboxes[:, 1] + extra_length) + for i, (min_area, max_area) in enumerate(area_ranges): + fp[i, (det_areas >= min_area) & (det_areas < max_area)] = 1 + return tp, fp + ious = bbox_overlaps( + det_bboxes, gt_bboxes - 1, use_legacy_coordinate=use_legacy_coordinate) + gt_w = gt_bboxes[:, 2] - gt_bboxes[:, 0] + extra_length + gt_h = gt_bboxes[:, 3] - gt_bboxes[:, 1] + extra_length + iou_thrs = np.minimum((gt_w * gt_h) / ((gt_w + 10.0) * (gt_h + 10.0)), + default_iou_thr) + # sort all detections by scores in descending order + sort_inds = np.argsort(-det_bboxes[:, -1]) + for k, (min_area, max_area) in enumerate(area_ranges): + gt_covered = np.zeros(num_gts, dtype=bool) + # if no area range is specified, gt_area_ignore is all False + if min_area is None: + gt_area_ignore = np.zeros_like(gt_ignore_inds, dtype=bool) + else: + gt_areas = gt_w * gt_h + gt_area_ignore = (gt_areas < min_area) | (gt_areas >= max_area) + for i in sort_inds: + max_iou = -1 + matched_gt = -1 + # find best overlapped available gt + for j in range(num_gts): + # different from PASCAL VOC: allow finding other gts if the + # best overlapped ones are already matched by other det bboxes + if gt_covered[j]: + continue + elif ious[i, j] >= iou_thrs[j] and ious[i, j] > max_iou: + max_iou = ious[i, j] + matched_gt = j + # there are 4 cases for a det bbox: + # 1. it matches a gt, tp = 1, fp = 0 + # 2. it matches an ignored gt, tp = 0, fp = 0 + # 3. it matches no gt and within area range, tp = 0, fp = 1 + # 4. it matches no gt but is beyond area range, tp = 0, fp = 0 + if matched_gt >= 0: + gt_covered[matched_gt] = 1 + if not (gt_ignore_inds[matched_gt] + or gt_area_ignore[matched_gt]): + tp[k, i] = 1 + elif min_area is None: + fp[k, i] = 1 + else: + bbox = det_bboxes[i, :4] + area = (bbox[2] - bbox[0] + extra_length) * ( + bbox[3] - bbox[1] + extra_length) + if area >= min_area and area < max_area: + fp[k, i] = 1 + return tp, fp + + +def tpfp_default(det_bboxes, + gt_bboxes, + gt_bboxes_ignore=None, + iou_thr=0.5, + area_ranges=None, + use_legacy_coordinate=False, + **kwargs): + """Check if detected bboxes are true positive or false positive. + + Args: + det_bbox (ndarray): Detected bboxes of this image, of shape (m, 5). + gt_bboxes (ndarray): GT bboxes of this image, of shape (n, 4). + gt_bboxes_ignore (ndarray): Ignored gt bboxes of this image, + of shape (k, 4). Default: None + iou_thr (float): IoU threshold to be considered as matched. + Default: 0.5. + area_ranges (list[tuple] | None): Range of bbox areas to be + evaluated, in the format [(min1, max1), (min2, max2), ...]. + Default: None. + use_legacy_coordinate (bool): Whether to use coordinate system in + mmdet v1.x. which means width, height should be + calculated as 'x2 - x1 + 1` and 'y2 - y1 + 1' respectively. + Default: False. + + Returns: + tuple[np.ndarray]: (tp, fp) whose elements are 0 and 1. The shape of + each array is (num_scales, m). + """ + + if not use_legacy_coordinate: + extra_length = 0. + else: + extra_length = 1. + + # an indicator of ignored gts + gt_ignore_inds = np.concatenate( + (np.zeros(gt_bboxes.shape[0], + dtype=bool), np.ones(gt_bboxes_ignore.shape[0], dtype=bool))) + # stack gt_bboxes and gt_bboxes_ignore for convenience + gt_bboxes = np.vstack((gt_bboxes, gt_bboxes_ignore)) + + num_dets = det_bboxes.shape[0] + num_gts = gt_bboxes.shape[0] + if area_ranges is None: + area_ranges = [(None, None)] + num_scales = len(area_ranges) + # tp and fp are of shape (num_scales, num_gts), each row is tp or fp of + # a certain scale + tp = np.zeros((num_scales, num_dets), dtype=np.float32) + fp = np.zeros((num_scales, num_dets), dtype=np.float32) + + # if there is no gt bboxes in this image, then all det bboxes + # within area range are false positives + if gt_bboxes.shape[0] == 0: + if area_ranges == [(None, None)]: + fp[...] = 1 + else: + det_areas = ( + det_bboxes[:, 2] - det_bboxes[:, 0] + extra_length) * ( + det_bboxes[:, 3] - det_bboxes[:, 1] + extra_length) + for i, (min_area, max_area) in enumerate(area_ranges): + fp[i, (det_areas >= min_area) & (det_areas < max_area)] = 1 + return tp, fp + + ious = bbox_overlaps( + det_bboxes, gt_bboxes, use_legacy_coordinate=use_legacy_coordinate) + # for each det, the max iou with all gts + ious_max = ious.max(axis=1) + # for each det, which gt overlaps most with it + ious_argmax = ious.argmax(axis=1) + # sort all dets in descending order by scores + sort_inds = np.argsort(-det_bboxes[:, -1]) + for k, (min_area, max_area) in enumerate(area_ranges): + gt_covered = np.zeros(num_gts, dtype=bool) + # if no area range is specified, gt_area_ignore is all False + if min_area is None: + gt_area_ignore = np.zeros_like(gt_ignore_inds, dtype=bool) + else: + gt_areas = (gt_bboxes[:, 2] - gt_bboxes[:, 0] + extra_length) * ( + gt_bboxes[:, 3] - gt_bboxes[:, 1] + extra_length) + gt_area_ignore = (gt_areas < min_area) | (gt_areas >= max_area) + for i in sort_inds: + if ious_max[i] >= iou_thr: + matched_gt = ious_argmax[i] + if not (gt_ignore_inds[matched_gt] + or gt_area_ignore[matched_gt]): + if not gt_covered[matched_gt]: + gt_covered[matched_gt] = True + tp[k, i] = 1 + else: + fp[k, i] = 1 + # otherwise ignore this detected bbox, tp = 0, fp = 0 + elif min_area is None: + fp[k, i] = 1 + else: + bbox = det_bboxes[i, :4] + area = (bbox[2] - bbox[0] + extra_length) * ( + bbox[3] - bbox[1] + extra_length) + if area >= min_area and area < max_area: + fp[k, i] = 1 + return tp, fp + + +def tpfp_openimages(det_bboxes, + gt_bboxes, + gt_bboxes_ignore=None, + iou_thr=0.5, + area_ranges=None, + use_legacy_coordinate=False, + gt_bboxes_group_of=None, + use_group_of=True, + ioa_thr=0.5, + **kwargs): + """Check if detected bboxes are true positive or false positive. + + Args: + det_bbox (ndarray): Detected bboxes of this image, of shape (m, 5). + gt_bboxes (ndarray): GT bboxes of this image, of shape (n, 4). + gt_bboxes_ignore (ndarray): Ignored gt bboxes of this image, + of shape (k, 4). Default: None + iou_thr (float): IoU threshold to be considered as matched. + Default: 0.5. + area_ranges (list[tuple] | None): Range of bbox areas to be + evaluated, in the format [(min1, max1), (min2, max2), ...]. + Default: None. + use_legacy_coordinate (bool): Whether to use coordinate system in + mmdet v1.x. which means width, height should be + calculated as 'x2 - x1 + 1` and 'y2 - y1 + 1' respectively. + Default: False. + gt_bboxes_group_of (ndarray): GT group_of of this image, of shape + (k, 1). Default: None + use_group_of (bool): Whether to use group of when calculate TP and FP, + which only used in OpenImages evaluation. Default: True. + ioa_thr (float | None): IoA threshold to be considered as matched, + which only used in OpenImages evaluation. Default: 0.5. + + Returns: + tuple[np.ndarray]: Returns a tuple (tp, fp, det_bboxes), where + (tp, fp) whose elements are 0 and 1. The shape of each array is + (num_scales, m). (det_bboxes) whose will filter those are not + matched by group of gts when processing Open Images evaluation. + The shape is (num_scales, m). + """ + + if not use_legacy_coordinate: + extra_length = 0. + else: + extra_length = 1. + + # an indicator of ignored gts + gt_ignore_inds = np.concatenate( + (np.zeros(gt_bboxes.shape[0], + dtype=bool), np.ones(gt_bboxes_ignore.shape[0], dtype=bool))) + # stack gt_bboxes and gt_bboxes_ignore for convenience + gt_bboxes = np.vstack((gt_bboxes, gt_bboxes_ignore)) + + num_dets = det_bboxes.shape[0] + num_gts = gt_bboxes.shape[0] + if area_ranges is None: + area_ranges = [(None, None)] + num_scales = len(area_ranges) + # tp and fp are of shape (num_scales, num_gts), each row is tp or fp of + # a certain scale + tp = np.zeros((num_scales, num_dets), dtype=np.float32) + fp = np.zeros((num_scales, num_dets), dtype=np.float32) + + # if there is no gt bboxes in this image, then all det bboxes + # within area range are false positives + if gt_bboxes.shape[0] == 0: + if area_ranges == [(None, None)]: + fp[...] = 1 + else: + det_areas = ( + det_bboxes[:, 2] - det_bboxes[:, 0] + extra_length) * ( + det_bboxes[:, 3] - det_bboxes[:, 1] + extra_length) + for i, (min_area, max_area) in enumerate(area_ranges): + fp[i, (det_areas >= min_area) & (det_areas < max_area)] = 1 + return tp, fp, det_bboxes + + if gt_bboxes_group_of is not None and use_group_of: + # if handle group-of boxes, divided gt boxes into two parts: + # non-group-of and group-of.Then calculate ious and ioas through + # non-group-of group-of gts respectively. This only used in + # OpenImages evaluation. + assert gt_bboxes_group_of.shape[0] == gt_bboxes.shape[0] + non_group_gt_bboxes = gt_bboxes[~gt_bboxes_group_of] + group_gt_bboxes = gt_bboxes[gt_bboxes_group_of] + num_gts_group = group_gt_bboxes.shape[0] + ious = bbox_overlaps(det_bboxes, non_group_gt_bboxes) + ioas = bbox_overlaps(det_bboxes, group_gt_bboxes, mode='iof') + else: + # if not consider group-of boxes, only calculate ious through gt boxes + ious = bbox_overlaps( + det_bboxes, gt_bboxes, use_legacy_coordinate=use_legacy_coordinate) + ioas = None + + if ious.shape[1] > 0: + # for each det, the max iou with all gts + ious_max = ious.max(axis=1) + # for each det, which gt overlaps most with it + ious_argmax = ious.argmax(axis=1) + # sort all dets in descending order by scores + sort_inds = np.argsort(-det_bboxes[:, -1]) + for k, (min_area, max_area) in enumerate(area_ranges): + gt_covered = np.zeros(num_gts, dtype=bool) + # if no area range is specified, gt_area_ignore is all False + if min_area is None: + gt_area_ignore = np.zeros_like(gt_ignore_inds, dtype=bool) + else: + gt_areas = ( + gt_bboxes[:, 2] - gt_bboxes[:, 0] + extra_length) * ( + gt_bboxes[:, 3] - gt_bboxes[:, 1] + extra_length) + gt_area_ignore = (gt_areas < min_area) | (gt_areas >= max_area) + for i in sort_inds: + if ious_max[i] >= iou_thr: + matched_gt = ious_argmax[i] + if not (gt_ignore_inds[matched_gt] + or gt_area_ignore[matched_gt]): + if not gt_covered[matched_gt]: + gt_covered[matched_gt] = True + tp[k, i] = 1 + else: + fp[k, i] = 1 + # otherwise ignore this detected bbox, tp = 0, fp = 0 + elif min_area is None: + fp[k, i] = 1 + else: + bbox = det_bboxes[i, :4] + area = (bbox[2] - bbox[0] + extra_length) * ( + bbox[3] - bbox[1] + extra_length) + if area >= min_area and area < max_area: + fp[k, i] = 1 + else: + # if there is no no-group-of gt bboxes in this image, + # then all det bboxes within area range are false positives. + # Only used in OpenImages evaluation. + if area_ranges == [(None, None)]: + fp[...] = 1 + else: + det_areas = ( + det_bboxes[:, 2] - det_bboxes[:, 0] + extra_length) * ( + det_bboxes[:, 3] - det_bboxes[:, 1] + extra_length) + for i, (min_area, max_area) in enumerate(area_ranges): + fp[i, (det_areas >= min_area) & (det_areas < max_area)] = 1 + + if ioas is None or ioas.shape[1] <= 0: + return tp, fp, det_bboxes + else: + # The evaluation of group-of TP and FP are done in two stages: + # 1. All detections are first matched to non group-of boxes; true + # positives are determined. + # 2. Detections that are determined as false positives are matched + # against group-of boxes and calculated group-of TP and FP. + # Only used in OpenImages evaluation. + det_bboxes_group = np.zeros( + (num_scales, ioas.shape[1], det_bboxes.shape[1]), dtype=float) + match_group_of = np.zeros((num_scales, num_dets), dtype=bool) + tp_group = np.zeros((num_scales, num_gts_group), dtype=np.float32) + ioas_max = ioas.max(axis=1) + # for each det, which gt overlaps most with it + ioas_argmax = ioas.argmax(axis=1) + # sort all dets in descending order by scores + sort_inds = np.argsort(-det_bboxes[:, -1]) + for k, (min_area, max_area) in enumerate(area_ranges): + box_is_covered = tp[k] + # if no area range is specified, gt_area_ignore is all False + if min_area is None: + gt_area_ignore = np.zeros_like(gt_ignore_inds, dtype=bool) + else: + gt_areas = (gt_bboxes[:, 2] - gt_bboxes[:, 0]) * ( + gt_bboxes[:, 3] - gt_bboxes[:, 1]) + gt_area_ignore = (gt_areas < min_area) | (gt_areas >= max_area) + for i in sort_inds: + matched_gt = ioas_argmax[i] + if not box_is_covered[i]: + if ioas_max[i] >= ioa_thr: + if not (gt_ignore_inds[matched_gt] + or gt_area_ignore[matched_gt]): + if not tp_group[k, matched_gt]: + tp_group[k, matched_gt] = 1 + match_group_of[k, i] = True + else: + match_group_of[k, i] = True + + if det_bboxes_group[k, matched_gt, -1] < \ + det_bboxes[i, -1]: + det_bboxes_group[k, matched_gt] = \ + det_bboxes[i] + + fp_group = (tp_group <= 0).astype(float) + tps = [] + fps = [] + # concatenate tp, fp, and det-boxes which not matched group of + # gt boxes and tp_group, fp_group, and det_bboxes_group which + # matched group of boxes respectively. + for i in range(num_scales): + tps.append( + np.concatenate((tp[i][~match_group_of[i]], tp_group[i]))) + fps.append( + np.concatenate((fp[i][~match_group_of[i]], fp_group[i]))) + det_bboxes = np.concatenate( + (det_bboxes[~match_group_of[i]], det_bboxes_group[i])) + + tp = np.vstack(tps) + fp = np.vstack(fps) + return tp, fp, det_bboxes + + +def get_cls_results(det_results, annotations, class_id): + """Get det results and gt information of a certain class. + + Args: + det_results (list[list]): Same as `eval_map()`. + annotations (list[dict]): Same as `eval_map()`. + class_id (int): ID of a specific class. + + Returns: + tuple[list[np.ndarray]]: detected bboxes, gt bboxes, ignored gt bboxes + """ + cls_dets = [img_res[class_id] for img_res in det_results] + cls_gts = [] + cls_gts_ignore = [] + for ann in annotations: + gt_inds = ann['labels'] == class_id + cls_gts.append(ann['bboxes'][gt_inds, :]) + + if ann.get('labels_ignore', None) is not None: + ignore_inds = ann['labels_ignore'] == class_id + cls_gts_ignore.append(ann['bboxes_ignore'][ignore_inds, :]) + else: + cls_gts_ignore.append(np.empty((0, 4), dtype=np.float32)) + + return cls_dets, cls_gts, cls_gts_ignore + + +def get_cls_group_ofs(annotations, class_id): + """Get `gt_group_of` of a certain class, which is used in Open Images. + + Args: + annotations (list[dict]): Same as `eval_map()`. + class_id (int): ID of a specific class. + + Returns: + list[np.ndarray]: `gt_group_of` of a certain class. + """ + gt_group_ofs = [] + for ann in annotations: + gt_inds = ann['labels'] == class_id + if ann.get('gt_is_group_ofs', None) is not None: + gt_group_ofs.append(ann['gt_is_group_ofs'][gt_inds]) + else: + gt_group_ofs.append(np.empty((0, 1), dtype=bool)) + + return gt_group_ofs + + +def eval_map(det_results, + annotations, + scale_ranges=None, + iou_thr=0.5, + ioa_thr=None, + dataset=None, + logger=None, + tpfp_fn=None, + nproc=4, + use_legacy_coordinate=False, + use_group_of=False): + """Evaluate mAP of a dataset. + + Args: + det_results (list[list]): [[cls1_det, cls2_det, ...], ...]. + The outer list indicates images, and the inner list indicates + per-class detected bboxes. + annotations (list[dict]): Ground truth annotations where each item of + the list indicates an image. Keys of annotations are: + + - `bboxes`: numpy array of shape (n, 4) + - `labels`: numpy array of shape (n, ) + - `bboxes_ignore` (optional): numpy array of shape (k, 4) + - `labels_ignore` (optional): numpy array of shape (k, ) + scale_ranges (list[tuple] | None): Range of scales to be evaluated, + in the format [(min1, max1), (min2, max2), ...]. A range of + (32, 64) means the area range between (32**2, 64**2). + Default: None. + iou_thr (float): IoU threshold to be considered as matched. + Default: 0.5. + ioa_thr (float | None): IoA threshold to be considered as matched, + which only used in OpenImages evaluation. Default: None. + dataset (list[str] | str | None): Dataset name or dataset classes, + there are minor differences in metrics for different datasets, e.g. + "voc07", "imagenet_det", etc. Default: None. + logger (logging.Logger | str | None): The way to print the mAP + summary. See `mmcv.utils.print_log()` for details. Default: None. + tpfp_fn (callable | None): The function used to determine true/ + false positives. If None, :func:`tpfp_default` is used as default + unless dataset is 'det' or 'vid' (:func:`tpfp_imagenet` in this + case). If it is given as a function, then this function is used + to evaluate tp & fp. Default None. + nproc (int): Processes used for computing TP and FP. + Default: 4. + use_legacy_coordinate (bool): Whether to use coordinate system in + mmdet v1.x. which means width, height should be + calculated as 'x2 - x1 + 1` and 'y2 - y1 + 1' respectively. + Default: False. + use_group_of (bool): Whether to use group of when calculate TP and FP, + which only used in OpenImages evaluation. Default: False. + + Returns: + tuple: (mAP, [dict, dict, ...]) + """ + assert len(det_results) == len(annotations) + if not use_legacy_coordinate: + extra_length = 0. + else: + extra_length = 1. + + num_imgs = len(det_results) + num_scales = len(scale_ranges) if scale_ranges is not None else 1 + num_classes = len(det_results[0]) # positive class num + area_ranges = ([(rg[0]**2, rg[1]**2) for rg in scale_ranges] + if scale_ranges is not None else None) + + # There is no need to use multi processes to process + # when num_imgs = 1 . + if num_imgs > 1: + assert nproc > 0, 'nproc must be at least one.' + nproc = min(nproc, num_imgs) + pool = Pool(nproc) + + eval_results = [] + for i in range(num_classes): + # get gt and det bboxes of this class + cls_dets, cls_gts, cls_gts_ignore = get_cls_results( + det_results, annotations, i) + # choose proper function according to datasets to compute tp and fp + if tpfp_fn is None: + if dataset in ['det', 'vid']: + tpfp_fn = tpfp_imagenet + elif dataset in ['oid_challenge', 'oid_v6'] \ + or use_group_of is True: + tpfp_fn = tpfp_openimages + else: + tpfp_fn = tpfp_default + if not callable(tpfp_fn): + raise ValueError( + f'tpfp_fn has to be a function or None, but got {tpfp_fn}') + + if num_imgs > 1: + # compute tp and fp for each image with multiple processes + args = [] + if use_group_of: + # used in Open Images Dataset evaluation + gt_group_ofs = get_cls_group_ofs(annotations, i) + args.append(gt_group_ofs) + args.append([use_group_of for _ in range(num_imgs)]) + if ioa_thr is not None: + args.append([ioa_thr for _ in range(num_imgs)]) + + tpfp = pool.starmap( + tpfp_fn, + zip(cls_dets, cls_gts, cls_gts_ignore, + [iou_thr for _ in range(num_imgs)], + [area_ranges for _ in range(num_imgs)], + [use_legacy_coordinate for _ in range(num_imgs)], *args)) + else: + tpfp = tpfp_fn( + cls_dets[0], + cls_gts[0], + cls_gts_ignore[0], + iou_thr, + area_ranges, + use_legacy_coordinate, + gt_bboxes_group_of=(get_cls_group_ofs(annotations, i)[0] + if use_group_of else None), + use_group_of=use_group_of, + ioa_thr=ioa_thr) + tpfp = [tpfp] + + if use_group_of: + tp, fp, cls_dets = tuple(zip(*tpfp)) + else: + tp, fp = tuple(zip(*tpfp)) + # calculate gt number of each scale + # ignored gts or gts beyond the specific scale are not counted + num_gts = np.zeros(num_scales, dtype=int) + for j, bbox in enumerate(cls_gts): + if area_ranges is None: + num_gts[0] += bbox.shape[0] + else: + gt_areas = (bbox[:, 2] - bbox[:, 0] + extra_length) * ( + bbox[:, 3] - bbox[:, 1] + extra_length) + for k, (min_area, max_area) in enumerate(area_ranges): + num_gts[k] += np.sum((gt_areas >= min_area) + & (gt_areas < max_area)) + # sort all det bboxes by score, also sort tp and fp + cls_dets = np.vstack(cls_dets) + num_dets = cls_dets.shape[0] + sort_inds = np.argsort(-cls_dets[:, -1]) + tp = np.hstack(tp)[:, sort_inds] + fp = np.hstack(fp)[:, sort_inds] + # calculate recall and precision with tp and fp + tp = np.cumsum(tp, axis=1) + fp = np.cumsum(fp, axis=1) + eps = np.finfo(np.float32).eps + recalls = tp / np.maximum(num_gts[:, np.newaxis], eps) + precisions = tp / np.maximum((tp + fp), eps) + # calculate AP + if scale_ranges is None: + recalls = recalls[0, :] + precisions = precisions[0, :] + num_gts = num_gts.item() + mode = 'area' if dataset != 'voc07' else '11points' + ap = average_precision(recalls, precisions, mode) + eval_results.append({ + 'num_gts': num_gts, + 'num_dets': num_dets, + 'recall': recalls, + 'precision': precisions, + 'ap': ap + }) + + if num_imgs > 1: + pool.close() + + if scale_ranges is not None: + # shape (num_classes, num_scales) + all_ap = np.vstack([cls_result['ap'] for cls_result in eval_results]) + all_num_gts = np.vstack( + [cls_result['num_gts'] for cls_result in eval_results]) + mean_ap = [] + for i in range(num_scales): + if np.any(all_num_gts[:, i] > 0): + mean_ap.append(all_ap[all_num_gts[:, i] > 0, i].mean()) + else: + mean_ap.append(0.0) + else: + aps = [] + for cls_result in eval_results: + if cls_result['num_gts'] > 0: + aps.append(cls_result['ap']) + mean_ap = np.array(aps).mean().item() if aps else 0.0 + + print_map_summary( + mean_ap, eval_results, dataset, area_ranges, logger=logger) + + return mean_ap, eval_results + + +def print_map_summary(mean_ap, + results, + dataset=None, + scale_ranges=None, + logger=None): + """Print mAP and results of each class. + + A table will be printed to show the gts/dets/recall/AP of each class and + the mAP. + + Args: + mean_ap (float): Calculated from `eval_map()`. + results (list[dict]): Calculated from `eval_map()`. + dataset (list[str] | str | None): Dataset name or dataset classes. + scale_ranges (list[tuple] | None): Range of scales to be evaluated. + logger (logging.Logger | str | None): The way to print the mAP + summary. See `mmcv.utils.print_log()` for details. Default: None. + """ + + if logger == 'silent': + return + + if isinstance(results[0]['ap'], np.ndarray): + num_scales = len(results[0]['ap']) + else: + num_scales = 1 + + if scale_ranges is not None: + assert len(scale_ranges) == num_scales + + num_classes = len(results) + + recalls = np.zeros((num_scales, num_classes), dtype=np.float32) + aps = np.zeros((num_scales, num_classes), dtype=np.float32) + num_gts = np.zeros((num_scales, num_classes), dtype=int) + for i, cls_result in enumerate(results): + if cls_result['recall'].size > 0: + recalls[:, i] = np.array(cls_result['recall'], ndmin=2)[:, -1] + aps[:, i] = cls_result['ap'] + num_gts[:, i] = cls_result['num_gts'] + + if dataset is None: + label_names = [str(i) for i in range(num_classes)] + elif mmcv.is_str(dataset): + label_names = get_classes(dataset) + else: + label_names = dataset + + if not isinstance(mean_ap, list): + mean_ap = [mean_ap] + + header = ['class', 'gts', 'dets', 'recall', 'ap'] + for i in range(num_scales): + if scale_ranges is not None: + print_log(f'Scale range {scale_ranges[i]}', logger=logger) + table_data = [header] + for j in range(num_classes): + row_data = [ + label_names[j], num_gts[i, j], results[j]['num_dets'], + f'{recalls[i, j]:.3f}', f'{aps[i, j]:.3f}' + ] + table_data.append(row_data) + table_data.append(['mAP', '', '', '', f'{mean_ap[i]:.3f}']) + table = AsciiTable(table_data) + table.inner_footing_row_border = True + print_log('\n' + table.table, logger=logger) diff --git a/mmdet/core/evaluation/panoptic_utils.py b/mmdet/core/evaluation/panoptic_utils.py new file mode 100644 index 0000000..10c9ad9 --- /dev/null +++ b/mmdet/core/evaluation/panoptic_utils.py @@ -0,0 +1,6 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# A custom value to distinguish instance ID and category ID; need to +# be greater than the number of categories. +# For a pixel in the panoptic result map: +# pan_id = ins_id * INSTANCE_OFFSET + cat_id +INSTANCE_OFFSET = 1000 diff --git a/mmdet/core/evaluation/recall.py b/mmdet/core/evaluation/recall.py new file mode 100644 index 0000000..82b3c90 --- /dev/null +++ b/mmdet/core/evaluation/recall.py @@ -0,0 +1,197 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from collections.abc import Sequence + +import numpy as np +from mmcv.utils import print_log +from terminaltables import AsciiTable + +from .bbox_overlaps import bbox_overlaps + + +def _recalls(all_ious, proposal_nums, thrs): + + img_num = all_ious.shape[0] + total_gt_num = sum([ious.shape[0] for ious in all_ious]) + + _ious = np.zeros((proposal_nums.size, total_gt_num), dtype=np.float32) + for k, proposal_num in enumerate(proposal_nums): + tmp_ious = np.zeros(0) + for i in range(img_num): + ious = all_ious[i][:, :proposal_num].copy() + gt_ious = np.zeros((ious.shape[0])) + if ious.size == 0: + tmp_ious = np.hstack((tmp_ious, gt_ious)) + continue + for j in range(ious.shape[0]): + gt_max_overlaps = ious.argmax(axis=1) + max_ious = ious[np.arange(0, ious.shape[0]), gt_max_overlaps] + gt_idx = max_ious.argmax() + gt_ious[j] = max_ious[gt_idx] + box_idx = gt_max_overlaps[gt_idx] + ious[gt_idx, :] = -1 + ious[:, box_idx] = -1 + tmp_ious = np.hstack((tmp_ious, gt_ious)) + _ious[k, :] = tmp_ious + + _ious = np.fliplr(np.sort(_ious, axis=1)) + recalls = np.zeros((proposal_nums.size, thrs.size)) + for i, thr in enumerate(thrs): + recalls[:, i] = (_ious >= thr).sum(axis=1) / float(total_gt_num) + + return recalls + + +def set_recall_param(proposal_nums, iou_thrs): + """Check proposal_nums and iou_thrs and set correct format.""" + if isinstance(proposal_nums, Sequence): + _proposal_nums = np.array(proposal_nums) + elif isinstance(proposal_nums, int): + _proposal_nums = np.array([proposal_nums]) + else: + _proposal_nums = proposal_nums + + if iou_thrs is None: + _iou_thrs = np.array([0.5]) + elif isinstance(iou_thrs, Sequence): + _iou_thrs = np.array(iou_thrs) + elif isinstance(iou_thrs, float): + _iou_thrs = np.array([iou_thrs]) + else: + _iou_thrs = iou_thrs + + return _proposal_nums, _iou_thrs + + +def eval_recalls(gts, + proposals, + proposal_nums=None, + iou_thrs=0.5, + logger=None, + use_legacy_coordinate=False): + """Calculate recalls. + + Args: + gts (list[ndarray]): a list of arrays of shape (n, 4) + proposals (list[ndarray]): a list of arrays of shape (k, 4) or (k, 5) + proposal_nums (int | Sequence[int]): Top N proposals to be evaluated. + iou_thrs (float | Sequence[float]): IoU thresholds. Default: 0.5. + logger (logging.Logger | str | None): The way to print the recall + summary. See `mmcv.utils.print_log()` for details. Default: None. + use_legacy_coordinate (bool): Whether use coordinate system + in mmdet v1.x. "1" was added to both height and width + which means w, h should be + computed as 'x2 - x1 + 1` and 'y2 - y1 + 1'. Default: False. + + + Returns: + ndarray: recalls of different ious and proposal nums + """ + + img_num = len(gts) + assert img_num == len(proposals) + proposal_nums, iou_thrs = set_recall_param(proposal_nums, iou_thrs) + all_ious = [] + for i in range(img_num): + if proposals[i].ndim == 2 and proposals[i].shape[1] == 5: + scores = proposals[i][:, 4] + sort_idx = np.argsort(scores)[::-1] + img_proposal = proposals[i][sort_idx, :] + else: + img_proposal = proposals[i] + prop_num = min(img_proposal.shape[0], proposal_nums[-1]) + if gts[i] is None or gts[i].shape[0] == 0: + ious = np.zeros((0, img_proposal.shape[0]), dtype=np.float32) + else: + ious = bbox_overlaps( + gts[i], + img_proposal[:prop_num, :4], + use_legacy_coordinate=use_legacy_coordinate) + all_ious.append(ious) + all_ious = np.array(all_ious) + recalls = _recalls(all_ious, proposal_nums, iou_thrs) + + print_recall_summary(recalls, proposal_nums, iou_thrs, logger=logger) + return recalls + + +def print_recall_summary(recalls, + proposal_nums, + iou_thrs, + row_idxs=None, + col_idxs=None, + logger=None): + """Print recalls in a table. + + Args: + recalls (ndarray): calculated from `bbox_recalls` + proposal_nums (ndarray or list): top N proposals + iou_thrs (ndarray or list): iou thresholds + row_idxs (ndarray): which rows(proposal nums) to print + col_idxs (ndarray): which cols(iou thresholds) to print + logger (logging.Logger | str | None): The way to print the recall + summary. See `mmcv.utils.print_log()` for details. Default: None. + """ + proposal_nums = np.array(proposal_nums, dtype=np.int32) + iou_thrs = np.array(iou_thrs) + if row_idxs is None: + row_idxs = np.arange(proposal_nums.size) + if col_idxs is None: + col_idxs = np.arange(iou_thrs.size) + row_header = [''] + iou_thrs[col_idxs].tolist() + table_data = [row_header] + for i, num in enumerate(proposal_nums[row_idxs]): + row = [f'{val:.3f}' for val in recalls[row_idxs[i], col_idxs].tolist()] + row.insert(0, num) + table_data.append(row) + table = AsciiTable(table_data) + print_log('\n' + table.table, logger=logger) + + +def plot_num_recall(recalls, proposal_nums): + """Plot Proposal_num-Recalls curve. + + Args: + recalls(ndarray or list): shape (k,) + proposal_nums(ndarray or list): same shape as `recalls` + """ + if isinstance(proposal_nums, np.ndarray): + _proposal_nums = proposal_nums.tolist() + else: + _proposal_nums = proposal_nums + if isinstance(recalls, np.ndarray): + _recalls = recalls.tolist() + else: + _recalls = recalls + + import matplotlib.pyplot as plt + f = plt.figure() + plt.plot([0] + _proposal_nums, [0] + _recalls) + plt.xlabel('Proposal num') + plt.ylabel('Recall') + plt.axis([0, proposal_nums.max(), 0, 1]) + f.show() + + +def plot_iou_recall(recalls, iou_thrs): + """Plot IoU-Recalls curve. + + Args: + recalls(ndarray or list): shape (k,) + iou_thrs(ndarray or list): same shape as `recalls` + """ + if isinstance(iou_thrs, np.ndarray): + _iou_thrs = iou_thrs.tolist() + else: + _iou_thrs = iou_thrs + if isinstance(recalls, np.ndarray): + _recalls = recalls.tolist() + else: + _recalls = recalls + + import matplotlib.pyplot as plt + f = plt.figure() + plt.plot(_iou_thrs + [1.0], _recalls + [0.]) + plt.xlabel('IoU') + plt.ylabel('Recall') + plt.axis([iou_thrs.min(), 1, 0, 1]) + f.show() diff --git a/mmdet/core/export/__init__.py b/mmdet/core/export/__init__.py new file mode 100644 index 0000000..a8179c9 --- /dev/null +++ b/mmdet/core/export/__init__.py @@ -0,0 +1,12 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .onnx_helper import (add_dummy_nms_for_onnx, dynamic_clip_for_onnx, + get_k_for_topk) +from .pytorch2onnx import (build_model_from_cfg, + generate_inputs_and_wrap_model, + preprocess_example_input) + +__all__ = [ + 'build_model_from_cfg', 'generate_inputs_and_wrap_model', + 'preprocess_example_input', 'get_k_for_topk', 'add_dummy_nms_for_onnx', + 'dynamic_clip_for_onnx' +] diff --git a/mmdet/core/export/model_wrappers.py b/mmdet/core/export/model_wrappers.py new file mode 100644 index 0000000..c7be2df --- /dev/null +++ b/mmdet/core/export/model_wrappers.py @@ -0,0 +1,183 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +import warnings + +import numpy as np +import torch + +from mmdet.core import bbox2result +from mmdet.models import BaseDetector + + +class DeployBaseDetector(BaseDetector): + """DeployBaseDetector.""" + + def __init__(self, class_names, device_id): + super(DeployBaseDetector, self).__init__() + self.CLASSES = class_names + self.device_id = device_id + + def simple_test(self, img, img_metas, **kwargs): + raise NotImplementedError('This method is not implemented.') + + def aug_test(self, imgs, img_metas, **kwargs): + raise NotImplementedError('This method is not implemented.') + + def extract_feat(self, imgs): + raise NotImplementedError('This method is not implemented.') + + def forward_train(self, imgs, img_metas, **kwargs): + raise NotImplementedError('This method is not implemented.') + + def val_step(self, data, optimizer): + raise NotImplementedError('This method is not implemented.') + + def train_step(self, data, optimizer): + raise NotImplementedError('This method is not implemented.') + + def forward_test(self, *, img, img_metas, **kwargs): + raise NotImplementedError('This method is not implemented.') + + def async_simple_test(self, img, img_metas, **kwargs): + raise NotImplementedError('This method is not implemented.') + + def forward(self, img, img_metas, return_loss=True, **kwargs): + outputs = self.forward_test(img, img_metas, **kwargs) + batch_dets, batch_labels = outputs[:2] + batch_masks = outputs[2] if len(outputs) == 3 else None + batch_size = img[0].shape[0] + img_metas = img_metas[0] + results = [] + rescale = kwargs.get('rescale', True) + for i in range(batch_size): + dets, labels = batch_dets[i], batch_labels[i] + if rescale: + scale_factor = img_metas[i]['scale_factor'] + + if isinstance(scale_factor, (list, tuple, np.ndarray)): + assert len(scale_factor) == 4 + scale_factor = np.array(scale_factor)[None, :] # [1,4] + dets[:, :4] /= scale_factor + + if 'border' in img_metas[i]: + # offset pixel of the top-left corners between original image + # and padded/enlarged image, 'border' is used when exporting + # CornerNet and CentripetalNet to onnx + x_off = img_metas[i]['border'][2] + y_off = img_metas[i]['border'][0] + dets[:, [0, 2]] -= x_off + dets[:, [1, 3]] -= y_off + dets[:, :4] *= (dets[:, :4] > 0).astype(dets.dtype) + + dets_results = bbox2result(dets, labels, len(self.CLASSES)) + + if batch_masks is not None: + masks = batch_masks[i] + img_h, img_w = img_metas[i]['img_shape'][:2] + ori_h, ori_w = img_metas[i]['ori_shape'][:2] + masks = masks[:, :img_h, :img_w] + if rescale: + masks = masks.astype(np.float32) + masks = torch.from_numpy(masks) + masks = torch.nn.functional.interpolate( + masks.unsqueeze(0), size=(ori_h, ori_w)) + masks = masks.squeeze(0).detach().numpy() + if masks.dtype != bool: + masks = masks >= 0.5 + segms_results = [[] for _ in range(len(self.CLASSES))] + for j in range(len(dets)): + segms_results[labels[j]].append(masks[j]) + results.append((dets_results, segms_results)) + else: + results.append(dets_results) + return results + + +class ONNXRuntimeDetector(DeployBaseDetector): + """Wrapper for detector's inference with ONNXRuntime.""" + + def __init__(self, onnx_file, class_names, device_id): + super(ONNXRuntimeDetector, self).__init__(class_names, device_id) + import onnxruntime as ort + + # get the custom op path + ort_custom_op_path = '' + try: + from mmcv.ops import get_onnxruntime_op_path + ort_custom_op_path = get_onnxruntime_op_path() + except (ImportError, ModuleNotFoundError): + warnings.warn('If input model has custom op from mmcv, \ + you may have to build mmcv with ONNXRuntime from source.') + session_options = ort.SessionOptions() + # register custom op for onnxruntime + if osp.exists(ort_custom_op_path): + session_options.register_custom_ops_library(ort_custom_op_path) + sess = ort.InferenceSession(onnx_file, session_options) + providers = ['CPUExecutionProvider'] + options = [{}] + is_cuda_available = ort.get_device() == 'GPU' + if is_cuda_available: + providers.insert(0, 'CUDAExecutionProvider') + options.insert(0, {'device_id': device_id}) + + sess.set_providers(providers, options) + + self.sess = sess + self.io_binding = sess.io_binding() + self.output_names = [_.name for _ in sess.get_outputs()] + self.is_cuda_available = is_cuda_available + + def forward_test(self, imgs, img_metas, **kwargs): + input_data = imgs[0] + # set io binding for inputs/outputs + device_type = 'cuda' if self.is_cuda_available else 'cpu' + if not self.is_cuda_available: + input_data = input_data.cpu() + self.io_binding.bind_input( + name='input', + device_type=device_type, + device_id=self.device_id, + element_type=np.float32, + shape=input_data.shape, + buffer_ptr=input_data.data_ptr()) + + for name in self.output_names: + self.io_binding.bind_output(name) + # run session to get outputs + self.sess.run_with_iobinding(self.io_binding) + ort_outputs = self.io_binding.copy_outputs_to_cpu() + return ort_outputs + + +class TensorRTDetector(DeployBaseDetector): + """Wrapper for detector's inference with TensorRT.""" + + def __init__(self, engine_file, class_names, device_id, output_names=None): + super(TensorRTDetector, self).__init__(class_names, device_id) + warnings.warn('`output_names` is deprecated and will be removed in ' + 'future releases.') + from mmcv.tensorrt import TRTWraper, load_tensorrt_plugin + try: + load_tensorrt_plugin() + except (ImportError, ModuleNotFoundError): + warnings.warn('If input model has custom op from mmcv, \ + you may have to build mmcv with TensorRT from source.') + + output_names = ['dets', 'labels'] + model = TRTWraper(engine_file, ['input'], output_names) + with_masks = False + # if TensorRT has totally 4 inputs/outputs, then + # the detector should have `mask` output. + if len(model.engine) == 4: + model.output_names = output_names + ['masks'] + with_masks = True + self.model = model + self.with_masks = with_masks + + def forward_test(self, imgs, img_metas, **kwargs): + input_data = imgs[0].contiguous() + with torch.cuda.device(self.device_id), torch.no_grad(): + outputs = self.model({'input': input_data}) + outputs = [outputs[name] for name in self.model.output_names] + outputs = [out.detach().cpu().numpy() for out in outputs] + return outputs diff --git a/mmdet/core/export/onnx_helper.py b/mmdet/core/export/onnx_helper.py new file mode 100644 index 0000000..9f6b9a0 --- /dev/null +++ b/mmdet/core/export/onnx_helper.py @@ -0,0 +1,223 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os + +import torch + + +def dynamic_clip_for_onnx(x1, y1, x2, y2, max_shape): + """Clip boxes dynamically for onnx. + + Since torch.clamp cannot have dynamic `min` and `max`, we scale the + boxes by 1/max_shape and clamp in the range [0, 1]. + + Args: + x1 (Tensor): The x1 for bounding boxes. + y1 (Tensor): The y1 for bounding boxes. + x2 (Tensor): The x2 for bounding boxes. + y2 (Tensor): The y2 for bounding boxes. + max_shape (Tensor or torch.Size): The (H,W) of original image. + Returns: + tuple(Tensor): The clipped x1, y1, x2, y2. + """ + assert isinstance( + max_shape, + torch.Tensor), '`max_shape` should be tensor of (h,w) for onnx' + + # scale by 1/max_shape + x1 = x1 / max_shape[1] + y1 = y1 / max_shape[0] + x2 = x2 / max_shape[1] + y2 = y2 / max_shape[0] + + # clamp [0, 1] + x1 = torch.clamp(x1, 0, 1) + y1 = torch.clamp(y1, 0, 1) + x2 = torch.clamp(x2, 0, 1) + y2 = torch.clamp(y2, 0, 1) + + # scale back + x1 = x1 * max_shape[1] + y1 = y1 * max_shape[0] + x2 = x2 * max_shape[1] + y2 = y2 * max_shape[0] + return x1, y1, x2, y2 + + +def get_k_for_topk(k, size): + """Get k of TopK for onnx exporting. + + The K of TopK in TensorRT should not be a Tensor, while in ONNX Runtime + it could be a Tensor.Due to dynamic shape feature, we have to decide + whether to do TopK and what K it should be while exporting to ONNX. + If returned K is less than zero, it means we do not have to do + TopK operation. + + Args: + k (int or Tensor): The set k value for nms from config file. + size (Tensor or torch.Size): The number of elements of \ + TopK's input tensor + Returns: + tuple: (int or Tensor): The final K for TopK. + """ + ret_k = -1 + if k <= 0 or size <= 0: + return ret_k + if torch.onnx.is_in_onnx_export(): + is_trt_backend = os.environ.get('ONNX_BACKEND') == 'MMCVTensorRT' + if is_trt_backend: + # TensorRT does not support dynamic K with TopK op + if 0 < k < size: + ret_k = k + else: + # Always keep topk op for dynamic input in onnx for ONNX Runtime + ret_k = torch.where(k < size, k, size) + elif k < size: + ret_k = k + else: + # ret_k is -1 + pass + return ret_k + + +def add_dummy_nms_for_onnx(boxes, + scores, + max_output_boxes_per_class=1000, + iou_threshold=0.5, + score_threshold=0.05, + pre_top_k=-1, + after_top_k=-1, + labels=None): + """Create a dummy onnx::NonMaxSuppression op while exporting to ONNX. + + This function helps exporting to onnx with batch and multiclass NMS op. + It only supports class-agnostic detection results. That is, the scores + is of shape (N, num_bboxes, num_classes) and the boxes is of shape + (N, num_boxes, 4). + + Args: + boxes (Tensor): The bounding boxes of shape [N, num_boxes, 4] + scores (Tensor): The detection scores of shape + [N, num_boxes, num_classes] + max_output_boxes_per_class (int): Maximum number of output + boxes per class of nms. Defaults to 1000. + iou_threshold (float): IOU threshold of nms. Defaults to 0.5 + score_threshold (float): score threshold of nms. + Defaults to 0.05. + pre_top_k (bool): Number of top K boxes to keep before nms. + Defaults to -1. + after_top_k (int): Number of top K boxes to keep after nms. + Defaults to -1. + labels (Tensor, optional): It not None, explicit labels would be used. + Otherwise, labels would be automatically generated using + num_classed. Defaults to None. + + Returns: + tuple[Tensor, Tensor]: dets of shape [N, num_det, 5] + and class labels of shape [N, num_det]. + """ + max_output_boxes_per_class = torch.LongTensor([max_output_boxes_per_class]) + iou_threshold = torch.tensor([iou_threshold], dtype=torch.float32) + score_threshold = torch.tensor([score_threshold], dtype=torch.float32) + batch_size = scores.shape[0] + num_class = scores.shape[2] + + nms_pre = torch.tensor(pre_top_k, device=scores.device, dtype=torch.long) + nms_pre = get_k_for_topk(nms_pre, boxes.shape[1]) + + if nms_pre > 0: + max_scores, _ = scores.max(-1) + _, topk_inds = max_scores.topk(nms_pre) + batch_inds = torch.arange(batch_size).view( + -1, 1).expand_as(topk_inds).long() + # Avoid onnx2tensorrt issue in https://github.com/NVIDIA/TensorRT/issues/1134 # noqa: E501 + transformed_inds = boxes.shape[1] * batch_inds + topk_inds + boxes = boxes.reshape(-1, 4)[transformed_inds, :].reshape( + batch_size, -1, 4) + scores = scores.reshape(-1, num_class)[transformed_inds, :].reshape( + batch_size, -1, num_class) + if labels is not None: + labels = labels.reshape(-1, 1)[transformed_inds].reshape( + batch_size, -1) + + scores = scores.permute(0, 2, 1) + num_box = boxes.shape[1] + # turn off tracing to create a dummy output of nms + state = torch._C._get_tracing_state() + # dummy indices of nms's output + num_fake_det = 2 + batch_inds = torch.randint(batch_size, (num_fake_det, 1)) + cls_inds = torch.randint(num_class, (num_fake_det, 1)) + box_inds = torch.randint(num_box, (num_fake_det, 1)) + indices = torch.cat([batch_inds, cls_inds, box_inds], dim=1) + output = indices + setattr(DummyONNXNMSop, 'output', output) + + # open tracing + torch._C._set_tracing_state(state) + selected_indices = DummyONNXNMSop.apply(boxes, scores, + max_output_boxes_per_class, + iou_threshold, score_threshold) + + batch_inds, cls_inds = selected_indices[:, 0], selected_indices[:, 1] + box_inds = selected_indices[:, 2] + if labels is None: + labels = torch.arange(num_class, dtype=torch.long).to(scores.device) + labels = labels.view(1, num_class, 1).expand_as(scores) + scores = scores.reshape(-1, 1) + boxes = boxes.reshape(batch_size, -1).repeat(1, num_class).reshape(-1, 4) + pos_inds = (num_class * batch_inds + cls_inds) * num_box + box_inds + mask = scores.new_zeros(scores.shape) + # Avoid onnx2tensorrt issue in https://github.com/NVIDIA/TensorRT/issues/1134 # noqa: E501 + # PyTorch style code: mask[batch_inds, box_inds] += 1 + mask[pos_inds, :] += 1 + scores = scores * mask + boxes = boxes * mask + + scores = scores.reshape(batch_size, -1) + boxes = boxes.reshape(batch_size, -1, 4) + labels = labels.reshape(batch_size, -1) + + nms_after = torch.tensor( + after_top_k, device=scores.device, dtype=torch.long) + nms_after = get_k_for_topk(nms_after, num_box * num_class) + + if nms_after > 0: + _, topk_inds = scores.topk(nms_after) + batch_inds = torch.arange(batch_size).view(-1, 1).expand_as(topk_inds) + # Avoid onnx2tensorrt issue in https://github.com/NVIDIA/TensorRT/issues/1134 # noqa: E501 + transformed_inds = scores.shape[1] * batch_inds + topk_inds + scores = scores.reshape(-1, 1)[transformed_inds, :].reshape( + batch_size, -1) + boxes = boxes.reshape(-1, 4)[transformed_inds, :].reshape( + batch_size, -1, 4) + labels = labels.reshape(-1, 1)[transformed_inds, :].reshape( + batch_size, -1) + + scores = scores.unsqueeze(2) + dets = torch.cat([boxes, scores], dim=2) + return dets, labels + + +class DummyONNXNMSop(torch.autograd.Function): + """DummyONNXNMSop. + + This class is only for creating onnx::NonMaxSuppression. + """ + + @staticmethod + def forward(ctx, boxes, scores, max_output_boxes_per_class, iou_threshold, + score_threshold): + + return DummyONNXNMSop.output + + @staticmethod + def symbolic(g, boxes, scores, max_output_boxes_per_class, iou_threshold, + score_threshold): + return g.op( + 'NonMaxSuppression', + boxes, + scores, + max_output_boxes_per_class, + iou_threshold, + score_threshold, + outputs=1) diff --git a/mmdet/core/export/pytorch2onnx.py b/mmdet/core/export/pytorch2onnx.py new file mode 100644 index 0000000..b8261ee --- /dev/null +++ b/mmdet/core/export/pytorch2onnx.py @@ -0,0 +1,159 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from functools import partial + +import mmcv +import numpy as np +import torch +from mmcv.runner import load_checkpoint + + +def generate_inputs_and_wrap_model(config_path, + checkpoint_path, + input_config, + cfg_options=None): + """Prepare sample input and wrap model for ONNX export. + + The ONNX export API only accept args, and all inputs should be + torch.Tensor or corresponding types (such as tuple of tensor). + So we should call this function before exporting. This function will: + + 1. generate corresponding inputs which are used to execute the model. + 2. Wrap the model's forward function. + + For example, the MMDet models' forward function has a parameter + ``return_loss:bool``. As we want to set it as False while export API + supports neither bool type or kwargs. So we have to replace the forward + method like ``model.forward = partial(model.forward, return_loss=False)``. + + Args: + config_path (str): the OpenMMLab config for the model we want to + export to ONNX + checkpoint_path (str): Path to the corresponding checkpoint + input_config (dict): the exactly data in this dict depends on the + framework. For MMSeg, we can just declare the input shape, + and generate the dummy data accordingly. However, for MMDet, + we may pass the real img path, or the NMS will return None + as there is no legal bbox. + + Returns: + tuple: (model, tensor_data) wrapped model which can be called by + ``model(*tensor_data)`` and a list of inputs which are used to + execute the model while exporting. + """ + + model = build_model_from_cfg( + config_path, checkpoint_path, cfg_options=cfg_options) + one_img, one_meta = preprocess_example_input(input_config) + tensor_data = [one_img] + model.forward = partial( + model.forward, img_metas=[[one_meta]], return_loss=False) + + # pytorch has some bug in pytorch1.3, we have to fix it + # by replacing these existing op + opset_version = 11 + # put the import within the function thus it will not cause import error + # when not using this function + try: + from mmcv.onnx.symbolic import register_extra_symbolics + except ModuleNotFoundError: + raise NotImplementedError('please update mmcv to version>=v1.0.4') + register_extra_symbolics(opset_version) + + return model, tensor_data + + +def build_model_from_cfg(config_path, checkpoint_path, cfg_options=None): + """Build a model from config and load the given checkpoint. + + Args: + config_path (str): the OpenMMLab config for the model we want to + export to ONNX + checkpoint_path (str): Path to the corresponding checkpoint + + Returns: + torch.nn.Module: the built model + """ + from mmdet.models import build_detector + + cfg = mmcv.Config.fromfile(config_path) + if cfg_options is not None: + cfg.merge_from_dict(cfg_options) + # set cudnn_benchmark + if cfg.get('cudnn_benchmark', False): + torch.backends.cudnn.benchmark = True + cfg.model.pretrained = None + cfg.data.test.test_mode = True + + # build the model + cfg.model.train_cfg = None + model = build_detector(cfg.model, test_cfg=cfg.get('test_cfg')) + checkpoint = load_checkpoint(model, checkpoint_path, map_location='cpu') + if 'CLASSES' in checkpoint.get('meta', {}): + model.CLASSES = checkpoint['meta']['CLASSES'] + else: + from mmdet.datasets import DATASETS + dataset = DATASETS.get(cfg.data.test['type']) + assert (dataset is not None) + model.CLASSES = dataset.CLASSES + model.cpu().eval() + return model + + +def preprocess_example_input(input_config): + """Prepare an example input image for ``generate_inputs_and_wrap_model``. + + Args: + input_config (dict): customized config describing the example input. + + Returns: + tuple: (one_img, one_meta), tensor of the example input image and \ + meta information for the example input image. + + Examples: + >>> from mmdet.core.export import preprocess_example_input + >>> input_config = { + >>> 'input_shape': (1,3,224,224), + >>> 'input_path': 'demo/demo.jpg', + >>> 'normalize_cfg': { + >>> 'mean': (123.675, 116.28, 103.53), + >>> 'std': (58.395, 57.12, 57.375) + >>> } + >>> } + >>> one_img, one_meta = preprocess_example_input(input_config) + >>> print(one_img.shape) + torch.Size([1, 3, 224, 224]) + >>> print(one_meta) + {'img_shape': (224, 224, 3), + 'ori_shape': (224, 224, 3), + 'pad_shape': (224, 224, 3), + 'filename': '.png', + 'scale_factor': 1.0, + 'flip': False} + """ + input_path = input_config['input_path'] + input_shape = input_config['input_shape'] + one_img = mmcv.imread(input_path) + one_img = mmcv.imresize(one_img, input_shape[2:][::-1]) + show_img = one_img.copy() + if 'normalize_cfg' in input_config.keys(): + normalize_cfg = input_config['normalize_cfg'] + mean = np.array(normalize_cfg['mean'], dtype=np.float32) + std = np.array(normalize_cfg['std'], dtype=np.float32) + to_rgb = normalize_cfg.get('to_rgb', True) + one_img = mmcv.imnormalize(one_img, mean, std, to_rgb=to_rgb) + one_img = one_img.transpose(2, 0, 1) + one_img = torch.from_numpy(one_img).unsqueeze(0).float().requires_grad_( + True) + (_, C, H, W) = input_shape + one_meta = { + 'img_shape': (H, W, C), + 'ori_shape': (H, W, C), + 'pad_shape': (H, W, C), + 'filename': '.png', + 'scale_factor': np.ones(4, dtype=np.float32), + 'flip': False, + 'show_img': show_img, + 'flip_direction': None + } + + return one_img, one_meta diff --git a/mmdet/core/hook/__init__.py b/mmdet/core/hook/__init__.py new file mode 100644 index 0000000..7b9ac9f --- /dev/null +++ b/mmdet/core/hook/__init__.py @@ -0,0 +1,17 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .checkloss_hook import CheckInvalidLossHook +from .ema import ExpMomentumEMAHook, LinearMomentumEMAHook +from .memory_profiler_hook import MemoryProfilerHook +from .set_epoch_info_hook import SetEpochInfoHook +from .sync_norm_hook import SyncNormHook +from .sync_random_size_hook import SyncRandomSizeHook +from .wandblogger_hook import MMDetWandbHook +from .yolox_lrupdater_hook import YOLOXLrUpdaterHook +from .yolox_mode_switch_hook import YOLOXModeSwitchHook + +__all__ = [ + 'SyncRandomSizeHook', 'YOLOXModeSwitchHook', 'SyncNormHook', + 'ExpMomentumEMAHook', 'LinearMomentumEMAHook', 'YOLOXLrUpdaterHook', + 'CheckInvalidLossHook', 'SetEpochInfoHook', 'MemoryProfilerHook', + 'MMDetWandbHook' +] diff --git a/mmdet/core/hook/checkloss_hook.py b/mmdet/core/hook/checkloss_hook.py new file mode 100644 index 0000000..754e61b --- /dev/null +++ b/mmdet/core/hook/checkloss_hook.py @@ -0,0 +1,24 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +from mmcv.runner.hooks import HOOKS, Hook + + +@HOOKS.register_module() +class CheckInvalidLossHook(Hook): + """Check invalid loss hook. + + This hook will regularly check whether the loss is valid + during training. + + Args: + interval (int): Checking interval (every k iterations). + Default: 50. + """ + + def __init__(self, interval=50): + self.interval = interval + + def after_train_iter(self, runner): + if self.every_n_iters(runner, self.interval): + assert torch.isfinite(runner.outputs['loss']), \ + runner.logger.info('loss become infinite or NaN!') diff --git a/mmdet/core/hook/ema.py b/mmdet/core/hook/ema.py new file mode 100644 index 0000000..ff7bfba --- /dev/null +++ b/mmdet/core/hook/ema.py @@ -0,0 +1,130 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math + +from mmcv.parallel import is_module_wrapper +from mmcv.runner.hooks import HOOKS, Hook + + +class BaseEMAHook(Hook): + """Exponential Moving Average Hook. + + Use Exponential Moving Average on all parameters of model in training + process. All parameters have a ema backup, which update by the formula + as below. EMAHook takes priority over EvalHook and CheckpointHook. Note, + the original model parameters are actually saved in ema field after train. + + Args: + momentum (float): The momentum used for updating ema parameter. + Ema's parameter are updated with the formula: + `ema_param = (1-momentum) * ema_param + momentum * cur_param`. + Defaults to 0.0002. + skip_buffers (bool): Whether to skip the model buffers, such as + batchnorm running stats (running_mean, running_var), it does not + perform the ema operation. Default to False. + interval (int): Update ema parameter every interval iteration. + Defaults to 1. + resume_from (str, optional): The checkpoint path. Defaults to None. + momentum_fun (func, optional): The function to change momentum + during early iteration (also warmup) to help early training. + It uses `momentum` as a constant. Defaults to None. + """ + + def __init__(self, + momentum=0.0002, + interval=1, + skip_buffers=False, + resume_from=None, + momentum_fun=None): + assert 0 < momentum < 1 + self.momentum = momentum + self.skip_buffers = skip_buffers + self.interval = interval + self.checkpoint = resume_from + self.momentum_fun = momentum_fun + + def before_run(self, runner): + """To resume model with it's ema parameters more friendly. + + Register ema parameter as ``named_buffer`` to model. + """ + model = runner.model + if is_module_wrapper(model): + model = model.module + self.param_ema_buffer = {} + if self.skip_buffers: + self.model_parameters = dict(model.named_parameters()) + else: + self.model_parameters = model.state_dict() + for name, value in self.model_parameters.items(): + # "." is not allowed in module's buffer name + buffer_name = f"ema_{name.replace('.', '_')}" + self.param_ema_buffer[name] = buffer_name + model.register_buffer(buffer_name, value.data.clone()) + self.model_buffers = dict(model.named_buffers()) + if self.checkpoint is not None: + runner.resume(self.checkpoint) + + def get_momentum(self, runner): + return self.momentum_fun(runner.iter) if self.momentum_fun else \ + self.momentum + + def after_train_iter(self, runner): + """Update ema parameter every self.interval iterations.""" + if (runner.iter + 1) % self.interval != 0: + return + momentum = self.get_momentum(runner) + for name, parameter in self.model_parameters.items(): + # exclude num_tracking + if parameter.dtype.is_floating_point: + buffer_name = self.param_ema_buffer[name] + buffer_parameter = self.model_buffers[buffer_name] + buffer_parameter.mul_(1 - momentum).add_( + parameter.data, alpha=momentum) + + def after_train_epoch(self, runner): + """We load parameter values from ema backup to model before the + EvalHook.""" + self._swap_ema_parameters() + + def before_train_epoch(self, runner): + """We recover model's parameter from ema backup after last epoch's + EvalHook.""" + self._swap_ema_parameters() + + def _swap_ema_parameters(self): + """Swap the parameter of model with parameter in ema_buffer.""" + for name, value in self.model_parameters.items(): + temp = value.data.clone() + ema_buffer = self.model_buffers[self.param_ema_buffer[name]] + value.data.copy_(ema_buffer.data) + ema_buffer.data.copy_(temp) + + +@HOOKS.register_module() +class ExpMomentumEMAHook(BaseEMAHook): + """EMAHook using exponential momentum strategy. + + Args: + total_iter (int): The total number of iterations of EMA momentum. + Defaults to 2000. + """ + + def __init__(self, total_iter=2000, **kwargs): + super(ExpMomentumEMAHook, self).__init__(**kwargs) + self.momentum_fun = lambda x: (1 - self.momentum) * math.exp(-( + 1 + x) / total_iter) + self.momentum + + +@HOOKS.register_module() +class LinearMomentumEMAHook(BaseEMAHook): + """EMAHook using linear momentum strategy. + + Args: + warm_up (int): During first warm_up steps, we may use smaller decay + to update ema parameters more slowly. Defaults to 100. + """ + + def __init__(self, warm_up=100, **kwargs): + super(LinearMomentumEMAHook, self).__init__(**kwargs) + self.momentum_fun = lambda x: min(self.momentum**self.interval, + (1 + x) / (warm_up + x)) diff --git a/mmdet/core/hook/memory_profiler_hook.py b/mmdet/core/hook/memory_profiler_hook.py new file mode 100644 index 0000000..a473061 --- /dev/null +++ b/mmdet/core/hook/memory_profiler_hook.py @@ -0,0 +1,55 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmcv.runner.hooks import HOOKS, Hook + + +@HOOKS.register_module() +class MemoryProfilerHook(Hook): + """Memory profiler hook recording memory information including virtual + memory, swap memory, and the memory of the current process. + + Args: + interval (int): Checking interval (every k iterations). + Default: 50. + """ + + def __init__(self, interval=50): + try: + from psutil import swap_memory, virtual_memory + self._swap_memory = swap_memory + self._virtual_memory = virtual_memory + except ImportError: + raise ImportError('psutil is not installed, please install it by: ' + 'pip install psutil') + + try: + from memory_profiler import memory_usage + self._memory_usage = memory_usage + except ImportError: + raise ImportError( + 'memory_profiler is not installed, please install it by: ' + 'pip install memory_profiler') + + self.interval = interval + + def after_iter(self, runner): + if self.every_n_iters(runner, self.interval): + # in Byte + virtual_memory = self._virtual_memory() + swap_memory = self._swap_memory() + # in MB + process_memory = self._memory_usage()[0] + factor = 1024 * 1024 + runner.logger.info( + 'Memory information ' + 'available_memory: ' + f'{round(virtual_memory.available / factor)} MB, ' + 'used_memory: ' + f'{round(virtual_memory.used / factor)} MB, ' + f'memory_utilization: {virtual_memory.percent} %, ' + 'available_swap_memory: ' + f'{round((swap_memory.total - swap_memory.used) / factor)}' + ' MB, ' + f'used_swap_memory: {round(swap_memory.used / factor)} MB, ' + f'swap_memory_utilization: {swap_memory.percent} %, ' + 'current_process_memory: ' + f'{round(process_memory)} MB') diff --git a/mmdet/core/hook/set_epoch_info_hook.py b/mmdet/core/hook/set_epoch_info_hook.py new file mode 100644 index 0000000..c2b134c --- /dev/null +++ b/mmdet/core/hook/set_epoch_info_hook.py @@ -0,0 +1,15 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmcv.parallel import is_module_wrapper +from mmcv.runner import HOOKS, Hook + + +@HOOKS.register_module() +class SetEpochInfoHook(Hook): + """Set runner's epoch information to the model.""" + + def before_train_epoch(self, runner): + epoch = runner.epoch + model = runner.model + if is_module_wrapper(model): + model = model.module + model.set_epoch(epoch) diff --git a/mmdet/core/hook/sync_norm_hook.py b/mmdet/core/hook/sync_norm_hook.py new file mode 100644 index 0000000..82931ce --- /dev/null +++ b/mmdet/core/hook/sync_norm_hook.py @@ -0,0 +1,52 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from collections import OrderedDict + +from mmcv.runner import get_dist_info +from mmcv.runner.hooks import HOOKS, Hook +from torch import nn + +from ..utils.dist_utils import all_reduce_dict + + +def get_norm_states(module): + async_norm_states = OrderedDict() + for name, child in module.named_modules(): + if isinstance(child, nn.modules.batchnorm._NormBase): + for k, v in child.state_dict().items(): + async_norm_states['.'.join([name, k])] = v + return async_norm_states + + +@HOOKS.register_module() +class SyncNormHook(Hook): + """Synchronize Norm states after training epoch, currently used in YOLOX. + + Args: + num_last_epochs (int): The number of latter epochs in the end of the + training to switch to synchronizing norm interval. Default: 15. + interval (int): Synchronizing norm interval. Default: 1. + """ + + def __init__(self, num_last_epochs=15, interval=1): + self.interval = interval + self.num_last_epochs = num_last_epochs + + def before_train_epoch(self, runner): + epoch = runner.epoch + if (epoch + 1) == runner.max_epochs - self.num_last_epochs: + # Synchronize norm every epoch. + self.interval = 1 + + def after_train_epoch(self, runner): + """Synchronizing norm.""" + epoch = runner.epoch + module = runner.model + if (epoch + 1) % self.interval == 0: + _, world_size = get_dist_info() + if world_size == 1: + return + norm_states = get_norm_states(module) + if len(norm_states) == 0: + return + norm_states = all_reduce_dict(norm_states, op='mean') + module.load_state_dict(norm_states, strict=False) diff --git a/mmdet/core/hook/sync_random_size_hook.py b/mmdet/core/hook/sync_random_size_hook.py new file mode 100644 index 0000000..6d7e96c --- /dev/null +++ b/mmdet/core/hook/sync_random_size_hook.py @@ -0,0 +1,72 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import random +import warnings + +import torch +from mmcv.runner import get_dist_info +from mmcv.runner.hooks import HOOKS, Hook +from torch import distributed as dist + + +@HOOKS.register_module() +class SyncRandomSizeHook(Hook): + """Change and synchronize the random image size across ranks. + SyncRandomSizeHook is deprecated, please use Resize pipeline to achieve + similar functions. Such as `dict(type='Resize', img_scale=[(448, 448), + (832, 832)], multiscale_mode='range', keep_ratio=True)`. + + Note: Due to the multi-process dataloader, its behavior is different + from YOLOX's official implementation, the official is to change the + size every fixed iteration interval and what we achieved is a fixed + epoch interval. + + Args: + ratio_range (tuple[int]): Random ratio range. It will be multiplied + by 32, and then change the dataset output image size. + Default: (14, 26). + img_scale (tuple[int]): Size of input image. Default: (640, 640). + interval (int): The epoch interval of change image size. Default: 1. + device (torch.device | str): device for returned tensors. + Default: 'cuda'. + """ + + def __init__(self, + ratio_range=(14, 26), + img_scale=(640, 640), + interval=1, + device='cuda'): + warnings.warn('DeprecationWarning: SyncRandomSizeHook is deprecated. ' + 'Please use Resize pipeline to achieve similar ' + 'functions. Due to the multi-process dataloader, ' + 'its behavior is different from YOLOX\'s official ' + 'implementation, the official is to change the size ' + 'every fixed iteration interval and what we achieved ' + 'is a fixed epoch interval.') + self.rank, world_size = get_dist_info() + self.is_distributed = world_size > 1 + self.ratio_range = ratio_range + self.img_scale = img_scale + self.interval = interval + self.device = device + + def after_train_epoch(self, runner): + """Change the dataset output image size.""" + if self.ratio_range is not None and (runner.epoch + + 1) % self.interval == 0: + # Due to DDP and DP get the device behavior inconsistent, + # so we did not get the device from runner.model. + tensor = torch.LongTensor(2).to(self.device) + + if self.rank == 0: + size_factor = self.img_scale[1] * 1. / self.img_scale[0] + size = random.randint(*self.ratio_range) + size = (int(32 * size), 32 * int(size * size_factor)) + tensor[0] = size[0] + tensor[1] = size[1] + + if self.is_distributed: + dist.barrier() + dist.broadcast(tensor, 0) + + runner.data_loader.dataset.update_dynamic_scale( + (tensor[0].item(), tensor[1].item())) diff --git a/mmdet/core/hook/wandblogger_hook.py b/mmdet/core/hook/wandblogger_hook.py new file mode 100644 index 0000000..7bf252f --- /dev/null +++ b/mmdet/core/hook/wandblogger_hook.py @@ -0,0 +1,593 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import importlib +import os.path as osp +import sys +import warnings + +import mmcv +import numpy as np +import pycocotools.mask as mask_util +from mmcv.runner import HOOKS +from mmcv.runner.dist_utils import master_only +from mmcv.runner.hooks.checkpoint import CheckpointHook +from mmcv.runner.hooks.logger.wandb import WandbLoggerHook +from mmcv.utils import digit_version + +from mmdet.core import DistEvalHook, EvalHook +from mmdet.core.mask.structures import polygon_to_bitmap + + +@HOOKS.register_module() +class MMDetWandbHook(WandbLoggerHook): + """Enhanced Wandb logger hook for MMDetection. + + Comparing with the :cls:`mmcv.runner.WandbLoggerHook`, this hook can not + only automatically log all the metrics but also log the following extra + information - saves model checkpoints as W&B Artifact, and + logs model prediction as interactive W&B Tables. + + - Metrics: The MMDetWandbHook will automatically log training + and validation metrics along with system metrics (CPU/GPU). + + - Checkpointing: If `log_checkpoint` is True, the checkpoint saved at + every checkpoint interval will be saved as W&B Artifacts. + This depends on the : class:`mmcv.runner.CheckpointHook` whose priority + is higher than this hook. Please refer to + https://docs.wandb.ai/guides/artifacts/model-versioning + to learn more about model versioning with W&B Artifacts. + + - Checkpoint Metadata: If evaluation results are available for a given + checkpoint artifact, it will have a metadata associated with it. + The metadata contains the evaluation metrics computed on validation + data with that checkpoint along with the current epoch. It depends + on `EvalHook` whose priority is more than MMDetWandbHook. + + - Evaluation: At every evaluation interval, the `MMDetWandbHook` logs the + model prediction as interactive W&B Tables. The number of samples + logged is given by `num_eval_images`. Currently, the `MMDetWandbHook` + logs the predicted bounding boxes along with the ground truth at every + evaluation interval. This depends on the `EvalHook` whose priority is + more than `MMDetWandbHook`. Also note that the data is just logged once + and subsequent evaluation tables uses reference to the logged data + to save memory usage. Please refer to + https://docs.wandb.ai/guides/data-vis to learn more about W&B Tables. + + For more details check out W&B's MMDetection docs: + https://docs.wandb.ai/guides/integrations/mmdetection + + ``` + Example: + log_config = dict( + ... + hooks=[ + ..., + dict(type='MMDetWandbHook', + init_kwargs={ + 'entity': "YOUR_ENTITY", + 'project': "YOUR_PROJECT_NAME" + }, + interval=50, + log_checkpoint=True, + log_checkpoint_metadata=True, + num_eval_images=100, + bbox_score_thr=0.3) + ]) + ``` + + Args: + init_kwargs (dict): A dict passed to wandb.init to initialize + a W&B run. Please refer to https://docs.wandb.ai/ref/python/init + for possible key-value pairs. + interval (int): Logging interval (every k iterations). Defaults to 50. + log_checkpoint (bool): Save the checkpoint at every checkpoint interval + as W&B Artifacts. Use this for model versioning where each version + is a checkpoint. Defaults to False. + log_checkpoint_metadata (bool): Log the evaluation metrics computed + on the validation data with the checkpoint, along with current + epoch as a metadata to that checkpoint. + Defaults to True. + num_eval_images (int): The number of validation images to be logged. + If zero, the evaluation won't be logged. Defaults to 100. + bbox_score_thr (float): Threshold for bounding box scores. + Defaults to 0.3. + """ + + def __init__(self, + init_kwargs=None, + interval=50, + log_checkpoint=False, + log_checkpoint_metadata=False, + num_eval_images=100, + bbox_score_thr=0.3, + **kwargs): + super(MMDetWandbHook, self).__init__(init_kwargs, interval, **kwargs) + + self.log_checkpoint = log_checkpoint + self.log_checkpoint_metadata = ( + log_checkpoint and log_checkpoint_metadata) + self.num_eval_images = num_eval_images + self.bbox_score_thr = bbox_score_thr + self.log_evaluation = (num_eval_images > 0) + self.ckpt_hook: CheckpointHook = None + self.eval_hook: EvalHook = None + + def import_wandb(self): + try: + import wandb + from wandb import init # noqa + + # Fix ResourceWarning when calling wandb.log in wandb v0.12.10. + # https://github.com/wandb/client/issues/2837 + if digit_version(wandb.__version__) < digit_version('0.12.10'): + warnings.warn( + f'The current wandb {wandb.__version__} is ' + f'lower than v0.12.10 will cause ResourceWarning ' + f'when calling wandb.log, Please run ' + f'"pip install --upgrade wandb"') + + except ImportError: + raise ImportError( + 'Please run "pip install "wandb>=0.12.10"" to install wandb') + self.wandb = wandb + + @master_only + def before_run(self, runner): + super(MMDetWandbHook, self).before_run(runner) + + # Save and Log config. + if runner.meta is not None and runner.meta.get('exp_name', + None) is not None: + src_cfg_path = osp.join(runner.work_dir, + runner.meta.get('exp_name', None)) + if osp.exists(src_cfg_path): + self.wandb.save(src_cfg_path, base_path=runner.work_dir) + self._update_wandb_config(runner) + else: + runner.logger.warning('No meta information found in the runner. ') + + # Inspect CheckpointHook and EvalHook + for hook in runner.hooks: + if isinstance(hook, CheckpointHook): + self.ckpt_hook = hook + if isinstance(hook, (EvalHook, DistEvalHook)): + self.eval_hook = hook + + # Check conditions to log checkpoint + if self.log_checkpoint: + if self.ckpt_hook is None: + self.log_checkpoint = False + self.log_checkpoint_metadata = False + runner.logger.warning( + 'To log checkpoint in MMDetWandbHook, `CheckpointHook` is' + 'required, please check hooks in the runner.') + else: + self.ckpt_interval = self.ckpt_hook.interval + + # Check conditions to log evaluation + if self.log_evaluation or self.log_checkpoint_metadata: + if self.eval_hook is None: + self.log_evaluation = False + self.log_checkpoint_metadata = False + runner.logger.warning( + 'To log evaluation or checkpoint metadata in ' + 'MMDetWandbHook, `EvalHook` or `DistEvalHook` in mmdet ' + 'is required, please check whether the validation ' + 'is enabled.') + else: + self.eval_interval = self.eval_hook.interval + self.val_dataset = self.eval_hook.dataloader.dataset + # Determine the number of samples to be logged. + if self.num_eval_images > len(self.val_dataset): + self.num_eval_images = len(self.val_dataset) + runner.logger.warning( + f'The num_eval_images ({self.num_eval_images}) is ' + 'greater than the total number of validation samples ' + f'({len(self.val_dataset)}). The complete validation ' + 'dataset will be logged.') + + # Check conditions to log checkpoint metadata + if self.log_checkpoint_metadata: + assert self.ckpt_interval % self.eval_interval == 0, \ + 'To log checkpoint metadata in MMDetWandbHook, the interval ' \ + f'of checkpoint saving ({self.ckpt_interval}) should be ' \ + 'divisible by the interval of evaluation ' \ + f'({self.eval_interval}).' + + # Initialize evaluation table + if self.log_evaluation: + # Initialize data table + self._init_data_table() + # Add data to the data table + self._add_ground_truth(runner) + # Log ground truth data + self._log_data_table() + + @master_only + def after_train_epoch(self, runner): + super(MMDetWandbHook, self).after_train_epoch(runner) + + if not self.by_epoch: + return + + # Log checkpoint and metadata. + if (self.log_checkpoint + and self.every_n_epochs(runner, self.ckpt_interval) + or (self.ckpt_hook.save_last and self.is_last_epoch(runner))): + if self.log_checkpoint_metadata and self.eval_hook: + metadata = { + 'epoch': runner.epoch + 1, + **self._get_eval_results() + } + else: + metadata = None + aliases = [f'epoch_{runner.epoch + 1}', 'latest'] + model_path = osp.join(self.ckpt_hook.out_dir, + f'epoch_{runner.epoch + 1}.pth') + self._log_ckpt_as_artifact(model_path, aliases, metadata) + + # Save prediction table + if self.log_evaluation and self.eval_hook._should_evaluate(runner): + results = self.eval_hook.latest_results + # Initialize evaluation table + self._init_pred_table() + # Log predictions + self._log_predictions(results) + # Log the table + self._log_eval_table(runner.epoch + 1) + + # for the reason of this double-layered structure, refer to + # https://github.com/open-mmlab/mmdetection/issues/8145#issuecomment-1345343076 + def after_train_iter(self, runner): + if self.get_mode(runner) == 'train': + # An ugly patch. The iter-based eval hook will call the + # `after_train_iter` method of all logger hooks before evaluation. + # Use this trick to skip that call. + # Don't call super method at first, it will clear the log_buffer + return super(MMDetWandbHook, self).after_train_iter(runner) + else: + super(MMDetWandbHook, self).after_train_iter(runner) + self._after_train_iter(runner) + + @master_only + def _after_train_iter(self, runner): + if self.by_epoch: + return + + # Save checkpoint and metadata + if (self.log_checkpoint + and self.every_n_iters(runner, self.ckpt_interval) + or (self.ckpt_hook.save_last and self.is_last_iter(runner))): + if self.log_checkpoint_metadata and self.eval_hook: + metadata = { + 'iter': runner.iter + 1, + **self._get_eval_results() + } + else: + metadata = None + aliases = [f'iter_{runner.iter + 1}', 'latest'] + model_path = osp.join(self.ckpt_hook.out_dir, + f'iter_{runner.iter + 1}.pth') + self._log_ckpt_as_artifact(model_path, aliases, metadata) + + # Save prediction table + if self.log_evaluation and self.eval_hook._should_evaluate(runner): + results = self.eval_hook.latest_results + # Initialize evaluation table + self._init_pred_table() + # Log predictions + self._log_predictions(results) + # Log the table + self._log_eval_table(runner.iter + 1) + + @master_only + def after_run(self, runner): + self.wandb.finish() + + def _update_wandb_config(self, runner): + """Update wandb config.""" + # Import the config file. + sys.path.append(runner.work_dir) + config_filename = runner.meta['exp_name'][:-3] + configs = importlib.import_module(config_filename) + # Prepare a nested dict of config variables. + config_keys = [key for key in dir(configs) if not key.startswith('__')] + config_dict = {key: getattr(configs, key) for key in config_keys} + # Update the W&B config. + self.wandb.config.update(config_dict) + + def _log_ckpt_as_artifact(self, model_path, aliases, metadata=None): + """Log model checkpoint as W&B Artifact. + + Args: + model_path (str): Path of the checkpoint to log. + aliases (list): List of the aliases associated with this artifact. + metadata (dict, optional): Metadata associated with this artifact. + """ + model_artifact = self.wandb.Artifact( + f'run_{self.wandb.run.id}_model', type='model', metadata=metadata) + model_artifact.add_file(model_path) + self.wandb.log_artifact(model_artifact, aliases=aliases) + + def _get_eval_results(self): + """Get model evaluation results.""" + results = self.eval_hook.latest_results + eval_results = self.val_dataset.evaluate( + results, logger='silent', **self.eval_hook.eval_kwargs) + return eval_results + + def _init_data_table(self): + """Initialize the W&B Tables for validation data.""" + columns = ['image_name', 'image'] + self.data_table = self.wandb.Table(columns=columns) + + def _init_pred_table(self): + """Initialize the W&B Tables for model evaluation.""" + columns = ['image_name', 'ground_truth', 'prediction'] + self.eval_table = self.wandb.Table(columns=columns) + + def _add_ground_truth(self, runner): + # Get image loading pipeline + from mmdet.datasets.pipelines import LoadImageFromFile + img_loader = None + for t in self.val_dataset.pipeline.transforms: + if isinstance(t, LoadImageFromFile): + img_loader = t + + if img_loader is None: + self.log_evaluation = False + runner.logger.warning( + 'LoadImageFromFile is required to add images ' + 'to W&B Tables.') + return + + # Select the images to be logged. + self.eval_image_indexs = np.arange(len(self.val_dataset)) + # Set seed so that same validation set is logged each time. + np.random.seed(42) + np.random.shuffle(self.eval_image_indexs) + self.eval_image_indexs = self.eval_image_indexs[:self.num_eval_images] + + CLASSES = self.val_dataset.CLASSES + self.class_id_to_label = { + id + 1: name + for id, name in enumerate(CLASSES) + } + self.class_set = self.wandb.Classes([{ + 'id': id, + 'name': name + } for id, name in self.class_id_to_label.items()]) + + img_prefix = self.val_dataset.img_prefix + + for idx in self.eval_image_indexs: + img_info = self.val_dataset.data_infos[idx] + image_name = img_info.get('filename', f'img_{idx}') + img_height, img_width = img_info['height'], img_info['width'] + + img_meta = img_loader( + dict(img_info=img_info, img_prefix=img_prefix)) + + # Get image and convert from BGR to RGB + image = mmcv.bgr2rgb(img_meta['img']) + + data_ann = self.val_dataset.get_ann_info(idx) + bboxes = data_ann['bboxes'] + labels = data_ann['labels'] + masks = data_ann.get('masks', None) + + # Get dict of bounding boxes to be logged. + assert len(bboxes) == len(labels) + wandb_boxes = self._get_wandb_bboxes(bboxes, labels) + + # Get dict of masks to be logged. + if masks is not None: + wandb_masks = self._get_wandb_masks( + masks, + labels, + is_poly_mask=True, + height=img_height, + width=img_width) + else: + wandb_masks = None + # TODO: Panoramic segmentation visualization. + + # Log a row to the data table. + self.data_table.add_data( + image_name, + self.wandb.Image( + image, + boxes=wandb_boxes, + masks=wandb_masks, + classes=self.class_set)) + + def _log_predictions(self, results): + table_idxs = self.data_table_ref.get_index() + assert len(table_idxs) == len(self.eval_image_indexs) + + for ndx, eval_image_index in enumerate(self.eval_image_indexs): + # Get the result + result = results[eval_image_index] + if isinstance(result, tuple): + bbox_result, segm_result = result + if isinstance(segm_result, tuple): + segm_result = segm_result[0] # ms rcnn + else: + bbox_result, segm_result = result, None + assert len(bbox_result) == len(self.class_id_to_label) + + # Get labels + bboxes = np.vstack(bbox_result) + labels = [ + np.full(bbox.shape[0], i, dtype=np.int32) + for i, bbox in enumerate(bbox_result) + ] + labels = np.concatenate(labels) + + # Get segmentation mask if available. + segms = None + if segm_result is not None and len(labels) > 0: + segms = mmcv.concat_list(segm_result) + segms = mask_util.decode(segms) + segms = segms.transpose(2, 0, 1) + assert len(segms) == len(labels) + # TODO: Panoramic segmentation visualization. + + # Remove bounding boxes and masks with score lower than threshold. + if self.bbox_score_thr > 0: + assert bboxes is not None and bboxes.shape[1] == 5 + scores = bboxes[:, -1] + inds = scores > self.bbox_score_thr + bboxes = bboxes[inds, :] + labels = labels[inds] + if segms is not None: + segms = segms[inds, ...] + + # Get dict of bounding boxes to be logged. + wandb_boxes = self._get_wandb_bboxes(bboxes, labels, log_gt=False) + # Get dict of masks to be logged. + if segms is not None: + wandb_masks = self._get_wandb_masks(segms, labels) + else: + wandb_masks = None + + # Log a row to the eval table. + self.eval_table.add_data( + self.data_table_ref.data[ndx][0], + self.data_table_ref.data[ndx][1], + self.wandb.Image( + self.data_table_ref.data[ndx][1], + boxes=wandb_boxes, + masks=wandb_masks, + classes=self.class_set)) + + def _get_wandb_bboxes(self, bboxes, labels, log_gt=True): + """Get list of structured dict for logging bounding boxes to W&B. + + Args: + bboxes (list): List of bounding box coordinates in + (minX, minY, maxX, maxY) format. + labels (int): List of label ids. + log_gt (bool): Whether to log ground truth or prediction boxes. + + Returns: + Dictionary of bounding boxes to be logged. + """ + wandb_boxes = {} + + box_data = [] + for bbox, label in zip(bboxes, labels): + if not isinstance(label, int): + label = int(label) + label = label + 1 + + if len(bbox) == 5: + confidence = float(bbox[4]) + class_name = self.class_id_to_label[label] + box_caption = f'{class_name} {confidence:.2f}' + else: + box_caption = str(self.class_id_to_label[label]) + + position = dict( + minX=int(bbox[0]), + minY=int(bbox[1]), + maxX=int(bbox[2]), + maxY=int(bbox[3])) + + box_data.append({ + 'position': position, + 'class_id': label, + 'box_caption': box_caption, + 'domain': 'pixel' + }) + + wandb_bbox_dict = { + 'box_data': box_data, + 'class_labels': self.class_id_to_label + } + + if log_gt: + wandb_boxes['ground_truth'] = wandb_bbox_dict + else: + wandb_boxes['predictions'] = wandb_bbox_dict + + return wandb_boxes + + def _get_wandb_masks(self, + masks, + labels, + is_poly_mask=False, + height=None, + width=None): + """Get list of structured dict for logging masks to W&B. + + Args: + masks (list): List of masks. + labels (int): List of label ids. + is_poly_mask (bool): Whether the mask is polygonal or not. + This is true for CocoDataset. + height (int): Height of the image. + width (int): Width of the image. + + Returns: + Dictionary of masks to be logged. + """ + mask_label_dict = dict() + for mask, label in zip(masks, labels): + label = label + 1 + # Get bitmap mask from polygon. + if is_poly_mask: + if height is not None and width is not None: + mask = polygon_to_bitmap(mask, height, width) + # Create composite masks for each class. + if label not in mask_label_dict.keys(): + mask_label_dict[label] = mask + else: + mask_label_dict[label] = np.logical_or(mask_label_dict[label], + mask) + + wandb_masks = dict() + for key, value in mask_label_dict.items(): + # Create mask for that class. + value = value.astype(np.uint8) + value[value > 0] = key + + # Create dict of masks for logging. + class_name = self.class_id_to_label[key] + wandb_masks[class_name] = { + 'mask_data': value, + 'class_labels': self.class_id_to_label + } + + return wandb_masks + + def _log_data_table(self): + """Log the W&B Tables for validation data as artifact and calls + `use_artifact` on it so that the evaluation table can use the reference + of already uploaded images. + + This allows the data to be uploaded just once. + """ + data_artifact = self.wandb.Artifact('val', type='dataset') + data_artifact.add(self.data_table, 'val_data') + + if not self.wandb.run.offline: + self.wandb.run.use_artifact(data_artifact) + data_artifact.wait() + self.data_table_ref = data_artifact.get('val_data') + else: + self.data_table_ref = self.data_table + + def _log_eval_table(self, idx): + """Log the W&B Tables for model evaluation. + + The table will be logged multiple times creating new version. Use this + to compare models at different intervals interactively. + """ + pred_artifact = self.wandb.Artifact( + f'run_{self.wandb.run.id}_pred', type='evaluation') + pred_artifact.add(self.eval_table, 'eval_data') + if self.by_epoch: + aliases = ['latest', f'epoch_{idx}'] + else: + aliases = ['latest', f'iter_{idx}'] + self.wandb.run.log_artifact(pred_artifact, aliases=aliases) diff --git a/mmdet/core/hook/yolox_lrupdater_hook.py b/mmdet/core/hook/yolox_lrupdater_hook.py new file mode 100644 index 0000000..ecb028e --- /dev/null +++ b/mmdet/core/hook/yolox_lrupdater_hook.py @@ -0,0 +1,67 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmcv.runner.hooks import HOOKS +from mmcv.runner.hooks.lr_updater import (CosineAnnealingLrUpdaterHook, + annealing_cos) + + +@HOOKS.register_module() +class YOLOXLrUpdaterHook(CosineAnnealingLrUpdaterHook): + """YOLOX learning rate scheme. + + There are two main differences between YOLOXLrUpdaterHook + and CosineAnnealingLrUpdaterHook. + + 1. When the current running epoch is greater than + `max_epoch-last_epoch`, a fixed learning rate will be used + 2. The exp warmup scheme is different with LrUpdaterHook in MMCV + + Args: + num_last_epochs (int): The number of epochs with a fixed learning rate + before the end of the training. + """ + + def __init__(self, num_last_epochs, **kwargs): + self.num_last_epochs = num_last_epochs + super(YOLOXLrUpdaterHook, self).__init__(**kwargs) + + def get_warmup_lr(self, cur_iters): + + def _get_warmup_lr(cur_iters, regular_lr): + # exp warmup scheme + k = self.warmup_ratio * pow( + (cur_iters + 1) / float(self.warmup_iters), 2) + warmup_lr = [_lr * k for _lr in regular_lr] + return warmup_lr + + if isinstance(self.base_lr, dict): + lr_groups = {} + for key, base_lr in self.base_lr.items(): + lr_groups[key] = _get_warmup_lr(cur_iters, base_lr) + return lr_groups + else: + return _get_warmup_lr(cur_iters, self.base_lr) + + def get_lr(self, runner, base_lr): + last_iter = len(runner.data_loader) * self.num_last_epochs + + if self.by_epoch: + progress = runner.epoch + max_progress = runner.max_epochs + else: + progress = runner.iter + max_progress = runner.max_iters + + progress += 1 + + if self.min_lr_ratio is not None: + target_lr = base_lr * self.min_lr_ratio + else: + target_lr = self.min_lr + + if progress >= max_progress - last_iter: + # fixed learning rate + return target_lr + else: + return annealing_cos( + base_lr, target_lr, (progress - self.warmup_iters) / + (max_progress - self.warmup_iters - last_iter)) diff --git a/mmdet/core/hook/yolox_mode_switch_hook.py b/mmdet/core/hook/yolox_mode_switch_hook.py new file mode 100644 index 0000000..10834e6 --- /dev/null +++ b/mmdet/core/hook/yolox_mode_switch_hook.py @@ -0,0 +1,52 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmcv.parallel import is_module_wrapper +from mmcv.runner.hooks import HOOKS, Hook + + +@HOOKS.register_module() +class YOLOXModeSwitchHook(Hook): + """Switch the mode of YOLOX during training. + + This hook turns off the mosaic and mixup data augmentation and switches + to use L1 loss in bbox_head. + + Args: + num_last_epochs (int): The number of latter epochs in the end of the + training to close the data augmentation and switch to L1 loss. + Default: 15. + skip_type_keys (list[str], optional): Sequence of type string to be + skip pipeline. Default: ('Mosaic', 'RandomAffine', 'MixUp') + """ + + def __init__(self, + num_last_epochs=15, + skip_type_keys=('Mosaic', 'RandomAffine', 'MixUp')): + self.num_last_epochs = num_last_epochs + self.skip_type_keys = skip_type_keys + self._restart_dataloader = False + + def before_train_epoch(self, runner): + """Close mosaic and mixup augmentation and switches to use L1 loss.""" + epoch = runner.epoch + train_loader = runner.data_loader + model = runner.model + if is_module_wrapper(model): + model = model.module + if (epoch + 1) == runner.max_epochs - self.num_last_epochs: + runner.logger.info('No mosaic and mixup aug now!') + # The dataset pipeline cannot be updated when persistent_workers + # is True, so we need to force the dataloader's multi-process + # restart. This is a very hacky approach. + train_loader.dataset.update_skip_type_keys(self.skip_type_keys) + if hasattr(train_loader, 'persistent_workers' + ) and train_loader.persistent_workers is True: + train_loader._DataLoader__initialized = False + train_loader._iterator = None + self._restart_dataloader = True + runner.logger.info('Add additional L1 loss now!') + model.bbox_head.use_l1 = True + else: + # Once the restart is complete, we need to restore + # the initialization flag. + if self._restart_dataloader: + train_loader._DataLoader__initialized = True diff --git a/mmdet/core/mask/__init__.py b/mmdet/core/mask/__init__.py new file mode 100644 index 0000000..644a9b1 --- /dev/null +++ b/mmdet/core/mask/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .mask_target import mask_target +from .structures import BaseInstanceMasks, BitmapMasks, PolygonMasks +from .utils import encode_mask_results, mask2bbox, split_combined_polys + +__all__ = [ + 'split_combined_polys', 'mask_target', 'BaseInstanceMasks', 'BitmapMasks', + 'PolygonMasks', 'encode_mask_results', 'mask2bbox' +] diff --git a/mmdet/core/mask/mask_target.py b/mmdet/core/mask/mask_target.py new file mode 100644 index 0000000..273e767 --- /dev/null +++ b/mmdet/core/mask/mask_target.py @@ -0,0 +1,127 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import torch +from torch.nn.modules.utils import _pair + + +def mask_target(pos_proposals_list, pos_assigned_gt_inds_list, gt_masks_list, + cfg): + """Compute mask target for positive proposals in multiple images. + + Args: + pos_proposals_list (list[Tensor]): Positive proposals in multiple + images. + pos_assigned_gt_inds_list (list[Tensor]): Assigned GT indices for each + positive proposals. + gt_masks_list (list[:obj:`BaseInstanceMasks`]): Ground truth masks of + each image. + cfg (dict): Config dict that specifies the mask size. + + Returns: + list[Tensor]: Mask target of each image. + + Example: + >>> import mmcv + >>> import mmdet + >>> from mmdet.core.mask import BitmapMasks + >>> from mmdet.core.mask.mask_target import * + >>> H, W = 17, 18 + >>> cfg = mmcv.Config({'mask_size': (13, 14)}) + >>> rng = np.random.RandomState(0) + >>> # Positive proposals (tl_x, tl_y, br_x, br_y) for each image + >>> pos_proposals_list = [ + >>> torch.Tensor([ + >>> [ 7.2425, 5.5929, 13.9414, 14.9541], + >>> [ 7.3241, 3.6170, 16.3850, 15.3102], + >>> ]), + >>> torch.Tensor([ + >>> [ 4.8448, 6.4010, 7.0314, 9.7681], + >>> [ 5.9790, 2.6989, 7.4416, 4.8580], + >>> [ 0.0000, 0.0000, 0.1398, 9.8232], + >>> ]), + >>> ] + >>> # Corresponding class index for each proposal for each image + >>> pos_assigned_gt_inds_list = [ + >>> torch.LongTensor([7, 0]), + >>> torch.LongTensor([5, 4, 1]), + >>> ] + >>> # Ground truth mask for each true object for each image + >>> gt_masks_list = [ + >>> BitmapMasks(rng.rand(8, H, W), height=H, width=W), + >>> BitmapMasks(rng.rand(6, H, W), height=H, width=W), + >>> ] + >>> mask_targets = mask_target( + >>> pos_proposals_list, pos_assigned_gt_inds_list, + >>> gt_masks_list, cfg) + >>> assert mask_targets.shape == (5,) + cfg['mask_size'] + """ + cfg_list = [cfg for _ in range(len(pos_proposals_list))] + mask_targets = map(mask_target_single, pos_proposals_list, + pos_assigned_gt_inds_list, gt_masks_list, cfg_list) + mask_targets = list(mask_targets) + if len(mask_targets) > 0: + mask_targets = torch.cat(mask_targets) + return mask_targets + + +def mask_target_single(pos_proposals, pos_assigned_gt_inds, gt_masks, cfg): + """Compute mask target for each positive proposal in the image. + + Args: + pos_proposals (Tensor): Positive proposals. + pos_assigned_gt_inds (Tensor): Assigned GT inds of positive proposals. + gt_masks (:obj:`BaseInstanceMasks`): GT masks in the format of Bitmap + or Polygon. + cfg (dict): Config dict that indicate the mask size. + + Returns: + Tensor: Mask target of each positive proposals in the image. + + Example: + >>> import mmcv + >>> import mmdet + >>> from mmdet.core.mask import BitmapMasks + >>> from mmdet.core.mask.mask_target import * # NOQA + >>> H, W = 32, 32 + >>> cfg = mmcv.Config({'mask_size': (7, 11)}) + >>> rng = np.random.RandomState(0) + >>> # Masks for each ground truth box (relative to the image) + >>> gt_masks_data = rng.rand(3, H, W) + >>> gt_masks = BitmapMasks(gt_masks_data, height=H, width=W) + >>> # Predicted positive boxes in one image + >>> pos_proposals = torch.FloatTensor([ + >>> [ 16.2, 5.5, 19.9, 20.9], + >>> [ 17.3, 13.6, 19.3, 19.3], + >>> [ 14.8, 16.4, 17.0, 23.7], + >>> [ 0.0, 0.0, 16.0, 16.0], + >>> [ 4.0, 0.0, 20.0, 16.0], + >>> ]) + >>> # For each predicted proposal, its assignment to a gt mask + >>> pos_assigned_gt_inds = torch.LongTensor([0, 1, 2, 1, 1]) + >>> mask_targets = mask_target_single( + >>> pos_proposals, pos_assigned_gt_inds, gt_masks, cfg) + >>> assert mask_targets.shape == (5,) + cfg['mask_size'] + """ + device = pos_proposals.device + mask_size = _pair(cfg.mask_size) + binarize = not cfg.get('soft_mask_target', False) + num_pos = pos_proposals.size(0) + if num_pos > 0: + proposals_np = pos_proposals.cpu().numpy() + maxh, maxw = gt_masks.height, gt_masks.width + proposals_np[:, [0, 2]] = np.clip(proposals_np[:, [0, 2]], 0, maxw) + proposals_np[:, [1, 3]] = np.clip(proposals_np[:, [1, 3]], 0, maxh) + pos_assigned_gt_inds = pos_assigned_gt_inds.cpu().numpy() + + mask_targets = gt_masks.crop_and_resize( + proposals_np, + mask_size, + device=device, + inds=pos_assigned_gt_inds, + binarize=binarize).to_ndarray() + + mask_targets = torch.from_numpy(mask_targets).float().to(device) + else: + mask_targets = pos_proposals.new_zeros((0, ) + mask_size) + + return mask_targets diff --git a/mmdet/core/mask/structures.py b/mmdet/core/mask/structures.py new file mode 100644 index 0000000..7e730dc --- /dev/null +++ b/mmdet/core/mask/structures.py @@ -0,0 +1,1102 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from abc import ABCMeta, abstractmethod + +import cv2 +import mmcv +import numpy as np +import pycocotools.mask as maskUtils +import torch +from mmcv.ops.roi_align import roi_align + + +class BaseInstanceMasks(metaclass=ABCMeta): + """Base class for instance masks.""" + + @abstractmethod + def rescale(self, scale, interpolation='nearest'): + """Rescale masks as large as possible while keeping the aspect ratio. + For details can refer to `mmcv.imrescale`. + + Args: + scale (tuple[int]): The maximum size (h, w) of rescaled mask. + interpolation (str): Same as :func:`mmcv.imrescale`. + + Returns: + BaseInstanceMasks: The rescaled masks. + """ + + @abstractmethod + def resize(self, out_shape, interpolation='nearest'): + """Resize masks to the given out_shape. + + Args: + out_shape: Target (h, w) of resized mask. + interpolation (str): See :func:`mmcv.imresize`. + + Returns: + BaseInstanceMasks: The resized masks. + """ + + @abstractmethod + def flip(self, flip_direction='horizontal'): + """Flip masks alone the given direction. + + Args: + flip_direction (str): Either 'horizontal' or 'vertical'. + + Returns: + BaseInstanceMasks: The flipped masks. + """ + + @abstractmethod + def pad(self, out_shape, pad_val): + """Pad masks to the given size of (h, w). + + Args: + out_shape (tuple[int]): Target (h, w) of padded mask. + pad_val (int): The padded value. + + Returns: + BaseInstanceMasks: The padded masks. + """ + + @abstractmethod + def crop(self, bbox): + """Crop each mask by the given bbox. + + Args: + bbox (ndarray): Bbox in format [x1, y1, x2, y2], shape (4, ). + + Return: + BaseInstanceMasks: The cropped masks. + """ + + @abstractmethod + def crop_and_resize(self, + bboxes, + out_shape, + inds, + device, + interpolation='bilinear', + binarize=True): + """Crop and resize masks by the given bboxes. + + This function is mainly used in mask targets computation. + It firstly align mask to bboxes by assigned_inds, then crop mask by the + assigned bbox and resize to the size of (mask_h, mask_w) + + Args: + bboxes (Tensor): Bboxes in format [x1, y1, x2, y2], shape (N, 4) + out_shape (tuple[int]): Target (h, w) of resized mask + inds (ndarray): Indexes to assign masks to each bbox, + shape (N,) and values should be between [0, num_masks - 1]. + device (str): Device of bboxes + interpolation (str): See `mmcv.imresize` + binarize (bool): if True fractional values are rounded to 0 or 1 + after the resize operation. if False and unsupported an error + will be raised. Defaults to True. + + Return: + BaseInstanceMasks: the cropped and resized masks. + """ + + @abstractmethod + def expand(self, expanded_h, expanded_w, top, left): + """see :class:`Expand`.""" + + @property + @abstractmethod + def areas(self): + """ndarray: areas of each instance.""" + + @abstractmethod + def to_ndarray(self): + """Convert masks to the format of ndarray. + + Return: + ndarray: Converted masks in the format of ndarray. + """ + + @abstractmethod + def to_tensor(self, dtype, device): + """Convert masks to the format of Tensor. + + Args: + dtype (str): Dtype of converted mask. + device (torch.device): Device of converted masks. + + Returns: + Tensor: Converted masks in the format of Tensor. + """ + + @abstractmethod + def translate(self, + out_shape, + offset, + direction='horizontal', + fill_val=0, + interpolation='bilinear'): + """Translate the masks. + + Args: + out_shape (tuple[int]): Shape for output mask, format (h, w). + offset (int | float): The offset for translate. + direction (str): The translate direction, either "horizontal" + or "vertical". + fill_val (int | float): Border value. Default 0. + interpolation (str): Same as :func:`mmcv.imtranslate`. + + Returns: + Translated masks. + """ + + def shear(self, + out_shape, + magnitude, + direction='horizontal', + border_value=0, + interpolation='bilinear'): + """Shear the masks. + + Args: + out_shape (tuple[int]): Shape for output mask, format (h, w). + magnitude (int | float): The magnitude used for shear. + direction (str): The shear direction, either "horizontal" + or "vertical". + border_value (int | tuple[int]): Value used in case of a + constant border. Default 0. + interpolation (str): Same as in :func:`mmcv.imshear`. + + Returns: + ndarray: Sheared masks. + """ + + @abstractmethod + def rotate(self, out_shape, angle, center=None, scale=1.0, fill_val=0): + """Rotate the masks. + + Args: + out_shape (tuple[int]): Shape for output mask, format (h, w). + angle (int | float): Rotation angle in degrees. Positive values + mean counter-clockwise rotation. + center (tuple[float], optional): Center point (w, h) of the + rotation in source image. If not specified, the center of + the image will be used. + scale (int | float): Isotropic scale factor. + fill_val (int | float): Border value. Default 0 for masks. + + Returns: + Rotated masks. + """ + + +class BitmapMasks(BaseInstanceMasks): + """This class represents masks in the form of bitmaps. + + Args: + masks (ndarray): ndarray of masks in shape (N, H, W), where N is + the number of objects. + height (int): height of masks + width (int): width of masks + + Example: + >>> from mmdet.core.mask.structures import * # NOQA + >>> num_masks, H, W = 3, 32, 32 + >>> rng = np.random.RandomState(0) + >>> masks = (rng.rand(num_masks, H, W) > 0.1).astype(np.int) + >>> self = BitmapMasks(masks, height=H, width=W) + + >>> # demo crop_and_resize + >>> num_boxes = 5 + >>> bboxes = np.array([[0, 0, 30, 10.0]] * num_boxes) + >>> out_shape = (14, 14) + >>> inds = torch.randint(0, len(self), size=(num_boxes,)) + >>> device = 'cpu' + >>> interpolation = 'bilinear' + >>> new = self.crop_and_resize( + ... bboxes, out_shape, inds, device, interpolation) + >>> assert len(new) == num_boxes + >>> assert new.height, new.width == out_shape + """ + + def __init__(self, masks, height, width): + self.height = height + self.width = width + if len(masks) == 0: + self.masks = np.empty((0, self.height, self.width), dtype=np.uint8) + else: + assert isinstance(masks, (list, np.ndarray)) + if isinstance(masks, list): + assert isinstance(masks[0], np.ndarray) + assert masks[0].ndim == 2 # (H, W) + else: + assert masks.ndim == 3 # (N, H, W) + + self.masks = np.stack(masks).reshape(-1, height, width) + assert self.masks.shape[1] == self.height + assert self.masks.shape[2] == self.width + + def __getitem__(self, index): + """Index the BitmapMask. + + Args: + index (int | ndarray): Indices in the format of integer or ndarray. + + Returns: + :obj:`BitmapMasks`: Indexed bitmap masks. + """ + masks = self.masks[index].reshape(-1, self.height, self.width) + return BitmapMasks(masks, self.height, self.width) + + def __iter__(self): + return iter(self.masks) + + def __repr__(self): + s = self.__class__.__name__ + '(' + s += f'num_masks={len(self.masks)}, ' + s += f'height={self.height}, ' + s += f'width={self.width})' + return s + + def __len__(self): + """Number of masks.""" + return len(self.masks) + + def rescale(self, scale, interpolation='nearest'): + """See :func:`BaseInstanceMasks.rescale`.""" + if len(self.masks) == 0: + new_w, new_h = mmcv.rescale_size((self.width, self.height), scale) + rescaled_masks = np.empty((0, new_h, new_w), dtype=np.uint8) + else: + rescaled_masks = np.stack([ + mmcv.imrescale(mask, scale, interpolation=interpolation) + for mask in self.masks + ]) + height, width = rescaled_masks.shape[1:] + return BitmapMasks(rescaled_masks, height, width) + + def resize(self, out_shape, interpolation='nearest'): + """See :func:`BaseInstanceMasks.resize`.""" + if len(self.masks) == 0: + resized_masks = np.empty((0, *out_shape), dtype=np.uint8) + else: + resized_masks = np.stack([ + mmcv.imresize( + mask, out_shape[::-1], interpolation=interpolation) + for mask in self.masks + ]) + return BitmapMasks(resized_masks, *out_shape) + + def flip(self, flip_direction='horizontal'): + """See :func:`BaseInstanceMasks.flip`.""" + assert flip_direction in ('horizontal', 'vertical', 'diagonal') + + if len(self.masks) == 0: + flipped_masks = self.masks + else: + flipped_masks = np.stack([ + mmcv.imflip(mask, direction=flip_direction) + for mask in self.masks + ]) + return BitmapMasks(flipped_masks, self.height, self.width) + + def pad(self, out_shape, pad_val=0): + """See :func:`BaseInstanceMasks.pad`.""" + if len(self.masks) == 0: + padded_masks = np.empty((0, *out_shape), dtype=np.uint8) + else: + padded_masks = np.stack([ + mmcv.impad(mask, shape=out_shape, pad_val=pad_val) + for mask in self.masks + ]) + return BitmapMasks(padded_masks, *out_shape) + + def crop(self, bbox): + """See :func:`BaseInstanceMasks.crop`.""" + assert isinstance(bbox, np.ndarray) + assert bbox.ndim == 1 + + # clip the boundary + bbox = bbox.copy() + bbox[0::2] = np.clip(bbox[0::2], 0, self.width) + bbox[1::2] = np.clip(bbox[1::2], 0, self.height) + x1, y1, x2, y2 = bbox + w = np.maximum(x2 - x1, 1) + h = np.maximum(y2 - y1, 1) + + if len(self.masks) == 0: + cropped_masks = np.empty((0, h, w), dtype=np.uint8) + else: + cropped_masks = self.masks[:, y1:y1 + h, x1:x1 + w] + return BitmapMasks(cropped_masks, h, w) + + def crop_and_resize(self, + bboxes, + out_shape, + inds, + device='cpu', + interpolation='bilinear', + binarize=True): + """See :func:`BaseInstanceMasks.crop_and_resize`.""" + if len(self.masks) == 0: + empty_masks = np.empty((0, *out_shape), dtype=np.uint8) + return BitmapMasks(empty_masks, *out_shape) + + # convert bboxes to tensor + if isinstance(bboxes, np.ndarray): + bboxes = torch.from_numpy(bboxes).to(device=device) + if isinstance(inds, np.ndarray): + inds = torch.from_numpy(inds).to(device=device) + + num_bbox = bboxes.shape[0] + fake_inds = torch.arange( + num_bbox, device=device).to(dtype=bboxes.dtype)[:, None] + rois = torch.cat([fake_inds, bboxes], dim=1) # Nx5 + rois = rois.to(device=device) + if num_bbox > 0: + gt_masks_th = torch.from_numpy(self.masks).to(device).index_select( + 0, inds).to(dtype=rois.dtype) + targets = roi_align(gt_masks_th[:, None, :, :], rois, out_shape, + 1.0, 0, 'avg', True).squeeze(1) + if binarize: + resized_masks = (targets >= 0.5).cpu().numpy() + else: + resized_masks = targets.cpu().numpy() + else: + resized_masks = [] + return BitmapMasks(resized_masks, *out_shape) + + def expand(self, expanded_h, expanded_w, top, left): + """See :func:`BaseInstanceMasks.expand`.""" + if len(self.masks) == 0: + expanded_mask = np.empty((0, expanded_h, expanded_w), + dtype=np.uint8) + else: + expanded_mask = np.zeros((len(self), expanded_h, expanded_w), + dtype=np.uint8) + expanded_mask[:, top:top + self.height, + left:left + self.width] = self.masks + return BitmapMasks(expanded_mask, expanded_h, expanded_w) + + def translate(self, + out_shape, + offset, + direction='horizontal', + fill_val=0, + interpolation='bilinear'): + """Translate the BitmapMasks. + + Args: + out_shape (tuple[int]): Shape for output mask, format (h, w). + offset (int | float): The offset for translate. + direction (str): The translate direction, either "horizontal" + or "vertical". + fill_val (int | float): Border value. Default 0 for masks. + interpolation (str): Same as :func:`mmcv.imtranslate`. + + Returns: + BitmapMasks: Translated BitmapMasks. + + Example: + >>> from mmdet.core.mask.structures import BitmapMasks + >>> self = BitmapMasks.random(dtype=np.uint8) + >>> out_shape = (32, 32) + >>> offset = 4 + >>> direction = 'horizontal' + >>> fill_val = 0 + >>> interpolation = 'bilinear' + >>> # Note, There seem to be issues when: + >>> # * out_shape is different than self's shape + >>> # * the mask dtype is not supported by cv2.AffineWarp + >>> new = self.translate(out_shape, offset, direction, fill_val, + >>> interpolation) + >>> assert len(new) == len(self) + >>> assert new.height, new.width == out_shape + """ + if len(self.masks) == 0: + translated_masks = np.empty((0, *out_shape), dtype=np.uint8) + else: + translated_masks = mmcv.imtranslate( + self.masks.transpose((1, 2, 0)), + offset, + direction, + border_value=fill_val, + interpolation=interpolation) + if translated_masks.ndim == 2: + translated_masks = translated_masks[:, :, None] + translated_masks = translated_masks.transpose( + (2, 0, 1)).astype(self.masks.dtype) + return BitmapMasks(translated_masks, *out_shape) + + def shear(self, + out_shape, + magnitude, + direction='horizontal', + border_value=0, + interpolation='bilinear'): + """Shear the BitmapMasks. + + Args: + out_shape (tuple[int]): Shape for output mask, format (h, w). + magnitude (int | float): The magnitude used for shear. + direction (str): The shear direction, either "horizontal" + or "vertical". + border_value (int | tuple[int]): Value used in case of a + constant border. + interpolation (str): Same as in :func:`mmcv.imshear`. + + Returns: + BitmapMasks: The sheared masks. + """ + if len(self.masks) == 0: + sheared_masks = np.empty((0, *out_shape), dtype=np.uint8) + else: + sheared_masks = mmcv.imshear( + self.masks.transpose((1, 2, 0)), + magnitude, + direction, + border_value=border_value, + interpolation=interpolation) + if sheared_masks.ndim == 2: + sheared_masks = sheared_masks[:, :, None] + sheared_masks = sheared_masks.transpose( + (2, 0, 1)).astype(self.masks.dtype) + return BitmapMasks(sheared_masks, *out_shape) + + def rotate(self, out_shape, angle, center=None, scale=1.0, fill_val=0): + """Rotate the BitmapMasks. + + Args: + out_shape (tuple[int]): Shape for output mask, format (h, w). + angle (int | float): Rotation angle in degrees. Positive values + mean counter-clockwise rotation. + center (tuple[float], optional): Center point (w, h) of the + rotation in source image. If not specified, the center of + the image will be used. + scale (int | float): Isotropic scale factor. + fill_val (int | float): Border value. Default 0 for masks. + + Returns: + BitmapMasks: Rotated BitmapMasks. + """ + if len(self.masks) == 0: + rotated_masks = np.empty((0, *out_shape), dtype=self.masks.dtype) + else: + rotated_masks = mmcv.imrotate( + self.masks.transpose((1, 2, 0)), + angle, + center=center, + scale=scale, + border_value=fill_val) + if rotated_masks.ndim == 2: + # case when only one mask, (h, w) + rotated_masks = rotated_masks[:, :, None] # (h, w, 1) + rotated_masks = rotated_masks.transpose( + (2, 0, 1)).astype(self.masks.dtype) + return BitmapMasks(rotated_masks, *out_shape) + + @property + def areas(self): + """See :py:attr:`BaseInstanceMasks.areas`.""" + return self.masks.sum((1, 2)) + + def to_ndarray(self): + """See :func:`BaseInstanceMasks.to_ndarray`.""" + return self.masks + + def to_tensor(self, dtype, device): + """See :func:`BaseInstanceMasks.to_tensor`.""" + return torch.tensor(self.masks, dtype=dtype, device=device) + + @classmethod + def random(cls, + num_masks=3, + height=32, + width=32, + dtype=np.uint8, + rng=None): + """Generate random bitmap masks for demo / testing purposes. + + Example: + >>> from mmdet.core.mask.structures import BitmapMasks + >>> self = BitmapMasks.random() + >>> print('self = {}'.format(self)) + self = BitmapMasks(num_masks=3, height=32, width=32) + """ + from mmdet.utils.util_random import ensure_rng + rng = ensure_rng(rng) + masks = (rng.rand(num_masks, height, width) > 0.1).astype(dtype) + self = cls(masks, height=height, width=width) + return self + + def get_bboxes(self): + num_masks = len(self) + boxes = np.zeros((num_masks, 4), dtype=np.float32) + x_any = self.masks.any(axis=1) + y_any = self.masks.any(axis=2) + for idx in range(num_masks): + x = np.where(x_any[idx, :])[0] + y = np.where(y_any[idx, :])[0] + if len(x) > 0 and len(y) > 0: + # use +1 for x_max and y_max so that the right and bottom + # boundary of instance masks are fully included by the box + boxes[idx, :] = np.array([x[0], y[0], x[-1] + 1, y[-1] + 1], + dtype=np.float32) + return boxes + + +class PolygonMasks(BaseInstanceMasks): + """This class represents masks in the form of polygons. + + Polygons is a list of three levels. The first level of the list + corresponds to objects, the second level to the polys that compose the + object, the third level to the poly coordinates + + Args: + masks (list[list[ndarray]]): The first level of the list + corresponds to objects, the second level to the polys that + compose the object, the third level to the poly coordinates + height (int): height of masks + width (int): width of masks + + Example: + >>> from mmdet.core.mask.structures import * # NOQA + >>> masks = [ + >>> [ np.array([0, 0, 10, 0, 10, 10., 0, 10, 0, 0]) ] + >>> ] + >>> height, width = 16, 16 + >>> self = PolygonMasks(masks, height, width) + + >>> # demo translate + >>> new = self.translate((16, 16), 4., direction='horizontal') + >>> assert np.all(new.masks[0][0][1::2] == masks[0][0][1::2]) + >>> assert np.all(new.masks[0][0][0::2] == masks[0][0][0::2] + 4) + + >>> # demo crop_and_resize + >>> num_boxes = 3 + >>> bboxes = np.array([[0, 0, 30, 10.0]] * num_boxes) + >>> out_shape = (16, 16) + >>> inds = torch.randint(0, len(self), size=(num_boxes,)) + >>> device = 'cpu' + >>> interpolation = 'bilinear' + >>> new = self.crop_and_resize( + ... bboxes, out_shape, inds, device, interpolation) + >>> assert len(new) == num_boxes + >>> assert new.height, new.width == out_shape + """ + + def __init__(self, masks, height, width): + assert isinstance(masks, list) + if len(masks) > 0: + assert isinstance(masks[0], list) + assert isinstance(masks[0][0], np.ndarray) + + self.height = height + self.width = width + self.masks = masks + + def __getitem__(self, index): + """Index the polygon masks. + + Args: + index (ndarray | List): The indices. + + Returns: + :obj:`PolygonMasks`: The indexed polygon masks. + """ + if isinstance(index, np.ndarray): + index = index.tolist() + if isinstance(index, list): + masks = [self.masks[i] for i in index] + else: + try: + masks = self.masks[index] + except Exception: + raise ValueError( + f'Unsupported input of type {type(index)} for indexing!') + if len(masks) and isinstance(masks[0], np.ndarray): + masks = [masks] # ensure a list of three levels + return PolygonMasks(masks, self.height, self.width) + + def __iter__(self): + return iter(self.masks) + + def __repr__(self): + s = self.__class__.__name__ + '(' + s += f'num_masks={len(self.masks)}, ' + s += f'height={self.height}, ' + s += f'width={self.width})' + return s + + def __len__(self): + """Number of masks.""" + return len(self.masks) + + def rescale(self, scale, interpolation=None): + """see :func:`BaseInstanceMasks.rescale`""" + new_w, new_h = mmcv.rescale_size((self.width, self.height), scale) + if len(self.masks) == 0: + rescaled_masks = PolygonMasks([], new_h, new_w) + else: + rescaled_masks = self.resize((new_h, new_w)) + return rescaled_masks + + def resize(self, out_shape, interpolation=None): + """see :func:`BaseInstanceMasks.resize`""" + if len(self.masks) == 0: + resized_masks = PolygonMasks([], *out_shape) + else: + h_scale = out_shape[0] / self.height + w_scale = out_shape[1] / self.width + resized_masks = [] + for poly_per_obj in self.masks: + resized_poly = [] + for p in poly_per_obj: + p = p.copy() + p[0::2] = p[0::2] * w_scale + p[1::2] = p[1::2] * h_scale + resized_poly.append(p) + resized_masks.append(resized_poly) + resized_masks = PolygonMasks(resized_masks, *out_shape) + return resized_masks + + def flip(self, flip_direction='horizontal'): + """see :func:`BaseInstanceMasks.flip`""" + assert flip_direction in ('horizontal', 'vertical', 'diagonal') + if len(self.masks) == 0: + flipped_masks = PolygonMasks([], self.height, self.width) + else: + flipped_masks = [] + for poly_per_obj in self.masks: + flipped_poly_per_obj = [] + for p in poly_per_obj: + p = p.copy() + if flip_direction == 'horizontal': + p[0::2] = self.width - p[0::2] + elif flip_direction == 'vertical': + p[1::2] = self.height - p[1::2] + else: + p[0::2] = self.width - p[0::2] + p[1::2] = self.height - p[1::2] + flipped_poly_per_obj.append(p) + flipped_masks.append(flipped_poly_per_obj) + flipped_masks = PolygonMasks(flipped_masks, self.height, + self.width) + return flipped_masks + + def crop(self, bbox): + """see :func:`BaseInstanceMasks.crop`""" + assert isinstance(bbox, np.ndarray) + assert bbox.ndim == 1 + + # clip the boundary + bbox = bbox.copy() + bbox[0::2] = np.clip(bbox[0::2], 0, self.width) + bbox[1::2] = np.clip(bbox[1::2], 0, self.height) + x1, y1, x2, y2 = bbox + w = np.maximum(x2 - x1, 1) + h = np.maximum(y2 - y1, 1) + + if len(self.masks) == 0: + cropped_masks = PolygonMasks([], h, w) + else: + cropped_masks = [] + for poly_per_obj in self.masks: + cropped_poly_per_obj = [] + for p in poly_per_obj: + # pycocotools will clip the boundary + p = p.copy() + p[0::2] = p[0::2] - bbox[0] + p[1::2] = p[1::2] - bbox[1] + cropped_poly_per_obj.append(p) + cropped_masks.append(cropped_poly_per_obj) + cropped_masks = PolygonMasks(cropped_masks, h, w) + return cropped_masks + + def pad(self, out_shape, pad_val=0): + """padding has no effect on polygons`""" + return PolygonMasks(self.masks, *out_shape) + + def expand(self, *args, **kwargs): + """TODO: Add expand for polygon""" + raise NotImplementedError + + def crop_and_resize(self, + bboxes, + out_shape, + inds, + device='cpu', + interpolation='bilinear', + binarize=True): + """see :func:`BaseInstanceMasks.crop_and_resize`""" + out_h, out_w = out_shape + if len(self.masks) == 0: + return PolygonMasks([], out_h, out_w) + + if not binarize: + raise ValueError('Polygons are always binary, ' + 'setting binarize=False is unsupported') + + resized_masks = [] + for i in range(len(bboxes)): + mask = self.masks[inds[i]] + bbox = bboxes[i, :] + x1, y1, x2, y2 = bbox + w = np.maximum(x2 - x1, 1) + h = np.maximum(y2 - y1, 1) + h_scale = out_h / max(h, 0.1) # avoid too large scale + w_scale = out_w / max(w, 0.1) + + resized_mask = [] + for p in mask: + p = p.copy() + # crop + # pycocotools will clip the boundary + p[0::2] = p[0::2] - bbox[0] + p[1::2] = p[1::2] - bbox[1] + + # resize + p[0::2] = p[0::2] * w_scale + p[1::2] = p[1::2] * h_scale + resized_mask.append(p) + resized_masks.append(resized_mask) + return PolygonMasks(resized_masks, *out_shape) + + def translate(self, + out_shape, + offset, + direction='horizontal', + fill_val=None, + interpolation=None): + """Translate the PolygonMasks. + + Example: + >>> self = PolygonMasks.random(dtype=np.int) + >>> out_shape = (self.height, self.width) + >>> new = self.translate(out_shape, 4., direction='horizontal') + >>> assert np.all(new.masks[0][0][1::2] == self.masks[0][0][1::2]) + >>> assert np.all(new.masks[0][0][0::2] == self.masks[0][0][0::2] + 4) # noqa: E501 + """ + assert fill_val is None or fill_val == 0, 'Here fill_val is not '\ + f'used, and defaultly should be None or 0. got {fill_val}.' + if len(self.masks) == 0: + translated_masks = PolygonMasks([], *out_shape) + else: + translated_masks = [] + for poly_per_obj in self.masks: + translated_poly_per_obj = [] + for p in poly_per_obj: + p = p.copy() + if direction == 'horizontal': + p[0::2] = np.clip(p[0::2] + offset, 0, out_shape[1]) + elif direction == 'vertical': + p[1::2] = np.clip(p[1::2] + offset, 0, out_shape[0]) + translated_poly_per_obj.append(p) + translated_masks.append(translated_poly_per_obj) + translated_masks = PolygonMasks(translated_masks, *out_shape) + return translated_masks + + def shear(self, + out_shape, + magnitude, + direction='horizontal', + border_value=0, + interpolation='bilinear'): + """See :func:`BaseInstanceMasks.shear`.""" + if len(self.masks) == 0: + sheared_masks = PolygonMasks([], *out_shape) + else: + sheared_masks = [] + if direction == 'horizontal': + shear_matrix = np.stack([[1, magnitude], + [0, 1]]).astype(np.float32) + elif direction == 'vertical': + shear_matrix = np.stack([[1, 0], [magnitude, + 1]]).astype(np.float32) + for poly_per_obj in self.masks: + sheared_poly = [] + for p in poly_per_obj: + p = np.stack([p[0::2], p[1::2]], axis=0) # [2, n] + new_coords = np.matmul(shear_matrix, p) # [2, n] + new_coords[0, :] = np.clip(new_coords[0, :], 0, + out_shape[1]) + new_coords[1, :] = np.clip(new_coords[1, :], 0, + out_shape[0]) + sheared_poly.append( + new_coords.transpose((1, 0)).reshape(-1)) + sheared_masks.append(sheared_poly) + sheared_masks = PolygonMasks(sheared_masks, *out_shape) + return sheared_masks + + def rotate(self, out_shape, angle, center=None, scale=1.0, fill_val=0): + """See :func:`BaseInstanceMasks.rotate`.""" + if len(self.masks) == 0: + rotated_masks = PolygonMasks([], *out_shape) + else: + rotated_masks = [] + rotate_matrix = cv2.getRotationMatrix2D(center, -angle, scale) + for poly_per_obj in self.masks: + rotated_poly = [] + for p in poly_per_obj: + p = p.copy() + coords = np.stack([p[0::2], p[1::2]], axis=1) # [n, 2] + # pad 1 to convert from format [x, y] to homogeneous + # coordinates format [x, y, 1] + coords = np.concatenate( + (coords, np.ones((coords.shape[0], 1), coords.dtype)), + axis=1) # [n, 3] + rotated_coords = np.matmul( + rotate_matrix[None, :, :], + coords[:, :, None])[..., 0] # [n, 2, 1] -> [n, 2] + rotated_coords[:, 0] = np.clip(rotated_coords[:, 0], 0, + out_shape[1]) + rotated_coords[:, 1] = np.clip(rotated_coords[:, 1], 0, + out_shape[0]) + rotated_poly.append(rotated_coords.reshape(-1)) + rotated_masks.append(rotated_poly) + rotated_masks = PolygonMasks(rotated_masks, *out_shape) + return rotated_masks + + def to_bitmap(self): + """convert polygon masks to bitmap masks.""" + bitmap_masks = self.to_ndarray() + return BitmapMasks(bitmap_masks, self.height, self.width) + + @property + def areas(self): + """Compute areas of masks. + + This func is modified from `detectron2 + `_. + The function only works with Polygons using the shoelace formula. + + Return: + ndarray: areas of each instance + """ # noqa: W501 + area = [] + for polygons_per_obj in self.masks: + area_per_obj = 0 + for p in polygons_per_obj: + area_per_obj += self._polygon_area(p[0::2], p[1::2]) + area.append(area_per_obj) + return np.asarray(area) + + def _polygon_area(self, x, y): + """Compute the area of a component of a polygon. + + Using the shoelace formula: + https://stackoverflow.com/questions/24467972/calculate-area-of-polygon-given-x-y-coordinates + + Args: + x (ndarray): x coordinates of the component + y (ndarray): y coordinates of the component + + Return: + float: the are of the component + """ # noqa: 501 + return 0.5 * np.abs( + np.dot(x, np.roll(y, 1)) - np.dot(y, np.roll(x, 1))) + + def to_ndarray(self): + """Convert masks to the format of ndarray.""" + if len(self.masks) == 0: + return np.empty((0, self.height, self.width), dtype=np.uint8) + bitmap_masks = [] + for poly_per_obj in self.masks: + bitmap_masks.append( + polygon_to_bitmap(poly_per_obj, self.height, self.width)) + return np.stack(bitmap_masks) + + def to_tensor(self, dtype, device): + """See :func:`BaseInstanceMasks.to_tensor`.""" + if len(self.masks) == 0: + return torch.empty((0, self.height, self.width), + dtype=dtype, + device=device) + ndarray_masks = self.to_ndarray() + return torch.tensor(ndarray_masks, dtype=dtype, device=device) + + @classmethod + def random(cls, + num_masks=3, + height=32, + width=32, + n_verts=5, + dtype=np.float32, + rng=None): + """Generate random polygon masks for demo / testing purposes. + + Adapted from [1]_ + + References: + .. [1] https://gitlab.kitware.com/computer-vision/kwimage/-/blob/928cae35ca8/kwimage/structs/polygon.py#L379 # noqa: E501 + + Example: + >>> from mmdet.core.mask.structures import PolygonMasks + >>> self = PolygonMasks.random() + >>> print('self = {}'.format(self)) + """ + from mmdet.utils.util_random import ensure_rng + rng = ensure_rng(rng) + + def _gen_polygon(n, irregularity, spikeyness): + """Creates the polygon by sampling points on a circle around the + centre. Random noise is added by varying the angular spacing + between sequential points, and by varying the radial distance of + each point from the centre. + + Based on original code by Mike Ounsworth + + Args: + n (int): number of vertices + irregularity (float): [0,1] indicating how much variance there + is in the angular spacing of vertices. [0,1] will map to + [0, 2pi/numberOfVerts] + spikeyness (float): [0,1] indicating how much variance there is + in each vertex from the circle of radius aveRadius. [0,1] + will map to [0, aveRadius] + + Returns: + a list of vertices, in CCW order. + """ + from scipy.stats import truncnorm + + # Generate around the unit circle + cx, cy = (0.0, 0.0) + radius = 1 + + tau = np.pi * 2 + + irregularity = np.clip(irregularity, 0, 1) * 2 * np.pi / n + spikeyness = np.clip(spikeyness, 1e-9, 1) + + # generate n angle steps + lower = (tau / n) - irregularity + upper = (tau / n) + irregularity + angle_steps = rng.uniform(lower, upper, n) + + # normalize the steps so that point 0 and point n+1 are the same + k = angle_steps.sum() / (2 * np.pi) + angles = (angle_steps / k).cumsum() + rng.uniform(0, tau) + + # Convert high and low values to be wrt the standard normal range + # https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.truncnorm.html + low = 0 + high = 2 * radius + mean = radius + std = spikeyness + a = (low - mean) / std + b = (high - mean) / std + tnorm = truncnorm(a=a, b=b, loc=mean, scale=std) + + # now generate the points + radii = tnorm.rvs(n, random_state=rng) + x_pts = cx + radii * np.cos(angles) + y_pts = cy + radii * np.sin(angles) + + points = np.hstack([x_pts[:, None], y_pts[:, None]]) + + # Scale to 0-1 space + points = points - points.min(axis=0) + points = points / points.max(axis=0) + + # Randomly place within 0-1 space + points = points * (rng.rand() * .8 + .2) + min_pt = points.min(axis=0) + max_pt = points.max(axis=0) + + high = (1 - max_pt) + low = (0 - min_pt) + offset = (rng.rand(2) * (high - low)) + low + points = points + offset + return points + + def _order_vertices(verts): + """ + References: + https://stackoverflow.com/questions/1709283/how-can-i-sort-a-coordinate-list-for-a-rectangle-counterclockwise + """ + mlat = verts.T[0].sum() / len(verts) + mlng = verts.T[1].sum() / len(verts) + + tau = np.pi * 2 + angle = (np.arctan2(mlat - verts.T[0], verts.T[1] - mlng) + + tau) % tau + sortx = angle.argsort() + verts = verts.take(sortx, axis=0) + return verts + + # Generate a random exterior for each requested mask + masks = [] + for _ in range(num_masks): + exterior = _order_vertices(_gen_polygon(n_verts, 0.9, 0.9)) + exterior = (exterior * [(width, height)]).astype(dtype) + masks.append([exterior.ravel()]) + + self = cls(masks, height, width) + return self + + def get_bboxes(self): + num_masks = len(self) + boxes = np.zeros((num_masks, 4), dtype=np.float32) + for idx, poly_per_obj in enumerate(self.masks): + # simply use a number that is big enough for comparison with + # coordinates + xy_min = np.array([self.width * 2, self.height * 2], + dtype=np.float32) + xy_max = np.zeros(2, dtype=np.float32) + for p in poly_per_obj: + xy = np.array(p).reshape(-1, 2).astype(np.float32) + xy_min = np.minimum(xy_min, np.min(xy, axis=0)) + xy_max = np.maximum(xy_max, np.max(xy, axis=0)) + boxes[idx, :2] = xy_min + boxes[idx, 2:] = xy_max + + return boxes + + +def polygon_to_bitmap(polygons, height, width): + """Convert masks from the form of polygons to bitmaps. + + Args: + polygons (list[ndarray]): masks in polygon representation + height (int): mask height + width (int): mask width + + Return: + ndarray: the converted masks in bitmap representation + """ + rles = maskUtils.frPyObjects(polygons, height, width) + rle = maskUtils.merge(rles) + bitmap_mask = maskUtils.decode(rle).astype(bool) + return bitmap_mask + + +def bitmap_to_polygon(bitmap): + """Convert masks from the form of bitmaps to polygons. + + Args: + bitmap (ndarray): masks in bitmap representation. + + Return: + list[ndarray]: the converted mask in polygon representation. + bool: whether the mask has holes. + """ + bitmap = np.ascontiguousarray(bitmap).astype(np.uint8) + # cv2.RETR_CCOMP: retrieves all of the contours and organizes them + # into a two-level hierarchy. At the top level, there are external + # boundaries of the components. At the second level, there are + # boundaries of the holes. If there is another contour inside a hole + # of a connected component, it is still put at the top level. + # cv2.CHAIN_APPROX_NONE: stores absolutely all the contour points. + outs = cv2.findContours(bitmap, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_NONE) + contours = outs[-2] + hierarchy = outs[-1] + if hierarchy is None: + return [], False + # hierarchy[i]: 4 elements, for the indexes of next, previous, + # parent, or nested contours. If there is no corresponding contour, + # it will be -1. + with_hole = (hierarchy.reshape(-1, 4)[:, 3] >= 0).any() + contours = [c.reshape(-1, 2) for c in contours] + return contours, with_hole diff --git a/mmdet/core/mask/utils.py b/mmdet/core/mask/utils.py new file mode 100644 index 0000000..90544b3 --- /dev/null +++ b/mmdet/core/mask/utils.py @@ -0,0 +1,89 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import numpy as np +import pycocotools.mask as mask_util +import torch + + +def split_combined_polys(polys, poly_lens, polys_per_mask): + """Split the combined 1-D polys into masks. + + A mask is represented as a list of polys, and a poly is represented as + a 1-D array. In dataset, all masks are concatenated into a single 1-D + tensor. Here we need to split the tensor into original representations. + + Args: + polys (list): a list (length = image num) of 1-D tensors + poly_lens (list): a list (length = image num) of poly length + polys_per_mask (list): a list (length = image num) of poly number + of each mask + + Returns: + list: a list (length = image num) of list (length = mask num) of \ + list (length = poly num) of numpy array. + """ + mask_polys_list = [] + for img_id in range(len(polys)): + polys_single = polys[img_id] + polys_lens_single = poly_lens[img_id].tolist() + polys_per_mask_single = polys_per_mask[img_id].tolist() + + split_polys = mmcv.slice_list(polys_single, polys_lens_single) + mask_polys = mmcv.slice_list(split_polys, polys_per_mask_single) + mask_polys_list.append(mask_polys) + return mask_polys_list + + +# TODO: move this function to more proper place +def encode_mask_results(mask_results): + """Encode bitmap mask to RLE code. + + Args: + mask_results (list | tuple[list]): bitmap mask results. + In mask scoring rcnn, mask_results is a tuple of (segm_results, + segm_cls_score). + + Returns: + list | tuple: RLE encoded mask. + """ + if isinstance(mask_results, tuple): # mask scoring + cls_segms, cls_mask_scores = mask_results + else: + cls_segms = mask_results + num_classes = len(cls_segms) + encoded_mask_results = [[] for _ in range(num_classes)] + for i in range(len(cls_segms)): + for cls_segm in cls_segms[i]: + encoded_mask_results[i].append( + mask_util.encode( + np.array( + cls_segm[:, :, np.newaxis], order='F', + dtype='uint8'))[0]) # encoded with RLE + if isinstance(mask_results, tuple): + return encoded_mask_results, cls_mask_scores + else: + return encoded_mask_results + + +def mask2bbox(masks): + """Obtain tight bounding boxes of binary masks. + + Args: + masks (Tensor): Binary mask of shape (n, h, w). + + Returns: + Tensor: Bboxe with shape (n, 4) of \ + positive region in binary mask. + """ + N = masks.shape[0] + bboxes = masks.new_zeros((N, 4), dtype=torch.float32) + x_any = torch.any(masks, dim=1) + y_any = torch.any(masks, dim=2) + for i in range(N): + x = torch.where(x_any[i, :])[0] + y = torch.where(y_any[i, :])[0] + if len(x) > 0 and len(y) > 0: + bboxes[i, :] = bboxes.new_tensor( + [x[0], y[0], x[-1] + 1, y[-1] + 1]) + + return bboxes diff --git a/mmdet/core/optimizers/__init__.py b/mmdet/core/optimizers/__init__.py new file mode 100644 index 0000000..e867d07 --- /dev/null +++ b/mmdet/core/optimizers/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .builder import OPTIMIZER_BUILDERS, build_optimizer +from .layer_decay_optimizer_constructor import \ + LearningRateDecayOptimizerConstructor + +__all__ = [ + 'LearningRateDecayOptimizerConstructor', 'OPTIMIZER_BUILDERS', + 'build_optimizer' +] diff --git a/mmdet/core/optimizers/builder.py b/mmdet/core/optimizers/builder.py new file mode 100644 index 0000000..406dd9b --- /dev/null +++ b/mmdet/core/optimizers/builder.py @@ -0,0 +1,33 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy + +from mmcv.runner.optimizer import OPTIMIZER_BUILDERS as MMCV_OPTIMIZER_BUILDERS +from mmcv.utils import Registry, build_from_cfg + +OPTIMIZER_BUILDERS = Registry( + 'optimizer builder', parent=MMCV_OPTIMIZER_BUILDERS) + + +def build_optimizer_constructor(cfg): + constructor_type = cfg.get('type') + if constructor_type in OPTIMIZER_BUILDERS: + return build_from_cfg(cfg, OPTIMIZER_BUILDERS) + elif constructor_type in MMCV_OPTIMIZER_BUILDERS: + return build_from_cfg(cfg, MMCV_OPTIMIZER_BUILDERS) + else: + raise KeyError(f'{constructor_type} is not registered ' + 'in the optimizer builder registry.') + + +def build_optimizer(model, cfg): + optimizer_cfg = copy.deepcopy(cfg) + constructor_type = optimizer_cfg.pop('constructor', + 'DefaultOptimizerConstructor') + paramwise_cfg = optimizer_cfg.pop('paramwise_cfg', None) + optim_constructor = build_optimizer_constructor( + dict( + type=constructor_type, + optimizer_cfg=optimizer_cfg, + paramwise_cfg=paramwise_cfg)) + optimizer = optim_constructor(model) + return optimizer diff --git a/mmdet/core/optimizers/layer_decay_optimizer_constructor.py b/mmdet/core/optimizers/layer_decay_optimizer_constructor.py new file mode 100644 index 0000000..1bc3469 --- /dev/null +++ b/mmdet/core/optimizers/layer_decay_optimizer_constructor.py @@ -0,0 +1,154 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import json + +from mmcv.runner import DefaultOptimizerConstructor, get_dist_info + +from mmdet.utils import get_root_logger +from .builder import OPTIMIZER_BUILDERS + + +def get_layer_id_for_convnext(var_name, max_layer_id): + """Get the layer id to set the different learning rates in ``layer_wise`` + decay_type. + + Args: + var_name (str): The key of the model. + max_layer_id (int): Maximum layer id. + + Returns: + int: The id number corresponding to different learning rate in + ``LearningRateDecayOptimizerConstructor``. + """ + + if var_name in ('backbone.cls_token', 'backbone.mask_token', + 'backbone.pos_embed'): + return 0 + elif var_name.startswith('backbone.downsample_layers'): + stage_id = int(var_name.split('.')[2]) + if stage_id == 0: + layer_id = 0 + elif stage_id == 1: + layer_id = 2 + elif stage_id == 2: + layer_id = 3 + elif stage_id == 3: + layer_id = max_layer_id + return layer_id + elif var_name.startswith('backbone.stages'): + stage_id = int(var_name.split('.')[2]) + block_id = int(var_name.split('.')[3]) + if stage_id == 0: + layer_id = 1 + elif stage_id == 1: + layer_id = 2 + elif stage_id == 2: + layer_id = 3 + block_id // 3 + elif stage_id == 3: + layer_id = max_layer_id + return layer_id + else: + return max_layer_id + 1 + + +def get_stage_id_for_convnext(var_name, max_stage_id): + """Get the stage id to set the different learning rates in ``stage_wise`` + decay_type. + + Args: + var_name (str): The key of the model. + max_stage_id (int): Maximum stage id. + + Returns: + int: The id number corresponding to different learning rate in + ``LearningRateDecayOptimizerConstructor``. + """ + + if var_name in ('backbone.cls_token', 'backbone.mask_token', + 'backbone.pos_embed'): + return 0 + elif var_name.startswith('backbone.downsample_layers'): + return 0 + elif var_name.startswith('backbone.stages'): + stage_id = int(var_name.split('.')[2]) + return stage_id + 1 + else: + return max_stage_id - 1 + + +@OPTIMIZER_BUILDERS.register_module() +class LearningRateDecayOptimizerConstructor(DefaultOptimizerConstructor): + # Different learning rates are set for different layers of backbone. + # Note: Currently, this optimizer constructor is built for ConvNeXt. + + def add_params(self, params, module, **kwargs): + """Add all parameters of module to the params list. + + The parameters of the given module will be added to the list of param + groups, with specific rules defined by paramwise_cfg. + + Args: + params (list[dict]): A list of param groups, it will be modified + in place. + module (nn.Module): The module to be added. + """ + logger = get_root_logger() + + parameter_groups = {} + logger.info(f'self.paramwise_cfg is {self.paramwise_cfg}') + num_layers = self.paramwise_cfg.get('num_layers') + 2 + decay_rate = self.paramwise_cfg.get('decay_rate') + decay_type = self.paramwise_cfg.get('decay_type', 'layer_wise') + logger.info('Build LearningRateDecayOptimizerConstructor ' + f'{decay_type} {decay_rate} - {num_layers}') + weight_decay = self.base_wd + for name, param in module.named_parameters(): + if not param.requires_grad: + continue # frozen weights + if len(param.shape) == 1 or name.endswith('.bias') or name in ( + 'pos_embed', 'cls_token'): + group_name = 'no_decay' + this_weight_decay = 0. + else: + group_name = 'decay' + this_weight_decay = weight_decay + if 'layer_wise' in decay_type: + if 'ConvNeXt' in module.backbone.__class__.__name__: + layer_id = get_layer_id_for_convnext( + name, self.paramwise_cfg.get('num_layers')) + logger.info(f'set param {name} as id {layer_id}') + else: + raise NotImplementedError() + elif decay_type == 'stage_wise': + if 'ConvNeXt' in module.backbone.__class__.__name__: + layer_id = get_stage_id_for_convnext(name, num_layers) + logger.info(f'set param {name} as id {layer_id}') + else: + raise NotImplementedError() + group_name = f'layer_{layer_id}_{group_name}' + + if group_name not in parameter_groups: + scale = decay_rate**(num_layers - layer_id - 1) + + parameter_groups[group_name] = { + 'weight_decay': this_weight_decay, + 'params': [], + 'param_names': [], + 'lr_scale': scale, + 'group_name': group_name, + 'lr': scale * self.base_lr, + } + + parameter_groups[group_name]['params'].append(param) + parameter_groups[group_name]['param_names'].append(name) + rank, _ = get_dist_info() + if rank == 0: + to_display = {} + for key in parameter_groups: + to_display[key] = { + 'param_names': parameter_groups[key]['param_names'], + 'lr_scale': parameter_groups[key]['lr_scale'], + 'lr': parameter_groups[key]['lr'], + 'weight_decay': parameter_groups[key]['weight_decay'], + } + logger.info(f'Param groups = {json.dumps(to_display, indent=2)}') + params.extend(parameter_groups.values()) diff --git a/mmdet/core/post_processing/__init__.py b/mmdet/core/post_processing/__init__.py new file mode 100644 index 0000000..00376bd --- /dev/null +++ b/mmdet/core/post_processing/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .bbox_nms import fast_nms, multiclass_nms +from .matrix_nms import mask_matrix_nms +from .merge_augs import (merge_aug_bboxes, merge_aug_masks, + merge_aug_proposals, merge_aug_scores) + +__all__ = [ + 'multiclass_nms', 'merge_aug_proposals', 'merge_aug_bboxes', + 'merge_aug_scores', 'merge_aug_masks', 'mask_matrix_nms', 'fast_nms' +] diff --git a/mmdet/core/post_processing/bbox_nms.py b/mmdet/core/post_processing/bbox_nms.py new file mode 100644 index 0000000..4fcf57b --- /dev/null +++ b/mmdet/core/post_processing/bbox_nms.py @@ -0,0 +1,171 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +from mmcv.ops.nms import batched_nms + +from mmdet.core.bbox.iou_calculators import bbox_overlaps + + +def multiclass_nms(multi_bboxes, + multi_scores, + score_thr, + nms_cfg, + max_num=-1, + score_factors=None, + return_inds=False): + """NMS for multi-class bboxes. + + Args: + multi_bboxes (Tensor): shape (n, #class*4) or (n, 4) + multi_scores (Tensor): shape (n, #class), where the last column + contains scores of the background class, but this will be ignored. + score_thr (float): bbox threshold, bboxes with scores lower than it + will not be considered. + nms_cfg (dict): a dict that contains the arguments of nms operations + max_num (int, optional): if there are more than max_num bboxes after + NMS, only top max_num will be kept. Default to -1. + score_factors (Tensor, optional): The factors multiplied to scores + before applying NMS. Default to None. + return_inds (bool, optional): Whether return the indices of kept + bboxes. Default to False. + + Returns: + tuple: (dets, labels, indices (optional)), tensors of shape (k, 5), + (k), and (k). Dets are boxes with scores. Labels are 0-based. + """ + num_classes = multi_scores.size(1) - 1 + # exclude background category + if multi_bboxes.shape[1] > 4: + bboxes = multi_bboxes.view(multi_scores.size(0), -1, 4) + else: + bboxes = multi_bboxes[:, None].expand( + multi_scores.size(0), num_classes, 4) + + scores = multi_scores[:, :-1] + + labels = torch.arange(num_classes, dtype=torch.long, device=scores.device) + labels = labels.view(1, -1).expand_as(scores) + + bboxes = bboxes.reshape(-1, 4) + scores = scores.reshape(-1) + labels = labels.reshape(-1) + + if not torch.onnx.is_in_onnx_export(): + # NonZero not supported in TensorRT + # remove low scoring boxes + valid_mask = scores > score_thr + # multiply score_factor after threshold to preserve more bboxes, improve + # mAP by 1% for YOLOv3 + if score_factors is not None: + # expand the shape to match original shape of score + score_factors = score_factors.view(-1, 1).expand( + multi_scores.size(0), num_classes) + score_factors = score_factors.reshape(-1) + scores = scores * score_factors + + if not torch.onnx.is_in_onnx_export(): + # NonZero not supported in TensorRT + inds = valid_mask.nonzero(as_tuple=False).squeeze(1) + bboxes, scores, labels = bboxes[inds], scores[inds], labels[inds] + else: + # TensorRT NMS plugin has invalid output filled with -1 + # add dummy data to make detection output correct. + bboxes = torch.cat([bboxes, bboxes.new_zeros(1, 4)], dim=0) + scores = torch.cat([scores, scores.new_zeros(1)], dim=0) + labels = torch.cat([labels, labels.new_zeros(1)], dim=0) + + if bboxes.numel() == 0: + if torch.onnx.is_in_onnx_export(): + raise RuntimeError('[ONNX Error] Can not record NMS ' + 'as it has not been executed this time') + dets = torch.cat([bboxes, scores[:, None]], -1) + if return_inds: + return dets, labels, inds + else: + return dets, labels + + dets, keep = batched_nms(bboxes, scores, labels, nms_cfg) + + if max_num > 0: + dets = dets[:max_num] + keep = keep[:max_num] + + if return_inds: + return dets, labels[keep], inds[keep] + else: + return dets, labels[keep] + + +def fast_nms(multi_bboxes, + multi_scores, + multi_coeffs, + score_thr, + iou_thr, + top_k, + max_num=-1): + """Fast NMS in `YOLACT `_. + + Fast NMS allows already-removed detections to suppress other detections so + that every instance can be decided to be kept or discarded in parallel, + which is not possible in traditional NMS. This relaxation allows us to + implement Fast NMS entirely in standard GPU-accelerated matrix operations. + + Args: + multi_bboxes (Tensor): shape (n, #class*4) or (n, 4) + multi_scores (Tensor): shape (n, #class+1), where the last column + contains scores of the background class, but this will be ignored. + multi_coeffs (Tensor): shape (n, #class*coeffs_dim). + score_thr (float): bbox threshold, bboxes with scores lower than it + will not be considered. + iou_thr (float): IoU threshold to be considered as conflicted. + top_k (int): if there are more than top_k bboxes before NMS, + only top top_k will be kept. + max_num (int): if there are more than max_num bboxes after NMS, + only top max_num will be kept. If -1, keep all the bboxes. + Default: -1. + + Returns: + tuple: (dets, labels, coefficients), tensors of shape (k, 5), (k, 1), + and (k, coeffs_dim). Dets are boxes with scores. + Labels are 0-based. + """ + + scores = multi_scores[:, :-1].t() # [#class, n] + scores, idx = scores.sort(1, descending=True) + + idx = idx[:, :top_k].contiguous() + scores = scores[:, :top_k] # [#class, topk] + num_classes, num_dets = idx.size() + boxes = multi_bboxes[idx.view(-1), :].view(num_classes, num_dets, 4) + coeffs = multi_coeffs[idx.view(-1), :].view(num_classes, num_dets, -1) + + iou = bbox_overlaps(boxes, boxes) # [#class, topk, topk] + iou.triu_(diagonal=1) + iou_max, _ = iou.max(dim=1) + + # Now just filter out the ones higher than the threshold + keep = iou_max <= iou_thr + + # Second thresholding introduces 0.2 mAP gain at negligible time cost + keep *= scores > score_thr + + # Assign each kept detection to its corresponding class + classes = torch.arange( + num_classes, device=boxes.device)[:, None].expand_as(keep) + classes = classes[keep] + + boxes = boxes[keep] + coeffs = coeffs[keep] + scores = scores[keep] + + # Only keep the top max_num highest scores across all classes + scores, idx = scores.sort(0, descending=True) + if max_num > 0: + idx = idx[:max_num] + scores = scores[:max_num] + + classes = classes[idx] + boxes = boxes[idx] + coeffs = coeffs[idx] + + cls_dets = torch.cat([boxes, scores[:, None]], dim=1) + return cls_dets, classes, coeffs diff --git a/mmdet/core/post_processing/matrix_nms.py b/mmdet/core/post_processing/matrix_nms.py new file mode 100644 index 0000000..9dc8c4f --- /dev/null +++ b/mmdet/core/post_processing/matrix_nms.py @@ -0,0 +1,121 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + + +def mask_matrix_nms(masks, + labels, + scores, + filter_thr=-1, + nms_pre=-1, + max_num=-1, + kernel='gaussian', + sigma=2.0, + mask_area=None): + """Matrix NMS for multi-class masks. + + Args: + masks (Tensor): Has shape (num_instances, h, w) + labels (Tensor): Labels of corresponding masks, + has shape (num_instances,). + scores (Tensor): Mask scores of corresponding masks, + has shape (num_instances). + filter_thr (float): Score threshold to filter the masks + after matrix nms. Default: -1, which means do not + use filter_thr. + nms_pre (int): The max number of instances to do the matrix nms. + Default: -1, which means do not use nms_pre. + max_num (int, optional): If there are more than max_num masks after + matrix, only top max_num will be kept. Default: -1, which means + do not use max_num. + kernel (str): 'linear' or 'gaussian'. + sigma (float): std in gaussian method. + mask_area (Tensor): The sum of seg_masks. + + Returns: + tuple(Tensor): Processed mask results. + + - scores (Tensor): Updated scores, has shape (n,). + - labels (Tensor): Remained labels, has shape (n,). + - masks (Tensor): Remained masks, has shape (n, w, h). + - keep_inds (Tensor): The indices number of + the remaining mask in the input mask, has shape (n,). + """ + assert len(labels) == len(masks) == len(scores) + if len(labels) == 0: + return scores.new_zeros(0), labels.new_zeros(0), masks.new_zeros( + 0, *masks.shape[-2:]), labels.new_zeros(0) + if mask_area is None: + mask_area = masks.sum((1, 2)).float() + else: + assert len(masks) == len(mask_area) + + # sort and keep top nms_pre + scores, sort_inds = torch.sort(scores, descending=True) + + keep_inds = sort_inds + if nms_pre > 0 and len(sort_inds) > nms_pre: + sort_inds = sort_inds[:nms_pre] + keep_inds = keep_inds[:nms_pre] + scores = scores[:nms_pre] + masks = masks[sort_inds] + mask_area = mask_area[sort_inds] + labels = labels[sort_inds] + + num_masks = len(labels) + flatten_masks = masks.reshape(num_masks, -1).float() + # inter. + inter_matrix = torch.mm(flatten_masks, flatten_masks.transpose(1, 0)) + expanded_mask_area = mask_area.expand(num_masks, num_masks) + # Upper triangle iou matrix. + iou_matrix = (inter_matrix / + (expanded_mask_area + expanded_mask_area.transpose(1, 0) - + inter_matrix)).triu(diagonal=1) + # label_specific matrix. + expanded_labels = labels.expand(num_masks, num_masks) + # Upper triangle label matrix. + label_matrix = (expanded_labels == expanded_labels.transpose( + 1, 0)).triu(diagonal=1) + + # IoU compensation + compensate_iou, _ = (iou_matrix * label_matrix).max(0) + compensate_iou = compensate_iou.expand(num_masks, + num_masks).transpose(1, 0) + + # IoU decay + decay_iou = iou_matrix * label_matrix + + # Calculate the decay_coefficient + if kernel == 'gaussian': + decay_matrix = torch.exp(-1 * sigma * (decay_iou**2)) + compensate_matrix = torch.exp(-1 * sigma * (compensate_iou**2)) + decay_coefficient, _ = (decay_matrix / compensate_matrix).min(0) + elif kernel == 'linear': + decay_matrix = (1 - decay_iou) / (1 - compensate_iou) + decay_coefficient, _ = decay_matrix.min(0) + else: + raise NotImplementedError( + f'{kernel} kernel is not supported in matrix nms!') + # update the score. + scores = scores * decay_coefficient + + if filter_thr > 0: + keep = scores >= filter_thr + keep_inds = keep_inds[keep] + if not keep.any(): + return scores.new_zeros(0), labels.new_zeros(0), masks.new_zeros( + 0, *masks.shape[-2:]), labels.new_zeros(0) + masks = masks[keep] + scores = scores[keep] + labels = labels[keep] + + # sort and keep top max_num + scores, sort_inds = torch.sort(scores, descending=True) + keep_inds = keep_inds[sort_inds] + if max_num > 0 and len(sort_inds) > max_num: + sort_inds = sort_inds[:max_num] + keep_inds = keep_inds[:max_num] + scores = scores[:max_num] + masks = masks[sort_inds] + labels = labels[sort_inds] + + return scores, labels, masks, keep_inds diff --git a/mmdet/core/post_processing/merge_augs.py b/mmdet/core/post_processing/merge_augs.py new file mode 100644 index 0000000..2ac4603 --- /dev/null +++ b/mmdet/core/post_processing/merge_augs.py @@ -0,0 +1,154 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy +import warnings + +import numpy as np +import torch +from mmcv import ConfigDict +from mmcv.ops import nms + +from ..bbox import bbox_mapping_back + + +def merge_aug_proposals(aug_proposals, img_metas, cfg): + """Merge augmented proposals (multiscale, flip, etc.) + + Args: + aug_proposals (list[Tensor]): proposals from different testing + schemes, shape (n, 5). Note that they are not rescaled to the + original image size. + + img_metas (list[dict]): list of image info dict where each dict has: + 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmdet/datasets/pipelines/formatting.py:Collect`. + + cfg (dict): rpn test config. + + Returns: + Tensor: shape (n, 4), proposals corresponding to original image scale. + """ + + cfg = copy.deepcopy(cfg) + + # deprecate arguments warning + if 'nms' not in cfg or 'max_num' in cfg or 'nms_thr' in cfg: + warnings.warn( + 'In rpn_proposal or test_cfg, ' + 'nms_thr has been moved to a dict named nms as ' + 'iou_threshold, max_num has been renamed as max_per_img, ' + 'name of original arguments and the way to specify ' + 'iou_threshold of NMS will be deprecated.') + if 'nms' not in cfg: + cfg.nms = ConfigDict(dict(type='nms', iou_threshold=cfg.nms_thr)) + if 'max_num' in cfg: + if 'max_per_img' in cfg: + assert cfg.max_num == cfg.max_per_img, f'You set max_num and ' \ + f'max_per_img at the same time, but get {cfg.max_num} ' \ + f'and {cfg.max_per_img} respectively' \ + f'Please delete max_num which will be deprecated.' + else: + cfg.max_per_img = cfg.max_num + if 'nms_thr' in cfg: + assert cfg.nms.iou_threshold == cfg.nms_thr, f'You set ' \ + f'iou_threshold in nms and ' \ + f'nms_thr at the same time, but get ' \ + f'{cfg.nms.iou_threshold} and {cfg.nms_thr}' \ + f' respectively. Please delete the nms_thr ' \ + f'which will be deprecated.' + + recovered_proposals = [] + for proposals, img_info in zip(aug_proposals, img_metas): + img_shape = img_info['img_shape'] + scale_factor = img_info['scale_factor'] + flip = img_info['flip'] + flip_direction = img_info['flip_direction'] + _proposals = proposals.clone() + _proposals[:, :4] = bbox_mapping_back(_proposals[:, :4], img_shape, + scale_factor, flip, + flip_direction) + recovered_proposals.append(_proposals) + aug_proposals = torch.cat(recovered_proposals, dim=0) + merged_proposals, _ = nms(aug_proposals[:, :4].contiguous(), + aug_proposals[:, -1].contiguous(), + cfg.nms.iou_threshold) + scores = merged_proposals[:, 4] + _, order = scores.sort(0, descending=True) + num = min(cfg.max_per_img, merged_proposals.shape[0]) + order = order[:num] + merged_proposals = merged_proposals[order, :] + return merged_proposals + + +def merge_aug_bboxes(aug_bboxes, aug_scores, img_metas, rcnn_test_cfg): + """Merge augmented detection bboxes and scores. + + Args: + aug_bboxes (list[Tensor]): shape (n, 4*#class) + aug_scores (list[Tensor] or None): shape (n, #class) + img_shapes (list[Tensor]): shape (3, ). + rcnn_test_cfg (dict): rcnn test config. + + Returns: + tuple: (bboxes, scores) + """ + recovered_bboxes = [] + for bboxes, img_info in zip(aug_bboxes, img_metas): + img_shape = img_info[0]['img_shape'] + scale_factor = img_info[0]['scale_factor'] + flip = img_info[0]['flip'] + flip_direction = img_info[0]['flip_direction'] + bboxes = bbox_mapping_back(bboxes, img_shape, scale_factor, flip, + flip_direction) + recovered_bboxes.append(bboxes) + bboxes = torch.stack(recovered_bboxes).mean(dim=0) + if aug_scores is None: + return bboxes + else: + scores = torch.stack(aug_scores).mean(dim=0) + return bboxes, scores + + +def merge_aug_scores(aug_scores): + """Merge augmented bbox scores.""" + if isinstance(aug_scores[0], torch.Tensor): + return torch.mean(torch.stack(aug_scores), dim=0) + else: + return np.mean(aug_scores, axis=0) + + +def merge_aug_masks(aug_masks, img_metas, rcnn_test_cfg, weights=None): + """Merge augmented mask prediction. + + Args: + aug_masks (list[ndarray]): shape (n, #class, h, w) + img_shapes (list[ndarray]): shape (3, ). + rcnn_test_cfg (dict): rcnn test config. + + Returns: + tuple: (bboxes, scores) + """ + recovered_masks = [] + for mask, img_info in zip(aug_masks, img_metas): + flip = img_info[0]['flip'] + if flip: + flip_direction = img_info[0]['flip_direction'] + if flip_direction == 'horizontal': + mask = mask[:, :, :, ::-1] + elif flip_direction == 'vertical': + mask = mask[:, :, ::-1, :] + elif flip_direction == 'diagonal': + mask = mask[:, :, :, ::-1] + mask = mask[:, :, ::-1, :] + else: + raise ValueError( + f"Invalid flipping direction '{flip_direction}'") + recovered_masks.append(mask) + + if weights is None: + merged_masks = np.mean(recovered_masks, axis=0) + else: + merged_masks = np.average( + np.array(recovered_masks), axis=0, weights=np.array(weights)) + return merged_masks diff --git a/mmdet/core/utils/__init__.py b/mmdet/core/utils/__init__.py new file mode 100644 index 0000000..3f0d070 --- /dev/null +++ b/mmdet/core/utils/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .dist_utils import (DistOptimizerHook, all_reduce_dict, allreduce_grads, + reduce_mean, sync_random_seed) +from .misc import (center_of_mass, filter_scores_and_topk, flip_tensor, + generate_coordinate, mask2ndarray, multi_apply, + select_single_mlvl, unmap) + +__all__ = [ + 'allreduce_grads', 'DistOptimizerHook', 'reduce_mean', 'multi_apply', + 'unmap', 'mask2ndarray', 'flip_tensor', 'all_reduce_dict', + 'center_of_mass', 'generate_coordinate', 'select_single_mlvl', + 'filter_scores_and_topk', 'sync_random_seed' +] diff --git a/mmdet/core/utils/dist_utils.py b/mmdet/core/utils/dist_utils.py new file mode 100644 index 0000000..8760774 --- /dev/null +++ b/mmdet/core/utils/dist_utils.py @@ -0,0 +1,193 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import functools +import pickle +import warnings +from collections import OrderedDict + +import numpy as np +import torch +import torch.distributed as dist +from mmcv.runner import OptimizerHook, get_dist_info +from torch._utils import (_flatten_dense_tensors, _take_tensors, + _unflatten_dense_tensors) + + +def _allreduce_coalesced(tensors, world_size, bucket_size_mb=-1): + if bucket_size_mb > 0: + bucket_size_bytes = bucket_size_mb * 1024 * 1024 + buckets = _take_tensors(tensors, bucket_size_bytes) + else: + buckets = OrderedDict() + for tensor in tensors: + tp = tensor.type() + if tp not in buckets: + buckets[tp] = [] + buckets[tp].append(tensor) + buckets = buckets.values() + + for bucket in buckets: + flat_tensors = _flatten_dense_tensors(bucket) + dist.all_reduce(flat_tensors) + flat_tensors.div_(world_size) + for tensor, synced in zip( + bucket, _unflatten_dense_tensors(flat_tensors, bucket)): + tensor.copy_(synced) + + +def allreduce_grads(params, coalesce=True, bucket_size_mb=-1): + """Allreduce gradients. + + Args: + params (list[torch.Parameters]): List of parameters of a model + coalesce (bool, optional): Whether allreduce parameters as a whole. + Defaults to True. + bucket_size_mb (int, optional): Size of bucket, the unit is MB. + Defaults to -1. + """ + grads = [ + param.grad.data for param in params + if param.requires_grad and param.grad is not None + ] + world_size = dist.get_world_size() + if coalesce: + _allreduce_coalesced(grads, world_size, bucket_size_mb) + else: + for tensor in grads: + dist.all_reduce(tensor.div_(world_size)) + + +class DistOptimizerHook(OptimizerHook): + """Deprecated optimizer hook for distributed training.""" + + def __init__(self, *args, **kwargs): + warnings.warn('"DistOptimizerHook" is deprecated, please switch to' + '"mmcv.runner.OptimizerHook".') + super().__init__(*args, **kwargs) + + +def reduce_mean(tensor): + """"Obtain the mean of tensor on different GPUs.""" + if not (dist.is_available() and dist.is_initialized()): + return tensor + tensor = tensor.clone() + dist.all_reduce(tensor.div_(dist.get_world_size()), op=dist.ReduceOp.SUM) + return tensor + + +def obj2tensor(pyobj, device='cuda'): + """Serialize picklable python object to tensor.""" + storage = torch.ByteStorage.from_buffer(pickle.dumps(pyobj)) + return torch.ByteTensor(storage).to(device=device) + + +def tensor2obj(tensor): + """Deserialize tensor to picklable python object.""" + return pickle.loads(tensor.cpu().numpy().tobytes()) + + +@functools.lru_cache() +def _get_global_gloo_group(): + """Return a process group based on gloo backend, containing all the ranks + The result is cached.""" + if dist.get_backend() == 'nccl': + return dist.new_group(backend='gloo') + else: + return dist.group.WORLD + + +def all_reduce_dict(py_dict, op='sum', group=None, to_float=True): + """Apply all reduce function for python dict object. + + The code is modified from https://github.com/Megvii- + BaseDetection/YOLOX/blob/main/yolox/utils/allreduce_norm.py. + + NOTE: make sure that py_dict in different ranks has the same keys and + the values should be in the same shape. Currently only supports + nccl backend. + + Args: + py_dict (dict): Dict to be applied all reduce op. + op (str): Operator, could be 'sum' or 'mean'. Default: 'sum' + group (:obj:`torch.distributed.group`, optional): Distributed group, + Default: None. + to_float (bool): Whether to convert all values of dict to float. + Default: True. + + Returns: + OrderedDict: reduced python dict object. + """ + warnings.warn( + 'group` is deprecated. Currently only supports NCCL backend.') + _, world_size = get_dist_info() + if world_size == 1: + return py_dict + + # all reduce logic across different devices. + py_key = list(py_dict.keys()) + if not isinstance(py_dict, OrderedDict): + py_key_tensor = obj2tensor(py_key) + dist.broadcast(py_key_tensor, src=0) + py_key = tensor2obj(py_key_tensor) + + tensor_shapes = [py_dict[k].shape for k in py_key] + tensor_numels = [py_dict[k].numel() for k in py_key] + + if to_float: + warnings.warn('Note: the "to_float" is True, you need to ' + 'ensure that the behavior is reasonable.') + flatten_tensor = torch.cat( + [py_dict[k].flatten().float() for k in py_key]) + else: + flatten_tensor = torch.cat([py_dict[k].flatten() for k in py_key]) + + dist.all_reduce(flatten_tensor, op=dist.ReduceOp.SUM) + if op == 'mean': + flatten_tensor /= world_size + + split_tensors = [ + x.reshape(shape) for x, shape in zip( + torch.split(flatten_tensor, tensor_numels), tensor_shapes) + ] + out_dict = {k: v for k, v in zip(py_key, split_tensors)} + if isinstance(py_dict, OrderedDict): + out_dict = OrderedDict(out_dict) + return out_dict + + +def sync_random_seed(seed=None, device='cuda'): + """Make sure different ranks share the same seed. + + All workers must call this function, otherwise it will deadlock. + This method is generally used in `DistributedSampler`, + because the seed should be identical across all processes + in the distributed group. + + In distributed sampling, different ranks should sample non-overlapped + data in the dataset. Therefore, this function is used to make sure that + each rank shuffles the data indices in the same order based + on the same seed. Then different ranks could use different indices + to select non-overlapped data from the same data list. + + Args: + seed (int, Optional): The seed. Default to None. + device (str): The device where the seed will be put on. + Default to 'cuda'. + + Returns: + int: Seed to be used. + """ + if seed is None: + seed = np.random.randint(2**31) + assert isinstance(seed, int) + + rank, world_size = get_dist_info() + + if world_size == 1: + return seed + + if rank == 0: + random_num = torch.tensor(seed, dtype=torch.int32, device=device) + else: + random_num = torch.tensor(0, dtype=torch.int32, device=device) + dist.broadcast(random_num, src=0) + return random_num.item() diff --git a/mmdet/core/utils/misc.py b/mmdet/core/utils/misc.py new file mode 100644 index 0000000..14cb745 --- /dev/null +++ b/mmdet/core/utils/misc.py @@ -0,0 +1,208 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from functools import partial + +import numpy as np +import torch +from six.moves import map, zip + +from ..mask.structures import BitmapMasks, PolygonMasks + + +def multi_apply(func, *args, **kwargs): + """Apply function to a list of arguments. + + Note: + This function applies the ``func`` to multiple inputs and + map the multiple outputs of the ``func`` into different + list. Each list contains the same type of outputs corresponding + to different inputs. + + Args: + func (Function): A function that will be applied to a list of + arguments + + Returns: + tuple(list): A tuple containing multiple list, each list contains \ + a kind of returned results by the function + """ + pfunc = partial(func, **kwargs) if kwargs else func + map_results = map(pfunc, *args) + return tuple(map(list, zip(*map_results))) + + +def unmap(data, count, inds, fill=0): + """Unmap a subset of item (data) back to the original set of items (of size + count)""" + if data.dim() == 1: + ret = data.new_full((count, ), fill) + ret[inds.type(torch.bool)] = data + else: + new_size = (count, ) + data.size()[1:] + ret = data.new_full(new_size, fill) + ret[inds.type(torch.bool), :] = data + return ret + + +def mask2ndarray(mask): + """Convert Mask to ndarray.. + + Args: + mask (:obj:`BitmapMasks` or :obj:`PolygonMasks` or + torch.Tensor or np.ndarray): The mask to be converted. + + Returns: + np.ndarray: Ndarray mask of shape (n, h, w) that has been converted + """ + if isinstance(mask, (BitmapMasks, PolygonMasks)): + mask = mask.to_ndarray() + elif isinstance(mask, torch.Tensor): + mask = mask.detach().cpu().numpy() + elif not isinstance(mask, np.ndarray): + raise TypeError(f'Unsupported {type(mask)} data type') + return mask + + +def flip_tensor(src_tensor, flip_direction): + """flip tensor base on flip_direction. + + Args: + src_tensor (Tensor): input feature map, shape (B, C, H, W). + flip_direction (str): The flipping direction. Options are + 'horizontal', 'vertical', 'diagonal'. + + Returns: + out_tensor (Tensor): Flipped tensor. + """ + assert src_tensor.ndim == 4 + valid_directions = ['horizontal', 'vertical', 'diagonal'] + assert flip_direction in valid_directions + if flip_direction == 'horizontal': + out_tensor = torch.flip(src_tensor, [3]) + elif flip_direction == 'vertical': + out_tensor = torch.flip(src_tensor, [2]) + else: + out_tensor = torch.flip(src_tensor, [2, 3]) + return out_tensor + + +def select_single_mlvl(mlvl_tensors, batch_id, detach=True): + """Extract a multi-scale single image tensor from a multi-scale batch + tensor based on batch index. + + Note: The default value of detach is True, because the proposal gradient + needs to be detached during the training of the two-stage model. E.g + Cascade Mask R-CNN. + + Args: + mlvl_tensors (list[Tensor]): Batch tensor for all scale levels, + each is a 4D-tensor. + batch_id (int): Batch index. + detach (bool): Whether detach gradient. Default True. + + Returns: + list[Tensor]: Multi-scale single image tensor. + """ + assert isinstance(mlvl_tensors, (list, tuple)) + num_levels = len(mlvl_tensors) + + if detach: + mlvl_tensor_list = [ + mlvl_tensors[i][batch_id].detach() for i in range(num_levels) + ] + else: + mlvl_tensor_list = [ + mlvl_tensors[i][batch_id] for i in range(num_levels) + ] + return mlvl_tensor_list + + +def filter_scores_and_topk(scores, score_thr, topk, results=None): + """Filter results using score threshold and topk candidates. + + Args: + scores (Tensor): The scores, shape (num_bboxes, K). + score_thr (float): The score filter threshold. + topk (int): The number of topk candidates. + results (dict or list or Tensor, Optional): The results to + which the filtering rule is to be applied. The shape + of each item is (num_bboxes, N). + + Returns: + tuple: Filtered results + + - scores (Tensor): The scores after being filtered, \ + shape (num_bboxes_filtered, ). + - labels (Tensor): The class labels, shape \ + (num_bboxes_filtered, ). + - anchor_idxs (Tensor): The anchor indexes, shape \ + (num_bboxes_filtered, ). + - filtered_results (dict or list or Tensor, Optional): \ + The filtered results. The shape of each item is \ + (num_bboxes_filtered, N). + """ + valid_mask = scores > score_thr + scores = scores[valid_mask] + valid_idxs = torch.nonzero(valid_mask) + + num_topk = min(topk, valid_idxs.size(0)) + # torch.sort is actually faster than .topk (at least on GPUs) + scores, idxs = scores.sort(descending=True) + scores = scores[:num_topk] + topk_idxs = valid_idxs[idxs[:num_topk]] + keep_idxs, labels = topk_idxs.unbind(dim=1) + + filtered_results = None + if results is not None: + if isinstance(results, dict): + filtered_results = {k: v[keep_idxs] for k, v in results.items()} + elif isinstance(results, list): + filtered_results = [result[keep_idxs] for result in results] + elif isinstance(results, torch.Tensor): + filtered_results = results[keep_idxs] + else: + raise NotImplementedError(f'Only supports dict or list or Tensor, ' + f'but get {type(results)}.') + return scores, labels, keep_idxs, filtered_results + + +def center_of_mass(mask, esp=1e-6): + """Calculate the centroid coordinates of the mask. + + Args: + mask (Tensor): The mask to be calculated, shape (h, w). + esp (float): Avoid dividing by zero. Default: 1e-6. + + Returns: + tuple[Tensor]: the coordinates of the center point of the mask. + + - center_h (Tensor): the center point of the height. + - center_w (Tensor): the center point of the width. + """ + h, w = mask.shape + grid_h = torch.arange(h, device=mask.device)[:, None] + grid_w = torch.arange(w, device=mask.device) + normalizer = mask.sum().float().clamp(min=esp) + center_h = (mask * grid_h).sum() / normalizer + center_w = (mask * grid_w).sum() / normalizer + return center_h, center_w + + +def generate_coordinate(featmap_sizes, device='cuda'): + """Generate the coordinate. + + Args: + featmap_sizes (tuple): The feature to be calculated, + of shape (N, C, W, H). + device (str): The device where the feature will be put on. + Returns: + coord_feat (Tensor): The coordinate feature, of shape (N, 2, W, H). + """ + + x_range = torch.linspace(-1, 1, featmap_sizes[-1], device=device) + y_range = torch.linspace(-1, 1, featmap_sizes[-2], device=device) + y, x = torch.meshgrid(y_range, x_range) + y = y.expand([featmap_sizes[0], 1, -1, -1]) + x = x.expand([featmap_sizes[0], 1, -1, -1]) + coord_feat = torch.cat([x, y], 1) + + return coord_feat diff --git a/mmdet/core/visualization/__init__.py b/mmdet/core/visualization/__init__.py new file mode 100644 index 0000000..2eb17c4 --- /dev/null +++ b/mmdet/core/visualization/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .image import (color_val_matplotlib, imshow_det_bboxes, + imshow_gt_det_bboxes) +from .palette import get_palette, palette_val + +__all__ = [ + 'imshow_det_bboxes', 'imshow_gt_det_bboxes', 'color_val_matplotlib', + 'palette_val', 'get_palette' +] diff --git a/mmdet/core/visualization/image.py b/mmdet/core/visualization/image.py new file mode 100644 index 0000000..63eae8a --- /dev/null +++ b/mmdet/core/visualization/image.py @@ -0,0 +1,563 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import sys + +import cv2 +import matplotlib.pyplot as plt +import mmcv +import numpy as np +import pycocotools.mask as mask_util +from matplotlib.collections import PatchCollection +from matplotlib.patches import Polygon + +from mmdet.core.evaluation.panoptic_utils import INSTANCE_OFFSET +from ..mask.structures import bitmap_to_polygon +from ..utils import mask2ndarray +from .palette import get_palette, palette_val + +__all__ = [ + 'color_val_matplotlib', 'draw_masks', 'draw_bboxes', 'draw_labels', + 'imshow_det_bboxes', 'imshow_gt_det_bboxes' +] + +EPS = 1e-2 + + +def color_val_matplotlib(color): + """Convert various input in BGR order to normalized RGB matplotlib color + tuples. + + Args: + color (:obj`Color` | str | tuple | int | ndarray): Color inputs. + + Returns: + tuple[float]: A tuple of 3 normalized floats indicating RGB channels. + """ + color = mmcv.color_val(color) + color = [color / 255 for color in color[::-1]] + return tuple(color) + + +def _get_adaptive_scales(areas, min_area=800, max_area=30000): + """Get adaptive scales according to areas. + + The scale range is [0.5, 1.0]. When the area is less than + ``'min_area'``, the scale is 0.5 while the area is larger than + ``'max_area'``, the scale is 1.0. + + Args: + areas (ndarray): The areas of bboxes or masks with the + shape of (n, ). + min_area (int): Lower bound areas for adaptive scales. + Default: 800. + max_area (int): Upper bound areas for adaptive scales. + Default: 30000. + + Returns: + ndarray: The adaotive scales with the shape of (n, ). + """ + scales = 0.5 + (areas - min_area) / (max_area - min_area) + scales = np.clip(scales, 0.5, 1.0) + return scales + + +def _get_bias_color(base, max_dist=30): + """Get different colors for each masks. + + Get different colors for each masks by adding a bias + color to the base category color. + Args: + base (ndarray): The base category color with the shape + of (3, ). + max_dist (int): The max distance of bias. Default: 30. + + Returns: + ndarray: The new color for a mask with the shape of (3, ). + """ + new_color = base + np.random.randint( + low=-max_dist, high=max_dist + 1, size=3) + return np.clip(new_color, 0, 255, new_color) + + +def draw_bboxes(ax, bboxes, color='g', alpha=0.8, thickness=2): + """Draw bounding boxes on the axes. + + Args: + ax (matplotlib.Axes): The input axes. + bboxes (ndarray): The input bounding boxes with the shape + of (n, 4). + color (list[tuple] | matplotlib.color): the colors for each + bounding boxes. + alpha (float): Transparency of bounding boxes. Default: 0.8. + thickness (int): Thickness of lines. Default: 2. + + Returns: + matplotlib.Axes: The result axes. + """ + polygons = [] + for i, bbox in enumerate(bboxes): + bbox_int = bbox.astype(np.int32) + poly = [[bbox_int[0], bbox_int[1]], [bbox_int[0], bbox_int[3]], + [bbox_int[2], bbox_int[3]], [bbox_int[2], bbox_int[1]]] + np_poly = np.array(poly).reshape((4, 2)) + polygons.append(Polygon(np_poly)) + p = PatchCollection( + polygons, + facecolor='none', + edgecolors=color, + linewidths=thickness, + alpha=alpha) + ax.add_collection(p) + + return ax + + +def draw_labels(ax, + labels, + positions, + scores=None, + class_names=None, + color='w', + font_size=8, + scales=None, + horizontal_alignment='left'): + """Draw labels on the axes. + + Args: + ax (matplotlib.Axes): The input axes. + labels (ndarray): The labels with the shape of (n, ). + positions (ndarray): The positions to draw each labels. + scores (ndarray): The scores for each labels. + class_names (list[str]): The class names. + color (list[tuple] | matplotlib.color): The colors for labels. + font_size (int): Font size of texts. Default: 8. + scales (list[float]): Scales of texts. Default: None. + horizontal_alignment (str): The horizontal alignment method of + texts. Default: 'left'. + + Returns: + matplotlib.Axes: The result axes. + """ + for i, (pos, label) in enumerate(zip(positions, labels)): + label_text = class_names[ + label] if class_names is not None else f'class {label}' + if scores is not None: + label_text += f'|{scores[i]:.02f}' + text_color = color[i] if isinstance(color, list) else color + + font_size_mask = font_size if scales is None else font_size * scales[i] + ax.text( + pos[0], + pos[1], + f'{label_text}', + bbox={ + 'facecolor': 'black', + 'alpha': 0.8, + 'pad': 0.7, + 'edgecolor': 'none' + }, + color=text_color, + fontsize=font_size_mask, + verticalalignment='top', + horizontalalignment=horizontal_alignment) + + return ax + + +def draw_masks(ax, img, masks, color=None, with_edge=True, alpha=0.8): + """Draw masks on the image and their edges on the axes. + + Args: + ax (matplotlib.Axes): The input axes. + img (ndarray): The image with the shape of (3, h, w). + masks (ndarray): The masks with the shape of (n, h, w). + color (ndarray): The colors for each masks with the shape + of (n, 3). + with_edge (bool): Whether to draw edges. Default: True. + alpha (float): Transparency of bounding boxes. Default: 0.8. + + Returns: + matplotlib.Axes: The result axes. + ndarray: The result image. + """ + taken_colors = set([0, 0, 0]) + if color is None: + random_colors = np.random.randint(0, 255, (masks.size(0), 3)) + color = [tuple(c) for c in random_colors] + color = np.array(color, dtype=np.uint8) + polygons = [] + for i, mask in enumerate(masks): + if with_edge: + contours, _ = bitmap_to_polygon(mask) + polygons += [Polygon(c) for c in contours] + + color_mask = color[i] + while tuple(color_mask) in taken_colors: + color_mask = _get_bias_color(color_mask) + taken_colors.add(tuple(color_mask)) + + mask = mask.astype(bool) + img[mask] = img[mask] * (1 - alpha) + color_mask * alpha + + p = PatchCollection( + polygons, facecolor='none', edgecolors='w', linewidths=1, alpha=0.8) + ax.add_collection(p) + + return ax, img + + +def imshow_det_bboxes(img, + bboxes=None, + labels=None, + segms=None, + class_names=None, + score_thr=0, + bbox_color='green', + text_color='green', + mask_color=None, + thickness=2, + font_size=8, + win_name='', + show=True, + wait_time=0, + out_file=None): + """Draw bboxes and class labels (with scores) on an image. + + Args: + img (str | ndarray): The image to be displayed. + bboxes (ndarray): Bounding boxes (with scores), shaped (n, 4) or + (n, 5). + labels (ndarray): Labels of bboxes. + segms (ndarray | None): Masks, shaped (n,h,w) or None. + class_names (list[str]): Names of each classes. + score_thr (float): Minimum score of bboxes to be shown. Default: 0. + bbox_color (list[tuple] | tuple | str | None): Colors of bbox lines. + If a single color is given, it will be applied to all classes. + The tuple of color should be in RGB order. Default: 'green'. + text_color (list[tuple] | tuple | str | None): Colors of texts. + If a single color is given, it will be applied to all classes. + The tuple of color should be in RGB order. Default: 'green'. + mask_color (list[tuple] | tuple | str | None, optional): Colors of + masks. If a single color is given, it will be applied to all + classes. The tuple of color should be in RGB order. + Default: None. + thickness (int): Thickness of lines. Default: 2. + font_size (int): Font size of texts. Default: 13. + show (bool): Whether to show the image. Default: True. + win_name (str): The window name. Default: ''. + wait_time (float): Value of waitKey param. Default: 0. + out_file (str, optional): The filename to write the image. + Default: None. + + Returns: + ndarray: The image with bboxes drawn on it. + """ + assert bboxes is None or bboxes.ndim == 2, \ + f' bboxes ndim should be 2, but its ndim is {bboxes.ndim}.' + assert labels.ndim == 1, \ + f' labels ndim should be 1, but its ndim is {labels.ndim}.' + assert bboxes is None or bboxes.shape[1] == 4 or bboxes.shape[1] == 5, \ + f' bboxes.shape[1] should be 4 or 5, but its {bboxes.shape[1]}.' + assert bboxes is None or bboxes.shape[0] <= labels.shape[0], \ + 'labels.shape[0] should not be less than bboxes.shape[0].' + assert segms is None or segms.shape[0] == labels.shape[0], \ + 'segms.shape[0] and labels.shape[0] should have the same length.' + assert segms is not None or bboxes is not None, \ + 'segms and bboxes should not be None at the same time.' + + img = mmcv.imread(img).astype(np.uint8) + + if score_thr > 0: + assert bboxes is not None and bboxes.shape[1] == 5 + scores = bboxes[:, -1] + inds = scores > score_thr + bboxes = bboxes[inds, :] + labels = labels[inds] + if segms is not None: + segms = segms[inds, ...] + + img = mmcv.bgr2rgb(img) + width, height = img.shape[1], img.shape[0] + img = np.ascontiguousarray(img) + + fig = plt.figure(win_name, frameon=False) + plt.title(win_name) + canvas = fig.canvas + dpi = fig.get_dpi() + # add a small EPS to avoid precision lost due to matplotlib's truncation + # (https://github.com/matplotlib/matplotlib/issues/15363) + fig.set_size_inches((width + EPS) / dpi, (height + EPS) / dpi) + + # remove white edges by set subplot margin + plt.subplots_adjust(left=0, right=1, bottom=0, top=1) + ax = plt.gca() + ax.axis('off') + + max_label = int(max(labels) if len(labels) > 0 else 0) + text_palette = palette_val(get_palette(text_color, max_label + 1)) + text_colors = [text_palette[label] for label in labels] + + num_bboxes = 0 + if bboxes is not None: + num_bboxes = bboxes.shape[0] + bbox_palette = palette_val(get_palette(bbox_color, max_label + 1)) + colors = [bbox_palette[label] for label in labels[:num_bboxes]] + draw_bboxes(ax, bboxes, colors, alpha=0.8, thickness=thickness) + + horizontal_alignment = 'left' + positions = bboxes[:, :2].astype(np.int32) + thickness + areas = (bboxes[:, 3] - bboxes[:, 1]) * (bboxes[:, 2] - bboxes[:, 0]) + scales = _get_adaptive_scales(areas) + scores = bboxes[:, 4] if bboxes.shape[1] == 5 else None + draw_labels( + ax, + labels[:num_bboxes], + positions, + scores=scores, + class_names=class_names, + color=text_colors, + font_size=font_size, + scales=scales, + horizontal_alignment=horizontal_alignment) + + if segms is not None: + mask_palette = get_palette(mask_color, max_label + 1) + colors = [mask_palette[label] for label in labels] + colors = np.array(colors, dtype=np.uint8) + draw_masks(ax, img, segms, colors, with_edge=True) + + if num_bboxes < segms.shape[0]: + segms = segms[num_bboxes:] + horizontal_alignment = 'center' + areas = [] + positions = [] + for mask in segms: + _, _, stats, centroids = cv2.connectedComponentsWithStats( + mask.astype(np.uint8), connectivity=8) + largest_id = np.argmax(stats[1:, -1]) + 1 + positions.append(centroids[largest_id]) + areas.append(stats[largest_id, -1]) + areas = np.stack(areas, axis=0) + scales = _get_adaptive_scales(areas) + draw_labels( + ax, + labels[num_bboxes:], + positions, + class_names=class_names, + color=text_colors, + font_size=font_size, + scales=scales, + horizontal_alignment=horizontal_alignment) + + plt.imshow(img) + + stream, _ = canvas.print_to_buffer() + buffer = np.frombuffer(stream, dtype='uint8') + if sys.platform == 'darwin': + width, height = canvas.get_width_height(physical=True) + img_rgba = buffer.reshape(height, width, 4) + rgb, alpha = np.split(img_rgba, [3], axis=2) + img = rgb.astype('uint8') + img = mmcv.rgb2bgr(img) + + if show: + # We do not use cv2 for display because in some cases, opencv will + # conflict with Qt, it will output a warning: Current thread + # is not the object's thread. You can refer to + # https://github.com/opencv/opencv-python/issues/46 for details + if wait_time == 0: + plt.show() + else: + plt.show(block=False) + plt.pause(wait_time) + if out_file is not None: + mmcv.imwrite(img, out_file) + + plt.close() + + return img + + +def imshow_gt_det_bboxes(img, + annotation, + result, + class_names=None, + score_thr=0, + gt_bbox_color=(61, 102, 255), + gt_text_color=(200, 200, 200), + gt_mask_color=(61, 102, 255), + det_bbox_color=(241, 101, 72), + det_text_color=(200, 200, 200), + det_mask_color=(241, 101, 72), + thickness=2, + font_size=13, + win_name='', + show=True, + wait_time=0, + out_file=None, + overlay_gt_pred=True): + """General visualization GT and result function. + + Args: + img (str | ndarray): The image to be displayed. + annotation (dict): Ground truth annotations where contain keys of + 'gt_bboxes' and 'gt_labels' or 'gt_masks'. + result (tuple[list] | list): The detection result, can be either + (bbox, segm) or just bbox. + class_names (list[str]): Names of each classes. + score_thr (float): Minimum score of bboxes to be shown. Default: 0. + gt_bbox_color (list[tuple] | tuple | str | None): Colors of bbox lines. + If a single color is given, it will be applied to all classes. + The tuple of color should be in RGB order. Default: (61, 102, 255). + gt_text_color (list[tuple] | tuple | str | None): Colors of texts. + If a single color is given, it will be applied to all classes. + The tuple of color should be in RGB order. Default: (200, 200, 200). + gt_mask_color (list[tuple] | tuple | str | None, optional): Colors of + masks. If a single color is given, it will be applied to all classes. + The tuple of color should be in RGB order. Default: (61, 102, 255). + det_bbox_color (list[tuple] | tuple | str | None):Colors of bbox lines. + If a single color is given, it will be applied to all classes. + The tuple of color should be in RGB order. Default: (241, 101, 72). + det_text_color (list[tuple] | tuple | str | None):Colors of texts. + If a single color is given, it will be applied to all classes. + The tuple of color should be in RGB order. Default: (200, 200, 200). + det_mask_color (list[tuple] | tuple | str | None, optional): Color of + masks. If a single color is given, it will be applied to all classes. + The tuple of color should be in RGB order. Default: (241, 101, 72). + thickness (int): Thickness of lines. Default: 2. + font_size (int): Font size of texts. Default: 13. + win_name (str): The window name. Default: ''. + show (bool): Whether to show the image. Default: True. + wait_time (float): Value of waitKey param. Default: 0. + out_file (str, optional): The filename to write the image. + Default: None. + overlay_gt_pred (bool): Whether to plot gts and predictions on the + same image. If False, predictions and gts will be plotted on two same + image which will be concatenated in vertical direction. The image + above is drawn with gt, and the image below is drawn with the + prediction result. Default: True. + + Returns: + ndarray: The image with bboxes or masks drawn on it. + """ + assert 'gt_bboxes' in annotation + assert 'gt_labels' in annotation + assert isinstance(result, (tuple, list, dict)), 'Expected ' \ + f'tuple or list or dict, but get {type(result)}' + + gt_bboxes = annotation['gt_bboxes'] + gt_labels = annotation['gt_labels'] + gt_masks = annotation.get('gt_masks', None) + if gt_masks is not None: + gt_masks = mask2ndarray(gt_masks) + + gt_seg = annotation.get('gt_semantic_seg', None) + if gt_seg is not None: + pad_value = 255 # the padding value of gt_seg + sem_labels = np.unique(gt_seg) + all_labels = np.concatenate((gt_labels, sem_labels), axis=0) + all_labels, counts = np.unique(all_labels, return_counts=True) + stuff_labels = all_labels[np.logical_and(counts < 2, + all_labels != pad_value)] + stuff_masks = gt_seg[None] == stuff_labels[:, None, None] + gt_labels = np.concatenate((gt_labels, stuff_labels), axis=0) + gt_masks = np.concatenate((gt_masks, stuff_masks.astype(np.uint8)), + axis=0) + # If you need to show the bounding boxes, + # please comment the following line + # gt_bboxes = None + + img = mmcv.imread(img) + + img_with_gt = imshow_det_bboxes( + img, + gt_bboxes, + gt_labels, + gt_masks, + class_names=class_names, + bbox_color=gt_bbox_color, + text_color=gt_text_color, + mask_color=gt_mask_color, + thickness=thickness, + font_size=font_size, + win_name=win_name, + show=False) + + if not isinstance(result, dict): + if isinstance(result, tuple): + bbox_result, segm_result = result + if isinstance(segm_result, tuple): + segm_result = segm_result[0] # ms rcnn + else: + bbox_result, segm_result = result, None + + bboxes = np.vstack(bbox_result) + labels = [ + np.full(bbox.shape[0], i, dtype=np.int32) + for i, bbox in enumerate(bbox_result) + ] + labels = np.concatenate(labels) + + segms = None + if segm_result is not None and len(labels) > 0: # non empty + segms = mmcv.concat_list(segm_result) + segms = mask_util.decode(segms) + segms = segms.transpose(2, 0, 1) + else: + assert class_names is not None, 'We need to know the number ' \ + 'of classes.' + VOID = len(class_names) + bboxes = None + pan_results = result['pan_results'] + # keep objects ahead + ids = np.unique(pan_results)[::-1] + legal_indices = ids != VOID + ids = ids[legal_indices] + labels = np.array([id % INSTANCE_OFFSET for id in ids], dtype=np.int64) + segms = (pan_results[None] == ids[:, None, None]) + + if overlay_gt_pred: + img = imshow_det_bboxes( + img_with_gt, + bboxes, + labels, + segms=segms, + class_names=class_names, + score_thr=score_thr, + bbox_color=det_bbox_color, + text_color=det_text_color, + mask_color=det_mask_color, + thickness=thickness, + font_size=font_size, + win_name=win_name, + show=show, + wait_time=wait_time, + out_file=out_file) + else: + img_with_det = imshow_det_bboxes( + img, + bboxes, + labels, + segms=segms, + class_names=class_names, + score_thr=score_thr, + bbox_color=det_bbox_color, + text_color=det_text_color, + mask_color=det_mask_color, + thickness=thickness, + font_size=font_size, + win_name=win_name, + show=False) + img = np.concatenate([img_with_gt, img_with_det], axis=0) + + plt.imshow(img) + if show: + if wait_time == 0: + plt.show() + else: + plt.show(block=False) + plt.pause(wait_time) + if out_file is not None: + mmcv.imwrite(img, out_file) + plt.close() + + return img diff --git a/mmdet/core/visualization/palette.py b/mmdet/core/visualization/palette.py new file mode 100644 index 0000000..11692cd --- /dev/null +++ b/mmdet/core/visualization/palette.py @@ -0,0 +1,63 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import numpy as np + + +def palette_val(palette): + """Convert palette to matplotlib palette. + + Args: + palette List[tuple]: A list of color tuples. + + Returns: + List[tuple[float]]: A list of RGB matplotlib color tuples. + """ + new_palette = [] + for color in palette: + color = [c / 255 for c in color] + new_palette.append(tuple(color)) + return new_palette + + +def get_palette(palette, num_classes): + """Get palette from various inputs. + + Args: + palette (list[tuple] | str | tuple | :obj:`Color`): palette inputs. + num_classes (int): the number of classes. + + Returns: + list[tuple[int]]: A list of color tuples. + """ + assert isinstance(num_classes, int) + + if isinstance(palette, list): + dataset_palette = palette + elif isinstance(palette, tuple): + dataset_palette = [palette] * num_classes + elif palette == 'random' or palette is None: + state = np.random.get_state() + # random color + np.random.seed(42) + palette = np.random.randint(0, 256, size=(num_classes, 3)) + np.random.set_state(state) + dataset_palette = [tuple(c) for c in palette] + elif palette == 'coco': + from mmdet.datasets import CocoDataset, CocoPanopticDataset + dataset_palette = CocoDataset.PALETTE + if len(dataset_palette) < num_classes: + dataset_palette = CocoPanopticDataset.PALETTE + elif palette == 'citys': + from mmdet.datasets import CityscapesDataset + dataset_palette = CityscapesDataset.PALETTE + elif palette == 'voc': + from mmdet.datasets import VOCDataset + dataset_palette = VOCDataset.PALETTE + elif mmcv.is_str(palette): + dataset_palette = [mmcv.color_val(palette)[::-1]] * num_classes + else: + raise TypeError(f'Invalid type for palette: {type(palette)}') + + assert len(dataset_palette) >= num_classes, \ + 'The length of palette should not be less than `num_classes`.' + return dataset_palette diff --git a/mmdet/datasets/__init__.py b/mmdet/datasets/__init__.py new file mode 100644 index 0000000..46c49fd --- /dev/null +++ b/mmdet/datasets/__init__.py @@ -0,0 +1,31 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .builder import DATASETS, PIPELINES, build_dataloader, build_dataset +from .cityscapes import CityscapesDataset +from .coco import CocoDataset +from .coco_occluded import OccludedSeparatedCocoDataset +from .coco_panoptic import CocoPanopticDataset +from .custom import CustomDataset +from .dataset_wrappers import (ClassBalancedDataset, ConcatDataset, + MultiImageMixDataset, RepeatDataset) +from .deepfashion import DeepFashionDataset +from .lvis import LVISDataset, LVISV1Dataset, LVISV05Dataset +from .objects365 import Objects365V1Dataset, Objects365V2Dataset +from .openimages import OpenImagesChallengeDataset, OpenImagesDataset +from .samplers import DistributedGroupSampler, DistributedSampler, GroupSampler +from .utils import (NumClassCheckHook, get_loading_pipeline, + replace_ImageToTensor) +from .voc import VOCDataset +from .wider_face import WIDERFaceDataset +from .xml_style import XMLDataset + +__all__ = [ + 'CustomDataset', 'XMLDataset', 'CocoDataset', 'DeepFashionDataset', + 'VOCDataset', 'CityscapesDataset', 'LVISDataset', 'LVISV05Dataset', + 'LVISV1Dataset', 'GroupSampler', 'DistributedGroupSampler', + 'DistributedSampler', 'build_dataloader', 'ConcatDataset', 'RepeatDataset', + 'ClassBalancedDataset', 'WIDERFaceDataset', 'DATASETS', 'PIPELINES', + 'build_dataset', 'replace_ImageToTensor', 'get_loading_pipeline', + 'NumClassCheckHook', 'CocoPanopticDataset', 'MultiImageMixDataset', + 'OpenImagesDataset', 'OpenImagesChallengeDataset', 'Objects365V1Dataset', + 'Objects365V2Dataset', 'OccludedSeparatedCocoDataset' +] diff --git a/mmdet/datasets/api_wrappers/__init__.py b/mmdet/datasets/api_wrappers/__init__.py new file mode 100644 index 0000000..af85575 --- /dev/null +++ b/mmdet/datasets/api_wrappers/__init__.py @@ -0,0 +1,7 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .coco_api import COCO, COCOeval +from .panoptic_evaluation import pq_compute_multi_core, pq_compute_single_core + +__all__ = [ + 'COCO', 'COCOeval', 'pq_compute_multi_core', 'pq_compute_single_core' +] diff --git a/mmdet/datasets/api_wrappers/coco_api.py b/mmdet/datasets/api_wrappers/coco_api.py new file mode 100644 index 0000000..eef6341 --- /dev/null +++ b/mmdet/datasets/api_wrappers/coco_api.py @@ -0,0 +1,47 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# This file add snake case alias for coco api + +import warnings + +import pycocotools +from pycocotools.coco import COCO as _COCO +from pycocotools.cocoeval import COCOeval as _COCOeval + + +class COCO(_COCO): + """This class is almost the same as official pycocotools package. + + It implements some snake case function aliases. So that the COCO class has + the same interface as LVIS class. + """ + + def __init__(self, annotation_file=None): + if getattr(pycocotools, '__version__', '0') >= '12.0.2': + warnings.warn( + 'mmpycocotools is deprecated. Please install official pycocotools by "pip install pycocotools"', # noqa: E501 + UserWarning) + super().__init__(annotation_file=annotation_file) + self.img_ann_map = self.imgToAnns + self.cat_img_map = self.catToImgs + + def get_ann_ids(self, img_ids=[], cat_ids=[], area_rng=[], iscrowd=None): + return self.getAnnIds(img_ids, cat_ids, area_rng, iscrowd) + + def get_cat_ids(self, cat_names=[], sup_names=[], cat_ids=[]): + return self.getCatIds(cat_names, sup_names, cat_ids) + + def get_img_ids(self, img_ids=[], cat_ids=[]): + return self.getImgIds(img_ids, cat_ids) + + def load_anns(self, ids): + return self.loadAnns(ids) + + def load_cats(self, ids): + return self.loadCats(ids) + + def load_imgs(self, ids): + return self.loadImgs(ids) + + +# just for the ease of import +COCOeval = _COCOeval diff --git a/mmdet/datasets/api_wrappers/panoptic_evaluation.py b/mmdet/datasets/api_wrappers/panoptic_evaluation.py new file mode 100644 index 0000000..55f57bf --- /dev/null +++ b/mmdet/datasets/api_wrappers/panoptic_evaluation.py @@ -0,0 +1,228 @@ +# Copyright (c) OpenMMLab. All rights reserved. + +# Copyright (c) 2018, Alexander Kirillov +# This file supports `file_client` for `panopticapi`, +# the source code is copied from `panopticapi`, +# only the way to load the gt images is modified. +import multiprocessing +import os + +import mmcv +import numpy as np + +try: + from panopticapi.evaluation import OFFSET, VOID, PQStat + from panopticapi.utils import rgb2id +except ImportError: + PQStat = None + rgb2id = None + VOID = 0 + OFFSET = 256 * 256 * 256 + + +def pq_compute_single_core(proc_id, + annotation_set, + gt_folder, + pred_folder, + categories, + file_client=None, + print_log=False): + """The single core function to evaluate the metric of Panoptic + Segmentation. + + Same as the function with the same name in `panopticapi`. Only the function + to load the images is changed to use the file client. + + Args: + proc_id (int): The id of the mini process. + gt_folder (str): The path of the ground truth images. + pred_folder (str): The path of the prediction images. + categories (str): The categories of the dataset. + file_client (object): The file client of the dataset. If None, + the backend will be set to `disk`. + print_log (bool): Whether to print the log. Defaults to False. + """ + if PQStat is None: + raise RuntimeError( + 'panopticapi is not installed, please install it by: ' + 'pip install git+https://github.com/cocodataset/' + 'panopticapi.git.') + + if file_client is None: + file_client_args = dict(backend='disk') + file_client = mmcv.FileClient(**file_client_args) + + pq_stat = PQStat() + + idx = 0 + for gt_ann, pred_ann in annotation_set: + if print_log and idx % 100 == 0: + print('Core: {}, {} from {} images processed'.format( + proc_id, idx, len(annotation_set))) + idx += 1 + # The gt images can be on the local disk or `ceph`, so we use + # file_client here. + img_bytes = file_client.get( + os.path.join(gt_folder, gt_ann['file_name'])) + pan_gt = mmcv.imfrombytes(img_bytes, flag='color', channel_order='rgb') + pan_gt = rgb2id(pan_gt) + + # The predictions can only be on the local dist now. + pan_pred = mmcv.imread( + os.path.join(pred_folder, pred_ann['file_name']), + flag='color', + channel_order='rgb') + pan_pred = rgb2id(pan_pred) + + gt_segms = {el['id']: el for el in gt_ann['segments_info']} + pred_segms = {el['id']: el for el in pred_ann['segments_info']} + + # predicted segments area calculation + prediction sanity checks + pred_labels_set = set(el['id'] for el in pred_ann['segments_info']) + labels, labels_cnt = np.unique(pan_pred, return_counts=True) + for label, label_cnt in zip(labels, labels_cnt): + if label not in pred_segms: + if label == VOID: + continue + raise KeyError( + 'In the image with ID {} segment with ID {} is ' + 'presented in PNG and not presented in JSON.'.format( + gt_ann['image_id'], label)) + pred_segms[label]['area'] = label_cnt + pred_labels_set.remove(label) + if pred_segms[label]['category_id'] not in categories: + raise KeyError( + 'In the image with ID {} segment with ID {} has ' + 'unknown category_id {}.'.format( + gt_ann['image_id'], label, + pred_segms[label]['category_id'])) + if len(pred_labels_set) != 0: + raise KeyError( + 'In the image with ID {} the following segment IDs {} ' + 'are presented in JSON and not presented in PNG.'.format( + gt_ann['image_id'], list(pred_labels_set))) + + # confusion matrix calculation + pan_gt_pred = pan_gt.astype(np.uint64) * OFFSET + pan_pred.astype( + np.uint64) + gt_pred_map = {} + labels, labels_cnt = np.unique(pan_gt_pred, return_counts=True) + for label, intersection in zip(labels, labels_cnt): + gt_id = label // OFFSET + pred_id = label % OFFSET + gt_pred_map[(gt_id, pred_id)] = intersection + + # count all matched pairs + gt_matched = set() + pred_matched = set() + for label_tuple, intersection in gt_pred_map.items(): + gt_label, pred_label = label_tuple + if gt_label not in gt_segms: + continue + if pred_label not in pred_segms: + continue + if gt_segms[gt_label]['iscrowd'] == 1: + continue + if gt_segms[gt_label]['category_id'] != pred_segms[pred_label][ + 'category_id']: + continue + + union = pred_segms[pred_label]['area'] + gt_segms[gt_label][ + 'area'] - intersection - gt_pred_map.get((VOID, pred_label), 0) + iou = intersection / union + if iou > 0.5: + pq_stat[gt_segms[gt_label]['category_id']].tp += 1 + pq_stat[gt_segms[gt_label]['category_id']].iou += iou + gt_matched.add(gt_label) + pred_matched.add(pred_label) + + # count false positives + crowd_labels_dict = {} + for gt_label, gt_info in gt_segms.items(): + if gt_label in gt_matched: + continue + # crowd segments are ignored + if gt_info['iscrowd'] == 1: + crowd_labels_dict[gt_info['category_id']] = gt_label + continue + pq_stat[gt_info['category_id']].fn += 1 + + # count false positives + for pred_label, pred_info in pred_segms.items(): + if pred_label in pred_matched: + continue + # intersection of the segment with VOID + intersection = gt_pred_map.get((VOID, pred_label), 0) + # plus intersection with corresponding CROWD region if it exists + if pred_info['category_id'] in crowd_labels_dict: + intersection += gt_pred_map.get( + (crowd_labels_dict[pred_info['category_id']], pred_label), + 0) + # predicted segment is ignored if more than half of + # the segment correspond to VOID and CROWD regions + if intersection / pred_info['area'] > 0.5: + continue + pq_stat[pred_info['category_id']].fp += 1 + + if print_log: + print('Core: {}, all {} images processed'.format( + proc_id, len(annotation_set))) + return pq_stat + + +def pq_compute_multi_core(matched_annotations_list, + gt_folder, + pred_folder, + categories, + file_client=None, + nproc=32): + """Evaluate the metrics of Panoptic Segmentation with multithreading. + + Same as the function with the same name in `panopticapi`. + + Args: + matched_annotations_list (list): The matched annotation list. Each + element is a tuple of annotations of the same image with the + format (gt_anns, pred_anns). + gt_folder (str): The path of the ground truth images. + pred_folder (str): The path of the prediction images. + categories (str): The categories of the dataset. + file_client (object): The file client of the dataset. If None, + the backend will be set to `disk`. + nproc (int): Number of processes for panoptic quality computing. + Defaults to 32. When `nproc` exceeds the number of cpu cores, + the number of cpu cores is used. + """ + if PQStat is None: + raise RuntimeError( + 'panopticapi is not installed, please install it by: ' + 'pip install git+https://github.com/cocodataset/' + 'panopticapi.git.') + + if file_client is None: + file_client_args = dict(backend='disk') + file_client = mmcv.FileClient(**file_client_args) + + cpu_num = min(nproc, multiprocessing.cpu_count()) + + annotations_split = np.array_split(matched_annotations_list, cpu_num) + print('Number of cores: {}, images per core: {}'.format( + cpu_num, len(annotations_split[0]))) + workers = multiprocessing.Pool(processes=cpu_num) + processes = [] + for proc_id, annotation_set in enumerate(annotations_split): + p = workers.apply_async(pq_compute_single_core, + (proc_id, annotation_set, gt_folder, + pred_folder, categories, file_client)) + processes.append(p) + + # Close the process pool, otherwise it will lead to memory + # leaking problems. + workers.close() + workers.join() + + pq_stat = PQStat() + for p in processes: + pq_stat += p.get() + + return pq_stat diff --git a/mmdet/datasets/builder.py b/mmdet/datasets/builder.py new file mode 100644 index 0000000..1936296 --- /dev/null +++ b/mmdet/datasets/builder.py @@ -0,0 +1,215 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy +import platform +import random +import warnings +from functools import partial + +import numpy as np +import torch +from mmcv.parallel import collate +from mmcv.runner import get_dist_info +from mmcv.utils import TORCH_VERSION, Registry, build_from_cfg, digit_version +from torch.utils.data import DataLoader + +from .samplers import (ClassAwareSampler, DistributedGroupSampler, + DistributedSampler, GroupSampler, InfiniteBatchSampler, + InfiniteGroupBatchSampler) + +if platform.system() != 'Windows': + # https://github.com/pytorch/pytorch/issues/973 + import resource + rlimit = resource.getrlimit(resource.RLIMIT_NOFILE) + base_soft_limit = rlimit[0] + hard_limit = rlimit[1] + soft_limit = min(max(4096, base_soft_limit), hard_limit) + resource.setrlimit(resource.RLIMIT_NOFILE, (soft_limit, hard_limit)) + +DATASETS = Registry('dataset') +PIPELINES = Registry('pipeline') + + +def _concat_dataset(cfg, default_args=None): + from .dataset_wrappers import ConcatDataset + ann_files = cfg['ann_file'] + img_prefixes = cfg.get('img_prefix', None) + seg_prefixes = cfg.get('seg_prefix', None) + proposal_files = cfg.get('proposal_file', None) + separate_eval = cfg.get('separate_eval', True) + + datasets = [] + num_dset = len(ann_files) + for i in range(num_dset): + data_cfg = copy.deepcopy(cfg) + # pop 'separate_eval' since it is not a valid key for common datasets. + if 'separate_eval' in data_cfg: + data_cfg.pop('separate_eval') + data_cfg['ann_file'] = ann_files[i] + if isinstance(img_prefixes, (list, tuple)): + data_cfg['img_prefix'] = img_prefixes[i] + if isinstance(seg_prefixes, (list, tuple)): + data_cfg['seg_prefix'] = seg_prefixes[i] + if isinstance(proposal_files, (list, tuple)): + data_cfg['proposal_file'] = proposal_files[i] + datasets.append(build_dataset(data_cfg, default_args)) + + return ConcatDataset(datasets, separate_eval) + + +def build_dataset(cfg, default_args=None): + from .dataset_wrappers import (ClassBalancedDataset, ConcatDataset, + MultiImageMixDataset, RepeatDataset) + if isinstance(cfg, (list, tuple)): + dataset = ConcatDataset([build_dataset(c, default_args) for c in cfg]) + elif cfg['type'] == 'ConcatDataset': + dataset = ConcatDataset( + [build_dataset(c, default_args) for c in cfg['datasets']], + cfg.get('separate_eval', True)) + elif cfg['type'] == 'RepeatDataset': + dataset = RepeatDataset( + build_dataset(cfg['dataset'], default_args), cfg['times']) + elif cfg['type'] == 'ClassBalancedDataset': + dataset = ClassBalancedDataset( + build_dataset(cfg['dataset'], default_args), cfg['oversample_thr']) + elif cfg['type'] == 'MultiImageMixDataset': + cp_cfg = copy.deepcopy(cfg) + cp_cfg['dataset'] = build_dataset(cp_cfg['dataset']) + cp_cfg.pop('type') + dataset = MultiImageMixDataset(**cp_cfg) + elif isinstance(cfg.get('ann_file'), (list, tuple)): + dataset = _concat_dataset(cfg, default_args) + else: + dataset = build_from_cfg(cfg, DATASETS, default_args) + + return dataset + + +def build_dataloader(dataset, + samples_per_gpu, + workers_per_gpu, + num_gpus=1, + dist=True, + shuffle=True, + seed=None, + runner_type='EpochBasedRunner', + persistent_workers=False, + class_aware_sampler=None, + **kwargs): + """Build PyTorch DataLoader. + + In distributed training, each GPU/process has a dataloader. + In non-distributed training, there is only one dataloader for all GPUs. + + Args: + dataset (Dataset): A PyTorch dataset. + samples_per_gpu (int): Number of training samples on each GPU, i.e., + batch size of each GPU. + workers_per_gpu (int): How many subprocesses to use for data loading + for each GPU. + num_gpus (int): Number of GPUs. Only used in non-distributed training. + dist (bool): Distributed training/test or not. Default: True. + shuffle (bool): Whether to shuffle the data at every epoch. + Default: True. + seed (int, Optional): Seed to be used. Default: None. + runner_type (str): Type of runner. Default: `EpochBasedRunner` + persistent_workers (bool): If True, the data loader will not shutdown + the worker processes after a dataset has been consumed once. + This allows to maintain the workers `Dataset` instances alive. + This argument is only valid when PyTorch>=1.7.0. Default: False. + class_aware_sampler (dict): Whether to use `ClassAwareSampler` + during training. Default: None. + kwargs: any keyword argument to be used to initialize DataLoader + + Returns: + DataLoader: A PyTorch dataloader. + """ + rank, world_size = get_dist_info() + + if dist: + # When model is :obj:`DistributedDataParallel`, + # `batch_size` of :obj:`dataloader` is the + # number of training samples on each GPU. + batch_size = samples_per_gpu + num_workers = workers_per_gpu + else: + # When model is obj:`DataParallel` + # the batch size is samples on all the GPUS + batch_size = num_gpus * samples_per_gpu + num_workers = num_gpus * workers_per_gpu + + if runner_type == 'IterBasedRunner': + # this is a batch sampler, which can yield + # a mini-batch indices each time. + # it can be used in both `DataParallel` and + # `DistributedDataParallel` + if shuffle: + batch_sampler = InfiniteGroupBatchSampler( + dataset, batch_size, world_size, rank, seed=seed) + else: + batch_sampler = InfiniteBatchSampler( + dataset, + batch_size, + world_size, + rank, + seed=seed, + shuffle=False) + batch_size = 1 + sampler = None + else: + if class_aware_sampler is not None: + # ClassAwareSampler can be used in both distributed and + # non-distributed training. + num_sample_class = class_aware_sampler.get('num_sample_class', 1) + sampler = ClassAwareSampler( + dataset, + samples_per_gpu, + world_size, + rank, + seed=seed, + num_sample_class=num_sample_class) + elif dist: + # DistributedGroupSampler will definitely shuffle the data to + # satisfy that images on each GPU are in the same group + if shuffle: + sampler = DistributedGroupSampler( + dataset, samples_per_gpu, world_size, rank, seed=seed) + else: + sampler = DistributedSampler( + dataset, world_size, rank, shuffle=False, seed=seed) + else: + sampler = GroupSampler(dataset, + samples_per_gpu) if shuffle else None + batch_sampler = None + + init_fn = partial( + worker_init_fn, num_workers=num_workers, rank=rank, + seed=seed) if seed is not None else None + + if (TORCH_VERSION != 'parrots' + and digit_version(TORCH_VERSION) >= digit_version('1.7.0')): + kwargs['persistent_workers'] = persistent_workers + elif persistent_workers is True: + warnings.warn('persistent_workers is invalid because your pytorch ' + 'version is lower than 1.7.0') + + data_loader = DataLoader( + dataset, + batch_size=batch_size, + sampler=sampler, + num_workers=num_workers, + batch_sampler=batch_sampler, + collate_fn=partial(collate, samples_per_gpu=samples_per_gpu), + pin_memory=kwargs.pop('pin_memory', False), + worker_init_fn=init_fn, + **kwargs) + + return data_loader + + +def worker_init_fn(worker_id, num_workers, rank, seed): + # The seed of each worker equals to + # num_worker * rank + worker_id + user_seed + worker_seed = num_workers * rank + worker_id + seed + np.random.seed(worker_seed) + random.seed(worker_seed) + torch.manual_seed(worker_seed) diff --git a/mmdet/datasets/cityscapes.py b/mmdet/datasets/cityscapes.py new file mode 100644 index 0000000..c998d12 --- /dev/null +++ b/mmdet/datasets/cityscapes.py @@ -0,0 +1,339 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# Modified from https://github.com/facebookresearch/detectron2/blob/master/detectron2/data/datasets/cityscapes.py # noqa +# and https://github.com/mcordts/cityscapesScripts/blob/master/cityscapesscripts/evaluation/evalInstanceLevelSemanticLabeling.py # noqa + +import glob +import os +import os.path as osp +import tempfile +from collections import OrderedDict + +import mmcv +import numpy as np +import pycocotools.mask as maskUtils +from mmcv.utils import print_log + +from .builder import DATASETS +from .coco import CocoDataset + + +@DATASETS.register_module() +class CityscapesDataset(CocoDataset): + + CLASSES = ('person', 'rider', 'car', 'truck', 'bus', 'train', 'motorcycle', + 'bicycle') + + PALETTE = [(220, 20, 60), (255, 0, 0), (0, 0, 142), (0, 0, 70), + (0, 60, 100), (0, 80, 100), (0, 0, 230), (119, 11, 32)] + + def _filter_imgs(self, min_size=32): + """Filter images too small or without ground truths.""" + valid_inds = [] + # obtain images that contain annotation + ids_with_ann = set(_['image_id'] for _ in self.coco.anns.values()) + # obtain images that contain annotations of the required categories + ids_in_cat = set() + for i, class_id in enumerate(self.cat_ids): + ids_in_cat |= set(self.coco.cat_img_map[class_id]) + # merge the image id sets of the two conditions and use the merged set + # to filter out images if self.filter_empty_gt=True + ids_in_cat &= ids_with_ann + + valid_img_ids = [] + for i, img_info in enumerate(self.data_infos): + img_id = img_info['id'] + ann_ids = self.coco.getAnnIds(imgIds=[img_id]) + ann_info = self.coco.loadAnns(ann_ids) + all_iscrowd = all([_['iscrowd'] for _ in ann_info]) + if self.filter_empty_gt and (self.img_ids[i] not in ids_in_cat + or all_iscrowd): + continue + if min(img_info['width'], img_info['height']) >= min_size: + valid_inds.append(i) + valid_img_ids.append(img_id) + self.img_ids = valid_img_ids + return valid_inds + + def _parse_ann_info(self, img_info, ann_info): + """Parse bbox and mask annotation. + + Args: + img_info (dict): Image info of an image. + ann_info (list[dict]): Annotation info of an image. + + Returns: + dict: A dict containing the following keys: bboxes, \ + bboxes_ignore, labels, masks, seg_map. \ + "masks" are already decoded into binary masks. + """ + gt_bboxes = [] + gt_labels = [] + gt_bboxes_ignore = [] + gt_masks_ann = [] + + for i, ann in enumerate(ann_info): + if ann.get('ignore', False): + continue + x1, y1, w, h = ann['bbox'] + if ann['area'] <= 0 or w < 1 or h < 1: + continue + if ann['category_id'] not in self.cat_ids: + continue + bbox = [x1, y1, x1 + w, y1 + h] + if ann.get('iscrowd', False): + gt_bboxes_ignore.append(bbox) + else: + gt_bboxes.append(bbox) + gt_labels.append(self.cat2label[ann['category_id']]) + gt_masks_ann.append(ann['segmentation']) + + if gt_bboxes: + gt_bboxes = np.array(gt_bboxes, dtype=np.float32) + gt_labels = np.array(gt_labels, dtype=np.int64) + else: + gt_bboxes = np.zeros((0, 4), dtype=np.float32) + gt_labels = np.array([], dtype=np.int64) + + if gt_bboxes_ignore: + gt_bboxes_ignore = np.array(gt_bboxes_ignore, dtype=np.float32) + else: + gt_bboxes_ignore = np.zeros((0, 4), dtype=np.float32) + + ann = dict( + bboxes=gt_bboxes, + labels=gt_labels, + bboxes_ignore=gt_bboxes_ignore, + masks=gt_masks_ann, + seg_map=img_info['segm_file']) + + return ann + + def results2txt(self, results, outfile_prefix): + """Dump the detection results to a txt file. + + Args: + results (list[list | tuple]): Testing results of the + dataset. + outfile_prefix (str): The filename prefix of the json files. + If the prefix is "somepath/xxx", + the txt files will be named "somepath/xxx.txt". + + Returns: + list[str]: Result txt files which contains corresponding \ + instance segmentation images. + """ + try: + import cityscapesscripts.helpers.labels as CSLabels + except ImportError: + raise ImportError('Please run "pip install citscapesscripts" to ' + 'install cityscapesscripts first.') + result_files = [] + os.makedirs(outfile_prefix, exist_ok=True) + prog_bar = mmcv.ProgressBar(len(self)) + for idx in range(len(self)): + result = results[idx] + filename = self.data_infos[idx]['filename'] + basename = osp.splitext(osp.basename(filename))[0] + pred_txt = osp.join(outfile_prefix, basename + '_pred.txt') + + bbox_result, segm_result = result + bboxes = np.vstack(bbox_result) + # segm results + if isinstance(segm_result, tuple): + # Some detectors use different scores for bbox and mask, + # like Mask Scoring R-CNN. Score of segm will be used instead + # of bbox score. + segms = mmcv.concat_list(segm_result[0]) + mask_score = segm_result[1] + else: + # use bbox score for mask score + segms = mmcv.concat_list(segm_result) + mask_score = [bbox[-1] for bbox in bboxes] + labels = [ + np.full(bbox.shape[0], i, dtype=np.int32) + for i, bbox in enumerate(bbox_result) + ] + labels = np.concatenate(labels) + + assert len(bboxes) == len(segms) == len(labels) + num_instances = len(bboxes) + prog_bar.update() + with open(pred_txt, 'w') as fout: + for i in range(num_instances): + pred_class = labels[i] + classes = self.CLASSES[pred_class] + class_id = CSLabels.name2label[classes].id + score = mask_score[i] + mask = maskUtils.decode(segms[i]).astype(np.uint8) + png_filename = osp.join(outfile_prefix, + basename + f'_{i}_{classes}.png') + mmcv.imwrite(mask, png_filename) + fout.write(f'{osp.basename(png_filename)} {class_id} ' + f'{score}\n') + result_files.append(pred_txt) + + return result_files + + def format_results(self, results, txtfile_prefix=None): + """Format the results to txt (standard format for Cityscapes + evaluation). + + Args: + results (list): Testing results of the dataset. + txtfile_prefix (str | None): The prefix of txt files. It includes + the file path and the prefix of filename, e.g., "a/b/prefix". + If not specified, a temp file will be created. Default: None. + + Returns: + tuple: (result_files, tmp_dir), result_files is a dict containing \ + the json filepaths, tmp_dir is the temporal directory created \ + for saving txt/png files when txtfile_prefix is not specified. + """ + assert isinstance(results, list), 'results must be a list' + assert len(results) == len(self), ( + 'The length of results is not equal to the dataset len: {} != {}'. + format(len(results), len(self))) + + assert isinstance(results, list), 'results must be a list' + assert len(results) == len(self), ( + 'The length of results is not equal to the dataset len: {} != {}'. + format(len(results), len(self))) + + if txtfile_prefix is None: + tmp_dir = tempfile.TemporaryDirectory() + txtfile_prefix = osp.join(tmp_dir.name, 'results') + else: + tmp_dir = None + result_files = self.results2txt(results, txtfile_prefix) + + return result_files, tmp_dir + + def evaluate(self, + results, + metric='bbox', + logger=None, + outfile_prefix=None, + classwise=False, + proposal_nums=(100, 300, 1000), + iou_thrs=np.arange(0.5, 0.96, 0.05)): + """Evaluation in Cityscapes/COCO protocol. + + Args: + results (list[list | tuple]): Testing results of the dataset. + metric (str | list[str]): Metrics to be evaluated. Options are + 'bbox', 'segm', 'proposal', 'proposal_fast'. + logger (logging.Logger | str | None): Logger used for printing + related information during evaluation. Default: None. + outfile_prefix (str | None): The prefix of output file. It includes + the file path and the prefix of filename, e.g., "a/b/prefix". + If results are evaluated with COCO protocol, it would be the + prefix of output json file. For example, the metric is 'bbox' + and 'segm', then json files would be "a/b/prefix.bbox.json" and + "a/b/prefix.segm.json". + If results are evaluated with cityscapes protocol, it would be + the prefix of output txt/png files. The output files would be + png images under folder "a/b/prefix/xxx/" and the file name of + images would be written into a txt file + "a/b/prefix/xxx_pred.txt", where "xxx" is the video name of + cityscapes. If not specified, a temp file will be created. + Default: None. + classwise (bool): Whether to evaluating the AP for each class. + proposal_nums (Sequence[int]): Proposal number used for evaluating + recalls, such as recall@100, recall@1000. + Default: (100, 300, 1000). + iou_thrs (Sequence[float]): IoU threshold used for evaluating + recalls. If set to a list, the average recall of all IoUs will + also be computed. Default: 0.5. + + Returns: + dict[str, float]: COCO style evaluation metric or cityscapes mAP \ + and AP@50. + """ + eval_results = dict() + + metrics = metric.copy() if isinstance(metric, list) else [metric] + + if 'cityscapes' in metrics: + eval_results.update( + self._evaluate_cityscapes(results, outfile_prefix, logger)) + metrics.remove('cityscapes') + + # left metrics are all coco metric + if len(metrics) > 0: + # create CocoDataset with CityscapesDataset annotation + self_coco = CocoDataset(self.ann_file, self.pipeline.transforms, + None, self.data_root, self.img_prefix, + self.seg_prefix, self.seg_suffix, + self.proposal_file, self.test_mode, + self.filter_empty_gt) + # TODO: remove this in the future + # reload annotations of correct class + self_coco.CLASSES = self.CLASSES + self_coco.data_infos = self_coco.load_annotations(self.ann_file) + eval_results.update( + self_coco.evaluate(results, metrics, logger, outfile_prefix, + classwise, proposal_nums, iou_thrs)) + + return eval_results + + def _evaluate_cityscapes(self, results, txtfile_prefix, logger): + """Evaluation in Cityscapes protocol. + + Args: + results (list): Testing results of the dataset. + txtfile_prefix (str | None): The prefix of output txt file + logger (logging.Logger | str | None): Logger used for printing + related information during evaluation. Default: None. + + Returns: + dict[str: float]: Cityscapes evaluation results, contains 'mAP' \ + and 'AP@50'. + """ + + try: + import cityscapesscripts.evaluation.evalInstanceLevelSemanticLabeling as CSEval # noqa + except ImportError: + raise ImportError('Please run "pip install citscapesscripts" to ' + 'install cityscapesscripts first.') + msg = 'Evaluating in Cityscapes style' + if logger is None: + msg = '\n' + msg + print_log(msg, logger=logger) + + result_files, tmp_dir = self.format_results(results, txtfile_prefix) + + if tmp_dir is None: + result_dir = osp.join(txtfile_prefix, 'results') + else: + result_dir = osp.join(tmp_dir.name, 'results') + + eval_results = OrderedDict() + print_log(f'Evaluating results under {result_dir} ...', logger=logger) + + # set global states in cityscapes evaluation API + CSEval.args.cityscapesPath = os.path.join(self.img_prefix, '../..') + CSEval.args.predictionPath = os.path.abspath(result_dir) + CSEval.args.predictionWalk = None + CSEval.args.JSONOutput = False + CSEval.args.colorized = False + CSEval.args.gtInstancesFile = os.path.join(result_dir, + 'gtInstances.json') + CSEval.args.groundTruthSearch = os.path.join( + self.img_prefix.replace('leftImg8bit', 'gtFine'), + '*/*_gtFine_instanceIds.png') + + groundTruthImgList = glob.glob(CSEval.args.groundTruthSearch) + assert len(groundTruthImgList), 'Cannot find ground truth images' \ + f' in {CSEval.args.groundTruthSearch}.' + predictionImgList = [] + for gt in groundTruthImgList: + predictionImgList.append(CSEval.getPrediction(gt, CSEval.args)) + CSEval_results = CSEval.evaluateImgLists(predictionImgList, + groundTruthImgList, + CSEval.args)['averages'] + + eval_results['mAP'] = CSEval_results['allAp'] + eval_results['AP@50'] = CSEval_results['allAp50%'] + if tmp_dir is not None: + tmp_dir.cleanup() + return eval_results diff --git a/mmdet/datasets/coco.py b/mmdet/datasets/coco.py new file mode 100644 index 0000000..d20a121 --- /dev/null +++ b/mmdet/datasets/coco.py @@ -0,0 +1,649 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import contextlib +import io +import itertools +import logging +import os.path as osp +import tempfile +import warnings +from collections import OrderedDict + +import mmcv +import numpy as np +from mmcv.utils import print_log +from terminaltables import AsciiTable + +from mmdet.core import eval_recalls +from .api_wrappers import COCO, COCOeval +from .builder import DATASETS +from .custom import CustomDataset + + +@DATASETS.register_module() +class CocoDataset(CustomDataset): + + CLASSES = ('person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', + 'train', 'truck', 'boat', 'traffic light', 'fire hydrant', + 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', + 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe', + 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee', + 'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', + 'baseball glove', 'skateboard', 'surfboard', 'tennis racket', + 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', + 'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', + 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch', + 'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', + 'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', + 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', + 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush') + + PALETTE = [(220, 20, 60), (119, 11, 32), (0, 0, 142), (0, 0, 230), + (106, 0, 228), (0, 60, 100), (0, 80, 100), (0, 0, 70), + (0, 0, 192), (250, 170, 30), (100, 170, 30), (220, 220, 0), + (175, 116, 175), (250, 0, 30), (165, 42, 42), (255, 77, 255), + (0, 226, 252), (182, 182, 255), (0, 82, 0), (120, 166, 157), + (110, 76, 0), (174, 57, 255), (199, 100, 0), (72, 0, 118), + (255, 179, 240), (0, 125, 92), (209, 0, 151), (188, 208, 182), + (0, 220, 176), (255, 99, 164), (92, 0, 73), (133, 129, 255), + (78, 180, 255), (0, 228, 0), (174, 255, 243), (45, 89, 255), + (134, 134, 103), (145, 148, 174), (255, 208, 186), + (197, 226, 255), (171, 134, 1), (109, 63, 54), (207, 138, 255), + (151, 0, 95), (9, 80, 61), (84, 105, 51), (74, 65, 105), + (166, 196, 102), (208, 195, 210), (255, 109, 65), (0, 143, 149), + (179, 0, 194), (209, 99, 106), (5, 121, 0), (227, 255, 205), + (147, 186, 208), (153, 69, 1), (3, 95, 161), (163, 255, 0), + (119, 0, 170), (0, 182, 199), (0, 165, 120), (183, 130, 88), + (95, 32, 0), (130, 114, 135), (110, 129, 133), (166, 74, 118), + (219, 142, 185), (79, 210, 114), (178, 90, 62), (65, 70, 15), + (127, 167, 115), (59, 105, 106), (142, 108, 45), (196, 172, 0), + (95, 54, 80), (128, 76, 255), (201, 57, 1), (246, 0, 122), + (191, 162, 208)] + + def load_annotations(self, ann_file): + """Load annotation from COCO style annotation file. + + Args: + ann_file (str): Path of annotation file. + + Returns: + list[dict]: Annotation info from COCO api. + """ + + self.coco = COCO(ann_file) + # The order of returned `cat_ids` will not + # change with the order of the CLASSES + self.cat_ids = self.coco.get_cat_ids(cat_names=self.CLASSES) + + self.cat2label = {cat_id: i for i, cat_id in enumerate(self.cat_ids)} + self.img_ids = self.coco.get_img_ids() + data_infos = [] + total_ann_ids = [] + for i in self.img_ids: + info = self.coco.load_imgs([i])[0] + info['filename'] = info['file_name'] + data_infos.append(info) + ann_ids = self.coco.get_ann_ids(img_ids=[i]) + total_ann_ids.extend(ann_ids) + assert len(set(total_ann_ids)) == len( + total_ann_ids), f"Annotation ids in '{ann_file}' are not unique!" + return data_infos + + def get_ann_info(self, idx): + """Get COCO annotation by index. + + Args: + idx (int): Index of data. + + Returns: + dict: Annotation info of specified index. + """ + + img_id = self.data_infos[idx]['id'] + ann_ids = self.coco.get_ann_ids(img_ids=[img_id]) + ann_info = self.coco.load_anns(ann_ids) + return self._parse_ann_info(self.data_infos[idx], ann_info) + + def get_cat_ids(self, idx): + """Get COCO category ids by index. + + Args: + idx (int): Index of data. + + Returns: + list[int]: All categories in the image of specified index. + """ + + img_id = self.data_infos[idx]['id'] + ann_ids = self.coco.get_ann_ids(img_ids=[img_id]) + ann_info = self.coco.load_anns(ann_ids) + return [ann['category_id'] for ann in ann_info] + + def _filter_imgs(self, min_size=32): + """Filter images too small or without ground truths.""" + valid_inds = [] + # obtain images that contain annotation + ids_with_ann = set(_['image_id'] for _ in self.coco.anns.values()) + # obtain images that contain annotations of the required categories + ids_in_cat = set() + for i, class_id in enumerate(self.cat_ids): + ids_in_cat |= set(self.coco.cat_img_map[class_id]) + # merge the image id sets of the two conditions and use the merged set + # to filter out images if self.filter_empty_gt=True + ids_in_cat &= ids_with_ann + + valid_img_ids = [] + for i, img_info in enumerate(self.data_infos): + img_id = self.img_ids[i] + if self.filter_empty_gt and img_id not in ids_in_cat: + continue + if min(img_info['width'], img_info['height']) >= min_size: + valid_inds.append(i) + valid_img_ids.append(img_id) + self.img_ids = valid_img_ids + return valid_inds + + def _parse_ann_info(self, img_info, ann_info): + """Parse bbox and mask annotation. + + Args: + ann_info (list[dict]): Annotation info of an image. + with_mask (bool): Whether to parse mask annotations. + + Returns: + dict: A dict containing the following keys: bboxes, bboxes_ignore,\ + labels, masks, seg_map. "masks" are raw annotations and not \ + decoded into binary masks. + """ + gt_bboxes = [] + gt_labels = [] + gt_bboxes_ignore = [] + gt_masks_ann = [] + for i, ann in enumerate(ann_info): + if ann.get('ignore', False): + continue + x1, y1, w, h = ann['bbox'] + inter_w = max(0, min(x1 + w, img_info['width']) - max(x1, 0)) + inter_h = max(0, min(y1 + h, img_info['height']) - max(y1, 0)) + if inter_w * inter_h == 0: + continue + if ann['area'] <= 0 or w < 1 or h < 1: + continue + if ann['category_id'] not in self.cat_ids: + continue + bbox = [x1, y1, x1 + w, y1 + h] + if ann.get('iscrowd', False): + gt_bboxes_ignore.append(bbox) + else: + gt_bboxes.append(bbox) + gt_labels.append(self.cat2label[ann['category_id']]) + gt_masks_ann.append(ann.get('segmentation', None)) + + if gt_bboxes: + gt_bboxes = np.array(gt_bboxes, dtype=np.float32) + gt_labels = np.array(gt_labels, dtype=np.int64) + else: + gt_bboxes = np.zeros((0, 4), dtype=np.float32) + gt_labels = np.array([], dtype=np.int64) + + if gt_bboxes_ignore: + gt_bboxes_ignore = np.array(gt_bboxes_ignore, dtype=np.float32) + else: + gt_bboxes_ignore = np.zeros((0, 4), dtype=np.float32) + + seg_map = img_info['filename'].rsplit('.', 1)[0] + self.seg_suffix + + ann = dict( + bboxes=gt_bboxes, + labels=gt_labels, + bboxes_ignore=gt_bboxes_ignore, + masks=gt_masks_ann, + seg_map=seg_map) + + return ann + + def xyxy2xywh(self, bbox): + """Convert ``xyxy`` style bounding boxes to ``xywh`` style for COCO + evaluation. + + Args: + bbox (numpy.ndarray): The bounding boxes, shape (4, ), in + ``xyxy`` order. + + Returns: + list[float]: The converted bounding boxes, in ``xywh`` order. + """ + + _bbox = bbox.tolist() + return [ + _bbox[0], + _bbox[1], + _bbox[2] - _bbox[0], + _bbox[3] - _bbox[1], + ] + + def _proposal2json(self, results): + """Convert proposal results to COCO json style.""" + json_results = [] + for idx in range(len(self)): + img_id = self.img_ids[idx] + bboxes = results[idx] + for i in range(bboxes.shape[0]): + data = dict() + data['image_id'] = img_id + data['bbox'] = self.xyxy2xywh(bboxes[i]) + data['score'] = float(bboxes[i][4]) + data['category_id'] = 1 + json_results.append(data) + return json_results + + def _det2json(self, results): + """Convert detection results to COCO json style.""" + json_results = [] + for idx in range(len(self)): + img_id = self.img_ids[idx] + result = results[idx] + for label in range(len(result)): + bboxes = result[label] + for i in range(bboxes.shape[0]): + data = dict() + data['image_id'] = img_id + data['bbox'] = self.xyxy2xywh(bboxes[i]) + data['score'] = float(bboxes[i][4]) + data['category_id'] = self.cat_ids[label] + json_results.append(data) + return json_results + + def _segm2json(self, results): + """Convert instance segmentation results to COCO json style.""" + bbox_json_results = [] + segm_json_results = [] + for idx in range(len(self)): + img_id = self.img_ids[idx] + det, seg = results[idx] + for label in range(len(det)): + # bbox results + bboxes = det[label] + for i in range(bboxes.shape[0]): + data = dict() + data['image_id'] = img_id + data['bbox'] = self.xyxy2xywh(bboxes[i]) + data['score'] = float(bboxes[i][4]) + data['category_id'] = self.cat_ids[label] + bbox_json_results.append(data) + + # segm results + # some detectors use different scores for bbox and mask + if isinstance(seg, tuple): + segms = seg[0][label] + mask_score = seg[1][label] + else: + segms = seg[label] + mask_score = [bbox[4] for bbox in bboxes] + for i in range(bboxes.shape[0]): + data = dict() + data['image_id'] = img_id + data['bbox'] = self.xyxy2xywh(bboxes[i]) + data['score'] = float(mask_score[i]) + data['category_id'] = self.cat_ids[label] + if isinstance(segms[i]['counts'], bytes): + segms[i]['counts'] = segms[i]['counts'].decode() + data['segmentation'] = segms[i] + segm_json_results.append(data) + return bbox_json_results, segm_json_results + + def results2json(self, results, outfile_prefix): + """Dump the detection results to a COCO style json file. + + There are 3 types of results: proposals, bbox predictions, mask + predictions, and they have different data types. This method will + automatically recognize the type, and dump them to json files. + + Args: + results (list[list | tuple | ndarray]): Testing results of the + dataset. + outfile_prefix (str): The filename prefix of the json files. If the + prefix is "somepath/xxx", the json files will be named + "somepath/xxx.bbox.json", "somepath/xxx.segm.json", + "somepath/xxx.proposal.json". + + Returns: + dict[str: str]: Possible keys are "bbox", "segm", "proposal", and \ + values are corresponding filenames. + """ + result_files = dict() + if isinstance(results[0], list): + json_results = self._det2json(results) + result_files['bbox'] = f'{outfile_prefix}.bbox.json' + result_files['proposal'] = f'{outfile_prefix}.bbox.json' + mmcv.dump(json_results, result_files['bbox']) + elif isinstance(results[0], tuple): + json_results = self._segm2json(results) + result_files['bbox'] = f'{outfile_prefix}.bbox.json' + result_files['proposal'] = f'{outfile_prefix}.bbox.json' + result_files['segm'] = f'{outfile_prefix}.segm.json' + mmcv.dump(json_results[0], result_files['bbox']) + mmcv.dump(json_results[1], result_files['segm']) + elif isinstance(results[0], np.ndarray): + json_results = self._proposal2json(results) + result_files['proposal'] = f'{outfile_prefix}.proposal.json' + mmcv.dump(json_results, result_files['proposal']) + else: + raise TypeError('invalid type of results') + return result_files + + def fast_eval_recall(self, results, proposal_nums, iou_thrs, logger=None): + gt_bboxes = [] + for i in range(len(self.img_ids)): + ann_ids = self.coco.get_ann_ids(img_ids=self.img_ids[i]) + ann_info = self.coco.load_anns(ann_ids) + if len(ann_info) == 0: + gt_bboxes.append(np.zeros((0, 4))) + continue + bboxes = [] + for ann in ann_info: + if ann.get('ignore', False) or ann['iscrowd']: + continue + x1, y1, w, h = ann['bbox'] + bboxes.append([x1, y1, x1 + w, y1 + h]) + bboxes = np.array(bboxes, dtype=np.float32) + if bboxes.shape[0] == 0: + bboxes = np.zeros((0, 4)) + gt_bboxes.append(bboxes) + + recalls = eval_recalls( + gt_bboxes, results, proposal_nums, iou_thrs, logger=logger) + ar = recalls.mean(axis=1) + return ar + + def format_results(self, results, jsonfile_prefix=None, **kwargs): + """Format the results to json (standard format for COCO evaluation). + + Args: + results (list[tuple | numpy.ndarray]): Testing results of the + dataset. + jsonfile_prefix (str | None): The prefix of json files. It includes + the file path and the prefix of filename, e.g., "a/b/prefix". + If not specified, a temp file will be created. Default: None. + + Returns: + tuple: (result_files, tmp_dir), result_files is a dict containing \ + the json filepaths, tmp_dir is the temporal directory created \ + for saving json files when jsonfile_prefix is not specified. + """ + assert isinstance(results, list), 'results must be a list' + assert len(results) == len(self), ( + 'The length of results is not equal to the dataset len: {} != {}'. + format(len(results), len(self))) + + if jsonfile_prefix is None: + tmp_dir = tempfile.TemporaryDirectory() + jsonfile_prefix = osp.join(tmp_dir.name, 'results') + else: + tmp_dir = None + result_files = self.results2json(results, jsonfile_prefix) + return result_files, tmp_dir + + def evaluate_det_segm(self, + results, + result_files, + coco_gt, + metrics, + logger=None, + classwise=False, + proposal_nums=(100, 300, 1000), + iou_thrs=None, + metric_items=None): + """Instance segmentation and object detection evaluation in COCO + protocol. + + Args: + results (list[list | tuple | dict]): Testing results of the + dataset. + result_files (dict[str, str]): a dict contains json file path. + coco_gt (COCO): COCO API object with ground truth annotation. + metric (str | list[str]): Metrics to be evaluated. Options are + 'bbox', 'segm', 'proposal', 'proposal_fast'. + logger (logging.Logger | str | None): Logger used for printing + related information during evaluation. Default: None. + classwise (bool): Whether to evaluating the AP for each class. + proposal_nums (Sequence[int]): Proposal number used for evaluating + recalls, such as recall@100, recall@1000. + Default: (100, 300, 1000). + iou_thrs (Sequence[float], optional): IoU threshold used for + evaluating recalls/mAPs. If set to a list, the average of all + IoUs will also be computed. If not specified, [0.50, 0.55, + 0.60, 0.65, 0.70, 0.75, 0.80, 0.85, 0.90, 0.95] will be used. + Default: None. + metric_items (list[str] | str, optional): Metric items that will + be returned. If not specified, ``['AR@100', 'AR@300', + 'AR@1000', 'AR_s@1000', 'AR_m@1000', 'AR_l@1000' ]`` will be + used when ``metric=='proposal'``, ``['mAP', 'mAP_50', 'mAP_75', + 'mAP_s', 'mAP_m', 'mAP_l']`` will be used when + ``metric=='bbox' or metric=='segm'``. + + Returns: + dict[str, float]: COCO style evaluation metric. + """ + if iou_thrs is None: + iou_thrs = np.linspace( + .5, 0.95, int(np.round((0.95 - .5) / .05)) + 1, endpoint=True) + if metric_items is not None: + if not isinstance(metric_items, list): + metric_items = [metric_items] + + eval_results = OrderedDict() + for metric in metrics: + msg = f'Evaluating {metric}...' + if logger is None: + msg = '\n' + msg + print_log(msg, logger=logger) + + if metric == 'proposal_fast': + if isinstance(results[0], tuple): + raise KeyError('proposal_fast is not supported for ' + 'instance segmentation result.') + ar = self.fast_eval_recall( + results, proposal_nums, iou_thrs, logger='silent') + log_msg = [] + for i, num in enumerate(proposal_nums): + eval_results[f'AR@{num}'] = ar[i] + log_msg.append(f'\nAR@{num}\t{ar[i]:.4f}') + log_msg = ''.join(log_msg) + print_log(log_msg, logger=logger) + continue + + iou_type = 'bbox' if metric == 'proposal' else metric + if metric not in result_files: + raise KeyError(f'{metric} is not in results') + try: + predictions = mmcv.load(result_files[metric]) + if iou_type == 'segm': + # Refer to https://github.com/cocodataset/cocoapi/blob/master/PythonAPI/pycocotools/coco.py#L331 # noqa + # When evaluating mask AP, if the results contain bbox, + # cocoapi will use the box area instead of the mask area + # for calculating the instance area. Though the overall AP + # is not affected, this leads to different + # small/medium/large mask AP results. + for x in predictions: + x.pop('bbox') + warnings.simplefilter('once') + warnings.warn( + 'The key "bbox" is deleted for more accurate mask AP ' + 'of small/medium/large instances since v2.12.0. This ' + 'does not change the overall mAP calculation.', + UserWarning) + coco_det = coco_gt.loadRes(predictions) + except IndexError: + print_log( + 'The testing results of the whole dataset is empty.', + logger=logger, + level=logging.ERROR) + break + + cocoEval = COCOeval(coco_gt, coco_det, iou_type) + cocoEval.params.catIds = self.cat_ids + cocoEval.params.imgIds = self.img_ids + cocoEval.params.maxDets = list(proposal_nums) + cocoEval.params.iouThrs = iou_thrs + # mapping of cocoEval.stats + coco_metric_names = { + 'mAP': 0, + 'mAP_50': 1, + 'mAP_75': 2, + 'mAP_s': 3, + 'mAP_m': 4, + 'mAP_l': 5, + 'AR@100': 6, + 'AR@300': 7, + 'AR@1000': 8, + 'AR_s@1000': 9, + 'AR_m@1000': 10, + 'AR_l@1000': 11 + } + if metric_items is not None: + for metric_item in metric_items: + if metric_item not in coco_metric_names: + raise KeyError( + f'metric item {metric_item} is not supported') + + if metric == 'proposal': + cocoEval.params.useCats = 0 + cocoEval.evaluate() + cocoEval.accumulate() + + # Save coco summarize print information to logger + redirect_string = io.StringIO() + with contextlib.redirect_stdout(redirect_string): + cocoEval.summarize() + print_log('\n' + redirect_string.getvalue(), logger=logger) + + if metric_items is None: + metric_items = [ + 'AR@100', 'AR@300', 'AR@1000', 'AR_s@1000', + 'AR_m@1000', 'AR_l@1000' + ] + + for item in metric_items: + val = float( + f'{cocoEval.stats[coco_metric_names[item]]:.4f}') + eval_results[item] = val + else: + cocoEval.evaluate() + cocoEval.accumulate() + + # Save coco summarize print information to logger + redirect_string = io.StringIO() + with contextlib.redirect_stdout(redirect_string): + cocoEval.summarize() + print_log('\n' + redirect_string.getvalue(), logger=logger) + + if classwise: # Compute per-category AP + # Compute per-category AP + # from https://github.com/facebookresearch/detectron2/ + precisions = cocoEval.eval['precision'] + # precision: (iou, recall, cls, area range, max dets) + assert len(self.cat_ids) == precisions.shape[2] + + results_per_category = [] + for idx, catId in enumerate(self.cat_ids): + # area range index 0: all area ranges + # max dets index -1: typically 100 per image + nm = self.coco.loadCats(catId)[0] + precision = precisions[:, :, idx, 0, -1] + precision = precision[precision > -1] + if precision.size: + ap = np.mean(precision) + else: + ap = float('nan') + results_per_category.append( + (f'{nm["name"]}', f'{float(ap):0.3f}')) + + num_columns = min(6, len(results_per_category) * 2) + results_flatten = list( + itertools.chain(*results_per_category)) + headers = ['category', 'AP'] * (num_columns // 2) + results_2d = itertools.zip_longest(*[ + results_flatten[i::num_columns] + for i in range(num_columns) + ]) + table_data = [headers] + table_data += [result for result in results_2d] + table = AsciiTable(table_data) + print_log('\n' + table.table, logger=logger) + + if metric_items is None: + metric_items = [ + 'mAP', 'mAP_50', 'mAP_75', 'mAP_s', 'mAP_m', 'mAP_l' + ] + + for metric_item in metric_items: + key = f'{metric}_{metric_item}' + val = float( + f'{cocoEval.stats[coco_metric_names[metric_item]]:.4f}' + ) + eval_results[key] = val + ap = cocoEval.stats[:6] + eval_results[f'{metric}_mAP_copypaste'] = ( + f'{ap[0]:.4f} {ap[1]:.4f} {ap[2]:.4f} {ap[3]:.4f} ' + f'{ap[4]:.4f} {ap[5]:.4f}') + + return eval_results + + def evaluate(self, + results, + metric='bbox', + logger=None, + jsonfile_prefix=None, + classwise=False, + proposal_nums=(100, 300, 1000), + iou_thrs=None, + metric_items=None): + """Evaluation in COCO protocol. + + Args: + results (list[list | tuple]): Testing results of the dataset. + metric (str | list[str]): Metrics to be evaluated. Options are + 'bbox', 'segm', 'proposal', 'proposal_fast'. + logger (logging.Logger | str | None): Logger used for printing + related information during evaluation. Default: None. + jsonfile_prefix (str | None): The prefix of json files. It includes + the file path and the prefix of filename, e.g., "a/b/prefix". + If not specified, a temp file will be created. Default: None. + classwise (bool): Whether to evaluating the AP for each class. + proposal_nums (Sequence[int]): Proposal number used for evaluating + recalls, such as recall@100, recall@1000. + Default: (100, 300, 1000). + iou_thrs (Sequence[float], optional): IoU threshold used for + evaluating recalls/mAPs. If set to a list, the average of all + IoUs will also be computed. If not specified, [0.50, 0.55, + 0.60, 0.65, 0.70, 0.75, 0.80, 0.85, 0.90, 0.95] will be used. + Default: None. + metric_items (list[str] | str, optional): Metric items that will + be returned. If not specified, ``['AR@100', 'AR@300', + 'AR@1000', 'AR_s@1000', 'AR_m@1000', 'AR_l@1000' ]`` will be + used when ``metric=='proposal'``, ``['mAP', 'mAP_50', 'mAP_75', + 'mAP_s', 'mAP_m', 'mAP_l']`` will be used when + ``metric=='bbox' or metric=='segm'``. + + Returns: + dict[str, float]: COCO style evaluation metric. + """ + + metrics = metric if isinstance(metric, list) else [metric] + allowed_metrics = ['bbox', 'segm', 'proposal', 'proposal_fast'] + for metric in metrics: + if metric not in allowed_metrics: + raise KeyError(f'metric {metric} is not supported') + + coco_gt = self.coco + self.cat_ids = coco_gt.get_cat_ids(cat_names=self.CLASSES) + + result_files, tmp_dir = self.format_results(results, jsonfile_prefix) + eval_results = self.evaluate_det_segm(results, result_files, coco_gt, + metrics, logger, classwise, + proposal_nums, iou_thrs, + metric_items) + + if tmp_dir is not None: + tmp_dir.cleanup() + return eval_results diff --git a/mmdet/datasets/coco_occluded.py b/mmdet/datasets/coco_occluded.py new file mode 100644 index 0000000..96e439a --- /dev/null +++ b/mmdet/datasets/coco_occluded.py @@ -0,0 +1,219 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp + +import mmcv +import numpy as np +from mmcv.fileio import load +from mmcv.utils import print_log +from pycocotools import mask as coco_mask +from terminaltables import AsciiTable + +from .builder import DATASETS +from .coco import CocoDataset + + +@DATASETS.register_module() +class OccludedSeparatedCocoDataset(CocoDataset): + """COCO dataset with evaluation on separated and occluded masks which + presented in paper `A Tri-Layer Plugin to Improve Occluded Detection. + + `_. + + Separated COCO and Occluded COCO are automatically generated subsets of + COCO val dataset, collecting separated objects and partially occluded + objects for a large variety of categories. In this way, we define + occlusion into two major categories: separated and partially occluded. + + - Separation: target object segmentation mask is separated into distinct + regions by the occluder. + - Partial Occlusion: target object is partially occluded but the + segmentation mask is connected. + + These two new scalable real-image datasets are to benchmark a model's + capability to detect occluded objects of 80 common categories. + + Please cite the paper if you use this dataset: + + @article{zhan2022triocc, + title={A Tri-Layer Plugin to Improve Occluded Detection}, + author={Zhan, Guanqi and Xie, Weidi and Zisserman, Andrew}, + journal={British Machine Vision Conference}, + year={2022} + } + + Args: + occluded_ann (str): Path to the occluded coco annotation file. + separated_ann (str): Path to the separated coco annotation file. + """ # noqa + + def __init__( + self, + *args, + occluded_ann='https://www.robots.ox.ac.uk/~vgg/research/tpod/datasets/occluded_coco.pkl', # noqa + separated_ann='https://www.robots.ox.ac.uk/~vgg/research/tpod/datasets/separated_coco.pkl', # noqa + **kwargs): + super().__init__(*args, **kwargs) + + # load from local file + if osp.isfile(occluded_ann) and not osp.isabs(occluded_ann): + occluded_ann = osp.join(self.data_root, occluded_ann) + if osp.isfile(separated_ann) and not osp.isabs(separated_ann): + separated_ann = osp.join(self.data_root, separated_ann) + + self.occluded_ann = load(occluded_ann) + self.separated_ann = load(separated_ann) + + def evaluate(self, + results, + metric=[], + score_thr=0.3, + iou_thr=0.75, + **kwargs): + """Occluded and separated mask evaluation in COCO protocol. + + Args: + results (list[tuple]): Testing results of the dataset. + metric (str | list[str]): Metrics to be evaluated. Options are + 'bbox', 'segm', 'proposal', 'proposal_fast'. Defaults to []. + score_thr (float): Score threshold of the detection masks. + Defaults to 0.3. + iou_thr (float): IoU threshold for the recall calculation. + Defaults to 0.75. + Returns: + dict[str, float]: The recall of occluded and separated masks and + COCO style evaluation metric. + """ + coco_metric_res = super().evaluate(results, metric=metric, **kwargs) + eval_res = self.evaluate_occluded_separated(results, score_thr, + iou_thr) + coco_metric_res.update(eval_res) + return coco_metric_res + + def evaluate_occluded_separated(self, + results, + score_thr=0.3, + iou_thr=0.75): + """Compute the recall of occluded and separated masks. + + Args: + results (list[tuple]): Testing results of the dataset. + score_thr (float): Score threshold of the detection masks. + Defaults to 0.3. + iou_thr (float): IoU threshold for the recall calculation. + Defaults to 0.75. + Returns: + dict[str, float]: The recall of occluded and separated masks. + """ + dict_det = {} + print_log('processing detection results...') + prog_bar = mmcv.ProgressBar(len(results)) + for i in range(len(results)): + cur_img_name = self.data_infos[i]['filename'] + if cur_img_name not in dict_det.keys(): + dict_det[cur_img_name] = [] + for cat_id in range(len(results[i][1])): + assert len(results[i][1][cat_id]) == len(results[i][0][cat_id]) + for instance_id in range(len(results[i][1][cat_id])): + cur_binary_mask = coco_mask.decode( + results[i][1][cat_id][instance_id]) + cur_det_bbox = results[i][0][cat_id][instance_id][:4] + dict_det[cur_img_name].append([ + results[i][0][cat_id][instance_id][4], + self.CLASSES[cat_id], cur_binary_mask, cur_det_bbox + ]) + dict_det[cur_img_name].sort( + key=lambda x: (-x[0], x[3][0], x[3][1]) + ) # rank by confidence from high to low, avoid same confidence + prog_bar.update() + print_log('\ncomputing occluded mask recall...') + occluded_correct_num, occluded_recall = self.compute_recall( + dict_det, + gt_ann=self.occluded_ann, + score_thr=score_thr, + iou_thr=iou_thr, + is_occ=True) + print_log(f'\nCOCO occluded mask recall: {occluded_recall:.2f}%') + print_log(f'COCO occluded mask success num: {occluded_correct_num}') + print_log('computing separated mask recall...') + separated_correct_num, separated_recall = self.compute_recall( + dict_det, + gt_ann=self.separated_ann, + score_thr=score_thr, + iou_thr=iou_thr, + is_occ=False) + print_log(f'\nCOCO separated mask recall: {separated_recall:.2f}%') + print_log(f'COCO separated mask success num: {separated_correct_num}') + table_data = [ + ['mask type', 'recall', 'num correct'], + ['occluded', f'{occluded_recall:.2f}%', occluded_correct_num], + ['separated', f'{separated_recall:.2f}%', separated_correct_num] + ] + table = AsciiTable(table_data) + print_log('\n' + table.table) + return dict( + occluded_recall=occluded_recall, separated_recall=separated_recall) + + def compute_recall(self, + result_dict, + gt_ann, + score_thr=0.3, + iou_thr=0.75, + is_occ=True): + """Compute the recall of occluded or separated masks. + + Args: + results (list[tuple]): Testing results of the dataset. + gt_ann (list): Occluded or separated coco annotations. + score_thr (float): Score threshold of the detection masks. + Defaults to 0.3. + iou_thr (float): IoU threshold for the recall calculation. + Defaults to 0.75. + is_occ (bool): Whether the annotation is occluded mask. + Defaults to True. + Returns: + tuple: number of correct masks and the recall. + """ + correct = 0 + prog_bar = mmcv.ProgressBar(len(gt_ann)) + for iter_i in range(len(gt_ann)): + cur_item = gt_ann[iter_i] + cur_img_name = cur_item[0] + cur_gt_bbox = cur_item[3] + if is_occ: + cur_gt_bbox = [ + cur_gt_bbox[0], cur_gt_bbox[1], + cur_gt_bbox[0] + cur_gt_bbox[2], + cur_gt_bbox[1] + cur_gt_bbox[3] + ] + cur_gt_class = cur_item[1] + cur_gt_mask = coco_mask.decode(cur_item[4]) + + assert cur_img_name in result_dict.keys() + cur_detections = result_dict[cur_img_name] + + correct_flag = False + for i in range(len(cur_detections)): + cur_det_confidence = cur_detections[i][0] + if cur_det_confidence < score_thr: + break + cur_det_class = cur_detections[i][1] + if cur_det_class != cur_gt_class: + continue + cur_det_mask = cur_detections[i][2] + cur_iou = self.mask_iou(cur_det_mask, cur_gt_mask) + if cur_iou >= iou_thr: + correct_flag = True + break + if correct_flag: + correct += 1 + prog_bar.update() + recall = correct / len(gt_ann) * 100 + return correct, recall + + def mask_iou(self, mask1, mask2): + """Compute IoU between two masks.""" + mask1_area = np.count_nonzero(mask1 == 1) + mask2_area = np.count_nonzero(mask2 == 1) + intersection = np.count_nonzero(np.logical_and(mask1 == 1, mask2 == 1)) + iou = intersection / (mask1_area + mask2_area - intersection) + return iou diff --git a/mmdet/datasets/coco_panoptic.py b/mmdet/datasets/coco_panoptic.py new file mode 100644 index 0000000..53ef594 --- /dev/null +++ b/mmdet/datasets/coco_panoptic.py @@ -0,0 +1,692 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import itertools +import os +from collections import defaultdict + +import mmcv +import numpy as np +from mmcv.utils import print_log +from terminaltables import AsciiTable + +from mmdet.core import INSTANCE_OFFSET +from .api_wrappers import COCO, pq_compute_multi_core +from .builder import DATASETS +from .coco import CocoDataset + +try: + import panopticapi + from panopticapi.evaluation import VOID + from panopticapi.utils import id2rgb +except ImportError: + panopticapi = None + id2rgb = None + VOID = None + +__all__ = ['CocoPanopticDataset'] + + +class COCOPanoptic(COCO): + """This wrapper is for loading the panoptic style annotation file. + + The format is shown in the CocoPanopticDataset class. + + Args: + annotation_file (str): Path of annotation file. + """ + + def __init__(self, annotation_file=None): + if panopticapi is None: + raise RuntimeError( + 'panopticapi is not installed, please install it by: ' + 'pip install git+https://github.com/cocodataset/' + 'panopticapi.git.') + + super(COCOPanoptic, self).__init__(annotation_file) + + def createIndex(self): + # create index + print('creating index...') + # anns stores 'segment_id -> annotation' + anns, cats, imgs = {}, {}, {} + img_to_anns, cat_to_imgs = defaultdict(list), defaultdict(list) + if 'annotations' in self.dataset: + for ann, img_info in zip(self.dataset['annotations'], + self.dataset['images']): + img_info['segm_file'] = ann['file_name'] + for seg_ann in ann['segments_info']: + # to match with instance.json + seg_ann['image_id'] = ann['image_id'] + seg_ann['height'] = img_info['height'] + seg_ann['width'] = img_info['width'] + img_to_anns[ann['image_id']].append(seg_ann) + # segment_id is not unique in coco dataset orz... + if seg_ann['id'] in anns.keys(): + anns[seg_ann['id']].append(seg_ann) + else: + anns[seg_ann['id']] = [seg_ann] + + if 'images' in self.dataset: + for img in self.dataset['images']: + imgs[img['id']] = img + + if 'categories' in self.dataset: + for cat in self.dataset['categories']: + cats[cat['id']] = cat + + if 'annotations' in self.dataset and 'categories' in self.dataset: + for ann in self.dataset['annotations']: + for seg_ann in ann['segments_info']: + cat_to_imgs[seg_ann['category_id']].append(ann['image_id']) + + print('index created!') + + self.anns = anns + self.imgToAnns = img_to_anns + self.catToImgs = cat_to_imgs + self.imgs = imgs + self.cats = cats + + def load_anns(self, ids=[]): + """Load anns with the specified ids. + + self.anns is a list of annotation lists instead of a + list of annotations. + + Args: + ids (int array): integer ids specifying anns + + Returns: + anns (object array): loaded ann objects + """ + anns = [] + + if hasattr(ids, '__iter__') and hasattr(ids, '__len__'): + # self.anns is a list of annotation lists instead of + # a list of annotations + for id in ids: + anns += self.anns[id] + return anns + elif type(ids) == int: + return self.anns[ids] + + +@DATASETS.register_module() +class CocoPanopticDataset(CocoDataset): + """Coco dataset for Panoptic segmentation. + + The annotation format is shown as follows. The `ann` field is optional + for testing. + + .. code-block:: none + + [ + { + 'filename': f'{image_id:012}.png', + 'image_id':9 + 'segments_info': { + [ + { + 'id': 8345037, (segment_id in panoptic png, + convert from rgb) + 'category_id': 51, + 'iscrowd': 0, + 'bbox': (x1, y1, w, h), + 'area': 24315, + 'segmentation': list,(coded mask) + }, + ... + } + } + }, + ... + ] + + Args: + ann_file (str): Panoptic segmentation annotation file path. + pipeline (list[dict]): Processing pipeline. + ins_ann_file (str): Instance segmentation annotation file path. + Defaults to None. + classes (str | Sequence[str], optional): Specify classes to load. + If is None, ``cls.CLASSES`` will be used. Defaults to None. + data_root (str, optional): Data root for ``ann_file``, + ``ins_ann_file`` ``img_prefix``, ``seg_prefix``, ``proposal_file`` + if specified. Defaults to None. + img_prefix (str, optional): Prefix of path to images. Defaults to ''. + seg_prefix (str, optional): Prefix of path to segmentation files. + Defaults to None. + proposal_file (str, optional): Path to proposal file. Defaults to None. + test_mode (bool, optional): If set True, annotation will not be loaded. + Defaults to False. + filter_empty_gt (bool, optional): If set true, images without bounding + boxes of the dataset's classes will be filtered out. This option + only works when `test_mode=False`, i.e., we never filter images + during tests. Defaults to True. + file_client_args (:obj:`mmcv.ConfigDict` | dict): file client args. + Defaults to dict(backend='disk'). + """ + CLASSES = [ + 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', + ' truck', 'boat', 'traffic light', 'fire hydrant', 'stop sign', + 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', + 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', + 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', + 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', + 'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', + 'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange', + 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', + 'couch', 'potted plant', 'bed', 'dining table', 'toilet', 'tv', + 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', + 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', + 'scissors', 'teddy bear', 'hair drier', 'toothbrush', 'banner', + 'blanket', 'bridge', 'cardboard', 'counter', 'curtain', 'door-stuff', + 'floor-wood', 'flower', 'fruit', 'gravel', 'house', 'light', + 'mirror-stuff', 'net', 'pillow', 'platform', 'playingfield', + 'railroad', 'river', 'road', 'roof', 'sand', 'sea', 'shelf', 'snow', + 'stairs', 'tent', 'towel', 'wall-brick', 'wall-stone', 'wall-tile', + 'wall-wood', 'water-other', 'window-blind', 'window-other', + 'tree-merged', 'fence-merged', 'ceiling-merged', 'sky-other-merged', + 'cabinet-merged', 'table-merged', 'floor-other-merged', + 'pavement-merged', 'mountain-merged', 'grass-merged', 'dirt-merged', + 'paper-merged', 'food-other-merged', 'building-other-merged', + 'rock-merged', 'wall-other-merged', 'rug-merged' + ] + THING_CLASSES = [ + 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', + 'truck', 'boat', 'traffic light', 'fire hydrant', 'stop sign', + 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', + 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', + 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', + 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', + 'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', + 'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange', + 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', + 'couch', 'potted plant', 'bed', 'dining table', 'toilet', 'tv', + 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', + 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', + 'scissors', 'teddy bear', 'hair drier', 'toothbrush' + ] + STUFF_CLASSES = [ + 'banner', 'blanket', 'bridge', 'cardboard', 'counter', 'curtain', + 'door-stuff', 'floor-wood', 'flower', 'fruit', 'gravel', 'house', + 'light', 'mirror-stuff', 'net', 'pillow', 'platform', 'playingfield', + 'railroad', 'river', 'road', 'roof', 'sand', 'sea', 'shelf', 'snow', + 'stairs', 'tent', 'towel', 'wall-brick', 'wall-stone', 'wall-tile', + 'wall-wood', 'water-other', 'window-blind', 'window-other', + 'tree-merged', 'fence-merged', 'ceiling-merged', 'sky-other-merged', + 'cabinet-merged', 'table-merged', 'floor-other-merged', + 'pavement-merged', 'mountain-merged', 'grass-merged', 'dirt-merged', + 'paper-merged', 'food-other-merged', 'building-other-merged', + 'rock-merged', 'wall-other-merged', 'rug-merged' + ] + + PALETTE = [(220, 20, 60), (119, 11, 32), (0, 0, 142), (0, 0, 230), + (106, 0, 228), (0, 60, 100), (0, 80, 100), (0, 0, 70), + (0, 0, 192), (250, 170, 30), (100, 170, 30), (220, 220, 0), + (175, 116, 175), (250, 0, 30), (165, 42, 42), (255, 77, 255), + (0, 226, 252), (182, 182, 255), (0, 82, 0), (120, 166, 157), + (110, 76, 0), (174, 57, 255), (199, 100, 0), (72, 0, 118), + (255, 179, 240), (0, 125, 92), (209, 0, 151), (188, 208, 182), + (0, 220, 176), (255, 99, 164), (92, 0, 73), (133, 129, 255), + (78, 180, 255), (0, 228, 0), (174, 255, 243), (45, 89, 255), + (134, 134, 103), (145, 148, 174), (255, 208, 186), + (197, 226, 255), (171, 134, 1), (109, 63, 54), (207, 138, 255), + (151, 0, 95), (9, 80, 61), (84, 105, 51), (74, 65, 105), + (166, 196, 102), (208, 195, 210), (255, 109, 65), (0, 143, 149), + (179, 0, 194), (209, 99, 106), (5, 121, 0), (227, 255, 205), + (147, 186, 208), (153, 69, 1), (3, 95, 161), (163, 255, 0), + (119, 0, 170), (0, 182, 199), (0, 165, 120), (183, 130, 88), + (95, 32, 0), (130, 114, 135), (110, 129, 133), (166, 74, 118), + (219, 142, 185), (79, 210, 114), (178, 90, 62), (65, 70, 15), + (127, 167, 115), (59, 105, 106), (142, 108, 45), (196, 172, 0), + (95, 54, 80), (128, 76, 255), (201, 57, 1), (246, 0, 122), + (191, 162, 208), (255, 255, 128), (147, 211, 203), + (150, 100, 100), (168, 171, 172), (146, 112, 198), + (210, 170, 100), (92, 136, 89), (218, 88, 184), (241, 129, 0), + (217, 17, 255), (124, 74, 181), (70, 70, 70), (255, 228, 255), + (154, 208, 0), (193, 0, 92), (76, 91, 113), (255, 180, 195), + (106, 154, 176), + (230, 150, 140), (60, 143, 255), (128, 64, 128), (92, 82, 55), + (254, 212, 124), (73, 77, 174), (255, 160, 98), (255, 255, 255), + (104, 84, 109), (169, 164, 131), (225, 199, 255), (137, 54, 74), + (135, 158, 223), (7, 246, 231), (107, 255, 200), (58, 41, 149), + (183, 121, 142), (255, 73, 97), (107, 142, 35), (190, 153, 153), + (146, 139, 141), + (70, 130, 180), (134, 199, 156), (209, 226, 140), (96, 36, 108), + (96, 96, 96), (64, 170, 64), (152, 251, 152), (208, 229, 228), + (206, 186, 171), (152, 161, 64), (116, 112, 0), (0, 114, 143), + (102, 102, 156), (250, 141, 255)] + + def __init__(self, + ann_file, + pipeline, + ins_ann_file=None, + classes=None, + data_root=None, + img_prefix='', + seg_prefix=None, + proposal_file=None, + test_mode=False, + filter_empty_gt=True, + file_client_args=dict(backend='disk')): + super().__init__( + ann_file, + pipeline, + classes=classes, + data_root=data_root, + img_prefix=img_prefix, + seg_prefix=seg_prefix, + proposal_file=proposal_file, + test_mode=test_mode, + filter_empty_gt=filter_empty_gt, + file_client_args=file_client_args) + self.ins_ann_file = ins_ann_file + + def load_annotations(self, ann_file): + """Load annotation from COCO Panoptic style annotation file. + + Args: + ann_file (str): Path of annotation file. + + Returns: + list[dict]: Annotation info from COCO api. + """ + self.coco = COCOPanoptic(ann_file) + self.cat_ids = self.coco.get_cat_ids() + self.cat2label = {cat_id: i for i, cat_id in enumerate(self.cat_ids)} + self.categories = self.coco.cats + self.img_ids = self.coco.get_img_ids() + data_infos = [] + for i in self.img_ids: + info = self.coco.load_imgs([i])[0] + info['filename'] = info['file_name'] + info['segm_file'] = info['filename'].replace('jpg', 'png') + data_infos.append(info) + return data_infos + + def get_ann_info(self, idx): + """Get COCO annotation by index. + + Args: + idx (int): Index of data. + + Returns: + dict: Annotation info of specified index. + """ + img_id = self.data_infos[idx]['id'] + ann_ids = self.coco.get_ann_ids(img_ids=[img_id]) + ann_info = self.coco.load_anns(ann_ids) + # filter out unmatched images + ann_info = [i for i in ann_info if i['image_id'] == img_id] + return self._parse_ann_info(self.data_infos[idx], ann_info) + + def _parse_ann_info(self, img_info, ann_info): + """Parse annotations and load panoptic ground truths. + + Args: + img_info (int): Image info of an image. + ann_info (list[dict]): Annotation info of an image. + + Returns: + dict: A dict containing the following keys: bboxes, bboxes_ignore, + labels, masks, seg_map. + """ + gt_bboxes = [] + gt_labels = [] + gt_bboxes_ignore = [] + gt_mask_infos = [] + + for i, ann in enumerate(ann_info): + x1, y1, w, h = ann['bbox'] + if ann['area'] <= 0 or w < 1 or h < 1: + continue + bbox = [x1, y1, x1 + w, y1 + h] + + category_id = ann['category_id'] + contiguous_cat_id = self.cat2label[category_id] + + is_thing = self.coco.load_cats(ids=category_id)[0]['isthing'] + if is_thing: + is_crowd = ann.get('iscrowd', False) + if not is_crowd: + gt_bboxes.append(bbox) + gt_labels.append(contiguous_cat_id) + else: + gt_bboxes_ignore.append(bbox) + is_thing = False + + mask_info = { + 'id': ann['id'], + 'category': contiguous_cat_id, + 'is_thing': is_thing + } + gt_mask_infos.append(mask_info) + + if gt_bboxes: + gt_bboxes = np.array(gt_bboxes, dtype=np.float32) + gt_labels = np.array(gt_labels, dtype=np.int64) + else: + gt_bboxes = np.zeros((0, 4), dtype=np.float32) + gt_labels = np.array([], dtype=np.int64) + + if gt_bboxes_ignore: + gt_bboxes_ignore = np.array(gt_bboxes_ignore, dtype=np.float32) + else: + gt_bboxes_ignore = np.zeros((0, 4), dtype=np.float32) + + ann = dict( + bboxes=gt_bboxes, + labels=gt_labels, + bboxes_ignore=gt_bboxes_ignore, + masks=gt_mask_infos, + seg_map=img_info['segm_file']) + + return ann + + def _filter_imgs(self, min_size=32): + """Filter images too small or without ground truths.""" + ids_with_ann = [] + # check whether images have legal thing annotations. + for lists in self.coco.anns.values(): + for item in lists: + category_id = item['category_id'] + is_thing = self.coco.load_cats(ids=category_id)[0]['isthing'] + if not is_thing: + continue + ids_with_ann.append(item['image_id']) + ids_with_ann = set(ids_with_ann) + + valid_inds = [] + valid_img_ids = [] + for i, img_info in enumerate(self.data_infos): + img_id = self.img_ids[i] + if self.filter_empty_gt and img_id not in ids_with_ann: + continue + if min(img_info['width'], img_info['height']) >= min_size: + valid_inds.append(i) + valid_img_ids.append(img_id) + self.img_ids = valid_img_ids + return valid_inds + + def _pan2json(self, results, outfile_prefix): + """Convert panoptic results to COCO panoptic json style.""" + label2cat = dict((v, k) for (k, v) in self.cat2label.items()) + pred_annotations = [] + outdir = os.path.join(os.path.dirname(outfile_prefix), 'panoptic') + + for idx in range(len(self)): + img_id = self.img_ids[idx] + segm_file = self.data_infos[idx]['segm_file'] + pan = results[idx] + + pan_labels = np.unique(pan) + segm_info = [] + for pan_label in pan_labels: + sem_label = pan_label % INSTANCE_OFFSET + # We reserve the length of self.CLASSES for VOID label + if sem_label == len(self.CLASSES): + continue + # convert sem_label to json label + cat_id = label2cat[sem_label] + is_thing = self.categories[cat_id]['isthing'] + mask = pan == pan_label + area = mask.sum() + segm_info.append({ + 'id': int(pan_label), + 'category_id': cat_id, + 'isthing': is_thing, + 'area': int(area) + }) + # evaluation script uses 0 for VOID label. + pan[pan % INSTANCE_OFFSET == len(self.CLASSES)] = VOID + pan = id2rgb(pan).astype(np.uint8) + mmcv.imwrite(pan[:, :, ::-1], os.path.join(outdir, segm_file)) + record = { + 'image_id': img_id, + 'segments_info': segm_info, + 'file_name': segm_file + } + pred_annotations.append(record) + pan_json_results = dict(annotations=pred_annotations) + return pan_json_results + + def results2json(self, results, outfile_prefix): + """Dump the results to a COCO style json file. + + There are 4 types of results: proposals, bbox predictions, mask + predictions, panoptic segmentation predictions, and they have + different data types. This method will automatically recognize + the type, and dump them to json files. + + .. code-block:: none + + [ + { + 'pan_results': np.array, # shape (h, w) + # ins_results which includes bboxes and RLE encoded masks + # is optional. + 'ins_results': (list[np.array], list[list[str]]) + }, + ... + ] + + Args: + results (list[dict]): Testing results of the dataset. + outfile_prefix (str): The filename prefix of the json files. If the + prefix is "somepath/xxx", the json files will be named + "somepath/xxx.panoptic.json", "somepath/xxx.bbox.json", + "somepath/xxx.segm.json" + + Returns: + dict[str: str]: Possible keys are "panoptic", "bbox", "segm", \ + "proposal", and values are corresponding filenames. + """ + result_files = dict() + # panoptic segmentation results + if 'pan_results' in results[0]: + pan_results = [result['pan_results'] for result in results] + pan_json_results = self._pan2json(pan_results, outfile_prefix) + result_files['panoptic'] = f'{outfile_prefix}.panoptic.json' + mmcv.dump(pan_json_results, result_files['panoptic']) + + # instance segmentation results + if 'ins_results' in results[0]: + ins_results = [result['ins_results'] for result in results] + bbox_json_results, segm_json_results = self._segm2json(ins_results) + result_files['bbox'] = f'{outfile_prefix}.bbox.json' + result_files['proposal'] = f'{outfile_prefix}.bbox.json' + result_files['segm'] = f'{outfile_prefix}.segm.json' + mmcv.dump(bbox_json_results, result_files['bbox']) + mmcv.dump(segm_json_results, result_files['segm']) + + return result_files + + def evaluate_pan_json(self, + result_files, + outfile_prefix, + logger=None, + classwise=False, + nproc=32): + """Evaluate PQ according to the panoptic results json file.""" + imgs = self.coco.imgs + gt_json = self.coco.img_ann_map # image to annotations + gt_json = [{ + 'image_id': k, + 'segments_info': v, + 'file_name': imgs[k]['segm_file'] + } for k, v in gt_json.items()] + pred_json = mmcv.load(result_files['panoptic']) + pred_json = dict( + (el['image_id'], el) for el in pred_json['annotations']) + + # match the gt_anns and pred_anns in the same image + matched_annotations_list = [] + for gt_ann in gt_json: + img_id = gt_ann['image_id'] + if img_id not in pred_json.keys(): + raise Exception('no prediction for the image' + ' with id: {}'.format(img_id)) + matched_annotations_list.append((gt_ann, pred_json[img_id])) + + gt_folder = self.seg_prefix + pred_folder = os.path.join(os.path.dirname(outfile_prefix), 'panoptic') + + pq_stat = pq_compute_multi_core( + matched_annotations_list, + gt_folder, + pred_folder, + self.categories, + self.file_client, + nproc=nproc) + + metrics = [('All', None), ('Things', True), ('Stuff', False)] + pq_results = {} + + for name, isthing in metrics: + pq_results[name], classwise_results = pq_stat.pq_average( + self.categories, isthing=isthing) + if name == 'All': + pq_results['classwise'] = classwise_results + + classwise_results = None + if classwise: + classwise_results = { + k: v + for k, v in zip(self.CLASSES, pq_results['classwise'].values()) + } + print_panoptic_table(pq_results, classwise_results, logger=logger) + results = parse_pq_results(pq_results) + results['PQ_copypaste'] = ( + f'{results["PQ"]:.3f} {results["SQ"]:.3f} ' + f'{results["RQ"]:.3f} ' + f'{results["PQ_th"]:.3f} {results["SQ_th"]:.3f} ' + f'{results["RQ_th"]:.3f} ' + f'{results["PQ_st"]:.3f} {results["SQ_st"]:.3f} ' + f'{results["RQ_st"]:.3f}') + + return results + + def evaluate(self, + results, + metric='PQ', + logger=None, + jsonfile_prefix=None, + classwise=False, + nproc=32, + **kwargs): + """Evaluation in COCO Panoptic protocol. + + Args: + results (list[dict]): Testing results of the dataset. + metric (str | list[str]): Metrics to be evaluated. 'PQ', 'bbox', + 'segm', 'proposal' are supported. 'pq' will be regarded as 'PQ. + logger (logging.Logger | str | None): Logger used for printing + related information during evaluation. Default: None. + jsonfile_prefix (str | None): The prefix of json files. It includes + the file path and the prefix of filename, e.g., "a/b/prefix". + If not specified, a temp file will be created. Default: None. + classwise (bool): Whether to print classwise evaluation results. + Default: False. + nproc (int): Number of processes for panoptic quality computing. + Defaults to 32. When `nproc` exceeds the number of cpu cores, + the number of cpu cores is used. + + Returns: + dict[str, float]: COCO Panoptic style evaluation metric. + """ + metrics = metric if isinstance(metric, list) else [metric] + # Compatible with lowercase 'pq' + metrics = ['PQ' if metric == 'pq' else metric for metric in metrics] + allowed_metrics = ['PQ', 'bbox', 'segm', 'proposal'] + for metric in metrics: + if metric not in allowed_metrics: + raise KeyError(f'metric {metric} is not supported') + + result_files, tmp_dir = self.format_results(results, jsonfile_prefix) + eval_results = {} + + outfile_prefix = os.path.join(tmp_dir.name, 'results') \ + if tmp_dir is not None else jsonfile_prefix + if 'PQ' in metrics: + eval_pan_results = self.evaluate_pan_json( + result_files, outfile_prefix, logger, classwise, nproc=nproc) + + eval_results.update(eval_pan_results) + metrics.remove('PQ') + + if (('bbox' in metrics) or ('segm' in metrics) + or ('proposal' in metrics)): + + assert 'ins_results' in results[0], 'instance segmentation' \ + 'results are absent from results' + + assert self.ins_ann_file is not None, 'Annotation '\ + 'file for instance segmentation or object detection ' \ + 'shuold not be None' + + coco_gt = COCO(self.ins_ann_file) + panoptic_cat_ids = self.cat_ids + self.cat_ids = coco_gt.get_cat_ids(cat_names=self.THING_CLASSES) + + eval_ins_results = self.evaluate_det_segm(results, result_files, + coco_gt, metrics, logger, + classwise, **kwargs) + self.cat_ids = panoptic_cat_ids + eval_results.update(eval_ins_results) + + if tmp_dir is not None: + tmp_dir.cleanup() + return eval_results + + +def parse_pq_results(pq_results): + """Parse the Panoptic Quality results.""" + result = dict() + result['PQ'] = 100 * pq_results['All']['pq'] + result['SQ'] = 100 * pq_results['All']['sq'] + result['RQ'] = 100 * pq_results['All']['rq'] + result['PQ_th'] = 100 * pq_results['Things']['pq'] + result['SQ_th'] = 100 * pq_results['Things']['sq'] + result['RQ_th'] = 100 * pq_results['Things']['rq'] + result['PQ_st'] = 100 * pq_results['Stuff']['pq'] + result['SQ_st'] = 100 * pq_results['Stuff']['sq'] + result['RQ_st'] = 100 * pq_results['Stuff']['rq'] + return result + + +def print_panoptic_table(pq_results, classwise_results=None, logger=None): + """Print the panoptic evaluation results table. + + Args: + pq_results(dict): The Panoptic Quality results. + classwise_results(dict | None): The classwise Panoptic Quality results. + The keys are class names and the values are metrics. + logger (logging.Logger | str | None): Logger used for printing + related information during evaluation. Default: None. + """ + + headers = ['', 'PQ', 'SQ', 'RQ', 'categories'] + data = [headers] + for name in ['All', 'Things', 'Stuff']: + numbers = [ + f'{(pq_results[name][k] * 100):0.3f}' for k in ['pq', 'sq', 'rq'] + ] + row = [name] + numbers + [pq_results[name]['n']] + data.append(row) + table = AsciiTable(data) + print_log('Panoptic Evaluation Results:\n' + table.table, logger=logger) + + if classwise_results is not None: + class_metrics = [(name, ) + tuple(f'{(metrics[k] * 100):0.3f}' + for k in ['pq', 'sq', 'rq']) + for name, metrics in classwise_results.items()] + num_columns = min(8, len(class_metrics) * 4) + results_flatten = list(itertools.chain(*class_metrics)) + headers = ['category', 'PQ', 'SQ', 'RQ'] * (num_columns // 4) + results_2d = itertools.zip_longest( + *[results_flatten[i::num_columns] for i in range(num_columns)]) + data = [headers] + data += [result for result in results_2d] + table = AsciiTable(data) + print_log( + 'Classwise Panoptic Evaluation Results:\n' + table.table, + logger=logger) diff --git a/mmdet/datasets/custom.py b/mmdet/datasets/custom.py new file mode 100644 index 0000000..3b97685 --- /dev/null +++ b/mmdet/datasets/custom.py @@ -0,0 +1,412 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +import warnings +from collections import OrderedDict + +import mmcv +import numpy as np +from mmcv.utils import print_log +from terminaltables import AsciiTable +from torch.utils.data import Dataset + +from mmdet.core import eval_map, eval_recalls +from .builder import DATASETS +from .pipelines import Compose + + +@DATASETS.register_module() +class CustomDataset(Dataset): + """Custom dataset for detection. + + The annotation format is shown as follows. The `ann` field is optional for + testing. + + .. code-block:: none + + [ + { + 'filename': 'a.jpg', + 'width': 1280, + 'height': 720, + 'ann': { + 'bboxes': (n, 4) in (x1, y1, x2, y2) order. + 'labels': (n, ), + 'bboxes_ignore': (k, 4), (optional field) + 'labels_ignore': (k, 4) (optional field) + } + }, + ... + ] + + Args: + ann_file (str): Annotation file path. + pipeline (list[dict]): Processing pipeline. + classes (str | Sequence[str], optional): Specify classes to load. + If is None, ``cls.CLASSES`` will be used. Default: None. + data_root (str, optional): Data root for ``ann_file``, + ``img_prefix``, ``seg_prefix``, ``proposal_file`` if specified. + test_mode (bool, optional): If set True, annotation will not be loaded. + filter_empty_gt (bool, optional): If set true, images without bounding + boxes of the dataset's classes will be filtered out. This option + only works when `test_mode=False`, i.e., we never filter images + during tests. + """ + + CLASSES = None + + PALETTE = None + + def __init__(self, + ann_file, + pipeline, + classes=None, + data_root=None, + img_prefix='', + seg_prefix=None, + seg_suffix='.png', + proposal_file=None, + test_mode=False, + filter_empty_gt=True, + file_client_args=dict(backend='disk')): + self.ann_file = ann_file + self.data_root = data_root + self.img_prefix = img_prefix + self.seg_prefix = seg_prefix + self.seg_suffix = seg_suffix + self.proposal_file = proposal_file + self.test_mode = test_mode + self.filter_empty_gt = filter_empty_gt + self.file_client = mmcv.FileClient(**file_client_args) + self.CLASSES = self.get_classes(classes) + + # join paths if data_root is specified + if self.data_root is not None: + if not osp.isabs(self.ann_file): + self.ann_file = osp.join(self.data_root, self.ann_file) + if not (self.img_prefix is None or osp.isabs(self.img_prefix)): + self.img_prefix = osp.join(self.data_root, self.img_prefix) + if not (self.seg_prefix is None or osp.isabs(self.seg_prefix)): + self.seg_prefix = osp.join(self.data_root, self.seg_prefix) + if not (self.proposal_file is None + or osp.isabs(self.proposal_file)): + self.proposal_file = osp.join(self.data_root, + self.proposal_file) + # load annotations (and proposals) + if hasattr(self.file_client, 'get_local_path'): + with self.file_client.get_local_path(self.ann_file) as local_path: + self.data_infos = self.load_annotations(local_path) + else: + warnings.warn( + 'The used MMCV version does not have get_local_path. ' + f'We treat the {self.ann_file} as local paths and it ' + 'might cause errors if the path is not a local path. ' + 'Please use MMCV>= 1.3.16 if you meet errors.') + self.data_infos = self.load_annotations(self.ann_file) + + if self.proposal_file is not None: + if hasattr(self.file_client, 'get_local_path'): + with self.file_client.get_local_path( + self.proposal_file) as local_path: + self.proposals = self.load_proposals(local_path) + else: + warnings.warn( + 'The used MMCV version does not have get_local_path. ' + f'We treat the {self.ann_file} as local paths and it ' + 'might cause errors if the path is not a local path. ' + 'Please use MMCV>= 1.3.16 if you meet errors.') + self.proposals = self.load_proposals(self.proposal_file) + else: + self.proposals = None + + # filter images too small and containing no annotations + if not test_mode: + valid_inds = self._filter_imgs() + self.data_infos = [self.data_infos[i] for i in valid_inds] + if self.proposals is not None: + self.proposals = [self.proposals[i] for i in valid_inds] + # set group flag for the sampler + self._set_group_flag() + + # processing pipeline + self.pipeline = Compose(pipeline) + + def __len__(self): + """Total number of samples of data.""" + return len(self.data_infos) + + def load_annotations(self, ann_file): + """Load annotation from annotation file.""" + return mmcv.load(ann_file) + + def load_proposals(self, proposal_file): + """Load proposal from proposal file.""" + return mmcv.load(proposal_file) + + def get_ann_info(self, idx): + """Get annotation by index. + + Args: + idx (int): Index of data. + + Returns: + dict: Annotation info of specified index. + """ + + return self.data_infos[idx]['ann'] + + def get_cat_ids(self, idx): + """Get category ids by index. + + Args: + idx (int): Index of data. + + Returns: + list[int]: All categories in the image of specified index. + """ + + return self.data_infos[idx]['ann']['labels'].astype(np.int).tolist() + + def pre_pipeline(self, results): + """Prepare results dict for pipeline.""" + results['img_prefix'] = self.img_prefix + results['seg_prefix'] = self.seg_prefix + results['proposal_file'] = self.proposal_file + results['bbox_fields'] = [] + results['mask_fields'] = [] + results['seg_fields'] = [] + + def _filter_imgs(self, min_size=32): + """Filter images too small.""" + if self.filter_empty_gt: + warnings.warn( + 'CustomDataset does not support filtering empty gt images.') + valid_inds = [] + for i, img_info in enumerate(self.data_infos): + if min(img_info['width'], img_info['height']) >= min_size: + valid_inds.append(i) + return valid_inds + + def _set_group_flag(self): + """Set flag according to image aspect ratio. + + Images with aspect ratio greater than 1 will be set as group 1, + otherwise group 0. + """ + self.flag = np.zeros(len(self), dtype=np.uint8) + for i in range(len(self)): + img_info = self.data_infos[i] + if img_info['width'] / img_info['height'] > 1: + self.flag[i] = 1 + + def _rand_another(self, idx): + """Get another random index from the same group as the given index.""" + pool = np.where(self.flag == self.flag[idx])[0] + return np.random.choice(pool) + + def __getitem__(self, idx): + """Get training/test data after pipeline. + + Args: + idx (int): Index of data. + + Returns: + dict: Training/test data (with annotation if `test_mode` is set \ + True). + """ + + if self.test_mode: + return self.prepare_test_img(idx) + while True: + data = self.prepare_train_img(idx) + if data is None: + idx = self._rand_another(idx) + continue + return data + + def prepare_train_img(self, idx): + """Get training data and annotations after pipeline. + + Args: + idx (int): Index of data. + + Returns: + dict: Training data and annotation after pipeline with new keys \ + introduced by pipeline. + """ + + img_info = self.data_infos[idx] + ann_info = self.get_ann_info(idx) + results = dict(img_info=img_info, ann_info=ann_info) + if self.proposals is not None: + results['proposals'] = self.proposals[idx] + self.pre_pipeline(results) + return self.pipeline(results) + + def prepare_test_img(self, idx): + """Get testing data after pipeline. + + Args: + idx (int): Index of data. + + Returns: + dict: Testing data after pipeline with new keys introduced by \ + pipeline. + """ + + img_info = self.data_infos[idx] + results = dict(img_info=img_info) + if self.proposals is not None: + results['proposals'] = self.proposals[idx] + self.pre_pipeline(results) + return self.pipeline(results) + + @classmethod + def get_classes(cls, classes=None): + """Get class names of current dataset. + + Args: + classes (Sequence[str] | str | None): If classes is None, use + default CLASSES defined by builtin dataset. If classes is a + string, take it as a file name. The file contains the name of + classes where each line contains one class name. If classes is + a tuple or list, override the CLASSES defined by the dataset. + + Returns: + tuple[str] or list[str]: Names of categories of the dataset. + """ + if classes is None: + return cls.CLASSES + + if isinstance(classes, str): + # take it as a file path + class_names = mmcv.list_from_file(classes) + elif isinstance(classes, (tuple, list)): + class_names = classes + else: + raise ValueError(f'Unsupported type {type(classes)} of classes.') + + return class_names + + def get_cat2imgs(self): + """Get a dict with class as key and img_ids as values, which will be + used in :class:`ClassAwareSampler`. + + Returns: + dict[list]: A dict of per-label image list, + the item of the dict indicates a label index, + corresponds to the image index that contains the label. + """ + if self.CLASSES is None: + raise ValueError('self.CLASSES can not be None') + # sort the label index + cat2imgs = {i: [] for i in range(len(self.CLASSES))} + for i in range(len(self)): + cat_ids = set(self.get_cat_ids(i)) + for cat in cat_ids: + cat2imgs[cat].append(i) + return cat2imgs + + def format_results(self, results, **kwargs): + """Place holder to format result to dataset specific output.""" + + def evaluate(self, + results, + metric='mAP', + logger=None, + proposal_nums=(100, 300, 1000), + iou_thr=0.5, + scale_ranges=None): + """Evaluate the dataset. + + Args: + results (list): Testing results of the dataset. + metric (str | list[str]): Metrics to be evaluated. + logger (logging.Logger | None | str): Logger used for printing + related information during evaluation. Default: None. + proposal_nums (Sequence[int]): Proposal number used for evaluating + recalls, such as recall@100, recall@1000. + Default: (100, 300, 1000). + iou_thr (float | list[float]): IoU threshold. Default: 0.5. + scale_ranges (list[tuple] | None): Scale ranges for evaluating mAP. + Default: None. + """ + + if not isinstance(metric, str): + assert len(metric) == 1 + metric = metric[0] + allowed_metrics = ['mAP', 'recall'] + if metric not in allowed_metrics: + raise KeyError(f'metric {metric} is not supported') + annotations = [self.get_ann_info(i) for i in range(len(self))] + eval_results = OrderedDict() + iou_thrs = [iou_thr] if isinstance(iou_thr, float) else iou_thr + if metric == 'mAP': + assert isinstance(iou_thrs, list) + mean_aps = [] + for iou_thr in iou_thrs: + print_log(f'\n{"-" * 15}iou_thr: {iou_thr}{"-" * 15}') + mean_ap, _ = eval_map( + results, + annotations, + scale_ranges=scale_ranges, + iou_thr=iou_thr, + dataset=self.CLASSES, + logger=logger) + mean_aps.append(mean_ap) + eval_results[f'AP{int(iou_thr * 100):02d}'] = round(mean_ap, 3) + eval_results['mAP'] = sum(mean_aps) / len(mean_aps) + elif metric == 'recall': + gt_bboxes = [ann['bboxes'] for ann in annotations] + recalls = eval_recalls( + gt_bboxes, results, proposal_nums, iou_thr, logger=logger) + for i, num in enumerate(proposal_nums): + for j, iou in enumerate(iou_thrs): + eval_results[f'recall@{num}@{iou}'] = recalls[i, j] + if recalls.shape[1] > 1: + ar = recalls.mean(axis=1) + for i, num in enumerate(proposal_nums): + eval_results[f'AR@{num}'] = ar[i] + return eval_results + + def __repr__(self): + """Print the number of instance number.""" + dataset_type = 'Test' if self.test_mode else 'Train' + result = (f'\n{self.__class__.__name__} {dataset_type} dataset ' + f'with number of images {len(self)}, ' + f'and instance counts: \n') + if self.CLASSES is None: + result += 'Category names are not provided. \n' + return result + instance_count = np.zeros(len(self.CLASSES) + 1).astype(int) + # count the instance number in each image + for idx in range(len(self)): + label = self.get_ann_info(idx)['labels'] + unique, counts = np.unique(label, return_counts=True) + if len(unique) > 0: + # add the occurrence number to each class + instance_count[unique] += counts + else: + # background is the last index + instance_count[-1] += 1 + # create a table with category count + table_data = [['category', 'count'] * 5] + row_data = [] + for cls, count in enumerate(instance_count): + if cls < len(self.CLASSES): + row_data += [f'{cls} [{self.CLASSES[cls]}]', f'{count}'] + else: + # add the background number + row_data += ['-1 background', f'{count}'] + if len(row_data) == 10: + table_data.append(row_data) + row_data = [] + if len(row_data) >= 2: + if row_data[-1] == '0': + row_data = row_data[:-2] + if len(row_data) >= 2: + table_data.append([]) + table_data.append(row_data) + + table = AsciiTable(table_data) + result += table.table + return result diff --git a/mmdet/datasets/dataset_wrappers.py b/mmdet/datasets/dataset_wrappers.py new file mode 100644 index 0000000..d6ceffb --- /dev/null +++ b/mmdet/datasets/dataset_wrappers.py @@ -0,0 +1,456 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import bisect +import collections +import copy +import math +from collections import defaultdict + +import numpy as np +from mmcv.utils import build_from_cfg, print_log +from torch.utils.data.dataset import ConcatDataset as _ConcatDataset + +from .builder import DATASETS, PIPELINES +from .coco import CocoDataset + + +@DATASETS.register_module() +class ConcatDataset(_ConcatDataset): + """A wrapper of concatenated dataset. + + Same as :obj:`torch.utils.data.dataset.ConcatDataset`, but + concat the group flag for image aspect ratio. + + Args: + datasets (list[:obj:`Dataset`]): A list of datasets. + separate_eval (bool): Whether to evaluate the results + separately if it is used as validation dataset. + Defaults to True. + """ + + def __init__(self, datasets, separate_eval=True): + super(ConcatDataset, self).__init__(datasets) + self.CLASSES = datasets[0].CLASSES + self.PALETTE = getattr(datasets[0], 'PALETTE', None) + self.separate_eval = separate_eval + if not separate_eval: + if any([isinstance(ds, CocoDataset) for ds in datasets]): + raise NotImplementedError( + 'Evaluating concatenated CocoDataset as a whole is not' + ' supported! Please set "separate_eval=True"') + elif len(set([type(ds) for ds in datasets])) != 1: + raise NotImplementedError( + 'All the datasets should have same types') + + if hasattr(datasets[0], 'flag'): + flags = [] + for i in range(0, len(datasets)): + flags.append(datasets[i].flag) + self.flag = np.concatenate(flags) + + def get_cat_ids(self, idx): + """Get category ids of concatenated dataset by index. + + Args: + idx (int): Index of data. + + Returns: + list[int]: All categories in the image of specified index. + """ + + if idx < 0: + if -idx > len(self): + raise ValueError( + 'absolute value of index should not exceed dataset length') + idx = len(self) + idx + dataset_idx = bisect.bisect_right(self.cumulative_sizes, idx) + if dataset_idx == 0: + sample_idx = idx + else: + sample_idx = idx - self.cumulative_sizes[dataset_idx - 1] + return self.datasets[dataset_idx].get_cat_ids(sample_idx) + + def get_ann_info(self, idx): + """Get annotation of concatenated dataset by index. + + Args: + idx (int): Index of data. + + Returns: + dict: Annotation info of specified index. + """ + + if idx < 0: + if -idx > len(self): + raise ValueError( + 'absolute value of index should not exceed dataset length') + idx = len(self) + idx + dataset_idx = bisect.bisect_right(self.cumulative_sizes, idx) + if dataset_idx == 0: + sample_idx = idx + else: + sample_idx = idx - self.cumulative_sizes[dataset_idx - 1] + return self.datasets[dataset_idx].get_ann_info(sample_idx) + + def evaluate(self, results, logger=None, **kwargs): + """Evaluate the results. + + Args: + results (list[list | tuple]): Testing results of the dataset. + logger (logging.Logger | str | None): Logger used for printing + related information during evaluation. Default: None. + + Returns: + dict[str: float]: AP results of the total dataset or each separate + dataset if `self.separate_eval=True`. + """ + assert len(results) == self.cumulative_sizes[-1], \ + ('Dataset and results have different sizes: ' + f'{self.cumulative_sizes[-1]} v.s. {len(results)}') + + # Check whether all the datasets support evaluation + for dataset in self.datasets: + assert hasattr(dataset, 'evaluate'), \ + f'{type(dataset)} does not implement evaluate function' + + if self.separate_eval: + dataset_idx = -1 + total_eval_results = dict() + for size, dataset in zip(self.cumulative_sizes, self.datasets): + start_idx = 0 if dataset_idx == -1 else \ + self.cumulative_sizes[dataset_idx] + end_idx = self.cumulative_sizes[dataset_idx + 1] + + results_per_dataset = results[start_idx:end_idx] + print_log( + f'\nEvaluating {dataset.ann_file} with ' + f'{len(results_per_dataset)} images now', + logger=logger) + + eval_results_per_dataset = dataset.evaluate( + results_per_dataset, logger=logger, **kwargs) + dataset_idx += 1 + for k, v in eval_results_per_dataset.items(): + total_eval_results.update({f'{dataset_idx}_{k}': v}) + + return total_eval_results + elif any([isinstance(ds, CocoDataset) for ds in self.datasets]): + raise NotImplementedError( + 'Evaluating concatenated CocoDataset as a whole is not' + ' supported! Please set "separate_eval=True"') + elif len(set([type(ds) for ds in self.datasets])) != 1: + raise NotImplementedError( + 'All the datasets should have same types') + else: + original_data_infos = self.datasets[0].data_infos + self.datasets[0].data_infos = sum( + [dataset.data_infos for dataset in self.datasets], []) + eval_results = self.datasets[0].evaluate( + results, logger=logger, **kwargs) + self.datasets[0].data_infos = original_data_infos + return eval_results + + +@DATASETS.register_module() +class RepeatDataset: + """A wrapper of repeated dataset. + + The length of repeated dataset will be `times` larger than the original + dataset. This is useful when the data loading time is long but the dataset + is small. Using RepeatDataset can reduce the data loading time between + epochs. + + Args: + dataset (:obj:`Dataset`): The dataset to be repeated. + times (int): Repeat times. + """ + + def __init__(self, dataset, times): + self.dataset = dataset + self.times = times + self.CLASSES = dataset.CLASSES + self.PALETTE = getattr(dataset, 'PALETTE', None) + if hasattr(self.dataset, 'flag'): + self.flag = np.tile(self.dataset.flag, times) + + self._ori_len = len(self.dataset) + + def __getitem__(self, idx): + return self.dataset[idx % self._ori_len] + + def get_cat_ids(self, idx): + """Get category ids of repeat dataset by index. + + Args: + idx (int): Index of data. + + Returns: + list[int]: All categories in the image of specified index. + """ + + return self.dataset.get_cat_ids(idx % self._ori_len) + + def get_ann_info(self, idx): + """Get annotation of repeat dataset by index. + + Args: + idx (int): Index of data. + + Returns: + dict: Annotation info of specified index. + """ + + return self.dataset.get_ann_info(idx % self._ori_len) + + def __len__(self): + """Length after repetition.""" + return self.times * self._ori_len + + +# Modified from https://github.com/facebookresearch/detectron2/blob/41d475b75a230221e21d9cac5d69655e3415e3a4/detectron2/data/samplers/distributed_sampler.py#L57 # noqa +@DATASETS.register_module() +class ClassBalancedDataset: + """A wrapper of repeated dataset with repeat factor. + + Suitable for training on class imbalanced datasets like LVIS. Following + the sampling strategy in the `paper `_, + in each epoch, an image may appear multiple times based on its + "repeat factor". + The repeat factor for an image is a function of the frequency the rarest + category labeled in that image. The "frequency of category c" in [0, 1] + is defined by the fraction of images in the training set (without repeats) + in which category c appears. + The dataset needs to instantiate :func:`self.get_cat_ids` to support + ClassBalancedDataset. + + The repeat factor is computed as followed. + + 1. For each category c, compute the fraction # of images + that contain it: :math:`f(c)` + 2. For each category c, compute the category-level repeat factor: + :math:`r(c) = max(1, sqrt(t/f(c)))` + 3. For each image I, compute the image-level repeat factor: + :math:`r(I) = max_{c in I} r(c)` + + Args: + dataset (:obj:`CustomDataset`): The dataset to be repeated. + oversample_thr (float): frequency threshold below which data is + repeated. For categories with ``f_c >= oversample_thr``, there is + no oversampling. For categories with ``f_c < oversample_thr``, the + degree of oversampling following the square-root inverse frequency + heuristic above. + filter_empty_gt (bool, optional): If set true, images without bounding + boxes will not be oversampled. Otherwise, they will be categorized + as the pure background class and involved into the oversampling. + Default: True. + """ + + def __init__(self, dataset, oversample_thr, filter_empty_gt=True): + self.dataset = dataset + self.oversample_thr = oversample_thr + self.filter_empty_gt = filter_empty_gt + self.CLASSES = dataset.CLASSES + self.PALETTE = getattr(dataset, 'PALETTE', None) + + repeat_factors = self._get_repeat_factors(dataset, oversample_thr) + repeat_indices = [] + for dataset_idx, repeat_factor in enumerate(repeat_factors): + repeat_indices.extend([dataset_idx] * math.ceil(repeat_factor)) + self.repeat_indices = repeat_indices + + flags = [] + if hasattr(self.dataset, 'flag'): + for flag, repeat_factor in zip(self.dataset.flag, repeat_factors): + flags.extend([flag] * int(math.ceil(repeat_factor))) + assert len(flags) == len(repeat_indices) + self.flag = np.asarray(flags, dtype=np.uint8) + + def _get_repeat_factors(self, dataset, repeat_thr): + """Get repeat factor for each images in the dataset. + + Args: + dataset (:obj:`CustomDataset`): The dataset + repeat_thr (float): The threshold of frequency. If an image + contains the categories whose frequency below the threshold, + it would be repeated. + + Returns: + list[float]: The repeat factors for each images in the dataset. + """ + + # 1. For each category c, compute the fraction # of images + # that contain it: f(c) + category_freq = defaultdict(int) + num_images = len(dataset) + for idx in range(num_images): + cat_ids = set(self.dataset.get_cat_ids(idx)) + if len(cat_ids) == 0 and not self.filter_empty_gt: + cat_ids = set([len(self.CLASSES)]) + for cat_id in cat_ids: + category_freq[cat_id] += 1 + for k, v in category_freq.items(): + category_freq[k] = v / num_images + + # 2. For each category c, compute the category-level repeat factor: + # r(c) = max(1, sqrt(t/f(c))) + category_repeat = { + cat_id: max(1.0, math.sqrt(repeat_thr / cat_freq)) + for cat_id, cat_freq in category_freq.items() + } + + # 3. For each image I, compute the image-level repeat factor: + # r(I) = max_{c in I} r(c) + repeat_factors = [] + for idx in range(num_images): + cat_ids = set(self.dataset.get_cat_ids(idx)) + if len(cat_ids) == 0 and not self.filter_empty_gt: + cat_ids = set([len(self.CLASSES)]) + repeat_factor = 1 + if len(cat_ids) > 0: + repeat_factor = max( + {category_repeat[cat_id] + for cat_id in cat_ids}) + repeat_factors.append(repeat_factor) + + return repeat_factors + + def __getitem__(self, idx): + ori_index = self.repeat_indices[idx] + return self.dataset[ori_index] + + def get_ann_info(self, idx): + """Get annotation of dataset by index. + + Args: + idx (int): Index of data. + + Returns: + dict: Annotation info of specified index. + """ + ori_index = self.repeat_indices[idx] + return self.dataset.get_ann_info(ori_index) + + def __len__(self): + """Length after repetition.""" + return len(self.repeat_indices) + + +@DATASETS.register_module() +class MultiImageMixDataset: + """A wrapper of multiple images mixed dataset. + + Suitable for training on multiple images mixed data augmentation like + mosaic and mixup. For the augmentation pipeline of mixed image data, + the `get_indexes` method needs to be provided to obtain the image + indexes, and you can set `skip_flags` to change the pipeline running + process. At the same time, we provide the `dynamic_scale` parameter + to dynamically change the output image size. + + Args: + dataset (:obj:`CustomDataset`): The dataset to be mixed. + pipeline (Sequence[dict]): Sequence of transform object or + config dict to be composed. + dynamic_scale (tuple[int], optional): The image scale can be changed + dynamically. Default to None. It is deprecated. + skip_type_keys (list[str], optional): Sequence of type string to + be skip pipeline. Default to None. + max_refetch (int): The maximum number of retry iterations for getting + valid results from the pipeline. If the number of iterations is + greater than `max_refetch`, but results is still None, then the + iteration is terminated and raise the error. Default: 15. + """ + + def __init__(self, + dataset, + pipeline, + dynamic_scale=None, + skip_type_keys=None, + max_refetch=15): + if dynamic_scale is not None: + raise RuntimeError( + 'dynamic_scale is deprecated. Please use Resize pipeline ' + 'to achieve similar functions') + assert isinstance(pipeline, collections.abc.Sequence) + if skip_type_keys is not None: + assert all([ + isinstance(skip_type_key, str) + for skip_type_key in skip_type_keys + ]) + self._skip_type_keys = skip_type_keys + + self.pipeline = [] + self.pipeline_types = [] + for transform in pipeline: + if isinstance(transform, dict): + self.pipeline_types.append(transform['type']) + transform = build_from_cfg(transform, PIPELINES) + self.pipeline.append(transform) + else: + raise TypeError('pipeline must be a dict') + + self.dataset = dataset + self.CLASSES = dataset.CLASSES + self.PALETTE = getattr(dataset, 'PALETTE', None) + if hasattr(self.dataset, 'flag'): + self.flag = dataset.flag + self.num_samples = len(dataset) + self.max_refetch = max_refetch + + def __len__(self): + return self.num_samples + + def __getitem__(self, idx): + results = copy.deepcopy(self.dataset[idx]) + for (transform, transform_type) in zip(self.pipeline, + self.pipeline_types): + if self._skip_type_keys is not None and \ + transform_type in self._skip_type_keys: + continue + + if hasattr(transform, 'get_indexes'): + for i in range(self.max_refetch): + # Make sure the results passed the loading pipeline + # of the original dataset is not None. + indexes = transform.get_indexes(self.dataset) + if not isinstance(indexes, collections.abc.Sequence): + indexes = [indexes] + mix_results = [ + copy.deepcopy(self.dataset[index]) for index in indexes + ] + if None not in mix_results: + results['mix_results'] = mix_results + break + else: + raise RuntimeError( + 'The loading pipeline of the original dataset' + ' always return None. Please check the correctness ' + 'of the dataset and its pipeline.') + + for i in range(self.max_refetch): + # To confirm the results passed the training pipeline + # of the wrapper is not None. + updated_results = transform(copy.deepcopy(results)) + if updated_results is not None: + results = updated_results + break + else: + raise RuntimeError( + 'The training pipeline of the dataset wrapper' + ' always return None.Please check the correctness ' + 'of the dataset and its pipeline.') + + if 'mix_results' in results: + results.pop('mix_results') + + return results + + def update_skip_type_keys(self, skip_type_keys): + """Update skip_type_keys. It is called by an external hook. + + Args: + skip_type_keys (list[str], optional): Sequence of type + string to be skip pipeline. + """ + assert all([ + isinstance(skip_type_key, str) for skip_type_key in skip_type_keys + ]) + self._skip_type_keys = skip_type_keys diff --git a/mmdet/datasets/deepfashion.py b/mmdet/datasets/deepfashion.py new file mode 100644 index 0000000..609f809 --- /dev/null +++ b/mmdet/datasets/deepfashion.py @@ -0,0 +1,16 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .builder import DATASETS +from .coco import CocoDataset + + +@DATASETS.register_module() +class DeepFashionDataset(CocoDataset): + + CLASSES = ('top', 'skirt', 'leggings', 'dress', 'outer', 'pants', 'bag', + 'neckwear', 'headwear', 'eyeglass', 'belt', 'footwear', 'hair', + 'skin', 'face') + + PALETTE = [(0, 192, 64), (0, 64, 96), (128, 192, 192), (0, 64, 64), + (0, 192, 224), (0, 192, 192), (128, 192, 64), (0, 192, 96), + (128, 32, 192), (0, 0, 224), (0, 0, 64), (0, 160, 192), + (128, 0, 96), (128, 0, 192), (0, 32, 192)] diff --git a/mmdet/datasets/lvis.py b/mmdet/datasets/lvis.py new file mode 100644 index 0000000..5f6196e --- /dev/null +++ b/mmdet/datasets/lvis.py @@ -0,0 +1,742 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import itertools +import logging +import os.path as osp +import tempfile +import warnings +from collections import OrderedDict + +import numpy as np +from mmcv.utils import print_log +from terminaltables import AsciiTable + +from .builder import DATASETS +from .coco import CocoDataset + + +@DATASETS.register_module() +class LVISV05Dataset(CocoDataset): + + CLASSES = ( + 'acorn', 'aerosol_can', 'air_conditioner', 'airplane', 'alarm_clock', + 'alcohol', 'alligator', 'almond', 'ambulance', 'amplifier', 'anklet', + 'antenna', 'apple', 'apple_juice', 'applesauce', 'apricot', 'apron', + 'aquarium', 'armband', 'armchair', 'armoire', 'armor', 'artichoke', + 'trash_can', 'ashtray', 'asparagus', 'atomizer', 'avocado', 'award', + 'awning', 'ax', 'baby_buggy', 'basketball_backboard', 'backpack', + 'handbag', 'suitcase', 'bagel', 'bagpipe', 'baguet', 'bait', 'ball', + 'ballet_skirt', 'balloon', 'bamboo', 'banana', 'Band_Aid', 'bandage', + 'bandanna', 'banjo', 'banner', 'barbell', 'barge', 'barrel', + 'barrette', 'barrow', 'baseball_base', 'baseball', 'baseball_bat', + 'baseball_cap', 'baseball_glove', 'basket', 'basketball_hoop', + 'basketball', 'bass_horn', 'bat_(animal)', 'bath_mat', 'bath_towel', + 'bathrobe', 'bathtub', 'batter_(food)', 'battery', 'beachball', 'bead', + 'beaker', 'bean_curd', 'beanbag', 'beanie', 'bear', 'bed', + 'bedspread', 'cow', 'beef_(food)', 'beeper', 'beer_bottle', 'beer_can', + 'beetle', 'bell', 'bell_pepper', 'belt', 'belt_buckle', 'bench', + 'beret', 'bib', 'Bible', 'bicycle', 'visor', 'binder', 'binoculars', + 'bird', 'birdfeeder', 'birdbath', 'birdcage', 'birdhouse', + 'birthday_cake', 'birthday_card', 'biscuit_(bread)', 'pirate_flag', + 'black_sheep', 'blackboard', 'blanket', 'blazer', 'blender', 'blimp', + 'blinker', 'blueberry', 'boar', 'gameboard', 'boat', 'bobbin', + 'bobby_pin', 'boiled_egg', 'bolo_tie', 'deadbolt', 'bolt', 'bonnet', + 'book', 'book_bag', 'bookcase', 'booklet', 'bookmark', + 'boom_microphone', 'boot', 'bottle', 'bottle_opener', 'bouquet', + 'bow_(weapon)', 'bow_(decorative_ribbons)', 'bow-tie', 'bowl', + 'pipe_bowl', 'bowler_hat', 'bowling_ball', 'bowling_pin', + 'boxing_glove', 'suspenders', 'bracelet', 'brass_plaque', 'brassiere', + 'bread-bin', 'breechcloth', 'bridal_gown', 'briefcase', + 'bristle_brush', 'broccoli', 'broach', 'broom', 'brownie', + 'brussels_sprouts', 'bubble_gum', 'bucket', 'horse_buggy', 'bull', + 'bulldog', 'bulldozer', 'bullet_train', 'bulletin_board', + 'bulletproof_vest', 'bullhorn', 'corned_beef', 'bun', 'bunk_bed', + 'buoy', 'burrito', 'bus_(vehicle)', 'business_card', 'butcher_knife', + 'butter', 'butterfly', 'button', 'cab_(taxi)', 'cabana', 'cabin_car', + 'cabinet', 'locker', 'cake', 'calculator', 'calendar', 'calf', + 'camcorder', 'camel', 'camera', 'camera_lens', 'camper_(vehicle)', + 'can', 'can_opener', 'candelabrum', 'candle', 'candle_holder', + 'candy_bar', 'candy_cane', 'walking_cane', 'canister', 'cannon', + 'canoe', 'cantaloup', 'canteen', 'cap_(headwear)', 'bottle_cap', + 'cape', 'cappuccino', 'car_(automobile)', 'railcar_(part_of_a_train)', + 'elevator_car', 'car_battery', 'identity_card', 'card', 'cardigan', + 'cargo_ship', 'carnation', 'horse_carriage', 'carrot', 'tote_bag', + 'cart', 'carton', 'cash_register', 'casserole', 'cassette', 'cast', + 'cat', 'cauliflower', 'caviar', 'cayenne_(spice)', 'CD_player', + 'celery', 'cellular_telephone', 'chain_mail', 'chair', 'chaise_longue', + 'champagne', 'chandelier', 'chap', 'checkbook', 'checkerboard', + 'cherry', 'chessboard', 'chest_of_drawers_(furniture)', + 'chicken_(animal)', 'chicken_wire', 'chickpea', 'Chihuahua', + 'chili_(vegetable)', 'chime', 'chinaware', 'crisp_(potato_chip)', + 'poker_chip', 'chocolate_bar', 'chocolate_cake', 'chocolate_milk', + 'chocolate_mousse', 'choker', 'chopping_board', 'chopstick', + 'Christmas_tree', 'slide', 'cider', 'cigar_box', 'cigarette', + 'cigarette_case', 'cistern', 'clarinet', 'clasp', 'cleansing_agent', + 'clementine', 'clip', 'clipboard', 'clock', 'clock_tower', + 'clothes_hamper', 'clothespin', 'clutch_bag', 'coaster', 'coat', + 'coat_hanger', 'coatrack', 'cock', 'coconut', 'coffee_filter', + 'coffee_maker', 'coffee_table', 'coffeepot', 'coil', 'coin', + 'colander', 'coleslaw', 'coloring_material', 'combination_lock', + 'pacifier', 'comic_book', 'computer_keyboard', 'concrete_mixer', + 'cone', 'control', 'convertible_(automobile)', 'sofa_bed', 'cookie', + 'cookie_jar', 'cooking_utensil', 'cooler_(for_food)', + 'cork_(bottle_plug)', 'corkboard', 'corkscrew', 'edible_corn', + 'cornbread', 'cornet', 'cornice', 'cornmeal', 'corset', + 'romaine_lettuce', 'costume', 'cougar', 'coverall', 'cowbell', + 'cowboy_hat', 'crab_(animal)', 'cracker', 'crape', 'crate', 'crayon', + 'cream_pitcher', 'credit_card', 'crescent_roll', 'crib', 'crock_pot', + 'crossbar', 'crouton', 'crow', 'crown', 'crucifix', 'cruise_ship', + 'police_cruiser', 'crumb', 'crutch', 'cub_(animal)', 'cube', + 'cucumber', 'cufflink', 'cup', 'trophy_cup', 'cupcake', 'hair_curler', + 'curling_iron', 'curtain', 'cushion', 'custard', 'cutting_tool', + 'cylinder', 'cymbal', 'dachshund', 'dagger', 'dartboard', + 'date_(fruit)', 'deck_chair', 'deer', 'dental_floss', 'desk', + 'detergent', 'diaper', 'diary', 'die', 'dinghy', 'dining_table', 'tux', + 'dish', 'dish_antenna', 'dishrag', 'dishtowel', 'dishwasher', + 'dishwasher_detergent', 'diskette', 'dispenser', 'Dixie_cup', 'dog', + 'dog_collar', 'doll', 'dollar', 'dolphin', 'domestic_ass', 'eye_mask', + 'doorbell', 'doorknob', 'doormat', 'doughnut', 'dove', 'dragonfly', + 'drawer', 'underdrawers', 'dress', 'dress_hat', 'dress_suit', + 'dresser', 'drill', 'drinking_fountain', 'drone', 'dropper', + 'drum_(musical_instrument)', 'drumstick', 'duck', 'duckling', + 'duct_tape', 'duffel_bag', 'dumbbell', 'dumpster', 'dustpan', + 'Dutch_oven', 'eagle', 'earphone', 'earplug', 'earring', 'easel', + 'eclair', 'eel', 'egg', 'egg_roll', 'egg_yolk', 'eggbeater', + 'eggplant', 'electric_chair', 'refrigerator', 'elephant', 'elk', + 'envelope', 'eraser', 'escargot', 'eyepatch', 'falcon', 'fan', + 'faucet', 'fedora', 'ferret', 'Ferris_wheel', 'ferry', 'fig_(fruit)', + 'fighter_jet', 'figurine', 'file_cabinet', 'file_(tool)', 'fire_alarm', + 'fire_engine', 'fire_extinguisher', 'fire_hose', 'fireplace', + 'fireplug', 'fish', 'fish_(food)', 'fishbowl', 'fishing_boat', + 'fishing_rod', 'flag', 'flagpole', 'flamingo', 'flannel', 'flash', + 'flashlight', 'fleece', 'flip-flop_(sandal)', 'flipper_(footwear)', + 'flower_arrangement', 'flute_glass', 'foal', 'folding_chair', + 'food_processor', 'football_(American)', 'football_helmet', + 'footstool', 'fork', 'forklift', 'freight_car', 'French_toast', + 'freshener', 'frisbee', 'frog', 'fruit_juice', 'fruit_salad', + 'frying_pan', 'fudge', 'funnel', 'futon', 'gag', 'garbage', + 'garbage_truck', 'garden_hose', 'gargle', 'gargoyle', 'garlic', + 'gasmask', 'gazelle', 'gelatin', 'gemstone', 'giant_panda', + 'gift_wrap', 'ginger', 'giraffe', 'cincture', + 'glass_(drink_container)', 'globe', 'glove', 'goat', 'goggles', + 'goldfish', 'golf_club', 'golfcart', 'gondola_(boat)', 'goose', + 'gorilla', 'gourd', 'surgical_gown', 'grape', 'grasshopper', 'grater', + 'gravestone', 'gravy_boat', 'green_bean', 'green_onion', 'griddle', + 'grillroom', 'grinder_(tool)', 'grits', 'grizzly', 'grocery_bag', + 'guacamole', 'guitar', 'gull', 'gun', 'hair_spray', 'hairbrush', + 'hairnet', 'hairpin', 'ham', 'hamburger', 'hammer', 'hammock', + 'hamper', 'hamster', 'hair_dryer', 'hand_glass', 'hand_towel', + 'handcart', 'handcuff', 'handkerchief', 'handle', 'handsaw', + 'hardback_book', 'harmonium', 'hat', 'hatbox', 'hatch', 'veil', + 'headband', 'headboard', 'headlight', 'headscarf', 'headset', + 'headstall_(for_horses)', 'hearing_aid', 'heart', 'heater', + 'helicopter', 'helmet', 'heron', 'highchair', 'hinge', 'hippopotamus', + 'hockey_stick', 'hog', 'home_plate_(baseball)', 'honey', 'fume_hood', + 'hook', 'horse', 'hose', 'hot-air_balloon', 'hotplate', 'hot_sauce', + 'hourglass', 'houseboat', 'hummingbird', 'hummus', 'polar_bear', + 'icecream', 'popsicle', 'ice_maker', 'ice_pack', 'ice_skate', + 'ice_tea', 'igniter', 'incense', 'inhaler', 'iPod', + 'iron_(for_clothing)', 'ironing_board', 'jacket', 'jam', 'jean', + 'jeep', 'jelly_bean', 'jersey', 'jet_plane', 'jewelry', 'joystick', + 'jumpsuit', 'kayak', 'keg', 'kennel', 'kettle', 'key', 'keycard', + 'kilt', 'kimono', 'kitchen_sink', 'kitchen_table', 'kite', 'kitten', + 'kiwi_fruit', 'knee_pad', 'knife', 'knight_(chess_piece)', + 'knitting_needle', 'knob', 'knocker_(on_a_door)', 'koala', 'lab_coat', + 'ladder', 'ladle', 'ladybug', 'lamb_(animal)', 'lamb-chop', 'lamp', + 'lamppost', 'lampshade', 'lantern', 'lanyard', 'laptop_computer', + 'lasagna', 'latch', 'lawn_mower', 'leather', 'legging_(clothing)', + 'Lego', 'lemon', 'lemonade', 'lettuce', 'license_plate', 'life_buoy', + 'life_jacket', 'lightbulb', 'lightning_rod', 'lime', 'limousine', + 'linen_paper', 'lion', 'lip_balm', 'lipstick', 'liquor', 'lizard', + 'Loafer_(type_of_shoe)', 'log', 'lollipop', 'lotion', + 'speaker_(stereo_equipment)', 'loveseat', 'machine_gun', 'magazine', + 'magnet', 'mail_slot', 'mailbox_(at_home)', 'mallet', 'mammoth', + 'mandarin_orange', 'manger', 'manhole', 'map', 'marker', 'martini', + 'mascot', 'mashed_potato', 'masher', 'mask', 'mast', + 'mat_(gym_equipment)', 'matchbox', 'mattress', 'measuring_cup', + 'measuring_stick', 'meatball', 'medicine', 'melon', 'microphone', + 'microscope', 'microwave_oven', 'milestone', 'milk', 'minivan', + 'mint_candy', 'mirror', 'mitten', 'mixer_(kitchen_tool)', 'money', + 'monitor_(computer_equipment) computer_monitor', 'monkey', 'motor', + 'motor_scooter', 'motor_vehicle', 'motorboat', 'motorcycle', + 'mound_(baseball)', 'mouse_(animal_rodent)', + 'mouse_(computer_equipment)', 'mousepad', 'muffin', 'mug', 'mushroom', + 'music_stool', 'musical_instrument', 'nailfile', 'nameplate', 'napkin', + 'neckerchief', 'necklace', 'necktie', 'needle', 'nest', 'newsstand', + 'nightshirt', 'nosebag_(for_animals)', 'noseband_(for_animals)', + 'notebook', 'notepad', 'nut', 'nutcracker', 'oar', 'octopus_(food)', + 'octopus_(animal)', 'oil_lamp', 'olive_oil', 'omelet', 'onion', + 'orange_(fruit)', 'orange_juice', 'oregano', 'ostrich', 'ottoman', + 'overalls_(clothing)', 'owl', 'packet', 'inkpad', 'pad', 'paddle', + 'padlock', 'paintbox', 'paintbrush', 'painting', 'pajamas', 'palette', + 'pan_(for_cooking)', 'pan_(metal_container)', 'pancake', 'pantyhose', + 'papaya', 'paperclip', 'paper_plate', 'paper_towel', 'paperback_book', + 'paperweight', 'parachute', 'parakeet', 'parasail_(sports)', + 'parchment', 'parka', 'parking_meter', 'parrot', + 'passenger_car_(part_of_a_train)', 'passenger_ship', 'passport', + 'pastry', 'patty_(food)', 'pea_(food)', 'peach', 'peanut_butter', + 'pear', 'peeler_(tool_for_fruit_and_vegetables)', 'pegboard', + 'pelican', 'pen', 'pencil', 'pencil_box', 'pencil_sharpener', + 'pendulum', 'penguin', 'pennant', 'penny_(coin)', 'pepper', + 'pepper_mill', 'perfume', 'persimmon', 'baby', 'pet', 'petfood', + 'pew_(church_bench)', 'phonebook', 'phonograph_record', 'piano', + 'pickle', 'pickup_truck', 'pie', 'pigeon', 'piggy_bank', 'pillow', + 'pin_(non_jewelry)', 'pineapple', 'pinecone', 'ping-pong_ball', + 'pinwheel', 'tobacco_pipe', 'pipe', 'pistol', 'pita_(bread)', + 'pitcher_(vessel_for_liquid)', 'pitchfork', 'pizza', 'place_mat', + 'plate', 'platter', 'playing_card', 'playpen', 'pliers', + 'plow_(farm_equipment)', 'pocket_watch', 'pocketknife', + 'poker_(fire_stirring_tool)', 'pole', 'police_van', 'polo_shirt', + 'poncho', 'pony', 'pool_table', 'pop_(soda)', 'portrait', + 'postbox_(public)', 'postcard', 'poster', 'pot', 'flowerpot', 'potato', + 'potholder', 'pottery', 'pouch', 'power_shovel', 'prawn', 'printer', + 'projectile_(weapon)', 'projector', 'propeller', 'prune', 'pudding', + 'puffer_(fish)', 'puffin', 'pug-dog', 'pumpkin', 'puncher', 'puppet', + 'puppy', 'quesadilla', 'quiche', 'quilt', 'rabbit', 'race_car', + 'racket', 'radar', 'radiator', 'radio_receiver', 'radish', 'raft', + 'rag_doll', 'raincoat', 'ram_(animal)', 'raspberry', 'rat', + 'razorblade', 'reamer_(juicer)', 'rearview_mirror', 'receipt', + 'recliner', 'record_player', 'red_cabbage', 'reflector', + 'remote_control', 'rhinoceros', 'rib_(food)', 'rifle', 'ring', + 'river_boat', 'road_map', 'robe', 'rocking_chair', 'roller_skate', + 'Rollerblade', 'rolling_pin', 'root_beer', + 'router_(computer_equipment)', 'rubber_band', 'runner_(carpet)', + 'plastic_bag', 'saddle_(on_an_animal)', 'saddle_blanket', 'saddlebag', + 'safety_pin', 'sail', 'salad', 'salad_plate', 'salami', + 'salmon_(fish)', 'salmon_(food)', 'salsa', 'saltshaker', + 'sandal_(type_of_shoe)', 'sandwich', 'satchel', 'saucepan', 'saucer', + 'sausage', 'sawhorse', 'saxophone', 'scale_(measuring_instrument)', + 'scarecrow', 'scarf', 'school_bus', 'scissors', 'scoreboard', + 'scrambled_eggs', 'scraper', 'scratcher', 'screwdriver', + 'scrubbing_brush', 'sculpture', 'seabird', 'seahorse', 'seaplane', + 'seashell', 'seedling', 'serving_dish', 'sewing_machine', 'shaker', + 'shampoo', 'shark', 'sharpener', 'Sharpie', 'shaver_(electric)', + 'shaving_cream', 'shawl', 'shears', 'sheep', 'shepherd_dog', + 'sherbert', 'shield', 'shirt', 'shoe', 'shopping_bag', 'shopping_cart', + 'short_pants', 'shot_glass', 'shoulder_bag', 'shovel', 'shower_head', + 'shower_curtain', 'shredder_(for_paper)', 'sieve', 'signboard', 'silo', + 'sink', 'skateboard', 'skewer', 'ski', 'ski_boot', 'ski_parka', + 'ski_pole', 'skirt', 'sled', 'sleeping_bag', 'sling_(bandage)', + 'slipper_(footwear)', 'smoothie', 'snake', 'snowboard', 'snowman', + 'snowmobile', 'soap', 'soccer_ball', 'sock', 'soda_fountain', + 'carbonated_water', 'sofa', 'softball', 'solar_array', 'sombrero', + 'soup', 'soup_bowl', 'soupspoon', 'sour_cream', 'soya_milk', + 'space_shuttle', 'sparkler_(fireworks)', 'spatula', 'spear', + 'spectacles', 'spice_rack', 'spider', 'sponge', 'spoon', 'sportswear', + 'spotlight', 'squirrel', 'stapler_(stapling_machine)', 'starfish', + 'statue_(sculpture)', 'steak_(food)', 'steak_knife', + 'steamer_(kitchen_appliance)', 'steering_wheel', 'stencil', + 'stepladder', 'step_stool', 'stereo_(sound_system)', 'stew', 'stirrer', + 'stirrup', 'stockings_(leg_wear)', 'stool', 'stop_sign', 'brake_light', + 'stove', 'strainer', 'strap', 'straw_(for_drinking)', 'strawberry', + 'street_sign', 'streetlight', 'string_cheese', 'stylus', 'subwoofer', + 'sugar_bowl', 'sugarcane_(plant)', 'suit_(clothing)', 'sunflower', + 'sunglasses', 'sunhat', 'sunscreen', 'surfboard', 'sushi', 'mop', + 'sweat_pants', 'sweatband', 'sweater', 'sweatshirt', 'sweet_potato', + 'swimsuit', 'sword', 'syringe', 'Tabasco_sauce', 'table-tennis_table', + 'table', 'table_lamp', 'tablecloth', 'tachometer', 'taco', 'tag', + 'taillight', 'tambourine', 'army_tank', 'tank_(storage_vessel)', + 'tank_top_(clothing)', 'tape_(sticky_cloth_or_paper)', 'tape_measure', + 'tapestry', 'tarp', 'tartan', 'tassel', 'tea_bag', 'teacup', + 'teakettle', 'teapot', 'teddy_bear', 'telephone', 'telephone_booth', + 'telephone_pole', 'telephoto_lens', 'television_camera', + 'television_set', 'tennis_ball', 'tennis_racket', 'tequila', + 'thermometer', 'thermos_bottle', 'thermostat', 'thimble', 'thread', + 'thumbtack', 'tiara', 'tiger', 'tights_(clothing)', 'timer', 'tinfoil', + 'tinsel', 'tissue_paper', 'toast_(food)', 'toaster', 'toaster_oven', + 'toilet', 'toilet_tissue', 'tomato', 'tongs', 'toolbox', 'toothbrush', + 'toothpaste', 'toothpick', 'cover', 'tortilla', 'tow_truck', 'towel', + 'towel_rack', 'toy', 'tractor_(farm_equipment)', 'traffic_light', + 'dirt_bike', 'trailer_truck', 'train_(railroad_vehicle)', 'trampoline', + 'tray', 'tree_house', 'trench_coat', 'triangle_(musical_instrument)', + 'tricycle', 'tripod', 'trousers', 'truck', 'truffle_(chocolate)', + 'trunk', 'vat', 'turban', 'turkey_(bird)', 'turkey_(food)', 'turnip', + 'turtle', 'turtleneck_(clothing)', 'typewriter', 'umbrella', + 'underwear', 'unicycle', 'urinal', 'urn', 'vacuum_cleaner', 'valve', + 'vase', 'vending_machine', 'vent', 'videotape', 'vinegar', 'violin', + 'vodka', 'volleyball', 'vulture', 'waffle', 'waffle_iron', 'wagon', + 'wagon_wheel', 'walking_stick', 'wall_clock', 'wall_socket', 'wallet', + 'walrus', 'wardrobe', 'wasabi', 'automatic_washer', 'watch', + 'water_bottle', 'water_cooler', 'water_faucet', 'water_filter', + 'water_heater', 'water_jug', 'water_gun', 'water_scooter', 'water_ski', + 'water_tower', 'watering_can', 'watermelon', 'weathervane', 'webcam', + 'wedding_cake', 'wedding_ring', 'wet_suit', 'wheel', 'wheelchair', + 'whipped_cream', 'whiskey', 'whistle', 'wick', 'wig', 'wind_chime', + 'windmill', 'window_box_(for_plants)', 'windshield_wiper', 'windsock', + 'wine_bottle', 'wine_bucket', 'wineglass', 'wing_chair', + 'blinder_(for_horses)', 'wok', 'wolf', 'wooden_spoon', 'wreath', + 'wrench', 'wristband', 'wristlet', 'yacht', 'yak', 'yogurt', + 'yoke_(animal_equipment)', 'zebra', 'zucchini') + + PALETTE = None + + def load_annotations(self, ann_file): + """Load annotation from lvis style annotation file. + + Args: + ann_file (str): Path of annotation file. + + Returns: + list[dict]: Annotation info from LVIS api. + """ + + try: + import lvis + if getattr(lvis, '__version__', '0') >= '10.5.3': + warnings.warn( + 'mmlvis is deprecated, please install official lvis-api by "pip install git+https://github.com/lvis-dataset/lvis-api.git"', # noqa: E501 + UserWarning) + from lvis import LVIS + except ImportError: + raise ImportError( + 'Package lvis is not installed. Please run "pip install git+https://github.com/lvis-dataset/lvis-api.git".' # noqa: E501 + ) + self.coco = LVIS(ann_file) + self.cat_ids = self.coco.get_cat_ids() + self.cat2label = {cat_id: i for i, cat_id in enumerate(self.cat_ids)} + self.img_ids = self.coco.get_img_ids() + data_infos = [] + for i in self.img_ids: + info = self.coco.load_imgs([i])[0] + if info['file_name'].startswith('COCO'): + # Convert form the COCO 2014 file naming convention of + # COCO_[train/val/test]2014_000000000000.jpg to the 2017 + # naming convention of 000000000000.jpg + # (LVIS v1 will fix this naming issue) + info['filename'] = info['file_name'][-16:] + else: + info['filename'] = info['file_name'] + data_infos.append(info) + return data_infos + + def evaluate(self, + results, + metric='bbox', + logger=None, + jsonfile_prefix=None, + classwise=False, + proposal_nums=(100, 300, 1000), + iou_thrs=np.arange(0.5, 0.96, 0.05)): + """Evaluation in LVIS protocol. + + Args: + results (list[list | tuple]): Testing results of the dataset. + metric (str | list[str]): Metrics to be evaluated. Options are + 'bbox', 'segm', 'proposal', 'proposal_fast'. + logger (logging.Logger | str | None): Logger used for printing + related information during evaluation. Default: None. + jsonfile_prefix (str | None): + classwise (bool): Whether to evaluating the AP for each class. + proposal_nums (Sequence[int]): Proposal number used for evaluating + recalls, such as recall@100, recall@1000. + Default: (100, 300, 1000). + iou_thrs (Sequence[float]): IoU threshold used for evaluating + recalls. If set to a list, the average recall of all IoUs will + also be computed. Default: 0.5. + + Returns: + dict[str, float]: LVIS style metrics. + """ + + try: + import lvis + if getattr(lvis, '__version__', '0') >= '10.5.3': + warnings.warn( + 'mmlvis is deprecated, please install official lvis-api by "pip install git+https://github.com/lvis-dataset/lvis-api.git"', # noqa: E501 + UserWarning) + from lvis import LVISEval, LVISResults + except ImportError: + raise ImportError( + 'Package lvis is not installed. Please run "pip install git+https://github.com/lvis-dataset/lvis-api.git".' # noqa: E501 + ) + assert isinstance(results, list), 'results must be a list' + assert len(results) == len(self), ( + 'The length of results is not equal to the dataset len: {} != {}'. + format(len(results), len(self))) + + metrics = metric if isinstance(metric, list) else [metric] + allowed_metrics = ['bbox', 'segm', 'proposal', 'proposal_fast'] + for metric in metrics: + if metric not in allowed_metrics: + raise KeyError('metric {} is not supported'.format(metric)) + + if jsonfile_prefix is None: + tmp_dir = tempfile.TemporaryDirectory() + jsonfile_prefix = osp.join(tmp_dir.name, 'results') + else: + tmp_dir = None + result_files = self.results2json(results, jsonfile_prefix) + + eval_results = OrderedDict() + # get original api + lvis_gt = self.coco + for metric in metrics: + msg = 'Evaluating {}...'.format(metric) + if logger is None: + msg = '\n' + msg + print_log(msg, logger=logger) + + if metric == 'proposal_fast': + ar = self.fast_eval_recall( + results, proposal_nums, iou_thrs, logger='silent') + log_msg = [] + for i, num in enumerate(proposal_nums): + eval_results['AR@{}'.format(num)] = ar[i] + log_msg.append('\nAR@{}\t{:.4f}'.format(num, ar[i])) + log_msg = ''.join(log_msg) + print_log(log_msg, logger=logger) + continue + + if metric not in result_files: + raise KeyError('{} is not in results'.format(metric)) + try: + lvis_dt = LVISResults(lvis_gt, result_files[metric]) + except IndexError: + print_log( + 'The testing results of the whole dataset is empty.', + logger=logger, + level=logging.ERROR) + break + + iou_type = 'bbox' if metric == 'proposal' else metric + lvis_eval = LVISEval(lvis_gt, lvis_dt, iou_type) + lvis_eval.params.imgIds = self.img_ids + if metric == 'proposal': + lvis_eval.params.useCats = 0 + lvis_eval.params.maxDets = list(proposal_nums) + lvis_eval.evaluate() + lvis_eval.accumulate() + lvis_eval.summarize() + for k, v in lvis_eval.get_results().items(): + if k.startswith('AR'): + val = float('{:.4f}'.format(float(v))) + eval_results[k] = val + else: + lvis_eval.evaluate() + lvis_eval.accumulate() + lvis_eval.summarize() + lvis_results = lvis_eval.get_results() + if classwise: # Compute per-category AP + # Compute per-category AP + # from https://github.com/facebookresearch/detectron2/ + precisions = lvis_eval.eval['precision'] + # precision: (iou, recall, cls, area range, max dets) + assert len(self.cat_ids) == precisions.shape[2] + + results_per_category = [] + for idx, catId in enumerate(self.cat_ids): + # area range index 0: all area ranges + # max dets index -1: typically 100 per image + # the dimensions of precisions are + # [num_thrs, num_recalls, num_cats, num_area_rngs] + nm = self.coco.load_cats([catId])[0] + precision = precisions[:, :, idx, 0] + precision = precision[precision > -1] + if precision.size: + ap = np.mean(precision) + else: + ap = float('nan') + results_per_category.append( + (f'{nm["name"]}', f'{float(ap):0.3f}')) + + num_columns = min(6, len(results_per_category) * 2) + results_flatten = list( + itertools.chain(*results_per_category)) + headers = ['category', 'AP'] * (num_columns // 2) + results_2d = itertools.zip_longest(*[ + results_flatten[i::num_columns] + for i in range(num_columns) + ]) + table_data = [headers] + table_data += [result for result in results_2d] + table = AsciiTable(table_data) + print_log('\n' + table.table, logger=logger) + + for k, v in lvis_results.items(): + if k.startswith('AP'): + key = '{}_{}'.format(metric, k) + val = float('{:.4f}'.format(float(v))) + eval_results[key] = val + ap_summary = ' '.join([ + '{}:{:.4f}'.format(k, float(v)) + for k, v in lvis_results.items() if k.startswith('AP') + ]) + eval_results['{}_mAP_copypaste'.format(metric)] = ap_summary + lvis_eval.print_results() + if tmp_dir is not None: + tmp_dir.cleanup() + return eval_results + + +LVISDataset = LVISV05Dataset +DATASETS.register_module(name='LVISDataset', module=LVISDataset) + + +@DATASETS.register_module() +class LVISV1Dataset(LVISDataset): + + CLASSES = ( + 'aerosol_can', 'air_conditioner', 'airplane', 'alarm_clock', 'alcohol', + 'alligator', 'almond', 'ambulance', 'amplifier', 'anklet', 'antenna', + 'apple', 'applesauce', 'apricot', 'apron', 'aquarium', + 'arctic_(type_of_shoe)', 'armband', 'armchair', 'armoire', 'armor', + 'artichoke', 'trash_can', 'ashtray', 'asparagus', 'atomizer', + 'avocado', 'award', 'awning', 'ax', 'baboon', 'baby_buggy', + 'basketball_backboard', 'backpack', 'handbag', 'suitcase', 'bagel', + 'bagpipe', 'baguet', 'bait', 'ball', 'ballet_skirt', 'balloon', + 'bamboo', 'banana', 'Band_Aid', 'bandage', 'bandanna', 'banjo', + 'banner', 'barbell', 'barge', 'barrel', 'barrette', 'barrow', + 'baseball_base', 'baseball', 'baseball_bat', 'baseball_cap', + 'baseball_glove', 'basket', 'basketball', 'bass_horn', 'bat_(animal)', + 'bath_mat', 'bath_towel', 'bathrobe', 'bathtub', 'batter_(food)', + 'battery', 'beachball', 'bead', 'bean_curd', 'beanbag', 'beanie', + 'bear', 'bed', 'bedpan', 'bedspread', 'cow', 'beef_(food)', 'beeper', + 'beer_bottle', 'beer_can', 'beetle', 'bell', 'bell_pepper', 'belt', + 'belt_buckle', 'bench', 'beret', 'bib', 'Bible', 'bicycle', 'visor', + 'billboard', 'binder', 'binoculars', 'bird', 'birdfeeder', 'birdbath', + 'birdcage', 'birdhouse', 'birthday_cake', 'birthday_card', + 'pirate_flag', 'black_sheep', 'blackberry', 'blackboard', 'blanket', + 'blazer', 'blender', 'blimp', 'blinker', 'blouse', 'blueberry', + 'gameboard', 'boat', 'bob', 'bobbin', 'bobby_pin', 'boiled_egg', + 'bolo_tie', 'deadbolt', 'bolt', 'bonnet', 'book', 'bookcase', + 'booklet', 'bookmark', 'boom_microphone', 'boot', 'bottle', + 'bottle_opener', 'bouquet', 'bow_(weapon)', 'bow_(decorative_ribbons)', + 'bow-tie', 'bowl', 'pipe_bowl', 'bowler_hat', 'bowling_ball', 'box', + 'boxing_glove', 'suspenders', 'bracelet', 'brass_plaque', 'brassiere', + 'bread-bin', 'bread', 'breechcloth', 'bridal_gown', 'briefcase', + 'broccoli', 'broach', 'broom', 'brownie', 'brussels_sprouts', + 'bubble_gum', 'bucket', 'horse_buggy', 'bull', 'bulldog', 'bulldozer', + 'bullet_train', 'bulletin_board', 'bulletproof_vest', 'bullhorn', + 'bun', 'bunk_bed', 'buoy', 'burrito', 'bus_(vehicle)', 'business_card', + 'butter', 'butterfly', 'button', 'cab_(taxi)', 'cabana', 'cabin_car', + 'cabinet', 'locker', 'cake', 'calculator', 'calendar', 'calf', + 'camcorder', 'camel', 'camera', 'camera_lens', 'camper_(vehicle)', + 'can', 'can_opener', 'candle', 'candle_holder', 'candy_bar', + 'candy_cane', 'walking_cane', 'canister', 'canoe', 'cantaloup', + 'canteen', 'cap_(headwear)', 'bottle_cap', 'cape', 'cappuccino', + 'car_(automobile)', 'railcar_(part_of_a_train)', 'elevator_car', + 'car_battery', 'identity_card', 'card', 'cardigan', 'cargo_ship', + 'carnation', 'horse_carriage', 'carrot', 'tote_bag', 'cart', 'carton', + 'cash_register', 'casserole', 'cassette', 'cast', 'cat', 'cauliflower', + 'cayenne_(spice)', 'CD_player', 'celery', 'cellular_telephone', + 'chain_mail', 'chair', 'chaise_longue', 'chalice', 'chandelier', + 'chap', 'checkbook', 'checkerboard', 'cherry', 'chessboard', + 'chicken_(animal)', 'chickpea', 'chili_(vegetable)', 'chime', + 'chinaware', 'crisp_(potato_chip)', 'poker_chip', 'chocolate_bar', + 'chocolate_cake', 'chocolate_milk', 'chocolate_mousse', 'choker', + 'chopping_board', 'chopstick', 'Christmas_tree', 'slide', 'cider', + 'cigar_box', 'cigarette', 'cigarette_case', 'cistern', 'clarinet', + 'clasp', 'cleansing_agent', 'cleat_(for_securing_rope)', 'clementine', + 'clip', 'clipboard', 'clippers_(for_plants)', 'cloak', 'clock', + 'clock_tower', 'clothes_hamper', 'clothespin', 'clutch_bag', 'coaster', + 'coat', 'coat_hanger', 'coatrack', 'cock', 'cockroach', + 'cocoa_(beverage)', 'coconut', 'coffee_maker', 'coffee_table', + 'coffeepot', 'coil', 'coin', 'colander', 'coleslaw', + 'coloring_material', 'combination_lock', 'pacifier', 'comic_book', + 'compass', 'computer_keyboard', 'condiment', 'cone', 'control', + 'convertible_(automobile)', 'sofa_bed', 'cooker', 'cookie', + 'cooking_utensil', 'cooler_(for_food)', 'cork_(bottle_plug)', + 'corkboard', 'corkscrew', 'edible_corn', 'cornbread', 'cornet', + 'cornice', 'cornmeal', 'corset', 'costume', 'cougar', 'coverall', + 'cowbell', 'cowboy_hat', 'crab_(animal)', 'crabmeat', 'cracker', + 'crape', 'crate', 'crayon', 'cream_pitcher', 'crescent_roll', 'crib', + 'crock_pot', 'crossbar', 'crouton', 'crow', 'crowbar', 'crown', + 'crucifix', 'cruise_ship', 'police_cruiser', 'crumb', 'crutch', + 'cub_(animal)', 'cube', 'cucumber', 'cufflink', 'cup', 'trophy_cup', + 'cupboard', 'cupcake', 'hair_curler', 'curling_iron', 'curtain', + 'cushion', 'cylinder', 'cymbal', 'dagger', 'dalmatian', 'dartboard', + 'date_(fruit)', 'deck_chair', 'deer', 'dental_floss', 'desk', + 'detergent', 'diaper', 'diary', 'die', 'dinghy', 'dining_table', 'tux', + 'dish', 'dish_antenna', 'dishrag', 'dishtowel', 'dishwasher', + 'dishwasher_detergent', 'dispenser', 'diving_board', 'Dixie_cup', + 'dog', 'dog_collar', 'doll', 'dollar', 'dollhouse', 'dolphin', + 'domestic_ass', 'doorknob', 'doormat', 'doughnut', 'dove', 'dragonfly', + 'drawer', 'underdrawers', 'dress', 'dress_hat', 'dress_suit', + 'dresser', 'drill', 'drone', 'dropper', 'drum_(musical_instrument)', + 'drumstick', 'duck', 'duckling', 'duct_tape', 'duffel_bag', 'dumbbell', + 'dumpster', 'dustpan', 'eagle', 'earphone', 'earplug', 'earring', + 'easel', 'eclair', 'eel', 'egg', 'egg_roll', 'egg_yolk', 'eggbeater', + 'eggplant', 'electric_chair', 'refrigerator', 'elephant', 'elk', + 'envelope', 'eraser', 'escargot', 'eyepatch', 'falcon', 'fan', + 'faucet', 'fedora', 'ferret', 'Ferris_wheel', 'ferry', 'fig_(fruit)', + 'fighter_jet', 'figurine', 'file_cabinet', 'file_(tool)', 'fire_alarm', + 'fire_engine', 'fire_extinguisher', 'fire_hose', 'fireplace', + 'fireplug', 'first-aid_kit', 'fish', 'fish_(food)', 'fishbowl', + 'fishing_rod', 'flag', 'flagpole', 'flamingo', 'flannel', 'flap', + 'flash', 'flashlight', 'fleece', 'flip-flop_(sandal)', + 'flipper_(footwear)', 'flower_arrangement', 'flute_glass', 'foal', + 'folding_chair', 'food_processor', 'football_(American)', + 'football_helmet', 'footstool', 'fork', 'forklift', 'freight_car', + 'French_toast', 'freshener', 'frisbee', 'frog', 'fruit_juice', + 'frying_pan', 'fudge', 'funnel', 'futon', 'gag', 'garbage', + 'garbage_truck', 'garden_hose', 'gargle', 'gargoyle', 'garlic', + 'gasmask', 'gazelle', 'gelatin', 'gemstone', 'generator', + 'giant_panda', 'gift_wrap', 'ginger', 'giraffe', 'cincture', + 'glass_(drink_container)', 'globe', 'glove', 'goat', 'goggles', + 'goldfish', 'golf_club', 'golfcart', 'gondola_(boat)', 'goose', + 'gorilla', 'gourd', 'grape', 'grater', 'gravestone', 'gravy_boat', + 'green_bean', 'green_onion', 'griddle', 'grill', 'grits', 'grizzly', + 'grocery_bag', 'guitar', 'gull', 'gun', 'hairbrush', 'hairnet', + 'hairpin', 'halter_top', 'ham', 'hamburger', 'hammer', 'hammock', + 'hamper', 'hamster', 'hair_dryer', 'hand_glass', 'hand_towel', + 'handcart', 'handcuff', 'handkerchief', 'handle', 'handsaw', + 'hardback_book', 'harmonium', 'hat', 'hatbox', 'veil', 'headband', + 'headboard', 'headlight', 'headscarf', 'headset', + 'headstall_(for_horses)', 'heart', 'heater', 'helicopter', 'helmet', + 'heron', 'highchair', 'hinge', 'hippopotamus', 'hockey_stick', 'hog', + 'home_plate_(baseball)', 'honey', 'fume_hood', 'hook', 'hookah', + 'hornet', 'horse', 'hose', 'hot-air_balloon', 'hotplate', 'hot_sauce', + 'hourglass', 'houseboat', 'hummingbird', 'hummus', 'polar_bear', + 'icecream', 'popsicle', 'ice_maker', 'ice_pack', 'ice_skate', + 'igniter', 'inhaler', 'iPod', 'iron_(for_clothing)', 'ironing_board', + 'jacket', 'jam', 'jar', 'jean', 'jeep', 'jelly_bean', 'jersey', + 'jet_plane', 'jewel', 'jewelry', 'joystick', 'jumpsuit', 'kayak', + 'keg', 'kennel', 'kettle', 'key', 'keycard', 'kilt', 'kimono', + 'kitchen_sink', 'kitchen_table', 'kite', 'kitten', 'kiwi_fruit', + 'knee_pad', 'knife', 'knitting_needle', 'knob', 'knocker_(on_a_door)', + 'koala', 'lab_coat', 'ladder', 'ladle', 'ladybug', 'lamb_(animal)', + 'lamb-chop', 'lamp', 'lamppost', 'lampshade', 'lantern', 'lanyard', + 'laptop_computer', 'lasagna', 'latch', 'lawn_mower', 'leather', + 'legging_(clothing)', 'Lego', 'legume', 'lemon', 'lemonade', 'lettuce', + 'license_plate', 'life_buoy', 'life_jacket', 'lightbulb', + 'lightning_rod', 'lime', 'limousine', 'lion', 'lip_balm', 'liquor', + 'lizard', 'log', 'lollipop', 'speaker_(stereo_equipment)', 'loveseat', + 'machine_gun', 'magazine', 'magnet', 'mail_slot', 'mailbox_(at_home)', + 'mallard', 'mallet', 'mammoth', 'manatee', 'mandarin_orange', 'manger', + 'manhole', 'map', 'marker', 'martini', 'mascot', 'mashed_potato', + 'masher', 'mask', 'mast', 'mat_(gym_equipment)', 'matchbox', + 'mattress', 'measuring_cup', 'measuring_stick', 'meatball', 'medicine', + 'melon', 'microphone', 'microscope', 'microwave_oven', 'milestone', + 'milk', 'milk_can', 'milkshake', 'minivan', 'mint_candy', 'mirror', + 'mitten', 'mixer_(kitchen_tool)', 'money', + 'monitor_(computer_equipment) computer_monitor', 'monkey', 'motor', + 'motor_scooter', 'motor_vehicle', 'motorcycle', 'mound_(baseball)', + 'mouse_(computer_equipment)', 'mousepad', 'muffin', 'mug', 'mushroom', + 'music_stool', 'musical_instrument', 'nailfile', 'napkin', + 'neckerchief', 'necklace', 'necktie', 'needle', 'nest', 'newspaper', + 'newsstand', 'nightshirt', 'nosebag_(for_animals)', + 'noseband_(for_animals)', 'notebook', 'notepad', 'nut', 'nutcracker', + 'oar', 'octopus_(food)', 'octopus_(animal)', 'oil_lamp', 'olive_oil', + 'omelet', 'onion', 'orange_(fruit)', 'orange_juice', 'ostrich', + 'ottoman', 'oven', 'overalls_(clothing)', 'owl', 'packet', 'inkpad', + 'pad', 'paddle', 'padlock', 'paintbrush', 'painting', 'pajamas', + 'palette', 'pan_(for_cooking)', 'pan_(metal_container)', 'pancake', + 'pantyhose', 'papaya', 'paper_plate', 'paper_towel', 'paperback_book', + 'paperweight', 'parachute', 'parakeet', 'parasail_(sports)', 'parasol', + 'parchment', 'parka', 'parking_meter', 'parrot', + 'passenger_car_(part_of_a_train)', 'passenger_ship', 'passport', + 'pastry', 'patty_(food)', 'pea_(food)', 'peach', 'peanut_butter', + 'pear', 'peeler_(tool_for_fruit_and_vegetables)', 'wooden_leg', + 'pegboard', 'pelican', 'pen', 'pencil', 'pencil_box', + 'pencil_sharpener', 'pendulum', 'penguin', 'pennant', 'penny_(coin)', + 'pepper', 'pepper_mill', 'perfume', 'persimmon', 'person', 'pet', + 'pew_(church_bench)', 'phonebook', 'phonograph_record', 'piano', + 'pickle', 'pickup_truck', 'pie', 'pigeon', 'piggy_bank', 'pillow', + 'pin_(non_jewelry)', 'pineapple', 'pinecone', 'ping-pong_ball', + 'pinwheel', 'tobacco_pipe', 'pipe', 'pistol', 'pita_(bread)', + 'pitcher_(vessel_for_liquid)', 'pitchfork', 'pizza', 'place_mat', + 'plate', 'platter', 'playpen', 'pliers', 'plow_(farm_equipment)', + 'plume', 'pocket_watch', 'pocketknife', 'poker_(fire_stirring_tool)', + 'pole', 'polo_shirt', 'poncho', 'pony', 'pool_table', 'pop_(soda)', + 'postbox_(public)', 'postcard', 'poster', 'pot', 'flowerpot', 'potato', + 'potholder', 'pottery', 'pouch', 'power_shovel', 'prawn', 'pretzel', + 'printer', 'projectile_(weapon)', 'projector', 'propeller', 'prune', + 'pudding', 'puffer_(fish)', 'puffin', 'pug-dog', 'pumpkin', 'puncher', + 'puppet', 'puppy', 'quesadilla', 'quiche', 'quilt', 'rabbit', + 'race_car', 'racket', 'radar', 'radiator', 'radio_receiver', 'radish', + 'raft', 'rag_doll', 'raincoat', 'ram_(animal)', 'raspberry', 'rat', + 'razorblade', 'reamer_(juicer)', 'rearview_mirror', 'receipt', + 'recliner', 'record_player', 'reflector', 'remote_control', + 'rhinoceros', 'rib_(food)', 'rifle', 'ring', 'river_boat', 'road_map', + 'robe', 'rocking_chair', 'rodent', 'roller_skate', 'Rollerblade', + 'rolling_pin', 'root_beer', 'router_(computer_equipment)', + 'rubber_band', 'runner_(carpet)', 'plastic_bag', + 'saddle_(on_an_animal)', 'saddle_blanket', 'saddlebag', 'safety_pin', + 'sail', 'salad', 'salad_plate', 'salami', 'salmon_(fish)', + 'salmon_(food)', 'salsa', 'saltshaker', 'sandal_(type_of_shoe)', + 'sandwich', 'satchel', 'saucepan', 'saucer', 'sausage', 'sawhorse', + 'saxophone', 'scale_(measuring_instrument)', 'scarecrow', 'scarf', + 'school_bus', 'scissors', 'scoreboard', 'scraper', 'screwdriver', + 'scrubbing_brush', 'sculpture', 'seabird', 'seahorse', 'seaplane', + 'seashell', 'sewing_machine', 'shaker', 'shampoo', 'shark', + 'sharpener', 'Sharpie', 'shaver_(electric)', 'shaving_cream', 'shawl', + 'shears', 'sheep', 'shepherd_dog', 'sherbert', 'shield', 'shirt', + 'shoe', 'shopping_bag', 'shopping_cart', 'short_pants', 'shot_glass', + 'shoulder_bag', 'shovel', 'shower_head', 'shower_cap', + 'shower_curtain', 'shredder_(for_paper)', 'signboard', 'silo', 'sink', + 'skateboard', 'skewer', 'ski', 'ski_boot', 'ski_parka', 'ski_pole', + 'skirt', 'skullcap', 'sled', 'sleeping_bag', 'sling_(bandage)', + 'slipper_(footwear)', 'smoothie', 'snake', 'snowboard', 'snowman', + 'snowmobile', 'soap', 'soccer_ball', 'sock', 'sofa', 'softball', + 'solar_array', 'sombrero', 'soup', 'soup_bowl', 'soupspoon', + 'sour_cream', 'soya_milk', 'space_shuttle', 'sparkler_(fireworks)', + 'spatula', 'spear', 'spectacles', 'spice_rack', 'spider', 'crawfish', + 'sponge', 'spoon', 'sportswear', 'spotlight', 'squid_(food)', + 'squirrel', 'stagecoach', 'stapler_(stapling_machine)', 'starfish', + 'statue_(sculpture)', 'steak_(food)', 'steak_knife', 'steering_wheel', + 'stepladder', 'step_stool', 'stereo_(sound_system)', 'stew', 'stirrer', + 'stirrup', 'stool', 'stop_sign', 'brake_light', 'stove', 'strainer', + 'strap', 'straw_(for_drinking)', 'strawberry', 'street_sign', + 'streetlight', 'string_cheese', 'stylus', 'subwoofer', 'sugar_bowl', + 'sugarcane_(plant)', 'suit_(clothing)', 'sunflower', 'sunglasses', + 'sunhat', 'surfboard', 'sushi', 'mop', 'sweat_pants', 'sweatband', + 'sweater', 'sweatshirt', 'sweet_potato', 'swimsuit', 'sword', + 'syringe', 'Tabasco_sauce', 'table-tennis_table', 'table', + 'table_lamp', 'tablecloth', 'tachometer', 'taco', 'tag', 'taillight', + 'tambourine', 'army_tank', 'tank_(storage_vessel)', + 'tank_top_(clothing)', 'tape_(sticky_cloth_or_paper)', 'tape_measure', + 'tapestry', 'tarp', 'tartan', 'tassel', 'tea_bag', 'teacup', + 'teakettle', 'teapot', 'teddy_bear', 'telephone', 'telephone_booth', + 'telephone_pole', 'telephoto_lens', 'television_camera', + 'television_set', 'tennis_ball', 'tennis_racket', 'tequila', + 'thermometer', 'thermos_bottle', 'thermostat', 'thimble', 'thread', + 'thumbtack', 'tiara', 'tiger', 'tights_(clothing)', 'timer', 'tinfoil', + 'tinsel', 'tissue_paper', 'toast_(food)', 'toaster', 'toaster_oven', + 'toilet', 'toilet_tissue', 'tomato', 'tongs', 'toolbox', 'toothbrush', + 'toothpaste', 'toothpick', 'cover', 'tortilla', 'tow_truck', 'towel', + 'towel_rack', 'toy', 'tractor_(farm_equipment)', 'traffic_light', + 'dirt_bike', 'trailer_truck', 'train_(railroad_vehicle)', 'trampoline', + 'tray', 'trench_coat', 'triangle_(musical_instrument)', 'tricycle', + 'tripod', 'trousers', 'truck', 'truffle_(chocolate)', 'trunk', 'vat', + 'turban', 'turkey_(food)', 'turnip', 'turtle', 'turtleneck_(clothing)', + 'typewriter', 'umbrella', 'underwear', 'unicycle', 'urinal', 'urn', + 'vacuum_cleaner', 'vase', 'vending_machine', 'vent', 'vest', + 'videotape', 'vinegar', 'violin', 'vodka', 'volleyball', 'vulture', + 'waffle', 'waffle_iron', 'wagon', 'wagon_wheel', 'walking_stick', + 'wall_clock', 'wall_socket', 'wallet', 'walrus', 'wardrobe', + 'washbasin', 'automatic_washer', 'watch', 'water_bottle', + 'water_cooler', 'water_faucet', 'water_heater', 'water_jug', + 'water_gun', 'water_scooter', 'water_ski', 'water_tower', + 'watering_can', 'watermelon', 'weathervane', 'webcam', 'wedding_cake', + 'wedding_ring', 'wet_suit', 'wheel', 'wheelchair', 'whipped_cream', + 'whistle', 'wig', 'wind_chime', 'windmill', 'window_box_(for_plants)', + 'windshield_wiper', 'windsock', 'wine_bottle', 'wine_bucket', + 'wineglass', 'blinder_(for_horses)', 'wok', 'wolf', 'wooden_spoon', + 'wreath', 'wrench', 'wristband', 'wristlet', 'yacht', 'yogurt', + 'yoke_(animal_equipment)', 'zebra', 'zucchini') + + def load_annotations(self, ann_file): + try: + import lvis + if getattr(lvis, '__version__', '0') >= '10.5.3': + warnings.warn( + 'mmlvis is deprecated, please install official lvis-api by "pip install git+https://github.com/lvis-dataset/lvis-api.git"', # noqa: E501 + UserWarning) + from lvis import LVIS + except ImportError: + raise ImportError( + 'Package lvis is not installed. Please run "pip install git+https://github.com/lvis-dataset/lvis-api.git".' # noqa: E501 + ) + self.coco = LVIS(ann_file) + self.cat_ids = self.coco.get_cat_ids() + self.cat2label = {cat_id: i for i, cat_id in enumerate(self.cat_ids)} + self.img_ids = self.coco.get_img_ids() + data_infos = [] + for i in self.img_ids: + info = self.coco.load_imgs([i])[0] + # coco_url is used in LVISv1 instead of file_name + # e.g. http://images.cocodataset.org/train2017/000000391895.jpg + # train/val split in specified in url + info['filename'] = info['coco_url'].replace( + 'http://images.cocodataset.org/', '') + data_infos.append(info) + return data_infos diff --git a/mmdet/datasets/objects365.py b/mmdet/datasets/objects365.py new file mode 100644 index 0000000..930f470 --- /dev/null +++ b/mmdet/datasets/objects365.py @@ -0,0 +1,232 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp + +from .api_wrappers import COCO +from .builder import DATASETS +from .coco import CocoDataset + +# images exist in annotations but not in image folder. +objv2_ignore_list = [ + osp.join('patch16', 'objects365_v2_00908726.jpg'), + osp.join('patch6', 'objects365_v1_00320532.jpg'), + osp.join('patch6', 'objects365_v1_00320534.jpg'), +] + + +@DATASETS.register_module() +class Objects365V1Dataset(CocoDataset): + """Objects365 v1 dataset for detection.""" + CLASSES = ( + 'person', 'sneakers', 'chair', 'hat', 'lamp', 'bottle', + 'cabinet/shelf', 'cup', 'car', 'glasses', 'picture/frame', 'desk', + 'handbag', 'street lights', 'book', 'plate', 'helmet', 'leather shoes', + 'pillow', 'glove', 'potted plant', 'bracelet', 'flower', 'tv', + 'storage box', 'vase', 'bench', 'wine glass', 'boots', 'bowl', + 'dining table', 'umbrella', 'boat', 'flag', 'speaker', 'trash bin/can', + 'stool', 'backpack', 'couch', 'belt', 'carpet', 'basket', + 'towel/napkin', 'slippers', 'barrel/bucket', 'coffee table', 'suv', + 'toy', 'tie', 'bed', 'traffic light', 'pen/pencil', 'microphone', + 'sandals', 'canned', 'necklace', 'mirror', 'faucet', 'bicycle', + 'bread', 'high heels', 'ring', 'van', 'watch', 'sink', 'horse', 'fish', + 'apple', 'camera', 'candle', 'teddy bear', 'cake', 'motorcycle', + 'wild bird', 'laptop', 'knife', 'traffic sign', 'cell phone', 'paddle', + 'truck', 'cow', 'power outlet', 'clock', 'drum', 'fork', 'bus', + 'hanger', 'nightstand', 'pot/pan', 'sheep', 'guitar', 'traffic cone', + 'tea pot', 'keyboard', 'tripod', 'hockey', 'fan', 'dog', 'spoon', + 'blackboard/whiteboard', 'balloon', 'air conditioner', 'cymbal', + 'mouse', 'telephone', 'pickup truck', 'orange', 'banana', 'airplane', + 'luggage', 'skis', 'soccer', 'trolley', 'oven', 'remote', + 'baseball glove', 'paper towel', 'refrigerator', 'train', 'tomato', + 'machinery vehicle', 'tent', 'shampoo/shower gel', 'head phone', + 'lantern', 'donut', 'cleaning products', 'sailboat', 'tangerine', + 'pizza', 'kite', 'computer box', 'elephant', 'toiletries', 'gas stove', + 'broccoli', 'toilet', 'stroller', 'shovel', 'baseball bat', + 'microwave', 'skateboard', 'surfboard', 'surveillance camera', 'gun', + 'life saver', 'cat', 'lemon', 'liquid soap', 'zebra', 'duck', + 'sports car', 'giraffe', 'pumpkin', 'piano', 'stop sign', 'radiator', + 'converter', 'tissue ', 'carrot', 'washing machine', 'vent', 'cookies', + 'cutting/chopping board', 'tennis racket', 'candy', + 'skating and skiing shoes', 'scissors', 'folder', 'baseball', + 'strawberry', 'bow tie', 'pigeon', 'pepper', 'coffee machine', + 'bathtub', 'snowboard', 'suitcase', 'grapes', 'ladder', 'pear', + 'american football', 'basketball', 'potato', 'paint brush', 'printer', + 'billiards', 'fire hydrant', 'goose', 'projector', 'sausage', + 'fire extinguisher', 'extension cord', 'facial mask', 'tennis ball', + 'chopsticks', 'electronic stove and gas stove', 'pie', 'frisbee', + 'kettle', 'hamburger', 'golf club', 'cucumber', 'clutch', 'blender', + 'tong', 'slide', 'hot dog', 'toothbrush', 'facial cleanser', 'mango', + 'deer', 'egg', 'violin', 'marker', 'ship', 'chicken', 'onion', + 'ice cream', 'tape', 'wheelchair', 'plum', 'bar soap', 'scale', + 'watermelon', 'cabbage', 'router/modem', 'golf ball', 'pine apple', + 'crane', 'fire truck', 'peach', 'cello', 'notepaper', 'tricycle', + 'toaster', 'helicopter', 'green beans', 'brush', 'carriage', 'cigar', + 'earphone', 'penguin', 'hurdle', 'swing', 'radio', 'CD', + 'parking meter', 'swan', 'garlic', 'french fries', 'horn', 'avocado', + 'saxophone', 'trumpet', 'sandwich', 'cue', 'kiwi fruit', 'bear', + 'fishing rod', 'cherry', 'tablet', 'green vegetables', 'nuts', 'corn', + 'key', 'screwdriver', 'globe', 'broom', 'pliers', 'volleyball', + 'hammer', 'eggplant', 'trophy', 'dates', 'board eraser', 'rice', + 'tape measure/ruler', 'dumbbell', 'hamimelon', 'stapler', 'camel', + 'lettuce', 'goldfish', 'meat balls', 'medal', 'toothpaste', 'antelope', + 'shrimp', 'rickshaw', 'trombone', 'pomegranate', 'coconut', + 'jellyfish', 'mushroom', 'calculator', 'treadmill', 'butterfly', + 'egg tart', 'cheese', 'pig', 'pomelo', 'race car', 'rice cooker', + 'tuba', 'crosswalk sign', 'papaya', 'hair drier', 'green onion', + 'chips', 'dolphin', 'sushi', 'urinal', 'donkey', 'electric drill', + 'spring rolls', 'tortoise/turtle', 'parrot', 'flute', 'measuring cup', + 'shark', 'steak', 'poker card', 'binoculars', 'llama', 'radish', + 'noodles', 'yak', 'mop', 'crab', 'microscope', 'barbell', 'bread/bun', + 'baozi', 'lion', 'red cabbage', 'polar bear', 'lighter', 'seal', + 'mangosteen', 'comb', 'eraser', 'pitaya', 'scallop', 'pencil case', + 'saw', 'table tennis paddle', 'okra', 'starfish', 'eagle', 'monkey', + 'durian', 'game board', 'rabbit', 'french horn', 'ambulance', + 'asparagus', 'hoverboard', 'pasta', 'target', 'hotair balloon', + 'chainsaw', 'lobster', 'iron', 'flashlight') + + PALETTE = None + + def load_annotations(self, ann_file): + """Load annotation from COCO style annotation file. + + Args: + ann_file (str): Path of annotation file. + + Returns: + list[dict]: Annotation info from COCO api. + """ + + self.coco = COCO(ann_file) + # 'categories' list in objects365_train.json and objects365_val. + # json is inconsistent, need sorted list(or dict) before get cat_ids. + cats = self.coco.cats + sorted_cats = {i: cats[i] for i in sorted(cats)} + self.coco.cats = sorted_cats + categories = self.coco.dataset['categories'] + sorted_categories = sorted(categories, key=lambda i: i['id']) + self.coco.dataset['categories'] = sorted_categories + # The order of returned `cat_ids` will not + # change with the order of the CLASSES + self.cat_ids = self.coco.get_cat_ids(cat_names=self.CLASSES) + + self.cat2label = {cat_id: i for i, cat_id in enumerate(self.cat_ids)} + self.img_ids = self.coco.get_img_ids() + data_infos = [] + total_ann_ids = [] + for i in self.img_ids: + info = self.coco.load_imgs([i])[0] + info['filename'] = info['file_name'] + data_infos.append(info) + ann_ids = self.coco.get_ann_ids(img_ids=[i]) + total_ann_ids.extend(ann_ids) + assert len(set(total_ann_ids)) == len( + total_ann_ids), f"Annotation ids in '{ann_file}' are not unique!" + return data_infos + + +@DATASETS.register_module() +class Objects365V2Dataset(CocoDataset): + """Objects365 v2 dataset for detection.""" + + CLASSES = ( + 'Person', 'Sneakers', 'Chair', 'Other Shoes', 'Hat', 'Car', 'Lamp', + 'Glasses', 'Bottle', 'Desk', 'Cup', 'Street Lights', 'Cabinet/shelf', + 'Handbag/Satchel', 'Bracelet', 'Plate', 'Picture/Frame', 'Helmet', + 'Book', 'Gloves', 'Storage box', 'Boat', 'Leather Shoes', 'Flower', + 'Bench', 'Potted Plant', 'Bowl/Basin', 'Flag', 'Pillow', 'Boots', + 'Vase', 'Microphone', 'Necklace', 'Ring', 'SUV', 'Wine Glass', 'Belt', + 'Moniter/TV', 'Backpack', 'Umbrella', 'Traffic Light', 'Speaker', + 'Watch', 'Tie', 'Trash bin Can', 'Slippers', 'Bicycle', 'Stool', + 'Barrel/bucket', 'Van', 'Couch', 'Sandals', 'Bakset', 'Drum', + 'Pen/Pencil', 'Bus', 'Wild Bird', 'High Heels', 'Motorcycle', 'Guitar', + 'Carpet', 'Cell Phone', 'Bread', 'Camera', 'Canned', 'Truck', + 'Traffic cone', 'Cymbal', 'Lifesaver', 'Towel', 'Stuffed Toy', + 'Candle', 'Sailboat', 'Laptop', 'Awning', 'Bed', 'Faucet', 'Tent', + 'Horse', 'Mirror', 'Power outlet', 'Sink', 'Apple', 'Air Conditioner', + 'Knife', 'Hockey Stick', 'Paddle', 'Pickup Truck', 'Fork', + 'Traffic Sign', 'Ballon', 'Tripod', 'Dog', 'Spoon', + 'Clock', 'Pot', 'Cow', 'Cake', 'Dinning Table', 'Sheep', 'Hanger', + 'Blackboard/Whiteboard', 'Napkin', 'Other Fish', 'Orange/Tangerine', + 'Toiletry', 'Keyboard', 'Tomato', 'Lantern', + 'Machinery Vehicle', 'Fan', 'Green Vegetables', 'Banana', + 'Baseball Glove', 'Airplane', 'Mouse', 'Train', 'Pumpkin', 'Soccer', + 'Skiboard', 'Luggage', 'Nightstand', 'Tea pot', 'Telephone', 'Trolley', + 'Head Phone', 'Sports Car', 'Stop Sign', 'Dessert', 'Scooter', + 'Stroller', 'Crane', 'Remote', 'Refrigerator', 'Oven', 'Lemon', 'Duck', + 'Baseball Bat', 'Surveillance Camera', 'Cat', 'Jug', 'Broccoli', + 'Piano', 'Pizza', 'Elephant', 'Skateboard', 'Surfboard', 'Gun', + 'Skating and Skiing shoes', 'Gas stove', 'Donut', 'Bow Tie', 'Carrot', + 'Toilet', 'Kite', 'Strawberry', 'Other Balls', 'Shovel', 'Pepper', + 'Computer Box', 'Toilet Paper', 'Cleaning Products', 'Chopsticks', + 'Microwave', 'Pigeon', 'Baseball', 'Cutting/chopping Board', + 'Coffee Table', 'Side Table', 'Scissors', 'Marker', 'Pie', 'Ladder', + 'Snowboard', 'Cookies', 'Radiator', 'Fire Hydrant', 'Basketball', + 'Zebra', 'Grape', 'Giraffe', 'Potato', 'Sausage', 'Tricycle', 'Violin', + 'Egg', 'Fire Extinguisher', 'Candy', 'Fire Truck', 'Billards', + 'Converter', 'Bathtub', 'Wheelchair', 'Golf Club', 'Briefcase', + 'Cucumber', 'Cigar/Cigarette ', 'Paint Brush', 'Pear', 'Heavy Truck', + 'Hamburger', 'Extractor', 'Extention Cord', 'Tong', 'Tennis Racket', + 'Folder', 'American Football', 'earphone', 'Mask', 'Kettle', 'Tennis', + 'Ship', 'Swing', 'Coffee Machine', 'Slide', 'Carriage', 'Onion', + 'Green beans', 'Projector', 'Frisbee', + 'Washing Machine/Drying Machine', 'Chicken', 'Printer', 'Watermelon', + 'Saxophone', 'Tissue', 'Toothbrush', 'Ice cream', 'Hotair ballon', + 'Cello', 'French Fries', 'Scale', 'Trophy', 'Cabbage', 'Hot dog', + 'Blender', 'Peach', 'Rice', 'Wallet/Purse', 'Volleyball', 'Deer', + 'Goose', 'Tape', 'Tablet', 'Cosmetics', 'Trumpet', 'Pineapple', + 'Golf Ball', 'Ambulance', 'Parking meter', 'Mango', 'Key', 'Hurdle', + 'Fishing Rod', 'Medal', 'Flute', 'Brush', 'Penguin', 'Megaphone', + 'Corn', 'Lettuce', 'Garlic', 'Swan', 'Helicopter', 'Green Onion', + 'Sandwich', 'Nuts', 'Speed Limit Sign', 'Induction Cooker', 'Broom', + 'Trombone', 'Plum', 'Rickshaw', 'Goldfish', 'Kiwi fruit', + 'Router/modem', 'Poker Card', 'Toaster', 'Shrimp', 'Sushi', 'Cheese', + 'Notepaper', 'Cherry', 'Pliers', 'CD', 'Pasta', 'Hammer', 'Cue', + 'Avocado', 'Hamimelon', 'Flask', 'Mushroon', 'Screwdriver', 'Soap', + 'Recorder', 'Bear', 'Eggplant', 'Board Eraser', 'Coconut', + 'Tape Measur/ Ruler', 'Pig', 'Showerhead', 'Globe', 'Chips', 'Steak', + 'Crosswalk Sign', 'Stapler', 'Campel', 'Formula 1 ', 'Pomegranate', + 'Dishwasher', 'Crab', 'Hoverboard', 'Meat ball', 'Rice Cooker', 'Tuba', + 'Calculator', 'Papaya', 'Antelope', 'Parrot', 'Seal', 'Buttefly', + 'Dumbbell', 'Donkey', 'Lion', 'Urinal', 'Dolphin', 'Electric Drill', + 'Hair Dryer', 'Egg tart', 'Jellyfish', 'Treadmill', 'Lighter', + 'Grapefruit', 'Game board', 'Mop', 'Radish', 'Baozi', 'Target', + 'French', 'Spring Rolls', 'Monkey', 'Rabbit', 'Pencil Case', 'Yak', + 'Red Cabbage', 'Binoculars', 'Asparagus', 'Barbell', 'Scallop', + 'Noddles', 'Comb', 'Dumpling', 'Oyster', 'Table Teniis paddle', + 'Cosmetics Brush/Eyeliner Pencil', 'Chainsaw', 'Eraser', 'Lobster', + 'Durian', 'Okra', 'Lipstick', 'Cosmetics Mirror', 'Curling', + 'Table Tennis ') + + def load_annotations(self, ann_file): + """Load annotation from COCO style annotation file. + + Args: + ann_file (str): Path of annotation file. + + Returns: + list[dict]: Annotation info from COCO api. + """ + + self.coco = COCO(ann_file) + # The order of returned `cat_ids` will not + # change with the order of the CLASSES + self.cat_ids = self.coco.get_cat_ids(cat_names=self.CLASSES) + + self.cat2label = {cat_id: i for i, cat_id in enumerate(self.cat_ids)} + self.img_ids = self.coco.get_img_ids() + data_infos = [] + total_ann_ids = [] + for i in self.img_ids: + info = self.coco.load_imgs([i])[0] + file_name = osp.join( + osp.split(osp.split(info['file_name'])[0])[-1], + osp.split(info['file_name'])[-1]) + info['file_name'] = file_name + if info['file_name'] in objv2_ignore_list: + continue + info['filename'] = info['file_name'] + data_infos.append(info) + ann_ids = self.coco.get_ann_ids(img_ids=[i]) + total_ann_ids.extend(ann_ids) + assert len(set(total_ann_ids)) == len( + total_ann_ids), f"Annotation ids in '{ann_file}' are not unique!" + return data_infos diff --git a/mmdet/datasets/openimages.py b/mmdet/datasets/openimages.py new file mode 100644 index 0000000..1315349 --- /dev/null +++ b/mmdet/datasets/openimages.py @@ -0,0 +1,891 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy +import csv +import json +import os.path as osp +import warnings +from collections import OrderedDict, defaultdict + +import mmcv +import numpy as np +import torch.distributed as dist +from mmcv.runner import get_dist_info +from mmcv.utils import print_log + +from mmdet.core import eval_map +from .builder import DATASETS +from .custom import CustomDataset + + +@DATASETS.register_module() +class OpenImagesDataset(CustomDataset): + """Open Images dataset for detection. + + Args: + ann_file (str): Annotation file path. + label_file (str): File path of the label description file that + maps the classes names in MID format to their short + descriptions. + image_level_ann_file (str): Image level annotation, which is used + in evaluation. + get_supercategory (bool): Whether to get parent class of the + current class. Default: True. + hierarchy_file (str): The file path of the class hierarchy. + Default: None. + get_metas (bool): Whether to get image metas in testing or + validation time. This should be `True` during evaluation. + Default: True. The OpenImages annotations do not have image + metas (width and height of the image), which will be used + during evaluation. We provide two ways to get image metas + in `OpenImagesDataset`: + + - 1. `load from file`: Load image metas from pkl file, which + is suggested to use. We provided a script to get image metas: + `tools/misc/get_image_metas.py`, which need to run + this script before training/testing. Please refer to + `config/openimages/README.md` for more details. + + - 2. `load from pipeline`, which will get image metas during + test time. However, this may reduce the inference speed, + especially when using distribution. + + load_from_file (bool): Whether to get image metas from pkl file. + meta_file (str): File path to get image metas. + filter_labels (bool): Whether filter unannotated classes. + Default: True. + load_image_level_labels (bool): Whether load and consider image + level labels during evaluation. Default: True. + file_client_args (dict): Arguments to instantiate a FileClient. + See :class:`mmcv.fileio.FileClient` for details. + Defaults to ``dict(backend='disk')``. + """ + + def __init__(self, + ann_file, + label_file='', + image_level_ann_file='', + get_supercategory=True, + hierarchy_file=None, + get_metas=True, + load_from_file=True, + meta_file='', + filter_labels=True, + load_image_level_labels=True, + file_client_args=dict(backend='disk'), + **kwargs): + # may get error if use other file_client + self.file_client_args = file_client_args + + self.cat2label = defaultdict(str) + self.index_dict = {} + + # Although it will init file_client in `CustomDataset`, + # it needs to be init here. + file_client = mmcv.FileClient(**file_client_args) + # need get `index_dict` before load annotations + assert label_file.endswith('csv') + if hasattr(file_client, 'get_local_path'): + with file_client.get_local_path(label_file) as local_path: + class_names = self.get_classes_from_csv(local_path) + else: + class_names = self.get_classes_from_csv(label_file) + super(OpenImagesDataset, self).__init__( + ann_file=ann_file, file_client_args=file_client_args, **kwargs) + self.CLASSES = class_names + self.image_level_ann_file = image_level_ann_file + self.load_image_level_labels = load_image_level_labels + if get_supercategory is True: + assert hierarchy_file is not None + if self.__class__.__name__ == 'OpenImagesDataset': + assert hierarchy_file.endswith('json') + elif self.__class__.__name__ == 'OpenImagesChallengeDataset': + assert hierarchy_file.endswith('np') + else: + raise NotImplementedError + if hasattr(self.file_client, 'get_local_path'): + with self.file_client.get_local_path( + hierarchy_file) as local_path: + self.class_label_tree = self.get_relation_matrix( + local_path) + else: + self.class_label_tree = self.get_relation_matrix( + hierarchy_file) + self.get_supercategory = get_supercategory + self.get_metas = get_metas + self.load_from_file = load_from_file + self.meta_file = meta_file + if self.data_root is not None: + if not osp.isabs(self.meta_file): + self.meta_file = osp.join(self.data_root, self.meta_file) + self.filter_labels = filter_labels + self.rank, self.world_size = get_dist_info() + self.temp_img_metas = [] + self.test_img_metas = [] + self.test_img_shapes = [] + self.load_from_pipeline = False if load_from_file else True + + def get_classes_from_csv(self, label_file): + """Get classes name from file. + + Args: + label_file (str): File path of the label description file that + maps the classes names in MID format to their short + descriptions. + + Returns: + list[str]: Class name of OpenImages. + """ + + index_list = [] + classes_names = [] + with open(label_file, 'r') as f: + reader = csv.reader(f) + for line in reader: + self.cat2label[line[0]] = line[1] + classes_names.append(line[1]) + index_list.append(line[0]) + self.index_dict = {index: i for i, index in enumerate(index_list)} + return classes_names + + def load_annotations(self, ann_file): + """Load annotation from annotation file. + + Special described `self.data_infos` (defaultdict[list[dict]]) + in this function: Annotations where item of the defaultdict + indicates an image, each of which has (n) dicts. Keys of dicts are: + + - `bbox` (list): coordinates of the box, in normalized image + coordinates, of shape 4. + - `label` (int): the label id. + - `is_group_of` (bool): Indicates that the box spans a group + of objects (e.g., a bed of flowers or a crowd of people). + - `is_occluded` (bool): Indicates that the object is occluded + by another object in the image. + - `is_truncated` (bool): Indicates that the object extends + beyond the boundary of the image. + - `is_depiction` (bool): Indicates that the object is a + depiction. + - `is_inside` (bool): Indicates a picture taken from the + inside of the object. + + Args: + ann_file (str): CSV style annotation file path. + + Returns: + list[dict]: Data infos where each item of the list + indicates an image. Keys of annotations are: + + - `img_id` (str): Image name. + - `filename` (str): Image name with suffix. + """ + self.ann_infos = defaultdict(list) + data_infos = [] + cp_filename = None + with open(ann_file, 'r') as f: + reader = csv.reader(f) + for i, line in enumerate(reader): + if i == 0: + continue + img_id = line[0] + filename = f'{img_id}.jpg' + label_id = line[2] + assert label_id in self.index_dict + label = int(self.index_dict[label_id]) + bbox = [ + float(line[4]), # xmin + float(line[6]), # ymin + float(line[5]), # xmax + float(line[7]) # ymax + ] + is_occluded = True if int(line[8]) == 1 else False + is_truncated = True if int(line[9]) == 1 else False + is_group_of = True if int(line[10]) == 1 else False + is_depiction = True if int(line[11]) == 1 else False + is_inside = True if int(line[12]) == 1 else False + + self.ann_infos[img_id].append( + dict( + bbox=bbox, + label=label, + is_occluded=is_occluded, + is_truncated=is_truncated, + is_group_of=is_group_of, + is_depiction=is_depiction, + is_inside=is_inside)) + if filename != cp_filename: + data_infos.append(dict(img_id=img_id, filename=filename)) + cp_filename = filename + return data_infos + + def get_ann_info(self, idx): + """Get OpenImages annotation by index. + + Args: + idx (int): Index of data. + + Returns: + dict: Annotation info of specified index. + """ + img_id = self.data_infos[idx]['img_id'] + bboxes = [] + labels = [] + bboxes_ignore = [] + labels_ignore = [] + is_occludeds = [] + is_truncateds = [] + is_group_ofs = [] + is_depictions = [] + is_insides = [] + for obj in self.ann_infos[img_id]: + label = int(obj['label']) + bbox = [ + float(obj['bbox'][0]), + float(obj['bbox'][1]), + float(obj['bbox'][2]), + float(obj['bbox'][3]) + ] + bboxes.append(bbox) + labels.append(label) + + # Other parameters + is_occludeds.append(obj['is_occluded']) + is_truncateds.append(obj['is_truncated']) + is_group_ofs.append(obj['is_group_of']) + is_depictions.append(obj['is_depiction']) + is_insides.append(obj['is_inside']) + if not bboxes: + bboxes = np.zeros((0, 4)) + labels = np.zeros((0, )) + else: + bboxes = np.array(bboxes) + labels = np.array(labels) + if not bboxes_ignore: + bboxes_ignore = np.zeros((0, 4)) + labels_ignore = np.zeros((0, )) + else: + bboxes_ignore = np.array(bboxes_ignore) + labels_ignore = np.array(labels_ignore) + + assert len(is_group_ofs) == len(labels) == len(bboxes) + gt_is_group_ofs = np.array(is_group_ofs, dtype=bool) + + # These parameters is not used yet. + is_occludeds = np.array(is_occludeds, dtype=bool) + is_truncateds = np.array(is_truncateds, dtype=bool) + is_depictions = np.array(is_depictions, dtype=bool) + is_insides = np.array(is_insides, dtype=bool) + + ann = dict( + bboxes=bboxes.astype(np.float32), + labels=labels.astype(np.int64), + bboxes_ignore=bboxes_ignore.astype(np.float32), + labels_ignore=labels_ignore.astype(np.int64), + gt_is_group_ofs=gt_is_group_ofs, + is_occludeds=is_occludeds, + is_truncateds=is_truncateds, + is_depictions=is_depictions, + is_insides=is_insides) + + return ann + + def get_meta_from_file(self, meta_file=''): + """Get image metas from pkl file.""" + metas = mmcv.load( + meta_file, + file_format='pkl', + file_client_args=self.file_client_args) + assert len(metas) == len(self) + for i in range(len(metas)): + file_name = osp.split(metas[i]['filename'])[-1] + img_info = self.data_infos[i].get('img_info', None) + if img_info is not None: + assert file_name == osp.split(img_info['filename'])[-1] + else: + assert file_name == self.data_infos[i]['filename'] + hw = metas[i]['ori_shape'][:2] + self.test_img_shapes.append(hw) + + def get_meta_from_pipeline(self, results): + """Get image metas from pipeline.""" + self.temp_img_metas.extend(results['img_metas']) + if dist.is_available() and self.world_size > 1: + from mmdet.apis.test import collect_results_cpu + + self.test_img_metas = collect_results_cpu(self.temp_img_metas, + len(self)) + else: + self.test_img_metas = self.temp_img_metas + + def get_img_shape(self, metas): + """Set images original shape into data_infos.""" + assert len(metas) == len(self) + for i in range(len(metas)): + file_name = osp.split(metas[i].data['ori_filename'])[-1] + img_info = self.data_infos[i].get('img_info', None) + if img_info is not None: + assert file_name == osp.split(img_info['filename'])[-1] + else: + assert file_name == self.data_infos[i]['filename'] + hw = metas[i].data['ori_shape'][:2] + self.test_img_shapes.append(hw) + + def prepare_test_img(self, idx): + """Get testing data after pipeline.""" + img_info = self.data_infos[idx] + results = dict(img_info=img_info) + if self.proposals is not None: + results['proposals'] = self.proposals[idx] + self.pre_pipeline(results) + results = self.pipeline(results) + if self.get_metas and self.load_from_pipeline: + self.get_meta_from_pipeline(results) + return results + + def _filter_imgs(self, min_size=32): + """Filter images too small.""" + if self.filter_empty_gt: + warnings.warn('OpenImageDatasets does not support ' + 'filtering empty gt images.') + valid_inds = [i for i in range(len(self))] + return valid_inds + + def _set_group_flag(self): + """Set flag according to image aspect ratio.""" + self.flag = np.zeros(len(self), dtype=np.uint8) + # TODO: set flag without width and height + + def get_relation_matrix(self, hierarchy_file): + """Get hierarchy for classes. + + Args: + hierarchy_file (sty): File path to the hierarchy for classes. + + Returns: + ndarray: The matrix of the corresponding relationship between + the parent class and the child class, of shape + (class_num, class_num). + """ + + if self.data_root is not None: + if not osp.isabs(hierarchy_file): + hierarchy_file = osp.join(self.data_root, hierarchy_file) + with open(hierarchy_file, 'r') as f: + hierarchy = json.load(f) + class_num = len(self.CLASSES) + class_label_tree = np.eye(class_num, class_num) + class_label_tree = self._convert_hierarchy_tree( + hierarchy, class_label_tree) + return class_label_tree + + def _convert_hierarchy_tree(self, + hierarchy_map, + class_label_tree, + parents=[], + get_all_parents=True): + """Get matrix of the corresponding relationship between the parent + class and the child class. + + Args: + hierarchy_map (dict): Including label name and corresponding + subcategory. Keys of dicts are: + + - `LabeName` (str): Name of the label. + - `Subcategory` (dict | list): Corresponding subcategory(ies). + class_label_tree (ndarray): The matrix of the corresponding + relationship between the parent class and the child class, + of shape (class_num, class_num). + parents (list): Corresponding parent class. + get_all_parents (bool): Whether get all parent names. + Default: True + + Returns: + ndarray: The matrix of the corresponding relationship between + the parent class and the child class, of shape + (class_num, class_num). + """ + + if 'Subcategory' in hierarchy_map: + for node in hierarchy_map['Subcategory']: + if 'LabelName' in node: + children_name = node['LabelName'] + children_index = self.index_dict[children_name] + children = [children_index] + else: + continue + if len(parents) > 0: + for parent_index in parents: + if get_all_parents: + children.append(parent_index) + class_label_tree[children_index, parent_index] = 1 + + class_label_tree = self._convert_hierarchy_tree( + node, class_label_tree, parents=children) + + return class_label_tree + + def add_supercategory_ann(self, annotations): + """Add parent classes of the corresponding class of the ground truth + bboxes.""" + for i, ann in enumerate(annotations): + assert len(ann['labels']) == len(ann['bboxes']) == \ + len(ann['gt_is_group_ofs']) + gt_bboxes = [] + gt_is_group_ofs = [] + gt_labels = [] + for j in range(len(ann['labels'])): + label = ann['labels'][j] + bbox = ann['bboxes'][j] + is_group = ann['gt_is_group_ofs'][j] + label = np.where(self.class_label_tree[label])[0] + if len(label) > 1: + for k in range(len(label)): + gt_bboxes.append(bbox) + gt_is_group_ofs.append(is_group) + gt_labels.append(label[k]) + else: + gt_bboxes.append(bbox) + gt_is_group_ofs.append(is_group) + gt_labels.append(label[0]) + annotations[i] = dict( + bboxes=np.array(gt_bboxes).astype(np.float32), + labels=np.array(gt_labels).astype(np.int64), + bboxes_ignore=ann['bboxes_ignore'], + gt_is_group_ofs=np.array(gt_is_group_ofs).astype(bool)) + + return annotations + + def process_results(self, det_results, annotations, + image_level_annotations): + """Process results of the corresponding class of the detection bboxes. + + Note: It will choose to do the following two processing according to + the parameters: + + 1. Whether to add parent classes of the corresponding class of the + detection bboxes. + + 2. Whether to ignore the classes that unannotated on that image. + """ + if image_level_annotations is not None: + assert len(annotations) == \ + len(image_level_annotations) == \ + len(det_results) + else: + assert len(annotations) == len(det_results) + for i in range(len(det_results)): + results = copy.deepcopy(det_results[i]) + valid_classes = np.where( + np.array([[bbox.shape[0]] for bbox in det_results[i]]) != 0)[0] + if image_level_annotations is not None: + labels = annotations[i]['labels'] + image_level_labels = \ + image_level_annotations[i]['image_level_labels'] + allowed_labeles = np.unique( + np.append(labels, image_level_labels)) + else: + allowed_labeles = np.unique(annotations[i]['labels']) + + for valid_class in valid_classes: + det_cls = np.where(self.class_label_tree[valid_class])[0] + for index in det_cls: + if index in allowed_labeles and \ + index != valid_class and \ + self.get_supercategory: + det_results[i][index] = \ + np.concatenate((det_results[i][index], + results[valid_class])) + elif index not in allowed_labeles and self.filter_labels: + # Remove useless parts + det_results[i][index] = np.empty( + (0, 5)).astype(np.float32) + return det_results + + def load_image_label_from_csv(self, image_level_ann_file): + """Load image level annotations from csv style ann_file. + + Args: + image_level_ann_file (str): CSV style image level annotation + file path. + + Returns: + defaultdict[list[dict]]: Annotations where item of the defaultdict + indicates an image, each of which has (n) dicts. + Keys of dicts are: + + - `image_level_label` (int): Label id. + - `confidence` (float): Labels that are human-verified to be + present in an image have confidence = 1 (positive labels). + Labels that are human-verified to be absent from an image + have confidence = 0 (negative labels). Machine-generated + labels have fractional confidences, generally >= 0.5. + The higher the confidence, the smaller the chance for + the label to be a false positive. + """ + + item_lists = defaultdict(list) + with open(image_level_ann_file, 'r') as f: + reader = csv.reader(f) + for i, line in enumerate(reader): + if i == 0: + continue + img_id = line[0] + item_lists[img_id].append( + dict( + image_level_label=int(self.index_dict[line[2]]), + confidence=float(line[3]))) + return item_lists + + def get_image_level_ann(self, image_level_ann_file): + """Get OpenImages annotation by index. + + Args: + image_level_ann_file (str): CSV style image level annotation + file path. + + Returns: + dict: Annotation info of specified index. + """ + + if hasattr(self.file_client, 'get_local_path'): + with self.file_client.get_local_path(image_level_ann_file) \ + as local_path: + item_lists = self.load_image_label_from_csv(local_path) + else: + item_lists = self.load_image_label_from_csv(image_level_ann_file) + image_level_annotations = [] + for i in range(len(self)): + img_info = self.data_infos[i].get('img_info', None) + if img_info is not None: + # for Open Images Challenges + img_id = osp.split(img_info['filename'])[-1][:-4] + else: + # for Open Images v6 + img_id = self.data_infos[i]['img_id'] + item_list = item_lists.get(img_id, None) + if item_list is not None: + image_level_labels = [] + confidences = [] + for obj in item_list: + image_level_label = int(obj['image_level_label']) + confidence = float(obj['confidence']) + + image_level_labels.append(image_level_label) + confidences.append(confidence) + + if not image_level_labels: + image_level_labels = np.zeros((0, )) + confidences = np.zeros((0, )) + else: + image_level_labels = np.array(image_level_labels) + confidences = np.array(confidences) + else: + image_level_labels = np.zeros((0, )) + confidences = np.zeros((0, )) + ann = dict( + image_level_labels=image_level_labels.astype(np.int64), + confidences=confidences.astype(np.float32)) + image_level_annotations.append(ann) + + return image_level_annotations + + def denormalize_gt_bboxes(self, annotations): + """Convert ground truth bboxes from relative position to absolute + position. + + Only used in evaluating time. + """ + assert len(self.test_img_shapes) == len(annotations) + for i in range(len(annotations)): + h, w = self.test_img_shapes[i] + annotations[i]['bboxes'][:, 0::2] *= w + annotations[i]['bboxes'][:, 1::2] *= h + return annotations + + def get_cat_ids(self, idx): + """Get category ids by index. + + Args: + idx (int): Index of data. + + Returns: + list[int]: All categories in the image of specified index. + """ + return self.get_ann_info(idx)['labels'].astype(np.int).tolist() + + def evaluate(self, + results, + metric='mAP', + logger=None, + iou_thr=0.5, + ioa_thr=0.5, + scale_ranges=None, + denorm_gt_bbox=True, + use_group_of=True): + """Evaluate in OpenImages. + + Args: + results (list[list | tuple]): Testing results of the dataset. + metric (str | list[str]): Metrics to be evaluated. Option is + 'mAP'. Default: 'mAP'. + logger (logging.Logger | str, optional): Logger used for printing + related information during evaluation. Default: None. + iou_thr (float | list[float]): IoU threshold. Default: 0.5. + ioa_thr (float | list[float]): IoA threshold. Default: 0.5. + scale_ranges (list[tuple], optional): Scale ranges for evaluating + mAP. If not specified, all bounding boxes would be included in + evaluation. Default: None + denorm_gt_bbox (bool): Whether to denorm ground truth bboxes from + relative position to absolute position. Default: True + use_group_of (bool): Whether consider group of groud truth bboxes + during evaluating. Default: True. + + Returns: + dict[str, float]: AP metrics. + """ + + if not isinstance(metric, str): + assert len(metric) == 1 + metric = metric[0] + allowed_metrics = ['mAP'] + if metric not in allowed_metrics: + raise KeyError(f'metric {metric} is not supported') + annotations = [self.get_ann_info(i) for i in range(len(self))] + + if self.load_image_level_labels: + image_level_annotations = \ + self.get_image_level_ann(self.image_level_ann_file) + else: + image_level_annotations = None + + # load metas from file + if self.get_metas and self.load_from_file: + assert self.meta_file.endswith( + 'pkl'), 'File name must be pkl suffix' + self.get_meta_from_file(self.meta_file) + # load metas from pipeline + else: + self.get_img_shape(self.test_img_metas) + + if len(self.test_img_shapes) > len(self): + self.test_img_shapes = self.test_img_shapes[:len(self)] + + if denorm_gt_bbox: + annotations = self.denormalize_gt_bboxes(annotations) + + # Reset test_image_metas, temp_image_metas and test_img_shapes + # to avoid potential error + self.temp_img_metas = [] + self.test_img_shapes = [] + self.test_img_metas = [] + if self.get_supercategory: + annotations = self.add_supercategory_ann(annotations) + + results = self.process_results(results, annotations, + image_level_annotations) + if use_group_of: + assert ioa_thr is not None, \ + 'ioa_thr must have value when using group_of in evaluation.' + + eval_results = OrderedDict() + iou_thrs = [iou_thr] if isinstance(iou_thr, float) else iou_thr + ioa_thrs = [ioa_thr] if isinstance(ioa_thr, float) or ioa_thr is None \ + else ioa_thr + + # get dataset type + if len(self.CLASSES) == 500: + ds_name = 'oid_challenge' + elif len(self.CLASSES) == 601: + ds_name = 'oid_v6' + else: + ds_name = self.CLASSES + warnings.warn('Cannot infer dataset type from the length of the ' + 'classes. Set `oid_v6` as dataset type.') + + if metric == 'mAP': + assert isinstance(iou_thrs, list) and isinstance(ioa_thrs, list) + assert len(ioa_thrs) == len(iou_thrs) + mean_aps = [] + for iou_thr, ioa_thr in zip(iou_thrs, ioa_thrs): + print_log(f'\n{"-" * 15}iou_thr, ioa_thr: {iou_thr}, {ioa_thr}' + f'{"-" * 15}') + mean_ap, _ = eval_map( + results, + annotations, + scale_ranges=scale_ranges, + iou_thr=iou_thr, + ioa_thr=ioa_thr, + dataset=ds_name, + logger=logger, + use_group_of=use_group_of) + mean_aps.append(mean_ap) + eval_results[f'AP{int(iou_thr * 100):02d}'] = round(mean_ap, 3) + eval_results['mAP'] = sum(mean_aps) / len(mean_aps) + return eval_results + + +@DATASETS.register_module() +class OpenImagesChallengeDataset(OpenImagesDataset): + """Open Images Challenge dataset for detection.""" + + def __init__(self, ann_file, **kwargs): + assert ann_file.endswith('txt') + super(OpenImagesChallengeDataset, self).__init__( + ann_file=ann_file, **kwargs) + + def get_classes_from_csv(self, label_file): + """Get classes name from file. + + Args: + label_file (str): File path of the label description file that + maps the classes names in MID format to their short + descriptions. + + Returns: + list: Class name of OpenImages. + """ + + label_list = [] + id_list = [] + with open(label_file, 'r') as f: + reader = csv.reader(f) + for line in reader: + label_name = line[0] + label_id = int(line[2]) + + label_list.append(line[1]) + id_list.append(label_id) + self.index_dict[label_name] = label_id - 1 + + indexes = np.argsort(id_list) + classes_names = [] + for index in indexes: + classes_names.append(label_list[index]) + return classes_names + + def load_annotations(self, ann_file): + """Load annotation from annotation file.""" + with open(ann_file) as f: + lines = f.readlines() + i = 0 + ann_infos = [] + while i < len(lines): + bboxes = [] + labels = [] + is_group_ofs = [] + filename = lines[i].rstrip() + i += 2 + img_gt_size = int(lines[i]) + i += 1 + for j in range(img_gt_size): + sp = lines[i + j].split() + bboxes.append( + [float(sp[1]), + float(sp[2]), + float(sp[3]), + float(sp[4])]) + labels.append(int(sp[0]) - 1) # labels begin from 1 + is_group_ofs.append(True if int(sp[5]) == 1 else False) + i += img_gt_size + + gt_bboxes = np.array(bboxes, dtype=np.float32) + gt_labels = np.array(labels, dtype=np.int64) + gt_bboxes_ignore = np.zeros((0, 4), dtype=np.float32) + gt_is_group_ofs = np.array(is_group_ofs, dtype=bool) + + img_info = dict(filename=filename) + ann_info = dict( + bboxes=gt_bboxes, + labels=gt_labels, + bboxes_ignore=gt_bboxes_ignore, + gt_is_group_ofs=gt_is_group_ofs) + ann_infos.append(dict(img_info=img_info, ann_info=ann_info)) + + return ann_infos + + def prepare_train_img(self, idx): + """Get training data and annotations after pipeline.""" + ann_info = self.data_infos[idx] + results = dict( + img_info=ann_info['img_info'], + ann_info=ann_info['ann_info'], + ) + if self.proposals is not None: + results['proposals'] = self.proposals[idx] + self.pre_pipeline(results) + return self.pipeline(results) + + def prepare_test_img(self, idx): + """Get testing data after pipeline.""" + ann_info = self.data_infos[idx] + results = dict(img_info=ann_info['img_info']) + if self.proposals is not None: + results['proposals'] = self.proposals[idx] + self.pre_pipeline(results) + + results = self.pipeline(results) + if self.get_metas and self.load_from_pipeline: + self.get_meta_from_pipeline(results) + return results + + def get_relation_matrix(self, hierarchy_file): + """Get hierarchy for classes. + + Args: + hierarchy_file (str): File path to the hierarchy for classes. + + Returns: + ndarray: The matrix of the corresponding + relationship between the parent class and the child class, + of shape (class_num, class_num). + """ + class_label_tree = np.load(hierarchy_file, allow_pickle=True) + return class_label_tree[1:, 1:] + + def get_ann_info(self, idx): + """Get OpenImages annotation by index. + + Args: + idx (int): Index of data. + + Returns: + dict: Annotation info of specified index. + """ + # avoid some potential error + data_infos = copy.deepcopy(self.data_infos[idx]['ann_info']) + return data_infos + + def load_image_label_from_csv(self, image_level_ann_file): + """Load image level annotations from csv style ann_file. + + Args: + image_level_ann_file (str): CSV style image level annotation + file path. + + Returns: + defaultdict[list[dict]]: Annotations where item of the defaultdict + indicates an image, each of which has (n) dicts. + Keys of dicts are: + + - `image_level_label` (int): of shape 1. + - `confidence` (float): of shape 1. + """ + + item_lists = defaultdict(list) + with open(image_level_ann_file, 'r') as f: + reader = csv.reader(f) + i = -1 + for line in reader: + i += 1 + if i == 0: + continue + else: + img_id = line[0] + label_id = line[1] + assert label_id in self.index_dict + image_level_label = int(self.index_dict[label_id]) + confidence = float(line[2]) + item_lists[img_id].append( + dict( + image_level_label=image_level_label, + confidence=confidence)) + return item_lists diff --git a/mmdet/datasets/pipelines/__init__.py b/mmdet/datasets/pipelines/__init__.py new file mode 100644 index 0000000..8260da6 --- /dev/null +++ b/mmdet/datasets/pipelines/__init__.py @@ -0,0 +1,31 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .auto_augment import (AutoAugment, BrightnessTransform, ColorTransform, + ContrastTransform, EqualizeTransform, Rotate, Shear, + Translate) +from .compose import Compose +from .formatting import (Collect, DefaultFormatBundle, ImageToTensor, + ToDataContainer, ToTensor, Transpose, to_tensor) +from .instaboost import InstaBoost +from .loading import (FilterAnnotations, LoadAnnotations, LoadImageFromFile, + LoadImageFromWebcam, LoadMultiChannelImageFromFiles, + LoadPanopticAnnotations, LoadProposals) +from .test_time_aug import MultiScaleFlipAug +from .transforms import (Albu, CopyPaste, CutOut, Expand, MinIoURandomCrop, + MixUp, Mosaic, Normalize, Pad, PhotoMetricDistortion, + RandomAffine, RandomCenterCropPad, RandomCrop, + RandomFlip, RandomShift, Resize, SegRescale, + YOLOXHSVRandomAug) + +__all__ = [ + 'Compose', 'to_tensor', 'ToTensor', 'ImageToTensor', 'ToDataContainer', + 'Transpose', 'Collect', 'DefaultFormatBundle', 'LoadAnnotations', + 'LoadImageFromFile', 'LoadImageFromWebcam', 'LoadPanopticAnnotations', + 'LoadMultiChannelImageFromFiles', 'LoadProposals', 'FilterAnnotations', + 'MultiScaleFlipAug', 'Resize', 'RandomFlip', 'Pad', 'RandomCrop', + 'Normalize', 'SegRescale', 'MinIoURandomCrop', 'Expand', + 'PhotoMetricDistortion', 'Albu', 'InstaBoost', 'RandomCenterCropPad', + 'AutoAugment', 'CutOut', 'Shear', 'Rotate', 'ColorTransform', + 'EqualizeTransform', 'BrightnessTransform', 'ContrastTransform', + 'Translate', 'RandomShift', 'Mosaic', 'MixUp', 'RandomAffine', + 'YOLOXHSVRandomAug', 'CopyPaste' +] diff --git a/mmdet/datasets/pipelines/auto_augment.py b/mmdet/datasets/pipelines/auto_augment.py new file mode 100644 index 0000000..b0ff67d --- /dev/null +++ b/mmdet/datasets/pipelines/auto_augment.py @@ -0,0 +1,894 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy + +import cv2 +import mmcv +import numpy as np + +from ..builder import PIPELINES +from .compose import Compose + +_MAX_LEVEL = 10 + + +def level_to_value(level, max_value): + """Map from level to values based on max_value.""" + return (level / _MAX_LEVEL) * max_value + + +def enhance_level_to_value(level, a=1.8, b=0.1): + """Map from level to values.""" + return (level / _MAX_LEVEL) * a + b + + +def random_negative(value, random_negative_prob): + """Randomly negate value based on random_negative_prob.""" + return -value if np.random.rand() < random_negative_prob else value + + +def bbox2fields(): + """The key correspondence from bboxes to labels, masks and + segmentations.""" + bbox2label = { + 'gt_bboxes': 'gt_labels', + 'gt_bboxes_ignore': 'gt_labels_ignore' + } + bbox2mask = { + 'gt_bboxes': 'gt_masks', + 'gt_bboxes_ignore': 'gt_masks_ignore' + } + bbox2seg = { + 'gt_bboxes': 'gt_semantic_seg', + } + return bbox2label, bbox2mask, bbox2seg + + +@PIPELINES.register_module() +class AutoAugment: + """Auto augmentation. + + This data augmentation is proposed in `Learning Data Augmentation + Strategies for Object Detection `_. + + TODO: Implement 'Shear', 'Sharpness' and 'Rotate' transforms + + Args: + policies (list[list[dict]]): The policies of auto augmentation. Each + policy in ``policies`` is a specific augmentation policy, and is + composed by several augmentations (dict). When AutoAugment is + called, a random policy in ``policies`` will be selected to + augment images. + + Examples: + >>> replace = (104, 116, 124) + >>> policies = [ + >>> [ + >>> dict(type='Sharpness', prob=0.0, level=8), + >>> dict( + >>> type='Shear', + >>> prob=0.4, + >>> level=0, + >>> replace=replace, + >>> axis='x') + >>> ], + >>> [ + >>> dict( + >>> type='Rotate', + >>> prob=0.6, + >>> level=10, + >>> replace=replace), + >>> dict(type='Color', prob=1.0, level=6) + >>> ] + >>> ] + >>> augmentation = AutoAugment(policies) + >>> img = np.ones(100, 100, 3) + >>> gt_bboxes = np.ones(10, 4) + >>> results = dict(img=img, gt_bboxes=gt_bboxes) + >>> results = augmentation(results) + """ + + def __init__(self, policies): + assert isinstance(policies, list) and len(policies) > 0, \ + 'Policies must be a non-empty list.' + for policy in policies: + assert isinstance(policy, list) and len(policy) > 0, \ + 'Each policy in policies must be a non-empty list.' + for augment in policy: + assert isinstance(augment, dict) and 'type' in augment, \ + 'Each specific augmentation must be a dict with key' \ + ' "type".' + + self.policies = copy.deepcopy(policies) + self.transforms = [Compose(policy) for policy in self.policies] + + def __call__(self, results): + transform = np.random.choice(self.transforms) + return transform(results) + + def __repr__(self): + return f'{self.__class__.__name__}(policies={self.policies})' + + +@PIPELINES.register_module() +class Shear: + """Apply Shear Transformation to image (and its corresponding bbox, mask, + segmentation). + + Args: + level (int | float): The level should be in range [0,_MAX_LEVEL]. + img_fill_val (int | float | tuple): The filled values for image border. + If float, the same fill value will be used for all the three + channels of image. If tuple, the should be 3 elements. + seg_ignore_label (int): The fill value used for segmentation map. + Note this value must equals ``ignore_label`` in ``semantic_head`` + of the corresponding config. Default 255. + prob (float): The probability for performing Shear and should be in + range [0, 1]. + direction (str): The direction for shear, either "horizontal" + or "vertical". + max_shear_magnitude (float): The maximum magnitude for Shear + transformation. + random_negative_prob (float): The probability that turns the + offset negative. Should be in range [0,1] + interpolation (str): Same as in :func:`mmcv.imshear`. + """ + + def __init__(self, + level, + img_fill_val=128, + seg_ignore_label=255, + prob=0.5, + direction='horizontal', + max_shear_magnitude=0.3, + random_negative_prob=0.5, + interpolation='bilinear'): + assert isinstance(level, (int, float)), 'The level must be type ' \ + f'int or float, got {type(level)}.' + assert 0 <= level <= _MAX_LEVEL, 'The level should be in range ' \ + f'[0,{_MAX_LEVEL}], got {level}.' + if isinstance(img_fill_val, (float, int)): + img_fill_val = tuple([float(img_fill_val)] * 3) + elif isinstance(img_fill_val, tuple): + assert len(img_fill_val) == 3, 'img_fill_val as tuple must ' \ + f'have 3 elements. got {len(img_fill_val)}.' + img_fill_val = tuple([float(val) for val in img_fill_val]) + else: + raise ValueError( + 'img_fill_val must be float or tuple with 3 elements.') + assert np.all([0 <= val <= 255 for val in img_fill_val]), 'all ' \ + 'elements of img_fill_val should between range [0,255].' \ + f'got {img_fill_val}.' + assert 0 <= prob <= 1.0, 'The probability of shear should be in ' \ + f'range [0,1]. got {prob}.' + assert direction in ('horizontal', 'vertical'), 'direction must ' \ + f'in be either "horizontal" or "vertical". got {direction}.' + assert isinstance(max_shear_magnitude, float), 'max_shear_magnitude ' \ + f'should be type float. got {type(max_shear_magnitude)}.' + assert 0. <= max_shear_magnitude <= 1., 'Defaultly ' \ + 'max_shear_magnitude should be in range [0,1]. ' \ + f'got {max_shear_magnitude}.' + self.level = level + self.magnitude = level_to_value(level, max_shear_magnitude) + self.img_fill_val = img_fill_val + self.seg_ignore_label = seg_ignore_label + self.prob = prob + self.direction = direction + self.max_shear_magnitude = max_shear_magnitude + self.random_negative_prob = random_negative_prob + self.interpolation = interpolation + + def _shear_img(self, + results, + magnitude, + direction='horizontal', + interpolation='bilinear'): + """Shear the image. + + Args: + results (dict): Result dict from loading pipeline. + magnitude (int | float): The magnitude used for shear. + direction (str): The direction for shear, either "horizontal" + or "vertical". + interpolation (str): Same as in :func:`mmcv.imshear`. + """ + for key in results.get('img_fields', ['img']): + img = results[key] + img_sheared = mmcv.imshear( + img, + magnitude, + direction, + border_value=self.img_fill_val, + interpolation=interpolation) + results[key] = img_sheared.astype(img.dtype) + results['img_shape'] = results[key].shape + + def _shear_bboxes(self, results, magnitude): + """Shear the bboxes.""" + h, w, c = results['img_shape'] + if self.direction == 'horizontal': + shear_matrix = np.stack([[1, magnitude], + [0, 1]]).astype(np.float32) # [2, 2] + else: + shear_matrix = np.stack([[1, 0], [magnitude, + 1]]).astype(np.float32) + for key in results.get('bbox_fields', []): + min_x, min_y, max_x, max_y = np.split( + results[key], results[key].shape[-1], axis=-1) + coordinates = np.stack([[min_x, min_y], [max_x, min_y], + [min_x, max_y], + [max_x, max_y]]) # [4, 2, nb_box, 1] + coordinates = coordinates[..., 0].transpose( + (2, 1, 0)).astype(np.float32) # [nb_box, 2, 4] + new_coords = np.matmul(shear_matrix[None, :, :], + coordinates) # [nb_box, 2, 4] + min_x = np.min(new_coords[:, 0, :], axis=-1) + min_y = np.min(new_coords[:, 1, :], axis=-1) + max_x = np.max(new_coords[:, 0, :], axis=-1) + max_y = np.max(new_coords[:, 1, :], axis=-1) + min_x = np.clip(min_x, a_min=0, a_max=w) + min_y = np.clip(min_y, a_min=0, a_max=h) + max_x = np.clip(max_x, a_min=min_x, a_max=w) + max_y = np.clip(max_y, a_min=min_y, a_max=h) + results[key] = np.stack([min_x, min_y, max_x, max_y], + axis=-1).astype(results[key].dtype) + + def _shear_masks(self, + results, + magnitude, + direction='horizontal', + fill_val=0, + interpolation='bilinear'): + """Shear the masks.""" + h, w, c = results['img_shape'] + for key in results.get('mask_fields', []): + masks = results[key] + results[key] = masks.shear((h, w), + magnitude, + direction, + border_value=fill_val, + interpolation=interpolation) + + def _shear_seg(self, + results, + magnitude, + direction='horizontal', + fill_val=255, + interpolation='bilinear'): + """Shear the segmentation maps.""" + for key in results.get('seg_fields', []): + seg = results[key] + results[key] = mmcv.imshear( + seg, + magnitude, + direction, + border_value=fill_val, + interpolation=interpolation).astype(seg.dtype) + + def _filter_invalid(self, results, min_bbox_size=0): + """Filter bboxes and corresponding masks too small after shear + augmentation.""" + bbox2label, bbox2mask, _ = bbox2fields() + for key in results.get('bbox_fields', []): + bbox_w = results[key][:, 2] - results[key][:, 0] + bbox_h = results[key][:, 3] - results[key][:, 1] + valid_inds = (bbox_w > min_bbox_size) & (bbox_h > min_bbox_size) + valid_inds = np.nonzero(valid_inds)[0] + results[key] = results[key][valid_inds] + # label fields. e.g. gt_labels and gt_labels_ignore + label_key = bbox2label.get(key) + if label_key in results: + results[label_key] = results[label_key][valid_inds] + # mask fields, e.g. gt_masks and gt_masks_ignore + mask_key = bbox2mask.get(key) + if mask_key in results: + results[mask_key] = results[mask_key][valid_inds] + + def __call__(self, results): + """Call function to shear images, bounding boxes, masks and semantic + segmentation maps. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Sheared results. + """ + if np.random.rand() > self.prob: + return results + magnitude = random_negative(self.magnitude, self.random_negative_prob) + self._shear_img(results, magnitude, self.direction, self.interpolation) + self._shear_bboxes(results, magnitude) + # fill_val set to 0 for background of mask. + self._shear_masks( + results, + magnitude, + self.direction, + fill_val=0, + interpolation=self.interpolation) + self._shear_seg( + results, + magnitude, + self.direction, + fill_val=self.seg_ignore_label, + interpolation=self.interpolation) + self._filter_invalid(results) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(level={self.level}, ' + repr_str += f'img_fill_val={self.img_fill_val}, ' + repr_str += f'seg_ignore_label={self.seg_ignore_label}, ' + repr_str += f'prob={self.prob}, ' + repr_str += f'direction={self.direction}, ' + repr_str += f'max_shear_magnitude={self.max_shear_magnitude}, ' + repr_str += f'random_negative_prob={self.random_negative_prob}, ' + repr_str += f'interpolation={self.interpolation})' + return repr_str + + +@PIPELINES.register_module() +class Rotate: + """Apply Rotate Transformation to image (and its corresponding bbox, mask, + segmentation). + + Args: + level (int | float): The level should be in range (0,_MAX_LEVEL]. + scale (int | float): Isotropic scale factor. Same in + ``mmcv.imrotate``. + center (int | float | tuple[float]): Center point (w, h) of the + rotation in the source image. If None, the center of the + image will be used. Same in ``mmcv.imrotate``. + img_fill_val (int | float | tuple): The fill value for image border. + If float, the same value will be used for all the three + channels of image. If tuple, the should be 3 elements (e.g. + equals the number of channels for image). + seg_ignore_label (int): The fill value used for segmentation map. + Note this value must equals ``ignore_label`` in ``semantic_head`` + of the corresponding config. Default 255. + prob (float): The probability for perform transformation and + should be in range 0 to 1. + max_rotate_angle (int | float): The maximum angles for rotate + transformation. + random_negative_prob (float): The probability that turns the + offset negative. + """ + + def __init__(self, + level, + scale=1, + center=None, + img_fill_val=128, + seg_ignore_label=255, + prob=0.5, + max_rotate_angle=30, + random_negative_prob=0.5): + assert isinstance(level, (int, float)), \ + f'The level must be type int or float. got {type(level)}.' + assert 0 <= level <= _MAX_LEVEL, \ + f'The level should be in range (0,{_MAX_LEVEL}]. got {level}.' + assert isinstance(scale, (int, float)), \ + f'The scale must be type int or float. got type {type(scale)}.' + if isinstance(center, (int, float)): + center = (center, center) + elif isinstance(center, tuple): + assert len(center) == 2, 'center with type tuple must have '\ + f'2 elements. got {len(center)} elements.' + else: + assert center is None, 'center must be None or type int, '\ + f'float or tuple, got type {type(center)}.' + if isinstance(img_fill_val, (float, int)): + img_fill_val = tuple([float(img_fill_val)] * 3) + elif isinstance(img_fill_val, tuple): + assert len(img_fill_val) == 3, 'img_fill_val as tuple must '\ + f'have 3 elements. got {len(img_fill_val)}.' + img_fill_val = tuple([float(val) for val in img_fill_val]) + else: + raise ValueError( + 'img_fill_val must be float or tuple with 3 elements.') + assert np.all([0 <= val <= 255 for val in img_fill_val]), \ + 'all elements of img_fill_val should between range [0,255]. '\ + f'got {img_fill_val}.' + assert 0 <= prob <= 1.0, 'The probability should be in range [0,1]. '\ + f'got {prob}.' + assert isinstance(max_rotate_angle, (int, float)), 'max_rotate_angle '\ + f'should be type int or float. got type {type(max_rotate_angle)}.' + self.level = level + self.scale = scale + # Rotation angle in degrees. Positive values mean + # clockwise rotation. + self.angle = level_to_value(level, max_rotate_angle) + self.center = center + self.img_fill_val = img_fill_val + self.seg_ignore_label = seg_ignore_label + self.prob = prob + self.max_rotate_angle = max_rotate_angle + self.random_negative_prob = random_negative_prob + + def _rotate_img(self, results, angle, center=None, scale=1.0): + """Rotate the image. + + Args: + results (dict): Result dict from loading pipeline. + angle (float): Rotation angle in degrees, positive values + mean clockwise rotation. Same in ``mmcv.imrotate``. + center (tuple[float], optional): Center point (w, h) of the + rotation. Same in ``mmcv.imrotate``. + scale (int | float): Isotropic scale factor. Same in + ``mmcv.imrotate``. + """ + for key in results.get('img_fields', ['img']): + img = results[key].copy() + img_rotated = mmcv.imrotate( + img, angle, center, scale, border_value=self.img_fill_val) + results[key] = img_rotated.astype(img.dtype) + results['img_shape'] = results[key].shape + + def _rotate_bboxes(self, results, rotate_matrix): + """Rotate the bboxes.""" + h, w, c = results['img_shape'] + for key in results.get('bbox_fields', []): + min_x, min_y, max_x, max_y = np.split( + results[key], results[key].shape[-1], axis=-1) + coordinates = np.stack([[min_x, min_y], [max_x, min_y], + [min_x, max_y], + [max_x, max_y]]) # [4, 2, nb_bbox, 1] + # pad 1 to convert from format [x, y] to homogeneous + # coordinates format [x, y, 1] + coordinates = np.concatenate( + (coordinates, + np.ones((4, 1, coordinates.shape[2], 1), coordinates.dtype)), + axis=1) # [4, 3, nb_bbox, 1] + coordinates = coordinates.transpose( + (2, 0, 1, 3)) # [nb_bbox, 4, 3, 1] + rotated_coords = np.matmul(rotate_matrix, + coordinates) # [nb_bbox, 4, 2, 1] + rotated_coords = rotated_coords[..., 0] # [nb_bbox, 4, 2] + min_x, min_y = np.min( + rotated_coords[:, :, 0], axis=1), np.min( + rotated_coords[:, :, 1], axis=1) + max_x, max_y = np.max( + rotated_coords[:, :, 0], axis=1), np.max( + rotated_coords[:, :, 1], axis=1) + min_x, min_y = np.clip( + min_x, a_min=0, a_max=w), np.clip( + min_y, a_min=0, a_max=h) + max_x, max_y = np.clip( + max_x, a_min=min_x, a_max=w), np.clip( + max_y, a_min=min_y, a_max=h) + results[key] = np.stack([min_x, min_y, max_x, max_y], + axis=-1).astype(results[key].dtype) + + def _rotate_masks(self, + results, + angle, + center=None, + scale=1.0, + fill_val=0): + """Rotate the masks.""" + h, w, c = results['img_shape'] + for key in results.get('mask_fields', []): + masks = results[key] + results[key] = masks.rotate((h, w), angle, center, scale, fill_val) + + def _rotate_seg(self, + results, + angle, + center=None, + scale=1.0, + fill_val=255): + """Rotate the segmentation map.""" + for key in results.get('seg_fields', []): + seg = results[key].copy() + results[key] = mmcv.imrotate( + seg, angle, center, scale, + border_value=fill_val).astype(seg.dtype) + + def _filter_invalid(self, results, min_bbox_size=0): + """Filter bboxes and corresponding masks too small after rotate + augmentation.""" + bbox2label, bbox2mask, _ = bbox2fields() + for key in results.get('bbox_fields', []): + bbox_w = results[key][:, 2] - results[key][:, 0] + bbox_h = results[key][:, 3] - results[key][:, 1] + valid_inds = (bbox_w > min_bbox_size) & (bbox_h > min_bbox_size) + valid_inds = np.nonzero(valid_inds)[0] + results[key] = results[key][valid_inds] + # label fields. e.g. gt_labels and gt_labels_ignore + label_key = bbox2label.get(key) + if label_key in results: + results[label_key] = results[label_key][valid_inds] + # mask fields, e.g. gt_masks and gt_masks_ignore + mask_key = bbox2mask.get(key) + if mask_key in results: + results[mask_key] = results[mask_key][valid_inds] + + def __call__(self, results): + """Call function to rotate images, bounding boxes, masks and semantic + segmentation maps. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Rotated results. + """ + if np.random.rand() > self.prob: + return results + h, w = results['img'].shape[:2] + center = self.center + if center is None: + center = ((w - 1) * 0.5, (h - 1) * 0.5) + angle = random_negative(self.angle, self.random_negative_prob) + self._rotate_img(results, angle, center, self.scale) + rotate_matrix = cv2.getRotationMatrix2D(center, -angle, self.scale) + self._rotate_bboxes(results, rotate_matrix) + self._rotate_masks(results, angle, center, self.scale, fill_val=0) + self._rotate_seg( + results, angle, center, self.scale, fill_val=self.seg_ignore_label) + self._filter_invalid(results) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(level={self.level}, ' + repr_str += f'scale={self.scale}, ' + repr_str += f'center={self.center}, ' + repr_str += f'img_fill_val={self.img_fill_val}, ' + repr_str += f'seg_ignore_label={self.seg_ignore_label}, ' + repr_str += f'prob={self.prob}, ' + repr_str += f'max_rotate_angle={self.max_rotate_angle}, ' + repr_str += f'random_negative_prob={self.random_negative_prob})' + return repr_str + + +@PIPELINES.register_module() +class Translate: + """Translate the images, bboxes, masks and segmentation maps horizontally + or vertically. + + Args: + level (int | float): The level for Translate and should be in + range [0,_MAX_LEVEL]. + prob (float): The probability for performing translation and + should be in range [0, 1]. + img_fill_val (int | float | tuple): The filled value for image + border. If float, the same fill value will be used for all + the three channels of image. If tuple, the should be 3 + elements (e.g. equals the number of channels for image). + seg_ignore_label (int): The fill value used for segmentation map. + Note this value must equals ``ignore_label`` in ``semantic_head`` + of the corresponding config. Default 255. + direction (str): The translate direction, either "horizontal" + or "vertical". + max_translate_offset (int | float): The maximum pixel's offset for + Translate. + random_negative_prob (float): The probability that turns the + offset negative. + min_size (int | float): The minimum pixel for filtering + invalid bboxes after the translation. + """ + + def __init__(self, + level, + prob=0.5, + img_fill_val=128, + seg_ignore_label=255, + direction='horizontal', + max_translate_offset=250., + random_negative_prob=0.5, + min_size=0): + assert isinstance(level, (int, float)), \ + 'The level must be type int or float.' + assert 0 <= level <= _MAX_LEVEL, \ + 'The level used for calculating Translate\'s offset should be ' \ + 'in range [0,_MAX_LEVEL]' + assert 0 <= prob <= 1.0, \ + 'The probability of translation should be in range [0, 1].' + if isinstance(img_fill_val, (float, int)): + img_fill_val = tuple([float(img_fill_val)] * 3) + elif isinstance(img_fill_val, tuple): + assert len(img_fill_val) == 3, \ + 'img_fill_val as tuple must have 3 elements.' + img_fill_val = tuple([float(val) for val in img_fill_val]) + else: + raise ValueError('img_fill_val must be type float or tuple.') + assert np.all([0 <= val <= 255 for val in img_fill_val]), \ + 'all elements of img_fill_val should between range [0,255].' + assert direction in ('horizontal', 'vertical'), \ + 'direction should be "horizontal" or "vertical".' + assert isinstance(max_translate_offset, (int, float)), \ + 'The max_translate_offset must be type int or float.' + # the offset used for translation + self.offset = int(level_to_value(level, max_translate_offset)) + self.level = level + self.prob = prob + self.img_fill_val = img_fill_val + self.seg_ignore_label = seg_ignore_label + self.direction = direction + self.max_translate_offset = max_translate_offset + self.random_negative_prob = random_negative_prob + self.min_size = min_size + + def _translate_img(self, results, offset, direction='horizontal'): + """Translate the image. + + Args: + results (dict): Result dict from loading pipeline. + offset (int | float): The offset for translate. + direction (str): The translate direction, either "horizontal" + or "vertical". + """ + for key in results.get('img_fields', ['img']): + img = results[key].copy() + results[key] = mmcv.imtranslate( + img, offset, direction, self.img_fill_val).astype(img.dtype) + results['img_shape'] = results[key].shape + + def _translate_bboxes(self, results, offset): + """Shift bboxes horizontally or vertically, according to offset.""" + h, w, c = results['img_shape'] + for key in results.get('bbox_fields', []): + min_x, min_y, max_x, max_y = np.split( + results[key], results[key].shape[-1], axis=-1) + if self.direction == 'horizontal': + min_x = np.maximum(0, min_x + offset) + max_x = np.minimum(w, max_x + offset) + elif self.direction == 'vertical': + min_y = np.maximum(0, min_y + offset) + max_y = np.minimum(h, max_y + offset) + + # the boxes translated outside of image will be filtered along with + # the corresponding masks, by invoking ``_filter_invalid``. + results[key] = np.concatenate([min_x, min_y, max_x, max_y], + axis=-1) + + def _translate_masks(self, + results, + offset, + direction='horizontal', + fill_val=0): + """Translate masks horizontally or vertically.""" + h, w, c = results['img_shape'] + for key in results.get('mask_fields', []): + masks = results[key] + results[key] = masks.translate((h, w), offset, direction, fill_val) + + def _translate_seg(self, + results, + offset, + direction='horizontal', + fill_val=255): + """Translate segmentation maps horizontally or vertically.""" + for key in results.get('seg_fields', []): + seg = results[key].copy() + results[key] = mmcv.imtranslate(seg, offset, direction, + fill_val).astype(seg.dtype) + + def _filter_invalid(self, results, min_size=0): + """Filter bboxes and masks too small or translated out of image.""" + bbox2label, bbox2mask, _ = bbox2fields() + for key in results.get('bbox_fields', []): + bbox_w = results[key][:, 2] - results[key][:, 0] + bbox_h = results[key][:, 3] - results[key][:, 1] + valid_inds = (bbox_w > min_size) & (bbox_h > min_size) + valid_inds = np.nonzero(valid_inds)[0] + results[key] = results[key][valid_inds] + # label fields. e.g. gt_labels and gt_labels_ignore + label_key = bbox2label.get(key) + if label_key in results: + results[label_key] = results[label_key][valid_inds] + # mask fields, e.g. gt_masks and gt_masks_ignore + mask_key = bbox2mask.get(key) + if mask_key in results: + results[mask_key] = results[mask_key][valid_inds] + return results + + def __call__(self, results): + """Call function to translate images, bounding boxes, masks and + semantic segmentation maps. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Translated results. + """ + if np.random.rand() > self.prob: + return results + offset = random_negative(self.offset, self.random_negative_prob) + self._translate_img(results, offset, self.direction) + self._translate_bboxes(results, offset) + # fill_val defaultly 0 for BitmapMasks and None for PolygonMasks. + self._translate_masks(results, offset, self.direction) + # fill_val set to ``seg_ignore_label`` for the ignored value + # of segmentation map. + self._translate_seg( + results, offset, self.direction, fill_val=self.seg_ignore_label) + self._filter_invalid(results, min_size=self.min_size) + return results + + +@PIPELINES.register_module() +class ColorTransform: + """Apply Color transformation to image. The bboxes, masks, and + segmentations are not modified. + + Args: + level (int | float): Should be in range [0,_MAX_LEVEL]. + prob (float): The probability for performing Color transformation. + """ + + def __init__(self, level, prob=0.5): + assert isinstance(level, (int, float)), \ + 'The level must be type int or float.' + assert 0 <= level <= _MAX_LEVEL, \ + 'The level should be in range [0,_MAX_LEVEL].' + assert 0 <= prob <= 1.0, \ + 'The probability should be in range [0,1].' + self.level = level + self.prob = prob + self.factor = enhance_level_to_value(level) + + def _adjust_color_img(self, results, factor=1.0): + """Apply Color transformation to image.""" + for key in results.get('img_fields', ['img']): + # NOTE defaultly the image should be BGR format + img = results[key] + results[key] = mmcv.adjust_color(img, factor).astype(img.dtype) + + def __call__(self, results): + """Call function for Color transformation. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Colored results. + """ + if np.random.rand() > self.prob: + return results + self._adjust_color_img(results, self.factor) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(level={self.level}, ' + repr_str += f'prob={self.prob})' + return repr_str + + +@PIPELINES.register_module() +class EqualizeTransform: + """Apply Equalize transformation to image. The bboxes, masks and + segmentations are not modified. + + Args: + prob (float): The probability for performing Equalize transformation. + """ + + def __init__(self, prob=0.5): + assert 0 <= prob <= 1.0, \ + 'The probability should be in range [0,1].' + self.prob = prob + + def _imequalize(self, results): + """Equalizes the histogram of one image.""" + for key in results.get('img_fields', ['img']): + img = results[key] + results[key] = mmcv.imequalize(img).astype(img.dtype) + + def __call__(self, results): + """Call function for Equalize transformation. + + Args: + results (dict): Results dict from loading pipeline. + + Returns: + dict: Results after the transformation. + """ + if np.random.rand() > self.prob: + return results + self._imequalize(results) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(prob={self.prob})' + + +@PIPELINES.register_module() +class BrightnessTransform: + """Apply Brightness transformation to image. The bboxes, masks and + segmentations are not modified. + + Args: + level (int | float): Should be in range [0,_MAX_LEVEL]. + prob (float): The probability for performing Brightness transformation. + """ + + def __init__(self, level, prob=0.5): + assert isinstance(level, (int, float)), \ + 'The level must be type int or float.' + assert 0 <= level <= _MAX_LEVEL, \ + 'The level should be in range [0,_MAX_LEVEL].' + assert 0 <= prob <= 1.0, \ + 'The probability should be in range [0,1].' + self.level = level + self.prob = prob + self.factor = enhance_level_to_value(level) + + def _adjust_brightness_img(self, results, factor=1.0): + """Adjust the brightness of image.""" + for key in results.get('img_fields', ['img']): + img = results[key] + results[key] = mmcv.adjust_brightness(img, + factor).astype(img.dtype) + + def __call__(self, results): + """Call function for Brightness transformation. + + Args: + results (dict): Results dict from loading pipeline. + + Returns: + dict: Results after the transformation. + """ + if np.random.rand() > self.prob: + return results + self._adjust_brightness_img(results, self.factor) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(level={self.level}, ' + repr_str += f'prob={self.prob})' + return repr_str + + +@PIPELINES.register_module() +class ContrastTransform: + """Apply Contrast transformation to image. The bboxes, masks and + segmentations are not modified. + + Args: + level (int | float): Should be in range [0,_MAX_LEVEL]. + prob (float): The probability for performing Contrast transformation. + """ + + def __init__(self, level, prob=0.5): + assert isinstance(level, (int, float)), \ + 'The level must be type int or float.' + assert 0 <= level <= _MAX_LEVEL, \ + 'The level should be in range [0,_MAX_LEVEL].' + assert 0 <= prob <= 1.0, \ + 'The probability should be in range [0,1].' + self.level = level + self.prob = prob + self.factor = enhance_level_to_value(level) + + def _adjust_contrast_img(self, results, factor=1.0): + """Adjust the image contrast.""" + for key in results.get('img_fields', ['img']): + img = results[key] + results[key] = mmcv.adjust_contrast(img, factor).astype(img.dtype) + + def __call__(self, results): + """Call function for Contrast transformation. + + Args: + results (dict): Results dict from loading pipeline. + + Returns: + dict: Results after the transformation. + """ + if np.random.rand() > self.prob: + return results + self._adjust_contrast_img(results, self.factor) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(level={self.level}, ' + repr_str += f'prob={self.prob})' + return repr_str diff --git a/mmdet/datasets/pipelines/compose.py b/mmdet/datasets/pipelines/compose.py new file mode 100644 index 0000000..d759220 --- /dev/null +++ b/mmdet/datasets/pipelines/compose.py @@ -0,0 +1,55 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import collections + +from mmcv.utils import build_from_cfg + +from ..builder import PIPELINES + + +@PIPELINES.register_module() +class Compose: + """Compose multiple transforms sequentially. + + Args: + transforms (Sequence[dict | callable]): Sequence of transform object or + config dict to be composed. + """ + + def __init__(self, transforms): + assert isinstance(transforms, collections.abc.Sequence) + self.transforms = [] + for transform in transforms: + if isinstance(transform, dict): + transform = build_from_cfg(transform, PIPELINES) + self.transforms.append(transform) + elif callable(transform): + self.transforms.append(transform) + else: + raise TypeError('transform must be callable or a dict') + + def __call__(self, data): + """Call function to apply transforms sequentially. + + Args: + data (dict): A result dict contains the data to transform. + + Returns: + dict: Transformed data. + """ + + for t in self.transforms: + data = t(data) + if data is None: + return None + return data + + def __repr__(self): + format_string = self.__class__.__name__ + '(' + for t in self.transforms: + str_ = t.__repr__() + if 'Compose(' in str_: + str_ = str_.replace('\n', '\n ') + format_string += '\n' + format_string += f' {str_}' + format_string += '\n)' + return format_string diff --git a/mmdet/datasets/pipelines/formating.py b/mmdet/datasets/pipelines/formating.py new file mode 100644 index 0000000..3b3e45a --- /dev/null +++ b/mmdet/datasets/pipelines/formating.py @@ -0,0 +1,9 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# flake8: noqa +import warnings + +from .formatting import * + +warnings.warn('DeprecationWarning: mmdet.datasets.pipelines.formating will be ' + 'deprecated, please replace it with ' + 'mmdet.datasets.pipelines.formatting.') diff --git a/mmdet/datasets/pipelines/formatting.py b/mmdet/datasets/pipelines/formatting.py new file mode 100644 index 0000000..2e07f38 --- /dev/null +++ b/mmdet/datasets/pipelines/formatting.py @@ -0,0 +1,403 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from collections.abc import Sequence + +import mmcv +import numpy as np +import torch +from mmcv.parallel import DataContainer as DC + +from ..builder import PIPELINES + + +def to_tensor(data): + """Convert objects of various python types to :obj:`torch.Tensor`. + + Supported types are: :class:`numpy.ndarray`, :class:`torch.Tensor`, + :class:`Sequence`, :class:`int` and :class:`float`. + + Args: + data (torch.Tensor | numpy.ndarray | Sequence | int | float): Data to + be converted. + """ + + if isinstance(data, torch.Tensor): + return data + elif isinstance(data, np.ndarray): + return torch.from_numpy(data) + elif isinstance(data, Sequence) and not mmcv.is_str(data): + return torch.tensor(data) + elif isinstance(data, int): + return torch.LongTensor([data]) + elif isinstance(data, float): + return torch.FloatTensor([data]) + else: + raise TypeError(f'type {type(data)} cannot be converted to tensor.') + + +@PIPELINES.register_module() +class ToTensor: + """Convert some results to :obj:`torch.Tensor` by given keys. + + Args: + keys (Sequence[str]): Keys that need to be converted to Tensor. + """ + + def __init__(self, keys): + self.keys = keys + + def __call__(self, results): + """Call function to convert data in results to :obj:`torch.Tensor`. + + Args: + results (dict): Result dict contains the data to convert. + + Returns: + dict: The result dict contains the data converted + to :obj:`torch.Tensor`. + """ + for key in self.keys: + results[key] = to_tensor(results[key]) + return results + + def __repr__(self): + return self.__class__.__name__ + f'(keys={self.keys})' + + +@PIPELINES.register_module() +class ImageToTensor: + """Convert image to :obj:`torch.Tensor` by given keys. + + The dimension order of input image is (H, W, C). The pipeline will convert + it to (C, H, W). If only 2 dimension (H, W) is given, the output would be + (1, H, W). + + Args: + keys (Sequence[str]): Key of images to be converted to Tensor. + """ + + def __init__(self, keys): + self.keys = keys + + def __call__(self, results): + """Call function to convert image in results to :obj:`torch.Tensor` and + permute the channel order. + + Args: + results (dict): Result dict contains the image data to convert. + + Returns: + dict: The result dict contains the image converted + to :obj:`torch.Tensor` and permuted to (C, H, W) order. + """ + for key in self.keys: + img = results[key] + if len(img.shape) < 3: + img = np.expand_dims(img, -1) + results[key] = to_tensor(img).permute(2, 0, 1).contiguous() + return results + + def __repr__(self): + return self.__class__.__name__ + f'(keys={self.keys})' + + +@PIPELINES.register_module() +class Transpose: + """Transpose some results by given keys. + + Args: + keys (Sequence[str]): Keys of results to be transposed. + order (Sequence[int]): Order of transpose. + """ + + def __init__(self, keys, order): + self.keys = keys + self.order = order + + def __call__(self, results): + """Call function to transpose the channel order of data in results. + + Args: + results (dict): Result dict contains the data to transpose. + + Returns: + dict: The result dict contains the data transposed to \ + ``self.order``. + """ + for key in self.keys: + results[key] = results[key].transpose(self.order) + return results + + def __repr__(self): + return self.__class__.__name__ + \ + f'(keys={self.keys}, order={self.order})' + + +@PIPELINES.register_module() +class ToDataContainer: + """Convert results to :obj:`mmcv.DataContainer` by given fields. + + Args: + fields (Sequence[dict]): Each field is a dict like + ``dict(key='xxx', **kwargs)``. The ``key`` in result will + be converted to :obj:`mmcv.DataContainer` with ``**kwargs``. + Default: ``(dict(key='img', stack=True), dict(key='gt_bboxes'), + dict(key='gt_labels'))``. + """ + + def __init__(self, + fields=(dict(key='img', stack=True), dict(key='gt_bboxes'), + dict(key='gt_labels'))): + self.fields = fields + + def __call__(self, results): + """Call function to convert data in results to + :obj:`mmcv.DataContainer`. + + Args: + results (dict): Result dict contains the data to convert. + + Returns: + dict: The result dict contains the data converted to \ + :obj:`mmcv.DataContainer`. + """ + + for field in self.fields: + field = field.copy() + key = field.pop('key') + results[key] = DC(results[key], **field) + return results + + def __repr__(self): + return self.__class__.__name__ + f'(fields={self.fields})' + + +@PIPELINES.register_module() +class DefaultFormatBundle: + """Default formatting bundle. + + It simplifies the pipeline of formatting common fields, including "img", + "proposals", "gt_bboxes", "gt_labels", "gt_masks" and "gt_semantic_seg". + These fields are formatted as follows. + + - img: (1)transpose & to tensor, (2)to DataContainer (stack=True) + - proposals: (1)to tensor, (2)to DataContainer + - gt_bboxes: (1)to tensor, (2)to DataContainer + - gt_bboxes_ignore: (1)to tensor, (2)to DataContainer + - gt_labels: (1)to tensor, (2)to DataContainer + - gt_masks: (1)to tensor, (2)to DataContainer (cpu_only=True) + - gt_semantic_seg: (1)unsqueeze dim-0 (2)to tensor, \ + (3)to DataContainer (stack=True) + + Args: + img_to_float (bool): Whether to force the image to be converted to + float type. Default: True. + pad_val (dict): A dict for padding value in batch collating, + the default value is `dict(img=0, masks=0, seg=255)`. + Without this argument, the padding value of "gt_semantic_seg" + will be set to 0 by default, which should be 255. + """ + + def __init__(self, + img_to_float=True, + pad_val=dict(img=0, masks=0, seg=255)): + self.img_to_float = img_to_float + self.pad_val = pad_val + + def __call__(self, results): + """Call function to transform and format common fields in results. + + Args: + results (dict): Result dict contains the data to convert. + + Returns: + dict: The result dict contains the data that is formatted with \ + default bundle. + """ + + if 'img' in results: + img = results['img'] + if self.img_to_float is True and img.dtype == np.uint8: + # Normally, image is of uint8 type without normalization. + # At this time, it needs to be forced to be converted to + # flot32, otherwise the model training and inference + # will be wrong. Only used for YOLOX currently . + img = img.astype(np.float32) + # add default meta keys + results = self._add_default_meta_keys(results) + if len(img.shape) < 3: + img = np.expand_dims(img, -1) + # To improve the computational speed by by 3-5 times, apply: + # If image is not contiguous, use + # `numpy.transpose()` followed by `numpy.ascontiguousarray()` + # If image is already contiguous, use + # `torch.permute()` followed by `torch.contiguous()` + # Refer to https://github.com/open-mmlab/mmdetection/pull/9533 + # for more details + if not img.flags.c_contiguous: + img = np.ascontiguousarray(img.transpose(2, 0, 1)) + img = to_tensor(img) + else: + img = to_tensor(img).permute(2, 0, 1).contiguous() + results['img'] = DC( + img, padding_value=self.pad_val['img'], stack=True) + for key in ['proposals', 'gt_bboxes', 'gt_bboxes_ignore', 'gt_labels']: + if key not in results: + continue + results[key] = DC(to_tensor(results[key])) + if 'gt_masks' in results: + results['gt_masks'] = DC( + results['gt_masks'], + padding_value=self.pad_val['masks'], + cpu_only=True) + if 'gt_semantic_seg' in results: + results['gt_semantic_seg'] = DC( + to_tensor(results['gt_semantic_seg'][None, ...]), + padding_value=self.pad_val['seg'], + stack=True) + return results + + def _add_default_meta_keys(self, results): + """Add default meta keys. + + We set default meta keys including `pad_shape`, `scale_factor` and + `img_norm_cfg` to avoid the case where no `Resize`, `Normalize` and + `Pad` are implemented during the whole pipeline. + + Args: + results (dict): Result dict contains the data to convert. + + Returns: + results (dict): Updated result dict contains the data to convert. + """ + img = results['img'] + results.setdefault('pad_shape', img.shape) + results.setdefault('scale_factor', 1.0) + num_channels = 1 if len(img.shape) < 3 else img.shape[2] + results.setdefault( + 'img_norm_cfg', + dict( + mean=np.zeros(num_channels, dtype=np.float32), + std=np.ones(num_channels, dtype=np.float32), + to_rgb=False)) + return results + + def __repr__(self): + return self.__class__.__name__ + \ + f'(img_to_float={self.img_to_float})' + + +@PIPELINES.register_module() +class Collect: + """Collect data from the loader relevant to the specific task. + + This is usually the last stage of the data loader pipeline. Typically keys + is set to some subset of "img", "proposals", "gt_bboxes", + "gt_bboxes_ignore", "gt_labels", and/or "gt_masks". + + The "img_meta" item is always populated. The contents of the "img_meta" + dictionary depends on "meta_keys". By default this includes: + + - "img_shape": shape of the image input to the network as a tuple \ + (h, w, c). Note that images may be zero padded on the \ + bottom/right if the batch tensor is larger than this shape. + + - "scale_factor": a float indicating the preprocessing scale + + - "flip": a boolean indicating if image flip transform was used + + - "filename": path to the image file + + - "ori_shape": original shape of the image as a tuple (h, w, c) + + - "pad_shape": image shape after padding + + - "img_norm_cfg": a dict of normalization information: + + - mean - per channel mean subtraction + - std - per channel std divisor + - to_rgb - bool indicating if bgr was converted to rgb + + Args: + keys (Sequence[str]): Keys of results to be collected in ``data``. + meta_keys (Sequence[str], optional): Meta keys to be converted to + ``mmcv.DataContainer`` and collected in ``data[img_metas]``. + Default: ``('filename', 'ori_filename', 'ori_shape', 'img_shape', + 'pad_shape', 'scale_factor', 'flip', 'flip_direction', + 'img_norm_cfg')`` + """ + + def __init__(self, + keys, + meta_keys=('filename', 'ori_filename', 'ori_shape', + 'img_shape', 'pad_shape', 'scale_factor', 'flip', + 'flip_direction', 'img_norm_cfg')): + self.keys = keys + self.meta_keys = meta_keys + + def __call__(self, results): + """Call function to collect keys in results. The keys in ``meta_keys`` + will be converted to :obj:mmcv.DataContainer. + + Args: + results (dict): Result dict contains the data to collect. + + Returns: + dict: The result dict contains the following keys + + - keys in``self.keys`` + - ``img_metas`` + """ + + data = {} + img_meta = {} + for key in self.meta_keys: + img_meta[key] = results[key] + data['img_metas'] = DC(img_meta, cpu_only=True) + for key in self.keys: + data[key] = results[key] + return data + + def __repr__(self): + return self.__class__.__name__ + \ + f'(keys={self.keys}, meta_keys={self.meta_keys})' + + +@PIPELINES.register_module() +class WrapFieldsToLists: + """Wrap fields of the data dictionary into lists for evaluation. + + This class can be used as a last step of a test or validation + pipeline for single image evaluation or inference. + + Example: + >>> test_pipeline = [ + >>> dict(type='LoadImageFromFile'), + >>> dict(type='Normalize', + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True), + >>> dict(type='Pad', size_divisor=32), + >>> dict(type='ImageToTensor', keys=['img']), + >>> dict(type='Collect', keys=['img']), + >>> dict(type='WrapFieldsToLists') + >>> ] + """ + + def __call__(self, results): + """Call function to wrap fields into lists. + + Args: + results (dict): Result dict contains the data to wrap. + + Returns: + dict: The result dict where value of ``self.keys`` are wrapped \ + into list. + """ + + # Wrap dict fields into lists + for key, val in results.items(): + results[key] = [val] + return results + + def __repr__(self): + return f'{self.__class__.__name__}()' diff --git a/mmdet/datasets/pipelines/instaboost.py b/mmdet/datasets/pipelines/instaboost.py new file mode 100644 index 0000000..ca10c4c --- /dev/null +++ b/mmdet/datasets/pipelines/instaboost.py @@ -0,0 +1,118 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np + +from ..builder import PIPELINES + + +@PIPELINES.register_module() +class InstaBoost: + r"""Data augmentation method in `InstaBoost: Boosting Instance + Segmentation Via Probability Map Guided Copy-Pasting + `_. + + Refer to https://github.com/GothicAi/Instaboost for implementation details. + + Args: + action_candidate (tuple): Action candidates. "normal", "horizontal", \ + "vertical", "skip" are supported. Default: ('normal', \ + 'horizontal', 'skip'). + action_prob (tuple): Corresponding action probabilities. Should be \ + the same length as action_candidate. Default: (1, 0, 0). + scale (tuple): (min scale, max scale). Default: (0.8, 1.2). + dx (int): The maximum x-axis shift will be (instance width) / dx. + Default 15. + dy (int): The maximum y-axis shift will be (instance height) / dy. + Default 15. + theta (tuple): (min rotation degree, max rotation degree). \ + Default: (-1, 1). + color_prob (float): Probability of images for color augmentation. + Default 0.5. + heatmap_flag (bool): Whether to use heatmap guided. Default False. + aug_ratio (float): Probability of applying this transformation. \ + Default 0.5. + """ + + def __init__(self, + action_candidate=('normal', 'horizontal', 'skip'), + action_prob=(1, 0, 0), + scale=(0.8, 1.2), + dx=15, + dy=15, + theta=(-1, 1), + color_prob=0.5, + hflag=False, + aug_ratio=0.5): + try: + import instaboostfast as instaboost + except ImportError: + raise ImportError( + 'Please run "pip install instaboostfast" ' + 'to install instaboostfast first for instaboost augmentation.') + self.cfg = instaboost.InstaBoostConfig(action_candidate, action_prob, + scale, dx, dy, theta, + color_prob, hflag) + self.aug_ratio = aug_ratio + + def _load_anns(self, results): + labels = results['ann_info']['labels'] + masks = results['ann_info']['masks'] + bboxes = results['ann_info']['bboxes'] + n = len(labels) + + anns = [] + for i in range(n): + label = labels[i] + bbox = bboxes[i] + mask = masks[i] + x1, y1, x2, y2 = bbox + # assert (x2 - x1) >= 1 and (y2 - y1) >= 1 + bbox = [x1, y1, x2 - x1, y2 - y1] + anns.append({ + 'category_id': label, + 'segmentation': mask, + 'bbox': bbox + }) + + return anns + + def _parse_anns(self, results, anns, img): + gt_bboxes = [] + gt_labels = [] + gt_masks_ann = [] + for ann in anns: + x1, y1, w, h = ann['bbox'] + # TODO: more essential bug need to be fixed in instaboost + if w <= 0 or h <= 0: + continue + bbox = [x1, y1, x1 + w, y1 + h] + gt_bboxes.append(bbox) + gt_labels.append(ann['category_id']) + gt_masks_ann.append(ann['segmentation']) + gt_bboxes = np.array(gt_bboxes, dtype=np.float32) + gt_labels = np.array(gt_labels, dtype=np.int64) + results['ann_info']['labels'] = gt_labels + results['ann_info']['bboxes'] = gt_bboxes + results['ann_info']['masks'] = gt_masks_ann + results['img'] = img + return results + + def __call__(self, results): + img = results['img'] + ori_type = img.dtype + anns = self._load_anns(results) + if np.random.choice([0, 1], p=[1 - self.aug_ratio, self.aug_ratio]): + try: + import instaboostfast as instaboost + except ImportError: + raise ImportError('Please run "pip install instaboostfast" ' + 'to install instaboostfast first.') + anns, img = instaboost.get_new_data( + anns, img.astype(np.uint8), self.cfg, background=None) + + results = self._parse_anns(results, anns, img.astype(ori_type)) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(cfg={self.cfg}, aug_ratio={self.aug_ratio})' + return repr_str diff --git a/mmdet/datasets/pipelines/loading.py b/mmdet/datasets/pipelines/loading.py new file mode 100644 index 0000000..8af8cf3 --- /dev/null +++ b/mmdet/datasets/pipelines/loading.py @@ -0,0 +1,645 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp + +import mmcv +import numpy as np +import pycocotools.mask as maskUtils + +from mmdet.core import BitmapMasks, PolygonMasks +from ..builder import PIPELINES + +try: + from panopticapi.utils import rgb2id +except ImportError: + rgb2id = None + + +@PIPELINES.register_module() +class LoadImageFromFile: + """Load an image from file. + + Required keys are "img_prefix" and "img_info" (a dict that must contain the + key "filename"). Added or updated keys are "filename", "img", "img_shape", + "ori_shape" (same as `img_shape`), "pad_shape" (same as `img_shape`), + "scale_factor" (1.0) and "img_norm_cfg" (means=0 and stds=1). + + Args: + to_float32 (bool): Whether to convert the loaded image to a float32 + numpy array. If set to False, the loaded image is an uint8 array. + Defaults to False. + color_type (str): The flag argument for :func:`mmcv.imfrombytes`. + Defaults to 'color'. + file_client_args (dict): Arguments to instantiate a FileClient. + See :class:`mmcv.fileio.FileClient` for details. + Defaults to ``dict(backend='disk')``. + """ + + def __init__(self, + to_float32=False, + color_type='color', + channel_order='bgr', + file_client_args=dict(backend='disk')): + self.to_float32 = to_float32 + self.color_type = color_type + self.channel_order = channel_order + self.file_client_args = file_client_args.copy() + self.file_client = None + + def __call__(self, results): + """Call functions to load image and get image meta information. + + Args: + results (dict): Result dict from :obj:`mmdet.CustomDataset`. + + Returns: + dict: The dict contains loaded image and meta information. + """ + + if self.file_client is None: + self.file_client = mmcv.FileClient(**self.file_client_args) + + if results['img_prefix'] is not None: + filename = osp.join(results['img_prefix'], + results['img_info']['filename']) + else: + filename = results['img_info']['filename'] + + img_bytes = self.file_client.get(filename) + img = mmcv.imfrombytes( + img_bytes, flag=self.color_type, channel_order=self.channel_order) + if self.to_float32: + img = img.astype(np.float32) + + results['filename'] = filename + results['ori_filename'] = results['img_info']['filename'] + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + results['img_fields'] = ['img'] + return results + + def __repr__(self): + repr_str = (f'{self.__class__.__name__}(' + f'to_float32={self.to_float32}, ' + f"color_type='{self.color_type}', " + f"channel_order='{self.channel_order}', " + f'file_client_args={self.file_client_args})') + return repr_str + + +@PIPELINES.register_module() +class LoadImageFromWebcam(LoadImageFromFile): + """Load an image from webcam. + + Similar with :obj:`LoadImageFromFile`, but the image read from webcam is in + ``results['img']``. + """ + + def __call__(self, results): + """Call functions to add image meta information. + + Args: + results (dict): Result dict with Webcam read image in + ``results['img']``. + + Returns: + dict: The dict contains loaded image and meta information. + """ + + img = results['img'] + if self.to_float32: + img = img.astype(np.float32) + + results['filename'] = None + results['ori_filename'] = None + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + results['img_fields'] = ['img'] + return results + + +@PIPELINES.register_module() +class LoadMultiChannelImageFromFiles: + """Load multi-channel images from a list of separate channel files. + + Required keys are "img_prefix" and "img_info" (a dict that must contain the + key "filename", which is expected to be a list of filenames). + Added or updated keys are "filename", "img", "img_shape", + "ori_shape" (same as `img_shape`), "pad_shape" (same as `img_shape`), + "scale_factor" (1.0) and "img_norm_cfg" (means=0 and stds=1). + + Args: + to_float32 (bool): Whether to convert the loaded image to a float32 + numpy array. If set to False, the loaded image is an uint8 array. + Defaults to False. + color_type (str): The flag argument for :func:`mmcv.imfrombytes`. + Defaults to 'color'. + file_client_args (dict): Arguments to instantiate a FileClient. + See :class:`mmcv.fileio.FileClient` for details. + Defaults to ``dict(backend='disk')``. + """ + + def __init__(self, + to_float32=False, + color_type='unchanged', + file_client_args=dict(backend='disk')): + self.to_float32 = to_float32 + self.color_type = color_type + self.file_client_args = file_client_args.copy() + self.file_client = None + + def __call__(self, results): + """Call functions to load multiple images and get images meta + information. + + Args: + results (dict): Result dict from :obj:`mmdet.CustomDataset`. + + Returns: + dict: The dict contains loaded images and meta information. + """ + + if self.file_client is None: + self.file_client = mmcv.FileClient(**self.file_client_args) + + if results['img_prefix'] is not None: + filename = [ + osp.join(results['img_prefix'], fname) + for fname in results['img_info']['filename'] + ] + else: + filename = results['img_info']['filename'] + + img = [] + for name in filename: + img_bytes = self.file_client.get(name) + img.append(mmcv.imfrombytes(img_bytes, flag=self.color_type)) + img = np.stack(img, axis=-1) + if self.to_float32: + img = img.astype(np.float32) + + results['filename'] = filename + results['ori_filename'] = results['img_info']['filename'] + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + num_channels = 1 if len(img.shape) < 3 else img.shape[2] + results['img_norm_cfg'] = dict( + mean=np.zeros(num_channels, dtype=np.float32), + std=np.ones(num_channels, dtype=np.float32), + to_rgb=False) + return results + + def __repr__(self): + repr_str = (f'{self.__class__.__name__}(' + f'to_float32={self.to_float32}, ' + f"color_type='{self.color_type}', " + f'file_client_args={self.file_client_args})') + return repr_str + + +@PIPELINES.register_module() +class LoadAnnotations: + """Load multiple types of annotations. + + Args: + with_bbox (bool): Whether to parse and load the bbox annotation. + Default: True. + with_label (bool): Whether to parse and load the label annotation. + Default: True. + with_mask (bool): Whether to parse and load the mask annotation. + Default: False. + with_seg (bool): Whether to parse and load the semantic segmentation + annotation. Default: False. + poly2mask (bool): Whether to convert the instance masks from polygons + to bitmaps. Default: True. + denorm_bbox (bool): Whether to convert bbox from relative value to + absolute value. Only used in OpenImage Dataset. + Default: False. + file_client_args (dict): Arguments to instantiate a FileClient. + See :class:`mmcv.fileio.FileClient` for details. + Defaults to ``dict(backend='disk')``. + """ + + def __init__(self, + with_bbox=True, + with_label=True, + with_mask=False, + with_seg=False, + poly2mask=True, + denorm_bbox=False, + file_client_args=dict(backend='disk')): + self.with_bbox = with_bbox + self.with_label = with_label + self.with_mask = with_mask + self.with_seg = with_seg + self.poly2mask = poly2mask + self.denorm_bbox = denorm_bbox + self.file_client_args = file_client_args.copy() + self.file_client = None + + def _load_bboxes(self, results): + """Private function to load bounding box annotations. + + Args: + results (dict): Result dict from :obj:`mmdet.CustomDataset`. + + Returns: + dict: The dict contains loaded bounding box annotations. + """ + + ann_info = results['ann_info'] + results['gt_bboxes'] = ann_info['bboxes'].copy() + + if self.denorm_bbox: + bbox_num = results['gt_bboxes'].shape[0] + if bbox_num != 0: + h, w = results['img_shape'][:2] + results['gt_bboxes'][:, 0::2] *= w + results['gt_bboxes'][:, 1::2] *= h + + gt_bboxes_ignore = ann_info.get('bboxes_ignore', None) + if gt_bboxes_ignore is not None: + results['gt_bboxes_ignore'] = gt_bboxes_ignore.copy() + results['bbox_fields'].append('gt_bboxes_ignore') + results['bbox_fields'].append('gt_bboxes') + + gt_is_group_ofs = ann_info.get('gt_is_group_ofs', None) + if gt_is_group_ofs is not None: + results['gt_is_group_ofs'] = gt_is_group_ofs.copy() + + return results + + def _load_labels(self, results): + """Private function to load label annotations. + + Args: + results (dict): Result dict from :obj:`mmdet.CustomDataset`. + + Returns: + dict: The dict contains loaded label annotations. + """ + + results['gt_labels'] = results['ann_info']['labels'].copy() + return results + + def _poly2mask(self, mask_ann, img_h, img_w): + """Private function to convert masks represented with polygon to + bitmaps. + + Args: + mask_ann (list | dict): Polygon mask annotation input. + img_h (int): The height of output mask. + img_w (int): The width of output mask. + + Returns: + numpy.ndarray: The decode bitmap mask of shape (img_h, img_w). + """ + + if isinstance(mask_ann, list): + # polygon -- a single object might consist of multiple parts + # we merge all parts into one mask rle code + rles = maskUtils.frPyObjects(mask_ann, img_h, img_w) + rle = maskUtils.merge(rles) + elif isinstance(mask_ann['counts'], list): + # uncompressed RLE + rle = maskUtils.frPyObjects(mask_ann, img_h, img_w) + else: + # rle + rle = mask_ann + mask = maskUtils.decode(rle) + return mask + + def process_polygons(self, polygons): + """Convert polygons to list of ndarray and filter invalid polygons. + + Args: + polygons (list[list]): Polygons of one instance. + + Returns: + list[numpy.ndarray]: Processed polygons. + """ + + polygons = [np.array(p) for p in polygons] + valid_polygons = [] + for polygon in polygons: + if len(polygon) % 2 == 0 and len(polygon) >= 6: + valid_polygons.append(polygon) + return valid_polygons + + def _load_masks(self, results): + """Private function to load mask annotations. + + Args: + results (dict): Result dict from :obj:`mmdet.CustomDataset`. + + Returns: + dict: The dict contains loaded mask annotations. + If ``self.poly2mask`` is set ``True``, `gt_mask` will contain + :obj:`PolygonMasks`. Otherwise, :obj:`BitmapMasks` is used. + """ + + h, w = results['img_info']['height'], results['img_info']['width'] + gt_masks = results['ann_info']['masks'] + if self.poly2mask: + gt_masks = BitmapMasks( + [self._poly2mask(mask, h, w) for mask in gt_masks], h, w) + else: + gt_masks = PolygonMasks( + [self.process_polygons(polygons) for polygons in gt_masks], h, + w) + results['gt_masks'] = gt_masks + results['mask_fields'].append('gt_masks') + return results + + def _load_semantic_seg(self, results): + """Private function to load semantic segmentation annotations. + + Args: + results (dict): Result dict from :obj:`dataset`. + + Returns: + dict: The dict contains loaded semantic segmentation annotations. + """ + + if self.file_client is None: + self.file_client = mmcv.FileClient(**self.file_client_args) + + filename = osp.join(results['seg_prefix'], + results['ann_info']['seg_map']) + img_bytes = self.file_client.get(filename) + results['gt_semantic_seg'] = mmcv.imfrombytes( + img_bytes, flag='unchanged').squeeze() + results['seg_fields'].append('gt_semantic_seg') + return results + + def __call__(self, results): + """Call function to load multiple types annotations. + + Args: + results (dict): Result dict from :obj:`mmdet.CustomDataset`. + + Returns: + dict: The dict contains loaded bounding box, label, mask and + semantic segmentation annotations. + """ + + if self.with_bbox: + results = self._load_bboxes(results) + if results is None: + return None + if self.with_label: + results = self._load_labels(results) + if self.with_mask: + results = self._load_masks(results) + if self.with_seg: + results = self._load_semantic_seg(results) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(with_bbox={self.with_bbox}, ' + repr_str += f'with_label={self.with_label}, ' + repr_str += f'with_mask={self.with_mask}, ' + repr_str += f'with_seg={self.with_seg}, ' + repr_str += f'poly2mask={self.poly2mask}, ' + repr_str += f'file_client_args={self.file_client_args})' + return repr_str + + +@PIPELINES.register_module() +class LoadPanopticAnnotations(LoadAnnotations): + """Load multiple types of panoptic annotations. + + Args: + with_bbox (bool): Whether to parse and load the bbox annotation. + Default: True. + with_label (bool): Whether to parse and load the label annotation. + Default: True. + with_mask (bool): Whether to parse and load the mask annotation. + Default: True. + with_seg (bool): Whether to parse and load the semantic segmentation + annotation. Default: True. + file_client_args (dict): Arguments to instantiate a FileClient. + See :class:`mmcv.fileio.FileClient` for details. + Defaults to ``dict(backend='disk')``. + """ + + def __init__(self, + with_bbox=True, + with_label=True, + with_mask=True, + with_seg=True, + file_client_args=dict(backend='disk')): + if rgb2id is None: + raise RuntimeError( + 'panopticapi is not installed, please install it by: ' + 'pip install git+https://github.com/cocodataset/' + 'panopticapi.git.') + + super(LoadPanopticAnnotations, self).__init__( + with_bbox=with_bbox, + with_label=with_label, + with_mask=with_mask, + with_seg=with_seg, + poly2mask=True, + denorm_bbox=False, + file_client_args=file_client_args) + + def _load_masks_and_semantic_segs(self, results): + """Private function to load mask and semantic segmentation annotations. + + In gt_semantic_seg, the foreground label is from `0` to + `num_things - 1`, the background label is from `num_things` to + `num_things + num_stuff - 1`, 255 means the ignored label (`VOID`). + + Args: + results (dict): Result dict from :obj:`mmdet.CustomDataset`. + + Returns: + dict: The dict contains loaded mask and semantic segmentation + annotations. `BitmapMasks` is used for mask annotations. + """ + + if self.file_client is None: + self.file_client = mmcv.FileClient(**self.file_client_args) + + filename = osp.join(results['seg_prefix'], + results['ann_info']['seg_map']) + img_bytes = self.file_client.get(filename) + pan_png = mmcv.imfrombytes( + img_bytes, flag='color', channel_order='rgb').squeeze() + pan_png = rgb2id(pan_png) + + gt_masks = [] + gt_seg = np.zeros_like(pan_png) + 255 # 255 as ignore + + for mask_info in results['ann_info']['masks']: + mask = (pan_png == mask_info['id']) + gt_seg = np.where(mask, mask_info['category'], gt_seg) + + # The legal thing masks + if mask_info.get('is_thing'): + gt_masks.append(mask.astype(np.uint8)) + + if self.with_mask: + h, w = results['img_info']['height'], results['img_info']['width'] + gt_masks = BitmapMasks(gt_masks, h, w) + results['gt_masks'] = gt_masks + results['mask_fields'].append('gt_masks') + + if self.with_seg: + results['gt_semantic_seg'] = gt_seg + results['seg_fields'].append('gt_semantic_seg') + return results + + def __call__(self, results): + """Call function to load multiple types panoptic annotations. + + Args: + results (dict): Result dict from :obj:`mmdet.CustomDataset`. + + Returns: + dict: The dict contains loaded bounding box, label, mask and + semantic segmentation annotations. + """ + + if self.with_bbox: + results = self._load_bboxes(results) + if results is None: + return None + if self.with_label: + results = self._load_labels(results) + if self.with_mask or self.with_seg: + # The tasks completed by '_load_masks' and '_load_semantic_segs' + # in LoadAnnotations are merged to one function. + results = self._load_masks_and_semantic_segs(results) + + return results + + +@PIPELINES.register_module() +class LoadProposals: + """Load proposal pipeline. + + Required key is "proposals". Updated keys are "proposals", "bbox_fields". + + Args: + num_max_proposals (int, optional): Maximum number of proposals to load. + If not specified, all proposals will be loaded. + """ + + def __init__(self, num_max_proposals=None): + self.num_max_proposals = num_max_proposals + + def __call__(self, results): + """Call function to load proposals from file. + + Args: + results (dict): Result dict from :obj:`mmdet.CustomDataset`. + + Returns: + dict: The dict contains loaded proposal annotations. + """ + + proposals = results['proposals'] + if proposals.shape[1] not in (4, 5): + raise AssertionError( + 'proposals should have shapes (n, 4) or (n, 5), ' + f'but found {proposals.shape}') + proposals = proposals[:, :4] + + if self.num_max_proposals is not None: + proposals = proposals[:self.num_max_proposals] + + if len(proposals) == 0: + proposals = np.array([[0, 0, 0, 0]], dtype=np.float32) + results['proposals'] = proposals + results['bbox_fields'].append('proposals') + return results + + def __repr__(self): + return self.__class__.__name__ + \ + f'(num_max_proposals={self.num_max_proposals})' + + +@PIPELINES.register_module() +class FilterAnnotations: + """Filter invalid annotations. + + Args: + min_gt_bbox_wh (tuple[float]): Minimum width and height of ground truth + boxes. Default: (1., 1.) + min_gt_mask_area (int): Minimum foreground area of ground truth masks. + Default: 1 + by_box (bool): Filter instances with bounding boxes not meeting the + min_gt_bbox_wh threshold. Default: True + by_mask (bool): Filter instances with masks not meeting + min_gt_mask_area threshold. Default: False + keep_empty (bool): Whether to return None when it + becomes an empty bbox after filtering. Default: True + """ + + def __init__(self, + min_gt_bbox_wh=(1., 1.), + min_gt_mask_area=1, + by_box=True, + by_mask=False, + keep_empty=True): + # TODO: add more filter options + assert by_box or by_mask + self.min_gt_bbox_wh = min_gt_bbox_wh + self.min_gt_mask_area = min_gt_mask_area + self.by_box = by_box + self.by_mask = by_mask + self.keep_empty = keep_empty + + def __call__(self, results): + if self.by_box: + assert 'gt_bboxes' in results + gt_bboxes = results['gt_bboxes'] + instance_num = gt_bboxes.shape[0] + if self.by_mask: + assert 'gt_masks' in results + gt_masks = results['gt_masks'] + instance_num = len(gt_masks) + + if instance_num == 0: + return results + + tests = [] + if self.by_box: + w = gt_bboxes[:, 2] - gt_bboxes[:, 0] + h = gt_bboxes[:, 3] - gt_bboxes[:, 1] + tests.append((w > self.min_gt_bbox_wh[0]) + & (h > self.min_gt_bbox_wh[1])) + if self.by_mask: + gt_masks = results['gt_masks'] + tests.append(gt_masks.areas >= self.min_gt_mask_area) + + keep = tests[0] + for t in tests[1:]: + keep = keep & t + + keep = keep.nonzero()[0] + + keys = ('gt_bboxes', 'gt_labels', 'gt_masks') + for key in keys: + if key in results: + results[key] = results[key][keep] + if keep.size == 0: + if self.keep_empty: + return None + return results + + def __repr__(self): + return self.__class__.__name__ + \ + f'(min_gt_bbox_wh={self.min_gt_bbox_wh},' \ + f'min_gt_mask_area={self.min_gt_mask_area},' \ + f'by_box={self.by_box},' \ + f'by_mask={self.by_mask},' \ + f'always_keep={self.always_keep})' diff --git a/mmdet/datasets/pipelines/test_time_aug.py b/mmdet/datasets/pipelines/test_time_aug.py new file mode 100644 index 0000000..5f1ab7b --- /dev/null +++ b/mmdet/datasets/pipelines/test_time_aug.py @@ -0,0 +1,121 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import mmcv + +from ..builder import PIPELINES +from .compose import Compose + + +@PIPELINES.register_module() +class MultiScaleFlipAug: + """Test-time augmentation with multiple scales and flipping. + + An example configuration is as followed: + + .. code-block:: + + img_scale=[(1333, 400), (1333, 800)], + flip=True, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ] + + After MultiScaleFLipAug with above configuration, the results are wrapped + into lists of the same length as followed: + + .. code-block:: + + dict( + img=[...], + img_shape=[...], + scale=[(1333, 400), (1333, 400), (1333, 800), (1333, 800)] + flip=[False, True, False, True] + ... + ) + + Args: + transforms (list[dict]): Transforms to apply in each augmentation. + img_scale (tuple | list[tuple] | None): Images scales for resizing. + scale_factor (float | list[float] | None): Scale factors for resizing. + flip (bool): Whether apply flip augmentation. Default: False. + flip_direction (str | list[str]): Flip augmentation directions, + options are "horizontal", "vertical" and "diagonal". If + flip_direction is a list, multiple flip augmentations will be + applied. It has no effect when flip == False. Default: + "horizontal". + """ + + def __init__(self, + transforms, + img_scale=None, + scale_factor=None, + flip=False, + flip_direction='horizontal'): + self.transforms = Compose(transforms) + assert (img_scale is None) ^ (scale_factor is None), ( + 'Must have but only one variable can be set') + if img_scale is not None: + self.img_scale = img_scale if isinstance(img_scale, + list) else [img_scale] + self.scale_key = 'scale' + assert mmcv.is_list_of(self.img_scale, tuple) + else: + self.img_scale = scale_factor if isinstance( + scale_factor, list) else [scale_factor] + self.scale_key = 'scale_factor' + + self.flip = flip + self.flip_direction = flip_direction if isinstance( + flip_direction, list) else [flip_direction] + assert mmcv.is_list_of(self.flip_direction, str) + if not self.flip and self.flip_direction != ['horizontal']: + warnings.warn( + 'flip_direction has no effect when flip is set to False') + if (self.flip + and not any([t['type'] == 'RandomFlip' for t in transforms])): + warnings.warn( + 'flip has no effect when RandomFlip is not in transforms') + + def __call__(self, results): + """Call function to apply test time augment transforms on results. + + Args: + results (dict): Result dict contains the data to transform. + + Returns: + dict[str: list]: The augmented data, where each value is wrapped + into a list. + """ + + aug_data = [] + flip_args = [(False, None)] + if self.flip: + flip_args += [(True, direction) + for direction in self.flip_direction] + for scale in self.img_scale: + for flip, direction in flip_args: + _results = results.copy() + _results[self.scale_key] = scale + _results['flip'] = flip + _results['flip_direction'] = direction + data = self.transforms(_results) + aug_data.append(data) + # list of dict to dict of list + aug_data_dict = {key: [] for key in aug_data[0]} + for data in aug_data: + for key, val in data.items(): + aug_data_dict[key].append(val) + return aug_data_dict + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(transforms={self.transforms}, ' + repr_str += f'img_scale={self.img_scale}, flip={self.flip}, ' + repr_str += f'flip_direction={self.flip_direction})' + return repr_str diff --git a/mmdet/datasets/pipelines/transforms.py b/mmdet/datasets/pipelines/transforms.py new file mode 100644 index 0000000..4c9ef72 --- /dev/null +++ b/mmdet/datasets/pipelines/transforms.py @@ -0,0 +1,2968 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy +import inspect +import math +import warnings + +import cv2 +import mmcv +import numpy as np +from numpy import random + +from mmdet.core import BitmapMasks, PolygonMasks, find_inside_bboxes +from mmdet.core.evaluation.bbox_overlaps import bbox_overlaps +from mmdet.utils import log_img_scale +from ..builder import PIPELINES + +try: + from imagecorruptions import corrupt +except ImportError: + corrupt = None + +try: + import albumentations + from albumentations import Compose +except ImportError: + albumentations = None + Compose = None + + +@PIPELINES.register_module() +class Resize: + """Resize images & bbox & mask. + + This transform resizes the input image to some scale. Bboxes and masks are + then resized with the same scale factor. If the input dict contains the key + "scale", then the scale in the input dict is used, otherwise the specified + scale in the init method is used. If the input dict contains the key + "scale_factor" (if MultiScaleFlipAug does not give img_scale but + scale_factor), the actual scale will be computed by image shape and + scale_factor. + + `img_scale` can either be a tuple (single-scale) or a list of tuple + (multi-scale). There are 3 multiscale modes: + + - ``ratio_range is not None``: randomly sample a ratio from the ratio \ + range and multiply it with the image scale. + - ``ratio_range is None`` and ``multiscale_mode == "range"``: randomly \ + sample a scale from the multiscale range. + - ``ratio_range is None`` and ``multiscale_mode == "value"``: randomly \ + sample a scale from multiple scales. + + Args: + img_scale (tuple or list[tuple]): Images scales for resizing. + multiscale_mode (str): Either "range" or "value". + ratio_range (tuple[float]): (min_ratio, max_ratio) + keep_ratio (bool): Whether to keep the aspect ratio when resizing the + image. + bbox_clip_border (bool, optional): Whether to clip the objects outside + the border of the image. In some dataset like MOT17, the gt bboxes + are allowed to cross the border of images. Therefore, we don't + need to clip the gt bboxes in these cases. Defaults to True. + backend (str): Image resize backend, choices are 'cv2' and 'pillow'. + These two backends generates slightly different results. Defaults + to 'cv2'. + interpolation (str): Interpolation method, accepted values are + "nearest", "bilinear", "bicubic", "area", "lanczos" for 'cv2' + backend, "nearest", "bilinear" for 'pillow' backend. + override (bool, optional): Whether to override `scale` and + `scale_factor` so as to call resize twice. Default False. If True, + after the first resizing, the existed `scale` and `scale_factor` + will be ignored so the second resizing can be allowed. + This option is a work-around for multiple times of resize in DETR. + Defaults to False. + """ + + def __init__(self, + img_scale=None, + multiscale_mode='range', + ratio_range=None, + keep_ratio=True, + bbox_clip_border=True, + backend='cv2', + interpolation='bilinear', + override=False): + if img_scale is None: + self.img_scale = None + else: + if isinstance(img_scale, list): + self.img_scale = img_scale + else: + self.img_scale = [img_scale] + assert mmcv.is_list_of(self.img_scale, tuple) + + if ratio_range is not None: + # mode 1: given a scale and a range of image ratio + assert len(self.img_scale) == 1 + else: + # mode 2: given multiple scales or a range of scales + assert multiscale_mode in ['value', 'range'] + + self.backend = backend + self.multiscale_mode = multiscale_mode + self.ratio_range = ratio_range + self.keep_ratio = keep_ratio + # TODO: refactor the override option in Resize + self.interpolation = interpolation + self.override = override + self.bbox_clip_border = bbox_clip_border + + @staticmethod + def random_select(img_scales): + """Randomly select an img_scale from given candidates. + + Args: + img_scales (list[tuple]): Images scales for selection. + + Returns: + (tuple, int): Returns a tuple ``(img_scale, scale_dix)``, \ + where ``img_scale`` is the selected image scale and \ + ``scale_idx`` is the selected index in the given candidates. + """ + + assert mmcv.is_list_of(img_scales, tuple) + scale_idx = np.random.randint(len(img_scales)) + img_scale = img_scales[scale_idx] + return img_scale, scale_idx + + @staticmethod + def random_sample(img_scales): + """Randomly sample an img_scale when ``multiscale_mode=='range'``. + + Args: + img_scales (list[tuple]): Images scale range for sampling. + There must be two tuples in img_scales, which specify the lower + and upper bound of image scales. + + Returns: + (tuple, None): Returns a tuple ``(img_scale, None)``, where \ + ``img_scale`` is sampled scale and None is just a placeholder \ + to be consistent with :func:`random_select`. + """ + + assert mmcv.is_list_of(img_scales, tuple) and len(img_scales) == 2 + img_scale_long = [max(s) for s in img_scales] + img_scale_short = [min(s) for s in img_scales] + long_edge = np.random.randint( + min(img_scale_long), + max(img_scale_long) + 1) + short_edge = np.random.randint( + min(img_scale_short), + max(img_scale_short) + 1) + img_scale = (long_edge, short_edge) + return img_scale, None + + @staticmethod + def random_sample_ratio(img_scale, ratio_range): + """Randomly sample an img_scale when ``ratio_range`` is specified. + + A ratio will be randomly sampled from the range specified by + ``ratio_range``. Then it would be multiplied with ``img_scale`` to + generate sampled scale. + + Args: + img_scale (tuple): Images scale base to multiply with ratio. + ratio_range (tuple[float]): The minimum and maximum ratio to scale + the ``img_scale``. + + Returns: + (tuple, None): Returns a tuple ``(scale, None)``, where \ + ``scale`` is sampled ratio multiplied with ``img_scale`` and \ + None is just a placeholder to be consistent with \ + :func:`random_select`. + """ + + assert isinstance(img_scale, tuple) and len(img_scale) == 2 + min_ratio, max_ratio = ratio_range + assert min_ratio <= max_ratio + ratio = np.random.random_sample() * (max_ratio - min_ratio) + min_ratio + scale = int(img_scale[0] * ratio), int(img_scale[1] * ratio) + return scale, None + + def _random_scale(self, results): + """Randomly sample an img_scale according to ``ratio_range`` and + ``multiscale_mode``. + + If ``ratio_range`` is specified, a ratio will be sampled and be + multiplied with ``img_scale``. + If multiple scales are specified by ``img_scale``, a scale will be + sampled according to ``multiscale_mode``. + Otherwise, single scale will be used. + + Args: + results (dict): Result dict from :obj:`dataset`. + + Returns: + dict: Two new keys 'scale` and 'scale_idx` are added into \ + ``results``, which would be used by subsequent pipelines. + """ + + if self.ratio_range is not None: + scale, scale_idx = self.random_sample_ratio( + self.img_scale[0], self.ratio_range) + elif len(self.img_scale) == 1: + scale, scale_idx = self.img_scale[0], 0 + elif self.multiscale_mode == 'range': + scale, scale_idx = self.random_sample(self.img_scale) + elif self.multiscale_mode == 'value': + scale, scale_idx = self.random_select(self.img_scale) + else: + raise NotImplementedError + + results['scale'] = scale + results['scale_idx'] = scale_idx + + def _resize_img(self, results): + """Resize images with ``results['scale']``.""" + for key in results.get('img_fields', ['img']): + if self.keep_ratio: + img, scale_factor = mmcv.imrescale( + results[key], + results['scale'], + return_scale=True, + interpolation=self.interpolation, + backend=self.backend) + # the w_scale and h_scale has minor difference + # a real fix should be done in the mmcv.imrescale in the future + new_h, new_w = img.shape[:2] + h, w = results[key].shape[:2] + w_scale = new_w / w + h_scale = new_h / h + else: + img, w_scale, h_scale = mmcv.imresize( + results[key], + results['scale'], + return_scale=True, + interpolation=self.interpolation, + backend=self.backend) + results[key] = img + + scale_factor = np.array([w_scale, h_scale, w_scale, h_scale], + dtype=np.float32) + results['img_shape'] = img.shape + # in case that there is no padding + results['pad_shape'] = img.shape + results['scale_factor'] = scale_factor + results['keep_ratio'] = self.keep_ratio + + def _resize_bboxes(self, results): + """Resize bounding boxes with ``results['scale_factor']``.""" + for key in results.get('bbox_fields', []): + bboxes = results[key] * results['scale_factor'] + if self.bbox_clip_border: + img_shape = results['img_shape'] + bboxes[:, 0::2] = np.clip(bboxes[:, 0::2], 0, img_shape[1]) + bboxes[:, 1::2] = np.clip(bboxes[:, 1::2], 0, img_shape[0]) + results[key] = bboxes + + def _resize_masks(self, results): + """Resize masks with ``results['scale']``""" + for key in results.get('mask_fields', []): + if results[key] is None: + continue + if self.keep_ratio: + results[key] = results[key].rescale(results['scale']) + else: + results[key] = results[key].resize(results['img_shape'][:2]) + + def _resize_seg(self, results): + """Resize semantic segmentation map with ``results['scale']``.""" + for key in results.get('seg_fields', []): + if self.keep_ratio: + gt_seg = mmcv.imrescale( + results[key], + results['scale'], + interpolation='nearest', + backend=self.backend) + else: + gt_seg = mmcv.imresize( + results[key], + results['scale'], + interpolation='nearest', + backend=self.backend) + results[key] = gt_seg + + def __call__(self, results): + """Call function to resize images, bounding boxes, masks, semantic + segmentation map. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Resized results, 'img_shape', 'pad_shape', 'scale_factor', \ + 'keep_ratio' keys are added into result dict. + """ + + if 'scale' not in results: + if 'scale_factor' in results: + img_shape = results['img'].shape[:2] + scale_factor = results['scale_factor'] + assert isinstance(scale_factor, float) + results['scale'] = tuple( + [int(x * scale_factor) for x in img_shape][::-1]) + else: + self._random_scale(results) + else: + if not self.override: + assert 'scale_factor' not in results, ( + 'scale and scale_factor cannot be both set.') + else: + results.pop('scale') + if 'scale_factor' in results: + results.pop('scale_factor') + self._random_scale(results) + + self._resize_img(results) + self._resize_bboxes(results) + self._resize_masks(results) + self._resize_seg(results) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(img_scale={self.img_scale}, ' + repr_str += f'multiscale_mode={self.multiscale_mode}, ' + repr_str += f'ratio_range={self.ratio_range}, ' + repr_str += f'keep_ratio={self.keep_ratio}, ' + repr_str += f'bbox_clip_border={self.bbox_clip_border})' + return repr_str + + +@PIPELINES.register_module() +class RandomFlip: + """Flip the image & bbox & mask. + + If the input dict contains the key "flip", then the flag will be used, + otherwise it will be randomly decided by a ratio specified in the init + method. + + When random flip is enabled, ``flip_ratio``/``direction`` can either be a + float/string or tuple of float/string. There are 3 flip modes: + + - ``flip_ratio`` is float, ``direction`` is string: the image will be + ``direction``ly flipped with probability of ``flip_ratio`` . + E.g., ``flip_ratio=0.5``, ``direction='horizontal'``, + then image will be horizontally flipped with probability of 0.5. + - ``flip_ratio`` is float, ``direction`` is list of string: the image will + be ``direction[i]``ly flipped with probability of + ``flip_ratio/len(direction)``. + E.g., ``flip_ratio=0.5``, ``direction=['horizontal', 'vertical']``, + then image will be horizontally flipped with probability of 0.25, + vertically with probability of 0.25. + - ``flip_ratio`` is list of float, ``direction`` is list of string: + given ``len(flip_ratio) == len(direction)``, the image will + be ``direction[i]``ly flipped with probability of ``flip_ratio[i]``. + E.g., ``flip_ratio=[0.3, 0.5]``, ``direction=['horizontal', + 'vertical']``, then image will be horizontally flipped with probability + of 0.3, vertically with probability of 0.5. + + Args: + flip_ratio (float | list[float], optional): The flipping probability. + Default: None. + direction(str | list[str], optional): The flipping direction. Options + are 'horizontal', 'vertical', 'diagonal'. Default: 'horizontal'. + If input is a list, the length must equal ``flip_ratio``. Each + element in ``flip_ratio`` indicates the flip probability of + corresponding direction. + """ + + def __init__(self, flip_ratio=None, direction='horizontal'): + if isinstance(flip_ratio, list): + assert mmcv.is_list_of(flip_ratio, float) + assert 0 <= sum(flip_ratio) <= 1 + elif isinstance(flip_ratio, float): + assert 0 <= flip_ratio <= 1 + elif flip_ratio is None: + pass + else: + raise ValueError('flip_ratios must be None, float, ' + 'or list of float') + self.flip_ratio = flip_ratio + + valid_directions = ['horizontal', 'vertical', 'diagonal'] + if isinstance(direction, str): + assert direction in valid_directions + elif isinstance(direction, list): + assert mmcv.is_list_of(direction, str) + assert set(direction).issubset(set(valid_directions)) + else: + raise ValueError('direction must be either str or list of str') + self.direction = direction + + if isinstance(flip_ratio, list): + assert len(self.flip_ratio) == len(self.direction) + + def bbox_flip(self, bboxes, img_shape, direction): + """Flip bboxes horizontally. + + Args: + bboxes (numpy.ndarray): Bounding boxes, shape (..., 4*k) + img_shape (tuple[int]): Image shape (height, width) + direction (str): Flip direction. Options are 'horizontal', + 'vertical'. + + Returns: + numpy.ndarray: Flipped bounding boxes. + """ + + assert bboxes.shape[-1] % 4 == 0 + flipped = bboxes.copy() + if direction == 'horizontal': + w = img_shape[1] + flipped[..., 0::4] = w - bboxes[..., 2::4] + flipped[..., 2::4] = w - bboxes[..., 0::4] + elif direction == 'vertical': + h = img_shape[0] + flipped[..., 1::4] = h - bboxes[..., 3::4] + flipped[..., 3::4] = h - bboxes[..., 1::4] + elif direction == 'diagonal': + w = img_shape[1] + h = img_shape[0] + flipped[..., 0::4] = w - bboxes[..., 2::4] + flipped[..., 1::4] = h - bboxes[..., 3::4] + flipped[..., 2::4] = w - bboxes[..., 0::4] + flipped[..., 3::4] = h - bboxes[..., 1::4] + else: + raise ValueError(f"Invalid flipping direction '{direction}'") + return flipped + + def __call__(self, results): + """Call function to flip bounding boxes, masks, semantic segmentation + maps. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Flipped results, 'flip', 'flip_direction' keys are added \ + into result dict. + """ + + if 'flip' not in results: + if isinstance(self.direction, list): + # None means non-flip + direction_list = self.direction + [None] + else: + # None means non-flip + direction_list = [self.direction, None] + + if isinstance(self.flip_ratio, list): + non_flip_ratio = 1 - sum(self.flip_ratio) + flip_ratio_list = self.flip_ratio + [non_flip_ratio] + else: + non_flip_ratio = 1 - self.flip_ratio + # exclude non-flip + single_ratio = self.flip_ratio / (len(direction_list) - 1) + flip_ratio_list = [single_ratio] * (len(direction_list) - + 1) + [non_flip_ratio] + + cur_dir = np.random.choice(direction_list, p=flip_ratio_list) + + results['flip'] = cur_dir is not None + if 'flip_direction' not in results: + results['flip_direction'] = cur_dir + if results['flip']: + # flip image + for key in results.get('img_fields', ['img']): + results[key] = mmcv.imflip( + results[key], direction=results['flip_direction']) + # flip bboxes + for key in results.get('bbox_fields', []): + results[key] = self.bbox_flip(results[key], + results['img_shape'], + results['flip_direction']) + # flip masks + for key in results.get('mask_fields', []): + results[key] = results[key].flip(results['flip_direction']) + + # flip segs + for key in results.get('seg_fields', []): + results[key] = mmcv.imflip( + results[key], direction=results['flip_direction']) + return results + + def __repr__(self): + return self.__class__.__name__ + f'(flip_ratio={self.flip_ratio})' + + +@PIPELINES.register_module() +class RandomShift: + """Shift the image and box given shift pixels and probability. + + Args: + shift_ratio (float): Probability of shifts. Default 0.5. + max_shift_px (int): The max pixels for shifting. Default 32. + filter_thr_px (int): The width and height threshold for filtering. + The bbox and the rest of the targets below the width and + height threshold will be filtered. Default 1. + """ + + def __init__(self, shift_ratio=0.5, max_shift_px=32, filter_thr_px=1): + assert 0 <= shift_ratio <= 1 + assert max_shift_px >= 0 + self.shift_ratio = shift_ratio + self.max_shift_px = max_shift_px + self.filter_thr_px = int(filter_thr_px) + # The key correspondence from bboxes to labels. + self.bbox2label = { + 'gt_bboxes': 'gt_labels', + 'gt_bboxes_ignore': 'gt_labels_ignore' + } + + def __call__(self, results): + """Call function to random shift images, bounding boxes. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Shift results. + """ + if random.random() < self.shift_ratio: + img_shape = results['img'].shape[:2] + + random_shift_x = random.randint(-self.max_shift_px, + self.max_shift_px) + random_shift_y = random.randint(-self.max_shift_px, + self.max_shift_px) + new_x = max(0, random_shift_x) + ori_x = max(0, -random_shift_x) + new_y = max(0, random_shift_y) + ori_y = max(0, -random_shift_y) + + # TODO: support mask and semantic segmentation maps. + for key in results.get('bbox_fields', []): + bboxes = results[key].copy() + bboxes[..., 0::2] += random_shift_x + bboxes[..., 1::2] += random_shift_y + + # clip border + bboxes[..., 0::2] = np.clip(bboxes[..., 0::2], 0, img_shape[1]) + bboxes[..., 1::2] = np.clip(bboxes[..., 1::2], 0, img_shape[0]) + + # remove invalid bboxes + bbox_w = bboxes[..., 2] - bboxes[..., 0] + bbox_h = bboxes[..., 3] - bboxes[..., 1] + valid_inds = (bbox_w > self.filter_thr_px) & ( + bbox_h > self.filter_thr_px) + # If the shift does not contain any gt-bbox area, skip this + # image. + if key == 'gt_bboxes' and not valid_inds.any(): + return results + bboxes = bboxes[valid_inds] + results[key] = bboxes + + # label fields. e.g. gt_labels and gt_labels_ignore + label_key = self.bbox2label.get(key) + if label_key in results: + results[label_key] = results[label_key][valid_inds] + + for key in results.get('img_fields', ['img']): + img = results[key] + new_img = np.zeros_like(img) + img_h, img_w = img.shape[:2] + new_h = img_h - np.abs(random_shift_y) + new_w = img_w - np.abs(random_shift_x) + new_img[new_y:new_y + new_h, new_x:new_x + new_w] \ + = img[ori_y:ori_y + new_h, ori_x:ori_x + new_w] + results[key] = new_img + + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(max_shift_px={self.max_shift_px}, ' + return repr_str + + +@PIPELINES.register_module() +class Pad: + """Pad the image & masks & segmentation map. + + There are two padding modes: (1) pad to a fixed size and (2) pad to the + minimum size that is divisible by some number. + Added keys are "pad_shape", "pad_fixed_size", "pad_size_divisor", + + Args: + size (tuple, optional): Fixed padding size. + size_divisor (int, optional): The divisor of padded size. + pad_to_square (bool): Whether to pad the image into a square. + Currently only used for YOLOX. Default: False. + pad_val (dict, optional): A dict for padding value, the default + value is `dict(img=0, masks=0, seg=255)`. + """ + + def __init__(self, + size=None, + size_divisor=None, + pad_to_square=False, + pad_val=dict(img=0, masks=0, seg=255)): + self.size = size + self.size_divisor = size_divisor + if isinstance(pad_val, float) or isinstance(pad_val, int): + warnings.warn( + 'pad_val of float type is deprecated now, ' + f'please use pad_val=dict(img={pad_val}, ' + f'masks={pad_val}, seg=255) instead.', DeprecationWarning) + pad_val = dict(img=pad_val, masks=pad_val, seg=255) + assert isinstance(pad_val, dict) + self.pad_val = pad_val + self.pad_to_square = pad_to_square + + if pad_to_square: + assert size is None and size_divisor is None, \ + 'The size and size_divisor must be None ' \ + 'when pad2square is True' + else: + assert size is not None or size_divisor is not None, \ + 'only one of size and size_divisor should be valid' + assert size is None or size_divisor is None + + def _pad_img(self, results): + """Pad images according to ``self.size``.""" + pad_val = self.pad_val.get('img', 0) + for key in results.get('img_fields', ['img']): + if self.pad_to_square: + max_size = max(results[key].shape[:2]) + self.size = (max_size, max_size) + if self.size is not None: + padded_img = mmcv.impad( + results[key], shape=self.size, pad_val=pad_val) + elif self.size_divisor is not None: + padded_img = mmcv.impad_to_multiple( + results[key], self.size_divisor, pad_val=pad_val) + results[key] = padded_img + results['pad_shape'] = padded_img.shape + results['pad_fixed_size'] = self.size + results['pad_size_divisor'] = self.size_divisor + + def _pad_masks(self, results): + """Pad masks according to ``results['pad_shape']``.""" + pad_shape = results['pad_shape'][:2] + pad_val = self.pad_val.get('masks', 0) + for key in results.get('mask_fields', []): + results[key] = results[key].pad(pad_shape, pad_val=pad_val) + + def _pad_seg(self, results): + """Pad semantic segmentation map according to + ``results['pad_shape']``.""" + pad_val = self.pad_val.get('seg', 255) + for key in results.get('seg_fields', []): + results[key] = mmcv.impad( + results[key], shape=results['pad_shape'][:2], pad_val=pad_val) + + def __call__(self, results): + """Call function to pad images, masks, semantic segmentation maps. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Updated result dict. + """ + self._pad_img(results) + self._pad_masks(results) + self._pad_seg(results) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(size={self.size}, ' + repr_str += f'size_divisor={self.size_divisor}, ' + repr_str += f'pad_to_square={self.pad_to_square}, ' + repr_str += f'pad_val={self.pad_val})' + return repr_str + + +@PIPELINES.register_module() +class Normalize: + """Normalize the image. + + Added key is "img_norm_cfg". + + Args: + mean (sequence): Mean values of 3 channels. + std (sequence): Std values of 3 channels. + to_rgb (bool): Whether to convert the image from BGR to RGB, + default is true. + """ + + def __init__(self, mean, std, to_rgb=True): + self.mean = np.array(mean, dtype=np.float32) + self.std = np.array(std, dtype=np.float32) + self.to_rgb = to_rgb + + def __call__(self, results): + """Call function to normalize images. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Normalized results, 'img_norm_cfg' key is added into + result dict. + """ + for key in results.get('img_fields', ['img']): + results[key] = mmcv.imnormalize(results[key], self.mean, self.std, + self.to_rgb) + results['img_norm_cfg'] = dict( + mean=self.mean, std=self.std, to_rgb=self.to_rgb) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(mean={self.mean}, std={self.std}, to_rgb={self.to_rgb})' + return repr_str + + +@PIPELINES.register_module() +class RandomCrop: + """Random crop the image & bboxes & masks. + + The absolute `crop_size` is sampled based on `crop_type` and `image_size`, + then the cropped results are generated. + + Args: + crop_size (tuple): The relative ratio or absolute pixels of + height and width. + crop_type (str, optional): one of "relative_range", "relative", + "absolute", "absolute_range". "relative" randomly crops + (h * crop_size[0], w * crop_size[1]) part from an input of size + (h, w). "relative_range" uniformly samples relative crop size from + range [crop_size[0], 1] and [crop_size[1], 1] for height and width + respectively. "absolute" crops from an input with absolute size + (crop_size[0], crop_size[1]). "absolute_range" uniformly samples + crop_h in range [crop_size[0], min(h, crop_size[1])] and crop_w + in range [crop_size[0], min(w, crop_size[1])]. Default "absolute". + allow_negative_crop (bool, optional): Whether to allow a crop that does + not contain any bbox area. Default False. + recompute_bbox (bool, optional): Whether to re-compute the boxes based + on cropped instance masks. Default False. + bbox_clip_border (bool, optional): Whether clip the objects outside + the border of the image. Defaults to True. + + Note: + - If the image is smaller than the absolute crop size, return the + original image. + - The keys for bboxes, labels and masks must be aligned. That is, + `gt_bboxes` corresponds to `gt_labels` and `gt_masks`, and + `gt_bboxes_ignore` corresponds to `gt_labels_ignore` and + `gt_masks_ignore`. + - If the crop does not contain any gt-bbox region and + `allow_negative_crop` is set to False, skip this image. + """ + + def __init__(self, + crop_size, + crop_type='absolute', + allow_negative_crop=False, + recompute_bbox=False, + bbox_clip_border=True): + if crop_type not in [ + 'relative_range', 'relative', 'absolute', 'absolute_range' + ]: + raise ValueError(f'Invalid crop_type {crop_type}.') + if crop_type in ['absolute', 'absolute_range']: + assert crop_size[0] > 0 and crop_size[1] > 0 + assert isinstance(crop_size[0], int) and isinstance( + crop_size[1], int) + else: + assert 0 < crop_size[0] <= 1 and 0 < crop_size[1] <= 1 + self.crop_size = crop_size + self.crop_type = crop_type + self.allow_negative_crop = allow_negative_crop + self.bbox_clip_border = bbox_clip_border + self.recompute_bbox = recompute_bbox + # The key correspondence from bboxes to labels and masks. + self.bbox2label = { + 'gt_bboxes': 'gt_labels', + 'gt_bboxes_ignore': 'gt_labels_ignore' + } + self.bbox2mask = { + 'gt_bboxes': 'gt_masks', + 'gt_bboxes_ignore': 'gt_masks_ignore' + } + + def _crop_data(self, results, crop_size, allow_negative_crop): + """Function to randomly crop images, bounding boxes, masks, semantic + segmentation maps. + + Args: + results (dict): Result dict from loading pipeline. + crop_size (tuple): Expected absolute size after cropping, (h, w). + allow_negative_crop (bool): Whether to allow a crop that does not + contain any bbox area. Default to False. + + Returns: + dict: Randomly cropped results, 'img_shape' key in result dict is + updated according to crop size. + """ + assert crop_size[0] > 0 and crop_size[1] > 0 + for key in results.get('img_fields', ['img']): + img = results[key] + margin_h = max(img.shape[0] - crop_size[0], 0) + margin_w = max(img.shape[1] - crop_size[1], 0) + offset_h = np.random.randint(0, margin_h + 1) + offset_w = np.random.randint(0, margin_w + 1) + crop_y1, crop_y2 = offset_h, offset_h + crop_size[0] + crop_x1, crop_x2 = offset_w, offset_w + crop_size[1] + + # crop the image + img = img[crop_y1:crop_y2, crop_x1:crop_x2, ...] + img_shape = img.shape + results[key] = img + results['img_shape'] = img_shape + + # crop bboxes accordingly and clip to the image boundary + for key in results.get('bbox_fields', []): + # e.g. gt_bboxes and gt_bboxes_ignore + bbox_offset = np.array([offset_w, offset_h, offset_w, offset_h], + dtype=np.float32) + bboxes = results[key] - bbox_offset + if self.bbox_clip_border: + bboxes[:, 0::2] = np.clip(bboxes[:, 0::2], 0, img_shape[1]) + bboxes[:, 1::2] = np.clip(bboxes[:, 1::2], 0, img_shape[0]) + valid_inds = (bboxes[:, 2] > bboxes[:, 0]) & ( + bboxes[:, 3] > bboxes[:, 1]) + # If the crop does not contain any gt-bbox area and + # allow_negative_crop is False, skip this image. + if (key == 'gt_bboxes' and not valid_inds.any() + and not allow_negative_crop): + return None + results[key] = bboxes[valid_inds, :] + # label fields. e.g. gt_labels and gt_labels_ignore + label_key = self.bbox2label.get(key) + if label_key in results: + results[label_key] = results[label_key][valid_inds] + + # mask fields, e.g. gt_masks and gt_masks_ignore + mask_key = self.bbox2mask.get(key) + if mask_key in results: + results[mask_key] = results[mask_key][ + valid_inds.nonzero()[0]].crop( + np.asarray([crop_x1, crop_y1, crop_x2, crop_y2])) + if self.recompute_bbox: + results[key] = results[mask_key].get_bboxes() + + # crop semantic seg + for key in results.get('seg_fields', []): + results[key] = results[key][crop_y1:crop_y2, crop_x1:crop_x2] + + return results + + def _get_crop_size(self, image_size): + """Randomly generates the absolute crop size based on `crop_type` and + `image_size`. + + Args: + image_size (tuple): (h, w). + + Returns: + crop_size (tuple): (crop_h, crop_w) in absolute pixels. + """ + h, w = image_size + if self.crop_type == 'absolute': + return (min(self.crop_size[0], h), min(self.crop_size[1], w)) + elif self.crop_type == 'absolute_range': + assert self.crop_size[0] <= self.crop_size[1] + crop_h = np.random.randint( + min(h, self.crop_size[0]), + min(h, self.crop_size[1]) + 1) + crop_w = np.random.randint( + min(w, self.crop_size[0]), + min(w, self.crop_size[1]) + 1) + return crop_h, crop_w + elif self.crop_type == 'relative': + crop_h, crop_w = self.crop_size + return int(h * crop_h + 0.5), int(w * crop_w + 0.5) + elif self.crop_type == 'relative_range': + crop_size = np.asarray(self.crop_size, dtype=np.float32) + crop_h, crop_w = crop_size + np.random.rand(2) * (1 - crop_size) + return int(h * crop_h + 0.5), int(w * crop_w + 0.5) + + def __call__(self, results): + """Call function to randomly crop images, bounding boxes, masks, + semantic segmentation maps. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Randomly cropped results, 'img_shape' key in result dict is + updated according to crop size. + """ + image_size = results['img'].shape[:2] + crop_size = self._get_crop_size(image_size) + results = self._crop_data(results, crop_size, self.allow_negative_crop) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(crop_size={self.crop_size}, ' + repr_str += f'crop_type={self.crop_type}, ' + repr_str += f'allow_negative_crop={self.allow_negative_crop}, ' + repr_str += f'bbox_clip_border={self.bbox_clip_border})' + return repr_str + + +@PIPELINES.register_module() +class SegRescale: + """Rescale semantic segmentation maps. + + Args: + scale_factor (float): The scale factor of the final output. + backend (str): Image rescale backend, choices are 'cv2' and 'pillow'. + These two backends generates slightly different results. Defaults + to 'cv2'. + """ + + def __init__(self, scale_factor=1, backend='cv2'): + self.scale_factor = scale_factor + self.backend = backend + + def __call__(self, results): + """Call function to scale the semantic segmentation map. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Result dict with semantic segmentation map scaled. + """ + + for key in results.get('seg_fields', []): + if self.scale_factor != 1: + results[key] = mmcv.imrescale( + results[key], + self.scale_factor, + interpolation='nearest', + backend=self.backend) + return results + + def __repr__(self): + return self.__class__.__name__ + f'(scale_factor={self.scale_factor})' + + +@PIPELINES.register_module() +class PhotoMetricDistortion: + """Apply photometric distortion to image sequentially, every transformation + is applied with a probability of 0.5. The position of random contrast is in + second or second to last. + + 1. random brightness + 2. random contrast (mode 0) + 3. convert color from BGR to HSV + 4. random saturation + 5. random hue + 6. convert color from HSV to BGR + 7. random contrast (mode 1) + 8. randomly swap channels + + Args: + brightness_delta (int): delta of brightness. + contrast_range (tuple): range of contrast. + saturation_range (tuple): range of saturation. + hue_delta (int): delta of hue. + """ + + def __init__(self, + brightness_delta=32, + contrast_range=(0.5, 1.5), + saturation_range=(0.5, 1.5), + hue_delta=18): + self.brightness_delta = brightness_delta + self.contrast_lower, self.contrast_upper = contrast_range + self.saturation_lower, self.saturation_upper = saturation_range + self.hue_delta = hue_delta + + def __call__(self, results): + """Call function to perform photometric distortion on images. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Result dict with images distorted. + """ + + if 'img_fields' in results: + assert results['img_fields'] == ['img'], \ + 'Only single img_fields is allowed' + img = results['img'] + img = img.astype(np.float32) + # random brightness + if random.randint(2): + delta = random.uniform(-self.brightness_delta, + self.brightness_delta) + img += delta + + # mode == 0 --> do random contrast first + # mode == 1 --> do random contrast last + mode = random.randint(2) + if mode == 1: + if random.randint(2): + alpha = random.uniform(self.contrast_lower, + self.contrast_upper) + img *= alpha + + # convert color from BGR to HSV + img = mmcv.bgr2hsv(img) + + # random saturation + if random.randint(2): + img[..., 1] *= random.uniform(self.saturation_lower, + self.saturation_upper) + + # random hue + if random.randint(2): + img[..., 0] += random.uniform(-self.hue_delta, self.hue_delta) + img[..., 0][img[..., 0] > 360] -= 360 + img[..., 0][img[..., 0] < 0] += 360 + + # convert color from HSV to BGR + img = mmcv.hsv2bgr(img) + + # random contrast + if mode == 0: + if random.randint(2): + alpha = random.uniform(self.contrast_lower, + self.contrast_upper) + img *= alpha + + # randomly swap channels + if random.randint(2): + img = img[..., random.permutation(3)] + + results['img'] = img + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(\nbrightness_delta={self.brightness_delta},\n' + repr_str += 'contrast_range=' + repr_str += f'{(self.contrast_lower, self.contrast_upper)},\n' + repr_str += 'saturation_range=' + repr_str += f'{(self.saturation_lower, self.saturation_upper)},\n' + repr_str += f'hue_delta={self.hue_delta})' + return repr_str + + +@PIPELINES.register_module() +class Expand: + """Random expand the image & bboxes. + + Randomly place the original image on a canvas of 'ratio' x original image + size filled with mean values. The ratio is in the range of ratio_range. + + Args: + mean (tuple): mean value of dataset. + to_rgb (bool): if need to convert the order of mean to align with RGB. + ratio_range (tuple): range of expand ratio. + prob (float): probability of applying this transformation + """ + + def __init__(self, + mean=(0, 0, 0), + to_rgb=True, + ratio_range=(1, 4), + seg_ignore_label=None, + prob=0.5): + self.to_rgb = to_rgb + self.ratio_range = ratio_range + if to_rgb: + self.mean = mean[::-1] + else: + self.mean = mean + self.min_ratio, self.max_ratio = ratio_range + self.seg_ignore_label = seg_ignore_label + self.prob = prob + + def __call__(self, results): + """Call function to expand images, bounding boxes. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Result dict with images, bounding boxes expanded + """ + + if random.uniform(0, 1) > self.prob: + return results + + if 'img_fields' in results: + assert results['img_fields'] == ['img'], \ + 'Only single img_fields is allowed' + img = results['img'] + + h, w, c = img.shape + ratio = random.uniform(self.min_ratio, self.max_ratio) + # speedup expand when meets large image + if np.all(self.mean == self.mean[0]): + expand_img = np.empty((int(h * ratio), int(w * ratio), c), + img.dtype) + expand_img.fill(self.mean[0]) + else: + expand_img = np.full((int(h * ratio), int(w * ratio), c), + self.mean, + dtype=img.dtype) + left = int(random.uniform(0, w * ratio - w)) + top = int(random.uniform(0, h * ratio - h)) + expand_img[top:top + h, left:left + w] = img + + results['img'] = expand_img + # expand bboxes + for key in results.get('bbox_fields', []): + results[key] = results[key] + np.tile( + (left, top), 2).astype(results[key].dtype) + + # expand masks + for key in results.get('mask_fields', []): + results[key] = results[key].expand( + int(h * ratio), int(w * ratio), top, left) + + # expand segs + for key in results.get('seg_fields', []): + gt_seg = results[key] + expand_gt_seg = np.full((int(h * ratio), int(w * ratio)), + self.seg_ignore_label, + dtype=gt_seg.dtype) + expand_gt_seg[top:top + h, left:left + w] = gt_seg + results[key] = expand_gt_seg + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(mean={self.mean}, to_rgb={self.to_rgb}, ' + repr_str += f'ratio_range={self.ratio_range}, ' + repr_str += f'seg_ignore_label={self.seg_ignore_label})' + return repr_str + + +@PIPELINES.register_module() +class MinIoURandomCrop: + """Random crop the image & bboxes, the cropped patches have minimum IoU + requirement with original image & bboxes, the IoU threshold is randomly + selected from min_ious. + + Args: + min_ious (tuple): minimum IoU threshold for all intersections with + bounding boxes + min_crop_size (float): minimum crop's size (i.e. h,w := a*h, a*w, + where a >= min_crop_size). + bbox_clip_border (bool, optional): Whether clip the objects outside + the border of the image. Defaults to True. + + Note: + The keys for bboxes, labels and masks should be paired. That is, \ + `gt_bboxes` corresponds to `gt_labels` and `gt_masks`, and \ + `gt_bboxes_ignore` to `gt_labels_ignore` and `gt_masks_ignore`. + """ + + def __init__(self, + min_ious=(0.1, 0.3, 0.5, 0.7, 0.9), + min_crop_size=0.3, + bbox_clip_border=True): + # 1: return ori img + self.min_ious = min_ious + self.sample_mode = (1, *min_ious, 0) + self.min_crop_size = min_crop_size + self.bbox_clip_border = bbox_clip_border + self.bbox2label = { + 'gt_bboxes': 'gt_labels', + 'gt_bboxes_ignore': 'gt_labels_ignore' + } + self.bbox2mask = { + 'gt_bboxes': 'gt_masks', + 'gt_bboxes_ignore': 'gt_masks_ignore' + } + + def __call__(self, results): + """Call function to crop images and bounding boxes with minimum IoU + constraint. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Result dict with images and bounding boxes cropped, \ + 'img_shape' key is updated. + """ + + if 'img_fields' in results: + assert results['img_fields'] == ['img'], \ + 'Only single img_fields is allowed' + img = results['img'] + assert 'bbox_fields' in results + boxes = [results[key] for key in results['bbox_fields']] + boxes = np.concatenate(boxes, 0) + h, w, c = img.shape + while True: + mode = random.choice(self.sample_mode) + self.mode = mode + if mode == 1: + return results + + min_iou = mode + for i in range(50): + new_w = random.uniform(self.min_crop_size * w, w) + new_h = random.uniform(self.min_crop_size * h, h) + + # h / w in [0.5, 2] + if new_h / new_w < 0.5 or new_h / new_w > 2: + continue + + left = random.uniform(w - new_w) + top = random.uniform(h - new_h) + + patch = np.array( + (int(left), int(top), int(left + new_w), int(top + new_h))) + # Line or point crop is not allowed + if patch[2] == patch[0] or patch[3] == patch[1]: + continue + overlaps = bbox_overlaps( + patch.reshape(-1, 4), boxes.reshape(-1, 4)).reshape(-1) + if len(overlaps) > 0 and overlaps.min() < min_iou: + continue + + # center of boxes should inside the crop img + # only adjust boxes and instance masks when the gt is not empty + if len(overlaps) > 0: + # adjust boxes + def is_center_of_bboxes_in_patch(boxes, patch): + center = (boxes[:, :2] + boxes[:, 2:]) / 2 + mask = ((center[:, 0] > patch[0]) * + (center[:, 1] > patch[1]) * + (center[:, 0] < patch[2]) * + (center[:, 1] < patch[3])) + return mask + + mask = is_center_of_bboxes_in_patch(boxes, patch) + if not mask.any(): + continue + for key in results.get('bbox_fields', []): + boxes = results[key].copy() + mask = is_center_of_bboxes_in_patch(boxes, patch) + boxes = boxes[mask] + if self.bbox_clip_border: + boxes[:, 2:] = boxes[:, 2:].clip(max=patch[2:]) + boxes[:, :2] = boxes[:, :2].clip(min=patch[:2]) + boxes -= np.tile(patch[:2], 2) + + results[key] = boxes + # labels + label_key = self.bbox2label.get(key) + if label_key in results: + results[label_key] = results[label_key][mask] + + # mask fields + mask_key = self.bbox2mask.get(key) + if mask_key in results: + results[mask_key] = results[mask_key][ + mask.nonzero()[0]].crop(patch) + # adjust the img no matter whether the gt is empty before crop + img = img[patch[1]:patch[3], patch[0]:patch[2]] + results['img'] = img + results['img_shape'] = img.shape + + # seg fields + for key in results.get('seg_fields', []): + results[key] = results[key][patch[1]:patch[3], + patch[0]:patch[2]] + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(min_ious={self.min_ious}, ' + repr_str += f'min_crop_size={self.min_crop_size}, ' + repr_str += f'bbox_clip_border={self.bbox_clip_border})' + return repr_str + + +@PIPELINES.register_module() +class Corrupt: + """Corruption augmentation. + + Corruption transforms implemented based on + `imagecorruptions `_. + + Args: + corruption (str): Corruption name. + severity (int, optional): The severity of corruption. Default: 1. + """ + + def __init__(self, corruption, severity=1): + self.corruption = corruption + self.severity = severity + + def __call__(self, results): + """Call function to corrupt image. + + Args: + results (dict): Result dict from loading pipeline. + + Returns: + dict: Result dict with images corrupted. + """ + + if corrupt is None: + raise RuntimeError('imagecorruptions is not installed') + if 'img_fields' in results: + assert results['img_fields'] == ['img'], \ + 'Only single img_fields is allowed' + results['img'] = corrupt( + results['img'].astype(np.uint8), + corruption_name=self.corruption, + severity=self.severity) + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(corruption={self.corruption}, ' + repr_str += f'severity={self.severity})' + return repr_str + + +@PIPELINES.register_module() +class Albu: + """Albumentation augmentation. + + Adds custom transformations from Albumentations library. + Please, visit `https://albumentations.readthedocs.io` + to get more information. + + An example of ``transforms`` is as followed: + + .. code-block:: + + [ + dict( + type='ShiftScaleRotate', + shift_limit=0.0625, + scale_limit=0.0, + rotate_limit=0, + interpolation=1, + p=0.5), + dict( + type='RandomBrightnessContrast', + brightness_limit=[0.1, 0.3], + contrast_limit=[0.1, 0.3], + p=0.2), + dict(type='ChannelShuffle', p=0.1), + dict( + type='OneOf', + transforms=[ + dict(type='Blur', blur_limit=3, p=1.0), + dict(type='MedianBlur', blur_limit=3, p=1.0) + ], + p=0.1), + ] + + Args: + transforms (list[dict]): A list of albu transformations + bbox_params (dict): Bbox_params for albumentation `Compose` + keymap (dict): Contains {'input key':'albumentation-style key'} + skip_img_without_anno (bool): Whether to skip the image if no ann left + after aug + """ + + def __init__(self, + transforms, + bbox_params=None, + keymap=None, + update_pad_shape=False, + skip_img_without_anno=False): + if Compose is None: + raise RuntimeError('albumentations is not installed') + + # Args will be modified later, copying it will be safer + transforms = copy.deepcopy(transforms) + if bbox_params is not None: + bbox_params = copy.deepcopy(bbox_params) + if keymap is not None: + keymap = copy.deepcopy(keymap) + self.transforms = transforms + self.filter_lost_elements = False + self.update_pad_shape = update_pad_shape + self.skip_img_without_anno = skip_img_without_anno + + # A simple workaround to remove masks without boxes + if (isinstance(bbox_params, dict) and 'label_fields' in bbox_params + and 'filter_lost_elements' in bbox_params): + self.filter_lost_elements = True + self.origin_label_fields = bbox_params['label_fields'] + bbox_params['label_fields'] = ['idx_mapper'] + del bbox_params['filter_lost_elements'] + + self.bbox_params = ( + self.albu_builder(bbox_params) if bbox_params else None) + self.aug = Compose([self.albu_builder(t) for t in self.transforms], + bbox_params=self.bbox_params) + + if not keymap: + self.keymap_to_albu = { + 'img': 'image', + 'gt_masks': 'masks', + 'gt_bboxes': 'bboxes' + } + else: + self.keymap_to_albu = keymap + self.keymap_back = {v: k for k, v in self.keymap_to_albu.items()} + + def albu_builder(self, cfg): + """Import a module from albumentations. + + It inherits some of :func:`build_from_cfg` logic. + + Args: + cfg (dict): Config dict. It should at least contain the key "type". + + Returns: + obj: The constructed object. + """ + + assert isinstance(cfg, dict) and 'type' in cfg + args = cfg.copy() + + obj_type = args.pop('type') + if mmcv.is_str(obj_type): + if albumentations is None: + raise RuntimeError('albumentations is not installed') + obj_cls = getattr(albumentations, obj_type) + elif inspect.isclass(obj_type): + obj_cls = obj_type + else: + raise TypeError( + f'type must be a str or valid type, but got {type(obj_type)}') + + if 'transforms' in args: + args['transforms'] = [ + self.albu_builder(transform) + for transform in args['transforms'] + ] + + return obj_cls(**args) + + @staticmethod + def mapper(d, keymap): + """Dictionary mapper. Renames keys according to keymap provided. + + Args: + d (dict): old dict + keymap (dict): {'old_key':'new_key'} + Returns: + dict: new dict. + """ + + updated_dict = {} + for k, v in zip(d.keys(), d.values()): + new_k = keymap.get(k, k) + updated_dict[new_k] = d[k] + return updated_dict + + def __call__(self, results): + # dict to albumentations format + results = self.mapper(results, self.keymap_to_albu) + # TODO: add bbox_fields + if 'bboxes' in results: + # to list of boxes + if isinstance(results['bboxes'], np.ndarray): + results['bboxes'] = [x for x in results['bboxes']] + # add pseudo-field for filtration + if self.filter_lost_elements: + results['idx_mapper'] = np.arange(len(results['bboxes'])) + + # TODO: Support mask structure in albu + if 'masks' in results: + if isinstance(results['masks'], PolygonMasks): + raise NotImplementedError( + 'Albu only supports BitMap masks now') + ori_masks = results['masks'] + if albumentations.__version__ < '0.5': + results['masks'] = results['masks'].masks + else: + results['masks'] = [mask for mask in results['masks'].masks] + + results = self.aug(**results) + + if 'bboxes' in results: + if isinstance(results['bboxes'], list): + results['bboxes'] = np.array( + results['bboxes'], dtype=np.float32) + results['bboxes'] = results['bboxes'].reshape(-1, 4) + + # filter label_fields + if self.filter_lost_elements: + + for label in self.origin_label_fields: + results[label] = np.array( + [results[label][i] for i in results['idx_mapper']]) + if 'masks' in results: + results['masks'] = np.array( + [results['masks'][i] for i in results['idx_mapper']]) + results['masks'] = ori_masks.__class__( + results['masks'], results['image'].shape[0], + results['image'].shape[1]) + + if (not len(results['idx_mapper']) + and self.skip_img_without_anno): + return None + + if 'gt_labels' in results: + if isinstance(results['gt_labels'], list): + results['gt_labels'] = np.array(results['gt_labels']) + results['gt_labels'] = results['gt_labels'].astype(np.int64) + + # back to the original format + results = self.mapper(results, self.keymap_back) + + # update final shape + if self.update_pad_shape: + results['pad_shape'] = results['img'].shape + + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + f'(transforms={self.transforms})' + return repr_str + + +@PIPELINES.register_module() +class RandomCenterCropPad: + """Random center crop and random around padding for CornerNet. + + This operation generates randomly cropped image from the original image and + pads it simultaneously. Different from :class:`RandomCrop`, the output + shape may not equal to ``crop_size`` strictly. We choose a random value + from ``ratios`` and the output shape could be larger or smaller than + ``crop_size``. The padding operation is also different from :class:`Pad`, + here we use around padding instead of right-bottom padding. + + The relation between output image (padding image) and original image: + + .. code:: text + + output image + + +----------------------------+ + | padded area | + +------|----------------------------|----------+ + | | cropped area | | + | | +---------------+ | | + | | | . center | | | original image + | | | range | | | + | | +---------------+ | | + +------|----------------------------|----------+ + | padded area | + +----------------------------+ + + There are 5 main areas in the figure: + + - output image: output image of this operation, also called padding + image in following instruction. + - original image: input image of this operation. + - padded area: non-intersect area of output image and original image. + - cropped area: the overlap of output image and original image. + - center range: a smaller area where random center chosen from. + center range is computed by ``border`` and original image's shape + to avoid our random center is too close to original image's border. + + Also this operation act differently in train and test mode, the summary + pipeline is listed below. + + Train pipeline: + + 1. Choose a ``random_ratio`` from ``ratios``, the shape of padding image + will be ``random_ratio * crop_size``. + 2. Choose a ``random_center`` in center range. + 3. Generate padding image with center matches the ``random_center``. + 4. Initialize the padding image with pixel value equals to ``mean``. + 5. Copy the cropped area to padding image. + 6. Refine annotations. + + Test pipeline: + + 1. Compute output shape according to ``test_pad_mode``. + 2. Generate padding image with center matches the original image + center. + 3. Initialize the padding image with pixel value equals to ``mean``. + 4. Copy the ``cropped area`` to padding image. + + Args: + crop_size (tuple | None): expected size after crop, final size will + computed according to ratio. Requires (h, w) in train mode, and + None in test mode. + ratios (tuple): random select a ratio from tuple and crop image to + (crop_size[0] * ratio) * (crop_size[1] * ratio). + Only available in train mode. + border (int): max distance from center select area to image border. + Only available in train mode. + mean (sequence): Mean values of 3 channels. + std (sequence): Std values of 3 channels. + to_rgb (bool): Whether to convert the image from BGR to RGB. + test_mode (bool): whether involve random variables in transform. + In train mode, crop_size is fixed, center coords and ratio is + random selected from predefined lists. In test mode, crop_size + is image's original shape, center coords and ratio is fixed. + test_pad_mode (tuple): padding method and padding shape value, only + available in test mode. Default is using 'logical_or' with + 127 as padding shape value. + + - 'logical_or': final_shape = input_shape | padding_shape_value + - 'size_divisor': final_shape = int( + ceil(input_shape / padding_shape_value) * padding_shape_value) + test_pad_add_pix (int): Extra padding pixel in test mode. Default 0. + bbox_clip_border (bool, optional): Whether clip the objects outside + the border of the image. Defaults to True. + """ + + def __init__(self, + crop_size=None, + ratios=(0.9, 1.0, 1.1), + border=128, + mean=None, + std=None, + to_rgb=None, + test_mode=False, + test_pad_mode=('logical_or', 127), + test_pad_add_pix=0, + bbox_clip_border=True): + if test_mode: + assert crop_size is None, 'crop_size must be None in test mode' + assert ratios is None, 'ratios must be None in test mode' + assert border is None, 'border must be None in test mode' + assert isinstance(test_pad_mode, (list, tuple)) + assert test_pad_mode[0] in ['logical_or', 'size_divisor'] + else: + assert isinstance(crop_size, (list, tuple)) + assert crop_size[0] > 0 and crop_size[1] > 0, ( + 'crop_size must > 0 in train mode') + assert isinstance(ratios, (list, tuple)) + assert test_pad_mode is None, ( + 'test_pad_mode must be None in train mode') + + self.crop_size = crop_size + self.ratios = ratios + self.border = border + # We do not set default value to mean, std and to_rgb because these + # hyper-parameters are easy to forget but could affect the performance. + # Please use the same setting as Normalize for performance assurance. + assert mean is not None and std is not None and to_rgb is not None + self.to_rgb = to_rgb + self.input_mean = mean + self.input_std = std + if to_rgb: + self.mean = mean[::-1] + self.std = std[::-1] + else: + self.mean = mean + self.std = std + self.test_mode = test_mode + self.test_pad_mode = test_pad_mode + self.test_pad_add_pix = test_pad_add_pix + self.bbox_clip_border = bbox_clip_border + + def _get_border(self, border, size): + """Get final border for the target size. + + This function generates a ``final_border`` according to image's shape. + The area between ``final_border`` and ``size - final_border`` is the + ``center range``. We randomly choose center from the ``center range`` + to avoid our random center is too close to original image's border. + Also ``center range`` should be larger than 0. + + Args: + border (int): The initial border, default is 128. + size (int): The width or height of original image. + Returns: + int: The final border. + """ + k = 2 * border / size + i = pow(2, np.ceil(np.log2(np.ceil(k))) + (k == int(k))) + return border // i + + def _filter_boxes(self, patch, boxes): + """Check whether the center of each box is in the patch. + + Args: + patch (list[int]): The cropped area, [left, top, right, bottom]. + boxes (numpy array, (N x 4)): Ground truth boxes. + + Returns: + mask (numpy array, (N,)): Each box is inside or outside the patch. + """ + center = (boxes[:, :2] + boxes[:, 2:]) / 2 + mask = (center[:, 0] > patch[0]) * (center[:, 1] > patch[1]) * ( + center[:, 0] < patch[2]) * ( + center[:, 1] < patch[3]) + return mask + + def _crop_image_and_paste(self, image, center, size): + """Crop image with a given center and size, then paste the cropped + image to a blank image with two centers align. + + This function is equivalent to generating a blank image with ``size`` + as its shape. Then cover it on the original image with two centers ( + the center of blank image and the random center of original image) + aligned. The overlap area is paste from the original image and the + outside area is filled with ``mean pixel``. + + Args: + image (np array, H x W x C): Original image. + center (list[int]): Target crop center coord. + size (list[int]): Target crop size. [target_h, target_w] + + Returns: + cropped_img (np array, target_h x target_w x C): Cropped image. + border (np array, 4): The distance of four border of + ``cropped_img`` to the original image area, [top, bottom, + left, right] + patch (list[int]): The cropped area, [left, top, right, bottom]. + """ + center_y, center_x = center + target_h, target_w = size + img_h, img_w, img_c = image.shape + + x0 = max(0, center_x - target_w // 2) + x1 = min(center_x + target_w // 2, img_w) + y0 = max(0, center_y - target_h // 2) + y1 = min(center_y + target_h // 2, img_h) + patch = np.array((int(x0), int(y0), int(x1), int(y1))) + + left, right = center_x - x0, x1 - center_x + top, bottom = center_y - y0, y1 - center_y + + cropped_center_y, cropped_center_x = target_h // 2, target_w // 2 + cropped_img = np.zeros((target_h, target_w, img_c), dtype=image.dtype) + for i in range(img_c): + cropped_img[:, :, i] += self.mean[i] + y_slice = slice(cropped_center_y - top, cropped_center_y + bottom) + x_slice = slice(cropped_center_x - left, cropped_center_x + right) + cropped_img[y_slice, x_slice, :] = image[y0:y1, x0:x1, :] + + border = np.array([ + cropped_center_y - top, cropped_center_y + bottom, + cropped_center_x - left, cropped_center_x + right + ], + dtype=np.float32) + + return cropped_img, border, patch + + def _train_aug(self, results): + """Random crop and around padding the original image. + + Args: + results (dict): Image infomations in the augment pipeline. + + Returns: + results (dict): The updated dict. + """ + img = results['img'] + h, w, c = img.shape + boxes = results['gt_bboxes'] + while True: + scale = random.choice(self.ratios) + new_h = int(self.crop_size[0] * scale) + new_w = int(self.crop_size[1] * scale) + h_border = self._get_border(self.border, h) + w_border = self._get_border(self.border, w) + + for i in range(50): + center_x = random.randint(low=w_border, high=w - w_border) + center_y = random.randint(low=h_border, high=h - h_border) + + cropped_img, border, patch = self._crop_image_and_paste( + img, [center_y, center_x], [new_h, new_w]) + + mask = self._filter_boxes(patch, boxes) + # if image do not have valid bbox, any crop patch is valid. + if not mask.any() and len(boxes) > 0: + continue + + results['img'] = cropped_img + results['img_shape'] = cropped_img.shape + results['pad_shape'] = cropped_img.shape + + x0, y0, x1, y1 = patch + + left_w, top_h = center_x - x0, center_y - y0 + cropped_center_x, cropped_center_y = new_w // 2, new_h // 2 + + # crop bboxes accordingly and clip to the image boundary + for key in results.get('bbox_fields', []): + mask = self._filter_boxes(patch, results[key]) + bboxes = results[key][mask] + bboxes[:, 0:4:2] += cropped_center_x - left_w - x0 + bboxes[:, 1:4:2] += cropped_center_y - top_h - y0 + if self.bbox_clip_border: + bboxes[:, 0:4:2] = np.clip(bboxes[:, 0:4:2], 0, new_w) + bboxes[:, 1:4:2] = np.clip(bboxes[:, 1:4:2], 0, new_h) + keep = (bboxes[:, 2] > bboxes[:, 0]) & ( + bboxes[:, 3] > bboxes[:, 1]) + bboxes = bboxes[keep] + results[key] = bboxes + if key in ['gt_bboxes']: + if 'gt_labels' in results: + labels = results['gt_labels'][mask] + labels = labels[keep] + results['gt_labels'] = labels + if 'gt_masks' in results: + raise NotImplementedError( + 'RandomCenterCropPad only supports bbox.') + + # crop semantic seg + for key in results.get('seg_fields', []): + raise NotImplementedError( + 'RandomCenterCropPad only supports bbox.') + return results + + def _test_aug(self, results): + """Around padding the original image without cropping. + + The padding mode and value are from ``test_pad_mode``. + + Args: + results (dict): Image infomations in the augment pipeline. + + Returns: + results (dict): The updated dict. + """ + img = results['img'] + h, w, c = img.shape + results['img_shape'] = img.shape + if self.test_pad_mode[0] in ['logical_or']: + # self.test_pad_add_pix is only used for centernet + target_h = (h | self.test_pad_mode[1]) + self.test_pad_add_pix + target_w = (w | self.test_pad_mode[1]) + self.test_pad_add_pix + elif self.test_pad_mode[0] in ['size_divisor']: + divisor = self.test_pad_mode[1] + target_h = int(np.ceil(h / divisor)) * divisor + target_w = int(np.ceil(w / divisor)) * divisor + else: + raise NotImplementedError( + 'RandomCenterCropPad only support two testing pad mode:' + 'logical-or and size_divisor.') + + cropped_img, border, _ = self._crop_image_and_paste( + img, [h // 2, w // 2], [target_h, target_w]) + results['img'] = cropped_img + results['pad_shape'] = cropped_img.shape + results['border'] = border + return results + + def __call__(self, results): + img = results['img'] + assert img.dtype == np.float32, ( + 'RandomCenterCropPad needs the input image of dtype np.float32,' + ' please set "to_float32=True" in "LoadImageFromFile" pipeline') + h, w, c = img.shape + assert c == len(self.mean) + if self.test_mode: + return self._test_aug(results) + else: + return self._train_aug(results) + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(crop_size={self.crop_size}, ' + repr_str += f'ratios={self.ratios}, ' + repr_str += f'border={self.border}, ' + repr_str += f'mean={self.input_mean}, ' + repr_str += f'std={self.input_std}, ' + repr_str += f'to_rgb={self.to_rgb}, ' + repr_str += f'test_mode={self.test_mode}, ' + repr_str += f'test_pad_mode={self.test_pad_mode}, ' + repr_str += f'bbox_clip_border={self.bbox_clip_border})' + return repr_str + + +@PIPELINES.register_module() +class CutOut: + """CutOut operation. + + Randomly drop some regions of image used in + `Cutout `_. + + Args: + n_holes (int | tuple[int, int]): Number of regions to be dropped. + If it is given as a list, number of holes will be randomly + selected from the closed interval [`n_holes[0]`, `n_holes[1]`]. + cutout_shape (tuple[int, int] | list[tuple[int, int]]): The candidate + shape of dropped regions. It can be `tuple[int, int]` to use a + fixed cutout shape, or `list[tuple[int, int]]` to randomly choose + shape from the list. + cutout_ratio (tuple[float, float] | list[tuple[float, float]]): The + candidate ratio of dropped regions. It can be `tuple[float, float]` + to use a fixed ratio or `list[tuple[float, float]]` to randomly + choose ratio from the list. Please note that `cutout_shape` + and `cutout_ratio` cannot be both given at the same time. + fill_in (tuple[float, float, float] | tuple[int, int, int]): The value + of pixel to fill in the dropped regions. Default: (0, 0, 0). + """ + + def __init__(self, + n_holes, + cutout_shape=None, + cutout_ratio=None, + fill_in=(0, 0, 0)): + + assert (cutout_shape is None) ^ (cutout_ratio is None), \ + 'Either cutout_shape or cutout_ratio should be specified.' + assert (isinstance(cutout_shape, (list, tuple)) + or isinstance(cutout_ratio, (list, tuple))) + if isinstance(n_holes, tuple): + assert len(n_holes) == 2 and 0 <= n_holes[0] < n_holes[1] + else: + n_holes = (n_holes, n_holes) + self.n_holes = n_holes + self.fill_in = fill_in + self.with_ratio = cutout_ratio is not None + self.candidates = cutout_ratio if self.with_ratio else cutout_shape + if not isinstance(self.candidates, list): + self.candidates = [self.candidates] + + def __call__(self, results): + """Call function to drop some regions of image.""" + h, w, c = results['img'].shape + n_holes = np.random.randint(self.n_holes[0], self.n_holes[1] + 1) + for _ in range(n_holes): + x1 = np.random.randint(0, w) + y1 = np.random.randint(0, h) + index = np.random.randint(0, len(self.candidates)) + if not self.with_ratio: + cutout_w, cutout_h = self.candidates[index] + else: + cutout_w = int(self.candidates[index][0] * w) + cutout_h = int(self.candidates[index][1] * h) + + x2 = np.clip(x1 + cutout_w, 0, w) + y2 = np.clip(y1 + cutout_h, 0, h) + results['img'][y1:y2, x1:x2, :] = self.fill_in + + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(n_holes={self.n_holes}, ' + repr_str += (f'cutout_ratio={self.candidates}, ' if self.with_ratio + else f'cutout_shape={self.candidates}, ') + repr_str += f'fill_in={self.fill_in})' + return repr_str + + +@PIPELINES.register_module() +class Mosaic: + """Mosaic augmentation. + + Given 4 images, mosaic transform combines them into + one output image. The output image is composed of the parts from each sub- + image. + + .. code:: text + + mosaic transform + center_x + +------------------------------+ + | pad | pad | + | +-----------+ | + | | | | + | | image1 |--------+ | + | | | | | + | | | image2 | | + center_y |----+-------------+-----------| + | | cropped | | + |pad | image3 | image4 | + | | | | + +----|-------------+-----------+ + | | + +-------------+ + + The mosaic transform steps are as follows: + + 1. Choose the mosaic center as the intersections of 4 images + 2. Get the left top image according to the index, and randomly + sample another 3 images from the custom dataset. + 3. Sub image will be cropped if image is larger than mosaic patch + + Args: + img_scale (Sequence[int]): Image size after mosaic pipeline of single + image. The shape order should be (height, width). + Default to (640, 640). + center_ratio_range (Sequence[float]): Center ratio range of mosaic + output. Default to (0.5, 1.5). + min_bbox_size (int | float): The minimum pixel for filtering + invalid bboxes after the mosaic pipeline. Default to 0. + bbox_clip_border (bool, optional): Whether to clip the objects outside + the border of the image. In some dataset like MOT17, the gt bboxes + are allowed to cross the border of images. Therefore, we don't + need to clip the gt bboxes in these cases. Defaults to True. + skip_filter (bool): Whether to skip filtering rules. If it + is True, the filter rule will not be applied, and the + `min_bbox_size` is invalid. Default to True. + pad_val (int): Pad value. Default to 114. + prob (float): Probability of applying this transformation. + Default to 1.0. + """ + + def __init__(self, + img_scale=(640, 640), + center_ratio_range=(0.5, 1.5), + min_bbox_size=0, + bbox_clip_border=True, + skip_filter=True, + pad_val=114, + prob=1.0): + assert isinstance(img_scale, tuple) + assert 0 <= prob <= 1.0, 'The probability should be in range [0,1]. '\ + f'got {prob}.' + + log_img_scale(img_scale, skip_square=True) + self.img_scale = img_scale + self.center_ratio_range = center_ratio_range + self.min_bbox_size = min_bbox_size + self.bbox_clip_border = bbox_clip_border + self.skip_filter = skip_filter + self.pad_val = pad_val + self.prob = prob + + def __call__(self, results): + """Call function to make a mosaic of image. + + Args: + results (dict): Result dict. + + Returns: + dict: Result dict with mosaic transformed. + """ + + if random.uniform(0, 1) > self.prob: + return results + + results = self._mosaic_transform(results) + return results + + def get_indexes(self, dataset): + """Call function to collect indexes. + + Args: + dataset (:obj:`MultiImageMixDataset`): The dataset. + + Returns: + list: indexes. + """ + + indexes = [random.randint(0, len(dataset)) for _ in range(3)] + return indexes + + def _mosaic_transform(self, results): + """Mosaic transform function. + + Args: + results (dict): Result dict. + + Returns: + dict: Updated result dict. + """ + + assert 'mix_results' in results + mosaic_labels = [] + mosaic_bboxes = [] + if len(results['img'].shape) == 3: + mosaic_img = np.full( + (int(self.img_scale[0] * 2), int(self.img_scale[1] * 2), 3), + self.pad_val, + dtype=results['img'].dtype) + else: + mosaic_img = np.full( + (int(self.img_scale[0] * 2), int(self.img_scale[1] * 2)), + self.pad_val, + dtype=results['img'].dtype) + + # mosaic center x, y + center_x = int( + random.uniform(*self.center_ratio_range) * self.img_scale[1]) + center_y = int( + random.uniform(*self.center_ratio_range) * self.img_scale[0]) + center_position = (center_x, center_y) + + loc_strs = ('top_left', 'top_right', 'bottom_left', 'bottom_right') + for i, loc in enumerate(loc_strs): + if loc == 'top_left': + results_patch = copy.deepcopy(results) + else: + results_patch = copy.deepcopy(results['mix_results'][i - 1]) + + img_i = results_patch['img'] + h_i, w_i = img_i.shape[:2] + # keep_ratio resize + scale_ratio_i = min(self.img_scale[0] / h_i, + self.img_scale[1] / w_i) + img_i = mmcv.imresize( + img_i, (int(w_i * scale_ratio_i), int(h_i * scale_ratio_i))) + + # compute the combine parameters + paste_coord, crop_coord = self._mosaic_combine( + loc, center_position, img_i.shape[:2][::-1]) + x1_p, y1_p, x2_p, y2_p = paste_coord + x1_c, y1_c, x2_c, y2_c = crop_coord + + # crop and paste image + mosaic_img[y1_p:y2_p, x1_p:x2_p] = img_i[y1_c:y2_c, x1_c:x2_c] + + # adjust coordinate + gt_bboxes_i = results_patch['gt_bboxes'] + gt_labels_i = results_patch['gt_labels'] + + if gt_bboxes_i.shape[0] > 0: + padw = x1_p - x1_c + padh = y1_p - y1_c + gt_bboxes_i[:, 0::2] = \ + scale_ratio_i * gt_bboxes_i[:, 0::2] + padw + gt_bboxes_i[:, 1::2] = \ + scale_ratio_i * gt_bboxes_i[:, 1::2] + padh + + mosaic_bboxes.append(gt_bboxes_i) + mosaic_labels.append(gt_labels_i) + + if len(mosaic_labels) > 0: + mosaic_bboxes = np.concatenate(mosaic_bboxes, 0) + mosaic_labels = np.concatenate(mosaic_labels, 0) + + if self.bbox_clip_border: + mosaic_bboxes[:, 0::2] = np.clip(mosaic_bboxes[:, 0::2], 0, + 2 * self.img_scale[1]) + mosaic_bboxes[:, 1::2] = np.clip(mosaic_bboxes[:, 1::2], 0, + 2 * self.img_scale[0]) + + if not self.skip_filter: + mosaic_bboxes, mosaic_labels = \ + self._filter_box_candidates(mosaic_bboxes, mosaic_labels) + + # remove outside bboxes + inside_inds = find_inside_bboxes(mosaic_bboxes, 2 * self.img_scale[0], + 2 * self.img_scale[1]) + mosaic_bboxes = mosaic_bboxes[inside_inds] + mosaic_labels = mosaic_labels[inside_inds] + + results['img'] = mosaic_img + results['img_shape'] = mosaic_img.shape + results['gt_bboxes'] = mosaic_bboxes + results['gt_labels'] = mosaic_labels + + return results + + def _mosaic_combine(self, loc, center_position_xy, img_shape_wh): + """Calculate global coordinate of mosaic image and local coordinate of + cropped sub-image. + + Args: + loc (str): Index for the sub-image, loc in ('top_left', + 'top_right', 'bottom_left', 'bottom_right'). + center_position_xy (Sequence[float]): Mixing center for 4 images, + (x, y). + img_shape_wh (Sequence[int]): Width and height of sub-image + + Returns: + tuple[tuple[float]]: Corresponding coordinate of pasting and + cropping + - paste_coord (tuple): paste corner coordinate in mosaic image. + - crop_coord (tuple): crop corner coordinate in mosaic image. + """ + assert loc in ('top_left', 'top_right', 'bottom_left', 'bottom_right') + if loc == 'top_left': + # index0 to top left part of image + x1, y1, x2, y2 = max(center_position_xy[0] - img_shape_wh[0], 0), \ + max(center_position_xy[1] - img_shape_wh[1], 0), \ + center_position_xy[0], \ + center_position_xy[1] + crop_coord = img_shape_wh[0] - (x2 - x1), img_shape_wh[1] - ( + y2 - y1), img_shape_wh[0], img_shape_wh[1] + + elif loc == 'top_right': + # index1 to top right part of image + x1, y1, x2, y2 = center_position_xy[0], \ + max(center_position_xy[1] - img_shape_wh[1], 0), \ + min(center_position_xy[0] + img_shape_wh[0], + self.img_scale[1] * 2), \ + center_position_xy[1] + crop_coord = 0, img_shape_wh[1] - (y2 - y1), min( + img_shape_wh[0], x2 - x1), img_shape_wh[1] + + elif loc == 'bottom_left': + # index2 to bottom left part of image + x1, y1, x2, y2 = max(center_position_xy[0] - img_shape_wh[0], 0), \ + center_position_xy[1], \ + center_position_xy[0], \ + min(self.img_scale[0] * 2, center_position_xy[1] + + img_shape_wh[1]) + crop_coord = img_shape_wh[0] - (x2 - x1), 0, img_shape_wh[0], min( + y2 - y1, img_shape_wh[1]) + + else: + # index3 to bottom right part of image + x1, y1, x2, y2 = center_position_xy[0], \ + center_position_xy[1], \ + min(center_position_xy[0] + img_shape_wh[0], + self.img_scale[1] * 2), \ + min(self.img_scale[0] * 2, center_position_xy[1] + + img_shape_wh[1]) + crop_coord = 0, 0, min(img_shape_wh[0], + x2 - x1), min(y2 - y1, img_shape_wh[1]) + + paste_coord = x1, y1, x2, y2 + return paste_coord, crop_coord + + def _filter_box_candidates(self, bboxes, labels): + """Filter out bboxes too small after Mosaic.""" + bbox_w = bboxes[:, 2] - bboxes[:, 0] + bbox_h = bboxes[:, 3] - bboxes[:, 1] + valid_inds = (bbox_w > self.min_bbox_size) & \ + (bbox_h > self.min_bbox_size) + valid_inds = np.nonzero(valid_inds)[0] + return bboxes[valid_inds], labels[valid_inds] + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'img_scale={self.img_scale}, ' + repr_str += f'center_ratio_range={self.center_ratio_range}, ' + repr_str += f'pad_val={self.pad_val}, ' + repr_str += f'min_bbox_size={self.min_bbox_size}, ' + repr_str += f'skip_filter={self.skip_filter})' + return repr_str + + +@PIPELINES.register_module() +class MixUp: + """MixUp data augmentation. + + .. code:: text + + mixup transform + +------------------------------+ + | mixup image | | + | +--------|--------+ | + | | | | | + |---------------+ | | + | | | | + | | image | | + | | | | + | | | | + | |-----------------+ | + | pad | + +------------------------------+ + + The mixup transform steps are as follows: + + 1. Another random image is picked by dataset and embedded in + the top left patch(after padding and resizing) + 2. The target of mixup transform is the weighted average of mixup + image and origin image. + + Args: + img_scale (Sequence[int]): Image output size after mixup pipeline. + The shape order should be (height, width). Default: (640, 640). + ratio_range (Sequence[float]): Scale ratio of mixup image. + Default: (0.5, 1.5). + flip_ratio (float): Horizontal flip ratio of mixup image. + Default: 0.5. + pad_val (int): Pad value. Default: 114. + max_iters (int): The maximum number of iterations. If the number of + iterations is greater than `max_iters`, but gt_bbox is still + empty, then the iteration is terminated. Default: 15. + min_bbox_size (float): Width and height threshold to filter bboxes. + If the height or width of a box is smaller than this value, it + will be removed. Default: 5. + min_area_ratio (float): Threshold of area ratio between + original bboxes and wrapped bboxes. If smaller than this value, + the box will be removed. Default: 0.2. + max_aspect_ratio (float): Aspect ratio of width and height + threshold to filter bboxes. If max(h/w, w/h) larger than this + value, the box will be removed. Default: 20. + bbox_clip_border (bool, optional): Whether to clip the objects outside + the border of the image. In some dataset like MOT17, the gt bboxes + are allowed to cross the border of images. Therefore, we don't + need to clip the gt bboxes in these cases. Defaults to True. + skip_filter (bool): Whether to skip filtering rules. If it + is True, the filter rule will not be applied, and the + `min_bbox_size` and `min_area_ratio` and `max_aspect_ratio` + is invalid. Default to True. + """ + + def __init__(self, + img_scale=(640, 640), + ratio_range=(0.5, 1.5), + flip_ratio=0.5, + pad_val=114, + max_iters=15, + min_bbox_size=5, + min_area_ratio=0.2, + max_aspect_ratio=20, + bbox_clip_border=True, + skip_filter=True): + assert isinstance(img_scale, tuple) + log_img_scale(img_scale, skip_square=True) + self.dynamic_scale = img_scale + self.ratio_range = ratio_range + self.flip_ratio = flip_ratio + self.pad_val = pad_val + self.max_iters = max_iters + self.min_bbox_size = min_bbox_size + self.min_area_ratio = min_area_ratio + self.max_aspect_ratio = max_aspect_ratio + self.bbox_clip_border = bbox_clip_border + self.skip_filter = skip_filter + + def __call__(self, results): + """Call function to make a mixup of image. + + Args: + results (dict): Result dict. + + Returns: + dict: Result dict with mixup transformed. + """ + + results = self._mixup_transform(results) + return results + + def get_indexes(self, dataset): + """Call function to collect indexes. + + Args: + dataset (:obj:`MultiImageMixDataset`): The dataset. + + Returns: + list: indexes. + """ + + for i in range(self.max_iters): + index = random.randint(0, len(dataset)) + gt_bboxes_i = dataset.get_ann_info(index)['bboxes'] + if len(gt_bboxes_i) != 0: + break + + return index + + def _mixup_transform(self, results): + """MixUp transform function. + + Args: + results (dict): Result dict. + + Returns: + dict: Updated result dict. + """ + + assert 'mix_results' in results + assert len( + results['mix_results']) == 1, 'MixUp only support 2 images now !' + + if results['mix_results'][0]['gt_bboxes'].shape[0] == 0: + # empty bbox + return results + + retrieve_results = results['mix_results'][0] + retrieve_img = retrieve_results['img'] + + jit_factor = random.uniform(*self.ratio_range) + is_filp = random.uniform(0, 1) < self.flip_ratio + + if len(retrieve_img.shape) == 3: + out_img = np.ones( + (self.dynamic_scale[0], self.dynamic_scale[1], 3), + dtype=retrieve_img.dtype) * self.pad_val + else: + out_img = np.ones( + self.dynamic_scale, dtype=retrieve_img.dtype) * self.pad_val + + # 1. keep_ratio resize + scale_ratio = min(self.dynamic_scale[0] / retrieve_img.shape[0], + self.dynamic_scale[1] / retrieve_img.shape[1]) + retrieve_img = mmcv.imresize( + retrieve_img, (int(retrieve_img.shape[1] * scale_ratio), + int(retrieve_img.shape[0] * scale_ratio))) + + # 2. paste + out_img[:retrieve_img.shape[0], :retrieve_img.shape[1]] = retrieve_img + + # 3. scale jit + scale_ratio *= jit_factor + out_img = mmcv.imresize(out_img, (int(out_img.shape[1] * jit_factor), + int(out_img.shape[0] * jit_factor))) + + # 4. flip + if is_filp: + out_img = out_img[:, ::-1, :] + + # 5. random crop + ori_img = results['img'] + origin_h, origin_w = out_img.shape[:2] + target_h, target_w = ori_img.shape[:2] + padded_img = np.zeros( + (max(origin_h, target_h), max(origin_w, + target_w), 3)).astype(np.uint8) + padded_img[:origin_h, :origin_w] = out_img + + x_offset, y_offset = 0, 0 + if padded_img.shape[0] > target_h: + y_offset = random.randint(0, padded_img.shape[0] - target_h) + if padded_img.shape[1] > target_w: + x_offset = random.randint(0, padded_img.shape[1] - target_w) + padded_cropped_img = padded_img[y_offset:y_offset + target_h, + x_offset:x_offset + target_w] + + # 6. adjust bbox + retrieve_gt_bboxes = retrieve_results['gt_bboxes'] + retrieve_gt_bboxes[:, 0::2] = retrieve_gt_bboxes[:, 0::2] * scale_ratio + retrieve_gt_bboxes[:, 1::2] = retrieve_gt_bboxes[:, 1::2] * scale_ratio + if self.bbox_clip_border: + retrieve_gt_bboxes[:, 0::2] = np.clip(retrieve_gt_bboxes[:, 0::2], + 0, origin_w) + retrieve_gt_bboxes[:, 1::2] = np.clip(retrieve_gt_bboxes[:, 1::2], + 0, origin_h) + + if is_filp: + retrieve_gt_bboxes[:, 0::2] = ( + origin_w - retrieve_gt_bboxes[:, 0::2][:, ::-1]) + + # 7. filter + cp_retrieve_gt_bboxes = retrieve_gt_bboxes.copy() + cp_retrieve_gt_bboxes[:, 0::2] = \ + cp_retrieve_gt_bboxes[:, 0::2] - x_offset + cp_retrieve_gt_bboxes[:, 1::2] = \ + cp_retrieve_gt_bboxes[:, 1::2] - y_offset + if self.bbox_clip_border: + cp_retrieve_gt_bboxes[:, 0::2] = np.clip( + cp_retrieve_gt_bboxes[:, 0::2], 0, target_w) + cp_retrieve_gt_bboxes[:, 1::2] = np.clip( + cp_retrieve_gt_bboxes[:, 1::2], 0, target_h) + + # 8. mix up + ori_img = ori_img.astype(np.float32) + mixup_img = 0.5 * ori_img + 0.5 * padded_cropped_img.astype(np.float32) + + retrieve_gt_labels = retrieve_results['gt_labels'] + if not self.skip_filter: + keep_list = self._filter_box_candidates(retrieve_gt_bboxes.T, + cp_retrieve_gt_bboxes.T) + + retrieve_gt_labels = retrieve_gt_labels[keep_list] + cp_retrieve_gt_bboxes = cp_retrieve_gt_bboxes[keep_list] + + mixup_gt_bboxes = np.concatenate( + (results['gt_bboxes'], cp_retrieve_gt_bboxes), axis=0) + mixup_gt_labels = np.concatenate( + (results['gt_labels'], retrieve_gt_labels), axis=0) + + # remove outside bbox + inside_inds = find_inside_bboxes(mixup_gt_bboxes, target_h, target_w) + mixup_gt_bboxes = mixup_gt_bboxes[inside_inds] + mixup_gt_labels = mixup_gt_labels[inside_inds] + + results['img'] = mixup_img.astype(np.uint8) + results['img_shape'] = mixup_img.shape + results['gt_bboxes'] = mixup_gt_bboxes + results['gt_labels'] = mixup_gt_labels + + return results + + def _filter_box_candidates(self, bbox1, bbox2): + """Compute candidate boxes which include following 5 things: + + bbox1 before augment, bbox2 after augment, min_bbox_size (pixels), + min_area_ratio, max_aspect_ratio. + """ + + w1, h1 = bbox1[2] - bbox1[0], bbox1[3] - bbox1[1] + w2, h2 = bbox2[2] - bbox2[0], bbox2[3] - bbox2[1] + ar = np.maximum(w2 / (h2 + 1e-16), h2 / (w2 + 1e-16)) + return ((w2 > self.min_bbox_size) + & (h2 > self.min_bbox_size) + & (w2 * h2 / (w1 * h1 + 1e-16) > self.min_area_ratio) + & (ar < self.max_aspect_ratio)) + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'dynamic_scale={self.dynamic_scale}, ' + repr_str += f'ratio_range={self.ratio_range}, ' + repr_str += f'flip_ratio={self.flip_ratio}, ' + repr_str += f'pad_val={self.pad_val}, ' + repr_str += f'max_iters={self.max_iters}, ' + repr_str += f'min_bbox_size={self.min_bbox_size}, ' + repr_str += f'min_area_ratio={self.min_area_ratio}, ' + repr_str += f'max_aspect_ratio={self.max_aspect_ratio}, ' + repr_str += f'skip_filter={self.skip_filter})' + return repr_str + + +@PIPELINES.register_module() +class RandomAffine: + """Random affine transform data augmentation. + + This operation randomly generates affine transform matrix which including + rotation, translation, shear and scaling transforms. + + Args: + max_rotate_degree (float): Maximum degrees of rotation transform. + Default: 10. + max_translate_ratio (float): Maximum ratio of translation. + Default: 0.1. + scaling_ratio_range (tuple[float]): Min and max ratio of + scaling transform. Default: (0.5, 1.5). + max_shear_degree (float): Maximum degrees of shear + transform. Default: 2. + border (tuple[int]): Distance from height and width sides of input + image to adjust output shape. Only used in mosaic dataset. + Default: (0, 0). + border_val (tuple[int]): Border padding values of 3 channels. + Default: (114, 114, 114). + min_bbox_size (float): Width and height threshold to filter bboxes. + If the height or width of a box is smaller than this value, it + will be removed. Default: 2. + min_area_ratio (float): Threshold of area ratio between + original bboxes and wrapped bboxes. If smaller than this value, + the box will be removed. Default: 0.2. + max_aspect_ratio (float): Aspect ratio of width and height + threshold to filter bboxes. If max(h/w, w/h) larger than this + value, the box will be removed. + bbox_clip_border (bool, optional): Whether to clip the objects outside + the border of the image. In some dataset like MOT17, the gt bboxes + are allowed to cross the border of images. Therefore, we don't + need to clip the gt bboxes in these cases. Defaults to True. + skip_filter (bool): Whether to skip filtering rules. If it + is True, the filter rule will not be applied, and the + `min_bbox_size` and `min_area_ratio` and `max_aspect_ratio` + is invalid. Default to True. + """ + + def __init__(self, + max_rotate_degree=10.0, + max_translate_ratio=0.1, + scaling_ratio_range=(0.5, 1.5), + max_shear_degree=2.0, + border=(0, 0), + border_val=(114, 114, 114), + min_bbox_size=2, + min_area_ratio=0.2, + max_aspect_ratio=20, + bbox_clip_border=True, + skip_filter=True): + assert 0 <= max_translate_ratio <= 1 + assert scaling_ratio_range[0] <= scaling_ratio_range[1] + assert scaling_ratio_range[0] > 0 + self.max_rotate_degree = max_rotate_degree + self.max_translate_ratio = max_translate_ratio + self.scaling_ratio_range = scaling_ratio_range + self.max_shear_degree = max_shear_degree + self.border = border + self.border_val = border_val + self.min_bbox_size = min_bbox_size + self.min_area_ratio = min_area_ratio + self.max_aspect_ratio = max_aspect_ratio + self.bbox_clip_border = bbox_clip_border + self.skip_filter = skip_filter + + def __call__(self, results): + img = results['img'] + height = img.shape[0] + self.border[0] * 2 + width = img.shape[1] + self.border[1] * 2 + + # Rotation + rotation_degree = random.uniform(-self.max_rotate_degree, + self.max_rotate_degree) + rotation_matrix = self._get_rotation_matrix(rotation_degree) + + # Scaling + scaling_ratio = random.uniform(self.scaling_ratio_range[0], + self.scaling_ratio_range[1]) + scaling_matrix = self._get_scaling_matrix(scaling_ratio) + + # Shear + x_degree = random.uniform(-self.max_shear_degree, + self.max_shear_degree) + y_degree = random.uniform(-self.max_shear_degree, + self.max_shear_degree) + shear_matrix = self._get_shear_matrix(x_degree, y_degree) + + # Translation + trans_x = random.uniform(-self.max_translate_ratio, + self.max_translate_ratio) * width + trans_y = random.uniform(-self.max_translate_ratio, + self.max_translate_ratio) * height + translate_matrix = self._get_translation_matrix(trans_x, trans_y) + + warp_matrix = ( + translate_matrix @ shear_matrix @ rotation_matrix @ scaling_matrix) + + img = cv2.warpPerspective( + img, + warp_matrix, + dsize=(width, height), + borderValue=self.border_val) + results['img'] = img + results['img_shape'] = img.shape + + for key in results.get('bbox_fields', []): + bboxes = results[key] + num_bboxes = len(bboxes) + if num_bboxes: + # homogeneous coordinates + xs = bboxes[:, [0, 0, 2, 2]].reshape(num_bboxes * 4) + ys = bboxes[:, [1, 3, 3, 1]].reshape(num_bboxes * 4) + ones = np.ones_like(xs) + points = np.vstack([xs, ys, ones]) + + warp_points = warp_matrix @ points + warp_points = warp_points[:2] / warp_points[2] + xs = warp_points[0].reshape(num_bboxes, 4) + ys = warp_points[1].reshape(num_bboxes, 4) + + warp_bboxes = np.vstack( + (xs.min(1), ys.min(1), xs.max(1), ys.max(1))).T + + if self.bbox_clip_border: + warp_bboxes[:, [0, 2]] = \ + warp_bboxes[:, [0, 2]].clip(0, width) + warp_bboxes[:, [1, 3]] = \ + warp_bboxes[:, [1, 3]].clip(0, height) + + # remove outside bbox + valid_index = find_inside_bboxes(warp_bboxes, height, width) + if not self.skip_filter: + # filter bboxes + filter_index = self.filter_gt_bboxes( + bboxes * scaling_ratio, warp_bboxes) + valid_index = valid_index & filter_index + + results[key] = warp_bboxes[valid_index] + if key in ['gt_bboxes']: + if 'gt_labels' in results: + results['gt_labels'] = results['gt_labels'][ + valid_index] + + if 'gt_masks' in results: + raise NotImplementedError( + 'RandomAffine only supports bbox.') + return results + + def filter_gt_bboxes(self, origin_bboxes, wrapped_bboxes): + origin_w = origin_bboxes[:, 2] - origin_bboxes[:, 0] + origin_h = origin_bboxes[:, 3] - origin_bboxes[:, 1] + wrapped_w = wrapped_bboxes[:, 2] - wrapped_bboxes[:, 0] + wrapped_h = wrapped_bboxes[:, 3] - wrapped_bboxes[:, 1] + aspect_ratio = np.maximum(wrapped_w / (wrapped_h + 1e-16), + wrapped_h / (wrapped_w + 1e-16)) + + wh_valid_idx = (wrapped_w > self.min_bbox_size) & \ + (wrapped_h > self.min_bbox_size) + area_valid_idx = wrapped_w * wrapped_h / (origin_w * origin_h + + 1e-16) > self.min_area_ratio + aspect_ratio_valid_idx = aspect_ratio < self.max_aspect_ratio + return wh_valid_idx & area_valid_idx & aspect_ratio_valid_idx + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(max_rotate_degree={self.max_rotate_degree}, ' + repr_str += f'max_translate_ratio={self.max_translate_ratio}, ' + repr_str += f'scaling_ratio={self.scaling_ratio_range}, ' + repr_str += f'max_shear_degree={self.max_shear_degree}, ' + repr_str += f'border={self.border}, ' + repr_str += f'border_val={self.border_val}, ' + repr_str += f'min_bbox_size={self.min_bbox_size}, ' + repr_str += f'min_area_ratio={self.min_area_ratio}, ' + repr_str += f'max_aspect_ratio={self.max_aspect_ratio}, ' + repr_str += f'skip_filter={self.skip_filter})' + return repr_str + + @staticmethod + def _get_rotation_matrix(rotate_degrees): + radian = math.radians(rotate_degrees) + rotation_matrix = np.array( + [[np.cos(radian), -np.sin(radian), 0.], + [np.sin(radian), np.cos(radian), 0.], [0., 0., 1.]], + dtype=np.float32) + return rotation_matrix + + @staticmethod + def _get_scaling_matrix(scale_ratio): + scaling_matrix = np.array( + [[scale_ratio, 0., 0.], [0., scale_ratio, 0.], [0., 0., 1.]], + dtype=np.float32) + return scaling_matrix + + @staticmethod + def _get_share_matrix(scale_ratio): + scaling_matrix = np.array( + [[scale_ratio, 0., 0.], [0., scale_ratio, 0.], [0., 0., 1.]], + dtype=np.float32) + return scaling_matrix + + @staticmethod + def _get_shear_matrix(x_shear_degrees, y_shear_degrees): + x_radian = math.radians(x_shear_degrees) + y_radian = math.radians(y_shear_degrees) + shear_matrix = np.array([[1, np.tan(x_radian), 0.], + [np.tan(y_radian), 1, 0.], [0., 0., 1.]], + dtype=np.float32) + return shear_matrix + + @staticmethod + def _get_translation_matrix(x, y): + translation_matrix = np.array([[1, 0., x], [0., 1, y], [0., 0., 1.]], + dtype=np.float32) + return translation_matrix + + +@PIPELINES.register_module() +class YOLOXHSVRandomAug: + """Apply HSV augmentation to image sequentially. It is referenced from + https://github.com/Megvii- + BaseDetection/YOLOX/blob/main/yolox/data/data_augment.py#L21. + + Args: + hue_delta (int): delta of hue. Default: 5. + saturation_delta (int): delta of saturation. Default: 30. + value_delta (int): delat of value. Default: 30. + """ + + def __init__(self, hue_delta=5, saturation_delta=30, value_delta=30): + self.hue_delta = hue_delta + self.saturation_delta = saturation_delta + self.value_delta = value_delta + + def __call__(self, results): + img = results['img'] + hsv_gains = np.random.uniform(-1, 1, 3) * [ + self.hue_delta, self.saturation_delta, self.value_delta + ] + # random selection of h, s, v + hsv_gains *= np.random.randint(0, 2, 3) + # prevent overflow + hsv_gains = hsv_gains.astype(np.int16) + img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV).astype(np.int16) + + img_hsv[..., 0] = (img_hsv[..., 0] + hsv_gains[0]) % 180 + img_hsv[..., 1] = np.clip(img_hsv[..., 1] + hsv_gains[1], 0, 255) + img_hsv[..., 2] = np.clip(img_hsv[..., 2] + hsv_gains[2], 0, 255) + cv2.cvtColor(img_hsv.astype(img.dtype), cv2.COLOR_HSV2BGR, dst=img) + + results['img'] = img + return results + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'(hue_delta={self.hue_delta}, ' + repr_str += f'saturation_delta={self.saturation_delta}, ' + repr_str += f'value_delta={self.value_delta})' + return repr_str + + +@PIPELINES.register_module() +class CopyPaste: + """Simple Copy-Paste is a Strong Data Augmentation Method for Instance + Segmentation The simple copy-paste transform steps are as follows: + + 1. The destination image is already resized with aspect ratio kept, + cropped and padded. + 2. Randomly select a source image, which is also already resized + with aspect ratio kept, cropped and padded in a similar way + as the destination image. + 3. Randomly select some objects from the source image. + 4. Paste these source objects to the destination image directly, + due to the source and destination image have the same size. + 5. Update object masks of the destination image, for some origin objects + may be occluded. + 6. Generate bboxes from the updated destination masks and + filter some objects which are totally occluded, and adjust bboxes + which are partly occluded. + 7. Append selected source bboxes, masks, and labels. + + Args: + max_num_pasted (int): The maximum number of pasted objects. + Default: 100. + bbox_occluded_thr (int): The threshold of occluded bbox. + Default: 10. + mask_occluded_thr (int): The threshold of occluded mask. + Default: 300. + selected (bool): Whether select objects or not. If select is False, + all objects of the source image will be pasted to the + destination image. + Default: True. + """ + + def __init__( + self, + max_num_pasted=100, + bbox_occluded_thr=10, + mask_occluded_thr=300, + selected=True, + ): + self.max_num_pasted = max_num_pasted + self.bbox_occluded_thr = bbox_occluded_thr + self.mask_occluded_thr = mask_occluded_thr + self.selected = selected + self.paste_by_box = False + + def get_indexes(self, dataset): + """Call function to collect indexes.s. + + Args: + dataset (:obj:`MultiImageMixDataset`): The dataset. + Returns: + list: Indexes. + """ + return random.randint(0, len(dataset)) + + def gen_masks_from_bboxes(self, bboxes, img_shape): + """Generate gt_masks based on gt_bboxes. + + Args: + bboxes (list): The bboxes's list. + img_shape (tuple): The shape of image. + Returns: + BitmapMasks + """ + self.paste_by_box = True + img_h, img_w = img_shape[:2] + xmin, ymin = bboxes[:, 0:1], bboxes[:, 1:2] + xmax, ymax = bboxes[:, 2:3], bboxes[:, 3:4] + gt_masks = np.zeros((len(bboxes), img_h, img_w), dtype=np.uint8) + for i in range(len(bboxes)): + gt_masks[i, + int(ymin[i]):int(ymax[i]), + int(xmin[i]):int(xmax[i])] = 1 + return BitmapMasks(gt_masks, img_h, img_w) + + def get_gt_masks(self, results): + """Get gt_masks originally or generated based on bboxes. + + If gt_masks is not contained in results, + it will be generated based on gt_bboxes. + Args: + results (dict): Result dict. + Returns: + BitmapMasks: gt_masks, originally or generated based on bboxes. + """ + if results.get('gt_masks', None) is not None: + return results['gt_masks'] + else: + return self.gen_masks_from_bboxes( + results.get('gt_bboxes', []), results['img'].shape) + + def __call__(self, results): + """Call function to make a copy-paste of image. + + Args: + results (dict): Result dict. + Returns: + dict: Result dict with copy-paste transformed. + """ + + assert 'mix_results' in results + num_images = len(results['mix_results']) + assert num_images == 1, \ + f'CopyPaste only supports processing 2 images, got {num_images}' + + # Get gt_masks originally or generated based on bboxes. + results['gt_masks'] = self.get_gt_masks(results) + # only one mix picture + results['mix_results'][0]['gt_masks'] = self.get_gt_masks( + results['mix_results'][0]) + + if self.selected: + selected_results = self._select_object(results['mix_results'][0]) + else: + selected_results = results['mix_results'][0] + return self._copy_paste(results, selected_results) + + def _select_object(self, results): + """Select some objects from the source results.""" + bboxes = results['gt_bboxes'] + labels = results['gt_labels'] + masks = results['gt_masks'] + max_num_pasted = min(bboxes.shape[0] + 1, self.max_num_pasted) + num_pasted = np.random.randint(0, max_num_pasted) + selected_inds = np.random.choice( + bboxes.shape[0], size=num_pasted, replace=False) + + selected_bboxes = bboxes[selected_inds] + selected_labels = labels[selected_inds] + selected_masks = masks[selected_inds] + + results['gt_bboxes'] = selected_bboxes + results['gt_labels'] = selected_labels + results['gt_masks'] = selected_masks + return results + + def _copy_paste(self, dst_results, src_results): + """CopyPaste transform function. + + Args: + dst_results (dict): Result dict of the destination image. + src_results (dict): Result dict of the source image. + Returns: + dict: Updated result dict. + """ + dst_img = dst_results['img'] + dst_bboxes = dst_results['gt_bboxes'] + dst_labels = dst_results['gt_labels'] + dst_masks = dst_results['gt_masks'] + + src_img = src_results['img'] + src_bboxes = src_results['gt_bboxes'] + src_labels = src_results['gt_labels'] + src_masks = src_results['gt_masks'] + + if len(src_bboxes) == 0: + if self.paste_by_box: + dst_results.pop('gt_masks') + return dst_results + + # update masks and generate bboxes from updated masks + composed_mask = np.where(np.any(src_masks.masks, axis=0), 1, 0) + updated_dst_masks = self.get_updated_masks(dst_masks, composed_mask) + updated_dst_bboxes = updated_dst_masks.get_bboxes() + assert len(updated_dst_bboxes) == len(updated_dst_masks) + + # filter totally occluded objects + bboxes_inds = np.all( + np.abs( + (updated_dst_bboxes - dst_bboxes)) <= self.bbox_occluded_thr, + axis=-1) + masks_inds = updated_dst_masks.masks.sum( + axis=(1, 2)) > self.mask_occluded_thr + valid_inds = bboxes_inds | masks_inds + + # Paste source objects to destination image directly + img = dst_img * (1 - composed_mask[..., np.newaxis] + ) + src_img * composed_mask[..., np.newaxis] + bboxes = np.concatenate([updated_dst_bboxes[valid_inds], src_bboxes]) + labels = np.concatenate([dst_labels[valid_inds], src_labels]) + masks = np.concatenate( + [updated_dst_masks.masks[valid_inds], src_masks.masks]) + + dst_results['img'] = img + dst_results['gt_bboxes'] = bboxes + dst_results['gt_labels'] = labels + if self.paste_by_box: + dst_results.pop('gt_masks') + else: + dst_results['gt_masks'] = BitmapMasks(masks, masks.shape[1], + masks.shape[2]) + + return dst_results + + def get_updated_masks(self, masks, composed_mask): + assert masks.masks.shape[-2:] == composed_mask.shape[-2:], \ + 'Cannot compare two arrays of different size' + masks.masks = np.where(composed_mask, 0, masks.masks) + return masks + + def __repr__(self): + repr_str = self.__class__.__name__ + repr_str += f'max_num_pasted={self.max_num_pasted}, ' + repr_str += f'bbox_occluded_thr={self.bbox_occluded_thr}, ' + repr_str += f'mask_occluded_thr={self.mask_occluded_thr}, ' + repr_str += f'selected={self.selected}, ' + return repr_str diff --git a/mmdet/datasets/samplers/__init__.py b/mmdet/datasets/samplers/__init__.py new file mode 100644 index 0000000..a4c7ea1 --- /dev/null +++ b/mmdet/datasets/samplers/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .class_aware_sampler import ClassAwareSampler +from .distributed_sampler import DistributedSampler +from .group_sampler import DistributedGroupSampler, GroupSampler +from .infinite_sampler import InfiniteBatchSampler, InfiniteGroupBatchSampler + +__all__ = [ + 'DistributedSampler', 'DistributedGroupSampler', 'GroupSampler', + 'InfiniteGroupBatchSampler', 'InfiniteBatchSampler', 'ClassAwareSampler' +] diff --git a/mmdet/datasets/samplers/class_aware_sampler.py b/mmdet/datasets/samplers/class_aware_sampler.py new file mode 100644 index 0000000..c52708e --- /dev/null +++ b/mmdet/datasets/samplers/class_aware_sampler.py @@ -0,0 +1,176 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math + +import torch +from mmcv.runner import get_dist_info +from torch.utils.data import Sampler + +from mmdet.core.utils import sync_random_seed + + +class ClassAwareSampler(Sampler): + r"""Sampler that restricts data loading to the label of the dataset. + + A class-aware sampling strategy to effectively tackle the + non-uniform class distribution. The length of the training data is + consistent with source data. Simple improvements based on `Relay + Backpropagation for Effective Learning of Deep Convolutional + Neural Networks `_ + + The implementation logic is referred to + https://github.com/Sense-X/TSD/blob/master/mmdet/datasets/samplers/distributed_classaware_sampler.py + + Args: + dataset: Dataset used for sampling. + samples_per_gpu (int): When model is :obj:`DistributedDataParallel`, + it is the number of training samples on each GPU. + When model is :obj:`DataParallel`, it is + `num_gpus * samples_per_gpu`. + Default : 1. + num_replicas (optional): Number of processes participating in + distributed training. + rank (optional): Rank of the current process within num_replicas. + seed (int, optional): random seed used to shuffle the sampler if + ``shuffle=True``. This number should be identical across all + processes in the distributed group. Default: 0. + num_sample_class (int): The number of samples taken from each + per-label list. Default: 1 + """ + + def __init__(self, + dataset, + samples_per_gpu=1, + num_replicas=None, + rank=None, + seed=0, + num_sample_class=1): + _rank, _num_replicas = get_dist_info() + if num_replicas is None: + num_replicas = _num_replicas + if rank is None: + rank = _rank + + self.dataset = dataset + self.num_replicas = num_replicas + self.samples_per_gpu = samples_per_gpu + self.rank = rank + self.epoch = 0 + # Must be the same across all workers. If None, will use a + # random seed shared among workers + # (require synchronization among all workers) + self.seed = sync_random_seed(seed) + + # The number of samples taken from each per-label list + assert num_sample_class > 0 and isinstance(num_sample_class, int) + self.num_sample_class = num_sample_class + # Get per-label image list from dataset + assert hasattr(dataset, 'get_cat2imgs'), \ + 'dataset must have `get_cat2imgs` function' + self.cat_dict = dataset.get_cat2imgs() + + self.num_samples = int( + math.ceil( + len(self.dataset) * 1.0 / self.num_replicas / + self.samples_per_gpu)) * self.samples_per_gpu + self.total_size = self.num_samples * self.num_replicas + + # get number of images containing each category + self.num_cat_imgs = [len(x) for x in self.cat_dict.values()] + # filter labels without images + self.valid_cat_inds = [ + i for i, length in enumerate(self.num_cat_imgs) if length != 0 + ] + self.num_classes = len(self.valid_cat_inds) + + def __iter__(self): + # deterministically shuffle based on epoch + g = torch.Generator() + g.manual_seed(self.epoch + self.seed) + + # initialize label list + label_iter_list = RandomCycleIter(self.valid_cat_inds, generator=g) + # initialize each per-label image list + data_iter_dict = dict() + for i in self.valid_cat_inds: + data_iter_dict[i] = RandomCycleIter(self.cat_dict[i], generator=g) + + def gen_cat_img_inds(cls_list, data_dict, num_sample_cls): + """Traverse the categories and extract `num_sample_cls` image + indexes of the corresponding categories one by one.""" + id_indices = [] + for _ in range(len(cls_list)): + cls_idx = next(cls_list) + for _ in range(num_sample_cls): + id = next(data_dict[cls_idx]) + id_indices.append(id) + return id_indices + + # deterministically shuffle based on epoch + num_bins = int( + math.ceil(self.total_size * 1.0 / self.num_classes / + self.num_sample_class)) + indices = [] + for i in range(num_bins): + indices += gen_cat_img_inds(label_iter_list, data_iter_dict, + self.num_sample_class) + + # fix extra samples to make it evenly divisible + if len(indices) >= self.total_size: + indices = indices[:self.total_size] + else: + indices += indices[:(self.total_size - len(indices))] + assert len(indices) == self.total_size + + # subsample + offset = self.num_samples * self.rank + indices = indices[offset:offset + self.num_samples] + assert len(indices) == self.num_samples + + return iter(indices) + + def __len__(self): + return self.num_samples + + def set_epoch(self, epoch): + self.epoch = epoch + + +class RandomCycleIter: + """Shuffle the list and do it again after the list have traversed. + + The implementation logic is referred to + https://github.com/wutong16/DistributionBalancedLoss/blob/master/mllt/datasets/loader/sampler.py + + Example: + >>> label_list = [0, 1, 2, 4, 5] + >>> g = torch.Generator() + >>> g.manual_seed(0) + >>> label_iter_list = RandomCycleIter(label_list, generator=g) + >>> index = next(label_iter_list) + Args: + data (list or ndarray): The data that needs to be shuffled. + generator: An torch.Generator object, which is used in setting the seed + for generating random numbers. + """ # noqa: W605 + + def __init__(self, data, generator=None): + self.data = data + self.length = len(data) + self.index = torch.randperm(self.length, generator=generator).numpy() + self.i = 0 + self.generator = generator + + def __iter__(self): + return self + + def __len__(self): + return len(self.data) + + def __next__(self): + if self.i == self.length: + self.index = torch.randperm( + self.length, generator=self.generator).numpy() + self.i = 0 + idx = self.data[self.index[self.i]] + self.i += 1 + return idx diff --git a/mmdet/datasets/samplers/distributed_sampler.py b/mmdet/datasets/samplers/distributed_sampler.py new file mode 100644 index 0000000..1bc8b7c --- /dev/null +++ b/mmdet/datasets/samplers/distributed_sampler.py @@ -0,0 +1,54 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math + +import torch +from torch.utils.data import DistributedSampler as _DistributedSampler + +from mmdet.core.utils import sync_random_seed +from mmdet.utils import get_device + + +class DistributedSampler(_DistributedSampler): + + def __init__(self, + dataset, + num_replicas=None, + rank=None, + shuffle=True, + seed=0): + super().__init__( + dataset, num_replicas=num_replicas, rank=rank, shuffle=shuffle) + + # In distributed sampling, different ranks should sample + # non-overlapped data in the dataset. Therefore, this function + # is used to make sure that each rank shuffles the data indices + # in the same order based on the same seed. Then different ranks + # could use different indices to select non-overlapped data from the + # same data list. + device = get_device() + self.seed = sync_random_seed(seed, device) + + def __iter__(self): + # deterministically shuffle based on epoch + if self.shuffle: + g = torch.Generator() + # When :attr:`shuffle=True`, this ensures all replicas + # use a different random ordering for each epoch. + # Otherwise, the next iteration of this sampler will + # yield the same ordering. + g.manual_seed(self.epoch + self.seed) + indices = torch.randperm(len(self.dataset), generator=g).tolist() + else: + indices = torch.arange(len(self.dataset)).tolist() + + # add extra samples to make it evenly divisible + # in case that indices is shorter than half of total_size + indices = (indices * + math.ceil(self.total_size / len(indices)))[:self.total_size] + assert len(indices) == self.total_size + + # subsample + indices = indices[self.rank:self.total_size:self.num_replicas] + assert len(indices) == self.num_samples + + return iter(indices) diff --git a/mmdet/datasets/samplers/group_sampler.py b/mmdet/datasets/samplers/group_sampler.py new file mode 100644 index 0000000..783d2b2 --- /dev/null +++ b/mmdet/datasets/samplers/group_sampler.py @@ -0,0 +1,148 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math + +import numpy as np +import torch +from mmcv.runner import get_dist_info +from torch.utils.data import Sampler + + +class GroupSampler(Sampler): + + def __init__(self, dataset, samples_per_gpu=1): + assert hasattr(dataset, 'flag') + self.dataset = dataset + self.samples_per_gpu = samples_per_gpu + self.flag = dataset.flag.astype(np.int64) + self.group_sizes = np.bincount(self.flag) + self.num_samples = 0 + for i, size in enumerate(self.group_sizes): + self.num_samples += int(np.ceil( + size / self.samples_per_gpu)) * self.samples_per_gpu + + def __iter__(self): + indices = [] + for i, size in enumerate(self.group_sizes): + if size == 0: + continue + indice = np.where(self.flag == i)[0] + assert len(indice) == size + np.random.shuffle(indice) + num_extra = int(np.ceil(size / self.samples_per_gpu) + ) * self.samples_per_gpu - len(indice) + indice = np.concatenate( + [indice, np.random.choice(indice, num_extra)]) + indices.append(indice) + indices = np.concatenate(indices) + indices = [ + indices[i * self.samples_per_gpu:(i + 1) * self.samples_per_gpu] + for i in np.random.permutation( + range(len(indices) // self.samples_per_gpu)) + ] + indices = np.concatenate(indices) + indices = indices.astype(np.int64).tolist() + assert len(indices) == self.num_samples + return iter(indices) + + def __len__(self): + return self.num_samples + + +class DistributedGroupSampler(Sampler): + """Sampler that restricts data loading to a subset of the dataset. + + It is especially useful in conjunction with + :class:`torch.nn.parallel.DistributedDataParallel`. In such case, each + process can pass a DistributedSampler instance as a DataLoader sampler, + and load a subset of the original dataset that is exclusive to it. + + .. note:: + Dataset is assumed to be of constant size. + + Arguments: + dataset: Dataset used for sampling. + num_replicas (optional): Number of processes participating in + distributed training. + rank (optional): Rank of the current process within num_replicas. + seed (int, optional): random seed used to shuffle the sampler if + ``shuffle=True``. This number should be identical across all + processes in the distributed group. Default: 0. + """ + + def __init__(self, + dataset, + samples_per_gpu=1, + num_replicas=None, + rank=None, + seed=0): + _rank, _num_replicas = get_dist_info() + if num_replicas is None: + num_replicas = _num_replicas + if rank is None: + rank = _rank + self.dataset = dataset + self.samples_per_gpu = samples_per_gpu + self.num_replicas = num_replicas + self.rank = rank + self.epoch = 0 + self.seed = seed if seed is not None else 0 + + assert hasattr(self.dataset, 'flag') + self.flag = self.dataset.flag + self.group_sizes = np.bincount(self.flag) + + self.num_samples = 0 + for i, j in enumerate(self.group_sizes): + self.num_samples += int( + math.ceil(self.group_sizes[i] * 1.0 / self.samples_per_gpu / + self.num_replicas)) * self.samples_per_gpu + self.total_size = self.num_samples * self.num_replicas + + def __iter__(self): + # deterministically shuffle based on epoch + g = torch.Generator() + g.manual_seed(self.epoch + self.seed) + + indices = [] + for i, size in enumerate(self.group_sizes): + if size > 0: + indice = np.where(self.flag == i)[0] + assert len(indice) == size + # add .numpy() to avoid bug when selecting indice in parrots. + # TODO: check whether torch.randperm() can be replaced by + # numpy.random.permutation(). + indice = indice[list( + torch.randperm(int(size), generator=g).numpy())].tolist() + extra = int( + math.ceil( + size * 1.0 / self.samples_per_gpu / self.num_replicas) + ) * self.samples_per_gpu * self.num_replicas - len(indice) + # pad indice + tmp = indice.copy() + for _ in range(extra // size): + indice.extend(tmp) + indice.extend(tmp[:extra % size]) + indices.extend(indice) + + assert len(indices) == self.total_size + + indices = [ + indices[j] for i in list( + torch.randperm( + len(indices) // self.samples_per_gpu, generator=g)) + for j in range(i * self.samples_per_gpu, (i + 1) * + self.samples_per_gpu) + ] + + # subsample + offset = self.num_samples * self.rank + indices = indices[offset:offset + self.num_samples] + assert len(indices) == self.num_samples + + return iter(indices) + + def __len__(self): + return self.num_samples + + def set_epoch(self, epoch): + self.epoch = epoch diff --git a/mmdet/datasets/samplers/infinite_sampler.py b/mmdet/datasets/samplers/infinite_sampler.py new file mode 100644 index 0000000..d42487e --- /dev/null +++ b/mmdet/datasets/samplers/infinite_sampler.py @@ -0,0 +1,186 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import itertools + +import numpy as np +import torch +from mmcv.runner import get_dist_info +from torch.utils.data.sampler import Sampler + +from mmdet.core.utils import sync_random_seed + + +class InfiniteGroupBatchSampler(Sampler): + """Similar to `BatchSampler` warping a `GroupSampler. It is designed for + iteration-based runners like `IterBasedRunner` and yields a mini-batch + indices each time, all indices in a batch should be in the same group. + + The implementation logic is referred to + https://github.com/facebookresearch/detectron2/blob/main/detectron2/data/samplers/grouped_batch_sampler.py + + Args: + dataset (object): The dataset. + batch_size (int): When model is :obj:`DistributedDataParallel`, + it is the number of training samples on each GPU. + When model is :obj:`DataParallel`, it is + `num_gpus * samples_per_gpu`. + Default : 1. + world_size (int, optional): Number of processes participating in + distributed training. Default: None. + rank (int, optional): Rank of current process. Default: None. + seed (int): Random seed. Default: 0. + shuffle (bool): Whether shuffle the indices of a dummy `epoch`, it + should be noted that `shuffle` can not guarantee that you can + generate sequential indices because it need to ensure + that all indices in a batch is in a group. Default: True. + """ # noqa: W605 + + def __init__(self, + dataset, + batch_size=1, + world_size=None, + rank=None, + seed=0, + shuffle=True): + _rank, _world_size = get_dist_info() + if world_size is None: + world_size = _world_size + if rank is None: + rank = _rank + self.rank = rank + self.world_size = world_size + self.dataset = dataset + self.batch_size = batch_size + # In distributed sampling, different ranks should sample + # non-overlapped data in the dataset. Therefore, this function + # is used to make sure that each rank shuffles the data indices + # in the same order based on the same seed. Then different ranks + # could use different indices to select non-overlapped data from the + # same data list. + self.seed = sync_random_seed(seed) + self.shuffle = shuffle + + assert hasattr(self.dataset, 'flag') + self.flag = self.dataset.flag + self.group_sizes = np.bincount(self.flag) + # buffer used to save indices of each group + self.buffer_per_group = {k: [] for k in range(len(self.group_sizes))} + + self.size = len(dataset) + self.indices = self._indices_of_rank() + + def _infinite_indices(self): + """Infinitely yield a sequence of indices.""" + g = torch.Generator() + g.manual_seed(self.seed) + while True: + if self.shuffle: + yield from torch.randperm(self.size, generator=g).tolist() + + else: + yield from torch.arange(self.size).tolist() + + def _indices_of_rank(self): + """Slice the infinite indices by rank.""" + yield from itertools.islice(self._infinite_indices(), self.rank, None, + self.world_size) + + def __iter__(self): + # once batch size is reached, yield the indices + for idx in self.indices: + flag = self.flag[idx] + group_buffer = self.buffer_per_group[flag] + group_buffer.append(idx) + if len(group_buffer) == self.batch_size: + yield group_buffer[:] + del group_buffer[:] + + def __len__(self): + """Length of base dataset.""" + return self.size + + def set_epoch(self, epoch): + """Not supported in `IterationBased` runner.""" + raise NotImplementedError + + +class InfiniteBatchSampler(Sampler): + """Similar to `BatchSampler` warping a `DistributedSampler. It is designed + iteration-based runners like `IterBasedRunner` and yields a mini-batch + indices each time. + + The implementation logic is referred to + https://github.com/facebookresearch/detectron2/blob/main/detectron2/data/samplers/grouped_batch_sampler.py + + Args: + dataset (object): The dataset. + batch_size (int): When model is :obj:`DistributedDataParallel`, + it is the number of training samples on each GPU, + When model is :obj:`DataParallel`, it is + `num_gpus * samples_per_gpu`. + Default : 1. + world_size (int, optional): Number of processes participating in + distributed training. Default: None. + rank (int, optional): Rank of current process. Default: None. + seed (int): Random seed. Default: 0. + shuffle (bool): Whether shuffle the dataset or not. Default: True. + """ # noqa: W605 + + def __init__(self, + dataset, + batch_size=1, + world_size=None, + rank=None, + seed=0, + shuffle=True): + _rank, _world_size = get_dist_info() + if world_size is None: + world_size = _world_size + if rank is None: + rank = _rank + self.rank = rank + self.world_size = world_size + self.dataset = dataset + self.batch_size = batch_size + # In distributed sampling, different ranks should sample + # non-overlapped data in the dataset. Therefore, this function + # is used to make sure that each rank shuffles the data indices + # in the same order based on the same seed. Then different ranks + # could use different indices to select non-overlapped data from the + # same data list. + self.seed = sync_random_seed(seed) + self.shuffle = shuffle + self.size = len(dataset) + self.indices = self._indices_of_rank() + + def _infinite_indices(self): + """Infinitely yield a sequence of indices.""" + g = torch.Generator() + g.manual_seed(self.seed) + while True: + if self.shuffle: + yield from torch.randperm(self.size, generator=g).tolist() + + else: + yield from torch.arange(self.size).tolist() + + def _indices_of_rank(self): + """Slice the infinite indices by rank.""" + yield from itertools.islice(self._infinite_indices(), self.rank, None, + self.world_size) + + def __iter__(self): + # once batch size is reached, yield the indices + batch_buffer = [] + for idx in self.indices: + batch_buffer.append(idx) + if len(batch_buffer) == self.batch_size: + yield batch_buffer + batch_buffer = [] + + def __len__(self): + """Length of base dataset.""" + return self.size + + def set_epoch(self, epoch): + """Not supported in `IterationBased` runner.""" + raise NotImplementedError diff --git a/mmdet/datasets/utils.py b/mmdet/datasets/utils.py new file mode 100644 index 0000000..17ec73b --- /dev/null +++ b/mmdet/datasets/utils.py @@ -0,0 +1,166 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy +import warnings + +from mmcv.cnn import VGG +from mmcv.runner.hooks import HOOKS, Hook + +from mmdet.datasets.builder import PIPELINES +from mmdet.datasets.pipelines import (LoadAnnotations, LoadImageFromFile, + LoadPanopticAnnotations) +from mmdet.models.dense_heads import GARPNHead, RPNHead +from mmdet.models.roi_heads.mask_heads import FusedSemanticHead +from torch.fx.graph_module import GraphModule + +def replace_ImageToTensor(pipelines): + """Replace the ImageToTensor transform in a data pipeline to + DefaultFormatBundle, which is normally useful in batch inference. + + Args: + pipelines (list[dict]): Data pipeline configs. + + Returns: + list: The new pipeline list with all ImageToTensor replaced by + DefaultFormatBundle. + + Examples: + >>> pipelines = [ + ... dict(type='LoadImageFromFile'), + ... dict( + ... type='MultiScaleFlipAug', + ... img_scale=(1333, 800), + ... flip=False, + ... transforms=[ + ... dict(type='Resize', keep_ratio=True), + ... dict(type='RandomFlip'), + ... dict(type='Normalize', mean=[0, 0, 0], std=[1, 1, 1]), + ... dict(type='Pad', size_divisor=32), + ... dict(type='ImageToTensor', keys=['img']), + ... dict(type='Collect', keys=['img']), + ... ]) + ... ] + >>> expected_pipelines = [ + ... dict(type='LoadImageFromFile'), + ... dict( + ... type='MultiScaleFlipAug', + ... img_scale=(1333, 800), + ... flip=False, + ... transforms=[ + ... dict(type='Resize', keep_ratio=True), + ... dict(type='RandomFlip'), + ... dict(type='Normalize', mean=[0, 0, 0], std=[1, 1, 1]), + ... dict(type='Pad', size_divisor=32), + ... dict(type='DefaultFormatBundle'), + ... dict(type='Collect', keys=['img']), + ... ]) + ... ] + >>> assert expected_pipelines == replace_ImageToTensor(pipelines) + """ + pipelines = copy.deepcopy(pipelines) + for i, pipeline in enumerate(pipelines): + if pipeline['type'] == 'MultiScaleFlipAug': + assert 'transforms' in pipeline + pipeline['transforms'] = replace_ImageToTensor( + pipeline['transforms']) + elif pipeline['type'] == 'ImageToTensor': + warnings.warn( + '"ImageToTensor" pipeline is replaced by ' + '"DefaultFormatBundle" for batch inference. It is ' + 'recommended to manually replace it in the test ' + 'data pipeline in your config file.', UserWarning) + pipelines[i] = {'type': 'DefaultFormatBundle'} + return pipelines + + +def get_loading_pipeline(pipeline): + """Only keep loading image and annotations related configuration. + + Args: + pipeline (list[dict]): Data pipeline configs. + + Returns: + list[dict]: The new pipeline list with only keep + loading image and annotations related configuration. + + Examples: + >>> pipelines = [ + ... dict(type='LoadImageFromFile'), + ... dict(type='LoadAnnotations', with_bbox=True), + ... dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + ... dict(type='RandomFlip', flip_ratio=0.5), + ... dict(type='Normalize', **img_norm_cfg), + ... dict(type='Pad', size_divisor=32), + ... dict(type='DefaultFormatBundle'), + ... dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) + ... ] + >>> expected_pipelines = [ + ... dict(type='LoadImageFromFile'), + ... dict(type='LoadAnnotations', with_bbox=True) + ... ] + >>> assert expected_pipelines ==\ + ... get_loading_pipeline(pipelines) + """ + loading_pipeline_cfg = [] + for cfg in pipeline: + obj_cls = PIPELINES.get(cfg['type']) + # TODO:use more elegant way to distinguish loading modules + if obj_cls is not None and obj_cls in (LoadImageFromFile, + LoadAnnotations, + LoadPanopticAnnotations): + loading_pipeline_cfg.append(cfg) + assert len(loading_pipeline_cfg) == 2, \ + 'The data pipeline in your config file must include ' \ + 'loading image and annotations related pipeline.' + return loading_pipeline_cfg + + +@HOOKS.register_module() +class NumClassCheckHook(Hook): + + def _check_head(self, runner): + """Check whether the `num_classes` in head matches the length of + `CLASSES` in `dataset`. + + Args: + runner (obj:`EpochBasedRunner`): Epoch based Runner. + """ + model = runner.model + dataset = runner.data_loader.dataset + if dataset.CLASSES is None: + runner.logger.warning( + f'Please set `CLASSES` ' + f'in the {dataset.__class__.__name__} and' + f'check if it is consistent with the `num_classes` ' + f'of head') + else: + assert type(dataset.CLASSES) is not str, \ + (f'`CLASSES` in {dataset.__class__.__name__}' + f'should be a tuple of str.' + f'Add comma if number of classes is 1 as ' + f'CLASSES = ({dataset.CLASSES},)') + for name, module in model.named_modules(): + if hasattr(module, 'num_classes') and not isinstance( + module, (RPNHead, VGG, FusedSemanticHead, GARPNHead, GraphModule)): + assert module.num_classes == len(dataset.CLASSES), \ + (f'The `num_classes` ({module.num_classes}) in ' + f'{module.__class__.__name__} of ' + f'{model.__class__.__name__} does not matches ' + f'the length of `CLASSES` ' + f'{len(dataset.CLASSES)}) in ' + f'{dataset.__class__.__name__}') + + def before_train_epoch(self, runner): + """Check whether the training dataset is compatible with head. + + Args: + runner (obj:`EpochBasedRunner`): Epoch based Runner. + """ + self._check_head(runner) + + def before_val_epoch(self, runner): + """Check whether the dataset in val epoch is compatible with head. + + Args: + runner (obj:`EpochBasedRunner`): Epoch based Runner. + """ + self._check_head(runner) diff --git a/mmdet/datasets/voc.py b/mmdet/datasets/voc.py new file mode 100644 index 0000000..0a3ea7a --- /dev/null +++ b/mmdet/datasets/voc.py @@ -0,0 +1,112 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from collections import OrderedDict + +from mmcv.utils import print_log + +from mmdet.core import eval_map, eval_recalls +from .builder import DATASETS +from .xml_style import XMLDataset + + +@DATASETS.register_module() +class VOCDataset(XMLDataset): + + CLASSES = ('aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', + 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', + 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', + 'tvmonitor') + + PALETTE = [(106, 0, 228), (119, 11, 32), (165, 42, 42), (0, 0, 192), + (197, 226, 255), (0, 60, 100), (0, 0, 142), (255, 77, 255), + (153, 69, 1), (120, 166, 157), (0, 182, 199), (0, 226, 252), + (182, 182, 255), (0, 0, 230), (220, 20, 60), (163, 255, 0), + (0, 82, 0), (3, 95, 161), (0, 80, 100), (183, 130, 88)] + + def __init__(self, **kwargs): + super(VOCDataset, self).__init__(**kwargs) + if 'VOC2007' in self.img_prefix: + self.year = 2007 + elif 'VOC2012' in self.img_prefix: + self.year = 2012 + else: + raise ValueError('Cannot infer dataset year from img_prefix') + + def evaluate(self, + results, + metric='mAP', + logger=None, + proposal_nums=(100, 300, 1000), + iou_thr=0.5, + scale_ranges=None): + """Evaluate in VOC protocol. + + Args: + results (list[list | tuple]): Testing results of the dataset. + metric (str | list[str]): Metrics to be evaluated. Options are + 'mAP', 'recall'. + logger (logging.Logger | str, optional): Logger used for printing + related information during evaluation. Default: None. + proposal_nums (Sequence[int]): Proposal number used for evaluating + recalls, such as recall@100, recall@1000. + Default: (100, 300, 1000). + iou_thr (float | list[float]): IoU threshold. Default: 0.5. + scale_ranges (list[tuple], optional): Scale ranges for evaluating + mAP. If not specified, all bounding boxes would be included in + evaluation. Default: None. + + Returns: + dict[str, float]: AP/recall metrics. + """ + + if not isinstance(metric, str): + assert len(metric) == 1 + metric = metric[0] + allowed_metrics = ['mAP', 'recall'] + if metric not in allowed_metrics: + raise KeyError(f'metric {metric} is not supported') + annotations = [self.get_ann_info(i) for i in range(len(self))] + eval_results = OrderedDict() + iou_thrs = [iou_thr] if isinstance(iou_thr, float) else iou_thr + if metric == 'mAP': + assert isinstance(iou_thrs, list) + if self.year == 2007: + ds_name = 'voc07' + else: + ds_name = self.CLASSES + mean_aps = [] + for iou_thr in iou_thrs: + print_log(f'\n{"-" * 15}iou_thr: {iou_thr}{"-" * 15}') + # Follow the official implementation, + # http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCdevkit_18-May-2011.tar + # we should use the legacy coordinate system in mmdet 1.x, + # which means w, h should be computed as 'x2 - x1 + 1` and + # `y2 - y1 + 1` + mean_ap, _ = eval_map( + results, + annotations, + scale_ranges=None, + iou_thr=iou_thr, + dataset=ds_name, + logger=logger, + use_legacy_coordinate=True) + mean_aps.append(mean_ap) + eval_results[f'AP{int(iou_thr * 100):02d}'] = round(mean_ap, 3) + eval_results['mAP'] = sum(mean_aps) / len(mean_aps) + eval_results.move_to_end('mAP', last=False) + elif metric == 'recall': + gt_bboxes = [ann['bboxes'] for ann in annotations] + recalls = eval_recalls( + gt_bboxes, + results, + proposal_nums, + iou_thrs, + logger=logger, + use_legacy_coordinate=True) + for i, num in enumerate(proposal_nums): + for j, iou_thr in enumerate(iou_thrs): + eval_results[f'recall@{num}@{iou_thr}'] = recalls[i, j] + if recalls.shape[1] > 1: + ar = recalls.mean(axis=1) + for i, num in enumerate(proposal_nums): + eval_results[f'AR@{num}'] = ar[i] + return eval_results diff --git a/mmdet/datasets/wider_face.py b/mmdet/datasets/wider_face.py new file mode 100644 index 0000000..85a5fdc --- /dev/null +++ b/mmdet/datasets/wider_face.py @@ -0,0 +1,54 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +import xml.etree.ElementTree as ET + +import mmcv + +from .builder import DATASETS +from .xml_style import XMLDataset + + +@DATASETS.register_module() +class WIDERFaceDataset(XMLDataset): + """Reader for the WIDER Face dataset in PASCAL VOC format. + + Conversion scripts can be found in + https://github.com/sovrasov/wider-face-pascal-voc-annotations + """ + CLASSES = ('face', ) + + PALETTE = [(0, 255, 0)] + + def __init__(self, **kwargs): + super(WIDERFaceDataset, self).__init__(**kwargs) + + def load_annotations(self, ann_file): + """Load annotation from WIDERFace XML style annotation file. + + Args: + ann_file (str): Path of XML file. + + Returns: + list[dict]: Annotation info from XML file. + """ + + data_infos = [] + img_ids = mmcv.list_from_file(ann_file) + for img_id in img_ids: + filename = f'{img_id}.jpg' + xml_path = osp.join(self.img_prefix, 'Annotations', + f'{img_id}.xml') + tree = ET.parse(xml_path) + root = tree.getroot() + size = root.find('size') + width = int(size.find('width').text) + height = int(size.find('height').text) + folder = root.find('folder').text + data_infos.append( + dict( + id=img_id, + filename=osp.join(folder, filename), + width=width, + height=height)) + + return data_infos diff --git a/mmdet/datasets/xml_style.py b/mmdet/datasets/xml_style.py new file mode 100644 index 0000000..039d5d7 --- /dev/null +++ b/mmdet/datasets/xml_style.py @@ -0,0 +1,178 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +import xml.etree.ElementTree as ET + +import mmcv +import numpy as np +from PIL import Image + +from .builder import DATASETS +from .custom import CustomDataset + + +@DATASETS.register_module() +class XMLDataset(CustomDataset): + """XML dataset for detection. + + Args: + min_size (int | float, optional): The minimum size of bounding + boxes in the images. If the size of a bounding box is less than + ``min_size``, it would be add to ignored field. + img_subdir (str): Subdir where images are stored. Default: JPEGImages. + ann_subdir (str): Subdir where annotations are. Default: Annotations. + """ + + def __init__(self, + min_size=None, + img_subdir='JPEGImages', + ann_subdir='Annotations', + **kwargs): + assert self.CLASSES or kwargs.get( + 'classes', None), 'CLASSES in `XMLDataset` can not be None.' + self.img_subdir = img_subdir + self.ann_subdir = ann_subdir + super(XMLDataset, self).__init__(**kwargs) + self.cat2label = {cat: i for i, cat in enumerate(self.CLASSES)} + self.min_size = min_size + + def load_annotations(self, ann_file): + """Load annotation from XML style ann_file. + + Args: + ann_file (str): Path of XML file. + + Returns: + list[dict]: Annotation info from XML file. + """ + + data_infos = [] + img_ids = mmcv.list_from_file(ann_file) + for img_id in img_ids: + filename = osp.join(self.img_subdir, f'{img_id}.jpg') + xml_path = osp.join(self.img_prefix, self.ann_subdir, + f'{img_id}.xml') + tree = ET.parse(xml_path) + root = tree.getroot() + size = root.find('size') + if size is not None: + width = int(size.find('width').text) + height = int(size.find('height').text) + else: + img_path = osp.join(self.img_prefix, filename) + img = Image.open(img_path) + width, height = img.size + data_infos.append( + dict(id=img_id, filename=filename, width=width, height=height)) + + return data_infos + + def _filter_imgs(self, min_size=32): + """Filter images too small or without annotation.""" + valid_inds = [] + for i, img_info in enumerate(self.data_infos): + if min(img_info['width'], img_info['height']) < min_size: + continue + if self.filter_empty_gt: + img_id = img_info['id'] + xml_path = osp.join(self.img_prefix, self.ann_subdir, + f'{img_id}.xml') + tree = ET.parse(xml_path) + root = tree.getroot() + for obj in root.findall('object'): + name = obj.find('name').text + if name in self.CLASSES: + valid_inds.append(i) + break + else: + valid_inds.append(i) + return valid_inds + + def get_ann_info(self, idx): + """Get annotation from XML file by index. + + Args: + idx (int): Index of data. + + Returns: + dict: Annotation info of specified index. + """ + + img_id = self.data_infos[idx]['id'] + xml_path = osp.join(self.img_prefix, self.ann_subdir, f'{img_id}.xml') + tree = ET.parse(xml_path) + root = tree.getroot() + bboxes = [] + labels = [] + bboxes_ignore = [] + labels_ignore = [] + for obj in root.findall('object'): + name = obj.find('name').text + if name not in self.CLASSES: + continue + label = self.cat2label[name] + difficult = obj.find('difficult') + difficult = 0 if difficult is None else int(difficult.text) + bnd_box = obj.find('bndbox') + # TODO: check whether it is necessary to use int + # Coordinates may be float type + bbox = [ + int(float(bnd_box.find('xmin').text)), + int(float(bnd_box.find('ymin').text)), + int(float(bnd_box.find('xmax').text)), + int(float(bnd_box.find('ymax').text)) + ] + ignore = False + if self.min_size: + assert not self.test_mode + w = bbox[2] - bbox[0] + h = bbox[3] - bbox[1] + if w < self.min_size or h < self.min_size: + ignore = True + if difficult or ignore: + bboxes_ignore.append(bbox) + labels_ignore.append(label) + else: + bboxes.append(bbox) + labels.append(label) + if not bboxes: + bboxes = np.zeros((0, 4)) + labels = np.zeros((0, )) + else: + bboxes = np.array(bboxes, ndmin=2) - 1 + labels = np.array(labels) + if not bboxes_ignore: + bboxes_ignore = np.zeros((0, 4)) + labels_ignore = np.zeros((0, )) + else: + bboxes_ignore = np.array(bboxes_ignore, ndmin=2) - 1 + labels_ignore = np.array(labels_ignore) + ann = dict( + bboxes=bboxes.astype(np.float32), + labels=labels.astype(np.int64), + bboxes_ignore=bboxes_ignore.astype(np.float32), + labels_ignore=labels_ignore.astype(np.int64)) + return ann + + def get_cat_ids(self, idx): + """Get category ids in XML file by index. + + Args: + idx (int): Index of data. + + Returns: + list[int]: All categories in the image of specified index. + """ + + cat_ids = [] + img_id = self.data_infos[idx]['id'] + xml_path = osp.join(self.img_prefix, self.ann_subdir, f'{img_id}.xml') + tree = ET.parse(xml_path) + root = tree.getroot() + for obj in root.findall('object'): + name = obj.find('name').text + if name not in self.CLASSES: + continue + label = self.cat2label[name] + cat_ids.append(label) + + return cat_ids diff --git a/mmdet/models/__init__.py b/mmdet/models/__init__.py new file mode 100644 index 0000000..12efb01 --- /dev/null +++ b/mmdet/models/__init__.py @@ -0,0 +1,19 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .backbones import * # noqa: F401,F403 +from .builder import (BACKBONES, DETECTORS, HEADS, LOSSES, NECKS, + ROI_EXTRACTORS, SHARED_HEADS, build_backbone, + build_detector, build_head, build_loss, build_neck, + build_roi_extractor, build_shared_head) +from .dense_heads import * # noqa: F401,F403 +from .detectors import * # noqa: F401,F403 +from .losses import * # noqa: F401,F403 +from .necks import * # noqa: F401,F403 +from .plugins import * # noqa: F401,F403 +from .roi_heads import * # noqa: F401,F403 +from .seg_heads import * # noqa: F401,F403 + +__all__ = [ + 'BACKBONES', 'NECKS', 'ROI_EXTRACTORS', 'SHARED_HEADS', 'HEADS', 'LOSSES', + 'DETECTORS', 'build_backbone', 'build_neck', 'build_roi_extractor', + 'build_shared_head', 'build_head', 'build_loss', 'build_detector' +] diff --git a/mmdet/models/backbones/__init__.py b/mmdet/models/backbones/__init__.py new file mode 100644 index 0000000..91b50d2 --- /dev/null +++ b/mmdet/models/backbones/__init__.py @@ -0,0 +1,26 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .csp_darknet import CSPDarknet +from .darknet import Darknet +from .detectors_resnet import DetectoRS_ResNet +from .detectors_resnext import DetectoRS_ResNeXt +from .efficientnet import EfficientNet +from .hourglass import HourglassNet +from .hrnet import HRNet +from .mobilenet_v2 import MobileNetV2 +from .pvt import PyramidVisionTransformer, PyramidVisionTransformerV2 +from .regnet import RegNet +from .res2net import Res2Net +from .resnest import ResNeSt +from .resnet import ResNet, ResNetV1d +from .resnext import ResNeXt +from .ssd_vgg import SSDVGG +from .swin import SwinTransformer +from .trident_resnet import TridentResNet + +__all__ = [ + 'RegNet', 'ResNet', 'ResNetV1d', 'ResNeXt', 'SSDVGG', 'HRNet', + 'MobileNetV2', 'Res2Net', 'HourglassNet', 'DetectoRS_ResNet', + 'DetectoRS_ResNeXt', 'Darknet', 'ResNeSt', 'TridentResNet', 'CSPDarknet', + 'SwinTransformer', 'PyramidVisionTransformer', + 'PyramidVisionTransformerV2', 'EfficientNet' +] diff --git a/mmdet/models/backbones/csp_darknet.py b/mmdet/models/backbones/csp_darknet.py new file mode 100644 index 0000000..2bbf396 --- /dev/null +++ b/mmdet/models/backbones/csp_darknet.py @@ -0,0 +1,284 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math + +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule +from mmcv.runner import BaseModule +from torch.nn.modules.batchnorm import _BatchNorm + +from ..builder import BACKBONES +from ..utils import CSPLayer + + +class Focus(nn.Module): + """Focus width and height information into channel space. + + Args: + in_channels (int): The input channels of this Module. + out_channels (int): The output channels of this Module. + kernel_size (int): The kernel size of the convolution. Default: 1 + stride (int): The stride of the convolution. Default: 1 + conv_cfg (dict): Config dict for convolution layer. Default: None, + which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN', momentum=0.03, eps=0.001). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='Swish'). + """ + + def __init__(self, + in_channels, + out_channels, + kernel_size=1, + stride=1, + conv_cfg=None, + norm_cfg=dict(type='BN', momentum=0.03, eps=0.001), + act_cfg=dict(type='Swish')): + super().__init__() + self.conv = ConvModule( + in_channels * 4, + out_channels, + kernel_size, + stride, + padding=(kernel_size - 1) // 2, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + def forward(self, x): + # shape of x (b,c,w,h) -> y(b,4c,w/2,h/2) + patch_top_left = x[..., ::2, ::2] + patch_top_right = x[..., ::2, 1::2] + patch_bot_left = x[..., 1::2, ::2] + patch_bot_right = x[..., 1::2, 1::2] + x = torch.cat( + ( + patch_top_left, + patch_bot_left, + patch_top_right, + patch_bot_right, + ), + dim=1, + ) + return self.conv(x) + + +class SPPBottleneck(BaseModule): + """Spatial pyramid pooling layer used in YOLOv3-SPP. + + Args: + in_channels (int): The input channels of this Module. + out_channels (int): The output channels of this Module. + kernel_sizes (tuple[int]): Sequential of kernel sizes of pooling + layers. Default: (5, 9, 13). + conv_cfg (dict): Config dict for convolution layer. Default: None, + which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='Swish'). + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + """ + + def __init__(self, + in_channels, + out_channels, + kernel_sizes=(5, 9, 13), + conv_cfg=None, + norm_cfg=dict(type='BN', momentum=0.03, eps=0.001), + act_cfg=dict(type='Swish'), + init_cfg=None): + super().__init__(init_cfg) + mid_channels = in_channels // 2 + self.conv1 = ConvModule( + in_channels, + mid_channels, + 1, + stride=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.poolings = nn.ModuleList([ + nn.MaxPool2d(kernel_size=ks, stride=1, padding=ks // 2) + for ks in kernel_sizes + ]) + conv2_channels = mid_channels * (len(kernel_sizes) + 1) + self.conv2 = ConvModule( + conv2_channels, + out_channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + def forward(self, x): + x = self.conv1(x) + x = torch.cat([x] + [pooling(x) for pooling in self.poolings], dim=1) + x = self.conv2(x) + return x + + +@BACKBONES.register_module() +class CSPDarknet(BaseModule): + """CSP-Darknet backbone used in YOLOv5 and YOLOX. + + Args: + arch (str): Architecture of CSP-Darknet, from {P5, P6}. + Default: P5. + deepen_factor (float): Depth multiplier, multiply number of + blocks in CSP layer by this amount. Default: 1.0. + widen_factor (float): Width multiplier, multiply number of + channels in each layer by this amount. Default: 1.0. + out_indices (Sequence[int]): Output from which stages. + Default: (2, 3, 4). + frozen_stages (int): Stages to be frozen (stop grad and set eval + mode). -1 means not freezing any parameters. Default: -1. + use_depthwise (bool): Whether to use depthwise separable convolution. + Default: False. + arch_ovewrite(list): Overwrite default arch settings. Default: None. + spp_kernal_sizes: (tuple[int]): Sequential of kernel sizes of SPP + layers. Default: (5, 9, 13). + conv_cfg (dict): Config dict for convolution layer. Default: None. + norm_cfg (dict): Dictionary to construct and config norm layer. + Default: dict(type='BN', requires_grad=True). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='LeakyReLU', negative_slope=0.1). + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + Example: + >>> from mmdet.models import CSPDarknet + >>> import torch + >>> self = CSPDarknet(depth=53) + >>> self.eval() + >>> inputs = torch.rand(1, 3, 416, 416) + >>> level_outputs = self.forward(inputs) + >>> for level_out in level_outputs: + ... print(tuple(level_out.shape)) + ... + (1, 256, 52, 52) + (1, 512, 26, 26) + (1, 1024, 13, 13) + """ + # From left to right: + # in_channels, out_channels, num_blocks, add_identity, use_spp + arch_settings = { + 'P5': [[64, 128, 3, True, False], [128, 256, 9, True, False], + [256, 512, 9, True, False], [512, 1024, 3, False, True]], + 'P6': [[64, 128, 3, True, False], [128, 256, 9, True, False], + [256, 512, 9, True, False], [512, 768, 3, True, False], + [768, 1024, 3, False, True]] + } + + def __init__(self, + arch='P5', + deepen_factor=1.0, + widen_factor=1.0, + out_indices=(2, 3, 4), + frozen_stages=-1, + use_depthwise=False, + arch_ovewrite=None, + spp_kernal_sizes=(5, 9, 13), + conv_cfg=None, + norm_cfg=dict(type='BN', momentum=0.03, eps=0.001), + act_cfg=dict(type='Swish'), + norm_eval=False, + init_cfg=dict( + type='Kaiming', + layer='Conv2d', + a=math.sqrt(5), + distribution='uniform', + mode='fan_in', + nonlinearity='leaky_relu')): + super().__init__(init_cfg) + arch_setting = self.arch_settings[arch] + if arch_ovewrite: + arch_setting = arch_ovewrite + assert set(out_indices).issubset( + i for i in range(len(arch_setting) + 1)) + if frozen_stages not in range(-1, len(arch_setting) + 1): + raise ValueError('frozen_stages must be in range(-1, ' + 'len(arch_setting) + 1). But received ' + f'{frozen_stages}') + + self.out_indices = out_indices + self.frozen_stages = frozen_stages + self.use_depthwise = use_depthwise + self.norm_eval = norm_eval + conv = DepthwiseSeparableConvModule if use_depthwise else ConvModule + + self.stem = Focus( + 3, + int(arch_setting[0][0] * widen_factor), + kernel_size=3, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.layers = ['stem'] + + for i, (in_channels, out_channels, num_blocks, add_identity, + use_spp) in enumerate(arch_setting): + in_channels = int(in_channels * widen_factor) + out_channels = int(out_channels * widen_factor) + num_blocks = max(round(num_blocks * deepen_factor), 1) + stage = [] + conv_layer = conv( + in_channels, + out_channels, + 3, + stride=2, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + stage.append(conv_layer) + if use_spp: + spp = SPPBottleneck( + out_channels, + out_channels, + kernel_sizes=spp_kernal_sizes, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + stage.append(spp) + csp_layer = CSPLayer( + out_channels, + out_channels, + num_blocks=num_blocks, + add_identity=add_identity, + use_depthwise=use_depthwise, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + stage.append(csp_layer) + self.add_module(f'stage{i + 1}', nn.Sequential(*stage)) + self.layers.append(f'stage{i + 1}') + + def _freeze_stages(self): + if self.frozen_stages >= 0: + for i in range(self.frozen_stages + 1): + m = getattr(self, self.layers[i]) + m.eval() + for param in m.parameters(): + param.requires_grad = False + + def train(self, mode=True): + super(CSPDarknet, self).train(mode) + self._freeze_stages() + if mode and self.norm_eval: + for m in self.modules(): + if isinstance(m, _BatchNorm): + m.eval() + + def forward(self, x): + outs = [] + for i, layer_name in enumerate(self.layers): + layer = getattr(self, layer_name) + x = layer(x) + if i in self.out_indices: + outs.append(x) + return tuple(outs) diff --git a/mmdet/models/backbones/darknet.py b/mmdet/models/backbones/darknet.py new file mode 100644 index 0000000..adfb115 --- /dev/null +++ b/mmdet/models/backbones/darknet.py @@ -0,0 +1,213 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# Copyright (c) 2019 Western Digital Corporation or its affiliates. + +import warnings + +import torch.nn as nn +from mmcv.cnn import ConvModule +from mmcv.runner import BaseModule +from torch.nn.modules.batchnorm import _BatchNorm + +from ..builder import BACKBONES + + +class ResBlock(BaseModule): + """The basic residual block used in Darknet. Each ResBlock consists of two + ConvModules and the input is added to the final output. Each ConvModule is + composed of Conv, BN, and LeakyReLU. In YoloV3 paper, the first convLayer + has half of the number of the filters as much as the second convLayer. The + first convLayer has filter size of 1x1 and the second one has the filter + size of 3x3. + + Args: + in_channels (int): The input channels. Must be even. + conv_cfg (dict): Config dict for convolution layer. Default: None. + norm_cfg (dict): Dictionary to construct and config norm layer. + Default: dict(type='BN', requires_grad=True) + act_cfg (dict): Config dict for activation layer. + Default: dict(type='LeakyReLU', negative_slope=0.1). + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + in_channels, + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + act_cfg=dict(type='LeakyReLU', negative_slope=0.1), + init_cfg=None): + super(ResBlock, self).__init__(init_cfg) + assert in_channels % 2 == 0 # ensure the in_channels is even + half_in_channels = in_channels // 2 + + # shortcut + cfg = dict(conv_cfg=conv_cfg, norm_cfg=norm_cfg, act_cfg=act_cfg) + + self.conv1 = ConvModule(in_channels, half_in_channels, 1, **cfg) + self.conv2 = ConvModule( + half_in_channels, in_channels, 3, padding=1, **cfg) + + def forward(self, x): + residual = x + out = self.conv1(x) + out = self.conv2(out) + out = out + residual + + return out + + +@BACKBONES.register_module() +class Darknet(BaseModule): + """Darknet backbone. + + Args: + depth (int): Depth of Darknet. Currently only support 53. + out_indices (Sequence[int]): Output from which stages. + frozen_stages (int): Stages to be frozen (stop grad and set eval mode). + -1 means not freezing any parameters. Default: -1. + conv_cfg (dict): Config dict for convolution layer. Default: None. + norm_cfg (dict): Dictionary to construct and config norm layer. + Default: dict(type='BN', requires_grad=True) + act_cfg (dict): Config dict for activation layer. + Default: dict(type='LeakyReLU', negative_slope=0.1). + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. + pretrained (str, optional): model pretrained path. Default: None + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + + Example: + >>> from mmdet.models import Darknet + >>> import torch + >>> self = Darknet(depth=53) + >>> self.eval() + >>> inputs = torch.rand(1, 3, 416, 416) + >>> level_outputs = self.forward(inputs) + >>> for level_out in level_outputs: + ... print(tuple(level_out.shape)) + ... + (1, 256, 52, 52) + (1, 512, 26, 26) + (1, 1024, 13, 13) + """ + + # Dict(depth: (layers, channels)) + arch_settings = { + 53: ((1, 2, 8, 8, 4), ((32, 64), (64, 128), (128, 256), (256, 512), + (512, 1024))) + } + + def __init__(self, + depth=53, + out_indices=(3, 4, 5), + frozen_stages=-1, + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + act_cfg=dict(type='LeakyReLU', negative_slope=0.1), + norm_eval=True, + pretrained=None, + init_cfg=None): + super(Darknet, self).__init__(init_cfg) + if depth not in self.arch_settings: + raise KeyError(f'invalid depth {depth} for darknet') + + self.depth = depth + self.out_indices = out_indices + self.frozen_stages = frozen_stages + self.layers, self.channels = self.arch_settings[depth] + + cfg = dict(conv_cfg=conv_cfg, norm_cfg=norm_cfg, act_cfg=act_cfg) + + self.conv1 = ConvModule(3, 32, 3, padding=1, **cfg) + + self.cr_blocks = ['conv1'] + for i, n_layers in enumerate(self.layers): + layer_name = f'conv_res_block{i + 1}' + in_c, out_c = self.channels[i] + self.add_module( + layer_name, + self.make_conv_res_block(in_c, out_c, n_layers, **cfg)) + self.cr_blocks.append(layer_name) + + self.norm_eval = norm_eval + + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be specified at the same time' + if isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is deprecated, ' + 'please use "init_cfg" instead') + self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is None: + if init_cfg is None: + self.init_cfg = [ + dict(type='Kaiming', layer='Conv2d'), + dict( + type='Constant', + val=1, + layer=['_BatchNorm', 'GroupNorm']) + ] + else: + raise TypeError('pretrained must be a str or None') + + def forward(self, x): + outs = [] + for i, layer_name in enumerate(self.cr_blocks): + cr_block = getattr(self, layer_name) + x = cr_block(x) + if i in self.out_indices: + outs.append(x) + + return tuple(outs) + + def _freeze_stages(self): + if self.frozen_stages >= 0: + for i in range(self.frozen_stages): + m = getattr(self, self.cr_blocks[i]) + m.eval() + for param in m.parameters(): + param.requires_grad = False + + def train(self, mode=True): + super(Darknet, self).train(mode) + self._freeze_stages() + if mode and self.norm_eval: + for m in self.modules(): + if isinstance(m, _BatchNorm): + m.eval() + + @staticmethod + def make_conv_res_block(in_channels, + out_channels, + res_repeat, + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + act_cfg=dict(type='LeakyReLU', + negative_slope=0.1)): + """In Darknet backbone, ConvLayer is usually followed by ResBlock. This + function will make that. The Conv layers always have 3x3 filters with + stride=2. The number of the filters in Conv layer is the same as the + out channels of the ResBlock. + + Args: + in_channels (int): The number of input channels. + out_channels (int): The number of output channels. + res_repeat (int): The number of ResBlocks. + conv_cfg (dict): Config dict for convolution layer. Default: None. + norm_cfg (dict): Dictionary to construct and config norm layer. + Default: dict(type='BN', requires_grad=True) + act_cfg (dict): Config dict for activation layer. + Default: dict(type='LeakyReLU', negative_slope=0.1). + """ + + cfg = dict(conv_cfg=conv_cfg, norm_cfg=norm_cfg, act_cfg=act_cfg) + + model = nn.Sequential() + model.add_module( + 'conv', + ConvModule( + in_channels, out_channels, 3, stride=2, padding=1, **cfg)) + for idx in range(res_repeat): + model.add_module('res{}'.format(idx), + ResBlock(out_channels, **cfg)) + return model diff --git a/mmdet/models/backbones/detectors_resnet.py b/mmdet/models/backbones/detectors_resnet.py new file mode 100644 index 0000000..a3c0d40 --- /dev/null +++ b/mmdet/models/backbones/detectors_resnet.py @@ -0,0 +1,353 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +import torch.utils.checkpoint as cp +from mmcv.cnn import (build_conv_layer, build_norm_layer, constant_init, + kaiming_init) +from mmcv.runner import Sequential, load_checkpoint +from torch.nn.modules.batchnorm import _BatchNorm + +from mmdet.utils import get_root_logger +from ..builder import BACKBONES +from .resnet import BasicBlock +from .resnet import Bottleneck as _Bottleneck +from .resnet import ResNet + + +class Bottleneck(_Bottleneck): + r"""Bottleneck for the ResNet backbone in `DetectoRS + `_. + + This bottleneck allows the users to specify whether to use + SAC (Switchable Atrous Convolution) and RFP (Recursive Feature Pyramid). + + Args: + inplanes (int): The number of input channels. + planes (int): The number of output channels before expansion. + rfp_inplanes (int, optional): The number of channels from RFP. + Default: None. If specified, an additional conv layer will be + added for ``rfp_feat``. Otherwise, the structure is the same as + base class. + sac (dict, optional): Dictionary to construct SAC. Default: None. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + expansion = 4 + + def __init__(self, + inplanes, + planes, + rfp_inplanes=None, + sac=None, + init_cfg=None, + **kwargs): + super(Bottleneck, self).__init__( + inplanes, planes, init_cfg=init_cfg, **kwargs) + + assert sac is None or isinstance(sac, dict) + self.sac = sac + self.with_sac = sac is not None + if self.with_sac: + self.conv2 = build_conv_layer( + self.sac, + planes, + planes, + kernel_size=3, + stride=self.conv2_stride, + padding=self.dilation, + dilation=self.dilation, + bias=False) + + self.rfp_inplanes = rfp_inplanes + if self.rfp_inplanes: + self.rfp_conv = build_conv_layer( + None, + self.rfp_inplanes, + planes * self.expansion, + 1, + stride=1, + bias=True) + if init_cfg is None: + self.init_cfg = dict( + type='Constant', val=0, override=dict(name='rfp_conv')) + + def rfp_forward(self, x, rfp_feat): + """The forward function that also takes the RFP features as input.""" + + def _inner_forward(x): + identity = x + + out = self.conv1(x) + out = self.norm1(out) + out = self.relu(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv1_plugin_names) + + out = self.conv2(out) + out = self.norm2(out) + out = self.relu(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv2_plugin_names) + + out = self.conv3(out) + out = self.norm3(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv3_plugin_names) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + if self.rfp_inplanes: + rfp_feat = self.rfp_conv(rfp_feat) + out = out + rfp_feat + + out = self.relu(out) + + return out + + +class ResLayer(Sequential): + """ResLayer to build ResNet style backbone for RPF in detectoRS. + + The difference between this module and base class is that we pass + ``rfp_inplanes`` to the first block. + + Args: + block (nn.Module): block used to build ResLayer. + inplanes (int): inplanes of block. + planes (int): planes of block. + num_blocks (int): number of blocks. + stride (int): stride of the first block. Default: 1 + avg_down (bool): Use AvgPool instead of stride conv when + downsampling in the bottleneck. Default: False + conv_cfg (dict): dictionary to construct and config conv layer. + Default: None + norm_cfg (dict): dictionary to construct and config norm layer. + Default: dict(type='BN') + downsample_first (bool): Downsample at the first block or last block. + False for Hourglass, True for ResNet. Default: True + rfp_inplanes (int, optional): The number of channels from RFP. + Default: None. If specified, an additional conv layer will be + added for ``rfp_feat``. Otherwise, the structure is the same as + base class. + """ + + def __init__(self, + block, + inplanes, + planes, + num_blocks, + stride=1, + avg_down=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + downsample_first=True, + rfp_inplanes=None, + **kwargs): + self.block = block + assert downsample_first, f'downsample_first={downsample_first} is ' \ + 'not supported in DetectoRS' + + downsample = None + if stride != 1 or inplanes != planes * block.expansion: + downsample = [] + conv_stride = stride + if avg_down and stride != 1: + conv_stride = 1 + downsample.append( + nn.AvgPool2d( + kernel_size=stride, + stride=stride, + ceil_mode=True, + count_include_pad=False)) + downsample.extend([ + build_conv_layer( + conv_cfg, + inplanes, + planes * block.expansion, + kernel_size=1, + stride=conv_stride, + bias=False), + build_norm_layer(norm_cfg, planes * block.expansion)[1] + ]) + downsample = nn.Sequential(*downsample) + + layers = [] + layers.append( + block( + inplanes=inplanes, + planes=planes, + stride=stride, + downsample=downsample, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + rfp_inplanes=rfp_inplanes, + **kwargs)) + inplanes = planes * block.expansion + for _ in range(1, num_blocks): + layers.append( + block( + inplanes=inplanes, + planes=planes, + stride=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + **kwargs)) + + super(ResLayer, self).__init__(*layers) + + +@BACKBONES.register_module() +class DetectoRS_ResNet(ResNet): + """ResNet backbone for DetectoRS. + + Args: + sac (dict, optional): Dictionary to construct SAC (Switchable Atrous + Convolution). Default: None. + stage_with_sac (list): Which stage to use sac. Default: (False, False, + False, False). + rfp_inplanes (int, optional): The number of channels from RFP. + Default: None. If specified, an additional conv layer will be + added for ``rfp_feat``. Otherwise, the structure is the same as + base class. + output_img (bool): If ``True``, the input image will be inserted into + the starting position of output. Default: False. + """ + + arch_settings = { + 50: (Bottleneck, (3, 4, 6, 3)), + 101: (Bottleneck, (3, 4, 23, 3)), + 152: (Bottleneck, (3, 8, 36, 3)) + } + + def __init__(self, + sac=None, + stage_with_sac=(False, False, False, False), + rfp_inplanes=None, + output_img=False, + pretrained=None, + init_cfg=None, + **kwargs): + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be specified at the same time' + self.pretrained = pretrained + if init_cfg is not None: + assert isinstance(init_cfg, dict), \ + f'init_cfg must be a dict, but got {type(init_cfg)}' + if 'type' in init_cfg: + assert init_cfg.get('type') == 'Pretrained', \ + 'Only can initialize module by loading a pretrained model' + else: + raise KeyError('`init_cfg` must contain the key "type"') + self.pretrained = init_cfg.get('checkpoint') + self.sac = sac + self.stage_with_sac = stage_with_sac + self.rfp_inplanes = rfp_inplanes + self.output_img = output_img + super(DetectoRS_ResNet, self).__init__(**kwargs) + + self.inplanes = self.stem_channels + self.res_layers = [] + for i, num_blocks in enumerate(self.stage_blocks): + stride = self.strides[i] + dilation = self.dilations[i] + dcn = self.dcn if self.stage_with_dcn[i] else None + sac = self.sac if self.stage_with_sac[i] else None + if self.plugins is not None: + stage_plugins = self.make_stage_plugins(self.plugins, i) + else: + stage_plugins = None + planes = self.base_channels * 2**i + res_layer = self.make_res_layer( + block=self.block, + inplanes=self.inplanes, + planes=planes, + num_blocks=num_blocks, + stride=stride, + dilation=dilation, + style=self.style, + avg_down=self.avg_down, + with_cp=self.with_cp, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + dcn=dcn, + sac=sac, + rfp_inplanes=rfp_inplanes if i > 0 else None, + plugins=stage_plugins) + self.inplanes = planes * self.block.expansion + layer_name = f'layer{i + 1}' + self.add_module(layer_name, res_layer) + self.res_layers.append(layer_name) + + self._freeze_stages() + + # In order to be properly initialized by RFP + def init_weights(self): + # Calling this method will cause parameter initialization exception + # super(DetectoRS_ResNet, self).init_weights() + + if isinstance(self.pretrained, str): + logger = get_root_logger() + load_checkpoint(self, self.pretrained, strict=False, logger=logger) + elif self.pretrained is None: + for m in self.modules(): + if isinstance(m, nn.Conv2d): + kaiming_init(m) + elif isinstance(m, (_BatchNorm, nn.GroupNorm)): + constant_init(m, 1) + + if self.dcn is not None: + for m in self.modules(): + if isinstance(m, Bottleneck) and hasattr( + m.conv2, 'conv_offset'): + constant_init(m.conv2.conv_offset, 0) + + if self.zero_init_residual: + for m in self.modules(): + if isinstance(m, Bottleneck): + constant_init(m.norm3, 0) + elif isinstance(m, BasicBlock): + constant_init(m.norm2, 0) + else: + raise TypeError('pretrained must be a str or None') + + def make_res_layer(self, **kwargs): + """Pack all blocks in a stage into a ``ResLayer`` for DetectoRS.""" + return ResLayer(**kwargs) + + def forward(self, x): + """Forward function.""" + outs = list(super(DetectoRS_ResNet, self).forward(x)) + if self.output_img: + outs.insert(0, x) + return tuple(outs) + + def rfp_forward(self, x, rfp_feats): + """Forward function for RFP.""" + if self.deep_stem: + x = self.stem(x) + else: + x = self.conv1(x) + x = self.norm1(x) + x = self.relu(x) + x = self.maxpool(x) + outs = [] + for i, layer_name in enumerate(self.res_layers): + res_layer = getattr(self, layer_name) + rfp_feat = rfp_feats[i] if i > 0 else None + for layer in res_layer: + x = layer.rfp_forward(x, rfp_feat) + if i in self.out_indices: + outs.append(x) + return tuple(outs) diff --git a/mmdet/models/backbones/detectors_resnext.py b/mmdet/models/backbones/detectors_resnext.py new file mode 100644 index 0000000..5e8b20a --- /dev/null +++ b/mmdet/models/backbones/detectors_resnext.py @@ -0,0 +1,123 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math + +from mmcv.cnn import build_conv_layer, build_norm_layer + +from ..builder import BACKBONES +from .detectors_resnet import Bottleneck as _Bottleneck +from .detectors_resnet import DetectoRS_ResNet + + +class Bottleneck(_Bottleneck): + expansion = 4 + + def __init__(self, + inplanes, + planes, + groups=1, + base_width=4, + base_channels=64, + **kwargs): + """Bottleneck block for ResNeXt. + + If style is "pytorch", the stride-two layer is the 3x3 conv layer, if + it is "caffe", the stride-two layer is the first 1x1 conv layer. + """ + super(Bottleneck, self).__init__(inplanes, planes, **kwargs) + + if groups == 1: + width = self.planes + else: + width = math.floor(self.planes * + (base_width / base_channels)) * groups + + self.norm1_name, norm1 = build_norm_layer( + self.norm_cfg, width, postfix=1) + self.norm2_name, norm2 = build_norm_layer( + self.norm_cfg, width, postfix=2) + self.norm3_name, norm3 = build_norm_layer( + self.norm_cfg, self.planes * self.expansion, postfix=3) + + self.conv1 = build_conv_layer( + self.conv_cfg, + self.inplanes, + width, + kernel_size=1, + stride=self.conv1_stride, + bias=False) + self.add_module(self.norm1_name, norm1) + fallback_on_stride = False + self.with_modulated_dcn = False + if self.with_dcn: + fallback_on_stride = self.dcn.pop('fallback_on_stride', False) + if self.with_sac: + self.conv2 = build_conv_layer( + self.sac, + width, + width, + kernel_size=3, + stride=self.conv2_stride, + padding=self.dilation, + dilation=self.dilation, + groups=groups, + bias=False) + elif not self.with_dcn or fallback_on_stride: + self.conv2 = build_conv_layer( + self.conv_cfg, + width, + width, + kernel_size=3, + stride=self.conv2_stride, + padding=self.dilation, + dilation=self.dilation, + groups=groups, + bias=False) + else: + assert self.conv_cfg is None, 'conv_cfg must be None for DCN' + self.conv2 = build_conv_layer( + self.dcn, + width, + width, + kernel_size=3, + stride=self.conv2_stride, + padding=self.dilation, + dilation=self.dilation, + groups=groups, + bias=False) + + self.add_module(self.norm2_name, norm2) + self.conv3 = build_conv_layer( + self.conv_cfg, + width, + self.planes * self.expansion, + kernel_size=1, + bias=False) + self.add_module(self.norm3_name, norm3) + + +@BACKBONES.register_module() +class DetectoRS_ResNeXt(DetectoRS_ResNet): + """ResNeXt backbone for DetectoRS. + + Args: + groups (int): The number of groups in ResNeXt. + base_width (int): The base width of ResNeXt. + """ + + arch_settings = { + 50: (Bottleneck, (3, 4, 6, 3)), + 101: (Bottleneck, (3, 4, 23, 3)), + 152: (Bottleneck, (3, 8, 36, 3)) + } + + def __init__(self, groups=1, base_width=4, **kwargs): + self.groups = groups + self.base_width = base_width + super(DetectoRS_ResNeXt, self).__init__(**kwargs) + + def make_res_layer(self, **kwargs): + return super().make_res_layer( + groups=self.groups, + base_width=self.base_width, + base_channels=self.base_channels, + **kwargs) diff --git a/mmdet/models/backbones/efficientnet.py b/mmdet/models/backbones/efficientnet.py new file mode 100644 index 0000000..7ee3595 --- /dev/null +++ b/mmdet/models/backbones/efficientnet.py @@ -0,0 +1,417 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy +import math +from functools import partial + +import torch +import torch.nn as nn +import torch.utils.checkpoint as cp +from mmcv.cnn.bricks import ConvModule, DropPath +from mmcv.runner import BaseModule, Sequential + +from ..builder import BACKBONES +from ..utils import InvertedResidual, SELayer, make_divisible + + +class EdgeResidual(BaseModule): + """Edge Residual Block. + + Args: + in_channels (int): The input channels of this module. + out_channels (int): The output channels of this module. + mid_channels (int): The input channels of the second convolution. + kernel_size (int): The kernel size of the first convolution. + Defaults to 3. + stride (int): The stride of the first convolution. Defaults to 1. + se_cfg (dict, optional): Config dict for se layer. Defaults to None, + which means no se layer. + with_residual (bool): Use residual connection. Defaults to True. + conv_cfg (dict, optional): Config dict for convolution layer. + Defaults to None, which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Defaults to ``dict(type='BN')``. + act_cfg (dict): Config dict for activation layer. + Defaults to ``dict(type='ReLU')``. + drop_path_rate (float): stochastic depth rate. Defaults to 0. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Defaults to False. + init_cfg (dict | list[dict], optional): Initialization config dict. + """ + + def __init__(self, + in_channels, + out_channels, + mid_channels, + kernel_size=3, + stride=1, + se_cfg=None, + with_residual=True, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + drop_path_rate=0., + with_cp=False, + init_cfg=None, + **kwargs): + super(EdgeResidual, self).__init__(init_cfg=init_cfg) + assert stride in [1, 2] + self.with_cp = with_cp + self.drop_path = DropPath( + drop_path_rate) if drop_path_rate > 0 else nn.Identity() + self.with_se = se_cfg is not None + self.with_residual = ( + stride == 1 and in_channels == out_channels and with_residual) + + if self.with_se: + assert isinstance(se_cfg, dict) + + self.conv1 = ConvModule( + in_channels=in_channels, + out_channels=mid_channels, + kernel_size=kernel_size, + stride=1, + padding=kernel_size // 2, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + if self.with_se: + self.se = SELayer(**se_cfg) + + self.conv2 = ConvModule( + in_channels=mid_channels, + out_channels=out_channels, + kernel_size=1, + stride=stride, + padding=0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=None) + + def forward(self, x): + + def _inner_forward(x): + out = x + out = self.conv1(out) + + if self.with_se: + out = self.se(out) + + out = self.conv2(out) + + if self.with_residual: + return x + self.drop_path(out) + else: + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + return out + + +def model_scaling(layer_setting, arch_setting): + """Scaling operation to the layer's parameters according to the + arch_setting.""" + # scale width + new_layer_setting = copy.deepcopy(layer_setting) + for layer_cfg in new_layer_setting: + for block_cfg in layer_cfg: + block_cfg[1] = make_divisible(block_cfg[1] * arch_setting[0], 8) + + # scale depth + split_layer_setting = [new_layer_setting[0]] + for layer_cfg in new_layer_setting[1:-1]: + tmp_index = [0] + for i in range(len(layer_cfg) - 1): + if layer_cfg[i + 1][1] != layer_cfg[i][1]: + tmp_index.append(i + 1) + tmp_index.append(len(layer_cfg)) + for i in range(len(tmp_index) - 1): + split_layer_setting.append(layer_cfg[tmp_index[i]:tmp_index[i + + 1]]) + split_layer_setting.append(new_layer_setting[-1]) + + num_of_layers = [len(layer_cfg) for layer_cfg in split_layer_setting[1:-1]] + new_layers = [ + int(math.ceil(arch_setting[1] * num)) for num in num_of_layers + ] + + merge_layer_setting = [split_layer_setting[0]] + for i, layer_cfg in enumerate(split_layer_setting[1:-1]): + if new_layers[i] <= num_of_layers[i]: + tmp_layer_cfg = layer_cfg[:new_layers[i]] + else: + tmp_layer_cfg = copy.deepcopy(layer_cfg) + [layer_cfg[-1]] * ( + new_layers[i] - num_of_layers[i]) + if tmp_layer_cfg[0][3] == 1 and i != 0: + merge_layer_setting[-1] += tmp_layer_cfg.copy() + else: + merge_layer_setting.append(tmp_layer_cfg.copy()) + merge_layer_setting.append(split_layer_setting[-1]) + + return merge_layer_setting + + +@BACKBONES.register_module() +class EfficientNet(BaseModule): + """EfficientNet backbone. + + Args: + arch (str): Architecture of efficientnet. Defaults to b0. + out_indices (Sequence[int]): Output from which stages. + Defaults to (6, ). + frozen_stages (int): Stages to be frozen (all param fixed). + Defaults to 0, which means not freezing any parameters. + conv_cfg (dict): Config dict for convolution layer. + Defaults to None, which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Defaults to dict(type='BN'). + act_cfg (dict): Config dict for activation layer. + Defaults to dict(type='Swish'). + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. Defaults to False. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Defaults to False. + """ + + # Parameters to build layers. + # 'b' represents the architecture of normal EfficientNet family includes + # 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8'. + # 'e' represents the architecture of EfficientNet-EdgeTPU including 'es', + # 'em', 'el'. + # 6 parameters are needed to construct a layer, From left to right: + # - kernel_size: The kernel size of the block + # - out_channel: The number of out_channels of the block + # - se_ratio: The sequeeze ratio of SELayer. + # - stride: The stride of the block + # - expand_ratio: The expand_ratio of the mid_channels + # - block_type: -1: Not a block, 0: InvertedResidual, 1: EdgeResidual + layer_settings = { + 'b': [[[3, 32, 0, 2, 0, -1]], + [[3, 16, 4, 1, 1, 0]], + [[3, 24, 4, 2, 6, 0], + [3, 24, 4, 1, 6, 0]], + [[5, 40, 4, 2, 6, 0], + [5, 40, 4, 1, 6, 0]], + [[3, 80, 4, 2, 6, 0], + [3, 80, 4, 1, 6, 0], + [3, 80, 4, 1, 6, 0], + [5, 112, 4, 1, 6, 0], + [5, 112, 4, 1, 6, 0], + [5, 112, 4, 1, 6, 0]], + [[5, 192, 4, 2, 6, 0], + [5, 192, 4, 1, 6, 0], + [5, 192, 4, 1, 6, 0], + [5, 192, 4, 1, 6, 0], + [3, 320, 4, 1, 6, 0]], + [[1, 1280, 0, 1, 0, -1]] + ], + 'e': [[[3, 32, 0, 2, 0, -1]], + [[3, 24, 0, 1, 3, 1]], + [[3, 32, 0, 2, 8, 1], + [3, 32, 0, 1, 8, 1]], + [[3, 48, 0, 2, 8, 1], + [3, 48, 0, 1, 8, 1], + [3, 48, 0, 1, 8, 1], + [3, 48, 0, 1, 8, 1]], + [[5, 96, 0, 2, 8, 0], + [5, 96, 0, 1, 8, 0], + [5, 96, 0, 1, 8, 0], + [5, 96, 0, 1, 8, 0], + [5, 96, 0, 1, 8, 0], + [5, 144, 0, 1, 8, 0], + [5, 144, 0, 1, 8, 0], + [5, 144, 0, 1, 8, 0], + [5, 144, 0, 1, 8, 0]], + [[5, 192, 0, 2, 8, 0], + [5, 192, 0, 1, 8, 0]], + [[1, 1280, 0, 1, 0, -1]] + ] + } # yapf: disable + + # Parameters to build different kinds of architecture. + # From left to right: scaling factor for width, scaling factor for depth, + # resolution. + arch_settings = { + 'b0': (1.0, 1.0, 224), + 'b1': (1.0, 1.1, 240), + 'b2': (1.1, 1.2, 260), + 'b3': (1.2, 1.4, 300), + 'b4': (1.4, 1.8, 380), + 'b5': (1.6, 2.2, 456), + 'b6': (1.8, 2.6, 528), + 'b7': (2.0, 3.1, 600), + 'b8': (2.2, 3.6, 672), + 'es': (1.0, 1.0, 224), + 'em': (1.0, 1.1, 240), + 'el': (1.2, 1.4, 300) + } + + def __init__(self, + arch='b0', + drop_path_rate=0., + out_indices=(6, ), + frozen_stages=0, + conv_cfg=dict(type='Conv2dAdaptivePadding'), + norm_cfg=dict(type='BN', eps=1e-3), + act_cfg=dict(type='Swish'), + norm_eval=False, + with_cp=False, + init_cfg=[ + dict(type='Kaiming', layer='Conv2d'), + dict( + type='Constant', + layer=['_BatchNorm', 'GroupNorm'], + val=1) + ]): + super(EfficientNet, self).__init__(init_cfg) + assert arch in self.arch_settings, \ + f'"{arch}" is not one of the arch_settings ' \ + f'({", ".join(self.arch_settings.keys())})' + self.arch_setting = self.arch_settings[arch] + self.layer_setting = self.layer_settings[arch[:1]] + for index in out_indices: + if index not in range(0, len(self.layer_setting)): + raise ValueError('the item in out_indices must in ' + f'range(0, {len(self.layer_setting)}). ' + f'But received {index}') + + if frozen_stages not in range(len(self.layer_setting) + 1): + raise ValueError('frozen_stages must be in range(0, ' + f'{len(self.layer_setting) + 1}). ' + f'But received {frozen_stages}') + self.drop_path_rate = drop_path_rate + self.out_indices = out_indices + self.frozen_stages = frozen_stages + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.norm_eval = norm_eval + self.with_cp = with_cp + + self.layer_setting = model_scaling(self.layer_setting, + self.arch_setting) + block_cfg_0 = self.layer_setting[0][0] + block_cfg_last = self.layer_setting[-1][0] + self.in_channels = make_divisible(block_cfg_0[1], 8) + self.out_channels = block_cfg_last[1] + self.layers = nn.ModuleList() + self.layers.append( + ConvModule( + in_channels=3, + out_channels=self.in_channels, + kernel_size=block_cfg_0[0], + stride=block_cfg_0[3], + padding=block_cfg_0[0] // 2, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + self.make_layer() + # Avoid building unused layers in mmdetection. + if len(self.layers) < max(self.out_indices) + 1: + self.layers.append( + ConvModule( + in_channels=self.in_channels, + out_channels=self.out_channels, + kernel_size=block_cfg_last[0], + stride=block_cfg_last[3], + padding=block_cfg_last[0] // 2, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + + def make_layer(self): + # Without the first and the final conv block. + layer_setting = self.layer_setting[1:-1] + + total_num_blocks = sum([len(x) for x in layer_setting]) + block_idx = 0 + dpr = [ + x.item() + for x in torch.linspace(0, self.drop_path_rate, total_num_blocks) + ] # stochastic depth decay rule + + for i, layer_cfg in enumerate(layer_setting): + # Avoid building unused layers in mmdetection. + if i > max(self.out_indices) - 1: + break + layer = [] + for i, block_cfg in enumerate(layer_cfg): + (kernel_size, out_channels, se_ratio, stride, expand_ratio, + block_type) = block_cfg + + mid_channels = int(self.in_channels * expand_ratio) + out_channels = make_divisible(out_channels, 8) + if se_ratio <= 0: + se_cfg = None + else: + # In mmdetection, the `divisor` is deleted to align + # the logic of SELayer with mmcls. + se_cfg = dict( + channels=mid_channels, + ratio=expand_ratio * se_ratio, + act_cfg=(self.act_cfg, dict(type='Sigmoid'))) + if block_type == 1: # edge tpu + if i > 0 and expand_ratio == 3: + with_residual = False + expand_ratio = 4 + else: + with_residual = True + mid_channels = int(self.in_channels * expand_ratio) + if se_cfg is not None: + # In mmdetection, the `divisor` is deleted to align + # the logic of SELayer with mmcls. + se_cfg = dict( + channels=mid_channels, + ratio=se_ratio * expand_ratio, + act_cfg=(self.act_cfg, dict(type='Sigmoid'))) + block = partial(EdgeResidual, with_residual=with_residual) + else: + block = InvertedResidual + layer.append( + block( + in_channels=self.in_channels, + out_channels=out_channels, + mid_channels=mid_channels, + kernel_size=kernel_size, + stride=stride, + se_cfg=se_cfg, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + drop_path_rate=dpr[block_idx], + with_cp=self.with_cp, + # In mmdetection, `with_expand_conv` is set to align + # the logic of InvertedResidual with mmcls. + with_expand_conv=(mid_channels != self.in_channels))) + self.in_channels = out_channels + block_idx += 1 + self.layers.append(Sequential(*layer)) + + def forward(self, x): + outs = [] + for i, layer in enumerate(self.layers): + x = layer(x) + if i in self.out_indices: + outs.append(x) + + return tuple(outs) + + def _freeze_stages(self): + for i in range(self.frozen_stages): + m = self.layers[i] + m.eval() + for param in m.parameters(): + param.requires_grad = False + + def train(self, mode=True): + super(EfficientNet, self).train(mode) + self._freeze_stages() + if mode and self.norm_eval: + for m in self.modules(): + if isinstance(m, nn.BatchNorm2d): + m.eval() diff --git a/mmdet/models/backbones/hourglass.py b/mmdet/models/backbones/hourglass.py new file mode 100644 index 0000000..f0dfb43 --- /dev/null +++ b/mmdet/models/backbones/hourglass.py @@ -0,0 +1,222 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule +from mmcv.runner import BaseModule + +from ..builder import BACKBONES +from ..utils import ResLayer +from .resnet import BasicBlock + + +class HourglassModule(BaseModule): + """Hourglass Module for HourglassNet backbone. + + Generate module recursively and use BasicBlock as the base unit. + + Args: + depth (int): Depth of current HourglassModule. + stage_channels (list[int]): Feature channels of sub-modules in current + and follow-up HourglassModule. + stage_blocks (list[int]): Number of sub-modules stacked in current and + follow-up HourglassModule. + norm_cfg (dict): Dictionary to construct and config norm layer. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + upsample_cfg (dict, optional): Config dict for interpolate layer. + Default: `dict(mode='nearest')` + """ + + def __init__(self, + depth, + stage_channels, + stage_blocks, + norm_cfg=dict(type='BN', requires_grad=True), + init_cfg=None, + upsample_cfg=dict(mode='nearest')): + super(HourglassModule, self).__init__(init_cfg) + + self.depth = depth + + cur_block = stage_blocks[0] + next_block = stage_blocks[1] + + cur_channel = stage_channels[0] + next_channel = stage_channels[1] + + self.up1 = ResLayer( + BasicBlock, cur_channel, cur_channel, cur_block, norm_cfg=norm_cfg) + + self.low1 = ResLayer( + BasicBlock, + cur_channel, + next_channel, + cur_block, + stride=2, + norm_cfg=norm_cfg) + + if self.depth > 1: + self.low2 = HourglassModule(depth - 1, stage_channels[1:], + stage_blocks[1:]) + else: + self.low2 = ResLayer( + BasicBlock, + next_channel, + next_channel, + next_block, + norm_cfg=norm_cfg) + + self.low3 = ResLayer( + BasicBlock, + next_channel, + cur_channel, + cur_block, + norm_cfg=norm_cfg, + downsample_first=False) + + self.up2 = F.interpolate + self.upsample_cfg = upsample_cfg + + def forward(self, x): + """Forward function.""" + up1 = self.up1(x) + low1 = self.low1(x) + low2 = self.low2(low1) + low3 = self.low3(low2) + # Fixing `scale factor` (e.g. 2) is common for upsampling, but + # in some cases the spatial size is mismatched and error will arise. + if 'scale_factor' in self.upsample_cfg: + up2 = self.up2(low3, **self.upsample_cfg) + else: + shape = up1.shape[2:] + up2 = self.up2(low3, size=shape, **self.upsample_cfg) + return up1 + up2 + + +@BACKBONES.register_module() +class HourglassNet(BaseModule): + """HourglassNet backbone. + + Stacked Hourglass Networks for Human Pose Estimation. + More details can be found in the `paper + `_ . + + Args: + downsample_times (int): Downsample times in a HourglassModule. + num_stacks (int): Number of HourglassModule modules stacked, + 1 for Hourglass-52, 2 for Hourglass-104. + stage_channels (list[int]): Feature channel of each sub-module in a + HourglassModule. + stage_blocks (list[int]): Number of sub-modules stacked in a + HourglassModule. + feat_channel (int): Feature channel of conv after a HourglassModule. + norm_cfg (dict): Dictionary to construct and config norm layer. + pretrained (str, optional): model pretrained path. Default: None + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + + Example: + >>> from mmdet.models import HourglassNet + >>> import torch + >>> self = HourglassNet() + >>> self.eval() + >>> inputs = torch.rand(1, 3, 511, 511) + >>> level_outputs = self.forward(inputs) + >>> for level_output in level_outputs: + ... print(tuple(level_output.shape)) + (1, 256, 128, 128) + (1, 256, 128, 128) + """ + + def __init__(self, + downsample_times=5, + num_stacks=2, + stage_channels=(256, 256, 384, 384, 384, 512), + stage_blocks=(2, 2, 2, 2, 2, 4), + feat_channel=256, + norm_cfg=dict(type='BN', requires_grad=True), + pretrained=None, + init_cfg=None): + assert init_cfg is None, 'To prevent abnormal initialization ' \ + 'behavior, init_cfg is not allowed to be set' + super(HourglassNet, self).__init__(init_cfg) + + self.num_stacks = num_stacks + assert self.num_stacks >= 1 + assert len(stage_channels) == len(stage_blocks) + assert len(stage_channels) > downsample_times + + cur_channel = stage_channels[0] + + self.stem = nn.Sequential( + ConvModule( + 3, cur_channel // 2, 7, padding=3, stride=2, + norm_cfg=norm_cfg), + ResLayer( + BasicBlock, + cur_channel // 2, + cur_channel, + 1, + stride=2, + norm_cfg=norm_cfg)) + + self.hourglass_modules = nn.ModuleList([ + HourglassModule(downsample_times, stage_channels, stage_blocks) + for _ in range(num_stacks) + ]) + + self.inters = ResLayer( + BasicBlock, + cur_channel, + cur_channel, + num_stacks - 1, + norm_cfg=norm_cfg) + + self.conv1x1s = nn.ModuleList([ + ConvModule( + cur_channel, cur_channel, 1, norm_cfg=norm_cfg, act_cfg=None) + for _ in range(num_stacks - 1) + ]) + + self.out_convs = nn.ModuleList([ + ConvModule( + cur_channel, feat_channel, 3, padding=1, norm_cfg=norm_cfg) + for _ in range(num_stacks) + ]) + + self.remap_convs = nn.ModuleList([ + ConvModule( + feat_channel, cur_channel, 1, norm_cfg=norm_cfg, act_cfg=None) + for _ in range(num_stacks - 1) + ]) + + self.relu = nn.ReLU(inplace=True) + + def init_weights(self): + """Init module weights.""" + # Training Centripetal Model needs to reset parameters for Conv2d + super(HourglassNet, self).init_weights() + for m in self.modules(): + if isinstance(m, nn.Conv2d): + m.reset_parameters() + + def forward(self, x): + """Forward function.""" + inter_feat = self.stem(x) + out_feats = [] + + for ind in range(self.num_stacks): + single_hourglass = self.hourglass_modules[ind] + out_conv = self.out_convs[ind] + + hourglass_feat = single_hourglass(inter_feat) + out_feat = out_conv(hourglass_feat) + out_feats.append(out_feat) + + if ind < self.num_stacks - 1: + inter_feat = self.conv1x1s[ind]( + inter_feat) + self.remap_convs[ind]( + out_feat) + inter_feat = self.inters[ind](self.relu(inter_feat)) + + return out_feats diff --git a/mmdet/models/backbones/hrnet.py b/mmdet/models/backbones/hrnet.py new file mode 100644 index 0000000..06c210a --- /dev/null +++ b/mmdet/models/backbones/hrnet.py @@ -0,0 +1,589 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch.nn as nn +from mmcv.cnn import build_conv_layer, build_norm_layer +from mmcv.runner import BaseModule, ModuleList, Sequential +from torch.nn.modules.batchnorm import _BatchNorm + +from ..builder import BACKBONES +from .resnet import BasicBlock, Bottleneck + + +class HRModule(BaseModule): + """High-Resolution Module for HRNet. + + In this module, every branch has 4 BasicBlocks/Bottlenecks. Fusion/Exchange + is in this module. + """ + + def __init__(self, + num_branches, + blocks, + num_blocks, + in_channels, + num_channels, + multiscale_output=True, + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + block_init_cfg=None, + init_cfg=None): + super(HRModule, self).__init__(init_cfg) + self.block_init_cfg = block_init_cfg + self._check_branches(num_branches, num_blocks, in_channels, + num_channels) + + self.in_channels = in_channels + self.num_branches = num_branches + + self.multiscale_output = multiscale_output + self.norm_cfg = norm_cfg + self.conv_cfg = conv_cfg + self.with_cp = with_cp + self.branches = self._make_branches(num_branches, blocks, num_blocks, + num_channels) + self.fuse_layers = self._make_fuse_layers() + self.relu = nn.ReLU(inplace=False) + + def _check_branches(self, num_branches, num_blocks, in_channels, + num_channels): + if num_branches != len(num_blocks): + error_msg = f'NUM_BRANCHES({num_branches}) ' \ + f'!= NUM_BLOCKS({len(num_blocks)})' + raise ValueError(error_msg) + + if num_branches != len(num_channels): + error_msg = f'NUM_BRANCHES({num_branches}) ' \ + f'!= NUM_CHANNELS({len(num_channels)})' + raise ValueError(error_msg) + + if num_branches != len(in_channels): + error_msg = f'NUM_BRANCHES({num_branches}) ' \ + f'!= NUM_INCHANNELS({len(in_channels)})' + raise ValueError(error_msg) + + def _make_one_branch(self, + branch_index, + block, + num_blocks, + num_channels, + stride=1): + downsample = None + if stride != 1 or \ + self.in_channels[branch_index] != \ + num_channels[branch_index] * block.expansion: + downsample = nn.Sequential( + build_conv_layer( + self.conv_cfg, + self.in_channels[branch_index], + num_channels[branch_index] * block.expansion, + kernel_size=1, + stride=stride, + bias=False), + build_norm_layer(self.norm_cfg, num_channels[branch_index] * + block.expansion)[1]) + + layers = [] + layers.append( + block( + self.in_channels[branch_index], + num_channels[branch_index], + stride, + downsample=downsample, + with_cp=self.with_cp, + norm_cfg=self.norm_cfg, + conv_cfg=self.conv_cfg, + init_cfg=self.block_init_cfg)) + self.in_channels[branch_index] = \ + num_channels[branch_index] * block.expansion + for i in range(1, num_blocks[branch_index]): + layers.append( + block( + self.in_channels[branch_index], + num_channels[branch_index], + with_cp=self.with_cp, + norm_cfg=self.norm_cfg, + conv_cfg=self.conv_cfg, + init_cfg=self.block_init_cfg)) + + return Sequential(*layers) + + def _make_branches(self, num_branches, block, num_blocks, num_channels): + branches = [] + + for i in range(num_branches): + branches.append( + self._make_one_branch(i, block, num_blocks, num_channels)) + + return ModuleList(branches) + + def _make_fuse_layers(self): + if self.num_branches == 1: + return None + + num_branches = self.num_branches + in_channels = self.in_channels + fuse_layers = [] + num_out_branches = num_branches if self.multiscale_output else 1 + for i in range(num_out_branches): + fuse_layer = [] + for j in range(num_branches): + if j > i: + fuse_layer.append( + nn.Sequential( + build_conv_layer( + self.conv_cfg, + in_channels[j], + in_channels[i], + kernel_size=1, + stride=1, + padding=0, + bias=False), + build_norm_layer(self.norm_cfg, in_channels[i])[1], + nn.Upsample( + scale_factor=2**(j - i), mode='nearest'))) + elif j == i: + fuse_layer.append(None) + else: + conv_downsamples = [] + for k in range(i - j): + if k == i - j - 1: + conv_downsamples.append( + nn.Sequential( + build_conv_layer( + self.conv_cfg, + in_channels[j], + in_channels[i], + kernel_size=3, + stride=2, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, + in_channels[i])[1])) + else: + conv_downsamples.append( + nn.Sequential( + build_conv_layer( + self.conv_cfg, + in_channels[j], + in_channels[j], + kernel_size=3, + stride=2, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, + in_channels[j])[1], + nn.ReLU(inplace=False))) + fuse_layer.append(nn.Sequential(*conv_downsamples)) + fuse_layers.append(nn.ModuleList(fuse_layer)) + + return nn.ModuleList(fuse_layers) + + def forward(self, x): + """Forward function.""" + if self.num_branches == 1: + return [self.branches[0](x[0])] + + for i in range(self.num_branches): + x[i] = self.branches[i](x[i]) + + x_fuse = [] + for i in range(len(self.fuse_layers)): + y = 0 + for j in range(self.num_branches): + if i == j: + y += x[j] + else: + y += self.fuse_layers[i][j](x[j]) + x_fuse.append(self.relu(y)) + return x_fuse + + +@BACKBONES.register_module() +class HRNet(BaseModule): + """HRNet backbone. + + `High-Resolution Representations for Labeling Pixels and Regions + arXiv: `_. + + Args: + extra (dict): Detailed configuration for each stage of HRNet. + There must be 4 stages, the configuration for each stage must have + 5 keys: + + - num_modules(int): The number of HRModule in this stage. + - num_branches(int): The number of branches in the HRModule. + - block(str): The type of convolution block. + - num_blocks(tuple): The number of blocks in each branch. + The length must be equal to num_branches. + - num_channels(tuple): The number of channels in each branch. + The length must be equal to num_branches. + in_channels (int): Number of input image channels. Default: 3. + conv_cfg (dict): Dictionary to construct and config conv layer. + norm_cfg (dict): Dictionary to construct and config norm layer. + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. Default: True. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + zero_init_residual (bool): Whether to use zero init for last norm layer + in resblocks to let them behave as identity. Default: False. + multiscale_output (bool): Whether to output multi-level features + produced by multiple branches. If False, only the first level + feature will be output. Default: True. + pretrained (str, optional): Model pretrained path. Default: None. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + + Example: + >>> from mmdet.models import HRNet + >>> import torch + >>> extra = dict( + >>> stage1=dict( + >>> num_modules=1, + >>> num_branches=1, + >>> block='BOTTLENECK', + >>> num_blocks=(4, ), + >>> num_channels=(64, )), + >>> stage2=dict( + >>> num_modules=1, + >>> num_branches=2, + >>> block='BASIC', + >>> num_blocks=(4, 4), + >>> num_channels=(32, 64)), + >>> stage3=dict( + >>> num_modules=4, + >>> num_branches=3, + >>> block='BASIC', + >>> num_blocks=(4, 4, 4), + >>> num_channels=(32, 64, 128)), + >>> stage4=dict( + >>> num_modules=3, + >>> num_branches=4, + >>> block='BASIC', + >>> num_blocks=(4, 4, 4, 4), + >>> num_channels=(32, 64, 128, 256))) + >>> self = HRNet(extra, in_channels=1) + >>> self.eval() + >>> inputs = torch.rand(1, 1, 32, 32) + >>> level_outputs = self.forward(inputs) + >>> for level_out in level_outputs: + ... print(tuple(level_out.shape)) + (1, 32, 8, 8) + (1, 64, 4, 4) + (1, 128, 2, 2) + (1, 256, 1, 1) + """ + + blocks_dict = {'BASIC': BasicBlock, 'BOTTLENECK': Bottleneck} + + def __init__(self, + extra, + in_channels=3, + conv_cfg=None, + norm_cfg=dict(type='BN'), + norm_eval=True, + with_cp=False, + zero_init_residual=False, + multiscale_output=True, + pretrained=None, + init_cfg=None): + super(HRNet, self).__init__(init_cfg) + + self.pretrained = pretrained + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be specified at the same time' + if isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is deprecated, ' + 'please use "init_cfg" instead') + self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is None: + if init_cfg is None: + self.init_cfg = [ + dict(type='Kaiming', layer='Conv2d'), + dict( + type='Constant', + val=1, + layer=['_BatchNorm', 'GroupNorm']) + ] + else: + raise TypeError('pretrained must be a str or None') + + # Assert configurations of 4 stages are in extra + assert 'stage1' in extra and 'stage2' in extra \ + and 'stage3' in extra and 'stage4' in extra + # Assert whether the length of `num_blocks` and `num_channels` are + # equal to `num_branches` + for i in range(4): + cfg = extra[f'stage{i + 1}'] + assert len(cfg['num_blocks']) == cfg['num_branches'] and \ + len(cfg['num_channels']) == cfg['num_branches'] + + self.extra = extra + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.norm_eval = norm_eval + self.with_cp = with_cp + self.zero_init_residual = zero_init_residual + + # stem net + self.norm1_name, norm1 = build_norm_layer(self.norm_cfg, 64, postfix=1) + self.norm2_name, norm2 = build_norm_layer(self.norm_cfg, 64, postfix=2) + + self.conv1 = build_conv_layer( + self.conv_cfg, + in_channels, + 64, + kernel_size=3, + stride=2, + padding=1, + bias=False) + + self.add_module(self.norm1_name, norm1) + self.conv2 = build_conv_layer( + self.conv_cfg, + 64, + 64, + kernel_size=3, + stride=2, + padding=1, + bias=False) + + self.add_module(self.norm2_name, norm2) + self.relu = nn.ReLU(inplace=True) + + # stage 1 + self.stage1_cfg = self.extra['stage1'] + num_channels = self.stage1_cfg['num_channels'][0] + block_type = self.stage1_cfg['block'] + num_blocks = self.stage1_cfg['num_blocks'][0] + + block = self.blocks_dict[block_type] + stage1_out_channels = num_channels * block.expansion + self.layer1 = self._make_layer(block, 64, num_channels, num_blocks) + + # stage 2 + self.stage2_cfg = self.extra['stage2'] + num_channels = self.stage2_cfg['num_channels'] + block_type = self.stage2_cfg['block'] + + block = self.blocks_dict[block_type] + num_channels = [channel * block.expansion for channel in num_channels] + self.transition1 = self._make_transition_layer([stage1_out_channels], + num_channels) + self.stage2, pre_stage_channels = self._make_stage( + self.stage2_cfg, num_channels) + + # stage 3 + self.stage3_cfg = self.extra['stage3'] + num_channels = self.stage3_cfg['num_channels'] + block_type = self.stage3_cfg['block'] + + block = self.blocks_dict[block_type] + num_channels = [channel * block.expansion for channel in num_channels] + self.transition2 = self._make_transition_layer(pre_stage_channels, + num_channels) + self.stage3, pre_stage_channels = self._make_stage( + self.stage3_cfg, num_channels) + + # stage 4 + self.stage4_cfg = self.extra['stage4'] + num_channels = self.stage4_cfg['num_channels'] + block_type = self.stage4_cfg['block'] + + block = self.blocks_dict[block_type] + num_channels = [channel * block.expansion for channel in num_channels] + self.transition3 = self._make_transition_layer(pre_stage_channels, + num_channels) + self.stage4, pre_stage_channels = self._make_stage( + self.stage4_cfg, num_channels, multiscale_output=multiscale_output) + + @property + def norm1(self): + """nn.Module: the normalization layer named "norm1" """ + return getattr(self, self.norm1_name) + + @property + def norm2(self): + """nn.Module: the normalization layer named "norm2" """ + return getattr(self, self.norm2_name) + + def _make_transition_layer(self, num_channels_pre_layer, + num_channels_cur_layer): + num_branches_cur = len(num_channels_cur_layer) + num_branches_pre = len(num_channels_pre_layer) + + transition_layers = [] + for i in range(num_branches_cur): + if i < num_branches_pre: + if num_channels_cur_layer[i] != num_channels_pre_layer[i]: + transition_layers.append( + nn.Sequential( + build_conv_layer( + self.conv_cfg, + num_channels_pre_layer[i], + num_channels_cur_layer[i], + kernel_size=3, + stride=1, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, + num_channels_cur_layer[i])[1], + nn.ReLU(inplace=True))) + else: + transition_layers.append(None) + else: + conv_downsamples = [] + for j in range(i + 1 - num_branches_pre): + in_channels = num_channels_pre_layer[-1] + out_channels = num_channels_cur_layer[i] \ + if j == i - num_branches_pre else in_channels + conv_downsamples.append( + nn.Sequential( + build_conv_layer( + self.conv_cfg, + in_channels, + out_channels, + kernel_size=3, + stride=2, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, out_channels)[1], + nn.ReLU(inplace=True))) + transition_layers.append(nn.Sequential(*conv_downsamples)) + + return nn.ModuleList(transition_layers) + + def _make_layer(self, block, inplanes, planes, blocks, stride=1): + downsample = None + if stride != 1 or inplanes != planes * block.expansion: + downsample = nn.Sequential( + build_conv_layer( + self.conv_cfg, + inplanes, + planes * block.expansion, + kernel_size=1, + stride=stride, + bias=False), + build_norm_layer(self.norm_cfg, planes * block.expansion)[1]) + + layers = [] + block_init_cfg = None + if self.pretrained is None and not hasattr( + self, 'init_cfg') and self.zero_init_residual: + if block is BasicBlock: + block_init_cfg = dict( + type='Constant', val=0, override=dict(name='norm2')) + elif block is Bottleneck: + block_init_cfg = dict( + type='Constant', val=0, override=dict(name='norm3')) + layers.append( + block( + inplanes, + planes, + stride, + downsample=downsample, + with_cp=self.with_cp, + norm_cfg=self.norm_cfg, + conv_cfg=self.conv_cfg, + init_cfg=block_init_cfg, + )) + inplanes = planes * block.expansion + for i in range(1, blocks): + layers.append( + block( + inplanes, + planes, + with_cp=self.with_cp, + norm_cfg=self.norm_cfg, + conv_cfg=self.conv_cfg, + init_cfg=block_init_cfg)) + + return Sequential(*layers) + + def _make_stage(self, layer_config, in_channels, multiscale_output=True): + num_modules = layer_config['num_modules'] + num_branches = layer_config['num_branches'] + num_blocks = layer_config['num_blocks'] + num_channels = layer_config['num_channels'] + block = self.blocks_dict[layer_config['block']] + + hr_modules = [] + block_init_cfg = None + if self.pretrained is None and not hasattr( + self, 'init_cfg') and self.zero_init_residual: + if block is BasicBlock: + block_init_cfg = dict( + type='Constant', val=0, override=dict(name='norm2')) + elif block is Bottleneck: + block_init_cfg = dict( + type='Constant', val=0, override=dict(name='norm3')) + + for i in range(num_modules): + # multi_scale_output is only used for the last module + if not multiscale_output and i == num_modules - 1: + reset_multiscale_output = False + else: + reset_multiscale_output = True + + hr_modules.append( + HRModule( + num_branches, + block, + num_blocks, + in_channels, + num_channels, + reset_multiscale_output, + with_cp=self.with_cp, + norm_cfg=self.norm_cfg, + conv_cfg=self.conv_cfg, + block_init_cfg=block_init_cfg)) + + return Sequential(*hr_modules), in_channels + + def forward(self, x): + """Forward function.""" + x = self.conv1(x) + x = self.norm1(x) + x = self.relu(x) + x = self.conv2(x) + x = self.norm2(x) + x = self.relu(x) + x = self.layer1(x) + + x_list = [] + for i in range(self.stage2_cfg['num_branches']): + if self.transition1[i] is not None: + x_list.append(self.transition1[i](x)) + else: + x_list.append(x) + y_list = self.stage2(x_list) + + x_list = [] + for i in range(self.stage3_cfg['num_branches']): + if self.transition2[i] is not None: + x_list.append(self.transition2[i](y_list[-1])) + else: + x_list.append(y_list[i]) + y_list = self.stage3(x_list) + + x_list = [] + for i in range(self.stage4_cfg['num_branches']): + if self.transition3[i] is not None: + x_list.append(self.transition3[i](y_list[-1])) + else: + x_list.append(y_list[i]) + y_list = self.stage4(x_list) + + return y_list + + def train(self, mode=True): + """Convert the model into training mode will keeping the normalization + layer freezed.""" + super(HRNet, self).train(mode) + if mode and self.norm_eval: + for m in self.modules(): + # trick: eval have effect on BatchNorm only + if isinstance(m, _BatchNorm): + m.eval() diff --git a/mmdet/models/backbones/mobilenet_v2.py b/mmdet/models/backbones/mobilenet_v2.py new file mode 100644 index 0000000..8c6fcfa --- /dev/null +++ b/mmdet/models/backbones/mobilenet_v2.py @@ -0,0 +1,197 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch.nn as nn +from mmcv.cnn import ConvModule +from mmcv.runner import BaseModule +from torch.nn.modules.batchnorm import _BatchNorm + +from ..builder import BACKBONES +from ..utils import InvertedResidual, make_divisible + + +@BACKBONES.register_module() +class MobileNetV2(BaseModule): + """MobileNetV2 backbone. + + Args: + widen_factor (float): Width multiplier, multiply number of + channels in each layer by this amount. Default: 1.0. + out_indices (Sequence[int], optional): Output from which stages. + Default: (1, 2, 4, 7). + frozen_stages (int): Stages to be frozen (all param fixed). + Default: -1, which means not freezing any parameters. + conv_cfg (dict, optional): Config dict for convolution layer. + Default: None, which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='ReLU6'). + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. Default: False. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + pretrained (str, optional): model pretrained path. Default: None + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + # Parameters to build layers. 4 parameters are needed to construct a + # layer, from left to right: expand_ratio, channel, num_blocks, stride. + arch_settings = [[1, 16, 1, 1], [6, 24, 2, 2], [6, 32, 3, 2], + [6, 64, 4, 2], [6, 96, 3, 1], [6, 160, 3, 2], + [6, 320, 1, 1]] + + def __init__(self, + widen_factor=1., + out_indices=(1, 2, 4, 7), + frozen_stages=-1, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU6'), + norm_eval=False, + with_cp=False, + pretrained=None, + init_cfg=None): + super(MobileNetV2, self).__init__(init_cfg) + + self.pretrained = pretrained + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be specified at the same time' + if isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is deprecated, ' + 'please use "init_cfg" instead') + self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is None: + if init_cfg is None: + self.init_cfg = [ + dict(type='Kaiming', layer='Conv2d'), + dict( + type='Constant', + val=1, + layer=['_BatchNorm', 'GroupNorm']) + ] + else: + raise TypeError('pretrained must be a str or None') + + self.widen_factor = widen_factor + self.out_indices = out_indices + if not set(out_indices).issubset(set(range(0, 8))): + raise ValueError('out_indices must be a subset of range' + f'(0, 8). But received {out_indices}') + + if frozen_stages not in range(-1, 8): + raise ValueError('frozen_stages must be in range(-1, 8). ' + f'But received {frozen_stages}') + self.out_indices = out_indices + self.frozen_stages = frozen_stages + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.norm_eval = norm_eval + self.with_cp = with_cp + + self.in_channels = make_divisible(32 * widen_factor, 8) + + self.conv1 = ConvModule( + in_channels=3, + out_channels=self.in_channels, + kernel_size=3, + stride=2, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + + self.layers = [] + + for i, layer_cfg in enumerate(self.arch_settings): + expand_ratio, channel, num_blocks, stride = layer_cfg + out_channels = make_divisible(channel * widen_factor, 8) + inverted_res_layer = self.make_layer( + out_channels=out_channels, + num_blocks=num_blocks, + stride=stride, + expand_ratio=expand_ratio) + layer_name = f'layer{i + 1}' + self.add_module(layer_name, inverted_res_layer) + self.layers.append(layer_name) + + if widen_factor > 1.0: + self.out_channel = int(1280 * widen_factor) + else: + self.out_channel = 1280 + + layer = ConvModule( + in_channels=self.in_channels, + out_channels=self.out_channel, + kernel_size=1, + stride=1, + padding=0, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + self.add_module('conv2', layer) + self.layers.append('conv2') + + def make_layer(self, out_channels, num_blocks, stride, expand_ratio): + """Stack InvertedResidual blocks to build a layer for MobileNetV2. + + Args: + out_channels (int): out_channels of block. + num_blocks (int): number of blocks. + stride (int): stride of the first block. Default: 1 + expand_ratio (int): Expand the number of channels of the + hidden layer in InvertedResidual by this ratio. Default: 6. + """ + layers = [] + for i in range(num_blocks): + if i >= 1: + stride = 1 + layers.append( + InvertedResidual( + self.in_channels, + out_channels, + mid_channels=int(round(self.in_channels * expand_ratio)), + stride=stride, + with_expand_conv=expand_ratio != 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + with_cp=self.with_cp)) + self.in_channels = out_channels + + return nn.Sequential(*layers) + + def _freeze_stages(self): + if self.frozen_stages >= 0: + for param in self.conv1.parameters(): + param.requires_grad = False + for i in range(1, self.frozen_stages + 1): + layer = getattr(self, f'layer{i}') + layer.eval() + for param in layer.parameters(): + param.requires_grad = False + + def forward(self, x): + """Forward function.""" + x = self.conv1(x) + outs = [] + for i, layer_name in enumerate(self.layers): + layer = getattr(self, layer_name) + x = layer(x) + if i in self.out_indices: + outs.append(x) + return tuple(outs) + + def train(self, mode=True): + """Convert the model into training mode while keep normalization layer + frozen.""" + super(MobileNetV2, self).train(mode) + self._freeze_stages() + if mode and self.norm_eval: + for m in self.modules(): + # trick: eval have effect on BatchNorm only + if isinstance(m, _BatchNorm): + m.eval() diff --git a/mmdet/models/backbones/pvt.py b/mmdet/models/backbones/pvt.py new file mode 100644 index 0000000..8b7d5d5 --- /dev/null +++ b/mmdet/models/backbones/pvt.py @@ -0,0 +1,591 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math +import warnings + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import (Conv2d, build_activation_layer, build_norm_layer, + constant_init, normal_init, trunc_normal_init) +from mmcv.cnn.bricks.drop import build_dropout +from mmcv.cnn.bricks.transformer import MultiheadAttention +from mmcv.cnn.utils.weight_init import trunc_normal_ +from mmcv.runner import (BaseModule, ModuleList, Sequential, _load_checkpoint, + load_state_dict) +from torch.nn.modules.utils import _pair as to_2tuple + +from ...utils import get_root_logger +from ..builder import BACKBONES +from ..utils import PatchEmbed, nchw_to_nlc, nlc_to_nchw, pvt_convert + + +class MixFFN(BaseModule): + """An implementation of MixFFN of PVT. + + The differences between MixFFN & FFN: + 1. Use 1X1 Conv to replace Linear layer. + 2. Introduce 3X3 Depth-wise Conv to encode positional information. + + Args: + embed_dims (int): The feature dimension. Same as + `MultiheadAttention`. + feedforward_channels (int): The hidden dimension of FFNs. + act_cfg (dict, optional): The activation config for FFNs. + Default: dict(type='GELU'). + ffn_drop (float, optional): Probability of an element to be + zeroed in FFN. Default 0.0. + dropout_layer (obj:`ConfigDict`): The dropout_layer used + when adding the shortcut. + Default: None. + use_conv (bool): If True, add 3x3 DWConv between two Linear layers. + Defaults: False. + init_cfg (obj:`mmcv.ConfigDict`): The Config for initialization. + Default: None. + """ + + def __init__(self, + embed_dims, + feedforward_channels, + act_cfg=dict(type='GELU'), + ffn_drop=0., + dropout_layer=None, + use_conv=False, + init_cfg=None): + super(MixFFN, self).__init__(init_cfg=init_cfg) + + self.embed_dims = embed_dims + self.feedforward_channels = feedforward_channels + self.act_cfg = act_cfg + activate = build_activation_layer(act_cfg) + + in_channels = embed_dims + fc1 = Conv2d( + in_channels=in_channels, + out_channels=feedforward_channels, + kernel_size=1, + stride=1, + bias=True) + if use_conv: + # 3x3 depth wise conv to provide positional encode information + dw_conv = Conv2d( + in_channels=feedforward_channels, + out_channels=feedforward_channels, + kernel_size=3, + stride=1, + padding=(3 - 1) // 2, + bias=True, + groups=feedforward_channels) + fc2 = Conv2d( + in_channels=feedforward_channels, + out_channels=in_channels, + kernel_size=1, + stride=1, + bias=True) + drop = nn.Dropout(ffn_drop) + layers = [fc1, activate, drop, fc2, drop] + if use_conv: + layers.insert(1, dw_conv) + self.layers = Sequential(*layers) + self.dropout_layer = build_dropout( + dropout_layer) if dropout_layer else torch.nn.Identity() + + def forward(self, x, hw_shape, identity=None): + out = nlc_to_nchw(x, hw_shape) + out = self.layers(out) + out = nchw_to_nlc(out) + if identity is None: + identity = x + return identity + self.dropout_layer(out) + + +class SpatialReductionAttention(MultiheadAttention): + """An implementation of Spatial Reduction Attention of PVT. + + This module is modified from MultiheadAttention which is a module from + mmcv.cnn.bricks.transformer. + + Args: + embed_dims (int): The embedding dimension. + num_heads (int): Parallel attention heads. + attn_drop (float): A Dropout layer on attn_output_weights. + Default: 0.0. + proj_drop (float): A Dropout layer after `nn.MultiheadAttention`. + Default: 0.0. + dropout_layer (obj:`ConfigDict`): The dropout_layer used + when adding the shortcut. Default: None. + batch_first (bool): Key, Query and Value are shape of + (batch, n, embed_dim) + or (n, batch, embed_dim). Default: False. + qkv_bias (bool): enable bias for qkv if True. Default: True. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='LN'). + sr_ratio (int): The ratio of spatial reduction of Spatial Reduction + Attention of PVT. Default: 1. + init_cfg (obj:`mmcv.ConfigDict`): The Config for initialization. + Default: None. + """ + + def __init__(self, + embed_dims, + num_heads, + attn_drop=0., + proj_drop=0., + dropout_layer=None, + batch_first=True, + qkv_bias=True, + norm_cfg=dict(type='LN'), + sr_ratio=1, + init_cfg=None): + super().__init__( + embed_dims, + num_heads, + attn_drop, + proj_drop, + batch_first=batch_first, + dropout_layer=dropout_layer, + bias=qkv_bias, + init_cfg=init_cfg) + + self.sr_ratio = sr_ratio + if sr_ratio > 1: + self.sr = Conv2d( + in_channels=embed_dims, + out_channels=embed_dims, + kernel_size=sr_ratio, + stride=sr_ratio) + # The ret[0] of build_norm_layer is norm name. + self.norm = build_norm_layer(norm_cfg, embed_dims)[1] + + # handle the BC-breaking from https://github.com/open-mmlab/mmcv/pull/1418 # noqa + from mmdet import digit_version, mmcv_version + if mmcv_version < digit_version('1.3.17'): + warnings.warn('The legacy version of forward function in' + 'SpatialReductionAttention is deprecated in' + 'mmcv>=1.3.17 and will no longer support in the' + 'future. Please upgrade your mmcv.') + self.forward = self.legacy_forward + + def forward(self, x, hw_shape, identity=None): + + x_q = x + if self.sr_ratio > 1: + x_kv = nlc_to_nchw(x, hw_shape) + x_kv = self.sr(x_kv) + x_kv = nchw_to_nlc(x_kv) + x_kv = self.norm(x_kv) + else: + x_kv = x + + if identity is None: + identity = x_q + + # Because the dataflow('key', 'query', 'value') of + # ``torch.nn.MultiheadAttention`` is (num_query, batch, + # embed_dims), We should adjust the shape of dataflow from + # batch_first (batch, num_query, embed_dims) to num_query_first + # (num_query ,batch, embed_dims), and recover ``attn_output`` + # from num_query_first to batch_first. + if self.batch_first: + x_q = x_q.transpose(0, 1) + x_kv = x_kv.transpose(0, 1) + + out = self.attn(query=x_q, key=x_kv, value=x_kv)[0] + + if self.batch_first: + out = out.transpose(0, 1) + + return identity + self.dropout_layer(self.proj_drop(out)) + + def legacy_forward(self, x, hw_shape, identity=None): + """multi head attention forward in mmcv version < 1.3.17.""" + x_q = x + if self.sr_ratio > 1: + x_kv = nlc_to_nchw(x, hw_shape) + x_kv = self.sr(x_kv) + x_kv = nchw_to_nlc(x_kv) + x_kv = self.norm(x_kv) + else: + x_kv = x + + if identity is None: + identity = x_q + + out = self.attn(query=x_q, key=x_kv, value=x_kv)[0] + + return identity + self.dropout_layer(self.proj_drop(out)) + + +class PVTEncoderLayer(BaseModule): + """Implements one encoder layer in PVT. + + Args: + embed_dims (int): The feature dimension. + num_heads (int): Parallel attention heads. + feedforward_channels (int): The hidden dimension for FFNs. + drop_rate (float): Probability of an element to be zeroed. + after the feed forward layer. Default: 0.0. + attn_drop_rate (float): The drop out rate for attention layer. + Default: 0.0. + drop_path_rate (float): stochastic depth rate. Default: 0.0. + qkv_bias (bool): enable bias for qkv if True. + Default: True. + act_cfg (dict): The activation config for FFNs. + Default: dict(type='GELU'). + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='LN'). + sr_ratio (int): The ratio of spatial reduction of Spatial Reduction + Attention of PVT. Default: 1. + use_conv_ffn (bool): If True, use Convolutional FFN to replace FFN. + Default: False. + init_cfg (dict, optional): Initialization config dict. + Default: None. + """ + + def __init__(self, + embed_dims, + num_heads, + feedforward_channels, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0., + qkv_bias=True, + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='LN'), + sr_ratio=1, + use_conv_ffn=False, + init_cfg=None): + super(PVTEncoderLayer, self).__init__(init_cfg=init_cfg) + + # The ret[0] of build_norm_layer is norm name. + self.norm1 = build_norm_layer(norm_cfg, embed_dims)[1] + + self.attn = SpatialReductionAttention( + embed_dims=embed_dims, + num_heads=num_heads, + attn_drop=attn_drop_rate, + proj_drop=drop_rate, + dropout_layer=dict(type='DropPath', drop_prob=drop_path_rate), + qkv_bias=qkv_bias, + norm_cfg=norm_cfg, + sr_ratio=sr_ratio) + + # The ret[0] of build_norm_layer is norm name. + self.norm2 = build_norm_layer(norm_cfg, embed_dims)[1] + + self.ffn = MixFFN( + embed_dims=embed_dims, + feedforward_channels=feedforward_channels, + ffn_drop=drop_rate, + dropout_layer=dict(type='DropPath', drop_prob=drop_path_rate), + use_conv=use_conv_ffn, + act_cfg=act_cfg) + + def forward(self, x, hw_shape): + x = self.attn(self.norm1(x), hw_shape, identity=x) + x = self.ffn(self.norm2(x), hw_shape, identity=x) + + return x + + +class AbsolutePositionEmbedding(BaseModule): + """An implementation of the absolute position embedding in PVT. + + Args: + pos_shape (int): The shape of the absolute position embedding. + pos_dim (int): The dimension of the absolute position embedding. + drop_rate (float): Probability of an element to be zeroed. + Default: 0.0. + """ + + def __init__(self, pos_shape, pos_dim, drop_rate=0., init_cfg=None): + super().__init__(init_cfg=init_cfg) + + if isinstance(pos_shape, int): + pos_shape = to_2tuple(pos_shape) + elif isinstance(pos_shape, tuple): + if len(pos_shape) == 1: + pos_shape = to_2tuple(pos_shape[0]) + assert len(pos_shape) == 2, \ + f'The size of image should have length 1 or 2, ' \ + f'but got {len(pos_shape)}' + self.pos_shape = pos_shape + self.pos_dim = pos_dim + + self.pos_embed = nn.Parameter( + torch.zeros(1, pos_shape[0] * pos_shape[1], pos_dim)) + self.drop = nn.Dropout(p=drop_rate) + + def init_weights(self): + trunc_normal_(self.pos_embed, std=0.02) + + def resize_pos_embed(self, pos_embed, input_shape, mode='bilinear'): + """Resize pos_embed weights. + + Resize pos_embed using bilinear interpolate method. + + Args: + pos_embed (torch.Tensor): Position embedding weights. + input_shape (tuple): Tuple for (downsampled input image height, + downsampled input image width). + mode (str): Algorithm used for upsampling: + ``'nearest'`` | ``'linear'`` | ``'bilinear'`` | ``'bicubic'`` | + ``'trilinear'``. Default: ``'bilinear'``. + + Return: + torch.Tensor: The resized pos_embed of shape [B, L_new, C]. + """ + assert pos_embed.ndim == 3, 'shape of pos_embed must be [B, L, C]' + pos_h, pos_w = self.pos_shape + pos_embed_weight = pos_embed[:, (-1 * pos_h * pos_w):] + pos_embed_weight = pos_embed_weight.reshape( + 1, pos_h, pos_w, self.pos_dim).permute(0, 3, 1, 2).contiguous() + pos_embed_weight = F.interpolate( + pos_embed_weight, size=input_shape, mode=mode) + pos_embed_weight = torch.flatten(pos_embed_weight, + 2).transpose(1, 2).contiguous() + pos_embed = pos_embed_weight + + return pos_embed + + def forward(self, x, hw_shape, mode='bilinear'): + pos_embed = self.resize_pos_embed(self.pos_embed, hw_shape, mode) + return self.drop(x + pos_embed) + + +@BACKBONES.register_module() +class PyramidVisionTransformer(BaseModule): + """Pyramid Vision Transformer (PVT) + + Implementation of `Pyramid Vision Transformer: A Versatile Backbone for + Dense Prediction without Convolutions + `_. + + Args: + pretrain_img_size (int | tuple[int]): The size of input image when + pretrain. Defaults: 224. + in_channels (int): Number of input channels. Default: 3. + embed_dims (int): Embedding dimension. Default: 64. + num_stags (int): The num of stages. Default: 4. + num_layers (Sequence[int]): The layer number of each transformer encode + layer. Default: [3, 4, 6, 3]. + num_heads (Sequence[int]): The attention heads of each transformer + encode layer. Default: [1, 2, 5, 8]. + patch_sizes (Sequence[int]): The patch_size of each patch embedding. + Default: [4, 2, 2, 2]. + strides (Sequence[int]): The stride of each patch embedding. + Default: [4, 2, 2, 2]. + paddings (Sequence[int]): The padding of each patch embedding. + Default: [0, 0, 0, 0]. + sr_ratios (Sequence[int]): The spatial reduction rate of each + transformer encode layer. Default: [8, 4, 2, 1]. + out_indices (Sequence[int] | int): Output from which stages. + Default: (0, 1, 2, 3). + mlp_ratios (Sequence[int]): The ratio of the mlp hidden dim to the + embedding dim of each transformer encode layer. + Default: [8, 8, 4, 4]. + qkv_bias (bool): Enable bias for qkv if True. Default: True. + drop_rate (float): Probability of an element to be zeroed. + Default 0.0. + attn_drop_rate (float): The drop out rate for attention layer. + Default 0.0. + drop_path_rate (float): stochastic depth rate. Default 0.1. + use_abs_pos_embed (bool): If True, add absolute position embedding to + the patch embedding. Defaults: True. + use_conv_ffn (bool): If True, use Convolutional FFN to replace FFN. + Default: False. + act_cfg (dict): The activation config for FFNs. + Default: dict(type='GELU'). + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='LN'). + pretrained (str, optional): model pretrained path. Default: None. + convert_weights (bool): The flag indicates whether the + pre-trained model is from the original repo. We may need + to convert some keys to make it compatible. + Default: True. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + """ + + def __init__(self, + pretrain_img_size=224, + in_channels=3, + embed_dims=64, + num_stages=4, + num_layers=[3, 4, 6, 3], + num_heads=[1, 2, 5, 8], + patch_sizes=[4, 2, 2, 2], + strides=[4, 2, 2, 2], + paddings=[0, 0, 0, 0], + sr_ratios=[8, 4, 2, 1], + out_indices=(0, 1, 2, 3), + mlp_ratios=[8, 8, 4, 4], + qkv_bias=True, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.1, + use_abs_pos_embed=True, + norm_after_stage=False, + use_conv_ffn=False, + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='LN', eps=1e-6), + pretrained=None, + convert_weights=True, + init_cfg=None): + super().__init__(init_cfg=init_cfg) + + self.convert_weights = convert_weights + if isinstance(pretrain_img_size, int): + pretrain_img_size = to_2tuple(pretrain_img_size) + elif isinstance(pretrain_img_size, tuple): + if len(pretrain_img_size) == 1: + pretrain_img_size = to_2tuple(pretrain_img_size[0]) + assert len(pretrain_img_size) == 2, \ + f'The size of image should have length 1 or 2, ' \ + f'but got {len(pretrain_img_size)}' + + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be setting at the same time' + if isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is deprecated, ' + 'please use "init_cfg" instead') + self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is None: + self.init_cfg = init_cfg + else: + raise TypeError('pretrained must be a str or None') + + self.embed_dims = embed_dims + + self.num_stages = num_stages + self.num_layers = num_layers + self.num_heads = num_heads + self.patch_sizes = patch_sizes + self.strides = strides + self.sr_ratios = sr_ratios + assert num_stages == len(num_layers) == len(num_heads) \ + == len(patch_sizes) == len(strides) == len(sr_ratios) + + self.out_indices = out_indices + assert max(out_indices) < self.num_stages + self.pretrained = pretrained + + # transformer encoder + dpr = [ + x.item() + for x in torch.linspace(0, drop_path_rate, sum(num_layers)) + ] # stochastic num_layer decay rule + + cur = 0 + self.layers = ModuleList() + for i, num_layer in enumerate(num_layers): + embed_dims_i = embed_dims * num_heads[i] + patch_embed = PatchEmbed( + in_channels=in_channels, + embed_dims=embed_dims_i, + kernel_size=patch_sizes[i], + stride=strides[i], + padding=paddings[i], + bias=True, + norm_cfg=norm_cfg) + + layers = ModuleList() + if use_abs_pos_embed: + pos_shape = pretrain_img_size // np.prod(patch_sizes[:i + 1]) + pos_embed = AbsolutePositionEmbedding( + pos_shape=pos_shape, + pos_dim=embed_dims_i, + drop_rate=drop_rate) + layers.append(pos_embed) + layers.extend([ + PVTEncoderLayer( + embed_dims=embed_dims_i, + num_heads=num_heads[i], + feedforward_channels=mlp_ratios[i] * embed_dims_i, + drop_rate=drop_rate, + attn_drop_rate=attn_drop_rate, + drop_path_rate=dpr[cur + idx], + qkv_bias=qkv_bias, + act_cfg=act_cfg, + norm_cfg=norm_cfg, + sr_ratio=sr_ratios[i], + use_conv_ffn=use_conv_ffn) for idx in range(num_layer) + ]) + in_channels = embed_dims_i + # The ret[0] of build_norm_layer is norm name. + if norm_after_stage: + norm = build_norm_layer(norm_cfg, embed_dims_i)[1] + else: + norm = nn.Identity() + self.layers.append(ModuleList([patch_embed, layers, norm])) + cur += num_layer + + def init_weights(self): + logger = get_root_logger() + if self.init_cfg is None: + logger.warn(f'No pre-trained weights for ' + f'{self.__class__.__name__}, ' + f'training start from scratch') + for m in self.modules(): + if isinstance(m, nn.Linear): + trunc_normal_init(m, std=.02, bias=0.) + elif isinstance(m, nn.LayerNorm): + constant_init(m, 1.0) + elif isinstance(m, nn.Conv2d): + fan_out = m.kernel_size[0] * m.kernel_size[ + 1] * m.out_channels + fan_out //= m.groups + normal_init(m, 0, math.sqrt(2.0 / fan_out)) + elif isinstance(m, AbsolutePositionEmbedding): + m.init_weights() + else: + assert 'checkpoint' in self.init_cfg, f'Only support ' \ + f'specify `Pretrained` in ' \ + f'`init_cfg` in ' \ + f'{self.__class__.__name__} ' + checkpoint = _load_checkpoint( + self.init_cfg.checkpoint, logger=logger, map_location='cpu') + logger.warn(f'Load pre-trained model for ' + f'{self.__class__.__name__} from original repo') + if 'state_dict' in checkpoint: + state_dict = checkpoint['state_dict'] + elif 'model' in checkpoint: + state_dict = checkpoint['model'] + else: + state_dict = checkpoint + if self.convert_weights: + # Because pvt backbones are not supported by mmcls, + # so we need to convert pre-trained weights to match this + # implementation. + state_dict = pvt_convert(state_dict) + load_state_dict(self, state_dict, strict=False, logger=logger) + + def forward(self, x): + outs = [] + + for i, layer in enumerate(self.layers): + x, hw_shape = layer[0](x) + + for block in layer[1]: + x = block(x, hw_shape) + x = layer[2](x) + x = nlc_to_nchw(x, hw_shape) + if i in self.out_indices: + outs.append(x) + + return outs + + +@BACKBONES.register_module() +class PyramidVisionTransformerV2(PyramidVisionTransformer): + """Implementation of `PVTv2: Improved Baselines with Pyramid Vision + Transformer `_.""" + + def __init__(self, **kwargs): + super(PyramidVisionTransformerV2, self).__init__( + patch_sizes=[7, 3, 3, 3], + paddings=[3, 1, 1, 1], + use_abs_pos_embed=False, + norm_after_stage=True, + use_conv_ffn=True, + **kwargs) diff --git a/mmdet/models/backbones/regnet.py b/mmdet/models/backbones/regnet.py new file mode 100644 index 0000000..63adc3c --- /dev/null +++ b/mmdet/models/backbones/regnet.py @@ -0,0 +1,356 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import numpy as np +import torch.nn as nn +from mmcv.cnn import build_conv_layer, build_norm_layer + +from ..builder import BACKBONES +from .resnet import ResNet +from .resnext import Bottleneck + + +@BACKBONES.register_module() +class RegNet(ResNet): + """RegNet backbone. + + More details can be found in `paper `_ . + + Args: + arch (dict): The parameter of RegNets. + + - w0 (int): initial width + - wa (float): slope of width + - wm (float): quantization parameter to quantize the width + - depth (int): depth of the backbone + - group_w (int): width of group + - bot_mul (float): bottleneck ratio, i.e. expansion of bottleneck. + strides (Sequence[int]): Strides of the first block of each stage. + base_channels (int): Base channels after stem layer. + in_channels (int): Number of input image channels. Default: 3. + dilations (Sequence[int]): Dilation of each stage. + out_indices (Sequence[int]): Output from which stages. + style (str): `pytorch` or `caffe`. If set to "pytorch", the stride-two + layer is the 3x3 conv layer, otherwise the stride-two layer is + the first 1x1 conv layer. + frozen_stages (int): Stages to be frozen (all param fixed). -1 means + not freezing any parameters. + norm_cfg (dict): dictionary to construct and config norm layer. + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. + zero_init_residual (bool): whether to use zero init for last norm layer + in resblocks to let them behave as identity. + pretrained (str, optional): model pretrained path. Default: None + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + + Example: + >>> from mmdet.models import RegNet + >>> import torch + >>> self = RegNet( + arch=dict( + w0=88, + wa=26.31, + wm=2.25, + group_w=48, + depth=25, + bot_mul=1.0)) + >>> self.eval() + >>> inputs = torch.rand(1, 3, 32, 32) + >>> level_outputs = self.forward(inputs) + >>> for level_out in level_outputs: + ... print(tuple(level_out.shape)) + (1, 96, 8, 8) + (1, 192, 4, 4) + (1, 432, 2, 2) + (1, 1008, 1, 1) + """ + arch_settings = { + 'regnetx_400mf': + dict(w0=24, wa=24.48, wm=2.54, group_w=16, depth=22, bot_mul=1.0), + 'regnetx_800mf': + dict(w0=56, wa=35.73, wm=2.28, group_w=16, depth=16, bot_mul=1.0), + 'regnetx_1.6gf': + dict(w0=80, wa=34.01, wm=2.25, group_w=24, depth=18, bot_mul=1.0), + 'regnetx_3.2gf': + dict(w0=88, wa=26.31, wm=2.25, group_w=48, depth=25, bot_mul=1.0), + 'regnetx_4.0gf': + dict(w0=96, wa=38.65, wm=2.43, group_w=40, depth=23, bot_mul=1.0), + 'regnetx_6.4gf': + dict(w0=184, wa=60.83, wm=2.07, group_w=56, depth=17, bot_mul=1.0), + 'regnetx_8.0gf': + dict(w0=80, wa=49.56, wm=2.88, group_w=120, depth=23, bot_mul=1.0), + 'regnetx_12gf': + dict(w0=168, wa=73.36, wm=2.37, group_w=112, depth=19, bot_mul=1.0), + } + + def __init__(self, + arch, + in_channels=3, + stem_channels=32, + base_channels=32, + strides=(2, 2, 2, 2), + dilations=(1, 1, 1, 1), + out_indices=(0, 1, 2, 3), + style='pytorch', + deep_stem=False, + avg_down=False, + frozen_stages=-1, + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + dcn=None, + stage_with_dcn=(False, False, False, False), + plugins=None, + with_cp=False, + zero_init_residual=True, + pretrained=None, + init_cfg=None): + super(ResNet, self).__init__(init_cfg) + + # Generate RegNet parameters first + if isinstance(arch, str): + assert arch in self.arch_settings, \ + f'"arch": "{arch}" is not one of the' \ + ' arch_settings' + arch = self.arch_settings[arch] + elif not isinstance(arch, dict): + raise ValueError('Expect "arch" to be either a string ' + f'or a dict, got {type(arch)}') + + widths, num_stages = self.generate_regnet( + arch['w0'], + arch['wa'], + arch['wm'], + arch['depth'], + ) + # Convert to per stage format + stage_widths, stage_blocks = self.get_stages_from_blocks(widths) + # Generate group widths and bot muls + group_widths = [arch['group_w'] for _ in range(num_stages)] + self.bottleneck_ratio = [arch['bot_mul'] for _ in range(num_stages)] + # Adjust the compatibility of stage_widths and group_widths + stage_widths, group_widths = self.adjust_width_group( + stage_widths, self.bottleneck_ratio, group_widths) + + # Group params by stage + self.stage_widths = stage_widths + self.group_widths = group_widths + self.depth = sum(stage_blocks) + self.stem_channels = stem_channels + self.base_channels = base_channels + self.num_stages = num_stages + assert num_stages >= 1 and num_stages <= 4 + self.strides = strides + self.dilations = dilations + assert len(strides) == len(dilations) == num_stages + self.out_indices = out_indices + assert max(out_indices) < num_stages + self.style = style + self.deep_stem = deep_stem + self.avg_down = avg_down + self.frozen_stages = frozen_stages + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.with_cp = with_cp + self.norm_eval = norm_eval + self.dcn = dcn + self.stage_with_dcn = stage_with_dcn + if dcn is not None: + assert len(stage_with_dcn) == num_stages + self.plugins = plugins + self.zero_init_residual = zero_init_residual + self.block = Bottleneck + expansion_bak = self.block.expansion + self.block.expansion = 1 + self.stage_blocks = stage_blocks[:num_stages] + + self._make_stem_layer(in_channels, stem_channels) + + block_init_cfg = None + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be specified at the same time' + if isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is deprecated, ' + 'please use "init_cfg" instead') + self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is None: + if init_cfg is None: + self.init_cfg = [ + dict(type='Kaiming', layer='Conv2d'), + dict( + type='Constant', + val=1, + layer=['_BatchNorm', 'GroupNorm']) + ] + if self.zero_init_residual: + block_init_cfg = dict( + type='Constant', val=0, override=dict(name='norm3')) + else: + raise TypeError('pretrained must be a str or None') + + self.inplanes = stem_channels + self.res_layers = [] + for i, num_blocks in enumerate(self.stage_blocks): + stride = self.strides[i] + dilation = self.dilations[i] + group_width = self.group_widths[i] + width = int(round(self.stage_widths[i] * self.bottleneck_ratio[i])) + stage_groups = width // group_width + + dcn = self.dcn if self.stage_with_dcn[i] else None + if self.plugins is not None: + stage_plugins = self.make_stage_plugins(self.plugins, i) + else: + stage_plugins = None + + res_layer = self.make_res_layer( + block=self.block, + inplanes=self.inplanes, + planes=self.stage_widths[i], + num_blocks=num_blocks, + stride=stride, + dilation=dilation, + style=self.style, + avg_down=self.avg_down, + with_cp=self.with_cp, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + dcn=dcn, + plugins=stage_plugins, + groups=stage_groups, + base_width=group_width, + base_channels=self.stage_widths[i], + init_cfg=block_init_cfg) + self.inplanes = self.stage_widths[i] + layer_name = f'layer{i + 1}' + self.add_module(layer_name, res_layer) + self.res_layers.append(layer_name) + + self._freeze_stages() + + self.feat_dim = stage_widths[-1] + self.block.expansion = expansion_bak + + def _make_stem_layer(self, in_channels, base_channels): + self.conv1 = build_conv_layer( + self.conv_cfg, + in_channels, + base_channels, + kernel_size=3, + stride=2, + padding=1, + bias=False) + self.norm1_name, norm1 = build_norm_layer( + self.norm_cfg, base_channels, postfix=1) + self.add_module(self.norm1_name, norm1) + self.relu = nn.ReLU(inplace=True) + + def generate_regnet(self, + initial_width, + width_slope, + width_parameter, + depth, + divisor=8): + """Generates per block width from RegNet parameters. + + Args: + initial_width ([int]): Initial width of the backbone + width_slope ([float]): Slope of the quantized linear function + width_parameter ([int]): Parameter used to quantize the width. + depth ([int]): Depth of the backbone. + divisor (int, optional): The divisor of channels. Defaults to 8. + + Returns: + list, int: return a list of widths of each stage and the number \ + of stages + """ + assert width_slope >= 0 + assert initial_width > 0 + assert width_parameter > 1 + assert initial_width % divisor == 0 + widths_cont = np.arange(depth) * width_slope + initial_width + ks = np.round( + np.log(widths_cont / initial_width) / np.log(width_parameter)) + widths = initial_width * np.power(width_parameter, ks) + widths = np.round(np.divide(widths, divisor)) * divisor + num_stages = len(np.unique(widths)) + widths, widths_cont = widths.astype(int).tolist(), widths_cont.tolist() + return widths, num_stages + + @staticmethod + def quantize_float(number, divisor): + """Converts a float to closest non-zero int divisible by divisor. + + Args: + number (int): Original number to be quantized. + divisor (int): Divisor used to quantize the number. + + Returns: + int: quantized number that is divisible by devisor. + """ + return int(round(number / divisor) * divisor) + + def adjust_width_group(self, widths, bottleneck_ratio, groups): + """Adjusts the compatibility of widths and groups. + + Args: + widths (list[int]): Width of each stage. + bottleneck_ratio (float): Bottleneck ratio. + groups (int): number of groups in each stage + + Returns: + tuple(list): The adjusted widths and groups of each stage. + """ + bottleneck_width = [ + int(w * b) for w, b in zip(widths, bottleneck_ratio) + ] + groups = [min(g, w_bot) for g, w_bot in zip(groups, bottleneck_width)] + bottleneck_width = [ + self.quantize_float(w_bot, g) + for w_bot, g in zip(bottleneck_width, groups) + ] + widths = [ + int(w_bot / b) + for w_bot, b in zip(bottleneck_width, bottleneck_ratio) + ] + return widths, groups + + def get_stages_from_blocks(self, widths): + """Gets widths/stage_blocks of network at each stage. + + Args: + widths (list[int]): Width in each stage. + + Returns: + tuple(list): width and depth of each stage + """ + width_diff = [ + width != width_prev + for width, width_prev in zip(widths + [0], [0] + widths) + ] + stage_widths = [ + width for width, diff in zip(widths, width_diff[:-1]) if diff + ] + stage_blocks = np.diff([ + depth for depth, diff in zip(range(len(width_diff)), width_diff) + if diff + ]).tolist() + return stage_widths, stage_blocks + + def forward(self, x): + """Forward function.""" + x = self.conv1(x) + x = self.norm1(x) + x = self.relu(x) + + outs = [] + for i, layer_name in enumerate(self.res_layers): + res_layer = getattr(self, layer_name) + x = res_layer(x) + if i in self.out_indices: + outs.append(x) + return tuple(outs) diff --git a/mmdet/models/backbones/res2net.py b/mmdet/models/backbones/res2net.py new file mode 100644 index 0000000..96afb2f --- /dev/null +++ b/mmdet/models/backbones/res2net.py @@ -0,0 +1,327 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math + +import torch +import torch.nn as nn +import torch.utils.checkpoint as cp +from mmcv.cnn import build_conv_layer, build_norm_layer +from mmcv.runner import Sequential + +from ..builder import BACKBONES +from .resnet import Bottleneck as _Bottleneck +from .resnet import ResNet + + +class Bottle2neck(_Bottleneck): + expansion = 4 + + def __init__(self, + inplanes, + planes, + scales=4, + base_width=26, + base_channels=64, + stage_type='normal', + **kwargs): + """Bottle2neck block for Res2Net. + + If style is "pytorch", the stride-two layer is the 3x3 conv layer, if + it is "caffe", the stride-two layer is the first 1x1 conv layer. + """ + super(Bottle2neck, self).__init__(inplanes, planes, **kwargs) + assert scales > 1, 'Res2Net degenerates to ResNet when scales = 1.' + width = int(math.floor(self.planes * (base_width / base_channels))) + + self.norm1_name, norm1 = build_norm_layer( + self.norm_cfg, width * scales, postfix=1) + self.norm3_name, norm3 = build_norm_layer( + self.norm_cfg, self.planes * self.expansion, postfix=3) + + self.conv1 = build_conv_layer( + self.conv_cfg, + self.inplanes, + width * scales, + kernel_size=1, + stride=self.conv1_stride, + bias=False) + self.add_module(self.norm1_name, norm1) + + if stage_type == 'stage' and self.conv2_stride != 1: + self.pool = nn.AvgPool2d( + kernel_size=3, stride=self.conv2_stride, padding=1) + convs = [] + bns = [] + + fallback_on_stride = False + if self.with_dcn: + fallback_on_stride = self.dcn.pop('fallback_on_stride', False) + if not self.with_dcn or fallback_on_stride: + for i in range(scales - 1): + convs.append( + build_conv_layer( + self.conv_cfg, + width, + width, + kernel_size=3, + stride=self.conv2_stride, + padding=self.dilation, + dilation=self.dilation, + bias=False)) + bns.append( + build_norm_layer(self.norm_cfg, width, postfix=i + 1)[1]) + self.convs = nn.ModuleList(convs) + self.bns = nn.ModuleList(bns) + else: + assert self.conv_cfg is None, 'conv_cfg must be None for DCN' + for i in range(scales - 1): + convs.append( + build_conv_layer( + self.dcn, + width, + width, + kernel_size=3, + stride=self.conv2_stride, + padding=self.dilation, + dilation=self.dilation, + bias=False)) + bns.append( + build_norm_layer(self.norm_cfg, width, postfix=i + 1)[1]) + self.convs = nn.ModuleList(convs) + self.bns = nn.ModuleList(bns) + + self.conv3 = build_conv_layer( + self.conv_cfg, + width * scales, + self.planes * self.expansion, + kernel_size=1, + bias=False) + self.add_module(self.norm3_name, norm3) + + self.stage_type = stage_type + self.scales = scales + self.width = width + delattr(self, 'conv2') + delattr(self, self.norm2_name) + + def forward(self, x): + """Forward function.""" + + def _inner_forward(x): + identity = x + + out = self.conv1(x) + out = self.norm1(out) + out = self.relu(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv1_plugin_names) + + spx = torch.split(out, self.width, 1) + sp = self.convs[0](spx[0].contiguous()) + sp = self.relu(self.bns[0](sp)) + out = sp + for i in range(1, self.scales - 1): + if self.stage_type == 'stage': + sp = spx[i] + else: + sp = sp + spx[i] + sp = self.convs[i](sp.contiguous()) + sp = self.relu(self.bns[i](sp)) + out = torch.cat((out, sp), 1) + + if self.stage_type == 'normal' or self.conv2_stride == 1: + out = torch.cat((out, spx[self.scales - 1]), 1) + elif self.stage_type == 'stage': + out = torch.cat((out, self.pool(spx[self.scales - 1])), 1) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv2_plugin_names) + + out = self.conv3(out) + out = self.norm3(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv3_plugin_names) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + out = self.relu(out) + + return out + + +class Res2Layer(Sequential): + """Res2Layer to build Res2Net style backbone. + + Args: + block (nn.Module): block used to build ResLayer. + inplanes (int): inplanes of block. + planes (int): planes of block. + num_blocks (int): number of blocks. + stride (int): stride of the first block. Default: 1 + avg_down (bool): Use AvgPool instead of stride conv when + downsampling in the bottle2neck. Default: False + conv_cfg (dict): dictionary to construct and config conv layer. + Default: None + norm_cfg (dict): dictionary to construct and config norm layer. + Default: dict(type='BN') + scales (int): Scales used in Res2Net. Default: 4 + base_width (int): Basic width of each scale. Default: 26 + """ + + def __init__(self, + block, + inplanes, + planes, + num_blocks, + stride=1, + avg_down=True, + conv_cfg=None, + norm_cfg=dict(type='BN'), + scales=4, + base_width=26, + **kwargs): + self.block = block + + downsample = None + if stride != 1 or inplanes != planes * block.expansion: + downsample = nn.Sequential( + nn.AvgPool2d( + kernel_size=stride, + stride=stride, + ceil_mode=True, + count_include_pad=False), + build_conv_layer( + conv_cfg, + inplanes, + planes * block.expansion, + kernel_size=1, + stride=1, + bias=False), + build_norm_layer(norm_cfg, planes * block.expansion)[1], + ) + + layers = [] + layers.append( + block( + inplanes=inplanes, + planes=planes, + stride=stride, + downsample=downsample, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + scales=scales, + base_width=base_width, + stage_type='stage', + **kwargs)) + inplanes = planes * block.expansion + for i in range(1, num_blocks): + layers.append( + block( + inplanes=inplanes, + planes=planes, + stride=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + scales=scales, + base_width=base_width, + **kwargs)) + super(Res2Layer, self).__init__(*layers) + + +@BACKBONES.register_module() +class Res2Net(ResNet): + """Res2Net backbone. + + Args: + scales (int): Scales used in Res2Net. Default: 4 + base_width (int): Basic width of each scale. Default: 26 + depth (int): Depth of res2net, from {50, 101, 152}. + in_channels (int): Number of input image channels. Default: 3. + num_stages (int): Res2net stages. Default: 4. + strides (Sequence[int]): Strides of the first block of each stage. + dilations (Sequence[int]): Dilation of each stage. + out_indices (Sequence[int]): Output from which stages. + style (str): `pytorch` or `caffe`. If set to "pytorch", the stride-two + layer is the 3x3 conv layer, otherwise the stride-two layer is + the first 1x1 conv layer. + deep_stem (bool): Replace 7x7 conv in input stem with 3 3x3 conv + avg_down (bool): Use AvgPool instead of stride conv when + downsampling in the bottle2neck. + frozen_stages (int): Stages to be frozen (stop grad and set eval mode). + -1 means not freezing any parameters. + norm_cfg (dict): Dictionary to construct and config norm layer. + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. + plugins (list[dict]): List of plugins for stages, each dict contains: + + - cfg (dict, required): Cfg dict to build plugin. + - position (str, required): Position inside block to insert + plugin, options are 'after_conv1', 'after_conv2', 'after_conv3'. + - stages (tuple[bool], optional): Stages to apply plugin, length + should be same as 'num_stages'. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. + zero_init_residual (bool): Whether to use zero init for last norm layer + in resblocks to let them behave as identity. + pretrained (str, optional): model pretrained path. Default: None + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + + Example: + >>> from mmdet.models import Res2Net + >>> import torch + >>> self = Res2Net(depth=50, scales=4, base_width=26) + >>> self.eval() + >>> inputs = torch.rand(1, 3, 32, 32) + >>> level_outputs = self.forward(inputs) + >>> for level_out in level_outputs: + ... print(tuple(level_out.shape)) + (1, 256, 8, 8) + (1, 512, 4, 4) + (1, 1024, 2, 2) + (1, 2048, 1, 1) + """ + + arch_settings = { + 50: (Bottle2neck, (3, 4, 6, 3)), + 101: (Bottle2neck, (3, 4, 23, 3)), + 152: (Bottle2neck, (3, 8, 36, 3)) + } + + def __init__(self, + scales=4, + base_width=26, + style='pytorch', + deep_stem=True, + avg_down=True, + pretrained=None, + init_cfg=None, + **kwargs): + self.scales = scales + self.base_width = base_width + super(Res2Net, self).__init__( + style='pytorch', + deep_stem=True, + avg_down=True, + pretrained=pretrained, + init_cfg=init_cfg, + **kwargs) + + def make_res_layer(self, **kwargs): + return Res2Layer( + scales=self.scales, + base_width=self.base_width, + base_channels=self.base_channels, + **kwargs) diff --git a/mmdet/models/backbones/resnest.py b/mmdet/models/backbones/resnest.py new file mode 100644 index 0000000..69629b9 --- /dev/null +++ b/mmdet/models/backbones/resnest.py @@ -0,0 +1,322 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math + +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.utils.checkpoint as cp +from mmcv.cnn import build_conv_layer, build_norm_layer +from mmcv.runner import BaseModule + +from ..builder import BACKBONES +from ..utils import ResLayer +from .resnet import Bottleneck as _Bottleneck +from .resnet import ResNetV1d + + +class RSoftmax(nn.Module): + """Radix Softmax module in ``SplitAttentionConv2d``. + + Args: + radix (int): Radix of input. + groups (int): Groups of input. + """ + + def __init__(self, radix, groups): + super().__init__() + self.radix = radix + self.groups = groups + + def forward(self, x): + batch = x.size(0) + if self.radix > 1: + x = x.view(batch, self.groups, self.radix, -1).transpose(1, 2) + x = F.softmax(x, dim=1) + x = x.reshape(batch, -1) + else: + x = torch.sigmoid(x) + return x + + +class SplitAttentionConv2d(BaseModule): + """Split-Attention Conv2d in ResNeSt. + + Args: + in_channels (int): Number of channels in the input feature map. + channels (int): Number of intermediate channels. + kernel_size (int | tuple[int]): Size of the convolution kernel. + stride (int | tuple[int]): Stride of the convolution. + padding (int | tuple[int]): Zero-padding added to both sides of + dilation (int | tuple[int]): Spacing between kernel elements. + groups (int): Number of blocked connections from input channels to + output channels. + groups (int): Same as nn.Conv2d. + radix (int): Radix of SpltAtConv2d. Default: 2 + reduction_factor (int): Reduction factor of inter_channels. Default: 4. + conv_cfg (dict): Config dict for convolution layer. Default: None, + which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. Default: None. + dcn (dict): Config dict for DCN. Default: None. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + in_channels, + channels, + kernel_size, + stride=1, + padding=0, + dilation=1, + groups=1, + radix=2, + reduction_factor=4, + conv_cfg=None, + norm_cfg=dict(type='BN'), + dcn=None, + init_cfg=None): + super(SplitAttentionConv2d, self).__init__(init_cfg) + inter_channels = max(in_channels * radix // reduction_factor, 32) + self.radix = radix + self.groups = groups + self.channels = channels + self.with_dcn = dcn is not None + self.dcn = dcn + fallback_on_stride = False + if self.with_dcn: + fallback_on_stride = self.dcn.pop('fallback_on_stride', False) + if self.with_dcn and not fallback_on_stride: + assert conv_cfg is None, 'conv_cfg must be None for DCN' + conv_cfg = dcn + self.conv = build_conv_layer( + conv_cfg, + in_channels, + channels * radix, + kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + groups=groups * radix, + bias=False) + # To be consistent with original implementation, starting from 0 + self.norm0_name, norm0 = build_norm_layer( + norm_cfg, channels * radix, postfix=0) + self.add_module(self.norm0_name, norm0) + self.relu = nn.ReLU(inplace=True) + self.fc1 = build_conv_layer( + None, channels, inter_channels, 1, groups=self.groups) + self.norm1_name, norm1 = build_norm_layer( + norm_cfg, inter_channels, postfix=1) + self.add_module(self.norm1_name, norm1) + self.fc2 = build_conv_layer( + None, inter_channels, channels * radix, 1, groups=self.groups) + self.rsoftmax = RSoftmax(radix, groups) + + @property + def norm0(self): + """nn.Module: the normalization layer named "norm0" """ + return getattr(self, self.norm0_name) + + @property + def norm1(self): + """nn.Module: the normalization layer named "norm1" """ + return getattr(self, self.norm1_name) + + def forward(self, x): + x = self.conv(x) + x = self.norm0(x) + x = self.relu(x) + + batch, rchannel = x.shape[:2] + batch = x.size(0) + if self.radix > 1: + splits = x.view(batch, self.radix, -1, *x.shape[2:]) + gap = splits.sum(dim=1) + else: + gap = x + gap = F.adaptive_avg_pool2d(gap, 1) + gap = self.fc1(gap) + + gap = self.norm1(gap) + gap = self.relu(gap) + + atten = self.fc2(gap) + atten = self.rsoftmax(atten).view(batch, -1, 1, 1) + + if self.radix > 1: + attens = atten.view(batch, self.radix, -1, *atten.shape[2:]) + out = torch.sum(attens * splits, dim=1) + else: + out = atten * x + return out.contiguous() + + +class Bottleneck(_Bottleneck): + """Bottleneck block for ResNeSt. + + Args: + inplane (int): Input planes of this block. + planes (int): Middle planes of this block. + groups (int): Groups of conv2. + base_width (int): Base of width in terms of base channels. Default: 4. + base_channels (int): Base of channels for calculating width. + Default: 64. + radix (int): Radix of SpltAtConv2d. Default: 2 + reduction_factor (int): Reduction factor of inter_channels in + SplitAttentionConv2d. Default: 4. + avg_down_stride (bool): Whether to use average pool for stride in + Bottleneck. Default: True. + kwargs (dict): Key word arguments for base class. + """ + expansion = 4 + + def __init__(self, + inplanes, + planes, + groups=1, + base_width=4, + base_channels=64, + radix=2, + reduction_factor=4, + avg_down_stride=True, + **kwargs): + """Bottleneck block for ResNeSt.""" + super(Bottleneck, self).__init__(inplanes, planes, **kwargs) + + if groups == 1: + width = self.planes + else: + width = math.floor(self.planes * + (base_width / base_channels)) * groups + + self.avg_down_stride = avg_down_stride and self.conv2_stride > 1 + + self.norm1_name, norm1 = build_norm_layer( + self.norm_cfg, width, postfix=1) + self.norm3_name, norm3 = build_norm_layer( + self.norm_cfg, self.planes * self.expansion, postfix=3) + + self.conv1 = build_conv_layer( + self.conv_cfg, + self.inplanes, + width, + kernel_size=1, + stride=self.conv1_stride, + bias=False) + self.add_module(self.norm1_name, norm1) + self.with_modulated_dcn = False + self.conv2 = SplitAttentionConv2d( + width, + width, + kernel_size=3, + stride=1 if self.avg_down_stride else self.conv2_stride, + padding=self.dilation, + dilation=self.dilation, + groups=groups, + radix=radix, + reduction_factor=reduction_factor, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + dcn=self.dcn) + delattr(self, self.norm2_name) + + if self.avg_down_stride: + self.avd_layer = nn.AvgPool2d(3, self.conv2_stride, padding=1) + + self.conv3 = build_conv_layer( + self.conv_cfg, + width, + self.planes * self.expansion, + kernel_size=1, + bias=False) + self.add_module(self.norm3_name, norm3) + + def forward(self, x): + + def _inner_forward(x): + identity = x + + out = self.conv1(x) + out = self.norm1(out) + out = self.relu(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv1_plugin_names) + + out = self.conv2(out) + + if self.avg_down_stride: + out = self.avd_layer(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv2_plugin_names) + + out = self.conv3(out) + out = self.norm3(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv3_plugin_names) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + out = self.relu(out) + + return out + + +@BACKBONES.register_module() +class ResNeSt(ResNetV1d): + """ResNeSt backbone. + + Args: + groups (int): Number of groups of Bottleneck. Default: 1 + base_width (int): Base width of Bottleneck. Default: 4 + radix (int): Radix of SplitAttentionConv2d. Default: 2 + reduction_factor (int): Reduction factor of inter_channels in + SplitAttentionConv2d. Default: 4. + avg_down_stride (bool): Whether to use average pool for stride in + Bottleneck. Default: True. + kwargs (dict): Keyword arguments for ResNet. + """ + + arch_settings = { + 50: (Bottleneck, (3, 4, 6, 3)), + 101: (Bottleneck, (3, 4, 23, 3)), + 152: (Bottleneck, (3, 8, 36, 3)), + 200: (Bottleneck, (3, 24, 36, 3)) + } + + def __init__(self, + groups=1, + base_width=4, + radix=2, + reduction_factor=4, + avg_down_stride=True, + **kwargs): + self.groups = groups + self.base_width = base_width + self.radix = radix + self.reduction_factor = reduction_factor + self.avg_down_stride = avg_down_stride + super(ResNeSt, self).__init__(**kwargs) + + def make_res_layer(self, **kwargs): + """Pack all blocks in a stage into a ``ResLayer``.""" + return ResLayer( + groups=self.groups, + base_width=self.base_width, + base_channels=self.base_channels, + radix=self.radix, + reduction_factor=self.reduction_factor, + avg_down_stride=self.avg_down_stride, + **kwargs) diff --git a/mmdet/models/backbones/resnet.py b/mmdet/models/backbones/resnet.py new file mode 100644 index 0000000..1eaaae6 --- /dev/null +++ b/mmdet/models/backbones/resnet.py @@ -0,0 +1,672 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch.nn as nn +import torch.utils.checkpoint as cp +from mmcv.cnn import build_conv_layer, build_norm_layer, build_plugin_layer +from mmcv.runner import BaseModule +from torch.nn.modules.batchnorm import _BatchNorm + +from ..builder import BACKBONES +from ..utils import ResLayer + + +class BasicBlock(BaseModule): + expansion = 1 + + def __init__(self, + inplanes, + planes, + stride=1, + dilation=1, + downsample=None, + style='pytorch', + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + dcn=None, + plugins=None, + init_cfg=None): + super(BasicBlock, self).__init__(init_cfg) + assert dcn is None, 'Not implemented yet.' + assert plugins is None, 'Not implemented yet.' + + self.norm1_name, norm1 = build_norm_layer(norm_cfg, planes, postfix=1) + self.norm2_name, norm2 = build_norm_layer(norm_cfg, planes, postfix=2) + + self.conv1 = build_conv_layer( + conv_cfg, + inplanes, + planes, + 3, + stride=stride, + padding=dilation, + dilation=dilation, + bias=False) + self.add_module(self.norm1_name, norm1) + self.conv2 = build_conv_layer( + conv_cfg, planes, planes, 3, padding=1, bias=False) + self.add_module(self.norm2_name, norm2) + + self.relu = nn.ReLU(inplace=True) + self.downsample = downsample + self.stride = stride + self.dilation = dilation + self.with_cp = with_cp + + @property + def norm1(self): + """nn.Module: normalization layer after the first convolution layer""" + return getattr(self, self.norm1_name) + + @property + def norm2(self): + """nn.Module: normalization layer after the second convolution layer""" + return getattr(self, self.norm2_name) + + def forward(self, x): + """Forward function.""" + + def _inner_forward(x): + identity = x + + out = self.conv1(x) + out = self.norm1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.norm2(out) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + out = self.relu(out) + + return out + + +class Bottleneck(BaseModule): + expansion = 4 + + def __init__(self, + inplanes, + planes, + stride=1, + dilation=1, + downsample=None, + style='pytorch', + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + dcn=None, + plugins=None, + init_cfg=None): + """Bottleneck block for ResNet. + + If style is "pytorch", the stride-two layer is the 3x3 conv layer, if + it is "caffe", the stride-two layer is the first 1x1 conv layer. + """ + super(Bottleneck, self).__init__(init_cfg) + assert style in ['pytorch', 'caffe'] + assert dcn is None or isinstance(dcn, dict) + assert plugins is None or isinstance(plugins, list) + if plugins is not None: + allowed_position = ['after_conv1', 'after_conv2', 'after_conv3'] + assert all(p['position'] in allowed_position for p in plugins) + + self.inplanes = inplanes + self.planes = planes + self.stride = stride + self.dilation = dilation + self.style = style + self.with_cp = with_cp + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.dcn = dcn + self.with_dcn = dcn is not None + self.plugins = plugins + self.with_plugins = plugins is not None + + if self.with_plugins: + # collect plugins for conv1/conv2/conv3 + self.after_conv1_plugins = [ + plugin['cfg'] for plugin in plugins + if plugin['position'] == 'after_conv1' + ] + self.after_conv2_plugins = [ + plugin['cfg'] for plugin in plugins + if plugin['position'] == 'after_conv2' + ] + self.after_conv3_plugins = [ + plugin['cfg'] for plugin in plugins + if plugin['position'] == 'after_conv3' + ] + + if self.style == 'pytorch': + self.conv1_stride = 1 + self.conv2_stride = stride + else: + self.conv1_stride = stride + self.conv2_stride = 1 + + self.norm1_name, norm1 = build_norm_layer(norm_cfg, planes, postfix=1) + self.norm2_name, norm2 = build_norm_layer(norm_cfg, planes, postfix=2) + self.norm3_name, norm3 = build_norm_layer( + norm_cfg, planes * self.expansion, postfix=3) + + self.conv1 = build_conv_layer( + conv_cfg, + inplanes, + planes, + kernel_size=1, + stride=self.conv1_stride, + bias=False) + self.add_module(self.norm1_name, norm1) + fallback_on_stride = False + if self.with_dcn: + fallback_on_stride = dcn.pop('fallback_on_stride', False) + if not self.with_dcn or fallback_on_stride: + self.conv2 = build_conv_layer( + conv_cfg, + planes, + planes, + kernel_size=3, + stride=self.conv2_stride, + padding=dilation, + dilation=dilation, + bias=False) + else: + assert self.conv_cfg is None, 'conv_cfg must be None for DCN' + self.conv2 = build_conv_layer( + dcn, + planes, + planes, + kernel_size=3, + stride=self.conv2_stride, + padding=dilation, + dilation=dilation, + bias=False) + + self.add_module(self.norm2_name, norm2) + self.conv3 = build_conv_layer( + conv_cfg, + planes, + planes * self.expansion, + kernel_size=1, + bias=False) + self.add_module(self.norm3_name, norm3) + + self.relu = nn.ReLU(inplace=True) + self.downsample = downsample + + if self.with_plugins: + self.after_conv1_plugin_names = self.make_block_plugins( + planes, self.after_conv1_plugins) + self.after_conv2_plugin_names = self.make_block_plugins( + planes, self.after_conv2_plugins) + self.after_conv3_plugin_names = self.make_block_plugins( + planes * self.expansion, self.after_conv3_plugins) + + def make_block_plugins(self, in_channels, plugins): + """make plugins for block. + + Args: + in_channels (int): Input channels of plugin. + plugins (list[dict]): List of plugins cfg to build. + + Returns: + list[str]: List of the names of plugin. + """ + assert isinstance(plugins, list) + plugin_names = [] + for plugin in plugins: + plugin = plugin.copy() + name, layer = build_plugin_layer( + plugin, + in_channels=in_channels, + postfix=plugin.pop('postfix', '')) + assert not hasattr(self, name), f'duplicate plugin {name}' + self.add_module(name, layer) + plugin_names.append(name) + return plugin_names + + def forward_plugin(self, x, plugin_names): + out = x + for name in plugin_names: + out = getattr(self, name)(out) + return out + + @property + def norm1(self): + """nn.Module: normalization layer after the first convolution layer""" + return getattr(self, self.norm1_name) + + @property + def norm2(self): + """nn.Module: normalization layer after the second convolution layer""" + return getattr(self, self.norm2_name) + + @property + def norm3(self): + """nn.Module: normalization layer after the third convolution layer""" + return getattr(self, self.norm3_name) + + def forward(self, x): + """Forward function.""" + + def _inner_forward(x): + identity = x + out = self.conv1(x) + out = self.norm1(out) + out = self.relu(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv1_plugin_names) + + out = self.conv2(out) + out = self.norm2(out) + out = self.relu(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv2_plugin_names) + + out = self.conv3(out) + out = self.norm3(out) + + if self.with_plugins: + out = self.forward_plugin(out, self.after_conv3_plugin_names) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + out = self.relu(out) + + return out + + +@BACKBONES.register_module() +class ResNet(BaseModule): + """ResNet backbone. + + Args: + depth (int): Depth of resnet, from {18, 34, 50, 101, 152}. + stem_channels (int | None): Number of stem channels. If not specified, + it will be the same as `base_channels`. Default: None. + base_channels (int): Number of base channels of res layer. Default: 64. + in_channels (int): Number of input image channels. Default: 3. + num_stages (int): Resnet stages. Default: 4. + strides (Sequence[int]): Strides of the first block of each stage. + dilations (Sequence[int]): Dilation of each stage. + out_indices (Sequence[int]): Output from which stages. + style (str): `pytorch` or `caffe`. If set to "pytorch", the stride-two + layer is the 3x3 conv layer, otherwise the stride-two layer is + the first 1x1 conv layer. + deep_stem (bool): Replace 7x7 conv in input stem with 3 3x3 conv + avg_down (bool): Use AvgPool instead of stride conv when + downsampling in the bottleneck. + frozen_stages (int): Stages to be frozen (stop grad and set eval mode). + -1 means not freezing any parameters. + norm_cfg (dict): Dictionary to construct and config norm layer. + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. + plugins (list[dict]): List of plugins for stages, each dict contains: + + - cfg (dict, required): Cfg dict to build plugin. + - position (str, required): Position inside block to insert + plugin, options are 'after_conv1', 'after_conv2', 'after_conv3'. + - stages (tuple[bool], optional): Stages to apply plugin, length + should be same as 'num_stages'. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. + zero_init_residual (bool): Whether to use zero init for last norm layer + in resblocks to let them behave as identity. + pretrained (str, optional): model pretrained path. Default: None + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + + Example: + >>> from mmdet.models import ResNet + >>> import torch + >>> self = ResNet(depth=18) + >>> self.eval() + >>> inputs = torch.rand(1, 3, 32, 32) + >>> level_outputs = self.forward(inputs) + >>> for level_out in level_outputs: + ... print(tuple(level_out.shape)) + (1, 64, 8, 8) + (1, 128, 4, 4) + (1, 256, 2, 2) + (1, 512, 1, 1) + """ + + arch_settings = { + 18: (BasicBlock, (2, 2, 2, 2)), + 34: (BasicBlock, (3, 4, 6, 3)), + 50: (Bottleneck, (3, 4, 6, 3)), + 101: (Bottleneck, (3, 4, 23, 3)), + 152: (Bottleneck, (3, 8, 36, 3)) + } + + def __init__(self, + depth, + in_channels=3, + stem_channels=None, + base_channels=64, + num_stages=4, + strides=(1, 2, 2, 2), + dilations=(1, 1, 1, 1), + out_indices=(0, 1, 2, 3), + style='pytorch', + deep_stem=False, + avg_down=False, + frozen_stages=-1, + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + dcn=None, + stage_with_dcn=(False, False, False, False), + plugins=None, + with_cp=False, + zero_init_residual=True, + pretrained=None, + init_cfg=None): + super(ResNet, self).__init__(init_cfg) + self.zero_init_residual = zero_init_residual + if depth not in self.arch_settings: + raise KeyError(f'invalid depth {depth} for resnet') + + block_init_cfg = None + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be specified at the same time' + if isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is deprecated, ' + 'please use "init_cfg" instead') + self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is None: + if init_cfg is None: + self.init_cfg = [ + dict(type='Kaiming', layer='Conv2d'), + dict( + type='Constant', + val=1, + layer=['_BatchNorm', 'GroupNorm']) + ] + block = self.arch_settings[depth][0] + if self.zero_init_residual: + if block is BasicBlock: + block_init_cfg = dict( + type='Constant', + val=0, + override=dict(name='norm2')) + elif block is Bottleneck: + block_init_cfg = dict( + type='Constant', + val=0, + override=dict(name='norm3')) + else: + raise TypeError('pretrained must be a str or None') + + self.depth = depth + if stem_channels is None: + stem_channels = base_channels + self.stem_channels = stem_channels + self.base_channels = base_channels + self.num_stages = num_stages + assert num_stages >= 1 and num_stages <= 4 + self.strides = strides + self.dilations = dilations + assert len(strides) == len(dilations) == num_stages + self.out_indices = out_indices + assert max(out_indices) < num_stages + self.style = style + self.deep_stem = deep_stem + self.avg_down = avg_down + self.frozen_stages = frozen_stages + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.with_cp = with_cp + self.norm_eval = norm_eval + self.dcn = dcn + self.stage_with_dcn = stage_with_dcn + if dcn is not None: + assert len(stage_with_dcn) == num_stages + self.plugins = plugins + self.block, stage_blocks = self.arch_settings[depth] + self.stage_blocks = stage_blocks[:num_stages] + self.inplanes = stem_channels + + self._make_stem_layer(in_channels, stem_channels) + + self.res_layers = [] + for i, num_blocks in enumerate(self.stage_blocks): + stride = strides[i] + dilation = dilations[i] + dcn = self.dcn if self.stage_with_dcn[i] else None + if plugins is not None: + stage_plugins = self.make_stage_plugins(plugins, i) + else: + stage_plugins = None + planes = base_channels * 2**i + res_layer = self.make_res_layer( + block=self.block, + inplanes=self.inplanes, + planes=planes, + num_blocks=num_blocks, + stride=stride, + dilation=dilation, + style=self.style, + avg_down=self.avg_down, + with_cp=with_cp, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + dcn=dcn, + plugins=stage_plugins, + init_cfg=block_init_cfg) + self.inplanes = planes * self.block.expansion + layer_name = f'layer{i + 1}' + self.add_module(layer_name, res_layer) + self.res_layers.append(layer_name) + + self._freeze_stages() + + self.feat_dim = self.block.expansion * base_channels * 2**( + len(self.stage_blocks) - 1) + + def make_stage_plugins(self, plugins, stage_idx): + """Make plugins for ResNet ``stage_idx`` th stage. + + Currently we support to insert ``context_block``, + ``empirical_attention_block``, ``nonlocal_block`` into the backbone + like ResNet/ResNeXt. They could be inserted after conv1/conv2/conv3 of + Bottleneck. + + An example of plugins format could be: + + Examples: + >>> plugins=[ + ... dict(cfg=dict(type='xxx', arg1='xxx'), + ... stages=(False, True, True, True), + ... position='after_conv2'), + ... dict(cfg=dict(type='yyy'), + ... stages=(True, True, True, True), + ... position='after_conv3'), + ... dict(cfg=dict(type='zzz', postfix='1'), + ... stages=(True, True, True, True), + ... position='after_conv3'), + ... dict(cfg=dict(type='zzz', postfix='2'), + ... stages=(True, True, True, True), + ... position='after_conv3') + ... ] + >>> self = ResNet(depth=18) + >>> stage_plugins = self.make_stage_plugins(plugins, 0) + >>> assert len(stage_plugins) == 3 + + Suppose ``stage_idx=0``, the structure of blocks in the stage would be: + + .. code-block:: none + + conv1-> conv2->conv3->yyy->zzz1->zzz2 + + Suppose 'stage_idx=1', the structure of blocks in the stage would be: + + .. code-block:: none + + conv1-> conv2->xxx->conv3->yyy->zzz1->zzz2 + + If stages is missing, the plugin would be applied to all stages. + + Args: + plugins (list[dict]): List of plugins cfg to build. The postfix is + required if multiple same type plugins are inserted. + stage_idx (int): Index of stage to build + + Returns: + list[dict]: Plugins for current stage + """ + stage_plugins = [] + for plugin in plugins: + plugin = plugin.copy() + stages = plugin.pop('stages', None) + assert stages is None or len(stages) == self.num_stages + # whether to insert plugin into current stage + if stages is None or stages[stage_idx]: + stage_plugins.append(plugin) + + return stage_plugins + + def make_res_layer(self, **kwargs): + """Pack all blocks in a stage into a ``ResLayer``.""" + return ResLayer(**kwargs) + + @property + def norm1(self): + """nn.Module: the normalization layer named "norm1" """ + return getattr(self, self.norm1_name) + + def _make_stem_layer(self, in_channels, stem_channels): + if self.deep_stem: + self.stem = nn.Sequential( + build_conv_layer( + self.conv_cfg, + in_channels, + stem_channels // 2, + kernel_size=3, + stride=2, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, stem_channels // 2)[1], + nn.ReLU(inplace=True), + build_conv_layer( + self.conv_cfg, + stem_channels // 2, + stem_channels // 2, + kernel_size=3, + stride=1, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, stem_channels // 2)[1], + nn.ReLU(inplace=True), + build_conv_layer( + self.conv_cfg, + stem_channels // 2, + stem_channels, + kernel_size=3, + stride=1, + padding=1, + bias=False), + build_norm_layer(self.norm_cfg, stem_channels)[1], + nn.ReLU(inplace=True)) + else: + self.conv1 = build_conv_layer( + self.conv_cfg, + in_channels, + stem_channels, + kernel_size=7, + stride=2, + padding=3, + bias=False) + self.norm1_name, norm1 = build_norm_layer( + self.norm_cfg, stem_channels, postfix=1) + self.add_module(self.norm1_name, norm1) + self.relu = nn.ReLU(inplace=True) + self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) + + def _freeze_stages(self): + if self.frozen_stages >= 0: + if self.deep_stem: + self.stem.eval() + for param in self.stem.parameters(): + param.requires_grad = False + else: + self.norm1.eval() + for m in [self.conv1, self.norm1]: + for param in m.parameters(): + param.requires_grad = False + + for i in range(1, self.frozen_stages + 1): + m = getattr(self, f'layer{i}') + m.eval() + for param in m.parameters(): + param.requires_grad = False + + def forward(self, x): + """Forward function.""" + if self.deep_stem: + x = self.stem(x) + else: + x = self.conv1(x) + x = self.norm1(x) + x = self.relu(x) + x = self.maxpool(x) + outs = [] + for i, layer_name in enumerate(self.res_layers): + res_layer = getattr(self, layer_name) + x = res_layer(x) + if i in self.out_indices: + outs.append(x) + return tuple(outs) + + def train(self, mode=True): + """Convert the model into training mode while keep normalization layer + freezed.""" + super(ResNet, self).train(mode) + self._freeze_stages() + if mode and self.norm_eval: + for m in self.modules(): + # trick: eval have effect on BatchNorm only + if isinstance(m, _BatchNorm): + m.eval() + + +@BACKBONES.register_module() +class ResNetV1d(ResNet): + r"""ResNetV1d variant described in `Bag of Tricks + `_. + + Compared with default ResNet(ResNetV1b), ResNetV1d replaces the 7x7 conv in + the input stem with three 3x3 convs. And in the downsampling block, a 2x2 + avg_pool with stride 2 is added before conv, whose stride is changed to 1. + """ + + def __init__(self, **kwargs): + super(ResNetV1d, self).__init__( + deep_stem=True, avg_down=True, **kwargs) diff --git a/mmdet/models/backbones/resnext.py b/mmdet/models/backbones/resnext.py new file mode 100644 index 0000000..8675d7c --- /dev/null +++ b/mmdet/models/backbones/resnext.py @@ -0,0 +1,154 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math + +from mmcv.cnn import build_conv_layer, build_norm_layer + +from ..builder import BACKBONES +from ..utils import ResLayer +from .resnet import Bottleneck as _Bottleneck +from .resnet import ResNet + + +class Bottleneck(_Bottleneck): + expansion = 4 + + def __init__(self, + inplanes, + planes, + groups=1, + base_width=4, + base_channels=64, + **kwargs): + """Bottleneck block for ResNeXt. + + If style is "pytorch", the stride-two layer is the 3x3 conv layer, if + it is "caffe", the stride-two layer is the first 1x1 conv layer. + """ + super(Bottleneck, self).__init__(inplanes, planes, **kwargs) + + if groups == 1: + width = self.planes + else: + width = math.floor(self.planes * + (base_width / base_channels)) * groups + + self.norm1_name, norm1 = build_norm_layer( + self.norm_cfg, width, postfix=1) + self.norm2_name, norm2 = build_norm_layer( + self.norm_cfg, width, postfix=2) + self.norm3_name, norm3 = build_norm_layer( + self.norm_cfg, self.planes * self.expansion, postfix=3) + + self.conv1 = build_conv_layer( + self.conv_cfg, + self.inplanes, + width, + kernel_size=1, + stride=self.conv1_stride, + bias=False) + self.add_module(self.norm1_name, norm1) + fallback_on_stride = False + self.with_modulated_dcn = False + if self.with_dcn: + fallback_on_stride = self.dcn.pop('fallback_on_stride', False) + if not self.with_dcn or fallback_on_stride: + self.conv2 = build_conv_layer( + self.conv_cfg, + width, + width, + kernel_size=3, + stride=self.conv2_stride, + padding=self.dilation, + dilation=self.dilation, + groups=groups, + bias=False) + else: + assert self.conv_cfg is None, 'conv_cfg must be None for DCN' + self.conv2 = build_conv_layer( + self.dcn, + width, + width, + kernel_size=3, + stride=self.conv2_stride, + padding=self.dilation, + dilation=self.dilation, + groups=groups, + bias=False) + + self.add_module(self.norm2_name, norm2) + self.conv3 = build_conv_layer( + self.conv_cfg, + width, + self.planes * self.expansion, + kernel_size=1, + bias=False) + self.add_module(self.norm3_name, norm3) + + if self.with_plugins: + self._del_block_plugins(self.after_conv1_plugin_names + + self.after_conv2_plugin_names + + self.after_conv3_plugin_names) + self.after_conv1_plugin_names = self.make_block_plugins( + width, self.after_conv1_plugins) + self.after_conv2_plugin_names = self.make_block_plugins( + width, self.after_conv2_plugins) + self.after_conv3_plugin_names = self.make_block_plugins( + self.planes * self.expansion, self.after_conv3_plugins) + + def _del_block_plugins(self, plugin_names): + """delete plugins for block if exist. + + Args: + plugin_names (list[str]): List of plugins name to delete. + """ + assert isinstance(plugin_names, list) + for plugin_name in plugin_names: + del self._modules[plugin_name] + + +@BACKBONES.register_module() +class ResNeXt(ResNet): + """ResNeXt backbone. + + Args: + depth (int): Depth of resnet, from {18, 34, 50, 101, 152}. + in_channels (int): Number of input image channels. Default: 3. + num_stages (int): Resnet stages. Default: 4. + groups (int): Group of resnext. + base_width (int): Base width of resnext. + strides (Sequence[int]): Strides of the first block of each stage. + dilations (Sequence[int]): Dilation of each stage. + out_indices (Sequence[int]): Output from which stages. + style (str): `pytorch` or `caffe`. If set to "pytorch", the stride-two + layer is the 3x3 conv layer, otherwise the stride-two layer is + the first 1x1 conv layer. + frozen_stages (int): Stages to be frozen (all param fixed). -1 means + not freezing any parameters. + norm_cfg (dict): dictionary to construct and config norm layer. + norm_eval (bool): Whether to set norm layers to eval mode, namely, + freeze running stats (mean and var). Note: Effect on Batch Norm + and its variants only. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. + zero_init_residual (bool): whether to use zero init for last norm layer + in resblocks to let them behave as identity. + """ + + arch_settings = { + 50: (Bottleneck, (3, 4, 6, 3)), + 101: (Bottleneck, (3, 4, 23, 3)), + 152: (Bottleneck, (3, 8, 36, 3)) + } + + def __init__(self, groups=1, base_width=4, **kwargs): + self.groups = groups + self.base_width = base_width + super(ResNeXt, self).__init__(**kwargs) + + def make_res_layer(self, **kwargs): + """Pack all blocks in a stage into a ``ResLayer``""" + return ResLayer( + groups=self.groups, + base_width=self.base_width, + base_channels=self.base_channels, + **kwargs) diff --git a/mmdet/models/backbones/ssd_vgg.py b/mmdet/models/backbones/ssd_vgg.py new file mode 100644 index 0000000..c15aeac --- /dev/null +++ b/mmdet/models/backbones/ssd_vgg.py @@ -0,0 +1,128 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch.nn as nn +from mmcv.cnn import VGG +from mmcv.runner import BaseModule + +from ..builder import BACKBONES +from ..necks import ssd_neck + + +@BACKBONES.register_module() +class SSDVGG(VGG, BaseModule): + """VGG Backbone network for single-shot-detection. + + Args: + depth (int): Depth of vgg, from {11, 13, 16, 19}. + with_last_pool (bool): Whether to add a pooling layer at the last + of the model + ceil_mode (bool): When True, will use `ceil` instead of `floor` + to compute the output shape. + out_indices (Sequence[int]): Output from which stages. + out_feature_indices (Sequence[int]): Output from which feature map. + pretrained (str, optional): model pretrained path. Default: None + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + input_size (int, optional): Deprecated argumment. + Width and height of input, from {300, 512}. + l2_norm_scale (float, optional) : Deprecated argumment. + L2 normalization layer init scale. + + Example: + >>> self = SSDVGG(input_size=300, depth=11) + >>> self.eval() + >>> inputs = torch.rand(1, 3, 300, 300) + >>> level_outputs = self.forward(inputs) + >>> for level_out in level_outputs: + ... print(tuple(level_out.shape)) + (1, 1024, 19, 19) + (1, 512, 10, 10) + (1, 256, 5, 5) + (1, 256, 3, 3) + (1, 256, 1, 1) + """ + extra_setting = { + 300: (256, 'S', 512, 128, 'S', 256, 128, 256, 128, 256), + 512: (256, 'S', 512, 128, 'S', 256, 128, 'S', 256, 128, 'S', 256, 128), + } + + def __init__(self, + depth, + with_last_pool=False, + ceil_mode=True, + out_indices=(3, 4), + out_feature_indices=(22, 34), + pretrained=None, + init_cfg=None, + input_size=None, + l2_norm_scale=None): + # TODO: in_channels for mmcv.VGG + super(SSDVGG, self).__init__( + depth, + with_last_pool=with_last_pool, + ceil_mode=ceil_mode, + out_indices=out_indices) + + self.features.add_module( + str(len(self.features)), + nn.MaxPool2d(kernel_size=3, stride=1, padding=1)) + self.features.add_module( + str(len(self.features)), + nn.Conv2d(512, 1024, kernel_size=3, padding=6, dilation=6)) + self.features.add_module( + str(len(self.features)), nn.ReLU(inplace=True)) + self.features.add_module( + str(len(self.features)), nn.Conv2d(1024, 1024, kernel_size=1)) + self.features.add_module( + str(len(self.features)), nn.ReLU(inplace=True)) + self.out_feature_indices = out_feature_indices + + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be specified at the same time' + + if init_cfg is not None: + self.init_cfg = init_cfg + elif isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is deprecated, ' + 'please use "init_cfg" instead') + self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is None: + self.init_cfg = [ + dict(type='Kaiming', layer='Conv2d'), + dict(type='Constant', val=1, layer='BatchNorm2d'), + dict(type='Normal', std=0.01, layer='Linear'), + ] + else: + raise TypeError('pretrained must be a str or None') + + if input_size is not None: + warnings.warn('DeprecationWarning: input_size is deprecated') + if l2_norm_scale is not None: + warnings.warn('DeprecationWarning: l2_norm_scale in VGG is ' + 'deprecated, it has been moved to SSDNeck.') + + def init_weights(self, pretrained=None): + super(VGG, self).init_weights() + + def forward(self, x): + """Forward function.""" + outs = [] + for i, layer in enumerate(self.features): + x = layer(x) + if i in self.out_feature_indices: + outs.append(x) + + if len(outs) == 1: + return outs[0] + else: + return tuple(outs) + + +class L2Norm(ssd_neck.L2Norm): + + def __init__(self, **kwargs): + super(L2Norm, self).__init__(**kwargs) + warnings.warn('DeprecationWarning: L2Norm in ssd_vgg.py ' + 'is deprecated, please use L2Norm in ' + 'mmdet/models/necks/ssd_neck.py instead') diff --git a/mmdet/models/backbones/swin.py b/mmdet/models/backbones/swin.py new file mode 100644 index 0000000..b8eccfc --- /dev/null +++ b/mmdet/models/backbones/swin.py @@ -0,0 +1,772 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings +from collections import OrderedDict +from copy import deepcopy + +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.utils.checkpoint as cp +from mmcv.cnn import build_norm_layer, constant_init, trunc_normal_init +from mmcv.cnn.bricks.transformer import FFN, build_dropout +from mmcv.cnn.utils.weight_init import trunc_normal_ +from mmcv.runner import BaseModule, ModuleList, _load_checkpoint +from mmcv.utils import to_2tuple + +from ...utils import get_root_logger +from ..builder import BACKBONES +from ..utils.ckpt_convert import swin_converter +from ..utils.transformer import PatchEmbed, PatchMerging + + +class WindowMSA(BaseModule): + """Window based multi-head self-attention (W-MSA) module with relative + position bias. + + Args: + embed_dims (int): Number of input channels. + num_heads (int): Number of attention heads. + window_size (tuple[int]): The height and width of the window. + qkv_bias (bool, optional): If True, add a learnable bias to q, k, v. + Default: True. + qk_scale (float | None, optional): Override default qk scale of + head_dim ** -0.5 if set. Default: None. + attn_drop_rate (float, optional): Dropout ratio of attention weight. + Default: 0.0 + proj_drop_rate (float, optional): Dropout ratio of output. Default: 0. + init_cfg (dict | None, optional): The Config for initialization. + Default: None. + """ + + def __init__(self, + embed_dims, + num_heads, + window_size, + qkv_bias=True, + qk_scale=None, + attn_drop_rate=0., + proj_drop_rate=0., + init_cfg=None): + + super().__init__() + self.embed_dims = embed_dims + self.window_size = window_size # Wh, Ww + self.num_heads = num_heads + head_embed_dims = embed_dims // num_heads + self.scale = qk_scale or head_embed_dims**-0.5 + self.init_cfg = init_cfg + + # define a parameter table of relative position bias + self.relative_position_bias_table = nn.Parameter( + torch.zeros((2 * window_size[0] - 1) * (2 * window_size[1] - 1), + num_heads)) # 2*Wh-1 * 2*Ww-1, nH + + # About 2x faster than original impl + Wh, Ww = self.window_size + rel_index_coords = self.double_step_seq(2 * Ww - 1, Wh, 1, Ww) + rel_position_index = rel_index_coords + rel_index_coords.T + rel_position_index = rel_position_index.flip(1).contiguous() + self.register_buffer('relative_position_index', rel_position_index) + + self.qkv = nn.Linear(embed_dims, embed_dims * 3, bias=qkv_bias) + self.attn_drop = nn.Dropout(attn_drop_rate) + self.proj = nn.Linear(embed_dims, embed_dims) + self.proj_drop = nn.Dropout(proj_drop_rate) + + self.softmax = nn.Softmax(dim=-1) + + def init_weights(self): + trunc_normal_(self.relative_position_bias_table, std=0.02) + + def forward(self, x, mask=None): + """ + Args: + + x (tensor): input features with shape of (num_windows*B, N, C) + mask (tensor | None, Optional): mask with shape of (num_windows, + Wh*Ww, Wh*Ww), value should be between (-inf, 0]. + """ + B, N, C = x.shape + qkv = self.qkv(x).reshape(B, N, 3, self.num_heads, + C // self.num_heads).permute(2, 0, 3, 1, 4) + # make torchscript happy (cannot use tensor as tuple) + q, k, v = qkv[0], qkv[1], qkv[2] + + q = q * self.scale + attn = (q @ k.transpose(-2, -1)) + + relative_position_bias = self.relative_position_bias_table[ + self.relative_position_index.view(-1)].view( + self.window_size[0] * self.window_size[1], + self.window_size[0] * self.window_size[1], + -1) # Wh*Ww,Wh*Ww,nH + relative_position_bias = relative_position_bias.permute( + 2, 0, 1).contiguous() # nH, Wh*Ww, Wh*Ww + attn = attn + relative_position_bias.unsqueeze(0) + + if mask is not None: + nW = mask.shape[0] + attn = attn.view(B // nW, nW, self.num_heads, N, + N) + mask.unsqueeze(1).unsqueeze(0) + attn = attn.view(-1, self.num_heads, N, N) + attn = self.softmax(attn) + + attn = self.attn_drop(attn) + + x = (attn @ v).transpose(1, 2).reshape(B, N, C) + x = self.proj(x) + x = self.proj_drop(x) + return x + + @staticmethod + def double_step_seq(step1, len1, step2, len2): + seq1 = torch.arange(0, step1 * len1, step1) + seq2 = torch.arange(0, step2 * len2, step2) + return (seq1[:, None] + seq2[None, :]).reshape(1, -1) + + +class ShiftWindowMSA(BaseModule): + """Shifted Window Multihead Self-Attention Module. + + Args: + embed_dims (int): Number of input channels. + num_heads (int): Number of attention heads. + window_size (int): The height and width of the window. + shift_size (int, optional): The shift step of each window towards + right-bottom. If zero, act as regular window-msa. Defaults to 0. + qkv_bias (bool, optional): If True, add a learnable bias to q, k, v. + Default: True + qk_scale (float | None, optional): Override default qk scale of + head_dim ** -0.5 if set. Defaults: None. + attn_drop_rate (float, optional): Dropout ratio of attention weight. + Defaults: 0. + proj_drop_rate (float, optional): Dropout ratio of output. + Defaults: 0. + dropout_layer (dict, optional): The dropout_layer used before output. + Defaults: dict(type='DropPath', drop_prob=0.). + init_cfg (dict, optional): The extra config for initialization. + Default: None. + """ + + def __init__(self, + embed_dims, + num_heads, + window_size, + shift_size=0, + qkv_bias=True, + qk_scale=None, + attn_drop_rate=0, + proj_drop_rate=0, + dropout_layer=dict(type='DropPath', drop_prob=0.), + init_cfg=None): + super().__init__(init_cfg) + + self.window_size = window_size + self.shift_size = shift_size + assert 0 <= self.shift_size < self.window_size + + self.w_msa = WindowMSA( + embed_dims=embed_dims, + num_heads=num_heads, + window_size=to_2tuple(window_size), + qkv_bias=qkv_bias, + qk_scale=qk_scale, + attn_drop_rate=attn_drop_rate, + proj_drop_rate=proj_drop_rate, + init_cfg=None) + + self.drop = build_dropout(dropout_layer) + + def forward(self, query, hw_shape): + B, L, C = query.shape + H, W = hw_shape + assert L == H * W, 'input feature has wrong size' + query = query.view(B, H, W, C) + + # pad feature maps to multiples of window size + pad_r = (self.window_size - W % self.window_size) % self.window_size + pad_b = (self.window_size - H % self.window_size) % self.window_size + query = F.pad(query, (0, 0, 0, pad_r, 0, pad_b)) + H_pad, W_pad = query.shape[1], query.shape[2] + + # cyclic shift + if self.shift_size > 0: + shifted_query = torch.roll( + query, + shifts=(-self.shift_size, -self.shift_size), + dims=(1, 2)) + + # calculate attention mask for SW-MSA + img_mask = torch.zeros((1, H_pad, W_pad, 1), device=query.device) + h_slices = (slice(0, -self.window_size), + slice(-self.window_size, + -self.shift_size), slice(-self.shift_size, None)) + w_slices = (slice(0, -self.window_size), + slice(-self.window_size, + -self.shift_size), slice(-self.shift_size, None)) + cnt = 0 + for h in h_slices: + for w in w_slices: + img_mask[:, h, w, :] = cnt + cnt += 1 + + # nW, window_size, window_size, 1 + mask_windows = self.window_partition(img_mask) + mask_windows = mask_windows.view( + -1, self.window_size * self.window_size) + attn_mask = mask_windows.unsqueeze(1) - mask_windows.unsqueeze(2) + attn_mask = attn_mask.masked_fill(attn_mask != 0, + float(-100.0)).masked_fill( + attn_mask == 0, float(0.0)) + else: + shifted_query = query + attn_mask = None + + # nW*B, window_size, window_size, C + query_windows = self.window_partition(shifted_query) + # nW*B, window_size*window_size, C + query_windows = query_windows.view(-1, self.window_size**2, C) + + # W-MSA/SW-MSA (nW*B, window_size*window_size, C) + attn_windows = self.w_msa(query_windows, mask=attn_mask) + + # merge windows + attn_windows = attn_windows.view(-1, self.window_size, + self.window_size, C) + + # B H' W' C + shifted_x = self.window_reverse(attn_windows, H_pad, W_pad) + # reverse cyclic shift + if self.shift_size > 0: + x = torch.roll( + shifted_x, + shifts=(self.shift_size, self.shift_size), + dims=(1, 2)) + else: + x = shifted_x + + if pad_r > 0 or pad_b: + x = x[:, :H, :W, :].contiguous() + + x = x.view(B, H * W, C) + + x = self.drop(x) + return x + + def window_reverse(self, windows, H, W): + """ + Args: + windows: (num_windows*B, window_size, window_size, C) + H (int): Height of image + W (int): Width of image + Returns: + x: (B, H, W, C) + """ + window_size = self.window_size + B = int(windows.shape[0] / (H * W / window_size / window_size)) + x = windows.view(B, H // window_size, W // window_size, window_size, + window_size, -1) + x = x.permute(0, 1, 3, 2, 4, 5).contiguous().view(B, H, W, -1) + return x + + def window_partition(self, x): + """ + Args: + x: (B, H, W, C) + Returns: + windows: (num_windows*B, window_size, window_size, C) + """ + B, H, W, C = x.shape + window_size = self.window_size + x = x.view(B, H // window_size, window_size, W // window_size, + window_size, C) + windows = x.permute(0, 1, 3, 2, 4, 5).contiguous() + windows = windows.view(-1, window_size, window_size, C) + return windows + + +class SwinBlock(BaseModule): + """" + Args: + embed_dims (int): The feature dimension. + num_heads (int): Parallel attention heads. + feedforward_channels (int): The hidden dimension for FFNs. + window_size (int, optional): The local window scale. Default: 7. + shift (bool, optional): whether to shift window or not. Default False. + qkv_bias (bool, optional): enable bias for qkv if True. Default: True. + qk_scale (float | None, optional): Override default qk scale of + head_dim ** -0.5 if set. Default: None. + drop_rate (float, optional): Dropout rate. Default: 0. + attn_drop_rate (float, optional): Attention dropout rate. Default: 0. + drop_path_rate (float, optional): Stochastic depth rate. Default: 0. + act_cfg (dict, optional): The config dict of activation function. + Default: dict(type='GELU'). + norm_cfg (dict, optional): The config dict of normalization. + Default: dict(type='LN'). + with_cp (bool, optional): Use checkpoint or not. Using checkpoint + will save some memory while slowing down the training speed. + Default: False. + init_cfg (dict | list | None, optional): The init config. + Default: None. + """ + + def __init__(self, + embed_dims, + num_heads, + feedforward_channels, + window_size=7, + shift=False, + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0., + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='LN'), + with_cp=False, + init_cfg=None): + + super(SwinBlock, self).__init__() + + self.init_cfg = init_cfg + self.with_cp = with_cp + + self.norm1 = build_norm_layer(norm_cfg, embed_dims)[1] + self.attn = ShiftWindowMSA( + embed_dims=embed_dims, + num_heads=num_heads, + window_size=window_size, + shift_size=window_size // 2 if shift else 0, + qkv_bias=qkv_bias, + qk_scale=qk_scale, + attn_drop_rate=attn_drop_rate, + proj_drop_rate=drop_rate, + dropout_layer=dict(type='DropPath', drop_prob=drop_path_rate), + init_cfg=None) + + self.norm2 = build_norm_layer(norm_cfg, embed_dims)[1] + self.ffn = FFN( + embed_dims=embed_dims, + feedforward_channels=feedforward_channels, + num_fcs=2, + ffn_drop=drop_rate, + dropout_layer=dict(type='DropPath', drop_prob=drop_path_rate), + act_cfg=act_cfg, + add_identity=True, + init_cfg=None) + + def forward(self, x, hw_shape): + + def _inner_forward(x): + identity = x + x = self.norm1(x) + x = self.attn(x, hw_shape) + + x = x + identity + + identity = x + x = self.norm2(x) + x = self.ffn(x, identity=identity) + + return x + + if self.with_cp and x.requires_grad: + x = cp.checkpoint(_inner_forward, x) + else: + x = _inner_forward(x) + + return x + + +class SwinBlockSequence(BaseModule): + """Implements one stage in Swin Transformer. + + Args: + embed_dims (int): The feature dimension. + num_heads (int): Parallel attention heads. + feedforward_channels (int): The hidden dimension for FFNs. + depth (int): The number of blocks in this stage. + window_size (int, optional): The local window scale. Default: 7. + qkv_bias (bool, optional): enable bias for qkv if True. Default: True. + qk_scale (float | None, optional): Override default qk scale of + head_dim ** -0.5 if set. Default: None. + drop_rate (float, optional): Dropout rate. Default: 0. + attn_drop_rate (float, optional): Attention dropout rate. Default: 0. + drop_path_rate (float | list[float], optional): Stochastic depth + rate. Default: 0. + downsample (BaseModule | None, optional): The downsample operation + module. Default: None. + act_cfg (dict, optional): The config dict of activation function. + Default: dict(type='GELU'). + norm_cfg (dict, optional): The config dict of normalization. + Default: dict(type='LN'). + with_cp (bool, optional): Use checkpoint or not. Using checkpoint + will save some memory while slowing down the training speed. + Default: False. + init_cfg (dict | list | None, optional): The init config. + Default: None. + """ + + def __init__(self, + embed_dims, + num_heads, + feedforward_channels, + depth, + window_size=7, + qkv_bias=True, + qk_scale=None, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0., + downsample=None, + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='LN'), + with_cp=False, + init_cfg=None): + super().__init__(init_cfg=init_cfg) + + if isinstance(drop_path_rate, list): + drop_path_rates = drop_path_rate + assert len(drop_path_rates) == depth + else: + drop_path_rates = [deepcopy(drop_path_rate) for _ in range(depth)] + + self.blocks = ModuleList() + for i in range(depth): + block = SwinBlock( + embed_dims=embed_dims, + num_heads=num_heads, + feedforward_channels=feedforward_channels, + window_size=window_size, + shift=False if i % 2 == 0 else True, + qkv_bias=qkv_bias, + qk_scale=qk_scale, + drop_rate=drop_rate, + attn_drop_rate=attn_drop_rate, + drop_path_rate=drop_path_rates[i], + act_cfg=act_cfg, + norm_cfg=norm_cfg, + with_cp=with_cp, + init_cfg=None) + self.blocks.append(block) + + self.downsample = downsample + + def forward(self, x, hw_shape): + for block in self.blocks: + x = block(x, hw_shape) + + if self.downsample: + x_down, down_hw_shape = self.downsample(x, hw_shape) + return x_down, down_hw_shape, x, hw_shape + else: + return x, hw_shape, x, hw_shape + + +@BACKBONES.register_module() +class SwinTransformer(BaseModule): + """ Swin Transformer + A PyTorch implement of : `Swin Transformer: + Hierarchical Vision Transformer using Shifted Windows` - + https://arxiv.org/abs/2103.14030 + + Inspiration from + https://github.com/microsoft/Swin-Transformer + + Args: + pretrain_img_size (int | tuple[int]): The size of input image when + pretrain. Defaults: 224. + in_channels (int): The num of input channels. + Defaults: 3. + embed_dims (int): The feature dimension. Default: 96. + patch_size (int | tuple[int]): Patch size. Default: 4. + window_size (int): Window size. Default: 7. + mlp_ratio (int | float): Ratio of mlp hidden dim to embedding dim. + Default: 4. + depths (tuple[int]): Depths of each Swin Transformer stage. + Default: (2, 2, 6, 2). + num_heads (tuple[int]): Parallel attention heads of each Swin + Transformer stage. Default: (3, 6, 12, 24). + strides (tuple[int]): The patch merging or patch embedding stride of + each Swin Transformer stage. (In swin, we set kernel size equal to + stride.) Default: (4, 2, 2, 2). + out_indices (tuple[int]): Output from which stages. + Default: (0, 1, 2, 3). + qkv_bias (bool, optional): If True, add a learnable bias to query, key, + value. Default: True + qk_scale (float | None, optional): Override default qk scale of + head_dim ** -0.5 if set. Default: None. + patch_norm (bool): If add a norm layer for patch embed and patch + merging. Default: True. + drop_rate (float): Dropout rate. Defaults: 0. + attn_drop_rate (float): Attention dropout rate. Default: 0. + drop_path_rate (float): Stochastic depth rate. Defaults: 0.1. + use_abs_pos_embed (bool): If True, add absolute position embedding to + the patch embedding. Defaults: False. + act_cfg (dict): Config dict for activation layer. + Default: dict(type='GELU'). + norm_cfg (dict): Config dict for normalization layer at + output of backone. Defaults: dict(type='LN'). + with_cp (bool, optional): Use checkpoint or not. Using checkpoint + will save some memory while slowing down the training speed. + Default: False. + pretrained (str, optional): model pretrained path. Default: None. + convert_weights (bool): The flag indicates whether the + pre-trained model is from the original repo. We may need + to convert some keys to make it compatible. + Default: False. + frozen_stages (int): Stages to be frozen (stop grad and set eval mode). + Default: -1 (-1 means not freezing any parameters). + init_cfg (dict, optional): The Config for initialization. + Defaults to None. + """ + + def __init__(self, + pretrain_img_size=224, + in_channels=3, + embed_dims=96, + patch_size=4, + window_size=7, + mlp_ratio=4, + depths=(2, 2, 6, 2), + num_heads=(3, 6, 12, 24), + strides=(4, 2, 2, 2), + out_indices=(0, 1, 2, 3), + qkv_bias=True, + qk_scale=None, + patch_norm=True, + drop_rate=0., + attn_drop_rate=0., + drop_path_rate=0.1, + use_abs_pos_embed=False, + act_cfg=dict(type='GELU'), + norm_cfg=dict(type='LN'), + with_cp=False, + pretrained=None, + convert_weights=False, + frozen_stages=-1, + init_cfg=None): + self.convert_weights = convert_weights + self.frozen_stages = frozen_stages + if isinstance(pretrain_img_size, int): + pretrain_img_size = to_2tuple(pretrain_img_size) + elif isinstance(pretrain_img_size, tuple): + if len(pretrain_img_size) == 1: + pretrain_img_size = to_2tuple(pretrain_img_size[0]) + assert len(pretrain_img_size) == 2, \ + f'The size of image should have length 1 or 2, ' \ + f'but got {len(pretrain_img_size)}' + + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be specified at the same time' + if isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is deprecated, ' + 'please use "init_cfg" instead') + self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is None: + self.init_cfg = init_cfg + else: + raise TypeError('pretrained must be a str or None') + + super(SwinTransformer, self).__init__(init_cfg=init_cfg) + + num_layers = len(depths) + self.out_indices = out_indices + self.use_abs_pos_embed = use_abs_pos_embed + + assert strides[0] == patch_size, 'Use non-overlapping patch embed.' + + self.patch_embed = PatchEmbed( + in_channels=in_channels, + embed_dims=embed_dims, + conv_type='Conv2d', + kernel_size=patch_size, + stride=strides[0], + norm_cfg=norm_cfg if patch_norm else None, + init_cfg=None) + + if self.use_abs_pos_embed: + patch_row = pretrain_img_size[0] // patch_size + patch_col = pretrain_img_size[1] // patch_size + self.absolute_pos_embed = nn.Parameter( + torch.zeros((1, embed_dims, patch_row, patch_col))) + + self.drop_after_pos = nn.Dropout(p=drop_rate) + + # set stochastic depth decay rule + total_depth = sum(depths) + dpr = [ + x.item() for x in torch.linspace(0, drop_path_rate, total_depth) + ] + + self.stages = ModuleList() + in_channels = embed_dims + for i in range(num_layers): + if i < num_layers - 1: + downsample = PatchMerging( + in_channels=in_channels, + out_channels=2 * in_channels, + stride=strides[i + 1], + norm_cfg=norm_cfg if patch_norm else None, + init_cfg=None) + else: + downsample = None + + stage = SwinBlockSequence( + embed_dims=in_channels, + num_heads=num_heads[i], + feedforward_channels=int(mlp_ratio * in_channels), + depth=depths[i], + window_size=window_size, + qkv_bias=qkv_bias, + qk_scale=qk_scale, + drop_rate=drop_rate, + attn_drop_rate=attn_drop_rate, + drop_path_rate=dpr[sum(depths[:i]):sum(depths[:i + 1])], + downsample=downsample, + act_cfg=act_cfg, + norm_cfg=norm_cfg, + with_cp=with_cp, + init_cfg=None) + self.stages.append(stage) + if downsample: + in_channels = downsample.out_channels + + self.num_features = [int(embed_dims * 2**i) for i in range(num_layers)] + # Add a norm layer for each output + for i in out_indices: + layer = build_norm_layer(norm_cfg, self.num_features[i])[1] + layer_name = f'norm{i}' + self.add_module(layer_name, layer) + + def train(self, mode=True): + """Convert the model into training mode while keep layers freezed.""" + super(SwinTransformer, self).train(mode) + self._freeze_stages() + + def _freeze_stages(self): + if self.frozen_stages >= 0: + self.patch_embed.eval() + for param in self.patch_embed.parameters(): + param.requires_grad = False + if self.use_abs_pos_embed: + self.absolute_pos_embed.requires_grad = False + self.drop_after_pos.eval() + + for i in range(1, self.frozen_stages + 1): + + if (i - 1) in self.out_indices: + norm_layer = getattr(self, f'norm{i-1}') + norm_layer.eval() + for param in norm_layer.parameters(): + param.requires_grad = False + + m = self.stages[i - 1] + m.eval() + for param in m.parameters(): + param.requires_grad = False + + def init_weights(self): + logger = get_root_logger() + if self.init_cfg is None: + logger.warn(f'No pre-trained weights for ' + f'{self.__class__.__name__}, ' + f'training start from scratch') + if self.use_abs_pos_embed: + trunc_normal_(self.absolute_pos_embed, std=0.02) + for m in self.modules(): + if isinstance(m, nn.Linear): + trunc_normal_init(m, std=.02, bias=0.) + elif isinstance(m, nn.LayerNorm): + constant_init(m, 1.0) + else: + assert 'checkpoint' in self.init_cfg, f'Only support ' \ + f'specify `Pretrained` in ' \ + f'`init_cfg` in ' \ + f'{self.__class__.__name__} ' + ckpt = _load_checkpoint( + self.init_cfg.checkpoint, logger=logger, map_location='cpu') + if 'state_dict' in ckpt: + _state_dict = ckpt['state_dict'] + elif 'model' in ckpt: + _state_dict = ckpt['model'] + else: + _state_dict = ckpt + if self.convert_weights: + # supported loading weight from original repo, + _state_dict = swin_converter(_state_dict) + + state_dict = OrderedDict() + for k, v in _state_dict.items(): + if k.startswith('backbone.'): + state_dict[k[9:]] = v + + # strip prefix of state_dict + if list(state_dict.keys())[0].startswith('module.'): + state_dict = {k[7:]: v for k, v in state_dict.items()} + + # reshape absolute position embedding + if state_dict.get('absolute_pos_embed') is not None: + absolute_pos_embed = state_dict['absolute_pos_embed'] + N1, L, C1 = absolute_pos_embed.size() + N2, C2, H, W = self.absolute_pos_embed.size() + if N1 != N2 or C1 != C2 or L != H * W: + logger.warning('Error in loading absolute_pos_embed, pass') + else: + state_dict['absolute_pos_embed'] = absolute_pos_embed.view( + N2, H, W, C2).permute(0, 3, 1, 2).contiguous() + + # interpolate position bias table if needed + relative_position_bias_table_keys = [ + k for k in state_dict.keys() + if 'relative_position_bias_table' in k + ] + for table_key in relative_position_bias_table_keys: + table_pretrained = state_dict[table_key] + table_current = self.state_dict()[table_key] + L1, nH1 = table_pretrained.size() + L2, nH2 = table_current.size() + if nH1 != nH2: + logger.warning(f'Error in loading {table_key}, pass') + elif L1 != L2: + S1 = int(L1**0.5) + S2 = int(L2**0.5) + table_pretrained_resized = F.interpolate( + table_pretrained.permute(1, 0).reshape(1, nH1, S1, S1), + size=(S2, S2), + mode='bicubic') + state_dict[table_key] = table_pretrained_resized.view( + nH2, L2).permute(1, 0).contiguous() + + # load state_dict + self.load_state_dict(state_dict, False) + + def forward(self, x): + x, hw_shape = self.patch_embed(x) + + if self.use_abs_pos_embed: + h, w = self.absolute_pos_embed.shape[1:3] + if hw_shape[0] != h or hw_shape[1] != w: + absolute_pos_embed = F.interpolate( + self.absolute_pos_embed, + size=hw_shape, + mode='bicubic', + align_corners=False).flatten(2).transpose(1, 2) + else: + absolute_pos_embed = self.absolute_pos_embed.flatten( + 2).transpose(1, 2) + x = x + absolute_pos_embed + x = self.drop_after_pos(x) + + outs = [] + for i, stage in enumerate(self.stages): + x, hw_shape, out, out_hw_shape = stage(x, hw_shape) + if i in self.out_indices: + norm_layer = getattr(self, f'norm{i}') + out = norm_layer(out) + out = out.view(-1, *out_hw_shape, + self.num_features[i]).permute(0, 3, 1, + 2).contiguous() + outs.append(out) + + return outs diff --git a/mmdet/models/backbones/trident_resnet.py b/mmdet/models/backbones/trident_resnet.py new file mode 100644 index 0000000..013ba64 --- /dev/null +++ b/mmdet/models/backbones/trident_resnet.py @@ -0,0 +1,298 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.utils.checkpoint as cp +from mmcv.cnn import build_conv_layer, build_norm_layer +from mmcv.runner import BaseModule +from torch.nn.modules.utils import _pair + +from mmdet.models.backbones.resnet import Bottleneck, ResNet +from mmdet.models.builder import BACKBONES + + +class TridentConv(BaseModule): + """Trident Convolution Module. + + Args: + in_channels (int): Number of channels in input. + out_channels (int): Number of channels in output. + kernel_size (int): Size of convolution kernel. + stride (int, optional): Convolution stride. Default: 1. + trident_dilations (tuple[int, int, int], optional): Dilations of + different trident branch. Default: (1, 2, 3). + test_branch_idx (int, optional): In inference, all 3 branches will + be used if `test_branch_idx==-1`, otherwise only branch with + index `test_branch_idx` will be used. Default: 1. + bias (bool, optional): Whether to use bias in convolution or not. + Default: False. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + in_channels, + out_channels, + kernel_size, + stride=1, + trident_dilations=(1, 2, 3), + test_branch_idx=1, + bias=False, + init_cfg=None): + super(TridentConv, self).__init__(init_cfg) + self.num_branch = len(trident_dilations) + self.with_bias = bias + self.test_branch_idx = test_branch_idx + self.stride = _pair(stride) + self.kernel_size = _pair(kernel_size) + self.paddings = _pair(trident_dilations) + self.dilations = trident_dilations + self.in_channels = in_channels + self.out_channels = out_channels + self.bias = bias + + self.weight = nn.Parameter( + torch.Tensor(out_channels, in_channels, *self.kernel_size)) + if bias: + self.bias = nn.Parameter(torch.Tensor(out_channels)) + else: + self.bias = None + + def extra_repr(self): + tmpstr = f'in_channels={self.in_channels}' + tmpstr += f', out_channels={self.out_channels}' + tmpstr += f', kernel_size={self.kernel_size}' + tmpstr += f', num_branch={self.num_branch}' + tmpstr += f', test_branch_idx={self.test_branch_idx}' + tmpstr += f', stride={self.stride}' + tmpstr += f', paddings={self.paddings}' + tmpstr += f', dilations={self.dilations}' + tmpstr += f', bias={self.bias}' + return tmpstr + + def forward(self, inputs): + if self.training or self.test_branch_idx == -1: + outputs = [ + F.conv2d(input, self.weight, self.bias, self.stride, padding, + dilation) for input, dilation, padding in zip( + inputs, self.dilations, self.paddings) + ] + else: + assert len(inputs) == 1 + outputs = [ + F.conv2d(inputs[0], self.weight, self.bias, self.stride, + self.paddings[self.test_branch_idx], + self.dilations[self.test_branch_idx]) + ] + + return outputs + + +# Since TridentNet is defined over ResNet50 and ResNet101, here we +# only support TridentBottleneckBlock. +class TridentBottleneck(Bottleneck): + """BottleBlock for TridentResNet. + + Args: + trident_dilations (tuple[int, int, int]): Dilations of different + trident branch. + test_branch_idx (int): In inference, all 3 branches will be used + if `test_branch_idx==-1`, otherwise only branch with index + `test_branch_idx` will be used. + concat_output (bool): Whether to concat the output list to a Tensor. + `True` only in the last Block. + """ + + def __init__(self, trident_dilations, test_branch_idx, concat_output, + **kwargs): + + super(TridentBottleneck, self).__init__(**kwargs) + self.trident_dilations = trident_dilations + self.num_branch = len(trident_dilations) + self.concat_output = concat_output + self.test_branch_idx = test_branch_idx + self.conv2 = TridentConv( + self.planes, + self.planes, + kernel_size=3, + stride=self.conv2_stride, + bias=False, + trident_dilations=self.trident_dilations, + test_branch_idx=test_branch_idx, + init_cfg=dict( + type='Kaiming', + distribution='uniform', + mode='fan_in', + override=dict(name='conv2'))) + + def forward(self, x): + + def _inner_forward(x): + num_branch = ( + self.num_branch + if self.training or self.test_branch_idx == -1 else 1) + identity = x + if not isinstance(x, list): + x = (x, ) * num_branch + identity = x + if self.downsample is not None: + identity = [self.downsample(b) for b in x] + + out = [self.conv1(b) for b in x] + out = [self.norm1(b) for b in out] + out = [self.relu(b) for b in out] + + if self.with_plugins: + for k in range(len(out)): + out[k] = self.forward_plugin(out[k], + self.after_conv1_plugin_names) + + out = self.conv2(out) + out = [self.norm2(b) for b in out] + out = [self.relu(b) for b in out] + if self.with_plugins: + for k in range(len(out)): + out[k] = self.forward_plugin(out[k], + self.after_conv2_plugin_names) + + out = [self.conv3(b) for b in out] + out = [self.norm3(b) for b in out] + + if self.with_plugins: + for k in range(len(out)): + out[k] = self.forward_plugin(out[k], + self.after_conv3_plugin_names) + + out = [ + out_b + identity_b for out_b, identity_b in zip(out, identity) + ] + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + out = [self.relu(b) for b in out] + if self.concat_output: + out = torch.cat(out, dim=0) + return out + + +def make_trident_res_layer(block, + inplanes, + planes, + num_blocks, + stride=1, + trident_dilations=(1, 2, 3), + style='pytorch', + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + dcn=None, + plugins=None, + test_branch_idx=-1): + """Build Trident Res Layers.""" + + downsample = None + if stride != 1 or inplanes != planes * block.expansion: + downsample = [] + conv_stride = stride + downsample.extend([ + build_conv_layer( + conv_cfg, + inplanes, + planes * block.expansion, + kernel_size=1, + stride=conv_stride, + bias=False), + build_norm_layer(norm_cfg, planes * block.expansion)[1] + ]) + downsample = nn.Sequential(*downsample) + + layers = [] + for i in range(num_blocks): + layers.append( + block( + inplanes=inplanes, + planes=planes, + stride=stride if i == 0 else 1, + trident_dilations=trident_dilations, + downsample=downsample if i == 0 else None, + style=style, + with_cp=with_cp, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + dcn=dcn, + plugins=plugins, + test_branch_idx=test_branch_idx, + concat_output=True if i == num_blocks - 1 else False)) + inplanes = planes * block.expansion + return nn.Sequential(*layers) + + +@BACKBONES.register_module() +class TridentResNet(ResNet): + """The stem layer, stage 1 and stage 2 in Trident ResNet are identical to + ResNet, while in stage 3, Trident BottleBlock is utilized to replace the + normal BottleBlock to yield trident output. Different branch shares the + convolution weight but uses different dilations to achieve multi-scale + output. + + / stage3(b0) \ + x - stem - stage1 - stage2 - stage3(b1) - output + \ stage3(b2) / + + Args: + depth (int): Depth of resnet, from {50, 101, 152}. + num_branch (int): Number of branches in TridentNet. + test_branch_idx (int): In inference, all 3 branches will be used + if `test_branch_idx==-1`, otherwise only branch with index + `test_branch_idx` will be used. + trident_dilations (tuple[int]): Dilations of different trident branch. + len(trident_dilations) should be equal to num_branch. + """ # noqa + + def __init__(self, depth, num_branch, test_branch_idx, trident_dilations, + **kwargs): + + assert num_branch == len(trident_dilations) + assert depth in (50, 101, 152) + super(TridentResNet, self).__init__(depth, **kwargs) + assert self.num_stages == 3 + self.test_branch_idx = test_branch_idx + self.num_branch = num_branch + + last_stage_idx = self.num_stages - 1 + stride = self.strides[last_stage_idx] + dilation = trident_dilations + dcn = self.dcn if self.stage_with_dcn[last_stage_idx] else None + if self.plugins is not None: + stage_plugins = self.make_stage_plugins(self.plugins, + last_stage_idx) + else: + stage_plugins = None + planes = self.base_channels * 2**last_stage_idx + res_layer = make_trident_res_layer( + TridentBottleneck, + inplanes=(self.block.expansion * self.base_channels * + 2**(last_stage_idx - 1)), + planes=planes, + num_blocks=self.stage_blocks[last_stage_idx], + stride=stride, + trident_dilations=dilation, + style=self.style, + with_cp=self.with_cp, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + dcn=dcn, + plugins=stage_plugins, + test_branch_idx=self.test_branch_idx) + + layer_name = f'layer{last_stage_idx + 1}' + + self.__setattr__(layer_name, res_layer) + self.res_layers.pop(last_stage_idx) + self.res_layers.insert(last_stage_idx, layer_name) + + self._freeze_stages() diff --git a/mmdet/models/builder.py b/mmdet/models/builder.py new file mode 100644 index 0000000..ace6209 --- /dev/null +++ b/mmdet/models/builder.py @@ -0,0 +1,59 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +from mmcv.cnn import MODELS as MMCV_MODELS +from mmcv.utils import Registry + +MODELS = Registry('models', parent=MMCV_MODELS) + +BACKBONES = MODELS +NECKS = MODELS +ROI_EXTRACTORS = MODELS +SHARED_HEADS = MODELS +HEADS = MODELS +LOSSES = MODELS +DETECTORS = MODELS + + +def build_backbone(cfg): + """Build backbone.""" + return BACKBONES.build(cfg) + + +def build_neck(cfg): + """Build neck.""" + return NECKS.build(cfg) + + +def build_roi_extractor(cfg): + """Build roi extractor.""" + return ROI_EXTRACTORS.build(cfg) + + +def build_shared_head(cfg): + """Build shared head.""" + return SHARED_HEADS.build(cfg) + + +def build_head(cfg): + """Build head.""" + return HEADS.build(cfg) + + +def build_loss(cfg): + """Build loss.""" + return LOSSES.build(cfg) + + +def build_detector(cfg, train_cfg=None, test_cfg=None): + """Build detector.""" + if train_cfg is not None or test_cfg is not None: + warnings.warn( + 'train_cfg and test_cfg is deprecated, ' + 'please specify them in model', UserWarning) + assert cfg.get('train_cfg') is None or train_cfg is None, \ + 'train_cfg specified in both outer field and model field ' + assert cfg.get('test_cfg') is None or test_cfg is None, \ + 'test_cfg specified in both outer field and model field ' + return DETECTORS.build( + cfg, default_args=dict(train_cfg=train_cfg, test_cfg=test_cfg)) diff --git a/mmdet/models/dense_heads/__init__.py b/mmdet/models/dense_heads/__init__.py new file mode 100644 index 0000000..9c60ae1 --- /dev/null +++ b/mmdet/models/dense_heads/__init__.py @@ -0,0 +1,62 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .anchor_free_head import AnchorFreeHead +from .anchor_head import AnchorHead +from .ascend_anchor_head import AscendAnchorHead +from .ascend_retina_head import AscendRetinaHead +from .ascend_ssd_head import AscendSSDHead +from .atss_head import ATSSHead +from .autoassign_head import AutoAssignHead +from .cascade_rpn_head import CascadeRPNHead, StageCascadeRPNHead +from .centernet_head import CenterNetHead +from .centripetal_head import CentripetalHead +from .corner_head import CornerHead +from .ddod_head import DDODHead +from .deformable_detr_head import DeformableDETRHead +from .detr_head import DETRHead +from .embedding_rpn_head import EmbeddingRPNHead +from .fcos_head import FCOSHead +from .fovea_head import FoveaHead +from .free_anchor_retina_head import FreeAnchorRetinaHead +from .fsaf_head import FSAFHead +from .ga_retina_head import GARetinaHead +from .ga_rpn_head import GARPNHead +from .gfl_head import GFLHead +from .guided_anchor_head import FeatureAdaption, GuidedAnchorHead +from .lad_head import LADHead +from .ld_head import LDHead +from .mask2former_head import Mask2FormerHead +from .maskformer_head import MaskFormerHead +from .nasfcos_head import NASFCOSHead +from .paa_head import PAAHead +from .pisa_retinanet_head import PISARetinaHead +from .pisa_ssd_head import PISASSDHead +from .reppoints_head import RepPointsHead +from .retina_head import RetinaHead +from .retina_sepbn_head import RetinaSepBNHead +from .rpn_head import RPNHead +from .sabl_retina_head import SABLRetinaHead +from .solo_head import DecoupledSOLOHead, DecoupledSOLOLightHead, SOLOHead +from .solov2_head import SOLOV2Head +from .ssd_head import SSDHead +from .tood_head import TOODHead +from .vfnet_head import VFNetHead +from .yolact_head import YOLACTHead, YOLACTProtonet, YOLACTSegmHead +from .yolo_head import YOLOV3Head +from .yolof_head import YOLOFHead +from .yolox_head import YOLOXHead + +__all__ = [ + 'AnchorFreeHead', 'AnchorHead', 'GuidedAnchorHead', 'FeatureAdaption', + 'RPNHead', 'GARPNHead', 'RetinaHead', 'RetinaSepBNHead', 'GARetinaHead', + 'SSDHead', 'FCOSHead', 'RepPointsHead', 'FoveaHead', + 'FreeAnchorRetinaHead', 'ATSSHead', 'FSAFHead', 'NASFCOSHead', + 'PISARetinaHead', 'PISASSDHead', 'GFLHead', 'CornerHead', 'YOLACTHead', + 'YOLACTSegmHead', 'YOLACTProtonet', 'YOLOV3Head', 'PAAHead', + 'SABLRetinaHead', 'CentripetalHead', 'VFNetHead', 'StageCascadeRPNHead', + 'CascadeRPNHead', 'EmbeddingRPNHead', 'LDHead', 'AutoAssignHead', + 'DETRHead', 'YOLOFHead', 'DeformableDETRHead', 'SOLOHead', + 'DecoupledSOLOHead', 'CenterNetHead', 'YOLOXHead', + 'DecoupledSOLOLightHead', 'LADHead', 'TOODHead', 'MaskFormerHead', + 'Mask2FormerHead', 'SOLOV2Head', 'DDODHead', 'AscendAnchorHead', + 'AscendRetinaHead', 'AscendSSDHead' +] diff --git a/mmdet/models/dense_heads/anchor_free_head.py b/mmdet/models/dense_heads/anchor_free_head.py new file mode 100644 index 0000000..b0460b9 --- /dev/null +++ b/mmdet/models/dense_heads/anchor_free_head.py @@ -0,0 +1,350 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings +from abc import abstractmethod + +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule +from mmcv.runner import force_fp32 + +from mmdet.core import build_bbox_coder, multi_apply +from mmdet.core.anchor.point_generator import MlvlPointGenerator +from ..builder import HEADS, build_loss +from .base_dense_head import BaseDenseHead +from .dense_test_mixins import BBoxTestMixin + + +@HEADS.register_module() +class AnchorFreeHead(BaseDenseHead, BBoxTestMixin): + """Anchor-free head (FCOS, Fovea, RepPoints, etc.). + + Args: + num_classes (int): Number of categories excluding the background + category. + in_channels (int): Number of channels in the input feature map. + feat_channels (int): Number of hidden channels. Used in child classes. + stacked_convs (int): Number of stacking convs of the head. + strides (tuple): Downsample factor of each feature map. + dcn_on_last_conv (bool): If true, use dcn in the last layer of + towers. Default: False. + conv_bias (bool | str): If specified as `auto`, it will be decided by + the norm_cfg. Bias of conv will be set as True if `norm_cfg` is + None, otherwise False. Default: "auto". + loss_cls (dict): Config of classification loss. + loss_bbox (dict): Config of localization loss. + bbox_coder (dict): Config of bbox coder. Defaults + 'DistancePointBBoxCoder'. + conv_cfg (dict): Config dict for convolution layer. Default: None. + norm_cfg (dict): Config dict for normalization layer. Default: None. + train_cfg (dict): Training config of anchor head. + test_cfg (dict): Testing config of anchor head. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ # noqa: W605 + + _version = 1 + + def __init__(self, + num_classes, + in_channels, + feat_channels=256, + stacked_convs=4, + strides=(4, 8, 16, 32, 64), + dcn_on_last_conv=False, + conv_bias='auto', + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='IoULoss', loss_weight=1.0), + bbox_coder=dict(type='DistancePointBBoxCoder'), + conv_cfg=None, + norm_cfg=None, + train_cfg=None, + test_cfg=None, + init_cfg=dict( + type='Normal', + layer='Conv2d', + std=0.01, + override=dict( + type='Normal', + name='conv_cls', + std=0.01, + bias_prob=0.01))): + super(AnchorFreeHead, self).__init__(init_cfg) + self.num_classes = num_classes + self.use_sigmoid_cls = loss_cls.get('use_sigmoid', False) + if self.use_sigmoid_cls: + self.cls_out_channels = num_classes + else: + self.cls_out_channels = num_classes + 1 + self.in_channels = in_channels + self.feat_channels = feat_channels + self.stacked_convs = stacked_convs + self.strides = strides + self.dcn_on_last_conv = dcn_on_last_conv + assert conv_bias == 'auto' or isinstance(conv_bias, bool) + self.conv_bias = conv_bias + self.loss_cls = build_loss(loss_cls) + self.loss_bbox = build_loss(loss_bbox) + self.bbox_coder = build_bbox_coder(bbox_coder) + + self.prior_generator = MlvlPointGenerator(strides) + + # In order to keep a more general interface and be consistent with + # anchor_head. We can think of point like one anchor + self.num_base_priors = self.prior_generator.num_base_priors[0] + + self.train_cfg = train_cfg + self.test_cfg = test_cfg + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.fp16_enabled = False + + self._init_layers() + + def _init_layers(self): + """Initialize layers of the head.""" + self._init_cls_convs() + self._init_reg_convs() + self._init_predictor() + + def _init_cls_convs(self): + """Initialize classification conv layers of the head.""" + self.cls_convs = nn.ModuleList() + for i in range(self.stacked_convs): + chn = self.in_channels if i == 0 else self.feat_channels + if self.dcn_on_last_conv and i == self.stacked_convs - 1: + conv_cfg = dict(type='DCNv2') + else: + conv_cfg = self.conv_cfg + self.cls_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=self.norm_cfg, + bias=self.conv_bias)) + + def _init_reg_convs(self): + """Initialize bbox regression conv layers of the head.""" + self.reg_convs = nn.ModuleList() + for i in range(self.stacked_convs): + chn = self.in_channels if i == 0 else self.feat_channels + if self.dcn_on_last_conv and i == self.stacked_convs - 1: + conv_cfg = dict(type='DCNv2') + else: + conv_cfg = self.conv_cfg + self.reg_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=self.norm_cfg, + bias=self.conv_bias)) + + def _init_predictor(self): + """Initialize predictor layers of the head.""" + self.conv_cls = nn.Conv2d( + self.feat_channels, self.cls_out_channels, 3, padding=1) + self.conv_reg = nn.Conv2d(self.feat_channels, 4, 3, padding=1) + + def _load_from_state_dict(self, state_dict, prefix, local_metadata, strict, + missing_keys, unexpected_keys, error_msgs): + """Hack some keys of the model state dict so that can load checkpoints + of previous version.""" + version = local_metadata.get('version', None) + if version is None: + # the key is different in early versions + # for example, 'fcos_cls' become 'conv_cls' now + bbox_head_keys = [ + k for k in state_dict.keys() if k.startswith(prefix) + ] + ori_predictor_keys = [] + new_predictor_keys = [] + # e.g. 'fcos_cls' or 'fcos_reg' + for key in bbox_head_keys: + ori_predictor_keys.append(key) + key = key.split('.') + conv_name = None + if key[1].endswith('cls'): + conv_name = 'conv_cls' + elif key[1].endswith('reg'): + conv_name = 'conv_reg' + elif key[1].endswith('centerness'): + conv_name = 'conv_centerness' + else: + assert NotImplementedError + if conv_name is not None: + key[1] = conv_name + new_predictor_keys.append('.'.join(key)) + else: + ori_predictor_keys.pop(-1) + for i in range(len(new_predictor_keys)): + state_dict[new_predictor_keys[i]] = state_dict.pop( + ori_predictor_keys[i]) + super()._load_from_state_dict(state_dict, prefix, local_metadata, + strict, missing_keys, unexpected_keys, + error_msgs) + + def forward(self, feats): + """Forward features from the upstream network. + + Args: + feats (tuple[Tensor]): Features from the upstream network, each is + a 4D-tensor. + + Returns: + tuple: Usually contain classification scores and bbox predictions. + cls_scores (list[Tensor]): Box scores for each scale level, + each is a 4D-tensor, the channel number is + num_points * num_classes. + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level, each is a 4D-tensor, the channel number is + num_points * 4. + """ + return multi_apply(self.forward_single, feats)[:2] + + def forward_single(self, x): + """Forward features of a single scale level. + + Args: + x (Tensor): FPN feature maps of the specified stride. + + Returns: + tuple: Scores for each class, bbox predictions, features + after classification and regression conv layers, some + models needs these features like FCOS. + """ + cls_feat = x + reg_feat = x + + for cls_layer in self.cls_convs: + cls_feat = cls_layer(cls_feat) + cls_score = self.conv_cls(cls_feat) + + for reg_layer in self.reg_convs: + reg_feat = reg_layer(reg_feat) + bbox_pred = self.conv_reg(reg_feat) + return cls_score, bbox_pred, cls_feat, reg_feat + + @abstractmethod + @force_fp32(apply_to=('cls_scores', 'bbox_preds')) + def loss(self, + cls_scores, + bbox_preds, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Compute loss of the head. + + Args: + cls_scores (list[Tensor]): Box scores for each scale level, + each is a 4D-tensor, the channel number is + num_points * num_classes. + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level, each is a 4D-tensor, the channel number is + num_points * 4. + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (None | list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. + """ + + raise NotImplementedError + + @abstractmethod + def get_targets(self, points, gt_bboxes_list, gt_labels_list): + """Compute regression, classification and centerness targets for points + in multiple images. + + Args: + points (list[Tensor]): Points of each fpn level, each has shape + (num_points, 2). + gt_bboxes_list (list[Tensor]): Ground truth bboxes of each image, + each has shape (num_gt, 4). + gt_labels_list (list[Tensor]): Ground truth labels of each box, + each has shape (num_gt,). + """ + raise NotImplementedError + + def _get_points_single(self, + featmap_size, + stride, + dtype, + device, + flatten=False): + """Get points of a single scale level. + + This function will be deprecated soon. + """ + + warnings.warn( + '`_get_points_single` in `AnchorFreeHead` will be ' + 'deprecated soon, we support a multi level point generator now' + 'you can get points of a single level feature map ' + 'with `self.prior_generator.single_level_grid_priors` ') + + h, w = featmap_size + # First create Range with the default dtype, than convert to + # target `dtype` for onnx exporting. + x_range = torch.arange(w, device=device).to(dtype) + y_range = torch.arange(h, device=device).to(dtype) + y, x = torch.meshgrid(y_range, x_range) + if flatten: + y = y.flatten() + x = x.flatten() + return y, x + + def get_points(self, featmap_sizes, dtype, device, flatten=False): + """Get points according to feature map sizes. + + Args: + featmap_sizes (list[tuple]): Multi-level feature map sizes. + dtype (torch.dtype): Type of points. + device (torch.device): Device of points. + + Returns: + tuple: points of each image. + """ + warnings.warn( + '`get_points` in `AnchorFreeHead` will be ' + 'deprecated soon, we support a multi level point generator now' + 'you can get points of all levels ' + 'with `self.prior_generator.grid_priors` ') + + mlvl_points = [] + for i in range(len(featmap_sizes)): + mlvl_points.append( + self._get_points_single(featmap_sizes[i], self.strides[i], + dtype, device, flatten)) + return mlvl_points + + def aug_test(self, feats, img_metas, rescale=False): + """Test function with test time augmentation. + + Args: + feats (list[Tensor]): the outer list indicates test-time + augmentations and inner Tensor should have a shape NxCxHxW, + which contains features for all images in the batch. + img_metas (list[list[dict]]): the outer list indicates test-time + augs (multiscale, flip, etc.) and the inner list indicates + images in a batch. each dict has image information. + rescale (bool, optional): Whether to rescale the results. + Defaults to False. + + Returns: + list[ndarray]: bbox results of each class + """ + return self.aug_test_bboxes(feats, img_metas, rescale=rescale) diff --git a/mmdet/models/dense_heads/anchor_head.py b/mmdet/models/dense_heads/anchor_head.py new file mode 100644 index 0000000..6d0a49f --- /dev/null +++ b/mmdet/models/dense_heads/anchor_head.py @@ -0,0 +1,763 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch +import torch.nn as nn +from mmcv.runner import force_fp32 + +from mmdet.core import (anchor_inside_flags, build_assigner, build_bbox_coder, + build_prior_generator, build_sampler, images_to_levels, + multi_apply, unmap) +from ..builder import HEADS, build_loss +from .base_dense_head import BaseDenseHead +from .dense_test_mixins import BBoxTestMixin +from mmdet.core.bbox.iou_calculators import bbox_overlaps +from my_equation import * +import global_placeholder + +@HEADS.register_module() +class AnchorHead(BaseDenseHead, BBoxTestMixin): + """Anchor-based head (RPN, RetinaNet, SSD, etc.). + + Args: + num_classes (int): Number of categories excluding the background + category. + in_channels (int): Number of channels in the input feature map. + feat_channels (int): Number of hidden channels. Used in child classes. + anchor_generator (dict): Config dict for anchor generator + bbox_coder (dict): Config of bounding box coder. + reg_decoded_bbox (bool): If true, the regression loss would be + applied directly on decoded bounding boxes, converting both + the predicted boxes and regression targets to absolute + coordinates format. Default False. It should be `True` when + using `IoULoss`, `GIoULoss`, or `DIoULoss` in the bbox head. + loss_cls (dict): Config of classification loss. + loss_bbox (dict): Config of localization loss. + train_cfg (dict): Training config of anchor head. + test_cfg (dict): Testing config of anchor head. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ # noqa: W605 + + def __init__(self, + num_classes, + in_channels, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8, 16, 32], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + clip_border=True, + target_means=(.0, .0, .0, .0), + target_stds=(1.0, 1.0, 1.0, 1.0)), + reg_decoded_bbox=False, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=1.0), + loss_bbox=dict( + type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0), + train_cfg=None, + test_cfg=None, + init_cfg=dict(type='Normal', layer='Conv2d', std=0.01)): + super(AnchorHead, self).__init__(init_cfg) + self.in_channels = in_channels + self.num_classes = num_classes + self.feat_channels = feat_channels + self.use_sigmoid_cls = loss_cls.get('use_sigmoid', False) + if self.use_sigmoid_cls: + self.cls_out_channels = num_classes + else: + self.cls_out_channels = num_classes + 1 + + if self.cls_out_channels <= 0: + raise ValueError(f'num_classes={num_classes} is too small') + self.reg_decoded_bbox = reg_decoded_bbox + + self.bbox_coder = build_bbox_coder(bbox_coder) + self.loss_cls = build_loss(loss_cls) + self.loss_bbox = build_loss(loss_bbox) + self.train_cfg = train_cfg + self.test_cfg = test_cfg + if self.train_cfg: + self.assigner = build_assigner(self.train_cfg.assigner) + if hasattr(self.train_cfg, + 'sampler') and self.train_cfg.sampler.type.split( + '.')[-1] != 'PseudoSampler': + self.sampling = True + sampler_cfg = self.train_cfg.sampler + # avoid BC-breaking + if loss_cls['type'] in [ + 'FocalLoss', 'GHMC', 'QualityFocalLoss' + ]: + warnings.warn( + 'DeprecationWarning: Determining whether to sampling' + 'by loss type is deprecated, please delete sampler in' + 'your config when using `FocalLoss`, `GHMC`, ' + '`QualityFocalLoss` or other FocalLoss variant.') + self.sampling = False + sampler_cfg = dict(type='PseudoSampler') + else: + self.sampling = False + sampler_cfg = dict(type='PseudoSampler') + self.sampler = build_sampler(sampler_cfg, context=self) + self.fp16_enabled = False + + self.prior_generator = build_prior_generator(anchor_generator) + + # Usually the numbers of anchors for each level are the same + # except SSD detectors. So it is an int in the most dense + # heads but a list of int in SSDHead + self.num_base_priors = self.prior_generator.num_base_priors[0] + self._init_layers() + + @property + def num_anchors(self): + warnings.warn('DeprecationWarning: `num_anchors` is deprecated, ' + 'for consistency or also use ' + '`num_base_priors` instead') + return self.prior_generator.num_base_priors[0] + + @property + def anchor_generator(self): + warnings.warn('DeprecationWarning: anchor_generator is deprecated, ' + 'please use "prior_generator" instead') + return self.prior_generator + + def _init_layers(self): + """Initialize layers of the head.""" + self.conv_cls = nn.Conv2d(self.in_channels, + self.num_base_priors * self.cls_out_channels, + 1) + self.conv_reg = nn.Conv2d(self.in_channels, self.num_base_priors * 4, + 1) + + def forward_single(self, x): + """Forward feature of a single scale level. + + Args: + x (Tensor): Features of a single scale level. + + Returns: + tuple: + cls_score (Tensor): Cls scores for a single scale level \ + the channels number is num_base_priors * num_classes. + bbox_pred (Tensor): Box energies / deltas for a single scale \ + level, the channels number is num_base_priors * 4. + """ + cls_score = self.conv_cls(x) + bbox_pred = self.conv_reg(x) + return cls_score, bbox_pred + + def forward(self, feats): + """Forward features from the upstream network. + + Args: + feats (tuple[Tensor]): Features from the upstream network, each is + a 4D-tensor. + + Returns: + tuple: A tuple of classification scores and bbox prediction. + + - cls_scores (list[Tensor]): Classification scores for all \ + scale levels, each is a 4D-tensor, the channels number \ + is num_base_priors * num_classes. + - bbox_preds (list[Tensor]): Box energies / deltas for all \ + scale levels, each is a 4D-tensor, the channels number \ + is num_base_priors * 4. + """ + return multi_apply(self.forward_single, feats) + + def get_anchors(self, featmap_sizes, img_metas, device='cuda'): + """Get anchors according to feature map sizes. + + Args: + featmap_sizes (list[tuple]): Multi-level feature map sizes. + img_metas (list[dict]): Image meta info. + device (torch.device | str): Device for returned tensors + + Returns: + tuple: + anchor_list (list[Tensor]): Anchors of each image. + valid_flag_list (list[Tensor]): Valid flags of each image. + """ + num_imgs = len(img_metas) + + # since feature map sizes of all images are the same, we only compute + # anchors for one time + multi_level_anchors = self.prior_generator.grid_priors( + featmap_sizes, device=device) + anchor_list = [multi_level_anchors for _ in range(num_imgs)] + + # for each image, we compute valid flags of multi level anchors + valid_flag_list = [] + for img_id, img_meta in enumerate(img_metas): + multi_level_flags = self.prior_generator.valid_flags( + featmap_sizes, img_meta['pad_shape'], device) + valid_flag_list.append(multi_level_flags) + + return anchor_list, valid_flag_list + + def _get_targets_single(self, + flat_anchors, + valid_flags, + gt_bboxes, + gt_bboxes_ignore, + gt_labels, + img_meta, + label_channels=1, + unmap_outputs=True): + """Compute regression and classification targets for anchors in a + single image. + + Args: + flat_anchors (Tensor): Multi-level anchors of the image, which are + concatenated into a single tensor of shape (num_anchors ,4) + valid_flags (Tensor): Multi level valid flags of the image, + which are concatenated into a single tensor of + shape (num_anchors,). + gt_bboxes (Tensor): Ground truth bboxes of the image, + shape (num_gts, 4). + gt_bboxes_ignore (Tensor): Ground truth bboxes to be + ignored, shape (num_ignored_gts, 4). + img_meta (dict): Meta info of the image. + gt_labels (Tensor): Ground truth labels of each box, + shape (num_gts,). + label_channels (int): Channel of label. + unmap_outputs (bool): Whether to map outputs back to the original + set of anchors. + + Returns: + tuple: + labels_list (list[Tensor]): Labels of each level + label_weights_list (list[Tensor]): Label weights of each level + bbox_targets_list (list[Tensor]): BBox targets of each level + bbox_weights_list (list[Tensor]): BBox weights of each level + num_total_pos (int): Number of positive samples in all images + num_total_neg (int): Number of negative samples in all images + """ + inside_flags = anchor_inside_flags(flat_anchors, valid_flags, + img_meta['img_shape'][:2], + self.train_cfg.allowed_border) + if not inside_flags.any(): + return (None, ) * 7 + # assign gt and sample anchors + anchors = flat_anchors[inside_flags, :] + + assign_result = self.assigner.assign( + anchors, gt_bboxes, gt_bboxes_ignore, + None if self.sampling else gt_labels) + sampling_result = self.sampler.sample(assign_result, anchors, + gt_bboxes) + + num_valid_anchors = anchors.shape[0] + bbox_targets = torch.zeros_like(anchors) + bbox_weights = torch.zeros_like(anchors) + labels = anchors.new_full((num_valid_anchors, ), + self.num_classes, + dtype=torch.long) + label_weights = anchors.new_zeros(num_valid_anchors, dtype=torch.float) + + pos_inds = sampling_result.pos_inds + neg_inds = sampling_result.neg_inds + if len(pos_inds) > 0: + if not self.reg_decoded_bbox: + pos_bbox_targets = self.bbox_coder.encode( + sampling_result.pos_bboxes, sampling_result.pos_gt_bboxes) + else: + pos_bbox_targets = sampling_result.pos_gt_bboxes + bbox_targets[pos_inds, :] = pos_bbox_targets + bbox_weights[pos_inds, :] = 1.0 + if gt_labels is None: + # Only rpn gives gt_labels as None + # Foreground is the first class since v2.5.0 + labels[pos_inds] = 0 + else: + labels[pos_inds] = gt_labels[ + sampling_result.pos_assigned_gt_inds] + if self.train_cfg.pos_weight <= 0: + label_weights[pos_inds] = 1.0 + else: + label_weights[pos_inds] = self.train_cfg.pos_weight + if len(neg_inds) > 0: + label_weights[neg_inds] = 1.0 + + # map up to original set of anchors + if unmap_outputs: + num_total_anchors = flat_anchors.size(0) + labels = unmap( + labels, num_total_anchors, inside_flags, + fill=self.num_classes) # fill bg label + label_weights = unmap(label_weights, num_total_anchors, + inside_flags) + bbox_targets = unmap(bbox_targets, num_total_anchors, inside_flags) + bbox_weights = unmap(bbox_weights, num_total_anchors, inside_flags) + + return (labels, label_weights, bbox_targets, bbox_weights, pos_inds, + neg_inds, sampling_result) + + def get_targets(self, + anchor_list, + valid_flag_list, + gt_bboxes_list, + img_metas, + gt_bboxes_ignore_list=None, + gt_labels_list=None, + label_channels=1, + unmap_outputs=True, + return_sampling_results=False): + """Compute regression and classification targets for anchors in + multiple images. + + Args: + anchor_list (list[list[Tensor]]): Multi level anchors of each + image. The outer list indicates images, and the inner list + corresponds to feature levels of the image. Each element of + the inner list is a tensor of shape (num_anchors, 4). + valid_flag_list (list[list[Tensor]]): Multi level valid flags of + each image. The outer list indicates images, and the inner list + corresponds to feature levels of the image. Each element of + the inner list is a tensor of shape (num_anchors, ) + gt_bboxes_list (list[Tensor]): Ground truth bboxes of each image. + img_metas (list[dict]): Meta info of each image. + gt_bboxes_ignore_list (list[Tensor]): Ground truth bboxes to be + ignored. + gt_labels_list (list[Tensor]): Ground truth labels of each box. + label_channels (int): Channel of label. + unmap_outputs (bool): Whether to map outputs back to the original + set of anchors. + + Returns: + tuple: Usually returns a tuple containing learning targets. + + - labels_list (list[Tensor]): Labels of each level. + - label_weights_list (list[Tensor]): Label weights of each + level. + - bbox_targets_list (list[Tensor]): BBox targets of each level. + - bbox_weights_list (list[Tensor]): BBox weights of each level. + - num_total_pos (int): Number of positive samples in all + images. + - num_total_neg (int): Number of negative samples in all + images. + + additional_returns: This function enables user-defined returns from + `self._get_targets_single`. These returns are currently refined + to properties at each feature map (i.e. having HxW dimension). + The results will be concatenated after the end + """ + num_imgs = len(img_metas) + assert len(anchor_list) == len(valid_flag_list) == num_imgs + + # anchor number of multi levels + num_level_anchors = [anchors.size(0) for anchors in anchor_list[0]] + # concat all level anchors to a single tensor + concat_anchor_list = [] + concat_valid_flag_list = [] + for i in range(num_imgs): + assert len(anchor_list[i]) == len(valid_flag_list[i]) + concat_anchor_list.append(torch.cat(anchor_list[i])) + concat_valid_flag_list.append(torch.cat(valid_flag_list[i])) + + # compute targets for each image + if gt_bboxes_ignore_list is None: + gt_bboxes_ignore_list = [None for _ in range(num_imgs)] + if gt_labels_list is None: + gt_labels_list = [None for _ in range(num_imgs)] + results = multi_apply( + self._get_targets_single, + concat_anchor_list, + concat_valid_flag_list, + gt_bboxes_list, + gt_bboxes_ignore_list, + gt_labels_list, + img_metas, + label_channels=label_channels, + unmap_outputs=unmap_outputs) + (all_labels, all_label_weights, all_bbox_targets, all_bbox_weights, + pos_inds_list, neg_inds_list, sampling_results_list) = results[:7] # 这里会返回pos、neg inds + rest_results = list(results[7:]) # user-added return values + # no valid anchors + if any([labels is None for labels in all_labels]): + return None + # sampled anchors of all images + num_total_pos = sum([max(inds.numel(), 1) for inds in pos_inds_list]) + num_total_neg = sum([max(inds.numel(), 1) for inds in neg_inds_list]) + # split targets to a list w.r.t. multiple levels + labels_list = images_to_levels(all_labels, num_level_anchors) + label_weights_list = images_to_levels(all_label_weights, + num_level_anchors) + bbox_targets_list = images_to_levels(all_bbox_targets, + num_level_anchors) + bbox_weights_list = images_to_levels(all_bbox_weights, + num_level_anchors) + res = (labels_list, label_weights_list, bbox_targets_list, + bbox_weights_list, num_total_pos, num_total_neg) + if return_sampling_results: + res = res + (sampling_results_list, ) + for i, r in enumerate(rest_results): # user-added return values + rest_results[i] = images_to_levels(r, num_level_anchors) + + return res + tuple(rest_results) + + def loss_single(self, cls_score, bbox_pred, anchors, labels, label_weights, # single指的是单分支;这里传进来就是一个batch的。 + bbox_targets, bbox_weights, cls_branch_factor, reg_branch_factor, num_total_samples): + """Compute loss of a single scale level. + + Args: + cls_score (Tensor): Box scores for each scale level + Has shape (N, num_anchors * num_classes, H, W). + bbox_pred (Tensor): Box energies / deltas for each scale + level with shape (N, num_anchors * 4, H, W). + anchors (Tensor): Box reference for each scale level with shape + (N, num_total_anchors, 4). + labels (Tensor): Labels of each anchors with shape + (N, num_total_anchors). + label_weights (Tensor): Label weights of each anchor with shape + (N, num_total_anchors) + bbox_targets (Tensor): BBox regression targets of each anchor + weight shape (N, num_total_anchors, 4). + bbox_weights (Tensor): BBox regression loss weights of each anchor + with shape (N, num_total_anchors, 4). + num_total_samples (int): If sampling, num total samples equal to + the number of total anchors; Otherwise, it is the number of + positive anchors. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + # classification loss + labels = labels.reshape(-1) + label_weights = label_weights.reshape(-1) + cls_score = cls_score.permute(0, 2, 3, + 1).reshape(-1, self.cls_out_channels) + + bbox_targets = bbox_targets.reshape(-1, 4) + bbox_weights = bbox_weights.reshape(-1, 4) + + # 获取正负样本inds + pos_inds = torch.nonzero(bbox_weights.sum(dim=1), as_tuple=False).squeeze() + valid_inds = torch.nonzero(label_weights, as_tuple=False).squeeze() + if pos_inds.numel() == 1: + # 得升维 + pos_inds = pos_inds.unsqueeze(dim=-1) + + loss_cls = self.loss_cls( + cls_score, labels, label_weights, reduction_override='none') # 这个其实就是除以 num_total_samples + loss_cls = loss_cls.sum(dim=1) + # regression loss + # loss_cls = loss_cls / num_total_samples # note + + bbox_pred = bbox_pred.permute(0, 2, 3, 1).reshape(-1, 4) + if self.reg_decoded_bbox: + # When the regression loss (e.g. `IouLoss`, `GIouLoss`) + # is applied directly on the decoded bounding boxes, it + # decodes the already encoded coordinates to absolute format. + raise NotImplementedError + anchors = anchors.reshape(-1, 4) + bbox_pred = self.bbox_coder.decode(anchors, bbox_pred) + loss_bbox = self.loss_bbox( + bbox_pred, + bbox_targets, + bbox_weights, + reduction_override='none' + ) + + loss_bbox = loss_bbox.sum(dim=1) + + # loss_cls_pos = loss_cls_all[pos_inds] + # loss_cls_neg = topk_loss_cls_neg + + from mmdet.models.dense_heads import RetinaHead, RPNHead + if global_placeholder.mybuff_flag and not isinstance(self, RPNHead) and pos_inds.numel(): + # 只在pos_indx有的情况下执行 + + if 'RetinaHead' in self.__class__.__name__: # + # if isinstance(self, RetinaHead): + conf_values = torch.sigmoid(cls_score) # TODO 注意,这里是因为Retina要sigmoid! + else: + conf_values = F.softmax(cls_score, dim=1) # TODO 注意,这里是因为Retina要sigmoid! + num_classes = conf_values.shape[-1] + if num_classes == 81 or num_classes == 21: + # 说明默认backbgound为81类 21类 + pos_gtconf_idx = F.one_hot(labels, num_classes=num_classes) + else: + # 说明没有显式给出类 + + num_classes = num_classes + 1 + pos_gtconf_idx = F.one_hot(labels, num_classes=num_classes) + pos_gtconf_idx = pos_gtconf_idx[:, :-1]# 剔除最后一个背景类 + + pos_gtconf_values, _ = (conf_values * pos_gtconf_idx).max(dim=1) # TODO 想到一件事,是不是不能用GT来筛选正样本的结果?因为其实正样本也有错误的东西,所以就是得错 + pos_gtconf_values = pos_gtconf_values[pos_inds] + + pos_conf_values, pos_conf_values_idx = conf_values.max(dim=1) # TODO 好像真的是这个问题,正样本本来就是得对应到max的那个,不能经过GT筛选 + pos_conf_values = pos_conf_values[pos_inds] + + anchors = anchors.reshape(-1, 4) + abs_bbox_pred = self.bbox_coder.decode(anchors, bbox_pred) # 直接解读 + abs_bbox_targets = self.bbox_coder.decode(anchors, bbox_targets) # 直接解读 + try: + pos_ious = bbox_overlaps(abs_bbox_pred[pos_inds], abs_bbox_targets[pos_inds], is_aligned=True) # 这玩意得是ltrb坐标,好像就已经是了??? + except IndexError as e: + print(f"inds.numel(): {pos_inds.numel()} \ninds.max(): {pos_inds.max()} \ninds.shape: {pos_inds.shape} \nabs_bbox_pred.shape: {abs_bbox_pred.shape}") + print(e) + exit() + if global_placeholder.mybuff_flag == 1: + # loss_bbox, loss_cls = loss_bbox * (1 + reg_branch_factor), loss_cls * (1 + cls_branch_factor) # 确实这玩意应该是全局??? + # loss_bbox, loss_cls = loss_bbox * (1 + cls_branch_factor), loss_cls * (1 + reg_branch_factor) # 确实这玩意应该是全局??? + # conf_values = F.softmax(cls_score, dim=1) + + # cls_trade_off = (cls_branch_factor / (cls_branch_factor + reg_branch_factor)).detach() * 2 + # reg_trade_off = (reg_branch_factor / (cls_branch_factor + reg_branch_factor)).detach() * 2 + + # cls_trade_off = (cls_branch_factor / (cls_branch_factor + reg_branch_factor)).detach() + # reg_trade_off = (reg_branch_factor / (cls_branch_factor + reg_branch_factor)).detach() + + # cls_trade_off = torch.tanh(cls_branch_factor.mean()).detach() + # reg_trade_off = torch.tanh(reg_branch_factor.mean()).detach() + + # # cls_trade_off = 1+torch.exp(-cls_branch_factor) + # # reg_trade_off = 1+torch.exp(-reg_branch_factor) + + # # cls_trade_off = 1+torch.exp(-cls_branch_factor).detach() + # # reg_trade_off = 1+torch.exp(-reg_branch_factor).detach() + + + + # loss_cls = cls_trade_off * loss_cls + # loss_bbox = reg_trade_off * loss_bbox + + # loss_cls = (1+cls_trade_off) * loss_cls # 这更差了 + # loss_bbox = (1+reg_trade_off) * loss_bbox + + # cls_right_mask = pos_gtconf_values == pos_conf_values + # cls_right_mask = torch.tensor(1.) + + + + + # eps = 2.220446049250313e-16# -10貌似可以,但是我狠一点 + # # correlation = torch.pow(pos_conf_values+eps, 0.5) * torch.pow(ious+eps, 0.5) - eps + # correlation = torch.pow(pos_gtconf_values+eps, cls_trade_off) * torch.pow(pos_ious+eps, reg_trade_off) - eps + # indicator = torch.exp(1 - correlation) + # loss_bbox[pos_inds], loss_cls[pos_inds] = indicator * loss_bbox[pos_inds], indicator * loss_cls[pos_inds] + # loss_bbox[pos_inds] = ((1 + pos_ious) ** 0.8) * loss_bbox[pos_inds] + loss_bbox[pos_inds], loss_cls[pos_inds] = HQOD_loss(loss_bbox[pos_inds], loss_cls[pos_inds], conf_values[pos_inds], pos_gtconf_values, pos_conf_values, pos_ious, cls_branch_factor, reg_branch_factor, torch.tensor(1.)) + elif global_placeholder.mybuff_flag == 2: + loss_bbox[pos_inds], loss_cls[pos_inds] = HarDet_loss(loss_bbox[pos_inds], loss_cls[pos_inds], conf_values[pos_inds], pos_gtconf_values, pos_conf_values, pos_ious, torch.tensor(1.)) + + + + + loss_cls = loss_cls.sum() / num_total_samples + loss_bbox = loss_bbox.sum() / num_total_samples + + + # loss_bbox = loss_bbox / num_total_samples # note + return loss_cls, loss_bbox + + # def loss_single(self, cls_score, bbox_pred, anchors, labels, label_weights, + # bbox_targets, bbox_weights, num_total_samples): + # """Compute loss of a single scale level. + + # Args: + # cls_score (Tensor): Box scores for each scale level + # Has shape (N, num_anchors * num_classes, H, W). + # bbox_pred (Tensor): Box energies / deltas for each scale + # level with shape (N, num_anchors * 4, H, W). + # anchors (Tensor): Box reference for each scale level with shape + # (N, num_total_anchors, 4). + # labels (Tensor): Labels of each anchors with shape + # (N, num_total_anchors). + # label_weights (Tensor): Label weights of each anchor with shape + # (N, num_total_anchors) + # bbox_targets (Tensor): BBox regression targets of each anchor + # weight shape (N, num_total_anchors, 4). + # bbox_weights (Tensor): BBox regression loss weights of each anchor + # with shape (N, num_total_anchors, 4). + # num_total_samples (int): If sampling, num total samples equal to + # the number of total anchors; Otherwise, it is the number of + # positive anchors. + + # Returns: + # dict[str, Tensor]: A dictionary of loss components. + # """ + # # classification loss + # labels = labels.reshape(-1) + # label_weights = label_weights.reshape(-1) + # cls_score = cls_score.permute(0, 2, 3, + # 1).reshape(-1, self.cls_out_channels) + # loss_cls = self.loss_cls( + # cls_score, labels, label_weights, avg_factor=num_total_samples) + # # regression loss + # bbox_targets = bbox_targets.reshape(-1, 4) + # bbox_weights = bbox_weights.reshape(-1, 4) + # bbox_pred = bbox_pred.permute(0, 2, 3, 1).reshape(-1, 4) + # if self.reg_decoded_bbox: + # # When the regression loss (e.g. `IouLoss`, `GIouLoss`) + # # is applied directly on the decoded bounding boxes, it + # # decodes the already encoded coordinates to absolute format. + # anchors = anchors.reshape(-1, 4) + # bbox_pred = self.bbox_coder.decode(anchors, bbox_pred) + # loss_bbox = self.loss_bbox( + # bbox_pred, + # bbox_targets, + # bbox_weights, + # avg_factor=num_total_samples) + # return loss_cls, loss_bbox + + @force_fp32(apply_to=('cls_scores', 'bbox_preds')) + def loss(self, + cls_scores, + bbox_preds, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Compute losses of the head. + + Args: + cls_scores (list[Tensor]): Box scores for each scale level + Has shape (N, num_anchors * num_classes, H, W) + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level with shape (N, num_anchors * 4, H, W) + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (None | list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. Default: None + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + assert len(featmap_sizes) == self.prior_generator.num_levels + + device = cls_scores[0].device + + anchor_list, valid_flag_list = self.get_anchors( + featmap_sizes, img_metas, device=device) + label_channels = self.cls_out_channels if self.use_sigmoid_cls else 1 + cls_reg_targets = self.get_targets( + anchor_list, + valid_flag_list, + gt_bboxes, + img_metas, + gt_bboxes_ignore_list=gt_bboxes_ignore, + gt_labels_list=gt_labels, + label_channels=label_channels) + if cls_reg_targets is None: + return None + (labels_list, label_weights_list, bbox_targets_list, bbox_weights_list, + num_total_pos, num_total_neg) = cls_reg_targets + num_total_samples = ( + num_total_pos + num_total_neg if self.sampling else num_total_pos) + + # anchor number of multi levels + num_level_anchors = [anchors.size(0) for anchors in anchor_list[0]] + # concat all level anchors and flags to a single tensor + concat_anchor_list = [] + for i in range(len(anchor_list)): + concat_anchor_list.append(torch.cat(anchor_list[i])) + all_anchor_list = images_to_levels(concat_anchor_list, + num_level_anchors) + + + level_slicer = [len(num_level_anchors), 5, 4] # [0]为level数;[1]为weight的个数;[2]为单level下的act个数 + level_cls_factors = [] + level_reg_factors = [] + qloss_flag = global_placeholder.qloss_flag + + if False: + q_loss_total = [] + cls_branch = [] + reg_branch = [] + for name, module in self.named_modules(): + if hasattr(module, 'compute_qloss') and module.compute_qloss: + # 挑出来量化器 + # if 'fake_quant' in name.split('.')[-1]: + # 说明是act quantizer + if 'cls' in name: + # 说明是cls分支的量化器 + # cls_branch.append(module.quantization_loss) + if 'post_act' in name: + # 说明是act量化器 + cls_branch.append([name, module.scale * 1.]) + else: + cls_branch.append([name, module.scale * 2.]) + + elif 'reg' in name: + # 说明是reg分支的量化器 + # reg_branch.append(module.quantization_loss) + if 'post_act' in name: + # 说明是act量化器 + reg_branch.append([name, module.scale * 1.]) + else: + reg_branch.append([name, module.scale * 2.]) + + q_loss_total.append([name, module.scale]) + + # if hasattr(module, 'input'): + # from plot_curve import save_distribution + # title = 'input of ' + name + f' scale:{str(module.scale.data.cpu().numpy().round(5))}' + # # if 'cls_convs_1_activate_1_post_act_fake_quantizer' in title: + # # save_distribution(module.input.cpu().numpy(), title) + # save_distribution(module.input.cpu().numpy(), title) + + # 遍历level,整出每个level的factor + for it in range(level_slicer[0]): + cls_summation = 0 + reg_summation = 0 + tmp_cls_infos = cls_branch[level_slicer[1]+level_slicer[2]*it:level_slicer[1]+level_slicer[2]*(it+1)] + for info in tmp_cls_infos: + cls_summation += info[1] + tmp_reg_infos = reg_branch[level_slicer[1]+level_slicer[2]*it:level_slicer[1]+level_slicer[2]*(it+1)] + for info in tmp_reg_infos: + reg_summation += info[1] + + level_cls_factors.append(cls_summation) + level_reg_factors.append(reg_summation) + + if len(level_cls_factors) + len(level_reg_factors) == 0: + # 必须让list内有level个空list + level_cls_factors = [torch.tensor(1)] * len(num_level_anchors) + level_reg_factors = [torch.tensor(1)] * len(num_level_anchors) + losses_cls, losses_bbox = multi_apply( + self.loss_single, + cls_scores, + bbox_preds, + all_anchor_list, + labels_list, + label_weights_list, + bbox_targets_list, + bbox_weights_list, + level_cls_factors, + level_reg_factors, + num_total_samples=num_total_samples) + return dict(loss_cls=losses_cls, loss_bbox=losses_bbox) + + def aug_test(self, feats, img_metas, rescale=False): + """Test function with test time augmentation. + + Args: + feats (list[Tensor]): the outer list indicates test-time + augmentations and inner Tensor should have a shape NxCxHxW, + which contains features for all images in the batch. + img_metas (list[list[dict]]): the outer list indicates test-time + augs (multiscale, flip, etc.) and the inner list indicates + images in a batch. each dict has image information. + rescale (bool, optional): Whether to rescale the results. + Defaults to False. + + Returns: + list[tuple[Tensor, Tensor]]: Each item in result_list is 2-tuple. + The first item is ``bboxes`` with shape (n, 5), where + 5 represent (tl_x, tl_y, br_x, br_y, score). + The shape of the second tensor in the tuple is ``labels`` + with shape (n,), The length of list should always be 1. + """ + return self.aug_test_bboxes(feats, img_metas, rescale=rescale) diff --git a/mmdet/models/dense_heads/ascend_anchor_head.py b/mmdet/models/dense_heads/ascend_anchor_head.py new file mode 100644 index 0000000..7d100ba --- /dev/null +++ b/mmdet/models/dense_heads/ascend_anchor_head.py @@ -0,0 +1,389 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from ...core.bbox.assigners import AscendMaxIoUAssigner +from ...core.bbox.samplers import PseudoSampler +from ...utils import (batch_images_to_levels, get_max_num_gt_division_factor, + masked_fill) +from ..builder import HEADS +from .anchor_head import AnchorHead + + +@HEADS.register_module() +class AscendAnchorHead(AnchorHead): + """Ascend Anchor-based head (RetinaNet, SSD, etc.). + + Args: + num_classes (int): Number of categories excluding the background + category. + in_channels (int): Number of channels in the input feature map. + feat_channels (int): Number of hidden channels. Used in child classes. + anchor_generator (dict): Config dict for anchor generator + bbox_coder (dict): Config of bounding box coder. + reg_decoded_bbox (bool): If true, the regression loss would be + applied directly on decoded bounding boxes, converting both + the predicted boxes and regression targets to absolute + coordinates format. Default False. It should be `True` when + using `IoULoss`, `GIoULoss`, or `DIoULoss` in the bbox head. + loss_cls (dict): Config of classification loss. + loss_bbox (dict): Config of localization loss. + train_cfg (dict): Training config of anchor head. + test_cfg (dict): Testing config of anchor head. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ # noqa: W605 + + def __init__(self, + num_classes, + in_channels, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8, 16, 32], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + clip_border=True, + target_means=(.0, .0, .0, .0), + target_stds=(1.0, 1.0, 1.0, 1.0)), + reg_decoded_bbox=False, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=1.0), + loss_bbox=dict( + type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0), + train_cfg=None, + test_cfg=None, + init_cfg=dict(type='Normal', layer='Conv2d', std=0.01)): + super(AscendAnchorHead, self).__init__( + num_classes=num_classes, + in_channels=in_channels, + feat_channels=feat_channels, + anchor_generator=anchor_generator, + bbox_coder=bbox_coder, + reg_decoded_bbox=reg_decoded_bbox, + loss_cls=loss_cls, + loss_bbox=loss_bbox, + train_cfg=train_cfg, + test_cfg=test_cfg, + init_cfg=init_cfg) + + def get_batch_gt_bboxes(self, gt_bboxes_list, num_images, gt_nums, device, + max_gt_labels): + """Get ground truth bboxes of all image. + + Args: + gt_bboxes_list (list[Tensor]): Ground truth bboxes of each image. + num_images (int): The num of images. + gt_nums(list[int]): The ground truth bboxes num of each image. + device (torch.device | str): Device for returned tensors + max_gt_labels(int): The max ground truth bboxes num of all image. + Returns: + batch_gt_bboxes: (Tensor): Ground truth bboxes of all image. + """ + # a static ground truth boxes. + # Save static gt. Related to Ascend. Helps improve performance + if not hasattr(self, 'batch_gt_bboxes'): + self.batch_gt_bboxes = {} + # a min anchor filled the excess anchor + if not hasattr(self, 'min_anchor'): + self.min_anchor = (-1354, -1344) + if gt_bboxes_list is None: + batch_gt_bboxes = None + else: + if self.batch_gt_bboxes.get(max_gt_labels) is None: + batch_gt_bboxes = torch.zeros((num_images, max_gt_labels, 4), + dtype=gt_bboxes_list[0].dtype, + device=device) + batch_gt_bboxes[:, :, :2] = self.min_anchor[0] + batch_gt_bboxes[:, :, 2:] = self.min_anchor[1] + self.batch_gt_bboxes[max_gt_labels] = batch_gt_bboxes.clone() + else: + batch_gt_bboxes = self.batch_gt_bboxes.get( + max_gt_labels).clone() + for index_imgs, gt_bboxes in enumerate(gt_bboxes_list): + batch_gt_bboxes[index_imgs, :gt_nums[index_imgs]] = gt_bboxes + return batch_gt_bboxes + + def get_batch_gt_bboxes_ignore(self, gt_bboxes_ignore_list, num_images, + gt_nums, device): + """Ground truth bboxes to be ignored of all image. + + Args: + gt_bboxes_ignore_list (list[Tensor]): Ground truth bboxes to be + ignored. + num_images (int): The num of images. + gt_nums(list[int]): The ground truth bboxes num of each image. + device (torch.device | str): Device for returned tensors + Returns: + batch_gt_bboxes_ignore: (Tensor): Ground truth bboxes to be + ignored of all image. + """ + # TODO: support gt_bboxes_ignore_list + if gt_bboxes_ignore_list is None: + batch_gt_bboxes_ignore = None + else: + raise RuntimeError('gt_bboxes_ignore not support yet') + return batch_gt_bboxes_ignore + + def get_batch_gt_labels(self, gt_labels_list, num_images, gt_nums, device, + max_gt_labels): + """Ground truth bboxes to be ignored of all image. + + Args: + gt_labels_list (list[Tensor]): Ground truth labels. + num_images (int): The num of images. + gt_nums(list[int]): The ground truth bboxes num of each image. + device (torch.device | str): Device for returned tensors + Returns: + batch_gt_labels: (Tensor): Ground truth labels of all image. + """ + if gt_labels_list is None: + batch_gt_labels = None + else: + batch_gt_labels = torch.zeros((num_images, max_gt_labels), + dtype=gt_labels_list[0].dtype, + device=device) + for index_imgs, gt_labels in enumerate(gt_labels_list): + batch_gt_labels[index_imgs, :gt_nums[index_imgs]] = gt_labels + + return batch_gt_labels + + def _get_targets_concat(self, + batch_anchors, + batch_valid_flags, + batch_gt_bboxes, + batch_gt_bboxes_ignore, + batch_gt_labels, + img_metas, + label_channels=1, + unmap_outputs=True): + """Compute regression and classification targets for anchors in all + images. + + Args: + batch_anchors (Tensor): anchors of all image, which are + concatenated into a single tensor of + shape (num_imgs, num_anchors ,4). + batch_valid_flags (Tensor): valid flags of all image, + which are concatenated into a single tensor of + shape (num_imgs, num_anchors,). + batch_gt_bboxes (Tensor): Ground truth bboxes of all image, + shape (num_imgs, max_gt_nums, 4). + batch_gt_bboxes_ignore (Tensor): Ground truth bboxes to be + ignored, shape (num_imgs, num_ignored_gts, 4). + batch_gt_labels (Tensor): Ground truth labels of each box, + shape (num_imgs, max_gt_nums,). + img_metas (list[dict]): Meta info of each image. + label_channels (int): Channel of label. + unmap_outputs (bool): Whether to map outputs back to the original + set of anchors. + + Returns: + tuple: + batch_labels (Tensor): Labels of all level + batch_label_weights (Tensor): Label weights of all level + batch_bbox_targets (Tensor): BBox targets of all level + batch_bbox_weights (Tensor): BBox weights of all level + batch_pos_mask (Tensor): Positive samples mask in all images + batch_neg_mask (Tensor): Negative samples mask in all images + sampling_result (Sampling): The result of sampling, + default: None. + """ + num_imgs, num_anchors, _ = batch_anchors.size() + # assign gt and sample batch_anchors + assign_result = self.assigner.assign( + batch_anchors, + batch_gt_bboxes, + batch_gt_bboxes_ignore, + None if self.sampling else batch_gt_labels, + batch_bboxes_ignore_mask=batch_valid_flags) + # TODO: support sampling_result + sampling_result = None + batch_pos_mask = assign_result.batch_pos_mask + batch_neg_mask = assign_result.batch_neg_mask + batch_anchor_gt_indes = assign_result.batch_anchor_gt_indes + batch_anchor_gt_labels = assign_result.batch_anchor_gt_labels + + batch_anchor_gt_bboxes = torch.zeros( + batch_anchors.size(), + dtype=batch_anchors.dtype, + device=batch_anchors.device) + for index_imgs in range(num_imgs): + batch_anchor_gt_bboxes[index_imgs] = torch.index_select( + batch_gt_bboxes[index_imgs], 0, + batch_anchor_gt_indes[index_imgs]) + + batch_bbox_targets = torch.zeros_like(batch_anchors) + batch_bbox_weights = torch.zeros_like(batch_anchors) + batch_labels = batch_anchors.new_full((num_imgs, num_anchors), + self.num_classes, + dtype=torch.int) + batch_label_weights = batch_anchors.new_zeros((num_imgs, num_anchors), + dtype=torch.float) + + if not self.reg_decoded_bbox: + batch_pos_bbox_targets = self.bbox_coder.encode( + batch_anchors, batch_anchor_gt_bboxes) + else: + batch_pos_bbox_targets = batch_anchor_gt_bboxes + + batch_bbox_targets = masked_fill(batch_bbox_targets, + batch_pos_mask.unsqueeze(2), + batch_pos_bbox_targets) + batch_bbox_weights = masked_fill(batch_bbox_weights, + batch_pos_mask.unsqueeze(2), 1.0) + if batch_gt_labels is None: + batch_labels = masked_fill(batch_labels, batch_pos_mask, 0.0) + else: + batch_labels = masked_fill(batch_labels, batch_pos_mask, + batch_anchor_gt_labels) + if self.train_cfg.pos_weight <= 0: + batch_label_weights = masked_fill(batch_label_weights, + batch_pos_mask, 1.0) + else: + batch_label_weights = masked_fill(batch_label_weights, + batch_pos_mask, + self.train_cfg.pos_weight) + batch_label_weights = masked_fill(batch_label_weights, batch_neg_mask, + 1.0) + return (batch_labels, batch_label_weights, batch_bbox_targets, + batch_bbox_weights, batch_pos_mask, batch_neg_mask, + sampling_result) + + def get_targets(self, + anchor_list, + valid_flag_list, + gt_bboxes_list, + img_metas, + gt_bboxes_ignore_list=None, + gt_labels_list=None, + label_channels=1, + unmap_outputs=True, + return_sampling_results=False, + return_level=True): + """Compute regression and classification targets for anchors in + multiple images. + + Args: + anchor_list (list[list[Tensor]]): Multi level anchors of each + image. The outer list indicates images, and the inner list + corresponds to feature levels of the image. Each element of + the inner list is a tensor of shape (num_anchors, 4). + valid_flag_list (list[list[Tensor]]): Multi level valid flags of + each image. The outer list indicates images, and the inner list + corresponds to feature levels of the image. Each element of + the inner list is a tensor of shape (num_anchors, ) + gt_bboxes_list (list[Tensor]): Ground truth bboxes of each image. + img_metas (list[dict]): Meta info of each image. + gt_bboxes_ignore_list (list[Tensor]): Ground truth bboxes to be + ignored. + gt_labels_list (list[Tensor]): Ground truth labels of each box. + label_channels (int): Channel of label. + unmap_outputs (bool): Whether to map outputs back to the original + set of anchors. + return_sampling_results (bool): Whether to return the result of + sample. + return_level (bool): Whether to map outputs back to the levels + of feature map sizes. + Returns: + tuple: Usually returns a tuple containing learning targets. + + - labels_list (list[Tensor]): Labels of each level. + - label_weights_list (list[Tensor]): Label weights of each + level. + - bbox_targets_list (list[Tensor]): BBox targets of each level. + - bbox_weights_list (list[Tensor]): BBox weights of each level. + - num_total_pos (int): Number of positive samples in all + images. + - num_total_neg (int): Number of negative samples in all + images. + + additional_returns: This function enables user-defined returns from + `self._get_targets_single`. These returns are currently refined + to properties at each feature map (i.e. having HxW dimension). + The results will be concatenated after the end + """ + assert gt_bboxes_ignore_list is None + assert unmap_outputs is True + assert return_sampling_results is False + assert self.train_cfg.allowed_border < 0 + assert isinstance(self.assigner, AscendMaxIoUAssigner) + assert isinstance(self.sampler, PseudoSampler) + num_imgs = len(img_metas) + assert len(anchor_list) == len(valid_flag_list) == num_imgs + + device = anchor_list[0][0].device + num_level_anchors = [anchors.size(0) for anchors in anchor_list[0]] + + batch_anchor_list = [] + batch_valid_flag_list = [] + for i in range(num_imgs): + assert len(anchor_list[i]) == len(valid_flag_list[i]) + batch_anchor_list.append(torch.cat(anchor_list[i])) + batch_valid_flag_list.append(torch.cat(valid_flag_list[i])) + batch_anchors = torch.cat( + [torch.unsqueeze(anchor, 0) for anchor in batch_anchor_list], 0) + batch_valid_flags = torch.cat([ + torch.unsqueeze(batch_valid_flag, 0) + for batch_valid_flag in batch_valid_flag_list + ], 0) + + gt_nums = [len(gt_bbox) for gt_bbox in gt_bboxes_list] + max_gt_nums = get_max_num_gt_division_factor(gt_nums) + batch_gt_bboxes = self.get_batch_gt_bboxes(gt_bboxes_list, num_imgs, + gt_nums, device, + max_gt_nums) + batch_gt_bboxes_ignore = self.get_batch_gt_bboxes_ignore( + gt_bboxes_ignore_list, num_imgs, gt_nums, device) + batch_gt_labels = self.get_batch_gt_labels(gt_labels_list, num_imgs, + gt_nums, device, + max_gt_nums) + + results = self._get_targets_concat( + batch_anchors, + batch_valid_flags, + batch_gt_bboxes, + batch_gt_bboxes_ignore, + batch_gt_labels, + img_metas, + label_channels=label_channels, + unmap_outputs=unmap_outputs) + + (batch_labels, batch_label_weights, batch_bbox_targets, + batch_bbox_weights, batch_pos_mask, batch_neg_mask, + sampling_result) = results[:7] + rest_results = list(results[7:]) # user-added return values + + # sampled anchors of all images + min_num = torch.ones((num_imgs, ), + dtype=torch.long, + device=batch_pos_mask.device) + num_total_pos = torch.sum( + torch.max(torch.sum(batch_pos_mask, dim=1), min_num)) + num_total_neg = torch.sum( + torch.max(torch.sum(batch_neg_mask, dim=1), min_num)) + if return_level is True: + labels_list = batch_images_to_levels(batch_labels, + num_level_anchors) + label_weights_list = batch_images_to_levels( + batch_label_weights, num_level_anchors) + bbox_targets_list = batch_images_to_levels(batch_bbox_targets, + num_level_anchors) + bbox_weights_list = batch_images_to_levels(batch_bbox_weights, + num_level_anchors) + res = (labels_list, label_weights_list, bbox_targets_list, + bbox_weights_list, num_total_pos, num_total_neg) + if return_sampling_results: + res = res + (sampling_result, ) + for i, r in enumerate(rest_results): # user-added return values + rest_results[i] = batch_images_to_levels(r, num_level_anchors) + + return res + tuple(rest_results) + else: + res = (batch_labels, batch_label_weights, batch_bbox_targets, + batch_bbox_weights, batch_pos_mask, batch_neg_mask, + sampling_result, num_total_pos, num_total_neg, + batch_anchors) + return res diff --git a/mmdet/models/dense_heads/ascend_retina_head.py b/mmdet/models/dense_heads/ascend_retina_head.py new file mode 100644 index 0000000..159fe75 --- /dev/null +++ b/mmdet/models/dense_heads/ascend_retina_head.py @@ -0,0 +1,115 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import HEADS +from .ascend_anchor_head import AscendAnchorHead +from .retina_head import RetinaHead + + +@HEADS.register_module() +class AscendRetinaHead(RetinaHead, AscendAnchorHead): + r"""An anchor-based head used in `RetinaNet + `_. + + The head contains two subnetworks. The first classifies anchor boxes and + the second regresses deltas for the anchors. + + Example: + >>> import torch + >>> self = RetinaHead(11, 7) + >>> x = torch.rand(1, 7, 32, 32) + >>> cls_score, bbox_pred = self.forward_single(x) + >>> # Each anchor predicts a score for each class except background + >>> cls_per_anchor = cls_score.shape[1] / self.num_anchors + >>> box_per_anchor = bbox_pred.shape[1] / self.num_anchors + >>> assert cls_per_anchor == (self.num_classes) + >>> assert box_per_anchor == 4 + """ + + def __init__(self, + num_classes, + in_channels, + stacked_convs=4, + conv_cfg=None, + norm_cfg=None, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + init_cfg=dict( + type='Normal', + layer='Conv2d', + std=0.01, + override=dict( + type='Normal', + name='retina_cls', + std=0.01, + bias_prob=0.01)), + **kwargs): + super(AscendRetinaHead, self).__init__( + num_classes=num_classes, + in_channels=in_channels, + stacked_convs=stacked_convs, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + anchor_generator=anchor_generator, + init_cfg=init_cfg, + **kwargs) + + def get_targets(self, + anchor_list, + valid_flag_list, + gt_bboxes_list, + img_metas, + gt_bboxes_ignore_list=None, + gt_labels_list=None, + label_channels=1, + unmap_outputs=True, + return_sampling_results=False, + return_level=True): + """Compute regression and classification targets for anchors in + multiple images. + + Args: + anchor_list (list[list[Tensor]]): Multi level anchors of each + image. The outer list indicates images, and the inner list + corresponds to feature levels of the image. Each element of + the inner list is a tensor of shape (num_anchors, 4). + valid_flag_list (list[list[Tensor]]): Multi level valid flags of + each image. The outer list indicates images, and the inner list + corresponds to feature levels of the image. Each element of + the inner list is a tensor of shape (num_anchors, ) + gt_bboxes_list (list[Tensor]): Ground truth bboxes of each image. + img_metas (list[dict]): Meta info of each image. + gt_bboxes_ignore_list (list[Tensor]): Ground truth bboxes to be + ignored. + gt_labels_list (list[Tensor]): Ground truth labels of each box. + label_channels (int): Channel of label. + unmap_outputs (bool): Whether to map outputs back to the original + set of anchors. + return_sampling_results (bool): Whether to return the result of + sample. + return_level (bool): Whether to map outputs back to the levels + of feature map sizes. + Returns: + tuple: Usually returns a tuple containing learning targets. + + - labels_list (list[Tensor]): Labels of each level. + - label_weights_list (list[Tensor]): Label weights of each + level. + - bbox_targets_list (list[Tensor]): BBox targets of each level. + - bbox_weights_list (list[Tensor]): BBox weights of each level. + - num_total_pos (int): Number of positive samples in all + images. + - num_total_neg (int): Number of negative samples in all + images. + + additional_returns: This function enables user-defined returns from + `self._get_targets_single`. These returns are currently refined + to properties at each feature map (i.e. having HxW dimension). + The results will be concatenated after the end + """ + return AscendAnchorHead.get_targets( + self, anchor_list, valid_flag_list, gt_bboxes_list, img_metas, + gt_bboxes_ignore_list, gt_labels_list, label_channels, + unmap_outputs, return_sampling_results, return_level) diff --git a/mmdet/models/dense_heads/ascend_ssd_head.py b/mmdet/models/dense_heads/ascend_ssd_head.py new file mode 100644 index 0000000..9e326b4 --- /dev/null +++ b/mmdet/models/dense_heads/ascend_ssd_head.py @@ -0,0 +1,328 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn.functional as F +from mmcv.runner import force_fp32 + +from ..builder import HEADS +from ..losses import smooth_l1_loss +from .ascend_anchor_head import AscendAnchorHead +from .ssd_head import SSDHead + + +@HEADS.register_module() +class AscendSSDHead(SSDHead, AscendAnchorHead): + """Ascend SSD head used in https://arxiv.org/abs/1512.02325. + + Args: + num_classes (int): Number of categories excluding the background + category. + in_channels (int): Number of channels in the input feature map. + stacked_convs (int): Number of conv layers in cls and reg tower. + Default: 0. + feat_channels (int): Number of hidden channels when stacked_convs + > 0. Default: 256. + use_depthwise (bool): Whether to use DepthwiseSeparableConv. + Default: False. + conv_cfg (dict): Dictionary to construct and config conv layer. + Default: None. + norm_cfg (dict): Dictionary to construct and config norm layer. + Default: None. + act_cfg (dict): Dictionary to construct and config activation layer. + Default: None. + anchor_generator (dict): Config dict for anchor generator + bbox_coder (dict): Config of bounding box coder. + reg_decoded_bbox (bool): If true, the regression loss would be + applied directly on decoded bounding boxes, converting both + the predicted boxes and regression targets to absolute + coordinates format. Default False. It should be `True` when + using `IoULoss`, `GIoULoss`, or `DIoULoss` in the bbox head. + train_cfg (dict): Training config of anchor head. + test_cfg (dict): Testing config of anchor head. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ # noqa: W605 + + def __init__(self, + num_classes=80, + in_channels=(512, 1024, 512, 256, 256, 256), + stacked_convs=0, + feat_channels=256, + use_depthwise=False, + conv_cfg=None, + norm_cfg=None, + act_cfg=None, + anchor_generator=dict( + type='SSDAnchorGenerator', + scale_major=False, + input_size=300, + strides=[8, 16, 32, 64, 100, 300], + ratios=([2], [2, 3], [2, 3], [2, 3], [2], [2]), + basesize_ratio_range=(0.1, 0.9)), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + clip_border=True, + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0], + ), + reg_decoded_bbox=False, + train_cfg=None, + test_cfg=None, + init_cfg=dict( + type='Xavier', + layer='Conv2d', + distribution='uniform', + bias=0)): + super(AscendSSDHead, self).__init__( + num_classes=num_classes, + in_channels=in_channels, + stacked_convs=stacked_convs, + feat_channels=feat_channels, + use_depthwise=use_depthwise, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + anchor_generator=anchor_generator, + bbox_coder=bbox_coder, + reg_decoded_bbox=reg_decoded_bbox, + train_cfg=train_cfg, + test_cfg=test_cfg, + init_cfg=init_cfg) + assert self.reg_decoded_bbox is False, \ + 'reg_decoded_bbox only support False now.' + + def get_static_anchors(self, featmap_sizes, img_metas, device='cuda'): + """Get static anchors according to feature map sizes. + + Args: + featmap_sizes (list[tuple]): Multi-level feature map sizes. + img_metas (list[dict]): Image meta info. + device (torch.device | str): Device for returned tensors + + Returns: + tuple: + anchor_list (list[Tensor]): Anchors of each image. + valid_flag_list (list[Tensor]): Valid flags of each image. + """ + if not hasattr(self, 'static_anchors') or \ + not hasattr(self, 'static_valid_flags'): + static_anchors, static_valid_flags = self.get_anchors( + featmap_sizes, img_metas, device) + self.static_anchors = static_anchors + self.static_valid_flags = static_valid_flags + return self.static_anchors, self.static_valid_flags + + def get_targets(self, + anchor_list, + valid_flag_list, + gt_bboxes_list, + img_metas, + gt_bboxes_ignore_list=None, + gt_labels_list=None, + label_channels=1, + unmap_outputs=True, + return_sampling_results=False, + return_level=True): + """Compute regression and classification targets for anchors in + multiple images. + + Args: + anchor_list (list[list[Tensor]]): Multi level anchors of each + image. The outer list indicates images, and the inner list + corresponds to feature levels of the image. Each element of + the inner list is a tensor of shape (num_anchors, 4). + valid_flag_list (list[list[Tensor]]): Multi level valid flags of + each image. The outer list indicates images, and the inner list + corresponds to feature levels of the image. Each element of + the inner list is a tensor of shape (num_anchors, ) + gt_bboxes_list (list[Tensor]): Ground truth bboxes of each image. + img_metas (list[dict]): Meta info of each image. + gt_bboxes_ignore_list (list[Tensor]): Ground truth bboxes to be + ignored. + gt_labels_list (list[Tensor]): Ground truth labels of each box. + label_channels (int): Channel of label. + unmap_outputs (bool): Whether to map outputs back to the original + set of anchors. + return_sampling_results (bool): Whether to return the result of + sample. + return_level (bool): Whether to map outputs back to the levels + of feature map sizes. + Returns: + tuple: Usually returns a tuple containing learning targets. + + - labels_list (list[Tensor]): Labels of each level. + - label_weights_list (list[Tensor]): Label weights of each + level. + - bbox_targets_list (list[Tensor]): BBox targets of each level. + - bbox_weights_list (list[Tensor]): BBox weights of each level. + - num_total_pos (int): Number of positive samples in all + images. + - num_total_neg (int): Number of negative samples in all + images. + + additional_returns: This function enables user-defined returns from + `self._get_targets_single`. These returns are currently refined + to properties at each feature map (i.e. having HxW dimension). + The results will be concatenated after the end + """ + return AscendAnchorHead.get_targets( + self, + anchor_list, + valid_flag_list, + gt_bboxes_list, + img_metas, + gt_bboxes_ignore_list, + gt_labels_list, + label_channels, + unmap_outputs, + return_sampling_results, + return_level, + ) + + def batch_loss(self, batch_cls_score, batch_bbox_pred, batch_anchor, + batch_labels, batch_label_weights, batch_bbox_targets, + batch_bbox_weights, batch_pos_mask, batch_neg_mask, + num_total_samples): + """Compute loss of all images. + + Args: + batch_cls_score (Tensor): Box scores for all image + Has shape (num_imgs, num_total_anchors, num_classes). + batch_bbox_pred (Tensor): Box energies / deltas for all image + level with shape (num_imgs, num_total_anchors, 4). + batch_anchor (Tensor): Box reference for all image with shape + (num_imgs, num_total_anchors, 4). + batch_labels (Tensor): Labels of all anchors with shape + (num_imgs, num_total_anchors,). + batch_label_weights (Tensor): Label weights of all anchor with + shape (num_imgs, num_total_anchors,) + batch_bbox_targets (Tensor): BBox regression targets of all anchor + weight shape (num_imgs, num_total_anchors, 4). + batch_bbox_weights (Tensor): BBox regression loss weights of + all anchor with shape (num_imgs, num_total_anchors, 4). + batch_pos_mask (Tensor): Positive samples mask in all images. + batch_neg_mask (Tensor): negative samples mask in all images. + num_total_samples (int): If sampling, num total samples equal to + the number of total anchors; Otherwise, it is the number of + positive anchors. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + num_images, num_anchors, _ = batch_anchor.size() + + batch_loss_cls_all = F.cross_entropy( + batch_cls_score.view((-1, self.cls_out_channels)), + batch_labels.view(-1), + reduction='none').view( + batch_label_weights.size()) * batch_label_weights + # # FG cat_id: [0, num_classes -1], BG cat_id: num_classes + batch_num_pos_samples = torch.sum(batch_pos_mask, dim=1) + batch_num_neg_samples = \ + self.train_cfg.neg_pos_ratio * batch_num_pos_samples + + batch_num_neg_samples_max = torch.sum(batch_neg_mask, dim=1) + batch_num_neg_samples = torch.min(batch_num_neg_samples, + batch_num_neg_samples_max) + + batch_topk_loss_cls_neg, _ = torch.topk( + batch_loss_cls_all * batch_neg_mask, k=num_anchors, dim=1) + batch_loss_cls_pos = torch.sum( + batch_loss_cls_all * batch_pos_mask, dim=1) + + anchor_index = torch.arange( + end=num_anchors, dtype=torch.float, + device=batch_anchor.device).view((1, -1)) + topk_loss_neg_mask = (anchor_index < batch_num_neg_samples.view( + -1, 1)).float() + + batch_loss_cls_neg = torch.sum( + batch_topk_loss_cls_neg * topk_loss_neg_mask, dim=1) + loss_cls = \ + (batch_loss_cls_pos + batch_loss_cls_neg) / num_total_samples + + if self.reg_decoded_bbox: + # TODO: support self.reg_decoded_bbox is True + raise RuntimeError + + loss_bbox_all = smooth_l1_loss( + batch_bbox_pred, + batch_bbox_targets, + batch_bbox_weights, + reduction='none', + beta=self.train_cfg.smoothl1_beta, + avg_factor=num_total_samples) + eps = torch.finfo(torch.float32).eps + + sum_dim = (i for i in range(1, len(loss_bbox_all.size()))) + loss_bbox = loss_bbox_all.sum(tuple(sum_dim)) / ( + num_total_samples + eps) + return loss_cls[None], loss_bbox + + @force_fp32(apply_to=('cls_scores', 'bbox_preds')) + def loss(self, + cls_scores, + bbox_preds, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Compute losses of the head. + + Args: + cls_scores (list[Tensor]): Box scores for each scale level + Has shape (N, num_anchors * num_classes, H, W) + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level with shape (N, num_anchors * 4, H, W) + gt_bboxes (list[Tensor]): each item are the truth boxes for each + image in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (None | list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + assert len(featmap_sizes) == self.prior_generator.num_levels + + device = cls_scores[0].device + + anchor_list, valid_flag_list = self.get_anchors( + featmap_sizes, img_metas, device=device) + cls_reg_targets = self.get_targets( + anchor_list, + valid_flag_list, + gt_bboxes, + img_metas, + gt_bboxes_ignore_list=gt_bboxes_ignore, + gt_labels_list=gt_labels, + label_channels=1, + unmap_outputs=True, + return_level=False) + if cls_reg_targets is None: + return None + + (batch_labels, batch_label_weights, batch_bbox_targets, + batch_bbox_weights, batch_pos_mask, batch_neg_mask, sampling_result, + num_total_pos, num_total_neg, batch_anchors) = cls_reg_targets + + num_imgs = len(img_metas) + batch_cls_score = torch.cat([ + s.permute(0, 2, 3, 1).reshape(num_imgs, -1, self.cls_out_channels) + for s in cls_scores + ], 1) + + batch_bbox_pred = torch.cat([ + b.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4) for b in bbox_preds + ], -2) + + batch_losses_cls, batch_losses_bbox = self.batch_loss( + batch_cls_score, batch_bbox_pred, batch_anchors, batch_labels, + batch_label_weights, batch_bbox_targets, batch_bbox_weights, + batch_pos_mask, batch_neg_mask, num_total_pos) + losses_cls = [ + batch_losses_cls[:, index_imgs] for index_imgs in range(num_imgs) + ] + losses_bbox = [losses_bbox for losses_bbox in batch_losses_bbox] + return dict(loss_cls=losses_cls, loss_bbox=losses_bbox) diff --git a/mmdet/models/dense_heads/atss_head.py b/mmdet/models/dense_heads/atss_head.py new file mode 100644 index 0000000..c2edd57 --- /dev/null +++ b/mmdet/models/dense_heads/atss_head.py @@ -0,0 +1,765 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule, Scale +from mmcv.runner import force_fp32 + +from mmdet.core import (anchor_inside_flags, build_assigner, build_sampler, + images_to_levels, multi_apply, reduce_mean, unmap) +from ..builder import HEADS, build_loss +from .anchor_head import AnchorHead +from mmdet.core.bbox.iou_calculators import bbox_overlaps +from my_equation import * +import global_placeholder + +@HEADS.register_module() +class ATSSHead(AnchorHead): + """Bridging the Gap Between Anchor-based and Anchor-free Detection via + Adaptive Training Sample Selection. + + ATSS head structure is similar with FCOS, however ATSS use anchor boxes + and assign label by Adaptive Training Sample Selection instead max-iou. + + https://arxiv.org/abs/1912.02424 + """ + + def __init__(self, + num_classes, + in_channels, + pred_kernel_size=3, + stacked_convs=4, + conv_cfg=None, + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True), + reg_decoded_bbox=True, + loss_centerness=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=1.0), + init_cfg=dict( + type='Normal', + layer='Conv2d', + std=0.01, + override=dict( + type='Normal', + name='atss_cls', + std=0.01, + bias_prob=0.01)), + **kwargs): + self.pred_kernel_size = pred_kernel_size + self.stacked_convs = stacked_convs + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + super(ATSSHead, self).__init__( + num_classes, + in_channels, + reg_decoded_bbox=reg_decoded_bbox, + init_cfg=init_cfg, + **kwargs) + + self.sampling = False + if self.train_cfg: + self.assigner = build_assigner(self.train_cfg.assigner) + # SSD sampling=False so use PseudoSampler + sampler_cfg = dict(type='PseudoSampler') + self.sampler = build_sampler(sampler_cfg, context=self) + self.loss_centerness = build_loss(loss_centerness) + + def _init_layers(self): + """Initialize layers of the head.""" + self.relu = nn.ReLU(inplace=True) + self.cls_convs = nn.ModuleList() + self.reg_convs = nn.ModuleList() + for i in range(self.stacked_convs): + chn = self.in_channels if i == 0 else self.feat_channels + self.cls_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg)) + self.reg_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg)) + pred_pad_size = self.pred_kernel_size // 2 + self.atss_cls = nn.Conv2d( + self.feat_channels, + self.num_anchors * self.cls_out_channels, + self.pred_kernel_size, + padding=pred_pad_size) + self.atss_reg = nn.Conv2d( + self.feat_channels, + self.num_base_priors * 4, + self.pred_kernel_size, + padding=pred_pad_size) + self.atss_centerness = nn.Conv2d( + self.feat_channels, + self.num_base_priors * 1, + self.pred_kernel_size, + padding=pred_pad_size) + self.scales = nn.ModuleList( + [Scale(1.0) for _ in self.prior_generator.strides]) + + # def forward(self, feats): + # """Forward features from the upstream network. + + # Args: + # feats (tuple[Tensor]): Features from the upstream network, each is + # a 4D-tensor. + + # Returns: + # tuple: Usually a tuple of classification scores and bbox prediction + # cls_scores (list[Tensor]): Classification scores for all scale + # levels, each is a 4D-tensor, the channels number is + # num_anchors * num_classes. + # bbox_preds (list[Tensor]): Box energies / deltas for all scale + # levels, each is a 4D-tensor, the channels number is + # num_anchors * 4. + # """ + # return multi_apply(self.forward_single, feats, self.scales) + + def forward(self, feats): + """Forward features from the upstream network. + + Args: + feats (tuple[Tensor]): Features from the upstream network, each is + a 4D-tensor. + + Returns: + tuple: Usually a tuple of classification scores and bbox prediction + cls_scores (list[Tensor]): Classification scores for all scale + levels, each is a 4D-tensor, the channels number is + num_anchors * num_classes. + bbox_preds (list[Tensor]): Box energies / deltas for all scale + levels, each is a 4D-tensor, the channels number is + num_anchors * 4. + """ + cls_scores = [] + bbox_preds = [] + centernesses = [] + if hasattr(self,'in_num') and self.in_num == 5: + feats = [feats[0], feats[1], feats[2], feats[3], feats[4]] + elif hasattr(self,'in_num'): + raise NotImplementedError + else: + self.in_num = 5 + feats = [feats[0], feats[1], feats[2], feats[3], feats[4]] + + for x, scale in zip(feats, self.scales): + cls_feat = x + reg_feat = x + for cls_conv in self.cls_convs: + cls_feat = cls_conv(cls_feat) + for reg_conv in self.reg_convs: + reg_feat = reg_conv(reg_feat) + cls_score = self.atss_cls(cls_feat) + # we just follow atss, not apply exp in bbox_pred + bbox_pred = scale(self.atss_reg(reg_feat)).float() + centerness = self.atss_centerness(reg_feat) + cls_scores.append(cls_score) + bbox_preds.append(bbox_pred) + centernesses.append(centerness) + + return cls_scores, bbox_preds, centernesses + + + def forward_single(self, x, scale): + """Forward feature of a single scale level. + + Args: + x (Tensor): Features of a single scale level. + scale (:obj: `mmcv.cnn.Scale`): Learnable scale module to resize + the bbox prediction. + + Returns: + tuple: + cls_score (Tensor): Cls scores for a single scale level + the channels number is num_anchors * num_classes. + bbox_pred (Tensor): Box energies / deltas for a single scale + level, the channels number is num_anchors * 4. + centerness (Tensor): Centerness for a single scale level, the + channel number is (N, num_anchors * 1, H, W). + """ + cls_feat = x + reg_feat = x + for cls_conv in self.cls_convs: + cls_feat = cls_conv(cls_feat) + for reg_conv in self.reg_convs: + reg_feat = reg_conv(reg_feat) + cls_score = self.atss_cls(cls_feat) + # we just follow atss, not apply exp in bbox_pred + bbox_pred = scale(self.atss_reg(reg_feat)).float() + centerness = self.atss_centerness(reg_feat) + return cls_score, bbox_pred, centerness + + def loss_single(self, anchors, cls_score, bbox_pred, centerness, labels, + label_weights, bbox_targets, cls_branch_factor, reg_branch_factor, centerness_branch_factor, num_total_samples): + """Compute loss of a single scale level. + + Args: + cls_score (Tensor): Box scores for each scale level + Has shape (N, num_anchors * num_classes, H, W). + bbox_pred (Tensor): Box energies / deltas for each scale + level with shape (N, num_anchors * 4, H, W). + anchors (Tensor): Box reference for each scale level with shape + (N, num_total_anchors, 4). + labels (Tensor): Labels of each anchors with shape + (N, num_total_anchors). + label_weights (Tensor): Label weights of each anchor with shape + (N, num_total_anchors) + bbox_targets (Tensor): BBox regression targets of each anchor + weight shape (N, num_total_anchors, 4). + num_total_samples (int): Number os positive samples that is + reduced over all GPUs. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + + anchors = anchors.reshape(-1, 4) + cls_score = cls_score.permute(0, 2, 3, 1).reshape( + -1, self.cls_out_channels).contiguous() + bbox_pred = bbox_pred.permute(0, 2, 3, 1).reshape(-1, 4) + centerness = centerness.permute(0, 2, 3, 1).reshape(-1) + bbox_targets = bbox_targets.reshape(-1, 4) + labels = labels.reshape(-1) + label_weights = label_weights.reshape(-1) + + # classification loss + loss_cls = self.loss_cls( + cls_score, labels, label_weights, reduction_override='none') + loss_cls = loss_cls.sum(dim=1) + + # FG cat_id: [0, num_classes -1], BG cat_id: num_classes + bg_class_ind = self.num_classes + pos_inds = ((labels >= 0) + & (labels < bg_class_ind)).nonzero().squeeze(1) + + if len(pos_inds) > 0: + pos_bbox_targets = bbox_targets[pos_inds] + pos_bbox_pred = bbox_pred[pos_inds] + pos_anchors = anchors[pos_inds] + pos_centerness = centerness[pos_inds] + + centerness_targets = self.centerness_target( + pos_anchors, pos_bbox_targets) + pos_decode_bbox_pred = self.bbox_coder.decode( + pos_anchors, pos_bbox_pred) + + # regression loss + loss_bbox = self.loss_bbox( + pos_decode_bbox_pred, + pos_bbox_targets, + weight=centerness_targets, + reduction_override='none') + # loss_bbox = loss_bbox.sum(dim=1) + + + # centerness loss + loss_centerness = self.loss_centerness( + pos_centerness, + centerness_targets, + reduction_override='none') + # loss_centerness = loss_centerness.sum(dim=1) + + else: + loss_bbox = bbox_pred.sum() * 0 + loss_centerness = centerness.sum() * 0 + centerness_targets = bbox_targets.new_tensor(0.) + + if global_placeholder.mybuff_flag and pos_inds.numel(): + # 只在pos_indx有的情况下执行 + + conf_values = torch.sigmoid(cls_score) # TODO 注意,这里是因为Retina要sigmoid! + + num_classes = conf_values.shape[-1] + if num_classes == 81 or num_classes == 21: + # 说明默认backbgound为81类 21类 + pos_gtconf_idx = F.one_hot(labels, num_classes=num_classes) + else: + # 说明没有显式给出类 + + num_classes = num_classes + 1 + pos_gtconf_idx = F.one_hot(labels, num_classes=num_classes) + pos_gtconf_idx = pos_gtconf_idx[:, :-1]# 剔除最后一个背景类 + + pos_gtconf_values, _ = (conf_values * pos_gtconf_idx).max(dim=1) # TODO 想到一件事,是不是不能用GT来筛选正样本的结果?因为其实正样本也有错误的东西,所以就是得错 + pos_gtconf_values = pos_gtconf_values[pos_inds] + + pos_conf_values, pos_conf_values_idx = conf_values.max(dim=1) # TODO 好像真的是这个问题,正样本本来就是得对应到max的那个,不能经过GT筛选 + pos_conf_values = pos_conf_values[pos_inds] + + try: + pos_ious = bbox_overlaps(pos_decode_bbox_pred, pos_bbox_targets, is_aligned=True) # 这玩意得是ltrb坐标,好像就已经是了??? + except IndexError as e: + print(f"inds.numel(): {pos_inds.numel()} \ninds.max(): {pos_inds.max()} \ninds.shape: {pos_inds.shape}") + print(e) + exit() + if global_placeholder.mybuff_flag == 1: + # loss_bbox, loss_cls = loss_bbox * (1 + reg_branch_factor), loss_cls * (1 + cls_branch_factor) # 确实这玩意应该是全局??? + # loss_bbox, loss_cls = loss_bbox * (1 + cls_branch_factor), loss_cls * (1 + reg_branch_factor) # 确实这玩意应该是全局??? + # conf_values = F.softmax(cls_score, dim=1) + + # cls_trade_off = (cls_branch_factor / (cls_branch_factor + reg_branch_factor + centerness_branch_factor)).detach() * 3 + # reg_trade_off = (reg_branch_factor / (cls_branch_factor + reg_branch_factor + centerness_branch_factor)).detach() * 3 + # centerness_trade_off = (centerness_branch_factor / (cls_branch_factor + reg_branch_factor + centerness_branch_factor)).detach() * 3 + + # # loss_cls = cls_trade_off * loss_cls + # # loss_bbox = reg_trade_off * loss_bbox + # loss_cls = cls_trade_off * loss_cls + # loss_bbox = reg_trade_off * loss_bbox + # loss_centerness = centerness_trade_off * loss_centerness + + loss_bbox, loss_cls[pos_inds] = HQOD_loss(loss_bbox, loss_cls[pos_inds], conf_values[pos_inds], pos_gtconf_values, pos_conf_values, pos_ious, cls_branch_factor, reg_branch_factor, torch.tensor(1.)) + elif global_placeholder.mybuff_flag == 2: + loss_bbox, loss_cls[pos_inds] = HarDet_loss(loss_bbox, loss_cls[pos_inds], conf_values[pos_inds], pos_gtconf_values, pos_conf_values, pos_ious, torch.tensor(1.)) + + + + + loss_cls = loss_cls.sum() / num_total_samples + loss_bbox = loss_bbox.sum() / 1.0 + loss_centerness = loss_centerness.sum() / num_total_samples + + + + return loss_cls, loss_bbox, loss_centerness, centerness_targets.sum() + + # def loss_single(self, anchors, cls_score, bbox_pred, centerness, labels, + # label_weights, bbox_targets, level_cls_factor, level_reg_factor, level_centerness_factor, num_total_samples): + # """Compute loss of a single scale level. + + # Args: + # cls_score (Tensor): Box scores for each scale level + # Has shape (N, num_anchors * num_classes, H, W). + # bbox_pred (Tensor): Box energies / deltas for each scale + # level with shape (N, num_anchors * 4, H, W). + # anchors (Tensor): Box reference for each scale level with shape + # (N, num_total_anchors, 4). + # labels (Tensor): Labels of each anchors with shape + # (N, num_total_anchors). + # label_weights (Tensor): Label weights of each anchor with shape + # (N, num_total_anchors) + # bbox_targets (Tensor): BBox regression targets of each anchor + # weight shape (N, num_total_anchors, 4). + # num_total_samples (int): Number os positive samples that is + # reduced over all GPUs. + + # Returns: + # dict[str, Tensor]: A dictionary of loss components. + # """ + + # anchors = anchors.reshape(-1, 4) + # cls_score = cls_score.permute(0, 2, 3, 1).reshape( + # -1, self.cls_out_channels).contiguous() + # bbox_pred = bbox_pred.permute(0, 2, 3, 1).reshape(-1, 4) + # centerness = centerness.permute(0, 2, 3, 1).reshape(-1) + # bbox_targets = bbox_targets.reshape(-1, 4) + # labels = labels.reshape(-1) + # label_weights = label_weights.reshape(-1) + + # # classification loss + # loss_cls = self.loss_cls( + # cls_score, labels, label_weights, avg_factor=num_total_samples) + + # # FG cat_id: [0, num_classes -1], BG cat_id: num_classes + # bg_class_ind = self.num_classes + # pos_inds = ((labels >= 0) + # & (labels < bg_class_ind)).nonzero().squeeze(1) + + # if len(pos_inds) > 0: + # pos_bbox_targets = bbox_targets[pos_inds] + # pos_bbox_pred = bbox_pred[pos_inds] + # pos_anchors = anchors[pos_inds] + # pos_centerness = centerness[pos_inds] + + # centerness_targets = self.centerness_target( + # pos_anchors, pos_bbox_targets) + # pos_decode_bbox_pred = self.bbox_coder.decode( + # pos_anchors, pos_bbox_pred) + + # # regression loss + # loss_bbox = self.loss_bbox( + # pos_decode_bbox_pred, + # pos_bbox_targets, + # weight=centerness_targets, + # avg_factor=1.0) + + # # centerness loss + # loss_centerness = self.loss_centerness( + # pos_centerness, + # centerness_targets, + # avg_factor=num_total_samples) + + # else: + # loss_bbox = bbox_pred.sum() * 0 + # loss_centerness = centerness.sum() * 0 + # centerness_targets = bbox_targets.new_tensor(0.) + + # return loss_cls, loss_bbox, loss_centerness, centerness_targets.sum() + + @force_fp32(apply_to=('cls_scores', 'bbox_preds', 'centernesses')) + def loss(self, + cls_scores, + bbox_preds, + centernesses, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Compute losses of the head. + + Args: + cls_scores (list[Tensor]): Box scores for each scale level + Has shape (N, num_anchors * num_classes, H, W) + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level with shape (N, num_anchors * 4, H, W) + centernesses (list[Tensor]): Centerness for each scale + level with shape (N, num_anchors * 1, H, W) + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (list[Tensor] | None): specify which bounding + boxes can be ignored when computing the loss. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + assert len(featmap_sizes) == self.prior_generator.num_levels + + device = cls_scores[0].device + anchor_list, valid_flag_list = self.get_anchors( + featmap_sizes, img_metas, device=device) + label_channels = self.cls_out_channels if self.use_sigmoid_cls else 1 + + cls_reg_targets = self.get_targets( + anchor_list, + valid_flag_list, + gt_bboxes, + img_metas, + gt_bboxes_ignore_list=gt_bboxes_ignore, + gt_labels_list=gt_labels, + label_channels=label_channels) + if cls_reg_targets is None: + return None + + (anchor_list, labels_list, label_weights_list, bbox_targets_list, + bbox_weights_list, num_total_pos, num_total_neg) = cls_reg_targets + + num_total_samples = reduce_mean( + torch.tensor(num_total_pos, dtype=torch.float, + device=device)).item() + num_total_samples = max(num_total_samples, 1.0) + + + level_slicer = [len(labels_list), 5, 4] # [0]为level数;[1]为weight的个数;[2]为单level下的act个数 + level_cls_factors = [] + level_reg_factors = [] + level_centerness_factors = [] + + qloss_flag = global_placeholder.qloss_flag + + if False: + q_loss_total = [] + cls_branch = [] + reg_branch = [] + centerness_branch = [] + for name, module in self.named_modules(): + if hasattr(module, 'compute_qloss') and module.compute_qloss: + # 挑出来量化器 + + if 'cls' in name: + # 说明是cls分支的量化器 + # cls_branch.append(module.quantization_loss) + if 'post_act' in name: + # 说明是act量化器 + cls_branch.append([name, module.scale * 1.]) + else: + cls_branch.append([name, module.scale * 2.]) + + elif 'reg' in name: + # 说明是reg分支的量化器 + # reg_branch.append(module.quantization_loss) + if 'post_act' in name: + # 说明是act量化器 + reg_branch.append([name, module.scale * 1.]) + else: + reg_branch.append([name, module.scale * 2.]) + + elif 'centerness' in name: + # 说明是reg分支的量化器 + # reg_branch.append(module.quantization_loss) + if 'post_act' in name: + # 说明是act量化器 + centerness_branch.append([name, module.scale * 1.]) + else: + centerness_branch.append([name, module.scale * 2.]) + + q_loss_total.append([name, module.scale * 1]) + + # NOTE 不需要加item_post_act_quant的 + # 由于centerness branch 的特殊性,所以得加上reg_branch分支的共用东西 + centerness_branch = centerness_branch + reg_branch[1:] + + if level_slicer[0] != 5: + raise NotImplementedError + + for it in range(level_slicer[0]): + cls_summation = 0 + reg_summation = 0 + centerness_summation = 0 + # tmp_cls_infos = cls_branch[0:level_slicer[1]] + cls_branch[level_slicer[1]+level_slicer[2]*it:level_slicer[1]+level_slicer[2]*(it+1)] + tmp_cls_infos = cls_branch[0:level_slicer[1]] + for info in tmp_cls_infos: + cls_summation += info[1] + + tmp_reg_infos = reg_branch[0:level_slicer[1]] + for info in tmp_reg_infos: + reg_summation += info[1] + + tmp_centerness_infos = centerness_branch[0:level_slicer[1]] + for info in tmp_centerness_infos: + centerness_summation += info[1] + + level_cls_factors.append(cls_summation) + level_reg_factors.append(reg_summation) + level_centerness_factors.append(centerness_summation) + + if len(level_cls_factors) + len(level_reg_factors) == 0: + # 必须让list内有level个空list + level_cls_factors = [torch.tensor(1)] * len(labels_list) + level_reg_factors = [torch.tensor(1)] * len(labels_list) + level_centerness_factors = [torch.tensor(1)] * len(labels_list) + + + losses_cls, losses_bbox, loss_centerness,\ + bbox_avg_factor = multi_apply( + self.loss_single, + anchor_list, + cls_scores, + bbox_preds, + centernesses, + labels_list, + label_weights_list, + bbox_targets_list, + level_cls_factors, + level_reg_factors, + level_centerness_factors, + num_total_samples=num_total_samples) + + bbox_avg_factor = sum(bbox_avg_factor) + bbox_avg_factor = reduce_mean(bbox_avg_factor).clamp_(min=1).item() + losses_bbox = list(map(lambda x: x / bbox_avg_factor, losses_bbox)) + return dict( + loss_cls=losses_cls, + loss_bbox=losses_bbox, + loss_centerness=loss_centerness) + + def centerness_target(self, anchors, gts): + # only calculate pos centerness targets, otherwise there may be nan + anchors_cx = (anchors[:, 2] + anchors[:, 0]) / 2 + anchors_cy = (anchors[:, 3] + anchors[:, 1]) / 2 + l_ = anchors_cx - gts[:, 0] + t_ = anchors_cy - gts[:, 1] + r_ = gts[:, 2] - anchors_cx + b_ = gts[:, 3] - anchors_cy + + left_right = torch.stack([l_, r_], dim=1) + top_bottom = torch.stack([t_, b_], dim=1) + centerness = torch.sqrt( + (left_right.min(dim=-1)[0] / left_right.max(dim=-1)[0]) * + (top_bottom.min(dim=-1)[0] / top_bottom.max(dim=-1)[0])) + assert not torch.isnan(centerness).any() + return centerness + + def get_targets(self, + anchor_list, + valid_flag_list, + gt_bboxes_list, + img_metas, + gt_bboxes_ignore_list=None, + gt_labels_list=None, + label_channels=1, + unmap_outputs=True): + """Get targets for ATSS head. + + This method is almost the same as `AnchorHead.get_targets()`. Besides + returning the targets as the parent method does, it also returns the + anchors as the first element of the returned tuple. + """ + num_imgs = len(img_metas) + assert len(anchor_list) == len(valid_flag_list) == num_imgs + + # anchor number of multi levels + num_level_anchors = [anchors.size(0) for anchors in anchor_list[0]] + num_level_anchors_list = [num_level_anchors] * num_imgs + + # concat all level anchors and flags to a single tensor + for i in range(num_imgs): + assert len(anchor_list[i]) == len(valid_flag_list[i]) + anchor_list[i] = torch.cat(anchor_list[i]) + valid_flag_list[i] = torch.cat(valid_flag_list[i]) + + # compute targets for each image + if gt_bboxes_ignore_list is None: + gt_bboxes_ignore_list = [None for _ in range(num_imgs)] + if gt_labels_list is None: + gt_labels_list = [None for _ in range(num_imgs)] + (all_anchors, all_labels, all_label_weights, all_bbox_targets, + all_bbox_weights, pos_inds_list, neg_inds_list) = multi_apply( + self._get_target_single, + anchor_list, + valid_flag_list, + num_level_anchors_list, + gt_bboxes_list, + gt_bboxes_ignore_list, + gt_labels_list, + img_metas, + label_channels=label_channels, + unmap_outputs=unmap_outputs) + # no valid anchors + if any([labels is None for labels in all_labels]): + return None + # sampled anchors of all images + num_total_pos = sum([max(inds.numel(), 1) for inds in pos_inds_list]) + num_total_neg = sum([max(inds.numel(), 1) for inds in neg_inds_list]) + # split targets to a list w.r.t. multiple levels + anchors_list = images_to_levels(all_anchors, num_level_anchors) + labels_list = images_to_levels(all_labels, num_level_anchors) + label_weights_list = images_to_levels(all_label_weights, + num_level_anchors) + bbox_targets_list = images_to_levels(all_bbox_targets, + num_level_anchors) + bbox_weights_list = images_to_levels(all_bbox_weights, + num_level_anchors) + return (anchors_list, labels_list, label_weights_list, + bbox_targets_list, bbox_weights_list, num_total_pos, + num_total_neg) + + def _get_target_single(self, + flat_anchors, + valid_flags, + num_level_anchors, + gt_bboxes, + gt_bboxes_ignore, + gt_labels, + img_meta, + label_channels=1, + unmap_outputs=True): + """Compute regression, classification targets for anchors in a single + image. + + Args: + flat_anchors (Tensor): Multi-level anchors of the image, which are + concatenated into a single tensor of shape (num_anchors ,4) + valid_flags (Tensor): Multi level valid flags of the image, + which are concatenated into a single tensor of + shape (num_anchors,). + num_level_anchors Tensor): Number of anchors of each scale level. + gt_bboxes (Tensor): Ground truth bboxes of the image, + shape (num_gts, 4). + gt_bboxes_ignore (Tensor): Ground truth bboxes to be + ignored, shape (num_ignored_gts, 4). + gt_labels (Tensor): Ground truth labels of each box, + shape (num_gts,). + img_meta (dict): Meta info of the image. + label_channels (int): Channel of label. + unmap_outputs (bool): Whether to map outputs back to the original + set of anchors. + + Returns: + tuple: N is the number of total anchors in the image. + labels (Tensor): Labels of all anchors in the image with shape + (N,). + label_weights (Tensor): Label weights of all anchor in the + image with shape (N,). + bbox_targets (Tensor): BBox targets of all anchors in the + image with shape (N, 4). + bbox_weights (Tensor): BBox weights of all anchors in the + image with shape (N, 4) + pos_inds (Tensor): Indices of positive anchor with shape + (num_pos,). + neg_inds (Tensor): Indices of negative anchor with shape + (num_neg,). + """ + inside_flags = anchor_inside_flags(flat_anchors, valid_flags, + img_meta['img_shape'][:2], + self.train_cfg.allowed_border) + if not inside_flags.any(): + return (None, ) * 7 + # assign gt and sample anchors + anchors = flat_anchors[inside_flags, :] + + num_level_anchors_inside = self.get_num_level_anchors_inside( + num_level_anchors, inside_flags) + assign_result = self.assigner.assign(anchors, num_level_anchors_inside, + gt_bboxes, gt_bboxes_ignore, + gt_labels) + + sampling_result = self.sampler.sample(assign_result, anchors, + gt_bboxes) + + num_valid_anchors = anchors.shape[0] + bbox_targets = torch.zeros_like(anchors) + bbox_weights = torch.zeros_like(anchors) + labels = anchors.new_full((num_valid_anchors, ), + self.num_classes, + dtype=torch.long) + label_weights = anchors.new_zeros(num_valid_anchors, dtype=torch.float) + + pos_inds = sampling_result.pos_inds + neg_inds = sampling_result.neg_inds + if len(pos_inds) > 0: + if self.reg_decoded_bbox: + pos_bbox_targets = sampling_result.pos_gt_bboxes + else: + pos_bbox_targets = self.bbox_coder.encode( + sampling_result.pos_bboxes, sampling_result.pos_gt_bboxes) + + bbox_targets[pos_inds, :] = pos_bbox_targets + bbox_weights[pos_inds, :] = 1.0 + if gt_labels is None: + # Only rpn gives gt_labels as None + # Foreground is the first class since v2.5.0 + labels[pos_inds] = 0 + else: + labels[pos_inds] = gt_labels[ + sampling_result.pos_assigned_gt_inds] + if self.train_cfg.pos_weight <= 0: + label_weights[pos_inds] = 1.0 + else: + label_weights[pos_inds] = self.train_cfg.pos_weight + if len(neg_inds) > 0: + label_weights[neg_inds] = 1.0 + + # map up to original set of anchors + if unmap_outputs: + num_total_anchors = flat_anchors.size(0) + anchors = unmap(anchors, num_total_anchors, inside_flags) + labels = unmap( + labels, num_total_anchors, inside_flags, fill=self.num_classes) + label_weights = unmap(label_weights, num_total_anchors, + inside_flags) + bbox_targets = unmap(bbox_targets, num_total_anchors, inside_flags) + bbox_weights = unmap(bbox_weights, num_total_anchors, inside_flags) + + return (anchors, labels, label_weights, bbox_targets, bbox_weights, + pos_inds, neg_inds) + + def get_num_level_anchors_inside(self, num_level_anchors, inside_flags): + split_inside_flags = torch.split(inside_flags, num_level_anchors) + num_level_anchors_inside = [ + int(flags.sum()) for flags in split_inside_flags + ] + return num_level_anchors_inside diff --git a/mmdet/models/dense_heads/autoassign_head.py b/mmdet/models/dense_heads/autoassign_head.py new file mode 100644 index 0000000..446da24 --- /dev/null +++ b/mmdet/models/dense_heads/autoassign_head.py @@ -0,0 +1,527 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import bias_init_with_prob, normal_init +from mmcv.runner import force_fp32 + +from mmdet.core import multi_apply +from mmdet.core.anchor.point_generator import MlvlPointGenerator +from mmdet.core.bbox import bbox_overlaps +from mmdet.models import HEADS +from mmdet.models.dense_heads.atss_head import reduce_mean +from mmdet.models.dense_heads.fcos_head import FCOSHead +from mmdet.models.dense_heads.paa_head import levels_to_images + +EPS = 1e-12 + + +class CenterPrior(nn.Module): + """Center Weighting module to adjust the category-specific prior + distributions. + + Args: + force_topk (bool): When no point falls into gt_bbox, forcibly + select the k points closest to the center to calculate + the center prior. Defaults to False. + topk (int): The number of points used to calculate the + center prior when no point falls in gt_bbox. Only work when + force_topk if True. Defaults to 9. + num_classes (int): The class number of dataset. Defaults to 80. + strides (tuple[int]): The stride of each input feature map. Defaults + to (8, 16, 32, 64, 128). + """ + + def __init__(self, + force_topk=False, + topk=9, + num_classes=80, + strides=(8, 16, 32, 64, 128)): + super(CenterPrior, self).__init__() + self.mean = nn.Parameter(torch.zeros(num_classes, 2)) + self.sigma = nn.Parameter(torch.ones(num_classes, 2)) + self.strides = strides + self.force_topk = force_topk + self.topk = topk + + def forward(self, anchor_points_list, gt_bboxes, labels, + inside_gt_bbox_mask): + """Get the center prior of each point on the feature map for each + instance. + + Args: + anchor_points_list (list[Tensor]): list of coordinate + of points on feature map. Each with shape + (num_points, 2). + gt_bboxes (Tensor): The gt_bboxes with shape of + (num_gt, 4). + labels (Tensor): The gt_labels with shape of (num_gt). + inside_gt_bbox_mask (Tensor): Tensor of bool type, + with shape of (num_points, num_gt), each + value is used to mark whether this point falls + within a certain gt. + + Returns: + tuple(Tensor): + + - center_prior_weights(Tensor): Float tensor with shape \ + of (num_points, num_gt). Each value represents \ + the center weighting coefficient. + - inside_gt_bbox_mask (Tensor): Tensor of bool type, \ + with shape of (num_points, num_gt), each \ + value is used to mark whether this point falls \ + within a certain gt or is the topk nearest points for \ + a specific gt_bbox. + """ + inside_gt_bbox_mask = inside_gt_bbox_mask.clone() + num_gts = len(labels) + num_points = sum([len(item) for item in anchor_points_list]) + if num_gts == 0: + return gt_bboxes.new_zeros(num_points, + num_gts), inside_gt_bbox_mask + center_prior_list = [] + for slvl_points, stride in zip(anchor_points_list, self.strides): + # slvl_points: points from single level in FPN, has shape (h*w, 2) + # single_level_points has shape (h*w, num_gt, 2) + single_level_points = slvl_points[:, None, :].expand( + (slvl_points.size(0), len(gt_bboxes), 2)) + gt_center_x = ((gt_bboxes[:, 0] + gt_bboxes[:, 2]) / 2) + gt_center_y = ((gt_bboxes[:, 1] + gt_bboxes[:, 3]) / 2) + gt_center = torch.stack((gt_center_x, gt_center_y), dim=1) + gt_center = gt_center[None] + # instance_center has shape (1, num_gt, 2) + instance_center = self.mean[labels][None] + # instance_sigma has shape (1, num_gt, 2) + instance_sigma = self.sigma[labels][None] + # distance has shape (num_points, num_gt, 2) + distance = (((single_level_points - gt_center) / float(stride) - + instance_center)**2) + center_prior = torch.exp(-distance / + (2 * instance_sigma**2)).prod(dim=-1) + center_prior_list.append(center_prior) + center_prior_weights = torch.cat(center_prior_list, dim=0) + + if self.force_topk: + gt_inds_no_points_inside = torch.nonzero( + inside_gt_bbox_mask.sum(0) == 0).reshape(-1) + if gt_inds_no_points_inside.numel(): + topk_center_index = \ + center_prior_weights[:, gt_inds_no_points_inside].topk( + self.topk, + dim=0)[1] + temp_mask = inside_gt_bbox_mask[:, gt_inds_no_points_inside] + inside_gt_bbox_mask[:, gt_inds_no_points_inside] = \ + torch.scatter(temp_mask, + dim=0, + index=topk_center_index, + src=torch.ones_like( + topk_center_index, + dtype=torch.bool)) + + center_prior_weights[~inside_gt_bbox_mask] = 0 + return center_prior_weights, inside_gt_bbox_mask + + +@HEADS.register_module() +class AutoAssignHead(FCOSHead): + """AutoAssignHead head used in AutoAssign. + + More details can be found in the `paper + `_ . + + Args: + force_topk (bool): Used in center prior initialization to + handle extremely small gt. Default is False. + topk (int): The number of points used to calculate the + center prior when no point falls in gt_bbox. Only work when + force_topk if True. Defaults to 9. + pos_loss_weight (float): The loss weight of positive loss + and with default value 0.25. + neg_loss_weight (float): The loss weight of negative loss + and with default value 0.75. + center_loss_weight (float): The loss weight of center prior + loss and with default value 0.75. + """ + + def __init__(self, + *args, + force_topk=False, + topk=9, + pos_loss_weight=0.25, + neg_loss_weight=0.75, + center_loss_weight=0.75, + **kwargs): + super().__init__(*args, conv_bias=True, **kwargs) + self.center_prior = CenterPrior( + force_topk=force_topk, + topk=topk, + num_classes=self.num_classes, + strides=self.strides) + self.pos_loss_weight = pos_loss_weight + self.neg_loss_weight = neg_loss_weight + self.center_loss_weight = center_loss_weight + self.prior_generator = MlvlPointGenerator(self.strides, offset=0) + + def init_weights(self): + """Initialize weights of the head. + + In particular, we have special initialization for classified conv's and + regression conv's bias + """ + + super(AutoAssignHead, self).init_weights() + bias_cls = bias_init_with_prob(0.02) + normal_init(self.conv_cls, std=0.01, bias=bias_cls) + normal_init(self.conv_reg, std=0.01, bias=4.0) + + def forward_single(self, x, scale, stride): + """Forward features of a single scale level. + + Args: + x (Tensor): FPN feature maps of the specified stride. + scale (:obj: `mmcv.cnn.Scale`): Learnable scale module to resize + the bbox prediction. + stride (int): The corresponding stride for feature maps, only + used to normalize the bbox prediction when self.norm_on_bbox + is True. + + Returns: + tuple: scores for each class, bbox predictions and centerness \ + predictions of input feature maps. + """ + cls_score, bbox_pred, cls_feat, reg_feat = super( + FCOSHead, self).forward_single(x) + centerness = self.conv_centerness(reg_feat) + # scale the bbox_pred of different level + # float to avoid overflow when enabling FP16 + bbox_pred = scale(bbox_pred).float() + # bbox_pred needed for gradient computation has been modified + # by F.relu(bbox_pred) when run with PyTorch 1.10. So replace + # F.relu(bbox_pred) with bbox_pred.clamp(min=0) + bbox_pred = bbox_pred.clamp(min=0) + bbox_pred *= stride + return cls_score, bbox_pred, centerness + + def get_pos_loss_single(self, cls_score, objectness, reg_loss, gt_labels, + center_prior_weights): + """Calculate the positive loss of all points in gt_bboxes. + + Args: + cls_score (Tensor): All category scores for each point on + the feature map. The shape is (num_points, num_class). + objectness (Tensor): Foreground probability of all points, + has shape (num_points, 1). + reg_loss (Tensor): The regression loss of each gt_bbox and each + prediction box, has shape of (num_points, num_gt). + gt_labels (Tensor): The zeros based gt_labels of all gt + with shape of (num_gt,). + center_prior_weights (Tensor): Float tensor with shape + of (num_points, num_gt). Each value represents + the center weighting coefficient. + + Returns: + tuple[Tensor]: + + - pos_loss (Tensor): The positive loss of all points + in the gt_bboxes. + """ + # p_loc: localization confidence + p_loc = torch.exp(-reg_loss) + # p_cls: classification confidence + p_cls = (cls_score * objectness)[:, gt_labels] + # p_pos: joint confidence indicator + p_pos = p_cls * p_loc + + # 3 is a hyper-parameter to control the contributions of high and + # low confidence locations towards positive losses. + confidence_weight = torch.exp(p_pos * 3) + p_pos_weight = (confidence_weight * center_prior_weights) / ( + (confidence_weight * center_prior_weights).sum( + 0, keepdim=True)).clamp(min=EPS) + reweighted_p_pos = (p_pos * p_pos_weight).sum(0) + pos_loss = F.binary_cross_entropy( + reweighted_p_pos, + torch.ones_like(reweighted_p_pos), + reduction='none') + pos_loss = pos_loss.sum() * self.pos_loss_weight + return pos_loss, + + def get_neg_loss_single(self, cls_score, objectness, gt_labels, ious, + inside_gt_bbox_mask): + """Calculate the negative loss of all points in feature map. + + Args: + cls_score (Tensor): All category scores for each point on + the feature map. The shape is (num_points, num_class). + objectness (Tensor): Foreground probability of all points + and is shape of (num_points, 1). + gt_labels (Tensor): The zeros based label of all gt with shape of + (num_gt). + ious (Tensor): Float tensor with shape of (num_points, num_gt). + Each value represent the iou of pred_bbox and gt_bboxes. + inside_gt_bbox_mask (Tensor): Tensor of bool type, + with shape of (num_points, num_gt), each + value is used to mark whether this point falls + within a certain gt. + + Returns: + tuple[Tensor]: + + - neg_loss (Tensor): The negative loss of all points + in the feature map. + """ + num_gts = len(gt_labels) + joint_conf = (cls_score * objectness) + p_neg_weight = torch.ones_like(joint_conf) + if num_gts > 0: + # the order of dinmension would affect the value of + # p_neg_weight, we strictly follow the original + # implementation. + inside_gt_bbox_mask = inside_gt_bbox_mask.permute(1, 0) + ious = ious.permute(1, 0) + + foreground_idxs = torch.nonzero(inside_gt_bbox_mask, as_tuple=True) + temp_weight = (1 / (1 - ious[foreground_idxs]).clamp_(EPS)) + + def normalize(x): + return (x - x.min() + EPS) / (x.max() - x.min() + EPS) + + for instance_idx in range(num_gts): + idxs = foreground_idxs[0] == instance_idx + if idxs.any(): + temp_weight[idxs] = normalize(temp_weight[idxs]) + + p_neg_weight[foreground_idxs[1], + gt_labels[foreground_idxs[0]]] = 1 - temp_weight + + logits = (joint_conf * p_neg_weight) + neg_loss = ( + logits**2 * F.binary_cross_entropy( + logits, torch.zeros_like(logits), reduction='none')) + neg_loss = neg_loss.sum() * self.neg_loss_weight + return neg_loss, + + @force_fp32(apply_to=('cls_scores', 'bbox_preds', 'objectnesses')) + def loss(self, + cls_scores, + bbox_preds, + objectnesses, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Compute loss of the head. + + Args: + cls_scores (list[Tensor]): Box scores for each scale level, + each is a 4D-tensor, the channel number is + num_points * num_classes. + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level, each is a 4D-tensor, the channel number is + num_points * 4. + objectnesses (list[Tensor]): objectness for each scale level, each + is a 4D-tensor, the channel number is num_points * 1. + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (None | list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + + assert len(cls_scores) == len(bbox_preds) == len(objectnesses) + all_num_gt = sum([len(item) for item in gt_bboxes]) + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + all_level_points = self.prior_generator.grid_priors( + featmap_sizes, + dtype=bbox_preds[0].dtype, + device=bbox_preds[0].device) + inside_gt_bbox_mask_list, bbox_targets_list = self.get_targets( + all_level_points, gt_bboxes) + + center_prior_weight_list = [] + temp_inside_gt_bbox_mask_list = [] + for gt_bboxe, gt_label, inside_gt_bbox_mask in zip( + gt_bboxes, gt_labels, inside_gt_bbox_mask_list): + center_prior_weight, inside_gt_bbox_mask = \ + self.center_prior(all_level_points, gt_bboxe, gt_label, + inside_gt_bbox_mask) + center_prior_weight_list.append(center_prior_weight) + temp_inside_gt_bbox_mask_list.append(inside_gt_bbox_mask) + inside_gt_bbox_mask_list = temp_inside_gt_bbox_mask_list + mlvl_points = torch.cat(all_level_points, dim=0) + bbox_preds = levels_to_images(bbox_preds) + cls_scores = levels_to_images(cls_scores) + objectnesses = levels_to_images(objectnesses) + + reg_loss_list = [] + ious_list = [] + num_points = len(mlvl_points) + + for bbox_pred, encoded_targets, inside_gt_bbox_mask in zip( + bbox_preds, bbox_targets_list, inside_gt_bbox_mask_list): + temp_num_gt = encoded_targets.size(1) + expand_mlvl_points = mlvl_points[:, None, :].expand( + num_points, temp_num_gt, 2).reshape(-1, 2) + encoded_targets = encoded_targets.reshape(-1, 4) + expand_bbox_pred = bbox_pred[:, None, :].expand( + num_points, temp_num_gt, 4).reshape(-1, 4) + decoded_bbox_preds = self.bbox_coder.decode( + expand_mlvl_points, expand_bbox_pred) + decoded_target_preds = self.bbox_coder.decode( + expand_mlvl_points, encoded_targets) + with torch.no_grad(): + ious = bbox_overlaps( + decoded_bbox_preds, decoded_target_preds, is_aligned=True) + ious = ious.reshape(num_points, temp_num_gt) + if temp_num_gt: + ious = ious.max( + dim=-1, keepdim=True).values.repeat(1, temp_num_gt) + else: + ious = ious.new_zeros(num_points, temp_num_gt) + ious[~inside_gt_bbox_mask] = 0 + ious_list.append(ious) + loss_bbox = self.loss_bbox( + decoded_bbox_preds, + decoded_target_preds, + weight=None, + reduction_override='none') + reg_loss_list.append(loss_bbox.reshape(num_points, temp_num_gt)) + + cls_scores = [item.sigmoid() for item in cls_scores] + objectnesses = [item.sigmoid() for item in objectnesses] + pos_loss_list, = multi_apply(self.get_pos_loss_single, cls_scores, + objectnesses, reg_loss_list, gt_labels, + center_prior_weight_list) + pos_avg_factor = reduce_mean( + bbox_pred.new_tensor(all_num_gt)).clamp_(min=1) + pos_loss = sum(pos_loss_list) / pos_avg_factor + + neg_loss_list, = multi_apply(self.get_neg_loss_single, cls_scores, + objectnesses, gt_labels, ious_list, + inside_gt_bbox_mask_list) + neg_avg_factor = sum(item.data.sum() + for item in center_prior_weight_list) + neg_avg_factor = reduce_mean(neg_avg_factor).clamp_(min=1) + neg_loss = sum(neg_loss_list) / neg_avg_factor + + center_loss = [] + for i in range(len(img_metas)): + + if inside_gt_bbox_mask_list[i].any(): + center_loss.append( + len(gt_bboxes[i]) / + center_prior_weight_list[i].sum().clamp_(min=EPS)) + # when width or height of gt_bbox is smaller than stride of p3 + else: + center_loss.append(center_prior_weight_list[i].sum() * 0) + + center_loss = torch.stack(center_loss).mean() * self.center_loss_weight + + # avoid dead lock in DDP + if all_num_gt == 0: + pos_loss = bbox_preds[0].sum() * 0 + dummy_center_prior_loss = self.center_prior.mean.sum( + ) * 0 + self.center_prior.sigma.sum() * 0 + center_loss = objectnesses[0].sum() * 0 + dummy_center_prior_loss + + loss = dict( + loss_pos=pos_loss, loss_neg=neg_loss, loss_center=center_loss) + + return loss + + def get_targets(self, points, gt_bboxes_list): + """Compute regression targets and each point inside or outside gt_bbox + in multiple images. + + Args: + points (list[Tensor]): Points of all fpn level, each has shape + (num_points, 2). + gt_bboxes_list (list[Tensor]): Ground truth bboxes of each image, + each has shape (num_gt, 4). + + Returns: + tuple(list[Tensor]): + + - inside_gt_bbox_mask_list (list[Tensor]): Each + Tensor is with bool type and shape of + (num_points, num_gt), each value + is used to mark whether this point falls + within a certain gt. + - concat_lvl_bbox_targets (list[Tensor]): BBox + targets of each level. Each tensor has shape + (num_points, num_gt, 4). + """ + + concat_points = torch.cat(points, dim=0) + # the number of points per img, per lvl + inside_gt_bbox_mask_list, bbox_targets_list = multi_apply( + self._get_target_single, gt_bboxes_list, points=concat_points) + return inside_gt_bbox_mask_list, bbox_targets_list + + def _get_target_single(self, gt_bboxes, points): + """Compute regression targets and each point inside or outside gt_bbox + for a single image. + + Args: + gt_bboxes (Tensor): gt_bbox of single image, has shape + (num_gt, 4). + points (Tensor): Points of all fpn level, has shape + (num_points, 2). + + Returns: + tuple[Tensor]: Containing the following Tensors: + + - inside_gt_bbox_mask (Tensor): Bool tensor with shape + (num_points, num_gt), each value is used to mark + whether this point falls within a certain gt. + - bbox_targets (Tensor): BBox targets of each points with + each gt_bboxes, has shape (num_points, num_gt, 4). + """ + num_points = points.size(0) + num_gts = gt_bboxes.size(0) + gt_bboxes = gt_bboxes[None].expand(num_points, num_gts, 4) + xs, ys = points[:, 0], points[:, 1] + xs = xs[:, None] + ys = ys[:, None] + left = xs - gt_bboxes[..., 0] + right = gt_bboxes[..., 2] - xs + top = ys - gt_bboxes[..., 1] + bottom = gt_bboxes[..., 3] - ys + bbox_targets = torch.stack((left, top, right, bottom), -1) + if num_gts: + inside_gt_bbox_mask = bbox_targets.min(-1)[0] > 0 + else: + inside_gt_bbox_mask = bbox_targets.new_zeros((num_points, num_gts), + dtype=torch.bool) + + return inside_gt_bbox_mask, bbox_targets + + def _get_points_single(self, + featmap_size, + stride, + dtype, + device, + flatten=False): + """Almost the same as the implementation in fcos, we remove half stride + offset to align with the original implementation. + + This function will be deprecated soon. + """ + warnings.warn( + '`_get_points_single` in `AutoAssignHead` will be ' + 'deprecated soon, we support a multi level point generator now' + 'you can get points of a single level feature map ' + 'with `self.prior_generator.single_level_grid_priors` ') + y, x = super(FCOSHead, + self)._get_points_single(featmap_size, stride, dtype, + device) + points = torch.stack((x.reshape(-1) * stride, y.reshape(-1) * stride), + dim=-1) + return points diff --git a/mmdet/models/dense_heads/base_dense_head.py b/mmdet/models/dense_heads/base_dense_head.py new file mode 100644 index 0000000..6ad07ba --- /dev/null +++ b/mmdet/models/dense_heads/base_dense_head.py @@ -0,0 +1,527 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from abc import ABCMeta, abstractmethod + +import torch +from mmcv.cnn.utils.weight_init import constant_init +from mmcv.ops import batched_nms +from mmcv.runner import BaseModule, force_fp32 + +from mmdet.core.utils import filter_scores_and_topk, select_single_mlvl + + +class BaseDenseHead(BaseModule, metaclass=ABCMeta): + """Base class for DenseHeads.""" + + def __init__(self, init_cfg=None): + super(BaseDenseHead, self).__init__(init_cfg) + + def init_weights(self): + super(BaseDenseHead, self).init_weights() + # avoid init_cfg overwrite the initialization of `conv_offset` + for m in self.modules(): + # DeformConv2dPack, ModulatedDeformConv2dPack + if hasattr(m, 'conv_offset'): + constant_init(m.conv_offset, 0) + + @abstractmethod + def loss(self, **kwargs): + """Compute losses of the head.""" + pass + + @force_fp32(apply_to=('cls_scores', 'bbox_preds')) + def get_bboxes(self, + cls_scores, + bbox_preds, + score_factors=None, + img_metas=None, + cfg=None, + rescale=False, + with_nms=True, + **kwargs): + """Transform network outputs of a batch into bbox results. + + Note: When score_factors is not None, the cls_scores are + usually multiplied by it then obtain the real score used in NMS, + such as CenterNess in FCOS, IoU branch in ATSS. + + Args: + cls_scores (list[Tensor]): Classification scores for all + scale levels, each is a 4D-tensor, has shape + (batch_size, num_priors * num_classes, H, W). + bbox_preds (list[Tensor]): Box energies / deltas for all + scale levels, each is a 4D-tensor, has shape + (batch_size, num_priors * 4, H, W). + score_factors (list[Tensor], Optional): Score factor for + all scale level, each is a 4D-tensor, has shape + (batch_size, num_priors * 1, H, W). Default None. + img_metas (list[dict], Optional): Image meta info. Default None. + cfg (mmcv.Config, Optional): Test / postprocessing configuration, + if None, test_cfg would be used. Default None. + rescale (bool): If True, return boxes in original image space. + Default False. + with_nms (bool): If True, do nms before return boxes. + Default True. + + Returns: + list[list[Tensor, Tensor]]: Each item in result_list is 2-tuple. + The first item is an (n, 5) tensor, where the first 4 columns + are bounding box positions (tl_x, tl_y, br_x, br_y) and the + 5-th column is a score between 0 and 1. The second item is a + (n,) tensor where each item is the predicted class label of + the corresponding box. + """ + assert len(cls_scores) == len(bbox_preds) + + if score_factors is None: + # e.g. Retina, FreeAnchor, Foveabox, etc. + with_score_factors = False + else: + # e.g. FCOS, PAA, ATSS, AutoAssign, etc. + with_score_factors = True + assert len(cls_scores) == len(score_factors) + + num_levels = len(cls_scores) + + featmap_sizes = [cls_scores[i].shape[-2:] for i in range(num_levels)] + mlvl_priors = self.prior_generator.grid_priors( + featmap_sizes, + dtype=cls_scores[0].dtype, + device=cls_scores[0].device) + + result_list = [] + + for img_id in range(len(img_metas)): + img_meta = img_metas[img_id] + cls_score_list = select_single_mlvl(cls_scores, img_id) + bbox_pred_list = select_single_mlvl(bbox_preds, img_id) + if with_score_factors: + score_factor_list = select_single_mlvl(score_factors, img_id) + else: + score_factor_list = [None for _ in range(num_levels)] + + results = self._get_bboxes_single(cls_score_list, bbox_pred_list, + score_factor_list, mlvl_priors, + img_meta, cfg, rescale, with_nms, + **kwargs) + result_list.append(results) + return result_list + + def _get_bboxes_single(self, + cls_score_list, + bbox_pred_list, + score_factor_list, + mlvl_priors, + img_meta, + cfg, + rescale=False, + with_nms=True, + **kwargs): + """Transform outputs of a single image into bbox predictions. + + Args: + cls_score_list (list[Tensor]): Box scores from all scale + levels of a single image, each item has shape + (num_priors * num_classes, H, W). + bbox_pred_list (list[Tensor]): Box energies / deltas from + all scale levels of a single image, each item has shape + (num_priors * 4, H, W). + score_factor_list (list[Tensor]): Score factor from all scale + levels of a single image, each item has shape + (num_priors * 1, H, W). + mlvl_priors (list[Tensor]): Each element in the list is + the priors of a single level in feature pyramid. In all + anchor-based methods, it has shape (num_priors, 4). In + all anchor-free methods, it has shape (num_priors, 2) + when `with_stride=True`, otherwise it still has shape + (num_priors, 4). + img_meta (dict): Image meta info. + cfg (mmcv.Config): Test / postprocessing configuration, + if None, test_cfg would be used. + rescale (bool): If True, return boxes in original image space. + Default: False. + with_nms (bool): If True, do nms before return boxes. + Default: True. + + Returns: + tuple[Tensor]: Results of detected bboxes and labels. If with_nms + is False and mlvl_score_factor is None, return mlvl_bboxes and + mlvl_scores, else return mlvl_bboxes, mlvl_scores and + mlvl_score_factor. Usually with_nms is False is used for aug + test. If with_nms is True, then return the following format + + - det_bboxes (Tensor): Predicted bboxes with shape \ + [num_bboxes, 5], where the first 4 columns are bounding \ + box positions (tl_x, tl_y, br_x, br_y) and the 5-th \ + column are scores between 0 and 1. + - det_labels (Tensor): Predicted labels of the corresponding \ + box with shape [num_bboxes]. + """ + if score_factor_list[0] is None: + # e.g. Retina, FreeAnchor, etc. + with_score_factors = False + else: + # e.g. FCOS, PAA, ATSS, etc. + with_score_factors = True + + cfg = self.test_cfg if cfg is None else cfg + img_shape = img_meta['img_shape'] + nms_pre = cfg.get('nms_pre', -1) + + mlvl_bboxes = [] + mlvl_scores = [] + mlvl_labels = [] + if with_score_factors: + mlvl_score_factors = [] + else: + mlvl_score_factors = None + for level_idx, (cls_score, bbox_pred, score_factor, priors) in \ + enumerate(zip(cls_score_list, bbox_pred_list, + score_factor_list, mlvl_priors)): + + assert cls_score.size()[-2:] == bbox_pred.size()[-2:] + + bbox_pred = bbox_pred.permute(1, 2, 0).reshape(-1, 4) + if with_score_factors: + score_factor = score_factor.permute(1, 2, + 0).reshape(-1).sigmoid() + cls_score = cls_score.permute(1, 2, + 0).reshape(-1, self.cls_out_channels) + if self.use_sigmoid_cls: + scores = cls_score.sigmoid() + else: + # remind that we set FG labels to [0, num_class-1] + # since mmdet v2.0 + # BG cat_id: num_class + scores = cls_score.softmax(-1)[:, :-1] + + # After https://github.com/open-mmlab/mmdetection/pull/6268/, + # this operation keeps fewer bboxes under the same `nms_pre`. + # There is no difference in performance for most models. If you + # find a slight drop in performance, you can set a larger + # `nms_pre` than before. + results = filter_scores_and_topk( + scores, cfg.score_thr, nms_pre, + dict(bbox_pred=bbox_pred, priors=priors)) + scores, labels, keep_idxs, filtered_results = results + + bbox_pred = filtered_results['bbox_pred'] + priors = filtered_results['priors'] + + if with_score_factors: + score_factor = score_factor[keep_idxs] + + bboxes = self.bbox_coder.decode( + priors, bbox_pred, max_shape=img_shape) + + mlvl_bboxes.append(bboxes) + mlvl_scores.append(scores) + mlvl_labels.append(labels) + if with_score_factors: + mlvl_score_factors.append(score_factor) + + return self._bbox_post_process(mlvl_scores, mlvl_labels, mlvl_bboxes, + img_meta['scale_factor'], cfg, rescale, + with_nms, mlvl_score_factors, **kwargs) + + def _bbox_post_process(self, + mlvl_scores, + mlvl_labels, + mlvl_bboxes, + scale_factor, + cfg, + rescale=False, + with_nms=True, + mlvl_score_factors=None, + **kwargs): + """bbox post-processing method. + + The boxes would be rescaled to the original image scale and do + the nms operation. Usually `with_nms` is False is used for aug test. + + Args: + mlvl_scores (list[Tensor]): Box scores from all scale + levels of a single image, each item has shape + (num_bboxes, ). + mlvl_labels (list[Tensor]): Box class labels from all scale + levels of a single image, each item has shape + (num_bboxes, ). + mlvl_bboxes (list[Tensor]): Decoded bboxes from all scale + levels of a single image, each item has shape (num_bboxes, 4). + scale_factor (ndarray, optional): Scale factor of the image arange + as (w_scale, h_scale, w_scale, h_scale). + cfg (mmcv.Config): Test / postprocessing configuration, + if None, test_cfg would be used. + rescale (bool): If True, return boxes in original image space. + Default: False. + with_nms (bool): If True, do nms before return boxes. + Default: True. + mlvl_score_factors (list[Tensor], optional): Score factor from + all scale levels of a single image, each item has shape + (num_bboxes, ). Default: None. + + Returns: + tuple[Tensor]: Results of detected bboxes and labels. If with_nms + is False and mlvl_score_factor is None, return mlvl_bboxes and + mlvl_scores, else return mlvl_bboxes, mlvl_scores and + mlvl_score_factor. Usually with_nms is False is used for aug + test. If with_nms is True, then return the following format + + - det_bboxes (Tensor): Predicted bboxes with shape \ + [num_bboxes, 5], where the first 4 columns are bounding \ + box positions (tl_x, tl_y, br_x, br_y) and the 5-th \ + column are scores between 0 and 1. + - det_labels (Tensor): Predicted labels of the corresponding \ + box with shape [num_bboxes]. + """ + assert len(mlvl_scores) == len(mlvl_bboxes) == len(mlvl_labels) + + mlvl_bboxes = torch.cat(mlvl_bboxes) + if rescale: + mlvl_bboxes /= mlvl_bboxes.new_tensor(scale_factor) + mlvl_scores = torch.cat(mlvl_scores) + mlvl_labels = torch.cat(mlvl_labels) + + if mlvl_score_factors is not None: + # TODO: Add sqrt operation in order to be consistent with + # the paper. + mlvl_score_factors = torch.cat(mlvl_score_factors) + mlvl_scores = mlvl_scores * mlvl_score_factors + + if with_nms: + if mlvl_bboxes.numel() == 0: + det_bboxes = torch.cat([mlvl_bboxes, mlvl_scores[:, None]], -1) + return det_bboxes, mlvl_labels + + det_bboxes, keep_idxs = batched_nms(mlvl_bboxes, mlvl_scores, + mlvl_labels, cfg.nms) + det_bboxes = det_bboxes[:cfg.max_per_img] + det_labels = mlvl_labels[keep_idxs][:cfg.max_per_img] + return det_bboxes, det_labels + else: + return mlvl_bboxes, mlvl_scores, mlvl_labels + + def forward_train(self, + x, + img_metas, + gt_bboxes, + gt_labels=None, + gt_bboxes_ignore=None, + proposal_cfg=None, + **kwargs): + """ + Args: + x (list[Tensor]): Features from FPN. + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes (Tensor): Ground truth bboxes of the image, + shape (num_gts, 4). + gt_labels (Tensor): Ground truth labels of each box, + shape (num_gts,). + gt_bboxes_ignore (Tensor): Ground truth bboxes to be + ignored, shape (num_ignored_gts, 4). + proposal_cfg (mmcv.Config): Test / postprocessing configuration, + if None, test_cfg would be used + + Returns: + tuple: + losses: (dict[str, Tensor]): A dictionary of loss components. + proposal_list (list[Tensor]): Proposals of each image. + """ + outs = self(x) + # if gt_labels is None: + # loss_inputs = outs + (gt_bboxes, img_metas) + # else: + # loss_inputs = outs + (gt_bboxes, gt_labels, img_metas) + loss_inputs = outs + (gt_bboxes, gt_labels, img_metas) + losses = self.loss(*loss_inputs, gt_bboxes_ignore=gt_bboxes_ignore) + if proposal_cfg is None: + return losses + else: + proposal_list = self.get_bboxes( + *outs, img_metas=img_metas, cfg=proposal_cfg) + return losses, proposal_list + + def simple_test(self, feats, img_metas, rescale=False): + """Test function without test-time augmentation. + + Args: + feats (tuple[torch.Tensor]): Multi-level features from the + upstream network, each is a 4D-tensor. + img_metas (list[dict]): List of image information. + rescale (bool, optional): Whether to rescale the results. + Defaults to False. + + Returns: + list[tuple[Tensor, Tensor]]: Each item in result_list is 2-tuple. + The first item is ``bboxes`` with shape (n, 5), + where 5 represent (tl_x, tl_y, br_x, br_y, score). + The shape of the second tensor in the tuple is ``labels`` + with shape (n, ). + """ + return self.simple_test_bboxes(feats, img_metas, rescale=rescale) # TODO 这玩意跟谁绑定的。怎么绑定的,得清除重定向 + + @force_fp32(apply_to=('cls_scores', 'bbox_preds')) + def onnx_export(self, + cls_scores, + bbox_preds, + score_factors=None, + img_metas=None, + with_nms=True): + """Transform network output for a batch into bbox predictions. + + Args: + cls_scores (list[Tensor]): Box scores for each scale level + with shape (N, num_points * num_classes, H, W). + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level with shape (N, num_points * 4, H, W). + score_factors (list[Tensor]): score_factors for each s + cale level with shape (N, num_points * 1, H, W). + Default: None. + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. Default: None. + with_nms (bool): Whether apply nms to the bboxes. Default: True. + + Returns: + tuple[Tensor, Tensor] | list[tuple]: When `with_nms` is True, + it is tuple[Tensor, Tensor], first tensor bboxes with shape + [N, num_det, 5], 5 arrange as (x1, y1, x2, y2, score) + and second element is class labels of shape [N, num_det]. + When `with_nms` is False, first tensor is bboxes with + shape [N, num_det, 4], second tensor is raw score has + shape [N, num_det, num_classes]. + """ + assert len(cls_scores) == len(bbox_preds) + + num_levels = len(cls_scores) + + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + mlvl_priors = self.prior_generator.grid_priors( + featmap_sizes, + dtype=bbox_preds[0].dtype, + device=bbox_preds[0].device) + + mlvl_cls_scores = [cls_scores[i].detach() for i in range(num_levels)] + mlvl_bbox_preds = [bbox_preds[i].detach() for i in range(num_levels)] + + assert len( + img_metas + ) == 1, 'Only support one input image while in exporting to ONNX' + img_shape = img_metas[0]['img_shape_for_onnx'] + + cfg = self.test_cfg + assert len(cls_scores) == len(bbox_preds) == len(mlvl_priors) + device = cls_scores[0].device + batch_size = cls_scores[0].shape[0] + # convert to tensor to keep tracing + nms_pre_tensor = torch.tensor( + cfg.get('nms_pre', -1), device=device, dtype=torch.long) + + # e.g. Retina, FreeAnchor, etc. + if score_factors is None: + with_score_factors = False + mlvl_score_factor = [None for _ in range(num_levels)] + else: + # e.g. FCOS, PAA, ATSS, etc. + with_score_factors = True + mlvl_score_factor = [ + score_factors[i].detach() for i in range(num_levels) + ] + mlvl_score_factors = [] + + mlvl_batch_bboxes = [] + mlvl_scores = [] + + for cls_score, bbox_pred, score_factors, priors in zip( + mlvl_cls_scores, mlvl_bbox_preds, mlvl_score_factor, + mlvl_priors): + assert cls_score.size()[-2:] == bbox_pred.size()[-2:] + + scores = cls_score.permute(0, 2, 3, + 1).reshape(batch_size, -1, + self.cls_out_channels) + if self.use_sigmoid_cls: + scores = scores.sigmoid() + nms_pre_score = scores + else: + scores = scores.softmax(-1) + nms_pre_score = scores + + if with_score_factors: + score_factors = score_factors.permute(0, 2, 3, 1).reshape( + batch_size, -1).sigmoid() + bbox_pred = bbox_pred.permute(0, 2, 3, + 1).reshape(batch_size, -1, 4) + priors = priors.expand(batch_size, -1, priors.size(-1)) + # Get top-k predictions + from mmdet.core.export import get_k_for_topk + nms_pre = get_k_for_topk(nms_pre_tensor, bbox_pred.shape[1]) + if nms_pre > 0: + + if with_score_factors: + nms_pre_score = (nms_pre_score * score_factors[..., None]) + else: + nms_pre_score = nms_pre_score + + # Get maximum scores for foreground classes. + if self.use_sigmoid_cls: + max_scores, _ = nms_pre_score.max(-1) + else: + # remind that we set FG labels to [0, num_class-1] + # since mmdet v2.0 + # BG cat_id: num_class + max_scores, _ = nms_pre_score[..., :-1].max(-1) + _, topk_inds = max_scores.topk(nms_pre) + + batch_inds = torch.arange( + batch_size, device=bbox_pred.device).view( + -1, 1).expand_as(topk_inds).long() + # Avoid onnx2tensorrt issue in https://github.com/NVIDIA/TensorRT/issues/1134 # noqa: E501 + transformed_inds = bbox_pred.shape[1] * batch_inds + topk_inds + priors = priors.reshape( + -1, priors.size(-1))[transformed_inds, :].reshape( + batch_size, -1, priors.size(-1)) + bbox_pred = bbox_pred.reshape(-1, + 4)[transformed_inds, :].reshape( + batch_size, -1, 4) + scores = scores.reshape( + -1, self.cls_out_channels)[transformed_inds, :].reshape( + batch_size, -1, self.cls_out_channels) + if with_score_factors: + score_factors = score_factors.reshape( + -1, 1)[transformed_inds].reshape(batch_size, -1) + + bboxes = self.bbox_coder.decode( + priors, bbox_pred, max_shape=img_shape) + + mlvl_batch_bboxes.append(bboxes) + mlvl_scores.append(scores) + if with_score_factors: + mlvl_score_factors.append(score_factors) + + batch_bboxes = torch.cat(mlvl_batch_bboxes, dim=1) + batch_scores = torch.cat(mlvl_scores, dim=1) + if with_score_factors: + batch_score_factors = torch.cat(mlvl_score_factors, dim=1) + + # Replace multiclass_nms with ONNX::NonMaxSuppression in deployment + + from mmdet.core.export import add_dummy_nms_for_onnx + + if not self.use_sigmoid_cls: + batch_scores = batch_scores[..., :self.num_classes] + + if with_score_factors: + batch_scores = batch_scores * (batch_score_factors.unsqueeze(2)) + + if with_nms: + max_output_boxes_per_class = cfg.nms.get( + 'max_output_boxes_per_class', 200) + iou_threshold = cfg.nms.get('iou_threshold', 0.5) + score_threshold = cfg.score_thr + nms_pre = cfg.get('deploy_nms_pre', -1) + return add_dummy_nms_for_onnx(batch_bboxes, batch_scores, + max_output_boxes_per_class, + iou_threshold, score_threshold, + nms_pre, cfg.max_per_img) + else: + return batch_bboxes, batch_scores diff --git a/mmdet/models/dense_heads/base_mask_head.py b/mmdet/models/dense_heads/base_mask_head.py new file mode 100644 index 0000000..5eb94fb --- /dev/null +++ b/mmdet/models/dense_heads/base_mask_head.py @@ -0,0 +1,116 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from abc import ABCMeta, abstractmethod + +from mmcv.runner import BaseModule + + +class BaseMaskHead(BaseModule, metaclass=ABCMeta): + """Base class for mask heads used in One-Stage Instance Segmentation.""" + + def __init__(self, init_cfg): + super(BaseMaskHead, self).__init__(init_cfg) + + @abstractmethod + def loss(self, **kwargs): + pass + + @abstractmethod + def get_results(self, **kwargs): + """Get precessed :obj:`InstanceData` of multiple images.""" + pass + + def forward_train(self, + x, + gt_labels, + gt_masks, + img_metas, + gt_bboxes=None, + gt_bboxes_ignore=None, + positive_infos=None, + **kwargs): + """ + Args: + x (list[Tensor] | tuple[Tensor]): Features from FPN. + Each has a shape (B, C, H, W). + gt_labels (list[Tensor]): Ground truth labels of all images. + each has a shape (num_gts,). + gt_masks (list[Tensor]) : Masks for each bbox, has a shape + (num_gts, h , w). + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes (list[Tensor]): Ground truth bboxes of the image, + each item has a shape (num_gts, 4). + gt_bboxes_ignore (list[Tensor], None): Ground truth bboxes to be + ignored, each item has a shape (num_ignored_gts, 4). + positive_infos (list[:obj:`InstanceData`], optional): Information + of positive samples. Used when the label assignment is + done outside the MaskHead, e.g., in BboxHead in + YOLACT or CondInst, etc. When the label assignment is done in + MaskHead, it would be None, like SOLO. All values + in it should have shape (num_positive_samples, *). + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + if positive_infos is None: + outs = self(x) + else: + outs = self(x, positive_infos) + + assert isinstance(outs, tuple), 'Forward results should be a tuple, ' \ + 'even if only one item is returned' + loss = self.loss( + *outs, + gt_labels=gt_labels, + gt_masks=gt_masks, + img_metas=img_metas, + gt_bboxes=gt_bboxes, + gt_bboxes_ignore=gt_bboxes_ignore, + positive_infos=positive_infos, + **kwargs) + return loss + + def simple_test(self, + feats, + img_metas, + rescale=False, + instances_list=None, + **kwargs): + """Test function without test-time augmentation. + + Args: + feats (tuple[torch.Tensor]): Multi-level features from the + upstream network, each is a 4D-tensor. + img_metas (list[dict]): List of image information. + rescale (bool, optional): Whether to rescale the results. + Defaults to False. + instances_list (list[obj:`InstanceData`], optional): Detection + results of each image after the post process. Only exist + if there is a `bbox_head`, like `YOLACT`, `CondInst`, etc. + + Returns: + list[obj:`InstanceData`]: Instance segmentation \ + results of each image after the post process. \ + Each item usually contains following keys. \ + + - scores (Tensor): Classification scores, has a shape + (num_instance,) + - labels (Tensor): Has a shape (num_instances,). + - masks (Tensor): Processed mask results, has a + shape (num_instances, h, w). + """ + if instances_list is None: + outs = self(feats) + else: + outs = self(feats, instances_list=instances_list) + mask_inputs = outs + (img_metas, ) + results_list = self.get_results( + *mask_inputs, + rescale=rescale, + instances_list=instances_list, + **kwargs) + return results_list + + def onnx_export(self, img, img_metas): + raise NotImplementedError(f'{self.__class__.__name__} does ' + f'not support ONNX EXPORT') diff --git a/mmdet/models/dense_heads/cascade_rpn_head.py b/mmdet/models/dense_heads/cascade_rpn_head.py new file mode 100644 index 0000000..69347e0 --- /dev/null +++ b/mmdet/models/dense_heads/cascade_rpn_head.py @@ -0,0 +1,801 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from __future__ import division +import copy +import warnings + +import torch +import torch.nn as nn +from mmcv import ConfigDict +from mmcv.ops import DeformConv2d, batched_nms +from mmcv.runner import BaseModule, ModuleList + +from mmdet.core import (RegionAssigner, build_assigner, build_sampler, + images_to_levels, multi_apply) +from mmdet.core.utils import select_single_mlvl +from ..builder import HEADS, build_head +from .base_dense_head import BaseDenseHead +from .rpn_head import RPNHead + + +class AdaptiveConv(BaseModule): + """AdaptiveConv used to adapt the sampling location with the anchors. + + Args: + in_channels (int): Number of channels in the input image + out_channels (int): Number of channels produced by the convolution + kernel_size (int or tuple): Size of the conv kernel. Default: 3 + stride (int or tuple, optional): Stride of the convolution. Default: 1 + padding (int or tuple, optional): Zero-padding added to both sides of + the input. Default: 1 + dilation (int or tuple, optional): Spacing between kernel elements. + Default: 3 + groups (int, optional): Number of blocked connections from input + channels to output channels. Default: 1 + bias (bool, optional): If set True, adds a learnable bias to the + output. Default: False. + type (str, optional): Type of adaptive conv, can be either 'offset' + (arbitrary anchors) or 'dilation' (uniform anchor). + Default: 'dilation'. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + in_channels, + out_channels, + kernel_size=3, + stride=1, + padding=1, + dilation=3, + groups=1, + bias=False, + type='dilation', + init_cfg=dict( + type='Normal', std=0.01, override=dict(name='conv'))): + super(AdaptiveConv, self).__init__(init_cfg) + assert type in ['offset', 'dilation'] + self.adapt_type = type + + assert kernel_size == 3, 'Adaptive conv only supports kernels 3' + if self.adapt_type == 'offset': + assert stride == 1 and padding == 1 and groups == 1, \ + 'Adaptive conv offset mode only supports padding: {1}, ' \ + f'stride: {1}, groups: {1}' + self.conv = DeformConv2d( + in_channels, + out_channels, + kernel_size, + padding=padding, + stride=stride, + groups=groups, + bias=bias) + else: + self.conv = nn.Conv2d( + in_channels, + out_channels, + kernel_size, + padding=dilation, + dilation=dilation) + + def forward(self, x, offset): + """Forward function.""" + if self.adapt_type == 'offset': + N, _, H, W = x.shape + assert offset is not None + assert H * W == offset.shape[1] + # reshape [N, NA, 18] to (N, 18, H, W) + offset = offset.permute(0, 2, 1).reshape(N, -1, H, W) + offset = offset.contiguous() + x = self.conv(x, offset) + else: + assert offset is None + x = self.conv(x) + return x + + +@HEADS.register_module() +class StageCascadeRPNHead(RPNHead): + """Stage of CascadeRPNHead. + + Args: + in_channels (int): Number of channels in the input feature map. + anchor_generator (dict): anchor generator config. + adapt_cfg (dict): adaptation config. + bridged_feature (bool, optional): whether update rpn feature. + Default: False. + with_cls (bool, optional): whether use classification branch. + Default: True. + sampling (bool, optional): whether use sampling. Default: True. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + in_channels, + anchor_generator=dict( + type='AnchorGenerator', + scales=[8], + ratios=[1.0], + strides=[4, 8, 16, 32, 64]), + adapt_cfg=dict(type='dilation', dilation=3), + bridged_feature=False, + with_cls=True, + sampling=True, + init_cfg=None, + **kwargs): + self.with_cls = with_cls + self.anchor_strides = anchor_generator['strides'] + self.anchor_scales = anchor_generator['scales'] + self.bridged_feature = bridged_feature + self.adapt_cfg = adapt_cfg + super(StageCascadeRPNHead, self).__init__( + in_channels, + anchor_generator=anchor_generator, + init_cfg=init_cfg, + **kwargs) + + # override sampling and sampler + self.sampling = sampling + if self.train_cfg: + self.assigner = build_assigner(self.train_cfg.assigner) + # use PseudoSampler when sampling is False + if self.sampling and hasattr(self.train_cfg, 'sampler'): + sampler_cfg = self.train_cfg.sampler + else: + sampler_cfg = dict(type='PseudoSampler') + self.sampler = build_sampler(sampler_cfg, context=self) + + if init_cfg is None: + self.init_cfg = dict( + type='Normal', std=0.01, override=[dict(name='rpn_reg')]) + if self.with_cls: + self.init_cfg['override'].append(dict(name='rpn_cls')) + + def _init_layers(self): + """Init layers of a CascadeRPN stage.""" + self.rpn_conv = AdaptiveConv(self.in_channels, self.feat_channels, + **self.adapt_cfg) + if self.with_cls: + self.rpn_cls = nn.Conv2d(self.feat_channels, + self.num_anchors * self.cls_out_channels, + 1) + self.rpn_reg = nn.Conv2d(self.feat_channels, self.num_anchors * 4, 1) + self.relu = nn.ReLU(inplace=True) + + def forward_single(self, x, offset): + """Forward function of single scale.""" + bridged_x = x + x = self.relu(self.rpn_conv(x, offset)) + if self.bridged_feature: + bridged_x = x # update feature + cls_score = self.rpn_cls(x) if self.with_cls else None + bbox_pred = self.rpn_reg(x) + return bridged_x, cls_score, bbox_pred + + def forward(self, feats, offset_list=None): + """Forward function.""" + if offset_list is None: + offset_list = [None for _ in range(len(feats))] + return multi_apply(self.forward_single, feats, offset_list) + + def _region_targets_single(self, + anchors, + valid_flags, + gt_bboxes, + gt_bboxes_ignore, + gt_labels, + img_meta, + featmap_sizes, + label_channels=1): + """Get anchor targets based on region for single level.""" + assign_result = self.assigner.assign( + anchors, + valid_flags, + gt_bboxes, + img_meta, + featmap_sizes, + self.anchor_scales[0], + self.anchor_strides, + gt_bboxes_ignore=gt_bboxes_ignore, + gt_labels=None, + allowed_border=self.train_cfg.allowed_border) + flat_anchors = torch.cat(anchors) + sampling_result = self.sampler.sample(assign_result, flat_anchors, + gt_bboxes) + + num_anchors = flat_anchors.shape[0] + bbox_targets = torch.zeros_like(flat_anchors) + bbox_weights = torch.zeros_like(flat_anchors) + labels = flat_anchors.new_zeros(num_anchors, dtype=torch.long) + label_weights = flat_anchors.new_zeros(num_anchors, dtype=torch.float) + + pos_inds = sampling_result.pos_inds + neg_inds = sampling_result.neg_inds + if len(pos_inds) > 0: + if not self.reg_decoded_bbox: + pos_bbox_targets = self.bbox_coder.encode( + sampling_result.pos_bboxes, sampling_result.pos_gt_bboxes) + else: + pos_bbox_targets = sampling_result.pos_gt_bboxes + bbox_targets[pos_inds, :] = pos_bbox_targets + bbox_weights[pos_inds, :] = 1.0 + if gt_labels is None: + labels[pos_inds] = 1 + else: + labels[pos_inds] = gt_labels[ + sampling_result.pos_assigned_gt_inds] + if self.train_cfg.pos_weight <= 0: + label_weights[pos_inds] = 1.0 + else: + label_weights[pos_inds] = self.train_cfg.pos_weight + if len(neg_inds) > 0: + label_weights[neg_inds] = 1.0 + + return (labels, label_weights, bbox_targets, bbox_weights, pos_inds, + neg_inds) + + def region_targets(self, + anchor_list, + valid_flag_list, + gt_bboxes_list, + img_metas, + featmap_sizes, + gt_bboxes_ignore_list=None, + gt_labels_list=None, + label_channels=1, + unmap_outputs=True): + """See :func:`StageCascadeRPNHead.get_targets`.""" + num_imgs = len(img_metas) + assert len(anchor_list) == len(valid_flag_list) == num_imgs + + # anchor number of multi levels + num_level_anchors = [anchors.size(0) for anchors in anchor_list[0]] + + # compute targets for each image + if gt_bboxes_ignore_list is None: + gt_bboxes_ignore_list = [None for _ in range(num_imgs)] + if gt_labels_list is None: + gt_labels_list = [None for _ in range(num_imgs)] + (all_labels, all_label_weights, all_bbox_targets, all_bbox_weights, + pos_inds_list, neg_inds_list) = multi_apply( + self._region_targets_single, + anchor_list, + valid_flag_list, + gt_bboxes_list, + gt_bboxes_ignore_list, + gt_labels_list, + img_metas, + featmap_sizes=featmap_sizes, + label_channels=label_channels) + # no valid anchors + if any([labels is None for labels in all_labels]): + return None + # sampled anchors of all images + num_total_pos = sum([max(inds.numel(), 1) for inds in pos_inds_list]) + num_total_neg = sum([max(inds.numel(), 1) for inds in neg_inds_list]) + # split targets to a list w.r.t. multiple levels + labels_list = images_to_levels(all_labels, num_level_anchors) + label_weights_list = images_to_levels(all_label_weights, + num_level_anchors) + bbox_targets_list = images_to_levels(all_bbox_targets, + num_level_anchors) + bbox_weights_list = images_to_levels(all_bbox_weights, + num_level_anchors) + return (labels_list, label_weights_list, bbox_targets_list, + bbox_weights_list, num_total_pos, num_total_neg) + + def get_targets(self, + anchor_list, + valid_flag_list, + gt_bboxes, + img_metas, + featmap_sizes, + gt_bboxes_ignore=None, + label_channels=1): + """Compute regression and classification targets for anchors. + + Args: + anchor_list (list[list]): Multi level anchors of each image. + valid_flag_list (list[list]): Multi level valid flags of each + image. + gt_bboxes (list[Tensor]): Ground truth bboxes of each image. + img_metas (list[dict]): Meta info of each image. + featmap_sizes (list[Tensor]): Feature mapsize each level + gt_bboxes_ignore (list[Tensor]): Ignore bboxes of each images + label_channels (int): Channel of label. + + Returns: + cls_reg_targets (tuple) + """ + if isinstance(self.assigner, RegionAssigner): + cls_reg_targets = self.region_targets( + anchor_list, + valid_flag_list, + gt_bboxes, + img_metas, + featmap_sizes, + gt_bboxes_ignore_list=gt_bboxes_ignore, + label_channels=label_channels) + else: + cls_reg_targets = super(StageCascadeRPNHead, self).get_targets( + anchor_list, + valid_flag_list, + gt_bboxes, + img_metas, + gt_bboxes_ignore_list=gt_bboxes_ignore, + label_channels=label_channels) + return cls_reg_targets + + def anchor_offset(self, anchor_list, anchor_strides, featmap_sizes): + """ Get offset for deformable conv based on anchor shape + NOTE: currently support deformable kernel_size=3 and dilation=1 + + Args: + anchor_list (list[list[tensor])): [NI, NLVL, NA, 4] list of + multi-level anchors + anchor_strides (list[int]): anchor stride of each level + + Returns: + offset_list (list[tensor]): [NLVL, NA, 2, 18]: offset of DeformConv + kernel. + """ + + def _shape_offset(anchors, stride, ks=3, dilation=1): + # currently support kernel_size=3 and dilation=1 + assert ks == 3 and dilation == 1 + pad = (ks - 1) // 2 + idx = torch.arange(-pad, pad + 1, dtype=dtype, device=device) + yy, xx = torch.meshgrid(idx, idx) # return order matters + xx = xx.reshape(-1) + yy = yy.reshape(-1) + w = (anchors[:, 2] - anchors[:, 0]) / stride + h = (anchors[:, 3] - anchors[:, 1]) / stride + w = w / (ks - 1) - dilation + h = h / (ks - 1) - dilation + offset_x = w[:, None] * xx # (NA, ks**2) + offset_y = h[:, None] * yy # (NA, ks**2) + return offset_x, offset_y + + def _ctr_offset(anchors, stride, featmap_size): + feat_h, feat_w = featmap_size + assert len(anchors) == feat_h * feat_w + + x = (anchors[:, 0] + anchors[:, 2]) * 0.5 + y = (anchors[:, 1] + anchors[:, 3]) * 0.5 + # compute centers on feature map + x = x / stride + y = y / stride + # compute predefine centers + xx = torch.arange(0, feat_w, device=anchors.device) + yy = torch.arange(0, feat_h, device=anchors.device) + yy, xx = torch.meshgrid(yy, xx) + xx = xx.reshape(-1).type_as(x) + yy = yy.reshape(-1).type_as(y) + + offset_x = x - xx # (NA, ) + offset_y = y - yy # (NA, ) + return offset_x, offset_y + + num_imgs = len(anchor_list) + num_lvls = len(anchor_list[0]) + dtype = anchor_list[0][0].dtype + device = anchor_list[0][0].device + num_level_anchors = [anchors.size(0) for anchors in anchor_list[0]] + + offset_list = [] + for i in range(num_imgs): + mlvl_offset = [] + for lvl in range(num_lvls): + c_offset_x, c_offset_y = _ctr_offset(anchor_list[i][lvl], + anchor_strides[lvl], + featmap_sizes[lvl]) + s_offset_x, s_offset_y = _shape_offset(anchor_list[i][lvl], + anchor_strides[lvl]) + + # offset = ctr_offset + shape_offset + offset_x = s_offset_x + c_offset_x[:, None] + offset_y = s_offset_y + c_offset_y[:, None] + + # offset order (y0, x0, y1, x2, .., y8, x8, y9, x9) + offset = torch.stack([offset_y, offset_x], dim=-1) + offset = offset.reshape(offset.size(0), -1) # [NA, 2*ks**2] + mlvl_offset.append(offset) + offset_list.append(torch.cat(mlvl_offset)) # [totalNA, 2*ks**2] + offset_list = images_to_levels(offset_list, num_level_anchors) + return offset_list + + def loss_single(self, cls_score, bbox_pred, anchors, labels, label_weights, + bbox_targets, bbox_weights, num_total_samples): + """Loss function on single scale.""" + # classification loss + if self.with_cls: + labels = labels.reshape(-1) + label_weights = label_weights.reshape(-1) + cls_score = cls_score.permute(0, 2, 3, + 1).reshape(-1, self.cls_out_channels) + loss_cls = self.loss_cls( + cls_score, labels, label_weights, avg_factor=num_total_samples) + # regression loss + bbox_targets = bbox_targets.reshape(-1, 4) + bbox_weights = bbox_weights.reshape(-1, 4) + bbox_pred = bbox_pred.permute(0, 2, 3, 1).reshape(-1, 4) + if self.reg_decoded_bbox: + # When the regression loss (e.g. `IouLoss`, `GIouLoss`) + # is applied directly on the decoded bounding boxes, it + # decodes the already encoded coordinates to absolute format. + anchors = anchors.reshape(-1, 4) + bbox_pred = self.bbox_coder.decode(anchors, bbox_pred) + loss_reg = self.loss_bbox( + bbox_pred, + bbox_targets, + bbox_weights, + avg_factor=num_total_samples) + if self.with_cls: + return loss_cls, loss_reg + return None, loss_reg + + def loss(self, + anchor_list, + valid_flag_list, + cls_scores, + bbox_preds, + gt_bboxes, + img_metas, + gt_bboxes_ignore=None): + """Compute losses of the head. + + Args: + anchor_list (list[list]): Multi level anchors of each image. + cls_scores (list[Tensor]): Box scores for each scale level + Has shape (N, num_anchors * num_classes, H, W) + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level with shape (N, num_anchors * 4, H, W) + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (None | list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. Default: None + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + featmap_sizes = [featmap.size()[-2:] for featmap in bbox_preds] + label_channels = self.cls_out_channels if self.use_sigmoid_cls else 1 + cls_reg_targets = self.get_targets( + anchor_list, + valid_flag_list, + gt_bboxes, + img_metas, + featmap_sizes, + gt_bboxes_ignore=gt_bboxes_ignore, + label_channels=label_channels) + if cls_reg_targets is None: + return None + (labels_list, label_weights_list, bbox_targets_list, bbox_weights_list, + num_total_pos, num_total_neg) = cls_reg_targets + if self.sampling: + num_total_samples = num_total_pos + num_total_neg + else: + # 200 is hard-coded average factor, + # which follows guided anchoring. + num_total_samples = sum([label.numel() + for label in labels_list]) / 200.0 + + # change per image, per level anchor_list to per_level, per_image + mlvl_anchor_list = list(zip(*anchor_list)) + # concat mlvl_anchor_list + mlvl_anchor_list = [ + torch.cat(anchors, dim=0) for anchors in mlvl_anchor_list + ] + + losses = multi_apply( + self.loss_single, + cls_scores, + bbox_preds, + mlvl_anchor_list, + labels_list, + label_weights_list, + bbox_targets_list, + bbox_weights_list, + num_total_samples=num_total_samples) + if self.with_cls: + return dict(loss_rpn_cls=losses[0], loss_rpn_reg=losses[1]) + return dict(loss_rpn_reg=losses[1]) + + def get_bboxes(self, + anchor_list, + cls_scores, + bbox_preds, + img_metas, + cfg, + rescale=False): + """Get proposal predict. + + Args: + anchor_list (list[list]): Multi level anchors of each image. + cls_scores (list[Tensor]): Classification scores for all + scale levels, each is a 4D-tensor, has shape + (batch_size, num_priors * num_classes, H, W). + bbox_preds (list[Tensor]): Box energies / deltas for all + scale levels, each is a 4D-tensor, has shape + (batch_size, num_priors * 4, H, W). + img_metas (list[dict], Optional): Image meta info. Default None. + cfg (mmcv.Config, Optional): Test / postprocessing configuration, + if None, test_cfg would be used. + rescale (bool): If True, return boxes in original image space. + Default: False. + + Returns: + Tensor: Labeled boxes in shape (n, 5), where the first 4 columns + are bounding box positions (tl_x, tl_y, br_x, br_y) and the + 5-th column is a score between 0 and 1. + """ + assert len(cls_scores) == len(bbox_preds) + + result_list = [] + for img_id in range(len(img_metas)): + cls_score_list = select_single_mlvl(cls_scores, img_id) + bbox_pred_list = select_single_mlvl(bbox_preds, img_id) + img_shape = img_metas[img_id]['img_shape'] + scale_factor = img_metas[img_id]['scale_factor'] + proposals = self._get_bboxes_single(cls_score_list, bbox_pred_list, + anchor_list[img_id], img_shape, + scale_factor, cfg, rescale) + result_list.append(proposals) + return result_list + + def _get_bboxes_single(self, + cls_scores, + bbox_preds, + mlvl_anchors, + img_shape, + scale_factor, + cfg, + rescale=False): + """Transform outputs of a single image into bbox predictions. + + Args: + cls_scores (list[Tensor]): Box scores from all scale + levels of a single image, each item has shape + (num_anchors * num_classes, H, W). + bbox_preds (list[Tensor]): Box energies / deltas from + all scale levels of a single image, each item has + shape (num_anchors * 4, H, W). + mlvl_anchors (list[Tensor]): Box reference from all scale + levels of a single image, each item has shape + (num_total_anchors, 4). + img_shape (tuple[int]): Shape of the input image, + (height, width, 3). + scale_factor (ndarray): Scale factor of the image arange as + (w_scale, h_scale, w_scale, h_scale). + cfg (mmcv.Config): Test / postprocessing configuration, + if None, test_cfg would be used. + rescale (bool): If True, return boxes in original image space. + Default False. + + Returns: + Tensor: Labeled boxes in shape (n, 5), where the first 4 columns + are bounding box positions (tl_x, tl_y, br_x, br_y) and the + 5-th column is a score between 0 and 1. + """ + cfg = self.test_cfg if cfg is None else cfg + cfg = copy.deepcopy(cfg) + # bboxes from different level should be independent during NMS, + # level_ids are used as labels for batched NMS to separate them + level_ids = [] + mlvl_scores = [] + mlvl_bbox_preds = [] + mlvl_valid_anchors = [] + nms_pre = cfg.get('nms_pre', -1) + for idx in range(len(cls_scores)): + rpn_cls_score = cls_scores[idx] + rpn_bbox_pred = bbox_preds[idx] + assert rpn_cls_score.size()[-2:] == rpn_bbox_pred.size()[-2:] + rpn_cls_score = rpn_cls_score.permute(1, 2, 0) + if self.use_sigmoid_cls: + rpn_cls_score = rpn_cls_score.reshape(-1) + scores = rpn_cls_score.sigmoid() + else: + rpn_cls_score = rpn_cls_score.reshape(-1, 2) + # We set FG labels to [0, num_class-1] and BG label to + # num_class in RPN head since mmdet v2.5, which is unified to + # be consistent with other head since mmdet v2.0. In mmdet v2.0 + # to v2.4 we keep BG label as 0 and FG label as 1 in rpn head. + scores = rpn_cls_score.softmax(dim=1)[:, 0] + rpn_bbox_pred = rpn_bbox_pred.permute(1, 2, 0).reshape(-1, 4) + anchors = mlvl_anchors[idx] + + if 0 < nms_pre < scores.shape[0]: + # sort is faster than topk + # _, topk_inds = scores.topk(cfg.nms_pre) + ranked_scores, rank_inds = scores.sort(descending=True) + topk_inds = rank_inds[:nms_pre] + scores = ranked_scores[:nms_pre] + rpn_bbox_pred = rpn_bbox_pred[topk_inds, :] + anchors = anchors[topk_inds, :] + mlvl_scores.append(scores) + mlvl_bbox_preds.append(rpn_bbox_pred) + mlvl_valid_anchors.append(anchors) + level_ids.append( + scores.new_full((scores.size(0), ), idx, dtype=torch.long)) + + scores = torch.cat(mlvl_scores) + anchors = torch.cat(mlvl_valid_anchors) + rpn_bbox_pred = torch.cat(mlvl_bbox_preds) + proposals = self.bbox_coder.decode( + anchors, rpn_bbox_pred, max_shape=img_shape) + ids = torch.cat(level_ids) + + if cfg.min_bbox_size >= 0: + w = proposals[:, 2] - proposals[:, 0] + h = proposals[:, 3] - proposals[:, 1] + valid_mask = (w > cfg.min_bbox_size) & (h > cfg.min_bbox_size) + if not valid_mask.all(): + proposals = proposals[valid_mask] + scores = scores[valid_mask] + ids = ids[valid_mask] + + # deprecate arguments warning + if 'nms' not in cfg or 'max_num' in cfg or 'nms_thr' in cfg: + warnings.warn( + 'In rpn_proposal or test_cfg, ' + 'nms_thr has been moved to a dict named nms as ' + 'iou_threshold, max_num has been renamed as max_per_img, ' + 'name of original arguments and the way to specify ' + 'iou_threshold of NMS will be deprecated.') + if 'nms' not in cfg: + cfg.nms = ConfigDict(dict(type='nms', iou_threshold=cfg.nms_thr)) + if 'max_num' in cfg: + if 'max_per_img' in cfg: + assert cfg.max_num == cfg.max_per_img, f'You ' \ + f'set max_num and ' \ + f'max_per_img at the same time, but get {cfg.max_num} ' \ + f'and {cfg.max_per_img} respectively' \ + 'Please delete max_num which will be deprecated.' + else: + cfg.max_per_img = cfg.max_num + if 'nms_thr' in cfg: + assert cfg.nms.iou_threshold == cfg.nms_thr, f'You set' \ + f' iou_threshold in nms and ' \ + f'nms_thr at the same time, but get' \ + f' {cfg.nms.iou_threshold} and {cfg.nms_thr}' \ + f' respectively. Please delete the nms_thr ' \ + f'which will be deprecated.' + + if proposals.numel() > 0: + dets, _ = batched_nms(proposals, scores, ids, cfg.nms) + else: + return proposals.new_zeros(0, 5) + + return dets[:cfg.max_per_img] + + def refine_bboxes(self, anchor_list, bbox_preds, img_metas): + """Refine bboxes through stages.""" + num_levels = len(bbox_preds) + new_anchor_list = [] + for img_id in range(len(img_metas)): + mlvl_anchors = [] + for i in range(num_levels): + bbox_pred = bbox_preds[i][img_id].detach() + bbox_pred = bbox_pred.permute(1, 2, 0).reshape(-1, 4) + img_shape = img_metas[img_id]['img_shape'] + bboxes = self.bbox_coder.decode(anchor_list[img_id][i], + bbox_pred, img_shape) + mlvl_anchors.append(bboxes) + new_anchor_list.append(mlvl_anchors) + return new_anchor_list + + +@HEADS.register_module() +class CascadeRPNHead(BaseDenseHead): + """The CascadeRPNHead will predict more accurate region proposals, which is + required for two-stage detectors (such as Fast/Faster R-CNN). CascadeRPN + consists of a sequence of RPNStage to progressively improve the accuracy of + the detected proposals. + + More details can be found in ``https://arxiv.org/abs/1909.06720``. + + Args: + num_stages (int): number of CascadeRPN stages. + stages (list[dict]): list of configs to build the stages. + train_cfg (list[dict]): list of configs at training time each stage. + test_cfg (dict): config at testing time. + """ + + def __init__(self, num_stages, stages, train_cfg, test_cfg, init_cfg=None): + super(CascadeRPNHead, self).__init__(init_cfg) + assert num_stages == len(stages) + self.num_stages = num_stages + # Be careful! Pretrained weights cannot be loaded when use + # nn.ModuleList + self.stages = ModuleList() + for i in range(len(stages)): + train_cfg_i = train_cfg[i] if train_cfg is not None else None + stages[i].update(train_cfg=train_cfg_i) + stages[i].update(test_cfg=test_cfg) + self.stages.append(build_head(stages[i])) + self.train_cfg = train_cfg + self.test_cfg = test_cfg + + def loss(self): + """loss() is implemented in StageCascadeRPNHead.""" + pass + + def get_bboxes(self): + """get_bboxes() is implemented in StageCascadeRPNHead.""" + pass + + def forward_train(self, + x, + img_metas, + gt_bboxes, + gt_labels=None, + gt_bboxes_ignore=None, + proposal_cfg=None): + """Forward train function.""" + assert gt_labels is None, 'RPN does not require gt_labels' + + featmap_sizes = [featmap.size()[-2:] for featmap in x] + device = x[0].device + anchor_list, valid_flag_list = self.stages[0].get_anchors( + featmap_sizes, img_metas, device=device) + + losses = dict() + + for i in range(self.num_stages): + stage = self.stages[i] + + if stage.adapt_cfg['type'] == 'offset': + offset_list = stage.anchor_offset(anchor_list, + stage.anchor_strides, + featmap_sizes) + else: + offset_list = None + x, cls_score, bbox_pred = stage(x, offset_list) + rpn_loss_inputs = (anchor_list, valid_flag_list, cls_score, + bbox_pred, gt_bboxes, img_metas) + stage_loss = stage.loss(*rpn_loss_inputs) + for name, value in stage_loss.items(): + losses['s{}.{}'.format(i, name)] = value + + # refine boxes + if i < self.num_stages - 1: + anchor_list = stage.refine_bboxes(anchor_list, bbox_pred, + img_metas) + if proposal_cfg is None: + return losses + else: + proposal_list = self.stages[-1].get_bboxes(anchor_list, cls_score, + bbox_pred, img_metas, + self.test_cfg) + return losses, proposal_list + + def simple_test_rpn(self, x, img_metas): + """Simple forward test function.""" + featmap_sizes = [featmap.size()[-2:] for featmap in x] + device = x[0].device + anchor_list, _ = self.stages[0].get_anchors( + featmap_sizes, img_metas, device=device) + + for i in range(self.num_stages): + stage = self.stages[i] + if stage.adapt_cfg['type'] == 'offset': + offset_list = stage.anchor_offset(anchor_list, + stage.anchor_strides, + featmap_sizes) + else: + offset_list = None + x, cls_score, bbox_pred = stage(x, offset_list) + if i < self.num_stages - 1: + anchor_list = stage.refine_bboxes(anchor_list, bbox_pred, + img_metas) + + proposal_list = self.stages[-1].get_bboxes(anchor_list, cls_score, + bbox_pred, img_metas, + self.test_cfg) + return proposal_list + + def aug_test_rpn(self, x, img_metas): + """Augmented forward test function.""" + raise NotImplementedError( + 'CascadeRPNHead does not support test-time augmentation') diff --git a/mmdet/models/dense_heads/centernet_head.py b/mmdet/models/dense_heads/centernet_head.py new file mode 100644 index 0000000..b9d5d2f --- /dev/null +++ b/mmdet/models/dense_heads/centernet_head.py @@ -0,0 +1,412 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import bias_init_with_prob, normal_init +from mmcv.ops import batched_nms +from mmcv.runner import force_fp32 + +from mmdet.core import multi_apply +from mmdet.models import HEADS, build_loss +from mmdet.models.utils import gaussian_radius, gen_gaussian_target +from ..utils.gaussian_target import (get_local_maximum, get_topk_from_heatmap, + transpose_and_gather_feat) +from .base_dense_head import BaseDenseHead +from .dense_test_mixins import BBoxTestMixin + + +@HEADS.register_module() +class CenterNetHead(BaseDenseHead, BBoxTestMixin): + """Objects as Points Head. CenterHead use center_point to indicate object's + position. Paper link + + Args: + in_channel (int): Number of channel in the input feature map. + feat_channel (int): Number of channel in the intermediate feature map. + num_classes (int): Number of categories excluding the background + category. + loss_center_heatmap (dict | None): Config of center heatmap loss. + Default: GaussianFocalLoss. + loss_wh (dict | None): Config of wh loss. Default: L1Loss. + loss_offset (dict | None): Config of offset loss. Default: L1Loss. + train_cfg (dict | None): Training config. Useless in CenterNet, + but we keep this variable for SingleStageDetector. Default: None. + test_cfg (dict | None): Testing config of CenterNet. Default: None. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + in_channel, + feat_channel, + num_classes, + loss_center_heatmap=dict( + type='GaussianFocalLoss', loss_weight=1.0), + loss_wh=dict(type='L1Loss', loss_weight=0.1), + loss_offset=dict(type='L1Loss', loss_weight=1.0), + train_cfg=None, + test_cfg=None, + init_cfg=None): + super(CenterNetHead, self).__init__(init_cfg) + self.num_classes = num_classes + self.heatmap_head = self._build_head(in_channel, feat_channel, + num_classes) + self.wh_head = self._build_head(in_channel, feat_channel, 2) + self.offset_head = self._build_head(in_channel, feat_channel, 2) + + self.loss_center_heatmap = build_loss(loss_center_heatmap) + self.loss_wh = build_loss(loss_wh) + self.loss_offset = build_loss(loss_offset) + + self.train_cfg = train_cfg + self.test_cfg = test_cfg + self.fp16_enabled = False + + def _build_head(self, in_channel, feat_channel, out_channel): + """Build head for each branch.""" + layer = nn.Sequential( + nn.Conv2d(in_channel, feat_channel, kernel_size=3, padding=1), + nn.ReLU(inplace=True), + nn.Conv2d(feat_channel, out_channel, kernel_size=1)) + return layer + + def init_weights(self): + """Initialize weights of the head.""" + bias_init = bias_init_with_prob(0.1) + self.heatmap_head[-1].bias.data.fill_(bias_init) + for head in [self.wh_head, self.offset_head]: + for m in head.modules(): + if isinstance(m, nn.Conv2d): + normal_init(m, std=0.001) + + def forward(self, feats): + """Forward features. Notice CenterNet head does not use FPN. + + Args: + feats (tuple[Tensor]): Features from the upstream network, each is + a 4D-tensor. + + Returns: + center_heatmap_preds (List[Tensor]): center predict heatmaps for + all levels, the channels number is num_classes. + wh_preds (List[Tensor]): wh predicts for all levels, the channels + number is 2. + offset_preds (List[Tensor]): offset predicts for all levels, the + channels number is 2. + """ + return multi_apply(self.forward_single, feats) + + def forward_single(self, feat): + """Forward feature of a single level. + + Args: + feat (Tensor): Feature of a single level. + + Returns: + center_heatmap_pred (Tensor): center predict heatmaps, the + channels number is num_classes. + wh_pred (Tensor): wh predicts, the channels number is 2. + offset_pred (Tensor): offset predicts, the channels number is 2. + """ + center_heatmap_pred = self.heatmap_head(feat).sigmoid() + wh_pred = self.wh_head(feat) + offset_pred = self.offset_head(feat) + return center_heatmap_pred, wh_pred, offset_pred + + @force_fp32(apply_to=('center_heatmap_preds', 'wh_preds', 'offset_preds')) + def loss(self, + center_heatmap_preds, + wh_preds, + offset_preds, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Compute losses of the head. + + Args: + center_heatmap_preds (list[Tensor]): center predict heatmaps for + all levels with shape (B, num_classes, H, W). + wh_preds (list[Tensor]): wh predicts for all levels with + shape (B, 2, H, W). + offset_preds (list[Tensor]): offset predicts for all levels + with shape (B, 2, H, W). + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box. + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (None | list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. Default: None + + Returns: + dict[str, Tensor]: which has components below: + - loss_center_heatmap (Tensor): loss of center heatmap. + - loss_wh (Tensor): loss of hw heatmap + - loss_offset (Tensor): loss of offset heatmap. + """ + assert len(center_heatmap_preds) == len(wh_preds) == len( + offset_preds) == 1 + center_heatmap_pred = center_heatmap_preds[0] + wh_pred = wh_preds[0] + offset_pred = offset_preds[0] + + target_result, avg_factor = self.get_targets(gt_bboxes, gt_labels, + center_heatmap_pred.shape, + img_metas[0]['pad_shape']) + + center_heatmap_target = target_result['center_heatmap_target'] + wh_target = target_result['wh_target'] + offset_target = target_result['offset_target'] + wh_offset_target_weight = target_result['wh_offset_target_weight'] + + # Since the channel of wh_target and offset_target is 2, the avg_factor + # of loss_center_heatmap is always 1/2 of loss_wh and loss_offset. + loss_center_heatmap = self.loss_center_heatmap( + center_heatmap_pred, center_heatmap_target, avg_factor=avg_factor) + loss_wh = self.loss_wh( + wh_pred, + wh_target, + wh_offset_target_weight, + avg_factor=avg_factor * 2) + loss_offset = self.loss_offset( + offset_pred, + offset_target, + wh_offset_target_weight, + avg_factor=avg_factor * 2) + return dict( + loss_center_heatmap=loss_center_heatmap, + loss_wh=loss_wh, + loss_offset=loss_offset) + + def get_targets(self, gt_bboxes, gt_labels, feat_shape, img_shape): + """Compute regression and classification targets in multiple images. + + Args: + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box. + feat_shape (list[int]): feature map shape with value [B, _, H, W] + img_shape (list[int]): image shape in [h, w] format. + + Returns: + tuple[dict,float]: The float value is mean avg_factor, the dict has + components below: + - center_heatmap_target (Tensor): targets of center heatmap, \ + shape (B, num_classes, H, W). + - wh_target (Tensor): targets of wh predict, shape \ + (B, 2, H, W). + - offset_target (Tensor): targets of offset predict, shape \ + (B, 2, H, W). + - wh_offset_target_weight (Tensor): weights of wh and offset \ + predict, shape (B, 2, H, W). + """ + img_h, img_w = img_shape[:2] + bs, _, feat_h, feat_w = feat_shape + + width_ratio = float(feat_w / img_w) + height_ratio = float(feat_h / img_h) + + center_heatmap_target = gt_bboxes[-1].new_zeros( + [bs, self.num_classes, feat_h, feat_w]) + wh_target = gt_bboxes[-1].new_zeros([bs, 2, feat_h, feat_w]) + offset_target = gt_bboxes[-1].new_zeros([bs, 2, feat_h, feat_w]) + wh_offset_target_weight = gt_bboxes[-1].new_zeros( + [bs, 2, feat_h, feat_w]) + + for batch_id in range(bs): + gt_bbox = gt_bboxes[batch_id] + gt_label = gt_labels[batch_id] + center_x = (gt_bbox[:, [0]] + gt_bbox[:, [2]]) * width_ratio / 2 + center_y = (gt_bbox[:, [1]] + gt_bbox[:, [3]]) * height_ratio / 2 + gt_centers = torch.cat((center_x, center_y), dim=1) + + for j, ct in enumerate(gt_centers): + ctx_int, cty_int = ct.int() + ctx, cty = ct + scale_box_h = (gt_bbox[j][3] - gt_bbox[j][1]) * height_ratio + scale_box_w = (gt_bbox[j][2] - gt_bbox[j][0]) * width_ratio + radius = gaussian_radius([scale_box_h, scale_box_w], + min_overlap=0.3) + radius = max(0, int(radius)) + ind = gt_label[j] + gen_gaussian_target(center_heatmap_target[batch_id, ind], + [ctx_int, cty_int], radius) + + wh_target[batch_id, 0, cty_int, ctx_int] = scale_box_w + wh_target[batch_id, 1, cty_int, ctx_int] = scale_box_h + + offset_target[batch_id, 0, cty_int, ctx_int] = ctx - ctx_int + offset_target[batch_id, 1, cty_int, ctx_int] = cty - cty_int + + wh_offset_target_weight[batch_id, :, cty_int, ctx_int] = 1 + + avg_factor = max(1, center_heatmap_target.eq(1).sum()) + target_result = dict( + center_heatmap_target=center_heatmap_target, + wh_target=wh_target, + offset_target=offset_target, + wh_offset_target_weight=wh_offset_target_weight) + return target_result, avg_factor + + @force_fp32(apply_to=('center_heatmap_preds', 'wh_preds', 'offset_preds')) + def get_bboxes(self, + center_heatmap_preds, + wh_preds, + offset_preds, + img_metas, + rescale=True, + with_nms=False): + """Transform network output for a batch into bbox predictions. + + Args: + center_heatmap_preds (list[Tensor]): Center predict heatmaps for + all levels with shape (B, num_classes, H, W). + wh_preds (list[Tensor]): WH predicts for all levels with + shape (B, 2, H, W). + offset_preds (list[Tensor]): Offset predicts for all levels + with shape (B, 2, H, W). + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + rescale (bool): If True, return boxes in original image space. + Default: True. + with_nms (bool): If True, do nms before return boxes. + Default: False. + + Returns: + list[tuple[Tensor, Tensor]]: Each item in result_list is 2-tuple. + The first item is an (n, 5) tensor, where 5 represent + (tl_x, tl_y, br_x, br_y, score) and the score between 0 and 1. + The shape of the second tensor in the tuple is (n,), and + each element represents the class label of the corresponding + box. + """ + assert len(center_heatmap_preds) == len(wh_preds) == len( + offset_preds) == 1 + result_list = [] + for img_id in range(len(img_metas)): + result_list.append( + self._get_bboxes_single( + center_heatmap_preds[0][img_id:img_id + 1, ...], + wh_preds[0][img_id:img_id + 1, ...], + offset_preds[0][img_id:img_id + 1, ...], + img_metas[img_id], + rescale=rescale, + with_nms=with_nms)) + return result_list + + def _get_bboxes_single(self, + center_heatmap_pred, + wh_pred, + offset_pred, + img_meta, + rescale=False, + with_nms=True): + """Transform outputs of a single image into bbox results. + + Args: + center_heatmap_pred (Tensor): Center heatmap for current level with + shape (1, num_classes, H, W). + wh_pred (Tensor): WH heatmap for current level with shape + (1, num_classes, H, W). + offset_pred (Tensor): Offset for current level with shape + (1, corner_offset_channels, H, W). + img_meta (dict): Meta information of current image, e.g., + image size, scaling factor, etc. + rescale (bool): If True, return boxes in original image space. + Default: False. + with_nms (bool): If True, do nms before return boxes. + Default: True. + + Returns: + tuple[Tensor, Tensor]: The first item is an (n, 5) tensor, where + 5 represent (tl_x, tl_y, br_x, br_y, score) and the score + between 0 and 1. The shape of the second tensor in the tuple + is (n,), and each element represents the class label of the + corresponding box. + """ + batch_det_bboxes, batch_labels = self.decode_heatmap( + center_heatmap_pred, + wh_pred, + offset_pred, + img_meta['batch_input_shape'], + k=self.test_cfg.topk, + kernel=self.test_cfg.local_maximum_kernel) + + det_bboxes = batch_det_bboxes.view([-1, 5]) + det_labels = batch_labels.view(-1) + + batch_border = det_bboxes.new_tensor(img_meta['border'])[..., + [2, 0, 2, 0]] + det_bboxes[..., :4] -= batch_border + + if rescale: + det_bboxes[..., :4] /= det_bboxes.new_tensor( + img_meta['scale_factor']) + + if with_nms: + det_bboxes, det_labels = self._bboxes_nms(det_bboxes, det_labels, + self.test_cfg) + return det_bboxes, det_labels + + def decode_heatmap(self, + center_heatmap_pred, + wh_pred, + offset_pred, + img_shape, + k=100, + kernel=3): + """Transform outputs into detections raw bbox prediction. + + Args: + center_heatmap_pred (Tensor): center predict heatmap, + shape (B, num_classes, H, W). + wh_pred (Tensor): wh predict, shape (B, 2, H, W). + offset_pred (Tensor): offset predict, shape (B, 2, H, W). + img_shape (list[int]): image shape in [h, w] format. + k (int): Get top k center keypoints from heatmap. Default 100. + kernel (int): Max pooling kernel for extract local maximum pixels. + Default 3. + + Returns: + tuple[torch.Tensor]: Decoded output of CenterNetHead, containing + the following Tensors: + + - batch_bboxes (Tensor): Coords of each box with shape (B, k, 5) + - batch_topk_labels (Tensor): Categories of each box with \ + shape (B, k) + """ + height, width = center_heatmap_pred.shape[2:] + inp_h, inp_w = img_shape + + center_heatmap_pred = get_local_maximum( + center_heatmap_pred, kernel=kernel) + + *batch_dets, topk_ys, topk_xs = get_topk_from_heatmap( + center_heatmap_pred, k=k) + batch_scores, batch_index, batch_topk_labels = batch_dets + + wh = transpose_and_gather_feat(wh_pred, batch_index) + offset = transpose_and_gather_feat(offset_pred, batch_index) + topk_xs = topk_xs + offset[..., 0] + topk_ys = topk_ys + offset[..., 1] + tl_x = (topk_xs - wh[..., 0] / 2) * (inp_w / width) + tl_y = (topk_ys - wh[..., 1] / 2) * (inp_h / height) + br_x = (topk_xs + wh[..., 0] / 2) * (inp_w / width) + br_y = (topk_ys + wh[..., 1] / 2) * (inp_h / height) + + batch_bboxes = torch.stack([tl_x, tl_y, br_x, br_y], dim=2) + batch_bboxes = torch.cat((batch_bboxes, batch_scores[..., None]), + dim=-1) + return batch_bboxes, batch_topk_labels + + def _bboxes_nms(self, bboxes, labels, cfg): + if labels.numel() > 0: + max_num = cfg.max_per_img + bboxes, keep = batched_nms(bboxes[:, :4], bboxes[:, + -1].contiguous(), + labels, cfg.nms) + if max_num > 0: + bboxes = bboxes[:max_num] + labels = labels[keep][:max_num] + + return bboxes, labels diff --git a/mmdet/models/dense_heads/centripetal_head.py b/mmdet/models/dense_heads/centripetal_head.py new file mode 100644 index 0000000..ebc721b --- /dev/null +++ b/mmdet/models/dense_heads/centripetal_head.py @@ -0,0 +1,430 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +from mmcv.cnn import ConvModule, normal_init +from mmcv.ops import DeformConv2d +from mmcv.runner import force_fp32 + +from mmdet.core import multi_apply +from ..builder import HEADS, build_loss +from .corner_head import CornerHead + + +@HEADS.register_module() +class CentripetalHead(CornerHead): + """Head of CentripetalNet: Pursuing High-quality Keypoint Pairs for Object + Detection. + + CentripetalHead inherits from :class:`CornerHead`. It removes the + embedding branch and adds guiding shift and centripetal shift branches. + More details can be found in the `paper + `_ . + + Args: + num_classes (int): Number of categories excluding the background + category. + in_channels (int): Number of channels in the input feature map. + num_feat_levels (int): Levels of feature from the previous module. 2 + for HourglassNet-104 and 1 for HourglassNet-52. HourglassNet-104 + outputs the final feature and intermediate supervision feature and + HourglassNet-52 only outputs the final feature. Default: 2. + corner_emb_channels (int): Channel of embedding vector. Default: 1. + train_cfg (dict | None): Training config. Useless in CornerHead, + but we keep this variable for SingleStageDetector. Default: None. + test_cfg (dict | None): Testing config of CornerHead. Default: None. + loss_heatmap (dict | None): Config of corner heatmap loss. Default: + GaussianFocalLoss. + loss_embedding (dict | None): Config of corner embedding loss. Default: + AssociativeEmbeddingLoss. + loss_offset (dict | None): Config of corner offset loss. Default: + SmoothL1Loss. + loss_guiding_shift (dict): Config of guiding shift loss. Default: + SmoothL1Loss. + loss_centripetal_shift (dict): Config of centripetal shift loss. + Default: SmoothL1Loss. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + *args, + centripetal_shift_channels=2, + guiding_shift_channels=2, + feat_adaption_conv_kernel=3, + loss_guiding_shift=dict( + type='SmoothL1Loss', beta=1.0, loss_weight=0.05), + loss_centripetal_shift=dict( + type='SmoothL1Loss', beta=1.0, loss_weight=1), + init_cfg=None, + **kwargs): + assert init_cfg is None, 'To prevent abnormal initialization ' \ + 'behavior, init_cfg is not allowed to be set' + assert centripetal_shift_channels == 2, ( + 'CentripetalHead only support centripetal_shift_channels == 2') + self.centripetal_shift_channels = centripetal_shift_channels + assert guiding_shift_channels == 2, ( + 'CentripetalHead only support guiding_shift_channels == 2') + self.guiding_shift_channels = guiding_shift_channels + self.feat_adaption_conv_kernel = feat_adaption_conv_kernel + super(CentripetalHead, self).__init__( + *args, init_cfg=init_cfg, **kwargs) + self.loss_guiding_shift = build_loss(loss_guiding_shift) + self.loss_centripetal_shift = build_loss(loss_centripetal_shift) + + def _init_centripetal_layers(self): + """Initialize centripetal layers. + + Including feature adaption deform convs (feat_adaption), deform offset + prediction convs (dcn_off), guiding shift (guiding_shift) and + centripetal shift ( centripetal_shift). Each branch has two parts: + prefix `tl_` for top-left and `br_` for bottom-right. + """ + self.tl_feat_adaption = nn.ModuleList() + self.br_feat_adaption = nn.ModuleList() + self.tl_dcn_offset = nn.ModuleList() + self.br_dcn_offset = nn.ModuleList() + self.tl_guiding_shift = nn.ModuleList() + self.br_guiding_shift = nn.ModuleList() + self.tl_centripetal_shift = nn.ModuleList() + self.br_centripetal_shift = nn.ModuleList() + + for _ in range(self.num_feat_levels): + self.tl_feat_adaption.append( + DeformConv2d(self.in_channels, self.in_channels, + self.feat_adaption_conv_kernel, 1, 1)) + self.br_feat_adaption.append( + DeformConv2d(self.in_channels, self.in_channels, + self.feat_adaption_conv_kernel, 1, 1)) + + self.tl_guiding_shift.append( + self._make_layers( + out_channels=self.guiding_shift_channels, + in_channels=self.in_channels)) + self.br_guiding_shift.append( + self._make_layers( + out_channels=self.guiding_shift_channels, + in_channels=self.in_channels)) + + self.tl_dcn_offset.append( + ConvModule( + self.guiding_shift_channels, + self.feat_adaption_conv_kernel**2 * + self.guiding_shift_channels, + 1, + bias=False, + act_cfg=None)) + self.br_dcn_offset.append( + ConvModule( + self.guiding_shift_channels, + self.feat_adaption_conv_kernel**2 * + self.guiding_shift_channels, + 1, + bias=False, + act_cfg=None)) + + self.tl_centripetal_shift.append( + self._make_layers( + out_channels=self.centripetal_shift_channels, + in_channels=self.in_channels)) + self.br_centripetal_shift.append( + self._make_layers( + out_channels=self.centripetal_shift_channels, + in_channels=self.in_channels)) + + def _init_layers(self): + """Initialize layers for CentripetalHead. + + Including two parts: CornerHead layers and CentripetalHead layers + """ + super()._init_layers() # using _init_layers in CornerHead + self._init_centripetal_layers() + + def init_weights(self): + super(CentripetalHead, self).init_weights() + for i in range(self.num_feat_levels): + normal_init(self.tl_feat_adaption[i], std=0.01) + normal_init(self.br_feat_adaption[i], std=0.01) + normal_init(self.tl_dcn_offset[i].conv, std=0.1) + normal_init(self.br_dcn_offset[i].conv, std=0.1) + _ = [x.conv.reset_parameters() for x in self.tl_guiding_shift[i]] + _ = [x.conv.reset_parameters() for x in self.br_guiding_shift[i]] + _ = [ + x.conv.reset_parameters() for x in self.tl_centripetal_shift[i] + ] + _ = [ + x.conv.reset_parameters() for x in self.br_centripetal_shift[i] + ] + + def forward_single(self, x, lvl_ind): + """Forward feature of a single level. + + Args: + x (Tensor): Feature of a single level. + lvl_ind (int): Level index of current feature. + + Returns: + tuple[Tensor]: A tuple of CentripetalHead's output for current + feature level. Containing the following Tensors: + + - tl_heat (Tensor): Predicted top-left corner heatmap. + - br_heat (Tensor): Predicted bottom-right corner heatmap. + - tl_off (Tensor): Predicted top-left offset heatmap. + - br_off (Tensor): Predicted bottom-right offset heatmap. + - tl_guiding_shift (Tensor): Predicted top-left guiding shift + heatmap. + - br_guiding_shift (Tensor): Predicted bottom-right guiding + shift heatmap. + - tl_centripetal_shift (Tensor): Predicted top-left centripetal + shift heatmap. + - br_centripetal_shift (Tensor): Predicted bottom-right + centripetal shift heatmap. + """ + tl_heat, br_heat, _, _, tl_off, br_off, tl_pool, br_pool = super( + ).forward_single( + x, lvl_ind, return_pool=True) + + tl_guiding_shift = self.tl_guiding_shift[lvl_ind](tl_pool) + br_guiding_shift = self.br_guiding_shift[lvl_ind](br_pool) + + tl_dcn_offset = self.tl_dcn_offset[lvl_ind](tl_guiding_shift.detach()) + br_dcn_offset = self.br_dcn_offset[lvl_ind](br_guiding_shift.detach()) + + tl_feat_adaption = self.tl_feat_adaption[lvl_ind](tl_pool, + tl_dcn_offset) + br_feat_adaption = self.br_feat_adaption[lvl_ind](br_pool, + br_dcn_offset) + + tl_centripetal_shift = self.tl_centripetal_shift[lvl_ind]( + tl_feat_adaption) + br_centripetal_shift = self.br_centripetal_shift[lvl_ind]( + br_feat_adaption) + + result_list = [ + tl_heat, br_heat, tl_off, br_off, tl_guiding_shift, + br_guiding_shift, tl_centripetal_shift, br_centripetal_shift + ] + return result_list + + @force_fp32() + def loss(self, + tl_heats, + br_heats, + tl_offs, + br_offs, + tl_guiding_shifts, + br_guiding_shifts, + tl_centripetal_shifts, + br_centripetal_shifts, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Compute losses of the head. + + Args: + tl_heats (list[Tensor]): Top-left corner heatmaps for each level + with shape (N, num_classes, H, W). + br_heats (list[Tensor]): Bottom-right corner heatmaps for each + level with shape (N, num_classes, H, W). + tl_offs (list[Tensor]): Top-left corner offsets for each level + with shape (N, corner_offset_channels, H, W). + br_offs (list[Tensor]): Bottom-right corner offsets for each level + with shape (N, corner_offset_channels, H, W). + tl_guiding_shifts (list[Tensor]): Top-left guiding shifts for each + level with shape (N, guiding_shift_channels, H, W). + br_guiding_shifts (list[Tensor]): Bottom-right guiding shifts for + each level with shape (N, guiding_shift_channels, H, W). + tl_centripetal_shifts (list[Tensor]): Top-left centripetal shifts + for each level with shape (N, centripetal_shift_channels, H, + W). + br_centripetal_shifts (list[Tensor]): Bottom-right centripetal + shifts for each level with shape (N, + centripetal_shift_channels, H, W). + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [left, top, right, bottom] format. + gt_labels (list[Tensor]): Class indices corresponding to each box. + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (list[Tensor] | None): Specify which bounding + boxes can be ignored when computing the loss. + + Returns: + dict[str, Tensor]: A dictionary of loss components. Containing the + following losses: + + - det_loss (list[Tensor]): Corner keypoint losses of all + feature levels. + - off_loss (list[Tensor]): Corner offset losses of all feature + levels. + - guiding_loss (list[Tensor]): Guiding shift losses of all + feature levels. + - centripetal_loss (list[Tensor]): Centripetal shift losses of + all feature levels. + """ + targets = self.get_targets( + gt_bboxes, + gt_labels, + tl_heats[-1].shape, + img_metas[0]['pad_shape'], + with_corner_emb=self.with_corner_emb, + with_guiding_shift=True, + with_centripetal_shift=True) + mlvl_targets = [targets for _ in range(self.num_feat_levels)] + [det_losses, off_losses, guiding_losses, centripetal_losses + ] = multi_apply(self.loss_single, tl_heats, br_heats, tl_offs, + br_offs, tl_guiding_shifts, br_guiding_shifts, + tl_centripetal_shifts, br_centripetal_shifts, + mlvl_targets) + loss_dict = dict( + det_loss=det_losses, + off_loss=off_losses, + guiding_loss=guiding_losses, + centripetal_loss=centripetal_losses) + return loss_dict + + def loss_single(self, tl_hmp, br_hmp, tl_off, br_off, tl_guiding_shift, + br_guiding_shift, tl_centripetal_shift, + br_centripetal_shift, targets): + """Compute losses for single level. + + Args: + tl_hmp (Tensor): Top-left corner heatmap for current level with + shape (N, num_classes, H, W). + br_hmp (Tensor): Bottom-right corner heatmap for current level with + shape (N, num_classes, H, W). + tl_off (Tensor): Top-left corner offset for current level with + shape (N, corner_offset_channels, H, W). + br_off (Tensor): Bottom-right corner offset for current level with + shape (N, corner_offset_channels, H, W). + tl_guiding_shift (Tensor): Top-left guiding shift for current level + with shape (N, guiding_shift_channels, H, W). + br_guiding_shift (Tensor): Bottom-right guiding shift for current + level with shape (N, guiding_shift_channels, H, W). + tl_centripetal_shift (Tensor): Top-left centripetal shift for + current level with shape (N, centripetal_shift_channels, H, W). + br_centripetal_shift (Tensor): Bottom-right centripetal shift for + current level with shape (N, centripetal_shift_channels, H, W). + targets (dict): Corner target generated by `get_targets`. + + Returns: + tuple[torch.Tensor]: Losses of the head's different branches + containing the following losses: + + - det_loss (Tensor): Corner keypoint loss. + - off_loss (Tensor): Corner offset loss. + - guiding_loss (Tensor): Guiding shift loss. + - centripetal_loss (Tensor): Centripetal shift loss. + """ + targets['corner_embedding'] = None + + det_loss, _, _, off_loss = super().loss_single(tl_hmp, br_hmp, None, + None, tl_off, br_off, + targets) + + gt_tl_guiding_shift = targets['topleft_guiding_shift'] + gt_br_guiding_shift = targets['bottomright_guiding_shift'] + gt_tl_centripetal_shift = targets['topleft_centripetal_shift'] + gt_br_centripetal_shift = targets['bottomright_centripetal_shift'] + + gt_tl_heatmap = targets['topleft_heatmap'] + gt_br_heatmap = targets['bottomright_heatmap'] + # We only compute the offset loss at the real corner position. + # The value of real corner would be 1 in heatmap ground truth. + # The mask is computed in class agnostic mode and its shape is + # batch * 1 * width * height. + tl_mask = gt_tl_heatmap.eq(1).sum(1).gt(0).unsqueeze(1).type_as( + gt_tl_heatmap) + br_mask = gt_br_heatmap.eq(1).sum(1).gt(0).unsqueeze(1).type_as( + gt_br_heatmap) + + # Guiding shift loss + tl_guiding_loss = self.loss_guiding_shift( + tl_guiding_shift, + gt_tl_guiding_shift, + tl_mask, + avg_factor=tl_mask.sum()) + br_guiding_loss = self.loss_guiding_shift( + br_guiding_shift, + gt_br_guiding_shift, + br_mask, + avg_factor=br_mask.sum()) + guiding_loss = (tl_guiding_loss + br_guiding_loss) / 2.0 + # Centripetal shift loss + tl_centripetal_loss = self.loss_centripetal_shift( + tl_centripetal_shift, + gt_tl_centripetal_shift, + tl_mask, + avg_factor=tl_mask.sum()) + br_centripetal_loss = self.loss_centripetal_shift( + br_centripetal_shift, + gt_br_centripetal_shift, + br_mask, + avg_factor=br_mask.sum()) + centripetal_loss = (tl_centripetal_loss + br_centripetal_loss) / 2.0 + + return det_loss, off_loss, guiding_loss, centripetal_loss + + @force_fp32() + def get_bboxes(self, + tl_heats, + br_heats, + tl_offs, + br_offs, + tl_guiding_shifts, + br_guiding_shifts, + tl_centripetal_shifts, + br_centripetal_shifts, + img_metas, + rescale=False, + with_nms=True): + """Transform network output for a batch into bbox predictions. + + Args: + tl_heats (list[Tensor]): Top-left corner heatmaps for each level + with shape (N, num_classes, H, W). + br_heats (list[Tensor]): Bottom-right corner heatmaps for each + level with shape (N, num_classes, H, W). + tl_offs (list[Tensor]): Top-left corner offsets for each level + with shape (N, corner_offset_channels, H, W). + br_offs (list[Tensor]): Bottom-right corner offsets for each level + with shape (N, corner_offset_channels, H, W). + tl_guiding_shifts (list[Tensor]): Top-left guiding shifts for each + level with shape (N, guiding_shift_channels, H, W). Useless in + this function, we keep this arg because it's the raw output + from CentripetalHead. + br_guiding_shifts (list[Tensor]): Bottom-right guiding shifts for + each level with shape (N, guiding_shift_channels, H, W). + Useless in this function, we keep this arg because it's the + raw output from CentripetalHead. + tl_centripetal_shifts (list[Tensor]): Top-left centripetal shifts + for each level with shape (N, centripetal_shift_channels, H, + W). + br_centripetal_shifts (list[Tensor]): Bottom-right centripetal + shifts for each level with shape (N, + centripetal_shift_channels, H, W). + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + rescale (bool): If True, return boxes in original image space. + Default: False. + with_nms (bool): If True, do nms before return boxes. + Default: True. + """ + assert tl_heats[-1].shape[0] == br_heats[-1].shape[0] == len(img_metas) + result_list = [] + for img_id in range(len(img_metas)): + result_list.append( + self._get_bboxes_single( + tl_heats[-1][img_id:img_id + 1, :], + br_heats[-1][img_id:img_id + 1, :], + tl_offs[-1][img_id:img_id + 1, :], + br_offs[-1][img_id:img_id + 1, :], + img_metas[img_id], + tl_emb=None, + br_emb=None, + tl_centripetal_shift=tl_centripetal_shifts[-1][ + img_id:img_id + 1, :], + br_centripetal_shift=br_centripetal_shifts[-1][ + img_id:img_id + 1, :], + rescale=rescale, + with_nms=with_nms)) + + return result_list diff --git a/mmdet/models/dense_heads/corner_head.py b/mmdet/models/dense_heads/corner_head.py new file mode 100644 index 0000000..c6a2866 --- /dev/null +++ b/mmdet/models/dense_heads/corner_head.py @@ -0,0 +1,1086 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from logging import warning +from math import ceil, log + +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule, bias_init_with_prob +from mmcv.ops import CornerPool, batched_nms +from mmcv.runner import BaseModule, force_fp32 + +from mmdet.core import multi_apply +from ..builder import HEADS, build_loss +from ..utils import gaussian_radius, gen_gaussian_target +from ..utils.gaussian_target import (gather_feat, get_local_maximum, + get_topk_from_heatmap, + transpose_and_gather_feat) +from .base_dense_head import BaseDenseHead +from .dense_test_mixins import BBoxTestMixin + + +class BiCornerPool(BaseModule): + """Bidirectional Corner Pooling Module (TopLeft, BottomRight, etc.) + + Args: + in_channels (int): Input channels of module. + out_channels (int): Output channels of module. + feat_channels (int): Feature channels of module. + directions (list[str]): Directions of two CornerPools. + norm_cfg (dict): Dictionary to construct and config norm layer. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + in_channels, + directions, + feat_channels=128, + out_channels=128, + norm_cfg=dict(type='BN', requires_grad=True), + init_cfg=None): + super(BiCornerPool, self).__init__(init_cfg) + self.direction1_conv = ConvModule( + in_channels, feat_channels, 3, padding=1, norm_cfg=norm_cfg) + self.direction2_conv = ConvModule( + in_channels, feat_channels, 3, padding=1, norm_cfg=norm_cfg) + + self.aftpool_conv = ConvModule( + feat_channels, + out_channels, + 3, + padding=1, + norm_cfg=norm_cfg, + act_cfg=None) + + self.conv1 = ConvModule( + in_channels, out_channels, 1, norm_cfg=norm_cfg, act_cfg=None) + self.conv2 = ConvModule( + in_channels, out_channels, 3, padding=1, norm_cfg=norm_cfg) + + self.direction1_pool = CornerPool(directions[0]) + self.direction2_pool = CornerPool(directions[1]) + self.relu = nn.ReLU(inplace=True) + + def forward(self, x): + """Forward features from the upstream network. + + Args: + x (tensor): Input feature of BiCornerPool. + + Returns: + conv2 (tensor): Output feature of BiCornerPool. + """ + direction1_conv = self.direction1_conv(x) + direction2_conv = self.direction2_conv(x) + direction1_feat = self.direction1_pool(direction1_conv) + direction2_feat = self.direction2_pool(direction2_conv) + aftpool_conv = self.aftpool_conv(direction1_feat + direction2_feat) + conv1 = self.conv1(x) + relu = self.relu(aftpool_conv + conv1) + conv2 = self.conv2(relu) + return conv2 + + +@HEADS.register_module() +class CornerHead(BaseDenseHead, BBoxTestMixin): + """Head of CornerNet: Detecting Objects as Paired Keypoints. + + Code is modified from the `official github repo + `_ . + + More details can be found in the `paper + `_ . + + Args: + num_classes (int): Number of categories excluding the background + category. + in_channels (int): Number of channels in the input feature map. + num_feat_levels (int): Levels of feature from the previous module. 2 + for HourglassNet-104 and 1 for HourglassNet-52. Because + HourglassNet-104 outputs the final feature and intermediate + supervision feature and HourglassNet-52 only outputs the final + feature. Default: 2. + corner_emb_channels (int): Channel of embedding vector. Default: 1. + train_cfg (dict | None): Training config. Useless in CornerHead, + but we keep this variable for SingleStageDetector. Default: None. + test_cfg (dict | None): Testing config of CornerHead. Default: None. + loss_heatmap (dict | None): Config of corner heatmap loss. Default: + GaussianFocalLoss. + loss_embedding (dict | None): Config of corner embedding loss. Default: + AssociativeEmbeddingLoss. + loss_offset (dict | None): Config of corner offset loss. Default: + SmoothL1Loss. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + num_classes, + in_channels, + num_feat_levels=2, + corner_emb_channels=1, + train_cfg=None, + test_cfg=None, + loss_heatmap=dict( + type='GaussianFocalLoss', + alpha=2.0, + gamma=4.0, + loss_weight=1), + loss_embedding=dict( + type='AssociativeEmbeddingLoss', + pull_weight=0.25, + push_weight=0.25), + loss_offset=dict( + type='SmoothL1Loss', beta=1.0, loss_weight=1), + init_cfg=None): + assert init_cfg is None, 'To prevent abnormal initialization ' \ + 'behavior, init_cfg is not allowed to be set' + super(CornerHead, self).__init__(init_cfg) + self.num_classes = num_classes + self.in_channels = in_channels + self.corner_emb_channels = corner_emb_channels + self.with_corner_emb = self.corner_emb_channels > 0 + self.corner_offset_channels = 2 + self.num_feat_levels = num_feat_levels + self.loss_heatmap = build_loss( + loss_heatmap) if loss_heatmap is not None else None + self.loss_embedding = build_loss( + loss_embedding) if loss_embedding is not None else None + self.loss_offset = build_loss( + loss_offset) if loss_offset is not None else None + self.train_cfg = train_cfg + self.test_cfg = test_cfg + + self.fp16_enabled = False + self._init_layers() + + def _make_layers(self, out_channels, in_channels=256, feat_channels=256): + """Initialize conv sequential for CornerHead.""" + return nn.Sequential( + ConvModule(in_channels, feat_channels, 3, padding=1), + ConvModule( + feat_channels, out_channels, 1, norm_cfg=None, act_cfg=None)) + + def _init_corner_kpt_layers(self): + """Initialize corner keypoint layers. + + Including corner heatmap branch and corner offset branch. Each branch + has two parts: prefix `tl_` for top-left and `br_` for bottom-right. + """ + self.tl_pool, self.br_pool = nn.ModuleList(), nn.ModuleList() + self.tl_heat, self.br_heat = nn.ModuleList(), nn.ModuleList() + self.tl_off, self.br_off = nn.ModuleList(), nn.ModuleList() + + for _ in range(self.num_feat_levels): + self.tl_pool.append( + BiCornerPool( + self.in_channels, ['top', 'left'], + out_channels=self.in_channels)) + self.br_pool.append( + BiCornerPool( + self.in_channels, ['bottom', 'right'], + out_channels=self.in_channels)) + + self.tl_heat.append( + self._make_layers( + out_channels=self.num_classes, + in_channels=self.in_channels)) + self.br_heat.append( + self._make_layers( + out_channels=self.num_classes, + in_channels=self.in_channels)) + + self.tl_off.append( + self._make_layers( + out_channels=self.corner_offset_channels, + in_channels=self.in_channels)) + self.br_off.append( + self._make_layers( + out_channels=self.corner_offset_channels, + in_channels=self.in_channels)) + + def _init_corner_emb_layers(self): + """Initialize corner embedding layers. + + Only include corner embedding branch with two parts: prefix `tl_` for + top-left and `br_` for bottom-right. + """ + self.tl_emb, self.br_emb = nn.ModuleList(), nn.ModuleList() + + for _ in range(self.num_feat_levels): + self.tl_emb.append( + self._make_layers( + out_channels=self.corner_emb_channels, + in_channels=self.in_channels)) + self.br_emb.append( + self._make_layers( + out_channels=self.corner_emb_channels, + in_channels=self.in_channels)) + + def _init_layers(self): + """Initialize layers for CornerHead. + + Including two parts: corner keypoint layers and corner embedding layers + """ + self._init_corner_kpt_layers() + if self.with_corner_emb: + self._init_corner_emb_layers() + + def init_weights(self): + super(CornerHead, self).init_weights() + bias_init = bias_init_with_prob(0.1) + for i in range(self.num_feat_levels): + # The initialization of parameters are different between + # nn.Conv2d and ConvModule. Our experiments show that + # using the original initialization of nn.Conv2d increases + # the final mAP by about 0.2% + self.tl_heat[i][-1].conv.reset_parameters() + self.tl_heat[i][-1].conv.bias.data.fill_(bias_init) + self.br_heat[i][-1].conv.reset_parameters() + self.br_heat[i][-1].conv.bias.data.fill_(bias_init) + self.tl_off[i][-1].conv.reset_parameters() + self.br_off[i][-1].conv.reset_parameters() + if self.with_corner_emb: + self.tl_emb[i][-1].conv.reset_parameters() + self.br_emb[i][-1].conv.reset_parameters() + + def forward(self, feats): + """Forward features from the upstream network. + + Args: + feats (tuple[Tensor]): Features from the upstream network, each is + a 4D-tensor. + + Returns: + tuple: Usually a tuple of corner heatmaps, offset heatmaps and + embedding heatmaps. + - tl_heats (list[Tensor]): Top-left corner heatmaps for all + levels, each is a 4D-tensor, the channels number is + num_classes. + - br_heats (list[Tensor]): Bottom-right corner heatmaps for all + levels, each is a 4D-tensor, the channels number is + num_classes. + - tl_embs (list[Tensor] | list[None]): Top-left embedding + heatmaps for all levels, each is a 4D-tensor or None. + If not None, the channels number is corner_emb_channels. + - br_embs (list[Tensor] | list[None]): Bottom-right embedding + heatmaps for all levels, each is a 4D-tensor or None. + If not None, the channels number is corner_emb_channels. + - tl_offs (list[Tensor]): Top-left offset heatmaps for all + levels, each is a 4D-tensor. The channels number is + corner_offset_channels. + - br_offs (list[Tensor]): Bottom-right offset heatmaps for all + levels, each is a 4D-tensor. The channels number is + corner_offset_channels. + """ + lvl_ind = list(range(self.num_feat_levels)) + return multi_apply(self.forward_single, feats, lvl_ind) + + def forward_single(self, x, lvl_ind, return_pool=False): + """Forward feature of a single level. + + Args: + x (Tensor): Feature of a single level. + lvl_ind (int): Level index of current feature. + return_pool (bool): Return corner pool feature or not. + + Returns: + tuple[Tensor]: A tuple of CornerHead's output for current feature + level. Containing the following Tensors: + + - tl_heat (Tensor): Predicted top-left corner heatmap. + - br_heat (Tensor): Predicted bottom-right corner heatmap. + - tl_emb (Tensor | None): Predicted top-left embedding heatmap. + None for `self.with_corner_emb == False`. + - br_emb (Tensor | None): Predicted bottom-right embedding + heatmap. None for `self.with_corner_emb == False`. + - tl_off (Tensor): Predicted top-left offset heatmap. + - br_off (Tensor): Predicted bottom-right offset heatmap. + - tl_pool (Tensor): Top-left corner pool feature. Not must + have. + - br_pool (Tensor): Bottom-right corner pool feature. Not must + have. + """ + tl_pool = self.tl_pool[lvl_ind](x) + tl_heat = self.tl_heat[lvl_ind](tl_pool) + br_pool = self.br_pool[lvl_ind](x) + br_heat = self.br_heat[lvl_ind](br_pool) + + tl_emb, br_emb = None, None + if self.with_corner_emb: + tl_emb = self.tl_emb[lvl_ind](tl_pool) + br_emb = self.br_emb[lvl_ind](br_pool) + + tl_off = self.tl_off[lvl_ind](tl_pool) + br_off = self.br_off[lvl_ind](br_pool) + + result_list = [tl_heat, br_heat, tl_emb, br_emb, tl_off, br_off] + if return_pool: + result_list.append(tl_pool) + result_list.append(br_pool) + + return result_list + + def get_targets(self, + gt_bboxes, + gt_labels, + feat_shape, + img_shape, + with_corner_emb=False, + with_guiding_shift=False, + with_centripetal_shift=False): + """Generate corner targets. + + Including corner heatmap, corner offset. + + Optional: corner embedding, corner guiding shift, centripetal shift. + + For CornerNet, we generate corner heatmap, corner offset and corner + embedding from this function. + + For CentripetalNet, we generate corner heatmap, corner offset, guiding + shift and centripetal shift from this function. + + Args: + gt_bboxes (list[Tensor]): Ground truth bboxes of each image, each + has shape (num_gt, 4). + gt_labels (list[Tensor]): Ground truth labels of each box, each has + shape (num_gt,). + feat_shape (list[int]): Shape of output feature, + [batch, channel, height, width]. + img_shape (list[int]): Shape of input image, + [height, width, channel]. + with_corner_emb (bool): Generate corner embedding target or not. + Default: False. + with_guiding_shift (bool): Generate guiding shift target or not. + Default: False. + with_centripetal_shift (bool): Generate centripetal shift target or + not. Default: False. + + Returns: + dict: Ground truth of corner heatmap, corner offset, corner + embedding, guiding shift and centripetal shift. Containing the + following keys: + + - topleft_heatmap (Tensor): Ground truth top-left corner + heatmap. + - bottomright_heatmap (Tensor): Ground truth bottom-right + corner heatmap. + - topleft_offset (Tensor): Ground truth top-left corner offset. + - bottomright_offset (Tensor): Ground truth bottom-right corner + offset. + - corner_embedding (list[list[list[int]]]): Ground truth corner + embedding. Not must have. + - topleft_guiding_shift (Tensor): Ground truth top-left corner + guiding shift. Not must have. + - bottomright_guiding_shift (Tensor): Ground truth bottom-right + corner guiding shift. Not must have. + - topleft_centripetal_shift (Tensor): Ground truth top-left + corner centripetal shift. Not must have. + - bottomright_centripetal_shift (Tensor): Ground truth + bottom-right corner centripetal shift. Not must have. + """ + batch_size, _, height, width = feat_shape + img_h, img_w = img_shape[:2] + + width_ratio = float(width / img_w) + height_ratio = float(height / img_h) + + gt_tl_heatmap = gt_bboxes[-1].new_zeros( + [batch_size, self.num_classes, height, width]) + gt_br_heatmap = gt_bboxes[-1].new_zeros( + [batch_size, self.num_classes, height, width]) + gt_tl_offset = gt_bboxes[-1].new_zeros([batch_size, 2, height, width]) + gt_br_offset = gt_bboxes[-1].new_zeros([batch_size, 2, height, width]) + + if with_corner_emb: + match = [] + + # Guiding shift is a kind of offset, from center to corner + if with_guiding_shift: + gt_tl_guiding_shift = gt_bboxes[-1].new_zeros( + [batch_size, 2, height, width]) + gt_br_guiding_shift = gt_bboxes[-1].new_zeros( + [batch_size, 2, height, width]) + # Centripetal shift is also a kind of offset, from center to corner + # and normalized by log. + if with_centripetal_shift: + gt_tl_centripetal_shift = gt_bboxes[-1].new_zeros( + [batch_size, 2, height, width]) + gt_br_centripetal_shift = gt_bboxes[-1].new_zeros( + [batch_size, 2, height, width]) + + for batch_id in range(batch_size): + # Ground truth of corner embedding per image is a list of coord set + corner_match = [] + for box_id in range(len(gt_labels[batch_id])): + left, top, right, bottom = gt_bboxes[batch_id][box_id] + center_x = (left + right) / 2.0 + center_y = (top + bottom) / 2.0 + label = gt_labels[batch_id][box_id] + + # Use coords in the feature level to generate ground truth + scale_left = left * width_ratio + scale_right = right * width_ratio + scale_top = top * height_ratio + scale_bottom = bottom * height_ratio + scale_center_x = center_x * width_ratio + scale_center_y = center_y * height_ratio + + # Int coords on feature map/ground truth tensor + left_idx = int(min(scale_left, width - 1)) + right_idx = int(min(scale_right, width - 1)) + top_idx = int(min(scale_top, height - 1)) + bottom_idx = int(min(scale_bottom, height - 1)) + + # Generate gaussian heatmap + scale_box_width = ceil(scale_right - scale_left) + scale_box_height = ceil(scale_bottom - scale_top) + radius = gaussian_radius((scale_box_height, scale_box_width), + min_overlap=0.3) + radius = max(0, int(radius)) + gt_tl_heatmap[batch_id, label] = gen_gaussian_target( + gt_tl_heatmap[batch_id, label], [left_idx, top_idx], + radius) + gt_br_heatmap[batch_id, label] = gen_gaussian_target( + gt_br_heatmap[batch_id, label], [right_idx, bottom_idx], + radius) + + # Generate corner offset + left_offset = scale_left - left_idx + top_offset = scale_top - top_idx + right_offset = scale_right - right_idx + bottom_offset = scale_bottom - bottom_idx + gt_tl_offset[batch_id, 0, top_idx, left_idx] = left_offset + gt_tl_offset[batch_id, 1, top_idx, left_idx] = top_offset + gt_br_offset[batch_id, 0, bottom_idx, right_idx] = right_offset + gt_br_offset[batch_id, 1, bottom_idx, + right_idx] = bottom_offset + + # Generate corner embedding + if with_corner_emb: + corner_match.append([[top_idx, left_idx], + [bottom_idx, right_idx]]) + # Generate guiding shift + if with_guiding_shift: + gt_tl_guiding_shift[batch_id, 0, top_idx, + left_idx] = scale_center_x - left_idx + gt_tl_guiding_shift[batch_id, 1, top_idx, + left_idx] = scale_center_y - top_idx + gt_br_guiding_shift[batch_id, 0, bottom_idx, + right_idx] = right_idx - scale_center_x + gt_br_guiding_shift[ + batch_id, 1, bottom_idx, + right_idx] = bottom_idx - scale_center_y + # Generate centripetal shift + if with_centripetal_shift: + gt_tl_centripetal_shift[batch_id, 0, top_idx, + left_idx] = log(scale_center_x - + scale_left) + gt_tl_centripetal_shift[batch_id, 1, top_idx, + left_idx] = log(scale_center_y - + scale_top) + gt_br_centripetal_shift[batch_id, 0, bottom_idx, + right_idx] = log(scale_right - + scale_center_x) + gt_br_centripetal_shift[batch_id, 1, bottom_idx, + right_idx] = log(scale_bottom - + scale_center_y) + + if with_corner_emb: + match.append(corner_match) + + target_result = dict( + topleft_heatmap=gt_tl_heatmap, + topleft_offset=gt_tl_offset, + bottomright_heatmap=gt_br_heatmap, + bottomright_offset=gt_br_offset) + + if with_corner_emb: + target_result.update(corner_embedding=match) + if with_guiding_shift: + target_result.update( + topleft_guiding_shift=gt_tl_guiding_shift, + bottomright_guiding_shift=gt_br_guiding_shift) + if with_centripetal_shift: + target_result.update( + topleft_centripetal_shift=gt_tl_centripetal_shift, + bottomright_centripetal_shift=gt_br_centripetal_shift) + + return target_result + + @force_fp32() + def loss(self, + tl_heats, + br_heats, + tl_embs, + br_embs, + tl_offs, + br_offs, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Compute losses of the head. + + Args: + tl_heats (list[Tensor]): Top-left corner heatmaps for each level + with shape (N, num_classes, H, W). + br_heats (list[Tensor]): Bottom-right corner heatmaps for each + level with shape (N, num_classes, H, W). + tl_embs (list[Tensor]): Top-left corner embeddings for each level + with shape (N, corner_emb_channels, H, W). + br_embs (list[Tensor]): Bottom-right corner embeddings for each + level with shape (N, corner_emb_channels, H, W). + tl_offs (list[Tensor]): Top-left corner offsets for each level + with shape (N, corner_offset_channels, H, W). + br_offs (list[Tensor]): Bottom-right corner offsets for each level + with shape (N, corner_offset_channels, H, W). + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [left, top, right, bottom] format. + gt_labels (list[Tensor]): Class indices corresponding to each box. + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (list[Tensor] | None): Specify which bounding + boxes can be ignored when computing the loss. + + Returns: + dict[str, Tensor]: A dictionary of loss components. Containing the + following losses: + + - det_loss (list[Tensor]): Corner keypoint losses of all + feature levels. + - pull_loss (list[Tensor]): Part one of AssociativeEmbedding + losses of all feature levels. + - push_loss (list[Tensor]): Part two of AssociativeEmbedding + losses of all feature levels. + - off_loss (list[Tensor]): Corner offset losses of all feature + levels. + """ + targets = self.get_targets( + gt_bboxes, + gt_labels, + tl_heats[-1].shape, + img_metas[0]['pad_shape'], + with_corner_emb=self.with_corner_emb) + mlvl_targets = [targets for _ in range(self.num_feat_levels)] + det_losses, pull_losses, push_losses, off_losses = multi_apply( + self.loss_single, tl_heats, br_heats, tl_embs, br_embs, tl_offs, + br_offs, mlvl_targets) + loss_dict = dict(det_loss=det_losses, off_loss=off_losses) + if self.with_corner_emb: + loss_dict.update(pull_loss=pull_losses, push_loss=push_losses) + return loss_dict + + def loss_single(self, tl_hmp, br_hmp, tl_emb, br_emb, tl_off, br_off, + targets): + """Compute losses for single level. + + Args: + tl_hmp (Tensor): Top-left corner heatmap for current level with + shape (N, num_classes, H, W). + br_hmp (Tensor): Bottom-right corner heatmap for current level with + shape (N, num_classes, H, W). + tl_emb (Tensor): Top-left corner embedding for current level with + shape (N, corner_emb_channels, H, W). + br_emb (Tensor): Bottom-right corner embedding for current level + with shape (N, corner_emb_channels, H, W). + tl_off (Tensor): Top-left corner offset for current level with + shape (N, corner_offset_channels, H, W). + br_off (Tensor): Bottom-right corner offset for current level with + shape (N, corner_offset_channels, H, W). + targets (dict): Corner target generated by `get_targets`. + + Returns: + tuple[torch.Tensor]: Losses of the head's different branches + containing the following losses: + + - det_loss (Tensor): Corner keypoint loss. + - pull_loss (Tensor): Part one of AssociativeEmbedding loss. + - push_loss (Tensor): Part two of AssociativeEmbedding loss. + - off_loss (Tensor): Corner offset loss. + """ + gt_tl_hmp = targets['topleft_heatmap'] + gt_br_hmp = targets['bottomright_heatmap'] + gt_tl_off = targets['topleft_offset'] + gt_br_off = targets['bottomright_offset'] + gt_embedding = targets['corner_embedding'] + + # Detection loss + tl_det_loss = self.loss_heatmap( + tl_hmp.sigmoid(), + gt_tl_hmp, + avg_factor=max(1, + gt_tl_hmp.eq(1).sum())) + br_det_loss = self.loss_heatmap( + br_hmp.sigmoid(), + gt_br_hmp, + avg_factor=max(1, + gt_br_hmp.eq(1).sum())) + det_loss = (tl_det_loss + br_det_loss) / 2.0 + + # AssociativeEmbedding loss + if self.with_corner_emb and self.loss_embedding is not None: + pull_loss, push_loss = self.loss_embedding(tl_emb, br_emb, + gt_embedding) + else: + pull_loss, push_loss = None, None + + # Offset loss + # We only compute the offset loss at the real corner position. + # The value of real corner would be 1 in heatmap ground truth. + # The mask is computed in class agnostic mode and its shape is + # batch * 1 * width * height. + tl_off_mask = gt_tl_hmp.eq(1).sum(1).gt(0).unsqueeze(1).type_as( + gt_tl_hmp) + br_off_mask = gt_br_hmp.eq(1).sum(1).gt(0).unsqueeze(1).type_as( + gt_br_hmp) + tl_off_loss = self.loss_offset( + tl_off, + gt_tl_off, + tl_off_mask, + avg_factor=max(1, tl_off_mask.sum())) + br_off_loss = self.loss_offset( + br_off, + gt_br_off, + br_off_mask, + avg_factor=max(1, br_off_mask.sum())) + + off_loss = (tl_off_loss + br_off_loss) / 2.0 + + return det_loss, pull_loss, push_loss, off_loss + + @force_fp32() + def get_bboxes(self, + tl_heats, + br_heats, + tl_embs, + br_embs, + tl_offs, + br_offs, + img_metas, + rescale=False, + with_nms=True): + """Transform network output for a batch into bbox predictions. + + Args: + tl_heats (list[Tensor]): Top-left corner heatmaps for each level + with shape (N, num_classes, H, W). + br_heats (list[Tensor]): Bottom-right corner heatmaps for each + level with shape (N, num_classes, H, W). + tl_embs (list[Tensor]): Top-left corner embeddings for each level + with shape (N, corner_emb_channels, H, W). + br_embs (list[Tensor]): Bottom-right corner embeddings for each + level with shape (N, corner_emb_channels, H, W). + tl_offs (list[Tensor]): Top-left corner offsets for each level + with shape (N, corner_offset_channels, H, W). + br_offs (list[Tensor]): Bottom-right corner offsets for each level + with shape (N, corner_offset_channels, H, W). + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + rescale (bool): If True, return boxes in original image space. + Default: False. + with_nms (bool): If True, do nms before return boxes. + Default: True. + """ + assert tl_heats[-1].shape[0] == br_heats[-1].shape[0] == len(img_metas) + result_list = [] + for img_id in range(len(img_metas)): + result_list.append( + self._get_bboxes_single( + tl_heats[-1][img_id:img_id + 1, :], + br_heats[-1][img_id:img_id + 1, :], + tl_offs[-1][img_id:img_id + 1, :], + br_offs[-1][img_id:img_id + 1, :], + img_metas[img_id], + tl_emb=tl_embs[-1][img_id:img_id + 1, :], + br_emb=br_embs[-1][img_id:img_id + 1, :], + rescale=rescale, + with_nms=with_nms)) + + return result_list + + def _get_bboxes_single(self, + tl_heat, + br_heat, + tl_off, + br_off, + img_meta, + tl_emb=None, + br_emb=None, + tl_centripetal_shift=None, + br_centripetal_shift=None, + rescale=False, + with_nms=True): + """Transform outputs for a single batch item into bbox predictions. + + Args: + tl_heat (Tensor): Top-left corner heatmap for current level with + shape (N, num_classes, H, W). + br_heat (Tensor): Bottom-right corner heatmap for current level + with shape (N, num_classes, H, W). + tl_off (Tensor): Top-left corner offset for current level with + shape (N, corner_offset_channels, H, W). + br_off (Tensor): Bottom-right corner offset for current level with + shape (N, corner_offset_channels, H, W). + img_meta (dict): Meta information of current image, e.g., + image size, scaling factor, etc. + tl_emb (Tensor): Top-left corner embedding for current level with + shape (N, corner_emb_channels, H, W). + br_emb (Tensor): Bottom-right corner embedding for current level + with shape (N, corner_emb_channels, H, W). + tl_centripetal_shift: Top-left corner's centripetal shift for + current level with shape (N, 2, H, W). + br_centripetal_shift: Bottom-right corner's centripetal shift for + current level with shape (N, 2, H, W). + rescale (bool): If True, return boxes in original image space. + Default: False. + with_nms (bool): If True, do nms before return boxes. + Default: True. + """ + if isinstance(img_meta, (list, tuple)): + img_meta = img_meta[0] + + batch_bboxes, batch_scores, batch_clses = self.decode_heatmap( + tl_heat=tl_heat.sigmoid(), + br_heat=br_heat.sigmoid(), + tl_off=tl_off, + br_off=br_off, + tl_emb=tl_emb, + br_emb=br_emb, + tl_centripetal_shift=tl_centripetal_shift, + br_centripetal_shift=br_centripetal_shift, + img_meta=img_meta, + k=self.test_cfg.corner_topk, + kernel=self.test_cfg.local_maximum_kernel, + distance_threshold=self.test_cfg.distance_threshold) + + if rescale: + batch_bboxes /= batch_bboxes.new_tensor(img_meta['scale_factor']) + + bboxes = batch_bboxes.view([-1, 4]) + scores = batch_scores.view(-1) + clses = batch_clses.view(-1) + + detections = torch.cat([bboxes, scores.unsqueeze(-1)], -1) + keepinds = (detections[:, -1] > -0.1) + detections = detections[keepinds] + labels = clses[keepinds] + + if with_nms: + detections, labels = self._bboxes_nms(detections, labels, + self.test_cfg) + + return detections, labels + + def _bboxes_nms(self, bboxes, labels, cfg): + if 'nms_cfg' in cfg: + warning.warn('nms_cfg in test_cfg will be deprecated. ' + 'Please rename it as nms') + if 'nms' not in cfg: + cfg.nms = cfg.nms_cfg + + if labels.numel() > 0: + max_num = cfg.max_per_img + bboxes, keep = batched_nms(bboxes[:, :4], bboxes[:, + -1].contiguous(), + labels, cfg.nms) + if max_num > 0: + bboxes = bboxes[:max_num] + labels = labels[keep][:max_num] + + return bboxes, labels + + def decode_heatmap(self, + tl_heat, + br_heat, + tl_off, + br_off, + tl_emb=None, + br_emb=None, + tl_centripetal_shift=None, + br_centripetal_shift=None, + img_meta=None, + k=100, + kernel=3, + distance_threshold=0.5, + num_dets=1000): + """Transform outputs for a single batch item into raw bbox predictions. + + Args: + tl_heat (Tensor): Top-left corner heatmap for current level with + shape (N, num_classes, H, W). + br_heat (Tensor): Bottom-right corner heatmap for current level + with shape (N, num_classes, H, W). + tl_off (Tensor): Top-left corner offset for current level with + shape (N, corner_offset_channels, H, W). + br_off (Tensor): Bottom-right corner offset for current level with + shape (N, corner_offset_channels, H, W). + tl_emb (Tensor | None): Top-left corner embedding for current + level with shape (N, corner_emb_channels, H, W). + br_emb (Tensor | None): Bottom-right corner embedding for current + level with shape (N, corner_emb_channels, H, W). + tl_centripetal_shift (Tensor | None): Top-left centripetal shift + for current level with shape (N, 2, H, W). + br_centripetal_shift (Tensor | None): Bottom-right centripetal + shift for current level with shape (N, 2, H, W). + img_meta (dict): Meta information of current image, e.g., + image size, scaling factor, etc. + k (int): Get top k corner keypoints from heatmap. + kernel (int): Max pooling kernel for extract local maximum pixels. + distance_threshold (float): Distance threshold. Top-left and + bottom-right corner keypoints with feature distance less than + the threshold will be regarded as keypoints from same object. + num_dets (int): Num of raw boxes before doing nms. + + Returns: + tuple[torch.Tensor]: Decoded output of CornerHead, containing the + following Tensors: + + - bboxes (Tensor): Coords of each box. + - scores (Tensor): Scores of each box. + - clses (Tensor): Categories of each box. + """ + with_embedding = tl_emb is not None and br_emb is not None + with_centripetal_shift = ( + tl_centripetal_shift is not None + and br_centripetal_shift is not None) + assert with_embedding + with_centripetal_shift == 1 + batch, _, height, width = tl_heat.size() + if torch.onnx.is_in_onnx_export(): + inp_h, inp_w = img_meta['pad_shape_for_onnx'][:2] + else: + inp_h, inp_w, _ = img_meta['pad_shape'] + + # perform nms on heatmaps + tl_heat = get_local_maximum(tl_heat, kernel=kernel) + br_heat = get_local_maximum(br_heat, kernel=kernel) + + tl_scores, tl_inds, tl_clses, tl_ys, tl_xs = get_topk_from_heatmap( + tl_heat, k=k) + br_scores, br_inds, br_clses, br_ys, br_xs = get_topk_from_heatmap( + br_heat, k=k) + + # We use repeat instead of expand here because expand is a + # shallow-copy function. Thus it could cause unexpected testing result + # sometimes. Using expand will decrease about 10% mAP during testing + # compared to repeat. + tl_ys = tl_ys.view(batch, k, 1).repeat(1, 1, k) + tl_xs = tl_xs.view(batch, k, 1).repeat(1, 1, k) + br_ys = br_ys.view(batch, 1, k).repeat(1, k, 1) + br_xs = br_xs.view(batch, 1, k).repeat(1, k, 1) + + tl_off = transpose_and_gather_feat(tl_off, tl_inds) + tl_off = tl_off.view(batch, k, 1, 2) + br_off = transpose_and_gather_feat(br_off, br_inds) + br_off = br_off.view(batch, 1, k, 2) + + tl_xs = tl_xs + tl_off[..., 0] + tl_ys = tl_ys + tl_off[..., 1] + br_xs = br_xs + br_off[..., 0] + br_ys = br_ys + br_off[..., 1] + + if with_centripetal_shift: + tl_centripetal_shift = transpose_and_gather_feat( + tl_centripetal_shift, tl_inds).view(batch, k, 1, 2).exp() + br_centripetal_shift = transpose_and_gather_feat( + br_centripetal_shift, br_inds).view(batch, 1, k, 2).exp() + + tl_ctxs = tl_xs + tl_centripetal_shift[..., 0] + tl_ctys = tl_ys + tl_centripetal_shift[..., 1] + br_ctxs = br_xs - br_centripetal_shift[..., 0] + br_ctys = br_ys - br_centripetal_shift[..., 1] + + # all possible boxes based on top k corners (ignoring class) + tl_xs *= (inp_w / width) + tl_ys *= (inp_h / height) + br_xs *= (inp_w / width) + br_ys *= (inp_h / height) + + if with_centripetal_shift: + tl_ctxs *= (inp_w / width) + tl_ctys *= (inp_h / height) + br_ctxs *= (inp_w / width) + br_ctys *= (inp_h / height) + + x_off, y_off = 0, 0 # no crop + if not torch.onnx.is_in_onnx_export(): + # since `RandomCenterCropPad` is done on CPU with numpy and it's + # not dynamic traceable when exporting to ONNX, thus 'border' + # does not appears as key in 'img_meta'. As a tmp solution, + # we move this 'border' handle part to the postprocess after + # finished exporting to ONNX, which is handle in + # `mmdet/core/export/model_wrappers.py`. Though difference between + # pytorch and exported onnx model, it might be ignored since + # comparable performance is achieved between them (e.g. 40.4 vs + # 40.6 on COCO val2017, for CornerNet without test-time flip) + if 'border' in img_meta: + x_off = img_meta['border'][2] + y_off = img_meta['border'][0] + + tl_xs -= x_off + tl_ys -= y_off + br_xs -= x_off + br_ys -= y_off + + zeros = tl_xs.new_zeros(*tl_xs.size()) + tl_xs = torch.where(tl_xs > 0.0, tl_xs, zeros) + tl_ys = torch.where(tl_ys > 0.0, tl_ys, zeros) + br_xs = torch.where(br_xs > 0.0, br_xs, zeros) + br_ys = torch.where(br_ys > 0.0, br_ys, zeros) + + bboxes = torch.stack((tl_xs, tl_ys, br_xs, br_ys), dim=3) + area_bboxes = ((br_xs - tl_xs) * (br_ys - tl_ys)).abs() + + if with_centripetal_shift: + tl_ctxs -= x_off + tl_ctys -= y_off + br_ctxs -= x_off + br_ctys -= y_off + + tl_ctxs *= tl_ctxs.gt(0.0).type_as(tl_ctxs) + tl_ctys *= tl_ctys.gt(0.0).type_as(tl_ctys) + br_ctxs *= br_ctxs.gt(0.0).type_as(br_ctxs) + br_ctys *= br_ctys.gt(0.0).type_as(br_ctys) + + ct_bboxes = torch.stack((tl_ctxs, tl_ctys, br_ctxs, br_ctys), + dim=3) + area_ct_bboxes = ((br_ctxs - tl_ctxs) * (br_ctys - tl_ctys)).abs() + + rcentral = torch.zeros_like(ct_bboxes) + # magic nums from paper section 4.1 + mu = torch.ones_like(area_bboxes) / 2.4 + mu[area_bboxes > 3500] = 1 / 2.1 # large bbox have smaller mu + + bboxes_center_x = (bboxes[..., 0] + bboxes[..., 2]) / 2 + bboxes_center_y = (bboxes[..., 1] + bboxes[..., 3]) / 2 + rcentral[..., 0] = bboxes_center_x - mu * (bboxes[..., 2] - + bboxes[..., 0]) / 2 + rcentral[..., 1] = bboxes_center_y - mu * (bboxes[..., 3] - + bboxes[..., 1]) / 2 + rcentral[..., 2] = bboxes_center_x + mu * (bboxes[..., 2] - + bboxes[..., 0]) / 2 + rcentral[..., 3] = bboxes_center_y + mu * (bboxes[..., 3] - + bboxes[..., 1]) / 2 + area_rcentral = ((rcentral[..., 2] - rcentral[..., 0]) * + (rcentral[..., 3] - rcentral[..., 1])).abs() + dists = area_ct_bboxes / area_rcentral + + tl_ctx_inds = (ct_bboxes[..., 0] <= rcentral[..., 0]) | ( + ct_bboxes[..., 0] >= rcentral[..., 2]) + tl_cty_inds = (ct_bboxes[..., 1] <= rcentral[..., 1]) | ( + ct_bboxes[..., 1] >= rcentral[..., 3]) + br_ctx_inds = (ct_bboxes[..., 2] <= rcentral[..., 0]) | ( + ct_bboxes[..., 2] >= rcentral[..., 2]) + br_cty_inds = (ct_bboxes[..., 3] <= rcentral[..., 1]) | ( + ct_bboxes[..., 3] >= rcentral[..., 3]) + + if with_embedding: + tl_emb = transpose_and_gather_feat(tl_emb, tl_inds) + tl_emb = tl_emb.view(batch, k, 1) + br_emb = transpose_and_gather_feat(br_emb, br_inds) + br_emb = br_emb.view(batch, 1, k) + dists = torch.abs(tl_emb - br_emb) + + tl_scores = tl_scores.view(batch, k, 1).repeat(1, 1, k) + br_scores = br_scores.view(batch, 1, k).repeat(1, k, 1) + + scores = (tl_scores + br_scores) / 2 # scores for all possible boxes + + # tl and br should have same class + tl_clses = tl_clses.view(batch, k, 1).repeat(1, 1, k) + br_clses = br_clses.view(batch, 1, k).repeat(1, k, 1) + cls_inds = (tl_clses != br_clses) + + # reject boxes based on distances + dist_inds = dists > distance_threshold + + # reject boxes based on widths and heights + width_inds = (br_xs <= tl_xs) + height_inds = (br_ys <= tl_ys) + + # No use `scores[cls_inds]`, instead we use `torch.where` here. + # Since only 1-D indices with type 'tensor(bool)' are supported + # when exporting to ONNX, any other bool indices with more dimensions + # (e.g. 2-D bool tensor) as input parameter in node is invalid + negative_scores = -1 * torch.ones_like(scores) + scores = torch.where(cls_inds, negative_scores, scores) + scores = torch.where(width_inds, negative_scores, scores) + scores = torch.where(height_inds, negative_scores, scores) + scores = torch.where(dist_inds, negative_scores, scores) + + if with_centripetal_shift: + scores[tl_ctx_inds] = -1 + scores[tl_cty_inds] = -1 + scores[br_ctx_inds] = -1 + scores[br_cty_inds] = -1 + + scores = scores.view(batch, -1) + scores, inds = torch.topk(scores, num_dets) + scores = scores.unsqueeze(2) + + bboxes = bboxes.view(batch, -1, 4) + bboxes = gather_feat(bboxes, inds) + + clses = tl_clses.contiguous().view(batch, -1, 1) + clses = gather_feat(clses, inds).float() + + return bboxes, scores, clses + + def onnx_export(self, + tl_heats, + br_heats, + tl_embs, + br_embs, + tl_offs, + br_offs, + img_metas, + rescale=False, + with_nms=True): + """Transform network output for a batch into bbox predictions. + + Args: + tl_heats (list[Tensor]): Top-left corner heatmaps for each level + with shape (N, num_classes, H, W). + br_heats (list[Tensor]): Bottom-right corner heatmaps for each + level with shape (N, num_classes, H, W). + tl_embs (list[Tensor]): Top-left corner embeddings for each level + with shape (N, corner_emb_channels, H, W). + br_embs (list[Tensor]): Bottom-right corner embeddings for each + level with shape (N, corner_emb_channels, H, W). + tl_offs (list[Tensor]): Top-left corner offsets for each level + with shape (N, corner_offset_channels, H, W). + br_offs (list[Tensor]): Bottom-right corner offsets for each level + with shape (N, corner_offset_channels, H, W). + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + rescale (bool): If True, return boxes in original image space. + Default: False. + with_nms (bool): If True, do nms before return boxes. + Default: True. + + Returns: + tuple[Tensor, Tensor]: First tensor bboxes with shape + [N, num_det, 5], 5 arrange as (x1, y1, x2, y2, score) + and second element is class labels of shape [N, num_det]. + """ + assert tl_heats[-1].shape[0] == br_heats[-1].shape[0] == len( + img_metas) == 1 + result_list = [] + for img_id in range(len(img_metas)): + result_list.append( + self._get_bboxes_single( + tl_heats[-1][img_id:img_id + 1, :], + br_heats[-1][img_id:img_id + 1, :], + tl_offs[-1][img_id:img_id + 1, :], + br_offs[-1][img_id:img_id + 1, :], + img_metas[img_id], + tl_emb=tl_embs[-1][img_id:img_id + 1, :], + br_emb=br_embs[-1][img_id:img_id + 1, :], + rescale=rescale, + with_nms=with_nms)) + + detections, labels = result_list[0] + # batch_size 1 here, [1, num_det, 5], [1, num_det] + return detections.unsqueeze(0), labels.unsqueeze(0) diff --git a/mmdet/models/dense_heads/ddod_head.py b/mmdet/models/dense_heads/ddod_head.py new file mode 100644 index 0000000..b2ff223 --- /dev/null +++ b/mmdet/models/dense_heads/ddod_head.py @@ -0,0 +1,778 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule, Scale, bias_init_with_prob, normal_init +from mmcv.runner import force_fp32 + +from mmdet.core import (anchor_inside_flags, build_assigner, build_sampler, + images_to_levels, multi_apply, reduce_mean, unmap) +from mmdet.core.bbox import bbox_overlaps +from ..builder import HEADS, build_loss +from .anchor_head import AnchorHead + +EPS = 1e-12 + + +@HEADS.register_module() +class DDODHead(AnchorHead): + """DDOD head decomposes conjunctions lying in most current one-stage + detectors via label assignment disentanglement, spatial feature + disentanglement, and pyramid supervision disentanglement. + + https://arxiv.org/abs/2107.02963 + + Args: + num_classes (int): Number of categories excluding the + background category. + in_channels (int): Number of channels in the input feature map. + stacked_convs (int): The number of stacked Conv. Default: 4. + conv_cfg (dict): Conv config of ddod head. Default: None. + use_dcn (bool): Use dcn, Same as ATSS when False. Default: True. + norm_cfg (dict): Normal config of ddod head. Default: + dict(type='GN', num_groups=32, requires_grad=True). + loss_iou (dict): Config of IoU loss. Default: + dict(type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0). + """ + + def __init__(self, + num_classes, + in_channels, + stacked_convs=4, + conv_cfg=None, + use_dcn=True, + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True), + loss_iou=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=1.0), + **kwargs): + self.stacked_convs = stacked_convs + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.use_dcn = use_dcn + super(DDODHead, self).__init__(num_classes, in_channels, **kwargs) + + self.sampling = False + if self.train_cfg: + self.cls_assigner = build_assigner(self.train_cfg.assigner) + self.reg_assigner = build_assigner(self.train_cfg.reg_assigner) + sampler_cfg = dict(type='PseudoSampler') + self.sampler = build_sampler(sampler_cfg, context=self) + self.loss_iou = build_loss(loss_iou) + + def _init_layers(self): + """Initialize layers of the head.""" + self.relu = nn.ReLU(inplace=True) + self.cls_convs = nn.ModuleList() + self.reg_convs = nn.ModuleList() + for i in range(self.stacked_convs): + chn = self.in_channels if i == 0 else self.feat_channels + self.cls_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=dict(type='DCN', deform_groups=1) + if i == 0 and self.use_dcn else self.conv_cfg, + norm_cfg=self.norm_cfg)) + self.reg_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=dict(type='DCN', deform_groups=1) + if i == 0 and self.use_dcn else self.conv_cfg, + norm_cfg=self.norm_cfg)) + self.atss_cls = nn.Conv2d( + self.feat_channels, + self.num_base_priors * self.cls_out_channels, + 3, + padding=1) + self.atss_reg = nn.Conv2d( + self.feat_channels, self.num_base_priors * 4, 3, padding=1) + self.atss_iou = nn.Conv2d( + self.feat_channels, self.num_base_priors * 1, 3, padding=1) + self.scales = nn.ModuleList( + [Scale(1.0) for _ in self.prior_generator.strides]) + + # we use the global list in loss + self.cls_num_pos_samples_per_level = [ + 0. for _ in range(len(self.prior_generator.strides)) + ] + self.reg_num_pos_samples_per_level = [ + 0. for _ in range(len(self.prior_generator.strides)) + ] + + def init_weights(self): + """Initialize weights of the head.""" + for m in self.cls_convs: + normal_init(m.conv, std=0.01) + for m in self.reg_convs: + normal_init(m.conv, std=0.01) + normal_init(self.atss_reg, std=0.01) + normal_init(self.atss_iou, std=0.01) + bias_cls = bias_init_with_prob(0.01) + normal_init(self.atss_cls, std=0.01, bias=bias_cls) + + def forward(self, feats): + """Forward features from the upstream network. + + Args: + feats (tuple[Tensor]): Features from the upstream network, each is + a 4D-tensor. + + Returns: + tuple: Usually a tuple of classification scores and bbox prediction + cls_scores (list[Tensor]): Classification scores for all scale + levels, each is a 4D-tensor, the channels number is + num_base_priors * num_classes. + bbox_preds (list[Tensor]): Box energies / deltas for all scale + levels, each is a 4D-tensor, the channels number is + num_base_priors * 4. + iou_preds (list[Tensor]): IoU scores for all scale levels, + each is a 4D-tensor, the channels number is + num_base_priors * 1. + """ + return multi_apply(self.forward_single, feats, self.scales) + + def forward_single(self, x, scale): + """Forward feature of a single scale level. + + Args: + x (Tensor): Features of a single scale level. + scale (:obj: `mmcv.cnn.Scale`): Learnable scale module to resize + the bbox prediction. + + Returns: + tuple: + - cls_score (Tensor): Cls scores for a single scale level \ + the channels number is num_base_priors * num_classes. + - bbox_pred (Tensor): Box energies / deltas for a single \ + scale level, the channels number is num_base_priors * 4. + - iou_pred (Tensor): Iou for a single scale level, the \ + channel number is (N, num_base_priors * 1, H, W). + """ + cls_feat = x + reg_feat = x + for cls_conv in self.cls_convs: + cls_feat = cls_conv(cls_feat) + for reg_conv in self.reg_convs: + reg_feat = reg_conv(reg_feat) + cls_score = self.atss_cls(cls_feat) + # we just follow atss, not apply exp in bbox_pred + bbox_pred = scale(self.atss_reg(reg_feat)).float() + iou_pred = self.atss_iou(reg_feat) + return cls_score, bbox_pred, iou_pred + + def loss_cls_single(self, cls_score, labels, label_weights, + reweight_factor, num_total_samples): + """Compute cls loss of a single scale level. + + Args: + cls_score (Tensor): Box scores for each scale level + Has shape (N, num_base_priors * num_classes, H, W). + labels (Tensor): Labels of each anchors with shape + (N, num_total_anchors). + label_weights (Tensor): Label weights of each anchor with shape + (N, num_total_anchors) + reweight_factor (list[int]): Reweight factor for cls and reg + loss. + num_total_samples (int): Number of positive samples that is + reduced over all GPUs. + + Returns: + tuple[Tensor]: A tuple of loss components. + """ + cls_score = cls_score.permute(0, 2, 3, 1).reshape( + -1, self.cls_out_channels).contiguous() + labels = labels.reshape(-1) + label_weights = label_weights.reshape(-1) + loss_cls = self.loss_cls( + cls_score, labels, label_weights, avg_factor=num_total_samples) + return reweight_factor * loss_cls, + + def loss_reg_single(self, anchors, bbox_pred, iou_pred, labels, + label_weights, bbox_targets, bbox_weights, + reweight_factor, num_total_samples): + """Compute reg loss of a single scale level. + + Args: + anchors (Tensor): Box reference for each scale level with shape + (N, num_total_anchors, 4). + bbox_pred (Tensor): Box energies / deltas for each scale + level with shape (N, num_base_priors * 4, H, W). + iou_pred (Tensor): Iou for a single scale level, the + channel number is (N, num_base_priors * 1, H, W). + labels (Tensor): Labels of each anchors with shape + (N, num_total_anchors). + label_weights (Tensor): Label weights of each anchor with shape + (N, num_total_anchors) + bbox_targets (Tensor): BBox regression targets of each anchor + weight shape (N, num_total_anchors, 4). + bbox_weights (Tensor): BBox weights of all anchors in the + image with shape (N, 4) + reweight_factor (list[int]): Reweight factor for cls and reg + loss. + num_total_samples (int): Number of positive samples that is + reduced over all GPUs. + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + anchors = anchors.reshape(-1, 4) + bbox_pred = bbox_pred.permute(0, 2, 3, 1).reshape(-1, 4) + iou_pred = iou_pred.permute(0, 2, 3, 1).reshape(-1, ) + bbox_targets = bbox_targets.reshape(-1, 4) + bbox_weights = bbox_weights.reshape(-1, 4) + labels = labels.reshape(-1) + label_weights = label_weights.reshape(-1) + + iou_targets = label_weights.new_zeros(labels.shape) + iou_weights = label_weights.new_zeros(labels.shape) + iou_weights[(bbox_weights.sum(axis=1) > 0).nonzero( + as_tuple=False)] = 1. + + # FG cat_id: [0, num_classes -1], BG cat_id: num_classes + bg_class_ind = self.num_classes + pos_inds = ((labels >= 0) + & + (labels < bg_class_ind)).nonzero(as_tuple=False).squeeze(1) + + if len(pos_inds) > 0: + pos_bbox_targets = bbox_targets[pos_inds] + pos_bbox_pred = bbox_pred[pos_inds] + pos_anchors = anchors[pos_inds] + + pos_decode_bbox_pred = self.bbox_coder.decode( + pos_anchors, pos_bbox_pred) + pos_decode_bbox_targets = self.bbox_coder.decode( + pos_anchors, pos_bbox_targets) + + # regression loss + loss_bbox = self.loss_bbox( + pos_decode_bbox_pred, + pos_decode_bbox_targets, + avg_factor=num_total_samples) + + iou_targets[pos_inds] = bbox_overlaps( + pos_decode_bbox_pred.detach(), + pos_decode_bbox_targets, + is_aligned=True) + loss_iou = self.loss_iou( + iou_pred, + iou_targets, + iou_weights, + avg_factor=num_total_samples) + else: + loss_bbox = bbox_pred.sum() * 0 + loss_iou = iou_pred.sum() * 0 + + return reweight_factor * loss_bbox, reweight_factor * loss_iou + + def calc_reweight_factor(self, labels_list): + """Compute reweight_factor for regression and classification loss.""" + # get pos samples for each level + bg_class_ind = self.num_classes + for ii, each_level_label in enumerate(labels_list): + pos_inds = ((each_level_label >= 0) & + (each_level_label < bg_class_ind)).nonzero( + as_tuple=False).squeeze(1) + self.cls_num_pos_samples_per_level[ii] += len(pos_inds) + # get reweight factor from 1 ~ 2 with bilinear interpolation + min_pos_samples = min(self.cls_num_pos_samples_per_level) + max_pos_samples = max(self.cls_num_pos_samples_per_level) + interval = 1. / (max_pos_samples - min_pos_samples + 1e-10) + reweight_factor_per_level = [] + for pos_samples in self.cls_num_pos_samples_per_level: + factor = 2. - (pos_samples - min_pos_samples) * interval + reweight_factor_per_level.append(factor) + return reweight_factor_per_level + + @force_fp32(apply_to=('cls_scores', 'bbox_preds', 'iou_preds')) + def loss(self, + cls_scores, + bbox_preds, + iou_preds, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Compute losses of the head. + + Args: + cls_scores (list[Tensor]): Box scores for each scale level + Has shape (N, num_base_priors * num_classes, H, W) + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level with shape (N, num_base_priors * 4, H, W) + iou_preds (list[Tensor]): Score factor for all scale level, + each is a 4D-tensor, has shape (batch_size, 1, H, W). + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (list[Tensor] | None): specify which bounding + boxes can be ignored when computing the loss. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + assert len(featmap_sizes) == self.prior_generator.num_levels + + device = cls_scores[0].device + anchor_list, valid_flag_list = self.get_anchors( + featmap_sizes, img_metas, device=device) + label_channels = self.cls_out_channels if self.use_sigmoid_cls else 1 + + # calculate common vars for cls and reg assigners at once + targets_com = self.process_predictions_and_anchors( + anchor_list, valid_flag_list, cls_scores, bbox_preds, img_metas, + gt_bboxes_ignore) + (anchor_list, valid_flag_list, num_level_anchors_list, cls_score_list, + bbox_pred_list, gt_bboxes_ignore_list) = targets_com + + # classification branch assigner + cls_targets = self.get_cls_targets( + anchor_list, + valid_flag_list, + num_level_anchors_list, + cls_score_list, + bbox_pred_list, + gt_bboxes, + img_metas, + gt_bboxes_ignore_list=gt_bboxes_ignore_list, + gt_labels_list=gt_labels, + label_channels=label_channels) + if cls_targets is None: + return None + + (cls_anchor_list, labels_list, label_weights_list, bbox_targets_list, + bbox_weights_list, num_total_pos, num_total_neg) = cls_targets + + num_total_samples = reduce_mean( + torch.tensor(num_total_pos, dtype=torch.float, + device=device)).item() + num_total_samples = max(num_total_samples, 1.0) + + reweight_factor_per_level = self.calc_reweight_factor(labels_list) + + cls_losses_cls, = multi_apply( + self.loss_cls_single, + cls_scores, + labels_list, + label_weights_list, + reweight_factor_per_level, + num_total_samples=num_total_samples) + + # regression branch assigner + reg_targets = self.get_reg_targets( + anchor_list, + valid_flag_list, + num_level_anchors_list, + cls_score_list, + bbox_pred_list, + gt_bboxes, + img_metas, + gt_bboxes_ignore_list=gt_bboxes_ignore_list, + gt_labels_list=gt_labels, + label_channels=label_channels) + if reg_targets is None: + return None + + (reg_anchor_list, labels_list, label_weights_list, bbox_targets_list, + bbox_weights_list, num_total_pos, num_total_neg) = reg_targets + + num_total_samples = reduce_mean( + torch.tensor(num_total_pos, dtype=torch.float, + device=device)).item() + num_total_samples = max(num_total_samples, 1.0) + + reweight_factor_per_level = self.calc_reweight_factor(labels_list) + + reg_losses_bbox, reg_losses_iou = multi_apply( + self.loss_reg_single, + reg_anchor_list, + bbox_preds, + iou_preds, + labels_list, + label_weights_list, + bbox_targets_list, + bbox_weights_list, + reweight_factor_per_level, + num_total_samples=num_total_samples) + + return dict( + loss_cls=cls_losses_cls, + loss_bbox=reg_losses_bbox, + loss_iou=reg_losses_iou) + + def process_predictions_and_anchors(self, anchor_list, valid_flag_list, + cls_scores, bbox_preds, img_metas, + gt_bboxes_ignore_list): + """Compute common vars for regression and classification targets. + + Args: + anchor_list (list[Tensor]): anchors of each image. + valid_flag_list (list[Tensor]): Valid flags of each image. + cls_scores (list[Tensor]): Classification scores for all scale + levels, each is a 4D-tensor, the channels number is + num_base_priors * num_classes. + bbox_preds (list[Tensor]): Box energies / deltas for all scale + levels, each is a 4D-tensor, the channels number is + num_base_priors * 4. + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore_list (list[Tensor] | None): specify which bounding + boxes can be ignored when computing the loss. + + Return: + tuple[Tensor]: A tuple of common loss vars. + """ + num_imgs = len(img_metas) + assert len(anchor_list) == len(valid_flag_list) == num_imgs + + # anchor number of multi levels + num_level_anchors = [anchors.size(0) for anchors in anchor_list[0]] + num_level_anchors_list = [num_level_anchors] * num_imgs + + anchor_list_ = [] + valid_flag_list_ = [] + # concat all level anchors and flags to a single tensor + for i in range(num_imgs): + assert len(anchor_list[i]) == len(valid_flag_list[i]) + anchor_list_.append(torch.cat(anchor_list[i])) + valid_flag_list_.append(torch.cat(valid_flag_list[i])) + + # compute targets for each image + if gt_bboxes_ignore_list is None: + gt_bboxes_ignore_list = [None for _ in range(num_imgs)] + + num_levels = len(cls_scores) + cls_score_list = [] + bbox_pred_list = [] + + mlvl_cls_score_list = [ + cls_score.permute(0, 2, 3, 1).reshape( + num_imgs, -1, self.num_base_priors * self.cls_out_channels) + for cls_score in cls_scores + ] + mlvl_bbox_pred_list = [ + bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, + self.num_base_priors * 4) + for bbox_pred in bbox_preds + ] + + for i in range(num_imgs): + mlvl_cls_tensor_list = [ + mlvl_cls_score_list[j][i] for j in range(num_levels) + ] + mlvl_bbox_tensor_list = [ + mlvl_bbox_pred_list[j][i] for j in range(num_levels) + ] + cat_mlvl_cls_score = torch.cat(mlvl_cls_tensor_list, dim=0) + cat_mlvl_bbox_pred = torch.cat(mlvl_bbox_tensor_list, dim=0) + cls_score_list.append(cat_mlvl_cls_score) + bbox_pred_list.append(cat_mlvl_bbox_pred) + return (anchor_list_, valid_flag_list_, num_level_anchors_list, + cls_score_list, bbox_pred_list, gt_bboxes_ignore_list) + + def get_cls_targets(self, + anchor_list, + valid_flag_list, + num_level_anchors_list, + cls_score_list, + bbox_pred_list, + gt_bboxes_list, + img_metas, + gt_bboxes_ignore_list=None, + gt_labels_list=None, + label_channels=1, + unmap_outputs=True): + """Get cls targets for DDOD head. + + This method is almost the same as `AnchorHead.get_targets()`. + Besides returning the targets as the parent method does, + it also returns the anchors as the first element of the + returned tuple. + + Args: + anchor_list (list[Tensor]): anchors of each image. + valid_flag_list (list[Tensor]): Valid flags of each image. + num_level_anchors_list (list[Tensor]): Number of anchors of each + scale level of all image. + cls_score_list (list[Tensor]): Classification scores for all scale + levels, each is a 4D-tensor, the channels number is + num_base_priors * num_classes. + bbox_pred_list (list[Tensor]): Box energies / deltas for all scale + levels, each is a 4D-tensor, the channels number is + num_base_priors * 4. + gt_bboxes_list (list[Tensor]): Ground truth bboxes of each image. + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore_list (list[Tensor] | None): specify which bounding + boxes can be ignored when computing the loss. + gt_labels_list (list[Tensor]): class indices corresponding to + each box. + label_channels (int): Channel of label. + unmap_outputs (bool): Whether to map outputs back to the original + set of anchors. + + Return: + tuple[Tensor]: A tuple of cls targets components. + """ + (all_anchors, all_labels, all_label_weights, all_bbox_targets, + all_bbox_weights, pos_inds_list, neg_inds_list) = multi_apply( + self._get_target_single, + anchor_list, + valid_flag_list, + cls_score_list, + bbox_pred_list, + num_level_anchors_list, + gt_bboxes_list, + gt_bboxes_ignore_list, + gt_labels_list, + img_metas, + label_channels=label_channels, + unmap_outputs=unmap_outputs, + is_cls_assigner=True) + # no valid anchors + if any([labels is None for labels in all_labels]): + return None + # sampled anchors of all images + num_total_pos = sum([max(inds.numel(), 1) for inds in pos_inds_list]) + num_total_neg = sum([max(inds.numel(), 1) for inds in neg_inds_list]) + # split targets to a list w.r.t. multiple levels + anchors_list = images_to_levels(all_anchors, num_level_anchors_list[0]) + labels_list = images_to_levels(all_labels, num_level_anchors_list[0]) + label_weights_list = images_to_levels(all_label_weights, + num_level_anchors_list[0]) + bbox_targets_list = images_to_levels(all_bbox_targets, + num_level_anchors_list[0]) + bbox_weights_list = images_to_levels(all_bbox_weights, + num_level_anchors_list[0]) + return (anchors_list, labels_list, label_weights_list, + bbox_targets_list, bbox_weights_list, num_total_pos, + num_total_neg) + + def get_reg_targets(self, + anchor_list, + valid_flag_list, + num_level_anchors_list, + cls_score_list, + bbox_pred_list, + gt_bboxes_list, + img_metas, + gt_bboxes_ignore_list=None, + gt_labels_list=None, + label_channels=1, + unmap_outputs=True): + """Get reg targets for DDOD head. + + This method is almost the same as `AnchorHead.get_targets()` when + is_cls_assigner is False. Besides returning the targets as the parent + method does, it also returns the anchors as the first element of the + returned tuple. + + Args: + anchor_list (list[Tensor]): anchors of each image. + valid_flag_list (list[Tensor]): Valid flags of each image. + num_level_anchors (int): Number of anchors of each scale level. + cls_scores (list[Tensor]): Classification scores for all scale + levels, each is a 4D-tensor, the channels number is + num_base_priors * num_classes. + bbox_preds (list[Tensor]): Box energies / deltas for all scale + levels, each is a 4D-tensor, the channels number is + num_base_priors * 4. + gt_labels_list (list[Tensor]): class indices corresponding to + each box. + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore_list (list[Tensor] | None): specify which bounding + boxes can be ignored when computing the loss. + + Return: + tuple[Tensor]: A tuple of reg targets components. + """ + (all_anchors, all_labels, all_label_weights, all_bbox_targets, + all_bbox_weights, pos_inds_list, neg_inds_list) = multi_apply( + self._get_target_single, + anchor_list, + valid_flag_list, + cls_score_list, + bbox_pred_list, + num_level_anchors_list, + gt_bboxes_list, + gt_bboxes_ignore_list, + gt_labels_list, + img_metas, + label_channels=label_channels, + unmap_outputs=unmap_outputs, + is_cls_assigner=False) + # no valid anchors + if any([labels is None for labels in all_labels]): + return None + # sampled anchors of all images + num_total_pos = sum([max(inds.numel(), 1) for inds in pos_inds_list]) + num_total_neg = sum([max(inds.numel(), 1) for inds in neg_inds_list]) + # split targets to a list w.r.t. multiple levels + anchors_list = images_to_levels(all_anchors, num_level_anchors_list[0]) + labels_list = images_to_levels(all_labels, num_level_anchors_list[0]) + label_weights_list = images_to_levels(all_label_weights, + num_level_anchors_list[0]) + bbox_targets_list = images_to_levels(all_bbox_targets, + num_level_anchors_list[0]) + bbox_weights_list = images_to_levels(all_bbox_weights, + num_level_anchors_list[0]) + return (anchors_list, labels_list, label_weights_list, + bbox_targets_list, bbox_weights_list, num_total_pos, + num_total_neg) + + def _get_target_single(self, + flat_anchors, + valid_flags, + cls_scores, + bbox_preds, + num_level_anchors, + gt_bboxes, + gt_bboxes_ignore, + gt_labels, + img_meta, + label_channels=1, + unmap_outputs=True, + is_cls_assigner=True): + """Compute regression, classification targets for anchors in a single + image. + + Args: + flat_anchors (Tensor): Multi-level anchors of the image, + which are concatenated into a single tensor of shape + (num_base_priors, 4). + valid_flags (Tensor): Multi level valid flags of the image, + which are concatenated into a single tensor of + shape (num_base_priors,). + cls_scores (Tensor): Classification scores for all scale + levels of the image. + bbox_preds (Tensor): Box energies / deltas for all scale + levels of the image. + num_level_anchors (list[int]): Number of anchors of each + scale level. + gt_bboxes (Tensor): Ground truth bboxes of the image, + shape (num_gts, 4). + gt_bboxes_ignore (Tensor): Ground truth bboxes to be + ignored, shape (num_ignored_gts, ). + gt_labels (Tensor): Ground truth labels of each box, + shape (num_gts, ). + img_meta (dict): Meta info of the image. + label_channels (int): Channel of label. Default: 1. + unmap_outputs (bool): Whether to map outputs back to the original + set of anchors. Default: True. + is_cls_assigner (bool): Classification or regression. + Default: True. + + Returns: + tuple: N is the number of total anchors in the image. + - labels (Tensor): Labels of all anchors in the image with \ + shape (N, ). + - label_weights (Tensor): Label weights of all anchor in the \ + image with shape (N, ). + - bbox_targets (Tensor): BBox targets of all anchors in the \ + image with shape (N, 4). + - bbox_weights (Tensor): BBox weights of all anchors in the \ + image with shape (N, 4) + - pos_inds (Tensor): Indices of positive anchor with shape \ + (num_pos, ). + - neg_inds (Tensor): Indices of negative anchor with shape \ + (num_neg, ). + """ + inside_flags = anchor_inside_flags(flat_anchors, valid_flags, + img_meta['img_shape'][:2], + self.train_cfg.allowed_border) + if not inside_flags.any(): + return (None, ) * 7 + # assign gt and sample anchors + anchors = flat_anchors[inside_flags, :] + + num_level_anchors_inside = self.get_num_level_anchors_inside( + num_level_anchors, inside_flags) + bbox_preds_valid = bbox_preds[inside_flags, :] + cls_scores_valid = cls_scores[inside_flags, :] + + assigner = self.cls_assigner if is_cls_assigner else self.reg_assigner + + # decode prediction out of assigner + bbox_preds_valid = self.bbox_coder.decode(anchors, bbox_preds_valid) + assign_result = assigner.assign(anchors, num_level_anchors_inside, + gt_bboxes, gt_bboxes_ignore, gt_labels, + cls_scores_valid, bbox_preds_valid) + sampling_result = self.sampler.sample(assign_result, anchors, + gt_bboxes) + + num_valid_anchors = anchors.shape[0] + bbox_targets = torch.zeros_like(anchors) + bbox_weights = torch.zeros_like(anchors) + labels = anchors.new_full((num_valid_anchors, ), + self.num_classes, + dtype=torch.long) + label_weights = anchors.new_zeros(num_valid_anchors, dtype=torch.float) + + pos_inds = sampling_result.pos_inds + neg_inds = sampling_result.neg_inds + if len(pos_inds) > 0: + if hasattr(self, 'bbox_coder'): + pos_bbox_targets = self.bbox_coder.encode( + sampling_result.pos_bboxes, sampling_result.pos_gt_bboxes) + else: + # used in VFNetHead + pos_bbox_targets = sampling_result.pos_gt_bboxes + bbox_targets[pos_inds, :] = pos_bbox_targets + bbox_weights[pos_inds, :] = 1.0 + if gt_labels is None: + # Only rpn gives gt_labels as None + # Foreground is the first class since v2.5.0 + labels[pos_inds] = 0 + else: + labels[pos_inds] = gt_labels[ + sampling_result.pos_assigned_gt_inds] + if self.train_cfg.pos_weight <= 0: + label_weights[pos_inds] = 1.0 + else: + label_weights[pos_inds] = self.train_cfg.pos_weight + if len(neg_inds) > 0: + label_weights[neg_inds] = 1.0 + + # map up to original set of anchors + if unmap_outputs: + num_total_anchors = flat_anchors.size(0) + anchors = unmap(anchors, num_total_anchors, inside_flags) + labels = unmap( + labels, num_total_anchors, inside_flags, fill=self.num_classes) + label_weights = unmap(label_weights, num_total_anchors, + inside_flags) + bbox_targets = unmap(bbox_targets, num_total_anchors, inside_flags) + bbox_weights = unmap(bbox_weights, num_total_anchors, inside_flags) + + return (anchors, labels, label_weights, bbox_targets, bbox_weights, + pos_inds, neg_inds) + + def get_num_level_anchors_inside(self, num_level_anchors, inside_flags): + """Get the anchors of each scale level inside. + + Args: + num_level_anchors (list[int]): Number of anchors of each + scale level. + inside_flags (Tensor): Multi level inside flags of the image, + which are concatenated into a single tensor of + shape (num_base_priors,). + + Returns: + list[int]: Number of anchors of each scale level inside. + """ + split_inside_flags = torch.split(inside_flags, num_level_anchors) + num_level_anchors_inside = [ + int(flags.sum()) for flags in split_inside_flags + ] + return num_level_anchors_inside diff --git a/mmdet/models/dense_heads/deformable_detr_head.py b/mmdet/models/dense_heads/deformable_detr_head.py new file mode 100644 index 0000000..31290db --- /dev/null +++ b/mmdet/models/dense_heads/deformable_detr_head.py @@ -0,0 +1,318 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import Linear, bias_init_with_prob, constant_init +from mmcv.runner import force_fp32 + +from mmdet.core import multi_apply +from mmdet.models.utils.transformer import inverse_sigmoid +from ..builder import HEADS +from .detr_head import DETRHead + + +@HEADS.register_module() +class DeformableDETRHead(DETRHead): + """Head of DeformDETR: Deformable DETR: Deformable Transformers for End-to- + End Object Detection. + + Code is modified from the `official github repo + `_. + + More details can be found in the `paper + `_ . + + Args: + with_box_refine (bool): Whether to refine the reference points + in the decoder. Defaults to False. + as_two_stage (bool) : Whether to generate the proposal from + the outputs of encoder. + transformer (obj:`ConfigDict`): ConfigDict is used for building + the Encoder and Decoder. + """ + + def __init__(self, + *args, + with_box_refine=False, + as_two_stage=False, + transformer=None, + **kwargs): + self.with_box_refine = with_box_refine + self.as_two_stage = as_two_stage + if self.as_two_stage: + transformer['as_two_stage'] = self.as_two_stage + + super(DeformableDETRHead, self).__init__( + *args, transformer=transformer, **kwargs) + + def _init_layers(self): + """Initialize classification branch and regression branch of head.""" + + fc_cls = Linear(self.embed_dims, self.cls_out_channels) + reg_branch = [] + for _ in range(self.num_reg_fcs): + reg_branch.append(Linear(self.embed_dims, self.embed_dims)) + reg_branch.append(nn.ReLU()) + reg_branch.append(Linear(self.embed_dims, 4)) + reg_branch = nn.Sequential(*reg_branch) + + def _get_clones(module, N): + return nn.ModuleList([copy.deepcopy(module) for i in range(N)]) + + # last reg_branch is used to generate proposal from + # encode feature map when as_two_stage is True. + num_pred = (self.transformer.decoder.num_layers + 1) if \ + self.as_two_stage else self.transformer.decoder.num_layers + + if self.with_box_refine: + self.cls_branches = _get_clones(fc_cls, num_pred) + self.reg_branches = _get_clones(reg_branch, num_pred) + else: + + self.cls_branches = nn.ModuleList( + [fc_cls for _ in range(num_pred)]) + self.reg_branches = nn.ModuleList( + [reg_branch for _ in range(num_pred)]) + + if not self.as_two_stage: + self.query_embedding = nn.Embedding(self.num_query, + self.embed_dims * 2) + + def init_weights(self): + """Initialize weights of the DeformDETR head.""" + self.transformer.init_weights() + if self.loss_cls.use_sigmoid: + bias_init = bias_init_with_prob(0.01) + for m in self.cls_branches: + nn.init.constant_(m.bias, bias_init) + for m in self.reg_branches: + constant_init(m[-1], 0, bias=0) + nn.init.constant_(self.reg_branches[0][-1].bias.data[2:], -2.0) + if self.as_two_stage: + for m in self.reg_branches: + nn.init.constant_(m[-1].bias.data[2:], 0.0) + + def forward(self, mlvl_feats, img_metas): + """Forward function. + + Args: + mlvl_feats (tuple[Tensor]): Features from the upstream + network, each is a 4D-tensor with shape + (N, C, H, W). + img_metas (list[dict]): List of image information. + + Returns: + all_cls_scores (Tensor): Outputs from the classification head, \ + shape [nb_dec, bs, num_query, cls_out_channels]. Note \ + cls_out_channels should includes background. + all_bbox_preds (Tensor): Sigmoid outputs from the regression \ + head with normalized coordinate format (cx, cy, w, h). \ + Shape [nb_dec, bs, num_query, 4]. + enc_outputs_class (Tensor): The score of each point on encode \ + feature map, has shape (N, h*w, num_class). Only when \ + as_two_stage is True it would be returned, otherwise \ + `None` would be returned. + enc_outputs_coord (Tensor): The proposal generate from the \ + encode feature map, has shape (N, h*w, 4). Only when \ + as_two_stage is True it would be returned, otherwise \ + `None` would be returned. + """ + + batch_size = mlvl_feats[0].size(0) + input_img_h, input_img_w = img_metas[0]['batch_input_shape'] + img_masks = mlvl_feats[0].new_ones( + (batch_size, input_img_h, input_img_w)) + for img_id in range(batch_size): + img_h, img_w, _ = img_metas[img_id]['img_shape'] + img_masks[img_id, :img_h, :img_w] = 0 + + mlvl_masks = [] + mlvl_positional_encodings = [] + for feat in mlvl_feats: + mlvl_masks.append( + F.interpolate(img_masks[None], + size=feat.shape[-2:]).to(torch.bool).squeeze(0)) + mlvl_positional_encodings.append( + self.positional_encoding(mlvl_masks[-1])) + + query_embeds = None + if not self.as_two_stage: + query_embeds = self.query_embedding.weight + hs, init_reference, inter_references, \ + enc_outputs_class, enc_outputs_coord = self.transformer( + mlvl_feats, + mlvl_masks, + query_embeds, + mlvl_positional_encodings, + reg_branches=self.reg_branches if self.with_box_refine else None, # noqa:E501 + cls_branches=self.cls_branches if self.as_two_stage else None # noqa:E501 + ) + hs = hs.permute(0, 2, 1, 3) + outputs_classes = [] + outputs_coords = [] + + for lvl in range(hs.shape[0]): + if lvl == 0: + reference = init_reference + else: + reference = inter_references[lvl - 1] + reference = inverse_sigmoid(reference) + outputs_class = self.cls_branches[lvl](hs[lvl]) + tmp = self.reg_branches[lvl](hs[lvl]) + if reference.shape[-1] == 4: + tmp += reference + else: + assert reference.shape[-1] == 2 + tmp[..., :2] += reference + outputs_coord = tmp.sigmoid() + outputs_classes.append(outputs_class) + outputs_coords.append(outputs_coord) + + outputs_classes = torch.stack(outputs_classes) + outputs_coords = torch.stack(outputs_coords) + if self.as_two_stage: + return outputs_classes, outputs_coords, \ + enc_outputs_class, \ + enc_outputs_coord.sigmoid() + else: + return outputs_classes, outputs_coords, \ + None, None + + @force_fp32(apply_to=('all_cls_scores', 'all_bbox_preds')) + def loss(self, + all_cls_scores, + all_bbox_preds, + enc_cls_scores, + enc_bbox_preds, + gt_bboxes_list, + gt_labels_list, + img_metas, + gt_bboxes_ignore=None): + """"Loss function. + + Args: + all_cls_scores (Tensor): Classification score of all + decoder layers, has shape + [nb_dec, bs, num_query, cls_out_channels]. + all_bbox_preds (Tensor): Sigmoid regression + outputs of all decode layers. Each is a 4D-tensor with + normalized coordinate format (cx, cy, w, h) and shape + [nb_dec, bs, num_query, 4]. + enc_cls_scores (Tensor): Classification scores of + points on encode feature map , has shape + (N, h*w, num_classes). Only be passed when as_two_stage is + True, otherwise is None. + enc_bbox_preds (Tensor): Regression results of each points + on the encode feature map, has shape (N, h*w, 4). Only be + passed when as_two_stage is True, otherwise is None. + gt_bboxes_list (list[Tensor]): Ground truth bboxes for each image + with shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels_list (list[Tensor]): Ground truth class indices for each + image with shape (num_gts, ). + img_metas (list[dict]): List of image meta information. + gt_bboxes_ignore (list[Tensor], optional): Bounding boxes + which can be ignored for each image. Default None. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + assert gt_bboxes_ignore is None, \ + f'{self.__class__.__name__} only supports ' \ + f'for gt_bboxes_ignore setting to None.' + + num_dec_layers = len(all_cls_scores) + all_gt_bboxes_list = [gt_bboxes_list for _ in range(num_dec_layers)] + all_gt_labels_list = [gt_labels_list for _ in range(num_dec_layers)] + all_gt_bboxes_ignore_list = [ + gt_bboxes_ignore for _ in range(num_dec_layers) + ] + img_metas_list = [img_metas for _ in range(num_dec_layers)] + + losses_cls, losses_bbox, losses_iou = multi_apply( + self.loss_single, all_cls_scores, all_bbox_preds, + all_gt_bboxes_list, all_gt_labels_list, img_metas_list, + all_gt_bboxes_ignore_list) + + loss_dict = dict() + # loss of proposal generated from encode feature map. + if enc_cls_scores is not None: + binary_labels_list = [ + torch.zeros_like(gt_labels_list[i]) + for i in range(len(img_metas)) + ] + enc_loss_cls, enc_losses_bbox, enc_losses_iou = \ + self.loss_single(enc_cls_scores, enc_bbox_preds, + gt_bboxes_list, binary_labels_list, + img_metas, gt_bboxes_ignore) + loss_dict['enc_loss_cls'] = enc_loss_cls + loss_dict['enc_loss_bbox'] = enc_losses_bbox + loss_dict['enc_loss_iou'] = enc_losses_iou + + # loss from the last decoder layer + loss_dict['loss_cls'] = losses_cls[-1] + loss_dict['loss_bbox'] = losses_bbox[-1] + loss_dict['loss_iou'] = losses_iou[-1] + # loss from other decoder layers + num_dec_layer = 0 + for loss_cls_i, loss_bbox_i, loss_iou_i in zip(losses_cls[:-1], + losses_bbox[:-1], + losses_iou[:-1]): + loss_dict[f'd{num_dec_layer}.loss_cls'] = loss_cls_i + loss_dict[f'd{num_dec_layer}.loss_bbox'] = loss_bbox_i + loss_dict[f'd{num_dec_layer}.loss_iou'] = loss_iou_i + num_dec_layer += 1 + return loss_dict + + @force_fp32(apply_to=('all_cls_scores', 'all_bbox_preds')) + def get_bboxes(self, + all_cls_scores, + all_bbox_preds, + enc_cls_scores, + enc_bbox_preds, + img_metas, + rescale=False): + """Transform network outputs for a batch into bbox predictions. + + Args: + all_cls_scores (Tensor): Classification score of all + decoder layers, has shape + [nb_dec, bs, num_query, cls_out_channels]. + all_bbox_preds (Tensor): Sigmoid regression + outputs of all decode layers. Each is a 4D-tensor with + normalized coordinate format (cx, cy, w, h) and shape + [nb_dec, bs, num_query, 4]. + enc_cls_scores (Tensor): Classification scores of + points on encode feature map , has shape + (N, h*w, num_classes). Only be passed when as_two_stage is + True, otherwise is None. + enc_bbox_preds (Tensor): Regression results of each points + on the encode feature map, has shape (N, h*w, 4). Only be + passed when as_two_stage is True, otherwise is None. + img_metas (list[dict]): Meta information of each image. + rescale (bool, optional): If True, return boxes in original + image space. Default False. + + Returns: + list[list[Tensor, Tensor]]: Each item in result_list is 2-tuple. \ + The first item is an (n, 5) tensor, where the first 4 columns \ + are bounding box positions (tl_x, tl_y, br_x, br_y) and the \ + 5-th column is a score between 0 and 1. The second item is a \ + (n,) tensor where each item is the predicted class label of \ + the corresponding box. + """ + cls_scores = all_cls_scores[-1] + bbox_preds = all_bbox_preds[-1] + + result_list = [] + for img_id in range(len(img_metas)): + cls_score = cls_scores[img_id] + bbox_pred = bbox_preds[img_id] + img_shape = img_metas[img_id]['img_shape'] + scale_factor = img_metas[img_id]['scale_factor'] + proposals = self._get_bboxes_single(cls_score, bbox_pred, + img_shape, scale_factor, + rescale) + result_list.append(proposals) + return result_list diff --git a/mmdet/models/dense_heads/dense_test_mixins.py b/mmdet/models/dense_heads/dense_test_mixins.py new file mode 100644 index 0000000..1b1e70e --- /dev/null +++ b/mmdet/models/dense_heads/dense_test_mixins.py @@ -0,0 +1,206 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import sys +from inspect import signature + +import torch +from mmcv.ops import batched_nms + +from mmdet.core import bbox_mapping_back, merge_aug_proposals + +if sys.version_info >= (3, 7): + from mmdet.utils.contextmanagers import completed + + +class BBoxTestMixin(object): + """Mixin class for testing det bboxes via DenseHead.""" + + def simple_test_bboxes(self, feats, img_metas, rescale=False): + """Test det bboxes without test-time augmentation, can be applied in + DenseHead except for ``RPNHead`` and its variants, e.g., ``GARPNHead``, + etc. + + Args: + feats (tuple[torch.Tensor]): Multi-level features from the + upstream network, each is a 4D-tensor. + img_metas (list[dict]): List of image information. + rescale (bool, optional): Whether to rescale the results. + Defaults to False. + + Returns: + list[tuple[Tensor, Tensor]]: Each item in result_list is 2-tuple. + The first item is ``bboxes`` with shape (n, 5), + where 5 represent (tl_x, tl_y, br_x, br_y, score). + The shape of the second tensor in the tuple is ``labels`` + with shape (n,) + """ + outs = self.forward(feats) # TODO 这怎么搞,这里会绑定原始的head + results_list = self.get_bboxes( + *outs, img_metas=img_metas, rescale=rescale) + return results_list + + def aug_test_bboxes(self, feats, img_metas, rescale=False): + """Test det bboxes with test time augmentation, can be applied in + DenseHead except for ``RPNHead`` and its variants, e.g., ``GARPNHead``, + etc. + + Args: + feats (list[Tensor]): the outer list indicates test-time + augmentations and inner Tensor should have a shape NxCxHxW, + which contains features for all images in the batch. + img_metas (list[list[dict]]): the outer list indicates test-time + augs (multiscale, flip, etc.) and the inner list indicates + images in a batch. each dict has image information. + rescale (bool, optional): Whether to rescale the results. + Defaults to False. + + Returns: + list[tuple[Tensor, Tensor]]: Each item in result_list is 2-tuple. + The first item is ``bboxes`` with shape (n, 5), + where 5 represent (tl_x, tl_y, br_x, br_y, score). + The shape of the second tensor in the tuple is ``labels`` + with shape (n,). The length of list should always be 1. + """ + # check with_nms argument + gb_sig = signature(self.get_bboxes) + gb_args = [p.name for p in gb_sig.parameters.values()] + gbs_sig = signature(self._get_bboxes_single) + gbs_args = [p.name for p in gbs_sig.parameters.values()] + assert ('with_nms' in gb_args) and ('with_nms' in gbs_args), \ + f'{self.__class__.__name__}' \ + ' does not support test-time augmentation' + + aug_bboxes = [] + aug_scores = [] + aug_labels = [] + for x, img_meta in zip(feats, img_metas): + # only one image in the batch + outs = self.forward(x) + bbox_outputs = self.get_bboxes( + *outs, + img_metas=img_meta, + cfg=self.test_cfg, + rescale=False, + with_nms=False)[0] + aug_bboxes.append(bbox_outputs[0]) + aug_scores.append(bbox_outputs[1]) + if len(bbox_outputs) >= 3: + aug_labels.append(bbox_outputs[2]) + + # after merging, bboxes will be rescaled to the original image size + merged_bboxes, merged_scores = self.merge_aug_bboxes( + aug_bboxes, aug_scores, img_metas) + merged_labels = torch.cat(aug_labels, dim=0) if aug_labels else None + + if merged_bboxes.numel() == 0: + det_bboxes = torch.cat([merged_bboxes, merged_scores[:, None]], -1) + return [ + (det_bboxes, merged_labels), + ] + + det_bboxes, keep_idxs = batched_nms(merged_bboxes, merged_scores, + merged_labels, self.test_cfg.nms) + det_bboxes = det_bboxes[:self.test_cfg.max_per_img] + det_labels = merged_labels[keep_idxs][:self.test_cfg.max_per_img] + + if rescale: + _det_bboxes = det_bboxes + else: + _det_bboxes = det_bboxes.clone() + _det_bboxes[:, :4] *= det_bboxes.new_tensor( + img_metas[0][0]['scale_factor']) + + return [ + (_det_bboxes, det_labels), + ] + + def simple_test_rpn(self, x, img_metas): + """Test without augmentation, only for ``RPNHead`` and its variants, + e.g., ``GARPNHead``, etc. + + Args: + x (tuple[Tensor]): Features from the upstream network, each is + a 4D-tensor. + img_metas (list[dict]): Meta info of each image. + + Returns: + list[Tensor]: Proposals of each image, each item has shape (n, 5), + where 5 represent (tl_x, tl_y, br_x, br_y, score). + """ + rpn_outs = self(x) + proposal_list = self.get_bboxes(*rpn_outs, img_metas=img_metas) + return proposal_list + + def aug_test_rpn(self, feats, img_metas): + """Test with augmentation for only for ``RPNHead`` and its variants, + e.g., ``GARPNHead``, etc. + + Args: + feats (tuple[Tensor]): Features from the upstream network, each is + a 4D-tensor. + img_metas (list[dict]): Meta info of each image. + + Returns: + list[Tensor]: Proposals of each image, each item has shape (n, 5), + where 5 represent (tl_x, tl_y, br_x, br_y, score). + """ + samples_per_gpu = len(img_metas[0]) + aug_proposals = [[] for _ in range(samples_per_gpu)] + for x, img_meta in zip(feats, img_metas): + proposal_list = self.simple_test_rpn(x, img_meta) + for i, proposals in enumerate(proposal_list): + aug_proposals[i].append(proposals) + # reorganize the order of 'img_metas' to match the dimensions + # of 'aug_proposals' + aug_img_metas = [] + for i in range(samples_per_gpu): + aug_img_meta = [] + for j in range(len(img_metas)): + aug_img_meta.append(img_metas[j][i]) + aug_img_metas.append(aug_img_meta) + # after merging, proposals will be rescaled to the original image size + merged_proposals = [ + merge_aug_proposals(proposals, aug_img_meta, self.test_cfg) + for proposals, aug_img_meta in zip(aug_proposals, aug_img_metas) + ] + return merged_proposals + + if sys.version_info >= (3, 7): + + async def async_simple_test_rpn(self, x, img_metas): + sleep_interval = self.test_cfg.pop('async_sleep_interval', 0.025) + async with completed( + __name__, 'rpn_head_forward', + sleep_interval=sleep_interval): + rpn_outs = self(x) + + proposal_list = self.get_bboxes(*rpn_outs, img_metas=img_metas) + return proposal_list + + def merge_aug_bboxes(self, aug_bboxes, aug_scores, img_metas): + """Merge augmented detection bboxes and scores. + + Args: + aug_bboxes (list[Tensor]): shape (n, 4*#class) + aug_scores (list[Tensor] or None): shape (n, #class) + img_shapes (list[Tensor]): shape (3, ). + + Returns: + tuple[Tensor]: ``bboxes`` with shape (n,4), where + 4 represent (tl_x, tl_y, br_x, br_y) + and ``scores`` with shape (n,). + """ + recovered_bboxes = [] + for bboxes, img_info in zip(aug_bboxes, img_metas): + img_shape = img_info[0]['img_shape'] + scale_factor = img_info[0]['scale_factor'] + flip = img_info[0]['flip'] + flip_direction = img_info[0]['flip_direction'] + bboxes = bbox_mapping_back(bboxes, img_shape, scale_factor, flip, + flip_direction) + recovered_bboxes.append(bboxes) + bboxes = torch.cat(recovered_bboxes, dim=0) + if aug_scores is None: + return bboxes + else: + scores = torch.cat(aug_scores, dim=0) + return bboxes, scores diff --git a/mmdet/models/dense_heads/detr_head.py b/mmdet/models/dense_heads/detr_head.py new file mode 100644 index 0000000..de1913c --- /dev/null +++ b/mmdet/models/dense_heads/detr_head.py @@ -0,0 +1,844 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import Conv2d, Linear, build_activation_layer +from mmcv.cnn.bricks.transformer import FFN, build_positional_encoding +from mmcv.runner import force_fp32 + +from mmdet.core import (bbox_cxcywh_to_xyxy, bbox_xyxy_to_cxcywh, + build_assigner, build_sampler, multi_apply, + reduce_mean) +from mmdet.models.utils import build_transformer +from ..builder import HEADS, build_loss +from .anchor_free_head import AnchorFreeHead + + +@HEADS.register_module() +class DETRHead(AnchorFreeHead): + """Implements the DETR transformer head. + + See `paper: End-to-End Object Detection with Transformers + `_ for details. + + Args: + num_classes (int): Number of categories excluding the background. + in_channels (int): Number of channels in the input feature map. + num_query (int): Number of query in Transformer. + num_reg_fcs (int, optional): Number of fully-connected layers used in + `FFN`, which is then used for the regression head. Default 2. + transformer (obj:`mmcv.ConfigDict`|dict): Config for transformer. + Default: None. + sync_cls_avg_factor (bool): Whether to sync the avg_factor of + all ranks. Default to False. + positional_encoding (obj:`mmcv.ConfigDict`|dict): + Config for position encoding. + loss_cls (obj:`mmcv.ConfigDict`|dict): Config of the + classification loss. Default `CrossEntropyLoss`. + loss_bbox (obj:`mmcv.ConfigDict`|dict): Config of the + regression loss. Default `L1Loss`. + loss_iou (obj:`mmcv.ConfigDict`|dict): Config of the + regression iou loss. Default `GIoULoss`. + tran_cfg (obj:`mmcv.ConfigDict`|dict): Training config of + transformer head. + test_cfg (obj:`mmcv.ConfigDict`|dict): Testing config of + transformer head. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + _version = 2 + + def __init__(self, + num_classes, + in_channels, + num_query=100, + num_reg_fcs=2, + transformer=None, + sync_cls_avg_factor=False, + positional_encoding=dict( + type='SinePositionalEncoding', + num_feats=128, + normalize=True), + loss_cls=dict( + type='CrossEntropyLoss', + bg_cls_weight=0.1, + use_sigmoid=False, + loss_weight=1.0, + class_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=5.0), + loss_iou=dict(type='GIoULoss', loss_weight=2.0), + train_cfg=dict( + assigner=dict( + type='HungarianAssigner', + cls_cost=dict(type='ClassificationCost', weight=1.), + reg_cost=dict(type='BBoxL1Cost', weight=5.0), + iou_cost=dict( + type='IoUCost', iou_mode='giou', weight=2.0))), + test_cfg=dict(max_per_img=100), + init_cfg=None, + **kwargs): + # NOTE here use `AnchorFreeHead` instead of `TransformerHead`, + # since it brings inconvenience when the initialization of + # `AnchorFreeHead` is called. + super(AnchorFreeHead, self).__init__(init_cfg) + self.bg_cls_weight = 0 + self.sync_cls_avg_factor = sync_cls_avg_factor + class_weight = loss_cls.get('class_weight', None) + if class_weight is not None and (self.__class__ is DETRHead): + assert isinstance(class_weight, float), 'Expected ' \ + 'class_weight to have type float. Found ' \ + f'{type(class_weight)}.' + # NOTE following the official DETR rep0, bg_cls_weight means + # relative classification weight of the no-object class. + bg_cls_weight = loss_cls.get('bg_cls_weight', class_weight) + assert isinstance(bg_cls_weight, float), 'Expected ' \ + 'bg_cls_weight to have type float. Found ' \ + f'{type(bg_cls_weight)}.' + class_weight = torch.ones(num_classes + 1) * class_weight + # set background class as the last indice + class_weight[num_classes] = bg_cls_weight + loss_cls.update({'class_weight': class_weight}) + if 'bg_cls_weight' in loss_cls: + loss_cls.pop('bg_cls_weight') + self.bg_cls_weight = bg_cls_weight + + if train_cfg: + assert 'assigner' in train_cfg, 'assigner should be provided '\ + 'when train_cfg is set.' + assigner = train_cfg['assigner'] + assert loss_cls['loss_weight'] == assigner['cls_cost']['weight'], \ + 'The classification weight for loss and matcher should be' \ + 'exactly the same.' + assert loss_bbox['loss_weight'] == assigner['reg_cost'][ + 'weight'], 'The regression L1 weight for loss and matcher ' \ + 'should be exactly the same.' + assert loss_iou['loss_weight'] == assigner['iou_cost']['weight'], \ + 'The regression iou weight for loss and matcher should be' \ + 'exactly the same.' + self.assigner = build_assigner(assigner) + # DETR sampling=False, so use PseudoSampler + sampler_cfg = dict(type='PseudoSampler') + self.sampler = build_sampler(sampler_cfg, context=self) + self.num_query = num_query + self.num_classes = num_classes + self.in_channels = in_channels + self.num_reg_fcs = num_reg_fcs + self.train_cfg = train_cfg + self.test_cfg = test_cfg + self.fp16_enabled = False + self.loss_cls = build_loss(loss_cls) + self.loss_bbox = build_loss(loss_bbox) + self.loss_iou = build_loss(loss_iou) + + if self.loss_cls.use_sigmoid: + self.cls_out_channels = num_classes + else: + self.cls_out_channels = num_classes + 1 + self.act_cfg = transformer.get('act_cfg', + dict(type='ReLU', inplace=True)) + self.activate = build_activation_layer(self.act_cfg) + self.positional_encoding = build_positional_encoding( + positional_encoding) + self.transformer = build_transformer(transformer) + self.embed_dims = self.transformer.embed_dims + assert 'num_feats' in positional_encoding + num_feats = positional_encoding['num_feats'] + assert num_feats * 2 == self.embed_dims, 'embed_dims should' \ + f' be exactly 2 times of num_feats. Found {self.embed_dims}' \ + f' and {num_feats}.' + self._init_layers() + + def _init_layers(self): + """Initialize layers of the transformer head.""" + self.input_proj = Conv2d( + self.in_channels, self.embed_dims, kernel_size=1) + self.fc_cls = Linear(self.embed_dims, self.cls_out_channels) + self.reg_ffn = FFN( + self.embed_dims, + self.embed_dims, + self.num_reg_fcs, + self.act_cfg, + dropout=0.0, + add_residual=False) + self.fc_reg = Linear(self.embed_dims, 4) + self.query_embedding = nn.Embedding(self.num_query, self.embed_dims) + + def init_weights(self): + """Initialize weights of the transformer head.""" + # The initialization for transformer is important + self.transformer.init_weights() + + def _load_from_state_dict(self, state_dict, prefix, local_metadata, strict, + missing_keys, unexpected_keys, error_msgs): + """load checkpoints.""" + # NOTE here use `AnchorFreeHead` instead of `TransformerHead`, + # since `AnchorFreeHead._load_from_state_dict` should not be + # called here. Invoking the default `Module._load_from_state_dict` + # is enough. + + # Names of some parameters in has been changed. + version = local_metadata.get('version', None) + if (version is None or version < 2) and self.__class__ is DETRHead: + convert_dict = { + '.self_attn.': '.attentions.0.', + '.ffn.': '.ffns.0.', + '.multihead_attn.': '.attentions.1.', + '.decoder.norm.': '.decoder.post_norm.' + } + state_dict_keys = list(state_dict.keys()) + for k in state_dict_keys: + for ori_key, convert_key in convert_dict.items(): + if ori_key in k: + convert_key = k.replace(ori_key, convert_key) + state_dict[convert_key] = state_dict[k] + del state_dict[k] + + super(AnchorFreeHead, + self)._load_from_state_dict(state_dict, prefix, local_metadata, + strict, missing_keys, + unexpected_keys, error_msgs) + + def forward(self, feats, img_metas): + """Forward function. + + Args: + feats (tuple[Tensor]): Features from the upstream network, each is + a 4D-tensor. + img_metas (list[dict]): List of image information. + + Returns: + tuple[list[Tensor], list[Tensor]]: Outputs for all scale levels. + + - all_cls_scores_list (list[Tensor]): Classification scores \ + for each scale level. Each is a 4D-tensor with shape \ + [nb_dec, bs, num_query, cls_out_channels]. Note \ + `cls_out_channels` should includes background. + - all_bbox_preds_list (list[Tensor]): Sigmoid regression \ + outputs for each scale level. Each is a 4D-tensor with \ + normalized coordinate format (cx, cy, w, h) and shape \ + [nb_dec, bs, num_query, 4]. + """ + num_levels = len(feats) + img_metas_list = [img_metas for _ in range(num_levels)] + return multi_apply(self.forward_single, feats, img_metas_list) + + def forward_single(self, x, img_metas): + """"Forward function for a single feature level. + + Args: + x (Tensor): Input feature from backbone's single stage, shape + [bs, c, h, w]. + img_metas (list[dict]): List of image information. + + Returns: + all_cls_scores (Tensor): Outputs from the classification head, + shape [nb_dec, bs, num_query, cls_out_channels]. Note + cls_out_channels should includes background. + all_bbox_preds (Tensor): Sigmoid outputs from the regression + head with normalized coordinate format (cx, cy, w, h). + Shape [nb_dec, bs, num_query, 4]. + """ + # construct binary masks which used for the transformer. + # NOTE following the official DETR repo, non-zero values representing + # ignored positions, while zero values means valid positions. + batch_size = x.size(0) + input_img_h, input_img_w = img_metas[0]['batch_input_shape'] + masks = x.new_ones((batch_size, input_img_h, input_img_w)) + for img_id in range(batch_size): + img_h, img_w, _ = img_metas[img_id]['img_shape'] + masks[img_id, :img_h, :img_w] = 0 + + x = self.input_proj(x) + # interpolate masks to have the same spatial shape with x + masks = F.interpolate( + masks.unsqueeze(1), size=x.shape[-2:]).to(torch.bool).squeeze(1) + # position encoding + pos_embed = self.positional_encoding(masks) # [bs, embed_dim, h, w] + # outs_dec: [nb_dec, bs, num_query, embed_dim] + outs_dec, _ = self.transformer(x, masks, self.query_embedding.weight, + pos_embed) + + all_cls_scores = self.fc_cls(outs_dec) + all_bbox_preds = self.fc_reg(self.activate( + self.reg_ffn(outs_dec))).sigmoid() + return all_cls_scores, all_bbox_preds + + @force_fp32(apply_to=('all_cls_scores_list', 'all_bbox_preds_list')) + def loss(self, + all_cls_scores_list, + all_bbox_preds_list, + gt_bboxes_list, + gt_labels_list, + img_metas, + gt_bboxes_ignore=None): + """"Loss function. + + Only outputs from the last feature level are used for computing + losses by default. + + Args: + all_cls_scores_list (list[Tensor]): Classification outputs + for each feature level. Each is a 4D-tensor with shape + [nb_dec, bs, num_query, cls_out_channels]. + all_bbox_preds_list (list[Tensor]): Sigmoid regression + outputs for each feature level. Each is a 4D-tensor with + normalized coordinate format (cx, cy, w, h) and shape + [nb_dec, bs, num_query, 4]. + gt_bboxes_list (list[Tensor]): Ground truth bboxes for each image + with shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels_list (list[Tensor]): Ground truth class indices for each + image with shape (num_gts, ). + img_metas (list[dict]): List of image meta information. + gt_bboxes_ignore (list[Tensor], optional): Bounding boxes + which can be ignored for each image. Default None. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + # NOTE defaultly only the outputs from the last feature scale is used. + all_cls_scores = all_cls_scores_list[-1] + all_bbox_preds = all_bbox_preds_list[-1] + assert gt_bboxes_ignore is None, \ + 'Only supports for gt_bboxes_ignore setting to None.' + + num_dec_layers = len(all_cls_scores) + all_gt_bboxes_list = [gt_bboxes_list for _ in range(num_dec_layers)] + all_gt_labels_list = [gt_labels_list for _ in range(num_dec_layers)] + all_gt_bboxes_ignore_list = [ + gt_bboxes_ignore for _ in range(num_dec_layers) + ] + img_metas_list = [img_metas for _ in range(num_dec_layers)] + + losses_cls, losses_bbox, losses_iou = multi_apply( + self.loss_single, all_cls_scores, all_bbox_preds, + all_gt_bboxes_list, all_gt_labels_list, img_metas_list, + all_gt_bboxes_ignore_list) + + loss_dict = dict() + # loss from the last decoder layer + loss_dict['loss_cls'] = losses_cls[-1] + loss_dict['loss_bbox'] = losses_bbox[-1] + loss_dict['loss_iou'] = losses_iou[-1] + # loss from other decoder layers + num_dec_layer = 0 + for loss_cls_i, loss_bbox_i, loss_iou_i in zip(losses_cls[:-1], + losses_bbox[:-1], + losses_iou[:-1]): + loss_dict[f'd{num_dec_layer}.loss_cls'] = loss_cls_i + loss_dict[f'd{num_dec_layer}.loss_bbox'] = loss_bbox_i + loss_dict[f'd{num_dec_layer}.loss_iou'] = loss_iou_i + num_dec_layer += 1 + return loss_dict + + def loss_single(self, + cls_scores, + bbox_preds, + gt_bboxes_list, + gt_labels_list, + img_metas, + gt_bboxes_ignore_list=None): + """"Loss function for outputs from a single decoder layer of a single + feature level. + + Args: + cls_scores (Tensor): Box score logits from a single decoder layer + for all images. Shape [bs, num_query, cls_out_channels]. + bbox_preds (Tensor): Sigmoid outputs from a single decoder layer + for all images, with normalized coordinate (cx, cy, w, h) and + shape [bs, num_query, 4]. + gt_bboxes_list (list[Tensor]): Ground truth bboxes for each image + with shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels_list (list[Tensor]): Ground truth class indices for each + image with shape (num_gts, ). + img_metas (list[dict]): List of image meta information. + gt_bboxes_ignore_list (list[Tensor], optional): Bounding + boxes which can be ignored for each image. Default None. + + Returns: + dict[str, Tensor]: A dictionary of loss components for outputs from + a single decoder layer. + """ + num_imgs = cls_scores.size(0) + cls_scores_list = [cls_scores[i] for i in range(num_imgs)] + bbox_preds_list = [bbox_preds[i] for i in range(num_imgs)] + cls_reg_targets = self.get_targets(cls_scores_list, bbox_preds_list, + gt_bboxes_list, gt_labels_list, + img_metas, gt_bboxes_ignore_list) + (labels_list, label_weights_list, bbox_targets_list, bbox_weights_list, + num_total_pos, num_total_neg) = cls_reg_targets + labels = torch.cat(labels_list, 0) + label_weights = torch.cat(label_weights_list, 0) + bbox_targets = torch.cat(bbox_targets_list, 0) + bbox_weights = torch.cat(bbox_weights_list, 0) + + # classification loss + cls_scores = cls_scores.reshape(-1, self.cls_out_channels) + # construct weighted avg_factor to match with the official DETR repo + cls_avg_factor = num_total_pos * 1.0 + \ + num_total_neg * self.bg_cls_weight + if self.sync_cls_avg_factor: + cls_avg_factor = reduce_mean( + cls_scores.new_tensor([cls_avg_factor])) + cls_avg_factor = max(cls_avg_factor, 1) + + loss_cls = self.loss_cls( + cls_scores, labels, label_weights, avg_factor=cls_avg_factor) + + # Compute the average number of gt boxes across all gpus, for + # normalization purposes + num_total_pos = loss_cls.new_tensor([num_total_pos]) + num_total_pos = torch.clamp(reduce_mean(num_total_pos), min=1).item() + + # construct factors used for rescale bboxes + factors = [] + for img_meta, bbox_pred in zip(img_metas, bbox_preds): + img_h, img_w, _ = img_meta['img_shape'] + factor = bbox_pred.new_tensor([img_w, img_h, img_w, + img_h]).unsqueeze(0).repeat( + bbox_pred.size(0), 1) + factors.append(factor) + factors = torch.cat(factors, 0) + + # DETR regress the relative position of boxes (cxcywh) in the image, + # thus the learning target is normalized by the image size. So here + # we need to re-scale them for calculating IoU loss + bbox_preds = bbox_preds.reshape(-1, 4) + bboxes = bbox_cxcywh_to_xyxy(bbox_preds) * factors + bboxes_gt = bbox_cxcywh_to_xyxy(bbox_targets) * factors + + # regression IoU loss, defaultly GIoU loss + loss_iou = self.loss_iou( + bboxes, bboxes_gt, bbox_weights, avg_factor=num_total_pos) + + # regression L1 loss + loss_bbox = self.loss_bbox( + bbox_preds, bbox_targets, bbox_weights, avg_factor=num_total_pos) + return loss_cls, loss_bbox, loss_iou + + def get_targets(self, + cls_scores_list, + bbox_preds_list, + gt_bboxes_list, + gt_labels_list, + img_metas, + gt_bboxes_ignore_list=None): + """"Compute regression and classification targets for a batch image. + + Outputs from a single decoder layer of a single feature level are used. + + Args: + cls_scores_list (list[Tensor]): Box score logits from a single + decoder layer for each image with shape [num_query, + cls_out_channels]. + bbox_preds_list (list[Tensor]): Sigmoid outputs from a single + decoder layer for each image, with normalized coordinate + (cx, cy, w, h) and shape [num_query, 4]. + gt_bboxes_list (list[Tensor]): Ground truth bboxes for each image + with shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels_list (list[Tensor]): Ground truth class indices for each + image with shape (num_gts, ). + img_metas (list[dict]): List of image meta information. + gt_bboxes_ignore_list (list[Tensor], optional): Bounding + boxes which can be ignored for each image. Default None. + + Returns: + tuple: a tuple containing the following targets. + + - labels_list (list[Tensor]): Labels for all images. + - label_weights_list (list[Tensor]): Label weights for all \ + images. + - bbox_targets_list (list[Tensor]): BBox targets for all \ + images. + - bbox_weights_list (list[Tensor]): BBox weights for all \ + images. + - num_total_pos (int): Number of positive samples in all \ + images. + - num_total_neg (int): Number of negative samples in all \ + images. + """ + assert gt_bboxes_ignore_list is None, \ + 'Only supports for gt_bboxes_ignore setting to None.' + num_imgs = len(cls_scores_list) + gt_bboxes_ignore_list = [ + gt_bboxes_ignore_list for _ in range(num_imgs) + ] + + (labels_list, label_weights_list, bbox_targets_list, + bbox_weights_list, pos_inds_list, neg_inds_list) = multi_apply( + self._get_target_single, cls_scores_list, bbox_preds_list, + gt_bboxes_list, gt_labels_list, img_metas, gt_bboxes_ignore_list) + num_total_pos = sum((inds.numel() for inds in pos_inds_list)) + num_total_neg = sum((inds.numel() for inds in neg_inds_list)) + return (labels_list, label_weights_list, bbox_targets_list, + bbox_weights_list, num_total_pos, num_total_neg) + + def _get_target_single(self, + cls_score, + bbox_pred, + gt_bboxes, + gt_labels, + img_meta, + gt_bboxes_ignore=None): + """"Compute regression and classification targets for one image. + + Outputs from a single decoder layer of a single feature level are used. + + Args: + cls_score (Tensor): Box score logits from a single decoder layer + for one image. Shape [num_query, cls_out_channels]. + bbox_pred (Tensor): Sigmoid outputs from a single decoder layer + for one image, with normalized coordinate (cx, cy, w, h) and + shape [num_query, 4]. + gt_bboxes (Tensor): Ground truth bboxes for one image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (Tensor): Ground truth class indices for one image + with shape (num_gts, ). + img_meta (dict): Meta information for one image. + gt_bboxes_ignore (Tensor, optional): Bounding boxes + which can be ignored. Default None. + + Returns: + tuple[Tensor]: a tuple containing the following for one image. + + - labels (Tensor): Labels of each image. + - label_weights (Tensor]): Label weights of each image. + - bbox_targets (Tensor): BBox targets of each image. + - bbox_weights (Tensor): BBox weights of each image. + - pos_inds (Tensor): Sampled positive indices for each image. + - neg_inds (Tensor): Sampled negative indices for each image. + """ + + num_bboxes = bbox_pred.size(0) + # assigner and sampler + assign_result = self.assigner.assign(bbox_pred, cls_score, gt_bboxes, + gt_labels, img_meta, + gt_bboxes_ignore) + sampling_result = self.sampler.sample(assign_result, bbox_pred, + gt_bboxes) + pos_inds = sampling_result.pos_inds + neg_inds = sampling_result.neg_inds + + # label targets + labels = gt_bboxes.new_full((num_bboxes, ), + self.num_classes, + dtype=torch.long) + labels[pos_inds] = gt_labels[sampling_result.pos_assigned_gt_inds] + label_weights = gt_bboxes.new_ones(num_bboxes) + + # bbox targets + bbox_targets = torch.zeros_like(bbox_pred) + bbox_weights = torch.zeros_like(bbox_pred) + bbox_weights[pos_inds] = 1.0 + img_h, img_w, _ = img_meta['img_shape'] + + # DETR regress the relative position of boxes (cxcywh) in the image. + # Thus the learning target should be normalized by the image size, also + # the box format should be converted from defaultly x1y1x2y2 to cxcywh. + factor = bbox_pred.new_tensor([img_w, img_h, img_w, + img_h]).unsqueeze(0) + pos_gt_bboxes_normalized = sampling_result.pos_gt_bboxes / factor + pos_gt_bboxes_targets = bbox_xyxy_to_cxcywh(pos_gt_bboxes_normalized) + bbox_targets[pos_inds] = pos_gt_bboxes_targets + return (labels, label_weights, bbox_targets, bbox_weights, pos_inds, + neg_inds) + + # over-write because img_metas are needed as inputs for bbox_head. + def forward_train(self, + x, + img_metas, + gt_bboxes, + gt_labels=None, + gt_bboxes_ignore=None, + proposal_cfg=None, + **kwargs): + """Forward function for training mode. + + Args: + x (list[Tensor]): Features from backbone. + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes (Tensor): Ground truth bboxes of the image, + shape (num_gts, 4). + gt_labels (Tensor): Ground truth labels of each box, + shape (num_gts,). + gt_bboxes_ignore (Tensor): Ground truth bboxes to be + ignored, shape (num_ignored_gts, 4). + proposal_cfg (mmcv.Config): Test / postprocessing configuration, + if None, test_cfg would be used. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + assert proposal_cfg is None, '"proposal_cfg" must be None' + outs = self(x, img_metas) + if gt_labels is None: + loss_inputs = outs + (gt_bboxes, img_metas) + else: + loss_inputs = outs + (gt_bboxes, gt_labels, img_metas) + losses = self.loss(*loss_inputs, gt_bboxes_ignore=gt_bboxes_ignore) + return losses + + @force_fp32(apply_to=('all_cls_scores_list', 'all_bbox_preds_list')) + def get_bboxes(self, + all_cls_scores_list, + all_bbox_preds_list, + img_metas, + rescale=False): + """Transform network outputs for a batch into bbox predictions. + + Args: + all_cls_scores_list (list[Tensor]): Classification outputs + for each feature level. Each is a 4D-tensor with shape + [nb_dec, bs, num_query, cls_out_channels]. + all_bbox_preds_list (list[Tensor]): Sigmoid regression + outputs for each feature level. Each is a 4D-tensor with + normalized coordinate format (cx, cy, w, h) and shape + [nb_dec, bs, num_query, 4]. + img_metas (list[dict]): Meta information of each image. + rescale (bool, optional): If True, return boxes in original + image space. Default False. + + Returns: + list[list[Tensor, Tensor]]: Each item in result_list is 2-tuple. \ + The first item is an (n, 5) tensor, where the first 4 columns \ + are bounding box positions (tl_x, tl_y, br_x, br_y) and the \ + 5-th column is a score between 0 and 1. The second item is a \ + (n,) tensor where each item is the predicted class label of \ + the corresponding box. + """ + # NOTE defaultly only using outputs from the last feature level, + # and only the outputs from the last decoder layer is used. + cls_scores = all_cls_scores_list[-1][-1] + bbox_preds = all_bbox_preds_list[-1][-1] + + result_list = [] + for img_id in range(len(img_metas)): + cls_score = cls_scores[img_id] + bbox_pred = bbox_preds[img_id] + img_shape = img_metas[img_id]['img_shape'] + scale_factor = img_metas[img_id]['scale_factor'] + proposals = self._get_bboxes_single(cls_score, bbox_pred, + img_shape, scale_factor, + rescale) + result_list.append(proposals) + + return result_list + + def _get_bboxes_single(self, + cls_score, + bbox_pred, + img_shape, + scale_factor, + rescale=False): + """Transform outputs from the last decoder layer into bbox predictions + for each image. + + Args: + cls_score (Tensor): Box score logits from the last decoder layer + for each image. Shape [num_query, cls_out_channels]. + bbox_pred (Tensor): Sigmoid outputs from the last decoder layer + for each image, with coordinate format (cx, cy, w, h) and + shape [num_query, 4]. + img_shape (tuple[int]): Shape of input image, (height, width, 3). + scale_factor (ndarray, optional): Scale factor of the image arange + as (w_scale, h_scale, w_scale, h_scale). + rescale (bool, optional): If True, return boxes in original image + space. Default False. + + Returns: + tuple[Tensor]: Results of detected bboxes and labels. + + - det_bboxes: Predicted bboxes with shape [num_query, 5], \ + where the first 4 columns are bounding box positions \ + (tl_x, tl_y, br_x, br_y) and the 5-th column are scores \ + between 0 and 1. + - det_labels: Predicted labels of the corresponding box with \ + shape [num_query]. + """ + assert len(cls_score) == len(bbox_pred) + max_per_img = self.test_cfg.get('max_per_img', self.num_query) + # exclude background + if self.loss_cls.use_sigmoid: + cls_score = cls_score.sigmoid() + scores, indexes = cls_score.view(-1).topk(max_per_img) + det_labels = indexes % self.num_classes + bbox_index = indexes // self.num_classes + bbox_pred = bbox_pred[bbox_index] + else: + scores, det_labels = F.softmax(cls_score, dim=-1)[..., :-1].max(-1) + scores, bbox_index = scores.topk(max_per_img) + bbox_pred = bbox_pred[bbox_index] + det_labels = det_labels[bbox_index] + + det_bboxes = bbox_cxcywh_to_xyxy(bbox_pred) + det_bboxes[:, 0::2] = det_bboxes[:, 0::2] * img_shape[1] + det_bboxes[:, 1::2] = det_bboxes[:, 1::2] * img_shape[0] + det_bboxes[:, 0::2].clamp_(min=0, max=img_shape[1]) + det_bboxes[:, 1::2].clamp_(min=0, max=img_shape[0]) + if rescale: + det_bboxes /= det_bboxes.new_tensor(scale_factor) + det_bboxes = torch.cat((det_bboxes, scores.unsqueeze(1)), -1) + + return det_bboxes, det_labels + + def simple_test_bboxes(self, feats, img_metas, rescale=False): + """Test det bboxes without test-time augmentation. + + Args: + feats (tuple[torch.Tensor]): Multi-level features from the + upstream network, each is a 4D-tensor. + img_metas (list[dict]): List of image information. + rescale (bool, optional): Whether to rescale the results. + Defaults to False. + + Returns: + list[tuple[Tensor, Tensor]]: Each item in result_list is 2-tuple. + The first item is ``bboxes`` with shape (n, 5), + where 5 represent (tl_x, tl_y, br_x, br_y, score). + The shape of the second tensor in the tuple is ``labels`` + with shape (n,) + """ + # forward of this head requires img_metas + outs = self.forward(feats, img_metas) + results_list = self.get_bboxes(*outs, img_metas, rescale=rescale) + return results_list + + def forward_onnx(self, feats, img_metas): + """Forward function for exporting to ONNX. + + Over-write `forward` because: `masks` is directly created with + zero (valid position tag) and has the same spatial size as `x`. + Thus the construction of `masks` is different from that in `forward`. + + Args: + feats (tuple[Tensor]): Features from the upstream network, each is + a 4D-tensor. + img_metas (list[dict]): List of image information. + + Returns: + tuple[list[Tensor], list[Tensor]]: Outputs for all scale levels. + + - all_cls_scores_list (list[Tensor]): Classification scores \ + for each scale level. Each is a 4D-tensor with shape \ + [nb_dec, bs, num_query, cls_out_channels]. Note \ + `cls_out_channels` should includes background. + - all_bbox_preds_list (list[Tensor]): Sigmoid regression \ + outputs for each scale level. Each is a 4D-tensor with \ + normalized coordinate format (cx, cy, w, h) and shape \ + [nb_dec, bs, num_query, 4]. + """ + num_levels = len(feats) + img_metas_list = [img_metas for _ in range(num_levels)] + return multi_apply(self.forward_single_onnx, feats, img_metas_list) + + def forward_single_onnx(self, x, img_metas): + """"Forward function for a single feature level with ONNX exportation. + + Args: + x (Tensor): Input feature from backbone's single stage, shape + [bs, c, h, w]. + img_metas (list[dict]): List of image information. + + Returns: + all_cls_scores (Tensor): Outputs from the classification head, + shape [nb_dec, bs, num_query, cls_out_channels]. Note + cls_out_channels should includes background. + all_bbox_preds (Tensor): Sigmoid outputs from the regression + head with normalized coordinate format (cx, cy, w, h). + Shape [nb_dec, bs, num_query, 4]. + """ + # Note `img_shape` is not dynamically traceable to ONNX, + # since the related augmentation was done with numpy under + # CPU. Thus `masks` is directly created with zeros (valid tag) + # and the same spatial shape as `x`. + # The difference between torch and exported ONNX model may be + # ignored, since the same performance is achieved (e.g. + # 40.1 vs 40.1 for DETR) + batch_size = x.size(0) + h, w = x.size()[-2:] + masks = x.new_zeros((batch_size, h, w)) # [B,h,w] + + x = self.input_proj(x) + # interpolate masks to have the same spatial shape with x + masks = F.interpolate( + masks.unsqueeze(1), size=x.shape[-2:]).to(torch.bool).squeeze(1) + pos_embed = self.positional_encoding(masks) + outs_dec, _ = self.transformer(x, masks, self.query_embedding.weight, + pos_embed) + + all_cls_scores = self.fc_cls(outs_dec) + all_bbox_preds = self.fc_reg(self.activate( + self.reg_ffn(outs_dec))).sigmoid() + return all_cls_scores, all_bbox_preds + + def onnx_export(self, all_cls_scores_list, all_bbox_preds_list, img_metas): + """Transform network outputs into bbox predictions, with ONNX + exportation. + + Args: + all_cls_scores_list (list[Tensor]): Classification outputs + for each feature level. Each is a 4D-tensor with shape + [nb_dec, bs, num_query, cls_out_channels]. + all_bbox_preds_list (list[Tensor]): Sigmoid regression + outputs for each feature level. Each is a 4D-tensor with + normalized coordinate format (cx, cy, w, h) and shape + [nb_dec, bs, num_query, 4]. + img_metas (list[dict]): Meta information of each image. + + Returns: + tuple[Tensor, Tensor]: dets of shape [N, num_det, 5] + and class labels of shape [N, num_det]. + """ + assert len(img_metas) == 1, \ + 'Only support one input image while in exporting to ONNX' + + cls_scores = all_cls_scores_list[-1][-1] + bbox_preds = all_bbox_preds_list[-1][-1] + + # Note `img_shape` is not dynamically traceable to ONNX, + # here `img_shape_for_onnx` (padded shape of image tensor) + # is used. + img_shape = img_metas[0]['img_shape_for_onnx'] + max_per_img = self.test_cfg.get('max_per_img', self.num_query) + batch_size = cls_scores.size(0) + # `batch_index_offset` is used for the gather of concatenated tensor + batch_index_offset = torch.arange(batch_size).to( + cls_scores.device) * max_per_img + batch_index_offset = batch_index_offset.unsqueeze(1).expand( + batch_size, max_per_img) + + # supports dynamical batch inference + if self.loss_cls.use_sigmoid: + cls_scores = cls_scores.sigmoid() + scores, indexes = cls_scores.view(batch_size, -1).topk( + max_per_img, dim=1) + det_labels = indexes % self.num_classes + bbox_index = indexes // self.num_classes + bbox_index = (bbox_index + batch_index_offset).view(-1) + bbox_preds = bbox_preds.view(-1, 4)[bbox_index] + bbox_preds = bbox_preds.view(batch_size, -1, 4) + else: + scores, det_labels = F.softmax( + cls_scores, dim=-1)[..., :-1].max(-1) + scores, bbox_index = scores.topk(max_per_img, dim=1) + bbox_index = (bbox_index + batch_index_offset).view(-1) + bbox_preds = bbox_preds.view(-1, 4)[bbox_index] + det_labels = det_labels.view(-1)[bbox_index] + bbox_preds = bbox_preds.view(batch_size, -1, 4) + det_labels = det_labels.view(batch_size, -1) + + det_bboxes = bbox_cxcywh_to_xyxy(bbox_preds) + # use `img_shape_tensor` for dynamically exporting to ONNX + img_shape_tensor = img_shape.flip(0).repeat(2) # [w,h,w,h] + img_shape_tensor = img_shape_tensor.unsqueeze(0).unsqueeze(0).expand( + batch_size, det_bboxes.size(1), 4) + det_bboxes = det_bboxes * img_shape_tensor + # dynamically clip bboxes + x1, y1, x2, y2 = det_bboxes.split((1, 1, 1, 1), dim=-1) + from mmdet.core.export import dynamic_clip_for_onnx + x1, y1, x2, y2 = dynamic_clip_for_onnx(x1, y1, x2, y2, img_shape) + det_bboxes = torch.cat([x1, y1, x2, y2], dim=-1) + det_bboxes = torch.cat((det_bboxes, scores.unsqueeze(-1)), -1) + + return det_bboxes, det_labels diff --git a/mmdet/models/dense_heads/embedding_rpn_head.py b/mmdet/models/dense_heads/embedding_rpn_head.py new file mode 100644 index 0000000..22060b9 --- /dev/null +++ b/mmdet/models/dense_heads/embedding_rpn_head.py @@ -0,0 +1,116 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.runner import BaseModule + +from mmdet.models.builder import HEADS +from ...core import bbox_cxcywh_to_xyxy + + +@HEADS.register_module() +class EmbeddingRPNHead(BaseModule): + """RPNHead in the `Sparse R-CNN `_ . + + Unlike traditional RPNHead, this module does not need FPN input, but just + decode `init_proposal_bboxes` and expand the first dimension of + `init_proposal_bboxes` and `init_proposal_features` to the batch_size. + + Args: + num_proposals (int): Number of init_proposals. Default 100. + proposal_feature_channel (int): Channel number of + init_proposal_feature. Defaults to 256. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + num_proposals=100, + proposal_feature_channel=256, + init_cfg=None, + **kwargs): + assert init_cfg is None, 'To prevent abnormal initialization ' \ + 'behavior, init_cfg is not allowed to be set' + super(EmbeddingRPNHead, self).__init__(init_cfg) + self.num_proposals = num_proposals + self.proposal_feature_channel = proposal_feature_channel + self._init_layers() + + def _init_layers(self): + """Initialize a sparse set of proposal boxes and proposal features.""" + self.init_proposal_bboxes = nn.Embedding(self.num_proposals, 4) + self.init_proposal_features = nn.Embedding( + self.num_proposals, self.proposal_feature_channel) + + def init_weights(self): + """Initialize the init_proposal_bboxes as normalized. + + [c_x, c_y, w, h], and we initialize it to the size of the entire + image. + """ + super(EmbeddingRPNHead, self).init_weights() + nn.init.constant_(self.init_proposal_bboxes.weight[:, :2], 0.5) + nn.init.constant_(self.init_proposal_bboxes.weight[:, 2:], 1) + + def _decode_init_proposals(self, imgs, img_metas): + """Decode init_proposal_bboxes according to the size of images and + expand dimension of init_proposal_features to batch_size. + + Args: + imgs (list[Tensor]): List of FPN features. + img_metas (list[dict]): List of meta-information of + images. Need the img_shape to decode the init_proposals. + + Returns: + Tuple(Tensor): + + - proposals (Tensor): Decoded proposal bboxes, + has shape (batch_size, num_proposals, 4). + - init_proposal_features (Tensor): Expanded proposal + features, has shape + (batch_size, num_proposals, proposal_feature_channel). + - imgs_whwh (Tensor): Tensor with shape + (batch_size, 4), the dimension means + [img_width, img_height, img_width, img_height]. + """ + proposals = self.init_proposal_bboxes.weight.clone() + proposals = bbox_cxcywh_to_xyxy(proposals) + num_imgs = len(imgs[0]) + imgs_whwh = [] + for meta in img_metas: + h, w, _ = meta['img_shape'] + imgs_whwh.append(imgs[0].new_tensor([[w, h, w, h]])) + imgs_whwh = torch.cat(imgs_whwh, dim=0) + imgs_whwh = imgs_whwh[:, None, :] + + # imgs_whwh has shape (batch_size, 1, 4) + # The shape of proposals change from (num_proposals, 4) + # to (batch_size ,num_proposals, 4) + proposals = proposals * imgs_whwh + + init_proposal_features = self.init_proposal_features.weight.clone() + init_proposal_features = init_proposal_features[None].expand( + num_imgs, *init_proposal_features.size()) + return proposals, init_proposal_features, imgs_whwh + + def forward_dummy(self, img, img_metas): + """Dummy forward function. + + Used in flops calculation. + """ + return self._decode_init_proposals(img, img_metas) + + def forward_train(self, img, img_metas): + """Forward function in training stage.""" + return self._decode_init_proposals(img, img_metas) + + def simple_test_rpn(self, img, img_metas): + """Forward function in testing stage.""" + return self._decode_init_proposals(img, img_metas) + + def simple_test(self, img, img_metas): + """Forward function in testing stage.""" + raise NotImplementedError + + def aug_test_rpn(self, feats, img_metas): + raise NotImplementedError( + 'EmbeddingRPNHead does not support test-time augmentation') diff --git a/mmdet/models/dense_heads/fcos_head.py b/mmdet/models/dense_heads/fcos_head.py new file mode 100644 index 0000000..d72fb56 --- /dev/null +++ b/mmdet/models/dense_heads/fcos_head.py @@ -0,0 +1,455 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch +import torch.nn as nn +from mmcv.cnn import Scale +from mmcv.runner import force_fp32 + +from mmdet.core import multi_apply, reduce_mean +from ..builder import HEADS, build_loss +from .anchor_free_head import AnchorFreeHead + +INF = 1e8 + + +@HEADS.register_module() +class FCOSHead(AnchorFreeHead): + """Anchor-free head used in `FCOS `_. + + The FCOS head does not use anchor boxes. Instead bounding boxes are + predicted at each pixel and a centerness measure is used to suppress + low-quality predictions. + Here norm_on_bbox, centerness_on_reg, dcn_on_last_conv are training + tricks used in official repo, which will bring remarkable mAP gains + of up to 4.9. Please see https://github.com/tianzhi0549/FCOS for + more detail. + + Args: + num_classes (int): Number of categories excluding the background + category. + in_channels (int): Number of channels in the input feature map. + strides (list[int] | list[tuple[int, int]]): Strides of points + in multiple feature levels. Default: (4, 8, 16, 32, 64). + regress_ranges (tuple[tuple[int, int]]): Regress range of multiple + level points. + center_sampling (bool): If true, use center sampling. Default: False. + center_sample_radius (float): Radius of center sampling. Default: 1.5. + norm_on_bbox (bool): If true, normalize the regression targets + with FPN strides. Default: False. + centerness_on_reg (bool): If true, position centerness on the + regress branch. Please refer to https://github.com/tianzhi0549/FCOS/issues/89#issuecomment-516877042. + Default: False. + conv_bias (bool | str): If specified as `auto`, it will be decided by the + norm_cfg. Bias of conv will be set as True if `norm_cfg` is None, otherwise + False. Default: "auto". + loss_cls (dict): Config of classification loss. + loss_bbox (dict): Config of localization loss. + loss_centerness (dict): Config of centerness loss. + norm_cfg (dict): dictionary to construct and config norm layer. + Default: norm_cfg=dict(type='GN', num_groups=32, requires_grad=True). + init_cfg (dict or list[dict], optional): Initialization config dict. + + Example: + >>> self = FCOSHead(11, 7) + >>> feats = [torch.rand(1, 7, s, s) for s in [4, 8, 16, 32, 64]] + >>> cls_score, bbox_pred, centerness = self.forward(feats) + >>> assert len(cls_score) == len(self.scales) + """ # noqa: E501 + + def __init__(self, + num_classes, + in_channels, + regress_ranges=((-1, 64), (64, 128), (128, 256), (256, 512), + (512, INF)), + center_sampling=False, + center_sample_radius=1.5, + norm_on_bbox=False, + centerness_on_reg=False, + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='IoULoss', loss_weight=1.0), + loss_centerness=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=1.0), + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True), + init_cfg=dict( + type='Normal', + layer='Conv2d', + std=0.01, + override=dict( + type='Normal', + name='conv_cls', + std=0.01, + bias_prob=0.01)), + **kwargs): + self.regress_ranges = regress_ranges + self.center_sampling = center_sampling + self.center_sample_radius = center_sample_radius + self.norm_on_bbox = norm_on_bbox + self.centerness_on_reg = centerness_on_reg + super().__init__( + num_classes, + in_channels, + loss_cls=loss_cls, + loss_bbox=loss_bbox, + norm_cfg=norm_cfg, + init_cfg=init_cfg, + **kwargs) + self.loss_centerness = build_loss(loss_centerness) + + def _init_layers(self): + """Initialize layers of the head.""" + super()._init_layers() + self.conv_centerness = nn.Conv2d(self.feat_channels, 1, 3, padding=1) + self.scales = nn.ModuleList([Scale(1.0) for _ in self.strides]) + + def forward(self, feats): + """Forward features from the upstream network. + + Args: + feats (tuple[Tensor]): Features from the upstream network, each is + a 4D-tensor. + + Returns: + tuple: + cls_scores (list[Tensor]): Box scores for each scale level, \ + each is a 4D-tensor, the channel number is \ + num_points * num_classes. + bbox_preds (list[Tensor]): Box energies / deltas for each \ + scale level, each is a 4D-tensor, the channel number is \ + num_points * 4. + centernesses (list[Tensor]): centerness for each scale level, \ + each is a 4D-tensor, the channel number is num_points * 1. + """ + return multi_apply(self.forward_single, feats, self.scales, + self.strides) + + def forward_single(self, x, scale, stride): + """Forward features of a single scale level. + + Args: + x (Tensor): FPN feature maps of the specified stride. + scale (:obj: `mmcv.cnn.Scale`): Learnable scale module to resize + the bbox prediction. + stride (int): The corresponding stride for feature maps, only + used to normalize the bbox prediction when self.norm_on_bbox + is True. + + Returns: + tuple: scores for each class, bbox predictions and centerness \ + predictions of input feature maps. + """ + cls_score, bbox_pred, cls_feat, reg_feat = super().forward_single(x) + if self.centerness_on_reg: + centerness = self.conv_centerness(reg_feat) + else: + centerness = self.conv_centerness(cls_feat) + # scale the bbox_pred of different level + # float to avoid overflow when enabling FP16 + bbox_pred = scale(bbox_pred).float() + if self.norm_on_bbox: + # bbox_pred needed for gradient computation has been modified + # by F.relu(bbox_pred) when run with PyTorch 1.10. So replace + # F.relu(bbox_pred) with bbox_pred.clamp(min=0) + bbox_pred = bbox_pred.clamp(min=0) + if not self.training: + bbox_pred *= stride + else: + bbox_pred = bbox_pred.exp() + return cls_score, bbox_pred, centerness + + @force_fp32(apply_to=('cls_scores', 'bbox_preds', 'centernesses')) + def loss(self, + cls_scores, + bbox_preds, + centernesses, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Compute loss of the head. + + Args: + cls_scores (list[Tensor]): Box scores for each scale level, + each is a 4D-tensor, the channel number is + num_points * num_classes. + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level, each is a 4D-tensor, the channel number is + num_points * 4. + centernesses (list[Tensor]): centerness for each scale level, each + is a 4D-tensor, the channel number is num_points * 1. + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (None | list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + assert len(cls_scores) == len(bbox_preds) == len(centernesses) + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + all_level_points = self.prior_generator.grid_priors( + featmap_sizes, + dtype=bbox_preds[0].dtype, + device=bbox_preds[0].device) + labels, bbox_targets = self.get_targets(all_level_points, gt_bboxes, + gt_labels) + + num_imgs = cls_scores[0].size(0) + # flatten cls_scores, bbox_preds and centerness + flatten_cls_scores = [ + cls_score.permute(0, 2, 3, 1).reshape(-1, self.cls_out_channels) + for cls_score in cls_scores + ] + flatten_bbox_preds = [ + bbox_pred.permute(0, 2, 3, 1).reshape(-1, 4) + for bbox_pred in bbox_preds + ] + flatten_centerness = [ + centerness.permute(0, 2, 3, 1).reshape(-1) + for centerness in centernesses + ] + flatten_cls_scores = torch.cat(flatten_cls_scores) + flatten_bbox_preds = torch.cat(flatten_bbox_preds) + flatten_centerness = torch.cat(flatten_centerness) + flatten_labels = torch.cat(labels) + flatten_bbox_targets = torch.cat(bbox_targets) + # repeat points to align with bbox_preds + flatten_points = torch.cat( + [points.repeat(num_imgs, 1) for points in all_level_points]) + + # FG cat_id: [0, num_classes -1], BG cat_id: num_classes + bg_class_ind = self.num_classes + pos_inds = ((flatten_labels >= 0) + & (flatten_labels < bg_class_ind)).nonzero().reshape(-1) + num_pos = torch.tensor( + len(pos_inds), dtype=torch.float, device=bbox_preds[0].device) + num_pos = max(reduce_mean(num_pos), 1.0) + loss_cls = self.loss_cls( + flatten_cls_scores, flatten_labels, avg_factor=num_pos) + + pos_bbox_preds = flatten_bbox_preds[pos_inds] + pos_centerness = flatten_centerness[pos_inds] + pos_bbox_targets = flatten_bbox_targets[pos_inds] + pos_centerness_targets = self.centerness_target(pos_bbox_targets) + # centerness weighted iou loss + centerness_denorm = max( + reduce_mean(pos_centerness_targets.sum().detach()), 1e-6) + + if len(pos_inds) > 0: + pos_points = flatten_points[pos_inds] + pos_decoded_bbox_preds = self.bbox_coder.decode( + pos_points, pos_bbox_preds) + pos_decoded_target_preds = self.bbox_coder.decode( + pos_points, pos_bbox_targets) + loss_bbox = self.loss_bbox( + pos_decoded_bbox_preds, + pos_decoded_target_preds, + weight=pos_centerness_targets, + avg_factor=centerness_denorm) + loss_centerness = self.loss_centerness( + pos_centerness, pos_centerness_targets, avg_factor=num_pos) + else: + loss_bbox = pos_bbox_preds.sum() + loss_centerness = pos_centerness.sum() + + return dict( + loss_cls=loss_cls, + loss_bbox=loss_bbox, + loss_centerness=loss_centerness) + + def get_targets(self, points, gt_bboxes_list, gt_labels_list): + """Compute regression, classification and centerness targets for points + in multiple images. + + Args: + points (list[Tensor]): Points of each fpn level, each has shape + (num_points, 2). + gt_bboxes_list (list[Tensor]): Ground truth bboxes of each image, + each has shape (num_gt, 4). + gt_labels_list (list[Tensor]): Ground truth labels of each box, + each has shape (num_gt,). + + Returns: + tuple: + concat_lvl_labels (list[Tensor]): Labels of each level. \ + concat_lvl_bbox_targets (list[Tensor]): BBox targets of each \ + level. + """ + assert len(points) == len(self.regress_ranges) + num_levels = len(points) + # expand regress ranges to align with points + expanded_regress_ranges = [ + points[i].new_tensor(self.regress_ranges[i])[None].expand_as( + points[i]) for i in range(num_levels) + ] + # concat all levels points and regress ranges + concat_regress_ranges = torch.cat(expanded_regress_ranges, dim=0) + concat_points = torch.cat(points, dim=0) + + # the number of points per img, per lvl + num_points = [center.size(0) for center in points] + + # get labels and bbox_targets of each image + labels_list, bbox_targets_list = multi_apply( + self._get_target_single, + gt_bboxes_list, + gt_labels_list, + points=concat_points, + regress_ranges=concat_regress_ranges, + num_points_per_lvl=num_points) + + # split to per img, per level + labels_list = [labels.split(num_points, 0) for labels in labels_list] + bbox_targets_list = [ + bbox_targets.split(num_points, 0) + for bbox_targets in bbox_targets_list + ] + + # concat per level image + concat_lvl_labels = [] + concat_lvl_bbox_targets = [] + for i in range(num_levels): + concat_lvl_labels.append( + torch.cat([labels[i] for labels in labels_list])) + bbox_targets = torch.cat( + [bbox_targets[i] for bbox_targets in bbox_targets_list]) + if self.norm_on_bbox: + bbox_targets = bbox_targets / self.strides[i] + concat_lvl_bbox_targets.append(bbox_targets) + return concat_lvl_labels, concat_lvl_bbox_targets + + def _get_target_single(self, gt_bboxes, gt_labels, points, regress_ranges, + num_points_per_lvl): + """Compute regression and classification targets for a single image.""" + num_points = points.size(0) + num_gts = gt_labels.size(0) + if num_gts == 0: + return gt_labels.new_full((num_points,), self.num_classes), \ + gt_bboxes.new_zeros((num_points, 4)) + + areas = (gt_bboxes[:, 2] - gt_bboxes[:, 0]) * ( + gt_bboxes[:, 3] - gt_bboxes[:, 1]) + # TODO: figure out why these two are different + # areas = areas[None].expand(num_points, num_gts) + areas = areas[None].repeat(num_points, 1) + regress_ranges = regress_ranges[:, None, :].expand( + num_points, num_gts, 2) + gt_bboxes = gt_bboxes[None].expand(num_points, num_gts, 4) + xs, ys = points[:, 0], points[:, 1] + xs = xs[:, None].expand(num_points, num_gts) + ys = ys[:, None].expand(num_points, num_gts) + + left = xs - gt_bboxes[..., 0] + right = gt_bboxes[..., 2] - xs + top = ys - gt_bboxes[..., 1] + bottom = gt_bboxes[..., 3] - ys + bbox_targets = torch.stack((left, top, right, bottom), -1) + + if self.center_sampling: + # condition1: inside a `center bbox` + radius = self.center_sample_radius + center_xs = (gt_bboxes[..., 0] + gt_bboxes[..., 2]) / 2 + center_ys = (gt_bboxes[..., 1] + gt_bboxes[..., 3]) / 2 + center_gts = torch.zeros_like(gt_bboxes) + stride = center_xs.new_zeros(center_xs.shape) + + # project the points on current lvl back to the `original` sizes + lvl_begin = 0 + for lvl_idx, num_points_lvl in enumerate(num_points_per_lvl): + lvl_end = lvl_begin + num_points_lvl + stride[lvl_begin:lvl_end] = self.strides[lvl_idx] * radius + lvl_begin = lvl_end + + x_mins = center_xs - stride + y_mins = center_ys - stride + x_maxs = center_xs + stride + y_maxs = center_ys + stride + center_gts[..., 0] = torch.where(x_mins > gt_bboxes[..., 0], + x_mins, gt_bboxes[..., 0]) + center_gts[..., 1] = torch.where(y_mins > gt_bboxes[..., 1], + y_mins, gt_bboxes[..., 1]) + center_gts[..., 2] = torch.where(x_maxs > gt_bboxes[..., 2], + gt_bboxes[..., 2], x_maxs) + center_gts[..., 3] = torch.where(y_maxs > gt_bboxes[..., 3], + gt_bboxes[..., 3], y_maxs) + + cb_dist_left = xs - center_gts[..., 0] + cb_dist_right = center_gts[..., 2] - xs + cb_dist_top = ys - center_gts[..., 1] + cb_dist_bottom = center_gts[..., 3] - ys + center_bbox = torch.stack( + (cb_dist_left, cb_dist_top, cb_dist_right, cb_dist_bottom), -1) + inside_gt_bbox_mask = center_bbox.min(-1)[0] > 0 + else: + # condition1: inside a gt bbox + inside_gt_bbox_mask = bbox_targets.min(-1)[0] > 0 + + # condition2: limit the regression range for each location + max_regress_distance = bbox_targets.max(-1)[0] + inside_regress_range = ( + (max_regress_distance >= regress_ranges[..., 0]) + & (max_regress_distance <= regress_ranges[..., 1])) + + # if there are still more than one objects for a location, + # we choose the one with minimal area + areas[inside_gt_bbox_mask == 0] = INF + areas[inside_regress_range == 0] = INF + min_area, min_area_inds = areas.min(dim=1) + + labels = gt_labels[min_area_inds] + labels[min_area == INF] = self.num_classes # set as BG + bbox_targets = bbox_targets[range(num_points), min_area_inds] + + return labels, bbox_targets + + def centerness_target(self, pos_bbox_targets): + """Compute centerness targets. + + Args: + pos_bbox_targets (Tensor): BBox targets of positive bboxes in shape + (num_pos, 4) + + Returns: + Tensor: Centerness target. + """ + # only calculate pos centerness targets, otherwise there may be nan + left_right = pos_bbox_targets[:, [0, 2]] + top_bottom = pos_bbox_targets[:, [1, 3]] + if len(left_right) == 0: + centerness_targets = left_right[..., 0] + else: + centerness_targets = ( + left_right.min(dim=-1)[0] / left_right.max(dim=-1)[0]) * ( + top_bottom.min(dim=-1)[0] / top_bottom.max(dim=-1)[0]) + return torch.sqrt(centerness_targets) + + def _get_points_single(self, + featmap_size, + stride, + dtype, + device, + flatten=False): + """Get points according to feature map size. + + This function will be deprecated soon. + """ + warnings.warn( + '`_get_points_single` in `FCOSHead` will be ' + 'deprecated soon, we support a multi level point generator now' + 'you can get points of a single level feature map ' + 'with `self.prior_generator.single_level_grid_priors` ') + + y, x = super()._get_points_single(featmap_size, stride, dtype, device) + points = torch.stack((x.reshape(-1) * stride, y.reshape(-1) * stride), + dim=-1) + stride // 2 + return points diff --git a/mmdet/models/dense_heads/fovea_head.py b/mmdet/models/dense_heads/fovea_head.py new file mode 100644 index 0000000..8be7fc9 --- /dev/null +++ b/mmdet/models/dense_heads/fovea_head.py @@ -0,0 +1,385 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule +from mmcv.ops import DeformConv2d +from mmcv.runner import BaseModule + +from mmdet.core import multi_apply +from mmdet.core.utils import filter_scores_and_topk +from ..builder import HEADS +from .anchor_free_head import AnchorFreeHead + +INF = 1e8 + + +class FeatureAlign(BaseModule): + + def __init__(self, + in_channels, + out_channels, + kernel_size=3, + deform_groups=4, + init_cfg=dict( + type='Normal', + layer='Conv2d', + std=0.1, + override=dict( + type='Normal', name='conv_adaption', std=0.01))): + super(FeatureAlign, self).__init__(init_cfg) + offset_channels = kernel_size * kernel_size * 2 + self.conv_offset = nn.Conv2d( + 4, deform_groups * offset_channels, 1, bias=False) + self.conv_adaption = DeformConv2d( + in_channels, + out_channels, + kernel_size=kernel_size, + padding=(kernel_size - 1) // 2, + deform_groups=deform_groups) + self.relu = nn.ReLU(inplace=True) + + def forward(self, x, shape): + offset = self.conv_offset(shape) + x = self.relu(self.conv_adaption(x, offset)) + return x + + +@HEADS.register_module() +class FoveaHead(AnchorFreeHead): + """FoveaBox: Beyond Anchor-based Object Detector + https://arxiv.org/abs/1904.03797 + """ + + def __init__(self, + num_classes, + in_channels, + base_edge_list=(16, 32, 64, 128, 256), + scale_ranges=((8, 32), (16, 64), (32, 128), (64, 256), (128, + 512)), + sigma=0.4, + with_deform=False, + deform_groups=4, + init_cfg=dict( + type='Normal', + layer='Conv2d', + std=0.01, + override=dict( + type='Normal', + name='conv_cls', + std=0.01, + bias_prob=0.01)), + **kwargs): + self.base_edge_list = base_edge_list + self.scale_ranges = scale_ranges + self.sigma = sigma + self.with_deform = with_deform + self.deform_groups = deform_groups + super().__init__(num_classes, in_channels, init_cfg=init_cfg, **kwargs) + + def _init_layers(self): + # box branch + super()._init_reg_convs() + self.conv_reg = nn.Conv2d(self.feat_channels, 4, 3, padding=1) + + # cls branch + if not self.with_deform: + super()._init_cls_convs() + self.conv_cls = nn.Conv2d( + self.feat_channels, self.cls_out_channels, 3, padding=1) + else: + self.cls_convs = nn.ModuleList() + self.cls_convs.append( + ConvModule( + self.feat_channels, (self.feat_channels * 4), + 3, + stride=1, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + bias=self.norm_cfg is None)) + self.cls_convs.append( + ConvModule((self.feat_channels * 4), (self.feat_channels * 4), + 1, + stride=1, + padding=0, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + bias=self.norm_cfg is None)) + self.feature_adaption = FeatureAlign( + self.feat_channels, + self.feat_channels, + kernel_size=3, + deform_groups=self.deform_groups) + self.conv_cls = nn.Conv2d( + int(self.feat_channels * 4), + self.cls_out_channels, + 3, + padding=1) + + def forward_single(self, x): + cls_feat = x + reg_feat = x + for reg_layer in self.reg_convs: + reg_feat = reg_layer(reg_feat) + bbox_pred = self.conv_reg(reg_feat) + if self.with_deform: + cls_feat = self.feature_adaption(cls_feat, bbox_pred.exp()) + for cls_layer in self.cls_convs: + cls_feat = cls_layer(cls_feat) + cls_score = self.conv_cls(cls_feat) + return cls_score, bbox_pred + + def loss(self, + cls_scores, + bbox_preds, + gt_bbox_list, + gt_label_list, + img_metas, + gt_bboxes_ignore=None): + assert len(cls_scores) == len(bbox_preds) + + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + points = self.prior_generator.grid_priors( + featmap_sizes, + dtype=bbox_preds[0].dtype, + device=bbox_preds[0].device) + num_imgs = cls_scores[0].size(0) + flatten_cls_scores = [ + cls_score.permute(0, 2, 3, 1).reshape(-1, self.cls_out_channels) + for cls_score in cls_scores + ] + flatten_bbox_preds = [ + bbox_pred.permute(0, 2, 3, 1).reshape(-1, 4) + for bbox_pred in bbox_preds + ] + flatten_cls_scores = torch.cat(flatten_cls_scores) + flatten_bbox_preds = torch.cat(flatten_bbox_preds) + flatten_labels, flatten_bbox_targets = self.get_targets( + gt_bbox_list, gt_label_list, featmap_sizes, points) + + # FG cat_id: [0, num_classes -1], BG cat_id: num_classes + pos_inds = ((flatten_labels >= 0) + & (flatten_labels < self.num_classes)).nonzero().view(-1) + num_pos = len(pos_inds) + + loss_cls = self.loss_cls( + flatten_cls_scores, flatten_labels, avg_factor=num_pos + num_imgs) + if num_pos > 0: + pos_bbox_preds = flatten_bbox_preds[pos_inds] + pos_bbox_targets = flatten_bbox_targets[pos_inds] + pos_weights = pos_bbox_targets.new_zeros( + pos_bbox_targets.size()) + 1.0 + loss_bbox = self.loss_bbox( + pos_bbox_preds, + pos_bbox_targets, + pos_weights, + avg_factor=num_pos) + else: + loss_bbox = torch.tensor( + 0, + dtype=flatten_bbox_preds.dtype, + device=flatten_bbox_preds.device) + return dict(loss_cls=loss_cls, loss_bbox=loss_bbox) + + def get_targets(self, gt_bbox_list, gt_label_list, featmap_sizes, points): + label_list, bbox_target_list = multi_apply( + self._get_target_single, + gt_bbox_list, + gt_label_list, + featmap_size_list=featmap_sizes, + point_list=points) + flatten_labels = [ + torch.cat([ + labels_level_img.flatten() for labels_level_img in labels_level + ]) for labels_level in zip(*label_list) + ] + flatten_bbox_targets = [ + torch.cat([ + bbox_targets_level_img.reshape(-1, 4) + for bbox_targets_level_img in bbox_targets_level + ]) for bbox_targets_level in zip(*bbox_target_list) + ] + flatten_labels = torch.cat(flatten_labels) + flatten_bbox_targets = torch.cat(flatten_bbox_targets) + return flatten_labels, flatten_bbox_targets + + def _get_target_single(self, + gt_bboxes_raw, + gt_labels_raw, + featmap_size_list=None, + point_list=None): + + gt_areas = torch.sqrt((gt_bboxes_raw[:, 2] - gt_bboxes_raw[:, 0]) * + (gt_bboxes_raw[:, 3] - gt_bboxes_raw[:, 1])) + label_list = [] + bbox_target_list = [] + # for each pyramid, find the cls and box target + for base_len, (lower_bound, upper_bound), stride, featmap_size, \ + points in zip(self.base_edge_list, self.scale_ranges, + self.strides, featmap_size_list, point_list): + # FG cat_id: [0, num_classes -1], BG cat_id: num_classes + points = points.view(*featmap_size, 2) + x, y = points[..., 0], points[..., 1] + labels = gt_labels_raw.new_zeros(featmap_size) + self.num_classes + bbox_targets = gt_bboxes_raw.new(featmap_size[0], featmap_size[1], + 4) + 1 + # scale assignment + hit_indices = ((gt_areas >= lower_bound) & + (gt_areas <= upper_bound)).nonzero().flatten() + if len(hit_indices) == 0: + label_list.append(labels) + bbox_target_list.append(torch.log(bbox_targets)) + continue + _, hit_index_order = torch.sort(-gt_areas[hit_indices]) + hit_indices = hit_indices[hit_index_order] + gt_bboxes = gt_bboxes_raw[hit_indices, :] / stride + gt_labels = gt_labels_raw[hit_indices] + half_w = 0.5 * (gt_bboxes[:, 2] - gt_bboxes[:, 0]) + half_h = 0.5 * (gt_bboxes[:, 3] - gt_bboxes[:, 1]) + # valid fovea area: left, right, top, down + pos_left = torch.ceil( + gt_bboxes[:, 0] + (1 - self.sigma) * half_w - 0.5).long(). \ + clamp(0, featmap_size[1] - 1) + pos_right = torch.floor( + gt_bboxes[:, 0] + (1 + self.sigma) * half_w - 0.5).long(). \ + clamp(0, featmap_size[1] - 1) + pos_top = torch.ceil( + gt_bboxes[:, 1] + (1 - self.sigma) * half_h - 0.5).long(). \ + clamp(0, featmap_size[0] - 1) + pos_down = torch.floor( + gt_bboxes[:, 1] + (1 + self.sigma) * half_h - 0.5).long(). \ + clamp(0, featmap_size[0] - 1) + for px1, py1, px2, py2, label, (gt_x1, gt_y1, gt_x2, gt_y2) in \ + zip(pos_left, pos_top, pos_right, pos_down, gt_labels, + gt_bboxes_raw[hit_indices, :]): + labels[py1:py2 + 1, px1:px2 + 1] = label + bbox_targets[py1:py2 + 1, px1:px2 + 1, 0] = \ + (x[py1:py2 + 1, px1:px2 + 1] - gt_x1) / base_len + bbox_targets[py1:py2 + 1, px1:px2 + 1, 1] = \ + (y[py1:py2 + 1, px1:px2 + 1] - gt_y1) / base_len + bbox_targets[py1:py2 + 1, px1:px2 + 1, 2] = \ + (gt_x2 - x[py1:py2 + 1, px1:px2 + 1]) / base_len + bbox_targets[py1:py2 + 1, px1:px2 + 1, 3] = \ + (gt_y2 - y[py1:py2 + 1, px1:px2 + 1]) / base_len + bbox_targets = bbox_targets.clamp(min=1. / 16, max=16.) + label_list.append(labels) + bbox_target_list.append(torch.log(bbox_targets)) + return label_list, bbox_target_list + + # Same as base_dense_head/_get_bboxes_single except self._bbox_decode + def _get_bboxes_single(self, + cls_score_list, + bbox_pred_list, + score_factor_list, + mlvl_priors, + img_meta, + cfg, + rescale=False, + with_nms=True, + **kwargs): + """Transform outputs of a single image into bbox predictions. + + Args: + cls_score_list (list[Tensor]): Box scores from all scale + levels of a single image, each item has shape + (num_priors * num_classes, H, W). + bbox_pred_list (list[Tensor]): Box energies / deltas from + all scale levels of a single image, each item has shape + (num_priors * 4, H, W). + score_factor_list (list[Tensor]): Score factor from all scale + levels of a single image. Fovea head does not need this value. + mlvl_priors (list[Tensor]): Each element in the list is + the priors of a single level in feature pyramid, has shape + (num_priors, 2). + img_meta (dict): Image meta info. + cfg (mmcv.Config): Test / postprocessing configuration, + if None, test_cfg would be used. + rescale (bool): If True, return boxes in original image space. + Default: False. + with_nms (bool): If True, do nms before return boxes. + Default: True. + + Returns: + tuple[Tensor]: Results of detected bboxes and labels. If with_nms + is False and mlvl_score_factor is None, return mlvl_bboxes and + mlvl_scores, else return mlvl_bboxes, mlvl_scores and + mlvl_score_factor. Usually with_nms is False is used for aug + test. If with_nms is True, then return the following format + + - det_bboxes (Tensor): Predicted bboxes with shape \ + [num_bboxes, 5], where the first 4 columns are bounding \ + box positions (tl_x, tl_y, br_x, br_y) and the 5-th \ + column are scores between 0 and 1. + - det_labels (Tensor): Predicted labels of the corresponding \ + box with shape [num_bboxes]. + """ + cfg = self.test_cfg if cfg is None else cfg + assert len(cls_score_list) == len(bbox_pred_list) + img_shape = img_meta['img_shape'] + nms_pre = cfg.get('nms_pre', -1) + + mlvl_bboxes = [] + mlvl_scores = [] + mlvl_labels = [] + for level_idx, (cls_score, bbox_pred, stride, base_len, priors) in \ + enumerate(zip(cls_score_list, bbox_pred_list, self.strides, + self.base_edge_list, mlvl_priors)): + assert cls_score.size()[-2:] == bbox_pred.size()[-2:] + bbox_pred = bbox_pred.permute(1, 2, 0).reshape(-1, 4) + + scores = cls_score.permute(1, 2, 0).reshape( + -1, self.cls_out_channels).sigmoid() + + # After https://github.com/open-mmlab/mmdetection/pull/6268/, + # this operation keeps fewer bboxes under the same `nms_pre`. + # There is no difference in performance for most models. If you + # find a slight drop in performance, you can set a larger + # `nms_pre` than before. + results = filter_scores_and_topk( + scores, cfg.score_thr, nms_pre, + dict(bbox_pred=bbox_pred, priors=priors)) + scores, labels, _, filtered_results = results + + bbox_pred = filtered_results['bbox_pred'] + priors = filtered_results['priors'] + + bboxes = self._bbox_decode(priors, bbox_pred, base_len, img_shape) + + mlvl_bboxes.append(bboxes) + mlvl_scores.append(scores) + mlvl_labels.append(labels) + + return self._bbox_post_process(mlvl_scores, mlvl_labels, mlvl_bboxes, + img_meta['scale_factor'], cfg, rescale, + with_nms) + + def _bbox_decode(self, priors, bbox_pred, base_len, max_shape): + bbox_pred = bbox_pred.exp() + + y = priors[:, 1] + x = priors[:, 0] + x1 = (x - base_len * bbox_pred[:, 0]). \ + clamp(min=0, max=max_shape[1] - 1) + y1 = (y - base_len * bbox_pred[:, 1]). \ + clamp(min=0, max=max_shape[0] - 1) + x2 = (x + base_len * bbox_pred[:, 2]). \ + clamp(min=0, max=max_shape[1] - 1) + y2 = (y + base_len * bbox_pred[:, 3]). \ + clamp(min=0, max=max_shape[0] - 1) + decoded_bboxes = torch.stack([x1, y1, x2, y2], -1) + return decoded_bboxes + + def _get_points_single(self, *args, **kwargs): + """Get points according to feature map size. + + This function will be deprecated soon. + """ + warnings.warn( + '`_get_points_single` in `FoveaHead` will be ' + 'deprecated soon, we support a multi level point generator now' + 'you can get points of a single level feature map ' + 'with `self.prior_generator.single_level_grid_priors` ') + y, x = super()._get_points_single(*args, **kwargs) + return y + 0.5, x + 0.5 diff --git a/mmdet/models/dense_heads/free_anchor_retina_head.py b/mmdet/models/dense_heads/free_anchor_retina_head.py new file mode 100644 index 0000000..3acd25e --- /dev/null +++ b/mmdet/models/dense_heads/free_anchor_retina_head.py @@ -0,0 +1,272 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn.functional as F + +from mmdet.core import bbox_overlaps +from ..builder import HEADS +from .retina_head import RetinaHead + +EPS = 1e-12 + + +@HEADS.register_module() +class FreeAnchorRetinaHead(RetinaHead): + """FreeAnchor RetinaHead used in https://arxiv.org/abs/1909.02466. + + Args: + num_classes (int): Number of categories excluding the background + category. + in_channels (int): Number of channels in the input feature map. + stacked_convs (int): Number of conv layers in cls and reg tower. + Default: 4. + conv_cfg (dict): dictionary to construct and config conv layer. + Default: None. + norm_cfg (dict): dictionary to construct and config norm layer. + Default: norm_cfg=dict(type='GN', num_groups=32, + requires_grad=True). + pre_anchor_topk (int): Number of boxes that be token in each bag. + bbox_thr (float): The threshold of the saturated linear function. It is + usually the same with the IoU threshold used in NMS. + gamma (float): Gamma parameter in focal loss. + alpha (float): Alpha parameter in focal loss. + """ # noqa: W605 + + def __init__(self, + num_classes, + in_channels, + stacked_convs=4, + conv_cfg=None, + norm_cfg=None, + pre_anchor_topk=50, + bbox_thr=0.6, + gamma=2.0, + alpha=0.5, + **kwargs): + super(FreeAnchorRetinaHead, + self).__init__(num_classes, in_channels, stacked_convs, conv_cfg, + norm_cfg, **kwargs) + + self.pre_anchor_topk = pre_anchor_topk + self.bbox_thr = bbox_thr + self.gamma = gamma + self.alpha = alpha + + def loss(self, + cls_scores, + bbox_preds, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Compute losses of the head. + + Args: + cls_scores (list[Tensor]): Box scores for each scale level + Has shape (N, num_anchors * num_classes, H, W) + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level with shape (N, num_anchors * 4, H, W) + gt_bboxes (list[Tensor]): each item are the truth boxes for each + image in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (None | list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + assert len(featmap_sizes) == self.prior_generator.num_levels + device = cls_scores[0].device + anchor_list, _ = self.get_anchors( + featmap_sizes, img_metas, device=device) + anchors = [torch.cat(anchor) for anchor in anchor_list] + + # concatenate each level + cls_scores = [ + cls.permute(0, 2, 3, + 1).reshape(cls.size(0), -1, self.cls_out_channels) + for cls in cls_scores + ] + bbox_preds = [ + bbox_pred.permute(0, 2, 3, 1).reshape(bbox_pred.size(0), -1, 4) + for bbox_pred in bbox_preds + ] + cls_scores = torch.cat(cls_scores, dim=1) + bbox_preds = torch.cat(bbox_preds, dim=1) + + cls_prob = torch.sigmoid(cls_scores) + box_prob = [] + num_pos = 0 + positive_losses = [] + for _, (anchors_, gt_labels_, gt_bboxes_, cls_prob_, + bbox_preds_) in enumerate( + zip(anchors, gt_labels, gt_bboxes, cls_prob, bbox_preds)): + + with torch.no_grad(): + if len(gt_bboxes_) == 0: + image_box_prob = torch.zeros( + anchors_.size(0), + self.cls_out_channels).type_as(bbox_preds_) + else: + # box_localization: a_{j}^{loc}, shape: [j, 4] + pred_boxes = self.bbox_coder.decode(anchors_, bbox_preds_) + + # object_box_iou: IoU_{ij}^{loc}, shape: [i, j] + object_box_iou = bbox_overlaps(gt_bboxes_, pred_boxes) + + # object_box_prob: P{a_{j} -> b_{i}}, shape: [i, j] + t1 = self.bbox_thr + t2 = object_box_iou.max( + dim=1, keepdim=True).values.clamp(min=t1 + 1e-12) + object_box_prob = ((object_box_iou - t1) / + (t2 - t1)).clamp( + min=0, max=1) + + # object_cls_box_prob: P{a_{j} -> b_{i}}, shape: [i, c, j] + num_obj = gt_labels_.size(0) + indices = torch.stack([ + torch.arange(num_obj).type_as(gt_labels_), gt_labels_ + ], + dim=0) + object_cls_box_prob = torch.sparse_coo_tensor( + indices, object_box_prob) + + # image_box_iou: P{a_{j} \in A_{+}}, shape: [c, j] + """ + from "start" to "end" implement: + image_box_iou = torch.sparse.max(object_cls_box_prob, + dim=0).t() + + """ + # start + box_cls_prob = torch.sparse.sum( + object_cls_box_prob, dim=0).to_dense() + + indices = torch.nonzero(box_cls_prob, as_tuple=False).t_() + if indices.numel() == 0: + image_box_prob = torch.zeros( + anchors_.size(0), + self.cls_out_channels).type_as(object_box_prob) + else: + nonzero_box_prob = torch.where( + (gt_labels_.unsqueeze(dim=-1) == indices[0]), + object_box_prob[:, indices[1]], + torch.tensor([ + 0 + ]).type_as(object_box_prob)).max(dim=0).values + + # upmap to shape [j, c] + image_box_prob = torch.sparse_coo_tensor( + indices.flip([0]), + nonzero_box_prob, + size=(anchors_.size(0), + self.cls_out_channels)).to_dense() + # end + + box_prob.append(image_box_prob) + + # construct bags for objects + match_quality_matrix = bbox_overlaps(gt_bboxes_, anchors_) + _, matched = torch.topk( + match_quality_matrix, + self.pre_anchor_topk, + dim=1, + sorted=False) + del match_quality_matrix + + # matched_cls_prob: P_{ij}^{cls} + matched_cls_prob = torch.gather( + cls_prob_[matched], 2, + gt_labels_.view(-1, 1, 1).repeat(1, self.pre_anchor_topk, + 1)).squeeze(2) + + # matched_box_prob: P_{ij}^{loc} + matched_anchors = anchors_[matched] + matched_object_targets = self.bbox_coder.encode( + matched_anchors, + gt_bboxes_.unsqueeze(dim=1).expand_as(matched_anchors)) + loss_bbox = self.loss_bbox( + bbox_preds_[matched], + matched_object_targets, + reduction_override='none').sum(-1) + matched_box_prob = torch.exp(-loss_bbox) + + # positive_losses: {-log( Mean-max(P_{ij}^{cls} * P_{ij}^{loc}) )} + num_pos += len(gt_bboxes_) + positive_losses.append( + self.positive_bag_loss(matched_cls_prob, matched_box_prob)) + positive_loss = torch.cat(positive_losses).sum() / max(1, num_pos) + + # box_prob: P{a_{j} \in A_{+}} + box_prob = torch.stack(box_prob, dim=0) + + # negative_loss: + # \sum_{j}{ FL((1 - P{a_{j} \in A_{+}}) * (1 - P_{j}^{bg})) } / n||B|| + negative_loss = self.negative_bag_loss(cls_prob, box_prob).sum() / max( + 1, num_pos * self.pre_anchor_topk) + + # avoid the absence of gradients in regression subnet + # when no ground-truth in a batch + if num_pos == 0: + positive_loss = bbox_preds.sum() * 0 + + losses = { + 'positive_bag_loss': positive_loss, + 'negative_bag_loss': negative_loss + } + return losses + + def positive_bag_loss(self, matched_cls_prob, matched_box_prob): + """Compute positive bag loss. + + :math:`-log( Mean-max(P_{ij}^{cls} * P_{ij}^{loc}) )`. + + :math:`P_{ij}^{cls}`: matched_cls_prob, classification probability of matched samples. + + :math:`P_{ij}^{loc}`: matched_box_prob, box probability of matched samples. + + Args: + matched_cls_prob (Tensor): Classification probability of matched + samples in shape (num_gt, pre_anchor_topk). + matched_box_prob (Tensor): BBox probability of matched samples, + in shape (num_gt, pre_anchor_topk). + + Returns: + Tensor: Positive bag loss in shape (num_gt,). + """ # noqa: E501, W605 + # bag_prob = Mean-max(matched_prob) + matched_prob = matched_cls_prob * matched_box_prob + weight = 1 / torch.clamp(1 - matched_prob, 1e-12, None) + weight /= weight.sum(dim=1).unsqueeze(dim=-1) + bag_prob = (weight * matched_prob).sum(dim=1) + # positive_bag_loss = -self.alpha * log(bag_prob) + return self.alpha * F.binary_cross_entropy( + bag_prob, torch.ones_like(bag_prob), reduction='none') + + def negative_bag_loss(self, cls_prob, box_prob): + """Compute negative bag loss. + + :math:`FL((1 - P_{a_{j} \in A_{+}}) * (1 - P_{j}^{bg}))`. + + :math:`P_{a_{j} \in A_{+}}`: Box_probability of matched samples. + + :math:`P_{j}^{bg}`: Classification probability of negative samples. + + Args: + cls_prob (Tensor): Classification probability, in shape + (num_img, num_anchors, num_classes). + box_prob (Tensor): Box probability, in shape + (num_img, num_anchors, num_classes). + + Returns: + Tensor: Negative bag loss in shape (num_img, num_anchors, num_classes). + """ # noqa: E501, W605 + prob = cls_prob * (1 - box_prob) + # There are some cases when neg_prob = 0. + # This will cause the neg_prob.log() to be inf without clamp. + prob = prob.clamp(min=EPS, max=1 - EPS) + negative_bag_loss = prob**self.gamma * F.binary_cross_entropy( + prob, torch.zeros_like(prob), reduction='none') + return (1 - self.alpha) * negative_bag_loss diff --git a/mmdet/models/dense_heads/fsaf_head.py b/mmdet/models/dense_heads/fsaf_head.py new file mode 100644 index 0000000..2d2b787 --- /dev/null +++ b/mmdet/models/dense_heads/fsaf_head.py @@ -0,0 +1,433 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import torch +from mmcv.runner import force_fp32 + +from mmdet.core import (anchor_inside_flags, images_to_levels, multi_apply, + unmap) +from ..builder import HEADS +from ..losses.accuracy import accuracy +from ..losses.utils import weight_reduce_loss +from .retina_head import RetinaHead + + +@HEADS.register_module() +class FSAFHead(RetinaHead): + """Anchor-free head used in `FSAF `_. + + The head contains two subnetworks. The first classifies anchor boxes and + the second regresses deltas for the anchors (num_anchors is 1 for anchor- + free methods) + + Args: + *args: Same as its base class in :class:`RetinaHead` + score_threshold (float, optional): The score_threshold to calculate + positive recall. If given, prediction scores lower than this value + is counted as incorrect prediction. Default to None. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + **kwargs: Same as its base class in :class:`RetinaHead` + + Example: + >>> import torch + >>> self = FSAFHead(11, 7) + >>> x = torch.rand(1, 7, 32, 32) + >>> cls_score, bbox_pred = self.forward_single(x) + >>> # Each anchor predicts a score for each class except background + >>> cls_per_anchor = cls_score.shape[1] / self.num_anchors + >>> box_per_anchor = bbox_pred.shape[1] / self.num_anchors + >>> assert cls_per_anchor == self.num_classes + >>> assert box_per_anchor == 4 + """ + + def __init__(self, *args, score_threshold=None, init_cfg=None, **kwargs): + # The positive bias in self.retina_reg conv is to prevent predicted \ + # bbox with 0 area + if init_cfg is None: + init_cfg = dict( + type='Normal', + layer='Conv2d', + std=0.01, + override=[ + dict( + type='Normal', + name='retina_cls', + std=0.01, + bias_prob=0.01), + dict( + type='Normal', name='retina_reg', std=0.01, bias=0.25) + ]) + super().__init__(*args, init_cfg=init_cfg, **kwargs) + self.score_threshold = score_threshold + + def forward_single(self, x): + """Forward feature map of a single scale level. + + Args: + x (Tensor): Feature map of a single scale level. + + Returns: + tuple (Tensor): + cls_score (Tensor): Box scores for each scale level + Has shape (N, num_points * num_classes, H, W). + bbox_pred (Tensor): Box energies / deltas for each scale + level with shape (N, num_points * 4, H, W). + """ + cls_score, bbox_pred = super().forward_single(x) + # relu: TBLR encoder only accepts positive bbox_pred + return cls_score, self.relu(bbox_pred) + + def _get_targets_single(self, + flat_anchors, + valid_flags, + gt_bboxes, + gt_bboxes_ignore, + gt_labels, + img_meta, + label_channels=1, + unmap_outputs=True): + """Compute regression and classification targets for anchors in a + single image. + + Most of the codes are the same with the base class + :obj: `AnchorHead`, except that it also collects and returns + the matched gt index in the image (from 0 to num_gt-1). If the + anchor bbox is not matched to any gt, the corresponding value in + pos_gt_inds is -1. + """ + inside_flags = anchor_inside_flags(flat_anchors, valid_flags, + img_meta['img_shape'][:2], + self.train_cfg.allowed_border) + if not inside_flags.any(): + return (None, ) * 7 + # Assign gt and sample anchors + anchors = flat_anchors[inside_flags.type(torch.bool), :] + assign_result = self.assigner.assign( + anchors, gt_bboxes, gt_bboxes_ignore, + None if self.sampling else gt_labels) + + sampling_result = self.sampler.sample(assign_result, anchors, + gt_bboxes) + + num_valid_anchors = anchors.shape[0] + bbox_targets = torch.zeros_like(anchors) + bbox_weights = torch.zeros_like(anchors) + labels = anchors.new_full((num_valid_anchors, ), + self.num_classes, + dtype=torch.long) + label_weights = anchors.new_zeros((num_valid_anchors, label_channels), + dtype=torch.float) + pos_gt_inds = anchors.new_full((num_valid_anchors, ), + -1, + dtype=torch.long) + + pos_inds = sampling_result.pos_inds + neg_inds = sampling_result.neg_inds + + if len(pos_inds) > 0: + if not self.reg_decoded_bbox: + pos_bbox_targets = self.bbox_coder.encode( + sampling_result.pos_bboxes, sampling_result.pos_gt_bboxes) + else: + # When the regression loss (e.g. `IouLoss`, `GIouLoss`) + # is applied directly on the decoded bounding boxes, both + # the predicted boxes and regression targets should be with + # absolute coordinate format. + pos_bbox_targets = sampling_result.pos_gt_bboxes + bbox_targets[pos_inds, :] = pos_bbox_targets + bbox_weights[pos_inds, :] = 1.0 + # The assigned gt_index for each anchor. (0-based) + pos_gt_inds[pos_inds] = sampling_result.pos_assigned_gt_inds + if gt_labels is None: + # Only rpn gives gt_labels as None + # Foreground is the first class + labels[pos_inds] = 0 + else: + labels[pos_inds] = gt_labels[ + sampling_result.pos_assigned_gt_inds] + if self.train_cfg.pos_weight <= 0: + label_weights[pos_inds] = 1.0 + else: + label_weights[pos_inds] = self.train_cfg.pos_weight + + if len(neg_inds) > 0: + label_weights[neg_inds] = 1.0 + + # shadowed_labels is a tensor composed of tuples + # (anchor_inds, class_label) that indicate those anchors lying in the + # outer region of a gt or overlapped by another gt with a smaller + # area. + # + # Therefore, only the shadowed labels are ignored for loss calculation. + # the key `shadowed_labels` is defined in :obj:`CenterRegionAssigner` + shadowed_labels = assign_result.get_extra_property('shadowed_labels') + if shadowed_labels is not None and shadowed_labels.numel(): + if len(shadowed_labels.shape) == 2: + idx_, label_ = shadowed_labels[:, 0], shadowed_labels[:, 1] + assert (labels[idx_] != label_).all(), \ + 'One label cannot be both positive and ignored' + label_weights[idx_, label_] = 0 + else: + label_weights[shadowed_labels] = 0 + + # map up to original set of anchors + if unmap_outputs: + num_total_anchors = flat_anchors.size(0) + labels = unmap(labels, num_total_anchors, inside_flags) + label_weights = unmap(label_weights, num_total_anchors, + inside_flags) + bbox_targets = unmap(bbox_targets, num_total_anchors, inside_flags) + bbox_weights = unmap(bbox_weights, num_total_anchors, inside_flags) + pos_gt_inds = unmap( + pos_gt_inds, num_total_anchors, inside_flags, fill=-1) + + return (labels, label_weights, bbox_targets, bbox_weights, pos_inds, + neg_inds, sampling_result, pos_gt_inds) + + @force_fp32(apply_to=('cls_scores', 'bbox_preds')) + def loss(self, + cls_scores, + bbox_preds, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Compute loss of the head. + + Args: + cls_scores (list[Tensor]): Box scores for each scale level + Has shape (N, num_points * num_classes, H, W). + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level with shape (N, num_points * 4, H, W). + gt_bboxes (list[Tensor]): each item are the truth boxes for each + image in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (None | list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + for i in range(len(bbox_preds)): # loop over fpn level + # avoid 0 area of the predicted bbox + bbox_preds[i] = bbox_preds[i].clamp(min=1e-4) + # TODO: It may directly use the base-class loss function. + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + assert len(featmap_sizes) == self.prior_generator.num_levels + batch_size = len(gt_bboxes) + device = cls_scores[0].device + anchor_list, valid_flag_list = self.get_anchors( + featmap_sizes, img_metas, device=device) + label_channels = self.cls_out_channels if self.use_sigmoid_cls else 1 + cls_reg_targets = self.get_targets( + anchor_list, + valid_flag_list, + gt_bboxes, + img_metas, + gt_bboxes_ignore_list=gt_bboxes_ignore, + gt_labels_list=gt_labels, + label_channels=label_channels) + if cls_reg_targets is None: + return None + (labels_list, label_weights_list, bbox_targets_list, bbox_weights_list, + num_total_pos, num_total_neg, + pos_assigned_gt_inds_list) = cls_reg_targets + + num_gts = np.array(list(map(len, gt_labels))) + num_total_samples = ( + num_total_pos + num_total_neg if self.sampling else num_total_pos) + # anchor number of multi levels + num_level_anchors = [anchors.size(0) for anchors in anchor_list[0]] + # concat all level anchors and flags to a single tensor + concat_anchor_list = [] + for i in range(len(anchor_list)): + concat_anchor_list.append(torch.cat(anchor_list[i])) + all_anchor_list = images_to_levels(concat_anchor_list, + num_level_anchors) + losses_cls, losses_bbox = multi_apply( + self.loss_single, + cls_scores, + bbox_preds, + all_anchor_list, + labels_list, + label_weights_list, + bbox_targets_list, + bbox_weights_list, + num_total_samples=num_total_samples) + + # `pos_assigned_gt_inds_list` (length: fpn_levels) stores the assigned + # gt index of each anchor bbox in each fpn level. + cum_num_gts = list(np.cumsum(num_gts)) # length of batch_size + for i, assign in enumerate(pos_assigned_gt_inds_list): + # loop over fpn levels + for j in range(1, batch_size): + # loop over batch size + # Convert gt indices in each img to those in the batch + assign[j][assign[j] >= 0] += int(cum_num_gts[j - 1]) + pos_assigned_gt_inds_list[i] = assign.flatten() + labels_list[i] = labels_list[i].flatten() + num_gts = sum(map(len, gt_labels)) # total number of gt in the batch + # The unique label index of each gt in the batch + label_sequence = torch.arange(num_gts, device=device) + # Collect the average loss of each gt in each level + with torch.no_grad(): + loss_levels, = multi_apply( + self.collect_loss_level_single, + losses_cls, + losses_bbox, + pos_assigned_gt_inds_list, + labels_seq=label_sequence) + # Shape: (fpn_levels, num_gts). Loss of each gt at each fpn level + loss_levels = torch.stack(loss_levels, dim=0) + # Locate the best fpn level for loss back-propagation + if loss_levels.numel() == 0: # zero gt + argmin = loss_levels.new_empty((num_gts, ), dtype=torch.long) + else: + _, argmin = loss_levels.min(dim=0) + + # Reweight the loss of each (anchor, label) pair, so that only those + # at the best gt level are back-propagated. + losses_cls, losses_bbox, pos_inds = multi_apply( + self.reweight_loss_single, + losses_cls, + losses_bbox, + pos_assigned_gt_inds_list, + labels_list, + list(range(len(losses_cls))), + min_levels=argmin) + num_pos = torch.cat(pos_inds, 0).sum().float() + pos_recall = self.calculate_pos_recall(cls_scores, labels_list, + pos_inds) + + if num_pos == 0: # No gt + avg_factor = num_pos + float(num_total_neg) + else: + avg_factor = num_pos + for i in range(len(losses_cls)): + losses_cls[i] /= avg_factor + losses_bbox[i] /= avg_factor + return dict( + loss_cls=losses_cls, + loss_bbox=losses_bbox, + num_pos=num_pos / batch_size, + pos_recall=pos_recall) + + def calculate_pos_recall(self, cls_scores, labels_list, pos_inds): + """Calculate positive recall with score threshold. + + Args: + cls_scores (list[Tensor]): Classification scores at all fpn levels. + Each tensor is in shape (N, num_classes * num_anchors, H, W) + labels_list (list[Tensor]): The label that each anchor is assigned + to. Shape (N * H * W * num_anchors, ) + pos_inds (list[Tensor]): List of bool tensors indicating whether + the anchor is assigned to a positive label. + Shape (N * H * W * num_anchors, ) + + Returns: + Tensor: A single float number indicating the positive recall. + """ + with torch.no_grad(): + num_class = self.num_classes + scores = [ + cls.permute(0, 2, 3, 1).reshape(-1, num_class)[pos] + for cls, pos in zip(cls_scores, pos_inds) + ] + labels = [ + label.reshape(-1)[pos] + for label, pos in zip(labels_list, pos_inds) + ] + scores = torch.cat(scores, dim=0) + labels = torch.cat(labels, dim=0) + if self.use_sigmoid_cls: + scores = scores.sigmoid() + else: + scores = scores.softmax(dim=1) + + return accuracy(scores, labels, thresh=self.score_threshold) + + def collect_loss_level_single(self, cls_loss, reg_loss, assigned_gt_inds, + labels_seq): + """Get the average loss in each FPN level w.r.t. each gt label. + + Args: + cls_loss (Tensor): Classification loss of each feature map pixel, + shape (num_anchor, num_class) + reg_loss (Tensor): Regression loss of each feature map pixel, + shape (num_anchor, 4) + assigned_gt_inds (Tensor): It indicates which gt the prior is + assigned to (0-based, -1: no assignment). shape (num_anchor), + labels_seq: The rank of labels. shape (num_gt) + + Returns: + shape: (num_gt), average loss of each gt in this level + """ + if len(reg_loss.shape) == 2: # iou loss has shape (num_prior, 4) + reg_loss = reg_loss.sum(dim=-1) # sum loss in tblr dims + if len(cls_loss.shape) == 2: + cls_loss = cls_loss.sum(dim=-1) # sum loss in class dims + loss = cls_loss + reg_loss + assert loss.size(0) == assigned_gt_inds.size(0) + # Default loss value is 1e6 for a layer where no anchor is positive + # to ensure it will not be chosen to back-propagate gradient + losses_ = loss.new_full(labels_seq.shape, 1e6) + for i, l in enumerate(labels_seq): + match = assigned_gt_inds == l + if match.any(): + losses_[i] = loss[match].mean() + return losses_, + + def reweight_loss_single(self, cls_loss, reg_loss, assigned_gt_inds, + labels, level, min_levels): + """Reweight loss values at each level. + + Reassign loss values at each level by masking those where the + pre-calculated loss is too large. Then return the reduced losses. + + Args: + cls_loss (Tensor): Element-wise classification loss. + Shape: (num_anchors, num_classes) + reg_loss (Tensor): Element-wise regression loss. + Shape: (num_anchors, 4) + assigned_gt_inds (Tensor): The gt indices that each anchor bbox + is assigned to. -1 denotes a negative anchor, otherwise it is the + gt index (0-based). Shape: (num_anchors, ), + labels (Tensor): Label assigned to anchors. Shape: (num_anchors, ). + level (int): The current level index in the pyramid + (0-4 for RetinaNet) + min_levels (Tensor): The best-matching level for each gt. + Shape: (num_gts, ), + + Returns: + tuple: + - cls_loss: Reduced corrected classification loss. Scalar. + - reg_loss: Reduced corrected regression loss. Scalar. + - pos_flags (Tensor): Corrected bool tensor indicating the + final positive anchors. Shape: (num_anchors, ). + """ + loc_weight = torch.ones_like(reg_loss) + cls_weight = torch.ones_like(cls_loss) + pos_flags = assigned_gt_inds >= 0 # positive pixel flag + pos_indices = torch.nonzero(pos_flags, as_tuple=False).flatten() + + if pos_flags.any(): # pos pixels exist + pos_assigned_gt_inds = assigned_gt_inds[pos_flags] + zeroing_indices = (min_levels[pos_assigned_gt_inds] != level) + neg_indices = pos_indices[zeroing_indices] + + if neg_indices.numel(): + pos_flags[neg_indices] = 0 + loc_weight[neg_indices] = 0 + # Only the weight corresponding to the label is + # zeroed out if not selected + zeroing_labels = labels[neg_indices] + assert (zeroing_labels >= 0).all() + cls_weight[neg_indices, zeroing_labels] = 0 + + # Weighted loss for both cls and reg loss + cls_loss = weight_reduce_loss(cls_loss, cls_weight, reduction='sum') + reg_loss = weight_reduce_loss(reg_loss, loc_weight, reduction='sum') + + return cls_loss, reg_loss, pos_flags diff --git a/mmdet/models/dense_heads/ga_retina_head.py b/mmdet/models/dense_heads/ga_retina_head.py new file mode 100644 index 0000000..6d9e874 --- /dev/null +++ b/mmdet/models/dense_heads/ga_retina_head.py @@ -0,0 +1,113 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +from mmcv.cnn import ConvModule +from mmcv.ops import MaskedConv2d + +from ..builder import HEADS +from .guided_anchor_head import FeatureAdaption, GuidedAnchorHead + + +@HEADS.register_module() +class GARetinaHead(GuidedAnchorHead): + """Guided-Anchor-based RetinaNet head.""" + + def __init__(self, + num_classes, + in_channels, + stacked_convs=4, + conv_cfg=None, + norm_cfg=None, + init_cfg=None, + **kwargs): + if init_cfg is None: + init_cfg = dict( + type='Normal', + layer='Conv2d', + std=0.01, + override=[ + dict( + type='Normal', + name='conv_loc', + std=0.01, + bias_prob=0.01), + dict( + type='Normal', + name='retina_cls', + std=0.01, + bias_prob=0.01) + ]) + self.stacked_convs = stacked_convs + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + super(GARetinaHead, self).__init__( + num_classes, in_channels, init_cfg=init_cfg, **kwargs) + + def _init_layers(self): + """Initialize layers of the head.""" + self.relu = nn.ReLU(inplace=True) + self.cls_convs = nn.ModuleList() + self.reg_convs = nn.ModuleList() + for i in range(self.stacked_convs): + chn = self.in_channels if i == 0 else self.feat_channels + self.cls_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg)) + self.reg_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg)) + + self.conv_loc = nn.Conv2d(self.feat_channels, 1, 1) + self.conv_shape = nn.Conv2d(self.feat_channels, self.num_anchors * 2, + 1) + self.feature_adaption_cls = FeatureAdaption( + self.feat_channels, + self.feat_channels, + kernel_size=3, + deform_groups=self.deform_groups) + self.feature_adaption_reg = FeatureAdaption( + self.feat_channels, + self.feat_channels, + kernel_size=3, + deform_groups=self.deform_groups) + self.retina_cls = MaskedConv2d( + self.feat_channels, + self.num_base_priors * self.cls_out_channels, + 3, + padding=1) + self.retina_reg = MaskedConv2d( + self.feat_channels, self.num_base_priors * 4, 3, padding=1) + + def forward_single(self, x): + """Forward feature map of a single scale level.""" + cls_feat = x + reg_feat = x + for cls_conv in self.cls_convs: + cls_feat = cls_conv(cls_feat) + for reg_conv in self.reg_convs: + reg_feat = reg_conv(reg_feat) + + loc_pred = self.conv_loc(cls_feat) + shape_pred = self.conv_shape(reg_feat) + + cls_feat = self.feature_adaption_cls(cls_feat, shape_pred) + reg_feat = self.feature_adaption_reg(reg_feat, shape_pred) + + if not self.training: + mask = loc_pred.sigmoid()[0] >= self.loc_filter_thr + else: + mask = None + cls_score = self.retina_cls(cls_feat, mask) + bbox_pred = self.retina_reg(reg_feat, mask) + return cls_score, bbox_pred, shape_pred, loc_pred diff --git a/mmdet/models/dense_heads/ga_rpn_head.py b/mmdet/models/dense_heads/ga_rpn_head.py new file mode 100644 index 0000000..4123c8b --- /dev/null +++ b/mmdet/models/dense_heads/ga_rpn_head.py @@ -0,0 +1,177 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy +import warnings + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv import ConfigDict +from mmcv.ops import nms + +from ..builder import HEADS +from .guided_anchor_head import GuidedAnchorHead + + +@HEADS.register_module() +class GARPNHead(GuidedAnchorHead): + """Guided-Anchor-based RPN head.""" + + def __init__(self, + in_channels, + init_cfg=dict( + type='Normal', + layer='Conv2d', + std=0.01, + override=dict( + type='Normal', + name='conv_loc', + std=0.01, + bias_prob=0.01)), + **kwargs): + super(GARPNHead, self).__init__( + 1, in_channels, init_cfg=init_cfg, **kwargs) + + def _init_layers(self): + """Initialize layers of the head.""" + self.rpn_conv = nn.Conv2d( + self.in_channels, self.feat_channels, 3, padding=1) + super(GARPNHead, self)._init_layers() + + def forward_single(self, x): + """Forward feature of a single scale level.""" + + x = self.rpn_conv(x) + x = F.relu(x, inplace=True) + (cls_score, bbox_pred, shape_pred, + loc_pred) = super(GARPNHead, self).forward_single(x) + return cls_score, bbox_pred, shape_pred, loc_pred + + def loss(self, + cls_scores, + bbox_preds, + shape_preds, + loc_preds, + gt_bboxes, + img_metas, + gt_bboxes_ignore=None): + losses = super(GARPNHead, self).loss( + cls_scores, + bbox_preds, + shape_preds, + loc_preds, + gt_bboxes, + None, + img_metas, + gt_bboxes_ignore=gt_bboxes_ignore) + return dict( + loss_rpn_cls=losses['loss_cls'], + loss_rpn_bbox=losses['loss_bbox'], + loss_anchor_shape=losses['loss_shape'], + loss_anchor_loc=losses['loss_loc']) + + def _get_bboxes_single(self, + cls_scores, + bbox_preds, + mlvl_anchors, + mlvl_masks, + img_shape, + scale_factor, + cfg, + rescale=False): + cfg = self.test_cfg if cfg is None else cfg + + cfg = copy.deepcopy(cfg) + + # deprecate arguments warning + if 'nms' not in cfg or 'max_num' in cfg or 'nms_thr' in cfg: + warnings.warn( + 'In rpn_proposal or test_cfg, ' + 'nms_thr has been moved to a dict named nms as ' + 'iou_threshold, max_num has been renamed as max_per_img, ' + 'name of original arguments and the way to specify ' + 'iou_threshold of NMS will be deprecated.') + if 'nms' not in cfg: + cfg.nms = ConfigDict(dict(type='nms', iou_threshold=cfg.nms_thr)) + if 'max_num' in cfg: + if 'max_per_img' in cfg: + assert cfg.max_num == cfg.max_per_img, f'You ' \ + f'set max_num and max_per_img at the same time, ' \ + f'but get {cfg.max_num} ' \ + f'and {cfg.max_per_img} respectively' \ + 'Please delete max_num which will be deprecated.' + else: + cfg.max_per_img = cfg.max_num + if 'nms_thr' in cfg: + assert cfg.nms.iou_threshold == cfg.nms_thr, f'You set ' \ + f'iou_threshold in nms and ' \ + f'nms_thr at the same time, but get ' \ + f'{cfg.nms.iou_threshold} and {cfg.nms_thr}' \ + f' respectively. Please delete the ' \ + f'nms_thr which will be deprecated.' + + assert cfg.nms.get('type', 'nms') == 'nms', 'GARPNHead only support ' \ + 'naive nms.' + + mlvl_proposals = [] + for idx in range(len(cls_scores)): + rpn_cls_score = cls_scores[idx] + rpn_bbox_pred = bbox_preds[idx] + anchors = mlvl_anchors[idx] + mask = mlvl_masks[idx] + assert rpn_cls_score.size()[-2:] == rpn_bbox_pred.size()[-2:] + # if no location is kept, end. + if mask.sum() == 0: + continue + rpn_cls_score = rpn_cls_score.permute(1, 2, 0) + if self.use_sigmoid_cls: + rpn_cls_score = rpn_cls_score.reshape(-1) + scores = rpn_cls_score.sigmoid() + else: + rpn_cls_score = rpn_cls_score.reshape(-1, 2) + # remind that we set FG labels to [0, num_class-1] + # since mmdet v2.0 + # BG cat_id: num_class + scores = rpn_cls_score.softmax(dim=1)[:, :-1] + # filter scores, bbox_pred w.r.t. mask. + # anchors are filtered in get_anchors() beforehand. + scores = scores[mask] + rpn_bbox_pred = rpn_bbox_pred.permute(1, 2, 0).reshape(-1, + 4)[mask, :] + if scores.dim() == 0: + rpn_bbox_pred = rpn_bbox_pred.unsqueeze(0) + anchors = anchors.unsqueeze(0) + scores = scores.unsqueeze(0) + # filter anchors, bbox_pred, scores w.r.t. scores + if cfg.nms_pre > 0 and scores.shape[0] > cfg.nms_pre: + _, topk_inds = scores.topk(cfg.nms_pre) + rpn_bbox_pred = rpn_bbox_pred[topk_inds, :] + anchors = anchors[topk_inds, :] + scores = scores[topk_inds] + # get proposals w.r.t. anchors and rpn_bbox_pred + proposals = self.bbox_coder.decode( + anchors, rpn_bbox_pred, max_shape=img_shape) + # filter out too small bboxes + if cfg.min_bbox_size >= 0: + w = proposals[:, 2] - proposals[:, 0] + h = proposals[:, 3] - proposals[:, 1] + valid_mask = (w > cfg.min_bbox_size) & (h > cfg.min_bbox_size) + if not valid_mask.all(): + proposals = proposals[valid_mask] + scores = scores[valid_mask] + + # NMS in current level + proposals, _ = nms(proposals, scores, cfg.nms.iou_threshold) + proposals = proposals[:cfg.nms_post, :] + mlvl_proposals.append(proposals) + proposals = torch.cat(mlvl_proposals, 0) + if cfg.get('nms_across_levels', False): + # NMS across multi levels + proposals, _ = nms(proposals[:, :4], proposals[:, -1], + cfg.nms.iou_threshold) + proposals = proposals[:cfg.max_per_img, :] + else: + scores = proposals[:, 4] + num = min(cfg.max_per_img, proposals.shape[0]) + _, topk_inds = scores.topk(num) + proposals = proposals[topk_inds, :] + return proposals diff --git a/mmdet/models/dense_heads/gfl_head.py b/mmdet/models/dense_heads/gfl_head.py new file mode 100644 index 0000000..12eb89d --- /dev/null +++ b/mmdet/models/dense_heads/gfl_head.py @@ -0,0 +1,648 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule, Scale +from mmcv.runner import force_fp32 + +from mmdet.core import (anchor_inside_flags, bbox_overlaps, build_assigner, + build_sampler, images_to_levels, multi_apply, + reduce_mean, unmap) +from mmdet.core.utils import filter_scores_and_topk +from ..builder import HEADS, build_loss +from .anchor_head import AnchorHead + + +class Integral(nn.Module): + """A fixed layer for calculating integral result from distribution. + + This layer calculates the target location by :math: `sum{P(y_i) * y_i}`, + P(y_i) denotes the softmax vector that represents the discrete distribution + y_i denotes the discrete set, usually {0, 1, 2, ..., reg_max} + + Args: + reg_max (int): The maximal value of the discrete set. Default: 16. You + may want to reset it according to your new dataset or related + settings. + """ + + def __init__(self, reg_max=16): + super(Integral, self).__init__() + self.reg_max = reg_max + self.register_buffer('project', + torch.linspace(0, self.reg_max, self.reg_max + 1)) + + def forward(self, x): + """Forward feature from the regression head to get integral result of + bounding box location. + + Args: + x (Tensor): Features of the regression head, shape (N, 4*(n+1)), + n is self.reg_max. + + Returns: + x (Tensor): Integral result of box locations, i.e., distance + offsets from the box center in four directions, shape (N, 4). + """ + x = F.softmax(x.reshape(-1, self.reg_max + 1), dim=1) + x = F.linear(x, self.project.type_as(x)).reshape(-1, 4) + return x + + +@HEADS.register_module() +class GFLHead(AnchorHead): + """Generalized Focal Loss: Learning Qualified and Distributed Bounding + Boxes for Dense Object Detection. + + GFL head structure is similar with ATSS, however GFL uses + 1) joint representation for classification and localization quality, and + 2) flexible General distribution for bounding box locations, + which are supervised by + Quality Focal Loss (QFL) and Distribution Focal Loss (DFL), respectively + + https://arxiv.org/abs/2006.04388 + + Args: + num_classes (int): Number of categories excluding the background + category. + in_channels (int): Number of channels in the input feature map. + stacked_convs (int): Number of conv layers in cls and reg tower. + Default: 4. + conv_cfg (dict): dictionary to construct and config conv layer. + Default: None. + norm_cfg (dict): dictionary to construct and config norm layer. + Default: dict(type='GN', num_groups=32, requires_grad=True). + loss_qfl (dict): Config of Quality Focal Loss (QFL). + bbox_coder (dict): Config of bbox coder. Defaults + 'DistancePointBBoxCoder'. + reg_max (int): Max value of integral set :math: `{0, ..., reg_max}` + in QFL setting. Default: 16. + init_cfg (dict or list[dict], optional): Initialization config dict. + Example: + >>> self = GFLHead(11, 7) + >>> feats = [torch.rand(1, 7, s, s) for s in [4, 8, 16, 32, 64]] + >>> cls_quality_score, bbox_pred = self.forward(feats) + >>> assert len(cls_quality_score) == len(self.scales) + """ + + def __init__(self, + num_classes, + in_channels, + stacked_convs=4, + conv_cfg=None, + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True), + loss_dfl=dict(type='DistributionFocalLoss', loss_weight=0.25), + bbox_coder=dict(type='DistancePointBBoxCoder'), + reg_max=16, + init_cfg=dict( + type='Normal', + layer='Conv2d', + std=0.01, + override=dict( + type='Normal', + name='gfl_cls', + std=0.01, + bias_prob=0.01)), + **kwargs): + self.stacked_convs = stacked_convs + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.reg_max = reg_max + super(GFLHead, self).__init__( + num_classes, + in_channels, + bbox_coder=bbox_coder, + init_cfg=init_cfg, + **kwargs) + + self.sampling = False + if self.train_cfg: + self.assigner = build_assigner(self.train_cfg.assigner) + # SSD sampling=False so use PseudoSampler + sampler_cfg = dict(type='PseudoSampler') + self.sampler = build_sampler(sampler_cfg, context=self) + + self.integral = Integral(self.reg_max) + self.loss_dfl = build_loss(loss_dfl) + + def _init_layers(self): + """Initialize layers of the head.""" + self.relu = nn.ReLU(inplace=True) + self.cls_convs = nn.ModuleList() + self.reg_convs = nn.ModuleList() + for i in range(self.stacked_convs): + chn = self.in_channels if i == 0 else self.feat_channels + self.cls_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg)) + self.reg_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg)) + assert self.num_anchors == 1, 'anchor free version' + self.gfl_cls = nn.Conv2d( + self.feat_channels, self.cls_out_channels, 3, padding=1) + self.gfl_reg = nn.Conv2d( + self.feat_channels, 4 * (self.reg_max + 1), 3, padding=1) + self.scales = nn.ModuleList( + [Scale(1.0) for _ in self.prior_generator.strides]) + + def forward(self, feats): + """Forward features from the upstream network. + + Args: + feats (tuple[Tensor]): Features from the upstream network, each is + a 4D-tensor. + + Returns: + tuple: Usually a tuple of classification scores and bbox prediction + cls_scores (list[Tensor]): Classification and quality (IoU) + joint scores for all scale levels, each is a 4D-tensor, + the channel number is num_classes. + bbox_preds (list[Tensor]): Box distribution logits for all + scale levels, each is a 4D-tensor, the channel number is + 4*(n+1), n is max value of integral set. + """ + return multi_apply(self.forward_single, feats, self.scales) + + def forward_single(self, x, scale): + """Forward feature of a single scale level. + + Args: + x (Tensor): Features of a single scale level. + scale (:obj: `mmcv.cnn.Scale`): Learnable scale module to resize + the bbox prediction. + + Returns: + tuple: + cls_score (Tensor): Cls and quality joint scores for a single + scale level the channel number is num_classes. + bbox_pred (Tensor): Box distribution logits for a single scale + level, the channel number is 4*(n+1), n is max value of + integral set. + """ + cls_feat = x + reg_feat = x + for cls_conv in self.cls_convs: + cls_feat = cls_conv(cls_feat) + for reg_conv in self.reg_convs: + reg_feat = reg_conv(reg_feat) + cls_score = self.gfl_cls(cls_feat) + bbox_pred = scale(self.gfl_reg(reg_feat)).float() + return cls_score, bbox_pred + + def anchor_center(self, anchors): + """Get anchor centers from anchors. + + Args: + anchors (Tensor): Anchor list with shape (N, 4), "xyxy" format. + + Returns: + Tensor: Anchor centers with shape (N, 2), "xy" format. + """ + anchors_cx = (anchors[..., 2] + anchors[..., 0]) / 2 + anchors_cy = (anchors[..., 3] + anchors[..., 1]) / 2 + return torch.stack([anchors_cx, anchors_cy], dim=-1) + + def loss_single(self, anchors, cls_score, bbox_pred, labels, label_weights, + bbox_targets, stride, num_total_samples): + """Compute loss of a single scale level. + + Args: + anchors (Tensor): Box reference for each scale level with shape + (N, num_total_anchors, 4). + cls_score (Tensor): Cls and quality joint scores for each scale + level has shape (N, num_classes, H, W). + bbox_pred (Tensor): Box distribution logits for each scale + level with shape (N, 4*(n+1), H, W), n is max value of integral + set. + labels (Tensor): Labels of each anchors with shape + (N, num_total_anchors). + label_weights (Tensor): Label weights of each anchor with shape + (N, num_total_anchors) + bbox_targets (Tensor): BBox regression targets of each anchor + weight shape (N, num_total_anchors, 4). + stride (tuple): Stride in this scale level. + num_total_samples (int): Number of positive samples that is + reduced over all GPUs. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + assert stride[0] == stride[1], 'h stride is not equal to w stride!' + anchors = anchors.reshape(-1, 4) + cls_score = cls_score.permute(0, 2, 3, + 1).reshape(-1, self.cls_out_channels) + bbox_pred = bbox_pred.permute(0, 2, 3, + 1).reshape(-1, 4 * (self.reg_max + 1)) + bbox_targets = bbox_targets.reshape(-1, 4) + labels = labels.reshape(-1) + label_weights = label_weights.reshape(-1) + + # FG cat_id: [0, num_classes -1], BG cat_id: num_classes + bg_class_ind = self.num_classes + pos_inds = ((labels >= 0) + & (labels < bg_class_ind)).nonzero().squeeze(1) + score = label_weights.new_zeros(labels.shape) + + if len(pos_inds) > 0: + pos_bbox_targets = bbox_targets[pos_inds] + pos_bbox_pred = bbox_pred[pos_inds] + pos_anchors = anchors[pos_inds] + pos_anchor_centers = self.anchor_center(pos_anchors) / stride[0] + + weight_targets = cls_score.detach().sigmoid() + weight_targets = weight_targets.max(dim=1)[0][pos_inds] + pos_bbox_pred_corners = self.integral(pos_bbox_pred) + pos_decode_bbox_pred = self.bbox_coder.decode( + pos_anchor_centers, pos_bbox_pred_corners) + pos_decode_bbox_targets = pos_bbox_targets / stride[0] + score[pos_inds] = bbox_overlaps( + pos_decode_bbox_pred.detach(), + pos_decode_bbox_targets, + is_aligned=True) + pred_corners = pos_bbox_pred.reshape(-1, self.reg_max + 1) + target_corners = self.bbox_coder.encode(pos_anchor_centers, + pos_decode_bbox_targets, + self.reg_max).reshape(-1) + + # regression loss + loss_bbox = self.loss_bbox( + pos_decode_bbox_pred, + pos_decode_bbox_targets, + weight=weight_targets, + avg_factor=1.0) + + # dfl loss + loss_dfl = self.loss_dfl( + pred_corners, + target_corners, + weight=weight_targets[:, None].expand(-1, 4).reshape(-1), + avg_factor=4.0) + else: + loss_bbox = bbox_pred.sum() * 0 + loss_dfl = bbox_pred.sum() * 0 + weight_targets = bbox_pred.new_tensor(0) + + # cls (qfl) loss + loss_cls = self.loss_cls( + cls_score, (labels, score), + weight=label_weights, + avg_factor=num_total_samples) + + return loss_cls, loss_bbox, loss_dfl, weight_targets.sum() + + @force_fp32(apply_to=('cls_scores', 'bbox_preds')) + def loss(self, + cls_scores, + bbox_preds, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Compute losses of the head. + + Args: + cls_scores (list[Tensor]): Cls and quality scores for each scale + level has shape (N, num_classes, H, W). + bbox_preds (list[Tensor]): Box distribution logits for each scale + level with shape (N, 4*(n+1), H, W), n is max value of integral + set. + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (list[Tensor] | None): specify which bounding + boxes can be ignored when computing the loss. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + assert len(featmap_sizes) == self.prior_generator.num_levels + + device = cls_scores[0].device + anchor_list, valid_flag_list = self.get_anchors( + featmap_sizes, img_metas, device=device) + label_channels = self.cls_out_channels if self.use_sigmoid_cls else 1 + + cls_reg_targets = self.get_targets( + anchor_list, + valid_flag_list, + gt_bboxes, + img_metas, + gt_bboxes_ignore_list=gt_bboxes_ignore, + gt_labels_list=gt_labels, + label_channels=label_channels) + if cls_reg_targets is None: + return None + + (anchor_list, labels_list, label_weights_list, bbox_targets_list, + bbox_weights_list, num_total_pos, num_total_neg) = cls_reg_targets + + num_total_samples = reduce_mean( + torch.tensor(num_total_pos, dtype=torch.float, + device=device)).item() + num_total_samples = max(num_total_samples, 1.0) + + losses_cls, losses_bbox, losses_dfl,\ + avg_factor = multi_apply( + self.loss_single, + anchor_list, + cls_scores, + bbox_preds, + labels_list, + label_weights_list, + bbox_targets_list, + self.prior_generator.strides, + num_total_samples=num_total_samples) + + avg_factor = sum(avg_factor) + avg_factor = reduce_mean(avg_factor).clamp_(min=1).item() + losses_bbox = list(map(lambda x: x / avg_factor, losses_bbox)) + losses_dfl = list(map(lambda x: x / avg_factor, losses_dfl)) + return dict( + loss_cls=losses_cls, loss_bbox=losses_bbox, loss_dfl=losses_dfl) + + def _get_bboxes_single(self, + cls_score_list, + bbox_pred_list, + score_factor_list, + mlvl_priors, + img_meta, + cfg, + rescale=False, + with_nms=True, + **kwargs): + """Transform outputs of a single image into bbox predictions. + + Args: + cls_score_list (list[Tensor]): Box scores from all scale + levels of a single image, each item has shape + (num_priors * num_classes, H, W). + bbox_pred_list (list[Tensor]): Box energies / deltas from + all scale levels of a single image, each item has shape + (num_priors * 4, H, W). + score_factor_list (list[Tensor]): Score factor from all scale + levels of a single image. GFL head does not need this value. + mlvl_priors (list[Tensor]): Each element in the list is + the priors of a single level in feature pyramid, has shape + (num_priors, 4). + img_meta (dict): Image meta info. + cfg (mmcv.Config): Test / postprocessing configuration, + if None, test_cfg would be used. + rescale (bool): If True, return boxes in original image space. + Default: False. + with_nms (bool): If True, do nms before return boxes. + Default: True. + + Returns: + tuple[Tensor]: Results of detected bboxes and labels. If with_nms + is False and mlvl_score_factor is None, return mlvl_bboxes and + mlvl_scores, else return mlvl_bboxes, mlvl_scores and + mlvl_score_factor. Usually with_nms is False is used for aug + test. If with_nms is True, then return the following format + + - det_bboxes (Tensor): Predicted bboxes with shape \ + [num_bboxes, 5], where the first 4 columns are bounding \ + box positions (tl_x, tl_y, br_x, br_y) and the 5-th \ + column are scores between 0 and 1. + - det_labels (Tensor): Predicted labels of the corresponding \ + box with shape [num_bboxes]. + """ + cfg = self.test_cfg if cfg is None else cfg + img_shape = img_meta['img_shape'] + nms_pre = cfg.get('nms_pre', -1) + + mlvl_bboxes = [] + mlvl_scores = [] + mlvl_labels = [] + for level_idx, (cls_score, bbox_pred, stride, priors) in enumerate( + zip(cls_score_list, bbox_pred_list, + self.prior_generator.strides, mlvl_priors)): + assert cls_score.size()[-2:] == bbox_pred.size()[-2:] + assert stride[0] == stride[1] + + bbox_pred = bbox_pred.permute(1, 2, 0) + bbox_pred = self.integral(bbox_pred) * stride[0] + + scores = cls_score.permute(1, 2, 0).reshape( + -1, self.cls_out_channels).sigmoid() + + # After https://github.com/open-mmlab/mmdetection/pull/6268/, + # this operation keeps fewer bboxes under the same `nms_pre`. + # There is no difference in performance for most models. If you + # find a slight drop in performance, you can set a larger + # `nms_pre` than before. + results = filter_scores_and_topk( + scores, cfg.score_thr, nms_pre, + dict(bbox_pred=bbox_pred, priors=priors)) + scores, labels, _, filtered_results = results + + bbox_pred = filtered_results['bbox_pred'] + priors = filtered_results['priors'] + + bboxes = self.bbox_coder.decode( + self.anchor_center(priors), bbox_pred, max_shape=img_shape) + mlvl_bboxes.append(bboxes) + mlvl_scores.append(scores) + mlvl_labels.append(labels) + + return self._bbox_post_process( + mlvl_scores, + mlvl_labels, + mlvl_bboxes, + img_meta['scale_factor'], + cfg, + rescale=rescale, + with_nms=with_nms) + + def get_targets(self, + anchor_list, + valid_flag_list, + gt_bboxes_list, + img_metas, + gt_bboxes_ignore_list=None, + gt_labels_list=None, + label_channels=1, + unmap_outputs=True): + """Get targets for GFL head. + + This method is almost the same as `AnchorHead.get_targets()`. Besides + returning the targets as the parent method does, it also returns the + anchors as the first element of the returned tuple. + """ + num_imgs = len(img_metas) + assert len(anchor_list) == len(valid_flag_list) == num_imgs + + # anchor number of multi levels + num_level_anchors = [anchors.size(0) for anchors in anchor_list[0]] + num_level_anchors_list = [num_level_anchors] * num_imgs + + # concat all level anchors and flags to a single tensor + for i in range(num_imgs): + assert len(anchor_list[i]) == len(valid_flag_list[i]) + anchor_list[i] = torch.cat(anchor_list[i]) + valid_flag_list[i] = torch.cat(valid_flag_list[i]) + + # compute targets for each image + if gt_bboxes_ignore_list is None: + gt_bboxes_ignore_list = [None for _ in range(num_imgs)] + if gt_labels_list is None: + gt_labels_list = [None for _ in range(num_imgs)] + (all_anchors, all_labels, all_label_weights, all_bbox_targets, + all_bbox_weights, pos_inds_list, neg_inds_list) = multi_apply( + self._get_target_single, + anchor_list, + valid_flag_list, + num_level_anchors_list, + gt_bboxes_list, + gt_bboxes_ignore_list, + gt_labels_list, + img_metas, + label_channels=label_channels, + unmap_outputs=unmap_outputs) + # no valid anchors + if any([labels is None for labels in all_labels]): + return None + # sampled anchors of all images + num_total_pos = sum([max(inds.numel(), 1) for inds in pos_inds_list]) + num_total_neg = sum([max(inds.numel(), 1) for inds in neg_inds_list]) + # split targets to a list w.r.t. multiple levels + anchors_list = images_to_levels(all_anchors, num_level_anchors) + labels_list = images_to_levels(all_labels, num_level_anchors) + label_weights_list = images_to_levels(all_label_weights, + num_level_anchors) + bbox_targets_list = images_to_levels(all_bbox_targets, + num_level_anchors) + bbox_weights_list = images_to_levels(all_bbox_weights, + num_level_anchors) + return (anchors_list, labels_list, label_weights_list, + bbox_targets_list, bbox_weights_list, num_total_pos, + num_total_neg) + + def _get_target_single(self, + flat_anchors, + valid_flags, + num_level_anchors, + gt_bboxes, + gt_bboxes_ignore, + gt_labels, + img_meta, + label_channels=1, + unmap_outputs=True): + """Compute regression, classification targets for anchors in a single + image. + + Args: + flat_anchors (Tensor): Multi-level anchors of the image, which are + concatenated into a single tensor of shape (num_anchors, 4) + valid_flags (Tensor): Multi level valid flags of the image, + which are concatenated into a single tensor of + shape (num_anchors,). + num_level_anchors Tensor): Number of anchors of each scale level. + gt_bboxes (Tensor): Ground truth bboxes of the image, + shape (num_gts, 4). + gt_bboxes_ignore (Tensor): Ground truth bboxes to be + ignored, shape (num_ignored_gts, 4). + gt_labels (Tensor): Ground truth labels of each box, + shape (num_gts,). + img_meta (dict): Meta info of the image. + label_channels (int): Channel of label. + unmap_outputs (bool): Whether to map outputs back to the original + set of anchors. + + Returns: + tuple: N is the number of total anchors in the image. + anchors (Tensor): All anchors in the image with shape (N, 4). + labels (Tensor): Labels of all anchors in the image with shape + (N,). + label_weights (Tensor): Label weights of all anchor in the + image with shape (N,). + bbox_targets (Tensor): BBox targets of all anchors in the + image with shape (N, 4). + bbox_weights (Tensor): BBox weights of all anchors in the + image with shape (N, 4). + pos_inds (Tensor): Indices of positive anchor with shape + (num_pos,). + neg_inds (Tensor): Indices of negative anchor with shape + (num_neg,). + """ + inside_flags = anchor_inside_flags(flat_anchors, valid_flags, + img_meta['img_shape'][:2], + self.train_cfg.allowed_border) + if not inside_flags.any(): + return (None, ) * 7 + # assign gt and sample anchors + anchors = flat_anchors[inside_flags, :] + + num_level_anchors_inside = self.get_num_level_anchors_inside( + num_level_anchors, inside_flags) + assign_result = self.assigner.assign(anchors, num_level_anchors_inside, + gt_bboxes, gt_bboxes_ignore, + gt_labels) + + sampling_result = self.sampler.sample(assign_result, anchors, + gt_bboxes) + + num_valid_anchors = anchors.shape[0] + bbox_targets = torch.zeros_like(anchors) + bbox_weights = torch.zeros_like(anchors) + labels = anchors.new_full((num_valid_anchors, ), + self.num_classes, + dtype=torch.long) + label_weights = anchors.new_zeros(num_valid_anchors, dtype=torch.float) + + pos_inds = sampling_result.pos_inds + neg_inds = sampling_result.neg_inds + if len(pos_inds) > 0: + pos_bbox_targets = sampling_result.pos_gt_bboxes + bbox_targets[pos_inds, :] = pos_bbox_targets + bbox_weights[pos_inds, :] = 1.0 + if gt_labels is None: + # Only rpn gives gt_labels as None + # Foreground is the first class + labels[pos_inds] = 0 + else: + labels[pos_inds] = gt_labels[ + sampling_result.pos_assigned_gt_inds] + if self.train_cfg.pos_weight <= 0: + label_weights[pos_inds] = 1.0 + else: + label_weights[pos_inds] = self.train_cfg.pos_weight + if len(neg_inds) > 0: + label_weights[neg_inds] = 1.0 + + # map up to original set of anchors + if unmap_outputs: + num_total_anchors = flat_anchors.size(0) + anchors = unmap(anchors, num_total_anchors, inside_flags) + labels = unmap( + labels, num_total_anchors, inside_flags, fill=self.num_classes) + label_weights = unmap(label_weights, num_total_anchors, + inside_flags) + bbox_targets = unmap(bbox_targets, num_total_anchors, inside_flags) + bbox_weights = unmap(bbox_weights, num_total_anchors, inside_flags) + + return (anchors, labels, label_weights, bbox_targets, bbox_weights, + pos_inds, neg_inds) + + def get_num_level_anchors_inside(self, num_level_anchors, inside_flags): + split_inside_flags = torch.split(inside_flags, num_level_anchors) + num_level_anchors_inside = [ + int(flags.sum()) for flags in split_inside_flags + ] + return num_level_anchors_inside diff --git a/mmdet/models/dense_heads/guided_anchor_head.py b/mmdet/models/dense_heads/guided_anchor_head.py new file mode 100644 index 0000000..53e8cd8 --- /dev/null +++ b/mmdet/models/dense_heads/guided_anchor_head.py @@ -0,0 +1,868 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch +import torch.nn as nn +from mmcv.ops import DeformConv2d, MaskedConv2d +from mmcv.runner import BaseModule, force_fp32 + +from mmdet.core import (anchor_inside_flags, build_assigner, build_bbox_coder, + build_prior_generator, build_sampler, calc_region, + images_to_levels, multi_apply, multiclass_nms, unmap) +from ..builder import HEADS, build_loss +from .anchor_head import AnchorHead + + +class FeatureAdaption(BaseModule): + """Feature Adaption Module. + + Feature Adaption Module is implemented based on DCN v1. + It uses anchor shape prediction rather than feature map to + predict offsets of deform conv layer. + + Args: + in_channels (int): Number of channels in the input feature map. + out_channels (int): Number of channels in the output feature map. + kernel_size (int): Deformable conv kernel size. + deform_groups (int): Deformable conv group size. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + in_channels, + out_channels, + kernel_size=3, + deform_groups=4, + init_cfg=dict( + type='Normal', + layer='Conv2d', + std=0.1, + override=dict( + type='Normal', name='conv_adaption', std=0.01))): + super(FeatureAdaption, self).__init__(init_cfg) + offset_channels = kernel_size * kernel_size * 2 + self.conv_offset = nn.Conv2d( + 2, deform_groups * offset_channels, 1, bias=False) + self.conv_adaption = DeformConv2d( + in_channels, + out_channels, + kernel_size=kernel_size, + padding=(kernel_size - 1) // 2, + deform_groups=deform_groups) + self.relu = nn.ReLU(inplace=True) + + def forward(self, x, shape): + offset = self.conv_offset(shape.detach()) + x = self.relu(self.conv_adaption(x, offset)) + return x + + +@HEADS.register_module() +class GuidedAnchorHead(AnchorHead): + """Guided-Anchor-based head (GA-RPN, GA-RetinaNet, etc.). + + This GuidedAnchorHead will predict high-quality feature guided + anchors and locations where anchors will be kept in inference. + There are mainly 3 categories of bounding-boxes. + + - Sampled 9 pairs for target assignment. (approxes) + - The square boxes where the predicted anchors are based on. (squares) + - Guided anchors. + + Please refer to https://arxiv.org/abs/1901.03278 for more details. + + Args: + num_classes (int): Number of classes. + in_channels (int): Number of channels in the input feature map. + feat_channels (int): Number of hidden channels. + approx_anchor_generator (dict): Config dict for approx generator + square_anchor_generator (dict): Config dict for square generator + anchor_coder (dict): Config dict for anchor coder + bbox_coder (dict): Config dict for bbox coder + reg_decoded_bbox (bool): If true, the regression loss would be + applied directly on decoded bounding boxes, converting both + the predicted boxes and regression targets to absolute + coordinates format. Default False. It should be `True` when + using `IoULoss`, `GIoULoss`, or `DIoULoss` in the bbox head. + deform_groups: (int): Group number of DCN in + FeatureAdaption module. + loc_filter_thr (float): Threshold to filter out unconcerned regions. + loss_loc (dict): Config of location loss. + loss_shape (dict): Config of anchor shape loss. + loss_cls (dict): Config of classification loss. + loss_bbox (dict): Config of bbox regression loss. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__( + self, + num_classes, + in_channels, + feat_channels=256, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=8, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[4, 8, 16, 32, 64]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[8], + strides=[4, 8, 16, 32, 64]), + anchor_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0] + ), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0] + ), + reg_decoded_bbox=False, + deform_groups=4, + loc_filter_thr=0.01, + train_cfg=None, + test_cfg=None, + loss_loc=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_shape=dict(type='BoundedIoULoss', beta=0.2, loss_weight=1.0), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, + loss_weight=1.0), + init_cfg=dict(type='Normal', layer='Conv2d', std=0.01, + override=dict(type='Normal', + name='conv_loc', + std=0.01, + bias_prob=0.01))): # yapf: disable + super(AnchorHead, self).__init__(init_cfg) + self.in_channels = in_channels + self.num_classes = num_classes + self.feat_channels = feat_channels + self.deform_groups = deform_groups + self.loc_filter_thr = loc_filter_thr + + # build approx_anchor_generator and square_anchor_generator + assert (approx_anchor_generator['octave_base_scale'] == + square_anchor_generator['scales'][0]) + assert (approx_anchor_generator['strides'] == + square_anchor_generator['strides']) + self.approx_anchor_generator = build_prior_generator( + approx_anchor_generator) + self.square_anchor_generator = build_prior_generator( + square_anchor_generator) + self.approxs_per_octave = self.approx_anchor_generator \ + .num_base_priors[0] + + self.reg_decoded_bbox = reg_decoded_bbox + + # one anchor per location + self.num_base_priors = self.square_anchor_generator.num_base_priors[0] + + self.use_sigmoid_cls = loss_cls.get('use_sigmoid', False) + self.loc_focal_loss = loss_loc['type'] in ['FocalLoss'] + self.sampling = loss_cls['type'] not in ['FocalLoss'] + self.ga_sampling = train_cfg is not None and hasattr( + train_cfg, 'ga_sampler') + if self.use_sigmoid_cls: + self.cls_out_channels = self.num_classes + else: + self.cls_out_channels = self.num_classes + 1 + + # build bbox_coder + self.anchor_coder = build_bbox_coder(anchor_coder) + self.bbox_coder = build_bbox_coder(bbox_coder) + + # build losses + self.loss_loc = build_loss(loss_loc) + self.loss_shape = build_loss(loss_shape) + self.loss_cls = build_loss(loss_cls) + self.loss_bbox = build_loss(loss_bbox) + + self.train_cfg = train_cfg + self.test_cfg = test_cfg + + if self.train_cfg: + self.assigner = build_assigner(self.train_cfg.assigner) + # use PseudoSampler when sampling is False + if self.sampling and hasattr(self.train_cfg, 'sampler'): + sampler_cfg = self.train_cfg.sampler + else: + sampler_cfg = dict(type='PseudoSampler') + self.sampler = build_sampler(sampler_cfg, context=self) + + self.ga_assigner = build_assigner(self.train_cfg.ga_assigner) + if self.ga_sampling: + ga_sampler_cfg = self.train_cfg.ga_sampler + else: + ga_sampler_cfg = dict(type='PseudoSampler') + self.ga_sampler = build_sampler(ga_sampler_cfg, context=self) + + self.fp16_enabled = False + + self._init_layers() + + @property + def num_anchors(self): + warnings.warn('DeprecationWarning: `num_anchors` is deprecated, ' + 'please use "num_base_priors" instead') + return self.square_anchor_generator.num_base_priors[0] + + def _init_layers(self): + self.relu = nn.ReLU(inplace=True) + self.conv_loc = nn.Conv2d(self.in_channels, 1, 1) + self.conv_shape = nn.Conv2d(self.in_channels, self.num_base_priors * 2, + 1) + self.feature_adaption = FeatureAdaption( + self.in_channels, + self.feat_channels, + kernel_size=3, + deform_groups=self.deform_groups) + self.conv_cls = MaskedConv2d( + self.feat_channels, self.num_base_priors * self.cls_out_channels, + 1) + self.conv_reg = MaskedConv2d(self.feat_channels, + self.num_base_priors * 4, 1) + + def forward_single(self, x): + loc_pred = self.conv_loc(x) + shape_pred = self.conv_shape(x) + x = self.feature_adaption(x, shape_pred) + # masked conv is only used during inference for speed-up + if not self.training: + mask = loc_pred.sigmoid()[0] >= self.loc_filter_thr + else: + mask = None + cls_score = self.conv_cls(x, mask) + bbox_pred = self.conv_reg(x, mask) + return cls_score, bbox_pred, shape_pred, loc_pred + + def forward(self, feats): + return multi_apply(self.forward_single, feats) + + def get_sampled_approxs(self, featmap_sizes, img_metas, device='cuda'): + """Get sampled approxs and inside flags according to feature map sizes. + + Args: + featmap_sizes (list[tuple]): Multi-level feature map sizes. + img_metas (list[dict]): Image meta info. + device (torch.device | str): device for returned tensors + + Returns: + tuple: approxes of each image, inside flags of each image + """ + num_imgs = len(img_metas) + + # since feature map sizes of all images are the same, we only compute + # approxes for one time + multi_level_approxs = self.approx_anchor_generator.grid_priors( + featmap_sizes, device=device) + approxs_list = [multi_level_approxs for _ in range(num_imgs)] + + # for each image, we compute inside flags of multi level approxes + inside_flag_list = [] + for img_id, img_meta in enumerate(img_metas): + multi_level_flags = [] + multi_level_approxs = approxs_list[img_id] + + # obtain valid flags for each approx first + multi_level_approx_flags = self.approx_anchor_generator \ + .valid_flags(featmap_sizes, + img_meta['pad_shape'], + device=device) + + for i, flags in enumerate(multi_level_approx_flags): + approxs = multi_level_approxs[i] + inside_flags_list = [] + for i in range(self.approxs_per_octave): + split_valid_flags = flags[i::self.approxs_per_octave] + split_approxs = approxs[i::self.approxs_per_octave, :] + inside_flags = anchor_inside_flags( + split_approxs, split_valid_flags, + img_meta['img_shape'][:2], + self.train_cfg.allowed_border) + inside_flags_list.append(inside_flags) + # inside_flag for a position is true if any anchor in this + # position is true + inside_flags = ( + torch.stack(inside_flags_list, 0).sum(dim=0) > 0) + multi_level_flags.append(inside_flags) + inside_flag_list.append(multi_level_flags) + return approxs_list, inside_flag_list + + def get_anchors(self, + featmap_sizes, + shape_preds, + loc_preds, + img_metas, + use_loc_filter=False, + device='cuda'): + """Get squares according to feature map sizes and guided anchors. + + Args: + featmap_sizes (list[tuple]): Multi-level feature map sizes. + shape_preds (list[tensor]): Multi-level shape predictions. + loc_preds (list[tensor]): Multi-level location predictions. + img_metas (list[dict]): Image meta info. + use_loc_filter (bool): Use loc filter or not. + device (torch.device | str): device for returned tensors + + Returns: + tuple: square approxs of each image, guided anchors of each image, + loc masks of each image + """ + num_imgs = len(img_metas) + num_levels = len(featmap_sizes) + + # since feature map sizes of all images are the same, we only compute + # squares for one time + multi_level_squares = self.square_anchor_generator.grid_priors( + featmap_sizes, device=device) + squares_list = [multi_level_squares for _ in range(num_imgs)] + + # for each image, we compute multi level guided anchors + guided_anchors_list = [] + loc_mask_list = [] + for img_id, img_meta in enumerate(img_metas): + multi_level_guided_anchors = [] + multi_level_loc_mask = [] + for i in range(num_levels): + squares = squares_list[img_id][i] + shape_pred = shape_preds[i][img_id] + loc_pred = loc_preds[i][img_id] + guided_anchors, loc_mask = self._get_guided_anchors_single( + squares, + shape_pred, + loc_pred, + use_loc_filter=use_loc_filter) + multi_level_guided_anchors.append(guided_anchors) + multi_level_loc_mask.append(loc_mask) + guided_anchors_list.append(multi_level_guided_anchors) + loc_mask_list.append(multi_level_loc_mask) + return squares_list, guided_anchors_list, loc_mask_list + + def _get_guided_anchors_single(self, + squares, + shape_pred, + loc_pred, + use_loc_filter=False): + """Get guided anchors and loc masks for a single level. + + Args: + square (tensor): Squares of a single level. + shape_pred (tensor): Shape predictions of a single level. + loc_pred (tensor): Loc predictions of a single level. + use_loc_filter (list[tensor]): Use loc filter or not. + + Returns: + tuple: guided anchors, location masks + """ + # calculate location filtering mask + loc_pred = loc_pred.sigmoid().detach() + if use_loc_filter: + loc_mask = loc_pred >= self.loc_filter_thr + else: + loc_mask = loc_pred >= 0.0 + mask = loc_mask.permute(1, 2, 0).expand(-1, -1, self.num_base_priors) + mask = mask.contiguous().view(-1) + # calculate guided anchors + squares = squares[mask] + anchor_deltas = shape_pred.permute(1, 2, 0).contiguous().view( + -1, 2).detach()[mask] + bbox_deltas = anchor_deltas.new_full(squares.size(), 0) + bbox_deltas[:, 2:] = anchor_deltas + guided_anchors = self.anchor_coder.decode( + squares, bbox_deltas, wh_ratio_clip=1e-6) + return guided_anchors, mask + + def ga_loc_targets(self, gt_bboxes_list, featmap_sizes): + """Compute location targets for guided anchoring. + + Each feature map is divided into positive, negative and ignore regions. + - positive regions: target 1, weight 1 + - ignore regions: target 0, weight 0 + - negative regions: target 0, weight 0.1 + + Args: + gt_bboxes_list (list[Tensor]): Gt bboxes of each image. + featmap_sizes (list[tuple]): Multi level sizes of each feature + maps. + + Returns: + tuple + """ + anchor_scale = self.approx_anchor_generator.octave_base_scale + anchor_strides = self.approx_anchor_generator.strides + # Currently only supports same stride in x and y direction. + for stride in anchor_strides: + assert (stride[0] == stride[1]) + anchor_strides = [stride[0] for stride in anchor_strides] + + center_ratio = self.train_cfg.center_ratio + ignore_ratio = self.train_cfg.ignore_ratio + img_per_gpu = len(gt_bboxes_list) + num_lvls = len(featmap_sizes) + r1 = (1 - center_ratio) / 2 + r2 = (1 - ignore_ratio) / 2 + all_loc_targets = [] + all_loc_weights = [] + all_ignore_map = [] + for lvl_id in range(num_lvls): + h, w = featmap_sizes[lvl_id] + loc_targets = torch.zeros( + img_per_gpu, + 1, + h, + w, + device=gt_bboxes_list[0].device, + dtype=torch.float32) + loc_weights = torch.full_like(loc_targets, -1) + ignore_map = torch.zeros_like(loc_targets) + all_loc_targets.append(loc_targets) + all_loc_weights.append(loc_weights) + all_ignore_map.append(ignore_map) + for img_id in range(img_per_gpu): + gt_bboxes = gt_bboxes_list[img_id] + scale = torch.sqrt((gt_bboxes[:, 2] - gt_bboxes[:, 0]) * + (gt_bboxes[:, 3] - gt_bboxes[:, 1])) + min_anchor_size = scale.new_full( + (1, ), float(anchor_scale * anchor_strides[0])) + # assign gt bboxes to different feature levels w.r.t. their scales + target_lvls = torch.floor( + torch.log2(scale) - torch.log2(min_anchor_size) + 0.5) + target_lvls = target_lvls.clamp(min=0, max=num_lvls - 1).long() + for gt_id in range(gt_bboxes.size(0)): + lvl = target_lvls[gt_id].item() + # rescaled to corresponding feature map + gt_ = gt_bboxes[gt_id, :4] / anchor_strides[lvl] + # calculate ignore regions + ignore_x1, ignore_y1, ignore_x2, ignore_y2 = calc_region( + gt_, r2, featmap_sizes[lvl]) + # calculate positive (center) regions + ctr_x1, ctr_y1, ctr_x2, ctr_y2 = calc_region( + gt_, r1, featmap_sizes[lvl]) + all_loc_targets[lvl][img_id, 0, ctr_y1:ctr_y2 + 1, + ctr_x1:ctr_x2 + 1] = 1 + all_loc_weights[lvl][img_id, 0, ignore_y1:ignore_y2 + 1, + ignore_x1:ignore_x2 + 1] = 0 + all_loc_weights[lvl][img_id, 0, ctr_y1:ctr_y2 + 1, + ctr_x1:ctr_x2 + 1] = 1 + # calculate ignore map on nearby low level feature + if lvl > 0: + d_lvl = lvl - 1 + # rescaled to corresponding feature map + gt_ = gt_bboxes[gt_id, :4] / anchor_strides[d_lvl] + ignore_x1, ignore_y1, ignore_x2, ignore_y2 = calc_region( + gt_, r2, featmap_sizes[d_lvl]) + all_ignore_map[d_lvl][img_id, 0, ignore_y1:ignore_y2 + 1, + ignore_x1:ignore_x2 + 1] = 1 + # calculate ignore map on nearby high level feature + if lvl < num_lvls - 1: + u_lvl = lvl + 1 + # rescaled to corresponding feature map + gt_ = gt_bboxes[gt_id, :4] / anchor_strides[u_lvl] + ignore_x1, ignore_y1, ignore_x2, ignore_y2 = calc_region( + gt_, r2, featmap_sizes[u_lvl]) + all_ignore_map[u_lvl][img_id, 0, ignore_y1:ignore_y2 + 1, + ignore_x1:ignore_x2 + 1] = 1 + for lvl_id in range(num_lvls): + # ignore negative regions w.r.t. ignore map + all_loc_weights[lvl_id][(all_loc_weights[lvl_id] < 0) + & (all_ignore_map[lvl_id] > 0)] = 0 + # set negative regions with weight 0.1 + all_loc_weights[lvl_id][all_loc_weights[lvl_id] < 0] = 0.1 + # loc average factor to balance loss + loc_avg_factor = sum( + [t.size(0) * t.size(-1) * t.size(-2) + for t in all_loc_targets]) / 200 + return all_loc_targets, all_loc_weights, loc_avg_factor + + def _ga_shape_target_single(self, + flat_approxs, + inside_flags, + flat_squares, + gt_bboxes, + gt_bboxes_ignore, + img_meta, + unmap_outputs=True): + """Compute guided anchoring targets. + + This function returns sampled anchors and gt bboxes directly + rather than calculates regression targets. + + Args: + flat_approxs (Tensor): flat approxs of a single image, + shape (n, 4) + inside_flags (Tensor): inside flags of a single image, + shape (n, ). + flat_squares (Tensor): flat squares of a single image, + shape (approxs_per_octave * n, 4) + gt_bboxes (Tensor): Ground truth bboxes of a single image. + img_meta (dict): Meta info of a single image. + approxs_per_octave (int): number of approxs per octave + cfg (dict): RPN train configs. + unmap_outputs (bool): unmap outputs or not. + + Returns: + tuple + """ + if not inside_flags.any(): + return (None, ) * 5 + # assign gt and sample anchors + expand_inside_flags = inside_flags[:, None].expand( + -1, self.approxs_per_octave).reshape(-1) + approxs = flat_approxs[expand_inside_flags, :] + squares = flat_squares[inside_flags, :] + + assign_result = self.ga_assigner.assign(approxs, squares, + self.approxs_per_octave, + gt_bboxes, gt_bboxes_ignore) + sampling_result = self.ga_sampler.sample(assign_result, squares, + gt_bboxes) + + bbox_anchors = torch.zeros_like(squares) + bbox_gts = torch.zeros_like(squares) + bbox_weights = torch.zeros_like(squares) + + pos_inds = sampling_result.pos_inds + neg_inds = sampling_result.neg_inds + if len(pos_inds) > 0: + bbox_anchors[pos_inds, :] = sampling_result.pos_bboxes + bbox_gts[pos_inds, :] = sampling_result.pos_gt_bboxes + bbox_weights[pos_inds, :] = 1.0 + + # map up to original set of anchors + if unmap_outputs: + num_total_anchors = flat_squares.size(0) + bbox_anchors = unmap(bbox_anchors, num_total_anchors, inside_flags) + bbox_gts = unmap(bbox_gts, num_total_anchors, inside_flags) + bbox_weights = unmap(bbox_weights, num_total_anchors, inside_flags) + + return (bbox_anchors, bbox_gts, bbox_weights, pos_inds, neg_inds) + + def ga_shape_targets(self, + approx_list, + inside_flag_list, + square_list, + gt_bboxes_list, + img_metas, + gt_bboxes_ignore_list=None, + unmap_outputs=True): + """Compute guided anchoring targets. + + Args: + approx_list (list[list]): Multi level approxs of each image. + inside_flag_list (list[list]): Multi level inside flags of each + image. + square_list (list[list]): Multi level squares of each image. + gt_bboxes_list (list[Tensor]): Ground truth bboxes of each image. + img_metas (list[dict]): Meta info of each image. + gt_bboxes_ignore_list (list[Tensor]): ignore list of gt bboxes. + unmap_outputs (bool): unmap outputs or not. + + Returns: + tuple + """ + num_imgs = len(img_metas) + assert len(approx_list) == len(inside_flag_list) == len( + square_list) == num_imgs + # anchor number of multi levels + num_level_squares = [squares.size(0) for squares in square_list[0]] + # concat all level anchors and flags to a single tensor + inside_flag_flat_list = [] + approx_flat_list = [] + square_flat_list = [] + for i in range(num_imgs): + assert len(square_list[i]) == len(inside_flag_list[i]) + inside_flag_flat_list.append(torch.cat(inside_flag_list[i])) + approx_flat_list.append(torch.cat(approx_list[i])) + square_flat_list.append(torch.cat(square_list[i])) + + # compute targets for each image + if gt_bboxes_ignore_list is None: + gt_bboxes_ignore_list = [None for _ in range(num_imgs)] + (all_bbox_anchors, all_bbox_gts, all_bbox_weights, pos_inds_list, + neg_inds_list) = multi_apply( + self._ga_shape_target_single, + approx_flat_list, + inside_flag_flat_list, + square_flat_list, + gt_bboxes_list, + gt_bboxes_ignore_list, + img_metas, + unmap_outputs=unmap_outputs) + # no valid anchors + if any([bbox_anchors is None for bbox_anchors in all_bbox_anchors]): + return None + # sampled anchors of all images + num_total_pos = sum([max(inds.numel(), 1) for inds in pos_inds_list]) + num_total_neg = sum([max(inds.numel(), 1) for inds in neg_inds_list]) + # split targets to a list w.r.t. multiple levels + bbox_anchors_list = images_to_levels(all_bbox_anchors, + num_level_squares) + bbox_gts_list = images_to_levels(all_bbox_gts, num_level_squares) + bbox_weights_list = images_to_levels(all_bbox_weights, + num_level_squares) + return (bbox_anchors_list, bbox_gts_list, bbox_weights_list, + num_total_pos, num_total_neg) + + def loss_shape_single(self, shape_pred, bbox_anchors, bbox_gts, + anchor_weights, anchor_total_num): + shape_pred = shape_pred.permute(0, 2, 3, 1).contiguous().view(-1, 2) + bbox_anchors = bbox_anchors.contiguous().view(-1, 4) + bbox_gts = bbox_gts.contiguous().view(-1, 4) + anchor_weights = anchor_weights.contiguous().view(-1, 4) + bbox_deltas = bbox_anchors.new_full(bbox_anchors.size(), 0) + bbox_deltas[:, 2:] += shape_pred + # filter out negative samples to speed-up weighted_bounded_iou_loss + inds = torch.nonzero( + anchor_weights[:, 0] > 0, as_tuple=False).squeeze(1) + bbox_deltas_ = bbox_deltas[inds] + bbox_anchors_ = bbox_anchors[inds] + bbox_gts_ = bbox_gts[inds] + anchor_weights_ = anchor_weights[inds] + pred_anchors_ = self.anchor_coder.decode( + bbox_anchors_, bbox_deltas_, wh_ratio_clip=1e-6) + loss_shape = self.loss_shape( + pred_anchors_, + bbox_gts_, + anchor_weights_, + avg_factor=anchor_total_num) + return loss_shape + + def loss_loc_single(self, loc_pred, loc_target, loc_weight, + loc_avg_factor): + loss_loc = self.loss_loc( + loc_pred.reshape(-1, 1), + loc_target.reshape(-1).long(), + loc_weight.reshape(-1), + avg_factor=loc_avg_factor) + return loss_loc + + @force_fp32( + apply_to=('cls_scores', 'bbox_preds', 'shape_preds', 'loc_preds')) + def loss(self, + cls_scores, + bbox_preds, + shape_preds, + loc_preds, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + assert len(featmap_sizes) == self.approx_anchor_generator.num_levels + + device = cls_scores[0].device + + # get loc targets + loc_targets, loc_weights, loc_avg_factor = self.ga_loc_targets( + gt_bboxes, featmap_sizes) + + # get sampled approxes + approxs_list, inside_flag_list = self.get_sampled_approxs( + featmap_sizes, img_metas, device=device) + # get squares and guided anchors + squares_list, guided_anchors_list, _ = self.get_anchors( + featmap_sizes, shape_preds, loc_preds, img_metas, device=device) + + # get shape targets + shape_targets = self.ga_shape_targets(approxs_list, inside_flag_list, + squares_list, gt_bboxes, + img_metas) + if shape_targets is None: + return None + (bbox_anchors_list, bbox_gts_list, anchor_weights_list, anchor_fg_num, + anchor_bg_num) = shape_targets + anchor_total_num = ( + anchor_fg_num if not self.ga_sampling else anchor_fg_num + + anchor_bg_num) + + # get anchor targets + label_channels = self.cls_out_channels if self.use_sigmoid_cls else 1 + cls_reg_targets = self.get_targets( + guided_anchors_list, + inside_flag_list, + gt_bboxes, + img_metas, + gt_bboxes_ignore_list=gt_bboxes_ignore, + gt_labels_list=gt_labels, + label_channels=label_channels) + if cls_reg_targets is None: + return None + (labels_list, label_weights_list, bbox_targets_list, bbox_weights_list, + num_total_pos, num_total_neg) = cls_reg_targets + num_total_samples = ( + num_total_pos + num_total_neg if self.sampling else num_total_pos) + + # anchor number of multi levels + num_level_anchors = [ + anchors.size(0) for anchors in guided_anchors_list[0] + ] + # concat all level anchors to a single tensor + concat_anchor_list = [] + for i in range(len(guided_anchors_list)): + concat_anchor_list.append(torch.cat(guided_anchors_list[i])) + all_anchor_list = images_to_levels(concat_anchor_list, + num_level_anchors) + + # get classification and bbox regression losses + losses_cls, losses_bbox = multi_apply( + self.loss_single, + cls_scores, + bbox_preds, + all_anchor_list, + labels_list, + label_weights_list, + bbox_targets_list, + bbox_weights_list, + num_total_samples=num_total_samples) + + # get anchor location loss + losses_loc = [] + for i in range(len(loc_preds)): + loss_loc = self.loss_loc_single( + loc_preds[i], + loc_targets[i], + loc_weights[i], + loc_avg_factor=loc_avg_factor) + losses_loc.append(loss_loc) + + # get anchor shape loss + losses_shape = [] + for i in range(len(shape_preds)): + loss_shape = self.loss_shape_single( + shape_preds[i], + bbox_anchors_list[i], + bbox_gts_list[i], + anchor_weights_list[i], + anchor_total_num=anchor_total_num) + losses_shape.append(loss_shape) + + return dict( + loss_cls=losses_cls, + loss_bbox=losses_bbox, + loss_shape=losses_shape, + loss_loc=losses_loc) + + @force_fp32( + apply_to=('cls_scores', 'bbox_preds', 'shape_preds', 'loc_preds')) + def get_bboxes(self, + cls_scores, + bbox_preds, + shape_preds, + loc_preds, + img_metas, + cfg=None, + rescale=False): + assert len(cls_scores) == len(bbox_preds) == len(shape_preds) == len( + loc_preds) + num_levels = len(cls_scores) + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + device = cls_scores[0].device + # get guided anchors + _, guided_anchors, loc_masks = self.get_anchors( + featmap_sizes, + shape_preds, + loc_preds, + img_metas, + use_loc_filter=not self.training, + device=device) + result_list = [] + for img_id in range(len(img_metas)): + cls_score_list = [ + cls_scores[i][img_id].detach() for i in range(num_levels) + ] + bbox_pred_list = [ + bbox_preds[i][img_id].detach() for i in range(num_levels) + ] + guided_anchor_list = [ + guided_anchors[img_id][i].detach() for i in range(num_levels) + ] + loc_mask_list = [ + loc_masks[img_id][i].detach() for i in range(num_levels) + ] + img_shape = img_metas[img_id]['img_shape'] + scale_factor = img_metas[img_id]['scale_factor'] + proposals = self._get_bboxes_single(cls_score_list, bbox_pred_list, + guided_anchor_list, + loc_mask_list, img_shape, + scale_factor, cfg, rescale) + result_list.append(proposals) + return result_list + + def _get_bboxes_single(self, + cls_scores, + bbox_preds, + mlvl_anchors, + mlvl_masks, + img_shape, + scale_factor, + cfg, + rescale=False): + cfg = self.test_cfg if cfg is None else cfg + assert len(cls_scores) == len(bbox_preds) == len(mlvl_anchors) + mlvl_bboxes = [] + mlvl_scores = [] + for cls_score, bbox_pred, anchors, mask in zip(cls_scores, bbox_preds, + mlvl_anchors, + mlvl_masks): + assert cls_score.size()[-2:] == bbox_pred.size()[-2:] + # if no location is kept, end. + if mask.sum() == 0: + continue + # reshape scores and bbox_pred + cls_score = cls_score.permute(1, 2, + 0).reshape(-1, self.cls_out_channels) + if self.use_sigmoid_cls: + scores = cls_score.sigmoid() + else: + scores = cls_score.softmax(-1) + bbox_pred = bbox_pred.permute(1, 2, 0).reshape(-1, 4) + # filter scores, bbox_pred w.r.t. mask. + # anchors are filtered in get_anchors() beforehand. + scores = scores[mask, :] + bbox_pred = bbox_pred[mask, :] + if scores.dim() == 0: + anchors = anchors.unsqueeze(0) + scores = scores.unsqueeze(0) + bbox_pred = bbox_pred.unsqueeze(0) + # filter anchors, bbox_pred, scores w.r.t. scores + nms_pre = cfg.get('nms_pre', -1) + if nms_pre > 0 and scores.shape[0] > nms_pre: + if self.use_sigmoid_cls: + max_scores, _ = scores.max(dim=1) + else: + # remind that we set FG labels to [0, num_class-1] + # since mmdet v2.0 + # BG cat_id: num_class + max_scores, _ = scores[:, :-1].max(dim=1) + _, topk_inds = max_scores.topk(nms_pre) + anchors = anchors[topk_inds, :] + bbox_pred = bbox_pred[topk_inds, :] + scores = scores[topk_inds, :] + bboxes = self.bbox_coder.decode( + anchors, bbox_pred, max_shape=img_shape) + mlvl_bboxes.append(bboxes) + mlvl_scores.append(scores) + mlvl_bboxes = torch.cat(mlvl_bboxes) + if rescale: + mlvl_bboxes /= mlvl_bboxes.new_tensor(scale_factor) + mlvl_scores = torch.cat(mlvl_scores) + if self.use_sigmoid_cls: + # Add a dummy background class to the backend when using sigmoid + # remind that we set FG labels to [0, num_class-1] since mmdet v2.0 + # BG cat_id: num_class + padding = mlvl_scores.new_zeros(mlvl_scores.shape[0], 1) + mlvl_scores = torch.cat([mlvl_scores, padding], dim=1) + # multi class NMS + det_bboxes, det_labels = multiclass_nms(mlvl_bboxes, mlvl_scores, + cfg.score_thr, cfg.nms, + cfg.max_per_img) + return det_bboxes, det_labels diff --git a/mmdet/models/dense_heads/lad_head.py b/mmdet/models/dense_heads/lad_head.py new file mode 100644 index 0000000..85273bc --- /dev/null +++ b/mmdet/models/dense_heads/lad_head.py @@ -0,0 +1,232 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +from mmcv.runner import force_fp32 + +from mmdet.core import bbox_overlaps, multi_apply +from ..builder import HEADS +from .paa_head import PAAHead, levels_to_images + + +@HEADS.register_module() +class LADHead(PAAHead): + """Label Assignment Head from the paper: `Improving Object Detection by + Label Assignment Distillation `_""" + + @force_fp32(apply_to=('cls_scores', 'bbox_preds', 'iou_preds')) + def get_label_assignment(self, + cls_scores, + bbox_preds, + iou_preds, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Get label assignment (from teacher). + + Args: + cls_scores (list[Tensor]): Box scores for each scale level. + Has shape (N, num_anchors * num_classes, H, W) + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level with shape (N, num_anchors * 4, H, W) + iou_preds (list[Tensor]): iou_preds for each scale + level with shape (N, num_anchors * 1, H, W) + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (list[Tensor] | None): Specify which bounding + boxes can be ignored when are computing the loss. + + Returns: + tuple: Returns a tuple containing label assignment variables. + + - labels (Tensor): Labels of all anchors, each with + shape (num_anchors,). + - labels_weight (Tensor): Label weights of all anchor. + each with shape (num_anchors,). + - bboxes_target (Tensor): BBox targets of all anchors. + each with shape (num_anchors, 4). + - bboxes_weight (Tensor): BBox weights of all anchors. + each with shape (num_anchors, 4). + - pos_inds_flatten (Tensor): Contains all index of positive + sample in all anchor. + - pos_anchors (Tensor): Positive anchors. + - num_pos (int): Number of positive anchors. + """ + + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + assert len(featmap_sizes) == self.prior_generator.num_levels + + device = cls_scores[0].device + anchor_list, valid_flag_list = self.get_anchors( + featmap_sizes, img_metas, device=device) + label_channels = self.cls_out_channels if self.use_sigmoid_cls else 1 + cls_reg_targets = self.get_targets( + anchor_list, + valid_flag_list, + gt_bboxes, + img_metas, + gt_bboxes_ignore_list=gt_bboxes_ignore, + gt_labels_list=gt_labels, + label_channels=label_channels, + ) + (labels, labels_weight, bboxes_target, bboxes_weight, pos_inds, + pos_gt_index) = cls_reg_targets + cls_scores = levels_to_images(cls_scores) + cls_scores = [ + item.reshape(-1, self.cls_out_channels) for item in cls_scores + ] + bbox_preds = levels_to_images(bbox_preds) + bbox_preds = [item.reshape(-1, 4) for item in bbox_preds] + pos_losses_list, = multi_apply(self.get_pos_loss, anchor_list, + cls_scores, bbox_preds, labels, + labels_weight, bboxes_target, + bboxes_weight, pos_inds) + + with torch.no_grad(): + reassign_labels, reassign_label_weight, \ + reassign_bbox_weights, num_pos = multi_apply( + self.paa_reassign, + pos_losses_list, + labels, + labels_weight, + bboxes_weight, + pos_inds, + pos_gt_index, + anchor_list) + num_pos = sum(num_pos) + # convert all tensor list to a flatten tensor + labels = torch.cat(reassign_labels, 0).view(-1) + flatten_anchors = torch.cat( + [torch.cat(item, 0) for item in anchor_list]) + labels_weight = torch.cat(reassign_label_weight, 0).view(-1) + bboxes_target = torch.cat(bboxes_target, + 0).view(-1, bboxes_target[0].size(-1)) + + pos_inds_flatten = ((labels >= 0) + & + (labels < self.num_classes)).nonzero().reshape(-1) + + if num_pos: + pos_anchors = flatten_anchors[pos_inds_flatten] + else: + pos_anchors = None + + label_assignment_results = (labels, labels_weight, bboxes_target, + bboxes_weight, pos_inds_flatten, + pos_anchors, num_pos) + return label_assignment_results + + def forward_train(self, + x, + label_assignment_results, + img_metas, + gt_bboxes, + gt_labels=None, + gt_bboxes_ignore=None, + **kwargs): + """Forward train with the available label assignment (student receives + from teacher). + + Args: + x (list[Tensor]): Features from FPN. + label_assignment_results (tuple): As the outputs defined in the + function `self.get_label_assignment`. + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes (Tensor): Ground truth bboxes of the image, + shape (num_gts, 4). + gt_labels (Tensor): Ground truth labels of each box, + shape (num_gts,). + gt_bboxes_ignore (Tensor): Ground truth bboxes to be + ignored, shape (num_ignored_gts, 4). + + Returns: + losses: (dict[str, Tensor]): A dictionary of loss components. + """ + outs = self(x) + if gt_labels is None: + loss_inputs = outs + (gt_bboxes, img_metas) + else: + loss_inputs = outs + (gt_bboxes, gt_labels, img_metas) + losses = self.loss( + *loss_inputs, + gt_bboxes_ignore=gt_bboxes_ignore, + label_assignment_results=label_assignment_results) + return losses + + @force_fp32(apply_to=('cls_scores', 'bbox_preds', 'iou_preds')) + def loss(self, + cls_scores, + bbox_preds, + iou_preds, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None, + label_assignment_results=None): + """Compute losses of the head. + + Args: + cls_scores (list[Tensor]): Box scores for each scale level + Has shape (N, num_anchors * num_classes, H, W) + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level with shape (N, num_anchors * 4, H, W) + iou_preds (list[Tensor]): iou_preds for each scale + level with shape (N, num_anchors * 1, H, W) + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (list[Tensor] | None): Specify which bounding + boxes can be ignored when are computing the loss. + label_assignment_results (tuple): As the outputs defined in the + function `self.get_label_assignment`. + + Returns: + dict[str, Tensor]: A dictionary of loss gmm_assignment. + """ + + (labels, labels_weight, bboxes_target, bboxes_weight, pos_inds_flatten, + pos_anchors, num_pos) = label_assignment_results + + cls_scores = levels_to_images(cls_scores) + cls_scores = [ + item.reshape(-1, self.cls_out_channels) for item in cls_scores + ] + bbox_preds = levels_to_images(bbox_preds) + bbox_preds = [item.reshape(-1, 4) for item in bbox_preds] + iou_preds = levels_to_images(iou_preds) + iou_preds = [item.reshape(-1, 1) for item in iou_preds] + + # convert all tensor list to a flatten tensor + cls_scores = torch.cat(cls_scores, 0).view(-1, cls_scores[0].size(-1)) + bbox_preds = torch.cat(bbox_preds, 0).view(-1, bbox_preds[0].size(-1)) + iou_preds = torch.cat(iou_preds, 0).view(-1, iou_preds[0].size(-1)) + + losses_cls = self.loss_cls( + cls_scores, + labels, + labels_weight, + avg_factor=max(num_pos, len(img_metas))) # avoid num_pos=0 + if num_pos: + pos_bbox_pred = self.bbox_coder.decode( + pos_anchors, bbox_preds[pos_inds_flatten]) + pos_bbox_target = bboxes_target[pos_inds_flatten] + iou_target = bbox_overlaps( + pos_bbox_pred.detach(), pos_bbox_target, is_aligned=True) + losses_iou = self.loss_centerness( + iou_preds[pos_inds_flatten], + iou_target.unsqueeze(-1), + avg_factor=num_pos) + losses_bbox = self.loss_bbox( + pos_bbox_pred, pos_bbox_target, avg_factor=num_pos) + + else: + losses_iou = iou_preds.sum() * 0 + losses_bbox = bbox_preds.sum() * 0 + + return dict( + loss_cls=losses_cls, loss_bbox=losses_bbox, loss_iou=losses_iou) diff --git a/mmdet/models/dense_heads/ld_head.py b/mmdet/models/dense_heads/ld_head.py new file mode 100644 index 0000000..c5a945f --- /dev/null +++ b/mmdet/models/dense_heads/ld_head.py @@ -0,0 +1,261 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +from mmcv.runner import force_fp32 + +from mmdet.core import bbox_overlaps, multi_apply, reduce_mean +from ..builder import HEADS, build_loss +from .gfl_head import GFLHead + + +@HEADS.register_module() +class LDHead(GFLHead): + """Localization distillation Head. (Short description) + + It utilizes the learned bbox distributions to transfer the localization + dark knowledge from teacher to student. Original paper: `Localization + Distillation for Object Detection. `_ + + Args: + num_classes (int): Number of categories excluding the background + category. + in_channels (int): Number of channels in the input feature map. + loss_ld (dict): Config of Localization Distillation Loss (LD), + T is the temperature for distillation. + """ + + def __init__(self, + num_classes, + in_channels, + loss_ld=dict( + type='LocalizationDistillationLoss', + loss_weight=0.25, + T=10), + **kwargs): + + super(LDHead, self).__init__(num_classes, in_channels, **kwargs) + self.loss_ld = build_loss(loss_ld) + + def loss_single(self, anchors, cls_score, bbox_pred, labels, label_weights, + bbox_targets, stride, soft_targets, num_total_samples): + """Compute loss of a single scale level. + + Args: + anchors (Tensor): Box reference for each scale level with shape + (N, num_total_anchors, 4). + cls_score (Tensor): Cls and quality joint scores for each scale + level has shape (N, num_classes, H, W). + bbox_pred (Tensor): Box distribution logits for each scale + level with shape (N, 4*(n+1), H, W), n is max value of integral + set. + labels (Tensor): Labels of each anchors with shape + (N, num_total_anchors). + label_weights (Tensor): Label weights of each anchor with shape + (N, num_total_anchors) + bbox_targets (Tensor): BBox regression targets of each anchor + weight shape (N, num_total_anchors, 4). + stride (tuple): Stride in this scale level. + num_total_samples (int): Number of positive samples that is + reduced over all GPUs. + + Returns: + dict[tuple, Tensor]: Loss components and weight targets. + """ + assert stride[0] == stride[1], 'h stride is not equal to w stride!' + anchors = anchors.reshape(-1, 4) + cls_score = cls_score.permute(0, 2, 3, + 1).reshape(-1, self.cls_out_channels) + bbox_pred = bbox_pred.permute(0, 2, 3, + 1).reshape(-1, 4 * (self.reg_max + 1)) + soft_targets = soft_targets.permute(0, 2, 3, + 1).reshape(-1, + 4 * (self.reg_max + 1)) + + bbox_targets = bbox_targets.reshape(-1, 4) + labels = labels.reshape(-1) + label_weights = label_weights.reshape(-1) + + # FG cat_id: [0, num_classes -1], BG cat_id: num_classes + bg_class_ind = self.num_classes + pos_inds = ((labels >= 0) + & (labels < bg_class_ind)).nonzero().squeeze(1) + score = label_weights.new_zeros(labels.shape) + + if len(pos_inds) > 0: + pos_bbox_targets = bbox_targets[pos_inds] + pos_bbox_pred = bbox_pred[pos_inds] + pos_anchors = anchors[pos_inds] + pos_anchor_centers = self.anchor_center(pos_anchors) / stride[0] + + weight_targets = cls_score.detach().sigmoid() + weight_targets = weight_targets.max(dim=1)[0][pos_inds] + pos_bbox_pred_corners = self.integral(pos_bbox_pred) + pos_decode_bbox_pred = self.bbox_coder.decode( + pos_anchor_centers, pos_bbox_pred_corners) + pos_decode_bbox_targets = pos_bbox_targets / stride[0] + score[pos_inds] = bbox_overlaps( + pos_decode_bbox_pred.detach(), + pos_decode_bbox_targets, + is_aligned=True) + pred_corners = pos_bbox_pred.reshape(-1, self.reg_max + 1) + pos_soft_targets = soft_targets[pos_inds] + soft_corners = pos_soft_targets.reshape(-1, self.reg_max + 1) + + target_corners = self.bbox_coder.encode(pos_anchor_centers, + pos_decode_bbox_targets, + self.reg_max).reshape(-1) + + # regression loss + loss_bbox = self.loss_bbox( + pos_decode_bbox_pred, + pos_decode_bbox_targets, + weight=weight_targets, + avg_factor=1.0) + + # dfl loss + loss_dfl = self.loss_dfl( + pred_corners, + target_corners, + weight=weight_targets[:, None].expand(-1, 4).reshape(-1), + avg_factor=4.0) + + # ld loss + loss_ld = self.loss_ld( + pred_corners, + soft_corners, + weight=weight_targets[:, None].expand(-1, 4).reshape(-1), + avg_factor=4.0) + + else: + loss_ld = bbox_pred.sum() * 0 + loss_bbox = bbox_pred.sum() * 0 + loss_dfl = bbox_pred.sum() * 0 + weight_targets = bbox_pred.new_tensor(0) + + # cls (qfl) loss + loss_cls = self.loss_cls( + cls_score, (labels, score), + weight=label_weights, + avg_factor=num_total_samples) + + return loss_cls, loss_bbox, loss_dfl, loss_ld, weight_targets.sum() + + def forward_train(self, + x, + out_teacher, + img_metas, + gt_bboxes, + gt_labels=None, + gt_bboxes_ignore=None, + proposal_cfg=None, + **kwargs): + """ + Args: + x (list[Tensor]): Features from FPN. + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes (Tensor): Ground truth bboxes of the image, + shape (num_gts, 4). + gt_labels (Tensor): Ground truth labels of each box, + shape (num_gts,). + gt_bboxes_ignore (Tensor): Ground truth bboxes to be + ignored, shape (num_ignored_gts, 4). + proposal_cfg (mmcv.Config): Test / postprocessing configuration, + if None, test_cfg would be used + + Returns: + tuple[dict, list]: The loss components and proposals of each image. + + - losses (dict[str, Tensor]): A dictionary of loss components. + - proposal_list (list[Tensor]): Proposals of each image. + """ + outs = self(x) + soft_target = out_teacher[1] + if gt_labels is None: + loss_inputs = outs + (gt_bboxes, soft_target, img_metas) + else: + loss_inputs = outs + (gt_bboxes, gt_labels, soft_target, img_metas) + losses = self.loss(*loss_inputs, gt_bboxes_ignore=gt_bboxes_ignore) + if proposal_cfg is None: + return losses + else: + proposal_list = self.get_bboxes(*outs, img_metas, cfg=proposal_cfg) + return losses, proposal_list + + @force_fp32(apply_to=('cls_scores', 'bbox_preds')) + def loss(self, + cls_scores, + bbox_preds, + gt_bboxes, + gt_labels, + soft_target, + img_metas, + gt_bboxes_ignore=None): + """Compute losses of the head. + + Args: + cls_scores (list[Tensor]): Cls and quality scores for each scale + level has shape (N, num_classes, H, W). + bbox_preds (list[Tensor]): Box distribution logits for each scale + level with shape (N, 4*(n+1), H, W), n is max value of integral + set. + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (list[Tensor] | None): specify which bounding + boxes can be ignored when computing the loss. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + assert len(featmap_sizes) == self.prior_generator.num_levels + + device = cls_scores[0].device + anchor_list, valid_flag_list = self.get_anchors( + featmap_sizes, img_metas, device=device) + label_channels = self.cls_out_channels if self.use_sigmoid_cls else 1 + + cls_reg_targets = self.get_targets( + anchor_list, + valid_flag_list, + gt_bboxes, + img_metas, + gt_bboxes_ignore_list=gt_bboxes_ignore, + gt_labels_list=gt_labels, + label_channels=label_channels) + if cls_reg_targets is None: + return None + + (anchor_list, labels_list, label_weights_list, bbox_targets_list, + bbox_weights_list, num_total_pos, num_total_neg) = cls_reg_targets + + num_total_samples = reduce_mean( + torch.tensor(num_total_pos, dtype=torch.float, + device=device)).item() + num_total_samples = max(num_total_samples, 1.0) + + losses_cls, losses_bbox, losses_dfl, losses_ld, \ + avg_factor = multi_apply( + self.loss_single, + anchor_list, + cls_scores, + bbox_preds, + labels_list, + label_weights_list, + bbox_targets_list, + self.prior_generator.strides, + soft_target, + num_total_samples=num_total_samples) + + avg_factor = sum(avg_factor) + 1e-6 + avg_factor = reduce_mean(avg_factor).item() + losses_bbox = [x / avg_factor for x in losses_bbox] + losses_dfl = [x / avg_factor for x in losses_dfl] + return dict( + loss_cls=losses_cls, + loss_bbox=losses_bbox, + loss_dfl=losses_dfl, + loss_ld=losses_ld) diff --git a/mmdet/models/dense_heads/mask2former_head.py b/mmdet/models/dense_heads/mask2former_head.py new file mode 100644 index 0000000..59047bd --- /dev/null +++ b/mmdet/models/dense_heads/mask2former_head.py @@ -0,0 +1,430 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import Conv2d, build_plugin_layer, caffe2_xavier_init +from mmcv.cnn.bricks.transformer import (build_positional_encoding, + build_transformer_layer_sequence) +from mmcv.ops import point_sample +from mmcv.runner import ModuleList + +from mmdet.core import build_assigner, build_sampler, reduce_mean +from mmdet.models.utils import get_uncertain_point_coords_with_randomness +from ..builder import HEADS, build_loss +from .anchor_free_head import AnchorFreeHead +from .maskformer_head import MaskFormerHead + + +@HEADS.register_module() +class Mask2FormerHead(MaskFormerHead): + """Implements the Mask2Former head. + + See `Masked-attention Mask Transformer for Universal Image + Segmentation `_ for details. + + Args: + in_channels (list[int]): Number of channels in the input feature map. + feat_channels (int): Number of channels for features. + out_channels (int): Number of channels for output. + num_things_classes (int): Number of things. + num_stuff_classes (int): Number of stuff. + num_queries (int): Number of query in Transformer decoder. + pixel_decoder (:obj:`mmcv.ConfigDict` | dict): Config for pixel + decoder. Defaults to None. + enforce_decoder_input_project (bool, optional): Whether to add + a layer to change the embed_dim of tranformer encoder in + pixel decoder to the embed_dim of transformer decoder. + Defaults to False. + transformer_decoder (:obj:`mmcv.ConfigDict` | dict): Config for + transformer decoder. Defaults to None. + positional_encoding (:obj:`mmcv.ConfigDict` | dict): Config for + transformer decoder position encoding. Defaults to None. + loss_cls (:obj:`mmcv.ConfigDict` | dict): Config of the classification + loss. Defaults to None. + loss_mask (:obj:`mmcv.ConfigDict` | dict): Config of the mask loss. + Defaults to None. + loss_dice (:obj:`mmcv.ConfigDict` | dict): Config of the dice loss. + Defaults to None. + train_cfg (:obj:`mmcv.ConfigDict` | dict): Training config of + Mask2Former head. + test_cfg (:obj:`mmcv.ConfigDict` | dict): Testing config of + Mask2Former head. + init_cfg (dict or list[dict], optional): Initialization config dict. + Defaults to None. + """ + + def __init__(self, + in_channels, + feat_channels, + out_channels, + num_things_classes=80, + num_stuff_classes=53, + num_queries=100, + num_transformer_feat_level=3, + pixel_decoder=None, + enforce_decoder_input_project=False, + transformer_decoder=None, + positional_encoding=None, + loss_cls=None, + loss_mask=None, + loss_dice=None, + train_cfg=None, + test_cfg=None, + init_cfg=None, + **kwargs): + super(AnchorFreeHead, self).__init__(init_cfg) + self.num_things_classes = num_things_classes + self.num_stuff_classes = num_stuff_classes + self.num_classes = self.num_things_classes + self.num_stuff_classes + self.num_queries = num_queries + self.num_transformer_feat_level = num_transformer_feat_level + self.num_heads = transformer_decoder.transformerlayers.\ + attn_cfgs.num_heads + self.num_transformer_decoder_layers = transformer_decoder.num_layers + assert pixel_decoder.encoder.transformerlayers.\ + attn_cfgs.num_levels == num_transformer_feat_level + pixel_decoder_ = copy.deepcopy(pixel_decoder) + pixel_decoder_.update( + in_channels=in_channels, + feat_channels=feat_channels, + out_channels=out_channels) + self.pixel_decoder = build_plugin_layer(pixel_decoder_)[1] + self.transformer_decoder = build_transformer_layer_sequence( + transformer_decoder) + self.decoder_embed_dims = self.transformer_decoder.embed_dims + + self.decoder_input_projs = ModuleList() + # from low resolution to high resolution + for _ in range(num_transformer_feat_level): + if (self.decoder_embed_dims != feat_channels + or enforce_decoder_input_project): + self.decoder_input_projs.append( + Conv2d( + feat_channels, self.decoder_embed_dims, kernel_size=1)) + else: + self.decoder_input_projs.append(nn.Identity()) + self.decoder_positional_encoding = build_positional_encoding( + positional_encoding) + self.query_embed = nn.Embedding(self.num_queries, feat_channels) + self.query_feat = nn.Embedding(self.num_queries, feat_channels) + # from low resolution to high resolution + self.level_embed = nn.Embedding(self.num_transformer_feat_level, + feat_channels) + + self.cls_embed = nn.Linear(feat_channels, self.num_classes + 1) + self.mask_embed = nn.Sequential( + nn.Linear(feat_channels, feat_channels), nn.ReLU(inplace=True), + nn.Linear(feat_channels, feat_channels), nn.ReLU(inplace=True), + nn.Linear(feat_channels, out_channels)) + + self.test_cfg = test_cfg + self.train_cfg = train_cfg + if train_cfg: + self.assigner = build_assigner(self.train_cfg.assigner) + self.sampler = build_sampler(self.train_cfg.sampler, context=self) + self.num_points = self.train_cfg.get('num_points', 12544) + self.oversample_ratio = self.train_cfg.get('oversample_ratio', 3.0) + self.importance_sample_ratio = self.train_cfg.get( + 'importance_sample_ratio', 0.75) + + self.class_weight = loss_cls.class_weight + self.loss_cls = build_loss(loss_cls) + self.loss_mask = build_loss(loss_mask) + self.loss_dice = build_loss(loss_dice) + + def init_weights(self): + for m in self.decoder_input_projs: + if isinstance(m, Conv2d): + caffe2_xavier_init(m, bias=0) + + self.pixel_decoder.init_weights() + + for p in self.transformer_decoder.parameters(): + if p.dim() > 1: + nn.init.xavier_normal_(p) + + def _get_target_single(self, cls_score, mask_pred, gt_labels, gt_masks, + img_metas): + """Compute classification and mask targets for one image. + + Args: + cls_score (Tensor): Mask score logits from a single decoder layer + for one image. Shape (num_queries, cls_out_channels). + mask_pred (Tensor): Mask logits for a single decoder layer for one + image. Shape (num_queries, h, w). + gt_labels (Tensor): Ground truth class indices for one image with + shape (num_gts, ). + gt_masks (Tensor): Ground truth mask for each image, each with + shape (num_gts, h, w). + img_metas (dict): Image informtation. + + Returns: + tuple[Tensor]: A tuple containing the following for one image. + + - labels (Tensor): Labels of each image. \ + shape (num_queries, ). + - label_weights (Tensor): Label weights of each image. \ + shape (num_queries, ). + - mask_targets (Tensor): Mask targets of each image. \ + shape (num_queries, h, w). + - mask_weights (Tensor): Mask weights of each image. \ + shape (num_queries, ). + - pos_inds (Tensor): Sampled positive indices for each \ + image. + - neg_inds (Tensor): Sampled negative indices for each \ + image. + """ + # sample points + num_queries = cls_score.shape[0] + num_gts = gt_labels.shape[0] + + point_coords = torch.rand((1, self.num_points, 2), + device=cls_score.device) + # shape (num_queries, num_points) + mask_points_pred = point_sample( + mask_pred.unsqueeze(1), point_coords.repeat(num_queries, 1, + 1)).squeeze(1) + # shape (num_gts, num_points) + gt_points_masks = point_sample( + gt_masks.unsqueeze(1).float(), point_coords.repeat(num_gts, 1, + 1)).squeeze(1) + + # assign and sample + assign_result = self.assigner.assign(cls_score, mask_points_pred, + gt_labels, gt_points_masks, + img_metas) + sampling_result = self.sampler.sample(assign_result, mask_pred, + gt_masks) + pos_inds = sampling_result.pos_inds + neg_inds = sampling_result.neg_inds + + # label target + labels = gt_labels.new_full((self.num_queries, ), + self.num_classes, + dtype=torch.long) + labels[pos_inds] = gt_labels[sampling_result.pos_assigned_gt_inds] + label_weights = gt_labels.new_ones((self.num_queries, )) + + # mask target + mask_targets = gt_masks[sampling_result.pos_assigned_gt_inds] + mask_weights = mask_pred.new_zeros((self.num_queries, )) + mask_weights[pos_inds] = 1.0 + + return (labels, label_weights, mask_targets, mask_weights, pos_inds, + neg_inds) + + def loss_single(self, cls_scores, mask_preds, gt_labels_list, + gt_masks_list, img_metas): + """Loss function for outputs from a single decoder layer. + + Args: + cls_scores (Tensor): Mask score logits from a single decoder layer + for all images. Shape (batch_size, num_queries, + cls_out_channels). Note `cls_out_channels` should includes + background. + mask_preds (Tensor): Mask logits for a pixel decoder for all + images. Shape (batch_size, num_queries, h, w). + gt_labels_list (list[Tensor]): Ground truth class indices for each + image, each with shape (num_gts, ). + gt_masks_list (list[Tensor]): Ground truth mask for each image, + each with shape (num_gts, h, w). + img_metas (list[dict]): List of image meta information. + + Returns: + tuple[Tensor]: Loss components for outputs from a single \ + decoder layer. + """ + num_imgs = cls_scores.size(0) + cls_scores_list = [cls_scores[i] for i in range(num_imgs)] + mask_preds_list = [mask_preds[i] for i in range(num_imgs)] + (labels_list, label_weights_list, mask_targets_list, mask_weights_list, + num_total_pos, + num_total_neg) = self.get_targets(cls_scores_list, mask_preds_list, + gt_labels_list, gt_masks_list, + img_metas) + # shape (batch_size, num_queries) + labels = torch.stack(labels_list, dim=0) + # shape (batch_size, num_queries) + label_weights = torch.stack(label_weights_list, dim=0) + # shape (num_total_gts, h, w) + mask_targets = torch.cat(mask_targets_list, dim=0) + # shape (batch_size, num_queries) + mask_weights = torch.stack(mask_weights_list, dim=0) + + # classfication loss + # shape (batch_size * num_queries, ) + cls_scores = cls_scores.flatten(0, 1) + labels = labels.flatten(0, 1) + label_weights = label_weights.flatten(0, 1) + + class_weight = cls_scores.new_tensor(self.class_weight) + loss_cls = self.loss_cls( + cls_scores, + labels, + label_weights, + avg_factor=class_weight[labels].sum()) + + num_total_masks = reduce_mean(cls_scores.new_tensor([num_total_pos])) + num_total_masks = max(num_total_masks, 1) + + # extract positive ones + # shape (batch_size, num_queries, h, w) -> (num_total_gts, h, w) + mask_preds = mask_preds[mask_weights > 0] + + if mask_targets.shape[0] == 0: + # zero match + loss_dice = mask_preds.sum() + loss_mask = mask_preds.sum() + return loss_cls, loss_mask, loss_dice + + with torch.no_grad(): + points_coords = get_uncertain_point_coords_with_randomness( + mask_preds.unsqueeze(1), None, self.num_points, + self.oversample_ratio, self.importance_sample_ratio) + # shape (num_total_gts, h, w) -> (num_total_gts, num_points) + mask_point_targets = point_sample( + mask_targets.unsqueeze(1).float(), points_coords).squeeze(1) + # shape (num_queries, h, w) -> (num_queries, num_points) + mask_point_preds = point_sample( + mask_preds.unsqueeze(1), points_coords).squeeze(1) + + # dice loss + loss_dice = self.loss_dice( + mask_point_preds, mask_point_targets, avg_factor=num_total_masks) + + # mask loss + # shape (num_queries, num_points) -> (num_queries * num_points, ) + mask_point_preds = mask_point_preds.reshape(-1) + # shape (num_total_gts, num_points) -> (num_total_gts * num_points, ) + mask_point_targets = mask_point_targets.reshape(-1) + loss_mask = self.loss_mask( + mask_point_preds, + mask_point_targets, + avg_factor=num_total_masks * self.num_points) + + return loss_cls, loss_mask, loss_dice + + def forward_head(self, decoder_out, mask_feature, attn_mask_target_size): + """Forward for head part which is called after every decoder layer. + + Args: + decoder_out (Tensor): in shape (num_queries, batch_size, c). + mask_feature (Tensor): in shape (batch_size, c, h, w). + attn_mask_target_size (tuple[int, int]): target attention + mask size. + + Returns: + tuple: A tuple contain three elements. + + - cls_pred (Tensor): Classification scores in shape \ + (batch_size, num_queries, cls_out_channels). \ + Note `cls_out_channels` should includes background. + - mask_pred (Tensor): Mask scores in shape \ + (batch_size, num_queries,h, w). + - attn_mask (Tensor): Attention mask in shape \ + (batch_size * num_heads, num_queries, h, w). + """ + decoder_out = self.transformer_decoder.post_norm(decoder_out) + decoder_out = decoder_out.transpose(0, 1) + # shape (batch_size, num_queries, c) + cls_pred = self.cls_embed(decoder_out) + # shape (batch_size, num_queries, c) + mask_embed = self.mask_embed(decoder_out) + # shape (batch_size, num_queries, h, w) + mask_pred = torch.einsum('bqc,bchw->bqhw', mask_embed, mask_feature) + attn_mask = F.interpolate( + mask_pred, + attn_mask_target_size, + mode='bilinear', + align_corners=False) + # shape (batch_size, num_queries, h, w) -> + # (batch_size * num_head, num_queries, h*w) + attn_mask = attn_mask.flatten(2).unsqueeze(1).repeat( + (1, self.num_heads, 1, 1)).flatten(0, 1) + attn_mask = attn_mask.sigmoid() < 0.5 + attn_mask = attn_mask.detach() + + return cls_pred, mask_pred, attn_mask + + def forward(self, feats, img_metas): + """Forward function. + + Args: + feats (list[Tensor]): Multi scale Features from the + upstream network, each is a 4D-tensor. + img_metas (list[dict]): List of image information. + + Returns: + tuple: A tuple contains two elements. + + - cls_pred_list (list[Tensor)]: Classification logits \ + for each decoder layer. Each is a 3D-tensor with shape \ + (batch_size, num_queries, cls_out_channels). \ + Note `cls_out_channels` should includes background. + - mask_pred_list (list[Tensor]): Mask logits for each \ + decoder layer. Each with shape (batch_size, num_queries, \ + h, w). + """ + batch_size = len(img_metas) + mask_features, multi_scale_memorys = self.pixel_decoder(feats) + # multi_scale_memorys (from low resolution to high resolution) + decoder_inputs = [] + decoder_positional_encodings = [] + for i in range(self.num_transformer_feat_level): + decoder_input = self.decoder_input_projs[i](multi_scale_memorys[i]) + # shape (batch_size, c, h, w) -> (h*w, batch_size, c) + decoder_input = decoder_input.flatten(2).permute(2, 0, 1) + level_embed = self.level_embed.weight[i].view(1, 1, -1) + decoder_input = decoder_input + level_embed + # shape (batch_size, c, h, w) -> (h*w, batch_size, c) + mask = decoder_input.new_zeros( + (batch_size, ) + multi_scale_memorys[i].shape[-2:], + dtype=torch.bool) + decoder_positional_encoding = self.decoder_positional_encoding( + mask) + decoder_positional_encoding = decoder_positional_encoding.flatten( + 2).permute(2, 0, 1) + decoder_inputs.append(decoder_input) + decoder_positional_encodings.append(decoder_positional_encoding) + # shape (num_queries, c) -> (num_queries, batch_size, c) + query_feat = self.query_feat.weight.unsqueeze(1).repeat( + (1, batch_size, 1)) + query_embed = self.query_embed.weight.unsqueeze(1).repeat( + (1, batch_size, 1)) + + cls_pred_list = [] + mask_pred_list = [] + cls_pred, mask_pred, attn_mask = self.forward_head( + query_feat, mask_features, multi_scale_memorys[0].shape[-2:]) + cls_pred_list.append(cls_pred) + mask_pred_list.append(mask_pred) + + for i in range(self.num_transformer_decoder_layers): + level_idx = i % self.num_transformer_feat_level + # if a mask is all True(all background), then set it all False. + attn_mask[torch.where( + attn_mask.sum(-1) == attn_mask.shape[-1])] = False + + # cross_attn + self_attn + layer = self.transformer_decoder.layers[i] + attn_masks = [attn_mask, None] + query_feat = layer( + query=query_feat, + key=decoder_inputs[level_idx], + value=decoder_inputs[level_idx], + query_pos=query_embed, + key_pos=decoder_positional_encodings[level_idx], + attn_masks=attn_masks, + query_key_padding_mask=None, + # here we do not apply masking on padded region + key_padding_mask=None) + cls_pred, mask_pred, attn_mask = self.forward_head( + query_feat, mask_features, multi_scale_memorys[ + (i + 1) % self.num_transformer_feat_level].shape[-2:]) + + cls_pred_list.append(cls_pred) + mask_pred_list.append(mask_pred) + + return cls_pred_list, mask_pred_list diff --git a/mmdet/models/dense_heads/maskformer_head.py b/mmdet/models/dense_heads/maskformer_head.py new file mode 100644 index 0000000..566dc07 --- /dev/null +++ b/mmdet/models/dense_heads/maskformer_head.py @@ -0,0 +1,556 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import Conv2d, build_plugin_layer, caffe2_xavier_init +from mmcv.cnn.bricks.transformer import (build_positional_encoding, + build_transformer_layer_sequence) +from mmcv.runner import force_fp32 + +from mmdet.core import build_assigner, build_sampler, multi_apply, reduce_mean +from mmdet.models.utils import preprocess_panoptic_gt +from ..builder import HEADS, build_loss +from .anchor_free_head import AnchorFreeHead + + +@HEADS.register_module() +class MaskFormerHead(AnchorFreeHead): + """Implements the MaskFormer head. + + See `Per-Pixel Classification is Not All You Need for Semantic + Segmentation `_ for details. + + Args: + in_channels (list[int]): Number of channels in the input feature map. + feat_channels (int): Number of channels for feature. + out_channels (int): Number of channels for output. + num_things_classes (int): Number of things. + num_stuff_classes (int): Number of stuff. + num_queries (int): Number of query in Transformer. + pixel_decoder (:obj:`mmcv.ConfigDict` | dict): Config for pixel + decoder. Defaults to None. + enforce_decoder_input_project (bool, optional): Whether to add a layer + to change the embed_dim of tranformer encoder in pixel decoder to + the embed_dim of transformer decoder. Defaults to False. + transformer_decoder (:obj:`mmcv.ConfigDict` | dict): Config for + transformer decoder. Defaults to None. + positional_encoding (:obj:`mmcv.ConfigDict` | dict): Config for + transformer decoder position encoding. Defaults to None. + loss_cls (:obj:`mmcv.ConfigDict` | dict): Config of the classification + loss. Defaults to `CrossEntropyLoss`. + loss_mask (:obj:`mmcv.ConfigDict` | dict): Config of the mask loss. + Defaults to `FocalLoss`. + loss_dice (:obj:`mmcv.ConfigDict` | dict): Config of the dice loss. + Defaults to `DiceLoss`. + train_cfg (:obj:`mmcv.ConfigDict` | dict): Training config of + Maskformer head. + test_cfg (:obj:`mmcv.ConfigDict` | dict): Testing config of Maskformer + head. + init_cfg (dict or list[dict], optional): Initialization config dict. + Defaults to None. + """ + + def __init__(self, + in_channels, + feat_channels, + out_channels, + num_things_classes=80, + num_stuff_classes=53, + num_queries=100, + pixel_decoder=None, + enforce_decoder_input_project=False, + transformer_decoder=None, + positional_encoding=None, + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0, + class_weight=[1.0] * 133 + [0.1]), + loss_mask=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=20.0), + loss_dice=dict( + type='DiceLoss', + use_sigmoid=True, + activate=True, + naive_dice=True, + loss_weight=1.0), + train_cfg=None, + test_cfg=None, + init_cfg=None, + **kwargs): + super(AnchorFreeHead, self).__init__(init_cfg) + self.num_things_classes = num_things_classes + self.num_stuff_classes = num_stuff_classes + self.num_classes = self.num_things_classes + self.num_stuff_classes + self.num_queries = num_queries + + pixel_decoder.update( + in_channels=in_channels, + feat_channels=feat_channels, + out_channels=out_channels) + self.pixel_decoder = build_plugin_layer(pixel_decoder)[1] + self.transformer_decoder = build_transformer_layer_sequence( + transformer_decoder) + self.decoder_embed_dims = self.transformer_decoder.embed_dims + pixel_decoder_type = pixel_decoder.get('type') + if pixel_decoder_type == 'PixelDecoder' and ( + self.decoder_embed_dims != in_channels[-1] + or enforce_decoder_input_project): + self.decoder_input_proj = Conv2d( + in_channels[-1], self.decoder_embed_dims, kernel_size=1) + else: + self.decoder_input_proj = nn.Identity() + self.decoder_pe = build_positional_encoding(positional_encoding) + self.query_embed = nn.Embedding(self.num_queries, out_channels) + + self.cls_embed = nn.Linear(feat_channels, self.num_classes + 1) + self.mask_embed = nn.Sequential( + nn.Linear(feat_channels, feat_channels), nn.ReLU(inplace=True), + nn.Linear(feat_channels, feat_channels), nn.ReLU(inplace=True), + nn.Linear(feat_channels, out_channels)) + + self.test_cfg = test_cfg + self.train_cfg = train_cfg + if train_cfg: + self.assigner = build_assigner(train_cfg.get('assigner', None)) + self.sampler = build_sampler( + train_cfg.get('sampler', None), context=self) + + self.class_weight = loss_cls.get('class_weight', None) + self.loss_cls = build_loss(loss_cls) + self.loss_mask = build_loss(loss_mask) + self.loss_dice = build_loss(loss_dice) + + def init_weights(self): + if isinstance(self.decoder_input_proj, Conv2d): + caffe2_xavier_init(self.decoder_input_proj, bias=0) + + self.pixel_decoder.init_weights() + + for p in self.transformer_decoder.parameters(): + if p.dim() > 1: + nn.init.xavier_uniform_(p) + + def preprocess_gt(self, gt_labels_list, gt_masks_list, gt_semantic_segs, + img_metas): + """Preprocess the ground truth for all images. + + Args: + gt_labels_list (list[Tensor]): Each is ground truth + labels of each bbox, with shape (num_gts, ). + gt_masks_list (list[BitmapMasks]): Each is ground truth + masks of each instances of a image, shape + (num_gts, h, w). + gt_semantic_seg (Tensor | None): Ground truth of semantic + segmentation with the shape (batch_size, n, h, w). + [0, num_thing_class - 1] means things, + [num_thing_class, num_class-1] means stuff, + 255 means VOID. It's None when training instance segmentation. + img_metas (list[dict]): List of image meta information. + + Returns: + tuple: a tuple containing the following targets. + - labels (list[Tensor]): Ground truth class indices\ + for all images. Each with shape (n, ), n is the sum of\ + number of stuff type and number of instance in a image. + - masks (list[Tensor]): Ground truth mask for each\ + image, each with shape (n, h, w). + """ + num_things_list = [self.num_things_classes] * len(gt_labels_list) + num_stuff_list = [self.num_stuff_classes] * len(gt_labels_list) + if gt_semantic_segs is None: + gt_semantic_segs = [None] * len(gt_labels_list) + + targets = multi_apply(preprocess_panoptic_gt, gt_labels_list, + gt_masks_list, gt_semantic_segs, num_things_list, + num_stuff_list, img_metas) + labels, masks = targets + return labels, masks + + def get_targets(self, cls_scores_list, mask_preds_list, gt_labels_list, + gt_masks_list, img_metas): + """Compute classification and mask targets for all images for a decoder + layer. + + Args: + cls_scores_list (list[Tensor]): Mask score logits from a single + decoder layer for all images. Each with shape (num_queries, + cls_out_channels). + mask_preds_list (list[Tensor]): Mask logits from a single decoder + layer for all images. Each with shape (num_queries, h, w). + gt_labels_list (list[Tensor]): Ground truth class indices for all + images. Each with shape (n, ), n is the sum of number of stuff + type and number of instance in a image. + gt_masks_list (list[Tensor]): Ground truth mask for each image, + each with shape (n, h, w). + img_metas (list[dict]): List of image meta information. + + Returns: + tuple[list[Tensor]]: a tuple containing the following targets. + - labels_list (list[Tensor]): Labels of all images.\ + Each with shape (num_queries, ). + - label_weights_list (list[Tensor]): Label weights\ + of all images. Each with shape (num_queries, ). + - mask_targets_list (list[Tensor]): Mask targets of\ + all images. Each with shape (num_queries, h, w). + - mask_weights_list (list[Tensor]): Mask weights of\ + all images. Each with shape (num_queries, ). + - num_total_pos (int): Number of positive samples in\ + all images. + - num_total_neg (int): Number of negative samples in\ + all images. + """ + (labels_list, label_weights_list, mask_targets_list, mask_weights_list, + pos_inds_list, + neg_inds_list) = multi_apply(self._get_target_single, cls_scores_list, + mask_preds_list, gt_labels_list, + gt_masks_list, img_metas) + + num_total_pos = sum((inds.numel() for inds in pos_inds_list)) + num_total_neg = sum((inds.numel() for inds in neg_inds_list)) + return (labels_list, label_weights_list, mask_targets_list, + mask_weights_list, num_total_pos, num_total_neg) + + def _get_target_single(self, cls_score, mask_pred, gt_labels, gt_masks, + img_metas): + """Compute classification and mask targets for one image. + + Args: + cls_score (Tensor): Mask score logits from a single decoder layer + for one image. Shape (num_queries, cls_out_channels). + mask_pred (Tensor): Mask logits for a single decoder layer for one + image. Shape (num_queries, h, w). + gt_labels (Tensor): Ground truth class indices for one image with + shape (n, ). n is the sum of number of stuff type and number + of instance in a image. + gt_masks (Tensor): Ground truth mask for each image, each with + shape (n, h, w). + img_metas (dict): Image informtation. + + Returns: + tuple[Tensor]: a tuple containing the following for one image. + - labels (Tensor): Labels of each image. + shape (num_queries, ). + - label_weights (Tensor): Label weights of each image. + shape (num_queries, ). + - mask_targets (Tensor): Mask targets of each image. + shape (num_queries, h, w). + - mask_weights (Tensor): Mask weights of each image. + shape (num_queries, ). + - pos_inds (Tensor): Sampled positive indices for each image. + - neg_inds (Tensor): Sampled negative indices for each image. + """ + target_shape = mask_pred.shape[-2:] + if gt_masks.shape[0] > 0: + gt_masks_downsampled = F.interpolate( + gt_masks.unsqueeze(1).float(), target_shape, + mode='nearest').squeeze(1).long() + else: + gt_masks_downsampled = gt_masks + + # assign and sample + assign_result = self.assigner.assign(cls_score, mask_pred, gt_labels, + gt_masks_downsampled, img_metas) + sampling_result = self.sampler.sample(assign_result, mask_pred, + gt_masks) + pos_inds = sampling_result.pos_inds + neg_inds = sampling_result.neg_inds + + # label target + labels = gt_labels.new_full((self.num_queries, ), + self.num_classes, + dtype=torch.long) + labels[pos_inds] = gt_labels[sampling_result.pos_assigned_gt_inds] + label_weights = gt_labels.new_ones(self.num_queries) + + # mask target + mask_targets = gt_masks[sampling_result.pos_assigned_gt_inds] + mask_weights = mask_pred.new_zeros((self.num_queries, )) + mask_weights[pos_inds] = 1.0 + + return (labels, label_weights, mask_targets, mask_weights, pos_inds, + neg_inds) + + @force_fp32(apply_to=('all_cls_scores', 'all_mask_preds')) + def loss(self, all_cls_scores, all_mask_preds, gt_labels_list, + gt_masks_list, img_metas): + """Loss function. + + Args: + all_cls_scores (Tensor): Classification scores for all decoder + layers with shape (num_decoder, batch_size, num_queries, + cls_out_channels). Note `cls_out_channels` should includes + background. + all_mask_preds (Tensor): Mask scores for all decoder layers with + shape (num_decoder, batch_size, num_queries, h, w). + gt_labels_list (list[Tensor]): Ground truth class indices for each + image with shape (n, ). n is the sum of number of stuff type + and number of instance in a image. + gt_masks_list (list[Tensor]): Ground truth mask for each image with + shape (n, h, w). + img_metas (list[dict]): List of image meta information. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + num_dec_layers = len(all_cls_scores) + all_gt_labels_list = [gt_labels_list for _ in range(num_dec_layers)] + all_gt_masks_list = [gt_masks_list for _ in range(num_dec_layers)] + img_metas_list = [img_metas for _ in range(num_dec_layers)] + losses_cls, losses_mask, losses_dice = multi_apply( + self.loss_single, all_cls_scores, all_mask_preds, + all_gt_labels_list, all_gt_masks_list, img_metas_list) + + loss_dict = dict() + # loss from the last decoder layer + loss_dict['loss_cls'] = losses_cls[-1] + loss_dict['loss_mask'] = losses_mask[-1] + loss_dict['loss_dice'] = losses_dice[-1] + # loss from other decoder layers + num_dec_layer = 0 + for loss_cls_i, loss_mask_i, loss_dice_i in zip( + losses_cls[:-1], losses_mask[:-1], losses_dice[:-1]): + loss_dict[f'd{num_dec_layer}.loss_cls'] = loss_cls_i + loss_dict[f'd{num_dec_layer}.loss_mask'] = loss_mask_i + loss_dict[f'd{num_dec_layer}.loss_dice'] = loss_dice_i + num_dec_layer += 1 + return loss_dict + + def loss_single(self, cls_scores, mask_preds, gt_labels_list, + gt_masks_list, img_metas): + """Loss function for outputs from a single decoder layer. + + Args: + cls_scores (Tensor): Mask score logits from a single decoder layer + for all images. Shape (batch_size, num_queries, + cls_out_channels). Note `cls_out_channels` should includes + background. + mask_preds (Tensor): Mask logits for a pixel decoder for all + images. Shape (batch_size, num_queries, h, w). + gt_labels_list (list[Tensor]): Ground truth class indices for each + image, each with shape (n, ). n is the sum of number of stuff + types and number of instances in a image. + gt_masks_list (list[Tensor]): Ground truth mask for each image, + each with shape (n, h, w). + img_metas (list[dict]): List of image meta information. + + Returns: + tuple[Tensor]: Loss components for outputs from a single decoder\ + layer. + """ + num_imgs = cls_scores.size(0) + cls_scores_list = [cls_scores[i] for i in range(num_imgs)] + mask_preds_list = [mask_preds[i] for i in range(num_imgs)] + + (labels_list, label_weights_list, mask_targets_list, mask_weights_list, + num_total_pos, + num_total_neg) = self.get_targets(cls_scores_list, mask_preds_list, + gt_labels_list, gt_masks_list, + img_metas) + # shape (batch_size, num_queries) + labels = torch.stack(labels_list, dim=0) + # shape (batch_size, num_queries) + label_weights = torch.stack(label_weights_list, dim=0) + # shape (num_total_gts, h, w) + mask_targets = torch.cat(mask_targets_list, dim=0) + # shape (batch_size, num_queries) + mask_weights = torch.stack(mask_weights_list, dim=0) + + # classfication loss + # shape (batch_size * num_queries, ) + cls_scores = cls_scores.flatten(0, 1) + labels = labels.flatten(0, 1) + label_weights = label_weights.flatten(0, 1) + + class_weight = cls_scores.new_tensor(self.class_weight) + loss_cls = self.loss_cls( + cls_scores, + labels, + label_weights, + avg_factor=class_weight[labels].sum()) + + num_total_masks = reduce_mean(cls_scores.new_tensor([num_total_pos])) + num_total_masks = max(num_total_masks, 1) + + # extract positive ones + # shape (batch_size, num_queries, h, w) -> (num_total_gts, h, w) + mask_preds = mask_preds[mask_weights > 0] + target_shape = mask_targets.shape[-2:] + + if mask_targets.shape[0] == 0: + # zero match + loss_dice = mask_preds.sum() + loss_mask = mask_preds.sum() + return loss_cls, loss_mask, loss_dice + + # upsample to shape of target + # shape (num_total_gts, h, w) + mask_preds = F.interpolate( + mask_preds.unsqueeze(1), + target_shape, + mode='bilinear', + align_corners=False).squeeze(1) + + # dice loss + loss_dice = self.loss_dice( + mask_preds, mask_targets, avg_factor=num_total_masks) + + # mask loss + # FocalLoss support input of shape (n, num_class) + h, w = mask_preds.shape[-2:] + # shape (num_total_gts, h, w) -> (num_total_gts * h * w, 1) + mask_preds = mask_preds.reshape(-1, 1) + # shape (num_total_gts, h, w) -> (num_total_gts * h * w) + mask_targets = mask_targets.reshape(-1) + # target is (1 - mask_targets) !!! + loss_mask = self.loss_mask( + mask_preds, 1 - mask_targets, avg_factor=num_total_masks * h * w) + + return loss_cls, loss_mask, loss_dice + + def forward(self, feats, img_metas): + """Forward function. + + Args: + feats (list[Tensor]): Features from the upstream network, each + is a 4D-tensor. + img_metas (list[dict]): List of image information. + + Returns: + tuple: a tuple contains two elements. + - all_cls_scores (Tensor): Classification scores for each\ + scale level. Each is a 4D-tensor with shape\ + (num_decoder, batch_size, num_queries, cls_out_channels).\ + Note `cls_out_channels` should includes background. + - all_mask_preds (Tensor): Mask scores for each decoder\ + layer. Each with shape (num_decoder, batch_size,\ + num_queries, h, w). + """ + batch_size = len(img_metas) + input_img_h, input_img_w = img_metas[0]['batch_input_shape'] + padding_mask = feats[-1].new_ones( + (batch_size, input_img_h, input_img_w), dtype=torch.float32) + for i in range(batch_size): + img_h, img_w, _ = img_metas[i]['img_shape'] + padding_mask[i, :img_h, :img_w] = 0 + padding_mask = F.interpolate( + padding_mask.unsqueeze(1), + size=feats[-1].shape[-2:], + mode='nearest').to(torch.bool).squeeze(1) + # when backbone is swin, memory is output of last stage of swin. + # when backbone is r50, memory is output of tranformer encoder. + mask_features, memory = self.pixel_decoder(feats, img_metas) + pos_embed = self.decoder_pe(padding_mask) + memory = self.decoder_input_proj(memory) + # shape (batch_size, c, h, w) -> (h*w, batch_size, c) + memory = memory.flatten(2).permute(2, 0, 1) + pos_embed = pos_embed.flatten(2).permute(2, 0, 1) + # shape (batch_size, h * w) + padding_mask = padding_mask.flatten(1) + # shape = (num_queries, embed_dims) + query_embed = self.query_embed.weight + # shape = (num_queries, batch_size, embed_dims) + query_embed = query_embed.unsqueeze(1).repeat(1, batch_size, 1) + target = torch.zeros_like(query_embed) + # shape (num_decoder, num_queries, batch_size, embed_dims) + out_dec = self.transformer_decoder( + query=target, + key=memory, + value=memory, + key_pos=pos_embed, + query_pos=query_embed, + key_padding_mask=padding_mask) + # shape (num_decoder, batch_size, num_queries, embed_dims) + out_dec = out_dec.transpose(1, 2) + + # cls_scores + all_cls_scores = self.cls_embed(out_dec) + + # mask_preds + mask_embed = self.mask_embed(out_dec) + all_mask_preds = torch.einsum('lbqc,bchw->lbqhw', mask_embed, + mask_features) + + return all_cls_scores, all_mask_preds + + def forward_train(self, + feats, + img_metas, + gt_bboxes, + gt_labels, + gt_masks, + gt_semantic_seg, + gt_bboxes_ignore=None): + """Forward function for training mode. + + Args: + feats (list[Tensor]): Multi-level features from the upstream + network, each is a 4D-tensor. + img_metas (list[Dict]): List of image information. + gt_bboxes (list[Tensor]): Each element is ground truth bboxes of + the image, shape (num_gts, 4). Not used here. + gt_labels (list[Tensor]): Each element is ground truth labels of + each box, shape (num_gts,). + gt_masks (list[BitmapMasks]): Each element is masks of instances + of a image, shape (num_gts, h, w). + gt_semantic_seg (list[tensor] | None): Each element is the ground + truth of semantic segmentation with the shape (N, H, W). + [0, num_thing_class - 1] means things, + [num_thing_class, num_class-1] means stuff, + 255 means VOID. It's None when training instance segmentation. + gt_bboxes_ignore (list[Tensor]): Ground truth bboxes to be + ignored. Defaults to None. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + # not consider ignoring bboxes + assert gt_bboxes_ignore is None + + # forward + all_cls_scores, all_mask_preds = self(feats, img_metas) + + # preprocess ground truth + gt_labels, gt_masks = self.preprocess_gt(gt_labels, gt_masks, + gt_semantic_seg, img_metas) + + # loss + losses = self.loss(all_cls_scores, all_mask_preds, gt_labels, gt_masks, + img_metas) + + return losses + + def simple_test(self, feats, img_metas, **kwargs): + """Test without augmentaton. + + Args: + feats (list[Tensor]): Multi-level features from the + upstream network, each is a 4D-tensor. + img_metas (list[dict]): List of image information. + + Returns: + tuple: A tuple contains two tensors. + + - mask_cls_results (Tensor): Mask classification logits,\ + shape (batch_size, num_queries, cls_out_channels). + Note `cls_out_channels` should includes background. + - mask_pred_results (Tensor): Mask logits, shape \ + (batch_size, num_queries, h, w). + """ + all_cls_scores, all_mask_preds = self(feats, img_metas) + mask_cls_results = all_cls_scores[-1] + mask_pred_results = all_mask_preds[-1] + + # upsample masks + img_shape = img_metas[0]['batch_input_shape'] + mask_pred_results = F.interpolate( + mask_pred_results, + size=(img_shape[0], img_shape[1]), + mode='bilinear', + align_corners=False) + + return mask_cls_results, mask_pred_results diff --git a/mmdet/models/dense_heads/nasfcos_head.py b/mmdet/models/dense_heads/nasfcos_head.py new file mode 100644 index 0000000..380c912 --- /dev/null +++ b/mmdet/models/dense_heads/nasfcos_head.py @@ -0,0 +1,80 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy + +import torch.nn as nn +from mmcv.cnn import ConvModule, Scale + +from mmdet.models.dense_heads.fcos_head import FCOSHead +from ..builder import HEADS + + +@HEADS.register_module() +class NASFCOSHead(FCOSHead): + """Anchor-free head used in `NASFCOS `_. + + It is quite similar with FCOS head, except for the searched structure of + classification branch and bbox regression branch, where a structure of + "dconv3x3, conv3x3, dconv3x3, conv1x1" is utilized instead. + """ + + def __init__(self, *args, init_cfg=None, **kwargs): + if init_cfg is None: + init_cfg = [ + dict(type='Caffe2Xavier', layer=['ConvModule', 'Conv2d']), + dict( + type='Normal', + std=0.01, + override=[ + dict(name='conv_reg'), + dict(name='conv_centerness'), + dict( + name='conv_cls', + type='Normal', + std=0.01, + bias_prob=0.01) + ]), + ] + super(NASFCOSHead, self).__init__(*args, init_cfg=init_cfg, **kwargs) + + def _init_layers(self): + """Initialize layers of the head.""" + dconv3x3_config = dict( + type='DCNv2', + kernel_size=3, + use_bias=True, + deform_groups=2, + padding=1) + conv3x3_config = dict(type='Conv', kernel_size=3, padding=1) + conv1x1_config = dict(type='Conv', kernel_size=1) + + self.arch_config = [ + dconv3x3_config, conv3x3_config, dconv3x3_config, conv1x1_config + ] + self.cls_convs = nn.ModuleList() + self.reg_convs = nn.ModuleList() + for i, op_ in enumerate(self.arch_config): + op = copy.deepcopy(op_) + chn = self.in_channels if i == 0 else self.feat_channels + assert isinstance(op, dict) + use_bias = op.pop('use_bias', False) + padding = op.pop('padding', 0) + kernel_size = op.pop('kernel_size') + module = ConvModule( + chn, + self.feat_channels, + kernel_size, + stride=1, + padding=padding, + norm_cfg=self.norm_cfg, + bias=use_bias, + conv_cfg=op) + + self.cls_convs.append(copy.deepcopy(module)) + self.reg_convs.append(copy.deepcopy(module)) + + self.conv_cls = nn.Conv2d( + self.feat_channels, self.cls_out_channels, 3, padding=1) + self.conv_reg = nn.Conv2d(self.feat_channels, 4, 3, padding=1) + self.conv_centerness = nn.Conv2d(self.feat_channels, 1, 3, padding=1) + + self.scales = nn.ModuleList([Scale(1.0) for _ in self.strides]) diff --git a/mmdet/models/dense_heads/paa_head.py b/mmdet/models/dense_heads/paa_head.py new file mode 100644 index 0000000..d79b5b9 --- /dev/null +++ b/mmdet/models/dense_heads/paa_head.py @@ -0,0 +1,756 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import torch +from mmcv.runner import force_fp32 + +from mmdet.core import multi_apply, multiclass_nms +from mmdet.core.bbox.iou_calculators import bbox_overlaps +from mmdet.models import HEADS +from mmdet.models.dense_heads import ATSSHead + +EPS = 1e-12 +try: + import sklearn.mixture as skm +except ImportError: + skm = None + + +def levels_to_images(mlvl_tensor): + """Concat multi-level feature maps by image. + + [feature_level0, feature_level1...] -> [feature_image0, feature_image1...] + Convert the shape of each element in mlvl_tensor from (N, C, H, W) to + (N, H*W , C), then split the element to N elements with shape (H*W, C), and + concat elements in same image of all level along first dimension. + + Args: + mlvl_tensor (list[torch.Tensor]): list of Tensor which collect from + corresponding level. Each element is of shape (N, C, H, W) + + Returns: + list[torch.Tensor]: A list that contains N tensors and each tensor is + of shape (num_elements, C) + """ + batch_size = mlvl_tensor[0].size(0) + batch_list = [[] for _ in range(batch_size)] + channels = mlvl_tensor[0].size(1) + for t in mlvl_tensor: + t = t.permute(0, 2, 3, 1) + t = t.view(batch_size, -1, channels).contiguous() + for img in range(batch_size): + batch_list[img].append(t[img]) + return [torch.cat(item, 0) for item in batch_list] + + +@HEADS.register_module() +class PAAHead(ATSSHead): + """Head of PAAAssignment: Probabilistic Anchor Assignment with IoU + Prediction for Object Detection. + + Code is modified from the `official github repo + `_. + + More details can be found in the `paper + `_ . + + Args: + topk (int): Select topk samples with smallest loss in + each level. + score_voting (bool): Whether to use score voting in post-process. + covariance_type : String describing the type of covariance parameters + to be used in :class:`sklearn.mixture.GaussianMixture`. + It must be one of: + + - 'full': each component has its own general covariance matrix + - 'tied': all components share the same general covariance matrix + - 'diag': each component has its own diagonal covariance matrix + - 'spherical': each component has its own single variance + Default: 'diag'. From 'full' to 'spherical', the gmm fitting + process is faster yet the performance could be influenced. For most + cases, 'diag' should be a good choice. + """ + + def __init__(self, + *args, + topk=9, + score_voting=True, + covariance_type='diag', + **kwargs): + # topk used in paa reassign process + self.topk = topk + self.with_score_voting = score_voting + self.covariance_type = covariance_type + super(PAAHead, self).__init__(*args, **kwargs) + + @force_fp32(apply_to=('cls_scores', 'bbox_preds', 'iou_preds')) + def loss(self, + cls_scores, + bbox_preds, + iou_preds, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Compute losses of the head. + + Args: + cls_scores (list[Tensor]): Box scores for each scale level + Has shape (N, num_anchors * num_classes, H, W) + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level with shape (N, num_anchors * 4, H, W) + iou_preds (list[Tensor]): iou_preds for each scale + level with shape (N, num_anchors * 1, H, W) + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (list[Tensor] | None): Specify which bounding + boxes can be ignored when are computing the loss. + + Returns: + dict[str, Tensor]: A dictionary of loss gmm_assignment. + """ + + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + assert len(featmap_sizes) == self.prior_generator.num_levels + + device = cls_scores[0].device + anchor_list, valid_flag_list = self.get_anchors( + featmap_sizes, img_metas, device=device) + label_channels = self.cls_out_channels if self.use_sigmoid_cls else 1 + cls_reg_targets = self.get_targets( + anchor_list, + valid_flag_list, + gt_bboxes, + img_metas, + gt_bboxes_ignore_list=gt_bboxes_ignore, + gt_labels_list=gt_labels, + label_channels=label_channels, + ) + (labels, labels_weight, bboxes_target, bboxes_weight, pos_inds, + pos_gt_index) = cls_reg_targets + cls_scores = levels_to_images(cls_scores) + cls_scores = [ + item.reshape(-1, self.cls_out_channels) for item in cls_scores + ] + bbox_preds = levels_to_images(bbox_preds) + bbox_preds = [item.reshape(-1, 4) for item in bbox_preds] + iou_preds = levels_to_images(iou_preds) + iou_preds = [item.reshape(-1, 1) for item in iou_preds] + pos_losses_list, = multi_apply(self.get_pos_loss, anchor_list, + cls_scores, bbox_preds, labels, + labels_weight, bboxes_target, + bboxes_weight, pos_inds) + + with torch.no_grad(): + reassign_labels, reassign_label_weight, \ + reassign_bbox_weights, num_pos = multi_apply( + self.paa_reassign, + pos_losses_list, + labels, + labels_weight, + bboxes_weight, + pos_inds, + pos_gt_index, + anchor_list) + num_pos = sum(num_pos) + # convert all tensor list to a flatten tensor + cls_scores = torch.cat(cls_scores, 0).view(-1, cls_scores[0].size(-1)) + bbox_preds = torch.cat(bbox_preds, 0).view(-1, bbox_preds[0].size(-1)) + iou_preds = torch.cat(iou_preds, 0).view(-1, iou_preds[0].size(-1)) + labels = torch.cat(reassign_labels, 0).view(-1) + flatten_anchors = torch.cat( + [torch.cat(item, 0) for item in anchor_list]) + labels_weight = torch.cat(reassign_label_weight, 0).view(-1) + bboxes_target = torch.cat(bboxes_target, + 0).view(-1, bboxes_target[0].size(-1)) + + pos_inds_flatten = ((labels >= 0) + & + (labels < self.num_classes)).nonzero().reshape(-1) + + losses_cls = self.loss_cls( + cls_scores, + labels, + labels_weight, + avg_factor=max(num_pos, len(img_metas))) # avoid num_pos=0 + if num_pos: + pos_bbox_pred = self.bbox_coder.decode( + flatten_anchors[pos_inds_flatten], + bbox_preds[pos_inds_flatten]) + pos_bbox_target = bboxes_target[pos_inds_flatten] + iou_target = bbox_overlaps( + pos_bbox_pred.detach(), pos_bbox_target, is_aligned=True) + losses_iou = self.loss_centerness( + iou_preds[pos_inds_flatten], + iou_target.unsqueeze(-1), + avg_factor=num_pos) + losses_bbox = self.loss_bbox( + pos_bbox_pred, + pos_bbox_target, + iou_target.clamp(min=EPS), + avg_factor=iou_target.sum()) + else: + losses_iou = iou_preds.sum() * 0 + losses_bbox = bbox_preds.sum() * 0 + + return dict( + loss_cls=losses_cls, loss_bbox=losses_bbox, loss_iou=losses_iou) + + def get_pos_loss(self, anchors, cls_score, bbox_pred, label, label_weight, + bbox_target, bbox_weight, pos_inds): + """Calculate loss of all potential positive samples obtained from first + match process. + + Args: + anchors (list[Tensor]): Anchors of each scale. + cls_score (Tensor): Box scores of single image with shape + (num_anchors, num_classes) + bbox_pred (Tensor): Box energies / deltas of single image + with shape (num_anchors, 4) + label (Tensor): classification target of each anchor with + shape (num_anchors,) + label_weight (Tensor): Classification loss weight of each + anchor with shape (num_anchors). + bbox_target (dict): Regression target of each anchor with + shape (num_anchors, 4). + bbox_weight (Tensor): Bbox weight of each anchor with shape + (num_anchors, 4). + pos_inds (Tensor): Index of all positive samples got from + first assign process. + + Returns: + Tensor: Losses of all positive samples in single image. + """ + if not len(pos_inds): + return cls_score.new([]), + anchors_all_level = torch.cat(anchors, 0) + pos_scores = cls_score[pos_inds] + pos_bbox_pred = bbox_pred[pos_inds] + pos_label = label[pos_inds] + pos_label_weight = label_weight[pos_inds] + pos_bbox_target = bbox_target[pos_inds] + pos_bbox_weight = bbox_weight[pos_inds] + pos_anchors = anchors_all_level[pos_inds] + pos_bbox_pred = self.bbox_coder.decode(pos_anchors, pos_bbox_pred) + + # to keep loss dimension + loss_cls = self.loss_cls( + pos_scores, + pos_label, + pos_label_weight, + avg_factor=1.0, + reduction_override='none') + + loss_bbox = self.loss_bbox( + pos_bbox_pred, + pos_bbox_target, + pos_bbox_weight, + avg_factor=1.0, # keep same loss weight before reassign + reduction_override='none') + + loss_cls = loss_cls.sum(-1) + pos_loss = loss_bbox + loss_cls + return pos_loss, + + def paa_reassign(self, pos_losses, label, label_weight, bbox_weight, + pos_inds, pos_gt_inds, anchors): + """Fit loss to GMM distribution and separate positive, ignore, negative + samples again with GMM model. + + Args: + pos_losses (Tensor): Losses of all positive samples in + single image. + label (Tensor): classification target of each anchor with + shape (num_anchors,) + label_weight (Tensor): Classification loss weight of each + anchor with shape (num_anchors). + bbox_weight (Tensor): Bbox weight of each anchor with shape + (num_anchors, 4). + pos_inds (Tensor): Index of all positive samples got from + first assign process. + pos_gt_inds (Tensor): Gt_index of all positive samples got + from first assign process. + anchors (list[Tensor]): Anchors of each scale. + + Returns: + tuple: Usually returns a tuple containing learning targets. + + - label (Tensor): classification target of each anchor after + paa assign, with shape (num_anchors,) + - label_weight (Tensor): Classification loss weight of each + anchor after paa assign, with shape (num_anchors). + - bbox_weight (Tensor): Bbox weight of each anchor with shape + (num_anchors, 4). + - num_pos (int): The number of positive samples after paa + assign. + """ + if not len(pos_inds): + return label, label_weight, bbox_weight, 0 + label = label.clone() + label_weight = label_weight.clone() + bbox_weight = bbox_weight.clone() + num_gt = pos_gt_inds.max() + 1 + num_level = len(anchors) + num_anchors_each_level = [item.size(0) for item in anchors] + num_anchors_each_level.insert(0, 0) + inds_level_interval = np.cumsum(num_anchors_each_level) + pos_level_mask = [] + for i in range(num_level): + mask = (pos_inds >= inds_level_interval[i]) & ( + pos_inds < inds_level_interval[i + 1]) + pos_level_mask.append(mask) + pos_inds_after_paa = [label.new_tensor([])] + ignore_inds_after_paa = [label.new_tensor([])] + for gt_ind in range(num_gt): + pos_inds_gmm = [] + pos_loss_gmm = [] + gt_mask = pos_gt_inds == gt_ind + for level in range(num_level): + level_mask = pos_level_mask[level] + level_gt_mask = level_mask & gt_mask + value, topk_inds = pos_losses[level_gt_mask].topk( + min(level_gt_mask.sum(), self.topk), largest=False) + pos_inds_gmm.append(pos_inds[level_gt_mask][topk_inds]) + pos_loss_gmm.append(value) + pos_inds_gmm = torch.cat(pos_inds_gmm) + pos_loss_gmm = torch.cat(pos_loss_gmm) + # fix gmm need at least two sample + if len(pos_inds_gmm) < 2: + continue + device = pos_inds_gmm.device + pos_loss_gmm, sort_inds = pos_loss_gmm.sort() + pos_inds_gmm = pos_inds_gmm[sort_inds] + pos_loss_gmm = pos_loss_gmm.view(-1, 1).cpu().numpy() + min_loss, max_loss = pos_loss_gmm.min(), pos_loss_gmm.max() + means_init = np.array([min_loss, max_loss]).reshape(2, 1) + weights_init = np.array([0.5, 0.5]) + precisions_init = np.array([1.0, 1.0]).reshape(2, 1, 1) # full + if self.covariance_type == 'spherical': + precisions_init = precisions_init.reshape(2) + elif self.covariance_type == 'diag': + precisions_init = precisions_init.reshape(2, 1) + elif self.covariance_type == 'tied': + precisions_init = np.array([[1.0]]) + if skm is None: + raise ImportError('Please run "pip install sklearn" ' + 'to install sklearn first.') + gmm = skm.GaussianMixture( + 2, + weights_init=weights_init, + means_init=means_init, + precisions_init=precisions_init, + covariance_type=self.covariance_type) + gmm.fit(pos_loss_gmm) + gmm_assignment = gmm.predict(pos_loss_gmm) + scores = gmm.score_samples(pos_loss_gmm) + gmm_assignment = torch.from_numpy(gmm_assignment).to(device) + scores = torch.from_numpy(scores).to(device) + + pos_inds_temp, ignore_inds_temp = self.gmm_separation_scheme( + gmm_assignment, scores, pos_inds_gmm) + pos_inds_after_paa.append(pos_inds_temp) + ignore_inds_after_paa.append(ignore_inds_temp) + + pos_inds_after_paa = torch.cat(pos_inds_after_paa) + ignore_inds_after_paa = torch.cat(ignore_inds_after_paa) + reassign_mask = (pos_inds.unsqueeze(1) != pos_inds_after_paa).all(1) + reassign_ids = pos_inds[reassign_mask] + label[reassign_ids] = self.num_classes + label_weight[ignore_inds_after_paa] = 0 + bbox_weight[reassign_ids] = 0 + num_pos = len(pos_inds_after_paa) + return label, label_weight, bbox_weight, num_pos + + def gmm_separation_scheme(self, gmm_assignment, scores, pos_inds_gmm): + """A general separation scheme for gmm model. + + It separates a GMM distribution of candidate samples into three + parts, 0 1 and uncertain areas, and you can implement other + separation schemes by rewriting this function. + + Args: + gmm_assignment (Tensor): The prediction of GMM which is of shape + (num_samples,). The 0/1 value indicates the distribution + that each sample comes from. + scores (Tensor): The probability of sample coming from the + fit GMM distribution. The tensor is of shape (num_samples,). + pos_inds_gmm (Tensor): All the indexes of samples which are used + to fit GMM model. The tensor is of shape (num_samples,) + + Returns: + tuple[Tensor]: The indices of positive and ignored samples. + + - pos_inds_temp (Tensor): Indices of positive samples. + - ignore_inds_temp (Tensor): Indices of ignore samples. + """ + # The implementation is (c) in Fig.3 in origin paper instead of (b). + # You can refer to issues such as + # https://github.com/kkhoot/PAA/issues/8 and + # https://github.com/kkhoot/PAA/issues/9. + fgs = gmm_assignment == 0 + pos_inds_temp = fgs.new_tensor([], dtype=torch.long) + ignore_inds_temp = fgs.new_tensor([], dtype=torch.long) + if fgs.nonzero().numel(): + _, pos_thr_ind = scores[fgs].topk(1) + pos_inds_temp = pos_inds_gmm[fgs][:pos_thr_ind + 1] + ignore_inds_temp = pos_inds_gmm.new_tensor([]) + return pos_inds_temp, ignore_inds_temp + + def get_targets( + self, + anchor_list, + valid_flag_list, + gt_bboxes_list, + img_metas, + gt_bboxes_ignore_list=None, + gt_labels_list=None, + label_channels=1, + unmap_outputs=True, + ): + """Get targets for PAA head. + + This method is almost the same as `AnchorHead.get_targets()`. We direct + return the results from _get_targets_single instead map it to levels + by images_to_levels function. + + Args: + anchor_list (list[list[Tensor]]): Multi level anchors of each + image. The outer list indicates images, and the inner list + corresponds to feature levels of the image. Each element of + the inner list is a tensor of shape (num_anchors, 4). + valid_flag_list (list[list[Tensor]]): Multi level valid flags of + each image. The outer list indicates images, and the inner list + corresponds to feature levels of the image. Each element of + the inner list is a tensor of shape (num_anchors, ) + gt_bboxes_list (list[Tensor]): Ground truth bboxes of each image. + img_metas (list[dict]): Meta info of each image. + gt_bboxes_ignore_list (list[Tensor]): Ground truth bboxes to be + ignored. + gt_labels_list (list[Tensor]): Ground truth labels of each box. + label_channels (int): Channel of label. + unmap_outputs (bool): Whether to map outputs back to the original + set of anchors. + + Returns: + tuple: Usually returns a tuple containing learning targets. + + - labels (list[Tensor]): Labels of all anchors, each with + shape (num_anchors,). + - label_weights (list[Tensor]): Label weights of all anchor. + each with shape (num_anchors,). + - bbox_targets (list[Tensor]): BBox targets of all anchors. + each with shape (num_anchors, 4). + - bbox_weights (list[Tensor]): BBox weights of all anchors. + each with shape (num_anchors, 4). + - pos_inds (list[Tensor]): Contains all index of positive + sample in all anchor. + - gt_inds (list[Tensor]): Contains all gt_index of positive + sample in all anchor. + """ + + num_imgs = len(img_metas) + assert len(anchor_list) == len(valid_flag_list) == num_imgs + concat_anchor_list = [] + concat_valid_flag_list = [] + for i in range(num_imgs): + assert len(anchor_list[i]) == len(valid_flag_list[i]) + concat_anchor_list.append(torch.cat(anchor_list[i])) + concat_valid_flag_list.append(torch.cat(valid_flag_list[i])) + + # compute targets for each image + if gt_bboxes_ignore_list is None: + gt_bboxes_ignore_list = [None for _ in range(num_imgs)] + if gt_labels_list is None: + gt_labels_list = [None for _ in range(num_imgs)] + results = multi_apply( + self._get_targets_single, + concat_anchor_list, + concat_valid_flag_list, + gt_bboxes_list, + gt_bboxes_ignore_list, + gt_labels_list, + img_metas, + label_channels=label_channels, + unmap_outputs=unmap_outputs) + + (labels, label_weights, bbox_targets, bbox_weights, valid_pos_inds, + valid_neg_inds, sampling_result) = results + + # Due to valid flag of anchors, we have to calculate the real pos_inds + # in origin anchor set. + pos_inds = [] + for i, single_labels in enumerate(labels): + pos_mask = (0 <= single_labels) & ( + single_labels < self.num_classes) + pos_inds.append(pos_mask.nonzero().view(-1)) + + gt_inds = [item.pos_assigned_gt_inds for item in sampling_result] + return (labels, label_weights, bbox_targets, bbox_weights, pos_inds, + gt_inds) + + def _get_targets_single(self, + flat_anchors, + valid_flags, + gt_bboxes, + gt_bboxes_ignore, + gt_labels, + img_meta, + label_channels=1, + unmap_outputs=True): + """Compute regression and classification targets for anchors in a + single image. + + This method is same as `AnchorHead._get_targets_single()`. + """ + assert unmap_outputs, 'We must map outputs back to the original' \ + 'set of anchors in PAAhead' + return super(ATSSHead, self)._get_targets_single( + flat_anchors, + valid_flags, + gt_bboxes, + gt_bboxes_ignore, + gt_labels, + img_meta, + label_channels=1, + unmap_outputs=True) + + @force_fp32(apply_to=('cls_scores', 'bbox_preds')) + def get_bboxes(self, + cls_scores, + bbox_preds, + score_factors=None, + img_metas=None, + cfg=None, + rescale=False, + with_nms=True, + **kwargs): + assert with_nms, 'PAA only supports "with_nms=True" now and it ' \ + 'means PAAHead does not support ' \ + 'test-time augmentation' + return super(ATSSHead, self).get_bboxes(cls_scores, bbox_preds, + score_factors, img_metas, cfg, + rescale, with_nms, **kwargs) + + def _get_bboxes_single(self, + cls_score_list, + bbox_pred_list, + score_factor_list, + mlvl_priors, + img_meta, + cfg, + rescale=False, + with_nms=True, + **kwargs): + """Transform outputs of a single image into bbox predictions. + + Args: + cls_score_list (list[Tensor]): Box scores from all scale + levels of a single image, each item has shape + (num_priors * num_classes, H, W). + bbox_pred_list (list[Tensor]): Box energies / deltas from + all scale levels of a single image, each item has shape + (num_priors * 4, H, W). + score_factor_list (list[Tensor]): Score factors from all scale + levels of a single image, each item has shape + (num_priors * 1, H, W). + mlvl_priors (list[Tensor]): Each element in the list is + the priors of a single level in feature pyramid, has shape + (num_priors, 4). + img_meta (dict): Image meta info. + cfg (mmcv.Config): Test / postprocessing configuration, + if None, test_cfg would be used. + rescale (bool): If True, return boxes in original image space. + Default: False. + with_nms (bool): If True, do nms before return boxes. + Default: True. + + Returns: + tuple[Tensor]: Results of detected bboxes and labels. If with_nms + is False and mlvl_score_factor is None, return mlvl_bboxes and + mlvl_scores, else return mlvl_bboxes, mlvl_scores and + mlvl_score_factor. Usually with_nms is False is used for aug + test. If with_nms is True, then return the following format + + - det_bboxes (Tensor): Predicted bboxes with shape \ + [num_bboxes, 5], where the first 4 columns are bounding \ + box positions (tl_x, tl_y, br_x, br_y) and the 5-th \ + column are scores between 0 and 1. + - det_labels (Tensor): Predicted labels of the corresponding \ + box with shape [num_bboxes]. + """ + cfg = self.test_cfg if cfg is None else cfg + img_shape = img_meta['img_shape'] + nms_pre = cfg.get('nms_pre', -1) + + mlvl_bboxes = [] + mlvl_scores = [] + mlvl_score_factors = [] + for level_idx, (cls_score, bbox_pred, score_factor, priors) in \ + enumerate(zip(cls_score_list, bbox_pred_list, + score_factor_list, mlvl_priors)): + assert cls_score.size()[-2:] == bbox_pred.size()[-2:] + + scores = cls_score.permute(1, 2, 0).reshape( + -1, self.cls_out_channels).sigmoid() + bbox_pred = bbox_pred.permute(1, 2, 0).reshape(-1, 4) + score_factor = score_factor.permute(1, 2, 0).reshape(-1).sigmoid() + + if 0 < nms_pre < scores.shape[0]: + max_scores, _ = (scores * + score_factor[:, None]).sqrt().max(dim=1) + _, topk_inds = max_scores.topk(nms_pre) + priors = priors[topk_inds, :] + bbox_pred = bbox_pred[topk_inds, :] + scores = scores[topk_inds, :] + score_factor = score_factor[topk_inds] + + bboxes = self.bbox_coder.decode( + priors, bbox_pred, max_shape=img_shape) + mlvl_bboxes.append(bboxes) + mlvl_scores.append(scores) + mlvl_score_factors.append(score_factor) + + return self._bbox_post_process(mlvl_scores, mlvl_bboxes, + img_meta['scale_factor'], cfg, rescale, + with_nms, mlvl_score_factors, **kwargs) + + def _bbox_post_process(self, + mlvl_scores, + mlvl_bboxes, + scale_factor, + cfg, + rescale=False, + with_nms=True, + mlvl_score_factors=None, + **kwargs): + """bbox post-processing method. + + The boxes would be rescaled to the original image scale and do + the nms operation. Usually with_nms is False is used for aug test. + + Args: + mlvl_scores (list[Tensor]): Box scores from all scale + levels of a single image, each item has shape + (num_bboxes, num_class). + mlvl_bboxes (list[Tensor]): Decoded bboxes from all scale + levels of a single image, each item has shape (num_bboxes, 4). + scale_factor (ndarray, optional): Scale factor of the image arange + as (w_scale, h_scale, w_scale, h_scale). + cfg (mmcv.Config): Test / postprocessing configuration, + if None, test_cfg would be used. + rescale (bool): If True, return boxes in original image space. + Default: False. + with_nms (bool): If True, do nms before return boxes. + Default: True. + mlvl_score_factors (list[Tensor], optional): Score factor from + all scale levels of a single image, each item has shape + (num_bboxes, ). Default: None. + + Returns: + tuple[Tensor]: Results of detected bboxes and labels. If with_nms + is False and mlvl_score_factor is None, return mlvl_bboxes and + mlvl_scores, else return mlvl_bboxes, mlvl_scores and + mlvl_score_factor. Usually with_nms is False is used for aug + test. If with_nms is True, then return the following format + + - det_bboxes (Tensor): Predicted bboxes with shape \ + [num_bboxes, 5], where the first 4 columns are bounding \ + box positions (tl_x, tl_y, br_x, br_y) and the 5-th \ + column are scores between 0 and 1. + - det_labels (Tensor): Predicted labels of the corresponding \ + box with shape [num_bboxes]. + """ + mlvl_bboxes = torch.cat(mlvl_bboxes) + if rescale: + mlvl_bboxes /= mlvl_bboxes.new_tensor(scale_factor) + mlvl_scores = torch.cat(mlvl_scores) + # Add a dummy background class to the backend when using sigmoid + # remind that we set FG labels to [0, num_class-1] since mmdet v2.0 + # BG cat_id: num_class + padding = mlvl_scores.new_zeros(mlvl_scores.shape[0], 1) + mlvl_scores = torch.cat([mlvl_scores, padding], dim=1) + + mlvl_iou_preds = torch.cat(mlvl_score_factors) + mlvl_nms_scores = (mlvl_scores * mlvl_iou_preds[:, None]).sqrt() + det_bboxes, det_labels = multiclass_nms( + mlvl_bboxes, + mlvl_nms_scores, + cfg.score_thr, + cfg.nms, + cfg.max_per_img, + score_factors=None) + if self.with_score_voting and len(det_bboxes) > 0: + det_bboxes, det_labels = self.score_voting(det_bboxes, det_labels, + mlvl_bboxes, + mlvl_nms_scores, + cfg.score_thr) + + return det_bboxes, det_labels + + def score_voting(self, det_bboxes, det_labels, mlvl_bboxes, + mlvl_nms_scores, score_thr): + """Implementation of score voting method works on each remaining boxes + after NMS procedure. + + Args: + det_bboxes (Tensor): Remaining boxes after NMS procedure, + with shape (k, 5), each dimension means + (x1, y1, x2, y2, score). + det_labels (Tensor): The label of remaining boxes, with shape + (k, 1),Labels are 0-based. + mlvl_bboxes (Tensor): All boxes before the NMS procedure, + with shape (num_anchors,4). + mlvl_nms_scores (Tensor): The scores of all boxes which is used + in the NMS procedure, with shape (num_anchors, num_class) + score_thr (float): The score threshold of bboxes. + + Returns: + tuple: Usually returns a tuple containing voting results. + + - det_bboxes_voted (Tensor): Remaining boxes after + score voting procedure, with shape (k, 5), each + dimension means (x1, y1, x2, y2, score). + - det_labels_voted (Tensor): Label of remaining bboxes + after voting, with shape (num_anchors,). + """ + candidate_mask = mlvl_nms_scores > score_thr + candidate_mask_nonzeros = candidate_mask.nonzero(as_tuple=False) + candidate_inds = candidate_mask_nonzeros[:, 0] + candidate_labels = candidate_mask_nonzeros[:, 1] + candidate_bboxes = mlvl_bboxes[candidate_inds] + candidate_scores = mlvl_nms_scores[candidate_mask] + det_bboxes_voted = [] + det_labels_voted = [] + for cls in range(self.cls_out_channels): + candidate_cls_mask = candidate_labels == cls + if not candidate_cls_mask.any(): + continue + candidate_cls_scores = candidate_scores[candidate_cls_mask] + candidate_cls_bboxes = candidate_bboxes[candidate_cls_mask] + det_cls_mask = det_labels == cls + det_cls_bboxes = det_bboxes[det_cls_mask].view( + -1, det_bboxes.size(-1)) + det_candidate_ious = bbox_overlaps(det_cls_bboxes[:, :4], + candidate_cls_bboxes) + for det_ind in range(len(det_cls_bboxes)): + single_det_ious = det_candidate_ious[det_ind] + pos_ious_mask = single_det_ious > 0.01 + pos_ious = single_det_ious[pos_ious_mask] + pos_bboxes = candidate_cls_bboxes[pos_ious_mask] + pos_scores = candidate_cls_scores[pos_ious_mask] + pis = (torch.exp(-(1 - pos_ious)**2 / 0.025) * + pos_scores)[:, None] + voted_box = torch.sum( + pis * pos_bboxes, dim=0) / torch.sum( + pis, dim=0) + voted_score = det_cls_bboxes[det_ind][-1:][None, :] + det_bboxes_voted.append( + torch.cat((voted_box[None, :], voted_score), dim=1)) + det_labels_voted.append(cls) + + det_bboxes_voted = torch.cat(det_bboxes_voted, dim=0) + det_labels_voted = det_labels.new_tensor(det_labels_voted) + return det_bboxes_voted, det_labels_voted diff --git a/mmdet/models/dense_heads/pisa_retinanet_head.py b/mmdet/models/dense_heads/pisa_retinanet_head.py new file mode 100644 index 0000000..8654ef4 --- /dev/null +++ b/mmdet/models/dense_heads/pisa_retinanet_head.py @@ -0,0 +1,155 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +from mmcv.runner import force_fp32 + +from mmdet.core import images_to_levels +from ..builder import HEADS +from ..losses import carl_loss, isr_p +from .retina_head import RetinaHead + + +@HEADS.register_module() +class PISARetinaHead(RetinaHead): + """PISA Retinanet Head. + + The head owns the same structure with Retinanet Head, but differs in two + aspects: + 1. Importance-based Sample Reweighting Positive (ISR-P) is applied to + change the positive loss weights. + 2. Classification-aware regression loss is adopted as a third loss. + """ + + @force_fp32(apply_to=('cls_scores', 'bbox_preds')) + def loss(self, + cls_scores, + bbox_preds, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Compute losses of the head. + + Args: + cls_scores (list[Tensor]): Box scores for each scale level + Has shape (N, num_anchors * num_classes, H, W) + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level with shape (N, num_anchors * 4, H, W) + gt_bboxes (list[Tensor]): Ground truth bboxes of each image + with shape (num_obj, 4). + gt_labels (list[Tensor]): Ground truth labels of each image + with shape (num_obj, 4). + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (list[Tensor]): Ignored gt bboxes of each image. + Default: None. + + Returns: + dict: Loss dict, comprise classification loss, regression loss and + carl loss. + """ + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + assert len(featmap_sizes) == self.prior_generator.num_levels + + device = cls_scores[0].device + + anchor_list, valid_flag_list = self.get_anchors( + featmap_sizes, img_metas, device=device) + label_channels = self.cls_out_channels if self.use_sigmoid_cls else 1 + cls_reg_targets = self.get_targets( + anchor_list, + valid_flag_list, + gt_bboxes, + img_metas, + gt_bboxes_ignore_list=gt_bboxes_ignore, + gt_labels_list=gt_labels, + label_channels=label_channels, + return_sampling_results=True) + if cls_reg_targets is None: + return None + (labels_list, label_weights_list, bbox_targets_list, bbox_weights_list, + num_total_pos, num_total_neg, sampling_results_list) = cls_reg_targets + num_total_samples = ( + num_total_pos + num_total_neg if self.sampling else num_total_pos) + + # anchor number of multi levels + num_level_anchors = [anchors.size(0) for anchors in anchor_list[0]] + # concat all level anchors and flags to a single tensor + concat_anchor_list = [] + for i in range(len(anchor_list)): + concat_anchor_list.append(torch.cat(anchor_list[i])) + all_anchor_list = images_to_levels(concat_anchor_list, + num_level_anchors) + + num_imgs = len(img_metas) + flatten_cls_scores = [ + cls_score.permute(0, 2, 3, 1).reshape(num_imgs, -1, label_channels) + for cls_score in cls_scores + ] + flatten_cls_scores = torch.cat( + flatten_cls_scores, dim=1).reshape(-1, + flatten_cls_scores[0].size(-1)) + flatten_bbox_preds = [ + bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4) + for bbox_pred in bbox_preds + ] + flatten_bbox_preds = torch.cat( + flatten_bbox_preds, dim=1).view(-1, flatten_bbox_preds[0].size(-1)) + flatten_labels = torch.cat(labels_list, dim=1).reshape(-1) + flatten_label_weights = torch.cat( + label_weights_list, dim=1).reshape(-1) + flatten_anchors = torch.cat(all_anchor_list, dim=1).reshape(-1, 4) + flatten_bbox_targets = torch.cat( + bbox_targets_list, dim=1).reshape(-1, 4) + flatten_bbox_weights = torch.cat( + bbox_weights_list, dim=1).reshape(-1, 4) + + # Apply ISR-P + isr_cfg = self.train_cfg.get('isr', None) + if isr_cfg is not None: + all_targets = (flatten_labels, flatten_label_weights, + flatten_bbox_targets, flatten_bbox_weights) + with torch.no_grad(): + all_targets = isr_p( + flatten_cls_scores, + flatten_bbox_preds, + all_targets, + flatten_anchors, + sampling_results_list, + bbox_coder=self.bbox_coder, + loss_cls=self.loss_cls, + num_class=self.num_classes, + **self.train_cfg.isr) + (flatten_labels, flatten_label_weights, flatten_bbox_targets, + flatten_bbox_weights) = all_targets + + # For convenience we compute loss once instead separating by fpn level, + # so that we don't need to separate the weights by level again. + # The result should be the same + losses_cls = self.loss_cls( + flatten_cls_scores, + flatten_labels, + flatten_label_weights, + avg_factor=num_total_samples) + losses_bbox = self.loss_bbox( + flatten_bbox_preds, + flatten_bbox_targets, + flatten_bbox_weights, + avg_factor=num_total_samples) + loss_dict = dict(loss_cls=losses_cls, loss_bbox=losses_bbox) + + # CARL Loss + carl_cfg = self.train_cfg.get('carl', None) + if carl_cfg is not None: + loss_carl = carl_loss( + flatten_cls_scores, + flatten_labels, + flatten_bbox_preds, + flatten_bbox_targets, + self.loss_bbox, + **self.train_cfg.carl, + avg_factor=num_total_pos, + sigmoid=True, + num_class=self.num_classes) + loss_dict.update(loss_carl) + + return loss_dict diff --git a/mmdet/models/dense_heads/pisa_ssd_head.py b/mmdet/models/dense_heads/pisa_ssd_head.py new file mode 100644 index 0000000..86b67ab --- /dev/null +++ b/mmdet/models/dense_heads/pisa_ssd_head.py @@ -0,0 +1,140 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from mmdet.core import multi_apply +from ..builder import HEADS +from ..losses import CrossEntropyLoss, SmoothL1Loss, carl_loss, isr_p +from .ssd_head import SSDHead + + +# TODO: add loss evaluator for SSD +@HEADS.register_module() +class PISASSDHead(SSDHead): + + def loss(self, + cls_scores, + bbox_preds, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Compute losses of the head. + + Args: + cls_scores (list[Tensor]): Box scores for each scale level + Has shape (N, num_anchors * num_classes, H, W) + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level with shape (N, num_anchors * 4, H, W) + gt_bboxes (list[Tensor]): Ground truth bboxes of each image + with shape (num_obj, 4). + gt_labels (list[Tensor]): Ground truth labels of each image + with shape (num_obj, 4). + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (list[Tensor]): Ignored gt bboxes of each image. + Default: None. + + Returns: + dict: Loss dict, comprise classification loss regression loss and + carl loss. + """ + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + assert len(featmap_sizes) == self.prior_generator.num_levels + + device = cls_scores[0].device + + anchor_list, valid_flag_list = self.get_anchors( + featmap_sizes, img_metas, device=device) + cls_reg_targets = self.get_targets( + anchor_list, + valid_flag_list, + gt_bboxes, + img_metas, + gt_bboxes_ignore_list=gt_bboxes_ignore, + gt_labels_list=gt_labels, + label_channels=1, + unmap_outputs=False, + return_sampling_results=True) + if cls_reg_targets is None: + return None + (labels_list, label_weights_list, bbox_targets_list, bbox_weights_list, + num_total_pos, num_total_neg, sampling_results_list) = cls_reg_targets + + num_images = len(img_metas) + all_cls_scores = torch.cat([ + s.permute(0, 2, 3, 1).reshape( + num_images, -1, self.cls_out_channels) for s in cls_scores + ], 1) + all_labels = torch.cat(labels_list, -1).view(num_images, -1) + all_label_weights = torch.cat(label_weights_list, + -1).view(num_images, -1) + all_bbox_preds = torch.cat([ + b.permute(0, 2, 3, 1).reshape(num_images, -1, 4) + for b in bbox_preds + ], -2) + all_bbox_targets = torch.cat(bbox_targets_list, + -2).view(num_images, -1, 4) + all_bbox_weights = torch.cat(bbox_weights_list, + -2).view(num_images, -1, 4) + + # concat all level anchors to a single tensor + all_anchors = [] + for i in range(num_images): + all_anchors.append(torch.cat(anchor_list[i])) + + isr_cfg = self.train_cfg.get('isr', None) + all_targets = (all_labels.view(-1), all_label_weights.view(-1), + all_bbox_targets.view(-1, + 4), all_bbox_weights.view(-1, 4)) + # apply ISR-P + if isr_cfg is not None: + all_targets = isr_p( + all_cls_scores.view(-1, all_cls_scores.size(-1)), + all_bbox_preds.view(-1, 4), + all_targets, + torch.cat(all_anchors), + sampling_results_list, + loss_cls=CrossEntropyLoss(), + bbox_coder=self.bbox_coder, + **self.train_cfg.isr, + num_class=self.num_classes) + (new_labels, new_label_weights, new_bbox_targets, + new_bbox_weights) = all_targets + all_labels = new_labels.view(all_labels.shape) + all_label_weights = new_label_weights.view(all_label_weights.shape) + all_bbox_targets = new_bbox_targets.view(all_bbox_targets.shape) + all_bbox_weights = new_bbox_weights.view(all_bbox_weights.shape) + + # add CARL loss + carl_loss_cfg = self.train_cfg.get('carl', None) + if carl_loss_cfg is not None: + loss_carl = carl_loss( + all_cls_scores.view(-1, all_cls_scores.size(-1)), + all_targets[0], + all_bbox_preds.view(-1, 4), + all_targets[2], + SmoothL1Loss(beta=1.), + **self.train_cfg.carl, + avg_factor=num_total_pos, + num_class=self.num_classes) + + # check NaN and Inf + assert torch.isfinite(all_cls_scores).all().item(), \ + 'classification scores become infinite or NaN!' + assert torch.isfinite(all_bbox_preds).all().item(), \ + 'bbox predications become infinite or NaN!' + + losses_cls, losses_bbox = multi_apply( + self.loss_single, + all_cls_scores, + all_bbox_preds, + all_anchors, + all_labels, + all_label_weights, + all_bbox_targets, + all_bbox_weights, + num_total_samples=num_total_pos) + loss_dict = dict(loss_cls=losses_cls, loss_bbox=losses_bbox) + if carl_loss_cfg is not None: + loss_dict.update(loss_carl) + return loss_dict diff --git a/mmdet/models/dense_heads/reppoints_head.py b/mmdet/models/dense_heads/reppoints_head.py new file mode 100644 index 0000000..f720414 --- /dev/null +++ b/mmdet/models/dense_heads/reppoints_head.py @@ -0,0 +1,764 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule +from mmcv.ops import DeformConv2d + +from mmdet.core import (build_assigner, build_sampler, images_to_levels, + multi_apply, unmap) +from mmdet.core.anchor.point_generator import MlvlPointGenerator +from mmdet.core.utils import filter_scores_and_topk +from ..builder import HEADS, build_loss +from .anchor_free_head import AnchorFreeHead + + +@HEADS.register_module() +class RepPointsHead(AnchorFreeHead): + """RepPoint head. + + Args: + point_feat_channels (int): Number of channels of points features. + gradient_mul (float): The multiplier to gradients from + points refinement and recognition. + point_strides (Iterable): points strides. + point_base_scale (int): bbox scale for assigning labels. + loss_cls (dict): Config of classification loss. + loss_bbox_init (dict): Config of initial points loss. + loss_bbox_refine (dict): Config of points loss in refinement. + use_grid_points (bool): If we use bounding box representation, the + reppoints is represented as grid points on the bounding box. + center_init (bool): Whether to use center point assignment. + transform_method (str): The methods to transform RepPoints to bbox. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ # noqa: W605 + + def __init__(self, + num_classes, + in_channels, + point_feat_channels=256, + num_points=9, + gradient_mul=0.1, + point_strides=[8, 16, 32, 64, 128], + point_base_scale=4, + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox_init=dict( + type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=0.5), + loss_bbox_refine=dict( + type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.0), + use_grid_points=False, + center_init=True, + transform_method='moment', + moment_mul=0.01, + init_cfg=dict( + type='Normal', + layer='Conv2d', + std=0.01, + override=dict( + type='Normal', + name='reppoints_cls_out', + std=0.01, + bias_prob=0.01)), + **kwargs): + self.num_points = num_points + self.point_feat_channels = point_feat_channels + self.use_grid_points = use_grid_points + self.center_init = center_init + + # we use deform conv to extract points features + self.dcn_kernel = int(np.sqrt(num_points)) + self.dcn_pad = int((self.dcn_kernel - 1) / 2) + assert self.dcn_kernel * self.dcn_kernel == num_points, \ + 'The points number should be a square number.' + assert self.dcn_kernel % 2 == 1, \ + 'The points number should be an odd square number.' + dcn_base = np.arange(-self.dcn_pad, + self.dcn_pad + 1).astype(np.float64) + dcn_base_y = np.repeat(dcn_base, self.dcn_kernel) + dcn_base_x = np.tile(dcn_base, self.dcn_kernel) + dcn_base_offset = np.stack([dcn_base_y, dcn_base_x], axis=1).reshape( + (-1)) + self.dcn_base_offset = torch.tensor(dcn_base_offset).view(1, -1, 1, 1) + + super().__init__( + num_classes, + in_channels, + loss_cls=loss_cls, + init_cfg=init_cfg, + **kwargs) + + self.gradient_mul = gradient_mul + self.point_base_scale = point_base_scale + self.point_strides = point_strides + self.prior_generator = MlvlPointGenerator( + self.point_strides, offset=0.) + + self.sampling = loss_cls['type'] not in ['FocalLoss'] + if self.train_cfg: + self.init_assigner = build_assigner(self.train_cfg.init.assigner) + self.refine_assigner = build_assigner( + self.train_cfg.refine.assigner) + # use PseudoSampler when sampling is False + if self.sampling and hasattr(self.train_cfg, 'sampler'): + sampler_cfg = self.train_cfg.sampler + else: + sampler_cfg = dict(type='PseudoSampler') + self.sampler = build_sampler(sampler_cfg, context=self) + self.transform_method = transform_method + if self.transform_method == 'moment': + self.moment_transfer = nn.Parameter( + data=torch.zeros(2), requires_grad=True) + self.moment_mul = moment_mul + + self.use_sigmoid_cls = loss_cls.get('use_sigmoid', False) + if self.use_sigmoid_cls: + self.cls_out_channels = self.num_classes + else: + self.cls_out_channels = self.num_classes + 1 + self.loss_bbox_init = build_loss(loss_bbox_init) + self.loss_bbox_refine = build_loss(loss_bbox_refine) + + def _init_layers(self): + """Initialize layers of the head.""" + self.relu = nn.ReLU(inplace=True) + self.cls_convs = nn.ModuleList() + self.reg_convs = nn.ModuleList() + for i in range(self.stacked_convs): + chn = self.in_channels if i == 0 else self.feat_channels + self.cls_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg)) + self.reg_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg)) + pts_out_dim = 4 if self.use_grid_points else 2 * self.num_points + self.reppoints_cls_conv = DeformConv2d(self.feat_channels, + self.point_feat_channels, + self.dcn_kernel, 1, + self.dcn_pad) + self.reppoints_cls_out = nn.Conv2d(self.point_feat_channels, + self.cls_out_channels, 1, 1, 0) + self.reppoints_pts_init_conv = nn.Conv2d(self.feat_channels, + self.point_feat_channels, 3, + 1, 1) + self.reppoints_pts_init_out = nn.Conv2d(self.point_feat_channels, + pts_out_dim, 1, 1, 0) + self.reppoints_pts_refine_conv = DeformConv2d(self.feat_channels, + self.point_feat_channels, + self.dcn_kernel, 1, + self.dcn_pad) + self.reppoints_pts_refine_out = nn.Conv2d(self.point_feat_channels, + pts_out_dim, 1, 1, 0) + + def points2bbox(self, pts, y_first=True): + """Converting the points set into bounding box. + + :param pts: the input points sets (fields), each points + set (fields) is represented as 2n scalar. + :param y_first: if y_first=True, the point set is represented as + [y1, x1, y2, x2 ... yn, xn], otherwise the point set is + represented as [x1, y1, x2, y2 ... xn, yn]. + :return: each points set is converting to a bbox [x1, y1, x2, y2]. + """ + pts_reshape = pts.view(pts.shape[0], -1, 2, *pts.shape[2:]) + pts_y = pts_reshape[:, :, 0, ...] if y_first else pts_reshape[:, :, 1, + ...] + pts_x = pts_reshape[:, :, 1, ...] if y_first else pts_reshape[:, :, 0, + ...] + if self.transform_method == 'minmax': + bbox_left = pts_x.min(dim=1, keepdim=True)[0] + bbox_right = pts_x.max(dim=1, keepdim=True)[0] + bbox_up = pts_y.min(dim=1, keepdim=True)[0] + bbox_bottom = pts_y.max(dim=1, keepdim=True)[0] + bbox = torch.cat([bbox_left, bbox_up, bbox_right, bbox_bottom], + dim=1) + elif self.transform_method == 'partial_minmax': + pts_y = pts_y[:, :4, ...] + pts_x = pts_x[:, :4, ...] + bbox_left = pts_x.min(dim=1, keepdim=True)[0] + bbox_right = pts_x.max(dim=1, keepdim=True)[0] + bbox_up = pts_y.min(dim=1, keepdim=True)[0] + bbox_bottom = pts_y.max(dim=1, keepdim=True)[0] + bbox = torch.cat([bbox_left, bbox_up, bbox_right, bbox_bottom], + dim=1) + elif self.transform_method == 'moment': + pts_y_mean = pts_y.mean(dim=1, keepdim=True) + pts_x_mean = pts_x.mean(dim=1, keepdim=True) + pts_y_std = torch.std(pts_y - pts_y_mean, dim=1, keepdim=True) + pts_x_std = torch.std(pts_x - pts_x_mean, dim=1, keepdim=True) + moment_transfer = (self.moment_transfer * self.moment_mul) + ( + self.moment_transfer.detach() * (1 - self.moment_mul)) + moment_width_transfer = moment_transfer[0] + moment_height_transfer = moment_transfer[1] + half_width = pts_x_std * torch.exp(moment_width_transfer) + half_height = pts_y_std * torch.exp(moment_height_transfer) + bbox = torch.cat([ + pts_x_mean - half_width, pts_y_mean - half_height, + pts_x_mean + half_width, pts_y_mean + half_height + ], + dim=1) + else: + raise NotImplementedError + return bbox + + def gen_grid_from_reg(self, reg, previous_boxes): + """Base on the previous bboxes and regression values, we compute the + regressed bboxes and generate the grids on the bboxes. + + :param reg: the regression value to previous bboxes. + :param previous_boxes: previous bboxes. + :return: generate grids on the regressed bboxes. + """ + b, _, h, w = reg.shape + bxy = (previous_boxes[:, :2, ...] + previous_boxes[:, 2:, ...]) / 2. + bwh = (previous_boxes[:, 2:, ...] - + previous_boxes[:, :2, ...]).clamp(min=1e-6) + grid_topleft = bxy + bwh * reg[:, :2, ...] - 0.5 * bwh * torch.exp( + reg[:, 2:, ...]) + grid_wh = bwh * torch.exp(reg[:, 2:, ...]) + grid_left = grid_topleft[:, [0], ...] + grid_top = grid_topleft[:, [1], ...] + grid_width = grid_wh[:, [0], ...] + grid_height = grid_wh[:, [1], ...] + intervel = torch.linspace(0., 1., self.dcn_kernel).view( + 1, self.dcn_kernel, 1, 1).type_as(reg) + grid_x = grid_left + grid_width * intervel + grid_x = grid_x.unsqueeze(1).repeat(1, self.dcn_kernel, 1, 1, 1) + grid_x = grid_x.view(b, -1, h, w) + grid_y = grid_top + grid_height * intervel + grid_y = grid_y.unsqueeze(2).repeat(1, 1, self.dcn_kernel, 1, 1) + grid_y = grid_y.view(b, -1, h, w) + grid_yx = torch.stack([grid_y, grid_x], dim=2) + grid_yx = grid_yx.view(b, -1, h, w) + regressed_bbox = torch.cat([ + grid_left, grid_top, grid_left + grid_width, grid_top + grid_height + ], 1) + return grid_yx, regressed_bbox + + def forward(self, feats): + return multi_apply(self.forward_single, feats) + + def forward_single(self, x): + """Forward feature map of a single FPN level.""" + dcn_base_offset = self.dcn_base_offset.type_as(x) + # If we use center_init, the initial reppoints is from center points. + # If we use bounding bbox representation, the initial reppoints is + # from regular grid placed on a pre-defined bbox. + if self.use_grid_points or not self.center_init: + scale = self.point_base_scale / 2 + points_init = dcn_base_offset / dcn_base_offset.max() * scale + bbox_init = x.new_tensor([-scale, -scale, scale, + scale]).view(1, 4, 1, 1) + else: + points_init = 0 + cls_feat = x + pts_feat = x + for cls_conv in self.cls_convs: + cls_feat = cls_conv(cls_feat) + for reg_conv in self.reg_convs: + pts_feat = reg_conv(pts_feat) + # initialize reppoints + pts_out_init = self.reppoints_pts_init_out( + self.relu(self.reppoints_pts_init_conv(pts_feat))) + if self.use_grid_points: + pts_out_init, bbox_out_init = self.gen_grid_from_reg( + pts_out_init, bbox_init.detach()) + else: + pts_out_init = pts_out_init + points_init + # refine and classify reppoints + pts_out_init_grad_mul = (1 - self.gradient_mul) * pts_out_init.detach( + ) + self.gradient_mul * pts_out_init + dcn_offset = pts_out_init_grad_mul - dcn_base_offset + cls_out = self.reppoints_cls_out( + self.relu(self.reppoints_cls_conv(cls_feat, dcn_offset))) + pts_out_refine = self.reppoints_pts_refine_out( + self.relu(self.reppoints_pts_refine_conv(pts_feat, dcn_offset))) + if self.use_grid_points: + pts_out_refine, bbox_out_refine = self.gen_grid_from_reg( + pts_out_refine, bbox_out_init.detach()) + else: + pts_out_refine = pts_out_refine + pts_out_init.detach() + + if self.training: + return cls_out, pts_out_init, pts_out_refine + else: + return cls_out, self.points2bbox(pts_out_refine) + + def get_points(self, featmap_sizes, img_metas, device): + """Get points according to feature map sizes. + + Args: + featmap_sizes (list[tuple]): Multi-level feature map sizes. + img_metas (list[dict]): Image meta info. + + Returns: + tuple: points of each image, valid flags of each image + """ + num_imgs = len(img_metas) + + # since feature map sizes of all images are the same, we only compute + # points center for one time + multi_level_points = self.prior_generator.grid_priors( + featmap_sizes, device=device, with_stride=True) + points_list = [[point.clone() for point in multi_level_points] + for _ in range(num_imgs)] + + # for each image, we compute valid flags of multi level grids + valid_flag_list = [] + for img_id, img_meta in enumerate(img_metas): + multi_level_flags = self.prior_generator.valid_flags( + featmap_sizes, img_meta['pad_shape']) + valid_flag_list.append(multi_level_flags) + + return points_list, valid_flag_list + + def centers_to_bboxes(self, point_list): + """Get bboxes according to center points. + + Only used in :class:`MaxIoUAssigner`. + """ + bbox_list = [] + for i_img, point in enumerate(point_list): + bbox = [] + for i_lvl in range(len(self.point_strides)): + scale = self.point_base_scale * self.point_strides[i_lvl] * 0.5 + bbox_shift = torch.Tensor([-scale, -scale, scale, + scale]).view(1, 4).type_as(point[0]) + bbox_center = torch.cat( + [point[i_lvl][:, :2], point[i_lvl][:, :2]], dim=1) + bbox.append(bbox_center + bbox_shift) + bbox_list.append(bbox) + return bbox_list + + def offset_to_pts(self, center_list, pred_list): + """Change from point offset to point coordinate.""" + pts_list = [] + for i_lvl in range(len(self.point_strides)): + pts_lvl = [] + for i_img in range(len(center_list)): + pts_center = center_list[i_img][i_lvl][:, :2].repeat( + 1, self.num_points) + pts_shift = pred_list[i_lvl][i_img] + yx_pts_shift = pts_shift.permute(1, 2, 0).view( + -1, 2 * self.num_points) + y_pts_shift = yx_pts_shift[..., 0::2] + x_pts_shift = yx_pts_shift[..., 1::2] + xy_pts_shift = torch.stack([x_pts_shift, y_pts_shift], -1) + xy_pts_shift = xy_pts_shift.view(*yx_pts_shift.shape[:-1], -1) + pts = xy_pts_shift * self.point_strides[i_lvl] + pts_center + pts_lvl.append(pts) + pts_lvl = torch.stack(pts_lvl, 0) + pts_list.append(pts_lvl) + return pts_list + + def _point_target_single(self, + flat_proposals, + valid_flags, + gt_bboxes, + gt_bboxes_ignore, + gt_labels, + stage='init', + unmap_outputs=True): + inside_flags = valid_flags + if not inside_flags.any(): + return (None, ) * 7 + # assign gt and sample proposals + proposals = flat_proposals[inside_flags, :] + + if stage == 'init': + assigner = self.init_assigner + pos_weight = self.train_cfg.init.pos_weight + else: + assigner = self.refine_assigner + pos_weight = self.train_cfg.refine.pos_weight + assign_result = assigner.assign(proposals, gt_bboxes, gt_bboxes_ignore, + None if self.sampling else gt_labels) + sampling_result = self.sampler.sample(assign_result, proposals, + gt_bboxes) + + num_valid_proposals = proposals.shape[0] + bbox_gt = proposals.new_zeros([num_valid_proposals, 4]) + pos_proposals = torch.zeros_like(proposals) + proposals_weights = proposals.new_zeros([num_valid_proposals, 4]) + labels = proposals.new_full((num_valid_proposals, ), + self.num_classes, + dtype=torch.long) + label_weights = proposals.new_zeros( + num_valid_proposals, dtype=torch.float) + + pos_inds = sampling_result.pos_inds + neg_inds = sampling_result.neg_inds + if len(pos_inds) > 0: + pos_gt_bboxes = sampling_result.pos_gt_bboxes + bbox_gt[pos_inds, :] = pos_gt_bboxes + pos_proposals[pos_inds, :] = proposals[pos_inds, :] + proposals_weights[pos_inds, :] = 1.0 + if gt_labels is None: + # Only rpn gives gt_labels as None + # Foreground is the first class + labels[pos_inds] = 0 + else: + labels[pos_inds] = gt_labels[ + sampling_result.pos_assigned_gt_inds] + if pos_weight <= 0: + label_weights[pos_inds] = 1.0 + else: + label_weights[pos_inds] = pos_weight + if len(neg_inds) > 0: + label_weights[neg_inds] = 1.0 + + # map up to original set of proposals + if unmap_outputs: + num_total_proposals = flat_proposals.size(0) + labels = unmap(labels, num_total_proposals, inside_flags) + label_weights = unmap(label_weights, num_total_proposals, + inside_flags) + bbox_gt = unmap(bbox_gt, num_total_proposals, inside_flags) + pos_proposals = unmap(pos_proposals, num_total_proposals, + inside_flags) + proposals_weights = unmap(proposals_weights, num_total_proposals, + inside_flags) + + return (labels, label_weights, bbox_gt, pos_proposals, + proposals_weights, pos_inds, neg_inds) + + def get_targets(self, + proposals_list, + valid_flag_list, + gt_bboxes_list, + img_metas, + gt_bboxes_ignore_list=None, + gt_labels_list=None, + stage='init', + label_channels=1, + unmap_outputs=True): + """Compute corresponding GT box and classification targets for + proposals. + + Args: + proposals_list (list[list]): Multi level points/bboxes of each + image. + valid_flag_list (list[list]): Multi level valid flags of each + image. + gt_bboxes_list (list[Tensor]): Ground truth bboxes of each image. + img_metas (list[dict]): Meta info of each image. + gt_bboxes_ignore_list (list[Tensor]): Ground truth bboxes to be + ignored. + gt_bboxes_list (list[Tensor]): Ground truth labels of each box. + stage (str): `init` or `refine`. Generate target for init stage or + refine stage + label_channels (int): Channel of label. + unmap_outputs (bool): Whether to map outputs back to the original + set of anchors. + + Returns: + tuple: + - labels_list (list[Tensor]): Labels of each level. + - label_weights_list (list[Tensor]): Label weights of each level. # noqa: E501 + - bbox_gt_list (list[Tensor]): Ground truth bbox of each level. + - proposal_list (list[Tensor]): Proposals(points/bboxes) of each level. # noqa: E501 + - proposal_weights_list (list[Tensor]): Proposal weights of each level. # noqa: E501 + - num_total_pos (int): Number of positive samples in all images. # noqa: E501 + - num_total_neg (int): Number of negative samples in all images. # noqa: E501 + """ + assert stage in ['init', 'refine'] + num_imgs = len(img_metas) + assert len(proposals_list) == len(valid_flag_list) == num_imgs + + # points number of multi levels + num_level_proposals = [points.size(0) for points in proposals_list[0]] + + # concat all level points and flags to a single tensor + for i in range(num_imgs): + assert len(proposals_list[i]) == len(valid_flag_list[i]) + proposals_list[i] = torch.cat(proposals_list[i]) + valid_flag_list[i] = torch.cat(valid_flag_list[i]) + + # compute targets for each image + if gt_bboxes_ignore_list is None: + gt_bboxes_ignore_list = [None for _ in range(num_imgs)] + if gt_labels_list is None: + gt_labels_list = [None for _ in range(num_imgs)] + (all_labels, all_label_weights, all_bbox_gt, all_proposals, + all_proposal_weights, pos_inds_list, neg_inds_list) = multi_apply( + self._point_target_single, + proposals_list, + valid_flag_list, + gt_bboxes_list, + gt_bboxes_ignore_list, + gt_labels_list, + stage=stage, + unmap_outputs=unmap_outputs) + # no valid points + if any([labels is None for labels in all_labels]): + return None + # sampled points of all images + num_total_pos = sum([max(inds.numel(), 1) for inds in pos_inds_list]) + num_total_neg = sum([max(inds.numel(), 1) for inds in neg_inds_list]) + labels_list = images_to_levels(all_labels, num_level_proposals) + label_weights_list = images_to_levels(all_label_weights, + num_level_proposals) + bbox_gt_list = images_to_levels(all_bbox_gt, num_level_proposals) + proposals_list = images_to_levels(all_proposals, num_level_proposals) + proposal_weights_list = images_to_levels(all_proposal_weights, + num_level_proposals) + return (labels_list, label_weights_list, bbox_gt_list, proposals_list, + proposal_weights_list, num_total_pos, num_total_neg) + + def loss_single(self, cls_score, pts_pred_init, pts_pred_refine, labels, + label_weights, bbox_gt_init, bbox_weights_init, + bbox_gt_refine, bbox_weights_refine, stride, + num_total_samples_init, num_total_samples_refine): + # classification loss + labels = labels.reshape(-1) + label_weights = label_weights.reshape(-1) + cls_score = cls_score.permute(0, 2, 3, + 1).reshape(-1, self.cls_out_channels) + cls_score = cls_score.contiguous() + loss_cls = self.loss_cls( + cls_score, + labels, + label_weights, + avg_factor=num_total_samples_refine) + + # points loss + bbox_gt_init = bbox_gt_init.reshape(-1, 4) + bbox_weights_init = bbox_weights_init.reshape(-1, 4) + bbox_pred_init = self.points2bbox( + pts_pred_init.reshape(-1, 2 * self.num_points), y_first=False) + bbox_gt_refine = bbox_gt_refine.reshape(-1, 4) + bbox_weights_refine = bbox_weights_refine.reshape(-1, 4) + bbox_pred_refine = self.points2bbox( + pts_pred_refine.reshape(-1, 2 * self.num_points), y_first=False) + normalize_term = self.point_base_scale * stride + loss_pts_init = self.loss_bbox_init( + bbox_pred_init / normalize_term, + bbox_gt_init / normalize_term, + bbox_weights_init, + avg_factor=num_total_samples_init) + loss_pts_refine = self.loss_bbox_refine( + bbox_pred_refine / normalize_term, + bbox_gt_refine / normalize_term, + bbox_weights_refine, + avg_factor=num_total_samples_refine) + return loss_cls, loss_pts_init, loss_pts_refine + + def loss(self, + cls_scores, + pts_preds_init, + pts_preds_refine, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + device = cls_scores[0].device + label_channels = self.cls_out_channels if self.use_sigmoid_cls else 1 + + # target for initial stage + center_list, valid_flag_list = self.get_points(featmap_sizes, + img_metas, device) + pts_coordinate_preds_init = self.offset_to_pts(center_list, + pts_preds_init) + if self.train_cfg.init.assigner['type'] == 'PointAssigner': + # Assign target for center list + candidate_list = center_list + else: + # transform center list to bbox list and + # assign target for bbox list + bbox_list = self.centers_to_bboxes(center_list) + candidate_list = bbox_list + cls_reg_targets_init = self.get_targets( + candidate_list, + valid_flag_list, + gt_bboxes, + img_metas, + gt_bboxes_ignore_list=gt_bboxes_ignore, + gt_labels_list=gt_labels, + stage='init', + label_channels=label_channels) + (*_, bbox_gt_list_init, candidate_list_init, bbox_weights_list_init, + num_total_pos_init, num_total_neg_init) = cls_reg_targets_init + num_total_samples_init = ( + num_total_pos_init + + num_total_neg_init if self.sampling else num_total_pos_init) + + # target for refinement stage + center_list, valid_flag_list = self.get_points(featmap_sizes, + img_metas, device) + pts_coordinate_preds_refine = self.offset_to_pts( + center_list, pts_preds_refine) + bbox_list = [] + for i_img, center in enumerate(center_list): + bbox = [] + for i_lvl in range(len(pts_preds_refine)): + bbox_preds_init = self.points2bbox( + pts_preds_init[i_lvl].detach()) + bbox_shift = bbox_preds_init * self.point_strides[i_lvl] + bbox_center = torch.cat( + [center[i_lvl][:, :2], center[i_lvl][:, :2]], dim=1) + bbox.append(bbox_center + + bbox_shift[i_img].permute(1, 2, 0).reshape(-1, 4)) + bbox_list.append(bbox) + cls_reg_targets_refine = self.get_targets( + bbox_list, + valid_flag_list, + gt_bboxes, + img_metas, + gt_bboxes_ignore_list=gt_bboxes_ignore, + gt_labels_list=gt_labels, + stage='refine', + label_channels=label_channels) + (labels_list, label_weights_list, bbox_gt_list_refine, + candidate_list_refine, bbox_weights_list_refine, num_total_pos_refine, + num_total_neg_refine) = cls_reg_targets_refine + num_total_samples_refine = ( + num_total_pos_refine + + num_total_neg_refine if self.sampling else num_total_pos_refine) + + # compute loss + losses_cls, losses_pts_init, losses_pts_refine = multi_apply( + self.loss_single, + cls_scores, + pts_coordinate_preds_init, + pts_coordinate_preds_refine, + labels_list, + label_weights_list, + bbox_gt_list_init, + bbox_weights_list_init, + bbox_gt_list_refine, + bbox_weights_list_refine, + self.point_strides, + num_total_samples_init=num_total_samples_init, + num_total_samples_refine=num_total_samples_refine) + loss_dict_all = { + 'loss_cls': losses_cls, + 'loss_pts_init': losses_pts_init, + 'loss_pts_refine': losses_pts_refine + } + return loss_dict_all + + # Same as base_dense_head/_get_bboxes_single except self._bbox_decode + def _get_bboxes_single(self, + cls_score_list, + bbox_pred_list, + score_factor_list, + mlvl_priors, + img_meta, + cfg, + rescale=False, + with_nms=True, + **kwargs): + """Transform outputs of a single image into bbox predictions. + + Args: + cls_score_list (list[Tensor]): Box scores from all scale + levels of a single image, each item has shape + (num_priors * num_classes, H, W). + bbox_pred_list (list[Tensor]): Box energies / deltas from + all scale levels of a single image, each item has shape + (num_priors * 4, H, W). + score_factor_list (list[Tensor]): Score factor from all scale + levels of a single image. RepPoints head does not need + this value. + mlvl_priors (list[Tensor]): Each element in the list is + the priors of a single level in feature pyramid, has shape + (num_priors, 2). + img_meta (dict): Image meta info. + cfg (mmcv.Config): Test / postprocessing configuration, + if None, test_cfg would be used. + rescale (bool): If True, return boxes in original image space. + Default: False. + with_nms (bool): If True, do nms before return boxes. + Default: True. + + Returns: + tuple[Tensor]: Results of detected bboxes and labels. If with_nms + is False and mlvl_score_factor is None, return mlvl_bboxes and + mlvl_scores, else return mlvl_bboxes, mlvl_scores and + mlvl_score_factor. Usually with_nms is False is used for aug + test. If with_nms is True, then return the following format + + - det_bboxes (Tensor): Predicted bboxes with shape \ + [num_bboxes, 5], where the first 4 columns are bounding \ + box positions (tl_x, tl_y, br_x, br_y) and the 5-th \ + column are scores between 0 and 1. + - det_labels (Tensor): Predicted labels of the corresponding \ + box with shape [num_bboxes]. + """ + cfg = self.test_cfg if cfg is None else cfg + assert len(cls_score_list) == len(bbox_pred_list) + img_shape = img_meta['img_shape'] + nms_pre = cfg.get('nms_pre', -1) + + mlvl_bboxes = [] + mlvl_scores = [] + mlvl_labels = [] + for level_idx, (cls_score, bbox_pred, priors) in enumerate( + zip(cls_score_list, bbox_pred_list, mlvl_priors)): + assert cls_score.size()[-2:] == bbox_pred.size()[-2:] + bbox_pred = bbox_pred.permute(1, 2, 0).reshape(-1, 4) + + cls_score = cls_score.permute(1, 2, + 0).reshape(-1, self.cls_out_channels) + if self.use_sigmoid_cls: + scores = cls_score.sigmoid() + else: + scores = cls_score.softmax(-1)[:, :-1] + + # After https://github.com/open-mmlab/mmdetection/pull/6268/, + # this operation keeps fewer bboxes under the same `nms_pre`. + # There is no difference in performance for most models. If you + # find a slight drop in performance, you can set a larger + # `nms_pre` than before. + results = filter_scores_and_topk( + scores, cfg.score_thr, nms_pre, + dict(bbox_pred=bbox_pred, priors=priors)) + scores, labels, _, filtered_results = results + + bbox_pred = filtered_results['bbox_pred'] + priors = filtered_results['priors'] + + bboxes = self._bbox_decode(priors, bbox_pred, + self.point_strides[level_idx], + img_shape) + + mlvl_bboxes.append(bboxes) + mlvl_scores.append(scores) + mlvl_labels.append(labels) + + return self._bbox_post_process( + mlvl_scores, + mlvl_labels, + mlvl_bboxes, + img_meta['scale_factor'], + cfg, + rescale=rescale, + with_nms=with_nms) + + def _bbox_decode(self, points, bbox_pred, stride, max_shape): + bbox_pos_center = torch.cat([points[:, :2], points[:, :2]], dim=1) + bboxes = bbox_pred * stride + bbox_pos_center + x1 = bboxes[:, 0].clamp(min=0, max=max_shape[1]) + y1 = bboxes[:, 1].clamp(min=0, max=max_shape[0]) + x2 = bboxes[:, 2].clamp(min=0, max=max_shape[1]) + y2 = bboxes[:, 3].clamp(min=0, max=max_shape[0]) + decoded_bboxes = torch.stack([x1, y1, x2, y2], dim=-1) + return decoded_bboxes diff --git a/mmdet/models/dense_heads/retina_head.py b/mmdet/models/dense_heads/retina_head.py new file mode 100644 index 0000000..bd04f73 --- /dev/null +++ b/mmdet/models/dense_heads/retina_head.py @@ -0,0 +1,191 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +from mmcv.cnn import build_norm_layer, ConvModule +import global_placeholder +from ..builder import HEADS +from .anchor_head import AnchorHead + +class ModuleListDial(nn.ModuleList): + def __init__(self, modules=None): + super(ModuleListDial, self).__init__(modules) + self.cur_position = 0 + + def forward(self, x): + result = self[self.cur_position](x) + self.cur_position += 1 + if self.cur_position >= len(self): + self.cur_position = 0 + return result + +@HEADS.register_module() +class RetinaHead(AnchorHead): + r"""An anchor-based head used in `RetinaNet + `_. + + The head contains two subnetworks. The first classifies anchor boxes and + the second regresses deltas for the anchors. + + Example: + >>> import torch + >>> self = RetinaHead(11, 7) + >>> x = torch.rand(1, 7, 32, 32) + >>> cls_score, bbox_pred = self.forward_single(x) + >>> # Each anchor predicts a score for each class except background + >>> cls_per_anchor = cls_score.shape[1] / self.num_anchors + >>> box_per_anchor = bbox_pred.shape[1] / self.num_anchors + >>> assert cls_per_anchor == (self.num_classes) + >>> assert box_per_anchor == 4 + """ + + def __init__(self, + num_classes, + in_channels, + stacked_convs=4, + conv_cfg=None, + norm_cfg=None, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + init_cfg=dict( + type='Normal', + layer='Conv2d', + std=0.01, + override=dict( + type='Normal', + name='retina_cls', + std=0.01, + bias_prob=0.01)), + **kwargs): + self.stacked_convs = stacked_convs + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + super(RetinaHead, self).__init__( + num_classes, + in_channels, + anchor_generator=anchor_generator, + init_cfg=init_cfg, + **kwargs) + + def _init_layers(self): + """Initialize layers of the head.""" + self.relu = nn.ReLU(inplace=True) + self.cls_convs = nn.ModuleList() + self.reg_convs = nn.ModuleList() + + if global_placeholder.aqd_mode != 0: + self.norm_cfg = dict(type='BN', requires_grad=True) + + for i in range(self.stacked_convs): + chn = self.in_channels if i == 0 else self.feat_channels + self.cls_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg)) + self.reg_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg)) + # if i == 0: + # self.norm_cfg = dict(type='BN', requires_grad=True) + # else: + # self.norm_cfg = None + # # self.norm_cfg = None + + if global_placeholder.aqd_mode != 0: + # 启动AQD模式 + self.num_levels = global_placeholder.aqd_mode + + lega = self.cls_convs[-1].bn + self.cls_convs[-1].bn = ModuleListDial( + [build_norm_layer(self.norm_cfg, self.feat_channels)[-1] for _ in range(self.num_levels) + ]) + del lega # 删除,避免占内存(强迫症 + + lega = self.reg_convs[-1].bn + self.reg_convs[-1].bn = ModuleListDial( + [build_norm_layer(self.norm_cfg, self.feat_channels)[-1] for _ in range(self.num_levels) + ]) + del lega + + self.retina_cls = nn.Conv2d( + self.feat_channels, + self.num_base_priors * self.cls_out_channels, + 3, + padding=1) + self.retina_reg = nn.Conv2d( + self.feat_channels, self.num_base_priors * 4, 3, padding=1) + + + def forward(self, feats): # forward_single直接改成forward,应该不会有啥影响 + """Forward feature of a single scale level. + + Args: + x (Tensor): Features of a single scale level. + + Returns: + tuple: + cls_score (Tensor): Cls scores for a single scale level + the channels number is num_anchors * num_classes. + bbox_pred (Tensor): Box energies / deltas for a single scale + level, the channels number is num_anchors * 4. + """ + cls_scores = [] + bbox_preds = [] + if hasattr(self,'in_num') and self.in_num == 5: + feats = [feats[0], feats[1], feats[2], feats[3], feats[4]] + elif hasattr(self,'in_num'): + raise NotImplementedError + else: + self.in_num = 5 + feats = [feats[0], feats[1], feats[2], feats[3], feats[4]] + + for x in feats: + cls_feat = x + reg_feat = x + for cls_conv in self.cls_convs: + cls_feat = cls_conv(cls_feat) + for reg_conv in self.reg_convs: + reg_feat = reg_conv(reg_feat) + cls_score = self.retina_cls(cls_feat) + bbox_pred = self.retina_reg(reg_feat) + cls_scores.append(cls_score) + bbox_preds.append(bbox_pred) + + return cls_scores, bbox_preds + + + def forward_single(self, x): + """Forward feature of a single scale level. + + Args: + x (Tensor): Features of a single scale level. + + Returns: + tuple: + cls_score (Tensor): Cls scores for a single scale level + the channels number is num_anchors * num_classes. + bbox_pred (Tensor): Box energies / deltas for a single scale + level, the channels number is num_anchors * 4. + """ + cls_feat = x + reg_feat = x + for cls_conv in self.cls_convs: + cls_feat = cls_conv(cls_feat) + for reg_conv in self.reg_convs: + reg_feat = reg_conv(reg_feat) + cls_score = self.retina_cls(cls_feat) + bbox_pred = self.retina_reg(reg_feat) + return cls_score, bbox_pred diff --git a/mmdet/models/dense_heads/retina_sepbn_head.py b/mmdet/models/dense_heads/retina_sepbn_head.py new file mode 100644 index 0000000..b385c61 --- /dev/null +++ b/mmdet/models/dense_heads/retina_sepbn_head.py @@ -0,0 +1,118 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +from mmcv.cnn import ConvModule, bias_init_with_prob, normal_init + +from ..builder import HEADS +from .anchor_head import AnchorHead + + +@HEADS.register_module() +class RetinaSepBNHead(AnchorHead): + """"RetinaHead with separate BN. + + In RetinaHead, conv/norm layers are shared across different FPN levels, + while in RetinaSepBNHead, conv layers are shared across different FPN + levels, but BN layers are separated. + """ + + def __init__(self, + num_classes, + num_ins, + in_channels, + stacked_convs=4, + conv_cfg=None, + norm_cfg=None, + init_cfg=None, + **kwargs): + assert init_cfg is None, 'To prevent abnormal initialization ' \ + 'behavior, init_cfg is not allowed to be set' + self.stacked_convs = stacked_convs + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.num_ins = num_ins + super(RetinaSepBNHead, self).__init__( + num_classes, in_channels, init_cfg=init_cfg, **kwargs) + + def _init_layers(self): + """Initialize layers of the head.""" + self.relu = nn.ReLU(inplace=True) + self.cls_convs = nn.ModuleList() + self.reg_convs = nn.ModuleList() + for i in range(self.num_ins): + cls_convs = nn.ModuleList() + reg_convs = nn.ModuleList() + for i in range(self.stacked_convs): + chn = self.in_channels if i == 0 else self.feat_channels + cls_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg)) + reg_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg)) + self.cls_convs.append(cls_convs) + self.reg_convs.append(reg_convs) + for i in range(self.stacked_convs): + for j in range(1, self.num_ins): + self.cls_convs[j][i].conv = self.cls_convs[0][i].conv + self.reg_convs[j][i].conv = self.reg_convs[0][i].conv + self.retina_cls = nn.Conv2d( + self.feat_channels, + self.num_base_priors * self.cls_out_channels, + 3, + padding=1) + self.retina_reg = nn.Conv2d( + self.feat_channels, self.num_base_priors * 4, 3, padding=1) + + def init_weights(self): + """Initialize weights of the head.""" + super(RetinaSepBNHead, self).init_weights() + for m in self.cls_convs[0]: + normal_init(m.conv, std=0.01) + for m in self.reg_convs[0]: + normal_init(m.conv, std=0.01) + bias_cls = bias_init_with_prob(0.01) + normal_init(self.retina_cls, std=0.01, bias=bias_cls) + normal_init(self.retina_reg, std=0.01) + + def forward(self, feats): + """Forward features from the upstream network. + + Args: + feats (tuple[Tensor]): Features from the upstream network, each is + a 4D-tensor. + + Returns: + tuple: Usually a tuple of classification scores and bbox prediction + cls_scores (list[Tensor]): Classification scores for all scale + levels, each is a 4D-tensor, the channels number is + num_anchors * num_classes. + bbox_preds (list[Tensor]): Box energies / deltas for all scale + levels, each is a 4D-tensor, the channels number is + num_anchors * 4. + """ + cls_scores = [] + bbox_preds = [] + for i, x in enumerate(feats): + cls_feat = feats[i] + reg_feat = feats[i] + for cls_conv in self.cls_convs[i]: + cls_feat = cls_conv(cls_feat) + for reg_conv in self.reg_convs[i]: + reg_feat = reg_conv(reg_feat) + cls_score = self.retina_cls(cls_feat) + bbox_pred = self.retina_reg(reg_feat) + cls_scores.append(cls_score) + bbox_preds.append(bbox_pred) + return cls_scores, bbox_preds diff --git a/mmdet/models/dense_heads/rpn_head.py b/mmdet/models/dense_heads/rpn_head.py new file mode 100644 index 0000000..a6577d6 --- /dev/null +++ b/mmdet/models/dense_heads/rpn_head.py @@ -0,0 +1,288 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule +from mmcv.ops import batched_nms + +from ..builder import HEADS +from .anchor_head import AnchorHead + + +@HEADS.register_module() +class RPNHead(AnchorHead): + """RPN head. + + Args: + in_channels (int): Number of channels in the input feature map. + init_cfg (dict or list[dict], optional): Initialization config dict. + num_convs (int): Number of convolution layers in the head. Default 1. + """ # noqa: W605 + + def __init__(self, + in_channels, + init_cfg=dict(type='Normal', layer='Conv2d', std=0.01), + num_convs=1, + **kwargs): + self.num_convs = num_convs + super(RPNHead, self).__init__( + 1, in_channels, init_cfg=init_cfg, **kwargs) + + def _init_layers(self): + """Initialize layers of the head.""" + if self.num_convs > 1: + rpn_convs = [] + for i in range(self.num_convs): + if i == 0: + in_channels = self.in_channels + else: + in_channels = self.feat_channels + # use ``inplace=False`` to avoid error: one of the variables + # needed for gradient computation has been modified by an + # inplace operation. + rpn_convs.append( + ConvModule( + in_channels, + self.feat_channels, + 3, + padding=1, + inplace=False)) + self.rpn_conv = nn.Sequential(*rpn_convs) + else: + self.rpn_conv = nn.Conv2d( + self.in_channels, self.feat_channels, 3, padding=1) + self.rpn_cls = nn.Conv2d(self.feat_channels, + self.num_base_priors * self.cls_out_channels, + 1) + self.rpn_reg = nn.Conv2d(self.feat_channels, self.num_base_priors * 4, + 1) + + def forward_single(self, x): + """Forward feature map of a single scale level.""" + x = self.rpn_conv(x) + x = F.relu(x, inplace=False) + rpn_cls_score = self.rpn_cls(x) + rpn_bbox_pred = self.rpn_reg(x) + return rpn_cls_score, rpn_bbox_pred + + + def forward(self, feats): + """Forward feature map of all scale levels.""" + + rpn_cls_scores = [] + rpn_bbox_preds = [] + if hasattr(self,'in_num') and self.in_num == 5: + feats = [feats[0], feats[1], feats[2], feats[3], feats[4]] + elif hasattr(self,'in_num'): + raise NotImplementedError + else: + self.in_num = 5 + feats = [feats[0], feats[1], feats[2], feats[3], feats[4]] + + for x in feats: + x = self.rpn_conv(x) + x = F.relu(x, inplace=False) + rpn_cls_score = self.rpn_cls(x) + rpn_bbox_pred = self.rpn_reg(x) + rpn_cls_scores.append(rpn_cls_score) + rpn_bbox_preds.append(rpn_bbox_pred) + return rpn_cls_scores, rpn_bbox_preds + + # def loss(self, + # cls_scores, + # bbox_preds, + # gt_bboxes, + # img_metas, + # gt_bboxes_ignore=None): + # """Compute losses of the head. + + # Args: + # cls_scores (list[Tensor]): Box scores for each scale level + # Has shape (N, num_anchors * num_classes, H, W) + # bbox_preds (list[Tensor]): Box energies / deltas for each scale + # level with shape (N, num_anchors * 4, H, W) + # gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + # shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + # img_metas (list[dict]): Meta information of each image, e.g., + # image size, scaling factor, etc. + # gt_bboxes_ignore (None | list[Tensor]): specify which bounding + # boxes can be ignored when computing the loss. + + # Returns: + # dict[str, Tensor]: A dictionary of loss components. + # """ + # losses = super(RPNHead, self).loss( + # cls_scores, + # bbox_preds, + # gt_bboxes, + # None, + # img_metas, + # gt_bboxes_ignore=gt_bboxes_ignore) + # return dict( + # loss_rpn_cls=losses['loss_cls'], loss_rpn_bbox=losses['loss_bbox']) + + def _get_bboxes_single(self, + cls_score_list, + bbox_pred_list, + score_factor_list, + mlvl_anchors, + img_meta, + cfg, + rescale=False, + with_nms=True, + **kwargs): + """Transform outputs of a single image into bbox predictions. + + Args: + cls_score_list (list[Tensor]): Box scores from all scale + levels of a single image, each item has shape + (num_anchors * num_classes, H, W). + bbox_pred_list (list[Tensor]): Box energies / deltas from + all scale levels of a single image, each item has + shape (num_anchors * 4, H, W). + score_factor_list (list[Tensor]): Score factor from all scale + levels of a single image. RPN head does not need this value. + mlvl_anchors (list[Tensor]): Anchors of all scale level + each item has shape (num_anchors, 4). + img_meta (dict): Image meta info. + cfg (mmcv.Config): Test / postprocessing configuration, + if None, test_cfg would be used. + rescale (bool): If True, return boxes in original image space. + Default: False. + with_nms (bool): If True, do nms before return boxes. + Default: True. + + Returns: + Tensor: Labeled boxes in shape (n, 5), where the first 4 columns + are bounding box positions (tl_x, tl_y, br_x, br_y) and the + 5-th column is a score between 0 and 1. + """ + cfg = self.test_cfg if cfg is None else cfg + cfg = copy.deepcopy(cfg) + img_shape = img_meta['img_shape'] + + # bboxes from different level should be independent during NMS, + # level_ids are used as labels for batched NMS to separate them + level_ids = [] + mlvl_scores = [] + mlvl_bbox_preds = [] + mlvl_valid_anchors = [] + nms_pre = cfg.get('nms_pre', -1) + for level_idx in range(len(cls_score_list)): + rpn_cls_score = cls_score_list[level_idx] + rpn_bbox_pred = bbox_pred_list[level_idx] + assert rpn_cls_score.size()[-2:] == rpn_bbox_pred.size()[-2:] + rpn_cls_score = rpn_cls_score.permute(1, 2, 0) + if self.use_sigmoid_cls: + rpn_cls_score = rpn_cls_score.reshape(-1) + scores = rpn_cls_score.sigmoid() + else: + rpn_cls_score = rpn_cls_score.reshape(-1, 2) + # We set FG labels to [0, num_class-1] and BG label to + # num_class in RPN head since mmdet v2.5, which is unified to + # be consistent with other head since mmdet v2.0. In mmdet v2.0 + # to v2.4 we keep BG label as 0 and FG label as 1 in rpn head. + scores = rpn_cls_score.softmax(dim=1)[:, 0] + rpn_bbox_pred = rpn_bbox_pred.permute(1, 2, 0).reshape(-1, 4) + + anchors = mlvl_anchors[level_idx] + if 0 < nms_pre < scores.shape[0]: + # sort is faster than topk + # _, topk_inds = scores.topk(cfg.nms_pre) + ranked_scores, rank_inds = scores.sort(descending=True) + topk_inds = rank_inds[:nms_pre] + scores = ranked_scores[:nms_pre] + rpn_bbox_pred = rpn_bbox_pred[topk_inds, :] + anchors = anchors[topk_inds, :] + + mlvl_scores.append(scores) + mlvl_bbox_preds.append(rpn_bbox_pred) + mlvl_valid_anchors.append(anchors) + level_ids.append( + scores.new_full((scores.size(0), ), + level_idx, + dtype=torch.long)) + + return self._bbox_post_process(mlvl_scores, mlvl_bbox_preds, + mlvl_valid_anchors, level_ids, cfg, + img_shape) + + def _bbox_post_process(self, mlvl_scores, mlvl_bboxes, mlvl_valid_anchors, + level_ids, cfg, img_shape, **kwargs): + """bbox post-processing method. + + Do the nms operation for bboxes in same level. + + Args: + mlvl_scores (list[Tensor]): Box scores from all scale + levels of a single image, each item has shape + (num_bboxes, ). + mlvl_bboxes (list[Tensor]): Decoded bboxes from all scale + levels of a single image, each item has shape (num_bboxes, 4). + mlvl_valid_anchors (list[Tensor]): Anchors of all scale level + each item has shape (num_bboxes, 4). + level_ids (list[Tensor]): Indexes from all scale levels of a + single image, each item has shape (num_bboxes, ). + cfg (mmcv.Config): Test / postprocessing configuration, + if None, `self.test_cfg` would be used. + img_shape (tuple(int)): The shape of model's input image. + + Returns: + Tensor: Labeled boxes in shape (n, 5), where the first 4 columns + are bounding box positions (tl_x, tl_y, br_x, br_y) and the + 5-th column is a score between 0 and 1. + """ + scores = torch.cat(mlvl_scores) + anchors = torch.cat(mlvl_valid_anchors) + rpn_bbox_pred = torch.cat(mlvl_bboxes) + proposals = self.bbox_coder.decode( + anchors, rpn_bbox_pred, max_shape=img_shape) + ids = torch.cat(level_ids) + + if cfg.min_bbox_size >= 0: + w = proposals[:, 2] - proposals[:, 0] + h = proposals[:, 3] - proposals[:, 1] + valid_mask = (w > cfg.min_bbox_size) & (h > cfg.min_bbox_size) + if not valid_mask.all(): + proposals = proposals[valid_mask] + scores = scores[valid_mask] + ids = ids[valid_mask] + + if proposals.numel() > 0: + dets, _ = batched_nms(proposals, scores, ids, cfg.nms) + else: + return proposals.new_zeros(0, 5) + + return dets[:cfg.max_per_img] + + def onnx_export(self, x, img_metas): + """Test without augmentation. + + Args: + x (tuple[Tensor]): Features from the upstream network, each is + a 4D-tensor. + img_metas (list[dict]): Meta info of each image. + Returns: + Tensor: dets of shape [N, num_det, 5]. + """ + cls_scores, bbox_preds = self(x) + + assert len(cls_scores) == len(bbox_preds) + + batch_bboxes, batch_scores = super(RPNHead, self).onnx_export( + cls_scores, bbox_preds, img_metas=img_metas, with_nms=False) + # Use ONNX::NonMaxSuppression in deployment + from mmdet.core.export import add_dummy_nms_for_onnx + cfg = copy.deepcopy(self.test_cfg) + score_threshold = cfg.nms.get('score_thr', 0.0) + nms_pre = cfg.get('deploy_nms_pre', -1) + # Different from the normal forward doing NMS level by level, + # we do NMS across all levels when exporting ONNX. + dets, _ = add_dummy_nms_for_onnx(batch_bboxes, batch_scores, + cfg.max_per_img, + cfg.nms.iou_threshold, + score_threshold, nms_pre, + cfg.max_per_img) + return dets diff --git a/mmdet/models/dense_heads/sabl_retina_head.py b/mmdet/models/dense_heads/sabl_retina_head.py new file mode 100644 index 0000000..4fede71 --- /dev/null +++ b/mmdet/models/dense_heads/sabl_retina_head.py @@ -0,0 +1,630 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import numpy as np +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule +from mmcv.runner import force_fp32 + +from mmdet.core import (build_assigner, build_bbox_coder, + build_prior_generator, build_sampler, images_to_levels, + multi_apply, unmap) +from mmdet.core.utils import filter_scores_and_topk +from ..builder import HEADS, build_loss +from .base_dense_head import BaseDenseHead +from .dense_test_mixins import BBoxTestMixin +from .guided_anchor_head import GuidedAnchorHead + + +@HEADS.register_module() +class SABLRetinaHead(BaseDenseHead, BBoxTestMixin): + """Side-Aware Boundary Localization (SABL) for RetinaNet. + + The anchor generation, assigning and sampling in SABLRetinaHead + are the same as GuidedAnchorHead for guided anchoring. + + Please refer to https://arxiv.org/abs/1912.04260 for more details. + + Args: + num_classes (int): Number of classes. + in_channels (int): Number of channels in the input feature map. + stacked_convs (int): Number of Convs for classification \ + and regression branches. Defaults to 4. + feat_channels (int): Number of hidden channels. \ + Defaults to 256. + approx_anchor_generator (dict): Config dict for approx generator. + square_anchor_generator (dict): Config dict for square generator. + conv_cfg (dict): Config dict for ConvModule. Defaults to None. + norm_cfg (dict): Config dict for Norm Layer. Defaults to None. + bbox_coder (dict): Config dict for bbox coder. + reg_decoded_bbox (bool): If true, the regression loss would be + applied directly on decoded bounding boxes, converting both + the predicted boxes and regression targets to absolute + coordinates format. Default False. It should be `True` when + using `IoULoss`, `GIoULoss`, or `DIoULoss` in the bbox head. + train_cfg (dict): Training config of SABLRetinaHead. + test_cfg (dict): Testing config of SABLRetinaHead. + loss_cls (dict): Config of classification loss. + loss_bbox_cls (dict): Config of classification loss for bbox branch. + loss_bbox_reg (dict): Config of regression loss for bbox branch. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + num_classes, + in_channels, + stacked_convs=4, + feat_channels=256, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[4], + strides=[8, 16, 32, 64, 128]), + conv_cfg=None, + norm_cfg=None, + bbox_coder=dict( + type='BucketingBBoxCoder', + num_buckets=14, + scale_factor=3.0), + reg_decoded_bbox=False, + train_cfg=None, + test_cfg=None, + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=1.5), + loss_bbox_reg=dict( + type='SmoothL1Loss', beta=1.0 / 9.0, loss_weight=1.5), + init_cfg=dict( + type='Normal', + layer='Conv2d', + std=0.01, + override=dict( + type='Normal', + name='retina_cls', + std=0.01, + bias_prob=0.01))): + super(SABLRetinaHead, self).__init__(init_cfg) + self.in_channels = in_channels + self.num_classes = num_classes + self.feat_channels = feat_channels + self.num_buckets = bbox_coder['num_buckets'] + self.side_num = int(np.ceil(self.num_buckets / 2)) + + assert (approx_anchor_generator['octave_base_scale'] == + square_anchor_generator['scales'][0]) + assert (approx_anchor_generator['strides'] == + square_anchor_generator['strides']) + + self.approx_anchor_generator = build_prior_generator( + approx_anchor_generator) + self.square_anchor_generator = build_prior_generator( + square_anchor_generator) + self.approxs_per_octave = ( + self.approx_anchor_generator.num_base_priors[0]) + + # one anchor per location + self.num_base_priors = self.square_anchor_generator.num_base_priors[0] + + self.stacked_convs = stacked_convs + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + + self.reg_decoded_bbox = reg_decoded_bbox + + self.use_sigmoid_cls = loss_cls.get('use_sigmoid', False) + self.sampling = loss_cls['type'] not in [ + 'FocalLoss', 'GHMC', 'QualityFocalLoss' + ] + if self.use_sigmoid_cls: + self.cls_out_channels = num_classes + else: + self.cls_out_channels = num_classes + 1 + + self.bbox_coder = build_bbox_coder(bbox_coder) + self.loss_cls = build_loss(loss_cls) + self.loss_bbox_cls = build_loss(loss_bbox_cls) + self.loss_bbox_reg = build_loss(loss_bbox_reg) + + self.train_cfg = train_cfg + self.test_cfg = test_cfg + + if self.train_cfg: + self.assigner = build_assigner(self.train_cfg.assigner) + # use PseudoSampler when sampling is False + if self.sampling and hasattr(self.train_cfg, 'sampler'): + sampler_cfg = self.train_cfg.sampler + else: + sampler_cfg = dict(type='PseudoSampler') + self.sampler = build_sampler(sampler_cfg, context=self) + + self.fp16_enabled = False + self._init_layers() + + @property + def num_anchors(self): + warnings.warn('DeprecationWarning: `num_anchors` is deprecated, ' + 'please use "num_base_priors" instead') + return self.square_anchor_generator.num_base_priors[0] + + def _init_layers(self): + self.relu = nn.ReLU(inplace=True) + self.cls_convs = nn.ModuleList() + self.reg_convs = nn.ModuleList() + for i in range(self.stacked_convs): + chn = self.in_channels if i == 0 else self.feat_channels + self.cls_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg)) + self.reg_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg)) + self.retina_cls = nn.Conv2d( + self.feat_channels, self.cls_out_channels, 3, padding=1) + self.retina_bbox_reg = nn.Conv2d( + self.feat_channels, self.side_num * 4, 3, padding=1) + self.retina_bbox_cls = nn.Conv2d( + self.feat_channels, self.side_num * 4, 3, padding=1) + + def forward_single(self, x): + cls_feat = x + reg_feat = x + for cls_conv in self.cls_convs: + cls_feat = cls_conv(cls_feat) + for reg_conv in self.reg_convs: + reg_feat = reg_conv(reg_feat) + cls_score = self.retina_cls(cls_feat) + bbox_cls_pred = self.retina_bbox_cls(reg_feat) + bbox_reg_pred = self.retina_bbox_reg(reg_feat) + bbox_pred = (bbox_cls_pred, bbox_reg_pred) + return cls_score, bbox_pred + + def forward(self, feats): + return multi_apply(self.forward_single, feats) + + def get_anchors(self, featmap_sizes, img_metas, device='cuda'): + """Get squares according to feature map sizes and guided anchors. + + Args: + featmap_sizes (list[tuple]): Multi-level feature map sizes. + img_metas (list[dict]): Image meta info. + device (torch.device | str): device for returned tensors + + Returns: + tuple: square approxs of each image + """ + num_imgs = len(img_metas) + + # since feature map sizes of all images are the same, we only compute + # squares for one time + multi_level_squares = self.square_anchor_generator.grid_priors( + featmap_sizes, device=device) + squares_list = [multi_level_squares for _ in range(num_imgs)] + + return squares_list + + def get_target(self, + approx_list, + inside_flag_list, + square_list, + gt_bboxes_list, + img_metas, + gt_bboxes_ignore_list=None, + gt_labels_list=None, + label_channels=None, + sampling=True, + unmap_outputs=True): + """Compute bucketing targets. + Args: + approx_list (list[list]): Multi level approxs of each image. + inside_flag_list (list[list]): Multi level inside flags of each + image. + square_list (list[list]): Multi level squares of each image. + gt_bboxes_list (list[Tensor]): Ground truth bboxes of each image. + img_metas (list[dict]): Meta info of each image. + gt_bboxes_ignore_list (list[Tensor]): ignore list of gt bboxes. + gt_bboxes_list (list[Tensor]): Gt bboxes of each image. + label_channels (int): Channel of label. + sampling (bool): Sample Anchors or not. + unmap_outputs (bool): unmap outputs or not. + + Returns: + tuple: Returns a tuple containing learning targets. + + - labels_list (list[Tensor]): Labels of each level. + - label_weights_list (list[Tensor]): Label weights of each \ + level. + - bbox_cls_targets_list (list[Tensor]): BBox cls targets of \ + each level. + - bbox_cls_weights_list (list[Tensor]): BBox cls weights of \ + each level. + - bbox_reg_targets_list (list[Tensor]): BBox reg targets of \ + each level. + - bbox_reg_weights_list (list[Tensor]): BBox reg weights of \ + each level. + - num_total_pos (int): Number of positive samples in all \ + images. + - num_total_neg (int): Number of negative samples in all \ + images. + """ + num_imgs = len(img_metas) + assert len(approx_list) == len(inside_flag_list) == len( + square_list) == num_imgs + # anchor number of multi levels + num_level_squares = [squares.size(0) for squares in square_list[0]] + # concat all level anchors and flags to a single tensor + inside_flag_flat_list = [] + approx_flat_list = [] + square_flat_list = [] + for i in range(num_imgs): + assert len(square_list[i]) == len(inside_flag_list[i]) + inside_flag_flat_list.append(torch.cat(inside_flag_list[i])) + approx_flat_list.append(torch.cat(approx_list[i])) + square_flat_list.append(torch.cat(square_list[i])) + + # compute targets for each image + if gt_bboxes_ignore_list is None: + gt_bboxes_ignore_list = [None for _ in range(num_imgs)] + if gt_labels_list is None: + gt_labels_list = [None for _ in range(num_imgs)] + (all_labels, all_label_weights, all_bbox_cls_targets, + all_bbox_cls_weights, all_bbox_reg_targets, all_bbox_reg_weights, + pos_inds_list, neg_inds_list) = multi_apply( + self._get_target_single, + approx_flat_list, + inside_flag_flat_list, + square_flat_list, + gt_bboxes_list, + gt_bboxes_ignore_list, + gt_labels_list, + img_metas, + label_channels=label_channels, + sampling=sampling, + unmap_outputs=unmap_outputs) + # no valid anchors + if any([labels is None for labels in all_labels]): + return None + # sampled anchors of all images + num_total_pos = sum([max(inds.numel(), 1) for inds in pos_inds_list]) + num_total_neg = sum([max(inds.numel(), 1) for inds in neg_inds_list]) + # split targets to a list w.r.t. multiple levels + labels_list = images_to_levels(all_labels, num_level_squares) + label_weights_list = images_to_levels(all_label_weights, + num_level_squares) + bbox_cls_targets_list = images_to_levels(all_bbox_cls_targets, + num_level_squares) + bbox_cls_weights_list = images_to_levels(all_bbox_cls_weights, + num_level_squares) + bbox_reg_targets_list = images_to_levels(all_bbox_reg_targets, + num_level_squares) + bbox_reg_weights_list = images_to_levels(all_bbox_reg_weights, + num_level_squares) + return (labels_list, label_weights_list, bbox_cls_targets_list, + bbox_cls_weights_list, bbox_reg_targets_list, + bbox_reg_weights_list, num_total_pos, num_total_neg) + + def _get_target_single(self, + flat_approxs, + inside_flags, + flat_squares, + gt_bboxes, + gt_bboxes_ignore, + gt_labels, + img_meta, + label_channels=None, + sampling=True, + unmap_outputs=True): + """Compute regression and classification targets for anchors in a + single image. + + Args: + flat_approxs (Tensor): flat approxs of a single image, + shape (n, 4) + inside_flags (Tensor): inside flags of a single image, + shape (n, ). + flat_squares (Tensor): flat squares of a single image, + shape (approxs_per_octave * n, 4) + gt_bboxes (Tensor): Ground truth bboxes of a single image, \ + shape (num_gts, 4). + gt_bboxes_ignore (Tensor): Ground truth bboxes to be + ignored, shape (num_ignored_gts, 4). + gt_labels (Tensor): Ground truth labels of each box, + shape (num_gts,). + img_meta (dict): Meta info of the image. + label_channels (int): Channel of label. + sampling (bool): Sample Anchors or not. + unmap_outputs (bool): unmap outputs or not. + + Returns: + tuple: + + - labels_list (Tensor): Labels in a single image + - label_weights (Tensor): Label weights in a single image + - bbox_cls_targets (Tensor): BBox cls targets in a single image + - bbox_cls_weights (Tensor): BBox cls weights in a single image + - bbox_reg_targets (Tensor): BBox reg targets in a single image + - bbox_reg_weights (Tensor): BBox reg weights in a single image + - num_total_pos (int): Number of positive samples \ + in a single image + - num_total_neg (int): Number of negative samples \ + in a single image + """ + if not inside_flags.any(): + return (None, ) * 8 + # assign gt and sample anchors + expand_inside_flags = inside_flags[:, None].expand( + -1, self.approxs_per_octave).reshape(-1) + approxs = flat_approxs[expand_inside_flags, :] + squares = flat_squares[inside_flags, :] + + assign_result = self.assigner.assign(approxs, squares, + self.approxs_per_octave, + gt_bboxes, gt_bboxes_ignore) + sampling_result = self.sampler.sample(assign_result, squares, + gt_bboxes) + + num_valid_squares = squares.shape[0] + bbox_cls_targets = squares.new_zeros( + (num_valid_squares, self.side_num * 4)) + bbox_cls_weights = squares.new_zeros( + (num_valid_squares, self.side_num * 4)) + bbox_reg_targets = squares.new_zeros( + (num_valid_squares, self.side_num * 4)) + bbox_reg_weights = squares.new_zeros( + (num_valid_squares, self.side_num * 4)) + labels = squares.new_full((num_valid_squares, ), + self.num_classes, + dtype=torch.long) + label_weights = squares.new_zeros(num_valid_squares, dtype=torch.float) + + pos_inds = sampling_result.pos_inds + neg_inds = sampling_result.neg_inds + if len(pos_inds) > 0: + (pos_bbox_reg_targets, pos_bbox_reg_weights, pos_bbox_cls_targets, + pos_bbox_cls_weights) = self.bbox_coder.encode( + sampling_result.pos_bboxes, sampling_result.pos_gt_bboxes) + + bbox_cls_targets[pos_inds, :] = pos_bbox_cls_targets + bbox_reg_targets[pos_inds, :] = pos_bbox_reg_targets + bbox_cls_weights[pos_inds, :] = pos_bbox_cls_weights + bbox_reg_weights[pos_inds, :] = pos_bbox_reg_weights + if gt_labels is None: + # Only rpn gives gt_labels as None + # Foreground is the first class + labels[pos_inds] = 0 + else: + labels[pos_inds] = gt_labels[ + sampling_result.pos_assigned_gt_inds] + if self.train_cfg.pos_weight <= 0: + label_weights[pos_inds] = 1.0 + else: + label_weights[pos_inds] = self.train_cfg.pos_weight + if len(neg_inds) > 0: + label_weights[neg_inds] = 1.0 + + # map up to original set of anchors + if unmap_outputs: + num_total_anchors = flat_squares.size(0) + labels = unmap( + labels, num_total_anchors, inside_flags, fill=self.num_classes) + label_weights = unmap(label_weights, num_total_anchors, + inside_flags) + bbox_cls_targets = unmap(bbox_cls_targets, num_total_anchors, + inside_flags) + bbox_cls_weights = unmap(bbox_cls_weights, num_total_anchors, + inside_flags) + bbox_reg_targets = unmap(bbox_reg_targets, num_total_anchors, + inside_flags) + bbox_reg_weights = unmap(bbox_reg_weights, num_total_anchors, + inside_flags) + return (labels, label_weights, bbox_cls_targets, bbox_cls_weights, + bbox_reg_targets, bbox_reg_weights, pos_inds, neg_inds) + + def loss_single(self, cls_score, bbox_pred, labels, label_weights, + bbox_cls_targets, bbox_cls_weights, bbox_reg_targets, + bbox_reg_weights, num_total_samples): + # classification loss + labels = labels.reshape(-1) + label_weights = label_weights.reshape(-1) + cls_score = cls_score.permute(0, 2, 3, + 1).reshape(-1, self.cls_out_channels) + loss_cls = self.loss_cls( + cls_score, labels, label_weights, avg_factor=num_total_samples) + # regression loss + bbox_cls_targets = bbox_cls_targets.reshape(-1, self.side_num * 4) + bbox_cls_weights = bbox_cls_weights.reshape(-1, self.side_num * 4) + bbox_reg_targets = bbox_reg_targets.reshape(-1, self.side_num * 4) + bbox_reg_weights = bbox_reg_weights.reshape(-1, self.side_num * 4) + (bbox_cls_pred, bbox_reg_pred) = bbox_pred + bbox_cls_pred = bbox_cls_pred.permute(0, 2, 3, 1).reshape( + -1, self.side_num * 4) + bbox_reg_pred = bbox_reg_pred.permute(0, 2, 3, 1).reshape( + -1, self.side_num * 4) + loss_bbox_cls = self.loss_bbox_cls( + bbox_cls_pred, + bbox_cls_targets.long(), + bbox_cls_weights, + avg_factor=num_total_samples * 4 * self.side_num) + loss_bbox_reg = self.loss_bbox_reg( + bbox_reg_pred, + bbox_reg_targets, + bbox_reg_weights, + avg_factor=num_total_samples * 4 * self.bbox_coder.offset_topk) + return loss_cls, loss_bbox_cls, loss_bbox_reg + + @force_fp32(apply_to=('cls_scores', 'bbox_preds')) + def loss(self, + cls_scores, + bbox_preds, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + assert len(featmap_sizes) == self.approx_anchor_generator.num_levels + + device = cls_scores[0].device + + # get sampled approxes + approxs_list, inside_flag_list = GuidedAnchorHead.get_sampled_approxs( + self, featmap_sizes, img_metas, device=device) + + square_list = self.get_anchors(featmap_sizes, img_metas, device=device) + + label_channels = self.cls_out_channels if self.use_sigmoid_cls else 1 + + cls_reg_targets = self.get_target( + approxs_list, + inside_flag_list, + square_list, + gt_bboxes, + img_metas, + gt_bboxes_ignore_list=gt_bboxes_ignore, + gt_labels_list=gt_labels, + label_channels=label_channels, + sampling=self.sampling) + if cls_reg_targets is None: + return None + (labels_list, label_weights_list, bbox_cls_targets_list, + bbox_cls_weights_list, bbox_reg_targets_list, bbox_reg_weights_list, + num_total_pos, num_total_neg) = cls_reg_targets + num_total_samples = ( + num_total_pos + num_total_neg if self.sampling else num_total_pos) + losses_cls, losses_bbox_cls, losses_bbox_reg = multi_apply( + self.loss_single, + cls_scores, + bbox_preds, + labels_list, + label_weights_list, + bbox_cls_targets_list, + bbox_cls_weights_list, + bbox_reg_targets_list, + bbox_reg_weights_list, + num_total_samples=num_total_samples) + return dict( + loss_cls=losses_cls, + loss_bbox_cls=losses_bbox_cls, + loss_bbox_reg=losses_bbox_reg) + + @force_fp32(apply_to=('cls_scores', 'bbox_preds')) + def get_bboxes(self, + cls_scores, + bbox_preds, + img_metas, + cfg=None, + rescale=False): + assert len(cls_scores) == len(bbox_preds) + num_levels = len(cls_scores) + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + + device = cls_scores[0].device + mlvl_anchors = self.get_anchors( + featmap_sizes, img_metas, device=device) + result_list = [] + for img_id in range(len(img_metas)): + cls_score_list = [ + cls_scores[i][img_id].detach() for i in range(num_levels) + ] + bbox_cls_pred_list = [ + bbox_preds[i][0][img_id].detach() for i in range(num_levels) + ] + bbox_reg_pred_list = [ + bbox_preds[i][1][img_id].detach() for i in range(num_levels) + ] + img_shape = img_metas[img_id]['img_shape'] + scale_factor = img_metas[img_id]['scale_factor'] + proposals = self._get_bboxes_single( + cls_score_list, bbox_cls_pred_list, bbox_reg_pred_list, + mlvl_anchors[img_id], img_shape, scale_factor, cfg, rescale) + result_list.append(proposals) + return result_list + + def _get_bboxes_single(self, + cls_scores, + bbox_cls_preds, + bbox_reg_preds, + mlvl_anchors, + img_shape, + scale_factor, + cfg, + rescale=False): + cfg = self.test_cfg if cfg is None else cfg + nms_pre = cfg.get('nms_pre', -1) + + mlvl_bboxes = [] + mlvl_scores = [] + mlvl_confids = [] + mlvl_labels = [] + assert len(cls_scores) == len(bbox_cls_preds) == len( + bbox_reg_preds) == len(mlvl_anchors) + for cls_score, bbox_cls_pred, bbox_reg_pred, anchors in zip( + cls_scores, bbox_cls_preds, bbox_reg_preds, mlvl_anchors): + assert cls_score.size()[-2:] == bbox_cls_pred.size( + )[-2:] == bbox_reg_pred.size()[-2::] + cls_score = cls_score.permute(1, 2, + 0).reshape(-1, self.cls_out_channels) + if self.use_sigmoid_cls: + scores = cls_score.sigmoid() + else: + scores = cls_score.softmax(-1)[:, :-1] + bbox_cls_pred = bbox_cls_pred.permute(1, 2, 0).reshape( + -1, self.side_num * 4) + bbox_reg_pred = bbox_reg_pred.permute(1, 2, 0).reshape( + -1, self.side_num * 4) + + # After https://github.com/open-mmlab/mmdetection/pull/6268/, + # this operation keeps fewer bboxes under the same `nms_pre`. + # There is no difference in performance for most models. If you + # find a slight drop in performance, you can set a larger + # `nms_pre` than before. + results = filter_scores_and_topk( + scores, cfg.score_thr, nms_pre, + dict( + anchors=anchors, + bbox_cls_pred=bbox_cls_pred, + bbox_reg_pred=bbox_reg_pred)) + scores, labels, _, filtered_results = results + + anchors = filtered_results['anchors'] + bbox_cls_pred = filtered_results['bbox_cls_pred'] + bbox_reg_pred = filtered_results['bbox_reg_pred'] + + bbox_preds = [ + bbox_cls_pred.contiguous(), + bbox_reg_pred.contiguous() + ] + bboxes, confids = self.bbox_coder.decode( + anchors.contiguous(), bbox_preds, max_shape=img_shape) + + mlvl_bboxes.append(bboxes) + mlvl_scores.append(scores) + mlvl_confids.append(confids) + mlvl_labels.append(labels) + return self._bbox_post_process(mlvl_scores, mlvl_labels, mlvl_bboxes, + scale_factor, cfg, rescale, True, + mlvl_confids) diff --git a/mmdet/models/dense_heads/solo_head.py b/mmdet/models/dense_heads/solo_head.py new file mode 100644 index 0000000..e89aacb --- /dev/null +++ b/mmdet/models/dense_heads/solo_head.py @@ -0,0 +1,1197 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule + +from mmdet.core import InstanceData, mask_matrix_nms, multi_apply +from mmdet.core.utils import center_of_mass, generate_coordinate +from mmdet.models.builder import HEADS, build_loss +from mmdet.utils.misc import floordiv +from .base_mask_head import BaseMaskHead + + +@HEADS.register_module() +class SOLOHead(BaseMaskHead): + """SOLO mask head used in `SOLO: Segmenting Objects by Locations. + + `_ + + Args: + num_classes (int): Number of categories excluding the background + category. + in_channels (int): Number of channels in the input feature map. + feat_channels (int): Number of hidden channels. Used in child classes. + Default: 256. + stacked_convs (int): Number of stacking convs of the head. + Default: 4. + strides (tuple): Downsample factor of each feature map. + scale_ranges (tuple[tuple[int, int]]): Area range of multiple + level masks, in the format [(min1, max1), (min2, max2), ...]. + A range of (16, 64) means the area range between (16, 64). + pos_scale (float): Constant scale factor to control the center region. + num_grids (list[int]): Divided image into a uniform grids, each + feature map has a different grid value. The number of output + channels is grid ** 2. Default: [40, 36, 24, 16, 12]. + cls_down_index (int): The index of downsample operation in + classification branch. Default: 0. + loss_mask (dict): Config of mask loss. + loss_cls (dict): Config of classification loss. + norm_cfg (dict): dictionary to construct and config norm layer. + Default: norm_cfg=dict(type='GN', num_groups=32, + requires_grad=True). + train_cfg (dict): Training config of head. + test_cfg (dict): Testing config of head. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__( + self, + num_classes, + in_channels, + feat_channels=256, + stacked_convs=4, + strides=(4, 8, 16, 32, 64), + scale_ranges=((8, 32), (16, 64), (32, 128), (64, 256), (128, 512)), + pos_scale=0.2, + num_grids=[40, 36, 24, 16, 12], + cls_down_index=0, + loss_mask=None, + loss_cls=None, + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True), + train_cfg=None, + test_cfg=None, + init_cfg=[ + dict(type='Normal', layer='Conv2d', std=0.01), + dict( + type='Normal', + std=0.01, + bias_prob=0.01, + override=dict(name='conv_mask_list')), + dict( + type='Normal', + std=0.01, + bias_prob=0.01, + override=dict(name='conv_cls')) + ], + ): + super(SOLOHead, self).__init__(init_cfg) + self.num_classes = num_classes + self.cls_out_channels = self.num_classes + self.in_channels = in_channels + self.feat_channels = feat_channels + self.stacked_convs = stacked_convs + self.strides = strides + self.num_grids = num_grids + # number of FPN feats + self.num_levels = len(strides) + assert self.num_levels == len(scale_ranges) == len(num_grids) + self.scale_ranges = scale_ranges + self.pos_scale = pos_scale + + self.cls_down_index = cls_down_index + self.loss_cls = build_loss(loss_cls) + self.loss_mask = build_loss(loss_mask) + self.norm_cfg = norm_cfg + self.init_cfg = init_cfg + self.train_cfg = train_cfg + self.test_cfg = test_cfg + self._init_layers() + + def _init_layers(self): + self.mask_convs = nn.ModuleList() + self.cls_convs = nn.ModuleList() + for i in range(self.stacked_convs): + chn = self.in_channels + 2 if i == 0 else self.feat_channels + self.mask_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + norm_cfg=self.norm_cfg)) + chn = self.in_channels if i == 0 else self.feat_channels + self.cls_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + norm_cfg=self.norm_cfg)) + self.conv_mask_list = nn.ModuleList() + for num_grid in self.num_grids: + self.conv_mask_list.append( + nn.Conv2d(self.feat_channels, num_grid**2, 1)) + + self.conv_cls = nn.Conv2d( + self.feat_channels, self.cls_out_channels, 3, padding=1) + + def resize_feats(self, feats): + """Downsample the first feat and upsample last feat in feats.""" + out = [] + for i in range(len(feats)): + if i == 0: + out.append( + F.interpolate( + feats[0], + size=feats[i + 1].shape[-2:], + mode='bilinear', + align_corners=False)) + elif i == len(feats) - 1: + out.append( + F.interpolate( + feats[i], + size=feats[i - 1].shape[-2:], + mode='bilinear', + align_corners=False)) + else: + out.append(feats[i]) + return out + + def forward(self, feats): + assert len(feats) == self.num_levels + feats = self.resize_feats(feats) + mlvl_mask_preds = [] + mlvl_cls_preds = [] + for i in range(self.num_levels): + x = feats[i] + mask_feat = x + cls_feat = x + # generate and concat the coordinate + coord_feat = generate_coordinate(mask_feat.size(), + mask_feat.device) + mask_feat = torch.cat([mask_feat, coord_feat], 1) + + for mask_layer in (self.mask_convs): + mask_feat = mask_layer(mask_feat) + + mask_feat = F.interpolate( + mask_feat, scale_factor=2, mode='bilinear') + mask_pred = self.conv_mask_list[i](mask_feat) + + # cls branch + for j, cls_layer in enumerate(self.cls_convs): + if j == self.cls_down_index: + num_grid = self.num_grids[i] + cls_feat = F.interpolate( + cls_feat, size=num_grid, mode='bilinear') + cls_feat = cls_layer(cls_feat) + + cls_pred = self.conv_cls(cls_feat) + + if not self.training: + feat_wh = feats[0].size()[-2:] + upsampled_size = (feat_wh[0] * 2, feat_wh[1] * 2) + mask_pred = F.interpolate( + mask_pred.sigmoid(), size=upsampled_size, mode='bilinear') + cls_pred = cls_pred.sigmoid() + # get local maximum + local_max = F.max_pool2d(cls_pred, 2, stride=1, padding=1) + keep_mask = local_max[:, :, :-1, :-1] == cls_pred + cls_pred = cls_pred * keep_mask + + mlvl_mask_preds.append(mask_pred) + mlvl_cls_preds.append(cls_pred) + return mlvl_mask_preds, mlvl_cls_preds + + def loss(self, + mlvl_mask_preds, + mlvl_cls_preds, + gt_labels, + gt_masks, + img_metas, + gt_bboxes=None, + **kwargs): + """Calculate the loss of total batch. + + Args: + mlvl_mask_preds (list[Tensor]): Multi-level mask prediction. + Each element in the list has shape + (batch_size, num_grids**2 ,h ,w). + mlvl_cls_preds (list[Tensor]): Multi-level scores. Each element + in the list has shape + (batch_size, num_classes, num_grids ,num_grids). + gt_labels (list[Tensor]): Labels of multiple images. + gt_masks (list[Tensor]): Ground truth masks of multiple images. + Each has shape (num_instances, h, w). + img_metas (list[dict]): Meta information of multiple images. + gt_bboxes (list[Tensor]): Ground truth bboxes of multiple + images. Default: None. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + num_levels = self.num_levels + num_imgs = len(gt_labels) + + featmap_sizes = [featmap.size()[-2:] for featmap in mlvl_mask_preds] + + # `BoolTensor` in `pos_masks` represent + # whether the corresponding point is + # positive + pos_mask_targets, labels, pos_masks = multi_apply( + self._get_targets_single, + gt_bboxes, + gt_labels, + gt_masks, + featmap_sizes=featmap_sizes) + + # change from the outside list meaning multi images + # to the outside list meaning multi levels + mlvl_pos_mask_targets = [[] for _ in range(num_levels)] + mlvl_pos_mask_preds = [[] for _ in range(num_levels)] + mlvl_pos_masks = [[] for _ in range(num_levels)] + mlvl_labels = [[] for _ in range(num_levels)] + for img_id in range(num_imgs): + assert num_levels == len(pos_mask_targets[img_id]) + for lvl in range(num_levels): + mlvl_pos_mask_targets[lvl].append( + pos_mask_targets[img_id][lvl]) + mlvl_pos_mask_preds[lvl].append( + mlvl_mask_preds[lvl][img_id, pos_masks[img_id][lvl], ...]) + mlvl_pos_masks[lvl].append(pos_masks[img_id][lvl].flatten()) + mlvl_labels[lvl].append(labels[img_id][lvl].flatten()) + + # cat multiple image + temp_mlvl_cls_preds = [] + for lvl in range(num_levels): + mlvl_pos_mask_targets[lvl] = torch.cat( + mlvl_pos_mask_targets[lvl], dim=0) + mlvl_pos_mask_preds[lvl] = torch.cat( + mlvl_pos_mask_preds[lvl], dim=0) + mlvl_pos_masks[lvl] = torch.cat(mlvl_pos_masks[lvl], dim=0) + mlvl_labels[lvl] = torch.cat(mlvl_labels[lvl], dim=0) + temp_mlvl_cls_preds.append(mlvl_cls_preds[lvl].permute( + 0, 2, 3, 1).reshape(-1, self.cls_out_channels)) + + num_pos = sum(item.sum() for item in mlvl_pos_masks) + # dice loss + loss_mask = [] + for pred, target in zip(mlvl_pos_mask_preds, mlvl_pos_mask_targets): + if pred.size()[0] == 0: + loss_mask.append(pred.sum().unsqueeze(0)) + continue + loss_mask.append( + self.loss_mask(pred, target, reduction_override='none')) + if num_pos > 0: + loss_mask = torch.cat(loss_mask).sum() / num_pos + else: + loss_mask = torch.cat(loss_mask).mean() + + flatten_labels = torch.cat(mlvl_labels) + flatten_cls_preds = torch.cat(temp_mlvl_cls_preds) + loss_cls = self.loss_cls( + flatten_cls_preds, flatten_labels, avg_factor=num_pos + 1) + return dict(loss_mask=loss_mask, loss_cls=loss_cls) + + def _get_targets_single(self, + gt_bboxes, + gt_labels, + gt_masks, + featmap_sizes=None): + """Compute targets for predictions of single image. + + Args: + gt_bboxes (Tensor): Ground truth bbox of each instance, + shape (num_gts, 4). + gt_labels (Tensor): Ground truth label of each instance, + shape (num_gts,). + gt_masks (Tensor): Ground truth mask of each instance, + shape (num_gts, h, w). + featmap_sizes (list[:obj:`torch.size`]): Size of each + feature map from feature pyramid, each element + means (feat_h, feat_w). Default: None. + + Returns: + Tuple: Usually returns a tuple containing targets for predictions. + + - mlvl_pos_mask_targets (list[Tensor]): Each element represent + the binary mask targets for positive points in this + level, has shape (num_pos, out_h, out_w). + - mlvl_labels (list[Tensor]): Each element is + classification labels for all + points in this level, has shape + (num_grid, num_grid). + - mlvl_pos_masks (list[Tensor]): Each element is + a `BoolTensor` to represent whether the + corresponding point in single level + is positive, has shape (num_grid **2). + """ + device = gt_labels.device + gt_areas = torch.sqrt((gt_bboxes[:, 2] - gt_bboxes[:, 0]) * + (gt_bboxes[:, 3] - gt_bboxes[:, 1])) + + mlvl_pos_mask_targets = [] + mlvl_labels = [] + mlvl_pos_masks = [] + for (lower_bound, upper_bound), stride, featmap_size, num_grid \ + in zip(self.scale_ranges, self.strides, + featmap_sizes, self.num_grids): + + mask_target = torch.zeros( + [num_grid**2, featmap_size[0], featmap_size[1]], + dtype=torch.uint8, + device=device) + # FG cat_id: [0, num_classes -1], BG cat_id: num_classes + labels = torch.zeros([num_grid, num_grid], + dtype=torch.int64, + device=device) + self.num_classes + pos_mask = torch.zeros([num_grid**2], + dtype=torch.bool, + device=device) + + gt_inds = ((gt_areas >= lower_bound) & + (gt_areas <= upper_bound)).nonzero().flatten() + if len(gt_inds) == 0: + mlvl_pos_mask_targets.append( + mask_target.new_zeros(0, featmap_size[0], featmap_size[1])) + mlvl_labels.append(labels) + mlvl_pos_masks.append(pos_mask) + continue + hit_gt_bboxes = gt_bboxes[gt_inds] + hit_gt_labels = gt_labels[gt_inds] + hit_gt_masks = gt_masks[gt_inds, ...] + + pos_w_ranges = 0.5 * (hit_gt_bboxes[:, 2] - + hit_gt_bboxes[:, 0]) * self.pos_scale + pos_h_ranges = 0.5 * (hit_gt_bboxes[:, 3] - + hit_gt_bboxes[:, 1]) * self.pos_scale + + # Make sure hit_gt_masks has a value + valid_mask_flags = hit_gt_masks.sum(dim=-1).sum(dim=-1) > 0 + output_stride = stride / 2 + + for gt_mask, gt_label, pos_h_range, pos_w_range, \ + valid_mask_flag in \ + zip(hit_gt_masks, hit_gt_labels, pos_h_ranges, + pos_w_ranges, valid_mask_flags): + if not valid_mask_flag: + continue + upsampled_size = (featmap_sizes[0][0] * 4, + featmap_sizes[0][1] * 4) + center_h, center_w = center_of_mass(gt_mask) + + coord_w = int( + floordiv((center_w / upsampled_size[1]), (1. / num_grid), + rounding_mode='trunc')) + coord_h = int( + floordiv((center_h / upsampled_size[0]), (1. / num_grid), + rounding_mode='trunc')) + + # left, top, right, down + top_box = max( + 0, + int( + floordiv( + (center_h - pos_h_range) / upsampled_size[0], + (1. / num_grid), + rounding_mode='trunc'))) + down_box = min( + num_grid - 1, + int( + floordiv( + (center_h + pos_h_range) / upsampled_size[0], + (1. / num_grid), + rounding_mode='trunc'))) + left_box = max( + 0, + int( + floordiv( + (center_w - pos_w_range) / upsampled_size[1], + (1. / num_grid), + rounding_mode='trunc'))) + right_box = min( + num_grid - 1, + int( + floordiv( + (center_w + pos_w_range) / upsampled_size[1], + (1. / num_grid), + rounding_mode='trunc'))) + + top = max(top_box, coord_h - 1) + down = min(down_box, coord_h + 1) + left = max(coord_w - 1, left_box) + right = min(right_box, coord_w + 1) + + labels[top:(down + 1), left:(right + 1)] = gt_label + # ins + gt_mask = np.uint8(gt_mask.cpu().numpy()) + # Follow the original implementation, F.interpolate is + # different from cv2 and opencv + gt_mask = mmcv.imrescale(gt_mask, scale=1. / output_stride) + gt_mask = torch.from_numpy(gt_mask).to(device=device) + + for i in range(top, down + 1): + for j in range(left, right + 1): + index = int(i * num_grid + j) + mask_target[index, :gt_mask.shape[0], :gt_mask. + shape[1]] = gt_mask + pos_mask[index] = True + mlvl_pos_mask_targets.append(mask_target[pos_mask]) + mlvl_labels.append(labels) + mlvl_pos_masks.append(pos_mask) + return mlvl_pos_mask_targets, mlvl_labels, mlvl_pos_masks + + def get_results(self, mlvl_mask_preds, mlvl_cls_scores, img_metas, + **kwargs): + """Get multi-image mask results. + + Args: + mlvl_mask_preds (list[Tensor]): Multi-level mask prediction. + Each element in the list has shape + (batch_size, num_grids**2 ,h ,w). + mlvl_cls_scores (list[Tensor]): Multi-level scores. Each element + in the list has shape + (batch_size, num_classes, num_grids ,num_grids). + img_metas (list[dict]): Meta information of all images. + + Returns: + list[:obj:`InstanceData`]: Processed results of multiple + images.Each :obj:`InstanceData` usually contains + following keys. + + - scores (Tensor): Classification scores, has shape + (num_instance,). + - labels (Tensor): Has shape (num_instances,). + - masks (Tensor): Processed mask results, has + shape (num_instances, h, w). + """ + mlvl_cls_scores = [ + item.permute(0, 2, 3, 1) for item in mlvl_cls_scores + ] + assert len(mlvl_mask_preds) == len(mlvl_cls_scores) + num_levels = len(mlvl_cls_scores) + + results_list = [] + for img_id in range(len(img_metas)): + cls_pred_list = [ + mlvl_cls_scores[lvl][img_id].view(-1, self.cls_out_channels) + for lvl in range(num_levels) + ] + mask_pred_list = [ + mlvl_mask_preds[lvl][img_id] for lvl in range(num_levels) + ] + + cls_pred_list = torch.cat(cls_pred_list, dim=0) + mask_pred_list = torch.cat(mask_pred_list, dim=0) + + results = self._get_results_single( + cls_pred_list, mask_pred_list, img_meta=img_metas[img_id]) + results_list.append(results) + + return results_list + + def _get_results_single(self, cls_scores, mask_preds, img_meta, cfg=None): + """Get processed mask related results of single image. + + Args: + cls_scores (Tensor): Classification score of all points + in single image, has shape (num_points, num_classes). + mask_preds (Tensor): Mask prediction of all points in + single image, has shape (num_points, feat_h, feat_w). + img_meta (dict): Meta information of corresponding image. + cfg (dict, optional): Config used in test phase. + Default: None. + + Returns: + :obj:`InstanceData`: Processed results of single image. + it usually contains following keys. + + - scores (Tensor): Classification scores, has shape + (num_instance,). + - labels (Tensor): Has shape (num_instances,). + - masks (Tensor): Processed mask results, has + shape (num_instances, h, w). + """ + + def empty_results(results, cls_scores): + """Generate a empty results.""" + results.scores = cls_scores.new_ones(0) + results.masks = cls_scores.new_zeros(0, *results.ori_shape[:2]) + results.labels = cls_scores.new_ones(0) + return results + + cfg = self.test_cfg if cfg is None else cfg + assert len(cls_scores) == len(mask_preds) + results = InstanceData(img_meta) + + featmap_size = mask_preds.size()[-2:] + + img_shape = results.img_shape + ori_shape = results.ori_shape + + h, w, _ = img_shape + upsampled_size = (featmap_size[0] * 4, featmap_size[1] * 4) + + score_mask = (cls_scores > cfg.score_thr) + cls_scores = cls_scores[score_mask] + if len(cls_scores) == 0: + return empty_results(results, cls_scores) + + inds = score_mask.nonzero() + cls_labels = inds[:, 1] + + # Filter the mask mask with an area is smaller than + # stride of corresponding feature level + lvl_interval = cls_labels.new_tensor(self.num_grids).pow(2).cumsum(0) + strides = cls_scores.new_ones(lvl_interval[-1]) + strides[:lvl_interval[0]] *= self.strides[0] + for lvl in range(1, self.num_levels): + strides[lvl_interval[lvl - + 1]:lvl_interval[lvl]] *= self.strides[lvl] + strides = strides[inds[:, 0]] + mask_preds = mask_preds[inds[:, 0]] + + masks = mask_preds > cfg.mask_thr + sum_masks = masks.sum((1, 2)).float() + keep = sum_masks > strides + if keep.sum() == 0: + return empty_results(results, cls_scores) + masks = masks[keep] + mask_preds = mask_preds[keep] + sum_masks = sum_masks[keep] + cls_scores = cls_scores[keep] + cls_labels = cls_labels[keep] + + # maskness. + mask_scores = (mask_preds * masks).sum((1, 2)) / sum_masks + cls_scores *= mask_scores + + scores, labels, _, keep_inds = mask_matrix_nms( + masks, + cls_labels, + cls_scores, + mask_area=sum_masks, + nms_pre=cfg.nms_pre, + max_num=cfg.max_per_img, + kernel=cfg.kernel, + sigma=cfg.sigma, + filter_thr=cfg.filter_thr) + mask_preds = mask_preds[keep_inds] + mask_preds = F.interpolate( + mask_preds.unsqueeze(0), size=upsampled_size, + mode='bilinear')[:, :, :h, :w] + mask_preds = F.interpolate( + mask_preds, size=ori_shape[:2], mode='bilinear').squeeze(0) + masks = mask_preds > cfg.mask_thr + + results.masks = masks + results.labels = labels + results.scores = scores + + return results + + +@HEADS.register_module() +class DecoupledSOLOHead(SOLOHead): + """Decoupled SOLO mask head used in `SOLO: Segmenting Objects by Locations. + + `_ + + Args: + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + *args, + init_cfg=[ + dict(type='Normal', layer='Conv2d', std=0.01), + dict( + type='Normal', + std=0.01, + bias_prob=0.01, + override=dict(name='conv_mask_list_x')), + dict( + type='Normal', + std=0.01, + bias_prob=0.01, + override=dict(name='conv_mask_list_y')), + dict( + type='Normal', + std=0.01, + bias_prob=0.01, + override=dict(name='conv_cls')) + ], + **kwargs): + super(DecoupledSOLOHead, self).__init__( + *args, init_cfg=init_cfg, **kwargs) + + def _init_layers(self): + self.mask_convs_x = nn.ModuleList() + self.mask_convs_y = nn.ModuleList() + self.cls_convs = nn.ModuleList() + + for i in range(self.stacked_convs): + chn = self.in_channels + 1 if i == 0 else self.feat_channels + self.mask_convs_x.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + norm_cfg=self.norm_cfg)) + self.mask_convs_y.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + norm_cfg=self.norm_cfg)) + + chn = self.in_channels if i == 0 else self.feat_channels + self.cls_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + norm_cfg=self.norm_cfg)) + + self.conv_mask_list_x = nn.ModuleList() + self.conv_mask_list_y = nn.ModuleList() + for num_grid in self.num_grids: + self.conv_mask_list_x.append( + nn.Conv2d(self.feat_channels, num_grid, 3, padding=1)) + self.conv_mask_list_y.append( + nn.Conv2d(self.feat_channels, num_grid, 3, padding=1)) + self.conv_cls = nn.Conv2d( + self.feat_channels, self.cls_out_channels, 3, padding=1) + + def forward(self, feats): + assert len(feats) == self.num_levels + feats = self.resize_feats(feats) + mask_preds_x = [] + mask_preds_y = [] + cls_preds = [] + for i in range(self.num_levels): + x = feats[i] + mask_feat = x + cls_feat = x + # generate and concat the coordinate + coord_feat = generate_coordinate(mask_feat.size(), + mask_feat.device) + mask_feat_x = torch.cat([mask_feat, coord_feat[:, 0:1, ...]], 1) + mask_feat_y = torch.cat([mask_feat, coord_feat[:, 1:2, ...]], 1) + + for mask_layer_x, mask_layer_y in \ + zip(self.mask_convs_x, self.mask_convs_y): + mask_feat_x = mask_layer_x(mask_feat_x) + mask_feat_y = mask_layer_y(mask_feat_y) + + mask_feat_x = F.interpolate( + mask_feat_x, scale_factor=2, mode='bilinear') + mask_feat_y = F.interpolate( + mask_feat_y, scale_factor=2, mode='bilinear') + + mask_pred_x = self.conv_mask_list_x[i](mask_feat_x) + mask_pred_y = self.conv_mask_list_y[i](mask_feat_y) + + # cls branch + for j, cls_layer in enumerate(self.cls_convs): + if j == self.cls_down_index: + num_grid = self.num_grids[i] + cls_feat = F.interpolate( + cls_feat, size=num_grid, mode='bilinear') + cls_feat = cls_layer(cls_feat) + + cls_pred = self.conv_cls(cls_feat) + + if not self.training: + feat_wh = feats[0].size()[-2:] + upsampled_size = (feat_wh[0] * 2, feat_wh[1] * 2) + mask_pred_x = F.interpolate( + mask_pred_x.sigmoid(), + size=upsampled_size, + mode='bilinear') + mask_pred_y = F.interpolate( + mask_pred_y.sigmoid(), + size=upsampled_size, + mode='bilinear') + cls_pred = cls_pred.sigmoid() + # get local maximum + local_max = F.max_pool2d(cls_pred, 2, stride=1, padding=1) + keep_mask = local_max[:, :, :-1, :-1] == cls_pred + cls_pred = cls_pred * keep_mask + + mask_preds_x.append(mask_pred_x) + mask_preds_y.append(mask_pred_y) + cls_preds.append(cls_pred) + return mask_preds_x, mask_preds_y, cls_preds + + def loss(self, + mlvl_mask_preds_x, + mlvl_mask_preds_y, + mlvl_cls_preds, + gt_labels, + gt_masks, + img_metas, + gt_bboxes=None, + **kwargs): + """Calculate the loss of total batch. + + Args: + mlvl_mask_preds_x (list[Tensor]): Multi-level mask prediction + from x branch. Each element in the list has shape + (batch_size, num_grids ,h ,w). + mlvl_mask_preds_x (list[Tensor]): Multi-level mask prediction + from y branch. Each element in the list has shape + (batch_size, num_grids ,h ,w). + mlvl_cls_preds (list[Tensor]): Multi-level scores. Each element + in the list has shape + (batch_size, num_classes, num_grids ,num_grids). + gt_labels (list[Tensor]): Labels of multiple images. + gt_masks (list[Tensor]): Ground truth masks of multiple images. + Each has shape (num_instances, h, w). + img_metas (list[dict]): Meta information of multiple images. + gt_bboxes (list[Tensor]): Ground truth bboxes of multiple + images. Default: None. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + num_levels = self.num_levels + num_imgs = len(gt_labels) + featmap_sizes = [featmap.size()[-2:] for featmap in mlvl_mask_preds_x] + + pos_mask_targets, labels, \ + xy_pos_indexes = \ + multi_apply(self._get_targets_single, + gt_bboxes, + gt_labels, + gt_masks, + featmap_sizes=featmap_sizes) + + # change from the outside list meaning multi images + # to the outside list meaning multi levels + mlvl_pos_mask_targets = [[] for _ in range(num_levels)] + mlvl_pos_mask_preds_x = [[] for _ in range(num_levels)] + mlvl_pos_mask_preds_y = [[] for _ in range(num_levels)] + mlvl_labels = [[] for _ in range(num_levels)] + for img_id in range(num_imgs): + + for lvl in range(num_levels): + mlvl_pos_mask_targets[lvl].append( + pos_mask_targets[img_id][lvl]) + mlvl_pos_mask_preds_x[lvl].append( + mlvl_mask_preds_x[lvl][img_id, + xy_pos_indexes[img_id][lvl][:, 1]]) + mlvl_pos_mask_preds_y[lvl].append( + mlvl_mask_preds_y[lvl][img_id, + xy_pos_indexes[img_id][lvl][:, 0]]) + mlvl_labels[lvl].append(labels[img_id][lvl].flatten()) + + # cat multiple image + temp_mlvl_cls_preds = [] + for lvl in range(num_levels): + mlvl_pos_mask_targets[lvl] = torch.cat( + mlvl_pos_mask_targets[lvl], dim=0) + mlvl_pos_mask_preds_x[lvl] = torch.cat( + mlvl_pos_mask_preds_x[lvl], dim=0) + mlvl_pos_mask_preds_y[lvl] = torch.cat( + mlvl_pos_mask_preds_y[lvl], dim=0) + mlvl_labels[lvl] = torch.cat(mlvl_labels[lvl], dim=0) + temp_mlvl_cls_preds.append(mlvl_cls_preds[lvl].permute( + 0, 2, 3, 1).reshape(-1, self.cls_out_channels)) + + num_pos = 0. + # dice loss + loss_mask = [] + for pred_x, pred_y, target in \ + zip(mlvl_pos_mask_preds_x, + mlvl_pos_mask_preds_y, mlvl_pos_mask_targets): + num_masks = pred_x.size(0) + if num_masks == 0: + # make sure can get grad + loss_mask.append((pred_x.sum() + pred_y.sum()).unsqueeze(0)) + continue + num_pos += num_masks + pred_mask = pred_y.sigmoid() * pred_x.sigmoid() + loss_mask.append( + self.loss_mask(pred_mask, target, reduction_override='none')) + if num_pos > 0: + loss_mask = torch.cat(loss_mask).sum() / num_pos + else: + loss_mask = torch.cat(loss_mask).mean() + + # cate + flatten_labels = torch.cat(mlvl_labels) + flatten_cls_preds = torch.cat(temp_mlvl_cls_preds) + + loss_cls = self.loss_cls( + flatten_cls_preds, flatten_labels, avg_factor=num_pos + 1) + return dict(loss_mask=loss_mask, loss_cls=loss_cls) + + def _get_targets_single(self, + gt_bboxes, + gt_labels, + gt_masks, + featmap_sizes=None): + """Compute targets for predictions of single image. + + Args: + gt_bboxes (Tensor): Ground truth bbox of each instance, + shape (num_gts, 4). + gt_labels (Tensor): Ground truth label of each instance, + shape (num_gts,). + gt_masks (Tensor): Ground truth mask of each instance, + shape (num_gts, h, w). + featmap_sizes (list[:obj:`torch.size`]): Size of each + feature map from feature pyramid, each element + means (feat_h, feat_w). Default: None. + + Returns: + Tuple: Usually returns a tuple containing targets for predictions. + + - mlvl_pos_mask_targets (list[Tensor]): Each element represent + the binary mask targets for positive points in this + level, has shape (num_pos, out_h, out_w). + - mlvl_labels (list[Tensor]): Each element is + classification labels for all + points in this level, has shape + (num_grid, num_grid). + - mlvl_xy_pos_indexes (list[Tensor]): Each element + in the list contains the index of positive samples in + corresponding level, has shape (num_pos, 2), last + dimension 2 present (index_x, index_y). + """ + mlvl_pos_mask_targets, mlvl_labels, \ + mlvl_pos_masks = \ + super()._get_targets_single(gt_bboxes, gt_labels, gt_masks, + featmap_sizes=featmap_sizes) + + mlvl_xy_pos_indexes = [(item - self.num_classes).nonzero() + for item in mlvl_labels] + + return mlvl_pos_mask_targets, mlvl_labels, mlvl_xy_pos_indexes + + def get_results(self, + mlvl_mask_preds_x, + mlvl_mask_preds_y, + mlvl_cls_scores, + img_metas, + rescale=None, + **kwargs): + """Get multi-image mask results. + + Args: + mlvl_mask_preds_x (list[Tensor]): Multi-level mask prediction + from x branch. Each element in the list has shape + (batch_size, num_grids ,h ,w). + mlvl_mask_preds_y (list[Tensor]): Multi-level mask prediction + from y branch. Each element in the list has shape + (batch_size, num_grids ,h ,w). + mlvl_cls_scores (list[Tensor]): Multi-level scores. Each element + in the list has shape + (batch_size, num_classes ,num_grids ,num_grids). + img_metas (list[dict]): Meta information of all images. + + Returns: + list[:obj:`InstanceData`]: Processed results of multiple + images.Each :obj:`InstanceData` usually contains + following keys. + + - scores (Tensor): Classification scores, has shape + (num_instance,). + - labels (Tensor): Has shape (num_instances,). + - masks (Tensor): Processed mask results, has + shape (num_instances, h, w). + """ + mlvl_cls_scores = [ + item.permute(0, 2, 3, 1) for item in mlvl_cls_scores + ] + assert len(mlvl_mask_preds_x) == len(mlvl_cls_scores) + num_levels = len(mlvl_cls_scores) + + results_list = [] + for img_id in range(len(img_metas)): + cls_pred_list = [ + mlvl_cls_scores[i][img_id].view( + -1, self.cls_out_channels).detach() + for i in range(num_levels) + ] + mask_pred_list_x = [ + mlvl_mask_preds_x[i][img_id] for i in range(num_levels) + ] + mask_pred_list_y = [ + mlvl_mask_preds_y[i][img_id] for i in range(num_levels) + ] + + cls_pred_list = torch.cat(cls_pred_list, dim=0) + mask_pred_list_x = torch.cat(mask_pred_list_x, dim=0) + mask_pred_list_y = torch.cat(mask_pred_list_y, dim=0) + + results = self._get_results_single( + cls_pred_list, + mask_pred_list_x, + mask_pred_list_y, + img_meta=img_metas[img_id], + cfg=self.test_cfg) + results_list.append(results) + return results_list + + def _get_results_single(self, cls_scores, mask_preds_x, mask_preds_y, + img_meta, cfg): + """Get processed mask related results of single image. + + Args: + cls_scores (Tensor): Classification score of all points + in single image, has shape (num_points, num_classes). + mask_preds_x (Tensor): Mask prediction of x branch of + all points in single image, has shape + (sum_num_grids, feat_h, feat_w). + mask_preds_y (Tensor): Mask prediction of y branch of + all points in single image, has shape + (sum_num_grids, feat_h, feat_w). + img_meta (dict): Meta information of corresponding image. + cfg (dict): Config used in test phase. + + Returns: + :obj:`InstanceData`: Processed results of single image. + it usually contains following keys. + + - scores (Tensor): Classification scores, has shape + (num_instance,). + - labels (Tensor): Has shape (num_instances,). + - masks (Tensor): Processed mask results, has + shape (num_instances, h, w). + """ + + def empty_results(results, cls_scores): + """Generate a empty results.""" + results.scores = cls_scores.new_ones(0) + results.masks = cls_scores.new_zeros(0, *results.ori_shape[:2]) + results.labels = cls_scores.new_ones(0) + return results + + cfg = self.test_cfg if cfg is None else cfg + + results = InstanceData(img_meta) + img_shape = results.img_shape + ori_shape = results.ori_shape + h, w, _ = img_shape + featmap_size = mask_preds_x.size()[-2:] + upsampled_size = (featmap_size[0] * 4, featmap_size[1] * 4) + + score_mask = (cls_scores > cfg.score_thr) + cls_scores = cls_scores[score_mask] + inds = score_mask.nonzero() + lvl_interval = inds.new_tensor(self.num_grids).pow(2).cumsum(0) + num_all_points = lvl_interval[-1] + lvl_start_index = inds.new_ones(num_all_points) + num_grids = inds.new_ones(num_all_points) + seg_size = inds.new_tensor(self.num_grids).cumsum(0) + mask_lvl_start_index = inds.new_ones(num_all_points) + strides = inds.new_ones(num_all_points) + + lvl_start_index[:lvl_interval[0]] *= 0 + mask_lvl_start_index[:lvl_interval[0]] *= 0 + num_grids[:lvl_interval[0]] *= self.num_grids[0] + strides[:lvl_interval[0]] *= self.strides[0] + + for lvl in range(1, self.num_levels): + lvl_start_index[lvl_interval[lvl - 1]:lvl_interval[lvl]] *= \ + lvl_interval[lvl - 1] + mask_lvl_start_index[lvl_interval[lvl - 1]:lvl_interval[lvl]] *= \ + seg_size[lvl - 1] + num_grids[lvl_interval[lvl - 1]:lvl_interval[lvl]] *= \ + self.num_grids[lvl] + strides[lvl_interval[lvl - 1]:lvl_interval[lvl]] *= \ + self.strides[lvl] + + lvl_start_index = lvl_start_index[inds[:, 0]] + mask_lvl_start_index = mask_lvl_start_index[inds[:, 0]] + num_grids = num_grids[inds[:, 0]] + strides = strides[inds[:, 0]] + + y_lvl_offset = (inds[:, 0] - lvl_start_index) // num_grids + x_lvl_offset = (inds[:, 0] - lvl_start_index) % num_grids + y_inds = mask_lvl_start_index + y_lvl_offset + x_inds = mask_lvl_start_index + x_lvl_offset + + cls_labels = inds[:, 1] + mask_preds = mask_preds_x[x_inds, ...] * mask_preds_y[y_inds, ...] + + masks = mask_preds > cfg.mask_thr + sum_masks = masks.sum((1, 2)).float() + keep = sum_masks > strides + if keep.sum() == 0: + return empty_results(results, cls_scores) + + masks = masks[keep] + mask_preds = mask_preds[keep] + sum_masks = sum_masks[keep] + cls_scores = cls_scores[keep] + cls_labels = cls_labels[keep] + + # maskness. + mask_scores = (mask_preds * masks).sum((1, 2)) / sum_masks + cls_scores *= mask_scores + + scores, labels, _, keep_inds = mask_matrix_nms( + masks, + cls_labels, + cls_scores, + mask_area=sum_masks, + nms_pre=cfg.nms_pre, + max_num=cfg.max_per_img, + kernel=cfg.kernel, + sigma=cfg.sigma, + filter_thr=cfg.filter_thr) + mask_preds = mask_preds[keep_inds] + mask_preds = F.interpolate( + mask_preds.unsqueeze(0), size=upsampled_size, + mode='bilinear')[:, :, :h, :w] + mask_preds = F.interpolate( + mask_preds, size=ori_shape[:2], mode='bilinear').squeeze(0) + masks = mask_preds > cfg.mask_thr + + results.masks = masks + results.labels = labels + results.scores = scores + + return results + + +@HEADS.register_module() +class DecoupledSOLOLightHead(DecoupledSOLOHead): + """Decoupled Light SOLO mask head used in `SOLO: Segmenting Objects by + Locations `_ + + Args: + with_dcn (bool): Whether use dcn in mask_convs and cls_convs, + default: False. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + *args, + dcn_cfg=None, + init_cfg=[ + dict(type='Normal', layer='Conv2d', std=0.01), + dict( + type='Normal', + std=0.01, + bias_prob=0.01, + override=dict(name='conv_mask_list_x')), + dict( + type='Normal', + std=0.01, + bias_prob=0.01, + override=dict(name='conv_mask_list_y')), + dict( + type='Normal', + std=0.01, + bias_prob=0.01, + override=dict(name='conv_cls')) + ], + **kwargs): + assert dcn_cfg is None or isinstance(dcn_cfg, dict) + self.dcn_cfg = dcn_cfg + super(DecoupledSOLOLightHead, self).__init__( + *args, init_cfg=init_cfg, **kwargs) + + def _init_layers(self): + self.mask_convs = nn.ModuleList() + self.cls_convs = nn.ModuleList() + + for i in range(self.stacked_convs): + if self.dcn_cfg is not None\ + and i == self.stacked_convs - 1: + conv_cfg = self.dcn_cfg + else: + conv_cfg = None + + chn = self.in_channels + 2 if i == 0 else self.feat_channels + self.mask_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=self.norm_cfg)) + + chn = self.in_channels if i == 0 else self.feat_channels + self.cls_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=self.norm_cfg)) + + self.conv_mask_list_x = nn.ModuleList() + self.conv_mask_list_y = nn.ModuleList() + for num_grid in self.num_grids: + self.conv_mask_list_x.append( + nn.Conv2d(self.feat_channels, num_grid, 3, padding=1)) + self.conv_mask_list_y.append( + nn.Conv2d(self.feat_channels, num_grid, 3, padding=1)) + self.conv_cls = nn.Conv2d( + self.feat_channels, self.cls_out_channels, 3, padding=1) + + def forward(self, feats): + assert len(feats) == self.num_levels + feats = self.resize_feats(feats) + mask_preds_x = [] + mask_preds_y = [] + cls_preds = [] + for i in range(self.num_levels): + x = feats[i] + mask_feat = x + cls_feat = x + # generate and concat the coordinate + coord_feat = generate_coordinate(mask_feat.size(), + mask_feat.device) + mask_feat = torch.cat([mask_feat, coord_feat], 1) + + for mask_layer in self.mask_convs: + mask_feat = mask_layer(mask_feat) + + mask_feat = F.interpolate( + mask_feat, scale_factor=2, mode='bilinear') + + mask_pred_x = self.conv_mask_list_x[i](mask_feat) + mask_pred_y = self.conv_mask_list_y[i](mask_feat) + + # cls branch + for j, cls_layer in enumerate(self.cls_convs): + if j == self.cls_down_index: + num_grid = self.num_grids[i] + cls_feat = F.interpolate( + cls_feat, size=num_grid, mode='bilinear') + cls_feat = cls_layer(cls_feat) + + cls_pred = self.conv_cls(cls_feat) + + if not self.training: + feat_wh = feats[0].size()[-2:] + upsampled_size = (feat_wh[0] * 2, feat_wh[1] * 2) + mask_pred_x = F.interpolate( + mask_pred_x.sigmoid(), + size=upsampled_size, + mode='bilinear') + mask_pred_y = F.interpolate( + mask_pred_y.sigmoid(), + size=upsampled_size, + mode='bilinear') + cls_pred = cls_pred.sigmoid() + # get local maximum + local_max = F.max_pool2d(cls_pred, 2, stride=1, padding=1) + keep_mask = local_max[:, :, :-1, :-1] == cls_pred + cls_pred = cls_pred * keep_mask + + mask_preds_x.append(mask_pred_x) + mask_preds_y.append(mask_pred_y) + cls_preds.append(cls_pred) + return mask_preds_x, mask_preds_y, cls_preds diff --git a/mmdet/models/dense_heads/solov2_head.py b/mmdet/models/dense_heads/solov2_head.py new file mode 100644 index 0000000..975306c --- /dev/null +++ b/mmdet/models/dense_heads/solov2_head.py @@ -0,0 +1,766 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import mmcv +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule +from mmcv.runner import BaseModule, auto_fp16, force_fp32 + +from mmdet.core import InstanceData, mask_matrix_nms, multi_apply +from mmdet.core.utils import center_of_mass, generate_coordinate +from mmdet.models.builder import HEADS +from mmdet.utils.misc import floordiv +from .solo_head import SOLOHead + + +class MaskFeatModule(BaseModule): + """SOLOv2 mask feature map branch used in `SOLOv2: Dynamic and Fast + Instance Segmentation. `_ + + Args: + in_channels (int): Number of channels in the input feature map. + feat_channels (int): Number of hidden channels of the mask feature + map branch. + start_level (int): The starting feature map level from RPN that + will be used to predict the mask feature map. + end_level (int): The ending feature map level from rpn that + will be used to predict the mask feature map. + out_channels (int): Number of output channels of the mask feature + map branch. This is the channel count of the mask + feature map that to be dynamically convolved with the predicted + kernel. + mask_stride (int): Downsample factor of the mask feature map output. + Default: 4. + conv_cfg (dict): Config dict for convolution layer. Default: None. + norm_cfg (dict): Config dict for normalization layer. Default: None. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + in_channels, + feat_channels, + start_level, + end_level, + out_channels, + mask_stride=4, + conv_cfg=None, + norm_cfg=None, + init_cfg=[dict(type='Normal', layer='Conv2d', std=0.01)]): + super().__init__(init_cfg=init_cfg) + + self.in_channels = in_channels + self.feat_channels = feat_channels + self.start_level = start_level + self.end_level = end_level + self.mask_stride = mask_stride + assert start_level >= 0 and end_level >= start_level + self.out_channels = out_channels + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self._init_layers() + self.fp16_enabled = False + + def _init_layers(self): + self.convs_all_levels = nn.ModuleList() + for i in range(self.start_level, self.end_level + 1): + convs_per_level = nn.Sequential() + if i == 0: + convs_per_level.add_module( + f'conv{i}', + ConvModule( + self.in_channels, + self.feat_channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + inplace=False)) + self.convs_all_levels.append(convs_per_level) + continue + + for j in range(i): + if j == 0: + if i == self.end_level: + chn = self.in_channels + 2 + else: + chn = self.in_channels + convs_per_level.add_module( + f'conv{j}', + ConvModule( + chn, + self.feat_channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + inplace=False)) + convs_per_level.add_module( + f'upsample{j}', + nn.Upsample( + scale_factor=2, + mode='bilinear', + align_corners=False)) + continue + + convs_per_level.add_module( + f'conv{j}', + ConvModule( + self.feat_channels, + self.feat_channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + inplace=False)) + convs_per_level.add_module( + f'upsample{j}', + nn.Upsample( + scale_factor=2, mode='bilinear', align_corners=False)) + + self.convs_all_levels.append(convs_per_level) + + self.conv_pred = ConvModule( + self.feat_channels, + self.out_channels, + 1, + padding=0, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg) + + @auto_fp16() + def forward(self, feats): + inputs = feats[self.start_level:self.end_level + 1] + assert len(inputs) == (self.end_level - self.start_level + 1) + feature_add_all_level = self.convs_all_levels[0](inputs[0]) + for i in range(1, len(inputs)): + input_p = inputs[i] + if i == len(inputs) - 1: + coord_feat = generate_coordinate(input_p.size(), + input_p.device) + input_p = torch.cat([input_p, coord_feat], 1) + + # fix runtime error of "+=" inplace operation in PyTorch 1.10 + feature_add_all_level = feature_add_all_level + \ + self.convs_all_levels[i](input_p) + + feature_pred = self.conv_pred(feature_add_all_level) + return feature_pred + + +@HEADS.register_module() +class SOLOV2Head(SOLOHead): + """SOLOv2 mask head used in `SOLOv2: Dynamic and Fast Instance + Segmentation. `_ + + Args: + mask_feature_head (dict): Config of SOLOv2MaskFeatHead. + dynamic_conv_size (int): Dynamic Conv kernel size. Default: 1. + dcn_cfg (dict): Dcn conv configurations in kernel_convs and cls_conv. + default: None. + dcn_apply_to_all_conv (bool): Whether to use dcn in every layer of + kernel_convs and cls_convs, or only the last layer. It shall be set + `True` for the normal version of SOLOv2 and `False` for the + light-weight version. default: True. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + *args, + mask_feature_head, + dynamic_conv_size=1, + dcn_cfg=None, + dcn_apply_to_all_conv=True, + init_cfg=[ + dict(type='Normal', layer='Conv2d', std=0.01), + dict( + type='Normal', + std=0.01, + bias_prob=0.01, + override=dict(name='conv_cls')) + ], + **kwargs): + assert dcn_cfg is None or isinstance(dcn_cfg, dict) + self.dcn_cfg = dcn_cfg + self.with_dcn = dcn_cfg is not None + self.dcn_apply_to_all_conv = dcn_apply_to_all_conv + self.dynamic_conv_size = dynamic_conv_size + mask_out_channels = mask_feature_head.get('out_channels') + self.kernel_out_channels = \ + mask_out_channels * self.dynamic_conv_size * self.dynamic_conv_size + + super().__init__(*args, init_cfg=init_cfg, **kwargs) + + # update the in_channels of mask_feature_head + if mask_feature_head.get('in_channels', None) is not None: + if mask_feature_head.in_channels != self.in_channels: + warnings.warn('The `in_channels` of SOLOv2MaskFeatHead and ' + 'SOLOv2Head should be same, changing ' + 'mask_feature_head.in_channels to ' + f'{self.in_channels}') + mask_feature_head.update(in_channels=self.in_channels) + else: + mask_feature_head.update(in_channels=self.in_channels) + + self.mask_feature_head = MaskFeatModule(**mask_feature_head) + self.mask_stride = self.mask_feature_head.mask_stride + self.fp16_enabled = False + + def _init_layers(self): + self.cls_convs = nn.ModuleList() + self.kernel_convs = nn.ModuleList() + conv_cfg = None + for i in range(self.stacked_convs): + if self.with_dcn: + if self.dcn_apply_to_all_conv: + conv_cfg = self.dcn_cfg + elif i == self.stacked_convs - 1: + # light head + conv_cfg = self.dcn_cfg + + chn = self.in_channels + 2 if i == 0 else self.feat_channels + self.kernel_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=self.norm_cfg, + bias=self.norm_cfg is None)) + + chn = self.in_channels if i == 0 else self.feat_channels + self.cls_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=self.norm_cfg, + bias=self.norm_cfg is None)) + + self.conv_cls = nn.Conv2d( + self.feat_channels, self.cls_out_channels, 3, padding=1) + + self.conv_kernel = nn.Conv2d( + self.feat_channels, self.kernel_out_channels, 3, padding=1) + + @auto_fp16() + def forward(self, feats): + assert len(feats) == self.num_levels + mask_feats = self.mask_feature_head(feats) + feats = self.resize_feats(feats) + mlvl_kernel_preds = [] + mlvl_cls_preds = [] + for i in range(self.num_levels): + ins_kernel_feat = feats[i] + # ins branch + # concat coord + coord_feat = generate_coordinate(ins_kernel_feat.size(), + ins_kernel_feat.device) + ins_kernel_feat = torch.cat([ins_kernel_feat, coord_feat], 1) + + # kernel branch + kernel_feat = ins_kernel_feat + kernel_feat = F.interpolate( + kernel_feat, + size=self.num_grids[i], + mode='bilinear', + align_corners=False) + + cate_feat = kernel_feat[:, :-2, :, :] + + kernel_feat = kernel_feat.contiguous() + for i, kernel_conv in enumerate(self.kernel_convs): + kernel_feat = kernel_conv(kernel_feat) + kernel_pred = self.conv_kernel(kernel_feat) + + # cate branch + cate_feat = cate_feat.contiguous() + for i, cls_conv in enumerate(self.cls_convs): + cate_feat = cls_conv(cate_feat) + cate_pred = self.conv_cls(cate_feat) + + mlvl_kernel_preds.append(kernel_pred) + mlvl_cls_preds.append(cate_pred) + + return mlvl_kernel_preds, mlvl_cls_preds, mask_feats + + def _get_targets_single(self, + gt_bboxes, + gt_labels, + gt_masks, + featmap_size=None): + """Compute targets for predictions of single image. + + Args: + gt_bboxes (Tensor): Ground truth bbox of each instance, + shape (num_gts, 4). + gt_labels (Tensor): Ground truth label of each instance, + shape (num_gts,). + gt_masks (Tensor): Ground truth mask of each instance, + shape (num_gts, h, w). + featmap_sizes (:obj:`torch.size`): Size of UNified mask + feature map used to generate instance segmentation + masks by dynamic convolution, each element means + (feat_h, feat_w). Default: None. + + Returns: + Tuple: Usually returns a tuple containing targets for predictions. + + - mlvl_pos_mask_targets (list[Tensor]): Each element represent + the binary mask targets for positive points in this + level, has shape (num_pos, out_h, out_w). + - mlvl_labels (list[Tensor]): Each element is + classification labels for all + points in this level, has shape + (num_grid, num_grid). + - mlvl_pos_masks (list[Tensor]): Each element is + a `BoolTensor` to represent whether the + corresponding point in single level + is positive, has shape (num_grid **2). + - mlvl_pos_indexes (list[list]): Each element + in the list contains the positive index in + corresponding level, has shape (num_pos). + """ + + device = gt_labels.device + gt_areas = torch.sqrt((gt_bboxes[:, 2] - gt_bboxes[:, 0]) * + (gt_bboxes[:, 3] - gt_bboxes[:, 1])) + + mlvl_pos_mask_targets = [] + mlvl_pos_indexes = [] + mlvl_labels = [] + mlvl_pos_masks = [] + for (lower_bound, upper_bound), num_grid \ + in zip(self.scale_ranges, self.num_grids): + mask_target = [] + # FG cat_id: [0, num_classes -1], BG cat_id: num_classes + pos_index = [] + labels = torch.zeros([num_grid, num_grid], + dtype=torch.int64, + device=device) + self.num_classes + pos_mask = torch.zeros([num_grid**2], + dtype=torch.bool, + device=device) + + gt_inds = ((gt_areas >= lower_bound) & + (gt_areas <= upper_bound)).nonzero().flatten() + if len(gt_inds) == 0: + mlvl_pos_mask_targets.append( + torch.zeros([0, featmap_size[0], featmap_size[1]], + dtype=torch.uint8, + device=device)) + mlvl_labels.append(labels) + mlvl_pos_masks.append(pos_mask) + mlvl_pos_indexes.append([]) + continue + hit_gt_bboxes = gt_bboxes[gt_inds] + hit_gt_labels = gt_labels[gt_inds] + hit_gt_masks = gt_masks[gt_inds, ...] + + pos_w_ranges = 0.5 * (hit_gt_bboxes[:, 2] - + hit_gt_bboxes[:, 0]) * self.pos_scale + pos_h_ranges = 0.5 * (hit_gt_bboxes[:, 3] - + hit_gt_bboxes[:, 1]) * self.pos_scale + + # Make sure hit_gt_masks has a value + valid_mask_flags = hit_gt_masks.sum(dim=-1).sum(dim=-1) > 0 + + for gt_mask, gt_label, pos_h_range, pos_w_range, \ + valid_mask_flag in \ + zip(hit_gt_masks, hit_gt_labels, pos_h_ranges, + pos_w_ranges, valid_mask_flags): + if not valid_mask_flag: + continue + upsampled_size = (featmap_size[0] * self.mask_stride, + featmap_size[1] * self.mask_stride) + center_h, center_w = center_of_mass(gt_mask) + + coord_w = int( + floordiv((center_w / upsampled_size[1]), (1. / num_grid), + rounding_mode='trunc')) + coord_h = int( + floordiv((center_h / upsampled_size[0]), (1. / num_grid), + rounding_mode='trunc')) + + # left, top, right, down + top_box = max( + 0, + int( + floordiv( + (center_h - pos_h_range) / upsampled_size[0], + (1. / num_grid), + rounding_mode='trunc'))) + down_box = min( + num_grid - 1, + int( + floordiv( + (center_h + pos_h_range) / upsampled_size[0], + (1. / num_grid), + rounding_mode='trunc'))) + left_box = max( + 0, + int( + floordiv( + (center_w - pos_w_range) / upsampled_size[1], + (1. / num_grid), + rounding_mode='trunc'))) + right_box = min( + num_grid - 1, + int( + floordiv( + (center_w + pos_w_range) / upsampled_size[1], + (1. / num_grid), + rounding_mode='trunc'))) + + top = max(top_box, coord_h - 1) + down = min(down_box, coord_h + 1) + left = max(coord_w - 1, left_box) + right = min(right_box, coord_w + 1) + + labels[top:(down + 1), left:(right + 1)] = gt_label + # ins + gt_mask = np.uint8(gt_mask.cpu().numpy()) + # Follow the original implementation, F.interpolate is + # different from cv2 and opencv + gt_mask = mmcv.imrescale(gt_mask, scale=1. / self.mask_stride) + gt_mask = torch.from_numpy(gt_mask).to(device=device) + + for i in range(top, down + 1): + for j in range(left, right + 1): + index = int(i * num_grid + j) + this_mask_target = torch.zeros( + [featmap_size[0], featmap_size[1]], + dtype=torch.uint8, + device=device) + this_mask_target[:gt_mask.shape[0], :gt_mask. + shape[1]] = gt_mask + mask_target.append(this_mask_target) + pos_mask[index] = True + pos_index.append(index) + if len(mask_target) == 0: + mask_target = torch.zeros( + [0, featmap_size[0], featmap_size[1]], + dtype=torch.uint8, + device=device) + else: + mask_target = torch.stack(mask_target, 0) + mlvl_pos_mask_targets.append(mask_target) + mlvl_labels.append(labels) + mlvl_pos_masks.append(pos_mask) + mlvl_pos_indexes.append(pos_index) + return (mlvl_pos_mask_targets, mlvl_labels, mlvl_pos_masks, + mlvl_pos_indexes) + + @force_fp32(apply_to=('mlvl_kernel_preds', 'mlvl_cls_preds', 'mask_feats')) + def loss(self, + mlvl_kernel_preds, + mlvl_cls_preds, + mask_feats, + gt_labels, + gt_masks, + img_metas, + gt_bboxes=None, + **kwargs): + """Calculate the loss of total batch. + + Args: + mlvl_kernel_preds (list[Tensor]): Multi-level dynamic kernel + prediction. The kernel is used to generate instance + segmentation masks by dynamic convolution. Each element in the + list has shape + (batch_size, kernel_out_channels, num_grids, num_grids). + mlvl_cls_preds (list[Tensor]): Multi-level scores. Each element + in the list has shape + (batch_size, num_classes, num_grids, num_grids). + mask_feats (Tensor): Unified mask feature map used to generate + instance segmentation masks by dynamic convolution. Has shape + (batch_size, mask_out_channels, h, w). + gt_labels (list[Tensor]): Labels of multiple images. + gt_masks (list[Tensor]): Ground truth masks of multiple images. + Each has shape (num_instances, h, w). + img_metas (list[dict]): Meta information of multiple images. + gt_bboxes (list[Tensor]): Ground truth bboxes of multiple + images. Default: None. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + featmap_size = mask_feats.size()[-2:] + + pos_mask_targets, labels, pos_masks, pos_indexes = multi_apply( + self._get_targets_single, + gt_bboxes, + gt_labels, + gt_masks, + featmap_size=featmap_size) + + mlvl_mask_targets = [ + torch.cat(lvl_mask_targets, 0) + for lvl_mask_targets in zip(*pos_mask_targets) + ] + + mlvl_pos_kernel_preds = [] + for lvl_kernel_preds, lvl_pos_indexes in zip(mlvl_kernel_preds, + zip(*pos_indexes)): + lvl_pos_kernel_preds = [] + for img_lvl_kernel_preds, img_lvl_pos_indexes in zip( + lvl_kernel_preds, lvl_pos_indexes): + img_lvl_pos_kernel_preds = img_lvl_kernel_preds.view( + img_lvl_kernel_preds.shape[0], -1)[:, img_lvl_pos_indexes] + lvl_pos_kernel_preds.append(img_lvl_pos_kernel_preds) + mlvl_pos_kernel_preds.append(lvl_pos_kernel_preds) + + # make multilevel mlvl_mask_pred + mlvl_mask_preds = [] + for lvl_pos_kernel_preds in mlvl_pos_kernel_preds: + lvl_mask_preds = [] + for img_id, img_lvl_pos_kernel_pred in enumerate( + lvl_pos_kernel_preds): + if img_lvl_pos_kernel_pred.size()[-1] == 0: + continue + img_mask_feats = mask_feats[[img_id]] + h, w = img_mask_feats.shape[-2:] + num_kernel = img_lvl_pos_kernel_pred.shape[1] + img_lvl_mask_pred = F.conv2d( + img_mask_feats, + img_lvl_pos_kernel_pred.permute(1, 0).view( + num_kernel, -1, self.dynamic_conv_size, + self.dynamic_conv_size), + stride=1).view(-1, h, w) + lvl_mask_preds.append(img_lvl_mask_pred) + if len(lvl_mask_preds) == 0: + lvl_mask_preds = None + else: + lvl_mask_preds = torch.cat(lvl_mask_preds, 0) + mlvl_mask_preds.append(lvl_mask_preds) + # dice loss + num_pos = 0 + for img_pos_masks in pos_masks: + for lvl_img_pos_masks in img_pos_masks: + num_pos += lvl_img_pos_masks.count_nonzero() + + loss_mask = [] + for lvl_mask_preds, lvl_mask_targets in zip(mlvl_mask_preds, + mlvl_mask_targets): + if lvl_mask_preds is None: + continue + loss_mask.append( + self.loss_mask( + lvl_mask_preds, + lvl_mask_targets, + reduction_override='none')) + if num_pos > 0: + loss_mask = torch.cat(loss_mask).sum() / num_pos + else: + loss_mask = mask_feats.sum() * 0 + + # cate + flatten_labels = [ + torch.cat( + [img_lvl_labels.flatten() for img_lvl_labels in lvl_labels]) + for lvl_labels in zip(*labels) + ] + flatten_labels = torch.cat(flatten_labels) + + flatten_cls_preds = [ + lvl_cls_preds.permute(0, 2, 3, 1).reshape(-1, self.num_classes) + for lvl_cls_preds in mlvl_cls_preds + ] + flatten_cls_preds = torch.cat(flatten_cls_preds) + + loss_cls = self.loss_cls( + flatten_cls_preds, flatten_labels, avg_factor=num_pos + 1) + return dict(loss_mask=loss_mask, loss_cls=loss_cls) + + @force_fp32( + apply_to=('mlvl_kernel_preds', 'mlvl_cls_scores', 'mask_feats')) + def get_results(self, mlvl_kernel_preds, mlvl_cls_scores, mask_feats, + img_metas, **kwargs): + """Get multi-image mask results. + + Args: + mlvl_kernel_preds (list[Tensor]): Multi-level dynamic kernel + prediction. The kernel is used to generate instance + segmentation masks by dynamic convolution. Each element in the + list has shape + (batch_size, kernel_out_channels, num_grids, num_grids). + mlvl_cls_scores (list[Tensor]): Multi-level scores. Each element + in the list has shape + (batch_size, num_classes, num_grids, num_grids). + mask_feats (Tensor): Unified mask feature map used to generate + instance segmentation masks by dynamic convolution. Has shape + (batch_size, mask_out_channels, h, w). + img_metas (list[dict]): Meta information of all images. + + Returns: + list[:obj:`InstanceData`]: Processed results of multiple + images.Each :obj:`InstanceData` usually contains + following keys. + + - scores (Tensor): Classification scores, has shape + (num_instance,). + - labels (Tensor): Has shape (num_instances,). + - masks (Tensor): Processed mask results, has + shape (num_instances, h, w). + """ + num_levels = len(mlvl_cls_scores) + assert len(mlvl_kernel_preds) == len(mlvl_cls_scores) + + for lvl in range(num_levels): + cls_scores = mlvl_cls_scores[lvl] + cls_scores = cls_scores.sigmoid() + local_max = F.max_pool2d(cls_scores, 2, stride=1, padding=1) + keep_mask = local_max[:, :, :-1, :-1] == cls_scores + cls_scores = cls_scores * keep_mask + mlvl_cls_scores[lvl] = cls_scores.permute(0, 2, 3, 1) + + result_list = [] + for img_id in range(len(img_metas)): + img_cls_pred = [ + mlvl_cls_scores[lvl][img_id].view(-1, self.cls_out_channels) + for lvl in range(num_levels) + ] + img_mask_feats = mask_feats[[img_id]] + img_kernel_pred = [ + mlvl_kernel_preds[lvl][img_id].permute(1, 2, 0).view( + -1, self.kernel_out_channels) for lvl in range(num_levels) + ] + img_cls_pred = torch.cat(img_cls_pred, dim=0) + img_kernel_pred = torch.cat(img_kernel_pred, dim=0) + result = self._get_results_single( + img_kernel_pred, + img_cls_pred, + img_mask_feats, + img_meta=img_metas[img_id]) + result_list.append(result) + return result_list + + def _get_results_single(self, + kernel_preds, + cls_scores, + mask_feats, + img_meta, + cfg=None): + """Get processed mask related results of single image. + + Args: + kernel_preds (Tensor): Dynamic kernel prediction of all points + in single image, has shape + (num_points, kernel_out_channels). + cls_scores (Tensor): Classification score of all points + in single image, has shape (num_points, num_classes). + mask_preds (Tensor): Mask prediction of all points in + single image, has shape (num_points, feat_h, feat_w). + img_meta (dict): Meta information of corresponding image. + cfg (dict, optional): Config used in test phase. + Default: None. + + Returns: + :obj:`InstanceData`: Processed results of single image. + it usually contains following keys. + - scores (Tensor): Classification scores, has shape + (num_instance,). + - labels (Tensor): Has shape (num_instances,). + - masks (Tensor): Processed mask results, has + shape (num_instances, h, w). + """ + + def empty_results(results, cls_scores): + """Generate a empty results.""" + results.scores = cls_scores.new_ones(0) + results.masks = cls_scores.new_zeros(0, *results.ori_shape[:2]) + results.labels = cls_scores.new_ones(0) + return results + + cfg = self.test_cfg if cfg is None else cfg + assert len(kernel_preds) == len(cls_scores) + results = InstanceData(img_meta) + + featmap_size = mask_feats.size()[-2:] + + img_shape = results.img_shape + ori_shape = results.ori_shape + + # overall info + h, w, _ = img_shape + upsampled_size = (featmap_size[0] * self.mask_stride, + featmap_size[1] * self.mask_stride) + + # process. + score_mask = (cls_scores > cfg.score_thr) + cls_scores = cls_scores[score_mask] + if len(cls_scores) == 0: + return empty_results(results, cls_scores) + + # cate_labels & kernel_preds + inds = score_mask.nonzero() + cls_labels = inds[:, 1] + kernel_preds = kernel_preds[inds[:, 0]] + + # trans vector. + lvl_interval = cls_labels.new_tensor(self.num_grids).pow(2).cumsum(0) + strides = kernel_preds.new_ones(lvl_interval[-1]) + + strides[:lvl_interval[0]] *= self.strides[0] + for lvl in range(1, self.num_levels): + strides[lvl_interval[lvl - + 1]:lvl_interval[lvl]] *= self.strides[lvl] + strides = strides[inds[:, 0]] + + # mask encoding. + kernel_preds = kernel_preds.view( + kernel_preds.size(0), -1, self.dynamic_conv_size, + self.dynamic_conv_size) + mask_preds = F.conv2d( + mask_feats, kernel_preds, stride=1).squeeze(0).sigmoid() + # mask. + masks = mask_preds > cfg.mask_thr + sum_masks = masks.sum((1, 2)).float() + keep = sum_masks > strides + if keep.sum() == 0: + return empty_results(results, cls_scores) + masks = masks[keep] + mask_preds = mask_preds[keep] + sum_masks = sum_masks[keep] + cls_scores = cls_scores[keep] + cls_labels = cls_labels[keep] + + # maskness. + mask_scores = (mask_preds * masks).sum((1, 2)) / sum_masks + cls_scores *= mask_scores + + scores, labels, _, keep_inds = mask_matrix_nms( + masks, + cls_labels, + cls_scores, + mask_area=sum_masks, + nms_pre=cfg.nms_pre, + max_num=cfg.max_per_img, + kernel=cfg.kernel, + sigma=cfg.sigma, + filter_thr=cfg.filter_thr) + mask_preds = mask_preds[keep_inds] + mask_preds = F.interpolate( + mask_preds.unsqueeze(0), + size=upsampled_size, + mode='bilinear', + align_corners=False)[:, :, :h, :w] + mask_preds = F.interpolate( + mask_preds, + size=ori_shape[:2], + mode='bilinear', + align_corners=False).squeeze(0) + masks = mask_preds > cfg.mask_thr + + results.masks = masks + results.labels = labels + results.scores = scores + + return results diff --git a/mmdet/models/dense_heads/ssd_head.py b/mmdet/models/dense_heads/ssd_head.py new file mode 100644 index 0000000..3e1f2b6 --- /dev/null +++ b/mmdet/models/dense_heads/ssd_head.py @@ -0,0 +1,588 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule +from mmcv.runner import force_fp32 + +from mmdet.core import (build_assigner, build_bbox_coder, + build_prior_generator, build_sampler, multi_apply) +from ..builder import HEADS +from ..losses import smooth_l1_loss +from .anchor_head import AnchorHead + +from mmdet.core.bbox.iou_calculators import bbox_overlaps +from my_equation import * +import global_placeholder + +# TODO: add loss evaluator for SSD +@HEADS.register_module() +class SSDHead(AnchorHead): + """SSD head used in https://arxiv.org/abs/1512.02325. + + Args: + num_classes (int): Number of categories excluding the background + category. + in_channels (int): Number of channels in the input feature map. + stacked_convs (int): Number of conv layers in cls and reg tower. + Default: 0. + feat_channels (int): Number of hidden channels when stacked_convs + > 0. Default: 256. + use_depthwise (bool): Whether to use DepthwiseSeparableConv. + Default: False. + conv_cfg (dict): Dictionary to construct and config conv layer. + Default: None. + norm_cfg (dict): Dictionary to construct and config norm layer. + Default: None. + act_cfg (dict): Dictionary to construct and config activation layer. + Default: None. + anchor_generator (dict): Config dict for anchor generator + bbox_coder (dict): Config of bounding box coder. + reg_decoded_bbox (bool): If true, the regression loss would be + applied directly on decoded bounding boxes, converting both + the predicted boxes and regression targets to absolute + coordinates format. Default False. It should be `True` when + using `IoULoss`, `GIoULoss`, or `DIoULoss` in the bbox head. + train_cfg (dict): Training config of anchor head. + test_cfg (dict): Testing config of anchor head. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ # noqa: W605 + + def __init__(self, + num_classes=80, + in_channels=(512, 1024, 512, 256, 256, 256), + stacked_convs=0, + feat_channels=256, + use_depthwise=False, + conv_cfg=None, + norm_cfg=None, + act_cfg=None, + anchor_generator=dict( + type='SSDAnchorGenerator', + scale_major=False, + input_size=300, + strides=[8, 16, 32, 64, 100, 300], + ratios=([2], [2, 3], [2, 3], [2, 3], [2], [2]), + basesize_ratio_range=(0.1, 0.9)), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + clip_border=True, + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0], + ), + reg_decoded_bbox=False, + train_cfg=None, + test_cfg=None, + init_cfg=dict( + type='Xavier', + layer='Conv2d', + distribution='uniform', + bias=0)): + super(AnchorHead, self).__init__(init_cfg) + self.num_classes = num_classes + self.in_channels = in_channels + self.stacked_convs = stacked_convs + self.feat_channels = feat_channels + self.use_depthwise = use_depthwise + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + + self.cls_out_channels = num_classes + 1 # add background class + self.prior_generator = build_prior_generator(anchor_generator) + + # Usually the numbers of anchors for each level are the same + # except SSD detectors. So it is an int in the most dense + # heads but a list of int in SSDHead + self.num_base_priors = self.prior_generator.num_base_priors + + self._init_layers() + + self.bbox_coder = build_bbox_coder(bbox_coder) + self.reg_decoded_bbox = reg_decoded_bbox + self.use_sigmoid_cls = False + self.cls_focal_loss = False + self.train_cfg = train_cfg + self.test_cfg = test_cfg + # set sampling=False for archor_target + self.sampling = False + if self.train_cfg: + self.assigner = build_assigner(self.train_cfg.assigner) + # SSD sampling=False so use PseudoSampler + sampler_cfg = dict(type='PseudoSampler') + self.sampler = build_sampler(sampler_cfg, context=self) + self.fp16_enabled = False + + @property + def num_anchors(self): + """ + Returns: + list[int]: Number of base_anchors on each point of each level. + """ + warnings.warn('DeprecationWarning: `num_anchors` is deprecated, ' + 'please use "num_base_priors" instead') + return self.num_base_priors + + def _init_layers(self): + """Initialize layers of the head.""" + self.cls_convs = nn.ModuleList() + self.reg_convs = nn.ModuleList() + # TODO: Use registry to choose ConvModule type + conv = DepthwiseSeparableConvModule \ + if self.use_depthwise else ConvModule + + for channel, num_base_priors in zip(self.in_channels, + self.num_base_priors): + cls_layers = [] + reg_layers = [] + in_channel = channel + # build stacked conv tower, not used in default ssd + for i in range(self.stacked_convs): + cls_layers.append( + conv( + in_channel, + self.feat_channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + reg_layers.append( + conv( + in_channel, + self.feat_channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + in_channel = self.feat_channels + # SSD-Lite head + if self.use_depthwise: + cls_layers.append( + ConvModule( + in_channel, + in_channel, + 3, + padding=1, + groups=in_channel, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + reg_layers.append( + ConvModule( + in_channel, + in_channel, + 3, + padding=1, + groups=in_channel, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg)) + cls_layers.append( + nn.Conv2d( + in_channel, + num_base_priors * self.cls_out_channels, + kernel_size=1 if self.use_depthwise else 3, + padding=0 if self.use_depthwise else 1)) + reg_layers.append( + nn.Conv2d( + in_channel, + num_base_priors * 4, + kernel_size=1 if self.use_depthwise else 3, + padding=0 if self.use_depthwise else 1)) + self.cls_convs.append(nn.Sequential(*cls_layers)) + self.reg_convs.append(nn.Sequential(*reg_layers)) + + def forward(self, feats): + """Forward features from the upstream network. + + Args: + feats (tuple[Tensor]): Features from the upstream network, each is + a 4D-tensor. + + Returns: + tuple: + cls_scores (list[Tensor]): Classification scores for all scale + levels, each is a 4D-tensor, the channels number is + num_anchors * num_classes. + bbox_preds (list[Tensor]): Box energies / deltas for all scale + levels, each is a 4D-tensor, the channels number is + num_anchors * 4. + """ + cls_scores = [] + bbox_preds = [] + if hasattr(self,'in_num') and self.in_num == 6: + feats = [feats[0], feats[1], feats[2], feats[3], feats[4], feats[5]] + elif hasattr(self,'in_num'): + raise NotImplementedError + else: + self.in_num = 6 + feats = [feats[0], feats[1], feats[2], feats[3], feats[4], feats[5]] + + for feat, reg_conv, cls_conv in zip(feats, self.reg_convs, + self.cls_convs): + cls_scores.append(cls_conv(feat)) + bbox_preds.append(reg_conv(feat)) + return cls_scores, bbox_preds + + def loss_single(self, cls_score, bbox_pred, anchor, labels, label_weights, + bbox_targets, bbox_weights, num_total_samples): + """Compute loss of a single image. + + Args: + cls_score (Tensor): Box scores for eachimage + Has shape (num_total_anchors, num_classes). + bbox_pred (Tensor): Box energies / deltas for each image + level with shape (num_total_anchors, 4). + anchors (Tensor): Box reference for each scale level with shape + (num_total_anchors, 4). + labels (Tensor): Labels of each anchors with shape + (num_total_anchors,). + label_weights (Tensor): Label weights of each anchor with shape + (num_total_anchors,) + bbox_targets (Tensor): BBox regression targets of each anchor + weight shape (num_total_anchors, 4). + bbox_weights (Tensor): BBox regression loss weights of each anchor + with shape (num_total_anchors, 4). + num_total_samples (int): If sampling, num total samples equal to + the number of total anchors; Otherwise, it is the number of + positive anchors. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + if self.num_base_priors == [4, 6, 6, 6, 4, 4]: + # 说明是ssd + level_counter = [5776, 2166, 600, 150, 36, 4] # 这个只出现在SSD300里,否则有问题 + + elif self.num_base_priors == [6, 6, 6, 6, 6, 6]: + # 说明是ssdlite + level_counter = [6*20*20, 6*10*10, 6*5*5, 6*3*3, 6*2*2, 6*1*1] # 这个只出现在SSDlite里,否则有问题 + else: + raise NotImplementedError + # 实现level上的标记 编码第一个level为0;第二个level为1;第三个level为2 + level_mapping = [] + for it, temp in enumerate(level_counter): + temp_tensor = torch.zeros(temp,dtype=torch.uint8,device=labels.device) + it + level_mapping.append(temp_tensor) + level_mapping = torch.cat(level_mapping) + + + loss_cls_all = F.cross_entropy( + cls_score, labels, reduction='none') * label_weights + # FG cat_id: [0, num_classes -1], BG cat_id: num_classes + pos_inds = ((labels >= 0) & (labels < self.num_classes)).nonzero( + as_tuple=False).reshape(-1) + neg_inds = (labels == self.num_classes).nonzero( + as_tuple=False).view(-1) + + num_pos_samples = pos_inds.size(0) + num_neg_samples = self.train_cfg.neg_pos_ratio * num_pos_samples + if num_neg_samples > neg_inds.size(0): + num_neg_samples = neg_inds.size(0) + topk_loss_cls_neg, topk_inds = loss_cls_all[neg_inds].topk(num_neg_samples) + + if self.reg_decoded_bbox: + # When the regression loss (e.g. `IouLoss`, `GIouLoss`) + # is applied directly on the decoded bounding boxes, it + # decodes the already encoded coordinates to absolute format. + bbox_pred = self.bbox_coder.decode(anchor, bbox_pred) + + loss_bbox = smooth_l1_loss( + bbox_pred, + bbox_targets, + bbox_weights, + beta=self.train_cfg.smoothl1_beta, + reduction='none') # 这里的处理(包括后面的),等价于这里的mean + + loss_bbox = loss_bbox.sum(dim=1) + + loss_cls_pos = loss_cls_all[pos_inds] + loss_cls_neg = topk_loss_cls_neg + pos_level_mapping = level_mapping[pos_inds] + neg_level_mapping = level_mapping[neg_inds][topk_inds] + + if global_placeholder.mybuff_flag: + + # # -----加上最小量化误差 + # qloss_flag = global_placeholder.qloss_flag + # q_loss = torch.tensor(0) + # # if qloss_flag: + # q_loss_sum = [] + # for name, module in self.named_modules(): + # if hasattr(module, 'compute_qloss') and module.compute_qloss: + # # if 'fake_quant' in name.split('.')[-1]: + # # 说明是act quantizer + # q_loss_sum.append(module.quantization_loss) + + # q_loss = sum(q_loss_sum) / len(q_loss_sum) + + conf_values = F.softmax(cls_score, dim=1) + num_classes = conf_values.shape[-1] + pos_gtconf_idx = F.one_hot(labels, num_classes=num_classes) + pos_gtconf_values, _ = (conf_values * pos_gtconf_idx).max(dim=1) # TODO 想到一件事,是不是不能用GT来筛选正样本的结果?因为其实正样本也有错误的东西,所以就是得错 + pos_gtconf_values = pos_gtconf_values[pos_inds] + + pos_conf_values, pos_conf_values_idx = conf_values.max(dim=1) # TODO 好像真的是这个问题,正样本本来就是得对应到max的那个,不能经过GT筛选 + pos_conf_values = pos_conf_values[pos_inds] + + abs_bbox_pred = self.bbox_coder.decode(anchor, bbox_pred) # 直接解读 + abs_bbox_targets = self.bbox_coder.decode(anchor, bbox_targets) # 直接解读 + pos_ious = bbox_overlaps(abs_bbox_pred[pos_inds], abs_bbox_targets[pos_inds], is_aligned=True) # 这玩意得是ltrb坐标,好像就已经是了??? + if global_placeholder.mybuff_flag == 1: + + level_slicer = [6, 0, 0] # [0]为level数;[1]为weight的个数;[2]为单level下的act个数 + level_cls_factors = [] + level_reg_factors = [] + # level_obj_factors = [] + qloss_flag = global_placeholder.qloss_flag + + if False: + q_loss_total = [] + cls_branch = [] + reg_branch = [] + # obj_branch = [] + for name, module in self.named_modules(): + if hasattr(module, 'compute_qloss') and module.compute_qloss: + # 挑出来量化器 + + if 'cls' in name: + # 说明是cls分支的量化器 + # cls_branch.append(module.quantization_loss) + if 'post_act' in name: + # 说明是act量化器 + cls_branch.append([name, module.scale * 1.]) + else: + cls_branch.append([name, module.scale * 2.]) + + elif 'reg' in name: + # 说明是reg分支的量化器 + # reg_branch.append(module.quantization_loss) + if 'post_act' in name: + # 说明是act量化器 + reg_branch.append([name, module.scale * 1.]) + else: + reg_branch.append([name, module.scale * 2.]) + + # elif 'obj' in name: + # # 说明是reg分支的量化器 + # # reg_branch.append(module.quantization_loss) + # if 'post_act' in name: + # # 说明是act量化器 + # obj_branch.append([name, module.scale * 1.]) + # else: + # obj_branch.append([name, module.scale * 2.]) + + q_loss_total.append([name, module.scale * 1]) + + # NOTE 不需要加item_post_act_quant的 + # 由于obj branch 的特殊性,所以得加上reg_branch分支的共用东西 + # obj_branch = obj_branch + reg_branch[3:] + + # if level_slicer[0] != 3: + # raise NotImplementedError + + for it in range(level_slicer[0]): + cls_summation = 0 + reg_summation = 0 + # obj_summation = 0 + tmp_cls_infos = [cls_branch[it]] + for info in tmp_cls_infos: + cls_summation += info[1] + + tmp_reg_infos = [reg_branch[it]] + for info in tmp_reg_infos: + reg_summation += info[1] + + # tmp_obj_infos = [obj_branch[it]] + obj_branch[3+it*2:3+(it+1)*2] + obj_branch[9+it*2:9+(it+1)*2] + # for info in tmp_obj_infos: + # obj_summation += info[1] + + level_cls_factors.append(cls_summation) + level_reg_factors.append(reg_summation) + # level_obj_factors.append(obj_summation) + + + if len(level_cls_factors) + len(level_reg_factors) == 0: + # 必须让list内有level个空list + level_cls_factors = [torch.tensor(1)] + level_reg_factors = [torch.tensor(1)] + + + # # NOTE 编码第一个level为0 第二个为1 ...... + # for it, [cls_branch_factor, reg_branch_factor] in enumerate(zip(level_cls_factors, level_reg_factors)): + # single_level_masks = (level_mapping == it) + # single_pos_level_masks = (pos_level_mapping == it) + # single_neg_level_masks = (neg_level_mapping == it) + + # cls_trade_off = (cls_branch_factor / (cls_branch_factor + reg_branch_factor)).detach() * 2 + # reg_trade_off = (reg_branch_factor / (cls_branch_factor + reg_branch_factor)).detach() * 2 + # # obj_trade_off = (obj_branch_factor / (cls_branch_factor + reg_branch_factor + obj_branch_factor)).detach() * 3 + + # loss_cls_pos[single_pos_level_masks] = cls_trade_off * loss_cls_pos[single_pos_level_masks] + # loss_cls_neg[single_neg_level_masks] = cls_trade_off * loss_cls_neg[single_neg_level_masks] + # loss_bbox[single_level_masks] = reg_trade_off * loss_bbox[single_level_masks] + + loss_bbox[pos_inds], loss_cls_pos = HQOD_loss(loss_bbox[pos_inds], loss_cls_pos, conf_values[pos_inds], pos_gtconf_values, pos_conf_values, pos_ious, [torch.tensor(1)], [torch.tensor(1)], torch.tensor(1.)) + + # loss_bbox[pos_inds], loss_cls_pos = HQOD_loss(loss_bbox[pos_inds], loss_cls_pos, conf_values[pos_inds], pos_gtconf_values, pos_conf_values, pos_ious, torch.tensor(1.)) + elif global_placeholder.mybuff_flag == 2: + # 对比HarDet + loss_bbox[pos_inds], loss_cls_pos = HarDet_loss(loss_bbox[pos_inds], loss_cls_pos, conf_values[pos_inds], pos_gtconf_values, pos_conf_values, pos_ious, torch.tensor(1.)) + + # loss_bbox[pos_inds], loss_cls_pos = HarDet_loss(loss_bbox[pos_inds], loss_cls_pos, conf_values[pos_inds], pos_gtconf_values, pos_conf_values, pos_ious, torch.tensor(1.)) + else: + raise NotImplementedError + + + + loss_cls_pos_sum = loss_cls_pos.sum() + loss_cls_neg_sum = loss_cls_neg.sum() + + loss_cls = (loss_cls_pos_sum + loss_cls_neg_sum) / num_total_samples + loss_bbox_reduced = loss_bbox.sum() / num_total_samples + return loss_cls[None], loss_bbox_reduced + + + # def loss_single(self, cls_score, bbox_pred, anchor, labels, label_weights, + # bbox_targets, bbox_weights, num_total_samples): + # """Compute loss of a single image. + + # Args: + # cls_score (Tensor): Box scores for eachimage + # Has shape (num_total_anchors, num_classes). + # bbox_pred (Tensor): Box energies / deltas for each image + # level with shape (num_total_anchors, 4). + # anchors (Tensor): Box reference for each scale level with shape + # (num_total_anchors, 4). + # labels (Tensor): Labels of each anchors with shape + # (num_total_anchors,). + # label_weights (Tensor): Label weights of each anchor with shape + # (num_total_anchors,) + # bbox_targets (Tensor): BBox regression targets of each anchor + # weight shape (num_total_anchors, 4). + # bbox_weights (Tensor): BBox regression loss weights of each anchor + # with shape (num_total_anchors, 4). + # num_total_samples (int): If sampling, num total samples equal to + # the number of total anchors; Otherwise, it is the number of + # positive anchors. + + # Returns: + # dict[str, Tensor]: A dictionary of loss components. + # """ + + # loss_cls_all = F.cross_entropy( + # cls_score, labels, reduction='none') * label_weights + # # FG cat_id: [0, num_classes -1], BG cat_id: num_classes + # pos_inds = ((labels >= 0) & (labels < self.num_classes)).nonzero( + # as_tuple=False).reshape(-1) + # neg_inds = (labels == self.num_classes).nonzero( + # as_tuple=False).view(-1) + + # num_pos_samples = pos_inds.size(0) + # num_neg_samples = self.train_cfg.neg_pos_ratio * num_pos_samples + # if num_neg_samples > neg_inds.size(0): + # num_neg_samples = neg_inds.size(0) + # topk_loss_cls_neg, _ = loss_cls_all[neg_inds].topk(num_neg_samples) + # loss_cls_pos = loss_cls_all[pos_inds].sum() + # loss_cls_neg = topk_loss_cls_neg.sum() + # loss_cls = (loss_cls_pos + loss_cls_neg) / num_total_samples + + # if self.reg_decoded_bbox: + # # When the regression loss (e.g. `IouLoss`, `GIouLoss`) + # # is applied directly on the decoded bounding boxes, it + # # decodes the already encoded coordinates to absolute format. + # bbox_pred = self.bbox_coder.decode(anchor, bbox_pred) + + # loss_bbox = smooth_l1_loss( + # bbox_pred, + # bbox_targets, + # bbox_weights, + # beta=self.train_cfg.smoothl1_beta, + # avg_factor=num_total_samples) + # return loss_cls[None], loss_bbox + + + @force_fp32(apply_to=('cls_scores', 'bbox_preds')) + def loss(self, + cls_scores, + bbox_preds, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Compute losses of the head. + + Args: + cls_scores (list[Tensor]): Box scores for each scale level + Has shape (N, num_anchors * num_classes, H, W) + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level with shape (N, num_anchors * 4, H, W) + gt_bboxes (list[Tensor]): each item are the truth boxes for each + image in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (None | list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + assert len(featmap_sizes) == self.prior_generator.num_levels + + device = cls_scores[0].device + + anchor_list, valid_flag_list = self.get_anchors( + featmap_sizes, img_metas, device=device) + cls_reg_targets = self.get_targets( + anchor_list, + valid_flag_list, + gt_bboxes, + img_metas, + gt_bboxes_ignore_list=gt_bboxes_ignore, + gt_labels_list=gt_labels, + label_channels=1, + unmap_outputs=True) + if cls_reg_targets is None: + return None + (labels_list, label_weights_list, bbox_targets_list, bbox_weights_list, + num_total_pos, num_total_neg) = cls_reg_targets + + num_images = len(img_metas) + all_cls_scores = torch.cat([ + s.permute(0, 2, 3, 1).reshape( + num_images, -1, self.cls_out_channels) for s in cls_scores + ], 1) + all_labels = torch.cat(labels_list, -1).view(num_images, -1) + all_label_weights = torch.cat(label_weights_list, + -1).view(num_images, -1) + all_bbox_preds = torch.cat([ + b.permute(0, 2, 3, 1).reshape(num_images, -1, 4) + for b in bbox_preds + ], -2) + all_bbox_targets = torch.cat(bbox_targets_list, + -2).view(num_images, -1, 4) + all_bbox_weights = torch.cat(bbox_weights_list, + -2).view(num_images, -1, 4) + + # concat all level anchors to a single tensor + all_anchors = [] + for i in range(num_images): + all_anchors.append(torch.cat(anchor_list[i])) + # 这个multi apply的是batch,每张图片进行 + losses_cls, losses_bbox = multi_apply( + self.loss_single, + all_cls_scores, + all_bbox_preds, + all_anchors, + all_labels, + all_label_weights, + all_bbox_targets, + all_bbox_weights, + num_total_samples=num_total_pos) + return dict(loss_cls=losses_cls, loss_bbox=losses_bbox) diff --git a/mmdet/models/dense_heads/tood_head.py b/mmdet/models/dense_heads/tood_head.py new file mode 100644 index 0000000..c64ebf7 --- /dev/null +++ b/mmdet/models/dense_heads/tood_head.py @@ -0,0 +1,778 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule, Scale, bias_init_with_prob, normal_init +from mmcv.ops import deform_conv2d +from mmcv.runner import force_fp32 + +from mmdet.core import (anchor_inside_flags, build_assigner, distance2bbox, + images_to_levels, multi_apply, reduce_mean, unmap) +from mmdet.core.utils import filter_scores_and_topk +from mmdet.models.utils import sigmoid_geometric_mean +from ..builder import HEADS, build_loss +from .atss_head import ATSSHead + + +class TaskDecomposition(nn.Module): + """Task decomposition module in task-aligned predictor of TOOD. + + Args: + feat_channels (int): Number of feature channels in TOOD head. + stacked_convs (int): Number of conv layers in TOOD head. + la_down_rate (int): Downsample rate of layer attention. + conv_cfg (dict): Config dict for convolution layer. + norm_cfg (dict): Config dict for normalization layer. + """ + + def __init__(self, + feat_channels, + stacked_convs, + la_down_rate=8, + conv_cfg=None, + norm_cfg=None): + super(TaskDecomposition, self).__init__() + self.feat_channels = feat_channels + self.stacked_convs = stacked_convs + self.in_channels = self.feat_channels * self.stacked_convs + self.norm_cfg = norm_cfg + self.layer_attention = nn.Sequential( + nn.Conv2d(self.in_channels, self.in_channels // la_down_rate, 1), + nn.ReLU(inplace=True), + nn.Conv2d( + self.in_channels // la_down_rate, + self.stacked_convs, + 1, + padding=0), nn.Sigmoid()) + + self.reduction_conv = ConvModule( + self.in_channels, + self.feat_channels, + 1, + stride=1, + padding=0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + bias=norm_cfg is None) + + def init_weights(self): + for m in self.layer_attention.modules(): + if isinstance(m, nn.Conv2d): + normal_init(m, std=0.001) + normal_init(self.reduction_conv.conv, std=0.01) + + def forward(self, feat, avg_feat=None): + b, c, h, w = feat.shape + if avg_feat is None: + avg_feat = F.adaptive_avg_pool2d(feat, (1, 1)) + weight = self.layer_attention(avg_feat) + + # here we first compute the product between layer attention weight and + # conv weight, and then compute the convolution between new conv weight + # and feature map, in order to save memory and FLOPs. + conv_weight = weight.reshape( + b, 1, self.stacked_convs, + 1) * self.reduction_conv.conv.weight.reshape( + 1, self.feat_channels, self.stacked_convs, self.feat_channels) + conv_weight = conv_weight.reshape(b, self.feat_channels, + self.in_channels) + feat = feat.reshape(b, self.in_channels, h * w) + feat = torch.bmm(conv_weight, feat).reshape(b, self.feat_channels, h, + w) + if self.norm_cfg is not None: + feat = self.reduction_conv.norm(feat) + feat = self.reduction_conv.activate(feat) + + return feat + + +@HEADS.register_module() +class TOODHead(ATSSHead): + """TOODHead used in `TOOD: Task-aligned One-stage Object Detection. + + `_. + + TOOD uses Task-aligned head (T-head) and is optimized by Task Alignment + Learning (TAL). + + Args: + num_dcn (int): Number of deformable convolution in the head. + Default: 0. + anchor_type (str): If set to `anchor_free`, the head will use centers + to regress bboxes. If set to `anchor_based`, the head will + regress bboxes based on anchors. Default: `anchor_free`. + initial_loss_cls (dict): Config of initial loss. + + Example: + >>> self = TOODHead(11, 7) + >>> feats = [torch.rand(1, 7, s, s) for s in [4, 8, 16, 32, 64]] + >>> cls_score, bbox_pred = self.forward(feats) + >>> assert len(cls_score) == len(self.scales) + """ + + def __init__(self, + num_classes, + in_channels, + num_dcn=0, + anchor_type='anchor_free', + initial_loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + activated=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + **kwargs): + assert anchor_type in ['anchor_free', 'anchor_based'] + self.num_dcn = num_dcn + self.anchor_type = anchor_type + self.epoch = 0 # which would be update in SetEpochInfoHook! + super(TOODHead, self).__init__(num_classes, in_channels, **kwargs) + + if self.train_cfg: + self.initial_epoch = self.train_cfg.initial_epoch + self.initial_assigner = build_assigner( + self.train_cfg.initial_assigner) + self.initial_loss_cls = build_loss(initial_loss_cls) + self.assigner = self.initial_assigner + self.alignment_assigner = build_assigner(self.train_cfg.assigner) + self.alpha = self.train_cfg.alpha + self.beta = self.train_cfg.beta + + def _init_layers(self): + """Initialize layers of the head.""" + self.relu = nn.ReLU(inplace=True) + self.inter_convs = nn.ModuleList() + for i in range(self.stacked_convs): + if i < self.num_dcn: + conv_cfg = dict(type='DCNv2', deform_groups=4) + else: + conv_cfg = self.conv_cfg + chn = self.in_channels if i == 0 else self.feat_channels + self.inter_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=self.norm_cfg)) + + self.cls_decomp = TaskDecomposition(self.feat_channels, + self.stacked_convs, + self.stacked_convs * 8, + self.conv_cfg, self.norm_cfg) + self.reg_decomp = TaskDecomposition(self.feat_channels, + self.stacked_convs, + self.stacked_convs * 8, + self.conv_cfg, self.norm_cfg) + + self.tood_cls = nn.Conv2d( + self.feat_channels, + self.num_base_priors * self.cls_out_channels, + 3, + padding=1) + self.tood_reg = nn.Conv2d( + self.feat_channels, self.num_base_priors * 4, 3, padding=1) + + self.cls_prob_module = nn.Sequential( + nn.Conv2d(self.feat_channels * self.stacked_convs, + self.feat_channels // 4, 1), nn.ReLU(inplace=True), + nn.Conv2d(self.feat_channels // 4, 1, 3, padding=1)) + self.reg_offset_module = nn.Sequential( + nn.Conv2d(self.feat_channels * self.stacked_convs, + self.feat_channels // 4, 1), nn.ReLU(inplace=True), + nn.Conv2d(self.feat_channels // 4, 4 * 2, 3, padding=1)) + + self.scales = nn.ModuleList( + [Scale(1.0) for _ in self.prior_generator.strides]) + + def init_weights(self): + """Initialize weights of the head.""" + bias_cls = bias_init_with_prob(0.01) + for m in self.inter_convs: + normal_init(m.conv, std=0.01) + for m in self.cls_prob_module: + if isinstance(m, nn.Conv2d): + normal_init(m, std=0.01) + for m in self.reg_offset_module: + if isinstance(m, nn.Conv2d): + normal_init(m, std=0.001) + normal_init(self.cls_prob_module[-1], std=0.01, bias=bias_cls) + + self.cls_decomp.init_weights() + self.reg_decomp.init_weights() + + normal_init(self.tood_cls, std=0.01, bias=bias_cls) + normal_init(self.tood_reg, std=0.01) + + def forward(self, feats): + """Forward features from the upstream network. + + Args: + feats (tuple[Tensor]): Features from the upstream network, each is + a 4D-tensor. + + Returns: + tuple: Usually a tuple of classification scores and bbox prediction + cls_scores (list[Tensor]): Classification scores for all scale + levels, each is a 4D-tensor, the channels number is + num_anchors * num_classes. + bbox_preds (list[Tensor]): Decoded box for all scale levels, + each is a 4D-tensor, the channels number is + num_anchors * 4. In [tl_x, tl_y, br_x, br_y] format. + """ + cls_scores = [] + bbox_preds = [] + for idx, (x, scale, stride) in enumerate( + zip(feats, self.scales, self.prior_generator.strides)): + b, c, h, w = x.shape + anchor = self.prior_generator.single_level_grid_priors( + (h, w), idx, device=x.device) + anchor = torch.cat([anchor for _ in range(b)]) + # extract task interactive features + inter_feats = [] + for inter_conv in self.inter_convs: + x = inter_conv(x) + inter_feats.append(x) + feat = torch.cat(inter_feats, 1) + + # task decomposition + avg_feat = F.adaptive_avg_pool2d(feat, (1, 1)) + cls_feat = self.cls_decomp(feat, avg_feat) + reg_feat = self.reg_decomp(feat, avg_feat) + + # cls prediction and alignment + cls_logits = self.tood_cls(cls_feat) + cls_prob = self.cls_prob_module(feat) + cls_score = sigmoid_geometric_mean(cls_logits, cls_prob) + + # reg prediction and alignment + if self.anchor_type == 'anchor_free': + reg_dist = scale(self.tood_reg(reg_feat).exp()).float() + reg_dist = reg_dist.permute(0, 2, 3, 1).reshape(-1, 4) + reg_bbox = distance2bbox( + self.anchor_center(anchor) / stride[0], + reg_dist).reshape(b, h, w, 4).permute(0, 3, 1, + 2) # (b, c, h, w) + elif self.anchor_type == 'anchor_based': + reg_dist = scale(self.tood_reg(reg_feat)).float() + reg_dist = reg_dist.permute(0, 2, 3, 1).reshape(-1, 4) + reg_bbox = self.bbox_coder.decode(anchor, reg_dist).reshape( + b, h, w, 4).permute(0, 3, 1, 2) / stride[0] + else: + raise NotImplementedError( + f'Unknown anchor type: {self.anchor_type}.' + f'Please use `anchor_free` or `anchor_based`.') + reg_offset = self.reg_offset_module(feat) + bbox_pred = self.deform_sampling(reg_bbox.contiguous(), + reg_offset.contiguous()) + + # After deform_sampling, some boxes will become invalid (The + # left-top point is at the right or bottom of the right-bottom + # point), which will make the GIoULoss negative. + invalid_bbox_idx = (bbox_pred[:, [0]] > bbox_pred[:, [2]]) | \ + (bbox_pred[:, [1]] > bbox_pred[:, [3]]) + invalid_bbox_idx = invalid_bbox_idx.expand_as(bbox_pred) + bbox_pred = torch.where(invalid_bbox_idx, reg_bbox, bbox_pred) + + cls_scores.append(cls_score) + bbox_preds.append(bbox_pred) + return tuple(cls_scores), tuple(bbox_preds) + + def deform_sampling(self, feat, offset): + """Sampling the feature x according to offset. + + Args: + feat (Tensor): Feature + offset (Tensor): Spatial offset for feature sampling + """ + # it is an equivalent implementation of bilinear interpolation + b, c, h, w = feat.shape + weight = feat.new_ones(c, 1, 1, 1) + y = deform_conv2d(feat, offset, weight, 1, 0, 1, c, c) + return y + + def anchor_center(self, anchors): + """Get anchor centers from anchors. + + Args: + anchors (Tensor): Anchor list with shape (N, 4), "xyxy" format. + + Returns: + Tensor: Anchor centers with shape (N, 2), "xy" format. + """ + anchors_cx = (anchors[:, 2] + anchors[:, 0]) / 2 + anchors_cy = (anchors[:, 3] + anchors[:, 1]) / 2 + return torch.stack([anchors_cx, anchors_cy], dim=-1) + + def loss_single(self, anchors, cls_score, bbox_pred, labels, label_weights, + bbox_targets, alignment_metrics, stride): + """Compute loss of a single scale level. + + Args: + anchors (Tensor): Box reference for each scale level with shape + (N, num_total_anchors, 4). + cls_score (Tensor): Box scores for each scale level + Has shape (N, num_anchors * num_classes, H, W). + bbox_pred (Tensor): Decoded bboxes for each scale + level with shape (N, num_anchors * 4, H, W). + labels (Tensor): Labels of each anchors with shape + (N, num_total_anchors). + label_weights (Tensor): Label weights of each anchor with shape + (N, num_total_anchors). + bbox_targets (Tensor): BBox regression targets of each anchor with + shape (N, num_total_anchors, 4). + alignment_metrics (Tensor): Alignment metrics with shape + (N, num_total_anchors). + stride (tuple[int]): Downsample stride of the feature map. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + assert stride[0] == stride[1], 'h stride is not equal to w stride!' + anchors = anchors.reshape(-1, 4) + cls_score = cls_score.permute(0, 2, 3, 1).reshape( + -1, self.cls_out_channels).contiguous() + bbox_pred = bbox_pred.permute(0, 2, 3, 1).reshape(-1, 4) + bbox_targets = bbox_targets.reshape(-1, 4) + labels = labels.reshape(-1) + alignment_metrics = alignment_metrics.reshape(-1) + label_weights = label_weights.reshape(-1) + targets = labels if self.epoch < self.initial_epoch else ( + labels, alignment_metrics) + cls_loss_func = self.initial_loss_cls \ + if self.epoch < self.initial_epoch else self.loss_cls + + loss_cls = cls_loss_func( + cls_score, targets, label_weights, avg_factor=1.0) + + # FG cat_id: [0, num_classes -1], BG cat_id: num_classes + bg_class_ind = self.num_classes + pos_inds = ((labels >= 0) + & (labels < bg_class_ind)).nonzero().squeeze(1) + + if len(pos_inds) > 0: + pos_bbox_targets = bbox_targets[pos_inds] + pos_bbox_pred = bbox_pred[pos_inds] + pos_anchors = anchors[pos_inds] + + pos_decode_bbox_pred = pos_bbox_pred + pos_decode_bbox_targets = pos_bbox_targets / stride[0] + + # regression loss + pos_bbox_weight = self.centerness_target( + pos_anchors, pos_bbox_targets + ) if self.epoch < self.initial_epoch else alignment_metrics[ + pos_inds] + + loss_bbox = self.loss_bbox( + pos_decode_bbox_pred, + pos_decode_bbox_targets, + weight=pos_bbox_weight, + avg_factor=1.0) + else: + loss_bbox = bbox_pred.sum() * 0 + pos_bbox_weight = bbox_targets.new_tensor(0.) + + return loss_cls, loss_bbox, alignment_metrics.sum( + ), pos_bbox_weight.sum() + + @force_fp32(apply_to=('cls_scores', 'bbox_preds')) + def loss(self, + cls_scores, + bbox_preds, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Compute losses of the head. + + Args: + cls_scores (list[Tensor]): Box scores for each scale level + Has shape (N, num_anchors * num_classes, H, W) + bbox_preds (list[Tensor]): Decoded box for each scale + level with shape (N, num_anchors * 4, H, W) in + [tl_x, tl_y, br_x, br_y] format. + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (list[Tensor] | None): specify which bounding + boxes can be ignored when computing the loss. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + num_imgs = len(img_metas) + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + assert len(featmap_sizes) == self.prior_generator.num_levels + + device = cls_scores[0].device + anchor_list, valid_flag_list = self.get_anchors( + featmap_sizes, img_metas, device=device) + label_channels = self.cls_out_channels if self.use_sigmoid_cls else 1 + + flatten_cls_scores = torch.cat([ + cls_score.permute(0, 2, 3, 1).reshape(num_imgs, -1, + self.cls_out_channels) + for cls_score in cls_scores + ], 1) + flatten_bbox_preds = torch.cat([ + bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4) * stride[0] + for bbox_pred, stride in zip(bbox_preds, + self.prior_generator.strides) + ], 1) + + cls_reg_targets = self.get_targets( + flatten_cls_scores, + flatten_bbox_preds, + anchor_list, + valid_flag_list, + gt_bboxes, + img_metas, + gt_bboxes_ignore_list=gt_bboxes_ignore, + gt_labels_list=gt_labels, + label_channels=label_channels) + (anchor_list, labels_list, label_weights_list, bbox_targets_list, + alignment_metrics_list) = cls_reg_targets + + losses_cls, losses_bbox,\ + cls_avg_factors, bbox_avg_factors = multi_apply( + self.loss_single, + anchor_list, + cls_scores, + bbox_preds, + labels_list, + label_weights_list, + bbox_targets_list, + alignment_metrics_list, + self.prior_generator.strides) + + cls_avg_factor = reduce_mean(sum(cls_avg_factors)).clamp_(min=1).item() + losses_cls = list(map(lambda x: x / cls_avg_factor, losses_cls)) + + bbox_avg_factor = reduce_mean( + sum(bbox_avg_factors)).clamp_(min=1).item() + losses_bbox = list(map(lambda x: x / bbox_avg_factor, losses_bbox)) + return dict(loss_cls=losses_cls, loss_bbox=losses_bbox) + + def _get_bboxes_single(self, + cls_score_list, + bbox_pred_list, + score_factor_list, + mlvl_priors, + img_meta, + cfg, + rescale=False, + with_nms=True, + **kwargs): + """Transform outputs of a single image into bbox predictions. + + Args: + cls_score_list (list[Tensor]): Box scores from all scale + levels of a single image, each item has shape + (num_priors * num_classes, H, W). + bbox_pred_list (list[Tensor]): Box energies / deltas from + all scale levels of a single image, each item has shape + (num_priors * 4, H, W). + score_factor_list (list[Tensor]): Score factor from all scale + levels of a single image, each item has shape + (num_priors * 1, H, W). + mlvl_priors (list[Tensor]): Each element in the list is + the priors of a single level in feature pyramid. In all + anchor-based methods, it has shape (num_priors, 4). In + all anchor-free methods, it has shape (num_priors, 2) + when `with_stride=True`, otherwise it still has shape + (num_priors, 4). + img_meta (dict): Image meta info. + cfg (mmcv.Config): Test / postprocessing configuration, + if None, test_cfg would be used. + rescale (bool): If True, return boxes in original image space. + Default: False. + with_nms (bool): If True, do nms before return boxes. + Default: True. + + Returns: + tuple[Tensor]: Results of detected bboxes and labels. If with_nms + is False and mlvl_score_factor is None, return mlvl_bboxes and + mlvl_scores, else return mlvl_bboxes, mlvl_scores and + mlvl_score_factor. Usually with_nms is False is used for aug + test. If with_nms is True, then return the following format + + - det_bboxes (Tensor): Predicted bboxes with shape \ + [num_bboxes, 5], where the first 4 columns are bounding \ + box positions (tl_x, tl_y, br_x, br_y) and the 5-th \ + column are scores between 0 and 1. + - det_labels (Tensor): Predicted labels of the corresponding \ + box with shape [num_bboxes]. + """ + + cfg = self.test_cfg if cfg is None else cfg + nms_pre = cfg.get('nms_pre', -1) + + mlvl_bboxes = [] + mlvl_scores = [] + mlvl_labels = [] + for cls_score, bbox_pred, priors, stride in zip( + cls_score_list, bbox_pred_list, mlvl_priors, + self.prior_generator.strides): + + assert cls_score.size()[-2:] == bbox_pred.size()[-2:] + + bbox_pred = bbox_pred.permute(1, 2, 0).reshape(-1, 4) * stride[0] + scores = cls_score.permute(1, 2, + 0).reshape(-1, self.cls_out_channels) + + # After https://github.com/open-mmlab/mmdetection/pull/6268/, + # this operation keeps fewer bboxes under the same `nms_pre`. + # There is no difference in performance for most models. If you + # find a slight drop in performance, you can set a larger + # `nms_pre` than before. + results = filter_scores_and_topk( + scores, cfg.score_thr, nms_pre, + dict(bbox_pred=bbox_pred, priors=priors)) + scores, labels, keep_idxs, filtered_results = results + + bboxes = filtered_results['bbox_pred'] + + mlvl_bboxes.append(bboxes) + mlvl_scores.append(scores) + mlvl_labels.append(labels) + + return self._bbox_post_process(mlvl_scores, mlvl_labels, mlvl_bboxes, + img_meta['scale_factor'], cfg, rescale, + with_nms, None, **kwargs) + + def get_targets(self, + cls_scores, + bbox_preds, + anchor_list, + valid_flag_list, + gt_bboxes_list, + img_metas, + gt_bboxes_ignore_list=None, + gt_labels_list=None, + label_channels=1, + unmap_outputs=True): + """Compute regression and classification targets for anchors in + multiple images. + + Args: + cls_scores (Tensor): Classification predictions of images, + a 3D-Tensor with shape [num_imgs, num_priors, num_classes]. + bbox_preds (Tensor): Decoded bboxes predictions of one image, + a 3D-Tensor with shape [num_imgs, num_priors, 4] in [tl_x, + tl_y, br_x, br_y] format. + anchor_list (list[list[Tensor]]): Multi level anchors of each + image. The outer list indicates images, and the inner list + corresponds to feature levels of the image. Each element of + the inner list is a tensor of shape (num_anchors, 4). + valid_flag_list (list[list[Tensor]]): Multi level valid flags of + each image. The outer list indicates images, and the inner list + corresponds to feature levels of the image. Each element of + the inner list is a tensor of shape (num_anchors, ) + gt_bboxes_list (list[Tensor]): Ground truth bboxes of each image. + img_metas (list[dict]): Meta info of each image. + gt_bboxes_ignore_list (list[Tensor]): Ground truth bboxes to be + ignored. + gt_labels_list (list[Tensor]): Ground truth labels of each box. + label_channels (int): Channel of label. + unmap_outputs (bool): Whether to map outputs back to the original + set of anchors. + + Returns: + tuple: a tuple containing learning targets. + + - anchors_list (list[list[Tensor]]): Anchors of each level. + - labels_list (list[Tensor]): Labels of each level. + - label_weights_list (list[Tensor]): Label weights of each + level. + - bbox_targets_list (list[Tensor]): BBox targets of each level. + - norm_alignment_metrics_list (list[Tensor]): Normalized + alignment metrics of each level. + """ + num_imgs = len(img_metas) + assert len(anchor_list) == len(valid_flag_list) == num_imgs + + # anchor number of multi levels + num_level_anchors = [anchors.size(0) for anchors in anchor_list[0]] + num_level_anchors_list = [num_level_anchors] * num_imgs + + # concat all level anchors and flags to a single tensor + for i in range(num_imgs): + assert len(anchor_list[i]) == len(valid_flag_list[i]) + anchor_list[i] = torch.cat(anchor_list[i]) + valid_flag_list[i] = torch.cat(valid_flag_list[i]) + + # compute targets for each image + if gt_bboxes_ignore_list is None: + gt_bboxes_ignore_list = [None for _ in range(num_imgs)] + if gt_labels_list is None: + gt_labels_list = [None for _ in range(num_imgs)] + # anchor_list: list(b * [-1, 4]) + + if self.epoch < self.initial_epoch: + (all_anchors, all_labels, all_label_weights, all_bbox_targets, + all_bbox_weights, pos_inds_list, neg_inds_list) = multi_apply( + super()._get_target_single, + anchor_list, + valid_flag_list, + num_level_anchors_list, + gt_bboxes_list, + gt_bboxes_ignore_list, + gt_labels_list, + img_metas, + label_channels=label_channels, + unmap_outputs=unmap_outputs) + all_assign_metrics = [ + weight[..., 0] for weight in all_bbox_weights + ] + else: + (all_anchors, all_labels, all_label_weights, all_bbox_targets, + all_assign_metrics) = multi_apply( + self._get_target_single, + cls_scores, + bbox_preds, + anchor_list, + valid_flag_list, + gt_bboxes_list, + gt_bboxes_ignore_list, + gt_labels_list, + img_metas, + label_channels=label_channels, + unmap_outputs=unmap_outputs) + # no valid anchors + if any([labels is None for labels in all_labels]): + return None + + # split targets to a list w.r.t. multiple levels + anchors_list = images_to_levels(all_anchors, num_level_anchors) + labels_list = images_to_levels(all_labels, num_level_anchors) + label_weights_list = images_to_levels(all_label_weights, + num_level_anchors) + bbox_targets_list = images_to_levels(all_bbox_targets, + num_level_anchors) + norm_alignment_metrics_list = images_to_levels(all_assign_metrics, + num_level_anchors) + + return (anchors_list, labels_list, label_weights_list, + bbox_targets_list, norm_alignment_metrics_list) + + def _get_target_single(self, + cls_scores, + bbox_preds, + flat_anchors, + valid_flags, + gt_bboxes, + gt_bboxes_ignore, + gt_labels, + img_meta, + label_channels=1, + unmap_outputs=True): + """Compute regression, classification targets for anchors in a single + image. + + Args: + cls_scores (list(Tensor)): Box scores for each image. + bbox_preds (list(Tensor)): Box energies / deltas for each image. + flat_anchors (Tensor): Multi-level anchors of the image, which are + concatenated into a single tensor of shape (num_anchors ,4) + valid_flags (Tensor): Multi level valid flags of the image, + which are concatenated into a single tensor of + shape (num_anchors,). + gt_bboxes (Tensor): Ground truth bboxes of the image, + shape (num_gts, 4). + gt_bboxes_ignore (Tensor): Ground truth bboxes to be + ignored, shape (num_ignored_gts, 4). + gt_labels (Tensor): Ground truth labels of each box, + shape (num_gts,). + img_meta (dict): Meta info of the image. + label_channels (int): Channel of label. + unmap_outputs (bool): Whether to map outputs back to the original + set of anchors. + + Returns: + tuple: N is the number of total anchors in the image. + anchors (Tensor): All anchors in the image with shape (N, 4). + labels (Tensor): Labels of all anchors in the image with shape + (N,). + label_weights (Tensor): Label weights of all anchor in the + image with shape (N,). + bbox_targets (Tensor): BBox targets of all anchors in the + image with shape (N, 4). + norm_alignment_metrics (Tensor): Normalized alignment metrics + of all priors in the image with shape (N,). + """ + inside_flags = anchor_inside_flags(flat_anchors, valid_flags, + img_meta['img_shape'][:2], + self.train_cfg.allowed_border) + if not inside_flags.any(): + return (None, ) * 7 + # assign gt and sample anchors + anchors = flat_anchors[inside_flags, :] + assign_result = self.alignment_assigner.assign( + cls_scores[inside_flags, :], bbox_preds[inside_flags, :], anchors, + gt_bboxes, gt_bboxes_ignore, gt_labels, self.alpha, self.beta) + assign_ious = assign_result.max_overlaps + assign_metrics = assign_result.assign_metrics + + sampling_result = self.sampler.sample(assign_result, anchors, + gt_bboxes) + + num_valid_anchors = anchors.shape[0] + bbox_targets = torch.zeros_like(anchors) + labels = anchors.new_full((num_valid_anchors, ), + self.num_classes, + dtype=torch.long) + label_weights = anchors.new_zeros(num_valid_anchors, dtype=torch.float) + norm_alignment_metrics = anchors.new_zeros( + num_valid_anchors, dtype=torch.float) + + pos_inds = sampling_result.pos_inds + neg_inds = sampling_result.neg_inds + if len(pos_inds) > 0: + # point-based + pos_bbox_targets = sampling_result.pos_gt_bboxes + bbox_targets[pos_inds, :] = pos_bbox_targets + + if gt_labels is None: + # Only rpn gives gt_labels as None + # Foreground is the first class since v2.5.0 + labels[pos_inds] = 0 + else: + labels[pos_inds] = gt_labels[ + sampling_result.pos_assigned_gt_inds] + if self.train_cfg.pos_weight <= 0: + label_weights[pos_inds] = 1.0 + else: + label_weights[pos_inds] = self.train_cfg.pos_weight + if len(neg_inds) > 0: + label_weights[neg_inds] = 1.0 + + class_assigned_gt_inds = torch.unique( + sampling_result.pos_assigned_gt_inds) + for gt_inds in class_assigned_gt_inds: + gt_class_inds = pos_inds[sampling_result.pos_assigned_gt_inds == + gt_inds] + pos_alignment_metrics = assign_metrics[gt_class_inds] + pos_ious = assign_ious[gt_class_inds] + pos_norm_alignment_metrics = pos_alignment_metrics / ( + pos_alignment_metrics.max() + 10e-8) * pos_ious.max() + norm_alignment_metrics[gt_class_inds] = pos_norm_alignment_metrics + + # map up to original set of anchors + if unmap_outputs: + num_total_anchors = flat_anchors.size(0) + anchors = unmap(anchors, num_total_anchors, inside_flags) + labels = unmap( + labels, num_total_anchors, inside_flags, fill=self.num_classes) + label_weights = unmap(label_weights, num_total_anchors, + inside_flags) + bbox_targets = unmap(bbox_targets, num_total_anchors, inside_flags) + norm_alignment_metrics = unmap(norm_alignment_metrics, + num_total_anchors, inside_flags) + return (anchors, labels, label_weights, bbox_targets, + norm_alignment_metrics) diff --git a/mmdet/models/dense_heads/vfnet_head.py b/mmdet/models/dense_heads/vfnet_head.py new file mode 100644 index 0000000..ba285e2 --- /dev/null +++ b/mmdet/models/dense_heads/vfnet_head.py @@ -0,0 +1,740 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import numpy as np +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule, Scale +from mmcv.ops import DeformConv2d +from mmcv.runner import force_fp32 + +from mmdet.core import (MlvlPointGenerator, bbox_overlaps, build_assigner, + build_prior_generator, build_sampler, multi_apply, + reduce_mean) +from ..builder import HEADS, build_loss +from .atss_head import ATSSHead +from .fcos_head import FCOSHead + +INF = 1e8 + + +@HEADS.register_module() +class VFNetHead(ATSSHead, FCOSHead): + """Head of `VarifocalNet (VFNet): An IoU-aware Dense Object + Detector.`_. + + The VFNet predicts IoU-aware classification scores which mix the + object presence confidence and object localization accuracy as the + detection score. It is built on the FCOS architecture and uses ATSS + for defining positive/negative training examples. The VFNet is trained + with Varifocal Loss and empolys star-shaped deformable convolution to + extract features for a bbox. + + Args: + num_classes (int): Number of categories excluding the background + category. + in_channels (int): Number of channels in the input feature map. + regress_ranges (tuple[tuple[int, int]]): Regress range of multiple + level points. + center_sampling (bool): If true, use center sampling. Default: False. + center_sample_radius (float): Radius of center sampling. Default: 1.5. + sync_num_pos (bool): If true, synchronize the number of positive + examples across GPUs. Default: True + gradient_mul (float): The multiplier to gradients from bbox refinement + and recognition. Default: 0.1. + bbox_norm_type (str): The bbox normalization type, 'reg_denom' or + 'stride'. Default: reg_denom + loss_cls_fl (dict): Config of focal loss. + use_vfl (bool): If true, use varifocal loss for training. + Default: True. + loss_cls (dict): Config of varifocal loss. + loss_bbox (dict): Config of localization loss, GIoU Loss. + loss_bbox (dict): Config of localization refinement loss, GIoU Loss. + norm_cfg (dict): dictionary to construct and config norm layer. + Default: norm_cfg=dict(type='GN', num_groups=32, + requires_grad=True). + use_atss (bool): If true, use ATSS to define positive/negative + examples. Default: True. + anchor_generator (dict): Config of anchor generator for ATSS. + init_cfg (dict or list[dict], optional): Initialization config dict. + + Example: + >>> self = VFNetHead(11, 7) + >>> feats = [torch.rand(1, 7, s, s) for s in [4, 8, 16, 32, 64]] + >>> cls_score, bbox_pred, bbox_pred_refine= self.forward(feats) + >>> assert len(cls_score) == len(self.scales) + """ # noqa: E501 + + def __init__(self, + num_classes, + in_channels, + regress_ranges=((-1, 64), (64, 128), (128, 256), (256, 512), + (512, INF)), + center_sampling=False, + center_sample_radius=1.5, + sync_num_pos=True, + gradient_mul=0.1, + bbox_norm_type='reg_denom', + loss_cls_fl=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + use_vfl=True, + loss_cls=dict( + type='VarifocalLoss', + use_sigmoid=True, + alpha=0.75, + gamma=2.0, + iou_weighted=True, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=1.5), + loss_bbox_refine=dict(type='GIoULoss', loss_weight=2.0), + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True), + use_atss=True, + reg_decoded_bbox=True, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + center_offset=0.0, + strides=[8, 16, 32, 64, 128]), + init_cfg=dict( + type='Normal', + layer='Conv2d', + std=0.01, + override=dict( + type='Normal', + name='vfnet_cls', + std=0.01, + bias_prob=0.01)), + **kwargs): + # dcn base offsets, adapted from reppoints_head.py + self.num_dconv_points = 9 + self.dcn_kernel = int(np.sqrt(self.num_dconv_points)) + self.dcn_pad = int((self.dcn_kernel - 1) / 2) + dcn_base = np.arange(-self.dcn_pad, + self.dcn_pad + 1).astype(np.float64) + dcn_base_y = np.repeat(dcn_base, self.dcn_kernel) + dcn_base_x = np.tile(dcn_base, self.dcn_kernel) + dcn_base_offset = np.stack([dcn_base_y, dcn_base_x], axis=1).reshape( + (-1)) + self.dcn_base_offset = torch.tensor(dcn_base_offset).view(1, -1, 1, 1) + + super(FCOSHead, self).__init__( + num_classes, + in_channels, + norm_cfg=norm_cfg, + init_cfg=init_cfg, + **kwargs) + self.regress_ranges = regress_ranges + self.reg_denoms = [ + regress_range[-1] for regress_range in regress_ranges + ] + self.reg_denoms[-1] = self.reg_denoms[-2] * 2 + self.center_sampling = center_sampling + self.center_sample_radius = center_sample_radius + self.sync_num_pos = sync_num_pos + self.bbox_norm_type = bbox_norm_type + self.gradient_mul = gradient_mul + self.use_vfl = use_vfl + if self.use_vfl: + self.loss_cls = build_loss(loss_cls) + else: + self.loss_cls = build_loss(loss_cls_fl) + self.loss_bbox = build_loss(loss_bbox) + self.loss_bbox_refine = build_loss(loss_bbox_refine) + + # for getting ATSS targets + self.use_atss = use_atss + self.reg_decoded_bbox = reg_decoded_bbox + self.use_sigmoid_cls = loss_cls.get('use_sigmoid', False) + + self.anchor_center_offset = anchor_generator['center_offset'] + + self.num_base_priors = self.prior_generator.num_base_priors[0] + + self.sampling = False + if self.train_cfg: + self.assigner = build_assigner(self.train_cfg.assigner) + sampler_cfg = dict(type='PseudoSampler') + self.sampler = build_sampler(sampler_cfg, context=self) + # only be used in `get_atss_targets` when `use_atss` is True + self.atss_prior_generator = build_prior_generator(anchor_generator) + + self.fcos_prior_generator = MlvlPointGenerator( + anchor_generator['strides'], + self.anchor_center_offset if self.use_atss else 0.5) + + # In order to reuse the `get_bboxes` in `BaseDenseHead. + # Only be used in testing phase. + self.prior_generator = self.fcos_prior_generator + + @property + def num_anchors(self): + """ + Returns: + int: Number of anchors on each point of feature map. + """ + warnings.warn('DeprecationWarning: `num_anchors` is deprecated, ' + 'please use "num_base_priors" instead') + return self.num_base_priors + + @property + def anchor_generator(self): + warnings.warn('DeprecationWarning: anchor_generator is deprecated, ' + 'please use "atss_prior_generator" instead') + return self.prior_generator + + def _init_layers(self): + """Initialize layers of the head.""" + super(FCOSHead, self)._init_cls_convs() + super(FCOSHead, self)._init_reg_convs() + self.relu = nn.ReLU(inplace=True) + self.vfnet_reg_conv = ConvModule( + self.feat_channels, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + bias=self.conv_bias) + self.vfnet_reg = nn.Conv2d(self.feat_channels, 4, 3, padding=1) + self.scales = nn.ModuleList([Scale(1.0) for _ in self.strides]) + + self.vfnet_reg_refine_dconv = DeformConv2d( + self.feat_channels, + self.feat_channels, + self.dcn_kernel, + 1, + padding=self.dcn_pad) + self.vfnet_reg_refine = nn.Conv2d(self.feat_channels, 4, 3, padding=1) + self.scales_refine = nn.ModuleList([Scale(1.0) for _ in self.strides]) + + self.vfnet_cls_dconv = DeformConv2d( + self.feat_channels, + self.feat_channels, + self.dcn_kernel, + 1, + padding=self.dcn_pad) + self.vfnet_cls = nn.Conv2d( + self.feat_channels, self.cls_out_channels, 3, padding=1) + + def forward(self, feats): + """Forward features from the upstream network. + + Args: + feats (tuple[Tensor]): Features from the upstream network, each is + a 4D-tensor. + + Returns: + tuple: + cls_scores (list[Tensor]): Box iou-aware scores for each scale + level, each is a 4D-tensor, the channel number is + num_points * num_classes. + bbox_preds (list[Tensor]): Box offsets for each + scale level, each is a 4D-tensor, the channel number is + num_points * 4. + bbox_preds_refine (list[Tensor]): Refined Box offsets for + each scale level, each is a 4D-tensor, the channel + number is num_points * 4. + """ + return multi_apply(self.forward_single, feats, self.scales, + self.scales_refine, self.strides, self.reg_denoms) + + def forward_single(self, x, scale, scale_refine, stride, reg_denom): + """Forward features of a single scale level. + + Args: + x (Tensor): FPN feature maps of the specified stride. + scale (:obj: `mmcv.cnn.Scale`): Learnable scale module to resize + the bbox prediction. + scale_refine (:obj: `mmcv.cnn.Scale`): Learnable scale module to + resize the refined bbox prediction. + stride (int): The corresponding stride for feature maps, + used to normalize the bbox prediction when + bbox_norm_type = 'stride'. + reg_denom (int): The corresponding regression range for feature + maps, only used to normalize the bbox prediction when + bbox_norm_type = 'reg_denom'. + + Returns: + tuple: iou-aware cls scores for each box, bbox predictions and + refined bbox predictions of input feature maps. + """ + cls_feat = x + reg_feat = x + + for cls_layer in self.cls_convs: + cls_feat = cls_layer(cls_feat) + + for reg_layer in self.reg_convs: + reg_feat = reg_layer(reg_feat) + + # predict the bbox_pred of different level + reg_feat_init = self.vfnet_reg_conv(reg_feat) + if self.bbox_norm_type == 'reg_denom': + bbox_pred = scale( + self.vfnet_reg(reg_feat_init)).float().exp() * reg_denom + elif self.bbox_norm_type == 'stride': + bbox_pred = scale( + self.vfnet_reg(reg_feat_init)).float().exp() * stride + else: + raise NotImplementedError + + # compute star deformable convolution offsets + # converting dcn_offset to reg_feat.dtype thus VFNet can be + # trained with FP16 + dcn_offset = self.star_dcn_offset(bbox_pred, self.gradient_mul, + stride).to(reg_feat.dtype) + + # refine the bbox_pred + reg_feat = self.relu(self.vfnet_reg_refine_dconv(reg_feat, dcn_offset)) + bbox_pred_refine = scale_refine( + self.vfnet_reg_refine(reg_feat)).float().exp() + bbox_pred_refine = bbox_pred_refine * bbox_pred.detach() + + # predict the iou-aware cls score + cls_feat = self.relu(self.vfnet_cls_dconv(cls_feat, dcn_offset)) + cls_score = self.vfnet_cls(cls_feat) + + if self.training: + return cls_score, bbox_pred, bbox_pred_refine + else: + return cls_score, bbox_pred_refine + + def star_dcn_offset(self, bbox_pred, gradient_mul, stride): + """Compute the star deformable conv offsets. + + Args: + bbox_pred (Tensor): Predicted bbox distance offsets (l, r, t, b). + gradient_mul (float): Gradient multiplier. + stride (int): The corresponding stride for feature maps, + used to project the bbox onto the feature map. + + Returns: + dcn_offsets (Tensor): The offsets for deformable convolution. + """ + dcn_base_offset = self.dcn_base_offset.type_as(bbox_pred) + bbox_pred_grad_mul = (1 - gradient_mul) * bbox_pred.detach() + \ + gradient_mul * bbox_pred + # map to the feature map scale + bbox_pred_grad_mul = bbox_pred_grad_mul / stride + N, C, H, W = bbox_pred.size() + + x1 = bbox_pred_grad_mul[:, 0, :, :] + y1 = bbox_pred_grad_mul[:, 1, :, :] + x2 = bbox_pred_grad_mul[:, 2, :, :] + y2 = bbox_pred_grad_mul[:, 3, :, :] + bbox_pred_grad_mul_offset = bbox_pred.new_zeros( + N, 2 * self.num_dconv_points, H, W) + bbox_pred_grad_mul_offset[:, 0, :, :] = -1.0 * y1 # -y1 + bbox_pred_grad_mul_offset[:, 1, :, :] = -1.0 * x1 # -x1 + bbox_pred_grad_mul_offset[:, 2, :, :] = -1.0 * y1 # -y1 + bbox_pred_grad_mul_offset[:, 4, :, :] = -1.0 * y1 # -y1 + bbox_pred_grad_mul_offset[:, 5, :, :] = x2 # x2 + bbox_pred_grad_mul_offset[:, 7, :, :] = -1.0 * x1 # -x1 + bbox_pred_grad_mul_offset[:, 11, :, :] = x2 # x2 + bbox_pred_grad_mul_offset[:, 12, :, :] = y2 # y2 + bbox_pred_grad_mul_offset[:, 13, :, :] = -1.0 * x1 # -x1 + bbox_pred_grad_mul_offset[:, 14, :, :] = y2 # y2 + bbox_pred_grad_mul_offset[:, 16, :, :] = y2 # y2 + bbox_pred_grad_mul_offset[:, 17, :, :] = x2 # x2 + dcn_offset = bbox_pred_grad_mul_offset - dcn_base_offset + + return dcn_offset + + @force_fp32(apply_to=('cls_scores', 'bbox_preds', 'bbox_preds_refine')) + def loss(self, + cls_scores, + bbox_preds, + bbox_preds_refine, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Compute loss of the head. + + Args: + cls_scores (list[Tensor]): Box iou-aware scores for each scale + level, each is a 4D-tensor, the channel number is + num_points * num_classes. + bbox_preds (list[Tensor]): Box offsets for each + scale level, each is a 4D-tensor, the channel number is + num_points * 4. + bbox_preds_refine (list[Tensor]): Refined Box offsets for + each scale level, each is a 4D-tensor, the channel + number is num_points * 4. + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (None | list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. + Default: None. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + assert len(cls_scores) == len(bbox_preds) == len(bbox_preds_refine) + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + all_level_points = self.fcos_prior_generator.grid_priors( + featmap_sizes, bbox_preds[0].dtype, bbox_preds[0].device) + labels, label_weights, bbox_targets, bbox_weights = self.get_targets( + cls_scores, all_level_points, gt_bboxes, gt_labels, img_metas, + gt_bboxes_ignore) + + num_imgs = cls_scores[0].size(0) + # flatten cls_scores, bbox_preds and bbox_preds_refine + flatten_cls_scores = [ + cls_score.permute(0, 2, 3, + 1).reshape(-1, + self.cls_out_channels).contiguous() + for cls_score in cls_scores + ] + flatten_bbox_preds = [ + bbox_pred.permute(0, 2, 3, 1).reshape(-1, 4).contiguous() + for bbox_pred in bbox_preds + ] + flatten_bbox_preds_refine = [ + bbox_pred_refine.permute(0, 2, 3, 1).reshape(-1, 4).contiguous() + for bbox_pred_refine in bbox_preds_refine + ] + flatten_cls_scores = torch.cat(flatten_cls_scores) + flatten_bbox_preds = torch.cat(flatten_bbox_preds) + flatten_bbox_preds_refine = torch.cat(flatten_bbox_preds_refine) + flatten_labels = torch.cat(labels) + flatten_bbox_targets = torch.cat(bbox_targets) + # repeat points to align with bbox_preds + flatten_points = torch.cat( + [points.repeat(num_imgs, 1) for points in all_level_points]) + + # FG cat_id: [0, num_classes - 1], BG cat_id: num_classes + bg_class_ind = self.num_classes + pos_inds = torch.where( + ((flatten_labels >= 0) & (flatten_labels < bg_class_ind)) > 0)[0] + num_pos = len(pos_inds) + + pos_bbox_preds = flatten_bbox_preds[pos_inds] + pos_bbox_preds_refine = flatten_bbox_preds_refine[pos_inds] + pos_labels = flatten_labels[pos_inds] + + # sync num_pos across all gpus + if self.sync_num_pos: + num_pos_avg_per_gpu = reduce_mean( + pos_inds.new_tensor(num_pos).float()).item() + num_pos_avg_per_gpu = max(num_pos_avg_per_gpu, 1.0) + else: + num_pos_avg_per_gpu = num_pos + + pos_bbox_targets = flatten_bbox_targets[pos_inds] + pos_points = flatten_points[pos_inds] + + pos_decoded_bbox_preds = self.bbox_coder.decode( + pos_points, pos_bbox_preds) + pos_decoded_target_preds = self.bbox_coder.decode( + pos_points, pos_bbox_targets) + iou_targets_ini = bbox_overlaps( + pos_decoded_bbox_preds, + pos_decoded_target_preds.detach(), + is_aligned=True).clamp(min=1e-6) + bbox_weights_ini = iou_targets_ini.clone().detach() + bbox_avg_factor_ini = reduce_mean( + bbox_weights_ini.sum()).clamp_(min=1).item() + + pos_decoded_bbox_preds_refine = \ + self.bbox_coder.decode(pos_points, pos_bbox_preds_refine) + iou_targets_rf = bbox_overlaps( + pos_decoded_bbox_preds_refine, + pos_decoded_target_preds.detach(), + is_aligned=True).clamp(min=1e-6) + bbox_weights_rf = iou_targets_rf.clone().detach() + bbox_avg_factor_rf = reduce_mean( + bbox_weights_rf.sum()).clamp_(min=1).item() + + if num_pos > 0: + loss_bbox = self.loss_bbox( + pos_decoded_bbox_preds, + pos_decoded_target_preds.detach(), + weight=bbox_weights_ini, + avg_factor=bbox_avg_factor_ini) + + loss_bbox_refine = self.loss_bbox_refine( + pos_decoded_bbox_preds_refine, + pos_decoded_target_preds.detach(), + weight=bbox_weights_rf, + avg_factor=bbox_avg_factor_rf) + + # build IoU-aware cls_score targets + if self.use_vfl: + pos_ious = iou_targets_rf.clone().detach() + cls_iou_targets = torch.zeros_like(flatten_cls_scores) + cls_iou_targets[pos_inds, pos_labels] = pos_ious + else: + loss_bbox = pos_bbox_preds.sum() * 0 + loss_bbox_refine = pos_bbox_preds_refine.sum() * 0 + if self.use_vfl: + cls_iou_targets = torch.zeros_like(flatten_cls_scores) + + if self.use_vfl: + loss_cls = self.loss_cls( + flatten_cls_scores, + cls_iou_targets, + avg_factor=num_pos_avg_per_gpu) + else: + loss_cls = self.loss_cls( + flatten_cls_scores, + flatten_labels, + weight=label_weights, + avg_factor=num_pos_avg_per_gpu) + + return dict( + loss_cls=loss_cls, + loss_bbox=loss_bbox, + loss_bbox_rf=loss_bbox_refine) + + def get_targets(self, cls_scores, mlvl_points, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore): + """A wrapper for computing ATSS and FCOS targets for points in multiple + images. + + Args: + cls_scores (list[Tensor]): Box iou-aware scores for each scale + level with shape (N, num_points * num_classes, H, W). + mlvl_points (list[Tensor]): Points of each fpn level, each has + shape (num_points, 2). + gt_bboxes (list[Tensor]): Ground truth bboxes of each image, + each has shape (num_gt, 4). + gt_labels (list[Tensor]): Ground truth labels of each box, + each has shape (num_gt,). + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (None | Tensor): Ground truth bboxes to be + ignored, shape (num_ignored_gts, 4). + + Returns: + tuple: + labels_list (list[Tensor]): Labels of each level. + label_weights (Tensor/None): Label weights of all levels. + bbox_targets_list (list[Tensor]): Regression targets of each + level, (l, t, r, b). + bbox_weights (Tensor/None): Bbox weights of all levels. + """ + if self.use_atss: + return self.get_atss_targets(cls_scores, mlvl_points, gt_bboxes, + gt_labels, img_metas, + gt_bboxes_ignore) + else: + self.norm_on_bbox = False + return self.get_fcos_targets(mlvl_points, gt_bboxes, gt_labels) + + def _get_target_single(self, *args, **kwargs): + """Avoid ambiguity in multiple inheritance.""" + if self.use_atss: + return ATSSHead._get_target_single(self, *args, **kwargs) + else: + return FCOSHead._get_target_single(self, *args, **kwargs) + + def get_fcos_targets(self, points, gt_bboxes_list, gt_labels_list): + """Compute FCOS regression and classification targets for points in + multiple images. + + Args: + points (list[Tensor]): Points of each fpn level, each has shape + (num_points, 2). + gt_bboxes_list (list[Tensor]): Ground truth bboxes of each image, + each has shape (num_gt, 4). + gt_labels_list (list[Tensor]): Ground truth labels of each box, + each has shape (num_gt,). + + Returns: + tuple: + labels (list[Tensor]): Labels of each level. + label_weights: None, to be compatible with ATSS targets. + bbox_targets (list[Tensor]): BBox targets of each level. + bbox_weights: None, to be compatible with ATSS targets. + """ + labels, bbox_targets = FCOSHead.get_targets(self, points, + gt_bboxes_list, + gt_labels_list) + label_weights = None + bbox_weights = None + return labels, label_weights, bbox_targets, bbox_weights + + def get_anchors(self, featmap_sizes, img_metas, device='cuda'): + """Get anchors according to feature map sizes. + + Args: + featmap_sizes (list[tuple]): Multi-level feature map sizes. + img_metas (list[dict]): Image meta info. + device (torch.device | str): Device for returned tensors + + Returns: + tuple: + anchor_list (list[Tensor]): Anchors of each image. + valid_flag_list (list[Tensor]): Valid flags of each image. + """ + num_imgs = len(img_metas) + + # since feature map sizes of all images are the same, we only compute + # anchors for one time + multi_level_anchors = self.atss_prior_generator.grid_priors( + featmap_sizes, device=device) + anchor_list = [multi_level_anchors for _ in range(num_imgs)] + + # for each image, we compute valid flags of multi level anchors + valid_flag_list = [] + for img_id, img_meta in enumerate(img_metas): + multi_level_flags = self.atss_prior_generator.valid_flags( + featmap_sizes, img_meta['pad_shape'], device=device) + valid_flag_list.append(multi_level_flags) + + return anchor_list, valid_flag_list + + def get_atss_targets(self, + cls_scores, + mlvl_points, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """A wrapper for computing ATSS targets for points in multiple images. + + Args: + cls_scores (list[Tensor]): Box iou-aware scores for each scale + level with shape (N, num_points * num_classes, H, W). + mlvl_points (list[Tensor]): Points of each fpn level, each has + shape (num_points, 2). + gt_bboxes (list[Tensor]): Ground truth bboxes of each image, + each has shape (num_gt, 4). + gt_labels (list[Tensor]): Ground truth labels of each box, + each has shape (num_gt,). + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (None | Tensor): Ground truth bboxes to be + ignored, shape (num_ignored_gts, 4). Default: None. + + Returns: + tuple: + labels_list (list[Tensor]): Labels of each level. + label_weights (Tensor): Label weights of all levels. + bbox_targets_list (list[Tensor]): Regression targets of each + level, (l, t, r, b). + bbox_weights (Tensor): Bbox weights of all levels. + """ + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + assert len( + featmap_sizes + ) == self.atss_prior_generator.num_levels == \ + self.fcos_prior_generator.num_levels + + device = cls_scores[0].device + + anchor_list, valid_flag_list = self.get_anchors( + featmap_sizes, img_metas, device=device) + label_channels = self.cls_out_channels if self.use_sigmoid_cls else 1 + + cls_reg_targets = ATSSHead.get_targets( + self, + anchor_list, + valid_flag_list, + gt_bboxes, + img_metas, + gt_bboxes_ignore_list=gt_bboxes_ignore, + gt_labels_list=gt_labels, + label_channels=label_channels, + unmap_outputs=True) + if cls_reg_targets is None: + return None + + (anchor_list, labels_list, label_weights_list, bbox_targets_list, + bbox_weights_list, num_total_pos, num_total_neg) = cls_reg_targets + + bbox_targets_list = [ + bbox_targets.reshape(-1, 4) for bbox_targets in bbox_targets_list + ] + + num_imgs = len(img_metas) + # transform bbox_targets (x1, y1, x2, y2) into (l, t, r, b) format + bbox_targets_list = self.transform_bbox_targets( + bbox_targets_list, mlvl_points, num_imgs) + + labels_list = [labels.reshape(-1) for labels in labels_list] + label_weights_list = [ + label_weights.reshape(-1) for label_weights in label_weights_list + ] + bbox_weights_list = [ + bbox_weights.reshape(-1) for bbox_weights in bbox_weights_list + ] + label_weights = torch.cat(label_weights_list) + bbox_weights = torch.cat(bbox_weights_list) + return labels_list, label_weights, bbox_targets_list, bbox_weights + + def transform_bbox_targets(self, decoded_bboxes, mlvl_points, num_imgs): + """Transform bbox_targets (x1, y1, x2, y2) into (l, t, r, b) format. + + Args: + decoded_bboxes (list[Tensor]): Regression targets of each level, + in the form of (x1, y1, x2, y2). + mlvl_points (list[Tensor]): Points of each fpn level, each has + shape (num_points, 2). + num_imgs (int): the number of images in a batch. + + Returns: + bbox_targets (list[Tensor]): Regression targets of each level in + the form of (l, t, r, b). + """ + # TODO: Re-implemented in Class PointCoder + assert len(decoded_bboxes) == len(mlvl_points) + num_levels = len(decoded_bboxes) + mlvl_points = [points.repeat(num_imgs, 1) for points in mlvl_points] + bbox_targets = [] + for i in range(num_levels): + bbox_target = self.bbox_coder.encode(mlvl_points[i], + decoded_bboxes[i]) + bbox_targets.append(bbox_target) + + return bbox_targets + + def _load_from_state_dict(self, state_dict, prefix, local_metadata, strict, + missing_keys, unexpected_keys, error_msgs): + """Override the method in the parent class to avoid changing para's + name.""" + pass + + def _get_points_single(self, + featmap_size, + stride, + dtype, + device, + flatten=False): + """Get points according to feature map size. + + This function will be deprecated soon. + """ + + warnings.warn( + '`_get_points_single` in `VFNetHead` will be ' + 'deprecated soon, we support a multi level point generator now' + 'you can get points of a single level feature map' + 'with `self.fcos_prior_generator.single_level_grid_priors` ') + + h, w = featmap_size + x_range = torch.arange( + 0, w * stride, stride, dtype=dtype, device=device) + y_range = torch.arange( + 0, h * stride, stride, dtype=dtype, device=device) + y, x = torch.meshgrid(y_range, x_range) + # to be compatible with anchor points in ATSS + if self.use_atss: + points = torch.stack( + (x.reshape(-1), y.reshape(-1)), dim=-1) + \ + stride * self.anchor_center_offset + else: + points = torch.stack( + (x.reshape(-1), y.reshape(-1)), dim=-1) + stride // 2 + return points diff --git a/mmdet/models/dense_heads/yolact_head.py b/mmdet/models/dense_heads/yolact_head.py new file mode 100644 index 0000000..8f89a27 --- /dev/null +++ b/mmdet/models/dense_heads/yolact_head.py @@ -0,0 +1,1018 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule +from mmcv.runner import BaseModule, ModuleList, force_fp32 + +from mmdet.core import build_sampler, fast_nms, images_to_levels, multi_apply +from mmdet.core.utils import select_single_mlvl +from ..builder import HEADS, build_loss +from .anchor_head import AnchorHead + + +@HEADS.register_module() +class YOLACTHead(AnchorHead): + """YOLACT box head used in https://arxiv.org/abs/1904.02689. + + Note that YOLACT head is a light version of RetinaNet head. + Four differences are described as follows: + + 1. YOLACT box head has three-times fewer anchors. + 2. YOLACT box head shares the convs for box and cls branches. + 3. YOLACT box head uses OHEM instead of Focal loss. + 4. YOLACT box head predicts a set of mask coefficients for each box. + + Args: + num_classes (int): Number of categories excluding the background + category. + in_channels (int): Number of channels in the input feature map. + anchor_generator (dict): Config dict for anchor generator + loss_cls (dict): Config of classification loss. + loss_bbox (dict): Config of localization loss. + num_head_convs (int): Number of the conv layers shared by + box and cls branches. + num_protos (int): Number of the mask coefficients. + use_ohem (bool): If true, ``loss_single_OHEM`` will be used for + cls loss calculation. If false, ``loss_single`` will be used. + conv_cfg (dict): Dictionary to construct and config conv layer. + norm_cfg (dict): Dictionary to construct and config norm layer. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + num_classes, + in_channels, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=3, + scales_per_octave=1, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + reduction='none', + loss_weight=1.0), + loss_bbox=dict( + type='SmoothL1Loss', beta=1.0, loss_weight=1.5), + num_head_convs=1, + num_protos=32, + use_ohem=True, + conv_cfg=None, + norm_cfg=None, + init_cfg=dict( + type='Xavier', + distribution='uniform', + bias=0, + layer='Conv2d'), + **kwargs): + self.num_head_convs = num_head_convs + self.num_protos = num_protos + self.use_ohem = use_ohem + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + super(YOLACTHead, self).__init__( + num_classes, + in_channels, + loss_cls=loss_cls, + loss_bbox=loss_bbox, + anchor_generator=anchor_generator, + init_cfg=init_cfg, + **kwargs) + if self.use_ohem: + sampler_cfg = dict(type='PseudoSampler') + self.sampler = build_sampler(sampler_cfg, context=self) + self.sampling = False + + def _init_layers(self): + """Initialize layers of the head.""" + self.relu = nn.ReLU(inplace=True) + self.head_convs = ModuleList() + for i in range(self.num_head_convs): + chn = self.in_channels if i == 0 else self.feat_channels + self.head_convs.append( + ConvModule( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg)) + self.conv_cls = nn.Conv2d( + self.feat_channels, + self.num_base_priors * self.cls_out_channels, + 3, + padding=1) + self.conv_reg = nn.Conv2d( + self.feat_channels, self.num_base_priors * 4, 3, padding=1) + self.conv_coeff = nn.Conv2d( + self.feat_channels, + self.num_base_priors * self.num_protos, + 3, + padding=1) + + def forward_single(self, x): + """Forward feature of a single scale level. + + Args: + x (Tensor): Features of a single scale level. + + Returns: + tuple: + cls_score (Tensor): Cls scores for a single scale level \ + the channels number is num_anchors * num_classes. + bbox_pred (Tensor): Box energies / deltas for a single scale \ + level, the channels number is num_anchors * 4. + coeff_pred (Tensor): Mask coefficients for a single scale \ + level, the channels number is num_anchors * num_protos. + """ + for head_conv in self.head_convs: + x = head_conv(x) + cls_score = self.conv_cls(x) + bbox_pred = self.conv_reg(x) + coeff_pred = self.conv_coeff(x).tanh() + return cls_score, bbox_pred, coeff_pred + + @force_fp32(apply_to=('cls_scores', 'bbox_preds')) + def loss(self, + cls_scores, + bbox_preds, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """A combination of the func:``AnchorHead.loss`` and + func:``SSDHead.loss``. + + When ``self.use_ohem == True``, it functions like ``SSDHead.loss``, + otherwise, it follows ``AnchorHead.loss``. Besides, it additionally + returns ``sampling_results``. + + Args: + cls_scores (list[Tensor]): Box scores for each scale level + Has shape (N, num_anchors * num_classes, H, W) + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level with shape (N, num_anchors * 4, H, W) + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): Class indices corresponding to each box + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (None | list[Tensor]): Specify which bounding + boxes can be ignored when computing the loss. Default: None + + Returns: + tuple: + dict[str, Tensor]: A dictionary of loss components. + List[:obj:``SamplingResult``]: Sampler results for each image. + """ + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + assert len(featmap_sizes) == self.prior_generator.num_levels + + device = cls_scores[0].device + + anchor_list, valid_flag_list = self.get_anchors( + featmap_sizes, img_metas, device=device) + label_channels = self.cls_out_channels if self.use_sigmoid_cls else 1 + cls_reg_targets = self.get_targets( + anchor_list, + valid_flag_list, + gt_bboxes, + img_metas, + gt_bboxes_ignore_list=gt_bboxes_ignore, + gt_labels_list=gt_labels, + label_channels=label_channels, + unmap_outputs=not self.use_ohem, + return_sampling_results=True) + if cls_reg_targets is None: + return None + (labels_list, label_weights_list, bbox_targets_list, bbox_weights_list, + num_total_pos, num_total_neg, sampling_results) = cls_reg_targets + + if self.use_ohem: + num_images = len(img_metas) + all_cls_scores = torch.cat([ + s.permute(0, 2, 3, 1).reshape( + num_images, -1, self.cls_out_channels) for s in cls_scores + ], 1) + all_labels = torch.cat(labels_list, -1).view(num_images, -1) + all_label_weights = torch.cat(label_weights_list, + -1).view(num_images, -1) + all_bbox_preds = torch.cat([ + b.permute(0, 2, 3, 1).reshape(num_images, -1, 4) + for b in bbox_preds + ], -2) + all_bbox_targets = torch.cat(bbox_targets_list, + -2).view(num_images, -1, 4) + all_bbox_weights = torch.cat(bbox_weights_list, + -2).view(num_images, -1, 4) + + # concat all level anchors to a single tensor + all_anchors = [] + for i in range(num_images): + all_anchors.append(torch.cat(anchor_list[i])) + + # check NaN and Inf + assert torch.isfinite(all_cls_scores).all().item(), \ + 'classification scores become infinite or NaN!' + assert torch.isfinite(all_bbox_preds).all().item(), \ + 'bbox predications become infinite or NaN!' + + losses_cls, losses_bbox = multi_apply( + self.loss_single_OHEM, + all_cls_scores, + all_bbox_preds, + all_anchors, + all_labels, + all_label_weights, + all_bbox_targets, + all_bbox_weights, + num_total_samples=num_total_pos) + else: + num_total_samples = ( + num_total_pos + + num_total_neg if self.sampling else num_total_pos) + + # anchor number of multi levels + num_level_anchors = [anchors.size(0) for anchors in anchor_list[0]] + # concat all level anchors and flags to a single tensor + concat_anchor_list = [] + for i in range(len(anchor_list)): + concat_anchor_list.append(torch.cat(anchor_list[i])) + all_anchor_list = images_to_levels(concat_anchor_list, + num_level_anchors) + losses_cls, losses_bbox = multi_apply( + self.loss_single, + cls_scores, + bbox_preds, + all_anchor_list, + labels_list, + label_weights_list, + bbox_targets_list, + bbox_weights_list, + num_total_samples=num_total_samples) + + return dict( + loss_cls=losses_cls, loss_bbox=losses_bbox), sampling_results + + def loss_single_OHEM(self, cls_score, bbox_pred, anchors, labels, + label_weights, bbox_targets, bbox_weights, + num_total_samples): + """"See func:``SSDHead.loss``.""" + loss_cls_all = self.loss_cls(cls_score, labels, label_weights) + + # FG cat_id: [0, num_classes -1], BG cat_id: num_classes + pos_inds = ((labels >= 0) & (labels < self.num_classes)).nonzero( + as_tuple=False).reshape(-1) + neg_inds = (labels == self.num_classes).nonzero( + as_tuple=False).view(-1) + + num_pos_samples = pos_inds.size(0) + if num_pos_samples == 0: + num_neg_samples = neg_inds.size(0) + else: + num_neg_samples = self.train_cfg.neg_pos_ratio * num_pos_samples + if num_neg_samples > neg_inds.size(0): + num_neg_samples = neg_inds.size(0) + topk_loss_cls_neg, _ = loss_cls_all[neg_inds].topk(num_neg_samples) + loss_cls_pos = loss_cls_all[pos_inds].sum() + loss_cls_neg = topk_loss_cls_neg.sum() + loss_cls = (loss_cls_pos + loss_cls_neg) / num_total_samples + if self.reg_decoded_bbox: + # When the regression loss (e.g. `IouLoss`, `GIouLoss`) + # is applied directly on the decoded bounding boxes, it + # decodes the already encoded coordinates to absolute format. + bbox_pred = self.bbox_coder.decode(anchors, bbox_pred) + loss_bbox = self.loss_bbox( + bbox_pred, + bbox_targets, + bbox_weights, + avg_factor=num_total_samples) + return loss_cls[None], loss_bbox + + @force_fp32(apply_to=('cls_scores', 'bbox_preds', 'coeff_preds')) + def get_bboxes(self, + cls_scores, + bbox_preds, + coeff_preds, + img_metas, + cfg=None, + rescale=False): + """"Similar to func:``AnchorHead.get_bboxes``, but additionally + processes coeff_preds. + + Args: + cls_scores (list[Tensor]): Box scores for each scale level + with shape (N, num_anchors * num_classes, H, W) + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level with shape (N, num_anchors * 4, H, W) + coeff_preds (list[Tensor]): Mask coefficients for each scale + level with shape (N, num_anchors * num_protos, H, W) + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + cfg (mmcv.Config | None): Test / postprocessing configuration, + if None, test_cfg would be used + rescale (bool): If True, return boxes in original image space. + Default: False. + + Returns: + list[tuple[Tensor, Tensor, Tensor]]: Each item in result_list is + a 3-tuple. The first item is an (n, 5) tensor, where the + first 4 columns are bounding box positions + (tl_x, tl_y, br_x, br_y) and the 5-th column is a score + between 0 and 1. The second item is an (n,) tensor where each + item is the predicted class label of the corresponding box. + The third item is an (n, num_protos) tensor where each item + is the predicted mask coefficients of instance inside the + corresponding box. + """ + assert len(cls_scores) == len(bbox_preds) + num_levels = len(cls_scores) + + device = cls_scores[0].device + featmap_sizes = [cls_scores[i].shape[-2:] for i in range(num_levels)] + mlvl_anchors = self.prior_generator.grid_priors( + featmap_sizes, device=device) + + det_bboxes = [] + det_labels = [] + det_coeffs = [] + for img_id in range(len(img_metas)): + cls_score_list = select_single_mlvl(cls_scores, img_id) + bbox_pred_list = select_single_mlvl(bbox_preds, img_id) + coeff_pred_list = select_single_mlvl(coeff_preds, img_id) + img_shape = img_metas[img_id]['img_shape'] + scale_factor = img_metas[img_id]['scale_factor'] + bbox_res = self._get_bboxes_single(cls_score_list, bbox_pred_list, + coeff_pred_list, mlvl_anchors, + img_shape, scale_factor, cfg, + rescale) + det_bboxes.append(bbox_res[0]) + det_labels.append(bbox_res[1]) + det_coeffs.append(bbox_res[2]) + return det_bboxes, det_labels, det_coeffs + + def _get_bboxes_single(self, + cls_score_list, + bbox_pred_list, + coeff_preds_list, + mlvl_anchors, + img_shape, + scale_factor, + cfg, + rescale=False): + """"Similar to func:``AnchorHead._get_bboxes_single``, but additionally + processes coeff_preds_list and uses fast NMS instead of traditional + NMS. + + Args: + cls_score_list (list[Tensor]): Box scores for a single scale level + Has shape (num_anchors * num_classes, H, W). + bbox_pred_list (list[Tensor]): Box energies / deltas for a single + scale level with shape (num_anchors * 4, H, W). + coeff_preds_list (list[Tensor]): Mask coefficients for a single + scale level with shape (num_anchors * num_protos, H, W). + mlvl_anchors (list[Tensor]): Box reference for a single scale level + with shape (num_total_anchors, 4). + img_shape (tuple[int]): Shape of the input image, + (height, width, 3). + scale_factor (ndarray): Scale factor of the image arange as + (w_scale, h_scale, w_scale, h_scale). + cfg (mmcv.Config): Test / postprocessing configuration, + if None, test_cfg would be used. + rescale (bool): If True, return boxes in original image space. + + Returns: + tuple[Tensor, Tensor, Tensor]: The first item is an (n, 5) tensor, + where the first 4 columns are bounding box positions + (tl_x, tl_y, br_x, br_y) and the 5-th column is a score between + 0 and 1. The second item is an (n,) tensor where each item is + the predicted class label of the corresponding box. The third + item is an (n, num_protos) tensor where each item is the + predicted mask coefficients of instance inside the + corresponding box. + """ + cfg = self.test_cfg if cfg is None else cfg + assert len(cls_score_list) == len(bbox_pred_list) == len(mlvl_anchors) + nms_pre = cfg.get('nms_pre', -1) + mlvl_bboxes = [] + mlvl_scores = [] + mlvl_coeffs = [] + for cls_score, bbox_pred, coeff_pred, anchors in \ + zip(cls_score_list, bbox_pred_list, + coeff_preds_list, mlvl_anchors): + assert cls_score.size()[-2:] == bbox_pred.size()[-2:] + cls_score = cls_score.permute(1, 2, + 0).reshape(-1, self.cls_out_channels) + if self.use_sigmoid_cls: + scores = cls_score.sigmoid() + else: + scores = cls_score.softmax(-1) + bbox_pred = bbox_pred.permute(1, 2, 0).reshape(-1, 4) + coeff_pred = coeff_pred.permute(1, 2, + 0).reshape(-1, self.num_protos) + + if 0 < nms_pre < scores.shape[0]: + # Get maximum scores for foreground classes. + if self.use_sigmoid_cls: + max_scores, _ = scores.max(dim=1) + else: + # remind that we set FG labels to [0, num_class-1] + # since mmdet v2.0 + # BG cat_id: num_class + max_scores, _ = scores[:, :-1].max(dim=1) + _, topk_inds = max_scores.topk(nms_pre) + anchors = anchors[topk_inds, :] + bbox_pred = bbox_pred[topk_inds, :] + scores = scores[topk_inds, :] + coeff_pred = coeff_pred[topk_inds, :] + bboxes = self.bbox_coder.decode( + anchors, bbox_pred, max_shape=img_shape) + mlvl_bboxes.append(bboxes) + mlvl_scores.append(scores) + mlvl_coeffs.append(coeff_pred) + mlvl_bboxes = torch.cat(mlvl_bboxes) + if rescale: + mlvl_bboxes /= mlvl_bboxes.new_tensor(scale_factor) + mlvl_scores = torch.cat(mlvl_scores) + mlvl_coeffs = torch.cat(mlvl_coeffs) + if self.use_sigmoid_cls: + # Add a dummy background class to the backend when using sigmoid + # remind that we set FG labels to [0, num_class-1] since mmdet v2.0 + # BG cat_id: num_class + padding = mlvl_scores.new_zeros(mlvl_scores.shape[0], 1) + mlvl_scores = torch.cat([mlvl_scores, padding], dim=1) + det_bboxes, det_labels, det_coeffs = fast_nms(mlvl_bboxes, mlvl_scores, + mlvl_coeffs, + cfg.score_thr, + cfg.iou_thr, cfg.top_k, + cfg.max_per_img) + return det_bboxes, det_labels, det_coeffs + + +@HEADS.register_module() +class YOLACTSegmHead(BaseModule): + """YOLACT segmentation head used in https://arxiv.org/abs/1904.02689. + + Apply a semantic segmentation loss on feature space using layers that are + only evaluated during training to increase performance with no speed + penalty. + + Args: + in_channels (int): Number of channels in the input feature map. + num_classes (int): Number of categories excluding the background + category. + loss_segm (dict): Config of semantic segmentation loss. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + num_classes, + in_channels=256, + loss_segm=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=1.0), + init_cfg=dict( + type='Xavier', + distribution='uniform', + override=dict(name='segm_conv'))): + super(YOLACTSegmHead, self).__init__(init_cfg) + self.in_channels = in_channels + self.num_classes = num_classes + self.loss_segm = build_loss(loss_segm) + self._init_layers() + self.fp16_enabled = False + + def _init_layers(self): + """Initialize layers of the head.""" + self.segm_conv = nn.Conv2d( + self.in_channels, self.num_classes, kernel_size=1) + + def forward(self, x): + """Forward feature from the upstream network. + + Args: + x (Tensor): Feature from the upstream network, which is + a 4D-tensor. + + Returns: + Tensor: Predicted semantic segmentation map with shape + (N, num_classes, H, W). + """ + return self.segm_conv(x) + + @force_fp32(apply_to=('segm_pred', )) + def loss(self, segm_pred, gt_masks, gt_labels): + """Compute loss of the head. + + Args: + segm_pred (list[Tensor]): Predicted semantic segmentation map + with shape (N, num_classes, H, W). + gt_masks (list[Tensor]): Ground truth masks for each image with + the same shape of the input image. + gt_labels (list[Tensor]): Class indices corresponding to each box. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + loss_segm = [] + num_imgs, num_classes, mask_h, mask_w = segm_pred.size() + for idx in range(num_imgs): + cur_segm_pred = segm_pred[idx] + cur_gt_masks = gt_masks[idx].float() + cur_gt_labels = gt_labels[idx] + segm_targets = self.get_targets(cur_segm_pred, cur_gt_masks, + cur_gt_labels) + if segm_targets is None: + loss = self.loss_segm(cur_segm_pred, + torch.zeros_like(cur_segm_pred), + torch.zeros_like(cur_segm_pred)) + else: + loss = self.loss_segm( + cur_segm_pred, + segm_targets, + avg_factor=num_imgs * mask_h * mask_w) + loss_segm.append(loss) + return dict(loss_segm=loss_segm) + + def get_targets(self, segm_pred, gt_masks, gt_labels): + """Compute semantic segmentation targets for each image. + + Args: + segm_pred (Tensor): Predicted semantic segmentation map + with shape (num_classes, H, W). + gt_masks (Tensor): Ground truth masks for each image with + the same shape of the input image. + gt_labels (Tensor): Class indices corresponding to each box. + + Returns: + Tensor: Semantic segmentation targets with shape + (num_classes, H, W). + """ + if gt_masks.size(0) == 0: + return None + num_classes, mask_h, mask_w = segm_pred.size() + with torch.no_grad(): + downsampled_masks = F.interpolate( + gt_masks.unsqueeze(0), (mask_h, mask_w), + mode='bilinear', + align_corners=False).squeeze(0) + downsampled_masks = downsampled_masks.gt(0.5).float() + segm_targets = torch.zeros_like(segm_pred, requires_grad=False) + for obj_idx in range(downsampled_masks.size(0)): + segm_targets[gt_labels[obj_idx] - 1] = torch.max( + segm_targets[gt_labels[obj_idx] - 1], + downsampled_masks[obj_idx]) + return segm_targets + + def simple_test(self, feats, img_metas, rescale=False): + """Test function without test-time augmentation.""" + raise NotImplementedError( + 'simple_test of YOLACTSegmHead is not implemented ' + 'because this head is only evaluated during training') + + +@HEADS.register_module() +class YOLACTProtonet(BaseModule): + """YOLACT mask head used in https://arxiv.org/abs/1904.02689. + + This head outputs the mask prototypes for YOLACT. + + Args: + in_channels (int): Number of channels in the input feature map. + proto_channels (tuple[int]): Output channels of protonet convs. + proto_kernel_sizes (tuple[int]): Kernel sizes of protonet convs. + include_last_relu (Bool): If keep the last relu of protonet. + num_protos (int): Number of prototypes. + num_classes (int): Number of categories excluding the background + category. + loss_mask_weight (float): Reweight the mask loss by this factor. + max_masks_to_train (int): Maximum number of masks to train for + each image. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + num_classes, + in_channels=256, + proto_channels=(256, 256, 256, None, 256, 32), + proto_kernel_sizes=(3, 3, 3, -2, 3, 1), + include_last_relu=True, + num_protos=32, + loss_mask_weight=1.0, + max_masks_to_train=100, + init_cfg=dict( + type='Xavier', + distribution='uniform', + override=dict(name='protonet'))): + super(YOLACTProtonet, self).__init__(init_cfg) + self.in_channels = in_channels + self.proto_channels = proto_channels + self.proto_kernel_sizes = proto_kernel_sizes + self.include_last_relu = include_last_relu + self.protonet = self._init_layers() + + self.loss_mask_weight = loss_mask_weight + self.num_protos = num_protos + self.num_classes = num_classes + self.max_masks_to_train = max_masks_to_train + self.fp16_enabled = False + + def _init_layers(self): + """A helper function to take a config setting and turn it into a + network.""" + # Possible patterns: + # ( 256, 3) -> conv + # ( 256,-2) -> deconv + # (None,-2) -> bilinear interpolate + in_channels = self.in_channels + protonets = ModuleList() + for num_channels, kernel_size in zip(self.proto_channels, + self.proto_kernel_sizes): + if kernel_size > 0: + layer = nn.Conv2d( + in_channels, + num_channels, + kernel_size, + padding=kernel_size // 2) + else: + if num_channels is None: + layer = InterpolateModule( + scale_factor=-kernel_size, + mode='bilinear', + align_corners=False) + else: + layer = nn.ConvTranspose2d( + in_channels, + num_channels, + -kernel_size, + padding=kernel_size // 2) + protonets.append(layer) + protonets.append(nn.ReLU(inplace=True)) + in_channels = num_channels if num_channels is not None \ + else in_channels + if not self.include_last_relu: + protonets = protonets[:-1] + return nn.Sequential(*protonets) + + def forward_dummy(self, x): + prototypes = self.protonet(x) + return prototypes + + def forward(self, x, coeff_pred, bboxes, img_meta, sampling_results=None): + """Forward feature from the upstream network to get prototypes and + linearly combine the prototypes, using masks coefficients, into + instance masks. Finally, crop the instance masks with given bboxes. + + Args: + x (Tensor): Feature from the upstream network, which is + a 4D-tensor. + coeff_pred (list[Tensor]): Mask coefficients for each scale + level with shape (N, num_anchors * num_protos, H, W). + bboxes (list[Tensor]): Box used for cropping with shape + (N, num_anchors * 4, H, W). During training, they are + ground truth boxes. During testing, they are predicted + boxes. + img_meta (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + sampling_results (List[:obj:``SamplingResult``]): Sampler results + for each image. + + Returns: + list[Tensor]: Predicted instance segmentation masks. + """ + prototypes = self.protonet(x) + prototypes = prototypes.permute(0, 2, 3, 1).contiguous() + + num_imgs = x.size(0) + + # The reason for not using self.training is that + # val workflow will have a dimension mismatch error. + # Note that this writing method is very tricky. + # Fix https://github.com/open-mmlab/mmdetection/issues/5978 + is_train_or_val_workflow = (coeff_pred[0].dim() == 4) + + # Train or val workflow + if is_train_or_val_workflow: + coeff_pred_list = [] + for coeff_pred_per_level in coeff_pred: + coeff_pred_per_level = \ + coeff_pred_per_level.permute( + 0, 2, 3, 1).reshape(num_imgs, -1, self.num_protos) + coeff_pred_list.append(coeff_pred_per_level) + coeff_pred = torch.cat(coeff_pred_list, dim=1) + + mask_pred_list = [] + for idx in range(num_imgs): + cur_prototypes = prototypes[idx] + cur_coeff_pred = coeff_pred[idx] + cur_bboxes = bboxes[idx] + cur_img_meta = img_meta[idx] + + # Testing state + if not is_train_or_val_workflow: + bboxes_for_cropping = cur_bboxes + else: + cur_sampling_results = sampling_results[idx] + pos_assigned_gt_inds = \ + cur_sampling_results.pos_assigned_gt_inds + bboxes_for_cropping = cur_bboxes[pos_assigned_gt_inds].clone() + pos_inds = cur_sampling_results.pos_inds + cur_coeff_pred = cur_coeff_pred[pos_inds] + + # Linearly combine the prototypes with the mask coefficients + mask_pred = cur_prototypes @ cur_coeff_pred.t() + mask_pred = torch.sigmoid(mask_pred) + + h, w = cur_img_meta['img_shape'][:2] + bboxes_for_cropping[:, 0] /= w + bboxes_for_cropping[:, 1] /= h + bboxes_for_cropping[:, 2] /= w + bboxes_for_cropping[:, 3] /= h + + mask_pred = self.crop(mask_pred, bboxes_for_cropping) + mask_pred = mask_pred.permute(2, 0, 1).contiguous() + mask_pred_list.append(mask_pred) + return mask_pred_list + + @force_fp32(apply_to=('mask_pred', )) + def loss(self, mask_pred, gt_masks, gt_bboxes, img_meta, sampling_results): + """Compute loss of the head. + + Args: + mask_pred (list[Tensor]): Predicted prototypes with shape + (num_classes, H, W). + gt_masks (list[Tensor]): Ground truth masks for each image with + the same shape of the input image. + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + img_meta (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + sampling_results (List[:obj:``SamplingResult``]): Sampler results + for each image. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + loss_mask = [] + num_imgs = len(mask_pred) + total_pos = 0 + for idx in range(num_imgs): + cur_mask_pred = mask_pred[idx] + cur_gt_masks = gt_masks[idx].float() + cur_gt_bboxes = gt_bboxes[idx] + cur_img_meta = img_meta[idx] + cur_sampling_results = sampling_results[idx] + + pos_assigned_gt_inds = cur_sampling_results.pos_assigned_gt_inds + num_pos = pos_assigned_gt_inds.size(0) + # Since we're producing (near) full image masks, + # it'd take too much vram to backprop on every single mask. + # Thus we select only a subset. + if num_pos > self.max_masks_to_train: + perm = torch.randperm(num_pos) + select = perm[:self.max_masks_to_train] + cur_mask_pred = cur_mask_pred[select] + pos_assigned_gt_inds = pos_assigned_gt_inds[select] + num_pos = self.max_masks_to_train + total_pos += num_pos + + gt_bboxes_for_reweight = cur_gt_bboxes[pos_assigned_gt_inds] + + mask_targets = self.get_targets(cur_mask_pred, cur_gt_masks, + pos_assigned_gt_inds) + if num_pos == 0: + loss = cur_mask_pred.sum() * 0. + elif mask_targets is None: + loss = F.binary_cross_entropy(cur_mask_pred, + torch.zeros_like(cur_mask_pred), + torch.zeros_like(cur_mask_pred)) + else: + cur_mask_pred = torch.clamp(cur_mask_pred, 0, 1) + loss = F.binary_cross_entropy( + cur_mask_pred, mask_targets, + reduction='none') * self.loss_mask_weight + + h, w = cur_img_meta['img_shape'][:2] + gt_bboxes_width = (gt_bboxes_for_reweight[:, 2] - + gt_bboxes_for_reweight[:, 0]) / w + gt_bboxes_height = (gt_bboxes_for_reweight[:, 3] - + gt_bboxes_for_reweight[:, 1]) / h + loss = loss.mean(dim=(1, + 2)) / gt_bboxes_width / gt_bboxes_height + loss = torch.sum(loss) + loss_mask.append(loss) + + if total_pos == 0: + total_pos += 1 # avoid nan + loss_mask = [x / total_pos for x in loss_mask] + + return dict(loss_mask=loss_mask) + + def get_targets(self, mask_pred, gt_masks, pos_assigned_gt_inds): + """Compute instance segmentation targets for each image. + + Args: + mask_pred (Tensor): Predicted prototypes with shape + (num_classes, H, W). + gt_masks (Tensor): Ground truth masks for each image with + the same shape of the input image. + pos_assigned_gt_inds (Tensor): GT indices of the corresponding + positive samples. + Returns: + Tensor: Instance segmentation targets with shape + (num_instances, H, W). + """ + if gt_masks.size(0) == 0: + return None + mask_h, mask_w = mask_pred.shape[-2:] + gt_masks = F.interpolate( + gt_masks.unsqueeze(0), (mask_h, mask_w), + mode='bilinear', + align_corners=False).squeeze(0) + gt_masks = gt_masks.gt(0.5).float() + mask_targets = gt_masks[pos_assigned_gt_inds] + return mask_targets + + def get_seg_masks(self, mask_pred, label_pred, img_meta, rescale): + """Resize, binarize, and format the instance mask predictions. + + Args: + mask_pred (Tensor): shape (N, H, W). + label_pred (Tensor): shape (N, ). + img_meta (dict): Meta information of each image, e.g., + image size, scaling factor, etc. + rescale (bool): If rescale is False, then returned masks will + fit the scale of imgs[0]. + Returns: + list[ndarray]: Mask predictions grouped by their predicted classes. + """ + ori_shape = img_meta['ori_shape'] + scale_factor = img_meta['scale_factor'] + if rescale: + img_h, img_w = ori_shape[:2] + else: + img_h = np.round(ori_shape[0] * scale_factor[1]).astype(np.int32) + img_w = np.round(ori_shape[1] * scale_factor[0]).astype(np.int32) + + cls_segms = [[] for _ in range(self.num_classes)] + if mask_pred.size(0) == 0: + return cls_segms + + mask_pred = F.interpolate( + mask_pred.unsqueeze(0), (img_h, img_w), + mode='bilinear', + align_corners=False).squeeze(0) > 0.5 + mask_pred = mask_pred.cpu().numpy().astype(np.uint8) + + for m, l in zip(mask_pred, label_pred): + cls_segms[l].append(m) + return cls_segms + + def crop(self, masks, boxes, padding=1): + """Crop predicted masks by zeroing out everything not in the predicted + bbox. + + Args: + masks (Tensor): shape [H, W, N]. + boxes (Tensor): bbox coords in relative point form with + shape [N, 4]. + + Return: + Tensor: The cropped masks. + """ + h, w, n = masks.size() + x1, x2 = self.sanitize_coordinates( + boxes[:, 0], boxes[:, 2], w, padding, cast=False) + y1, y2 = self.sanitize_coordinates( + boxes[:, 1], boxes[:, 3], h, padding, cast=False) + + rows = torch.arange( + w, device=masks.device, dtype=x1.dtype).view(1, -1, + 1).expand(h, w, n) + cols = torch.arange( + h, device=masks.device, dtype=x1.dtype).view(-1, 1, + 1).expand(h, w, n) + + masks_left = rows >= x1.view(1, 1, -1) + masks_right = rows < x2.view(1, 1, -1) + masks_up = cols >= y1.view(1, 1, -1) + masks_down = cols < y2.view(1, 1, -1) + + crop_mask = masks_left * masks_right * masks_up * masks_down + + return masks * crop_mask.float() + + def sanitize_coordinates(self, x1, x2, img_size, padding=0, cast=True): + """Sanitizes the input coordinates so that x1 < x2, x1 != x2, x1 >= 0, + and x2 <= image_size. Also converts from relative to absolute + coordinates and casts the results to long tensors. + + Warning: this does things in-place behind the scenes so + copy if necessary. + + Args: + _x1 (Tensor): shape (N, ). + _x2 (Tensor): shape (N, ). + img_size (int): Size of the input image. + padding (int): x1 >= padding, x2 <= image_size-padding. + cast (bool): If cast is false, the result won't be cast to longs. + + Returns: + tuple: + x1 (Tensor): Sanitized _x1. + x2 (Tensor): Sanitized _x2. + """ + x1 = x1 * img_size + x2 = x2 * img_size + if cast: + x1 = x1.long() + x2 = x2.long() + x1 = torch.min(x1, x2) + x2 = torch.max(x1, x2) + x1 = torch.clamp(x1 - padding, min=0) + x2 = torch.clamp(x2 + padding, max=img_size) + return x1, x2 + + def simple_test(self, + feats, + det_bboxes, + det_labels, + det_coeffs, + img_metas, + rescale=False): + """Test function without test-time augmentation. + + Args: + feats (tuple[torch.Tensor]): Multi-level features from the + upstream network, each is a 4D-tensor. + det_bboxes (list[Tensor]): BBox results of each image. each + element is (n, 5) tensor, where 5 represent + (tl_x, tl_y, br_x, br_y, score) and the score between 0 and 1. + det_labels (list[Tensor]): BBox results of each image. each + element is (n, ) tensor, each element represents the class + label of the corresponding box. + det_coeffs (list[Tensor]): BBox coefficient of each image. each + element is (n, m) tensor, m is vector length. + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + rescale (bool, optional): Whether to rescale the results. + Defaults to False. + + Returns: + list[list]: encoded masks. The c-th item in the outer list + corresponds to the c-th class. Given the c-th outer list, the + i-th item in that inner list is the mask for the i-th box with + class label c. + """ + num_imgs = len(img_metas) + scale_factors = tuple(meta['scale_factor'] for meta in img_metas) + if all(det_bbox.shape[0] == 0 for det_bbox in det_bboxes): + segm_results = [[[] for _ in range(self.num_classes)] + for _ in range(num_imgs)] + else: + # if det_bboxes is rescaled to the original image size, we need to + # rescale it back to the testing scale to obtain RoIs. + if rescale and not isinstance(scale_factors[0], float): + scale_factors = [ + torch.from_numpy(scale_factor).to(det_bboxes[0].device) + for scale_factor in scale_factors + ] + _bboxes = [ + det_bboxes[i][:, :4] * + scale_factors[i] if rescale else det_bboxes[i][:, :4] + for i in range(len(det_bboxes)) + ] + mask_preds = self.forward(feats[0], det_coeffs, _bboxes, img_metas) + # apply mask post-processing to each image individually + segm_results = [] + for i in range(num_imgs): + if det_bboxes[i].shape[0] == 0: + segm_results.append([[] for _ in range(self.num_classes)]) + else: + segm_result = self.get_seg_masks(mask_preds[i], + det_labels[i], + img_metas[i], rescale) + segm_results.append(segm_result) + return segm_results + + +class InterpolateModule(BaseModule): + """This is a module version of F.interpolate. + + Any arguments you give it just get passed along for the ride. + """ + + def __init__(self, *args, init_cfg=None, **kwargs): + super().__init__(init_cfg) + + self.args = args + self.kwargs = kwargs + + def forward(self, x): + """Forward features from the upstream network.""" + return F.interpolate(x, *self.args, **self.kwargs) diff --git a/mmdet/models/dense_heads/yolo_head.py b/mmdet/models/dense_heads/yolo_head.py new file mode 100644 index 0000000..b446cb7 --- /dev/null +++ b/mmdet/models/dense_heads/yolo_head.py @@ -0,0 +1,621 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# Copyright (c) 2019 Western Digital Corporation or its affiliates. + +import warnings + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import (ConvModule, bias_init_with_prob, constant_init, is_norm, + normal_init) +from mmcv.runner import force_fp32 + +from mmdet.core import (build_assigner, build_bbox_coder, + build_prior_generator, build_sampler, images_to_levels, + multi_apply, multiclass_nms) +from ..builder import HEADS, build_loss +from .base_dense_head import BaseDenseHead +from .dense_test_mixins import BBoxTestMixin + + +@HEADS.register_module() +class YOLOV3Head(BaseDenseHead, BBoxTestMixin): + """YOLOV3Head Paper link: https://arxiv.org/abs/1804.02767. + + Args: + num_classes (int): The number of object classes (w/o background) + in_channels (List[int]): Number of input channels per scale. + out_channels (List[int]): The number of output channels per scale + before the final 1x1 layer. Default: (1024, 512, 256). + anchor_generator (dict): Config dict for anchor generator + bbox_coder (dict): Config of bounding box coder. + featmap_strides (List[int]): The stride of each scale. + Should be in descending order. Default: (32, 16, 8). + one_hot_smoother (float): Set a non-zero value to enable label-smooth + Default: 0. + conv_cfg (dict): Config dict for convolution layer. Default: None. + norm_cfg (dict): Dictionary to construct and config norm layer. + Default: dict(type='BN', requires_grad=True) + act_cfg (dict): Config dict for activation layer. + Default: dict(type='LeakyReLU', negative_slope=0.1). + loss_cls (dict): Config of classification loss. + loss_conf (dict): Config of confidence loss. + loss_xy (dict): Config of xy coordinate loss. + loss_wh (dict): Config of wh coordinate loss. + train_cfg (dict): Training config of YOLOV3 head. Default: None. + test_cfg (dict): Testing config of YOLOV3 head. Default: None. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + num_classes, + in_channels, + out_channels=(1024, 512, 256), + anchor_generator=dict( + type='YOLOAnchorGenerator', + base_sizes=[[(116, 90), (156, 198), (373, 326)], + [(30, 61), (62, 45), (59, 119)], + [(10, 13), (16, 30), (33, 23)]], + strides=[32, 16, 8]), + bbox_coder=dict(type='YOLOBBoxCoder'), + featmap_strides=[32, 16, 8], + one_hot_smoother=0., + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + act_cfg=dict(type='LeakyReLU', negative_slope=0.1), + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=1.0), + loss_conf=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=1.0), + loss_xy=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=1.0), + loss_wh=dict(type='MSELoss', loss_weight=1.0), + train_cfg=None, + test_cfg=None, + init_cfg=dict( + type='Normal', std=0.01, + override=dict(name='convs_pred'))): + super(YOLOV3Head, self).__init__(init_cfg) + # Check params + assert (len(in_channels) == len(out_channels) == len(featmap_strides)) + + self.num_classes = num_classes + self.in_channels = in_channels + self.out_channels = out_channels + self.featmap_strides = featmap_strides + self.train_cfg = train_cfg + self.test_cfg = test_cfg + if self.train_cfg: + self.assigner = build_assigner(self.train_cfg.assigner) + if hasattr(self.train_cfg, 'sampler'): + sampler_cfg = self.train_cfg.sampler + else: + sampler_cfg = dict(type='PseudoSampler') + self.sampler = build_sampler(sampler_cfg, context=self) + self.fp16_enabled = False + + self.one_hot_smoother = one_hot_smoother + + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + + self.bbox_coder = build_bbox_coder(bbox_coder) + + self.prior_generator = build_prior_generator(anchor_generator) + + self.loss_cls = build_loss(loss_cls) + self.loss_conf = build_loss(loss_conf) + self.loss_xy = build_loss(loss_xy) + self.loss_wh = build_loss(loss_wh) + + self.num_base_priors = self.prior_generator.num_base_priors[0] + assert len( + self.prior_generator.num_base_priors) == len(featmap_strides) + self._init_layers() + + @property + def anchor_generator(self): + + warnings.warn('DeprecationWarning: `anchor_generator` is deprecated, ' + 'please use "prior_generator" instead') + return self.prior_generator + + @property + def num_anchors(self): + """ + Returns: + int: Number of anchors on each point of feature map. + """ + warnings.warn('DeprecationWarning: `num_anchors` is deprecated, ' + 'please use "num_base_priors" instead') + return self.num_base_priors + + @property + def num_levels(self): + return len(self.featmap_strides) + + @property + def num_attrib(self): + """int: number of attributes in pred_map, bboxes (4) + + objectness (1) + num_classes""" + + return 5 + self.num_classes + + def _init_layers(self): + self.convs_bridge = nn.ModuleList() + self.convs_pred = nn.ModuleList() + for i in range(self.num_levels): + conv_bridge = ConvModule( + self.in_channels[i], + self.out_channels[i], + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg) + conv_pred = nn.Conv2d(self.out_channels[i], + self.num_base_priors * self.num_attrib, 1) + + self.convs_bridge.append(conv_bridge) + self.convs_pred.append(conv_pred) + + def init_weights(self): + for m in self.modules(): + if isinstance(m, nn.Conv2d): + normal_init(m, mean=0, std=0.01) + if is_norm(m): + constant_init(m, 1) + + # Use prior in model initialization to improve stability + for conv_pred, stride in zip(self.convs_pred, self.featmap_strides): + bias = conv_pred.bias.reshape(self.num_base_priors, -1) + # init objectness with prior of 8 objects per feature map + # refer to https://github.com/ultralytics/yolov3 + nn.init.constant_(bias.data[:, 4], + bias_init_with_prob(8 / (608 / stride)**2)) + nn.init.constant_(bias.data[:, 5:], bias_init_with_prob(0.01)) + + def forward(self, feats): + """Forward features from the upstream network. + + Args: + feats (tuple[Tensor]): Features from the upstream network, each is + a 4D-tensor. + + Returns: + tuple[Tensor]: A tuple of multi-level predication map, each is a + 4D-tensor of shape (batch_size, 5+num_classes, height, width). + """ + + assert len(feats) == self.num_levels + pred_maps = [] + for i in range(self.num_levels): + x = feats[i] + x = self.convs_bridge[i](x) + pred_map = self.convs_pred[i](x) + pred_maps.append(pred_map) + + return tuple(pred_maps), + + @force_fp32(apply_to=('pred_maps', )) + def get_bboxes(self, + pred_maps, + img_metas, + cfg=None, + rescale=False, + with_nms=True): + """Transform network output for a batch into bbox predictions. It has + been accelerated since PR #5991. + + Args: + pred_maps (list[Tensor]): Raw predictions for a batch of images. + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + cfg (mmcv.Config | None): Test / postprocessing configuration, + if None, test_cfg would be used. Default: None. + rescale (bool): If True, return boxes in original image space. + Default: False. + with_nms (bool): If True, do nms before return boxes. + Default: True. + + Returns: + list[tuple[Tensor, Tensor]]: Each item in result_list is 2-tuple. + The first item is an (n, 5) tensor, where 5 represent + (tl_x, tl_y, br_x, br_y, score) and the score between 0 and 1. + The shape of the second tensor in the tuple is (n,), and + each element represents the class label of the corresponding + box. + """ + assert len(pred_maps) == self.num_levels + cfg = self.test_cfg if cfg is None else cfg + scale_factors = np.array( + [img_meta['scale_factor'] for img_meta in img_metas]) + + num_imgs = len(img_metas) + featmap_sizes = [pred_map.shape[-2:] for pred_map in pred_maps] + + mlvl_anchors = self.prior_generator.grid_priors( + featmap_sizes, device=pred_maps[0].device) + flatten_preds = [] + flatten_strides = [] + for pred, stride in zip(pred_maps, self.featmap_strides): + pred = pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, + self.num_attrib) + pred[..., :2].sigmoid_() + flatten_preds.append(pred) + flatten_strides.append( + pred.new_tensor(stride).expand(pred.size(1))) + + flatten_preds = torch.cat(flatten_preds, dim=1) + flatten_bbox_preds = flatten_preds[..., :4] + flatten_objectness = flatten_preds[..., 4].sigmoid() + flatten_cls_scores = flatten_preds[..., 5:].sigmoid() + flatten_anchors = torch.cat(mlvl_anchors) + flatten_strides = torch.cat(flatten_strides) + flatten_bboxes = self.bbox_coder.decode(flatten_anchors, + flatten_bbox_preds, + flatten_strides.unsqueeze(-1)) + + if with_nms and (flatten_objectness.size(0) == 0): + return torch.zeros((0, 5)), torch.zeros((0, )) + + if rescale: + flatten_bboxes /= flatten_bboxes.new_tensor( + scale_factors).unsqueeze(1) + + padding = flatten_bboxes.new_zeros(num_imgs, flatten_bboxes.shape[1], + 1) + flatten_cls_scores = torch.cat([flatten_cls_scores, padding], dim=-1) + + det_results = [] + for (bboxes, scores, objectness) in zip(flatten_bboxes, + flatten_cls_scores, + flatten_objectness): + # Filtering out all predictions with conf < conf_thr + conf_thr = cfg.get('conf_thr', -1) + if conf_thr > 0: + conf_inds = objectness >= conf_thr + bboxes = bboxes[conf_inds, :] + scores = scores[conf_inds, :] + objectness = objectness[conf_inds] + + det_bboxes, det_labels = multiclass_nms( + bboxes, + scores, + cfg.score_thr, + cfg.nms, + cfg.max_per_img, + score_factors=objectness) + det_results.append(tuple([det_bboxes, det_labels])) + return det_results + + @force_fp32(apply_to=('pred_maps', )) + def loss(self, + pred_maps, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Compute loss of the head. + + Args: + pred_maps (list[Tensor]): Prediction map for each scale level, + shape (N, num_anchors * num_attrib, H, W) + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (None | list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + num_imgs = len(img_metas) + device = pred_maps[0][0].device + + featmap_sizes = [ + pred_maps[i].shape[-2:] for i in range(self.num_levels) + ] + mlvl_anchors = self.prior_generator.grid_priors( + featmap_sizes, device=device) + anchor_list = [mlvl_anchors for _ in range(num_imgs)] + + responsible_flag_list = [] + for img_id in range(len(img_metas)): + responsible_flag_list.append( + self.prior_generator.responsible_flags(featmap_sizes, + gt_bboxes[img_id], + device)) + + target_maps_list, neg_maps_list = self.get_targets( + anchor_list, responsible_flag_list, gt_bboxes, gt_labels) + + losses_cls, losses_conf, losses_xy, losses_wh = multi_apply( + self.loss_single, pred_maps, target_maps_list, neg_maps_list) + + return dict( + loss_cls=losses_cls, + loss_conf=losses_conf, + loss_xy=losses_xy, + loss_wh=losses_wh) + + def loss_single(self, pred_map, target_map, neg_map): + """Compute loss of a single image from a batch. + + Args: + pred_map (Tensor): Raw predictions for a single level. + target_map (Tensor): The Ground-Truth target for a single level. + neg_map (Tensor): The negative masks for a single level. + + Returns: + tuple: + loss_cls (Tensor): Classification loss. + loss_conf (Tensor): Confidence loss. + loss_xy (Tensor): Regression loss of x, y coordinate. + loss_wh (Tensor): Regression loss of w, h coordinate. + """ + + num_imgs = len(pred_map) + pred_map = pred_map.permute(0, 2, 3, + 1).reshape(num_imgs, -1, self.num_attrib) + neg_mask = neg_map.float() + pos_mask = target_map[..., 4] + pos_and_neg_mask = neg_mask + pos_mask + pos_mask = pos_mask.unsqueeze(dim=-1) + if torch.max(pos_and_neg_mask) > 1.: + warnings.warn('There is overlap between pos and neg sample.') + pos_and_neg_mask = pos_and_neg_mask.clamp(min=0., max=1.) + + pred_xy = pred_map[..., :2] + pred_wh = pred_map[..., 2:4] + pred_conf = pred_map[..., 4] + pred_label = pred_map[..., 5:] + + target_xy = target_map[..., :2] + target_wh = target_map[..., 2:4] + target_conf = target_map[..., 4] + target_label = target_map[..., 5:] + + loss_cls = self.loss_cls(pred_label, target_label, weight=pos_mask) + loss_conf = self.loss_conf( + pred_conf, target_conf, weight=pos_and_neg_mask) + loss_xy = self.loss_xy(pred_xy, target_xy, weight=pos_mask) + loss_wh = self.loss_wh(pred_wh, target_wh, weight=pos_mask) + + return loss_cls, loss_conf, loss_xy, loss_wh + + def get_targets(self, anchor_list, responsible_flag_list, gt_bboxes_list, + gt_labels_list): + """Compute target maps for anchors in multiple images. + + Args: + anchor_list (list[list[Tensor]]): Multi level anchors of each + image. The outer list indicates images, and the inner list + corresponds to feature levels of the image. Each element of + the inner list is a tensor of shape (num_total_anchors, 4). + responsible_flag_list (list[list[Tensor]]): Multi level responsible + flags of each image. Each element is a tensor of shape + (num_total_anchors, ) + gt_bboxes_list (list[Tensor]): Ground truth bboxes of each image. + gt_labels_list (list[Tensor]): Ground truth labels of each box. + + Returns: + tuple: Usually returns a tuple containing learning targets. + - target_map_list (list[Tensor]): Target map of each level. + - neg_map_list (list[Tensor]): Negative map of each level. + """ + num_imgs = len(anchor_list) + + # anchor number of multi levels + num_level_anchors = [anchors.size(0) for anchors in anchor_list[0]] + + results = multi_apply(self._get_targets_single, anchor_list, + responsible_flag_list, gt_bboxes_list, + gt_labels_list) + + all_target_maps, all_neg_maps = results + assert num_imgs == len(all_target_maps) == len(all_neg_maps) + target_maps_list = images_to_levels(all_target_maps, num_level_anchors) + neg_maps_list = images_to_levels(all_neg_maps, num_level_anchors) + + return target_maps_list, neg_maps_list + + def _get_targets_single(self, anchors, responsible_flags, gt_bboxes, + gt_labels): + """Generate matching bounding box prior and converted GT. + + Args: + anchors (list[Tensor]): Multi-level anchors of the image. + responsible_flags (list[Tensor]): Multi-level responsible flags of + anchors + gt_bboxes (Tensor): Ground truth bboxes of single image. + gt_labels (Tensor): Ground truth labels of single image. + + Returns: + tuple: + target_map (Tensor): Predication target map of each + scale level, shape (num_total_anchors, + 5+num_classes) + neg_map (Tensor): Negative map of each scale level, + shape (num_total_anchors,) + """ + + anchor_strides = [] + for i in range(len(anchors)): + anchor_strides.append( + torch.tensor(self.featmap_strides[i], + device=gt_bboxes.device).repeat(len(anchors[i]))) + concat_anchors = torch.cat(anchors) + concat_responsible_flags = torch.cat(responsible_flags) + + anchor_strides = torch.cat(anchor_strides) + assert len(anchor_strides) == len(concat_anchors) == \ + len(concat_responsible_flags) + assign_result = self.assigner.assign(concat_anchors, + concat_responsible_flags, + gt_bboxes) + sampling_result = self.sampler.sample(assign_result, concat_anchors, + gt_bboxes) + + target_map = concat_anchors.new_zeros( + concat_anchors.size(0), self.num_attrib) + + target_map[sampling_result.pos_inds, :4] = self.bbox_coder.encode( + sampling_result.pos_bboxes, sampling_result.pos_gt_bboxes, + anchor_strides[sampling_result.pos_inds]) + + target_map[sampling_result.pos_inds, 4] = 1 + + gt_labels_one_hot = F.one_hot( + gt_labels, num_classes=self.num_classes).float() + if self.one_hot_smoother != 0: # label smooth + gt_labels_one_hot = gt_labels_one_hot * ( + 1 - self.one_hot_smoother + ) + self.one_hot_smoother / self.num_classes + target_map[sampling_result.pos_inds, 5:] = gt_labels_one_hot[ + sampling_result.pos_assigned_gt_inds] + + neg_map = concat_anchors.new_zeros( + concat_anchors.size(0), dtype=torch.uint8) + neg_map[sampling_result.neg_inds] = 1 + + return target_map, neg_map + + def aug_test(self, feats, img_metas, rescale=False): + """Test function with test time augmentation. + + Args: + feats (list[Tensor]): the outer list indicates test-time + augmentations and inner Tensor should have a shape NxCxHxW, + which contains features for all images in the batch. + img_metas (list[list[dict]]): the outer list indicates test-time + augs (multiscale, flip, etc.) and the inner list indicates + images in a batch. each dict has image information. + rescale (bool, optional): Whether to rescale the results. + Defaults to False. + + Returns: + list[ndarray]: bbox results of each class + """ + return self.aug_test_bboxes(feats, img_metas, rescale=rescale) + + @force_fp32(apply_to=('pred_maps')) + def onnx_export(self, pred_maps, img_metas, with_nms=True): + num_levels = len(pred_maps) + pred_maps_list = [pred_maps[i].detach() for i in range(num_levels)] + + cfg = self.test_cfg + assert len(pred_maps_list) == self.num_levels + + device = pred_maps_list[0].device + batch_size = pred_maps_list[0].shape[0] + + featmap_sizes = [ + pred_maps_list[i].shape[-2:] for i in range(self.num_levels) + ] + mlvl_anchors = self.prior_generator.grid_priors( + featmap_sizes, device=device) + # convert to tensor to keep tracing + nms_pre_tensor = torch.tensor( + cfg.get('nms_pre', -1), device=device, dtype=torch.long) + + multi_lvl_bboxes = [] + multi_lvl_cls_scores = [] + multi_lvl_conf_scores = [] + for i in range(self.num_levels): + # get some key info for current scale + pred_map = pred_maps_list[i] + stride = self.featmap_strides[i] + # (b,h, w, num_anchors*num_attrib) -> + # (b,h*w*num_anchors, num_attrib) + pred_map = pred_map.permute(0, 2, 3, + 1).reshape(batch_size, -1, + self.num_attrib) + # Inplace operation like + # ```pred_map[..., :2] = \torch.sigmoid(pred_map[..., :2])``` + # would create constant tensor when exporting to onnx + pred_map_conf = torch.sigmoid(pred_map[..., :2]) + pred_map_rest = pred_map[..., 2:] + pred_map = torch.cat([pred_map_conf, pred_map_rest], dim=-1) + pred_map_boxes = pred_map[..., :4] + multi_lvl_anchor = mlvl_anchors[i] + multi_lvl_anchor = multi_lvl_anchor.expand_as(pred_map_boxes) + bbox_pred = self.bbox_coder.decode(multi_lvl_anchor, + pred_map_boxes, stride) + # conf and cls + conf_pred = torch.sigmoid(pred_map[..., 4]) + cls_pred = torch.sigmoid(pred_map[..., 5:]).view( + batch_size, -1, self.num_classes) # Cls pred one-hot. + + # Get top-k prediction + from mmdet.core.export import get_k_for_topk + nms_pre = get_k_for_topk(nms_pre_tensor, bbox_pred.shape[1]) + if nms_pre > 0: + _, topk_inds = conf_pred.topk(nms_pre) + batch_inds = torch.arange(batch_size).view( + -1, 1).expand_as(topk_inds).long() + # Avoid onnx2tensorrt issue in https://github.com/NVIDIA/TensorRT/issues/1134 # noqa: E501 + transformed_inds = ( + bbox_pred.shape[1] * batch_inds + topk_inds) + bbox_pred = bbox_pred.reshape(-1, + 4)[transformed_inds, :].reshape( + batch_size, -1, 4) + cls_pred = cls_pred.reshape( + -1, self.num_classes)[transformed_inds, :].reshape( + batch_size, -1, self.num_classes) + conf_pred = conf_pred.reshape(-1, 1)[transformed_inds].reshape( + batch_size, -1) + + # Save the result of current scale + multi_lvl_bboxes.append(bbox_pred) + multi_lvl_cls_scores.append(cls_pred) + multi_lvl_conf_scores.append(conf_pred) + + # Merge the results of different scales together + batch_mlvl_bboxes = torch.cat(multi_lvl_bboxes, dim=1) + batch_mlvl_scores = torch.cat(multi_lvl_cls_scores, dim=1) + batch_mlvl_conf_scores = torch.cat(multi_lvl_conf_scores, dim=1) + + # Replace multiclass_nms with ONNX::NonMaxSuppression in deployment + from mmdet.core.export import add_dummy_nms_for_onnx + conf_thr = cfg.get('conf_thr', -1) + score_thr = cfg.get('score_thr', -1) + # follow original pipeline of YOLOv3 + if conf_thr > 0: + mask = (batch_mlvl_conf_scores >= conf_thr).float() + batch_mlvl_conf_scores *= mask + if score_thr > 0: + mask = (batch_mlvl_scores > score_thr).float() + batch_mlvl_scores *= mask + batch_mlvl_conf_scores = batch_mlvl_conf_scores.unsqueeze(2).expand_as( + batch_mlvl_scores) + batch_mlvl_scores = batch_mlvl_scores * batch_mlvl_conf_scores + if with_nms: + max_output_boxes_per_class = cfg.nms.get( + 'max_output_boxes_per_class', 200) + iou_threshold = cfg.nms.get('iou_threshold', 0.5) + # keep aligned with original pipeline, improve + # mAP by 1% for YOLOv3 in ONNX + score_threshold = 0 + nms_pre = cfg.get('deploy_nms_pre', -1) + return add_dummy_nms_for_onnx( + batch_mlvl_bboxes, + batch_mlvl_scores, + max_output_boxes_per_class, + iou_threshold, + score_threshold, + nms_pre, + cfg.max_per_img, + ) + else: + return batch_mlvl_bboxes, batch_mlvl_scores diff --git a/mmdet/models/dense_heads/yolof_head.py b/mmdet/models/dense_heads/yolof_head.py new file mode 100644 index 0000000..1063524 --- /dev/null +++ b/mmdet/models/dense_heads/yolof_head.py @@ -0,0 +1,416 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import (ConvModule, bias_init_with_prob, constant_init, is_norm, + normal_init) +from mmcv.runner import force_fp32 + +from mmdet.core import anchor_inside_flags, multi_apply, reduce_mean, unmap +from ..builder import HEADS +from .anchor_head import AnchorHead + +INF = 1e8 + + +def levels_to_images(mlvl_tensor): + """Concat multi-level feature maps by image. + + [feature_level0, feature_level1...] -> [feature_image0, feature_image1...] + Convert the shape of each element in mlvl_tensor from (N, C, H, W) to + (N, H*W , C), then split the element to N elements with shape (H*W, C), and + concat elements in same image of all level along first dimension. + + Args: + mlvl_tensor (list[torch.Tensor]): list of Tensor which collect from + corresponding level. Each element is of shape (N, C, H, W) + + Returns: + list[torch.Tensor]: A list that contains N tensors and each tensor is + of shape (num_elements, C) + """ + batch_size = mlvl_tensor[0].size(0) + batch_list = [[] for _ in range(batch_size)] + channels = mlvl_tensor[0].size(1) + for t in mlvl_tensor: + t = t.permute(0, 2, 3, 1) + t = t.view(batch_size, -1, channels).contiguous() + for img in range(batch_size): + batch_list[img].append(t[img]) + return [torch.cat(item, 0) for item in batch_list] + + +@HEADS.register_module() +class YOLOFHead(AnchorHead): + """YOLOFHead Paper link: https://arxiv.org/abs/2103.09460. + + Args: + num_classes (int): The number of object classes (w/o background) + in_channels (List[int]): The number of input channels per scale. + cls_num_convs (int): The number of convolutions of cls branch. + Default 2. + reg_num_convs (int): The number of convolutions of reg branch. + Default 4. + norm_cfg (dict): Dictionary to construct and config norm layer. + """ + + def __init__(self, + num_classes, + in_channels, + num_cls_convs=2, + num_reg_convs=4, + norm_cfg=dict(type='BN', requires_grad=True), + **kwargs): + self.num_cls_convs = num_cls_convs + self.num_reg_convs = num_reg_convs + self.norm_cfg = norm_cfg + super(YOLOFHead, self).__init__(num_classes, in_channels, **kwargs) + + def _init_layers(self): + cls_subnet = [] + bbox_subnet = [] + for i in range(self.num_cls_convs): + cls_subnet.append( + ConvModule( + self.in_channels, + self.in_channels, + kernel_size=3, + padding=1, + norm_cfg=self.norm_cfg)) + for i in range(self.num_reg_convs): + bbox_subnet.append( + ConvModule( + self.in_channels, + self.in_channels, + kernel_size=3, + padding=1, + norm_cfg=self.norm_cfg)) + self.cls_subnet = nn.Sequential(*cls_subnet) + self.bbox_subnet = nn.Sequential(*bbox_subnet) + self.cls_score = nn.Conv2d( + self.in_channels, + self.num_base_priors * self.num_classes, + kernel_size=3, + stride=1, + padding=1) + self.bbox_pred = nn.Conv2d( + self.in_channels, + self.num_base_priors * 4, + kernel_size=3, + stride=1, + padding=1) + self.object_pred = nn.Conv2d( + self.in_channels, + self.num_base_priors, + kernel_size=3, + stride=1, + padding=1) + + def init_weights(self): + for m in self.modules(): + if isinstance(m, nn.Conv2d): + normal_init(m, mean=0, std=0.01) + if is_norm(m): + constant_init(m, 1) + + # Use prior in model initialization to improve stability + bias_cls = bias_init_with_prob(0.01) + torch.nn.init.constant_(self.cls_score.bias, bias_cls) + + def forward_single(self, feature): + cls_score = self.cls_score(self.cls_subnet(feature)) + N, _, H, W = cls_score.shape + cls_score = cls_score.view(N, -1, self.num_classes, H, W) + + reg_feat = self.bbox_subnet(feature) + bbox_reg = self.bbox_pred(reg_feat) + objectness = self.object_pred(reg_feat) + + # implicit objectness + objectness = objectness.view(N, -1, 1, H, W) + normalized_cls_score = cls_score + objectness - torch.log( + 1. + torch.clamp(cls_score.exp(), max=INF) + + torch.clamp(objectness.exp(), max=INF)) + normalized_cls_score = normalized_cls_score.view(N, -1, H, W) + return normalized_cls_score, bbox_reg + + @force_fp32(apply_to=('cls_scores', 'bbox_preds')) + def loss(self, + cls_scores, + bbox_preds, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Compute losses of the head. + + Args: + cls_scores (list[Tensor]): Box scores for each scale level + Has shape (batch, num_anchors * num_classes, h, w) + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level with shape (batch, num_anchors * 4, h, w) + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (None | list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. Default: None + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + assert len(cls_scores) == 1 + assert self.prior_generator.num_levels == 1 + + device = cls_scores[0].device + featmap_sizes = [featmap.size()[-2:] for featmap in cls_scores] + anchor_list, valid_flag_list = self.get_anchors( + featmap_sizes, img_metas, device=device) + + # The output level is always 1 + anchor_list = [anchors[0] for anchors in anchor_list] + valid_flag_list = [valid_flags[0] for valid_flags in valid_flag_list] + + cls_scores_list = levels_to_images(cls_scores) + bbox_preds_list = levels_to_images(bbox_preds) + + label_channels = self.cls_out_channels if self.use_sigmoid_cls else 1 + cls_reg_targets = self.get_targets( + cls_scores_list, + bbox_preds_list, + anchor_list, + valid_flag_list, + gt_bboxes, + img_metas, + gt_bboxes_ignore_list=gt_bboxes_ignore, + gt_labels_list=gt_labels, + label_channels=label_channels) + if cls_reg_targets is None: + return None + (batch_labels, batch_label_weights, num_total_pos, num_total_neg, + batch_bbox_weights, batch_pos_predicted_boxes, + batch_target_boxes) = cls_reg_targets + + flatten_labels = batch_labels.reshape(-1) + batch_label_weights = batch_label_weights.reshape(-1) + cls_score = cls_scores[0].permute(0, 2, 3, + 1).reshape(-1, self.cls_out_channels) + + num_total_samples = (num_total_pos + + num_total_neg) if self.sampling else num_total_pos + num_total_samples = reduce_mean( + cls_score.new_tensor(num_total_samples)).clamp_(1.0).item() + + # classification loss + loss_cls = self.loss_cls( + cls_score, + flatten_labels, + batch_label_weights, + avg_factor=num_total_samples) + + # regression loss + if batch_pos_predicted_boxes.shape[0] == 0: + # no pos sample + loss_bbox = batch_pos_predicted_boxes.sum() * 0 + else: + loss_bbox = self.loss_bbox( + batch_pos_predicted_boxes, + batch_target_boxes, + batch_bbox_weights.float(), + avg_factor=num_total_samples) + + return dict(loss_cls=loss_cls, loss_bbox=loss_bbox) + + def get_targets(self, + cls_scores_list, + bbox_preds_list, + anchor_list, + valid_flag_list, + gt_bboxes_list, + img_metas, + gt_bboxes_ignore_list=None, + gt_labels_list=None, + label_channels=1, + unmap_outputs=True): + """Compute regression and classification targets for anchors in + multiple images. + + Args: + cls_scores_list (list[Tensor]): Classification scores of + each image. each is a 4D-tensor, the shape is + (h * w, num_anchors * num_classes). + bbox_preds_list (list[Tensor]): Bbox preds of each image. + each is a 4D-tensor, the shape is (h * w, num_anchors * 4). + anchor_list (list[Tensor]): Anchors of each image. Each element of + is a tensor of shape (h * w * num_anchors, 4). + valid_flag_list (list[Tensor]): Valid flags of each image. Each + element of is a tensor of shape (h * w * num_anchors, ) + gt_bboxes_list (list[Tensor]): Ground truth bboxes of each image. + img_metas (list[dict]): Meta info of each image. + gt_bboxes_ignore_list (list[Tensor]): Ground truth bboxes to be + ignored. + gt_labels_list (list[Tensor]): Ground truth labels of each box. + label_channels (int): Channel of label. + unmap_outputs (bool): Whether to map outputs back to the original + set of anchors. + + Returns: + tuple: Usually returns a tuple containing learning targets. + + - batch_labels (Tensor): Label of all images. Each element \ + of is a tensor of shape (batch, h * w * num_anchors) + - batch_label_weights (Tensor): Label weights of all images \ + of is a tensor of shape (batch, h * w * num_anchors) + - num_total_pos (int): Number of positive samples in all \ + images. + - num_total_neg (int): Number of negative samples in all \ + images. + additional_returns: This function enables user-defined returns from + `self._get_targets_single`. These returns are currently refined + to properties at each feature map (i.e. having HxW dimension). + The results will be concatenated after the end + """ + num_imgs = len(img_metas) + assert len(anchor_list) == len(valid_flag_list) == num_imgs + + # compute targets for each image + if gt_bboxes_ignore_list is None: + gt_bboxes_ignore_list = [None for _ in range(num_imgs)] + if gt_labels_list is None: + gt_labels_list = [None for _ in range(num_imgs)] + results = multi_apply( + self._get_targets_single, + bbox_preds_list, + anchor_list, + valid_flag_list, + gt_bboxes_list, + gt_bboxes_ignore_list, + gt_labels_list, + img_metas, + label_channels=label_channels, + unmap_outputs=unmap_outputs) + (all_labels, all_label_weights, pos_inds_list, neg_inds_list, + sampling_results_list) = results[:5] + rest_results = list(results[5:]) # user-added return values + # no valid anchors + if any([labels is None for labels in all_labels]): + return None + # sampled anchors of all images + num_total_pos = sum([max(inds.numel(), 1) for inds in pos_inds_list]) + num_total_neg = sum([max(inds.numel(), 1) for inds in neg_inds_list]) + + batch_labels = torch.stack(all_labels, 0) + batch_label_weights = torch.stack(all_label_weights, 0) + + res = (batch_labels, batch_label_weights, num_total_pos, num_total_neg) + for i, rests in enumerate(rest_results): # user-added return values + rest_results[i] = torch.cat(rests, 0) + + return res + tuple(rest_results) + + def _get_targets_single(self, + bbox_preds, + flat_anchors, + valid_flags, + gt_bboxes, + gt_bboxes_ignore, + gt_labels, + img_meta, + label_channels=1, + unmap_outputs=True): + """Compute regression and classification targets for anchors in a + single image. + + Args: + bbox_preds (Tensor): Bbox prediction of the image, which + shape is (h * w ,4) + flat_anchors (Tensor): Anchors of the image, which shape is + (h * w * num_anchors ,4) + valid_flags (Tensor): Valid flags of the image, which shape is + (h * w * num_anchors,). + gt_bboxes (Tensor): Ground truth bboxes of the image, + shape (num_gts, 4). + gt_bboxes_ignore (Tensor): Ground truth bboxes to be + ignored, shape (num_ignored_gts, 4). + img_meta (dict): Meta info of the image. + gt_labels (Tensor): Ground truth labels of each box, + shape (num_gts,). + label_channels (int): Channel of label. + unmap_outputs (bool): Whether to map outputs back to the original + set of anchors. + + Returns: + tuple: + labels (Tensor): Labels of image, which shape is + (h * w * num_anchors, ). + label_weights (Tensor): Label weights of image, which shape is + (h * w * num_anchors, ). + pos_inds (Tensor): Pos index of image. + neg_inds (Tensor): Neg index of image. + sampling_result (obj:`SamplingResult`): Sampling result. + pos_bbox_weights (Tensor): The Weight of using to calculate + the bbox branch loss, which shape is (num, ). + pos_predicted_boxes (Tensor): boxes predicted value of + using to calculate the bbox branch loss, which shape is + (num, 4). + pos_target_boxes (Tensor): boxes target value of + using to calculate the bbox branch loss, which shape is + (num, 4). + """ + inside_flags = anchor_inside_flags(flat_anchors, valid_flags, + img_meta['img_shape'][:2], + self.train_cfg.allowed_border) + if not inside_flags.any(): + return (None, ) * 8 + # assign gt and sample anchors + anchors = flat_anchors[inside_flags, :] + bbox_preds = bbox_preds.reshape(-1, 4) + bbox_preds = bbox_preds[inside_flags, :] + + # decoded bbox + decoder_bbox_preds = self.bbox_coder.decode(anchors, bbox_preds) + assign_result = self.assigner.assign( + decoder_bbox_preds, anchors, gt_bboxes, gt_bboxes_ignore, + None if self.sampling else gt_labels) + + pos_bbox_weights = assign_result.get_extra_property('pos_idx') + pos_predicted_boxes = assign_result.get_extra_property( + 'pos_predicted_boxes') + pos_target_boxes = assign_result.get_extra_property('target_boxes') + + sampling_result = self.sampler.sample(assign_result, anchors, + gt_bboxes) + num_valid_anchors = anchors.shape[0] + labels = anchors.new_full((num_valid_anchors, ), + self.num_classes, + dtype=torch.long) + label_weights = anchors.new_zeros(num_valid_anchors, dtype=torch.float) + + pos_inds = sampling_result.pos_inds + neg_inds = sampling_result.neg_inds + if len(pos_inds) > 0: + if gt_labels is None: + # Only rpn gives gt_labels as None + # Foreground is the first class since v2.5.0 + labels[pos_inds] = 0 + else: + labels[pos_inds] = gt_labels[ + sampling_result.pos_assigned_gt_inds] + if self.train_cfg.pos_weight <= 0: + label_weights[pos_inds] = 1.0 + else: + label_weights[pos_inds] = self.train_cfg.pos_weight + if len(neg_inds) > 0: + label_weights[neg_inds] = 1.0 + + # map up to original set of anchors + if unmap_outputs: + num_total_anchors = flat_anchors.size(0) + labels = unmap( + labels, num_total_anchors, inside_flags, + fill=self.num_classes) # fill bg label + label_weights = unmap(label_weights, num_total_anchors, + inside_flags) + + return (labels, label_weights, pos_inds, neg_inds, sampling_result, + pos_bbox_weights, pos_predicted_boxes, pos_target_boxes) diff --git a/mmdet/models/dense_heads/yolox_head.py b/mmdet/models/dense_heads/yolox_head.py new file mode 100644 index 0000000..26d0c35 --- /dev/null +++ b/mmdet/models/dense_heads/yolox_head.py @@ -0,0 +1,796 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import (ConvModule, DepthwiseSeparableConvModule, + bias_init_with_prob) +from mmcv.ops.nms import batched_nms +from mmcv.runner import force_fp32 + +from mmdet.core import (MlvlPointGenerator, bbox_xyxy_to_cxcywh, + build_assigner, build_sampler, multi_apply, + reduce_mean) +from ..builder import HEADS, build_loss +from .base_dense_head import BaseDenseHead +from .dense_test_mixins import BBoxTestMixin +from mmdet.core.bbox.iou_calculators import bbox_overlaps +from my_equation import * +import global_placeholder + +@HEADS.register_module() +class YOLOXHead(BaseDenseHead, BBoxTestMixin): + """YOLOXHead head used in `YOLOX `_. + + Args: + num_classes (int): Number of categories excluding the background + category. + in_channels (int): Number of channels in the input feature map. + feat_channels (int): Number of hidden channels in stacking convs. + Default: 256 + stacked_convs (int): Number of stacking convs of the head. + Default: 2. + strides (tuple): Downsample factor of each feature map. + use_depthwise (bool): Whether to depthwise separable convolution in + blocks. Default: False + dcn_on_last_conv (bool): If true, use dcn in the last layer of + towers. Default: False. + conv_bias (bool | str): If specified as `auto`, it will be decided by + the norm_cfg. Bias of conv will be set as True if `norm_cfg` is + None, otherwise False. Default: "auto". + conv_cfg (dict): Config dict for convolution layer. Default: None. + norm_cfg (dict): Config dict for normalization layer. Default: None. + act_cfg (dict): Config dict for activation layer. Default: None. + loss_cls (dict): Config of classification loss. + loss_bbox (dict): Config of localization loss. + loss_obj (dict): Config of objectness loss. + loss_l1 (dict): Config of L1 loss. + train_cfg (dict): Training config of anchor head. + test_cfg (dict): Testing config of anchor head. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + num_classes, + in_channels, + feat_channels=256, + stacked_convs=2, + strides=[8, 16, 32], + use_depthwise=False, + dcn_on_last_conv=False, + conv_bias='auto', + conv_cfg=None, + norm_cfg=dict(type='BN', momentum=0.03, eps=0.001), + act_cfg=dict(type='Swish'), + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + reduction='sum', + loss_weight=1.0), + loss_bbox=dict( + type='IoULoss', + mode='square', + eps=1e-16, + reduction='sum', + loss_weight=5.0), + loss_obj=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + reduction='sum', + loss_weight=1.0), + loss_l1=dict(type='L1Loss', reduction='sum', loss_weight=1.0), + train_cfg=None, + test_cfg=None, + init_cfg=dict( + type='Kaiming', + layer='Conv2d', + a=math.sqrt(5), + distribution='uniform', + mode='fan_in', + nonlinearity='leaky_relu')): + + super().__init__(init_cfg=init_cfg) + self.num_classes = num_classes + self.cls_out_channels = num_classes + self.in_channels = in_channels + self.feat_channels = feat_channels + self.stacked_convs = stacked_convs + self.strides = strides + self.use_depthwise = use_depthwise + self.dcn_on_last_conv = dcn_on_last_conv + assert conv_bias == 'auto' or isinstance(conv_bias, bool) + self.conv_bias = conv_bias + self.use_sigmoid_cls = True + + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + + self.loss_cls = build_loss(loss_cls) + self.loss_bbox = build_loss(loss_bbox) + self.loss_obj = build_loss(loss_obj) + + self.use_l1 = False # This flag will be modified by hooks. + self.loss_l1 = build_loss(loss_l1) + + self.prior_generator = MlvlPointGenerator(strides, offset=0) + + self.test_cfg = test_cfg + self.train_cfg = train_cfg + + self.sampling = False + if self.train_cfg: + self.assigner = build_assigner(self.train_cfg.assigner) + # sampling=False so use PseudoSampler + sampler_cfg = dict(type='PseudoSampler') + self.sampler = build_sampler(sampler_cfg, context=self) + + self.fp16_enabled = False + self._init_layers() + + def _init_layers(self): + self.multi_level_cls_convs = nn.ModuleList() + self.multi_level_reg_convs = nn.ModuleList() + self.multi_level_conv_cls = nn.ModuleList() + self.multi_level_conv_reg = nn.ModuleList() + self.multi_level_conv_obj = nn.ModuleList() + for _ in self.strides: + self.multi_level_cls_convs.append(self._build_stacked_convs()) + self.multi_level_reg_convs.append(self._build_stacked_convs()) + conv_cls, conv_reg, conv_obj = self._build_predictor() + self.multi_level_conv_cls.append(conv_cls) + self.multi_level_conv_reg.append(conv_reg) + self.multi_level_conv_obj.append(conv_obj) + + def _build_stacked_convs(self): + """Initialize conv layers of a single level head.""" + conv = DepthwiseSeparableConvModule \ + if self.use_depthwise else ConvModule + stacked_convs = [] + for i in range(self.stacked_convs): + chn = self.in_channels if i == 0 else self.feat_channels + if self.dcn_on_last_conv and i == self.stacked_convs - 1: + conv_cfg = dict(type='DCNv2') + else: + conv_cfg = self.conv_cfg + stacked_convs.append( + conv( + chn, + self.feat_channels, + 3, + stride=1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=self.norm_cfg, + act_cfg=self.act_cfg, + bias=self.conv_bias)) + return nn.Sequential(*stacked_convs) + + def _build_predictor(self): + """Initialize predictor layers of a single level head.""" + conv_cls = nn.Conv2d(self.feat_channels, self.cls_out_channels, 1) + conv_reg = nn.Conv2d(self.feat_channels, 4, 1) + conv_obj = nn.Conv2d(self.feat_channels, 1, 1) + return conv_cls, conv_reg, conv_obj + + def init_weights(self): + super(YOLOXHead, self).init_weights() + # Use prior in model initialization to improve stability + bias_init = bias_init_with_prob(0.01) + for conv_cls, conv_obj in zip(self.multi_level_conv_cls, + self.multi_level_conv_obj): + conv_cls.bias.data.fill_(bias_init) + conv_obj.bias.data.fill_(bias_init) + + def forward_single(self, x, cls_convs, reg_convs, conv_cls, conv_reg, + conv_obj): + """Forward feature of a single scale level.""" + + cls_feat = cls_convs(x) + reg_feat = reg_convs(x) + + cls_score = conv_cls(cls_feat) + bbox_pred = conv_reg(reg_feat) + objectness = conv_obj(reg_feat) + + return cls_score, bbox_pred, objectness + + def forward(self, feats): + """Forward feature of a single scale level.""" + cls_scores = [] + bbox_preds = [] + objectnesses = [] + + if hasattr(self,'in_num') and self.in_num == 3: + feats = [feats[0], feats[1], feats[2]] + elif hasattr(self,'in_num'): + raise NotImplementedError + else: + self.in_num = 3 + feats = [feats[0], feats[1], feats[2]] + + for x, cls_convs, reg_convs, conv_cls, conv_reg, conv_obj in zip(feats, self.multi_level_cls_convs, self.multi_level_reg_convs, self.multi_level_conv_cls, self.multi_level_conv_reg, self.multi_level_conv_obj): + # for i in range(in_num): + # x, cls_convs, reg_convs, conv_cls, conv_reg, conv_obj = feats[i], self.multi_level_cls_convs[i], self.multi_level_reg_convs[i], self.multi_level_conv_cls[i], self.multi_level_conv_reg[i], self.multi_level_conv_obj[i] + cls_feat = cls_convs(x) + reg_feat = reg_convs(x) + + cls_score = conv_cls(cls_feat) + bbox_pred = conv_reg(reg_feat) + objectness = conv_obj(reg_feat) + cls_scores.append(cls_score) + bbox_preds.append(bbox_pred) + objectnesses.append(objectness) + + + return cls_scores, bbox_preds, objectnesses + + + # def forward(self, feats): + # """Forward features from the upstream network. + + # Args: + # feats (tuple[Tensor]): Features from the upstream network, each is + # a 4D-tensor. + # Returns: + # tuple[Tensor]: A tuple of multi-level predication map, each is a + # 4D-tensor of shape (batch_size, 5+num_classes, height, width). + # """ + + # return multi_apply(self.forward_single, feats, + # self.multi_level_cls_convs, + # self.multi_level_reg_convs, + # self.multi_level_conv_cls, + # self.multi_level_conv_reg, + # self.multi_level_conv_obj) + + @force_fp32(apply_to=('cls_scores', 'bbox_preds', 'objectnesses')) + def get_bboxes(self, + cls_scores, + bbox_preds, + objectnesses, + img_metas=None, + cfg=None, + rescale=False, + with_nms=True): + """Transform network outputs of a batch into bbox results. + Args: + cls_scores (list[Tensor]): Classification scores for all + scale levels, each is a 4D-tensor, has shape + (batch_size, num_priors * num_classes, H, W). + bbox_preds (list[Tensor]): Box energies / deltas for all + scale levels, each is a 4D-tensor, has shape + (batch_size, num_priors * 4, H, W). + objectnesses (list[Tensor], Optional): Score factor for + all scale level, each is a 4D-tensor, has shape + (batch_size, 1, H, W). + img_metas (list[dict], Optional): Image meta info. Default None. + cfg (mmcv.Config, Optional): Test / postprocessing configuration, + if None, test_cfg would be used. Default None. + rescale (bool): If True, return boxes in original image space. + Default False. + with_nms (bool): If True, do nms before return boxes. + Default True. + Returns: + list[list[Tensor, Tensor]]: Each item in result_list is 2-tuple. + The first item is an (n, 5) tensor, where the first 4 columns + are bounding box positions (tl_x, tl_y, br_x, br_y) and the + 5-th column is a score between 0 and 1. The second item is a + (n,) tensor where each item is the predicted class label of + the corresponding box. + """ + assert len(cls_scores) == len(bbox_preds) == len(objectnesses) + cfg = self.test_cfg if cfg is None else cfg + scale_factors = np.array( + [img_meta['scale_factor'] for img_meta in img_metas]) + + num_imgs = len(img_metas) + featmap_sizes = [cls_score.shape[2:] for cls_score in cls_scores] + mlvl_priors = self.prior_generator.grid_priors( + featmap_sizes, + dtype=cls_scores[0].dtype, + device=cls_scores[0].device, + with_stride=True) + + # flatten cls_scores, bbox_preds and objectness + flatten_cls_scores = [ + cls_score.permute(0, 2, 3, 1).reshape(num_imgs, -1, + self.cls_out_channels) + for cls_score in cls_scores + ] + flatten_bbox_preds = [ + bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4) + for bbox_pred in bbox_preds + ] + flatten_objectness = [ + objectness.permute(0, 2, 3, 1).reshape(num_imgs, -1) + for objectness in objectnesses + ] + + flatten_cls_scores = torch.cat(flatten_cls_scores, dim=1).sigmoid() + flatten_bbox_preds = torch.cat(flatten_bbox_preds, dim=1) + flatten_objectness = torch.cat(flatten_objectness, dim=1).sigmoid() + flatten_priors = torch.cat(mlvl_priors) + + flatten_bboxes = self._bbox_decode(flatten_priors, flatten_bbox_preds) + + if rescale: + flatten_bboxes[..., :4] /= flatten_bboxes.new_tensor( + scale_factors).unsqueeze(1) + + result_list = [] + for img_id in range(len(img_metas)): + cls_scores = flatten_cls_scores[img_id] + score_factor = flatten_objectness[img_id] + bboxes = flatten_bboxes[img_id] + + result_list.append( + self._bboxes_nms(cls_scores, bboxes, score_factor, cfg)) + + return result_list + + def _bbox_decode(self, priors, bbox_preds): + xys = (bbox_preds[..., :2] * priors[:, 2:]) + priors[:, :2] + whs = bbox_preds[..., 2:].exp() * priors[:, 2:] + + tl_x = (xys[..., 0] - whs[..., 0] / 2) + tl_y = (xys[..., 1] - whs[..., 1] / 2) + br_x = (xys[..., 0] + whs[..., 0] / 2) + br_y = (xys[..., 1] + whs[..., 1] / 2) + + decoded_bboxes = torch.stack([tl_x, tl_y, br_x, br_y], -1) + return decoded_bboxes + + def _bboxes_nms(self, cls_scores, bboxes, score_factor, cfg): + max_scores, labels = torch.max(cls_scores, 1) + valid_mask = score_factor * max_scores >= cfg.score_thr + + bboxes = bboxes[valid_mask] + scores = max_scores[valid_mask] * score_factor[valid_mask] + labels = labels[valid_mask] + + if labels.numel() == 0: + return bboxes, labels + else: + dets, keep = batched_nms(bboxes, scores, labels, cfg.nms) + return dets, labels[keep] + + # @force_fp32(apply_to=('cls_scores', 'bbox_preds', 'objectnesses')) + # def loss(self, + # cls_scores, + # bbox_preds, + # objectnesses, + # gt_bboxes, + # gt_labels, + # img_metas, + # gt_bboxes_ignore=None): + # """Compute loss of the head. + # Args: + # cls_scores (list[Tensor]): Box scores for each scale level, + # each is a 4D-tensor, the channel number is + # num_priors * num_classes. + # bbox_preds (list[Tensor]): Box energies / deltas for each scale + # level, each is a 4D-tensor, the channel number is + # num_priors * 4. + # objectnesses (list[Tensor], Optional): Score factor for + # all scale level, each is a 4D-tensor, has shape + # (batch_size, 1, H, W). + # gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + # shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + # gt_labels (list[Tensor]): class indices corresponding to each box + # img_metas (list[dict]): Meta information of each image, e.g., + # image size, scaling factor, etc. + # gt_bboxes_ignore (None | list[Tensor]): specify which bounding + # boxes can be ignored when computing the loss. + # """ + # num_imgs = len(img_metas) + # featmap_sizes = [cls_score.shape[2:] for cls_score in cls_scores] + # mlvl_priors = self.prior_generator.grid_priors( + # featmap_sizes, + # dtype=cls_scores[0].dtype, + # device=cls_scores[0].device, + # with_stride=True) + + # flatten_cls_preds = [ + # cls_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, + # self.cls_out_channels) + # for cls_pred in cls_scores + # ] + # flatten_bbox_preds = [ + # bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4) + # for bbox_pred in bbox_preds + # ] + # flatten_objectness = [ + # objectness.permute(0, 2, 3, 1).reshape(num_imgs, -1) + # for objectness in objectnesses + # ] + + # flatten_cls_preds = torch.cat(flatten_cls_preds, dim=1) + # flatten_bbox_preds = torch.cat(flatten_bbox_preds, dim=1) + # flatten_objectness = torch.cat(flatten_objectness, dim=1) + # flatten_priors = torch.cat(mlvl_priors) + # flatten_bboxes = self._bbox_decode(flatten_priors, flatten_bbox_preds) + + # (pos_masks, cls_targets, obj_targets, bbox_targets, l1_targets, + # num_fg_imgs) = multi_apply( + # self._get_target_single, flatten_cls_preds.detach(), + # flatten_objectness.detach(), + # flatten_priors.unsqueeze(0).repeat(num_imgs, 1, 1), + # flatten_bboxes.detach(), gt_bboxes, gt_labels) + + # # The experimental results show that ‘reduce_mean’ can improve + # # performance on the COCO dataset. + # num_pos = torch.tensor( + # sum(num_fg_imgs), + # dtype=torch.float, + # device=flatten_cls_preds.device) + # num_total_samples = max(reduce_mean(num_pos), 1.0) + + # pos_masks = torch.cat(pos_masks, 0) + # cls_targets = torch.cat(cls_targets, 0) + # obj_targets = torch.cat(obj_targets, 0) + # bbox_targets = torch.cat(bbox_targets, 0) + # if self.use_l1: + # l1_targets = torch.cat(l1_targets, 0) + + # loss_bbox = self.loss_bbox( + # flatten_bboxes.view(-1, 4)[pos_masks], + # bbox_targets) / num_total_samples + # loss_obj = self.loss_obj(flatten_objectness.view(-1, 1), + # obj_targets) / num_total_samples + # loss_cls = self.loss_cls( + # flatten_cls_preds.view(-1, self.num_classes)[pos_masks], + # cls_targets) / num_total_samples + + # loss_dict = dict( + # loss_cls=loss_cls, loss_bbox=loss_bbox, loss_obj=loss_obj) + + # if self.use_l1: + # loss_l1 = self.loss_l1( + # flatten_bbox_preds.view(-1, 4)[pos_masks], + # l1_targets) / num_total_samples + # loss_dict.update(loss_l1=loss_l1) + + # return loss_dict + + @force_fp32(apply_to=('cls_scores', 'bbox_preds', 'objectnesses')) + def loss(self, + cls_scores, + bbox_preds, + objectnesses, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=None): + """Compute loss of the head. + Args: + cls_scores (list[Tensor]): Box scores for each scale level, + each is a 4D-tensor, the channel number is + num_priors * num_classes. + bbox_preds (list[Tensor]): Box energies / deltas for each scale + level, each is a 4D-tensor, the channel number is + num_priors * 4. + objectnesses (list[Tensor], Optional): Score factor for + all scale level, each is a 4D-tensor, has shape + (batch_size, 1, H, W). + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + img_metas (list[dict]): Meta information of each image, e.g., + image size, scaling factor, etc. + gt_bboxes_ignore (None | list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. + """ + num_imgs = len(img_metas) + featmap_sizes = [cls_score.shape[2:] for cls_score in cls_scores] + mlvl_priors = self.prior_generator.grid_priors( + featmap_sizes, + dtype=cls_scores[0].dtype, + device=cls_scores[0].device, + with_stride=True) + + flatten_cls_preds = [ + cls_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, + self.cls_out_channels) + for cls_pred in cls_scores + ] + flatten_bbox_preds = [ + bbox_pred.permute(0, 2, 3, 1).reshape(num_imgs, -1, 4) + for bbox_pred in bbox_preds + ] + flatten_objectness = [ + objectness.permute(0, 2, 3, 1).reshape(num_imgs, -1) + for objectness in objectnesses + ] + + # 实现level上的标记 编码第一个level为0;第二个level为1;第三个level为2 + level_mapping = [] + for it, temp in enumerate(flatten_cls_preds): + temp_tensor = torch.zeros(temp.shape[:2],dtype=torch.uint8,device=flatten_cls_preds[0].device) + it + level_mapping.append(temp_tensor) + level_mapping = torch.cat(level_mapping, dim=1) + + flatten_cls_preds = torch.cat(flatten_cls_preds, dim=1) + flatten_bbox_preds = torch.cat(flatten_bbox_preds, dim=1) + flatten_objectness = torch.cat(flatten_objectness, dim=1) + flatten_priors = torch.cat(mlvl_priors) + flatten_bboxes = self._bbox_decode(flatten_priors, flatten_bbox_preds) + + (pos_masks, cls_targets, obj_targets, bbox_targets, l1_targets, + num_fg_imgs) = multi_apply( + self._get_target_single, flatten_cls_preds.detach(), + flatten_objectness.detach(), + flatten_priors.unsqueeze(0).repeat(num_imgs, 1, 1), + flatten_bboxes.detach(), gt_bboxes, gt_labels) + + # The experimental results show that ‘reduce_mean’ can improve + # performance on the COCO dataset. + num_pos = torch.tensor( + sum(num_fg_imgs), + dtype=torch.float, + device=flatten_cls_preds.device) + num_total_samples = max(reduce_mean(num_pos), 1.0) + + pos_masks = torch.cat(pos_masks, 0) + cls_targets = torch.cat(cls_targets, 0) + obj_targets = torch.cat(obj_targets, 0) + bbox_targets = torch.cat(bbox_targets, 0) + if self.use_l1: + l1_targets = torch.cat(l1_targets, 0) + + # reshape同时映射pos + level_mapping = level_mapping.view(-1) + pos_level_mapping = level_mapping[pos_masks] + + loss_bbox = self.loss_bbox( + flatten_bboxes.view(-1, 4)[pos_masks], + bbox_targets, reduction_override='none') + loss_obj = self.loss_obj(flatten_objectness.view(-1, 1), + obj_targets, reduction_override='none') + loss_cls = self.loss_cls( + flatten_cls_preds.view(-1, self.num_classes)[pos_masks], + cls_targets, reduction_override='none') + + if self.use_l1: + loss_l1 = self.loss_l1( + flatten_bbox_preds.view(-1, 4)[pos_masks], + l1_targets, reduction_override='none') + loss_l1 = loss_l1.sum(dim=1) + + # loss_bbox = loss_bbox.sum(dim=1) + loss_cls = loss_cls.sum(dim=1) + loss_obj = loss_obj.sum(dim=1) + + # 就是sigmoid + if global_placeholder.mybuff_flag: + # 只在pos_indx有的情况下执行 + + matched_obj = torch.sigmoid(flatten_objectness.view(-1, 1)[pos_masks].view(-1)) + conf_values = torch.sigmoid(flatten_cls_preds.view(-1, self.num_classes)[pos_masks]) + + num_classes = conf_values.shape[-1] + + # pos_gtconf_idx = cls_targets + _, temp_max_gt_idx = cls_targets.max(dim=1) + + num_classes = num_classes + 1 + pos_gtconf_idx = F.one_hot(temp_max_gt_idx, num_classes=num_classes) + pos_gtconf_idx = pos_gtconf_idx[:, :-1]# 剔除最后一个背景类 + + pos_gtconf_values, _ = (conf_values * pos_gtconf_idx).max(dim=1) # TODO 想到一件事,是不是不能用GT来筛选正样本的结果?因为其实正样本也有错误的东西,所以就是得错 + # pos_gtconf_values = pos_gtconf_values[pos_inds] + + pos_conf_values, pos_conf_values_idx = conf_values.max(dim=1) # TODO 好像真的是这个问题,正样本本来就是得对应到max的那个,不能经过GT筛选 + # pos_conf_values = pos_conf_values[pos_inds] + + # anchors = anchors.reshape(-1, 4) + abs_bbox_pred = flatten_bboxes.view(-1, 4)[pos_masks] # 直接解读 + abs_bbox_targets = bbox_targets # 直接解读 + + pos_ious = bbox_overlaps(abs_bbox_pred, abs_bbox_targets, is_aligned=True) # 这玩意得是ltrb坐标,好像就已经是了??? + + if global_placeholder.mybuff_flag == 1: + + level_slicer = [len(self.multi_level_cls_convs._modules), 5, 4] # [0]为level数;[1]为weight的个数;[2]为单level下的act个数 + level_cls_factors = [] + level_reg_factors = [] + level_obj_factors = [] + qloss_flag = global_placeholder.qloss_flag + + if False: + q_loss_total = [] + cls_branch = [] + reg_branch = [] + obj_branch = [] + for name, module in self.named_modules(): + if hasattr(module, 'compute_qloss') and module.compute_qloss: + # 挑出来量化器 + + if 'cls' in name: + # 说明是cls分支的量化器 + # cls_branch.append(module.quantization_loss) + if 'post_act' in name: + # 说明是act量化器 + # cls_branch.append([name, module.scale * 1.]) + pass + else: + cls_branch.append([name, module.scale]) + + elif 'reg' in name: + # 说明是reg分支的量化器 + # reg_branch.append(module.quantization_loss) + if 'post_act' in name: + # 说明是act量化器 + # reg_branch.append([name, module.scale * 1.]) + pass + else: + reg_branch.append([name, module.scale]) + + elif 'obj' in name: + # 说明是reg分支的量化器 + # reg_branch.append(module.quantization_loss) + if 'post_act' in name: + # 说明是act量化器 + # obj_branch.append([name, module.scale * 1.]) + pass + else: + obj_branch.append([name, module.scale]) + + q_loss_total.append([name, module.scale * 1]) + # from plot_curve import save_distribution + # title = 'input of ' + name + f' scale:{str(module.scale.data.cpu().numpy().round(5))}' + # save_distribution(module.input.cpu().numpy(), title) + + # NOTE 不需要加item_post_act_quant的 + # 由于obj branch 的特殊性,所以得加上reg_branch分支的共用东西 + obj_branch = obj_branch + reg_branch[3:] + + if level_slicer[0] != 3: + raise NotImplementedError + + for it in range(level_slicer[0]): + cls_summation = 0 + reg_summation = 0 + obj_summation = 0 + # tmp_cls_infos = [cls_branch[it]] + cls_branch[3+it*2:3+(it+1)*2] + cls_branch[9+it*2:9+(it+1)*2] + tmp_cls_infos = [cls_branch[it]] + cls_branch[3+it*2:3+(it+1)*2] + for info in tmp_cls_infos: + cls_summation += info[1] + + # tmp_reg_infos = [reg_branch[it]] + reg_branch[3+it*2:3+(it+1)*2] + reg_branch[9+it*2:9+(it+1)*2] + tmp_reg_infos = [reg_branch[it]] + reg_branch[3+it*2:3+(it+1)*2] + for info in tmp_reg_infos: + reg_summation += info[1] + + # tmp_obj_infos = [obj_branch[it]] + obj_branch[3+it*2:3+(it+1)*2] + obj_branch[9+it*2:9+(it+1)*2] + tmp_obj_infos = [obj_branch[it]] + obj_branch[3+it*2:3+(it+1)*2] + for info in tmp_obj_infos: + obj_summation += info[1] + + level_cls_factors.append(cls_summation) + level_reg_factors.append(reg_summation) + level_obj_factors.append(obj_summation) + + + if len(level_cls_factors) + len(level_reg_factors) + len(level_obj_factors) == 0: + # 必须让list内有level个空list + level_cls_factors = [torch.tensor(1)] + level_reg_factors = [torch.tensor(1)] + level_obj_factors = [torch.tensor(1)] + # NOTE 编码第一个level为0 第二个为1 ...... + # for it, [cls_branch_factor, reg_branch_factor, obj_branch_factor] in enumerate(zip(level_cls_factors, level_reg_factors, level_obj_factors)): + # single_level_masks = (level_mapping == it) + # single_pos_level_masks = (pos_level_mapping == it) + + # cls_trade_off = (cls_branch_factor / (cls_branch_factor + reg_branch_factor + obj_branch_factor)).detach() * 3 + # reg_trade_off = (reg_branch_factor / (cls_branch_factor + reg_branch_factor + obj_branch_factor)).detach() * 3 + # obj_trade_off = (obj_branch_factor / (cls_branch_factor + reg_branch_factor + obj_branch_factor)).detach() * 3 + + # loss_cls[single_pos_level_masks] = cls_trade_off * loss_cls[single_pos_level_masks] + # loss_bbox[single_pos_level_masks] = reg_trade_off * loss_bbox[single_pos_level_masks] + # loss_obj[single_level_masks] = obj_trade_off * loss_obj[single_level_masks] + # # if self.use_l1: # 还是不该加这个 + # # loss_l1[single_pos_level_masks] = reg_trade_off * loss_l1[single_pos_level_masks] + + + # # 再进行正样本上的harmonic加权. 这玩意是真真不行 + # eps = 2.220446049250313e-16 # -10貌似可以,但是我狠一点 + # # correlation = torch.pow(pos_gtconf_values+eps, 0.5) * torch.pow(pos_ious+eps, 0.5) - eps + # correlation = torch.pow(pos_gtconf_values * pos_ious * matched_obj+eps, 1/3) - eps + # harmonic_factor = torch.exp(1-correlation) + + # loss_bbox = loss_bbox * harmonic_factor + # loss_cls = loss_cls * harmonic_factor + # loss_obj[pos_masks] = loss_obj[pos_masks] * harmonic_factor + # if self.use_l1: + # loss_l1 = loss_l1 * harmonic_factor + + loss_bbox, loss_cls = HQOD_loss(loss_bbox, loss_cls, conf_values, pos_gtconf_values, pos_conf_values, pos_ious, [torch.tensor(1)], [torch.tensor(1)], torch.tensor(1.)) + elif global_placeholder.mybuff_flag == 2: + loss_bbox, loss_cls = HarDet_loss(loss_bbox, loss_cls, conf_values, pos_gtconf_values, pos_conf_values, pos_ious, torch.tensor(1.)) + + + loss_cls = loss_cls.sum() / num_total_samples + loss_bbox = loss_bbox.sum() / num_total_samples + loss_obj = loss_obj.sum() / num_total_samples + + loss_dict = dict( + loss_cls=loss_cls, loss_bbox=loss_bbox, loss_obj=loss_obj) + + if self.use_l1: + loss_l1 = loss_l1.sum() / num_total_samples + loss_dict.update(loss_l1=loss_l1) + + return loss_dict + + @torch.no_grad() + def _get_target_single(self, cls_preds, objectness, priors, decoded_bboxes, + gt_bboxes, gt_labels): + """Compute classification, regression, and objectness targets for + priors in a single image. + Args: + cls_preds (Tensor): Classification predictions of one image, + a 2D-Tensor with shape [num_priors, num_classes] + objectness (Tensor): Objectness predictions of one image, + a 1D-Tensor with shape [num_priors] + priors (Tensor): All priors of one image, a 2D-Tensor with shape + [num_priors, 4] in [cx, xy, stride_w, stride_y] format. + decoded_bboxes (Tensor): Decoded bboxes predictions of one image, + a 2D-Tensor with shape [num_priors, 4] in [tl_x, tl_y, + br_x, br_y] format. + gt_bboxes (Tensor): Ground truth bboxes of one image, a 2D-Tensor + with shape [num_gts, 4] in [tl_x, tl_y, br_x, br_y] format. + gt_labels (Tensor): Ground truth labels of one image, a Tensor + with shape [num_gts]. + """ + + num_priors = priors.size(0) + num_gts = gt_labels.size(0) + gt_bboxes = gt_bboxes.to(decoded_bboxes.dtype) + # No target + if num_gts == 0: + cls_target = cls_preds.new_zeros((0, self.num_classes)) + bbox_target = cls_preds.new_zeros((0, 4)) + l1_target = cls_preds.new_zeros((0, 4)) + obj_target = cls_preds.new_zeros((num_priors, 1)) + foreground_mask = cls_preds.new_zeros(num_priors).bool() + return (foreground_mask, cls_target, obj_target, bbox_target, + l1_target, 0) + + # YOLOX uses center priors with 0.5 offset to assign targets, + # but use center priors without offset to regress bboxes. + offset_priors = torch.cat( + [priors[:, :2] + priors[:, 2:] * 0.5, priors[:, 2:]], dim=-1) + + assign_result = self.assigner.assign( + cls_preds.sigmoid() * objectness.unsqueeze(1).sigmoid(), + offset_priors, decoded_bboxes, gt_bboxes, gt_labels) + + sampling_result = self.sampler.sample(assign_result, priors, gt_bboxes) + pos_inds = sampling_result.pos_inds + num_pos_per_img = pos_inds.size(0) + + pos_ious = assign_result.max_overlaps[pos_inds] + # IOU aware classification score + cls_target = F.one_hot(sampling_result.pos_gt_labels, + self.num_classes) * pos_ious.unsqueeze(-1) + obj_target = torch.zeros_like(objectness).unsqueeze(-1) + obj_target[pos_inds] = 1 + bbox_target = sampling_result.pos_gt_bboxes + l1_target = cls_preds.new_zeros((num_pos_per_img, 4)) + if self.use_l1: + l1_target = self._get_l1_target(l1_target, bbox_target, + priors[pos_inds]) + foreground_mask = torch.zeros_like(objectness).to(torch.bool) + foreground_mask[pos_inds] = 1 + return (foreground_mask, cls_target, obj_target, bbox_target, + l1_target, num_pos_per_img) + + def _get_l1_target(self, l1_target, gt_bboxes, priors, eps=1e-8): + """Convert gt bboxes to center offset and log width height.""" + gt_cxcywh = bbox_xyxy_to_cxcywh(gt_bboxes) + l1_target[:, :2] = (gt_cxcywh[:, :2] - priors[:, :2]) / priors[:, 2:] + l1_target[:, 2:] = torch.log(gt_cxcywh[:, 2:] / priors[:, 2:] + eps) + return l1_target diff --git a/mmdet/models/detectors/__init__.py b/mmdet/models/detectors/__init__.py new file mode 100644 index 0000000..a0a89b8 --- /dev/null +++ b/mmdet/models/detectors/__init__.py @@ -0,0 +1,58 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .atss import ATSS +from .autoassign import AutoAssign +from .base import BaseDetector +from .cascade_rcnn import CascadeRCNN +from .centernet import CenterNet +from .cornernet import CornerNet +from .ddod import DDOD +from .deformable_detr import DeformableDETR +from .detr import DETR +from .fast_rcnn import FastRCNN +from .faster_rcnn import FasterRCNN +from .fcos import FCOS +from .fovea import FOVEA +from .fsaf import FSAF +from .gfl import GFL +from .grid_rcnn import GridRCNN +from .htc import HybridTaskCascade +from .kd_one_stage import KnowledgeDistillationSingleStageDetector +from .lad import LAD +from .mask2former import Mask2Former +from .mask_rcnn import MaskRCNN +from .mask_scoring_rcnn import MaskScoringRCNN +from .maskformer import MaskFormer +from .nasfcos import NASFCOS +from .paa import PAA +from .panoptic_fpn import PanopticFPN +from .panoptic_two_stage_segmentor import TwoStagePanopticSegmentor +from .point_rend import PointRend +from .queryinst import QueryInst +from .reppoints_detector import RepPointsDetector +from .retinanet import RetinaNet +from .rpn import RPN +from .scnet import SCNet +from .single_stage import SingleStageDetector +from .solo import SOLO +from .solov2 import SOLOv2 +from .sparse_rcnn import SparseRCNN +from .tood import TOOD +from .trident_faster_rcnn import TridentFasterRCNN +from .two_stage import TwoStageDetector +from .vfnet import VFNet +from .yolact import YOLACT +from .yolo import YOLOV3 +from .yolof import YOLOF +from .yolox import YOLOX + +__all__ = [ + 'ATSS', 'BaseDetector', 'SingleStageDetector', 'TwoStageDetector', 'RPN', + 'KnowledgeDistillationSingleStageDetector', 'FastRCNN', 'FasterRCNN', + 'MaskRCNN', 'CascadeRCNN', 'HybridTaskCascade', 'RetinaNet', 'FCOS', + 'GridRCNN', 'MaskScoringRCNN', 'RepPointsDetector', 'FOVEA', 'FSAF', + 'NASFCOS', 'PointRend', 'GFL', 'CornerNet', 'PAA', 'YOLOV3', 'YOLACT', + 'VFNet', 'DETR', 'TridentFasterRCNN', 'SparseRCNN', 'SCNet', 'SOLO', + 'SOLOv2', 'DeformableDETR', 'AutoAssign', 'YOLOF', 'CenterNet', 'YOLOX', + 'TwoStagePanopticSegmentor', 'PanopticFPN', 'QueryInst', 'LAD', 'TOOD', + 'MaskFormer', 'DDOD', 'Mask2Former' +] diff --git a/mmdet/models/detectors/atss.py b/mmdet/models/detectors/atss.py new file mode 100644 index 0000000..00f1acd --- /dev/null +++ b/mmdet/models/detectors/atss.py @@ -0,0 +1,19 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .single_stage import SingleStageDetector + + +@DETECTORS.register_module() +class ATSS(SingleStageDetector): + """Implementation of `ATSS `_.""" + + def __init__(self, + backbone, + neck, + bbox_head, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + super(ATSS, self).__init__(backbone, neck, bbox_head, train_cfg, + test_cfg, pretrained, init_cfg) diff --git a/mmdet/models/detectors/autoassign.py b/mmdet/models/detectors/autoassign.py new file mode 100644 index 0000000..30ab720 --- /dev/null +++ b/mmdet/models/detectors/autoassign.py @@ -0,0 +1,19 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .single_stage import SingleStageDetector + + +@DETECTORS.register_module() +class AutoAssign(SingleStageDetector): + """Implementation of `AutoAssign: Differentiable Label Assignment for Dense + Object Detection `_.""" + + def __init__(self, + backbone, + neck, + bbox_head, + train_cfg=None, + test_cfg=None, + pretrained=None): + super(AutoAssign, self).__init__(backbone, neck, bbox_head, train_cfg, + test_cfg, pretrained) diff --git a/mmdet/models/detectors/base.py b/mmdet/models/detectors/base.py new file mode 100644 index 0000000..6412dd1 --- /dev/null +++ b/mmdet/models/detectors/base.py @@ -0,0 +1,407 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from abc import ABCMeta, abstractmethod +from collections import OrderedDict + +import mmcv +import numpy as np +import torch +import torch.distributed as dist +from mmcv.runner import BaseModule, auto_fp16 + +from mmdet.core.visualization import imshow_det_bboxes +import global_placeholder + +class BaseDetector(BaseModule, metaclass=ABCMeta): + """Base class for detectors.""" + + def __init__(self, init_cfg=None): + super(BaseDetector, self).__init__(init_cfg) + self.fp16_enabled = False + + @property + def with_neck(self): + """bool: whether the detector has a neck""" + return hasattr(self, 'neck') and self.neck is not None + + # TODO: these properties need to be carefully handled + # for both single stage & two stage detectors + @property + def with_shared_head(self): + """bool: whether the detector has a shared head in the RoI Head""" + return hasattr(self, 'roi_head') and self.roi_head.with_shared_head + + @property + def with_bbox(self): + """bool: whether the detector has a bbox head""" + return ((hasattr(self, 'roi_head') and self.roi_head.with_bbox) + or (hasattr(self, 'bbox_head') and self.bbox_head is not None)) + + @property + def with_mask(self): + """bool: whether the detector has a mask head""" + return ((hasattr(self, 'roi_head') and self.roi_head.with_mask) + or (hasattr(self, 'mask_head') and self.mask_head is not None)) + + @abstractmethod + def extract_feat(self, imgs): + """Extract features from images.""" + pass + + def extract_feats(self, imgs): + """Extract features from multiple images. + + Args: + imgs (list[torch.Tensor]): A list of images. The images are + augmented from the same image but in different ways. + + Returns: + list[torch.Tensor]: Features of different images + """ + assert isinstance(imgs, list) + return [self.extract_feat(img) for img in imgs] + + def forward_train(self, imgs, img_metas, **kwargs): + """ + Args: + img (Tensor): of shape (N, C, H, W) encoding input images. + Typically these should be mean centered and std scaled. + img_metas (list[dict]): List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys, see + :class:`mmdet.datasets.pipelines.Collect`. + kwargs (keyword arguments): Specific to concrete implementation. + """ + # NOTE the batched image size information may be useful, e.g. + # in DETR, this is needed for the construction of masks, which is + # then used for the transformer_head. + batch_input_shape = tuple(imgs[0].size()[-2:]) + for img_meta in img_metas: + img_meta['batch_input_shape'] = batch_input_shape + + async def async_simple_test(self, img, img_metas, **kwargs): + raise NotImplementedError + + @abstractmethod + def simple_test(self, img, img_metas, **kwargs): + pass + + @abstractmethod + def aug_test(self, imgs, img_metas, **kwargs): + """Test function with test time augmentation.""" + pass + + async def aforward_test(self, *, img, img_metas, **kwargs): + for var, name in [(img, 'img'), (img_metas, 'img_metas')]: + if not isinstance(var, list): + raise TypeError(f'{name} must be a list, but got {type(var)}') + + num_augs = len(img) + if num_augs != len(img_metas): + raise ValueError(f'num of augmentations ({len(img)}) ' + f'!= num of image metas ({len(img_metas)})') + # TODO: remove the restriction of samples_per_gpu == 1 when prepared + samples_per_gpu = img[0].size(0) + assert samples_per_gpu == 1 + + if num_augs == 1: + return await self.async_simple_test(img[0], img_metas[0], **kwargs) + else: + raise NotImplementedError + + def forward_test(self, imgs, img_metas, **kwargs): + """ + Args: + imgs (List[Tensor]): the outer list indicates test-time + augmentations and inner Tensor should have a shape NxCxHxW, + which contains all images in the batch. + img_metas (List[List[dict]]): the outer list indicates test-time + augs (multiscale, flip, etc.) and the inner list indicates + images in a batch. + """ + for var, name in [(imgs, 'imgs'), (img_metas, 'img_metas')]: + if not isinstance(var, list): + raise TypeError(f'{name} must be a list, but got {type(var)}') + + num_augs = len(imgs) + if num_augs != len(img_metas): + raise ValueError(f'num of augmentations ({len(imgs)}) ' + f'!= num of image meta ({len(img_metas)})') + + # NOTE the batched image size information may be useful, e.g. + # in DETR, this is needed for the construction of masks, which is + # then used for the transformer_head. + for img, img_meta in zip(imgs, img_metas): + batch_size = len(img_meta) + for img_id in range(batch_size): + img_meta[img_id]['batch_input_shape'] = tuple(img.size()[-2:]) + + if num_augs == 1: + # proposals (List[List[Tensor]]): the outer list indicates + # test-time augs (multiscale, flip, etc.) and the inner list + # indicates images in a batch. + # The Tensor should have a shape Px4, where P is the number of + # proposals. + if 'proposals' in kwargs: + kwargs['proposals'] = kwargs['proposals'][0] + return self.simple_test(imgs[0], img_metas[0], **kwargs) + else: + assert imgs[0].size(0) == 1, 'aug test does not support ' \ + 'inference with batch size ' \ + f'{imgs[0].size(0)}' + # TODO: support test augmentation for predefined proposals + assert 'proposals' not in kwargs + return self.aug_test(imgs, img_metas, **kwargs) + + @auto_fp16(apply_to=('img', )) + def forward(self, img, img_metas, return_loss=True, **kwargs): # NOTE 这个就是核心的,detector forward + """Calls either :func:`forward_train` or :func:`forward_test` depending + on whether ``return_loss`` is ``True``. + + Note this setting will change the expected inputs. When + ``return_loss=True``, img and img_meta are single-nested (i.e. Tensor + and List[dict]), and when ``resturn_loss=False``, img and img_meta + should be double nested (i.e. List[Tensor], List[List[dict]]), with + the outer list indicating test time augmentations. + """ + if torch.onnx.is_in_onnx_export(): + assert len(img_metas) == 1 + return self.onnx_export(img[0], img_metas[0]) + + if return_loss: + + task_losses = self.forward_train(img, img_metas, **kwargs) + + # -----加上最小量化误差 + qloss_flag = global_placeholder.qloss_flag + q_loss = torch.tensor(0) + if False: + q_loss_sum = [] + for name, module in self.named_modules(): + if hasattr(module, 'compute_qloss') and module.compute_qloss: + # if 'post_act' in name: + # # 说明是act量化器 + # pass + # else: + # # 说明是weight量化器 + # q_loss_sum.append(module.quantization_loss) + q_loss_sum.append(module.quantization_loss) + + # for name, module in self.backbone.named_modules(): + # if hasattr(module, 'compute_qloss') and module.compute_qloss: + # # if 'fake_quant' in name.split('.')[-1]: + # # 说明是act quantizer + # q_loss_sum.append(module.quantization_loss) + # for name, module in self.neck.named_modules(): + # if hasattr(module, 'compute_qloss') and module.compute_qloss: + # # if 'fake_quant' in name.split('.')[-1]: + # # 说明是act quantizer + # q_loss_sum.append(module.quantization_loss) + # for name, module in self.bbox_head.named_modules(): + # if hasattr(module, 'compute_qloss') and module.compute_qloss: + # # if 'fake_quant' in name.split('.')[-1]: + # # 说明是act quantizer + # q_loss_sum.append(module.quantization_loss) + + + # 量化误差均值 + qbit = float(global_placeholder.quant_bit) + # hyperparam = .01 # 对于纯act,这个不行 + hyperparam = .001 + q_loss = hyperparam * sum(q_loss_sum) + task_losses['q_loss'] = q_loss + + return task_losses + else: + return self.forward_test(img, img_metas, **kwargs) + + def _parse_losses(self, losses): + """Parse the raw outputs (losses) of the network. + + Args: + losses (dict): Raw output of the network, which usually contain + losses and other necessary information. + + Returns: + tuple[Tensor, dict]: (loss, log_vars), loss is the loss tensor \ + which may be a weighted sum of all losses, log_vars contains \ + all the variables to be sent to the logger. + """ + log_vars = OrderedDict() + for loss_name, loss_value in losses.items(): + if isinstance(loss_value, torch.Tensor): + log_vars[loss_name] = loss_value.mean() + elif isinstance(loss_value, list): + log_vars[loss_name] = sum(_loss.mean() for _loss in loss_value) + else: + raise TypeError( + f'{loss_name} is not a tensor or list of tensors') + + loss = sum(_value for _key, _value in log_vars.items() + if 'loss' in _key) + + # If the loss_vars has different length, GPUs will wait infinitely + if dist.is_available() and dist.is_initialized(): + log_var_length = torch.tensor(len(log_vars), device=loss.device) + dist.all_reduce(log_var_length) + message = (f'rank {dist.get_rank()}' + + f' len(log_vars): {len(log_vars)}' + ' keys: ' + + ','.join(log_vars.keys())) + assert log_var_length == len(log_vars) * dist.get_world_size(), \ + 'loss log variables are different across GPUs!\n' + message + + log_vars['loss'] = loss + for loss_name, loss_value in log_vars.items(): + # reduce loss when distributed training + if dist.is_available() and dist.is_initialized(): + loss_value = loss_value.data.clone() + dist.all_reduce(loss_value.div_(dist.get_world_size())) + log_vars[loss_name] = loss_value.item() + + return loss, log_vars + + def train_step(self, data, optimizer): + """The iteration step during training. + + This method defines an iteration step during training, except for the + back propagation and optimizer updating, which are done in an optimizer + hook. Note that in some complicated cases or models, the whole process + including back propagation and optimizer updating is also defined in + this method, such as GAN. + + Args: + data (dict): The output of dataloader. + optimizer (:obj:`torch.optim.Optimizer` | dict): The optimizer of + runner is passed to ``train_step()``. This argument is unused + and reserved. + + Returns: + dict: It should contain at least 3 keys: ``loss``, ``log_vars``, \ + ``num_samples``. + + - ``loss`` is a tensor for back propagation, which can be a + weighted sum of multiple losses. + - ``log_vars`` contains all the variables to be sent to the + logger. + - ``num_samples`` indicates the batch size (when the model is + DDP, it means the batch size on each GPU), which is used for + averaging the logs. + """ + losses = self(**data) + loss, log_vars = self._parse_losses(losses) + + outputs = dict( + loss=loss, log_vars=log_vars, num_samples=len(data['img_metas'])) + + return outputs + + def val_step(self, data, optimizer=None): + """The iteration step during validation. + + This method shares the same signature as :func:`train_step`, but used + during val epochs. Note that the evaluation after training epochs is + not implemented with this method, but an evaluation hook. + """ + losses = self(**data) + loss, log_vars = self._parse_losses(losses) + + log_vars_ = dict() + for loss_name, loss_value in log_vars.items(): + k = loss_name + '_val' + log_vars_[k] = loss_value + + outputs = dict( + loss=loss, log_vars=log_vars_, num_samples=len(data['img_metas'])) + + return outputs + + def show_result(self, + img, + result, + score_thr=0.3, + bbox_color=(72, 101, 241), + text_color=(72, 101, 241), + mask_color=None, + thickness=2, + font_size=13, + win_name='', + show=False, + wait_time=0, + out_file=None): + """Draw `result` over `img`. + + Args: + img (str or Tensor): The image to be displayed. + result (Tensor or tuple): The results to draw over `img` + bbox_result or (bbox_result, segm_result). + score_thr (float, optional): Minimum score of bboxes to be shown. + Default: 0.3. + bbox_color (str or tuple(int) or :obj:`Color`):Color of bbox lines. + The tuple of color should be in BGR order. Default: 'green' + text_color (str or tuple(int) or :obj:`Color`):Color of texts. + The tuple of color should be in BGR order. Default: 'green' + mask_color (None or str or tuple(int) or :obj:`Color`): + Color of masks. The tuple of color should be in BGR order. + Default: None + thickness (int): Thickness of lines. Default: 2 + font_size (int): Font size of texts. Default: 13 + win_name (str): The window name. Default: '' + wait_time (float): Value of waitKey param. + Default: 0. + show (bool): Whether to show the image. + Default: False. + out_file (str or None): The filename to write the image. + Default: None. + + Returns: + img (Tensor): Only if not `show` or `out_file` + """ + img = mmcv.imread(img) + img = img.copy() + if isinstance(result, tuple): + bbox_result, segm_result = result + if isinstance(segm_result, tuple): + segm_result = segm_result[0] # ms rcnn + else: + bbox_result, segm_result = result, None + bboxes = np.vstack(bbox_result) + labels = [ + np.full(bbox.shape[0], i, dtype=np.int32) + for i, bbox in enumerate(bbox_result) + ] + labels = np.concatenate(labels) + # draw segmentation masks + segms = None + if segm_result is not None and len(labels) > 0: # non empty + segms = mmcv.concat_list(segm_result) + if isinstance(segms[0], torch.Tensor): + segms = torch.stack(segms, dim=0).detach().cpu().numpy() + else: + segms = np.stack(segms, axis=0) + # if out_file specified, do not show image in window + if out_file is not None: + show = False + # draw bounding boxes + img = imshow_det_bboxes( + img, + bboxes, + labels, + segms, + class_names=self.CLASSES, + score_thr=score_thr, + bbox_color=bbox_color, + text_color=text_color, + mask_color=mask_color, + thickness=thickness, + font_size=font_size, + win_name=win_name, + show=show, + wait_time=wait_time, + out_file=out_file) + + if not (show or out_file): + return img + + def onnx_export(self, img, img_metas): + raise NotImplementedError(f'{self.__class__.__name__} does ' + f'not support ONNX EXPORT') diff --git a/mmdet/models/detectors/cascade_rcnn.py b/mmdet/models/detectors/cascade_rcnn.py new file mode 100644 index 0000000..d8c7382 --- /dev/null +++ b/mmdet/models/detectors/cascade_rcnn.py @@ -0,0 +1,49 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .two_stage import TwoStageDetector + + +@DETECTORS.register_module() +class CascadeRCNN(TwoStageDetector): + r"""Implementation of `Cascade R-CNN: Delving into High Quality Object + Detection `_""" + + def __init__(self, + backbone, + neck=None, + rpn_head=None, + roi_head=None, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + super(CascadeRCNN, self).__init__( + backbone=backbone, + neck=neck, + rpn_head=rpn_head, + roi_head=roi_head, + train_cfg=train_cfg, + test_cfg=test_cfg, + pretrained=pretrained, + init_cfg=init_cfg) + + def show_result(self, data, result, **kwargs): + """Show prediction results of the detector. + + Args: + data (str or np.ndarray): Image filename or loaded image. + result (Tensor or tuple): The results to draw over `img` + bbox_result or (bbox_result, segm_result). + + Returns: + np.ndarray: The image with bboxes drawn on it. + """ + if self.with_mask: + ms_bbox_result, ms_segm_result = result + if isinstance(ms_bbox_result, dict): + result = (ms_bbox_result['ensemble'], + ms_segm_result['ensemble']) + else: + if isinstance(result, dict): + result = result['ensemble'] + return super(CascadeRCNN, self).show_result(data, result, **kwargs) diff --git a/mmdet/models/detectors/centernet.py b/mmdet/models/detectors/centernet.py new file mode 100644 index 0000000..e1e3fd3 --- /dev/null +++ b/mmdet/models/detectors/centernet.py @@ -0,0 +1,111 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from mmdet.core import bbox2result +from mmdet.models.builder import DETECTORS +from ...core.utils import flip_tensor +from .single_stage import SingleStageDetector + + +@DETECTORS.register_module() +class CenterNet(SingleStageDetector): + """Implementation of CenterNet(Objects as Points) + + . + """ + + def __init__(self, + backbone, + neck, + bbox_head, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + super(CenterNet, self).__init__(backbone, neck, bbox_head, train_cfg, + test_cfg, pretrained, init_cfg) + + def merge_aug_results(self, aug_results, with_nms): + """Merge augmented detection bboxes and score. + + Args: + aug_results (list[list[Tensor]]): Det_bboxes and det_labels of each + image. + with_nms (bool): If True, do nms before return boxes. + + Returns: + tuple: (out_bboxes, out_labels) + """ + recovered_bboxes, aug_labels = [], [] + for single_result in aug_results: + recovered_bboxes.append(single_result[0][0]) + aug_labels.append(single_result[0][1]) + + bboxes = torch.cat(recovered_bboxes, dim=0).contiguous() + labels = torch.cat(aug_labels).contiguous() + if with_nms: + out_bboxes, out_labels = self.bbox_head._bboxes_nms( + bboxes, labels, self.bbox_head.test_cfg) + else: + out_bboxes, out_labels = bboxes, labels + + return out_bboxes, out_labels + + def aug_test(self, imgs, img_metas, rescale=True): + """Augment testing of CenterNet. Aug test must have flipped image pair, + and unlike CornerNet, it will perform an averaging operation on the + feature map instead of detecting bbox. + + Args: + imgs (list[Tensor]): Augmented images. + img_metas (list[list[dict]]): Meta information of each image, e.g., + image size, scaling factor, etc. + rescale (bool): If True, return boxes in original image space. + Default: True. + + Note: + ``imgs`` must including flipped image pairs. + + Returns: + list[list[np.ndarray]]: BBox results of each image and classes. + The outer list corresponds to each image. The inner list + corresponds to each class. + """ + img_inds = list(range(len(imgs))) + assert img_metas[0][0]['flip'] + img_metas[1][0]['flip'], ( + 'aug test must have flipped image pair') + aug_results = [] + for ind, flip_ind in zip(img_inds[0::2], img_inds[1::2]): + flip_direction = img_metas[flip_ind][0]['flip_direction'] + img_pair = torch.cat([imgs[ind], imgs[flip_ind]]) + x = self.extract_feat(img_pair) + center_heatmap_preds, wh_preds, offset_preds = self.bbox_head(x) + assert len(center_heatmap_preds) == len(wh_preds) == len( + offset_preds) == 1 + + # Feature map averaging + center_heatmap_preds[0] = ( + center_heatmap_preds[0][0:1] + + flip_tensor(center_heatmap_preds[0][1:2], flip_direction)) / 2 + wh_preds[0] = (wh_preds[0][0:1] + + flip_tensor(wh_preds[0][1:2], flip_direction)) / 2 + + bbox_list = self.bbox_head.get_bboxes( + center_heatmap_preds, + wh_preds, [offset_preds[0][0:1]], + img_metas[ind], + rescale=rescale, + with_nms=False) + aug_results.append(bbox_list) + + nms_cfg = self.bbox_head.test_cfg.get('nms_cfg', None) + if nms_cfg is None: + with_nms = False + else: + with_nms = True + bbox_list = [self.merge_aug_results(aug_results, with_nms)] + bbox_results = [ + bbox2result(det_bboxes, det_labels, self.bbox_head.num_classes) + for det_bboxes, det_labels in bbox_list + ] + return bbox_results diff --git a/mmdet/models/detectors/cornernet.py b/mmdet/models/detectors/cornernet.py new file mode 100644 index 0000000..ce921cc --- /dev/null +++ b/mmdet/models/detectors/cornernet.py @@ -0,0 +1,97 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from mmdet.core import bbox2result, bbox_mapping_back +from ..builder import DETECTORS +from .single_stage import SingleStageDetector + + +@DETECTORS.register_module() +class CornerNet(SingleStageDetector): + """CornerNet. + + This detector is the implementation of the paper `CornerNet: Detecting + Objects as Paired Keypoints `_ . + """ + + def __init__(self, + backbone, + neck, + bbox_head, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + super(CornerNet, self).__init__(backbone, neck, bbox_head, train_cfg, + test_cfg, pretrained, init_cfg) + + def merge_aug_results(self, aug_results, img_metas): + """Merge augmented detection bboxes and score. + + Args: + aug_results (list[list[Tensor]]): Det_bboxes and det_labels of each + image. + img_metas (list[list[dict]]): Meta information of each image, e.g., + image size, scaling factor, etc. + + Returns: + tuple: (bboxes, labels) + """ + recovered_bboxes, aug_labels = [], [] + for bboxes_labels, img_info in zip(aug_results, img_metas): + img_shape = img_info[0]['img_shape'] # using shape before padding + scale_factor = img_info[0]['scale_factor'] + flip = img_info[0]['flip'] + bboxes, labels = bboxes_labels + bboxes, scores = bboxes[:, :4], bboxes[:, -1:] + bboxes = bbox_mapping_back(bboxes, img_shape, scale_factor, flip) + recovered_bboxes.append(torch.cat([bboxes, scores], dim=-1)) + aug_labels.append(labels) + + bboxes = torch.cat(recovered_bboxes, dim=0) + labels = torch.cat(aug_labels) + + if bboxes.shape[0] > 0: + out_bboxes, out_labels = self.bbox_head._bboxes_nms( + bboxes, labels, self.bbox_head.test_cfg) + else: + out_bboxes, out_labels = bboxes, labels + + return out_bboxes, out_labels + + def aug_test(self, imgs, img_metas, rescale=False): + """Augment testing of CornerNet. + + Args: + imgs (list[Tensor]): Augmented images. + img_metas (list[list[dict]]): Meta information of each image, e.g., + image size, scaling factor, etc. + rescale (bool): If True, return boxes in original image space. + Default: False. + + Note: + ``imgs`` must including flipped image pairs. + + Returns: + list[list[np.ndarray]]: BBox results of each image and classes. + The outer list corresponds to each image. The inner list + corresponds to each class. + """ + img_inds = list(range(len(imgs))) + + assert img_metas[0][0]['flip'] + img_metas[1][0]['flip'], ( + 'aug test must have flipped image pair') + aug_results = [] + for ind, flip_ind in zip(img_inds[0::2], img_inds[1::2]): + img_pair = torch.cat([imgs[ind], imgs[flip_ind]]) + x = self.extract_feat(img_pair) + outs = self.bbox_head(x) + bbox_list = self.bbox_head.get_bboxes( + *outs, [img_metas[ind], img_metas[flip_ind]], False, False) + aug_results.append(bbox_list[0]) + aug_results.append(bbox_list[1]) + + bboxes, labels = self.merge_aug_results(aug_results, img_metas) + bbox_results = bbox2result(bboxes, labels, self.bbox_head.num_classes) + + return [bbox_results] diff --git a/mmdet/models/detectors/ddod.py b/mmdet/models/detectors/ddod.py new file mode 100644 index 0000000..2ae0a74 --- /dev/null +++ b/mmdet/models/detectors/ddod.py @@ -0,0 +1,19 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .single_stage import SingleStageDetector + + +@DETECTORS.register_module() +class DDOD(SingleStageDetector): + """Implementation of `DDOD `_.""" + + def __init__(self, + backbone, + neck, + bbox_head, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + super(DDOD, self).__init__(backbone, neck, bbox_head, train_cfg, + test_cfg, pretrained, init_cfg) diff --git a/mmdet/models/detectors/deformable_detr.py b/mmdet/models/detectors/deformable_detr.py new file mode 100644 index 0000000..b1f1642 --- /dev/null +++ b/mmdet/models/detectors/deformable_detr.py @@ -0,0 +1,10 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .detr import DETR + + +@DETECTORS.register_module() +class DeformableDETR(DETR): + + def __init__(self, *args, **kwargs): + super(DETR, self).__init__(*args, **kwargs) diff --git a/mmdet/models/detectors/detr.py b/mmdet/models/detectors/detr.py new file mode 100644 index 0000000..06d7691 --- /dev/null +++ b/mmdet/models/detectors/detr.py @@ -0,0 +1,70 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch + +from ..builder import DETECTORS +from .single_stage import SingleStageDetector + + +@DETECTORS.register_module() +class DETR(SingleStageDetector): + r"""Implementation of `DETR: End-to-End Object Detection with + Transformers `_""" + + def __init__(self, + backbone, + bbox_head, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + super(DETR, self).__init__(backbone, None, bbox_head, train_cfg, + test_cfg, pretrained, init_cfg) + + # over-write `forward_dummy` because: + # the forward of bbox_head requires img_metas + def forward_dummy(self, img): + """Used for computing network flops. + + See `mmdetection/tools/analysis_tools/get_flops.py` + """ + warnings.warn('Warning! MultiheadAttention in DETR does not ' + 'support flops computation! Do not use the ' + 'results in your papers!') + + batch_size, _, height, width = img.shape + dummy_img_metas = [ + dict( + batch_input_shape=(height, width), + img_shape=(height, width, 3)) for _ in range(batch_size) + ] + x = self.extract_feat(img) + outs = self.bbox_head(x, dummy_img_metas) + return outs + + # over-write `onnx_export` because: + # (1) the forward of bbox_head requires img_metas + # (2) the different behavior (e.g. construction of `masks`) between + # torch and ONNX model, during the forward of bbox_head + def onnx_export(self, img, img_metas): + """Test function for exporting to ONNX, without test time augmentation. + + Args: + img (torch.Tensor): input images. + img_metas (list[dict]): List of image information. + + Returns: + tuple[Tensor, Tensor]: dets of shape [N, num_det, 5] + and class labels of shape [N, num_det]. + """ + x = self.extract_feat(img) + # forward of this head requires img_metas + outs = self.bbox_head.forward_onnx(x, img_metas) + # get shape as tensor + img_shape = torch._shape_as_tensor(img)[2:] + img_metas[0]['img_shape_for_onnx'] = img_shape + + det_bboxes, det_labels = self.bbox_head.onnx_export(*outs, img_metas) + + return det_bboxes, det_labels diff --git a/mmdet/models/detectors/fast_rcnn.py b/mmdet/models/detectors/fast_rcnn.py new file mode 100644 index 0000000..7aebe15 --- /dev/null +++ b/mmdet/models/detectors/fast_rcnn.py @@ -0,0 +1,55 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .two_stage import TwoStageDetector + + +@DETECTORS.register_module() +class FastRCNN(TwoStageDetector): + """Implementation of `Fast R-CNN `_""" + + def __init__(self, + backbone, + roi_head, + train_cfg, + test_cfg, + neck=None, + pretrained=None, + init_cfg=None): + super(FastRCNN, self).__init__( + backbone=backbone, + neck=neck, + roi_head=roi_head, + train_cfg=train_cfg, + test_cfg=test_cfg, + pretrained=pretrained, + init_cfg=init_cfg) + + def forward_test(self, imgs, img_metas, proposals, **kwargs): + """ + Args: + imgs (List[Tensor]): the outer list indicates test-time + augmentations and inner Tensor should have a shape NxCxHxW, + which contains all images in the batch. + img_metas (List[List[dict]]): the outer list indicates test-time + augs (multiscale, flip, etc.) and the inner list indicates + images in a batch. + proposals (List[List[Tensor]]): the outer list indicates test-time + augs (multiscale, flip, etc.) and the inner list indicates + images in a batch. The Tensor should have a shape Px4, where + P is the number of proposals. + """ + for var, name in [(imgs, 'imgs'), (img_metas, 'img_metas')]: + if not isinstance(var, list): + raise TypeError(f'{name} must be a list, but got {type(var)}') + + num_augs = len(imgs) + if num_augs != len(img_metas): + raise ValueError(f'num of augmentations ({len(imgs)}) ' + f'!= num of image meta ({len(img_metas)})') + + if num_augs == 1: + return self.simple_test(imgs[0], img_metas[0], proposals[0], + **kwargs) + else: + # TODO: support test-time augmentation + assert NotImplementedError diff --git a/mmdet/models/detectors/faster_rcnn.py b/mmdet/models/detectors/faster_rcnn.py new file mode 100644 index 0000000..70fb662 --- /dev/null +++ b/mmdet/models/detectors/faster_rcnn.py @@ -0,0 +1,27 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .two_stage import TwoStageDetector + + +@DETECTORS.register_module() +class FasterRCNN(TwoStageDetector): + """Implementation of `Faster R-CNN `_""" + + def __init__(self, + backbone, + rpn_head, + roi_head, + train_cfg, + test_cfg, + neck=None, + pretrained=None, + init_cfg=None): + super(FasterRCNN, self).__init__( + backbone=backbone, + neck=neck, + rpn_head=rpn_head, + roi_head=roi_head, + train_cfg=train_cfg, + test_cfg=test_cfg, + pretrained=pretrained, + init_cfg=init_cfg) diff --git a/mmdet/models/detectors/fcos.py b/mmdet/models/detectors/fcos.py new file mode 100644 index 0000000..d985bd0 --- /dev/null +++ b/mmdet/models/detectors/fcos.py @@ -0,0 +1,19 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .single_stage import SingleStageDetector + + +@DETECTORS.register_module() +class FCOS(SingleStageDetector): + """Implementation of `FCOS `_""" + + def __init__(self, + backbone, + neck, + bbox_head, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + super(FCOS, self).__init__(backbone, neck, bbox_head, train_cfg, + test_cfg, pretrained, init_cfg) diff --git a/mmdet/models/detectors/fovea.py b/mmdet/models/detectors/fovea.py new file mode 100644 index 0000000..6fd908c --- /dev/null +++ b/mmdet/models/detectors/fovea.py @@ -0,0 +1,19 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .single_stage import SingleStageDetector + + +@DETECTORS.register_module() +class FOVEA(SingleStageDetector): + """Implementation of `FoveaBox `_""" + + def __init__(self, + backbone, + neck, + bbox_head, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + super(FOVEA, self).__init__(backbone, neck, bbox_head, train_cfg, + test_cfg, pretrained, init_cfg) diff --git a/mmdet/models/detectors/fsaf.py b/mmdet/models/detectors/fsaf.py new file mode 100644 index 0000000..81ed1bd --- /dev/null +++ b/mmdet/models/detectors/fsaf.py @@ -0,0 +1,19 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .single_stage import SingleStageDetector + + +@DETECTORS.register_module() +class FSAF(SingleStageDetector): + """Implementation of `FSAF `_""" + + def __init__(self, + backbone, + neck, + bbox_head, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + super(FSAF, self).__init__(backbone, neck, bbox_head, train_cfg, + test_cfg, pretrained, init_cfg) diff --git a/mmdet/models/detectors/gfl.py b/mmdet/models/detectors/gfl.py new file mode 100644 index 0000000..4628e2e --- /dev/null +++ b/mmdet/models/detectors/gfl.py @@ -0,0 +1,18 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .single_stage import SingleStageDetector + + +@DETECTORS.register_module() +class GFL(SingleStageDetector): + + def __init__(self, + backbone, + neck, + bbox_head, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + super(GFL, self).__init__(backbone, neck, bbox_head, train_cfg, + test_cfg, pretrained, init_cfg) diff --git a/mmdet/models/detectors/grid_rcnn.py b/mmdet/models/detectors/grid_rcnn.py new file mode 100644 index 0000000..bba7873 --- /dev/null +++ b/mmdet/models/detectors/grid_rcnn.py @@ -0,0 +1,32 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .two_stage import TwoStageDetector + + +@DETECTORS.register_module() +class GridRCNN(TwoStageDetector): + """Grid R-CNN. + + This detector is the implementation of: + - Grid R-CNN (https://arxiv.org/abs/1811.12030) + - Grid R-CNN Plus: Faster and Better (https://arxiv.org/abs/1906.05688) + """ + + def __init__(self, + backbone, + rpn_head, + roi_head, + train_cfg, + test_cfg, + neck=None, + pretrained=None, + init_cfg=None): + super(GridRCNN, self).__init__( + backbone=backbone, + neck=neck, + rpn_head=rpn_head, + roi_head=roi_head, + train_cfg=train_cfg, + test_cfg=test_cfg, + pretrained=pretrained, + init_cfg=init_cfg) diff --git a/mmdet/models/detectors/htc.py b/mmdet/models/detectors/htc.py new file mode 100644 index 0000000..f7c9533 --- /dev/null +++ b/mmdet/models/detectors/htc.py @@ -0,0 +1,16 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .cascade_rcnn import CascadeRCNN + + +@DETECTORS.register_module() +class HybridTaskCascade(CascadeRCNN): + """Implementation of `HTC `_""" + + def __init__(self, **kwargs): + super(HybridTaskCascade, self).__init__(**kwargs) + + @property + def with_semantic(self): + """bool: whether the detector has a semantic head""" + return self.roi_head.with_semantic diff --git a/mmdet/models/detectors/kd_one_stage.py b/mmdet/models/detectors/kd_one_stage.py new file mode 100644 index 0000000..fb66b51 --- /dev/null +++ b/mmdet/models/detectors/kd_one_stage.py @@ -0,0 +1,103 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from pathlib import Path + +import mmcv +import torch +from mmcv.runner import load_checkpoint + +from .. import build_detector +from ..builder import DETECTORS +from .single_stage import SingleStageDetector + + +@DETECTORS.register_module() +class KnowledgeDistillationSingleStageDetector(SingleStageDetector): + r"""Implementation of `Distilling the Knowledge in a Neural Network. + `_. + + Args: + teacher_config (str | dict): Config file path + or the config object of teacher model. + teacher_ckpt (str, optional): Checkpoint path of teacher model. + If left as None, the model will not load any weights. + """ + + def __init__(self, + backbone, + neck, + bbox_head, + teacher_config, + teacher_ckpt=None, + eval_teacher=True, + train_cfg=None, + test_cfg=None, + pretrained=None): + super().__init__(backbone, neck, bbox_head, train_cfg, test_cfg, + pretrained) + self.eval_teacher = eval_teacher + # Build teacher model + if isinstance(teacher_config, (str, Path)): + teacher_config = mmcv.Config.fromfile(teacher_config) + self.teacher_model = build_detector(teacher_config['model']) + if teacher_ckpt is not None: + load_checkpoint( + self.teacher_model, teacher_ckpt, map_location='cpu') + + def forward_train(self, + img, + img_metas, + gt_bboxes, + gt_labels, + gt_bboxes_ignore=None): + """ + Args: + img (Tensor): Input images of shape (N, C, H, W). + Typically these should be mean centered and std scaled. + img_metas (list[dict]): A List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + :class:`mmdet.datasets.pipelines.Collect`. + gt_bboxes (list[Tensor]): Each item are the truth boxes for each + image in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): Class indices corresponding to each box + gt_bboxes_ignore (None | list[Tensor]): Specify which bounding + boxes can be ignored when computing the loss. + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + x = self.extract_feat(img) + with torch.no_grad(): + teacher_x = self.teacher_model.extract_feat(img) + out_teacher = self.teacher_model.bbox_head(teacher_x) + losses = self.bbox_head.forward_train(x, out_teacher, img_metas, + gt_bboxes, gt_labels, + gt_bboxes_ignore) + return losses + + def cuda(self, device=None): + """Since teacher_model is registered as a plain object, it is necessary + to put the teacher model to cuda when calling cuda function.""" + self.teacher_model.cuda(device=device) + return super().cuda(device=device) + + def train(self, mode=True): + """Set the same train mode for teacher and student model.""" + if self.eval_teacher: + self.teacher_model.train(False) + else: + self.teacher_model.train(mode) + super().train(mode) + + def __setattr__(self, name, value): + """Set attribute, i.e. self.name = value + + This reloading prevent the teacher model from being registered as a + nn.Module. The teacher module is registered as a plain object, so that + the teacher parameters will not show up when calling + ``self.parameters``, ``self.modules``, ``self.children`` methods. + """ + if name == 'teacher_model': + object.__setattr__(self, name, value) + else: + super().__setattr__(name, value) diff --git a/mmdet/models/detectors/lad.py b/mmdet/models/detectors/lad.py new file mode 100644 index 0000000..c6cc1e0 --- /dev/null +++ b/mmdet/models/detectors/lad.py @@ -0,0 +1,92 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.runner import load_checkpoint + +from ..builder import DETECTORS, build_backbone, build_head, build_neck +from .kd_one_stage import KnowledgeDistillationSingleStageDetector + + +@DETECTORS.register_module() +class LAD(KnowledgeDistillationSingleStageDetector): + """Implementation of `LAD `_.""" + + def __init__(self, + backbone, + neck, + bbox_head, + teacher_backbone, + teacher_neck, + teacher_bbox_head, + teacher_ckpt, + eval_teacher=True, + train_cfg=None, + test_cfg=None, + pretrained=None): + super(KnowledgeDistillationSingleStageDetector, + self).__init__(backbone, neck, bbox_head, train_cfg, test_cfg, + pretrained) + self.eval_teacher = eval_teacher + self.teacher_model = nn.Module() + self.teacher_model.backbone = build_backbone(teacher_backbone) + if teacher_neck is not None: + self.teacher_model.neck = build_neck(teacher_neck) + teacher_bbox_head.update(train_cfg=train_cfg) + teacher_bbox_head.update(test_cfg=test_cfg) + self.teacher_model.bbox_head = build_head(teacher_bbox_head) + if teacher_ckpt is not None: + load_checkpoint( + self.teacher_model, teacher_ckpt, map_location='cpu') + + @property + def with_teacher_neck(self): + """bool: whether the detector has a teacher_neck""" + return hasattr(self.teacher_model, 'neck') and \ + self.teacher_model.neck is not None + + def extract_teacher_feat(self, img): + """Directly extract teacher features from the backbone+neck.""" + x = self.teacher_model.backbone(img) + if self.with_teacher_neck: + x = self.teacher_model.neck(x) + return x + + def forward_train(self, + img, + img_metas, + gt_bboxes, + gt_labels, + gt_bboxes_ignore=None): + """ + Args: + img (Tensor): Input images of shape (N, C, H, W). + Typically these should be mean centered and std scaled. + img_metas (list[dict]): A List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + :class:`mmdet.datasets.pipelines.Collect`. + gt_bboxes (list[Tensor]): Each item are the truth boxes for each + image in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): Class indices corresponding to each box + gt_bboxes_ignore (None | list[Tensor]): Specify which bounding + boxes can be ignored when computing the loss. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + # get label assignment from the teacher + with torch.no_grad(): + x_teacher = self.extract_teacher_feat(img) + outs_teacher = self.teacher_model.bbox_head(x_teacher) + label_assignment_results = \ + self.teacher_model.bbox_head.get_label_assignment( + *outs_teacher, gt_bboxes, gt_labels, img_metas, + gt_bboxes_ignore) + + # the student use the label assignment from the teacher to learn + x = self.extract_feat(img) + losses = self.bbox_head.forward_train(x, label_assignment_results, + img_metas, gt_bboxes, gt_labels, + gt_bboxes_ignore) + return losses diff --git a/mmdet/models/detectors/mask2former.py b/mmdet/models/detectors/mask2former.py new file mode 100644 index 0000000..b9ad2ed --- /dev/null +++ b/mmdet/models/detectors/mask2former.py @@ -0,0 +1,27 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .maskformer import MaskFormer + + +@DETECTORS.register_module() +class Mask2Former(MaskFormer): + r"""Implementation of `Masked-attention Mask + Transformer for Universal Image Segmentation + `_.""" + + def __init__(self, + backbone, + neck=None, + panoptic_head=None, + panoptic_fusion_head=None, + train_cfg=None, + test_cfg=None, + init_cfg=None): + super().__init__( + backbone, + neck=neck, + panoptic_head=panoptic_head, + panoptic_fusion_head=panoptic_fusion_head, + train_cfg=train_cfg, + test_cfg=test_cfg, + init_cfg=init_cfg) diff --git a/mmdet/models/detectors/mask_rcnn.py b/mmdet/models/detectors/mask_rcnn.py new file mode 100644 index 0000000..c68489f --- /dev/null +++ b/mmdet/models/detectors/mask_rcnn.py @@ -0,0 +1,27 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .two_stage import TwoStageDetector + + +@DETECTORS.register_module() +class MaskRCNN(TwoStageDetector): + """Implementation of `Mask R-CNN `_""" + + def __init__(self, + backbone, + rpn_head, + roi_head, + train_cfg, + test_cfg, + neck=None, + pretrained=None, + init_cfg=None): + super(MaskRCNN, self).__init__( + backbone=backbone, + neck=neck, + rpn_head=rpn_head, + roi_head=roi_head, + train_cfg=train_cfg, + test_cfg=test_cfg, + pretrained=pretrained, + init_cfg=init_cfg) diff --git a/mmdet/models/detectors/mask_scoring_rcnn.py b/mmdet/models/detectors/mask_scoring_rcnn.py new file mode 100644 index 0000000..5f55656 --- /dev/null +++ b/mmdet/models/detectors/mask_scoring_rcnn.py @@ -0,0 +1,30 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .two_stage import TwoStageDetector + + +@DETECTORS.register_module() +class MaskScoringRCNN(TwoStageDetector): + """Mask Scoring RCNN. + + https://arxiv.org/abs/1903.00241 + """ + + def __init__(self, + backbone, + rpn_head, + roi_head, + train_cfg, + test_cfg, + neck=None, + pretrained=None, + init_cfg=None): + super(MaskScoringRCNN, self).__init__( + backbone=backbone, + neck=neck, + rpn_head=rpn_head, + roi_head=roi_head, + train_cfg=train_cfg, + test_cfg=test_cfg, + pretrained=pretrained, + init_cfg=init_cfg) diff --git a/mmdet/models/detectors/maskformer.py b/mmdet/models/detectors/maskformer.py new file mode 100644 index 0000000..3d251ad --- /dev/null +++ b/mmdet/models/detectors/maskformer.py @@ -0,0 +1,258 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy + +import mmcv +import numpy as np + +from mmdet.core import INSTANCE_OFFSET, bbox2result +from mmdet.core.visualization import imshow_det_bboxes +from ..builder import DETECTORS, build_backbone, build_head, build_neck +from .single_stage import SingleStageDetector + + +@DETECTORS.register_module() +class MaskFormer(SingleStageDetector): + r"""Implementation of `Per-Pixel Classification is + NOT All You Need for Semantic Segmentation + `_.""" + + def __init__(self, + backbone, + neck=None, + panoptic_head=None, + panoptic_fusion_head=None, + train_cfg=None, + test_cfg=None, + init_cfg=None): + super(SingleStageDetector, self).__init__(init_cfg=init_cfg) + self.backbone = build_backbone(backbone) + if neck is not None: + self.neck = build_neck(neck) + + panoptic_head_ = copy.deepcopy(panoptic_head) + panoptic_head_.update(train_cfg=train_cfg) + panoptic_head_.update(test_cfg=test_cfg) + self.panoptic_head = build_head(panoptic_head_) + + panoptic_fusion_head_ = copy.deepcopy(panoptic_fusion_head) + panoptic_fusion_head_.update(test_cfg=test_cfg) + self.panoptic_fusion_head = build_head(panoptic_fusion_head_) + + self.num_things_classes = self.panoptic_head.num_things_classes + self.num_stuff_classes = self.panoptic_head.num_stuff_classes + self.num_classes = self.panoptic_head.num_classes + + self.train_cfg = train_cfg + self.test_cfg = test_cfg + + # BaseDetector.show_result default for instance segmentation + if self.num_stuff_classes > 0: + self.show_result = self._show_pan_result + + def forward_dummy(self, img, img_metas): + """Used for computing network flops. See + `mmdetection/tools/analysis_tools/get_flops.py` + + Args: + img (Tensor): of shape (N, C, H, W) encoding input images. + Typically these should be mean centered and std scaled. + img_metas (list[Dict]): list of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmdet/datasets/pipelines/formatting.py:Collect`. + """ + super(SingleStageDetector, self).forward_train(img, img_metas) + x = self.extract_feat(img) + outs = self.panoptic_head(x, img_metas) + return outs + + def forward_train(self, + img, + img_metas, + gt_bboxes, + gt_labels, + gt_masks, + gt_semantic_seg=None, + gt_bboxes_ignore=None, + **kargs): + """ + Args: + img (Tensor): of shape (N, C, H, W) encoding input images. + Typically these should be mean centered and std scaled. + img_metas (list[Dict]): list of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmdet/datasets/pipelines/formatting.py:Collect`. + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box. + gt_masks (list[BitmapMasks]): true segmentation masks for each box + used if the architecture supports a segmentation task. + gt_semantic_seg (list[tensor]): semantic segmentation mask for + images for panoptic segmentation. + Defaults to None for instance segmentation. + gt_bboxes_ignore (list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. + Defaults to None. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + # add batch_input_shape in img_metas + super(SingleStageDetector, self).forward_train(img, img_metas) + x = self.extract_feat(img) + losses = self.panoptic_head.forward_train(x, img_metas, gt_bboxes, + gt_labels, gt_masks, + gt_semantic_seg, + gt_bboxes_ignore) + + return losses + + def simple_test(self, imgs, img_metas, **kwargs): + """Test without augmentation. + + Args: + imgs (Tensor): A batch of images. + img_metas (list[dict]): List of image information. + + Returns: + list[dict[str, np.array | tuple[list]] | tuple[list]]: + Semantic segmentation results and panoptic segmentation \ + results of each image for panoptic segmentation, or formatted \ + bbox and mask results of each image for instance segmentation. + + .. code-block:: none + + [ + # panoptic segmentation + { + 'pan_results': np.array, # shape = [h, w] + 'ins_results': tuple[list], + # semantic segmentation results are not supported yet + 'sem_results': np.array + }, + ... + ] + + or + + .. code-block:: none + + [ + # instance segmentation + ( + bboxes, # list[np.array] + masks # list[list[np.array]] + ), + ... + ] + """ + feats = self.extract_feat(imgs) + mask_cls_results, mask_pred_results = self.panoptic_head.simple_test( + feats, img_metas, **kwargs) + results = self.panoptic_fusion_head.simple_test( + mask_cls_results, mask_pred_results, img_metas, **kwargs) + for i in range(len(results)): + if 'pan_results' in results[i]: + results[i]['pan_results'] = results[i]['pan_results'].detach( + ).cpu().numpy() + + if 'ins_results' in results[i]: + labels_per_image, bboxes, mask_pred_binary = results[i][ + 'ins_results'] + bbox_results = bbox2result(bboxes, labels_per_image, + self.num_things_classes) + mask_results = [[] for _ in range(self.num_things_classes)] + for j, label in enumerate(labels_per_image): + mask = mask_pred_binary[j].detach().cpu().numpy() + mask_results[label].append(mask) + results[i]['ins_results'] = bbox_results, mask_results + + assert 'sem_results' not in results[i], 'segmantic segmentation '\ + 'results are not supported yet.' + + if self.num_stuff_classes == 0: + results = [res['ins_results'] for res in results] + + return results + + def aug_test(self, imgs, img_metas, **kwargs): + raise NotImplementedError + + def onnx_export(self, img, img_metas): + raise NotImplementedError + + def _show_pan_result(self, + img, + result, + score_thr=0.3, + bbox_color=(72, 101, 241), + text_color=(72, 101, 241), + mask_color=None, + thickness=2, + font_size=13, + win_name='', + show=False, + wait_time=0, + out_file=None): + """Draw `panoptic result` over `img`. + + Args: + img (str or Tensor): The image to be displayed. + result (dict): The results. + + score_thr (float, optional): Minimum score of bboxes to be shown. + Default: 0.3. + bbox_color (str or tuple(int) or :obj:`Color`):Color of bbox lines. + The tuple of color should be in BGR order. Default: 'green'. + text_color (str or tuple(int) or :obj:`Color`):Color of texts. + The tuple of color should be in BGR order. Default: 'green'. + mask_color (None or str or tuple(int) or :obj:`Color`): + Color of masks. The tuple of color should be in BGR order. + Default: None. + thickness (int): Thickness of lines. Default: 2. + font_size (int): Font size of texts. Default: 13. + win_name (str): The window name. Default: ''. + wait_time (float): Value of waitKey param. + Default: 0. + show (bool): Whether to show the image. + Default: False. + out_file (str or None): The filename to write the image. + Default: None. + + Returns: + img (Tensor): Only if not `show` or `out_file`. + """ + img = mmcv.imread(img) + img = img.copy() + pan_results = result['pan_results'] + # keep objects ahead + ids = np.unique(pan_results)[::-1] + legal_indices = ids != self.num_classes # for VOID label + ids = ids[legal_indices] + labels = np.array([id % INSTANCE_OFFSET for id in ids], dtype=np.int64) + segms = (pan_results[None] == ids[:, None, None]) + + # if out_file specified, do not show image in window + if out_file is not None: + show = False + # draw bounding boxes + img = imshow_det_bboxes( + img, + segms=segms, + labels=labels, + class_names=self.CLASSES, + bbox_color=bbox_color, + text_color=text_color, + mask_color=mask_color, + thickness=thickness, + font_size=font_size, + win_name=win_name, + show=show, + wait_time=wait_time, + out_file=out_file) + + if not (show or out_file): + return img diff --git a/mmdet/models/detectors/nasfcos.py b/mmdet/models/detectors/nasfcos.py new file mode 100644 index 0000000..a34c228 --- /dev/null +++ b/mmdet/models/detectors/nasfcos.py @@ -0,0 +1,22 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .single_stage import SingleStageDetector + + +@DETECTORS.register_module() +class NASFCOS(SingleStageDetector): + """NAS-FCOS: Fast Neural Architecture Search for Object Detection. + + https://arxiv.org/abs/1906.0442 + """ + + def __init__(self, + backbone, + neck, + bbox_head, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + super(NASFCOS, self).__init__(backbone, neck, bbox_head, train_cfg, + test_cfg, pretrained, init_cfg) diff --git a/mmdet/models/detectors/paa.py b/mmdet/models/detectors/paa.py new file mode 100644 index 0000000..f5cb837 --- /dev/null +++ b/mmdet/models/detectors/paa.py @@ -0,0 +1,19 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .single_stage import SingleStageDetector + + +@DETECTORS.register_module() +class PAA(SingleStageDetector): + """Implementation of `PAA `_.""" + + def __init__(self, + backbone, + neck, + bbox_head, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + super(PAA, self).__init__(backbone, neck, bbox_head, train_cfg, + test_cfg, pretrained, init_cfg) diff --git a/mmdet/models/detectors/panoptic_fpn.py b/mmdet/models/detectors/panoptic_fpn.py new file mode 100644 index 0000000..f8ac751 --- /dev/null +++ b/mmdet/models/detectors/panoptic_fpn.py @@ -0,0 +1,34 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .panoptic_two_stage_segmentor import TwoStagePanopticSegmentor + + +@DETECTORS.register_module() +class PanopticFPN(TwoStagePanopticSegmentor): + r"""Implementation of `Panoptic feature pyramid + networks `_""" + + def __init__( + self, + backbone, + neck=None, + rpn_head=None, + roi_head=None, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None, + # for panoptic segmentation + semantic_head=None, + panoptic_fusion_head=None): + super(PanopticFPN, self).__init__( + backbone=backbone, + neck=neck, + rpn_head=rpn_head, + roi_head=roi_head, + train_cfg=train_cfg, + test_cfg=test_cfg, + pretrained=pretrained, + init_cfg=init_cfg, + semantic_head=semantic_head, + panoptic_fusion_head=panoptic_fusion_head) diff --git a/mmdet/models/detectors/panoptic_two_stage_segmentor.py b/mmdet/models/detectors/panoptic_two_stage_segmentor.py new file mode 100644 index 0000000..5ad49ba --- /dev/null +++ b/mmdet/models/detectors/panoptic_two_stage_segmentor.py @@ -0,0 +1,279 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import numpy as np +import torch + +from mmdet.core import INSTANCE_OFFSET, bbox2roi, multiclass_nms +from mmdet.core.visualization import imshow_det_bboxes +from ..builder import DETECTORS, build_head +from ..roi_heads.mask_heads.fcn_mask_head import _do_paste_mask +from .two_stage import TwoStageDetector + + +@DETECTORS.register_module() +class TwoStagePanopticSegmentor(TwoStageDetector): + """Base class of Two-stage Panoptic Segmentor. + + As well as the components in TwoStageDetector, Panoptic Segmentor has extra + semantic_head and panoptic_fusion_head. + """ + + def __init__( + self, + backbone, + neck=None, + rpn_head=None, + roi_head=None, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None, + # for panoptic segmentation + semantic_head=None, + panoptic_fusion_head=None): + super(TwoStagePanopticSegmentor, + self).__init__(backbone, neck, rpn_head, roi_head, train_cfg, + test_cfg, pretrained, init_cfg) + if semantic_head is not None: + self.semantic_head = build_head(semantic_head) + if panoptic_fusion_head is not None: + panoptic_cfg = test_cfg.panoptic if test_cfg is not None else None + panoptic_fusion_head_ = panoptic_fusion_head.deepcopy() + panoptic_fusion_head_.update(test_cfg=panoptic_cfg) + self.panoptic_fusion_head = build_head(panoptic_fusion_head_) + + self.num_things_classes = self.panoptic_fusion_head.\ + num_things_classes + self.num_stuff_classes = self.panoptic_fusion_head.\ + num_stuff_classes + self.num_classes = self.panoptic_fusion_head.num_classes + + @property + def with_semantic_head(self): + return hasattr(self, + 'semantic_head') and self.semantic_head is not None + + @property + def with_panoptic_fusion_head(self): + return hasattr(self, 'panoptic_fusion_heads') and \ + self.panoptic_fusion_head is not None + + def forward_dummy(self, img): + """Used for computing network flops. + + See `mmdetection/tools/get_flops.py` + """ + raise NotImplementedError( + f'`forward_dummy` is not implemented in {self.__class__.__name__}') + + def forward_train(self, + img, + img_metas, + gt_bboxes, + gt_labels, + gt_bboxes_ignore=None, + gt_masks=None, + gt_semantic_seg=None, + proposals=None, + **kwargs): + x = self.extract_feat(img) + losses = dict() + + # RPN forward and loss + if self.with_rpn: + proposal_cfg = self.train_cfg.get('rpn_proposal', + self.test_cfg.rpn) + rpn_losses, proposal_list = self.rpn_head.forward_train( + x, + img_metas, + gt_bboxes, + gt_labels=None, + gt_bboxes_ignore=gt_bboxes_ignore, + proposal_cfg=proposal_cfg) + losses.update(rpn_losses) + else: + proposal_list = proposals + + roi_losses = self.roi_head.forward_train(x, img_metas, proposal_list, + gt_bboxes, gt_labels, + gt_bboxes_ignore, gt_masks, + **kwargs) + losses.update(roi_losses) + + semantic_loss = self.semantic_head.forward_train(x, gt_semantic_seg) + losses.update(semantic_loss) + + return losses + + def simple_test_mask(self, + x, + img_metas, + det_bboxes, + det_labels, + rescale=False): + """Simple test for mask head without augmentation.""" + img_shapes = tuple(meta['ori_shape'] + for meta in img_metas) if rescale else tuple( + meta['pad_shape'] for meta in img_metas) + scale_factors = tuple(meta['scale_factor'] for meta in img_metas) + + if all(det_bbox.shape[0] == 0 for det_bbox in det_bboxes): + masks = [] + for img_shape in img_shapes: + out_shape = (0, self.roi_head.bbox_head.num_classes) \ + + img_shape[:2] + masks.append(det_bboxes[0].new_zeros(out_shape)) + mask_pred = det_bboxes[0].new_zeros((0, 80, 28, 28)) + mask_results = dict( + masks=masks, mask_pred=mask_pred, mask_feats=None) + return mask_results + + _bboxes = [det_bboxes[i][:, :4] for i in range(len(det_bboxes))] + if rescale: + if not isinstance(scale_factors[0], float): + scale_factors = [ + det_bboxes[0].new_tensor(scale_factor) + for scale_factor in scale_factors + ] + _bboxes = [ + _bboxes[i] * scale_factors[i] for i in range(len(_bboxes)) + ] + + mask_rois = bbox2roi(_bboxes) + mask_results = self.roi_head._mask_forward(x, mask_rois) + mask_pred = mask_results['mask_pred'] + # split batch mask prediction back to each image + num_mask_roi_per_img = [len(det_bbox) for det_bbox in det_bboxes] + mask_preds = mask_pred.split(num_mask_roi_per_img, 0) + + # resize the mask_preds to (K, H, W) + masks = [] + for i in range(len(_bboxes)): + det_bbox = det_bboxes[i][:, :4] + det_label = det_labels[i] + + mask_pred = mask_preds[i].sigmoid() + + box_inds = torch.arange(mask_pred.shape[0]) + mask_pred = mask_pred[box_inds, det_label][:, None] + + img_h, img_w, _ = img_shapes[i] + mask_pred, _ = _do_paste_mask( + mask_pred, det_bbox, img_h, img_w, skip_empty=False) + masks.append(mask_pred) + + mask_results['masks'] = masks + + return mask_results + + def simple_test(self, img, img_metas, proposals=None, rescale=False): + """Test without Augmentation.""" + x = self.extract_feat(img) + + if proposals is None: + proposal_list = self.rpn_head.simple_test_rpn(x, img_metas) + else: + proposal_list = proposals + + bboxes, scores = self.roi_head.simple_test_bboxes( + x, img_metas, proposal_list, None, rescale=rescale) + + pan_cfg = self.test_cfg.panoptic + # class-wise predictions + det_bboxes = [] + det_labels = [] + for bboxe, score in zip(bboxes, scores): + det_bbox, det_label = multiclass_nms(bboxe, score, + pan_cfg.score_thr, + pan_cfg.nms, + pan_cfg.max_per_img) + det_bboxes.append(det_bbox) + det_labels.append(det_label) + + mask_results = self.simple_test_mask( + x, img_metas, det_bboxes, det_labels, rescale=rescale) + masks = mask_results['masks'] + + seg_preds = self.semantic_head.simple_test(x, img_metas, rescale) + + results = [] + for i in range(len(det_bboxes)): + pan_results = self.panoptic_fusion_head.simple_test( + det_bboxes[i], det_labels[i], masks[i], seg_preds[i]) + pan_results = pan_results.int().detach().cpu().numpy() + result = dict(pan_results=pan_results) + results.append(result) + return results + + def show_result(self, + img, + result, + score_thr=0.3, + bbox_color=(72, 101, 241), + text_color=(72, 101, 241), + mask_color=None, + thickness=2, + font_size=13, + win_name='', + show=False, + wait_time=0, + out_file=None): + """Draw `result` over `img`. + + Args: + img (str or Tensor): The image to be displayed. + result (dict): The results. + + score_thr (float, optional): Minimum score of bboxes to be shown. + Default: 0.3. + bbox_color (str or tuple(int) or :obj:`Color`):Color of bbox lines. + The tuple of color should be in BGR order. Default: 'green'. + text_color (str or tuple(int) or :obj:`Color`):Color of texts. + The tuple of color should be in BGR order. Default: 'green'. + mask_color (None or str or tuple(int) or :obj:`Color`): + Color of masks. The tuple of color should be in BGR order. + Default: None. + thickness (int): Thickness of lines. Default: 2. + font_size (int): Font size of texts. Default: 13. + win_name (str): The window name. Default: ''. + wait_time (float): Value of waitKey param. + Default: 0. + show (bool): Whether to show the image. + Default: False. + out_file (str or None): The filename to write the image. + Default: None. + + Returns: + img (Tensor): Only if not `show` or `out_file`. + """ + img = mmcv.imread(img) + img = img.copy() + pan_results = result['pan_results'] + # keep objects ahead + ids = np.unique(pan_results)[::-1] + legal_indices = ids != self.num_classes # for VOID label + ids = ids[legal_indices] + labels = np.array([id % INSTANCE_OFFSET for id in ids], dtype=np.int64) + segms = (pan_results[None] == ids[:, None, None]) + + # if out_file specified, do not show image in window + if out_file is not None: + show = False + # draw bounding boxes + img = imshow_det_bboxes( + img, + segms=segms, + labels=labels, + class_names=self.CLASSES, + bbox_color=bbox_color, + text_color=text_color, + mask_color=mask_color, + thickness=thickness, + font_size=font_size, + win_name=win_name, + show=show, + wait_time=wait_time, + out_file=out_file) + + if not (show or out_file): + return img diff --git a/mmdet/models/detectors/point_rend.py b/mmdet/models/detectors/point_rend.py new file mode 100644 index 0000000..90eb4d4 --- /dev/null +++ b/mmdet/models/detectors/point_rend.py @@ -0,0 +1,32 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .two_stage import TwoStageDetector + + +@DETECTORS.register_module() +class PointRend(TwoStageDetector): + """PointRend: Image Segmentation as Rendering + + This detector is the implementation of + `PointRend `_. + + """ + + def __init__(self, + backbone, + rpn_head, + roi_head, + train_cfg, + test_cfg, + neck=None, + pretrained=None, + init_cfg=None): + super(PointRend, self).__init__( + backbone=backbone, + neck=neck, + rpn_head=rpn_head, + roi_head=roi_head, + train_cfg=train_cfg, + test_cfg=test_cfg, + pretrained=pretrained, + init_cfg=init_cfg) diff --git a/mmdet/models/detectors/queryinst.py b/mmdet/models/detectors/queryinst.py new file mode 100644 index 0000000..5fc216c --- /dev/null +++ b/mmdet/models/detectors/queryinst.py @@ -0,0 +1,28 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .sparse_rcnn import SparseRCNN + + +@DETECTORS.register_module() +class QueryInst(SparseRCNN): + r"""Implementation of + `Instances as Queries `_""" + + def __init__(self, + backbone, + rpn_head, + roi_head, + train_cfg, + test_cfg, + neck=None, + pretrained=None, + init_cfg=None): + super(QueryInst, self).__init__( + backbone=backbone, + neck=neck, + rpn_head=rpn_head, + roi_head=roi_head, + train_cfg=train_cfg, + test_cfg=test_cfg, + pretrained=pretrained, + init_cfg=init_cfg) diff --git a/mmdet/models/detectors/reppoints_detector.py b/mmdet/models/detectors/reppoints_detector.py new file mode 100644 index 0000000..f1986cd --- /dev/null +++ b/mmdet/models/detectors/reppoints_detector.py @@ -0,0 +1,24 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .single_stage import SingleStageDetector + + +@DETECTORS.register_module() +class RepPointsDetector(SingleStageDetector): + """RepPoints: Point Set Representation for Object Detection. + + This detector is the implementation of: + - RepPoints detector (https://arxiv.org/pdf/1904.11490) + """ + + def __init__(self, + backbone, + neck, + bbox_head, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + super(RepPointsDetector, + self).__init__(backbone, neck, bbox_head, train_cfg, test_cfg, + pretrained, init_cfg) diff --git a/mmdet/models/detectors/retinanet.py b/mmdet/models/detectors/retinanet.py new file mode 100644 index 0000000..c28545a --- /dev/null +++ b/mmdet/models/detectors/retinanet.py @@ -0,0 +1,19 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .single_stage import SingleStageDetector + + +@DETECTORS.register_module() +class RetinaNet(SingleStageDetector): + """Implementation of `RetinaNet `_""" + + def __init__(self, + backbone, + neck, + bbox_head, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + super(RetinaNet, self).__init__(backbone, neck, bbox_head, train_cfg, + test_cfg, pretrained, init_cfg) diff --git a/mmdet/models/detectors/rpn.py b/mmdet/models/detectors/rpn.py new file mode 100644 index 0000000..707e02b --- /dev/null +++ b/mmdet/models/detectors/rpn.py @@ -0,0 +1,162 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings +from inspect import signature + +import mmcv +import torch +from mmcv.image import tensor2imgs + +from mmdet.core import bbox_mapping +from ..builder import DETECTORS, build_backbone, build_head, build_neck +from .base import BaseDetector + + +@DETECTORS.register_module() +class RPN(BaseDetector): + """Implementation of Region Proposal Network.""" + + def __init__(self, + backbone, + neck, + rpn_head, + train_cfg, + test_cfg, + pretrained=None, + init_cfg=None): + super(RPN, self).__init__(init_cfg) + if pretrained: + warnings.warn('DeprecationWarning: pretrained is deprecated, ' + 'please use "init_cfg" instead') + backbone.pretrained = pretrained + self.backbone = build_backbone(backbone) + self.neck = build_neck(neck) if neck is not None else None + rpn_train_cfg = train_cfg.rpn if train_cfg is not None else None + rpn_head.update(train_cfg=rpn_train_cfg) + rpn_head.update(test_cfg=test_cfg.rpn) + self.rpn_head = build_head(rpn_head) + self.train_cfg = train_cfg + self.test_cfg = test_cfg + + def extract_feat(self, img): + """Extract features. + + Args: + img (torch.Tensor): Image tensor with shape (n, c, h ,w). + + Returns: + list[torch.Tensor]: Multi-level features that may have + different resolutions. + """ + x = self.backbone(img) + if self.with_neck: + x = self.neck(x) + return x + + def forward_dummy(self, img): + """Dummy forward function.""" + x = self.extract_feat(img) + rpn_outs = self.rpn_head(x) + return rpn_outs + + def forward_train(self, + img, + img_metas, + gt_bboxes=None, + gt_bboxes_ignore=None): + """ + Args: + img (Tensor): Input images of shape (N, C, H, W). + Typically these should be mean centered and std scaled. + img_metas (list[dict]): A List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + :class:`mmdet.datasets.pipelines.Collect`. + gt_bboxes (list[Tensor]): Each item are the truth boxes for each + image in [tl_x, tl_y, br_x, br_y] format. + gt_bboxes_ignore (None | list[Tensor]): Specify which bounding + boxes can be ignored when computing the loss. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + if (isinstance(self.train_cfg.rpn, dict) + and self.train_cfg.rpn.get('debug', False)): + self.rpn_head.debug_imgs = tensor2imgs(img) + + x = self.extract_feat(img) + losses = self.rpn_head.forward_train(x, img_metas, gt_bboxes, None, + gt_bboxes_ignore) + return losses + + def simple_test(self, img, img_metas, rescale=False): + """Test function without test time augmentation. + + Args: + imgs (list[torch.Tensor]): List of multiple images + img_metas (list[dict]): List of image information. + rescale (bool, optional): Whether to rescale the results. + Defaults to False. + + Returns: + list[np.ndarray]: proposals + """ + x = self.extract_feat(img) + # get origin input shape to onnx dynamic input shape + if torch.onnx.is_in_onnx_export(): + img_shape = torch._shape_as_tensor(img)[2:] + img_metas[0]['img_shape_for_onnx'] = img_shape + proposal_list = self.rpn_head.simple_test_rpn(x, img_metas) + if rescale: + for proposals, meta in zip(proposal_list, img_metas): + proposals[:, :4] /= proposals.new_tensor(meta['scale_factor']) + if torch.onnx.is_in_onnx_export(): + return proposal_list + + return [proposal.cpu().numpy() for proposal in proposal_list] + + def aug_test(self, imgs, img_metas, rescale=False): + """Test function with test time augmentation. + + Args: + imgs (list[torch.Tensor]): List of multiple images + img_metas (list[dict]): List of image information. + rescale (bool, optional): Whether to rescale the results. + Defaults to False. + + Returns: + list[np.ndarray]: proposals + """ + proposal_list = self.rpn_head.aug_test_rpn( + self.extract_feats(imgs), img_metas) + if not rescale: + for proposals, img_meta in zip(proposal_list, img_metas[0]): + img_shape = img_meta['img_shape'] + scale_factor = img_meta['scale_factor'] + flip = img_meta['flip'] + flip_direction = img_meta['flip_direction'] + proposals[:, :4] = bbox_mapping(proposals[:, :4], img_shape, + scale_factor, flip, + flip_direction) + return [proposal.cpu().numpy() for proposal in proposal_list] + + def show_result(self, data, result, top_k=20, **kwargs): + """Show RPN proposals on the image. + + Args: + data (str or np.ndarray): Image filename or loaded image. + result (Tensor or tuple): The results to draw over `img` + bbox_result or (bbox_result, segm_result). + top_k (int): Plot the first k bboxes only + if set positive. Default: 20 + + Returns: + np.ndarray: The image with bboxes drawn on it. + """ + if kwargs is not None: + kwargs['colors'] = 'green' + sig = signature(mmcv.imshow_bboxes) + for k in list(kwargs.keys()): + if k not in sig.parameters: + kwargs.pop(k) + mmcv.imshow_bboxes(data, result, top_k=top_k, **kwargs) diff --git a/mmdet/models/detectors/scnet.py b/mmdet/models/detectors/scnet.py new file mode 100644 index 0000000..a361d81 --- /dev/null +++ b/mmdet/models/detectors/scnet.py @@ -0,0 +1,11 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .cascade_rcnn import CascadeRCNN + + +@DETECTORS.register_module() +class SCNet(CascadeRCNN): + """Implementation of `SCNet `_""" + + def __init__(self, **kwargs): + super(SCNet, self).__init__(**kwargs) diff --git a/mmdet/models/detectors/single_stage.py b/mmdet/models/detectors/single_stage.py new file mode 100644 index 0000000..62b49d9 --- /dev/null +++ b/mmdet/models/detectors/single_stage.py @@ -0,0 +1,171 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch + +from mmdet.core import bbox2result +from ..builder import DETECTORS, build_backbone, build_head, build_neck +from .base import BaseDetector + + +@DETECTORS.register_module() +class SingleStageDetector(BaseDetector): + """Base class for single-stage detectors. + + Single-stage detectors directly and densely predict bounding boxes on the + output features of the backbone+neck. + """ + + def __init__(self, + backbone, + neck=None, + bbox_head=None, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + super(SingleStageDetector, self).__init__(init_cfg) + if pretrained: + warnings.warn('DeprecationWarning: pretrained is deprecated, ' + 'please use "init_cfg" instead') + backbone.pretrained = pretrained + self.backbone = build_backbone(backbone) + if neck is not None: + self.neck = build_neck(neck) + bbox_head.update(train_cfg=train_cfg) + bbox_head.update(test_cfg=test_cfg) + self.bbox_head = build_head(bbox_head) + self.train_cfg = train_cfg + self.test_cfg = test_cfg + + def extract_feat(self, img): + """Directly extract features from the backbone+neck.""" + x = self.backbone(img) + if self.with_neck: + x = self.neck(x) + return x + + def forward_dummy(self, img): + """Used for computing network flops. + + See `mmdetection/tools/analysis_tools/get_flops.py` + """ + x = self.extract_feat(img) + outs = self.bbox_head(x) + return outs + + def forward_train(self, # TODO 感觉还是可行的,需要看一下trace那边怎么传proxy + img, + img_metas, + gt_bboxes, + gt_labels, + gt_bboxes_ignore=None): + """ + Args: + img (Tensor): Input images of shape (N, C, H, W). + Typically these should be mean centered and std scaled. + img_metas (list[dict]): A List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + :class:`mmdet.datasets.pipelines.Collect`. + gt_bboxes (list[Tensor]): Each item are the truth boxes for each + image in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): Class indices corresponding to each box + gt_bboxes_ignore (None | list[Tensor]): Specify which bounding + boxes can be ignored when computing the loss. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + super(SingleStageDetector, self).forward_train(img, img_metas) + x = self.extract_feat(img) + losses = self.bbox_head.forward_train(x, img_metas, gt_bboxes, + gt_labels, gt_bboxes_ignore) + return losses + + def simple_test(self, img, img_metas, rescale=False): + """Test function without test-time augmentation. + + Args: + img (torch.Tensor): Images with shape (N, C, H, W). + img_metas (list[dict]): List of image information. + rescale (bool, optional): Whether to rescale the results. + Defaults to False. + + Returns: + list[list[np.ndarray]]: BBox results of each image and classes. + The outer list corresponds to each image. The inner list + corresponds to each class. + """ + feat = self.extract_feat(img) + results_list = self.bbox_head.simple_test( + feat, img_metas, rescale=rescale) + bbox_results = [ + bbox2result(det_bboxes, det_labels, self.bbox_head.num_classes) + for det_bboxes, det_labels in results_list + ] + return bbox_results + + def aug_test(self, imgs, img_metas, rescale=False): + """Test function with test time augmentation. + + Args: + imgs (list[Tensor]): the outer list indicates test-time + augmentations and inner Tensor should have a shape NxCxHxW, + which contains all images in the batch. + img_metas (list[list[dict]]): the outer list indicates test-time + augs (multiscale, flip, etc.) and the inner list indicates + images in a batch. each dict has image information. + rescale (bool, optional): Whether to rescale the results. + Defaults to False. + + Returns: + list[list[np.ndarray]]: BBox results of each image and classes. + The outer list corresponds to each image. The inner list + corresponds to each class. + """ + assert hasattr(self.bbox_head, 'aug_test'), \ + f'{self.bbox_head.__class__.__name__}' \ + ' does not support test-time augmentation' + + feats = self.extract_feats(imgs) + results_list = self.bbox_head.aug_test( + feats, img_metas, rescale=rescale) + bbox_results = [ + bbox2result(det_bboxes, det_labels, self.bbox_head.num_classes) + for det_bboxes, det_labels in results_list + ] + return bbox_results + + def onnx_export(self, img, img_metas, with_nms=True): + """Test function without test time augmentation. + + Args: + img (torch.Tensor): input images. + img_metas (list[dict]): List of image information. + + Returns: + tuple[Tensor, Tensor]: dets of shape [N, num_det, 5] + and class labels of shape [N, num_det]. + """ + x = self.extract_feat(img) + outs = self.bbox_head(x) + # get origin input shape to support onnx dynamic shape + + # get shape as tensor + img_shape = torch._shape_as_tensor(img)[2:] + img_metas[0]['img_shape_for_onnx'] = img_shape + # get pad input shape to support onnx dynamic shape for exporting + # `CornerNet` and `CentripetalNet`, which 'pad_shape' is used + # for inference + img_metas[0]['pad_shape_for_onnx'] = img_shape + + if len(outs) == 2: + # add dummy score_factor + outs = (*outs, None) + # TODO Can we change to `get_bboxes` when `onnx_export` fail + det_bboxes, det_labels = self.bbox_head.onnx_export( + *outs, img_metas, with_nms=with_nms) + + return det_bboxes, det_labels diff --git a/mmdet/models/detectors/single_stage_instance_seg.py b/mmdet/models/detectors/single_stage_instance_seg.py new file mode 100644 index 0000000..239b669 --- /dev/null +++ b/mmdet/models/detectors/single_stage_instance_seg.py @@ -0,0 +1,363 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy +import warnings + +import mmcv +import numpy as np +import torch + +from mmdet.core.visualization.image import imshow_det_bboxes +from ..builder import DETECTORS, build_backbone, build_head, build_neck +from .base import BaseDetector + +INF = 1e8 + + +@DETECTORS.register_module() +class SingleStageInstanceSegmentor(BaseDetector): + """Base class for single-stage instance segmentors.""" + + def __init__(self, + backbone, + neck=None, + bbox_head=None, + mask_head=None, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + + if pretrained: + warnings.warn('DeprecationWarning: pretrained is deprecated, ' + 'please use "init_cfg" instead') + backbone.pretrained = pretrained + super(SingleStageInstanceSegmentor, self).__init__(init_cfg=init_cfg) + self.backbone = build_backbone(backbone) + if neck is not None: + self.neck = build_neck(neck) + else: + self.neck = None + if bbox_head is not None: + bbox_head.update(train_cfg=copy.deepcopy(train_cfg)) + bbox_head.update(test_cfg=copy.deepcopy(test_cfg)) + self.bbox_head = build_head(bbox_head) + else: + self.bbox_head = None + + assert mask_head, f'`mask_head` must ' \ + f'be implemented in {self.__class__.__name__}' + mask_head.update(train_cfg=copy.deepcopy(train_cfg)) + mask_head.update(test_cfg=copy.deepcopy(test_cfg)) + self.mask_head = build_head(mask_head) + + self.train_cfg = train_cfg + self.test_cfg = test_cfg + + def extract_feat(self, img): + """Directly extract features from the backbone and neck.""" + x = self.backbone(img) + if self.with_neck: + x = self.neck(x) + return x + + def forward_dummy(self, img): + """Used for computing network flops. + + See `mmdetection/tools/analysis_tools/get_flops.py` + """ + raise NotImplementedError( + f'`forward_dummy` is not implemented in {self.__class__.__name__}') + + def forward_train(self, + img, + img_metas, + gt_masks, + gt_labels, + gt_bboxes=None, + gt_bboxes_ignore=None, + **kwargs): + """ + Args: + img (Tensor): Input images of shape (B, C, H, W). + Typically these should be mean centered and std scaled. + img_metas (list[dict]): A List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + :class:`mmdet.datasets.pipelines.Collect`. + gt_masks (list[:obj:`BitmapMasks`] | None) : The segmentation + masks for each box. + gt_labels (list[Tensor]): Class indices corresponding to each box + gt_bboxes (list[Tensor]): Each item is the truth boxes + of each image in [tl_x, tl_y, br_x, br_y] format. + Default: None. + gt_bboxes_ignore (list[Tensor] | None): Specify which bounding + boxes can be ignored when computing the loss. + + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + + gt_masks = [ + gt_mask.to_tensor(dtype=torch.bool, device=img.device) + for gt_mask in gt_masks + ] + x = self.extract_feat(img) + losses = dict() + + # CondInst and YOLACT have bbox_head + if self.bbox_head: + # bbox_head_preds is a tuple + bbox_head_preds = self.bbox_head(x) + # positive_infos is a list of obj:`InstanceData` + # It contains the information about the positive samples + # CondInst, YOLACT + det_losses, positive_infos = self.bbox_head.loss( + *bbox_head_preds, + gt_bboxes=gt_bboxes, + gt_labels=gt_labels, + gt_masks=gt_masks, + img_metas=img_metas, + gt_bboxes_ignore=gt_bboxes_ignore, + **kwargs) + losses.update(det_losses) + else: + positive_infos = None + + mask_loss = self.mask_head.forward_train( + x, + gt_labels, + gt_masks, + img_metas, + positive_infos=positive_infos, + gt_bboxes=gt_bboxes, + gt_bboxes_ignore=gt_bboxes_ignore, + **kwargs) + # avoid loss override + assert not set(mask_loss.keys()) & set(losses.keys()) + + losses.update(mask_loss) + return losses + + def simple_test(self, img, img_metas, rescale=False): + """Test function without test-time augmentation. + + Args: + img (torch.Tensor): Images with shape (B, C, H, W). + img_metas (list[dict]): List of image information. + rescale (bool, optional): Whether to rescale the results. + Defaults to False. + + Returns: + list(tuple): Formatted bbox and mask results of multiple \ + images. The outer list corresponds to each image. \ + Each tuple contains two type of results of single image: + + - bbox_results (list[np.ndarray]): BBox results of + single image. The list corresponds to each class. + each ndarray has a shape (N, 5), N is the number of + bboxes with this category, and last dimension + 5 arrange as (x1, y1, x2, y2, scores). + - mask_results (list[np.ndarray]): Mask results of + single image. The list corresponds to each class. + each ndarray has a shape (N, img_h, img_w), N + is the number of masks with this category. + """ + feat = self.extract_feat(img) + if self.bbox_head: + outs = self.bbox_head(feat) + # results_list is list[obj:`InstanceData`] + results_list = self.bbox_head.get_results( + *outs, img_metas=img_metas, cfg=self.test_cfg, rescale=rescale) + else: + results_list = None + + results_list = self.mask_head.simple_test( + feat, img_metas, rescale=rescale, instances_list=results_list) + + format_results_list = [] + for results in results_list: + format_results_list.append(self.format_results(results)) + + return format_results_list + + def format_results(self, results): + """Format the model predictions according to the interface with + dataset. + + Args: + results (:obj:`InstanceData`): Processed + results of single images. Usually contains + following keys. + + - scores (Tensor): Classification scores, has shape + (num_instance,) + - labels (Tensor): Has shape (num_instances,). + - masks (Tensor): Processed mask results, has + shape (num_instances, h, w). + + Returns: + tuple: Formatted bbox and mask results.. It contains two items: + + - bbox_results (list[np.ndarray]): BBox results of + single image. The list corresponds to each class. + each ndarray has a shape (N, 5), N is the number of + bboxes with this category, and last dimension + 5 arrange as (x1, y1, x2, y2, scores). + - mask_results (list[np.ndarray]): Mask results of + single image. The list corresponds to each class. + each ndarray has shape (N, img_h, img_w), N + is the number of masks with this category. + """ + data_keys = results.keys() + assert 'scores' in data_keys + assert 'labels' in data_keys + + assert 'masks' in data_keys, \ + 'results should contain ' \ + 'masks when format the results ' + mask_results = [[] for _ in range(self.mask_head.num_classes)] + + num_masks = len(results) + + if num_masks == 0: + bbox_results = [ + np.zeros((0, 5), dtype=np.float32) + for _ in range(self.mask_head.num_classes) + ] + return bbox_results, mask_results + + labels = results.labels.detach().cpu().numpy() + + if 'bboxes' not in results: + # create dummy bbox results to store the scores + results.bboxes = results.scores.new_zeros(len(results), 4) + + det_bboxes = torch.cat([results.bboxes, results.scores[:, None]], + dim=-1) + det_bboxes = det_bboxes.detach().cpu().numpy() + bbox_results = [ + det_bboxes[labels == i, :] + for i in range(self.mask_head.num_classes) + ] + + masks = results.masks.detach().cpu().numpy() + + for idx in range(num_masks): + mask = masks[idx] + mask_results[labels[idx]].append(mask) + + return bbox_results, mask_results + + def aug_test(self, imgs, img_metas, rescale=False): + raise NotImplementedError + + def show_result(self, + img, + result, + score_thr=0.3, + bbox_color=(72, 101, 241), + text_color=(72, 101, 241), + mask_color=None, + thickness=2, + font_size=13, + win_name='', + show=False, + wait_time=0, + out_file=None): + """Draw `result` over `img`. + + Args: + img (str or Tensor): The image to be displayed. + result (tuple): Format bbox and mask results. + It contains two items: + + - bbox_results (list[np.ndarray]): BBox results of + single image. The list corresponds to each class. + each ndarray has a shape (N, 5), N is the number of + bboxes with this category, and last dimension + 5 arrange as (x1, y1, x2, y2, scores). + - mask_results (list[np.ndarray]): Mask results of + single image. The list corresponds to each class. + each ndarray has shape (N, img_h, img_w), N + is the number of masks with this category. + + score_thr (float, optional): Minimum score of bboxes to be shown. + Default: 0.3. + bbox_color (str or tuple(int) or :obj:`Color`):Color of bbox lines. + The tuple of color should be in BGR order. Default: 'green' + text_color (str or tuple(int) or :obj:`Color`):Color of texts. + The tuple of color should be in BGR order. Default: 'green' + mask_color (None or str or tuple(int) or :obj:`Color`): + Color of masks. The tuple of color should be in BGR order. + Default: None + thickness (int): Thickness of lines. Default: 2 + font_size (int): Font size of texts. Default: 13 + win_name (str): The window name. Default: '' + wait_time (float): Value of waitKey param. + Default: 0. + show (bool): Whether to show the image. + Default: False. + out_file (str or None): The filename to write the image. + Default: None. + + Returns: + img (Tensor): Only if not `show` or `out_file` + """ + + assert isinstance(result, tuple) + bbox_result, mask_result = result + bboxes = np.vstack(bbox_result) + img = mmcv.imread(img) + img = img.copy() + labels = [ + np.full(bbox.shape[0], i, dtype=np.int32) + for i, bbox in enumerate(bbox_result) + ] + labels = np.concatenate(labels) + if len(labels) == 0: + bboxes = np.zeros([0, 5]) + masks = np.zeros([0, 0, 0]) + # draw segmentation masks + else: + masks = mmcv.concat_list(mask_result) + + if isinstance(masks[0], torch.Tensor): + masks = torch.stack(masks, dim=0).detach().cpu().numpy() + else: + masks = np.stack(masks, axis=0) + # dummy bboxes + if bboxes[:, :4].sum() == 0: + num_masks = len(bboxes) + x_any = masks.any(axis=1) + y_any = masks.any(axis=2) + for idx in range(num_masks): + x = np.where(x_any[idx, :])[0] + y = np.where(y_any[idx, :])[0] + if len(x) > 0 and len(y) > 0: + bboxes[idx, :4] = np.array( + [x[0], y[0], x[-1] + 1, y[-1] + 1], + dtype=np.float32) + # if out_file specified, do not show image in window + if out_file is not None: + show = False + # draw bounding boxes + img = imshow_det_bboxes( + img, + bboxes, + labels, + masks, + class_names=self.CLASSES, + score_thr=score_thr, + bbox_color=bbox_color, + text_color=text_color, + mask_color=mask_color, + thickness=thickness, + font_size=font_size, + win_name=win_name, + show=show, + wait_time=wait_time, + out_file=out_file) + + if not (show or out_file): + return img diff --git a/mmdet/models/detectors/solo.py b/mmdet/models/detectors/solo.py new file mode 100644 index 0000000..df6f6de --- /dev/null +++ b/mmdet/models/detectors/solo.py @@ -0,0 +1,30 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .single_stage_instance_seg import SingleStageInstanceSegmentor + + +@DETECTORS.register_module() +class SOLO(SingleStageInstanceSegmentor): + """`SOLO: Segmenting Objects by Locations + `_ + + """ + + def __init__(self, + backbone, + neck=None, + bbox_head=None, + mask_head=None, + train_cfg=None, + test_cfg=None, + init_cfg=None, + pretrained=None): + super().__init__( + backbone=backbone, + neck=neck, + bbox_head=bbox_head, + mask_head=mask_head, + train_cfg=train_cfg, + test_cfg=test_cfg, + init_cfg=init_cfg, + pretrained=pretrained) diff --git a/mmdet/models/detectors/solov2.py b/mmdet/models/detectors/solov2.py new file mode 100644 index 0000000..711fcb4 --- /dev/null +++ b/mmdet/models/detectors/solov2.py @@ -0,0 +1,30 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .single_stage_instance_seg import SingleStageInstanceSegmentor + + +@DETECTORS.register_module() +class SOLOv2(SingleStageInstanceSegmentor): + """`SOLOv2: Dynamic and Fast Instance Segmentation + `_ + + """ + + def __init__(self, + backbone, + neck=None, + bbox_head=None, + mask_head=None, + train_cfg=None, + test_cfg=None, + init_cfg=None, + pretrained=None): + super().__init__( + backbone=backbone, + neck=neck, + bbox_head=bbox_head, + mask_head=mask_head, + train_cfg=train_cfg, + test_cfg=test_cfg, + init_cfg=init_cfg, + pretrained=pretrained) diff --git a/mmdet/models/detectors/sparse_rcnn.py b/mmdet/models/detectors/sparse_rcnn.py new file mode 100644 index 0000000..e90c2a5 --- /dev/null +++ b/mmdet/models/detectors/sparse_rcnn.py @@ -0,0 +1,111 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .two_stage import TwoStageDetector + + +@DETECTORS.register_module() +class SparseRCNN(TwoStageDetector): + r"""Implementation of `Sparse R-CNN: End-to-End Object Detection with + Learnable Proposals `_""" + + def __init__(self, *args, **kwargs): + super(SparseRCNN, self).__init__(*args, **kwargs) + assert self.with_rpn, 'Sparse R-CNN and QueryInst ' \ + 'do not support external proposals' + + def forward_train(self, + img, + img_metas, + gt_bboxes, + gt_labels, + gt_bboxes_ignore=None, + gt_masks=None, + proposals=None, + **kwargs): + """Forward function of SparseR-CNN and QueryInst in train stage. + + Args: + img (Tensor): of shape (N, C, H, W) encoding input images. + Typically these should be mean centered and std scaled. + img_metas (list[dict]): list of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + :class:`mmdet.datasets.pipelines.Collect`. + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + gt_bboxes_ignore (None | list[Tensor): specify which bounding + boxes can be ignored when computing the loss. + gt_masks (List[Tensor], optional) : Segmentation masks for + each box. This is required to train QueryInst. + proposals (List[Tensor], optional): override rpn proposals with + custom proposals. Use when `with_rpn` is False. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + + assert proposals is None, 'Sparse R-CNN and QueryInst ' \ + 'do not support external proposals' + + x = self.extract_feat(img) + proposal_boxes, proposal_features, imgs_whwh = \ + self.rpn_head.forward_train(x, img_metas) + roi_losses = self.roi_head.forward_train( + x, + proposal_boxes, + proposal_features, + img_metas, + gt_bboxes, + gt_labels, + gt_bboxes_ignore=gt_bboxes_ignore, + gt_masks=gt_masks, + imgs_whwh=imgs_whwh) + return roi_losses + + def simple_test(self, img, img_metas, rescale=False): + """Test function without test time augmentation. + + Args: + imgs (list[torch.Tensor]): List of multiple images + img_metas (list[dict]): List of image information. + rescale (bool): Whether to rescale the results. + Defaults to False. + + Returns: + list[list[np.ndarray]]: BBox results of each image and classes. + The outer list corresponds to each image. The inner list + corresponds to each class. + """ + x = self.extract_feat(img) + proposal_boxes, proposal_features, imgs_whwh = \ + self.rpn_head.simple_test_rpn(x, img_metas) + results = self.roi_head.simple_test( + x, + proposal_boxes, + proposal_features, + img_metas, + imgs_whwh=imgs_whwh, + rescale=rescale) + return results + + def forward_dummy(self, img): + """Used for computing network flops. + + See `mmdetection/tools/analysis_tools/get_flops.py` + """ + # backbone + x = self.extract_feat(img) + # rpn + num_imgs = len(img) + dummy_img_metas = [ + dict(img_shape=(800, 1333, 3)) for _ in range(num_imgs) + ] + proposal_boxes, proposal_features, imgs_whwh = \ + self.rpn_head.simple_test_rpn(x, dummy_img_metas) + # roi_head + roi_outs = self.roi_head.forward_dummy(x, proposal_boxes, + proposal_features, + dummy_img_metas) + return roi_outs diff --git a/mmdet/models/detectors/tood.py b/mmdet/models/detectors/tood.py new file mode 100644 index 0000000..7dd18c3 --- /dev/null +++ b/mmdet/models/detectors/tood.py @@ -0,0 +1,23 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .single_stage import SingleStageDetector + + +@DETECTORS.register_module() +class TOOD(SingleStageDetector): + r"""Implementation of `TOOD: Task-aligned One-stage Object Detection. + `_.""" + + def __init__(self, + backbone, + neck, + bbox_head, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + super(TOOD, self).__init__(backbone, neck, bbox_head, train_cfg, + test_cfg, pretrained, init_cfg) + + def set_epoch(self, epoch): + self.bbox_head.epoch = epoch diff --git a/mmdet/models/detectors/trident_faster_rcnn.py b/mmdet/models/detectors/trident_faster_rcnn.py new file mode 100644 index 0000000..fb26168 --- /dev/null +++ b/mmdet/models/detectors/trident_faster_rcnn.py @@ -0,0 +1,70 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .faster_rcnn import FasterRCNN + + +@DETECTORS.register_module() +class TridentFasterRCNN(FasterRCNN): + """Implementation of `TridentNet `_""" + + def __init__(self, + backbone, + rpn_head, + roi_head, + train_cfg, + test_cfg, + neck=None, + pretrained=None, + init_cfg=None): + + super(TridentFasterRCNN, self).__init__( + backbone=backbone, + neck=neck, + rpn_head=rpn_head, + roi_head=roi_head, + train_cfg=train_cfg, + test_cfg=test_cfg, + pretrained=pretrained, + init_cfg=init_cfg) + assert self.backbone.num_branch == self.roi_head.num_branch + assert self.backbone.test_branch_idx == self.roi_head.test_branch_idx + self.num_branch = self.backbone.num_branch + self.test_branch_idx = self.backbone.test_branch_idx + + def simple_test(self, img, img_metas, proposals=None, rescale=False): + """Test without augmentation.""" + assert self.with_bbox, 'Bbox head must be implemented.' + x = self.extract_feat(img) + if proposals is None: + num_branch = (self.num_branch if self.test_branch_idx == -1 else 1) + trident_img_metas = img_metas * num_branch + proposal_list = self.rpn_head.simple_test_rpn(x, trident_img_metas) + else: + proposal_list = proposals + # TODO: Fix trident_img_metas undefined errors + # when proposals is specified + return self.roi_head.simple_test( + x, proposal_list, trident_img_metas, rescale=rescale) + + def aug_test(self, imgs, img_metas, rescale=False): + """Test with augmentations. + + If rescale is False, then returned bboxes and masks will fit the scale + of imgs[0]. + """ + x = self.extract_feats(imgs) + num_branch = (self.num_branch if self.test_branch_idx == -1 else 1) + trident_img_metas = [img_metas * num_branch for img_metas in img_metas] + proposal_list = self.rpn_head.aug_test_rpn(x, trident_img_metas) + return self.roi_head.aug_test( + x, proposal_list, img_metas, rescale=rescale) + + def forward_train(self, img, img_metas, gt_bboxes, gt_labels, **kwargs): + """make copies of img and gts to fit multi-branch.""" + trident_gt_bboxes = tuple(gt_bboxes * self.num_branch) + trident_gt_labels = tuple(gt_labels * self.num_branch) + trident_img_metas = tuple(img_metas * self.num_branch) + + return super(TridentFasterRCNN, + self).forward_train(img, trident_img_metas, + trident_gt_bboxes, trident_gt_labels) diff --git a/mmdet/models/detectors/two_stage.py b/mmdet/models/detectors/two_stage.py new file mode 100644 index 0000000..ebc748f --- /dev/null +++ b/mmdet/models/detectors/two_stage.py @@ -0,0 +1,213 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch + +from ..builder import DETECTORS, build_backbone, build_head, build_neck +from .base import BaseDetector + + +@DETECTORS.register_module() +class TwoStageDetector(BaseDetector): + """Base class for two-stage detectors. + + Two-stage detectors typically consisting of a region proposal network and a + task-specific regression head. + """ + + def __init__(self, + backbone, + neck=None, + rpn_head=None, + roi_head=None, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + super(TwoStageDetector, self).__init__(init_cfg) + if pretrained: + warnings.warn('DeprecationWarning: pretrained is deprecated, ' + 'please use "init_cfg" instead') + backbone.pretrained = pretrained + self.backbone = build_backbone(backbone) + + if neck is not None: + self.neck = build_neck(neck) + + if rpn_head is not None: + rpn_train_cfg = train_cfg.rpn if train_cfg is not None else None + rpn_head_ = rpn_head.copy() + rpn_head_.update(train_cfg=rpn_train_cfg, test_cfg=test_cfg.rpn) + self.rpn_head = build_head(rpn_head_) + + if roi_head is not None: + # update train and test cfg here for now + # TODO: refactor assigner & sampler + rcnn_train_cfg = train_cfg.rcnn if train_cfg is not None else None + roi_head.update(train_cfg=rcnn_train_cfg) + roi_head.update(test_cfg=test_cfg.rcnn) + roi_head.pretrained = pretrained + self.roi_head = build_head(roi_head) + + self.train_cfg = train_cfg + self.test_cfg = test_cfg + + @property + def with_rpn(self): + """bool: whether the detector has RPN""" + return hasattr(self, 'rpn_head') and self.rpn_head is not None + + @property + def with_roi_head(self): + """bool: whether the detector has a RoI head""" + return hasattr(self, 'roi_head') and self.roi_head is not None + + def extract_feat(self, img): + """Directly extract features from the backbone+neck.""" + x = self.backbone(img) + if self.with_neck: + x = self.neck(x) + return x + + def forward_dummy(self, img): + """Used for computing network flops. + + See `mmdetection/tools/analysis_tools/get_flops.py` + """ + outs = () + # backbone + x = self.extract_feat(img) + # rpn + if self.with_rpn: + rpn_outs = self.rpn_head(x) + outs = outs + (rpn_outs, ) + proposals = torch.randn(1000, 4).to(img.device) + # roi_head + roi_outs = self.roi_head.forward_dummy(x, proposals) + outs = outs + (roi_outs, ) + return outs + + def forward_train(self, + img, + img_metas, + gt_bboxes, + gt_labels, + gt_bboxes_ignore=None, + gt_masks=None, + proposals=None, + **kwargs): + """ + Args: + img (Tensor): of shape (N, C, H, W) encoding input images. + Typically these should be mean centered and std scaled. + + img_metas (list[dict]): list of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmdet/datasets/pipelines/formatting.py:Collect`. + + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + + gt_labels (list[Tensor]): class indices corresponding to each box + + gt_bboxes_ignore (None | list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. + + gt_masks (None | Tensor) : true segmentation masks for each box + used if the architecture supports a segmentation task. + + proposals : override rpn proposals with custom proposals. Use when + `with_rpn` is False. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + x = self.extract_feat(img) + + losses = dict() + + # RPN forward and loss + if self.with_rpn: + proposal_cfg = self.train_cfg.get('rpn_proposal', + self.test_cfg.rpn) + rpn_losses, proposal_list = self.rpn_head.forward_train( + x, + img_metas, + gt_bboxes, + gt_labels=None, + gt_bboxes_ignore=gt_bboxes_ignore, + proposal_cfg=proposal_cfg, + **kwargs) + rpn_losses = dict( + loss_rpn_cls=rpn_losses['loss_cls'], loss_rpn_bbox=rpn_losses['loss_bbox']) + losses.update(rpn_losses) + else: + proposal_list = proposals + + roi_losses = self.roi_head.forward_train(x, img_metas, proposal_list, + gt_bboxes, gt_labels, + gt_bboxes_ignore, gt_masks, + **kwargs) + losses.update(roi_losses) + + return losses + + async def async_simple_test(self, + img, + img_meta, + proposals=None, + rescale=False): + """Async test without augmentation.""" + assert self.with_bbox, 'Bbox head must be implemented.' + x = self.extract_feat(img) + + if proposals is None: + proposal_list = await self.rpn_head.async_simple_test_rpn( + x, img_meta) + else: + proposal_list = proposals + + return await self.roi_head.async_simple_test( + x, proposal_list, img_meta, rescale=rescale) + + def simple_test(self, img, img_metas, proposals=None, rescale=False): + """Test without augmentation.""" + + assert self.with_bbox, 'Bbox head must be implemented.' + x = self.extract_feat(img) + if proposals is None: + proposal_list = self.rpn_head.simple_test_rpn(x, img_metas) + else: + proposal_list = proposals + + return self.roi_head.simple_test( + x, proposal_list, img_metas, rescale=rescale) + + def aug_test(self, imgs, img_metas, rescale=False): + """Test with augmentations. + + If rescale is False, then returned bboxes and masks will fit the scale + of imgs[0]. + """ + x = self.extract_feats(imgs) + proposal_list = self.rpn_head.aug_test_rpn(x, img_metas) + return self.roi_head.aug_test( + x, proposal_list, img_metas, rescale=rescale) + + def onnx_export(self, img, img_metas): + + img_shape = torch._shape_as_tensor(img)[2:] + img_metas[0]['img_shape_for_onnx'] = img_shape + x = self.extract_feat(img) + proposals = self.rpn_head.onnx_export(x, img_metas) + if hasattr(self.roi_head, 'onnx_export'): + return self.roi_head.onnx_export(x, proposals, img_metas) + else: + raise NotImplementedError( + f'{self.__class__.__name__} can not ' + f'be exported to ONNX. Please refer to the ' + f'list of supported models,' + f'https://mmdetection.readthedocs.io/en/latest/tutorials/pytorch2onnx.html#list-of-supported-models-exportable-to-onnx' # noqa E501 + ) diff --git a/mmdet/models/detectors/vfnet.py b/mmdet/models/detectors/vfnet.py new file mode 100644 index 0000000..38ddcda --- /dev/null +++ b/mmdet/models/detectors/vfnet.py @@ -0,0 +1,20 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .single_stage import SingleStageDetector + + +@DETECTORS.register_module() +class VFNet(SingleStageDetector): + """Implementation of `VarifocalNet + (VFNet).`_""" + + def __init__(self, + backbone, + neck, + bbox_head, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + super(VFNet, self).__init__(backbone, neck, bbox_head, train_cfg, + test_cfg, pretrained, init_cfg) diff --git a/mmdet/models/detectors/yolact.py b/mmdet/models/detectors/yolact.py new file mode 100644 index 0000000..4ddea0b --- /dev/null +++ b/mmdet/models/detectors/yolact.py @@ -0,0 +1,120 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from mmdet.core import bbox2result +from ..builder import DETECTORS, build_head +from .single_stage import SingleStageDetector + + +@DETECTORS.register_module() +class YOLACT(SingleStageDetector): + """Implementation of `YOLACT `_""" + + def __init__(self, + backbone, + neck, + bbox_head, + segm_head, + mask_head, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + super(YOLACT, self).__init__(backbone, neck, bbox_head, train_cfg, + test_cfg, pretrained, init_cfg) + self.segm_head = build_head(segm_head) + self.mask_head = build_head(mask_head) + + def forward_dummy(self, img): + """Used for computing network flops. + + See `mmdetection/tools/analysis_tools/get_flops.py` + """ + feat = self.extract_feat(img) + bbox_outs = self.bbox_head(feat) + prototypes = self.mask_head.forward_dummy(feat[0]) + return (bbox_outs, prototypes) + + def forward_train(self, + img, + img_metas, + gt_bboxes, + gt_labels, + gt_bboxes_ignore=None, + gt_masks=None): + """ + Args: + img (Tensor): of shape (N, C, H, W) encoding input images. + Typically these should be mean centered and std scaled. + img_metas (list[dict]): list of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmdet/datasets/pipelines/formatting.py:Collect`. + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + gt_bboxes_ignore (None | list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. + gt_masks (None | Tensor) : true segmentation masks for each box + used if the architecture supports a segmentation task. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + # convert Bitmap mask or Polygon Mask to Tensor here + gt_masks = [ + gt_mask.to_tensor(dtype=torch.uint8, device=img.device) + for gt_mask in gt_masks + ] + + x = self.extract_feat(img) + + cls_score, bbox_pred, coeff_pred = self.bbox_head(x) + bbox_head_loss_inputs = (cls_score, bbox_pred) + (gt_bboxes, gt_labels, + img_metas) + losses, sampling_results = self.bbox_head.loss( + *bbox_head_loss_inputs, gt_bboxes_ignore=gt_bboxes_ignore) + + segm_head_outs = self.segm_head(x[0]) + loss_segm = self.segm_head.loss(segm_head_outs, gt_masks, gt_labels) + losses.update(loss_segm) + + mask_pred = self.mask_head(x[0], coeff_pred, gt_bboxes, img_metas, + sampling_results) + loss_mask = self.mask_head.loss(mask_pred, gt_masks, gt_bboxes, + img_metas, sampling_results) + losses.update(loss_mask) + + # check NaN and Inf + for loss_name in losses.keys(): + assert torch.isfinite(torch.stack(losses[loss_name]))\ + .all().item(), '{} becomes infinite or NaN!'\ + .format(loss_name) + + return losses + + def simple_test(self, img, img_metas, rescale=False): + """Test function without test-time augmentation.""" + feat = self.extract_feat(img) + det_bboxes, det_labels, det_coeffs = self.bbox_head.simple_test( + feat, img_metas, rescale=rescale) + bbox_results = [ + bbox2result(det_bbox, det_label, self.bbox_head.num_classes) + for det_bbox, det_label in zip(det_bboxes, det_labels) + ] + + segm_results = self.mask_head.simple_test( + feat, + det_bboxes, + det_labels, + det_coeffs, + img_metas, + rescale=rescale) + + return list(zip(bbox_results, segm_results)) + + def aug_test(self, imgs, img_metas, rescale=False): + """Test with augmentations.""" + raise NotImplementedError( + 'YOLACT does not support test-time augmentation') diff --git a/mmdet/models/detectors/yolo.py b/mmdet/models/detectors/yolo.py new file mode 100644 index 0000000..0ccd417 --- /dev/null +++ b/mmdet/models/detectors/yolo.py @@ -0,0 +1,42 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# Copyright (c) 2019 Western Digital Corporation or its affiliates. +import torch + +from ..builder import DETECTORS +from .single_stage import SingleStageDetector + + +@DETECTORS.register_module() +class YOLOV3(SingleStageDetector): + + def __init__(self, + backbone, + neck, + bbox_head, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + super(YOLOV3, self).__init__(backbone, neck, bbox_head, train_cfg, + test_cfg, pretrained, init_cfg) + + def onnx_export(self, img, img_metas): + """Test function for exporting to ONNX, without test time augmentation. + + Args: + img (torch.Tensor): input images. + img_metas (list[dict]): List of image information. + + Returns: + tuple[Tensor, Tensor]: dets of shape [N, num_det, 5] + and class labels of shape [N, num_det]. + """ + x = self.extract_feat(img) + outs = self.bbox_head.forward(x) + # get shape as tensor + img_shape = torch._shape_as_tensor(img)[2:] + img_metas[0]['img_shape_for_onnx'] = img_shape + + det_bboxes, det_labels = self.bbox_head.onnx_export(*outs, img_metas) + + return det_bboxes, det_labels diff --git a/mmdet/models/detectors/yolof.py b/mmdet/models/detectors/yolof.py new file mode 100644 index 0000000..2bc4f1a --- /dev/null +++ b/mmdet/models/detectors/yolof.py @@ -0,0 +1,20 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import DETECTORS +from .single_stage import SingleStageDetector + + +@DETECTORS.register_module() +class YOLOF(SingleStageDetector): + r"""Implementation of `You Only Look One-level Feature + `_""" + + def __init__(self, + backbone, + neck, + bbox_head, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + super(YOLOF, self).__init__(backbone, neck, bbox_head, train_cfg, + test_cfg, pretrained, init_cfg) diff --git a/mmdet/models/detectors/yolox.py b/mmdet/models/detectors/yolox.py new file mode 100644 index 0000000..34d51b1 --- /dev/null +++ b/mmdet/models/detectors/yolox.py @@ -0,0 +1,136 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import random + +import torch +import torch.distributed as dist +import torch.nn.functional as F +from mmcv.runner import get_dist_info + +from ...utils import log_img_scale +from ..builder import DETECTORS +from .single_stage import SingleStageDetector + + +@DETECTORS.register_module() +class YOLOX(SingleStageDetector): + r"""Implementation of `YOLOX: Exceeding YOLO Series in 2021 + `_ + + Note: Considering the trade-off between training speed and accuracy, + multi-scale training is temporarily kept. More elegant implementation + will be adopted in the future. + + Args: + backbone (nn.Module): The backbone module. + neck (nn.Module): The neck module. + bbox_head (nn.Module): The bbox head module. + train_cfg (obj:`ConfigDict`, optional): The training config + of YOLOX. Default: None. + test_cfg (obj:`ConfigDict`, optional): The testing config + of YOLOX. Default: None. + pretrained (str, optional): model pretrained path. + Default: None. + input_size (tuple): The model default input image size. The shape + order should be (height, width). Default: (640, 640). + size_multiplier (int): Image size multiplication factor. + Default: 32. + random_size_range (tuple): The multi-scale random range during + multi-scale training. The real training image size will + be multiplied by size_multiplier. Default: (15, 25). + random_size_interval (int): The iter interval of change + image size. Default: 10. + init_cfg (dict, optional): Initialization config dict. + Default: None. + """ + + def __init__(self, + backbone, + neck, + bbox_head, + train_cfg=None, + test_cfg=None, + pretrained=None, + input_size=(640, 640), + size_multiplier=32, + random_size_range=(15, 25), + random_size_interval=10, + init_cfg=None): + super(YOLOX, self).__init__(backbone, neck, bbox_head, train_cfg, + test_cfg, pretrained, init_cfg) + log_img_scale(input_size, skip_square=True) + self.rank, self.world_size = get_dist_info() + self._default_input_size = input_size + self._input_size = input_size + self._random_size_range = random_size_range + self._random_size_interval = random_size_interval + self._size_multiplier = size_multiplier + self._progress_in_iter = 0 + + def forward_train(self, + img, + img_metas, + gt_bboxes, + gt_labels, + gt_bboxes_ignore=None): + """ + Args: + img (Tensor): Input images of shape (N, C, H, W). + Typically these should be mean centered and std scaled. + img_metas (list[dict]): A List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + :class:`mmdet.datasets.pipelines.Collect`. + gt_bboxes (list[Tensor]): Each item are the truth boxes for each + image in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): Class indices corresponding to each box + gt_bboxes_ignore (None | list[Tensor]): Specify which bounding + boxes can be ignored when computing the loss. + Returns: + dict[str, Tensor]: A dictionary of loss components. + """ + # Multi-scale training + img, gt_bboxes = self._preprocess(img, gt_bboxes) + + losses = super(YOLOX, self).forward_train(img, img_metas, gt_bboxes, + gt_labels, gt_bboxes_ignore) + + # random resizing + if (self._progress_in_iter + 1) % self._random_size_interval == 0: + self._input_size = self._random_resize(device=img.device) + self._progress_in_iter += 1 + + return losses + + def _preprocess(self, img, gt_bboxes): + scale_y = self._input_size[0] / self._default_input_size[0] + scale_x = self._input_size[1] / self._default_input_size[1] + if scale_x != 1 or scale_y != 1: + img = F.interpolate( + img, + size=self._input_size, + mode='bilinear', + align_corners=False) + for gt_bbox in gt_bboxes: + gt_bbox[..., 0::2] = gt_bbox[..., 0::2] * scale_x + gt_bbox[..., 1::2] = gt_bbox[..., 1::2] * scale_y + return img, gt_bboxes + + def _random_resize(self, device): + tensor = torch.LongTensor(2).to(device) + + if self.rank == 0: + size = random.randint(*self._random_size_range) + aspect_ratio = float( + self._default_input_size[1]) / self._default_input_size[0] + size = (self._size_multiplier * size, + self._size_multiplier * int(aspect_ratio * size)) + tensor[0] = size[0] + tensor[1] = size[1] + + if self.world_size > 1: + dist.barrier() + dist.broadcast(tensor, 0) + + input_size = (tensor[0].item(), tensor[1].item()) + return input_size diff --git a/mmdet/models/losses/__init__.py b/mmdet/models/losses/__init__.py new file mode 100644 index 0000000..068a54d --- /dev/null +++ b/mmdet/models/losses/__init__.py @@ -0,0 +1,32 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .accuracy import Accuracy, accuracy +from .ae_loss import AssociativeEmbeddingLoss +from .balanced_l1_loss import BalancedL1Loss, balanced_l1_loss +from .cross_entropy_loss import (CrossEntropyLoss, binary_cross_entropy, + cross_entropy, mask_cross_entropy) +from .dice_loss import DiceLoss +from .focal_loss import FocalLoss, sigmoid_focal_loss +from .gaussian_focal_loss import GaussianFocalLoss +from .gfocal_loss import DistributionFocalLoss, QualityFocalLoss +from .ghm_loss import GHMC, GHMR +from .iou_loss import (BoundedIoULoss, CIoULoss, DIoULoss, GIoULoss, IoULoss, + bounded_iou_loss, iou_loss) +from .kd_loss import KnowledgeDistillationKLDivLoss +from .mse_loss import MSELoss, mse_loss +from .pisa_loss import carl_loss, isr_p +from .seesaw_loss import SeesawLoss +from .smooth_l1_loss import L1Loss, SmoothL1Loss, l1_loss, smooth_l1_loss +from .utils import reduce_loss, weight_reduce_loss, weighted_loss +from .varifocal_loss import VarifocalLoss + +__all__ = [ + 'accuracy', 'Accuracy', 'cross_entropy', 'binary_cross_entropy', + 'mask_cross_entropy', 'CrossEntropyLoss', 'sigmoid_focal_loss', + 'FocalLoss', 'smooth_l1_loss', 'SmoothL1Loss', 'balanced_l1_loss', + 'BalancedL1Loss', 'mse_loss', 'MSELoss', 'iou_loss', 'bounded_iou_loss', + 'IoULoss', 'BoundedIoULoss', 'GIoULoss', 'DIoULoss', 'CIoULoss', 'GHMC', + 'GHMR', 'reduce_loss', 'weight_reduce_loss', 'weighted_loss', 'L1Loss', + 'l1_loss', 'isr_p', 'carl_loss', 'AssociativeEmbeddingLoss', + 'GaussianFocalLoss', 'QualityFocalLoss', 'DistributionFocalLoss', + 'VarifocalLoss', 'KnowledgeDistillationKLDivLoss', 'SeesawLoss', 'DiceLoss' +] diff --git a/mmdet/models/losses/accuracy.py b/mmdet/models/losses/accuracy.py new file mode 100644 index 0000000..fe765a3 --- /dev/null +++ b/mmdet/models/losses/accuracy.py @@ -0,0 +1,79 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch.nn as nn + + +@mmcv.jit(coderize=True) +def accuracy(pred, target, topk=1, thresh=None): + """Calculate accuracy according to the prediction and target. + + Args: + pred (torch.Tensor): The model prediction, shape (N, num_class) + target (torch.Tensor): The target of each prediction, shape (N, ) + topk (int | tuple[int], optional): If the predictions in ``topk`` + matches the target, the predictions will be regarded as + correct ones. Defaults to 1. + thresh (float, optional): If not None, predictions with scores under + this threshold are considered incorrect. Default to None. + + Returns: + float | tuple[float]: If the input ``topk`` is a single integer, + the function will return a single float as accuracy. If + ``topk`` is a tuple containing multiple integers, the + function will return a tuple containing accuracies of + each ``topk`` number. + """ + assert isinstance(topk, (int, tuple)) + if isinstance(topk, int): + topk = (topk, ) + return_single = True + else: + return_single = False + + maxk = max(topk) + if pred.size(0) == 0: + accu = [pred.new_tensor(0.) for i in range(len(topk))] + return accu[0] if return_single else accu + assert pred.ndim == 2 and target.ndim == 1 + assert pred.size(0) == target.size(0) + assert maxk <= pred.size(1), \ + f'maxk {maxk} exceeds pred dimension {pred.size(1)}' + pred_value, pred_label = pred.topk(maxk, dim=1) + pred_label = pred_label.t() # transpose to shape (maxk, N) + correct = pred_label.eq(target.view(1, -1).expand_as(pred_label)) + if thresh is not None: + # Only prediction values larger than thresh are counted as correct + correct = correct & (pred_value > thresh).t() + res = [] + for k in topk: + correct_k = correct[:k].reshape(-1).float().sum(0, keepdim=True) + res.append(correct_k.mul_(100.0 / pred.size(0))) + return res[0] if return_single else res + + +class Accuracy(nn.Module): + + def __init__(self, topk=(1, ), thresh=None): + """Module to calculate the accuracy. + + Args: + topk (tuple, optional): The criterion used to calculate the + accuracy. Defaults to (1,). + thresh (float, optional): If not None, predictions with scores + under this threshold are considered incorrect. Default to None. + """ + super().__init__() + self.topk = topk + self.thresh = thresh + + def forward(self, pred, target): + """Forward function to calculate accuracy. + + Args: + pred (torch.Tensor): Prediction of models. + target (torch.Tensor): Target for each prediction. + + Returns: + tuple[float]: The accuracies under different topk criterions. + """ + return accuracy(pred, target, self.topk, self.thresh) diff --git a/mmdet/models/losses/ae_loss.py b/mmdet/models/losses/ae_loss.py new file mode 100644 index 0000000..5c6da22 --- /dev/null +++ b/mmdet/models/losses/ae_loss.py @@ -0,0 +1,103 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch +import torch.nn as nn +import torch.nn.functional as F + +from ..builder import LOSSES + + +@mmcv.jit(derivate=True, coderize=True) +def ae_loss_per_image(tl_preds, br_preds, match): + """Associative Embedding Loss in one image. + + Associative Embedding Loss including two parts: pull loss and push loss. + Pull loss makes embedding vectors from same object closer to each other. + Push loss distinguish embedding vector from different objects, and makes + the gap between them is large enough. + + During computing, usually there are 3 cases: + - no object in image: both pull loss and push loss will be 0. + - one object in image: push loss will be 0 and pull loss is computed + by the two corner of the only object. + - more than one objects in image: pull loss is computed by corner pairs + from each object, push loss is computed by each object with all + other objects. We use confusion matrix with 0 in diagonal to + compute the push loss. + + Args: + tl_preds (tensor): Embedding feature map of left-top corner. + br_preds (tensor): Embedding feature map of bottim-right corner. + match (list): Downsampled coordinates pair of each ground truth box. + """ + + tl_list, br_list, me_list = [], [], [] + if len(match) == 0: # no object in image + pull_loss = tl_preds.sum() * 0. + push_loss = tl_preds.sum() * 0. + else: + for m in match: + [tl_y, tl_x], [br_y, br_x] = m + tl_e = tl_preds[:, tl_y, tl_x].view(-1, 1) + br_e = br_preds[:, br_y, br_x].view(-1, 1) + tl_list.append(tl_e) + br_list.append(br_e) + me_list.append((tl_e + br_e) / 2.0) + + tl_list = torch.cat(tl_list) + br_list = torch.cat(br_list) + me_list = torch.cat(me_list) + + assert tl_list.size() == br_list.size() + + # N is object number in image, M is dimension of embedding vector + N, M = tl_list.size() + + pull_loss = (tl_list - me_list).pow(2) + (br_list - me_list).pow(2) + pull_loss = pull_loss.sum() / N + + margin = 1 # exp setting of CornerNet, details in section 3.3 of paper + + # confusion matrix of push loss + conf_mat = me_list.expand((N, N, M)).permute(1, 0, 2) - me_list + conf_weight = 1 - torch.eye(N).type_as(me_list) + conf_mat = conf_weight * (margin - conf_mat.sum(-1).abs()) + + if N > 1: # more than one object in current image + push_loss = F.relu(conf_mat).sum() / (N * (N - 1)) + else: + push_loss = tl_preds.sum() * 0. + + return pull_loss, push_loss + + +@LOSSES.register_module() +class AssociativeEmbeddingLoss(nn.Module): + """Associative Embedding Loss. + + More details can be found in + `Associative Embedding `_ and + `CornerNet `_ . + Code is modified from `kp_utils.py `_ # noqa: E501 + + Args: + pull_weight (float): Loss weight for corners from same object. + push_weight (float): Loss weight for corners from different object. + """ + + def __init__(self, pull_weight=0.25, push_weight=0.25): + super(AssociativeEmbeddingLoss, self).__init__() + self.pull_weight = pull_weight + self.push_weight = push_weight + + def forward(self, pred, target, match): + """Forward function.""" + batch = pred.size(0) + pull_all, push_all = 0.0, 0.0 + for i in range(batch): + pull, push = ae_loss_per_image(pred[i], target[i], match[i]) + + pull_all += self.pull_weight * pull + push_all += self.push_weight * push + + return pull_all, push_all diff --git a/mmdet/models/losses/balanced_l1_loss.py b/mmdet/models/losses/balanced_l1_loss.py new file mode 100644 index 0000000..8500345 --- /dev/null +++ b/mmdet/models/losses/balanced_l1_loss.py @@ -0,0 +1,124 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import numpy as np +import torch +import torch.nn as nn + +from ..builder import LOSSES +from .utils import weighted_loss + + +@mmcv.jit(derivate=True, coderize=True) +@weighted_loss +def balanced_l1_loss(pred, + target, + beta=1.0, + alpha=0.5, + gamma=1.5, + reduction='mean'): + """Calculate balanced L1 loss. + + Please see the `Libra R-CNN `_ + + Args: + pred (torch.Tensor): The prediction with shape (N, 4). + target (torch.Tensor): The learning target of the prediction with + shape (N, 4). + beta (float): The loss is a piecewise function of prediction and target + and ``beta`` serves as a threshold for the difference between the + prediction and target. Defaults to 1.0. + alpha (float): The denominator ``alpha`` in the balanced L1 loss. + Defaults to 0.5. + gamma (float): The ``gamma`` in the balanced L1 loss. + Defaults to 1.5. + reduction (str, optional): The method that reduces the loss to a + scalar. Options are "none", "mean" and "sum". + + Returns: + torch.Tensor: The calculated loss + """ + assert beta > 0 + if target.numel() == 0: + return pred.sum() * 0 + + assert pred.size() == target.size() + + diff = torch.abs(pred - target) + b = np.e**(gamma / alpha) - 1 + loss = torch.where( + diff < beta, alpha / b * + (b * diff + 1) * torch.log(b * diff / beta + 1) - alpha * diff, + gamma * diff + gamma / b - alpha * beta) + + return loss + + +@LOSSES.register_module() +class BalancedL1Loss(nn.Module): + """Balanced L1 Loss. + + arXiv: https://arxiv.org/pdf/1904.02701.pdf (CVPR 2019) + + Args: + alpha (float): The denominator ``alpha`` in the balanced L1 loss. + Defaults to 0.5. + gamma (float): The ``gamma`` in the balanced L1 loss. Defaults to 1.5. + beta (float, optional): The loss is a piecewise function of prediction + and target. ``beta`` serves as a threshold for the difference + between the prediction and target. Defaults to 1.0. + reduction (str, optional): The method that reduces the loss to a + scalar. Options are "none", "mean" and "sum". + loss_weight (float, optional): The weight of the loss. Defaults to 1.0 + """ + + def __init__(self, + alpha=0.5, + gamma=1.5, + beta=1.0, + reduction='mean', + loss_weight=1.0): + super(BalancedL1Loss, self).__init__() + self.alpha = alpha + self.gamma = gamma + self.beta = beta + self.reduction = reduction + self.loss_weight = loss_weight + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None, + **kwargs): + """Forward function of loss. + + Args: + pred (torch.Tensor): The prediction with shape (N, 4). + target (torch.Tensor): The learning target of the prediction with + shape (N, 4). + weight (torch.Tensor, optional): Sample-wise loss weight with + shape (N, ). + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + reduction_override (str, optional): The reduction method used to + override the original reduction method of the loss. + Options are "none", "mean" and "sum". + + Returns: + torch.Tensor: The calculated loss + """ + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + loss_bbox = self.loss_weight * balanced_l1_loss( + pred, + target, + weight, + alpha=self.alpha, + gamma=self.gamma, + beta=self.beta, + reduction=reduction, + avg_factor=avg_factor, + **kwargs) + return loss_bbox diff --git a/mmdet/models/losses/cross_entropy_loss.py b/mmdet/models/losses/cross_entropy_loss.py new file mode 100644 index 0000000..41411fc --- /dev/null +++ b/mmdet/models/losses/cross_entropy_loss.py @@ -0,0 +1,301 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch +import torch.nn as nn +import torch.nn.functional as F + +from ..builder import LOSSES +from .utils import weight_reduce_loss + + +def cross_entropy(pred, + label, + weight=None, + reduction='mean', + avg_factor=None, + class_weight=None, + ignore_index=-100, + avg_non_ignore=False): + """Calculate the CrossEntropy loss. + + Args: + pred (torch.Tensor): The prediction with shape (N, C), C is the number + of classes. + label (torch.Tensor): The learning label of the prediction. + weight (torch.Tensor, optional): Sample-wise loss weight. + reduction (str, optional): The method used to reduce the loss. + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + class_weight (list[float], optional): The weight for each class. + ignore_index (int | None): The label index to be ignored. + If None, it will be set to default value. Default: -100. + avg_non_ignore (bool): The flag decides to whether the loss is + only averaged over non-ignored targets. Default: False. + + Returns: + torch.Tensor: The calculated loss + """ + # The default value of ignore_index is the same as F.cross_entropy + ignore_index = -100 if ignore_index is None else ignore_index + # element-wise losses + loss = F.cross_entropy( + pred, + label, + weight=class_weight, + reduction='none', + ignore_index=ignore_index) + + # average loss over non-ignored elements + # pytorch's official cross_entropy average loss over non-ignored elements + # refer to https://github.com/pytorch/pytorch/blob/56b43f4fec1f76953f15a627694d4bba34588969/torch/nn/functional.py#L2660 # noqa + if (avg_factor is None) and avg_non_ignore and reduction == 'mean': + avg_factor = label.numel() - (label == ignore_index).sum().item() + + # apply weights and do the reduction + if weight is not None: + weight = weight.float() + loss = weight_reduce_loss( + loss, weight=weight, reduction=reduction, avg_factor=avg_factor) + + return loss + + +def _expand_onehot_labels(labels, label_weights, label_channels, ignore_index): + """Expand onehot labels to match the size of prediction.""" + bin_labels = labels.new_full((labels.size(0), label_channels), 0) + valid_mask = (labels >= 0) & (labels != ignore_index) + inds = torch.nonzero( + valid_mask & (labels < label_channels), as_tuple=False) + + if inds.numel() > 0: + bin_labels[inds, labels[inds]] = 1 + + valid_mask = valid_mask.view(-1, 1).expand(labels.size(0), + label_channels).float() + if label_weights is None: + bin_label_weights = valid_mask + else: + bin_label_weights = label_weights.view(-1, 1).repeat(1, label_channels) + bin_label_weights *= valid_mask + + return bin_labels, bin_label_weights, valid_mask + + +def binary_cross_entropy(pred, + label, + weight=None, + reduction='mean', + avg_factor=None, + class_weight=None, + ignore_index=-100, + avg_non_ignore=False): + """Calculate the binary CrossEntropy loss. + + Args: + pred (torch.Tensor): The prediction with shape (N, 1) or (N, ). + When the shape of pred is (N, 1), label will be expanded to + one-hot format, and when the shape of pred is (N, ), label + will not be expanded to one-hot format. + label (torch.Tensor): The learning label of the prediction, + with shape (N, ). + weight (torch.Tensor, optional): Sample-wise loss weight. + reduction (str, optional): The method used to reduce the loss. + Options are "none", "mean" and "sum". + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + class_weight (list[float], optional): The weight for each class. + ignore_index (int | None): The label index to be ignored. + If None, it will be set to default value. Default: -100. + avg_non_ignore (bool): The flag decides to whether the loss is + only averaged over non-ignored targets. Default: False. + + Returns: + torch.Tensor: The calculated loss. + """ + # The default value of ignore_index is the same as F.cross_entropy + ignore_index = -100 if ignore_index is None else ignore_index + + if pred.dim() != label.dim(): + label, weight, valid_mask = _expand_onehot_labels( + label, weight, pred.size(-1), ignore_index) + else: + # should mask out the ignored elements + valid_mask = ((label >= 0) & (label != ignore_index)).float() + if weight is not None: + # The inplace writing method will have a mismatched broadcast + # shape error if the weight and valid_mask dimensions + # are inconsistent such as (B,N,1) and (B,N,C). + weight = weight * valid_mask + else: + weight = valid_mask + + # average loss over non-ignored elements + if (avg_factor is None) and avg_non_ignore and reduction == 'mean': + avg_factor = valid_mask.sum().item() + + # weighted element-wise losses + weight = weight.float() + loss = F.binary_cross_entropy_with_logits( + pred, label.float(), pos_weight=class_weight, reduction='none') + # do the reduction for the weighted loss + loss = weight_reduce_loss( + loss, weight, reduction=reduction, avg_factor=avg_factor) + + return loss + + +def mask_cross_entropy(pred, + target, + label, + reduction='mean', + avg_factor=None, + class_weight=None, + ignore_index=None, + **kwargs): + """Calculate the CrossEntropy loss for masks. + + Args: + pred (torch.Tensor): The prediction with shape (N, C, *), C is the + number of classes. The trailing * indicates arbitrary shape. + target (torch.Tensor): The learning label of the prediction. + label (torch.Tensor): ``label`` indicates the class label of the mask + corresponding object. This will be used to select the mask in the + of the class which the object belongs to when the mask prediction + if not class-agnostic. + reduction (str, optional): The method used to reduce the loss. + Options are "none", "mean" and "sum". + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + class_weight (list[float], optional): The weight for each class. + ignore_index (None): Placeholder, to be consistent with other loss. + Default: None. + + Returns: + torch.Tensor: The calculated loss + + Example: + >>> N, C = 3, 11 + >>> H, W = 2, 2 + >>> pred = torch.randn(N, C, H, W) * 1000 + >>> target = torch.rand(N, H, W) + >>> label = torch.randint(0, C, size=(N,)) + >>> reduction = 'mean' + >>> avg_factor = None + >>> class_weights = None + >>> loss = mask_cross_entropy(pred, target, label, reduction, + >>> avg_factor, class_weights) + >>> assert loss.shape == (1,) + """ + assert ignore_index is None, 'BCE loss does not support ignore_index' + # TODO: handle these two reserved arguments + assert reduction == 'mean' and avg_factor is None + num_rois = pred.size()[0] + inds = torch.arange(0, num_rois, dtype=torch.long, device=pred.device) + pred_slice = pred[inds, label].squeeze(1) + return F.binary_cross_entropy_with_logits( + pred_slice, target, weight=class_weight, reduction='mean')[None] + + +@LOSSES.register_module() +class CrossEntropyLoss(nn.Module): + + def __init__(self, + use_sigmoid=False, + use_mask=False, + reduction='mean', + class_weight=None, + ignore_index=None, + loss_weight=1.0, + avg_non_ignore=False): + """CrossEntropyLoss. + + Args: + use_sigmoid (bool, optional): Whether the prediction uses sigmoid + of softmax. Defaults to False. + use_mask (bool, optional): Whether to use mask cross entropy loss. + Defaults to False. + reduction (str, optional): . Defaults to 'mean'. + Options are "none", "mean" and "sum". + class_weight (list[float], optional): Weight of each class. + Defaults to None. + ignore_index (int | None): The label index to be ignored. + Defaults to None. + loss_weight (float, optional): Weight of the loss. Defaults to 1.0. + avg_non_ignore (bool): The flag decides to whether the loss is + only averaged over non-ignored targets. Default: False. + """ + super(CrossEntropyLoss, self).__init__() + assert (use_sigmoid is False) or (use_mask is False) + self.use_sigmoid = use_sigmoid + self.use_mask = use_mask + self.reduction = reduction + self.loss_weight = loss_weight + self.class_weight = class_weight + self.ignore_index = ignore_index + self.avg_non_ignore = avg_non_ignore + if ((ignore_index is not None) and not self.avg_non_ignore + and self.reduction == 'mean'): + warnings.warn( + 'Default ``avg_non_ignore`` is False, if you would like to ' + 'ignore the certain label and average loss over non-ignore ' + 'labels, which is the same with PyTorch official ' + 'cross_entropy, set ``avg_non_ignore=True``.') + + if self.use_sigmoid: + self.cls_criterion = binary_cross_entropy + elif self.use_mask: + self.cls_criterion = mask_cross_entropy + else: + self.cls_criterion = cross_entropy + + def extra_repr(self): + """Extra repr.""" + s = f'avg_non_ignore={self.avg_non_ignore}' + return s + + def forward(self, + cls_score, + label, + weight=None, + avg_factor=None, + reduction_override=None, + ignore_index=None, + **kwargs): + """Forward function. + + Args: + cls_score (torch.Tensor): The prediction. + label (torch.Tensor): The learning label of the prediction. + weight (torch.Tensor, optional): Sample-wise loss weight. + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + reduction_override (str, optional): The method used to reduce the + loss. Options are "none", "mean" and "sum". + ignore_index (int | None): The label index to be ignored. + If not None, it will override the default value. Default: None. + Returns: + torch.Tensor: The calculated loss. + """ + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + if ignore_index is None: + ignore_index = self.ignore_index + + if self.class_weight is not None: + class_weight = cls_score.new_tensor( + self.class_weight, device=cls_score.device) + else: + class_weight = None + loss_cls = self.loss_weight * self.cls_criterion( + cls_score, + label, + weight, + class_weight=class_weight, + reduction=reduction, + avg_factor=avg_factor, + ignore_index=ignore_index, + avg_non_ignore=self.avg_non_ignore, + **kwargs) + return loss_cls diff --git a/mmdet/models/losses/dice_loss.py b/mmdet/models/losses/dice_loss.py new file mode 100644 index 0000000..585beea --- /dev/null +++ b/mmdet/models/losses/dice_loss.py @@ -0,0 +1,146 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn + +from ..builder import LOSSES +from .utils import weight_reduce_loss + + +def dice_loss(pred, + target, + weight=None, + eps=1e-3, + reduction='mean', + naive_dice=False, + avg_factor=None): + """Calculate dice loss, there are two forms of dice loss is supported: + + - the one proposed in `V-Net: Fully Convolutional Neural + Networks for Volumetric Medical Image Segmentation + `_. + - the dice loss in which the power of the number in the + denominator is the first power instead of the second + power. + + Args: + pred (torch.Tensor): The prediction, has a shape (n, *) + target (torch.Tensor): The learning label of the prediction, + shape (n, *), same shape of pred. + weight (torch.Tensor, optional): The weight of loss for each + prediction, has a shape (n,). Defaults to None. + eps (float): Avoid dividing by zero. Default: 1e-3. + reduction (str, optional): The method used to reduce the loss into + a scalar. Defaults to 'mean'. + Options are "none", "mean" and "sum". + naive_dice (bool, optional): If false, use the dice + loss defined in the V-Net paper, otherwise, use the + naive dice loss in which the power of the number in the + denominator is the first power instead of the second + power.Defaults to False. + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + """ + + input = pred.flatten(1) + target = target.flatten(1).float() + + a = torch.sum(input * target, 1) + if naive_dice: + b = torch.sum(input, 1) + c = torch.sum(target, 1) + d = (2 * a + eps) / (b + c + eps) + else: + b = torch.sum(input * input, 1) + eps + c = torch.sum(target * target, 1) + eps + d = (2 * a) / (b + c) + + loss = 1 - d + if weight is not None: + assert weight.ndim == loss.ndim + assert len(weight) == len(pred) + loss = weight_reduce_loss(loss, weight, reduction, avg_factor) + return loss + + +@LOSSES.register_module() +class DiceLoss(nn.Module): + + def __init__(self, + use_sigmoid=True, + activate=True, + reduction='mean', + naive_dice=False, + loss_weight=1.0, + eps=1e-3): + """Compute dice loss. + + Args: + use_sigmoid (bool, optional): Whether to the prediction is + used for sigmoid or softmax. Defaults to True. + activate (bool): Whether to activate the predictions inside, + this will disable the inside sigmoid operation. + Defaults to True. + reduction (str, optional): The method used + to reduce the loss. Options are "none", + "mean" and "sum". Defaults to 'mean'. + naive_dice (bool, optional): If false, use the dice + loss defined in the V-Net paper, otherwise, use the + naive dice loss in which the power of the number in the + denominator is the first power instead of the second + power. Defaults to False. + loss_weight (float, optional): Weight of loss. Defaults to 1.0. + eps (float): Avoid dividing by zero. Defaults to 1e-3. + """ + + super(DiceLoss, self).__init__() + self.use_sigmoid = use_sigmoid + self.reduction = reduction + self.naive_dice = naive_dice + self.loss_weight = loss_weight + self.eps = eps + self.activate = activate + + def forward(self, + pred, + target, + weight=None, + reduction_override=None, + avg_factor=None): + """Forward function. + + Args: + pred (torch.Tensor): The prediction, has a shape (n, *). + target (torch.Tensor): The label of the prediction, + shape (n, *), same shape of pred. + weight (torch.Tensor, optional): The weight of loss for each + prediction, has a shape (n,). Defaults to None. + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + reduction_override (str, optional): The reduction method used to + override the original reduction method of the loss. + Options are "none", "mean" and "sum". + + Returns: + torch.Tensor: The calculated loss + """ + + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + + if self.activate: + if self.use_sigmoid: + pred = pred.sigmoid() + else: + raise NotImplementedError + + loss = self.loss_weight * dice_loss( + pred, + target, + weight, + eps=self.eps, + reduction=reduction, + naive_dice=self.naive_dice, + avg_factor=avg_factor) + + return loss diff --git a/mmdet/models/losses/focal_loss.py b/mmdet/models/losses/focal_loss.py new file mode 100644 index 0000000..2858c19 --- /dev/null +++ b/mmdet/models/losses/focal_loss.py @@ -0,0 +1,244 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.ops import sigmoid_focal_loss as _sigmoid_focal_loss + +from ..builder import LOSSES +from .utils import weight_reduce_loss + + +# This method is only for debugging +def py_sigmoid_focal_loss(pred, + target, + weight=None, + gamma=2.0, + alpha=0.25, + reduction='mean', + avg_factor=None): + """PyTorch version of `Focal Loss `_. + + Args: + pred (torch.Tensor): The prediction with shape (N, C), C is the + number of classes + target (torch.Tensor): The learning label of the prediction. + weight (torch.Tensor, optional): Sample-wise loss weight. + gamma (float, optional): The gamma for calculating the modulating + factor. Defaults to 2.0. + alpha (float, optional): A balanced form for Focal Loss. + Defaults to 0.25. + reduction (str, optional): The method used to reduce the loss into + a scalar. Defaults to 'mean'. + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + """ + pred_sigmoid = pred.sigmoid() + target = target.type_as(pred) + pt = (1 - pred_sigmoid) * target + pred_sigmoid * (1 - target) + focal_weight = (alpha * target + (1 - alpha) * + (1 - target)) * pt.pow(gamma) + loss = F.binary_cross_entropy_with_logits( + pred, target, reduction='none') * focal_weight + if weight is not None: + if weight.shape != loss.shape: + if weight.size(0) == loss.size(0): + # For most cases, weight is of shape (num_priors, ), + # which means it does not have the second axis num_class + weight = weight.view(-1, 1) + else: + # Sometimes, weight per anchor per class is also needed. e.g. + # in FSAF. But it may be flattened of shape + # (num_priors x num_class, ), while loss is still of shape + # (num_priors, num_class). + assert weight.numel() == loss.numel() + weight = weight.view(loss.size(0), -1) + assert weight.ndim == loss.ndim + loss = weight_reduce_loss(loss, weight, reduction, avg_factor) + return loss + + +def py_focal_loss_with_prob(pred, + target, + weight=None, + gamma=2.0, + alpha=0.25, + reduction='mean', + avg_factor=None): + """PyTorch version of `Focal Loss `_. + Different from `py_sigmoid_focal_loss`, this function accepts probability + as input. + + Args: + pred (torch.Tensor): The prediction probability with shape (N, C), + C is the number of classes. + target (torch.Tensor): The learning label of the prediction. + weight (torch.Tensor, optional): Sample-wise loss weight. + gamma (float, optional): The gamma for calculating the modulating + factor. Defaults to 2.0. + alpha (float, optional): A balanced form for Focal Loss. + Defaults to 0.25. + reduction (str, optional): The method used to reduce the loss into + a scalar. Defaults to 'mean'. + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + """ + num_classes = pred.size(1) + target = F.one_hot(target, num_classes=num_classes + 1) + target = target[:, :num_classes] + + target = target.type_as(pred) + pt = (1 - pred) * target + pred * (1 - target) + focal_weight = (alpha * target + (1 - alpha) * + (1 - target)) * pt.pow(gamma) + loss = F.binary_cross_entropy( + pred, target, reduction='none') * focal_weight + if weight is not None: + if weight.shape != loss.shape: + if weight.size(0) == loss.size(0): + # For most cases, weight is of shape (num_priors, ), + # which means it does not have the second axis num_class + weight = weight.view(-1, 1) + else: + # Sometimes, weight per anchor per class is also needed. e.g. + # in FSAF. But it may be flattened of shape + # (num_priors x num_class, ), while loss is still of shape + # (num_priors, num_class). + assert weight.numel() == loss.numel() + weight = weight.view(loss.size(0), -1) + assert weight.ndim == loss.ndim + loss = weight_reduce_loss(loss, weight, reduction, avg_factor) + return loss + + +def sigmoid_focal_loss(pred, + target, + weight=None, + gamma=2.0, + alpha=0.25, + reduction='mean', + avg_factor=None): + r"""A wrapper of cuda version `Focal Loss + `_. + + Args: + pred (torch.Tensor): The prediction with shape (N, C), C is the number + of classes. + target (torch.Tensor): The learning label of the prediction. + weight (torch.Tensor, optional): Sample-wise loss weight. + gamma (float, optional): The gamma for calculating the modulating + factor. Defaults to 2.0. + alpha (float, optional): A balanced form for Focal Loss. + Defaults to 0.25. + reduction (str, optional): The method used to reduce the loss into + a scalar. Defaults to 'mean'. Options are "none", "mean" and "sum". + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + """ + # Function.apply does not accept keyword arguments, so the decorator + # "weighted_loss" is not applicable + loss = _sigmoid_focal_loss(pred.contiguous(), target.contiguous(), gamma, + alpha, None, 'none') + if weight is not None: + if weight.shape != loss.shape: + if weight.size(0) == loss.size(0): + # For most cases, weight is of shape (num_priors, ), + # which means it does not have the second axis num_class + weight = weight.view(-1, 1) + else: + # Sometimes, weight per anchor per class is also needed. e.g. + # in FSAF. But it may be flattened of shape + # (num_priors x num_class, ), while loss is still of shape + # (num_priors, num_class). + assert weight.numel() == loss.numel() + weight = weight.view(loss.size(0), -1) + assert weight.ndim == loss.ndim + loss = weight_reduce_loss(loss, weight, reduction, avg_factor) + return loss + + +@LOSSES.register_module() +class FocalLoss(nn.Module): + + def __init__(self, + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + reduction='mean', + loss_weight=1.0, + activated=False): + """`Focal Loss `_ + + Args: + use_sigmoid (bool, optional): Whether to the prediction is + used for sigmoid or softmax. Defaults to True. + gamma (float, optional): The gamma for calculating the modulating + factor. Defaults to 2.0. + alpha (float, optional): A balanced form for Focal Loss. + Defaults to 0.25. + reduction (str, optional): The method used to reduce the loss into + a scalar. Defaults to 'mean'. Options are "none", "mean" and + "sum". + loss_weight (float, optional): Weight of loss. Defaults to 1.0. + activated (bool, optional): Whether the input is activated. + If True, it means the input has been activated and can be + treated as probabilities. Else, it should be treated as logits. + Defaults to False. + """ + super(FocalLoss, self).__init__() + assert use_sigmoid is True, 'Only sigmoid focal loss supported now.' + self.use_sigmoid = use_sigmoid + self.gamma = gamma + self.alpha = alpha + self.reduction = reduction + self.loss_weight = loss_weight + self.activated = activated + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None): + """Forward function. + + Args: + pred (torch.Tensor): The prediction. + target (torch.Tensor): The learning label of the prediction. + weight (torch.Tensor, optional): The weight of loss for each + prediction. Defaults to None. + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + reduction_override (str, optional): The reduction method used to + override the original reduction method of the loss. + Options are "none", "mean" and "sum". + + Returns: + torch.Tensor: The calculated loss + """ + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + if self.use_sigmoid: + if self.activated: + calculate_loss_func = py_focal_loss_with_prob + else: + if torch.cuda.is_available() and pred.is_cuda: + calculate_loss_func = sigmoid_focal_loss + else: + num_classes = pred.size(1) + target = F.one_hot(target, num_classes=num_classes + 1) + target = target[:, :num_classes] + calculate_loss_func = py_sigmoid_focal_loss + + loss_cls = self.loss_weight * calculate_loss_func( + pred, + target, + weight, + gamma=self.gamma, + alpha=self.alpha, + reduction=reduction, + avg_factor=avg_factor) + + else: + raise NotImplementedError + return loss_cls diff --git a/mmdet/models/losses/gaussian_focal_loss.py b/mmdet/models/losses/gaussian_focal_loss.py new file mode 100644 index 0000000..7abcb69 --- /dev/null +++ b/mmdet/models/losses/gaussian_focal_loss.py @@ -0,0 +1,92 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch.nn as nn + +from ..builder import LOSSES +from .utils import weighted_loss + + +@mmcv.jit(derivate=True, coderize=True) +@weighted_loss +def gaussian_focal_loss(pred, gaussian_target, alpha=2.0, gamma=4.0): + """`Focal Loss `_ for targets in gaussian + distribution. + + Args: + pred (torch.Tensor): The prediction. + gaussian_target (torch.Tensor): The learning target of the prediction + in gaussian distribution. + alpha (float, optional): A balanced form for Focal Loss. + Defaults to 2.0. + gamma (float, optional): The gamma for calculating the modulating + factor. Defaults to 4.0. + """ + eps = 1e-12 + pos_weights = gaussian_target.eq(1) + neg_weights = (1 - gaussian_target).pow(gamma) + pos_loss = -(pred + eps).log() * (1 - pred).pow(alpha) * pos_weights + neg_loss = -(1 - pred + eps).log() * pred.pow(alpha) * neg_weights + return pos_loss + neg_loss + + +@LOSSES.register_module() +class GaussianFocalLoss(nn.Module): + """GaussianFocalLoss is a variant of focal loss. + + More details can be found in the `paper + `_ + Code is modified from `kp_utils.py + `_ # noqa: E501 + Please notice that the target in GaussianFocalLoss is a gaussian heatmap, + not 0/1 binary target. + + Args: + alpha (float): Power of prediction. + gamma (float): Power of target for negative samples. + reduction (str): Options are "none", "mean" and "sum". + loss_weight (float): Loss weight of current loss. + """ + + def __init__(self, + alpha=2.0, + gamma=4.0, + reduction='mean', + loss_weight=1.0): + super(GaussianFocalLoss, self).__init__() + self.alpha = alpha + self.gamma = gamma + self.reduction = reduction + self.loss_weight = loss_weight + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None): + """Forward function. + + Args: + pred (torch.Tensor): The prediction. + target (torch.Tensor): The learning target of the prediction + in gaussian distribution. + weight (torch.Tensor, optional): The weight of loss for each + prediction. Defaults to None. + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + reduction_override (str, optional): The reduction method used to + override the original reduction method of the loss. + Defaults to None. + """ + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + loss_reg = self.loss_weight * gaussian_focal_loss( + pred, + target, + weight, + alpha=self.alpha, + gamma=self.gamma, + reduction=reduction, + avg_factor=avg_factor) + return loss_reg diff --git a/mmdet/models/losses/gfocal_loss.py b/mmdet/models/losses/gfocal_loss.py new file mode 100644 index 0000000..0e8d263 --- /dev/null +++ b/mmdet/models/losses/gfocal_loss.py @@ -0,0 +1,245 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch.nn as nn +import torch.nn.functional as F + +from ..builder import LOSSES +from .utils import weighted_loss + + +@mmcv.jit(derivate=True, coderize=True) +@weighted_loss +def quality_focal_loss(pred, target, beta=2.0): + r"""Quality Focal Loss (QFL) is from `Generalized Focal Loss: Learning + Qualified and Distributed Bounding Boxes for Dense Object Detection + `_. + + Args: + pred (torch.Tensor): Predicted joint representation of classification + and quality (IoU) estimation with shape (N, C), C is the number of + classes. + target (tuple([torch.Tensor])): Target category label with shape (N,) + and target quality label with shape (N,). + beta (float): The beta parameter for calculating the modulating factor. + Defaults to 2.0. + + Returns: + torch.Tensor: Loss tensor with shape (N,). + """ + assert len(target) == 2, """target for QFL must be a tuple of two elements, + including category label and quality label, respectively""" + # label denotes the category id, score denotes the quality score + label, score = target + + # negatives are supervised by 0 quality score + pred_sigmoid = pred.sigmoid() + scale_factor = pred_sigmoid + zerolabel = scale_factor.new_zeros(pred.shape) + loss = F.binary_cross_entropy_with_logits( + pred, zerolabel, reduction='none') * scale_factor.pow(beta) + + # FG cat_id: [0, num_classes -1], BG cat_id: num_classes + bg_class_ind = pred.size(1) + pos = ((label >= 0) & (label < bg_class_ind)).nonzero().squeeze(1) + pos_label = label[pos].long() + # positives are supervised by bbox quality (IoU) score + scale_factor = score[pos] - pred_sigmoid[pos, pos_label] + loss[pos, pos_label] = F.binary_cross_entropy_with_logits( + pred[pos, pos_label], score[pos], + reduction='none') * scale_factor.abs().pow(beta) + + loss = loss.sum(dim=1, keepdim=False) + return loss + + +@weighted_loss +def quality_focal_loss_with_prob(pred, target, beta=2.0): + r"""Quality Focal Loss (QFL) is from `Generalized Focal Loss: Learning + Qualified and Distributed Bounding Boxes for Dense Object Detection + `_. + Different from `quality_focal_loss`, this function accepts probability + as input. + + Args: + pred (torch.Tensor): Predicted joint representation of classification + and quality (IoU) estimation with shape (N, C), C is the number of + classes. + target (tuple([torch.Tensor])): Target category label with shape (N,) + and target quality label with shape (N,). + beta (float): The beta parameter for calculating the modulating factor. + Defaults to 2.0. + + Returns: + torch.Tensor: Loss tensor with shape (N,). + """ + assert len(target) == 2, """target for QFL must be a tuple of two elements, + including category label and quality label, respectively""" + # label denotes the category id, score denotes the quality score + label, score = target + + # negatives are supervised by 0 quality score + pred_sigmoid = pred + scale_factor = pred_sigmoid + zerolabel = scale_factor.new_zeros(pred.shape) + loss = F.binary_cross_entropy( + pred, zerolabel, reduction='none') * scale_factor.pow(beta) + + # FG cat_id: [0, num_classes -1], BG cat_id: num_classes + bg_class_ind = pred.size(1) + pos = ((label >= 0) & (label < bg_class_ind)).nonzero().squeeze(1) + pos_label = label[pos].long() + # positives are supervised by bbox quality (IoU) score + scale_factor = score[pos] - pred_sigmoid[pos, pos_label] + loss[pos, pos_label] = F.binary_cross_entropy( + pred[pos, pos_label], score[pos], + reduction='none') * scale_factor.abs().pow(beta) + + loss = loss.sum(dim=1, keepdim=False) + return loss + + +@mmcv.jit(derivate=True, coderize=True) +@weighted_loss +def distribution_focal_loss(pred, label): + r"""Distribution Focal Loss (DFL) is from `Generalized Focal Loss: Learning + Qualified and Distributed Bounding Boxes for Dense Object Detection + `_. + + Args: + pred (torch.Tensor): Predicted general distribution of bounding boxes + (before softmax) with shape (N, n+1), n is the max value of the + integral set `{0, ..., n}` in paper. + label (torch.Tensor): Target distance label for bounding boxes with + shape (N,). + + Returns: + torch.Tensor: Loss tensor with shape (N,). + """ + dis_left = label.long() + dis_right = dis_left + 1 + weight_left = dis_right.float() - label + weight_right = label - dis_left.float() + loss = F.cross_entropy(pred, dis_left, reduction='none') * weight_left \ + + F.cross_entropy(pred, dis_right, reduction='none') * weight_right + return loss + + +@LOSSES.register_module() +class QualityFocalLoss(nn.Module): + r"""Quality Focal Loss (QFL) is a variant of `Generalized Focal Loss: + Learning Qualified and Distributed Bounding Boxes for Dense Object + Detection `_. + + Args: + use_sigmoid (bool): Whether sigmoid operation is conducted in QFL. + Defaults to True. + beta (float): The beta parameter for calculating the modulating factor. + Defaults to 2.0. + reduction (str): Options are "none", "mean" and "sum". + loss_weight (float): Loss weight of current loss. + activated (bool, optional): Whether the input is activated. + If True, it means the input has been activated and can be + treated as probabilities. Else, it should be treated as logits. + Defaults to False. + """ + + def __init__(self, + use_sigmoid=True, + beta=2.0, + reduction='mean', + loss_weight=1.0, + activated=False): + super(QualityFocalLoss, self).__init__() + assert use_sigmoid is True, 'Only sigmoid in QFL supported now.' + self.use_sigmoid = use_sigmoid + self.beta = beta + self.reduction = reduction + self.loss_weight = loss_weight + self.activated = activated + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None): + """Forward function. + + Args: + pred (torch.Tensor): Predicted joint representation of + classification and quality (IoU) estimation with shape (N, C), + C is the number of classes. + target (tuple([torch.Tensor])): Target category label with shape + (N,) and target quality label with shape (N,). + weight (torch.Tensor, optional): The weight of loss for each + prediction. Defaults to None. + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + reduction_override (str, optional): The reduction method used to + override the original reduction method of the loss. + Defaults to None. + """ + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + if self.use_sigmoid: + if self.activated: + calculate_loss_func = quality_focal_loss_with_prob + else: + calculate_loss_func = quality_focal_loss + loss_cls = self.loss_weight * calculate_loss_func( + pred, + target, + weight, + beta=self.beta, + reduction=reduction, + avg_factor=avg_factor) + else: + raise NotImplementedError + return loss_cls + + +@LOSSES.register_module() +class DistributionFocalLoss(nn.Module): + r"""Distribution Focal Loss (DFL) is a variant of `Generalized Focal Loss: + Learning Qualified and Distributed Bounding Boxes for Dense Object + Detection `_. + + Args: + reduction (str): Options are `'none'`, `'mean'` and `'sum'`. + loss_weight (float): Loss weight of current loss. + """ + + def __init__(self, reduction='mean', loss_weight=1.0): + super(DistributionFocalLoss, self).__init__() + self.reduction = reduction + self.loss_weight = loss_weight + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None): + """Forward function. + + Args: + pred (torch.Tensor): Predicted general distribution of bounding + boxes (before softmax) with shape (N, n+1), n is the max value + of the integral set `{0, ..., n}` in paper. + target (torch.Tensor): Target distance label for bounding boxes + with shape (N,). + weight (torch.Tensor, optional): The weight of loss for each + prediction. Defaults to None. + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + reduction_override (str, optional): The reduction method used to + override the original reduction method of the loss. + Defaults to None. + """ + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + loss_cls = self.loss_weight * distribution_focal_loss( + pred, target, weight, reduction=reduction, avg_factor=avg_factor) + return loss_cls diff --git a/mmdet/models/losses/ghm_loss.py b/mmdet/models/losses/ghm_loss.py new file mode 100644 index 0000000..a4df9fe --- /dev/null +++ b/mmdet/models/losses/ghm_loss.py @@ -0,0 +1,213 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F + +from ..builder import LOSSES +from .utils import weight_reduce_loss + + +def _expand_onehot_labels(labels, label_weights, label_channels): + bin_labels = labels.new_full((labels.size(0), label_channels), 0) + inds = torch.nonzero( + (labels >= 0) & (labels < label_channels), as_tuple=False).squeeze() + if inds.numel() > 0: + bin_labels[inds, labels[inds]] = 1 + bin_label_weights = label_weights.view(-1, 1).expand( + label_weights.size(0), label_channels) + return bin_labels, bin_label_weights + + +# TODO: code refactoring to make it consistent with other losses +@LOSSES.register_module() +class GHMC(nn.Module): + """GHM Classification Loss. + + Details of the theorem can be viewed in the paper + `Gradient Harmonized Single-stage Detector + `_. + + Args: + bins (int): Number of the unit regions for distribution calculation. + momentum (float): The parameter for moving average. + use_sigmoid (bool): Can only be true for BCE based loss now. + loss_weight (float): The weight of the total GHM-C loss. + reduction (str): Options are "none", "mean" and "sum". + Defaults to "mean" + """ + + def __init__(self, + bins=10, + momentum=0, + use_sigmoid=True, + loss_weight=1.0, + reduction='mean'): + super(GHMC, self).__init__() + self.bins = bins + self.momentum = momentum + edges = torch.arange(bins + 1).float() / bins + self.register_buffer('edges', edges) + self.edges[-1] += 1e-6 + if momentum > 0: + acc_sum = torch.zeros(bins) + self.register_buffer('acc_sum', acc_sum) + self.use_sigmoid = use_sigmoid + if not self.use_sigmoid: + raise NotImplementedError + self.loss_weight = loss_weight + self.reduction = reduction + + def forward(self, + pred, + target, + label_weight, + reduction_override=None, + **kwargs): + """Calculate the GHM-C loss. + + Args: + pred (float tensor of size [batch_num, class_num]): + The direct prediction of classification fc layer. + target (float tensor of size [batch_num, class_num]): + Binary class target for each sample. + label_weight (float tensor of size [batch_num, class_num]): + the value is 1 if the sample is valid and 0 if ignored. + reduction_override (str, optional): The reduction method used to + override the original reduction method of the loss. + Defaults to None. + Returns: + The gradient harmonized loss. + """ + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + # the target should be binary class label + if pred.dim() != target.dim(): + target, label_weight = _expand_onehot_labels( + target, label_weight, pred.size(-1)) + target, label_weight = target.float(), label_weight.float() + edges = self.edges + mmt = self.momentum + weights = torch.zeros_like(pred) + + # gradient length + g = torch.abs(pred.sigmoid().detach() - target) + + valid = label_weight > 0 + tot = max(valid.float().sum().item(), 1.0) + n = 0 # n valid bins + for i in range(self.bins): + inds = (g >= edges[i]) & (g < edges[i + 1]) & valid + num_in_bin = inds.sum().item() + if num_in_bin > 0: + if mmt > 0: + self.acc_sum[i] = mmt * self.acc_sum[i] \ + + (1 - mmt) * num_in_bin + weights[inds] = tot / self.acc_sum[i] + else: + weights[inds] = tot / num_in_bin + n += 1 + if n > 0: + weights = weights / n + + loss = F.binary_cross_entropy_with_logits( + pred, target, reduction='none') + loss = weight_reduce_loss( + loss, weights, reduction=reduction, avg_factor=tot) + return loss * self.loss_weight + + +# TODO: code refactoring to make it consistent with other losses +@LOSSES.register_module() +class GHMR(nn.Module): + """GHM Regression Loss. + + Details of the theorem can be viewed in the paper + `Gradient Harmonized Single-stage Detector + `_. + + Args: + mu (float): The parameter for the Authentic Smooth L1 loss. + bins (int): Number of the unit regions for distribution calculation. + momentum (float): The parameter for moving average. + loss_weight (float): The weight of the total GHM-R loss. + reduction (str): Options are "none", "mean" and "sum". + Defaults to "mean" + """ + + def __init__(self, + mu=0.02, + bins=10, + momentum=0, + loss_weight=1.0, + reduction='mean'): + super(GHMR, self).__init__() + self.mu = mu + self.bins = bins + edges = torch.arange(bins + 1).float() / bins + self.register_buffer('edges', edges) + self.edges[-1] = 1e3 + self.momentum = momentum + if momentum > 0: + acc_sum = torch.zeros(bins) + self.register_buffer('acc_sum', acc_sum) + self.loss_weight = loss_weight + self.reduction = reduction + + # TODO: support reduction parameter + def forward(self, + pred, + target, + label_weight, + avg_factor=None, + reduction_override=None): + """Calculate the GHM-R loss. + + Args: + pred (float tensor of size [batch_num, 4 (* class_num)]): + The prediction of box regression layer. Channel number can be 4 + or 4 * class_num depending on whether it is class-agnostic. + target (float tensor of size [batch_num, 4 (* class_num)]): + The target regression values with the same size of pred. + label_weight (float tensor of size [batch_num, 4 (* class_num)]): + The weight of each sample, 0 if ignored. + reduction_override (str, optional): The reduction method used to + override the original reduction method of the loss. + Defaults to None. + Returns: + The gradient harmonized loss. + """ + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + mu = self.mu + edges = self.edges + mmt = self.momentum + + # ASL1 loss + diff = pred - target + loss = torch.sqrt(diff * diff + mu * mu) - mu + + # gradient length + g = torch.abs(diff / torch.sqrt(mu * mu + diff * diff)).detach() + weights = torch.zeros_like(g) + + valid = label_weight > 0 + tot = max(label_weight.float().sum().item(), 1.0) + n = 0 # n: valid bins + for i in range(self.bins): + inds = (g >= edges[i]) & (g < edges[i + 1]) & valid + num_in_bin = inds.sum().item() + if num_in_bin > 0: + n += 1 + if mmt > 0: + self.acc_sum[i] = mmt * self.acc_sum[i] \ + + (1 - mmt) * num_in_bin + weights[inds] = tot / self.acc_sum[i] + else: + weights[inds] = tot / num_in_bin + if n > 0: + weights /= n + loss = weight_reduce_loss( + loss, weights, reduction=reduction, avg_factor=tot) + return loss * self.loss_weight diff --git a/mmdet/models/losses/iou_loss.py b/mmdet/models/losses/iou_loss.py new file mode 100644 index 0000000..bf1ed04 --- /dev/null +++ b/mmdet/models/losses/iou_loss.py @@ -0,0 +1,474 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math +import warnings + +import mmcv +import torch +import torch.nn as nn + +from mmdet.core import bbox_overlaps +from ..builder import LOSSES +from .utils import weighted_loss + + +@mmcv.jit(derivate=True, coderize=True) +@weighted_loss +def iou_loss(pred, target, linear=False, mode='log', eps=1e-6): + """IoU loss. + + Computing the IoU loss between a set of predicted bboxes and target bboxes. + The loss is calculated as negative log of IoU. + + Args: + pred (torch.Tensor): Predicted bboxes of format (x1, y1, x2, y2), + shape (n, 4). + target (torch.Tensor): Corresponding gt bboxes, shape (n, 4). + linear (bool, optional): If True, use linear scale of loss instead of + log scale. Default: False. + mode (str): Loss scaling mode, including "linear", "square", and "log". + Default: 'log' + eps (float): Eps to avoid log(0). + + Return: + torch.Tensor: Loss tensor. + """ + assert mode in ['linear', 'square', 'log'] + if linear: + mode = 'linear' + warnings.warn('DeprecationWarning: Setting "linear=True" in ' + 'iou_loss is deprecated, please use "mode=`linear`" ' + 'instead.') + ious = bbox_overlaps(pred, target, is_aligned=True).clamp(min=eps) + if mode == 'linear': + loss = 1 - ious + elif mode == 'square': + loss = 1 - ious**2 + elif mode == 'log': + loss = -ious.log() + else: + raise NotImplementedError + return loss + + +@mmcv.jit(derivate=True, coderize=True) +@weighted_loss +def bounded_iou_loss(pred, target, beta=0.2, eps=1e-3): + """BIoULoss. + + This is an implementation of paper + `Improving Object Localization with Fitness NMS and Bounded IoU Loss. + `_. + + Args: + pred (torch.Tensor): Predicted bboxes. + target (torch.Tensor): Target bboxes. + beta (float): beta parameter in smoothl1. + eps (float): eps to avoid NaN. + """ + pred_ctrx = (pred[:, 0] + pred[:, 2]) * 0.5 + pred_ctry = (pred[:, 1] + pred[:, 3]) * 0.5 + pred_w = pred[:, 2] - pred[:, 0] + pred_h = pred[:, 3] - pred[:, 1] + with torch.no_grad(): + target_ctrx = (target[:, 0] + target[:, 2]) * 0.5 + target_ctry = (target[:, 1] + target[:, 3]) * 0.5 + target_w = target[:, 2] - target[:, 0] + target_h = target[:, 3] - target[:, 1] + + dx = target_ctrx - pred_ctrx + dy = target_ctry - pred_ctry + + loss_dx = 1 - torch.max( + (target_w - 2 * dx.abs()) / + (target_w + 2 * dx.abs() + eps), torch.zeros_like(dx)) + loss_dy = 1 - torch.max( + (target_h - 2 * dy.abs()) / + (target_h + 2 * dy.abs() + eps), torch.zeros_like(dy)) + loss_dw = 1 - torch.min(target_w / (pred_w + eps), pred_w / + (target_w + eps)) + loss_dh = 1 - torch.min(target_h / (pred_h + eps), pred_h / + (target_h + eps)) + # view(..., -1) does not work for empty tensor + loss_comb = torch.stack([loss_dx, loss_dy, loss_dw, loss_dh], + dim=-1).flatten(1) + + loss = torch.where(loss_comb < beta, 0.5 * loss_comb * loss_comb / beta, + loss_comb - 0.5 * beta) + return loss + + +@mmcv.jit(derivate=True, coderize=True) +@weighted_loss +def giou_loss(pred, target, eps=1e-7): + r"""`Generalized Intersection over Union: A Metric and A Loss for Bounding + Box Regression `_. + + Args: + pred (torch.Tensor): Predicted bboxes of format (x1, y1, x2, y2), + shape (n, 4). + target (torch.Tensor): Corresponding gt bboxes, shape (n, 4). + eps (float): Eps to avoid log(0). + + Return: + Tensor: Loss tensor. + """ + gious = bbox_overlaps(pred, target, mode='giou', is_aligned=True, eps=eps) + loss = 1 - gious + return loss + + +@mmcv.jit(derivate=True, coderize=True) +@weighted_loss +def diou_loss(pred, target, eps=1e-7): + r"""`Implementation of Distance-IoU Loss: Faster and Better + Learning for Bounding Box Regression, https://arxiv.org/abs/1911.08287`_. + + Code is modified from https://github.com/Zzh-tju/DIoU. + + Args: + pred (Tensor): Predicted bboxes of format (x1, y1, x2, y2), + shape (n, 4). + target (Tensor): Corresponding gt bboxes, shape (n, 4). + eps (float): Eps to avoid log(0). + Return: + Tensor: Loss tensor. + """ + # overlap + lt = torch.max(pred[:, :2], target[:, :2]) + rb = torch.min(pred[:, 2:], target[:, 2:]) + wh = (rb - lt).clamp(min=0) + overlap = wh[:, 0] * wh[:, 1] + + # union + ap = (pred[:, 2] - pred[:, 0]) * (pred[:, 3] - pred[:, 1]) + ag = (target[:, 2] - target[:, 0]) * (target[:, 3] - target[:, 1]) + union = ap + ag - overlap + eps + + # IoU + ious = overlap / union + + # enclose area + enclose_x1y1 = torch.min(pred[:, :2], target[:, :2]) + enclose_x2y2 = torch.max(pred[:, 2:], target[:, 2:]) + enclose_wh = (enclose_x2y2 - enclose_x1y1).clamp(min=0) + + cw = enclose_wh[:, 0] + ch = enclose_wh[:, 1] + + c2 = cw**2 + ch**2 + eps + + b1_x1, b1_y1 = pred[:, 0], pred[:, 1] + b1_x2, b1_y2 = pred[:, 2], pred[:, 3] + b2_x1, b2_y1 = target[:, 0], target[:, 1] + b2_x2, b2_y2 = target[:, 2], target[:, 3] + + left = ((b2_x1 + b2_x2) - (b1_x1 + b1_x2))**2 / 4 + right = ((b2_y1 + b2_y2) - (b1_y1 + b1_y2))**2 / 4 + rho2 = left + right + + # DIoU + dious = ious - rho2 / c2 + loss = 1 - dious + return loss + + +@mmcv.jit(derivate=True, coderize=True) +@weighted_loss +def ciou_loss(pred, target, eps=1e-7): + r"""`Implementation of paper `Enhancing Geometric Factors into + Model Learning and Inference for Object Detection and Instance + Segmentation `_. + + Code is modified from https://github.com/Zzh-tju/CIoU. + + Args: + pred (Tensor): Predicted bboxes of format (x1, y1, x2, y2), + shape (n, 4). + target (Tensor): Corresponding gt bboxes, shape (n, 4). + eps (float): Eps to avoid log(0). + Return: + Tensor: Loss tensor. + """ + # overlap + lt = torch.max(pred[:, :2], target[:, :2]) + rb = torch.min(pred[:, 2:], target[:, 2:]) + wh = (rb - lt).clamp(min=0) + overlap = wh[:, 0] * wh[:, 1] + + # union + ap = (pred[:, 2] - pred[:, 0]) * (pred[:, 3] - pred[:, 1]) + ag = (target[:, 2] - target[:, 0]) * (target[:, 3] - target[:, 1]) + union = ap + ag - overlap + eps + + # IoU + ious = overlap / union + + # enclose area + enclose_x1y1 = torch.min(pred[:, :2], target[:, :2]) + enclose_x2y2 = torch.max(pred[:, 2:], target[:, 2:]) + enclose_wh = (enclose_x2y2 - enclose_x1y1).clamp(min=0) + + cw = enclose_wh[:, 0] + ch = enclose_wh[:, 1] + + c2 = cw**2 + ch**2 + eps + + b1_x1, b1_y1 = pred[:, 0], pred[:, 1] + b1_x2, b1_y2 = pred[:, 2], pred[:, 3] + b2_x1, b2_y1 = target[:, 0], target[:, 1] + b2_x2, b2_y2 = target[:, 2], target[:, 3] + + w1, h1 = b1_x2 - b1_x1, b1_y2 - b1_y1 + eps + w2, h2 = b2_x2 - b2_x1, b2_y2 - b2_y1 + eps + + left = ((b2_x1 + b2_x2) - (b1_x1 + b1_x2))**2 / 4 + right = ((b2_y1 + b2_y2) - (b1_y1 + b1_y2))**2 / 4 + rho2 = left + right + + factor = 4 / math.pi**2 + v = factor * torch.pow(torch.atan(w2 / h2) - torch.atan(w1 / h1), 2) + + with torch.no_grad(): + alpha = (ious > 0.5).float() * v / (1 - ious + v) + + # CIoU + cious = ious - (rho2 / c2 + alpha * v) + loss = 1 - cious.clamp(min=-1.0, max=1.0) + return loss + + +@LOSSES.register_module() +class IoULoss(nn.Module): + """IoULoss. + + Computing the IoU loss between a set of predicted bboxes and target bboxes. + + Args: + linear (bool): If True, use linear scale of loss else determined + by mode. Default: False. + eps (float): Eps to avoid log(0). + reduction (str): Options are "none", "mean" and "sum". + loss_weight (float): Weight of loss. + mode (str): Loss scaling mode, including "linear", "square", and "log". + Default: 'log' + """ + + def __init__(self, + linear=False, + eps=1e-6, + reduction='mean', + loss_weight=1.0, + mode='log'): + super(IoULoss, self).__init__() + assert mode in ['linear', 'square', 'log'] + if linear: + mode = 'linear' + warnings.warn('DeprecationWarning: Setting "linear=True" in ' + 'IOULoss is deprecated, please use "mode=`linear`" ' + 'instead.') + self.mode = mode + self.linear = linear + self.eps = eps + self.reduction = reduction + self.loss_weight = loss_weight + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None, + **kwargs): + """Forward function. + + Args: + pred (torch.Tensor): The prediction. + target (torch.Tensor): The learning target of the prediction. + weight (torch.Tensor, optional): The weight of loss for each + prediction. Defaults to None. + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + reduction_override (str, optional): The reduction method used to + override the original reduction method of the loss. + Defaults to None. Options are "none", "mean" and "sum". + """ + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + if (weight is not None) and (not torch.any(weight > 0)) and ( + reduction != 'none'): + if pred.dim() == weight.dim() + 1: + weight = weight.unsqueeze(1) + return (pred * weight).sum() # 0 + if weight is not None and weight.dim() > 1: + # TODO: remove this in the future + # reduce the weight of shape (n, 4) to (n,) to match the + # iou_loss of shape (n,) + assert weight.shape == pred.shape + weight = weight.mean(-1) + loss = self.loss_weight * iou_loss( + pred, + target, + weight, + mode=self.mode, + eps=self.eps, + reduction=reduction, + avg_factor=avg_factor, + **kwargs) + return loss + + +@LOSSES.register_module() +class BoundedIoULoss(nn.Module): + + def __init__(self, beta=0.2, eps=1e-3, reduction='mean', loss_weight=1.0): + super(BoundedIoULoss, self).__init__() + self.beta = beta + self.eps = eps + self.reduction = reduction + self.loss_weight = loss_weight + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None, + **kwargs): + if weight is not None and not torch.any(weight > 0): + if pred.dim() == weight.dim() + 1: + weight = weight.unsqueeze(1) + return (pred * weight).sum() # 0 + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + loss = self.loss_weight * bounded_iou_loss( + pred, + target, + weight, + beta=self.beta, + eps=self.eps, + reduction=reduction, + avg_factor=avg_factor, + **kwargs) + return loss + + +@LOSSES.register_module() +class GIoULoss(nn.Module): + + def __init__(self, eps=1e-6, reduction='mean', loss_weight=1.0): + super(GIoULoss, self).__init__() + self.eps = eps + self.reduction = reduction + self.loss_weight = loss_weight + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None, + **kwargs): + if weight is not None and not torch.any(weight > 0): + if pred.dim() == weight.dim() + 1: + weight = weight.unsqueeze(1) + return (pred * weight).sum() # 0 + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + if weight is not None and weight.dim() > 1: + # TODO: remove this in the future + # reduce the weight of shape (n, 4) to (n,) to match the + # giou_loss of shape (n,) + assert weight.shape == pred.shape + weight = weight.mean(-1) + loss = self.loss_weight * giou_loss( + pred, + target, + weight, + eps=self.eps, + reduction=reduction, + avg_factor=avg_factor, + **kwargs) + return loss + + +@LOSSES.register_module() +class DIoULoss(nn.Module): + + def __init__(self, eps=1e-6, reduction='mean', loss_weight=1.0): + super(DIoULoss, self).__init__() + self.eps = eps + self.reduction = reduction + self.loss_weight = loss_weight + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None, + **kwargs): + if weight is not None and not torch.any(weight > 0): + if pred.dim() == weight.dim() + 1: + weight = weight.unsqueeze(1) + return (pred * weight).sum() # 0 + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + if weight is not None and weight.dim() > 1: + # TODO: remove this in the future + # reduce the weight of shape (n, 4) to (n,) to match the + # giou_loss of shape (n,) + assert weight.shape == pred.shape + weight = weight.mean(-1) + loss = self.loss_weight * diou_loss( + pred, + target, + weight, + eps=self.eps, + reduction=reduction, + avg_factor=avg_factor, + **kwargs) + return loss + + +@LOSSES.register_module() +class CIoULoss(nn.Module): + + def __init__(self, eps=1e-6, reduction='mean', loss_weight=1.0): + super(CIoULoss, self).__init__() + self.eps = eps + self.reduction = reduction + self.loss_weight = loss_weight + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None, + **kwargs): + if weight is not None and not torch.any(weight > 0): + if pred.dim() == weight.dim() + 1: + weight = weight.unsqueeze(1) + return (pred * weight).sum() # 0 + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + if weight is not None and weight.dim() > 1: + # TODO: remove this in the future + # reduce the weight of shape (n, 4) to (n,) to match the + # giou_loss of shape (n,) + assert weight.shape == pred.shape + weight = weight.mean(-1) + loss = self.loss_weight * ciou_loss( + pred, + target, + weight, + eps=self.eps, + reduction=reduction, + avg_factor=avg_factor, + **kwargs) + return loss diff --git a/mmdet/models/losses/kd_loss.py b/mmdet/models/losses/kd_loss.py new file mode 100644 index 0000000..75c1935 --- /dev/null +++ b/mmdet/models/losses/kd_loss.py @@ -0,0 +1,88 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch.nn as nn +import torch.nn.functional as F + +from ..builder import LOSSES +from .utils import weighted_loss + + +@mmcv.jit(derivate=True, coderize=True) +@weighted_loss +def knowledge_distillation_kl_div_loss(pred, + soft_label, + T, + detach_target=True): + r"""Loss function for knowledge distilling using KL divergence. + + Args: + pred (Tensor): Predicted logits with shape (N, n + 1). + soft_label (Tensor): Target logits with shape (N, N + 1). + T (int): Temperature for distillation. + detach_target (bool): Remove soft_label from automatic differentiation + + Returns: + torch.Tensor: Loss tensor with shape (N,). + """ + assert pred.size() == soft_label.size() + target = F.softmax(soft_label / T, dim=1) + if detach_target: + target = target.detach() + + kd_loss = F.kl_div( + F.log_softmax(pred / T, dim=1), target, reduction='none').mean(1) * ( + T * T) + + return kd_loss + + +@LOSSES.register_module() +class KnowledgeDistillationKLDivLoss(nn.Module): + """Loss function for knowledge distilling using KL divergence. + + Args: + reduction (str): Options are `'none'`, `'mean'` and `'sum'`. + loss_weight (float): Loss weight of current loss. + T (int): Temperature for distillation. + """ + + def __init__(self, reduction='mean', loss_weight=1.0, T=10): + super(KnowledgeDistillationKLDivLoss, self).__init__() + assert T >= 1 + self.reduction = reduction + self.loss_weight = loss_weight + self.T = T + + def forward(self, + pred, + soft_label, + weight=None, + avg_factor=None, + reduction_override=None): + """Forward function. + + Args: + pred (Tensor): Predicted logits with shape (N, n + 1). + soft_label (Tensor): Target logits with shape (N, N + 1). + weight (torch.Tensor, optional): The weight of loss for each + prediction. Defaults to None. + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + reduction_override (str, optional): The reduction method used to + override the original reduction method of the loss. + Defaults to None. + """ + assert reduction_override in (None, 'none', 'mean', 'sum') + + reduction = ( + reduction_override if reduction_override else self.reduction) + + loss_kd = self.loss_weight * knowledge_distillation_kl_div_loss( + pred, + soft_label, + weight, + reduction=reduction, + avg_factor=avg_factor, + T=self.T) + + return loss_kd diff --git a/mmdet/models/losses/mse_loss.py b/mmdet/models/losses/mse_loss.py new file mode 100644 index 0000000..2ebd161 --- /dev/null +++ b/mmdet/models/losses/mse_loss.py @@ -0,0 +1,57 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +import torch.nn.functional as F + +from ..builder import LOSSES +from .utils import weighted_loss + + +@weighted_loss +def mse_loss(pred, target): + """Wrapper of mse loss.""" + return F.mse_loss(pred, target, reduction='none') + + +@LOSSES.register_module() +class MSELoss(nn.Module): + """MSELoss. + + Args: + reduction (str, optional): The method that reduces the loss to a + scalar. Options are "none", "mean" and "sum". + loss_weight (float, optional): The weight of the loss. Defaults to 1.0 + """ + + def __init__(self, reduction='mean', loss_weight=1.0): + super().__init__() + self.reduction = reduction + self.loss_weight = loss_weight + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None): + """Forward function of loss. + + Args: + pred (torch.Tensor): The prediction. + target (torch.Tensor): The learning target of the prediction. + weight (torch.Tensor, optional): Weight of the loss for each + prediction. Defaults to None. + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + reduction_override (str, optional): The reduction method used to + override the original reduction method of the loss. + Defaults to None. + + Returns: + torch.Tensor: The calculated loss + """ + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + loss = self.loss_weight * mse_loss( + pred, target, weight, reduction=reduction, avg_factor=avg_factor) + return loss diff --git a/mmdet/models/losses/pisa_loss.py b/mmdet/models/losses/pisa_loss.py new file mode 100644 index 0000000..6afea0e --- /dev/null +++ b/mmdet/models/losses/pisa_loss.py @@ -0,0 +1,184 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch + +from mmdet.core import bbox_overlaps + + +@mmcv.jit(derivate=True, coderize=True) +def isr_p(cls_score, + bbox_pred, + bbox_targets, + rois, + sampling_results, + loss_cls, + bbox_coder, + k=2, + bias=0, + num_class=80): + """Importance-based Sample Reweighting (ISR_P), positive part. + + Args: + cls_score (Tensor): Predicted classification scores. + bbox_pred (Tensor): Predicted bbox deltas. + bbox_targets (tuple[Tensor]): A tuple of bbox targets, the are + labels, label_weights, bbox_targets, bbox_weights, respectively. + rois (Tensor): Anchors (single_stage) in shape (n, 4) or RoIs + (two_stage) in shape (n, 5). + sampling_results (obj): Sampling results. + loss_cls (func): Classification loss func of the head. + bbox_coder (obj): BBox coder of the head. + k (float): Power of the non-linear mapping. + bias (float): Shift of the non-linear mapping. + num_class (int): Number of classes, default: 80. + + Return: + tuple([Tensor]): labels, imp_based_label_weights, bbox_targets, + bbox_target_weights + """ + + labels, label_weights, bbox_targets, bbox_weights = bbox_targets + pos_label_inds = ((labels >= 0) & + (labels < num_class)).nonzero().reshape(-1) + pos_labels = labels[pos_label_inds] + + # if no positive samples, return the original targets + num_pos = float(pos_label_inds.size(0)) + if num_pos == 0: + return labels, label_weights, bbox_targets, bbox_weights + + # merge pos_assigned_gt_inds of per image to a single tensor + gts = list() + last_max_gt = 0 + for i in range(len(sampling_results)): + gt_i = sampling_results[i].pos_assigned_gt_inds + gts.append(gt_i + last_max_gt) + if len(gt_i) != 0: + last_max_gt = gt_i.max() + 1 + gts = torch.cat(gts) + assert len(gts) == num_pos + + cls_score = cls_score.detach() + bbox_pred = bbox_pred.detach() + + # For single stage detectors, rois here indicate anchors, in shape (N, 4) + # For two stage detectors, rois are in shape (N, 5) + if rois.size(-1) == 5: + pos_rois = rois[pos_label_inds][:, 1:] + else: + pos_rois = rois[pos_label_inds] + + if bbox_pred.size(-1) > 4: + bbox_pred = bbox_pred.view(bbox_pred.size(0), -1, 4) + pos_delta_pred = bbox_pred[pos_label_inds, pos_labels].view(-1, 4) + else: + pos_delta_pred = bbox_pred[pos_label_inds].view(-1, 4) + + # compute iou of the predicted bbox and the corresponding GT + pos_delta_target = bbox_targets[pos_label_inds].view(-1, 4) + pos_bbox_pred = bbox_coder.decode(pos_rois, pos_delta_pred) + target_bbox_pred = bbox_coder.decode(pos_rois, pos_delta_target) + ious = bbox_overlaps(pos_bbox_pred, target_bbox_pred, is_aligned=True) + + pos_imp_weights = label_weights[pos_label_inds] + # Two steps to compute IoU-HLR. Samples are first sorted by IoU locally, + # then sorted again within the same-rank group + max_l_num = pos_labels.bincount().max() + for label in pos_labels.unique(): + l_inds = (pos_labels == label).nonzero().view(-1) + l_gts = gts[l_inds] + for t in l_gts.unique(): + t_inds = l_inds[l_gts == t] + t_ious = ious[t_inds] + _, t_iou_rank_idx = t_ious.sort(descending=True) + _, t_iou_rank = t_iou_rank_idx.sort() + ious[t_inds] += max_l_num - t_iou_rank.float() + l_ious = ious[l_inds] + _, l_iou_rank_idx = l_ious.sort(descending=True) + _, l_iou_rank = l_iou_rank_idx.sort() # IoU-HLR + # linearly map HLR to label weights + pos_imp_weights[l_inds] *= (max_l_num - l_iou_rank.float()) / max_l_num + + pos_imp_weights = (bias + pos_imp_weights * (1 - bias)).pow(k) + + # normalize to make the new weighted loss value equal to the original loss + pos_loss_cls = loss_cls( + cls_score[pos_label_inds], pos_labels, reduction_override='none') + if pos_loss_cls.dim() > 1: + ori_pos_loss_cls = pos_loss_cls * label_weights[pos_label_inds][:, + None] + new_pos_loss_cls = pos_loss_cls * pos_imp_weights[:, None] + else: + ori_pos_loss_cls = pos_loss_cls * label_weights[pos_label_inds] + new_pos_loss_cls = pos_loss_cls * pos_imp_weights + pos_loss_cls_ratio = ori_pos_loss_cls.sum() / new_pos_loss_cls.sum() + pos_imp_weights = pos_imp_weights * pos_loss_cls_ratio + label_weights[pos_label_inds] = pos_imp_weights + + bbox_targets = labels, label_weights, bbox_targets, bbox_weights + return bbox_targets + + +@mmcv.jit(derivate=True, coderize=True) +def carl_loss(cls_score, + labels, + bbox_pred, + bbox_targets, + loss_bbox, + k=1, + bias=0.2, + avg_factor=None, + sigmoid=False, + num_class=80): + """Classification-Aware Regression Loss (CARL). + + Args: + cls_score (Tensor): Predicted classification scores. + labels (Tensor): Targets of classification. + bbox_pred (Tensor): Predicted bbox deltas. + bbox_targets (Tensor): Target of bbox regression. + loss_bbox (func): Regression loss func of the head. + bbox_coder (obj): BBox coder of the head. + k (float): Power of the non-linear mapping. + bias (float): Shift of the non-linear mapping. + avg_factor (int): Average factor used in regression loss. + sigmoid (bool): Activation of the classification score. + num_class (int): Number of classes, default: 80. + + Return: + dict: CARL loss dict. + """ + pos_label_inds = ((labels >= 0) & + (labels < num_class)).nonzero().reshape(-1) + if pos_label_inds.numel() == 0: + return dict(loss_carl=cls_score.sum()[None] * 0.) + pos_labels = labels[pos_label_inds] + + # multiply pos_cls_score with the corresponding bbox weight + # and remain gradient + if sigmoid: + pos_cls_score = cls_score.sigmoid()[pos_label_inds, pos_labels] + else: + pos_cls_score = cls_score.softmax(-1)[pos_label_inds, pos_labels] + carl_loss_weights = (bias + (1 - bias) * pos_cls_score).pow(k) + + # normalize carl_loss_weight to make its sum equal to num positive + num_pos = float(pos_cls_score.size(0)) + weight_ratio = num_pos / carl_loss_weights.sum() + carl_loss_weights *= weight_ratio + + if avg_factor is None: + avg_factor = bbox_targets.size(0) + # if is class agnostic, bbox pred is in shape (N, 4) + # otherwise, bbox pred is in shape (N, #classes, 4) + if bbox_pred.size(-1) > 4: + bbox_pred = bbox_pred.view(bbox_pred.size(0), -1, 4) + pos_bbox_preds = bbox_pred[pos_label_inds, pos_labels] + else: + pos_bbox_preds = bbox_pred[pos_label_inds] + ori_loss_reg = loss_bbox( + pos_bbox_preds, + bbox_targets[pos_label_inds], + reduction_override='none') / avg_factor + loss_carl = (ori_loss_reg * carl_loss_weights[:, None]).sum() + return dict(loss_carl=loss_carl[None]) diff --git a/mmdet/models/losses/seesaw_loss.py b/mmdet/models/losses/seesaw_loss.py new file mode 100644 index 0000000..0104047 --- /dev/null +++ b/mmdet/models/losses/seesaw_loss.py @@ -0,0 +1,262 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F + +from ..builder import LOSSES +from .accuracy import accuracy +from .cross_entropy_loss import cross_entropy +from .utils import weight_reduce_loss + + +def seesaw_ce_loss(cls_score, + labels, + label_weights, + cum_samples, + num_classes, + p, + q, + eps, + reduction='mean', + avg_factor=None): + """Calculate the Seesaw CrossEntropy loss. + + Args: + cls_score (torch.Tensor): The prediction with shape (N, C), + C is the number of classes. + labels (torch.Tensor): The learning label of the prediction. + label_weights (torch.Tensor): Sample-wise loss weight. + cum_samples (torch.Tensor): Cumulative samples for each category. + num_classes (int): The number of classes. + p (float): The ``p`` in the mitigation factor. + q (float): The ``q`` in the compenstation factor. + eps (float): The minimal value of divisor to smooth + the computation of compensation factor + reduction (str, optional): The method used to reduce the loss. + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + + Returns: + torch.Tensor: The calculated loss + """ + assert cls_score.size(-1) == num_classes + assert len(cum_samples) == num_classes + + onehot_labels = F.one_hot(labels, num_classes) + seesaw_weights = cls_score.new_ones(onehot_labels.size()) + + # mitigation factor + if p > 0: + sample_ratio_matrix = cum_samples[None, :].clamp( + min=1) / cum_samples[:, None].clamp(min=1) + index = (sample_ratio_matrix < 1.0).float() + sample_weights = sample_ratio_matrix.pow(p) * index + (1 - index) + mitigation_factor = sample_weights[labels.long(), :] + seesaw_weights = seesaw_weights * mitigation_factor + + # compensation factor + if q > 0: + scores = F.softmax(cls_score.detach(), dim=1) + self_scores = scores[ + torch.arange(0, len(scores)).to(scores.device).long(), + labels.long()] + score_matrix = scores / self_scores[:, None].clamp(min=eps) + index = (score_matrix > 1.0).float() + compensation_factor = score_matrix.pow(q) * index + (1 - index) + seesaw_weights = seesaw_weights * compensation_factor + + cls_score = cls_score + (seesaw_weights.log() * (1 - onehot_labels)) + + loss = F.cross_entropy(cls_score, labels, weight=None, reduction='none') + + if label_weights is not None: + label_weights = label_weights.float() + loss = weight_reduce_loss( + loss, weight=label_weights, reduction=reduction, avg_factor=avg_factor) + return loss + + +@LOSSES.register_module() +class SeesawLoss(nn.Module): + """ + Seesaw Loss for Long-Tailed Instance Segmentation (CVPR 2021) + arXiv: https://arxiv.org/abs/2008.10032 + + Args: + use_sigmoid (bool, optional): Whether the prediction uses sigmoid + of softmax. Only False is supported. + p (float, optional): The ``p`` in the mitigation factor. + Defaults to 0.8. + q (float, optional): The ``q`` in the compenstation factor. + Defaults to 2.0. + num_classes (int, optional): The number of classes. + Default to 1203 for LVIS v1 dataset. + eps (float, optional): The minimal value of divisor to smooth + the computation of compensation factor + reduction (str, optional): The method that reduces the loss to a + scalar. Options are "none", "mean" and "sum". + loss_weight (float, optional): The weight of the loss. Defaults to 1.0 + return_dict (bool, optional): Whether return the losses as a dict. + Default to True. + """ + + def __init__(self, + use_sigmoid=False, + p=0.8, + q=2.0, + num_classes=1203, + eps=1e-2, + reduction='mean', + loss_weight=1.0, + return_dict=True): + super(SeesawLoss, self).__init__() + assert not use_sigmoid + self.use_sigmoid = False + self.p = p + self.q = q + self.num_classes = num_classes + self.eps = eps + self.reduction = reduction + self.loss_weight = loss_weight + self.return_dict = return_dict + + # 0 for pos, 1 for neg + self.cls_criterion = seesaw_ce_loss + + # cumulative samples for each category + self.register_buffer( + 'cum_samples', + torch.zeros(self.num_classes + 1, dtype=torch.float)) + + # custom output channels of the classifier + self.custom_cls_channels = True + # custom activation of cls_score + self.custom_activation = True + # custom accuracy of the classsifier + self.custom_accuracy = True + + def _split_cls_score(self, cls_score): + # split cls_score to cls_score_classes and cls_score_objectness + assert cls_score.size(-1) == self.num_classes + 2 + cls_score_classes = cls_score[..., :-2] + cls_score_objectness = cls_score[..., -2:] + return cls_score_classes, cls_score_objectness + + def get_cls_channels(self, num_classes): + """Get custom classification channels. + + Args: + num_classes (int): The number of classes. + + Returns: + int: The custom classification channels. + """ + assert num_classes == self.num_classes + return num_classes + 2 + + def get_activation(self, cls_score): + """Get custom activation of cls_score. + + Args: + cls_score (torch.Tensor): The prediction with shape (N, C + 2). + + Returns: + torch.Tensor: The custom activation of cls_score with shape + (N, C + 1). + """ + cls_score_classes, cls_score_objectness = self._split_cls_score( + cls_score) + score_classes = F.softmax(cls_score_classes, dim=-1) + score_objectness = F.softmax(cls_score_objectness, dim=-1) + score_pos = score_objectness[..., [0]] + score_neg = score_objectness[..., [1]] + score_classes = score_classes * score_pos + scores = torch.cat([score_classes, score_neg], dim=-1) + return scores + + def get_accuracy(self, cls_score, labels): + """Get custom accuracy w.r.t. cls_score and labels. + + Args: + cls_score (torch.Tensor): The prediction with shape (N, C + 2). + labels (torch.Tensor): The learning label of the prediction. + + Returns: + Dict [str, torch.Tensor]: The accuracy for objectness and classes, + respectively. + """ + pos_inds = labels < self.num_classes + obj_labels = (labels == self.num_classes).long() + cls_score_classes, cls_score_objectness = self._split_cls_score( + cls_score) + acc_objectness = accuracy(cls_score_objectness, obj_labels) + acc_classes = accuracy(cls_score_classes[pos_inds], labels[pos_inds]) + acc = dict() + acc['acc_objectness'] = acc_objectness + acc['acc_classes'] = acc_classes + return acc + + def forward(self, + cls_score, + labels, + label_weights=None, + avg_factor=None, + reduction_override=None): + """Forward function. + + Args: + cls_score (torch.Tensor): The prediction with shape (N, C + 2). + labels (torch.Tensor): The learning label of the prediction. + label_weights (torch.Tensor, optional): Sample-wise loss weight. + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + reduction (str, optional): The method used to reduce the loss. + Options are "none", "mean" and "sum". + Returns: + torch.Tensor | Dict [str, torch.Tensor]: + if return_dict == False: The calculated loss | + if return_dict == True: The dict of calculated losses + for objectness and classes, respectively. + """ + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + assert cls_score.size(-1) == self.num_classes + 2 + pos_inds = labels < self.num_classes + # 0 for pos, 1 for neg + obj_labels = (labels == self.num_classes).long() + + # accumulate the samples for each category + unique_labels = labels.unique() + for u_l in unique_labels: + inds_ = labels == u_l.item() + self.cum_samples[u_l] += inds_.sum() + + if label_weights is not None: + label_weights = label_weights.float() + else: + label_weights = labels.new_ones(labels.size(), dtype=torch.float) + + cls_score_classes, cls_score_objectness = self._split_cls_score( + cls_score) + # calculate loss_cls_classes (only need pos samples) + if pos_inds.sum() > 0: + loss_cls_classes = self.loss_weight * self.cls_criterion( + cls_score_classes[pos_inds], labels[pos_inds], + label_weights[pos_inds], self.cum_samples[:self.num_classes], + self.num_classes, self.p, self.q, self.eps, reduction, + avg_factor) + else: + loss_cls_classes = cls_score_classes[pos_inds].sum() + # calculate loss_cls_objectness + loss_cls_objectness = self.loss_weight * cross_entropy( + cls_score_objectness, obj_labels, label_weights, reduction, + avg_factor) + + if self.return_dict: + loss_cls = dict() + loss_cls['loss_cls_objectness'] = loss_cls_objectness + loss_cls['loss_cls_classes'] = loss_cls_classes + else: + loss_cls = loss_cls_classes + loss_cls_objectness + return loss_cls diff --git a/mmdet/models/losses/smooth_l1_loss.py b/mmdet/models/losses/smooth_l1_loss.py new file mode 100644 index 0000000..5511746 --- /dev/null +++ b/mmdet/models/losses/smooth_l1_loss.py @@ -0,0 +1,146 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch +import torch.nn as nn + +from ..builder import LOSSES +from .utils import weighted_loss + + +@mmcv.jit(derivate=True, coderize=True) +@weighted_loss +def smooth_l1_loss(pred, target, beta=1.0): + """Smooth L1 loss. + + Args: + pred (torch.Tensor): The prediction. + target (torch.Tensor): The learning target of the prediction. + beta (float, optional): The threshold in the piecewise function. + Defaults to 1.0. + + Returns: + torch.Tensor: Calculated loss + """ + assert beta > 0 + if target.numel() == 0: + return pred.sum() * 0 + + assert pred.size() == target.size() + diff = torch.abs(pred - target) + loss = torch.where(diff < beta, 0.5 * diff * diff / beta, + diff - 0.5 * beta) + return loss + + +@mmcv.jit(derivate=True, coderize=True) +@weighted_loss +def l1_loss(pred, target): + """L1 loss. + + Args: + pred (torch.Tensor): The prediction. + target (torch.Tensor): The learning target of the prediction. + + Returns: + torch.Tensor: Calculated loss + """ + if target.numel() == 0: + return pred.sum() * 0 + + assert pred.size() == target.size() + loss = torch.abs(pred - target) + return loss + + +@LOSSES.register_module() +class SmoothL1Loss(nn.Module): + """Smooth L1 loss. + + Args: + beta (float, optional): The threshold in the piecewise function. + Defaults to 1.0. + reduction (str, optional): The method to reduce the loss. + Options are "none", "mean" and "sum". Defaults to "mean". + loss_weight (float, optional): The weight of loss. + """ + + def __init__(self, beta=1.0, reduction='mean', loss_weight=1.0): + super(SmoothL1Loss, self).__init__() + self.beta = beta + self.reduction = reduction + self.loss_weight = loss_weight + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None, + **kwargs): + """Forward function. + + Args: + pred (torch.Tensor): The prediction. + target (torch.Tensor): The learning target of the prediction. + weight (torch.Tensor, optional): The weight of loss for each + prediction. Defaults to None. + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + reduction_override (str, optional): The reduction method used to + override the original reduction method of the loss. + Defaults to None. + """ + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + loss_bbox = self.loss_weight * smooth_l1_loss( + pred, + target, + weight, + beta=self.beta, + reduction=reduction, + avg_factor=avg_factor, + **kwargs) + return loss_bbox + + +@LOSSES.register_module() +class L1Loss(nn.Module): + """L1 loss. + + Args: + reduction (str, optional): The method to reduce the loss. + Options are "none", "mean" and "sum". + loss_weight (float, optional): The weight of loss. + """ + + def __init__(self, reduction='mean', loss_weight=1.0): + super(L1Loss, self).__init__() + self.reduction = reduction + self.loss_weight = loss_weight + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None): + """Forward function. + + Args: + pred (torch.Tensor): The prediction. + target (torch.Tensor): The learning target of the prediction. + weight (torch.Tensor, optional): The weight of loss for each + prediction. Defaults to None. + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + reduction_override (str, optional): The reduction method used to + override the original reduction method of the loss. + Defaults to None. + """ + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + loss_bbox = self.loss_weight * l1_loss( + pred, target, weight, reduction=reduction, avg_factor=avg_factor) + return loss_bbox diff --git a/mmdet/models/losses/utils.py b/mmdet/models/losses/utils.py new file mode 100644 index 0000000..778237e --- /dev/null +++ b/mmdet/models/losses/utils.py @@ -0,0 +1,105 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import functools + +import mmcv +import torch +import torch.nn.functional as F + + +def reduce_loss(loss, reduction): + """Reduce loss as specified. + + Args: + loss (Tensor): Elementwise loss tensor. + reduction (str): Options are "none", "mean" and "sum". + + Return: + Tensor: Reduced loss tensor. + """ + reduction_enum = F._Reduction.get_enum(reduction) + # none: 0, elementwise_mean:1, sum: 2 + if reduction_enum == 0: + return loss + elif reduction_enum == 1: + return loss.mean() + elif reduction_enum == 2: + return loss.sum() + + +@mmcv.jit(derivate=True, coderize=True) +def weight_reduce_loss(loss, weight=None, reduction='mean', avg_factor=None): + """Apply element-wise weight and reduce loss. + + Args: + loss (Tensor): Element-wise loss. + weight (Tensor): Element-wise weights. + reduction (str): Same as built-in losses of PyTorch. + avg_factor (float): Average factor when computing the mean of losses. + + Returns: + Tensor: Processed loss values. + """ + # if weight is specified, apply element-wise weight + if weight is not None: + loss = loss * weight + + # if avg_factor is not specified, just reduce the loss + if avg_factor is None: + loss = reduce_loss(loss, reduction) + else: + # if reduction is mean, then average the loss by avg_factor + if reduction == 'mean': + # Avoid causing ZeroDivisionError when avg_factor is 0.0, + # i.e., all labels of an image belong to ignore index. + eps = torch.finfo(torch.float32).eps + loss = loss.sum() / (avg_factor + eps) + # if reduction is 'none', then do nothing, otherwise raise an error + elif reduction != 'none': + raise ValueError('avg_factor can not be used with reduction="sum"') + return loss + + +def weighted_loss(loss_func): + """Create a weighted version of a given loss function. + + To use this decorator, the loss function must have the signature like + `loss_func(pred, target, **kwargs)`. The function only needs to compute + element-wise loss without any reduction. This decorator will add weight + and reduction arguments to the function. The decorated function will have + the signature like `loss_func(pred, target, weight=None, reduction='mean', + avg_factor=None, **kwargs)`. + + :Example: + + >>> import torch + >>> @weighted_loss + >>> def l1_loss(pred, target): + >>> return (pred - target).abs() + + >>> pred = torch.Tensor([0, 2, 3]) + >>> target = torch.Tensor([1, 1, 1]) + >>> weight = torch.Tensor([1, 0, 1]) + + >>> l1_loss(pred, target) + tensor(1.3333) + >>> l1_loss(pred, target, weight) + tensor(1.) + >>> l1_loss(pred, target, reduction='none') + tensor([1., 1., 2.]) + >>> l1_loss(pred, target, weight, avg_factor=2) + tensor(1.5000) + """ + + @functools.wraps(loss_func) + def wrapper(pred, + target, + weight=None, + reduction='mean', + avg_factor=None, + **kwargs): + # get element-wise loss + loss = loss_func(pred, target, **kwargs) + loss = weight_reduce_loss(loss, weight, reduction, avg_factor) + return loss + + return wrapper diff --git a/mmdet/models/losses/varifocal_loss.py b/mmdet/models/losses/varifocal_loss.py new file mode 100644 index 0000000..42f0eef --- /dev/null +++ b/mmdet/models/losses/varifocal_loss.py @@ -0,0 +1,134 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch.nn as nn +import torch.nn.functional as F + +from ..builder import LOSSES +from .utils import weight_reduce_loss + + +@mmcv.jit(derivate=True, coderize=True) +def varifocal_loss(pred, + target, + weight=None, + alpha=0.75, + gamma=2.0, + iou_weighted=True, + reduction='mean', + avg_factor=None): + """`Varifocal Loss `_ + + Args: + pred (torch.Tensor): The prediction with shape (N, C), C is the + number of classes + target (torch.Tensor): The learning target of the iou-aware + classification score with shape (N, C), C is the number of classes. + weight (torch.Tensor, optional): The weight of loss for each + prediction. Defaults to None. + alpha (float, optional): A balance factor for the negative part of + Varifocal Loss, which is different from the alpha of Focal Loss. + Defaults to 0.75. + gamma (float, optional): The gamma for calculating the modulating + factor. Defaults to 2.0. + iou_weighted (bool, optional): Whether to weight the loss of the + positive example with the iou target. Defaults to True. + reduction (str, optional): The method used to reduce the loss into + a scalar. Defaults to 'mean'. Options are "none", "mean" and + "sum". + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + """ + # pred and target should be of the same size + assert pred.size() == target.size() + pred_sigmoid = pred.sigmoid() + target = target.type_as(pred) + if iou_weighted: + focal_weight = target * (target > 0.0).float() + \ + alpha * (pred_sigmoid - target).abs().pow(gamma) * \ + (target <= 0.0).float() + else: + focal_weight = (target > 0.0).float() + \ + alpha * (pred_sigmoid - target).abs().pow(gamma) * \ + (target <= 0.0).float() + loss = F.binary_cross_entropy_with_logits( + pred, target, reduction='none') * focal_weight + loss = weight_reduce_loss(loss, weight, reduction, avg_factor) + return loss + + +@LOSSES.register_module() +class VarifocalLoss(nn.Module): + + def __init__(self, + use_sigmoid=True, + alpha=0.75, + gamma=2.0, + iou_weighted=True, + reduction='mean', + loss_weight=1.0): + """`Varifocal Loss `_ + + Args: + use_sigmoid (bool, optional): Whether the prediction is + used for sigmoid or softmax. Defaults to True. + alpha (float, optional): A balance factor for the negative part of + Varifocal Loss, which is different from the alpha of Focal + Loss. Defaults to 0.75. + gamma (float, optional): The gamma for calculating the modulating + factor. Defaults to 2.0. + iou_weighted (bool, optional): Whether to weight the loss of the + positive examples with the iou target. Defaults to True. + reduction (str, optional): The method used to reduce the loss into + a scalar. Defaults to 'mean'. Options are "none", "mean" and + "sum". + loss_weight (float, optional): Weight of loss. Defaults to 1.0. + """ + super(VarifocalLoss, self).__init__() + assert use_sigmoid is True, \ + 'Only sigmoid varifocal loss supported now.' + assert alpha >= 0.0 + self.use_sigmoid = use_sigmoid + self.alpha = alpha + self.gamma = gamma + self.iou_weighted = iou_weighted + self.reduction = reduction + self.loss_weight = loss_weight + + def forward(self, + pred, + target, + weight=None, + avg_factor=None, + reduction_override=None): + """Forward function. + + Args: + pred (torch.Tensor): The prediction. + target (torch.Tensor): The learning target of the prediction. + weight (torch.Tensor, optional): The weight of loss for each + prediction. Defaults to None. + avg_factor (int, optional): Average factor that is used to average + the loss. Defaults to None. + reduction_override (str, optional): The reduction method used to + override the original reduction method of the loss. + Options are "none", "mean" and "sum". + + Returns: + torch.Tensor: The calculated loss + """ + assert reduction_override in (None, 'none', 'mean', 'sum') + reduction = ( + reduction_override if reduction_override else self.reduction) + if self.use_sigmoid: + loss_cls = self.loss_weight * varifocal_loss( + pred, + target, + weight, + alpha=self.alpha, + gamma=self.gamma, + iou_weighted=self.iou_weighted, + reduction=reduction, + avg_factor=avg_factor) + else: + raise NotImplementedError + return loss_cls diff --git a/mmdet/models/necks/__init__.py b/mmdet/models/necks/__init__.py new file mode 100644 index 0000000..6f2fa82 --- /dev/null +++ b/mmdet/models/necks/__init__.py @@ -0,0 +1,23 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .bfp import BFP +from .channel_mapper import ChannelMapper +from .ct_resnet_neck import CTResNetNeck +from .dilated_encoder import DilatedEncoder +from .dyhead import DyHead +from .fpg import FPG +from .fpn import FPN +from .fpn_carafe import FPN_CARAFE +from .hrfpn import HRFPN +from .nas_fpn import NASFPN +from .nasfcos_fpn import NASFCOS_FPN +from .pafpn import PAFPN +from .rfp import RFP +from .ssd_neck import SSDNeck +from .yolo_neck import YOLOV3Neck +from .yolox_pafpn import YOLOXPAFPN + +__all__ = [ + 'FPN', 'BFP', 'ChannelMapper', 'HRFPN', 'NASFPN', 'FPN_CARAFE', 'PAFPN', + 'NASFCOS_FPN', 'RFP', 'YOLOV3Neck', 'FPG', 'DilatedEncoder', + 'CTResNetNeck', 'SSDNeck', 'YOLOXPAFPN', 'DyHead' +] diff --git a/mmdet/models/necks/bfp.py b/mmdet/models/necks/bfp.py new file mode 100644 index 0000000..9fdfa03 --- /dev/null +++ b/mmdet/models/necks/bfp.py @@ -0,0 +1,102 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn.functional as F +from mmcv.cnn import ConvModule +from mmcv.cnn.bricks import NonLocal2d +from mmcv.runner import BaseModule + +from ..builder import NECKS + + +@NECKS.register_module() +class BFP(BaseModule): + """BFP (Balanced Feature Pyramids) + + BFP takes multi-level features as inputs and gather them into a single one, + then refine the gathered feature and scatter the refined results to + multi-level features. This module is used in Libra R-CNN (CVPR 2019), see + the paper `Libra R-CNN: Towards Balanced Learning for Object Detection + `_ for details. + + Args: + in_channels (int): Number of input channels (feature maps of all levels + should have the same channels). + num_levels (int): Number of input feature levels. + conv_cfg (dict): The config dict for convolution layers. + norm_cfg (dict): The config dict for normalization layers. + refine_level (int): Index of integration and refine level of BSF in + multi-level features from bottom to top. + refine_type (str): Type of the refine op, currently support + [None, 'conv', 'non_local']. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + in_channels, + num_levels, + refine_level=2, + refine_type=None, + conv_cfg=None, + norm_cfg=None, + init_cfg=dict( + type='Xavier', layer='Conv2d', distribution='uniform')): + super(BFP, self).__init__(init_cfg) + assert refine_type in [None, 'conv', 'non_local'] + + self.in_channels = in_channels + self.num_levels = num_levels + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + + self.refine_level = refine_level + self.refine_type = refine_type + assert 0 <= self.refine_level < self.num_levels + + if self.refine_type == 'conv': + self.refine = ConvModule( + self.in_channels, + self.in_channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg) + elif self.refine_type == 'non_local': + self.refine = NonLocal2d( + self.in_channels, + reduction=1, + use_scale=False, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg) + + def forward(self, inputs): + """Forward function.""" + assert len(inputs) == self.num_levels + + # step 1: gather multi-level features by resize and average + feats = [] + gather_size = inputs[self.refine_level].size()[2:] + for i in range(self.num_levels): + if i < self.refine_level: + gathered = F.adaptive_max_pool2d( + inputs[i], output_size=gather_size) + else: + gathered = F.interpolate( + inputs[i], size=gather_size, mode='nearest') + feats.append(gathered) + + bsf = sum(feats) / len(feats) + + # step 2: refine gathered features + if self.refine_type is not None: + bsf = self.refine(bsf) + + # step 3: scatter refined features to multi-levels by a residual path + outs = [] + for i in range(self.num_levels): + out_size = inputs[i].size()[2:] + if i < self.refine_level: + residual = F.interpolate(bsf, size=out_size, mode='nearest') + else: + residual = F.adaptive_max_pool2d(bsf, output_size=out_size) + outs.append(residual + inputs[i]) + + return tuple(outs) diff --git a/mmdet/models/necks/channel_mapper.py b/mmdet/models/necks/channel_mapper.py new file mode 100644 index 0000000..774bdb1 --- /dev/null +++ b/mmdet/models/necks/channel_mapper.py @@ -0,0 +1,100 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +from mmcv.cnn import ConvModule +from mmcv.runner import BaseModule + +from ..builder import NECKS + + +@NECKS.register_module() +class ChannelMapper(BaseModule): + r"""Channel Mapper to reduce/increase channels of backbone features. + + This is used to reduce/increase channels of backbone features. + + Args: + in_channels (List[int]): Number of input channels per scale. + out_channels (int): Number of output channels (used at each scale). + kernel_size (int, optional): kernel_size for reducing channels (used + at each scale). Default: 3. + conv_cfg (dict, optional): Config dict for convolution layer. + Default: None. + norm_cfg (dict, optional): Config dict for normalization layer. + Default: None. + act_cfg (dict, optional): Config dict for activation layer in + ConvModule. Default: dict(type='ReLU'). + num_outs (int, optional): Number of output feature maps. There + would be extra_convs when num_outs larger than the length + of in_channels. + init_cfg (dict or list[dict], optional): Initialization config dict. + Example: + >>> import torch + >>> in_channels = [2, 3, 5, 7] + >>> scales = [340, 170, 84, 43] + >>> inputs = [torch.rand(1, c, s, s) + ... for c, s in zip(in_channels, scales)] + >>> self = ChannelMapper(in_channels, 11, 3).eval() + >>> outputs = self.forward(inputs) + >>> for i in range(len(outputs)): + ... print(f'outputs[{i}].shape = {outputs[i].shape}') + outputs[0].shape = torch.Size([1, 11, 340, 340]) + outputs[1].shape = torch.Size([1, 11, 170, 170]) + outputs[2].shape = torch.Size([1, 11, 84, 84]) + outputs[3].shape = torch.Size([1, 11, 43, 43]) + """ + + def __init__(self, + in_channels, + out_channels, + kernel_size=3, + conv_cfg=None, + norm_cfg=None, + act_cfg=dict(type='ReLU'), + num_outs=None, + init_cfg=dict( + type='Xavier', layer='Conv2d', distribution='uniform')): + super(ChannelMapper, self).__init__(init_cfg) + assert isinstance(in_channels, list) + self.extra_convs = None + if num_outs is None: + num_outs = len(in_channels) + self.convs = nn.ModuleList() + for in_channel in in_channels: + self.convs.append( + ConvModule( + in_channel, + out_channels, + kernel_size, + padding=(kernel_size - 1) // 2, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + if num_outs > len(in_channels): + self.extra_convs = nn.ModuleList() + for i in range(len(in_channels), num_outs): + if i == len(in_channels): + in_channel = in_channels[-1] + else: + in_channel = out_channels + self.extra_convs.append( + ConvModule( + in_channel, + out_channels, + 3, + stride=2, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + + def forward(self, inputs): + """Forward function.""" + assert len(inputs) == len(self.convs) + outs = [self.convs[i](inputs[i]) for i in range(len(inputs))] + if self.extra_convs: + for i in range(len(self.extra_convs)): + if i == 0: + outs.append(self.extra_convs[0](inputs[-1])) + else: + outs.append(self.extra_convs[i](outs[-1])) + return tuple(outs) diff --git a/mmdet/models/necks/ct_resnet_neck.py b/mmdet/models/necks/ct_resnet_neck.py new file mode 100644 index 0000000..40eb268 --- /dev/null +++ b/mmdet/models/necks/ct_resnet_neck.py @@ -0,0 +1,94 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math + +import torch.nn as nn +from mmcv.cnn import ConvModule +from mmcv.runner import BaseModule, auto_fp16 + +from mmdet.models.builder import NECKS + + +@NECKS.register_module() +class CTResNetNeck(BaseModule): + """The neck used in `CenterNet `_ for + object classification and box regression. + + Args: + in_channel (int): Number of input channels. + num_deconv_filters (tuple[int]): Number of filters per stage. + num_deconv_kernels (tuple[int]): Number of kernels per stage. + use_dcn (bool): If True, use DCNv2. Default: True. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + in_channel, + num_deconv_filters, + num_deconv_kernels, + use_dcn=True, + init_cfg=None): + super(CTResNetNeck, self).__init__(init_cfg) + assert len(num_deconv_filters) == len(num_deconv_kernels) + self.fp16_enabled = False + self.use_dcn = use_dcn + self.in_channel = in_channel + self.deconv_layers = self._make_deconv_layer(num_deconv_filters, + num_deconv_kernels) + + def _make_deconv_layer(self, num_deconv_filters, num_deconv_kernels): + """use deconv layers to upsample backbone's output.""" + layers = [] + for i in range(len(num_deconv_filters)): + feat_channel = num_deconv_filters[i] + conv_module = ConvModule( + self.in_channel, + feat_channel, + 3, + padding=1, + conv_cfg=dict(type='DCNv2') if self.use_dcn else None, + norm_cfg=dict(type='BN')) + layers.append(conv_module) + upsample_module = ConvModule( + feat_channel, + feat_channel, + num_deconv_kernels[i], + stride=2, + padding=1, + conv_cfg=dict(type='deconv'), + norm_cfg=dict(type='BN')) + layers.append(upsample_module) + self.in_channel = feat_channel + + return nn.Sequential(*layers) + + def init_weights(self): + for m in self.modules(): + if isinstance(m, nn.ConvTranspose2d): + # In order to be consistent with the source code, + # reset the ConvTranspose2d initialization parameters + m.reset_parameters() + # Simulated bilinear upsampling kernel + w = m.weight.data + f = math.ceil(w.size(2) / 2) + c = (2 * f - 1 - f % 2) / (2. * f) + for i in range(w.size(2)): + for j in range(w.size(3)): + w[0, 0, i, j] = \ + (1 - math.fabs(i / f - c)) * ( + 1 - math.fabs(j / f - c)) + for c in range(1, w.size(0)): + w[c, 0, :, :] = w[0, 0, :, :] + elif isinstance(m, nn.BatchNorm2d): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + # self.use_dcn is False + elif not self.use_dcn and isinstance(m, nn.Conv2d): + # In order to be consistent with the source code, + # reset the Conv2d initialization parameters + m.reset_parameters() + + @auto_fp16() + def forward(self, inputs): + assert isinstance(inputs, (list, tuple)) + outs = self.deconv_layers(inputs[-1]) + return outs, diff --git a/mmdet/models/necks/dilated_encoder.py b/mmdet/models/necks/dilated_encoder.py new file mode 100644 index 0000000..79a8f4b --- /dev/null +++ b/mmdet/models/necks/dilated_encoder.py @@ -0,0 +1,109 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +from mmcv.cnn import (ConvModule, caffe2_xavier_init, constant_init, is_norm, + normal_init) +from torch.nn import BatchNorm2d + +from ..builder import NECKS + + +class Bottleneck(nn.Module): + """Bottleneck block for DilatedEncoder used in `YOLOF. + + `. + + The Bottleneck contains three ConvLayers and one residual connection. + + Args: + in_channels (int): The number of input channels. + mid_channels (int): The number of middle output channels. + dilation (int): Dilation rate. + norm_cfg (dict): Dictionary to construct and config norm layer. + """ + + def __init__(self, + in_channels, + mid_channels, + dilation, + norm_cfg=dict(type='BN', requires_grad=True)): + super(Bottleneck, self).__init__() + self.conv1 = ConvModule( + in_channels, mid_channels, 1, norm_cfg=norm_cfg) + self.conv2 = ConvModule( + mid_channels, + mid_channels, + 3, + padding=dilation, + dilation=dilation, + norm_cfg=norm_cfg) + self.conv3 = ConvModule( + mid_channels, in_channels, 1, norm_cfg=norm_cfg) + + def forward(self, x): + identity = x + out = self.conv1(x) + out = self.conv2(out) + out = self.conv3(out) + out = out + identity + return out + + +@NECKS.register_module() +class DilatedEncoder(nn.Module): + """Dilated Encoder for YOLOF `. + + This module contains two types of components: + - the original FPN lateral convolution layer and fpn convolution layer, + which are 1x1 conv + 3x3 conv + - the dilated residual block + + Args: + in_channels (int): The number of input channels. + out_channels (int): The number of output channels. + block_mid_channels (int): The number of middle block output channels + num_residual_blocks (int): The number of residual blocks. + block_dilations (list): The list of residual blocks dilation. + """ + + def __init__(self, in_channels, out_channels, block_mid_channels, + num_residual_blocks, block_dilations): + super(DilatedEncoder, self).__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.block_mid_channels = block_mid_channels + self.num_residual_blocks = num_residual_blocks + self.block_dilations = block_dilations + self._init_layers() + + def _init_layers(self): + self.lateral_conv = nn.Conv2d( + self.in_channels, self.out_channels, kernel_size=1) + self.lateral_norm = BatchNorm2d(self.out_channels) + self.fpn_conv = nn.Conv2d( + self.out_channels, self.out_channels, kernel_size=3, padding=1) + self.fpn_norm = BatchNorm2d(self.out_channels) + encoder_blocks = [] + for i in range(self.num_residual_blocks): + dilation = self.block_dilations[i] + encoder_blocks.append( + Bottleneck( + self.out_channels, + self.block_mid_channels, + dilation=dilation)) + self.dilated_encoder_blocks = nn.Sequential(*encoder_blocks) + + def init_weights(self): + caffe2_xavier_init(self.lateral_conv) + caffe2_xavier_init(self.fpn_conv) + for m in [self.lateral_norm, self.fpn_norm]: + constant_init(m, 1) + for m in self.dilated_encoder_blocks.modules(): + if isinstance(m, nn.Conv2d): + normal_init(m, mean=0, std=0.01) + if is_norm(m): + constant_init(m, 1) + + def forward(self, feature): + out = self.lateral_norm(self.lateral_conv(feature[-1])) + out = self.fpn_norm(self.fpn_conv(out)) + return self.dilated_encoder_blocks(out), diff --git a/mmdet/models/necks/dyhead.py b/mmdet/models/necks/dyhead.py new file mode 100644 index 0000000..649bb4c --- /dev/null +++ b/mmdet/models/necks/dyhead.py @@ -0,0 +1,176 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import (build_activation_layer, build_norm_layer, constant_init, + normal_init) +from mmcv.ops.modulated_deform_conv import ModulatedDeformConv2d +from mmcv.runner import BaseModule + +from ..builder import NECKS +from ..utils import DyReLU + +# Reference: +# https://github.com/microsoft/DynamicHead +# https://github.com/jshilong/SEPC + + +class DyDCNv2(nn.Module): + """ModulatedDeformConv2d with normalization layer used in DyHead. + + This module cannot be configured with `conv_cfg=dict(type='DCNv2')` + because DyHead calculates offset and mask from middle-level feature. + + Args: + in_channels (int): Number of input channels. + out_channels (int): Number of output channels. + stride (int | tuple[int], optional): Stride of the convolution. + Default: 1. + norm_cfg (dict, optional): Config dict for normalization layer. + Default: dict(type='GN', num_groups=16, requires_grad=True). + """ + + def __init__(self, + in_channels, + out_channels, + stride=1, + norm_cfg=dict(type='GN', num_groups=16, requires_grad=True)): + super().__init__() + self.with_norm = norm_cfg is not None + bias = not self.with_norm + self.conv = ModulatedDeformConv2d( + in_channels, out_channels, 3, stride=stride, padding=1, bias=bias) + if self.with_norm: + self.norm = build_norm_layer(norm_cfg, out_channels)[1] + + def forward(self, x, offset, mask): + """Forward function.""" + x = self.conv(x.contiguous(), offset.contiguous(), mask) + if self.with_norm: + x = self.norm(x) + return x + + +class DyHeadBlock(nn.Module): + """DyHead Block with three types of attention. + + HSigmoid arguments in default act_cfg follow official code, not paper. + https://github.com/microsoft/DynamicHead/blob/master/dyhead/dyrelu.py + + Args: + in_channels (int): Number of input channels. + out_channels (int): Number of output channels. + zero_init_offset (bool, optional): Whether to use zero init for + `spatial_conv_offset`. Default: True. + act_cfg (dict, optional): Config dict for the last activation layer of + scale-aware attention. Default: dict(type='HSigmoid', bias=3.0, + divisor=6.0). + """ + + def __init__(self, + in_channels, + out_channels, + zero_init_offset=True, + act_cfg=dict(type='HSigmoid', bias=3.0, divisor=6.0)): + super().__init__() + self.zero_init_offset = zero_init_offset + # (offset_x, offset_y, mask) * kernel_size_y * kernel_size_x + self.offset_and_mask_dim = 3 * 3 * 3 + self.offset_dim = 2 * 3 * 3 + + self.spatial_conv_high = DyDCNv2(in_channels, out_channels) + self.spatial_conv_mid = DyDCNv2(in_channels, out_channels) + self.spatial_conv_low = DyDCNv2(in_channels, out_channels, stride=2) + self.spatial_conv_offset = nn.Conv2d( + in_channels, self.offset_and_mask_dim, 3, padding=1) + self.scale_attn_module = nn.Sequential( + nn.AdaptiveAvgPool2d(1), nn.Conv2d(out_channels, 1, 1), + nn.ReLU(inplace=True), build_activation_layer(act_cfg)) + self.task_attn_module = DyReLU(out_channels) + self._init_weights() + + def _init_weights(self): + for m in self.modules(): + if isinstance(m, nn.Conv2d): + normal_init(m, 0, 0.01) + if self.zero_init_offset: + constant_init(self.spatial_conv_offset, 0) + + def forward(self, x): + """Forward function.""" + outs = [] + for level in range(len(x)): + # calculate offset and mask of DCNv2 from middle-level feature + offset_and_mask = self.spatial_conv_offset(x[level]) + offset = offset_and_mask[:, :self.offset_dim, :, :] + mask = offset_and_mask[:, self.offset_dim:, :, :].sigmoid() + + mid_feat = self.spatial_conv_mid(x[level], offset, mask) + sum_feat = mid_feat * self.scale_attn_module(mid_feat) + summed_levels = 1 + if level > 0: + low_feat = self.spatial_conv_low(x[level - 1], offset, mask) + sum_feat = sum_feat + \ + low_feat * self.scale_attn_module(low_feat) + summed_levels += 1 + if level < len(x) - 1: + # this upsample order is weird, but faster than natural order + # https://github.com/microsoft/DynamicHead/issues/25 + high_feat = F.interpolate( + self.spatial_conv_high(x[level + 1], offset, mask), + size=x[level].shape[-2:], + mode='bilinear', + align_corners=True) + sum_feat = sum_feat + high_feat * \ + self.scale_attn_module(high_feat) + summed_levels += 1 + outs.append(self.task_attn_module(sum_feat / summed_levels)) + + return outs + + +@NECKS.register_module() +class DyHead(BaseModule): + """DyHead neck consisting of multiple DyHead Blocks. + + See `Dynamic Head: Unifying Object Detection Heads with Attentions + `_ for details. + + Args: + in_channels (int): Number of input channels. + out_channels (int): Number of output channels. + num_blocks (int, optional): Number of DyHead Blocks. Default: 6. + zero_init_offset (bool, optional): Whether to use zero init for + `spatial_conv_offset`. Default: True. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + """ + + def __init__(self, + in_channels, + out_channels, + num_blocks=6, + zero_init_offset=True, + init_cfg=None): + assert init_cfg is None, 'To prevent abnormal initialization ' \ + 'behavior, init_cfg is not allowed to be set' + super().__init__(init_cfg=init_cfg) + self.in_channels = in_channels + self.out_channels = out_channels + self.num_blocks = num_blocks + self.zero_init_offset = zero_init_offset + + dyhead_blocks = [] + for i in range(num_blocks): + in_channels = self.in_channels if i == 0 else self.out_channels + dyhead_blocks.append( + DyHeadBlock( + in_channels, + self.out_channels, + zero_init_offset=zero_init_offset)) + self.dyhead_blocks = nn.Sequential(*dyhead_blocks) + + def forward(self, inputs): + """Forward function.""" + assert isinstance(inputs, (tuple, list)) + outs = self.dyhead_blocks(inputs) + return tuple(outs) diff --git a/mmdet/models/necks/fpg.py b/mmdet/models/necks/fpg.py new file mode 100644 index 0000000..a6a2a12 --- /dev/null +++ b/mmdet/models/necks/fpg.py @@ -0,0 +1,406 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule +from mmcv.runner import BaseModule + +from ..builder import NECKS + + +class Transition(BaseModule): + """Base class for transition. + + Args: + in_channels (int): Number of input channels. + out_channels (int): Number of output channels. + """ + + def __init__(self, in_channels, out_channels, init_cfg=None): + super().__init__(init_cfg) + self.in_channels = in_channels + self.out_channels = out_channels + + def forward(x): + pass + + +class UpInterpolationConv(Transition): + """A transition used for up-sampling. + + Up-sample the input by interpolation then refines the feature by + a convolution layer. + + Args: + in_channels (int): Number of input channels. + out_channels (int): Number of output channels. + scale_factor (int): Up-sampling factor. Default: 2. + mode (int): Interpolation mode. Default: nearest. + align_corners (bool): Whether align corners when interpolation. + Default: None. + kernel_size (int): Kernel size for the conv. Default: 3. + """ + + def __init__(self, + in_channels, + out_channels, + scale_factor=2, + mode='nearest', + align_corners=None, + kernel_size=3, + init_cfg=None, + **kwargs): + super().__init__(in_channels, out_channels, init_cfg) + self.mode = mode + self.scale_factor = scale_factor + self.align_corners = align_corners + self.conv = ConvModule( + in_channels, + out_channels, + kernel_size, + padding=(kernel_size - 1) // 2, + **kwargs) + + def forward(self, x): + x = F.interpolate( + x, + scale_factor=self.scale_factor, + mode=self.mode, + align_corners=self.align_corners) + x = self.conv(x) + return x + + +class LastConv(Transition): + """A transition used for refining the output of the last stage. + + Args: + in_channels (int): Number of input channels. + out_channels (int): Number of output channels. + num_inputs (int): Number of inputs of the FPN features. + kernel_size (int): Kernel size for the conv. Default: 3. + """ + + def __init__(self, + in_channels, + out_channels, + num_inputs, + kernel_size=3, + init_cfg=None, + **kwargs): + super().__init__(in_channels, out_channels, init_cfg) + self.num_inputs = num_inputs + self.conv_out = ConvModule( + in_channels, + out_channels, + kernel_size, + padding=(kernel_size - 1) // 2, + **kwargs) + + def forward(self, inputs): + assert len(inputs) == self.num_inputs + return self.conv_out(inputs[-1]) + + +@NECKS.register_module() +class FPG(BaseModule): + """FPG. + + Implementation of `Feature Pyramid Grids (FPG) + `_. + This implementation only gives the basic structure stated in the paper. + But users can implement different type of transitions to fully explore the + the potential power of the structure of FPG. + + Args: + in_channels (int): Number of input channels (feature maps of all levels + should have the same channels). + out_channels (int): Number of output channels (used at each scale) + num_outs (int): Number of output scales. + stack_times (int): The number of times the pyramid architecture will + be stacked. + paths (list[str]): Specify the path order of each stack level. + Each element in the list should be either 'bu' (bottom-up) or + 'td' (top-down). + inter_channels (int): Number of inter channels. + same_up_trans (dict): Transition that goes down at the same stage. + same_down_trans (dict): Transition that goes up at the same stage. + across_lateral_trans (dict): Across-pathway same-stage + across_down_trans (dict): Across-pathway bottom-up connection. + across_up_trans (dict): Across-pathway top-down connection. + across_skip_trans (dict): Across-pathway skip connection. + output_trans (dict): Transition that trans the output of the + last stage. + start_level (int): Index of the start input backbone level used to + build the feature pyramid. Default: 0. + end_level (int): Index of the end input backbone level (exclusive) to + build the feature pyramid. Default: -1, which means the last level. + add_extra_convs (bool): It decides whether to add conv + layers on top of the original feature maps. Default to False. + If True, its actual mode is specified by `extra_convs_on_inputs`. + norm_cfg (dict): Config dict for normalization layer. Default: None. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + transition_types = { + 'conv': ConvModule, + 'interpolation_conv': UpInterpolationConv, + 'last_conv': LastConv, + } + + def __init__(self, + in_channels, + out_channels, + num_outs, + stack_times, + paths, + inter_channels=None, + same_down_trans=None, + same_up_trans=dict( + type='conv', kernel_size=3, stride=2, padding=1), + across_lateral_trans=dict(type='conv', kernel_size=1), + across_down_trans=dict(type='conv', kernel_size=3), + across_up_trans=None, + across_skip_trans=dict(type='identity'), + output_trans=dict(type='last_conv', kernel_size=3), + start_level=0, + end_level=-1, + add_extra_convs=False, + norm_cfg=None, + skip_inds=None, + init_cfg=[ + dict(type='Caffe2Xavier', layer='Conv2d'), + dict( + type='Constant', + layer=[ + '_BatchNorm', '_InstanceNorm', 'GroupNorm', + 'LayerNorm' + ], + val=1.0) + ]): + super(FPG, self).__init__(init_cfg) + assert isinstance(in_channels, list) + self.in_channels = in_channels + self.out_channels = out_channels + self.num_ins = len(in_channels) + self.num_outs = num_outs + if inter_channels is None: + self.inter_channels = [out_channels for _ in range(num_outs)] + elif isinstance(inter_channels, int): + self.inter_channels = [inter_channels for _ in range(num_outs)] + else: + assert isinstance(inter_channels, list) + assert len(inter_channels) == num_outs + self.inter_channels = inter_channels + self.stack_times = stack_times + self.paths = paths + assert isinstance(paths, list) and len(paths) == stack_times + for d in paths: + assert d in ('bu', 'td') + + self.same_down_trans = same_down_trans + self.same_up_trans = same_up_trans + self.across_lateral_trans = across_lateral_trans + self.across_down_trans = across_down_trans + self.across_up_trans = across_up_trans + self.output_trans = output_trans + self.across_skip_trans = across_skip_trans + + self.with_bias = norm_cfg is None + # skip inds must be specified if across skip trans is not None + if self.across_skip_trans is not None: + skip_inds is not None + self.skip_inds = skip_inds + assert len(self.skip_inds[0]) <= self.stack_times + + if end_level == -1 or end_level == self.num_ins - 1: + self.backbone_end_level = self.num_ins + assert num_outs >= self.num_ins - start_level + else: + # if end_level is not the last level, no extra level is allowed + self.backbone_end_level = end_level + 1 + assert end_level < self.num_ins + assert num_outs == end_level - start_level + 1 + self.start_level = start_level + self.end_level = end_level + self.add_extra_convs = add_extra_convs + + # build lateral 1x1 convs to reduce channels + self.lateral_convs = nn.ModuleList() + for i in range(self.start_level, self.backbone_end_level): + l_conv = nn.Conv2d(self.in_channels[i], + self.inter_channels[i - self.start_level], 1) + self.lateral_convs.append(l_conv) + + extra_levels = num_outs - self.backbone_end_level + self.start_level + self.extra_downsamples = nn.ModuleList() + for i in range(extra_levels): + if self.add_extra_convs: + fpn_idx = self.backbone_end_level - self.start_level + i + extra_conv = nn.Conv2d( + self.inter_channels[fpn_idx - 1], + self.inter_channels[fpn_idx], + 3, + stride=2, + padding=1) + self.extra_downsamples.append(extra_conv) + else: + self.extra_downsamples.append(nn.MaxPool2d(1, stride=2)) + + self.fpn_transitions = nn.ModuleList() # stack times + for s in range(self.stack_times): + stage_trans = nn.ModuleList() # num of feature levels + for i in range(self.num_outs): + # same, across_lateral, across_down, across_up + trans = nn.ModuleDict() + if s in self.skip_inds[i]: + stage_trans.append(trans) + continue + # build same-stage down trans (used in bottom-up paths) + if i == 0 or self.same_up_trans is None: + same_up_trans = None + else: + same_up_trans = self.build_trans( + self.same_up_trans, self.inter_channels[i - 1], + self.inter_channels[i]) + trans['same_up'] = same_up_trans + # build same-stage up trans (used in top-down paths) + if i == self.num_outs - 1 or self.same_down_trans is None: + same_down_trans = None + else: + same_down_trans = self.build_trans( + self.same_down_trans, self.inter_channels[i + 1], + self.inter_channels[i]) + trans['same_down'] = same_down_trans + # build across lateral trans + across_lateral_trans = self.build_trans( + self.across_lateral_trans, self.inter_channels[i], + self.inter_channels[i]) + trans['across_lateral'] = across_lateral_trans + # build across down trans + if i == self.num_outs - 1 or self.across_down_trans is None: + across_down_trans = None + else: + across_down_trans = self.build_trans( + self.across_down_trans, self.inter_channels[i + 1], + self.inter_channels[i]) + trans['across_down'] = across_down_trans + # build across up trans + if i == 0 or self.across_up_trans is None: + across_up_trans = None + else: + across_up_trans = self.build_trans( + self.across_up_trans, self.inter_channels[i - 1], + self.inter_channels[i]) + trans['across_up'] = across_up_trans + if self.across_skip_trans is None: + across_skip_trans = None + else: + across_skip_trans = self.build_trans( + self.across_skip_trans, self.inter_channels[i - 1], + self.inter_channels[i]) + trans['across_skip'] = across_skip_trans + # build across_skip trans + stage_trans.append(trans) + self.fpn_transitions.append(stage_trans) + + self.output_transition = nn.ModuleList() # output levels + for i in range(self.num_outs): + trans = self.build_trans( + self.output_trans, + self.inter_channels[i], + self.out_channels, + num_inputs=self.stack_times + 1) + self.output_transition.append(trans) + + self.relu = nn.ReLU(inplace=True) + + def build_trans(self, cfg, in_channels, out_channels, **extra_args): + cfg_ = cfg.copy() + trans_type = cfg_.pop('type') + trans_cls = self.transition_types[trans_type] + return trans_cls(in_channels, out_channels, **cfg_, **extra_args) + + def fuse(self, fuse_dict): + out = None + for item in fuse_dict.values(): + if item is not None: + if out is None: + out = item + else: + out = out + item + return out + + def forward(self, inputs): + assert len(inputs) == len(self.in_channels) + + # build all levels from original feature maps + feats = [ + lateral_conv(inputs[i + self.start_level]) + for i, lateral_conv in enumerate(self.lateral_convs) + ] + for downsample in self.extra_downsamples: + feats.append(downsample(feats[-1])) + + outs = [feats] + + for i in range(self.stack_times): + current_outs = outs[-1] + next_outs = [] + direction = self.paths[i] + for j in range(self.num_outs): + if i in self.skip_inds[j]: + next_outs.append(outs[-1][j]) + continue + # feature level + if direction == 'td': + lvl = self.num_outs - j - 1 + else: + lvl = j + # get transitions + if direction == 'td': + same_trans = self.fpn_transitions[i][lvl]['same_down'] + else: + same_trans = self.fpn_transitions[i][lvl]['same_up'] + across_lateral_trans = self.fpn_transitions[i][lvl][ + 'across_lateral'] + across_down_trans = self.fpn_transitions[i][lvl]['across_down'] + across_up_trans = self.fpn_transitions[i][lvl]['across_up'] + across_skip_trans = self.fpn_transitions[i][lvl]['across_skip'] + # init output + to_fuse = dict( + same=None, lateral=None, across_up=None, across_down=None) + # same downsample/upsample + if same_trans is not None: + to_fuse['same'] = same_trans(next_outs[-1]) + # across lateral + if across_lateral_trans is not None: + to_fuse['lateral'] = across_lateral_trans( + current_outs[lvl]) + # across downsample + if lvl > 0 and across_up_trans is not None: + to_fuse['across_up'] = across_up_trans(current_outs[lvl - + 1]) + # across upsample + if (lvl < self.num_outs - 1 and across_down_trans is not None): + to_fuse['across_down'] = across_down_trans( + current_outs[lvl + 1]) + if across_skip_trans is not None: + to_fuse['across_skip'] = across_skip_trans(outs[0][lvl]) + x = self.fuse(to_fuse) + next_outs.append(x) + + if direction == 'td': + outs.append(next_outs[::-1]) + else: + outs.append(next_outs) + + # output trans + final_outs = [] + for i in range(self.num_outs): + lvl_out_list = [] + for s in range(len(outs)): + lvl_out_list.append(outs[s][i]) + lvl_out = self.output_transition[i](lvl_out_list) + final_outs.append(lvl_out) + + return final_outs diff --git a/mmdet/models/necks/fpn.py b/mmdet/models/necks/fpn.py new file mode 100644 index 0000000..10ab618 --- /dev/null +++ b/mmdet/models/necks/fpn.py @@ -0,0 +1,214 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule +from mmcv.runner import BaseModule, auto_fp16 + +from ..builder import NECKS + + +@NECKS.register_module() +class FPN(BaseModule): + r"""Feature Pyramid Network. + + This is an implementation of paper `Feature Pyramid Networks for Object + Detection `_. + + Args: + in_channels (list[int]): Number of input channels per scale. + out_channels (int): Number of output channels (used at each scale). + num_outs (int): Number of output scales. + start_level (int): Index of the start input backbone level used to + build the feature pyramid. Default: 0. + end_level (int): Index of the end input backbone level (exclusive) to + build the feature pyramid. Default: -1, which means the last level. + add_extra_convs (bool | str): If bool, it decides whether to add conv + layers on top of the original feature maps. Default to False. + If True, it is equivalent to `add_extra_convs='on_input'`. + If str, it specifies the source feature map of the extra convs. + Only the following options are allowed + + - 'on_input': Last feat map of neck inputs (i.e. backbone feature). + - 'on_lateral': Last feature map after lateral convs. + - 'on_output': The last output feature map after fpn convs. + relu_before_extra_convs (bool): Whether to apply relu before the extra + conv. Default: False. + no_norm_on_lateral (bool): Whether to apply norm on lateral. + Default: False. + conv_cfg (dict): Config dict for convolution layer. Default: None. + norm_cfg (dict): Config dict for normalization layer. Default: None. + act_cfg (dict): Config dict for activation layer in ConvModule. + Default: None. + upsample_cfg (dict): Config dict for interpolate layer. + Default: dict(mode='nearest'). + init_cfg (dict or list[dict], optional): Initialization config dict. + + Example: + >>> import torch + >>> in_channels = [2, 3, 5, 7] + >>> scales = [340, 170, 84, 43] + >>> inputs = [torch.rand(1, c, s, s) + ... for c, s in zip(in_channels, scales)] + >>> self = FPN(in_channels, 11, len(in_channels)).eval() + >>> outputs = self.forward(inputs) + >>> for i in range(len(outputs)): + ... print(f'outputs[{i}].shape = {outputs[i].shape}') + outputs[0].shape = torch.Size([1, 11, 340, 340]) + outputs[1].shape = torch.Size([1, 11, 170, 170]) + outputs[2].shape = torch.Size([1, 11, 84, 84]) + outputs[3].shape = torch.Size([1, 11, 43, 43]) + """ + + def __init__(self, + in_channels, + out_channels, + num_outs, + start_level=0, + end_level=-1, + add_extra_convs=False, + relu_before_extra_convs=False, + no_norm_on_lateral=False, + conv_cfg=None, + norm_cfg=None, + act_cfg=None, + upsample_cfg=dict(mode='nearest'), + init_cfg=dict( + type='Xavier', layer='Conv2d', distribution='uniform')): + super(FPN, self).__init__(init_cfg) + assert isinstance(in_channels, list) + self.in_channels = in_channels + self.out_channels = out_channels + self.num_ins = len(in_channels) + self.num_outs = num_outs + self.relu_before_extra_convs = relu_before_extra_convs + self.no_norm_on_lateral = no_norm_on_lateral + self.fp16_enabled = False + self.upsample_cfg = upsample_cfg.copy() + + if end_level == -1 or end_level == self.num_ins - 1: + self.backbone_end_level = self.num_ins + assert num_outs >= self.num_ins - start_level + else: + # if end_level is not the last level, no extra level is allowed + self.backbone_end_level = end_level + 1 + assert end_level < self.num_ins + assert num_outs == end_level - start_level + 1 + self.start_level = start_level + self.end_level = end_level + self.add_extra_convs = add_extra_convs + assert isinstance(add_extra_convs, (str, bool)) + if isinstance(add_extra_convs, str): + # Extra_convs_source choices: 'on_input', 'on_lateral', 'on_output' + assert add_extra_convs in ('on_input', 'on_lateral', 'on_output') + elif add_extra_convs: # True + self.add_extra_convs = 'on_input' + + self.lateral_convs = nn.ModuleList() + self.fpn_convs = nn.ModuleList() + + for i in range(self.start_level, self.backbone_end_level): + l_conv = ConvModule( + in_channels[i], + out_channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg if not self.no_norm_on_lateral else None, + act_cfg=act_cfg, + inplace=False) + fpn_conv = ConvModule( + out_channels, + out_channels, + 3, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + inplace=False) + + self.lateral_convs.append(l_conv) + self.fpn_convs.append(fpn_conv) + + # add extra conv layers (e.g., RetinaNet) + extra_levels = num_outs - self.backbone_end_level + self.start_level + if self.add_extra_convs and extra_levels >= 1: + for i in range(extra_levels): + if i == 0 and self.add_extra_convs == 'on_input': + in_channels = self.in_channels[self.backbone_end_level - 1] + else: + in_channels = out_channels + extra_fpn_conv = ConvModule( + in_channels, + out_channels, + 3, + stride=2, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + inplace=False) + self.fpn_convs.append(extra_fpn_conv) + + @auto_fp16() + def forward(self, inputs): + """Forward function.""" + + if hasattr(self,'in_num') and self.in_num == 4: + inputs = [inputs[0], inputs[1], inputs[2], inputs[3]] + elif hasattr(self,'in_num'): + raise NotImplementedError + else: + self.in_num = 4 + inputs = [inputs[0], inputs[1], inputs[2], inputs[3]] + + # assert len(inputs) == len(self.in_channels) # + + + # build laterals + laterals = [ + lateral_conv(inputs[i + self.start_level]) + for i, lateral_conv in enumerate(self.lateral_convs) + ] + + # build top-down path + used_backbone_levels = len(laterals) + for i in range(used_backbone_levels - 1, 0, -1): + # In some cases, fixing `scale factor` (e.g. 2) is preferred, but + # it cannot co-exist with `size` in `F.interpolate`. + if 'scale_factor' in self.upsample_cfg: + # fix runtime error of "+=" inplace operation in PyTorch 1.10 + laterals[i - 1] = laterals[i - 1] + F.interpolate( + laterals[i], **self.upsample_cfg) + else: + prev_shape = laterals[i - 1].shape[2:] + laterals[i - 1] = laterals[i - 1] + F.interpolate( + laterals[i], size=prev_shape, **self.upsample_cfg) + + # build outputs + # part 1: from original levels + outs = [ + self.fpn_convs[i](laterals[i]) for i in range(used_backbone_levels) + ] + # part 2: add extra levels + if self.num_outs > len(outs): + # use max pool to get more levels on top of outputs + # (e.g., Faster R-CNN, Mask R-CNN) + if not self.add_extra_convs: + for i in range(self.num_outs - used_backbone_levels): + outs.append(F.max_pool2d(outs[-1], 1, stride=2)) + # add conv layers on top of original feature maps (RetinaNet) + else: + if self.add_extra_convs == 'on_input': + extra_source = inputs[self.backbone_end_level - 1] + elif self.add_extra_convs == 'on_lateral': + extra_source = laterals[-1] + elif self.add_extra_convs == 'on_output': + extra_source = outs[-1] + else: + raise NotImplementedError + outs.append(self.fpn_convs[used_backbone_levels](extra_source)) + for i in range(used_backbone_levels + 1, self.num_outs): + if self.relu_before_extra_convs: + outs.append(self.fpn_convs[i](F.relu(outs[-1]))) + else: + outs.append(self.fpn_convs[i](outs[-1])) + return tuple(outs) diff --git a/mmdet/models/necks/fpn_carafe.py b/mmdet/models/necks/fpn_carafe.py new file mode 100644 index 0000000..fdd91f3 --- /dev/null +++ b/mmdet/models/necks/fpn_carafe.py @@ -0,0 +1,275 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +from mmcv.cnn import ConvModule, build_upsample_layer, xavier_init +from mmcv.ops.carafe import CARAFEPack +from mmcv.runner import BaseModule, ModuleList + +from ..builder import NECKS + + +@NECKS.register_module() +class FPN_CARAFE(BaseModule): + """FPN_CARAFE is a more flexible implementation of FPN. It allows more + choice for upsample methods during the top-down pathway. + + It can reproduce the performance of ICCV 2019 paper + CARAFE: Content-Aware ReAssembly of FEatures + Please refer to https://arxiv.org/abs/1905.02188 for more details. + + Args: + in_channels (list[int]): Number of channels for each input feature map. + out_channels (int): Output channels of feature pyramids. + num_outs (int): Number of output stages. + start_level (int): Start level of feature pyramids. + (Default: 0) + end_level (int): End level of feature pyramids. + (Default: -1 indicates the last level). + norm_cfg (dict): Dictionary to construct and config norm layer. + activate (str): Type of activation function in ConvModule + (Default: None indicates w/o activation). + order (dict): Order of components in ConvModule. + upsample (str): Type of upsample layer. + upsample_cfg (dict): Dictionary to construct and config upsample layer. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + in_channels, + out_channels, + num_outs, + start_level=0, + end_level=-1, + norm_cfg=None, + act_cfg=None, + order=('conv', 'norm', 'act'), + upsample_cfg=dict( + type='carafe', + up_kernel=5, + up_group=1, + encoder_kernel=3, + encoder_dilation=1), + init_cfg=None): + assert init_cfg is None, 'To prevent abnormal initialization ' \ + 'behavior, init_cfg is not allowed to be set' + super(FPN_CARAFE, self).__init__(init_cfg) + assert isinstance(in_channels, list) + self.in_channels = in_channels + self.out_channels = out_channels + self.num_ins = len(in_channels) + self.num_outs = num_outs + self.norm_cfg = norm_cfg + self.act_cfg = act_cfg + self.with_bias = norm_cfg is None + self.upsample_cfg = upsample_cfg.copy() + self.upsample = self.upsample_cfg.get('type') + self.relu = nn.ReLU(inplace=False) + + self.order = order + assert order in [('conv', 'norm', 'act'), ('act', 'conv', 'norm')] + + assert self.upsample in [ + 'nearest', 'bilinear', 'deconv', 'pixel_shuffle', 'carafe', None + ] + if self.upsample in ['deconv', 'pixel_shuffle']: + assert hasattr( + self.upsample_cfg, + 'upsample_kernel') and self.upsample_cfg.upsample_kernel > 0 + self.upsample_kernel = self.upsample_cfg.pop('upsample_kernel') + + if end_level == -1 or end_level == self.num_ins - 1: + self.backbone_end_level = self.num_ins + assert num_outs >= self.num_ins - start_level + else: + # if end_level is not the last level, no extra level is allowed + self.backbone_end_level = end_level + 1 + assert end_level < self.num_ins + assert num_outs == end_level - start_level + 1 + self.start_level = start_level + self.end_level = end_level + + self.lateral_convs = ModuleList() + self.fpn_convs = ModuleList() + self.upsample_modules = ModuleList() + + for i in range(self.start_level, self.backbone_end_level): + l_conv = ConvModule( + in_channels[i], + out_channels, + 1, + norm_cfg=norm_cfg, + bias=self.with_bias, + act_cfg=act_cfg, + inplace=False, + order=self.order) + fpn_conv = ConvModule( + out_channels, + out_channels, + 3, + padding=1, + norm_cfg=self.norm_cfg, + bias=self.with_bias, + act_cfg=act_cfg, + inplace=False, + order=self.order) + if i != self.backbone_end_level - 1: + upsample_cfg_ = self.upsample_cfg.copy() + if self.upsample == 'deconv': + upsample_cfg_.update( + in_channels=out_channels, + out_channels=out_channels, + kernel_size=self.upsample_kernel, + stride=2, + padding=(self.upsample_kernel - 1) // 2, + output_padding=(self.upsample_kernel - 1) // 2) + elif self.upsample == 'pixel_shuffle': + upsample_cfg_.update( + in_channels=out_channels, + out_channels=out_channels, + scale_factor=2, + upsample_kernel=self.upsample_kernel) + elif self.upsample == 'carafe': + upsample_cfg_.update(channels=out_channels, scale_factor=2) + else: + # suppress warnings + align_corners = (None + if self.upsample == 'nearest' else False) + upsample_cfg_.update( + scale_factor=2, + mode=self.upsample, + align_corners=align_corners) + upsample_module = build_upsample_layer(upsample_cfg_) + self.upsample_modules.append(upsample_module) + self.lateral_convs.append(l_conv) + self.fpn_convs.append(fpn_conv) + + # add extra conv layers (e.g., RetinaNet) + extra_out_levels = ( + num_outs - self.backbone_end_level + self.start_level) + if extra_out_levels >= 1: + for i in range(extra_out_levels): + in_channels = ( + self.in_channels[self.backbone_end_level - + 1] if i == 0 else out_channels) + extra_l_conv = ConvModule( + in_channels, + out_channels, + 3, + stride=2, + padding=1, + norm_cfg=norm_cfg, + bias=self.with_bias, + act_cfg=act_cfg, + inplace=False, + order=self.order) + if self.upsample == 'deconv': + upsampler_cfg_ = dict( + in_channels=out_channels, + out_channels=out_channels, + kernel_size=self.upsample_kernel, + stride=2, + padding=(self.upsample_kernel - 1) // 2, + output_padding=(self.upsample_kernel - 1) // 2) + elif self.upsample == 'pixel_shuffle': + upsampler_cfg_ = dict( + in_channels=out_channels, + out_channels=out_channels, + scale_factor=2, + upsample_kernel=self.upsample_kernel) + elif self.upsample == 'carafe': + upsampler_cfg_ = dict( + channels=out_channels, + scale_factor=2, + **self.upsample_cfg) + else: + # suppress warnings + align_corners = (None + if self.upsample == 'nearest' else False) + upsampler_cfg_ = dict( + scale_factor=2, + mode=self.upsample, + align_corners=align_corners) + upsampler_cfg_['type'] = self.upsample + upsample_module = build_upsample_layer(upsampler_cfg_) + extra_fpn_conv = ConvModule( + out_channels, + out_channels, + 3, + padding=1, + norm_cfg=self.norm_cfg, + bias=self.with_bias, + act_cfg=act_cfg, + inplace=False, + order=self.order) + self.upsample_modules.append(upsample_module) + self.fpn_convs.append(extra_fpn_conv) + self.lateral_convs.append(extra_l_conv) + + # default init_weights for conv(msra) and norm in ConvModule + def init_weights(self): + """Initialize the weights of module.""" + super(FPN_CARAFE, self).init_weights() + for m in self.modules(): + if isinstance(m, (nn.Conv2d, nn.ConvTranspose2d)): + xavier_init(m, distribution='uniform') + for m in self.modules(): + if isinstance(m, CARAFEPack): + m.init_weights() + + def slice_as(self, src, dst): + """Slice ``src`` as ``dst`` + + Note: + ``src`` should have the same or larger size than ``dst``. + + Args: + src (torch.Tensor): Tensors to be sliced. + dst (torch.Tensor): ``src`` will be sliced to have the same + size as ``dst``. + + Returns: + torch.Tensor: Sliced tensor. + """ + assert (src.size(2) >= dst.size(2)) and (src.size(3) >= dst.size(3)) + if src.size(2) == dst.size(2) and src.size(3) == dst.size(3): + return src + else: + return src[:, :, :dst.size(2), :dst.size(3)] + + def tensor_add(self, a, b): + """Add tensors ``a`` and ``b`` that might have different sizes.""" + if a.size() == b.size(): + c = a + b + else: + c = a + self.slice_as(b, a) + return c + + def forward(self, inputs): + """Forward function.""" + assert len(inputs) == len(self.in_channels) + + # build laterals + laterals = [] + for i, lateral_conv in enumerate(self.lateral_convs): + if i <= self.backbone_end_level - self.start_level: + input = inputs[min(i + self.start_level, len(inputs) - 1)] + else: + input = laterals[-1] + lateral = lateral_conv(input) + laterals.append(lateral) + + # build top-down path + for i in range(len(laterals) - 1, 0, -1): + if self.upsample is not None: + upsample_feat = self.upsample_modules[i - 1](laterals[i]) + else: + upsample_feat = laterals[i] + laterals[i - 1] = self.tensor_add(laterals[i - 1], upsample_feat) + + # build outputs + num_conv_outs = len(self.fpn_convs) + outs = [] + for i in range(num_conv_outs): + out = self.fpn_convs[i](laterals[i]) + outs.append(out) + return tuple(outs) diff --git a/mmdet/models/necks/hrfpn.py b/mmdet/models/necks/hrfpn.py new file mode 100644 index 0000000..ca15be6 --- /dev/null +++ b/mmdet/models/necks/hrfpn.py @@ -0,0 +1,100 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule +from mmcv.runner import BaseModule +from torch.utils.checkpoint import checkpoint + +from ..builder import NECKS + + +@NECKS.register_module() +class HRFPN(BaseModule): + """HRFPN (High Resolution Feature Pyramids) + + paper: `High-Resolution Representations for Labeling Pixels and Regions + `_. + + Args: + in_channels (list): number of channels for each branch. + out_channels (int): output channels of feature pyramids. + num_outs (int): number of output stages. + pooling_type (str): pooling for generating feature pyramids + from {MAX, AVG}. + conv_cfg (dict): dictionary to construct and config conv layer. + norm_cfg (dict): dictionary to construct and config norm layer. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. + stride (int): stride of 3x3 convolutional layers + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + in_channels, + out_channels, + num_outs=5, + pooling_type='AVG', + conv_cfg=None, + norm_cfg=None, + with_cp=False, + stride=1, + init_cfg=dict(type='Caffe2Xavier', layer='Conv2d')): + super(HRFPN, self).__init__(init_cfg) + assert isinstance(in_channels, list) + self.in_channels = in_channels + self.out_channels = out_channels + self.num_ins = len(in_channels) + self.num_outs = num_outs + self.with_cp = with_cp + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + + self.reduction_conv = ConvModule( + sum(in_channels), + out_channels, + kernel_size=1, + conv_cfg=self.conv_cfg, + act_cfg=None) + + self.fpn_convs = nn.ModuleList() + for i in range(self.num_outs): + self.fpn_convs.append( + ConvModule( + out_channels, + out_channels, + kernel_size=3, + padding=1, + stride=stride, + conv_cfg=self.conv_cfg, + act_cfg=None)) + + if pooling_type == 'MAX': + self.pooling = F.max_pool2d + else: + self.pooling = F.avg_pool2d + + def forward(self, inputs): + """Forward function.""" + assert len(inputs) == self.num_ins + outs = [inputs[0]] + for i in range(1, self.num_ins): + outs.append( + F.interpolate(inputs[i], scale_factor=2**i, mode='bilinear')) + out = torch.cat(outs, dim=1) + if out.requires_grad and self.with_cp: + out = checkpoint(self.reduction_conv, out) + else: + out = self.reduction_conv(out) + outs = [out] + for i in range(1, self.num_outs): + outs.append(self.pooling(out, kernel_size=2**i, stride=2**i)) + outputs = [] + + for i in range(self.num_outs): + if outs[i].requires_grad and self.with_cp: + tmp_out = checkpoint(self.fpn_convs[i], outs[i]) + else: + tmp_out = self.fpn_convs[i](outs[i]) + outputs.append(tmp_out) + return tuple(outputs) diff --git a/mmdet/models/necks/nas_fpn.py b/mmdet/models/necks/nas_fpn.py new file mode 100644 index 0000000..710592e --- /dev/null +++ b/mmdet/models/necks/nas_fpn.py @@ -0,0 +1,158 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +from mmcv.cnn import ConvModule +from mmcv.ops.merge_cells import GlobalPoolingCell, SumCell +from mmcv.runner import BaseModule, ModuleList + +from ..builder import NECKS + + +@NECKS.register_module() +class NASFPN(BaseModule): + """NAS-FPN. + + Implementation of `NAS-FPN: Learning Scalable Feature Pyramid Architecture + for Object Detection `_ + + Args: + in_channels (List[int]): Number of input channels per scale. + out_channels (int): Number of output channels (used at each scale) + num_outs (int): Number of output scales. + stack_times (int): The number of times the pyramid architecture will + be stacked. + start_level (int): Index of the start input backbone level used to + build the feature pyramid. Default: 0. + end_level (int): Index of the end input backbone level (exclusive) to + build the feature pyramid. Default: -1, which means the last level. + add_extra_convs (bool): It decides whether to add conv + layers on top of the original feature maps. Default to False. + If True, its actual mode is specified by `extra_convs_on_inputs`. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + in_channels, + out_channels, + num_outs, + stack_times, + start_level=0, + end_level=-1, + add_extra_convs=False, + norm_cfg=None, + init_cfg=dict(type='Caffe2Xavier', layer='Conv2d')): + super(NASFPN, self).__init__(init_cfg) + assert isinstance(in_channels, list) + self.in_channels = in_channels + self.out_channels = out_channels + self.num_ins = len(in_channels) # num of input feature levels + self.num_outs = num_outs # num of output feature levels + self.stack_times = stack_times + self.norm_cfg = norm_cfg + + if end_level == -1 or end_level == self.num_ins - 1: + self.backbone_end_level = self.num_ins + assert num_outs >= self.num_ins - start_level + else: + # if end_level is not the last level, no extra level is allowed + self.backbone_end_level = end_level + 1 + assert end_level < self.num_ins + assert num_outs == end_level - start_level + 1 + self.start_level = start_level + self.end_level = end_level + self.add_extra_convs = add_extra_convs + + # add lateral connections + self.lateral_convs = nn.ModuleList() + for i in range(self.start_level, self.backbone_end_level): + l_conv = ConvModule( + in_channels[i], + out_channels, + 1, + norm_cfg=norm_cfg, + act_cfg=None) + self.lateral_convs.append(l_conv) + + # add extra downsample layers (stride-2 pooling or conv) + extra_levels = num_outs - self.backbone_end_level + self.start_level + self.extra_downsamples = nn.ModuleList() + for i in range(extra_levels): + extra_conv = ConvModule( + out_channels, out_channels, 1, norm_cfg=norm_cfg, act_cfg=None) + self.extra_downsamples.append( + nn.Sequential(extra_conv, nn.MaxPool2d(2, 2))) + + # add NAS FPN connections + self.fpn_stages = ModuleList() + for _ in range(self.stack_times): + stage = nn.ModuleDict() + # gp(p6, p4) -> p4_1 + stage['gp_64_4'] = GlobalPoolingCell( + in_channels=out_channels, + out_channels=out_channels, + out_norm_cfg=norm_cfg) + # sum(p4_1, p4) -> p4_2 + stage['sum_44_4'] = SumCell( + in_channels=out_channels, + out_channels=out_channels, + out_norm_cfg=norm_cfg) + # sum(p4_2, p3) -> p3_out + stage['sum_43_3'] = SumCell( + in_channels=out_channels, + out_channels=out_channels, + out_norm_cfg=norm_cfg) + # sum(p3_out, p4_2) -> p4_out + stage['sum_34_4'] = SumCell( + in_channels=out_channels, + out_channels=out_channels, + out_norm_cfg=norm_cfg) + # sum(p5, gp(p4_out, p3_out)) -> p5_out + stage['gp_43_5'] = GlobalPoolingCell(with_out_conv=False) + stage['sum_55_5'] = SumCell( + in_channels=out_channels, + out_channels=out_channels, + out_norm_cfg=norm_cfg) + # sum(p7, gp(p5_out, p4_2)) -> p7_out + stage['gp_54_7'] = GlobalPoolingCell(with_out_conv=False) + stage['sum_77_7'] = SumCell( + in_channels=out_channels, + out_channels=out_channels, + out_norm_cfg=norm_cfg) + # gp(p7_out, p5_out) -> p6_out + stage['gp_75_6'] = GlobalPoolingCell( + in_channels=out_channels, + out_channels=out_channels, + out_norm_cfg=norm_cfg) + self.fpn_stages.append(stage) + + def forward(self, inputs): + """Forward function.""" + # build P3-P5 + feats = [ + lateral_conv(inputs[i + self.start_level]) + for i, lateral_conv in enumerate(self.lateral_convs) + ] + # build P6-P7 on top of P5 + for downsample in self.extra_downsamples: + feats.append(downsample(feats[-1])) + + p3, p4, p5, p6, p7 = feats + + for stage in self.fpn_stages: + # gp(p6, p4) -> p4_1 + p4_1 = stage['gp_64_4'](p6, p4, out_size=p4.shape[-2:]) + # sum(p4_1, p4) -> p4_2 + p4_2 = stage['sum_44_4'](p4_1, p4, out_size=p4.shape[-2:]) + # sum(p4_2, p3) -> p3_out + p3 = stage['sum_43_3'](p4_2, p3, out_size=p3.shape[-2:]) + # sum(p3_out, p4_2) -> p4_out + p4 = stage['sum_34_4'](p3, p4_2, out_size=p4.shape[-2:]) + # sum(p5, gp(p4_out, p3_out)) -> p5_out + p5_tmp = stage['gp_43_5'](p4, p3, out_size=p5.shape[-2:]) + p5 = stage['sum_55_5'](p5, p5_tmp, out_size=p5.shape[-2:]) + # sum(p7, gp(p5_out, p4_2)) -> p7_out + p7_tmp = stage['gp_54_7'](p5, p4_2, out_size=p7.shape[-2:]) + p7 = stage['sum_77_7'](p7, p7_tmp, out_size=p7.shape[-2:]) + # gp(p7_out, p5_out) -> p6_out + p6 = stage['gp_75_6'](p7, p5, out_size=p6.shape[-2:]) + + return p3, p4, p5, p6, p7 diff --git a/mmdet/models/necks/nasfcos_fpn.py b/mmdet/models/necks/nasfcos_fpn.py new file mode 100644 index 0000000..c4abfe7 --- /dev/null +++ b/mmdet/models/necks/nasfcos_fpn.py @@ -0,0 +1,170 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule, caffe2_xavier_init +from mmcv.ops.merge_cells import ConcatCell +from mmcv.runner import BaseModule + +from ..builder import NECKS + + +@NECKS.register_module() +class NASFCOS_FPN(BaseModule): + """FPN structure in NASFPN. + + Implementation of paper `NAS-FCOS: Fast Neural Architecture Search for + Object Detection `_ + + Args: + in_channels (List[int]): Number of input channels per scale. + out_channels (int): Number of output channels (used at each scale) + num_outs (int): Number of output scales. + start_level (int): Index of the start input backbone level used to + build the feature pyramid. Default: 0. + end_level (int): Index of the end input backbone level (exclusive) to + build the feature pyramid. Default: -1, which means the last level. + add_extra_convs (bool): It decides whether to add conv + layers on top of the original feature maps. Default to False. + If True, its actual mode is specified by `extra_convs_on_inputs`. + conv_cfg (dict): dictionary to construct and config conv layer. + norm_cfg (dict): dictionary to construct and config norm layer. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + in_channels, + out_channels, + num_outs, + start_level=1, + end_level=-1, + add_extra_convs=False, + conv_cfg=None, + norm_cfg=None, + init_cfg=None): + assert init_cfg is None, 'To prevent abnormal initialization ' \ + 'behavior, init_cfg is not allowed to be set' + super(NASFCOS_FPN, self).__init__(init_cfg) + assert isinstance(in_channels, list) + self.in_channels = in_channels + self.out_channels = out_channels + self.num_ins = len(in_channels) + self.num_outs = num_outs + self.norm_cfg = norm_cfg + self.conv_cfg = conv_cfg + + if end_level == -1 or end_level == self.num_ins - 1: + self.backbone_end_level = self.num_ins + assert num_outs >= self.num_ins - start_level + else: + # if end_level is not the last level, no extra level is allowed + self.backbone_end_level = end_level + 1 + assert end_level < self.num_ins + assert num_outs == end_level - start_level + 1 + self.start_level = start_level + self.end_level = end_level + self.add_extra_convs = add_extra_convs + + self.adapt_convs = nn.ModuleList() + for i in range(self.start_level, self.backbone_end_level): + adapt_conv = ConvModule( + in_channels[i], + out_channels, + 1, + stride=1, + padding=0, + bias=False, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU', inplace=False)) + self.adapt_convs.append(adapt_conv) + + # C2 is omitted according to the paper + extra_levels = num_outs - self.backbone_end_level + self.start_level + + def build_concat_cell(with_input1_conv, with_input2_conv): + cell_conv_cfg = dict( + kernel_size=1, padding=0, bias=False, groups=out_channels) + return ConcatCell( + in_channels=out_channels, + out_channels=out_channels, + with_out_conv=True, + out_conv_cfg=cell_conv_cfg, + out_norm_cfg=dict(type='BN'), + out_conv_order=('norm', 'act', 'conv'), + with_input1_conv=with_input1_conv, + with_input2_conv=with_input2_conv, + input_conv_cfg=conv_cfg, + input_norm_cfg=norm_cfg, + upsample_mode='nearest') + + # Denote c3=f0, c4=f1, c5=f2 for convince + self.fpn = nn.ModuleDict() + self.fpn['c22_1'] = build_concat_cell(True, True) + self.fpn['c22_2'] = build_concat_cell(True, True) + self.fpn['c32'] = build_concat_cell(True, False) + self.fpn['c02'] = build_concat_cell(True, False) + self.fpn['c42'] = build_concat_cell(True, True) + self.fpn['c36'] = build_concat_cell(True, True) + self.fpn['c61'] = build_concat_cell(True, True) # f9 + self.extra_downsamples = nn.ModuleList() + for i in range(extra_levels): + extra_act_cfg = None if i == 0 \ + else dict(type='ReLU', inplace=False) + self.extra_downsamples.append( + ConvModule( + out_channels, + out_channels, + 3, + stride=2, + padding=1, + act_cfg=extra_act_cfg, + order=('act', 'norm', 'conv'))) + + def forward(self, inputs): + """Forward function.""" + feats = [ + adapt_conv(inputs[i + self.start_level]) + for i, adapt_conv in enumerate(self.adapt_convs) + ] + + for (i, module_name) in enumerate(self.fpn): + idx_1, idx_2 = int(module_name[1]), int(module_name[2]) + res = self.fpn[module_name](feats[idx_1], feats[idx_2]) + feats.append(res) + + ret = [] + for (idx, input_idx) in zip([9, 8, 7], [1, 2, 3]): # add P3, P4, P5 + feats1, feats2 = feats[idx], feats[5] + feats2_resize = F.interpolate( + feats2, + size=feats1.size()[2:], + mode='bilinear', + align_corners=False) + + feats_sum = feats1 + feats2_resize + ret.append( + F.interpolate( + feats_sum, + size=inputs[input_idx].size()[2:], + mode='bilinear', + align_corners=False)) + + for submodule in self.extra_downsamples: + ret.append(submodule(ret[-1])) + + return tuple(ret) + + def init_weights(self): + """Initialize the weights of module.""" + super(NASFCOS_FPN, self).init_weights() + for module in self.fpn.values(): + if hasattr(module, 'conv_out'): + caffe2_xavier_init(module.out_conv.conv) + + for modules in [ + self.adapt_convs.modules(), + self.extra_downsamples.modules() + ]: + for module in modules: + if isinstance(module, nn.Conv2d): + caffe2_xavier_init(module) diff --git a/mmdet/models/necks/pafpn.py b/mmdet/models/necks/pafpn.py new file mode 100644 index 0000000..2edd348 --- /dev/null +++ b/mmdet/models/necks/pafpn.py @@ -0,0 +1,159 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule +from mmcv.runner import auto_fp16 + +from ..builder import NECKS +from .fpn import FPN + + +@NECKS.register_module() +class PAFPN(FPN): + """Path Aggregation Network for Instance Segmentation. + + This is an implementation of the `PAFPN in Path Aggregation Network + `_. + + Args: + in_channels (List[int]): Number of input channels per scale. + out_channels (int): Number of output channels (used at each scale) + num_outs (int): Number of output scales. + start_level (int): Index of the start input backbone level used to + build the feature pyramid. Default: 0. + end_level (int): Index of the end input backbone level (exclusive) to + build the feature pyramid. Default: -1, which means the last level. + add_extra_convs (bool | str): If bool, it decides whether to add conv + layers on top of the original feature maps. Default to False. + If True, it is equivalent to `add_extra_convs='on_input'`. + If str, it specifies the source feature map of the extra convs. + Only the following options are allowed + + - 'on_input': Last feat map of neck inputs (i.e. backbone feature). + - 'on_lateral': Last feature map after lateral convs. + - 'on_output': The last output feature map after fpn convs. + relu_before_extra_convs (bool): Whether to apply relu before the extra + conv. Default: False. + no_norm_on_lateral (bool): Whether to apply norm on lateral. + Default: False. + conv_cfg (dict): Config dict for convolution layer. Default: None. + norm_cfg (dict): Config dict for normalization layer. Default: None. + act_cfg (str): Config dict for activation layer in ConvModule. + Default: None. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + in_channels, + out_channels, + num_outs, + start_level=0, + end_level=-1, + add_extra_convs=False, + relu_before_extra_convs=False, + no_norm_on_lateral=False, + conv_cfg=None, + norm_cfg=None, + act_cfg=None, + init_cfg=dict( + type='Xavier', layer='Conv2d', distribution='uniform')): + super(PAFPN, self).__init__( + in_channels, + out_channels, + num_outs, + start_level, + end_level, + add_extra_convs, + relu_before_extra_convs, + no_norm_on_lateral, + conv_cfg, + norm_cfg, + act_cfg, + init_cfg=init_cfg) + # add extra bottom up pathway + self.downsample_convs = nn.ModuleList() + self.pafpn_convs = nn.ModuleList() + for i in range(self.start_level + 1, self.backbone_end_level): + d_conv = ConvModule( + out_channels, + out_channels, + 3, + stride=2, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + inplace=False) + pafpn_conv = ConvModule( + out_channels, + out_channels, + 3, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg, + inplace=False) + self.downsample_convs.append(d_conv) + self.pafpn_convs.append(pafpn_conv) + + @auto_fp16() + def forward(self, inputs): + """Forward function.""" + assert len(inputs) == len(self.in_channels) + + # build laterals + laterals = [ + lateral_conv(inputs[i + self.start_level]) + for i, lateral_conv in enumerate(self.lateral_convs) + ] + + # build top-down path + used_backbone_levels = len(laterals) + for i in range(used_backbone_levels - 1, 0, -1): + prev_shape = laterals[i - 1].shape[2:] + # fix runtime error of "+=" inplace operation in PyTorch 1.10 + laterals[i - 1] = laterals[i - 1] + F.interpolate( + laterals[i], size=prev_shape, mode='nearest') + + # build outputs + # part 1: from original levels + inter_outs = [ + self.fpn_convs[i](laterals[i]) for i in range(used_backbone_levels) + ] + + # part 2: add bottom-up path + for i in range(0, used_backbone_levels - 1): + inter_outs[i + 1] += self.downsample_convs[i](inter_outs[i]) + + outs = [] + outs.append(inter_outs[0]) + outs.extend([ + self.pafpn_convs[i - 1](inter_outs[i]) + for i in range(1, used_backbone_levels) + ]) + + # part 3: add extra levels + if self.num_outs > len(outs): + # use max pool to get more levels on top of outputs + # (e.g., Faster R-CNN, Mask R-CNN) + if not self.add_extra_convs: + for i in range(self.num_outs - used_backbone_levels): + outs.append(F.max_pool2d(outs[-1], 1, stride=2)) + # add conv layers on top of original feature maps (RetinaNet) + else: + if self.add_extra_convs == 'on_input': + orig = inputs[self.backbone_end_level - 1] + outs.append(self.fpn_convs[used_backbone_levels](orig)) + elif self.add_extra_convs == 'on_lateral': + outs.append(self.fpn_convs[used_backbone_levels]( + laterals[-1])) + elif self.add_extra_convs == 'on_output': + outs.append(self.fpn_convs[used_backbone_levels](outs[-1])) + else: + raise NotImplementedError + for i in range(used_backbone_levels + 1, self.num_outs): + if self.relu_before_extra_convs: + outs.append(self.fpn_convs[i](F.relu(outs[-1]))) + else: + outs.append(self.fpn_convs[i](outs[-1])) + return tuple(outs) diff --git a/mmdet/models/necks/rfp.py b/mmdet/models/necks/rfp.py new file mode 100644 index 0000000..6976f4d --- /dev/null +++ b/mmdet/models/necks/rfp.py @@ -0,0 +1,135 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import constant_init, xavier_init +from mmcv.runner import BaseModule, ModuleList + +from ..builder import NECKS, build_backbone +from .fpn import FPN + + +class ASPP(BaseModule): + """ASPP (Atrous Spatial Pyramid Pooling) + + This is an implementation of the ASPP module used in DetectoRS + (https://arxiv.org/pdf/2006.02334.pdf) + + Args: + in_channels (int): Number of input channels. + out_channels (int): Number of channels produced by this module + dilations (tuple[int]): Dilations of the four branches. + Default: (1, 3, 6, 1) + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + in_channels, + out_channels, + dilations=(1, 3, 6, 1), + init_cfg=dict(type='Kaiming', layer='Conv2d')): + super().__init__(init_cfg) + assert dilations[-1] == 1 + self.aspp = nn.ModuleList() + for dilation in dilations: + kernel_size = 3 if dilation > 1 else 1 + padding = dilation if dilation > 1 else 0 + conv = nn.Conv2d( + in_channels, + out_channels, + kernel_size=kernel_size, + stride=1, + dilation=dilation, + padding=padding, + bias=True) + self.aspp.append(conv) + self.gap = nn.AdaptiveAvgPool2d(1) + + def forward(self, x): + avg_x = self.gap(x) + out = [] + for aspp_idx in range(len(self.aspp)): + inp = avg_x if (aspp_idx == len(self.aspp) - 1) else x + out.append(F.relu_(self.aspp[aspp_idx](inp))) + out[-1] = out[-1].expand_as(out[-2]) + out = torch.cat(out, dim=1) + return out + + +@NECKS.register_module() +class RFP(FPN): + """RFP (Recursive Feature Pyramid) + + This is an implementation of RFP in `DetectoRS + `_. Different from standard FPN, the + input of RFP should be multi level features along with origin input image + of backbone. + + Args: + rfp_steps (int): Number of unrolled steps of RFP. + rfp_backbone (dict): Configuration of the backbone for RFP. + aspp_out_channels (int): Number of output channels of ASPP module. + aspp_dilations (tuple[int]): Dilation rates of four branches. + Default: (1, 3, 6, 1) + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + rfp_steps, + rfp_backbone, + aspp_out_channels, + aspp_dilations=(1, 3, 6, 1), + init_cfg=None, + **kwargs): + assert init_cfg is None, 'To prevent abnormal initialization ' \ + 'behavior, init_cfg is not allowed to be set' + super().__init__(init_cfg=init_cfg, **kwargs) + self.rfp_steps = rfp_steps + # Be careful! Pretrained weights cannot be loaded when use + # nn.ModuleList + self.rfp_modules = ModuleList() + for rfp_idx in range(1, rfp_steps): + rfp_module = build_backbone(rfp_backbone) + self.rfp_modules.append(rfp_module) + self.rfp_aspp = ASPP(self.out_channels, aspp_out_channels, + aspp_dilations) + self.rfp_weight = nn.Conv2d( + self.out_channels, + 1, + kernel_size=1, + stride=1, + padding=0, + bias=True) + + def init_weights(self): + # Avoid using super().init_weights(), which may alter the default + # initialization of the modules in self.rfp_modules that have missing + # keys in the pretrained checkpoint. + for convs in [self.lateral_convs, self.fpn_convs]: + for m in convs.modules(): + if isinstance(m, nn.Conv2d): + xavier_init(m, distribution='uniform') + for rfp_idx in range(self.rfp_steps - 1): + self.rfp_modules[rfp_idx].init_weights() + constant_init(self.rfp_weight, 0) + + def forward(self, inputs): + inputs = list(inputs) + assert len(inputs) == len(self.in_channels) + 1 # +1 for input image + img = inputs.pop(0) + # FPN forward + x = super().forward(tuple(inputs)) + for rfp_idx in range(self.rfp_steps - 1): + rfp_feats = [x[0]] + list( + self.rfp_aspp(x[i]) for i in range(1, len(x))) + x_idx = self.rfp_modules[rfp_idx].rfp_forward(img, rfp_feats) + # FPN forward + x_idx = super().forward(x_idx) + x_new = [] + for ft_idx in range(len(x_idx)): + add_weight = torch.sigmoid(self.rfp_weight(x_idx[ft_idx])) + x_new.append(add_weight * x_idx[ft_idx] + + (1 - add_weight) * x[ft_idx]) + x = x_new + return x diff --git a/mmdet/models/necks/ssd_neck.py b/mmdet/models/necks/ssd_neck.py new file mode 100644 index 0000000..d8d9100 --- /dev/null +++ b/mmdet/models/necks/ssd_neck.py @@ -0,0 +1,139 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule +from mmcv.runner import BaseModule + +from ..builder import NECKS + + +@NECKS.register_module() +class SSDNeck(BaseModule): + """Extra layers of SSD backbone to generate multi-scale feature maps. + + Args: + in_channels (Sequence[int]): Number of input channels per scale. + out_channels (Sequence[int]): Number of output channels per scale. + level_strides (Sequence[int]): Stride of 3x3 conv per level. + level_paddings (Sequence[int]): Padding size of 3x3 conv per level. + l2_norm_scale (float|None): L2 normalization layer init scale. + If None, not use L2 normalization on the first input feature. + last_kernel_size (int): Kernel size of the last conv layer. + Default: 3. + use_depthwise (bool): Whether to use DepthwiseSeparableConv. + Default: False. + conv_cfg (dict): Config dict for convolution layer. Default: None. + norm_cfg (dict): Dictionary to construct and config norm layer. + Default: None. + act_cfg (dict): Config dict for activation layer. + Default: dict(type='ReLU'). + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + in_channels, + out_channels, + level_strides, + level_paddings, + l2_norm_scale=20., + last_kernel_size=3, + use_depthwise=False, + conv_cfg=None, + norm_cfg=None, + act_cfg=dict(type='ReLU'), + init_cfg=[ + dict( + type='Xavier', distribution='uniform', + layer='Conv2d'), + dict(type='Constant', val=1, layer='BatchNorm2d'), + ]): + super(SSDNeck, self).__init__(init_cfg) + assert len(out_channels) > len(in_channels) + assert len(out_channels) - len(in_channels) == len(level_strides) + assert len(level_strides) == len(level_paddings) + assert in_channels == out_channels[:len(in_channels)] + + if l2_norm_scale: + self.l2_norm = L2Norm(in_channels[0], l2_norm_scale) + self.init_cfg += [ + dict( + type='Constant', + val=self.l2_norm.scale, + override=dict(name='l2_norm')) + ] + + self.extra_layers = nn.ModuleList() + extra_layer_channels = out_channels[len(in_channels):] + second_conv = DepthwiseSeparableConvModule if \ + use_depthwise else ConvModule + + for i, (out_channel, stride, padding) in enumerate( + zip(extra_layer_channels, level_strides, level_paddings)): + kernel_size = last_kernel_size \ + if i == len(extra_layer_channels) - 1 else 3 + per_lvl_convs = nn.Sequential( + ConvModule( + out_channels[len(in_channels) - 1 + i], + out_channel // 2, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg), + second_conv( + out_channel // 2, + out_channel, + kernel_size, + stride=stride, + padding=padding, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + self.extra_layers.append(per_lvl_convs) + + def forward(self, inputs): + """Forward function.""" + + if hasattr(self,'in_num') and self.in_num == 2: + outs = [inputs[0], inputs[1]] + elif hasattr(self,'in_num') and self.in_num == 1: + outs = inputs[0] + elif hasattr(self,'in_num'): + raise NotImplementedError + else: + self.in_num = 2 + outs = [inputs[0], inputs[1]] + + if hasattr(self, 'l2_norm'): + outs[0] = self.l2_norm(outs[0]) + + feat = outs[-1] + for layer in self.extra_layers: + feat = layer(feat) + outs.append(feat) + return tuple(outs) + + +class L2Norm(nn.Module): + + def __init__(self, n_dims, scale=20., eps=1e-10): + """L2 normalization layer. + + Args: + n_dims (int): Number of dimensions to be normalized + scale (float, optional): Defaults to 20.. + eps (float, optional): Used to avoid division by zero. + Defaults to 1e-10. + """ + super(L2Norm, self).__init__() + self.n_dims = n_dims + self.weight = nn.Parameter(torch.Tensor(self.n_dims)) + self.eps = eps + self.scale = scale + + def forward(self, x): + """Forward function.""" + # normalization layer convert to FP32 in FP16 training + x_float = x.float() + norm = x_float.pow(2).sum(1, keepdim=True).sqrt() + self.eps + return (self.weight[None, :, None, None].float().expand_as(x_float) * + x_float / norm).type_as(x) diff --git a/mmdet/models/necks/yolo_neck.py b/mmdet/models/necks/yolo_neck.py new file mode 100644 index 0000000..eb6e1b9 --- /dev/null +++ b/mmdet/models/necks/yolo_neck.py @@ -0,0 +1,148 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# Copyright (c) 2019 Western Digital Corporation or its affiliates. + +import torch +import torch.nn.functional as F +from mmcv.cnn import ConvModule +from mmcv.runner import BaseModule + +from ..builder import NECKS + + +class DetectionBlock(BaseModule): + """Detection block in YOLO neck. + + Let out_channels = n, the DetectionBlock contains: + Six ConvLayers, 1 Conv2D Layer and 1 YoloLayer. + The first 6 ConvLayers are formed the following way: + 1x1xn, 3x3x2n, 1x1xn, 3x3x2n, 1x1xn, 3x3x2n. + The Conv2D layer is 1x1x255. + Some block will have branch after the fifth ConvLayer. + The input channel is arbitrary (in_channels) + + Args: + in_channels (int): The number of input channels. + out_channels (int): The number of output channels. + conv_cfg (dict): Config dict for convolution layer. Default: None. + norm_cfg (dict): Dictionary to construct and config norm layer. + Default: dict(type='BN', requires_grad=True) + act_cfg (dict): Config dict for activation layer. + Default: dict(type='LeakyReLU', negative_slope=0.1). + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + in_channels, + out_channels, + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + act_cfg=dict(type='LeakyReLU', negative_slope=0.1), + init_cfg=None): + super(DetectionBlock, self).__init__(init_cfg) + double_out_channels = out_channels * 2 + + # shortcut + cfg = dict(conv_cfg=conv_cfg, norm_cfg=norm_cfg, act_cfg=act_cfg) + self.conv1 = ConvModule(in_channels, out_channels, 1, **cfg) + self.conv2 = ConvModule( + out_channels, double_out_channels, 3, padding=1, **cfg) + self.conv3 = ConvModule(double_out_channels, out_channels, 1, **cfg) + self.conv4 = ConvModule( + out_channels, double_out_channels, 3, padding=1, **cfg) + self.conv5 = ConvModule(double_out_channels, out_channels, 1, **cfg) + + def forward(self, x): + tmp = self.conv1(x) + tmp = self.conv2(tmp) + tmp = self.conv3(tmp) + tmp = self.conv4(tmp) + out = self.conv5(tmp) + return out + + +@NECKS.register_module() +class YOLOV3Neck(BaseModule): + """The neck of YOLOV3. + + It can be treated as a simplified version of FPN. It + will take the result from Darknet backbone and do some upsampling and + concatenation. It will finally output the detection result. + + Note: + The input feats should be from top to bottom. + i.e., from high-lvl to low-lvl + But YOLOV3Neck will process them in reversed order. + i.e., from bottom (high-lvl) to top (low-lvl) + + Args: + num_scales (int): The number of scales / stages. + in_channels (List[int]): The number of input channels per scale. + out_channels (List[int]): The number of output channels per scale. + conv_cfg (dict, optional): Config dict for convolution layer. + Default: None. + norm_cfg (dict, optional): Dictionary to construct and config norm + layer. Default: dict(type='BN', requires_grad=True) + act_cfg (dict, optional): Config dict for activation layer. + Default: dict(type='LeakyReLU', negative_slope=0.1). + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + num_scales, + in_channels, + out_channels, + conv_cfg=None, + norm_cfg=dict(type='BN', requires_grad=True), + act_cfg=dict(type='LeakyReLU', negative_slope=0.1), + init_cfg=None): + super(YOLOV3Neck, self).__init__(init_cfg) + assert (num_scales == len(in_channels) == len(out_channels)) + self.num_scales = num_scales + self.in_channels = in_channels + self.out_channels = out_channels + + # shortcut + cfg = dict(conv_cfg=conv_cfg, norm_cfg=norm_cfg, act_cfg=act_cfg) + + # To support arbitrary scales, the code looks awful, but it works. + # Better solution is welcomed. + self.detect1 = DetectionBlock(in_channels[0], out_channels[0], **cfg) + for i in range(1, self.num_scales): + in_c, out_c = self.in_channels[i], self.out_channels[i] + inter_c = out_channels[i - 1] + self.add_module(f'conv{i}', ConvModule(inter_c, out_c, 1, **cfg)) + # in_c + out_c : High-lvl feats will be cat with low-lvl feats + self.add_module(f'detect{i+1}', + DetectionBlock(in_c + out_c, out_c, **cfg)) + + def forward(self, feats): + # assert len(feats) == self.num_scales + + if hasattr(self,'in_num') and self.in_num == 3: + feats = [feats[0], feats[1], feats[2]] + elif hasattr(self,'in_num'): + raise NotImplementedError + else: + self.in_num = 3 + feats = [feats[0], feats[1], feats[2]] + + # processed from bottom (high-lvl) to top (low-lvl) + outs = [] + out = self.detect1(feats[-1]) + outs.append(out) + + for i, x in enumerate(reversed(feats[:-1])): + conv = getattr(self, f'conv{i+1}') + tmp = conv(out) + + # Cat with low-lvl feats + tmp = F.interpolate(tmp, scale_factor=2) + tmp = torch.cat((tmp, x), 1) + + detect = getattr(self, f'detect{i+2}') + out = detect(tmp) + outs.append(out) + + return tuple(outs) diff --git a/mmdet/models/necks/yolox_pafpn.py b/mmdet/models/necks/yolox_pafpn.py new file mode 100644 index 0000000..bb5493b --- /dev/null +++ b/mmdet/models/necks/yolox_pafpn.py @@ -0,0 +1,165 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math + +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule +from mmcv.runner import BaseModule + +from ..builder import NECKS +from ..utils import CSPLayer + + +@NECKS.register_module() +class YOLOXPAFPN(BaseModule): + """Path Aggregation Network used in YOLOX. + + Args: + in_channels (List[int]): Number of input channels per scale. + out_channels (int): Number of output channels (used at each scale) + num_csp_blocks (int): Number of bottlenecks in CSPLayer. Default: 3 + use_depthwise (bool): Whether to depthwise separable convolution in + blocks. Default: False + upsample_cfg (dict): Config dict for interpolate layer. + Default: `dict(scale_factor=2, mode='nearest')` + conv_cfg (dict, optional): Config dict for convolution layer. + Default: None, which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN') + act_cfg (dict): Config dict for activation layer. + Default: dict(type='Swish') + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None. + """ + + def __init__(self, + in_channels, + out_channels, + num_csp_blocks=3, + use_depthwise=False, + upsample_cfg=dict(scale_factor=2, mode='nearest'), + conv_cfg=None, + norm_cfg=dict(type='BN', momentum=0.03, eps=0.001), + act_cfg=dict(type='Swish'), + init_cfg=dict( + type='Kaiming', + layer='Conv2d', + a=math.sqrt(5), + distribution='uniform', + mode='fan_in', + nonlinearity='leaky_relu')): + super(YOLOXPAFPN, self).__init__(init_cfg) + self.in_channels = in_channels + self.out_channels = out_channels + + conv = DepthwiseSeparableConvModule if use_depthwise else ConvModule + + # build top-down blocks + self.upsample = nn.Upsample(**upsample_cfg) + self.reduce_layers = nn.ModuleList() + self.top_down_blocks = nn.ModuleList() + for idx in range(len(in_channels) - 1, 0, -1): + self.reduce_layers.append( + ConvModule( + in_channels[idx], + in_channels[idx - 1], + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + self.top_down_blocks.append( + CSPLayer( + in_channels[idx - 1] * 2, + in_channels[idx - 1], + num_blocks=num_csp_blocks, + add_identity=False, + use_depthwise=use_depthwise, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + + # build bottom-up blocks + self.downsamples = nn.ModuleList() + self.bottom_up_blocks = nn.ModuleList() + for idx in range(len(in_channels) - 1): + self.downsamples.append( + conv( + in_channels[idx], + in_channels[idx], + 3, + stride=2, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + self.bottom_up_blocks.append( + CSPLayer( + in_channels[idx] * 2, + in_channels[idx + 1], + num_blocks=num_csp_blocks, + add_identity=False, + use_depthwise=use_depthwise, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + + self.out_convs = nn.ModuleList() + for i in range(len(in_channels)): + self.out_convs.append( + ConvModule( + in_channels[i], + out_channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg)) + + def forward(self, inputs): + """ + Args: + inputs (tuple[Tensor]): input features. + + Returns: + tuple[Tensor]: YOLOXPAFPN features. + """ + + if hasattr(self,'in_num') and self.in_num == 3: + inputs = [inputs[0], inputs[1], inputs[2]] + elif hasattr(self,'in_num'): + raise NotImplementedError + else: + self.in_num = 3 + inputs = [inputs[0], inputs[1], inputs[2]] + + assert len(inputs) == len(self.in_channels) + + # top-down path + inner_outs = [inputs[-1]] + for idx in range(len(self.in_channels) - 1, 0, -1): + feat_heigh = inner_outs[0] + feat_low = inputs[idx - 1] + feat_heigh = self.reduce_layers[len(self.in_channels) - 1 - idx]( + feat_heigh) + inner_outs[0] = feat_heigh + + upsample_feat = self.upsample(feat_heigh) + + inner_out = self.top_down_blocks[len(self.in_channels) - 1 - idx]( + torch.cat([upsample_feat, feat_low], 1)) + inner_outs.insert(0, inner_out) + + # bottom-up path + outs = [inner_outs[0]] + for idx in range(len(self.in_channels) - 1): + feat_low = outs[-1] + feat_height = inner_outs[idx + 1] + downsample_feat = self.downsamples[idx](feat_low) + out = self.bottom_up_blocks[idx]( + torch.cat([downsample_feat, feat_height], 1)) + outs.append(out) + + # out convs + for idx, conv in enumerate(self.out_convs): + outs[idx] = conv(outs[idx]) + + return tuple(outs) diff --git a/mmdet/models/plugins/__init__.py b/mmdet/models/plugins/__init__.py new file mode 100644 index 0000000..a455c07 --- /dev/null +++ b/mmdet/models/plugins/__init__.py @@ -0,0 +1,9 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .dropblock import DropBlock +from .msdeformattn_pixel_decoder import MSDeformAttnPixelDecoder +from .pixel_decoder import PixelDecoder, TransformerEncoderPixelDecoder + +__all__ = [ + 'DropBlock', 'PixelDecoder', 'TransformerEncoderPixelDecoder', + 'MSDeformAttnPixelDecoder' +] diff --git a/mmdet/models/plugins/dropblock.py b/mmdet/models/plugins/dropblock.py new file mode 100644 index 0000000..bb00ade --- /dev/null +++ b/mmdet/models/plugins/dropblock.py @@ -0,0 +1,85 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import PLUGIN_LAYERS + +eps = 1e-6 + + +@PLUGIN_LAYERS.register_module() +class DropBlock(nn.Module): + """Randomly drop some regions of feature maps. + + Please refer to the method proposed in `DropBlock + `_ for details. + + Args: + drop_prob (float): The probability of dropping each block. + block_size (int): The size of dropped blocks. + warmup_iters (int): The drop probability will linearly increase + from `0` to `drop_prob` during the first `warmup_iters` iterations. + Default: 2000. + """ + + def __init__(self, drop_prob, block_size, warmup_iters=2000, **kwargs): + super(DropBlock, self).__init__() + assert block_size % 2 == 1 + assert 0 < drop_prob <= 1 + assert warmup_iters >= 0 + self.drop_prob = drop_prob + self.block_size = block_size + self.warmup_iters = warmup_iters + self.iter_cnt = 0 + + def forward(self, x): + """ + Args: + x (Tensor): Input feature map on which some areas will be randomly + dropped. + + Returns: + Tensor: The tensor after DropBlock layer. + """ + if not self.training: + return x + self.iter_cnt += 1 + N, C, H, W = list(x.shape) + gamma = self._compute_gamma((H, W)) + mask_shape = (N, C, H - self.block_size + 1, W - self.block_size + 1) + mask = torch.bernoulli(torch.full(mask_shape, gamma, device=x.device)) + + mask = F.pad(mask, [self.block_size // 2] * 4, value=0) + mask = F.max_pool2d( + input=mask, + stride=(1, 1), + kernel_size=(self.block_size, self.block_size), + padding=self.block_size // 2) + mask = 1 - mask + x = x * mask * mask.numel() / (eps + mask.sum()) + return x + + def _compute_gamma(self, feat_size): + """Compute the value of gamma according to paper. gamma is the + parameter of bernoulli distribution, which controls the number of + features to drop. + + gamma = (drop_prob * fm_area) / (drop_area * keep_area) + + Args: + feat_size (tuple[int, int]): The height and width of feature map. + + Returns: + float: The value of gamma. + """ + gamma = (self.drop_prob * feat_size[0] * feat_size[1]) + gamma /= ((feat_size[0] - self.block_size + 1) * + (feat_size[1] - self.block_size + 1)) + gamma /= (self.block_size**2) + factor = (1.0 if self.iter_cnt > self.warmup_iters else self.iter_cnt / + self.warmup_iters) + return gamma * factor + + def extra_repr(self): + return (f'drop_prob={self.drop_prob}, block_size={self.block_size}, ' + f'warmup_iters={self.warmup_iters}') diff --git a/mmdet/models/plugins/msdeformattn_pixel_decoder.py b/mmdet/models/plugins/msdeformattn_pixel_decoder.py new file mode 100644 index 0000000..d553582 --- /dev/null +++ b/mmdet/models/plugins/msdeformattn_pixel_decoder.py @@ -0,0 +1,269 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import (PLUGIN_LAYERS, Conv2d, ConvModule, caffe2_xavier_init, + normal_init, xavier_init) +from mmcv.cnn.bricks.transformer import (build_positional_encoding, + build_transformer_layer_sequence) +from mmcv.runner import BaseModule, ModuleList + +from mmdet.core.anchor import MlvlPointGenerator +from mmdet.models.utils.transformer import MultiScaleDeformableAttention + + +@PLUGIN_LAYERS.register_module() +class MSDeformAttnPixelDecoder(BaseModule): + """Pixel decoder with multi-scale deformable attention. + + Args: + in_channels (list[int] | tuple[int]): Number of channels in the + input feature maps. + strides (list[int] | tuple[int]): Output strides of feature from + backbone. + feat_channels (int): Number of channels for feature. + out_channels (int): Number of channels for output. + num_outs (int): Number of output scales. + norm_cfg (:obj:`mmcv.ConfigDict` | dict): Config for normalization. + Defaults to dict(type='GN', num_groups=32). + act_cfg (:obj:`mmcv.ConfigDict` | dict): Config for activation. + Defaults to dict(type='ReLU'). + encoder (:obj:`mmcv.ConfigDict` | dict): Config for transformer + encoder. Defaults to `DetrTransformerEncoder`. + positional_encoding (:obj:`mmcv.ConfigDict` | dict): Config for + transformer encoder position encoding. Defaults to + dict(type='SinePositionalEncoding', num_feats=128, + normalize=True). + init_cfg (:obj:`mmcv.ConfigDict` | dict): Initialization config dict. + """ + + def __init__(self, + in_channels=[256, 512, 1024, 2048], + strides=[4, 8, 16, 32], + feat_channels=256, + out_channels=256, + num_outs=3, + norm_cfg=dict(type='GN', num_groups=32), + act_cfg=dict(type='ReLU'), + encoder=dict( + type='DetrTransformerEncoder', + num_layers=6, + transformerlayers=dict( + type='BaseTransformerLayer', + attn_cfgs=dict( + type='MultiScaleDeformableAttention', + embed_dims=256, + num_heads=8, + num_levels=3, + num_points=4, + im2col_step=64, + dropout=0.0, + batch_first=False, + norm_cfg=None, + init_cfg=None), + feedforward_channels=1024, + ffn_dropout=0.0, + operation_order=('self_attn', 'norm', 'ffn', 'norm')), + init_cfg=None), + positional_encoding=dict( + type='SinePositionalEncoding', + num_feats=128, + normalize=True), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + self.strides = strides + self.num_input_levels = len(in_channels) + self.num_encoder_levels = \ + encoder.transformerlayers.attn_cfgs.num_levels + assert self.num_encoder_levels >= 1, \ + 'num_levels in attn_cfgs must be at least one' + input_conv_list = [] + # from top to down (low to high resolution) + for i in range(self.num_input_levels - 1, + self.num_input_levels - self.num_encoder_levels - 1, + -1): + input_conv = ConvModule( + in_channels[i], + feat_channels, + kernel_size=1, + norm_cfg=norm_cfg, + act_cfg=None, + bias=True) + input_conv_list.append(input_conv) + self.input_convs = ModuleList(input_conv_list) + + self.encoder = build_transformer_layer_sequence(encoder) + self.postional_encoding = build_positional_encoding( + positional_encoding) + # high resolution to low resolution + self.level_encoding = nn.Embedding(self.num_encoder_levels, + feat_channels) + + # fpn-like structure + self.lateral_convs = ModuleList() + self.output_convs = ModuleList() + self.use_bias = norm_cfg is None + # from top to down (low to high resolution) + # fpn for the rest features that didn't pass in encoder + for i in range(self.num_input_levels - self.num_encoder_levels - 1, -1, + -1): + lateral_conv = ConvModule( + in_channels[i], + feat_channels, + kernel_size=1, + bias=self.use_bias, + norm_cfg=norm_cfg, + act_cfg=None) + output_conv = ConvModule( + feat_channels, + feat_channels, + kernel_size=3, + stride=1, + padding=1, + bias=self.use_bias, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.lateral_convs.append(lateral_conv) + self.output_convs.append(output_conv) + + self.mask_feature = Conv2d( + feat_channels, out_channels, kernel_size=1, stride=1, padding=0) + + self.num_outs = num_outs + self.point_generator = MlvlPointGenerator(strides) + + def init_weights(self): + """Initialize weights.""" + for i in range(0, self.num_encoder_levels): + xavier_init( + self.input_convs[i].conv, + gain=1, + bias=0, + distribution='uniform') + + for i in range(0, self.num_input_levels - self.num_encoder_levels): + caffe2_xavier_init(self.lateral_convs[i].conv, bias=0) + caffe2_xavier_init(self.output_convs[i].conv, bias=0) + + caffe2_xavier_init(self.mask_feature, bias=0) + + normal_init(self.level_encoding, mean=0, std=1) + for p in self.encoder.parameters(): + if p.dim() > 1: + nn.init.xavier_normal_(p) + + # init_weights defined in MultiScaleDeformableAttention + for layer in self.encoder.layers: + for attn in layer.attentions: + if isinstance(attn, MultiScaleDeformableAttention): + attn.init_weights() + + def forward(self, feats): + """ + Args: + feats (list[Tensor]): Feature maps of each level. Each has + shape of (batch_size, c, h, w). + + Returns: + tuple: A tuple containing the following: + + - mask_feature (Tensor): shape (batch_size, c, h, w). + - multi_scale_features (list[Tensor]): Multi scale \ + features, each in shape (batch_size, c, h, w). + """ + # generate padding mask for each level, for each image + batch_size = feats[0].shape[0] + encoder_input_list = [] + padding_mask_list = [] + level_positional_encoding_list = [] + spatial_shapes = [] + reference_points_list = [] + for i in range(self.num_encoder_levels): + level_idx = self.num_input_levels - i - 1 + feat = feats[level_idx] + feat_projected = self.input_convs[i](feat) + h, w = feat.shape[-2:] + + # no padding + padding_mask_resized = feat.new_zeros( + (batch_size, ) + feat.shape[-2:], dtype=torch.bool) + pos_embed = self.postional_encoding(padding_mask_resized) + level_embed = self.level_encoding.weight[i] + level_pos_embed = level_embed.view(1, -1, 1, 1) + pos_embed + # (h_i * w_i, 2) + reference_points = self.point_generator.single_level_grid_priors( + feat.shape[-2:], level_idx, device=feat.device) + # normalize + factor = feat.new_tensor([[w, h]]) * self.strides[level_idx] + reference_points = reference_points / factor + + # shape (batch_size, c, h_i, w_i) -> (h_i * w_i, batch_size, c) + feat_projected = feat_projected.flatten(2).permute(2, 0, 1) + level_pos_embed = level_pos_embed.flatten(2).permute(2, 0, 1) + padding_mask_resized = padding_mask_resized.flatten(1) + + encoder_input_list.append(feat_projected) + padding_mask_list.append(padding_mask_resized) + level_positional_encoding_list.append(level_pos_embed) + spatial_shapes.append(feat.shape[-2:]) + reference_points_list.append(reference_points) + # shape (batch_size, total_num_query), + # total_num_query=sum([., h_i * w_i,.]) + padding_masks = torch.cat(padding_mask_list, dim=1) + # shape (total_num_query, batch_size, c) + encoder_inputs = torch.cat(encoder_input_list, dim=0) + level_positional_encodings = torch.cat( + level_positional_encoding_list, dim=0) + device = encoder_inputs.device + # shape (num_encoder_levels, 2), from low + # resolution to high resolution + spatial_shapes = torch.as_tensor( + spatial_shapes, dtype=torch.long, device=device) + # shape (0, h_0*w_0, h_0*w_0+h_1*w_1, ...) + level_start_index = torch.cat((spatial_shapes.new_zeros( + (1, )), spatial_shapes.prod(1).cumsum(0)[:-1])) + reference_points = torch.cat(reference_points_list, dim=0) + reference_points = reference_points[None, :, None].repeat( + batch_size, 1, self.num_encoder_levels, 1) + valid_radios = reference_points.new_ones( + (batch_size, self.num_encoder_levels, 2)) + # shape (num_total_query, batch_size, c) + memory = self.encoder( + query=encoder_inputs, + key=None, + value=None, + query_pos=level_positional_encodings, + key_pos=None, + attn_masks=None, + key_padding_mask=None, + query_key_padding_mask=padding_masks, + spatial_shapes=spatial_shapes, + reference_points=reference_points, + level_start_index=level_start_index, + valid_radios=valid_radios) + # (num_total_query, batch_size, c) -> (batch_size, c, num_total_query) + memory = memory.permute(1, 2, 0) + + # from low resolution to high resolution + num_query_per_level = [e[0] * e[1] for e in spatial_shapes] + outs = torch.split(memory, num_query_per_level, dim=-1) + outs = [ + x.reshape(batch_size, -1, spatial_shapes[i][0], + spatial_shapes[i][1]) for i, x in enumerate(outs) + ] + + for i in range(self.num_input_levels - self.num_encoder_levels - 1, -1, + -1): + x = feats[i] + cur_feat = self.lateral_convs[i](x) + y = cur_feat + F.interpolate( + outs[-1], + size=cur_feat.shape[-2:], + mode='bilinear', + align_corners=False) + y = self.output_convs[i](y) + outs.append(y) + multi_scale_features = outs[:self.num_outs] + + mask_feature = self.mask_feature(outs[-1]) + return mask_feature, multi_scale_features diff --git a/mmdet/models/plugins/pixel_decoder.py b/mmdet/models/plugins/pixel_decoder.py new file mode 100644 index 0000000..537a187 --- /dev/null +++ b/mmdet/models/plugins/pixel_decoder.py @@ -0,0 +1,243 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import PLUGIN_LAYERS, Conv2d, ConvModule, caffe2_xavier_init +from mmcv.cnn.bricks.transformer import (build_positional_encoding, + build_transformer_layer_sequence) +from mmcv.runner import BaseModule, ModuleList + + +@PLUGIN_LAYERS.register_module() +class PixelDecoder(BaseModule): + """Pixel decoder with a structure like fpn. + + Args: + in_channels (list[int] | tuple[int]): Number of channels in the + input feature maps. + feat_channels (int): Number channels for feature. + out_channels (int): Number channels for output. + norm_cfg (:obj:`mmcv.ConfigDict` | dict): Config for normalization. + Defaults to dict(type='GN', num_groups=32). + act_cfg (:obj:`mmcv.ConfigDict` | dict): Config for activation. + Defaults to dict(type='ReLU'). + encoder (:obj:`mmcv.ConfigDict` | dict): Config for transorformer + encoder.Defaults to None. + positional_encoding (:obj:`mmcv.ConfigDict` | dict): Config for + transformer encoder position encoding. Defaults to + dict(type='SinePositionalEncoding', num_feats=128, + normalize=True). + init_cfg (:obj:`mmcv.ConfigDict` | dict): Initialization config dict. + Default: None + """ + + def __init__(self, + in_channels, + feat_channels, + out_channels, + norm_cfg=dict(type='GN', num_groups=32), + act_cfg=dict(type='ReLU'), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + self.in_channels = in_channels + self.num_inputs = len(in_channels) + self.lateral_convs = ModuleList() + self.output_convs = ModuleList() + self.use_bias = norm_cfg is None + for i in range(0, self.num_inputs - 1): + lateral_conv = ConvModule( + in_channels[i], + feat_channels, + kernel_size=1, + bias=self.use_bias, + norm_cfg=norm_cfg, + act_cfg=None) + output_conv = ConvModule( + feat_channels, + feat_channels, + kernel_size=3, + stride=1, + padding=1, + bias=self.use_bias, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.lateral_convs.append(lateral_conv) + self.output_convs.append(output_conv) + + self.last_feat_conv = ConvModule( + in_channels[-1], + feat_channels, + kernel_size=3, + padding=1, + stride=1, + bias=self.use_bias, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.mask_feature = Conv2d( + feat_channels, out_channels, kernel_size=3, stride=1, padding=1) + + def init_weights(self): + """Initialize weights.""" + for i in range(0, self.num_inputs - 2): + caffe2_xavier_init(self.lateral_convs[i].conv, bias=0) + caffe2_xavier_init(self.output_convs[i].conv, bias=0) + + caffe2_xavier_init(self.mask_feature, bias=0) + caffe2_xavier_init(self.last_feat_conv, bias=0) + + def forward(self, feats, img_metas): + """ + Args: + feats (list[Tensor]): Feature maps of each level. Each has + shape of (batch_size, c, h, w). + img_metas (list[dict]): List of image information. Pass in + for creating more accurate padding mask. Not used here. + + Returns: + tuple: a tuple containing the following: + - mask_feature (Tensor): Shape (batch_size, c, h, w). + - memory (Tensor): Output of last stage of backbone.\ + Shape (batch_size, c, h, w). + """ + y = self.last_feat_conv(feats[-1]) + for i in range(self.num_inputs - 2, -1, -1): + x = feats[i] + cur_feat = self.lateral_convs[i](x) + y = cur_feat + \ + F.interpolate(y, size=cur_feat.shape[-2:], mode='nearest') + y = self.output_convs[i](y) + + mask_feature = self.mask_feature(y) + memory = feats[-1] + return mask_feature, memory + + +@PLUGIN_LAYERS.register_module() +class TransformerEncoderPixelDecoder(PixelDecoder): + """Pixel decoder with transormer encoder inside. + + Args: + in_channels (list[int] | tuple[int]): Number of channels in the + input feature maps. + feat_channels (int): Number channels for feature. + out_channels (int): Number channels for output. + norm_cfg (:obj:`mmcv.ConfigDict` | dict): Config for normalization. + Defaults to dict(type='GN', num_groups=32). + act_cfg (:obj:`mmcv.ConfigDict` | dict): Config for activation. + Defaults to dict(type='ReLU'). + encoder (:obj:`mmcv.ConfigDict` | dict): Config for transorformer + encoder.Defaults to None. + positional_encoding (:obj:`mmcv.ConfigDict` | dict): Config for + transformer encoder position encoding. Defaults to + dict(type='SinePositionalEncoding', num_feats=128, + normalize=True). + init_cfg (:obj:`mmcv.ConfigDict` | dict): Initialization config dict. + Default: None + """ + + def __init__(self, + in_channels, + feat_channels, + out_channels, + norm_cfg=dict(type='GN', num_groups=32), + act_cfg=dict(type='ReLU'), + encoder=None, + positional_encoding=dict( + type='SinePositionalEncoding', + num_feats=128, + normalize=True), + init_cfg=None): + super(TransformerEncoderPixelDecoder, self).__init__( + in_channels, + feat_channels, + out_channels, + norm_cfg, + act_cfg, + init_cfg=init_cfg) + self.last_feat_conv = None + + self.encoder = build_transformer_layer_sequence(encoder) + self.encoder_embed_dims = self.encoder.embed_dims + assert self.encoder_embed_dims == feat_channels, 'embed_dims({}) of ' \ + 'tranformer encoder must equal to feat_channels({})'.format( + feat_channels, self.encoder_embed_dims) + self.positional_encoding = build_positional_encoding( + positional_encoding) + self.encoder_in_proj = Conv2d( + in_channels[-1], feat_channels, kernel_size=1) + self.encoder_out_proj = ConvModule( + feat_channels, + feat_channels, + kernel_size=3, + stride=1, + padding=1, + bias=self.use_bias, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + def init_weights(self): + """Initialize weights.""" + for i in range(0, self.num_inputs - 2): + caffe2_xavier_init(self.lateral_convs[i].conv, bias=0) + caffe2_xavier_init(self.output_convs[i].conv, bias=0) + + caffe2_xavier_init(self.mask_feature, bias=0) + caffe2_xavier_init(self.encoder_in_proj, bias=0) + caffe2_xavier_init(self.encoder_out_proj.conv, bias=0) + + for p in self.encoder.parameters(): + if p.dim() > 1: + nn.init.xavier_uniform_(p) + + def forward(self, feats, img_metas): + """ + Args: + feats (list[Tensor]): Feature maps of each level. Each has + shape of (batch_size, c, h, w). + img_metas (list[dict]): List of image information. Pass in + for creating more accurate padding mask. + + Returns: + tuple: a tuple containing the following: + - mask_feature (Tensor): shape (batch_size, c, h, w). + - memory (Tensor): shape (batch_size, c, h, w). + """ + feat_last = feats[-1] + bs, c, h, w = feat_last.shape + input_img_h, input_img_w = img_metas[0]['batch_input_shape'] + padding_mask = feat_last.new_ones((bs, input_img_h, input_img_w), + dtype=torch.float32) + for i in range(bs): + img_h, img_w, _ = img_metas[i]['img_shape'] + padding_mask[i, :img_h, :img_w] = 0 + padding_mask = F.interpolate( + padding_mask.unsqueeze(1), + size=feat_last.shape[-2:], + mode='nearest').to(torch.bool).squeeze(1) + + pos_embed = self.positional_encoding(padding_mask) + feat_last = self.encoder_in_proj(feat_last) + # (batch_size, c, h, w) -> (num_queries, batch_size, c) + feat_last = feat_last.flatten(2).permute(2, 0, 1) + pos_embed = pos_embed.flatten(2).permute(2, 0, 1) + # (batch_size, h, w) -> (batch_size, h*w) + padding_mask = padding_mask.flatten(1) + memory = self.encoder( + query=feat_last, + key=None, + value=None, + query_pos=pos_embed, + query_key_padding_mask=padding_mask) + # (num_queries, batch_size, c) -> (batch_size, c, h, w) + memory = memory.permute(1, 2, 0).view(bs, self.encoder_embed_dims, h, + w) + y = self.encoder_out_proj(memory) + for i in range(self.num_inputs - 2, -1, -1): + x = feats[i] + cur_feat = self.lateral_convs[i](x) + y = cur_feat + \ + F.interpolate(y, size=cur_feat.shape[-2:], mode='nearest') + y = self.output_convs[i](y) + + mask_feature = self.mask_feature(y) + return mask_feature, memory diff --git a/mmdet/models/roi_heads/__init__.py b/mmdet/models/roi_heads/__init__.py new file mode 100644 index 0000000..baae2a0 --- /dev/null +++ b/mmdet/models/roi_heads/__init__.py @@ -0,0 +1,37 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .base_roi_head import BaseRoIHead +from .bbox_heads import (BBoxHead, ConvFCBBoxHead, DIIHead, + DoubleConvFCBBoxHead, SABLHead, SCNetBBoxHead, + Shared2FCBBoxHead, Shared4Conv1FCBBoxHead) +from .cascade_roi_head import CascadeRoIHead +from .double_roi_head import DoubleHeadRoIHead +from .dynamic_roi_head import DynamicRoIHead +from .grid_roi_head import GridRoIHead +from .htc_roi_head import HybridTaskCascadeRoIHead +from .mask_heads import (CoarseMaskHead, FCNMaskHead, FeatureRelayHead, + FusedSemanticHead, GlobalContextHead, GridHead, + HTCMaskHead, MaskIoUHead, MaskPointHead, + SCNetMaskHead, SCNetSemanticHead) +from .mask_scoring_roi_head import MaskScoringRoIHead +from .pisa_roi_head import PISARoIHead +from .point_rend_roi_head import PointRendRoIHead +from .roi_extractors import (BaseRoIExtractor, GenericRoIExtractor, + SingleRoIExtractor) +from .scnet_roi_head import SCNetRoIHead +from .shared_heads import ResLayer +from .sparse_roi_head import SparseRoIHead +from .standard_roi_head import StandardRoIHead +from .trident_roi_head import TridentRoIHead + +__all__ = [ + 'BaseRoIHead', 'CascadeRoIHead', 'DoubleHeadRoIHead', 'MaskScoringRoIHead', + 'HybridTaskCascadeRoIHead', 'GridRoIHead', 'ResLayer', 'BBoxHead', + 'ConvFCBBoxHead', 'DIIHead', 'SABLHead', 'Shared2FCBBoxHead', + 'StandardRoIHead', 'Shared4Conv1FCBBoxHead', 'DoubleConvFCBBoxHead', + 'FCNMaskHead', 'HTCMaskHead', 'FusedSemanticHead', 'GridHead', + 'MaskIoUHead', 'BaseRoIExtractor', 'GenericRoIExtractor', + 'SingleRoIExtractor', 'PISARoIHead', 'PointRendRoIHead', 'MaskPointHead', + 'CoarseMaskHead', 'DynamicRoIHead', 'SparseRoIHead', 'TridentRoIHead', + 'SCNetRoIHead', 'SCNetMaskHead', 'SCNetSemanticHead', 'SCNetBBoxHead', + 'FeatureRelayHead', 'GlobalContextHead' +] diff --git a/mmdet/models/roi_heads/base_roi_head.py b/mmdet/models/roi_heads/base_roi_head.py new file mode 100644 index 0000000..4adbdef --- /dev/null +++ b/mmdet/models/roi_heads/base_roi_head.py @@ -0,0 +1,103 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from abc import ABCMeta, abstractmethod + +from mmcv.runner import BaseModule + +from ..builder import build_shared_head + + +class BaseRoIHead(BaseModule, metaclass=ABCMeta): + """Base class for RoIHeads.""" + + def __init__(self, + bbox_roi_extractor=None, + bbox_head=None, + mask_roi_extractor=None, + mask_head=None, + shared_head=None, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + super(BaseRoIHead, self).__init__(init_cfg) + self.train_cfg = train_cfg + self.test_cfg = test_cfg + if shared_head is not None: + shared_head.pretrained = pretrained + self.shared_head = build_shared_head(shared_head) + + if bbox_head is not None: + self.init_bbox_head(bbox_roi_extractor, bbox_head) + + if mask_head is not None: + self.init_mask_head(mask_roi_extractor, mask_head) + + self.init_assigner_sampler() + + @property + def with_bbox(self): + """bool: whether the RoI head contains a `bbox_head`""" + return hasattr(self, 'bbox_head') and self.bbox_head is not None + + @property + def with_mask(self): + """bool: whether the RoI head contains a `mask_head`""" + return hasattr(self, 'mask_head') and self.mask_head is not None + + @property + def with_shared_head(self): + """bool: whether the RoI head contains a `shared_head`""" + return hasattr(self, 'shared_head') and self.shared_head is not None + + @abstractmethod + def init_bbox_head(self): + """Initialize ``bbox_head``""" + pass + + @abstractmethod + def init_mask_head(self): + """Initialize ``mask_head``""" + pass + + @abstractmethod + def init_assigner_sampler(self): + """Initialize assigner and sampler.""" + pass + + @abstractmethod + def forward_train(self, + x, + img_meta, + proposal_list, + gt_bboxes, + gt_labels, + gt_bboxes_ignore=None, + gt_masks=None, + **kwargs): + """Forward function during training.""" + + async def async_simple_test(self, + x, + proposal_list, + img_metas, + proposals=None, + rescale=False, + **kwargs): + """Asynchronized test function.""" + raise NotImplementedError + + def simple_test(self, + x, + proposal_list, + img_meta, + proposals=None, + rescale=False, + **kwargs): + """Test without augmentation.""" + + def aug_test(self, x, proposal_list, img_metas, rescale=False, **kwargs): + """Test with augmentations. + + If rescale is False, then returned bboxes and masks will fit the scale + of imgs[0]. + """ diff --git a/mmdet/models/roi_heads/bbox_heads/__init__.py b/mmdet/models/roi_heads/bbox_heads/__init__.py new file mode 100644 index 0000000..d1207db --- /dev/null +++ b/mmdet/models/roi_heads/bbox_heads/__init__.py @@ -0,0 +1,14 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .bbox_head import BBoxHead +from .convfc_bbox_head import (ConvFCBBoxHead, Shared2FCBBoxHead, + Shared4Conv1FCBBoxHead) +from .dii_head import DIIHead +from .double_bbox_head import DoubleConvFCBBoxHead +from .sabl_head import SABLHead +from .scnet_bbox_head import SCNetBBoxHead + +__all__ = [ + 'BBoxHead', 'ConvFCBBoxHead', 'Shared2FCBBoxHead', + 'Shared4Conv1FCBBoxHead', 'DoubleConvFCBBoxHead', 'SABLHead', 'DIIHead', + 'SCNetBBoxHead' +] diff --git a/mmdet/models/roi_heads/bbox_heads/bbox_head.py b/mmdet/models/roi_heads/bbox_heads/bbox_head.py new file mode 100644 index 0000000..c26c82d --- /dev/null +++ b/mmdet/models/roi_heads/bbox_heads/bbox_head.py @@ -0,0 +1,715 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.runner import BaseModule, auto_fp16, force_fp32 +from torch.nn.modules.utils import _pair + +from mmdet.core import build_bbox_coder, multi_apply, multiclass_nms +from mmdet.models.builder import HEADS, build_loss +from mmdet.models.losses import accuracy +from mmdet.models.utils import build_linear_layer +from mmdet.core.bbox.iou_calculators import bbox_overlaps +from my_equation import * +import global_placeholder + + +@HEADS.register_module() +class BBoxHead(BaseModule): + """Simplest RoI head, with only two fc layers for classification and + regression respectively.""" + + def __init__(self, + with_avg_pool=False, + with_cls=True, + with_reg=True, + roi_feat_size=7, + in_channels=256, + num_classes=80, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + clip_border=True, + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + reg_decoded_bbox=False, + reg_predictor_cfg=dict(type='Linear'), + cls_predictor_cfg=dict(type='Linear'), + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox=dict( + type='SmoothL1Loss', beta=1.0, loss_weight=1.0), + init_cfg=None): + super(BBoxHead, self).__init__(init_cfg) + assert with_cls or with_reg + self.with_avg_pool = with_avg_pool + self.with_cls = with_cls + self.with_reg = with_reg + self.roi_feat_size = _pair(roi_feat_size) + self.roi_feat_area = self.roi_feat_size[0] * self.roi_feat_size[1] + self.in_channels = in_channels + self.num_classes = num_classes + self.reg_class_agnostic = reg_class_agnostic + self.reg_decoded_bbox = reg_decoded_bbox + self.reg_predictor_cfg = reg_predictor_cfg + self.cls_predictor_cfg = cls_predictor_cfg + self.fp16_enabled = False + + self.bbox_coder = build_bbox_coder(bbox_coder) + self.loss_cls = build_loss(loss_cls) + self.loss_bbox = build_loss(loss_bbox) + + in_channels = self.in_channels + if self.with_avg_pool: + self.avg_pool = nn.AvgPool2d(self.roi_feat_size) + else: + in_channels *= self.roi_feat_area + if self.with_cls: + # need to add background class + if self.custom_cls_channels: + cls_channels = self.loss_cls.get_cls_channels(self.num_classes) + else: + cls_channels = num_classes + 1 + self.fc_cls = build_linear_layer( + self.cls_predictor_cfg, + in_features=in_channels, + out_features=cls_channels) + if self.with_reg: + out_dim_reg = 4 if reg_class_agnostic else 4 * num_classes + self.fc_reg = build_linear_layer( + self.reg_predictor_cfg, + in_features=in_channels, + out_features=out_dim_reg) + self.debug_imgs = None + if init_cfg is None: + self.init_cfg = [] + if self.with_cls: + self.init_cfg += [ + dict( + type='Normal', std=0.01, override=dict(name='fc_cls')) + ] + if self.with_reg: + self.init_cfg += [ + dict( + type='Normal', std=0.001, override=dict(name='fc_reg')) + ] + + @property + def custom_cls_channels(self): + return getattr(self.loss_cls, 'custom_cls_channels', False) + + @property + def custom_activation(self): + return getattr(self.loss_cls, 'custom_activation', False) + + @property + def custom_accuracy(self): + return getattr(self.loss_cls, 'custom_accuracy', False) + + @auto_fp16() + def forward(self, x): + if self.with_avg_pool: + if x.numel() > 0: + x = self.avg_pool(x) + x = x.view(x.size(0), -1) + else: + # avg_pool does not support empty tensor, + # so use torch.mean instead it + x = torch.mean(x, dim=(-1, -2)) + cls_score = self.fc_cls(x) if self.with_cls else None + bbox_pred = self.fc_reg(x) if self.with_reg else None + return cls_score, bbox_pred + + def _get_target_single(self, pos_bboxes, neg_bboxes, pos_gt_bboxes, + pos_gt_labels, cfg): + """Calculate the ground truth for proposals in the single image + according to the sampling results. + + Args: + pos_bboxes (Tensor): Contains all the positive boxes, + has shape (num_pos, 4), the last dimension 4 + represents [tl_x, tl_y, br_x, br_y]. + neg_bboxes (Tensor): Contains all the negative boxes, + has shape (num_neg, 4), the last dimension 4 + represents [tl_x, tl_y, br_x, br_y]. + pos_gt_bboxes (Tensor): Contains gt_boxes for + all positive samples, has shape (num_pos, 4), + the last dimension 4 + represents [tl_x, tl_y, br_x, br_y]. + pos_gt_labels (Tensor): Contains gt_labels for + all positive samples, has shape (num_pos, ). + cfg (obj:`ConfigDict`): `train_cfg` of R-CNN. + + Returns: + Tuple[Tensor]: Ground truth for proposals + in a single image. Containing the following Tensors: + + - labels(Tensor): Gt_labels for all proposals, has + shape (num_proposals,). + - label_weights(Tensor): Labels_weights for all + proposals, has shape (num_proposals,). + - bbox_targets(Tensor):Regression target for all + proposals, has shape (num_proposals, 4), the + last dimension 4 represents [tl_x, tl_y, br_x, br_y]. + - bbox_weights(Tensor):Regression weights for all + proposals, has shape (num_proposals, 4). + """ + num_pos = pos_bboxes.size(0) + num_neg = neg_bboxes.size(0) + num_samples = num_pos + num_neg + + # original implementation uses new_zeros since BG are set to be 0 + # now use empty & fill because BG cat_id = num_classes, + # FG cat_id = [0, num_classes-1] + labels = pos_bboxes.new_full((num_samples, ), + self.num_classes, + dtype=torch.long) + label_weights = pos_bboxes.new_zeros(num_samples) + bbox_targets = pos_bboxes.new_zeros(num_samples, 4) + bbox_weights = pos_bboxes.new_zeros(num_samples, 4) + if num_pos > 0: + labels[:num_pos] = pos_gt_labels + pos_weight = 1.0 if cfg.pos_weight <= 0 else cfg.pos_weight + label_weights[:num_pos] = pos_weight + if not self.reg_decoded_bbox: + pos_bbox_targets = self.bbox_coder.encode( + pos_bboxes, pos_gt_bboxes) + else: + # When the regression loss (e.g. `IouLoss`, `GIouLoss`) + # is applied directly on the decoded bounding boxes, both + # the predicted boxes and regression targets should be with + # absolute coordinate format. + pos_bbox_targets = pos_gt_bboxes + bbox_targets[:num_pos, :] = pos_bbox_targets + bbox_weights[:num_pos, :] = 1 + if num_neg > 0: + label_weights[-num_neg:] = 1.0 + + return labels, label_weights, bbox_targets, bbox_weights + + def get_targets(self, + sampling_results, + gt_bboxes, + gt_labels, + rcnn_train_cfg, + concat=True): + """Calculate the ground truth for all samples in a batch according to + the sampling_results. + + Almost the same as the implementation in bbox_head, we passed + additional parameters pos_inds_list and neg_inds_list to + `_get_target_single` function. + + Args: + sampling_results (List[obj:SamplingResults]): Assign results of + all images in a batch after sampling. + gt_bboxes (list[Tensor]): Gt_bboxes of all images in a batch, + each tensor has shape (num_gt, 4), the last dimension 4 + represents [tl_x, tl_y, br_x, br_y]. + gt_labels (list[Tensor]): Gt_labels of all images in a batch, + each tensor has shape (num_gt,). + rcnn_train_cfg (obj:ConfigDict): `train_cfg` of RCNN. + concat (bool): Whether to concatenate the results of all + the images in a single batch. + + Returns: + Tuple[Tensor]: Ground truth for proposals in a single image. + Containing the following list of Tensors: + + - labels (list[Tensor],Tensor): Gt_labels for all + proposals in a batch, each tensor in list has + shape (num_proposals,) when `concat=False`, otherwise + just a single tensor has shape (num_all_proposals,). + - label_weights (list[Tensor]): Labels_weights for + all proposals in a batch, each tensor in list has + shape (num_proposals,) when `concat=False`, otherwise + just a single tensor has shape (num_all_proposals,). + - bbox_targets (list[Tensor],Tensor): Regression target + for all proposals in a batch, each tensor in list + has shape (num_proposals, 4) when `concat=False`, + otherwise just a single tensor has shape + (num_all_proposals, 4), the last dimension 4 represents + [tl_x, tl_y, br_x, br_y]. + - bbox_weights (list[tensor],Tensor): Regression weights for + all proposals in a batch, each tensor in list has shape + (num_proposals, 4) when `concat=False`, otherwise just a + single tensor has shape (num_all_proposals, 4). + """ + pos_bboxes_list = [res.pos_bboxes for res in sampling_results] + neg_bboxes_list = [res.neg_bboxes for res in sampling_results] + pos_gt_bboxes_list = [res.pos_gt_bboxes for res in sampling_results] + pos_gt_labels_list = [res.pos_gt_labels for res in sampling_results] + labels, label_weights, bbox_targets, bbox_weights = multi_apply( + self._get_target_single, + pos_bboxes_list, + neg_bboxes_list, + pos_gt_bboxes_list, + pos_gt_labels_list, + cfg=rcnn_train_cfg) + + if concat: + labels = torch.cat(labels, 0) + label_weights = torch.cat(label_weights, 0) + bbox_targets = torch.cat(bbox_targets, 0) + bbox_weights = torch.cat(bbox_weights, 0) + return labels, label_weights, bbox_targets, bbox_weights + + @force_fp32(apply_to=('cls_score', 'bbox_pred')) + def loss(self, + cls_score, + bbox_pred, + rois, + labels, + label_weights, + bbox_targets, + bbox_weights, + reduction_override=None): + losses = dict() # TODO 这里得好整 + if cls_score is not None: + avg_factor = max(torch.sum(label_weights > 0).float().item(), 1.) + if cls_score.numel() > 0: + loss_cls_ = self.loss_cls( + cls_score, + labels, + label_weights, + # avg_factor=avg_factor, + reduction_override='none') + # loss_cls_ = loss_cls_.sum(dim=1) + + if isinstance(loss_cls_, dict): + losses.update(loss_cls_) + else: + losses['loss_cls'] = loss_cls_ + if self.custom_activation: + acc_ = self.loss_cls.get_accuracy(cls_score, labels) + losses.update(acc_) + else: + losses['acc'] = accuracy(cls_score, labels) + if bbox_pred is not None: + bg_class_ind = self.num_classes + # 0~self.num_classes-1 are FG, self.num_classes is BG + pos_inds = (labels >= 0) & (labels < bg_class_ind) + # do not perform bounding box regression for BG anymore. + if pos_inds.any(): + if self.reg_decoded_bbox: + # When the regression loss (e.g. `IouLoss`, + # `GIouLoss`, `DIouLoss`) is applied directly on + # the decoded bounding boxes, it decodes the + # already encoded coordinates to absolute format. + raise NotImplementedError + bbox_pred = self.bbox_coder.decode(rois[:, 1:], bbox_pred) + if self.reg_class_agnostic: + pos_bbox_pred = bbox_pred.view( + bbox_pred.size(0), 4)[pos_inds.type(torch.bool)] + else: + pos_bbox_pred = bbox_pred.view( + bbox_pred.size(0), -1, + 4)[pos_inds.type(torch.bool), + labels[pos_inds.type(torch.bool)]] + losses['loss_bbox'] = self.loss_bbox( + pos_bbox_pred, + bbox_targets[pos_inds.type(torch.bool)], + bbox_weights[pos_inds.type(torch.bool)], + # avg_factor=bbox_targets.size(0), + reduction_override='none') + + losses['loss_bbox'] = losses['loss_bbox'].sum(dim=1) + + else: + losses['loss_bbox'] = bbox_pred[pos_inds].sum() + + + + + from mmdet.models.dense_heads import RetinaHead, RPNHead + if global_placeholder.mybuff_flag and not isinstance(self, RPNHead) and pos_inds.any(): + + if isinstance(self, RetinaHead): + conf_values = torch.sigmoid(cls_score) # TODO 看一下FRCNN的cls是啥? + else: + conf_values = F.softmax(cls_score, dim=1) + num_classes = conf_values.shape[-1] + if num_classes == 81 or num_classes == 21: + # 说明默认backbgound为81类 21类 + pos_gtconf_idx = F.one_hot(labels, num_classes=num_classes) + else: + # 说明没有显式给出类 + + num_classes = num_classes + 1 + pos_gtconf_idx = F.one_hot(labels, num_classes=num_classes) + pos_gtconf_idx = pos_gtconf_idx[:, :-1]# 剔除最后一个背景类 + + pos_gtconf_values, _ = (conf_values * pos_gtconf_idx).max(dim=1) + pos_gtconf_values = pos_gtconf_values[pos_inds] + + pos_conf_values, pos_conf_values_idx = conf_values.max(dim=1) + pos_conf_values = pos_conf_values[pos_inds] + + anchors = rois[:, 1:][pos_inds] + abs_bbox_pred = self.bbox_coder.decode(anchors, pos_bbox_pred) # 直接解读 + abs_bbox_targets = self.bbox_coder.decode(anchors, bbox_targets[pos_inds]) # 直接解读 + pos_ious = bbox_overlaps(abs_bbox_pred, abs_bbox_targets, is_aligned=True) # 这玩意得是ltrb坐标,好像就已经是了??? + if global_placeholder.mybuff_flag == 1: + losses['loss_bbox'], losses['loss_cls'][pos_inds] = HQOD_loss(losses['loss_bbox'], losses['loss_cls'][pos_inds], conf_values[pos_inds], pos_gtconf_values, pos_conf_values, pos_ious, torch.tensor(1.)) + elif global_placeholder.mybuff_flag == 2: + # HarDet + losses['loss_bbox'], losses['loss_cls'][pos_inds] = HarDet_loss(losses['loss_bbox'], losses['loss_cls'][pos_inds], conf_values[pos_inds], pos_gtconf_values, pos_conf_values, pos_ious, torch.tensor(1.)) + else: + raise NotImplementedError + + + + + + loss_cls = losses['loss_cls'].sum() / avg_factor + loss_bbox = losses['loss_bbox'].sum() / bbox_targets.size(0) + + + return losses + + + # @force_fp32(apply_to=('cls_score', 'bbox_pred')) + # def loss(self, + # cls_score, + # bbox_pred, + # rois, + # labels, + # label_weights, + # bbox_targets, + # bbox_weights, + # reduction_override=None): + # losses = dict() # TODO 这里得好整 + # if cls_score is not None: + # avg_factor = max(torch.sum(label_weights > 0).float().item(), 1.) + # if cls_score.numel() > 0: + # loss_cls_ = self.loss_cls( + # cls_score, + # labels, + # label_weights, + # avg_factor=avg_factor, + # reduction_override=reduction_override) + # if isinstance(loss_cls_, dict): + # losses.update(loss_cls_) + # else: + # losses['loss_cls'] = loss_cls_ + # if self.custom_activation: + # acc_ = self.loss_cls.get_accuracy(cls_score, labels) + # losses.update(acc_) + # else: + # losses['acc'] = accuracy(cls_score, labels) + # if bbox_pred is not None: + # bg_class_ind = self.num_classes + # # 0~self.num_classes-1 are FG, self.num_classes is BG + # pos_inds = (labels >= 0) & (labels < bg_class_ind) + # # do not perform bounding box regression for BG anymore. + # if pos_inds.any(): + # if self.reg_decoded_bbox: + # # When the regression loss (e.g. `IouLoss`, + # # `GIouLoss`, `DIouLoss`) is applied directly on + # # the decoded bounding boxes, it decodes the + # # already encoded coordinates to absolute format. + # bbox_pred = self.bbox_coder.decode(rois[:, 1:], bbox_pred) + # if self.reg_class_agnostic: + # pos_bbox_pred = bbox_pred.view( + # bbox_pred.size(0), 4)[pos_inds.type(torch.bool)] + # else: + # pos_bbox_pred = bbox_pred.view( + # bbox_pred.size(0), -1, + # 4)[pos_inds.type(torch.bool), + # labels[pos_inds.type(torch.bool)]] + # losses['loss_bbox'] = self.loss_bbox( + # pos_bbox_pred, + # bbox_targets[pos_inds.type(torch.bool)], + # bbox_weights[pos_inds.type(torch.bool)], + # avg_factor=bbox_targets.size(0), + # reduction_override=reduction_override) + # else: + # losses['loss_bbox'] = bbox_pred[pos_inds].sum() + + + + + # return losses + + @force_fp32(apply_to=('cls_score', 'bbox_pred')) + def get_bboxes(self, + rois, + cls_score, + bbox_pred, + img_shape, + scale_factor, + rescale=False, + cfg=None): + """Transform network output for a batch into bbox predictions. + + Args: + rois (Tensor): Boxes to be transformed. Has shape (num_boxes, 5). + last dimension 5 arrange as (batch_index, x1, y1, x2, y2). + cls_score (Tensor): Box scores, has shape + (num_boxes, num_classes + 1). + bbox_pred (Tensor, optional): Box energies / deltas. + has shape (num_boxes, num_classes * 4). + img_shape (Sequence[int], optional): Maximum bounds for boxes, + specifies (H, W, C) or (H, W). + scale_factor (ndarray): Scale factor of the + image arrange as (w_scale, h_scale, w_scale, h_scale). + rescale (bool): If True, return boxes in original image space. + Default: False. + cfg (obj:`ConfigDict`): `test_cfg` of Bbox Head. Default: None + + Returns: + tuple[Tensor, Tensor]: + First tensor is `det_bboxes`, has the shape + (num_boxes, 5) and last + dimension 5 represent (tl_x, tl_y, br_x, br_y, score). + Second tensor is the labels with shape (num_boxes, ). + """ + + # some loss (Seesaw loss..) may have custom activation + if self.custom_cls_channels: + scores = self.loss_cls.get_activation(cls_score) + else: + scores = F.softmax( + cls_score, dim=-1) if cls_score is not None else None + # bbox_pred would be None in some detector when with_reg is False, + # e.g. Grid R-CNN. + if bbox_pred is not None: + bboxes = self.bbox_coder.decode( + rois[..., 1:], bbox_pred, max_shape=img_shape) + else: + bboxes = rois[:, 1:].clone() + if img_shape is not None: + bboxes[:, [0, 2]].clamp_(min=0, max=img_shape[1]) + bboxes[:, [1, 3]].clamp_(min=0, max=img_shape[0]) + + if rescale and bboxes.size(0) > 0: + scale_factor = bboxes.new_tensor(scale_factor) + bboxes = (bboxes.view(bboxes.size(0), -1, 4) / scale_factor).view( + bboxes.size()[0], -1) + + if cfg is None: + return bboxes, scores + else: + det_bboxes, det_labels = multiclass_nms(bboxes, scores, + cfg.score_thr, cfg.nms, + cfg.max_per_img) + + return det_bboxes, det_labels + + @force_fp32(apply_to=('bbox_preds', )) + def refine_bboxes(self, rois, labels, bbox_preds, pos_is_gts, img_metas): + """Refine bboxes during training. + + Args: + rois (Tensor): Shape (n*bs, 5), where n is image number per GPU, + and bs is the sampled RoIs per image. The first column is + the image id and the next 4 columns are x1, y1, x2, y2. + labels (Tensor): Shape (n*bs, ). + bbox_preds (Tensor): Shape (n*bs, 4) or (n*bs, 4*#class). + pos_is_gts (list[Tensor]): Flags indicating if each positive bbox + is a gt bbox. + img_metas (list[dict]): Meta info of each image. + + Returns: + list[Tensor]: Refined bboxes of each image in a mini-batch. + + Example: + >>> # xdoctest: +REQUIRES(module:kwarray) + >>> import kwarray + >>> import numpy as np + >>> from mmdet.core.bbox.demodata import random_boxes + >>> self = BBoxHead(reg_class_agnostic=True) + >>> n_roi = 2 + >>> n_img = 4 + >>> scale = 512 + >>> rng = np.random.RandomState(0) + >>> img_metas = [{'img_shape': (scale, scale)} + ... for _ in range(n_img)] + >>> # Create rois in the expected format + >>> roi_boxes = random_boxes(n_roi, scale=scale, rng=rng) + >>> img_ids = torch.randint(0, n_img, (n_roi,)) + >>> img_ids = img_ids.float() + >>> rois = torch.cat([img_ids[:, None], roi_boxes], dim=1) + >>> # Create other args + >>> labels = torch.randint(0, 2, (n_roi,)).long() + >>> bbox_preds = random_boxes(n_roi, scale=scale, rng=rng) + >>> # For each image, pretend random positive boxes are gts + >>> is_label_pos = (labels.numpy() > 0).astype(np.int) + >>> lbl_per_img = kwarray.group_items(is_label_pos, + ... img_ids.numpy()) + >>> pos_per_img = [sum(lbl_per_img.get(gid, [])) + ... for gid in range(n_img)] + >>> pos_is_gts = [ + >>> torch.randint(0, 2, (npos,)).byte().sort( + >>> descending=True)[0] + >>> for npos in pos_per_img + >>> ] + >>> bboxes_list = self.refine_bboxes(rois, labels, bbox_preds, + >>> pos_is_gts, img_metas) + >>> print(bboxes_list) + """ + img_ids = rois[:, 0].long().unique(sorted=True) + assert img_ids.numel() <= len(img_metas) + + bboxes_list = [] + for i in range(len(img_metas)): + inds = torch.nonzero( + rois[:, 0] == i, as_tuple=False).squeeze(dim=1) + num_rois = inds.numel() + + bboxes_ = rois[inds, 1:] + label_ = labels[inds] + bbox_pred_ = bbox_preds[inds] + img_meta_ = img_metas[i] + pos_is_gts_ = pos_is_gts[i] + + bboxes = self.regress_by_class(bboxes_, label_, bbox_pred_, + img_meta_) + + # filter gt bboxes + pos_keep = 1 - pos_is_gts_ + keep_inds = pos_is_gts_.new_ones(num_rois) + keep_inds[:len(pos_is_gts_)] = pos_keep + + bboxes_list.append(bboxes[keep_inds.type(torch.bool)]) + + return bboxes_list + + @force_fp32(apply_to=('bbox_pred', )) + def regress_by_class(self, rois, label, bbox_pred, img_meta): + """Regress the bbox for the predicted class. Used in Cascade R-CNN. + + Args: + rois (Tensor): Rois from `rpn_head` or last stage + `bbox_head`, has shape (num_proposals, 4) or + (num_proposals, 5). + label (Tensor): Only used when `self.reg_class_agnostic` + is False, has shape (num_proposals, ). + bbox_pred (Tensor): Regression prediction of + current stage `bbox_head`. When `self.reg_class_agnostic` + is False, it has shape (n, num_classes * 4), otherwise + it has shape (n, 4). + img_meta (dict): Image meta info. + + Returns: + Tensor: Regressed bboxes, the same shape as input rois. + """ + + assert rois.size(1) == 4 or rois.size(1) == 5, repr(rois.shape) + + if not self.reg_class_agnostic: + label = label * 4 + inds = torch.stack((label, label + 1, label + 2, label + 3), 1) + bbox_pred = torch.gather(bbox_pred, 1, inds) + assert bbox_pred.size(1) == 4 + + max_shape = img_meta['img_shape'] + + if rois.size(1) == 4: + new_rois = self.bbox_coder.decode( + rois, bbox_pred, max_shape=max_shape) + else: + bboxes = self.bbox_coder.decode( + rois[:, 1:], bbox_pred, max_shape=max_shape) + new_rois = torch.cat((rois[:, [0]], bboxes), dim=1) + + return new_rois + + def onnx_export(self, + rois, + cls_score, + bbox_pred, + img_shape, + cfg=None, + **kwargs): + """Transform network output for a batch into bbox predictions. + + Args: + rois (Tensor): Boxes to be transformed. + Has shape (B, num_boxes, 5) + cls_score (Tensor): Box scores. has shape + (B, num_boxes, num_classes + 1), 1 represent the background. + bbox_pred (Tensor, optional): Box energies / deltas for, + has shape (B, num_boxes, num_classes * 4) when. + img_shape (torch.Tensor): Shape of image. + cfg (obj:`ConfigDict`): `test_cfg` of Bbox Head. Default: None + + Returns: + tuple[Tensor, Tensor]: dets of shape [N, num_det, 5] + and class labels of shape [N, num_det]. + """ + + assert rois.ndim == 3, 'Only support export two stage ' \ + 'model to ONNX ' \ + 'with batch dimension. ' + if self.custom_cls_channels: + scores = self.loss_cls.get_activation(cls_score) + else: + scores = F.softmax( + cls_score, dim=-1) if cls_score is not None else None + + if bbox_pred is not None: + bboxes = self.bbox_coder.decode( + rois[..., 1:], bbox_pred, max_shape=img_shape) + else: + bboxes = rois[..., 1:].clone() + if img_shape is not None: + max_shape = bboxes.new_tensor(img_shape)[..., :2] + min_xy = bboxes.new_tensor(0) + max_xy = torch.cat( + [max_shape] * 2, dim=-1).flip(-1).unsqueeze(-2) + bboxes = torch.where(bboxes < min_xy, min_xy, bboxes) + bboxes = torch.where(bboxes > max_xy, max_xy, bboxes) + + # Replace multiclass_nms with ONNX::NonMaxSuppression in deployment + from mmdet.core.export import add_dummy_nms_for_onnx + max_output_boxes_per_class = cfg.nms.get('max_output_boxes_per_class', + cfg.max_per_img) + iou_threshold = cfg.nms.get('iou_threshold', 0.5) + score_threshold = cfg.score_thr + nms_pre = cfg.get('deploy_nms_pre', -1) + + scores = scores[..., :self.num_classes] + if self.reg_class_agnostic: + return add_dummy_nms_for_onnx( + bboxes, + scores, + max_output_boxes_per_class, + iou_threshold, + score_threshold, + pre_top_k=nms_pre, + after_top_k=cfg.max_per_img) + else: + batch_size = scores.shape[0] + labels = torch.arange( + self.num_classes, dtype=torch.long).to(scores.device) + labels = labels.view(1, 1, -1).expand_as(scores) + labels = labels.reshape(batch_size, -1) + scores = scores.reshape(batch_size, -1) + bboxes = bboxes.reshape(batch_size, -1, 4) + + max_size = torch.max(img_shape) + # Offset bboxes of each class so that bboxes of different labels + # do not overlap. + offsets = (labels * max_size + 1).unsqueeze(2) + bboxes_for_nms = bboxes + offsets + + batch_dets, labels = add_dummy_nms_for_onnx( + bboxes_for_nms, + scores.unsqueeze(2), + max_output_boxes_per_class, + iou_threshold, + score_threshold, + pre_top_k=nms_pre, + after_top_k=cfg.max_per_img, + labels=labels) + # Offset the bboxes back after dummy nms. + offsets = (labels * max_size + 1).unsqueeze(2) + # Indexing + inplace operation fails with dynamic shape in ONNX + # original style: batch_dets[..., :4] -= offsets + bboxes, scores = batch_dets[..., 0:4], batch_dets[..., 4:5] + bboxes -= offsets + batch_dets = torch.cat([bboxes, scores], dim=2) + return batch_dets, labels diff --git a/mmdet/models/roi_heads/bbox_heads/convfc_bbox_head.py b/mmdet/models/roi_heads/bbox_heads/convfc_bbox_head.py new file mode 100644 index 0000000..2dca4db --- /dev/null +++ b/mmdet/models/roi_heads/bbox_heads/convfc_bbox_head.py @@ -0,0 +1,239 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +from mmcv.cnn import ConvModule + +from mmdet.models.builder import HEADS +from mmdet.models.utils import build_linear_layer +from .bbox_head import BBoxHead + + +@HEADS.register_module() +class ConvFCBBoxHead(BBoxHead): + r"""More general bbox head, with shared conv and fc layers and two optional + separated branches. + + .. code-block:: none + + /-> cls convs -> cls fcs -> cls + shared convs -> shared fcs + \-> reg convs -> reg fcs -> reg + """ # noqa: W605 + + def __init__(self, + num_shared_convs=0, + num_shared_fcs=0, + num_cls_convs=0, + num_cls_fcs=0, + num_reg_convs=0, + num_reg_fcs=0, + conv_out_channels=256, + fc_out_channels=1024, + conv_cfg=None, + norm_cfg=None, + init_cfg=None, + *args, + **kwargs): + super(ConvFCBBoxHead, self).__init__( + *args, init_cfg=init_cfg, **kwargs) + assert (num_shared_convs + num_shared_fcs + num_cls_convs + + num_cls_fcs + num_reg_convs + num_reg_fcs > 0) + if num_cls_convs > 0 or num_reg_convs > 0: + assert num_shared_fcs == 0 + if not self.with_cls: + assert num_cls_convs == 0 and num_cls_fcs == 0 + if not self.with_reg: + assert num_reg_convs == 0 and num_reg_fcs == 0 + self.num_shared_convs = num_shared_convs + self.num_shared_fcs = num_shared_fcs + self.num_cls_convs = num_cls_convs + self.num_cls_fcs = num_cls_fcs + self.num_reg_convs = num_reg_convs + self.num_reg_fcs = num_reg_fcs + self.conv_out_channels = conv_out_channels + self.fc_out_channels = fc_out_channels + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + + # add shared convs and fcs + self.shared_convs, self.shared_fcs, last_layer_dim = \ + self._add_conv_fc_branch( + self.num_shared_convs, self.num_shared_fcs, self.in_channels, + True) + self.shared_out_channels = last_layer_dim + + # add cls specific branch + self.cls_convs, self.cls_fcs, self.cls_last_dim = \ + self._add_conv_fc_branch( + self.num_cls_convs, self.num_cls_fcs, self.shared_out_channels) + + # add reg specific branch + self.reg_convs, self.reg_fcs, self.reg_last_dim = \ + self._add_conv_fc_branch( + self.num_reg_convs, self.num_reg_fcs, self.shared_out_channels) + + if self.num_shared_fcs == 0 and not self.with_avg_pool: + if self.num_cls_fcs == 0: + self.cls_last_dim *= self.roi_feat_area + if self.num_reg_fcs == 0: + self.reg_last_dim *= self.roi_feat_area + + self.relu = nn.ReLU(inplace=True) + # reconstruct fc_cls and fc_reg since input channels are changed + if self.with_cls: + if self.custom_cls_channels: + cls_channels = self.loss_cls.get_cls_channels(self.num_classes) + else: + cls_channels = self.num_classes + 1 + self.fc_cls = build_linear_layer( + self.cls_predictor_cfg, + in_features=self.cls_last_dim, + out_features=cls_channels) + if self.with_reg: + out_dim_reg = (4 if self.reg_class_agnostic else 4 * + self.num_classes) + self.fc_reg = build_linear_layer( + self.reg_predictor_cfg, + in_features=self.reg_last_dim, + out_features=out_dim_reg) + + if init_cfg is None: + # when init_cfg is None, + # It has been set to + # [[dict(type='Normal', std=0.01, override=dict(name='fc_cls'))], + # [dict(type='Normal', std=0.001, override=dict(name='fc_reg'))] + # after `super(ConvFCBBoxHead, self).__init__()` + # we only need to append additional configuration + # for `shared_fcs`, `cls_fcs` and `reg_fcs` + self.init_cfg += [ + dict( + type='Xavier', + distribution='uniform', + override=[ + dict(name='shared_fcs'), + dict(name='cls_fcs'), + dict(name='reg_fcs') + ]) + ] + + def _add_conv_fc_branch(self, + num_branch_convs, + num_branch_fcs, + in_channels, + is_shared=False): + """Add shared or separable branch. + + convs -> avg pool (optional) -> fcs + """ + last_layer_dim = in_channels + # add branch specific conv layers + branch_convs = nn.ModuleList() + if num_branch_convs > 0: + for i in range(num_branch_convs): + conv_in_channels = ( + last_layer_dim if i == 0 else self.conv_out_channels) + branch_convs.append( + ConvModule( + conv_in_channels, + self.conv_out_channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg)) + last_layer_dim = self.conv_out_channels + # add branch specific fc layers + branch_fcs = nn.ModuleList() + if num_branch_fcs > 0: + # for shared branch, only consider self.with_avg_pool + # for separated branches, also consider self.num_shared_fcs + if (is_shared + or self.num_shared_fcs == 0) and not self.with_avg_pool: + last_layer_dim *= self.roi_feat_area + for i in range(num_branch_fcs): + fc_in_channels = ( + last_layer_dim if i == 0 else self.fc_out_channels) + branch_fcs.append( + nn.Linear(fc_in_channels, self.fc_out_channels)) + last_layer_dim = self.fc_out_channels + return branch_convs, branch_fcs, last_layer_dim + + def forward(self, x, dim_setting=2): + # shared part + if self.num_shared_convs > 0: + for conv in self.shared_convs: + x = conv(x) + + if self.num_shared_fcs > 0: + if self.with_avg_pool: + x = self.avg_pool(x) + + x = x.flatten(1) + + for fc in self.shared_fcs: + x = self.relu(fc(x)) + # separate branches + x_cls = x + x_reg = x + + for conv in self.cls_convs: + x_cls = conv(x_cls) + + + if dim_setting == 2: + # dim_setting == x_cls.dim() + # FasterRCNN + pass + else: + raise NotImplementedError + + + if dim_setting > 2: + if self.with_avg_pool: + x_cls = self.avg_pool(x_cls) + x_cls = x_cls.flatten(1) + for fc in self.cls_fcs: + x_cls = self.relu(fc(x_cls)) + + for conv in self.reg_convs: + x_reg = conv(x_reg) + if dim_setting > 2: + if self.with_avg_pool: + x_reg = self.avg_pool(x_reg) + x_reg = x_reg.flatten(1) + for fc in self.reg_fcs: + x_reg = self.relu(fc(x_reg)) + + cls_score = self.fc_cls(x_cls) if self.with_cls else None + bbox_pred = self.fc_reg(x_reg) if self.with_reg else None + return cls_score, bbox_pred + + +@HEADS.register_module() +class Shared2FCBBoxHead(ConvFCBBoxHead): + + def __init__(self, fc_out_channels=1024, *args, **kwargs): + super(Shared2FCBBoxHead, self).__init__( + num_shared_convs=0, + num_shared_fcs=2, + num_cls_convs=0, + num_cls_fcs=0, + num_reg_convs=0, + num_reg_fcs=0, + fc_out_channels=fc_out_channels, + *args, + **kwargs) + + +@HEADS.register_module() +class Shared4Conv1FCBBoxHead(ConvFCBBoxHead): + + def __init__(self, fc_out_channels=1024, *args, **kwargs): + super(Shared4Conv1FCBBoxHead, self).__init__( + num_shared_convs=4, + num_shared_fcs=1, + num_cls_convs=0, + num_cls_fcs=0, + num_reg_convs=0, + num_reg_fcs=0, + fc_out_channels=fc_out_channels, + *args, + **kwargs) diff --git a/mmdet/models/roi_heads/bbox_heads/dii_head.py b/mmdet/models/roi_heads/bbox_heads/dii_head.py new file mode 100644 index 0000000..3777f52 --- /dev/null +++ b/mmdet/models/roi_heads/bbox_heads/dii_head.py @@ -0,0 +1,426 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import (bias_init_with_prob, build_activation_layer, + build_norm_layer) +from mmcv.cnn.bricks.transformer import FFN, MultiheadAttention +from mmcv.runner import auto_fp16, force_fp32 + +from mmdet.core import multi_apply +from mmdet.models.builder import HEADS, build_loss +from mmdet.models.dense_heads.atss_head import reduce_mean +from mmdet.models.losses import accuracy +from mmdet.models.utils import build_transformer +from .bbox_head import BBoxHead + + +@HEADS.register_module() +class DIIHead(BBoxHead): + r"""Dynamic Instance Interactive Head for `Sparse R-CNN: End-to-End Object + Detection with Learnable Proposals `_ + + Args: + num_classes (int): Number of class in dataset. + Defaults to 80. + num_ffn_fcs (int): The number of fully-connected + layers in FFNs. Defaults to 2. + num_heads (int): The hidden dimension of FFNs. + Defaults to 8. + num_cls_fcs (int): The number of fully-connected + layers in classification subnet. Defaults to 1. + num_reg_fcs (int): The number of fully-connected + layers in regression subnet. Defaults to 3. + feedforward_channels (int): The hidden dimension + of FFNs. Defaults to 2048 + in_channels (int): Hidden_channels of MultiheadAttention. + Defaults to 256. + dropout (float): Probability of drop the channel. + Defaults to 0.0 + ffn_act_cfg (dict): The activation config for FFNs. + dynamic_conv_cfg (dict): The convolution config + for DynamicConv. + loss_iou (dict): The config for iou or giou loss. + + """ + + def __init__(self, + num_classes=80, + num_ffn_fcs=2, + num_heads=8, + num_cls_fcs=1, + num_reg_fcs=3, + feedforward_channels=2048, + in_channels=256, + dropout=0.0, + ffn_act_cfg=dict(type='ReLU', inplace=True), + dynamic_conv_cfg=dict( + type='DynamicConv', + in_channels=256, + feat_channels=64, + out_channels=256, + input_feat_shape=7, + act_cfg=dict(type='ReLU', inplace=True), + norm_cfg=dict(type='LN')), + loss_iou=dict(type='GIoULoss', loss_weight=2.0), + init_cfg=None, + **kwargs): + assert init_cfg is None, 'To prevent abnormal initialization ' \ + 'behavior, init_cfg is not allowed to be set' + super(DIIHead, self).__init__( + num_classes=num_classes, + reg_decoded_bbox=True, + reg_class_agnostic=True, + init_cfg=init_cfg, + **kwargs) + self.loss_iou = build_loss(loss_iou) + self.in_channels = in_channels + self.fp16_enabled = False + self.attention = MultiheadAttention(in_channels, num_heads, dropout) + self.attention_norm = build_norm_layer(dict(type='LN'), in_channels)[1] + + self.instance_interactive_conv = build_transformer(dynamic_conv_cfg) + self.instance_interactive_conv_dropout = nn.Dropout(dropout) + self.instance_interactive_conv_norm = build_norm_layer( + dict(type='LN'), in_channels)[1] + + self.ffn = FFN( + in_channels, + feedforward_channels, + num_ffn_fcs, + act_cfg=ffn_act_cfg, + dropout=dropout) + self.ffn_norm = build_norm_layer(dict(type='LN'), in_channels)[1] + + self.cls_fcs = nn.ModuleList() + for _ in range(num_cls_fcs): + self.cls_fcs.append( + nn.Linear(in_channels, in_channels, bias=False)) + self.cls_fcs.append( + build_norm_layer(dict(type='LN'), in_channels)[1]) + self.cls_fcs.append( + build_activation_layer(dict(type='ReLU', inplace=True))) + + # over load the self.fc_cls in BBoxHead + if self.loss_cls.use_sigmoid: + self.fc_cls = nn.Linear(in_channels, self.num_classes) + else: + self.fc_cls = nn.Linear(in_channels, self.num_classes + 1) + + self.reg_fcs = nn.ModuleList() + for _ in range(num_reg_fcs): + self.reg_fcs.append( + nn.Linear(in_channels, in_channels, bias=False)) + self.reg_fcs.append( + build_norm_layer(dict(type='LN'), in_channels)[1]) + self.reg_fcs.append( + build_activation_layer(dict(type='ReLU', inplace=True))) + # over load the self.fc_cls in BBoxHead + self.fc_reg = nn.Linear(in_channels, 4) + + assert self.reg_class_agnostic, 'DIIHead only ' \ + 'suppport `reg_class_agnostic=True` ' + assert self.reg_decoded_bbox, 'DIIHead only ' \ + 'suppport `reg_decoded_bbox=True`' + + def init_weights(self): + """Use xavier initialization for all weight parameter and set + classification head bias as a specific value when use focal loss.""" + super(DIIHead, self).init_weights() + for p in self.parameters(): + if p.dim() > 1: + nn.init.xavier_uniform_(p) + else: + # adopt the default initialization for + # the weight and bias of the layer norm + pass + if self.loss_cls.use_sigmoid: + bias_init = bias_init_with_prob(0.01) + nn.init.constant_(self.fc_cls.bias, bias_init) + + @auto_fp16() + def forward(self, roi_feat, proposal_feat): + """Forward function of Dynamic Instance Interactive Head. + + Args: + roi_feat (Tensor): Roi-pooling features with shape + (batch_size*num_proposals, feature_dimensions, + pooling_h , pooling_w). + proposal_feat (Tensor): Intermediate feature get from + diihead in last stage, has shape + (batch_size, num_proposals, feature_dimensions) + + Returns: + tuple[Tensor]: Usually a tuple of classification scores + and bbox prediction and a intermediate feature. + + - cls_scores (Tensor): Classification scores for + all proposals, has shape + (batch_size, num_proposals, num_classes). + - bbox_preds (Tensor): Box energies / deltas for + all proposals, has shape + (batch_size, num_proposals, 4). + - obj_feat (Tensor): Object feature before classification + and regression subnet, has shape + (batch_size, num_proposal, feature_dimensions). + """ + N, num_proposals = proposal_feat.shape[:2] + + # Self attention + proposal_feat = proposal_feat.permute(1, 0, 2) + proposal_feat = self.attention_norm(self.attention(proposal_feat)) + attn_feats = proposal_feat.permute(1, 0, 2) + + # instance interactive + proposal_feat = attn_feats.reshape(-1, self.in_channels) + proposal_feat_iic = self.instance_interactive_conv( + proposal_feat, roi_feat) + proposal_feat = proposal_feat + self.instance_interactive_conv_dropout( + proposal_feat_iic) + obj_feat = self.instance_interactive_conv_norm(proposal_feat) + + # FFN + obj_feat = self.ffn_norm(self.ffn(obj_feat)) + + cls_feat = obj_feat + reg_feat = obj_feat + + for cls_layer in self.cls_fcs: + cls_feat = cls_layer(cls_feat) + for reg_layer in self.reg_fcs: + reg_feat = reg_layer(reg_feat) + + cls_score = self.fc_cls(cls_feat).view( + N, num_proposals, self.num_classes + if self.loss_cls.use_sigmoid else self.num_classes + 1) + bbox_delta = self.fc_reg(reg_feat).view(N, num_proposals, 4) + + return cls_score, bbox_delta, obj_feat.view( + N, num_proposals, self.in_channels), attn_feats + + @force_fp32(apply_to=('cls_score', 'bbox_pred')) + def loss(self, + cls_score, + bbox_pred, + labels, + label_weights, + bbox_targets, + bbox_weights, + imgs_whwh=None, + reduction_override=None, + **kwargs): + """"Loss function of DIIHead, get loss of all images. + + Args: + cls_score (Tensor): Classification prediction + results of all class, has shape + (batch_size * num_proposals_single_image, num_classes) + bbox_pred (Tensor): Regression prediction results, + has shape + (batch_size * num_proposals_single_image, 4), the last + dimension 4 represents [tl_x, tl_y, br_x, br_y]. + labels (Tensor): Label of each proposals, has shape + (batch_size * num_proposals_single_image + label_weights (Tensor): Classification loss + weight of each proposals, has shape + (batch_size * num_proposals_single_image + bbox_targets (Tensor): Regression targets of each + proposals, has shape + (batch_size * num_proposals_single_image, 4), + the last dimension 4 represents + [tl_x, tl_y, br_x, br_y]. + bbox_weights (Tensor): Regression loss weight of each + proposals's coordinate, has shape + (batch_size * num_proposals_single_image, 4), + imgs_whwh (Tensor): imgs_whwh (Tensor): Tensor with\ + shape (batch_size, num_proposals, 4), the last + dimension means + [img_width,img_height, img_width, img_height]. + reduction_override (str, optional): The reduction + method used to override the original reduction + method of the loss. Options are "none", + "mean" and "sum". Defaults to None, + + Returns: + dict[str, Tensor]: Dictionary of loss components + """ + losses = dict() + bg_class_ind = self.num_classes + # note in spare rcnn num_gt == num_pos + pos_inds = (labels >= 0) & (labels < bg_class_ind) + num_pos = pos_inds.sum().float() + avg_factor = reduce_mean(num_pos) + if cls_score is not None: + if cls_score.numel() > 0: + losses['loss_cls'] = self.loss_cls( + cls_score, + labels, + label_weights, + avg_factor=avg_factor, + reduction_override=reduction_override) + losses['pos_acc'] = accuracy(cls_score[pos_inds], + labels[pos_inds]) + if bbox_pred is not None: + # 0~self.num_classes-1 are FG, self.num_classes is BG + # do not perform bounding box regression for BG anymore. + if pos_inds.any(): + pos_bbox_pred = bbox_pred.reshape(bbox_pred.size(0), + 4)[pos_inds.type(torch.bool)] + imgs_whwh = imgs_whwh.reshape(bbox_pred.size(0), + 4)[pos_inds.type(torch.bool)] + losses['loss_bbox'] = self.loss_bbox( + pos_bbox_pred / imgs_whwh, + bbox_targets[pos_inds.type(torch.bool)] / imgs_whwh, + bbox_weights[pos_inds.type(torch.bool)], + avg_factor=avg_factor) + losses['loss_iou'] = self.loss_iou( + pos_bbox_pred, + bbox_targets[pos_inds.type(torch.bool)], + bbox_weights[pos_inds.type(torch.bool)], + avg_factor=avg_factor) + else: + losses['loss_bbox'] = bbox_pred.sum() * 0 + losses['loss_iou'] = bbox_pred.sum() * 0 + return losses + + def _get_target_single(self, pos_inds, neg_inds, pos_bboxes, neg_bboxes, + pos_gt_bboxes, pos_gt_labels, cfg): + """Calculate the ground truth for proposals in the single image + according to the sampling results. + + Almost the same as the implementation in `bbox_head`, + we add pos_inds and neg_inds to select positive and + negative samples instead of selecting the first num_pos + as positive samples. + + Args: + pos_inds (Tensor): The length is equal to the + positive sample numbers contain all index + of the positive sample in the origin proposal set. + neg_inds (Tensor): The length is equal to the + negative sample numbers contain all index + of the negative sample in the origin proposal set. + pos_bboxes (Tensor): Contains all the positive boxes, + has shape (num_pos, 4), the last dimension 4 + represents [tl_x, tl_y, br_x, br_y]. + neg_bboxes (Tensor): Contains all the negative boxes, + has shape (num_neg, 4), the last dimension 4 + represents [tl_x, tl_y, br_x, br_y]. + pos_gt_bboxes (Tensor): Contains gt_boxes for + all positive samples, has shape (num_pos, 4), + the last dimension 4 + represents [tl_x, tl_y, br_x, br_y]. + pos_gt_labels (Tensor): Contains gt_labels for + all positive samples, has shape (num_pos, ). + cfg (obj:`ConfigDict`): `train_cfg` of R-CNN. + + Returns: + Tuple[Tensor]: Ground truth for proposals in a single image. + Containing the following Tensors: + + - labels(Tensor): Gt_labels for all proposals, has + shape (num_proposals,). + - label_weights(Tensor): Labels_weights for all proposals, has + shape (num_proposals,). + - bbox_targets(Tensor):Regression target for all proposals, has + shape (num_proposals, 4), the last dimension 4 + represents [tl_x, tl_y, br_x, br_y]. + - bbox_weights(Tensor):Regression weights for all proposals, + has shape (num_proposals, 4). + """ + num_pos = pos_bboxes.size(0) + num_neg = neg_bboxes.size(0) + num_samples = num_pos + num_neg + + # original implementation uses new_zeros since BG are set to be 0 + # now use empty & fill because BG cat_id = num_classes, + # FG cat_id = [0, num_classes-1] + labels = pos_bboxes.new_full((num_samples, ), + self.num_classes, + dtype=torch.long) + label_weights = pos_bboxes.new_zeros(num_samples) + bbox_targets = pos_bboxes.new_zeros(num_samples, 4) + bbox_weights = pos_bboxes.new_zeros(num_samples, 4) + if num_pos > 0: + labels[pos_inds] = pos_gt_labels + pos_weight = 1.0 if cfg.pos_weight <= 0 else cfg.pos_weight + label_weights[pos_inds] = pos_weight + if not self.reg_decoded_bbox: + pos_bbox_targets = self.bbox_coder.encode( + pos_bboxes, pos_gt_bboxes) + else: + pos_bbox_targets = pos_gt_bboxes + bbox_targets[pos_inds, :] = pos_bbox_targets + bbox_weights[pos_inds, :] = 1 + if num_neg > 0: + label_weights[neg_inds] = 1.0 + + return labels, label_weights, bbox_targets, bbox_weights + + def get_targets(self, + sampling_results, + gt_bboxes, + gt_labels, + rcnn_train_cfg, + concat=True): + """Calculate the ground truth for all samples in a batch according to + the sampling_results. + + Almost the same as the implementation in bbox_head, we passed + additional parameters pos_inds_list and neg_inds_list to + `_get_target_single` function. + + Args: + sampling_results (List[obj:SamplingResults]): Assign results of + all images in a batch after sampling. + gt_bboxes (list[Tensor]): Gt_bboxes of all images in a batch, + each tensor has shape (num_gt, 4), the last dimension 4 + represents [tl_x, tl_y, br_x, br_y]. + gt_labels (list[Tensor]): Gt_labels of all images in a batch, + each tensor has shape (num_gt,). + rcnn_train_cfg (obj:`ConfigDict`): `train_cfg` of RCNN. + concat (bool): Whether to concatenate the results of all + the images in a single batch. + + Returns: + Tuple[Tensor]: Ground truth for proposals in a single image. + Containing the following list of Tensors: + + - labels (list[Tensor],Tensor): Gt_labels for all + proposals in a batch, each tensor in list has + shape (num_proposals,) when `concat=False`, otherwise just + a single tensor has shape (num_all_proposals,). + - label_weights (list[Tensor]): Labels_weights for + all proposals in a batch, each tensor in list has shape + (num_proposals,) when `concat=False`, otherwise just a + single tensor has shape (num_all_proposals,). + - bbox_targets (list[Tensor],Tensor): Regression target + for all proposals in a batch, each tensor in list has + shape (num_proposals, 4) when `concat=False`, otherwise + just a single tensor has shape (num_all_proposals, 4), + the last dimension 4 represents [tl_x, tl_y, br_x, br_y]. + - bbox_weights (list[tensor],Tensor): Regression weights for + all proposals in a batch, each tensor in list has shape + (num_proposals, 4) when `concat=False`, otherwise just a + single tensor has shape (num_all_proposals, 4). + """ + pos_inds_list = [res.pos_inds for res in sampling_results] + neg_inds_list = [res.neg_inds for res in sampling_results] + pos_bboxes_list = [res.pos_bboxes for res in sampling_results] + neg_bboxes_list = [res.neg_bboxes for res in sampling_results] + pos_gt_bboxes_list = [res.pos_gt_bboxes for res in sampling_results] + pos_gt_labels_list = [res.pos_gt_labels for res in sampling_results] + labels, label_weights, bbox_targets, bbox_weights = multi_apply( + self._get_target_single, + pos_inds_list, + neg_inds_list, + pos_bboxes_list, + neg_bboxes_list, + pos_gt_bboxes_list, + pos_gt_labels_list, + cfg=rcnn_train_cfg) + if concat: + labels = torch.cat(labels, 0) + label_weights = torch.cat(label_weights, 0) + bbox_targets = torch.cat(bbox_targets, 0) + bbox_weights = torch.cat(bbox_weights, 0) + return labels, label_weights, bbox_targets, bbox_weights diff --git a/mmdet/models/roi_heads/bbox_heads/double_bbox_head.py b/mmdet/models/roi_heads/bbox_heads/double_bbox_head.py new file mode 100644 index 0000000..2a38d59 --- /dev/null +++ b/mmdet/models/roi_heads/bbox_heads/double_bbox_head.py @@ -0,0 +1,178 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +from mmcv.cnn import ConvModule +from mmcv.runner import BaseModule, ModuleList + +from mmdet.models.backbones.resnet import Bottleneck +from mmdet.models.builder import HEADS +from .bbox_head import BBoxHead + + +class BasicResBlock(BaseModule): + """Basic residual block. + + This block is a little different from the block in the ResNet backbone. + The kernel size of conv1 is 1 in this block while 3 in ResNet BasicBlock. + + Args: + in_channels (int): Channels of the input feature map. + out_channels (int): Channels of the output feature map. + conv_cfg (dict): The config dict for convolution layers. + norm_cfg (dict): The config dict for normalization layers. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + in_channels, + out_channels, + conv_cfg=None, + norm_cfg=dict(type='BN'), + init_cfg=None): + super(BasicResBlock, self).__init__(init_cfg) + + # main path + self.conv1 = ConvModule( + in_channels, + in_channels, + kernel_size=3, + padding=1, + bias=False, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg) + self.conv2 = ConvModule( + in_channels, + out_channels, + kernel_size=1, + bias=False, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=None) + + # identity path + self.conv_identity = ConvModule( + in_channels, + out_channels, + kernel_size=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=None) + + self.relu = nn.ReLU(inplace=True) + + def forward(self, x): + identity = x + + x = self.conv1(x) + x = self.conv2(x) + + identity = self.conv_identity(identity) + out = x + identity + + out = self.relu(out) + return out + + +@HEADS.register_module() +class DoubleConvFCBBoxHead(BBoxHead): + r"""Bbox head used in Double-Head R-CNN + + .. code-block:: none + + /-> cls + /-> shared convs -> + \-> reg + roi features + /-> cls + \-> shared fc -> + \-> reg + """ # noqa: W605 + + def __init__(self, + num_convs=0, + num_fcs=0, + conv_out_channels=1024, + fc_out_channels=1024, + conv_cfg=None, + norm_cfg=dict(type='BN'), + init_cfg=dict( + type='Normal', + override=[ + dict(type='Normal', name='fc_cls', std=0.01), + dict(type='Normal', name='fc_reg', std=0.001), + dict( + type='Xavier', + name='fc_branch', + distribution='uniform') + ]), + **kwargs): + kwargs.setdefault('with_avg_pool', True) + super(DoubleConvFCBBoxHead, self).__init__(init_cfg=init_cfg, **kwargs) + assert self.with_avg_pool + assert num_convs > 0 + assert num_fcs > 0 + self.num_convs = num_convs + self.num_fcs = num_fcs + self.conv_out_channels = conv_out_channels + self.fc_out_channels = fc_out_channels + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + + # increase the channel of input features + self.res_block = BasicResBlock(self.in_channels, + self.conv_out_channels) + + # add conv heads + self.conv_branch = self._add_conv_branch() + # add fc heads + self.fc_branch = self._add_fc_branch() + + out_dim_reg = 4 if self.reg_class_agnostic else 4 * self.num_classes + self.fc_reg = nn.Linear(self.conv_out_channels, out_dim_reg) + + self.fc_cls = nn.Linear(self.fc_out_channels, self.num_classes + 1) + self.relu = nn.ReLU(inplace=True) + + def _add_conv_branch(self): + """Add the fc branch which consists of a sequential of conv layers.""" + branch_convs = ModuleList() + for i in range(self.num_convs): + branch_convs.append( + Bottleneck( + inplanes=self.conv_out_channels, + planes=self.conv_out_channels // 4, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg)) + return branch_convs + + def _add_fc_branch(self): + """Add the fc branch which consists of a sequential of fc layers.""" + branch_fcs = ModuleList() + for i in range(self.num_fcs): + fc_in_channels = ( + self.in_channels * + self.roi_feat_area if i == 0 else self.fc_out_channels) + branch_fcs.append(nn.Linear(fc_in_channels, self.fc_out_channels)) + return branch_fcs + + def forward(self, x_cls, x_reg): + # conv head + x_conv = self.res_block(x_reg) + + for conv in self.conv_branch: + x_conv = conv(x_conv) + + if self.with_avg_pool: + x_conv = self.avg_pool(x_conv) + + x_conv = x_conv.view(x_conv.size(0), -1) + bbox_pred = self.fc_reg(x_conv) + + # fc head + x_fc = x_cls.view(x_cls.size(0), -1) + for fc in self.fc_branch: + x_fc = self.relu(fc(x_fc)) + + cls_score = self.fc_cls(x_fc) + + return cls_score, bbox_pred diff --git a/mmdet/models/roi_heads/bbox_heads/sabl_head.py b/mmdet/models/roi_heads/bbox_heads/sabl_head.py new file mode 100644 index 0000000..0ce986b --- /dev/null +++ b/mmdet/models/roi_heads/bbox_heads/sabl_head.py @@ -0,0 +1,596 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule +from mmcv.runner import BaseModule, force_fp32 + +from mmdet.core import build_bbox_coder, multi_apply, multiclass_nms +from mmdet.models.builder import HEADS, build_loss +from mmdet.models.losses import accuracy + + +@HEADS.register_module() +class SABLHead(BaseModule): + """Side-Aware Boundary Localization (SABL) for RoI-Head. + + Side-Aware features are extracted by conv layers + with an attention mechanism. + Boundary Localization with Bucketing and Bucketing Guided Rescoring + are implemented in BucketingBBoxCoder. + + Please refer to https://arxiv.org/abs/1912.04260 for more details. + + Args: + cls_in_channels (int): Input channels of cls RoI feature. \ + Defaults to 256. + reg_in_channels (int): Input channels of reg RoI feature. \ + Defaults to 256. + roi_feat_size (int): Size of RoI features. Defaults to 7. + reg_feat_up_ratio (int): Upsample ratio of reg features. \ + Defaults to 2. + reg_pre_kernel (int): Kernel of 2D conv layers before \ + attention pooling. Defaults to 3. + reg_post_kernel (int): Kernel of 1D conv layers after \ + attention pooling. Defaults to 3. + reg_pre_num (int): Number of pre convs. Defaults to 2. + reg_post_num (int): Number of post convs. Defaults to 1. + num_classes (int): Number of classes in dataset. Defaults to 80. + cls_out_channels (int): Hidden channels in cls fcs. Defaults to 1024. + reg_offset_out_channels (int): Hidden and output channel \ + of reg offset branch. Defaults to 256. + reg_cls_out_channels (int): Hidden and output channel \ + of reg cls branch. Defaults to 256. + num_cls_fcs (int): Number of fcs for cls branch. Defaults to 1. + num_reg_fcs (int): Number of fcs for reg branch.. Defaults to 0. + reg_class_agnostic (bool): Class agnostic regression or not. \ + Defaults to True. + norm_cfg (dict): Config of norm layers. Defaults to None. + bbox_coder (dict): Config of bbox coder. Defaults 'BucketingBBoxCoder'. + loss_cls (dict): Config of classification loss. + loss_bbox_cls (dict): Config of classification loss for bbox branch. + loss_bbox_reg (dict): Config of regression loss for bbox branch. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + num_classes, + cls_in_channels=256, + reg_in_channels=256, + roi_feat_size=7, + reg_feat_up_ratio=2, + reg_pre_kernel=3, + reg_post_kernel=3, + reg_pre_num=2, + reg_post_num=1, + cls_out_channels=1024, + reg_offset_out_channels=256, + reg_cls_out_channels=256, + num_cls_fcs=1, + num_reg_fcs=0, + reg_class_agnostic=True, + norm_cfg=None, + bbox_coder=dict( + type='BucketingBBoxCoder', + num_buckets=14, + scale_factor=1.7), + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0), + loss_bbox_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + loss_weight=1.0), + loss_bbox_reg=dict( + type='SmoothL1Loss', beta=0.1, loss_weight=1.0), + init_cfg=None): + super(SABLHead, self).__init__(init_cfg) + self.cls_in_channels = cls_in_channels + self.reg_in_channels = reg_in_channels + self.roi_feat_size = roi_feat_size + self.reg_feat_up_ratio = int(reg_feat_up_ratio) + self.num_buckets = bbox_coder['num_buckets'] + assert self.reg_feat_up_ratio // 2 >= 1 + self.up_reg_feat_size = roi_feat_size * self.reg_feat_up_ratio + assert self.up_reg_feat_size == bbox_coder['num_buckets'] + self.reg_pre_kernel = reg_pre_kernel + self.reg_post_kernel = reg_post_kernel + self.reg_pre_num = reg_pre_num + self.reg_post_num = reg_post_num + self.num_classes = num_classes + self.cls_out_channels = cls_out_channels + self.reg_offset_out_channels = reg_offset_out_channels + self.reg_cls_out_channels = reg_cls_out_channels + self.num_cls_fcs = num_cls_fcs + self.num_reg_fcs = num_reg_fcs + self.reg_class_agnostic = reg_class_agnostic + assert self.reg_class_agnostic + self.norm_cfg = norm_cfg + + self.bbox_coder = build_bbox_coder(bbox_coder) + self.loss_cls = build_loss(loss_cls) + self.loss_bbox_cls = build_loss(loss_bbox_cls) + self.loss_bbox_reg = build_loss(loss_bbox_reg) + + self.cls_fcs = self._add_fc_branch(self.num_cls_fcs, + self.cls_in_channels, + self.roi_feat_size, + self.cls_out_channels) + + self.side_num = int(np.ceil(self.num_buckets / 2)) + + if self.reg_feat_up_ratio > 1: + self.upsample_x = nn.ConvTranspose1d( + reg_in_channels, + reg_in_channels, + self.reg_feat_up_ratio, + stride=self.reg_feat_up_ratio) + self.upsample_y = nn.ConvTranspose1d( + reg_in_channels, + reg_in_channels, + self.reg_feat_up_ratio, + stride=self.reg_feat_up_ratio) + + self.reg_pre_convs = nn.ModuleList() + for i in range(self.reg_pre_num): + reg_pre_conv = ConvModule( + reg_in_channels, + reg_in_channels, + kernel_size=reg_pre_kernel, + padding=reg_pre_kernel // 2, + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU')) + self.reg_pre_convs.append(reg_pre_conv) + + self.reg_post_conv_xs = nn.ModuleList() + for i in range(self.reg_post_num): + reg_post_conv_x = ConvModule( + reg_in_channels, + reg_in_channels, + kernel_size=(1, reg_post_kernel), + padding=(0, reg_post_kernel // 2), + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU')) + self.reg_post_conv_xs.append(reg_post_conv_x) + self.reg_post_conv_ys = nn.ModuleList() + for i in range(self.reg_post_num): + reg_post_conv_y = ConvModule( + reg_in_channels, + reg_in_channels, + kernel_size=(reg_post_kernel, 1), + padding=(reg_post_kernel // 2, 0), + norm_cfg=norm_cfg, + act_cfg=dict(type='ReLU')) + self.reg_post_conv_ys.append(reg_post_conv_y) + + self.reg_conv_att_x = nn.Conv2d(reg_in_channels, 1, 1) + self.reg_conv_att_y = nn.Conv2d(reg_in_channels, 1, 1) + + self.fc_cls = nn.Linear(self.cls_out_channels, self.num_classes + 1) + self.relu = nn.ReLU(inplace=True) + + self.reg_cls_fcs = self._add_fc_branch(self.num_reg_fcs, + self.reg_in_channels, 1, + self.reg_cls_out_channels) + self.reg_offset_fcs = self._add_fc_branch(self.num_reg_fcs, + self.reg_in_channels, 1, + self.reg_offset_out_channels) + self.fc_reg_cls = nn.Linear(self.reg_cls_out_channels, 1) + self.fc_reg_offset = nn.Linear(self.reg_offset_out_channels, 1) + + if init_cfg is None: + self.init_cfg = [ + dict( + type='Xavier', + layer='Linear', + distribution='uniform', + override=[ + dict(type='Normal', name='reg_conv_att_x', std=0.01), + dict(type='Normal', name='reg_conv_att_y', std=0.01), + dict(type='Normal', name='fc_reg_cls', std=0.01), + dict(type='Normal', name='fc_cls', std=0.01), + dict(type='Normal', name='fc_reg_offset', std=0.001) + ]) + ] + if self.reg_feat_up_ratio > 1: + self.init_cfg += [ + dict( + type='Kaiming', + distribution='normal', + override=[ + dict(name='upsample_x'), + dict(name='upsample_y') + ]) + ] + + @property + def custom_cls_channels(self): + return getattr(self.loss_cls, 'custom_cls_channels', False) + + @property + def custom_activation(self): + return getattr(self.loss_cls, 'custom_activation', False) + + @property + def custom_accuracy(self): + return getattr(self.loss_cls, 'custom_accuracy', False) + + def _add_fc_branch(self, num_branch_fcs, in_channels, roi_feat_size, + fc_out_channels): + in_channels = in_channels * roi_feat_size * roi_feat_size + branch_fcs = nn.ModuleList() + for i in range(num_branch_fcs): + fc_in_channels = (in_channels if i == 0 else fc_out_channels) + branch_fcs.append(nn.Linear(fc_in_channels, fc_out_channels)) + return branch_fcs + + def cls_forward(self, cls_x): + cls_x = cls_x.view(cls_x.size(0), -1) + for fc in self.cls_fcs: + cls_x = self.relu(fc(cls_x)) + cls_score = self.fc_cls(cls_x) + return cls_score + + def attention_pool(self, reg_x): + """Extract direction-specific features fx and fy with attention + methanism.""" + reg_fx = reg_x + reg_fy = reg_x + reg_fx_att = self.reg_conv_att_x(reg_fx).sigmoid() + reg_fy_att = self.reg_conv_att_y(reg_fy).sigmoid() + reg_fx_att = reg_fx_att / reg_fx_att.sum(dim=2).unsqueeze(2) + reg_fy_att = reg_fy_att / reg_fy_att.sum(dim=3).unsqueeze(3) + reg_fx = (reg_fx * reg_fx_att).sum(dim=2) + reg_fy = (reg_fy * reg_fy_att).sum(dim=3) + return reg_fx, reg_fy + + def side_aware_feature_extractor(self, reg_x): + """Refine and extract side-aware features without split them.""" + for reg_pre_conv in self.reg_pre_convs: + reg_x = reg_pre_conv(reg_x) + reg_fx, reg_fy = self.attention_pool(reg_x) + + if self.reg_post_num > 0: + reg_fx = reg_fx.unsqueeze(2) + reg_fy = reg_fy.unsqueeze(3) + for i in range(self.reg_post_num): + reg_fx = self.reg_post_conv_xs[i](reg_fx) + reg_fy = self.reg_post_conv_ys[i](reg_fy) + reg_fx = reg_fx.squeeze(2) + reg_fy = reg_fy.squeeze(3) + if self.reg_feat_up_ratio > 1: + reg_fx = self.relu(self.upsample_x(reg_fx)) + reg_fy = self.relu(self.upsample_y(reg_fy)) + reg_fx = torch.transpose(reg_fx, 1, 2) + reg_fy = torch.transpose(reg_fy, 1, 2) + return reg_fx.contiguous(), reg_fy.contiguous() + + def reg_pred(self, x, offset_fcs, cls_fcs): + """Predict bucketing estimation (cls_pred) and fine regression (offset + pred) with side-aware features.""" + x_offset = x.view(-1, self.reg_in_channels) + x_cls = x.view(-1, self.reg_in_channels) + + for fc in offset_fcs: + x_offset = self.relu(fc(x_offset)) + for fc in cls_fcs: + x_cls = self.relu(fc(x_cls)) + offset_pred = self.fc_reg_offset(x_offset) + cls_pred = self.fc_reg_cls(x_cls) + + offset_pred = offset_pred.view(x.size(0), -1) + cls_pred = cls_pred.view(x.size(0), -1) + + return offset_pred, cls_pred + + def side_aware_split(self, feat): + """Split side-aware features aligned with orders of bucketing + targets.""" + l_end = int(np.ceil(self.up_reg_feat_size / 2)) + r_start = int(np.floor(self.up_reg_feat_size / 2)) + feat_fl = feat[:, :l_end] + feat_fr = feat[:, r_start:].flip(dims=(1, )) + feat_fl = feat_fl.contiguous() + feat_fr = feat_fr.contiguous() + feat = torch.cat([feat_fl, feat_fr], dim=-1) + return feat + + def bbox_pred_split(self, bbox_pred, num_proposals_per_img): + """Split batch bbox prediction back to each image.""" + bucket_cls_preds, bucket_offset_preds = bbox_pred + bucket_cls_preds = bucket_cls_preds.split(num_proposals_per_img, 0) + bucket_offset_preds = bucket_offset_preds.split( + num_proposals_per_img, 0) + bbox_pred = tuple(zip(bucket_cls_preds, bucket_offset_preds)) + return bbox_pred + + def reg_forward(self, reg_x): + outs = self.side_aware_feature_extractor(reg_x) + edge_offset_preds = [] + edge_cls_preds = [] + reg_fx = outs[0] + reg_fy = outs[1] + offset_pred_x, cls_pred_x = self.reg_pred(reg_fx, self.reg_offset_fcs, + self.reg_cls_fcs) + offset_pred_y, cls_pred_y = self.reg_pred(reg_fy, self.reg_offset_fcs, + self.reg_cls_fcs) + offset_pred_x = self.side_aware_split(offset_pred_x) + offset_pred_y = self.side_aware_split(offset_pred_y) + cls_pred_x = self.side_aware_split(cls_pred_x) + cls_pred_y = self.side_aware_split(cls_pred_y) + edge_offset_preds = torch.cat([offset_pred_x, offset_pred_y], dim=-1) + edge_cls_preds = torch.cat([cls_pred_x, cls_pred_y], dim=-1) + + return (edge_cls_preds, edge_offset_preds) + + def forward(self, x): + + bbox_pred = self.reg_forward(x) + cls_score = self.cls_forward(x) + + return cls_score, bbox_pred + + def get_targets(self, sampling_results, gt_bboxes, gt_labels, + rcnn_train_cfg): + pos_proposals = [res.pos_bboxes for res in sampling_results] + neg_proposals = [res.neg_bboxes for res in sampling_results] + pos_gt_bboxes = [res.pos_gt_bboxes for res in sampling_results] + pos_gt_labels = [res.pos_gt_labels for res in sampling_results] + cls_reg_targets = self.bucket_target(pos_proposals, neg_proposals, + pos_gt_bboxes, pos_gt_labels, + rcnn_train_cfg) + (labels, label_weights, bucket_cls_targets, bucket_cls_weights, + bucket_offset_targets, bucket_offset_weights) = cls_reg_targets + return (labels, label_weights, (bucket_cls_targets, + bucket_offset_targets), + (bucket_cls_weights, bucket_offset_weights)) + + def bucket_target(self, + pos_proposals_list, + neg_proposals_list, + pos_gt_bboxes_list, + pos_gt_labels_list, + rcnn_train_cfg, + concat=True): + (labels, label_weights, bucket_cls_targets, bucket_cls_weights, + bucket_offset_targets, bucket_offset_weights) = multi_apply( + self._bucket_target_single, + pos_proposals_list, + neg_proposals_list, + pos_gt_bboxes_list, + pos_gt_labels_list, + cfg=rcnn_train_cfg) + + if concat: + labels = torch.cat(labels, 0) + label_weights = torch.cat(label_weights, 0) + bucket_cls_targets = torch.cat(bucket_cls_targets, 0) + bucket_cls_weights = torch.cat(bucket_cls_weights, 0) + bucket_offset_targets = torch.cat(bucket_offset_targets, 0) + bucket_offset_weights = torch.cat(bucket_offset_weights, 0) + return (labels, label_weights, bucket_cls_targets, bucket_cls_weights, + bucket_offset_targets, bucket_offset_weights) + + def _bucket_target_single(self, pos_proposals, neg_proposals, + pos_gt_bboxes, pos_gt_labels, cfg): + """Compute bucketing estimation targets and fine regression targets for + a single image. + + Args: + pos_proposals (Tensor): positive proposals of a single image, + Shape (n_pos, 4) + neg_proposals (Tensor): negative proposals of a single image, + Shape (n_neg, 4). + pos_gt_bboxes (Tensor): gt bboxes assigned to positive proposals + of a single image, Shape (n_pos, 4). + pos_gt_labels (Tensor): gt labels assigned to positive proposals + of a single image, Shape (n_pos, ). + cfg (dict): Config of calculating targets + + Returns: + tuple: + + - labels (Tensor): Labels in a single image. \ + Shape (n,). + - label_weights (Tensor): Label weights in a single image.\ + Shape (n,) + - bucket_cls_targets (Tensor): Bucket cls targets in \ + a single image. Shape (n, num_buckets*2). + - bucket_cls_weights (Tensor): Bucket cls weights in \ + a single image. Shape (n, num_buckets*2). + - bucket_offset_targets (Tensor): Bucket offset targets \ + in a single image. Shape (n, num_buckets*2). + - bucket_offset_targets (Tensor): Bucket offset weights \ + in a single image. Shape (n, num_buckets*2). + """ + num_pos = pos_proposals.size(0) + num_neg = neg_proposals.size(0) + num_samples = num_pos + num_neg + labels = pos_gt_bboxes.new_full((num_samples, ), + self.num_classes, + dtype=torch.long) + label_weights = pos_proposals.new_zeros(num_samples) + bucket_cls_targets = pos_proposals.new_zeros(num_samples, + 4 * self.side_num) + bucket_cls_weights = pos_proposals.new_zeros(num_samples, + 4 * self.side_num) + bucket_offset_targets = pos_proposals.new_zeros( + num_samples, 4 * self.side_num) + bucket_offset_weights = pos_proposals.new_zeros( + num_samples, 4 * self.side_num) + if num_pos > 0: + labels[:num_pos] = pos_gt_labels + label_weights[:num_pos] = 1.0 + (pos_bucket_offset_targets, pos_bucket_offset_weights, + pos_bucket_cls_targets, + pos_bucket_cls_weights) = self.bbox_coder.encode( + pos_proposals, pos_gt_bboxes) + bucket_cls_targets[:num_pos, :] = pos_bucket_cls_targets + bucket_cls_weights[:num_pos, :] = pos_bucket_cls_weights + bucket_offset_targets[:num_pos, :] = pos_bucket_offset_targets + bucket_offset_weights[:num_pos, :] = pos_bucket_offset_weights + if num_neg > 0: + label_weights[-num_neg:] = 1.0 + return (labels, label_weights, bucket_cls_targets, bucket_cls_weights, + bucket_offset_targets, bucket_offset_weights) + + def loss(self, + cls_score, + bbox_pred, + rois, + labels, + label_weights, + bbox_targets, + bbox_weights, + reduction_override=None): + losses = dict() + if cls_score is not None: + avg_factor = max(torch.sum(label_weights > 0).float().item(), 1.) + losses['loss_cls'] = self.loss_cls( + cls_score, + labels, + label_weights, + avg_factor=avg_factor, + reduction_override=reduction_override) + losses['acc'] = accuracy(cls_score, labels) + + if bbox_pred is not None: + bucket_cls_preds, bucket_offset_preds = bbox_pred + bucket_cls_targets, bucket_offset_targets = bbox_targets + bucket_cls_weights, bucket_offset_weights = bbox_weights + # edge cls + bucket_cls_preds = bucket_cls_preds.view(-1, self.side_num) + bucket_cls_targets = bucket_cls_targets.view(-1, self.side_num) + bucket_cls_weights = bucket_cls_weights.view(-1, self.side_num) + losses['loss_bbox_cls'] = self.loss_bbox_cls( + bucket_cls_preds, + bucket_cls_targets, + bucket_cls_weights, + avg_factor=bucket_cls_targets.size(0), + reduction_override=reduction_override) + + losses['loss_bbox_reg'] = self.loss_bbox_reg( + bucket_offset_preds, + bucket_offset_targets, + bucket_offset_weights, + avg_factor=bucket_offset_targets.size(0), + reduction_override=reduction_override) + + return losses + + @force_fp32(apply_to=('cls_score', 'bbox_pred')) + def get_bboxes(self, + rois, + cls_score, + bbox_pred, + img_shape, + scale_factor, + rescale=False, + cfg=None): + if isinstance(cls_score, list): + cls_score = sum(cls_score) / float(len(cls_score)) + scores = F.softmax(cls_score, dim=1) if cls_score is not None else None + + if bbox_pred is not None: + bboxes, confidences = self.bbox_coder.decode( + rois[:, 1:], bbox_pred, img_shape) + else: + bboxes = rois[:, 1:].clone() + confidences = None + if img_shape is not None: + bboxes[:, [0, 2]].clamp_(min=0, max=img_shape[1] - 1) + bboxes[:, [1, 3]].clamp_(min=0, max=img_shape[0] - 1) + + if rescale and bboxes.size(0) > 0: + if isinstance(scale_factor, float): + bboxes /= scale_factor + else: + bboxes /= torch.from_numpy(scale_factor).to(bboxes.device) + + if cfg is None: + return bboxes, scores + else: + det_bboxes, det_labels = multiclass_nms( + bboxes, + scores, + cfg.score_thr, + cfg.nms, + cfg.max_per_img, + score_factors=confidences) + + return det_bboxes, det_labels + + @force_fp32(apply_to=('bbox_preds', )) + def refine_bboxes(self, rois, labels, bbox_preds, pos_is_gts, img_metas): + """Refine bboxes during training. + + Args: + rois (Tensor): Shape (n*bs, 5), where n is image number per GPU, + and bs is the sampled RoIs per image. + labels (Tensor): Shape (n*bs, ). + bbox_preds (list[Tensor]): Shape [(n*bs, num_buckets*2), \ + (n*bs, num_buckets*2)]. + pos_is_gts (list[Tensor]): Flags indicating if each positive bbox + is a gt bbox. + img_metas (list[dict]): Meta info of each image. + + Returns: + list[Tensor]: Refined bboxes of each image in a mini-batch. + """ + img_ids = rois[:, 0].long().unique(sorted=True) + assert img_ids.numel() == len(img_metas) + + bboxes_list = [] + for i in range(len(img_metas)): + inds = torch.nonzero( + rois[:, 0] == i, as_tuple=False).squeeze(dim=1) + num_rois = inds.numel() + + bboxes_ = rois[inds, 1:] + label_ = labels[inds] + edge_cls_preds, edge_offset_preds = bbox_preds + edge_cls_preds_ = edge_cls_preds[inds] + edge_offset_preds_ = edge_offset_preds[inds] + bbox_pred_ = [edge_cls_preds_, edge_offset_preds_] + img_meta_ = img_metas[i] + pos_is_gts_ = pos_is_gts[i] + + bboxes = self.regress_by_class(bboxes_, label_, bbox_pred_, + img_meta_) + # filter gt bboxes + pos_keep = 1 - pos_is_gts_ + keep_inds = pos_is_gts_.new_ones(num_rois) + keep_inds[:len(pos_is_gts_)] = pos_keep + + bboxes_list.append(bboxes[keep_inds.type(torch.bool)]) + + return bboxes_list + + @force_fp32(apply_to=('bbox_pred', )) + def regress_by_class(self, rois, label, bbox_pred, img_meta): + """Regress the bbox for the predicted class. Used in Cascade R-CNN. + + Args: + rois (Tensor): shape (n, 4) or (n, 5) + label (Tensor): shape (n, ) + bbox_pred (list[Tensor]): shape [(n, num_buckets *2), \ + (n, num_buckets *2)] + img_meta (dict): Image meta info. + + Returns: + Tensor: Regressed bboxes, the same shape as input rois. + """ + assert rois.size(1) == 4 or rois.size(1) == 5 + + if rois.size(1) == 4: + new_rois, _ = self.bbox_coder.decode(rois, bbox_pred, + img_meta['img_shape']) + else: + bboxes, _ = self.bbox_coder.decode(rois[:, 1:], bbox_pred, + img_meta['img_shape']) + new_rois = torch.cat((rois[:, [0]], bboxes), dim=1) + + return new_rois diff --git a/mmdet/models/roi_heads/bbox_heads/scnet_bbox_head.py b/mmdet/models/roi_heads/bbox_heads/scnet_bbox_head.py new file mode 100644 index 0000000..cf39ebe --- /dev/null +++ b/mmdet/models/roi_heads/bbox_heads/scnet_bbox_head.py @@ -0,0 +1,77 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmdet.models.builder import HEADS +from .convfc_bbox_head import ConvFCBBoxHead + + +@HEADS.register_module() +class SCNetBBoxHead(ConvFCBBoxHead): + """BBox head for `SCNet `_. + + This inherits ``ConvFCBBoxHead`` with modified forward() function, allow us + to get intermediate shared feature. + """ + + def _forward_shared(self, x): + """Forward function for shared part.""" + if self.num_shared_convs > 0: + for conv in self.shared_convs: + x = conv(x) + + if self.num_shared_fcs > 0: + if self.with_avg_pool: + x = self.avg_pool(x) + + x = x.flatten(1) + + for fc in self.shared_fcs: + x = self.relu(fc(x)) + + return x + + def _forward_cls_reg(self, x): + """Forward function for classification and regression parts.""" + x_cls = x + x_reg = x + + for conv in self.cls_convs: + x_cls = conv(x_cls) + if x_cls.dim() > 2: + if self.with_avg_pool: + x_cls = self.avg_pool(x_cls) + x_cls = x_cls.flatten(1) + for fc in self.cls_fcs: + x_cls = self.relu(fc(x_cls)) + + for conv in self.reg_convs: + x_reg = conv(x_reg) + if x_reg.dim() > 2: + if self.with_avg_pool: + x_reg = self.avg_pool(x_reg) + x_reg = x_reg.flatten(1) + for fc in self.reg_fcs: + x_reg = self.relu(fc(x_reg)) + + cls_score = self.fc_cls(x_cls) if self.with_cls else None + bbox_pred = self.fc_reg(x_reg) if self.with_reg else None + + return cls_score, bbox_pred + + def forward(self, x, return_shared_feat=False): + """Forward function. + + Args: + x (Tensor): input features + return_shared_feat (bool): If True, return cls-reg-shared feature. + + Return: + out (tuple[Tensor]): contain ``cls_score`` and ``bbox_pred``, + if ``return_shared_feat`` is True, append ``x_shared`` to the + returned tuple. + """ + x_shared = self._forward_shared(x) + out = self._forward_cls_reg(x_shared) + + if return_shared_feat: + out += (x_shared, ) + + return out diff --git a/mmdet/models/roi_heads/cascade_roi_head.py b/mmdet/models/roi_heads/cascade_roi_head.py new file mode 100644 index 0000000..e17313f --- /dev/null +++ b/mmdet/models/roi_heads/cascade_roi_head.py @@ -0,0 +1,631 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import torch +import torch.nn as nn +from mmcv.runner import ModuleList + +from mmdet.core import (bbox2result, bbox2roi, bbox_mapping, build_assigner, + build_sampler, merge_aug_bboxes, merge_aug_masks, + multiclass_nms) +from ..builder import HEADS, build_head, build_roi_extractor +from .base_roi_head import BaseRoIHead +from .test_mixins import BBoxTestMixin, MaskTestMixin + + +@HEADS.register_module() +class CascadeRoIHead(BaseRoIHead, BBoxTestMixin, MaskTestMixin): + """Cascade roi head including one bbox head and one mask head. + + https://arxiv.org/abs/1712.00726 + """ + + def __init__(self, + num_stages, + stage_loss_weights, + bbox_roi_extractor=None, + bbox_head=None, + mask_roi_extractor=None, + mask_head=None, + shared_head=None, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + assert bbox_roi_extractor is not None + assert bbox_head is not None + assert shared_head is None, \ + 'Shared head is not supported in Cascade RCNN anymore' + + self.num_stages = num_stages + self.stage_loss_weights = stage_loss_weights + super(CascadeRoIHead, self).__init__( + bbox_roi_extractor=bbox_roi_extractor, + bbox_head=bbox_head, + mask_roi_extractor=mask_roi_extractor, + mask_head=mask_head, + shared_head=shared_head, + train_cfg=train_cfg, + test_cfg=test_cfg, + pretrained=pretrained, + init_cfg=init_cfg) + + def init_bbox_head(self, bbox_roi_extractor, bbox_head): + """Initialize box head and box roi extractor. + + Args: + bbox_roi_extractor (dict): Config of box roi extractor. + bbox_head (dict): Config of box in box head. + """ + self.bbox_roi_extractor = ModuleList() + self.bbox_head = ModuleList() + if not isinstance(bbox_roi_extractor, list): + bbox_roi_extractor = [ + bbox_roi_extractor for _ in range(self.num_stages) + ] + if not isinstance(bbox_head, list): + bbox_head = [bbox_head for _ in range(self.num_stages)] + assert len(bbox_roi_extractor) == len(bbox_head) == self.num_stages + for roi_extractor, head in zip(bbox_roi_extractor, bbox_head): + self.bbox_roi_extractor.append(build_roi_extractor(roi_extractor)) + self.bbox_head.append(build_head(head)) + + def init_mask_head(self, mask_roi_extractor, mask_head): + """Initialize mask head and mask roi extractor. + + Args: + mask_roi_extractor (dict): Config of mask roi extractor. + mask_head (dict): Config of mask in mask head. + """ + self.mask_head = nn.ModuleList() + if not isinstance(mask_head, list): + mask_head = [mask_head for _ in range(self.num_stages)] + assert len(mask_head) == self.num_stages + for head in mask_head: + self.mask_head.append(build_head(head)) + if mask_roi_extractor is not None: + self.share_roi_extractor = False + self.mask_roi_extractor = ModuleList() + if not isinstance(mask_roi_extractor, list): + mask_roi_extractor = [ + mask_roi_extractor for _ in range(self.num_stages) + ] + assert len(mask_roi_extractor) == self.num_stages + for roi_extractor in mask_roi_extractor: + self.mask_roi_extractor.append( + build_roi_extractor(roi_extractor)) + else: + self.share_roi_extractor = True + self.mask_roi_extractor = self.bbox_roi_extractor + + def init_assigner_sampler(self): + """Initialize assigner and sampler for each stage.""" + self.bbox_assigner = [] + self.bbox_sampler = [] + if self.train_cfg is not None: + for idx, rcnn_train_cfg in enumerate(self.train_cfg): + self.bbox_assigner.append( + build_assigner(rcnn_train_cfg.assigner)) + self.current_stage = idx + self.bbox_sampler.append( + build_sampler(rcnn_train_cfg.sampler, context=self)) + + def forward_dummy(self, x, proposals): + """Dummy forward function.""" + # bbox head + outs = () + rois = bbox2roi([proposals]) + if self.with_bbox: + for i in range(self.num_stages): + bbox_results = self._bbox_forward(i, x, rois) + outs = outs + (bbox_results['cls_score'], + bbox_results['bbox_pred']) + # mask heads + if self.with_mask: + mask_rois = rois[:100] + for i in range(self.num_stages): + mask_results = self._mask_forward(i, x, mask_rois) + outs = outs + (mask_results['mask_pred'], ) + return outs + + def _bbox_forward(self, stage, x, rois): + """Box head forward function used in both training and testing.""" + bbox_roi_extractor = self.bbox_roi_extractor[stage] + bbox_head = self.bbox_head[stage] + bbox_feats = bbox_roi_extractor(x[:bbox_roi_extractor.num_inputs], + rois) + # do not support caffe_c4 model anymore + cls_score, bbox_pred = bbox_head(bbox_feats) + + bbox_results = dict( + cls_score=cls_score, bbox_pred=bbox_pred, bbox_feats=bbox_feats) + return bbox_results + + def _bbox_forward_train(self, stage, x, sampling_results, gt_bboxes, + gt_labels, rcnn_train_cfg): + """Run forward function and calculate loss for box head in training.""" + rois = bbox2roi([res.bboxes for res in sampling_results]) + bbox_results = self._bbox_forward(stage, x, rois) + bbox_targets = self.bbox_head[stage].get_targets( + sampling_results, gt_bboxes, gt_labels, rcnn_train_cfg) + loss_bbox = self.bbox_head[stage].loss(bbox_results['cls_score'], + bbox_results['bbox_pred'], rois, + *bbox_targets) + + bbox_results.update( + loss_bbox=loss_bbox, rois=rois, bbox_targets=bbox_targets) + return bbox_results + + def _mask_forward(self, stage, x, rois): + """Mask head forward function used in both training and testing.""" + mask_roi_extractor = self.mask_roi_extractor[stage] + mask_head = self.mask_head[stage] + mask_feats = mask_roi_extractor(x[:mask_roi_extractor.num_inputs], + rois) + # do not support caffe_c4 model anymore + mask_pred = mask_head(mask_feats) + + mask_results = dict(mask_pred=mask_pred) + return mask_results + + def _mask_forward_train(self, + stage, + x, + sampling_results, + gt_masks, + rcnn_train_cfg, + bbox_feats=None): + """Run forward function and calculate loss for mask head in + training.""" + pos_rois = bbox2roi([res.pos_bboxes for res in sampling_results]) + mask_results = self._mask_forward(stage, x, pos_rois) + + mask_targets = self.mask_head[stage].get_targets( + sampling_results, gt_masks, rcnn_train_cfg) + pos_labels = torch.cat([res.pos_gt_labels for res in sampling_results]) + loss_mask = self.mask_head[stage].loss(mask_results['mask_pred'], + mask_targets, pos_labels) + + mask_results.update(loss_mask=loss_mask) + return mask_results + + def forward_train(self, + x, + img_metas, + proposal_list, + gt_bboxes, + gt_labels, + gt_bboxes_ignore=None, + gt_masks=None): + """ + Args: + x (list[Tensor]): list of multi-level img features. + img_metas (list[dict]): list of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmdet/datasets/pipelines/formatting.py:Collect`. + proposals (list[Tensors]): list of region proposals. + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + gt_bboxes_ignore (None | list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. + gt_masks (None | Tensor) : true segmentation masks for each box + used if the architecture supports a segmentation task. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + losses = dict() + for i in range(self.num_stages): + self.current_stage = i + rcnn_train_cfg = self.train_cfg[i] + lw = self.stage_loss_weights[i] + + # assign gts and sample proposals + sampling_results = [] + if self.with_bbox or self.with_mask: + bbox_assigner = self.bbox_assigner[i] + bbox_sampler = self.bbox_sampler[i] + num_imgs = len(img_metas) + if gt_bboxes_ignore is None: + gt_bboxes_ignore = [None for _ in range(num_imgs)] + + for j in range(num_imgs): + assign_result = bbox_assigner.assign( + proposal_list[j], gt_bboxes[j], gt_bboxes_ignore[j], + gt_labels[j]) + sampling_result = bbox_sampler.sample( + assign_result, + proposal_list[j], + gt_bboxes[j], + gt_labels[j], + feats=[lvl_feat[j][None] for lvl_feat in x]) + sampling_results.append(sampling_result) + + # bbox head forward and loss + bbox_results = self._bbox_forward_train(i, x, sampling_results, + gt_bboxes, gt_labels, + rcnn_train_cfg) + + for name, value in bbox_results['loss_bbox'].items(): + losses[f's{i}.{name}'] = ( + value * lw if 'loss' in name else value) + + # mask head forward and loss + if self.with_mask: + mask_results = self._mask_forward_train( + i, x, sampling_results, gt_masks, rcnn_train_cfg, + bbox_results['bbox_feats']) + for name, value in mask_results['loss_mask'].items(): + losses[f's{i}.{name}'] = ( + value * lw if 'loss' in name else value) + + # refine bboxes + if i < self.num_stages - 1: + pos_is_gts = [res.pos_is_gt for res in sampling_results] + # bbox_targets is a tuple + roi_labels = bbox_results['bbox_targets'][0] + with torch.no_grad(): + cls_score = bbox_results['cls_score'] + if self.bbox_head[i].custom_activation: + cls_score = self.bbox_head[i].loss_cls.get_activation( + cls_score) + + # Empty proposal. + if cls_score.numel() == 0: + break + + roi_labels = torch.where( + roi_labels == self.bbox_head[i].num_classes, + cls_score[:, :-1].argmax(1), roi_labels) + proposal_list = self.bbox_head[i].refine_bboxes( + bbox_results['rois'], roi_labels, + bbox_results['bbox_pred'], pos_is_gts, img_metas) + + return losses + + def simple_test(self, x, proposal_list, img_metas, rescale=False): + """Test without augmentation. + + Args: + x (tuple[Tensor]): Features from upstream network. Each + has shape (batch_size, c, h, w). + proposal_list (list(Tensor)): Proposals from rpn head. + Each has shape (num_proposals, 5), last dimension + 5 represent (x1, y1, x2, y2, score). + img_metas (list[dict]): Meta information of images. + rescale (bool): Whether to rescale the results to + the original image. Default: True. + + Returns: + list[list[np.ndarray]] or list[tuple]: When no mask branch, + it is bbox results of each image and classes with type + `list[list[np.ndarray]]`. The outer list + corresponds to each image. The inner list + corresponds to each class. When the model has mask branch, + it contains bbox results and mask results. + The outer list corresponds to each image, and first element + of tuple is bbox results, second element is mask results. + """ + assert self.with_bbox, 'Bbox head must be implemented.' + num_imgs = len(proposal_list) + img_shapes = tuple(meta['img_shape'] for meta in img_metas) + ori_shapes = tuple(meta['ori_shape'] for meta in img_metas) + scale_factors = tuple(meta['scale_factor'] for meta in img_metas) + + # "ms" in variable names means multi-stage + ms_bbox_result = {} + ms_segm_result = {} + ms_scores = [] + rcnn_test_cfg = self.test_cfg + + rois = bbox2roi(proposal_list) + + if rois.shape[0] == 0: + # There is no proposal in the whole batch + bbox_results = [[ + np.zeros((0, 5), dtype=np.float32) + for _ in range(self.bbox_head[-1].num_classes) + ]] * num_imgs + + if self.with_mask: + mask_classes = self.mask_head[-1].num_classes + segm_results = [[[] for _ in range(mask_classes)] + for _ in range(num_imgs)] + results = list(zip(bbox_results, segm_results)) + else: + results = bbox_results + + return results + + for i in range(self.num_stages): + bbox_results = self._bbox_forward(i, x, rois) + + # split batch bbox prediction back to each image + cls_score = bbox_results['cls_score'] + bbox_pred = bbox_results['bbox_pred'] + num_proposals_per_img = tuple( + len(proposals) for proposals in proposal_list) + rois = rois.split(num_proposals_per_img, 0) + cls_score = cls_score.split(num_proposals_per_img, 0) + if isinstance(bbox_pred, torch.Tensor): + bbox_pred = bbox_pred.split(num_proposals_per_img, 0) + else: + bbox_pred = self.bbox_head[i].bbox_pred_split( + bbox_pred, num_proposals_per_img) + ms_scores.append(cls_score) + + if i < self.num_stages - 1: + if self.bbox_head[i].custom_activation: + cls_score = [ + self.bbox_head[i].loss_cls.get_activation(s) + for s in cls_score + ] + refine_rois_list = [] + for j in range(num_imgs): + if rois[j].shape[0] > 0: + bbox_label = cls_score[j][:, :-1].argmax(dim=1) + refined_rois = self.bbox_head[i].regress_by_class( + rois[j], bbox_label, bbox_pred[j], img_metas[j]) + refine_rois_list.append(refined_rois) + rois = torch.cat(refine_rois_list) + + # average scores of each image by stages + cls_score = [ + sum([score[i] for score in ms_scores]) / float(len(ms_scores)) + for i in range(num_imgs) + ] + + # apply bbox post-processing to each image individually + det_bboxes = [] + det_labels = [] + for i in range(num_imgs): + det_bbox, det_label = self.bbox_head[-1].get_bboxes( + rois[i], + cls_score[i], + bbox_pred[i], + img_shapes[i], + scale_factors[i], + rescale=rescale, + cfg=rcnn_test_cfg) + det_bboxes.append(det_bbox) + det_labels.append(det_label) + + bbox_results = [ + bbox2result(det_bboxes[i], det_labels[i], + self.bbox_head[-1].num_classes) + for i in range(num_imgs) + ] + ms_bbox_result['ensemble'] = bbox_results + + if self.with_mask: + if all(det_bbox.shape[0] == 0 for det_bbox in det_bboxes): + mask_classes = self.mask_head[-1].num_classes + segm_results = [[[] for _ in range(mask_classes)] + for _ in range(num_imgs)] + else: + if rescale and not isinstance(scale_factors[0], float): + scale_factors = [ + torch.from_numpy(scale_factor).to(det_bboxes[0].device) + for scale_factor in scale_factors + ] + _bboxes = [ + det_bboxes[i][:, :4] * + scale_factors[i] if rescale else det_bboxes[i][:, :4] + for i in range(len(det_bboxes)) + ] + mask_rois = bbox2roi(_bboxes) + num_mask_rois_per_img = tuple( + _bbox.size(0) for _bbox in _bboxes) + aug_masks = [] + for i in range(self.num_stages): + mask_results = self._mask_forward(i, x, mask_rois) + mask_pred = mask_results['mask_pred'] + # split batch mask prediction back to each image + mask_pred = mask_pred.split(num_mask_rois_per_img, 0) + aug_masks.append([ + m.sigmoid().cpu().detach().numpy() for m in mask_pred + ]) + + # apply mask post-processing to each image individually + segm_results = [] + for i in range(num_imgs): + if det_bboxes[i].shape[0] == 0: + segm_results.append( + [[] + for _ in range(self.mask_head[-1].num_classes)]) + else: + aug_mask = [mask[i] for mask in aug_masks] + merged_masks = merge_aug_masks( + aug_mask, [[img_metas[i]]] * self.num_stages, + rcnn_test_cfg) + segm_result = self.mask_head[-1].get_seg_masks( + merged_masks, _bboxes[i], det_labels[i], + rcnn_test_cfg, ori_shapes[i], scale_factors[i], + rescale) + segm_results.append(segm_result) + ms_segm_result['ensemble'] = segm_results + + if self.with_mask: + results = list( + zip(ms_bbox_result['ensemble'], ms_segm_result['ensemble'])) + else: + results = ms_bbox_result['ensemble'] + + return results + + def aug_test(self, features, proposal_list, img_metas, rescale=False): + """Test with augmentations. + + If rescale is False, then returned bboxes and masks will fit the scale + of imgs[0]. + """ + rcnn_test_cfg = self.test_cfg + aug_bboxes = [] + aug_scores = [] + for x, img_meta in zip(features, img_metas): + # only one image in the batch + img_shape = img_meta[0]['img_shape'] + scale_factor = img_meta[0]['scale_factor'] + flip = img_meta[0]['flip'] + flip_direction = img_meta[0]['flip_direction'] + + proposals = bbox_mapping(proposal_list[0][:, :4], img_shape, + scale_factor, flip, flip_direction) + # "ms" in variable names means multi-stage + ms_scores = [] + + rois = bbox2roi([proposals]) + + if rois.shape[0] == 0: + # There is no proposal in the single image + aug_bboxes.append(rois.new_zeros(0, 4)) + aug_scores.append(rois.new_zeros(0, 1)) + continue + + for i in range(self.num_stages): + bbox_results = self._bbox_forward(i, x, rois) + ms_scores.append(bbox_results['cls_score']) + + if i < self.num_stages - 1: + cls_score = bbox_results['cls_score'] + if self.bbox_head[i].custom_activation: + cls_score = self.bbox_head[i].loss_cls.get_activation( + cls_score) + bbox_label = cls_score[:, :-1].argmax(dim=1) + rois = self.bbox_head[i].regress_by_class( + rois, bbox_label, bbox_results['bbox_pred'], + img_meta[0]) + + cls_score = sum(ms_scores) / float(len(ms_scores)) + bboxes, scores = self.bbox_head[-1].get_bboxes( + rois, + cls_score, + bbox_results['bbox_pred'], + img_shape, + scale_factor, + rescale=False, + cfg=None) + aug_bboxes.append(bboxes) + aug_scores.append(scores) + + # after merging, bboxes will be rescaled to the original image size + merged_bboxes, merged_scores = merge_aug_bboxes( + aug_bboxes, aug_scores, img_metas, rcnn_test_cfg) + det_bboxes, det_labels = multiclass_nms(merged_bboxes, merged_scores, + rcnn_test_cfg.score_thr, + rcnn_test_cfg.nms, + rcnn_test_cfg.max_per_img) + + bbox_result = bbox2result(det_bboxes, det_labels, + self.bbox_head[-1].num_classes) + + if self.with_mask: + if det_bboxes.shape[0] == 0: + segm_result = [[] + for _ in range(self.mask_head[-1].num_classes)] + else: + aug_masks = [] + aug_img_metas = [] + for x, img_meta in zip(features, img_metas): + img_shape = img_meta[0]['img_shape'] + scale_factor = img_meta[0]['scale_factor'] + flip = img_meta[0]['flip'] + flip_direction = img_meta[0]['flip_direction'] + _bboxes = bbox_mapping(det_bboxes[:, :4], img_shape, + scale_factor, flip, flip_direction) + mask_rois = bbox2roi([_bboxes]) + for i in range(self.num_stages): + mask_results = self._mask_forward(i, x, mask_rois) + aug_masks.append( + mask_results['mask_pred'].sigmoid().cpu().numpy()) + aug_img_metas.append(img_meta) + merged_masks = merge_aug_masks(aug_masks, aug_img_metas, + self.test_cfg) + + ori_shape = img_metas[0][0]['ori_shape'] + dummy_scale_factor = np.ones(4) + segm_result = self.mask_head[-1].get_seg_masks( + merged_masks, + det_bboxes, + det_labels, + rcnn_test_cfg, + ori_shape, + scale_factor=dummy_scale_factor, + rescale=False) + return [(bbox_result, segm_result)] + else: + return [bbox_result] + + def onnx_export(self, x, proposals, img_metas): + + assert self.with_bbox, 'Bbox head must be implemented.' + assert proposals.shape[0] == 1, 'Only support one input image ' \ + 'while in exporting to ONNX' + # remove the scores + rois = proposals[..., :-1] + batch_size = rois.shape[0] + num_proposals_per_img = rois.shape[1] + # Eliminate the batch dimension + rois = rois.view(-1, 4) + + # add dummy batch index + rois = torch.cat([rois.new_zeros(rois.shape[0], 1), rois], dim=-1) + + max_shape = img_metas[0]['img_shape_for_onnx'] + ms_scores = [] + rcnn_test_cfg = self.test_cfg + + for i in range(self.num_stages): + bbox_results = self._bbox_forward(i, x, rois) + + cls_score = bbox_results['cls_score'] + bbox_pred = bbox_results['bbox_pred'] + # Recover the batch dimension + rois = rois.reshape(batch_size, num_proposals_per_img, + rois.size(-1)) + cls_score = cls_score.reshape(batch_size, num_proposals_per_img, + cls_score.size(-1)) + bbox_pred = bbox_pred.reshape(batch_size, num_proposals_per_img, 4) + ms_scores.append(cls_score) + if i < self.num_stages - 1: + assert self.bbox_head[i].reg_class_agnostic + new_rois = self.bbox_head[i].bbox_coder.decode( + rois[..., 1:], bbox_pred, max_shape=max_shape) + rois = new_rois.reshape(-1, new_rois.shape[-1]) + # add dummy batch index + rois = torch.cat([rois.new_zeros(rois.shape[0], 1), rois], + dim=-1) + + cls_score = sum(ms_scores) / float(len(ms_scores)) + bbox_pred = bbox_pred.reshape(batch_size, num_proposals_per_img, 4) + rois = rois.reshape(batch_size, num_proposals_per_img, -1) + det_bboxes, det_labels = self.bbox_head[-1].onnx_export( + rois, cls_score, bbox_pred, max_shape, cfg=rcnn_test_cfg) + + if not self.with_mask: + return det_bboxes, det_labels + else: + batch_index = torch.arange( + det_bboxes.size(0), + device=det_bboxes.device).float().view(-1, 1, 1).expand( + det_bboxes.size(0), det_bboxes.size(1), 1) + rois = det_bboxes[..., :4] + mask_rois = torch.cat([batch_index, rois], dim=-1) + mask_rois = mask_rois.view(-1, 5) + aug_masks = [] + for i in range(self.num_stages): + mask_results = self._mask_forward(i, x, mask_rois) + mask_pred = mask_results['mask_pred'] + aug_masks.append(mask_pred) + max_shape = img_metas[0]['img_shape_for_onnx'] + # calculate the mean of masks from several stage + mask_pred = sum(aug_masks) / len(aug_masks) + segm_results = self.mask_head[-1].onnx_export( + mask_pred, rois.reshape(-1, 4), det_labels.reshape(-1), + self.test_cfg, max_shape) + segm_results = segm_results.reshape(batch_size, + det_bboxes.shape[1], + max_shape[0], max_shape[1]) + return det_bboxes, det_labels, segm_results diff --git a/mmdet/models/roi_heads/double_roi_head.py b/mmdet/models/roi_heads/double_roi_head.py new file mode 100644 index 0000000..895b5d3 --- /dev/null +++ b/mmdet/models/roi_heads/double_roi_head.py @@ -0,0 +1,34 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from ..builder import HEADS +from .standard_roi_head import StandardRoIHead + + +@HEADS.register_module() +class DoubleHeadRoIHead(StandardRoIHead): + """RoI head for Double Head RCNN. + + https://arxiv.org/abs/1904.06493 + """ + + def __init__(self, reg_roi_scale_factor, **kwargs): + super(DoubleHeadRoIHead, self).__init__(**kwargs) + self.reg_roi_scale_factor = reg_roi_scale_factor + + def _bbox_forward(self, x, rois): + """Box head forward function used in both training and testing time.""" + bbox_cls_feats = self.bbox_roi_extractor( + x[:self.bbox_roi_extractor.num_inputs], rois) + bbox_reg_feats = self.bbox_roi_extractor( + x[:self.bbox_roi_extractor.num_inputs], + rois, + roi_scale_factor=self.reg_roi_scale_factor) + if self.with_shared_head: + bbox_cls_feats = self.shared_head(bbox_cls_feats) + bbox_reg_feats = self.shared_head(bbox_reg_feats) + cls_score, bbox_pred = self.bbox_head(bbox_cls_feats, bbox_reg_feats) + + bbox_results = dict( + cls_score=cls_score, + bbox_pred=bbox_pred, + bbox_feats=bbox_cls_feats) + return bbox_results diff --git a/mmdet/models/roi_heads/dynamic_roi_head.py b/mmdet/models/roi_heads/dynamic_roi_head.py new file mode 100644 index 0000000..4c2b6cd --- /dev/null +++ b/mmdet/models/roi_heads/dynamic_roi_head.py @@ -0,0 +1,155 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import torch + +from mmdet.core import bbox2roi +from mmdet.models.losses import SmoothL1Loss +from ..builder import HEADS +from .standard_roi_head import StandardRoIHead + +EPS = 1e-15 + + +@HEADS.register_module() +class DynamicRoIHead(StandardRoIHead): + """RoI head for `Dynamic R-CNN `_.""" + + def __init__(self, **kwargs): + super(DynamicRoIHead, self).__init__(**kwargs) + assert isinstance(self.bbox_head.loss_bbox, SmoothL1Loss) + # the IoU history of the past `update_iter_interval` iterations + self.iou_history = [] + # the beta history of the past `update_iter_interval` iterations + self.beta_history = [] + + def forward_train(self, + x, + img_metas, + proposal_list, + gt_bboxes, + gt_labels, + gt_bboxes_ignore=None, + gt_masks=None): + """Forward function for training. + + Args: + x (list[Tensor]): list of multi-level img features. + + img_metas (list[dict]): list of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmdet/datasets/pipelines/formatting.py:Collect`. + + proposals (list[Tensors]): list of region proposals. + + gt_bboxes (list[Tensor]): each item are the truth boxes for each + image in [tl_x, tl_y, br_x, br_y] format. + + gt_labels (list[Tensor]): class indices corresponding to each box + + gt_bboxes_ignore (None | list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. + + gt_masks (None | Tensor) : true segmentation masks for each box + used if the architecture supports a segmentation task. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + # assign gts and sample proposals + if self.with_bbox or self.with_mask: + num_imgs = len(img_metas) + if gt_bboxes_ignore is None: + gt_bboxes_ignore = [None for _ in range(num_imgs)] + sampling_results = [] + cur_iou = [] + for i in range(num_imgs): + assign_result = self.bbox_assigner.assign( + proposal_list[i], gt_bboxes[i], gt_bboxes_ignore[i], + gt_labels[i]) + sampling_result = self.bbox_sampler.sample( + assign_result, + proposal_list[i], + gt_bboxes[i], + gt_labels[i], + feats=[lvl_feat[i][None] for lvl_feat in x]) + # record the `iou_topk`-th largest IoU in an image + iou_topk = min(self.train_cfg.dynamic_rcnn.iou_topk, + len(assign_result.max_overlaps)) + ious, _ = torch.topk(assign_result.max_overlaps, iou_topk) + cur_iou.append(ious[-1].item()) + sampling_results.append(sampling_result) + # average the current IoUs over images + cur_iou = np.mean(cur_iou) + self.iou_history.append(cur_iou) + + losses = dict() + # bbox head forward and loss + if self.with_bbox: + bbox_results = self._bbox_forward_train(x, sampling_results, + gt_bboxes, gt_labels, + img_metas) + losses.update(bbox_results['loss_bbox']) + + # mask head forward and loss + if self.with_mask: + mask_results = self._mask_forward_train(x, sampling_results, + bbox_results['bbox_feats'], + gt_masks, img_metas) + losses.update(mask_results['loss_mask']) + + # update IoU threshold and SmoothL1 beta + update_iter_interval = self.train_cfg.dynamic_rcnn.update_iter_interval + if len(self.iou_history) % update_iter_interval == 0: + new_iou_thr, new_beta = self.update_hyperparameters() + + return losses + + def _bbox_forward_train(self, x, sampling_results, gt_bboxes, gt_labels, + img_metas): + num_imgs = len(img_metas) + rois = bbox2roi([res.bboxes for res in sampling_results]) + bbox_results = self._bbox_forward(x, rois) + + bbox_targets = self.bbox_head.get_targets(sampling_results, gt_bboxes, + gt_labels, self.train_cfg) + # record the `beta_topk`-th smallest target + # `bbox_targets[2]` and `bbox_targets[3]` stand for bbox_targets + # and bbox_weights, respectively + pos_inds = bbox_targets[3][:, 0].nonzero().squeeze(1) + num_pos = len(pos_inds) + cur_target = bbox_targets[2][pos_inds, :2].abs().mean(dim=1) + beta_topk = min(self.train_cfg.dynamic_rcnn.beta_topk * num_imgs, + num_pos) + cur_target = torch.kthvalue(cur_target, beta_topk)[0].item() + self.beta_history.append(cur_target) + loss_bbox = self.bbox_head.loss(bbox_results['cls_score'], + bbox_results['bbox_pred'], rois, + *bbox_targets) + + bbox_results.update(loss_bbox=loss_bbox) + return bbox_results + + def update_hyperparameters(self): + """Update hyperparameters like IoU thresholds for assigner and beta for + SmoothL1 loss based on the training statistics. + + Returns: + tuple[float]: the updated ``iou_thr`` and ``beta``. + """ + new_iou_thr = max(self.train_cfg.dynamic_rcnn.initial_iou, + np.mean(self.iou_history)) + self.iou_history = [] + self.bbox_assigner.pos_iou_thr = new_iou_thr + self.bbox_assigner.neg_iou_thr = new_iou_thr + self.bbox_assigner.min_pos_iou = new_iou_thr + if (np.median(self.beta_history) < EPS): + # avoid 0 or too small value for new_beta + new_beta = self.bbox_head.loss_bbox.beta + else: + new_beta = min(self.train_cfg.dynamic_rcnn.initial_beta, + np.median(self.beta_history)) + self.beta_history = [] + self.bbox_head.loss_bbox.beta = new_beta + return new_iou_thr, new_beta diff --git a/mmdet/models/roi_heads/grid_roi_head.py b/mmdet/models/roi_heads/grid_roi_head.py new file mode 100644 index 0000000..333f629 --- /dev/null +++ b/mmdet/models/roi_heads/grid_roi_head.py @@ -0,0 +1,170 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import torch + +from mmdet.core import bbox2result, bbox2roi +from ..builder import HEADS, build_head, build_roi_extractor +from .standard_roi_head import StandardRoIHead + + +@HEADS.register_module() +class GridRoIHead(StandardRoIHead): + """Grid roi head for Grid R-CNN. + + https://arxiv.org/abs/1811.12030 + """ + + def __init__(self, grid_roi_extractor, grid_head, **kwargs): + assert grid_head is not None + super(GridRoIHead, self).__init__(**kwargs) + if grid_roi_extractor is not None: + self.grid_roi_extractor = build_roi_extractor(grid_roi_extractor) + self.share_roi_extractor = False + else: + self.share_roi_extractor = True + self.grid_roi_extractor = self.bbox_roi_extractor + self.grid_head = build_head(grid_head) + + def _random_jitter(self, sampling_results, img_metas, amplitude=0.15): + """Ramdom jitter positive proposals for training.""" + for sampling_result, img_meta in zip(sampling_results, img_metas): + bboxes = sampling_result.pos_bboxes + random_offsets = bboxes.new_empty(bboxes.shape[0], 4).uniform_( + -amplitude, amplitude) + # before jittering + cxcy = (bboxes[:, 2:4] + bboxes[:, :2]) / 2 + wh = (bboxes[:, 2:4] - bboxes[:, :2]).abs() + # after jittering + new_cxcy = cxcy + wh * random_offsets[:, :2] + new_wh = wh * (1 + random_offsets[:, 2:]) + # xywh to xyxy + new_x1y1 = (new_cxcy - new_wh / 2) + new_x2y2 = (new_cxcy + new_wh / 2) + new_bboxes = torch.cat([new_x1y1, new_x2y2], dim=1) + # clip bboxes + max_shape = img_meta['img_shape'] + if max_shape is not None: + new_bboxes[:, 0::2].clamp_(min=0, max=max_shape[1] - 1) + new_bboxes[:, 1::2].clamp_(min=0, max=max_shape[0] - 1) + + sampling_result.pos_bboxes = new_bboxes + return sampling_results + + def forward_dummy(self, x, proposals): + """Dummy forward function.""" + # bbox head + outs = () + rois = bbox2roi([proposals]) + if self.with_bbox: + bbox_results = self._bbox_forward(x, rois) + outs = outs + (bbox_results['cls_score'], + bbox_results['bbox_pred']) + + # grid head + grid_rois = rois[:100] + grid_feats = self.grid_roi_extractor( + x[:self.grid_roi_extractor.num_inputs], grid_rois) + if self.with_shared_head: + grid_feats = self.shared_head(grid_feats) + grid_pred = self.grid_head(grid_feats) + outs = outs + (grid_pred, ) + + # mask head + if self.with_mask: + mask_rois = rois[:100] + mask_results = self._mask_forward(x, mask_rois) + outs = outs + (mask_results['mask_pred'], ) + return outs + + def _bbox_forward_train(self, x, sampling_results, gt_bboxes, gt_labels, + img_metas): + """Run forward function and calculate loss for box head in training.""" + bbox_results = super(GridRoIHead, + self)._bbox_forward_train(x, sampling_results, + gt_bboxes, gt_labels, + img_metas) + + # Grid head forward and loss + sampling_results = self._random_jitter(sampling_results, img_metas) + pos_rois = bbox2roi([res.pos_bboxes for res in sampling_results]) + + # GN in head does not support zero shape input + if pos_rois.shape[0] == 0: + return bbox_results + + grid_feats = self.grid_roi_extractor( + x[:self.grid_roi_extractor.num_inputs], pos_rois) + if self.with_shared_head: + grid_feats = self.shared_head(grid_feats) + # Accelerate training + max_sample_num_grid = self.train_cfg.get('max_num_grid', 192) + sample_idx = torch.randperm( + grid_feats.shape[0])[:min(grid_feats.shape[0], max_sample_num_grid + )] + grid_feats = grid_feats[sample_idx] + + grid_pred = self.grid_head(grid_feats) + + grid_targets = self.grid_head.get_targets(sampling_results, + self.train_cfg) + grid_targets = grid_targets[sample_idx] + + loss_grid = self.grid_head.loss(grid_pred, grid_targets) + + bbox_results['loss_bbox'].update(loss_grid) + return bbox_results + + def simple_test(self, + x, + proposal_list, + img_metas, + proposals=None, + rescale=False): + """Test without augmentation.""" + assert self.with_bbox, 'Bbox head must be implemented.' + + det_bboxes, det_labels = self.simple_test_bboxes( + x, img_metas, proposal_list, self.test_cfg, rescale=False) + # pack rois into bboxes + grid_rois = bbox2roi([det_bbox[:, :4] for det_bbox in det_bboxes]) + if grid_rois.shape[0] != 0: + grid_feats = self.grid_roi_extractor( + x[:len(self.grid_roi_extractor.featmap_strides)], grid_rois) + self.grid_head.test_mode = True + grid_pred = self.grid_head(grid_feats) + # split batch grid head prediction back to each image + num_roi_per_img = tuple(len(det_bbox) for det_bbox in det_bboxes) + grid_pred = { + k: v.split(num_roi_per_img, 0) + for k, v in grid_pred.items() + } + + # apply bbox post-processing to each image individually + bbox_results = [] + num_imgs = len(det_bboxes) + for i in range(num_imgs): + if det_bboxes[i].shape[0] == 0: + bbox_results.append([ + np.zeros((0, 5), dtype=np.float32) + for _ in range(self.bbox_head.num_classes) + ]) + else: + det_bbox = self.grid_head.get_bboxes( + det_bboxes[i], grid_pred['fused'][i], [img_metas[i]]) + if rescale: + det_bbox[:, :4] /= img_metas[i]['scale_factor'] + bbox_results.append( + bbox2result(det_bbox, det_labels[i], + self.bbox_head.num_classes)) + else: + bbox_results = [[ + np.zeros((0, 5), dtype=np.float32) + for _ in range(self.bbox_head.num_classes) + ] for _ in range(len(det_bboxes))] + + if not self.with_mask: + return bbox_results + else: + segm_results = self.simple_test_mask( + x, img_metas, det_bboxes, det_labels, rescale=rescale) + return list(zip(bbox_results, segm_results)) diff --git a/mmdet/models/roi_heads/htc_roi_head.py b/mmdet/models/roi_heads/htc_roi_head.py new file mode 100644 index 0000000..86a6db1 --- /dev/null +++ b/mmdet/models/roi_heads/htc_roi_head.py @@ -0,0 +1,628 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import torch +import torch.nn.functional as F + +from mmdet.core import (bbox2result, bbox2roi, bbox_mapping, merge_aug_bboxes, + merge_aug_masks, multiclass_nms) +from ..builder import HEADS, build_head, build_roi_extractor +from ..utils.brick_wrappers import adaptive_avg_pool2d +from .cascade_roi_head import CascadeRoIHead + + +@HEADS.register_module() +class HybridTaskCascadeRoIHead(CascadeRoIHead): + """Hybrid task cascade roi head including one bbox head and one mask head. + + https://arxiv.org/abs/1901.07518 + """ + + def __init__(self, + num_stages, + stage_loss_weights, + semantic_roi_extractor=None, + semantic_head=None, + semantic_fusion=('bbox', 'mask'), + interleaved=True, + mask_info_flow=True, + **kwargs): + super(HybridTaskCascadeRoIHead, + self).__init__(num_stages, stage_loss_weights, **kwargs) + assert self.with_bbox + assert not self.with_shared_head # shared head is not supported + + if semantic_head is not None: + self.semantic_roi_extractor = build_roi_extractor( + semantic_roi_extractor) + self.semantic_head = build_head(semantic_head) + + self.semantic_fusion = semantic_fusion + self.interleaved = interleaved + self.mask_info_flow = mask_info_flow + + @property + def with_semantic(self): + """bool: whether the head has semantic head""" + if hasattr(self, 'semantic_head') and self.semantic_head is not None: + return True + else: + return False + + def forward_dummy(self, x, proposals): + """Dummy forward function.""" + outs = () + # semantic head + if self.with_semantic: + _, semantic_feat = self.semantic_head(x) + else: + semantic_feat = None + # bbox heads + rois = bbox2roi([proposals]) + for i in range(self.num_stages): + bbox_results = self._bbox_forward( + i, x, rois, semantic_feat=semantic_feat) + outs = outs + (bbox_results['cls_score'], + bbox_results['bbox_pred']) + # mask heads + if self.with_mask: + mask_rois = rois[:100] + mask_roi_extractor = self.mask_roi_extractor[-1] + mask_feats = mask_roi_extractor( + x[:len(mask_roi_extractor.featmap_strides)], mask_rois) + if self.with_semantic and 'mask' in self.semantic_fusion: + mask_semantic_feat = self.semantic_roi_extractor( + [semantic_feat], mask_rois) + mask_feats = mask_feats + mask_semantic_feat + last_feat = None + for i in range(self.num_stages): + mask_head = self.mask_head[i] + if self.mask_info_flow: + mask_pred, last_feat = mask_head(mask_feats, last_feat) + else: + mask_pred = mask_head(mask_feats) + outs = outs + (mask_pred, ) + return outs + + def _bbox_forward_train(self, + stage, + x, + sampling_results, + gt_bboxes, + gt_labels, + rcnn_train_cfg, + semantic_feat=None): + """Run forward function and calculate loss for box head in training.""" + bbox_head = self.bbox_head[stage] + rois = bbox2roi([res.bboxes for res in sampling_results]) + bbox_results = self._bbox_forward( + stage, x, rois, semantic_feat=semantic_feat) + + bbox_targets = bbox_head.get_targets(sampling_results, gt_bboxes, + gt_labels, rcnn_train_cfg) + loss_bbox = bbox_head.loss(bbox_results['cls_score'], + bbox_results['bbox_pred'], rois, + *bbox_targets) + + bbox_results.update( + loss_bbox=loss_bbox, + rois=rois, + bbox_targets=bbox_targets, + ) + return bbox_results + + def _mask_forward_train(self, + stage, + x, + sampling_results, + gt_masks, + rcnn_train_cfg, + semantic_feat=None): + """Run forward function and calculate loss for mask head in + training.""" + mask_roi_extractor = self.mask_roi_extractor[stage] + mask_head = self.mask_head[stage] + pos_rois = bbox2roi([res.pos_bboxes for res in sampling_results]) + mask_feats = mask_roi_extractor(x[:mask_roi_extractor.num_inputs], + pos_rois) + + # semantic feature fusion + # element-wise sum for original features and pooled semantic features + if self.with_semantic and 'mask' in self.semantic_fusion: + mask_semantic_feat = self.semantic_roi_extractor([semantic_feat], + pos_rois) + if mask_semantic_feat.shape[-2:] != mask_feats.shape[-2:]: + mask_semantic_feat = F.adaptive_avg_pool2d( + mask_semantic_feat, mask_feats.shape[-2:]) + mask_feats = mask_feats + mask_semantic_feat + + # mask information flow + # forward all previous mask heads to obtain last_feat, and fuse it + # with the normal mask feature + if self.mask_info_flow: + last_feat = None + for i in range(stage): + last_feat = self.mask_head[i]( + mask_feats, last_feat, return_logits=False) + mask_pred = mask_head(mask_feats, last_feat, return_feat=False) + else: + mask_pred = mask_head(mask_feats, return_feat=False) + + mask_targets = mask_head.get_targets(sampling_results, gt_masks, + rcnn_train_cfg) + pos_labels = torch.cat([res.pos_gt_labels for res in sampling_results]) + loss_mask = mask_head.loss(mask_pred, mask_targets, pos_labels) + + mask_results = dict(loss_mask=loss_mask) + return mask_results + + def _bbox_forward(self, stage, x, rois, semantic_feat=None): + """Box head forward function used in both training and testing.""" + bbox_roi_extractor = self.bbox_roi_extractor[stage] + bbox_head = self.bbox_head[stage] + bbox_feats = bbox_roi_extractor( + x[:len(bbox_roi_extractor.featmap_strides)], rois) + if self.with_semantic and 'bbox' in self.semantic_fusion: + bbox_semantic_feat = self.semantic_roi_extractor([semantic_feat], + rois) + if bbox_semantic_feat.shape[-2:] != bbox_feats.shape[-2:]: + bbox_semantic_feat = adaptive_avg_pool2d( + bbox_semantic_feat, bbox_feats.shape[-2:]) + bbox_feats = bbox_feats + bbox_semantic_feat + cls_score, bbox_pred = bbox_head(bbox_feats) + + bbox_results = dict(cls_score=cls_score, bbox_pred=bbox_pred) + return bbox_results + + def _mask_forward_test(self, stage, x, bboxes, semantic_feat=None): + """Mask head forward function for testing.""" + mask_roi_extractor = self.mask_roi_extractor[stage] + mask_head = self.mask_head[stage] + mask_rois = bbox2roi([bboxes]) + mask_feats = mask_roi_extractor( + x[:len(mask_roi_extractor.featmap_strides)], mask_rois) + if self.with_semantic and 'mask' in self.semantic_fusion: + mask_semantic_feat = self.semantic_roi_extractor([semantic_feat], + mask_rois) + if mask_semantic_feat.shape[-2:] != mask_feats.shape[-2:]: + mask_semantic_feat = F.adaptive_avg_pool2d( + mask_semantic_feat, mask_feats.shape[-2:]) + mask_feats = mask_feats + mask_semantic_feat + if self.mask_info_flow: + last_feat = None + last_pred = None + for i in range(stage): + mask_pred, last_feat = self.mask_head[i](mask_feats, last_feat) + if last_pred is not None: + mask_pred = mask_pred + last_pred + last_pred = mask_pred + mask_pred = mask_head(mask_feats, last_feat, return_feat=False) + if last_pred is not None: + mask_pred = mask_pred + last_pred + else: + mask_pred = mask_head(mask_feats) + return mask_pred + + def forward_train(self, + x, + img_metas, + proposal_list, + gt_bboxes, + gt_labels, + gt_bboxes_ignore=None, + gt_masks=None, + gt_semantic_seg=None): + """ + Args: + x (list[Tensor]): list of multi-level img features. + + img_metas (list[dict]): list of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmdet/datasets/pipelines/formatting.py:Collect`. + + proposal_list (list[Tensors]): list of region proposals. + + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + + gt_labels (list[Tensor]): class indices corresponding to each box + + gt_bboxes_ignore (None, list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. + + gt_masks (None, Tensor) : true segmentation masks for each box + used if the architecture supports a segmentation task. + + gt_semantic_seg (None, list[Tensor]): semantic segmentation masks + used if the architecture supports semantic segmentation task. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + # semantic segmentation part + # 2 outputs: segmentation prediction and embedded features + losses = dict() + if self.with_semantic: + semantic_pred, semantic_feat = self.semantic_head(x) + loss_seg = self.semantic_head.loss(semantic_pred, gt_semantic_seg) + losses['loss_semantic_seg'] = loss_seg + else: + semantic_feat = None + + for i in range(self.num_stages): + self.current_stage = i + rcnn_train_cfg = self.train_cfg[i] + lw = self.stage_loss_weights[i] + + # assign gts and sample proposals + sampling_results = [] + bbox_assigner = self.bbox_assigner[i] + bbox_sampler = self.bbox_sampler[i] + num_imgs = len(img_metas) + if gt_bboxes_ignore is None: + gt_bboxes_ignore = [None for _ in range(num_imgs)] + + for j in range(num_imgs): + assign_result = bbox_assigner.assign(proposal_list[j], + gt_bboxes[j], + gt_bboxes_ignore[j], + gt_labels[j]) + sampling_result = bbox_sampler.sample( + assign_result, + proposal_list[j], + gt_bboxes[j], + gt_labels[j], + feats=[lvl_feat[j][None] for lvl_feat in x]) + sampling_results.append(sampling_result) + + # bbox head forward and loss + bbox_results = \ + self._bbox_forward_train( + i, x, sampling_results, gt_bboxes, gt_labels, + rcnn_train_cfg, semantic_feat) + roi_labels = bbox_results['bbox_targets'][0] + + for name, value in bbox_results['loss_bbox'].items(): + losses[f's{i}.{name}'] = ( + value * lw if 'loss' in name else value) + + # mask head forward and loss + if self.with_mask: + # interleaved execution: use regressed bboxes by the box branch + # to train the mask branch + if self.interleaved: + pos_is_gts = [res.pos_is_gt for res in sampling_results] + with torch.no_grad(): + proposal_list = self.bbox_head[i].refine_bboxes( + bbox_results['rois'], roi_labels, + bbox_results['bbox_pred'], pos_is_gts, img_metas) + # re-assign and sample 512 RoIs from 512 RoIs + sampling_results = [] + for j in range(num_imgs): + assign_result = bbox_assigner.assign( + proposal_list[j], gt_bboxes[j], + gt_bboxes_ignore[j], gt_labels[j]) + sampling_result = bbox_sampler.sample( + assign_result, + proposal_list[j], + gt_bboxes[j], + gt_labels[j], + feats=[lvl_feat[j][None] for lvl_feat in x]) + sampling_results.append(sampling_result) + mask_results = self._mask_forward_train( + i, x, sampling_results, gt_masks, rcnn_train_cfg, + semantic_feat) + for name, value in mask_results['loss_mask'].items(): + losses[f's{i}.{name}'] = ( + value * lw if 'loss' in name else value) + + # refine bboxes (same as Cascade R-CNN) + if i < self.num_stages - 1 and not self.interleaved: + pos_is_gts = [res.pos_is_gt for res in sampling_results] + with torch.no_grad(): + proposal_list = self.bbox_head[i].refine_bboxes( + bbox_results['rois'], roi_labels, + bbox_results['bbox_pred'], pos_is_gts, img_metas) + + return losses + + def simple_test(self, x, proposal_list, img_metas, rescale=False): + """Test without augmentation. + + Args: + x (tuple[Tensor]): Features from upstream network. Each + has shape (batch_size, c, h, w). + proposal_list (list(Tensor)): Proposals from rpn head. + Each has shape (num_proposals, 5), last dimension + 5 represent (x1, y1, x2, y2, score). + img_metas (list[dict]): Meta information of images. + rescale (bool): Whether to rescale the results to + the original image. Default: True. + + Returns: + list[list[np.ndarray]] or list[tuple]: When no mask branch, + it is bbox results of each image and classes with type + `list[list[np.ndarray]]`. The outer list + corresponds to each image. The inner list + corresponds to each class. When the model has mask branch, + it contains bbox results and mask results. + The outer list corresponds to each image, and first element + of tuple is bbox results, second element is mask results. + """ + if self.with_semantic: + _, semantic_feat = self.semantic_head(x) + else: + semantic_feat = None + + num_imgs = len(proposal_list) + img_shapes = tuple(meta['img_shape'] for meta in img_metas) + ori_shapes = tuple(meta['ori_shape'] for meta in img_metas) + scale_factors = tuple(meta['scale_factor'] for meta in img_metas) + + # "ms" in variable names means multi-stage + ms_bbox_result = {} + ms_segm_result = {} + ms_scores = [] + rcnn_test_cfg = self.test_cfg + + rois = bbox2roi(proposal_list) + + if rois.shape[0] == 0: + # There is no proposal in the whole batch + bbox_results = [[ + np.zeros((0, 5), dtype=np.float32) + for _ in range(self.bbox_head[-1].num_classes) + ]] * num_imgs + + if self.with_mask: + mask_classes = self.mask_head[-1].num_classes + segm_results = [[[] for _ in range(mask_classes)] + for _ in range(num_imgs)] + results = list(zip(bbox_results, segm_results)) + else: + results = bbox_results + + return results + + for i in range(self.num_stages): + bbox_head = self.bbox_head[i] + bbox_results = self._bbox_forward( + i, x, rois, semantic_feat=semantic_feat) + # split batch bbox prediction back to each image + cls_score = bbox_results['cls_score'] + bbox_pred = bbox_results['bbox_pred'] + num_proposals_per_img = tuple(len(p) for p in proposal_list) + rois = rois.split(num_proposals_per_img, 0) + cls_score = cls_score.split(num_proposals_per_img, 0) + bbox_pred = bbox_pred.split(num_proposals_per_img, 0) + ms_scores.append(cls_score) + + if i < self.num_stages - 1: + refine_rois_list = [] + for j in range(num_imgs): + if rois[j].shape[0] > 0: + bbox_label = cls_score[j][:, :-1].argmax(dim=1) + refine_rois = bbox_head.regress_by_class( + rois[j], bbox_label, bbox_pred[j], img_metas[j]) + refine_rois_list.append(refine_rois) + rois = torch.cat(refine_rois_list) + + # average scores of each image by stages + cls_score = [ + sum([score[i] for score in ms_scores]) / float(len(ms_scores)) + for i in range(num_imgs) + ] + + # apply bbox post-processing to each image individually + det_bboxes = [] + det_labels = [] + for i in range(num_imgs): + det_bbox, det_label = self.bbox_head[-1].get_bboxes( + rois[i], + cls_score[i], + bbox_pred[i], + img_shapes[i], + scale_factors[i], + rescale=rescale, + cfg=rcnn_test_cfg) + det_bboxes.append(det_bbox) + det_labels.append(det_label) + bbox_result = [ + bbox2result(det_bboxes[i], det_labels[i], + self.bbox_head[-1].num_classes) + for i in range(num_imgs) + ] + ms_bbox_result['ensemble'] = bbox_result + + if self.with_mask: + if all(det_bbox.shape[0] == 0 for det_bbox in det_bboxes): + mask_classes = self.mask_head[-1].num_classes + segm_results = [[[] for _ in range(mask_classes)] + for _ in range(num_imgs)] + else: + if rescale and not isinstance(scale_factors[0], float): + scale_factors = [ + torch.from_numpy(scale_factor).to(det_bboxes[0].device) + for scale_factor in scale_factors + ] + _bboxes = [ + det_bboxes[i][:, :4] * + scale_factors[i] if rescale else det_bboxes[i] + for i in range(num_imgs) + ] + mask_rois = bbox2roi(_bboxes) + aug_masks = [] + mask_roi_extractor = self.mask_roi_extractor[-1] + mask_feats = mask_roi_extractor( + x[:len(mask_roi_extractor.featmap_strides)], mask_rois) + if self.with_semantic and 'mask' in self.semantic_fusion: + mask_semantic_feat = self.semantic_roi_extractor( + [semantic_feat], mask_rois) + mask_feats = mask_feats + mask_semantic_feat + last_feat = None + + num_bbox_per_img = tuple(len(_bbox) for _bbox in _bboxes) + for i in range(self.num_stages): + mask_head = self.mask_head[i] + if self.mask_info_flow: + mask_pred, last_feat = mask_head(mask_feats, last_feat) + else: + mask_pred = mask_head(mask_feats) + + # split batch mask prediction back to each image + mask_pred = mask_pred.split(num_bbox_per_img, 0) + aug_masks.append( + [mask.sigmoid().cpu().numpy() for mask in mask_pred]) + + # apply mask post-processing to each image individually + segm_results = [] + for i in range(num_imgs): + if det_bboxes[i].shape[0] == 0: + segm_results.append( + [[] + for _ in range(self.mask_head[-1].num_classes)]) + else: + aug_mask = [mask[i] for mask in aug_masks] + merged_mask = merge_aug_masks( + aug_mask, [[img_metas[i]]] * self.num_stages, + rcnn_test_cfg) + segm_result = self.mask_head[-1].get_seg_masks( + merged_mask, _bboxes[i], det_labels[i], + rcnn_test_cfg, ori_shapes[i], scale_factors[i], + rescale) + segm_results.append(segm_result) + ms_segm_result['ensemble'] = segm_results + + if self.with_mask: + results = list( + zip(ms_bbox_result['ensemble'], ms_segm_result['ensemble'])) + else: + results = ms_bbox_result['ensemble'] + + return results + + def aug_test(self, img_feats, proposal_list, img_metas, rescale=False): + """Test with augmentations. + + If rescale is False, then returned bboxes and masks will fit the scale + of imgs[0]. + """ + if self.with_semantic: + semantic_feats = [ + self.semantic_head(feat)[1] for feat in img_feats + ] + else: + semantic_feats = [None] * len(img_metas) + + rcnn_test_cfg = self.test_cfg + aug_bboxes = [] + aug_scores = [] + for x, img_meta, semantic in zip(img_feats, img_metas, semantic_feats): + # only one image in the batch + img_shape = img_meta[0]['img_shape'] + scale_factor = img_meta[0]['scale_factor'] + flip = img_meta[0]['flip'] + flip_direction = img_meta[0]['flip_direction'] + + proposals = bbox_mapping(proposal_list[0][:, :4], img_shape, + scale_factor, flip, flip_direction) + # "ms" in variable names means multi-stage + ms_scores = [] + + rois = bbox2roi([proposals]) + + if rois.shape[0] == 0: + # There is no proposal in the single image + aug_bboxes.append(rois.new_zeros(0, 4)) + aug_scores.append(rois.new_zeros(0, 1)) + continue + + for i in range(self.num_stages): + bbox_head = self.bbox_head[i] + bbox_results = self._bbox_forward( + i, x, rois, semantic_feat=semantic) + ms_scores.append(bbox_results['cls_score']) + + if i < self.num_stages - 1: + bbox_label = bbox_results['cls_score'].argmax(dim=1) + rois = bbox_head.regress_by_class( + rois, bbox_label, bbox_results['bbox_pred'], + img_meta[0]) + + cls_score = sum(ms_scores) / float(len(ms_scores)) + bboxes, scores = self.bbox_head[-1].get_bboxes( + rois, + cls_score, + bbox_results['bbox_pred'], + img_shape, + scale_factor, + rescale=False, + cfg=None) + aug_bboxes.append(bboxes) + aug_scores.append(scores) + + # after merging, bboxes will be rescaled to the original image size + merged_bboxes, merged_scores = merge_aug_bboxes( + aug_bboxes, aug_scores, img_metas, rcnn_test_cfg) + det_bboxes, det_labels = multiclass_nms(merged_bboxes, merged_scores, + rcnn_test_cfg.score_thr, + rcnn_test_cfg.nms, + rcnn_test_cfg.max_per_img) + + bbox_result = bbox2result(det_bboxes, det_labels, + self.bbox_head[-1].num_classes) + + if self.with_mask: + if det_bboxes.shape[0] == 0: + segm_result = [[] + for _ in range(self.mask_head[-1].num_classes)] + else: + aug_masks = [] + aug_img_metas = [] + for x, img_meta, semantic in zip(img_feats, img_metas, + semantic_feats): + img_shape = img_meta[0]['img_shape'] + scale_factor = img_meta[0]['scale_factor'] + flip = img_meta[0]['flip'] + flip_direction = img_meta[0]['flip_direction'] + _bboxes = bbox_mapping(det_bboxes[:, :4], img_shape, + scale_factor, flip, flip_direction) + mask_rois = bbox2roi([_bboxes]) + mask_feats = self.mask_roi_extractor[-1]( + x[:len(self.mask_roi_extractor[-1].featmap_strides)], + mask_rois) + if self.with_semantic: + semantic_feat = semantic + mask_semantic_feat = self.semantic_roi_extractor( + [semantic_feat], mask_rois) + if mask_semantic_feat.shape[-2:] != mask_feats.shape[ + -2:]: + mask_semantic_feat = F.adaptive_avg_pool2d( + mask_semantic_feat, mask_feats.shape[-2:]) + mask_feats = mask_feats + mask_semantic_feat + last_feat = None + for i in range(self.num_stages): + mask_head = self.mask_head[i] + if self.mask_info_flow: + mask_pred, last_feat = mask_head( + mask_feats, last_feat) + else: + mask_pred = mask_head(mask_feats) + aug_masks.append(mask_pred.sigmoid().cpu().numpy()) + aug_img_metas.append(img_meta) + merged_masks = merge_aug_masks(aug_masks, aug_img_metas, + self.test_cfg) + + ori_shape = img_metas[0][0]['ori_shape'] + segm_result = self.mask_head[-1].get_seg_masks( + merged_masks, + det_bboxes, + det_labels, + rcnn_test_cfg, + ori_shape, + scale_factor=1.0, + rescale=False) + return [(bbox_result, segm_result)] + else: + return [bbox_result] diff --git a/mmdet/models/roi_heads/mask_heads/__init__.py b/mmdet/models/roi_heads/mask_heads/__init__.py new file mode 100644 index 0000000..48a5d42 --- /dev/null +++ b/mmdet/models/roi_heads/mask_heads/__init__.py @@ -0,0 +1,20 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .coarse_mask_head import CoarseMaskHead +from .dynamic_mask_head import DynamicMaskHead +from .fcn_mask_head import FCNMaskHead +from .feature_relay_head import FeatureRelayHead +from .fused_semantic_head import FusedSemanticHead +from .global_context_head import GlobalContextHead +from .grid_head import GridHead +from .htc_mask_head import HTCMaskHead +from .mask_point_head import MaskPointHead +from .maskiou_head import MaskIoUHead +from .scnet_mask_head import SCNetMaskHead +from .scnet_semantic_head import SCNetSemanticHead + +__all__ = [ + 'FCNMaskHead', 'HTCMaskHead', 'FusedSemanticHead', 'GridHead', + 'MaskIoUHead', 'CoarseMaskHead', 'MaskPointHead', 'SCNetMaskHead', + 'SCNetSemanticHead', 'GlobalContextHead', 'FeatureRelayHead', + 'DynamicMaskHead' +] diff --git a/mmdet/models/roi_heads/mask_heads/coarse_mask_head.py b/mmdet/models/roi_heads/mask_heads/coarse_mask_head.py new file mode 100644 index 0000000..946254c --- /dev/null +++ b/mmdet/models/roi_heads/mask_heads/coarse_mask_head.py @@ -0,0 +1,100 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmcv.cnn import ConvModule, Linear +from mmcv.runner import ModuleList, auto_fp16 + +from mmdet.models.builder import HEADS +from .fcn_mask_head import FCNMaskHead + + +@HEADS.register_module() +class CoarseMaskHead(FCNMaskHead): + """Coarse mask head used in PointRend. + + Compared with standard ``FCNMaskHead``, ``CoarseMaskHead`` will downsample + the input feature map instead of upsample it. + + Args: + num_convs (int): Number of conv layers in the head. Default: 0. + num_fcs (int): Number of fc layers in the head. Default: 2. + fc_out_channels (int): Number of output channels of fc layer. + Default: 1024. + downsample_factor (int): The factor that feature map is downsampled by. + Default: 2. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + num_convs=0, + num_fcs=2, + fc_out_channels=1024, + downsample_factor=2, + init_cfg=dict( + type='Xavier', + override=[ + dict(name='fcs'), + dict(type='Constant', val=0.001, name='fc_logits') + ]), + *arg, + **kwarg): + super(CoarseMaskHead, self).__init__( + *arg, + num_convs=num_convs, + upsample_cfg=dict(type=None), + init_cfg=None, + **kwarg) + self.init_cfg = init_cfg + self.num_fcs = num_fcs + assert self.num_fcs > 0 + self.fc_out_channels = fc_out_channels + self.downsample_factor = downsample_factor + assert self.downsample_factor >= 1 + # remove conv_logit + delattr(self, 'conv_logits') + + if downsample_factor > 1: + downsample_in_channels = ( + self.conv_out_channels + if self.num_convs > 0 else self.in_channels) + self.downsample_conv = ConvModule( + downsample_in_channels, + self.conv_out_channels, + kernel_size=downsample_factor, + stride=downsample_factor, + padding=0, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg) + else: + self.downsample_conv = None + + self.output_size = (self.roi_feat_size[0] // downsample_factor, + self.roi_feat_size[1] // downsample_factor) + self.output_area = self.output_size[0] * self.output_size[1] + + last_layer_dim = self.conv_out_channels * self.output_area + + self.fcs = ModuleList() + for i in range(num_fcs): + fc_in_channels = ( + last_layer_dim if i == 0 else self.fc_out_channels) + self.fcs.append(Linear(fc_in_channels, self.fc_out_channels)) + last_layer_dim = self.fc_out_channels + output_channels = self.num_classes * self.output_area + self.fc_logits = Linear(last_layer_dim, output_channels) + + def init_weights(self): + super(FCNMaskHead, self).init_weights() + + @auto_fp16() + def forward(self, x): + for conv in self.convs: + x = conv(x) + + if self.downsample_conv is not None: + x = self.downsample_conv(x) + + x = x.flatten(1) + for fc in self.fcs: + x = self.relu(fc(x)) + mask_pred = self.fc_logits(x).view( + x.size(0), self.num_classes, *self.output_size) + return mask_pred diff --git a/mmdet/models/roi_heads/mask_heads/dynamic_mask_head.py b/mmdet/models/roi_heads/mask_heads/dynamic_mask_head.py new file mode 100644 index 0000000..5bbe7ee --- /dev/null +++ b/mmdet/models/roi_heads/mask_heads/dynamic_mask_head.py @@ -0,0 +1,147 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.runner import auto_fp16, force_fp32 + +from mmdet.core import mask_target +from mmdet.models.builder import HEADS +from mmdet.models.dense_heads.atss_head import reduce_mean +from mmdet.models.utils import build_transformer +from .fcn_mask_head import FCNMaskHead + + +@HEADS.register_module() +class DynamicMaskHead(FCNMaskHead): + r"""Dynamic Mask Head for + `Instances as Queries `_ + + Args: + num_convs (int): Number of convolution layer. + Defaults to 4. + roi_feat_size (int): The output size of RoI extractor, + Defaults to 14. + in_channels (int): Input feature channels. + Defaults to 256. + conv_kernel_size (int): Kernel size of convolution layers. + Defaults to 3. + conv_out_channels (int): Output channels of convolution layers. + Defaults to 256. + num_classes (int): Number of classes. + Defaults to 80 + class_agnostic (int): Whether generate class agnostic prediction. + Defaults to False. + dropout (float): Probability of drop the channel. + Defaults to 0.0 + upsample_cfg (dict): The config for upsample layer. + conv_cfg (dict): The convolution layer config. + norm_cfg (dict): The norm layer config. + dynamic_conv_cfg (dict): The dynamic convolution layer config. + loss_mask (dict): The config for mask loss. + """ + + def __init__(self, + num_convs=4, + roi_feat_size=14, + in_channels=256, + conv_kernel_size=3, + conv_out_channels=256, + num_classes=80, + class_agnostic=False, + upsample_cfg=dict(type='deconv', scale_factor=2), + conv_cfg=None, + norm_cfg=None, + dynamic_conv_cfg=dict( + type='DynamicConv', + in_channels=256, + feat_channels=64, + out_channels=256, + input_feat_shape=14, + with_proj=False, + act_cfg=dict(type='ReLU', inplace=True), + norm_cfg=dict(type='LN')), + loss_mask=dict(type='DiceLoss', loss_weight=8.0), + **kwargs): + super(DynamicMaskHead, self).__init__( + num_convs=num_convs, + roi_feat_size=roi_feat_size, + in_channels=in_channels, + conv_kernel_size=conv_kernel_size, + conv_out_channels=conv_out_channels, + num_classes=num_classes, + class_agnostic=class_agnostic, + upsample_cfg=upsample_cfg, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + loss_mask=loss_mask, + **kwargs) + assert class_agnostic is False, \ + 'DynamicMaskHead only support class_agnostic=False' + self.fp16_enabled = False + + self.instance_interactive_conv = build_transformer(dynamic_conv_cfg) + + def init_weights(self): + """Use xavier initialization for all weight parameter and set + classification head bias as a specific value when use focal loss.""" + for p in self.parameters(): + if p.dim() > 1: + nn.init.xavier_uniform_(p) + nn.init.constant_(self.conv_logits.bias, 0.) + + @auto_fp16() + def forward(self, roi_feat, proposal_feat): + """Forward function of DynamicMaskHead. + + Args: + roi_feat (Tensor): Roi-pooling features with shape + (batch_size*num_proposals, feature_dimensions, + pooling_h , pooling_w). + proposal_feat (Tensor): Intermediate feature get from + diihead in last stage, has shape + (batch_size*num_proposals, feature_dimensions) + + Returns: + mask_pred (Tensor): Predicted foreground masks with shape + (batch_size*num_proposals, num_classes, + pooling_h*2, pooling_w*2). + """ + + proposal_feat = proposal_feat.reshape(-1, self.in_channels) + proposal_feat_iic = self.instance_interactive_conv( + proposal_feat, roi_feat) + + x = proposal_feat_iic.permute(0, 2, 1).reshape(roi_feat.size()) + + for conv in self.convs: + x = conv(x) + if self.upsample is not None: + x = self.upsample(x) + if self.upsample_method == 'deconv': + x = self.relu(x) + mask_pred = self.conv_logits(x) + return mask_pred + + @force_fp32(apply_to=('mask_pred', )) + def loss(self, mask_pred, mask_targets, labels): + num_pos = labels.new_ones(labels.size()).float().sum() + avg_factor = torch.clamp(reduce_mean(num_pos), min=1.).item() + loss = dict() + if mask_pred.size(0) == 0: + loss_mask = mask_pred.sum() + else: + loss_mask = self.loss_mask( + mask_pred[torch.arange(num_pos).long(), labels, ...].sigmoid(), + mask_targets, + avg_factor=avg_factor) + loss['loss_mask'] = loss_mask + return loss + + def get_targets(self, sampling_results, gt_masks, rcnn_train_cfg): + + pos_proposals = [res.pos_bboxes for res in sampling_results] + pos_assigned_gt_inds = [ + res.pos_assigned_gt_inds for res in sampling_results + ] + mask_targets = mask_target(pos_proposals, pos_assigned_gt_inds, + gt_masks, rcnn_train_cfg) + return mask_targets diff --git a/mmdet/models/roi_heads/mask_heads/fcn_mask_head.py b/mmdet/models/roi_heads/mask_heads/fcn_mask_head.py new file mode 100644 index 0000000..355d882 --- /dev/null +++ b/mmdet/models/roi_heads/mask_heads/fcn_mask_head.py @@ -0,0 +1,412 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from warnings import warn + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule, build_conv_layer, build_upsample_layer +from mmcv.ops.carafe import CARAFEPack +from mmcv.runner import BaseModule, ModuleList, auto_fp16, force_fp32 +from torch.nn.modules.utils import _pair + +from mmdet.core import mask_target +from mmdet.models.builder import HEADS, build_loss + +BYTES_PER_FLOAT = 4 +# TODO: This memory limit may be too much or too little. It would be better to +# determine it based on available resources. +GPU_MEM_LIMIT = 1024**3 # 1 GB memory limit + + +@HEADS.register_module() +class FCNMaskHead(BaseModule): + + def __init__(self, + num_convs=4, + roi_feat_size=14, + in_channels=256, + conv_kernel_size=3, + conv_out_channels=256, + num_classes=80, + class_agnostic=False, + upsample_cfg=dict(type='deconv', scale_factor=2), + conv_cfg=None, + norm_cfg=None, + predictor_cfg=dict(type='Conv'), + loss_mask=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0), + init_cfg=None): + assert init_cfg is None, 'To prevent abnormal initialization ' \ + 'behavior, init_cfg is not allowed to be set' + super(FCNMaskHead, self).__init__(init_cfg) + self.upsample_cfg = upsample_cfg.copy() + if self.upsample_cfg['type'] not in [ + None, 'deconv', 'nearest', 'bilinear', 'carafe' + ]: + raise ValueError( + f'Invalid upsample method {self.upsample_cfg["type"]}, ' + 'accepted methods are "deconv", "nearest", "bilinear", ' + '"carafe"') + self.num_convs = num_convs + # WARN: roi_feat_size is reserved and not used + self.roi_feat_size = _pair(roi_feat_size) + self.in_channels = in_channels + self.conv_kernel_size = conv_kernel_size + self.conv_out_channels = conv_out_channels + self.upsample_method = self.upsample_cfg.get('type') + self.scale_factor = self.upsample_cfg.pop('scale_factor', None) + self.num_classes = num_classes + self.class_agnostic = class_agnostic + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.predictor_cfg = predictor_cfg + self.fp16_enabled = False + self.loss_mask = build_loss(loss_mask) + + self.convs = ModuleList() + for i in range(self.num_convs): + in_channels = ( + self.in_channels if i == 0 else self.conv_out_channels) + padding = (self.conv_kernel_size - 1) // 2 + self.convs.append( + ConvModule( + in_channels, + self.conv_out_channels, + self.conv_kernel_size, + padding=padding, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg)) + upsample_in_channels = ( + self.conv_out_channels if self.num_convs > 0 else in_channels) + upsample_cfg_ = self.upsample_cfg.copy() + if self.upsample_method is None: + self.upsample = None + elif self.upsample_method == 'deconv': + upsample_cfg_.update( + in_channels=upsample_in_channels, + out_channels=self.conv_out_channels, + kernel_size=self.scale_factor, + stride=self.scale_factor) + self.upsample = build_upsample_layer(upsample_cfg_) + elif self.upsample_method == 'carafe': + upsample_cfg_.update( + channels=upsample_in_channels, scale_factor=self.scale_factor) + self.upsample = build_upsample_layer(upsample_cfg_) + else: + # suppress warnings + align_corners = (None + if self.upsample_method == 'nearest' else False) + upsample_cfg_.update( + scale_factor=self.scale_factor, + mode=self.upsample_method, + align_corners=align_corners) + self.upsample = build_upsample_layer(upsample_cfg_) + + out_channels = 1 if self.class_agnostic else self.num_classes + logits_in_channel = ( + self.conv_out_channels + if self.upsample_method == 'deconv' else upsample_in_channels) + self.conv_logits = build_conv_layer(self.predictor_cfg, + logits_in_channel, out_channels, 1) + self.relu = nn.ReLU(inplace=True) + self.debug_imgs = None + + def init_weights(self): + super(FCNMaskHead, self).init_weights() + for m in [self.upsample, self.conv_logits]: + if m is None: + continue + elif isinstance(m, CARAFEPack): + m.init_weights() + elif hasattr(m, 'weight') and hasattr(m, 'bias'): + nn.init.kaiming_normal_( + m.weight, mode='fan_out', nonlinearity='relu') + nn.init.constant_(m.bias, 0) + + @auto_fp16() + def forward(self, x): + for conv in self.convs: + x = conv(x) + if self.upsample is not None: + x = self.upsample(x) + if self.upsample_method == 'deconv': + x = self.relu(x) + mask_pred = self.conv_logits(x) + return mask_pred + + def get_targets(self, sampling_results, gt_masks, rcnn_train_cfg): + pos_proposals = [res.pos_bboxes for res in sampling_results] + pos_assigned_gt_inds = [ + res.pos_assigned_gt_inds for res in sampling_results + ] + mask_targets = mask_target(pos_proposals, pos_assigned_gt_inds, + gt_masks, rcnn_train_cfg) + return mask_targets + + @force_fp32(apply_to=('mask_pred', )) + def loss(self, mask_pred, mask_targets, labels): + """ + Example: + >>> from mmdet.models.roi_heads.mask_heads.fcn_mask_head import * # NOQA + >>> N = 7 # N = number of extracted ROIs + >>> C, H, W = 11, 32, 32 + >>> # Create example instance of FCN Mask Head. + >>> # There are lots of variations depending on the configuration + >>> self = FCNMaskHead(num_classes=C, num_convs=1) + >>> inputs = torch.rand(N, self.in_channels, H, W) + >>> mask_pred = self.forward(inputs) + >>> sf = self.scale_factor + >>> labels = torch.randint(0, C, size=(N,)) + >>> # With the default properties the mask targets should indicate + >>> # a (potentially soft) single-class label + >>> mask_targets = torch.rand(N, H * sf, W * sf) + >>> loss = self.loss(mask_pred, mask_targets, labels) + >>> print('loss = {!r}'.format(loss)) + """ + loss = dict() + if mask_pred.size(0) == 0: + loss_mask = mask_pred.sum() + else: + if self.class_agnostic: + loss_mask = self.loss_mask(mask_pred, mask_targets, + torch.zeros_like(labels)) + else: + loss_mask = self.loss_mask(mask_pred, mask_targets, labels) + loss['loss_mask'] = loss_mask + return loss + + def get_seg_masks(self, mask_pred, det_bboxes, det_labels, rcnn_test_cfg, + ori_shape, scale_factor, rescale): + """Get segmentation masks from mask_pred and bboxes. + + Args: + mask_pred (Tensor or ndarray): shape (n, #class, h, w). + For single-scale testing, mask_pred is the direct output of + model, whose type is Tensor, while for multi-scale testing, + it will be converted to numpy array outside of this method. + det_bboxes (Tensor): shape (n, 4/5) + det_labels (Tensor): shape (n, ) + rcnn_test_cfg (dict): rcnn testing config + ori_shape (Tuple): original image height and width, shape (2,) + scale_factor(ndarray | Tensor): If ``rescale is True``, box + coordinates are divided by this scale factor to fit + ``ori_shape``. + rescale (bool): If True, the resulting masks will be rescaled to + ``ori_shape``. + + Returns: + list[list]: encoded masks. The c-th item in the outer list + corresponds to the c-th class. Given the c-th outer list, the + i-th item in that inner list is the mask for the i-th box with + class label c. + + Example: + >>> import mmcv + >>> from mmdet.models.roi_heads.mask_heads.fcn_mask_head import * # NOQA + >>> N = 7 # N = number of extracted ROIs + >>> C, H, W = 11, 32, 32 + >>> # Create example instance of FCN Mask Head. + >>> self = FCNMaskHead(num_classes=C, num_convs=0) + >>> inputs = torch.rand(N, self.in_channels, H, W) + >>> mask_pred = self.forward(inputs) + >>> # Each input is associated with some bounding box + >>> det_bboxes = torch.Tensor([[1, 1, 42, 42 ]] * N) + >>> det_labels = torch.randint(0, C, size=(N,)) + >>> rcnn_test_cfg = mmcv.Config({'mask_thr_binary': 0, }) + >>> ori_shape = (H * 4, W * 4) + >>> scale_factor = torch.FloatTensor((1, 1)) + >>> rescale = False + >>> # Encoded masks are a list for each category. + >>> encoded_masks = self.get_seg_masks( + >>> mask_pred, det_bboxes, det_labels, rcnn_test_cfg, ori_shape, + >>> scale_factor, rescale + >>> ) + >>> assert len(encoded_masks) == C + >>> assert sum(list(map(len, encoded_masks))) == N + """ + if isinstance(mask_pred, torch.Tensor): + mask_pred = mask_pred.sigmoid() + else: + # In AugTest, has been activated before + mask_pred = det_bboxes.new_tensor(mask_pred) + + device = mask_pred.device + cls_segms = [[] for _ in range(self.num_classes) + ] # BG is not included in num_classes + bboxes = det_bboxes[:, :4] + labels = det_labels + + # In most cases, scale_factor should have been + # converted to Tensor when rescale the bbox + if not isinstance(scale_factor, torch.Tensor): + if isinstance(scale_factor, float): + scale_factor = np.array([scale_factor] * 4) + warn('Scale_factor should be a Tensor or ndarray ' + 'with shape (4,), float would be deprecated. ') + assert isinstance(scale_factor, np.ndarray) + scale_factor = torch.Tensor(scale_factor) + + if rescale: + img_h, img_w = ori_shape[:2] + bboxes = bboxes / scale_factor.to(bboxes) + else: + w_scale, h_scale = scale_factor[0], scale_factor[1] + img_h = np.round(ori_shape[0] * h_scale.item()).astype(np.int32) + img_w = np.round(ori_shape[1] * w_scale.item()).astype(np.int32) + + N = len(mask_pred) + # The actual implementation split the input into chunks, + # and paste them chunk by chunk. + if device.type == 'cpu': + # CPU is most efficient when they are pasted one by one with + # skip_empty=True, so that it performs minimal number of + # operations. + num_chunks = N + else: + # GPU benefits from parallelism for larger chunks, + # but may have memory issue + # the types of img_w and img_h are np.int32, + # when the image resolution is large, + # the calculation of num_chunks will overflow. + # so we need to change the types of img_w and img_h to int. + # See https://github.com/open-mmlab/mmdetection/pull/5191 + num_chunks = int( + np.ceil(N * int(img_h) * int(img_w) * BYTES_PER_FLOAT / + GPU_MEM_LIMIT)) + assert (num_chunks <= + N), 'Default GPU_MEM_LIMIT is too small; try increasing it' + chunks = torch.chunk(torch.arange(N, device=device), num_chunks) + + threshold = rcnn_test_cfg.mask_thr_binary + im_mask = torch.zeros( + N, + img_h, + img_w, + device=device, + dtype=torch.bool if threshold >= 0 else torch.uint8) + + if not self.class_agnostic: + mask_pred = mask_pred[range(N), labels][:, None] + + for inds in chunks: + masks_chunk, spatial_inds = _do_paste_mask( + mask_pred[inds], + bboxes[inds], + img_h, + img_w, + skip_empty=device.type == 'cpu') + + if threshold >= 0: + masks_chunk = (masks_chunk >= threshold).to(dtype=torch.bool) + else: + # for visualization and debugging + masks_chunk = (masks_chunk * 255).to(dtype=torch.uint8) + + im_mask[(inds, ) + spatial_inds] = masks_chunk + + for i in range(N): + cls_segms[labels[i]].append(im_mask[i].detach().cpu().numpy()) + return cls_segms + + def onnx_export(self, mask_pred, det_bboxes, det_labels, rcnn_test_cfg, + ori_shape, **kwargs): + """Get segmentation masks from mask_pred and bboxes. + + Args: + mask_pred (Tensor): shape (n, #class, h, w). + det_bboxes (Tensor): shape (n, 4/5) + det_labels (Tensor): shape (n, ) + rcnn_test_cfg (dict): rcnn testing config + ori_shape (Tuple): original image height and width, shape (2,) + + Returns: + Tensor: a mask of shape (N, img_h, img_w). + """ + + mask_pred = mask_pred.sigmoid() + bboxes = det_bboxes[:, :4] + labels = det_labels + # No need to consider rescale and scale_factor while exporting to ONNX + img_h, img_w = ori_shape[:2] + threshold = rcnn_test_cfg.mask_thr_binary + if not self.class_agnostic: + box_inds = torch.arange(mask_pred.shape[0]) + mask_pred = mask_pred[box_inds, labels][:, None] + masks, _ = _do_paste_mask( + mask_pred, bboxes, img_h, img_w, skip_empty=False) + if threshold >= 0: + # should convert to float to avoid problems in TRT + masks = (masks >= threshold).to(dtype=torch.float) + return masks + + +def _do_paste_mask(masks, boxes, img_h, img_w, skip_empty=True): + """Paste instance masks according to boxes. + + This implementation is modified from + https://github.com/facebookresearch/detectron2/ + + Args: + masks (Tensor): N, 1, H, W + boxes (Tensor): N, 4 + img_h (int): Height of the image to be pasted. + img_w (int): Width of the image to be pasted. + skip_empty (bool): Only paste masks within the region that + tightly bound all boxes, and returns the results this region only. + An important optimization for CPU. + + Returns: + tuple: (Tensor, tuple). The first item is mask tensor, the second one + is the slice object. + If skip_empty == False, the whole image will be pasted. It will + return a mask of shape (N, img_h, img_w) and an empty tuple. + If skip_empty == True, only area around the mask will be pasted. + A mask of shape (N, h', w') and its start and end coordinates + in the original image will be returned. + """ + # On GPU, paste all masks together (up to chunk size) + # by using the entire image to sample the masks + # Compared to pasting them one by one, + # this has more operations but is faster on COCO-scale dataset. + device = masks.device + if skip_empty: + x0_int, y0_int = torch.clamp( + boxes.min(dim=0).values.floor()[:2] - 1, + min=0).to(dtype=torch.int32) + x1_int = torch.clamp( + boxes[:, 2].max().ceil() + 1, max=img_w).to(dtype=torch.int32) + y1_int = torch.clamp( + boxes[:, 3].max().ceil() + 1, max=img_h).to(dtype=torch.int32) + else: + x0_int, y0_int = 0, 0 + x1_int, y1_int = img_w, img_h + x0, y0, x1, y1 = torch.split(boxes, 1, dim=1) # each is Nx1 + + N = masks.shape[0] + + img_y = torch.arange(y0_int, y1_int, device=device).to(torch.float32) + 0.5 + img_x = torch.arange(x0_int, x1_int, device=device).to(torch.float32) + 0.5 + img_y = (img_y - y0) / (y1 - y0) * 2 - 1 + img_x = (img_x - x0) / (x1 - x0) * 2 - 1 + # img_x, img_y have shapes (N, w), (N, h) + # IsInf op is not supported with ONNX<=1.7.0 + if not torch.onnx.is_in_onnx_export(): + if torch.isinf(img_x).any(): + inds = torch.where(torch.isinf(img_x)) + img_x[inds] = 0 + if torch.isinf(img_y).any(): + inds = torch.where(torch.isinf(img_y)) + img_y[inds] = 0 + + gx = img_x[:, None, :].expand(N, img_y.size(1), img_x.size(1)) + gy = img_y[:, :, None].expand(N, img_y.size(1), img_x.size(1)) + grid = torch.stack([gx, gy], dim=3) + + img_masks = F.grid_sample( + masks.to(dtype=torch.float32), grid, align_corners=False) + + if skip_empty: + return img_masks[:, 0], (slice(y0_int, y1_int), slice(x0_int, x1_int)) + else: + return img_masks[:, 0], () diff --git a/mmdet/models/roi_heads/mask_heads/feature_relay_head.py b/mmdet/models/roi_heads/mask_heads/feature_relay_head.py new file mode 100644 index 0000000..452f37a --- /dev/null +++ b/mmdet/models/roi_heads/mask_heads/feature_relay_head.py @@ -0,0 +1,53 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +from mmcv.runner import BaseModule, auto_fp16 + +from mmdet.models.builder import HEADS + + +@HEADS.register_module() +class FeatureRelayHead(BaseModule): + """Feature Relay Head used in `SCNet `_. + + Args: + in_channels (int, optional): number of input channels. Default: 256. + conv_out_channels (int, optional): number of output channels before + classification layer. Default: 256. + roi_feat_size (int, optional): roi feat size at box head. Default: 7. + scale_factor (int, optional): scale factor to match roi feat size + at mask head. Default: 2. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + in_channels=1024, + out_conv_channels=256, + roi_feat_size=7, + scale_factor=2, + init_cfg=dict(type='Kaiming', layer='Linear')): + super(FeatureRelayHead, self).__init__(init_cfg) + assert isinstance(roi_feat_size, int) + + self.in_channels = in_channels + self.out_conv_channels = out_conv_channels + self.roi_feat_size = roi_feat_size + self.out_channels = (roi_feat_size**2) * out_conv_channels + self.scale_factor = scale_factor + self.fp16_enabled = False + + self.fc = nn.Linear(self.in_channels, self.out_channels) + self.upsample = nn.Upsample( + scale_factor=scale_factor, mode='bilinear', align_corners=True) + + @auto_fp16() + def forward(self, x): + """Forward function.""" + N, in_C = x.shape + if N > 0: + out_C = self.out_conv_channels + out_HW = self.roi_feat_size + x = self.fc(x) + x = x.reshape(N, out_C, out_HW, out_HW) + x = self.upsample(x) + return x + return None diff --git a/mmdet/models/roi_heads/mask_heads/fused_semantic_head.py b/mmdet/models/roi_heads/mask_heads/fused_semantic_head.py new file mode 100644 index 0000000..c6eaa54 --- /dev/null +++ b/mmdet/models/roi_heads/mask_heads/fused_semantic_head.py @@ -0,0 +1,118 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule +from mmcv.runner import BaseModule, auto_fp16, force_fp32 + +from mmdet.models.builder import HEADS, build_loss + + +@HEADS.register_module() +class FusedSemanticHead(BaseModule): + r"""Multi-level fused semantic segmentation head. + + .. code-block:: none + + in_1 -> 1x1 conv --- + | + in_2 -> 1x1 conv -- | + || + in_3 -> 1x1 conv - || + ||| /-> 1x1 conv (mask prediction) + in_4 -> 1x1 conv -----> 3x3 convs (*4) + | \-> 1x1 conv (feature) + in_5 -> 1x1 conv --- + """ # noqa: W605 + + def __init__(self, + num_ins, + fusion_level, + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=183, + conv_cfg=None, + norm_cfg=None, + ignore_label=None, + loss_weight=None, + loss_seg=dict( + type='CrossEntropyLoss', + ignore_index=255, + loss_weight=0.2), + init_cfg=dict( + type='Kaiming', override=dict(name='conv_logits'))): + super(FusedSemanticHead, self).__init__(init_cfg) + self.num_ins = num_ins + self.fusion_level = fusion_level + self.num_convs = num_convs + self.in_channels = in_channels + self.conv_out_channels = conv_out_channels + self.num_classes = num_classes + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.fp16_enabled = False + + self.lateral_convs = nn.ModuleList() + for i in range(self.num_ins): + self.lateral_convs.append( + ConvModule( + self.in_channels, + self.in_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + inplace=False)) + + self.convs = nn.ModuleList() + for i in range(self.num_convs): + in_channels = self.in_channels if i == 0 else conv_out_channels + self.convs.append( + ConvModule( + in_channels, + conv_out_channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg)) + self.conv_embedding = ConvModule( + conv_out_channels, + conv_out_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg) + self.conv_logits = nn.Conv2d(conv_out_channels, self.num_classes, 1) + if ignore_label: + loss_seg['ignore_index'] = ignore_label + if loss_weight: + loss_seg['loss_weight'] = loss_weight + if ignore_label or loss_weight: + warnings.warn('``ignore_label`` and ``loss_weight`` would be ' + 'deprecated soon. Please set ``ingore_index`` and ' + '``loss_weight`` in ``loss_seg`` instead.') + self.criterion = build_loss(loss_seg) + + @auto_fp16() + def forward(self, feats): + x = self.lateral_convs[self.fusion_level](feats[self.fusion_level]) + fused_size = tuple(x.shape[-2:]) + for i, feat in enumerate(feats): + if i != self.fusion_level: + feat = F.interpolate( + feat, size=fused_size, mode='bilinear', align_corners=True) + # fix runtime error of "+=" inplace operation in PyTorch 1.10 + x = x + self.lateral_convs[i](feat) + + for i in range(self.num_convs): + x = self.convs[i](x) + + mask_pred = self.conv_logits(x) + x = self.conv_embedding(x) + return mask_pred, x + + @force_fp32(apply_to=('mask_pred', )) + def loss(self, mask_pred, labels): + labels = labels.squeeze(1).long() + loss_semantic_seg = self.criterion(mask_pred, labels) + return loss_semantic_seg diff --git a/mmdet/models/roi_heads/mask_heads/global_context_head.py b/mmdet/models/roi_heads/mask_heads/global_context_head.py new file mode 100644 index 0000000..af76a17 --- /dev/null +++ b/mmdet/models/roi_heads/mask_heads/global_context_head.py @@ -0,0 +1,101 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +from mmcv.cnn import ConvModule +from mmcv.runner import BaseModule, auto_fp16, force_fp32 + +from mmdet.models.builder import HEADS +from mmdet.models.utils import ResLayer, SimplifiedBasicBlock + + +@HEADS.register_module() +class GlobalContextHead(BaseModule): + """Global context head used in `SCNet `_. + + Args: + num_convs (int, optional): number of convolutional layer in GlbCtxHead. + Default: 4. + in_channels (int, optional): number of input channels. Default: 256. + conv_out_channels (int, optional): number of output channels before + classification layer. Default: 256. + num_classes (int, optional): number of classes. Default: 80. + loss_weight (float, optional): global context loss weight. Default: 1. + conv_cfg (dict, optional): config to init conv layer. Default: None. + norm_cfg (dict, optional): config to init norm layer. Default: None. + conv_to_res (bool, optional): if True, 2 convs will be grouped into + 1 `SimplifiedBasicBlock` using a skip connection. Default: False. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + num_convs=4, + in_channels=256, + conv_out_channels=256, + num_classes=80, + loss_weight=1.0, + conv_cfg=None, + norm_cfg=None, + conv_to_res=False, + init_cfg=dict( + type='Normal', std=0.01, override=dict(name='fc'))): + super(GlobalContextHead, self).__init__(init_cfg) + self.num_convs = num_convs + self.in_channels = in_channels + self.conv_out_channels = conv_out_channels + self.num_classes = num_classes + self.loss_weight = loss_weight + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.conv_to_res = conv_to_res + self.fp16_enabled = False + + if self.conv_to_res: + num_res_blocks = num_convs // 2 + self.convs = ResLayer( + SimplifiedBasicBlock, + in_channels, + self.conv_out_channels, + num_res_blocks, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg) + self.num_convs = num_res_blocks + else: + self.convs = nn.ModuleList() + for i in range(self.num_convs): + in_channels = self.in_channels if i == 0 else conv_out_channels + self.convs.append( + ConvModule( + in_channels, + conv_out_channels, + 3, + padding=1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg)) + + self.pool = nn.AdaptiveAvgPool2d(1) + self.fc = nn.Linear(conv_out_channels, num_classes) + + self.criterion = nn.BCEWithLogitsLoss() + + @auto_fp16() + def forward(self, feats): + """Forward function.""" + x = feats[-1] + for i in range(self.num_convs): + x = self.convs[i](x) + x = self.pool(x) + + # multi-class prediction + mc_pred = x.reshape(x.size(0), -1) + mc_pred = self.fc(mc_pred) + + return mc_pred, x + + @force_fp32(apply_to=('pred', )) + def loss(self, pred, labels): + """Loss function.""" + labels = [lbl.unique() for lbl in labels] + targets = pred.new_zeros(pred.size()) + for i, label in enumerate(labels): + targets[i, label] = 1.0 + loss = self.loss_weight * self.criterion(pred, targets) + return loss diff --git a/mmdet/models/roi_heads/mask_heads/grid_head.py b/mmdet/models/roi_heads/mask_heads/grid_head.py new file mode 100644 index 0000000..0c0702d --- /dev/null +++ b/mmdet/models/roi_heads/mask_heads/grid_head.py @@ -0,0 +1,363 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import ConvModule +from mmcv.runner import BaseModule + +from mmdet.models.builder import HEADS, build_loss + + +@HEADS.register_module() +class GridHead(BaseModule): + + def __init__(self, + grid_points=9, + num_convs=8, + roi_feat_size=14, + in_channels=256, + conv_kernel_size=3, + point_feat_channels=64, + deconv_kernel_size=4, + class_agnostic=False, + loss_grid=dict( + type='CrossEntropyLoss', use_sigmoid=True, + loss_weight=15), + conv_cfg=None, + norm_cfg=dict(type='GN', num_groups=36), + init_cfg=[ + dict(type='Kaiming', layer=['Conv2d', 'Linear']), + dict( + type='Normal', + layer='ConvTranspose2d', + std=0.001, + override=dict( + type='Normal', + name='deconv2', + std=0.001, + bias=-np.log(0.99 / 0.01))) + ]): + super(GridHead, self).__init__(init_cfg) + self.grid_points = grid_points + self.num_convs = num_convs + self.roi_feat_size = roi_feat_size + self.in_channels = in_channels + self.conv_kernel_size = conv_kernel_size + self.point_feat_channels = point_feat_channels + self.conv_out_channels = self.point_feat_channels * self.grid_points + self.class_agnostic = class_agnostic + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + if isinstance(norm_cfg, dict) and norm_cfg['type'] == 'GN': + assert self.conv_out_channels % norm_cfg['num_groups'] == 0 + + assert self.grid_points >= 4 + self.grid_size = int(np.sqrt(self.grid_points)) + if self.grid_size * self.grid_size != self.grid_points: + raise ValueError('grid_points must be a square number') + + # the predicted heatmap is half of whole_map_size + if not isinstance(self.roi_feat_size, int): + raise ValueError('Only square RoIs are supporeted in Grid R-CNN') + self.whole_map_size = self.roi_feat_size * 4 + + # compute point-wise sub-regions + self.sub_regions = self.calc_sub_regions() + + self.convs = [] + for i in range(self.num_convs): + in_channels = ( + self.in_channels if i == 0 else self.conv_out_channels) + stride = 2 if i == 0 else 1 + padding = (self.conv_kernel_size - 1) // 2 + self.convs.append( + ConvModule( + in_channels, + self.conv_out_channels, + self.conv_kernel_size, + stride=stride, + padding=padding, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg, + bias=True)) + self.convs = nn.Sequential(*self.convs) + + self.deconv1 = nn.ConvTranspose2d( + self.conv_out_channels, + self.conv_out_channels, + kernel_size=deconv_kernel_size, + stride=2, + padding=(deconv_kernel_size - 2) // 2, + groups=grid_points) + self.norm1 = nn.GroupNorm(grid_points, self.conv_out_channels) + self.deconv2 = nn.ConvTranspose2d( + self.conv_out_channels, + grid_points, + kernel_size=deconv_kernel_size, + stride=2, + padding=(deconv_kernel_size - 2) // 2, + groups=grid_points) + + # find the 4-neighbor of each grid point + self.neighbor_points = [] + grid_size = self.grid_size + for i in range(grid_size): # i-th column + for j in range(grid_size): # j-th row + neighbors = [] + if i > 0: # left: (i - 1, j) + neighbors.append((i - 1) * grid_size + j) + if j > 0: # up: (i, j - 1) + neighbors.append(i * grid_size + j - 1) + if j < grid_size - 1: # down: (i, j + 1) + neighbors.append(i * grid_size + j + 1) + if i < grid_size - 1: # right: (i + 1, j) + neighbors.append((i + 1) * grid_size + j) + self.neighbor_points.append(tuple(neighbors)) + # total edges in the grid + self.num_edges = sum([len(p) for p in self.neighbor_points]) + + self.forder_trans = nn.ModuleList() # first-order feature transition + self.sorder_trans = nn.ModuleList() # second-order feature transition + for neighbors in self.neighbor_points: + fo_trans = nn.ModuleList() + so_trans = nn.ModuleList() + for _ in range(len(neighbors)): + # each transition module consists of a 5x5 depth-wise conv and + # 1x1 conv. + fo_trans.append( + nn.Sequential( + nn.Conv2d( + self.point_feat_channels, + self.point_feat_channels, + 5, + stride=1, + padding=2, + groups=self.point_feat_channels), + nn.Conv2d(self.point_feat_channels, + self.point_feat_channels, 1))) + so_trans.append( + nn.Sequential( + nn.Conv2d( + self.point_feat_channels, + self.point_feat_channels, + 5, + 1, + 2, + groups=self.point_feat_channels), + nn.Conv2d(self.point_feat_channels, + self.point_feat_channels, 1))) + self.forder_trans.append(fo_trans) + self.sorder_trans.append(so_trans) + + self.loss_grid = build_loss(loss_grid) + + def forward(self, x): + assert x.shape[-1] == x.shape[-2] == self.roi_feat_size + # RoI feature transformation, downsample 2x + x = self.convs(x) + + c = self.point_feat_channels + # first-order fusion + x_fo = [None for _ in range(self.grid_points)] + for i, points in enumerate(self.neighbor_points): + x_fo[i] = x[:, i * c:(i + 1) * c] + for j, point_idx in enumerate(points): + x_fo[i] = x_fo[i] + self.forder_trans[i][j]( + x[:, point_idx * c:(point_idx + 1) * c]) + + # second-order fusion + x_so = [None for _ in range(self.grid_points)] + for i, points in enumerate(self.neighbor_points): + x_so[i] = x[:, i * c:(i + 1) * c] + for j, point_idx in enumerate(points): + x_so[i] = x_so[i] + self.sorder_trans[i][j](x_fo[point_idx]) + + # predicted heatmap with fused features + x2 = torch.cat(x_so, dim=1) + x2 = self.deconv1(x2) + x2 = F.relu(self.norm1(x2), inplace=True) + heatmap = self.deconv2(x2) + + # predicted heatmap with original features (applicable during training) + if self.training: + x1 = x + x1 = self.deconv1(x1) + x1 = F.relu(self.norm1(x1), inplace=True) + heatmap_unfused = self.deconv2(x1) + else: + heatmap_unfused = heatmap + + return dict(fused=heatmap, unfused=heatmap_unfused) + + def calc_sub_regions(self): + """Compute point specific representation regions. + + See Grid R-CNN Plus (https://arxiv.org/abs/1906.05688) for details. + """ + # to make it consistent with the original implementation, half_size + # is computed as 2 * quarter_size, which is smaller + half_size = self.whole_map_size // 4 * 2 + sub_regions = [] + for i in range(self.grid_points): + x_idx = i // self.grid_size + y_idx = i % self.grid_size + if x_idx == 0: + sub_x1 = 0 + elif x_idx == self.grid_size - 1: + sub_x1 = half_size + else: + ratio = x_idx / (self.grid_size - 1) - 0.25 + sub_x1 = max(int(ratio * self.whole_map_size), 0) + + if y_idx == 0: + sub_y1 = 0 + elif y_idx == self.grid_size - 1: + sub_y1 = half_size + else: + ratio = y_idx / (self.grid_size - 1) - 0.25 + sub_y1 = max(int(ratio * self.whole_map_size), 0) + sub_regions.append( + (sub_x1, sub_y1, sub_x1 + half_size, sub_y1 + half_size)) + return sub_regions + + def get_targets(self, sampling_results, rcnn_train_cfg): + # mix all samples (across images) together. + pos_bboxes = torch.cat([res.pos_bboxes for res in sampling_results], + dim=0).cpu() + pos_gt_bboxes = torch.cat( + [res.pos_gt_bboxes for res in sampling_results], dim=0).cpu() + assert pos_bboxes.shape == pos_gt_bboxes.shape + + # expand pos_bboxes to 2x of original size + x1 = pos_bboxes[:, 0] - (pos_bboxes[:, 2] - pos_bboxes[:, 0]) / 2 + y1 = pos_bboxes[:, 1] - (pos_bboxes[:, 3] - pos_bboxes[:, 1]) / 2 + x2 = pos_bboxes[:, 2] + (pos_bboxes[:, 2] - pos_bboxes[:, 0]) / 2 + y2 = pos_bboxes[:, 3] + (pos_bboxes[:, 3] - pos_bboxes[:, 1]) / 2 + pos_bboxes = torch.stack([x1, y1, x2, y2], dim=-1) + pos_bbox_ws = (pos_bboxes[:, 2] - pos_bboxes[:, 0]).unsqueeze(-1) + pos_bbox_hs = (pos_bboxes[:, 3] - pos_bboxes[:, 1]).unsqueeze(-1) + + num_rois = pos_bboxes.shape[0] + map_size = self.whole_map_size + # this is not the final target shape + targets = torch.zeros((num_rois, self.grid_points, map_size, map_size), + dtype=torch.float) + + # pre-compute interpolation factors for all grid points. + # the first item is the factor of x-dim, and the second is y-dim. + # for a 9-point grid, factors are like (1, 0), (0.5, 0.5), (0, 1) + factors = [] + for j in range(self.grid_points): + x_idx = j // self.grid_size + y_idx = j % self.grid_size + factors.append((1 - x_idx / (self.grid_size - 1), + 1 - y_idx / (self.grid_size - 1))) + + radius = rcnn_train_cfg.pos_radius + radius2 = radius**2 + for i in range(num_rois): + # ignore small bboxes + if (pos_bbox_ws[i] <= self.grid_size + or pos_bbox_hs[i] <= self.grid_size): + continue + # for each grid point, mark a small circle as positive + for j in range(self.grid_points): + factor_x, factor_y = factors[j] + gridpoint_x = factor_x * pos_gt_bboxes[i, 0] + ( + 1 - factor_x) * pos_gt_bboxes[i, 2] + gridpoint_y = factor_y * pos_gt_bboxes[i, 1] + ( + 1 - factor_y) * pos_gt_bboxes[i, 3] + + cx = int((gridpoint_x - pos_bboxes[i, 0]) / pos_bbox_ws[i] * + map_size) + cy = int((gridpoint_y - pos_bboxes[i, 1]) / pos_bbox_hs[i] * + map_size) + + for x in range(cx - radius, cx + radius + 1): + for y in range(cy - radius, cy + radius + 1): + if x >= 0 and x < map_size and y >= 0 and y < map_size: + if (x - cx)**2 + (y - cy)**2 <= radius2: + targets[i, j, y, x] = 1 + # reduce the target heatmap size by a half + # proposed in Grid R-CNN Plus (https://arxiv.org/abs/1906.05688). + sub_targets = [] + for i in range(self.grid_points): + sub_x1, sub_y1, sub_x2, sub_y2 = self.sub_regions[i] + sub_targets.append(targets[:, [i], sub_y1:sub_y2, sub_x1:sub_x2]) + sub_targets = torch.cat(sub_targets, dim=1) + sub_targets = sub_targets.to(sampling_results[0].pos_bboxes.device) + return sub_targets + + def loss(self, grid_pred, grid_targets): + loss_fused = self.loss_grid(grid_pred['fused'], grid_targets) + loss_unfused = self.loss_grid(grid_pred['unfused'], grid_targets) + loss_grid = loss_fused + loss_unfused + return dict(loss_grid=loss_grid) + + def get_bboxes(self, det_bboxes, grid_pred, img_metas): + # TODO: refactoring + assert det_bboxes.shape[0] == grid_pred.shape[0] + det_bboxes = det_bboxes.cpu() + cls_scores = det_bboxes[:, [4]] + det_bboxes = det_bboxes[:, :4] + grid_pred = grid_pred.sigmoid().cpu() + + R, c, h, w = grid_pred.shape + half_size = self.whole_map_size // 4 * 2 + assert h == w == half_size + assert c == self.grid_points + + # find the point with max scores in the half-sized heatmap + grid_pred = grid_pred.view(R * c, h * w) + pred_scores, pred_position = grid_pred.max(dim=1) + xs = pred_position % w + ys = pred_position // w + + # get the position in the whole heatmap instead of half-sized heatmap + for i in range(self.grid_points): + xs[i::self.grid_points] += self.sub_regions[i][0] + ys[i::self.grid_points] += self.sub_regions[i][1] + + # reshape to (num_rois, grid_points) + pred_scores, xs, ys = tuple( + map(lambda x: x.view(R, c), [pred_scores, xs, ys])) + + # get expanded pos_bboxes + widths = (det_bboxes[:, 2] - det_bboxes[:, 0]).unsqueeze(-1) + heights = (det_bboxes[:, 3] - det_bboxes[:, 1]).unsqueeze(-1) + x1 = (det_bboxes[:, 0, None] - widths / 2) + y1 = (det_bboxes[:, 1, None] - heights / 2) + # map the grid point to the absolute coordinates + abs_xs = (xs.float() + 0.5) / w * widths + x1 + abs_ys = (ys.float() + 0.5) / h * heights + y1 + + # get the grid points indices that fall on the bbox boundaries + x1_inds = [i for i in range(self.grid_size)] + y1_inds = [i * self.grid_size for i in range(self.grid_size)] + x2_inds = [ + self.grid_points - self.grid_size + i + for i in range(self.grid_size) + ] + y2_inds = [(i + 1) * self.grid_size - 1 for i in range(self.grid_size)] + + # voting of all grid points on some boundary + bboxes_x1 = (abs_xs[:, x1_inds] * pred_scores[:, x1_inds]).sum( + dim=1, keepdim=True) / ( + pred_scores[:, x1_inds].sum(dim=1, keepdim=True)) + bboxes_y1 = (abs_ys[:, y1_inds] * pred_scores[:, y1_inds]).sum( + dim=1, keepdim=True) / ( + pred_scores[:, y1_inds].sum(dim=1, keepdim=True)) + bboxes_x2 = (abs_xs[:, x2_inds] * pred_scores[:, x2_inds]).sum( + dim=1, keepdim=True) / ( + pred_scores[:, x2_inds].sum(dim=1, keepdim=True)) + bboxes_y2 = (abs_ys[:, y2_inds] * pred_scores[:, y2_inds]).sum( + dim=1, keepdim=True) / ( + pred_scores[:, y2_inds].sum(dim=1, keepdim=True)) + + bbox_res = torch.cat( + [bboxes_x1, bboxes_y1, bboxes_x2, bboxes_y2, cls_scores], dim=1) + bbox_res[:, [0, 2]].clamp_(min=0, max=img_metas[0]['img_shape'][1]) + bbox_res[:, [1, 3]].clamp_(min=0, max=img_metas[0]['img_shape'][0]) + + return bbox_res diff --git a/mmdet/models/roi_heads/mask_heads/htc_mask_head.py b/mmdet/models/roi_heads/mask_heads/htc_mask_head.py new file mode 100644 index 0000000..7ad8592 --- /dev/null +++ b/mmdet/models/roi_heads/mask_heads/htc_mask_head.py @@ -0,0 +1,39 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmcv.cnn import ConvModule + +from mmdet.models.builder import HEADS +from .fcn_mask_head import FCNMaskHead + + +@HEADS.register_module() +class HTCMaskHead(FCNMaskHead): + + def __init__(self, with_conv_res=True, *args, **kwargs): + super(HTCMaskHead, self).__init__(*args, **kwargs) + self.with_conv_res = with_conv_res + if self.with_conv_res: + self.conv_res = ConvModule( + self.conv_out_channels, + self.conv_out_channels, + 1, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg) + + def forward(self, x, res_feat=None, return_logits=True, return_feat=True): + if res_feat is not None: + assert self.with_conv_res + res_feat = self.conv_res(res_feat) + x = x + res_feat + for conv in self.convs: + x = conv(x) + res_feat = x + outs = [] + if return_logits: + x = self.upsample(x) + if self.upsample_method == 'deconv': + x = self.relu(x) + mask_pred = self.conv_logits(x) + outs.append(mask_pred) + if return_feat: + outs.append(res_feat) + return outs if len(outs) > 1 else outs[0] diff --git a/mmdet/models/roi_heads/mask_heads/mask_point_head.py b/mmdet/models/roi_heads/mask_heads/mask_point_head.py new file mode 100644 index 0000000..c77c46d --- /dev/null +++ b/mmdet/models/roi_heads/mask_heads/mask_point_head.py @@ -0,0 +1,253 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# Modified from https://github.com/facebookresearch/detectron2/tree/master/projects/PointRend/point_head/point_head.py # noqa + +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule +from mmcv.ops import point_sample, rel_roi_point_to_rel_img_point +from mmcv.runner import BaseModule + +from mmdet.models.builder import HEADS, build_loss +from mmdet.models.utils import (get_uncertain_point_coords_with_randomness, + get_uncertainty) + + +@HEADS.register_module() +class MaskPointHead(BaseModule): + """A mask point head use in PointRend. + + ``MaskPointHead`` use shared multi-layer perceptron (equivalent to + nn.Conv1d) to predict the logit of input points. The fine-grained feature + and coarse feature will be concatenate together for predication. + + Args: + num_fcs (int): Number of fc layers in the head. Default: 3. + in_channels (int): Number of input channels. Default: 256. + fc_channels (int): Number of fc channels. Default: 256. + num_classes (int): Number of classes for logits. Default: 80. + class_agnostic (bool): Whether use class agnostic classification. + If so, the output channels of logits will be 1. Default: False. + coarse_pred_each_layer (bool): Whether concatenate coarse feature with + the output of each fc layer. Default: True. + conv_cfg (dict | None): Dictionary to construct and config conv layer. + Default: dict(type='Conv1d')) + norm_cfg (dict | None): Dictionary to construct and config norm layer. + Default: None. + loss_point (dict): Dictionary to construct and config loss layer of + point head. Default: dict(type='CrossEntropyLoss', use_mask=True, + loss_weight=1.0). + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + num_classes, + num_fcs=3, + in_channels=256, + fc_channels=256, + class_agnostic=False, + coarse_pred_each_layer=True, + conv_cfg=dict(type='Conv1d'), + norm_cfg=None, + act_cfg=dict(type='ReLU'), + loss_point=dict( + type='CrossEntropyLoss', use_mask=True, loss_weight=1.0), + init_cfg=dict( + type='Normal', std=0.001, + override=dict(name='fc_logits'))): + super().__init__(init_cfg) + self.num_fcs = num_fcs + self.in_channels = in_channels + self.fc_channels = fc_channels + self.num_classes = num_classes + self.class_agnostic = class_agnostic + self.coarse_pred_each_layer = coarse_pred_each_layer + self.conv_cfg = conv_cfg + self.norm_cfg = norm_cfg + self.loss_point = build_loss(loss_point) + + fc_in_channels = in_channels + num_classes + self.fcs = nn.ModuleList() + for _ in range(num_fcs): + fc = ConvModule( + fc_in_channels, + fc_channels, + kernel_size=1, + stride=1, + padding=0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.fcs.append(fc) + fc_in_channels = fc_channels + fc_in_channels += num_classes if self.coarse_pred_each_layer else 0 + + out_channels = 1 if self.class_agnostic else self.num_classes + self.fc_logits = nn.Conv1d( + fc_in_channels, out_channels, kernel_size=1, stride=1, padding=0) + + def forward(self, fine_grained_feats, coarse_feats): + """Classify each point base on fine grained and coarse feats. + + Args: + fine_grained_feats (Tensor): Fine grained feature sampled from FPN, + shape (num_rois, in_channels, num_points). + coarse_feats (Tensor): Coarse feature sampled from CoarseMaskHead, + shape (num_rois, num_classes, num_points). + + Returns: + Tensor: Point classification results, + shape (num_rois, num_class, num_points). + """ + + x = torch.cat([fine_grained_feats, coarse_feats], dim=1) + for fc in self.fcs: + x = fc(x) + if self.coarse_pred_each_layer: + x = torch.cat((x, coarse_feats), dim=1) + return self.fc_logits(x) + + def get_targets(self, rois, rel_roi_points, sampling_results, gt_masks, + cfg): + """Get training targets of MaskPointHead for all images. + + Args: + rois (Tensor): Region of Interest, shape (num_rois, 5). + rel_roi_points: Points coordinates relative to RoI, shape + (num_rois, num_points, 2). + sampling_results (:obj:`SamplingResult`): Sampling result after + sampling and assignment. + gt_masks (Tensor) : Ground truth segmentation masks of + corresponding boxes, shape (num_rois, height, width). + cfg (dict): Training cfg. + + Returns: + Tensor: Point target, shape (num_rois, num_points). + """ + + num_imgs = len(sampling_results) + rois_list = [] + rel_roi_points_list = [] + for batch_ind in range(num_imgs): + inds = (rois[:, 0] == batch_ind) + rois_list.append(rois[inds]) + rel_roi_points_list.append(rel_roi_points[inds]) + pos_assigned_gt_inds_list = [ + res.pos_assigned_gt_inds for res in sampling_results + ] + cfg_list = [cfg for _ in range(num_imgs)] + + point_targets = map(self._get_target_single, rois_list, + rel_roi_points_list, pos_assigned_gt_inds_list, + gt_masks, cfg_list) + point_targets = list(point_targets) + + if len(point_targets) > 0: + point_targets = torch.cat(point_targets) + + return point_targets + + def _get_target_single(self, rois, rel_roi_points, pos_assigned_gt_inds, + gt_masks, cfg): + """Get training target of MaskPointHead for each image.""" + num_pos = rois.size(0) + num_points = cfg.num_points + if num_pos > 0: + gt_masks_th = ( + gt_masks.to_tensor(rois.dtype, rois.device).index_select( + 0, pos_assigned_gt_inds)) + gt_masks_th = gt_masks_th.unsqueeze(1) + rel_img_points = rel_roi_point_to_rel_img_point( + rois, rel_roi_points, gt_masks_th) + point_targets = point_sample(gt_masks_th, + rel_img_points).squeeze(1) + else: + point_targets = rois.new_zeros((0, num_points)) + return point_targets + + def loss(self, point_pred, point_targets, labels): + """Calculate loss for MaskPointHead. + + Args: + point_pred (Tensor): Point predication result, shape + (num_rois, num_classes, num_points). + point_targets (Tensor): Point targets, shape (num_roi, num_points). + labels (Tensor): Class label of corresponding boxes, + shape (num_rois, ) + + Returns: + dict[str, Tensor]: a dictionary of point loss components + """ + + loss = dict() + if self.class_agnostic: + loss_point = self.loss_point(point_pred, point_targets, + torch.zeros_like(labels)) + else: + loss_point = self.loss_point(point_pred, point_targets, labels) + loss['loss_point'] = loss_point + return loss + + def get_roi_rel_points_train(self, mask_pred, labels, cfg): + """Get ``num_points`` most uncertain points with random points during + train. + + Sample points in [0, 1] x [0, 1] coordinate space based on their + uncertainty. The uncertainties are calculated for each point using + '_get_uncertainty()' function that takes point's logit prediction as + input. + + Args: + mask_pred (Tensor): A tensor of shape (num_rois, num_classes, + mask_height, mask_width) for class-specific or class-agnostic + prediction. + labels (list): The ground truth class for each instance. + cfg (dict): Training config of point head. + + Returns: + point_coords (Tensor): A tensor of shape (num_rois, num_points, 2) + that contains the coordinates sampled points. + """ + point_coords = get_uncertain_point_coords_with_randomness( + mask_pred, labels, cfg.num_points, cfg.oversample_ratio, + cfg.importance_sample_ratio) + return point_coords + + def get_roi_rel_points_test(self, mask_pred, pred_label, cfg): + """Get ``num_points`` most uncertain points during test. + + Args: + mask_pred (Tensor): A tensor of shape (num_rois, num_classes, + mask_height, mask_width) for class-specific or class-agnostic + prediction. + pred_label (list): The predication class for each instance. + cfg (dict): Testing config of point head. + + Returns: + point_indices (Tensor): A tensor of shape (num_rois, num_points) + that contains indices from [0, mask_height x mask_width) of the + most uncertain points. + point_coords (Tensor): A tensor of shape (num_rois, num_points, 2) + that contains [0, 1] x [0, 1] normalized coordinates of the + most uncertain points from the [mask_height, mask_width] grid . + """ + num_points = cfg.subdivision_num_points + uncertainty_map = get_uncertainty(mask_pred, pred_label) + num_rois, _, mask_height, mask_width = uncertainty_map.shape + + # During ONNX exporting, the type of each elements of 'shape' is + # `Tensor(float)`, while it is `float` during PyTorch inference. + if isinstance(mask_height, torch.Tensor): + h_step = 1.0 / mask_height.float() + w_step = 1.0 / mask_width.float() + else: + h_step = 1.0 / mask_height + w_step = 1.0 / mask_width + # cast to int to avoid dynamic K for TopK op in ONNX + mask_size = int(mask_height * mask_width) + uncertainty_map = uncertainty_map.view(num_rois, mask_size) + num_points = min(mask_size, num_points) + point_indices = uncertainty_map.topk(num_points, dim=1)[1] + xs = w_step / 2.0 + (point_indices % mask_width).float() * w_step + ys = h_step / 2.0 + (point_indices // mask_width).float() * h_step + point_coords = torch.stack([xs, ys], dim=2) + return point_indices, point_coords diff --git a/mmdet/models/roi_heads/mask_heads/maskiou_head.py b/mmdet/models/roi_heads/mask_heads/maskiou_head.py new file mode 100644 index 0000000..a7ff7c7 --- /dev/null +++ b/mmdet/models/roi_heads/mask_heads/maskiou_head.py @@ -0,0 +1,183 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import torch +import torch.nn as nn +from mmcv.cnn import Conv2d, Linear, MaxPool2d +from mmcv.runner import BaseModule, force_fp32 +from torch.nn.modules.utils import _pair + +from mmdet.models.builder import HEADS, build_loss + + +@HEADS.register_module() +class MaskIoUHead(BaseModule): + """Mask IoU Head. + + This head predicts the IoU of predicted masks and corresponding gt masks. + """ + + def __init__(self, + num_convs=4, + num_fcs=2, + roi_feat_size=14, + in_channels=256, + conv_out_channels=256, + fc_out_channels=1024, + num_classes=80, + loss_iou=dict(type='MSELoss', loss_weight=0.5), + init_cfg=[ + dict(type='Kaiming', override=dict(name='convs')), + dict(type='Caffe2Xavier', override=dict(name='fcs')), + dict( + type='Normal', + std=0.01, + override=dict(name='fc_mask_iou')) + ]): + super(MaskIoUHead, self).__init__(init_cfg) + self.in_channels = in_channels + self.conv_out_channels = conv_out_channels + self.fc_out_channels = fc_out_channels + self.num_classes = num_classes + self.fp16_enabled = False + + self.convs = nn.ModuleList() + for i in range(num_convs): + if i == 0: + # concatenation of mask feature and mask prediction + in_channels = self.in_channels + 1 + else: + in_channels = self.conv_out_channels + stride = 2 if i == num_convs - 1 else 1 + self.convs.append( + Conv2d( + in_channels, + self.conv_out_channels, + 3, + stride=stride, + padding=1)) + + roi_feat_size = _pair(roi_feat_size) + pooled_area = (roi_feat_size[0] // 2) * (roi_feat_size[1] // 2) + self.fcs = nn.ModuleList() + for i in range(num_fcs): + in_channels = ( + self.conv_out_channels * + pooled_area if i == 0 else self.fc_out_channels) + self.fcs.append(Linear(in_channels, self.fc_out_channels)) + + self.fc_mask_iou = Linear(self.fc_out_channels, self.num_classes) + self.relu = nn.ReLU() + self.max_pool = MaxPool2d(2, 2) + self.loss_iou = build_loss(loss_iou) + + def forward(self, mask_feat, mask_pred): + mask_pred = mask_pred.sigmoid() + mask_pred_pooled = self.max_pool(mask_pred.unsqueeze(1)) + + x = torch.cat((mask_feat, mask_pred_pooled), 1) + + for conv in self.convs: + x = self.relu(conv(x)) + x = x.flatten(1) + for fc in self.fcs: + x = self.relu(fc(x)) + mask_iou = self.fc_mask_iou(x) + return mask_iou + + @force_fp32(apply_to=('mask_iou_pred', )) + def loss(self, mask_iou_pred, mask_iou_targets): + pos_inds = mask_iou_targets > 0 + if pos_inds.sum() > 0: + loss_mask_iou = self.loss_iou(mask_iou_pred[pos_inds], + mask_iou_targets[pos_inds]) + else: + loss_mask_iou = mask_iou_pred.sum() * 0 + return dict(loss_mask_iou=loss_mask_iou) + + @force_fp32(apply_to=('mask_pred', )) + def get_targets(self, sampling_results, gt_masks, mask_pred, mask_targets, + rcnn_train_cfg): + """Compute target of mask IoU. + + Mask IoU target is the IoU of the predicted mask (inside a bbox) and + the gt mask of corresponding gt mask (the whole instance). + The intersection area is computed inside the bbox, and the gt mask area + is computed with two steps, firstly we compute the gt area inside the + bbox, then divide it by the area ratio of gt area inside the bbox and + the gt area of the whole instance. + + Args: + sampling_results (list[:obj:`SamplingResult`]): sampling results. + gt_masks (BitmapMask | PolygonMask): Gt masks (the whole instance) + of each image, with the same shape of the input image. + mask_pred (Tensor): Predicted masks of each positive proposal, + shape (num_pos, h, w). + mask_targets (Tensor): Gt mask of each positive proposal, + binary map of the shape (num_pos, h, w). + rcnn_train_cfg (dict): Training config for R-CNN part. + + Returns: + Tensor: mask iou target (length == num positive). + """ + pos_proposals = [res.pos_bboxes for res in sampling_results] + pos_assigned_gt_inds = [ + res.pos_assigned_gt_inds for res in sampling_results + ] + + # compute the area ratio of gt areas inside the proposals and + # the whole instance + area_ratios = map(self._get_area_ratio, pos_proposals, + pos_assigned_gt_inds, gt_masks) + area_ratios = torch.cat(list(area_ratios)) + assert mask_targets.size(0) == area_ratios.size(0) + + mask_pred = (mask_pred > rcnn_train_cfg.mask_thr_binary).float() + mask_pred_areas = mask_pred.sum((-1, -2)) + + # mask_pred and mask_targets are binary maps + overlap_areas = (mask_pred * mask_targets).sum((-1, -2)) + + # compute the mask area of the whole instance + gt_full_areas = mask_targets.sum((-1, -2)) / (area_ratios + 1e-7) + + mask_iou_targets = overlap_areas / ( + mask_pred_areas + gt_full_areas - overlap_areas) + return mask_iou_targets + + def _get_area_ratio(self, pos_proposals, pos_assigned_gt_inds, gt_masks): + """Compute area ratio of the gt mask inside the proposal and the gt + mask of the corresponding instance.""" + num_pos = pos_proposals.size(0) + if num_pos > 0: + area_ratios = [] + proposals_np = pos_proposals.cpu().numpy() + pos_assigned_gt_inds = pos_assigned_gt_inds.cpu().numpy() + # compute mask areas of gt instances (batch processing for speedup) + gt_instance_mask_area = gt_masks.areas + for i in range(num_pos): + gt_mask = gt_masks[pos_assigned_gt_inds[i]] + + # crop the gt mask inside the proposal + bbox = proposals_np[i, :].astype(np.int32) + gt_mask_in_proposal = gt_mask.crop(bbox) + + ratio = gt_mask_in_proposal.areas[0] / ( + gt_instance_mask_area[pos_assigned_gt_inds[i]] + 1e-7) + area_ratios.append(ratio) + area_ratios = torch.from_numpy(np.stack(area_ratios)).float().to( + pos_proposals.device) + else: + area_ratios = pos_proposals.new_zeros((0, )) + return area_ratios + + @force_fp32(apply_to=('mask_iou_pred', )) + def get_mask_scores(self, mask_iou_pred, det_bboxes, det_labels): + """Get the mask scores. + + mask_score = bbox_score * mask_iou + """ + inds = range(det_labels.size(0)) + mask_scores = mask_iou_pred[inds, det_labels] * det_bboxes[inds, -1] + mask_scores = mask_scores.cpu().numpy() + det_labels = det_labels.cpu().numpy() + return [mask_scores[det_labels == i] for i in range(self.num_classes)] diff --git a/mmdet/models/roi_heads/mask_heads/scnet_mask_head.py b/mmdet/models/roi_heads/mask_heads/scnet_mask_head.py new file mode 100644 index 0000000..ca62486 --- /dev/null +++ b/mmdet/models/roi_heads/mask_heads/scnet_mask_head.py @@ -0,0 +1,28 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmdet.models.builder import HEADS +from mmdet.models.utils import ResLayer, SimplifiedBasicBlock +from .fcn_mask_head import FCNMaskHead + + +@HEADS.register_module() +class SCNetMaskHead(FCNMaskHead): + """Mask head for `SCNet `_. + + Args: + conv_to_res (bool, optional): if True, change the conv layers to + ``SimplifiedBasicBlock``. + """ + + def __init__(self, conv_to_res=True, **kwargs): + super(SCNetMaskHead, self).__init__(**kwargs) + self.conv_to_res = conv_to_res + if conv_to_res: + assert self.conv_kernel_size == 3 + self.num_res_blocks = self.num_convs // 2 + self.convs = ResLayer( + SimplifiedBasicBlock, + self.in_channels, + self.conv_out_channels, + self.num_res_blocks, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg) diff --git a/mmdet/models/roi_heads/mask_heads/scnet_semantic_head.py b/mmdet/models/roi_heads/mask_heads/scnet_semantic_head.py new file mode 100644 index 0000000..2b8c5c3 --- /dev/null +++ b/mmdet/models/roi_heads/mask_heads/scnet_semantic_head.py @@ -0,0 +1,28 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmdet.models.builder import HEADS +from mmdet.models.utils import ResLayer, SimplifiedBasicBlock +from .fused_semantic_head import FusedSemanticHead + + +@HEADS.register_module() +class SCNetSemanticHead(FusedSemanticHead): + """Mask head for `SCNet `_. + + Args: + conv_to_res (bool, optional): if True, change the conv layers to + ``SimplifiedBasicBlock``. + """ + + def __init__(self, conv_to_res=True, **kwargs): + super(SCNetSemanticHead, self).__init__(**kwargs) + self.conv_to_res = conv_to_res + if self.conv_to_res: + num_res_blocks = self.num_convs // 2 + self.convs = ResLayer( + SimplifiedBasicBlock, + self.in_channels, + self.conv_out_channels, + num_res_blocks, + conv_cfg=self.conv_cfg, + norm_cfg=self.norm_cfg) + self.num_convs = num_res_blocks diff --git a/mmdet/models/roi_heads/mask_scoring_roi_head.py b/mmdet/models/roi_heads/mask_scoring_roi_head.py new file mode 100644 index 0000000..4617988 --- /dev/null +++ b/mmdet/models/roi_heads/mask_scoring_roi_head.py @@ -0,0 +1,113 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from mmdet.core import bbox2roi +from ..builder import HEADS, build_head +from .standard_roi_head import StandardRoIHead + + +@HEADS.register_module() +class MaskScoringRoIHead(StandardRoIHead): + """Mask Scoring RoIHead for Mask Scoring RCNN. + + https://arxiv.org/abs/1903.00241 + """ + + def __init__(self, mask_iou_head, **kwargs): + assert mask_iou_head is not None + super(MaskScoringRoIHead, self).__init__(**kwargs) + self.mask_iou_head = build_head(mask_iou_head) + + def _mask_forward_train(self, x, sampling_results, bbox_feats, gt_masks, + img_metas): + """Run forward function and calculate loss for Mask head in + training.""" + pos_labels = torch.cat([res.pos_gt_labels for res in sampling_results]) + mask_results = super(MaskScoringRoIHead, + self)._mask_forward_train(x, sampling_results, + bbox_feats, gt_masks, + img_metas) + if mask_results['loss_mask'] is None: + return mask_results + + # mask iou head forward and loss + pos_mask_pred = mask_results['mask_pred'][ + range(mask_results['mask_pred'].size(0)), pos_labels] + mask_iou_pred = self.mask_iou_head(mask_results['mask_feats'], + pos_mask_pred) + pos_mask_iou_pred = mask_iou_pred[range(mask_iou_pred.size(0)), + pos_labels] + + mask_iou_targets = self.mask_iou_head.get_targets( + sampling_results, gt_masks, pos_mask_pred, + mask_results['mask_targets'], self.train_cfg) + loss_mask_iou = self.mask_iou_head.loss(pos_mask_iou_pred, + mask_iou_targets) + mask_results['loss_mask'].update(loss_mask_iou) + return mask_results + + def simple_test_mask(self, + x, + img_metas, + det_bboxes, + det_labels, + rescale=False): + """Obtain mask prediction without augmentation.""" + # image shapes of images in the batch + ori_shapes = tuple(meta['ori_shape'] for meta in img_metas) + scale_factors = tuple(meta['scale_factor'] for meta in img_metas) + + num_imgs = len(det_bboxes) + if all(det_bbox.shape[0] == 0 for det_bbox in det_bboxes): + num_classes = self.mask_head.num_classes + segm_results = [[[] for _ in range(num_classes)] + for _ in range(num_imgs)] + mask_scores = [[[] for _ in range(num_classes)] + for _ in range(num_imgs)] + else: + # if det_bboxes is rescaled to the original image size, we need to + # rescale it back to the testing scale to obtain RoIs. + if rescale and not isinstance(scale_factors[0], float): + scale_factors = [ + torch.from_numpy(scale_factor).to(det_bboxes[0].device) + for scale_factor in scale_factors + ] + _bboxes = [ + det_bboxes[i][:, :4] * + scale_factors[i] if rescale else det_bboxes[i] + for i in range(num_imgs) + ] + mask_rois = bbox2roi(_bboxes) + mask_results = self._mask_forward(x, mask_rois) + concat_det_labels = torch.cat(det_labels) + # get mask scores with mask iou head + mask_feats = mask_results['mask_feats'] + mask_pred = mask_results['mask_pred'] + mask_iou_pred = self.mask_iou_head( + mask_feats, mask_pred[range(concat_det_labels.size(0)), + concat_det_labels]) + # split batch mask prediction back to each image + num_bboxes_per_img = tuple(len(_bbox) for _bbox in _bboxes) + mask_preds = mask_pred.split(num_bboxes_per_img, 0) + mask_iou_preds = mask_iou_pred.split(num_bboxes_per_img, 0) + + # apply mask post-processing to each image individually + segm_results = [] + mask_scores = [] + for i in range(num_imgs): + if det_bboxes[i].shape[0] == 0: + segm_results.append( + [[] for _ in range(self.mask_head.num_classes)]) + mask_scores.append( + [[] for _ in range(self.mask_head.num_classes)]) + else: + segm_result = self.mask_head.get_seg_masks( + mask_preds[i], _bboxes[i], det_labels[i], + self.test_cfg, ori_shapes[i], scale_factors[i], + rescale) + # get mask scores with mask iou head + mask_score = self.mask_iou_head.get_mask_scores( + mask_iou_preds[i], det_bboxes[i], det_labels[i]) + segm_results.append(segm_result) + mask_scores.append(mask_score) + return list(zip(segm_results, mask_scores)) diff --git a/mmdet/models/roi_heads/pisa_roi_head.py b/mmdet/models/roi_heads/pisa_roi_head.py new file mode 100644 index 0000000..92a5118 --- /dev/null +++ b/mmdet/models/roi_heads/pisa_roi_head.py @@ -0,0 +1,160 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmdet.core import bbox2roi +from ..builder import HEADS +from ..losses.pisa_loss import carl_loss, isr_p +from .standard_roi_head import StandardRoIHead + + +@HEADS.register_module() +class PISARoIHead(StandardRoIHead): + r"""The RoI head for `Prime Sample Attention in Object Detection + `_.""" + + def forward_train(self, + x, + img_metas, + proposal_list, + gt_bboxes, + gt_labels, + gt_bboxes_ignore=None, + gt_masks=None): + """Forward function for training. + + Args: + x (list[Tensor]): List of multi-level img features. + img_metas (list[dict]): List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmdet/datasets/pipelines/formatting.py:Collect`. + proposals (list[Tensors]): List of region proposals. + gt_bboxes (list[Tensor]): Each item are the truth boxes for each + image in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): Class indices corresponding to each box + gt_bboxes_ignore (list[Tensor], optional): Specify which bounding + boxes can be ignored when computing the loss. + gt_masks (None | Tensor) : True segmentation masks for each box + used if the architecture supports a segmentation task. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + # assign gts and sample proposals + if self.with_bbox or self.with_mask: + num_imgs = len(img_metas) + if gt_bboxes_ignore is None: + gt_bboxes_ignore = [None for _ in range(num_imgs)] + sampling_results = [] + neg_label_weights = [] + for i in range(num_imgs): + assign_result = self.bbox_assigner.assign( + proposal_list[i], gt_bboxes[i], gt_bboxes_ignore[i], + gt_labels[i]) + sampling_result = self.bbox_sampler.sample( + assign_result, + proposal_list[i], + gt_bboxes[i], + gt_labels[i], + feats=[lvl_feat[i][None] for lvl_feat in x]) + # neg label weight is obtained by sampling when using ISR-N + neg_label_weight = None + if isinstance(sampling_result, tuple): + sampling_result, neg_label_weight = sampling_result + sampling_results.append(sampling_result) + neg_label_weights.append(neg_label_weight) + + losses = dict() + # bbox head forward and loss + if self.with_bbox: + bbox_results = self._bbox_forward_train( + x, + sampling_results, + gt_bboxes, + gt_labels, + img_metas, + neg_label_weights=neg_label_weights) + losses.update(bbox_results['loss_bbox']) + + # mask head forward and loss + if self.with_mask: + mask_results = self._mask_forward_train(x, sampling_results, + bbox_results['bbox_feats'], + gt_masks, img_metas) + losses.update(mask_results['loss_mask']) + + return losses + + def _bbox_forward(self, x, rois): + """Box forward function used in both training and testing.""" + # TODO: a more flexible way to decide which feature maps to use + bbox_feats = self.bbox_roi_extractor( + x[:self.bbox_roi_extractor.num_inputs], rois) + if self.with_shared_head: + bbox_feats = self.shared_head(bbox_feats) + cls_score, bbox_pred = self.bbox_head(bbox_feats) + + bbox_results = dict( + cls_score=cls_score, bbox_pred=bbox_pred, bbox_feats=bbox_feats) + return bbox_results + + def _bbox_forward_train(self, + x, + sampling_results, + gt_bboxes, + gt_labels, + img_metas, + neg_label_weights=None): + """Run forward function and calculate loss for box head in training.""" + rois = bbox2roi([res.bboxes for res in sampling_results]) + + bbox_results = self._bbox_forward(x, rois) + + bbox_targets = self.bbox_head.get_targets(sampling_results, gt_bboxes, + gt_labels, self.train_cfg) + + # neg_label_weights obtained by sampler is image-wise, mapping back to + # the corresponding location in label weights + if neg_label_weights[0] is not None: + label_weights = bbox_targets[1] + cur_num_rois = 0 + for i in range(len(sampling_results)): + num_pos = sampling_results[i].pos_inds.size(0) + num_neg = sampling_results[i].neg_inds.size(0) + label_weights[cur_num_rois + num_pos:cur_num_rois + num_pos + + num_neg] = neg_label_weights[i] + cur_num_rois += num_pos + num_neg + + cls_score = bbox_results['cls_score'] + bbox_pred = bbox_results['bbox_pred'] + + # Apply ISR-P + isr_cfg = self.train_cfg.get('isr', None) + if isr_cfg is not None: + bbox_targets = isr_p( + cls_score, + bbox_pred, + bbox_targets, + rois, + sampling_results, + self.bbox_head.loss_cls, + self.bbox_head.bbox_coder, + **isr_cfg, + num_class=self.bbox_head.num_classes) + loss_bbox = self.bbox_head.loss(cls_score, bbox_pred, rois, + *bbox_targets) + + # Add CARL Loss + carl_cfg = self.train_cfg.get('carl', None) + if carl_cfg is not None: + loss_carl = carl_loss( + cls_score, + bbox_targets[0], + bbox_pred, + bbox_targets[2], + self.bbox_head.loss_bbox, + **carl_cfg, + num_class=self.bbox_head.num_classes) + loss_bbox.update(loss_carl) + + bbox_results.update(loss_bbox=loss_bbox) + return bbox_results diff --git a/mmdet/models/roi_heads/point_rend_roi_head.py b/mmdet/models/roi_heads/point_rend_roi_head.py new file mode 100644 index 0000000..9f66779 --- /dev/null +++ b/mmdet/models/roi_heads/point_rend_roi_head.py @@ -0,0 +1,393 @@ +# Copyright (c) OpenMMLab. All rights reserved. +# Modified from https://github.com/facebookresearch/detectron2/tree/master/projects/PointRend # noqa +import os +import warnings + +import numpy as np +import torch +import torch.nn.functional as F +from mmcv.ops import point_sample, rel_roi_point_to_rel_img_point + +from mmdet.core import bbox2roi, bbox_mapping, merge_aug_masks +from .. import builder +from ..builder import HEADS +from .standard_roi_head import StandardRoIHead + + +@HEADS.register_module() +class PointRendRoIHead(StandardRoIHead): + """`PointRend `_.""" + + def __init__(self, point_head, *args, **kwargs): + super().__init__(*args, **kwargs) + assert self.with_bbox and self.with_mask + self.init_point_head(point_head) + + def init_point_head(self, point_head): + """Initialize ``point_head``""" + self.point_head = builder.build_head(point_head) + + def _mask_forward_train(self, x, sampling_results, bbox_feats, gt_masks, + img_metas): + """Run forward function and calculate loss for mask head and point head + in training.""" + mask_results = super()._mask_forward_train(x, sampling_results, + bbox_feats, gt_masks, + img_metas) + if mask_results['loss_mask'] is not None: + loss_point = self._mask_point_forward_train( + x, sampling_results, mask_results['mask_pred'], gt_masks, + img_metas) + mask_results['loss_mask'].update(loss_point) + + return mask_results + + def _mask_point_forward_train(self, x, sampling_results, mask_pred, + gt_masks, img_metas): + """Run forward function and calculate loss for point head in + training.""" + pos_labels = torch.cat([res.pos_gt_labels for res in sampling_results]) + rel_roi_points = self.point_head.get_roi_rel_points_train( + mask_pred, pos_labels, cfg=self.train_cfg) + rois = bbox2roi([res.pos_bboxes for res in sampling_results]) + + fine_grained_point_feats = self._get_fine_grained_point_feats( + x, rois, rel_roi_points, img_metas) + coarse_point_feats = point_sample(mask_pred, rel_roi_points) + mask_point_pred = self.point_head(fine_grained_point_feats, + coarse_point_feats) + mask_point_target = self.point_head.get_targets( + rois, rel_roi_points, sampling_results, gt_masks, self.train_cfg) + loss_mask_point = self.point_head.loss(mask_point_pred, + mask_point_target, pos_labels) + + return loss_mask_point + + def _get_fine_grained_point_feats(self, x, rois, rel_roi_points, + img_metas): + """Sample fine grained feats from each level feature map and + concatenate them together. + + Args: + x (tuple[Tensor]): Feature maps of all scale level. + rois (Tensor): shape (num_rois, 5). + rel_roi_points (Tensor): A tensor of shape (num_rois, num_points, + 2) that contains [0, 1] x [0, 1] normalized coordinates of the + most uncertain points from the [mask_height, mask_width] grid. + img_metas (list[dict]): Image meta info. + + Returns: + Tensor: The fine grained features for each points, + has shape (num_rois, feats_channels, num_points). + """ + num_imgs = len(img_metas) + fine_grained_feats = [] + for idx in range(self.mask_roi_extractor.num_inputs): + feats = x[idx] + spatial_scale = 1. / float( + self.mask_roi_extractor.featmap_strides[idx]) + point_feats = [] + for batch_ind in range(num_imgs): + # unravel batch dim + feat = feats[batch_ind].unsqueeze(0) + inds = (rois[:, 0].long() == batch_ind) + if inds.any(): + rel_img_points = rel_roi_point_to_rel_img_point( + rois[inds], rel_roi_points[inds], feat.shape[2:], + spatial_scale).unsqueeze(0) + point_feat = point_sample(feat, rel_img_points) + point_feat = point_feat.squeeze(0).transpose(0, 1) + point_feats.append(point_feat) + fine_grained_feats.append(torch.cat(point_feats, dim=0)) + return torch.cat(fine_grained_feats, dim=1) + + def _mask_point_forward_test(self, x, rois, label_pred, mask_pred, + img_metas): + """Mask refining process with point head in testing. + + Args: + x (tuple[Tensor]): Feature maps of all scale level. + rois (Tensor): shape (num_rois, 5). + label_pred (Tensor): The predication class for each rois. + mask_pred (Tensor): The predication coarse masks of + shape (num_rois, num_classes, small_size, small_size). + img_metas (list[dict]): Image meta info. + + Returns: + Tensor: The refined masks of shape (num_rois, num_classes, + large_size, large_size). + """ + refined_mask_pred = mask_pred.clone() + for subdivision_step in range(self.test_cfg.subdivision_steps): + refined_mask_pred = F.interpolate( + refined_mask_pred, + scale_factor=self.test_cfg.scale_factor, + mode='bilinear', + align_corners=False) + # If `subdivision_num_points` is larger or equal to the + # resolution of the next step, then we can skip this step + num_rois, channels, mask_height, mask_width = \ + refined_mask_pred.shape + if (self.test_cfg.subdivision_num_points >= + self.test_cfg.scale_factor**2 * mask_height * mask_width + and + subdivision_step < self.test_cfg.subdivision_steps - 1): + continue + point_indices, rel_roi_points = \ + self.point_head.get_roi_rel_points_test( + refined_mask_pred, label_pred, cfg=self.test_cfg) + fine_grained_point_feats = self._get_fine_grained_point_feats( + x, rois, rel_roi_points, img_metas) + coarse_point_feats = point_sample(mask_pred, rel_roi_points) + mask_point_pred = self.point_head(fine_grained_point_feats, + coarse_point_feats) + + point_indices = point_indices.unsqueeze(1).expand(-1, channels, -1) + refined_mask_pred = refined_mask_pred.reshape( + num_rois, channels, mask_height * mask_width) + refined_mask_pred = refined_mask_pred.scatter_( + 2, point_indices, mask_point_pred) + refined_mask_pred = refined_mask_pred.view(num_rois, channels, + mask_height, mask_width) + + return refined_mask_pred + + def simple_test_mask(self, + x, + img_metas, + det_bboxes, + det_labels, + rescale=False): + """Obtain mask prediction without augmentation.""" + ori_shapes = tuple(meta['ori_shape'] for meta in img_metas) + scale_factors = tuple(meta['scale_factor'] for meta in img_metas) + + if isinstance(scale_factors[0], float): + warnings.warn( + 'Scale factor in img_metas should be a ' + 'ndarray with shape (4,) ' + 'arrange as (factor_w, factor_h, factor_w, factor_h), ' + 'The scale_factor with float type has been deprecated. ') + scale_factors = np.array([scale_factors] * 4, dtype=np.float32) + + num_imgs = len(det_bboxes) + if all(det_bbox.shape[0] == 0 for det_bbox in det_bboxes): + segm_results = [[[] for _ in range(self.mask_head.num_classes)] + for _ in range(num_imgs)] + else: + # if det_bboxes is rescaled to the original image size, we need to + # rescale it back to the testing scale to obtain RoIs. + _bboxes = [det_bboxes[i][:, :4] for i in range(len(det_bboxes))] + if rescale: + scale_factors = [ + torch.from_numpy(scale_factor).to(det_bboxes[0].device) + for scale_factor in scale_factors + ] + _bboxes = [ + _bboxes[i] * scale_factors[i] for i in range(len(_bboxes)) + ] + + mask_rois = bbox2roi(_bboxes) + mask_results = self._mask_forward(x, mask_rois) + # split batch mask prediction back to each image + mask_pred = mask_results['mask_pred'] + num_mask_roi_per_img = [len(det_bbox) for det_bbox in det_bboxes] + mask_preds = mask_pred.split(num_mask_roi_per_img, 0) + mask_rois = mask_rois.split(num_mask_roi_per_img, 0) + + # apply mask post-processing to each image individually + segm_results = [] + for i in range(num_imgs): + if det_bboxes[i].shape[0] == 0: + segm_results.append( + [[] for _ in range(self.mask_head.num_classes)]) + else: + x_i = [xx[[i]] for xx in x] + mask_rois_i = mask_rois[i] + mask_rois_i[:, 0] = 0 # TODO: remove this hack + mask_pred_i = self._mask_point_forward_test( + x_i, mask_rois_i, det_labels[i], mask_preds[i], + [img_metas]) + segm_result = self.mask_head.get_seg_masks( + mask_pred_i, _bboxes[i], det_labels[i], self.test_cfg, + ori_shapes[i], scale_factors[i], rescale) + segm_results.append(segm_result) + return segm_results + + def aug_test_mask(self, feats, img_metas, det_bboxes, det_labels): + """Test for mask head with test time augmentation.""" + if det_bboxes.shape[0] == 0: + segm_result = [[] for _ in range(self.mask_head.num_classes)] + else: + aug_masks = [] + for x, img_meta in zip(feats, img_metas): + img_shape = img_meta[0]['img_shape'] + scale_factor = img_meta[0]['scale_factor'] + flip = img_meta[0]['flip'] + _bboxes = bbox_mapping(det_bboxes[:, :4], img_shape, + scale_factor, flip) + mask_rois = bbox2roi([_bboxes]) + mask_results = self._mask_forward(x, mask_rois) + mask_results['mask_pred'] = self._mask_point_forward_test( + x, mask_rois, det_labels, mask_results['mask_pred'], + img_meta) + # convert to numpy array to save memory + aug_masks.append( + mask_results['mask_pred'].sigmoid().cpu().numpy()) + merged_masks = merge_aug_masks(aug_masks, img_metas, self.test_cfg) + + ori_shape = img_metas[0][0]['ori_shape'] + segm_result = self.mask_head.get_seg_masks( + merged_masks, + det_bboxes, + det_labels, + self.test_cfg, + ori_shape, + scale_factor=1.0, + rescale=False) + return segm_result + + def _onnx_get_fine_grained_point_feats(self, x, rois, rel_roi_points): + """Export the process of sampling fine grained feats to onnx. + + Args: + x (tuple[Tensor]): Feature maps of all scale level. + rois (Tensor): shape (num_rois, 5). + rel_roi_points (Tensor): A tensor of shape (num_rois, num_points, + 2) that contains [0, 1] x [0, 1] normalized coordinates of the + most uncertain points from the [mask_height, mask_width] grid. + + Returns: + Tensor: The fine grained features for each points, + has shape (num_rois, feats_channels, num_points). + """ + batch_size = x[0].shape[0] + num_rois = rois.shape[0] + fine_grained_feats = [] + for idx in range(self.mask_roi_extractor.num_inputs): + feats = x[idx] + spatial_scale = 1. / float( + self.mask_roi_extractor.featmap_strides[idx]) + + rel_img_points = rel_roi_point_to_rel_img_point( + rois, rel_roi_points, feats, spatial_scale) + channels = feats.shape[1] + num_points = rel_img_points.shape[1] + rel_img_points = rel_img_points.reshape(batch_size, -1, num_points, + 2) + point_feats = point_sample(feats, rel_img_points) + point_feats = point_feats.transpose(1, 2).reshape( + num_rois, channels, num_points) + fine_grained_feats.append(point_feats) + return torch.cat(fine_grained_feats, dim=1) + + def _mask_point_onnx_export(self, x, rois, label_pred, mask_pred): + """Export mask refining process with point head to onnx. + + Args: + x (tuple[Tensor]): Feature maps of all scale level. + rois (Tensor): shape (num_rois, 5). + label_pred (Tensor): The predication class for each rois. + mask_pred (Tensor): The predication coarse masks of + shape (num_rois, num_classes, small_size, small_size). + + Returns: + Tensor: The refined masks of shape (num_rois, num_classes, + large_size, large_size). + """ + refined_mask_pred = mask_pred.clone() + for subdivision_step in range(self.test_cfg.subdivision_steps): + refined_mask_pred = F.interpolate( + refined_mask_pred, + scale_factor=self.test_cfg.scale_factor, + mode='bilinear', + align_corners=False) + # If `subdivision_num_points` is larger or equal to the + # resolution of the next step, then we can skip this step + num_rois, channels, mask_height, mask_width = \ + refined_mask_pred.shape + if (self.test_cfg.subdivision_num_points >= + self.test_cfg.scale_factor**2 * mask_height * mask_width + and + subdivision_step < self.test_cfg.subdivision_steps - 1): + continue + point_indices, rel_roi_points = \ + self.point_head.get_roi_rel_points_test( + refined_mask_pred, label_pred, cfg=self.test_cfg) + fine_grained_point_feats = self._onnx_get_fine_grained_point_feats( + x, rois, rel_roi_points) + coarse_point_feats = point_sample(mask_pred, rel_roi_points) + mask_point_pred = self.point_head(fine_grained_point_feats, + coarse_point_feats) + + point_indices = point_indices.unsqueeze(1).expand(-1, channels, -1) + refined_mask_pred = refined_mask_pred.reshape( + num_rois, channels, mask_height * mask_width) + + is_trt_backend = os.environ.get('ONNX_BACKEND') == 'MMCVTensorRT' + # avoid ScatterElements op in ONNX for TensorRT + if is_trt_backend: + mask_shape = refined_mask_pred.shape + point_shape = point_indices.shape + inds_dim0 = torch.arange(point_shape[0]).reshape( + point_shape[0], 1, 1).expand_as(point_indices) + inds_dim1 = torch.arange(point_shape[1]).reshape( + 1, point_shape[1], 1).expand_as(point_indices) + inds_1d = inds_dim0.reshape( + -1) * mask_shape[1] * mask_shape[2] + inds_dim1.reshape( + -1) * mask_shape[2] + point_indices.reshape(-1) + refined_mask_pred = refined_mask_pred.reshape(-1) + refined_mask_pred[inds_1d] = mask_point_pred.reshape(-1) + refined_mask_pred = refined_mask_pred.reshape(*mask_shape) + else: + refined_mask_pred = refined_mask_pred.scatter_( + 2, point_indices, mask_point_pred) + + refined_mask_pred = refined_mask_pred.view(num_rois, channels, + mask_height, mask_width) + + return refined_mask_pred + + def mask_onnx_export(self, x, img_metas, det_bboxes, det_labels, **kwargs): + """Export mask branch to onnx which supports batch inference. + + Args: + x (tuple[Tensor]): Feature maps of all scale level. + img_metas (list[dict]): Image meta info. + det_bboxes (Tensor): Bboxes and corresponding scores. + has shape [N, num_bboxes, 5]. + det_labels (Tensor): class labels of + shape [N, num_bboxes]. + + Returns: + Tensor: The segmentation results of shape [N, num_bboxes, + image_height, image_width]. + """ + if all(det_bbox.shape[0] == 0 for det_bbox in det_bboxes): + raise RuntimeError('[ONNX Error] Can not record MaskHead ' + 'as it has not been executed this time') + batch_size = det_bboxes.size(0) + # if det_bboxes is rescaled to the original image size, we need to + # rescale it back to the testing scale to obtain RoIs. + det_bboxes = det_bboxes[..., :4] + batch_index = torch.arange( + det_bboxes.size(0), device=det_bboxes.device).float().view( + -1, 1, 1).expand(det_bboxes.size(0), det_bboxes.size(1), 1) + mask_rois = torch.cat([batch_index, det_bboxes], dim=-1) + mask_rois = mask_rois.view(-1, 5) + mask_results = self._mask_forward(x, mask_rois) + mask_pred = mask_results['mask_pred'] + max_shape = img_metas[0]['img_shape_for_onnx'] + num_det = det_bboxes.shape[1] + det_bboxes = det_bboxes.reshape(-1, 4) + det_labels = det_labels.reshape(-1) + + mask_pred = self._mask_point_onnx_export(x, mask_rois, det_labels, + mask_pred) + + segm_results = self.mask_head.onnx_export(mask_pred, det_bboxes, + det_labels, self.test_cfg, + max_shape) + segm_results = segm_results.reshape(batch_size, num_det, max_shape[0], + max_shape[1]) + return segm_results diff --git a/mmdet/models/roi_heads/roi_extractors/__init__.py b/mmdet/models/roi_heads/roi_extractors/__init__.py new file mode 100644 index 0000000..0f60214 --- /dev/null +++ b/mmdet/models/roi_heads/roi_extractors/__init__.py @@ -0,0 +1,6 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .base_roi_extractor import BaseRoIExtractor +from .generic_roi_extractor import GenericRoIExtractor +from .single_level_roi_extractor import SingleRoIExtractor + +__all__ = ['BaseRoIExtractor', 'SingleRoIExtractor', 'GenericRoIExtractor'] diff --git a/mmdet/models/roi_heads/roi_extractors/base_roi_extractor.py b/mmdet/models/roi_heads/roi_extractors/base_roi_extractor.py new file mode 100644 index 0000000..8262975 --- /dev/null +++ b/mmdet/models/roi_heads/roi_extractors/base_roi_extractor.py @@ -0,0 +1,88 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from abc import ABCMeta, abstractmethod + +import torch +import torch.nn as nn +from mmcv import ops +from mmcv.runner import BaseModule + + +class BaseRoIExtractor(BaseModule, metaclass=ABCMeta): + """Base class for RoI extractor. + + Args: + roi_layer (dict): Specify RoI layer type and arguments. + out_channels (int): Output channels of RoI layers. + featmap_strides (int): Strides of input feature maps. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + roi_layer, + out_channels, + featmap_strides, + init_cfg=None): + super(BaseRoIExtractor, self).__init__(init_cfg) + self.roi_layers = self.build_roi_layers(roi_layer, featmap_strides) + self.out_channels = out_channels + self.featmap_strides = featmap_strides + self.fp16_enabled = False + + @property + def num_inputs(self): + """int: Number of input feature maps.""" + return len(self.featmap_strides) + + def build_roi_layers(self, layer_cfg, featmap_strides): + """Build RoI operator to extract feature from each level feature map. + + Args: + layer_cfg (dict): Dictionary to construct and config RoI layer + operation. Options are modules under ``mmcv/ops`` such as + ``RoIAlign``. + featmap_strides (List[int]): The stride of input feature map w.r.t + to the original image size, which would be used to scale RoI + coordinate (original image coordinate system) to feature + coordinate system. + + Returns: + nn.ModuleList: The RoI extractor modules for each level feature + map. + """ + + cfg = layer_cfg.copy() + layer_type = cfg.pop('type') + assert hasattr(ops, layer_type) + layer_cls = getattr(ops, layer_type) + roi_layers = nn.ModuleList( + [layer_cls(spatial_scale=1 / s, **cfg) for s in featmap_strides]) + return roi_layers + + def roi_rescale(self, rois, scale_factor): + """Scale RoI coordinates by scale factor. + + Args: + rois (torch.Tensor): RoI (Region of Interest), shape (n, 5) + scale_factor (float): Scale factor that RoI will be multiplied by. + + Returns: + torch.Tensor: Scaled RoI. + """ + + cx = (rois[:, 1] + rois[:, 3]) * 0.5 + cy = (rois[:, 2] + rois[:, 4]) * 0.5 + w = rois[:, 3] - rois[:, 1] + h = rois[:, 4] - rois[:, 2] + new_w = w * scale_factor + new_h = h * scale_factor + x1 = cx - new_w * 0.5 + x2 = cx + new_w * 0.5 + y1 = cy - new_h * 0.5 + y2 = cy + new_h * 0.5 + new_rois = torch.stack((rois[:, 0], x1, y1, x2, y2), dim=-1) + return new_rois + + @abstractmethod + def forward(self, feats, rois, roi_scale_factor=None): + pass diff --git a/mmdet/models/roi_heads/roi_extractors/generic_roi_extractor.py b/mmdet/models/roi_heads/roi_extractors/generic_roi_extractor.py new file mode 100644 index 0000000..89a9f89 --- /dev/null +++ b/mmdet/models/roi_heads/roi_extractors/generic_roi_extractor.py @@ -0,0 +1,84 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmcv.cnn.bricks import build_plugin_layer +from mmcv.runner import force_fp32 + +from mmdet.models.builder import ROI_EXTRACTORS +from .base_roi_extractor import BaseRoIExtractor + + +@ROI_EXTRACTORS.register_module() +class GenericRoIExtractor(BaseRoIExtractor): + """Extract RoI features from all level feature maps levels. + + This is the implementation of `A novel Region of Interest Extraction Layer + for Instance Segmentation `_. + + Args: + aggregation (str): The method to aggregate multiple feature maps. + Options are 'sum', 'concat'. Default: 'sum'. + pre_cfg (dict | None): Specify pre-processing modules. Default: None. + post_cfg (dict | None): Specify post-processing modules. Default: None. + kwargs (keyword arguments): Arguments that are the same + as :class:`BaseRoIExtractor`. + """ + + def __init__(self, + aggregation='sum', + pre_cfg=None, + post_cfg=None, + **kwargs): + super(GenericRoIExtractor, self).__init__(**kwargs) + + assert aggregation in ['sum', 'concat'] + + self.aggregation = aggregation + self.with_post = post_cfg is not None + self.with_pre = pre_cfg is not None + # build pre/post processing modules + if self.with_post: + self.post_module = build_plugin_layer(post_cfg, '_post_module')[1] + if self.with_pre: + self.pre_module = build_plugin_layer(pre_cfg, '_pre_module')[1] + + @force_fp32(apply_to=('feats', ), out_fp16=True) + def forward(self, feats, rois, roi_scale_factor=None): + """Forward function.""" + if len(feats) == 1: + return self.roi_layers[0](feats[0], rois) + + out_size = self.roi_layers[0].output_size + num_levels = len(feats) + roi_feats = feats[0].new_zeros( + rois.size(0), self.out_channels, *out_size) + + # some times rois is an empty tensor + if roi_feats.shape[0] == 0: + return roi_feats + + if roi_scale_factor is not None: + rois = self.roi_rescale(rois, roi_scale_factor) + + # mark the starting channels for concat mode + start_channels = 0 + for i in range(num_levels): + roi_feats_t = self.roi_layers[i](feats[i], rois) + end_channels = start_channels + roi_feats_t.size(1) + if self.with_pre: + # apply pre-processing to a RoI extracted from each layer + roi_feats_t = self.pre_module(roi_feats_t) + if self.aggregation == 'sum': + # and sum them all + roi_feats = roi_feats + roi_feats_t + else: + # and concat them along channel dimension + roi_feats[:, start_channels:end_channels] = roi_feats_t + # update channels starting position + start_channels = end_channels + # check if concat channels match at the end + if self.aggregation == 'concat': + assert start_channels == self.out_channels + + if self.with_post: + # apply post-processing before return the result + roi_feats = self.post_module(roi_feats) + return roi_feats diff --git a/mmdet/models/roi_heads/roi_extractors/single_level_roi_extractor.py b/mmdet/models/roi_heads/roi_extractors/single_level_roi_extractor.py new file mode 100644 index 0000000..dbc5aef --- /dev/null +++ b/mmdet/models/roi_heads/roi_extractors/single_level_roi_extractor.py @@ -0,0 +1,112 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +from mmcv.runner import force_fp32 + +from mmdet.models.builder import ROI_EXTRACTORS +from .base_roi_extractor import BaseRoIExtractor + + +@ROI_EXTRACTORS.register_module() +class SingleRoIExtractor(BaseRoIExtractor): + """Extract RoI features from a single level feature map. + + If there are multiple input feature levels, each RoI is mapped to a level + according to its scale. The mapping rule is proposed in + `FPN `_. + + Args: + roi_layer (dict): Specify RoI layer type and arguments. + out_channels (int): Output channels of RoI layers. + featmap_strides (List[int]): Strides of input feature maps. + finest_scale (int): Scale threshold of mapping to level 0. Default: 56. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + roi_layer, + out_channels, + featmap_strides, + finest_scale=56, + init_cfg=None): + super(SingleRoIExtractor, self).__init__(roi_layer, out_channels, + featmap_strides, init_cfg) + self.finest_scale = finest_scale + + def map_roi_levels(self, rois, num_levels): + """Map rois to corresponding feature levels by scales. + + - scale < finest_scale * 2: level 0 + - finest_scale * 2 <= scale < finest_scale * 4: level 1 + - finest_scale * 4 <= scale < finest_scale * 8: level 2 + - scale >= finest_scale * 8: level 3 + + Args: + rois (Tensor): Input RoIs, shape (k, 5). + num_levels (int): Total level number. + + Returns: + Tensor: Level index (0-based) of each RoI, shape (k, ) + """ + scale = torch.sqrt( + (rois[:, 3] - rois[:, 1]) * (rois[:, 4] - rois[:, 2])) + target_lvls = torch.floor(torch.log2(scale / self.finest_scale + 1e-6)) + target_lvls = target_lvls.clamp(min=0, max=num_levels - 1).long() + return target_lvls + + @force_fp32(apply_to=('feats', ), out_fp16=True) + def forward(self, feats, rois, roi_scale_factor=None): + """Forward function.""" + out_size = self.roi_layers[0].output_size + num_levels = len(feats) + expand_dims = (-1, self.out_channels * out_size[0] * out_size[1]) + if torch.onnx.is_in_onnx_export(): + # Work around to export mask-rcnn to onnx + roi_feats = rois[:, :1].clone().detach() + roi_feats = roi_feats.expand(*expand_dims) + roi_feats = roi_feats.reshape(-1, self.out_channels, *out_size) + roi_feats = roi_feats * 0 + else: + roi_feats = feats[0].new_zeros( + rois.size(0), self.out_channels, *out_size) + + if num_levels == 1: + if len(rois) == 0: + return roi_feats + return self.roi_layers[0](feats[0], rois) + + target_lvls = self.map_roi_levels(rois, num_levels) + + if roi_scale_factor is not None: + rois = self.roi_rescale(rois, roi_scale_factor) + + for i in range(num_levels): + mask = target_lvls == i + if torch.onnx.is_in_onnx_export(): + # To keep all roi_align nodes exported to onnx + # and skip nonzero op + mask = mask.float().unsqueeze(-1) + # select target level rois and reset the rest rois to zero. + rois_i = rois.clone().detach() + rois_i = rois_i * mask + mask_exp = mask.expand(*expand_dims).reshape(roi_feats.shape) + roi_feats_t = self.roi_layers[i](feats[i], rois_i) + roi_feats_t = roi_feats_t * mask_exp + roi_feats = roi_feats + roi_feats_t + continue + inds = mask.nonzero(as_tuple=False).squeeze(1) + if inds.numel() > 0: + rois_ = rois[inds] + roi_feats_t = self.roi_layers[i](feats[i], rois_) + roi_feats[inds] = roi_feats_t + else: + # Sometimes some pyramid levels will not be used for RoI + # feature extraction and this will cause an incomplete + # computation graph in one GPU, which is different from those + # in other GPUs and will cause a hanging error. + # Therefore, we add it to ensure each feature pyramid is + # included in the computation graph to avoid runtime bugs. + roi_feats = roi_feats + sum( + x.view(-1)[0] + for x in self.parameters()) * 0. + feats[i].sum() * 0. + return roi_feats diff --git a/mmdet/models/roi_heads/scnet_roi_head.py b/mmdet/models/roi_heads/scnet_roi_head.py new file mode 100644 index 0000000..32f56aa --- /dev/null +++ b/mmdet/models/roi_heads/scnet_roi_head.py @@ -0,0 +1,605 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import torch +import torch.nn.functional as F + +from mmdet.core import (bbox2result, bbox2roi, bbox_mapping, merge_aug_bboxes, + merge_aug_masks, multiclass_nms) +from ..builder import HEADS, build_head, build_roi_extractor +from ..utils.brick_wrappers import adaptive_avg_pool2d +from .cascade_roi_head import CascadeRoIHead + + +@HEADS.register_module() +class SCNetRoIHead(CascadeRoIHead): + """RoIHead for `SCNet `_. + + Args: + num_stages (int): number of cascade stages. + stage_loss_weights (list): loss weight of cascade stages. + semantic_roi_extractor (dict): config to init semantic roi extractor. + semantic_head (dict): config to init semantic head. + feat_relay_head (dict): config to init feature_relay_head. + glbctx_head (dict): config to init global context head. + """ + + def __init__(self, + num_stages, + stage_loss_weights, + semantic_roi_extractor=None, + semantic_head=None, + feat_relay_head=None, + glbctx_head=None, + **kwargs): + super(SCNetRoIHead, self).__init__(num_stages, stage_loss_weights, + **kwargs) + assert self.with_bbox and self.with_mask + assert not self.with_shared_head # shared head is not supported + + if semantic_head is not None: + self.semantic_roi_extractor = build_roi_extractor( + semantic_roi_extractor) + self.semantic_head = build_head(semantic_head) + + if feat_relay_head is not None: + self.feat_relay_head = build_head(feat_relay_head) + + if glbctx_head is not None: + self.glbctx_head = build_head(glbctx_head) + + def init_mask_head(self, mask_roi_extractor, mask_head): + """Initialize ``mask_head``""" + if mask_roi_extractor is not None: + self.mask_roi_extractor = build_roi_extractor(mask_roi_extractor) + self.mask_head = build_head(mask_head) + + @property + def with_semantic(self): + """bool: whether the head has semantic head""" + return hasattr(self, + 'semantic_head') and self.semantic_head is not None + + @property + def with_feat_relay(self): + """bool: whether the head has feature relay head""" + return (hasattr(self, 'feat_relay_head') + and self.feat_relay_head is not None) + + @property + def with_glbctx(self): + """bool: whether the head has global context head""" + return hasattr(self, 'glbctx_head') and self.glbctx_head is not None + + def _fuse_glbctx(self, roi_feats, glbctx_feat, rois): + """Fuse global context feats with roi feats.""" + assert roi_feats.size(0) == rois.size(0) + img_inds = torch.unique(rois[:, 0].cpu(), sorted=True).long() + fused_feats = torch.zeros_like(roi_feats) + for img_id in img_inds: + inds = (rois[:, 0] == img_id.item()) + fused_feats[inds] = roi_feats[inds] + glbctx_feat[img_id] + return fused_feats + + def _slice_pos_feats(self, feats, sampling_results): + """Get features from pos rois.""" + num_rois = [res.bboxes.size(0) for res in sampling_results] + num_pos_rois = [res.pos_bboxes.size(0) for res in sampling_results] + inds = torch.zeros(sum(num_rois), dtype=torch.bool) + start = 0 + for i in range(len(num_rois)): + start = 0 if i == 0 else start + num_rois[i - 1] + stop = start + num_pos_rois[i] + inds[start:stop] = 1 + sliced_feats = feats[inds] + return sliced_feats + + def _bbox_forward(self, + stage, + x, + rois, + semantic_feat=None, + glbctx_feat=None): + """Box head forward function used in both training and testing.""" + bbox_roi_extractor = self.bbox_roi_extractor[stage] + bbox_head = self.bbox_head[stage] + bbox_feats = bbox_roi_extractor( + x[:len(bbox_roi_extractor.featmap_strides)], rois) + if self.with_semantic and semantic_feat is not None: + bbox_semantic_feat = self.semantic_roi_extractor([semantic_feat], + rois) + if bbox_semantic_feat.shape[-2:] != bbox_feats.shape[-2:]: + bbox_semantic_feat = adaptive_avg_pool2d( + bbox_semantic_feat, bbox_feats.shape[-2:]) + bbox_feats = bbox_feats + bbox_semantic_feat + if self.with_glbctx and glbctx_feat is not None: + bbox_feats = self._fuse_glbctx(bbox_feats, glbctx_feat, rois) + cls_score, bbox_pred, relayed_feat = bbox_head( + bbox_feats, return_shared_feat=True) + + bbox_results = dict( + cls_score=cls_score, + bbox_pred=bbox_pred, + relayed_feat=relayed_feat) + return bbox_results + + def _mask_forward(self, + x, + rois, + semantic_feat=None, + glbctx_feat=None, + relayed_feat=None): + """Mask head forward function used in both training and testing.""" + mask_feats = self.mask_roi_extractor( + x[:self.mask_roi_extractor.num_inputs], rois) + if self.with_semantic and semantic_feat is not None: + mask_semantic_feat = self.semantic_roi_extractor([semantic_feat], + rois) + if mask_semantic_feat.shape[-2:] != mask_feats.shape[-2:]: + mask_semantic_feat = F.adaptive_avg_pool2d( + mask_semantic_feat, mask_feats.shape[-2:]) + mask_feats = mask_feats + mask_semantic_feat + if self.with_glbctx and glbctx_feat is not None: + mask_feats = self._fuse_glbctx(mask_feats, glbctx_feat, rois) + if self.with_feat_relay and relayed_feat is not None: + mask_feats = mask_feats + relayed_feat + mask_pred = self.mask_head(mask_feats) + mask_results = dict(mask_pred=mask_pred) + + return mask_results + + def _bbox_forward_train(self, + stage, + x, + sampling_results, + gt_bboxes, + gt_labels, + rcnn_train_cfg, + semantic_feat=None, + glbctx_feat=None): + """Run forward function and calculate loss for box head in training.""" + bbox_head = self.bbox_head[stage] + rois = bbox2roi([res.bboxes for res in sampling_results]) + bbox_results = self._bbox_forward( + stage, + x, + rois, + semantic_feat=semantic_feat, + glbctx_feat=glbctx_feat) + + bbox_targets = bbox_head.get_targets(sampling_results, gt_bboxes, + gt_labels, rcnn_train_cfg) + loss_bbox = bbox_head.loss(bbox_results['cls_score'], + bbox_results['bbox_pred'], rois, + *bbox_targets) + + bbox_results.update( + loss_bbox=loss_bbox, rois=rois, bbox_targets=bbox_targets) + return bbox_results + + def _mask_forward_train(self, + x, + sampling_results, + gt_masks, + rcnn_train_cfg, + semantic_feat=None, + glbctx_feat=None, + relayed_feat=None): + """Run forward function and calculate loss for mask head in + training.""" + pos_rois = bbox2roi([res.pos_bboxes for res in sampling_results]) + mask_results = self._mask_forward( + x, + pos_rois, + semantic_feat=semantic_feat, + glbctx_feat=glbctx_feat, + relayed_feat=relayed_feat) + + mask_targets = self.mask_head.get_targets(sampling_results, gt_masks, + rcnn_train_cfg) + pos_labels = torch.cat([res.pos_gt_labels for res in sampling_results]) + loss_mask = self.mask_head.loss(mask_results['mask_pred'], + mask_targets, pos_labels) + + mask_results = loss_mask + return mask_results + + def forward_train(self, + x, + img_metas, + proposal_list, + gt_bboxes, + gt_labels, + gt_bboxes_ignore=None, + gt_masks=None, + gt_semantic_seg=None): + """ + Args: + x (list[Tensor]): list of multi-level img features. + img_metas (list[dict]): list of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmdet/datasets/pipelines/formatting.py:Collect`. + proposal_list (list[Tensors]): list of region proposals. + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + gt_bboxes_ignore (None, list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. + gt_masks (None, Tensor) : true segmentation masks for each box + used if the architecture supports a segmentation task. + gt_semantic_seg (None, list[Tensor]): semantic segmentation masks + used if the architecture supports semantic segmentation task. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + losses = dict() + + # semantic segmentation branch + if self.with_semantic: + semantic_pred, semantic_feat = self.semantic_head(x) + loss_seg = self.semantic_head.loss(semantic_pred, gt_semantic_seg) + losses['loss_semantic_seg'] = loss_seg + else: + semantic_feat = None + + # global context branch + if self.with_glbctx: + mc_pred, glbctx_feat = self.glbctx_head(x) + loss_glbctx = self.glbctx_head.loss(mc_pred, gt_labels) + losses['loss_glbctx'] = loss_glbctx + else: + glbctx_feat = None + + for i in range(self.num_stages): + self.current_stage = i + rcnn_train_cfg = self.train_cfg[i] + lw = self.stage_loss_weights[i] + + # assign gts and sample proposals + sampling_results = [] + bbox_assigner = self.bbox_assigner[i] + bbox_sampler = self.bbox_sampler[i] + num_imgs = len(img_metas) + if gt_bboxes_ignore is None: + gt_bboxes_ignore = [None for _ in range(num_imgs)] + + for j in range(num_imgs): + assign_result = bbox_assigner.assign(proposal_list[j], + gt_bboxes[j], + gt_bboxes_ignore[j], + gt_labels[j]) + sampling_result = bbox_sampler.sample( + assign_result, + proposal_list[j], + gt_bboxes[j], + gt_labels[j], + feats=[lvl_feat[j][None] for lvl_feat in x]) + sampling_results.append(sampling_result) + + bbox_results = \ + self._bbox_forward_train( + i, x, sampling_results, gt_bboxes, gt_labels, + rcnn_train_cfg, semantic_feat, glbctx_feat) + roi_labels = bbox_results['bbox_targets'][0] + + for name, value in bbox_results['loss_bbox'].items(): + losses[f's{i}.{name}'] = ( + value * lw if 'loss' in name else value) + + # refine boxes + if i < self.num_stages - 1: + pos_is_gts = [res.pos_is_gt for res in sampling_results] + with torch.no_grad(): + proposal_list = self.bbox_head[i].refine_bboxes( + bbox_results['rois'], roi_labels, + bbox_results['bbox_pred'], pos_is_gts, img_metas) + + if self.with_feat_relay: + relayed_feat = self._slice_pos_feats(bbox_results['relayed_feat'], + sampling_results) + relayed_feat = self.feat_relay_head(relayed_feat) + else: + relayed_feat = None + + mask_results = self._mask_forward_train(x, sampling_results, gt_masks, + rcnn_train_cfg, semantic_feat, + glbctx_feat, relayed_feat) + mask_lw = sum(self.stage_loss_weights) + losses['loss_mask'] = mask_lw * mask_results['loss_mask'] + + return losses + + def simple_test(self, x, proposal_list, img_metas, rescale=False): + """Test without augmentation. + + Args: + x (tuple[Tensor]): Features from upstream network. Each + has shape (batch_size, c, h, w). + proposal_list (list(Tensor)): Proposals from rpn head. + Each has shape (num_proposals, 5), last dimension + 5 represent (x1, y1, x2, y2, score). + img_metas (list[dict]): Meta information of images. + rescale (bool): Whether to rescale the results to + the original image. Default: True. + + Returns: + list[list[np.ndarray]] or list[tuple]: When no mask branch, + it is bbox results of each image and classes with type + `list[list[np.ndarray]]`. The outer list + corresponds to each image. The inner list + corresponds to each class. When the model has mask branch, + it contains bbox results and mask results. + The outer list corresponds to each image, and first element + of tuple is bbox results, second element is mask results. + """ + if self.with_semantic: + _, semantic_feat = self.semantic_head(x) + else: + semantic_feat = None + + if self.with_glbctx: + mc_pred, glbctx_feat = self.glbctx_head(x) + else: + glbctx_feat = None + + num_imgs = len(proposal_list) + img_shapes = tuple(meta['img_shape'] for meta in img_metas) + ori_shapes = tuple(meta['ori_shape'] for meta in img_metas) + scale_factors = tuple(meta['scale_factor'] for meta in img_metas) + + # "ms" in variable names means multi-stage + ms_scores = [] + rcnn_test_cfg = self.test_cfg + + rois = bbox2roi(proposal_list) + + if rois.shape[0] == 0: + # There is no proposal in the whole batch + bbox_results = [[ + np.zeros((0, 5), dtype=np.float32) + for _ in range(self.bbox_head[-1].num_classes) + ]] * num_imgs + + if self.with_mask: + mask_classes = self.mask_head.num_classes + segm_results = [[[] for _ in range(mask_classes)] + for _ in range(num_imgs)] + results = list(zip(bbox_results, segm_results)) + else: + results = bbox_results + + return results + + for i in range(self.num_stages): + bbox_head = self.bbox_head[i] + bbox_results = self._bbox_forward( + i, + x, + rois, + semantic_feat=semantic_feat, + glbctx_feat=glbctx_feat) + # split batch bbox prediction back to each image + cls_score = bbox_results['cls_score'] + bbox_pred = bbox_results['bbox_pred'] + num_proposals_per_img = tuple(len(p) for p in proposal_list) + rois = rois.split(num_proposals_per_img, 0) + cls_score = cls_score.split(num_proposals_per_img, 0) + bbox_pred = bbox_pred.split(num_proposals_per_img, 0) + ms_scores.append(cls_score) + + if i < self.num_stages - 1: + refine_rois_list = [] + for j in range(num_imgs): + if rois[j].shape[0] > 0: + bbox_label = cls_score[j][:, :-1].argmax(dim=1) + refine_rois = bbox_head.regress_by_class( + rois[j], bbox_label, bbox_pred[j], img_metas[j]) + refine_rois_list.append(refine_rois) + rois = torch.cat(refine_rois_list) + + # average scores of each image by stages + cls_score = [ + sum([score[i] for score in ms_scores]) / float(len(ms_scores)) + for i in range(num_imgs) + ] + + # apply bbox post-processing to each image individually + det_bboxes = [] + det_labels = [] + for i in range(num_imgs): + det_bbox, det_label = self.bbox_head[-1].get_bboxes( + rois[i], + cls_score[i], + bbox_pred[i], + img_shapes[i], + scale_factors[i], + rescale=rescale, + cfg=rcnn_test_cfg) + det_bboxes.append(det_bbox) + det_labels.append(det_label) + det_bbox_results = [ + bbox2result(det_bboxes[i], det_labels[i], + self.bbox_head[-1].num_classes) + for i in range(num_imgs) + ] + + if self.with_mask: + if all(det_bbox.shape[0] == 0 for det_bbox in det_bboxes): + mask_classes = self.mask_head.num_classes + det_segm_results = [[[] for _ in range(mask_classes)] + for _ in range(num_imgs)] + else: + if rescale and not isinstance(scale_factors[0], float): + scale_factors = [ + torch.from_numpy(scale_factor).to(det_bboxes[0].device) + for scale_factor in scale_factors + ] + _bboxes = [ + det_bboxes[i][:, :4] * + scale_factors[i] if rescale else det_bboxes[i] + for i in range(num_imgs) + ] + mask_rois = bbox2roi(_bboxes) + + # get relay feature on mask_rois + bbox_results = self._bbox_forward( + -1, + x, + mask_rois, + semantic_feat=semantic_feat, + glbctx_feat=glbctx_feat) + relayed_feat = bbox_results['relayed_feat'] + relayed_feat = self.feat_relay_head(relayed_feat) + + mask_results = self._mask_forward( + x, + mask_rois, + semantic_feat=semantic_feat, + glbctx_feat=glbctx_feat, + relayed_feat=relayed_feat) + mask_pred = mask_results['mask_pred'] + + # split batch mask prediction back to each image + num_bbox_per_img = tuple(len(_bbox) for _bbox in _bboxes) + mask_preds = mask_pred.split(num_bbox_per_img, 0) + + # apply mask post-processing to each image individually + det_segm_results = [] + for i in range(num_imgs): + if det_bboxes[i].shape[0] == 0: + det_segm_results.append( + [[] for _ in range(self.mask_head.num_classes)]) + else: + segm_result = self.mask_head.get_seg_masks( + mask_preds[i], _bboxes[i], det_labels[i], + self.test_cfg, ori_shapes[i], scale_factors[i], + rescale) + det_segm_results.append(segm_result) + + # return results + if self.with_mask: + return list(zip(det_bbox_results, det_segm_results)) + else: + return det_bbox_results + + def aug_test(self, img_feats, proposal_list, img_metas, rescale=False): + if self.with_semantic: + semantic_feats = [ + self.semantic_head(feat)[1] for feat in img_feats + ] + else: + semantic_feats = [None] * len(img_metas) + + if self.with_glbctx: + glbctx_feats = [self.glbctx_head(feat)[1] for feat in img_feats] + else: + glbctx_feats = [None] * len(img_metas) + + rcnn_test_cfg = self.test_cfg + aug_bboxes = [] + aug_scores = [] + for x, img_meta, semantic_feat, glbctx_feat in zip( + img_feats, img_metas, semantic_feats, glbctx_feats): + # only one image in the batch + img_shape = img_meta[0]['img_shape'] + scale_factor = img_meta[0]['scale_factor'] + flip = img_meta[0]['flip'] + + proposals = bbox_mapping(proposal_list[0][:, :4], img_shape, + scale_factor, flip) + # "ms" in variable names means multi-stage + ms_scores = [] + + rois = bbox2roi([proposals]) + + if rois.shape[0] == 0: + # There is no proposal in the single image + aug_bboxes.append(rois.new_zeros(0, 4)) + aug_scores.append(rois.new_zeros(0, 1)) + continue + + for i in range(self.num_stages): + bbox_head = self.bbox_head[i] + bbox_results = self._bbox_forward( + i, + x, + rois, + semantic_feat=semantic_feat, + glbctx_feat=glbctx_feat) + ms_scores.append(bbox_results['cls_score']) + if i < self.num_stages - 1: + bbox_label = bbox_results['cls_score'].argmax(dim=1) + rois = bbox_head.regress_by_class( + rois, bbox_label, bbox_results['bbox_pred'], + img_meta[0]) + + cls_score = sum(ms_scores) / float(len(ms_scores)) + bboxes, scores = self.bbox_head[-1].get_bboxes( + rois, + cls_score, + bbox_results['bbox_pred'], + img_shape, + scale_factor, + rescale=False, + cfg=None) + aug_bboxes.append(bboxes) + aug_scores.append(scores) + + # after merging, bboxes will be rescaled to the original image size + merged_bboxes, merged_scores = merge_aug_bboxes( + aug_bboxes, aug_scores, img_metas, rcnn_test_cfg) + det_bboxes, det_labels = multiclass_nms(merged_bboxes, merged_scores, + rcnn_test_cfg.score_thr, + rcnn_test_cfg.nms, + rcnn_test_cfg.max_per_img) + + det_bbox_results = bbox2result(det_bboxes, det_labels, + self.bbox_head[-1].num_classes) + + if self.with_mask: + if det_bboxes.shape[0] == 0: + det_segm_results = [[] + for _ in range(self.mask_head.num_classes)] + else: + aug_masks = [] + for x, img_meta, semantic_feat, glbctx_feat in zip( + img_feats, img_metas, semantic_feats, glbctx_feats): + img_shape = img_meta[0]['img_shape'] + scale_factor = img_meta[0]['scale_factor'] + flip = img_meta[0]['flip'] + _bboxes = bbox_mapping(det_bboxes[:, :4], img_shape, + scale_factor, flip) + mask_rois = bbox2roi([_bboxes]) + # get relay feature on mask_rois + bbox_results = self._bbox_forward( + -1, + x, + mask_rois, + semantic_feat=semantic_feat, + glbctx_feat=glbctx_feat) + relayed_feat = bbox_results['relayed_feat'] + relayed_feat = self.feat_relay_head(relayed_feat) + mask_results = self._mask_forward( + x, + mask_rois, + semantic_feat=semantic_feat, + glbctx_feat=glbctx_feat, + relayed_feat=relayed_feat) + mask_pred = mask_results['mask_pred'] + aug_masks.append(mask_pred.sigmoid().cpu().numpy()) + merged_masks = merge_aug_masks(aug_masks, img_metas, + self.test_cfg) + ori_shape = img_metas[0][0]['ori_shape'] + det_segm_results = self.mask_head.get_seg_masks( + merged_masks, + det_bboxes, + det_labels, + rcnn_test_cfg, + ori_shape, + scale_factor=1.0, + rescale=False) + return [(det_bbox_results, det_segm_results)] + else: + return [det_bbox_results] diff --git a/mmdet/models/roi_heads/shared_heads/__init__.py b/mmdet/models/roi_heads/shared_heads/__init__.py new file mode 100644 index 0000000..d56636a --- /dev/null +++ b/mmdet/models/roi_heads/shared_heads/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .res_layer import ResLayer + +__all__ = ['ResLayer'] diff --git a/mmdet/models/roi_heads/shared_heads/res_layer.py b/mmdet/models/roi_heads/shared_heads/res_layer.py new file mode 100644 index 0000000..bef00a0 --- /dev/null +++ b/mmdet/models/roi_heads/shared_heads/res_layer.py @@ -0,0 +1,80 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch.nn as nn +from mmcv.runner import BaseModule, auto_fp16 + +from mmdet.models.backbones import ResNet +from mmdet.models.builder import SHARED_HEADS +from mmdet.models.utils import ResLayer as _ResLayer + + +@SHARED_HEADS.register_module() +class ResLayer(BaseModule): + + def __init__(self, + depth, + stage=3, + stride=2, + dilation=1, + style='pytorch', + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + with_cp=False, + dcn=None, + pretrained=None, + init_cfg=None): + super(ResLayer, self).__init__(init_cfg) + + self.norm_eval = norm_eval + self.norm_cfg = norm_cfg + self.stage = stage + self.fp16_enabled = False + block, stage_blocks = ResNet.arch_settings[depth] + stage_block = stage_blocks[stage] + planes = 64 * 2**stage + inplanes = 64 * 2**(stage - 1) * block.expansion + + res_layer = _ResLayer( + block, + inplanes, + planes, + stage_block, + stride=stride, + dilation=dilation, + style=style, + with_cp=with_cp, + norm_cfg=self.norm_cfg, + dcn=dcn) + self.add_module(f'layer{stage + 1}', res_layer) + + assert not (init_cfg and pretrained), \ + 'init_cfg and pretrained cannot be specified at the same time' + if isinstance(pretrained, str): + warnings.warn('DeprecationWarning: pretrained is a deprecated, ' + 'please use "init_cfg" instead') + self.init_cfg = dict(type='Pretrained', checkpoint=pretrained) + elif pretrained is None: + if init_cfg is None: + self.init_cfg = [ + dict(type='Kaiming', layer='Conv2d'), + dict( + type='Constant', + val=1, + layer=['_BatchNorm', 'GroupNorm']) + ] + else: + raise TypeError('pretrained must be a str or None') + + @auto_fp16() + def forward(self, x): + res_layer = getattr(self, f'layer{self.stage + 1}') + out = res_layer(x) + return out + + def train(self, mode=True): + super(ResLayer, self).train(mode) + if self.norm_eval: + for m in self.modules(): + if isinstance(m, nn.BatchNorm2d): + m.eval() diff --git a/mmdet/models/roi_heads/sparse_roi_head.py b/mmdet/models/roi_heads/sparse_roi_head.py new file mode 100644 index 0000000..2613469 --- /dev/null +++ b/mmdet/models/roi_heads/sparse_roi_head.py @@ -0,0 +1,424 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import torch + +from mmdet.core import bbox2result, bbox2roi, bbox_xyxy_to_cxcywh +from mmdet.core.bbox.samplers import PseudoSampler +from ..builder import HEADS +from .cascade_roi_head import CascadeRoIHead + + +@HEADS.register_module() +class SparseRoIHead(CascadeRoIHead): + r"""The RoIHead for `Sparse R-CNN: End-to-End Object Detection with + Learnable Proposals `_ + and `Instances as Queries `_ + + Args: + num_stages (int): Number of stage whole iterative process. + Defaults to 6. + stage_loss_weights (Tuple[float]): The loss + weight of each stage. By default all stages have + the same weight 1. + bbox_roi_extractor (dict): Config of box roi extractor. + mask_roi_extractor (dict): Config of mask roi extractor. + bbox_head (dict): Config of box head. + mask_head (dict): Config of mask head. + train_cfg (dict, optional): Configuration information in train stage. + Defaults to None. + test_cfg (dict, optional): Configuration information in test stage. + Defaults to None. + pretrained (str, optional): model pretrained path. Default: None + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + + """ + + def __init__(self, + num_stages=6, + stage_loss_weights=(1, 1, 1, 1, 1, 1), + proposal_feature_channel=256, + bbox_roi_extractor=dict( + type='SingleRoIExtractor', + roi_layer=dict( + type='RoIAlign', output_size=7, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32]), + mask_roi_extractor=None, + bbox_head=dict( + type='DIIHead', + num_classes=80, + num_fcs=2, + num_heads=8, + num_cls_fcs=1, + num_reg_fcs=3, + feedforward_channels=2048, + hidden_channels=256, + dropout=0.0, + roi_feat_size=7, + ffn_act_cfg=dict(type='ReLU', inplace=True)), + mask_head=None, + train_cfg=None, + test_cfg=None, + pretrained=None, + init_cfg=None): + assert bbox_roi_extractor is not None + assert bbox_head is not None + assert len(stage_loss_weights) == num_stages + self.num_stages = num_stages + self.stage_loss_weights = stage_loss_weights + self.proposal_feature_channel = proposal_feature_channel + super(SparseRoIHead, self).__init__( + num_stages, + stage_loss_weights, + bbox_roi_extractor=bbox_roi_extractor, + mask_roi_extractor=mask_roi_extractor, + bbox_head=bbox_head, + mask_head=mask_head, + train_cfg=train_cfg, + test_cfg=test_cfg, + pretrained=pretrained, + init_cfg=init_cfg) + # train_cfg would be None when run the test.py + if train_cfg is not None: + for stage in range(num_stages): + assert isinstance(self.bbox_sampler[stage], PseudoSampler), \ + 'Sparse R-CNN and QueryInst only support `PseudoSampler`' + + def _bbox_forward(self, stage, x, rois, object_feats, img_metas): + """Box head forward function used in both training and testing. Returns + all regression, classification results and a intermediate feature. + + Args: + stage (int): The index of current stage in + iterative process. + x (List[Tensor]): List of FPN features + rois (Tensor): Rois in total batch. With shape (num_proposal, 5). + the last dimension 5 represents (img_index, x1, y1, x2, y2). + object_feats (Tensor): The object feature extracted from + the previous stage. + img_metas (dict): meta information of images. + + Returns: + dict[str, Tensor]: a dictionary of bbox head outputs, + Containing the following results: + + - cls_score (Tensor): The score of each class, has + shape (batch_size, num_proposals, num_classes) + when use focal loss or + (batch_size, num_proposals, num_classes+1) + otherwise. + - decode_bbox_pred (Tensor): The regression results + with shape (batch_size, num_proposal, 4). + The last dimension 4 represents + [tl_x, tl_y, br_x, br_y]. + - object_feats (Tensor): The object feature extracted + from current stage + - detach_cls_score_list (list[Tensor]): The detached + classification results, length is batch_size, and + each tensor has shape (num_proposal, num_classes). + - detach_proposal_list (list[tensor]): The detached + regression results, length is batch_size, and each + tensor has shape (num_proposal, 4). The last + dimension 4 represents [tl_x, tl_y, br_x, br_y]. + """ + num_imgs = len(img_metas) + bbox_roi_extractor = self.bbox_roi_extractor[stage] + bbox_head = self.bbox_head[stage] + bbox_feats = bbox_roi_extractor(x[:bbox_roi_extractor.num_inputs], + rois) + cls_score, bbox_pred, object_feats, attn_feats = bbox_head( + bbox_feats, object_feats) + proposal_list = self.bbox_head[stage].refine_bboxes( + rois, + rois.new_zeros(len(rois)), # dummy arg + bbox_pred.view(-1, bbox_pred.size(-1)), + [rois.new_zeros(object_feats.size(1)) for _ in range(num_imgs)], + img_metas) + bbox_results = dict( + cls_score=cls_score, + decode_bbox_pred=torch.cat(proposal_list), + object_feats=object_feats, + attn_feats=attn_feats, + # detach then use it in label assign + detach_cls_score_list=[ + cls_score[i].detach() for i in range(num_imgs) + ], + detach_proposal_list=[item.detach() for item in proposal_list]) + + return bbox_results + + def _mask_forward(self, stage, x, rois, attn_feats): + """Mask head forward function used in both training and testing.""" + mask_roi_extractor = self.mask_roi_extractor[stage] + mask_head = self.mask_head[stage] + mask_feats = mask_roi_extractor(x[:mask_roi_extractor.num_inputs], + rois) + # do not support caffe_c4 model anymore + mask_pred = mask_head(mask_feats, attn_feats) + + mask_results = dict(mask_pred=mask_pred) + return mask_results + + def _mask_forward_train(self, stage, x, attn_feats, sampling_results, + gt_masks, rcnn_train_cfg): + """Run forward function and calculate loss for mask head in + training.""" + pos_rois = bbox2roi([res.pos_bboxes for res in sampling_results]) + attn_feats = torch.cat([ + feats[res.pos_inds] + for (feats, res) in zip(attn_feats, sampling_results) + ]) + mask_results = self._mask_forward(stage, x, pos_rois, attn_feats) + + mask_targets = self.mask_head[stage].get_targets( + sampling_results, gt_masks, rcnn_train_cfg) + + pos_labels = torch.cat([res.pos_gt_labels for res in sampling_results]) + + loss_mask = self.mask_head[stage].loss(mask_results['mask_pred'], + mask_targets, pos_labels) + mask_results.update(loss_mask) + return mask_results + + def forward_train(self, + x, + proposal_boxes, + proposal_features, + img_metas, + gt_bboxes, + gt_labels, + gt_bboxes_ignore=None, + imgs_whwh=None, + gt_masks=None): + """Forward function in training stage. + + Args: + x (list[Tensor]): list of multi-level img features. + proposals (Tensor): Decoded proposal bboxes, has shape + (batch_size, num_proposals, 4) + proposal_features (Tensor): Expanded proposal + features, has shape + (batch_size, num_proposals, proposal_feature_channel) + img_metas (list[dict]): list of image info dict where + each dict has: 'img_shape', 'scale_factor', 'flip', + and may also contain 'filename', 'ori_shape', + 'pad_shape', and 'img_norm_cfg'. For details on the + values of these keys see + `mmdet/datasets/pipelines/formatting.py:Collect`. + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + gt_bboxes_ignore (None | list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. + imgs_whwh (Tensor): Tensor with shape (batch_size, 4), + the dimension means + [img_width,img_height, img_width, img_height]. + gt_masks (None | Tensor) : true segmentation masks for each box + used if the architecture supports a segmentation task. + + Returns: + dict[str, Tensor]: a dictionary of loss components of all stage. + """ + + num_imgs = len(img_metas) + num_proposals = proposal_boxes.size(1) + imgs_whwh = imgs_whwh.repeat(1, num_proposals, 1) + all_stage_bbox_results = [] + proposal_list = [proposal_boxes[i] for i in range(len(proposal_boxes))] + object_feats = proposal_features + all_stage_loss = {} + for stage in range(self.num_stages): + rois = bbox2roi(proposal_list) + bbox_results = self._bbox_forward(stage, x, rois, object_feats, + img_metas) + all_stage_bbox_results.append(bbox_results) + if gt_bboxes_ignore is None: + # TODO support ignore + gt_bboxes_ignore = [None for _ in range(num_imgs)] + sampling_results = [] + cls_pred_list = bbox_results['detach_cls_score_list'] + proposal_list = bbox_results['detach_proposal_list'] + for i in range(num_imgs): + normalize_bbox_ccwh = bbox_xyxy_to_cxcywh(proposal_list[i] / + imgs_whwh[i]) + assign_result = self.bbox_assigner[stage].assign( + normalize_bbox_ccwh, cls_pred_list[i], gt_bboxes[i], + gt_labels[i], img_metas[i]) + sampling_result = self.bbox_sampler[stage].sample( + assign_result, proposal_list[i], gt_bboxes[i]) + sampling_results.append(sampling_result) + bbox_targets = self.bbox_head[stage].get_targets( + sampling_results, gt_bboxes, gt_labels, self.train_cfg[stage], + True) + cls_score = bbox_results['cls_score'] + decode_bbox_pred = bbox_results['decode_bbox_pred'] + + single_stage_loss = self.bbox_head[stage].loss( + cls_score.view(-1, cls_score.size(-1)), + decode_bbox_pred.view(-1, 4), + *bbox_targets, + imgs_whwh=imgs_whwh) + + if self.with_mask: + mask_results = self._mask_forward_train( + stage, x, bbox_results['attn_feats'], sampling_results, + gt_masks, self.train_cfg[stage]) + single_stage_loss['loss_mask'] = mask_results['loss_mask'] + + for key, value in single_stage_loss.items(): + all_stage_loss[f'stage{stage}_{key}'] = value * \ + self.stage_loss_weights[stage] + object_feats = bbox_results['object_feats'] + + return all_stage_loss + + def simple_test(self, + x, + proposal_boxes, + proposal_features, + img_metas, + imgs_whwh, + rescale=False): + """Test without augmentation. + + Args: + x (list[Tensor]): list of multi-level img features. + proposal_boxes (Tensor): Decoded proposal bboxes, has shape + (batch_size, num_proposals, 4) + proposal_features (Tensor): Expanded proposal + features, has shape + (batch_size, num_proposals, proposal_feature_channel) + img_metas (dict): meta information of images. + imgs_whwh (Tensor): Tensor with shape (batch_size, 4), + the dimension means + [img_width,img_height, img_width, img_height]. + rescale (bool): If True, return boxes in original image + space. Defaults to False. + + Returns: + list[list[np.ndarray]] or list[tuple]: When no mask branch, + it is bbox results of each image and classes with type + `list[list[np.ndarray]]`. The outer list + corresponds to each image. The inner list + corresponds to each class. When the model has a mask branch, + it is a list[tuple] that contains bbox results and mask results. + The outer list corresponds to each image, and first element + of tuple is bbox results, second element is mask results. + """ + assert self.with_bbox, 'Bbox head must be implemented.' + # Decode initial proposals + num_imgs = len(img_metas) + proposal_list = [proposal_boxes[i] for i in range(num_imgs)] + ori_shapes = tuple(meta['ori_shape'] for meta in img_metas) + scale_factors = tuple(meta['scale_factor'] for meta in img_metas) + + object_feats = proposal_features + if all([proposal.shape[0] == 0 for proposal in proposal_list]): + # There is no proposal in the whole batch + bbox_results = [[ + np.zeros((0, 5), dtype=np.float32) + for i in range(self.bbox_head[-1].num_classes) + ]] * num_imgs + return bbox_results + + for stage in range(self.num_stages): + rois = bbox2roi(proposal_list) + bbox_results = self._bbox_forward(stage, x, rois, object_feats, + img_metas) + object_feats = bbox_results['object_feats'] + cls_score = bbox_results['cls_score'] + proposal_list = bbox_results['detach_proposal_list'] + + if self.with_mask: + rois = bbox2roi(proposal_list) + mask_results = self._mask_forward(stage, x, rois, + bbox_results['attn_feats']) + mask_results['mask_pred'] = mask_results['mask_pred'].reshape( + num_imgs, -1, *mask_results['mask_pred'].size()[1:]) + + num_classes = self.bbox_head[-1].num_classes + det_bboxes = [] + det_labels = [] + + if self.bbox_head[-1].loss_cls.use_sigmoid: + cls_score = cls_score.sigmoid() + else: + cls_score = cls_score.softmax(-1)[..., :-1] + + for img_id in range(num_imgs): + cls_score_per_img = cls_score[img_id] + scores_per_img, topk_indices = cls_score_per_img.flatten( + 0, 1).topk( + self.test_cfg.max_per_img, sorted=False) + labels_per_img = topk_indices % num_classes + bbox_pred_per_img = proposal_list[img_id][topk_indices // + num_classes] + if rescale: + scale_factor = img_metas[img_id]['scale_factor'] + bbox_pred_per_img /= bbox_pred_per_img.new_tensor(scale_factor) + det_bboxes.append( + torch.cat([bbox_pred_per_img, scores_per_img[:, None]], dim=1)) + det_labels.append(labels_per_img) + + bbox_results = [ + bbox2result(det_bboxes[i], det_labels[i], num_classes) + for i in range(num_imgs) + ] + + if self.with_mask: + if rescale and not isinstance(scale_factors[0], float): + scale_factors = [ + torch.from_numpy(scale_factor).to(det_bboxes[0].device) + for scale_factor in scale_factors + ] + _bboxes = [ + det_bboxes[i][:, :4] * + scale_factors[i] if rescale else det_bboxes[i][:, :4] + for i in range(len(det_bboxes)) + ] + segm_results = [] + mask_pred = mask_results['mask_pred'] + for img_id in range(num_imgs): + mask_pred_per_img = mask_pred[img_id].flatten(0, + 1)[topk_indices] + mask_pred_per_img = mask_pred_per_img[:, None, ...].repeat( + 1, num_classes, 1, 1) + segm_result = self.mask_head[-1].get_seg_masks( + mask_pred_per_img, _bboxes[img_id], det_labels[img_id], + self.test_cfg, ori_shapes[img_id], scale_factors[img_id], + rescale) + segm_results.append(segm_result) + + if self.with_mask: + results = list(zip(bbox_results, segm_results)) + else: + results = bbox_results + + return results + + def aug_test(self, features, proposal_list, img_metas, rescale=False): + raise NotImplementedError( + 'Sparse R-CNN and QueryInst does not support `aug_test`') + + def forward_dummy(self, x, proposal_boxes, proposal_features, img_metas): + """Dummy forward function when do the flops computing.""" + all_stage_bbox_results = [] + proposal_list = [proposal_boxes[i] for i in range(len(proposal_boxes))] + object_feats = proposal_features + if self.with_bbox: + for stage in range(self.num_stages): + rois = bbox2roi(proposal_list) + bbox_results = self._bbox_forward(stage, x, rois, object_feats, + img_metas) + + all_stage_bbox_results.append((bbox_results, )) + proposal_list = bbox_results['detach_proposal_list'] + object_feats = bbox_results['object_feats'] + + if self.with_mask: + rois = bbox2roi(proposal_list) + mask_results = self._mask_forward( + stage, x, rois, bbox_results['attn_feats']) + all_stage_bbox_results[-1] += (mask_results, ) + return all_stage_bbox_results diff --git a/mmdet/models/roi_heads/standard_roi_head.py b/mmdet/models/roi_heads/standard_roi_head.py new file mode 100644 index 0000000..3fdd82a --- /dev/null +++ b/mmdet/models/roi_heads/standard_roi_head.py @@ -0,0 +1,397 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from mmdet.core import bbox2result, bbox2roi, build_assigner, build_sampler +from ..builder import HEADS, build_head, build_roi_extractor +from .base_roi_head import BaseRoIHead +from .test_mixins import BBoxTestMixin, MaskTestMixin + + +@HEADS.register_module() +class StandardRoIHead(BaseRoIHead, BBoxTestMixin, MaskTestMixin): + """Simplest base roi head including one bbox head and one mask head.""" + + def init_assigner_sampler(self): + """Initialize assigner and sampler.""" + self.bbox_assigner = None + self.bbox_sampler = None + if self.train_cfg: + self.bbox_assigner = build_assigner(self.train_cfg.assigner) + self.bbox_sampler = build_sampler( + self.train_cfg.sampler, context=self) + + def init_bbox_head(self, bbox_roi_extractor, bbox_head): + """Initialize ``bbox_head``""" + self.bbox_roi_extractor = build_roi_extractor(bbox_roi_extractor) + self.bbox_head = build_head(bbox_head) + + def init_mask_head(self, mask_roi_extractor, mask_head): + """Initialize ``mask_head``""" + if mask_roi_extractor is not None: + self.mask_roi_extractor = build_roi_extractor(mask_roi_extractor) + self.share_roi_extractor = False + else: + self.share_roi_extractor = True + self.mask_roi_extractor = self.bbox_roi_extractor + self.mask_head = build_head(mask_head) + + def forward_dummy(self, x, proposals): + """Dummy forward function.""" + # bbox head + outs = () + rois = bbox2roi([proposals]) + if self.with_bbox: + bbox_results = self._bbox_forward(x, rois) + outs = outs + (bbox_results['cls_score'], + bbox_results['bbox_pred']) + # mask head + if self.with_mask: + mask_rois = rois[:100] + mask_results = self._mask_forward(x, mask_rois) + outs = outs + (mask_results['mask_pred'], ) + return outs + + def forward_train(self, + x, + img_metas, + proposal_list, + gt_bboxes, + gt_labels, + gt_bboxes_ignore=None, + gt_masks=None, + **kwargs): + """ + Args: + x (list[Tensor]): list of multi-level img features. + img_metas (list[dict]): list of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys see + `mmdet/datasets/pipelines/formatting.py:Collect`. + proposals (list[Tensors]): list of region proposals. + gt_bboxes (list[Tensor]): Ground truth bboxes for each image with + shape (num_gts, 4) in [tl_x, tl_y, br_x, br_y] format. + gt_labels (list[Tensor]): class indices corresponding to each box + gt_bboxes_ignore (None | list[Tensor]): specify which bounding + boxes can be ignored when computing the loss. + gt_masks (None | Tensor) : true segmentation masks for each box + used if the architecture supports a segmentation task. + + Returns: + dict[str, Tensor]: a dictionary of loss components + """ + # assign gts and sample proposals + if self.with_bbox or self.with_mask: + num_imgs = len(img_metas) + if gt_bboxes_ignore is None: + gt_bboxes_ignore = [None for _ in range(num_imgs)] + sampling_results = [] + for i in range(num_imgs): + assign_result = self.bbox_assigner.assign( + proposal_list[i], gt_bboxes[i], gt_bboxes_ignore[i], + gt_labels[i]) + sampling_result = self.bbox_sampler.sample( + assign_result, + proposal_list[i], + gt_bboxes[i], + gt_labels[i], + feats=[lvl_feat[i][None] for lvl_feat in x]) + sampling_results.append(sampling_result) + + losses = dict() + # bbox head forward and loss + if self.with_bbox: + bbox_results = self._bbox_forward_train(x, sampling_results, + gt_bboxes, gt_labels, + img_metas) + losses.update(bbox_results['loss_bbox']) + + # mask head forward and loss + if self.with_mask: + mask_results = self._mask_forward_train(x, sampling_results, + bbox_results['bbox_feats'], + gt_masks, img_metas) + losses.update(mask_results['loss_mask']) + + return losses + + def _bbox_forward(self, x, rois): + """Box head forward function used in both training and testing.""" + # TODO: a more flexible way to decide which feature maps to use + bbox_feats = self.bbox_roi_extractor( + x[:self.bbox_roi_extractor.num_inputs], rois) + if self.with_shared_head: + bbox_feats = self.shared_head(bbox_feats) + cls_score, bbox_pred = self.bbox_head(bbox_feats) + + bbox_results = dict( + cls_score=cls_score, bbox_pred=bbox_pred, bbox_feats=bbox_feats) + return bbox_results + + def _bbox_forward_train(self, x, sampling_results, gt_bboxes, gt_labels, + img_metas): + """Run forward function and calculate loss for box head in training.""" + rois = bbox2roi([res.bboxes for res in sampling_results]) + bbox_results = self._bbox_forward(x, rois) + + bbox_targets = self.bbox_head.get_targets(sampling_results, gt_bboxes, + gt_labels, self.train_cfg) + loss_bbox = self.bbox_head.loss(bbox_results['cls_score'], + bbox_results['bbox_pred'], rois, + *bbox_targets) + + bbox_results.update(loss_bbox=loss_bbox) + return bbox_results + + def _mask_forward_train(self, x, sampling_results, bbox_feats, gt_masks, + img_metas): + """Run forward function and calculate loss for mask head in + training.""" + if not self.share_roi_extractor: + pos_rois = bbox2roi([res.pos_bboxes for res in sampling_results]) + mask_results = self._mask_forward(x, pos_rois) + else: + pos_inds = [] + device = bbox_feats.device + for res in sampling_results: + pos_inds.append( + torch.ones( + res.pos_bboxes.shape[0], + device=device, + dtype=torch.uint8)) + pos_inds.append( + torch.zeros( + res.neg_bboxes.shape[0], + device=device, + dtype=torch.uint8)) + pos_inds = torch.cat(pos_inds) + + mask_results = self._mask_forward( + x, pos_inds=pos_inds, bbox_feats=bbox_feats) + + mask_targets = self.mask_head.get_targets(sampling_results, gt_masks, + self.train_cfg) + pos_labels = torch.cat([res.pos_gt_labels for res in sampling_results]) + loss_mask = self.mask_head.loss(mask_results['mask_pred'], + mask_targets, pos_labels) + + mask_results.update(loss_mask=loss_mask, mask_targets=mask_targets) + return mask_results + + def _mask_forward(self, x, rois=None, pos_inds=None, bbox_feats=None): + """Mask head forward function used in both training and testing.""" + assert ((rois is not None) ^ + (pos_inds is not None and bbox_feats is not None)) + if rois is not None: + mask_feats = self.mask_roi_extractor( + x[:self.mask_roi_extractor.num_inputs], rois) + if self.with_shared_head: + mask_feats = self.shared_head(mask_feats) + else: + assert bbox_feats is not None + mask_feats = bbox_feats[pos_inds] + + mask_pred = self.mask_head(mask_feats) + mask_results = dict(mask_pred=mask_pred, mask_feats=mask_feats) + return mask_results + + async def async_simple_test(self, + x, + proposal_list, + img_metas, + proposals=None, + rescale=False): + """Async test without augmentation.""" + assert self.with_bbox, 'Bbox head must be implemented.' + + det_bboxes, det_labels = await self.async_test_bboxes( + x, img_metas, proposal_list, self.test_cfg, rescale=rescale) + bbox_results = bbox2result(det_bboxes, det_labels, + self.bbox_head.num_classes) + if not self.with_mask: + return bbox_results + else: + segm_results = await self.async_test_mask( + x, + img_metas, + det_bboxes, + det_labels, + rescale=rescale, + mask_test_cfg=self.test_cfg.get('mask')) + return bbox_results, segm_results + + def simple_test(self, + x, + proposal_list, + img_metas, + proposals=None, + rescale=False): + """Test without augmentation. + + Args: + x (tuple[Tensor]): Features from upstream network. Each + has shape (batch_size, c, h, w). + proposal_list (list(Tensor)): Proposals from rpn head. + Each has shape (num_proposals, 5), last dimension + 5 represent (x1, y1, x2, y2, score). + img_metas (list[dict]): Meta information of images. + rescale (bool): Whether to rescale the results to + the original image. Default: True. + + Returns: + list[list[np.ndarray]] or list[tuple]: When no mask branch, + it is bbox results of each image and classes with type + `list[list[np.ndarray]]`. The outer list + corresponds to each image. The inner list + corresponds to each class. When the model has mask branch, + it contains bbox results and mask results. + The outer list corresponds to each image, and first element + of tuple is bbox results, second element is mask results. + """ + assert self.with_bbox, 'Bbox head must be implemented.' + + det_bboxes, det_labels = self.simple_test_bboxes( + x, img_metas, proposal_list, self.test_cfg, rescale=rescale) + + bbox_results = [ + bbox2result(det_bboxes[i], det_labels[i], + self.bbox_head.num_classes) + for i in range(len(det_bboxes)) + ] + + if not self.with_mask: + return bbox_results + else: + segm_results = self.simple_test_mask( + x, img_metas, det_bboxes, det_labels, rescale=rescale) + return list(zip(bbox_results, segm_results)) + + def aug_test(self, x, proposal_list, img_metas, rescale=False): + """Test with augmentations. + + If rescale is False, then returned bboxes and masks will fit the scale + of imgs[0]. + """ + det_bboxes, det_labels = self.aug_test_bboxes(x, img_metas, + proposal_list, + self.test_cfg) + if rescale: + _det_bboxes = det_bboxes + else: + _det_bboxes = det_bboxes.clone() + _det_bboxes[:, :4] *= det_bboxes.new_tensor( + img_metas[0][0]['scale_factor']) + bbox_results = bbox2result(_det_bboxes, det_labels, + self.bbox_head.num_classes) + + # det_bboxes always keep the original scale + if self.with_mask: + segm_results = self.aug_test_mask(x, img_metas, det_bboxes, + det_labels) + return [(bbox_results, segm_results)] + else: + return [bbox_results] + + def onnx_export(self, x, proposals, img_metas, rescale=False): + """Test without augmentation.""" + assert self.with_bbox, 'Bbox head must be implemented.' + det_bboxes, det_labels = self.bbox_onnx_export( + x, img_metas, proposals, self.test_cfg, rescale=rescale) + + if not self.with_mask: + return det_bboxes, det_labels + else: + segm_results = self.mask_onnx_export( + x, img_metas, det_bboxes, det_labels, rescale=rescale) + return det_bboxes, det_labels, segm_results + + def mask_onnx_export(self, x, img_metas, det_bboxes, det_labels, **kwargs): + """Export mask branch to onnx which supports batch inference. + + Args: + x (tuple[Tensor]): Feature maps of all scale level. + img_metas (list[dict]): Image meta info. + det_bboxes (Tensor): Bboxes and corresponding scores. + has shape [N, num_bboxes, 5]. + det_labels (Tensor): class labels of + shape [N, num_bboxes]. + + Returns: + Tensor: The segmentation results of shape [N, num_bboxes, + image_height, image_width]. + """ + # image shapes of images in the batch + + if all(det_bbox.shape[0] == 0 for det_bbox in det_bboxes): + raise RuntimeError('[ONNX Error] Can not record MaskHead ' + 'as it has not been executed this time') + batch_size = det_bboxes.size(0) + # if det_bboxes is rescaled to the original image size, we need to + # rescale it back to the testing scale to obtain RoIs. + det_bboxes = det_bboxes[..., :4] + batch_index = torch.arange( + det_bboxes.size(0), device=det_bboxes.device).float().view( + -1, 1, 1).expand(det_bboxes.size(0), det_bboxes.size(1), 1) + mask_rois = torch.cat([batch_index, det_bboxes], dim=-1) + mask_rois = mask_rois.view(-1, 5) + mask_results = self._mask_forward(x, mask_rois) + mask_pred = mask_results['mask_pred'] + max_shape = img_metas[0]['img_shape_for_onnx'] + num_det = det_bboxes.shape[1] + det_bboxes = det_bboxes.reshape(-1, 4) + det_labels = det_labels.reshape(-1) + segm_results = self.mask_head.onnx_export(mask_pred, det_bboxes, + det_labels, self.test_cfg, + max_shape) + segm_results = segm_results.reshape(batch_size, num_det, max_shape[0], + max_shape[1]) + return segm_results + + def bbox_onnx_export(self, x, img_metas, proposals, rcnn_test_cfg, + **kwargs): + """Export bbox branch to onnx which supports batch inference. + + Args: + x (tuple[Tensor]): Feature maps of all scale level. + img_metas (list[dict]): Image meta info. + proposals (Tensor): Region proposals with + batch dimension, has shape [N, num_bboxes, 5]. + rcnn_test_cfg (obj:`ConfigDict`): `test_cfg` of R-CNN. + + Returns: + tuple[Tensor, Tensor]: bboxes of shape [N, num_bboxes, 5] + and class labels of shape [N, num_bboxes]. + """ + # get origin input shape to support onnx dynamic input shape + assert len( + img_metas + ) == 1, 'Only support one input image while in exporting to ONNX' + img_shapes = img_metas[0]['img_shape_for_onnx'] + + rois = proposals + + batch_index = torch.arange( + rois.size(0), device=rois.device).float().view(-1, 1, 1).expand( + rois.size(0), rois.size(1), 1) + + rois = torch.cat([batch_index, rois[..., :4]], dim=-1) + batch_size = rois.shape[0] + num_proposals_per_img = rois.shape[1] + + # Eliminate the batch dimension + rois = rois.view(-1, 5) + bbox_results = self._bbox_forward(x, rois) + cls_score = bbox_results['cls_score'] + bbox_pred = bbox_results['bbox_pred'] + + # Recover the batch dimension + rois = rois.reshape(batch_size, num_proposals_per_img, rois.size(-1)) + cls_score = cls_score.reshape(batch_size, num_proposals_per_img, + cls_score.size(-1)) + + bbox_pred = bbox_pred.reshape(batch_size, num_proposals_per_img, + bbox_pred.size(-1)) + det_bboxes, det_labels = self.bbox_head.onnx_export( + rois, cls_score, bbox_pred, img_shapes, cfg=rcnn_test_cfg) + + return det_bboxes, det_labels diff --git a/mmdet/models/roi_heads/test_mixins.py b/mmdet/models/roi_heads/test_mixins.py new file mode 100644 index 0000000..ae6e79a --- /dev/null +++ b/mmdet/models/roi_heads/test_mixins.py @@ -0,0 +1,311 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import sys +import warnings + +import numpy as np +import torch + +from mmdet.core import (bbox2roi, bbox_mapping, merge_aug_bboxes, + merge_aug_masks, multiclass_nms) + +if sys.version_info >= (3, 7): + from mmdet.utils.contextmanagers import completed + + +class BBoxTestMixin: + + if sys.version_info >= (3, 7): + + async def async_test_bboxes(self, + x, + img_metas, + proposals, + rcnn_test_cfg, + rescale=False, + **kwargs): + """Asynchronized test for box head without augmentation.""" + rois = bbox2roi(proposals) + roi_feats = self.bbox_roi_extractor( + x[:len(self.bbox_roi_extractor.featmap_strides)], rois) + if self.with_shared_head: + roi_feats = self.shared_head(roi_feats) + sleep_interval = rcnn_test_cfg.get('async_sleep_interval', 0.017) + + async with completed( + __name__, 'bbox_head_forward', + sleep_interval=sleep_interval): + cls_score, bbox_pred = self.bbox_head(roi_feats) + + img_shape = img_metas[0]['img_shape'] + scale_factor = img_metas[0]['scale_factor'] + det_bboxes, det_labels = self.bbox_head.get_bboxes( + rois, + cls_score, + bbox_pred, + img_shape, + scale_factor, + rescale=rescale, + cfg=rcnn_test_cfg) + return det_bboxes, det_labels + + def simple_test_bboxes(self, + x, + img_metas, + proposals, + rcnn_test_cfg, + rescale=False): + """Test only det bboxes without augmentation. + + Args: + x (tuple[Tensor]): Feature maps of all scale level. + img_metas (list[dict]): Image meta info. + proposals (List[Tensor]): Region proposals. + rcnn_test_cfg (obj:`ConfigDict`): `test_cfg` of R-CNN. + rescale (bool): If True, return boxes in original image space. + Default: False. + + Returns: + tuple[list[Tensor], list[Tensor]]: The first list contains + the boxes of the corresponding image in a batch, each + tensor has the shape (num_boxes, 5) and last dimension + 5 represent (tl_x, tl_y, br_x, br_y, score). Each Tensor + in the second list is the labels with shape (num_boxes, ). + The length of both lists should be equal to batch_size. + """ + + rois = bbox2roi(proposals) + + if rois.shape[0] == 0: + batch_size = len(proposals) + det_bbox = rois.new_zeros(0, 5) + det_label = rois.new_zeros((0, ), dtype=torch.long) + if rcnn_test_cfg is None: + det_bbox = det_bbox[:, :4] + det_label = rois.new_zeros( + (0, self.bbox_head.fc_cls.out_features)) + # There is no proposal in the whole batch + return [det_bbox] * batch_size, [det_label] * batch_size + + bbox_results = self._bbox_forward(x, rois) + img_shapes = tuple(meta['img_shape'] for meta in img_metas) + scale_factors = tuple(meta['scale_factor'] for meta in img_metas) + + # split batch bbox prediction back to each image + cls_score = bbox_results['cls_score'] + bbox_pred = bbox_results['bbox_pred'] + num_proposals_per_img = tuple(len(p) for p in proposals) + rois = rois.split(num_proposals_per_img, 0) + cls_score = cls_score.split(num_proposals_per_img, 0) + + # some detector with_reg is False, bbox_pred will be None + if bbox_pred is not None: + # TODO move this to a sabl_roi_head + # the bbox prediction of some detectors like SABL is not Tensor + if isinstance(bbox_pred, torch.Tensor): + bbox_pred = bbox_pred.split(num_proposals_per_img, 0) + else: + bbox_pred = self.bbox_head.bbox_pred_split( + bbox_pred, num_proposals_per_img) + else: + bbox_pred = (None, ) * len(proposals) + + # apply bbox post-processing to each image individually + det_bboxes = [] + det_labels = [] + for i in range(len(proposals)): + if rois[i].shape[0] == 0: + # There is no proposal in the single image + det_bbox = rois[i].new_zeros(0, 5) + det_label = rois[i].new_zeros((0, ), dtype=torch.long) + if rcnn_test_cfg is None: + det_bbox = det_bbox[:, :4] + det_label = rois[i].new_zeros( + (0, self.bbox_head.fc_cls.out_features)) + + else: + det_bbox, det_label = self.bbox_head.get_bboxes( + rois[i], + cls_score[i], + bbox_pred[i], + img_shapes[i], + scale_factors[i], + rescale=rescale, + cfg=rcnn_test_cfg) + det_bboxes.append(det_bbox) + det_labels.append(det_label) + return det_bboxes, det_labels + + def aug_test_bboxes(self, feats, img_metas, proposal_list, rcnn_test_cfg): + """Test det bboxes with test time augmentation.""" + aug_bboxes = [] + aug_scores = [] + for x, img_meta in zip(feats, img_metas): + # only one image in the batch + img_shape = img_meta[0]['img_shape'] + scale_factor = img_meta[0]['scale_factor'] + flip = img_meta[0]['flip'] + flip_direction = img_meta[0]['flip_direction'] + # TODO more flexible + proposals = bbox_mapping(proposal_list[0][:, :4], img_shape, + scale_factor, flip, flip_direction) + rois = bbox2roi([proposals]) + bbox_results = self._bbox_forward(x, rois) + bboxes, scores = self.bbox_head.get_bboxes( + rois, + bbox_results['cls_score'], + bbox_results['bbox_pred'], + img_shape, + scale_factor, + rescale=False, + cfg=None) + aug_bboxes.append(bboxes) + aug_scores.append(scores) + # after merging, bboxes will be rescaled to the original image size + merged_bboxes, merged_scores = merge_aug_bboxes( + aug_bboxes, aug_scores, img_metas, rcnn_test_cfg) + if merged_bboxes.shape[0] == 0: + # There is no proposal in the single image + det_bboxes = merged_bboxes.new_zeros(0, 5) + det_labels = merged_bboxes.new_zeros((0, ), dtype=torch.long) + else: + det_bboxes, det_labels = multiclass_nms(merged_bboxes, + merged_scores, + rcnn_test_cfg.score_thr, + rcnn_test_cfg.nms, + rcnn_test_cfg.max_per_img) + return det_bboxes, det_labels + + +class MaskTestMixin: + + if sys.version_info >= (3, 7): + + async def async_test_mask(self, + x, + img_metas, + det_bboxes, + det_labels, + rescale=False, + mask_test_cfg=None): + """Asynchronized test for mask head without augmentation.""" + # image shape of the first image in the batch (only one) + ori_shape = img_metas[0]['ori_shape'] + scale_factor = img_metas[0]['scale_factor'] + if det_bboxes.shape[0] == 0: + segm_result = [[] for _ in range(self.mask_head.num_classes)] + else: + if rescale and not isinstance(scale_factor, + (float, torch.Tensor)): + scale_factor = det_bboxes.new_tensor(scale_factor) + _bboxes = ( + det_bboxes[:, :4] * + scale_factor if rescale else det_bboxes) + mask_rois = bbox2roi([_bboxes]) + mask_feats = self.mask_roi_extractor( + x[:len(self.mask_roi_extractor.featmap_strides)], + mask_rois) + + if self.with_shared_head: + mask_feats = self.shared_head(mask_feats) + if mask_test_cfg and mask_test_cfg.get('async_sleep_interval'): + sleep_interval = mask_test_cfg['async_sleep_interval'] + else: + sleep_interval = 0.035 + async with completed( + __name__, + 'mask_head_forward', + sleep_interval=sleep_interval): + mask_pred = self.mask_head(mask_feats) + segm_result = self.mask_head.get_seg_masks( + mask_pred, _bboxes, det_labels, self.test_cfg, ori_shape, + scale_factor, rescale) + return segm_result + + def simple_test_mask(self, + x, + img_metas, + det_bboxes, + det_labels, + rescale=False): + """Simple test for mask head without augmentation.""" + # image shapes of images in the batch + ori_shapes = tuple(meta['ori_shape'] for meta in img_metas) + scale_factors = tuple(meta['scale_factor'] for meta in img_metas) + + if isinstance(scale_factors[0], float): + warnings.warn( + 'Scale factor in img_metas should be a ' + 'ndarray with shape (4,) ' + 'arrange as (factor_w, factor_h, factor_w, factor_h), ' + 'The scale_factor with float type has been deprecated. ') + scale_factors = np.array([scale_factors] * 4, dtype=np.float32) + + num_imgs = len(det_bboxes) + if all(det_bbox.shape[0] == 0 for det_bbox in det_bboxes): + segm_results = [[[] for _ in range(self.mask_head.num_classes)] + for _ in range(num_imgs)] + else: + # if det_bboxes is rescaled to the original image size, we need to + # rescale it back to the testing scale to obtain RoIs. + if rescale: + scale_factors = [ + torch.from_numpy(scale_factor).to(det_bboxes[0].device) + for scale_factor in scale_factors + ] + _bboxes = [ + det_bboxes[i][:, :4] * + scale_factors[i] if rescale else det_bboxes[i][:, :4] + for i in range(len(det_bboxes)) + ] + mask_rois = bbox2roi(_bboxes) + mask_results = self._mask_forward(x, mask_rois) + mask_pred = mask_results['mask_pred'] + # split batch mask prediction back to each image + num_mask_roi_per_img = [len(det_bbox) for det_bbox in det_bboxes] + mask_preds = mask_pred.split(num_mask_roi_per_img, 0) + + # apply mask post-processing to each image individually + segm_results = [] + for i in range(num_imgs): + if det_bboxes[i].shape[0] == 0: + segm_results.append( + [[] for _ in range(self.mask_head.num_classes)]) + else: + segm_result = self.mask_head.get_seg_masks( + mask_preds[i], _bboxes[i], det_labels[i], + self.test_cfg, ori_shapes[i], scale_factors[i], + rescale) + segm_results.append(segm_result) + return segm_results + + def aug_test_mask(self, feats, img_metas, det_bboxes, det_labels): + """Test for mask head with test time augmentation.""" + if det_bboxes.shape[0] == 0: + segm_result = [[] for _ in range(self.mask_head.num_classes)] + else: + aug_masks = [] + for x, img_meta in zip(feats, img_metas): + img_shape = img_meta[0]['img_shape'] + scale_factor = img_meta[0]['scale_factor'] + flip = img_meta[0]['flip'] + flip_direction = img_meta[0]['flip_direction'] + _bboxes = bbox_mapping(det_bboxes[:, :4], img_shape, + scale_factor, flip, flip_direction) + mask_rois = bbox2roi([_bboxes]) + mask_results = self._mask_forward(x, mask_rois) + # convert to numpy array to save memory + aug_masks.append( + mask_results['mask_pred'].sigmoid().cpu().numpy()) + merged_masks = merge_aug_masks(aug_masks, img_metas, self.test_cfg) + + ori_shape = img_metas[0][0]['ori_shape'] + scale_factor = det_bboxes.new_ones(4) + segm_result = self.mask_head.get_seg_masks( + merged_masks, + det_bboxes, + det_labels, + self.test_cfg, + ori_shape, + scale_factor=scale_factor, + rescale=False) + return segm_result diff --git a/mmdet/models/roi_heads/trident_roi_head.py b/mmdet/models/roi_heads/trident_roi_head.py new file mode 100644 index 0000000..0975879 --- /dev/null +++ b/mmdet/models/roi_heads/trident_roi_head.py @@ -0,0 +1,120 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +from mmcv.ops import batched_nms + +from mmdet.core import (bbox2result, bbox2roi, bbox_mapping, merge_aug_bboxes, + multiclass_nms) +from mmdet.models.roi_heads.standard_roi_head import StandardRoIHead +from ..builder import HEADS + + +@HEADS.register_module() +class TridentRoIHead(StandardRoIHead): + """Trident roi head. + + Args: + num_branch (int): Number of branches in TridentNet. + test_branch_idx (int): In inference, all 3 branches will be used + if `test_branch_idx==-1`, otherwise only branch with index + `test_branch_idx` will be used. + """ + + def __init__(self, num_branch, test_branch_idx, **kwargs): + self.num_branch = num_branch + self.test_branch_idx = test_branch_idx + super(TridentRoIHead, self).__init__(**kwargs) + + def merge_trident_bboxes(self, trident_det_bboxes, trident_det_labels): + """Merge bbox predictions of each branch.""" + if trident_det_bboxes.numel() == 0: + det_bboxes = trident_det_bboxes.new_zeros((0, 5)) + det_labels = trident_det_bboxes.new_zeros((0, ), dtype=torch.long) + else: + nms_bboxes = trident_det_bboxes[:, :4] + nms_scores = trident_det_bboxes[:, 4].contiguous() + nms_inds = trident_det_labels + nms_cfg = self.test_cfg['nms'] + det_bboxes, keep = batched_nms(nms_bboxes, nms_scores, nms_inds, + nms_cfg) + det_labels = trident_det_labels[keep] + if self.test_cfg['max_per_img'] > 0: + det_labels = det_labels[:self.test_cfg['max_per_img']] + det_bboxes = det_bboxes[:self.test_cfg['max_per_img']] + + return det_bboxes, det_labels + + def simple_test(self, + x, + proposal_list, + img_metas, + proposals=None, + rescale=False): + """Test without augmentation as follows: + + 1. Compute prediction bbox and label per branch. + 2. Merge predictions of each branch according to scores of + bboxes, i.e., bboxes with higher score are kept to give + top-k prediction. + """ + assert self.with_bbox, 'Bbox head must be implemented.' + det_bboxes_list, det_labels_list = self.simple_test_bboxes( + x, img_metas, proposal_list, self.test_cfg, rescale=rescale) + num_branch = self.num_branch if self.test_branch_idx == -1 else 1 + for _ in range(len(det_bboxes_list)): + if det_bboxes_list[_].shape[0] == 0: + det_bboxes_list[_] = det_bboxes_list[_].new_empty((0, 5)) + det_bboxes, det_labels = [], [] + for i in range(len(img_metas) // num_branch): + det_result = self.merge_trident_bboxes( + torch.cat(det_bboxes_list[i * num_branch:(i + 1) * + num_branch]), + torch.cat(det_labels_list[i * num_branch:(i + 1) * + num_branch])) + det_bboxes.append(det_result[0]) + det_labels.append(det_result[1]) + + bbox_results = [ + bbox2result(det_bboxes[i], det_labels[i], + self.bbox_head.num_classes) + for i in range(len(det_bboxes)) + ] + return bbox_results + + def aug_test_bboxes(self, feats, img_metas, proposal_list, rcnn_test_cfg): + """Test det bboxes with test time augmentation.""" + aug_bboxes = [] + aug_scores = [] + for x, img_meta in zip(feats, img_metas): + # only one image in the batch + img_shape = img_meta[0]['img_shape'] + scale_factor = img_meta[0]['scale_factor'] + flip = img_meta[0]['flip'] + flip_direction = img_meta[0]['flip_direction'] + + trident_bboxes, trident_scores = [], [] + for branch_idx in range(len(proposal_list)): + proposals = bbox_mapping(proposal_list[0][:, :4], img_shape, + scale_factor, flip, flip_direction) + rois = bbox2roi([proposals]) + bbox_results = self._bbox_forward(x, rois) + bboxes, scores = self.bbox_head.get_bboxes( + rois, + bbox_results['cls_score'], + bbox_results['bbox_pred'], + img_shape, + scale_factor, + rescale=False, + cfg=None) + trident_bboxes.append(bboxes) + trident_scores.append(scores) + + aug_bboxes.append(torch.cat(trident_bboxes, 0)) + aug_scores.append(torch.cat(trident_scores, 0)) + # after merging, bboxes will be rescaled to the original image size + merged_bboxes, merged_scores = merge_aug_bboxes( + aug_bboxes, aug_scores, img_metas, rcnn_test_cfg) + det_bboxes, det_labels = multiclass_nms(merged_bboxes, merged_scores, + rcnn_test_cfg.score_thr, + rcnn_test_cfg.nms, + rcnn_test_cfg.max_per_img) + return det_bboxes, det_labels diff --git a/mmdet/models/seg_heads/__init__.py b/mmdet/models/seg_heads/__init__.py new file mode 100644 index 0000000..b489a90 --- /dev/null +++ b/mmdet/models/seg_heads/__init__.py @@ -0,0 +1,3 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .panoptic_fpn_head import PanopticFPNHead # noqa: F401,F403 +from .panoptic_fusion_heads import * # noqa: F401,F403 diff --git a/mmdet/models/seg_heads/base_semantic_head.py b/mmdet/models/seg_heads/base_semantic_head.py new file mode 100644 index 0000000..2b6ca14 --- /dev/null +++ b/mmdet/models/seg_heads/base_semantic_head.py @@ -0,0 +1,86 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from abc import ABCMeta, abstractmethod + +import torch.nn.functional as F +from mmcv.runner import BaseModule, force_fp32 + +from ..builder import build_loss +from ..utils import interpolate_as + + +class BaseSemanticHead(BaseModule, metaclass=ABCMeta): + """Base module of Semantic Head. + + Args: + num_classes (int): the number of classes. + init_cfg (dict): the initialization config. + loss_seg (dict): the loss of the semantic head. + """ + + def __init__(self, + num_classes, + init_cfg=None, + loss_seg=dict( + type='CrossEntropyLoss', + ignore_index=255, + loss_weight=1.0)): + super(BaseSemanticHead, self).__init__(init_cfg) + self.loss_seg = build_loss(loss_seg) + self.num_classes = num_classes + + @force_fp32(apply_to=('seg_preds', )) + def loss(self, seg_preds, gt_semantic_seg): + """Get the loss of semantic head. + + Args: + seg_preds (Tensor): The input logits with the shape (N, C, H, W). + gt_semantic_seg: The ground truth of semantic segmentation with + the shape (N, H, W). + label_bias: The starting number of the semantic label. + Default: 1. + + Returns: + dict: the loss of semantic head. + """ + if seg_preds.shape[-2:] != gt_semantic_seg.shape[-2:]: + seg_preds = interpolate_as(seg_preds, gt_semantic_seg) + seg_preds = seg_preds.permute((0, 2, 3, 1)) + + loss_seg = self.loss_seg( + seg_preds.reshape(-1, self.num_classes), # => [NxHxW, C] + gt_semantic_seg.reshape(-1).long()) + return dict(loss_seg=loss_seg) + + @abstractmethod + def forward(self, x): + """Placeholder of forward function. + + Returns: + dict[str, Tensor]: A dictionary, including features + and predicted scores. Required keys: 'seg_preds' + and 'feats'. + """ + pass + + def forward_train(self, x, gt_semantic_seg): + output = self.forward(x) + seg_preds = output['seg_preds'] + return self.loss(seg_preds, gt_semantic_seg) + + def simple_test(self, x, img_metas, rescale=False): + output = self.forward(x) + seg_preds = output['seg_preds'] + seg_preds = F.interpolate( + seg_preds, + size=img_metas[0]['pad_shape'][:2], + mode='bilinear', + align_corners=False) + + if rescale: + h, w, _ = img_metas[0]['img_shape'] + seg_preds = seg_preds[:, :, :h, :w] + + h, w, _ = img_metas[0]['ori_shape'] + seg_preds = F.interpolate( + seg_preds, size=(h, w), mode='bilinear', align_corners=False) + return seg_preds diff --git a/mmdet/models/seg_heads/panoptic_fpn_head.py b/mmdet/models/seg_heads/panoptic_fpn_head.py new file mode 100644 index 0000000..f1df297 --- /dev/null +++ b/mmdet/models/seg_heads/panoptic_fpn_head.py @@ -0,0 +1,155 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +import torch +import torch.nn as nn +from mmcv.runner import ModuleList + +from ..builder import HEADS +from ..utils import ConvUpsample +from .base_semantic_head import BaseSemanticHead + + +@HEADS.register_module() +class PanopticFPNHead(BaseSemanticHead): + """PanopticFPNHead used in Panoptic FPN. + + In this head, the number of output channels is ``num_stuff_classes + + 1``, including all stuff classes and one thing class. The stuff + classes will be reset from ``0`` to ``num_stuff_classes - 1``, the + thing classes will be merged to ``num_stuff_classes``-th channel. + + Arg: + num_things_classes (int): Number of thing classes. Default: 80. + num_stuff_classes (int): Number of stuff classes. Default: 53. + num_classes (int): Number of classes, including all stuff + classes and one thing class. This argument is deprecated, + please use ``num_things_classes`` and ``num_stuff_classes``. + The module will automatically infer the num_classes by + ``num_stuff_classes + 1``. + in_channels (int): Number of channels in the input feature + map. + inner_channels (int): Number of channels in inner features. + start_level (int): The start level of the input features + used in PanopticFPN. + end_level (int): The end level of the used features, the + ``end_level``-th layer will not be used. + fg_range (tuple): Range of the foreground classes. It starts + from ``0`` to ``num_things_classes-1``. Deprecated, please use + ``num_things_classes`` directly. + bg_range (tuple): Range of the background classes. It starts + from ``num_things_classes`` to ``num_things_classes + + num_stuff_classes - 1``. Deprecated, please use + ``num_stuff_classes`` and ``num_things_classes`` directly. + conv_cfg (dict): Dictionary to construct and config + conv layer. Default: None. + norm_cfg (dict): Dictionary to construct and config norm layer. + Use ``GN`` by default. + init_cfg (dict or list[dict], optional): Initialization config dict. + loss_seg (dict): the loss of the semantic head. + """ + + def __init__(self, + num_things_classes=80, + num_stuff_classes=53, + num_classes=None, + in_channels=256, + inner_channels=128, + start_level=0, + end_level=4, + fg_range=None, + bg_range=None, + conv_cfg=None, + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True), + init_cfg=None, + loss_seg=dict( + type='CrossEntropyLoss', ignore_index=-1, + loss_weight=1.0)): + if num_classes is not None: + warnings.warn( + '`num_classes` is deprecated now, please set ' + '`num_stuff_classes` directly, the `num_classes` will be ' + 'set to `num_stuff_classes + 1`') + # num_classes = num_stuff_classes + 1 for PanopticFPN. + assert num_classes == num_stuff_classes + 1 + super(PanopticFPNHead, self).__init__(num_stuff_classes + 1, init_cfg, + loss_seg) + self.num_things_classes = num_things_classes + self.num_stuff_classes = num_stuff_classes + if fg_range is not None and bg_range is not None: + self.fg_range = fg_range + self.bg_range = bg_range + self.num_things_classes = fg_range[1] - fg_range[0] + 1 + self.num_stuff_classes = bg_range[1] - bg_range[0] + 1 + warnings.warn( + '`fg_range` and `bg_range` are deprecated now, ' + f'please use `num_things_classes`={self.num_things_classes} ' + f'and `num_stuff_classes`={self.num_stuff_classes} instead.') + + # Used feature layers are [start_level, end_level) + self.start_level = start_level + self.end_level = end_level + self.num_stages = end_level - start_level + self.inner_channels = inner_channels + + self.conv_upsample_layers = ModuleList() + for i in range(start_level, end_level): + self.conv_upsample_layers.append( + ConvUpsample( + in_channels, + inner_channels, + num_layers=i if i > 0 else 1, + num_upsample=i if i > 0 else 0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + )) + self.conv_logits = nn.Conv2d(inner_channels, self.num_classes, 1) + + def _set_things_to_void(self, gt_semantic_seg): + """Merge thing classes to one class. + + In PanopticFPN, the background labels will be reset from `0` to + `self.num_stuff_classes-1`, the foreground labels will be merged to + `self.num_stuff_classes`-th channel. + """ + gt_semantic_seg = gt_semantic_seg.int() + fg_mask = gt_semantic_seg < self.num_things_classes + bg_mask = (gt_semantic_seg >= self.num_things_classes) * ( + gt_semantic_seg < self.num_things_classes + self.num_stuff_classes) + + new_gt_seg = torch.clone(gt_semantic_seg) + new_gt_seg = torch.where(bg_mask, + gt_semantic_seg - self.num_things_classes, + new_gt_seg) + new_gt_seg = torch.where(fg_mask, + fg_mask.int() * self.num_stuff_classes, + new_gt_seg) + return new_gt_seg + + def loss(self, seg_preds, gt_semantic_seg): + """The loss of PanopticFPN head. + + Things classes will be merged to one class in PanopticFPN. + """ + gt_semantic_seg = self._set_things_to_void(gt_semantic_seg) + return super().loss(seg_preds, gt_semantic_seg) + + def init_weights(self): + super().init_weights() + nn.init.normal_(self.conv_logits.weight.data, 0, 0.01) + self.conv_logits.bias.data.zero_() + + def forward(self, x): + # the number of subnets must be not more than + # the length of features. + assert self.num_stages <= len(x) + + feats = [] + for i, layer in enumerate(self.conv_upsample_layers): + f = layer(x[self.start_level + i]) + feats.append(f) + + feats = torch.sum(torch.stack(feats, dim=0), dim=0) + seg_preds = self.conv_logits(feats) + out = dict(seg_preds=seg_preds, feats=feats) + return out diff --git a/mmdet/models/seg_heads/panoptic_fusion_heads/__init__.py b/mmdet/models/seg_heads/panoptic_fusion_heads/__init__.py new file mode 100644 index 0000000..41625a6 --- /dev/null +++ b/mmdet/models/seg_heads/panoptic_fusion_heads/__init__.py @@ -0,0 +1,5 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .base_panoptic_fusion_head import \ + BasePanopticFusionHead # noqa: F401,F403 +from .heuristic_fusion_head import HeuristicFusionHead # noqa: F401,F403 +from .maskformer_fusion_head import MaskFormerFusionHead # noqa: F401,F403 diff --git a/mmdet/models/seg_heads/panoptic_fusion_heads/base_panoptic_fusion_head.py b/mmdet/models/seg_heads/panoptic_fusion_heads/base_panoptic_fusion_head.py new file mode 100644 index 0000000..a38ac1c --- /dev/null +++ b/mmdet/models/seg_heads/panoptic_fusion_heads/base_panoptic_fusion_head.py @@ -0,0 +1,48 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from abc import ABCMeta, abstractmethod + +from mmcv.runner import BaseModule + +from ...builder import build_loss + + +class BasePanopticFusionHead(BaseModule, metaclass=ABCMeta): + """Base class for panoptic heads.""" + + def __init__(self, + num_things_classes=80, + num_stuff_classes=53, + test_cfg=None, + loss_panoptic=None, + init_cfg=None, + **kwargs): + super(BasePanopticFusionHead, self).__init__(init_cfg) + self.num_things_classes = num_things_classes + self.num_stuff_classes = num_stuff_classes + self.num_classes = num_things_classes + num_stuff_classes + self.test_cfg = test_cfg + + if loss_panoptic: + self.loss_panoptic = build_loss(loss_panoptic) + else: + self.loss_panoptic = None + + @property + def with_loss(self): + """bool: whether the panoptic head contains loss function.""" + return self.loss_panoptic is not None + + @abstractmethod + def forward_train(self, gt_masks=None, gt_semantic_seg=None, **kwargs): + """Forward function during training.""" + + @abstractmethod + def simple_test(self, + img_metas, + det_labels, + mask_preds, + seg_preds, + det_bboxes, + cfg=None, + **kwargs): + """Test without augmentation.""" diff --git a/mmdet/models/seg_heads/panoptic_fusion_heads/heuristic_fusion_head.py b/mmdet/models/seg_heads/panoptic_fusion_heads/heuristic_fusion_head.py new file mode 100644 index 0000000..06c1de2 --- /dev/null +++ b/mmdet/models/seg_heads/panoptic_fusion_heads/heuristic_fusion_head.py @@ -0,0 +1,126 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from mmdet.core.evaluation.panoptic_utils import INSTANCE_OFFSET +from mmdet.models.builder import HEADS +from .base_panoptic_fusion_head import BasePanopticFusionHead + + +@HEADS.register_module() +class HeuristicFusionHead(BasePanopticFusionHead): + """Fusion Head with Heuristic method.""" + + def __init__(self, + num_things_classes=80, + num_stuff_classes=53, + test_cfg=None, + init_cfg=None, + **kwargs): + super(HeuristicFusionHead, + self).__init__(num_things_classes, num_stuff_classes, test_cfg, + None, init_cfg, **kwargs) + + def forward_train(self, gt_masks=None, gt_semantic_seg=None, **kwargs): + """HeuristicFusionHead has no training loss.""" + return dict() + + def _lay_masks(self, bboxes, labels, masks, overlap_thr=0.5): + """Lay instance masks to a result map. + + Args: + bboxes: The bboxes results, (K, 4). + labels: The labels of bboxes, (K, ). + masks: The instance masks, (K, H, W). + overlap_thr: Threshold to determine whether two masks overlap. + default: 0.5. + + Returns: + Tensor: The result map, (H, W). + """ + num_insts = bboxes.shape[0] + id_map = torch.zeros( + masks.shape[-2:], device=bboxes.device, dtype=torch.long) + if num_insts == 0: + return id_map, labels + + scores, bboxes = bboxes[:, -1], bboxes[:, :4] + + # Sort by score to use heuristic fusion + order = torch.argsort(-scores) + bboxes = bboxes[order] + labels = labels[order] + segm_masks = masks[order] + + instance_id = 1 + left_labels = [] + for idx in range(bboxes.shape[0]): + _cls = labels[idx] + _mask = segm_masks[idx] + instance_id_map = torch.ones_like( + _mask, dtype=torch.long) * instance_id + area = _mask.sum() + if area == 0: + continue + + pasted = id_map > 0 + intersect = (_mask * pasted).sum() + if (intersect / (area + 1e-5)) > overlap_thr: + continue + + _part = _mask * (~pasted) + id_map = torch.where(_part, instance_id_map, id_map) + left_labels.append(_cls) + instance_id += 1 + + if len(left_labels) > 0: + instance_labels = torch.stack(left_labels) + else: + instance_labels = bboxes.new_zeros((0, ), dtype=torch.long) + assert instance_id == (len(instance_labels) + 1) + return id_map, instance_labels + + def simple_test(self, det_bboxes, det_labels, mask_preds, seg_preds, + **kwargs): + """Fuse the results of instance and semantic segmentations. + + Args: + det_bboxes: The bboxes results, (K, 4). + det_labels: The labels of bboxes, (K,). + mask_preds: The masks results, (K, H, W). + seg_preds: The semantic segmentation results, + (K, num_stuff + 1, H, W). + + Returns: + Tensor : The panoptic segmentation result, (H, W). + """ + mask_preds = mask_preds >= self.test_cfg.mask_thr_binary + id_map, labels = self._lay_masks(det_bboxes, det_labels, mask_preds, + self.test_cfg.mask_overlap) + + seg_results = seg_preds.argmax(dim=0) + seg_results = seg_results + self.num_things_classes + + pan_results = seg_results + instance_id = 1 + for idx in range(det_labels.shape[0]): + _mask = id_map == (idx + 1) + if _mask.sum() == 0: + continue + _cls = labels[idx] + # simply trust detection + segment_id = _cls + instance_id * INSTANCE_OFFSET + pan_results[_mask] = segment_id + instance_id += 1 + + ids, counts = torch.unique( + pan_results % INSTANCE_OFFSET, return_counts=True) + stuff_ids = ids[ids >= self.num_things_classes] + stuff_counts = counts[ids >= self.num_things_classes] + ignore_stuff_ids = stuff_ids[ + stuff_counts < self.test_cfg.stuff_area_limit] + + assert pan_results.ndim == 2 + pan_results[(pan_results.unsqueeze(2) == ignore_stuff_ids.reshape( + 1, 1, -1)).any(dim=2)] = self.num_classes + + return pan_results diff --git a/mmdet/models/seg_heads/panoptic_fusion_heads/maskformer_fusion_head.py b/mmdet/models/seg_heads/panoptic_fusion_heads/maskformer_fusion_head.py new file mode 100644 index 0000000..5b59ce4 --- /dev/null +++ b/mmdet/models/seg_heads/panoptic_fusion_heads/maskformer_fusion_head.py @@ -0,0 +1,241 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn.functional as F + +from mmdet.core.evaluation.panoptic_utils import INSTANCE_OFFSET +from mmdet.core.mask import mask2bbox +from mmdet.models.builder import HEADS +from .base_panoptic_fusion_head import BasePanopticFusionHead + + +@HEADS.register_module() +class MaskFormerFusionHead(BasePanopticFusionHead): + + def __init__(self, + num_things_classes=80, + num_stuff_classes=53, + test_cfg=None, + loss_panoptic=None, + init_cfg=None, + **kwargs): + super().__init__(num_things_classes, num_stuff_classes, test_cfg, + loss_panoptic, init_cfg, **kwargs) + + def forward_train(self, **kwargs): + """MaskFormerFusionHead has no training loss.""" + return dict() + + def panoptic_postprocess(self, mask_cls, mask_pred): + """Panoptic segmengation inference. + + Args: + mask_cls (Tensor): Classfication outputs of shape + (num_queries, cls_out_channels) for a image. + Note `cls_out_channels` should includes + background. + mask_pred (Tensor): Mask outputs of shape + (num_queries, h, w) for a image. + + Returns: + Tensor: Panoptic segment result of shape \ + (h, w), each element in Tensor means: \ + ``segment_id = _cls + instance_id * INSTANCE_OFFSET``. + """ + object_mask_thr = self.test_cfg.get('object_mask_thr', 0.8) + iou_thr = self.test_cfg.get('iou_thr', 0.8) + filter_low_score = self.test_cfg.get('filter_low_score', False) + + scores, labels = F.softmax(mask_cls, dim=-1).max(-1) + mask_pred = mask_pred.sigmoid() + + keep = labels.ne(self.num_classes) & (scores > object_mask_thr) + cur_scores = scores[keep] + cur_classes = labels[keep] + cur_masks = mask_pred[keep] + + cur_prob_masks = cur_scores.view(-1, 1, 1) * cur_masks + + h, w = cur_masks.shape[-2:] + panoptic_seg = torch.full((h, w), + self.num_classes, + dtype=torch.int32, + device=cur_masks.device) + if cur_masks.shape[0] == 0: + # We didn't detect any mask :( + pass + else: + cur_mask_ids = cur_prob_masks.argmax(0) + instance_id = 1 + for k in range(cur_classes.shape[0]): + pred_class = int(cur_classes[k].item()) + isthing = pred_class < self.num_things_classes + mask = cur_mask_ids == k + mask_area = mask.sum().item() + original_area = (cur_masks[k] >= 0.5).sum().item() + + if filter_low_score: + mask = mask & (cur_masks[k] >= 0.5) + + if mask_area > 0 and original_area > 0: + if mask_area / original_area < iou_thr: + continue + + if not isthing: + # different stuff regions of same class will be + # merged here, and stuff share the instance_id 0. + panoptic_seg[mask] = pred_class + else: + panoptic_seg[mask] = ( + pred_class + instance_id * INSTANCE_OFFSET) + instance_id += 1 + + return panoptic_seg + + def semantic_postprocess(self, mask_cls, mask_pred): + """Semantic segmengation postprocess. + + Args: + mask_cls (Tensor): Classfication outputs of shape + (num_queries, cls_out_channels) for a image. + Note `cls_out_channels` should includes + background. + mask_pred (Tensor): Mask outputs of shape + (num_queries, h, w) for a image. + + Returns: + Tensor: Semantic segment result of shape \ + (cls_out_channels, h, w). + """ + # TODO add semantic segmentation result + raise NotImplementedError + + def instance_postprocess(self, mask_cls, mask_pred): + """Instance segmengation postprocess. + + Args: + mask_cls (Tensor): Classfication outputs of shape + (num_queries, cls_out_channels) for a image. + Note `cls_out_channels` should includes + background. + mask_pred (Tensor): Mask outputs of shape + (num_queries, h, w) for a image. + + Returns: + tuple[Tensor]: Instance segmentation results. + + - labels_per_image (Tensor): Predicted labels,\ + shape (n, ). + - bboxes (Tensor): Bboxes and scores with shape (n, 5) of \ + positive region in binary mask, the last column is scores. + - mask_pred_binary (Tensor): Instance masks of \ + shape (n, h, w). + """ + max_per_image = self.test_cfg.get('max_per_image', 100) + num_queries = mask_cls.shape[0] + # shape (num_queries, num_class) + scores = F.softmax(mask_cls, dim=-1)[:, :-1] + # shape (num_queries * num_class, ) + labels = torch.arange(self.num_classes, device=mask_cls.device).\ + unsqueeze(0).repeat(num_queries, 1).flatten(0, 1) + scores_per_image, top_indices = scores.flatten(0, 1).topk( + max_per_image, sorted=False) + labels_per_image = labels[top_indices] + + query_indices = top_indices // self.num_classes + mask_pred = mask_pred[query_indices] + + # extract things + is_thing = labels_per_image < self.num_things_classes + scores_per_image = scores_per_image[is_thing] + labels_per_image = labels_per_image[is_thing] + mask_pred = mask_pred[is_thing] + + mask_pred_binary = (mask_pred > 0).float() + mask_scores_per_image = (mask_pred.sigmoid() * + mask_pred_binary).flatten(1).sum(1) / ( + mask_pred_binary.flatten(1).sum(1) + 1e-6) + det_scores = scores_per_image * mask_scores_per_image + mask_pred_binary = mask_pred_binary.bool() + bboxes = mask2bbox(mask_pred_binary) + bboxes = torch.cat([bboxes, det_scores[:, None]], dim=-1) + + return labels_per_image, bboxes, mask_pred_binary + + def simple_test(self, + mask_cls_results, + mask_pred_results, + img_metas, + rescale=False, + **kwargs): + """Test segment without test-time aumengtation. + + Only the output of last decoder layers was used. + + Args: + mask_cls_results (Tensor): Mask classification logits, + shape (batch_size, num_queries, cls_out_channels). + Note `cls_out_channels` should includes background. + mask_pred_results (Tensor): Mask logits, shape + (batch_size, num_queries, h, w). + img_metas (list[dict]): List of image information. + rescale (bool, optional): If True, return boxes in + original image space. Default False. + + Returns: + list[dict[str, Tensor | tuple[Tensor]]]: Semantic segmentation \ + results and panoptic segmentation results for each \ + image. + + .. code-block:: none + + [ + { + 'pan_results': Tensor, # shape = [h, w] + 'ins_results': tuple[Tensor], + # semantic segmentation results are not supported yet + 'sem_results': Tensor + }, + ... + ] + """ + panoptic_on = self.test_cfg.get('panoptic_on', True) + semantic_on = self.test_cfg.get('semantic_on', False) + instance_on = self.test_cfg.get('instance_on', False) + assert not semantic_on, 'segmantic segmentation '\ + 'results are not supported yet.' + + results = [] + for mask_cls_result, mask_pred_result, meta in zip( + mask_cls_results, mask_pred_results, img_metas): + # remove padding + img_height, img_width = meta['img_shape'][:2] + mask_pred_result = mask_pred_result[:, :img_height, :img_width] + + if rescale: + # return result in original resolution + ori_height, ori_width = meta['ori_shape'][:2] + mask_pred_result = F.interpolate( + mask_pred_result[:, None], + size=(ori_height, ori_width), + mode='bilinear', + align_corners=False)[:, 0] + + result = dict() + if panoptic_on: + pan_results = self.panoptic_postprocess( + mask_cls_result, mask_pred_result) + result['pan_results'] = pan_results + + if instance_on: + ins_results = self.instance_postprocess( + mask_cls_result, mask_pred_result) + result['ins_results'] = ins_results + + if semantic_on: + sem_results = self.semantic_postprocess( + mask_cls_result, mask_pred_result) + result['sem_results'] = sem_results + + results.append(result) + + return results diff --git a/mmdet/models/utils/__init__.py b/mmdet/models/utils/__init__.py new file mode 100644 index 0000000..e74ba89 --- /dev/null +++ b/mmdet/models/utils/__init__.py @@ -0,0 +1,34 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .brick_wrappers import AdaptiveAvgPool2d, adaptive_avg_pool2d +from .builder import build_linear_layer, build_transformer +from .ckpt_convert import pvt_convert +from .conv_upsample import ConvUpsample +from .csp_layer import CSPLayer +from .gaussian_target import gaussian_radius, gen_gaussian_target +from .inverted_residual import InvertedResidual +from .make_divisible import make_divisible +from .misc import interpolate_as, sigmoid_geometric_mean +from .normed_predictor import NormedConv2d, NormedLinear +from .panoptic_gt_processing import preprocess_panoptic_gt +from .point_sample import (get_uncertain_point_coords_with_randomness, + get_uncertainty) +from .positional_encoding import (LearnedPositionalEncoding, + SinePositionalEncoding) +from .res_layer import ResLayer, SimplifiedBasicBlock +from .se_layer import DyReLU, SELayer +from .transformer import (DetrTransformerDecoder, DetrTransformerDecoderLayer, + DynamicConv, PatchEmbed, Transformer, nchw_to_nlc, + nlc_to_nchw) + +__all__ = [ + 'ResLayer', 'gaussian_radius', 'gen_gaussian_target', + 'DetrTransformerDecoderLayer', 'DetrTransformerDecoder', 'Transformer', + 'build_transformer', 'build_linear_layer', 'SinePositionalEncoding', + 'LearnedPositionalEncoding', 'DynamicConv', 'SimplifiedBasicBlock', + 'NormedLinear', 'NormedConv2d', 'make_divisible', 'InvertedResidual', + 'SELayer', 'interpolate_as', 'ConvUpsample', 'CSPLayer', + 'adaptive_avg_pool2d', 'AdaptiveAvgPool2d', 'PatchEmbed', 'nchw_to_nlc', + 'nlc_to_nchw', 'pvt_convert', 'sigmoid_geometric_mean', + 'preprocess_panoptic_gt', 'DyReLU', + 'get_uncertain_point_coords_with_randomness', 'get_uncertainty' +] diff --git a/mmdet/models/utils/brick_wrappers.py b/mmdet/models/utils/brick_wrappers.py new file mode 100644 index 0000000..fa0279a --- /dev/null +++ b/mmdet/models/utils/brick_wrappers.py @@ -0,0 +1,51 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn.bricks.wrappers import NewEmptyTensorOp, obsolete_torch_version + +if torch.__version__ == 'parrots': + TORCH_VERSION = torch.__version__ +else: + # torch.__version__ could be 1.3.1+cu92, we only need the first two + # for comparison + TORCH_VERSION = tuple(int(x) for x in torch.__version__.split('.')[:2]) + + +def adaptive_avg_pool2d(input, output_size): + """Handle empty batch dimension to adaptive_avg_pool2d. + + Args: + input (tensor): 4D tensor. + output_size (int, tuple[int,int]): the target output size. + """ + if input.numel() == 0 and obsolete_torch_version(TORCH_VERSION, (1, 9)): + if isinstance(output_size, int): + output_size = [output_size, output_size] + output_size = [*input.shape[:2], *output_size] + empty = NewEmptyTensorOp.apply(input, output_size) + return empty + else: + return F.adaptive_avg_pool2d(input, output_size) + + +class AdaptiveAvgPool2d(nn.AdaptiveAvgPool2d): + """Handle empty batch dimension to AdaptiveAvgPool2d.""" + + def forward(self, x): + # PyTorch 1.9 does not support empty tensor inference yet + if x.numel() == 0 and obsolete_torch_version(TORCH_VERSION, (1, 9)): + output_size = self.output_size + if isinstance(output_size, int): + output_size = [output_size, output_size] + else: + output_size = [ + v if v is not None else d + for v, d in zip(output_size, + x.size()[-2:]) + ] + output_size = [*x.shape[:2], *output_size] + empty = NewEmptyTensorOp.apply(x, output_size) + return empty + + return super().forward(x) diff --git a/mmdet/models/utils/builder.py b/mmdet/models/utils/builder.py new file mode 100644 index 0000000..20fe7a6 --- /dev/null +++ b/mmdet/models/utils/builder.py @@ -0,0 +1,47 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +from mmcv.utils import Registry, build_from_cfg + +TRANSFORMER = Registry('Transformer') +LINEAR_LAYERS = Registry('linear layers') + + +def build_transformer(cfg, default_args=None): + """Builder for Transformer.""" + return build_from_cfg(cfg, TRANSFORMER, default_args) + + +LINEAR_LAYERS.register_module('Linear', module=nn.Linear) + + +def build_linear_layer(cfg, *args, **kwargs): + """Build linear layer. + Args: + cfg (None or dict): The linear layer config, which should contain: + - type (str): Layer type. + - layer args: Args needed to instantiate an linear layer. + args (argument list): Arguments passed to the `__init__` + method of the corresponding linear layer. + kwargs (keyword arguments): Keyword arguments passed to the `__init__` + method of the corresponding linear layer. + Returns: + nn.Module: Created linear layer. + """ + if cfg is None: + cfg_ = dict(type='Linear') + else: + if not isinstance(cfg, dict): + raise TypeError('cfg must be a dict') + if 'type' not in cfg: + raise KeyError('the cfg dict must contain the key "type"') + cfg_ = cfg.copy() + + layer_type = cfg_.pop('type') + if layer_type not in LINEAR_LAYERS: + raise KeyError(f'Unrecognized linear type {layer_type}') + else: + linear_layer = LINEAR_LAYERS.get(layer_type) + + layer = linear_layer(*args, **kwargs, **cfg_) + + return layer diff --git a/mmdet/models/utils/ckpt_convert.py b/mmdet/models/utils/ckpt_convert.py new file mode 100644 index 0000000..4d660c4 --- /dev/null +++ b/mmdet/models/utils/ckpt_convert.py @@ -0,0 +1,137 @@ +# Copyright (c) OpenMMLab. All rights reserved. + +# This script consists of several convert functions which +# can modify the weights of model in original repo to be +# pre-trained weights. + +from collections import OrderedDict + +import torch + + +def pvt_convert(ckpt): + new_ckpt = OrderedDict() + # Process the concat between q linear weights and kv linear weights + use_abs_pos_embed = False + use_conv_ffn = False + for k in ckpt.keys(): + if k.startswith('pos_embed'): + use_abs_pos_embed = True + if k.find('dwconv') >= 0: + use_conv_ffn = True + for k, v in ckpt.items(): + if k.startswith('head'): + continue + if k.startswith('norm.'): + continue + if k.startswith('cls_token'): + continue + if k.startswith('pos_embed'): + stage_i = int(k.replace('pos_embed', '')) + new_k = k.replace(f'pos_embed{stage_i}', + f'layers.{stage_i - 1}.1.0.pos_embed') + if stage_i == 4 and v.size(1) == 50: # 1 (cls token) + 7 * 7 + new_v = v[:, 1:, :] # remove cls token + else: + new_v = v + elif k.startswith('patch_embed'): + stage_i = int(k.split('.')[0].replace('patch_embed', '')) + new_k = k.replace(f'patch_embed{stage_i}', + f'layers.{stage_i - 1}.0') + new_v = v + if 'proj.' in new_k: + new_k = new_k.replace('proj.', 'projection.') + elif k.startswith('block'): + stage_i = int(k.split('.')[0].replace('block', '')) + layer_i = int(k.split('.')[1]) + new_layer_i = layer_i + use_abs_pos_embed + new_k = k.replace(f'block{stage_i}.{layer_i}', + f'layers.{stage_i - 1}.1.{new_layer_i}') + new_v = v + if 'attn.q.' in new_k: + sub_item_k = k.replace('q.', 'kv.') + new_k = new_k.replace('q.', 'attn.in_proj_') + new_v = torch.cat([v, ckpt[sub_item_k]], dim=0) + elif 'attn.kv.' in new_k: + continue + elif 'attn.proj.' in new_k: + new_k = new_k.replace('proj.', 'attn.out_proj.') + elif 'attn.sr.' in new_k: + new_k = new_k.replace('sr.', 'sr.') + elif 'mlp.' in new_k: + string = f'{new_k}-' + new_k = new_k.replace('mlp.', 'ffn.layers.') + if 'fc1.weight' in new_k or 'fc2.weight' in new_k: + new_v = v.reshape((*v.shape, 1, 1)) + new_k = new_k.replace('fc1.', '0.') + new_k = new_k.replace('dwconv.dwconv.', '1.') + if use_conv_ffn: + new_k = new_k.replace('fc2.', '4.') + else: + new_k = new_k.replace('fc2.', '3.') + string += f'{new_k} {v.shape}-{new_v.shape}' + elif k.startswith('norm'): + stage_i = int(k[4]) + new_k = k.replace(f'norm{stage_i}', f'layers.{stage_i - 1}.2') + new_v = v + else: + new_k = k + new_v = v + new_ckpt[new_k] = new_v + + return new_ckpt + + +def swin_converter(ckpt): + + new_ckpt = OrderedDict() + + def correct_unfold_reduction_order(x): + out_channel, in_channel = x.shape + x = x.reshape(out_channel, 4, in_channel // 4) + x = x[:, [0, 2, 1, 3], :].transpose(1, + 2).reshape(out_channel, in_channel) + return x + + def correct_unfold_norm_order(x): + in_channel = x.shape[0] + x = x.reshape(4, in_channel // 4) + x = x[[0, 2, 1, 3], :].transpose(0, 1).reshape(in_channel) + return x + + for k, v in ckpt.items(): + if k.startswith('head'): + continue + elif k.startswith('layers'): + new_v = v + if 'attn.' in k: + new_k = k.replace('attn.', 'attn.w_msa.') + elif 'mlp.' in k: + if 'mlp.fc1.' in k: + new_k = k.replace('mlp.fc1.', 'ffn.layers.0.0.') + elif 'mlp.fc2.' in k: + new_k = k.replace('mlp.fc2.', 'ffn.layers.1.') + else: + new_k = k.replace('mlp.', 'ffn.') + elif 'downsample' in k: + new_k = k + if 'reduction.' in k: + new_v = correct_unfold_reduction_order(v) + elif 'norm.' in k: + new_v = correct_unfold_norm_order(v) + else: + new_k = k + new_k = new_k.replace('layers', 'stages', 1) + elif k.startswith('patch_embed'): + new_v = v + if 'proj' in k: + new_k = k.replace('proj', 'projection') + else: + new_k = k + else: + new_v = v + new_k = k + + new_ckpt['backbone.' + new_k] = new_v + + return new_ckpt diff --git a/mmdet/models/utils/conv_upsample.py b/mmdet/models/utils/conv_upsample.py new file mode 100644 index 0000000..bb5ba76 --- /dev/null +++ b/mmdet/models/utils/conv_upsample.py @@ -0,0 +1,67 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn.functional as F +from mmcv.cnn import ConvModule +from mmcv.runner import BaseModule, ModuleList + + +class ConvUpsample(BaseModule): + """ConvUpsample performs 2x upsampling after Conv. + + There are several `ConvModule` layers. In the first few layers, upsampling + will be applied after each layer of convolution. The number of upsampling + must be no more than the number of ConvModule layers. + + Args: + in_channels (int): Number of channels in the input feature map. + inner_channels (int): Number of channels produced by the convolution. + num_layers (int): Number of convolution layers. + num_upsample (int | optional): Number of upsampling layer. Must be no + more than num_layers. Upsampling will be applied after the first + ``num_upsample`` layers of convolution. Default: ``num_layers``. + conv_cfg (dict): Config dict for convolution layer. Default: None, + which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. Default: None. + init_cfg (dict): Config dict for initialization. Default: None. + kwargs (key word augments): Other augments used in ConvModule. + """ + + def __init__(self, + in_channels, + inner_channels, + num_layers=1, + num_upsample=None, + conv_cfg=None, + norm_cfg=None, + init_cfg=None, + **kwargs): + super(ConvUpsample, self).__init__(init_cfg) + if num_upsample is None: + num_upsample = num_layers + assert num_upsample <= num_layers, \ + f'num_upsample({num_upsample})must be no more than ' \ + f'num_layers({num_layers})' + self.num_layers = num_layers + self.num_upsample = num_upsample + self.conv = ModuleList() + for i in range(num_layers): + self.conv.append( + ConvModule( + in_channels, + inner_channels, + 3, + padding=1, + stride=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + **kwargs)) + in_channels = inner_channels + + def forward(self, x): + num_upsample = self.num_upsample + for i in range(self.num_layers): + x = self.conv[i](x) + if num_upsample > 0: + num_upsample -= 1 + x = F.interpolate( + x, scale_factor=2, mode='bilinear', align_corners=False) + return x diff --git a/mmdet/models/utils/csp_layer.py b/mmdet/models/utils/csp_layer.py new file mode 100644 index 0000000..5760b01 --- /dev/null +++ b/mmdet/models/utils/csp_layer.py @@ -0,0 +1,150 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule +from mmcv.runner import BaseModule + + +class DarknetBottleneck(BaseModule): + """The basic bottleneck block used in Darknet. + + Each ResBlock consists of two ConvModules and the input is added to the + final output. Each ConvModule is composed of Conv, BN, and LeakyReLU. + The first convLayer has filter size of 1x1 and the second one has the + filter size of 3x3. + + Args: + in_channels (int): The input channels of this Module. + out_channels (int): The output channels of this Module. + expansion (int): The kernel size of the convolution. Default: 0.5 + add_identity (bool): Whether to add identity to the out. + Default: True + use_depthwise (bool): Whether to use depthwise separable convolution. + Default: False + conv_cfg (dict): Config dict for convolution layer. Default: None, + which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='Swish'). + """ + + def __init__(self, + in_channels, + out_channels, + expansion=0.5, + add_identity=True, + use_depthwise=False, + conv_cfg=None, + norm_cfg=dict(type='BN', momentum=0.03, eps=0.001), + act_cfg=dict(type='Swish'), + init_cfg=None): + super().__init__(init_cfg) + hidden_channels = int(out_channels * expansion) + conv = DepthwiseSeparableConvModule if use_depthwise else ConvModule + self.conv1 = ConvModule( + in_channels, + hidden_channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.conv2 = conv( + hidden_channels, + out_channels, + 3, + stride=1, + padding=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.add_identity = \ + add_identity and in_channels == out_channels + + def forward(self, x): + identity = x + out = self.conv1(x) + out = self.conv2(out) + + if self.add_identity: + return out + identity + else: + return out + + +class CSPLayer(BaseModule): + """Cross Stage Partial Layer. + + Args: + in_channels (int): The input channels of the CSP layer. + out_channels (int): The output channels of the CSP layer. + expand_ratio (float): Ratio to adjust the number of channels of the + hidden layer. Default: 0.5 + num_blocks (int): Number of blocks. Default: 1 + add_identity (bool): Whether to add identity in blocks. + Default: True + use_depthwise (bool): Whether to depthwise separable convolution in + blocks. Default: False + conv_cfg (dict, optional): Config dict for convolution layer. + Default: None, which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN') + act_cfg (dict): Config dict for activation layer. + Default: dict(type='Swish') + """ + + def __init__(self, + in_channels, + out_channels, + expand_ratio=0.5, + num_blocks=1, + add_identity=True, + use_depthwise=False, + conv_cfg=None, + norm_cfg=dict(type='BN', momentum=0.03, eps=0.001), + act_cfg=dict(type='Swish'), + init_cfg=None): + super().__init__(init_cfg) + mid_channels = int(out_channels * expand_ratio) + self.main_conv = ConvModule( + in_channels, + mid_channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.short_conv = ConvModule( + in_channels, + mid_channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.final_conv = ConvModule( + 2 * mid_channels, + out_channels, + 1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + self.blocks = nn.Sequential(*[ + DarknetBottleneck( + mid_channels, + mid_channels, + 1.0, + add_identity, + use_depthwise, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) for _ in range(num_blocks) + ]) + + def forward(self, x): + x_short = self.short_conv(x) + + x_main = self.main_conv(x) + x_main = self.blocks(x_main) + + x_final = torch.cat((x_main, x_short), dim=1) + return self.final_conv(x_final) diff --git a/mmdet/models/utils/gaussian_target.py b/mmdet/models/utils/gaussian_target.py new file mode 100644 index 0000000..9997d3b --- /dev/null +++ b/mmdet/models/utils/gaussian_target.py @@ -0,0 +1,268 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from math import sqrt + +import torch +import torch.nn.functional as F + + +def gaussian2D(radius, sigma=1, dtype=torch.float32, device='cpu'): + """Generate 2D gaussian kernel. + + Args: + radius (int): Radius of gaussian kernel. + sigma (int): Sigma of gaussian function. Default: 1. + dtype (torch.dtype): Dtype of gaussian tensor. Default: torch.float32. + device (str): Device of gaussian tensor. Default: 'cpu'. + + Returns: + h (Tensor): Gaussian kernel with a + ``(2 * radius + 1) * (2 * radius + 1)`` shape. + """ + x = torch.arange( + -radius, radius + 1, dtype=dtype, device=device).view(1, -1) + y = torch.arange( + -radius, radius + 1, dtype=dtype, device=device).view(-1, 1) + + h = (-(x * x + y * y) / (2 * sigma * sigma)).exp() + + h[h < torch.finfo(h.dtype).eps * h.max()] = 0 + return h + + +def gen_gaussian_target(heatmap, center, radius, k=1): + """Generate 2D gaussian heatmap. + + Args: + heatmap (Tensor): Input heatmap, the gaussian kernel will cover on + it and maintain the max value. + center (list[int]): Coord of gaussian kernel's center. + radius (int): Radius of gaussian kernel. + k (int): Coefficient of gaussian kernel. Default: 1. + + Returns: + out_heatmap (Tensor): Updated heatmap covered by gaussian kernel. + """ + diameter = 2 * radius + 1 + gaussian_kernel = gaussian2D( + radius, sigma=diameter / 6, dtype=heatmap.dtype, device=heatmap.device) + + x, y = center + + height, width = heatmap.shape[:2] + + left, right = min(x, radius), min(width - x, radius + 1) + top, bottom = min(y, radius), min(height - y, radius + 1) + + masked_heatmap = heatmap[y - top:y + bottom, x - left:x + right] + masked_gaussian = gaussian_kernel[radius - top:radius + bottom, + radius - left:radius + right] + out_heatmap = heatmap + torch.max( + masked_heatmap, + masked_gaussian * k, + out=out_heatmap[y - top:y + bottom, x - left:x + right]) + + return out_heatmap + + +def gaussian_radius(det_size, min_overlap): + r"""Generate 2D gaussian radius. + + This function is modified from the `official github repo + `_. + + Given ``min_overlap``, radius could computed by a quadratic equation + according to Vieta's formulas. + + There are 3 cases for computing gaussian radius, details are following: + + - Explanation of figure: ``lt`` and ``br`` indicates the left-top and + bottom-right corner of ground truth box. ``x`` indicates the + generated corner at the limited position when ``radius=r``. + + - Case1: one corner is inside the gt box and the other is outside. + + .. code:: text + + |< width >| + + lt-+----------+ - + | | | ^ + +--x----------+--+ + | | | | + | | | | height + | | overlap | | + | | | | + | | | | v + +--+---------br--+ - + | | | + +----------+--x + + To ensure IoU of generated box and gt box is larger than ``min_overlap``: + + .. math:: + \cfrac{(w-r)*(h-r)}{w*h+(w+h)r-r^2} \ge {iou} \quad\Rightarrow\quad + {r^2-(w+h)r+\cfrac{1-iou}{1+iou}*w*h} \ge 0 \\ + {a} = 1,\quad{b} = {-(w+h)},\quad{c} = {\cfrac{1-iou}{1+iou}*w*h} \\ + {r} \le \cfrac{-b-\sqrt{b^2-4*a*c}}{2*a} + + - Case2: both two corners are inside the gt box. + + .. code:: text + + |< width >| + + lt-+----------+ - + | | | ^ + +--x-------+ | + | | | | + | |overlap| | height + | | | | + | +-------x--+ + | | | v + +----------+-br - + + To ensure IoU of generated box and gt box is larger than ``min_overlap``: + + .. math:: + \cfrac{(w-2*r)*(h-2*r)}{w*h} \ge {iou} \quad\Rightarrow\quad + {4r^2-2(w+h)r+(1-iou)*w*h} \ge 0 \\ + {a} = 4,\quad {b} = {-2(w+h)},\quad {c} = {(1-iou)*w*h} \\ + {r} \le \cfrac{-b-\sqrt{b^2-4*a*c}}{2*a} + + - Case3: both two corners are outside the gt box. + + .. code:: text + + |< width >| + + x--+----------------+ + | | | + +-lt-------------+ | - + | | | | ^ + | | | | + | | overlap | | height + | | | | + | | | | v + | +------------br--+ - + | | | + +----------------+--x + + To ensure IoU of generated box and gt box is larger than ``min_overlap``: + + .. math:: + \cfrac{w*h}{(w+2*r)*(h+2*r)} \ge {iou} \quad\Rightarrow\quad + {4*iou*r^2+2*iou*(w+h)r+(iou-1)*w*h} \le 0 \\ + {a} = {4*iou},\quad {b} = {2*iou*(w+h)},\quad {c} = {(iou-1)*w*h} \\ + {r} \le \cfrac{-b+\sqrt{b^2-4*a*c}}{2*a} + + Args: + det_size (list[int]): Shape of object. + min_overlap (float): Min IoU with ground truth for boxes generated by + keypoints inside the gaussian kernel. + + Returns: + radius (int): Radius of gaussian kernel. + """ + height, width = det_size + + a1 = 1 + b1 = (height + width) + c1 = width * height * (1 - min_overlap) / (1 + min_overlap) + sq1 = sqrt(b1**2 - 4 * a1 * c1) + r1 = (b1 - sq1) / (2 * a1) + + a2 = 4 + b2 = 2 * (height + width) + c2 = (1 - min_overlap) * width * height + sq2 = sqrt(b2**2 - 4 * a2 * c2) + r2 = (b2 - sq2) / (2 * a2) + + a3 = 4 * min_overlap + b3 = -2 * min_overlap * (height + width) + c3 = (min_overlap - 1) * width * height + sq3 = sqrt(b3**2 - 4 * a3 * c3) + r3 = (b3 + sq3) / (2 * a3) + return min(r1, r2, r3) + + +def get_local_maximum(heat, kernel=3): + """Extract local maximum pixel with given kernel. + + Args: + heat (Tensor): Target heatmap. + kernel (int): Kernel size of max pooling. Default: 3. + + Returns: + heat (Tensor): A heatmap where local maximum pixels maintain its + own value and other positions are 0. + """ + pad = (kernel - 1) // 2 + hmax = F.max_pool2d(heat, kernel, stride=1, padding=pad) + keep = (hmax == heat).float() + return heat * keep + + +def get_topk_from_heatmap(scores, k=20): + """Get top k positions from heatmap. + + Args: + scores (Tensor): Target heatmap with shape + [batch, num_classes, height, width]. + k (int): Target number. Default: 20. + + Returns: + tuple[torch.Tensor]: Scores, indexes, categories and coords of + topk keypoint. Containing following Tensors: + + - topk_scores (Tensor): Max scores of each topk keypoint. + - topk_inds (Tensor): Indexes of each topk keypoint. + - topk_clses (Tensor): Categories of each topk keypoint. + - topk_ys (Tensor): Y-coord of each topk keypoint. + - topk_xs (Tensor): X-coord of each topk keypoint. + """ + batch, _, height, width = scores.size() + topk_scores, topk_inds = torch.topk(scores.view(batch, -1), k) + topk_clses = topk_inds // (height * width) + topk_inds = topk_inds % (height * width) + topk_ys = topk_inds // width + topk_xs = (topk_inds % width).int().float() + return topk_scores, topk_inds, topk_clses, topk_ys, topk_xs + + +def gather_feat(feat, ind, mask=None): + """Gather feature according to index. + + Args: + feat (Tensor): Target feature map. + ind (Tensor): Target coord index. + mask (Tensor | None): Mask of feature map. Default: None. + + Returns: + feat (Tensor): Gathered feature. + """ + dim = feat.size(2) + ind = ind.unsqueeze(2).repeat(1, 1, dim) + feat = feat.gather(1, ind) + if mask is not None: + mask = mask.unsqueeze(2).expand_as(feat) + feat = feat[mask] + feat = feat.view(-1, dim) + return feat + + +def transpose_and_gather_feat(feat, ind): + """Transpose and gather feature according to index. + + Args: + feat (Tensor): Target feature map. + ind (Tensor): Target coord index. + + Returns: + feat (Tensor): Transposed and gathered feature. + """ + feat = feat.permute(0, 2, 3, 1).contiguous() + feat = feat.view(feat.size(0), -1, feat.size(3)) + feat = gather_feat(feat, ind) + return feat diff --git a/mmdet/models/utils/inverted_residual.py b/mmdet/models/utils/inverted_residual.py new file mode 100644 index 0000000..1f241ae --- /dev/null +++ b/mmdet/models/utils/inverted_residual.py @@ -0,0 +1,130 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch.nn as nn +import torch.utils.checkpoint as cp +from mmcv.cnn import ConvModule +from mmcv.cnn.bricks import DropPath +from mmcv.runner import BaseModule + +from .se_layer import SELayer + + +class InvertedResidual(BaseModule): + """Inverted Residual Block. + + Args: + in_channels (int): The input channels of this Module. + out_channels (int): The output channels of this Module. + mid_channels (int): The input channels of the depthwise convolution. + kernel_size (int): The kernel size of the depthwise convolution. + Default: 3. + stride (int): The stride of the depthwise convolution. Default: 1. + se_cfg (dict): Config dict for se layer. Default: None, which means no + se layer. + with_expand_conv (bool): Use expand conv or not. If set False, + mid_channels must be the same with in_channels. + Default: True. + conv_cfg (dict): Config dict for convolution layer. Default: None, + which means using conv2d. + norm_cfg (dict): Config dict for normalization layer. + Default: dict(type='BN'). + act_cfg (dict): Config dict for activation layer. + Default: dict(type='ReLU'). + drop_path_rate (float): stochastic depth rate. Defaults to 0. + with_cp (bool): Use checkpoint or not. Using checkpoint will save some + memory while slowing down the training speed. Default: False. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + + Returns: + Tensor: The output tensor. + """ + + def __init__(self, + in_channels, + out_channels, + mid_channels, + kernel_size=3, + stride=1, + se_cfg=None, + with_expand_conv=True, + conv_cfg=None, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU'), + drop_path_rate=0., + with_cp=False, + init_cfg=None): + super(InvertedResidual, self).__init__(init_cfg) + self.with_res_shortcut = (stride == 1 and in_channels == out_channels) + assert stride in [1, 2], f'stride must in [1, 2]. ' \ + f'But received {stride}.' + self.with_cp = with_cp + self.drop_path = DropPath( + drop_path_rate) if drop_path_rate > 0 else nn.Identity() + self.with_se = se_cfg is not None + self.with_expand_conv = with_expand_conv + + if self.with_se: + assert isinstance(se_cfg, dict) + if not self.with_expand_conv: + assert mid_channels == in_channels + + if self.with_expand_conv: + self.expand_conv = ConvModule( + in_channels=in_channels, + out_channels=mid_channels, + kernel_size=1, + stride=1, + padding=0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + self.depthwise_conv = ConvModule( + in_channels=mid_channels, + out_channels=mid_channels, + kernel_size=kernel_size, + stride=stride, + padding=kernel_size // 2, + groups=mid_channels, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=act_cfg) + + if self.with_se: + self.se = SELayer(**se_cfg) + + self.linear_conv = ConvModule( + in_channels=mid_channels, + out_channels=out_channels, + kernel_size=1, + stride=1, + padding=0, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + act_cfg=None) + + def forward(self, x): + + def _inner_forward(x): + out = x + + if self.with_expand_conv: + out = self.expand_conv(out) + + out = self.depthwise_conv(out) + + if self.with_se: + out = self.se(out) + + out = self.linear_conv(out) + + if self.with_res_shortcut: + return x + self.drop_path(out) + else: + return out + + if self.with_cp and x.requires_grad: + out = cp.checkpoint(_inner_forward, x) + else: + out = _inner_forward(x) + + return out diff --git a/mmdet/models/utils/make_divisible.py b/mmdet/models/utils/make_divisible.py new file mode 100644 index 0000000..ed42c2e --- /dev/null +++ b/mmdet/models/utils/make_divisible.py @@ -0,0 +1,28 @@ +# Copyright (c) OpenMMLab. All rights reserved. +def make_divisible(value, divisor, min_value=None, min_ratio=0.9): + """Make divisible function. + + This function rounds the channel number to the nearest value that can be + divisible by the divisor. It is taken from the original tf repo. It ensures + that all layers have a channel number that is divisible by divisor. It can + be seen here: https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet.py # noqa + + Args: + value (int): The original channel number. + divisor (int): The divisor to fully divide the channel number. + min_value (int): The minimum value of the output channel. + Default: None, means that the minimum value equal to the divisor. + min_ratio (float): The minimum ratio of the rounded channel number to + the original channel number. Default: 0.9. + + Returns: + int: The modified output channel number. + """ + + if min_value is None: + min_value = divisor + new_value = max(min_value, int(value + divisor / 2) // divisor * divisor) + # Make sure that round down does not go down by more than (1-min_ratio). + if new_value < min_ratio * value: + new_value += divisor + return new_value diff --git a/mmdet/models/utils/misc.py b/mmdet/models/utils/misc.py new file mode 100644 index 0000000..8f9be9a --- /dev/null +++ b/mmdet/models/utils/misc.py @@ -0,0 +1,72 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from torch.autograd import Function +from torch.nn import functional as F + + +class SigmoidGeometricMean(Function): + """Forward and backward function of geometric mean of two sigmoid + functions. + + This implementation with analytical gradient function substitutes + the autograd function of (x.sigmoid() * y.sigmoid()).sqrt(). The + original implementation incurs none during gradient backprapagation + if both x and y are very small values. + """ + + @staticmethod + def forward(ctx, x, y): + x_sigmoid = x.sigmoid() + y_sigmoid = y.sigmoid() + z = (x_sigmoid * y_sigmoid).sqrt() + ctx.save_for_backward(x_sigmoid, y_sigmoid, z) + return z + + @staticmethod + def backward(ctx, grad_output): + x_sigmoid, y_sigmoid, z = ctx.saved_tensors + grad_x = grad_output * z * (1 - x_sigmoid) / 2 + grad_y = grad_output * z * (1 - y_sigmoid) / 2 + return grad_x, grad_y + + +sigmoid_geometric_mean = SigmoidGeometricMean.apply + + +def interpolate_as(source, target, mode='bilinear', align_corners=False): + """Interpolate the `source` to the shape of the `target`. + + The `source` must be a Tensor, but the `target` can be a Tensor or a + np.ndarray with the shape (..., target_h, target_w). + + Args: + source (Tensor): A 3D/4D Tensor with the shape (N, H, W) or + (N, C, H, W). + target (Tensor | np.ndarray): The interpolation target with the shape + (..., target_h, target_w). + mode (str): Algorithm used for interpolation. The options are the + same as those in F.interpolate(). Default: ``'bilinear'``. + align_corners (bool): The same as the argument in F.interpolate(). + + Returns: + Tensor: The interpolated source Tensor. + """ + assert len(target.shape) >= 2 + + def _interpolate_as(source, target, mode='bilinear', align_corners=False): + """Interpolate the `source` (4D) to the shape of the `target`.""" + target_h, target_w = target.shape[-2:] + source_h, source_w = source.shape[-2:] + if target_h != source_h or target_w != source_w: + source = F.interpolate( + source, + size=(target_h, target_w), + mode=mode, + align_corners=align_corners) + return source + + if len(source.shape) == 3: + source = source[:, None, :, :] + source = _interpolate_as(source, target, mode, align_corners) + return source[:, 0, :, :] + else: + return _interpolate_as(source, target, mode, align_corners) diff --git a/mmdet/models/utils/normed_predictor.py b/mmdet/models/utils/normed_predictor.py new file mode 100644 index 0000000..f0eeef7 --- /dev/null +++ b/mmdet/models/utils/normed_predictor.py @@ -0,0 +1,88 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import CONV_LAYERS + +from .builder import LINEAR_LAYERS + + +@LINEAR_LAYERS.register_module(name='NormedLinear') +class NormedLinear(nn.Linear): + """Normalized Linear Layer. + + Args: + tempeature (float, optional): Tempeature term. Default to 20. + power (int, optional): Power term. Default to 1.0. + eps (float, optional): The minimal value of divisor to + keep numerical stability. Default to 1e-6. + """ + + def __init__(self, *args, tempearture=20, power=1.0, eps=1e-6, **kwargs): + super(NormedLinear, self).__init__(*args, **kwargs) + self.tempearture = tempearture + self.power = power + self.eps = eps + self.init_weights() + + def init_weights(self): + nn.init.normal_(self.weight, mean=0, std=0.01) + if self.bias is not None: + nn.init.constant_(self.bias, 0) + + def forward(self, x): + weight_ = self.weight / ( + self.weight.norm(dim=1, keepdim=True).pow(self.power) + self.eps) + x_ = x / (x.norm(dim=1, keepdim=True).pow(self.power) + self.eps) + x_ = x_ * self.tempearture + + return F.linear(x_, weight_, self.bias) + + +@CONV_LAYERS.register_module(name='NormedConv2d') +class NormedConv2d(nn.Conv2d): + """Normalized Conv2d Layer. + + Args: + tempeature (float, optional): Tempeature term. Default to 20. + power (int, optional): Power term. Default to 1.0. + eps (float, optional): The minimal value of divisor to + keep numerical stability. Default to 1e-6. + norm_over_kernel (bool, optional): Normalize over kernel. + Default to False. + """ + + def __init__(self, + *args, + tempearture=20, + power=1.0, + eps=1e-6, + norm_over_kernel=False, + **kwargs): + super(NormedConv2d, self).__init__(*args, **kwargs) + self.tempearture = tempearture + self.power = power + self.norm_over_kernel = norm_over_kernel + self.eps = eps + + def forward(self, x): + if not self.norm_over_kernel: + weight_ = self.weight / ( + self.weight.norm(dim=1, keepdim=True).pow(self.power) + + self.eps) + else: + weight_ = self.weight / ( + self.weight.view(self.weight.size(0), -1).norm( + dim=1, keepdim=True).pow(self.power)[..., None, None] + + self.eps) + x_ = x / (x.norm(dim=1, keepdim=True).pow(self.power) + self.eps) + x_ = x_ * self.tempearture + + if hasattr(self, 'conv2d_forward'): + x_ = self.conv2d_forward(x_, weight_) + else: + if torch.__version__ >= '1.8': + x_ = self._conv_forward(x_, weight_, self.bias) + else: + x_ = self._conv_forward(x_, weight_) + return x_ diff --git a/mmdet/models/utils/panoptic_gt_processing.py b/mmdet/models/utils/panoptic_gt_processing.py new file mode 100644 index 0000000..7685ac9 --- /dev/null +++ b/mmdet/models/utils/panoptic_gt_processing.py @@ -0,0 +1,68 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + + +def preprocess_panoptic_gt(gt_labels, gt_masks, gt_semantic_seg, num_things, + num_stuff, img_metas): + """Preprocess the ground truth for a image. + + Args: + gt_labels (Tensor): Ground truth labels of each bbox, + with shape (num_gts, ). + gt_masks (BitmapMasks): Ground truth masks of each instances + of a image, shape (num_gts, h, w). + gt_semantic_seg (Tensor | None): Ground truth of semantic + segmentation with the shape (1, h, w). + [0, num_thing_class - 1] means things, + [num_thing_class, num_class-1] means stuff, + 255 means VOID. It's None when training instance segmentation. + img_metas (dict): List of image meta information. + + Returns: + tuple: a tuple containing the following targets. + + - labels (Tensor): Ground truth class indices for a + image, with shape (n, ), n is the sum of number + of stuff type and number of instance in a image. + - masks (Tensor): Ground truth mask for a image, with + shape (n, h, w). Contains stuff and things when training + panoptic segmentation, and things only when training + instance segmentation. + """ + num_classes = num_things + num_stuff + + things_masks = gt_masks.pad(img_metas['pad_shape'][:2], pad_val=0)\ + .to_tensor(dtype=torch.bool, device=gt_labels.device) + + if gt_semantic_seg is None: + masks = things_masks.long() + return gt_labels, masks + + things_labels = gt_labels + gt_semantic_seg = gt_semantic_seg.squeeze(0) + + semantic_labels = torch.unique( + gt_semantic_seg, + sorted=False, + return_inverse=False, + return_counts=False) + stuff_masks_list = [] + stuff_labels_list = [] + for label in semantic_labels: + if label < num_things or label >= num_classes: + continue + stuff_mask = gt_semantic_seg == label + stuff_masks_list.append(stuff_mask) + stuff_labels_list.append(label) + + if len(stuff_masks_list) > 0: + stuff_masks = torch.stack(stuff_masks_list, dim=0) + stuff_labels = torch.stack(stuff_labels_list, dim=0) + labels = torch.cat([things_labels, stuff_labels], dim=0) + masks = torch.cat([things_masks, stuff_masks], dim=0) + else: + labels = things_labels + masks = things_masks + + masks = masks.long() + return labels, masks diff --git a/mmdet/models/utils/point_sample.py b/mmdet/models/utils/point_sample.py new file mode 100644 index 0000000..c2c3cf9 --- /dev/null +++ b/mmdet/models/utils/point_sample.py @@ -0,0 +1,87 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +from mmcv.ops import point_sample + + +def get_uncertainty(mask_pred, labels): + """Estimate uncertainty based on pred logits. + + We estimate uncertainty as L1 distance between 0.0 and the logits + prediction in 'mask_pred' for the foreground class in `classes`. + + Args: + mask_pred (Tensor): mask predication logits, shape (num_rois, + num_classes, mask_height, mask_width). + + labels (list[Tensor]): Either predicted or ground truth label for + each predicted mask, of length num_rois. + + Returns: + scores (Tensor): Uncertainty scores with the most uncertain + locations having the highest uncertainty score, + shape (num_rois, 1, mask_height, mask_width) + """ + if mask_pred.shape[1] == 1: + gt_class_logits = mask_pred.clone() + else: + inds = torch.arange(mask_pred.shape[0], device=mask_pred.device) + gt_class_logits = mask_pred[inds, labels].unsqueeze(1) + return -torch.abs(gt_class_logits) + + +def get_uncertain_point_coords_with_randomness(mask_pred, labels, num_points, + oversample_ratio, + importance_sample_ratio): + """Get ``num_points`` most uncertain points with random points during + train. + + Sample points in [0, 1] x [0, 1] coordinate space based on their + uncertainty. The uncertainties are calculated for each point using + 'get_uncertainty()' function that takes point's logit prediction as + input. + + Args: + mask_pred (Tensor): A tensor of shape (num_rois, num_classes, + mask_height, mask_width) for class-specific or class-agnostic + prediction. + labels (list): The ground truth class for each instance. + num_points (int): The number of points to sample. + oversample_ratio (int): Oversampling parameter. + importance_sample_ratio (float): Ratio of points that are sampled + via importnace sampling. + + Returns: + point_coords (Tensor): A tensor of shape (num_rois, num_points, 2) + that contains the coordinates sampled points. + """ + assert oversample_ratio >= 1 + assert 0 <= importance_sample_ratio <= 1 + batch_size = mask_pred.shape[0] + num_sampled = int(num_points * oversample_ratio) + point_coords = torch.rand( + batch_size, num_sampled, 2, device=mask_pred.device) + point_logits = point_sample(mask_pred, point_coords) + # It is crucial to calculate uncertainty based on the sampled + # prediction value for the points. Calculating uncertainties of the + # coarse predictions first and sampling them for points leads to + # incorrect results. To illustrate this: assume uncertainty func( + # logits)=-abs(logits), a sampled point between two coarse + # predictions with -1 and 1 logits has 0 logits, and therefore 0 + # uncertainty value. However, if we calculate uncertainties for the + # coarse predictions first, both will have -1 uncertainty, + # and sampled point will get -1 uncertainty. + point_uncertainties = get_uncertainty(point_logits, labels) + num_uncertain_points = int(importance_sample_ratio * num_points) + num_random_points = num_points - num_uncertain_points + idx = torch.topk( + point_uncertainties[:, 0, :], k=num_uncertain_points, dim=1)[1] + shift = num_sampled * torch.arange( + batch_size, dtype=torch.long, device=mask_pred.device) + idx += shift[:, None] + point_coords = point_coords.view(-1, 2)[idx.view(-1), :].view( + batch_size, num_uncertain_points, 2) + if num_random_points > 0: + rand_roi_coords = torch.rand( + batch_size, num_random_points, 2, device=mask_pred.device) + point_coords = torch.cat((point_coords, rand_roi_coords), dim=1) + return point_coords diff --git a/mmdet/models/utils/positional_encoding.py b/mmdet/models/utils/positional_encoding.py new file mode 100644 index 0000000..dd29cd6 --- /dev/null +++ b/mmdet/models/utils/positional_encoding.py @@ -0,0 +1,163 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math + +import torch +import torch.nn as nn +from mmcv.cnn.bricks.transformer import POSITIONAL_ENCODING +from mmcv.runner import BaseModule + + +@POSITIONAL_ENCODING.register_module() +class SinePositionalEncoding(BaseModule): + """Position encoding with sine and cosine functions. + + See `End-to-End Object Detection with Transformers + `_ for details. + + Args: + num_feats (int): The feature dimension for each position + along x-axis or y-axis. Note the final returned dimension + for each position is 2 times of this value. + temperature (int, optional): The temperature used for scaling + the position embedding. Defaults to 10000. + normalize (bool, optional): Whether to normalize the position + embedding. Defaults to False. + scale (float, optional): A scale factor that scales the position + embedding. The scale will be used only when `normalize` is True. + Defaults to 2*pi. + eps (float, optional): A value added to the denominator for + numerical stability. Defaults to 1e-6. + offset (float): offset add to embed when do the normalization. + Defaults to 0. + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + num_feats, + temperature=10000, + normalize=False, + scale=2 * math.pi, + eps=1e-6, + offset=0., + init_cfg=None): + super(SinePositionalEncoding, self).__init__(init_cfg) + if normalize: + assert isinstance(scale, (float, int)), 'when normalize is set,' \ + 'scale should be provided and in float or int type, ' \ + f'found {type(scale)}' + self.num_feats = num_feats + self.temperature = temperature + self.normalize = normalize + self.scale = scale + self.eps = eps + self.offset = offset + + def forward(self, mask): + """Forward function for `SinePositionalEncoding`. + + Args: + mask (Tensor): ByteTensor mask. Non-zero values representing + ignored positions, while zero values means valid positions + for this image. Shape [bs, h, w]. + + Returns: + pos (Tensor): Returned position embedding with shape + [bs, num_feats*2, h, w]. + """ + # For convenience of exporting to ONNX, it's required to convert + # `masks` from bool to int. + mask = mask.to(torch.int) + not_mask = 1 - mask # logical_not + y_embed = not_mask.cumsum(1, dtype=torch.float32) + x_embed = not_mask.cumsum(2, dtype=torch.float32) + if self.normalize: + y_embed = (y_embed + self.offset) / \ + (y_embed[:, -1:, :] + self.eps) * self.scale + x_embed = (x_embed + self.offset) / \ + (x_embed[:, :, -1:] + self.eps) * self.scale + dim_t = torch.arange( + self.num_feats, dtype=torch.float32, device=mask.device) + dim_t = self.temperature**(2 * (dim_t // 2) / self.num_feats) + pos_x = x_embed[:, :, :, None] / dim_t + pos_y = y_embed[:, :, :, None] / dim_t + # use `view` instead of `flatten` for dynamically exporting to ONNX + B, H, W = mask.size() + pos_x = torch.stack( + (pos_x[:, :, :, 0::2].sin(), pos_x[:, :, :, 1::2].cos()), + dim=4).view(B, H, W, -1) + pos_y = torch.stack( + (pos_y[:, :, :, 0::2].sin(), pos_y[:, :, :, 1::2].cos()), + dim=4).view(B, H, W, -1) + pos = torch.cat((pos_y, pos_x), dim=3).permute(0, 3, 1, 2) + return pos + + def __repr__(self): + """str: a string that describes the module""" + repr_str = self.__class__.__name__ + repr_str += f'(num_feats={self.num_feats}, ' + repr_str += f'temperature={self.temperature}, ' + repr_str += f'normalize={self.normalize}, ' + repr_str += f'scale={self.scale}, ' + repr_str += f'eps={self.eps})' + return repr_str + + +@POSITIONAL_ENCODING.register_module() +class LearnedPositionalEncoding(BaseModule): + """Position embedding with learnable embedding weights. + + Args: + num_feats (int): The feature dimension for each position + along x-axis or y-axis. The final returned dimension for + each position is 2 times of this value. + row_num_embed (int, optional): The dictionary size of row embeddings. + Default 50. + col_num_embed (int, optional): The dictionary size of col embeddings. + Default 50. + init_cfg (dict or list[dict], optional): Initialization config dict. + """ + + def __init__(self, + num_feats, + row_num_embed=50, + col_num_embed=50, + init_cfg=dict(type='Uniform', layer='Embedding')): + super(LearnedPositionalEncoding, self).__init__(init_cfg) + self.row_embed = nn.Embedding(row_num_embed, num_feats) + self.col_embed = nn.Embedding(col_num_embed, num_feats) + self.num_feats = num_feats + self.row_num_embed = row_num_embed + self.col_num_embed = col_num_embed + + def forward(self, mask): + """Forward function for `LearnedPositionalEncoding`. + + Args: + mask (Tensor): ByteTensor mask. Non-zero values representing + ignored positions, while zero values means valid positions + for this image. Shape [bs, h, w]. + + Returns: + pos (Tensor): Returned position embedding with shape + [bs, num_feats*2, h, w]. + """ + h, w = mask.shape[-2:] + x = torch.arange(w, device=mask.device) + y = torch.arange(h, device=mask.device) + x_embed = self.col_embed(x) + y_embed = self.row_embed(y) + pos = torch.cat( + (x_embed.unsqueeze(0).repeat(h, 1, 1), y_embed.unsqueeze(1).repeat( + 1, w, 1)), + dim=-1).permute(2, 0, + 1).unsqueeze(0).repeat(mask.shape[0], 1, 1, 1) + return pos + + def __repr__(self): + """str: a string that describes the module""" + repr_str = self.__class__.__name__ + repr_str += f'(num_feats={self.num_feats}, ' + repr_str += f'row_num_embed={self.row_num_embed}, ' + repr_str += f'col_num_embed={self.col_num_embed})' + return repr_str diff --git a/mmdet/models/utils/res_layer.py b/mmdet/models/utils/res_layer.py new file mode 100644 index 0000000..5c3e89f --- /dev/null +++ b/mmdet/models/utils/res_layer.py @@ -0,0 +1,190 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmcv.cnn import build_conv_layer, build_norm_layer +from mmcv.runner import BaseModule, Sequential +from torch import nn as nn + + +class ResLayer(Sequential): + """ResLayer to build ResNet style backbone. + + Args: + block (nn.Module): block used to build ResLayer. + inplanes (int): inplanes of block. + planes (int): planes of block. + num_blocks (int): number of blocks. + stride (int): stride of the first block. Default: 1 + avg_down (bool): Use AvgPool instead of stride conv when + downsampling in the bottleneck. Default: False + conv_cfg (dict): dictionary to construct and config conv layer. + Default: None + norm_cfg (dict): dictionary to construct and config norm layer. + Default: dict(type='BN') + downsample_first (bool): Downsample at the first block or last block. + False for Hourglass, True for ResNet. Default: True + """ + + def __init__(self, + block, + inplanes, + planes, + num_blocks, + stride=1, + avg_down=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + downsample_first=True, + **kwargs): + self.block = block + + downsample = None + if stride != 1 or inplanes != planes * block.expansion: + downsample = [] + conv_stride = stride + if avg_down: + conv_stride = 1 + downsample.append( + nn.AvgPool2d( + kernel_size=stride, + stride=stride, + ceil_mode=True, + count_include_pad=False)) + downsample.extend([ + build_conv_layer( + conv_cfg, + inplanes, + planes * block.expansion, + kernel_size=1, + stride=conv_stride, + bias=False), + build_norm_layer(norm_cfg, planes * block.expansion)[1] + ]) + downsample = nn.Sequential(*downsample) + + layers = [] + if downsample_first: + layers.append( + block( + inplanes=inplanes, + planes=planes, + stride=stride, + downsample=downsample, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + **kwargs)) + inplanes = planes * block.expansion + for _ in range(1, num_blocks): + layers.append( + block( + inplanes=inplanes, + planes=planes, + stride=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + **kwargs)) + + else: # downsample_first=False is for HourglassModule + for _ in range(num_blocks - 1): + layers.append( + block( + inplanes=inplanes, + planes=inplanes, + stride=1, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + **kwargs)) + layers.append( + block( + inplanes=inplanes, + planes=planes, + stride=stride, + downsample=downsample, + conv_cfg=conv_cfg, + norm_cfg=norm_cfg, + **kwargs)) + super(ResLayer, self).__init__(*layers) + + +class SimplifiedBasicBlock(BaseModule): + """Simplified version of original basic residual block. This is used in + `SCNet `_. + + - Norm layer is now optional + - Last ReLU in forward function is removed + """ + expansion = 1 + + def __init__(self, + inplanes, + planes, + stride=1, + dilation=1, + downsample=None, + style='pytorch', + with_cp=False, + conv_cfg=None, + norm_cfg=dict(type='BN'), + dcn=None, + plugins=None, + init_fg=None): + super(SimplifiedBasicBlock, self).__init__(init_fg) + assert dcn is None, 'Not implemented yet.' + assert plugins is None, 'Not implemented yet.' + assert not with_cp, 'Not implemented yet.' + self.with_norm = norm_cfg is not None + with_bias = True if norm_cfg is None else False + self.conv1 = build_conv_layer( + conv_cfg, + inplanes, + planes, + 3, + stride=stride, + padding=dilation, + dilation=dilation, + bias=with_bias) + if self.with_norm: + self.norm1_name, norm1 = build_norm_layer( + norm_cfg, planes, postfix=1) + self.add_module(self.norm1_name, norm1) + self.conv2 = build_conv_layer( + conv_cfg, planes, planes, 3, padding=1, bias=with_bias) + if self.with_norm: + self.norm2_name, norm2 = build_norm_layer( + norm_cfg, planes, postfix=2) + self.add_module(self.norm2_name, norm2) + + self.relu = nn.ReLU(inplace=True) + self.downsample = downsample + self.stride = stride + self.dilation = dilation + self.with_cp = with_cp + + @property + def norm1(self): + """nn.Module: normalization layer after the first convolution layer""" + return getattr(self, self.norm1_name) if self.with_norm else None + + @property + def norm2(self): + """nn.Module: normalization layer after the second convolution layer""" + return getattr(self, self.norm2_name) if self.with_norm else None + + def forward(self, x): + """Forward function.""" + + identity = x + + out = self.conv1(x) + if self.with_norm: + out = self.norm1(out) + out = self.relu(out) + + out = self.conv2(out) + if self.with_norm: + out = self.norm2(out) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + + return out diff --git a/mmdet/models/utils/se_layer.py b/mmdet/models/utils/se_layer.py new file mode 100644 index 0000000..a249210 --- /dev/null +++ b/mmdet/models/utils/se_layer.py @@ -0,0 +1,127 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule +from mmcv.runner import BaseModule + + +class SELayer(BaseModule): + """Squeeze-and-Excitation Module. + + Args: + channels (int): The input (and output) channels of the SE layer. + ratio (int): Squeeze ratio in SELayer, the intermediate channel will be + ``int(channels/ratio)``. Default: 16. + conv_cfg (None or dict): Config dict for convolution layer. + Default: None, which means using conv2d. + act_cfg (dict or Sequence[dict]): Config dict for activation layer. + If act_cfg is a dict, two activation layers will be configurated + by this dict. If act_cfg is a sequence of dicts, the first + activation layer will be configurated by the first dict and the + second activation layer will be configurated by the second dict. + Default: (dict(type='ReLU'), dict(type='Sigmoid')) + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + channels, + ratio=16, + conv_cfg=None, + act_cfg=(dict(type='ReLU'), dict(type='Sigmoid')), + init_cfg=None): + super(SELayer, self).__init__(init_cfg) + if isinstance(act_cfg, dict): + act_cfg = (act_cfg, act_cfg) + assert len(act_cfg) == 2 + assert mmcv.is_tuple_of(act_cfg, dict) + self.global_avgpool = nn.AdaptiveAvgPool2d(1) + self.conv1 = ConvModule( + in_channels=channels, + out_channels=int(channels / ratio), + kernel_size=1, + stride=1, + conv_cfg=conv_cfg, + act_cfg=act_cfg[0]) + self.conv2 = ConvModule( + in_channels=int(channels / ratio), + out_channels=channels, + kernel_size=1, + stride=1, + conv_cfg=conv_cfg, + act_cfg=act_cfg[1]) + + def forward(self, x): + out = self.global_avgpool(x) + out = self.conv1(out) + out = self.conv2(out) + return x * out + + +class DyReLU(BaseModule): + """Dynamic ReLU (DyReLU) module. + + See `Dynamic ReLU `_ for details. + Current implementation is specialized for task-aware attention in DyHead. + HSigmoid arguments in default act_cfg follow DyHead official code. + https://github.com/microsoft/DynamicHead/blob/master/dyhead/dyrelu.py + + Args: + channels (int): The input (and output) channels of DyReLU module. + ratio (int): Squeeze ratio in Squeeze-and-Excitation-like module, + the intermediate channel will be ``int(channels/ratio)``. + Default: 4. + conv_cfg (None or dict): Config dict for convolution layer. + Default: None, which means using conv2d. + act_cfg (dict or Sequence[dict]): Config dict for activation layer. + If act_cfg is a dict, two activation layers will be configurated + by this dict. If act_cfg is a sequence of dicts, the first + activation layer will be configurated by the first dict and the + second activation layer will be configurated by the second dict. + Default: (dict(type='ReLU'), dict(type='HSigmoid', bias=3.0, + divisor=6.0)) + init_cfg (dict or list[dict], optional): Initialization config dict. + Default: None + """ + + def __init__(self, + channels, + ratio=4, + conv_cfg=None, + act_cfg=(dict(type='ReLU'), + dict(type='HSigmoid', bias=3.0, divisor=6.0)), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + if isinstance(act_cfg, dict): + act_cfg = (act_cfg, act_cfg) + assert len(act_cfg) == 2 + assert mmcv.is_tuple_of(act_cfg, dict) + self.channels = channels + self.expansion = 4 # for a1, b1, a2, b2 + self.global_avgpool = nn.AdaptiveAvgPool2d(1) + self.conv1 = ConvModule( + in_channels=channels, + out_channels=int(channels / ratio), + kernel_size=1, + stride=1, + conv_cfg=conv_cfg, + act_cfg=act_cfg[0]) + self.conv2 = ConvModule( + in_channels=int(channels / ratio), + out_channels=channels * self.expansion, + kernel_size=1, + stride=1, + conv_cfg=conv_cfg, + act_cfg=act_cfg[1]) + + def forward(self, x): + """Forward function.""" + coeffs = self.global_avgpool(x) + coeffs = self.conv1(coeffs) + coeffs = self.conv2(coeffs) - 0.5 # value range: [-0.5, 0.5] + a1, b1, a2, b2 = torch.split(coeffs, self.channels, dim=1) + a1 = a1 * 2.0 + 1.0 # [-1.0, 1.0] + 1.0 + a2 = a2 * 2.0 # [-1.0, 1.0] + out = torch.max(x * a1 + b1, x * a2 + b2) + return out diff --git a/mmdet/models/utils/transformer.py b/mmdet/models/utils/transformer.py new file mode 100644 index 0000000..3c390c8 --- /dev/null +++ b/mmdet/models/utils/transformer.py @@ -0,0 +1,1167 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import math +import warnings +from typing import Sequence + +import torch +import torch.nn as nn +import torch.nn.functional as F +from mmcv.cnn import (build_activation_layer, build_conv_layer, + build_norm_layer, xavier_init) +from mmcv.cnn.bricks.registry import (TRANSFORMER_LAYER, + TRANSFORMER_LAYER_SEQUENCE) +from mmcv.cnn.bricks.transformer import (BaseTransformerLayer, + TransformerLayerSequence, + build_transformer_layer_sequence) +from mmcv.runner.base_module import BaseModule +from mmcv.utils import to_2tuple +from torch.nn.init import normal_ + +from mmdet.models.utils.builder import TRANSFORMER + +try: + from mmcv.ops.multi_scale_deform_attn import MultiScaleDeformableAttention + +except ImportError: + warnings.warn( + '`MultiScaleDeformableAttention` in MMCV has been moved to ' + '`mmcv.ops.multi_scale_deform_attn`, please update your MMCV') + from mmcv.cnn.bricks.transformer import MultiScaleDeformableAttention + + +def nlc_to_nchw(x, hw_shape): + """Convert [N, L, C] shape tensor to [N, C, H, W] shape tensor. + + Args: + x (Tensor): The input tensor of shape [N, L, C] before conversion. + hw_shape (Sequence[int]): The height and width of output feature map. + + Returns: + Tensor: The output tensor of shape [N, C, H, W] after conversion. + """ + H, W = hw_shape + assert len(x.shape) == 3 + B, L, C = x.shape + assert L == H * W, 'The seq_len does not match H, W' + return x.transpose(1, 2).reshape(B, C, H, W).contiguous() + + +def nchw_to_nlc(x): + """Flatten [N, C, H, W] shape tensor to [N, L, C] shape tensor. + + Args: + x (Tensor): The input tensor of shape [N, C, H, W] before conversion. + + Returns: + Tensor: The output tensor of shape [N, L, C] after conversion. + """ + assert len(x.shape) == 4 + return x.flatten(2).transpose(1, 2).contiguous() + + +class AdaptivePadding(nn.Module): + """Applies padding to input (if needed) so that input can get fully covered + by filter you specified. It support two modes "same" and "corner". The + "same" mode is same with "SAME" padding mode in TensorFlow, pad zero around + input. The "corner" mode would pad zero to bottom right. + + Args: + kernel_size (int | tuple): Size of the kernel: + stride (int | tuple): Stride of the filter. Default: 1: + dilation (int | tuple): Spacing between kernel elements. + Default: 1 + padding (str): Support "same" and "corner", "corner" mode + would pad zero to bottom right, and "same" mode would + pad zero around input. Default: "corner". + Example: + >>> kernel_size = 16 + >>> stride = 16 + >>> dilation = 1 + >>> input = torch.rand(1, 1, 15, 17) + >>> adap_pad = AdaptivePadding( + >>> kernel_size=kernel_size, + >>> stride=stride, + >>> dilation=dilation, + >>> padding="corner") + >>> out = adap_pad(input) + >>> assert (out.shape[2], out.shape[3]) == (16, 32) + >>> input = torch.rand(1, 1, 16, 17) + >>> out = adap_pad(input) + >>> assert (out.shape[2], out.shape[3]) == (16, 32) + """ + + def __init__(self, kernel_size=1, stride=1, dilation=1, padding='corner'): + + super(AdaptivePadding, self).__init__() + + assert padding in ('same', 'corner') + + kernel_size = to_2tuple(kernel_size) + stride = to_2tuple(stride) + padding = to_2tuple(padding) + dilation = to_2tuple(dilation) + + self.padding = padding + self.kernel_size = kernel_size + self.stride = stride + self.dilation = dilation + + def get_pad_shape(self, input_shape): + input_h, input_w = input_shape + kernel_h, kernel_w = self.kernel_size + stride_h, stride_w = self.stride + output_h = math.ceil(input_h / stride_h) + output_w = math.ceil(input_w / stride_w) + pad_h = max((output_h - 1) * stride_h + + (kernel_h - 1) * self.dilation[0] + 1 - input_h, 0) + pad_w = max((output_w - 1) * stride_w + + (kernel_w - 1) * self.dilation[1] + 1 - input_w, 0) + return pad_h, pad_w + + def forward(self, x): + pad_h, pad_w = self.get_pad_shape(x.size()[-2:]) + if pad_h > 0 or pad_w > 0: + if self.padding == 'corner': + x = F.pad(x, [0, pad_w, 0, pad_h]) + elif self.padding == 'same': + x = F.pad(x, [ + pad_w // 2, pad_w - pad_w // 2, pad_h // 2, + pad_h - pad_h // 2 + ]) + return x + + +class PatchEmbed(BaseModule): + """Image to Patch Embedding. + + We use a conv layer to implement PatchEmbed. + + Args: + in_channels (int): The num of input channels. Default: 3 + embed_dims (int): The dimensions of embedding. Default: 768 + conv_type (str): The config dict for embedding + conv layer type selection. Default: "Conv2d. + kernel_size (int): The kernel_size of embedding conv. Default: 16. + stride (int): The slide stride of embedding conv. + Default: None (Would be set as `kernel_size`). + padding (int | tuple | string ): The padding length of + embedding conv. When it is a string, it means the mode + of adaptive padding, support "same" and "corner" now. + Default: "corner". + dilation (int): The dilation rate of embedding conv. Default: 1. + bias (bool): Bias of embed conv. Default: True. + norm_cfg (dict, optional): Config dict for normalization layer. + Default: None. + input_size (int | tuple | None): The size of input, which will be + used to calculate the out size. Only work when `dynamic_size` + is False. Default: None. + init_cfg (`mmcv.ConfigDict`, optional): The Config for initialization. + Default: None. + """ + + def __init__( + self, + in_channels=3, + embed_dims=768, + conv_type='Conv2d', + kernel_size=16, + stride=16, + padding='corner', + dilation=1, + bias=True, + norm_cfg=None, + input_size=None, + init_cfg=None, + ): + super(PatchEmbed, self).__init__(init_cfg=init_cfg) + + self.embed_dims = embed_dims + if stride is None: + stride = kernel_size + + kernel_size = to_2tuple(kernel_size) + stride = to_2tuple(stride) + dilation = to_2tuple(dilation) + + if isinstance(padding, str): + self.adap_padding = AdaptivePadding( + kernel_size=kernel_size, + stride=stride, + dilation=dilation, + padding=padding) + # disable the padding of conv + padding = 0 + else: + self.adap_padding = None + padding = to_2tuple(padding) + + self.projection = build_conv_layer( + dict(type=conv_type), + in_channels=in_channels, + out_channels=embed_dims, + kernel_size=kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + bias=bias) + + if norm_cfg is not None: + self.norm = build_norm_layer(norm_cfg, embed_dims)[1] + else: + self.norm = None + + if input_size: + input_size = to_2tuple(input_size) + # `init_out_size` would be used outside to + # calculate the num_patches + # when `use_abs_pos_embed` outside + self.init_input_size = input_size + if self.adap_padding: + pad_h, pad_w = self.adap_padding.get_pad_shape(input_size) + input_h, input_w = input_size + input_h = input_h + pad_h + input_w = input_w + pad_w + input_size = (input_h, input_w) + + # https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html + h_out = (input_size[0] + 2 * padding[0] - dilation[0] * + (kernel_size[0] - 1) - 1) // stride[0] + 1 + w_out = (input_size[1] + 2 * padding[1] - dilation[1] * + (kernel_size[1] - 1) - 1) // stride[1] + 1 + self.init_out_size = (h_out, w_out) + else: + self.init_input_size = None + self.init_out_size = None + + def forward(self, x): + """ + Args: + x (Tensor): Has shape (B, C, H, W). In most case, C is 3. + + Returns: + tuple: Contains merged results and its spatial shape. + + - x (Tensor): Has shape (B, out_h * out_w, embed_dims) + - out_size (tuple[int]): Spatial shape of x, arrange as + (out_h, out_w). + """ + + if self.adap_padding: + x = self.adap_padding(x) + + x = self.projection(x) + out_size = (x.shape[2], x.shape[3]) + x = x.flatten(2).transpose(1, 2) + if self.norm is not None: + x = self.norm(x) + return x, out_size + + +class PatchMerging(BaseModule): + """Merge patch feature map. + + This layer groups feature map by kernel_size, and applies norm and linear + layers to the grouped feature map. Our implementation uses `nn.Unfold` to + merge patch, which is about 25% faster than original implementation. + Instead, we need to modify pretrained models for compatibility. + + Args: + in_channels (int): The num of input channels. + to gets fully covered by filter and stride you specified.. + Default: True. + out_channels (int): The num of output channels. + kernel_size (int | tuple, optional): the kernel size in the unfold + layer. Defaults to 2. + stride (int | tuple, optional): the stride of the sliding blocks in the + unfold layer. Default: None. (Would be set as `kernel_size`) + padding (int | tuple | string ): The padding length of + embedding conv. When it is a string, it means the mode + of adaptive padding, support "same" and "corner" now. + Default: "corner". + dilation (int | tuple, optional): dilation parameter in the unfold + layer. Default: 1. + bias (bool, optional): Whether to add bias in linear layer or not. + Defaults: False. + norm_cfg (dict, optional): Config dict for normalization layer. + Default: dict(type='LN'). + init_cfg (dict, optional): The extra config for initialization. + Default: None. + """ + + def __init__(self, + in_channels, + out_channels, + kernel_size=2, + stride=None, + padding='corner', + dilation=1, + bias=False, + norm_cfg=dict(type='LN'), + init_cfg=None): + super().__init__(init_cfg=init_cfg) + self.in_channels = in_channels + self.out_channels = out_channels + if stride: + stride = stride + else: + stride = kernel_size + + kernel_size = to_2tuple(kernel_size) + stride = to_2tuple(stride) + dilation = to_2tuple(dilation) + + if isinstance(padding, str): + self.adap_padding = AdaptivePadding( + kernel_size=kernel_size, + stride=stride, + dilation=dilation, + padding=padding) + # disable the padding of unfold + padding = 0 + else: + self.adap_padding = None + + padding = to_2tuple(padding) + self.sampler = nn.Unfold( + kernel_size=kernel_size, + dilation=dilation, + padding=padding, + stride=stride) + + sample_dim = kernel_size[0] * kernel_size[1] * in_channels + + if norm_cfg is not None: + self.norm = build_norm_layer(norm_cfg, sample_dim)[1] + else: + self.norm = None + + self.reduction = nn.Linear(sample_dim, out_channels, bias=bias) + + def forward(self, x, input_size): + """ + Args: + x (Tensor): Has shape (B, H*W, C_in). + input_size (tuple[int]): The spatial shape of x, arrange as (H, W). + Default: None. + + Returns: + tuple: Contains merged results and its spatial shape. + + - x (Tensor): Has shape (B, Merged_H * Merged_W, C_out) + - out_size (tuple[int]): Spatial shape of x, arrange as + (Merged_H, Merged_W). + """ + B, L, C = x.shape + assert isinstance(input_size, Sequence), f'Expect ' \ + f'input_size is ' \ + f'`Sequence` ' \ + f'but get {input_size}' + + H, W = input_size + assert L == H * W, 'input feature has wrong size' + + x = x.view(B, H, W, C).permute([0, 3, 1, 2]) # B, C, H, W + # Use nn.Unfold to merge patch. About 25% faster than original method, + # but need to modify pretrained model for compatibility + + if self.adap_padding: + x = self.adap_padding(x) + H, W = x.shape[-2:] + + x = self.sampler(x) + # if kernel_size=2 and stride=2, x should has shape (B, 4*C, H/2*W/2) + + out_h = (H + 2 * self.sampler.padding[0] - self.sampler.dilation[0] * + (self.sampler.kernel_size[0] - 1) - + 1) // self.sampler.stride[0] + 1 + out_w = (W + 2 * self.sampler.padding[1] - self.sampler.dilation[1] * + (self.sampler.kernel_size[1] - 1) - + 1) // self.sampler.stride[1] + 1 + + output_size = (out_h, out_w) + x = x.transpose(1, 2) # B, H/2*W/2, 4*C + x = self.norm(x) if self.norm else x + x = self.reduction(x) + return x, output_size + + +def inverse_sigmoid(x, eps=1e-5): + """Inverse function of sigmoid. + + Args: + x (Tensor): The tensor to do the + inverse. + eps (float): EPS avoid numerical + overflow. Defaults 1e-5. + Returns: + Tensor: The x has passed the inverse + function of sigmoid, has same + shape with input. + """ + x = x.clamp(min=0, max=1) + x1 = x.clamp(min=eps) + x2 = (1 - x).clamp(min=eps) + return torch.log(x1 / x2) + + +@TRANSFORMER_LAYER.register_module() +class DetrTransformerDecoderLayer(BaseTransformerLayer): + """Implements decoder layer in DETR transformer. + + Args: + attn_cfgs (list[`mmcv.ConfigDict`] | list[dict] | dict )): + Configs for self_attention or cross_attention, the order + should be consistent with it in `operation_order`. If it is + a dict, it would be expand to the number of attention in + `operation_order`. + feedforward_channels (int): The hidden dimension for FFNs. + ffn_dropout (float): Probability of an element to be zeroed + in ffn. Default 0.0. + operation_order (tuple[str]): The execution order of operation + in transformer. Such as ('self_attn', 'norm', 'ffn', 'norm'). + Default:None + act_cfg (dict): The activation config for FFNs. Default: `LN` + norm_cfg (dict): Config dict for normalization layer. + Default: `LN`. + ffn_num_fcs (int): The number of fully-connected layers in FFNs. + Default:2. + """ + + def __init__(self, + attn_cfgs, + feedforward_channels, + ffn_dropout=0.0, + operation_order=None, + act_cfg=dict(type='ReLU', inplace=True), + norm_cfg=dict(type='LN'), + ffn_num_fcs=2, + **kwargs): + super(DetrTransformerDecoderLayer, self).__init__( + attn_cfgs=attn_cfgs, + feedforward_channels=feedforward_channels, + ffn_dropout=ffn_dropout, + operation_order=operation_order, + act_cfg=act_cfg, + norm_cfg=norm_cfg, + ffn_num_fcs=ffn_num_fcs, + **kwargs) + assert len(operation_order) == 6 + assert set(operation_order) == set( + ['self_attn', 'norm', 'cross_attn', 'ffn']) + + +@TRANSFORMER_LAYER_SEQUENCE.register_module() +class DetrTransformerEncoder(TransformerLayerSequence): + """TransformerEncoder of DETR. + + Args: + post_norm_cfg (dict): Config of last normalization layer. Default: + `LN`. Only used when `self.pre_norm` is `True` + """ + + def __init__(self, *args, post_norm_cfg=dict(type='LN'), **kwargs): + super(DetrTransformerEncoder, self).__init__(*args, **kwargs) + if post_norm_cfg is not None: + self.post_norm = build_norm_layer( + post_norm_cfg, self.embed_dims)[1] if self.pre_norm else None + else: + assert not self.pre_norm, f'Use prenorm in ' \ + f'{self.__class__.__name__},' \ + f'Please specify post_norm_cfg' + self.post_norm = None + + def forward(self, *args, **kwargs): + """Forward function for `TransformerCoder`. + + Returns: + Tensor: forwarded results with shape [num_query, bs, embed_dims]. + """ + x = super(DetrTransformerEncoder, self).forward(*args, **kwargs) + if self.post_norm is not None: + x = self.post_norm(x) + return x + + +@TRANSFORMER_LAYER_SEQUENCE.register_module() +class DetrTransformerDecoder(TransformerLayerSequence): + """Implements the decoder in DETR transformer. + + Args: + return_intermediate (bool): Whether to return intermediate outputs. + post_norm_cfg (dict): Config of last normalization layer. Default: + `LN`. + """ + + def __init__(self, + *args, + post_norm_cfg=dict(type='LN'), + return_intermediate=False, + **kwargs): + + super(DetrTransformerDecoder, self).__init__(*args, **kwargs) + self.return_intermediate = return_intermediate + if post_norm_cfg is not None: + self.post_norm = build_norm_layer(post_norm_cfg, + self.embed_dims)[1] + else: + self.post_norm = None + + def forward(self, query, *args, **kwargs): + """Forward function for `TransformerDecoder`. + + Args: + query (Tensor): Input query with shape + `(num_query, bs, embed_dims)`. + + Returns: + Tensor: Results with shape [1, num_query, bs, embed_dims] when + return_intermediate is `False`, otherwise it has shape + [num_layers, num_query, bs, embed_dims]. + """ + if not self.return_intermediate: + x = super().forward(query, *args, **kwargs) + if self.post_norm: + x = self.post_norm(x)[None] + return x + + intermediate = [] + for layer in self.layers: + query = layer(query, *args, **kwargs) + if self.return_intermediate: + if self.post_norm is not None: + intermediate.append(self.post_norm(query)) + else: + intermediate.append(query) + return torch.stack(intermediate) + + +@TRANSFORMER.register_module() +class Transformer(BaseModule): + """Implements the DETR transformer. + + Following the official DETR implementation, this module copy-paste + from torch.nn.Transformer with modifications: + + * positional encodings are passed in MultiheadAttention + * extra LN at the end of encoder is removed + * decoder returns a stack of activations from all decoding layers + + See `paper: End-to-End Object Detection with Transformers + `_ for details. + + Args: + encoder (`mmcv.ConfigDict` | Dict): Config of + TransformerEncoder. Defaults to None. + decoder ((`mmcv.ConfigDict` | Dict)): Config of + TransformerDecoder. Defaults to None + init_cfg (obj:`mmcv.ConfigDict`): The Config for initialization. + Defaults to None. + """ + + def __init__(self, encoder=None, decoder=None, init_cfg=None): + super(Transformer, self).__init__(init_cfg=init_cfg) + self.encoder = build_transformer_layer_sequence(encoder) + self.decoder = build_transformer_layer_sequence(decoder) + self.embed_dims = self.encoder.embed_dims + + def init_weights(self): + # follow the official DETR to init parameters + for m in self.modules(): + if hasattr(m, 'weight') and m.weight.dim() > 1: + xavier_init(m, distribution='uniform') + self._is_init = True + + def forward(self, x, mask, query_embed, pos_embed): + """Forward function for `Transformer`. + + Args: + x (Tensor): Input query with shape [bs, c, h, w] where + c = embed_dims. + mask (Tensor): The key_padding_mask used for encoder and decoder, + with shape [bs, h, w]. + query_embed (Tensor): The query embedding for decoder, with shape + [num_query, c]. + pos_embed (Tensor): The positional encoding for encoder and + decoder, with the same shape as `x`. + + Returns: + tuple[Tensor]: results of decoder containing the following tensor. + + - out_dec: Output from decoder. If return_intermediate_dec \ + is True output has shape [num_dec_layers, bs, + num_query, embed_dims], else has shape [1, bs, \ + num_query, embed_dims]. + - memory: Output results from encoder, with shape \ + [bs, embed_dims, h, w]. + """ + bs, c, h, w = x.shape + # use `view` instead of `flatten` for dynamically exporting to ONNX + x = x.view(bs, c, -1).permute(2, 0, 1) # [bs, c, h, w] -> [h*w, bs, c] + pos_embed = pos_embed.view(bs, c, -1).permute(2, 0, 1) + query_embed = query_embed.unsqueeze(1).repeat( + 1, bs, 1) # [num_query, dim] -> [num_query, bs, dim] + mask = mask.view(bs, -1) # [bs, h, w] -> [bs, h*w] + memory = self.encoder( + query=x, + key=None, + value=None, + query_pos=pos_embed, + query_key_padding_mask=mask) + target = torch.zeros_like(query_embed) + # out_dec: [num_layers, num_query, bs, dim] + out_dec = self.decoder( + query=target, + key=memory, + value=memory, + key_pos=pos_embed, + query_pos=query_embed, + key_padding_mask=mask) + out_dec = out_dec.transpose(1, 2) + memory = memory.permute(1, 2, 0).reshape(bs, c, h, w) + return out_dec, memory + + +@TRANSFORMER_LAYER_SEQUENCE.register_module() +class DeformableDetrTransformerDecoder(TransformerLayerSequence): + """Implements the decoder in DETR transformer. + + Args: + return_intermediate (bool): Whether to return intermediate outputs. + coder_norm_cfg (dict): Config of last normalization layer. Default: + `LN`. + """ + + def __init__(self, *args, return_intermediate=False, **kwargs): + + super(DeformableDetrTransformerDecoder, self).__init__(*args, **kwargs) + self.return_intermediate = return_intermediate + + def forward(self, + query, + *args, + reference_points=None, + valid_ratios=None, + reg_branches=None, + **kwargs): + """Forward function for `TransformerDecoder`. + + Args: + query (Tensor): Input query with shape + `(num_query, bs, embed_dims)`. + reference_points (Tensor): The reference + points of offset. has shape + (bs, num_query, 4) when as_two_stage, + otherwise has shape ((bs, num_query, 2). + valid_ratios (Tensor): The radios of valid + points on the feature map, has shape + (bs, num_levels, 2) + reg_branch: (obj:`nn.ModuleList`): Used for + refining the regression results. Only would + be passed when with_box_refine is True, + otherwise would be passed a `None`. + + Returns: + Tensor: Results with shape [1, num_query, bs, embed_dims] when + return_intermediate is `False`, otherwise it has shape + [num_layers, num_query, bs, embed_dims]. + """ + output = query + intermediate = [] + intermediate_reference_points = [] + for lid, layer in enumerate(self.layers): + if reference_points.shape[-1] == 4: + reference_points_input = reference_points[:, :, None] * \ + torch.cat([valid_ratios, valid_ratios], -1)[:, None] + else: + assert reference_points.shape[-1] == 2 + reference_points_input = reference_points[:, :, None] * \ + valid_ratios[:, None] + output = layer( + output, + *args, + reference_points=reference_points_input, + **kwargs) + output = output.permute(1, 0, 2) + + if reg_branches is not None: + tmp = reg_branches[lid](output) + if reference_points.shape[-1] == 4: + new_reference_points = tmp + inverse_sigmoid( + reference_points) + new_reference_points = new_reference_points.sigmoid() + else: + assert reference_points.shape[-1] == 2 + new_reference_points = tmp + new_reference_points[..., :2] = tmp[ + ..., :2] + inverse_sigmoid(reference_points) + new_reference_points = new_reference_points.sigmoid() + reference_points = new_reference_points.detach() + + output = output.permute(1, 0, 2) + if self.return_intermediate: + intermediate.append(output) + intermediate_reference_points.append(reference_points) + + if self.return_intermediate: + return torch.stack(intermediate), torch.stack( + intermediate_reference_points) + + return output, reference_points + + +@TRANSFORMER.register_module() +class DeformableDetrTransformer(Transformer): + """Implements the DeformableDETR transformer. + + Args: + as_two_stage (bool): Generate query from encoder features. + Default: False. + num_feature_levels (int): Number of feature maps from FPN: + Default: 4. + two_stage_num_proposals (int): Number of proposals when set + `as_two_stage` as True. Default: 300. + """ + + def __init__(self, + as_two_stage=False, + num_feature_levels=4, + two_stage_num_proposals=300, + **kwargs): + super(DeformableDetrTransformer, self).__init__(**kwargs) + self.as_two_stage = as_two_stage + self.num_feature_levels = num_feature_levels + self.two_stage_num_proposals = two_stage_num_proposals + self.embed_dims = self.encoder.embed_dims + self.init_layers() + + def init_layers(self): + """Initialize layers of the DeformableDetrTransformer.""" + self.level_embeds = nn.Parameter( + torch.Tensor(self.num_feature_levels, self.embed_dims)) + + if self.as_two_stage: + self.enc_output = nn.Linear(self.embed_dims, self.embed_dims) + self.enc_output_norm = nn.LayerNorm(self.embed_dims) + self.pos_trans = nn.Linear(self.embed_dims * 2, + self.embed_dims * 2) + self.pos_trans_norm = nn.LayerNorm(self.embed_dims * 2) + else: + self.reference_points = nn.Linear(self.embed_dims, 2) + + def init_weights(self): + """Initialize the transformer weights.""" + for p in self.parameters(): + if p.dim() > 1: + nn.init.xavier_uniform_(p) + for m in self.modules(): + if isinstance(m, MultiScaleDeformableAttention): + m.init_weights() + if not self.as_two_stage: + xavier_init(self.reference_points, distribution='uniform', bias=0.) + normal_(self.level_embeds) + + def gen_encoder_output_proposals(self, memory, memory_padding_mask, + spatial_shapes): + """Generate proposals from encoded memory. + + Args: + memory (Tensor) : The output of encoder, + has shape (bs, num_key, embed_dim). num_key is + equal the number of points on feature map from + all level. + memory_padding_mask (Tensor): Padding mask for memory. + has shape (bs, num_key). + spatial_shapes (Tensor): The shape of all feature maps. + has shape (num_level, 2). + + Returns: + tuple: A tuple of feature map and bbox prediction. + + - output_memory (Tensor): The input of decoder, \ + has shape (bs, num_key, embed_dim). num_key is \ + equal the number of points on feature map from \ + all levels. + - output_proposals (Tensor): The normalized proposal \ + after a inverse sigmoid, has shape \ + (bs, num_keys, 4). + """ + + N, S, C = memory.shape + proposals = [] + _cur = 0 + for lvl, (H, W) in enumerate(spatial_shapes): + mask_flatten_ = memory_padding_mask[:, _cur:(_cur + H * W)].view( + N, H, W, 1) + valid_H = torch.sum(~mask_flatten_[:, :, 0, 0], 1) + valid_W = torch.sum(~mask_flatten_[:, 0, :, 0], 1) + + grid_y, grid_x = torch.meshgrid( + torch.linspace( + 0, H - 1, H, dtype=torch.float32, device=memory.device), + torch.linspace( + 0, W - 1, W, dtype=torch.float32, device=memory.device)) + grid = torch.cat([grid_x.unsqueeze(-1), grid_y.unsqueeze(-1)], -1) + + scale = torch.cat([valid_W.unsqueeze(-1), + valid_H.unsqueeze(-1)], 1).view(N, 1, 1, 2) + grid = (grid.unsqueeze(0).expand(N, -1, -1, -1) + 0.5) / scale + wh = torch.ones_like(grid) * 0.05 * (2.0**lvl) + proposal = torch.cat((grid, wh), -1).view(N, -1, 4) + proposals.append(proposal) + _cur += (H * W) + output_proposals = torch.cat(proposals, 1) + output_proposals_valid = ((output_proposals > 0.01) & + (output_proposals < 0.99)).all( + -1, keepdim=True) + output_proposals = torch.log(output_proposals / (1 - output_proposals)) + output_proposals = output_proposals.masked_fill( + memory_padding_mask.unsqueeze(-1), float('inf')) + output_proposals = output_proposals.masked_fill( + ~output_proposals_valid, float('inf')) + + output_memory = memory + output_memory = output_memory.masked_fill( + memory_padding_mask.unsqueeze(-1), float(0)) + output_memory = output_memory.masked_fill(~output_proposals_valid, + float(0)) + output_memory = self.enc_output_norm(self.enc_output(output_memory)) + return output_memory, output_proposals + + @staticmethod + def get_reference_points(spatial_shapes, valid_ratios, device): + """Get the reference points used in decoder. + + Args: + spatial_shapes (Tensor): The shape of all + feature maps, has shape (num_level, 2). + valid_ratios (Tensor): The radios of valid + points on the feature map, has shape + (bs, num_levels, 2) + device (obj:`device`): The device where + reference_points should be. + + Returns: + Tensor: reference points used in decoder, has \ + shape (bs, num_keys, num_levels, 2). + """ + reference_points_list = [] + for lvl, (H, W) in enumerate(spatial_shapes): + # TODO check this 0.5 + ref_y, ref_x = torch.meshgrid( + torch.linspace( + 0.5, H - 0.5, H, dtype=torch.float32, device=device), + torch.linspace( + 0.5, W - 0.5, W, dtype=torch.float32, device=device)) + ref_y = ref_y.reshape(-1)[None] / ( + valid_ratios[:, None, lvl, 1] * H) + ref_x = ref_x.reshape(-1)[None] / ( + valid_ratios[:, None, lvl, 0] * W) + ref = torch.stack((ref_x, ref_y), -1) + reference_points_list.append(ref) + reference_points = torch.cat(reference_points_list, 1) + reference_points = reference_points[:, :, None] * valid_ratios[:, None] + return reference_points + + def get_valid_ratio(self, mask): + """Get the valid radios of feature maps of all level.""" + _, H, W = mask.shape + valid_H = torch.sum(~mask[:, :, 0], 1) + valid_W = torch.sum(~mask[:, 0, :], 1) + valid_ratio_h = valid_H.float() / H + valid_ratio_w = valid_W.float() / W + valid_ratio = torch.stack([valid_ratio_w, valid_ratio_h], -1) + return valid_ratio + + def get_proposal_pos_embed(self, + proposals, + num_pos_feats=128, + temperature=10000): + """Get the position embedding of proposal.""" + scale = 2 * math.pi + dim_t = torch.arange( + num_pos_feats, dtype=torch.float32, device=proposals.device) + dim_t = temperature**(2 * (dim_t // 2) / num_pos_feats) + # N, L, 4 + proposals = proposals.sigmoid() * scale + # N, L, 4, 128 + pos = proposals[:, :, :, None] / dim_t + # N, L, 4, 64, 2 + pos = torch.stack((pos[:, :, :, 0::2].sin(), pos[:, :, :, 1::2].cos()), + dim=4).flatten(2) + return pos + + def forward(self, + mlvl_feats, + mlvl_masks, + query_embed, + mlvl_pos_embeds, + reg_branches=None, + cls_branches=None, + **kwargs): + """Forward function for `Transformer`. + + Args: + mlvl_feats (list(Tensor)): Input queries from + different level. Each element has shape + [bs, embed_dims, h, w]. + mlvl_masks (list(Tensor)): The key_padding_mask from + different level used for encoder and decoder, + each element has shape [bs, h, w]. + query_embed (Tensor): The query embedding for decoder, + with shape [num_query, c]. + mlvl_pos_embeds (list(Tensor)): The positional encoding + of feats from different level, has the shape + [bs, embed_dims, h, w]. + reg_branches (obj:`nn.ModuleList`): Regression heads for + feature maps from each decoder layer. Only would + be passed when + `with_box_refine` is True. Default to None. + cls_branches (obj:`nn.ModuleList`): Classification heads + for feature maps from each decoder layer. Only would + be passed when `as_two_stage` + is True. Default to None. + + + Returns: + tuple[Tensor]: results of decoder containing the following tensor. + + - inter_states: Outputs from decoder. If + return_intermediate_dec is True output has shape \ + (num_dec_layers, bs, num_query, embed_dims), else has \ + shape (1, bs, num_query, embed_dims). + - init_reference_out: The initial value of reference \ + points, has shape (bs, num_queries, 4). + - inter_references_out: The internal value of reference \ + points in decoder, has shape \ + (num_dec_layers, bs,num_query, embed_dims) + - enc_outputs_class: The classification score of \ + proposals generated from \ + encoder's feature maps, has shape \ + (batch, h*w, num_classes). \ + Only would be returned when `as_two_stage` is True, \ + otherwise None. + - enc_outputs_coord_unact: The regression results \ + generated from encoder's feature maps., has shape \ + (batch, h*w, 4). Only would \ + be returned when `as_two_stage` is True, \ + otherwise None. + """ + assert self.as_two_stage or query_embed is not None + + feat_flatten = [] + mask_flatten = [] + lvl_pos_embed_flatten = [] + spatial_shapes = [] + for lvl, (feat, mask, pos_embed) in enumerate( + zip(mlvl_feats, mlvl_masks, mlvl_pos_embeds)): + bs, c, h, w = feat.shape + spatial_shape = (h, w) + spatial_shapes.append(spatial_shape) + feat = feat.flatten(2).transpose(1, 2) + mask = mask.flatten(1) + pos_embed = pos_embed.flatten(2).transpose(1, 2) + lvl_pos_embed = pos_embed + self.level_embeds[lvl].view(1, 1, -1) + lvl_pos_embed_flatten.append(lvl_pos_embed) + feat_flatten.append(feat) + mask_flatten.append(mask) + feat_flatten = torch.cat(feat_flatten, 1) + mask_flatten = torch.cat(mask_flatten, 1) + lvl_pos_embed_flatten = torch.cat(lvl_pos_embed_flatten, 1) + spatial_shapes = torch.as_tensor( + spatial_shapes, dtype=torch.long, device=feat_flatten.device) + level_start_index = torch.cat((spatial_shapes.new_zeros( + (1, )), spatial_shapes.prod(1).cumsum(0)[:-1])) + valid_ratios = torch.stack( + [self.get_valid_ratio(m) for m in mlvl_masks], 1) + + reference_points = \ + self.get_reference_points(spatial_shapes, + valid_ratios, + device=feat.device) + + feat_flatten = feat_flatten.permute(1, 0, 2) # (H*W, bs, embed_dims) + lvl_pos_embed_flatten = lvl_pos_embed_flatten.permute( + 1, 0, 2) # (H*W, bs, embed_dims) + memory = self.encoder( + query=feat_flatten, + key=None, + value=None, + query_pos=lvl_pos_embed_flatten, + query_key_padding_mask=mask_flatten, + spatial_shapes=spatial_shapes, + reference_points=reference_points, + level_start_index=level_start_index, + valid_ratios=valid_ratios, + **kwargs) + + memory = memory.permute(1, 0, 2) + bs, _, c = memory.shape + if self.as_two_stage: + output_memory, output_proposals = \ + self.gen_encoder_output_proposals( + memory, mask_flatten, spatial_shapes) + enc_outputs_class = cls_branches[self.decoder.num_layers]( + output_memory) + enc_outputs_coord_unact = \ + reg_branches[ + self.decoder.num_layers](output_memory) + output_proposals + + topk = self.two_stage_num_proposals + # We only use the first channel in enc_outputs_class as foreground, + # the other (num_classes - 1) channels are actually not used. + # Its targets are set to be 0s, which indicates the first + # class (foreground) because we use [0, num_classes - 1] to + # indicate class labels, background class is indicated by + # num_classes (similar convention in RPN). + # See https://github.com/open-mmlab/mmdetection/blob/master/mmdet/models/dense_heads/deformable_detr_head.py#L241 # noqa + # This follows the official implementation of Deformable DETR. + topk_proposals = torch.topk( + enc_outputs_class[..., 0], topk, dim=1)[1] + topk_coords_unact = torch.gather( + enc_outputs_coord_unact, 1, + topk_proposals.unsqueeze(-1).repeat(1, 1, 4)) + topk_coords_unact = topk_coords_unact.detach() + reference_points = topk_coords_unact.sigmoid() + init_reference_out = reference_points + pos_trans_out = self.pos_trans_norm( + self.pos_trans(self.get_proposal_pos_embed(topk_coords_unact))) + query_pos, query = torch.split(pos_trans_out, c, dim=2) + else: + query_pos, query = torch.split(query_embed, c, dim=1) + query_pos = query_pos.unsqueeze(0).expand(bs, -1, -1) + query = query.unsqueeze(0).expand(bs, -1, -1) + reference_points = self.reference_points(query_pos).sigmoid() + init_reference_out = reference_points + + # decoder + query = query.permute(1, 0, 2) + memory = memory.permute(1, 0, 2) + query_pos = query_pos.permute(1, 0, 2) + inter_states, inter_references = self.decoder( + query=query, + key=None, + value=memory, + query_pos=query_pos, + key_padding_mask=mask_flatten, + reference_points=reference_points, + spatial_shapes=spatial_shapes, + level_start_index=level_start_index, + valid_ratios=valid_ratios, + reg_branches=reg_branches, + **kwargs) + + inter_references_out = inter_references + if self.as_two_stage: + return inter_states, init_reference_out,\ + inter_references_out, enc_outputs_class,\ + enc_outputs_coord_unact + return inter_states, init_reference_out, \ + inter_references_out, None, None + + +@TRANSFORMER.register_module() +class DynamicConv(BaseModule): + """Implements Dynamic Convolution. + + This module generate parameters for each sample and + use bmm to implement 1*1 convolution. Code is modified + from the `official github repo `_ . + + Args: + in_channels (int): The input feature channel. + Defaults to 256. + feat_channels (int): The inner feature channel. + Defaults to 64. + out_channels (int, optional): The output feature channel. + When not specified, it will be set to `in_channels` + by default + input_feat_shape (int): The shape of input feature. + Defaults to 7. + with_proj (bool): Project two-dimentional feature to + one-dimentional feature. Default to True. + act_cfg (dict): The activation config for DynamicConv. + norm_cfg (dict): Config dict for normalization layer. Default + layer normalization. + init_cfg (obj:`mmcv.ConfigDict`): The Config for initialization. + Default: None. + """ + + def __init__(self, + in_channels=256, + feat_channels=64, + out_channels=None, + input_feat_shape=7, + with_proj=True, + act_cfg=dict(type='ReLU', inplace=True), + norm_cfg=dict(type='LN'), + init_cfg=None): + super(DynamicConv, self).__init__(init_cfg) + self.in_channels = in_channels + self.feat_channels = feat_channels + self.out_channels_raw = out_channels + self.input_feat_shape = input_feat_shape + self.with_proj = with_proj + self.act_cfg = act_cfg + self.norm_cfg = norm_cfg + self.out_channels = out_channels if out_channels else in_channels + + self.num_params_in = self.in_channels * self.feat_channels + self.num_params_out = self.out_channels * self.feat_channels + self.dynamic_layer = nn.Linear( + self.in_channels, self.num_params_in + self.num_params_out) + + self.norm_in = build_norm_layer(norm_cfg, self.feat_channels)[1] + self.norm_out = build_norm_layer(norm_cfg, self.out_channels)[1] + + self.activation = build_activation_layer(act_cfg) + + num_output = self.out_channels * input_feat_shape**2 + if self.with_proj: + self.fc_layer = nn.Linear(num_output, self.out_channels) + self.fc_norm = build_norm_layer(norm_cfg, self.out_channels)[1] + + def forward(self, param_feature, input_feature): + """Forward function for `DynamicConv`. + + Args: + param_feature (Tensor): The feature can be used + to generate the parameter, has shape + (num_all_proposals, in_channels). + input_feature (Tensor): Feature that + interact with parameters, has shape + (num_all_proposals, in_channels, H, W). + + Returns: + Tensor: The output feature has shape + (num_all_proposals, out_channels). + """ + input_feature = input_feature.flatten(2).permute(2, 0, 1) + + input_feature = input_feature.permute(1, 0, 2) + parameters = self.dynamic_layer(param_feature) + + param_in = parameters[:, :self.num_params_in].view( + -1, self.in_channels, self.feat_channels) + param_out = parameters[:, -self.num_params_out:].view( + -1, self.feat_channels, self.out_channels) + + # input_feature has shape (num_all_proposals, H*W, in_channels) + # param_in has shape (num_all_proposals, in_channels, feat_channels) + # feature has shape (num_all_proposals, H*W, feat_channels) + features = torch.bmm(input_feature, param_in) + features = self.norm_in(features) + features = self.activation(features) + + # param_out has shape (batch_size, feat_channels, out_channels) + features = torch.bmm(features, param_out) + features = self.norm_out(features) + features = self.activation(features) + + if self.with_proj: + features = features.flatten(1) + features = self.fc_layer(features) + features = self.fc_norm(features) + features = self.activation(features) + + return features diff --git a/mmdet/utils/__init__.py b/mmdet/utils/__init__.py new file mode 100644 index 0000000..728fd9d --- /dev/null +++ b/mmdet/utils/__init__.py @@ -0,0 +1,22 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .ascend_util import (batch_images_to_levels, + get_max_num_gt_division_factor, masked_fill) +from .collect_env import collect_env +from .compat_config import compat_cfg, fast_compat_cfg +from .logger import get_caller_name, get_root_logger, log_img_scale +from .memory import AvoidCUDAOOM, AvoidOOM +from .misc import find_latest_checkpoint, update_data_root +from .replace_cfg_vals import replace_cfg_vals +from .rfnext import rfnext_init_model +from .setup_env import setup_multi_processes +from .split_batch import split_batch +from .util_distribution import build_ddp, build_dp, get_device + +__all__ = [ + 'get_root_logger', 'collect_env', 'find_latest_checkpoint', + 'update_data_root', 'setup_multi_processes', 'get_caller_name', + 'log_img_scale', 'compat_cfg', 'split_batch', 'build_ddp', 'build_dp', + 'get_device', 'replace_cfg_vals', 'AvoidOOM', 'AvoidCUDAOOM', + 'get_max_num_gt_division_factor', 'masked_fill', 'batch_images_to_levels', + 'rfnext_init_model' +] diff --git a/mmdet/utils/ascend_util.py b/mmdet/utils/ascend_util.py new file mode 100644 index 0000000..df90dec --- /dev/null +++ b/mmdet/utils/ascend_util.py @@ -0,0 +1,69 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + + +def masked_fill(ori_tensor, mask, new_value, neg=False): + """The Value of ori_tensor is new_value, depending on mask. + + Args: + ori_tensor (Tensor): Input tensor. + mask (Tensor): If select new_value. + new_value(Tensor | scalar): Value selected for ori_tensor. + neg (bool): If True, select ori_tensor. If False, select new_value. + Returns: + ori_tensor: (Tensor): The Value of ori_tensor is new_value, + depending on mask. + """ + if mask is None: + return ori_tensor + else: + if neg: + return ori_tensor * mask + new_value * (1 - mask) + else: + return ori_tensor * (1 - mask) + new_value * mask + + +def batch_images_to_levels(target, num_levels): + """Convert targets by image to targets by feature level. + + [target_img0, target_img1] -> [target_level0, target_level1, ...] or + target_imgs -> [target_level0, target_level1, ...] + Args: + target (Tensor | List[Tensor]): Tensor split to image levels. + num_levels (List[int]): Image levels num. + Returns: + level_targets: (Tensor): Tensor split by image levels. + """ + if not isinstance(target, torch.Tensor): + target = torch.stack(target, 0) + level_targets = [] + start = 0 + for n in num_levels: + end = start + n + # level_targets.append(target[:, start:end].squeeze(0)) + level_targets.append(target[:, start:end]) + start = end + return level_targets + + +def get_max_num_gt_division_factor(gt_nums, + min_num_gt=32, + max_num_gt=1024, + division_factor=2): + """Count max num of gt. + + Args: + gt_nums (List[int]): Ground truth bboxes num of images. + min_num_gt (int): Min num of ground truth bboxes. + max_num_gt (int): Max num of ground truth bboxes. + division_factor (int): Division factor of result. + Returns: + max_gt_nums_align: (int): max num of ground truth bboxes. + """ + max_gt_nums = max(gt_nums) + max_gt_nums_align = min_num_gt + while max_gt_nums_align < max_gt_nums: + max_gt_nums_align *= division_factor + if max_gt_nums_align > max_num_gt: + raise RuntimeError + return max_gt_nums_align diff --git a/mmdet/utils/collect_env.py b/mmdet/utils/collect_env.py new file mode 100644 index 0000000..97e25c0 --- /dev/null +++ b/mmdet/utils/collect_env.py @@ -0,0 +1,17 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmcv.utils import collect_env as collect_base_env +from mmcv.utils import get_git_hash + +import mmdet + + +def collect_env(): + """Collect the information of the running environments.""" + env_info = collect_base_env() + env_info['MMDetection'] = mmdet.__version__ + '+' + get_git_hash()[:7] + return env_info + + +if __name__ == '__main__': + for name, val in collect_env().items(): + print(f'{name}: {val}') diff --git a/mmdet/utils/compat_config.py b/mmdet/utils/compat_config.py new file mode 100644 index 0000000..9c99180 --- /dev/null +++ b/mmdet/utils/compat_config.py @@ -0,0 +1,152 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy +import warnings + +from mmcv import ConfigDict + + +def compat_cfg(cfg): + """This function would modify some filed to keep the compatibility of + config. + + For example, it will move some args which will be deprecated to the correct + fields. + """ + cfg = copy.deepcopy(cfg) + cfg = compat_imgs_per_gpu(cfg) + cfg = compat_loader_args(cfg) + cfg = compat_runner_args(cfg) + return cfg + + +def fast_compat_cfg(cfg): + """This function would modify some filed to keep the compatibility of + config. + + For example, it will move some args which will be deprecated to the correct + fields. + """ + cfg = copy.deepcopy(cfg) + cfg = compat_imgs_per_gpu(cfg) + cfg = compat_loader_args(cfg) + # cfg = compat_runner_args(cfg) + return cfg + +def compat_runner_args(cfg): + if 'runner' not in cfg: + cfg.runner = ConfigDict({ + 'type': 'EpochBasedRunner', + 'max_epochs': cfg.total_epochs + }) + warnings.warn( + 'config is now expected to have a `runner` section, ' + 'please set `runner` in your config.', UserWarning) + else: + if 'total_epochs' in cfg: + assert cfg.total_epochs == cfg.runner.max_epochs + return cfg + + +def compat_imgs_per_gpu(cfg): + cfg = copy.deepcopy(cfg) + if 'imgs_per_gpu' in cfg.data: + warnings.warn('"imgs_per_gpu" is deprecated in MMDet V2.0. ' + 'Please use "samples_per_gpu" instead') + if 'samples_per_gpu' in cfg.data: + warnings.warn( + f'Got "imgs_per_gpu"={cfg.data.imgs_per_gpu} and ' + f'"samples_per_gpu"={cfg.data.samples_per_gpu}, "imgs_per_gpu"' + f'={cfg.data.imgs_per_gpu} is used in this experiments') + else: + warnings.warn('Automatically set "samples_per_gpu"="imgs_per_gpu"=' + f'{cfg.data.imgs_per_gpu} in this experiments') + cfg.data.samples_per_gpu = cfg.data.imgs_per_gpu + return cfg + + +def compat_loader_args(cfg): + """Deprecated sample_per_gpu in cfg.data.""" + + cfg = copy.deepcopy(cfg) + if 'train_dataloader' not in cfg.data: + cfg.data['train_dataloader'] = ConfigDict() + if 'val_dataloader' not in cfg.data: + cfg.data['val_dataloader'] = ConfigDict() + if 'test_dataloader' not in cfg.data: + cfg.data['test_dataloader'] = ConfigDict() + + # special process for train_dataloader + if 'samples_per_gpu' in cfg.data: + + samples_per_gpu = cfg.data.pop('samples_per_gpu') + assert 'samples_per_gpu' not in \ + cfg.data.train_dataloader, ('`samples_per_gpu` are set ' + 'in `data` field and ` ' + 'data.train_dataloader` ' + 'at the same time. ' + 'Please only set it in ' + '`data.train_dataloader`. ') + cfg.data.train_dataloader['samples_per_gpu'] = samples_per_gpu + + if 'persistent_workers' in cfg.data: + + persistent_workers = cfg.data.pop('persistent_workers') + assert 'persistent_workers' not in \ + cfg.data.train_dataloader, ('`persistent_workers` are set ' + 'in `data` field and ` ' + 'data.train_dataloader` ' + 'at the same time. ' + 'Please only set it in ' + '`data.train_dataloader`. ') + cfg.data.train_dataloader['persistent_workers'] = persistent_workers + + if 'workers_per_gpu' in cfg.data: + + workers_per_gpu = cfg.data.pop('workers_per_gpu') + cfg.data.train_dataloader['workers_per_gpu'] = workers_per_gpu + cfg.data.val_dataloader['workers_per_gpu'] = workers_per_gpu + cfg.data.test_dataloader['workers_per_gpu'] = workers_per_gpu + + # special process for val_dataloader + if 'samples_per_gpu' in cfg.data.val: + # keep default value of `sample_per_gpu` is 1 + assert 'samples_per_gpu' not in \ + cfg.data.val_dataloader, ('`samples_per_gpu` are set ' + 'in `data.val` field and ` ' + 'data.val_dataloader` at ' + 'the same time. ' + 'Please only set it in ' + '`data.val_dataloader`. ') + cfg.data.val_dataloader['samples_per_gpu'] = \ + cfg.data.val.pop('samples_per_gpu') + # special process for val_dataloader + + # in case the test dataset is concatenated + if isinstance(cfg.data.test, dict): + if 'samples_per_gpu' in cfg.data.test: + assert 'samples_per_gpu' not in \ + cfg.data.test_dataloader, ('`samples_per_gpu` are set ' + 'in `data.test` field and ` ' + 'data.test_dataloader` ' + 'at the same time. ' + 'Please only set it in ' + '`data.test_dataloader`. ') + + cfg.data.test_dataloader['samples_per_gpu'] = \ + cfg.data.test.pop('samples_per_gpu') + + elif isinstance(cfg.data.test, list): + for ds_cfg in cfg.data.test: + if 'samples_per_gpu' in ds_cfg: + assert 'samples_per_gpu' not in \ + cfg.data.test_dataloader, ('`samples_per_gpu` are set ' + 'in `data.test` field and ` ' + 'data.test_dataloader` at' + ' the same time. ' + 'Please only set it in ' + '`data.test_dataloader`. ') + samples_per_gpu = max( + [ds_cfg.pop('samples_per_gpu', 1) for ds_cfg in cfg.data.test]) + cfg.data.test_dataloader['samples_per_gpu'] = samples_per_gpu + + return cfg diff --git a/mmdet/utils/contextmanagers.py b/mmdet/utils/contextmanagers.py new file mode 100644 index 0000000..fa12bfc --- /dev/null +++ b/mmdet/utils/contextmanagers.py @@ -0,0 +1,122 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import asyncio +import contextlib +import logging +import os +import time +from typing import List + +import torch + +logger = logging.getLogger(__name__) + +DEBUG_COMPLETED_TIME = bool(os.environ.get('DEBUG_COMPLETED_TIME', False)) + + +@contextlib.asynccontextmanager +async def completed(trace_name='', + name='', + sleep_interval=0.05, + streams: List[torch.cuda.Stream] = None): + """Async context manager that waits for work to complete on given CUDA + streams.""" + if not torch.cuda.is_available(): + yield + return + + stream_before_context_switch = torch.cuda.current_stream() + if not streams: + streams = [stream_before_context_switch] + else: + streams = [s if s else stream_before_context_switch for s in streams] + + end_events = [ + torch.cuda.Event(enable_timing=DEBUG_COMPLETED_TIME) for _ in streams + ] + + if DEBUG_COMPLETED_TIME: + start = torch.cuda.Event(enable_timing=True) + stream_before_context_switch.record_event(start) + + cpu_start = time.monotonic() + logger.debug('%s %s starting, streams: %s', trace_name, name, streams) + grad_enabled_before = torch.is_grad_enabled() + try: + yield + finally: + current_stream = torch.cuda.current_stream() + assert current_stream == stream_before_context_switch + + if DEBUG_COMPLETED_TIME: + cpu_end = time.monotonic() + for i, stream in enumerate(streams): + event = end_events[i] + stream.record_event(event) + + grad_enabled_after = torch.is_grad_enabled() + + # observed change of torch.is_grad_enabled() during concurrent run of + # async_test_bboxes code + assert (grad_enabled_before == grad_enabled_after + ), 'Unexpected is_grad_enabled() value change' + + are_done = [e.query() for e in end_events] + logger.debug('%s %s completed: %s streams: %s', trace_name, name, + are_done, streams) + with torch.cuda.stream(stream_before_context_switch): + while not all(are_done): + await asyncio.sleep(sleep_interval) + are_done = [e.query() for e in end_events] + logger.debug( + '%s %s completed: %s streams: %s', + trace_name, + name, + are_done, + streams, + ) + + current_stream = torch.cuda.current_stream() + assert current_stream == stream_before_context_switch + + if DEBUG_COMPLETED_TIME: + cpu_time = (cpu_end - cpu_start) * 1000 + stream_times_ms = '' + for i, stream in enumerate(streams): + elapsed_time = start.elapsed_time(end_events[i]) + stream_times_ms += f' {stream} {elapsed_time:.2f} ms' + logger.info('%s %s %.2f ms %s', trace_name, name, cpu_time, + stream_times_ms) + + +@contextlib.asynccontextmanager +async def concurrent(streamqueue: asyncio.Queue, + trace_name='concurrent', + name='stream'): + """Run code concurrently in different streams. + + :param streamqueue: asyncio.Queue instance. + + Queue tasks define the pool of streams used for concurrent execution. + """ + if not torch.cuda.is_available(): + yield + return + + initial_stream = torch.cuda.current_stream() + + with torch.cuda.stream(initial_stream): + stream = await streamqueue.get() + assert isinstance(stream, torch.cuda.Stream) + + try: + with torch.cuda.stream(stream): + logger.debug('%s %s is starting, stream: %s', trace_name, name, + stream) + yield + current = torch.cuda.current_stream() + assert current == stream + logger.debug('%s %s has finished, stream: %s', trace_name, + name, stream) + finally: + streamqueue.task_done() + streamqueue.put_nowait(stream) diff --git a/mmdet/utils/logger.py b/mmdet/utils/logger.py new file mode 100644 index 0000000..485f641 --- /dev/null +++ b/mmdet/utils/logger.py @@ -0,0 +1,65 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import inspect +import logging + +from mmcv.utils import get_logger + + +def get_root_logger(log_file=None, log_level=logging.INFO): + """Get root logger. + + Args: + log_file (str, optional): File path of log. Defaults to None. + log_level (int, optional): The level of logger. + Defaults to logging.INFO. + + Returns: + :obj:`logging.Logger`: The obtained logger + """ + logger = get_logger(name='mmdet', log_file=log_file, log_level=log_level) + + return logger + + +def get_caller_name(): + """Get name of caller method.""" + # this_func_frame = inspect.stack()[0][0] # i.e., get_caller_name + # callee_frame = inspect.stack()[1][0] # e.g., log_img_scale + caller_frame = inspect.stack()[2][0] # e.g., caller of log_img_scale + caller_method = caller_frame.f_code.co_name + try: + caller_class = caller_frame.f_locals['self'].__class__.__name__ + return f'{caller_class}.{caller_method}' + except KeyError: # caller is a function + return caller_method + + +def log_img_scale(img_scale, shape_order='hw', skip_square=False): + """Log image size. + + Args: + img_scale (tuple): Image size to be logged. + shape_order (str, optional): The order of image shape. + 'hw' for (height, width) and 'wh' for (width, height). + Defaults to 'hw'. + skip_square (bool, optional): Whether to skip logging for square + img_scale. Defaults to False. + + Returns: + bool: Whether to have done logging. + """ + if shape_order == 'hw': + height, width = img_scale + elif shape_order == 'wh': + width, height = img_scale + else: + raise ValueError(f'Invalid shape_order {shape_order}.') + + if skip_square and (height == width): + return False + + logger = get_root_logger() + caller = get_caller_name() + logger.info(f'image shape: height={height}, width={width} in {caller}') + + return True diff --git a/mmdet/utils/memory.py b/mmdet/utils/memory.py new file mode 100644 index 0000000..eb212bc --- /dev/null +++ b/mmdet/utils/memory.py @@ -0,0 +1,213 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings +from collections import abc +from contextlib import contextmanager +from functools import wraps + +import torch + +from mmdet.utils import get_root_logger + + +def cast_tensor_type(inputs, src_type=None, dst_type=None): + """Recursively convert Tensor in inputs from ``src_type`` to ``dst_type``. + + Args: + inputs: Inputs that to be casted. + src_type (torch.dtype | torch.device): Source type. + src_type (torch.dtype | torch.device): Destination type. + + Returns: + The same type with inputs, but all contained Tensors have been cast. + """ + assert dst_type is not None + if isinstance(inputs, torch.Tensor): + if isinstance(dst_type, torch.device): + # convert Tensor to dst_device + if hasattr(inputs, 'to') and \ + hasattr(inputs, 'device') and \ + (inputs.device == src_type or src_type is None): + return inputs.to(dst_type) + else: + return inputs + else: + # convert Tensor to dst_dtype + if hasattr(inputs, 'to') and \ + hasattr(inputs, 'dtype') and \ + (inputs.dtype == src_type or src_type is None): + return inputs.to(dst_type) + else: + return inputs + # we need to ensure that the type of inputs to be casted are the same + # as the argument `src_type`. + elif isinstance(inputs, abc.Mapping): + return type(inputs)({ + k: cast_tensor_type(v, src_type=src_type, dst_type=dst_type) + for k, v in inputs.items() + }) + elif isinstance(inputs, abc.Iterable): + return type(inputs)( + cast_tensor_type(item, src_type=src_type, dst_type=dst_type) + for item in inputs) + # TODO: Currently not supported + # elif isinstance(inputs, InstanceData): + # for key, value in inputs.items(): + # inputs[key] = cast_tensor_type( + # value, src_type=src_type, dst_type=dst_type) + # return inputs + else: + return inputs + + +@contextmanager +def _ignore_torch_cuda_oom(): + """A context which ignores CUDA OOM exception from pytorch. + + Code is modified from + # noqa: E501 + """ + try: + yield + except RuntimeError as e: + # NOTE: the string may change? + if 'CUDA out of memory. ' in str(e): + pass + else: + raise + + +class AvoidOOM: + """Try to convert inputs to FP16 and CPU if got a PyTorch's CUDA Out of + Memory error. It will do the following steps: + + 1. First retry after calling `torch.cuda.empty_cache()`. + 2. If that still fails, it will then retry by converting inputs + to FP16. + 3. If that still fails trying to convert inputs to CPUs. + In this case, it expects the function to dispatch to + CPU implementation. + + Args: + to_cpu (bool): Whether to convert outputs to CPU if get an OOM + error. This will slow down the code significantly. + Defaults to True. + test (bool): Skip `_ignore_torch_cuda_oom` operate that can use + lightweight data in unit test, only used in + test unit. Defaults to False. + + Examples: + >>> from mmdet.utils.memory import AvoidOOM + >>> AvoidCUDAOOM = AvoidOOM() + >>> output = AvoidOOM.retry_if_cuda_oom( + >>> some_torch_function)(input1, input2) + >>> # To use as a decorator + >>> # from mmdet.utils import AvoidCUDAOOM + >>> @AvoidCUDAOOM.retry_if_cuda_oom + >>> def function(*args, **kwargs): + >>> return None + ``` + + Note: + 1. The output may be on CPU even if inputs are on GPU. Processing + on CPU will slow down the code significantly. + 2. When converting inputs to CPU, it will only look at each argument + and check if it has `.device` and `.to` for conversion. Nested + structures of tensors are not supported. + 3. Since the function might be called more than once, it has to be + stateless. + """ + + def __init__(self, to_cpu=True, test=False): + self.to_cpu = to_cpu + self.test = test + + def retry_if_cuda_oom(self, func): + """Makes a function retry itself after encountering pytorch's CUDA OOM + error. + + The implementation logic is referred to + https://github.com/facebookresearch/detectron2/blob/main/detectron2/utils/memory.py + + Args: + func: a stateless callable that takes tensor-like objects + as arguments. + Returns: + func: a callable which retries `func` if OOM is encountered. + """ # noqa: W605 + + @wraps(func) + def wrapped(*args, **kwargs): + + # raw function + if not self.test: + with _ignore_torch_cuda_oom(): + return func(*args, **kwargs) + + # Clear cache and retry + torch.cuda.empty_cache() + with _ignore_torch_cuda_oom(): + return func(*args, **kwargs) + + # get the type and device of first tensor + dtype, device = None, None + values = args + tuple(kwargs.values()) + for value in values: + if isinstance(value, torch.Tensor): + dtype = value.dtype + device = value.device + break + if dtype is None or device is None: + raise ValueError('There is no tensor in the inputs, ' + 'cannot get dtype and device.') + + # Convert to FP16 + fp16_args = cast_tensor_type(args, dst_type=torch.half) + fp16_kwargs = cast_tensor_type(kwargs, dst_type=torch.half) + logger = get_root_logger() + logger.warning(f'Attempting to copy inputs of {str(func)} ' + 'to FP16 due to CUDA OOM') + + # get input tensor type, the output type will same as + # the first parameter type. + with _ignore_torch_cuda_oom(): + output = func(*fp16_args, **fp16_kwargs) + output = cast_tensor_type( + output, src_type=torch.half, dst_type=dtype) + if not self.test: + return output + logger.warning('Using FP16 still meet CUDA OOM') + + # Try on CPU. This will slow down the code significantly, + # therefore print a notice. + if self.to_cpu: + logger.warning(f'Attempting to copy inputs of {str(func)} ' + 'to CPU due to CUDA OOM') + cpu_device = torch.empty(0).device + cpu_args = cast_tensor_type(args, dst_type=cpu_device) + cpu_kwargs = cast_tensor_type(kwargs, dst_type=cpu_device) + + # convert outputs to GPU + with _ignore_torch_cuda_oom(): + logger.warning(f'Convert outputs to GPU (device={device})') + output = func(*cpu_args, **cpu_kwargs) + output = cast_tensor_type( + output, src_type=cpu_device, dst_type=device) + return output + + warnings.warn('Cannot convert output to GPU due to CUDA OOM, ' + 'the output is now on CPU, which might cause ' + 'errors if the output need to interact with GPU ' + 'data in subsequent operations') + logger.warning('Cannot convert output to GPU due to ' + 'CUDA OOM, the output is on CPU now.') + + return func(*cpu_args, **cpu_kwargs) + else: + # may still get CUDA OOM error + return func(*args, **kwargs) + + return wrapped + + +# To use AvoidOOM as a decorator +AvoidCUDAOOM = AvoidOOM() diff --git a/mmdet/utils/misc.py b/mmdet/utils/misc.py new file mode 100644 index 0000000..2017cbb --- /dev/null +++ b/mmdet/utils/misc.py @@ -0,0 +1,89 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import glob +import os +import os.path as osp +import warnings + +import mmcv +import torch +from mmcv.utils import TORCH_VERSION, digit_version, print_log + + +def find_latest_checkpoint(path, suffix='pth'): + """Find the latest checkpoint from the working directory. + + Args: + path(str): The path to find checkpoints. + suffix(str): File extension. + Defaults to pth. + + Returns: + latest_path(str | None): File path of the latest checkpoint. + References: + .. [1] https://github.com/microsoft/SoftTeacher + /blob/main/ssod/utils/patch.py + """ + if not osp.exists(path): + warnings.warn('The path of checkpoints does not exist.') + return None + if osp.exists(osp.join(path, f'latest.{suffix}')): + return osp.join(path, f'latest.{suffix}') + + checkpoints = glob.glob(osp.join(path, f'*.{suffix}')) + if len(checkpoints) == 0: + warnings.warn('There are no checkpoints in the path.') + return None + latest = -1 + latest_path = None + for checkpoint in checkpoints: + count = int(osp.basename(checkpoint).split('_')[-1].split('.')[0]) + if count > latest: + latest = count + latest_path = checkpoint + return latest_path + + +def update_data_root(cfg, logger=None): + """Update data root according to env MMDET_DATASETS. + + If set env MMDET_DATASETS, update cfg.data_root according to + MMDET_DATASETS. Otherwise, using cfg.data_root as default. + + Args: + cfg (mmcv.Config): The model config need to modify + logger (logging.Logger | str | None): the way to print msg + """ + assert isinstance(cfg, mmcv.Config), \ + f'cfg got wrong type: {type(cfg)}, expected mmcv.Config' + + if 'MMDET_DATASETS' in os.environ: + dst_root = os.environ['MMDET_DATASETS'] + print_log(f'MMDET_DATASETS has been set to be {dst_root}.' + f'Using {dst_root} as data root.') + else: + return + + assert isinstance(cfg, mmcv.Config), \ + f'cfg got wrong type: {type(cfg)}, expected mmcv.Config' + + def update(cfg, src_str, dst_str): + for k, v in cfg.items(): + if isinstance(v, mmcv.ConfigDict): + update(cfg[k], src_str, dst_str) + if isinstance(v, str) and src_str in v: + cfg[k] = v.replace(src_str, dst_str) + + update(cfg.data, cfg.data_root, dst_root) + cfg.data_root = dst_root + + +_torch_version_div_indexing = ( + 'parrots' not in TORCH_VERSION + and digit_version(TORCH_VERSION) >= digit_version('1.8')) + + +def floordiv(dividend, divisor, rounding_mode='trunc'): + if _torch_version_div_indexing: + return torch.div(dividend, divisor, rounding_mode=rounding_mode) + else: + return dividend // divisor diff --git a/mmdet/utils/profiling.py b/mmdet/utils/profiling.py new file mode 100644 index 0000000..2f53f45 --- /dev/null +++ b/mmdet/utils/profiling.py @@ -0,0 +1,40 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import contextlib +import sys +import time + +import torch + +if sys.version_info >= (3, 7): + + @contextlib.contextmanager + def profile_time(trace_name, + name, + enabled=True, + stream=None, + end_stream=None): + """Print time spent by CPU and GPU. + + Useful as a temporary context manager to find sweet spots of code + suitable for async implementation. + """ + if (not enabled) or not torch.cuda.is_available(): + yield + return + stream = stream if stream else torch.cuda.current_stream() + end_stream = end_stream if end_stream else stream + start = torch.cuda.Event(enable_timing=True) + end = torch.cuda.Event(enable_timing=True) + stream.record_event(start) + try: + cpu_start = time.monotonic() + yield + finally: + cpu_end = time.monotonic() + end_stream.record_event(end) + end.synchronize() + cpu_time = (cpu_end - cpu_start) * 1000 + gpu_time = start.elapsed_time(end) + msg = f'{trace_name} {name} cpu_time {cpu_time:.2f} ms ' + msg += f'gpu_time {gpu_time:.2f} ms stream {stream}' + print(msg, end_stream) diff --git a/mmdet/utils/replace_cfg_vals.py b/mmdet/utils/replace_cfg_vals.py new file mode 100644 index 0000000..6ca301d --- /dev/null +++ b/mmdet/utils/replace_cfg_vals.py @@ -0,0 +1,70 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import re + +from mmcv.utils import Config + + +def replace_cfg_vals(ori_cfg): + """Replace the string "${key}" with the corresponding value. + + Replace the "${key}" with the value of ori_cfg.key in the config. And + support replacing the chained ${key}. Such as, replace "${key0.key1}" + with the value of cfg.key0.key1. Code is modified from `vars.py + < https://github.com/microsoft/SoftTeacher/blob/main/ssod/utils/vars.py>`_ # noqa: E501 + + Args: + ori_cfg (mmcv.utils.config.Config): + The origin config with "${key}" generated from a file. + + Returns: + updated_cfg [mmcv.utils.config.Config]: + The config with "${key}" replaced by the corresponding value. + """ + + def get_value(cfg, key): + for k in key.split('.'): + cfg = cfg[k] + return cfg + + def replace_value(cfg): + if isinstance(cfg, dict): + return {key: replace_value(value) for key, value in cfg.items()} + elif isinstance(cfg, list): + return [replace_value(item) for item in cfg] + elif isinstance(cfg, tuple): + return tuple([replace_value(item) for item in cfg]) + elif isinstance(cfg, str): + # the format of string cfg may be: + # 1) "${key}", which will be replaced with cfg.key directly + # 2) "xxx${key}xxx" or "xxx${key1}xxx${key2}xxx", + # which will be replaced with the string of the cfg.key + keys = pattern_key.findall(cfg) + values = [get_value(ori_cfg, key[2:-1]) for key in keys] + if len(keys) == 1 and keys[0] == cfg: + # the format of string cfg is "${key}" + cfg = values[0] + else: + for key, value in zip(keys, values): + # the format of string cfg is + # "xxx${key}xxx" or "xxx${key1}xxx${key2}xxx" + assert not isinstance(value, (dict, list, tuple)), \ + f'for the format of string cfg is ' \ + f"'xxxxx${key}xxxxx' or 'xxx${key}xxx${key}xxx', " \ + f"the type of the value of '${key}' " \ + f'can not be dict, list, or tuple' \ + f'but you input {type(value)} in {cfg}' + cfg = cfg.replace(key, str(value)) + return cfg + else: + return cfg + + # the pattern of string "${key}" + pattern_key = re.compile(r'\$\{[a-zA-Z\d_.]*\}') + # the type of ori_cfg._cfg_dict is mmcv.utils.config.ConfigDict + updated_cfg = Config( + replace_value(ori_cfg._cfg_dict), filename=ori_cfg.filename) + # replace the model with model_wrapper + if updated_cfg.get('model_wrapper', None) is not None: + updated_cfg.model = updated_cfg.model_wrapper + updated_cfg.pop('model_wrapper') + return updated_cfg diff --git a/mmdet/utils/rfnext.py b/mmdet/utils/rfnext.py new file mode 100644 index 0000000..568f3d3 --- /dev/null +++ b/mmdet/utils/rfnext.py @@ -0,0 +1,43 @@ +# Copyright (c) OpenMMLab. All rights reserved. +try: + from mmcv.cnn import RFSearchHook +except ImportError: + RFSearchHook = None + + +def rfnext_init_model(detector, cfg): + """Rcecptive field search via dilation rates. + + Please refer to `RF-Next: Efficient Receptive Field + Search for Convolutional Neural Networks + `_ for more details. + + Args: + detector (nn.Module): The detector before initializing RF-Next. + cfg (mmcv.Config): The config for RF-Next. + If the RFSearchHook is defined in the cfg.custom_hooks, + the detector will be initialized for RF-Next. + """ + + if cfg.get('custom_hooks', None) is None: + return + custom_hook_types = [hook['type'] for hook in cfg.custom_hooks] + if 'RFSearchHook' not in custom_hook_types: + return + + index = custom_hook_types.index('RFSearchHook') + rfsearch_cfg = cfg.custom_hooks[index] + assert rfsearch_cfg['type'] == 'RFSearchHook' + + assert RFSearchHook is not None, 'Please install mmcv > 1.7.0' + + # initlize a RFSearchHook + rfsearch_warp = RFSearchHook( + mode=rfsearch_cfg.get('mode', 'search'), + config=rfsearch_cfg.get('config', None), + rfstructure_file=rfsearch_cfg.get('rfstructure_file', None), + by_epoch=rfsearch_cfg.get('by_epoch', True), + verbose=rfsearch_cfg.get('verbose', True), + ) + rfsearch_warp.init_model(detector) + rfsearch_cfg['rfstructure_file'] = None diff --git a/mmdet/utils/setup_env.py b/mmdet/utils/setup_env.py new file mode 100644 index 0000000..6637cf8 --- /dev/null +++ b/mmdet/utils/setup_env.py @@ -0,0 +1,53 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os +import platform +import warnings + +import cv2 +import torch.multiprocessing as mp + + +def setup_multi_processes(cfg): + """Setup multi-processing environment variables.""" + # set multi-process start method as `fork` to speed up the training + if platform.system() != 'Windows': + mp_start_method = cfg.get('mp_start_method', 'fork') + current_method = mp.get_start_method(allow_none=True) + if current_method is not None and current_method != mp_start_method: + warnings.warn( + f'Multi-processing start method `{mp_start_method}` is ' + f'different from the previous setting `{current_method}`.' + f'It will be force set to `{mp_start_method}`. You can change ' + f'this behavior by changing `mp_start_method` in your config.') + mp.set_start_method(mp_start_method, force=True) + + # disable opencv multithreading to avoid system being overloaded + opencv_num_threads = cfg.get('opencv_num_threads', 0) + cv2.setNumThreads(opencv_num_threads) + + # setup OMP threads + # This code is referred from https://github.com/pytorch/pytorch/blob/master/torch/distributed/run.py # noqa + workers_per_gpu = cfg.data.get('workers_per_gpu', 1) + if 'train_dataloader' in cfg.data: + workers_per_gpu = \ + max(cfg.data.train_dataloader.get('workers_per_gpu', 1), + workers_per_gpu) + + if 'OMP_NUM_THREADS' not in os.environ and workers_per_gpu > 1: + omp_num_threads = 1 + warnings.warn( + f'Setting OMP_NUM_THREADS environment variable for each process ' + f'to be {omp_num_threads} in default, to avoid your system being ' + f'overloaded, please further tune the variable for optimal ' + f'performance in your application as needed.') + os.environ['OMP_NUM_THREADS'] = str(omp_num_threads) + + # setup MKL threads + if 'MKL_NUM_THREADS' not in os.environ and workers_per_gpu > 1: + mkl_num_threads = 1 + warnings.warn( + f'Setting MKL_NUM_THREADS environment variable for each process ' + f'to be {mkl_num_threads} in default, to avoid your system being ' + f'overloaded, please further tune the variable for optimal ' + f'performance in your application as needed.') + os.environ['MKL_NUM_THREADS'] = str(mkl_num_threads) diff --git a/mmdet/utils/split_batch.py b/mmdet/utils/split_batch.py new file mode 100644 index 0000000..0276fb3 --- /dev/null +++ b/mmdet/utils/split_batch.py @@ -0,0 +1,45 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + + +def split_batch(img, img_metas, kwargs): + """Split data_batch by tags. + + Code is modified from + # noqa: E501 + + Args: + img (Tensor): of shape (N, C, H, W) encoding input images. + Typically these should be mean centered and std scaled. + img_metas (list[dict]): List of image info dict where each dict + has: 'img_shape', 'scale_factor', 'flip', and may also contain + 'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'. + For details on the values of these keys, see + :class:`mmdet.datasets.pipelines.Collect`. + kwargs (dict): Specific to concrete implementation. + + Returns: + data_groups (dict): a dict that data_batch splited by tags, + such as 'sup', 'unsup_teacher', and 'unsup_student'. + """ + + # only stack img in the batch + def fuse_list(obj_list, obj): + return torch.stack(obj_list) if isinstance(obj, + torch.Tensor) else obj_list + + # select data with tag from data_batch + def select_group(data_batch, current_tag): + group_flag = [tag == current_tag for tag in data_batch['tag']] + return { + k: fuse_list([vv for vv, gf in zip(v, group_flag) if gf], v) + for k, v in data_batch.items() + } + + kwargs.update({'img': img, 'img_metas': img_metas}) + kwargs.update({'tag': [meta['tag'] for meta in img_metas]}) + tags = list(set(kwargs['tag'])) + data_groups = {tag: select_group(kwargs, tag) for tag in tags} + for tag, group in data_groups.items(): + group.pop('tag') + return data_groups diff --git a/mmdet/utils/util_distribution.py b/mmdet/utils/util_distribution.py new file mode 100644 index 0000000..ba32cc9 --- /dev/null +++ b/mmdet/utils/util_distribution.py @@ -0,0 +1,92 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +from mmcv.parallel import MMDataParallel, MMDistributedDataParallel + +dp_factory = {'cuda': MMDataParallel, 'cpu': MMDataParallel} + +ddp_factory = {'cuda': MMDistributedDataParallel} + + +def build_dp(model, device='cuda', dim=0, *args, **kwargs): + """build DataParallel module by device type. + + if device is cuda, return a MMDataParallel model; if device is mlu, + return a MLUDataParallel model. + + Args: + model (:class:`nn.Module`): model to be parallelized. + device (str): device type, cuda, cpu or mlu. Defaults to cuda. + dim (int): Dimension used to scatter the data. Defaults to 0. + + Returns: + nn.Module: the model to be parallelized. + """ + if device == 'npu': + from mmcv.device.npu import NPUDataParallel + dp_factory['npu'] = NPUDataParallel + torch.npu.set_device(kwargs['device_ids'][0]) + torch.npu.set_compile_mode(jit_compile=False) + model = model.npu() + elif device == 'cuda': + model = model.cuda(kwargs['device_ids'][0]) + elif device == 'mlu': + from mmcv.device.mlu import MLUDataParallel + dp_factory['mlu'] = MLUDataParallel + model = model.mlu() + + return dp_factory[device](model, dim=dim, *args, **kwargs) + + +def build_ddp(model, device='cuda', *args, **kwargs): + """Build DistributedDataParallel module by device type. + + If device is cuda, return a MMDistributedDataParallel model; + if device is mlu, return a MLUDistributedDataParallel model. + + Args: + model (:class:`nn.Module`): module to be parallelized. + device (str): device type, mlu or cuda. + + Returns: + :class:`nn.Module`: the module to be parallelized + + References: + .. [1] https://pytorch.org/docs/stable/generated/torch.nn.parallel. + DistributedDataParallel.html + """ + assert device in ['cuda', 'mlu', + 'npu'], 'Only available for cuda or mlu or npu devices.' + if device == 'npu': + from mmcv.device.npu import NPUDistributedDataParallel + torch.npu.set_compile_mode(jit_compile=False) + ddp_factory['npu'] = NPUDistributedDataParallel + model = model.npu() + elif device == 'cuda': + model = model.cuda() + elif device == 'mlu': + from mmcv.device.mlu import MLUDistributedDataParallel + ddp_factory['mlu'] = MLUDistributedDataParallel + model = model.mlu() + + return ddp_factory[device](model, *args, **kwargs) + + +def is_npu_available(): + """Returns a bool indicating if NPU is currently available.""" + return hasattr(torch, 'npu') and torch.npu.is_available() + + +def is_mlu_available(): + """Returns a bool indicating if MLU is currently available.""" + return hasattr(torch, 'is_mlu_available') and torch.is_mlu_available() + + +def get_device(): + """Returns an available device, cpu, cuda or mlu.""" + is_device_available = { + 'npu': is_npu_available(), + 'cuda': torch.cuda.is_available(), + 'mlu': is_mlu_available() + } + device_list = [k for k, v in is_device_available.items() if v] + return device_list[0] if len(device_list) >= 1 else 'cpu' diff --git a/mmdet/utils/util_mixins.py b/mmdet/utils/util_mixins.py new file mode 100644 index 0000000..b83b661 --- /dev/null +++ b/mmdet/utils/util_mixins.py @@ -0,0 +1,105 @@ +# Copyright (c) OpenMMLab. All rights reserved. +"""This module defines the :class:`NiceRepr` mixin class, which defines a +``__repr__`` and ``__str__`` method that only depend on a custom ``__nice__`` +method, which you must define. This means you only have to overload one +function instead of two. Furthermore, if the object defines a ``__len__`` +method, then the ``__nice__`` method defaults to something sensible, otherwise +it is treated as abstract and raises ``NotImplementedError``. + +To use simply have your object inherit from :class:`NiceRepr` +(multi-inheritance should be ok). + +This code was copied from the ubelt library: https://github.com/Erotemic/ubelt + +Example: + >>> # Objects that define __nice__ have a default __str__ and __repr__ + >>> class Student(NiceRepr): + ... def __init__(self, name): + ... self.name = name + ... def __nice__(self): + ... return self.name + >>> s1 = Student('Alice') + >>> s2 = Student('Bob') + >>> print(f's1 = {s1}') + >>> print(f's2 = {s2}') + s1 = + s2 = + +Example: + >>> # Objects that define __len__ have a default __nice__ + >>> class Group(NiceRepr): + ... def __init__(self, data): + ... self.data = data + ... def __len__(self): + ... return len(self.data) + >>> g = Group([1, 2, 3]) + >>> print(f'g = {g}') + g = +""" +import warnings + + +class NiceRepr: + """Inherit from this class and define ``__nice__`` to "nicely" print your + objects. + + Defines ``__str__`` and ``__repr__`` in terms of ``__nice__`` function + Classes that inherit from :class:`NiceRepr` should redefine ``__nice__``. + If the inheriting class has a ``__len__``, method then the default + ``__nice__`` method will return its length. + + Example: + >>> class Foo(NiceRepr): + ... def __nice__(self): + ... return 'info' + >>> foo = Foo() + >>> assert str(foo) == '' + >>> assert repr(foo).startswith('>> class Bar(NiceRepr): + ... pass + >>> bar = Bar() + >>> import pytest + >>> with pytest.warns(None) as record: + >>> assert 'object at' in str(bar) + >>> assert 'object at' in repr(bar) + + Example: + >>> class Baz(NiceRepr): + ... def __len__(self): + ... return 5 + >>> baz = Baz() + >>> assert str(baz) == '' + """ + + def __nice__(self): + """str: a "nice" summary string describing this module""" + if hasattr(self, '__len__'): + # It is a common pattern for objects to use __len__ in __nice__ + # As a convenience we define a default __nice__ for these objects + return str(len(self)) + else: + # In all other cases force the subclass to overload __nice__ + raise NotImplementedError( + f'Define the __nice__ method for {self.__class__!r}') + + def __repr__(self): + """str: the string of the module""" + try: + nice = self.__nice__() + classname = self.__class__.__name__ + return f'<{classname}({nice}) at {hex(id(self))}>' + except NotImplementedError as ex: + warnings.warn(str(ex), category=RuntimeWarning) + return object.__repr__(self) + + def __str__(self): + """str: the string of the module""" + try: + classname = self.__class__.__name__ + nice = self.__nice__() + return f'<{classname}({nice})>' + except NotImplementedError as ex: + warnings.warn(str(ex), category=RuntimeWarning) + return object.__repr__(self) diff --git a/mmdet/utils/util_random.py b/mmdet/utils/util_random.py new file mode 100644 index 0000000..dc1ecb6 --- /dev/null +++ b/mmdet/utils/util_random.py @@ -0,0 +1,34 @@ +# Copyright (c) OpenMMLab. All rights reserved. +"""Helpers for random number generators.""" +import numpy as np + + +def ensure_rng(rng=None): + """Coerces input into a random number generator. + + If the input is None, then a global random state is returned. + + If the input is a numeric value, then that is used as a seed to construct a + random state. Otherwise the input is returned as-is. + + Adapted from [1]_. + + Args: + rng (int | numpy.random.RandomState | None): + if None, then defaults to the global rng. Otherwise this can be an + integer or a RandomState class + Returns: + (numpy.random.RandomState) : rng - + a numpy random number generator + + References: + .. [1] https://gitlab.kitware.com/computer-vision/kwarray/blob/master/kwarray/util_random.py#L270 # noqa: E501 + """ + + if rng is None: + rng = np.random.mtrand._rand + elif isinstance(rng, int): + rng = np.random.RandomState(rng) + else: + rng = rng + return rng diff --git a/mmdet/version.py b/mmdet/version.py new file mode 100644 index 0000000..fecd645 --- /dev/null +++ b/mmdet/version.py @@ -0,0 +1,19 @@ +# Copyright (c) OpenMMLab. All rights reserved. + +__version__ = '2.28.2' +short_version = __version__ + + +def parse_version_info(version_str): + version_info = [] + for x in version_str.split('.'): + if x.isdigit(): + version_info.append(int(x)) + elif x.find('rc') != -1: + patch_version = x.split('rc') + version_info.append(int(patch_version[0])) + version_info.append(f'rc{patch_version[1]}') + return tuple(version_info) + + +version_info = parse_version_info(__version__) diff --git a/model-index.yml b/model-index.yml new file mode 100644 index 0000000..587255b --- /dev/null +++ b/model-index.yml @@ -0,0 +1,73 @@ +Import: + - configs/atss/metafile.yml + - configs/autoassign/metafile.yml + - configs/carafe/metafile.yml + - configs/cascade_rcnn/metafile.yml + - configs/cascade_rpn/metafile.yml + - configs/centernet/metafile.yml + - configs/centripetalnet/metafile.yml + - configs/cornernet/metafile.yml + - configs/convnext/metafile.yml + - configs/dcn/metafile.yml + - configs/dcnv2/metafile.yml + - configs/deformable_detr/metafile.yml + - configs/detectors/metafile.yml + - configs/detr/metafile.yml + - configs/double_heads/metafile.yml + - configs/dyhead/metafile.yml + - configs/dynamic_rcnn/metafile.yml + - configs/efficientnet/metafile.yml + - configs/empirical_attention/metafile.yml + - configs/faster_rcnn/metafile.yml + - configs/fcos/metafile.yml + - configs/foveabox/metafile.yml + - configs/fpg/metafile.yml + - configs/free_anchor/metafile.yml + - configs/fsaf/metafile.yml + - configs/gcnet/metafile.yml + - configs/gfl/metafile.yml + - configs/ghm/metafile.yml + - configs/gn/metafile.yml + - configs/gn+ws/metafile.yml + - configs/grid_rcnn/metafile.yml + - configs/groie/metafile.yml + - configs/guided_anchoring/metafile.yml + - configs/hrnet/metafile.yml + - configs/htc/metafile.yml + - configs/instaboost/metafile.yml + - configs/lad/metafile.yml + - configs/ld/metafile.yml + - configs/libra_rcnn/metafile.yml + - configs/mask_rcnn/metafile.yml + - configs/ms_rcnn/metafile.yml + - configs/nas_fcos/metafile.yml + - configs/nas_fpn/metafile.yml + - configs/openimages/metafile.yml + - configs/paa/metafile.yml + - configs/pafpn/metafile.yml + - configs/panoptic_fpn/metafile.yml + - configs/pvt/metafile.yml + - configs/pisa/metafile.yml + - configs/point_rend/metafile.yml + - configs/queryinst/metafile.yml + - configs/regnet/metafile.yml + - configs/reppoints/metafile.yml + - configs/res2net/metafile.yml + - configs/resnest/metafile.yml + - configs/retinanet/metafile.yml + - configs/sabl/metafile.yml + - configs/scnet/metafile.yml + - configs/scratch/metafile.yml + - configs/seesaw_loss/metafile.yml + - configs/sparse_rcnn/metafile.yml + - configs/solo/metafile.yml + - configs/ssd/metafile.yml + - configs/swin/metafile.yml + - configs/tridentnet/metafile.yml + - configs/tood/metafile.yml + - configs/vfnet/metafile.yml + - configs/yolact/metafile.yml + - configs/yolo/metafile.yml + - configs/yolof/metafile.yml + - configs/yolox/metafile.yml + - configs/rfnext/metafile.yml diff --git a/mqb_general_process.py b/mqb_general_process.py new file mode 100644 index 0000000..debb6dc --- /dev/null +++ b/mqb_general_process.py @@ -0,0 +1,127 @@ +from mqbench.prepare_by_platform import prepare_by_platform, BackendType +from mqbench.advanced_ptq import ptq_reconstruction +from mqbench.convert_deploy import convert_deploy +import os +import yaml +from easydict import EasyDict +from mmdet.models.dense_heads import GARPNHead, RPNHead + +from shutil import copyfile +import time +import errno + +backend_dict = { + 'Academic': BackendType.Academic, + 'Tensorrt': BackendType.Tensorrt, + 'SNPE': BackendType.SNPE, + 'PPLW8A16': BackendType.PPLW8A16, + 'NNIE': BackendType.NNIE, + 'Vitis': BackendType.Vitis, + 'ONNX_QNN': BackendType.ONNX_QNN, + 'PPLCUDA': BackendType.PPLCUDA, +} + +# def load_calibrate_data(train_loader, cali_batchsize): +# cali_data = [] +# targets = [] +# for i, batch in enumerate(train_loader): +# cali_data.append(batch[0]) +# targets.append(batch[1]) +# if i + 1 == cali_batchsize: +# break +# return cali_data, targets + +def get_quantize_model(model, config, structure_detail): + backend_type = BackendType.Academic if not hasattr( + config.quantize, 'backend') else backend_dict[config.quantize.backend] + extra_prepare_dict = {} if not hasattr( + config, 'extra_prepare_dict') else config.extra_prepare_dict + return prepare_by_platform( + model, backend_type, structure_detail, extra_prepare_dict) + + +# def deploy(model, config): +# backend_type = BackendType.Academic if not hasattr( +# config.quantize, 'backend') else backend_dict[config.quantize.backend] +# output_path = './' if not hasattr( +# config.quantize, 'deploy') else config.quantize.deploy.output_path +# model_name = config.quantize.deploy.model_name +# deploy_to_qlinear = False if not hasattr( +# config.quantize.deploy, 'deploy_to_qlinear') else config.quantize.deploy.deploy_to_qlinear + +# convert_deploy(model, backend_type, { +# 'input': [1, 3, 224, 224]}, output_path=output_path, model_name=model_name, deploy_to_qlinear=deploy_to_qlinear) + + +def make_qmodel_for_mmd(model, quant_config, cfg): + print('\nGet FakeQuant model\n') + model.backbone = get_quantize_model(model.backbone, quant_config, cfg.backbone_detail) # QAT时,这个需要eval还是train + model.neck = get_quantize_model(model.neck, quant_config, cfg.neck_detail) # QAT时,这个需要eval还是train + model_general_architecture = cfg.get('model_general_architecture', None) + if model_general_architecture == 'FasterRCNN': + temp = get_quantize_model(model.rpn_head, quant_config, cfg.rpn_head_detail) # QAT时,这个需要eval还是train + # temp.__class__ = model.rpn_head.__class__ # NOTE 无奈之举 + model.rpn_head.forward = temp.forward # 太傻蛋勒 + model.rpn_head = temp + temp = get_quantize_model(model.roi_head.bbox_head, quant_config, cfg.roi_head_bbox_head_detail) # QAT时,这个需要eval还是train + # temp.__class__ = model.roi_head.bbox_head.__class__ + model.roi_head.bbox_head.forward = temp.forward # 太傻蛋勒 + model.roi_head.bbox_head = temp + else: + temp = get_quantize_model(model.bbox_head, quant_config, cfg.bbox_head_detail) # QAT时,这个需要eval还是train + model.bbox_head.forward = temp.forward # 太傻蛋勒 + model.bbox_head = temp + + # TODO 把东西del掉? + return model + +def prepocess(config_path): + # TODO 写一个cp yaml操作, + config = parse_config(config_path) + # seed first + # 如果指定了保存文件地址,检查文件夹是否存在,若不存在,则创建 + # if config.misc.output_dir: + # mkdir(config.misc.output_dir) + # config.misc.output_data_dir = os.path.join(config.misc.output_dir, 'data') + # mkdir(config.misc.output_data_dir) + # seed_all(config.process.seed) + return config + + +def parse_config(config_file): + with open(config_file) as f: + config = yaml.load(f, Loader=yaml.FullLoader) + cur_config = config + cur_path = config_file + while 'root' in cur_config: + root_path = os.path.dirname(cur_path) + cur_path = os.path.join(root_path, cur_config['root']) + with open(cur_path) as r: + root_config = yaml.load(r, Loader=yaml.FullLoader) + for k, v in root_config.items(): + if k not in config: + config[k] = v + cur_config = root_config + # config = yaml.safe_load(f) + config = EasyDict(config) + return config + +def mkdir(path): + try: + os.makedirs(path) + except OSError as e: + if e.errno != errno.EEXIST: + raise + + +def copy_config_file(config_file_path, dir): + # file_name = os.path.basename(config_file_path) + now_stamp = int(round(time.time()*1000)) + now_time = time.strftime('%Y_%m_%d_%H_%M',time.localtime(now_stamp/1000)) + new_file_name = f'config_{now_time}.yaml' + new_file_path = os.path.join(dir, new_file_name) + if not os.path.exists(dir): # 判断路径是否存在 + os.makedirs(dir) # 创建文件夹 + copyfile(config_file_path, new_file_path) + + \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq/COCO/fasterrcnn/res50_fpn/quant_config_w4a4.yaml b/mqbconfig/_legacy/lsq/COCO/fasterrcnn/res50_fpn/quant_config_w4a4.yaml new file mode 100644 index 0000000..cf23c8a --- /dev/null +++ b/mqbconfig/_legacy/lsq/COCO/fasterrcnn/res50_fpn/quant_config_w4a4.yaml @@ -0,0 +1,73 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, roi_heads, rpn, single_head, + anchor_generator, postprocess, assign_targets_to_anchors, compute_loss, box_coder, fg_bg_sampler, + proposal_matcher, select_training_samples, box_roi_pool] # 还得包括一些rpn、roi的子函数 + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: COCO + data_path: ../COCO + num_classes: 81 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: XXX + batch_size: 8 + start_epoch: 0 + epochs: 25 + workers: 8 + lr: 0.001 + lr_steps: [8, 14, 19, 22] + lr_gamma: 0.4 + momentum: 0.9 + weight_decay: 0.00006 + print_freq: 800 + my_buff_flag: False + qloss_flag: False + pretrained_flag: True + +misc: + model: fasterrcnn_res50_fpn # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ/COCO_FasterRCNN_Res50_FPN_bat16_usebase_w4a4 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq/COCO/fasterrcnn/res50_fpn/quant_config_w8a8.yaml b/mqbconfig/_legacy/lsq/COCO/fasterrcnn/res50_fpn/quant_config_w8a8.yaml new file mode 100644 index 0000000..da63bbb --- /dev/null +++ b/mqbconfig/_legacy/lsq/COCO/fasterrcnn/res50_fpn/quant_config_w8a8.yaml @@ -0,0 +1,73 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 8 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 8 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, roi_heads, rpn, single_head, + anchor_generator, postprocess, assign_targets_to_anchors, compute_loss, box_coder, fg_bg_sampler, + proposal_matcher, select_training_samples, box_roi_pool] # 还得包括一些rpn、roi的子函数 + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: COCO + data_path: ../COCO + num_classes: 81 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: XXX + batch_size: 8 + start_epoch: 0 + epochs: 25 + workers: 8 + lr: 0.0008 + lr_steps: [8, 14, 19, 22] + lr_gamma: 0.4 + momentum: 0.9 + weight_decay: 0.00006 + print_freq: 800 + my_buff_flag: False + qloss_flag: False + pretrained_flag: True + +misc: + model: fasterrcnn_res50_fpn # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ/COCO_FasterRCNN_Res50_FPN_bat16_usebase_w8a8 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq/COCO/retinanet/res50/quant_config_w4a4.yaml b/mqbconfig/_legacy/lsq/COCO/retinanet/res50/quant_config_w4a4.yaml new file mode 100644 index 0000000..588b50d --- /dev/null +++ b/mqbconfig/_legacy/lsq/COCO/retinanet/res50/quant_config_w4a4.yaml @@ -0,0 +1,72 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, anchor_generator, compute_loss, postprocess_detections] + # anchor_generator + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: COCO + data_path: ../COCO + num_classes: 81 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: + batch_size: 8 + start_epoch: 0 + epochs: 25 + workers: 8 + lr: 0.004 + lr_steps: [8, 14, 19, 22] + lr_gamma: 0.4 + momentum: 0.9 + weight_decay: 0.00008 + print_freq: 100 + my_buff_flag: False + qloss_flag: False + pretrained_flag: True + +misc: + model: retinanet_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/COCO_RetinaNet_Res50_bat16_usebase_w4a4 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq/COCO/retinanet/res50/quant_config_w8a8.yaml b/mqbconfig/_legacy/lsq/COCO/retinanet/res50/quant_config_w8a8.yaml new file mode 100644 index 0000000..7eab053 --- /dev/null +++ b/mqbconfig/_legacy/lsq/COCO/retinanet/res50/quant_config_w8a8.yaml @@ -0,0 +1,72 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 8 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 8 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, anchor_generator, compute_loss, postprocess_detections] + # anchor_generator + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: COCO + data_path: ../COCO + num_classes: 81 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: + batch_size: 8 + start_epoch: 0 + epochs: 25 + workers: 8 + lr: 0.004 + lr_steps: [8, 14, 19, 22] + lr_gamma: 0.4 + momentum: 0.9 + weight_decay: 0.00008 + print_freq: 100 + my_buff_flag: False + qloss_flag: False + pretrained_flag: True + +misc: + model: retinanet_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/COCO_RetinaNet_Res50_bat16_usebase_w8a8 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq/COCO/ssd300/ssd_quant_config_w4a4.yaml b/mqbconfig/_legacy/lsq/COCO/ssd300/ssd_quant_config_w4a4.yaml new file mode 100644 index 0000000..785665c --- /dev/null +++ b/mqbconfig/_legacy/lsq/COCO/ssd300/ssd_quant_config_w4a4.yaml @@ -0,0 +1,69 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [compute_loss, postprocess] + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: COCO # VOC2012 VOC2007 VOC0712 COCO + data_path: ../COCO + num_classes: 81 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: save_weights/ORI/COCO_SSD300_Res50_bat128/model-12.pth + batch_size: 16 + start_epoch: 0 + epochs: 16 + workers: 8 + lr: 0.001 + lr_steps: [5, 11] + lr_gamma: 0.1 + momentum: 0.9 + weight_decay: 0.0001 + print_freq: 1600 + my_buff_flag: False + qloss_flag: False + pretrained_flag: True + +misc: + model: ssd300_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ/COCO_ssd300_Res50_bat32_usebase_w4a4 + resume: + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq/COCO/ssd300/ssd_quant_config_w4a4_test.yaml b/mqbconfig/_legacy/lsq/COCO/ssd300/ssd_quant_config_w4a4_test.yaml new file mode 100644 index 0000000..4a62a8b --- /dev/null +++ b/mqbconfig/_legacy/lsq/COCO/ssd300/ssd_quant_config_w4a4_test.yaml @@ -0,0 +1,69 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [compute_loss, postprocess] + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: COCO # VOC2012 VOC2007 VOC0712 COCO + data_path: XXX + num_classes: 81 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: + batch_size: 24 + start_epoch: 0 + epochs: 25 + workers: 8 + lr: 0.001 + lr_steps: [4, 10, 15, 18] + lr_gamma: 0.25 + momentum: 0.9 + weight_decay: 0.000016 + print_freq: 850 + my_buff_flag: False + qloss_flag: False + pretrained_flag: True + +misc: + model: ssd300_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ/COCO_ssd300_Res50_bat72_usebase_w4a4 + resume: + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq/VOC0712/fasterrcnn/mbnv2/quant_config_w4a4.yaml b/mqbconfig/_legacy/lsq/VOC0712/fasterrcnn/mbnv2/quant_config_w4a4.yaml new file mode 100644 index 0000000..a988789 --- /dev/null +++ b/mqbconfig/_legacy/lsq/VOC0712/fasterrcnn/mbnv2/quant_config_w4a4.yaml @@ -0,0 +1,73 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, roi_heads, rpn, single_head, + anchor_generator, postprocess, assign_targets_to_anchors, compute_loss, box_coder, fg_bg_sampler, + proposal_matcher, select_training_samples, box_roi_pool] # 还得包括一些rpn、roi的子函数 + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: save_weights/ORI/VOC_FasterRCNN_MBNv2_bat24/model-20.pth + batch_size: 5 + start_epoch: 0 + epochs: 18 + workers: 8 + lr: 0.001 + lr_steps: [7, 14] + lr_gamma: 0.1 + momentum: 0.9 + weight_decay: 0.0001 + print_freq: 1600 + my_buff_flag: False + qloss_flag: False + pretrained_flag: True + +misc: + model: fasterrcnn_mbnv2 # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ/VOC_FasterRCNN_MBNv2_bat10_usebase_w4a4 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq/VOC0712/fasterrcnn/mbnv2/quant_config_w8a8.yaml b/mqbconfig/_legacy/lsq/VOC0712/fasterrcnn/mbnv2/quant_config_w8a8.yaml new file mode 100644 index 0000000..fcd9df9 --- /dev/null +++ b/mqbconfig/_legacy/lsq/VOC0712/fasterrcnn/mbnv2/quant_config_w8a8.yaml @@ -0,0 +1,73 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 8 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 8 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, roi_heads, rpn, single_head, + anchor_generator, postprocess, assign_targets_to_anchors, compute_loss, box_coder, fg_bg_sampler, + proposal_matcher, select_training_samples, box_roi_pool] # 还得包括一些rpn、roi的子函数 + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: + batch_size: 8 + start_epoch: 0 + epochs: 25 + workers: 8 + lr: 0.0008 + lr_steps: [8, 14, 19, 22] + lr_gamma: 0.4 + momentum: 0.9 + weight_decay: 0.00006 + print_freq: 800 + my_buff_flag: False + qloss_flag: False + pretrained_flag: True + +misc: + model: fasterrcnn_mbnv2 # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ/VOC_FasterRCNN_MBNv2_bat16_usebase_w8a8 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq/VOC0712/fasterrcnn/res50_fpn/quant_config_w4a4.yaml b/mqbconfig/_legacy/lsq/VOC0712/fasterrcnn/res50_fpn/quant_config_w4a4.yaml new file mode 100644 index 0000000..ac5a89f --- /dev/null +++ b/mqbconfig/_legacy/lsq/VOC0712/fasterrcnn/res50_fpn/quant_config_w4a4.yaml @@ -0,0 +1,73 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, roi_heads, rpn, single_head, + anchor_generator, postprocess, assign_targets_to_anchors, compute_loss, box_coder, fg_bg_sampler, + proposal_matcher, select_training_samples, box_roi_pool] # 还得包括一些rpn、roi的子函数 + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: XXX + batch_size: 8 + start_epoch: 0 + epochs: 25 + workers: 8 + lr: 0.001 + lr_steps: [8, 14, 19, 22] + lr_gamma: 0.4 + momentum: 0.9 + weight_decay: 0.00006 + print_freq: 800 + my_buff_flag: False + qloss_flag: False + pretrained_flag: True + +misc: + model: fasterrcnn_res50_fpn # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ/VOC_FasterRCNN_Res50_FPN_bat16_usebase_w4a4 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq/VOC0712/fasterrcnn/res50_fpn/quant_config_w8a8.yaml b/mqbconfig/_legacy/lsq/VOC0712/fasterrcnn/res50_fpn/quant_config_w8a8.yaml new file mode 100644 index 0000000..60a4c30 --- /dev/null +++ b/mqbconfig/_legacy/lsq/VOC0712/fasterrcnn/res50_fpn/quant_config_w8a8.yaml @@ -0,0 +1,73 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 8 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 8 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, roi_heads, rpn, single_head, + anchor_generator, postprocess, assign_targets_to_anchors, compute_loss, box_coder, fg_bg_sampler, + proposal_matcher, select_training_samples, box_roi_pool] # 还得包括一些rpn、roi的子函数 + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: + batch_size: 8 + start_epoch: 0 + epochs: 25 + workers: 8 + lr: 0.0008 + lr_steps: [8, 14, 19, 22] + lr_gamma: 0.4 + momentum: 0.9 + weight_decay: 0.00006 + print_freq: 800 + my_buff_flag: False + qloss_flag: False + pretrained_flag: True + +misc: + model: fasterrcnn_res50_fpn # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ/VOC_FasterRCNN_Res50_FPN_bat16_usebase_w8a8 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq/VOC0712/retinanet/res18/quant_config_w4a4.yaml b/mqbconfig/_legacy/lsq/VOC0712/retinanet/res18/quant_config_w4a4.yaml new file mode 100644 index 0000000..0e1d9eb --- /dev/null +++ b/mqbconfig/_legacy/lsq/VOC0712/retinanet/res18/quant_config_w4a4.yaml @@ -0,0 +1,72 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, anchor_generator, compute_loss, postprocess_detections] + # anchor_generator + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: save_weights/ORI/VOC_Retinanet_Res18_bat32/model-24.pth + batch_size: 8 + start_epoch: 0 + epochs: 20 + workers: 8 + lr: 0.001 + lr_steps: [6, 13, 18] + lr_gamma: 0.1 + momentum: 0.9 + weight_decay: 0.0001 + print_freq: 1600 + my_buff_flag: False + qloss_flag: False + pretrained_flag: True + +misc: + model: retinanet_res18 # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ/VOC_RetinaNet_Res18_bat16_usebase_w4a4 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq/VOC0712/retinanet/res18/quant_config_w8a8.yaml b/mqbconfig/_legacy/lsq/VOC0712/retinanet/res18/quant_config_w8a8.yaml new file mode 100644 index 0000000..80aeb1f --- /dev/null +++ b/mqbconfig/_legacy/lsq/VOC0712/retinanet/res18/quant_config_w8a8.yaml @@ -0,0 +1,72 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 8 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 8 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, anchor_generator, compute_loss, postprocess_detections] + # anchor_generator + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: + batch_size: 8 + start_epoch: 0 + epochs: 25 + workers: 8 + lr: 0.004 + lr_steps: [8, 14, 19, 22] + lr_gamma: 0.4 + momentum: 0.9 + weight_decay: 0.00008 + print_freq: 100 + my_buff_flag: False + qloss_flag: False + pretrained_flag: True + +misc: + model: retinanet_res18 # retinanet/ssd300 + output_dir: save_weights/QAT/VOC_RetinaNet_Res18_bat16_usebase_w8a8 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq/VOC0712/retinanet/res50/quant_config_w4a4.yaml b/mqbconfig/_legacy/lsq/VOC0712/retinanet/res50/quant_config_w4a4.yaml new file mode 100644 index 0000000..a3fb521 --- /dev/null +++ b/mqbconfig/_legacy/lsq/VOC0712/retinanet/res50/quant_config_w4a4.yaml @@ -0,0 +1,72 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, anchor_generator, compute_loss, postprocess_detections] + # anchor_generator + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: + batch_size: 8 + start_epoch: 0 + epochs: 25 + workers: 8 + lr: 0.004 + lr_steps: [8, 14, 19, 22] + lr_gamma: 0.4 + momentum: 0.9 + weight_decay: 0.00008 + print_freq: 100 + my_buff_flag: False + qloss_flag: False + pretrained_flag: True + +misc: + model: retinanet_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/VOC_RetinaNet_Res50_bat16_usebase_w4a4 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq/VOC0712/retinanet/res50/quant_config_w8a8.yaml b/mqbconfig/_legacy/lsq/VOC0712/retinanet/res50/quant_config_w8a8.yaml new file mode 100644 index 0000000..79107a7 --- /dev/null +++ b/mqbconfig/_legacy/lsq/VOC0712/retinanet/res50/quant_config_w8a8.yaml @@ -0,0 +1,72 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 8 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 8 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, anchor_generator, compute_loss, postprocess_detections] + # anchor_generator + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: + batch_size: 8 + start_epoch: 0 + epochs: 25 + workers: 8 + lr: 0.004 + lr_steps: [8, 14, 19, 22] + lr_gamma: 0.4 + momentum: 0.9 + weight_decay: 0.00008 + print_freq: 100 + my_buff_flag: False + qloss_flag: False + pretrained_flag: True + +misc: + model: retinanet_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/VOC_RetinaNet_Res50_bat16_usebase_w8a8 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq/VOC0712/ssd300/ssd_quant_config_w2a2.yaml b/mqbconfig/_legacy/lsq/VOC0712/ssd300/ssd_quant_config_w2a2.yaml new file mode 100644 index 0000000..b7defe4 --- /dev/null +++ b/mqbconfig/_legacy/lsq/VOC0712/ssd300/ssd_quant_config_w2a2.yaml @@ -0,0 +1,69 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 2 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 2 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [compute_loss, postprocess] + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 # VOC2012 VOC2007 VOC0712 COCO + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: save_weights/ORI/VOC_SSD300_Res50_bat128/model-9.pth + batch_size: 16 + start_epoch: 0 + epochs: 28 + workers: 8 + lr: 0.01 + lr_steps: [14, 20, 25] # 001 0001 + lr_gamma: 0.1 + momentum: 0.9 + weight_decay: 0.0001 + print_freq: 850 + my_buff_flag: False + qloss_flag: False + pretrained_flag: True + +misc: + model: ssd300_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ/VOC_ssd300_Res50_bat32_usebase_w2a2 + resume: + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq/VOC0712/ssd300/ssd_quant_config_w4a4.yaml b/mqbconfig/_legacy/lsq/VOC0712/ssd300/ssd_quant_config_w4a4.yaml new file mode 100644 index 0000000..001f806 --- /dev/null +++ b/mqbconfig/_legacy/lsq/VOC0712/ssd300/ssd_quant_config_w4a4.yaml @@ -0,0 +1,69 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [compute_loss, postprocess] + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 # VOC2012 VOC2007 VOC0712 COCO + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: save_weights/ORI/VOC_SSD300_Res50_bat128/model-9.pth + batch_size: 16 + start_epoch: 0 + epochs: 16 + workers: 8 + lr: 0.001 + lr_steps: [6, 13] + lr_gamma: 0.1 + momentum: 0.9 + weight_decay: 0.0001 + print_freq: 850 + my_buff_flag: False + qloss_flag: False + pretrained_flag: True + +misc: + model: ssd300_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ/VOC_ssd300_Res50_bat32_usebase_w4a4 + resume: + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq/VOC0712/ssd300/ssd_quant_config_w8a8.yaml b/mqbconfig/_legacy/lsq/VOC0712/ssd300/ssd_quant_config_w8a8.yaml new file mode 100644 index 0000000..4e0bbd3 --- /dev/null +++ b/mqbconfig/_legacy/lsq/VOC0712/ssd300/ssd_quant_config_w8a8.yaml @@ -0,0 +1,69 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 8 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 8 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [compute_loss, postprocess] + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 # VOC2012 VOC2007 VOC0712 COCO + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: save_weights/ORI/VOC_SSD300_Res50_bat128/model-9.pth + batch_size: 16 + start_epoch: 0 + epochs: 8 + workers: 8 + lr: 0.0001 + lr_steps: [4] + lr_gamma: 0.1 + momentum: 0.9 + weight_decay: 0.0001 + print_freq: 850 + my_buff_flag: False + qloss_flag: False + pretrained_flag: True + +misc: + model: ssd300_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ/VOC_ssd300_Res50_bat32_usebase_w8a8 + resume: + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq_mypro/COCO/fasterrcnn/res50_fpn/quant_config_w4a4.yaml b/mqbconfig/_legacy/lsq_mypro/COCO/fasterrcnn/res50_fpn/quant_config_w4a4.yaml new file mode 100644 index 0000000..936d18f --- /dev/null +++ b/mqbconfig/_legacy/lsq_mypro/COCO/fasterrcnn/res50_fpn/quant_config_w4a4.yaml @@ -0,0 +1,73 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, roi_heads, rpn, single_head, + anchor_generator, postprocess, assign_targets_to_anchors, compute_loss, box_coder, fg_bg_sampler, + proposal_matcher, select_training_samples, box_roi_pool] # 还得包括一些rpn、roi的子函数 + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: COCO + data_path: ../COCO + num_classes: 81 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: XXX + batch_size: 8 + start_epoch: 0 + epochs: 25 + workers: 8 + lr: 0.001 + lr_steps: [8, 14, 19, 22] + lr_gamma: 0.4 + momentum: 0.9 + weight_decay: 0.00006 + print_freq: 800 + my_buff_flag: True + qloss_flag: True + pretrained_flag: True + +misc: + model: fasterrcnn_res50_fpn # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ_MyPro/COCO_FasterRCNN_Res50_FPN_bat16_usebase_w4a4 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq_mypro/COCO/fasterrcnn/res50_fpn/quant_config_w8a8.yaml b/mqbconfig/_legacy/lsq_mypro/COCO/fasterrcnn/res50_fpn/quant_config_w8a8.yaml new file mode 100644 index 0000000..ea06c82 --- /dev/null +++ b/mqbconfig/_legacy/lsq_mypro/COCO/fasterrcnn/res50_fpn/quant_config_w8a8.yaml @@ -0,0 +1,73 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 8 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 8 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, roi_heads, rpn, single_head, + anchor_generator, postprocess, assign_targets_to_anchors, compute_loss, box_coder, fg_bg_sampler, + proposal_matcher, select_training_samples, box_roi_pool] # 还得包括一些rpn、roi的子函数 + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: COCO + data_path: ../COCO + num_classes: 81 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: XXX + batch_size: 8 + start_epoch: 0 + epochs: 25 + workers: 8 + lr: 0.0008 + lr_steps: [8, 14, 19, 22] + lr_gamma: 0.4 + momentum: 0.9 + weight_decay: 0.00006 + print_freq: 800 + my_buff_flag: True + qloss_flag: True + pretrained_flag: True + +misc: + model: fasterrcnn_res50_fpn # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ/COCO_FasterRCNN_Res50_FPN_bat16_usebase_w8a8 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq_mypro/COCO/retinanet/res50/quant_config_w4a4.yaml b/mqbconfig/_legacy/lsq_mypro/COCO/retinanet/res50/quant_config_w4a4.yaml new file mode 100644 index 0000000..2bf90c5 --- /dev/null +++ b/mqbconfig/_legacy/lsq_mypro/COCO/retinanet/res50/quant_config_w4a4.yaml @@ -0,0 +1,72 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, anchor_generator, compute_loss, postprocess_detections] + # anchor_generator + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: COCO + data_path: ../COCO + num_classes: 81 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: + batch_size: 8 + start_epoch: 0 + epochs: 25 + workers: 8 + lr: 0.004 + lr_steps: [8, 14, 19, 22] + lr_gamma: 0.4 + momentum: 0.9 + weight_decay: 0.00008 + print_freq: 100 + my_buff_flag: True + qloss_flag: True + pretrained_flag: True + +misc: + model: retinanet_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/COCO_RetinaNet_Res50_bat16_usebase_w4a4 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq_mypro/COCO/retinanet/res50/quant_config_w8a8.yaml b/mqbconfig/_legacy/lsq_mypro/COCO/retinanet/res50/quant_config_w8a8.yaml new file mode 100644 index 0000000..c4d7e53 --- /dev/null +++ b/mqbconfig/_legacy/lsq_mypro/COCO/retinanet/res50/quant_config_w8a8.yaml @@ -0,0 +1,72 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 8 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 8 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, anchor_generator, compute_loss, postprocess_detections] + # anchor_generator + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: COCO + data_path: ../COCO + num_classes: 81 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: + batch_size: 8 + start_epoch: 0 + epochs: 25 + workers: 8 + lr: 0.004 + lr_steps: [8, 14, 19, 22] + lr_gamma: 0.4 + momentum: 0.9 + weight_decay: 0.00008 + print_freq: 100 + my_buff_flag: True + qloss_flag: True + pretrained_flag: True + +misc: + model: retinanet_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/COCO_RetinaNet_Res50_bat16_usebase_w8a8 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq_mypro/COCO/ssd300/ssd_quant_config_w4a4.yaml b/mqbconfig/_legacy/lsq_mypro/COCO/ssd300/ssd_quant_config_w4a4.yaml new file mode 100644 index 0000000..45683a3 --- /dev/null +++ b/mqbconfig/_legacy/lsq_mypro/COCO/ssd300/ssd_quant_config_w4a4.yaml @@ -0,0 +1,69 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [compute_loss, postprocess] + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: COCO # VOC2012 VOC2007 VOC0712 COCO + data_path: ../COCO + num_classes: 81 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: save_weights/ORI/COCO_SSD300_Res50_bat128/model-12.pth + batch_size: 16 + start_epoch: 0 + epochs: 16 + workers: 8 + lr: 0.001 + lr_steps: [5, 11] + lr_gamma: 0.1 + momentum: 0.9 + weight_decay: 0.00008 + print_freq: 1600 + my_buff_flag: True + qloss_flag: True + pretrained_flag: True + +misc: + model: ssd300_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ_MyPro/COCO_ssd300_Res50_bat32_usebase_w4a4 + resume: + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq_mypro/COCO/ssd300/ssd_quant_config_w4a4_onlyQL.yaml b/mqbconfig/_legacy/lsq_mypro/COCO/ssd300/ssd_quant_config_w4a4_onlyQL.yaml new file mode 100644 index 0000000..5fac7f8 --- /dev/null +++ b/mqbconfig/_legacy/lsq_mypro/COCO/ssd300/ssd_quant_config_w4a4_onlyQL.yaml @@ -0,0 +1,69 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [compute_loss, postprocess] + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: COCO # VOC2012 VOC2007 VOC0712 COCO + data_path: ../COCO + num_classes: 81 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: save_weights/ORI/COCO_SSD300_Res50_bat128/model-12.pth + batch_size: 16 + start_epoch: 0 + epochs: 16 + workers: 8 + lr: 0.001 + lr_steps: [6, 13] + lr_gamma: 0.1 + momentum: 0.9 + weight_decay: 0.0001 + print_freq: 1000 + my_buff_flag: False + qloss_flag: True + pretrained_flag: True + +misc: + model: ssd300_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ_MyPro/COCO_ssd300_Res50_bat72_usebase_w4a4_onlyQL + resume: + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq_mypro/VOC0712/fasterrcnn/mbnv2/quant_config_w4a4.yaml b/mqbconfig/_legacy/lsq_mypro/VOC0712/fasterrcnn/mbnv2/quant_config_w4a4.yaml new file mode 100644 index 0000000..faeaefd --- /dev/null +++ b/mqbconfig/_legacy/lsq_mypro/VOC0712/fasterrcnn/mbnv2/quant_config_w4a4.yaml @@ -0,0 +1,73 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, roi_heads, rpn, single_head, + anchor_generator, postprocess, assign_targets_to_anchors, compute_loss, box_coder, fg_bg_sampler, + proposal_matcher, select_training_samples, box_roi_pool] # 还得包括一些rpn、roi的子函数 + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: save_weights/ORI/VOC_FasterRCNN_MBNv2_bat24/model-20.pth + batch_size: 5 + start_epoch: 0 + epochs: 18 + workers: 8 + lr: 0.001 + lr_steps: [7, 14] + lr_gamma: 0.1 + momentum: 0.9 + weight_decay: 0.0001 + print_freq: 1600 + my_buff_flag: True + qloss_flag: True + pretrained_flag: True + +misc: + model: fasterrcnn_mbnv2 # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ_MyPro/VOC_FasterRCNN_MBNv2_bat10_usebase_w4a4 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq_mypro/VOC0712/fasterrcnn/mbnv2/quant_config_w8a8.yaml b/mqbconfig/_legacy/lsq_mypro/VOC0712/fasterrcnn/mbnv2/quant_config_w8a8.yaml new file mode 100644 index 0000000..a7a7a16 --- /dev/null +++ b/mqbconfig/_legacy/lsq_mypro/VOC0712/fasterrcnn/mbnv2/quant_config_w8a8.yaml @@ -0,0 +1,73 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 8 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 8 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, roi_heads, rpn, single_head, + anchor_generator, postprocess, assign_targets_to_anchors, compute_loss, box_coder, fg_bg_sampler, + proposal_matcher, select_training_samples, box_roi_pool] # 还得包括一些rpn、roi的子函数 + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: XXX + batch_size: 8 + start_epoch: 0 + epochs: 25 + workers: 8 + lr: 0.0008 + lr_steps: [8, 14, 19, 22] + lr_gamma: 0.4 + momentum: 0.9 + weight_decay: 0.00006 + print_freq: 800 + my_buff_flag: True + qloss_flag: True + pretrained_flag: True + +misc: + model: fasterrcnn_mbnv2 # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ/VOC_FasterRCNN_MBNv2_bat16_usebase_w8a8 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq_mypro/VOC0712/fasterrcnn/res50_fpn/quant_config_w4a4.yaml b/mqbconfig/_legacy/lsq_mypro/VOC0712/fasterrcnn/res50_fpn/quant_config_w4a4.yaml new file mode 100644 index 0000000..11d0b4b --- /dev/null +++ b/mqbconfig/_legacy/lsq_mypro/VOC0712/fasterrcnn/res50_fpn/quant_config_w4a4.yaml @@ -0,0 +1,73 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, roi_heads, rpn, single_head, + anchor_generator, postprocess, assign_targets_to_anchors, compute_loss, box_coder, fg_bg_sampler, + proposal_matcher, select_training_samples, box_roi_pool] # 还得包括一些rpn、roi的子函数 + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: XXX + batch_size: 8 + start_epoch: 0 + epochs: 25 + workers: 8 + lr: 0.001 + lr_steps: [8, 14, 19, 22] + lr_gamma: 0.4 + momentum: 0.9 + weight_decay: 0.00006 + print_freq: 800 + my_buff_flag: True + qloss_flag: True + pretrained_flag: True + +misc: + model: fasterrcnn_res50_fpn # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ/VOC_FasterRCNN_Res50_FPN_bat16_usebase_w4a4 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq_mypro/VOC0712/fasterrcnn/res50_fpn/quant_config_w8a8.yaml b/mqbconfig/_legacy/lsq_mypro/VOC0712/fasterrcnn/res50_fpn/quant_config_w8a8.yaml new file mode 100644 index 0000000..586763f --- /dev/null +++ b/mqbconfig/_legacy/lsq_mypro/VOC0712/fasterrcnn/res50_fpn/quant_config_w8a8.yaml @@ -0,0 +1,73 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 8 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 8 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, roi_heads, rpn, single_head, + anchor_generator, postprocess, assign_targets_to_anchors, compute_loss, box_coder, fg_bg_sampler, + proposal_matcher, select_training_samples, box_roi_pool] # 还得包括一些rpn、roi的子函数 + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: XXX + batch_size: 8 + start_epoch: 0 + epochs: 25 + workers: 8 + lr: 0.0008 + lr_steps: [8, 14, 19, 22] + lr_gamma: 0.4 + momentum: 0.9 + weight_decay: 0.00006 + print_freq: 800 + my_buff_flag: True + qloss_flag: True + pretrained_flag: True + +misc: + model: fasterrcnn_res50_fpn # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ/VOC_FasterRCNN_Res50_FPN_bat16_usebase_w8a8 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq_mypro/VOC0712/retinanet/res18/quant_config_w4a4.yaml b/mqbconfig/_legacy/lsq_mypro/VOC0712/retinanet/res18/quant_config_w4a4.yaml new file mode 100644 index 0000000..4918eec --- /dev/null +++ b/mqbconfig/_legacy/lsq_mypro/VOC0712/retinanet/res18/quant_config_w4a4.yaml @@ -0,0 +1,72 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, anchor_generator, compute_loss, postprocess_detections] + # anchor_generator + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: save_weights/ORI/VOC_Retinanet_Res18_bat32/model-29.pth + batch_size: 8 + start_epoch: 0 + epochs: 20 + workers: 8 + lr: 0.001 + lr_steps: [6, 13, 18] + lr_gamma: 0.1 + momentum: 0.9 + weight_decay: 0.00008 + print_freq: 1600 + my_buff_flag: True + qloss_flag: True + pretrained_flag: True + +misc: + model: retinanet_res18 # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ_MyPro/VOC_RetinaNet_Res18_bat16_usebase_w4a4 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq_mypro/VOC0712/retinanet/res18/quant_config_w8a8.yaml b/mqbconfig/_legacy/lsq_mypro/VOC0712/retinanet/res18/quant_config_w8a8.yaml new file mode 100644 index 0000000..aa18c99 --- /dev/null +++ b/mqbconfig/_legacy/lsq_mypro/VOC0712/retinanet/res18/quant_config_w8a8.yaml @@ -0,0 +1,72 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 8 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 8 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, anchor_generator, compute_loss, postprocess_detections] + # anchor_generator + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: + batch_size: 8 + start_epoch: 0 + epochs: 25 + workers: 8 + lr: 0.004 + lr_steps: [8, 14, 19, 22] + lr_gamma: 0.4 + momentum: 0.9 + weight_decay: 0.00008 + print_freq: 100 + my_buff_flag: True + qloss_flag: True + pretrained_flag: True + +misc: + model: retinanet_res18 # retinanet/ssd300 + output_dir: save_weights/QAT/VOC_RetinaNet_Res18_bat16_usebase_w8a8 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq_mypro/VOC0712/retinanet/res50/quant_config_w4a4.yaml b/mqbconfig/_legacy/lsq_mypro/VOC0712/retinanet/res50/quant_config_w4a4.yaml new file mode 100644 index 0000000..1d7cef7 --- /dev/null +++ b/mqbconfig/_legacy/lsq_mypro/VOC0712/retinanet/res50/quant_config_w4a4.yaml @@ -0,0 +1,72 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, anchor_generator, compute_loss, postprocess_detections] + # anchor_generator + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: + batch_size: 8 + start_epoch: 0 + epochs: 25 + workers: 8 + lr: 0.004 + lr_steps: [8, 14, 19, 22] + lr_gamma: 0.4 + momentum: 0.9 + weight_decay: 0.00008 + print_freq: 100 + my_buff_flag: True + qloss_flag: True + pretrained_flag: True + +misc: + model: retinanet_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/VOC_RetinaNet_Res50_bat16_usebase_w4a4 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq_mypro/VOC0712/retinanet/res50/quant_config_w8a8.yaml b/mqbconfig/_legacy/lsq_mypro/VOC0712/retinanet/res50/quant_config_w8a8.yaml new file mode 100644 index 0000000..79107a7 --- /dev/null +++ b/mqbconfig/_legacy/lsq_mypro/VOC0712/retinanet/res50/quant_config_w8a8.yaml @@ -0,0 +1,72 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 8 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 8 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [transform, anchor_generator, compute_loss, postprocess_detections] + # anchor_generator + # compute_loss + # postprocess_detections + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: + batch_size: 8 + start_epoch: 0 + epochs: 25 + workers: 8 + lr: 0.004 + lr_steps: [8, 14, 19, 22] + lr_gamma: 0.4 + momentum: 0.9 + weight_decay: 0.00008 + print_freq: 100 + my_buff_flag: False + qloss_flag: False + pretrained_flag: True + +misc: + model: retinanet_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/VOC_RetinaNet_Res50_bat16_usebase_w8a8 + resume: # 注意一下这个 + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq_mypro/VOC0712/ssd300/ssd_quant_config_w2a2.yaml b/mqbconfig/_legacy/lsq_mypro/VOC0712/ssd300/ssd_quant_config_w2a2.yaml new file mode 100644 index 0000000..54f3250 --- /dev/null +++ b/mqbconfig/_legacy/lsq_mypro/VOC0712/ssd300/ssd_quant_config_w2a2.yaml @@ -0,0 +1,69 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 2 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 2 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [compute_loss, postprocess] + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 # VOC2012 VOC2007 VOC0712 COCO + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: save_weights/ORI/VOC_SSD300_Res50_bat128/model-9.pth + batch_size: 16 + start_epoch: 0 + epochs: 16 + workers: 8 + lr: 0.001 + lr_steps: [6] + lr_gamma: 0.1 + momentum: 0.9 + weight_decay: 0.0001 + print_freq: 850 + my_buff_flag: True + qloss_flag: True + pretrained_flag: True + +misc: + model: ssd300_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ_MyPro/VOC_ssd300_Res50_bat32_usebase_w4a4 + resume: + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq_mypro/VOC0712/ssd300/ssd_quant_config_w4a4.yaml b/mqbconfig/_legacy/lsq_mypro/VOC0712/ssd300/ssd_quant_config_w4a4.yaml new file mode 100644 index 0000000..827a9de --- /dev/null +++ b/mqbconfig/_legacy/lsq_mypro/VOC0712/ssd300/ssd_quant_config_w4a4.yaml @@ -0,0 +1,69 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [compute_loss, postprocess] + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 # VOC2012 VOC2007 VOC0712 COCO + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: save_weights/ORI/VOC_SSD300_Res50_bat128/model-9.pth + batch_size: 16 + start_epoch: 0 + epochs: 20 + workers: 8 + lr: 0.001 + lr_steps: [6, 13, 18] + lr_gamma: 0.1 + momentum: 0.9 + weight_decay: 0.00001 + print_freq: 850 + my_buff_flag: True + qloss_flag: True + pretrained_flag: True + +misc: + model: ssd300_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ_MyPro/VOC_ssd300_Res50_bat32_usebase_w4a4 + resume: + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq_mypro/VOC0712/ssd300/ssd_quant_config_w4a4_noQL.yaml b/mqbconfig/_legacy/lsq_mypro/VOC0712/ssd300/ssd_quant_config_w4a4_noQL.yaml new file mode 100644 index 0000000..f536630 --- /dev/null +++ b/mqbconfig/_legacy/lsq_mypro/VOC0712/ssd300/ssd_quant_config_w4a4_noQL.yaml @@ -0,0 +1,69 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [compute_loss, postprocess] + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 # VOC2012 VOC2007 VOC0712 COCO + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: save_weights/ORI/VOC_SSD300_Res50_bat128/model-9.pth + batch_size: 16 + start_epoch: 0 + epochs: 16 + workers: 8 + lr: 0.001 + lr_steps: [6, 13] + lr_gamma: 0.1 + momentum: 0.9 + weight_decay: 0.0001 + print_freq: 850 + my_buff_flag: True + qloss_flag: False + pretrained_flag: True + +misc: + model: ssd300_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ_MyPro/VOC_ssd300_Res50_bat32_usebase_w4a4_noQL + resume: + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq_mypro/VOC0712/ssd300/ssd_quant_config_w4a4_only_QL.yaml b/mqbconfig/_legacy/lsq_mypro/VOC0712/ssd300/ssd_quant_config_w4a4_only_QL.yaml new file mode 100644 index 0000000..c2ebc4a --- /dev/null +++ b/mqbconfig/_legacy/lsq_mypro/VOC0712/ssd300/ssd_quant_config_w4a4_only_QL.yaml @@ -0,0 +1,69 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [compute_loss, postprocess] + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 # VOC2012 VOC2007 VOC0712 COCO + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: save_weights/ORI/VOC_SSD300_Res50_bat128/model-9.pth + batch_size: 16 + start_epoch: 0 + epochs: 16 + workers: 8 + lr: 0.001 + lr_steps: [6, 13] + lr_gamma: 0.1 + momentum: 0.9 + weight_decay: 0.0001 + print_freq: 850 + my_buff_flag: False + qloss_flag: True + pretrained_flag: True + +misc: + model: ssd300_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ_MyPro/VOC_ssd300_Res50_bat32_usebase_w4a4_only_QL + resume: + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq_mypro/VOC0712/ssd300/ssd_quant_config_w8a8.yaml b/mqbconfig/_legacy/lsq_mypro/VOC0712/ssd300/ssd_quant_config_w8a8.yaml new file mode 100644 index 0000000..550b59d --- /dev/null +++ b/mqbconfig/_legacy/lsq_mypro/VOC0712/ssd300/ssd_quant_config_w8a8.yaml @@ -0,0 +1,69 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 8 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 8 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [compute_loss, postprocess] + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 # VOC2012 VOC2007 VOC0712 COCO + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: save_weights/ORI/VOC_SSD300_Res50_bat128/model-9.pth + batch_size: 16 + start_epoch: 0 + epochs: 8 + workers: 8 + lr: 0.0001 + lr_steps: [7] + lr_gamma: 0.1 + momentum: 0.9 + weight_decay: 0.0001 + print_freq: 850 + my_buff_flag: True + qloss_flag: True + pretrained_flag: True + +misc: + model: ssd300_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ_MyPro/VOC_ssd300_Res50_bat32_usebase_w8a8 + resume: + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/lsq_mypro/VOC0712/ssd300/ssd_quant_config_w8a8_brutal.yaml b/mqbconfig/_legacy/lsq_mypro/VOC0712/ssd300/ssd_quant_config_w8a8_brutal.yaml new file mode 100644 index 0000000..fff7c51 --- /dev/null +++ b/mqbconfig/_legacy/lsq_mypro/VOC0712/ssd300/ssd_quant_config_w8a8_brutal.yaml @@ -0,0 +1,69 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 8 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 8 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + preserve_attr: + [compute_loss, postprocess] + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: lsq +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 # VOC2012 VOC2007 VOC0712 COCO + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: save_weights/ORI/VOC_SSD300_Res50_bat128/model-9.pth + batch_size: 16 + start_epoch: 0 + epochs: 8 + workers: 8 + lr: 0.001 + lr_steps: [4] + lr_gamma: 0.1 + momentum: 0.9 + weight_decay: 0.0001 + print_freq: 850 + my_buff_flag: True + qloss_flag: True + pretrained_flag: True + +misc: + model: ssd300_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/LSQ_MyPro/VOC_ssd300_Res50_bat32_usebase_w8a8 + resume: + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/tqt/COCO/ssd300/ssd_quant_config_w4a4.yaml b/mqbconfig/_legacy/tqt/COCO/ssd300/ssd_quant_config_w4a4.yaml new file mode 100644 index 0000000..edfdd02 --- /dev/null +++ b/mqbconfig/_legacy/tqt/COCO/ssd300/ssd_quant_config_w4a4.yaml @@ -0,0 +1,69 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: PoTModeObserver + a_observer: PoTModeObserver + w_fakequantize: TqtFakeQuantize + a_fakequantize: TqtFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + preserve_attr: + [compute_loss, postprocess] + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: tqt +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: COCO # VOC2012 VOC2007 VOC0712 COCO + data_path: ../COCO + num_classes: 81 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: save_weights/ORI/COCO_SSD300_Res50_bat128/model-12.pth + batch_size: 16 + start_epoch: 0 + epochs: 16 + workers: 8 + lr: 0.001 + lr_steps: [5, 11] + lr_gamma: 0.1 + momentum: 0.9 + weight_decay: 0.0001 + print_freq: 1600 + my_buff_flag: False + qloss_flag: False + pretrained_flag: True + +misc: + model: ssd300_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/TQT/COCO_ssd300_Res50_bat32_usebase_w4a4 + resume: + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/tqt/VOC0712/retinanet/res18/quant_config_w4a4.yaml b/mqbconfig/_legacy/tqt/VOC0712/retinanet/res18/quant_config_w4a4.yaml new file mode 100644 index 0000000..c2748c9 --- /dev/null +++ b/mqbconfig/_legacy/tqt/VOC0712/retinanet/res18/quant_config_w4a4.yaml @@ -0,0 +1,69 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: PoTModeObserver + a_observer: PoTModeObserver + w_fakequantize: TqtFakeQuantize + a_fakequantize: TqtFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + preserve_attr: + [transform, anchor_generator, compute_loss, postprocess_detections] + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: tqt +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 # VOC2012 VOC2007 VOC0712 COCO + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: save_weights/ORI/VOC_Retinanet_Res18_bat32/model-29.pth + batch_size: 8 + start_epoch: 0 + epochs: 20 + workers: 8 + lr: 0.001 + lr_steps: [6, 13, 18] + lr_gamma: 0.1 + momentum: 0.9 + weight_decay: 0.0001 + print_freq: 1600 + my_buff_flag: False + qloss_flag: False + pretrained_flag: True + +misc: + model: retinanet_res18 # retinanet/ssd300 + output_dir: save_weights/QAT/TQT/VOC_RetinaNet_Res18_bat16_usebase_w4a4 + resume: + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/tqt/VOC0712/ssd300/ssd_quant_config_w4a4.yaml b/mqbconfig/_legacy/tqt/VOC0712/ssd300/ssd_quant_config_w4a4.yaml new file mode 100644 index 0000000..b340010 --- /dev/null +++ b/mqbconfig/_legacy/tqt/VOC0712/ssd300/ssd_quant_config_w4a4.yaml @@ -0,0 +1,69 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: PoTModeObserver + a_observer: PoTModeObserver + w_fakequantize: TqtFakeQuantize + a_fakequantize: TqtFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + preserve_attr: + [compute_loss, postprocess] + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: tqt +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 # VOC2012 VOC2007 VOC0712 COCO + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: save_weights/ORI/VOC_SSD300_Res50_bat128/model-9.pth + batch_size: 16 + start_epoch: 0 + epochs: 16 + workers: 8 + lr: 0.001 + lr_steps: [6, 12] + lr_gamma: 0.1 + momentum: 0.9 + weight_decay: 0.0001 + print_freq: 850 + my_buff_flag: False + qloss_flag: False + pretrained_flag: True + +misc: + model: ssd300_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/TQT/VOC_ssd300_Res50_bat32_usebase_w4a4 + resume: + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/tqt/quant_config_mypro_w4a4e.yaml b/mqbconfig/_legacy/tqt/quant_config_mypro_w4a4e.yaml new file mode 100644 index 0000000..1d2cba6 --- /dev/null +++ b/mqbconfig/_legacy/tqt/quant_config_mypro_w4a4e.yaml @@ -0,0 +1,31 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: PoTModeObserver + a_observer: PoTModeObserver + w_fakequantize: TqtFakeQuantize + a_fakequantize: TqtFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 256 # 越多越好??似乎是的 + quant_algorithm: tqt + +training: + my_buff_flag: True + qloss_flag: True + fold_bn_flag: False +misc: + resume: False + diff --git a/mqbconfig/_legacy/tqt/quant_config_w4a4.yaml b/mqbconfig/_legacy/tqt/quant_config_w4a4.yaml new file mode 100644 index 0000000..c4b769c --- /dev/null +++ b/mqbconfig/_legacy/tqt/quant_config_w4a4.yaml @@ -0,0 +1,31 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: PoTModeObserver + a_observer: PoTModeObserver + w_fakequantize: TqtFakeQuantize + a_fakequantize: TqtFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 256 # 越多越好??似乎是的 + quant_algorithm: tqt + +training: + my_buff_flag: False + qloss_flag: False + fold_bn_flag: False +misc: + resume: False + diff --git a/mqbconfig/_legacy/tqt_mypro/COCO/ssd300/ssd_quant_config_w4a4.yaml b/mqbconfig/_legacy/tqt_mypro/COCO/ssd300/ssd_quant_config_w4a4.yaml new file mode 100644 index 0000000..21a4b6a --- /dev/null +++ b/mqbconfig/_legacy/tqt_mypro/COCO/ssd300/ssd_quant_config_w4a4.yaml @@ -0,0 +1,69 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: PoTModeObserver + a_observer: PoTModeObserver + w_fakequantize: TqtFakeQuantize + a_fakequantize: TqtFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + preserve_attr: + [compute_loss, postprocess] + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: tqt +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: COCO # VOC2012 VOC2007 VOC0712 COCO + data_path: ../COCO + num_classes: 81 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: save_weights/ORI/COCO_SSD300_Res50_bat128/model-12.pth + batch_size: 16 + start_epoch: 0 + epochs: 16 + workers: 8 + lr: 0.001 + lr_steps: [5, 11] + lr_gamma: 0.1 + momentum: 0.9 + weight_decay: 0.0001 + print_freq: 1600 + my_buff_flag: True + qloss_flag: True + pretrained_flag: True + +misc: + model: ssd300_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/TQT_MyPro/COCO_ssd300_Res50_bat32_usebase_w4a4 + resume: + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/tqt_mypro/VOC0712/retinanet/res18/quant_config_w4a4.yaml b/mqbconfig/_legacy/tqt_mypro/VOC0712/retinanet/res18/quant_config_w4a4.yaml new file mode 100644 index 0000000..74372f5 --- /dev/null +++ b/mqbconfig/_legacy/tqt_mypro/VOC0712/retinanet/res18/quant_config_w4a4.yaml @@ -0,0 +1,69 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: PoTModeObserver + a_observer: PoTModeObserver + w_fakequantize: TqtFakeQuantize + a_fakequantize: TqtFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + preserve_attr: + [transform, anchor_generator, compute_loss, postprocess_detections] + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: tqt +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 # VOC2012 VOC2007 VOC0712 COCO + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: save_weights/ORI/VOC_Retinanet_Res18_bat32/model-29.pth + batch_size: 8 + start_epoch: 0 + epochs: 20 + workers: 8 + lr: 0.001 + lr_steps: [6, 13, 18] + lr_gamma: 0.1 + momentum: 0.9 + weight_decay: 0.0001 + print_freq: 1600 + my_buff_flag: True + qloss_flag: True + pretrained_flag: True + +misc: + model: retinanet_res18 # retinanet/ssd300 + output_dir: save_weights/QAT/TQT_MyPro/VOC_RetinaNet_Res18_bat16_usebase_w4a4 + resume: + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/_legacy/tqt_mypro/VOC0712/ssd300/ssd_quant_config_w4a4.yaml b/mqbconfig/_legacy/tqt_mypro/VOC0712/ssd300/ssd_quant_config_w4a4.yaml new file mode 100644 index 0000000..e565ba6 --- /dev/null +++ b/mqbconfig/_legacy/tqt_mypro/VOC0712/ssd300/ssd_quant_config_w4a4.yaml @@ -0,0 +1,69 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: PoTModeObserver + a_observer: PoTModeObserver + w_fakequantize: TqtFakeQuantize + a_fakequantize: TqtFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + preserve_attr: + [compute_loss, postprocess] + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 64 # 越多越好??似乎是的 + quant_algorithm: tqt +# model: # architecture details +# type: resnet18 # model name +# kwargs: +# num_classes: 1000 +# path: /path-of-pretrained +dataset: + type: VOC0712 # VOC2012 VOC2007 VOC0712 COCO + data_path: /workspace/share/datasets/VOC + num_classes: 21 + aspect_ratio_group_factor: 3 + # path: /path-of-imagenet + # batch_size: 64 + # num_workers: 4 + # pin_memory: True + # input_size: 224 + # test_resize: 256 +training: + device: cuda + use_baseline: save_weights/ORI/VOC_SSD300_Res50_bat128/model-9.pth + batch_size: 16 + start_epoch: 0 + epochs: 20 + workers: 8 + lr: 0.001 + lr_steps: [6, 13, 18] + lr_gamma: 0.1 + momentum: 0.9 + weight_decay: 0.0001 + print_freq: 850 + my_buff_flag: True + qloss_flag: True + pretrained_flag: True + +misc: + model: ssd300_res50 # retinanet/ssd300 + output_dir: save_weights/QAT/TQT_MyPro/VOC_ssd300_Res50_bat32_usebase_w4a4 + resume: + amp: False # 混合精度训练 +dist: + world_size: 1 + dist_url: env:// + +process: + seed: 1005 \ No newline at end of file diff --git a/mqbconfig/lsq/quant_config_hardet_w2a2.yaml b/mqbconfig/lsq/quant_config_hardet_w2a2.yaml new file mode 100644 index 0000000..3b8d8a0 --- /dev/null +++ b/mqbconfig/lsq/quant_config_hardet_w2a2.yaml @@ -0,0 +1,32 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 2 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 2 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 256 # 越多越好??似乎是的 + quant_algorithm: lsq + +training: + my_buff_flag: 2 + qloss_flag: True + pretrained_flag: True + fold_bn_flag: False +misc: + resume: False + diff --git a/mqbconfig/lsq/quant_config_hardet_w4a4.yaml b/mqbconfig/lsq/quant_config_hardet_w4a4.yaml new file mode 100644 index 0000000..a06d9ed --- /dev/null +++ b/mqbconfig/lsq/quant_config_hardet_w4a4.yaml @@ -0,0 +1,32 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 256 # 越多越好??似乎是的 + quant_algorithm: lsq + +training: + my_buff_flag: 2 + qloss_flag: False + pretrained_flag: True + fold_bn_flag: False +misc: + resume: False + diff --git a/mqbconfig/lsq/quant_config_hardet_w8a8.yaml b/mqbconfig/lsq/quant_config_hardet_w8a8.yaml new file mode 100644 index 0000000..d46b4be --- /dev/null +++ b/mqbconfig/lsq/quant_config_hardet_w8a8.yaml @@ -0,0 +1,32 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 8 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 8 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 256 # 越多越好??似乎是的 + quant_algorithm: lsq + +training: + my_buff_flag: 2 + qloss_flag: False + pretrained_flag: True + fold_bn_flag: False +misc: + resume: False + diff --git a/mqbconfig/lsq/quant_config_mypro_w2a2.yaml b/mqbconfig/lsq/quant_config_mypro_w2a2.yaml new file mode 100644 index 0000000..b51dc04 --- /dev/null +++ b/mqbconfig/lsq/quant_config_mypro_w2a2.yaml @@ -0,0 +1,32 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 2 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 2 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 256 # 越多越好??似乎是的 + quant_algorithm: lsq + +training: + my_buff_flag: 1 # 重新编码意思 0 为 false; 1 为 hqod; 2 为 hardet + qloss_flag: True + pretrained_flag: True + fold_bn_flag: False +misc: + resume: False + diff --git a/mqbconfig/lsq/quant_config_mypro_w2a2_weight_loose.yaml b/mqbconfig/lsq/quant_config_mypro_w2a2_weight_loose.yaml new file mode 100644 index 0000000..3484830 --- /dev/null +++ b/mqbconfig/lsq/quant_config_mypro_w2a2_weight_loose.yaml @@ -0,0 +1,32 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: LSQObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 2 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 2 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 256 # 越多越好??似乎是的 + quant_algorithm: lsq + +training: + my_buff_flag: 1 # 重新编码意思 0 为 false; 1 为 hqod; 2 为 hardet + qloss_flag: True + pretrained_flag: True + fold_bn_flag: False +misc: + resume: False + diff --git a/mqbconfig/lsq/quant_config_mypro_w4a4.yaml b/mqbconfig/lsq/quant_config_mypro_w4a4.yaml new file mode 100644 index 0000000..2b7e375 --- /dev/null +++ b/mqbconfig/lsq/quant_config_mypro_w4a4.yaml @@ -0,0 +1,32 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 256 # 越多越好??似乎是的 + quant_algorithm: lsq + +training: + my_buff_flag: 1 # 重新编码意思 0 为 false; 1 为 hqod; 2 为 hardet + qloss_flag: True + pretrained_flag: True + fold_bn_flag: False +misc: + resume: False + diff --git a/mqbconfig/lsq/quant_config_mypro_w8a8.yaml b/mqbconfig/lsq/quant_config_mypro_w8a8.yaml new file mode 100644 index 0000000..328b58b --- /dev/null +++ b/mqbconfig/lsq/quant_config_mypro_w8a8.yaml @@ -0,0 +1,32 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 8 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 8 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 256 # 越多越好??似乎是的 + quant_algorithm: lsq + +training: + my_buff_flag: 1 + qloss_flag: True + pretrained_flag: True + fold_bn_flag: False +misc: + resume: False + diff --git a/mqbconfig/lsq/quant_config_w2a2.yaml b/mqbconfig/lsq/quant_config_w2a2.yaml new file mode 100644 index 0000000..6d73e71 --- /dev/null +++ b/mqbconfig/lsq/quant_config_w2a2.yaml @@ -0,0 +1,32 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 2 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False # TODO 这有问题 + pot_scale: False + a_qscheme: + bit: 2 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 256 # 越多越好??似乎是的 + quant_algorithm: lsq + +training: + my_buff_flag: 0 + qloss_flag: True + pretrained_flag: True + fold_bn_flag: False +misc: + resume: False + diff --git a/mqbconfig/lsq/quant_config_w2a2_weight_loose.yaml b/mqbconfig/lsq/quant_config_w2a2_weight_loose.yaml new file mode 100644 index 0000000..fde32d6 --- /dev/null +++ b/mqbconfig/lsq/quant_config_w2a2_weight_loose.yaml @@ -0,0 +1,32 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: LSQObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 2 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False # TODO 这有问题 + pot_scale: False + a_qscheme: + bit: 2 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 256 # 越多越好??似乎是的 + quant_algorithm: lsq + +training: + my_buff_flag: 0 + qloss_flag: True + pretrained_flag: True + fold_bn_flag: False +misc: + resume: False + diff --git a/mqbconfig/lsq/quant_config_w4a4.yaml b/mqbconfig/lsq/quant_config_w4a4.yaml new file mode 100644 index 0000000..5bb1a62 --- /dev/null +++ b/mqbconfig/lsq/quant_config_w4a4.yaml @@ -0,0 +1,32 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 256 # 越多越好??似乎是的 + quant_algorithm: lsq + +training: + my_buff_flag: 0 + qloss_flag: True + pretrained_flag: True + fold_bn_flag: False +misc: + resume: False + diff --git a/mqbconfig/lsq/quant_config_w8a8.yaml b/mqbconfig/lsq/quant_config_w8a8.yaml new file mode 100644 index 0000000..c66f1e2 --- /dev/null +++ b/mqbconfig/lsq/quant_config_w8a8.yaml @@ -0,0 +1,32 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: LearnableFakeQuantize + a_fakequantize: LearnableFakeQuantize + w_qscheme: + bit: 8 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 8 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 256 # 越多越好??似乎是的 + quant_algorithm: lsq + +training: + my_buff_flag: 0 + qloss_flag: False + pretrained_flag: True + fold_bn_flag: False +misc: + resume: False + diff --git a/mqbconfig/pure_hook.yaml b/mqbconfig/pure_hook.yaml new file mode 100644 index 0000000..ab5b9dc --- /dev/null +++ b/mqbconfig/pure_hook.yaml @@ -0,0 +1,32 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: MinMaxObserver + a_observer: EMAMSEObserver + w_fakequantize: PureHooker + a_fakequantize: PureHooker + w_qscheme: + bit: 8 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + a_qscheme: + bit: 8 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: False + +quantize: + quantize_type: pure_hook # support naive_ptq or advanced_ptq + cali_batchnum: 256 # 越多越好??似乎是的 + quant_algorithm: none + +training: + my_buff_flag: 0 + qloss_flag: True + pretrained_flag: True + fold_bn_flag: False +misc: + resume: False + diff --git a/mqbconfig/tqt/quant_config_hardet_w4a4.yaml b/mqbconfig/tqt/quant_config_hardet_w4a4.yaml new file mode 100644 index 0000000..e0069ee --- /dev/null +++ b/mqbconfig/tqt/quant_config_hardet_w4a4.yaml @@ -0,0 +1,32 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: PoTModeObserver + a_observer: PoTModeObserver + w_fakequantize: TqtFakeQuantize + a_fakequantize: TqtFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 256 # 越多越好??似乎是的 + quant_algorithm: tqt + +training: + my_buff_flag: 2 + qloss_flag: False + pretrained_flag: True + fold_bn_flag: True +misc: + resume: False + diff --git a/mqbconfig/tqt/quant_config_mypro_w2a2.yaml b/mqbconfig/tqt/quant_config_mypro_w2a2.yaml new file mode 100644 index 0000000..60e60e7 --- /dev/null +++ b/mqbconfig/tqt/quant_config_mypro_w2a2.yaml @@ -0,0 +1,32 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: PoTModeObserver + a_observer: PoTModeObserver + w_fakequantize: TqtFakeQuantize + a_fakequantize: TqtFakeQuantize + w_qscheme: + bit: 2 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + a_qscheme: + bit: 2 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 256 # 越多越好??似乎是的 + quant_algorithm: tqt + +training: + my_buff_flag: 1 # 重新编码意思 0 为 false; 1 为 hqod; 2 为 hardet + qloss_flag: True + pretrained_flag: True + fold_bn_flag: False +misc: + resume: False + diff --git a/mqbconfig/tqt/quant_config_mypro_w4a4.yaml b/mqbconfig/tqt/quant_config_mypro_w4a4.yaml new file mode 100644 index 0000000..6534c38 --- /dev/null +++ b/mqbconfig/tqt/quant_config_mypro_w4a4.yaml @@ -0,0 +1,32 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: PoTModeObserver + a_observer: PoTModeObserver + w_fakequantize: TqtFakeQuantize + a_fakequantize: TqtFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 256 # 越多越好??似乎是的 + quant_algorithm: tqt + +training: + my_buff_flag: 1 # 重新编码意思 0 为 false; 1 为 hqod; 2 为 hardet + qloss_flag: True + pretrained_flag: True + fold_bn_flag: False +misc: + resume: False + diff --git a/mqbconfig/tqt/quant_config_mypro_w8a8.yaml b/mqbconfig/tqt/quant_config_mypro_w8a8.yaml new file mode 100644 index 0000000..60e60e7 --- /dev/null +++ b/mqbconfig/tqt/quant_config_mypro_w8a8.yaml @@ -0,0 +1,32 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: PoTModeObserver + a_observer: PoTModeObserver + w_fakequantize: TqtFakeQuantize + a_fakequantize: TqtFakeQuantize + w_qscheme: + bit: 2 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + a_qscheme: + bit: 2 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 256 # 越多越好??似乎是的 + quant_algorithm: tqt + +training: + my_buff_flag: 1 # 重新编码意思 0 为 false; 1 为 hqod; 2 为 hardet + qloss_flag: True + pretrained_flag: True + fold_bn_flag: False +misc: + resume: False + diff --git a/mqbconfig/tqt/quant_config_w2a2.yaml b/mqbconfig/tqt/quant_config_w2a2.yaml new file mode 100644 index 0000000..abd2c28 --- /dev/null +++ b/mqbconfig/tqt/quant_config_w2a2.yaml @@ -0,0 +1,32 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: PoTModeObserver + a_observer: PoTModeObserver + w_fakequantize: TqtFakeQuantize + a_fakequantize: TqtFakeQuantize + w_qscheme: + bit: 2 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + a_qscheme: + bit: 2 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 256 # 越多越好??似乎是的 + quant_algorithm: tqt + +training: + my_buff_flag: 0 + qloss_flag: False + pretrained_flag: True + fold_bn_flag: False +misc: + resume: False + diff --git a/mqbconfig/tqt/quant_config_w4a4.yaml b/mqbconfig/tqt/quant_config_w4a4.yaml new file mode 100644 index 0000000..93d70b6 --- /dev/null +++ b/mqbconfig/tqt/quant_config_w4a4.yaml @@ -0,0 +1,32 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: PoTModeObserver + a_observer: PoTModeObserver + w_fakequantize: TqtFakeQuantize + a_fakequantize: TqtFakeQuantize + w_qscheme: + bit: 4 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + a_qscheme: + bit: 4 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 256 # 越多越好??似乎是的 + quant_algorithm: tqt + +training: + my_buff_flag: 0 + qloss_flag: False + pretrained_flag: True + fold_bn_flag: False +misc: + resume: False + diff --git a/mqbconfig/tqt/quant_config_w8a8.yaml b/mqbconfig/tqt/quant_config_w8a8.yaml new file mode 100644 index 0000000..313d3f4 --- /dev/null +++ b/mqbconfig/tqt/quant_config_w8a8.yaml @@ -0,0 +1,32 @@ +extra_prepare_dict: + extra_qconfig_dict: + w_observer: PoTModeObserver + a_observer: PoTModeObserver + w_fakequantize: TqtFakeQuantize + a_fakequantize: TqtFakeQuantize + w_qscheme: + bit: 8 + symmetry: True + sign: True # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + a_qscheme: + bit: 8 + symmetry: True + sign: False # MQB就缺个这个,整蒙了 + per_channel: False + pot_scale: True + +quantize: + quantize_type: naive_ptq # support naive_ptq or advanced_ptq + cali_batchnum: 256 # 越多越好??似乎是的 + quant_algorithm: tqt + +training: + my_buff_flag: 0 + qloss_flag: False + pretrained_flag: True + fold_bn_flag: False +misc: + resume: False + diff --git a/mqbench/__init__.py b/mqbench/__init__.py new file mode 100644 index 0000000..fa9c4ec --- /dev/null +++ b/mqbench/__init__.py @@ -0,0 +1 @@ +__version__ = '0.0.6' diff --git a/mqbench/advanced_ptq.py b/mqbench/advanced_ptq.py new file mode 100644 index 0000000..f9ede72 --- /dev/null +++ b/mqbench/advanced_ptq.py @@ -0,0 +1,676 @@ +import torch +import torch.nn.intrinsic.qat as nniqat +from torch.fx import GraphModule, Node +from torch import fx, nn +from torch.nn import Module + +USE_LINK = False +USE_DDP = False + +__all__ = ['ptq_reconstruction'] + +try: + import spring.linklink as link + if not link.is_initialized(): + link.initialize() + USE_LINK = True +except (ModuleNotFoundError, AssertionError): + import torch.distributed as dist + if torch.distributed.is_initialized(): + USE_DDP = True + +import numpy as np +from typing import List + +from mqbench.utils.logger import logger +from mqbench.utils.hook import DataSaverHook, StopForwardException +from mqbench.utils import deepcopy_graphmodule, deepcopy_mixedmodule, topology_order, getitem2node +from mqbench.utils.utils import _fix_succ_recursivly +from mqbench.utils.state import enable_quantization, disable_all +import mqbench.nn.intrinsic.qat as qnniqat + +_ADAROUND_SUPPORT_TYPE = (torch.nn.Conv2d, torch.nn.Linear) +_FUSED_TYPE = (nniqat.ConvBnReLU2d, nniqat.ConvBn2d, qnniqat.ConvFreezebn2d, qnniqat.ConvFreezebnReLU2d) +_WEIGHTS_MODULE_TYPE = (torch.nn.Conv2d, torch.nn.Linear) + +def node2modules(name2modules, nodes): + modules = dict() + for node in nodes: + if node.target in name2modules: + modules[node] = name2modules[node.target] + return modules + + +def qnode2fpnode(quant_modules, fp32_modules): + quant_named_nodes = {node.target: node for node in quant_modules} + fp32_named_nodes = {node.target: node for node in fp32_modules} + qnode2fpnode_dict = {quant_named_nodes[key]: fp32_named_nodes[key] for key in quant_named_nodes} + return qnode2fpnode_dict + +def layer_has_weights(nodes, modules): + has_weights = False + for node in nodes: + if node in modules: + if isinstance(modules[node], _WEIGHTS_MODULE_TYPE): + has_weights = True + break + return has_weights + + +def lp_loss(pred, tgt, p=2.0): + """ + loss function measured in L_p Norm + """ + return (pred - tgt).abs().pow(p).sum(1).mean() + + +def to_device(data, device='cpu'): + if isinstance(data, torch.Tensor): + return data.to(device) + elif isinstance(data, dict): + for key in data: + data[key] = to_device(data[key], device) + return data + elif isinstance(data, list): + for idx, _ in enumerate(data): + data[idx] = to_device(data[idx], device) + return data + else: + return data + + +def tensor_detach(data): + if isinstance(data, torch.Tensor): + return data.detach() + elif isinstance(data, dict): + for key in data: + data[key] = tensor_detach(data[key]) + return data + elif isinstance(data, list): + data = [tensor_detach(dat) for dat in data] + else: + return data + + +def save_inp_oup_data(model: GraphModule, inp_module: Module, oup_module: Module, cali_data: list, store_inp=True, store_oup=True, + keep_gpu: bool = True): + """ + Save input data and output data of a particular layer/block over calibration dataset. + :param fp_model: fp_model + :param quant_model: quant_model + :param cali_data: calibration data set + :param keep_gpu: put saved data on GPU for faster optimization + :return: input and output data + """ + device = next(model.parameters()).device + if store_inp: + assert inp_module is not None + inp_saver = DataSaverHook(store_input=store_inp, store_output=False, stop_forward=(not store_oup)) + inp_handle = inp_module.register_forward_hook(inp_saver) + if store_oup: + assert oup_module is not None + oup_saver = DataSaverHook(store_input=False, store_output=store_oup, stop_forward=True) + oup_handle = oup_module.register_forward_hook(oup_saver) + cached = ([], []) + with torch.no_grad(): + for batch in cali_data: + try: + _ = model(to_device(batch, device)) + except StopForwardException: + pass + if store_inp: + if keep_gpu: + cached[0].append([tensor_detach(inp) for inp in inp_saver.input_store]) + else: + cached[0].append([to_device(tensor_detach(inp), 'cpu') for inp in inp_saver.input_store]) # tuple/list one + if store_oup: + if keep_gpu: + cached[1].append(tensor_detach(oup_saver.output_store)) + else: + cached[1].append(to_device(tensor_detach(oup_saver.output_store), 'cpu')) + if store_inp: + inp_handle.remove() + if store_oup: + oup_handle.remove() + torch.cuda.empty_cache() + return cached + + +class LinearTempDecay: + def __init__(self, t_max=10000, warm_up=0.2, start_b=20, end_b=2): + self.t_max = t_max + self.start_decay = warm_up * t_max + self.start_b = start_b + self.end_b = end_b + + def __call__(self, t): + if t < self.start_decay: + return self.start_b + elif t > self.t_max: + return self.end_b + else: + rel_t = (t - self.start_decay) / (self.t_max - self.start_decay) + return self.end_b + (self.start_b - self.end_b) * max(0.0, (1 - rel_t)) + + +class CosineTempDecay: + def __init__(self, t_max=10000, warm_up=0.2, start_b=20, end_b=2): + self.t_max = t_max + self.start_decay = warm_up * t_max + self.start_b = start_b + self.end_b = end_b + + def __call__(self, t): + if t < self.start_decay: + return self.start_b + elif t > self.t_max: + return self.end_b + else: + rel_t = (t - self.start_decay) / (self.t_max - self.start_decay) + return self.end_b + 0.5 * (self.start_b - self.end_b) * (1 + np.cos(rel_t * np.pi)) + + +class LossFunction: + r'''loss function to calculate mse reconstruction loss and relaxation loss + use some tempdecay to balance the two losses. + ''' + def __init__(self, + subgraph: Module, + weight: float = 1., + max_count: int = 10000, + b_range: tuple = (20, 2), + warm_up: float = 0.0, + p: float = 2.): + + self.subgraph = subgraph + self.weight = weight + self.loss_start = max_count * warm_up + self.p = p + + self.temp_decay = LinearTempDecay(max_count, warm_up=warm_up, + start_b=b_range[0], end_b=b_range[1]) + self.count = 0 + + def __call__(self, pred, tgt): + """ + Compute the total loss for adaptive rounding: + rec_loss is the quadratic output reconstruction loss, round_loss is + a regularization term to optimize the rounding policy + + :param pred: output from quantized model + :param tgt: output from FP model + :return: total loss function + """ + self.count += 1 + rec_loss = lp_loss(pred, tgt, p=self.p) + + b = self.temp_decay(self.count) + if self.count < self.loss_start: + round_loss = 0 + else: + round_loss = 0 + for layer in self.subgraph.modules(): + if isinstance(layer, _ADAROUND_SUPPORT_TYPE): + round_vals = layer.weight_fake_quant.rectified_sigmoid() + round_loss += self.weight * (1 - ((round_vals - .5).abs() * 2).pow(b)).sum() + + total_loss = rec_loss + round_loss + if self.count % 500 == 0: + logger.info('Total loss:\t{:.3f} (rec:{:.3f}, round:{:.3f})\tb={:.2f}\tcount={}'.format( + float(total_loss), float(rec_loss), float(round_loss), b, self.count)) + return total_loss + + +def _flatten_args(node): + flattned_args = [] + if isinstance(node, dict): + for v in node.values(): + flattned_args.extend(_flatten_args(v)) + elif isinstance(node, tuple) or isinstance(node, list): + for n in node: + flattned_args.extend(_flatten_args(n)) + else: + flattned_args.extend([node]) + return flattned_args + + +def find_used_times(nodes, target): + used = len([_node for _node in target.users if _node in nodes]) + return used + + + + +def find_cur_node(layer_node_list): + node_list = [] + used_later = [] + for idx, node in enumerate(layer_node_list): + for _node in layer_node_list[idx + 1:]: + if node in _flatten_args(_node.args): + used_later.append(node) + break + not_used_later = [node for node in layer_node_list if node not in used_later] + single_branch = dict() + for node in not_used_later: + single_branch[node] = set([node]) + q = [node] + while True: + now_args = sum([_flatten_args(_node.args) for _node in q], []) + p = [_node for _node in now_args if isinstance(_node, torch.fx.Node) and find_used_times(layer_node_list, _node) == 1] + single_branch[node] = single_branch[node].union(set(p)) + if len(p) == 0: + break + else: + q = p + for node in layer_node_list: + if node.op == 'call_function' or node.op == 'call_method': + continue + if node not in used_later: + break + unwanted = set() + for key in single_branch: + if key is node: + continue + else: + unwanted = unwanted.union(single_branch[key]) + layer_node_list = [_node for _node in layer_node_list if _node not in unwanted] + for _node in layer_node_list: + node_list.append(_node) + if _node is node: + return node_list + + +def subgraph_reconstruction(subgraph, cached_inps, cached_oups, config): + global USE_LINK + global USE_DDP + device = next(subgraph.parameters()).device + w_para, a_para = [], [] + w_opt, w_scheduler = None, None + if hasattr(config, 'scale_lr'): + a_para = [] + for name, layer in subgraph.named_modules(): + if isinstance(layer, _ADAROUND_SUPPORT_TYPE): + weight_quantizer = layer.weight_fake_quant + # assert isinstance(weight_quantizer, adaround_quantizer) is True + weight_quantizer.init(layer.weight.data, config.round_mode) + w_para += [weight_quantizer.alpha] + if isinstance(layer, torch.quantization.FakeQuantizeBase) and 'post_act_fake_quantize' in name: + if hasattr(config, 'scale_lr'): + logger.info('learn the scale for {}'.format(name)) + a_para += [layer.scale] + layer.prob = config.prob + if len(a_para) != 0: + a_opt = torch.optim.Adam(a_para, lr=config.scale_lr) + a_scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(a_opt, T_max=config.max_count, eta_min=0.) + else: + a_opt, a_scheduler = None, None + w_opt = torch.optim.Adam(w_para) + + loss_func = LossFunction(subgraph=subgraph, weight=config.weight, max_count=config.max_count, b_range=config.b_range, + warm_up=config.warm_up) + + if any([USE_DDP, USE_LINK]): + world_size = link.get_world_size() if USE_LINK else dist.get_world_size() + else: + world_size = 1 + + logger.info('The world size is {}.'.format(world_size)) + '''start training''' + logger.info('start tuning by adaround') + if config.prob < 1.0: + # cache inps: drop x args x batch x data + sz = len(cached_inps[0][0]) + num_args = len(cached_inps[0]) + else: + # cache inps: args x batch x data + sz = len(cached_inps[0]) + num_args = len(cached_inps) + for i in range(config.max_count): + idx = np.random.randint(0, sz) + cur_args = [] + for a in range(num_args): + if config.prob < 1.0: + cur_inp = to_device(cached_inps[0][a][idx], device) + cur_sym = to_device(cached_inps[1][a][idx], device) + cur_inp = torch.where(torch.rand_like(cur_inp) < config.prob, cur_inp, cur_sym) + else: + cur_inp = to_device(cached_inps[a][idx], device) + cur_args.append(cur_inp) + cur_args = tuple(cur_args) + cur_out = to_device(cached_oups[idx], device) + if a_opt: + a_opt.zero_grad() + w_opt.zero_grad() + out_quant = subgraph(*cur_args) + err = loss_func(out_quant, cur_out) + err /= world_size + err.backward() + if world_size > 1: + for param in w_para: + if USE_LINK: + link.allreduce(param.grad.data) + elif USE_DDP: + dist.all_reduce(param.grad.data) + w_opt.step() + if a_opt: + a_opt.step() + if w_scheduler: + w_scheduler.step() + if a_scheduler: + a_scheduler.step() + torch.cuda.empty_cache() + for name, layer in subgraph.named_modules(): + if isinstance(layer, _FUSED_TYPE): + # We need to do bn fold simulation here. + weight_quantizer = layer.weight_fake_quant + scale_factor = layer.bn.weight / torch.sqrt(layer.bn.running_var + layer.bn.eps) + merged_rounded_weight = weight_quantizer.get_hard_value( + layer.weight.data * scale_factor.reshape([-1] + [1] * (len(layer.weight.shape) - 1))) + layer.weight.data = merged_rounded_weight / scale_factor.reshape([-1] + [1] * (len(merged_rounded_weight.shape) - 1)) + weight_quantizer.adaround = False + elif isinstance(layer, _ADAROUND_SUPPORT_TYPE): + assert not hasattr(layer, 'bn'), 'Layer {} with type {} has BN ! Should not reach here.'.format(name, type(layer)) + weight_quantizer = layer.weight_fake_quant + layer.weight.data = weight_quantizer.get_hard_value(layer.weight.data) + weight_quantizer.adaround = False + if isinstance(layer, torch.quantization.FakeQuantizeBase) and 'post_act_fake_quantize' in name: + layer.prob = 1.0 # recover to promise that drop activation quantization only occurs at reconstruction phase + + +def extract_subgraph(orig_module: nn.Module, nodes: List[fx.Node], output: fx.Node, g2node: dict): + """ + Given lists of nodes from an existing graph that represent a subgraph, returns a submodule that executes that subgraph. + """ + new_graph = fx.Graph() + env = dict() + inp_lst = [] + for node in nodes: + for arg in _flatten_args(node.args): + if isinstance(arg, torch.fx.Node): + if arg not in nodes and arg not in inp_lst: + inp_lst.append(node) + if node in g2node: + arg_name = g2node[node].name + else: + arg_name = node.name + new_node = new_graph.placeholder(arg_name) + env[node] = new_node + break + for node in nodes: + if node in inp_lst: + continue + if node in g2node: + node = g2node[node] + new_node = new_graph.node_copy(node, lambda x: env[x]) + env[node] = new_node + # create this or there will not be return value + new_graph.output(env[output]) + new_graph.lint() + return fx.GraphModule(orig_module, new_graph) + +def find_num_nodes(nodes): + num = 0 + for node in nodes: + if isinstance(node, Node): + num += 1 + return num + + +# Recommend: log this to check if the layer is right. You can define your own layer manually or automatically like this +# extract the linked-list/single-chain +def extract_layer(node, fp32_modules): + layer_node_list = [] + cur_node = node + is_next_block = False # check whether stoped by a block + while True: + logger.debug('cur_node in layer is {}'.format(cur_node)) + layer_node_list.append(cur_node) # valid node here + stop = (len(cur_node.users) == 0) + for user in cur_node.users: + if user.target == 'update': + continue + if user.op == 'call_module' and isinstance( + fp32_modules[user], _ADAROUND_SUPPORT_TYPE): + stop = True + # TODO: only short-cut here, consider more here + # TODO: can also use un/completed to check here. + if ('add' in user.name + and user.op in ['call_function', 'call_method']): + stop = True + if user.op == 'output': + is_next_block, stop = True, True + if stop: + break + cur_node = list(cur_node.users.keys())[0] + if find_num_nodes(cur_node.users) > 1: + is_next_block = True + return layer_node_list, is_next_block + + +# Recommend: log this to check if the block is right. You can define your own block manually or automatically like this +# extract the block one such as short-cut +def extract_block(input_nodes, fp32_modules, depth=0): + if depth > 2: + # stack 2 or 3 layers for no short-cut structure + return [] + layer_node_list = [] + is_block = False + cnt = dict() + q, p = [], [] # q records the completed node, p records the uncompleted nodes + cur_node = None + for input in input_nodes: + for user in input.users: + if user not in cnt: + cnt[user] = find_num_nodes(user.args) + if cnt[user] > 1: + is_block = True + p.append(user) + cnt[user] -= 1 + if cnt[user] == 0: + q.append(user) + p.remove(user) + while len(q) != 0: + cur_node = q.pop(0) # valid node here + logger.debug('cur node is {}'.format(cur_node)) + if cur_node.target == 'update': + continue + if len(p) == 0 and len(q) == 0: + break + layer_node_list.append(cur_node) + for user in cur_node.users: + if user not in cnt: + cnt[user] = find_num_nodes(user.args) + if cnt[user] > 1: + is_block = True + p.append(user) + cnt[user] -= 1 + if cnt[user] == 0: + q.append(user) + p.remove(user) + logger.debug('uncompleted nodes are {}'.format(p)) + if not cur_node: + return layer_node_list + exp_nodes, is_next_block = extract_layer(cur_node, fp32_modules) + if is_block or is_next_block: + return layer_node_list + exp_nodes + else: + return layer_node_list + exp_nodes + extract_block( + [exp_nodes[-1]], fp32_modules, depth + 1) + + +def ptq_reconstruction(model: GraphModule, cali_data: list, config: dict, graph_module_list: list = None): + r""" + Reconsturction for AdaRound, BRECQ, QDrop. + Basic optimization objective: + + .. math:: + + \mathop{\arg\min}_{\mathbf{V}}\ \ || Wx-\tilde{W}x ||_F^2 + \lambda f_{reg}(\mathbf{V}), + + \tilde{W}=s \cdot clip\left( \left\lfloor\dfrac{W}{s}\right\rfloor+h(\mathbf{V}), n, p \right) + + where :math:`h(\mathbf{V}_{i,j})=clip(\sigma(\mathbf{V}_{i,j})(\zeta-\gamma)+\gamma, 0, 1)`, and :math:`f_{reg}(\mathbf{V})=\mathop{\sum}_{i,j}{1-|2h(\mathbf{V}_{i,j})-1|^\beta}`. By annealing on :math:`\beta`, the rounding mask can adapt freely in initial phase and converge to 0 or 1 in later phase. + + Args: + model (torch.nn.Module): a prepared GraphModule to do PTQ + cali_data (List): a list of calibration tensor + config (dict): a config for PTQ reconstruction + graph_module_list (list): a list of model's children modules which need quantization. if this is used, the model is partial quantized; if not, the model is fully quantized. + + >>> sample config : { + pattern: block (str, Available options are [layer, block].) + scale_lr: 4.0e-5 (learning rate for learning step size of activation) + warm_up: 0.2 (0.2 * max_count iters without regularization to floor or ceil) + weight: 0.01 (loss weight for regularization item) + max_count: 20000 (optimization iteration) + b_range: [20,2] (beta decaying range ) + keep_gpu: True (calibration data restore in gpu or cpu) + round_mode: learned_hard_sigmoid (ways to reconstruct the weight, currently only support learned_hard_sigmoid) + prob: 0.5 (dropping probability of QDROP) + } + + """ + # assert model is on cuda + if not config.keep_gpu: + cali_data = [to_device(inp, 'cpu') for inp in cali_data] + '''set state first''' + + fp32_model = model + fp32_model.eval() + if graph_module_list is None: + assert isinstance(fp32_model, torch.fx.GraphModule) + quant_model = deepcopy_graphmodule(model) + nodes = list(quant_model.graph.nodes) + g2node = getitem2node(quant_model) + fp32_modules = node2modules(dict(fp32_model.named_modules()), fp32_model.graph.nodes) + quant_modules = node2modules(dict(quant_model.named_modules()), quant_model.graph.nodes) + topology_order_by_node = topology_order(quant_model) + else: + quant_model = deepcopy_mixedmodule(model, graph_module_list) + nodes = [] + g2node = dict() + fp32_modules = dict() + quant_modules = dict() + topology_order_by_node = {} + topo_cnt = 0 + for mname in graph_module_list: + child = getattr(quant_model, mname) + assert isinstance(child, torch.fx.GraphModule) + nodes += list(child.graph.nodes) + g2node.update(getitem2node(child)) + for mname in graph_module_list: + fp_child = getattr(fp32_model, mname) + q_child = getattr(quant_model, mname) + # note: the nodes we use is from the quant model, so build q_node2fp_module, rather than fp2fp. + fp_modules = node2modules(dict(fp_child.named_modules()), q_child.graph.nodes) + q_modules = node2modules(dict(q_child.named_modules()), q_child.graph.nodes) + fp32_modules.update(fp_modules) + quant_modules.update(q_modules) + child_topo = topology_order(q_child) + for k in child_topo: + child_topo[k] += topo_cnt + topology_order_by_node.update(child_topo) + topo_cnt += len(topology_order_by_node) + qnode2fpnode_dict = qnode2fpnode(quant_modules, fp32_modules) + quant_model.eval() + disable_all(fp32_model) + enable_quantization(quant_model) + torch.cuda.empty_cache() + checked_nodes = dict() + for node in nodes: + if 'exclude_node_prefix' in config: + cont = False + for prefix in config['exclude_node']: + if node.name.startswith(prefix): + cont = True + break + if cont: + logger.info(f'Exclude node {node}') + continue + if node in checked_nodes: + continue + if node.op == "call_module" and isinstance(quant_modules[node], _ADAROUND_SUPPORT_TYPE): + logger.info('prepare {} reconstruction for {}'.format(config.pattern, node)) + if config.pattern == 'layer': + layer_node_list, _ = extract_layer(node, quant_modules) + elif config.pattern == 'block': + layer_node_list = extract_block(node.all_input_nodes, quant_modules) + else: + raise NotImplementedError + # if the update is not used in the block, remove it + if not all([n.target != 'update' for n in layer_node_list]): + remove_nodes = [] + for idx, n in enumerate(layer_node_list): + if n.target == 'update': + src = n.args[0] + remove = True + for _idx in range(idx + 1, len(layer_node_list)): + if src in _flatten_args( + layer_node_list[_idx].args): + remove = False + break + if remove: + remove_nodes.append(n) + layer_node_list = [n for n in layer_node_list if n not in remove_nodes] + missing_inputs = [] + for _node in layer_node_list: + for arg in _flatten_args(_node.args): + if isinstance(arg, torch.fx.Node): + if arg not in layer_node_list and arg not in missing_inputs: + missing_inputs.append(arg) + layer_node_list.extend(missing_inputs) + # replace getitem nodes into its source node + layer_node_list = [n if n not in g2node else g2node[n] for n in layer_node_list] + for _node in layer_node_list: + src = [arg for arg in _flatten_args(_node.args) if arg in g2node] + for arg in src: + _node.args = _fix_succ_recursivly(_node.args, arg, g2node[arg]) + layer_node_list = sorted(layer_node_list, key=lambda x: topology_order_by_node[x]) + layer_node_list = find_cur_node(layer_node_list) + if layer_has_weights(layer_node_list, quant_modules): + pass + else: + continue + logger.info('the node list is below!') + logger.info(layer_node_list) + fp32_module = fp32_modules[qnode2fpnode_dict[layer_node_list[-1]]] + fp32_all_inps = [] + quant_all_inps = [] + fp32_final_oups = None + out_is_cached = False + for _node in layer_node_list: + if all([arg in layer_node_list for arg in _flatten_args(_node.args) if isinstance(arg, torch.fx.Node)]): + continue + else: + fp32_inp_module = fp32_modules[qnode2fpnode_dict[_node]] + quant_module = quant_modules[_node] + # fp32 inps: [out_b1, out_b2, ...] + _, fp32_inps = save_inp_oup_data(fp32_model, None, fp32_inp_module, cali_data, + store_inp=False, store_oup=(config.prob < 1.0), keep_gpu=config.keep_gpu) + _, fp32_oups = save_inp_oup_data(fp32_model, None, fp32_module, cali_data, + store_inp=False, store_oup=(not out_is_cached), keep_gpu=config.keep_gpu) + _, quant_inps = save_inp_oup_data(quant_model, None, quant_module, cali_data, + store_inp=False, store_oup=True, keep_gpu=config.keep_gpu) + fp32_all_inps.append(fp32_inps) + quant_all_inps.append(quant_inps) + if not out_is_cached: + fp32_final_oups = fp32_oups + out_is_cached = True + cached_inps = (quant_all_inps, fp32_all_inps) if config.prob < 1.0 else quant_all_inps + cached_oups = fp32_final_oups + quant_modules_by_name = dict() + for node in layer_node_list: + if node.op == 'call_module': + quant_modules_by_name[node.target] = quant_modules[node] + subgraph = extract_subgraph(quant_modules_by_name, layer_node_list, + layer_node_list[-1], g2node) + logger.info(subgraph.code) + subgraph_reconstruction(subgraph, cached_inps, cached_oups, config) + for x in layer_node_list: + checked_nodes[x] = True + disable_all(quant_model) + for node in checked_nodes: + if node.op == 'call_module': + enable_quantization(quant_modules[node]) + logger.info(f'set the node {node.target} in quant') + return quant_model diff --git a/mqbench/convert_deploy.py b/mqbench/convert_deploy.py new file mode 100644 index 0000000..c5fdb0b --- /dev/null +++ b/mqbench/convert_deploy.py @@ -0,0 +1,184 @@ +import os.path as osp + +import torch +from torch.fx import GraphModule + +import mqbench.custom_symbolic_opset # noqa: F401 +import mqbench.fusion_method # noqa: F401 +from mqbench.prepare_by_platform import BackendType +from mqbench.utils import deepcopy_graphmodule +from mqbench.utils.logger import logger +from mqbench.utils.registry import ( + BACKEND_DEPLOY_FUNCTION, + register_deploy_function, + FUSED_MODULE_CONVERT_FUNCTION +) +from mqbench.deploy import ( + remove_fakequantize_and_collect_params_nnie, + remove_fakequantize_and_collect_params, + replace_fakequantize_and_collect_params_openvino, + remove_fakequantize_and_collect_params_tengine, + ONNXQLinearPass, ONNXQNNPass +) + +__all__ = ['convert_deploy'] + +@register_deploy_function(BackendType.Tengine_u8) +@register_deploy_function(BackendType.PPLCUDA) +@register_deploy_function(BackendType.ONNX_QNN) +@register_deploy_function(BackendType.SNPE) +@register_deploy_function(BackendType.PPLW8A16) +@register_deploy_function(BackendType.Tensorrt) +@register_deploy_function(BackendType.NNIE) +@register_deploy_function(BackendType.Vitis) +@register_deploy_function(BackendType.OPENVINO) +def convert_merge_bn(model: GraphModule, **kwargs): + logger.info("Merge BN for deploy.") + nodes = list(model.graph.nodes) + modules = dict(model.named_modules()) + for node in nodes: + if node.op == 'call_module': + if type(modules[node.target]) in FUSED_MODULE_CONVERT_FUNCTION: + FUSED_MODULE_CONVERT_FUNCTION[type(modules[node.target])](model, node) + + +@register_deploy_function(BackendType.Academic_NLP) +@register_deploy_function(BackendType.Tensorrt_NLP) +@register_deploy_function(BackendType.Tengine_u8) +@register_deploy_function(BackendType.PPLCUDA) +@register_deploy_function(BackendType.ONNX_QNN) +@register_deploy_function(BackendType.Academic) +@register_deploy_function(BackendType.SNPE) +@register_deploy_function(BackendType.PPLW8A16) +@register_deploy_function(BackendType.Tensorrt) +@register_deploy_function(BackendType.NNIE) +@register_deploy_function(BackendType.Vitis) +@register_deploy_function(BackendType.OPENVINO) +def convert_onnx(model: GraphModule, input_shape_dict, dummy_input, onnx_model_path, **kwargs): + logger.info("Export to onnx.") + output_names = kwargs.get('output_names', []) + dynamic_axes = kwargs.get('dynamic_axes', {}) + input_names = kwargs.get('input_names', []) + if dummy_input is None: + device = next(model.parameters()).device + dummy_input = {name: torch.rand(shape).to(device) for name, shape in input_shape_dict.items()} + input_names = list(dummy_input.keys()) + dummy_input = tuple(dummy_input.values()) + # Per-channel QuantizeLinear and DequantizeLinear is supported since opset 13 + opset_version = 13 if kwargs.get('deploy_to_qlinear', False) else 11 + with torch.no_grad(): + try: + from torch.onnx.utils import ONNXCheckerError + try: + torch.onnx.export(model, dummy_input, onnx_model_path, + input_names=input_names, + output_names=output_names, + opset_version=opset_version, + dynamic_axes=dynamic_axes, + do_constant_folding=True, + custom_opsets={'' : opset_version}) + except ONNXCheckerError: + pass + except ImportError: + torch.onnx.export(model, dummy_input, onnx_model_path, + input_names=input_names, + output_names=output_names, + opset_version=opset_version, + do_constant_folding=True, + custom_opsets={'' : opset_version}, + enable_onnx_checker=False) + + +@register_deploy_function(BackendType.Tensorrt) +def convert_onnx_qlinear(model: GraphModule, onnx_model_path, model_name, **kwargs): + if kwargs.get('deploy_to_qlinear', False): + logger.info("Convert to ONNX QLinear.") + ONNXQLinearPass(onnx_model_path).run() + + +@register_deploy_function(BackendType.NNIE) +def deploy_qparams_nnie(model: GraphModule, onnx_model_path, model_name, **kwargs): + logger.info("Extract qparams for NNIE.") + remove_fakequantize_and_collect_params_nnie(onnx_model_path, model_name) + + +@register_deploy_function(BackendType.OPENVINO) +def deploy_qparams_openvino(model: GraphModule, onnx_model_path, model_name, **kwargs): + logger.info("Extract qparams for OPENVINO.") + replace_fakequantize_and_collect_params_openvino(onnx_model_path, model_name) + + +@register_deploy_function(BackendType.Tensorrt) +def deploy_qparams_tensorrt(model: GraphModule, onnx_model_path, model_name, **kwargs): + logger.info("Extract qparams for TensorRT.") + remove_fakequantize_and_collect_params(onnx_model_path, model_name, backend='tensorrt') + + +@register_deploy_function(BackendType.Vitis) +def deploy_qparams_vitis(model: GraphModule, onnx_model_path, model_name, **kwargs): + logger.info("Extract qparams for Vitis-DPU.") + remove_fakequantize_and_collect_params(onnx_model_path, model_name, backend='vitis') + + +@register_deploy_function(BackendType.SNPE) +def deploy_qparams_snpe(model: GraphModule, onnx_model_path, model_name, **kwargs): + logger.info("Extract qparams for SNPE.") + remove_fakequantize_and_collect_params(onnx_model_path, model_name, backend='snpe') + + +@register_deploy_function(BackendType.PPLW8A16) +def deploy_qparams_pplw8a16(model: GraphModule, onnx_model_path, model_name, **kwargs): + logger.info("Extract qparams for PPLW8A16.") + remove_fakequantize_and_collect_params(onnx_model_path, model_name, backend='ppl') + + +@register_deploy_function(BackendType.ONNX_QNN) +def deploy_qparams_tvm(model: GraphModule, onnx_model_path, model_name, **kwargs): + logger.info("Convert to ONNX QNN.") + ONNXQNNPass(onnx_model_path).run(model_name) + + +@register_deploy_function(BackendType.PPLCUDA) +def deploy_qparams_ppl_cuda(model: GraphModule, onnx_model_path, model_name, **kwargs): + logger.info("Extract qparams for PPL-CUDA.") + remove_fakequantize_and_collect_params(onnx_model_path, model_name, backend='ppl-cuda') + +@register_deploy_function(BackendType.Tengine_u8) +def deploy_qparams_tengine(model: GraphModule, onnx_model_path, model_name, **kwargs): + logger.info("Extract qparams for Tengine.") + remove_fakequantize_and_collect_params_tengine(onnx_model_path, model_name) + + +def convert_deploy(model: GraphModule, backend_type: BackendType, + input_shape_dict=None, dummy_input=None, output_path='./', + model_name='mqbench_qmodel', deploy_to_qlinear=False, **extra_kwargs): + r"""Convert model to onnx model and quantization params depends on backend. + + Args: + model (GraphModule): GraphModule prepared qat module. + backend_type (BackendType): specific which backend should be converted to. + input_shape_dict (dict): keys are model input name(should be forward function + params name, values are list of tensor dims) + output_path (str, optional): path to save convert results. Defaults to './'. + model_name (str, optional): name of converted onnx model. Defaults to 'mqbench_qmodel'. + + >>> note on input_shape_dict: + example: {'input_0': [1, 3, 224, 224] + 'input_1': [1, 3, 112, 112] + } + while forward function signature is like: + def forward(self, input_0, input_1): + pass + """ + kwargs = { + 'input_shape_dict': input_shape_dict, + 'dummy_input': dummy_input, + 'output_path': output_path, + 'model_name': model_name, + 'onnx_model_path': osp.join(output_path, '{}.onnx'.format(model_name)), + 'deploy_to_qlinear': deploy_to_qlinear + } + kwargs.update(extra_kwargs) + deploy_model = deepcopy_graphmodule(model) + for convert_function in BACKEND_DEPLOY_FUNCTION[backend_type]: + convert_function(deploy_model, **kwargs) diff --git a/mqbench/custom_quantizer/__init__.py b/mqbench/custom_quantizer/__init__.py new file mode 100644 index 0000000..94646a0 --- /dev/null +++ b/mqbench/custom_quantizer/__init__.py @@ -0,0 +1,9 @@ +from .model_quantizer import ModelQuantizer +from .academic_quantizer import AcademicQuantizer +from .openvino_quantizer import OPENVINOQuantizer +from .vitis_quantizer import VitisQuantizer +from .total_int_quantizer import TotalINTQuantizer +from .tensorrt_quantizer import TRTModelQuantizer, TensorrtNLPQuantizer +from .tengine_u8_quantizer import TengineQuantizer +from .onnx_qnn_quantizer import ONNXQNNQuantizer +from .nlp_quantizer import AcademicNLPQuantizer \ No newline at end of file diff --git a/mqbench/custom_quantizer/academic_quantizer.py b/mqbench/custom_quantizer/academic_quantizer.py new file mode 100644 index 0000000..9cb86c0 --- /dev/null +++ b/mqbench/custom_quantizer/academic_quantizer.py @@ -0,0 +1,466 @@ +import copy +from collections import OrderedDict +from distutils.log import warn +from typing import List +import global_placeholder +import operator +import mmcv +import torch +from torch.fx import GraphModule +from torch.quantization import propagate_qconfig_ +from torch.quantization.fx.qconfig_utils import get_flattened_qconfig_dict +import torch.nn.functional as F +import torch.nn as nn +from mqbench.utils import is_symmetric_quant, getitem2node +from mqbench.utils.logger import logger +from mqbench.utils.registry import register_model_quantizer +from mqbench.prepare_by_platform import BackendType +from mqbench.custom_quantizer import ModelQuantizer +from mqbench.fake_quantize.tqt import TqtFakeQuantize +from torch.quantization.quantize_fx import _fuse_fx +import mqbench.nn.intrinsic as qnni +import mqbench.nn.intrinsic.qat as qnniqat +import torch.nn.intrinsic as nni +from torch.nn.parameter import Parameter + +@register_model_quantizer(BackendType.Academic) # 装饰器,妙 +class AcademicQuantizer(ModelQuantizer): + """Academic setting mostly do not merge BN and leave the first and last layer to higher bits. + """ + + def __init__(self, extra_quantizer_dict, extra_fuse_dict): + super().__init__(extra_quantizer_dict, extra_fuse_dict) + self.io_module = {} + self.post_act_8bit_node_name = [] + # self.additional_qat_module_mapping = { + # # Intrinsic modules: + # nni.ConvBn2d: qnniqat.ConvBn2d, + # nni.ConvBnReLU2d: qnniqat.ConvBnReLU2d, + # nni.ConvReLU2d: qnniqat.ConvReLU2d, + # } + + + def prepare(self, model: GraphModule, qconfig, further_detail=dict(), testing=False): + if global_placeholder.fold_bn_flag: + # 进行bn fuse TODO 验证一下,量化插入逻辑对不对;影响的optimi; weight是成功插入了 + model = _fuse_fx(model, self.extra_fuse_dict) + + specified_general_quantizers = further_detail.get('specified_general_quantizers', []) + last_8bit_module = further_detail.get('last_8bit_module', []) # TODO 要主动给出I!! + self.exclude_module_name = further_detail.get('exclude_prefixes', []) # 不进行量化 + self.removed_quantizer_names = further_detail.get('removed_quantizer_names', []) # 不进行量化 + qloss_flag = further_detail.get('qloss_flag', False) + + self._get_io_module(model, last_8bit_module) # XXX 找出真正意义的首node和尾node(可不止一个),存到self的dict中。理论上来说,就应该是实实在在的layer!!!! + self._get_post_act_8bit_node_name(model) # 根据首尾layer!,找出各自前一个node!,存到self的dict中.这些node后会插入8bitact quant + model = self._weight_quant(model, qconfig, testing=testing) # 利用io_module,为module layer插入 weight quantizer + model, node_to_quantize_output = self._insert_fake_quantize_for_act_quant(model, qconfig, specified_general_quantizers, testing=testing) # 同时利用post_act ,插入act quantizer + if qloss_flag: + self.open_qloss(model) + # if global_placeholder.quant_algorithm == 'tqt': + # logger.info(f'\nNow initialize type of TQT quantizers \n') + # 这里是针对pot scale形式的量化。关键是fold bn 后的bias就是pot scale形式的 + self._set_quant_type(model, node_to_quantize_output) + return model + + def open_qloss(self, model): + qloss_flag = global_placeholder.qloss_flag + if qloss_flag: + for name, module in model.named_modules(): + if hasattr(module, 'compute_qloss'): + # 说明是quantizer + module.compute_qloss = True + # 111111111111111 and 'getitem' not in name + + # if 'post_act' in name: + # module.compute_qloss = True # 22222222222 + # module.regular_margin = Parameter(torch.tensor([1.])) + + # # # 说明是act量化器 + # # module.identity = 2 + + # # else: + # # # 说明是quantizer + # # module.compute_qloss = True # 22222222222 + # # # 说明是weight量化器 + # # # module.identity = 1 + # # # module.compute_qloss = True + # # # module.regular_margin = Parameter(torch.tensor([1.])) + + + def _weight_quant(self, model: GraphModule, qconfig, testing=False): # 为每个layer标上qconfig + logger.info("Replace module to qat module.") + + wq_sign = qconfig.weight.p.keywords.pop('sign') + wq_bit = qconfig.weight.p.keywords.pop('bit') + wqconfig_8bit = copy.deepcopy(qconfig) + wq_symmetry = True if is_symmetric_quant(qconfig.weight.p.keywords['qscheme']) else False + wqconfig_8bit.weight.p.keywords['quant_min'] = -2 ** (8 - 1) if wq_symmetry else 0 + wqconfig_8bit.weight.p.keywords['quant_max'] = 2 ** (8 - 1) - 1 if wq_symmetry else 2 ** 8 - 1 + wqconfig_8bit.weight.p.keywords['dtype'] = torch.qint8 if wq_symmetry else torch.quint8 + + for name, module in model.named_modules(): # XXX 原来GraphModule也储存着原先torch.nn + if name in self.io_module.keys(): + logger.info("Set layer {} to 8 bit.".format(name)) + module.qconfig = wqconfig_8bit + flattened_qconfig_dict = get_flattened_qconfig_dict({'': qconfig}) + if not testing: + propagate_qconfig_(model, flattened_qconfig_dict) # XXX 这是torch官方的函数,就是绑定qconfig。为所有的层或着叫节点绑定qconfig属性。 + else: + warn('只量化首尾!!') + self._qat_swap_modules(model, self.additional_qat_module_mapping) # 为layer插入weight quantizer + return model + + @property + def function_type_to_quant_input(self) -> list: + return self.additional_function_type + [ + # operator.add, + # operator.mul, + # torch.nn.functional.adaptive_avg_pool2d, + # torch.nn.functional.max_pool2d, + # torch.nn.functional.avg_pool2d, + # torch.flatten, + # 'mean', + # 'sum', + # # torch.nn.functional.interpolate, + + # mmcv.cnn.bricks.swish.Swish, + # mmcv.cnn.bricks.activation.Clamp, + # mmcv.cnn.bricks.hsigmoid.HSigmoid + ] + + def _set_quant_type(self, model: GraphModule, tensor_type_set): + # tensor_type_set = self._find_act_quants(model) # 可以复用输入 + params_type_set = self._find_weight_quants(model) + inputs_type_set = self._find_input_quants(model) + module_dict = dict(model.named_modules()) + quantizer_prefix = "_post_act_fake_quantizer" + + for node in tensor_type_set: + if isinstance(node.name, str) and (node.name + quantizer_prefix) in module_dict: + next_op = module_dict[node.name + quantizer_prefix] + if isinstance(next_op, TqtFakeQuantize): + next_op.set_quant_type('tensor') # 就是指定act量化节点的类型 + logger.info(f'{node.name + quantizer_prefix} has been set to quant type ') + for node in params_type_set: + if isinstance(node.target, str) and node.target in module_dict: + op = module_dict[node.target] + if hasattr(op, 'weight_fake_quant'): + if isinstance(op.weight_fake_quant, TqtFakeQuantize): + op.weight_fake_quant.set_quant_type('param') + logger.info(f'{node.target} has been set to quant type ') + if hasattr(op, 'bias_fake_quant'): # NOTE TODO 有趣,其实是可以给出bias_fake_quant。其实在本文,就是走academic quantization。 + if isinstance(op.bias_fake_quant, TqtFakeQuantize): + op.bias_fake_quant.set_quant_type('param') + logger.info(f'{node.target} has been set to quant type ') + for node in inputs_type_set: + if isinstance(node.target, str) and node.target in module_dict: + next_op = module_dict[node.target] + if isinstance(next_op, TqtFakeQuantize): + next_op.set_quant_type('input') + logger.info(f'{node.target} has been set to quant type ') + + def _find_input_quants(self, model) -> List: + node_need_to_quantize_weight = [] + nodes = list(model.graph.nodes) + for node in nodes: + if node.op == 'placeholder' and node.all_input_nodes == []: + node_need_to_quantize_weight.append(list(node.users)[0]) + return node_need_to_quantize_weight + + def _find_weight_quants(self, model) -> List: + node_need_to_quantize_weight = [] + nodes = list(model.graph.nodes) + module_dict = dict(model.named_modules()) + for node in nodes: + if node.target in module_dict: + if hasattr(module_dict[node.target], 'weight_fake_quant') or hasattr(module_dict[node.target], 'bias_fake_quant'): + node_need_to_quantize_weight.append(node) + return node_need_to_quantize_weight + + @property + def module_type_to_quant_input(self) -> tuple: + return ( # 也就是说,带有weight quantizer的都是属于此 + # Conv # Conv + torch.nn.intrinsic.qat.modules.conv_fused.ConvBnReLU2d, + torch.nn.intrinsic.qat.modules.conv_fused.ConvReLU2d, + torch.nn.intrinsic.qat.modules.conv_fused.ConvBn2d, + torch.nn.intrinsic.qat.modules.linear_relu.LinearReLU, + torch.nn.qat.modules.conv.Conv2d, + qnniqat.ConvBnReLU2d, + qnniqat.ConvBn2d, + qnniqat.ConvReLU2d, + # Linear + torch.nn.qat.modules.linear.Linear, + # # Pooling + # torch.nn.modules.pooling.AvgPool2d, + # torch.nn.modules.pooling.AdaptiveAvgPool2d, + # torch.nn.modules.pooling.MaxPool2d, + + # mmcv.cnn.bricks.swish.Swish, + # mmcv.cnn.bricks.activation.Clamp, + # mmcv.cnn.bricks.hsigmoid.HSigmoid + + ) + self.additional_module_type + + def _get_post_act_8bit_node_name(self, model): + for nodes in self.io_module.values(): + for node in nodes: + for _arg in node.args: + if isinstance(_arg, list): + print('{} node 的输入比较多(反复使用)!'.format(node.name)) + for a_arg in _arg: + if isinstance(a_arg, torch.fx.node.Node): + self.post_act_8bit_node_name.append(a_arg.name) + elif isinstance(_arg, torch.fx.node.Node): + self.post_act_8bit_node_name.append(_arg.name) + + # # 原写法 + # for node in self.io_module.values(): + # for _arg in node.args: + # if isinstance(_arg, list): + # print('{} node 的输入比较多(反复使用)!'.format(node.name)) + # for a_arg in _arg: + # if isinstance(a_arg, torch.fx.node.Node): + # self.post_act_8bit_node_name.append(a_arg.name) + # elif isinstance(_arg, torch.fx.node.Node): + # self.post_act_8bit_node_name.append(_arg.name) + + + def _get_io_module(self, model, bit8_last_module_names): + + # 导入全局设置 + # model_type = global_placeholder.model_type + # model_type = model_type.split('_')[0] # 直取大类 + # bit8_last_module_names = last_module_names[model_type] + # bit8_last_module_names = [] # dummy + + nodes = list(model.graph.nodes) + for node in nodes: + total_args = [] + the_first_layer = False # NOTE 这个first layer 找法其实也有点问题,因为palceholder node 的下一个node不一定是module + for _arg in node.args: + if isinstance(_arg, torch.fx.node.Node): + if _arg.op == 'placeholder' and isinstance(node.target, str): + the_first_layer = True + total_args.append(_arg.name) + if the_first_layer: + self.io_module[node.target] = [node] # 找到首,这倒没啥问题 + + if node.target in bit8_last_module_names: + # 在想要保留成8bit的list里的话,则成功保存 + if node.target in self.io_module.keys(): + # 如果已经创建过键值对了的话,添加新的相关node + self.io_module[node.target].append(node) + else: + # 如果还没有创建键值对 + self.io_module[node.target] = [node] + # bit8_last_module_names.remove(node.target) # TODO 这样好像有问题?因为node是可重复的! + + + + continue + # 下面写得太冗余了! + if node.op == 'output': + for _arg in node.args[0]: # XXX _arg还会出现多个,根据你模型定义了几个输出 + if isinstance(_arg, dict): + for out in _arg.values():# 遍历一下 + if isinstance(out, list): + for arg_node in out: + if arg_node.target in bit8_last_module_names: + # 在想要保留成8bit的list里的话,则成功保存 + # 弹出 + self.io_module[arg_node.target] = arg_node + bit8_last_module_names.remove(arg_node.target) + elif out.target in bit8_last_module_names: + # 在想要保留成8bit的list里的话,则成功保存 + # 弹出 + self.io_module[out.target] = out + bit8_last_module_names.remove(out.target) + else: + raise NotImplementedError + elif isinstance(_arg, list): + pass + + + # if isinstance(_arg, tuple): + # # 说明是更复杂的情况 + # print('\n!!find complex output!!!!!接下来取最后一个输出来处理尾量化问题') + # if isinstance(_arg[-1], dict): + # for _value in _arg[-1].values(): + # if isinstance(_value, list): + # for it in _value: + # self.io_module[it.target] = it + # elif isinstance(_value, torch.fx.node.Node): + # self.io_module[_value.target] = _value + # else: + # raise NotImplementedError + + # elif isinstance(_arg, torch.fx.node.Node): + # self.io_module[_arg.target] = _arg # XXX 准确地来说不应该叫module + # else: + # raise NotImplementedError + + def _find_act_quants(self, model: GraphModule) -> List: + nodes = list(model.graph.nodes) + modules = dict(model.named_modules()) + node_need_to_quantize_output = [] # TODO 意思是输出量化? + g2node = getitem2node(model) # TODO 这是干啥的 + for node in nodes: # 两个筛选条件,一个是用来确认该node是否是不允许量化,一个用来确认是否满足量化并整理(C or FC)其输入node + if ((node.op == "call_module" and node.target in self.exclude_module_name) or + ((node.op == 'call_function' or node.op == 'call_method') and + node.target in self.exclude_function_type) or + node.name in self.exclude_node_name) and node.name not in self.additional_node_name: + logger.info("Exclude skip: {}".format(node.name)) + continue + if (node.op == "call_module" and isinstance(modules[node.target], self.module_type_to_quant_input)) or \ + ((node.op == 'call_function' or node.op == 'call_method') and + node.target in self.function_type_to_quant_input) or node.name in self.additional_node_name: # XXX 是layer且属于module_type_to_quant_input、是函数且属于function_type_to_quant_input、name属于additional_node_name + input_node_list = self._flatten_args(node.args) # XXX 将node 的输入node dict reorg成list 可以利用这个 + # Means this is not Tensor + Tensor. 接下来检查,输入是否是存粹的node + if not all([isinstance(_node, torch.fx.node.Node) for _node in input_node_list]): + continue + for _node in input_node_list: + if self._is_implicit_merge(modules, (node, _node)): # TODO 这个是拿来检验,父子关系是否为mul或add,会被fused? + logger.info("Implicit merge: {} + {}".format(_node.name, node.name)) + continue + if _node in g2node: + _node = g2node[_node] + node_need_to_quantize_output.append(_node) # XXX 总结来说,就是找到需要前置插入量化节点的node,然后找到他父节点,在所有父节点后面插入act 量化节点 + return node_need_to_quantize_output # 意思就是Conv 或Linear之前肯定会有act 量化节点 + + def _insert_fake_quantize_for_act_quant(self, model: GraphModule, qconfig, specified_general_quantizers, testing=False): # 在conv前插入 + graph = model.graph + nodes = list(model.graph.nodes) + # self.exclude_node_name = ['backbone_fpn_extra_blocks_p7'] # p7的输入不进行量化!!是这个意思 + quantizer_prefix = "_post_act_fake_quantizer" + node_to_quantize_output = self._find_act_quants(model) # 找到那些输出act需要被量化的node TODO 这里有问题 + node_to_quantize_output = OrderedDict.fromkeys(node_to_quantize_output).keys() + + aq_sign = qconfig.activation.p.keywords.pop('sign') + aq_bit = qconfig.activation.p.keywords.pop('bit') + + # 先造8bit量化的config,因为尾保持8bit量化会需要这个. 8bit 对称 unsign量化 + aqconfig_8bit = copy.deepcopy(qconfig.activation) + aq_symmetry = True if is_symmetric_quant(qconfig.activation.p.keywords['qscheme']) else False + aqconfig_8bit.p.keywords['quant_min'] = -2 ** (8 - 1) if (aq_symmetry and aq_sign) else 0 + aqconfig_8bit.p.keywords['quant_max'] = 2 ** (8 - 1) - 1 if (aq_symmetry and aq_sign) else 2 ** 8 - 1 + aqconfig_8bit.p.keywords['dtype'] = torch.qint8 if (aq_symmetry and aq_sign) else torch.quint8 + # 再造8bit量化的特殊config,因为首保持8bit量化会需要这个. 8bit 对称 sign量化 + aqconfig_8bit_special = copy.deepcopy(qconfig.activation) + aq_symmetry = True if is_symmetric_quant(qconfig.activation.p.keywords['qscheme']) else False + aqconfig_8bit_special.p.keywords['quant_min'] = -2 ** (8 - 1) if aq_symmetry else 0 + aqconfig_8bit_special.p.keywords['quant_max'] = 2 ** (8 - 1) - 1 if aq_symmetry else 2 ** 8 - 1 + aqconfig_8bit_special.p.keywords['dtype'] = torch.qint8 if aq_symmetry else torch.quint8 + # 再造特殊config,因为一些非ReLU后面的quantizer若symmetric则置为sign。 同bit 对称 sign量化 + aqconfig_special = copy.deepcopy(qconfig.activation) + aqconfig_special.p.keywords['quant_min'] = -2 ** (aq_bit - 1) if aq_symmetry else 0 + aqconfig_special.p.keywords['quant_max'] = 2 ** (aq_bit - 1) - 1 if aq_symmetry else 2 ** aq_bit - 1 + aqconfig_special.p.keywords['dtype'] = torch.qint8 if aq_symmetry else torch.quint8 + + module_dict = dict(model.named_modules()) + + for node in node_to_quantize_output: # 开始遍历,插入act量化节点 + quantizer_name = node.name + quantizer_prefix + + # 检查是否为需要跳过的quantizer。需要跳过。比如backbone输出其实已经被量化过了,那么neck的输入就不需要被量化。 + if quantizer_name in self.removed_quantizer_names: + logger.info("Remove {} quantizer".format(quantizer_name)) + continue + + if node.name in self.post_act_8bit_node_name: # TODO 尾巴不应该是sign!也应该走下面那一套 都块函数化,然后现在的8bitconfig其实就是special情况 + logger.info("Set {} post act quantize to 8 bit.".format(node.name)) # 确实说明的是,在该node后面加上fakequant用于act + + fake_quantizer = self._execute_act_quantizer(node, module_dict, quantizer_name, aqconfig_8bit, aqconfig_8bit_special, specified_general_quantizers) + + # # NOTE!因为共享头的输入会被插入多个量化器 + # quantizer_name = node.name + quantizer_prefix + # logger.info("Insert act quant {}".format(quantizer_name)) + # fake_quantizer = aqconfig_8bit() # 直接生成量化器 NOTE 这玩意就是量化器,走公式的那种,是layer! + + # fake_quantizer.compute_qloss = True # 置True,表示act的quantizer要计算qloss + # setattr(model, quantizer_name, fake_quantizer) # 绑定layer到model中 + # with graph.inserting_after(node): # XXX 确实是在node后面插入 act fquantizer 但其实这个node就是act或者其他函数 + # inserted_node = graph.create_node("call_module", quantizer_name, (node,), {}) # 定义node + # for _node in nodes: # 遍历graph,想把原来接着的node的arg重定向到inserted_node上。 + # _node.args = self._fix_succ_recursivly(_node.args, node, inserted_node) + else: + fake_quantizer = self._execute_act_quantizer(node, module_dict, quantizer_name, qconfig.activation, aqconfig_special, specified_general_quantizers) + + # fake_quantizer = None + # if (node.op == 'call_function' or node.op == 'call_method'): + # target_module = None + # else: + # target_module = module_dict[node.target] # TODO 要判断一下是不是call function,然后解决 add、interp处的actquantizer一样的道理,mqbench的逻辑是兼容的 + # quantizer_name = node.name + quantizer_prefix + # if ('quantizer' not in node._prev.name and # 这个就能筛大部分的了 + # (isinstance(target_module, (nn.ReLU, nn.MaxPool2d)) or node.target in (F.relu, F.max_pool2d))): # 如果说target module是relu、maxpool、那就遵守quantizer + # fake_quantizer = qconfig.activation() + # logger.info("Insert act quant {} with general config".format(quantizer_name)) + # else: # 如果为conv、bn、或者op=placeholder, + # # 说明不是Relu后面的quantizer,要改为特制的quantizer 这个分支对应了mobilenetv2的情况\add、interp处的情况 + # fake_quantizer = aqconfig_special() + # logger.info("Insert act quant {} with special config".format(quantizer_name)) + + # # 二次检查,把非ReLU后的actquantizer搞成若symmetric则sign + # fake_quantizer.compute_qloss = True # 置True,表示act的quantizer要计算qloss + # setattr(model, quantizer_name, fake_quantizer) + # with graph.inserting_after(node): # XXX 确实是在node后面插入 act fquantizer 但其实这个node就是act或者其他函数 + # inserted_node = graph.create_node("call_module", quantizer_name, (node,), {}) # 定义node + # for _node in nodes: # 遍历graph,想把原来接着的node的arg重定向到inserted_node上。 + # _node.args = self._fix_succ_recursivly(_node.args, node, inserted_node) + + + # fake_quantizer.compute_qloss = compute_qloss_flag # 置False,表示act的quantizer不计算qloss;置true, 表示act的quantizer算qloss + setattr(model, quantizer_name, fake_quantizer) + with graph.inserting_after(node): # XXX 确实是在node后面插入 act fquantizer 但其实这个node就是act或者其他函数 + inserted_node = graph.create_node("call_module", quantizer_name, (node,), {}) # 定义node + for _node in nodes: # 遍历老graph,想把原来接着的node的arg重定向到inserted_node上。 注意是老nodes集合,很妙! + _node.args = self._fix_succ_recursivly(_node.args, node, inserted_node) + + # else: + # warn('只量化首尾!!') + + model.recompile() + model.graph.lint() + return model, node_to_quantize_output + def _execute_act_quantizer(self, node, module_dict, quantizer_name, config, special_config, specified_general_quantizers): + def is_node_names_have_word(in_nodes, word): + # 这里可能会有问题,因为有些relu node的名字可没有“relu” + for in_node in in_nodes: + if word in in_node.name: + return True + return False + + fake_quantizer = None + if (node.op == 'call_function' or node.op == 'call_method' or node.op == 'placeholder'): + target_module = None + else: + target_module = module_dict[node.target] # TODO 要判断一下是不是call function,然后解决 add、interp处的actquantizer一样的道理,mqbench的逻辑是兼容的 + if ( + ( + quantizer_name in specified_general_quantizers + ) + or + ( + # not is_node_names_have_word(node.all_input_nodes, 'quantizer') # 这个就能筛大部分的了 'quantizer' not in node._prev.name + # and + ( + isinstance(target_module, (qnniqat.ConvReLU2d, qnniqat.ConvBnReLU2d, nn.intrinsic.qat.modules.conv_fused.ConvReLU2d, nn.intrinsic.qat.modules.conv_fused.ConvBnReLU2d, torch.nn.intrinsic.qat.modules.linear_relu.LinearReLU, nn.ReLU, nn.ReLU6, nn.MaxPool2d)) + or node.target in (F.relu, F.relu6, F.max_pool2d) + ) + ) + or + ( + is_node_names_have_word(node.all_input_nodes, 'relu') + and 'flatten' in node.name + )): # 如果说target module是relu、maxpool、那就遵守quantizer + + fake_quantizer = config() + logger.info("Insert act quant {} with general config".format(quantizer_name)) + else: # 如果为conv、bn、或者op=placeholder, + # 说明不是Relu或relu6后面的quantizer,要改为特制的quantizer 这个分支对应了mobilenetv2的情况\add、interp处的情况 + fake_quantizer = special_config() # special唯一的意义就是作为对称量化setting + logger.info("Insert act quant {} with special config".format(quantizer_name)) + + return fake_quantizer \ No newline at end of file diff --git a/mqbench/custom_quantizer/model_quantizer.py b/mqbench/custom_quantizer/model_quantizer.py new file mode 100644 index 0000000..640b788 --- /dev/null +++ b/mqbench/custom_quantizer/model_quantizer.py @@ -0,0 +1,275 @@ +import copy +import operator +from collections import OrderedDict +from typing import ( + List, Dict, Any, Callable +) + +import torch +from torch.fx import ( + GraphModule +) +from torch.quantization import ( + propagate_qconfig_, + swap_module +) +from torch.nn.intrinsic import ( + _FusedModule +) +from torch.quantization.quantization_mappings import ( + get_default_qat_module_mappings, + get_default_static_quant_module_mappings +) +from torch.quantization.utils import ( + get_combined_dict +) +from torch.quantization.fx.qconfig_utils import ( + get_flattened_qconfig_dict +) +from torch.quantization.quantize_fx import ( + _fuse_fx +) + +from mqbench.utils import getitem2node +from mqbench.utils.logger import logger +from mqbench.utils.registry import register_model_quantizer +from mqbench.prepare_by_platform import BackendType + + +@register_model_quantizer(BackendType.Tensorrt) +@register_model_quantizer(BackendType.NNIE) +class ModelQuantizer(object): + """General model quantizer class. + First, replace common float module to nn.qat.modules to make weight fake + quantized. + Second, insert activation fake quantize node before specific layers. Layer + type is defined in function_type_to_quant_input / module_type_to_quant_input. + We only quantize the inputs of layers and leave the output not quantized + since it is next layer's input. + """ + + def __init__(self, extra_quantizer_dict, extra_fuse_dict): + self.additional_function_type = extra_quantizer_dict.get('additional_function_type', []) # XXX 这里似乎是说明如何加限制和定制化的 + self.additional_module_type = extra_quantizer_dict.get('additional_module_type', ()) + self.additional_fuser_method_mapping = extra_fuse_dict.get('additional_fuser_method_mapping', {}) + self.additional_fusion_pattern = extra_fuse_dict.get('additional_fusion_pattern', {}) + self.additional_qat_module_mapping = extra_fuse_dict.get('additional_qat_module_mapping', {}) + self.additional_node_name = extra_quantizer_dict.get('additional_node_name', []) + self.exclude_module_name = extra_quantizer_dict.get('exclude_module_name', []) # TODO 这个是用来定位首尾8bit吗 + self.exclude_function_type = extra_quantizer_dict.get('exclude_function_type', []) + self.exclude_node_name = extra_quantizer_dict.get('exclude_node_name', []) + self.extra_fuse_dict = extra_fuse_dict + + def prepare(self, model: GraphModule, qconfig): + model = _fuse_fx(model, self.extra_fuse_dict) + model = self._weight_quant(model, qconfig) + model = self._insert_fake_quantize_for_act_quant(model, qconfig) + return model + + def _insert_fake_quantize_for_act_quant( + self, + model: GraphModule, + qconfig: Any): + graph = model.graph + nodes = list(model.graph.nodes) + + quantizer_prefix = "_post_act_fake_quantizer" + node_to_quantize_output = self._find_act_quants(model) + node_to_quantize_output = OrderedDict.fromkeys(node_to_quantize_output).keys() + + for node in node_to_quantize_output: + fake_quantizer = qconfig.activation() + quantizer_name = node.name + quantizer_prefix + setattr(model, quantizer_name, fake_quantizer) + logger.info("Insert act quant {}".format(quantizer_name)) + with graph.inserting_after(node): + inserted_node = graph.create_node("call_module", quantizer_name, (node,), {}) + for _node in nodes: + _node.args = self._fix_succ_recursivly(_node.args, node, inserted_node) + + model.recompile() + model.graph.lint() + return model + + def _fix_succ_recursivly(self, args, target_node, inserted_node): # 这是想判断每个node的输入arg是否异常(因为新加了node),然后重新调整、更新 + # List / Tuple + if isinstance(args, (list, tuple)): + _tmp = list(args) + for _i, _arg in enumerate(args): # 遍历args,找出arg_node是target的情况,说明该node的输入是target,然后得替换成输入是act quant。相当于act quant接管了该node的user + if _arg == target_node: + _tmp[_i] = inserted_node + elif isinstance(_arg, tuple): + _tmp[_i] = self._fix_succ_recursivly(_arg, target_node, inserted_node) + elif isinstance(_arg, list): + _tmp[_i] = list(self._fix_succ_recursivly(_arg, target_node, inserted_node)) + elif isinstance(_arg, dict): + _tmp[_i] = self._fix_succ_recursivly(_arg, target_node, inserted_node) + return tuple(_tmp) + # Dict + elif isinstance(args, dict): + _tmp = {} + for k, v in args.items(): + if v == target_node: + _tmp[k] = inserted_node + elif not isinstance(v, torch.fx.node.Node): + _tmp[k] = self._fix_succ_recursivly(v, target_node, inserted_node) + else: + _tmp[k] = v + return _tmp + else: + raise NotImplementedError('{} can not be handled now.'.format(type(args))) + + def _weight_quant(self, model: GraphModule, qconfig): + logger.info("Replace module to qat module.") + flattened_qconfig_dict = get_flattened_qconfig_dict({'': qconfig}) + propagate_qconfig_(model, flattened_qconfig_dict) + self._qat_swap_modules(model, self.additional_qat_module_mapping) + return model + + @property # 这个意思是说,调用的时候当成属性调用就行,不像函数还带括号 + def implicit_merge_patterns(self) -> list: + # Layers which do not need quantize among them. + # In reversed order! + return [ + (operator.add, operator.mul) + ] + + def _on_merge_chain(self, modules, pattern, pair, p_pos=0, v_pos=0): + if v_pos == len(pair): + return True + if p_pos == len(pattern): + return v_pos == len(pair) + node = pair[v_pos] + cur_pattern = pattern[p_pos] + # Means current node is matched. + if (node.op == "call_module" and type(modules[node.target]) == cur_pattern) or \ + ((node.op == 'call_function' or node.op == 'call_method') and + node.target == cur_pattern): + # Means compairing pair. + if len(pattern) > p_pos and len(pair) > v_pos: + return self._on_merge_chain(modules, pattern, pair, p_pos + 1, v_pos + 1) + # Means compairing extra node. + matched = False + flatten_args = self._flatten_args(node.args) + for _arg in flatten_args: + extra_pair = (*pair, _arg) + if isinstance(_arg, torch.fx.node.Node) and \ + self._on_merge_chain(modules, pattern, extra_pair, p_pos + 1, v_pos + 1): + matched = True + return matched + # Current node is not matched, skip to next. + else: + return self._on_merge_chain(modules, pattern, pair, p_pos + 1, v_pos) # 额,回溯 + + def _is_implicit_merge(self, modules, pair): + for pattern in self.implicit_merge_patterns: + if self._on_merge_chain(modules, pattern, pair): + return True + return False + + @property + def function_type_to_update_data_struct(self) -> list: + return [ + 'update' + ] + + @property + def function_type_to_quant_input(self) -> list: + return [ + operator.add, + operator.mul, + torch.nn.functional.adaptive_avg_pool2d, + torch.nn.functional.interpolate + ] + self.additional_function_type + + @property + def module_type_to_quant_input(self) -> tuple: + return ( + # Conv + torch.nn.intrinsic.qat.modules.conv_fused.ConvBnReLU2d, + torch.nn.intrinsic.qat.modules.conv_fused.ConvBn2d, + torch.nn.qat.modules.conv.Conv2d, + # ConvTranspose + torch.nn.ConvTranspose2d, + # Linear + torch.nn.qat.modules.linear.Linear, + # Pooling + torch.nn.modules.pooling.MaxPool2d, + torch.nn.modules.pooling.AvgPool2d, + torch.nn.modules.pooling.AdaptiveAvgPool2d, + # BN + torch.nn.BatchNorm2d, + # Prelu mostly do not merge. + torch.nn.PReLU, + # Upsample + torch.nn.Upsample + ) + self.additional_module_type + + def _flatten_args(self, node): + flattned_args = [] + if isinstance(node, dict): + for v in node.values(): + flattned_args.extend(self._flatten_args(v)) + elif isinstance(node, tuple) or isinstance(node, list): + for n in node: + flattned_args.extend(self._flatten_args(n)) + else: + flattned_args.extend([node]) + return flattned_args + + def _find_act_quants(self, model: GraphModule) -> List: + nodes = list(model.graph.nodes) + modules = dict(model.named_modules()) + node_need_to_quantize_output = [] + g2node = getitem2node(model) + for node in nodes: + if ((node.op == "call_module" and node.target in self.exclude_module_name) or + ((node.op == 'call_function' or node.op == 'call_method') and + node.target in self.exclude_function_type) or + node.name in self.exclude_node_name) and node.name not in self.additional_node_name: + logger.info("Exclude skip: {}".format(node.name)) + continue + if (node.op == "call_module" and isinstance(modules[node.target], self.module_type_to_quant_input)) or \ + ((node.op == 'call_function' or node.op == 'call_method') and + node.target in self.function_type_to_quant_input) or node.name in self.additional_node_name: + input_node_list = self._flatten_args(node.args) + # Means this is not Tensor + Tensor. + if not all([isinstance(_node, torch.fx.node.Node) for _node in input_node_list]): + continue + for _node in input_node_list: + if self._is_implicit_merge(modules, (node, _node)): + logger.info("Implicit merge: {} + {}".format(_node.name, node.name)) + continue + if _node in node_need_to_quantize_output: + continue + if _node in g2node: + _node = g2node[_node] + node_need_to_quantize_output.append(_node) + return node_need_to_quantize_output + + def _qat_swap_modules(self, root: GraphModule, additional_qat_module_mapping: Dict[Callable, Callable]): + all_mappings = get_combined_dict( + get_default_qat_module_mappings(), additional_qat_module_mapping) + root = self._convert(root, all_mappings, inplace=True) # TODO 这是在将layer转化成带weight quantizer的对应layer + return root + + def _convert(self, module, mapping=None, inplace=False, scope=''): + if mapping is None: + mapping = get_default_static_quant_module_mappings() + + if not inplace: + module = copy.deepcopy(module) + reassign = {} + for name, mod in module.named_children(): + # fused modules are swapped as one unit + new_scope = "{}.{}".format(scope, name) if scope != '' else name + if new_scope in self.exclude_module_name: # TODO 这里能避免某些layer被量化 + logger.info("Skip quant layer: " + new_scope) + continue + if not isinstance(mod, _FusedModule): # 嵌套,回溯,直到找到leaf,即子layer + self._convert(mod, mapping, True, new_scope) + reassign[name] = swap_module(mod, mapping, {}) # 这是官方的函数,将带有Qconfig的layer转成对应的量化型layer,同时加入weight quantizer(之前定义的),然后才返回对应的layer。若不是layer输入,则无返回 + for key, value in reassign.items(): + module._modules[key] = value # 最后再完成替换 + # logger.info(f"layer {scope} get weight quant") + return module \ No newline at end of file diff --git a/mqbench/custom_quantizer/nlp_quantizer.py b/mqbench/custom_quantizer/nlp_quantizer.py new file mode 100644 index 0000000..69251f9 --- /dev/null +++ b/mqbench/custom_quantizer/nlp_quantizer.py @@ -0,0 +1,28 @@ +import torch + +from mqbench.utils.registry import register_model_quantizer +from mqbench.prepare_by_platform import BackendType +from mqbench.custom_quantizer import ModelQuantizer + + +@register_model_quantizer(BackendType.Academic_NLP) +class AcademicNLPQuantizer(ModelQuantizer): + """ + NLP model quantizer for Academic settings. Should not de 8bit for + first / last layer. + We should uantize Linear / Embedding weights. + Linear / Matmul layer inputs(activations). + """ + @property + def function_type_to_quant_input(self) -> list: + return [ + # Matmul in MSA + torch.matmul + ] + self.additional_function_type + + @property + def module_type_to_quant_input(self) -> tuple: + return ( + # Linear + torch.nn.qat.modules.linear.Linear, + ) + self.additional_module_type \ No newline at end of file diff --git a/mqbench/custom_quantizer/onnx_qnn_quantizer.py b/mqbench/custom_quantizer/onnx_qnn_quantizer.py new file mode 100644 index 0000000..c4469e4 --- /dev/null +++ b/mqbench/custom_quantizer/onnx_qnn_quantizer.py @@ -0,0 +1,99 @@ +import operator +from typing import Dict, Callable, List + +import torch +from torch.fx import GraphModule +from torch.quantization.quantization_mappings import get_default_qat_module_mappings +from torch.quantization.utils import get_combined_dict + + +import mqbench.nn as qnn +import mqbench.nn.intrinsic as qnni +from mqbench.utils.registry import register_model_quantizer +from mqbench.prepare_by_platform import BackendType +from mqbench.custom_quantizer import ModelQuantizer + + +@register_model_quantizer(BackendType.ONNX_QNN) +class ONNXQNNQuantizer(ModelQuantizer): + """Quantize model according to TVM ONNX frontend. + """ + + def __init__(self, extra_quantizer_dict, extra_fuse_dict): + super().__init__(extra_quantizer_dict, extra_fuse_dict) + + @property + def _relu_module_type(self): + return (torch.nn.ReLU, torch.nn.ReLU6) + + @property + def _relu_function_type(self): + return (torch.nn.functional.relu, torch.nn.functional.relu6) + + def _find_act_quants(self, model: GraphModule) -> List: + nodes = list(model.graph.nodes) + modules = dict(model.named_modules()) + node_need_to_quantize_output = super()._find_act_quants(model) + for node in nodes: + if (node.op == "call_module" and node.target in self.exclude_module_name) or \ + ((node.op == 'call_function' or node.op == 'call_method') and + node.target in self.exclude_function_type) or \ + node.name in self.exclude_node_name: + continue + if (node.op == "call_module" and isinstance(modules[node.target], self.module_type_to_quant_input)) or \ + ((node.op == 'call_function' or node.op == 'call_method') and + node.target in self.function_type_to_quant_input): + # Add current node if not merge relu. + for next_node in node.users: + if not ((next_node.op == 'call_function' and next_node.target in self._relu_function_type) or ( + next_node.op == 'call_module' and isinstance(modules[next_node.target], self._relu_module_type))): + node_need_to_quantize_output.append(node) + else: + node_need_to_quantize_output.append(next_node) + return node_need_to_quantize_output + + def _qat_swap_modules(self, root: GraphModule, additional_qat_module_mapping: Dict[Callable, Callable]): + all_mappings = get_combined_dict( + get_default_qat_module_mappings(), additional_qat_module_mapping) + # There is no QLinearFC in ONNX for now. + del(all_mappings[torch.nn.modules.linear.Linear]) + del(all_mappings[torch.nn.intrinsic.modules.fused.LinearReLU]) + del(all_mappings[qnni.modules.fused.LinearBn1d]) + root = self._convert(root, all_mappings, inplace=True) + return root + + @property + def function_type_to_quant_input(self) -> list: + return [ + operator.add, + # TODO operator.mul, + # TODO torch.cat, + torch.nn.functional.adaptive_avg_pool2d + # sigmoid + # TODO torch.nn.functional.sigmoid + ] + + @property + def module_type_to_quant_input(self) -> tuple: + return ( + # Conv + torch.nn.intrinsic.qat.modules.conv_fused.ConvBnReLU2d, + torch.nn.intrinsic.qat.modules.conv_fused.ConvBn2d, + torch.nn.qat.Conv2d, + # Linear + torch.nn.qat.modules.linear.Linear, + qnn.intrinsic.qat.LinearBn1d, + # Pooling + torch.nn.modules.pooling.AvgPool2d, + torch.nn.modules.pooling.AdaptiveAvgPool2d, + # Prelu + # TODO torch.nn.PReLU, + ) + + @property + def implicit_merge_patterns(self) -> list: + # Layers which do not need quantize among them. + # In reversed order! + return [ + (torch.nn.ReLU, operator.add) + ] diff --git a/mqbench/custom_quantizer/openvino_quantizer.py b/mqbench/custom_quantizer/openvino_quantizer.py new file mode 100644 index 0000000..1509b83 --- /dev/null +++ b/mqbench/custom_quantizer/openvino_quantizer.py @@ -0,0 +1,297 @@ +import copy +import operator +from collections import OrderedDict +from typing import Any + +import torch +from torch.fx import GraphModule +from torch.quantization import propagate_qconfig_ +from torch.quantization.fx.qconfig_utils import get_flattened_qconfig_dict +from torch.quantization.quantize_fx import _fuse_fx + +from mqbench.utils import is_symmetric_quant +from mqbench.utils.logger import logger +from mqbench.utils.registry import register_model_quantizer +from mqbench.prepare_by_platform import BackendType +from mqbench.custom_quantizer import ModelQuantizer + + +@register_model_quantizer(BackendType.OPENVINO) +class OPENVINOQuantizer(ModelQuantizer): + """OPENVINO type, activation is scaled to [0, 255] when qscheme is symmetric + """ + + def __init__(self, extra_quantizer_dict, extra_fuse_dict): + super().__init__(extra_quantizer_dict, extra_fuse_dict) + self.academic_mode = extra_quantizer_dict.get('academic_mode', False) + + @property + def _passed_func_type(self): + academic_pass_type = (operator.getitem, getattr) + if self.academic_mode: + return academic_pass_type + else: + return academic_pass_type + (torch.cat, ) + + @property + def _passed_module_type(self): + return tuple() + + @property + def _linear_module_node(self) -> tuple: + return ( + torch.nn.qat.modules.conv.Conv2d, + torch.nn.intrinsic.qat.modules.conv_fused.ConvBnReLU2d, + torch.nn.intrinsic.qat.modules.conv_fused.ConvBnReLU1d, + torch.nn.intrinsic.qat.modules.conv_fused.ConvReLU2d, + torch.nn.intrinsic.qat.modules.conv_fused.ConvBn2d, + torch.nn.intrinsic.qat.modules.conv_fused.ConvBn1d, + torch.nn.qat.modules.conv.Conv2d, + torch.nn.qat.modules.linear.Linear, + ) + + @property + def _propagated_pattern(self) -> tuple: + prev_nodes_pattern = { + 'func_type': (torch.nn.functional.max_pool2d, torch.flatten), + 'module_type': (torch.nn.modules.pooling.MaxPool2d, torch.nn.modules.Flatten) + } + + cur_nodes_pattern = { + 'func_type': (torch.nn.functional.conv2d, torch.nn.functional.conv1d, torch.nn.functional.conv3d, torch.matmul), + 'module_type': self._linear_module_node, + } + + return (prev_nodes_pattern, cur_nodes_pattern) + + @property + def function_type_to_quant_input(self) -> list: + return [ + operator.add, + torch.nn.functional.adaptive_avg_pool2d, + torch.nn.functional.max_pool2d, + torch.nn.functional.avg_pool2d, + torch.flatten, + 'mean', + 'sum', + torch.nn.functional.interpolate, + ] + + @property + def module_type_to_quant_input(self) -> tuple: + if self.academic_mode: + return ( + # Conv + torch.nn.qat.modules.conv.Conv2d, + # Linear + torch.nn.qat.modules.linear.Linear, + # Pooling + torch.nn.modules.pooling.AvgPool2d, + torch.nn.modules.pooling.AdaptiveAvgPool2d, + torch.nn.modules.pooling.MaxPool2d, + # Prelu + # TODO torch.nn.PReLU, + torch.nn.modules.Upsample, + ) + self.additional_module_type + else: + return ( + # Conv + torch.nn.intrinsic.qat.modules.conv_fused.ConvBnReLU2d, + torch.nn.intrinsic.qat.modules.conv_fused.ConvBnReLU1d, + torch.nn.intrinsic.qat.modules.conv_fused.ConvReLU2d, + torch.nn.intrinsic.qat.modules.conv_fused.ConvBn2d, + torch.nn.intrinsic.qat.modules.conv_fused.ConvBn1d, + torch.nn.qat.modules.conv.Conv2d, + # Linear + torch.nn.qat.modules.linear.Linear, + # Pooling + torch.nn.modules.pooling.AvgPool2d, + torch.nn.modules.pooling.AdaptiveAvgPool2d, + torch.nn.modules.pooling.MaxPool2d, + # Prelu + # TODO torch.nn.PReLU, + torch.nn.modules.Upsample, + ) + self.additional_module_type + + @property + def module_type_to_quant_unsigned(self) -> tuple: + if self.academic_mode: + return (torch.nn.modules.ReLU, ) + else: + return ( + torch.nn.modules.ReLU, + torch.nn.intrinsic.qat.modules.conv_fused.ConvBnReLU2d, + torch.nn.intrinsic.qat.modules.conv_fused.ConvBnReLU1d, + torch.nn.intrinsic.qat.modules.conv_fused.ConvReLU2d, + ) + + @property + def function_type_maybe_unsigned(self) -> tuple: + return self.function_type_to_quant_input + + @property + def function_type_to_quant_unsigned(self) -> tuple: + return (torch.nn.functional.relu, ) + + @property + def module_type_maybe_unsigned(self) -> tuple: + return (torch.nn.Upsample, torch.nn.modules.pooling.MaxPool2d, torch.nn.modules.pooling.AvgPool2d, torch.nn.modules.pooling.AdaptiveAvgPool2d) + + def prepare(self, model: GraphModule, qconfig): + if not self.academic_mode: + model = _fuse_fx(model, self.extra_fuse_dict) + model = self._weight_quant(model, qconfig) + model = self._insert_fake_quantize_for_act_quant(model, qconfig) + return model + + def _find_act_quants(self, model: GraphModule) -> list: + nodes = list(model.graph.nodes) + modules = dict(model.named_modules()) + node_need_to_quantize_output = [] + + def quanlified_node(node): + return (node.op == "call_module" and isinstance(modules[node.target], self.module_type_to_quant_input)) or \ + ((node.op == 'call_function' or node.op == 'call_method') and node.target in self.function_type_to_quant_input) or node.op == 'placeholder' + + def passed_node(node): + return (node.op == 'call_function' and node.target in self._passed_func_type) or \ + (node.op == 'call_module' and isinstance(modules[node.target], self._passed_module_type)) + + prev_nodes_pattern, cur_nodes_pattern = self._propagated_pattern + + def node_in_pattern(node, pattern): + return ((node.op == 'call_function' or node.op == 'call_method') and node.target in pattern['func_type']) or \ + (node.op == "call_module" and isinstance(modules[node.target], pattern['module_type'])) + + def propagated_pattern(prev_node, cur_node): + return node_in_pattern(prev_node, prev_nodes_pattern) and node_in_pattern(cur_node, cur_nodes_pattern) + + for node in nodes: + if (node.op == "call_module" and node.target in self.exclude_module_name) or \ + ((node.op == 'call_function' or node.op == 'call_method') and + node.target in self.exclude_function_type) or \ + node.name in self.exclude_node_name: + continue + if passed_node(node): + continue + if node.op == 'placeholder': + node_need_to_quantize_output.append(node) + continue + is_output = False + # last layer do not quantize + for next_node in node.users: + if next_node.op == 'output': + is_output = True + break + if is_output: + continue + # check propagated pattern + is_propagated_pattern = False + for next_node in node.users: + if propagated_pattern(node, next_node): + is_propagated_pattern = True + break + if is_propagated_pattern: + continue + for next_node in node.users: + if quanlified_node(next_node): + node_need_to_quantize_output.append(node) + break + return node_need_to_quantize_output + + def _weight_quant(self, model: GraphModule, qconfig): + logger.info("Replace module to qat module.") + wqconfig_8bit = copy.deepcopy(qconfig) + wq_symmetry = True if is_symmetric_quant(qconfig.weight.p.keywords['qscheme']) else False + numbits = 8 + logger.info('Now all weight quantizers will effectively use only 7 bits out of 8 bits. This resolves the overflow issue problem on AVX2 and AVX-512 machines.') + wqconfig_8bit.weight.p.keywords['quant_min'] = -2 ** (numbits - 2) if wq_symmetry else 0 + wqconfig_8bit.weight.p.keywords['quant_max'] = 2 ** (numbits - 2) - 1 if wq_symmetry else 2 ** (numbits - 1) - 1 + wqconfig_8bit.weight.p.keywords['factory_kwargs'] = {'not_calc_quant_min_max': True} + if self.academic_mode and wq_symmetry: + wqconfig_8bit.weight.p.keywords['quant_min'] = -2 ** (numbits - 2) + 1 + wqconfig_8bit.weight.p.keywords['quant_max'] = 2 ** (numbits - 2) - 1 + flattened_qconfig_dict = get_flattened_qconfig_dict({'': wqconfig_8bit}) + propagate_qconfig_(model, flattened_qconfig_dict) + self._qat_swap_modules(model, self.additional_qat_module_mapping) + return model + + + def _insert_fake_quantize_for_act_quant( + self, + model: GraphModule, + qconfig: Any): + graph = model.graph + modules = dict(model.named_modules()) + nodes = list(model.graph.nodes) + + quantizer_postfix = "_post_act_fake_quantizer" + node_to_quantize_output = self._find_act_quants(model) + node_to_quantize_output = OrderedDict.fromkeys(node_to_quantize_output).keys() + + aqconfig_8bit = copy.deepcopy(qconfig.activation) + aq_symmetry = True if is_symmetric_quant(qconfig.activation.p.keywords['qscheme']) else False + aqconfig_8bit.p.keywords['quant_min'] = 0 + aqconfig_8bit.p.keywords['quant_max'] = 2 ** 8 - 1 + aqconfig_8bit.p.keywords['factory_kwargs'] = {'not_calc_quant_min_max': True} + + def maybe_unsigned(node): + return ((node.op == 'call_function' or node.op == 'call_method') and node.target in self.function_type_maybe_unsigned) or \ + (node.op == "call_module" and isinstance(modules[node.target], self.module_type_maybe_unsigned)) + + def real_unsigned(node): + return ((node.op == 'call_function' or node.op == 'call_method') and node.target in self.function_type_to_quant_unsigned) or \ + (node.op == "call_module" and isinstance(modules[node.target], self.module_type_to_quant_unsigned)) + + for node in node_to_quantize_output: + if aq_symmetry: + if real_unsigned(node): + logger.info("Set {} post act quantize to 8 bit unsigned type.".format(node.name)) + fake_quantizer = aqconfig_8bit() + elif maybe_unsigned(node): + is_unsigned = False + # bfs to determin1e whether it should be set unsigned activation + queue = [(node, -1)] + bfs_result = dict() + while len(queue) > 0: + cur_node, level = queue.pop(0) + for input_node in cur_node.args: + if isinstance(input_node, torch.fx.node.Node): + queue.append((input_node, level + 1)) + cur_node_is_unsigned = None + if isinstance(cur_node.target, str) and cur_node.target.endswith(quantizer_postfix): + last_fakequantize = getattr(model, cur_node.target) + cur_node_is_unsigned = last_fakequantize.quant_min == 0 + elif real_unsigned(node): + cur_node_is_unsigned = True + + if cur_node_is_unsigned is not None: + if level not in bfs_result: + if len(bfs_result) > 0: + break + else: + bfs_result[level] = cur_node_is_unsigned + else: + bfs_result[level] = bfs_result[level] and cur_node_is_unsigned + queue.clear() + for key in bfs_result: + is_unsigned = bfs_result[key] + break + fake_quantizer = aqconfig_8bit() if is_unsigned else qconfig.activation() + if is_unsigned: + logger.info("Set {} post act quantize to 8 bit unsigned type.".format(node.name)) + else: + fake_quantizer = qconfig.activation() + else: + fake_quantizer = qconfig.activation() + quantizer_name = node.name + quantizer_postfix + setattr(model, quantizer_name, fake_quantizer) + logger.info("Insert act quant {}".format(quantizer_name)) + with graph.inserting_after(node): + inserted_node = graph.create_node("call_module", quantizer_name, (node,), {}) + for _node in nodes: + _node.args = self._fix_succ_recursivly(_node.args, node, inserted_node) + + model.recompile() + model.graph.lint() + return model \ No newline at end of file diff --git a/mqbench/custom_quantizer/tengine_u8_quantizer.py b/mqbench/custom_quantizer/tengine_u8_quantizer.py new file mode 100644 index 0000000..460b327 --- /dev/null +++ b/mqbench/custom_quantizer/tengine_u8_quantizer.py @@ -0,0 +1,79 @@ +import torch +from torch.fx import GraphModule + +from mqbench.utils.registry import register_model_quantizer +from mqbench.utils import getitem2node +from mqbench.prepare_by_platform import BackendType +from mqbench.custom_quantizer import ModelQuantizer + + +@register_model_quantizer(BackendType.Tengine_u8) +class TengineQuantizer(ModelQuantizer): + """ + Tengine needs de-quantization parameters for output. + + Parameters + ---------- + ModelQuantizer : _type_ + _description_ + """ + @property + def _passed_func_type(self): + return ( + torch.flatten, + ) + + @property + def _passed_module_type(self): + # TODO: softmax + return () + + @property + def implicit_merge_patterns(self) -> list: + # Layers which do not need quantize among them. + # In reversed order! + return [] + + @property + def function_type_to_quant_input(self) -> list: + return [ + torch.cat, + torch.nn.functional.hardswish, + torch.nn.functional.sigmoid + ] + super().function_type_to_quant_input + + @property + def module_type_to_quant_input(self) -> tuple: + return ( + torch.nn.Hardswish, + torch.nn.Sigmoid, + ) + super().module_type_to_quant_input + + def _find_act_quants(self, model: GraphModule) -> list: + nodes = list(model.graph.nodes) + modules = dict(model.named_modules()) + node_need_to_quantize_output = super()._find_act_quants(model) + g2node = getitem2node(model) + for node in nodes: + if (node.op == "call_module" and node.target in self.exclude_module_name) or \ + ((node.op == 'call_function' or node.op == 'call_method') and + node.target in self.exclude_function_type) or \ + node.name in self.exclude_node_name: + continue + if (node.op == "call_module" and isinstance(modules[node.target], self.module_type_to_quant_input)) or \ + ((node.op == 'call_function' or node.op == 'call_method') and + node.target in self.function_type_to_quant_input): + for next_node in node.users: + if not ((next_node.op == 'call_function' and next_node.target in self._passed_func_type) or + (next_node.op == 'call_module' and isinstance(modules[next_node.target], self._passed_module_type))): + node_need_to_quantize_output.append(node) + else: + node_need_to_quantize_output.append(next_node) + elif node.op == "output": + for _arg in node.args: + if isinstance(_arg, torch.fx.node.Node): + if _arg.op == 'placeholder': + continue + node_need_to_quantize_output.append(_arg) + node_need_to_quantize_output = [node if node not in g2node else g2node[node] for node in node_need_to_quantize_output] + return node_need_to_quantize_output diff --git a/mqbench/custom_quantizer/tensorrt_quantizer.py b/mqbench/custom_quantizer/tensorrt_quantizer.py new file mode 100644 index 0000000..3dcb5b7 --- /dev/null +++ b/mqbench/custom_quantizer/tensorrt_quantizer.py @@ -0,0 +1,142 @@ +import operator +from typing import List + +import torch +from torch.fx import GraphModule + +import mqbench.nn.qat as qnnqat +from mqbench.utils.logger import logger +from mqbench.utils.registry import register_model_quantizer +from mqbench.prepare_by_platform import BackendType +from mqbench.custom_quantizer import ModelQuantizer + + +class TRTModelQuantizer(ModelQuantizer): + """The different points of TRT quantizer are how to deal with add op + and the last layer. + """ + + def __init__(self, extra_quantizer_dict, extra_fuse_dict): + super().__init__(extra_quantizer_dict, extra_fuse_dict) + + @property + def _merge_add_type(self): + return (torch.nn.Conv2d, torch.nn.Linear) + + def _find_act_quants(self, model: GraphModule) -> set: + nodes = list(model.graph.nodes) + modules = dict(model.named_modules()) + node_need_to_quantize_output = [] + for node in nodes: + if ((node.op == "call_module" and node.target in self.exclude_module_name) or + ((node.op == 'call_function' or node.op == 'call_method') and + node.target in self.exclude_function_type) or + node.name in self.exclude_node_name) and node.name not in self.additional_node_name: + continue + if (node.op == "call_module" and isinstance(modules[node.target], self.module_type_to_quant_input)) or \ + ((node.op == 'call_function' or node.op == 'call_method') and + node.target in self.function_type_to_quant_input) or node.name in self.additional_node_name: + # Add will be merged with previous conv. + input_node_list = list(filter(lambda x: isinstance(x, torch.fx.node.Node), + self._flatten_args(node.args))) + if node.target is operator.add: + merge_node = self._find_add_merge_node(model, input_node_list, node) + if merge_node: + input_node_list.remove(merge_node) + node_need_to_quantize_output.extend(input_node_list) + else: + for _node in input_node_list: + if self._is_implicit_merge(modules, (node, _node)): + continue + if isinstance(_node, torch.fx.node.Node): + node_need_to_quantize_output.append(_node) + return node_need_to_quantize_output + + def _find_add_merge_node(self, model, input_node_list, node): + """Find the first input node which has only one successor from the last. + This kind of node can be merge with add. + """ + input_node_list.reverse() + modules = dict(model.named_modules()) + for input_node in input_node_list: + if input_node.op == 'call_module' and type(modules[input_node.target]) in self._merge_add_type: + succ = 0 + for _node in list(model.graph.nodes): + _node_input_list = self._flatten_args(_node.args) + if input_node in _node_input_list: + succ += 1 + if succ == 1: + return input_node + return None + + +@register_model_quantizer(BackendType.Tensorrt_NLP) +class TensorrtNLPQuantizer(ModelQuantizer): + """ + NLP model quantizer for Tensorrt settings. + We should quantize Linear / Embedding weights. + Linear / Matmul / Add layer inputs(activations). + We notice embedding add(word + pos + token_type) is not quantized, + so we find and skiped. + Add in MSA(add mask) should not be quantized either, we skipped it + by implicit_merge. + """ + @property + def implicit_merge_patterns(self) -> list: + # Layers which do not need quantize among them. + # In reversed order! + return [ + (operator.add, operator.mul), + # Add in MSA block should not be quantized. + (operator.add, operator.truediv) + ] + + @property + def function_type_to_quant_input(self) -> list: + return [ + operator.add, + # Matmul in MSA + torch.matmul + ] + self.additional_function_type + + @property + def module_type_to_quant_input(self) -> tuple: + return ( + # Linear + torch.nn.qat.modules.linear.Linear, + ) + self.additional_module_type + + def _find_act_quants(self, model: GraphModule) -> List: + nodes = list(model.graph.nodes) + modules = dict(model.named_modules()) + node_need_to_quantize_output = [] + for node in nodes: + if ((node.op == "call_module" and node.target in self.exclude_module_name) or + ((node.op == "call_function" or node.op == "all_method") and + node.target in self.exclude_function_type) or + node.name in self.exclude_node_name) and node.name not in self.additional_node_name: + logger.info("Exclude skip: {}".format(node.name)) + continue + if (node.op == "call_module" and isinstance(modules[node.target], self.module_type_to_quant_input)) or \ + ((node.op == "call_function" or node.op == "call_method") and + node.target in self.function_type_to_quant_input) or node.name in self.additional_node_name: + input_node_list = self._flatten_args(node.args) + # Means this is not Tensor + Tensor. + if not all([isinstance(_node, torch.fx.node.Node) for _node in input_node_list]): + continue + # Embedding Add and MSA mask Add should be skipped. + if node.op == "call_function" and node.target == operator.add and \ + self._is_skiped_add(node, modules, input_node_list): + continue + for _node in input_node_list: + if self._is_implicit_merge(modules, (node, _node)): + logger.info("Implicit merge: {} + {}".format(_node.name, node.name)) + continue + node_need_to_quantize_output.append(_node) + return node_need_to_quantize_output + + def _is_skiped_add(self, node, modules, input_node_list): + for _node in input_node_list: + if _node.op == "call_module" and isinstance(modules[_node.target], (qnnqat.Embedding, torch.nn.Embedding)): + logger.info("Skip embedding add: {}".format(node.name)) + return True \ No newline at end of file diff --git a/mqbench/custom_quantizer/total_int_quantizer.py b/mqbench/custom_quantizer/total_int_quantizer.py new file mode 100644 index 0000000..05b45da --- /dev/null +++ b/mqbench/custom_quantizer/total_int_quantizer.py @@ -0,0 +1,57 @@ +import torch +from torch.fx import GraphModule + +from mqbench.utils.registry import register_model_quantizer +from mqbench.prepare_by_platform import BackendType +from mqbench.custom_quantizer import ModelQuantizer + + +@register_model_quantizer(BackendType.PPLCUDA) +@register_model_quantizer(BackendType.SNPE) +@register_model_quantizer(BackendType.PPLW8A16) +class TotalINTQuantizer(ModelQuantizer): + """There is only INT8 calculations in the model. + We quantize the input tensors and output tensors of all layers, + except those in _passed_func_type and _passed_module_type. + For example add + relu pattern, there is no need to insert fake + quantize node between them. + """ + + def __init__(self, extra_quantizer_dict, extra_fuse_dict): + super().__init__(extra_quantizer_dict, extra_fuse_dict) + + @property + def _passed_func_type(self): + return ( + torch.nn.functional.relu, + torch.nn.functional.relu6, + torch.flatten + ) + + @property + def _passed_module_type(self): + return ( + torch.nn.ReLU, + torch.nn.ReLU6 + ) + + def _find_act_quants(self, model: GraphModule) -> list: + nodes = list(model.graph.nodes) + modules = dict(model.named_modules()) + node_need_to_quantize_output = super()._find_act_quants(model) + for node in nodes: + if (node.op == "call_module" and node.target in self.exclude_module_name) or \ + ((node.op == 'call_function' or node.op == 'call_method') and + node.target in self.exclude_function_type) or \ + node.name in self.exclude_node_name: + continue + if (node.op == "call_module" and isinstance(modules[node.target], self.module_type_to_quant_input)) or \ + ((node.op == 'call_function' or node.op == 'call_method') and + node.target in self.function_type_to_quant_input): + for next_node in node.users: + if not ((next_node.op == 'call_function' and next_node.target in self._passed_func_type) or + (next_node.op == 'call_module' and isinstance(modules[next_node.target], self._passed_module_type))): + node_need_to_quantize_output.append(node) + else: + node_need_to_quantize_output.append(next_node) + return node_need_to_quantize_output \ No newline at end of file diff --git a/mqbench/custom_quantizer/vitis_quantizer.py b/mqbench/custom_quantizer/vitis_quantizer.py new file mode 100644 index 0000000..992082f --- /dev/null +++ b/mqbench/custom_quantizer/vitis_quantizer.py @@ -0,0 +1,162 @@ +import operator +from typing import List, NoReturn + +import torch +import torch.nn.intrinsic as nni +from torch.fx import GraphModule +from torch.quantization.quantize_fx import _fuse_fx + +import mqbench.nn.intrinsic as qnni +import mqbench.nn.intrinsic.qat as qnniqat +from mqbench.utils import getitem2node +from mqbench.utils.logger import logger +from mqbench.utils.registry import register_model_quantizer +from mqbench.prepare_by_platform import BackendType +from mqbench.fake_quantize.tqt import TqtFakeQuantize +from mqbench.custom_quantizer.model_quantizer import ModelQuantizer + + +@register_model_quantizer(BackendType.Vitis) +class VitisQuantizer(ModelQuantizer): + """There is only INT8 calculations in the model. + We quantize the input tensors of all layers and the output tensors + of the last layers. We quantize every activations tensors and weight + tensors using this method. NOTE: the acti and weight have different + quantize type. + """ + + def __init__(self, extra_quantizer_dict, extra_fuse_dict): + super().__init__(extra_quantizer_dict, extra_fuse_dict) + self.additional_qat_module_mapping = { + # Intrinsic modules: + nni.ConvBn2d: qnniqat.ConvBn2d, + nni.ConvBnReLU2d: qnniqat.ConvBnReLU2d, + nni.ConvReLU2d: qnniqat.ConvReLU2d, + } + + @property + def module_type_to_quant_input(self) -> tuple: + return super().module_type_to_quant_input + ( + torch.nn.Conv2d, + qnni.ConvBn2d, + qnni.ConvReLU2d, + qnni.ConvBnReLU2d + ) + + @property + def module_type_to_quant_output(self) -> tuple: + return ( + # Conv + torch.nn.intrinsic.qat.modules.conv_fused.ConvBnReLU2d, + torch.nn.intrinsic.qat.modules.conv_fused.ConvBn2d, + torch.nn.qat.modules.conv.Conv2d, + qnniqat.ConvBnReLU2d, + qnniqat.ConvBn2d, + qnniqat.ConvReLU2d, + # ConvTranspose + torch.nn.ConvTranspose2d, + # Linear + torch.nn.qat.modules.linear.Linear, + # Pooling + torch.nn.modules.pooling.AvgPool2d, + torch.nn.modules.pooling.AdaptiveAvgPool2d, + # BN + torch.nn.BatchNorm2d, + torch.nn.ReLU, + # Prelu mostly do not merge. + torch.nn.PReLU, + torch.nn.Upsample, + ) + + + @property + def function_type_to_quant_output(self) -> List: + return [ + operator.add, + operator.mul, + torch.cat, + torch.nn.functional.adaptive_avg_pool2d, + torch.nn.functional.avg_pool2d, + torch.nn.functional.relu, + torch.nn.functional.conv2d, + torch.nn.functional.linear, + torch.nn.functional.interpolate, + ] + + def prepare(self, model: GraphModule, qconfig): + model = _fuse_fx(model, self.extra_fuse_dict) + model = self._weight_quant(model, qconfig) # 就是转换成nnqat module + model = self._insert_fake_quantize_for_act_quant(model, qconfig) # 就是插入act量化节点 + prepared = model + self._set_quant_type(prepared) + return prepared + + + def _find_act_quants(self, model: GraphModule) -> List: + nodes = list(model.graph.nodes) + modules = dict(model.named_modules()) + if hasattr(self, 'node_need_to_quantize_output'): + return self.node_need_to_quantize_output + self.node_need_to_quantize_output = [] + g2node = getitem2node(model) + for node in nodes: + if (node.op == "call_module" and node.target in self.exclude_module_name) or \ + ((node.op == 'call_function' or node.op == 'call_method') and + node.target in self.exclude_function_type) or \ + node.name in self.exclude_node_name: + continue + if (node.op == "call_module" and isinstance(modules[node.target], self.module_type_to_quant_output)) or \ + ((node.op == 'call_function' or node.op == 'call_method') and + node.target in self.function_type_to_quant_output): + self.node_need_to_quantize_output.append(node) + logger.info(f'Add {node.name} to output quantize') + return self.node_need_to_quantize_output + + def _find_input_quants(self, model) -> List: + node_need_to_quantize_weight = [] + nodes = list(model.graph.nodes) + for node in nodes: + if node.op == 'placeholder' and node.all_input_nodes == []: + node_need_to_quantize_weight.append(list(node.users)[0]) + return node_need_to_quantize_weight + + def _find_weight_quants(self, model) -> List: + node_need_to_quantize_weight = [] + nodes = list(model.graph.nodes) + module_dict = dict(model.named_modules()) + for node in nodes: + if node.target in module_dict: + if hasattr(module_dict[node.target], 'weight_fake_quant') or hasattr(module_dict[node.target], 'bias_fake_quant'): + node_need_to_quantize_weight.append(node) + return node_need_to_quantize_weight + + def _set_quant_type(self, model: GraphModule) -> NoReturn: + tensor_type_set = self._find_act_quants(model) + params_type_set = self._find_weight_quants(model) + inputs_type_set = self._find_input_quants(model) + module_dict = dict(model.named_modules()) + quantizer_prefix = "_post_act_fake_quantizer" + + for node in tensor_type_set: + if isinstance(node.name, str) and (node.name + quantizer_prefix) in module_dict: + next_op = module_dict[node.name + quantizer_prefix] + if isinstance(next_op, TqtFakeQuantize): + next_op.set_quant_type('tensor') + logger.info(f'{node.target} has been set to quant type ') + for node in params_type_set: + if isinstance(node.target, str) and node.target in module_dict: + op = module_dict[node.target] + if hasattr(op, 'weight_fake_quant'): + if isinstance(op.weight_fake_quant, TqtFakeQuantize): + op.weight_fake_quant.set_quant_type('param') + logger.info(f'{node.target} has been set to quant type ') + if hasattr(op, 'bias_fake_quant'): + if isinstance(op.bias_fake_quant, TqtFakeQuantize): + op.bias_fake_quant.set_quant_type('param') + logger.info(f'{node.target} has been set to quant type ') + for node in inputs_type_set: + if isinstance(node.target, str) and node.target in module_dict: + next_op = module_dict[node.target] + if isinstance(next_op, TqtFakeQuantize): + next_op.set_quant_type('input') + logger.info(f'{node.target} has been set to quant type ') diff --git a/mqbench/custom_symbolic_opset.py b/mqbench/custom_symbolic_opset.py new file mode 100644 index 0000000..6fcb1f2 --- /dev/null +++ b/mqbench/custom_symbolic_opset.py @@ -0,0 +1,23 @@ +from torch.onnx import register_custom_op_symbolic + +# Register symbolic op for torch.quantize_function op. + +def _fake_quantize_learnable_per_tensor_affine(g, x, scale, zero_point, quant_min, quant_max, grad_factor): + return g.op("::LearnablePerTensorAffine", x, scale, zero_point, quant_min, quant_max) + + +register_custom_op_symbolic('::_fake_quantize_learnable_per_tensor_affine', _fake_quantize_learnable_per_tensor_affine, 11) + + +def fake_quantize_per_channel_affine(g, x, scale, zero_point, ch_axis, quant_min, quant_max): + return g.op("::FixedPerChannelAffine", x, scale, zero_point, ch_axis, quant_min, quant_max) + + +register_custom_op_symbolic('::fake_quantize_per_channel_affine', fake_quantize_per_channel_affine, 11) + + +def fake_quantize_per_tensor_affine(g, x, scale, zero_point, quant_min, quant_max): + return g.op("::FixedPerTensorAffine", x, scale, zero_point, quant_min, quant_max) + + +register_custom_op_symbolic('::fake_quantize_per_tensor_affine', fake_quantize_per_tensor_affine, 11) \ No newline at end of file diff --git a/mqbench/deploy/__init__.py b/mqbench/deploy/__init__.py new file mode 100644 index 0000000..9aed37e --- /dev/null +++ b/mqbench/deploy/__init__.py @@ -0,0 +1,6 @@ +from .deploy_linear import remove_fakequantize_and_collect_params +from .deploy_nnie import remove_fakequantize_and_collect_params_nnie +from .deploy_onnx_qlinear import ONNXQLinearPass +from .deploy_onnx_qnn import ONNXQNNPass +from .deploy_openvino import replace_fakequantize_and_collect_params_openvino +from .deploy_tengine import remove_fakequantize_and_collect_params_tengine diff --git a/mqbench/deploy/common.py b/mqbench/deploy/common.py new file mode 100644 index 0000000..54dab48 --- /dev/null +++ b/mqbench/deploy/common.py @@ -0,0 +1,255 @@ +import copy +import onnx +import numpy as np +from onnx import numpy_helper +from onnx import TensorProto + + +from mqbench.utils.logger import logger + + +class ONNXGraph(object): + def __init__(self, onnx_model_path): + '''Describe onnx graph + args: + input_map[tensor_name] = node which input is tensor_name + output_map[tensor_name] = node which output is tensor_name + ''' + self.model = onnx.load(onnx_model_path) + self.graph = self.model.graph + self.initializer = {} + self.input_map = {} + self.output_map = {} + self.topologize_graph() + self.prepare_initializer() + + def prepare_initializer(self): + self.initializer.clear() + for idx, init in enumerate(self.graph.initializer): + self.initializer[init.name] = (init, idx) + + def get_constant(self, name): + for node in self.model.graph.node: + if node.op_type == 'Constant': + if node.output[0] == name: + return numpy_helper.to_array(node.attribute[0].t).tolist() + + def get_initializer(self, initializer_name): + return numpy_helper.to_array(self.initializer[initializer_name][0]) + + def set_initializer(self, initializer_name, value_tensor, raw=True): + idx = None + if initializer_name in self.initializer: + idx = self.initializer[initializer_name][1] + if raw: + initializer = numpy_helper.from_array(value_tensor) + else: + if value_tensor.dtype == np.float32: + data_type = TensorProto.FLOAT + if value_tensor.dtype == np.uint8: + data_type = TensorProto.UINT8 + if value_tensor.dtype == np.int8: + data_type = TensorProto.INT8 + initializer = onnx.helper.make_tensor(name=initializer_name, + data_type=data_type, + dims=[] if value_tensor.size == 1 else list(value_tensor.shape), + vals=value_tensor, + raw=False) + initializer.name = initializer_name + if idx is not None: + self.graph.initializer.remove(self.graph.initializer[idx]) + self.graph.initializer.append(initializer) + self.prepare_initializer() + + def topologize_graph(self): + self.input_map.clear() + self.output_map.clear() + for node in self.graph.node: + for output_name in node.output: + self.output_map[output_name] = node + for input_name in node.input: + if input_name not in self.input_map: + self.input_map[input_name] = [] + self.input_map[input_name].append(node) + + def get_tensor_producer(self, output_name): + if output_name not in self.output_map: + return 'INPUT_TOKEN' + return self.output_map[output_name] + + def get_tensor_consumer(self, input_name): + if input_name not in self.input_map: + return ['OUTPUT_TOKEN'] + return self.input_map[input_name] + + def save_onnx_model(self, model_path): + onnx.save(self.model, model_path) + + def remove_node_purely(self, node): + self.graph.node.remove(node) + + def insert_node_purely(self, node, idx=0): + self.graph.node.insert(idx, node) + + def del_initializer(self, initializer_name): + if initializer_name in self.initializer: + del(self.initializer[initializer_name]) + + def optimize_model(self): + # Delete redundant nodes. + remove_node_list = [] + for node in self.model.graph.node: + if len(node.input) == 0: + not_be_used = True + for output_name in node.output: + if output_name in self.input_map: + not_be_used = False + break + if not_be_used: + remove_node_list.append(node) + for node in remove_node_list: + self.remove_node_purely(node) + self.topologize_graph() + # Delete redundant initializers. + initializers = copy.deepcopy(self.initializer) + for initializer_name in initializers: + if initializer_name not in self.input_map: + self.del_initializer(initializer_name) + # Make node in topology order. + exist_input = [input_node.name for input_node in self.model.graph.input] + origin_node_num = len(self.model.graph.node) + finished_node_name = [] + # O(n^2) + while len(finished_node_name) < origin_node_num: + node_detect = False + for i in range(origin_node_num): + node = self.model.graph.node[i] + all_inputs_exist = True + for input_name in node.input: + if input_name not in exist_input and input_name not in self.initializer: + all_inputs_exist = False + break + if all_inputs_exist: + if node.name not in finished_node_name: + node_detect = True + finished_node_name.append(node.name) + self.model.graph.node.append(node) + for output_name in node.output: + exist_input.append(output_name) + assert node_detect, "Graph is illegel, error occured!" + for i in range(origin_node_num): + self.model.graph.node.remove(self.model.graph.node[0]) + + def set_opset_version(self, domain, version): + opset_info = copy.deepcopy(self.model.opset_import[0]) + opset_info.domain = domain + opset_info.version = version + self.model.opset_import.insert(0, opset_info) + + +class OnnxPreprocess(object): + def replace_resize_op_with_upsample(self, graph, out2node): + nodes_to_be_removed = [] + idx = 0 + while idx < len(graph.node): + node = graph.node[idx] + if node.op_type == 'Resize': + logger.info(f"Replace resize op: <{node.name}> with upsample.") + mode = 'nearest' + for attr in node.attribute: + if attr.name == 'mode': + mode = attr.s + upsample_node = onnx.helper.make_node('Upsample', + name=node.name, + inputs=[node.input[0], node.input[2]], + outputs=node.output, + mode=mode) + nodes_to_be_removed.append(node) + nodes_to_be_removed.extend(get_constant_inputs(node, out2node)) + graph.node.insert(idx, upsample_node) + idx += 1 + idx += 1 + for node in nodes_to_be_removed: + graph.node.remove(node) + return + + def remove_fake_pad_op(self, graph, name2data, inp2node, out2node): + nodes_to_be_removed = [] + for idx, node in enumerate(graph.node): + if node.op_type == 'Pad': + pads = name2data[node.input[1]] + if all([x == 0 for x in pads]): + logger.info(f"Remove pad op: <{node.name}>.") + next_nodes = inp2node[node.output[0]] + for next_node, idx in next_nodes: + next_node.input[idx] = node.input[0] + nodes_to_be_removed.append(node) + nodes_to_be_removed.extend(get_constant_inputs(node, out2node)) + for node in nodes_to_be_removed: + graph.node.remove(node) + return + + + +def update_inp2node_out2node(graph): + out2node = {} + inp2node = {} + for node in graph.node: + for out in node.output: + # suppose each node only has one output + out2node[out] = node + for idx, inp in enumerate(node.input): + # one node may have multiple inputs + if inp not in inp2node: + inp2node[inp] = [] + inp2node[inp].append([node, idx]) + return out2node, inp2node + + +def prepare_data(graph): + params = {} + for init in graph.initializer: + params[init.name] = numpy_helper.to_array(init) + for node in graph.node: + if node.op_type == "Constant": + for attr in node.attribute: + if attr.name == "value": + params[node.output[0]] = numpy_helper.to_array(attr.t) + return params + + +def prepare_initializer(graph): + named_initializer = {} + for init in graph.initializer: + named_initializer[init.name] = init + return named_initializer + + +def parse_attrs(node_attrs): + attrs = {} + for attr in node_attrs: + if attr.type == onnx.AttributeProto.AttributeType.INTS: + attrs[attr.name] = tuple(attr.ints) + elif attr.type == onnx.AttributeProto.AttributeType.INT: + attrs[attr.name] = attr.i + elif attr.type == onnx.AttributeProto.AttributeType.FLOATS: + attrs[attr.name] = tuple(attr.floats) + elif attr.type == onnx.AttributeProto.AttributeType.FLOAT: + attrs[attr.name] = attr.f + elif attr.type == onnx.AttributeProto.AttributeType.TENSOR: + attrs[attr.name] = numpy_helper.to_array(attr.t) + elif attr.type == onnx.AttributeProto.AttributeType.STRING: + attrs[attr.name] = str(attr.s) + elif attr.type == onnx.AttributeProto.AttributeType.STRINGS: + attrs[attr.name] = tuple([str(x) for x in attr.strings]) + else: + raise Exception("ATTR Type [{}] Not Supported!".format(attr.type)) + return attrs + + +def get_constant_inputs(node, out2node): + node_list = [] + for inp in node.input: + if inp in out2node and out2node[inp].op_type == 'Constant': + node_list.append(out2node[inp]) + return node_list diff --git a/mqbench/deploy/convert_xir.py b/mqbench/deploy/convert_xir.py new file mode 100644 index 0000000..cbfb0e3 --- /dev/null +++ b/mqbench/deploy/convert_xir.py @@ -0,0 +1,1025 @@ +import argparse + +import onnx +import numpy as np + +from onnx import numpy_helper + +from collections import namedtuple +from typing import Any, Dict, Optional +from functools import partial + +from nndct_shared.base import NNDCT_OP +from nndct_shared.nndct_graph.base_tensor import Tensor +from nndct_shared.utils import AddXopError +from nndct_shared.compile.xgraph import XGraph +from nndct_shared.compile.xop_creator import _Converter, _get_xir_attr_from_node, _pack +from pytorch_nndct.parse.op_dispatcher import OpCreator + +class ONNX_OP(object): + CONV2d = 'Conv' + RELU = 'Relu' + MAXPOOL = 'MaxPool' + ADD = 'Add' + GEMM = 'Gemm' + ADPTIVEAVGPOOL2D = 'GlobalAveragePool' + FLATTEN = 'Flatten' + INPUT = 'Input' + RESIZE = 'Resize' + CONCAT = 'Concat' + + +class ONNX_PARAM(object): + WEIGHT = 'weight' + BIAS = 'bias' + ZEROPOINT = 'zero_point' + SCALE = 'scale' + ALL = [WEIGHT, BIAS, ZEROPOINT, SCALE] + + +ONNX2NNDCT_CONVERTOR = { + ONNX_OP.CONV2d: NNDCT_OP.CONV2D, + ONNX_OP.RELU: NNDCT_OP.RELU, + ONNX_OP.MAXPOOL: NNDCT_OP.MAX_POOL, + ONNX_OP.ADD: NNDCT_OP.ADD, + ONNX_OP.GEMM: NNDCT_OP.DENSE, + ONNX_OP.ADPTIVEAVGPOOL2D: NNDCT_OP.ADAPTIVEAVGPOOL2D, + ONNX_OP.FLATTEN: NNDCT_OP.FLATTEN, + ONNX_OP.INPUT: NNDCT_OP.INPUT, + ONNX_OP.RESIZE: NNDCT_OP.RESIZE, + ONNX_OP.CONCAT: NNDCT_OP.CONCAT, +} + +perchannel_fakequantizer = [ + 'FakeQuantizeLearnablePerchannelAffine', 'FixedPerChannelAffine', + 'FakeQuantizeDSQPerchannel', +] +pertensor_fakequantizer = [ + 'LearnablePerTensorAffine', 'FixedPerTensorAffine', + 'FakeQuantizeDSQPertensor', 'FakeQuantizeTqtAffine' +] +output_fakequantizer = [ + 'LearnablePerTensorAffine', 'FakeQuantizeTqtAffine' +] +all_fakequantizer = perchannel_fakequantizer + pertensor_fakequantizer + +_filed = [ + 'name', 'shape', 'op_type', 'in_tensors', 'in_tensors_dim', + 'in_tensors_layout', 'out_tensors_shape', 'out_name', 'op', 'params', + 'attrs' +] +FakeNode = namedtuple( + 'FakeNode', + _filed, +) +FakeNode.__new__.__defaults__ = (None, ) * len(_filed) + + +def data_onnx_op(xgraph: XGraph, node, quant_config): + shape = node.out_tensors_shape + + out_tensor = np.zeros(shape, dtype=np.float32) + attrs: Dict[str, Any] = {} + attrs["shape"] = shape + attrs["data_type"] = _Converter.to_xir_dtype(out_tensor.dtype) + xgraph.create_fixed_normal_op(node.name, + "data", + quant_config, + tensor=out_tensor, + attrs=attrs) + + +def onnx_to_xir(onnx_op_type): + return partial(default_onnx_to_xop, onnx_op_type) + + +def default_onnx_to_xop(onnx_op_type, xgraph, node, quant_config): + attrs = _get_xir_attr_from_node(node) + + input_ops = {} + if node.attrs['has_bound_params']: + for param_name, param_tensor in node.params: + param = xgraph.get_op_by_name(param_name) + head = param_name.split('.')[-1].lower()[0] + if param: + input_ops['weights' if head == 'w' else 'bias'] = [param] + + input_list = [] + for input_name in node.in_tensors: + if node.attrs['has_bound_params'] and is_param_tensor(input_name): + continue + elif is_param_tensor(input_name): + input_op = xgraph.get_op_by_name(input_name) + else: + input_op = xgraph.get_op_by_name(input_name) + input_list.append(input_op) + + input_ops["input"] = xgraph.create_input_fix_ops(input_list, node.name, + quant_config) + + xgraph.create_fixed_normal_op(node.out_name, + onnx_op_type, + quant_config, + attrs=attrs, + input_ops=input_ops) + + + +def resize(xgraph, node, quant_config): + attrs: Dict[str, Any] = {} + attrs["scale"] = node.attrs['scale'] + attrs["align_corners"] = node.attrs['align_corners'] + attrs["half_pixel_centers"] = node.attrs['half_pixel_centers'] + attrs["mode"] = node.attrs['mode'] + attrs["mode"] = {'nearest': "NEAREST"}.get(attrs["mode"].s.decode()) + size = node.attrs['size'] + if size[0] == 0 and size[1] == 0: + input_ops = {} + input_list = [] + for input in node.in_tensors: + input_op = xgraph.get_op_by_name(input) + input_list.append(input_op) + input_ops["input"] = xgraph.create_input_fix_ops(input_list, node.name, quant_config) + xgraph.create_fixed_normal_op( + node.name, "resize", quant_config, attrs=attrs, input_ops=input_ops) + else: + sub_pack_op, pack_list = _pack(xgraph, node, "size", size, quant_config) + input_ops = {} + input_ops["size"] = [sub_pack_op] + input_list = [xgraph.get_op_by_name(node.in_tensors[0])] + input_ops["input"] = input_list + input_ops["input"] = [ + op for op in input_ops["input"] + if op and op.get_name() not in [i.get_name() for i in pack_list] + ] + input_ops["input"] = xgraph.create_input_fix_ops(input_ops["input"], node.name, quant_config) + xgraph.create_fixed_normal_op( + node.out_name, "resize", quant_config, attrs=attrs, input_ops=input_ops) + node_need_to_be_clear = node.attrs['to_remove'] + for n in node_need_to_be_clear: + xgraph.graph.remove_op(xgraph.get_op_by_name(n)) + + +def avgpool(xgraph: XGraph, node, quant_config): + needScale = False + scale = 1.0 + if node.attrs['kernel'] == [3, 3]: + needScale = True + scale = 9.0 * 7.0 / 64.0 + elif node.attrs['kernel'] == [5, 5]: + needScale = True + scale = 25.0 * 10.0 / 256.0 + elif node.attrs['kernel'] in [[6, 6], [3, 6], [6, 3]]: + needScale = True + scale = 36.0 * 7.0 / 256.0 + elif node.attrs['kernel'] == [7, 7]: + needScale = True + scale = 49.0 * 21.0 / 1024.0 + elif node.attrs['kernel'] == [14, 14]: + needScale = True + scale = 196.0 * 21.0 / 4096.0 + + if needScale: + attrs = node.attrs + input_ops = {} + input_ops["input"] = [xgraph.get_op_by_name(node.in_tensors[0])] + input_ops["input"] = xgraph.create_input_fix_ops( + input_ops["input"], node.name, quant_config) + xgraph.create_fixed_normal_op(node.name + '_pool', + "avgpool2d", + quant_config, + attrs=attrs, + input_ops=input_ops) + + scale = [scale] + xgraph.create_fixed_const_op(name=node.name + "_scale", + data=np.array(scale, dtype=np.float32), + quant_info=quant_config) + + input_ops = {} + input_ops["input"] = [ + xgraph.get_op_by_name(node.name + '_pool'), + xgraph.get_op_by_name(node.name + "_scale") + ] + xgraph.create_fixed_normal_op(node.out_name, + "mul", + quant_config, + input_ops=input_ops) + else: + onnx_to_xir("avgpool2d")(xgraph, node, quant_config) + + +def flatten(xgraph: XGraph, node, quant_config): + + if node.in_tensors_dim[0] != 4 or node.in_tensors_layout[ + 0] == Tensor.Layout.NHWC: + onnx_to_xir("flatten")(xgraph, node, quant_config) + else: + attrs: Dict[str, Any] = {} + # NHWC -> NCHW + attrs["order"] = [0, 3, 1, 2] + input_ops = {} + input_ops["input"] = [xgraph.get_op_by_name(node.in_tensors[0])] + xgraph.create_fixed_normal_op(node.name + "_i0", + "transpose", + quant_config, + attrs=attrs, + input_ops=input_ops) + + attrs = node.attrs + + input_ops = {} + input_ops["input"] = [xgraph.get_op_by_name(node.name + "_i0")] + + xgraph.create_fixed_normal_op(node.out_name, + "flatten", + quant_config, + attrs=attrs, + input_ops=input_ops) + + +def dense(xgraph: XGraph, node, quant_config): + input_ops = {} + for param_name, param_tensor in node.params: + param = xgraph.get_op_by_name(param_name) + head = param_name.split('.')[-1].lower()[0] + if head == 'b': + input_ops['bias'] = [param] + else: + weights = xgraph.get_op_by_name(param_name) + + input_list = [] + for input in node.in_tensors: + input_op = xgraph.get_op_by_name(input) + input_list.append(input_op) + input_ops["input"] = xgraph.create_input_fix_ops(input_list, node.name, + quant_config) + input_ops["input"].append(weights) + + attrs: Dict[str, Any] = {} + attrs["transpose_a"] = False + attrs["transpose_b"] = True + + xgraph.create_fixed_normal_op(node.out_name, + "matmul", + quant_config, + attrs=attrs, + input_ops=input_ops) + + +def is_param_tensor(name): + # judge a instance is a parameter tensor or not + return name.split('.')[-1] in ONNX_PARAM.ALL if name else False + + +ONNX2XIR_CONVERTOR = { + ONNX_OP.INPUT: data_onnx_op, + ONNX_OP.CONV2d: onnx_to_xir('conv2d'), + ONNX_OP.ADPTIVEAVGPOOL2D: avgpool, + ONNX_OP.MAXPOOL: onnx_to_xir('maxpool2d'), + ONNX_OP.RELU: onnx_to_xir('relu'), + ONNX_OP.ADD: onnx_to_xir('add'), + ONNX_OP.GEMM: dense, + ONNX_OP.FLATTEN: flatten, + ONNX_OP.RESIZE: resize, + ONNX_OP.CONCAT: onnx_to_xir('concat') +} + + +def update_inp2node_out2node(graph): + out2node = {} + inp2node = {} + for node in graph.node: + for out in node.output: + # suppose each node only has one output + out2node[out] = node + for idx, inp in enumerate(node.input): + # one node may have multiple inputs + if inp not in inp2node: + inp2node[inp] = [] + inp2node[inp].append([node, idx]) + return out2node, inp2node + +def prepare_data(graph): + params = {} + for init in graph.initializer: + params[init.name] = numpy_helper.to_array(init) + for node in graph.node: + if node.op_type == "Constant": + for attr in node.attribute: + if attr.name == "value": + params[node.output[0]] = numpy_helper.to_array(attr.t) + return params + +def prepare_initializer(graph): + named_initializer = {} + for init in graph.initializer: + named_initializer[init.name] = init + return named_initializer + +def parse_attrs(node_attrs): + attrs = {} + for attr in node_attrs: + if attr.type == onnx.AttributeProto.AttributeType.INTS: + attrs[attr.name] = tuple(attr.ints) + elif attr.type == onnx.AttributeProto.AttributeType.INT: + attrs[attr.name] = attr.i + elif attr.type == onnx.AttributeProto.AttributeType.FLOATS: + attrs[attr.name] = tuple(attr.floats) + elif attr.type == onnx.AttributeProto.AttributeType.FLOAT: + attrs[attr.name] = attr.f + elif attr.type == onnx.AttributeProto.AttributeType.TENSOR: + attrs[attr.name] = numpy_helper.to_array(attr.t) + elif attr.type == onnx.AttributeProto.AttributeType.STRING: + attrs[attr.name] = str(attr.s) + elif attr.type == onnx.AttributeProto.AttributeType.STRINGS: + attrs[attr.name] = tuple([str(x) for x in attr.strings]) + else: + raise Exception("ATTR Type [{}] Not Supported!".format(attr.type)) + return attrs + + + +def get_constant_inputs(node, out2node): + node_list = [] + for inp in node.input: + if inp in out2node and out2node[inp].op_type == 'Constant': + node_list.append(out2node[inp]) + return node_list + + +class XIR_process(object): + + bias_fix_point, bias_bitwidth = 0, 8 + + def create_normal_nodes_from_onnx_graph(self, onnx_graph): + normal_nodes = [] + for node in onnx_graph.node: + if node.op_type in ['Constant']: + continue + elif node.op_type == ONNX_OP.CONV2d: + node_attr = {'has_bound_params': True} + node_op = self.get_xop_of_conv2d(node) + input_weight_bias = self.get_unquant_input_weight_bias_of_node( + node) + params = [(input_weight_bias['weight'], + self.name2data[input_weight_bias['weight']])] + if input_weight_bias['bias']: + params.append((input_weight_bias['bias'], + self.name2data[input_weight_bias['bias']])) + + new_node = FakeNode( + name=node.name, + shape=self.name2shape[input_weight_bias['input']], + op_type=node.op_type, + out_tensors_shape=self.name2shape[node.name], + op=node_op, + params=params, + in_tensors=[ + input_weight_bias[k] for k in input_weight_bias.keys() if input_weight_bias[k] + ], + attrs=node_attr, + out_name=node.output[0]) + normal_nodes.append(new_node) + elif node.op_type == ONNX_OP.GEMM: + node_attr = {'has_bound_params': True} + input_weight_bias = self.get_unquant_input_weight_bias_of_node( + node) + params = [(input_weight_bias['weight'], + self.name2data[input_weight_bias['weight']])] + if input_weight_bias['bias']: + params.append((input_weight_bias['bias'], + self.name2data[input_weight_bias['bias']])) + + inputs = [input_weight_bias['input']] + + new_node = FakeNode(name=node.name, + op_type=node.op_type, + params=params, + in_tensors=inputs, + out_name=node.output[0]) + normal_nodes.append(new_node) + elif node.op_type == ONNX_OP.MAXPOOL: + node_attr = {'has_bound_params': False} + node_op = self.get_xop_of_max_pool(node) + inputs = self.get_unquant_inputs(node) + input_weight_bias = self.get_unquant_input_weight_bias_of_node( + node) + new_node = FakeNode( + name=node.name, + shape=self.name2shape[input_weight_bias['input']], + op_type=node.op_type, + out_tensors_shape=self.name2shape[node.name], + op=node_op, + in_tensors=inputs, + attrs=node_attr, + out_name=node.output[0]) + normal_nodes.append(new_node) + elif node.op_type == ONNX_OP.RELU: + node_attr = {'has_bound_params': False} + node_op = self.get_xop_of_relu(node) + inputs = self.get_unquant_inputs(node) + + new_node = FakeNode( + name=node.name, + op_type=node.op_type, + out_tensors_shape=self.name2shape[node.name], + op=node_op, + in_tensors=inputs, + attrs=node_attr, + out_name=node.output[0]) + normal_nodes.append(new_node) + elif node.op_type == ONNX_OP.ADD: + node_attr = {'has_bound_params': False} + inputs = self.get_unquant_inputs(node) + node_op = self.get_xop_of_add(node, inputs) + + new_node = FakeNode( + name=node.name, + shape=self.name2shape[input_weight_bias['input']], + op_type=node.op_type, + out_tensors_shape=self.name2shape[node.name], + op=node_op, + in_tensors=inputs, + attrs=node_attr, + out_name=node.output[0]) + normal_nodes.append(new_node) + elif node.op_type == ONNX_OP.ADPTIVEAVGPOOL2D: + node_op = self.get_xop_of_adaptive_avg_pool2d(node) + inputs = self.get_unquant_inputs(node) + attrs = {} + attrs['kernel'] = self.name2shape[inputs[0]][1:3] + attrs['stride'] = self.name2shape[inputs[0]][1:3] + attrs['count_include_pad'] = True + attrs['global'] = True + attrs['pad'] = [0, 0, 0, 0] + attrs['pad_mode'] = 'FLOOR' + attrs['has_bound_params'] = False + new_node = FakeNode( + name=node.name, + op_type=node.op_type, + op=node_op, + in_tensors=inputs, + out_tensors_shape=self.name2shape[node.name], + attrs=attrs, + out_name=node.output[0]) + normal_nodes.append(new_node) + elif node.op_type == ONNX_OP.FLATTEN: + inputs = self.get_unquant_inputs(node) + node_op = self.get_xop_of_flatten(node) + inputs_dim = [len(self.name2shape[i]) for i in inputs] + # IT IS A BUG OF THE XIR COMPILER for vitis-ai 1.4.1.978 + # inputs_layout = [ + # Tensor.Layout.NHWC + # if self.name2shape[i][-1] > 1 else Tensor.Layout.NCHW + # for i in inputs + # ] + inputs_layout = [Tensor.Layout.NCHW] + start_axis = node.attribute[0].i + end_axis = inputs_dim[0] - 1 + attrs = {} + attrs['start_axis'] = start_axis + attrs['end_axis'] = end_axis + attrs['has_bound_params'] = False + new_node = FakeNode(name=node.name, + op_type=node.op_type, + op=node_op, + in_tensors=inputs, + in_tensors_dim=inputs_dim, + in_tensors_layout=inputs_layout, + attrs=attrs, + out_name=node.output[0]) + normal_nodes.append(new_node) + elif node.op_type == ONNX_OP.RESIZE: + node_op = self.get_xop_of_interpolate(node) + inputs = self.get_unquant_inputs(node) + inputs_layout = [Tensor.Layout.NCHW] + size = numpy_helper.to_array(self.name2data[node.input[3]]) if len(node.input) == 4 else None + scale = self.name2data[node.input[2]] if not size else None + assert scale is None or (scale - scale.astype('int') == 0).all(), f'Only integer scales is supportted! The given scale is {scale}' + if not size: + size = self.name2shape[node.name] + scale = np.array([1, 1]) + attrs_dict = {} + for a in node.attribute: + attrs_dict[a.name] = a + mode = attrs_dict['mode'] + align_corners = True if attrs_dict['coordinate_transformation_mode'] == "align_corners" else False + half_pixel_centers = True if attrs_dict['coordinate_transformation_mode'] == 'pytorch_half_pixel' else False + if size and len(size) == 4: + size = size[1:-1] + attrs = {} + attrs['scale'] = scale + attrs['align_corners'] = align_corners + attrs['half_pixel_centers'] = half_pixel_centers + attrs['mode'] = mode + attrs['size'] = size + attrs['has_bound_params'] = False + if scale is not None: + attrs['to_remove'] = [node.input[2]] + new_node = FakeNode(name=node.name, + op_type=node.op_type, + op=node_op, + in_tensors=inputs, + in_tensors_layout=inputs_layout, + out_tensors_shape=size, + attrs=attrs, + out_name=node.output[0]) + normal_nodes.append(new_node) + elif node.op_type == ONNX_OP.CONCAT: + node_op = self.get_xop_of_concat(node) + inputs = self.get_unquant_inputs(node) + inputs_layout = [Tensor.Layout.NCHW] + size = self.name2shape[node.name] + axis = node.attribute[0].i + dim = axis + attrs = {'axis': dim} + attrs['has_bound_params'] = False + new_node = FakeNode(name=node.name, + op_type=node.op_type, + op=node_op, + in_tensors=inputs, + in_tensors_layout=inputs_layout, + out_tensors_shape=size, + attrs=attrs, + out_name=node.output[0]) + normal_nodes.append(new_node) + return normal_nodes + + def create_input_nodes_from_onnx_graph(self, onnx_graph, reshape=True): + input_nodes = [] + for input_message in onnx_graph.input: + shape = self.get_dim_from_tensor_shape_message(input_message) + if reshape and len(shape) == 4: + shape = list(np.zeros(shape=shape).transpose(0, 2, 3, 1).shape) + node = FakeNode( + name=input_message.name, + shape=self.get_dim_from_tensor_shape_message(input_message), + op_type='Input', + out_tensors_shape=shape) + + input_nodes.append(node) + return input_nodes + + def get_xop_of_concat(self, node): + _n = namedtuple('_n', ['name', 'shape']) + inputs = self.get_unquant_inputs(node) + ts = [_n(i, self.name2shape[i]) for i in inputs] + axis = node.attribute[0].i + dim = axis + return OpCreator(None).cat(ts, dim) + + def get_xop_of_interpolate(self, node): + input = self.out2node[node.input[0]] + _n = namedtuple('_n', ['name', 'shape']) + inputs = self.get_unquant_inputs(node) + input_node = Tensor(name=inputs[0], shape=self.name2shape[inputs[0]]) + # self.graph._graph.node(get_full_name(self.graph.name, node.input[0])).out_tensors[0] + size = numpy_helper.to_array(node.input[3]) if len(node.input) == 4 else None + scale_factor = self.name2data[node.input[2]].tolist() if not size else [1, 1] + if len(scale_factor) == 1: + scale_factor += scale_factor + elif len(scale_factor) == 4: + scale_factor = scale_factor[-2:] + if size and len(size) == 4: + size = size[1:-1] + attrs = node.attribute + attrs_dict = {} + for a in attrs: + attrs_dict[a.name] = a + mode = f"'{attrs_dict['mode'].s.decode()}'" + assert mode == "'nearest'", f'the interpolate {mode} is not supported' + align_corners = True if attrs_dict['coordinate_transformation_mode'].s.decode() == "align_corners" else None + recompute_scale_factor = None + return OpCreator(None)._interpolate(input_node, size, scale_factor, mode, align_corners, recompute_scale_factor) + + def get_xop_of_conv2d(self, node): + pre_op = self.out2node.get(node.input[0], None) + if pre_op and pre_op.op_type in all_fakequantizer: + if pre_op.input[0] in self.out2node: + pre_op = self.out2node[pre_op.input[0]] + elif pre_op.input[0] in self.input_nodes: + pre_op = FakeNode(name=pre_op.input[0]) + input_shape = self.name2shape[pre_op.name] if pre_op else self.name2shape[node.input[0]] + input = np.zeros(input_shape) + weight = self.name2data[self.out2node[node.input[1]].input[0]] + if len(node.input) >= 3: + bias = node.input[2] + else: + bias = np.zeros(weight.shape[-1]) + stride = list(node.attribute[4].ints) + padding = list(node.attribute[3].ints) + dilation = list(node.attribute[0].ints) + transposed = False + output_padding = None + groups = int(node.attribute[1].i) + return OpCreator(None)._convolution(input, weight, bias, stride, + padding, dilation, transposed, + output_padding, groups, None, None, + None) + + def get_xop_of_adaptive_avg_pool2d(self, node): + output_shape = self.name2shape[node.name] + pre_op = self.out2node[node.input[0]] + if pre_op.op_type in all_fakequantizer: + if pre_op.input[0] in self.out2node: + pre_op = self.out2node[pre_op.input[0]] + elif pre_op.input[0] in self.input_nodes: + pre_op = FakeNode(name=pre_op.input[0]) + input_shape = self.name2shape[pre_op.name] + return OpCreator(None).adaptive_avg_pool2d(np.zeros(input_shape), + output_shape[1:3]) + + def get_xop_of_max_pool(self, node): + kernel_size = list(node.attribute[1].ints) + stride = list(node.attribute[3].ints) + padding = list(node.attribute[2].ints) + dilation = [1] + ceil_mode = int(node.attribute[0].i) + return OpCreator(None).max_pool2d(None, kernel_size, stride, padding, + dilation, ceil_mode) + + def get_xop_of_relu(self, node): + return OpCreator(None).relu(None) + + def get_xop_of_add(self, node, inputs): + input_tensor = Tensor(name=inputs[0], + shape=self.name2shape[inputs[0]], + dtype=np.dtype('int8')) + other_tensor = Tensor(name=inputs[1], + shape=self.name2shape[inputs[1]], + dtype=np.dtype('int8')) + return OpCreator(None).add(input_tensor, other_tensor) + + def get_xop_of_flatten(self, node): + inputs = self.get_unquant_inputs(node) + inputs_dim = [len(self.name2shape[i]) for i in inputs] + start_axis = node.attribute[0].i + end_axis = inputs_dim[0] - 1 + return OpCreator(None).flatten(inputs[0], start_axis, end_axis) + + def shape_patch(self, graph, graph_without_quant, reshape=True): + inferred_model = onnx.shape_inference.infer_shapes(graph_without_quant) + value_info = inferred_model.graph.value_info + self.name2shape = {} + self.input_nodes = [] + for out in value_info: + shape = self.get_dim_from_tensor_shape_message(out) + if reshape and len(shape) == 4: + shape = list(np.zeros(shape=shape).transpose(0, 2, 3, 1).shape) + self.name2shape[self.out2node[out.name].name] = shape + self.name2shape[out.name] = shape + for input_message in graph.graph.input: + shape = self.get_dim_from_tensor_shape_message(input_message) + if reshape and len(shape) == 4: + shape = list(np.zeros(shape=shape).transpose(0, 2, 3, 1).shape) + self.name2shape[input_message.name] = shape + self.input_nodes.append(input_message.name) + for output_message in graph.graph.output: + shape = self.get_dim_from_tensor_shape_message(output_message) + if reshape and len(shape) == 4: + shape = list(np.zeros(shape=shape).transpose(0, 2, 3, 1).shape) + if output_message.name in self.out2node: + pre_node = self.out2node[output_message.name] + if pre_node.op_type in all_fakequantizer: + unquant_node = self.out2node[pre_node.input[0]] + input = unquant_node.name + input = unquant_node.output[0] + else: + input = pre_node.name + input = pre_node.output[0] + self.name2shape[input] = shape + self.name2shape[self.out2node[input].name] = shape + self.name2shape[output_message.name] = shape + + + def get_dim_from_tensor_shape_message(self, message): + return [v.dim_value for v in message.type.tensor_type.shape.dim] + + def get_unquant_inputs(self, node): + inputs = [] + for input in node.input: + if input in self.name2data: + inputs.append(input) + elif input in self.out2node and not self.out2node[ + input].op_type in all_fakequantizer: + inputs.append(self.out2node[input].output[0]) + elif input in self.out2node and not self.out2node[ + input].op_type in output_fakequantizer and self.out2node[ + input].op_type in all_fakequantizer: + continue + elif input in self.out2node and self.out2node[ + input].op_type in output_fakequantizer: + input = self.out2node[input].input[0] + if input in self.out2node: + pre_node = self.out2node[input] + if pre_node.op_type in all_fakequantizer: + unquant_node = self.out2node[pre_node.input[0]] + input = unquant_node.name + input = unquant_node.output[0] + else: + input = pre_node.name + input = pre_node.output[0] + inputs.append(input) + elif input in self.inp2node and input not in self.out2node: + inputs.append(input) + return inputs + + def get_unquant_input_weight_bias_of_node(self, node): + input_weight_and_bias = {'input': None, 'weight': None, 'bias': None} + for input in node.input: + type = None + if input in self.name2data: + type = input.split('.')[-1] + elif input in self.out2node and not self.out2node[ + input].op_type in all_fakequantizer: + type = 'input' + if input in self.out2node: + pre_node = self.out2node[input] + if pre_node.op_type in all_fakequantizer: + unquant_node = self.out2node[pre_node.input[0]] + input = unquant_node.name + input = unquant_node.output[0] + else: + input = pre_node.name + input = pre_node.output[0] + elif input in self.out2node and self.out2node[ + input].op_type in all_fakequantizer: + pre_node = self.out2node[input] + real_in = pre_node.input[0] + if real_in in self.name2data: + type = real_in.split('.')[-1] + input = real_in + elif real_in in self.inp2node: + type = 'input' + if real_in in self.out2node: + input = self.out2node[real_in].name + input = self.out2node[real_in].output[0] + else: + input = real_in + elif input in self.inp2node and input not in self.out2node: + type = 'input' + + if type in [ONNX_PARAM.BIAS, ONNX_PARAM.WEIGHT, 'input']: + input_weight_and_bias[type] = input + return input_weight_and_bias + + def parse_bias_qparams_from_data(self, node, name2data): + tensor_name = node.name + bit_width = 8 + max_val = max(-1 * self.name2data[tensor_name].flatten().min(), self.name2data[tensor_name].flatten().max()) + if max_val < 2 ** -10: + sign_shift = -1 + val_shift = -bit_width + elif max_val == -1 * self.name2data[tensor_name].flatten().min(): + sign_shift = 0 + val_shift = -np.round(np.log2(max_val)) + else: + sign_shift = 1 + val_shift = -np.round(np.log2(max_val)) + sym_fix = int(bit_width - sign_shift + val_shift - 1) + return tensor_name, sym_fix, bit_width + + def get_quant_weight_loss(self, unquant_weight, amp, val_max): + real_weight = unquant_weight * amp + real_weight = np.round(np.clip(real_weight, -val_max, val_max - 1)) + real_weight /= amp + return float(((real_weight - unquant_weight)**2).sum()) + + def parse_qparams(self, node, name2data): + tensor_name, scale, zero_point = node.input[:3] + scale, zero_point = name2data[scale], name2data[zero_point] + if len(node.input) > 3: + qmin, qmax = node.input[-2:] + qmin, qmax = name2data[qmin], name2data[qmax] + elif len(node.attribute) > 0: + qparams = parse_attrs(node.attribute) + qmin = qparams['quant_min'] + qmax = qparams['quant_max'] + else: + print(f'qmin and qmax are not found for <{node.name}>!') + raise ValueError('The name2data is corrputed.') + + if abs(zero_point - 0).all() < 1e-5: + bit_width = np.log2(qmax - qmin + 1).astype(int) + final_scale = int(np.floor(np.log2(1 / scale))) + else: + print(f'<{node.name}> is a asym quant node, which is not support by Vitis Backend') + return tensor_name, final_scale, bit_width + + def get_wbi_of_onnx_calib(self, graph, calib_graph): + self.biasname2wi = {} + for node in calib_graph.node: + if node.op_type in [ONNX_OP.CONV2d, ONNX_OP.GEMM]: + input_pre_fix = node.input[0] + weight_pre_fix = node.input[1] + if len(node.input) > 2: + bias_fix = node.input[2] + self.biasname2wi[bias_fix] = [weight_pre_fix, input_pre_fix] + else: + bias_fix = None + + def get_quant_config_of_onnx(self, graph, name): + qconfig = {} + + output_config = {} + for node in graph.node: + if node.op_type in output_fakequantizer: + output_name, fix_point, bitwidth = self.parse_qparams( + node, self.name2data) + output_config[output_name] = [bitwidth, fix_point] + + param_config = {} + for param in graph.initializer: + ptype = param.name[param.name.rfind('.') + 1:] + data_type = param.data_type + if ptype in [ONNX_PARAM.WEIGHT + ] or (ptype in [ONNX_PARAM.BIAS] + and self.inp2node[param.name][0][0].op_type + in all_fakequantizer): + _, fix_point, bitwidth = self.parse_qparams( + self.inp2node[param.name][0][0], self.name2data) + param_config[param.name] = [bitwidth, fix_point] + elif ptype in [ONNX_PARAM.BIAS] and not self.inp2node[ + param.name][0][0].op_type in all_fakequantizer: + bitwidth = self.bias_bitwidth + _, fix_point, bitwidth = self.parse_bias_qparams_from_data(param, self.name2data) + param_config[param.name] = [bitwidth, fix_point] + elif ptype in [ONNX_PARAM.ZEROPOINT, ONNX_PARAM.SCALE]: + continue + else: + if param.name in self.inp2node: + print(f'A data array named {param.name} with {numpy_helper.to_array(param)} has been used.') + + output_config = {} + for node in graph.node: + if node.op_type in output_fakequantizer: + output_name, fix_point, bitwidth = self.parse_qparams( + node, self.name2data) + output_config[output_name] = [bitwidth, fix_point] + + input_config = {} + + qconfig['param'] = param_config + qconfig['output'] = output_config + qconfig['input'] = input_config + + return qconfig + + def do_compile(self, + onnx_graph_file, + onnx_graph_file_cali, + name=None, + graph_attr_kwargs: Optional[Dict[str, Any]] = None, + reshape=True) -> None: + # get the onnx graph + onnx_graph = onnx_graph_file.graph + # create a xgraph like do_compile + xgraph = XGraph(name if name else onnx_graph.name) + self.graph = xgraph + + # build the inter-node via the in/out infomation + self.out2node, self.inp2node = update_inp2node_out2node(onnx_graph) + + # add the extra args + if graph_attr_kwargs is not None: + for name, attr in graph_attr_kwargs.items(): + xgraph.graph.set_attr(name, attr) + + # get the weight/bias in the initializer + self.name2data = prepare_data(onnx_graph) + # get the input/output + self.out2node, self.inp2node = update_inp2node_out2node(onnx_graph) + # patch the wbi pairs + self.get_wbi_of_onnx_calib(onnx_graph, onnx_graph_file_cali.graph) + # create weight/bias node via FakeQuantizeLearnablePerchannelAffine + quant_config_info = self.get_quant_config_of_onnx(onnx_graph, name) + # patch the shape + self.shape_patch(onnx_graph_file, + onnx_graph_file_cali, + reshape=reshape) + + op_to_xir_op = ONNX2NNDCT_CONVERTOR + + def get_op_of_initializer(name): + if get_type_of_initializer(name) in [ + ONNX_PARAM.ZEROPOINT, ONNX_PARAM.SCALE + ]: + return None + if name not in self.inp2node: + return None + node = self.inp2node[name][0][0] + if node.op_type in all_fakequantizer: + node = self.inp2node[node.output[0]][0][0] + ret_type = op_to_xir_op[ + node.op_type] if node.op_type in op_to_xir_op.keys() else node.op_type + return ret_type + + def get_type_of_initializer(name): + name = name[name.rfind('.') + 1:] + if name in ONNX_PARAM.ALL: + return name + else: + return None + + implemented_op = [ + ONNX2NNDCT_CONVERTOR[i] for i in ONNX2NNDCT_CONVERTOR.keys() + ] + implemented_op += all_fakequantizer + + + print('Essential data has been collected by the Vitis backend compiler.') + for node in onnx_graph.initializer: + op_type = get_op_of_initializer(node.name) + if op_type is None: + continue + param_type = get_type_of_initializer(node.name) + if op_type in [ + NNDCT_OP.BATCH_NORM, NNDCT_OP.BATCH_NORM1D, + NNDCT_OP.BATCH_NORM3D + ]: + print('BN should have been merged in previous precess!') + raise Exception() + if xgraph.get_op_by_name(node.name): + continue + data = self.name2data[node.name] + if op_type == NNDCT_OP.CONV2D and param_type == ONNX_PARAM.WEIGHT: + # do weight reshape from oikk to okki + data = data.transpose(0, 2, 3, 1) + data = np.ascontiguousarray(data) + if op_type in implemented_op is False: + raise NotImplementedError( + f'{op_type} has not been implemented.') + + try: + xgraph.create_fixed_const_op(name=node.name, + data=data, + quant_info=quant_config_info) + except Exception as e: + raise AddXopError(node.name, 'const', str(e)) + + unknown_op_types = { + f"{node.op_type}({node.name})" + for node in onnx_graph.node + if node.op_type not in ONNX2NNDCT_CONVERTOR + and node.op_type not in all_fakequantizer + ['Constant'] + } + if not unknown_op_types: + input_nodes = self.create_input_nodes_from_onnx_graph( + onnx_graph, reshape=reshape) + for node in input_nodes: + try: + print(f'Trying to insert {node.name}<{node.op_type}> into the Vitis Call-Graph.') + ONNX2XIR_CONVERTOR.get(node.op_type, + None)(xgraph, node, + quant_config_info) + except Exception as e: + raise AddXopError(node.name, node.op_type, str(e)) + # before that need to insert input + normal_node = self.create_normal_nodes_from_onnx_graph(onnx_graph) + for node in normal_node: + if node.op_type in all_fakequantizer + ['Constant']: + continue + try: + ONNX2XIR_CONVERTOR.get(node.op_type, + None)(xgraph, node, + quant_config_info) + except Exception as e: + raise AddXopError(node.name, node.op_type, str(e)) + else: + raise AddXopError(unknown_op_types) + + return_ops = [] + print('Trying to append into the Vitis Call-Graph.') + for out in onnx_graph.output: + if out.name in self.out2node: + pre_node = self.get_unquant_inputs(self.out2node[out.name])[0] + if xgraph.get_op_by_name(pre_node + '_fix'): + return_ops.append(pre_node + '_fix') + else: + return_ops.append(pre_node) + + if return_ops: + xgraph.graph.set_attr("return_ops", return_ops) + + if name: + if quant_config_info is None: + name += '_float' + else: + name += '_int' + + xgraph.export_to_xmodel(name) + print('Finished exporting the Vitis Xmodel.') + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument("-Q", "--qmodel", help="onnx model with fake quantize nodes.", required=True) + parser.add_argument("-C", "--cmodel", help="onnx model without fake quantize nodes, or deploy model.", required=True) + parser.add_argument("-N", "--name", help="model name", required=True) + args = parser.parse_args() + + xir_compiler = XIR_process() + qmodel = onnx.load(args.qmodel) + cmodel = onnx.load(args.cmodel) + xir_compiler.do_compile(qmodel, cmodel, args.name) + print('MQBench has converted the model into xmodel.') diff --git a/mqbench/deploy/deploy_linear.py b/mqbench/deploy/deploy_linear.py new file mode 100644 index 0000000..8dd4deb --- /dev/null +++ b/mqbench/deploy/deploy_linear.py @@ -0,0 +1,257 @@ +import json +import os + + +import onnx +import numpy as np +from onnx import numpy_helper + +from mqbench.utils.logger import logger +from mqbench.deploy.common import ( + update_inp2node_out2node, + prepare_initializer, + prepare_data, + OnnxPreprocess, + get_constant_inputs, + parse_attrs +) + + +PERCHANNEL_FAKEQUANTIZER = ['FakeQuantizeLearnablePerchannelAffine', + 'FixedPerChannelAffine', + 'FakeQuantizeDSQPerchannel'] +PERTENSOR_FAKEQUANTIZER = ['LearnablePerTensorAffine', + 'FixedPerTensorAffine', + 'FakeQuantizeDSQPertensor', + 'FakeQuantizeTqtAffine'] +ALL_FAKEQUANTIZER = PERCHANNEL_FAKEQUANTIZER + PERTENSOR_FAKEQUANTIZER + + +class LinearQuantizer_process(object): + # some method like dorefa need pre-compute weights + def weight_preprocess(self, target_tensor, out2node, inp2node, named_initializer): + def find_weight(tensor): + if tensor not in named_initializer: + _node = out2node[tensor] + for inp in _node.input: + return find_weight(inp) + return tensor + weight = find_weight(target_tensor) + + # TODO need more general method, like onnxruntime infer + data = numpy_helper.to_array(named_initializer[weight]) + data = np.tanh(data) + data = data / (np.max(np.abs(data)) + 1e-5) + data = numpy_helper.from_array(data) + named_initializer[weight].raw_data = data.raw_data + + redundant_nodes = [] + + def find_redundant_nodes(tensor): + if tensor == target_tensor: + return + nodes = inp2node[tensor] + for node, idx in nodes: + if node not in redundant_nodes: + redundant_nodes.append(node) + redundant_nodes.extend(get_constant_inputs(node, out2node)) + find_redundant_nodes(node.output[0]) + find_redundant_nodes(weight) + return weight, redundant_nodes + + def deal_with_weight_fakequant(self, node, out2node, inp2node, named_initializer): + next_nodes = inp2node[node.output[0]] + assert len(next_nodes) == 1 + next_node, idx = next_nodes[0] + assert next_node.op_type in ['Conv', 'Gemm', 'ConvTranspose'] + redundant_nodes = [] + if node.input[0] not in named_initializer: + node.input[0], redundant_nodes = \ + self.weight_preprocess(node.input[0], out2node, inp2node, named_initializer) + next_node.input[idx] = node.input[0] + return redundant_nodes + + def deal_with_activation_fakequant(self, node, inp2node): + next_nodes = inp2node[node.output[0]] + for next_node, idx in next_nodes: + next_node.input[idx] = node.input[0] + return + + def parse_qparams(self, node, name2data): + tensor_name, scale, zero_point = node.input[:3] + scale, zero_point = name2data[scale], name2data[zero_point] + if len(node.input) > 3: + qmin, qmax = node.input[-2:] + qmin, qmax = name2data[qmin], name2data[qmax] + elif len(node.attribute) > 0: + qparams = parse_attrs(node.attribute) + qmin = qparams['quant_min'] + qmax = qparams['quant_max'] + else: + logger.info(f'qmin and qmax are not found for <{node.name}>!') + return tensor_name, scale, zero_point, qmin, qmax + + def clip_weight(self, node, name2data, inp2node, named_initializer): + tensor_name, scale, zero_point, qmin, qmax = self.parse_qparams(node, name2data) + data = name2data[tensor_name] + clip_range_min = ((qmin - zero_point) * scale).astype(data.dtype) + clip_range_max = ((qmax - zero_point) * scale).astype(data.dtype) + if len(scale.shape) > 0 and scale.shape[0] > 1: + new_data = [] + transposed = False + next_node = inp2node[node.output[0]] + if len(next_node) == 1 and next_node[0][0].op_type == 'ConvTranspose': + transposed = True + data = data.transpose(1, 0, 2, 3) + for c in range(data.shape[0]): + new_data.append(np.clip(data[c], clip_range_min[c], clip_range_max[c])) + new_data = np.array(new_data) + if transposed: + new_data = new_data.transpose(1, 0, 2, 3) + logger.info(f'Clip weights <{tensor_name}> to per-channel ranges.') + else: + new_data = np.clip(data, clip_range_min, clip_range_max) + logger.info(f'Clip weights <{tensor_name}> to range [{clip_range_min}, {clip_range_max}].') + new_data = numpy_helper.from_array(new_data) + named_initializer[tensor_name].raw_data = new_data.raw_data + + def post_process_clip_ranges(self, clip_ranges, graph, inp2node): + def find_the_closest_clip_range(node): + if node.input[0] in clip_ranges: + return node.input[0] + elif node.op_type in ['Flatten', 'Resize'] and node.output[0] in inp2node: + return find_the_closest_clip_range(inp2node[node.output[0]][0][0]) + else: + return None + + for node in graph.node: + if node.op_type in ['Flatten', 'Resize']: + tensor_name = find_the_closest_clip_range(node) + if tensor_name: + clip_ranges[node.input[0]] = clip_ranges[tensor_name] + logger.info(f'Pass <{tensor_name}> clip range to <{node.name}> input <{node.input[0]}>.') + return clip_ranges + + def remove_fakequantize_and_collect_params(self, onnx_path, model_name, backend): + model = onnx.load(onnx_path) + graph = model.graph + out2node, inp2node = update_inp2node_out2node(graph) + name2data = prepare_data(graph) + named_initializer = prepare_initializer(graph) + + preprocess = OnnxPreprocess() + preprocess.remove_fake_pad_op(graph, name2data, inp2node, out2node) + out2node, inp2node = update_inp2node_out2node(graph) + + clip_ranges = {} + nodes_to_be_removed = [] + for node in graph.node: + if node.op_type in ALL_FAKEQUANTIZER: + nodes_to_be_removed.append(node) + nodes_to_be_removed.extend(get_constant_inputs(node, out2node)) + + if node.op_type in PERCHANNEL_FAKEQUANTIZER: + # fake quantize for weights, suppose per-channel quantize only for weight + redundant_nodes = self.deal_with_weight_fakequant(node, out2node, inp2node, named_initializer) + nodes_to_be_removed.extend(redundant_nodes) + self.clip_weight(node, name2data, inp2node, named_initializer) + if backend == 'ppl': + tensor_name, scale, zero_point, qmin, qmax = self.parse_qparams(node, name2data) + clip_ranges[tensor_name] = {'step': [float(x) for x in scale], + 'zero_point': [int(x) for x in zero_point], + 'min': [float(x) for x in scale * (qmin - zero_point)], + 'max': [float(x) for x in scale * (qmax - zero_point)], + 'bit': int(np.log2(qmax - qmin + 1)), + 'type': "biased", + } + elif backend == 'vitis': + logger.info("Vitis-DPU does not support per-channel quatization.") + raise NotImplementedError("Vitis-DPU does not support per-channel quatization.") + + + elif node.op_type in PERTENSOR_FAKEQUANTIZER: + if node.output[0] not in inp2node: + assert node.output[0] in [l.name for l in graph.output] + inp2node[node.output[0]] = [] + next_nodes = inp2node[node.output[0]] + if len(next_nodes) == 1 and next_nodes[0][1] == 1 and next_nodes[0][0].op_type in ['Gemm', 'Conv']: + # fake quantize for weights + redundant_nodes = self.deal_with_weight_fakequant(node, out2node, inp2node, named_initializer) + tensor_name, scale, zero_point, qmin, qmax = self.parse_qparams(node, name2data) + nodes_to_be_removed.extend(redundant_nodes) + self.clip_weight(node, name2data, inp2node, named_initializer) + elif len(next_nodes) == 1 and next_nodes[0][1] == 2 and next_nodes[0][0].op_type in ['Gemm', 'Conv']: + # fake quantize for bias + assert backend == 'vitis' + redundant_nodes = self.deal_with_weight_fakequant(node, out2node, inp2node, named_initializer) + tensor_name, scale, zero_point, qmin, qmax = self.parse_qparams(node, name2data) + nodes_to_be_removed.extend(redundant_nodes) + self.clip_weight(node, name2data, inp2node, named_initializer) + else: + # fake quantize for activations + self.deal_with_activation_fakequant(node, inp2node) + tensor_name, scale, zero_point, qmin, qmax = self.parse_qparams(node, name2data) + for out in graph.output: + if out.name == node.output[0]: + out.name = tensor_name + + if backend == 'tensorrt': + clip_ranges[tensor_name] = float(scale * max(-qmin, qmax)) + elif backend == 'snpe': + clip_ranges[tensor_name] = [ + {'bitwidth': int(np.log2(qmax - qmin + 1)), + 'min': float(scale * (qmin - zero_point)), + 'max': float(scale * (qmax - zero_point))} + ] + if backend == 'ppl': + clip_ranges[tensor_name] = {'step': float(scale), + 'zero_point': int(zero_point), + 'min': float(scale * (qmin - zero_point)), + 'max': float(scale * (qmax - zero_point)), + 'bit': int(np.log2(qmax - qmin + 1)), + 'type': "biased", + } + elif backend == 'vitis': + clip_ranges[tensor_name] = {'scale': float(scale)} + elif backend == 'ppl-cuda': + clip_ranges[tensor_name] = float(max(-scale * (qmin - zero_point), scale * (qmax - zero_point))) + + for node in nodes_to_be_removed: + graph.node.remove(node) + # delete initializer + out2node, inp2node = update_inp2node_out2node(graph) + named_initializer = prepare_initializer(graph) + for name, initial_data in named_initializer.items(): + if name in (out2node.keys() | inp2node.keys()): + continue + graph.initializer.remove(initial_data) + + clip_ranges = self.post_process_clip_ranges(clip_ranges, graph, inp2node) + if backend == 'tensorrt': + context = {"tensorrt": {"blob_range": clip_ranges}} + elif backend == 'snpe': + context = {'activation_encodings': clip_ranges, 'param_encodings': {}} + elif backend == 'ppl': + context = {"ppl": clip_ranges} + elif backend == 'vitis': + context = {'vitis': clip_ranges} + elif backend == 'ppl-cuda': + context = {'ppl-cuda': clip_ranges} + output_path = os.path.dirname(onnx_path) + context_filename = os.path.join(output_path, '{}_clip_ranges.json'.format(model_name)) + with open(context_filename, 'w') as f: + json.dump(context, f, indent=4) + onnx_filename = os.path.join(output_path, '{}_deploy_model.onnx'.format(model_name)) + onnx.save(model, onnx_filename) + if backend == 'ppl-cuda': + with open(context_filename, 'w') as f: + for k, v in clip_ranges.items(): + f.write('{}: {}\n'.format(k, v)) + if backend == 'vitis': + logger.info(f"To finish xmodel converting process, call \ + $ mqbench.deploy.convert_xir -Q {onnx_filename} -C {onnx_path} -N \ + in the mqbench docker built from Dockerfile") + logger.info("Finish deploy process.") + + +remove_fakequantize_and_collect_params = LinearQuantizer_process().remove_fakequantize_and_collect_params diff --git a/mqbench/deploy/deploy_nnie.py b/mqbench/deploy/deploy_nnie.py new file mode 100644 index 0000000..ea41f2b --- /dev/null +++ b/mqbench/deploy/deploy_nnie.py @@ -0,0 +1,102 @@ +import json +import os + + +import onnx +import numpy as np +from onnx import numpy_helper + +from mqbench.utils.logger import logger +from mqbench.deploy.common import ( + update_inp2node_out2node, + prepare_initializer, + prepare_data, + OnnxPreprocess, + get_constant_inputs +) + + +class NNIE_process(object): + def gen_gfpq_param_file(self, graph, clip_val): + nnie_exclude_layer_type = ['Flatten', 'Relu', 'PRelu', 'Sigmoid', 'Reshape', + 'Softmax', 'CaffeSoftmax', 'Clip', 'GlobalAveragePool', 'Mul'] + interp_layer_cnt = 0 + gfpq_param_dict = {} + for idx, node in enumerate(graph.node): + # We can not support NNIE group conv. + # Group conv need group-size input params. + if node.op_type == 'Conv' and node.attribute[1].i != 1: + continue + + layer_input_tensor = [] + for in_tensor in node.input: + if in_tensor in clip_val: + clip_value = clip_val[in_tensor] + layer_input_tensor.append(float(clip_value)) + # Upsample layer only reserve one input. + if node.op_type in ['Upsample', 'DynamicUpsample']: + break + + if node.op_type not in nnie_exclude_layer_type and len(layer_input_tensor) > 0: + gfpq_param_dict[node.name] = layer_input_tensor + + # Upsample ---> Upsample + Permute in NNIE. + if node.op_type in ['Upsample', 'DynamicUpsample']: + interp_layer_name = node.name + gfpq_param_dict[interp_layer_name + '_permute_' + str(interp_layer_cnt)] = gfpq_param_dict[interp_layer_name] + interp_layer_cnt += 1 + return gfpq_param_dict + + def remove_fakequantize_and_collect_params(self, onnx_path, model_name): + model = onnx.load(onnx_path) + graph = model.graph + out2node, inp2node = update_inp2node_out2node(graph) + name2data = prepare_data(graph) + named_initializer = prepare_initializer(graph) + + preprocess = OnnxPreprocess() + preprocess.replace_resize_op_with_upsample(graph, out2node) + preprocess.remove_fake_pad_op(graph, name2data, inp2node, out2node) + out2node, inp2node = update_inp2node_out2node(graph) + + nodes_to_be_removed = [] + clip_ranges = {} + for node in graph.node: + if node.op_type == 'NNIEQuantize': + next_nodes = inp2node[node.output[0]] + if len(next_nodes) == 1 and next_nodes[0][1] == 1 and next_nodes[0][0].op_type in ['Gemm', 'Conv']: + # fake quantize for weights + next_node, idx = next_nodes[0] + next_node.input[idx] = node.input[0] + # clip weights + tensor_name = node.input[0] + data = name2data[tensor_name] + clip_range = name2data[node.input[1]] + new_data = np.clip(data, -clip_range, clip_range) + new_data = numpy_helper.from_array(new_data) + named_initializer[tensor_name].raw_data = new_data.raw_data + logger.info(f'Clip weights {tensor_name} to range [{-clip_range}, {clip_range}].') + else: + # fake quantize for activations + clip_ranges[node.input[0]] = name2data[node.input[1]] + for next_node, idx in next_nodes: + next_node.input[idx] = node.input[0] + + nodes_to_be_removed.append(node) + nodes_to_be_removed.extend(get_constant_inputs(node, out2node)) + + for node in nodes_to_be_removed: + graph.node.remove(node) + + gfpq_param_dict = self.gen_gfpq_param_file(graph, clip_ranges) + + output_path = os.path.dirname(onnx_path) + gfpq_param_file = os.path.join(output_path, '{}_gfpq_param_dict.json'.format(model_name)) + with open(gfpq_param_file, 'w') as f: + json.dump({"nnie": {"gfpq_param_dict": gfpq_param_dict}}, f, indent=4) + onnx_filename = os.path.join(output_path, '{}_deploy_model.onnx'.format(model_name)) + onnx.save(model, onnx_filename) + logger.info("Finish deploy process.") + + +remove_fakequantize_and_collect_params_nnie = NNIE_process().remove_fakequantize_and_collect_params \ No newline at end of file diff --git a/mqbench/deploy/deploy_onnx_qlinear.py b/mqbench/deploy/deploy_onnx_qlinear.py new file mode 100644 index 0000000..3c9d46f --- /dev/null +++ b/mqbench/deploy/deploy_onnx_qlinear.py @@ -0,0 +1,146 @@ +import numpy as np +import onnx +import os + +from mqbench.utils.logger import logger +from onnx import numpy_helper +from .deploy_onnx_qnn import ONNXQNNPass, FAKE_QUANTIZE_OP +from .common import parse_attrs, prepare_data, prepare_initializer + + + +class ONNXQLinearPass(ONNXQNNPass): + def __init__(self, onnx_model_path): + super(ONNXQLinearPass, self).__init__(onnx_model_path) + self.onnx_model_path = onnx_model_path + + def parse_qparams(self, node, name2data): + tensor_name, scale, zero_point = node.input[:3] + scale, zero_point = name2data[scale], name2data[zero_point] + if len(node.input) > 3: + qmin, qmax = node.input[-2:] + qmin, qmax = name2data[qmin], name2data[qmax] + elif len(node.attribute) > 0: + qparams = parse_attrs(node.attribute) + qmin = qparams['quant_min'] + qmax = qparams['quant_max'] + else: + logger.info(f'qmin and qmax are not found for <{node.name}>!') + return tensor_name, scale, zero_point, qmin, qmax + + def clip_weight(self, node, name2data, named_initializer): + tensor_name, scale, zero_point, qmin, qmax = self.parse_qparams(node, name2data) + data = name2data[tensor_name] + clip_range_min = (qmin - zero_point) * scale + clip_range_max = (qmax - zero_point) * scale + if scale.shape[0] > 1: + new_data = [] + next_node = self.onnx_model.get_tensor_consumer(node.output[0])[0] + if next_node.op_type == 'ConvTranspose': + for c in range(data.shape[1]): + new_data.append(np.clip(data[:, c], clip_range_min[c], clip_range_max[c])) + else: + for c in range(data.shape[0]): + new_data.append(np.clip(data[c], clip_range_min[c], clip_range_max[c])) + new_data = np.array(new_data) + logger.info(f'Clip weights <{tensor_name}> to per-channel ranges.') + else: + new_data = np.clip(data, clip_range_min, clip_range_max) + logger.info(f'Clip weights <{tensor_name}> to range [{clip_range_min}, {clip_range_max}].') + new_data = numpy_helper.from_array(new_data) + named_initializer[tensor_name].raw_data = new_data.raw_data + + def wrap_onnx_constant(self, data): + """warp onnx constant data to iterable numpy object + + Args: + data (float or list): data from onnx.get_constant + + Returns: + ndarray: iterable numpy array + """ + if type(data) != list: + return np.array([data]) + else: + return np.array(data) + + def format_qlinear_dtype_pass(self): + name2data = prepare_data(self.onnx_model.graph) + named_initializer = prepare_initializer(self.onnx_model.graph) + for node in self.onnx_model.graph.node: + if node.op_type in FAKE_QUANTIZE_OP: + if node.op_type == 'FakeQuantizeLearnablePerchannelAffine': + scale, zero_point = node.input[1], node.input[2] + assert node.attribute[0].name == 'quant_max' and node.attribute[1].name == 'quant_min' + qmax = node.attribute[0].i + qmin = node.attribute[1].i + else: + scale, zero_point, qmin, qmax = node.input[-4:] + qmin = self.onnx_model.get_constant(qmin) + qmax = self.onnx_model.get_constant(qmax) + assert qmax - qmin in (2 ** 8 - 1, 2 ** 8 - 2), "Only 8 bit quantization support deployment to ONNX." + # In onnx, quantize linear node value is within [-128, 127]. This step is to remove inconsistency for + # fake quantize node which clips to [-127, 127] by clipping its value to [-127 * scale, 127 * scale] + # in advance + # Notice: If the node is not a weight node, then the inconsistency between onnx model and pytorch + # model persists. + if qmax - qmin == 2 ** 8 - 2 and node.op_type == 'FakeQuantizeLearnablePerchannelAffine': + self.clip_weight(node, name2data, named_initializer) + # ? for model mixed constant and initializer + # scale + try: + scale_proto = self.onnx_model.initializer[scale][0] + if scale_proto.raw_data != b'': + scale_data = self.onnx_model.get_initializer(scale) + self.onnx_model.set_initializer(scale, scale_data.astype(np.float32), raw=False) + except KeyError: + scale_data = self.wrap_onnx_constant(self.onnx_model.get_constant(scale)) + self.onnx_model.set_initializer(scale, scale_data.astype(np.float32), raw=False) + # zero_point + try: + zero_point_data = self.onnx_model.get_initializer(zero_point) + except KeyError: + zero_point_data = self.wrap_onnx_constant(self.onnx_model.get_constant(zero_point)) + assert not np.any(zero_point_data != 0), "This pass is only supposed to be used with TensorRT Backend which" \ + "does not support asymmetric quantization." + if qmin == 0: + self.onnx_model.set_initializer(zero_point, zero_point_data.astype(np.uint8), raw=False) + else: + self.onnx_model.set_initializer(zero_point, zero_point_data.astype(np.int8), raw=False) + + def replace_qlinear_layer_pass(self): + for node in self.onnx_model.graph.node: + if node.op_type in FAKE_QUANTIZE_OP: + kwargs = {} + if node.op_type == 'FakeQuantizeLearnablePerchannelAffine': + next_node = self.onnx_model.get_tensor_consumer(node.output[0])[0] + if next_node.op_type == 'ConvTranspose': + kwargs['axis'] = 1 + else: + kwargs['axis'] = 0 + quantize_linear_node = onnx.helper.make_node("QuantizeLinear", node.input[:3], + [node.name + '_quantized_out'], node.name + '_quantized', **kwargs) + dequantize_linear_node = onnx.helper.make_node("DequantizeLinear", + [node.name + '_quantized_out'] + + quantize_linear_node.input[1:3], + node.output, + node.name + '_dequantized', **kwargs) + self.onnx_model.insert_node_purely(quantize_linear_node) + self.onnx_model.insert_node_purely(dequantize_linear_node) + self.onnx_model.remove_node_purely(node) + self.onnx_model.topologize_graph() + + def run(self): + self.onnx_model.topologize_graph() + self.format_qlinear_dtype_pass() + self.replace_qlinear_layer_pass() + self.onnx_model.optimize_model() + # Per-channel QuantizeLinear and DequantizeLinear is supported since opset 13 + self.onnx_model.set_opset_version('', 13) + # This gives error with `axis` in QuantizeLinear node + try: + onnx.checker.check_model(self.onnx_model.model) + except onnx.checker.ValidationError as e: + logger.critical('The model is invalid: %s' % e) + output_dir = os.path.dirname(self.onnx_model_path) + self.onnx_model.save_onnx_model(os.path.join(output_dir, 'onnx_quantized_model.onnx')) diff --git a/mqbench/deploy/deploy_onnx_qnn.py b/mqbench/deploy/deploy_onnx_qnn.py new file mode 100644 index 0000000..d1ab85d --- /dev/null +++ b/mqbench/deploy/deploy_onnx_qnn.py @@ -0,0 +1,284 @@ +import onnx +import numpy as np + +from mqbench.utils.logger import logger +from .common import ONNXGraph + + +FAKE_QUANTIZE_OP = ['FakeQuantizeLearnablePerchannelAffine', 'FixedPerChannelAffine', 'FakeQuantizeDSQPerchannel', + 'LearnablePerTensorAffine', 'FixedPerTensorAffine', 'FakeQuantizeDSQPertensor'] + + +class ONNXQNNPass(object): + def __init__(self, onnx_model_path): + self.onnx_model = ONNXGraph(onnx_model_path) + + @property + def qlinear_op_type(self): + return ['QuantizeLinear', 'QLinearConv', 'QLinearAdd', 'QLinearGemm', 'QLinearGlobalAveragePool', + 'QLinearAveragePool', 'QLinearConcat'] + + @staticmethod + def attribute_to_kwarg(attribute): + ''' + Convert attribute to kwarg format for use with onnx.helper.make_node. + :parameter attribute: attribute in AttributeProto format. + :return: attribute in {key: value} format. + ''' + if (attribute.type == 0): + raise ValueError('attribute {} does not have type specified.'.format(attribute.name)) + + # Based on attribute type definitions from AttributeProto + # definition in https://github.com/onnx/onnx/blob/master/onnx/onnx.proto + if (attribute.type == 1): + value = attribute.f + elif (attribute.type == 2): + value = attribute.i + elif (attribute.type == 3): + value = attribute.s + elif (attribute.type == 4): + value = attribute.t + elif (attribute.type == 5): + value = attribute.g + elif (attribute.type == 6): + value = attribute.floats + elif (attribute.type == 7): + value = attribute.ints + elif (attribute.type == 8): + value = attribute.strings + elif (attribute.type == 9): + value = attribute.tensors + elif (attribute.type == 10): + value = attribute.graphs + else: + raise ValueError('attribute {} has unsupported type {}.'.format(attribute.name, attribute.type)) + + return {attribute.name: value} + + def quantize_weight(self, weight_name, scale_name, zero_point_name): + weight = self.onnx_model.get_initializer(weight_name) + scale = self.onnx_model.get_initializer(scale_name) + zero_point = self.onnx_model.get_initializer(zero_point_name) + return ((weight / scale).round() + zero_point).astype(np.uint8) + + def quantize_bias(self, bias, x_scale, w_scale): + x_scale = self.onnx_model.get_initializer(x_scale) + w_scale = self.onnx_model.get_initializer(w_scale) + bias = self.onnx_model.get_initializer(bias) + return (bias / (x_scale * w_scale)).astype(np.int32) + + @property + def node_without_qparams(self): + return ['Flatten'] + + def replace_conv_gemm(self, node, idx, is_conv): + # Input scale + qlinear_conv_inputs = [] + input_fake_quant_node = self.onnx_model.get_tensor_producer(node.input[0]) + assert input_fake_quant_node.op_type in FAKE_QUANTIZE_OP + x_scale, x_zero_point = input_fake_quant_node.input[1], input_fake_quant_node.input[2] + # Output scale + qlinear_conv_output = node.output + y_scale, y_zero_point = self.get_node_output_qparams(node) + # Weight scale + weight_fake_quant_node = self.onnx_model.get_tensor_producer(node.input[1]) + w_scale, w_zero_point = weight_fake_quant_node.input[1], weight_fake_quant_node.input[2] + weight_name = weight_fake_quant_node.input[0] + W = self.quantize_weight(weight_name, w_scale, w_zero_point) + self.onnx_model.set_initializer(weight_name, W) + qlinear_conv_inputs.extend([node.input[0], x_scale, x_zero_point, + weight_name, w_scale, w_zero_point, + y_scale, y_zero_point]) + # Bias + if len(node.input) == 3: + bias_name = node.input[2] + B = self.quantize_bias(bias_name, x_scale, w_scale) + self.onnx_model.set_initializer(bias_name, B) + qlinear_conv_inputs.append(bias_name) + kwargs = {} + for attribute in node.attribute: + kwargs.update(ONNXQNNPass.attribute_to_kwarg(attribute)) + node_type = "QLinearConv" if is_conv else "QLinearGemm" + qlinear_conv_node = onnx.helper.make_node(node_type, + qlinear_conv_inputs, + qlinear_conv_output, + node.name + '_quantized', + **kwargs) + self.onnx_model.remove_node_purely(node) + self.onnx_model.remove_node_purely(weight_fake_quant_node) + self.onnx_model.insert_node_purely(qlinear_conv_node, idx) + self.onnx_model.topologize_graph() + + def replace_add_to_qlinearadd(self, node, idx): + # First input + qlinear_add_input = [] + qlinear_add_output = node.output + first_input_node = self.onnx_model.get_tensor_producer(node.input[0]) + assert first_input_node.op_type in FAKE_QUANTIZE_OP + first_input_quantized = first_input_node.output[0] + first_scale = first_input_node.input[1] + first_zero_point = first_input_node.input[2] + # Second input + second_input_node = self.onnx_model.get_tensor_producer(node.input[1]) + assert second_input_node.op_type in FAKE_QUANTIZE_OP + second_input_quantized = second_input_node.output[0] + second_scale = second_input_node.input[1] + second_zero_point = second_input_node.input[2] + # Output + output_scale, output_zero_point = self.get_node_output_qparams(node) + qlinear_add_input.extend([first_input_quantized, first_scale, first_zero_point, + second_input_quantized, second_scale, second_zero_point, + output_scale, output_zero_point]) + kwargs = {} + for attribute in node.attribute: + kwargs.update(ONNXQNNPass.attribute_to_kwarg(attribute)) + qlinear_add_node = onnx.helper.make_node("QLinearAdd", + qlinear_add_input, + qlinear_add_output, + node.name + '_quantized', + domain='com.microsoft', + **kwargs) + self.onnx_model.insert_node_purely(qlinear_add_node, idx) + self.onnx_model.remove_node_purely(node) + self.onnx_model.topologize_graph() + + def replace_pool_to_qlinearpool(self, node, idx, is_global): + qlinear_pool_input = [] + prev_node = self.onnx_model.get_tensor_producer(node.input[0]) + assert prev_node.op_type in FAKE_QUANTIZE_OP + x_scale, x_zero_point = prev_node.input[1], prev_node.input[2] + y_scale, y_zero_point = self.get_node_output_qparams(node) + qlinear_pool_input.extend([node.input[0], x_scale, x_zero_point, + y_scale, y_zero_point]) + kwargs = {} + for attribute in node.attribute: + kwargs.update(ONNXQNNPass.attribute_to_kwarg(attribute)) + qlinear_add_output = node.output + node_type = "QLinearGlobalAveragePool" if is_global else "QLinearAveragePool" + qlinear_pool_node = onnx.helper.make_node(node_type, + qlinear_pool_input, + qlinear_add_output, + node.name + '_quantized', + domain='com.microsoft', + **kwargs) + self.onnx_model.insert_node_purely(qlinear_pool_node, idx) + self.onnx_model.remove_node_purely(node) + self.onnx_model.topologize_graph() + + def get_node_output_qparams(self, node): + fake_quantize_node = self.onnx_model.get_tensor_consumer(node.output[0])[0] + while fake_quantize_node.op_type not in FAKE_QUANTIZE_OP: + assert fake_quantize_node.op_type in self.node_without_qparams + fake_quantize_node = self.onnx_model.get_tensor_consumer(fake_quantize_node.output[0])[0] + return fake_quantize_node.input[1], fake_quantize_node.input[2] + + def replace_op_pass(self): + # Replace Conv / Gemm / Add / AvgPool / Concat / LeakyRelu. + for idx, node in enumerate(self.onnx_model.graph.node): + if node.op_type == 'Conv': + self.replace_conv_gemm(node, idx, is_conv=True) + if node.op_type == 'Gemm': + pass + # onnxruntime and tvm is not supported yet. + # self.replace_conv_gemm(node, idx, is_conv=False) + if node.op_type == 'Add': + self.replace_add_to_qlinearadd(node, idx) + if node.op_type == 'GlobalAveragePool': + self.replace_pool_to_qlinearpool(node, idx, is_global=True) + if node.op_type == 'AveragePool': + self.replace_pool_to_qlinearpool(node, idx, is_global=False) + # TODO + if node.op_type == 'Concat': + pass + if node.op_type == 'LeakyRelu': + pass + + def replace_qlinear_layer_pass(self): + # Replace FakeQuantize + def search_and_replace_input(next_node, name, new_name): + for idx, _input_name in enumerate(next_node.input): + if _input_name == name: + next_node.input[idx] = new_name + + for node in self.onnx_model.graph.node: + if node.op_type in FAKE_QUANTIZE_OP: + prev_node = self.onnx_model.get_tensor_producer(node.input[0]) + next_node_list = self.onnx_model.get_tensor_consumer(node.output[0]) + quantize_node = None + dequantize_node = None + for next_node in next_node_list: + if prev_node != 'INPUT_TOKEN' and prev_node.op_type in self.qlinear_op_type and \ + next_node != 'OUTPUT_TOKEN' and next_node.op_type in self.qlinear_op_type: + search_and_replace_input(next_node, node.output[0], node.input[0]) + elif prev_node != 'INPUT_TOKEN' and prev_node.op_type in self.qlinear_op_type and \ + next_node == 'OUTPUT_TOKEN': + if dequantize_node is None: + output_value_info = [f'{node.output[0]}_DequantizeLinear'] + dequantize_node = onnx.helper.make_node("DequantizeLinear", + node.input[0:3], + output_value_info, + ('input' if prev_node == 'INPUT_TOKEN' else prev_node.name) + '_dequantized') + self.onnx_model.insert_node_purely(dequantize_node) + else: + if quantize_node is None: + output_value_info = [f'{node.output[0]}_QuantizeLinear'] + quantize_node = onnx.helper.make_node("QuantizeLinear", + node.input[0:3], + output_value_info, + ('input' if prev_node == 'INPUT_TOKEN' else prev_node.name) + '_quantized') + self.onnx_model.insert_node_purely(quantize_node) + search_and_replace_input(next_node, node.output[0], quantize_node.output[0]) + self.onnx_model.remove_node_purely(node) + self.onnx_model.topologize_graph() + + def merge_relu_pass(self): + for node in self.onnx_model.graph.node: + if node.op_type == 'Relu': + next_node = self.onnx_model.get_tensor_consumer(node.output[0])[0] + assert next_node.op_type in FAKE_QUANTIZE_OP + # Input idx2 is zero point. + self.onnx_model.set_initializer(next_node.input[2], np.array([0], dtype=np.uint8), raw=False) + self.onnx_model.remove_node_purely(node) + next_node.input[0] = node.input[0] + if node.op_type == 'Clip': + next_node = self.onnx_model.get_tensor_consumer(node.output[0])[0] + assert next_node.op_type in FAKE_QUANTIZE_OP + # Input idx2 is zero point. + scale = self.onnx_model.get_initializer(next_node.input[1]) + scale = min(scale, 6.0 / 255) + self.onnx_model.set_initializer(next_node.input[1], np.array([scale], dtype=np.float32), raw=False) + self.onnx_model.set_initializer(next_node.input[2], np.array([0], dtype=np.uint8), raw=False) + self.onnx_model.remove_node_purely(node) + next_node.input[0] = node.input[0] + self.onnx_model.topologize_graph() + + def format_qlinear_dtype_pass(self): + for node in self.onnx_model.graph.node: + if node.op_type in FAKE_QUANTIZE_OP: + scale, zero_point, qmin, qmax = node.input[1], node.input[2], node.input[3], node.input[4] + qmin = self.onnx_model.get_constant(qmin) + qmax = self.onnx_model.get_constant(qmax) + assert qmax - qmin == 2 ** 8 - 1, "Only 8 bit quantization support deploy to QNN." + scale_proto = self.onnx_model.initializer[scale][0] + if scale_proto.raw_data != b'' and scale_proto.dims[0] == 1: + scale_data = self.onnx_model.get_initializer(scale) + self.onnx_model.set_initializer(scale, scale_data.astype(np.float32), raw=False) + zero_point_proto = self.onnx_model.initializer[zero_point][0] + zero_point_data = self.onnx_model.get_initializer(zero_point) + # Align sym and asym scheme. + zero_point_data = (zero_point_data - qmin).reshape((1,)) + self.onnx_model.set_initializer(zero_point, zero_point_data.astype(np.uint8), raw=False) + + def run(self, model_name): + self.format_qlinear_dtype_pass() + self.merge_relu_pass() + self.replace_op_pass() + self.replace_qlinear_layer_pass() + self.onnx_model.optimize_model() + self.onnx_model.set_opset_version('com.microsoft', 1) + + try: + onnx.checker.check_model(self.onnx_model.model) + except onnx.checker.ValidationError as e: + logger.critical('The model is invalid: %s' % e) + self.onnx_model.save_onnx_model('{}.onnx'.format(model_name)) diff --git a/mqbench/deploy/deploy_openvino.py b/mqbench/deploy/deploy_openvino.py new file mode 100644 index 0000000..bec664c --- /dev/null +++ b/mqbench/deploy/deploy_openvino.py @@ -0,0 +1,130 @@ +import os + +import onnx +import numpy as np +from onnx import numpy_helper + +from onnx import helper + +from mqbench.utils.logger import logger +from mqbench.deploy.common import ( + update_inp2node_out2node, + prepare_data, + OnnxPreprocess, + ONNXGraph, + get_constant_inputs, + parse_attrs +) + +PERCHANNEL_FAKEQUANTIZER = ['FakeQuantizeLearnablePerchannelAffine', + 'FixedPerChannelAffine', + 'FakeQuantizeDSQPerchannel'] +PERTENSOR_FAKEQUANTIZER = ['LearnablePerTensorAffine', + 'FixedPerTensorAffine', + 'FakeQuantizeDSQPertensor', + 'FakeQuantizeTqtAffine'] +ALL_FAKEQUANTIZER = PERCHANNEL_FAKEQUANTIZER + PERTENSOR_FAKEQUANTIZER + + +class OPENVINO_process(object): + + def parse_qparams(self, node, name2data): + tensor_name, scale, zero_point = node.input[:3] + scale, zero_point = name2data[scale], name2data[zero_point] + if len(node.input) > 3: + qmin, qmax = node.input[-2:] + qmin, qmax = name2data[qmin], name2data[qmax] + elif len(node.attribute) > 0: + qparams = parse_attrs(node.attribute) + qmin = qparams['quant_min'] + qmax = qparams['quant_max'] + else: + logger.info(f'qmin and qmax are not found for <{node.name}>!') + qmax = qmin = None + return tensor_name, scale, zero_point, qmin, qmax + + def replace_fakequantize_and_collect_params(self, onnx_path, model_name): + onnx_graph = ONNXGraph(onnx_path) + model = onnx_graph.model + graph = model.graph + out2node, inp2node = update_inp2node_out2node(graph) + name2data = prepare_data(graph) + + preprocess = OnnxPreprocess() + preprocess.remove_fake_pad_op(graph, name2data, inp2node, out2node) + out2node, inp2node = update_inp2node_out2node(graph) + + nodes_to_be_removed = [] + node_defs = [] + insert_initializer_names = set() + for node in graph.node: + if node.op_type in ALL_FAKEQUANTIZER: + nodes_to_be_removed.append(node) + nodes_to_be_removed.extend(get_constant_inputs(node, out2node)) + + tensor_name, scale, zero_point, qmin, qmax = self.parse_qparams(node, name2data) + qmax = int(qmax) + qmin = int(qmin) + levels = qmax - qmin + 1 + # adjust weight levels + if levels == 128: + levels = 256 + qmax = qmax * 2 + 1 + qmin = qmin * 2 + output_name = node.output[0] + # Create a node (FakeQuantize) + fakeq_inputnames = [item % tensor_name for item in ['input_min_%s', 'input_max_%s', 'output_min_%s', 'output_max_%s']] + node_def = helper.make_node( + 'FakeQuantize', # node name + [tensor_name, *fakeq_inputnames], # inputs + [output_name], # outputs + levels=levels, # Attributes + domain="org.openvinotoolkit", + name=node.name + ) + node_defs.append(node_def) + scale = np.abs(np.asarray(scale, dtype=np.float64).reshape(-1)) + zero_point = np.clip(np.asarray(np.round(zero_point), dtype=np.int32).reshape(-1), a_min=qmin, a_max=qmax) + + qrange = float(qmax - qmin) + input_range = scale * qrange + input_high = (qmax - zero_point).astype(np.float64) * input_range / qrange + input_low = input_high - input_range + input_low_size = input_low.size + + try: + next_node = inp2node[node.output[0]][0][0] + # node for save weights + fake_node = out2node[next_node.input[1]] + tensor = name2data[fake_node.input[0]] + shape_length = len(tensor.shape) + new_shape = [-1, ] + [1, ] * (shape_length - 1) + except Exception as e: + new_shape = [-1, ] + + if input_low_size != 1: + input_low = input_low.reshape(*new_shape) + input_high = input_high.reshape(*new_shape) + input_low = input_low.astype(np.float32) + input_high = input_high.astype(np.float32) + for initializer_name, value_tensor in zip(fakeq_inputnames, [input_low, input_high, input_low, input_high]): + if initializer_name in insert_initializer_names: + continue + initializer = numpy_helper.from_array(value_tensor) + initializer.name = initializer_name + insert_initializer_names.add(initializer_name) + graph.initializer.append(initializer) + + for node in nodes_to_be_removed: + graph.node.remove(node) + graph.node.extend(node_defs) + onnx_graph.topologize_graph() + onnx_graph.prepare_initializer() + onnx_graph.optimize_model() + output_path = os.path.dirname(onnx_path) + onnx_filename = os.path.join(output_path, '{}_deploy_model.onnx'.format(model_name)) + onnx.save(model, onnx_filename) + logger.info("Finish deploy process.") + + +replace_fakequantize_and_collect_params_openvino = OPENVINO_process().replace_fakequantize_and_collect_params \ No newline at end of file diff --git a/mqbench/deploy/deploy_tengine.py b/mqbench/deploy/deploy_tengine.py new file mode 100644 index 0000000..ab63ef2 --- /dev/null +++ b/mqbench/deploy/deploy_tengine.py @@ -0,0 +1,126 @@ +import os +from collections import OrderedDict + +from ..utils.logger import logger +from .deploy_linear import ( + LinearQuantizer_process, + ALL_FAKEQUANTIZER, + PERCHANNEL_FAKEQUANTIZER, + PERTENSOR_FAKEQUANTIZER +) +from .common import ( + update_inp2node_out2node, + prepare_initializer, + prepare_data, + OnnxPreprocess, + get_constant_inputs +) + +import onnx +from onnx import numpy_helper +try: + from onnxsim import simplify +except ModuleNotFoundError: + logger.warn('onnxsim not found, if you want to use deploy_tengine, please install it.') + + + +class Tengine_process(LinearQuantizer_process): + + @staticmethod + def get_constant(node: onnx.NodeProto): + return numpy_helper.to_array(node.attribute[0].t).tolist() + + def remove_fakequantize_and_collect_params(self, onnx_path, model_name): + model = onnx.load(onnx_path) + graph = model.graph + out2node, inp2node = update_inp2node_out2node(graph) + name2data = prepare_data(graph) + named_initializer = prepare_initializer(graph) + + preprocess = OnnxPreprocess() + preprocess.remove_fake_pad_op(graph, name2data, inp2node, out2node) + out2node, inp2node = update_inp2node_out2node(graph) + + quant_params = OrderedDict() + nodes_to_be_removed = [] + for node in graph.node: + if node.op_type in ALL_FAKEQUANTIZER: + nodes_to_be_removed.append(node) + nodes_to_be_removed.extend(get_constant_inputs(node, out2node)) + + if node.op_type in PERCHANNEL_FAKEQUANTIZER: + # fake quantize for weights, suppose per-channel quantize only for weight + redundant_nodes = self.deal_with_weight_fakequant(node, out2node, inp2node, named_initializer) + nodes_to_be_removed.extend(redundant_nodes) + self.clip_weight(node, name2data, inp2node, named_initializer) + elif node.op_type in PERTENSOR_FAKEQUANTIZER: + if node.output[0] not in inp2node: + assert node.output[0] in [x.name for x in graph.output] + inp2node[node.output[0]] = [] + + next_nodes = inp2node[node.output[0]] + if len(next_nodes) == 1 and next_nodes[0][1] == 1 and next_nodes[0][0].op_type in ['Gemm', 'Conv']: + # fake quantize for weights + redundant_nodes = self.deal_with_weight_fakequant(node, out2node, inp2node, named_initializer) + tensor_name, scale, zero_point, qmin, qmax = self.parse_qparams(node, name2data) + nodes_to_be_removed.extend(redundant_nodes) + self.clip_weight(node, name2data, inp2node, named_initializer) + else: + # fake quantize for activations + self.deal_with_activation_fakequant(node, inp2node) + tensor_name, scale, zero_point, qmin, qmax = self.parse_qparams(node, name2data) + for out in graph.output: + if out.name == node.output[0]: + out.name = tensor_name + + quant_params[tensor_name] = [ + float(scale), + int(zero_point) + ] + + # detect fusion for tengine graph + # since tengine convert tool will optimize graph + # by fusing conv+relu, conv+relu6 + # ref: https://github.com/OAID/Tengine/blob/cdb4ccf77c04a0a771ec6a43631b9d25acd2bae1/tools/convert_tool/utils/graph_optimizer/graph_opt.cpp#L941 + pre_node = out2node.get(tensor_name, None) + if pre_node and pre_node.op_type in {"Clip", "ReLU"}: + # suppose onnx version be 11 + # for relu6 + if pre_node.op_type == "Clip" and \ + not (self.get_constant(out2node[pre_node.input[1]]) == 0 and + self.get_constant(out2node[pre_node.input[2]]) == 6): + continue + + conv_node = out2node[pre_node.input[0]] + if conv_node.op_type == "Conv": + conv_tensor_name = conv_node.output[0] + quant_params[conv_tensor_name] = quant_params[tensor_name] + + for node in nodes_to_be_removed: + graph.node.remove(node) + named_initializer = prepare_initializer(graph) + for name, initial_data in named_initializer.items(): + if name in (out2node.keys() | inp2node.keys()): + continue + graph.initializer.remove(initial_data) + + # TODO: softmax + quant_params = self.post_process_clip_ranges(quant_params, graph, inp2node) + output_path = os.path.dirname(onnx_path) + context_filename = os.path.join(output_path, f"{model_name}_for_tengine.scale") + with open(context_filename, "w") as f: + for name, value in quant_params.items(): + scale, zero_point = value + f.write(f"{name} {scale} {zero_point}\n") + + model_opt, check = simplify(model) + assert check, "Simplified ONNX model could not be validated" + + onnx_filename = os.path.join(output_path, f"{model_name}_for_tengine.onnx") + onnx.save(model_opt, onnx_filename) + + logger.info("Finish deploy process.") + + +remove_fakequantize_and_collect_params_tengine = Tengine_process().remove_fakequantize_and_collect_params diff --git a/mqbench/fake_quantize/__init__.py b/mqbench/fake_quantize/__init__.py new file mode 100644 index 0000000..20296c4 --- /dev/null +++ b/mqbench/fake_quantize/__init__.py @@ -0,0 +1,10 @@ +from .dorefa import DoReFaFakeQuantize +from .dsq import DSQFakeQuantize +from .fixed import FixedFakeQuantize +from .lsq import LearnableFakeQuantize +from .nnie import NNIEFakeQuantize +from .pact import PACTFakeQuantize +from .tqt import TqtFakeQuantize +from .adaround_quantizer import AdaRoundFakeQuantize +from .qdrop_quantizer import QDropFakeQuantize +from .pure_hooker import PureHooker \ No newline at end of file diff --git a/mqbench/fake_quantize/adaround_quantizer.py b/mqbench/fake_quantize/adaround_quantizer.py new file mode 100644 index 0000000..eb641c2 --- /dev/null +++ b/mqbench/fake_quantize/adaround_quantizer.py @@ -0,0 +1,135 @@ +import torch +from torch.nn.parameter import Parameter + +from mqbench.fake_quantize.quantize_base import QuantizeBase, _version_under_1100 +from mqbench.utils.hook import PerChannelLoadHook + +def _rectified_sigmoid(alpha, zeta, gamma): + """Function to generate rounding mask. + + Args: + x (torch.Tensor): + zeta (torch.Tensor): + gamma (torch.Tensor): + + Returns: + torch.Tensor: + """ + return ((zeta - gamma) * torch.sigmoid(alpha) + gamma).clamp(0, 1) + + +def adaround_forward(x, scale, zero_point, quant_min, quant_max, ch_axis, alpha, zeta, gamma, hard_value=False): + if ch_axis != -1: + new_shape = [1] * len(x.shape) + new_shape[ch_axis] = x.shape[ch_axis] + scale = scale.reshape(new_shape) + zero_point = zero_point.reshape(new_shape) + x = torch.floor(x / scale) + if hard_value: + x += (alpha >= 0).float() + else: + x += _rectified_sigmoid(alpha, zeta, gamma) + x += zero_point + x = torch.clamp(x, quant_min, quant_max) + x = (x - zero_point) * scale + return x + + +class AdaRoundFakeQuantize(QuantizeBase): + """This is based on the fixedpointquantize. Because adaround only works at FC and Conv, there is an extra variables + to define the state and could only serve as weight quantizer. + self.adaround basicquantize (False) adaroundquantize(True) + """ + + def __init__(self, observer, **observer_kwargs): + super(AdaRoundFakeQuantize, self).__init__(observer, **observer_kwargs) + self.register_buffer('scale', torch.tensor([1.0], dtype=torch.float)) + self.register_buffer('zero_point', torch.tensor([0], dtype=torch.int)) + self.adaround = False + self.load_state_dict_hook = PerChannelLoadHook(self, hook_param=['scale', 'zero_point', 'alpha']) + + def init(self, weight_tensor: torch.Tensor, round_mode='learned_hard_sigmoid', ): + self.adaround = True + self.observer_enabled[0] = 0 + self.fake_quant_enabled[0] = 1 + self.round_mode = round_mode + + # self.soft_targets = False # delete this + self.gamma, self.zeta = -0.1, 1.1 + self.init_alpha(x=weight_tensor.data.clone()) + + def init_alpha(self, x: torch.Tensor): + if self.ch_axis != -1: + new_shape = [1] * len(x.shape) + new_shape[self.ch_axis] = x.shape[self.ch_axis] + scale = self.scale.data.reshape(new_shape) + else: + scale = self.scale.data + x_floor = torch.floor(x / scale) + if self.round_mode == 'learned_hard_sigmoid': + print('Init alpha to be FP32') + rest = (x / scale) - x_floor # rest of rounding [0, 1) + alpha = -torch.log((self.zeta - self.gamma) / (rest - self.gamma) - 1) # => sigmoid(alpha) = rest + self.alpha = Parameter(alpha) + else: + raise NotImplementedError + + def rectified_sigmoid(self): + """Function to generate rounding mask. + + Args: + x (torch.Tensor): + zeta (torch.Tensor): + gamma (torch.Tensor): + + Returns: + torch.Tensor: + """ + return ((self.zeta - self.gamma) * torch.sigmoid(self.alpha) + self.gamma).clamp(0, 1) + + def get_hard_value(self, X): + X = adaround_forward(X, self.scale.data, self.zero_point.data.long(), self.quant_min, + self.quant_max, self.ch_axis, self.alpha, self.zeta, self.gamma, hard_value=True) + return X + + def forward(self, X): + if self.observer_enabled[0] == 1: + self.activation_post_process(X.detach()) + _scale, _zero_point = self.calculate_qparams() + _scale, _zero_point = _scale.to(self.scale.device), _zero_point.to(self.zero_point.device) + if self.scale.shape != _scale.shape: + self.scale.resize_(_scale.shape) + self.zero_point.resize_(_zero_point.shape) + self.scale.copy_(_scale) + self.zero_point.copy_(_zero_point) + + if self.fake_quant_enabled[0] == 1: + if not self.adaround: + if self.is_per_channel: + X = torch.fake_quantize_per_channel_affine( + X, self.scale, + self.zero_point.long() if _version_under_1100 else self.zero_point, + self.ch_axis, self.quant_min, self.quant_max) + else: + X = torch.fake_quantize_per_tensor_affine( + X, self.scale.item(), int(self.zero_point.item()), + self.quant_min, self.quant_max) + else: + if not hasattr(self, 'alpha'): + raise NotImplementedError + if self.round_mode == 'learned_hard_sigmoid': + X = adaround_forward(X, self.scale.data, self.zero_point.data.long(), self.quant_min, + self.quant_max, self.ch_axis, self.alpha, self.zeta, self.gamma) + else: + raise NotImplementedError + return X + + @torch.jit.export + def extra_repr(self): + return 'fake_quant_enabled={}, observer_enabled={}, ' \ + 'quant_min={}, quant_max={}, dtype={}, qscheme={}, ch_axis={}, ' \ + 'scale={}, zero_point={}'.format( + self.fake_quant_enabled, self.observer_enabled, + self.quant_min, self.quant_max, + self.dtype, self.qscheme, self.ch_axis, self.scale if self.ch_axis == -1 else 'List', + self.zero_point if self.ch_axis == -1 else 'List') diff --git a/mqbench/fake_quantize/dorefa.py b/mqbench/fake_quantize/dorefa.py new file mode 100644 index 0000000..d570edd --- /dev/null +++ b/mqbench/fake_quantize/dorefa.py @@ -0,0 +1,37 @@ +import torch + +from mqbench.fake_quantize.quantize_base import QuantizeBase + + +_version_under_1100 = int(torch.__version__.split('.')[1]) < 10 + +class DoReFaFakeQuantize(QuantizeBase): + def __init__(self, observer, **observer_kwargs): + super(DoReFaFakeQuantize, self).__init__(observer, **observer_kwargs) + self.register_buffer('scale', torch.tensor([1.0], dtype=torch.float)) + self.register_buffer('zero_point', torch.tensor([0], dtype=torch.int)) + + def forward(self, X): + X = torch.tanh(X) + X = X.div(X.abs().max() + 1e-5) + + if self.observer_enabled[0] == 1: + self.activation_post_process(X.detach()) + _scale, _zero_point = self.activation_post_process.calculate_qparams() + _scale, _zero_point = _scale.to(self.scale.device), _zero_point.to(self.zero_point.device) + if self.scale.shape != _scale.shape: + self.scale.resize_(_scale.shape) + self.zero_point.resize_(_zero_point.shape) + self.scale.copy_(_scale) + self.zero_point.copy_(_zero_point) + + if self.fake_quant_enabled[0] == 1: + if self.is_per_channel: + X = torch.fake_quantize_per_channel_affine( + X, self.scale, + self.zero_point.long() if _version_under_1100 else self.zero_point, + self.ch_axis, self.quant_min, self.quant_max) + else: + X = torch.fake_quantize_per_tensor_affine( + X, self.scale.item(), int(self.zero_point.item()), self.quant_min, self.quant_max) + return X \ No newline at end of file diff --git a/mqbench/fake_quantize/dsq.py b/mqbench/fake_quantize/dsq.py new file mode 100644 index 0000000..f087e33 --- /dev/null +++ b/mqbench/fake_quantize/dsq.py @@ -0,0 +1,132 @@ +import math + +import torch +from torch.nn.parameter import Parameter + +from mqbench.fake_quantize.quantize_base import QuantizeBase +from mqbench.utils import is_symmetric_quant, is_tracing_state +from mqbench.utils.hook import PerChannelLoadHook + + +def dsq_function_per_tensor(x, scale, zero_point, quant_min, quant_max, alpha): + tanh_scale = 1 / (1 - alpha) + tanh_k = math.log((tanh_scale + 1) / (tanh_scale - 1)) + + x = x / scale + zero_point + x = torch.clamp(x, quant_min, quant_max) + x = x.floor() + (tanh_scale * torch.tanh(tanh_k * (x - x.floor() - 0.5))) * 0.5 + 0.5 # 软 + x = (x.round() - x).detach() + x # 硬 + x = (x - zero_point) * scale + + return x + + +def dsq_function_per_channel(x, scale, zero_point, quant_min, quant_max, ch_axis, alpha): + + new_shape = [1] * len(x.shape) + new_shape[ch_axis] = x.shape[ch_axis] + scale = scale.reshape(new_shape) + zero_point = zero_point.reshape(new_shape) + + tanh_scale = 1 / (1 - alpha) + tanh_k = math.log((tanh_scale + 1) / (tanh_scale - 1)) + + x = x / scale + zero_point + x = torch.clamp(x, quant_min, quant_max) + x = x.floor() + (tanh_scale * torch.tanh(tanh_k * (x - x.floor() - 0.5))) * 0.5 + 0.5 + x = (x.round() - x).detach() + x + x = (x - zero_point) * scale + + return x + + +class DSQFakeQuantize(QuantizeBase): + def __init__(self, observer, alpha=0.4, **observer_kwargs): + super(DSQFakeQuantize, self).__init__(observer, **observer_kwargs) + self.scale = Parameter(torch.tensor([1.0]))# TODO 这玩意应该是可学习参数 + self.register_buffer('zero_point', torch.tensor([0.])) + self.alpha = Parameter(torch.tensor([alpha])) # 这个真有问题,得限制在0~0.5 + # self.alpha = alpha + self.load_state_dict_hook = PerChannelLoadHook(self) + self.register_buffer('eps', torch.tensor([torch.finfo(torch.float32).eps])) + self.compute_qloss = True + + + def forward(self, X): + # if self.training: # NOTE晕,怎么还能随时统计更新量化参数,得换掉 + # self.activation_post_process(X.detach()) + # _scale, _zero_point = self.activation_post_process.calculate_qparams() + # _scale, _zero_point = _scale.to(self.scale.device), _zero_point.to(self.zero_point.device) + # if self.scale.shape != _scale.shape: + # self.scale.resize_(_scale.shape) + # self.zero_point.resize_(_zero_point.shape) + # self.scale.copy_(_scale) + # self.zero_point.copy_(_zero_point.float()) + + if self.observer_enabled[0] == 1: + self.activation_post_process(X.detach()) + _scale, _zero_point = self.activation_post_process.calculate_qparams() + _scale = _scale.to(self.scale.device) + _zero_point = _zero_point.to(self.zero_point.device) + + if self.scale.shape != _scale.shape: + self.scale.resize_(_scale.shape) + self.zero_point.resize_(_zero_point.shape) + + self.scale.data.copy_(_scale) + self.zero_point.data.copy_(_zero_point.float()) + else: + self.scale.data.abs_() + self.scale.data.clamp_(min=self.eps.item(), max=1.0) + # 也得钳制一下alpha + self.alpha.data.abs_() + self.alpha.data.clamp_(min=self.eps.item(), max=0.5) + + X_old = X + + if self.fake_quant_enabled[0] == 1: # NOTE 原代码确实是没有区分是否对称量化 + if is_symmetric_quant(self.qscheme): + self.zero_point.data.zero_() + else: + self.zero_point.data.clamp_(self.quant_min, self.quant_max).float() + + if self.is_per_channel: + if is_tracing_state(): + X = FakeQuantizeDSQPerchannel.apply( + X, self.scale, self.zero_point, self.quant_min, self.quant_max, self.ch_axis, self.alpha) + else: + X = dsq_function_per_channel( + X, self.scale, self.zero_point, self.quant_min, self.quant_max, self.ch_axis, self.alpha) + else: + if is_tracing_state(): + X = FakeQuantizeDSQPertensor.apply( + X, self.scale, self.zero_point, self.quant_min, self.quant_max, self.alpha) + else: + X = dsq_function_per_tensor( + X, self.scale, self.zero_point, self.quant_min, self.quant_max, self.alpha) + + # NOTE 算 + if self.compute_qloss: + self.quantization_loss = (torch.norm(X_old - X, p="fro", dim=1) ** 2).mean() + + return X + + +class FakeQuantizeDSQPerchannel(torch.autograd.Function): + @staticmethod + def forward(ctx, x, scale, zero_point, quant_min, quant_max, ch_axis, alpha): + return dsq_function_per_channel(x, scale, zero_point, quant_min, quant_max, ch_axis, alpha) + + @staticmethod + def symbolic(g, x, scale, zero_point, quant_min, quant_max, ch_axis, alpha): + return g.op("::FakeQuantizeDSQPerchannel", x, scale, zero_point, quant_min_i=quant_min, quant_max_i=quant_max, alpha_f=alpha) + + +class FakeQuantizeDSQPertensor(torch.autograd.Function): + @staticmethod + def forward(ctx, x, scale, zero_point, quant_min, quant_max, alpha): + return dsq_function_per_tensor(x, scale, zero_point, quant_min, quant_max, alpha) + + @staticmethod + def symbolic(g, x, scale, zero_point, quant_min, quant_max, alpha): + return g.op("::FakeQuantizeDSQPertensor", x, scale, zero_point, quant_min_i=quant_min, quant_max_i=quant_max, alpha_f=alpha) diff --git a/mqbench/fake_quantize/fixed.py b/mqbench/fake_quantize/fixed.py new file mode 100644 index 0000000..4e2e463 --- /dev/null +++ b/mqbench/fake_quantize/fixed.py @@ -0,0 +1,87 @@ +import torch + +from mqbench.fake_quantize.quantize_base import QuantizeBase +from mqbench.utils.hook import PerChannelLoadHook + + +_version_under_1100 = int(torch.__version__.split('.')[1]) < 10 + +class FixedFakeQuantize(QuantizeBase): # XXX 原来量化和ob是写到一起的,通过flag来决定哪个会执行 + """This is actually torch.quantization.FakeQuantize. + """ + def __init__(self, observer, **observer_kwargs): + super(FixedFakeQuantize, self).__init__(observer, **observer_kwargs) + self.register_buffer('scale', torch.tensor([1.0], dtype=torch.float)) # 这里的定义,说明了其实没法被更新 + self.register_buffer('zero_point', torch.tensor([0], dtype=torch.int)) + self.load_state_dict_hook = PerChannelLoadHook(self) + + def forward(self, X): # XXX 也就是说,在ob阶段,每次使用ob后qparam都会更新! + if self.observer_enabled[0] == 1: # 做Detach,就是避免这个也带进了梯度! + self.activation_post_process(X.detach()) # 这个activation post是ob类,module,所以整体就是在进行对应的forward + _scale, _zero_point = self.calculate_qparams() + _scale, _zero_point = _scale.to(self.scale.device), _zero_point.to(self.zero_point.device) + if self.scale.shape != _scale.shape: + self.scale.resize_(_scale.shape) + self.zero_point.resize_(_zero_point.shape) + self.scale.copy_(_scale) + self.zero_point.copy_(_zero_point) + + if self.fake_quant_enabled[0] == 1: + if self.is_per_channel: + X = torch.fake_quantize_per_channel_affine( + X, self.scale, + self.zero_point.long() if _version_under_1100 else self.zero_point, + self.ch_axis, self.quant_min, self.quant_max) + else: + X = torch.fake_quantize_per_tensor_affine( + X, self.scale.item(), int(self.zero_point.item()), + self.quant_min, self.quant_max) + return X + + @torch.jit.export + def extra_repr(self): + return 'fake_quant_enabled={}, observer_enabled={}, ' \ + 'quant_min={}, quant_max={}, dtype={}, qscheme={}, ch_axis={}, ' \ + 'scale={}, zero_point={}'.format( + self.fake_quant_enabled, self.observer_enabled, + self.quant_min, self.quant_max, + self.dtype, self.qscheme, self.ch_axis, self.scale if self.ch_axis == -1 else 'List', + self.zero_point if self.ch_axis == -1 else 'List') + + def _save_to_state_dict(self, destination, prefix, keep_vars): + # We cannot currently register scalar values as buffers, so need to manually + # specify serialization here. + super(FixedFakeQuantize, self)._save_to_state_dict(destination, prefix, keep_vars) + destination[prefix + 'scale'] = self.scale + destination[prefix + 'zero_point'] = self.zero_point + + def _load_from_state_dict(self, state_dict, prefix, local_metadata, strict, + missing_keys, unexpected_keys, error_msgs): + # Removing this function throws an error that the the size of the loaded tensor does not match the original size + # i.e., These buffers start out with numel 0 and become numel 1 once they have their first forward pass. + local_state = ['scale', 'zero_point'] + for name in local_state: + key = prefix + name + if key in state_dict: + val = state_dict[key] + # Custom handling to allow loading scale and zero_point + # of size N into uninitialized buffers of size 0. The + # buffers are resized here, and the values are copied in + # the default state_dict loading code of the parent. + if name == 'scale': + self.scale.resize_(val.shape) + else: + assert name == 'zero_point' + self.zero_point.resize_(val.shape) + # For torchscript module we need to update the attributes here since we do not + # call the `_load_from_state_dict` function defined module.py + if torch.jit.is_scripting(): + if name == 'scale': + self.scale.copy_(val) + else: + assert name == 'zero_point' + self.zero_point.copy_(val) + elif strict: + missing_keys.append(key) + super(FixedFakeQuantize, self)._load_from_state_dict(state_dict, prefix, local_metadata, strict, + missing_keys, unexpected_keys, error_msgs) \ No newline at end of file diff --git a/mqbench/fake_quantize/lsq.py b/mqbench/fake_quantize/lsq.py new file mode 100644 index 0000000..5b2db68 --- /dev/null +++ b/mqbench/fake_quantize/lsq.py @@ -0,0 +1,164 @@ +import torch +from torch.nn.parameter import Parameter + +from mqbench.fake_quantize.quantize_base import QuantizeBase +from mqbench.utils import is_symmetric_quant, is_tracing_state +from mqbench.utils.hook import PerChannelLoadHook +import global_placeholder + +class LearnableFakeQuantize(QuantizeBase): + r""" This is an extension of the FakeQuantize module in fake_quantize.py, which + supports more generalized lower-bit quantization and support learning of the scale + and zero point parameters through backpropagation. For literature references, + please see the class _LearnableFakeQuantizePerTensorOp. + In addition to the attributes in the original FakeQuantize module, the _LearnableFakeQuantize + module also includes the following attributes to support quantization parameter learning. + """ + + def __init__(self, observer, scale=1., zero_point=0., use_grad_scaling=True, **observer_kwargs): + super(LearnableFakeQuantize, self).__init__(observer, **observer_kwargs) + self.use_grad_scaling = use_grad_scaling + self.scale = Parameter(torch.tensor([scale])) + self.register_buffer('zero_point', torch.tensor([zero_point])) # NOTE 已改 这里就是不对劲,就应该是buffer,而且grad还会占用显存 + self.register_buffer('eps', torch.tensor([torch.finfo(torch.float32).eps])) + # Check whether the module will load a state dict; + # Initialize the shape of per-channel 'scale' and 'zero-point' before copying values + self.load_state_dict_hook = PerChannelLoadHook(self) + # NOTE test + # self.register_buffer('quantization_loss', torch.tensor([0])) + self.compute_qloss = False + + + @torch.jit.export + def extra_repr(self): + return 'fake_quant_enabled={}, observer_enabled={}, ' \ + 'quant_min={}, quant_max={}, dtype={}, qscheme={}, ch_axis={}, ' \ + 'scale={}, zero_point={}'.format( + self.fake_quant_enabled, self.observer_enabled, + self.quant_min, self.quant_max, + self.dtype, self.qscheme, self.ch_axis, self.scale if self.ch_axis == -1 else 'List[%s]' % str(self.scale.shape), + self.zero_point if self.ch_axis == -1 else 'List') + + def forward(self, X): + # Learnable fake quantize have to zero_point.float() to make it learnable. + if self.observer_enabled[0] == 1: + self.activation_post_process(X.detach()) + _scale, _zero_point = self.activation_post_process.calculate_qparams() + _scale = _scale.to(self.scale.device) + _zero_point = _zero_point.to(self.zero_point.device) + + if self.ch_axis != -1: + self.scale.data = torch.ones_like(_scale) + self.zero_point.data = torch.zeros_like(_zero_point.float()) + + self.scale.data.copy_(_scale) + self.zero_point.data.copy_(_zero_point.float()) + + # if self.compute_qloss: + # # 计算std,初始化margin + # self.regular_margin.data.copy_(2 * X.std()) + else: + # if self.compute_qloss: + # # 计算std,初始化margin + # self.regular_margin.data.abs_() # 要求绝对化 + self.scale.data.abs_() + self.scale.data.clamp_(min=self.eps.item()) + + # TODO 写能求最小化量化误差的代码 + X_old = X + # if self.compute_qloss: + # X = grad_scale(X, 1+self.scale.detach()) + + + if self.fake_quant_enabled[0] == 1: + if is_symmetric_quant(self.qscheme): + self.zero_point.data.zero_() + else: + self.zero_point.data.clamp_(self.quant_min, self.quant_max).float() + + if self.is_per_channel: + if self.use_grad_scaling: + grad_factor = 1.0 / (X.numel() / X.shape[self.ch_axis] * self.quant_max) ** 0.5 + else: + grad_factor = 1.0 + if is_tracing_state(): + X = FakeQuantizeLearnablePerchannelAffine.apply( + X, self.scale, self.zero_point, self.ch_axis, + self.quant_min, self.quant_max, grad_factor) + else: + X = _fake_quantize_learnable_per_channel_affine_training( + X, self.scale, self.zero_point, self.ch_axis, + self.quant_min, self.quant_max, grad_factor) + else: + if self.use_grad_scaling: + grad_factor = 1.0 / (X.numel() * self.quant_max) ** 0.5 + else: + grad_factor = 1.0 + X = torch._fake_quantize_learnable_per_tensor_affine( # 原装 + X, self.scale, self.zero_point, + self.quant_min, self.quant_max, grad_factor) + # X = _fake_quantize_learnable_per_tensor_affine_training(X, self.scale, self.zero_point, self.quant_min, self.quant_max, grad_factor) + # NOTE 算 + # self.input = X_old.detach() + + # if self.compute_qloss and hasattr(self, 'identity'): + # # # # self.quantization_loss = (torch.norm(X_old - X, p="fro", dim=1) ** 2).mean() # 这玩意也不行了 + + # # # # gap = (X_old - X_old.min())/(X_old.max() - X_old.min()) - (X - X.min())/(X.max() - X.min()) + # # # # gap = ((X_old - X) / self.scale + self.zero_point) / (self.quant_max - self.quant_min + 1) + # # # scale = self.scale.detach() + # # # zero_point = self.zero_point.detach() + # # # # scale = grad_scale(scale, grad_factor) + # # # # zero_point = grad_scale(zero_point, grad_factor) + # # # gap = ((X_old - X) / scale) + # # # # self.quantization_loss = (torch.norm(X_old - X, p="fro", dim=1) ** 2).mean() # 这玩意也不行了 + # # # self.quantization_loss = (gap.abs()).mean() + # # # # self.quantization_loss = (gap ** 2).mean() # 拉爆了 + # # diff = torch.max(X_old.abs() - self.regular_margin) + # # diff = torch.where(diff < 0., torch.zeros_like(diff), diff) + # # self.quantization_loss = self.regular_margin + diff + 1/global_placeholder.quant_bit * self.scale.detach() * self.identity * X_old.std() + # # # self.quantization_loss = self.regular_margin + diff + + # # self.quantization_loss =1/global_placeholder.quant_bit * self.scale.detach() * self.identity * X.std() + # scale = grad_scale(self.scale, grad_factor) + + # self.quantization_loss =(1/global_placeholder.quant_bit * scale) ** 2 + + + return X + + +def _fake_quantize_learnable_per_tensor_affine_training(x, scale, zero_point, quant_min, quant_max, grad_factor): + zero_point = (zero_point.round() - zero_point).detach() + zero_point + scale = grad_scale(scale, grad_factor) + zero_point = grad_scale(zero_point, grad_factor) + x = x / scale + zero_point + x = (x.round() - x).detach() + x + x = torch.clamp(x, quant_min, quant_max) + return (x - zero_point) * scale + +def _fake_quantize_learnable_per_channel_affine_training(x, scale, zero_point, ch_axis, quant_min, quant_max, grad_factor): + zero_point = (zero_point.round() - zero_point).detach() + zero_point + new_shape = [1] * len(x.shape) + new_shape[ch_axis] = x.shape[ch_axis] + scale = grad_scale(scale, grad_factor).reshape(new_shape) + zero_point = grad_scale(zero_point, grad_factor).reshape(new_shape) + x = x / scale + zero_point + x = (x.round() - x).detach() + x + x = torch.clamp(x, quant_min, quant_max) + return (x - zero_point) * scale + + +def grad_scale(t, scale): + return (t - (t * scale)).detach() + (t * scale) + + +class FakeQuantizeLearnablePerchannelAffine(torch.autograd.Function): + @staticmethod + def forward(ctx, x, scale, zero_point, ch_axis, quant_min, quant_max, grad_factor): + return _fake_quantize_learnable_per_channel_affine_training(x, scale, zero_point, ch_axis, + quant_min, quant_max, grad_factor) + + @staticmethod + def symbolic(g, x, scale, zero_point, ch_axis, quant_min, quant_max, grad_factor): + return g.op("::FakeQuantizeLearnablePerchannelAffine", x, scale, zero_point, quant_min_i=quant_min, quant_max_i=quant_max) diff --git a/mqbench/fake_quantize/nnie.py b/mqbench/fake_quantize/nnie.py new file mode 100644 index 0000000..d05c18d --- /dev/null +++ b/mqbench/fake_quantize/nnie.py @@ -0,0 +1,44 @@ +import torch + +from mqbench.fake_quantize.quantize_base import QuantizeBase +from mqbench.utils import no_jit_trace + + +class NNIEFakeQuantize(QuantizeBase): + def __init__(self, observer, **observer_kwargs): + super(NNIEFakeQuantize, self).__init__(observer, **observer_kwargs) + self.register_buffer('data_max', torch.tensor(float('-inf'))) + + def forward(self, X): + with no_jit_trace(): + if self.observer_enabled[0] == 1: + self.activation_post_process(X.detach()) + data_max = torch.max(-self.activation_post_process.min_val, self.activation_post_process.max_val) + self.data_max = torch.max(data_max, self.data_max) + if self.fake_quant_enabled[0] == 1: + X = NNIEQuantizeFunc.apply(X, self.data_max) + return X + + +class NNIEQuantizeFunc(torch.autograd.Function): + @staticmethod + def forward(ctx, x, data_max): + z = (16 * torch.log2(data_max.double())).round() - 127 + x = x.double() + pos_idx = x > 2 ** ((z - 16) / 16) + neg_idx = x < - 2 ** ((z + 1 - 16) / 16) + zero_idx = (x >= - 2 ** ((z + 1 - 16) / 16)) & (x < 2 ** ((z - 16) / 16)) + x[zero_idx] = 0 + x[pos_idx] = 2 ** ((torch.clamp(torch.round(16 * torch.log2(x[pos_idx]) - z), 0, 127) + z) / 16) + x[neg_idx] = - 2 ** ((torch.clamp(torch.round(16 * torch.log2(-x[neg_idx]) - z), 1, 127) + z) / 16) + x = x.float() + return x + + @staticmethod + def backward(ctx, grad_output): + grad_input = grad_output + return grad_input, None + + @staticmethod + def symbolic(g, x, data_max): + return g.op("::NNIEQuantize", x, data_max) \ No newline at end of file diff --git a/mqbench/fake_quantize/pact.py b/mqbench/fake_quantize/pact.py new file mode 100644 index 0000000..181567c --- /dev/null +++ b/mqbench/fake_quantize/pact.py @@ -0,0 +1,52 @@ +import torch +from torch.nn.parameter import Parameter + +from mqbench.fake_quantize.quantize_base import QuantizeBase + + +class PACTFakeQuantize(QuantizeBase): + def __init__(self, observer, alpha=6.0, **observer_kwargs): + super(PACTFakeQuantize, self).__init__(observer, **observer_kwargs) + self.alpha = Parameter(torch.tensor([alpha])) + if not self.is_symmetric_quant: + self.n_alpha = Parameter(torch.tensor([-alpha])) + self.register_buffer('scale', torch.tensor([1.0], dtype=torch.float)) + self.register_buffer('zero_point', torch.tensor([0], dtype=torch.int)) + + @torch.jit.export + def extra_repr(self): + return 'fake_quant_enabled={}, observer_enabled={}, ' \ + 'quant_min={}, quant_max={}, dtype={}, qscheme={}, ch_axis={}, ' \ + 'alpha={}'.format( + self.fake_quant_enabled, self.observer_enabled, + self.quant_min, self.quant_max, + self.dtype, self.qscheme, self.ch_axis, self.alpha) + + def forward(self, X): + if self.observer_enabled[0] == 1: + self.activation_post_process(X.detach()) + X = torch.where(X > self.alpha, self.alpha, X) + self.activation_post_process.max_val.data.fill_(self.alpha.data[0]) + if X.min() < 0: + if self.is_symmetric_quant: + X = torch.where(X < -self.alpha, -self.alpha, X) + self.activation_post_process.min_val.data.fill_(-self.alpha[0].data) + else: + X = torch.where(X < self.n_alpha, self.n_alpha, X) + self.activation_post_process.min_val.data.fill_(self.n_alpha[0].data) + else: + self.activation_post_process.min_val.data.fill_(0.) + + _scale, _zero_point = self.activation_post_process.calculate_qparams() + _scale, _zero_point = _scale.to(self.scale.device), _zero_point.to(self.zero_point.device) + if self.scale.shape != _scale.shape: + self.scale.resize_(_scale.shape) + self.zero_point.resize_(_zero_point.shape) + self.scale.copy_(_scale) + self.zero_point.copy_(_zero_point) + + if self.fake_quant_enabled[0] == 1: + X = torch.fake_quantize_per_tensor_affine( + X, self.scale.item(), int(self.zero_point.item()), self.quant_min, self.quant_max) + + return X \ No newline at end of file diff --git a/mqbench/fake_quantize/pure_hooker.py b/mqbench/fake_quantize/pure_hooker.py new file mode 100644 index 0000000..b0a4e5c --- /dev/null +++ b/mqbench/fake_quantize/pure_hooker.py @@ -0,0 +1,64 @@ +import torch +from torch.nn.parameter import Parameter + +from mqbench.fake_quantize.quantize_base import QuantizeBase +from mqbench.utils import is_symmetric_quant, is_tracing_state +from mqbench.utils.hook import PerChannelLoadHook +import global_placeholder + +class PureHooker(QuantizeBase): + r""" + """ + + def __init__(self, observer, scale=1., zero_point=0., use_grad_scaling=True, **observer_kwargs): + super(PureHooker, self).__init__(observer, **observer_kwargs) + # self.regular_margin = Parameter(torch.tensor([1.])) + # self.use_grad_scaling = use_grad_scaling + # self.scale = Parameter(torch.tensor([scale])) + # self.register_buffer('zero_point', torch.tensor([zero_point])) # NOTE 已改 这里就是不对劲,就应该是buffer,而且grad还会占用显存 + # self.register_buffer('eps', torch.tensor([torch.finfo(torch.float32).eps])) + # # Check whether the module will load a state dict; + # # Initialize the shape of per-channel 'scale' and 'zero-point' before copying values + # self.load_state_dict_hook = PerChannelLoadHook(self) + # # NOTE test + # # self.register_buffer('quantization_loss', torch.tensor([0])) + self.compute_qloss = False + self.ema = 0 + + + @torch.jit.export + def extra_repr(self): + return 'fake_quant_enabled={}, observer_enabled={}, ' \ + 'quant_min={}, quant_max={}, dtype={}, qscheme={}, ch_axis={}, ' \ + 'scale={}, zero_point={}'.format( + self.fake_quant_enabled, self.observer_enabled, + self.quant_min, self.quant_max, + self.dtype, self.qscheme, self.ch_axis, self.scale if self.ch_axis == -1 else 'List[%s]' % str(self.scale.shape), + self.zero_point if self.ch_axis == -1 else 'List') + + def forward(self, X): + if self.observer_enabled[0] == 1: + + if self.compute_qloss: + # 计算std,初始化margin + if self.ema == 0: + self.ema = 2 * X.std() + else: + self.ema = 0.9 * 2 * X.std() + 0.1 * self.ema + self.regular_margin.data.copy_(self.ema) + + if self.fake_quant_enabled[0] == 1: + # Learnable fake quantize have to zero_point.float() to make it learnable. + if self.compute_qloss: + diff = torch.max(X.abs() - self.regular_margin) + diff = torch.where(diff < 0., torch.zeros_like(diff), diff) + self.quantization_loss = self.regular_margin + diff + X.std() ** 2 # 这样子一开始直接崩 + # self.quantization_loss = self.regular_margin + diff + + return X + + + +def grad_scale(t, scale): + return (t - (t * scale)).detach() + (t * scale) + diff --git a/mqbench/fake_quantize/qdrop_quantizer.py b/mqbench/fake_quantize/qdrop_quantizer.py new file mode 100644 index 0000000..3717aed --- /dev/null +++ b/mqbench/fake_quantize/qdrop_quantizer.py @@ -0,0 +1,77 @@ +'''this is for activation quantizer in BRECQ and QDrop''' +import torch +from torch.nn.parameter import Parameter +from mqbench.fake_quantize.quantize_base import QuantizeBase + + +class QDropFakeQuantize(QuantizeBase): + """This is based on the fixedfakequantize. + And we wrap scale as parameter, where BRECQ and QDrop both learn the scale. + """ + + def __init__(self, observer, **observer_kwargs): + super(QDropFakeQuantize, self).__init__(observer, **observer_kwargs) + # self.register_buffer('scale', torch.tensor([1.0], dtype=torch.float)) + self.scale = Parameter(torch.tensor([1.0], dtype=torch.float)) + self.register_buffer('zero_point', torch.tensor([0], dtype=torch.int)) + self.prob = 1.0 # 1.0 means no drop; + + def forward(self, X): + if self.observer_enabled[0] == 1: + self.activation_post_process(X.detach()) + _scale, _zero_point = self.calculate_qparams() + _scale, _zero_point = _scale.to(self.scale.device), _zero_point.to(self.zero_point.device) + if self.ch_axis != -1: + self.scale.data = torch.ones_like(_scale) + self.zero_point.resize_(_zero_point.shape) + + self.scale.data.copy_(_scale) + self.zero_point.copy_(_zero_point) + + if self.fake_quant_enabled[0] == 1: + x_orig = X + if self.is_per_channel: + X = _fake_quantize_learnable_per_channel_affine_training( + X, self.scale, self.zero_point, self.ch_axis, + self.quant_min, self.quant_max) + else: + X = _fake_quantize_learnable_per_tensor_affine_training( + X, self.scale, self.zero_point, self.quant_min, self.quant_max) + if self.prob < 1.0: + x_prob = torch.where(torch.rand_like(X) < self.prob, X, x_orig) + return x_prob + return X + + @torch.jit.export + def extra_repr(self): + return 'fake_quant_enabled={}, observer_enabled={}, ' \ + 'quant_min={}, quant_max={}, dtype={}, qscheme={}, ch_axis={}, ' \ + 'scale={}, zero_point={}'.format( + self.fake_quant_enabled, self.observer_enabled, + self.quant_min, self.quant_max, + self.dtype, self.qscheme, self.ch_axis, self.scale.data if self.ch_axis == -1 else 'List', + self.zero_point if self.ch_axis == -1 else 'List') + + +def round_ste(x: torch.Tensor): + """ + Implement Straight-Through Estimator for rounding operation. + """ + return (x.round() - x).detach() + x + + +def _fake_quantize_learnable_per_channel_affine_training(x, scale, zero_point, ch_axis, quant_min, quant_max): + new_shape = [1] * len(x.shape) + new_shape[ch_axis] = x.shape[ch_axis] + scale = scale.reshape(new_shape) + x_int = round_ste(x / scale) + zero_point + x_quant = torch.clamp(x_int, quant_min, quant_max) + x_dequant = (x_quant - zero_point) * scale + return x_dequant + + +def _fake_quantize_learnable_per_tensor_affine_training(x, scale, zero_point, quant_min, quant_max): + x_int = round_ste(x / scale) + zero_point + x_quant = torch.clamp(x_int, quant_min, quant_max) + x_dequant = (x_quant - zero_point) * scale + return x_dequant diff --git a/mqbench/fake_quantize/quantize_base.py b/mqbench/fake_quantize/quantize_base.py new file mode 100644 index 0000000..8fe8fc1 --- /dev/null +++ b/mqbench/fake_quantize/quantize_base.py @@ -0,0 +1,49 @@ +import torch +from torch.quantization import FakeQuantizeBase +from torch.quantization.observer import MovingAverageMinMaxObserver +from torch.quantization.fake_quantize import _is_per_channel, _is_per_tensor + +from mqbench.utils import is_symmetric_quant + +_version_under_1100 = int(torch.__version__.split('.')[1]) < 10 + +class QuantizeBase(FakeQuantizeBase): + r""" This is an extension of the FakeQuantize module in fake_quantize.py, which + supports more generalized lower-bit quantization and support learning of the scale + and zero point parameters through backpropagation. For literature references, + please see the class _LearnableFakeQuantizePerTensorOp. + In addition to the attributes in the original FakeQuantize module, the _LearnableFakeQuantize + module also includes the following attributes to support quantization parameter learning. + """ + def __init__(self, observer=MovingAverageMinMaxObserver, **observer_kwargs): + super().__init__() + self.activation_post_process = observer(**observer_kwargs) + self.dtype = self.activation_post_process.dtype + self.qscheme = self.activation_post_process.qscheme + self.quant_min = self.activation_post_process.quant_min + self.quant_max = self.activation_post_process.quant_max + assert self.quant_min <= self.quant_max, \ + 'quant_min must be less than or equal to quant_max' + self.pot_scale = self.activation_post_process.pot_scale + self.ch_axis = self.activation_post_process.ch_axis \ + if hasattr(self.activation_post_process, 'ch_axis') else -1 + assert _is_per_channel(self.qscheme) or \ + _is_per_tensor(self.qscheme), \ + 'Only per channel and per tensor quantization are supported in fake quantize' + \ + ' got qscheme: ' + str(self.qscheme) + self.is_per_channel = _is_per_channel(self.qscheme) + bitrange = torch.tensor(self.quant_max - self.quant_min + 1).double() + self.bitwidth = int(torch.log2(bitrange).item()) + self.is_symmetric_quant = is_symmetric_quant(self.qscheme) + + @torch.jit.export + def calculate_qparams(self): + return self.activation_post_process.calculate_qparams() + + @torch.jit.export + def extra_repr(self): + return 'fake_quant_enabled={}, observer_enabled={}, ' \ + 'quant_min={}, quant_max={}, dtype={}, qscheme={}, ch_axis={}, '.format( + self.fake_quant_enabled, self.observer_enabled, + self.quant_min, self.quant_max, + self.dtype, self.qscheme, self.ch_axis) diff --git a/mqbench/fake_quantize/tqt.py b/mqbench/fake_quantize/tqt.py new file mode 100644 index 0000000..1b4937c --- /dev/null +++ b/mqbench/fake_quantize/tqt.py @@ -0,0 +1,126 @@ +import torch + +from torch.nn.parameter import Parameter +from mqbench.fake_quantize.quantize_base import QuantizeBase +from mqbench.utils import is_symmetric_quant + + +class TqtFakeQuantize(QuantizeBase): + def __init__(self, observer, scale=1., zero_point=0., **observer_kwargs): + super(TqtFakeQuantize, self).__init__(observer, **observer_kwargs) + self.scale = Parameter(torch.tensor([scale])) + self.register_buffer('zero_point', torch.tensor([zero_point])) + self.register_buffer('eps', torch.tensor([torch.finfo(torch.float32).eps])) + self.quant_type = None + self.mth = None + self.compute_qloss = False + + @torch.jit.export + def extra_repr(self): + return 'fake_quant_enabled={}, observer_enabled={}, ' \ + 'quant_min={}, quant_max={}, dtype={}, qscheme={}, ch_axis={}, ' \ + 'scale={}, zero_point={}'.format( + self.fake_quant_enabled, self.observer_enabled, + self.quant_min, self.quant_max, + self.dtype, self.qscheme, self.ch_axis, self.scale if self.ch_axis == -1 else 'List', + self.zero_point if self.ch_axis == -1 else 'List') + + def forward(self, X): + # Learnable fake quantize have to zero_point.float() to make it learnable. + if self.observer_enabled[0] == 1: + self.activation_post_process(X.detach()) + _scale, _zero_point = self.activation_post_process.calculate_qparams() + _scale = _scale.to(self.scale.device) + _zero_point = _zero_point.to(self.zero_point.device) + + if self.ch_axis != -1: + self.scale.data = torch.ones_like(_scale) + self.zero_point.data = torch.zeros_like(_zero_point.float()) + + self.scale.data.copy_(_scale) + self.zero_point.data.copy_(_zero_point.float()) + else: + self.scale.data.abs_() + self.scale.data.clamp_(min=self.eps.item()) + + # TODO 写能求最小化量化误差的代码 + X_old = X + + if self.fake_quant_enabled[0] == 1: + assert is_symmetric_quant(self.qscheme) + "TQT is a symmetric quantization FakeQuantize Op." + self.zero_point.data.zero_() + assert self.is_per_channel is False + "TQT is a per-tensor quantization FakeQuantize Op." + X = FakeQuantizeTqtAffine.apply(X, self.scale, self.zero_point, self.quant_min, self.quant_max, self.mth) # 但是这里,虽然传勒zero point 但是没用到 + + # NOTE 算 + # if self.compute_qloss: + # self.quantization_loss = (torch.norm(X_old - X, p="fro", dim=1) ** 2).mean() + return X + + def set_quant_type(self, quant_type): + if quant_type in ['input', 'tensor', 'param']: + self.quant_type = quant_type + self.activation_post_process.set_quant_type(quant_type) + self.set_forward_method() + else: + raise ValueError(f'The quant type {quant_type} of TQTQuantizer is not right.') + + def set_forward_method(self): + self.mth = torch.tensor(3) if self.quant_type == 'param' else torch.tensor(2) + +def _fake_quantize_tqt_affine_training(x, scale, zero_point, quant_min, quant_max, mth): + if scale < 2 ** -15: + max_scale = 0 + else: + max_scale = 1 / scale + max_scale = torch.floor(max_scale.log2()) + scale = 1 / (2 ** max_scale) + if mth == 3: + new_x = torch.clamp(scale_round(x / scale), quant_min, quant_max) * scale + elif mth == 2: + new_x = torch.clamp(x / scale, quant_min, quant_max) + new_x = scale_floor_ceil(new_x) + new_x *= scale + else: + raise ValueError(f'Invalid method {mth} encoding!') + return new_x + + +def scale_round(t): + return (torch.round(t) - t).detach() + t + +def scale_floor_ceil(t): + return (torch.where((t < 0) & (t - t.floor() == 0.5), t.ceil(), t.round()) - t).detach() + t + +def _t(x, t): + return torch.tensor(x).type_as(t) + +class FakeQuantizeTqtAffine(torch.autograd.Function): + @staticmethod + def forward(ctx, x, scale, zero_point, quant_min, quant_max, mth): + qx = _fake_quantize_tqt_affine_training(x, scale, zero_point, quant_min, quant_max, mth) + ctx.save_for_backward(x, scale, _t(quant_min, x), _t(quant_max, x)) + return qx + + @staticmethod + def backward(ctx, grad_outputs): + x, s, qmin, qmax = ctx.saved_tensors + scaled_x = x / s + rounded_scaled_x = torch.where( + (scaled_x < 0) & (scaled_x - torch.floor(scaled_x) == 0.5), + torch.ceil(scaled_x), torch.round(scaled_x) + ) + + is_lt_min = rounded_scaled_x < qmin + is_gt_max = rounded_scaled_x > qmax + is_ge_min_and_le_max = ~is_lt_min & ~is_gt_max + + grad_x = grad_outputs.clone() + grad_x = torch.where(is_ge_min_and_le_max, grad_x, 0 * grad_x) + return grad_x.to(grad_outputs.device), None, None, None, None, None + + @staticmethod + def symbolic(g, x, scale, zero_point, quant_min, quant_max, mth): + return g.op("::FakeQuantizeTqtAffine", x, scale, zero_point, quant_min_i=quant_min, quant_max_i=quant_max) diff --git a/mqbench/fuser_method_mappings.py b/mqbench/fuser_method_mappings.py new file mode 100644 index 0000000..f3b4f37 --- /dev/null +++ b/mqbench/fuser_method_mappings.py @@ -0,0 +1,222 @@ +from typing import Optional, Type + +import torch +import torch.nn as nn +from torch.quantization.fx.fusion_patterns import ConvBNReLUFusion, ModuleReLUFusion +from torch.quantization.fx.quantization_types import QuantizerCls +from torch.fx.graph import Node + +import mqbench.nn as qnn +import mqbench.nn.intrinsic as qnni +import mqbench.nn.intrinsic.qat as qnniqat +from mqbench.utils.fusion import fuse_deconv_bn_eval +from mqbench.nn.modules import FrozenBatchNorm2d + + +class ConvFreezebnReLUFusion(ConvBNReLUFusion): + def __init__(self, quantizer: QuantizerCls, node: Node): + super(ConvBNReLUFusion, self).__init__(quantizer, node) + self.relu_node = None + self.bn_node = None + if (node.op == 'call_function' and node.target is torch.nn.functional.relu) or \ + (node.op == 'call_module' and type(quantizer.modules[node.target]) == torch.nn.ReLU): + self.relu_node = node + assert isinstance(node.args[0], Node) + node = node.args[0] + assert node.op == 'call_module' + if type(quantizer.modules[node.target]) in [torch.nn.BatchNorm1d, torch.nn.BatchNorm2d, torch.nn.BatchNorm3d, FrozenBatchNorm2d]: + self.bn_node = node + self.bn = quantizer.modules[self.bn_node.target] + assert isinstance(node.args[0], Node) + node = node.args[0] + assert node.op == 'call_module' + self.conv_node = node + self.conv = quantizer.modules[self.conv_node.target] + + +def fuse_linear_bn(linear, bn): + r"""Given the linear and bn modules, fuses them and returns the fused module + + Args: + conv: Module instance of type Linear + bn: Spatial BN instance that needs to be fused with the conv + + Examples:: + + >>> m1 = nn.Linear(10, 20) + >>> b1 = nn.BatchNorm1d(20) + >>> m2 = fuse_linear_bn(m1, b1) + """ + assert(linear.training == bn.training),\ + "Linear and BN both must be in the same mode (train or eval)." + + if linear.training: + assert bn.affine, 'Only support fusing BatchNorm1d with affine set to True' + assert bn.track_running_stats, 'Only support fusing BatchNorm1d with tracking_running_stats set to True' + return qnn.intrinsic.LinearBn1d(linear, bn) + else: + return nn.utils.fusion.fuse_linear_bn_eval(linear, bn) + + +def fuse_deconv_bn(deconv, bn): + assert(deconv.training == bn.training),\ + 'DeConv and BN must be in the same mode (train or eval)' + + if deconv.training: + assert bn.num_features == deconv.out_channels, 'Output channel of ConvTranspose2d must match num_features of BatchNorm2d' + assert bn.affine, 'Only support fusing BatchNorm2d with affine set to True' + assert bn.track_running_stats, 'Only support fusing BatchNorm2d with tracking_running_stats set to True' + return qnni.ConvTransposeBn2d(deconv, bn) + else: + return fuse_deconv_bn_eval(deconv, bn) + + +def fuse_deconv_bn_relu(deconv, bn, relu): + assert(deconv.training == bn.training == relu.training),\ + "DeConv and BN both must be in the same mode (train or eval)." + + if deconv.training: + assert bn.num_features == deconv.out_channels, 'Output channel of ConvTranspose2d must match num_features of BatchNorm2d' + assert bn.affine, 'Only support fusing BatchNorm2d with affine set to True' + assert bn.track_running_stats, 'Only support fusing BatchNorm2d with tracking_running_stats set to True' + return qnni.ConvTransposeBnReLU2d(deconv, bn, relu) + else: + return qnni.ConvTransposeReLU2d(fuse_deconv_bn_eval(deconv, bn), relu) + + +def fuse_conv_freezebn(conv, bn): + assert(bn.training is False), "Freezebn must be eval." + + fused_module_class_map = { + nn.Conv2d: qnni.ConvFreezebn2d, + } + + if conv.training: + assert bn.num_features == conv.out_channels, 'Output channel of Conv2d must match num_features of BatchNorm2d' + assert bn.affine, 'Only support fusing BatchNorm2d with affine set to True' + assert bn.track_running_stats, 'Only support fusing BatchNorm2d with tracking_running_stats set to True' + fused_module_class = fused_module_class_map.get((type(conv)), None) + return fused_module_class(conv, bn) + else: + return nn.utils.fuse_conv_bn_eval(conv, bn) + + +def fuse_conv_freezebn_relu(conv, bn, relu): + assert(conv.training == relu.training and bn.training is False), "Conv and relu both must be in the same mode (train or eval) and bn must be eval." + fused_module : Optional[Type[nn.Sequential]] = None + if conv.training: + map_to_fused_module_train = { + nn.Conv2d: qnni.ConvFreezebnReLU2d, + } + assert bn.num_features == conv.out_channels, 'Output channel of Conv must match num_features of BatchNorm' + assert bn.affine, 'Only support fusing BatchNorm with affine set to True' + assert bn.track_running_stats, 'Only support fusing BatchNorm with tracking_running_stats set to True' + fused_module = map_to_fused_module_train.get(type(conv), None) + return fused_module(conv, bn, relu) + else: + map_to_fused_module_eval = { + nn.Conv2d: nn.intrinsic.ConvReLU2d, + } + fused_module = map_to_fused_module_eval.get(type(conv), None) + fused_conv = nn.utils.fusion.fuse_conv_bn_eval(conv, bn) + return fused_module(fused_conv, relu) + + +def fuse_deconv_freezebn(deconv, bn): + assert(bn.training is False), "Freezebn must be eval." + + if deconv.training: + assert bn.num_features == deconv.out_channels, 'Output channel of ConvTranspose2d must match num_features of BatchNorm2d' + assert bn.affine, 'Only support fusing BatchNorm2d with affine set to True' + assert bn.track_running_stats, 'Only support fusing BatchNorm2d with tracking_running_stats set to True' + return qnni.ConvTransposeFreezebn2d(deconv, bn) + else: + return fuse_deconv_bn_eval(deconv, bn) + + +def fuse_deconv_freezebn_relu(deconv, bn, relu): + assert(deconv.training == relu.training and bn.training is False), "Conv and relu both must be in the same mode (train or eval) and bn must be eval." + + if deconv.training: + assert bn.num_features == deconv.out_channels, 'Output channel of ConvTranspose2d must match num_features of BatchNorm2d' + assert bn.affine, 'Only support fusing BatchNorm2d with affine set to True' + assert bn.track_running_stats, 'Only support fusing BatchNorm2d with tracking_running_stats set to True' + return qnni.ConvTransposeFreezebnReLU2d(deconv, bn, relu) + else: + return qnni.ConvTransposeReLU2d(fuse_deconv_bn_eval(deconv, bn), relu) + + +fuse_custom_config_dict = { + "additional_fuser_method_mapping": { + (torch.nn.Linear, torch.nn.BatchNorm1d): fuse_linear_bn, + (torch.nn.ConvTranspose2d, torch.nn.BatchNorm2d): fuse_deconv_bn, + (torch.nn.ConvTranspose2d, torch.nn.BatchNorm2d, torch.nn.ReLU): fuse_deconv_bn_relu, + (torch.nn.ConvTranspose2d, torch.nn.ReLU): qnni.ConvTransposeReLU2d, + (nn.Conv2d, FrozenBatchNorm2d, nn.ReLU): fuse_conv_freezebn_relu, + (nn.Conv2d, FrozenBatchNorm2d): fuse_conv_freezebn, + (nn.ConvTranspose2d, FrozenBatchNorm2d, nn.ReLU): fuse_deconv_freezebn_relu, + (nn.ConvTranspose2d, FrozenBatchNorm2d): fuse_deconv_freezebn, + }, + "additional_fusion_pattern": { # 似乎这些都是torch官方的定义 + (torch.nn.BatchNorm1d, torch.nn.Linear): + ConvBNReLUFusion, + (torch.nn.BatchNorm2d, torch.nn.ConvTranspose2d): + ConvBNReLUFusion, + (torch.nn.ReLU, torch.nn.ConvTranspose2d): + ConvBNReLUFusion, + (torch.nn.ReLU, (torch.nn.BatchNorm2d, torch.nn.ConvTranspose2d)): + ConvBNReLUFusion, + (torch.nn.functional.relu, torch.nn.ConvTranspose2d): + ConvBNReLUFusion, + (torch.nn.functional.relu, (torch.nn.BatchNorm2d, torch.nn.ConvTranspose2d)): + ConvBNReLUFusion, + (torch.nn.ReLU, (FrozenBatchNorm2d, torch.nn.Conv2d)): + ConvFreezebnReLUFusion, + (FrozenBatchNorm2d, torch.nn.Conv2d): + ConvFreezebnReLUFusion, + (torch.nn.ReLU, (FrozenBatchNorm2d, torch.nn.ConvTranspose2d)): + ConvFreezebnReLUFusion, + (FrozenBatchNorm2d, torch.nn.ConvTranspose2d): + ConvFreezebnReLUFusion, + }, + "additional_qat_module_mappings": { + nn.ConvTranspose2d: qnn.qat.ConvTranspose2d, + qnni.LinearBn1d: qnniqat.LinearBn1d, + qnni.ConvTransposeBn2d: qnniqat.ConvTransposeBn2d, + qnni.ConvTransposeReLU2d: qnniqat.ConvTransposeReLU2d, + qnni.ConvTransposeBnReLU2d: qnniqat.ConvTransposeBnReLU2d, + qnni.ConvFreezebn2d: qnniqat.ConvFreezebn2d, + qnni.ConvFreezebnReLU2d: qnniqat.ConvFreezebnReLU2d, + qnni.ConvTransposeFreezebn2d: qnniqat.ConvTransposeFreezebn2d, + qnni.ConvTransposeFreezebnReLU2d: qnniqat.ConvTransposeFreezebnReLU2d, + nn.Embedding: qnn.qat.Embedding, + }, +} + + +def _sort_fusion_patterns(pats): + keys = [] + for key in pats.keys(): + if pats[key] is ModuleReLUFusion: + keys.append(key) + for key in keys: + pats.move_to_end(key) + + +# Sinse additional_fuser_method_mapping will not be set because fuser.py:54 +# do not pass this dict. +from torch.quantization.fuser_method_mappings import DEFAULT_OP_LIST_TO_FUSER_METHOD +from torch.quantization.fx.pattern_utils import DEFAULT_FUSION_PATTERNS +from torch.quantization.quantization_mappings import DEFAULT_QAT_MODULE_MAPPINGS + +DEFAULT_OP_LIST_TO_FUSER_METHOD.update( + fuse_custom_config_dict['additional_fuser_method_mapping']) +DEFAULT_FUSION_PATTERNS.update( + fuse_custom_config_dict['additional_fusion_pattern']) +# Make longer matched pattern prior. +# i.e. Conv + BN + Relu should match ConvBnRelu before BNRelu. +# Any thing registered in class ConvBNReLUFusion should be +# proir than class ModuleReLUFusion. +_sort_fusion_patterns(DEFAULT_FUSION_PATTERNS) +DEFAULT_QAT_MODULE_MAPPINGS.update( + fuse_custom_config_dict['additional_qat_module_mappings']) diff --git a/mqbench/fusion_method.py b/mqbench/fusion_method.py new file mode 100644 index 0000000..5b5b6b0 --- /dev/null +++ b/mqbench/fusion_method.py @@ -0,0 +1,274 @@ +import torch +import torch.nn.intrinsic.qat as nniqat +from torch.nn.utils.fusion import fuse_conv_bn_eval, fuse_linear_bn_eval +from torch.quantization.fx.utils import _parent_name + +import mqbench.nn.intrinsic as qnni +import mqbench.nn.intrinsic.qat as qnniqat +import mqbench.nn.qat as qnnqat +from mqbench.utils.registry import register_convert_function +from mqbench.fuser_method_mappings import fuse_deconv_bn_eval +from mqbench.quantization.default_bias_fake_quant import bias_fake_quantizer + + +@register_convert_function(qnni.LinearBn1d) +def convert_qnni_linearbn(model, fused_node): + modules = dict(model.named_modules()) + fused_module = modules[fused_node.target] + fused_linear = fuse_linear_bn_eval(fused_module[0], fused_module[1]) + linear_parent_name, linear_name = _parent_name(fused_node.target) + setattr(modules[linear_parent_name], linear_name, fused_linear) + + +@register_convert_function(qnniqat.LinearBn1d) +def convert_qnniqat_linearbn(model, fused_node): + modules = dict(model.named_modules()) + fused_module = modules[fused_node.target] + # Create a Linear from FusedModule. + linear = torch.nn.Linear(fused_module.in_features, fused_module.out_features, fused_module.bias is not None) + linear.weight = fused_module.weight + if fused_module.bias is not None: + linear.bias = fused_module.bias + # Merge Linear + BN + fused_linear = fuse_linear_bn_eval(linear.eval(), fused_module.bn) + # We need nn.qat.linear here to export weight quantize node. + linear.qconfig = fused_module.qconfig + linear = torch.nn.qat.Linear.from_float(linear) + # Attach weight fake quantize params. + linear.weight_fake_quant = fused_module.weight_fake_quant + linear_parent_name, linear_name = _parent_name(fused_node.target) + setattr(modules[linear_parent_name], linear_name, fused_linear) + + +@register_convert_function(qnniqat.ConvFreezebn2d) +@register_convert_function(nniqat.ConvBn2d) +# @register_convert_function(nniqat.ConvBn3d) # FIXME 为什么这个有报错 XXX +def convert_nniqat_convbn(model, fused_node): + """nniqat.ConvBn2d ----> nn.Conv2d ----> nniqat.Conv2d + """ + fused_module_class_map = { + qnniqat.ConvFreezebn2d: torch.nn.Conv2d, + qnniqat.ConvFreezebnReLU2d: torch.nn.Conv2d, + nniqat.ConvBn2d: torch.nn.Conv2d, + nniqat.ConvBnReLU2d: torch.nn.Conv2d, + nniqat.ConvBn3d: torch.nn.Conv3d, + nniqat.ConvBnReLU3d: torch.nn.Conv3d, + } + fused_qat_module_class_map = { + torch.nn.Conv2d: torch.nn.qat.Conv2d, + torch.nn.Conv3d: torch.nn.qat.Conv3d, + } + modules = dict(model.named_modules()) + fused_module = modules[fused_node.target] + # Create a Conv2d from FusedModule. + conv = fused_module_class_map[type(fused_module)](fused_module.in_channels, fused_module.out_channels, + fused_module.kernel_size, fused_module.stride, + fused_module.padding, fused_module.dilation, + fused_module.groups, fused_module.bias is not None, + fused_module.padding_mode) + conv.weight = fused_module.weight + if fused_module.bias is not None: + conv.bias = fused_module.bias + fused_conv = fuse_conv_bn_eval(conv.eval(), fused_module.bn) + # We need nn.qat.conv here to export weight quantize node. + fused_conv.qconfig = fused_module.qconfig + fused_conv = fused_qat_module_class_map[type(conv)].from_float(fused_conv) + # Attach weight fake quantize params. + fused_conv.weight_fake_quant = fused_module.weight_fake_quant + conv_parent_name, conv_name = _parent_name(fused_node.target) + setattr(modules[conv_parent_name], conv_name, fused_conv) + + +@register_convert_function(qnniqat.ConvFreezebnReLU2d) +@register_convert_function(nniqat.ConvBnReLU2d) +# @register_convert_function(nniqat.ConvBnReLU3d) +def convert_nniqat_convbnrelu(model, fused_node): + convert_nniqat_convbn(model, fused_node) + modules = dict(model.named_modules()) + fused_module = modules[fused_node.target] + # We need to Insert Relu after Merged conv. + conv_parent_name, conv_name = _parent_name(fused_node.target) + relu_name = 'relu' + # Maybe has another name, but we cannot know for now. + if not hasattr(modules[conv_parent_name], relu_name): + setattr(modules[conv_parent_name], relu_name, + torch.nn.ReLU(inplace=True).train(fused_module.training)) + # Update modules. + modules = dict(model.named_modules()) + graph = model.graph + nodes = list(model.graph.nodes) + with graph.inserting_after(fused_node): + relu_node_name = relu_name if conv_parent_name == "" else "{}.{}".format(conv_parent_name, relu_name) + assert relu_node_name in modules and isinstance(modules[relu_node_name], torch.nn.ReLU) + inserted_node = graph.create_node("call_module", relu_node_name, (fused_node,), {}) + for _node in nodes: + for i, _arg in enumerate(_node.args): + if _arg == fused_node: + _tmp = list(_node.args) + _tmp[i] = inserted_node + _node.args = tuple(_tmp) + model.recompile() + model.graph.lint() + + +@register_convert_function(qnni.ConvTransposeFreezebn2d) +@register_convert_function(qnni.ConvTransposeBn2d) +def convert_qnni_deconvbn(model, fused_node): + modules = dict(model.named_modules()) + fused_module = modules[fused_node.target] + fused_module_deconv = fused_module[0] + fused_module_bn = fused_module[1] + # Create a ConvTranspose2d from FusedModule. + deconv = torch.nn.ConvTranspose2d(fused_module_deconv.in_channels, fused_module_deconv.out_channels, fused_module_deconv.kernel_size, + stride=fused_module_deconv.stride, padding=fused_module_deconv.padding, output_padding=fused_module_deconv.output_padding, + groups=fused_module_deconv.groups, bias=fused_module_deconv.bias is not None, + dilation=fused_module_deconv.dilation, + padding_mode=fused_module_deconv.padding_mode) + deconv.weight = fused_module_deconv.weight + if fused_module_deconv.bias is not None: + deconv.bias = fused_module_deconv.bias + fused_deconv = fuse_deconv_bn_eval(deconv.eval(), fused_module_bn) + deconv_parent_name, deconv_name = _parent_name(fused_node.target) + setattr(modules[deconv_parent_name], deconv_name, fused_deconv) + + +@register_convert_function(qnniqat.ConvTransposeFreezebn2d) +@register_convert_function(qnniqat.ConvTransposeBn2d) +def convert_qnniqat_deconvbn(model, fused_node): + modules = dict(model.named_modules()) + fused_module = modules[fused_node.target] + # Create a ConvTranspose2d from FusedModule. + deconv = torch.nn.ConvTranspose2d(fused_module.in_channels, fused_module.out_channels, fused_module.kernel_size, + stride=fused_module.stride, padding=fused_module.padding, output_padding=fused_module.output_padding, + groups=fused_module.groups, bias=fused_module.bias is not None, + dilation=fused_module.dilation, + padding_mode=fused_module.padding_mode) + deconv.weight = fused_module.weight + if fused_module.bias is not None: + deconv.bias = fused_module.bias + fused_deconv = fuse_deconv_bn_eval(deconv.eval(), fused_module.bn) + # We need nn.qat.conv here to export weight quantize node. + fused_deconv.qconfig = fused_module.qconfig + fused_deconv = qnnqat.ConvTranspose2d.from_float(fused_deconv) + # Attach weight fake quantize params. + fused_deconv.weight_fake_quant = fused_module.weight_fake_quant + deconv_parent_name, deconv_name = _parent_name(fused_node.target) + setattr(modules[deconv_parent_name], deconv_name, fused_deconv) + + +@register_convert_function(qnni.ConvTransposeFreezebnReLU2d) +@register_convert_function(qnni.ConvTransposeBnReLU2d) +def convert_qnni_deconvbnrelu(model, fused_node): + convert_qnni_deconvbn(model, fused_node) + modules = dict(model.named_modules()) + fused_module = modules[fused_node.target] + deconv_parent_name, deconv_name = _parent_name(fused_node.target) + relu_name = 'relu' + if not hasattr(modules[deconv_parent_name], relu_name): + setattr(modules[deconv_parent_name], relu_name, torch.nn.ReLU(inplace=True).train(fused_module.training)) + # Update modules. + modules = dict(model.named_modules()) + graph = model.graph + nodes = list(model.graph.nodes) + with graph.inserting_after(fused_node): + relu_node_name = relu_name if deconv_parent_name == "" else "{}.{}".format(deconv_parent_name, relu_name) + assert relu_node_name in modules and isinstance(modules[relu_node_name], torch.nn.ReLU) + inserted_node = graph.create_node("call_module", relu_node_name, (fused_node,), {}) + for _node in nodes: + for i, _arg in enumerate(_node.args): + if _arg == fused_node: + _tmp = list(_node.args) + _tmp[i] = inserted_node + _node.args = tuple(_tmp) + model.recompile() + model.graph.lint() + + +@register_convert_function(qnniqat.ConvTransposeFreezebnReLU2d) +@register_convert_function(qnniqat.ConvTransposeBnReLU2d) +def convert_qnniqat_deconvbnrelu(model, fused_node): + convert_qnniqat_deconvbn(model, fused_node) + modules = dict(model.named_modules()) + fused_module = modules[fused_node.target] + deconv_parent_name, deconv_name = _parent_name(fused_node.target) + relu_name = 'relu' + if not hasattr(modules[deconv_parent_name], relu_name): + setattr(modules[deconv_parent_name], relu_name, torch.nn.ReLU(inplace=True).train(fused_module.training)) + # Update modules. + modules = dict(model.named_modules()) + graph = model.graph + nodes = list(model.graph.nodes) + with graph.inserting_after(fused_node): + relu_node_name = relu_name if deconv_parent_name == "" else "{}.{}".format(deconv_parent_name, relu_name) + assert relu_node_name in modules and isinstance(modules[relu_node_name], torch.nn.ReLU) + inserted_node = graph.create_node("call_module", relu_node_name, (fused_node,), {}) + for _node in nodes: + for i, _arg in enumerate(_node.args): + if _arg == fused_node: + _tmp = list(_node.args) + _tmp[i] = inserted_node + _node.args = tuple(_tmp) + model.recompile() + model.graph.lint() + + +@register_convert_function(qnniqat.ConvBn2d) +def convert_qnniqat_convbn(model, fused_node): + """mqbench.nn.intrinsic.qat module add bias quant. + That is the difference between torch.nn.intrinsic.qat module. + """ + modules = dict(model.named_modules()) + fused_module = modules[fused_node.target] + # Create a Conv2d from FusedModule. + conv = torch.nn.Conv2d(fused_module.in_channels, fused_module.out_channels, fused_module.kernel_size, + fused_module.stride, fused_module.padding, fused_module.dilation, + fused_module.groups, fused_module.bias is not None, fused_module.padding_mode) + conv.weight = fused_module.weight + if fused_module.bias is not None: + conv.bias = fused_module.bias + fused_conv = fuse_conv_bn_eval(conv.eval(), fused_module.bn) + # We need nn.qat.conv here to export weight quantize node. + fused_conv.qconfig = fused_module.qconfig + fused_conv = qnnqat.Conv2d.from_float(fused_conv) + # Attach weight fake quantize params. + fused_conv.weight_fake_quant = fused_module.weight_fake_quant + if hasattr(fused_module, 'bias_fake_quant'): + fused_conv.bias_fake_quant = fused_module.bias_fake_quant + else: + fused_conv.bias_fake_quant = bias_fake_quantizer() + fused_conv.bias_fake_quant.set_quant_type('param') + conv_parent_name, conv_name = _parent_name(fused_node.target) + setattr(modules[conv_parent_name], conv_name, fused_conv) + + +@register_convert_function(qnniqat.ConvBnReLU2d) +def convert_qnniqat_convbnrelu(model, fused_node): + """mqbench.nn.intrinsic.qat module add bias quant. + That is the difference between torch.nn.intrinsic.qat module. + """ + convert_qnniqat_convbn(model, fused_node) + modules = dict(model.named_modules()) + fused_module = modules[fused_node.target] + # We need to Insert Relu after Merged conv. + conv_parent_name, conv_name = _parent_name(fused_node.target) + relu_name = 'relu' + # Maybe has another name, but we cannot know for now. + if not hasattr(modules[conv_parent_name], relu_name): + setattr(modules[conv_parent_name], relu_name, + torch.nn.ReLU(inplace=True).train(fused_module.training)) + # Update modules. + modules = dict(model.named_modules()) + graph = model.graph + nodes = list(model.graph.nodes) + with graph.inserting_after(fused_node): + relu_node_name = relu_name if conv_parent_name == "" else "{}.{}".format(conv_parent_name, relu_name) + assert relu_node_name in modules and isinstance(modules[relu_node_name], torch.nn.ReLU) + inserted_node = graph.create_node("call_module", relu_node_name, (fused_node,), {}) + for _node in nodes: + for i, _arg in enumerate(_node.args): + if _arg == fused_node: + _tmp = list(_node.args) + _tmp[i] = inserted_node + _node.args = tuple(_tmp) + model.recompile() + model.graph.lint() \ No newline at end of file diff --git a/mqbench/mix_precision/hessian_per_layer.py b/mqbench/mix_precision/hessian_per_layer.py new file mode 100644 index 0000000..2b94a73 --- /dev/null +++ b/mqbench/mix_precision/hessian_per_layer.py @@ -0,0 +1,198 @@ +from typing import Dict + +import torch +import numpy as np +from pyhessian import hessian, hessian_vector_product, group_product, orthnormal, normalization + + +class hessian_per_layer(hessian): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.first_order_grad_dict = {} + for name, mod in self.model.named_modules(): + if isinstance(mod, (torch.nn.Conv2d, torch.nn.Linear)): + self.first_order_grad_dict[name] = mod.weight.grad + 0. + + def layer_eigenvalues(self, maxIter=100, tol=1e-3) -> Dict: + """ + compute the top_n eigenvalues in one model by layer. + """ + device = self.device + max_eigenvalues_dict = {} + + for name, mod in self.model.named_modules(): + if isinstance(mod, (torch.nn.Conv2d, torch.nn.Linear)): + weight = mod.weight + eigenvectors = [] + eigenvalue = None + v = [torch.randn(weight.size()).to(device)] + v = normalization(v) + first_order_grad = self.first_order_grad_dict[name] + + for i in range(maxIter): + v = orthnormal(v, eigenvectors) + self.model.zero_grad() + + if self.full_dataset: + tmp_eigenvalue, Hv = self.dataloader_hv_product(v) + else: + Hv = hessian_vector_product(first_order_grad, weight, v) + tmp_eigenvalue = group_product(Hv, v).cpu().item() + + v = normalization(Hv) + + if eigenvalue is None: + eigenvalue = tmp_eigenvalue + else: + if abs(eigenvalue - tmp_eigenvalue) / (abs(eigenvalue) + 1e-6) < tol: + break + else: + eigenvalue = tmp_eigenvalue + max_eigenvalues_dict[name] = eigenvalue + + return max_eigenvalues_dict + + def layer_trace(self, maxIter=100, tol=1e-3) -> Dict: + """ + Compute the trace of hessian in one model by layer. + """ + device = self.device + trace_dict = {} + for name, mod in self.model.named_modules(): + if isinstance(mod, (torch.nn.Conv2d, torch.nn.Linear)): + trace_vhv = [] + trace = 0. + weight = mod.weight + first_order_grad = self.first_order_grad_dict[name] + for i in range(maxIter): + self.model.zero_grad() + v = torch.randint_like(weight, high=2, device=device) + # generate Rademacher random variables + v[v == 0] = -1 + v = [v] + + Hv = hessian_vector_product(first_order_grad, weight, v) + trace_vhv.append(group_product(Hv, v).cpu().item()) + if abs(np.mean(trace_vhv) - trace) / (trace + 1e-6) < tol: + break + else: + trace = np.mean(trace_vhv) + trace_dict[name] = trace + + return trace_dict + +class FWDSaverHook: + """ + Forward hook that stores the input and output of a layer/block + """ + def __init__(self): + self.store_input = None + + def __call__(self, module, input_batch, output_batch): + output_batch.requires_grad_() + output_batch.retain_grad() + self.store_input = output_batch + +class BWDSaverHook: + """ + Forward hook that stores the input and output of a layer/block + """ + def __init__(self): + self.store_input = None + + def __call__(self, module, input_batch, output_batch): + self.store_input = output_batch + +class hessian_per_layer_acti(hessian): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.first_order_grad_dict = {} + data = kwargs['data'] + self.layer_prepare(data[0], data[1]) + + def layer_prepare(self, data, target): + self.grad_savers = {} + self.acti_savers = {} + self.model.zero_grad() + for name, mod in self.model.named_modules(): + if isinstance(mod, (torch.nn.Conv2d, torch.nn.Linear)): + self.grad_savers[name] = BWDSaverHook() + self.acti_savers[name] = FWDSaverHook() + mod.register_forward_hook(self.acti_savers[name]) + mod.register_full_backward_hook(self.grad_savers[name]) + los = torch.nn.CrossEntropyLoss() + loss = los(self.model(data.cuda()), target.cuda()) + loss.backward(create_graph=True) + self.grad_dict = {key: self.grad_savers[key].store_input[0] + 0. for key in self.grad_savers} + self.acti_dict = {key: self.acti_savers[key].store_input for key in self.acti_savers} + + def layer_eigenvalues(self, maxIter=100, tol=1e-3) -> Dict: + """ + compute the top_n eigenvalues in one model by layer. + """ + device = self.device + max_eigenvalues_dict = {} + + for name, mod in self.model.named_modules(): + if isinstance(mod, (torch.nn.Conv2d, torch.nn.Linear)): + acti = self.acti_dict[name] + max_eigenvalues_dict[name] = [] + first_order_grad = self.grad_dict[name] + v = [torch.randn(acti.size()).to(device)] + v = normalization(v) + eigenvectors = [] + eigenvalue = None + for i in range(maxIter): + v = orthnormal(v, eigenvectors) + self.model.zero_grad() + + actis = [self.acti_dict[name] for name in self.acti_dict] + grads = [self.grad_dict[name] for name in self.grad_dict] + v = [torch.randn_like(a) for a in actis] + Hv = hessian_vector_product(grads, actis, v) + Hv = hessian_vector_product(first_order_grad, acti, v) + tmp_eigenvalue = group_product(Hv, v).cpu().item() + + v = normalization(Hv) + for i in range(len(Hv)): + Hv[i] = None + + if eigenvalue is None: + eigenvalue = tmp_eigenvalue + else: + if abs(eigenvalue - tmp_eigenvalue) / (abs(eigenvalue) + 1e-6) < tol: + max_eigenvalues_dict[name] = eigenvalue + break + else: + eigenvalue = tmp_eigenvalue + max_eigenvalues_dict[name] = eigenvalue + + return max_eigenvalues_dict + + def layer_trace(self, maxIter=100, tol=1e-3) -> Dict: + """ + Compute the trace of hessian in one model by layer. + """ + device = self.device + trace_dict = {} + for name, mod in self.model.named_modules(): + if isinstance(mod, (torch.nn.Conv2d, torch.nn.Linear)): + trace_vhv = [] + trace = 0. + acti = self.acti_dict[name] + first_order_grad = self.grad_dict[name] + for i in range(maxIter): + self.model.zero_grad() + v = torch.randint_like(acti, high=2, device=device) + # generate Rademacher random variables + v[v == 0] = -1 + v = [v] + Hv = hessian_vector_product(first_order_grad, acti, v) + trace_vhv.append(group_product(Hv, v).cpu().item()) + if abs(np.mean(trace_vhv) - trace) / (trace + 1e-6) < tol: + break + else: + trace = np.mean(trace_vhv) + torch.cuda.empty_cache() + trace_dict[name] = trace + return trace_dict diff --git a/mqbench/mix_precision/mix_precision.py b/mqbench/mix_precision/mix_precision.py new file mode 100644 index 0000000..1a8fa96 --- /dev/null +++ b/mqbench/mix_precision/mix_precision.py @@ -0,0 +1,261 @@ +from typing import List, Tuple + +from torch.nn import Module + +from mqbench.mix_precision.hessian_per_layer import hessian_per_layer +from mqbench.prepare_by_platform import BackendType, prepare_by_platform +from mqbench.utils import is_symmetric_quant +from mqbench.utils.logger import logger +from mqbench.utils.state import disable_all + + +def mixprecision_profiling(model: Module, quantized_model: Module, bitwidth_list: List, data: Tuple, criterion, algo='naive'): + """ + Get layer sensitive index under a list of bitwidth. + A lot of algorithms can do the same thing. + HAWQ is the most useful one. + Naive is the most straight forward one. + """ + layer_parameters_dict = model_size_analysis(model) + sensetive_dict = {} + if algo == 'hawq_eigen': + eigen_values_dict = hawq(model, data, criterion, type='eigenvalues') + # Do normalize. + for layer, eigen_val in eigen_values_dict.items(): + eigen_values_dict[layer] = eigen_val / layer_parameters_dict[layer] + for name, max_eignevalues in eigen_values_dict.items(): + logger.info("Layer {} with max eigen values: {}".format(name, max_eignevalues)) + delta_w = get_delta_w(quantized_model, bitwidth_list) + for layer, max_eignevalues in eigen_values_dict.items(): + # max_eigne_val: Float + # delta_w: List shape = bitwidth_list + sensetive_dict[layer] = max_eignevalues * delta_w[layer] + elif algo == 'hawq_trace': + trace_value_dict = hawq(model, data, criterion, type='trace') + # Do normalize. + for layer, trace in trace_value_dict.items(): + trace_value_dict[layer] = trace / layer_parameters_dict[layer] + for name, trace in trace_value_dict.items(): + logger.info("Layer {} with trace: {}".format(name, trace)) + delta_w = get_delta_w(quantized_model, bitwidth_list) + for layer, trace in trace_value_dict.items(): + # max_eigne_val: Float + # delta_w: List shape = bitwidth_list + sensetive_dict[layer] = trace * delta_w[layer] + elif algo == 'naive': + sensetive_dict = prec_degradation_by_layer(model, quantized_model, bitwidth_list, data, criterion) + else: + logger.info("Unknown algorithm!") + return sensetive_dict + + +def get_delta_w(quantized_model: Module, bitwidth_list: List): + def get_new_qrange(bits, qscheme): + if is_symmetric_quant(qscheme): + return -2 ** (bits - 1), 2 ** (bits - 1) - 1 + return 0, 2 ** bits - 1 + + def square_mean(ta, tb): + return torch.pow((ta - tb), 2.0).mean().detach().cpu().numpy() + + delta_w = {} + for name, mod in quantized_model.named_modules(): + logger.setLevel('CRITICAL') + disable_all(quantized_model) + logger.setLevel('INFO') + if hasattr(mod, 'weight_fake_quant'): + delta_w[name] = [] + mod.weight_fake_quant.enable_observer() + mod.weight_fake_quant.enable_fake_quant() + for bits in bitwidth_list: + qscheme = mod.weight_fake_quant.activation_post_process.qscheme + new_quant_min, new_quant_max = get_new_qrange(bits, qscheme) + mod.weight_fake_quant.activation_post_process.quant_min = new_quant_min + mod.weight_fake_quant.activation_post_process.quant_max = new_quant_max + mod.weight_fake_quant.quant_min = new_quant_min + mod.weight_fake_quant.quant_max = new_quant_max + delta_w[name].append(square_mean(mod.weight, mod.weight_fake_quant(mod.weight))) + delta_w[name] = np.array(delta_w[name]) + mod.weight_fake_quant.disable_observer() + mod.weight_fake_quant.disable_fake_quant() + + return delta_w + + +def model_size_analysis(model): + layer_parameters_dict = {} + for name, mod in model.named_modules(): + if isinstance(mod, (torch.nn.Conv2d, torch.nn.Linear)): + layer_parameters_dict[name] = mod.weight.numel() + return layer_parameters_dict + + +def model_latency_analysis(model): + pass + + +def model_flops_analyze(model): + pass + + +def mp_model_size(model: Module): + """ + Calcualte model size in different bitwidth. + """ + mp_size = 0 + for mod in model.modules(): + if hasattr(mod, 'weight_fake_quant'): + bitwidth = mod.weight_fake_quant.bitwidth + mp_size += mod.weight.numel() * bitwidth + elif hasattr(mod, 'weight'): + mp_size += mod.weight.numel() * 32 + return mp_size / 8 / 1024 / 1024 + + +def prec_degradation_by_layer(model: Module, quantized_model: Module, bitwidth_list: List, data: Tuple, creterion): + """ + Calculate degradation of each layer in different bitwidth. + """ + def get_new_qrange(bits, qscheme): + if is_symmetric_quant(qscheme): + return -2 ** (bits - 1), 2 ** (bits - 1) - 1 + return 0, 2 ** bits - 1 + + input_data, label_data = data + sensetive_dict = {} + output_data = model(input_data) + fp_loss = creterion(output_data, label_data) + + for name, mod in quantized_model.named_modules(): + logger.setLevel('CRITICAL') + disable_all(quantized_model) + logger.setLevel('INFO') + if hasattr(mod, 'weight_fake_quant'): + sensetive_dict[name] = [] + mod.weight_fake_quant.enable_observer() + mod.weight_fake_quant.enable_fake_quant() + for bits in bitwidth_list: + qscheme = mod.weight_fake_quant.activation_post_process.qscheme + new_quant_min, new_quant_max = get_new_qrange(bits, qscheme) + mod.weight_fake_quant.activation_post_process.quant_min = new_quant_min + mod.weight_fake_quant.activation_post_process.quant_max = new_quant_max + mod.weight_fake_quant.quant_min = new_quant_min + mod.weight_fake_quant.quant_max = new_quant_max + with torch.no_grad(): + output_data = quantized_model(input_data) + loss = creterion(output_data, label_data) + sensetive_dict[name].append(loss) + logger.info("Layer {} under bit {} with sensetive {}".format(name, bits, loss - fp_loss)) + mod.weight_fake_quant.disable_observer() + mod.weight_fake_quant.disable_fake_quant() + + return sensetive_dict + + +def hawq(model: Module, data: Tuple, criterion, type='trace'): + """ + HAWQ layer sensetive indicator. Using extend PyHessian to calculate. + """ + inputs, targets = data + hessian_comp = hessian_per_layer(model, criterion, data=(inputs, targets), cuda=True) + if type == 'eigenvalues': + return hessian_comp.layer_eigenvalues() + elif type == 'trace': + return hessian_comp.layer_trace() + else: + raise(NotImplementedError, "{} is not supported, only trace and eigenvalues.".format(type)) + + +def mixprecision_bit_selection(bitwidth_list, sensetive_dict, layer_parameters_dict, model_size_constraints, latency_constraints): + """ + Resolute bitwidth by layer sensetive index / model size / accuracy. + """ + # preato_frontier(model) + ILP_bit_selection(bitwidth_list, sensetive_dict, layer_parameters_dict, model_size_constraints, latency_constraints) + + +def ILP_bit_selection(bitwidth_list, sensetive_dict, layer_parameters_dict, model_size_constraints: int, latency_constraints: int): + """ + Bit selection process using ILP. + """ + import pulp + from pulp import (GLPK_CMD, LpInteger, LpMinimize, LpStatus, LpVariable, + value) + + assert model_size_constraints or latency_constraints + + prob = pulp.LpProblem("Min model size with best acc", LpMinimize) + variable = {} + for layer_name in sensetive_dict: + for bit in bitwidth_list: + variable[f"x_{layer_name}_{bit}"] = LpVariable(f"x_{layer_name}_{bit}", 0, 1, cat=LpInteger) + + # Model acc constrains + senseitve_contrains = [] + for name, params in layer_parameters_dict.items(): + for idx, bit in enumerate(bitwidth_list): + senseitve_contrains.append(variable[f"x_{name}_{bit}"] * sensetive_dict[name][idx]) + prob += sum(senseitve_contrains) + + # Every Layer can only be assigned to one bitwidth. + for layer_name in sensetive_dict: + prob += sum([variable[f"x_{layer_name}_{bit}"] for bit in bitwidth_list]) == 1 + + # Model size constrains + total_size = [] + for name, params in layer_parameters_dict.items(): + for bit in bitwidth_list: + total_size.append(variable[f"x_{name}_{bit}"] * bit * params) + prob += sum(total_size) <= model_size_constraints * 8 * 1024 * 1024 + + status = prob.solve(GLPK_CMD(msg=1, options=["--tmlim", "10000", "--simplex"])) + LpStatus[status] + for layer_name in sensetive_dict: + for bit in bitwidth_list: + if value(variable[f"x_{layer_name}_{bit}"]) == 1: + logger.info("Layer {} with {} bits".format(layer_name, bit)) + total_size = [] + for name, params in layer_parameters_dict.items(): + for bit in bitwidth_list: + total_size.append(value(variable[f"x_{name}_{bit}"]) * bit * params) + logger.info("Result model size {} MB.".format(sum(total_size) / 8 / 1024 / 1024)) + + senseitve_contrains = [] + for name, params in layer_parameters_dict.items(): + for idx, bit in enumerate(bitwidth_list): + senseitve_contrains.append(value(variable[f"x_{name}_{bit}"]) * sensetive_dict[name][idx]) + logger.info("Result model sensetive is {}".format(sum(senseitve_contrains))) + + +if __name__ == '__main__': + import numpy as np + import torch + import torchvision + + model = torchvision.models.resnet18(pretrained=True).eval() + + inputs = torch.rand(2, 3, 224, 224).cuda() + model = model.cuda() + with torch.no_grad(): + targets = model(inputs) + targets = (targets == targets.max(dim=1, keepdim=True)[0]).to(dtype=torch.float32) + + test_bitwidth_list = [2, 4, 8, 16] + + quantized_model = prepare_by_platform(model, BackendType.Tensorrt) + layer_parameters_dict = model_size_analysis(model) + model_size = sum(list(layer_parameters_dict.values())) * 32 / 8 / 1024 / 1024 + logger.info("FP model size: {:.2f} MB".format(model_size)) + naive_sensetive_dict = mixprecision_profiling(model, quantized_model, test_bitwidth_list, + data=(inputs, targets), criterion=torch.nn.CrossEntropyLoss(), algo='naive') + # maxeigen_sensetive_dict = mixprecision_profiling(model, quantized_model, test_bitwidth_list, + # data=(inputs, targets), criterion=torch.nn.CrossEntropyLoss(), algo='hawq_eigen') + # trace_sensetive_dict = mixprecision_profiling(model, quantized_model, test_bitwidth_list, + # data=(inputs, targets), criterion=torch.nn.CrossEntropyLoss(), algo='hawq_trace') + + mixprecision_bit_selection(test_bitwidth_list, + naive_sensetive_dict, + # maxeigen_sensetive_dict, + # trace_sensetive_dict, + layer_parameters_dict, + model_size_constraints=3, latency_constraints=None) diff --git a/mqbench/nn/__init__.py b/mqbench/nn/__init__.py new file mode 100644 index 0000000..9a8067b --- /dev/null +++ b/mqbench/nn/__init__.py @@ -0,0 +1 @@ +from .modules import * \ No newline at end of file diff --git a/mqbench/nn/intrinsic/__init__.py b/mqbench/nn/intrinsic/__init__.py new file mode 100644 index 0000000..9a8067b --- /dev/null +++ b/mqbench/nn/intrinsic/__init__.py @@ -0,0 +1 @@ +from .modules import * \ No newline at end of file diff --git a/mqbench/nn/intrinsic/modules/__init__.py b/mqbench/nn/intrinsic/modules/__init__.py new file mode 100644 index 0000000..7735e4e --- /dev/null +++ b/mqbench/nn/intrinsic/modules/__init__.py @@ -0,0 +1 @@ +from .fused import LinearBn1d, ConvTransposeBn2d, ConvTransposeReLU2d, ConvTransposeBnReLU2d, ConvBnReLU2d, ConvBn2d, ConvReLU2d, ConvFreezebn2d, ConvFreezebnReLU2d, ConvTransposeFreezebn2d, ConvTransposeFreezebnReLU2d diff --git a/mqbench/nn/intrinsic/modules/fused.py b/mqbench/nn/intrinsic/modules/fused.py new file mode 100644 index 0000000..6faa73a --- /dev/null +++ b/mqbench/nn/intrinsic/modules/fused.py @@ -0,0 +1,86 @@ +from torch.nn.intrinsic import _FusedModule +from torch.nn import Linear, BatchNorm1d, BatchNorm2d, ReLU, ConvTranspose2d, Conv2d +from mqbench.nn.modules import FrozenBatchNorm2d + +class LinearBn1d(_FusedModule): + r"""This is a sequential container which calls the Linear and Batch Norm 1d modules. + During quantization this will be replaced with the corresponding fused module.""" + def __init__(self, linear, bn): + assert type(linear) == Linear and type(bn) == BatchNorm1d, \ + 'Incorrect types for input modules{}{}'.format( + type(linear), type(bn)) + super().__init__(linear, bn) + +class ConvTransposeBn2d(_FusedModule): + def __init__(self, deconv, bn): + assert type(deconv) == ConvTranspose2d and type(bn) == BatchNorm2d, \ + 'Incorrect types for input modules{}{}'.format( + type(deconv), type(bn)) + super().__init__(deconv, bn) + + +class ConvTransposeBnReLU2d(_FusedModule): + def __init__(self, deconv, bn, relu): + assert type(deconv) == ConvTranspose2d and type(bn) == BatchNorm2d and type(relu) == ReLU, \ + 'Incorrect types for input modules{}{}{}'.format( + type(deconv), type(bn), type(relu)) + super().__init__(deconv, bn, relu) + + +class ConvTransposeReLU2d(_FusedModule): + def __init__(self, deconv, relu): + assert type(deconv) == ConvTranspose2d and type(relu) == ReLU, \ + 'Incorrect types for input modules{}{}'.format( + type(deconv), type(relu)) + super().__init__(deconv, relu) +class ConvBn2d(_FusedModule): + def __init__(self, conv, bn): + assert type(conv) == Conv2d and type(bn) == BatchNorm2d, \ + 'Incorrect types for input modules{}{}'.format( + type(conv), type(bn)) + super().__init__(conv, bn) + + +class ConvBnReLU2d(_FusedModule): + def __init__(self, conv, bn, relu): + assert type(conv) == Conv2d and type(bn) == BatchNorm2d and type(relu) == ReLU, \ + 'Incorrect types for input modules{}{}{}'.format( + type(conv), type(bn), type(relu)) + super().__init__(conv, bn, relu) + + +class ConvReLU2d(_FusedModule): + def __init__(self, conv, relu): + assert type(conv) == Conv2d and type(relu) == ReLU, \ + 'Incorrect types for input modules{}{}'.format( + type(conv), type(relu)) + super().__init__(conv, relu) + + +class ConvFreezebn2d(_FusedModule): + def __init__(self, conv, bn): + assert type(conv) == Conv2d and type(bn) == FrozenBatchNorm2d, \ + 'Incorrect types for input modules{}{}'.format( + type(conv), type(bn)) + super().__init__(conv, bn) + +class ConvFreezebnReLU2d(_FusedModule): + def __init__(self, conv, bn, relu): + assert type(conv) == Conv2d and type(bn) == FrozenBatchNorm2d and type(relu) == ReLU, \ + 'Incorrect types for input modules{}{}{}'.format( + type(conv), type(bn), type(relu)) + super().__init__(conv, bn, relu) + +class ConvTransposeFreezebn2d(_FusedModule): + def __init__(self, deconv, bn): + assert type(deconv) == ConvTranspose2d and type(bn) == FrozenBatchNorm2d, \ + 'Incorrect types for input modules{}{}'.format( + type(deconv), type(bn)) + super().__init__(deconv, bn) + +class ConvTransposeFreezebnReLU2d(_FusedModule): + def __init__(self, deconv, bn, relu): + assert type(deconv) == ConvTranspose2d and type(bn) == FrozenBatchNorm2d and type(relu) == ReLU, \ + 'Incorrect types for input modules{}{}{}'.format( + type(deconv), type(bn), type(relu)) + super().__init__(deconv, bn, relu) diff --git a/mqbench/nn/intrinsic/qat/__init__.py b/mqbench/nn/intrinsic/qat/__init__.py new file mode 100644 index 0000000..9a8067b --- /dev/null +++ b/mqbench/nn/intrinsic/qat/__init__.py @@ -0,0 +1 @@ +from .modules import * \ No newline at end of file diff --git a/mqbench/nn/intrinsic/qat/modules/__init__.py b/mqbench/nn/intrinsic/qat/modules/__init__.py new file mode 100644 index 0000000..3118f9b --- /dev/null +++ b/mqbench/nn/intrinsic/qat/modules/__init__.py @@ -0,0 +1,4 @@ +from .linear_fused import LinearBn1d +from .deconv_fused import ConvTransposeBnReLU2d, ConvTransposeBn2d, ConvTransposeReLU2d +from .conv_fused import ConvBnReLU2d, ConvBn2d, ConvReLU2d +from .freezebn import ConvFreezebn2d, ConvFreezebnReLU2d, ConvTransposeFreezebn2d, ConvTransposeFreezebnReLU2d diff --git a/mqbench/nn/intrinsic/qat/modules/conv_fused.py b/mqbench/nn/intrinsic/qat/modules/conv_fused.py new file mode 100644 index 0000000..8e64e8f --- /dev/null +++ b/mqbench/nn/intrinsic/qat/modules/conv_fused.py @@ -0,0 +1,411 @@ +import math + +import torch +import torch.nn as nn +import torch.nn.intrinsic as nni +import torch.nn.functional as F +from torch.nn import init +from torch.nn.intrinsic import _FusedModule +from torch.nn.parameter import Parameter +from torch.nn.modules.utils import _pair + +from typing import TypeVar + + +import mqbench.nn.qat as qnnqat +from mqbench.quantization.default_bias_fake_quant import bias_fake_quantizer + +_BN_CLASS_MAP = { + 1: nn.BatchNorm1d, + 2: nn.BatchNorm2d, + 3: nn.BatchNorm3d, +} + +MOD = TypeVar('MOD', bound=nn.modules.conv._ConvNd) + + +class _ConvBnNd(nn.modules.conv._ConvNd, _FusedModule): + + _version = 2 + _FLOAT_MODULE = MOD + + def __init__(self, + # ConvNd args + in_channels, out_channels, kernel_size, stride, + padding, dilation, transposed, output_padding, + groups, + bias, + padding_mode, + # BatchNormNd args + # num_features: out_channels + eps=1e-05, momentum=0.1, + # affine: True + # track_running_stats: True + # Args for this module + freeze_bn=False, + qconfig=None, + dim=2): + nn.modules.conv._ConvNd.__init__(self, in_channels, out_channels, kernel_size, + stride, padding, dilation, transposed, + output_padding, groups, False, padding_mode) + assert qconfig, 'qconfig must be provided for QAT module' + self.qconfig = qconfig + self.freeze_bn = freeze_bn if self.training else True + self.bn = _BN_CLASS_MAP[dim](out_channels, eps, momentum, True, True) + self.weight_fake_quant = self.qconfig.weight() + if bias: + self.bias = Parameter(torch.empty(out_channels)) + else: + self.register_parameter('bias', None) + # self.bias_fake_quant = bias_fake_quantizer() # 这玩意调用的是tqt的 + self.reset_bn_parameters() + + # this needs to be called after reset_bn_parameters, + # as they modify the same state + if self.training: + if freeze_bn: + self.freeze_bn_stats() + else: + self.update_bn_stats() + else: + self.freeze_bn_stats() + + def reset_running_stats(self): + self.bn.reset_running_stats() + + def reset_bn_parameters(self): + self.bn.reset_running_stats() + init.uniform_(self.bn.weight) + init.zeros_(self.bn.bias) + # note: below is actully for conv, not BN + if self.bias is not None: + fan_in, _ = init._calculate_fan_in_and_fan_out(self.weight) + bound = 1 / math.sqrt(fan_in) + init.uniform_(self.bias, -bound, bound) + + def reset_parameters(self): + super(_ConvBnNd, self).reset_parameters() + + def update_bn_stats(self): + self.freeze_bn = False + self.bn.training = True + return self + + def freeze_bn_stats(self): + self.freeze_bn = True + self.bn.training = False + return self + + def _forward(self, input): + assert self.bn.running_var is not None + running_std = torch.sqrt(self.bn.running_var + self.bn.eps) + scale_factor = self.bn.weight / running_std + weight_shape = [1] * len(self.weight.shape) + weight_shape[0] = -1 + bias_shape = [1] * len(self.weight.shape) + bias_shape[1] = -1 + scaled_weight = self.weight_fake_quant(self.weight * scale_factor.reshape(weight_shape)) + # using zero bias here since the bias for original conv + # will be added later + if self.bias is not None: + zero_bias = torch.zeros_like(self.bias) + conv_bias = self.bias + else: + zero_bias = torch.zeros(self.out_channels, device=scaled_weight.device) + conv_bias = torch.zeros_like(zero_bias, device=scaled_weight.device) + if self.bn.affine: + full_bias = (conv_bias - self.bn.running_mean) / running_std * self.bn.weight + self.bn.bias + else: + full_bias = (conv_bias - self.bn.running_mean) / running_std + # quant_bias = self.bias_fake_quant(full_bias) # 我们这里就不进行量化了。因为终归由后端硬件支持来决定bias量化的方式 + quant_bias = full_bias + conv_with_bias = self._conv_forward(input, scaled_weight, quant_bias) + conv_orig = (conv_with_bias - full_bias.reshape(bias_shape)) / scale_factor.reshape(bias_shape) + conv_bias.reshape(bias_shape) + conv = self.bn(conv_orig) + return conv + + def extra_repr(self): + # TODO(jerryzh): extend + return super(_ConvBnNd, self).extra_repr() + + def forward(self, input): + return self._forward(input) + + def train(self, mode=True): + """ + Batchnorm's training behavior is using the self.training flag. Prevent + changing it if BN is frozen. This makes sure that calling `model.train()` + on a model with a frozen BN will behave properly. + """ + self.training = mode + if not self.freeze_bn: + for module in self.children(): + module.train(mode) + return self + + # ===== Serialization version history ===== + # + # Version 1/None + # self + # |--- weight : Tensor + # |--- bias : Tensor + # |--- gamma : Tensor + # |--- beta : Tensor + # |--- running_mean : Tensor + # |--- running_var : Tensor + # |--- num_batches_tracked : Tensor + # + # Version 2 + # self + # |--- weight : Tensor + # |--- bias : Tensor + # |--- bn : Module + # |--- weight : Tensor (moved from v1.self.gamma) + # |--- bias : Tensor (moved from v1.self.beta) + # |--- running_mean : Tensor (moved from v1.self.running_mean) + # |--- running_var : Tensor (moved from v1.self.running_var) + # |--- num_batches_tracked : Tensor (moved from v1.self.num_batches_tracked) + def _load_from_state_dict(self, state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs): + version = local_metadata.get('version', None) + if version is None or version == 1: + # BN related parameters and buffers were moved into the BN module for v2 + v2_to_v1_names = { + 'bn.weight': 'gamma', + 'bn.bias': 'beta', + 'bn.running_mean': 'running_mean', + 'bn.running_var': 'running_var', + 'bn.num_batches_tracked': 'num_batches_tracked', + } + for v2_name, v1_name in v2_to_v1_names.items(): + if prefix + v1_name in state_dict: + state_dict[prefix + v2_name] = state_dict[prefix + v1_name] + state_dict.pop(prefix + v1_name) + elif prefix + v2_name in state_dict: + # there was a brief period where forward compatibility + # for this module was broken (between + # https://github.com/pytorch/pytorch/pull/38478 + # and https://github.com/pytorch/pytorch/pull/38820) + # and modules emitted the v2 state_dict format while + # specifying that version == 1. This patches the forward + # compatibility issue by allowing the v2 style entries to + # be used. + pass + elif strict: + missing_keys.append(prefix + v2_name) + + super(_ConvBnNd, self)._load_from_state_dict( + state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs) + + @classmethod + def from_float(cls, mod): + r"""Create a qat module from a float module or qparams_dict + + Args: `mod` a float module, either produced by torch.ao.quantization utilities + or directly from user + """ + # The ignore is because _FLOAT_MODULE is a TypeVar here where the bound + # has no __name__ (code is fine though) + assert type(mod) == cls._FLOAT_MODULE, 'qat.' + cls.__name__ + '.from_float only works for ' + \ + cls._FLOAT_MODULE.__name__ # type: ignore[attr-defined] + assert hasattr(mod, 'qconfig'), 'Input float module must have qconfig defined' + assert mod.qconfig, 'Input float module must have a valid qconfig' + qconfig = mod.qconfig + conv, bn = mod[0], mod[1] + qat_convbn = cls(conv.in_channels, conv.out_channels, conv.kernel_size, + conv.stride, conv.padding, conv.dilation, + conv.groups, conv.bias is not None, + conv.padding_mode, + bn.eps, bn.momentum, + False, + qconfig) + qat_convbn.weight = conv.weight + qat_convbn.bias = conv.bias + qat_convbn.bn.weight = bn.weight + qat_convbn.bn.bias = bn.bias + qat_convbn.bn.running_mean = bn.running_mean + qat_convbn.bn.running_var = bn.running_var + # mypy error: Cannot determine type of 'num_batches_tracked' + qat_convbn.bn.num_batches_tracked = bn.num_batches_tracked # type: ignore[has-type] + return qat_convbn + + def to_float(self): + modules = [] + cls = type(self) + conv = cls._FLOAT_CONV_MODULE( # type: ignore[attr-defined] + self.in_channels, + self.out_channels, + self.kernel_size, + self.stride, + self.padding, + self.dilation, + self.groups, + self.bias is not None, + self.padding_mode) + conv.weight = torch.nn.Parameter(self.weight.detach()) + if self.bias is not None: + conv.bias = torch.nn.Parameter(self.bias.detach()) + modules.append(conv) + + if cls._FLOAT_BN_MODULE: # type: ignore[attr-defined] + bn = cls._FLOAT_BN_MODULE( # type: ignore[attr-defined] + self.bn.num_features, + self.bn.eps, + self.bn.momentum, + self.bn.affine, + self.bn.track_running_stats) + bn.weight = Parameter(self.bn.weight.detach()) + if self.bn.affine: + bn.bias = Parameter(self.bn.bias.detach()) + modules.append(bn) + + if cls._FLOAT_RELU_MODULE: # type: ignore[attr-defined] + relu = cls._FLOAT_RELU_MODULE() # type: ignore[attr-defined] + modules.append(relu) + + result = cls._FLOAT_MODULE(*modules) # type: ignore[operator] + result.train(self.training) + return result + + + +class ConvBn2d(_ConvBnNd, nn.Conv2d): + r""" + A ConvBn2d module is a module fused from Conv2d and BatchNorm2d, + attached with FakeQuantize modules for weight, + used in quantization aware training. + + We combined the interface of :class:`torch.nn.Conv2d` and + :class:`torch.nn.BatchNorm2d`. + + Similar to :class:`torch.nn.Conv2d`, with FakeQuantize modules initialized + to default. + + Attributes: + freeze_bn: + weight_fake_quant: fake quant module for weight + + """ + _FLOAT_MODULE = nni.ConvBn2d + _FLOAT_CONV_MODULE = nn.Conv2d + _FLOAT_BN_MODULE = nn.BatchNorm2d + _FLOAT_RELU_MODULE = None + + def __init__(self, + # ConvNd args + in_channels, out_channels, kernel_size, stride=1, + padding=0, dilation=1, groups=1, + bias=None, + padding_mode='zeros', + # BatchNorm2d args + # num_features: out_channels + eps=1e-05, momentum=0.1, + # affine: True + # track_running_stats: True + # Args for this module + freeze_bn=False, + qconfig=None): + kernel_size = _pair(kernel_size) + stride = _pair(stride) + padding = _pair(padding) + dilation = _pair(dilation) + _ConvBnNd.__init__(self, in_channels, out_channels, kernel_size, stride, + padding, dilation, False, _pair(0), groups, bias, padding_mode, + eps, momentum, freeze_bn, qconfig, dim=2) + +class ConvBnReLU2d(ConvBn2d): + r""" + A ConvBnReLU2d module is a module fused from Conv2d, BatchNorm2d and ReLU, + attached with FakeQuantize modules for weight, + used in quantization aware training. + + We combined the interface of :class:`torch.nn.Conv2d` and + :class:`torch.nn.BatchNorm2d` and :class:`torch.nn.ReLU`. + + Similar to `torch.nn.Conv2d`, with FakeQuantize modules initialized to + default. + + Attributes: + weight_fake_quant: fake quant module for weight + + """ + # base class defines _FLOAT_MODULE as "ConvBn2d" + _FLOAT_MODULE = nni.ConvBnReLU2d # type: ignore[assignment] + _FLOAT_CONV_MODULE = nn.Conv2d + _FLOAT_BN_MODULE = nn.BatchNorm2d + _FLOAT_RELU_MODULE = nn.ReLU # type: ignore[assignment] + + def __init__(self, + # Conv2d args + in_channels, out_channels, kernel_size, stride=1, + padding=0, dilation=1, groups=1, + bias=None, + padding_mode='zeros', + # BatchNorm2d args + # num_features: out_channels + eps=1e-05, momentum=0.1, + # affine: True + # track_running_stats: True + # Args for this module + freeze_bn=False, + qconfig=None): + super(ConvBnReLU2d, self).__init__(in_channels, out_channels, kernel_size, stride, + padding, dilation, groups, bias, + padding_mode, eps, momentum, + freeze_bn, + qconfig) + + def forward(self, input): + return F.relu(ConvBn2d._forward(self, input)) + + @classmethod + def from_float(cls, mod): + return super(ConvBnReLU2d, cls).from_float(mod) + +class ConvReLU2d(qnnqat.Conv2d, _FusedModule): + r"""A ConvReLU2d module is a fused module of Conv2d and ReLU, attached with + FakeQuantize modules for weight for + quantization aware training. + + We combined the interface of :class:`~torch.nn.Conv2d` and + :class:`~torch.nn.BatchNorm2d`. + + Attributes: + weight_fake_quant: fake quant module for weight + + """ + _FLOAT_MODULE = nni.ConvReLU2d + _FLOAT_CONV_MODULE = nn.Conv2d + _FLOAT_BN_MODULE = None + _FLOAT_RELU_MODULE = nn.ReLU + + def __init__(self, in_channels, out_channels, kernel_size, stride=1, + padding=0, dilation=1, groups=1, + bias=True, padding_mode='zeros', + qconfig=None): + super(ConvReLU2d, self).__init__(in_channels, out_channels, kernel_size, + stride=stride, padding=padding, dilation=dilation, + groups=groups, bias=bias, padding_mode=padding_mode, + qconfig=qconfig) + assert qconfig, 'qconfig must be provided for QAT module' + self.qconfig = qconfig + self.weight_fake_quant = self.qconfig.weight() + + def forward(self, input): + return F.relu( + self._conv_forward(input, self.weight_fake_quant(self.weight), self.bias)) + + @classmethod + def from_float(cls, mod): + assert type(mod) == cls._FLOAT_MODULE, 'qat.' + cls.__name__ + '.from_float only works for ' + cls._FLOAT_MODULE.__name__ + assert hasattr(mod, 'qconfig'), 'Input float module must have qconfig defined' + assert mod.qconfig, 'Input float module must have a valid qconfig' + if type(mod) == cls._FLOAT_MODULE: + mod = mod[0] + qconfig = mod.qconfig + qat_conv = cls(mod.in_channels, mod.out_channels, mod.kernel_size, + stride=mod.stride, padding=mod.padding, dilation=mod.dilation, + groups=mod.groups, bias=mod.bias is not None, + padding_mode=mod.padding_mode, qconfig=qconfig) + qat_conv.weight = mod.weight + qat_conv.bias = mod.bias + return qat_conv diff --git a/mqbench/nn/intrinsic/qat/modules/deconv_fused.py b/mqbench/nn/intrinsic/qat/modules/deconv_fused.py new file mode 100644 index 0000000..c17570f --- /dev/null +++ b/mqbench/nn/intrinsic/qat/modules/deconv_fused.py @@ -0,0 +1,392 @@ +import math + +import torch +import torch.nn as nn +import torch.nn.functional as F +from torch.nn import init +from torch.nn.intrinsic import _FusedModule +from torch.nn.parameter import Parameter +from torch.nn.modules.utils import _pair, _single + +from typing import TypeVar + +import mqbench.nn.intrinsic as qnni +import mqbench.nn.qat as qnnqat + + +_BN_CLASS_MAP = { + 1: nn.BatchNorm1d, + 2: nn.BatchNorm2d, + 3: nn.BatchNorm3d, +} + +MOD = TypeVar('MOD', bound=nn.modules.conv._ConvTransposeNd) + + +class _ConvTransposeBnNd(nn.modules.conv._ConvTransposeNd, _FusedModule): + + _version = 2 + _FLOAT_MODULE = MOD + + def __init__( + self, + # ConvTransposeBnNd args + in_channels, + out_channels, + kernel_size, + stride, + bias, + transposed, + padding, + output_padding, + groups, + dilation, + padding_mode, + # bn args + # BatchNormNd args + # num_features: out_channels + eps=1e-05, + momentum=0.1, + # affine: True + # track_running_stats: True + # Args for this module + freeze_bn=False, + qconfig=None, + dim=2): + kernel_size = _single(kernel_size) + stride = _single(stride) + padding = _single(padding) + dilation = _single(dilation) + output_padding = _single(output_padding) + nn.modules.conv._ConvTransposeNd.__init__(self, in_channels, + out_channels, kernel_size, + stride, padding, dilation, + transposed, output_padding, + groups, False, padding_mode) + assert qconfig, 'qconfig must be provided for a QAT module' + self.qconfig = qconfig + self.freeze_bn = freeze_bn if self.training else True + self.bn = _BN_CLASS_MAP[dim](out_channels, eps, momentum, True, True) + self.weight_fake_quant = self.qconfig.weight() + # ConvTranspose do per-channel quantize on output channel. + if self.weight_fake_quant.ch_axis != -1: + self.weight_fake_quant.ch_axis = 1 + self.weight_fake_quant.activation_post_process.ch_axis = 1 + if bias: + self.bias = Parameter(torch.Tensor(out_channels)) + else: + self.register_parameter('bias', None) + self.reset_bn_parameters() + + if self.training: + if freeze_bn: + self.freeze_bn_stats() + else: + self.update_bn_stats() + else: + self.freeze_bn_stats() + + def reset_running_stats(self): + self.bn.reset_running_stats() + + def reset_bn_parameters(self): + self.bn.reset_running_stats() + init.uniform_(self.bn.weight) + init.zeros_(self.bn.bias) + # note: below is actully for conv, not BN + if self.bias is not None: + fan_in, _ = init._calculate_fan_in_and_fan_out(self.weight) + bound = 1 / math.sqrt(fan_in) + init.uniform_(self.bias, -bound, bound) + + def reset_parameters(self): + super(_ConvTransposeBnNd, self).reset_parameters() + + def update_bn_stats(self): + self.freeze_bn = False + self.bn.training = True + return self + + def freeze_bn_stats(self): + self.freeze_bn = True + self.bn.training = False + return self + + def _forward(self, input): + assert self.bn.running_var is not None + running_std = torch.sqrt(self.bn.running_var + self.bn.eps) + scale_factor = self.bn.weight / running_std + weight_shape = [1] * len(self.weight.shape) + weight_shape[1] = -1 + bias_shape = [1] * len(self.weight.shape) + bias_shape[1] = -1 + scaled_weight = self.weight_fake_quant(self.weight * scale_factor.reshape(weight_shape)) + # using zero bias here since the bias for original conv + # will be added later + if self.bias is not None: + zero_bias = torch.zeros_like(self.bias) + else: + zero_bias = torch.zeros(self.out_channels, device=scaled_weight.device) + deconv = self._convtransposed_forward(input, scaled_weight, zero_bias) + deconv_orig = deconv / scale_factor.reshape(bias_shape) + if self.bias is not None: + deconv_orig = deconv_orig + self.bias.reshape(bias_shape) + deconv = self.bn(deconv_orig) + return deconv + + def _convtransposed_forward(self, x, w, b): + raise NotImplementedError( + 'The sub-class must implement this function to forward in the needed dim-version!' + ) + + def extra_repr(self): + # TODO(jerryzh): extend + return super(_ConvTransposeBnNd, self).extra_repr() + + def forward(self, input): + return self._forward(input) + + def train(self, mode=True): + """ + Batchnorm's training behavior is using the self.training flag. Prevent + changing it if BN is frozen. This makes sure that calling `model.train()` + on a model with a frozen BN will behave properly. + """ + self.training = mode + if not self.freeze_bn: + for module in self.children(): + module.train(mode) + return self + + # ===== Serialization version history ===== + # + # Version 1/None + # self + # |--- weight : Tensor + # |--- bias : Tensor + # |--- gamma : Tensor + # |--- beta : Tensor + # |--- running_mean : Tensor + # |--- running_var : Tensor + # |--- num_batches_tracked : Tensor + # + # Version 2 + # self + # |--- weight : Tensor + # |--- bias : Tensor + # |--- bn : Module + # |--- weight : Tensor (moved from v1.self.gamma) + # |--- bias : Tensor (moved from v1.self.beta) + # |--- running_mean : Tensor (moved from v1.self.running_mean) + # |--- running_var : Tensor (moved from v1.self.running_var) + # |--- num_batches_tracked : Tensor (moved from v1.self.num_batches_tracked) + def _load_from_state_dict(self, state_dict, prefix, local_metadata, strict, + missing_keys, unexpected_keys, error_msgs): + version = local_metadata.get('version', None) + if version is None or version == 1: + # BN related parameters and buffers were moved into the BN module for v2 + v2_to_v1_names = { + 'bn.weight': 'gamma', + 'bn.bias': 'beta', + 'bn.running_mean': 'running_mean', + 'bn.running_var': 'running_var', + 'bn.num_batches_tracked': 'num_batches_tracked', + } + for v2_name, v1_name in v2_to_v1_names.items(): + if prefix + v1_name in state_dict: + state_dict[prefix + v2_name] = state_dict[prefix + v1_name] + state_dict.pop(prefix + v1_name) + elif prefix + v2_name in state_dict: + # there was a brief period where forward compatibility + # for this module was broken (between + # https://github.com/pytorch/pytorch/pull/38478 + # and https://github.com/pytorch/pytorch/pull/38820) + # and modules emitted the v2 state_dict format while + # specifying that version == 1. This patches the forward + # compatibility issue by allowing the v2 style entries to + # be used. + pass + elif strict: + missing_keys.append(prefix + v2_name) + + super(_ConvTransposeBnNd, + self)._load_from_state_dict(state_dict, prefix, local_metadata, + strict, missing_keys, + unexpected_keys, error_msgs) + + @classmethod + def from_float(cls, mod): + r"""Create a qat module from a float module or qparams_dict + + Args: `mod` a float module, either produced by torch.quantization utilities + or directly from user + """ + assert type(mod) == cls._FLOAT_MODULE, 'qat.' + cls.__name__ + '.from_float only works for ' + \ + cls._FLOAT_MODULE.__name__ + assert hasattr( + mod, 'qconfig'), 'Input float module must have qconfig defined' + assert mod.qconfig, 'Input float module must have a valid qconfig' + qconfig = mod.qconfig + deconv, bn = mod[0], mod[1] + qat_deconvbn = cls(deconv.in_channels, deconv.out_channels, + deconv.kernel_size, deconv.stride, deconv.bias + is not None, deconv.transposed, deconv.padding, + deconv.output_padding, deconv.groups, + deconv.dilation, deconv.padding_mode, bn.eps, + bn.momentum, False, qconfig) + qat_deconvbn.weight = deconv.weight + qat_deconvbn.bias = deconv.bias + qat_deconvbn.bn.weight = bn.weight + qat_deconvbn.bn.bias = bn.bias + qat_deconvbn.bn.running_mean = bn.running_mean + qat_deconvbn.bn.running_var = bn.running_var + # mypy error: Cannot determine type of 'num_batches_tracked' + qat_deconvbn.bn.num_batches_tracked = bn.num_batches_tracked # type: ignore[has-type] + return qat_deconvbn + + +class ConvTransposeBn2d(_ConvTransposeBnNd, nn.ConvTranspose2d): + _FLOAT_MODULE = qnni.ConvTransposeBn2d + + def __init__( + self, + # ConvTransposeBnNd args + in_channels, + out_channels, + kernel_size, + stride=1, + bias=None, + transposed=True, + padding=0, + output_padding=0, + groups=1, + dilation=1, + padding_mode='zeros', + # bn args + # BatchNormNd args + # num_features: out_channels + eps=1e-05, + momentum=0.1, + # affine: True + # track_running_stats: True + # Args for this module + freeze_bn=False, + qconfig=None): + kernel_size = _pair(kernel_size) + stride = _pair(stride) + padding = _pair(padding) + dilation = _pair(dilation) + _ConvTransposeBnNd.__init__(self, in_channels, out_channels, + kernel_size, stride, bias, transposed, + padding, output_padding, groups, dilation, + padding_mode, eps, momentum, freeze_bn, + qconfig) + + def _convtransposed_forward(self, x, w, b): + output_padding = self._output_padding(x, None, self.stride, + self.padding, self.kernel_size, + self.dilation) + return F.conv_transpose2d(x, w, b, self.stride, self.padding, + output_padding, self.groups, self.dilation) + + +class ConvTransposeBnReLU2d(ConvTransposeBn2d): + _FLOAT_MODULE = qnni.ConvTransposeBnReLU2d + + def __init__( + self, + # ConvTransposeBnNd args + in_channels, + out_channels, + kernel_size, + stride=1, + bias=None, + transposed=True, + padding=0, + output_padding=0, + groups=1, + dilation=1, + padding_mode='zeros', + # bn args + # BatchNormNd args + # num_features: out_channels + eps=1e-05, + momentum=0.1, + # affine: True + # track_running_stats: True + # Args for this module + freeze_bn=False, + qconfig=None): + # super(ConvTransposeBnReLU2d, self).__init__(in_channels, out_channels, kernel_size, stride, + # padding, dilation, groups, bias, + # padding_mode, eps, momentum, + # freeze_bn, + # qconfig) + super(ConvTransposeBnReLU2d, + self).__init__(in_channels, + out_channels, + kernel_size, + stride=stride, + bias=bias, + transposed=transposed, + padding=padding, + output_padding=output_padding, + groups=groups, + dilation=dilation, + padding_mode=padding_mode, + eps=eps, + momentum=momentum, + freeze_bn=freeze_bn, + qconfig=qconfig) + + def forward(self, input): + return F.relu(ConvTransposeBn2d._forward(self, input)) + + @classmethod + def from_float(cls, mod): + return super(ConvTransposeBnReLU2d, cls).from_float(mod) + + +class ConvTransposeReLU2d(qnnqat.ConvTranspose2d): + _FLOAT_MODULE = qnni.ConvTransposeReLU2d + _FLOAT_DECONV_MODULE = nn.ConvTranspose2d + _FLOAT_BN_MODULE = None + _FLOAT_RELU_MODULE = nn.ReLU + + def __init__( + self, + # ConvTransposeBnNd args + in_channels, + out_channels, + kernel_size, + stride=1, + bias=None, + transposed=True, + padding=0, + output_padding=0, + groups=1, + dilation=1, + padding_mode='zeros', + qconfig=None): + + super(ConvTransposeReLU2d, + self).__init__(in_channels, + out_channels, + kernel_size, + stride=stride, + bias=bias, + padding=padding, + output_padding=output_padding, + groups=groups, + dilation=dilation, + padding_mode=padding_mode, + qconfig=qconfig) + assert qconfig, 'qconfig must be provided for QAT module' + + def forward(self, input, output_size=None): + output_padding = self._output_padding(input, output_size, self.stride, + self.padding, self.kernel_size, + self.dilation) + return F.relu(F.conv_transpose2d(input, self.weight_fake_quant(self.weight), + self.bias, self.stride, self.padding, output_padding, + self.groups, self.dilation)) \ No newline at end of file diff --git a/mqbench/nn/intrinsic/qat/modules/freezebn.py b/mqbench/nn/intrinsic/qat/modules/freezebn.py new file mode 100644 index 0000000..1d2209c --- /dev/null +++ b/mqbench/nn/intrinsic/qat/modules/freezebn.py @@ -0,0 +1,448 @@ +import math +import torch +import torch.nn as nn +import torch.nn.intrinsic as nni +import torch.nn.functional as F +from torch.nn import init +from torch.nn.modules.utils import _pair, _single +from torch.nn.parameter import Parameter +from typing import TypeVar +import mqbench.nn.intrinsic as qnni +from mqbench.nn.modules import FrozenBatchNorm2d +from .deconv_fused import _ConvTransposeBnNd + +MOD = TypeVar('MOD', bound=nn.modules.conv._ConvNd) + + +class _ConvFreezebnNd(nn.modules.conv._ConvNd, nni._FusedModule): + + _version = 2 + _FLOAT_MODULE = MOD + + def __init__(self, + # ConvNd args + in_channels, out_channels, kernel_size, stride, + padding, dilation, transposed, output_padding, + groups, + bias, + padding_mode, + # BatchNormNd args + # num_features: out_channels + eps=1e-05, momentum=0.1, + # affine: True + # track_running_stats: True + # Args for this module + freeze_bn=False, + qconfig=None, + dim=2): + nn.modules.conv._ConvNd.__init__(self, in_channels, out_channels, kernel_size, + stride, padding, dilation, transposed, + output_padding, groups, False, padding_mode) + assert qconfig, 'qconfig must be provided for QAT module' + self.qconfig = qconfig + self.freeze_bn = freeze_bn if self.training else True + self.bn = FrozenBatchNorm2d(out_channels, eps, momentum, True, True) + self.weight_fake_quant = self.qconfig.weight() + if bias: + self.bias = Parameter(torch.Tensor(out_channels)) + else: + self.register_parameter('bias', None) + self.reset_bn_parameters() + + # this needs to be called after reset_bn_parameters, + # as they modify the same state + if self.training: + if freeze_bn: + self.freeze_bn_stats() + else: + self.update_bn_stats() + else: + self.freeze_bn_stats() + + def reset_running_stats(self): + self.bn.reset_running_stats() + + def reset_bn_parameters(self): + self.bn.reset_running_stats() + init.uniform_(self.bn.weight) + init.zeros_(self.bn.bias) + # note: below is actully for conv, not BN + if self.bias is not None: + fan_in, _ = init._calculate_fan_in_and_fan_out(self.weight) + bound = 1 / math.sqrt(fan_in) + init.uniform_(self.bias, -bound, bound) + + def reset_parameters(self): + super(_ConvFreezebnNd, self).reset_parameters() + + def update_bn_stats(self): + self.freeze_bn = False + self.bn.training = True + return self + + def freeze_bn_stats(self): + self.freeze_bn = True + self.bn.training = False + return self + + def _forward(self, input): + assert isinstance(self.bn.running_var, torch.Tensor) + running_std = torch.sqrt(self.bn.running_var + self.bn.eps) + scale_factor = self.bn.weight / running_std + weight_shape = [1] * len(self.weight.shape) + weight_shape[0] = -1 + bias_shape = [1] * len(self.weight.shape) + bias_shape[1] = -1 + scaled_weight = self.weight_fake_quant(self.weight * scale_factor.reshape(weight_shape)) + # using zero bias here since the bias for original conv + # will be added later + if self.bias is not None: + zero_bias = torch.zeros_like(self.bias) + else: + zero_bias = torch.zeros(self.out_channels, device=scaled_weight.device) + conv = self._conv_forward(input, scaled_weight, zero_bias) + conv_orig = conv / scale_factor.reshape(bias_shape) + if self.bias is not None: + conv_orig = conv_orig + self.bias.reshape(bias_shape) + conv = self.bn(conv_orig) + return conv + + def extra_repr(self): + # TODO(jerryzh): extend + return super(_ConvFreezebnNd, self).extra_repr() + + def forward(self, input): + return self._forward(input) + + def train(self, mode=True): + """ + Batchnorm's training behavior is using the self.training flag. Prevent + changing it if BN is frozen. This makes sure that calling `model.train()` + on a model with a frozen BN will behave properly. + """ + self.training = mode + if not self.freeze_bn: + for module in self.children(): + module.train(mode) + return self + + # ===== Serialization version history ===== + # + # Version 1/None + # self + # |--- weight : Tensor + # |--- bias : Tensor + # |--- gamma : Tensor + # |--- beta : Tensor + # |--- running_mean : Tensor + # |--- running_var : Tensor + # |--- num_batches_tracked : Tensor + # + # Version 2 + # self + # |--- weight : Tensor + # |--- bias : Tensor + # |--- bn : Module + # |--- weight : Tensor (moved from v1.self.gamma) + # |--- bias : Tensor (moved from v1.self.beta) + # |--- running_mean : Tensor (moved from v1.self.running_mean) + # |--- running_var : Tensor (moved from v1.self.running_var) + # |--- num_batches_tracked : Tensor (moved from v1.self.num_batches_tracked) + def _load_from_state_dict(self, state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs): + version = local_metadata.get('version', None) + if version is None or version == 1: + # BN related parameters and buffers were moved into the BN module for v2 + v2_to_v1_names = { + 'bn.weight': 'gamma', + 'bn.bias': 'beta', + 'bn.running_mean': 'running_mean', + 'bn.running_var': 'running_var', + 'bn.num_batches_tracked': 'num_batches_tracked', + } + for v2_name, v1_name in v2_to_v1_names.items(): + if prefix + v1_name in state_dict: + state_dict[prefix + v2_name] = state_dict[prefix + v1_name] + state_dict.pop(prefix + v1_name) + elif prefix + v2_name in state_dict: + # there was a brief period where forward compatibility + # for this module was broken (between + # https://github.com/pytorch/pytorch/pull/38478 + # and https://github.com/pytorch/pytorch/pull/38820) + # and modules emitted the v2 state_dict format while + # specifying that version == 1. This patches the forward + # compatibility issue by allowing the v2 style entries to + # be used. + pass + elif strict: + missing_keys.append(prefix + v2_name) + + super(_ConvFreezebnNd, self)._load_from_state_dict( + state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs) + + @classmethod + def from_float(cls, mod): + r"""Create a qat module from a float module or qparams_dict + Args: `mod` a float module, either produced by torch.quantization utilities + or directly from user + """ + assert type(mod) == cls._FLOAT_MODULE, 'qat.' + cls.__name__ + '.from_float only works for ' + \ + cls._FLOAT_MODULE.__name__ + assert hasattr(mod, 'qconfig'), 'Input float module must have qconfig defined' + assert mod.qconfig, 'Input float module must have a valid qconfig' + qconfig = mod.qconfig + conv, bn = mod[0], mod[1] + qat_convbn = cls(conv.in_channels, conv.out_channels, conv.kernel_size, + conv.stride, conv.padding, conv.dilation, + conv.groups, conv.bias is not None, + conv.padding_mode, + bn.eps, bn.momentum, + False, + qconfig) + qat_convbn.weight = conv.weight + qat_convbn.bias = conv.bias + qat_convbn.bn.weight = bn.weight + qat_convbn.bn.bias = bn.bias + qat_convbn.bn.running_mean = bn.running_mean + qat_convbn.bn.running_var = bn.running_var + # mypy error: Cannot determine type of 'num_batches_tracked' + qat_convbn.bn.num_batches_tracked = bn.num_batches_tracked # type: ignore[has-type] + return qat_convbn + +class ConvFreezebn2d(_ConvFreezebnNd, nn.Conv2d): + r""" + A ConvBn2d module is a module fused from Conv2d and BatchNorm2d, + attached with FakeQuantize modules for weight, + used in quantization aware training. + We combined the interface of :class:`torch.nn.Conv2d` and + :class:`torch.nn.BatchNorm2d`. + Similar to :class:`torch.nn.Conv2d`, with FakeQuantize modules initialized + to default. + Attributes: + freeze_bn: + weight_fake_quant: fake quant module for weight + """ + _FLOAT_MODULE = qnni.ConvFreezebn2d + + def __init__(self, + # ConvNd args + in_channels, out_channels, kernel_size, stride=1, + padding=0, dilation=1, groups=1, + bias=None, + padding_mode='zeros', + # BatchNorm2d args + # num_features: out_channels + eps=1e-05, momentum=0.1, + # affine: True + # track_running_stats: True + # Args for this module + freeze_bn=False, + qconfig=None): + kernel_size = _pair(kernel_size) + stride = _pair(stride) + padding = _pair(padding) + dilation = _pair(dilation) + _ConvFreezebnNd.__init__(self, in_channels, out_channels, kernel_size, stride, padding, dilation, False, _pair(0), groups, bias, padding_mode, eps, momentum, freeze_bn, qconfig, dim=2) + +class ConvFreezebnReLU2d(ConvFreezebn2d): + r""" + A ConvBnReLU2d module is a module fused from Conv2d, BatchNorm2d and ReLU, + attached with FakeQuantize modules for weight, + used in quantization aware training. + We combined the interface of :class:`torch.nn.Conv2d` and + :class:`torch.nn.BatchNorm2d` and :class:`torch.nn.ReLU`. + Similar to `torch.nn.Conv2d`, with FakeQuantize modules initialized to + default. + Attributes: + weight_fake_quant: fake quant module for weight + """ + # base class defines _FLOAT_MODULE as "ConvBn2d" + _FLOAT_MODULE = qnni.ConvFreezebnReLU2d # type: ignore[assignment] + + def __init__(self, + # Conv2d args + in_channels, out_channels, kernel_size, stride=1, + padding=0, dilation=1, groups=1, + bias=None, + padding_mode='zeros', + # BatchNorm2d args + # num_features: out_channels + eps=1e-05, momentum=0.1, + # affine: True + # track_running_stats: True + # Args for this module + freeze_bn=False, + qconfig=None): + super(ConvFreezebnReLU2d, self).__init__(in_channels, out_channels, kernel_size, stride, padding, dilation, groups, bias, padding_mode, eps, momentum, freeze_bn, qconfig) + + def forward(self, input): + return F.relu(ConvFreezebn2d._forward(self, input)) + + @classmethod + def from_float(cls, mod): + return super(ConvFreezebnReLU2d, cls).from_float(mod) + + +class _ConvTransposeFreezebnNd(_ConvTransposeBnNd): + + _version = 2 + _FLOAT_MODULE = MOD + + def __init__( + self, + # ConvTransposeBnNd args + in_channels, + out_channels, + kernel_size, + stride, + bias, + transposed, + padding, + output_padding, + groups, + dilation, + padding_mode, + # bn args + # BatchNormNd args + # num_features: out_channels + eps=1e-05, + momentum=0.1, + # affine: True + # track_running_stats: True + # Args for this module + freeze_bn=False, + qconfig=None, + dim=2): + kernel_size = _single(kernel_size) + stride = _single(stride) + padding = _single(padding) + dilation = _single(dilation) + output_padding = _single(output_padding) + nn.modules.conv._ConvTransposeNd.__init__(self, in_channels, + out_channels, kernel_size, + stride, padding, dilation, + transposed, output_padding, + groups, False, padding_mode) + assert qconfig, 'qconfig must be provided for a QAT module' + self.qconfig = qconfig + self.freeze_bn = freeze_bn if self.training else True + self.bn = FrozenBatchNorm2d(out_channels, eps, momentum, True, True) + self.weight_fake_quant = self.qconfig.weight() + # ConvTranspose do per-channel quantize on output channel. + if self.weight_fake_quant.ch_axis != -1: + self.weight_fake_quant.ch_axis = 1 + self.weight_fake_quant.activation_post_process.ch_axis = 1 + if bias: + self.bias = Parameter(torch.Tensor(out_channels)) + else: + self.register_parameter('bias', None) + self.reset_bn_parameters() + + if self.training: + if freeze_bn: + self.freeze_bn_stats() + else: + self.update_bn_stats() + else: + self.freeze_bn_stats() + + +class ConvTransposeFreezebn2d(_ConvTransposeFreezebnNd, nn.ConvTranspose2d): + _FLOAT_MODULE = qnni.ConvTransposeFreezebn2d + + def __init__( + self, + # ConvTransposeBnNd args + in_channels, + out_channels, + kernel_size, + stride=1, + bias=None, + transposed=True, + padding=0, + output_padding=0, + groups=1, + dilation=1, + padding_mode='zeros', + # bn args + # BatchNormNd args + # num_features: out_channels + eps=1e-05, + momentum=0.1, + # affine: True + # track_running_stats: True + # Args for this module + freeze_bn=False, + qconfig=None): + kernel_size = _pair(kernel_size) + stride = _pair(stride) + padding = _pair(padding) + dilation = _pair(dilation) + _ConvTransposeFreezebnNd.__init__(self, in_channels, out_channels, + kernel_size, stride, bias, transposed, + padding, output_padding, groups, dilation, + padding_mode, eps, momentum, freeze_bn, + qconfig) + + def _convtransposed_forward(self, x, w, b): + output_padding = self._output_padding(x, None, self.stride, + self.padding, self.kernel_size, + self.dilation) + return F.conv_transpose2d(x, w, b, self.stride, self.padding, + output_padding, self.groups, self.dilation) + + +class ConvTransposeFreezebnReLU2d(ConvTransposeFreezebn2d): + _FLOAT_MODULE = qnni.ConvTransposeFreezebnReLU2d + + def __init__( + self, + # ConvTransposeBnNd args + in_channels, + out_channels, + kernel_size, + stride=1, + bias=None, + transposed=True, + padding=0, + output_padding=0, + groups=1, + dilation=1, + padding_mode='zeros', + # bn args + # BatchNormNd args + # num_features: out_channels + eps=1e-05, + momentum=0.1, + # affine: True + # track_running_stats: True + # Args for this module + freeze_bn=False, + qconfig=None): + # super(ConvTransposeBnReLU2d, self).__init__(in_channels, out_channels, kernel_size, stride, + # padding, dilation, groups, bias, + # padding_mode, eps, momentum, + # freeze_bn, + # qconfig) + super(ConvTransposeFreezebnReLU2d, + self).__init__(in_channels, + out_channels, + kernel_size, + stride=stride, + bias=bias, + transposed=transposed, + padding=padding, + output_padding=output_padding, + groups=groups, + dilation=dilation, + padding_mode=padding_mode, + eps=eps, + momentum=momentum, + freeze_bn=freeze_bn, + qconfig=qconfig) + + def forward(self, input): + return F.relu(ConvTransposeFreezebn2d._forward(self, input)) + + @classmethod + def from_float(cls, mod): + return super(ConvTransposeFreezebnReLU2d, cls).from_float(mod) diff --git a/mqbench/nn/intrinsic/qat/modules/linear_fused.py b/mqbench/nn/intrinsic/qat/modules/linear_fused.py new file mode 100644 index 0000000..98dfb4e --- /dev/null +++ b/mqbench/nn/intrinsic/qat/modules/linear_fused.py @@ -0,0 +1,178 @@ +import math + +import torch +import torch.nn as nn +import torch.nn.functional as F +from torch.nn import init +from torch.nn import Linear +from torch.nn.intrinsic import _FusedModule +from torch.nn.parameter import Parameter + +from mqbench.nn.intrinsic import LinearBn1d + + +class LinearBn1d(Linear, _FusedModule): + _version = 2 + _FLOAT_MODULE = LinearBn1d + + def __init__(self, + # ConvNd args + in_features, out_features, bias, + # BatchNormNd args + # num_features: out_channels + eps=1e-05, momentum=0.1, + # affine: True + # track_running_stats: True + # Args for this module + freeze_bn=False, + qconfig=None): + Linear.__init__(self, in_features, out_features, False) + assert qconfig, 'qconfig must be provided for QAT module' + self.qconfig = qconfig + self.freeze_bn = freeze_bn if self.training else True + self.bn = nn.BatchNorm1d(out_features, eps, momentum, True, True) + self.weight_fake_quant = self.qconfig.weight() + if bias: + self.bias = Parameter(torch.empty(out_features)) + else: + self.register_parameter('bias', None) + self.reset_bn_parameters() + + # this needs to be called after reset_bn_parameters, + # as they modify the same state + if self.training: + if freeze_bn: + self.freeze_bn_stats() + else: + self.update_bn_stats() + else: + self.freeze_bn_stats() + + def reset_running_stats(self): + self.bn.reset_running_stats() + + def reset_bn_parameters(self): + self.bn.reset_running_stats() + init.uniform_(self.bn.weight) + init.zeros_(self.bn.bias) + # note: below is actully for Linear, not BN + if self.bias is not None: + fan_in, _ = init._calculate_fan_in_and_fan_out(self.weight) + bound = 1 / math.sqrt(fan_in) + init.uniform_(self.bias, -bound, bound) + + def reset_parameters(self): + super(LinearBn1d, self).reset_parameters() + + def update_bn_stats(self): + self.freeze_bn = False + self.bn.training = True + return self + + def freeze_bn_stats(self): + self.freeze_bn = True + self.bn.training = False + return self + + def _forward(self, input): + assert self.bn.running_var is not None + running_std = torch.sqrt(self.bn.running_var + self.bn.eps) + # input.shape = (batch_size, in_features, *) + # scale_factor.shape = (out_feature, ) + # self.weight.shape = (out_feature, in_feature, *) + # self.bias.shape = (out_feature, *) + # output.shape = (batch_size, out_feature, *) + if self.bn.affine: + scale_factor = self.bn.weight / running_std + else: + scale_factor = 1. / running_std + weight_shape = [1] * len(self.weight.shape) + weight_shape[0] = -1 + bias_shape = [1] * len(input.shape) + bias_shape[1] = -1 + scaled_weight = self.weight_fake_quant(self.weight * scale_factor.reshape(weight_shape)) + # using zero bias here since the bias for original Linear + # will be added later + # Linear layer takes permuted input since the format is (batch_size, *, in_features) + linear_out = F.linear(input, scaled_weight) + linear_orig = linear_out / scale_factor.reshape(bias_shape) + if self.bias is not None: + linear_orig = linear_orig + self.bias.reshape(bias_shape) + linear_out = self.bn(linear_orig) + return linear_out + + def extra_repr(self): + return super(LinearBn1d, self).extra_repr() + + def forward(self, input): + return self._forward(input) + + def train(self, mode=True): + """ + Batchnorm's training behavior is using the self.training flag. Prevent + changing it if BN is frozen. This makes sure that calling `model.train()` + on a model with a frozen BN will behave properly. + """ + self.training = mode + if not self.freeze_bn: + for module in self.children(): + module.train(mode) + return self + + def _load_from_state_dict(self, state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs): + version = local_metadata.get('version', None) + if version is None or version == 1: + # BN related parameters and buffers were moved into the BN module for v2 + v2_to_v1_names = { + 'bn.weight': 'gamma', + 'bn.bias': 'beta', + 'bn.running_mean': 'running_mean', + 'bn.running_var': 'running_var', + 'bn.num_batches_tracked': 'num_batches_tracked', + } + for v2_name, v1_name in v2_to_v1_names.items(): + if prefix + v1_name in state_dict: + state_dict[prefix + v2_name] = state_dict[prefix + v1_name] + state_dict.pop(prefix + v1_name) + elif prefix + v2_name in state_dict: + # there was a brief period where forward compatibility + # for this module was broken (between + # https://github.com/pytorch/pytorch/pull/38478 + # and https://github.com/pytorch/pytorch/pull/38820) + # and modules emitted the v2 state_dict format while + # specifying that version == 1. This patches the forward + # compatibility issue by allowing the v2 style entries to + # be used. + pass + elif strict: + missing_keys.append(prefix + v2_name) + + super(LinearBn1d, self)._load_from_state_dict( + state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs) + + @classmethod + def from_float(cls, mod): + r"""Create a qat module from a float module or qparams_dict + + Args: `mod` a float module, either produced by torch.quantization utilities + or directly from user + """ + assert type(mod) == cls._FLOAT_MODULE, 'qat.' + cls.__name__ + '.from_float only works for ' + \ + cls._FLOAT_MODULE.__name__ + assert hasattr(mod, 'qconfig'), 'Input float module must have qconfig defined' + assert mod.qconfig, 'Input float module must have a valid qconfig' + qconfig = mod.qconfig + linear, bn = mod[0], mod[1] + qat_linearbn = cls(linear.in_features, linear.out_features, False, + bn.eps, bn.momentum, + False, + qconfig) + qat_linearbn.weight = linear.weight + qat_linearbn.bias = linear.bias + qat_linearbn.bn.weight = bn.weight + qat_linearbn.bn.bias = bn.bias + qat_linearbn.bn.running_mean = bn.running_mean + qat_linearbn.bn.running_var = bn.running_var + # mypy error: Cannot determine type of 'num_batches_tracked' + qat_linearbn.bn.num_batches_tracked = bn.num_batches_tracked # type: ignore[has-type] + return qat_linearbn diff --git a/mqbench/nn/modules/__init__.py b/mqbench/nn/modules/__init__.py new file mode 100644 index 0000000..7842583 --- /dev/null +++ b/mqbench/nn/modules/__init__.py @@ -0,0 +1 @@ +from .freezebn import FrozenBatchNorm2d \ No newline at end of file diff --git a/mqbench/nn/modules/freezebn.py b/mqbench/nn/modules/freezebn.py new file mode 100644 index 0000000..222a418 --- /dev/null +++ b/mqbench/nn/modules/freezebn.py @@ -0,0 +1,12 @@ +import torch + +class FrozenBatchNorm2d(torch.nn.BatchNorm2d): + def __init__(self, *args, **kwargs): + super(FrozenBatchNorm2d, self).__init__(*args, **kwargs) + self.training = False + + def train(self, mode=False): + self.training = False + for module in self.children(): + module.train(False) + return self \ No newline at end of file diff --git a/mqbench/nn/qat/__init__.py b/mqbench/nn/qat/__init__.py new file mode 100644 index 0000000..9a8067b --- /dev/null +++ b/mqbench/nn/qat/__init__.py @@ -0,0 +1 @@ +from .modules import * \ No newline at end of file diff --git a/mqbench/nn/qat/modules/__init__.py b/mqbench/nn/qat/modules/__init__.py new file mode 100644 index 0000000..c010902 --- /dev/null +++ b/mqbench/nn/qat/modules/__init__.py @@ -0,0 +1,4 @@ +from .linear import Linear +from .deconv import ConvTranspose2d +from .conv import Conv2d +from .embedding import Embedding \ No newline at end of file diff --git a/mqbench/nn/qat/modules/conv.py b/mqbench/nn/qat/modules/conv.py new file mode 100644 index 0000000..08a7e0e --- /dev/null +++ b/mqbench/nn/qat/modules/conv.py @@ -0,0 +1,11 @@ +import torch.nn.qat.modules as nnqat + +from mqbench.quantization.default_bias_fake_quant import bias_fake_quantizer + +class Conv2d(nnqat.Conv2d): + def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', qconfig=None, device=None, dtype=None): + super().__init__(in_channels, out_channels, kernel_size, stride=stride, padding=padding, dilation=dilation, groups=groups, bias=bias, padding_mode=padding_mode, qconfig=qconfig) + self.bias_fake_quant = bias_fake_quantizer() + + def forward(self, input): + return self._conv_forward(input, self.weight_fake_quant(self.weight), self.bias_fake_quant(self.bias)) diff --git a/mqbench/nn/qat/modules/deconv.py b/mqbench/nn/qat/modules/deconv.py new file mode 100644 index 0000000..ec7ef82 --- /dev/null +++ b/mqbench/nn/qat/modules/deconv.py @@ -0,0 +1,47 @@ +import torch.nn as nn +import torch.nn.functional as F + +from mqbench.nn.intrinsic import ConvTransposeReLU2d + + +class ConvTranspose2d(nn.ConvTranspose2d): + _FLOAT_MODULE = nn.ConvTranspose2d + + def __init__(self, in_channels, out_channels, kernel_size, + stride=1, padding=0, output_padding=0, + groups=1, bias=True, dilation=1, + padding_mode='zeros', qconfig=None): + super().__init__(in_channels, out_channels, kernel_size, + stride=stride, padding=padding, output_padding=output_padding, + groups=groups, bias=bias, dilation=dilation, padding_mode=padding_mode) + assert qconfig, 'qconfig must be provided for QAT module' + self.qconfig = qconfig + self.weight_fake_quant = qconfig.weight() + # ConvTranspose do per-channel quantize on output channel. + if self.weight_fake_quant.ch_axis != -1: + self.weight_fake_quant.ch_axis = 1 + self.weight_fake_quant.activation_post_process.ch_axis = 1 + + def forward(self, x, output_size=None): + output_padding = self._output_padding( + x, output_size, self.stride, self.padding, self.kernel_size, self.dilation + ) + return F.conv_transpose2d( + x, self.weight_fake_quant(self.weight), self.bias, self.stride, self.padding, + output_padding, self.groups, self.dilation) + + @classmethod + def from_float(cls, mod): + assert type(mod) == cls._FLOAT_MODULE, 'qat.' + cls.__name__ + '.from_float only works for ' + \ + cls._FLOAT_MODULE.__name__ + assert mod.qconfig, 'Input float module must have a valid qconfig' + if type(mod) == ConvTransposeReLU2d: + mod = mod[0] + qconfig = mod.qconfig + qat_deconv = cls(mod.in_channels, mod.out_channels, mod.kernel_size, + stride=mod.stride, padding=mod.padding, output_padding=mod.output_padding, + groups=mod.groups, bias=mod.bias is not None, dilation=mod.dilation, + padding_mode=mod.padding_mode, qconfig=qconfig) + qat_deconv.weight = mod.weight + qat_deconv.bias = mod.bias + return qat_deconv \ No newline at end of file diff --git a/mqbench/nn/qat/modules/embedding.py b/mqbench/nn/qat/modules/embedding.py new file mode 100644 index 0000000..2357e38 --- /dev/null +++ b/mqbench/nn/qat/modules/embedding.py @@ -0,0 +1,69 @@ +import torch +from torch import Tensor +import torch.nn as nn +import torch.nn.functional as F + + +class Embedding(nn.Embedding): + r""" + We release the restrict of scheme type. + TODO: Delete this module since this project support torch1.10. + + An embedding bag module attached with FakeQuantize modules for weight, + used for quantization aware training. + We adopt the same interface as `torch.nn.Embedding`, please see + https://pytorch.org/docs/stable/generated/torch.nn.Embedding.html#torch.nn.Embedding + for documentation. + Similar to `torch.nn.Embedding`, with FakeQuantize modules initialized to + default. + Attributes: + weight: fake quant module for weight + """ + _FLOAT_MODULE = nn.Embedding + + def __init__(self, num_embeddings, embedding_dim, padding_idx=None, + max_norm=None, norm_type=2.0, scale_grad_by_freq=False, + sparse=False, _weight=None, device=None, dtype=None, qconfig=None) -> None: + factory_kwargs = {'device': device, 'dtype': dtype} + super().__init__(num_embeddings, embedding_dim, padding_idx, max_norm, + norm_type, scale_grad_by_freq, sparse, _weight, + **factory_kwargs) + assert qconfig, 'qconfig must be provided for QAT module' + + self.qconfig = qconfig + self.weight_fake_quant = qconfig.weight(factory_kwargs=factory_kwargs) + # Embedding do per-channel quantize on embedding channel. + if self.weight_fake_quant.ch_axis != -1: + self.weight_fake_quant.ch_axis = 1 + self.weight_fake_quant.activation_post_process.ch_axis = 1 + + def forward(self, input) -> Tensor: + return F.embedding(input, self.weight_fake_quant(self.weight), self.padding_idx, + self.max_norm, self.norm_type, self.scale_grad_by_freq, + self.sparse) + + @classmethod + def from_float(cls, mod): + r"""Create a qat module from a float module + Args: `mod` a float module, either produced by torch.ao.quantization utilities + or directly from user + """ + assert type(mod) == cls._FLOAT_MODULE, ' qat.' + cls.__name__ + '.from_float only works for ' + \ + cls._FLOAT_MODULE.__name__ + assert hasattr(mod, 'qconfig'), 'Input float module must have qconfig defined' + assert mod.qconfig, 'Input float module must have a valid qconfig' + + qconfig = mod.qconfig + qat_embedding_bag = cls(mod.num_embeddings, mod.embedding_dim, mod.padding_idx, + mod.max_norm, mod.norm_type, mod.scale_grad_by_freq, + mod.sparse, mod.weight, qconfig=qconfig) + + return qat_embedding_bag + + def to_float(self): + embedding_bag = torch.nn.Embedding(self.num_embeddings, self.embedding_dim, self.padding_idx, + self.max_norm, self.norm_type, self.scale_grad_by_freq, + self.sparse, None, self.device, self.dtype) + embedding_bag.weight = torch.nn.Parameter(self.weight.detach()) + embedding_bag.train(self.training) + return embedding_bag \ No newline at end of file diff --git a/mqbench/nn/qat/modules/linear.py b/mqbench/nn/qat/modules/linear.py new file mode 100644 index 0000000..1b57ed2 --- /dev/null +++ b/mqbench/nn/qat/modules/linear.py @@ -0,0 +1,13 @@ +import torch.nn.qat.modules as nnqat +import torch.nn.functional as F + + +class Linear(nnqat.Linear): + def __init__(self, in_features, out_features, bias=True, qconfig=None, device=None, dtype=None): + assert hasattr(qconfig, 'bias'), 'The qconfig should provide bias observer settings for the QAT module!' + super().__init__(in_features, out_features, bias=bias, qconfig=qconfig, device=device, dtype=dtype) + factory_kwargs = {'device': device, 'dtype': dtype} + self.bias_fake_quant = qconfig.bias(**factory_kwargs) + + def forward(self, input): + return F.linear(input, self.weight_fake_quant(self.weight), self.bias_fake_quant(self.bias)) diff --git a/mqbench/observer.py b/mqbench/observer.py new file mode 100644 index 0000000..7b42caf --- /dev/null +++ b/mqbench/observer.py @@ -0,0 +1,734 @@ +import math +from typing import Tuple + +import torch +from torch.quantization.observer import _ObserverBase + +from mqbench.fake_quantize.quantize_base import _version_under_1100 +from mqbench.utils import sync_tensor, pot_quantization, is_symmetric_quant +from mqbench.utils.logger import logger +from mqbench.utils.hook import PerChannelLoadHook +import warnings + +class ObserverBase(_ObserverBase): + ''' + Support per-tensor / per-channel. + dtype: quant min/max can be infered using dtype, we actually do not need this. + qscheme: quantization scheme + reduce_range: special for fbgemm to avoid overflow + quant_min: fix point value min + quant_max: fix point value max + ch_axis: per-channel axis or per-tensor(-1) + above is similiar to torch observer. + pot_scale: indecate wheather scale is power of two. + ''' + + min_val: torch.Tensor + max_val: torch.Tensor + + def __init__(self, dtype=torch.quint8, qscheme=torch.per_tensor_affine, + reduce_range=False, quant_min=None, quant_max=None, ch_axis=-1, pot_scale=False, + factory_kwargs=None): + # Since torch 1.10, function calculate_qmin_qmax is not a member function of observer, + # but import from utils. It is hard to control. We use try...except here. + stored_min, sotred_max = quant_min, quant_max + if quant_max is not None and quant_min is not None and (quant_max - quant_min + 1 > 256): + quant_min, quant_max = -128, 127 + super(ObserverBase, self).__init__(dtype, qscheme, reduce_range, quant_min, quant_max) + self.quant_min = stored_min + self.quant_max = sotred_max + self.quant_min, self.quant_max = self._calculate_qmin_qmax() + self.ch_axis = ch_axis + self.pot_scale = pot_scale + self.register_buffer("min_val", torch.tensor(float("inf"))) + self.register_buffer("max_val", torch.tensor(float("-inf"))) + self.load_state_dict_hook = PerChannelLoadHook(self) + + @torch.jit.export + def calculate_qparams(self) -> Tuple[torch.Tensor, torch.Tensor]: + r"""Calculates the quantization parameters.""" + scale, zero_point = self._calculate_qparams(self.min_val, self.max_val) + scale.data = sync_tensor(scale).data + zero_point.data = sync_tensor(zero_point).data + if self.pot_scale: + scale = pot_quantization(scale) + return scale, zero_point + + @torch.jit.export + def _calculate_qparams(self, min_val: torch.Tensor, max_val: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]: # 从源码继承而来 + r"""Calculates the quantization parameters, given min and max + value tensors. Works for both per tensor and per channel cases + + Args: + min_val: Minimum values per channel + max_val: Maximum values per channel + + Returns: + scales: Scales tensor of shape (#channels,) + zero_points: Zero points tensor of shape (#channels,) + """ + if min_val.numel() == 0 or max_val.numel() == 0: + warnings.warn( + "must run observer before calling calculate_qparams.\ + Returning default scale and zero point " + ) + return torch.tensor([1.0]), torch.tensor([0]) + + if min_val.dim() == 0 or max_val.dim() == 0: + if min_val == float('inf') and max_val == float('-inf'): + warnings.warn( + "must run observer before calling calculate_qparams.\ + Returning default scale and zero point " + ) + return torch.tensor([1.0]), torch.tensor([0]) + + assert min_val <= max_val, "min {} should be less than max {}".format( + min_val, max_val + ) + else: + assert torch.all(min_val <= max_val), "min {} should be less than max {}".format( + min_val, max_val + ) + + quant_min, quant_max = self._calculate_qmin_qmax() + min_val_neg = torch.min(min_val, torch.zeros_like(min_val)) + max_val_pos = torch.max(max_val, torch.zeros_like(max_val)) + + device = min_val_neg.device + scale = torch.ones(min_val_neg.size(), dtype=torch.float32, device=device) + zero_point = torch.zeros(min_val_neg.size(), dtype=torch.int64, device=device) + + if self.qscheme == torch.per_tensor_symmetric or self.qscheme == torch.per_channel_symmetric: + max_val_pos = torch.max(-min_val_neg, max_val_pos) + + if self.dtype == torch.quint8: + # 非负对称量化 + # if self.has_customized_qrange: + # # When customized quantization range is used, down-rounded midpoint of the range is chosen. + # zero_point = zero_point.new_full(zero_point.size(), (quant_min + quant_max) // 2) + # else: + # zero_point = zero_point.new_full(zero_point.size(), 128) + scale = (max_val - 0.) / float(quant_max - quant_min) + scale = torch.where(scale > self.eps, scale, torch.ones_like(scale)) + + elif self.dtype == torch.qint8: + # 对称量化 + scale = max_val_pos / (float(quant_max - quant_min) / 2) # 这玩意除2,意在 + scale = torch.max(scale, self.eps) + else: + raise NotImplementedError + elif self.qscheme == torch.per_channel_affine_float_qparams: + scale = (max_val - min_val) / float(quant_max - quant_min) + scale = torch.where(scale > self.eps, scale, torch.ones_like(scale)) + # We use the quantize function + # xq = Round(Xf * inv_scale + zero_point), + # setting zero_point to (-1 * min *inv_scale) we get + # Xq = Round((Xf - min) * inv_scale) + zero_point = -1 * min_val / scale + else: + scale = (max_val_pos - min_val_neg) / float(quant_max - quant_min) + scale = torch.max(scale, self.eps) + zero_point = quant_min - torch.round(min_val_neg / scale) + zero_point = torch.clamp(zero_point, quant_min, quant_max) + + # For scalar values, cast them to Tensors of size 1 to keep the shape + # consistent with default values in FakeQuantize. + if len(scale.shape) == 0: + # TODO: switch to scale.item() after adding JIT support + scale = torch.tensor([float(scale)], dtype=scale.dtype, device=device) + if len(zero_point.shape) == 0: + # TODO: switch to zero_point.item() after adding JIT support + zero_point = torch.tensor([int(zero_point)], dtype=zero_point.dtype, device=device) + if self.qscheme == torch.per_channel_affine_float_qparams: + zero_point = torch.tensor([float(zero_point)], dtype=zero_point.dtype, device=device) + + return scale, zero_point + + @torch.jit.export + def _calculate_qmin_qmax(self) -> Tuple[int, int]: + r"""Calculates actual qmin and qmax based on the quantization range, + observer datatype and if range is reduced. + """ + if self.has_customized_qrange: + quant_min, quant_max = self.quant_min, self.quant_max + else: + # Fallback onto default 8-bit qmin and qmax calculation if dynamic range is not used. + if self.dtype == torch.qint8: + if self.reduce_range: + quant_min, quant_max = -64, 63 + else: + quant_min, quant_max = -128, 127 + elif self.dtype == torch.quint8: + if self.reduce_range: + quant_min, quant_max = 0, 127 + else: + quant_min, quant_max = 0, 255 + else: + quant_min, quant_max = 0, 15 + return quant_min, quant_max + + @torch.jit.export + def extra_repr(self): + return "min_val={}, max_val={} ch_axis={} pot={}".format(self.min_val if self.ch_axis == -1 else 'List', + self.max_val if self.ch_axis == -1 else 'List', + self.ch_axis, self.pot_scale) + + +class MinMaxObserver(ObserverBase): + ''' + Calculate minmax of whole calibration dataset. + ''' + + def __init__(self, dtype=torch.quint8, qscheme=torch.per_tensor_affine, + reduce_range=False, quant_min=None, quant_max=None, ch_axis=-1, pot_scale=False, + factory_kwargs=None): + super(MinMaxObserver, self).__init__(dtype, qscheme, reduce_range, quant_min, quant_max, + ch_axis, pot_scale, factory_kwargs) + + def forward(self, x_orig): + r"""Records the running minimum and maximum of ``x``.""" + if x_orig.numel() == 0: + return x_orig + x = x_orig.to(self.min_val.dtype) + if self.ch_axis == -1: + min_val_cur, max_val_cur = torch._aminmax(x) + else: + x_dim = x.size() + new_axis_list = [i for i in range(len(x_dim))] + new_axis_list[self.ch_axis] = 0 + new_axis_list[0] = self.ch_axis + y = x.permute(new_axis_list) + y = torch.flatten(y, start_dim=1) + min_val_cur, max_val_cur = torch._aminmax(y, 1) + self.min_val = torch.min(self.min_val, min_val_cur) + self.max_val = torch.max(self.max_val, max_val_cur) + + return x + + +class MinMaxFloorObserver(ObserverBase): + ''' + Calculate minmax of whole calibration dataset with floor but round. + ''' + + def __init__(self, dtype=torch.quint8, qscheme=torch.per_tensor_affine, + reduce_range=False, quant_min=None, quant_max=None, ch_axis=-1, pot_scale=False, + factory_kwargs=None): + super(MinMaxFloorObserver, self).__init__(dtype, qscheme, reduce_range, quant_min, quant_max, + ch_axis, pot_scale, factory_kwargs) + ''' + The quant_type could be 'input', 'param', 'tensor', the co-responding + range is 1, 5, 5, + mth is 2, 3, 2 + ''' + self.quant_type = None + + + def forward(self, x_orig): + r"""Records the running minimum and maximum of ``x``.""" + if x_orig.numel() == 0: + return x_orig + x = x_orig.to(self.min_val.dtype) + if self.ch_axis == -1: + min_val_cur, max_val_cur = torch._aminmax(x) + else: + logger.warn('The per-tensor observer does not support per-channel min-max!') + min_val_cur, max_val_cur = torch._aminmax(x) + + self.min_val = min_val_cur + self.max_val = max_val_cur + self._x = x + return x + + def calculate_qparams(self): + if self.quant_type is None: + raise ValueError('You should set the observer type before forward!') + else: + scale_range = 1 if self.quant_type == 'input' else 5 + mth = 3 if self.quant_type == 'param' else 2 + scale, zero_point = self._calculate_qparams(self.min_val, self.max_val) + scale.data = scale.data * 0 + max(self.min_val / self.quant_min, self.max_val / self.quant_max) + if scale < 2 ** -15: + max_scale = 0 + else: + max_scale = 1 / scale + max_scale = torch.floor(max_scale.log2()) + min_loss = torch.tensor([float('inf')]) + final_scale = max_scale + max_scale = int(max_scale) + for s in range(max_scale, max_scale + scale_range): + _s = 1 / 2 ** s + if mth == 3: + new_x = _s * torch.clamp(torch.round(self._x / _s), self.quant_min, self.quant_max) + elif mth == 2: + new_x = torch.clamp(self._x / _s, self.quant_min, self.quant_max) + new_x = torch.where((new_x < 0) & (new_x - new_x.floor() == 0.5), new_x.ceil(), new_x.round()) + new_x *= _s + loss = ((new_x - self._x)**2).sum() + min_loss = min_loss.to(loss.device) + if loss < min_loss: + min_loss = loss + final_scale = s + final_scale = min(final_scale, 12) + scale = scale.data * 0 + 1 / (2 ** final_scale) + zero_point = torch.zeros_like(zero_point) + if not is_symmetric_quant(self.qscheme): + if self.min_val >= 0.: + zero_point = self.quant_min - torch.round(self.min_val / scale) + sync_tensor(scale) + sync_tensor(zero_point) + return scale, zero_point + + def set_quant_type(self, qtype): + self.quant_type = qtype + + +class EMAMinMaxObserver(ObserverBase): + """Moving average min/max among batches. + """ + + def __init__(self, dtype=torch.quint8, qscheme=torch.per_tensor_affine, reduce_range=False, + quant_min=None, quant_max=None, ch_axis=-1, pot_scale=False, ema_ratio=0.9, + factory_kwargs=None): + super(EMAMinMaxObserver, self).__init__(dtype, qscheme, reduce_range, quant_min, quant_max, + ch_axis, pot_scale, factory_kwargs) + self.ema_ratio = ema_ratio + + def forward(self, x_orig): + r"""Records the running minimum and maximum of ``x``.""" + if x_orig.numel() == 0: + return x_orig + x = x_orig.to(self.min_val.dtype) + if self.ch_axis == -1: + min_val_cur, max_val_cur = torch._aminmax(x) + else: + x_dim = x.size() + new_axis_list = [i for i in range(len(x_dim))] # noqa: C416 + new_axis_list[self.ch_axis] = 0 + new_axis_list[0] = self.ch_axis + y = x.permute(new_axis_list) + y = torch.flatten(y, start_dim=1) + min_val_cur, max_val_cur = torch._aminmax(y, 1) + + if self.max_val.numel() <= 1 and self.max_val.isinf(): + self.min_val = min_val_cur + self.max_val = max_val_cur + else: + self.min_val = self.min_val * self.ema_ratio + min_val_cur * (1.0 - self.ema_ratio) + self.max_val = self.max_val * self.ema_ratio + max_val_cur * (1.0 - self.ema_ratio) + return x + + +class PoTModeObserver(ObserverBase): + r"""Records the most frequent Potscale of ``x``.""" + """ + Borrow from vitis + https://github.com/Xilinx/Vitis-AI/blob/master/tools/Vitis-AI-Quantizer/vai_q_pytorch/pytorch_binding/pytorch_nndct/quantization/torchquantizer.py + """ + + def __init__(self, dtype=torch.quint8, qscheme=torch.per_tensor_affine, reduce_range=False, + quant_min=None, quant_max=None, ch_axis=-1, pot_scale=False, factory_kwargs=None): + super(PoTModeObserver, self).__init__(dtype, qscheme, reduce_range, quant_min, quant_max, ch_axis, pot_scale, factory_kwargs) + self.quant_type = None + self.counter = [0] * 20 + + def forward(self, x_orig): + r"""Records the running minimum and maximum of ``x``.""" + if x_orig.numel() == 0: + return x_orig + x = x_orig.to(self.min_val.dtype) + if self.ch_axis == -1: + min_val_cur, max_val_cur = torch._aminmax(x) + else: + logger.warn('The per-tensor observer does not support per-channel min-max!') + min_val_cur, max_val_cur = torch._aminmax(x) + + self.min_val = min_val_cur + self.max_val = max_val_cur + self._x = x + return x + + def calculate_qparams(self): + if self.quant_type is None: + raise ValueError('You should set the observer type before forward!') + else: + scale_range = 1 if self.quant_type == 'input' else 5 + mth = 3 if self.quant_type == 'param' else 2 + scale, zero_point = self._calculate_qparams(self.min_val, self.max_val) + if self.quant_min != 0: + + scale.data = scale.data * 0 + max(self.min_val / self.quant_min, self.max_val / self.quant_max) + else: + # 说明就是非负对称量化 + scale.data = scale.data * 0 + self.max_val / self.quant_max + + if scale < 2 ** -15: + max_scale = 0 + else: + max_scale = 1 / scale + max_scale = torch.floor(max_scale.log2()) + min_loss = torch.tensor([float('inf')]) + final_scale = max_scale + max_scale = int(max_scale) # 这里出问题了 + for s in range(max_scale, max_scale + scale_range): + _s = 1 / 2 ** s + if mth == 3: + new_x = _s * torch.clamp(torch.round(self._x / _s), self.quant_min, self.quant_max) + elif mth == 2: + new_x = torch.clamp(self._x / _s, self.quant_min, self.quant_max) + new_x = torch.where((new_x < 0) & (new_x - new_x.floor() == 0.5), new_x.ceil(), new_x.round()) + new_x *= _s + loss = ((new_x - self._x)**2).sum() + min_loss = min_loss.to(loss.device) + if loss < min_loss: + min_loss = loss + final_scale = s + final_scale = min(final_scale, 12) + self.counter[final_scale + 7] += 1 + final_scale = self.counter.index(max(self.counter)) - 7 + scale = scale.data * 0 + 1 / (2 ** final_scale) + zero_point = torch.zeros_like(zero_point) + if not is_symmetric_quant(self.qscheme): + if self.min_val >= 0.: + zero_point = self.quant_min - torch.round(self.min_val / scale) + sync_tensor(scale) + sync_tensor(zero_point) + return scale, zero_point + + def set_quant_type(self, qtype): + self.quant_type = qtype + + +class EMAQuantileObserver(ObserverBase): + """Moving average quantile among batches. + """ + + def __init__(self, dtype=torch.quint8, qscheme=torch.per_tensor_affine, reduce_range=False, + quant_min=None, quant_max=None, ch_axis=-1, pot_scale=False, ema_ratio=0.9, + threshold=0.99999, bins=2048, factory_kwargs=None): + super(EMAQuantileObserver, self).__init__(dtype, qscheme, reduce_range, quant_min, quant_max, + ch_axis, pot_scale, factory_kwargs) + assert self.ch_axis == -1, "Quantile observer only support in per-tensor scheme." + self.ema_ratio = ema_ratio + self.threshold = threshold + self.bins = bins + + def forward(self, x_orig): + r"""Records the running minimum and maximum of ``x``.""" + if x_orig.numel() == 0: + return x_orig + x = x_orig.to(self.min_val.dtype) + min_val_cur, max_val_cur = torch._aminmax(x) + max_hist_range = torch.max(-min_val_cur, max_val_cur) + hist = torch.histc(torch.abs(x), bins=self.bins, min=0., max=max_hist_range) + cur_total = 0 + clip_value = max_hist_range + for i, cnt in enumerate(hist): + if cur_total + cnt >= self.threshold * x.numel(): + clip_value = (i + 0.5) * (max_hist_range / self.bins) + break + cur_total += cnt + + if self.max_val.numel() <= 1 and self.max_val.isinf(): + self.min_val = max(min_val_cur, -clip_value) + self.max_val = min(max_val_cur, clip_value) + else: + self.min_val = self.min_val * self.ema_ratio + max(min_val_cur, -clip_value) * (1.0 - self.ema_ratio) + self.max_val = self.max_val * self.ema_ratio + min(max_val_cur, clip_value) * (1.0 - self.ema_ratio) + return x + + +class ClipStdObserver(ObserverBase): + """Clip std. + """ + + def __init__(self, dtype=torch.quint8, qscheme=torch.per_tensor_affine, reduce_range=False, + quant_min=None, quant_max=None, ch_axis=-1, pot_scale=False, std_scale=2.6, + factory_kwargs=None): + super(ClipStdObserver, self).__init__(dtype, qscheme, reduce_range, quant_min, quant_max, + ch_axis, pot_scale, factory_kwargs=None) + self.std_scale = std_scale + + def forward(self, x_orig): + r"""Records the running minimum and maximum of ``x``.""" + if x_orig.numel() == 0: + return x_orig + x = x_orig.to(self.min_val.dtype) + if self.ch_axis == -1: + min_val_cur, max_val_cur = torch._aminmax(x) + mean = x.mean() + std = x.std() + else: + x_dim = x.size() + new_axis_list = [i for i in range(len(x_dim))] + new_axis_list[self.ch_axis] = 0 + new_axis_list[0] = self.ch_axis + y = x.permute(new_axis_list) + y = torch.flatten(y, start_dim=1) + min_val_cur, max_val_cur = torch._aminmax(y, 1) + mean = y.mean(1) + std = y.std(1) + + # using statistics to clip min and max + min_val = torch.minimum(mean - self.std_scale * std, min_val_cur) + max_val = torch.maximum(mean + self.std_scale * std, max_val_cur) + + self.min_val = min_val + self.max_val = max_val + + return x + + +class LSQObserver(ObserverBase): + ''' + LSQ observer. + ''' + + def __init__(self, dtype=torch.quint8, qscheme=torch.per_tensor_affine, reduce_range=False, + quant_min=None, quant_max=None, ch_axis=-1, pot_scale=False, factory_kwargs=None): + super(LSQObserver, self).__init__(dtype, qscheme, reduce_range, quant_min, quant_max, + ch_axis, pot_scale, factory_kwargs) + self.tensor_norm = None + + def forward(self, x_orig): + if x_orig.numel() == 0: + return x_orig + x = x_orig.to(self.min_val.dtype) + if self.ch_axis == -1: + self.tensor_norm = x.abs().mean() + self.min_val, self.max_val = torch._aminmax(x) + else: + # compute channel-wise mean + x_dim = x.size() + new_axis_list = [i for i in range(len(x_dim))] + new_axis_list[self.ch_axis] = 0 + new_axis_list[0] = self.ch_axis + y = x.permute(new_axis_list) + y = torch.flatten(y, start_dim=1) + self.tensor_norm = y.abs().mean(1) + self.min_val, self.max_val = torch._aminmax(y, 1) # TODO 会运行到这吗 + + return x + + def calculate_qparams(self): + scale = 2 * self.tensor_norm / math.sqrt(self.quant_max) + zero_point = torch.zeros_like(self.tensor_norm) + sync_tensor(scale) + sync_tensor(zero_point) + if self.pot_scale: + scale = pot_quantization(scale) + if not is_symmetric_quant(self.qscheme): + zero_point = self.quant_min - torch.round(self.min_val / scale) + return scale, zero_point + + +class LSQPlusObserver(ObserverBase): + ''' + LSQ+ observer. + ''' + + def __init__(self, dtype=torch.quint8, qscheme=torch.per_tensor_affine, reduce_range=False, + quant_min=None, quant_max=None, ch_axis=-1, pot_scale=False, factory_kwargs=None): + + super(LSQPlusObserver, self).__init__(dtype, qscheme, reduce_range, quant_min, quant_max, + ch_axis, pot_scale, factory_kwargs) + self.mean = None + self.std = None + + def forward(self, x_orig): + if x_orig.numel() == 0: + return x_orig + x = x_orig.to(self.min_val.dtype) + if self.ch_axis == -1: + self.mean = x.mean() + self.std = x.std() + self.min_val, self.max_val = torch._aminmax(x) + else: + # compute channel-wise mean + x_dim = x.size() + new_axis_list = [i for i in range(len(x_dim))] # noqa: C416 + new_axis_list[self.ch_axis] = 0 + new_axis_list[0] = self.ch_axis + y = x.permute(new_axis_list) + y = torch.flatten(y, start_dim=1) + self.mean = y.mean(1) + self.std = y.std(1) + self.min_val, self.max_val = torch._aminmax(y) + + return x + + def calculate_qparams(self): + scale = torch.maximum((self.mean - 3 * self.std).abs(), + (self.mean + 3 * self.std).abs()) / (self.quant_max - self.quant_min + 1) + sync_tensor(scale) + sync_tensor(zero_point) + if self.pot_scale: + scale = pot_quantization(scale) + zero_point = torch.zeros_like(self.mean) + if not is_symmetric_quant(self.qscheme): + if self.min_val >= 0.: + zero_point = self.quant_min - torch.round(self.min_val / scale) + return scale, zero_point + + +class MSEObserver(ObserverBase): + ''' + Calculate mseobserver of whole calibration dataset. + ''' + + def __init__(self, dtype=torch.quint8, qscheme=torch.per_tensor_affine, + reduce_range=False, quant_min=None, quant_max=None, ch_axis=-1, pot_scale=False, p=2.0, + factory_kwargs=None): + super(MSEObserver, self).__init__(dtype, qscheme, reduce_range, quant_min, quant_max, + ch_axis, pot_scale, factory_kwargs) + self.p = p + + def lp_loss(self, pred, tgt, dim=None): + """ + loss function measured in L_p Norm + """ + return (pred - tgt).abs().pow(self.p).mean(dim) if dim else (pred - tgt).abs().pow(self.p).mean() + + + def mse(self, x: torch.Tensor, x_min: torch.Tensor, x_max: torch.Tensor, iter=80): + best_score = 1e+10 + best_min, best_max = torch.tensor([1.0], dtype=torch.float), torch.tensor([1.0], dtype=torch.float) + best_min.copy_(x_min) + best_max.copy_(x_max) + for i in range(iter): + new_min = x_min * (1.0 - (i * 0.01)) + new_max = x_max * (1.0 - (i * 0.01)) + scale, zero_point = self._calculate_qparams(new_min, new_max) + x_q = torch.fake_quantize_per_tensor_affine( + x, scale.item(), int(zero_point.item()), + self.quant_min, self.quant_max) + score = self.lp_loss(x_q, x) + if score < best_score: + best_score = score + best_min, best_max = new_min, new_max + return best_min, best_max + + def mse_perchannel(self, x: torch.Tensor, x_min: torch.Tensor, x_max: torch.Tensor, iter=80, ch_axis=0): + assert x_min.shape == x_max.shape + assert ch_axis >= 0, f'{ch_axis}' + best_score = 1e+10 * torch.ones_like(x_min) + best_min, best_max = x_min.clone(), x_max.clone() + reduce_dim = tuple([i for i in range(len(x.shape)) if i != ch_axis]) + for i in range(iter): + new_min = x_min * (1.0 - (i * 0.01)) + new_max = x_max * (1.0 - (i * 0.01)) + scale, zero_point = self._calculate_qparams(new_min, new_max) + x_q = torch.fake_quantize_per_channel_affine( + x, scale, zero_point.long() if _version_under_1100 else zero_point, ch_axis, + self.quant_min, self.quant_max) + score = self.lp_loss(x_q, x, reduce_dim) + update_idx = (score < best_score) + best_score[update_idx] = score[update_idx] + best_min[update_idx] = new_min[update_idx] + best_max[update_idx] = new_max[update_idx] + return best_min, best_max + + def forward(self, x_orig): + r"""Records the running minimum and maximum of ``x``.""" + if x_orig.numel() == 0: + return x_orig + x = x_orig.clone().detach().to(self.min_val.dtype) + if self.ch_axis == -1: + min_val_cur, max_val_cur = torch._aminmax(x) + min_val_cur, max_val_cur = self.mse(x, min_val_cur, max_val_cur, iter=95) + else: + x_dim = x.size() + new_axis_list = [i for i in range(len(x_dim))] + new_axis_list[self.ch_axis] = 0 + new_axis_list[0] = self.ch_axis + x_channel = x.permute(new_axis_list) + y = torch.flatten(x_channel, start_dim=1) + min_val_cur, max_val_cur = torch._aminmax(y, 1) + min_val_cur, max_val_cur = self.mse_perchannel(x, min_val_cur, max_val_cur, iter=80, ch_axis=self.ch_axis) + + self.min_val = torch.min(self.min_val, min_val_cur) + self.max_val = torch.max(self.max_val, max_val_cur) + return x + + +class EMAMSEObserver(ObserverBase): + ''' + Calculate mseobserver of whole calibration dataset. + ''' + def __init__(self, dtype=torch.quint8, qscheme=torch.per_tensor_affine, + reduce_range=False, quant_min=None, quant_max=None, ch_axis=-1, pot_scale=False, + p=2.0, ema_ratio=0.9, factory_kwargs=None): + super(EMAMSEObserver, self).__init__(dtype, qscheme, reduce_range, quant_min, quant_max, + ch_axis, pot_scale, factory_kwargs) + self.ema_ratio = ema_ratio + self.p = p + + def lp_loss(self, pred, tgt, dim=None): + """ + loss function measured in L_p Norm + """ + return (pred - tgt).abs().pow(self.p).mean(dim) if dim else (pred - tgt).abs().pow(self.p).mean() + + def mse(self, x: torch.Tensor, x_min: torch.Tensor, x_max: torch.Tensor, iter=80): + best_score = 1e+10 + best_min, best_max = torch.tensor([1.0], dtype=torch.float), torch.tensor([1.0], dtype=torch.float) + best_min.copy_(x_min) + best_max.copy_(x_max) + for i in range(iter): + new_min = x_min * (1.0 - (i * 0.01)) + new_max = x_max * (1.0 - (i * 0.01)) + scale, zero_point = self._calculate_qparams(new_min, new_max) # 算出s和z(都是tensor,妙)。对称量化下就是取绝对值max做为。 + x_q = torch.fake_quantize_per_tensor_affine( + x, scale.item(), int(zero_point.item()), + self.quant_min, self.quant_max) + score = self.lp_loss(x_q, x) # 和欧式不一样!这是灵魂是求均值 + if score < best_score: + best_score = score + best_min, best_max = new_min, new_max + return best_min, best_max + + def mse_perchannel(self, x: torch.Tensor, x_min: torch.Tensor, x_max: torch.Tensor, iter=80, ch_axis=0): + assert x_min.shape == x_max.shape + assert ch_axis >= 0, f'{ch_axis}' + best_score = 1e+10 * torch.ones_like(x_min) + best_min, best_max = x_min.clone(), x_max.clone() + reduce_dim = tuple([i for i in range(len(x.shape)) if i != ch_axis]) + for i in range(iter): + new_min = x_min * (1.0 - (i * 0.01)) + new_max = x_max * (1.0 - (i * 0.01)) + scale, zero_point = self._calculate_qparams(new_min, new_max) + x_q = torch.fake_quantize_per_channel_affine( + x, scale, zero_point.long() if _version_under_1100 else zero_point, ch_axis, + self.quant_min, self.quant_max) + score = self.lp_loss(x_q, x, reduce_dim) + update_idx = (score < best_score) + best_score[update_idx] = score[update_idx] + best_min[update_idx] = new_min[update_idx] + best_max[update_idx] = new_max[update_idx] + return best_min, best_max + + def forward(self, x_orig): + r"""Records the running minimum and maximum of ``x``.""" + if x_orig.numel() == 0: + return x_orig + x = x_orig.clone().detach().to(self.min_val.dtype) + if self.ch_axis == -1: + min_val_cur, max_val_cur = torch._aminmax(x) + min_val_cur, max_val_cur = self.mse(x, min_val_cur, max_val_cur, iter=95) # 因为是求MSE呀,所以是从minmax两边开始搜索 + else: + x_dim = x.size() + new_axis_list = [i for i in range(len(x_dim))] + new_axis_list[self.ch_axis] = 0 + new_axis_list[0] = self.ch_axis + x_channel = x.permute(new_axis_list) + y = torch.flatten(x_channel, start_dim=1) + min_val_cur, max_val_cur = torch._aminmax(y, 1) + min_val_cur, max_val_cur = self.mse_perchannel(x, min_val_cur, max_val_cur, iter=80, ch_axis=self.ch_axis) + + if self.max_val.numel() <= 1 and self.max_val.isinf(): # 初次,更新最值 + self.min_val = min_val_cur + self.max_val = max_val_cur + else: # 再次,通过滑动EMA型更新 + self.min_val = self.min_val * self.ema_ratio + min_val_cur * (1.0 - self.ema_ratio) + self.max_val = self.max_val * self.ema_ratio + max_val_cur * (1.0 - self.ema_ratio) + return x diff --git a/mqbench/prepare_by_platform.py b/mqbench/prepare_by_platform.py new file mode 100644 index 0000000..f159b45 --- /dev/null +++ b/mqbench/prepare_by_platform.py @@ -0,0 +1,515 @@ +from copy import deepcopy +from enum import Enum +from typing import Any, Dict +import types +import inspect + +import torch +from torch.fx import Tracer +from torch.fx.graph_module import GraphModule +from torch.quantization.quantize_fx import _swap_ff_with_fxff +from torch.quantization import QConfig +import mmcv +import mmdet + +from mqbench.fake_quantize import ( + LearnableFakeQuantize, + NNIEFakeQuantize, + FixedFakeQuantize, + DoReFaFakeQuantize, + DSQFakeQuantize, + PACTFakeQuantize, + TqtFakeQuantize, + AdaRoundFakeQuantize, + QDropFakeQuantize, + PureHooker +) +from mqbench.observer import ( + ClipStdObserver, + LSQObserver, + MinMaxFloorObserver, + MinMaxObserver, + EMAMinMaxObserver, + PoTModeObserver, + EMAQuantileObserver, + MSEObserver, + EMAMSEObserver, +) +from mqbench.fuser_method_mappings import fuse_custom_config_dict +from mqbench.utils.logger import logger +from mqbench.utils.registry import DEFAULT_MODEL_QUANTIZER +from mqbench.scheme import QuantizeScheme + +__all__ = ['prepare_by_platform'] + +class BackendType(Enum): + Academic = 'Academic' + Tensorrt = 'Tensorrt' + SNPE = 'SNPE' + PPLW8A16 = 'PPLW8A16' + NNIE = 'NNIE' + Vitis = 'Vitis' + ONNX_QNN = 'ONNX_QNN' + PPLCUDA = 'PPLCUDA' + OPENVINO = 'OPENVINO' + Tengine_u8 = "Tengine_u8" + Tensorrt_NLP = "Tensorrt_NLP" + Academic_NLP = "Academic_NLP" + + +ParamsTable = { + BackendType.Academic: dict(qtype='affine'), # noqa: E241 + BackendType.NNIE: dict(qtype='nnie', # noqa: E241 + # NNIE actually do not need w/a qscheme. We add for initialize observer only. + w_qscheme=QuantizeScheme(symmetry=True, per_channel=False, pot_scale=False, bit=8), + a_qscheme=QuantizeScheme(symmetry=True, per_channel=False, pot_scale=False, bit=8), + default_weight_quantize=NNIEFakeQuantize, + default_act_quantize=NNIEFakeQuantize, + default_weight_observer=MinMaxObserver, + default_act_observer=EMAMinMaxObserver), + BackendType.Tensorrt: dict(qtype='affine', # noqa: E241 + w_qscheme=QuantizeScheme(symmetry=True, per_channel=True, pot_scale=False, bit=8, symmetric_range=True), + a_qscheme=QuantizeScheme(symmetry=True, per_channel=False, pot_scale=False, bit=8, symmetric_range=True), + default_weight_quantize=LearnableFakeQuantize, + default_act_quantize=LearnableFakeQuantize, + default_weight_observer=MinMaxObserver, + default_act_observer=EMAMinMaxObserver), + BackendType.OPENVINO: dict(qtype='affine', # noqa: E241 + w_qscheme=QuantizeScheme(symmetry=True, per_channel=True, pot_scale=False, bit=8), + a_qscheme=QuantizeScheme(symmetry=True, per_channel=False, pot_scale=False, bit=8), + default_weight_quantize=LearnableFakeQuantize, + default_act_quantize=LearnableFakeQuantize, + default_weight_observer=MinMaxObserver, + default_act_observer=EMAMinMaxObserver), + BackendType.SNPE: dict(qtype='affine', # noqa: E241 + w_qscheme=QuantizeScheme(symmetry=False, per_channel=False, pot_scale=False, bit=8), + a_qscheme=QuantizeScheme(symmetry=False, per_channel=False, pot_scale=False, bit=8), + default_weight_quantize=LearnableFakeQuantize, + default_act_quantize=LearnableFakeQuantize, + default_weight_observer=MinMaxObserver, + default_act_observer=EMAMinMaxObserver), + BackendType.PPLW8A16: dict(qtype='affine', # noqa: E241 + w_qscheme=QuantizeScheme(symmetry=False, per_channel=False, pot_scale=False, bit=8), + a_qscheme=QuantizeScheme(symmetry=False, per_channel=False, pot_scale=False, bit=16), + default_weight_quantize=LearnableFakeQuantize, + default_act_quantize=LearnableFakeQuantize, + default_weight_observer=MinMaxObserver, + default_act_observer=EMAMinMaxObserver), + BackendType.Vitis: dict(qtype='vitis', # noqa: E241 + w_qscheme=QuantizeScheme(symmetry=True, per_channel=False, pot_scale=True, bit=8), + a_qscheme=QuantizeScheme(symmetry=True, per_channel=False, pot_scale=True, bit=8), + default_weight_quantize=TqtFakeQuantize, + default_act_quantize=TqtFakeQuantize, + default_weight_observer=MinMaxFloorObserver, + default_act_observer=PoTModeObserver), + BackendType.ONNX_QNN: dict(qtype='affine', # noqa: E241 + w_qscheme=QuantizeScheme(symmetry=False, per_channel=False, pot_scale=False, bit=8), + a_qscheme=QuantizeScheme(symmetry=False, per_channel=False, pot_scale=False, bit=8), + default_weight_quantize=LearnableFakeQuantize, + default_act_quantize=LearnableFakeQuantize, + default_weight_observer=MinMaxObserver, + default_act_observer=MinMaxObserver), + BackendType.PPLCUDA: dict(qtype='affine', # noqa: E241 + w_qscheme=QuantizeScheme(symmetry=False, per_channel=True, pot_scale=False, bit=8), + a_qscheme=QuantizeScheme(symmetry=False, per_channel=False, pot_scale=False, bit=8), + default_weight_quantize=LearnableFakeQuantize, + default_act_quantize=LearnableFakeQuantize, + default_weight_observer=MinMaxObserver, + default_act_observer=MinMaxObserver), + BackendType.Tengine_u8: dict(qtype="affine", + w_qscheme=QuantizeScheme(symmetry=False, per_channel=False, pot_scale=False, bit=8), + a_qscheme=QuantizeScheme(symmetry=False, per_channel=False, pot_scale=False, bit=8), + default_weight_quantize=LearnableFakeQuantize, + default_act_quantize=LearnableFakeQuantize, + default_weight_observer=MinMaxObserver, + default_act_observer=EMAMinMaxObserver), +} +ParamsTable[BackendType.Tensorrt_NLP] = ParamsTable[BackendType.Tensorrt] +ParamsTable[BackendType.Academic_NLP] = ParamsTable[BackendType.Academic] + +ObserverDict = { # Obeser 映射到类头 + 'MinMaxObserver': MinMaxObserver, # noqa: E241 + 'EMAMinMaxObserver': EMAMinMaxObserver, # More general choice. # noqa: E241 + 'MinMaxFloorObserver': MinMaxFloorObserver, # For Vitis HW # noqa: E241 + 'PoTModeObserver': PoTModeObserver, # For Vitis HW # noqa: E241 + 'EMAQuantileObserver': EMAQuantileObserver, # Quantile observer. # noqa: E241 + 'ClipStdObserver': ClipStdObserver, # Usually used for DSQ. # noqa: E241 + 'LSQObserver': LSQObserver, # Usually used for LSQ. # noqa: E241 + 'MSEObserver': MSEObserver, # noqa: E241 + 'EMAMSEObserver': EMAMSEObserver, # noqa: E241 +} + +FakeQuantizeDict = { # 量化器映射到类头 + 'FixedFakeQuantize': FixedFakeQuantize, # Unlearnable scale/zeropoint # noqa: E241 + 'LearnableFakeQuantize': LearnableFakeQuantize, # Learnable scale/zeropoint # noqa: E241 + 'NNIEFakeQuantize': NNIEFakeQuantize, # Quantize function for NNIE # noqa: E241 + 'DoReFaFakeQuantize': DoReFaFakeQuantize, # Dorefa # noqa: E241 + 'DSQFakeQuantize': DSQFakeQuantize, # DSQ # noqa: E241 + 'PACTFakeQuantize': PACTFakeQuantize, # PACT # noqa: E241 + 'TqtFakeQuantize': TqtFakeQuantize, # TQT # noqa: E241 + 'AdaRoundFakeQuantize': AdaRoundFakeQuantize, # AdaRound # noqa: E241 + 'QDropFakeQuantize': QDropFakeQuantize, # BRECQ & QDrop # noqa: E241 + 'PureHooker': PureHooker +} + + +def get_qconfig_by_platform(deploy_backend: BackendType, extra_qparams: Dict): # 拉取默认的config,再修改成自定义的config + """ + + Args: + deploy_backend (BackendType): + extra_qparams (dict): + + >>> extra params format: { + 'w_observer': str, weight observer name, + 'a_observer': str, activation observer name, + 'w_fakequantize': str, weight fake quantize function name, + 'w_fakeq_params": dict, params for weight quantize function, + 'a_fakequantize': str, activation fake quantize function name, + 'a_fakeq_params': dict, params for act quantize function, + if deploy_backend == BackendType.Academic keys below will be used: + 'w_qscheme': { + 'bit': bitwidth, + 'symmetry': whether quantize scheme is symmetric, + 'per_channel': whether quantize scheme is perchannel, + 'pot_scale': whether scale is power of two. + } + 'a_qscheme': { + same with w_qscheme. + } + } + """ + w_observer = extra_qparams.get('w_observer', None) + if w_observer: + assert w_observer in ObserverDict, \ + 'Do not support observer name: {}'.format(w_observer) + w_observer = ObserverDict[w_observer] + a_observer = extra_qparams.get('a_observer', None) + if a_observer: + assert a_observer in ObserverDict, \ + 'Do not support observer name: {}'.format(a_observer) + a_observer = ObserverDict[a_observer] + w_fakequantize = extra_qparams.get('w_fakequantize', None) + if w_fakequantize: + assert w_fakequantize in FakeQuantizeDict, \ + 'Do not support fakequantize name: {}'.format(w_fakequantize) + w_fakequantize = FakeQuantizeDict[w_fakequantize] + a_fakequantize = extra_qparams.get('a_fakequantize', None) + if a_fakequantize: + assert a_fakequantize in FakeQuantizeDict, \ + 'Do not support fakequantize name: {}'.format(a_fakequantize) + a_fakequantize = FakeQuantizeDict[a_fakequantize] + backend_params = ParamsTable[deploy_backend] # 拉取默认config + + # NNIE backend must use NNIEFakeQuantize but leave observer adjustable. + if backend_params['qtype'] == 'nnie': + if not w_observer: + w_observer = backend_params['default_weight_observer'] + if not a_observer: + a_observer = backend_params['default_act_observer'] + w_qscheme = backend_params['w_qscheme'] + a_qscheme = backend_params['a_qscheme'] + w_config = backend_params['default_weight_quantize'].with_args(observer=w_observer, + **w_qscheme.to_observer_params()) + a_config = backend_params['default_act_quantize'].with_args(observer=a_observer, + **a_qscheme.to_observer_params()) + return QConfig(activation=a_config, weight=w_config) + + # Academic setting should specific quant scheme in config. + if deploy_backend in [BackendType.Academic, BackendType.Academic_NLP]: + w_qscheme = QuantizeScheme(**extra_qparams['w_qscheme']) # qscheme就是量化有关参数,bit 对称 POT + a_qscheme = QuantizeScheme(**extra_qparams['a_qscheme']) + else: + w_qscheme = extra_qparams.get('w_qscheme', None) + if w_qscheme is None: + w_qscheme = backend_params['w_qscheme'] + else: + logger.info("Weight Quant Scheme is overrided!") + w_qscheme = QuantizeScheme(**w_qscheme) + a_qscheme = extra_qparams.get('a_qscheme', None) + if a_qscheme is None: + a_qscheme = backend_params['a_qscheme'] + else: + logger.info("Activation Quant Scheme is overrided!") + a_qscheme = QuantizeScheme(**a_qscheme) + + # Set extra args for observers. + w_observer_extra_args = extra_qparams.get('w_observer_extra_args', {}) + a_observer_extra_args = extra_qparams.get('a_observer_extra_args', {}) + w_qscheme.kwargs.update(w_observer_extra_args) + a_qscheme.kwargs.update(a_observer_extra_args) + # Get weight / act fake quantize function and params. And bias fake quantizer if needed(Vitis) + if not w_fakequantize: + w_fakequantize = backend_params['default_weight_quantize'] + w_fakeq_params = extra_qparams.get('w_fakeq_params', {}) # TODO 这是干嘛的 + if not a_fakequantize: + a_fakequantize = backend_params['default_act_quantize'] + a_fakeq_params = extra_qparams.get('a_fakeq_params', {}) + # Get default observer type. + if not w_observer: + w_observer = backend_params['default_weight_observer'] + if not a_observer: + a_observer = backend_params['default_act_observer'] + + # Create qconfig. + # here, rewrited by with_args + w_qconfig = w_fakequantize.with_args(observer=w_observer, **w_fakeq_params, **w_qscheme.to_observer_params()) # TODO 这是干嘛的 + a_qconfig = a_fakequantize.with_args(observer=a_observer, **a_fakeq_params, **a_qscheme.to_observer_params()) + logger.info('Weight Qconfig:\n FakeQuantize: {} Params: {}\n' + ' Oberver: {} Params: {}'.format(w_fakequantize.__name__, w_fakeq_params, + w_observer.__name__, str(w_qscheme))) + logger.info('Activation Qconfig:\n FakeQuantize: {} Params: {}\n' + ' Oberver: {} Params: {}'.format(a_fakequantize.__name__, a_fakeq_params, + a_observer.__name__, str(a_qscheme))) + if backend_params['qtype'] == 'vitis': + logger.info('Bias Qconfig:\n TqtFakeQuantize with MinMaxObserver') + + return QConfig(activation=a_qconfig, weight=w_qconfig) # TODO 这是啥意思 + + +class CustomedTracer(Tracer): + """ + ``Tracer`` is the class that implements the symbolic tracing functionality + of ``torch.fx.symbolic_trace``. A call to ``symbolic_trace(m)`` is equivalent + to ``Tracer().trace(m)``. + This Tracer override the ``is_leaf_module`` function to make symbolic trace + right in some cases. + """ + def __init__(self, *args, customed_leaf_module=None, **kwargs): + super().__init__(*args, **kwargs) + self.customed_leaf_module = customed_leaf_module + + def is_leaf_module(self, m: torch.nn.Module, module_qualified_name : str) -> bool: + """ + A method to specify whether a given ``nn.Module`` is a "leaf" module. + Leaf modules are the atomic units that appear in + the IR, referenced by ``call_module`` calls. By default, + Modules in the PyTorch standard library namespace (torch.nn) + are leaf modules. All other modules are traced through and + their constituent ops are recorded, unless specified otherwise + via this parameter. + Args: + m (Module): The module being queried about + module_qualified_name (str): The path to root of this module. For example, + if you have a module hierarchy where submodule ``foo`` contains + submodule ``bar``, which contains submodule ``baz``, that module will + appear with the qualified name ``foo.bar.baz`` here. + """ + if self.customed_leaf_module and isinstance(m, self.customed_leaf_module): + return True + return m.__module__.startswith('torch.nn') and not isinstance(m, torch.nn.Sequential) + +def duplicate_reused_nodes(graph: torch.fx.Graph, modules: Dict[str, Any] = {}, not_duplicated_prefixes=[]): # TODO 这是怎么找出哪个call module是重复的? + _dup_prefix = '_dup' + target_dict = dict() # TODO node.target指的是实际layer/function的名字 + dup_modules = dict() # 就是新增的复制的layer + + for node in graph.nodes: # XXX 这里就和ONNX gs一摸一样,遍历节点,但是更细粒度,包括一些参数 + if node.op == "call_module": # call_function就是符合torch规范的函数,如torch.add + if node.target not in target_dict: # target_dict其实就是想找出所有的layer + target_dict[node.target] = [node] # XXX node名字是唯一的,重复使用的layer会为node名字加后缀。 + else: + target_dict[node.target].append(node) + for key in target_dict: + exclude_flag = False# XXX 定义排除机制 + for exclude_prefix in not_duplicated_prefixes: + if exclude_prefix in key: + exclude_flag = True + break + if exclude_flag: + continue # 直接退出?可取吗 + if len(target_dict[key]) > 1: # 这里就是看哪个名字重复出现了,那就是说该算子共享了,就需要处理 + for idx, node in enumerate(target_dict[key]): + if idx == 0: # 第一个的node就是其本身,原汁原味,不变。 + continue + module = deepcopy(modules[node.target]) # 索引出对应的layer,深度拷贝 + node.target += _dup_prefix + str(idx) # 直接改名字 + dup_modules[node.target] = module + graph.lint() + return graph, dup_modules + +def prepare_constant_dict(graph: torch.fx.Graph, model: torch.nn.Module): + def _get_attrs(target, attrs): + attrs = attrs.split('.') + for att in attrs: + target = getattr(target, att) + return target + constant_dict = dict() + for node in graph.nodes: + if node.op == 'get_attr': + constant_dict[node.target] = _get_attrs(model, node.target) + return constant_dict + +def eliminate_dead_node(graph: torch.fx.Graph): + """ + Remove all dead code from the graph, based on each node's number of + users, and whether the nodes have any side effects. The graph must be + topologically sorted before calling. + """ + def is_impure(node): + """ + 从高版本抄过来的,懒得升级torch版本了 + https://pytorch.org/docs/1.9.0/_modules/torch/fx/node.html#Node.is_impure + https://pytorch.org/docs/1.9.0/_modules/torch/fx/graph.html#Graph.eliminate_dead_code + Returns whether this op is impure, i.e. if its op is a placeholder or + output, or if a call_function or call_module which is impure. + + Returns: + + bool: If the op is impure or not. + """ + if node.op in {"placeholder", "output"}: + return True + + # Check if an impure function. + # if node.op == "call_function": + # return node.target in _side_effectful_functions + + # Check if an impure module. + # if node.op == "call_module": + # assert ( + # node.graph.owning_module is not None + # ), "self.graph.owning_module not set for purity check" + # target_mod = node.graph.owning_module.get_submodule(node.target) + # assert ( + # target_mod is not None + # ), f"Did not find expected submodule target {node.target}" + # return getattr(target_mod, "_is_impure", False) + + return False + + + graph.lint() + + # Reverse iterate so that when we remove a node, any nodes used as an + # input to that node have an updated user count that no longer reflects + # the removed node. + changed = False + for node in reversed(graph.nodes): + if not is_impure(node) and len(node.users) == 0: + graph.erase_node(node) + logger.info("Erase node {}. ".format(node.name)) # 确实说明的是,在该node后面加上fakequant用于act + changed = True + + return changed + + +def prepare_by_platform( + model: torch.nn.Module, + deploy_backend: BackendType, + structure_detail, + prepare_custom_config_dict: Dict[str, Any] = {}, + custom_tracer: Tracer = None): + """ + Args: + model (torch.nn.Module): + deploy_backend (BackendType): + + >>> prepare_custom_config_dict : { + extra_qconfig_dict : Dict, Find explanations in get_qconfig_by_platform, + extra_quantizer_dict: Extra params for quantizer. + preserve_attr: Dict, Specify attribute of model which should be preserved + after prepare. Since symbolic_trace only store attributes which is + in forward. If model.func1 and model.backbone.func2 should be preserved, + {"": ["func1"], "backbone": ["func2"] } should work. + Attr below is inherited from Pytorch. + concrete_args: Specify input for model tracing. + extra_fuse_dict: Specify extra fusing patterns and functions. + } + + """ + model_mode = 'Training' if model.training else 'Eval' + logger.info("Quantize model Scheme: {} Mode: {}".format(deploy_backend, model_mode)) + + # XXX Get Qconfig,该阶段只是在收集和整理信息,没有定义实质性的东西,就是写config + extra_qconfig_dict = prepare_custom_config_dict.get('extra_qconfig_dict', {}) + qconfig = get_qconfig_by_platform(deploy_backend, extra_qconfig_dict) + + _swap_ff_with_fxff(model) # XXX 替换fx不支持的节点。几乎很少 + # # Preserve attr. XXX + # preserve_attr_dict = dict() + # if 'preserve_attr' in prepare_custom_config_dict: + # for submodule_name in prepare_custom_config_dict['preserve_attr']: + # cur_module = model + # if submodule_name != "": + # cur_module = getattr(model, submodule_name) + # # preserve_attr_list = prepare_custom_config_dict['preserve_attr'][submodule_name] + # preserve_attr_dict[submodule_name] = cur_module + # # for attr in preserve_attr_list: + # # preserve_attr_dict[submodule_name][attr] = getattr(cur_module, attr) + # Symbolic trace + concrete_args = structure_detail.input_concrete_args # XXX trace 的定制 + not_duplicated_prefixes = structure_detail.not_duplicated_prefixes + customed_leaf_module = prepare_custom_config_dict.get('leaf_module', []) # XXX trace 的定制 leaf module 就是我们正常定义的层结构,这里是手动说明自定义的层 + customed_leaf_module.append(mmcv.cnn.bricks.swish.Swish) + customed_leaf_module.append(mmcv.cnn.bricks.activation.Clamp) + customed_leaf_module.append(mmcv.cnn.bricks.hsigmoid.HSigmoid) + customed_leaf_module.append(mmcv.cnn.bricks.scale.Scale) + customed_leaf_module.append(mmdet.models.necks.ssd_neck.L2Norm) + + tracer = CustomedTracer(customed_leaf_module=tuple(customed_leaf_module)) + if custom_tracer is not None: + tracer = custom_tracer + + if len(concrete_args) == 1 and 'in_num' in concrete_args: + model.in_num = concrete_args['in_num'] + elif len(concrete_args) == 0: + pass + else: + raise NotImplementedError + + graph = tracer.trace(model) # XXX graph的node是允许“重复”的,指反复使用一个算子(层)时会反复记录成node。 + name = model.__class__.__name__ if isinstance(model, torch.nn.Module) else model.__name__ + modules = dict(model.named_modules()) # XXX 这个操作直接提取出所有的子layer,及其名字,作为name:layer dict + # TODO 删除死节点。torch1.9之后才有。此为低版本的滥用 + eliminate_dead_node(graph) + + graph, duplicated_modules = duplicate_reused_nodes(graph, modules, not_duplicated_prefixes) # XXX 意思是,需要把共享的call module复制出来,取消共享。注意,只复制module!在共享head机制下不能复制head!该功能更关注的是串行上的复用问题 + constant_nodes = prepare_constant_dict(graph, model) # 确实是用来获取constant。一般出自model的attr + # TODO 下面这两步更新到一起?为啥? + modules.update(duplicated_modules) # XXX 确实,必须得复制,因为有的relu是共享的! + modules.update(constant_nodes) + + graph_module = GraphModule(modules, graph, name) # TODO 这就搞到一起了??? + # Model fusion. + extra_fuse_dict = prepare_custom_config_dict.get('extra_fuse_dict', {}) # XXX 指定哪些需要fuse + # extra_fuse_dict.update(fuse_custom_config_dict) # NOTE 加载MQBEnch自定义的fuse, + # Prepare + import mqbench.custom_quantizer # noqa: F401 + extra_quantizer_dict = prepare_custom_config_dict.get('extra_quantizer_dict', {}) + quantizer = DEFAULT_MODEL_QUANTIZER[deploy_backend](extra_quantizer_dict, extra_fuse_dict) + prepared = quantizer.prepare(graph_module, qconfig, structure_detail.further_detail, testing=prepare_custom_config_dict.get('testing', False)) # 返回已经插入quantizer的模型结构 + # TODO Restore attr. + if 'preserve_attr' in structure_detail: + for attr_name in structure_detail['preserve_attr']: + cur_module = model + try: + attr = getattr(model, attr_name) + + except AttributeError: + pass + else: + logger.info("Preserve attr: {}".format(attr_name)) + _type = type(model) + if inspect.ismethod(attr): + attr = types.MethodType(getattr(_type, attr_name), prepared) + + # preserve_attr_list = prepare_custom_config_dict['preserve_attr'][submodule_name] + setattr(prepared, attr_name, attr) + + # # Restore attr. + # if 'preserve_attr' in prepare_custom_config_dict: + # for submodule_name in prepare_custom_config_dict['preserve_attr']: + # cur_module = prepared + # _type = type(model) + # if submodule_name != "": + # cur_module = getattr(prepared, submodule_name) + # _type = type(getattr(model, submodule_name)) + # preserve_attr_list = prepare_custom_config_dict['preserve_attr'][submodule_name] + # for attr_name in preserve_attr_list: + # logger.info("Preserve attr: {}.{}".format(submodule_name, attr_name)) + # _attr = preserve_attr_dict[submodule_name][attr_name] + # if inspect.ismethod(_attr): + # _attr = types.MethodType(getattr(_type, attr_name), cur_module) + # setattr(cur_module, attr_name, _attr) + return prepared diff --git a/mqbench/quantization/__init__.py b/mqbench/quantization/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mqbench/quantization/default_bias_fake_quant.py b/mqbench/quantization/default_bias_fake_quant.py new file mode 100644 index 0000000..bbb47b1 --- /dev/null +++ b/mqbench/quantization/default_bias_fake_quant.py @@ -0,0 +1,12 @@ +from mqbench.fake_quantize import TqtFakeQuantize +from mqbench.observer import MinMaxFloorObserver +from mqbench.scheme import QuantizeScheme + + +bias_fakeq_param = {} +bias_qscheme = QuantizeScheme(symmetry=True, per_channel=False, pot_scale=True, bit=8) +b_fakequantize = TqtFakeQuantize +b_qconfig = b_fakequantize.with_args(observer=MinMaxFloorObserver, **bias_fakeq_param, **bias_qscheme.to_observer_params()) +bias_fake_quantizer = b_qconfig +bias_fake_quantizer.p.keywords.pop('sign') +bias_fake_quantizer.p.keywords.pop('bit') diff --git a/mqbench/scheme.py b/mqbench/scheme.py new file mode 100644 index 0000000..d8b526e --- /dev/null +++ b/mqbench/scheme.py @@ -0,0 +1,46 @@ +import torch + + +class QuantizeScheme(object): # 结构体类,记录qscheme + """Describe quantization scheme. + """ + def __init__(self, symmetry=True, per_channel=False, pot_scale=False, bit=8, **kwargs): + self.symmetry = symmetry + self.per_channel = per_channel + self.pot_scale = pot_scale + self.bit = bit + if self.per_channel: + self.torch_qscheme = torch.per_channel_symmetric if self.symmetry else torch.per_channel_affine # 原来非对称叫affine + else: + self.torch_qscheme = torch.per_tensor_symmetric if self.symmetry else torch.per_tensor_affine + if 'symmetric_range' in kwargs: + self.symmetric_range = kwargs['symmetric_range'] + del kwargs['symmetric_range'] + else: + self.symmetric_range = False + + if 'sign' in kwargs: + self.sign = kwargs['sign'] + else: + self.sign = True + kwargs['sign'] = True + + self.kwargs = kwargs + + def to_observer_params(self): # 生成更细致的量化参数 + naive_para = { + 'quant_min': (-2 ** (self.bit - 1) + 1 if self.symmetric_range else -2 ** (self.bit - 1)) if (self.symmetry and self.sign) else 0, + 'quant_max': 2 ** (self.bit - 1) - 1 if (self.symmetry and self.sign) else 2 ** self.bit - 1, + 'dtype': torch.qint8 if (self.symmetry and self.sign) else torch.quint8, + 'pot_scale': self.pot_scale, + 'qscheme': self.torch_qscheme, + 'reduce_range': False, + 'ch_axis': 0 if self.per_channel else -1 + , 'bit': self.bit + } + naive_para.update(self.kwargs) + return naive_para + + def __str__(self): + return "Symmetric: {} / Bitwidth: {} / Per channel: {} / Pot scale: {} / Extra kwargs: {}".format( + self.symmetry, self.bit, self.per_channel, self.pot_scale, self.kwargs) diff --git a/mqbench/tools/__init__.py b/mqbench/tools/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mqbench/tools/replace_syncbn.py b/mqbench/tools/replace_syncbn.py new file mode 100644 index 0000000..ac7db69 --- /dev/null +++ b/mqbench/tools/replace_syncbn.py @@ -0,0 +1,30 @@ +import torch +from spring.linklink.nn import SyncBatchNorm2d + + +def replace_bn_to_syncbn(model, custombn=SyncBatchNorm2d): + if type(model) in [torch.nn.BatchNorm2d]: + return _replace_bn(model, custombn) + + elif type(model) in [torch.nn.intrinsic.qat.ConvBn2d, torch.nn.intrinsic.qat.ConvBnReLU2d]: + model.bn = _replace_bn(model.bn, custombn) + return model + + elif type(model) in [torch.nn.intrinsic.BNReLU2d]: + model[0] = _replace_bn(model[0], custombn) + return model + + else: + for name, module in model.named_children(): + setattr(model, name, replace_bn_to_syncbn(module)) + return model + + +def _replace_bn(bn, custombn): + syncbn = custombn(bn.num_features, bn.eps, bn.momentum, bn.affine) + if bn.affine: + syncbn.weight = bn.weight + syncbn.bias = bn.bias + syncbn.running_mean = bn.running_mean + syncbn.running_var = bn.running_var + return syncbn diff --git a/mqbench/utils/__init__.py b/mqbench/utils/__init__.py new file mode 100644 index 0000000..90f60fd --- /dev/null +++ b/mqbench/utils/__init__.py @@ -0,0 +1 @@ +from .utils import * \ No newline at end of file diff --git a/mqbench/utils/fusion.py b/mqbench/utils/fusion.py new file mode 100644 index 0000000..beea46e --- /dev/null +++ b/mqbench/utils/fusion.py @@ -0,0 +1,30 @@ +from copy import deepcopy + +import torch + + +def fuse_deconv_bn_weights(deconv_w, deconv_b, bn_rm, bn_rv, bn_eps, bn_w, bn_b): + if deconv_b is None: + deconv_b = torch.zeros_like(bn_rm) + if bn_w is None: + bn_w = torch.ones_like(bn_rm) + if bn_b is None: + bn_b = torch.zeros_like(bn_rm) + bn_var_rsqrt = torch.rsqrt(bn_rv + bn_eps) + + shape = [1] * len(deconv_w.shape) + shape[1] = -1 + deconv_w = deconv_w * (bn_w * bn_var_rsqrt).reshape(shape) + deconv_b = (deconv_b - bn_rm) * bn_var_rsqrt * bn_w + bn_b + + return torch.nn.Parameter(deconv_w), torch.nn.Parameter(deconv_b) + + +def fuse_deconv_bn_eval(deconv, bn): + assert (not (deconv.training or bn.training)), 'Fusion only for eval!' + + fused_deconv = deepcopy(deconv) + fused_deconv.weight, fused_deconv.bias = fuse_deconv_bn_weights( + deconv.weight, deconv.bias, bn.running_mean, bn.running_var, bn.eps, + bn.weight, bn.bias) + return fused_deconv \ No newline at end of file diff --git a/mqbench/utils/hook.py b/mqbench/utils/hook.py new file mode 100644 index 0000000..f0a79aa --- /dev/null +++ b/mqbench/utils/hook.py @@ -0,0 +1,61 @@ +from functools import partial + +import torch + +class StopForwardException(Exception): + """ + Used to throw and catch an exception to stop traversing the graph + """ + pass + + +class DataSaverHook: + """ + Forward hook that stores the input and output of a layer/block + """ + def __init__(self, store_input=False, store_output=False, stop_forward=False): + self.store_input = store_input + self.store_output = store_output + self.stop_forward = stop_forward + + self.input_store = None + self.output_store = None + + def __call__(self, module, input_batch, output_batch): + if self.store_input: + self.input_store = input_batch + if self.store_output: + self.output_store = output_batch + if self.stop_forward: + raise StopForwardException + + +class PerChannelLoadHook: + def __init__(self, module, hook_param=["scale", "zero_point"]): + self.hook = module._register_load_state_dict_pre_hook(partial(self.hook_fn, module=module)) + self.hook_param = hook_param + + def hook_fn(self, state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs, + module): + if module.ch_axis == -1: + # no per-channel parameters + return + for module_key, param in module._parameters.items(): + if module_key not in self.hook_param: + continue + candidate = prefix + module_key + if candidate in state_dict: + input_param = state_dict[candidate] + if param.shape != input_param.shape: + param.data = torch.ones_like(input_param, dtype=param.dtype, device=param.device) + for module_key, param in module._buffers.items(): + if module_key not in self.hook_param: + continue + candidate = prefix + module_key + if candidate in state_dict: + input_param = state_dict[candidate] + if param.shape != input_param.shape: + param.data = torch.ones_like(input_param, dtype=param.dtype, device=param.device) + + def close(self): + self.hook.remove() diff --git a/mqbench/utils/logger.py b/mqbench/utils/logger.py new file mode 100644 index 0000000..5c23b72 --- /dev/null +++ b/mqbench/utils/logger.py @@ -0,0 +1,24 @@ +import logging +import sys + + +MQBENCH_LOGGER_NAME = "MQBENCH" +logger = logging.getLogger(MQBENCH_LOGGER_NAME) +logger.propagate = False +stdout_handler = logging.StreamHandler(sys.stdout) +fmt = logging.Formatter("[%(name)s] %(levelname)s: %(message)s") +stdout_handler.setFormatter(fmt) +stdout_handler.setLevel(logging.DEBUG) +logger.addHandler(stdout_handler) +logger.setLevel(logging.INFO) +logger.parent = None + + +def set_log_level(level): + logger.setLevel(level) + for handler in logger.handlers: + handler.setLevel(level) + + +def disable_logging(): + logger.handlers = [] diff --git a/mqbench/utils/registry.py b/mqbench/utils/registry.py new file mode 100644 index 0000000..fb5c863 --- /dev/null +++ b/mqbench/utils/registry.py @@ -0,0 +1,43 @@ +from collections import OrderedDict + + +DEFAULT_MODEL_QUANTIZER = OrderedDict() + + +def register_model_quantizer(backend_type): + def insert(quantizer_cls): + DEFAULT_MODEL_QUANTIZER[backend_type] = quantizer_cls + return quantizer_cls + return insert + +BACKEND_DEPLOY_FUNCTION = OrderedDict() + + +def register_deploy_function(backend_type): + def insert(func): + if backend_type in BACKEND_DEPLOY_FUNCTION: + BACKEND_DEPLOY_FUNCTION[backend_type].append(func) + else: + BACKEND_DEPLOY_FUNCTION[backend_type] = [func] + return func + return insert + + +FUSED_MODULE_CONVERT_FUNCTION = OrderedDict() + + +def register_convert_function(module_type): + def insert(func): + FUSED_MODULE_CONVERT_FUNCTION[module_type] = func + return func + return insert + + +WEIGHT_EQUALIZATION_FUNCTION = OrderedDict() + + +def register_weight_equalization_function(layer1, layer2): + def insert(func): + WEIGHT_EQUALIZATION_FUNCTION[layer1] = {layer2: func} + return func + return insert \ No newline at end of file diff --git a/mqbench/utils/state.py b/mqbench/utils/state.py new file mode 100644 index 0000000..e5e4c9e --- /dev/null +++ b/mqbench/utils/state.py @@ -0,0 +1,54 @@ +import torch + +from mqbench.utils.logger import logger + + +def enable_calibration(model): # 启动所有的observer,但停用quantizer + logger.info('Enable observer and Disable quantize.') + for name, submodule in model.named_modules(): + if isinstance(submodule, torch.quantization.FakeQuantizeBase): + logger.debug('Enable observer and Disable quant: {}'.format(name)) + submodule.enable_observer() + submodule.disable_fake_quant() + +def enable_calibration_woquantization(model, quantizer_type='fake_quant'): # 启动对应前缀名字的量化器的observer,关闭量化器。同时停用非名字匹配的quantizer和ob + logger.info('Enable observer and Disable quantize for {}'.format(quantizer_type)) + for name, submodule in model.named_modules(): + if isinstance(submodule, torch.quantization.FakeQuantizeBase): + if quantizer_type not in name: # TODO 突发!原来weight quantize也是一个独立的个体!但不是layer,但是是怎么访问到的?? + submodule.disable_observer() + submodule.disable_fake_quant() + continue + logger.debug('Enable observer and Disable quant: {}'.format(name)) + submodule.enable_observer() + submodule.disable_fake_quant() + +def enable_calibration_quantization(model, quantizer_type='fake_quant'): # 启动对应前缀名字的量化器及ob。同时停用非名字匹配的quantizer和ob + logger.info('Enable observer and Enable quantize for {}'.format(quantizer_type)) + for name, submodule in model.named_modules(): + if isinstance(submodule, torch.quantization.FakeQuantizeBase): + if quantizer_type not in name: + logger.info('Disable observer and Disable quantize for {}'.format(name)) + submodule.disable_observer() + submodule.disable_fake_quant() + continue + logger.debug('Enable observer and Enable quant: {}'.format(name)) + submodule.enable_observer() + submodule.enable_fake_quant() + +def enable_quantization(model): # 启用所有的quantizer,但停用ob + logger.info('Disable observer and Enable quantize.') + for name, submodule in model.named_modules(): + if isinstance(submodule, torch.quantization.FakeQuantizeBase): + logger.debug('Disable observer and Enable quant: {}'.format(name)) + submodule.disable_observer() + submodule.enable_fake_quant() + + +def disable_all(model):# 停用所有的quantizer和ob + logger.info('Disable observer and Disable quantize.') + for name, submodule in model.named_modules(): + if isinstance(submodule, torch.quantization.FakeQuantizeBase): + logger.debug('Disable observer and Disable quantize: {}'.format(name)) + submodule.disable_observer() + submodule.disable_fake_quant() diff --git a/mqbench/utils/utils.py b/mqbench/utils/utils.py new file mode 100644 index 0000000..128280a --- /dev/null +++ b/mqbench/utils/utils.py @@ -0,0 +1,179 @@ +import copy + +import torch +import torch.fx +from torch.fx import GraphModule +from torch.nn import Module + +USE_LINK = False +USE_DDP = False + +try: + import spring.linklink as link + assert link.is_initialized() + USE_LINK = True +except (ModuleNotFoundError, AssertionError): + import torch.distributed as dist + if torch.distributed.is_initialized(): + USE_DDP = True + + +def sync_tensor(tensor): + global USE_LINK + global USE_DDP + if USE_LINK: + if tensor.is_cuda is True: + tensor.data = tensor.data / link.get_world_size() + link.allreduce(tensor.data) + elif USE_DDP: + tensor.data = tensor.data / dist.get_world_size() + dist.all_reduce(tensor.data) + return tensor + + +def pot_quantization(tensor: torch.Tensor, mode='round'): + log2t = torch.log2(tensor) + if mode == 'round': + log2t = (torch.round(log2t) - log2t).detach() + log2t + else: + assert mode == 'floor' + log2t = (torch.floor(log2t) - log2t).detach() + log2t + return 2 ** log2t + + + +def is_symmetric_quant(qscheme: 'torch.qscheme') -> bool: + return qscheme in [torch.per_tensor_symmetric, torch.per_channel_symmetric] + + +class no_jit_trace: + def __enter__(self): + # pylint: disable=protected-access + self.state = torch._C._get_tracing_state() + torch._C._set_tracing_state(None) + + def __exit__(self, *args): + torch._C._set_tracing_state(self.state) + self.state = None + + +def is_tracing_state(): + return torch._C._get_tracing_state() + + +def deepcopy_graphmodule(gm: GraphModule): + """Rewrite the deepcopy of GraphModule. (Copy its 'graph'.) + + Args: + gm (GraphModule): + + Returns: + GraphModule: A deepcopied gm. + """ + copied_gm = copy.deepcopy(gm) + copied_gm.graph = copy.deepcopy(gm.graph) + return copied_gm + + +def deepcopy_mixedmodule(mm: Module, module_list: list): + """Support for `module_list` which splits modules' nn part and post precess. + + Args: + mm (nn.Module) + module_list (list): the children of the mm who are a GraphModule. + + Returns: + nn.Module + """ + copied_mm = copy.deepcopy(mm) + for mname in module_list: + mod = getattr(mm, mname) + child_graph = copy.deepcopy(mod.graph) + copied_child = getattr(copied_mm, mname) + setattr(copied_child, 'graph', child_graph) + return copied_mm + + +def getitem2node(model: GraphModule) -> dict: + def _update_getitem_path(getitem_args_dict): + for node in getitem_args_dict: + args_list = getitem_args_dict[node] + while args_list[0] in getitem_args_dict: + args_list = getitem_args_dict[args_list[0]] + args_list[1:] + getitem_args_dict[node] = args_list + return getitem_args_dict + + def _getitem_from_args(args, original_args_dict): + ret = original_args_dict + for a in args: + try: + ret = ret[a] + except (IndexError, KeyError): + return {} + return ret + import operator + nodes = list(model.graph.nodes) + # the getitem's call graph + getitem_args_dict = {} + # the dict used in the model + original_key_dict = {} + getitem2node = {} + for node in nodes: # TODO 看到这 + # update the getitems + if node.target == operator.getitem: + getitem_args_dict[node] = list(node.args) + getitem_args_dict = _update_getitem_path(getitem_args_dict) + for _node in getitem_args_dict: + if _node in getitem2node: + continue + val = _getitem_from_args(getitem_args_dict[_node], original_key_dict) + if isinstance(val, torch.fx.node.Node): + getitem2node[_node] = val + elif node.target == 'update': + if node.args[0] not in original_key_dict: + original_key_dict[node.args[0]] = {} + if isinstance(node.args[1], dict): + original_key_dict[node.args[0]].update(node.args[1]) + elif isinstance(node.args[1], torch.fx.node.Node): + original_key_dict[node.args[0]].update(original_key_dict[node.args[1]]) + else: + raise ValueError('Wrong type for update') + + + return getitem2node + + +def _fix_succ_recursivly(args, target_node, inserted_node): + # List / Tuple + if isinstance(args, (list, tuple)): + _tmp = list(args) + for _i, _arg in enumerate(args): + if _arg == target_node: + _tmp[_i] = inserted_node + elif isinstance(_arg, tuple): + _tmp[_i] = _fix_succ_recursivly(_arg, target_node, inserted_node) + elif isinstance(_arg, list): + _tmp[_i] = list(_fix_succ_recursivly(_arg, target_node, inserted_node)) + elif isinstance(_arg, dict): + _tmp[_i] = _fix_succ_recursivly(_arg, target_node, inserted_node) + return tuple(_tmp) + # Dict + elif isinstance(args, dict): + _tmp = {} + for k, v in args.items(): + if v == target_node: + _tmp[k] = inserted_node + elif not isinstance(v, torch.fx.node.Node): + _tmp[k] = _fix_succ_recursivly(v, target_node, inserted_node) + else: + _tmp[k] = v + return _tmp + else: + raise NotImplementedError('{} can not be handled now.'.format(type(args))) + + +def topology_order(model): + node2idx = {} + for idx, node in enumerate(model.graph.nodes): + node2idx[node] = idx + return node2idx \ No newline at end of file diff --git a/mqbench/weight_equalization.py b/mqbench/weight_equalization.py new file mode 100644 index 0000000..2c4ee4a --- /dev/null +++ b/mqbench/weight_equalization.py @@ -0,0 +1,157 @@ +import torch +from torch.fx.graph_module import GraphModule +import torch.nn.intrinsic.qat as nniqat +import torch.nn.qat.modules.conv as qatconv +import torch.nn as nn + +from mqbench.utils.registry import register_weight_equalization_function, WEIGHT_EQUALIZATION_FUNCTION +from mqbench.fake_quantize.tqt import TqtFakeQuantize + +from mqbench.utils.logger import logger + +COLLECT_TYPES = [nniqat.ConvBnReLU2d, nniqat.ConvBn2d, qatconv.Conv2d] +ACT_TYPES = [nn.ReLU] +POOL_TYPES = [torch.nn.MaxPool2d, torch.nn.AdaptiveAvgPool2d, torch.nn.AvgPool2d] +MATH_TYPE = [type(len)] +ALL_OP_TYPE = COLLECT_TYPES + ACT_TYPES + POOL_TYPES + MATH_TYPE +FAKE_QUANT_TYPE = [TqtFakeQuantize] + + +@register_weight_equalization_function(qatconv.Conv2d, qatconv.Conv2d) +def weight_equalize_conv_pair(modules, weq_pair): + node1, node2 = tuple(weq_pair) + weight1 = modules[node1.target].weight.data.clone() + if modules[node1.target].bias is None: + bias1 = None + else: + bias1 = modules[node1.target].bias.data.clone() + weight2 = modules[node2.target].weight.data.clone() + weight1, bias1, weight2, s = dfq_weight_equalization(weight1, bias1, weight2) + modules[node1.target].weight.data, modules[node2.target].weight.data = weight1, weight2 + if bias1 is not None: + modules[node1.target].bias.data = bias1 + logger.info(f'Weight equalizing {node1.name} and {node2.name}.') + + +def _get_name2node(nodes): + name2node = {} + for node in nodes: + name2node[node.name] = node + return name2node + + +def _get_name2type(nodes, modules): + name2type = {} + for node in nodes: + if node.target in modules: + name2type[node.name] = type(modules[node.target]) + elif type(node.target) in MATH_TYPE: + name2type[node.name] = type(node.target) + else: + name2type[node.name] = None + return name2type + + +def _get_name2fanout(nodes, name2type): + name2fanout = {} + for node in nodes: + if name2type[node.name] in ALL_OP_TYPE: + cnt = 0 + node_users = list(node.users) + for u in node_users: + if name2type[u.name] in ALL_OP_TYPE: + cnt += 1 + elif name2type[u.name] in FAKE_QUANT_TYPE: + for f in u.users: + if name2type[f.name] in ALL_OP_TYPE: + cnt += 1 + name2fanout[node.name] = cnt + else: + name2fanout[node.name] = 0 + return name2fanout + + +def get_weight_equalization_groups(model: GraphModule, **kwargs): + nodes = list(model.graph.nodes) + modules = dict(model.named_modules()) + name2node = _get_name2node(nodes) + name2type = _get_name2type(nodes, modules) + name2fanout = _get_name2fanout(nodes, name2type) + input = [name2node[node_name] for node_name in kwargs['input_shape_dict']] + layer_groups = [] + for node in input: + collect_layer_group(node, modules, layer_groups, name2fanout) + print([[n.name for n in i] for i in layer_groups]) + convert_equalization_groups(modules, layer_groups, name2type) + + +def collect_layer_group(node, modules, groups, name2fanout, visited=None, group=None): + def _end_collect(grp): + if len(grp) > 1 and grp not in groups: + groups.append(grp) + return [] + + visited = [] if not visited else visited + group = [] if not group else group + + if node in visited: + return + visited.append(node) + + if node.target not in modules or type(modules[node.target]) in FAKE_QUANT_TYPE: + pass + elif type(modules[node.target]) in COLLECT_TYPES: + group.append(node) + if name2fanout[node.name] > 1: + group = _end_collect(group) + elif type(modules[node.target]) in POOL_TYPES: + if name2fanout[node.name] > 1: + group = _end_collect(group) + elif type(modules[node.target]) in ACT_TYPES: + if name2fanout[node.name] > 1: + group = _end_collect(group) + else: + group = _end_collect(group) + + for child in node.users: + collect_layer_group(child, modules, groups, name2fanout, visited, group) + _end_collect(group) + + +def convert_equalization_groups(modules, layer_groups, name2type): + eq_groups = [] + for grp in layer_groups: + assert len(grp) == 2, 'Multi-layers weight equalization not support.' + type_list = [name2type[x.name] for x in grp] + WEIGHT_EQUALIZATION_FUNCTION[type_list[0]][type_list[1]](modules, grp) + + +def dfq_weight_equalization(weight_1, bias_1, weight_2, s_min=1e-6, s_max=1e6, eps=0): + groups = weight_1.shape[0] // weight_2.shape[1] + w1_ch, w2_ch = weight_1.shape[0] // groups, weight_2.shape[1] // groups + scale = torch.zeros([weight_1.shape[0]]) + for grp in range(groups): + w1_ch_start, w1_ch_end = w1_ch * grp, w1_ch * (grp + 1) + w2_ch_start, w2_ch_end = w2_ch * grp, w2_ch * (grp + 1) + w1_ch_part = weight_1[w1_ch_start:w1_ch_end] + w2_ch_part = weight_2[w2_ch_start:w2_ch_end] + + w1_dims = (1, 2, 3) if len(weight_1.shape) == 4 else (1) + w2_dims = (0, 2, 3) if len(weight_2.shape) == 4 else (0) + w1_range = w1_ch_part.abs().amax(dim=w1_dims) + w2_range = w2_ch_part.abs().amax(dim=w2_dims) + assert w1_range.shape == w2_range.shape, "The equalization pair's weight shape does not match!" + s = (w1_range * w2_range + eps).sqrt() / (w2_range + eps) + s = torch.clip(s, s_min, s_max) + s = torch.where((w1_range + w2_range) < 0.5, torch.ones_like(s), s) + scale[w1_ch_start:w1_ch_end] = s + if bias_1 is not None: + bias_1[w1_ch_start:w1_ch_end].mul_(1 / s) + w1s_shape = [1] * len(weight_1.shape) + w1s_shape[0] = -1 + weight_1[w1_ch_start:w1_ch_end].mul_(1 / s.reshape(w1s_shape)) + w2s_shape = [1] * len(weight_2.shape) + w2s_shape[1] = -1 + weight_2[:, w2_ch_start:w2_ch_end].mul_(s.reshape(w2s_shape)) + + return weight_1, bias_1, weight_2, scale diff --git a/my_equation.py b/my_equation.py new file mode 100644 index 0000000..54100ee --- /dev/null +++ b/my_equation.py @@ -0,0 +1,389 @@ +import torch +import torch.nn.functional as F +import global_placeholder +import numpy as np +import math +# def amplification_function(values): +# return values ** 2 + 1 + +# def my_equation_add_contrast_loss(reg_loss, conf_values, pos_conf_values, ious, pos_mask): + +# conf_greater_iou_flag = pos_conf_values > ious +# iou_greater_conf_flag = pos_conf_values < ious +# contrast_values = torch.zeros_like(ious) +# zeros = torch.zeros_like(ious) +# contrast_values[conf_greater_iou_flag] = (pos_conf_values.detach() - ious)[conf_greater_iou_flag] # 说明要拉iou # 0.4942 0.7875 +# contrast_values[iou_greater_conf_flag] = (ious.detach() - pos_conf_values)[iou_greater_conf_flag] # 说明要拉conf + + +# #!! cls的话,要是有Conf大于IOU的情况,也不会去拉低Conf。 或者说,还是得拉低Conf??? +# # loss = (1 + 0.15 * torch.unsqueeze(torch.square(maximum * delta), dim=1)) * loss # TODO 还有一个情况就是,数据分布也是imbalance 就应该是更关注高值情况下的差异 + + +# #!! cls的话,要是有Conf大于IOU的情况,也不会去拉低Conf。 或者说,还是得拉低Conf??? +# # loss = (1 + 0.15 * torch.unsqueeze(torch.square(maximum * delta), dim=1)) * loss # TODO 还有一个情况就是,数据分布也是imbalance 就应该是更关注高值情况下的差异 + +# maximum = torch.max(pos_conf_values, ious) + +# # contrast_values = torch.abs(pos_conf_values - ious) # 0.48974 0.78683 拉 +# margin = 0.2 +# # reg_loss = reg_loss + torch.max(zeros, contrast_values - margin) # 泰拉了 +# # reg_loss = reg_loss + contrast_values # 0.4907 0.7888 +# # reg_loss = reg_loss + torch.sin(contrast_values * 3.1415926 / 2) ** 3 # 0.4901 0.7882 +# # reg_loss = reg_loss + torch.sin(contrast_values * 3.1415926 / 2) # 0.4942 0.7875 就这个 +# reg_loss = reg_loss + torch.sin(contrast_values * 3.1415926 / 2) * pos_mask.float() +# # reg_loss = reg_loss + info_factor * torch.sin(contrast_values * 3.1415926 / 2) * pos_mask.float() +# # reg_loss = reg_loss + info_factor * contrast_values * pos_mask.float() + +# # reg_loss = reg_loss + maximum * contrast_values # + +# return reg_loss + + +def my_equation_add_task_contrast_loss(reg_loss, conf_values, pos_conf_values, ious, pos_mask): + + margin = 0.2 + zeros = torch.zeros_like(ious) + distance = torch.abs(pos_conf_values - ious) + # 原文写法 + # delta = torch.max(zeros, distance - margin) + # 原码写法 + delta = torch.where(distance < 0.2, zeros, distance) + information_entropy = - conf_values * conf_values.log() # e为底 + beta = torch.exp(information_entropy.sum(dim=1)) + + reg_loss = reg_loss + (1 / (1 + beta)) * delta * pos_mask.float() + + return reg_loss + + + +# def my_equation_similarity_loss(kl_loss, pos_conf_values, ious, pos_mask): # JS散度 +# batch_distribution_losses = [] +# for conf, iou, mask in zip(pos_conf_values, ious, pos_mask): # 这是多batch情况 + +# # softmax_pos_conf_values = F.softmax(pos_conf_values[it, pos_mask[it]], dim=0) # 化为概率分布 dim 表示batch之间不影响 +# # softmax_ious = F.softmax(ious[it, pos_mask[it]], dim=0) + +# conf = conf[mask] +# iou = iou[mask] +# elem_num = conf.numel() +# similarity_loss = 1 - (conf * iou).mean() +# # similarity_loss = F.pairwise_distance(conf, iou, dim=-1) +# # cosine_loss = 1 - F.cosine_similarity(pos_conf_values[it, pos_mask[it]], ious[it, pos_mask[it]], dim=0) + + +# # means = (softmax_pos_conf_values + softmax_ious) / 2 +# # distribution_loss = 0.5 * kl_loss(means.log(), softmax_pos_conf_values) + 0.5 * kl_loss(means.log(), softmax_ious) # P、Q 指代target和input +# batch_distribution_losses.append(similarity_loss) +# # p || q +# # target || input +# return sum(batch_distribution_losses) / len(batch_distribution_losses) # NOTE 不平均是 0.4944 0.7929 不应该平均,就是每张图片都有自己的loss!注意后期实现 + +# def my_equation_js_loss(kl_loss, pos_conf_values, ious, pos_mask): # JS散度 + +# batch_distribution_losses = [] +# for it in range(pos_conf_values.size()[0]): + +# softmax_pos_conf_values = F.softmax(pos_conf_values[it, pos_mask[it]], dim=0) # 化为概率分布 dim 表示batch之间不影响 +# softmax_ious = F.softmax(ious[it, pos_mask[it]], dim=0) + +# means = (softmax_pos_conf_values + softmax_ious) / 2 +# distribution_loss = 0.5 * kl_loss(means.log(), softmax_pos_conf_values) + 0.5 * kl_loss(means.log(), softmax_ious) # P、Q 指代target和input +# batch_distribution_losses.append(distribution_loss.sum()) +# # p || q +# # target || input +# return sum(batch_distribution_losses) # NOTE 不平均是 0.4944 0.7929 不应该平均,就是每张图片都有自己的loss!注意后期实现 +# return 0 + +# def my_equation_add_correlation_loss(reg_loss, conf_values, pos_conf_values, ious, pos_mask): # TODO 注意一个问题,新算出来的loss代表的是全集!还得筛选一次正样本 + +# # correlation = pos_conf_values * ious + 0.00001 +# # correlation_loss = - correlation * torch.log10(correlation) - (1 - correlation) * torch.log10((1 - correlation)) # 二项分布信息熵,0.4931 0.7859 +# # correlation_loss = 0.5 * (- correlation * torch.log10(correlation) - (1 - correlation) * torch.log10((1 - correlation))) # 二项分布信息熵, +# # correlation_loss = (- correlation * torch.log2(correlation) - (1 - correlation) * torch.log2((1 - correlation))) # 二项分布信息熵,拉 + + +# info_entropys = (- conf_values * conf_values.log()).sum(dim=1).exp() +# info_factor = 1 / (info_entropys) # 牛 +# # info_factor = 1.2 / (info_entropys) # 这里的常量可以去调一调 拉 +# # info_factor = 0.8 / (info_entropys) # 这里的常量可以去调一调 拉 + +# minimum = torch.min(pos_conf_values, ious) +# maximum = torch.max(pos_conf_values, ious) + +# correlation = pos_conf_values * ious +# # correlation_loss = 1 - correlation # 还行 + +# correlation_loss = info_factor * (1 - correlation) # 还行 + +# # correlation_loss = (1 - maximum)(1 - correlation) # +# # correlation_loss = torch.cos(correlation * 3.1415926 / 2) +# reg_loss = reg_loss + correlation_loss * pos_mask.float() +# return reg_loss + +def my_equation_add_correlation_loss(reg_loss, cls_branch_factor, reg_branch_factor, conf_values, pos_conf_values, ious, mask): # TODO 注意一个问题,新算出来的loss代表的是全集!还得筛选一次正样本 + + # correlation = pos_conf_values * ious + 0.00001 + # correlation_loss = - correlation * torch.log10(correlation) - (1 - correlation) * torch.log10((1 - correlation)) # 二项分布信息熵,0.4931 0.7859 + # correlation_loss = 0.5 * (- correlation * torch.log10(correlation) - (1 - correlation) * torch.log10((1 - correlation))) # 二项分布信息熵, + # correlation_loss = (- correlation * torch.log2(correlation) - (1 - correlation) * torch.log2((1 - correlation))) # 二项分布信息熵,拉 + + # info_factor = 1.2 / (info_entropys) # 这里的常量可以去调一调 拉 + # info_factor = 0.8 / (info_entropys) # 这里的常量可以去调一调 拉 + + # minimum = torch.min(pos_conf_values, ious) + # maximum = torch.max(pos_conf_values, ious) + + # correlation = torch.pow(pos_conf_values, cls_trade_off) * torch.pow(ious, reg_trade_off) + eps = 2.220446049250313e-16# -10貌似可以,但是我狠一点 + # correlation = torch.pow(pos_conf_values+eps, 0.5) * torch.pow(ious+eps, 0.5) - eps + correlation = torch.pow(pos_conf_values+eps, ious) * torch.pow(ious+eps, pos_conf_values) - eps + # correlation = torch.pow(pos_conf_values+eps, ious.detach()) * torch.pow(ious+eps, pos_conf_values.detach()) - eps # 这真不行 + # correlation = torch.pow(pos_conf_values * ious * matched_obj+eps, 1/3) - eps ** 1/3 # 还是不该加这个 + + + + # correlation = torch.pow(pos_conf_values, 0.5) * torch.pow(ious, 0.5) + # correlation = torch.pow(pos_conf_values, 0.5) * ious # 这个就没事 + # correlation = pos_conf_values * torch.pow(ious, 0.5) # 但是还是nan + # correlation = (pos_conf_values ** 0.5) * (ious ** 0.5) 一样 + # correlation = pos_conf_values * ious + + # correlation = pos_conf_values * ious # + # correlation_loss =(1 - correlation) ** 2 + # correlation_loss = torch.exp(-correlation) - torch.exp(-torch.tensor(1.)) # 实在不行,再加一个cls entropy,只对置信度大的进行处理。 + correlation_loss = (1 + torch.abs(pos_conf_values-ious).detach())*(torch.exp(-correlation) - torch.exp(-torch.tensor(1.))) # 实在不行,再加一个cls entropy,只对置信度大的进行处理。 + + + + # correlation_loss = 1.6 * (torch.exp(-correlation) - torch.exp(-torch.tensor(1.))) # 实在不行,再加一个cls entropy,只对置信度大的进行处理。 + # correlation_loss = (1 - correlation) * ((1 + correlation) ** 0.8) # 确实这种设计相比于1-iou有用 + + # correlation_loss = info_factor * (1 - correlation) # 还行 + + # correlation_loss = (1 - maximum)(1 - correlation) # + # correlation_loss = torch.cos(correlation * 3.1415926 / 2) + # information_entropy = - conf_values * conf_values.log() # e为底 + # beta = torch.exp(information_entropy.sum(dim=1)).detach() # 所以这个玩意就应该detach + # reg_loss = reg_loss + (1 + 1 / (beta)) * correlation_loss * pos_mask.float() # 所以应不应该有+1呢 + + reg_loss = reg_loss + correlation_loss * mask.float() + return reg_loss + + +def my_equation_add_entropy_iou_loss(reg_loss, conf_values, pos_conf_values, ious, pos_mask): # 轻微提点,但是实际效果就是,TP抬高了,但是TP量反而少了 + + beta = 1.2 + alpha = 1.5 + gamma = 0.8 + # iou_loss = alpha * (1 - ious) * ((1 + ious) ** gamma) # 确实这种设计相比于1-iou有用 + # iou_loss = alpha * (1 - ious) + # iou_loss = 1 - ious + eps_ious = ious + 0.000001 + iou_loss = - eps_ious * torch.log2(eps_ious) - (1 - eps_ious) * torch.log2((1 - eps_ious)) # 1# 0.4856 0.7770- NOTE 信息熵这个的底,可以做一个消融实验 + # iou_loss = - eps_ious * torch.log(eps_ious) - (1 - eps_ious) * torch.log((1 - eps_ious)) # 烂 + + + + reg_loss = reg_loss + iou_loss * pos_mask.float() + return reg_loss + +# def my_equation_add_gtcls_loss(cls_loss, conf_values, pos_conf_values, ious, pos_mask): # 轻微提点,但是实际效果就是,TP抬高了,但是TP量反而少了 + +# # beta = 1.2 +# # alpha = 1.5 +# # gamma = 0.8 +# eps = 1e-10 +# epsp_pos_conf_values = pos_conf_values + eps +# epsm_pos_conf_values = pos_conf_values - eps + +# gtcls_loss = - epsp_pos_conf_values * torch.log(epsp_pos_conf_values) - (1 - epsm_pos_conf_values) * torch.log((1 - epsm_pos_conf_values)) # cls_3 +# # gtcls_loss = 1 - pos_conf_values # cls_1 + +# # gtcls_loss = 0.5 * (1 - pos_conf_values) ** 2 # cls_2 +# cls_loss = cls_loss + gtcls_loss * pos_mask.float() +# return cls_loss + + +def my_equation_add_harmonic_iou_loss(reg_loss, conf_values, pos_conf_values, ious, pos_mask): # 轻微提点,但是实际效果就是,TP抬高了,但是TP量反而少了 + + beta = 1.2 + alpha = 1.5 + gamma = 0.8 + iou_loss = alpha * (1 - ious) * ((1 + ious) ** gamma) # 确实这种设计相比于1-iou有用 + + reg_loss = reg_loss + iou_loss + return reg_loss + + +def my_equation_add_harmonic_conf_loss(cls_loss, conf_values, pos_conf_values, pos_gtconf_values, pos_mask): # 轻微提点,但是实际效果就是,TP抬高了,但是TP量反而少了 + + beta = 1.2 + alpha = 1.5 + gamma = 0.8 + conf_loss = alpha * (1 - pos_gtconf_values) * ((1 + pos_gtconf_values) ** gamma) + + cls_loss = cls_loss + conf_loss * pos_mask.float() + return cls_loss + +def HarDet_loss(pos_reg_loss, pos_cls_loss, conf_values, pos_gtconf_values, pos_conf_values, matched_iou_vals, pos_mask): + pos_reg_loss = my_equation_add_harmonic_iou_loss(pos_reg_loss, None, None, matched_iou_vals, pos_mask) + pos_reg_loss = (1 + torch.exp( - pos_cls_loss)) * pos_reg_loss * pos_mask.float() # 0.4856 0.7770- + pos_cls_loss = (1 + torch.exp( - pos_reg_loss)) * pos_cls_loss * pos_mask.float() + pos_reg_loss = my_equation_add_task_contrast_loss(pos_reg_loss, conf_values, pos_gtconf_values, matched_iou_vals, pos_mask) + return pos_reg_loss, pos_cls_loss + +def HQOD_loss(pos_reg_loss, pos_cls_loss, conf_values, pos_gtconf_values, pos_conf_values, matched_iou_vals, cls_branch_factor, reg_branch_factor, mask): # 以前那个真不行,就是a/(b+1) + # pos_reg_loss = my_equation_add_harmonic_iou_loss(pos_reg_loss, None, None, matched_iou_vals, pos_mask) + # pos_reg_loss = (1 + pos_gtconf_values) * pos_reg_loss * pos_mask.float() # 0.4856 0.7770- + # pos_cls_loss = (1 + matched_iou_vals) * pos_cls_loss * pos_mask.float() + # pos_reg_loss = torch.exp( 1 - matched_iou_vals) * pos_reg_loss * pos_mask.float() # 0.4856 0.7770- + # pos_cls_loss = torch.exp( 1 - pos_gtconf_values) * pos_cls_loss * pos_mask.float() + # pos_reg_loss = my_equation_add_task_contrast_loss(pos_reg_loss, conf_values, pos_gtconf_values, matched_iou_vals, pos_mask) + + pos_reg_loss = my_equation_add_harmonic_iou_loss(pos_reg_loss, None, None, matched_iou_vals, mask) + # pos_cls_loss = my_equation_add_harmonic_conf_loss(pos_cls_loss, conf_values, pos_conf_values, pos_gtconf_values, pos_mask) + pos_reg_loss = my_equation_add_correlation_loss(pos_reg_loss, cls_branch_factor, reg_branch_factor, conf_values, pos_gtconf_values, matched_iou_vals, mask) + + return pos_reg_loss, pos_cls_loss + +# def HQOD_loss(pos_reg_loss, pos_cls_loss, conf_values, pos_gtconf_values, pos_conf_values, matched_iou_vals, pos_mask): +# # pos_reg_loss = (1 + pos_gtconf_values) * (1 + pos_conf_values ** 1.7) * pos_reg_loss * pos_mask.float() # 0.4895 -0.7779? +# # pos_cls_loss = (1 + matched_iou_vals ** 1.7) * pos_cls_loss * pos_mask.float() # + +# # pos_reg_loss = ((1 + pos_gtconf_values) * (1 + pos_conf_values)).sqrt() * pos_reg_loss * pos_mask.float() # 好 1 +# # pos_cls_loss = (1 + matched_iou_vals) * pos_cls_loss * pos_mask.float() # +# # pos_reg_loss = my_equation_add_entropy_iou_loss(pos_reg_loss, None, None, matched_iou_vals, pos_mask) + +# # pos_reg_loss = (1 + pos_conf_values) * pos_reg_loss * pos_mask.float() # 这一个真不行 +# # pos_reg_loss = my_equation_add_harmonic_iou_loss(pos_reg_loss, None, None, matched_iou_vals, pos_mask) + +# pos_reg_loss = (1 + pos_gtconf_values) * pos_reg_loss * pos_mask.float() # 好 2 +# pos_cls_loss = (1 + matched_iou_vals) * pos_cls_loss * pos_mask.float() # +# # pos_reg_loss = (1 + pos_gtconf_values ** 1.7) * pos_reg_loss * pos_mask.float() # 差 +# # pos_cls_loss = (1 + matched_iou_vals ** 1.7) * pos_cls_loss * pos_mask.float() # +# # pos_reg_loss = (1 + pos_conf_values) * pos_reg_loss * pos_mask.float() # 差 +# # pos_cls_loss = (1 + matched_iou_vals) * pos_cls_loss * pos_mask.float() # +# # pos_reg_loss = ((1 + pos_gtconf_values) * (1 + pos_conf_values)) * pos_reg_loss * pos_mask.float() # 差 +# # pos_cls_loss = (1 + matched_iou_vals) ** 2 * pos_cls_loss * pos_mask.float() # +# # pos_reg_loss = (1 + pos_conf_values * pos_gtconf_values) * pos_reg_loss * pos_mask.float() # 差 +# # pos_cls_loss = (1 + matched_iou_vals) * pos_cls_loss * pos_mask.float() # +# pos_reg_loss = my_equation_add_entropy_iou_loss(pos_reg_loss, None, None, matched_iou_vals, pos_mask) + +# # pos_reg_loss = my_equation_add_correlation_loss(pos_reg_loss, pos_conf_values, matched_iou_vals, pos_mask) # 不要 +# # pos_reg_loss = my_equation_add_harmonic_iou_loss(pos_reg_loss, None, None, matched_iou_vals, pos_mask) +# # pos_reg_loss = my_equation_add_iou_loss(pos_reg_loss, None, None, matched_iou_vals, pos_mask) +# # pos_reg_loss = my_equation_add_task_contrast_loss(pos_reg_loss, conf_values, pos_gtconf_values, matched_iou_vals, pos_mask) + +# return pos_reg_loss, pos_cls_loss + +# def my_equation_add_correlation_loss(reg_loss, pos_conf_values, ious, pos_mask): # TODO 注意一个问题,新算出来的loss代表的是全集!还得筛选一次正样本 +# correlation = pos_conf_values * ious + 0.000001 +# correlation_loss = - correlation * torch.log10(correlation) - (1 - correlation) * torch.log10((1 - correlation)) # 二项分布信息熵,0.4931 0.7859 +# # correlation_loss = 0.5 * (- correlation * torch.log10(correlation) - (1 - correlation) * torch.log10((1 - correlation))) # 二项分布信息熵, +# # correlation_loss = (- correlation * torch.log2(correlation) - (1 - correlation) * torch.log2((1 - correlation))) # 二项分布信息熵,拉 +# # correlation_loss = 1 - correlation # 拉了 +# reg_loss = reg_loss + correlation_loss * pos_mask.float() +# return reg_loss +# def my_equation_add_intensive_iou_loss(reg_loss, iou): +# reg_loss = reg_loss + (1 - iou) +# return reg_loss + +# def my_equation_add_kl_between_loss(reg_loss, ) + + + +# def my_equation_for_cls(amp_values, delta, loss): # IOU拉Conf +# # loss = (1 + 0.5 * torch.unsqueeze(maximum * delta, dim=1)) * loss # TODO 还有一个情况就是,数据分布也是imbalance +# # loss = (1 + 0.8 * torch.unsqueeze(torch.square(maximum) * delta, dim=1)) * loss # TODO 还有一个情况就是,数据分布也是imbalance 就应该是更关注高值情况下的差异 +# # loss = (1 + 0.8 * torch.unsqueeze(maximum * torch.square(delta), dim=1)) * loss # TODO 还有一个情况就是,数据分布也是imbalance 就应该是更关注高值情况下的差异 + +# #!! cls的话,要是有Conf大于IOU的情况,也不会去拉低Conf。 或者说,还是得拉低Conf??? +# # loss = (1 + 0.15 * torch.unsqueeze(torch.square(maximum * delta), dim=1)) * loss # TODO 还有一个情况就是,数据分布也是imbalance 就应该是更关注高值情况下的差异 + +# # temp_weight = torch.square(maximum * delta) +# # temp_weight = maximum * delta # 不行 +# # temp_weight = 0.5 * delta + +# qbit = global_placeholder.quant_bit +# if qbit == None: qbit = 8 # 避免fp32时 +# qbit = float(qbit) +# # amp_values = amplification_function(amp_values) +# # temp_weight = (qbit / 8)**2 * delta + +# # temp_weight = (qbit / 8)**2 * torch.sin(delta * 3.1415926 / 2) + +# # temp_weight = (qbit / 8)**2 * amp_values * torch.sin(delta * 3.1415926 / 2) +# temp_weight = delta # +# # temp_weight = torch.sin(delta * 3.1415926 / 2) # 目前最优 +# if temp_weight.shape != loss.shape: +# # 如果有问题的话 +# temp_weight = torch.unsqueeze(temp_weight, dim=1) +# loss = (1 + temp_weight) * loss # TODO 还有一个情况就是,数据分布也是imbalance 就应该是更关注高值情况下的差异 +# # loss = (loss + 1) ** (1 + temp_weight) - 1 + +# # 回归的话,Conf带不了他 +# return loss + +# def my_equation_for_reg(amp_values, delta, loss): # Conf拉IOU +# # loss = (1 + 0.5 * torch.unsqueeze(maximum * delta, dim=1)) * loss # TODO 还有一个情况就是,数据分布也是imbalance +# # loss = (1 + 0.8 * torch.unsqueeze(torch.square(maximum) * delta, dim=1)) * loss # TODO 还有一个情况就是,数据分布也是imbalance 就应该是更关注高值情况下的差异 +# # loss = (1 + 0.8 * torch.unsqueeze(maximum * torch.square(delta), dim=1)) * loss # TODO 还有一个情况就是,数据分布也是imbalance 就应该是更关注高值情况下的差异 + +# # !! cls的话,要是有Conf大于IOU的情况,也不会去拉低Conf。 或者说,还是得拉低Conf??? +# # loss = (1 + 0.8 * torch.unsqueeze(torch.square(maximum * delta), dim=1)) * loss # TODO 还有一个情况就是,数据分布也是imbalance 就应该是更关注高值情况下的差异 + +# # temp_weight = torch.square(maximum * delta) +# # temp_weight = maximum * delta +# # temp_weight = 0.5 * delta + +# qbit = global_placeholder.quant_bit +# if qbit == None: qbit = 8 # 避免fp32时 +# qbit = float(qbit) +# # amp_values = amplification_function(amp_values) +# # temp_weight = (qbit / 8)**2 * delta + +# # temp_weight = (qbit / 8)**2 * torch.sin(delta * 3.1415926 / 2) # sin^2? + +# # temp_weight = (qbit / 8)**2 * amp_values * torch.sin(delta * 3.1415926 / 2) +# temp_weight = delta # +# # temp_weight = torch.sin(delta * 3.1415926 / 2) # 目前最优 +# if temp_weight.shape != loss.shape: +# # 如果有问题的话 +# temp_weight = torch.unsqueeze(temp_weight, dim=1) +# loss = (1 + temp_weight) * loss # TODO 还有一个情况就是,数据分布也是imbalance 就应该是更关注高值情况下的差异 +# # loss = (loss + 1) ** (1 + temp_weight) - 1 +# # 回归的话,Conf带不了他 +# return loss + + + +# def my_equation_for_cls(amp_values, delta, loss): # IOU拉Conf + +# qbit = global_placeholder.quant_bit +# if qbit == None: qbit = 8 # 避免fp32时 +# qbit = float(qbit) +# temp_weight = delta # +# if temp_weight.shape != loss.shape: +# # 如果有问题的话 +# temp_weight = torch.unsqueeze(temp_weight, dim=1) +# loss = (1 + temp_weight) * loss # TODO 还有一个情况就是,数据分布也是imbalance 就应该是更关注高值情况下的差异 + +# # 回归的话,Conf带不了他 +# return loss + +# def my_equation_for_reg(amp_values, delta, loss): # Conf拉IOU + +# qbit = global_placeholder.quant_bit +# if qbit == None: qbit = 8 # 避免fp32时 +# qbit = float(qbit) +# temp_weight = delta # +# if temp_weight.shape != loss.shape: +# # 如果有问题的话 +# temp_weight = torch.unsqueeze(temp_weight, dim=1) +# loss = (1 + temp_weight) * loss # TODO 还有一个情况就是,数据分布也是imbalance 就应该是更关注高值情况下的差异 +# return loss + + +# def harmonic_loss(loss) \ No newline at end of file diff --git a/plot_curve.py b/plot_curve.py new file mode 100644 index 0000000..ec772a5 --- /dev/null +++ b/plot_curve.py @@ -0,0 +1,914 @@ +import datetime +import matplotlib.pyplot as plt +import json +import os +import numpy as np +import scipy.stats as sci +import pandas as pd +import matplotlib.image as mpimg +import mmcv + + +def save_distribution(data, title, pedge=1.1, hlim=0.02): + plt.figure() + number = data.size + edge = np.linspace(-pedge, pedge, 160) + bins = [0] * (len(edge) - 1) + for i in range(len(edge) - 1): + total = np.sum(np.array(edge[i] < data) == np.array(data < edge[i + 1])) + bins[i] = total + + bins = np.array(bins) / number # 做一个归一化 + + plt.stem(edge[:-1], bins, markerfmt='C3.') # 不能直接用hist,因为hist的区间是动态的!(最小刻度会变,很傻吊) + plt.title(title) + plt.xlim(-1.1 * pedge, 1.1 * pedge) + plt.ylim(0, hlim) + plt.grid() + + plt.savefig('y_data_fig/{}.jpg'.format(title)) + plt.close() + + +def plot_loss_and_lr(train_loss, learning_rate, output_dir): + try: + x = list(range(len(train_loss))) + fig, ax1 = plt.subplots(1, 1) + ax1.plot(x, train_loss, 'r', label='loss') + ax1.set_xlabel("step") + ax1.set_ylabel("loss") + ax1.set_title("Train Loss and lr") + plt.legend(loc='best') + + ax2 = ax1.twinx() + ax2.plot(x, learning_rate, label='lr') + ax2.set_ylabel("learning rate") + ax2.set_xlim(0, len(train_loss)) # 设置横坐标整数间隔 + plt.legend(loc='best') + + handles1, labels1 = ax1.get_legend_handles_labels() + handles2, labels2 = ax2.get_legend_handles_labels() + plt.legend(handles1 + handles2, labels1 + labels2, loc='upper right') + + fig.subplots_adjust(right=0.8) # 防止出现保存图片显示不全的情况 + fig.savefig('{}/loss_and_lr{}.png'.format(output_dir, datetime.datetime.now().strftime("%Y%m%d-%H%M%S"))) + plt.close() + print("successful save loss curve! ") + except Exception as e: + print(e) + + +def plot_map(mAP, output_dir): + try: + x = list(range(len(mAP))) + plt.plot(x, mAP, label='mAp') + plt.xlabel('epoch') + plt.ylabel('mAP') + plt.title('Eval mAP') + plt.xlim(0, len(mAP)) + plt.legend(loc='best') + plt.savefig('{}/mAP.png'.format(output_dir)) + plt.close() + print("successful save mAP curve!") + except Exception as e: + print(e) + +def generate_axis(rows,cols): + return [(row,col) for row in range(rows) for col in range(cols)] + +def plot_ious_and_confi_per_class(tp_special_data, classes_list): + det_labels = tp_special_data[:,0].astype(np.int16) + num_classes = len(classes_list) + label_statistics = [[] for i in range(num_classes)] + + for it, label in enumerate(det_labels): + label_statistics[label].append(tp_special_data[it,1:]) # score IOU + + plt.figure(figsize=(20,6)) + plt.subplots_adjust(left=0.05,bottom=None,right=0.95,top=None,wspace=.55,hspace=.35) # 设置子图间距 + + for it, statistics in enumerate(label_statistics): + statistics = np.array(statistics) + statistics[:, 1] = iou_remap(statistics[:, 1]) # IOU数据 重新缩放 + + plt.subplot(2,10,it+1) + plt.title(f"{classes_list[it]}") + plt.boxplot(statistics) + plt.grid() # 生成网格 + + title_font = {'weight': 'bold', 'size': 18} + plt.suptitle('Score and IOU in TP',fontdict=title_font) + + # plt.show() + # plt.savefig("/workspace/code/Quant/MQBench/test/test_img/fp32.png") + plt.savefig("/workspace/code/Quant/MQBench/test/test_img/w3a3.png") + # plt.savefig("/workspace/code/Quant/MQBench/test/test_img/w4a4.png") + plt.close() + +def loop_plot_ious_and_confi_per_class(loop_data, classes_list, x_script): + differ = 0.6 # 用来偏移画图的 + loop_label_statistics = [] + num_classes = len(classes_list) + for tp_special_data in loop_data: + det_labels = tp_special_data[:,0].astype(np.int16) + label_statistics = [[] for i in range(num_classes)] + + for it, label in enumerate(det_labels): + label_statistics[label].append(tp_special_data[it,1:]) # score IOU + loop_label_statistics.append(label_statistics) + + plt.figure(figsize=(36,15)) + plt.subplots_adjust(left=0.04,bottom=0.10,right=0.96,top=0.90,wspace=.15,hspace=.3) # 设置子图间距 + + for it in range(num_classes): # 画20张子图 + all_position = [] + + plt.subplot(4,5,it+1) + plt.title(f"{classes_list[it]}", fontsize=22) + for idx, label_statistics in enumerate(loop_label_statistics): # 遍历文件数据 + statistics = label_statistics[it] # 引出对应类下的 socre数据或IOU数据 + statistics = np.array(statistics) + statistics[:, 1] = iou_remap(statistics[:, 1]) # IOU数据 重新缩放 + # confidence 或 IOU重新排序,只取前K个结果 + topk = 200 + confi_data = np.sort(statistics[:, 0])[-topk:] + iou_data = np.sort(statistics[:, 1])[-topk:] + + positions = [1+idx*differ, 5.4+idx*differ] + all_position.extend(positions) + plt.boxplot([confi_data, iou_data], positions=positions) + + # 接下来着手处理x坐标信息 + axis_names = x_script*2 + all_position.sort() + plt.xticks(ticks=all_position, #设置要显示的x轴刻度,若指定空列表则去掉x轴刻度 + # , + labels=axis_names,#设置x轴刻度显示的文字,要与ticks对应 + fontsize=12, #设置刻度字体大小 + rotation=0, #设置刻度文字旋转角度 + ha='center', va='center', #刻度文字对齐方式,当rotation_mode为’anchor'时,对齐方式决定了文字旋转的中心。ha也可以写成horizontalalignment,va也可以写成verticalalignment。 + ) + plt.xlabel(f"Score Statistical Results{' '*30}IOU Statistical Results") + + plt.grid() # 生成网格 + + plt.suptitle('Score and IOU in TP',fontsize=28) + + # plt.show() + plt.savefig("/workspace/code/Quant/MQBench/test/test_img/BOX-fp32-8-6-5-4-3.png") + plt.close() + +def plot_ious_and_confi(tp_special_data, classes_list, target_dir): + det_labels = tp_special_data[:,0].astype(np.int16) # label score IOU + tp_special_data[:, 2] = iou_remap(tp_special_data[:, 2]) # IOU数据 重新缩放 + + plt.figure(figsize=(12,4)) + plt.boxplot(tp_special_data[:,1:]) + plt.grid() # 生成网 + title_font = {'weight': 'bold', 'size': 14} + plt.title('Score and IOU in TP, summarization',fontdict=title_font) + # plt.show() + # plt.savefig("/workspace/code/Quant/MQBench/test/test_img/fp32_summarization.png") + # plt.savefig("/workspace/code/Quant/MQBench/test/test_img/w4a4_summarization.png") + plt.savefig(f"/workspace/code/Quant/MQBench/test/test_img/{target_dir}/w3a3_summarization.png") + plt.close() + +def statistics_by_percentage_bin(loop_data, classes_list, x_script, target_dir): + # mode = 'iou' # iou > 0.9 下的讨论 这图也好看 + mode = 'cls' # cls > 0.9 下的讨论 # 这图好看 + fig = plt.figure(figsize=(12,8)) + # plt.subplots_adjust(left=0.08,bottom=0.10,right=0.9,top=0.92,wspace=.2,hspace=.2) # 设置子图间距 + title_font = {'weight': 'bold', 'size': 22} + label_font = {'weight': 'bold', 'size': 16} + suptitle_font = {'weight': 'bold', 'size': 40} + + loop_number = len(loop_data) + + if mode == 'iou': + bin_number = 10 + edge = np.linspace(0., 1.0, bin_number + 1) + elif mode == 'cls': + # bin_number = 6 + # edge = np.array([0., 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]) + bin_number = 5 + edge = np.linspace(0.5, 1.0, bin_number + 1) + else: + raise NotImplementedError + + edge = np.round(edge, decimals=3) + + bins = np.zeros(bin_number) + bar_width = 0.16 + mid_position = np.linspace(1, bin_number, bin_number) * 0.75 + base_position = mid_position - bar_width * (loop_number - 1) / 2 + x_show = [] + for i in range(bin_number): + x_show.append(f'[{edge[i]}, {edge[i+1]}]') + + for idx, tp_special_data in enumerate(loop_data): # 循环绘制每一个数据文件 + position = base_position + idx * bar_width + + confi_data = tp_special_data[:, 0] + iou_data = tp_special_data[:, 1] + if mode == 'iou': + percent9_data = iou_data + slicing_data = confi_data + elif mode == 'cls': + percent9_data = confi_data + slicing_data = iou_data + else: + raise NotImplementedError + + # det_labels = tp_special_data[:,0].astype(np.int16) # label score IOU + percentage = 0.9 + focused_percent9_data = percent9_data[percent9_data > percentage] + focused_slicing_data = slicing_data[percent9_data > percentage] + elem_number = focused_slicing_data.size + + for i in range(bin_number): + total = np.sum(np.array(edge[i] <= focused_slicing_data) == np.array(focused_slicing_data < edge[i + 1])) + bins[i] = total / elem_number # 顺便做一个归一化 + + plt.bar(position, bins, width=bar_width, label=x_script[idx]) + plt.xticks(mid_position, x_show) # 替换横坐标x的刻度显示内容 + plt.legend() # 给出图例 + if mode == 'iou': + plt.xlabel(f"Classification Score Range", fontdict=label_font) + plt.ylabel(f"Percentage", fontdict=label_font) + plt.ylim(0., 0.9) + elif mode == 'cls': + plt.xlabel(f"IOU Score Range", fontdict=label_font) + plt.ylabel(f"Percentage", fontdict=label_font) + # plt.ylim(0.275, 0.725) + plt.ylim(0., 0.5) + + + plt.tick_params(labelsize=14) + # TODO 把百分比标到头上 + + title_font = {'weight': 'bold', 'size': 14} + # plt.title('Score and IOU in TP, summarization',fontdict=title_font) + # plt.show() + # plt.savefig("/workspace/code/Quant/MQBench/test/test_img/fp32_summarization.png") + # plt.savefig("/workspace/code/Quant/MQBench/test/test_img/w4a4_summarization.png") + plt.savefig(f"test_img/{target_dir}/statistics_bar_summarization_{mode}0.9.png") + plt.close() + + + + # plt.figure() + # number = data.size + # edge = np.linspace(-pedge, pedge, 360) + # bins = [0] * (len(edge) - 1) + # for i in range(len(edge) - 1): + # total = np.sum(np.array(edge[i] < data) == np.array(data < edge[i + 1])) + # bins[i] = total + + # bins = np.array(bins) / number # 做一个归一化 + + # plt.stem(edge[:-1], bins, markerfmt='C3.') # 不能直接用hist,因为hist的区间是动态的!(最小刻度会变,很傻吊) + # plt.title(title) + # plt.xlim(-1.1 * pedge, 1.1 * pedge) + # plt.ylim(0, hlim) + # plt.grid() + + # plt.savefig('./fig/{}.jpg'.format(title)) + # plt.close() + +def statistics_for_iou_bin(loop_data, classes_list, x_script, target_dir): + fig = plt.figure(figsize=(12,8)) + # plt.subplots_adjust(left=0.08,bottom=0.10,right=0.9,top=0.92,wspace=.2,hspace=.2) # 设置子图间距 + title_font = {'weight': 'bold', 'size': 22} + label_font = {'weight': 'bold', 'size': 16} + suptitle_font = {'weight': 'bold', 'size': 40} + + loop_number = len(loop_data) + + + bin_number = 10 + # edge = np.linspace(0.5, 1.0, bin_number + 1) + edge = np.linspace(0., 1.0, bin_number + 1) + + edge = np.round(edge, decimals=3) + + bins = np.zeros(bin_number) + bar_width = 0.16 + mid_position = np.linspace(1, bin_number, bin_number) * 0.75 + base_position = mid_position - bar_width * (loop_number - 1) / 2 + x_show = [] + for i in range(bin_number): + x_show.append(f'[{edge[i]}, {edge[i+1]}]') + + for idx, tp_special_data in enumerate(loop_data): # 循环绘制每一个数据文件 + position = base_position + idx * bar_width + + confi_data = tp_special_data[:, 0] + iou_data = tp_special_data[:, 1] + + + # det_labels = tp_special_data[:,0].astype(np.int16) # label score IOU + elem_number = iou_data.size + + for i in range(bin_number): + total = np.sum(np.array(edge[i] <= iou_data) == np.array(iou_data < edge[i + 1])) + bins[i] = total / elem_number # 顺便做一个归一化 + # bins[i] = total # + + plt.bar(position, bins, width=bar_width, label=x_script[idx]) + plt.xticks(mid_position, x_show) # 替换横坐标x的刻度显示内容 + plt.legend() # 给出图例 + + # Total + plt.xlabel(f"IOU Score Range", fontdict=label_font) + plt.ylabel(f"Percentage", fontdict=label_font) + # plt.ylim(0., 0.6) + + + plt.tick_params(labelsize=14) + # TODO 把百分比标到头上 + + title_font = {'weight': 'bold', 'size': 14} + # plt.title('Score and IOU in TP, summarization',fontdict=title_font) + # plt.show() + # plt.savefig("/workspace/code/Quant/MQBench/test/test_img/fp32_summarization.png") + # plt.savefig("/workspace/code/Quant/MQBench/test/test_img/w4a4_summarization.png") + plt.savefig(f"test_img/{target_dir}/statistics_bar_summarization_all_iou_variation.png") + plt.close() + + + + # plt.figure() + # number = data.size + # edge = np.linspace(-pedge, pedge, 360) + # bins = [0] * (len(edge) - 1) + # for i in range(len(edge) - 1): + # total = np.sum(np.array(edge[i] < data) == np.array(data < edge[i + 1])) + # bins[i] = total + + # bins = np.array(bins) / number # 做一个归一化 + + # plt.stem(edge[:-1], bins, markerfmt='C3.') # 不能直接用hist,因为hist的区间是动态的!(最小刻度会变,很傻吊) + # plt.title(title) + # plt.xlim(-1.1 * pedge, 1.1 * pedge) + # plt.ylim(0, hlim) + # plt.grid() + + # plt.savefig('./fig/{}.jpg'.format(title)) + # plt.close() + +def loop_box_ious_and_confi(loop_data, classes_list, x_script, target_dir): + all_position = [] + differ = 0.6 # 用来偏移画图的 + plt.figure(figsize=(12,4)) + for idx, tp_special_data in enumerate(loop_data): # 循环绘制每一个数据文件 + + # det_labels = tp_special_data[:,0].astype(np.int16) # label score IOU + # tp_special_data[:, 2] = iou_remap(tp_special_data[:, 2]) # IOU数据 重新缩放 + # confidence 或 IOU重新排序,只取前K个结果 + if target_dir =='Retina50': + topk = round(0.5 * tp_special_data.shape[0]) # 妙!这才对啊 + elif target_dir =='SSD300': + topk = round(0.5 * tp_special_data.shape[0]) # 妙!这才对啊 + sorted_idxs = np.argsort(tp_special_data[:, 2]) + tp_special_data = tp_special_data[sorted_idxs] # 进行从小到大排序 + confi_data = tp_special_data[-topk:][:, 1] + iou_data = tp_special_data[-topk:][:, 2] + + # iou_data = np.sort(tp_special_data[:, 2]) + + positions = [1+idx*differ, 5+idx*differ] + all_position.extend(positions) + plt.boxplot([confi_data, iou_data], positions=positions, sym='') # NOTE 注意,隐藏了离群点 + # 接下来着手处理x坐标信息 + axis_names = x_script*2 + all_position.sort() + plt.xticks(ticks=all_position, #设置要显示的x轴刻度,若指定空列表则去掉x轴刻度 + # , + labels=axis_names,#设置x轴刻度显示的文字,要与ticks对应 + fontsize=10, #设置刻度字体大小 + rotation=0, #设置刻度文字旋转角度 + ha='center', va='center', #刻度文字对齐方式,当rotation_mode为’anchor'时,对齐方式决定了文字旋转的中心。ha也可以写成horizontalalignment,va也可以写成verticalalignment。 + ) + + plt.xlabel(f"Score Statistical Results{' '*70}IOU Statistical Results") + + plt.ylim([0.1, 1.]) + + plt.grid() # 生成网 + + title_font = {'weight': 'bold', 'size': 12} + plt.title('Score and IOU in TP, summarization',fontdict=title_font) + # plt.show() + plt.savefig(f"/workspace/code/Quant/MQBench/test_img/{target_dir}/BOX-fp32-8-6-5-4-3-Summarization.png") + # plt.savefig("/workspace/code/Quant/MQBench/test/test_img/fp32-8-6-5-4-3-Summarization1.png") + plt.close() + +def loop_plot_ious_and_confi(loop_data, classes_list, x_script, target_dir): + all_position = [] + differ = 0.6 # 用来偏移画图的 + plt.figure(figsize=(12,4)) + count_list = [] + for idx, tp_special_data in enumerate(loop_data): # 循环绘制每一个数据文件 + count_list.append(len(tp_special_data)) + # # det_labels = tp_special_data[:,0].astype(np.int16) # label score IOU + # tp_special_data[:, 2] = iou_remap(tp_special_data[:, 2]) # IOU数据 重新缩放 + # # confidence 或 IOU重新排序,只取前K个结果 + # topk = 10000 + # confi_data = np.sort(tp_special_data[:, 1])[-topk:] + # iou_data = np.sort(tp_special_data[:, 2])[-topk:] + + positions = [1+idx*differ] + all_position.extend(positions) + plt.plot(x_script, count_list, ) + # 接下来着手处理x坐标信息 + axis_names = x_script + all_position.sort() + plt.xticks( + # ticks=all_position, #设置要显示的x轴刻度,若指定空列表则去掉x轴刻度 + # # , + # labels=axis_names,#设置x轴刻度显示的文字,要与ticks对应 + fontsize=10, #设置刻度字体大小 + rotation=0, #设置刻度文字旋转角度 + ha='center', va='center', #刻度文字对齐方式,当rotation_mode为’anchor'时,对齐方式决定了文字旋转的中心。ha也可以写成horizontalalignment,va也可以写成verticalalignment。 + ) + plt.grid() # 生成网 + plt.legend('TP') + title_font = {'weight': 'bold', 'size': 12} + plt.title('Score and IOU in TP, summarization',fontdict=title_font) + # plt.show() + plt.savefig(f"/workspace/code/Quant/MQBench/test/test_img/{target_dir}/PLOT-fp32-8-6-5-4-3-Summarization.png") + # plt.savefig("/workspace/code/Quant/MQBench/test/test_img/fp32-8-6-5-4-3-Summarization1.png") + plt.close() + + +def loop_hexbin_ious_and_confi(loop_data, classes_list, x_script, target_dir): + fig = plt.figure(figsize=(20,18)) + plt.subplots_adjust(left=0.08,bottom=0.10,right=0.9,top=0.88,wspace=0,hspace=.32) # 设置子图间距 + title_font = {'weight': 'bold', 'size': 22} + label_font = {'weight': 'bold', 'size': 20} + suptitle_font = {'weight': 'bold', 'size': 40} + + # 定制一个y=x曲线 + ideal_dot = np.linspace(.5, 1.0, 20) + + for idx, tp_special_data in enumerate(loop_data): # 循环绘制每一个数据文件 + ax = fig.add_subplot(2,2,idx+1) + plt.title(f"{x_script[idx]}", fontdict=title_font) + + # # 按照类别去绘画 + # tp_special_data = tp_special_data[tp_special_data[:,0] == 0] + + # # 按照IOU重新排序,只取前K个结果 + # topk = 10000 + # iou_data = tp_special_data[:, 2] + # index = np.lexsort((iou_data, )) + # tp_special_data = tp_special_data[index][-topk:] + # confi_data = tp_special_data[:, 1] + # iou_data = tp_special_data[:, 2] + + confi_data = tp_special_data[:, 0] + iou_data = tp_special_data[:, 1] + + # df = pd.DataFrame(tp_special_data[:, 1:], columns = ['Classification Score','IOU Score']) + # sns.jointplot(x=df['Classification Score'], y=df['IOU Score'], # 设置xy轴,显示columns名称 + # data = df, #设置数据 + # color = 'b', #设置颜色 + # # s = 50, edgecolor = 'w', linewidth = 1,#设置散点大小、边缘颜色及宽度(只针对scatter) + # # stat_func=sci.pearsonr, + # kind = 'hex',#设置类型:'scatter','reg','resid','kde','hex' + # #stat_func=, + # space = 0.1, #设置散点图和布局图的间距 + # # size = 4, #图表大小(自动调整为正方形)) + # ratio = 5, #散点图与布局图高度比,整型 + # # marginal_kws = dict(bins=15, rug =True), #设置柱状图箱数,是否设置rug + # ) + # df.plot.hexbin(x='Classification Score', y='IOU Score', gridsize=30) + # plt.scatter(confi_data, iou_data, s=1) # 注意,x轴是classification,y轴是iou + # hb = plt.hexbin(confi_data, iou_data, gridsize=40, cmap='Blues', vmin=0, vmax=4) # min max指的是color的上下限 + hb = plt.hexbin(confi_data, iou_data, gridsize=40, cmap='Blues', vmin=0, vmax=10) # min max指的是color的上下限 + plt.plot(ideal_dot, ideal_dot, 'r:', linewidth=5) + # cb = plt.colorbar(hb) + # cb.set_label(z) + plt.xlabel(f"Classification Score", fontdict=label_font) + plt.ylabel(f"IOU Score", fontdict=label_font) + plt.tick_params(labelsize=14) + # plt.xlim([0.1, 1.0]) + # plt.ylim([0.65, 1.0]) + ax.set_aspect(1.0/ax.get_data_ratio(), adjustable='box') + + # # 做成一张主图 + # fig, axarr = plt.subplots(2, 3, figsize=(25, 16)) + # subaxis = generate_axis(2,3) + # for it, ax_idx in enumerate(subaxis): + # axarr[ax_idx].imshow(mpimg.imread(f"/workspace/code/Quant/MQBench/test/test_img/hex_temp/{it}.png")) + + # # 去掉 x和 y轴 + # [ax.set_axis_off() for ax in axarr.ravel()] + # plt.suptitle('Score and IOU in TP, summarization', fontsize=22) + # plt.tight_layout() + # plt.savefig("/workspace/code/Quant/MQBench/test/test_img/HEXSCATTER-fp32-8-6-5-4-3-Summarization.png") + position = fig.add_axes([0.92, 0.12, 0.015, .78 ])#位置[左,下,右,上] + cb = fig.colorbar(hb, cax=position) + # cb.ax.set_yticklabels(['0','5','10','15','20','25','30', '35'], fontsize=18) + cb.ax.set_yticklabels(['0', '', '1', '', '2', '', '3', '', '≥4'], fontsize=24) + plt.suptitle('Score and IOU in TP+FP, summarization', fontsize=40) + # plt.tight_layout() + # plt.show() + plt.savefig(f"test_img/{target_dir}/HEXBIN-fp32-8-6-5-4-3-Summarization.png") + # plt.savefig("test_img/fp32-8-6-5-4-3-Summarization1.png") + plt.close() + +def loop_dot_ious_and_confi(loop_data, classes_list, x_script, target_dir): + fig = plt.figure(figsize=(24,16)) + plt.subplots_adjust(left=0.08,bottom=0.10,right=0.9,top=0.92,wspace=.2,hspace=.2) # 设置子图间距 + title_font = {'weight': 'bold', 'size': 22} + label_font = {'weight': 'bold', 'size': 20} + suptitle_font = {'weight': 'bold', 'size': 40} + + # 定制一个y=x曲线 + ideal_dot = np.linspace(.5, 1.0, 20) + + for idx, tp_special_data in enumerate(loop_data): # 循环绘制每一个数据文件 + ax = fig.add_subplot(2,3,idx+1) + plt.title(f"{x_script[idx]}", fontdict=title_font) + + # # 按照类别去绘画 + # tp_special_data = tp_special_data[tp_special_data[:,0] == 0] + + # # 按照IOU重新排序,只取前K个结果 + # topk = 10000 + # iou_data = tp_special_data[:, 2] + # index = np.lexsort((iou_data, )) + # tp_special_data = tp_special_data[index][-topk:] + # confi_data = tp_special_data[:, 1] + # iou_data = tp_special_data[:, 2] + + confi_data = tp_special_data[:, 0] + iou_data = tp_special_data[:, 1] + + # df = pd.DataFrame(tp_special_data[:, 1:], columns = ['Classification Score','IOU Score']) + # sns.jointplot(x=df['Classification Score'], y=df['IOU Score'], # 设置xy轴,显示columns名称 + # data = df, #设置数据 + # color = 'b', #设置颜色 + # # s = 50, edgecolor = 'w', linewidth = 1,#设置散点大小、边缘颜色及宽度(只针对scatter) + # # stat_func=sci.pearsonr, + # kind = 'hex',#设置类型:'scatter','reg','resid','kde','hex' + # #stat_func=, + # space = 0.1, #设置散点图和布局图的间距 + # # size = 4, #图表大小(自动调整为正方形)) + # ratio = 5, #散点图与布局图高度比,整型 + # # marginal_kws = dict(bins=15, rug =True), #设置柱状图箱数,是否设置rug + # ) + # df.plot.hexbin(x='Classification Score', y='IOU Score', gridsize=30) + # plt.scatter(confi_data, iou_data, s=1) # 注意,x轴是classification,y轴是iou + plt.plot(confi_data, iou_data, 'b.', linewidth=1) # min max指的是color的上下限 + plt.plot(ideal_dot, ideal_dot, 'r:', linewidth=4) + # cb = plt.colorbar(hb) + # cb.set_label(z) + plt.xlabel(f"Classification Score", fontdict=label_font) + plt.ylabel(f"IOU Score", fontdict=label_font) + plt.tick_params(labelsize=14) + # plt.xlim([0.1, 1.0]) + # plt.ylim([0.65, 1.0]) + ax.set_aspect(1.0/ax.get_data_ratio(), adjustable='box') + + # # 做成一张主图 + # fig, axarr = plt.subplots(2, 3, figsize=(25, 16)) + # subaxis = generate_axis(2,3) + # for it, ax_idx in enumerate(subaxis): + # axarr[ax_idx].imshow(mpimg.imread(f"/workspace/code/Quant/MQBench/test/test_img/hex_temp/{it}.png")) + + # # 去掉 x和 y轴 + # [ax.set_axis_off() for ax in axarr.ravel()] + # plt.suptitle('Score and IOU in TP, summarization', fontsize=22) + # plt.tight_layout() + # plt.savefig("/workspace/code/Quant/MQBench/test/test_img/HEXSCATTER-fp32-8-6-5-4-3-Summarization.png") + + # cb.ax.set_yticklabels(['0','5','10','15','20','25','30', '35'], fontsize=18) + plt.suptitle('Score and IOU in TP, summarization', fontsize=40) + # plt.tight_layout() + # plt.show() + plt.savefig(f"test_img/{target_dir}/dot-fp32-8-6-5-4-3-Summarization.png") + # plt.savefig("test_img/fp32-8-6-5-4-3-Summarization1.png") + plt.close() + +# def loop_violinplot_ious_and_confi(loop_data, classes_list, x_script, target_dir): # TODO 改成分开绘图吧,合在一起其实不方便?或者着重解决双坐标轴的情况 +# all_position = [] +# differ = 0.6 # 用来偏移画图的 +# plt.figure(figsize=(12,4)) +# for idx, tp_special_data in enumerate(loop_data): # 循环绘制每一个数据文件 + + +# # IOU数据 重新缩放 +# # tp_special_data[:, 2] = iou_remap(tp_special_data[:, 2]) + +# # confidence 或 IOU重新排序,只取前K个结果 +# if target_dir =='Retina50': +# topk = round(0.5 * tp_special_data.shape[0]) # 妙!这才对啊 +# elif target_dir =='SSD300': +# topk = round(0.5 * tp_special_data.shape[0]) +# sorted_idxs = np.argsort(tp_special_data[:, 2]) +# tp_special_data = tp_special_data[sorted_idxs] # 进行从小到大排序 +# confi_data = tp_special_data[-topk:][:, 1] +# iou_data = tp_special_data[-topk:][:, 2] + +# positions = [1+idx*differ, 5+idx*differ] +# all_position.extend(positions) +# plt.violinplot([confi_data, iou_data], positions=positions) +# # 接下来着手处理x坐标信息 +# axis_names = x_script*2 +# all_position.sort() +# plt.xticks(ticks=all_position, #设置要显示的x轴刻度,若指定空列表则去掉x轴刻度 +# # , +# labels=axis_names,#设置x轴刻度显示的文字,要与ticks对应 +# fontsize=10, #设置刻度字体大小 +# rotation=0, #设置刻度文字旋转角度 +# ha='center', va='center', #刻度文字对齐方式,当rotation_mode为’anchor'时,对齐方式决定了文字旋转的中心。ha也可以写成horizontalalignment,va也可以写成verticalalignment。 +# ) + +# plt.xlabel(f"Classification Statistical Results{' '*64}IOU Statistical Results{' '*8}") +# plt.ylim([0.1, 1.]) +# # 构建右侧坐标 +# plt.grid() # 生成网 + +# title_font = {'weight': 'bold', 'size': 12} +# plt.title('Score and IOU in TP, summarization',fontdict=title_font) +# # plt.show() +# plt.savefig(f"/workspace/code/Quant/MQBench/test_img/{target_dir}/VIOLIN-fp32-8-6-5-4-3-Summarization.png") +# # plt.savefig("/workspace/code/Quant/MQBench/test/test_img/fp32-8-6-5-4-3-Summarization1.png") +# plt.close() + + +def loop_violinplot_ious_and_confi(loop_data, classes_list, x_script, target_dir): # TODO 改成分开绘图吧,合在一起其实不方便?或者着重解决双坐标轴的情况 + all_position = [] + differ = 0.6 # 用来偏移画图的 + plt.figure(figsize=(12,4)) + for idx, tp_special_data in enumerate(loop_data): # 循环绘制每一个数据文件 + + + # IOU数据 重新缩放 + # tp_special_data[:, 2] = iou_remap(tp_special_data[:, 2]) + + # sorted_idxs = np.argsort(tp_special_data[:, 2]) + # tp_special_data = tp_special_data[sorted_idxs] # 进行从小到大排序 + # confi_data = tp_special_data[-topk:][:, 1] + # iou_data = tp_special_data[-topk:][:, 2] + confi_data = tp_special_data[:, 0] + iou_data = tp_special_data[:, 1] + + positions = [1+idx*differ, 5+idx*differ] + all_position.extend(positions) + plt.violinplot([confi_data, iou_data], positions=positions) + # 接下来着手处理x坐标信息 + axis_names = x_script*2 + all_position.sort() + plt.xticks(ticks=all_position, #设置要显示的x轴刻度,若指定空列表则去掉x轴刻度 + # , + labels=axis_names,#设置x轴刻度显示的文字,要与ticks对应 + fontsize=10, #设置刻度字体大小 + rotation=0, #设置刻度文字旋转角度 + ha='center', va='center', #刻度文字对齐方式,当rotation_mode为’anchor'时,对齐方式决定了文字旋转的中心。ha也可以写成horizontalalignment,va也可以写成verticalalignment。 + ) + + plt.xlabel(f"Classification Statistical Results{' '*64}IOU Statistical Results{' '*8}") + plt.ylim([0.1, 1.]) + # 构建右侧坐标 + plt.grid() # 生成网 + + title_font = {'weight': 'bold', 'size': 12} + plt.title('Score and IOU in TP, summarization',fontdict=title_font) + # plt.show() + plt.savefig(f"test_img/{target_dir}/VIOLIN-fp32-8-6-5-4-3-Summarization.png") + # plt.savefig("/workspace/code/Quant/MQBench/test/test_img/fp32-8-6-5-4-3-Summarization1.png") + plt.close() + + +def loop_bar_fp(loop_data, classes_list, x_script, target_dir): + # 绘制FP中background和cls型的占比 + all_position = [] + differ = 0.6 # 用来偏移画图的 + plt.figure(figsize=(12,4)) + for idx, fp_data in enumerate(loop_data): # 循环绘制每一个数据文件 + + # det_labels = tp_special_data[:,0].astype(np.int16) # label score IOU + # cls_fp = fp_data[0] + # cls_num = len(cls_fp) + background_fp1 = fp_data[1] # cls正确的 + background1_num = len(background_fp1) + background_fp_total = fp_data[2] # 总的 + background_total_num = len(background_fp_total) + background1_percentage = (background_total_num - background1_num) / background_total_num # 正确的比例 + background2_percentage = 1 - background1_percentage # 纯背景的比例 + + positions = [1+idx*differ] + all_position.extend(positions) + plt.bar(positions, [background1_percentage], color="b", width=0.4, ) + plt.bar(positions, [background2_percentage], color="g", bottom=[background1_percentage], width=0.4, ) + # 接下来着手处理x坐标信息 + axis_names = x_script + all_position.sort() + plt.xticks(ticks=all_position, #设置要显示的x轴刻度,若指定空列表则去掉x轴刻度 + # , + labels=axis_names,#设置x轴刻度显示的文字,要与ticks对应 + fontsize=10, #设置刻度字体大小 + rotation=0, #设置刻度文字旋转角度 + ha='center', va='center', #刻度文字对齐方式,当rotation_mode为’anchor'时,对齐方式决定了文字旋转的中心。ha也可以写成horizontalalignment,va也可以写成verticalalignment。 + ) + + plt.xlabel(f"Statistical Results in FP") + plt.ylabel(f"Number") + plt.legend(('cls right','real background')) + plt.grid() # 生成网 + + title_font = {'weight': 'bold', 'size': 12} + plt.title('FP, summarization',fontdict=title_font) + # plt.show() + plt.savefig(f"/workspace/code/Quant/MQBench/test/test_img/{target_dir}/BAR-fp32-8-6-5-4-3-FP-Summarization.png") + # plt.savefig("/workspace/code/Quant/MQBench/test/test_img/fp32-8-6-5-4-3-Summarization1.png") + plt.close() + +def maxminnorm(array): # 全局归一化 + max_value=array.max() + min_value=array.min() + return (array - min_value)/(max_value-min_value) + +def iou_remap(array): # 重新缩放iou数据的区间[0.5,1]->[0,1] + return 2*(array - 0.5) + +if __name__ in "__main__": + import matplotlib.pyplot as plt + import numpy as np + import matplotlib + + # plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签 + # # plt.rcParams['font.family'] = 'simhei' + # plt.rcParams['axes.unicode_minus'] = False + + # 加载class json 文件 + # json_file = '/workspace/code/Quant/MQBench/application/pytorch_object_detection/retinaNet/pascal_voc_classes.json' + # assert os.path.exists(json_file), "{} file not exist.".format(json_file) + # with open(json_file, 'r') as f: + # class_dict = json.load(f) + # classes_list = list(class_dict.keys()) + classes_list = None + + # analytic_type = 'FP' # TP/FP + # target = 'SSDLite_voc' # SSD300 + target = 'Retina50_voc' # SSD300 + # target = 'Retina18_voc' # SSD300 + total_fp_path = None + total_tp_path =None + total_pos_sample_path = None + + if target == 'Retina50_voc': + total_tp_path = [ + 'work_dirs/retinanet_r50_fpn_1x_voc/tp_special_list.npy', + 'work_dirs/retinanet_r50_fpn_voc_w4a4_LSQ/tp_special_list.npy', + 'work_dirs/retinanet_r50_fpn_voc_w2a2_LSQ_le/tp_special_list.npy', + ] + # total_pos_sample_path = [ + # 'work_dirs/retinanet_r18_fpn_1x_voc/all_pos_sample_data.npy', + # 'work_dirs/retinanet_r18_fpn_voc_w4a4_LSQ/all_pos_sample_data.npy', + # 'work_dirs/retinanet_r18_fpn_voc_w2a2_LSQ/all_pos_sample_data.npy', + # ] + # total_fp_path = [ + # 'work_dirs/retinanet_r18_fpn_1x_voc/all_pos_sample_data.npy', + # 'work_dirs/retinanet_r18_fpn_voc_w4a4_LSQ/all_pos_sample_data.npy', + # 'work_dirs/retinanet_r18_fpn_voc_w2a2_LSQ/all_pos_sample_data.npy', + # ] + + + # x_script = ['fp32'] + x_script = ['fp32', 'LSQ w4a4', 'LSQ w2a2'] + elif target == 'Retina18_voc': + total_tp_path = [ + 'work_dirs/retinanet_r18_fpn_1x_voc/tp_special_list.npy', + 'work_dirs/retinanet_r18_fpn_voc_w4a4_LSQ/tp_special_list.npy', + 'work_dirs/retinanet_r18_fpn_voc_w2a2_LSQ/tp_special_list.npy', + ] + # total_pos_sample_path = [ + # 'work_dirs/retinanet_r18_fpn_1x_voc/all_pos_sample_data.npy', + # 'work_dirs/retinanet_r18_fpn_voc_w4a4_LSQ/all_pos_sample_data.npy', + # 'work_dirs/retinanet_r18_fpn_voc_w2a2_LSQ/all_pos_sample_data.npy', + # ] + # total_fp_path = [ + # 'work_dirs/retinanet_r18_fpn_1x_voc/all_pos_sample_data.npy', + # 'work_dirs/retinanet_r18_fpn_voc_w4a4_LSQ/all_pos_sample_data.npy', + # 'work_dirs/retinanet_r18_fpn_voc_w2a2_LSQ/all_pos_sample_data.npy', + # ] + + + # x_script = ['fp32'] + x_script = ['fp32', 'LSQ w4a4', 'LSQ w2a2'] + elif target == 'SSDLite_voc': + # SSD300 + + # total_fp_path = [ + # 'work_dirs/ssdlite_mobilenetv2_scratch_600e_voc/all_pos_sample_data.npy', # 就是纯eval的时候有问题 + # 'work_dirs/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4/all_pos_sample_data.npy', # 就是纯eval的时候有问题 + # 'work_dirs/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4_mypro_temp/all_pos_sample_data.npy', # 就是纯eval的时候有问题 + # 'work_dirs/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4_mypro_temp_qloss/all_pos_sample_data.npy', # 就是纯eval的时候有问题 + # ] + # total_tp_path = [ + # 'work_dirs/ssdlite_mobilenetv2_scratch_600e_voc/tp_special_list.npy', # 就是纯eval的时候有问题 + # 'work_dirs/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4/tp_special_list.npy', # 就是纯eval的时候有问题 + # 'work_dirs/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4_mypro_temp_qloss/tp_special_list.npy', # 就是纯eval的时候有问题 + # ] + # total_fp_path = [ + # 'work_dirs/ssdlite_mobilenetv2_scratch_600e_voc/cls_wrong_fp_data.npy', # 就是纯eval的时候有问题 + # 'work_dirs/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4/cls_wrong_fp_data.npy', # 就是纯eval的时候有问题 + # 'work_dirs/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4_mypro_temp_qloss/cls_wrong_fp_data.npy', # 就是纯eval的时候有问题 + # ] + + + # 只用在statistica for iou + total_tp_path = [ + 'work_dirs/ssdlite_mobilenetv2_scratch_600e_voc/tp_special_list.npy', # 就是纯eval的时候有问题 + 'work_dirs/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4/tp_special_list.npy', # 就是纯eval的时候有问题 + 'work_dirs/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4_mypro_temp/tp_special_list.npy', # 就是纯eval的时候有问题 + 'work_dirs/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4_mypro_temp_qloss/tp_special_list.npy', # 就是纯eval的时候有问题 + ] + # total_fp_path = [ + # 'work_dirs/ssdlite_mobilenetv2_scratch_600e_voc/cls_wrong_fp_data.npy', # 就是纯eval的时候有问题 + # 'work_dirs/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4/cls_wrong_fp_data.npy', # 就是纯eval的时候有问题 + # 'work_dirs/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4_mypro_temp/cls_wrong_fp_data.npy', # 就是纯eval的时候有问题 + # 'work_dirs/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4_mypro_temp_qloss/cls_wrong_fp_data.npy', # 就是纯eval的时候有问题 + # ] + + x_script = ['fp32', 'w4a4', 'w4a4_HQOD_noq', 'w4a4_HQOD'] + # x_script = ['fp32', 'w4a4', 'w4a4_HQOD'] + # x_script = ['w4a4', 'w4a4_HQOD'] + # x_script = ['fp32', '4Bit', '4Bit_HarDet', '4Bit_HQOD'] + + else: + raise NotImplementedError + + mmcv.mkdir_or_exist(f'test_img/{target}') + + data_list = [] + # for path in total_tp_path: + # data = np.load(path, allow_pickle=True) + # data_list.append(data) + if None not in [total_tp_path, total_fp_path]: + print('\n HexBin tp+fp Mode!!!!\n ') + for tp_path, fp_path in zip(total_tp_path, total_fp_path): + tp_data = np.load(tp_path, allow_pickle=True) + fp_data = np.load(fp_path, allow_pickle=True) + data = np.concatenate([tp_data[:,1:], + fp_data, # cls错误型FP + # np.array(fp_data[1]), # 分类正确但IOU小于阈值型FP + ]) + data_list.append(data) + elif total_tp_path is not None: + print('\n tp Mode!!!!\n ') + for path in total_tp_path: + data = np.load(path, allow_pickle=True) + pccs = np.corrcoef(data[:, 1], data[:, 2]) + print(f'{pccs[0][1]}\n') + data_list.append(data[:, 1:]) + # data_list.append(data) + elif total_fp_path is not None: + print('\n fp Mode!!!!\n ') + for path in total_fp_path: + data = np.load(path, allow_pickle=True) + data_list.append(data) + elif total_pos_sample_path is not None: + print('\n pos sample Mode!!!!\n ') + for path in total_pos_sample_path: + data = np.load(path, allow_pickle=True) + data_list.append(data) + + # plot_ious_and_confi_per_class(tp_special_data, classes_list) + # plot_ious_and_confi(tp_special_data, classes_list) + # analytic_type == 'TP': + # loop_plot_ious_and_confi_per_class(data_list, classes_list, x_script, target) + + # loop_plot_ious_and_confi(data_list, classes_list, x_script, target) + + # loop_box_ious_and_confi(data_list, classes_list, x_script, target) + # loop_violinplot_ious_and_confi(data_list, classes_list, x_script, target) # 这个不行 + + + loop_hexbin_ious_and_confi(data_list, classes_list, x_script, target) # 这个稍微行,可以只展示lsq和HQOD的. + # loop_dot_ious_and_confi(data_list, classes_list, x_script, target) # 这个没必要了 + # statistics_by_percentage_bin(data_list, classes_list, x_script, target) # 这个不行 + # statistics_for_iou_bin(data_list, classes_list, x_script, target) # + + + + # analytic_type == 'FP': + # loop_bar_fp(data_list, classes_list, x_script, target) + + # -----------log + ''' + 1. 其实还有一个点,因为bit是统一w和a的,如果w8a16;w8a32又会怎样呢? + 2. 讨论的是confi还是classification socre?在RetinaNet中虽然没区别 + 3. hexbin可以理解为热力图的一种.colorbar其实代表了下限,其实实际是超过140的 + + 待解决:假BiDet有猫腻,根本不对劲;但是明白他想表达的意思了,即关注nms后存在的问题,就是nms后仍有很多框,而其中的大多数框都是 + 会被判定为FP——因为IOU达不到阈值。我们其实应该关注TP和分类正确的bg型FP 搞清楚FN是怎么来的?! + + 已定制: + a. VIOLIN,观察恶化情况;可以看到分类结果先恶化; + b. HEXBIN,观察imbalance&disharmonious;可以看到一开始就存在不和谐现象;int8加剧了这个现象;因为mAP的计算机制,所以这影响了mAP的结果。 + ''' \ No newline at end of file diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..9796e87 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,7 @@ +[pytest] +addopts = --xdoctest --xdoctest-style=auto +norecursedirs = .git ignore build __pycache__ data docker docs .eggs + +filterwarnings= default + ignore:.*No cfgstr given in Cacher constructor or call.*:Warning + ignore:.*Define the __nice__ method for.*:Warning diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..6981bd7 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +-r requirements/build.txt +-r requirements/optional.txt +-r requirements/runtime.txt +-r requirements/tests.txt diff --git a/requirements/albu.txt b/requirements/albu.txt new file mode 100644 index 0000000..f421fbb --- /dev/null +++ b/requirements/albu.txt @@ -0,0 +1 @@ +albumentations>=0.3.2 --no-binary qudida,albumentations diff --git a/requirements/build.txt b/requirements/build.txt new file mode 100644 index 0000000..8155829 --- /dev/null +++ b/requirements/build.txt @@ -0,0 +1,3 @@ +# These must be installed before building mmdetection +cython +numpy diff --git a/requirements/docs.txt b/requirements/docs.txt new file mode 100644 index 0000000..b562600 --- /dev/null +++ b/requirements/docs.txt @@ -0,0 +1,8 @@ +docutils==0.16.0 +markdown>=3.4.0 +myst-parser +-e git+https://github.com/open-mmlab/pytorch_sphinx_theme.git#egg=pytorch_sphinx_theme +sphinx==5.3.0 +sphinx-copybutton +sphinx_markdown_tables>=0.0.17 +sphinx_rtd_theme diff --git a/requirements/mminstall.txt b/requirements/mminstall.txt new file mode 100644 index 0000000..b53dbf4 --- /dev/null +++ b/requirements/mminstall.txt @@ -0,0 +1 @@ +mmcv-full>=1.3.17 diff --git a/requirements/optional.txt b/requirements/optional.txt new file mode 100644 index 0000000..4f0065a --- /dev/null +++ b/requirements/optional.txt @@ -0,0 +1,3 @@ +cityscapesscripts +imagecorruptions +scikit-learn diff --git a/requirements/readthedocs.txt b/requirements/readthedocs.txt new file mode 100644 index 0000000..e1bf21b --- /dev/null +++ b/requirements/readthedocs.txt @@ -0,0 +1,4 @@ +mmcv +scipy +torch +torchvision diff --git a/requirements/runtime.txt b/requirements/runtime.txt new file mode 100644 index 0000000..c815aef --- /dev/null +++ b/requirements/runtime.txt @@ -0,0 +1,6 @@ +matplotlib +numpy +pycocotools +scipy +six +terminaltables diff --git a/requirements/tests.txt b/requirements/tests.txt new file mode 100644 index 0000000..2ff795a --- /dev/null +++ b/requirements/tests.txt @@ -0,0 +1,15 @@ +asynctest +codecov +flake8 +interrogate +isort==4.3.21 +# Note: used for kwarray.group_items, this may be ported to mmcv in the future. +kwarray +-e git+https://github.com/open-mmlab/mmtracking#egg=mmtrack +onnx==1.7.0 +onnxruntime>=1.8.0 +protobuf<=3.20.1 +pytest +ubelt +xdoctest>=0.10.0 +yapf diff --git a/resources/coco_test_12510.jpg b/resources/coco_test_12510.jpg new file mode 100644 index 0000000..1271ae1 Binary files /dev/null and b/resources/coco_test_12510.jpg differ diff --git a/resources/corruptions_sev_3.png b/resources/corruptions_sev_3.png new file mode 100644 index 0000000..bbbd19a Binary files /dev/null and b/resources/corruptions_sev_3.png differ diff --git a/resources/data_pipeline.png b/resources/data_pipeline.png new file mode 100644 index 0000000..6ac3fee Binary files /dev/null and b/resources/data_pipeline.png differ diff --git a/resources/loss_curve.png b/resources/loss_curve.png new file mode 100644 index 0000000..0242555 Binary files /dev/null and b/resources/loss_curve.png differ diff --git a/resources/mmdet-logo.png b/resources/mmdet-logo.png new file mode 100644 index 0000000..a0b6fbd Binary files /dev/null and b/resources/mmdet-logo.png differ diff --git a/resources/zhihu_qrcode.jpg b/resources/zhihu_qrcode.jpg new file mode 100644 index 0000000..c745fb0 Binary files /dev/null and b/resources/zhihu_qrcode.jpg differ diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..6072221 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,21 @@ +[isort] +line_length = 79 +multi_line_output = 0 +extra_standard_library = setuptools +known_first_party = mmdet +known_third_party = PIL,asynctest,cityscapesscripts,cv2,gather_models,matplotlib,mmcv,numpy,onnx,onnxruntime,pycocotools,pytest,pytorch_sphinx_theme,requests,scipy,seaborn,six,terminaltables,torch,ts,yaml +no_lines_before = STDLIB,LOCALFOLDER +default_section = THIRDPARTY + +[yapf] +BASED_ON_STYLE = pep8 +BLANK_LINE_BEFORE_NESTED_CLASS_OR_DEF = true +SPLIT_BEFORE_EXPRESSION_AFTER_OPENING_PAREN = true + +# ignore-words-list needs to be lowercase format. For example, if we want to +# ignore word "BA", then we need to append "ba" to ignore-words-list rather +# than "BA" +[codespell] +skip = *.ipynb +quiet-level = 3 +ignore-words-list = patten,nd,ty,mot,hist,formating,winn,gool,datas,wan,confids,TOOD,tood,ba,warmup,nam,dota,DOTA diff --git a/setup.py b/setup.py new file mode 100755 index 0000000..535d90e --- /dev/null +++ b/setup.py @@ -0,0 +1,220 @@ +#!/usr/bin/env python +# Copyright (c) OpenMMLab. All rights reserved. +import os +import os.path as osp +import platform +import shutil +import sys +import warnings +from setuptools import find_packages, setup + +import torch +from torch.utils.cpp_extension import (BuildExtension, CppExtension, + CUDAExtension) + + +def readme(): + with open('README.md', encoding='utf-8') as f: + content = f.read() + return content + + +version_file = 'mmdet/version.py' + + +def get_version(): + with open(version_file, 'r') as f: + exec(compile(f.read(), version_file, 'exec')) + return locals()['__version__'] + + +def make_cuda_ext(name, module, sources, sources_cuda=[]): + + define_macros = [] + extra_compile_args = {'cxx': []} + + if torch.cuda.is_available() or os.getenv('FORCE_CUDA', '0') == '1': + define_macros += [('WITH_CUDA', None)] + extension = CUDAExtension + extra_compile_args['nvcc'] = [ + '-D__CUDA_NO_HALF_OPERATORS__', + '-D__CUDA_NO_HALF_CONVERSIONS__', + '-D__CUDA_NO_HALF2_OPERATORS__', + ] + sources += sources_cuda + else: + print(f'Compiling {name} without CUDA') + extension = CppExtension + + return extension( + name=f'{module}.{name}', + sources=[os.path.join(*module.split('.'), p) for p in sources], + define_macros=define_macros, + extra_compile_args=extra_compile_args) + + +def parse_requirements(fname='requirements.txt', with_version=True): + """Parse the package dependencies listed in a requirements file but strips + specific versioning information. + + Args: + fname (str): path to requirements file + with_version (bool, default=False): if True include version specs + + Returns: + List[str]: list of requirements items + + CommandLine: + python -c "import setup; print(setup.parse_requirements())" + """ + import re + import sys + from os.path import exists + require_fpath = fname + + def parse_line(line): + """Parse information from a line in a requirements text file.""" + if line.startswith('-r '): + # Allow specifying requirements in other files + target = line.split(' ')[1] + for info in parse_require_file(target): + yield info + else: + info = {'line': line} + if line.startswith('-e '): + info['package'] = line.split('#egg=')[1] + elif '@git+' in line: + info['package'] = line + else: + # Remove versioning from the package + pat = '(' + '|'.join(['>=', '==', '>']) + ')' + parts = re.split(pat, line, maxsplit=1) + parts = [p.strip() for p in parts] + + info['package'] = parts[0] + if len(parts) > 1: + op, rest = parts[1:] + if ';' in rest: + # Handle platform specific dependencies + # http://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-platform-specific-dependencies + version, platform_deps = map(str.strip, + rest.split(';')) + info['platform_deps'] = platform_deps + else: + version = rest # NOQA + info['version'] = (op, version) + yield info + + def parse_require_file(fpath): + with open(fpath, 'r') as f: + for line in f.readlines(): + line = line.strip() + if line and not line.startswith('#'): + for info in parse_line(line): + yield info + + def gen_packages_items(): + if exists(require_fpath): + for info in parse_require_file(require_fpath): + parts = [info['package']] + if with_version and 'version' in info: + parts.extend(info['version']) + if not sys.version.startswith('3.4'): + # apparently package_deps are broken in 3.4 + platform_deps = info.get('platform_deps') + if platform_deps is not None: + parts.append(';' + platform_deps) + item = ''.join(parts) + yield item + + packages = list(gen_packages_items()) + return packages + + +def add_mim_extension(): + """Add extra files that are required to support MIM into the package. + + These files will be added by creating a symlink to the originals if the + package is installed in `editable` mode (e.g. pip install -e .), or by + copying from the originals otherwise. + """ + + # parse installment mode + if 'develop' in sys.argv: + # installed by `pip install -e .` + if platform.system() == 'Windows': + # set `copy` mode here since symlink fails on Windows. + mode = 'copy' + else: + mode = 'symlink' + elif 'sdist' in sys.argv or 'bdist_wheel' in sys.argv: + # installed by `pip install .` + # or create source distribution by `python setup.py sdist` + mode = 'copy' + else: + return + + filenames = ['tools', 'configs', 'demo', 'model-index.yml'] + repo_path = osp.dirname(__file__) + mim_path = osp.join(repo_path, 'mmdet', '.mim') + os.makedirs(mim_path, exist_ok=True) + + for filename in filenames: + if osp.exists(filename): + src_path = osp.join(repo_path, filename) + tar_path = osp.join(mim_path, filename) + + if osp.isfile(tar_path) or osp.islink(tar_path): + os.remove(tar_path) + elif osp.isdir(tar_path): + shutil.rmtree(tar_path) + + if mode == 'symlink': + src_relpath = osp.relpath(src_path, osp.dirname(tar_path)) + os.symlink(src_relpath, tar_path) + elif mode == 'copy': + if osp.isfile(src_path): + shutil.copyfile(src_path, tar_path) + elif osp.isdir(src_path): + shutil.copytree(src_path, tar_path) + else: + warnings.warn(f'Cannot copy file {src_path}.') + else: + raise ValueError(f'Invalid mode {mode}') + + +if __name__ == '__main__': + add_mim_extension() + setup( + name='mmdet', + version=get_version(), + description='OpenMMLab Detection Toolbox and Benchmark', + long_description=readme(), + long_description_content_type='text/markdown', + author='MMDetection Contributors', + author_email='openmmlab@gmail.com', + keywords='computer vision, object detection', + url='https://github.com/open-mmlab/mmdetection', + packages=find_packages(exclude=('configs', 'tools', 'demo')), + include_package_data=True, + classifiers=[ + 'Development Status :: 5 - Production/Stable', + 'License :: OSI Approved :: Apache Software License', + 'Operating System :: OS Independent', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', + ], + license='Apache License 2.0', + install_requires=parse_requirements('requirements/runtime.txt'), + extras_require={ + 'all': parse_requirements('requirements.txt'), + 'tests': parse_requirements('requirements/tests.txt'), + 'build': parse_requirements('requirements/build.txt'), + 'optional': parse_requirements('requirements/optional.txt'), + 'mim': parse_requirements('requirements/mminstall.txt'), + }, + ext_modules=[], + cmdclass={'build_ext': BuildExtension}, + zip_safe=False) diff --git a/test_img/Retina18_voc/HEXBIN-fp32-8-6-5-4-3-Summarization.png b/test_img/Retina18_voc/HEXBIN-fp32-8-6-5-4-3-Summarization.png new file mode 100644 index 0000000..0c45f3e Binary files /dev/null and b/test_img/Retina18_voc/HEXBIN-fp32-8-6-5-4-3-Summarization.png differ diff --git a/test_img/Retina18_voc/dot-fp32-8-6-5-4-3-Summarization.png b/test_img/Retina18_voc/dot-fp32-8-6-5-4-3-Summarization.png new file mode 100644 index 0000000..d709ce6 Binary files /dev/null and b/test_img/Retina18_voc/dot-fp32-8-6-5-4-3-Summarization.png differ diff --git a/test_img/Retina18_voc/statistics_bar_summarization_all_iou_variation.png b/test_img/Retina18_voc/statistics_bar_summarization_all_iou_variation.png new file mode 100644 index 0000000..b275a74 Binary files /dev/null and b/test_img/Retina18_voc/statistics_bar_summarization_all_iou_variation.png differ diff --git a/test_img/Retina18_voc/statistics_bar_summarization_cls0.9.png b/test_img/Retina18_voc/statistics_bar_summarization_cls0.9.png new file mode 100644 index 0000000..8cb711e Binary files /dev/null and b/test_img/Retina18_voc/statistics_bar_summarization_cls0.9.png differ diff --git a/test_img/Retina18_voc/statistics_bar_summarization_iou0.9.png b/test_img/Retina18_voc/statistics_bar_summarization_iou0.9.png new file mode 100644 index 0000000..fff5911 Binary files /dev/null and b/test_img/Retina18_voc/statistics_bar_summarization_iou0.9.png differ diff --git a/test_img/Retina50_voc/HEXBIN-fp32-8-6-5-4-3-Summarization.png b/test_img/Retina50_voc/HEXBIN-fp32-8-6-5-4-3-Summarization.png new file mode 100644 index 0000000..c499067 Binary files /dev/null and b/test_img/Retina50_voc/HEXBIN-fp32-8-6-5-4-3-Summarization.png differ diff --git a/test_img/Retina50_voc/dot-fp32-8-6-5-4-3-Summarization.png b/test_img/Retina50_voc/dot-fp32-8-6-5-4-3-Summarization.png new file mode 100644 index 0000000..8e85aa4 Binary files /dev/null and b/test_img/Retina50_voc/dot-fp32-8-6-5-4-3-Summarization.png differ diff --git a/test_img/Retina50_voc/statistics_bar_summarization_all_iou_variation.png b/test_img/Retina50_voc/statistics_bar_summarization_all_iou_variation.png new file mode 100644 index 0000000..359a7bd Binary files /dev/null and b/test_img/Retina50_voc/statistics_bar_summarization_all_iou_variation.png differ diff --git a/test_img/Retina50_voc/statistics_bar_summarization_cls0.9.png b/test_img/Retina50_voc/statistics_bar_summarization_cls0.9.png new file mode 100644 index 0000000..3081e50 Binary files /dev/null and b/test_img/Retina50_voc/statistics_bar_summarization_cls0.9.png differ diff --git a/test_img/Retina50_voc/statistics_bar_summarization_iou0.9.png b/test_img/Retina50_voc/statistics_bar_summarization_iou0.9.png new file mode 100644 index 0000000..da0dcd5 Binary files /dev/null and b/test_img/Retina50_voc/statistics_bar_summarization_iou0.9.png differ diff --git a/test_img/SSDLite_voc/HEXBIN-fp32-8-6-5-4-3-Summarization.png b/test_img/SSDLite_voc/HEXBIN-fp32-8-6-5-4-3-Summarization.png new file mode 100644 index 0000000..07b9cab Binary files /dev/null and b/test_img/SSDLite_voc/HEXBIN-fp32-8-6-5-4-3-Summarization.png differ diff --git a/test_img/SSDLite_voc/VIOLIN-fp32-8-6-5-4-3-Summarization.png b/test_img/SSDLite_voc/VIOLIN-fp32-8-6-5-4-3-Summarization.png new file mode 100644 index 0000000..df916a6 Binary files /dev/null and b/test_img/SSDLite_voc/VIOLIN-fp32-8-6-5-4-3-Summarization.png differ diff --git a/test_img/SSDLite_voc/statistics_bar_summarization_all_iou_variation.png b/test_img/SSDLite_voc/statistics_bar_summarization_all_iou_variation.png new file mode 100644 index 0000000..b92eed2 Binary files /dev/null and b/test_img/SSDLite_voc/statistics_bar_summarization_all_iou_variation.png differ diff --git a/test_img/SSDLite_voc/statistics_bar_summarization_all_iou_variation_all.png b/test_img/SSDLite_voc/statistics_bar_summarization_all_iou_variation_all.png new file mode 100644 index 0000000..aaa1958 Binary files /dev/null and b/test_img/SSDLite_voc/statistics_bar_summarization_all_iou_variation_all.png differ diff --git a/test_img/SSDLite_voc/statistics_bar_summarization_cls0.9.png b/test_img/SSDLite_voc/statistics_bar_summarization_cls0.9.png new file mode 100644 index 0000000..28b0d70 Binary files /dev/null and b/test_img/SSDLite_voc/statistics_bar_summarization_cls0.9.png differ diff --git a/test_img/SSDLite_voc/statistics_bar_summarization_cls0.9_ok.png b/test_img/SSDLite_voc/statistics_bar_summarization_cls0.9_ok.png new file mode 100644 index 0000000..3203dbf Binary files /dev/null and b/test_img/SSDLite_voc/statistics_bar_summarization_cls0.9_ok.png differ diff --git a/test_img/SSDLite_voc/statistics_bar_summarization_iou0.9.png b/test_img/SSDLite_voc/statistics_bar_summarization_iou0.9.png new file mode 100644 index 0000000..47373e9 Binary files /dev/null and b/test_img/SSDLite_voc/statistics_bar_summarization_iou0.9.png differ diff --git a/tests/test_data/test_datasets/test_coco_dataset.py b/tests/test_data/test_datasets/test_coco_dataset.py new file mode 100644 index 0000000..77edfdf --- /dev/null +++ b/tests/test_data/test_datasets/test_coco_dataset.py @@ -0,0 +1,58 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +import tempfile + +import mmcv +import pytest + +from mmdet.datasets import CocoDataset + + +def _create_ids_error_coco_json(json_name): + image = { + 'id': 0, + 'width': 640, + 'height': 640, + 'file_name': 'fake_name.jpg', + } + + annotation_1 = { + 'id': 1, + 'image_id': 0, + 'category_id': 0, + 'area': 400, + 'bbox': [50, 60, 20, 20], + 'iscrowd': 0, + } + + annotation_2 = { + 'id': 1, + 'image_id': 0, + 'category_id': 0, + 'area': 900, + 'bbox': [100, 120, 30, 30], + 'iscrowd': 0, + } + + categories = [{ + 'id': 0, + 'name': 'car', + 'supercategory': 'car', + }] + + fake_json = { + 'images': [image], + 'annotations': [annotation_1, annotation_2], + 'categories': categories + } + mmcv.dump(fake_json, json_name) + + +def test_coco_annotation_ids_unique(): + tmp_dir = tempfile.TemporaryDirectory() + fake_json_file = osp.join(tmp_dir.name, 'fake_data.json') + _create_ids_error_coco_json(fake_json_file) + + # test annotation ids not unique error + with pytest.raises(AssertionError): + CocoDataset(ann_file=fake_json_file, classes=('car', ), pipeline=[]) diff --git a/tests/test_data/test_datasets/test_coco_occluded.py b/tests/test_data/test_datasets/test_coco_occluded.py new file mode 100644 index 0000000..8e612d0 --- /dev/null +++ b/tests/test_data/test_datasets/test_coco_occluded.py @@ -0,0 +1,38 @@ +import os.path as osp +from tempfile import TemporaryDirectory + +import mmcv +import numpy as np + +from mmdet.datasets import OccludedSeparatedCocoDataset + + +def test_occluded_separated_coco_dataset(): + ann = [[ + 'fake1.jpg', 'person', 8, [219.9, 176.12, 11.14, 34.23], { + 'size': [480, 640], + 'counts': b'nYW31n>2N2FNbA48Kf=?XBDe=m0OM3M4YOPB8_>L4JXao5' + } + ]] * 3 + dummy_mask = np.zeros((10, 10), dtype=np.uint8) + dummy_mask[:5, :5] = 1 + rle = { + 'size': [480, 640], + 'counts': b'nYW31n>2N2FNbA48Kf=?XBDe=m0OM3M4YOPB8_>L4JXao5' + } + res = [([np.array([[50, 60, 70, 80, 0.77]])] * 2, [[rle]] * 2)] * 3 + + tempdir = TemporaryDirectory() + ann_path = osp.join(tempdir.name, 'coco_occluded.pkl') + mmcv.dump(ann, ann_path) + + dataset = OccludedSeparatedCocoDataset( + ann_file='tests/data/coco_sample.json', + occluded_ann=ann_path, + separated_ann=ann_path, + pipeline=[], + test_mode=True) + eval_res = dataset.evaluate(res) + assert isinstance(eval_res, dict) + assert eval_res['occluded_recall'] == 100 + assert eval_res['separated_recall'] == 100 diff --git a/tests/test_data/test_datasets/test_common.py b/tests/test_data/test_datasets/test_common.py new file mode 100644 index 0000000..e3070da --- /dev/null +++ b/tests/test_data/test_datasets/test_common.py @@ -0,0 +1,369 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy +import logging +import os.path as osp +import tempfile +from unittest.mock import MagicMock, patch + +import mmcv +import numpy as np +import pytest +import torch +import torch.nn as nn +from mmcv.runner import EpochBasedRunner +from torch.utils.data import DataLoader + +from mmdet.core.evaluation import DistEvalHook, EvalHook +from mmdet.datasets import DATASETS, CocoDataset, CustomDataset, build_dataset + + +def _create_dummy_coco_json(json_name): + image = { + 'id': 0, + 'width': 640, + 'height': 640, + 'file_name': 'fake_name.jpg', + } + + annotation_1 = { + 'id': 1, + 'image_id': 0, + 'category_id': 0, + 'area': 400, + 'bbox': [50, 60, 20, 20], + 'iscrowd': 0, + } + + annotation_2 = { + 'id': 2, + 'image_id': 0, + 'category_id': 0, + 'area': 900, + 'bbox': [100, 120, 30, 30], + 'iscrowd': 0, + } + + annotation_3 = { + 'id': 3, + 'image_id': 0, + 'category_id': 0, + 'area': 1600, + 'bbox': [150, 160, 40, 40], + 'iscrowd': 0, + } + + annotation_4 = { + 'id': 4, + 'image_id': 0, + 'category_id': 0, + 'area': 10000, + 'bbox': [250, 260, 100, 100], + 'iscrowd': 0, + } + + categories = [{ + 'id': 0, + 'name': 'car', + 'supercategory': 'car', + }] + + fake_json = { + 'images': [image], + 'annotations': + [annotation_1, annotation_2, annotation_3, annotation_4], + 'categories': categories + } + + mmcv.dump(fake_json, json_name) + + +def _create_dummy_custom_pkl(pkl_name): + fake_pkl = [{ + 'filename': 'fake_name.jpg', + 'width': 640, + 'height': 640, + 'ann': { + 'bboxes': + np.array([[50, 60, 70, 80], [100, 120, 130, 150], + [150, 160, 190, 200], [250, 260, 350, 360]]), + 'labels': + np.array([0, 0, 0, 0]) + } + }] + mmcv.dump(fake_pkl, pkl_name) + + +def _create_dummy_results(): + boxes = [ + np.array([[50, 60, 70, 80, 1.0], [100, 120, 130, 150, 0.98], + [150, 160, 190, 200, 0.96], [250, 260, 350, 360, 0.95]]) + ] + return [boxes] + + +@pytest.mark.parametrize('config_path', + ['./configs/_base_/datasets/voc0712.py']) +def test_dataset_init(config_path, monkeypatch): + data_config = mmcv.Config.fromfile(config_path) + if 'data' not in data_config: + return + + monkeypatch.chdir('./tests/') # to use ./tests/data + stage_names = ['train', 'val', 'test'] + for stage_name in stage_names: + dataset_config = copy.deepcopy(data_config.data.get(stage_name)) + dataset = build_dataset(dataset_config) + dataset[0] + + +def test_dataset_evaluation(): + tmp_dir = tempfile.TemporaryDirectory() + # create dummy data + fake_json_file = osp.join(tmp_dir.name, 'fake_data.json') + _create_dummy_coco_json(fake_json_file) + + # test single coco dataset evaluation + coco_dataset = CocoDataset( + ann_file=fake_json_file, classes=('car', ), pipeline=[]) + fake_results = _create_dummy_results() + eval_results = coco_dataset.evaluate(fake_results, classwise=True) + assert eval_results['bbox_mAP'] == 1 + assert eval_results['bbox_mAP_50'] == 1 + assert eval_results['bbox_mAP_75'] == 1 + + # test concat dataset evaluation + fake_concat_results = _create_dummy_results() + _create_dummy_results() + + # build concat dataset through two config dict + coco_cfg = dict( + type='CocoDataset', + ann_file=fake_json_file, + classes=('car', ), + pipeline=[]) + concat_cfgs = [coco_cfg, coco_cfg] + concat_dataset = build_dataset(concat_cfgs) + eval_results = concat_dataset.evaluate(fake_concat_results) + assert eval_results['0_bbox_mAP'] == 1 + assert eval_results['0_bbox_mAP_50'] == 1 + assert eval_results['0_bbox_mAP_75'] == 1 + assert eval_results['1_bbox_mAP'] == 1 + assert eval_results['1_bbox_mAP_50'] == 1 + assert eval_results['1_bbox_mAP_75'] == 1 + + # build concat dataset through concatenated ann_file + coco_cfg = dict( + type='CocoDataset', + ann_file=[fake_json_file, fake_json_file], + classes=('car', ), + pipeline=[]) + concat_dataset = build_dataset(coco_cfg) + eval_results = concat_dataset.evaluate(fake_concat_results) + assert eval_results['0_bbox_mAP'] == 1 + assert eval_results['0_bbox_mAP_50'] == 1 + assert eval_results['0_bbox_mAP_75'] == 1 + assert eval_results['1_bbox_mAP'] == 1 + assert eval_results['1_bbox_mAP_50'] == 1 + assert eval_results['1_bbox_mAP_75'] == 1 + + # create dummy data + fake_pkl_file = osp.join(tmp_dir.name, 'fake_data.pkl') + _create_dummy_custom_pkl(fake_pkl_file) + + # test single custom dataset evaluation + custom_dataset = CustomDataset( + ann_file=fake_pkl_file, classes=('car', ), pipeline=[]) + fake_results = _create_dummy_results() + eval_results = custom_dataset.evaluate(fake_results) + assert eval_results['mAP'] == 1 + + # test concat dataset evaluation + fake_concat_results = _create_dummy_results() + _create_dummy_results() + + # build concat dataset through two config dict + custom_cfg = dict( + type='CustomDataset', + ann_file=fake_pkl_file, + classes=('car', ), + pipeline=[]) + concat_cfgs = [custom_cfg, custom_cfg] + concat_dataset = build_dataset(concat_cfgs) + eval_results = concat_dataset.evaluate(fake_concat_results) + assert eval_results['0_mAP'] == 1 + assert eval_results['1_mAP'] == 1 + + # build concat dataset through concatenated ann_file + concat_cfg = dict( + type='CustomDataset', + ann_file=[fake_pkl_file, fake_pkl_file], + classes=('car', ), + pipeline=[]) + concat_dataset = build_dataset(concat_cfg) + eval_results = concat_dataset.evaluate(fake_concat_results) + assert eval_results['0_mAP'] == 1 + assert eval_results['1_mAP'] == 1 + + # build concat dataset through explicit type + concat_cfg = dict( + type='ConcatDataset', + datasets=[custom_cfg, custom_cfg], + separate_eval=False) + concat_dataset = build_dataset(concat_cfg) + eval_results = concat_dataset.evaluate(fake_concat_results, metric='mAP') + assert eval_results['mAP'] == 1 + assert len(concat_dataset.datasets[0].data_infos) == \ + len(concat_dataset.datasets[1].data_infos) + assert len(concat_dataset.datasets[0].data_infos) == 1 + tmp_dir.cleanup() + + +@patch('mmdet.apis.single_gpu_test', MagicMock) +@patch('mmdet.apis.multi_gpu_test', MagicMock) +@pytest.mark.parametrize('EvalHookParam', (EvalHook, DistEvalHook)) +def test_evaluation_hook(EvalHookParam): + # create dummy data + dataloader = DataLoader(torch.ones((5, 2))) + + # 0.1. dataloader is not a DataLoader object + with pytest.raises(TypeError): + EvalHookParam(dataloader=MagicMock(), interval=-1) + + # 0.2. negative interval + with pytest.raises(ValueError): + EvalHookParam(dataloader, interval=-1) + + # 1. start=None, interval=1: perform evaluation after each epoch. + runner = _build_demo_runner() + evalhook = EvalHookParam(dataloader, interval=1) + evalhook.evaluate = MagicMock() + runner.register_hook(evalhook) + runner.run([dataloader], [('train', 1)], 2) + assert evalhook.evaluate.call_count == 2 # after epoch 1 & 2 + + # 2. start=1, interval=1: perform evaluation after each epoch. + runner = _build_demo_runner() + + evalhook = EvalHookParam(dataloader, start=1, interval=1) + evalhook.evaluate = MagicMock() + runner.register_hook(evalhook) + runner.run([dataloader], [('train', 1)], 2) + assert evalhook.evaluate.call_count == 2 # after epoch 1 & 2 + + # 3. start=None, interval=2: perform evaluation after epoch 2, 4, 6, etc + runner = _build_demo_runner() + evalhook = EvalHookParam(dataloader, interval=2) + evalhook.evaluate = MagicMock() + runner.register_hook(evalhook) + runner.run([dataloader], [('train', 1)], 2) + assert evalhook.evaluate.call_count == 1 # after epoch 2 + + # 4. start=1, interval=2: perform evaluation after epoch 1, 3, 5, etc + runner = _build_demo_runner() + evalhook = EvalHookParam(dataloader, start=1, interval=2) + evalhook.evaluate = MagicMock() + runner.register_hook(evalhook) + runner.run([dataloader], [('train', 1)], 3) + assert evalhook.evaluate.call_count == 2 # after epoch 1 & 3 + + # 5. start=0/negative, interval=1: perform evaluation after each epoch and + # before epoch 1. + runner = _build_demo_runner() + evalhook = EvalHookParam(dataloader, start=0) + evalhook.evaluate = MagicMock() + runner.register_hook(evalhook) + runner.run([dataloader], [('train', 1)], 2) + assert evalhook.evaluate.call_count == 3 # before epoch1 and after e1 & e2 + + # 6. start=0, interval=2, dynamic_intervals=[(3, 1)]: the evaluation + # interval is 2 when it is less than 3 epoch, otherwise it is 1. + runner = _build_demo_runner() + evalhook = EvalHookParam( + dataloader, start=0, interval=2, dynamic_intervals=[(3, 1)]) + evalhook.evaluate = MagicMock() + runner.register_hook(evalhook) + runner.run([dataloader], [('train', 1)], 4) + assert evalhook.evaluate.call_count == 3 + + # the evaluation start epoch cannot be less than 0 + runner = _build_demo_runner() + with pytest.raises(ValueError): + EvalHookParam(dataloader, start=-2) + + evalhook = EvalHookParam(dataloader, start=0) + evalhook.evaluate = MagicMock() + runner.register_hook(evalhook) + runner.run([dataloader], [('train', 1)], 2) + assert evalhook.evaluate.call_count == 3 # before epoch1 and after e1 & e2 + + # 6. resuming from epoch i, start = x (x<=i), interval =1: perform + # evaluation after each epoch and before the first epoch. + runner = _build_demo_runner() + evalhook = EvalHookParam(dataloader, start=1) + evalhook.evaluate = MagicMock() + runner.register_hook(evalhook) + runner._epoch = 2 + runner.run([dataloader], [('train', 1)], 3) + assert evalhook.evaluate.call_count == 2 # before & after epoch 3 + + # 7. resuming from epoch i, start = i+1/None, interval =1: perform + # evaluation after each epoch. + runner = _build_demo_runner() + evalhook = EvalHookParam(dataloader, start=2) + evalhook.evaluate = MagicMock() + runner.register_hook(evalhook) + runner._epoch = 1 + runner.run([dataloader], [('train', 1)], 3) + assert evalhook.evaluate.call_count == 2 # after epoch 2 & 3 + + +def _build_demo_runner(): + + class Model(nn.Module): + + def __init__(self): + super().__init__() + self.linear = nn.Linear(2, 1) + + def forward(self, x): + return self.linear(x) + + def train_step(self, x, optimizer, **kwargs): + return dict(loss=self(x)) + + def val_step(self, x, optimizer, **kwargs): + return dict(loss=self(x)) + + model = Model() + tmp_dir = tempfile.mkdtemp() + + runner = EpochBasedRunner( + model=model, work_dir=tmp_dir, logger=logging.getLogger()) + return runner + + +@pytest.mark.parametrize('classes, expected_length', [(['bus'], 2), + (['car'], 1), + (['bus', 'car'], 2)]) +def test_allow_empty_images(classes, expected_length): + dataset_class = DATASETS.get('CocoDataset') + # Filter empty images + filtered_dataset = dataset_class( + ann_file='tests/data/coco_sample.json', + img_prefix='tests/data', + pipeline=[], + classes=classes, + filter_empty_gt=True) + + # Get all + full_dataset = dataset_class( + ann_file='tests/data/coco_sample.json', + img_prefix='tests/data', + pipeline=[], + classes=classes, + filter_empty_gt=False) + + assert len(filtered_dataset) == expected_length + assert len(filtered_dataset.img_ids) == expected_length + assert len(full_dataset) == 3 + assert len(full_dataset.img_ids) == 3 + assert filtered_dataset.CLASSES == classes + assert full_dataset.CLASSES == classes diff --git a/tests/test_data/test_datasets/test_custom_dataset.py b/tests/test_data/test_datasets/test_custom_dataset.py new file mode 100644 index 0000000..4dae464 --- /dev/null +++ b/tests/test_data/test_datasets/test_custom_dataset.py @@ -0,0 +1,138 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +import unittest +from unittest.mock import MagicMock, patch + +import pytest + +from mmdet.datasets import DATASETS + + +@patch('mmdet.datasets.CocoDataset.load_annotations', MagicMock()) +@patch('mmdet.datasets.CustomDataset.load_annotations', MagicMock()) +@patch('mmdet.datasets.XMLDataset.load_annotations', MagicMock()) +@patch('mmdet.datasets.CityscapesDataset.load_annotations', MagicMock()) +@patch('mmdet.datasets.CocoDataset._filter_imgs', MagicMock) +@patch('mmdet.datasets.CustomDataset._filter_imgs', MagicMock) +@patch('mmdet.datasets.XMLDataset._filter_imgs', MagicMock) +@patch('mmdet.datasets.CityscapesDataset._filter_imgs', MagicMock) +@pytest.mark.parametrize('dataset', + ['CocoDataset', 'VOCDataset', 'CityscapesDataset']) +def test_custom_classes_override_default(dataset): + dataset_class = DATASETS.get(dataset) + if dataset in ['CocoDataset', 'CityscapesDataset']: + dataset_class.coco = MagicMock() + dataset_class.cat_ids = MagicMock() + + original_classes = dataset_class.CLASSES + + # Test setting classes as a tuple + custom_dataset = dataset_class( + ann_file=MagicMock(), + pipeline=[], + classes=('bus', 'car'), + test_mode=True, + img_prefix='VOC2007' if dataset == 'VOCDataset' else '') + + assert custom_dataset.CLASSES != original_classes + assert custom_dataset.CLASSES == ('bus', 'car') + print(custom_dataset) + + # Test setting classes as a list + custom_dataset = dataset_class( + ann_file=MagicMock(), + pipeline=[], + classes=['bus', 'car'], + test_mode=True, + img_prefix='VOC2007' if dataset == 'VOCDataset' else '') + + assert custom_dataset.CLASSES != original_classes + assert custom_dataset.CLASSES == ['bus', 'car'] + print(custom_dataset) + + # Test overriding not a subset + custom_dataset = dataset_class( + ann_file=MagicMock(), + pipeline=[], + classes=['foo'], + test_mode=True, + img_prefix='VOC2007' if dataset == 'VOCDataset' else '') + + assert custom_dataset.CLASSES != original_classes + assert custom_dataset.CLASSES == ['foo'] + print(custom_dataset) + + # Test default behavior + custom_dataset = dataset_class( + ann_file=MagicMock(), + pipeline=[], + classes=None, + test_mode=True, + img_prefix='VOC2007' if dataset == 'VOCDataset' else '') + + assert custom_dataset.CLASSES == original_classes + print(custom_dataset) + + # Test sending file path + import tempfile + with tempfile.TemporaryDirectory() as tmpdir: + path = tmpdir + 'classes.txt' + with open(path, 'w') as f: + f.write('bus\ncar\n') + custom_dataset = dataset_class( + ann_file=MagicMock(), + pipeline=[], + classes=path, + test_mode=True, + img_prefix='VOC2007' if dataset == 'VOCDataset' else '') + + assert custom_dataset.CLASSES != original_classes + assert custom_dataset.CLASSES == ['bus', 'car'] + print(custom_dataset) + + +class CustomDatasetTests(unittest.TestCase): + + def setUp(self): + super().setUp() + self.data_dir = osp.join( + osp.dirname(osp.dirname(osp.dirname(__file__))), 'data') + self.dataset_class = DATASETS.get('XMLDataset') + + def test_data_infos__default_db_directories(self): + """Test correct data read having a Pacal-VOC directory structure.""" + test_dataset_root = osp.join(self.data_dir, 'VOCdevkit', 'VOC2007') + custom_ds = self.dataset_class( + data_root=test_dataset_root, + ann_file=osp.join(test_dataset_root, 'ImageSets', 'Main', + 'trainval.txt'), + pipeline=[], + classes=('person', 'dog'), + test_mode=True) + + self.assertListEqual([{ + 'id': '000001', + 'filename': osp.join('JPEGImages', '000001.jpg'), + 'width': 353, + 'height': 500 + }], custom_ds.data_infos) + + def test_data_infos__overridden_db_subdirectories(self): + """Test correct data read having a customized directory structure.""" + test_dataset_root = osp.join(self.data_dir, 'custom_dataset') + custom_ds = self.dataset_class( + data_root=test_dataset_root, + ann_file=osp.join(test_dataset_root, 'trainval.txt'), + pipeline=[], + classes=('person', 'dog'), + test_mode=True, + img_prefix='', + img_subdir='images', + ann_subdir='images') + + self.assertListEqual([{ + 'id': '000001', + 'filename': osp.join('images', '000001.jpg'), + 'width': 353, + 'height': 500 + }], custom_ds.data_infos) diff --git a/tests/test_data/test_datasets/test_dataset_wrapper.py b/tests/test_data/test_datasets/test_dataset_wrapper.py new file mode 100644 index 0000000..ad29678 --- /dev/null +++ b/tests/test_data/test_datasets/test_dataset_wrapper.py @@ -0,0 +1,209 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import bisect +import math +from collections import defaultdict +from unittest.mock import MagicMock + +import numpy as np +import pytest + +from mmdet.datasets import (ClassBalancedDataset, ConcatDataset, CustomDataset, + MultiImageMixDataset, RepeatDataset) + + +def test_dataset_wrapper(): + CustomDataset.load_annotations = MagicMock() + CustomDataset.__getitem__ = MagicMock(side_effect=lambda idx: idx) + dataset_a = CustomDataset( + ann_file=MagicMock(), pipeline=[], test_mode=True, img_prefix='') + len_a = 10 + cat_ids_list_a = [ + np.random.randint(0, 80, num).tolist() + for num in np.random.randint(1, 20, len_a) + ] + ann_info_list_a = [] + for _ in range(len_a): + height = np.random.randint(10, 30) + weight = np.random.randint(10, 30) + img = np.ones((height, weight, 3)) + gt_bbox = np.concatenate([ + np.random.randint(1, 5, (2, 2)), + np.random.randint(1, 5, (2, 2)) + 5 + ], + axis=1) + gt_labels = np.random.randint(0, 80, 2) + ann_info_list_a.append( + dict(gt_bboxes=gt_bbox, gt_labels=gt_labels, img=img)) + dataset_a.data_infos = MagicMock() + dataset_a.data_infos.__len__.return_value = len_a + dataset_a.get_cat_ids = MagicMock( + side_effect=lambda idx: cat_ids_list_a[idx]) + dataset_a.get_ann_info = MagicMock( + side_effect=lambda idx: ann_info_list_a[idx]) + dataset_b = CustomDataset( + ann_file=MagicMock(), pipeline=[], test_mode=True, img_prefix='') + len_b = 20 + cat_ids_list_b = [ + np.random.randint(0, 80, num).tolist() + for num in np.random.randint(1, 20, len_b) + ] + ann_info_list_b = [] + for _ in range(len_b): + height = np.random.randint(10, 30) + weight = np.random.randint(10, 30) + img = np.ones((height, weight, 3)) + gt_bbox = np.concatenate([ + np.random.randint(1, 5, (2, 2)), + np.random.randint(1, 5, (2, 2)) + 5 + ], + axis=1) + gt_labels = np.random.randint(0, 80, 2) + ann_info_list_b.append( + dict(gt_bboxes=gt_bbox, gt_labels=gt_labels, img=img)) + dataset_b.data_infos = MagicMock() + dataset_b.data_infos.__len__.return_value = len_b + dataset_b.get_cat_ids = MagicMock( + side_effect=lambda idx: cat_ids_list_b[idx]) + dataset_b.get_ann_info = MagicMock( + side_effect=lambda idx: ann_info_list_b[idx]) + + concat_dataset = ConcatDataset([dataset_a, dataset_b]) + assert concat_dataset[5] == 5 + assert concat_dataset[25] == 15 + assert concat_dataset.get_cat_ids(5) == cat_ids_list_a[5] + assert concat_dataset.get_cat_ids(25) == cat_ids_list_b[15] + assert concat_dataset.get_ann_info(5) == ann_info_list_a[5] + assert concat_dataset.get_ann_info(25) == ann_info_list_b[15] + assert len(concat_dataset) == len(dataset_a) + len(dataset_b) + + # Test if ConcatDataset allows dataset classes without the PALETTE + # attribute + palette_backup = CustomDataset.PALETTE + delattr(CustomDataset, 'PALETTE') + concat_dataset = ConcatDataset([dataset_a, dataset_b]) + assert concat_dataset.PALETTE is None + CustomDataset.PALETTE = palette_backup + + repeat_dataset = RepeatDataset(dataset_a, 10) + assert repeat_dataset[5] == 5 + assert repeat_dataset[15] == 5 + assert repeat_dataset[27] == 7 + assert repeat_dataset.get_cat_ids(5) == cat_ids_list_a[5] + assert repeat_dataset.get_cat_ids(15) == cat_ids_list_a[5] + assert repeat_dataset.get_cat_ids(27) == cat_ids_list_a[7] + assert repeat_dataset.get_ann_info(5) == ann_info_list_a[5] + assert repeat_dataset.get_ann_info(15) == ann_info_list_a[5] + assert repeat_dataset.get_ann_info(27) == ann_info_list_a[7] + assert len(repeat_dataset) == 10 * len(dataset_a) + + # Test if RepeatDataset allows dataset classes without the PALETTE + # attribute + delattr(CustomDataset, 'PALETTE') + repeat_dataset = RepeatDataset(dataset_a, 10) + assert repeat_dataset.PALETTE is None + CustomDataset.PALETTE = palette_backup + + category_freq = defaultdict(int) + for cat_ids in cat_ids_list_a: + cat_ids = set(cat_ids) + for cat_id in cat_ids: + category_freq[cat_id] += 1 + for k, v in category_freq.items(): + category_freq[k] = v / len(cat_ids_list_a) + + mean_freq = np.mean(list(category_freq.values())) + repeat_thr = mean_freq + + category_repeat = { + cat_id: max(1.0, math.sqrt(repeat_thr / cat_freq)) + for cat_id, cat_freq in category_freq.items() + } + + repeat_factors = [] + for cat_ids in cat_ids_list_a: + cat_ids = set(cat_ids) + repeat_factor = max({category_repeat[cat_id] for cat_id in cat_ids}) + repeat_factors.append(math.ceil(repeat_factor)) + repeat_factors_cumsum = np.cumsum(repeat_factors) + repeat_factor_dataset = ClassBalancedDataset(dataset_a, repeat_thr) + assert len(repeat_factor_dataset) == repeat_factors_cumsum[-1] + for idx in np.random.randint(0, len(repeat_factor_dataset), 3): + assert repeat_factor_dataset[idx] == bisect.bisect_right( + repeat_factors_cumsum, idx) + assert repeat_factor_dataset.get_ann_info(idx) == ann_info_list_a[ + bisect.bisect_right(repeat_factors_cumsum, idx)] + # Test if ClassBalancedDataset allows dataset classes without the PALETTE + # attribute + delattr(CustomDataset, 'PALETTE') + repeat_factor_dataset = ClassBalancedDataset(dataset_a, repeat_thr) + assert repeat_factor_dataset.PALETTE is None + CustomDataset.PALETTE = palette_backup + + img_scale = (60, 60) + pipeline = [ + dict(type='Mosaic', img_scale=img_scale, pad_val=114.0), + dict( + type='RandomAffine', + scaling_ratio_range=(0.1, 2), + border=(-img_scale[0] // 2, -img_scale[1] // 2)), + dict( + type='MixUp', + img_scale=img_scale, + ratio_range=(0.8, 1.6), + pad_val=114.0), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Resize', img_scale=img_scale, keep_ratio=True), + dict(type='Pad', pad_to_square=True, pad_val=114.0), + ] + + CustomDataset.load_annotations = MagicMock() + results = [] + for _ in range(2): + height = np.random.randint(10, 30) + weight = np.random.randint(10, 30) + img = np.ones((height, weight, 3)) + gt_bbox = np.concatenate([ + np.random.randint(1, 5, (2, 2)), + np.random.randint(1, 5, (2, 2)) + 5 + ], + axis=1) + gt_labels = np.random.randint(0, 80, 2) + results.append(dict(gt_bboxes=gt_bbox, gt_labels=gt_labels, img=img)) + + CustomDataset.__getitem__ = MagicMock(side_effect=lambda idx: results[idx]) + dataset_a = CustomDataset( + ann_file=MagicMock(), pipeline=[], test_mode=True, img_prefix='') + len_a = 2 + cat_ids_list_a = [ + np.random.randint(0, 80, num).tolist() + for num in np.random.randint(1, 20, len_a) + ] + dataset_a.data_infos = MagicMock() + dataset_a.data_infos.__len__.return_value = len_a + dataset_a.get_cat_ids = MagicMock( + side_effect=lambda idx: cat_ids_list_a[idx]) + + # test dynamic_scale deprecated + with pytest.raises(RuntimeError): + MultiImageMixDataset(dataset_a, pipeline, (80, 80)) + + multi_image_mix_dataset = MultiImageMixDataset(dataset_a, pipeline) + for idx in range(len_a): + results_ = multi_image_mix_dataset[idx] + assert results_['img'].shape == (img_scale[0], img_scale[1], 3) + + # test skip_type_keys + multi_image_mix_dataset = MultiImageMixDataset( + dataset_a, + pipeline, + skip_type_keys=('MixUp', 'RandomFlip', 'Resize', 'Pad')) + for idx in range(len_a): + results_ = multi_image_mix_dataset[idx] + assert results_['img'].shape == (img_scale[0], img_scale[1], 3) + + # Test if MultiImageMixDataset allows dataset classes without the PALETTE + # attribute + delattr(CustomDataset, 'PALETTE') + multi_image_mix_dataset = MultiImageMixDataset(dataset_a, pipeline) + assert multi_image_mix_dataset.PALETTE is None + CustomDataset.PALETTE = palette_backup diff --git a/tests/test_data/test_datasets/test_objects365.py b/tests/test_data/test_datasets/test_objects365.py new file mode 100644 index 0000000..7445188 --- /dev/null +++ b/tests/test_data/test_datasets/test_objects365.py @@ -0,0 +1,155 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +import tempfile + +import mmcv +import pytest + +from mmdet.datasets import Objects365V1Dataset, Objects365V2Dataset + + +def _create_objects365_json(json_name): + images = [{ + 'file_name': 'fake1.jpg', + 'height': 800, + 'width': 800, + 'id': 0 + }, { + 'file_name': 'fake2.jpg', + 'height': 800, + 'width': 800, + 'id': 1 + }, { + 'file_name': 'patch16/objects365_v2_00908726.jpg', + 'height': 800, + 'width': 800, + 'id': 2 + }] + + annotations = [{ + 'bbox': [0, 0, 20, 20], + 'area': 400.00, + 'score': 1.0, + 'category_id': 1, + 'id': 1, + 'image_id': 0 + }, { + 'bbox': [0, 0, 20, 20], + 'area': 400.00, + 'score': 1.0, + 'category_id': 2, + 'id': 2, + 'image_id': 0 + }, { + 'bbox': [0, 0, 20, 20], + 'area': 400.00, + 'score': 1.0, + 'category_id': 1, + 'id': 3, + 'image_id': 1 + }, { + 'bbox': [0, 0, 20, 20], + 'area': 400.00, + 'score': 1.0, + 'category_id': 1, + 'id': 4, + 'image_id': 2 + }] + + categories = [{ + 'id': 1, + 'name': 'bus', + 'supercategory': 'none' + }, { + 'id': 2, + 'name': 'car', + 'supercategory': 'none' + }] + + fake_json = { + 'images': images, + 'annotations': annotations, + 'categories': categories + } + print(fake_json) + mmcv.dump(fake_json, json_name) + + +def _create_ids_error_coco_json(json_name): + image = { + 'id': 0, + 'width': 640, + 'height': 640, + 'file_name': 'fake_name.jpg', + } + + annotation_1 = { + 'id': 1, + 'image_id': 0, + 'category_id': 0, + 'area': 400, + 'bbox': [50, 60, 20, 20], + 'iscrowd': 0, + } + + annotation_2 = { + 'id': 1, + 'image_id': 0, + 'category_id': 0, + 'area': 900, + 'bbox': [100, 120, 30, 30], + 'iscrowd': 0, + } + + categories = [{ + 'id': 0, + 'name': 'car', + 'supercategory': 'car', + }] + + fake_json = { + 'images': [image], + 'annotations': [annotation_1, annotation_2], + 'categories': categories + } + mmcv.dump(fake_json, json_name) + + +@pytest.mark.parametrize('datasets', + [Objects365V1Dataset, Objects365V2Dataset]) +def test_annotation_ids_unique(datasets): + tmp_dir = tempfile.TemporaryDirectory() + fake_json_file = osp.join(tmp_dir.name, 'fake_data.json') + _create_ids_error_coco_json(fake_json_file) + + # test annotation ids not unique error + with pytest.raises(AssertionError): + datasets(ann_file=fake_json_file, classes=('car', ), pipeline=[]) + + tmp_dir.cleanup() + + +def test_load_objects365v1_annotations(): + tmp_dir = tempfile.TemporaryDirectory() + fake_json_file = osp.join(tmp_dir.name, 'fake_data.json') + _create_objects365_json(fake_json_file) + + dataset = Objects365V1Dataset( + ann_file=fake_json_file, classes=('bus', 'car'), pipeline=[]) + + # The Objects365V1Dataset do not filter the `objv2_ignore_list` + assert len(dataset.data_infos) == 3 + tmp_dir.cleanup() + + +def test_load_objects365v2_annotations(): + tmp_dir = tempfile.TemporaryDirectory() + fake_json_file = osp.join(tmp_dir.name, 'fake_data.json') + _create_objects365_json(fake_json_file) + + dataset = Objects365V2Dataset( + ann_file=fake_json_file, classes=('bus', 'car'), pipeline=[]) + + # The Objects365V2Dataset need filter the `objv2_ignore_list` + assert len(dataset.data_infos) == 2 + tmp_dir.cleanup() diff --git a/tests/test_data/test_datasets/test_openimages_dataset.py b/tests/test_data/test_datasets/test_openimages_dataset.py new file mode 100644 index 0000000..af87e96 --- /dev/null +++ b/tests/test_data/test_datasets/test_openimages_dataset.py @@ -0,0 +1,367 @@ +import csv +import os.path as osp +import tempfile + +import mmcv +import numpy as np +import pytest + +from mmdet.datasets import OpenImagesChallengeDataset, OpenImagesDataset + + +def _create_ids_error_oid_csv( + label_file, + fake_csv_file, +): + label_description = ['/m/000002', 'Football'] + # `newline=''` is used to avoid index error of out of bounds + # in Windows system + with open(label_file, 'w', newline='') as f: + f_csv = csv.writer(f) + f_csv.writerow(label_description) + + header = [ + 'ImageID', 'Source', 'LabelName', 'Confidence', 'XMin', 'XMax', 'YMin', + 'YMax', 'IsOccluded', 'IsTruncated', 'IsGroupOf', 'IsDepiction', + 'IsInside' + ] + annotations = [[ + 'color', 'xclick', '/m/000002', '1', '0.022673031', '0.9642005', + '0.07103825', '0.80054647', '0', '0', '0', '0', '0' + ], + [ + '000595fe6fee6369', 'xclick', '/m/000000', '1', '0', + '1', '0', '1', '0', '0', '1', '0', '0' + ]] + # `newline=''` is used to avoid index error of out of bounds + # in Windows system + with open(fake_csv_file, 'w', newline='') as f: + f_csv = csv.writer(f) + f_csv.writerow(header) + f_csv.writerows(annotations) + + +def _create_oid_style_ann(label_file, csv_file, label_level_file): + label_description = [['/m/000000', 'Sports equipment'], + ['/m/000001', 'Ball'], ['/m/000002', 'Football'], + ['/m/000004', 'Bicycle']] + with open(label_file, 'w', newline='') as f: + f_csv = csv.writer(f) + f_csv.writerows(label_description) + + header = [ + 'ImageID', 'Source', 'LabelName', 'Confidence', 'XMin', 'XMax', 'YMin', + 'YMax', 'IsOccluded', 'IsTruncated', 'IsGroupOf', 'IsDepiction', + 'IsInside' + ] + annotations = [ + [ + 'color', 'xclick', '/m/000002', 1, 0.0333333, 0.1, 0.0333333, 0.1, + 0, 0, 1, 0, 0 + ], + [ + 'color', 'xclick', '/m/000002', 1, 0.1, 0.166667, 0.1, 0.166667, 0, + 0, 0, 0, 0 + ], + ] + # `newline=''` is used to avoid index error of out of bounds + # in Windows system + with open(csv_file, 'w', newline='') as f: + f_csv = csv.writer(f) + f_csv.writerow(header) + f_csv.writerows(annotations) + + header = ['ImageID', 'Source', 'LabelName', 'Confidence'] + annotations = [['color', 'xclick', '/m/000002', '1'], + ['color', 'xclick', '/m/000004', '0']] + # `newline=''` is used to avoid index error of out of bounds + # in Windows system + with open(label_level_file, 'w', newline='') as f: + f_csv = csv.writer(f) + f_csv.writerow(header) + f_csv.writerows(annotations) + + +def _create_hierarchy_json(hierarchy_name): + fake_hierarchy = \ + {'LabelName': '/m/0bl9f', # entity label + 'Subcategory': [ + { + 'LabelName': '/m/000000', + 'Subcategory': + [ + {'LabelName': '/m/000001', + 'Subcategory': + [ + { + 'LabelName': '/m/000002' + } + ] + }, + { + 'LabelName': '/m/000004' + } + ] + } + ] + } + + mmcv.dump(fake_hierarchy, hierarchy_name) + + +def _create_hierarchy_np(hierarchy_name): + fake_hierarchy = np.array([[0, 1, 0, 0, 0], [0, 1, 1, 0, + 0], [0, 1, 1, 1, 0], + [0, 1, 0, 0, 1], [0, 0, 0, 0, 0]]) + with open(hierarchy_name, 'wb') as f: + np.save(f, fake_hierarchy) + + +def _create_dummy_results(): + boxes = [ + np.zeros((0, 5)), + np.zeros((0, 5)), + np.array([[10, 10, 15, 15, 1.0], [15, 15, 30, 30, 0.98], + [10, 10, 25, 25, 0.98], [28, 28, 35, 35, 0.97], + [30, 30, 51, 51, 0.96], [100, 110, 120, 130, 0.15]]), + np.array([[30, 30, 50, 50, 0.51]]), + ] + return [boxes] + + +def _creat_oid_challenge_style_ann(txt_file, label_file, label_level_file): + bboxes = [ + 'validation/color.jpg\n', + '4 29\n', + '2\n', + '1 0.0333333 0.1 0.0333333 0.1 1\n', + '1 0.1 0.166667 0.1 0.166667 0\n', + ] + # `newline=''` is used to avoid index error of out of bounds + # in Windows system + with open(txt_file, 'w', newline='') as f: + f.writelines(bboxes) + f.close() + + label_description = [['/m/000000', 'Sports equipment', 1], + ['/m/000001', 'Ball', 2], + ['/m/000002', 'Football', 3], + ['/m/000004', 'Bicycle', 4]] + # `newline=''` is used to avoid index error of out of bounds + # in Windows system + with open(label_file, 'w', newline='') as f: + f_csv = csv.writer(f) + f_csv.writerows(label_description) + + header = ['ImageID', 'LabelName', 'Confidence'] + annotations = [['color', '/m/000001', '1'], ['color', '/m/000000', '0']] + # `newline=''` is used to avoid index error of out of bounds + # in Windows system + with open(label_level_file, 'w', newline='') as f: + f_csv = csv.writer(f) + f_csv.writerow(header) + f_csv.writerows(annotations) + + +def _create_metas(meta_file): + + fake_meta = [{ + 'filename': 'data/OpenImages/OpenImages/validation/color.jpg', + 'ori_shape': (300, 300, 3) + }] + mmcv.dump(fake_meta, meta_file) + + +def test_oid_annotation_ids_unique(): + # create fake ann files + tmp_dir = tempfile.TemporaryDirectory() + fake_label_file = osp.join(tmp_dir.name, 'fake_label.csv') + fake_ann_file = osp.join(tmp_dir.name, 'fake_ann.csv') + _create_ids_error_oid_csv(fake_label_file, fake_ann_file) + + # test annotation ids not unique error + with pytest.raises(AssertionError): + OpenImagesDataset( + ann_file=fake_ann_file, label_file=fake_label_file, pipeline=[]) + tmp_dir.cleanup() + + +def test_openimages_dataset(): + # create fake ann files + tmp_dir = tempfile.TemporaryDirectory() + label_file = osp.join(tmp_dir.name, 'label_file.csv') + ann_file = osp.join(tmp_dir.name, 'ann_file.csv') + label_level_file = osp.join(tmp_dir.name, 'label_level_file.csv') + _create_oid_style_ann(label_file, ann_file, label_level_file) + + hierarchy_json = osp.join(tmp_dir.name, 'hierarchy.json') + _create_hierarchy_json(hierarchy_json) + + # test whether hierarchy_file is not None when set + # get_parent_classes is True + with pytest.raises(AssertionError): + OpenImagesDataset( + ann_file=ann_file, + label_file=label_file, + image_level_ann_file=label_level_file, + pipeline=[]) + + dataset = OpenImagesDataset( + ann_file=ann_file, + label_file=label_file, + image_level_ann_file=label_level_file, + hierarchy_file=hierarchy_json, + pipeline=[]) + ann = dataset.get_ann_info(0) + # two legal detection bboxes with `group_of` parameter + assert ann['bboxes'].shape[0] == ann['labels'].shape[0] == \ + ann['gt_is_group_ofs'].shape[0] == 2 + + # test load metas from pipeline + img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True) + test_pipeline = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(128, 128), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize', **img_norm_cfg), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) + ] + dataset = OpenImagesDataset( + ann_file=ann_file, + img_prefix='tests/data', + label_file=label_file, + image_level_ann_file=label_level_file, + load_from_file=False, + hierarchy_file=hierarchy_json, + pipeline=test_pipeline) + dataset.prepare_test_img(0) + assert len(dataset.test_img_metas) == 1 + result = _create_dummy_results() + dataset.evaluate(result) + + # test get hierarchy for classes + hierarchy_json = osp.join(tmp_dir.name, 'hierarchy.json') + _create_hierarchy_json(hierarchy_json) + + # test with hierarchy file wrong suffix + with pytest.raises(AssertionError): + fake_path = osp.join(tmp_dir.name, 'hierarchy.csv') + OpenImagesDataset( + ann_file=ann_file, + img_prefix='tests/data', + label_file=label_file, + image_level_ann_file=label_level_file, + load_from_file=False, + hierarchy_file=fake_path, + pipeline=test_pipeline) + + # test load hierarchy file succseefully + hierarchy = dataset.get_relation_matrix(hierarchy_json) + hierarchy_gt = np.array([[1, 0, 0, 0], [1, 1, 0, 0], [1, 1, 1, 0], + [1, 0, 0, 1]]) + assert np.equal(hierarchy, hierarchy_gt).all() + + # test evaluation + # create fake metas + meta_file = osp.join(tmp_dir.name, 'meta.pkl') + _create_metas(meta_file) + + dataset = OpenImagesDataset( + ann_file=ann_file, + label_file=label_file, + image_level_ann_file=label_level_file, + hierarchy_file=hierarchy_json, + meta_file=meta_file, + pipeline=[]) + # test evaluation with using group_of, adding father classes to + # GT and annotations, and considering image_level_image, + # In the first label (Sports equipment): tp = [0, 1, 0, 0, 1], + # fp = [1, 0, 1, 1, 0] + # In the second label (Ball), tp = [0, 1, 0, 1], fp = [1, 0, 1, 0]. + # In the third label (Football), tp = [0, 1, 0, 1], fp = [1, 0, 1, 0]. + # In the forth label (Bicycle), tp = [0], fp = [1]. + result = _create_dummy_results() + parsed_results = dataset.evaluate(result) + assert np.isclose(parsed_results['mAP'], 0.8333, 1e-4) + + dataset = OpenImagesDataset( + ann_file=ann_file, + label_file=label_file, + load_image_level_labels=False, + image_level_ann_file=label_level_file, + hierarchy_file=hierarchy_json, + meta_file=meta_file, + pipeline=[]) + + # test evaluation with using group_of, adding father classes to + # GT and annotations, and not considering image_level_image, + # In the first label (Sports equipment): tp = [0, 1, 0, 0, 1], + # fp = [1, 0, 1, 1, 0] + # In the second label (Ball), tp = [0, 1, 0, 1], fp = [1, 0, 1, 0]. + # In the third label (Football), tp = [0, 1, 0, 1], fp = [1, 0, 1, 0]. + # In the forth label (Bicycle), tp = [], fp = []. + result = _create_dummy_results() + parsed_results = dataset.evaluate(result) + assert np.isclose(parsed_results['mAP'], 0.8333, 1e-4) + tmp_dir.cleanup() + + +def test_openimages_challenge_dataset(): + # create fake ann files + tmp_dir = tempfile.TemporaryDirectory() + ann_file = osp.join(tmp_dir.name, 'ann_file.txt') + label_file = osp.join(tmp_dir.name, 'label_file.csv') + label_level_file = osp.join(tmp_dir.name, 'label_level_file.csv') + _creat_oid_challenge_style_ann(ann_file, label_file, label_level_file) + + dataset = OpenImagesChallengeDataset( + ann_file=ann_file, + label_file=label_file, + load_image_level_labels=False, + get_supercategory=False, + pipeline=[]) + ann = dataset.get_ann_info(0) + + # two legal detection bboxes with `group_of` parameter + assert ann['bboxes'].shape[0] == ann['labels'].shape[0] == \ + ann['gt_is_group_ofs'].shape[0] == 2 + + dataset.prepare_train_img(0) + dataset.prepare_test_img(0) + + meta_file = osp.join(tmp_dir.name, 'meta.pkl') + _create_metas(meta_file) + + result = _create_dummy_results() + with pytest.raises(AssertionError): + fake_json = osp.join(tmp_dir.name, 'hierarchy.json') + OpenImagesChallengeDataset( + ann_file=ann_file, + label_file=label_file, + image_level_ann_file=label_level_file, + hierarchy_file=fake_json, + meta_file=meta_file, + pipeline=[]) + + hierarchy_file = osp.join(tmp_dir.name, 'hierarchy.np') + _create_hierarchy_np(hierarchy_file) + dataset = OpenImagesChallengeDataset( + ann_file=ann_file, + label_file=label_file, + image_level_ann_file=label_level_file, + hierarchy_file=hierarchy_file, + meta_file=meta_file, + pipeline=[]) + dataset.evaluate(result) + tmp_dir.cleanup() diff --git a/tests/test_data/test_datasets/test_panoptic_dataset.py b/tests/test_data/test_datasets/test_panoptic_dataset.py new file mode 100644 index 0000000..376270d --- /dev/null +++ b/tests/test_data/test_datasets/test_panoptic_dataset.py @@ -0,0 +1,456 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +import tempfile + +import mmcv +import numpy as np + +from mmdet.core import encode_mask_results +from mmdet.datasets.api_wrappers import pq_compute_single_core +from mmdet.datasets.coco_panoptic import INSTANCE_OFFSET, CocoPanopticDataset + +try: + from panopticapi.utils import id2rgb +except ImportError: + id2rgb = None + + +def _create_panoptic_style_json(json_name): + image1 = { + 'id': 0, + 'width': 640, + 'height': 640, + 'file_name': 'fake_name1.jpg', + } + + image2 = { + 'id': 1, + 'width': 640, + 'height': 800, + 'file_name': 'fake_name2.jpg', + } + + images = [image1, image2] + + annotations = [ + { + 'segments_info': [{ + 'id': 1, + 'category_id': 0, + 'area': 400, + 'bbox': [50, 60, 20, 20], + 'iscrowd': 0 + }, { + 'id': 2, + 'category_id': 1, + 'area': 900, + 'bbox': [100, 120, 30, 30], + 'iscrowd': 0 + }, { + 'id': 3, + 'category_id': 2, + 'iscrowd': 0, + 'bbox': [1, 189, 612, 285], + 'area': 70036 + }], + 'file_name': + 'fake_name1.jpg', + 'image_id': + 0 + }, + { + 'segments_info': [ + { + # Different to instance style json, there + # are duplicate ids in panoptic style json + 'id': 1, + 'category_id': 0, + 'area': 400, + 'bbox': [50, 60, 20, 20], + 'iscrowd': 0 + }, + { + 'id': 4, + 'category_id': 1, + 'area': 900, + 'bbox': [100, 120, 30, 30], + 'iscrowd': 1 + }, + { + 'id': 5, + 'category_id': 2, + 'iscrowd': 0, + 'bbox': [100, 200, 200, 300], + 'area': 66666 + }, + { + 'id': 6, + 'category_id': 0, + 'iscrowd': 0, + 'bbox': [1, 189, -10, 285], + 'area': 70036 + } + ], + 'file_name': + 'fake_name2.jpg', + 'image_id': + 1 + } + ] + + categories = [{ + 'id': 0, + 'name': 'car', + 'supercategory': 'car', + 'isthing': 1 + }, { + 'id': 1, + 'name': 'person', + 'supercategory': 'person', + 'isthing': 1 + }, { + 'id': 2, + 'name': 'wall', + 'supercategory': 'wall', + 'isthing': 0 + }] + + fake_json = { + 'images': images, + 'annotations': annotations, + 'categories': categories + } + mmcv.dump(fake_json, json_name) + + return fake_json + + +def test_load_panoptic_style_json(): + tmp_dir = tempfile.TemporaryDirectory() + fake_json_file = osp.join(tmp_dir.name, 'fake_data.json') + fake_json = _create_panoptic_style_json(fake_json_file) + + dataset = CocoPanopticDataset( + ann_file=fake_json_file, + classes=[cat['name'] for cat in fake_json['categories']], + pipeline=[]) + + ann = dataset.get_ann_info(0) + + # two legal instances + assert ann['bboxes'].shape[0] == ann['labels'].shape[0] == 2 + # three masks for both foreground and background + assert len(ann['masks']) == 3 + + ann = dataset.get_ann_info(1) + + # one legal instance, one illegal instance, + # one crowd instance and one background mask + assert ann['bboxes'].shape[0] == ann['labels'].shape[0] == 1 + assert ann['bboxes_ignore'].shape[0] == 1 + assert len(ann['masks']) == 3 + + +def _create_panoptic_gt_annotations(ann_file): + categories = [{ + 'id': 0, + 'name': 'person', + 'supercategory': 'person', + 'isthing': 1 + }, { + 'id': 1, + 'name': 'dog', + 'supercategory': 'dog', + 'isthing': 1 + }, { + 'id': 2, + 'name': 'wall', + 'supercategory': 'wall', + 'isthing': 0 + }] + + images = [{ + 'id': 0, + 'width': 80, + 'height': 60, + 'file_name': 'fake_name1.jpg', + }] + + annotations = [{ + 'segments_info': [{ + 'id': 1, + 'category_id': 0, + 'area': 400, + 'bbox': [10, 10, 10, 40], + 'iscrowd': 0 + }, { + 'id': 2, + 'category_id': 0, + 'area': 400, + 'bbox': [30, 10, 10, 40], + 'iscrowd': 0 + }, { + 'id': 3, + 'category_id': 1, + 'iscrowd': 0, + 'bbox': [50, 10, 10, 5], + 'area': 50 + }, { + 'id': 4, + 'category_id': 2, + 'iscrowd': 0, + 'bbox': [0, 0, 80, 60], + 'area': 3950 + }], + 'file_name': + 'fake_name1.png', + 'image_id': + 0 + }] + + gt_json = { + 'images': images, + 'annotations': annotations, + 'categories': categories + } + + # 4 is the id of the background class annotation. + gt = np.zeros((60, 80), dtype=np.int64) + 4 + gt_bboxes = np.array([[10, 10, 10, 40], [30, 10, 10, 40], [50, 10, 10, 5]], + dtype=np.int64) + for i in range(3): + x, y, w, h = gt_bboxes[i] + gt[y:y + h, x:x + w] = i + 1 # id starts from 1 + + gt = id2rgb(gt).astype(np.uint8) + img_path = osp.join(osp.dirname(ann_file), 'fake_name1.png') + mmcv.imwrite(gt[:, :, ::-1], img_path) + + mmcv.dump(gt_json, ann_file) + return gt_json + + +def test_panoptic_evaluation(): + if id2rgb is None: + return + + # TP for background class, IoU=3576/4324=0.827 + # 2 the category id of the background class + pred = np.zeros((60, 80), dtype=np.int64) + 2 + pred_bboxes = np.array( + [ + [11, 11, 10, 40], # TP IoU=351/449=0.78 + [38, 10, 10, 40], # FP + [51, 10, 10, 5] + ], # TP IoU=45/55=0.818 + dtype=np.int64) + pred_labels = np.array([0, 0, 1], dtype=np.int64) + for i in range(3): + x, y, w, h = pred_bboxes[i] + pred[y:y + h, x:x + w] = (i + 1) * INSTANCE_OFFSET + pred_labels[i] + + tmp_dir = tempfile.TemporaryDirectory() + ann_file = osp.join(tmp_dir.name, 'panoptic.json') + gt_json = _create_panoptic_gt_annotations(ann_file) + + results = [{'pan_results': pred}] + + dataset = CocoPanopticDataset( + ann_file=ann_file, + seg_prefix=tmp_dir.name, + classes=[cat['name'] for cat in gt_json['categories']], + pipeline=[]) + + # For 'person', sq = 0.78 / 1, rq = 1 / 2( 1 tp + 0.5 * (1 fn + 1 fp)) + # For 'dog', sq = 0.818, rq = 1 / 1 + # For 'wall', sq = 0.827, rq = 1 / 1 + # Here is the results for all classes: + # +--------+--------+--------+---------+------------+ + # | | PQ | SQ | RQ | categories | + # +--------+--------+--------+---------+------------+ + # | All | 67.869 | 80.898 | 83.333 | 3 | + # | Things | 60.453 | 79.996 | 75.000 | 2 | + # | Stuff | 82.701 | 82.701 | 100.000 | 1 | + # +--------+--------+--------+---------+------------+ + parsed_results = dataset.evaluate(results) + assert np.isclose(parsed_results['PQ'], 67.869) + assert np.isclose(parsed_results['SQ'], 80.898) + assert np.isclose(parsed_results['RQ'], 83.333) + assert np.isclose(parsed_results['PQ_th'], 60.453) + assert np.isclose(parsed_results['SQ_th'], 79.996) + assert np.isclose(parsed_results['RQ_th'], 75.000) + assert np.isclose(parsed_results['PQ_st'], 82.701) + assert np.isclose(parsed_results['SQ_st'], 82.701) + assert np.isclose(parsed_results['RQ_st'], 100.000) + + # test jsonfile_prefix + outfile_prefix = osp.join(tmp_dir.name, 'results') + parsed_results = dataset.evaluate(results, jsonfile_prefix=outfile_prefix) + assert np.isclose(parsed_results['PQ'], 67.869) + assert np.isclose(parsed_results['SQ'], 80.898) + assert np.isclose(parsed_results['RQ'], 83.333) + assert np.isclose(parsed_results['PQ_th'], 60.453) + assert np.isclose(parsed_results['SQ_th'], 79.996) + assert np.isclose(parsed_results['RQ_th'], 75.000) + assert np.isclose(parsed_results['PQ_st'], 82.701) + assert np.isclose(parsed_results['SQ_st'], 82.701) + assert np.isclose(parsed_results['RQ_st'], 100.000) + + # test classwise + parsed_results = dataset.evaluate(results, classwise=True) + assert np.isclose(parsed_results['PQ'], 67.869) + assert np.isclose(parsed_results['SQ'], 80.898) + assert np.isclose(parsed_results['RQ'], 83.333) + assert np.isclose(parsed_results['PQ_th'], 60.453) + assert np.isclose(parsed_results['SQ_th'], 79.996) + assert np.isclose(parsed_results['RQ_th'], 75.000) + assert np.isclose(parsed_results['PQ_st'], 82.701) + assert np.isclose(parsed_results['SQ_st'], 82.701) + assert np.isclose(parsed_results['RQ_st'], 100.000) + + # test the api wrapper of `pq_compute_single_core` + # Codes are copied from `coco_panoptic.py` and modified + result_files, _ = dataset.format_results( + results, jsonfile_prefix=outfile_prefix) + + imgs = dataset.coco.imgs + gt_json = dataset.coco.img_ann_map # image to annotations + gt_json = [{ + 'image_id': k, + 'segments_info': v, + 'file_name': imgs[k]['segm_file'] + } for k, v in gt_json.items()] + pred_json = mmcv.load(result_files['panoptic']) + pred_json = dict((el['image_id'], el) for el in pred_json['annotations']) + + # match the gt_anns and pred_anns in the same image + matched_annotations_list = [] + for gt_ann in gt_json: + img_id = gt_ann['image_id'] + matched_annotations_list.append((gt_ann, pred_json[img_id])) + gt_folder = dataset.seg_prefix + pred_folder = osp.join(osp.dirname(outfile_prefix), 'panoptic') + + pq_stat = pq_compute_single_core(0, matched_annotations_list, gt_folder, + pred_folder, dataset.categories) + pq_all = pq_stat.pq_average(dataset.categories, isthing=None)[0] + assert np.isclose(pq_all['pq'] * 100, 67.869) + assert np.isclose(pq_all['sq'] * 100, 80.898) + assert np.isclose(pq_all['rq'] * 100, 83.333) + assert pq_all['n'] == 3 + + +def _create_instance_segmentation_gt_annotations(ann_file): + categories = [{ + 'id': 0, + 'name': 'person', + 'supercategory': 'person', + 'isthing': 1 + }, { + 'id': 1, + 'name': 'dog', + 'supercategory': 'dog', + 'isthing': 1 + }, { + 'id': 2, + 'name': 'wall', + 'supercategory': 'wall', + 'isthing': 0 + }] + + images = [{ + 'id': 0, + 'width': 80, + 'height': 60, + 'file_name': 'fake_name1.jpg', + }] + + person1_polygon = [10, 10, 20, 10, 20, 50, 10, 50, 10, 10] + person2_polygon = [30, 10, 40, 10, 40, 50, 30, 50, 30, 10] + dog_polygon = [50, 10, 60, 10, 60, 15, 50, 15, 50, 10] + + annotations = [ + { + 'id': 0, + 'image_id': 0, + 'category_id': 0, + 'segmentation': [person1_polygon], + 'area': 400, + 'bbox': [10, 10, 10, 40], + 'iscrowd': 0 + }, + { + 'id': 1, + 'image_id': 0, + 'category_id': 0, + 'segmentation': [person2_polygon], + 'area': 400, + 'bbox': [30, 10, 10, 40], + 'iscrowd': 0 + }, + { + 'id': 2, + 'image_id': 0, + 'category_id': 1, + 'segmentation': [dog_polygon], + 'area': 50, + 'bbox': [50, 10, 10, 5], + 'iscrowd': 0 + }, + ] + + gt_json = { + 'images': images, + 'annotations': annotations, + 'categories': categories + } + + mmcv.dump(gt_json, ann_file) + + +def test_instance_segmentation_evaluation(): + pred_bbox = [ + np.array([[11, 10, 20, 50, 0.8], [31, 10, 40, 50, 0.8]]), + np.array([[51, 10, 60, 15, 0.7]]) + ] + + person1_mask = np.zeros((60, 80), dtype=bool) + person1_mask[20:50, 11:20] = True + person2_mask = np.zeros((60, 80), dtype=bool) + person2_mask[20:50, 31:40] = True + dog_mask = np.zeros((60, 80), dtype=bool) + dog_mask[10:15, 51:60] = True + + pred_mask = [[person1_mask, person2_mask], [ + dog_mask, + ]] + results = [{'ins_results': (pred_bbox, encode_mask_results(pred_mask))}] + + tmp_dir = tempfile.TemporaryDirectory() + pan_ann_file = osp.join(tmp_dir.name, 'panoptic.json') + ins_ann_file = osp.join(tmp_dir.name, 'instance.json') + _create_panoptic_gt_annotations(pan_ann_file) + _create_instance_segmentation_gt_annotations(ins_ann_file) + + dataset = CocoPanopticDataset( + ann_file=pan_ann_file, + ins_ann_file=ins_ann_file, + seg_prefix=tmp_dir.name, + pipeline=[]) + dataset.THING_CLASSES = ['person', 'dog'] + dataset.STUFF_CLASSES = ['wall'] + dataset.CLASSES = dataset.THING_CLASSES + dataset.STUFF_CLASSES + parsed_results = dataset.evaluate(results, metric=['segm', 'bbox']) + + # Here is the results for instance segmentation: + # { + # 'segm_mAP': 0.5005, 'segm_mAP_50': 0.626, 'segm_mAP_75': 0.5, + # 'segm_mAP_s': 0.5, 'segm_mAP_m': -1.0, 'segm_mAP_l': -1.0, + # 'segm_mAP_copypaste': '0.500 0.626 0.500 0.500 -1.000 -1.000', + # 'bbox_mAP': 0.5636, 'bbox_mAP_50': 0.626, 'bbox_mAP_75': 0.626, + # 'bbox_mAP_s': 0.564, 'bbox_mAP_m': -1.0, 'bbox_mAP_l': -1.0, + # 'bbox_mAP_copypaste': '0.564 0.626 0.626 0.564 -1.000 -1.000' + # } + + assert np.isclose(parsed_results['segm_mAP'], 0.5005) + assert np.isclose(parsed_results['bbox_mAP'], 0.5636) diff --git a/tests/test_data/test_datasets/test_xml_dataset.py b/tests/test_data/test_datasets/test_xml_dataset.py new file mode 100644 index 0000000..f72f13d --- /dev/null +++ b/tests/test_data/test_datasets/test_xml_dataset.py @@ -0,0 +1,23 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest + +from mmdet.datasets import DATASETS + + +def test_xml_dataset(): + dataconfig = { + 'ann_file': 'data/VOCdevkit/VOC2007/ImageSets/Main/test.txt', + 'img_prefix': 'data/VOCdevkit/VOC2007/', + 'pipeline': [{ + 'type': 'LoadImageFromFile' + }] + } + XMLDataset = DATASETS.get('XMLDataset') + + class XMLDatasetSubClass(XMLDataset): + CLASSES = None + + # get_ann_info and _filter_imgs of XMLDataset + # would use self.CLASSES, we added CLASSES not NONE + with pytest.raises(AssertionError): + XMLDatasetSubClass(**dataconfig) diff --git a/tests/test_data/test_pipelines/test_formatting.py b/tests/test_data/test_pipelines/test_formatting.py new file mode 100644 index 0000000..2e22898 --- /dev/null +++ b/tests/test_data/test_pipelines/test_formatting.py @@ -0,0 +1,24 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp + +from mmcv.utils import build_from_cfg + +from mmdet.datasets.builder import PIPELINES + + +def test_default_format_bundle(): + results = dict( + img_prefix=osp.join(osp.dirname(__file__), '../../data'), + img_info=dict(filename='color.jpg')) + load = dict(type='LoadImageFromFile') + load = build_from_cfg(load, PIPELINES) + bundle = dict(type='DefaultFormatBundle') + bundle = build_from_cfg(bundle, PIPELINES) + results = load(results) + assert 'pad_shape' not in results + assert 'scale_factor' not in results + assert 'img_norm_cfg' not in results + results = bundle(results) + assert 'pad_shape' in results + assert 'scale_factor' in results + assert 'img_norm_cfg' in results diff --git a/tests/test_data/test_pipelines/test_loading.py b/tests/test_data/test_pipelines/test_loading.py new file mode 100644 index 0000000..27ecccf --- /dev/null +++ b/tests/test_data/test_pipelines/test_loading.py @@ -0,0 +1,132 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy +import os.path as osp + +import mmcv +import numpy as np +import pytest + +from mmdet.core.mask import BitmapMasks, PolygonMasks +from mmdet.datasets.pipelines import (FilterAnnotations, LoadImageFromFile, + LoadImageFromWebcam, + LoadMultiChannelImageFromFiles) + + +class TestLoading: + + @classmethod + def setup_class(cls): + cls.data_prefix = osp.join(osp.dirname(__file__), '../../data') + + def test_load_img(self): + results = dict( + img_prefix=self.data_prefix, img_info=dict(filename='color.jpg')) + transform = LoadImageFromFile() + results = transform(copy.deepcopy(results)) + assert results['filename'] == osp.join(self.data_prefix, 'color.jpg') + assert results['ori_filename'] == 'color.jpg' + assert results['img'].shape == (288, 512, 3) + assert results['img'].dtype == np.uint8 + assert results['img_shape'] == (288, 512, 3) + assert results['ori_shape'] == (288, 512, 3) + assert repr(transform) == transform.__class__.__name__ + \ + "(to_float32=False, color_type='color', channel_order='bgr', " + \ + "file_client_args={'backend': 'disk'})" + + # no img_prefix + results = dict( + img_prefix=None, img_info=dict(filename='tests/data/color.jpg')) + transform = LoadImageFromFile() + results = transform(copy.deepcopy(results)) + assert results['filename'] == 'tests/data/color.jpg' + assert results['ori_filename'] == 'tests/data/color.jpg' + assert results['img'].shape == (288, 512, 3) + + # to_float32 + transform = LoadImageFromFile(to_float32=True) + results = transform(copy.deepcopy(results)) + assert results['img'].dtype == np.float32 + + # gray image + results = dict( + img_prefix=self.data_prefix, img_info=dict(filename='gray.jpg')) + transform = LoadImageFromFile() + results = transform(copy.deepcopy(results)) + assert results['img'].shape == (288, 512, 3) + assert results['img'].dtype == np.uint8 + + transform = LoadImageFromFile(color_type='unchanged') + results = transform(copy.deepcopy(results)) + assert results['img'].shape == (288, 512) + assert results['img'].dtype == np.uint8 + + def test_load_multi_channel_img(self): + results = dict( + img_prefix=self.data_prefix, + img_info=dict(filename=['color.jpg', 'color.jpg'])) + transform = LoadMultiChannelImageFromFiles() + results = transform(copy.deepcopy(results)) + assert results['filename'] == [ + osp.join(self.data_prefix, 'color.jpg'), + osp.join(self.data_prefix, 'color.jpg') + ] + assert results['ori_filename'] == ['color.jpg', 'color.jpg'] + assert results['img'].shape == (288, 512, 3, 2) + assert results['img'].dtype == np.uint8 + assert results['img_shape'] == (288, 512, 3, 2) + assert results['ori_shape'] == (288, 512, 3, 2) + assert results['pad_shape'] == (288, 512, 3, 2) + assert results['scale_factor'] == 1.0 + assert repr(transform) == transform.__class__.__name__ + \ + "(to_float32=False, color_type='unchanged', " + \ + "file_client_args={'backend': 'disk'})" + + def test_load_webcam_img(self): + img = mmcv.imread(osp.join(self.data_prefix, 'color.jpg')) + results = dict(img=img) + transform = LoadImageFromWebcam() + results = transform(copy.deepcopy(results)) + assert results['filename'] is None + assert results['ori_filename'] is None + assert results['img'].shape == (288, 512, 3) + assert results['img'].dtype == np.uint8 + assert results['img_shape'] == (288, 512, 3) + assert results['ori_shape'] == (288, 512, 3) + + +def _build_filter_annotations_args(): + kwargs = (dict(min_gt_bbox_wh=(100, 100)), + dict(min_gt_bbox_wh=(100, 100), keep_empty=False), + dict(min_gt_bbox_wh=(1, 1)), dict(min_gt_bbox_wh=(.01, .01)), + dict(min_gt_bbox_wh=(.01, .01), + by_mask=True), dict(by_mask=True), + dict(by_box=False, by_mask=True)) + targets = (None, 0, 1, 2, 1, 1, 1) + + return list(zip(targets, kwargs)) + + +@pytest.mark.parametrize('target, kwargs', _build_filter_annotations_args()) +def test_filter_annotations(target, kwargs): + filter_ann = FilterAnnotations(**kwargs) + bboxes = np.array([[2., 10., 4., 14.], [2., 10., 2.1, 10.1]]) + raw_masks = np.zeros((2, 24, 24)) + raw_masks[0, 10:14, 2:4] = 1 + bitmap_masks = BitmapMasks(raw_masks, 24, 24) + results = dict(gt_bboxes=bboxes, gt_masks=bitmap_masks) + results = filter_ann(results) + if results is not None: + results = results['gt_bboxes'].shape[0] + assert results == target + + polygons = [[np.array([2.0, 10.0, 4.0, 10.0, 4.0, 14.0, 2.0, 14.0])], + [np.array([2.0, 10.0, 2.1, 10.0, 2.1, 10.1, 2.0, 10.1])]] + polygon_masks = PolygonMasks(polygons, 24, 24) + + results = dict(gt_bboxes=bboxes, gt_masks=polygon_masks) + results = filter_ann(results) + + if results is not None: + results = len(results.get('gt_masks').masks) + + assert results == target diff --git a/tests/test_data/test_pipelines/test_sampler.py b/tests/test_data/test_pipelines/test_sampler.py new file mode 100644 index 0000000..8ff9398 --- /dev/null +++ b/tests/test_data/test_pipelines/test_sampler.py @@ -0,0 +1,329 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from mmdet.core.bbox.assigners import MaxIoUAssigner +from mmdet.core.bbox.samplers import (OHEMSampler, RandomSampler, + ScoreHLRSampler) + + +def test_random_sampler(): + assigner = MaxIoUAssigner( + pos_iou_thr=0.5, + neg_iou_thr=0.5, + ignore_iof_thr=0.5, + ignore_wrt_candidates=False, + ) + bboxes = torch.FloatTensor([ + [0, 0, 10, 10], + [10, 10, 20, 20], + [5, 5, 15, 15], + [32, 32, 38, 42], + ]) + gt_bboxes = torch.FloatTensor([ + [0, 0, 10, 9], + [0, 10, 10, 19], + ]) + gt_labels = torch.LongTensor([1, 2]) + gt_bboxes_ignore = torch.Tensor([ + [30, 30, 40, 40], + ]) + assign_result = assigner.assign( + bboxes, + gt_bboxes, + gt_bboxes_ignore=gt_bboxes_ignore, + gt_labels=gt_labels) + + sampler = RandomSampler( + num=10, pos_fraction=0.5, neg_pos_ub=-1, add_gt_as_proposals=True) + + sample_result = sampler.sample(assign_result, bboxes, gt_bboxes, gt_labels) + + assert len(sample_result.pos_bboxes) == len(sample_result.pos_inds) + assert len(sample_result.neg_bboxes) == len(sample_result.neg_inds) + + +def test_random_sampler_empty_gt(): + assigner = MaxIoUAssigner( + pos_iou_thr=0.5, + neg_iou_thr=0.5, + ignore_iof_thr=0.5, + ignore_wrt_candidates=False, + ) + bboxes = torch.FloatTensor([ + [0, 0, 10, 10], + [10, 10, 20, 20], + [5, 5, 15, 15], + [32, 32, 38, 42], + ]) + gt_bboxes = torch.empty(0, 4) + gt_labels = torch.empty(0, ).long() + assign_result = assigner.assign(bboxes, gt_bboxes, gt_labels=gt_labels) + + sampler = RandomSampler( + num=10, pos_fraction=0.5, neg_pos_ub=-1, add_gt_as_proposals=True) + + sample_result = sampler.sample(assign_result, bboxes, gt_bboxes, gt_labels) + + assert len(sample_result.pos_bboxes) == len(sample_result.pos_inds) + assert len(sample_result.neg_bboxes) == len(sample_result.neg_inds) + + +def test_random_sampler_empty_pred(): + assigner = MaxIoUAssigner( + pos_iou_thr=0.5, + neg_iou_thr=0.5, + ignore_iof_thr=0.5, + ignore_wrt_candidates=False, + ) + bboxes = torch.empty(0, 4) + gt_bboxes = torch.FloatTensor([ + [0, 0, 10, 9], + [0, 10, 10, 19], + ]) + gt_labels = torch.LongTensor([1, 2]) + assign_result = assigner.assign(bboxes, gt_bboxes, gt_labels=gt_labels) + + sampler = RandomSampler( + num=10, pos_fraction=0.5, neg_pos_ub=-1, add_gt_as_proposals=True) + + sample_result = sampler.sample(assign_result, bboxes, gt_bboxes, gt_labels) + + assert len(sample_result.pos_bboxes) == len(sample_result.pos_inds) + assert len(sample_result.neg_bboxes) == len(sample_result.neg_inds) + + +def _context_for_ohem(): + import sys + from os.path import dirname + sys.path.insert(0, dirname(dirname(dirname(__file__)))) + from test_models.test_forward import _get_detector_cfg + + model = _get_detector_cfg( + 'faster_rcnn/faster_rcnn_r50_fpn_ohem_1x_coco.py') + model['pretrained'] = None + + from mmdet.models import build_detector + context = build_detector(model).roi_head + return context + + +def test_ohem_sampler(): + + assigner = MaxIoUAssigner( + pos_iou_thr=0.5, + neg_iou_thr=0.5, + ignore_iof_thr=0.5, + ignore_wrt_candidates=False, + ) + bboxes = torch.FloatTensor([ + [0, 0, 10, 10], + [10, 10, 20, 20], + [5, 5, 15, 15], + [32, 32, 38, 42], + ]) + gt_bboxes = torch.FloatTensor([ + [0, 0, 10, 9], + [0, 10, 10, 19], + ]) + gt_labels = torch.LongTensor([1, 2]) + gt_bboxes_ignore = torch.Tensor([ + [30, 30, 40, 40], + ]) + assign_result = assigner.assign( + bboxes, + gt_bboxes, + gt_bboxes_ignore=gt_bboxes_ignore, + gt_labels=gt_labels) + + context = _context_for_ohem() + + sampler = OHEMSampler( + num=10, + pos_fraction=0.5, + context=context, + neg_pos_ub=-1, + add_gt_as_proposals=True) + + feats = [torch.rand(1, 256, int(2**i), int(2**i)) for i in [6, 5, 4, 3, 2]] + sample_result = sampler.sample( + assign_result, bboxes, gt_bboxes, gt_labels, feats=feats) + + assert len(sample_result.pos_bboxes) == len(sample_result.pos_inds) + assert len(sample_result.neg_bboxes) == len(sample_result.neg_inds) + + +def test_ohem_sampler_empty_gt(): + + assigner = MaxIoUAssigner( + pos_iou_thr=0.5, + neg_iou_thr=0.5, + ignore_iof_thr=0.5, + ignore_wrt_candidates=False, + ) + bboxes = torch.FloatTensor([ + [0, 0, 10, 10], + [10, 10, 20, 20], + [5, 5, 15, 15], + [32, 32, 38, 42], + ]) + gt_bboxes = torch.empty(0, 4) + gt_labels = torch.LongTensor([]) + gt_bboxes_ignore = torch.Tensor([]) + assign_result = assigner.assign( + bboxes, + gt_bboxes, + gt_bboxes_ignore=gt_bboxes_ignore, + gt_labels=gt_labels) + + context = _context_for_ohem() + + sampler = OHEMSampler( + num=10, + pos_fraction=0.5, + context=context, + neg_pos_ub=-1, + add_gt_as_proposals=True) + + feats = [torch.rand(1, 256, int(2**i), int(2**i)) for i in [6, 5, 4, 3, 2]] + + sample_result = sampler.sample( + assign_result, bboxes, gt_bboxes, gt_labels, feats=feats) + + assert len(sample_result.pos_bboxes) == len(sample_result.pos_inds) + assert len(sample_result.neg_bboxes) == len(sample_result.neg_inds) + + +def test_ohem_sampler_empty_pred(): + assigner = MaxIoUAssigner( + pos_iou_thr=0.5, + neg_iou_thr=0.5, + ignore_iof_thr=0.5, + ignore_wrt_candidates=False, + ) + bboxes = torch.empty(0, 4) + gt_bboxes = torch.FloatTensor([ + [0, 0, 10, 10], + [10, 10, 20, 20], + [5, 5, 15, 15], + [32, 32, 38, 42], + ]) + gt_labels = torch.LongTensor([1, 2, 2, 3]) + gt_bboxes_ignore = torch.Tensor([]) + assign_result = assigner.assign( + bboxes, + gt_bboxes, + gt_bboxes_ignore=gt_bboxes_ignore, + gt_labels=gt_labels) + + context = _context_for_ohem() + + sampler = OHEMSampler( + num=10, + pos_fraction=0.5, + context=context, + neg_pos_ub=-1, + add_gt_as_proposals=True) + + feats = [torch.rand(1, 256, int(2**i), int(2**i)) for i in [6, 5, 4, 3, 2]] + + sample_result = sampler.sample( + assign_result, bboxes, gt_bboxes, gt_labels, feats=feats) + + assert len(sample_result.pos_bboxes) == len(sample_result.pos_inds) + assert len(sample_result.neg_bboxes) == len(sample_result.neg_inds) + + +def test_random_sample_result(): + from mmdet.core.bbox.samplers.sampling_result import SamplingResult + SamplingResult.random(num_gts=0, num_preds=0) + SamplingResult.random(num_gts=0, num_preds=3) + SamplingResult.random(num_gts=3, num_preds=3) + SamplingResult.random(num_gts=0, num_preds=3) + SamplingResult.random(num_gts=7, num_preds=7) + SamplingResult.random(num_gts=7, num_preds=64) + SamplingResult.random(num_gts=24, num_preds=3) + + for i in range(3): + SamplingResult.random(rng=i) + + +def test_score_hlr_sampler_empty_pred(): + assigner = MaxIoUAssigner( + pos_iou_thr=0.5, + neg_iou_thr=0.5, + ignore_iof_thr=0.5, + ignore_wrt_candidates=False, + ) + context = _context_for_ohem() + sampler = ScoreHLRSampler( + num=10, + pos_fraction=0.5, + context=context, + neg_pos_ub=-1, + add_gt_as_proposals=True) + gt_bboxes_ignore = torch.Tensor([]) + feats = [torch.rand(1, 256, int(2**i), int(2**i)) for i in [6, 5, 4, 3, 2]] + + # empty bbox + bboxes = torch.empty(0, 4) + gt_bboxes = torch.FloatTensor([ + [0, 0, 10, 10], + [10, 10, 20, 20], + [5, 5, 15, 15], + [32, 32, 38, 42], + ]) + gt_labels = torch.LongTensor([1, 2, 2, 3]) + assign_result = assigner.assign( + bboxes, + gt_bboxes, + gt_bboxes_ignore=gt_bboxes_ignore, + gt_labels=gt_labels) + sample_result, _ = sampler.sample( + assign_result, bboxes, gt_bboxes, gt_labels, feats=feats) + assert len(sample_result.neg_inds) == 0 + assert len(sample_result.pos_bboxes) == len(sample_result.pos_inds) + assert len(sample_result.neg_bboxes) == len(sample_result.neg_inds) + + # empty gt + bboxes = torch.FloatTensor([ + [0, 0, 10, 10], + [10, 10, 20, 20], + [5, 5, 15, 15], + [32, 32, 38, 42], + ]) + gt_bboxes = torch.empty(0, 4) + gt_labels = torch.LongTensor([]) + assign_result = assigner.assign( + bboxes, + gt_bboxes, + gt_bboxes_ignore=gt_bboxes_ignore, + gt_labels=gt_labels) + sample_result, _ = sampler.sample( + assign_result, bboxes, gt_bboxes, gt_labels, feats=feats) + assert len(sample_result.pos_inds) == 0 + assert len(sample_result.pos_bboxes) == len(sample_result.pos_inds) + assert len(sample_result.neg_bboxes) == len(sample_result.neg_inds) + + # non-empty input + bboxes = torch.FloatTensor([ + [0, 0, 10, 10], + [10, 10, 20, 20], + [5, 5, 15, 15], + [32, 32, 38, 42], + ]) + gt_bboxes = torch.FloatTensor([ + [0, 0, 10, 10], + [10, 10, 20, 20], + [5, 5, 15, 15], + [32, 32, 38, 42], + ]) + gt_labels = torch.LongTensor([1, 2, 2, 3]) + assign_result = assigner.assign( + bboxes, + gt_bboxes, + gt_bboxes_ignore=gt_bboxes_ignore, + gt_labels=gt_labels) + sample_result, _ = sampler.sample( + assign_result, bboxes, gt_bboxes, gt_labels, feats=feats) + assert len(sample_result.pos_bboxes) == len(sample_result.pos_inds) + assert len(sample_result.neg_bboxes) == len(sample_result.neg_inds) diff --git a/tests/test_data/test_pipelines/test_transform/__init__.py b/tests/test_data/test_pipelines/test_transform/__init__.py new file mode 100644 index 0000000..d499031 --- /dev/null +++ b/tests/test_data/test_pipelines/test_transform/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .utils import check_result_same, construct_toy_data, create_random_bboxes + +__all__ = ['create_random_bboxes', 'construct_toy_data', 'check_result_same'] diff --git a/tests/test_data/test_pipelines/test_transform/test_img_augment.py b/tests/test_data/test_pipelines/test_transform/test_img_augment.py new file mode 100644 index 0000000..f28030e --- /dev/null +++ b/tests/test_data/test_pipelines/test_transform/test_img_augment.py @@ -0,0 +1,175 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy + +import mmcv +import numpy as np +from mmcv.utils import build_from_cfg +from numpy.testing import assert_array_equal + +from mmdet.datasets.builder import PIPELINES +from .utils import construct_toy_data + + +def test_adjust_color(): + results = construct_toy_data() + # test wighout aug + transform = dict(type='ColorTransform', prob=0, level=10) + transform_module = build_from_cfg(transform, PIPELINES) + results_transformed = transform_module(copy.deepcopy(results)) + assert_array_equal(results_transformed['img'], results['img']) + + # test with factor 1 + img = results['img'] + transform = dict(type='ColorTransform', prob=1, level=10) + transform_module = build_from_cfg(transform, PIPELINES) + results_transformed = transform_module(copy.deepcopy(results)) + assert_array_equal(results_transformed['img'], img) + + # test with factor 0 + transform_module.factor = 0 + img_gray = mmcv.bgr2gray(img.copy()) + img_r = np.stack([img_gray, img_gray, img_gray], axis=-1) + results_transformed = transform_module(copy.deepcopy(results)) + assert_array_equal(results_transformed['img'], img_r) + + # test with factor 0.5 + transform_module.factor = 0.5 + results_transformed = transform_module(copy.deepcopy(results)) + img = results['img'] + assert_array_equal( + results_transformed['img'], + np.round(np.clip((img * 0.5 + img_r * 0.5), 0, 255)).astype(img.dtype)) + + +def test_imequalize(nb_rand_test=100): + + def _imequalize(img): + # equalize the image using PIL.ImageOps.equalize + from PIL import Image, ImageOps + img = Image.fromarray(img) + equalized_img = np.asarray(ImageOps.equalize(img)) + return equalized_img + + results = construct_toy_data() + # test wighout aug + transform = dict(type='EqualizeTransform', prob=0) + transform_module = build_from_cfg(transform, PIPELINES) + results_transformed = transform_module(copy.deepcopy(results)) + assert_array_equal(results_transformed['img'], results['img']) + + # test equalize with case step=0 + transform = dict(type='EqualizeTransform', prob=1.) + transform_module = build_from_cfg(transform, PIPELINES) + img = np.array([[0, 0, 0], [120, 120, 120], [255, 255, 255]], + dtype=np.uint8) + img = np.stack([img, img, img], axis=-1) + results['img'] = img + results_transformed = transform_module(copy.deepcopy(results)) + assert_array_equal(results_transformed['img'], img) + + # test equalize with randomly sampled image. + for _ in range(nb_rand_test): + img = np.clip(np.random.uniform(0, 1, (1000, 1200, 3)) * 260, 0, + 255).astype(np.uint8) + results['img'] = img + results_transformed = transform_module(copy.deepcopy(results)) + assert_array_equal(results_transformed['img'], _imequalize(img)) + + +def test_adjust_brightness(nb_rand_test=100): + + def _adjust_brightness(img, factor): + # adjust the brightness of image using + # PIL.ImageEnhance.Brightness + from PIL import Image + from PIL.ImageEnhance import Brightness + img = Image.fromarray(img) + brightened_img = Brightness(img).enhance(factor) + return np.asarray(brightened_img) + + results = construct_toy_data() + # test wighout aug + transform = dict(type='BrightnessTransform', level=10, prob=0) + transform_module = build_from_cfg(transform, PIPELINES) + results_transformed = transform_module(copy.deepcopy(results)) + assert_array_equal(results_transformed['img'], results['img']) + + # test case with factor 1.0 + transform = dict(type='BrightnessTransform', level=10, prob=1.) + transform_module = build_from_cfg(transform, PIPELINES) + transform_module.factor = 1.0 + results_transformed = transform_module(copy.deepcopy(results)) + assert_array_equal(results_transformed['img'], results['img']) + + # test case with factor 0.0 + transform_module.factor = 0.0 + results_transformed = transform_module(copy.deepcopy(results)) + assert_array_equal(results_transformed['img'], + np.zeros_like(results['img'])) + + # test with randomly sampled images and factors. + for _ in range(nb_rand_test): + img = np.clip(np.random.uniform(0, 1, (1000, 1200, 3)) * 260, 0, + 255).astype(np.uint8) + factor = np.random.uniform() + transform_module.factor = factor + results['img'] = img + np.testing.assert_allclose( + transform_module(copy.deepcopy(results))['img'].astype(np.int32), + _adjust_brightness(img, factor).astype(np.int32), + rtol=0, + atol=1) + + +def test_adjust_contrast(nb_rand_test=100): + + def _adjust_contrast(img, factor): + from PIL import Image + from PIL.ImageEnhance import Contrast + + # Image.fromarray defaultly supports RGB, not BGR. + # convert from BGR to RGB + img = Image.fromarray(img[..., ::-1], mode='RGB') + contrasted_img = Contrast(img).enhance(factor) + # convert from RGB to BGR + return np.asarray(contrasted_img)[..., ::-1] + + results = construct_toy_data() + # test wighout aug + transform = dict(type='ContrastTransform', level=10, prob=0) + transform_module = build_from_cfg(transform, PIPELINES) + results_transformed = transform_module(copy.deepcopy(results)) + assert_array_equal(results_transformed['img'], results['img']) + + # test case with factor 1.0 + transform = dict(type='ContrastTransform', level=10, prob=1.) + transform_module = build_from_cfg(transform, PIPELINES) + transform_module.factor = 1.0 + results_transformed = transform_module(copy.deepcopy(results)) + assert_array_equal(results_transformed['img'], results['img']) + + # test case with factor 0.0 + transform_module.factor = 0.0 + results_transformed = transform_module(copy.deepcopy(results)) + np.testing.assert_allclose( + results_transformed['img'], + _adjust_contrast(results['img'], 0.), + rtol=0, + atol=1) + + # test adjust_contrast with randomly sampled images and factors. + for _ in range(nb_rand_test): + img = np.clip(np.random.uniform(0, 1, (1200, 1000, 3)) * 260, 0, + 255).astype(np.uint8) + factor = np.random.uniform() + transform_module.factor = factor + results['img'] = img + results_transformed = transform_module(copy.deepcopy(results)) + # Note the gap (less_equal 1) between PIL.ImageEnhance.Contrast + # and mmcv.adjust_contrast comes from the gap that converts from + # a color image to gray image using mmcv or PIL. + np.testing.assert_allclose( + transform_module(copy.deepcopy(results))['img'].astype(np.int32), + _adjust_contrast(results['img'], factor).astype(np.int32), + rtol=0, + atol=1) diff --git a/tests/test_data/test_pipelines/test_transform/test_models_aug_test.py b/tests/test_data/test_pipelines/test_transform/test_models_aug_test.py new file mode 100644 index 0000000..5eba1ef --- /dev/null +++ b/tests/test_data/test_pipelines/test_transform/test_models_aug_test.py @@ -0,0 +1,131 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp + +import mmcv +import torch +from mmcv.parallel import collate +from mmcv.utils import build_from_cfg + +from mmdet.datasets.builder import PIPELINES +from mmdet.models import build_detector + + +def model_aug_test_template(cfg_file): + # get config + cfg = mmcv.Config.fromfile(cfg_file) + # init model + cfg.model.pretrained = None + cfg.model.train_cfg = None + model = build_detector(cfg.model) + + # init test pipeline and set aug test + load_cfg, multi_scale_cfg = cfg.test_pipeline + multi_scale_cfg['flip'] = True + multi_scale_cfg['flip_direction'] = ['horizontal', 'vertical', 'diagonal'] + multi_scale_cfg['img_scale'] = [(1333, 800), (800, 600), (640, 480)] + + load = build_from_cfg(load_cfg, PIPELINES) + transform = build_from_cfg(multi_scale_cfg, PIPELINES) + + results = dict( + img_prefix=osp.join(osp.dirname(__file__), '../../../data'), + img_info=dict(filename='color.jpg')) + results = transform(load(results)) + assert len(results['img']) == 12 + assert len(results['img_metas']) == 12 + + results['img'] = [collate([x]) for x in results['img']] + results['img_metas'] = [collate([x]).data[0] for x in results['img_metas']] + # aug test the model + model.eval() + with torch.no_grad(): + aug_result = model(return_loss=False, rescale=True, **results) + return aug_result + + +def test_aug_test_size(): + results = dict( + img_prefix=osp.join(osp.dirname(__file__), '../../../data'), + img_info=dict(filename='color.jpg')) + + # Define simple pipeline + load = dict(type='LoadImageFromFile') + load = build_from_cfg(load, PIPELINES) + + # get config + transform = dict( + type='MultiScaleFlipAug', + transforms=[], + img_scale=[(1333, 800), (800, 600), (640, 480)], + flip=True, + flip_direction=['horizontal', 'vertical', 'diagonal']) + multi_aug_test_module = build_from_cfg(transform, PIPELINES) + + results = load(results) + results = multi_aug_test_module(load(results)) + # len(["original", "horizontal", "vertical", "diagonal"]) * + # len([(1333, 800), (800, 600), (640, 480)]) + assert len(results['img']) == 12 + + +def test_cascade_rcnn_aug_test(): + aug_result = model_aug_test_template( + 'configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py') + assert len(aug_result[0]) == 80 + + +def test_mask_rcnn_aug_test(): + aug_result = model_aug_test_template( + 'configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py') + assert len(aug_result[0]) == 2 + assert len(aug_result[0][0]) == 80 + assert len(aug_result[0][1]) == 80 + + +def test_htc_aug_test(): + aug_result = model_aug_test_template('configs/htc/htc_r50_fpn_1x_coco.py') + assert len(aug_result[0]) == 2 + assert len(aug_result[0][0]) == 80 + assert len(aug_result[0][1]) == 80 + + +def test_scnet_aug_test(): + aug_result = model_aug_test_template( + 'configs/scnet/scnet_r50_fpn_1x_coco.py') + assert len(aug_result[0]) == 2 + assert len(aug_result[0][0]) == 80 + assert len(aug_result[0][1]) == 80 + + +def test_cornernet_aug_test(): + # get config + cfg = mmcv.Config.fromfile( + 'configs/cornernet/cornernet_hourglass104_mstest_10x5_210e_coco.py') + # init model + cfg.model.pretrained = None + cfg.model.train_cfg = None + model = build_detector(cfg.model) + + # init test pipeline and set aug test + load_cfg, multi_scale_cfg = cfg.test_pipeline + multi_scale_cfg['flip'] = True + multi_scale_cfg['flip_direction'] = ['horizontal', 'vertical', 'diagonal'] + multi_scale_cfg['scale_factor'] = [0.5, 1.0, 2.0] + + load = build_from_cfg(load_cfg, PIPELINES) + transform = build_from_cfg(multi_scale_cfg, PIPELINES) + + results = dict( + img_prefix=osp.join(osp.dirname(__file__), '../../../data'), + img_info=dict(filename='color.jpg')) + results = transform(load(results)) + assert len(results['img']) == 12 + assert len(results['img_metas']) == 12 + + results['img'] = [collate([x]) for x in results['img']] + results['img_metas'] = [collate([x]).data[0] for x in results['img_metas']] + # aug test the model + model.eval() + with torch.no_grad(): + aug_result = model(return_loss=False, rescale=True, **results) + assert len(aug_result[0]) == 80 diff --git a/tests/test_data/test_pipelines/test_transform/test_rotate.py b/tests/test_data/test_pipelines/test_transform/test_rotate.py new file mode 100644 index 0000000..93f7749 --- /dev/null +++ b/tests/test_data/test_pipelines/test_transform/test_rotate.py @@ -0,0 +1,172 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy + +import numpy as np +import pytest +from mmcv.utils import build_from_cfg + +from mmdet.core.mask import BitmapMasks, PolygonMasks +from mmdet.datasets.builder import PIPELINES +from .utils import check_result_same, construct_toy_data + + +def test_rotate(): + # test assertion for invalid type of max_rotate_angle + with pytest.raises(AssertionError): + transform = dict(type='Rotate', level=1, max_rotate_angle=(30, )) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid type of scale + with pytest.raises(AssertionError): + transform = dict(type='Rotate', level=2, scale=(1.2, )) + build_from_cfg(transform, PIPELINES) + + # test ValueError for invalid type of img_fill_val + with pytest.raises(ValueError): + transform = dict( + type='Rotate', level=2, img_fill_val=[ + 128, + ]) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid number of elements in center + with pytest.raises(AssertionError): + transform = dict(type='Rotate', level=2, center=(0.5, )) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid type of center + with pytest.raises(AssertionError): + transform = dict(type='Rotate', level=2, center=[0, 0]) + build_from_cfg(transform, PIPELINES) + + # test case when no rotate aug (level=0) + results = construct_toy_data() + img_fill_val = (104, 116, 124) + seg_ignore_label = 255 + transform = dict( + type='Rotate', + level=0, + prob=1., + img_fill_val=img_fill_val, + seg_ignore_label=seg_ignore_label, + ) + rotate_module = build_from_cfg(transform, PIPELINES) + results_wo_rotate = rotate_module(copy.deepcopy(results)) + check_result_same(results, results_wo_rotate) + + # test case when no rotate aug (prob<=0) + transform = dict( + type='Rotate', level=10, prob=0., img_fill_val=img_fill_val, scale=0.6) + rotate_module = build_from_cfg(transform, PIPELINES) + results_wo_rotate = rotate_module(copy.deepcopy(results)) + check_result_same(results, results_wo_rotate) + + # test clockwise rotation with angle 90 + results = construct_toy_data() + img_fill_val = 128 + transform = dict( + type='Rotate', + level=10, + max_rotate_angle=90, + img_fill_val=img_fill_val, + # set random_negative_prob to 0 for clockwise rotation + random_negative_prob=0., + prob=1.) + rotate_module = build_from_cfg(transform, PIPELINES) + results_rotated = rotate_module(copy.deepcopy(results)) + img_r = np.array([[img_fill_val, 6, 2, img_fill_val], + [img_fill_val, 7, 3, img_fill_val]]).astype(np.uint8) + img_r = np.stack([img_r, img_r, img_r], axis=-1) + results_gt = copy.deepcopy(results) + results_gt['img'] = img_r + results_gt['gt_bboxes'] = np.array([[1., 0., 2., 1.]], dtype=np.float32) + results_gt['gt_bboxes_ignore'] = np.empty((0, 4), dtype=np.float32) + gt_masks = np.array([[0, 1, 1, 0], [0, 0, 1, 0]], + dtype=np.uint8)[None, :, :] + results_gt['gt_masks'] = BitmapMasks(gt_masks, 2, 4) + results_gt['gt_semantic_seg'] = np.array( + [[255, 6, 2, 255], [255, 7, 3, + 255]]).astype(results['gt_semantic_seg'].dtype) + check_result_same(results_gt, results_rotated) + + # test clockwise rotation with angle 90, PolygonMasks + results = construct_toy_data(poly2mask=False) + results_rotated = rotate_module(copy.deepcopy(results)) + gt_masks = [[np.array([2, 0, 2, 1, 1, 1, 1, 0], dtype=np.float)]] + results_gt['gt_masks'] = PolygonMasks(gt_masks, 2, 4) + check_result_same(results_gt, results_rotated) + + # test counter-clockwise rotation with angle 90, + # and specify the ratation center + img_fill_val = (104, 116, 124) + transform = dict( + type='Rotate', + level=10, + max_rotate_angle=90, + center=(0, 0), + img_fill_val=img_fill_val, + # set random_negative_prob to 1 for counter-clockwise rotation + random_negative_prob=1., + prob=1.) + results = construct_toy_data() + rotate_module = build_from_cfg(transform, PIPELINES) + results_rotated = rotate_module(copy.deepcopy(results)) + results_gt = copy.deepcopy(results) + h, w = results['img'].shape[:2] + img_r = np.stack([ + np.ones((h, w)) * img_fill_val[0], + np.ones((h, w)) * img_fill_val[1], + np.ones((h, w)) * img_fill_val[2] + ], + axis=-1).astype(np.uint8) + img_r[0, 0, :] = 1 + img_r[0, 1, :] = 5 + results_gt['img'] = img_r + results_gt['gt_bboxes'] = np.empty((0, 4), dtype=np.float32) + results_gt['gt_bboxes_ignore'] = np.empty((0, 4), dtype=np.float32) + results_gt['gt_labels'] = np.empty((0, ), dtype=np.int64) + gt_masks = np.empty((0, h, w), dtype=np.uint8) + results_gt['gt_masks'] = BitmapMasks(gt_masks, h, w) + gt_seg = (np.ones((h, w)) * 255).astype(results['gt_semantic_seg'].dtype) + gt_seg[0, 0], gt_seg[0, 1] = 1, 5 + results_gt['gt_semantic_seg'] = gt_seg + check_result_same(results_gt, results_rotated) + + transform = dict( + type='Rotate', + level=10, + max_rotate_angle=90, + center=(0), + img_fill_val=img_fill_val, + random_negative_prob=1., + prob=1.) + rotate_module = build_from_cfg(transform, PIPELINES) + results_rotated = rotate_module(copy.deepcopy(results)) + check_result_same(results_gt, results_rotated) + + # test counter-clockwise rotation with angle 90, + # and specify the ratation center, PolygonMasks + results = construct_toy_data(poly2mask=False) + results_rotated = rotate_module(copy.deepcopy(results)) + gt_masks = [[np.array([0, 0, 0, 0, 1, 0, 1, 0], dtype=np.float)]] + results_gt['gt_masks'] = PolygonMasks(gt_masks, 2, 4) + check_result_same(results_gt, results_rotated) + + # test AutoAugment equipped with Rotate + policies = [[dict(type='Rotate', level=10, prob=1.)]] + autoaug = dict(type='AutoAugment', policies=policies) + autoaug_module = build_from_cfg(autoaug, PIPELINES) + autoaug_module(copy.deepcopy(results)) + + policies = [[ + dict(type='Rotate', level=10, prob=1.), + dict( + type='Rotate', + level=8, + max_rotate_angle=90, + center=(0), + img_fill_val=img_fill_val) + ]] + autoaug = dict(type='AutoAugment', policies=policies) + autoaug_module = build_from_cfg(autoaug, PIPELINES) + autoaug_module(copy.deepcopy(results)) diff --git a/tests/test_data/test_pipelines/test_transform/test_shear.py b/tests/test_data/test_pipelines/test_transform/test_shear.py new file mode 100644 index 0000000..215d9a3 --- /dev/null +++ b/tests/test_data/test_pipelines/test_transform/test_shear.py @@ -0,0 +1,164 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy + +import numpy as np +import pytest +from mmcv.utils import build_from_cfg + +from mmdet.core.mask import BitmapMasks, PolygonMasks +from mmdet.datasets.builder import PIPELINES +from .utils import check_result_same, construct_toy_data + + +def test_shear(): + # test assertion for invalid type of max_shear_magnitude + with pytest.raises(AssertionError): + transform = dict(type='Shear', level=1, max_shear_magnitude=(0.5, )) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid value of max_shear_magnitude + with pytest.raises(AssertionError): + transform = dict(type='Shear', level=2, max_shear_magnitude=1.2) + build_from_cfg(transform, PIPELINES) + + # test ValueError for invalid type of img_fill_val + with pytest.raises(ValueError): + transform = dict(type='Shear', level=2, img_fill_val=[128]) + build_from_cfg(transform, PIPELINES) + + results = construct_toy_data() + # test case when no shear aug (level=0, direction='horizontal') + img_fill_val = (104, 116, 124) + seg_ignore_label = 255 + transform = dict( + type='Shear', + level=0, + prob=1., + img_fill_val=img_fill_val, + seg_ignore_label=seg_ignore_label, + direction='horizontal') + shear_module = build_from_cfg(transform, PIPELINES) + results_wo_shear = shear_module(copy.deepcopy(results)) + check_result_same(results, results_wo_shear) + + # test case when no shear aug (level=0, direction='vertical') + transform = dict( + type='Shear', + level=0, + prob=1., + img_fill_val=img_fill_val, + seg_ignore_label=seg_ignore_label, + direction='vertical') + shear_module = build_from_cfg(transform, PIPELINES) + results_wo_shear = shear_module(copy.deepcopy(results)) + check_result_same(results, results_wo_shear) + + # test case when no shear aug (prob<=0) + transform = dict( + type='Shear', + level=10, + prob=0., + img_fill_val=img_fill_val, + direction='vertical') + shear_module = build_from_cfg(transform, PIPELINES) + results_wo_shear = shear_module(copy.deepcopy(results)) + check_result_same(results, results_wo_shear) + + # test shear horizontally, magnitude=1 + transform = dict( + type='Shear', + level=10, + prob=1., + img_fill_val=img_fill_val, + direction='horizontal', + max_shear_magnitude=1., + random_negative_prob=0.) + shear_module = build_from_cfg(transform, PIPELINES) + results_sheared = shear_module(copy.deepcopy(results)) + results_gt = copy.deepcopy(results) + img_s = np.array([[1, 2, 3, 4], [0, 5, 6, 7]], dtype=np.uint8) + img_s = np.stack([img_s, img_s, img_s], axis=-1) + img_s[1, 0, :] = np.array(img_fill_val) + results_gt['img'] = img_s + results_gt['gt_bboxes'] = np.array([[0., 0., 3., 1.]], dtype=np.float32) + results_gt['gt_bboxes_ignore'] = np.array([[2., 0., 4., 1.]], + dtype=np.float32) + gt_masks = np.array([[0, 1, 1, 0], [0, 0, 1, 0]], + dtype=np.uint8)[None, :, :] + results_gt['gt_masks'] = BitmapMasks(gt_masks, 2, 4) + results_gt['gt_semantic_seg'] = np.array( + [[1, 2, 3, 4], [255, 5, 6, 7]], dtype=results['gt_semantic_seg'].dtype) + check_result_same(results_gt, results_sheared) + + # test PolygonMasks with shear horizontally, magnitude=1 + results = construct_toy_data(poly2mask=False) + results_sheared = shear_module(copy.deepcopy(results)) + print(results_sheared['gt_masks']) + gt_masks = [[np.array([0, 0, 2, 0, 3, 1, 1, 1], dtype=np.float)]] + results_gt['gt_masks'] = PolygonMasks(gt_masks, 2, 4) + check_result_same(results_gt, results_sheared) + + # test shear vertically, magnitude=-1 + img_fill_val = 128 + results = construct_toy_data() + transform = dict( + type='Shear', + level=10, + prob=1., + img_fill_val=img_fill_val, + direction='vertical', + max_shear_magnitude=1., + random_negative_prob=1.) + shear_module = build_from_cfg(transform, PIPELINES) + results_sheared = shear_module(copy.deepcopy(results)) + results_gt = copy.deepcopy(results) + img_s = np.array([[1, 6, img_fill_val, img_fill_val], + [5, img_fill_val, img_fill_val, img_fill_val]], + dtype=np.uint8) + img_s = np.stack([img_s, img_s, img_s], axis=-1) + results_gt['img'] = img_s + results_gt['gt_bboxes'] = np.empty((0, 4), dtype=np.float32) + results_gt['gt_labels'] = np.empty((0, ), dtype=np.int64) + results_gt['gt_bboxes_ignore'] = np.empty((0, 4), dtype=np.float32) + gt_masks = np.array([[0, 1, 0, 0], [0, 0, 0, 0]], + dtype=np.uint8)[None, :, :] + results_gt['gt_masks'] = BitmapMasks(gt_masks, 2, 4) + results_gt['gt_semantic_seg'] = np.array( + [[1, 6, 255, 255], [5, 255, 255, 255]], + dtype=results['gt_semantic_seg'].dtype) + check_result_same(results_gt, results_sheared) + + # test PolygonMasks with shear vertically, magnitude=-1 + results = construct_toy_data(poly2mask=False) + results_sheared = shear_module(copy.deepcopy(results)) + gt_masks = [[np.array([0, 0, 2, 0, 2, 0, 0, 1], dtype=np.float)]] + results_gt['gt_masks'] = PolygonMasks(gt_masks, 2, 4) + check_result_same(results_gt, results_sheared) + + results = construct_toy_data() + # same mask for BitmapMasks and PolygonMasks + results['gt_masks'] = BitmapMasks( + np.array([[0, 1, 1, 0], [0, 1, 1, 0]], dtype=np.uint8)[None, :, :], 2, + 4) + results['gt_bboxes'] = np.array([[1., 0., 2., 1.]], dtype=np.float32) + results_sheared_bitmap = shear_module(copy.deepcopy(results)) + check_result_same(results_sheared_bitmap, results_sheared) + + # test AutoAugment equipped with Shear + policies = [[dict(type='Shear', level=10, prob=1.)]] + autoaug = dict(type='AutoAugment', policies=policies) + autoaug_module = build_from_cfg(autoaug, PIPELINES) + autoaug_module(copy.deepcopy(results)) + + policies = [[ + dict(type='Shear', level=10, prob=1.), + dict( + type='Shear', + level=8, + img_fill_val=img_fill_val, + direction='vertical', + max_shear_magnitude=1.) + ]] + autoaug = dict(type='AutoAugment', policies=policies) + autoaug_module = build_from_cfg(autoaug, PIPELINES) + autoaug_module(copy.deepcopy(results)) diff --git a/tests/test_data/test_pipelines/test_transform/test_transform.py b/tests/test_data/test_pipelines/test_transform/test_transform.py new file mode 100644 index 0000000..1ebc4f3 --- /dev/null +++ b/tests/test_data/test_pipelines/test_transform/test_transform.py @@ -0,0 +1,1118 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy +import os.path as osp + +import mmcv +import numpy as np +import pytest +import torch +from mmcv.utils import build_from_cfg + +from mmdet.core.evaluation.bbox_overlaps import bbox_overlaps +from mmdet.datasets.builder import PIPELINES +from .utils import create_full_masks, create_random_bboxes + + +def test_resize(): + # test assertion if img_scale is a list + with pytest.raises(AssertionError): + transform = dict(type='Resize', img_scale=[1333, 800], keep_ratio=True) + build_from_cfg(transform, PIPELINES) + + # test assertion if len(img_scale) while ratio_range is not None + with pytest.raises(AssertionError): + transform = dict( + type='Resize', + img_scale=[(1333, 800), (1333, 600)], + ratio_range=(0.9, 1.1), + keep_ratio=True) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid multiscale_mode + with pytest.raises(AssertionError): + transform = dict( + type='Resize', + img_scale=[(1333, 800), (1333, 600)], + keep_ratio=True, + multiscale_mode='2333') + build_from_cfg(transform, PIPELINES) + + # test assertion if both scale and scale_factor are set + with pytest.raises(AssertionError): + results = dict( + img_prefix=osp.join(osp.dirname(__file__), '../../../data'), + img_info=dict(filename='color.jpg')) + load = dict(type='LoadImageFromFile') + load = build_from_cfg(load, PIPELINES) + transform = dict(type='Resize', img_scale=(1333, 800), keep_ratio=True) + transform = build_from_cfg(transform, PIPELINES) + results = load(results) + results['scale'] = (1333, 800) + results['scale_factor'] = 1.0 + results = transform(results) + + transform = dict(type='Resize', img_scale=(1333, 800), keep_ratio=True) + resize_module = build_from_cfg(transform, PIPELINES) + + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../../../data/color.jpg'), 'color') + results['img'] = img + results['img2'] = copy.deepcopy(img) + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['img_fields'] = ['img', 'img2'] + + results = resize_module(results) + assert np.equal(results['img'], results['img2']).all() + + results.pop('scale') + results.pop('scale_factor') + transform = dict( + type='Resize', + img_scale=(1280, 800), + multiscale_mode='value', + keep_ratio=False) + resize_module = build_from_cfg(transform, PIPELINES) + results = resize_module(results) + assert np.equal(results['img'], results['img2']).all() + assert results['img_shape'] == (800, 1280, 3) + assert results['img'].dtype == results['img'].dtype == np.uint8 + + results_seg = { + 'img': img, + 'img_shape': img.shape, + 'ori_shape': img.shape, + 'gt_semantic_seg': copy.deepcopy(img), + 'gt_seg': copy.deepcopy(img), + 'seg_fields': ['gt_semantic_seg', 'gt_seg'] + } + transform = dict( + type='Resize', + img_scale=(640, 400), + multiscale_mode='value', + keep_ratio=False) + resize_module = build_from_cfg(transform, PIPELINES) + results_seg = resize_module(results_seg) + assert results_seg['gt_semantic_seg'].shape == results_seg['gt_seg'].shape + assert results_seg['img_shape'] == (400, 640, 3) + assert results_seg['img_shape'] != results_seg['ori_shape'] + assert results_seg['gt_semantic_seg'].shape == results_seg['img_shape'] + assert np.equal(results_seg['gt_semantic_seg'], + results_seg['gt_seg']).all() + + +def test_flip(): + # test assertion for invalid flip_ratio + with pytest.raises(AssertionError): + transform = dict(type='RandomFlip', flip_ratio=1.5) + build_from_cfg(transform, PIPELINES) + # test assertion for 0 <= sum(flip_ratio) <= 1 + with pytest.raises(AssertionError): + transform = dict( + type='RandomFlip', + flip_ratio=[0.7, 0.8], + direction=['horizontal', 'vertical']) + build_from_cfg(transform, PIPELINES) + + # test assertion for mismatch between number of flip_ratio and direction + with pytest.raises(AssertionError): + transform = dict(type='RandomFlip', flip_ratio=[0.4, 0.5]) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid direction + with pytest.raises(AssertionError): + transform = dict( + type='RandomFlip', flip_ratio=1., direction='horizonta') + build_from_cfg(transform, PIPELINES) + + transform = dict(type='RandomFlip', flip_ratio=1.) + flip_module = build_from_cfg(transform, PIPELINES) + + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../../../data/color.jpg'), 'color') + original_img = copy.deepcopy(img) + results['img'] = img + results['img2'] = copy.deepcopy(img) + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + results['img_fields'] = ['img', 'img2'] + + results = flip_module(results) + assert np.equal(results['img'], results['img2']).all() + + flip_module = build_from_cfg(transform, PIPELINES) + results = flip_module(results) + assert np.equal(results['img'], results['img2']).all() + assert np.equal(original_img, results['img']).all() + + # test flip_ratio is float, direction is list + transform = dict( + type='RandomFlip', + flip_ratio=0.9, + direction=['horizontal', 'vertical', 'diagonal']) + flip_module = build_from_cfg(transform, PIPELINES) + + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../../../data/color.jpg'), 'color') + original_img = copy.deepcopy(img) + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + results['img_fields'] = ['img'] + results = flip_module(results) + if results['flip']: + assert np.array_equal( + mmcv.imflip(original_img, results['flip_direction']), + results['img']) + else: + assert np.array_equal(original_img, results['img']) + + # test flip_ratio is list, direction is list + transform = dict( + type='RandomFlip', + flip_ratio=[0.3, 0.3, 0.2], + direction=['horizontal', 'vertical', 'diagonal']) + flip_module = build_from_cfg(transform, PIPELINES) + + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../../../data/color.jpg'), 'color') + original_img = copy.deepcopy(img) + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + results['img_fields'] = ['img'] + results = flip_module(results) + if results['flip']: + assert np.array_equal( + mmcv.imflip(original_img, results['flip_direction']), + results['img']) + else: + assert np.array_equal(original_img, results['img']) + + +def test_random_crop(): + # test assertion for invalid random crop + with pytest.raises(AssertionError): + transform = dict(type='RandomCrop', crop_size=(-1, 0)) + build_from_cfg(transform, PIPELINES) + + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../../../data/color.jpg'), 'color') + results['img'] = img + + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # TODO: add img_fields test + results['bbox_fields'] = ['gt_bboxes', 'gt_bboxes_ignore'] + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + + h, w, _ = img.shape + gt_bboxes = create_random_bboxes(8, w, h) + gt_bboxes_ignore = create_random_bboxes(2, w, h) + results['gt_labels'] = np.ones(gt_bboxes.shape[0], dtype=np.int64) + results['gt_bboxes'] = gt_bboxes + results['gt_bboxes_ignore'] = gt_bboxes_ignore + transform = dict(type='RandomCrop', crop_size=(h - 20, w - 20)) + crop_module = build_from_cfg(transform, PIPELINES) + results = crop_module(results) + assert results['img'].shape[:2] == (h - 20, w - 20) + # All bboxes should be reserved after crop + assert results['img_shape'][:2] == (h - 20, w - 20) + assert results['gt_labels'].shape[0] == results['gt_bboxes'].shape[0] + assert results['gt_labels'].dtype == np.int64 + assert results['gt_bboxes'].dtype == np.float32 + assert results['gt_bboxes'].shape[0] == 8 + assert results['gt_bboxes_ignore'].shape[0] == 2 + + def area(bboxes): + return np.prod(bboxes[:, 2:4] - bboxes[:, 0:2], axis=1) + + assert (area(results['gt_bboxes']) <= area(gt_bboxes)).all() + assert (area(results['gt_bboxes_ignore']) <= area(gt_bboxes_ignore)).all() + assert results['gt_bboxes'].dtype == np.float32 + assert results['gt_bboxes_ignore'].dtype == np.float32 + + # test assertion for invalid crop_type + with pytest.raises(ValueError): + transform = dict( + type='RandomCrop', crop_size=(1, 1), crop_type='unknown') + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid crop_size + with pytest.raises(AssertionError): + transform = dict( + type='RandomCrop', crop_type='relative', crop_size=(0, 0)) + build_from_cfg(transform, PIPELINES) + + def _construct_toy_data(): + img = np.array([[1, 2, 3, 4], [5, 6, 7, 8]], dtype=np.uint8) + img = np.stack([img, img, img], axis=-1) + results = dict() + # image + results['img'] = img + results['img_shape'] = img.shape + results['img_fields'] = ['img'] + # bboxes + results['bbox_fields'] = ['gt_bboxes', 'gt_bboxes_ignore'] + results['gt_bboxes'] = np.array([[0., 0., 2., 1.]], dtype=np.float32) + results['gt_bboxes_ignore'] = np.array([[2., 0., 3., 1.]], + dtype=np.float32) + # labels + results['gt_labels'] = np.array([1], dtype=np.int64) + return results + + # test crop_type "relative_range" + results = _construct_toy_data() + transform = dict( + type='RandomCrop', + crop_type='relative_range', + crop_size=(0.3, 0.7), + allow_negative_crop=True) + transform_module = build_from_cfg(transform, PIPELINES) + results_transformed = transform_module(copy.deepcopy(results)) + h, w = results_transformed['img_shape'][:2] + assert int(2 * 0.3 + 0.5) <= h <= int(2 * 1 + 0.5) + assert int(4 * 0.7 + 0.5) <= w <= int(4 * 1 + 0.5) + assert results_transformed['gt_bboxes'].dtype == np.float32 + assert results_transformed['gt_bboxes_ignore'].dtype == np.float32 + + # test crop_type "relative" + transform = dict( + type='RandomCrop', + crop_type='relative', + crop_size=(0.3, 0.7), + allow_negative_crop=True) + transform_module = build_from_cfg(transform, PIPELINES) + results_transformed = transform_module(copy.deepcopy(results)) + h, w = results_transformed['img_shape'][:2] + assert h == int(2 * 0.3 + 0.5) and w == int(4 * 0.7 + 0.5) + assert results_transformed['gt_bboxes'].dtype == np.float32 + assert results_transformed['gt_bboxes_ignore'].dtype == np.float32 + + # test crop_type "absolute" + transform = dict( + type='RandomCrop', + crop_type='absolute', + crop_size=(1, 2), + allow_negative_crop=True) + transform_module = build_from_cfg(transform, PIPELINES) + results_transformed = transform_module(copy.deepcopy(results)) + h, w = results_transformed['img_shape'][:2] + assert h == 1 and w == 2 + assert results_transformed['gt_bboxes'].dtype == np.float32 + assert results_transformed['gt_bboxes_ignore'].dtype == np.float32 + + # test crop_type "absolute_range" + transform = dict( + type='RandomCrop', + crop_type='absolute_range', + crop_size=(1, 20), + allow_negative_crop=True) + transform_module = build_from_cfg(transform, PIPELINES) + results_transformed = transform_module(copy.deepcopy(results)) + h, w = results_transformed['img_shape'][:2] + assert 1 <= h <= 2 and 1 <= w <= 4 + assert results_transformed['gt_bboxes'].dtype == np.float32 + assert results_transformed['gt_bboxes_ignore'].dtype == np.float32 + + +def test_min_iou_random_crop(): + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../../../data/color.jpg'), 'color') + results['img'] = img + + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + results['bbox_fields'] = ['gt_bboxes', 'gt_bboxes_ignore'] + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + h, w, _ = img.shape + gt_bboxes = create_random_bboxes(1, w, h) + gt_bboxes_ignore = create_random_bboxes(1, w, h) + results['gt_labels'] = np.ones(gt_bboxes.shape[0], dtype=np.int64) + results['gt_bboxes'] = gt_bboxes + results['gt_bboxes_ignore'] = gt_bboxes_ignore + transform = dict(type='MinIoURandomCrop') + crop_module = build_from_cfg(transform, PIPELINES) + + # Test for img_fields + results_test = copy.deepcopy(results) + results_test['img1'] = results_test['img'] + results_test['img_fields'] = ['img', 'img1'] + with pytest.raises(AssertionError): + crop_module(results_test) + results = crop_module(results) + assert results['gt_labels'].shape[0] == results['gt_bboxes'].shape[0] + assert results['gt_labels'].dtype == np.int64 + assert results['gt_bboxes'].dtype == np.float32 + assert results['gt_bboxes_ignore'].dtype == np.float32 + + patch = np.array([0, 0, results['img_shape'][1], results['img_shape'][0]]) + ious = bbox_overlaps(patch.reshape(-1, 4), + results['gt_bboxes']).reshape(-1) + ious_ignore = bbox_overlaps( + patch.reshape(-1, 4), results['gt_bboxes_ignore']).reshape(-1) + mode = crop_module.mode + if mode == 1: + assert np.equal(results['gt_bboxes'], gt_bboxes).all() + assert np.equal(results['gt_bboxes_ignore'], gt_bboxes_ignore).all() + else: + assert (ious >= mode).all() + assert (ious_ignore >= mode).all() + + +def test_pad(): + # test assertion if both size_divisor and size is None + with pytest.raises(AssertionError): + transform = dict(type='Pad') + build_from_cfg(transform, PIPELINES) + + transform = dict(type='Pad', size_divisor=32) + transform = build_from_cfg(transform, PIPELINES) + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../../../data/color.jpg'), 'color') + original_img = copy.deepcopy(img) + results['img'] = img + results['img2'] = copy.deepcopy(img) + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + results['img_fields'] = ['img', 'img2'] + + results = transform(results) + assert np.equal(results['img'], results['img2']).all() + # original img already divisible by 32 + assert np.equal(results['img'], original_img).all() + img_shape = results['img'].shape + assert img_shape[0] % 32 == 0 + assert img_shape[1] % 32 == 0 + + resize_transform = dict( + type='Resize', img_scale=(1333, 800), keep_ratio=True) + resize_module = build_from_cfg(resize_transform, PIPELINES) + results = resize_module(results) + results = transform(results) + img_shape = results['img'].shape + assert np.equal(results['img'], results['img2']).all() + assert img_shape[0] % 32 == 0 + assert img_shape[1] % 32 == 0 + + # test the size and size_divisor must be None when pad2square is True + with pytest.raises(AssertionError): + transform = dict(type='Pad', size_divisor=32, pad_to_square=True) + build_from_cfg(transform, PIPELINES) + + transform = dict(type='Pad', pad_to_square=True) + transform = build_from_cfg(transform, PIPELINES) + results['img'] = img + results = transform(results) + assert results['img'].shape[0] == results['img'].shape[1] + + # test the pad_val is converted to a dict + transform = dict(type='Pad', size_divisor=32, pad_val=0) + with pytest.deprecated_call(): + transform = build_from_cfg(transform, PIPELINES) + + assert isinstance(transform.pad_val, dict) + results = transform(results) + img_shape = results['img'].shape + assert img_shape[0] % 32 == 0 + assert img_shape[1] % 32 == 0 + + +def test_normalize(): + img_norm_cfg = dict( + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True) + transform = dict(type='Normalize', **img_norm_cfg) + transform = build_from_cfg(transform, PIPELINES) + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../../../data/color.jpg'), 'color') + original_img = copy.deepcopy(img) + results['img'] = img + results['img2'] = copy.deepcopy(img) + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['scale_factor'] = 1.0 + results['img_fields'] = ['img', 'img2'] + + results = transform(results) + assert np.equal(results['img'], results['img2']).all() + + mean = np.array(img_norm_cfg['mean']) + std = np.array(img_norm_cfg['std']) + converted_img = (original_img[..., ::-1] - mean) / std + assert np.allclose(results['img'], converted_img) + + +def test_albu_transform(): + results = dict( + img_prefix=osp.join(osp.dirname(__file__), '../../../data'), + img_info=dict(filename='color.jpg')) + + # Define simple pipeline + load = dict(type='LoadImageFromFile') + load = build_from_cfg(load, PIPELINES) + + albu_transform = dict( + type='Albu', transforms=[dict(type='ChannelShuffle', p=1)]) + albu_transform = build_from_cfg(albu_transform, PIPELINES) + + normalize = dict(type='Normalize', mean=[0] * 3, std=[0] * 3, to_rgb=True) + normalize = build_from_cfg(normalize, PIPELINES) + + # Execute transforms + results = load(results) + results = albu_transform(results) + results = normalize(results) + + assert results['img'].dtype == np.float32 + + +def test_random_center_crop_pad(): + # test assertion for invalid crop_size while test_mode=False + with pytest.raises(AssertionError): + transform = dict( + type='RandomCenterCropPad', + crop_size=(-1, 0), + test_mode=False, + test_pad_mode=None) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid ratios while test_mode=False + with pytest.raises(AssertionError): + transform = dict( + type='RandomCenterCropPad', + crop_size=(511, 511), + ratios=(1.0), + test_mode=False, + test_pad_mode=None) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid mean, std and to_rgb + with pytest.raises(AssertionError): + transform = dict( + type='RandomCenterCropPad', + crop_size=(511, 511), + mean=None, + std=None, + to_rgb=None, + test_mode=False, + test_pad_mode=None) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid crop_size while test_mode=True + with pytest.raises(AssertionError): + transform = dict( + type='RandomCenterCropPad', + crop_size=(511, 511), + ratios=None, + border=None, + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True, + test_mode=True, + test_pad_mode=('logical_or', 127)) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid ratios while test_mode=True + with pytest.raises(AssertionError): + transform = dict( + type='RandomCenterCropPad', + crop_size=None, + ratios=(0.9, 1.0, 1.1), + border=None, + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True, + test_mode=True, + test_pad_mode=('logical_or', 127)) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid border while test_mode=True + with pytest.raises(AssertionError): + transform = dict( + type='RandomCenterCropPad', + crop_size=None, + ratios=None, + border=128, + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True, + test_mode=True, + test_pad_mode=('logical_or', 127)) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid test_pad_mode while test_mode=True + with pytest.raises(AssertionError): + transform = dict( + type='RandomCenterCropPad', + crop_size=None, + ratios=None, + border=None, + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True, + test_mode=True, + test_pad_mode=('do_nothing', 100)) + build_from_cfg(transform, PIPELINES) + + results = dict( + img_prefix=osp.join(osp.dirname(__file__), '../../../data'), + img_info=dict(filename='color.jpg')) + + load = dict(type='LoadImageFromFile', to_float32=True) + load = build_from_cfg(load, PIPELINES) + results = load(results) + test_results = copy.deepcopy(results) + + h, w, _ = results['img_shape'] + gt_bboxes = create_random_bboxes(8, w, h) + gt_bboxes_ignore = create_random_bboxes(2, w, h) + results['gt_bboxes'] = gt_bboxes + results['gt_bboxes_ignore'] = gt_bboxes_ignore + train_transform = dict( + type='RandomCenterCropPad', + crop_size=(h - 20, w - 20), + ratios=(1.0, ), + border=128, + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True, + test_mode=False, + test_pad_mode=None) + crop_module = build_from_cfg(train_transform, PIPELINES) + train_results = crop_module(results) + assert train_results['img'].shape[:2] == (h - 20, w - 20) + # All bboxes should be reserved after crop + assert train_results['pad_shape'][:2] == (h - 20, w - 20) + assert train_results['gt_bboxes'].shape[0] == 8 + assert train_results['gt_bboxes_ignore'].shape[0] == 2 + assert train_results['gt_bboxes'].dtype == np.float32 + assert train_results['gt_bboxes_ignore'].dtype == np.float32 + + test_transform = dict( + type='RandomCenterCropPad', + crop_size=None, + ratios=None, + border=None, + mean=[123.675, 116.28, 103.53], + std=[58.395, 57.12, 57.375], + to_rgb=True, + test_mode=True, + test_pad_mode=('logical_or', 127)) + crop_module = build_from_cfg(test_transform, PIPELINES) + + test_results = crop_module(test_results) + assert test_results['img'].shape[:2] == (h | 127, w | 127) + assert test_results['pad_shape'][:2] == (h | 127, w | 127) + assert 'border' in test_results + + +def test_multi_scale_flip_aug(): + # test assertion if give both scale_factor and img_scale + with pytest.raises(AssertionError): + transform = dict( + type='MultiScaleFlipAug', + scale_factor=1.0, + img_scale=[(1333, 800)], + transforms=[dict(type='Resize')]) + build_from_cfg(transform, PIPELINES) + + # test assertion if both scale_factor and img_scale are None + with pytest.raises(AssertionError): + transform = dict( + type='MultiScaleFlipAug', + scale_factor=None, + img_scale=None, + transforms=[dict(type='Resize')]) + build_from_cfg(transform, PIPELINES) + + # test assertion if img_scale is not tuple or list of tuple + with pytest.raises(AssertionError): + transform = dict( + type='MultiScaleFlipAug', + img_scale=[1333, 800], + transforms=[dict(type='Resize')]) + build_from_cfg(transform, PIPELINES) + + # test assertion if flip_direction is not str or list of str + with pytest.raises(AssertionError): + transform = dict( + type='MultiScaleFlipAug', + img_scale=[(1333, 800)], + flip_direction=1, + transforms=[dict(type='Resize')]) + build_from_cfg(transform, PIPELINES) + + scale_transform = dict( + type='MultiScaleFlipAug', + img_scale=[(1333, 800), (1333, 640)], + transforms=[dict(type='Resize', keep_ratio=True)]) + transform = build_from_cfg(scale_transform, PIPELINES) + + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../../../data/color.jpg'), 'color') + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + # Set initial values for default meta_keys + results['pad_shape'] = img.shape + results['img_fields'] = ['img'] + + scale_results = transform(copy.deepcopy(results)) + assert len(scale_results['img']) == 2 + assert scale_results['img'][0].shape == (750, 1333, 3) + assert scale_results['img_shape'][0] == (750, 1333, 3) + assert scale_results['img'][1].shape == (640, 1138, 3) + assert scale_results['img_shape'][1] == (640, 1138, 3) + + scale_factor_transform = dict( + type='MultiScaleFlipAug', + scale_factor=[0.8, 1.0, 1.2], + transforms=[dict(type='Resize', keep_ratio=False)]) + transform = build_from_cfg(scale_factor_transform, PIPELINES) + scale_factor_results = transform(copy.deepcopy(results)) + assert len(scale_factor_results['img']) == 3 + assert scale_factor_results['img'][0].shape == (230, 409, 3) + assert scale_factor_results['img_shape'][0] == (230, 409, 3) + assert scale_factor_results['img'][1].shape == (288, 512, 3) + assert scale_factor_results['img_shape'][1] == (288, 512, 3) + assert scale_factor_results['img'][2].shape == (345, 614, 3) + assert scale_factor_results['img_shape'][2] == (345, 614, 3) + + # test pipeline of coco_detection + results = dict( + img_prefix=osp.join(osp.dirname(__file__), '../../../data'), + img_info=dict(filename='color.jpg')) + load_cfg, multi_scale_cfg = mmcv.Config.fromfile( + 'configs/_base_/datasets/coco_detection.py').test_pipeline + load = build_from_cfg(load_cfg, PIPELINES) + transform = build_from_cfg(multi_scale_cfg, PIPELINES) + results = transform(load(results)) + assert len(results['img']) == 1 + assert len(results['img_metas']) == 1 + assert isinstance(results['img'][0], torch.Tensor) + assert isinstance(results['img_metas'][0], mmcv.parallel.DataContainer) + assert results['img_metas'][0].data['ori_shape'] == (288, 512, 3) + assert results['img_metas'][0].data['img_shape'] == (750, 1333, 3) + assert results['img_metas'][0].data['pad_shape'] == (768, 1344, 3) + assert results['img_metas'][0].data['scale_factor'].tolist() == [ + 2.603515625, 2.6041667461395264, 2.603515625, 2.6041667461395264 + ] + + +def test_cutout(): + # test n_holes + with pytest.raises(AssertionError): + transform = dict(type='CutOut', n_holes=(5, 3), cutout_shape=(8, 8)) + build_from_cfg(transform, PIPELINES) + with pytest.raises(AssertionError): + transform = dict(type='CutOut', n_holes=(3, 4, 5), cutout_shape=(8, 8)) + build_from_cfg(transform, PIPELINES) + # test cutout_shape and cutout_ratio + with pytest.raises(AssertionError): + transform = dict(type='CutOut', n_holes=1, cutout_shape=8) + build_from_cfg(transform, PIPELINES) + with pytest.raises(AssertionError): + transform = dict(type='CutOut', n_holes=1, cutout_ratio=0.2) + build_from_cfg(transform, PIPELINES) + # either of cutout_shape and cutout_ratio should be given + with pytest.raises(AssertionError): + transform = dict(type='CutOut', n_holes=1) + build_from_cfg(transform, PIPELINES) + with pytest.raises(AssertionError): + transform = dict( + type='CutOut', + n_holes=1, + cutout_shape=(2, 2), + cutout_ratio=(0.4, 0.4)) + build_from_cfg(transform, PIPELINES) + + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../../../data/color.jpg'), 'color') + + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + results['pad_shape'] = img.shape + results['img_fields'] = ['img'] + + transform = dict(type='CutOut', n_holes=1, cutout_shape=(10, 10)) + cutout_module = build_from_cfg(transform, PIPELINES) + cutout_result = cutout_module(copy.deepcopy(results)) + assert cutout_result['img'].sum() < img.sum() + + transform = dict(type='CutOut', n_holes=1, cutout_ratio=(0.8, 0.8)) + cutout_module = build_from_cfg(transform, PIPELINES) + cutout_result = cutout_module(copy.deepcopy(results)) + assert cutout_result['img'].sum() < img.sum() + + transform = dict( + type='CutOut', + n_holes=(2, 4), + cutout_shape=[(10, 10), (15, 15)], + fill_in=(255, 255, 255)) + cutout_module = build_from_cfg(transform, PIPELINES) + cutout_result = cutout_module(copy.deepcopy(results)) + assert cutout_result['img'].sum() > img.sum() + + transform = dict( + type='CutOut', + n_holes=1, + cutout_ratio=(0.8, 0.8), + fill_in=(255, 255, 255)) + cutout_module = build_from_cfg(transform, PIPELINES) + cutout_result = cutout_module(copy.deepcopy(results)) + assert cutout_result['img'].sum() > img.sum() + + +def test_random_shift(): + # test assertion for invalid shift_ratio + with pytest.raises(AssertionError): + transform = dict(type='RandomShift', shift_ratio=1.5) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid max_shift_px + with pytest.raises(AssertionError): + transform = dict(type='RandomShift', max_shift_px=-1) + build_from_cfg(transform, PIPELINES) + + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../../../data/color.jpg'), 'color') + results['img'] = img + # TODO: add img_fields test + results['bbox_fields'] = ['gt_bboxes', 'gt_bboxes_ignore'] + + h, w, _ = img.shape + gt_bboxes = create_random_bboxes(8, w, h) + gt_bboxes_ignore = create_random_bboxes(2, w, h) + results['gt_labels'] = np.ones(gt_bboxes.shape[0], dtype=np.int64) + results['gt_bboxes'] = gt_bboxes + results['gt_bboxes_ignore'] = gt_bboxes_ignore + transform = dict(type='RandomShift', shift_ratio=1.0) + random_shift_module = build_from_cfg(transform, PIPELINES) + results = random_shift_module(results) + + assert results['img'].shape[:2] == (h, w) + assert results['gt_labels'].shape[0] == results['gt_bboxes'].shape[0] + assert results['gt_labels'].dtype == np.int64 + assert results['gt_bboxes'].dtype == np.float32 + assert results['gt_bboxes_ignore'].dtype == np.float32 + + +def test_random_affine(): + # test assertion for invalid translate_ratio + with pytest.raises(AssertionError): + transform = dict(type='RandomAffine', max_translate_ratio=1.5) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid scaling_ratio_range + with pytest.raises(AssertionError): + transform = dict(type='RandomAffine', scaling_ratio_range=(1.5, 0.5)) + build_from_cfg(transform, PIPELINES) + + with pytest.raises(AssertionError): + transform = dict(type='RandomAffine', scaling_ratio_range=(0, 0.5)) + build_from_cfg(transform, PIPELINES) + + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../../../data/color.jpg'), 'color') + results['img'] = img + results['bbox_fields'] = ['gt_bboxes', 'gt_bboxes_ignore'] + + h, w, _ = img.shape + gt_bboxes = create_random_bboxes(8, w, h) + gt_bboxes_ignore = create_random_bboxes(2, w, h) + results['gt_labels'] = np.ones(gt_bboxes.shape[0], dtype=np.int64) + results['gt_bboxes'] = gt_bboxes + results['gt_bboxes_ignore'] = gt_bboxes_ignore + transform = dict(type='RandomAffine') + random_affine_module = build_from_cfg(transform, PIPELINES) + results = random_affine_module(results) + + assert results['img'].shape[:2] == (h, w) + assert results['gt_labels'].shape[0] == results['gt_bboxes'].shape[0] + assert results['gt_labels'].dtype == np.int64 + assert results['gt_bboxes'].dtype == np.float32 + assert results['gt_bboxes_ignore'].dtype == np.float32 + + # test filter bbox + gt_bboxes = np.array([[0, 0, 1, 1], [0, 0, 3, 100]], dtype=np.float32) + results['gt_labels'] = np.ones(gt_bboxes.shape[0], dtype=np.int64) + results['gt_bboxes'] = gt_bboxes + transform = dict( + type='RandomAffine', + max_rotate_degree=0., + max_translate_ratio=0., + scaling_ratio_range=(1., 1.), + max_shear_degree=0., + border=(0, 0), + min_bbox_size=2, + max_aspect_ratio=20, + skip_filter=False) + random_affine_module = build_from_cfg(transform, PIPELINES) + + results = random_affine_module(results) + + assert results['gt_bboxes'].shape[0] == 0 + assert results['gt_labels'].shape[0] == 0 + assert results['gt_labels'].shape[0] == results['gt_bboxes'].shape[0] + assert results['gt_labels'].dtype == np.int64 + assert results['gt_bboxes'].dtype == np.float32 + assert results['gt_bboxes_ignore'].dtype == np.float32 + + +def test_mosaic(): + # test assertion for invalid img_scale + with pytest.raises(AssertionError): + transform = dict(type='Mosaic', img_scale=640) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid probability + with pytest.raises(AssertionError): + transform = dict(type='Mosaic', prob=1.5) + build_from_cfg(transform, PIPELINES) + + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../../../data/color.jpg'), 'color') + results['img'] = img + # TODO: add img_fields test + results['bbox_fields'] = ['gt_bboxes', 'gt_bboxes_ignore'] + + h, w, _ = img.shape + gt_bboxes = create_random_bboxes(8, w, h) + gt_bboxes_ignore = create_random_bboxes(2, w, h) + results['gt_labels'] = np.ones(gt_bboxes.shape[0], dtype=np.int64) + results['gt_bboxes'] = gt_bboxes + results['gt_bboxes_ignore'] = gt_bboxes_ignore + transform = dict(type='Mosaic', img_scale=(10, 12)) + mosaic_module = build_from_cfg(transform, PIPELINES) + + # test assertion for invalid mix_results + with pytest.raises(AssertionError): + mosaic_module(results) + + results['mix_results'] = [copy.deepcopy(results)] * 3 + results = mosaic_module(results) + assert results['img'].shape[:2] == (20, 24) + assert results['gt_labels'].shape[0] == results['gt_bboxes'].shape[0] + assert results['gt_labels'].dtype == np.int64 + assert results['gt_bboxes'].dtype == np.float32 + assert results['gt_bboxes_ignore'].dtype == np.float32 + + +def test_mixup(): + # test assertion for invalid img_scale + with pytest.raises(AssertionError): + transform = dict(type='MixUp', img_scale=640) + build_from_cfg(transform, PIPELINES) + + results = dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../../../data/color.jpg'), 'color') + results['img'] = img + # TODO: add img_fields test + results['bbox_fields'] = ['gt_bboxes', 'gt_bboxes_ignore'] + + h, w, _ = img.shape + gt_bboxes = create_random_bboxes(8, w, h) + gt_bboxes_ignore = create_random_bboxes(2, w, h) + results['gt_labels'] = np.ones(gt_bboxes.shape[0], dtype=np.int64) + results['gt_bboxes'] = gt_bboxes + results['gt_bboxes_ignore'] = gt_bboxes_ignore + transform = dict(type='MixUp', img_scale=(10, 12)) + mixup_module = build_from_cfg(transform, PIPELINES) + + # test assertion for invalid mix_results + with pytest.raises(AssertionError): + mixup_module(results) + + with pytest.raises(AssertionError): + results['mix_results'] = [copy.deepcopy(results)] * 2 + mixup_module(results) + + results['mix_results'] = [copy.deepcopy(results)] + results = mixup_module(results) + assert results['img'].shape[:2] == (288, 512) + assert results['gt_labels'].shape[0] == results['gt_bboxes'].shape[0] + assert results['gt_labels'].dtype == np.int64 + assert results['gt_bboxes'].dtype == np.float32 + assert results['gt_bboxes_ignore'].dtype == np.float32 + + # test filter bbox : + # 2 boxes with sides 1 and 3 are filtered as min_bbox_size=5 + gt_bboxes = np.array([[0, 0, 1, 1], [0, 0, 3, 3]], dtype=np.float32) + results['gt_labels'] = np.ones(gt_bboxes.shape[0], dtype=np.int64) + results['gt_bboxes'] = gt_bboxes + results['gt_bboxes_ignore'] = np.array([], dtype=np.float32) + mixresults = results['mix_results'][0] + mixresults['gt_labels'] = copy.deepcopy(results['gt_labels']) + mixresults['gt_bboxes'] = copy.deepcopy(results['gt_bboxes']) + mixresults['gt_bboxes_ignore'] = copy.deepcopy(results['gt_bboxes_ignore']) + transform = dict( + type='MixUp', + img_scale=(10, 12), + ratio_range=(1.5, 1.5), + min_bbox_size=5, + skip_filter=False) + mixup_module = build_from_cfg(transform, PIPELINES) + + results = mixup_module(results) + + assert results['gt_bboxes'].shape[0] == 2 + assert results['gt_labels'].shape[0] == 2 + assert results['gt_labels'].shape[0] == results['gt_bboxes'].shape[0] + assert results['gt_labels'].dtype == np.int64 + assert results['gt_bboxes'].dtype == np.float32 + assert results['gt_bboxes_ignore'].dtype == np.float32 + + +def test_photo_metric_distortion(): + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../../../data/color.jpg'), 'color') + transform = dict(type='PhotoMetricDistortion') + distortion_module = build_from_cfg(transform, PIPELINES) + + # test assertion for invalid img_fields + with pytest.raises(AssertionError): + results = dict() + results['img'] = img + results['img2'] = img + results['img_fields'] = ['img', 'img2'] + distortion_module(results) + + # test uint8 input + results = dict() + results['img'] = img + results = distortion_module(results) + assert results['img'].dtype == np.float32 + + # test float32 input + results = dict() + results['img'] = img.astype(np.float32) + results = distortion_module(results) + assert results['img'].dtype == np.float32 + + +def test_copypaste(): + dst_results, src_results = dict(), dict() + img = mmcv.imread( + osp.join(osp.dirname(__file__), '../../../data/color.jpg'), 'color') + dst_results['img'] = img.copy() + src_results['img'] = img.copy() + + h, w, _ = img.shape + + dst_bboxes = np.array([[0.2 * w, 0.2 * h, 0.4 * w, 0.4 * h], + [0.5 * w, 0.5 * h, 0.6 * w, 0.6 * h]], + dtype=np.float32) + src_bboxes = np.array([[0.1 * w, 0.1 * h, 0.3 * w, 0.5 * h], + [0.4 * w, 0.4 * h, 0.7 * w, 0.7 * h], + [0.8 * w, 0.8 * h, 0.9 * w, 0.9 * h]], + dtype=np.float32) + dst_labels = np.ones(dst_bboxes.shape[0], dtype=np.int64) + src_labels = np.ones(src_bboxes.shape[0], dtype=np.int64) * 2 + dst_masks = create_full_masks(dst_bboxes, w, h) + src_masks = create_full_masks(src_bboxes, w, h) + dst_results['gt_bboxes'] = dst_bboxes.copy() + src_results['gt_bboxes'] = src_bboxes.copy() + dst_results['gt_labels'] = dst_labels.copy() + src_results['gt_labels'] = src_labels.copy() + dst_results['gt_masks'] = copy.deepcopy(dst_masks) + src_results['gt_masks'] = copy.deepcopy(src_masks) + + results = copy.deepcopy(dst_results) + + transform = dict(type='CopyPaste', selected=False) + copypaste_module = build_from_cfg(transform, PIPELINES) + + # test assertion for invalid mix_results + with pytest.raises(AssertionError): + copypaste_module(results) + + results['mix_results'] = [copy.deepcopy(src_results)] + results = copypaste_module(results) + assert results['img'].shape[:2] == (h, w) + # one object of destination image is totally occluded + assert results['gt_bboxes'].shape[0] == \ + dst_bboxes.shape[0] + src_bboxes.shape[0] - 1 + assert results['gt_labels'].shape[0] == \ + dst_labels.shape[0] + src_labels.shape[0] - 1 + assert results['gt_masks'].masks.shape[0] == \ + dst_masks.masks.shape[0] + src_masks.masks.shape[0] - 1 + + assert results['gt_labels'].dtype == np.int64 + assert results['gt_bboxes'].dtype == np.float32 + # the object of destination image is partially occluded + ori_bbox = dst_bboxes[0] + occ_bbox = results['gt_bboxes'][0] + ori_mask = dst_masks.masks[0] + occ_mask = results['gt_masks'].masks[0] + assert ori_mask.sum() > occ_mask.sum() + assert np.all(np.abs(occ_bbox - ori_bbox) <= + copypaste_module.bbox_occluded_thr) or \ + occ_mask.sum() > copypaste_module.mask_occluded_thr + # test copypaste with selected objects + transform = dict(type='CopyPaste') + copypaste_module = build_from_cfg(transform, PIPELINES) + results = copy.deepcopy(dst_results) + results['mix_results'] = [copy.deepcopy(src_results)] + copypaste_module(results) + # test copypaste with an empty source image + results = copy.deepcopy(dst_results) + valid_inds = [False] * src_bboxes.shape[0] + src_results['gt_bboxes'] = src_bboxes[valid_inds] + src_results['gt_labels'] = src_labels[valid_inds] + src_results['gt_masks'] = src_masks[valid_inds] + results['mix_results'] = [copy.deepcopy(src_results)] + copypaste_module(results) + # test copy_paste based on bbox + dst_results.pop('gt_masks') + src_results.pop('gt_masks') + dst_bboxes = dst_results['gt_bboxes'] + src_bboxes = src_results['gt_bboxes'] + dst_masks = create_full_masks(dst_bboxes, w, h) + src_masks = create_full_masks(src_bboxes, w, h) + results = copy.deepcopy(dst_results) + results['mix_results'] = [copy.deepcopy(src_results)] + results = copypaste_module(results) + result_masks = create_full_masks(results['gt_bboxes'], w, h) + result_masks_np = np.where(result_masks.to_ndarray().sum(0) > 0, 1, 0) + masks_np = np.where( + (src_masks.to_ndarray().sum(0) + dst_masks.to_ndarray().sum(0)) > 0, 1, + 0) + assert np.all(result_masks_np == masks_np) + assert 'gt_masks' not in results diff --git a/tests/test_data/test_pipelines/test_transform/test_translate.py b/tests/test_data/test_pipelines/test_transform/test_translate.py new file mode 100644 index 0000000..8a1f9dd --- /dev/null +++ b/tests/test_data/test_pipelines/test_transform/test_translate.py @@ -0,0 +1,516 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy + +import numpy as np +import pycocotools.mask as maskUtils +import pytest +from mmcv.utils import build_from_cfg + +from mmdet.core.mask import BitmapMasks, PolygonMasks +from mmdet.datasets.builder import PIPELINES + + +def _check_keys(results, results_translated): + assert len(set(results.keys()).difference(set( + results_translated.keys()))) == 0 + assert len(set(results_translated.keys()).difference(set( + results.keys()))) == 0 + + +def _pad(h, w, c, pad_val, axis=-1, dtype=np.float32): + assert isinstance(pad_val, (int, float, tuple)) + if isinstance(pad_val, (int, float)): + pad_val = tuple([pad_val] * c) + assert len(pad_val) == c + pad_data = np.stack([np.ones((h, w)) * pad_val[i] for i in range(c)], + axis=axis).astype(dtype) + return pad_data + + +def _construct_img(results): + h, w = results['img_info']['height'], results['img_info']['width'] + img = np.random.uniform(0, 1, (h, w, 3)) * 255 + img = img.astype(np.uint8) + results['img'] = img + results['img_shape'] = img.shape + results['ori_shape'] = img.shape + results['img_fields'] = ['img'] + + +def _construct_ann_info(h=427, w=640, c=3): + bboxes = np.array( + [[222.62, 217.82, 241.81, 238.93], [50.5, 329.7, 130.23, 384.96], + [175.47, 331.97, 254.8, 389.26]], + dtype=np.float32) + labels = np.array([9, 2, 2], dtype=np.int64) + bboxes_ignore = np.array([[59., 253., 311., 337.]], dtype=np.float32) + masks = [ + [[222.62, 217.82, 222.62, 238.93, 241.81, 238.93, 240.85, 218.78]], + [[ + 69.19, 332.17, 82.39, 330.25, 97.24, 329.7, 114.01, 331.35, 116.76, + 337.39, 119.78, 343.17, 128.03, 344.54, 128.86, 347.84, 124.18, + 350.59, 129.96, 358.01, 130.23, 366.54, 129.13, 377.81, 125.28, + 382.48, 119.78, 381.93, 117.31, 377.54, 116.21, 379.46, 114.83, + 382.21, 107.14, 383.31, 105.49, 378.36, 77.99, 377.54, 75.79, + 381.11, 69.74, 381.93, 66.72, 378.91, 65.07, 377.81, 63.15, 379.19, + 62.32, 383.31, 52.7, 384.96, 50.5, 379.46, 51.32, 375.61, 51.6, + 370.11, 51.6, 364.06, 53.52, 354.99, 56.27, 344.54, 59.57, 336.29, + 66.45, 332.72 + ]], + [[ + 175.47, 386.86, 175.87, 376.44, 177.08, 351.2, 189.1, 332.77, + 194.31, 331.97, 236.37, 332.77, 244.79, 342.39, 246.79, 346.79, + 248.39, 345.99, 251.6, 345.59, 254.8, 348.0, 254.8, 351.6, 250.0, + 352.0, 250.0, 354.81, 251.6, 358.41, 251.6, 364.42, 251.6, 370.03, + 252.8, 378.04, 252.8, 384.05, 250.8, 387.26, 246.39, 387.66, + 245.19, 386.46, 242.38, 388.86, 233.97, 389.26, 232.77, 388.06, + 232.77, 383.65, 195.91, 381.25, 195.91, 384.86, 191.1, 384.86, + 187.49, 385.26, 186.69, 382.85, 184.29, 382.45, 183.09, 387.26, + 178.68, 388.46, 176.28, 387.66 + ]] + ] + return dict( + bboxes=bboxes, labels=labels, bboxes_ignore=bboxes_ignore, masks=masks) + + +def _load_bboxes(results): + ann_info = results['ann_info'] + results['gt_bboxes'] = ann_info['bboxes'].copy() + results['bbox_fields'] = ['gt_bboxes'] + gt_bboxes_ignore = ann_info.get('bboxes_ignore', None) + if gt_bboxes_ignore is not None: + results['gt_bboxes_ignore'] = gt_bboxes_ignore.copy() + results['bbox_fields'].append('gt_bboxes_ignore') + + +def _load_labels(results): + results['gt_labels'] = results['ann_info']['labels'].copy() + + +def _poly2mask(mask_ann, img_h, img_w): + if isinstance(mask_ann, list): + # polygon -- a single object might consist of multiple parts + # we merge all parts into one mask rle code + rles = maskUtils.frPyObjects(mask_ann, img_h, img_w) + rle = maskUtils.merge(rles) + elif isinstance(mask_ann['counts'], list): + # uncompressed RLE + rle = maskUtils.frPyObjects(mask_ann, img_h, img_w) + else: + # rle + rle = mask_ann + mask = maskUtils.decode(rle) + return mask + + +def _process_polygons(polygons): + polygons = [np.array(p) for p in polygons] + valid_polygons = [] + for polygon in polygons: + if len(polygon) % 2 == 0 and len(polygon) >= 6: + valid_polygons.append(polygon) + return valid_polygons + + +def _load_masks(results, poly2mask=True): + h, w = results['img_info']['height'], results['img_info']['width'] + gt_masks = results['ann_info']['masks'] + if poly2mask: + gt_masks = BitmapMasks([_poly2mask(mask, h, w) for mask in gt_masks], + h, w) + else: + gt_masks = PolygonMasks( + [_process_polygons(polygons) for polygons in gt_masks], h, w) + results['gt_masks'] = gt_masks + results['mask_fields'] = ['gt_masks'] + + +def _construct_semantic_seg(results): + h, w = results['img_info']['height'], results['img_info']['width'] + seg_toy = (np.random.uniform(0, 1, (h, w)) * 255).astype(np.uint8) + results['gt_semantic_seg'] = seg_toy + results['seg_fields'] = ['gt_semantic_seg'] + + +def construct_toy_data(poly2mask=True): + img_info = dict(height=427, width=640) + ann_info = _construct_ann_info(h=img_info['height'], w=img_info['width']) + results = dict(img_info=img_info, ann_info=ann_info) + # construct image, similar to 'LoadImageFromFile' + _construct_img(results) + # 'LoadAnnotations' (bboxes, labels, masks, semantic_seg) + _load_bboxes(results) + _load_labels(results) + _load_masks(results, poly2mask) + _construct_semantic_seg(results) + return results + + +def test_translate(): + # test assertion for invalid value of level + with pytest.raises(AssertionError): + transform = dict(type='Translate', level=-1) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid type of level + with pytest.raises(AssertionError): + transform = dict(type='Translate', level=[1]) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid prob + with pytest.raises(AssertionError): + transform = dict(type='Translate', level=1, prob=-0.5) + build_from_cfg(transform, PIPELINES) + + # test assertion for the num of elements in tuple img_fill_val + with pytest.raises(AssertionError): + transform = dict( + type='Translate', level=1, img_fill_val=(128, 128, 128, 128)) + build_from_cfg(transform, PIPELINES) + + # test ValueError for invalid type of img_fill_val + with pytest.raises(ValueError): + transform = dict( + type='Translate', level=1, img_fill_val=[128, 128, 128]) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid value of img_fill_val + with pytest.raises(AssertionError): + transform = dict( + type='Translate', level=1, img_fill_val=(128, -1, 256)) + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid value of direction + with pytest.raises(AssertionError): + transform = dict( + type='Translate', level=1, img_fill_val=128, direction='diagonal') + build_from_cfg(transform, PIPELINES) + + # test assertion for invalid type of max_translate_offset + with pytest.raises(AssertionError): + transform = dict( + type='Translate', + level=1, + img_fill_val=128, + max_translate_offset=(250., )) + build_from_cfg(transform, PIPELINES) + + # construct toy data example for unit test + results = construct_toy_data() + + def _check_bbox_mask(results, + results_translated, + offset, + direction, + min_size=0.): + # The key correspondence from bboxes to labels and masks. + bbox2label = { + 'gt_bboxes': 'gt_labels', + 'gt_bboxes_ignore': 'gt_labels_ignore' + } + bbox2mask = { + 'gt_bboxes': 'gt_masks', + 'gt_bboxes_ignore': 'gt_masks_ignore' + } + + def _translate_bbox(bboxes, offset, direction, max_h, max_w): + if direction == 'horizontal': + bboxes[:, 0::2] = bboxes[:, 0::2] + offset + elif direction == 'vertical': + bboxes[:, 1::2] = bboxes[:, 1::2] + offset + else: + raise ValueError + bboxes[:, 0::2] = np.clip(bboxes[:, 0::2], 0, max_w) + bboxes[:, 1::2] = np.clip(bboxes[:, 1::2], 0, max_h) + return bboxes + + h, w, c = results_translated['img'].shape + for key in results_translated.get('bbox_fields', []): + label_key, mask_key = bbox2label[key], bbox2mask[key] + # check length of key + if label_key in results: + assert len(results_translated[key]) == len( + results_translated[label_key]) + if mask_key in results: + assert len(results_translated[key]) == len( + results_translated[mask_key]) + # construct gt_bboxes + gt_bboxes = _translate_bbox( + copy.deepcopy(results[key]), offset, direction, h, w) + valid_inds = (gt_bboxes[:, 2] - gt_bboxes[:, 0] > min_size) & ( + gt_bboxes[:, 3] - gt_bboxes[:, 1] > min_size) + gt_bboxes = gt_bboxes[valid_inds] + # check bbox + assert np.equal(gt_bboxes, results_translated[key]).all() + + # construct gt_masks + if mask_key not in results: + # e.g. 'gt_masks_ignore' + continue + masks, masks_translated = results[mask_key].to_ndarray( + ), results_translated[mask_key].to_ndarray() + assert masks.dtype == masks_translated.dtype + if direction == 'horizontal': + masks_pad = _pad( + h, + abs(offset), + masks.shape[0], + 0, + axis=0, + dtype=masks.dtype) + if offset <= 0: + # left shift + gt_masks = np.concatenate( + (masks[:, :, -offset:], masks_pad), axis=-1) + else: + # right shift + gt_masks = np.concatenate( + (masks_pad, masks[:, :, :-offset]), axis=-1) + else: + masks_pad = _pad( + abs(offset), + w, + masks.shape[0], + 0, + axis=0, + dtype=masks.dtype) + if offset <= 0: + # top shift + gt_masks = np.concatenate( + (masks[:, -offset:, :], masks_pad), axis=1) + else: + # bottom shift + gt_masks = np.concatenate( + (masks_pad, masks[:, :-offset, :]), axis=1) + gt_masks = gt_masks[valid_inds] + # check masks + assert np.equal(gt_masks, masks_translated).all() + + def _check_img_seg(results, results_translated, keys, offset, fill_val, + direction): + for key in keys: + assert isinstance(results_translated[key], type(results[key])) + # assert type(results[key]) == type(results_translated[key]) + data, data_translated = results[key], results_translated[key] + if 'mask' in key: + data, data_translated = data.to_ndarray( + ), data_translated.to_ndarray() + assert data.dtype == data_translated.dtype + if 'img' in key: + data, data_translated = data.transpose( + (2, 0, 1)), data_translated.transpose((2, 0, 1)) + elif 'seg' in key: + data, data_translated = data[None, :, :], data_translated[ + None, :, :] + c, h, w = data.shape + if direction == 'horizontal': + data_pad = _pad( + h, abs(offset), c, fill_val, axis=0, dtype=data.dtype) + if offset <= 0: + # left shift + data_gt = np.concatenate((data[:, :, -offset:], data_pad), + axis=-1) + else: + # right shift + data_gt = np.concatenate((data_pad, data[:, :, :-offset]), + axis=-1) + else: + data_pad = _pad( + abs(offset), w, c, fill_val, axis=0, dtype=data.dtype) + if offset <= 0: + # top shift + data_gt = np.concatenate((data[:, -offset:, :], data_pad), + axis=1) + else: + # bottom shift + data_gt = np.concatenate((data_pad, data[:, :-offset, :]), + axis=1) + if 'mask' in key: + # TODO assertion here. ``data_translated`` must be a subset + # (or equal) of ``data_gt`` + pass + else: + assert np.equal(data_gt, data_translated).all() + + def check_translate(results, + results_translated, + offset, + img_fill_val, + seg_ignore_label, + direction, + min_size=0): + # check keys + _check_keys(results, results_translated) + # check image + _check_img_seg(results, results_translated, + results.get('img_fields', ['img']), offset, + img_fill_val, direction) + # check segmentation map + _check_img_seg(results, results_translated, + results.get('seg_fields', []), offset, seg_ignore_label, + direction) + # check masks and bboxes + _check_bbox_mask(results, results_translated, offset, direction, + min_size) + + # test case when level=0 (without translate aug) + img_fill_val = (104, 116, 124) + seg_ignore_label = 255 + transform = dict( + type='Translate', + level=0, + prob=1.0, + img_fill_val=img_fill_val, + seg_ignore_label=seg_ignore_label) + translate_module = build_from_cfg(transform, PIPELINES) + results_wo_translate = translate_module(copy.deepcopy(results)) + check_translate( + copy.deepcopy(results), + results_wo_translate, + 0, + img_fill_val, + seg_ignore_label, + 'horizontal', + ) + + # test case when level>0 and translate horizontally (left shift). + transform = dict( + type='Translate', + level=8, + prob=1.0, + img_fill_val=img_fill_val, + random_negative_prob=1.0, + seg_ignore_label=seg_ignore_label) + translate_module = build_from_cfg(transform, PIPELINES) + offset = translate_module.offset + results_translated = translate_module(copy.deepcopy(results)) + check_translate( + copy.deepcopy(results), + results_translated, + -offset, + img_fill_val, + seg_ignore_label, + 'horizontal', + ) + + # test case when level>0 and translate horizontally (right shift). + translate_module.random_negative_prob = 0.0 + results_translated = translate_module(copy.deepcopy(results)) + check_translate( + copy.deepcopy(results), + results_translated, + offset, + img_fill_val, + seg_ignore_label, + 'horizontal', + ) + + # test case when level>0 and translate vertically (top shift). + transform = dict( + type='Translate', + level=10, + prob=1.0, + img_fill_val=img_fill_val, + seg_ignore_label=seg_ignore_label, + random_negative_prob=1.0, + direction='vertical') + translate_module = build_from_cfg(transform, PIPELINES) + offset = translate_module.offset + results_translated = translate_module(copy.deepcopy(results)) + check_translate( + copy.deepcopy(results), results_translated, -offset, img_fill_val, + seg_ignore_label, 'vertical') + + # test case when level>0 and translate vertically (bottom shift). + translate_module.random_negative_prob = 0.0 + results_translated = translate_module(copy.deepcopy(results)) + check_translate( + copy.deepcopy(results), results_translated, offset, img_fill_val, + seg_ignore_label, 'vertical') + + # test case when no translation is called (prob<=0) + transform = dict( + type='Translate', + level=8, + prob=0.0, + img_fill_val=img_fill_val, + random_negative_prob=0.0, + seg_ignore_label=seg_ignore_label) + translate_module = build_from_cfg(transform, PIPELINES) + results_translated = translate_module(copy.deepcopy(results)) + + # test translate vertically with PolygonMasks (top shift) + results = construct_toy_data(False) + transform = dict( + type='Translate', + level=10, + prob=1.0, + img_fill_val=img_fill_val, + seg_ignore_label=seg_ignore_label, + direction='vertical') + translate_module = build_from_cfg(transform, PIPELINES) + offset = translate_module.offset + translate_module.random_negative_prob = 1.0 + results_translated = translate_module(copy.deepcopy(results)) + + def _translated_gt(masks, direction, offset, out_shape): + translated_masks = [] + for poly_per_obj in masks: + translated_poly_per_obj = [] + for p in poly_per_obj: + p = p.copy() + if direction == 'horizontal': + p[0::2] = np.clip(p[0::2] + offset, 0, out_shape[1]) + elif direction == 'vertical': + p[1::2] = np.clip(p[1::2] + offset, 0, out_shape[0]) + if PolygonMasks([[p]], *out_shape).areas[0] > 0: + # filter invalid (area=0) + translated_poly_per_obj.append(p) + if len(translated_poly_per_obj): + translated_masks.append(translated_poly_per_obj) + translated_masks = PolygonMasks(translated_masks, *out_shape) + return translated_masks + + h, w = results['img_shape'][:2] + for key in results.get('mask_fields', []): + masks = results[key] + translated_gt = _translated_gt(masks, 'vertical', -offset, (h, w)) + assert np.equal(results_translated[key].to_ndarray(), + translated_gt.to_ndarray()).all() + + # test translate horizontally with PolygonMasks (right shift) + results = construct_toy_data(False) + transform = dict( + type='Translate', + level=8, + prob=1.0, + img_fill_val=img_fill_val, + random_negative_prob=0.0, + seg_ignore_label=seg_ignore_label) + translate_module = build_from_cfg(transform, PIPELINES) + offset = translate_module.offset + results_translated = translate_module(copy.deepcopy(results)) + h, w = results['img_shape'][:2] + for key in results.get('mask_fields', []): + masks = results[key] + translated_gt = _translated_gt(masks, 'horizontal', offset, (h, w)) + assert np.equal(results_translated[key].to_ndarray(), + translated_gt.to_ndarray()).all() + + # test AutoAugment equipped with Translate + policies = [[dict(type='Translate', level=10, prob=1.)]] + autoaug = dict(type='AutoAugment', policies=policies) + autoaug_module = build_from_cfg(autoaug, PIPELINES) + autoaug_module(copy.deepcopy(results)) + + policies = [[ + dict(type='Translate', level=10, prob=1.), + dict( + type='Translate', + level=8, + img_fill_val=img_fill_val, + direction='vertical') + ]] + autoaug = dict(type='AutoAugment', policies=policies) + autoaug_module = build_from_cfg(autoaug, PIPELINES) + autoaug_module(copy.deepcopy(results)) diff --git a/tests/test_data/test_pipelines/test_transform/utils.py b/tests/test_data/test_pipelines/test_transform/utils.py new file mode 100644 index 0000000..c3b3920 --- /dev/null +++ b/tests/test_data/test_pipelines/test_transform/utils.py @@ -0,0 +1,88 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np + +from mmdet.core.mask import BitmapMasks, PolygonMasks + + +def _check_fields(results, pipeline_results, keys): + """Check data in fields from two results are same.""" + for key in keys: + if isinstance(results[key], (BitmapMasks, PolygonMasks)): + assert np.equal(results[key].to_ndarray(), + pipeline_results[key].to_ndarray()).all() + else: + assert np.equal(results[key], pipeline_results[key]).all() + assert results[key].dtype == pipeline_results[key].dtype + + +def check_result_same(results, pipeline_results): + """Check whether the `pipeline_results` is the same with the predefined + `results`. + + Args: + results (dict): Predefined results which should be the standard output + of the transform pipeline. + pipeline_results (dict): Results processed by the transform pipeline. + """ + # check image + _check_fields(results, pipeline_results, + results.get('img_fields', ['img'])) + # check bboxes + _check_fields(results, pipeline_results, results.get('bbox_fields', [])) + # check masks + _check_fields(results, pipeline_results, results.get('mask_fields', [])) + # check segmentations + _check_fields(results, pipeline_results, results.get('seg_fields', [])) + # check gt_labels + if 'gt_labels' in results: + assert np.equal(results['gt_labels'], + pipeline_results['gt_labels']).all() + + +def construct_toy_data(poly2mask=True): + img = np.array([[1, 2, 3, 4], [5, 6, 7, 8]], dtype=np.uint8) + img = np.stack([img, img, img], axis=-1) + results = dict() + # image + results['img'] = img + results['img_shape'] = img.shape + results['img_fields'] = ['img'] + # bboxes + results['bbox_fields'] = ['gt_bboxes', 'gt_bboxes_ignore'] + results['gt_bboxes'] = np.array([[0., 0., 2., 1.]], dtype=np.float32) + results['gt_bboxes_ignore'] = np.array([[2., 0., 3., 1.]], + dtype=np.float32) + # labels + results['gt_labels'] = np.array([1], dtype=np.int64) + # masks + results['mask_fields'] = ['gt_masks'] + if poly2mask: + gt_masks = np.array([[0, 1, 1, 0], [0, 1, 0, 0]], + dtype=np.uint8)[None, :, :] + results['gt_masks'] = BitmapMasks(gt_masks, 2, 4) + else: + raw_masks = [[np.array([0, 0, 2, 0, 2, 1, 0, 1], dtype=np.float)]] + results['gt_masks'] = PolygonMasks(raw_masks, 2, 4) + # segmentations + results['seg_fields'] = ['gt_semantic_seg'] + results['gt_semantic_seg'] = img[..., 0] + return results + + +def create_random_bboxes(num_bboxes, img_w, img_h): + bboxes_left_top = np.random.uniform(0, 0.5, size=(num_bboxes, 2)) + bboxes_right_bottom = np.random.uniform(0.5, 1, size=(num_bboxes, 2)) + bboxes = np.concatenate((bboxes_left_top, bboxes_right_bottom), 1) + bboxes = (bboxes * np.array([img_w, img_h, img_w, img_h])).astype( + np.float32) + return bboxes + + +def create_full_masks(gt_bboxes, img_w, img_h): + xmin, ymin = gt_bboxes[:, 0:1], gt_bboxes[:, 1:2] + xmax, ymax = gt_bboxes[:, 2:3], gt_bboxes[:, 3:4] + gt_masks = np.zeros((len(gt_bboxes), img_h, img_w), dtype=np.uint8) + for i in range(len(gt_bboxes)): + gt_masks[i, int(ymin[i]):int(ymax[i]), int(xmin[i]):int(xmax[i])] = 1 + gt_masks = BitmapMasks(gt_masks, img_h, img_w) + return gt_masks diff --git a/tests/test_data/test_utils.py b/tests/test_data/test_utils.py new file mode 100644 index 0000000..289df32 --- /dev/null +++ b/tests/test_data/test_utils.py @@ -0,0 +1,80 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest + +from mmdet.datasets import get_loading_pipeline, replace_ImageToTensor + + +def test_replace_ImageToTensor(): + # with MultiScaleFlipAug + pipelines = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize'), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ]) + ] + expected_pipelines = [ + dict(type='LoadImageFromFile'), + dict( + type='MultiScaleFlipAug', + img_scale=(1333, 800), + flip=False, + transforms=[ + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize'), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img']), + ]) + ] + with pytest.warns(UserWarning): + assert expected_pipelines == replace_ImageToTensor(pipelines) + + # without MultiScaleFlipAug + pipelines = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize'), + dict(type='Pad', size_divisor=32), + dict(type='ImageToTensor', keys=['img']), + dict(type='Collect', keys=['img']), + ] + expected_pipelines = [ + dict(type='LoadImageFromFile'), + dict(type='Resize', keep_ratio=True), + dict(type='RandomFlip'), + dict(type='Normalize'), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img']), + ] + with pytest.warns(UserWarning): + assert expected_pipelines == replace_ImageToTensor(pipelines) + + +def test_get_loading_pipeline(): + pipelines = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True), + dict(type='Resize', img_scale=(1333, 800), keep_ratio=True), + dict(type='RandomFlip', flip_ratio=0.5), + dict(type='Pad', size_divisor=32), + dict(type='DefaultFormatBundle'), + dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']) + ] + expected_pipelines = [ + dict(type='LoadImageFromFile'), + dict(type='LoadAnnotations', with_bbox=True) + ] + assert expected_pipelines == \ + get_loading_pipeline(pipelines) diff --git a/tests/test_downstream/test_mmtrack.py b/tests/test_downstream/test_mmtrack.py new file mode 100644 index 0000000..b709d5b --- /dev/null +++ b/tests/test_downstream/test_mmtrack.py @@ -0,0 +1,230 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy +from collections import defaultdict + +import numpy as np +import pytest +import torch +from mmcv import Config + + +@pytest.mark.parametrize( + 'cfg_file', + ['./tests/data/configs_mmtrack/selsa_faster_rcnn_r101_dc5_1x.py']) +def test_vid_fgfa_style_forward(cfg_file): + config = Config.fromfile(cfg_file) + model = copy.deepcopy(config.model) + model.pretrains = None + model.detector.pretrained = None + + from mmtrack.models import build_model + detector = build_model(model) + + # Test forward train with a non-empty truth batch + input_shape = (1, 3, 256, 256) + mm_inputs = _demo_mm_inputs(input_shape, num_items=[10]) + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + img_metas[0]['is_video_data'] = True + gt_bboxes = mm_inputs['gt_bboxes'] + gt_labels = mm_inputs['gt_labels'] + gt_masks = mm_inputs['gt_masks'] + + ref_input_shape = (2, 3, 256, 256) + ref_mm_inputs = _demo_mm_inputs(ref_input_shape, num_items=[9, 11]) + ref_img = ref_mm_inputs.pop('imgs')[None] + ref_img_metas = ref_mm_inputs.pop('img_metas') + ref_img_metas[0]['is_video_data'] = True + ref_img_metas[1]['is_video_data'] = True + ref_gt_bboxes = ref_mm_inputs['gt_bboxes'] + ref_gt_labels = ref_mm_inputs['gt_labels'] + ref_gt_masks = ref_mm_inputs['gt_masks'] + + losses = detector.forward( + img=imgs, + img_metas=img_metas, + gt_bboxes=gt_bboxes, + gt_labels=gt_labels, + ref_img=ref_img, + ref_img_metas=[ref_img_metas], + ref_gt_bboxes=ref_gt_bboxes, + ref_gt_labels=ref_gt_labels, + gt_masks=gt_masks, + ref_gt_masks=ref_gt_masks, + return_loss=True) + assert isinstance(losses, dict) + loss, _ = detector._parse_losses(losses) + loss.requires_grad_(True) + assert float(loss.item()) > 0 + loss.backward() + + # Test forward train with an empty truth batch + mm_inputs = _demo_mm_inputs(input_shape, num_items=[0]) + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + img_metas[0]['is_video_data'] = True + gt_bboxes = mm_inputs['gt_bboxes'] + gt_labels = mm_inputs['gt_labels'] + gt_masks = mm_inputs['gt_masks'] + + ref_mm_inputs = _demo_mm_inputs(ref_input_shape, num_items=[0, 0]) + ref_imgs = ref_mm_inputs.pop('imgs')[None] + ref_img_metas = ref_mm_inputs.pop('img_metas') + ref_img_metas[0]['is_video_data'] = True + ref_img_metas[1]['is_video_data'] = True + ref_gt_bboxes = ref_mm_inputs['gt_bboxes'] + ref_gt_labels = ref_mm_inputs['gt_labels'] + ref_gt_masks = ref_mm_inputs['gt_masks'] + + losses = detector.forward( + img=imgs, + img_metas=img_metas, + gt_bboxes=gt_bboxes, + gt_labels=gt_labels, + ref_img=ref_imgs, + ref_img_metas=[ref_img_metas], + ref_gt_bboxes=ref_gt_bboxes, + ref_gt_labels=ref_gt_labels, + gt_masks=gt_masks, + ref_gt_masks=ref_gt_masks, + return_loss=True) + assert isinstance(losses, dict) + loss, _ = detector._parse_losses(losses) + loss.requires_grad_(True) + assert float(loss.item()) > 0 + loss.backward() + + # Test forward test with frame_stride=1 and frame_range=[-1,0] + with torch.no_grad(): + imgs = torch.cat([imgs, imgs.clone()], dim=0) + img_list = [g[None, :] for g in imgs] + img_metas.extend(copy.deepcopy(img_metas)) + for i in range(len(img_metas)): + img_metas[i]['frame_id'] = i + img_metas[i]['num_left_ref_imgs'] = 1 + img_metas[i]['frame_stride'] = 1 + ref_imgs = [ref_imgs.clone(), imgs[[0]][None].clone()] + ref_img_metas = [ + copy.deepcopy(ref_img_metas), + copy.deepcopy([img_metas[0]]) + ] + results = defaultdict(list) + for one_img, one_meta, ref_img, ref_img_meta in zip( + img_list, img_metas, ref_imgs, ref_img_metas): + result = detector.forward([one_img], [[one_meta]], + ref_img=[ref_img], + ref_img_metas=[[ref_img_meta]], + return_loss=False) + for k, v in result.items(): + results[k].append(v) + + +@pytest.mark.parametrize('cfg_file', [ + './tests/data/configs_mmtrack/tracktor_faster-rcnn_r50_fpn_4e.py', +]) +def test_tracktor_forward(cfg_file): + config = Config.fromfile(cfg_file) + model = copy.deepcopy(config.model) + model.pretrains = None + model.detector.pretrained = None + + from mmtrack.models import build_model + mot = build_model(model) + mot.eval() + + input_shape = (1, 3, 256, 256) + mm_inputs = _demo_mm_inputs(input_shape, num_items=[10], with_track=True) + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + with torch.no_grad(): + imgs = torch.cat([imgs, imgs.clone()], dim=0) + img_list = [g[None, :] for g in imgs] + img2_metas = copy.deepcopy(img_metas) + img2_metas[0]['frame_id'] = 1 + img_metas.extend(img2_metas) + results = defaultdict(list) + for one_img, one_meta in zip(img_list, img_metas): + result = mot.forward([one_img], [[one_meta]], return_loss=False) + for k, v in result.items(): + results[k].append(v) + + +def _demo_mm_inputs( + input_shape=(1, 3, 300, 300), + num_items=None, + num_classes=10, + with_track=False): + """Create a superset of inputs needed to run test or train batches. + + Args: + input_shape (tuple): + input batch dimensions + + num_items (None | List[int]): + specifies the number of boxes in each batch item + + num_classes (int): + number of different labels a box might have + """ + from mmdet.core import BitmapMasks + + (N, C, H, W) = input_shape + + rng = np.random.RandomState(0) + + imgs = rng.rand(*input_shape) + + img_metas = [{ + 'img_shape': (H, W, C), + 'ori_shape': (H, W, C), + 'pad_shape': (H, W, C), + 'filename': '.png', + 'scale_factor': 1.0, + 'flip': False, + 'frame_id': 0, + 'img_norm_cfg': { + 'mean': (128.0, 128.0, 128.0), + 'std': (10.0, 10.0, 10.0) + } + } for i in range(N)] + + gt_bboxes = [] + gt_labels = [] + gt_masks = [] + gt_match_indices = [] + + for batch_idx in range(N): + if num_items is None: + num_boxes = rng.randint(1, 10) + else: + num_boxes = num_items[batch_idx] + + cx, cy, bw, bh = rng.rand(num_boxes, 4).T + + tl_x = ((cx * W) - (W * bw / 2)).clip(0, W) + tl_y = ((cy * H) - (H * bh / 2)).clip(0, H) + br_x = ((cx * W) + (W * bw / 2)).clip(0, W) + br_y = ((cy * H) + (H * bh / 2)).clip(0, H) + + boxes = np.vstack([tl_x, tl_y, br_x, br_y]).T + class_idxs = rng.randint(1, num_classes, size=num_boxes) + + gt_bboxes.append(torch.FloatTensor(boxes)) + gt_labels.append(torch.LongTensor(class_idxs)) + if with_track: + gt_match_indices.append(torch.arange(boxes.shape[0])) + + mask = np.random.randint(0, 2, (len(boxes), H, W), dtype=np.uint8) + gt_masks.append(BitmapMasks(mask, H, W)) + + mm_inputs = { + 'imgs': torch.FloatTensor(imgs).requires_grad_(True), + 'img_metas': img_metas, + 'gt_bboxes': gt_bboxes, + 'gt_labels': gt_labels, + 'gt_bboxes_ignore': None, + 'gt_masks': gt_masks, + } + if with_track: + mm_inputs['gt_match_indices'] = gt_match_indices + return mm_inputs diff --git a/tests/test_metrics/test_box_overlap.py b/tests/test_metrics/test_box_overlap.py new file mode 100644 index 0000000..1d03253 --- /dev/null +++ b/tests/test_metrics/test_box_overlap.py @@ -0,0 +1,134 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import pytest +import torch + +from mmdet.core import BboxOverlaps2D, bbox_overlaps +from mmdet.core.evaluation.bbox_overlaps import \ + bbox_overlaps as recall_overlaps + + +def test_bbox_overlaps_2d(eps=1e-7): + + def _construct_bbox(num_bbox=None): + img_h = int(np.random.randint(3, 1000)) + img_w = int(np.random.randint(3, 1000)) + if num_bbox is None: + num_bbox = np.random.randint(1, 10) + x1y1 = torch.rand((num_bbox, 2)) + x2y2 = torch.max(torch.rand((num_bbox, 2)), x1y1) + bboxes = torch.cat((x1y1, x2y2), -1) + bboxes[:, 0::2] *= img_w + bboxes[:, 1::2] *= img_h + return bboxes, num_bbox + + # is_aligned is True, bboxes.size(-1) == 5 (include score) + self = BboxOverlaps2D() + bboxes1, num_bbox = _construct_bbox() + bboxes2, _ = _construct_bbox(num_bbox) + bboxes1 = torch.cat((bboxes1, torch.rand((num_bbox, 1))), 1) + bboxes2 = torch.cat((bboxes2, torch.rand((num_bbox, 1))), 1) + gious = self(bboxes1, bboxes2, 'giou', True) + assert gious.size() == (num_bbox, ), gious.size() + assert torch.all(gious >= -1) and torch.all(gious <= 1) + + # is_aligned is True, bboxes1.size(-2) == 0 + bboxes1 = torch.empty((0, 4)) + bboxes2 = torch.empty((0, 4)) + gious = self(bboxes1, bboxes2, 'giou', True) + assert gious.size() == (0, ), gious.size() + assert torch.all(gious == torch.empty((0, ))) + assert torch.all(gious >= -1) and torch.all(gious <= 1) + + # is_aligned is True, and bboxes.ndims > 2 + bboxes1, num_bbox = _construct_bbox() + bboxes2, _ = _construct_bbox(num_bbox) + bboxes1 = bboxes1.unsqueeze(0).repeat(2, 1, 1) + # test assertion when batch dim is not the same + with pytest.raises(AssertionError): + self(bboxes1, bboxes2.unsqueeze(0).repeat(3, 1, 1), 'giou', True) + bboxes2 = bboxes2.unsqueeze(0).repeat(2, 1, 1) + gious = self(bboxes1, bboxes2, 'giou', True) + assert torch.all(gious >= -1) and torch.all(gious <= 1) + assert gious.size() == (2, num_bbox) + bboxes1 = bboxes1.unsqueeze(0).repeat(2, 1, 1, 1) + bboxes2 = bboxes2.unsqueeze(0).repeat(2, 1, 1, 1) + gious = self(bboxes1, bboxes2, 'giou', True) + assert torch.all(gious >= -1) and torch.all(gious <= 1) + assert gious.size() == (2, 2, num_bbox) + + # is_aligned is False + bboxes1, num_bbox1 = _construct_bbox() + bboxes2, num_bbox2 = _construct_bbox() + gious = self(bboxes1, bboxes2, 'giou') + assert torch.all(gious >= -1) and torch.all(gious <= 1) + assert gious.size() == (num_bbox1, num_bbox2) + + # is_aligned is False, and bboxes.ndims > 2 + bboxes1 = bboxes1.unsqueeze(0).repeat(2, 1, 1) + bboxes2 = bboxes2.unsqueeze(0).repeat(2, 1, 1) + gious = self(bboxes1, bboxes2, 'giou') + assert torch.all(gious >= -1) and torch.all(gious <= 1) + assert gious.size() == (2, num_bbox1, num_bbox2) + bboxes1 = bboxes1.unsqueeze(0) + bboxes2 = bboxes2.unsqueeze(0) + gious = self(bboxes1, bboxes2, 'giou') + assert torch.all(gious >= -1) and torch.all(gious <= 1) + assert gious.size() == (1, 2, num_bbox1, num_bbox2) + + # is_aligned is False, bboxes1.size(-2) == 0 + gious = self(torch.empty(1, 2, 0, 4), bboxes2, 'giou') + assert torch.all(gious == torch.empty(1, 2, 0, bboxes2.size(-2))) + assert torch.all(gious >= -1) and torch.all(gious <= 1) + + # test allclose between bbox_overlaps and the original official + # implementation. + bboxes1 = torch.FloatTensor([ + [0, 0, 10, 10], + [10, 10, 20, 20], + [32, 32, 38, 42], + ]) + bboxes2 = torch.FloatTensor([ + [0, 0, 10, 20], + [0, 10, 10, 19], + [10, 10, 20, 20], + ]) + gious = bbox_overlaps(bboxes1, bboxes2, 'giou', is_aligned=True, eps=eps) + gious = gious.numpy().round(4) + # the gt is got with four decimal precision. + expected_gious = np.array([0.5000, -0.0500, -0.8214]) + assert np.allclose(gious, expected_gious, rtol=0, atol=eps) + + # test mode 'iof' + ious = bbox_overlaps(bboxes1, bboxes2, 'iof', is_aligned=True, eps=eps) + assert torch.all(ious >= -1) and torch.all(ious <= 1) + assert ious.size() == (bboxes1.size(0), ) + ious = bbox_overlaps(bboxes1, bboxes2, 'iof', eps=eps) + assert torch.all(ious >= -1) and torch.all(ious <= 1) + assert ious.size() == (bboxes1.size(0), bboxes2.size(0)) + + +def test_voc_recall_overlaps(): + + def _construct_bbox(num_bbox=None): + img_h = int(np.random.randint(3, 1000)) + img_w = int(np.random.randint(3, 1000)) + if num_bbox is None: + num_bbox = np.random.randint(1, 10) + x1y1 = torch.rand((num_bbox, 2)) + x2y2 = torch.max(torch.rand((num_bbox, 2)), x1y1) + bboxes = torch.cat((x1y1, x2y2), -1) + bboxes[:, 0::2] *= img_w + bboxes[:, 1::2] *= img_h + return bboxes.numpy(), num_bbox + + bboxes1, num_bbox = _construct_bbox() + bboxes2, _ = _construct_bbox(num_bbox) + ious = recall_overlaps( + bboxes1, bboxes2, 'iou', use_legacy_coordinate=False) + assert ious.shape == (num_bbox, num_bbox) + assert np.all(ious >= -1) and np.all(ious <= 1) + + ious = recall_overlaps(bboxes1, bboxes2, 'iou', use_legacy_coordinate=True) + assert ious.shape == (num_bbox, num_bbox) + assert np.all(ious >= -1) and np.all(ious <= 1) diff --git a/tests/test_metrics/test_losses.py b/tests/test_metrics/test_losses.py new file mode 100644 index 0000000..06fe43d --- /dev/null +++ b/tests/test_metrics/test_losses.py @@ -0,0 +1,241 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch + +from mmdet.models import Accuracy, build_loss + + +def test_ce_loss(): + # use_mask and use_sigmoid cannot be true at the same time + with pytest.raises(AssertionError): + loss_cfg = dict( + type='CrossEntropyLoss', + use_mask=True, + use_sigmoid=True, + loss_weight=1.0) + build_loss(loss_cfg) + + # test loss with class weights + loss_cls_cfg = dict( + type='CrossEntropyLoss', + use_sigmoid=False, + class_weight=[0.8, 0.2], + loss_weight=1.0) + loss_cls = build_loss(loss_cls_cfg) + fake_pred = torch.Tensor([[100, -100]]) + fake_label = torch.Tensor([1]).long() + assert torch.allclose(loss_cls(fake_pred, fake_label), torch.tensor(40.)) + + loss_cls_cfg = dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0) + loss_cls = build_loss(loss_cls_cfg) + assert torch.allclose(loss_cls(fake_pred, fake_label), torch.tensor(200.)) + + +def test_varifocal_loss(): + # only sigmoid version of VarifocalLoss is implemented + with pytest.raises(AssertionError): + loss_cfg = dict( + type='VarifocalLoss', use_sigmoid=False, loss_weight=1.0) + build_loss(loss_cfg) + + # test that alpha should be greater than 0 + with pytest.raises(AssertionError): + loss_cfg = dict( + type='VarifocalLoss', + alpha=-0.75, + gamma=2.0, + use_sigmoid=True, + loss_weight=1.0) + build_loss(loss_cfg) + + # test that pred and target should be of the same size + loss_cls_cfg = dict( + type='VarifocalLoss', + use_sigmoid=True, + alpha=0.75, + gamma=2.0, + iou_weighted=True, + reduction='mean', + loss_weight=1.0) + loss_cls = build_loss(loss_cls_cfg) + with pytest.raises(AssertionError): + fake_pred = torch.Tensor([[100.0, -100.0]]) + fake_target = torch.Tensor([[1.0]]) + loss_cls(fake_pred, fake_target) + + # test the calculation + loss_cls = build_loss(loss_cls_cfg) + fake_pred = torch.Tensor([[100.0, -100.0]]) + fake_target = torch.Tensor([[1.0, 0.0]]) + assert torch.allclose(loss_cls(fake_pred, fake_target), torch.tensor(0.0)) + + # test the loss with weights + loss_cls = build_loss(loss_cls_cfg) + fake_pred = torch.Tensor([[0.0, 100.0]]) + fake_target = torch.Tensor([[1.0, 1.0]]) + fake_weight = torch.Tensor([0.0, 1.0]) + assert torch.allclose( + loss_cls(fake_pred, fake_target, fake_weight), torch.tensor(0.0)) + + +def test_kd_loss(): + # test that temperature should be greater than 1 + with pytest.raises(AssertionError): + loss_cfg = dict( + type='KnowledgeDistillationKLDivLoss', loss_weight=1.0, T=0.5) + build_loss(loss_cfg) + + # test that pred and target should be of the same size + loss_cls_cfg = dict( + type='KnowledgeDistillationKLDivLoss', loss_weight=1.0, T=1) + loss_cls = build_loss(loss_cls_cfg) + with pytest.raises(AssertionError): + fake_pred = torch.Tensor([[100, -100]]) + fake_label = torch.Tensor([1]).long() + loss_cls(fake_pred, fake_label) + + # test the calculation + loss_cls = build_loss(loss_cls_cfg) + fake_pred = torch.Tensor([[100.0, 100.0]]) + fake_target = torch.Tensor([[1.0, 1.0]]) + assert torch.allclose(loss_cls(fake_pred, fake_target), torch.tensor(0.0)) + + # test the loss with weights + loss_cls = build_loss(loss_cls_cfg) + fake_pred = torch.Tensor([[100.0, -100.0], [100.0, 100.0]]) + fake_target = torch.Tensor([[1.0, 0.0], [1.0, 1.0]]) + fake_weight = torch.Tensor([0.0, 1.0]) + assert torch.allclose( + loss_cls(fake_pred, fake_target, fake_weight), torch.tensor(0.0)) + + +def test_seesaw_loss(): + # only softmax version of Seesaw Loss is implemented + with pytest.raises(AssertionError): + loss_cfg = dict(type='SeesawLoss', use_sigmoid=True, loss_weight=1.0) + build_loss(loss_cfg) + + # test that cls_score.size(-1) == num_classes + 2 + loss_cls_cfg = dict( + type='SeesawLoss', p=0.0, q=0.0, loss_weight=1.0, num_classes=2) + loss_cls = build_loss(loss_cls_cfg) + # the length of fake_pred should be num_classes + 2 = 4 + with pytest.raises(AssertionError): + fake_pred = torch.Tensor([[-100, 100]]) + fake_label = torch.Tensor([1]).long() + loss_cls(fake_pred, fake_label) + # the length of fake_pred should be num_classes + 2 = 4 + with pytest.raises(AssertionError): + fake_pred = torch.Tensor([[-100, 100, -100]]) + fake_label = torch.Tensor([1]).long() + loss_cls(fake_pred, fake_label) + + # test the calculation without p and q + loss_cls_cfg = dict( + type='SeesawLoss', p=0.0, q=0.0, loss_weight=1.0, num_classes=2) + loss_cls = build_loss(loss_cls_cfg) + fake_pred = torch.Tensor([[-100, 100, -100, 100]]) + fake_label = torch.Tensor([1]).long() + loss = loss_cls(fake_pred, fake_label) + assert torch.allclose(loss['loss_cls_objectness'], torch.tensor(200.)) + assert torch.allclose(loss['loss_cls_classes'], torch.tensor(0.)) + + # test the calculation with p and without q + loss_cls_cfg = dict( + type='SeesawLoss', p=1.0, q=0.0, loss_weight=1.0, num_classes=2) + loss_cls = build_loss(loss_cls_cfg) + fake_pred = torch.Tensor([[-100, 100, -100, 100]]) + fake_label = torch.Tensor([0]).long() + loss_cls.cum_samples[0] = torch.exp(torch.Tensor([20])) + loss = loss_cls(fake_pred, fake_label) + assert torch.allclose(loss['loss_cls_objectness'], torch.tensor(200.)) + assert torch.allclose(loss['loss_cls_classes'], torch.tensor(180.)) + + # test the calculation with q and without p + loss_cls_cfg = dict( + type='SeesawLoss', p=0.0, q=1.0, loss_weight=1.0, num_classes=2) + loss_cls = build_loss(loss_cls_cfg) + fake_pred = torch.Tensor([[-100, 100, -100, 100]]) + fake_label = torch.Tensor([0]).long() + loss = loss_cls(fake_pred, fake_label) + assert torch.allclose(loss['loss_cls_objectness'], torch.tensor(200.)) + assert torch.allclose(loss['loss_cls_classes'], + torch.tensor(200.) + torch.tensor(100.).log()) + + # test the others + loss_cls_cfg = dict( + type='SeesawLoss', + p=0.0, + q=1.0, + loss_weight=1.0, + num_classes=2, + return_dict=False) + loss_cls = build_loss(loss_cls_cfg) + fake_pred = torch.Tensor([[100, -100, 100, -100]]) + fake_label = torch.Tensor([0]).long() + loss = loss_cls(fake_pred, fake_label) + acc = loss_cls.get_accuracy(fake_pred, fake_label) + act = loss_cls.get_activation(fake_pred) + assert torch.allclose(loss, torch.tensor(0.)) + assert torch.allclose(acc['acc_objectness'], torch.tensor(100.)) + assert torch.allclose(acc['acc_classes'], torch.tensor(100.)) + assert torch.allclose(act, torch.tensor([1., 0., 0.])) + + +def test_accuracy(): + # test for empty pred + pred = torch.empty(0, 4) + label = torch.empty(0) + accuracy = Accuracy(topk=1) + acc = accuracy(pred, label) + assert acc.item() == 0 + + pred = torch.Tensor([[0.2, 0.3, 0.6, 0.5], [0.1, 0.1, 0.2, 0.6], + [0.9, 0.0, 0.0, 0.1], [0.4, 0.7, 0.1, 0.1], + [0.0, 0.0, 0.99, 0]]) + # test for top1 + true_label = torch.Tensor([2, 3, 0, 1, 2]).long() + accuracy = Accuracy(topk=1) + acc = accuracy(pred, true_label) + assert acc.item() == 100 + + # test for top1 with score thresh=0.8 + true_label = torch.Tensor([2, 3, 0, 1, 2]).long() + accuracy = Accuracy(topk=1, thresh=0.8) + acc = accuracy(pred, true_label) + assert acc.item() == 40 + + # test for top2 + accuracy = Accuracy(topk=2) + label = torch.Tensor([3, 2, 0, 0, 2]).long() + acc = accuracy(pred, label) + assert acc.item() == 100 + + # test for both top1 and top2 + accuracy = Accuracy(topk=(1, 2)) + true_label = torch.Tensor([2, 3, 0, 1, 2]).long() + acc = accuracy(pred, true_label) + for a in acc: + assert a.item() == 100 + + # topk is larger than pred class number + with pytest.raises(AssertionError): + accuracy = Accuracy(topk=5) + accuracy(pred, true_label) + + # wrong topk type + with pytest.raises(AssertionError): + accuracy = Accuracy(topk='wrong type') + accuracy(pred, true_label) + + # label size is larger than required + with pytest.raises(AssertionError): + label = torch.Tensor([2, 3, 0, 1, 2, 0]).long() # size mismatch + accuracy = Accuracy() + accuracy(pred, label) + + # wrong pred dimension + with pytest.raises(AssertionError): + accuracy = Accuracy() + accuracy(pred[:, :, None], true_label) diff --git a/tests/test_metrics/test_mean_ap.py b/tests/test_metrics/test_mean_ap.py new file mode 100644 index 0000000..5faa7a0 --- /dev/null +++ b/tests/test_metrics/test_mean_ap.py @@ -0,0 +1,187 @@ +import numpy as np + +from mmdet.core.evaluation.mean_ap import (eval_map, tpfp_default, + tpfp_imagenet, tpfp_openimages) + +det_bboxes = np.array([ + [0, 0, 10, 10], + [10, 10, 20, 20], + [32, 32, 38, 42], +]) +gt_bboxes = np.array([[0, 0, 10, 20], [0, 10, 10, 19], [10, 10, 20, 20]]) +gt_ignore = np.array([[5, 5, 10, 20], [6, 10, 10, 19]]) + + +def test_tpfp_imagenet(): + + result = tpfp_imagenet( + det_bboxes, + gt_bboxes, + gt_bboxes_ignore=gt_ignore, + use_legacy_coordinate=True) + tp = result[0] + fp = result[1] + assert tp.shape == (1, 3) + assert fp.shape == (1, 3) + assert (tp == np.array([[1, 1, 0]])).all() + assert (fp == np.array([[0, 0, 1]])).all() + + result = tpfp_imagenet( + det_bboxes, + gt_bboxes, + gt_bboxes_ignore=gt_ignore, + use_legacy_coordinate=False) + tp = result[0] + fp = result[1] + assert tp.shape == (1, 3) + assert fp.shape == (1, 3) + assert (tp == np.array([[1, 1, 0]])).all() + assert (fp == np.array([[0, 0, 1]])).all() + + +def test_tpfp_default(): + + result = tpfp_default( + det_bboxes, + gt_bboxes, + gt_bboxes_ignore=gt_ignore, + use_legacy_coordinate=True) + + tp = result[0] + fp = result[1] + assert tp.shape == (1, 3) + assert fp.shape == (1, 3) + assert (tp == np.array([[1, 1, 0]])).all() + assert (fp == np.array([[0, 0, 1]])).all() + result = tpfp_default( + det_bboxes, + gt_bboxes, + gt_bboxes_ignore=gt_ignore, + use_legacy_coordinate=False) + + tp = result[0] + fp = result[1] + assert tp.shape == (1, 3) + assert fp.shape == (1, 3) + assert (tp == np.array([[1, 1, 0]])).all() + assert (fp == np.array([[0, 0, 1]])).all() + + +def test_eval_map(): + + # 2 image and 2 classes + det_results = [[det_bboxes, det_bboxes], [det_bboxes, det_bboxes]] + + labels = np.array([0, 1, 1]) + labels_ignore = np.array([0, 1]) + gt_info = { + 'bboxes': gt_bboxes, + 'bboxes_ignore': gt_ignore, + 'labels': labels, + 'labels_ignore': labels_ignore + } + annotations = [gt_info, gt_info] + mean_ap, eval_results = eval_map( + det_results, annotations, use_legacy_coordinate=True) + assert 0.291 < mean_ap < 0.293 + mean_ap, eval_results = eval_map( + det_results, annotations, use_legacy_coordinate=False) + assert 0.291 < mean_ap < 0.293 + + # 1 image and 2 classes + det_results = [[det_bboxes, det_bboxes]] + + labels = np.array([0, 1, 1]) + labels_ignore = np.array([0, 1]) + gt_info = { + 'bboxes': gt_bboxes, + 'bboxes_ignore': gt_ignore, + 'labels': labels, + 'labels_ignore': labels_ignore + } + annotations = [gt_info] + mean_ap, eval_results = eval_map( + det_results, annotations, use_legacy_coordinate=True) + assert 0.291 < mean_ap < 0.293 + mean_ap, eval_results = eval_map( + det_results, annotations, use_legacy_coordinate=False) + assert 0.291 < mean_ap < 0.293 + + +def test_tpfp_openimages(): + + det_bboxes = np.array([[10, 10, 15, 15, 1.0], [15, 15, 30, 30, 0.98], + [10, 10, 25, 25, 0.98], [28, 28, 35, 35, 0.97], + [30, 30, 51, 51, 0.96], [100, 110, 120, 130, 0.15]]) + gt_bboxes = np.array([[10., 10., 30., 30.], [30., 30., 50., 50.]]) + gt_groups_of = np.array([True, False], dtype=bool) + gt_ignore = np.zeros((0, 4)) + + # Open Images evaluation using group of. + result = tpfp_openimages( + det_bboxes, + gt_bboxes, + gt_bboxes_ignore=gt_ignore, + gt_bboxes_group_of=gt_groups_of, + use_group_of=True, + ioa_thr=0.5) + + tp = result[0] + fp = result[1] + cls_dets = result[2] + + assert tp.shape == (1, 4) + assert fp.shape == (1, 4) + assert cls_dets.shape == (4, 5) + + assert (tp == np.array([[0, 1, 0, 1]])).all() + assert (fp == np.array([[1, 0, 1, 0]])).all() + cls_dets_gt = np.array([[28., 28., 35., 35., 0.97], + [30., 30., 51., 51., 0.96], + [100., 110., 120., 130., 0.15], + [10., 10., 15., 15., 1.]]) + assert (cls_dets == cls_dets_gt).all() + + # Open Images evaluation not using group of. + result = tpfp_openimages( + det_bboxes, + gt_bboxes, + gt_bboxes_ignore=gt_ignore, + gt_bboxes_group_of=gt_groups_of, + use_group_of=False, + ioa_thr=0.5) + tp = result[0] + fp = result[1] + cls_dets = result[2] + assert tp.shape == (1, 6) + assert fp.shape == (1, 6) + assert cls_dets.shape == (6, 5) + + # Open Images evaluation using group of, and gt is all group of bboxes. + gt_groups_of = np.array([True, True], dtype=bool) + result = tpfp_openimages( + det_bboxes, + gt_bboxes, + gt_bboxes_ignore=gt_ignore, + gt_bboxes_group_of=gt_groups_of, + use_group_of=True, + ioa_thr=0.5) + tp = result[0] + fp = result[1] + cls_dets = result[2] + assert tp.shape == (1, 3) + assert fp.shape == (1, 3) + assert cls_dets.shape == (3, 5) + + # Open Images evaluation with empty gt. + gt_bboxes = np.zeros((0, 4)) + gt_groups_of = np.empty((0)) + result = tpfp_openimages( + det_bboxes, + gt_bboxes, + gt_bboxes_ignore=gt_ignore, + gt_bboxes_group_of=gt_groups_of, + use_group_of=True, + ioa_thr=0.5) + fp = result[1] + assert (fp == np.array([[1, 1, 1, 1, 1, 1]])).all() diff --git a/tests/test_metrics/test_recall.py b/tests/test_metrics/test_recall.py new file mode 100644 index 0000000..f2ca0b1 --- /dev/null +++ b/tests/test_metrics/test_recall.py @@ -0,0 +1,46 @@ +import numpy as np + +from mmdet.core.evaluation.recall import eval_recalls + +det_bboxes = np.array([ + [0, 0, 10, 10], + [10, 10, 20, 20], + [32, 32, 38, 42], +]) +gt_bboxes = np.array([[0, 0, 10, 20], [0, 10, 10, 19], [10, 10, 20, 20]]) +gt_ignore = np.array([[5, 5, 10, 20], [6, 10, 10, 19]]) + + +def test_eval_recalls(): + gts = [gt_bboxes, gt_bboxes, gt_bboxes] + proposals = [det_bboxes, det_bboxes, det_bboxes] + + recall = eval_recalls( + gts, proposals, proposal_nums=2, use_legacy_coordinate=True) + assert recall.shape == (1, 1) + assert 0.66 < recall[0][0] < 0.667 + recall = eval_recalls( + gts, proposals, proposal_nums=2, use_legacy_coordinate=False) + assert recall.shape == (1, 1) + assert 0.66 < recall[0][0] < 0.667 + + recall = eval_recalls( + gts, proposals, proposal_nums=2, use_legacy_coordinate=True) + assert recall.shape == (1, 1) + assert 0.66 < recall[0][0] < 0.667 + recall = eval_recalls( + gts, + proposals, + iou_thrs=[0.1, 0.9], + proposal_nums=2, + use_legacy_coordinate=False) + assert recall.shape == (1, 2) + assert recall[0][1] <= recall[0][0] + recall = eval_recalls( + gts, + proposals, + iou_thrs=[0.1, 0.9], + proposal_nums=2, + use_legacy_coordinate=True) + assert recall.shape == (1, 2) + assert recall[0][1] <= recall[0][0] diff --git a/tests/test_models/test_backbones/__init__.py b/tests/test_models/test_backbones/__init__.py new file mode 100644 index 0000000..eb431ba --- /dev/null +++ b/tests/test_models/test_backbones/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .utils import check_norm_state, is_block, is_norm + +__all__ = ['is_block', 'is_norm', 'check_norm_state'] diff --git a/tests/test_models/test_backbones/test_csp_darknet.py b/tests/test_models/test_backbones/test_csp_darknet.py new file mode 100644 index 0000000..2a2ad41 --- /dev/null +++ b/tests/test_models/test_backbones/test_csp_darknet.py @@ -0,0 +1,116 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch +from torch.nn.modules.batchnorm import _BatchNorm + +from mmdet.models.backbones.csp_darknet import CSPDarknet +from .utils import check_norm_state, is_norm + + +def test_csp_darknet_backbone(): + with pytest.raises(ValueError): + # frozen_stages must in range(-1, len(arch_setting) + 1) + CSPDarknet(frozen_stages=6) + + with pytest.raises(AssertionError): + # out_indices in range(len(arch_setting) + 1) + CSPDarknet(out_indices=[6]) + + # Test CSPDarknet with first stage frozen + frozen_stages = 1 + model = CSPDarknet(frozen_stages=frozen_stages) + model.train() + + for mod in model.stem.modules(): + for param in mod.parameters(): + assert param.requires_grad is False + for i in range(1, frozen_stages + 1): + layer = getattr(model, f'stage{i}') + for mod in layer.modules(): + if isinstance(mod, _BatchNorm): + assert mod.training is False + for param in layer.parameters(): + assert param.requires_grad is False + + # Test CSPDarknet with norm_eval=True + model = CSPDarknet(norm_eval=True) + model.train() + + assert check_norm_state(model.modules(), False) + + # Test CSPDarknet-P5 forward with widen_factor=0.5 + model = CSPDarknet(arch='P5', widen_factor=0.25, out_indices=range(0, 5)) + model.train() + + imgs = torch.randn(1, 3, 64, 64) + feat = model(imgs) + assert len(feat) == 5 + assert feat[0].shape == torch.Size((1, 16, 32, 32)) + assert feat[1].shape == torch.Size((1, 32, 16, 16)) + assert feat[2].shape == torch.Size((1, 64, 8, 8)) + assert feat[3].shape == torch.Size((1, 128, 4, 4)) + assert feat[4].shape == torch.Size((1, 256, 2, 2)) + + # Test CSPDarknet-P6 forward with widen_factor=0.5 + model = CSPDarknet( + arch='P6', + widen_factor=0.25, + out_indices=range(0, 6), + spp_kernal_sizes=(3, 5, 7)) + model.train() + + imgs = torch.randn(1, 3, 128, 128) + feat = model(imgs) + assert feat[0].shape == torch.Size((1, 16, 64, 64)) + assert feat[1].shape == torch.Size((1, 32, 32, 32)) + assert feat[2].shape == torch.Size((1, 64, 16, 16)) + assert feat[3].shape == torch.Size((1, 128, 8, 8)) + assert feat[4].shape == torch.Size((1, 192, 4, 4)) + assert feat[5].shape == torch.Size((1, 256, 2, 2)) + + # Test CSPDarknet forward with dict(type='ReLU') + model = CSPDarknet( + widen_factor=0.125, act_cfg=dict(type='ReLU'), out_indices=range(0, 5)) + model.train() + + imgs = torch.randn(1, 3, 64, 64) + feat = model(imgs) + assert len(feat) == 5 + assert feat[0].shape == torch.Size((1, 8, 32, 32)) + assert feat[1].shape == torch.Size((1, 16, 16, 16)) + assert feat[2].shape == torch.Size((1, 32, 8, 8)) + assert feat[3].shape == torch.Size((1, 64, 4, 4)) + assert feat[4].shape == torch.Size((1, 128, 2, 2)) + + # Test CSPDarknet with BatchNorm forward + model = CSPDarknet(widen_factor=0.125, out_indices=range(0, 5)) + for m in model.modules(): + if is_norm(m): + assert isinstance(m, _BatchNorm) + model.train() + + imgs = torch.randn(1, 3, 64, 64) + feat = model(imgs) + assert len(feat) == 5 + assert feat[0].shape == torch.Size((1, 8, 32, 32)) + assert feat[1].shape == torch.Size((1, 16, 16, 16)) + assert feat[2].shape == torch.Size((1, 32, 8, 8)) + assert feat[3].shape == torch.Size((1, 64, 4, 4)) + assert feat[4].shape == torch.Size((1, 128, 2, 2)) + + # Test CSPDarknet with custom arch forward + arch_ovewrite = [[32, 56, 3, True, False], [56, 224, 2, True, False], + [224, 512, 1, True, False]] + model = CSPDarknet( + arch_ovewrite=arch_ovewrite, + widen_factor=0.25, + out_indices=(0, 1, 2, 3)) + model.train() + + imgs = torch.randn(1, 3, 32, 32) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size((1, 8, 16, 16)) + assert feat[1].shape == torch.Size((1, 14, 8, 8)) + assert feat[2].shape == torch.Size((1, 56, 4, 4)) + assert feat[3].shape == torch.Size((1, 128, 2, 2)) diff --git a/tests/test_models/test_backbones/test_detectors_resnet.py b/tests/test_models/test_backbones/test_detectors_resnet.py new file mode 100644 index 0000000..69f462a --- /dev/null +++ b/tests/test_models/test_backbones/test_detectors_resnet.py @@ -0,0 +1,47 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest + +from mmdet.models.backbones import DetectoRS_ResNet + + +def test_detectorrs_resnet_backbone(): + detectorrs_cfg = dict( + depth=50, + num_stages=4, + out_indices=(0, 1, 2, 3), + frozen_stages=1, + norm_cfg=dict(type='BN', requires_grad=True), + norm_eval=True, + style='pytorch', + conv_cfg=dict(type='ConvAWS'), + sac=dict(type='SAC', use_deform=True), + stage_with_sac=(False, True, True, True), + output_img=True) + """Test init_weights config""" + with pytest.raises(AssertionError): + # pretrained and init_cfg cannot be specified at the same time + DetectoRS_ResNet( + **detectorrs_cfg, pretrained='Pretrained', init_cfg='Pretrained') + + with pytest.raises(AssertionError): + # init_cfg must be a dict + DetectoRS_ResNet( + **detectorrs_cfg, pretrained=None, init_cfg=['Pretrained']) + + with pytest.raises(KeyError): + # init_cfg must contain the key `type` + DetectoRS_ResNet( + **detectorrs_cfg, + pretrained=None, + init_cfg=dict(checkpoint='Pretrained')) + + with pytest.raises(AssertionError): + # init_cfg only support initialize pretrained model way + DetectoRS_ResNet( + **detectorrs_cfg, pretrained=None, init_cfg=dict(type='Trained')) + + with pytest.raises(TypeError): + # pretrained mast be a str or None + model = DetectoRS_ResNet( + **detectorrs_cfg, pretrained=['Pretrained'], init_cfg=None) + model.init_weights() diff --git a/tests/test_models/test_backbones/test_efficientnet.py b/tests/test_models/test_backbones/test_efficientnet.py new file mode 100644 index 0000000..aa21770 --- /dev/null +++ b/tests/test_models/test_backbones/test_efficientnet.py @@ -0,0 +1,25 @@ +import pytest +import torch + +from mmdet.models.backbones import EfficientNet + + +def test_efficientnet_backbone(): + """Test EfficientNet backbone.""" + with pytest.raises(AssertionError): + # EfficientNet arch should be a key in EfficientNet.arch_settings + EfficientNet(arch='c3') + + model = EfficientNet(arch='b0', out_indices=(0, 1, 2, 3, 4, 5, 6)) + model.train() + + imgs = torch.randn(2, 3, 32, 32) + feat = model(imgs) + assert len(feat) == 7 + assert feat[0].shape == torch.Size([2, 32, 16, 16]) + assert feat[1].shape == torch.Size([2, 16, 16, 16]) + assert feat[2].shape == torch.Size([2, 24, 8, 8]) + assert feat[3].shape == torch.Size([2, 40, 4, 4]) + assert feat[4].shape == torch.Size([2, 112, 2, 2]) + assert feat[5].shape == torch.Size([2, 320, 1, 1]) + assert feat[6].shape == torch.Size([2, 1280, 1, 1]) diff --git a/tests/test_models/test_backbones/test_hourglass.py b/tests/test_models/test_backbones/test_hourglass.py new file mode 100644 index 0000000..c26f9c0 --- /dev/null +++ b/tests/test_models/test_backbones/test_hourglass.py @@ -0,0 +1,49 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch + +from mmdet.models.backbones.hourglass import HourglassNet + + +def test_hourglass_backbone(): + with pytest.raises(AssertionError): + # HourglassNet's num_stacks should larger than 0 + HourglassNet(num_stacks=0) + + with pytest.raises(AssertionError): + # len(stage_channels) should equal len(stage_blocks) + HourglassNet( + stage_channels=[256, 256, 384, 384, 384], + stage_blocks=[2, 2, 2, 2, 2, 4]) + + with pytest.raises(AssertionError): + # len(stage_channels) should lagrer than downsample_times + HourglassNet( + downsample_times=5, + stage_channels=[256, 256, 384, 384, 384], + stage_blocks=[2, 2, 2, 2, 2]) + + # Test HourglassNet-52 + model = HourglassNet( + num_stacks=1, + stage_channels=(64, 64, 96, 96, 96, 128), + feat_channel=64) + model.train() + + imgs = torch.randn(1, 3, 256, 256) + feat = model(imgs) + assert len(feat) == 1 + assert feat[0].shape == torch.Size([1, 64, 64, 64]) + + # Test HourglassNet-104 + model = HourglassNet( + num_stacks=2, + stage_channels=(64, 64, 96, 96, 96, 128), + feat_channel=64) + model.train() + + imgs = torch.randn(1, 3, 256, 256) + feat = model(imgs) + assert len(feat) == 2 + assert feat[0].shape == torch.Size([1, 64, 64, 64]) + assert feat[1].shape == torch.Size([1, 64, 64, 64]) diff --git a/tests/test_models/test_backbones/test_hrnet.py b/tests/test_models/test_backbones/test_hrnet.py new file mode 100644 index 0000000..6ae367b --- /dev/null +++ b/tests/test_models/test_backbones/test_hrnet.py @@ -0,0 +1,111 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch + +from mmdet.models.backbones.hrnet import HRModule, HRNet +from mmdet.models.backbones.resnet import BasicBlock, Bottleneck + + +@pytest.mark.parametrize('block', [BasicBlock, Bottleneck]) +def test_hrmodule(block): + # Test multiscale forward + num_channles = (32, 64) + in_channels = [c * block.expansion for c in num_channles] + hrmodule = HRModule( + num_branches=2, + blocks=block, + in_channels=in_channels, + num_blocks=(4, 4), + num_channels=num_channles, + ) + + feats = [ + torch.randn(1, in_channels[0], 64, 64), + torch.randn(1, in_channels[1], 32, 32) + ] + feats = hrmodule(feats) + + assert len(feats) == 2 + assert feats[0].shape == torch.Size([1, in_channels[0], 64, 64]) + assert feats[1].shape == torch.Size([1, in_channels[1], 32, 32]) + + # Test single scale forward + num_channles = (32, 64) + in_channels = [c * block.expansion for c in num_channles] + hrmodule = HRModule( + num_branches=2, + blocks=block, + in_channels=in_channels, + num_blocks=(4, 4), + num_channels=num_channles, + multiscale_output=False, + ) + + feats = [ + torch.randn(1, in_channels[0], 64, 64), + torch.randn(1, in_channels[1], 32, 32) + ] + feats = hrmodule(feats) + + assert len(feats) == 1 + assert feats[0].shape == torch.Size([1, in_channels[0], 64, 64]) + + +def test_hrnet_backbone(): + # only have 3 stages + extra = dict( + stage1=dict( + num_modules=1, + num_branches=1, + block='BOTTLENECK', + num_blocks=(4, ), + num_channels=(64, )), + stage2=dict( + num_modules=1, + num_branches=2, + block='BASIC', + num_blocks=(4, 4), + num_channels=(32, 64)), + stage3=dict( + num_modules=4, + num_branches=3, + block='BASIC', + num_blocks=(4, 4, 4), + num_channels=(32, 64, 128))) + + with pytest.raises(AssertionError): + # HRNet now only support 4 stages + HRNet(extra=extra) + extra['stage4'] = dict( + num_modules=3, + num_branches=3, # should be 4 + block='BASIC', + num_blocks=(4, 4, 4, 4), + num_channels=(32, 64, 128, 256)) + + with pytest.raises(AssertionError): + # len(num_blocks) should equal num_branches + HRNet(extra=extra) + + extra['stage4']['num_branches'] = 4 + + # Test hrnetv2p_w32 + model = HRNet(extra=extra) + model.init_weights() + model.train() + + imgs = torch.randn(1, 3, 256, 256) + feats = model(imgs) + assert len(feats) == 4 + assert feats[0].shape == torch.Size([1, 32, 64, 64]) + assert feats[3].shape == torch.Size([1, 256, 8, 8]) + + # Test single scale output + model = HRNet(extra=extra, multiscale_output=False) + model.init_weights() + model.train() + + imgs = torch.randn(1, 3, 256, 256) + feats = model(imgs) + assert len(feats) == 1 + assert feats[0].shape == torch.Size([1, 32, 64, 64]) diff --git a/tests/test_models/test_backbones/test_mobilenet_v2.py b/tests/test_models/test_backbones/test_mobilenet_v2.py new file mode 100644 index 0000000..77df7ea --- /dev/null +++ b/tests/test_models/test_backbones/test_mobilenet_v2.py @@ -0,0 +1,173 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch +from torch.nn.modules import GroupNorm +from torch.nn.modules.batchnorm import _BatchNorm + +from mmdet.models.backbones.mobilenet_v2 import MobileNetV2 +from .utils import check_norm_state, is_block, is_norm + + +def test_mobilenetv2_backbone(): + with pytest.raises(ValueError): + # frozen_stages must in range(-1, 8) + MobileNetV2(frozen_stages=8) + + with pytest.raises(ValueError): + # out_indices in range(-1, 8) + MobileNetV2(out_indices=[8]) + + # Test MobileNetV2 with first stage frozen + frozen_stages = 1 + model = MobileNetV2(frozen_stages=frozen_stages) + model.train() + + for mod in model.conv1.modules(): + for param in mod.parameters(): + assert param.requires_grad is False + for i in range(1, frozen_stages + 1): + layer = getattr(model, f'layer{i}') + for mod in layer.modules(): + if isinstance(mod, _BatchNorm): + assert mod.training is False + for param in layer.parameters(): + assert param.requires_grad is False + + # Test MobileNetV2 with norm_eval=True + model = MobileNetV2(norm_eval=True) + model.train() + + assert check_norm_state(model.modules(), False) + + # Test MobileNetV2 forward with widen_factor=1.0 + model = MobileNetV2(widen_factor=1.0, out_indices=range(0, 8)) + model.train() + + assert check_norm_state(model.modules(), True) + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 8 + assert feat[0].shape == torch.Size((1, 16, 112, 112)) + assert feat[1].shape == torch.Size((1, 24, 56, 56)) + assert feat[2].shape == torch.Size((1, 32, 28, 28)) + assert feat[3].shape == torch.Size((1, 64, 14, 14)) + assert feat[4].shape == torch.Size((1, 96, 14, 14)) + assert feat[5].shape == torch.Size((1, 160, 7, 7)) + assert feat[6].shape == torch.Size((1, 320, 7, 7)) + assert feat[7].shape == torch.Size((1, 1280, 7, 7)) + + # Test MobileNetV2 forward with widen_factor=0.5 + model = MobileNetV2(widen_factor=0.5, out_indices=range(0, 7)) + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 7 + assert feat[0].shape == torch.Size((1, 8, 112, 112)) + assert feat[1].shape == torch.Size((1, 16, 56, 56)) + assert feat[2].shape == torch.Size((1, 16, 28, 28)) + assert feat[3].shape == torch.Size((1, 32, 14, 14)) + assert feat[4].shape == torch.Size((1, 48, 14, 14)) + assert feat[5].shape == torch.Size((1, 80, 7, 7)) + assert feat[6].shape == torch.Size((1, 160, 7, 7)) + + # Test MobileNetV2 forward with widen_factor=2.0 + model = MobileNetV2(widen_factor=2.0, out_indices=range(0, 8)) + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert feat[0].shape == torch.Size((1, 32, 112, 112)) + assert feat[1].shape == torch.Size((1, 48, 56, 56)) + assert feat[2].shape == torch.Size((1, 64, 28, 28)) + assert feat[3].shape == torch.Size((1, 128, 14, 14)) + assert feat[4].shape == torch.Size((1, 192, 14, 14)) + assert feat[5].shape == torch.Size((1, 320, 7, 7)) + assert feat[6].shape == torch.Size((1, 640, 7, 7)) + assert feat[7].shape == torch.Size((1, 2560, 7, 7)) + + # Test MobileNetV2 forward with dict(type='ReLU') + model = MobileNetV2( + widen_factor=1.0, act_cfg=dict(type='ReLU'), out_indices=range(0, 7)) + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 7 + assert feat[0].shape == torch.Size((1, 16, 112, 112)) + assert feat[1].shape == torch.Size((1, 24, 56, 56)) + assert feat[2].shape == torch.Size((1, 32, 28, 28)) + assert feat[3].shape == torch.Size((1, 64, 14, 14)) + assert feat[4].shape == torch.Size((1, 96, 14, 14)) + assert feat[5].shape == torch.Size((1, 160, 7, 7)) + assert feat[6].shape == torch.Size((1, 320, 7, 7)) + + # Test MobileNetV2 with BatchNorm forward + model = MobileNetV2(widen_factor=1.0, out_indices=range(0, 7)) + for m in model.modules(): + if is_norm(m): + assert isinstance(m, _BatchNorm) + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 7 + assert feat[0].shape == torch.Size((1, 16, 112, 112)) + assert feat[1].shape == torch.Size((1, 24, 56, 56)) + assert feat[2].shape == torch.Size((1, 32, 28, 28)) + assert feat[3].shape == torch.Size((1, 64, 14, 14)) + assert feat[4].shape == torch.Size((1, 96, 14, 14)) + assert feat[5].shape == torch.Size((1, 160, 7, 7)) + assert feat[6].shape == torch.Size((1, 320, 7, 7)) + + # Test MobileNetV2 with GroupNorm forward + model = MobileNetV2( + widen_factor=1.0, + norm_cfg=dict(type='GN', num_groups=2, requires_grad=True), + out_indices=range(0, 7)) + for m in model.modules(): + if is_norm(m): + assert isinstance(m, GroupNorm) + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 7 + assert feat[0].shape == torch.Size((1, 16, 112, 112)) + assert feat[1].shape == torch.Size((1, 24, 56, 56)) + assert feat[2].shape == torch.Size((1, 32, 28, 28)) + assert feat[3].shape == torch.Size((1, 64, 14, 14)) + assert feat[4].shape == torch.Size((1, 96, 14, 14)) + assert feat[5].shape == torch.Size((1, 160, 7, 7)) + assert feat[6].shape == torch.Size((1, 320, 7, 7)) + + # Test MobileNetV2 with layers 1, 3, 5 out forward + model = MobileNetV2(widen_factor=1.0, out_indices=(0, 2, 4)) + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 3 + assert feat[0].shape == torch.Size((1, 16, 112, 112)) + assert feat[1].shape == torch.Size((1, 32, 28, 28)) + assert feat[2].shape == torch.Size((1, 96, 14, 14)) + + # Test MobileNetV2 with checkpoint forward + model = MobileNetV2( + widen_factor=1.0, with_cp=True, out_indices=range(0, 7)) + for m in model.modules(): + if is_block(m): + assert m.with_cp + model.train() + + imgs = torch.randn(1, 3, 224, 224) + feat = model(imgs) + assert len(feat) == 7 + assert feat[0].shape == torch.Size((1, 16, 112, 112)) + assert feat[1].shape == torch.Size((1, 24, 56, 56)) + assert feat[2].shape == torch.Size((1, 32, 28, 28)) + assert feat[3].shape == torch.Size((1, 64, 14, 14)) + assert feat[4].shape == torch.Size((1, 96, 14, 14)) + assert feat[5].shape == torch.Size((1, 160, 7, 7)) + assert feat[6].shape == torch.Size((1, 320, 7, 7)) diff --git a/tests/test_models/test_backbones/test_pvt.py b/tests/test_models/test_backbones/test_pvt.py new file mode 100644 index 0000000..029fdb3 --- /dev/null +++ b/tests/test_models/test_backbones/test_pvt.py @@ -0,0 +1,103 @@ +import pytest +import torch + +from mmdet.models.backbones.pvt import (PVTEncoderLayer, + PyramidVisionTransformer, + PyramidVisionTransformerV2) + + +def test_pvt_block(): + # test PVT structure and forward + block = PVTEncoderLayer( + embed_dims=64, num_heads=4, feedforward_channels=256) + assert block.ffn.embed_dims == 64 + assert block.attn.num_heads == 4 + assert block.ffn.feedforward_channels == 256 + x = torch.randn(1, 56 * 56, 64) + x_out = block(x, (56, 56)) + assert x_out.shape == torch.Size([1, 56 * 56, 64]) + + +def test_pvt(): + """Test PVT backbone.""" + + with pytest.raises(TypeError): + # Pretrained arg must be str or None. + PyramidVisionTransformer(pretrained=123) + + # test pretrained image size + with pytest.raises(AssertionError): + PyramidVisionTransformer(pretrain_img_size=(224, 224, 224)) + + # Test absolute position embedding + temp = torch.randn((1, 3, 224, 224)) + model = PyramidVisionTransformer( + pretrain_img_size=224, use_abs_pos_embed=True) + model.init_weights() + model(temp) + + # Test normal inference + temp = torch.randn((1, 3, 32, 32)) + model = PyramidVisionTransformer() + outs = model(temp) + assert outs[0].shape == (1, 64, 8, 8) + assert outs[1].shape == (1, 128, 4, 4) + assert outs[2].shape == (1, 320, 2, 2) + assert outs[3].shape == (1, 512, 1, 1) + + # Test abnormal inference size + temp = torch.randn((1, 3, 33, 33)) + model = PyramidVisionTransformer() + outs = model(temp) + assert outs[0].shape == (1, 64, 8, 8) + assert outs[1].shape == (1, 128, 4, 4) + assert outs[2].shape == (1, 320, 2, 2) + assert outs[3].shape == (1, 512, 1, 1) + + # Test abnormal inference size + temp = torch.randn((1, 3, 112, 137)) + model = PyramidVisionTransformer() + outs = model(temp) + assert outs[0].shape == (1, 64, 28, 34) + assert outs[1].shape == (1, 128, 14, 17) + assert outs[2].shape == (1, 320, 7, 8) + assert outs[3].shape == (1, 512, 3, 4) + + +def test_pvtv2(): + """Test PVTv2 backbone.""" + + with pytest.raises(TypeError): + # Pretrained arg must be str or None. + PyramidVisionTransformerV2(pretrained=123) + + # test pretrained image size + with pytest.raises(AssertionError): + PyramidVisionTransformerV2(pretrain_img_size=(224, 224, 224)) + + # Test normal inference + temp = torch.randn((1, 3, 32, 32)) + model = PyramidVisionTransformerV2() + outs = model(temp) + assert outs[0].shape == (1, 64, 8, 8) + assert outs[1].shape == (1, 128, 4, 4) + assert outs[2].shape == (1, 320, 2, 2) + assert outs[3].shape == (1, 512, 1, 1) + + # Test abnormal inference size + temp = torch.randn((1, 3, 31, 31)) + model = PyramidVisionTransformerV2() + outs = model(temp) + assert outs[0].shape == (1, 64, 8, 8) + assert outs[1].shape == (1, 128, 4, 4) + assert outs[2].shape == (1, 320, 2, 2) + assert outs[3].shape == (1, 512, 1, 1) + + # Test abnormal inference size + temp = torch.randn((1, 3, 112, 137)) + model = PyramidVisionTransformerV2() + outs = model(temp) + assert outs[0].shape == (1, 64, 28, 35) + assert outs[1].shape == (1, 128, 14, 18) + assert outs[2].shape == (1, 320, 7, 9) + assert outs[3].shape == (1, 512, 4, 5) diff --git a/tests/test_models/test_backbones/test_regnet.py b/tests/test_models/test_backbones/test_regnet.py new file mode 100644 index 0000000..2f94b11 --- /dev/null +++ b/tests/test_models/test_backbones/test_regnet.py @@ -0,0 +1,58 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch + +from mmdet.models.backbones import RegNet + +regnet_test_data = [ + ('regnetx_400mf', + dict(w0=24, wa=24.48, wm=2.54, group_w=16, depth=22, + bot_mul=1.0), [32, 64, 160, 384]), + ('regnetx_800mf', + dict(w0=56, wa=35.73, wm=2.28, group_w=16, depth=16, + bot_mul=1.0), [64, 128, 288, 672]), + ('regnetx_1.6gf', + dict(w0=80, wa=34.01, wm=2.25, group_w=24, depth=18, + bot_mul=1.0), [72, 168, 408, 912]), + ('regnetx_3.2gf', + dict(w0=88, wa=26.31, wm=2.25, group_w=48, depth=25, + bot_mul=1.0), [96, 192, 432, 1008]), + ('regnetx_4.0gf', + dict(w0=96, wa=38.65, wm=2.43, group_w=40, depth=23, + bot_mul=1.0), [80, 240, 560, 1360]), + ('regnetx_6.4gf', + dict(w0=184, wa=60.83, wm=2.07, group_w=56, depth=17, + bot_mul=1.0), [168, 392, 784, 1624]), + ('regnetx_8.0gf', + dict(w0=80, wa=49.56, wm=2.88, group_w=120, depth=23, + bot_mul=1.0), [80, 240, 720, 1920]), + ('regnetx_12gf', + dict(w0=168, wa=73.36, wm=2.37, group_w=112, depth=19, + bot_mul=1.0), [224, 448, 896, 2240]), +] + + +@pytest.mark.parametrize('arch_name,arch,out_channels', regnet_test_data) +def test_regnet_backbone(arch_name, arch, out_channels): + with pytest.raises(AssertionError): + # ResNeXt depth should be in [50, 101, 152] + RegNet(arch_name + '233') + + # Test RegNet with arch_name + model = RegNet(arch_name) + model.train() + + imgs = torch.randn(1, 3, 32, 32) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, out_channels[0], 8, 8]) + assert feat[1].shape == torch.Size([1, out_channels[1], 4, 4]) + assert feat[2].shape == torch.Size([1, out_channels[2], 2, 2]) + assert feat[3].shape == torch.Size([1, out_channels[3], 1, 1]) + + # Test RegNet with arch + model = RegNet(arch) + assert feat[0].shape == torch.Size([1, out_channels[0], 8, 8]) + assert feat[1].shape == torch.Size([1, out_channels[1], 4, 4]) + assert feat[2].shape == torch.Size([1, out_channels[2], 2, 2]) + assert feat[3].shape == torch.Size([1, out_channels[3], 1, 1]) diff --git a/tests/test_models/test_backbones/test_renext.py b/tests/test_models/test_backbones/test_renext.py new file mode 100644 index 0000000..4ce2ee6 --- /dev/null +++ b/tests/test_models/test_backbones/test_renext.py @@ -0,0 +1,105 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch + +from mmdet.models.backbones import ResNeXt +from mmdet.models.backbones.resnext import Bottleneck as BottleneckX +from .utils import is_block + + +def test_renext_bottleneck(): + with pytest.raises(AssertionError): + # Style must be in ['pytorch', 'caffe'] + BottleneckX(64, 64, groups=32, base_width=4, style='tensorflow') + + # Test ResNeXt Bottleneck structure + block = BottleneckX( + 64, 64, groups=32, base_width=4, stride=2, style='pytorch') + assert block.conv2.stride == (2, 2) + assert block.conv2.groups == 32 + assert block.conv2.out_channels == 128 + + # Test ResNeXt Bottleneck with DCN + dcn = dict(type='DCN', deform_groups=1, fallback_on_stride=False) + with pytest.raises(AssertionError): + # conv_cfg must be None if dcn is not None + BottleneckX( + 64, + 64, + groups=32, + base_width=4, + dcn=dcn, + conv_cfg=dict(type='Conv')) + BottleneckX(64, 64, dcn=dcn) + + # Test ResNeXt Bottleneck forward + block = BottleneckX(64, 16, groups=32, base_width=4) + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test ResNeXt Bottleneck forward with plugins + plugins = [ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + stages=(False, False, True, True), + position='after_conv2') + ] + block = BottleneckX(64, 16, groups=32, base_width=4, plugins=plugins) + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + +def test_resnext_backbone(): + with pytest.raises(KeyError): + # ResNeXt depth should be in [50, 101, 152] + ResNeXt(depth=18) + + # Test ResNeXt with group 32, base_width 4 + model = ResNeXt(depth=50, groups=32, base_width=4) + for m in model.modules(): + if is_block(m): + assert m.conv2.groups == 32 + model.train() + + imgs = torch.randn(1, 3, 32, 32) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 256, 8, 8]) + assert feat[1].shape == torch.Size([1, 512, 4, 4]) + assert feat[2].shape == torch.Size([1, 1024, 2, 2]) + assert feat[3].shape == torch.Size([1, 2048, 1, 1]) + + +regnet_test_data = [ + ('regnetx_400mf', + dict(w0=24, wa=24.48, wm=2.54, group_w=16, depth=22, + bot_mul=1.0), [32, 64, 160, 384]), + ('regnetx_800mf', + dict(w0=56, wa=35.73, wm=2.28, group_w=16, depth=16, + bot_mul=1.0), [64, 128, 288, 672]), + ('regnetx_1.6gf', + dict(w0=80, wa=34.01, wm=2.25, group_w=24, depth=18, + bot_mul=1.0), [72, 168, 408, 912]), + ('regnetx_3.2gf', + dict(w0=88, wa=26.31, wm=2.25, group_w=48, depth=25, + bot_mul=1.0), [96, 192, 432, 1008]), + ('regnetx_4.0gf', + dict(w0=96, wa=38.65, wm=2.43, group_w=40, depth=23, + bot_mul=1.0), [80, 240, 560, 1360]), + ('regnetx_6.4gf', + dict(w0=184, wa=60.83, wm=2.07, group_w=56, depth=17, + bot_mul=1.0), [168, 392, 784, 1624]), + ('regnetx_8.0gf', + dict(w0=80, wa=49.56, wm=2.88, group_w=120, depth=23, + bot_mul=1.0), [80, 240, 720, 1920]), + ('regnetx_12gf', + dict(w0=168, wa=73.36, wm=2.37, group_w=112, depth=19, + bot_mul=1.0), [224, 448, 896, 2240]), +] diff --git a/tests/test_models/test_backbones/test_res2net.py b/tests/test_models/test_backbones/test_res2net.py new file mode 100644 index 0000000..6757869 --- /dev/null +++ b/tests/test_models/test_backbones/test_res2net.py @@ -0,0 +1,62 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch + +from mmdet.models.backbones import Res2Net +from mmdet.models.backbones.res2net import Bottle2neck +from .utils import is_block + + +def test_res2net_bottle2neck(): + with pytest.raises(AssertionError): + # Style must be in ['pytorch', 'caffe'] + Bottle2neck(64, 64, base_width=26, scales=4, style='tensorflow') + + with pytest.raises(AssertionError): + # Scale must be larger than 1 + Bottle2neck(64, 64, base_width=26, scales=1, style='pytorch') + + # Test Res2Net Bottle2neck structure + block = Bottle2neck( + 64, 64, base_width=26, stride=2, scales=4, style='pytorch') + assert block.scales == 4 + + # Test Res2Net Bottle2neck with DCN + dcn = dict(type='DCN', deform_groups=1, fallback_on_stride=False) + with pytest.raises(AssertionError): + # conv_cfg must be None if dcn is not None + Bottle2neck( + 64, + 64, + base_width=26, + scales=4, + dcn=dcn, + conv_cfg=dict(type='Conv')) + Bottle2neck(64, 64, dcn=dcn) + + # Test Res2Net Bottle2neck forward + block = Bottle2neck(64, 16, base_width=26, scales=4) + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + +def test_res2net_backbone(): + with pytest.raises(KeyError): + # Res2Net depth should be in [50, 101, 152] + Res2Net(depth=18) + + # Test Res2Net with scales 4, base_width 26 + model = Res2Net(depth=50, scales=4, base_width=26) + for m in model.modules(): + if is_block(m): + assert m.scales == 4 + model.train() + + imgs = torch.randn(1, 3, 32, 32) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 256, 8, 8]) + assert feat[1].shape == torch.Size([1, 512, 4, 4]) + assert feat[2].shape == torch.Size([1, 1024, 2, 2]) + assert feat[3].shape == torch.Size([1, 2048, 1, 1]) diff --git a/tests/test_models/test_backbones/test_resnest.py b/tests/test_models/test_backbones/test_resnest.py new file mode 100644 index 0000000..245fdfd --- /dev/null +++ b/tests/test_models/test_backbones/test_resnest.py @@ -0,0 +1,47 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch + +from mmdet.models.backbones import ResNeSt +from mmdet.models.backbones.resnest import Bottleneck as BottleneckS + + +def test_resnest_bottleneck(): + with pytest.raises(AssertionError): + # Style must be in ['pytorch', 'caffe'] + BottleneckS(64, 64, radix=2, reduction_factor=4, style='tensorflow') + + # Test ResNeSt Bottleneck structure + block = BottleneckS( + 2, 4, radix=2, reduction_factor=4, stride=2, style='pytorch') + assert block.avd_layer.stride == 2 + assert block.conv2.channels == 4 + + # Test ResNeSt Bottleneck forward + block = BottleneckS(16, 4, radix=2, reduction_factor=4) + x = torch.randn(2, 16, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([2, 16, 56, 56]) + + +def test_resnest_backbone(): + with pytest.raises(KeyError): + # ResNeSt depth should be in [50, 101, 152, 200] + ResNeSt(depth=18) + + # Test ResNeSt with radix 2, reduction_factor 4 + model = ResNeSt( + depth=50, + base_channels=4, + radix=2, + reduction_factor=4, + out_indices=(0, 1, 2, 3)) + model.train() + + imgs = torch.randn(2, 3, 32, 32) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([2, 16, 8, 8]) + assert feat[1].shape == torch.Size([2, 32, 4, 4]) + assert feat[2].shape == torch.Size([2, 64, 2, 2]) + assert feat[3].shape == torch.Size([2, 128, 1, 1]) diff --git a/tests/test_models/test_backbones/test_resnet.py b/tests/test_models/test_backbones/test_resnet.py new file mode 100644 index 0000000..5448828 --- /dev/null +++ b/tests/test_models/test_backbones/test_resnet.py @@ -0,0 +1,632 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch +from mmcv import assert_params_all_zeros +from mmcv.ops import DeformConv2dPack +from torch.nn.modules import AvgPool2d, GroupNorm +from torch.nn.modules.batchnorm import _BatchNorm + +from mmdet.models.backbones import ResNet, ResNetV1d +from mmdet.models.backbones.resnet import BasicBlock, Bottleneck +from mmdet.models.utils import ResLayer, SimplifiedBasicBlock +from .utils import check_norm_state, is_block, is_norm + + +def test_resnet_basic_block(): + with pytest.raises(AssertionError): + # Not implemented yet. + dcn = dict(type='DCN', deform_groups=1, fallback_on_stride=False) + BasicBlock(64, 64, dcn=dcn) + + with pytest.raises(AssertionError): + # Not implemented yet. + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3') + ] + BasicBlock(64, 64, plugins=plugins) + + with pytest.raises(AssertionError): + # Not implemented yet + plugins = [ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + position='after_conv2') + ] + BasicBlock(64, 64, plugins=plugins) + + # test BasicBlock structure and forward + block = BasicBlock(64, 64) + assert block.conv1.in_channels == 64 + assert block.conv1.out_channels == 64 + assert block.conv1.kernel_size == (3, 3) + assert block.conv2.in_channels == 64 + assert block.conv2.out_channels == 64 + assert block.conv2.kernel_size == (3, 3) + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test BasicBlock with checkpoint forward + block = BasicBlock(64, 64, with_cp=True) + assert block.with_cp + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + +def test_resnet_bottleneck(): + with pytest.raises(AssertionError): + # Style must be in ['pytorch', 'caffe'] + Bottleneck(64, 64, style='tensorflow') + + with pytest.raises(AssertionError): + # Allowed positions are 'after_conv1', 'after_conv2', 'after_conv3' + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv4') + ] + Bottleneck(64, 16, plugins=plugins) + + with pytest.raises(AssertionError): + # Need to specify different postfix to avoid duplicate plugin name + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3'), + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3') + ] + Bottleneck(64, 16, plugins=plugins) + + with pytest.raises(KeyError): + # Plugin type is not supported + plugins = [dict(cfg=dict(type='WrongPlugin'), position='after_conv3')] + Bottleneck(64, 16, plugins=plugins) + + # Test Bottleneck with checkpoint forward + block = Bottleneck(64, 16, with_cp=True) + assert block.with_cp + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test Bottleneck style + block = Bottleneck(64, 64, stride=2, style='pytorch') + assert block.conv1.stride == (1, 1) + assert block.conv2.stride == (2, 2) + block = Bottleneck(64, 64, stride=2, style='caffe') + assert block.conv1.stride == (2, 2) + assert block.conv2.stride == (1, 1) + + # Test Bottleneck DCN + dcn = dict(type='DCN', deform_groups=1, fallback_on_stride=False) + with pytest.raises(AssertionError): + Bottleneck(64, 64, dcn=dcn, conv_cfg=dict(type='Conv')) + block = Bottleneck(64, 64, dcn=dcn) + assert isinstance(block.conv2, DeformConv2dPack) + + # Test Bottleneck forward + block = Bottleneck(64, 16) + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test Bottleneck with 1 ContextBlock after conv3 + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3') + ] + block = Bottleneck(64, 16, plugins=plugins) + assert block.context_block.in_channels == 64 + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test Bottleneck with 1 GeneralizedAttention after conv2 + plugins = [ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + position='after_conv2') + ] + block = Bottleneck(64, 16, plugins=plugins) + assert block.gen_attention_block.in_channels == 16 + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test Bottleneck with 1 GeneralizedAttention after conv2, 1 NonLocal2D + # after conv2, 1 ContextBlock after conv3 + plugins = [ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + position='after_conv2'), + dict(cfg=dict(type='NonLocal2d'), position='after_conv2'), + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3') + ] + block = Bottleneck(64, 16, plugins=plugins) + assert block.gen_attention_block.in_channels == 16 + assert block.nonlocal_block.in_channels == 16 + assert block.context_block.in_channels == 64 + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test Bottleneck with 1 ContextBlock after conv2, 2 ContextBlock after + # conv3 + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16, postfix=1), + position='after_conv2'), + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16, postfix=2), + position='after_conv3'), + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16, postfix=3), + position='after_conv3') + ] + block = Bottleneck(64, 16, plugins=plugins) + assert block.context_block1.in_channels == 16 + assert block.context_block2.in_channels == 64 + assert block.context_block3.in_channels == 64 + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + +def test_simplied_basic_block(): + with pytest.raises(AssertionError): + # Not implemented yet. + dcn = dict(type='DCN', deform_groups=1, fallback_on_stride=False) + SimplifiedBasicBlock(64, 64, dcn=dcn) + + with pytest.raises(AssertionError): + # Not implemented yet. + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3') + ] + SimplifiedBasicBlock(64, 64, plugins=plugins) + + with pytest.raises(AssertionError): + # Not implemented yet + plugins = [ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + position='after_conv2') + ] + SimplifiedBasicBlock(64, 64, plugins=plugins) + + with pytest.raises(AssertionError): + # Not implemented yet + SimplifiedBasicBlock(64, 64, with_cp=True) + + # test SimplifiedBasicBlock structure and forward + block = SimplifiedBasicBlock(64, 64) + assert block.conv1.in_channels == 64 + assert block.conv1.out_channels == 64 + assert block.conv1.kernel_size == (3, 3) + assert block.conv2.in_channels == 64 + assert block.conv2.out_channels == 64 + assert block.conv2.kernel_size == (3, 3) + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # test SimplifiedBasicBlock without norm + block = SimplifiedBasicBlock(64, 64, norm_cfg=None) + assert block.norm1 is None + assert block.norm2 is None + x_out = block(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + +def test_resnet_res_layer(): + # Test ResLayer of 3 Bottleneck w\o downsample + layer = ResLayer(Bottleneck, 64, 16, 3) + assert len(layer) == 3 + assert layer[0].conv1.in_channels == 64 + assert layer[0].conv1.out_channels == 16 + for i in range(1, len(layer)): + assert layer[i].conv1.in_channels == 64 + assert layer[i].conv1.out_channels == 16 + for i in range(len(layer)): + assert layer[i].downsample is None + x = torch.randn(1, 64, 56, 56) + x_out = layer(x) + assert x_out.shape == torch.Size([1, 64, 56, 56]) + + # Test ResLayer of 3 Bottleneck with downsample + layer = ResLayer(Bottleneck, 64, 64, 3) + assert layer[0].downsample[0].out_channels == 256 + for i in range(1, len(layer)): + assert layer[i].downsample is None + x = torch.randn(1, 64, 56, 56) + x_out = layer(x) + assert x_out.shape == torch.Size([1, 256, 56, 56]) + + # Test ResLayer of 3 Bottleneck with stride=2 + layer = ResLayer(Bottleneck, 64, 64, 3, stride=2) + assert layer[0].downsample[0].out_channels == 256 + assert layer[0].downsample[0].stride == (2, 2) + for i in range(1, len(layer)): + assert layer[i].downsample is None + x = torch.randn(1, 64, 56, 56) + x_out = layer(x) + assert x_out.shape == torch.Size([1, 256, 28, 28]) + + # Test ResLayer of 3 Bottleneck with stride=2 and average downsample + layer = ResLayer(Bottleneck, 64, 64, 3, stride=2, avg_down=True) + assert isinstance(layer[0].downsample[0], AvgPool2d) + assert layer[0].downsample[1].out_channels == 256 + assert layer[0].downsample[1].stride == (1, 1) + for i in range(1, len(layer)): + assert layer[i].downsample is None + x = torch.randn(1, 64, 56, 56) + x_out = layer(x) + assert x_out.shape == torch.Size([1, 256, 28, 28]) + + # Test ResLayer of 3 BasicBlock with stride=2 and downsample_first=False + layer = ResLayer(BasicBlock, 64, 64, 3, stride=2, downsample_first=False) + assert layer[2].downsample[0].out_channels == 64 + assert layer[2].downsample[0].stride == (2, 2) + for i in range(len(layer) - 1): + assert layer[i].downsample is None + x = torch.randn(1, 64, 56, 56) + x_out = layer(x) + assert x_out.shape == torch.Size([1, 64, 28, 28]) + + +def test_resnest_stem(): + # Test default stem_channels + model = ResNet(50) + assert model.stem_channels == 64 + assert model.conv1.out_channels == 64 + assert model.norm1.num_features == 64 + + # Test default stem_channels, with base_channels=3 + model = ResNet(50, base_channels=3) + assert model.stem_channels == 3 + assert model.conv1.out_channels == 3 + assert model.norm1.num_features == 3 + assert model.layer1[0].conv1.in_channels == 3 + + # Test stem_channels=3 + model = ResNet(50, stem_channels=3) + assert model.stem_channels == 3 + assert model.conv1.out_channels == 3 + assert model.norm1.num_features == 3 + assert model.layer1[0].conv1.in_channels == 3 + + # Test stem_channels=3, with base_channels=2 + model = ResNet(50, stem_channels=3, base_channels=2) + assert model.stem_channels == 3 + assert model.conv1.out_channels == 3 + assert model.norm1.num_features == 3 + assert model.layer1[0].conv1.in_channels == 3 + + # Test V1d stem_channels + model = ResNetV1d(depth=50, stem_channels=6) + model.train() + assert model.stem[0].out_channels == 3 + assert model.stem[1].num_features == 3 + assert model.stem[3].out_channels == 3 + assert model.stem[4].num_features == 3 + assert model.stem[6].out_channels == 6 + assert model.stem[7].num_features == 6 + assert model.layer1[0].conv1.in_channels == 6 + + +def test_resnet_backbone(): + """Test resnet backbone.""" + with pytest.raises(KeyError): + # ResNet depth should be in [18, 34, 50, 101, 152] + ResNet(20) + + with pytest.raises(AssertionError): + # In ResNet: 1 <= num_stages <= 4 + ResNet(50, num_stages=0) + + with pytest.raises(AssertionError): + # len(stage_with_dcn) == num_stages + dcn = dict(type='DCN', deform_groups=1, fallback_on_stride=False) + ResNet(50, dcn=dcn, stage_with_dcn=(True, )) + + with pytest.raises(AssertionError): + # len(stage_with_plugin) == num_stages + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + stages=(False, True, True), + position='after_conv3') + ] + ResNet(50, plugins=plugins) + + with pytest.raises(AssertionError): + # In ResNet: 1 <= num_stages <= 4 + ResNet(50, num_stages=5) + + with pytest.raises(AssertionError): + # len(strides) == len(dilations) == num_stages + ResNet(50, strides=(1, ), dilations=(1, 1), num_stages=3) + + with pytest.raises(TypeError): + # pretrained must be a string path + model = ResNet(50, pretrained=0) + + with pytest.raises(AssertionError): + # Style must be in ['pytorch', 'caffe'] + ResNet(50, style='tensorflow') + + # Test ResNet50 norm_eval=True + model = ResNet(50, norm_eval=True, base_channels=1) + model.train() + assert check_norm_state(model.modules(), False) + + # Test ResNet50 with torchvision pretrained weight + model = ResNet( + depth=50, norm_eval=True, pretrained='torchvision://resnet50') + model.train() + assert check_norm_state(model.modules(), False) + + # Test ResNet50 with first stage frozen + frozen_stages = 1 + model = ResNet(50, frozen_stages=frozen_stages, base_channels=1) + model.train() + assert model.norm1.training is False + for layer in [model.conv1, model.norm1]: + for param in layer.parameters(): + assert param.requires_grad is False + for i in range(1, frozen_stages + 1): + layer = getattr(model, f'layer{i}') + for mod in layer.modules(): + if isinstance(mod, _BatchNorm): + assert mod.training is False + for param in layer.parameters(): + assert param.requires_grad is False + + # Test ResNet50V1d with first stage frozen + model = ResNetV1d(depth=50, frozen_stages=frozen_stages, base_channels=2) + assert len(model.stem) == 9 + model.train() + assert check_norm_state(model.stem, False) + for param in model.stem.parameters(): + assert param.requires_grad is False + for i in range(1, frozen_stages + 1): + layer = getattr(model, f'layer{i}') + for mod in layer.modules(): + if isinstance(mod, _BatchNorm): + assert mod.training is False + for param in layer.parameters(): + assert param.requires_grad is False + + # Test ResNet18 forward + model = ResNet(18) + model.train() + + imgs = torch.randn(1, 3, 32, 32) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 64, 8, 8]) + assert feat[1].shape == torch.Size([1, 128, 4, 4]) + assert feat[2].shape == torch.Size([1, 256, 2, 2]) + assert feat[3].shape == torch.Size([1, 512, 1, 1]) + + # Test ResNet18 with checkpoint forward + model = ResNet(18, with_cp=True) + for m in model.modules(): + if is_block(m): + assert m.with_cp + + # Test ResNet50 with BatchNorm forward + model = ResNet(50, base_channels=1) + for m in model.modules(): + if is_norm(m): + assert isinstance(m, _BatchNorm) + model.train() + + imgs = torch.randn(1, 3, 32, 32) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 4, 8, 8]) + assert feat[1].shape == torch.Size([1, 8, 4, 4]) + assert feat[2].shape == torch.Size([1, 16, 2, 2]) + assert feat[3].shape == torch.Size([1, 32, 1, 1]) + + # Test ResNet50 with layers 1, 2, 3 out forward + model = ResNet(50, out_indices=(0, 1, 2), base_channels=1) + model.train() + + imgs = torch.randn(1, 3, 32, 32) + feat = model(imgs) + assert len(feat) == 3 + assert feat[0].shape == torch.Size([1, 4, 8, 8]) + assert feat[1].shape == torch.Size([1, 8, 4, 4]) + assert feat[2].shape == torch.Size([1, 16, 2, 2]) + + # Test ResNet50 with checkpoint forward + model = ResNet(50, with_cp=True, base_channels=1) + for m in model.modules(): + if is_block(m): + assert m.with_cp + model.train() + + imgs = torch.randn(1, 3, 32, 32) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 4, 8, 8]) + assert feat[1].shape == torch.Size([1, 8, 4, 4]) + assert feat[2].shape == torch.Size([1, 16, 2, 2]) + assert feat[3].shape == torch.Size([1, 32, 1, 1]) + + # Test ResNet50 with GroupNorm forward + model = ResNet( + 50, + base_channels=4, + norm_cfg=dict(type='GN', num_groups=2, requires_grad=True)) + for m in model.modules(): + if is_norm(m): + assert isinstance(m, GroupNorm) + model.train() + + imgs = torch.randn(1, 3, 32, 32) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 16, 8, 8]) + assert feat[1].shape == torch.Size([1, 32, 4, 4]) + assert feat[2].shape == torch.Size([1, 64, 2, 2]) + assert feat[3].shape == torch.Size([1, 128, 1, 1]) + + # Test ResNet50 with 1 GeneralizedAttention after conv2, 1 NonLocal2D + # after conv2, 1 ContextBlock after conv3 in layers 2, 3, 4 + plugins = [ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + stages=(False, True, True, True), + position='after_conv2'), + dict(cfg=dict(type='NonLocal2d'), position='after_conv2'), + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + stages=(False, True, True, False), + position='after_conv3') + ] + model = ResNet(50, plugins=plugins, base_channels=8) + for m in model.layer1.modules(): + if is_block(m): + assert not hasattr(m, 'context_block') + assert not hasattr(m, 'gen_attention_block') + assert m.nonlocal_block.in_channels == 8 + for m in model.layer2.modules(): + if is_block(m): + assert m.nonlocal_block.in_channels == 16 + assert m.gen_attention_block.in_channels == 16 + assert m.context_block.in_channels == 64 + + for m in model.layer3.modules(): + if is_block(m): + assert m.nonlocal_block.in_channels == 32 + assert m.gen_attention_block.in_channels == 32 + assert m.context_block.in_channels == 128 + + for m in model.layer4.modules(): + if is_block(m): + assert m.nonlocal_block.in_channels == 64 + assert m.gen_attention_block.in_channels == 64 + assert not hasattr(m, 'context_block') + model.train() + + imgs = torch.randn(1, 3, 32, 32) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 32, 8, 8]) + assert feat[1].shape == torch.Size([1, 64, 4, 4]) + assert feat[2].shape == torch.Size([1, 128, 2, 2]) + assert feat[3].shape == torch.Size([1, 256, 1, 1]) + + # Test ResNet50 with 1 ContextBlock after conv2, 1 ContextBlock after + # conv3 in layers 2, 3, 4 + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16, postfix=1), + stages=(False, True, True, False), + position='after_conv3'), + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16, postfix=2), + stages=(False, True, True, False), + position='after_conv3') + ] + + model = ResNet(50, plugins=plugins, base_channels=8) + for m in model.layer1.modules(): + if is_block(m): + assert not hasattr(m, 'context_block') + assert not hasattr(m, 'context_block1') + assert not hasattr(m, 'context_block2') + for m in model.layer2.modules(): + if is_block(m): + assert not hasattr(m, 'context_block') + assert m.context_block1.in_channels == 64 + assert m.context_block2.in_channels == 64 + + for m in model.layer3.modules(): + if is_block(m): + assert not hasattr(m, 'context_block') + assert m.context_block1.in_channels == 128 + assert m.context_block2.in_channels == 128 + + for m in model.layer4.modules(): + if is_block(m): + assert not hasattr(m, 'context_block') + assert not hasattr(m, 'context_block1') + assert not hasattr(m, 'context_block2') + model.train() + + imgs = torch.randn(1, 3, 32, 32) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 32, 8, 8]) + assert feat[1].shape == torch.Size([1, 64, 4, 4]) + assert feat[2].shape == torch.Size([1, 128, 2, 2]) + assert feat[3].shape == torch.Size([1, 256, 1, 1]) + + # Test ResNet50 zero initialization of residual + model = ResNet(50, zero_init_residual=True, base_channels=1) + model.init_weights() + for m in model.modules(): + if isinstance(m, Bottleneck): + assert assert_params_all_zeros(m.norm3) + elif isinstance(m, BasicBlock): + assert assert_params_all_zeros(m.norm2) + model.train() + + imgs = torch.randn(1, 3, 32, 32) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 4, 8, 8]) + assert feat[1].shape == torch.Size([1, 8, 4, 4]) + assert feat[2].shape == torch.Size([1, 16, 2, 2]) + assert feat[3].shape == torch.Size([1, 32, 1, 1]) + + # Test ResNetV1d forward + model = ResNetV1d(depth=50, base_channels=2) + model.train() + + imgs = torch.randn(1, 3, 32, 32) + feat = model(imgs) + assert len(feat) == 4 + assert feat[0].shape == torch.Size([1, 8, 8, 8]) + assert feat[1].shape == torch.Size([1, 16, 4, 4]) + assert feat[2].shape == torch.Size([1, 32, 2, 2]) + assert feat[3].shape == torch.Size([1, 64, 1, 1]) diff --git a/tests/test_models/test_backbones/test_swin.py b/tests/test_models/test_backbones/test_swin.py new file mode 100644 index 0000000..5369ef2 --- /dev/null +++ b/tests/test_models/test_backbones/test_swin.py @@ -0,0 +1,87 @@ +import pytest +import torch + +from mmdet.models.backbones.swin import SwinBlock, SwinTransformer + + +def test_swin_block(): + # test SwinBlock structure and forward + block = SwinBlock(embed_dims=64, num_heads=4, feedforward_channels=256) + assert block.ffn.embed_dims == 64 + assert block.attn.w_msa.num_heads == 4 + assert block.ffn.feedforward_channels == 256 + x = torch.randn(1, 56 * 56, 64) + x_out = block(x, (56, 56)) + assert x_out.shape == torch.Size([1, 56 * 56, 64]) + + # Test BasicBlock with checkpoint forward + block = SwinBlock( + embed_dims=64, num_heads=4, feedforward_channels=256, with_cp=True) + assert block.with_cp + x = torch.randn(1, 56 * 56, 64) + x_out = block(x, (56, 56)) + assert x_out.shape == torch.Size([1, 56 * 56, 64]) + + +def test_swin_transformer(): + """Test Swin Transformer backbone.""" + + with pytest.raises(TypeError): + # Pretrained arg must be str or None. + SwinTransformer(pretrained=123) + + with pytest.raises(AssertionError): + # Because swin uses non-overlapping patch embed, so the stride of patch + # embed must be equal to patch size. + SwinTransformer(strides=(2, 2, 2, 2), patch_size=4) + + # test pretrained image size + with pytest.raises(AssertionError): + SwinTransformer(pretrain_img_size=(224, 224, 224)) + + # Test absolute position embedding + temp = torch.randn((1, 3, 224, 224)) + model = SwinTransformer(pretrain_img_size=224, use_abs_pos_embed=True) + model.init_weights() + model(temp) + # Test different inputs when use absolute position embedding + temp = torch.randn((1, 3, 112, 112)) + model(temp) + temp = torch.randn((1, 3, 256, 256)) + model(temp) + + # Test patch norm + model = SwinTransformer(patch_norm=False) + model(temp) + + # Test normal inference + temp = torch.randn((1, 3, 32, 32)) + model = SwinTransformer() + outs = model(temp) + assert outs[0].shape == (1, 96, 8, 8) + assert outs[1].shape == (1, 192, 4, 4) + assert outs[2].shape == (1, 384, 2, 2) + assert outs[3].shape == (1, 768, 1, 1) + + # Test abnormal inference size + temp = torch.randn((1, 3, 31, 31)) + model = SwinTransformer() + outs = model(temp) + assert outs[0].shape == (1, 96, 8, 8) + assert outs[1].shape == (1, 192, 4, 4) + assert outs[2].shape == (1, 384, 2, 2) + assert outs[3].shape == (1, 768, 1, 1) + + # Test abnormal inference size + temp = torch.randn((1, 3, 112, 137)) + model = SwinTransformer() + outs = model(temp) + assert outs[0].shape == (1, 96, 28, 35) + assert outs[1].shape == (1, 192, 14, 18) + assert outs[2].shape == (1, 384, 7, 9) + assert outs[3].shape == (1, 768, 4, 5) + + model = SwinTransformer(frozen_stages=4) + model.train() + for p in model.parameters(): + assert not p.requires_grad diff --git a/tests/test_models/test_backbones/test_trident_resnet.py b/tests/test_models/test_backbones/test_trident_resnet.py new file mode 100644 index 0000000..a79b97e --- /dev/null +++ b/tests/test_models/test_backbones/test_trident_resnet.py @@ -0,0 +1,180 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch + +from mmdet.models.backbones import TridentResNet +from mmdet.models.backbones.trident_resnet import TridentBottleneck + + +def test_trident_resnet_bottleneck(): + trident_dilations = (1, 2, 3) + test_branch_idx = 1 + concat_output = True + trident_build_config = (trident_dilations, test_branch_idx, concat_output) + + with pytest.raises(AssertionError): + # Style must be in ['pytorch', 'caffe'] + TridentBottleneck( + *trident_build_config, inplanes=64, planes=64, style='tensorflow') + + with pytest.raises(AssertionError): + # Allowed positions are 'after_conv1', 'after_conv2', 'after_conv3' + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv4') + ] + TridentBottleneck( + *trident_build_config, inplanes=64, planes=16, plugins=plugins) + + with pytest.raises(AssertionError): + # Need to specify different postfix to avoid duplicate plugin name + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3'), + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3') + ] + TridentBottleneck( + *trident_build_config, inplanes=64, planes=16, plugins=plugins) + + with pytest.raises(KeyError): + # Plugin type is not supported + plugins = [dict(cfg=dict(type='WrongPlugin'), position='after_conv3')] + TridentBottleneck( + *trident_build_config, inplanes=64, planes=16, plugins=plugins) + + # Test Bottleneck with checkpoint forward + block = TridentBottleneck( + *trident_build_config, inplanes=64, planes=16, with_cp=True) + assert block.with_cp + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([block.num_branch, 64, 56, 56]) + + # Test Bottleneck style + block = TridentBottleneck( + *trident_build_config, + inplanes=64, + planes=64, + stride=2, + style='pytorch') + assert block.conv1.stride == (1, 1) + assert block.conv2.stride == (2, 2) + block = TridentBottleneck( + *trident_build_config, inplanes=64, planes=64, stride=2, style='caffe') + assert block.conv1.stride == (2, 2) + assert block.conv2.stride == (1, 1) + + # Test Bottleneck forward + block = TridentBottleneck(*trident_build_config, inplanes=64, planes=16) + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([block.num_branch, 64, 56, 56]) + + # Test Bottleneck with 1 ContextBlock after conv3 + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3') + ] + block = TridentBottleneck( + *trident_build_config, inplanes=64, planes=16, plugins=plugins) + assert block.context_block.in_channels == 64 + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([block.num_branch, 64, 56, 56]) + + # Test Bottleneck with 1 GeneralizedAttention after conv2 + plugins = [ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + position='after_conv2') + ] + block = TridentBottleneck( + *trident_build_config, inplanes=64, planes=16, plugins=plugins) + assert block.gen_attention_block.in_channels == 16 + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([block.num_branch, 64, 56, 56]) + + # Test Bottleneck with 1 GeneralizedAttention after conv2, 1 NonLocal2D + # after conv2, 1 ContextBlock after conv3 + plugins = [ + dict( + cfg=dict( + type='GeneralizedAttention', + spatial_range=-1, + num_heads=8, + attention_type='0010', + kv_stride=2), + position='after_conv2'), + dict(cfg=dict(type='NonLocal2d'), position='after_conv2'), + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16), + position='after_conv3') + ] + block = TridentBottleneck( + *trident_build_config, inplanes=64, planes=16, plugins=plugins) + assert block.gen_attention_block.in_channels == 16 + assert block.nonlocal_block.in_channels == 16 + assert block.context_block.in_channels == 64 + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([block.num_branch, 64, 56, 56]) + + # Test Bottleneck with 1 ContextBlock after conv2, 2 ContextBlock after + # conv3 + plugins = [ + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16, postfix=1), + position='after_conv2'), + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16, postfix=2), + position='after_conv3'), + dict( + cfg=dict(type='ContextBlock', ratio=1. / 16, postfix=3), + position='after_conv3') + ] + block = TridentBottleneck( + *trident_build_config, inplanes=64, planes=16, plugins=plugins) + assert block.context_block1.in_channels == 16 + assert block.context_block2.in_channels == 64 + assert block.context_block3.in_channels == 64 + x = torch.randn(1, 64, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size([block.num_branch, 64, 56, 56]) + + +def test_trident_resnet_backbone(): + tridentresnet_config = dict( + num_branch=3, + test_branch_idx=1, + strides=(1, 2, 2), + dilations=(1, 1, 1), + trident_dilations=(1, 2, 3), + out_indices=(2, ), + ) + """Test tridentresnet backbone.""" + with pytest.raises(AssertionError): + # TridentResNet depth should be in [50, 101, 152] + TridentResNet(18, **tridentresnet_config) + + with pytest.raises(AssertionError): + # In TridentResNet: num_stages == 3 + TridentResNet(50, num_stages=4, **tridentresnet_config) + + model = TridentResNet(50, num_stages=3, **tridentresnet_config) + model.train() + + imgs = torch.randn(1, 3, 32, 32) + feat = model(imgs) + assert len(feat) == 1 + assert feat[0].shape == torch.Size([3, 1024, 2, 2]) diff --git a/tests/test_models/test_backbones/utils.py b/tests/test_models/test_backbones/utils.py new file mode 100644 index 0000000..9baa994 --- /dev/null +++ b/tests/test_models/test_backbones/utils.py @@ -0,0 +1,32 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from torch.nn.modules import GroupNorm +from torch.nn.modules.batchnorm import _BatchNorm + +from mmdet.models.backbones.res2net import Bottle2neck +from mmdet.models.backbones.resnet import BasicBlock, Bottleneck +from mmdet.models.backbones.resnext import Bottleneck as BottleneckX +from mmdet.models.utils import SimplifiedBasicBlock + + +def is_block(modules): + """Check if is ResNet building block.""" + if isinstance(modules, (BasicBlock, Bottleneck, BottleneckX, Bottle2neck, + SimplifiedBasicBlock)): + return True + return False + + +def is_norm(modules): + """Check if is one of the norms.""" + if isinstance(modules, (GroupNorm, _BatchNorm)): + return True + return False + + +def check_norm_state(modules, train_state): + """Check if norm layer is in correct train state.""" + for mod in modules: + if isinstance(mod, _BatchNorm): + if mod.training != train_state: + return False + return True diff --git a/tests/test_models/test_dense_heads/test_anchor_head.py b/tests/test_models/test_dense_heads/test_anchor_head.py new file mode 100644 index 0000000..7414be3 --- /dev/null +++ b/tests/test_models/test_dense_heads/test_anchor_head.py @@ -0,0 +1,70 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch + +from mmdet.models.dense_heads import AnchorHead + + +def test_anchor_head_loss(): + """Tests anchor head loss when truth is empty and non-empty.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + + cfg = mmcv.Config( + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=0, + pos_weight=-1, + debug=False)) + self = AnchorHead(num_classes=4, in_channels=1, train_cfg=cfg) + + # Anchor head expects a multiple levels of features per image + feat = [ + torch.rand(1, 1, s // (2**(i + 2)), s // (2**(i + 2))) + for i in range(len(self.anchor_generator.strides)) + ] + cls_scores, bbox_preds = self.forward(feat) + + # Test that empty ground truth encourages the network to predict background + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + + gt_bboxes_ignore = None + empty_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + empty_cls_loss = sum(empty_gt_losses['loss_cls']) + empty_box_loss = sum(empty_gt_losses['loss_bbox']) + assert empty_cls_loss.item() > 0, 'cls loss should be non-zero' + assert empty_box_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + one_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + onegt_cls_loss = sum(one_gt_losses['loss_cls']) + onegt_box_loss = sum(one_gt_losses['loss_bbox']) + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_box_loss.item() > 0, 'box loss should be non-zero' diff --git a/tests/test_models/test_dense_heads/test_ascend_head.py b/tests/test_models/test_dense_heads/test_ascend_head.py new file mode 100644 index 0000000..843a55f --- /dev/null +++ b/tests/test_models/test_dense_heads/test_ascend_head.py @@ -0,0 +1,215 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch + +from mmdet.models.dense_heads import (AscendAnchorHead, AscendRetinaHead, + AscendSSDHead) + + +def test_ascend_anchor_head_loss(): + """Tests AscendAnchorHead loss when truth is empty and non-empty.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + + cfg = mmcv.Config( + dict( + assigner=dict( + type='AscendMaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False)) + self = AscendAnchorHead(num_classes=4, in_channels=1, train_cfg=cfg) + + # Anchor head expects a multiple levels of features per image + feat = [ + torch.rand(1, 1, s // (2**(i + 2)), s // (2**(i + 2))) + for i in range(len(self.prior_generator.strides)) + ] + cls_scores, bbox_preds = self.forward(feat) + + # Test that empty ground truth encourages the network to predict background + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + + gt_bboxes_ignore = None + empty_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + empty_cls_loss = sum(empty_gt_losses['loss_cls']) + empty_box_loss = sum(empty_gt_losses['loss_bbox']) + assert empty_cls_loss.item() > 0, 'cls loss should be non-zero' + assert empty_box_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + one_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + onegt_cls_loss = sum(one_gt_losses['loss_cls']) + onegt_box_loss = sum(one_gt_losses['loss_bbox']) + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_box_loss.item() > 0, 'box loss should be non-zero' + + +def test_ascend_retina_head_loss(): + """Tests AscendRetinaHead loss when truth is empty and non-empty.""" + img_shape = (800, 1067, 3) + pad_shape = (800, 1088, 3) + num_classes = 80 + in_channels = 256 + + img_metas = [{ + 'img_shape': img_shape, + 'scale_factor': 1, + 'pad_shape': pad_shape + }] + + cfg = mmcv.Config( + dict( + assigner=dict( + type='AscendMaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False)) + self = AscendRetinaHead( + num_classes=num_classes, in_channels=in_channels, train_cfg=cfg) + + # Anchor head expects a multiple levels of features per image + feat = [ + torch.rand(1, in_channels, pad_shape[0] // strides[0], + pad_shape[1] // strides[1]) + for strides in self.prior_generator.strides + ] + cls_scores, bbox_preds = self.forward(feat) + + # Test that empty ground truth encourages the network to predict background + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + + gt_bboxes_ignore = None + empty_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + empty_cls_loss = sum(empty_gt_losses['loss_cls']) + empty_box_loss = sum(empty_gt_losses['loss_bbox']) + assert empty_cls_loss.item() > 0, 'cls loss should be non-zero' + assert empty_box_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + one_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + onegt_cls_loss = sum(one_gt_losses['loss_cls']) + onegt_box_loss = sum(one_gt_losses['loss_bbox']) + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_box_loss.item() > 0, 'box loss should be non-zero' + + +def test_ascend_ssd_head_loss(): + """Tests anchor head loss when truth is empty and non-empty.""" + img_shape = (320, 320, 3) + pad_shape = (320, 320, 3) + in_channels = (96, 1280, 512, 256, 256, 128) + img_metas = [{ + 'img_shape': img_shape, + 'scale_factor': 1, + 'pad_shape': pad_shape + }, { + 'img_shape': img_shape, + 'scale_factor': 1, + 'pad_shape': pad_shape + }] + + self = AscendSSDHead( + in_channels=in_channels, + num_classes=80, + use_depthwise=True, + norm_cfg=dict(type='BN', eps=0.001, momentum=0.03), + act_cfg=dict(type='ReLU6'), + init_cfg=dict(type='Normal', layer='Conv2d', std=0.001), + anchor_generator=dict( + type='SSDAnchorGenerator', + scale_major=False, + strides=[16, 32, 64, 107, 160, 320], + ratios=[[2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3]], + min_sizes=[48, 100, 150, 202, 253, 304], + max_sizes=[100, 150, 202, 253, 304, 320]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + train_cfg=mmcv.Config( + dict( + assigner=dict( + type='AscendMaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0., + ignore_iof_thr=-1, + gt_max_assign_all=False), + smoothl1_beta=1., + allowed_border=-1, + pos_weight=-1, + neg_pos_ratio=3, + debug=False))) + + # Anchor head expects a multiple levels of features per image + feat = [ + torch.rand(2, in_channels[i], + round(pad_shape[0] / self.prior_generator.strides[i][0]), + round(pad_shape[1] / self.prior_generator.strides[i][1])) + for i in range(len(self.prior_generator.strides)) + ] + cls_scores, bbox_preds = self.forward(feat) + + # Test that empty ground truth encourages the network to predict background + gt_bboxes = [torch.empty((0, 4)), torch.empty((0, 4))] + gt_labels = [torch.LongTensor([]), torch.LongTensor([])] + + gt_bboxes_ignore = None + empty_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + empty_cls_loss = sum(empty_gt_losses['loss_cls']) + empty_box_loss = sum(empty_gt_losses['loss_bbox']) + assert empty_cls_loss.item() >= 0, 'cls loss should be non-zero' + assert empty_box_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2]), torch.LongTensor([2])] + one_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + onegt_cls_loss = sum(one_gt_losses['loss_cls']) + onegt_box_loss = sum(one_gt_losses['loss_bbox']) + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_box_loss.item() > 0, 'box loss should be non-zero' diff --git a/tests/test_models/test_dense_heads/test_atss_head.py b/tests/test_models/test_dense_heads/test_atss_head.py new file mode 100644 index 0000000..18597f4 --- /dev/null +++ b/tests/test_models/test_dense_heads/test_atss_head.py @@ -0,0 +1,77 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch + +from mmdet.models.dense_heads import ATSSHead + + +def test_atss_head_loss(): + """Tests atss head loss when truth is empty and non-empty.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + train_cfg = mmcv.Config( + dict( + assigner=dict(type='ATSSAssigner', topk=9), + allowed_border=-1, + pos_weight=-1, + debug=False)) + self = ATSSHead( + num_classes=4, + in_channels=1, + train_cfg=train_cfg, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=2.0)) + feat = [ + torch.rand(1, 1, s // feat_size, s // feat_size) + for feat_size in [4, 8, 16, 32, 64] + ] + cls_scores, bbox_preds, centernesses = self.forward(feat) + + # Test that empty ground truth encourages the network to predict background + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + gt_bboxes_ignore = None + empty_gt_losses = self.loss(cls_scores, bbox_preds, centernesses, + gt_bboxes, gt_labels, img_metas, + gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + empty_cls_loss = sum(empty_gt_losses['loss_cls']) + empty_box_loss = sum(empty_gt_losses['loss_bbox']) + empty_centerness_loss = sum(empty_gt_losses['loss_centerness']) + assert empty_cls_loss.item() > 0, 'cls loss should be non-zero' + assert empty_box_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + assert empty_centerness_loss.item() == 0, ( + 'there should be no centerness loss when there are no true boxes') + + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + one_gt_losses = self.loss(cls_scores, bbox_preds, centernesses, gt_bboxes, + gt_labels, img_metas, gt_bboxes_ignore) + onegt_cls_loss = sum(one_gt_losses['loss_cls']) + onegt_box_loss = sum(one_gt_losses['loss_bbox']) + onegt_centerness_loss = sum(one_gt_losses['loss_centerness']) + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_box_loss.item() > 0, 'box loss should be non-zero' + assert onegt_centerness_loss.item() > 0, ( + 'centerness loss should be non-zero') diff --git a/tests/test_models/test_dense_heads/test_autoassign_head.py b/tests/test_models/test_dense_heads/test_autoassign_head.py new file mode 100644 index 0000000..3c8491f --- /dev/null +++ b/tests/test_models/test_dense_heads/test_autoassign_head.py @@ -0,0 +1,91 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch + +from mmdet.models.dense_heads.autoassign_head import AutoAssignHead +from mmdet.models.dense_heads.paa_head import levels_to_images + + +def test_autoassign_head_loss(): + """Tests autoassign head loss when truth is empty and non-empty.""" + + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + train_cfg = mmcv.Config( + dict(assigner=None, allowed_border=-1, pos_weight=-1, debug=False)) + self = AutoAssignHead( + num_classes=4, + in_channels=1, + train_cfg=train_cfg, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=1.3)) + feat = [ + torch.rand(1, 1, s // feat_size, s // feat_size) + for feat_size in [4, 8, 16, 32, 64] + ] + self.init_weights() + cls_scores, bbox_preds, objectnesses = self(feat) + # Test that empty ground truth encourages the network to predict background + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + gt_bboxes_ignore = None + empty_gt_losses = self.loss(cls_scores, bbox_preds, objectnesses, + gt_bboxes, gt_labels, img_metas, + gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + empty_pos_loss = empty_gt_losses['loss_pos'] + empty_neg_loss = empty_gt_losses['loss_neg'] + empty_center_loss = empty_gt_losses['loss_center'] + assert empty_neg_loss.item() > 0, 'cls loss should be non-zero' + assert empty_pos_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + assert empty_center_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + one_gt_losses = self.loss(cls_scores, bbox_preds, objectnesses, gt_bboxes, + gt_labels, img_metas, gt_bboxes_ignore) + onegt_pos_loss = one_gt_losses['loss_pos'] + onegt_neg_loss = one_gt_losses['loss_neg'] + onegt_center_loss = one_gt_losses['loss_center'] + assert onegt_pos_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_neg_loss.item() > 0, 'box loss should be non-zero' + assert onegt_center_loss.item() > 0, 'box loss should be non-zero' + n, c, h, w = 10, 4, 20, 20 + mlvl_tensor = [torch.ones(n, c, h, w) for i in range(5)] + results = levels_to_images(mlvl_tensor) + assert len(results) == n + assert results[0].size() == (h * w * 5, c) + + self = AutoAssignHead( + num_classes=4, + in_channels=1, + train_cfg=train_cfg, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=1.3), + strides=(4, )) + cls_scores = [torch.ones(2, 4, 5, 5)] + bbox_preds = [torch.ones(2, 4, 5, 5)] + iou_preds = [torch.ones(2, 1, 5, 5)] + cfg = mmcv.Config( + dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) + rescale = False + self.get_bboxes( + cls_scores, bbox_preds, iou_preds, img_metas, cfg, rescale=rescale) diff --git a/tests/test_models/test_dense_heads/test_centernet_head.py b/tests/test_models/test_dense_heads/test_centernet_head.py new file mode 100644 index 0000000..8993a48 --- /dev/null +++ b/tests/test_models/test_dense_heads/test_centernet_head.py @@ -0,0 +1,107 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import torch +from mmcv import ConfigDict + +from mmdet.models.dense_heads import CenterNetHead + + +def test_center_head_loss(): + """Tests center head loss when truth is empty and non-empty.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + test_cfg = dict(topK=100, max_per_img=100) + self = CenterNetHead( + num_classes=4, in_channel=1, feat_channel=4, test_cfg=test_cfg) + + feat = [torch.rand(1, 1, s, s)] + center_out, wh_out, offset_out = self.forward(feat) + # Test that empty ground truth encourages the network to predict background + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + + gt_bboxes_ignore = None + empty_gt_losses = self.loss(center_out, wh_out, offset_out, gt_bboxes, + gt_labels, img_metas, gt_bboxes_ignore) + loss_center = empty_gt_losses['loss_center_heatmap'] + loss_wh = empty_gt_losses['loss_wh'] + loss_offset = empty_gt_losses['loss_offset'] + assert loss_center.item() > 0, 'loss_center should be non-zero' + assert loss_wh.item() == 0, ( + 'there should be no loss_wh when there are no true boxes') + assert loss_offset.item() == 0, ( + 'there should be no loss_offset when there are no true boxes') + + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + one_gt_losses = self.loss(center_out, wh_out, offset_out, gt_bboxes, + gt_labels, img_metas, gt_bboxes_ignore) + loss_center = one_gt_losses['loss_center_heatmap'] + loss_wh = one_gt_losses['loss_wh'] + loss_offset = one_gt_losses['loss_offset'] + assert loss_center.item() > 0, 'loss_center should be non-zero' + assert loss_wh.item() > 0, 'loss_wh should be non-zero' + assert loss_offset.item() > 0, 'loss_offset should be non-zero' + + +def test_centernet_head_get_bboxes(): + """Tests center head generating and decoding the heatmap.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': np.array([1., 1., 1., 1.]), + 'pad_shape': (s, s, 3), + 'batch_input_shape': (s, s), + 'border': (0, 0, 0, 0), + 'flip': False + }] + test_cfg = ConfigDict( + dict(topk=100, local_maximum_kernel=3, max_per_img=100)) + gt_bboxes = [ + torch.Tensor([[10, 20, 200, 240], [40, 50, 100, 200], + [10, 20, 100, 240]]) + ] + gt_labels = [torch.LongTensor([1, 1, 2])] + + self = CenterNetHead( + num_classes=4, in_channel=1, feat_channel=4, test_cfg=test_cfg) + self.feat_shape = (1, 1, s // 4, s // 4) + targets, _ = self.get_targets(gt_bboxes, gt_labels, self.feat_shape, + img_metas[0]['pad_shape']) + center_target = targets['center_heatmap_target'] + wh_target = targets['wh_target'] + offset_target = targets['offset_target'] + # make sure assign target right + for i in range(len(gt_bboxes[0])): + bbox, label = gt_bboxes[0][i] / 4, gt_labels[0][i] + ctx, cty = sum(bbox[0::2]) / 2, sum(bbox[1::2]) / 2 + int_ctx, int_cty = int(sum(bbox[0::2]) / 2), int(sum(bbox[1::2]) / 2) + w, h = bbox[2] - bbox[0], bbox[3] - bbox[1] + x_off = ctx - int(ctx) + y_off = cty - int(cty) + assert center_target[0, label, int_cty, int_ctx] == 1 + assert wh_target[0, 0, int_cty, int_ctx] == w + assert wh_target[0, 1, int_cty, int_ctx] == h + assert offset_target[0, 0, int_cty, int_ctx] == x_off + assert offset_target[0, 1, int_cty, int_ctx] == y_off + # make sure get_bboxes is right + detections = self.get_bboxes([center_target], [wh_target], [offset_target], + img_metas, + rescale=True, + with_nms=False) + out_bboxes = detections[0][0][:3] + out_clses = detections[0][1][:3] + for bbox, cls in zip(out_bboxes, out_clses): + flag = False + for gt_bbox, gt_cls in zip(gt_bboxes[0], gt_labels[0]): + if (bbox[:4] == gt_bbox[:4]).all(): + flag = True + assert flag, 'get_bboxes is wrong' diff --git a/tests/test_models/test_dense_heads/test_corner_head.py b/tests/test_models/test_dense_heads/test_corner_head.py new file mode 100644 index 0000000..0b549ff --- /dev/null +++ b/tests/test_models/test_dense_heads/test_corner_head.py @@ -0,0 +1,167 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from mmdet.core.evaluation.bbox_overlaps import bbox_overlaps +from mmdet.models.dense_heads import CornerHead + + +def test_corner_head_loss(): + """Tests corner head loss when truth is empty and non-empty.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + + self = CornerHead(num_classes=4, in_channels=1) + + # Corner head expects a multiple levels of features per image + feat = [ + torch.rand(1, 1, s // 4, s // 4) for _ in range(self.num_feat_levels) + ] + tl_heats, br_heats, tl_embs, br_embs, tl_offs, br_offs = self.forward(feat) + + # Test that empty ground truth encourages the network to predict background + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + + gt_bboxes_ignore = None + empty_gt_losses = self.loss(tl_heats, br_heats, tl_embs, br_embs, tl_offs, + br_offs, gt_bboxes, gt_labels, img_metas, + gt_bboxes_ignore) + empty_det_loss = sum(empty_gt_losses['det_loss']) + empty_push_loss = sum(empty_gt_losses['push_loss']) + empty_pull_loss = sum(empty_gt_losses['pull_loss']) + empty_off_loss = sum(empty_gt_losses['off_loss']) + assert empty_det_loss.item() > 0, 'det loss should be non-zero' + assert empty_push_loss.item() == 0, ( + 'there should be no push loss when there are no true boxes') + assert empty_pull_loss.item() == 0, ( + 'there should be no pull loss when there are no true boxes') + assert empty_off_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + one_gt_losses = self.loss(tl_heats, br_heats, tl_embs, br_embs, tl_offs, + br_offs, gt_bboxes, gt_labels, img_metas, + gt_bboxes_ignore) + onegt_det_loss = sum(one_gt_losses['det_loss']) + onegt_push_loss = sum(one_gt_losses['push_loss']) + onegt_pull_loss = sum(one_gt_losses['pull_loss']) + onegt_off_loss = sum(one_gt_losses['off_loss']) + assert onegt_det_loss.item() > 0, 'det loss should be non-zero' + assert onegt_push_loss.item() == 0, ( + 'there should be no push loss when there are only one true box') + assert onegt_pull_loss.item() > 0, 'pull loss should be non-zero' + assert onegt_off_loss.item() > 0, 'off loss should be non-zero' + + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874], + [123.6667, 123.8757, 138.6326, 251.8874]]), + ] + gt_labels = [torch.LongTensor([2, 3])] + + # equalize the corners' embedding value of different objects to make the + # push_loss larger than 0 + gt_bboxes_ind = (gt_bboxes[0] // 4).int().tolist() + for tl_emb_feat, br_emb_feat in zip(tl_embs, br_embs): + tl_emb_feat[:, :, gt_bboxes_ind[0][1], + gt_bboxes_ind[0][0]] = tl_emb_feat[:, :, + gt_bboxes_ind[1][1], + gt_bboxes_ind[1][0]] + br_emb_feat[:, :, gt_bboxes_ind[0][3], + gt_bboxes_ind[0][2]] = br_emb_feat[:, :, + gt_bboxes_ind[1][3], + gt_bboxes_ind[1][2]] + + two_gt_losses = self.loss(tl_heats, br_heats, tl_embs, br_embs, tl_offs, + br_offs, gt_bboxes, gt_labels, img_metas, + gt_bboxes_ignore) + twogt_det_loss = sum(two_gt_losses['det_loss']) + twogt_push_loss = sum(two_gt_losses['push_loss']) + twogt_pull_loss = sum(two_gt_losses['pull_loss']) + twogt_off_loss = sum(two_gt_losses['off_loss']) + assert twogt_det_loss.item() > 0, 'det loss should be non-zero' + assert twogt_push_loss.item() > 0, 'push loss should be non-zero' + assert twogt_pull_loss.item() > 0, 'pull loss should be non-zero' + assert twogt_off_loss.item() > 0, 'off loss should be non-zero' + + +def test_corner_head_encode_and_decode_heatmap(): + """Tests corner head generating and decoding the heatmap.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3), + 'border': (0, 0, 0, 0) + }] + + gt_bboxes = [ + torch.Tensor([[10, 20, 200, 240], [40, 50, 100, 200], + [10, 20, 200, 240]]) + ] + gt_labels = [torch.LongTensor([1, 1, 2])] + + self = CornerHead(num_classes=4, in_channels=1, corner_emb_channels=1) + + feat = [ + torch.rand(1, 1, s // 4, s // 4) for _ in range(self.num_feat_levels) + ] + + targets = self.get_targets( + gt_bboxes, + gt_labels, + feat[0].shape, + img_metas[0]['pad_shape'], + with_corner_emb=self.with_corner_emb) + + gt_tl_heatmap = targets['topleft_heatmap'] + gt_br_heatmap = targets['bottomright_heatmap'] + gt_tl_offset = targets['topleft_offset'] + gt_br_offset = targets['bottomright_offset'] + embedding = targets['corner_embedding'] + [top, left], [bottom, right] = embedding[0][0] + gt_tl_embedding_heatmap = torch.zeros([1, 1, s // 4, s // 4]) + gt_br_embedding_heatmap = torch.zeros([1, 1, s // 4, s // 4]) + gt_tl_embedding_heatmap[0, 0, top, left] = 1 + gt_br_embedding_heatmap[0, 0, bottom, right] = 1 + + batch_bboxes, batch_scores, batch_clses = self.decode_heatmap( + tl_heat=gt_tl_heatmap, + br_heat=gt_br_heatmap, + tl_off=gt_tl_offset, + br_off=gt_br_offset, + tl_emb=gt_tl_embedding_heatmap, + br_emb=gt_br_embedding_heatmap, + img_meta=img_metas[0], + k=100, + kernel=3, + distance_threshold=0.5) + + bboxes = batch_bboxes.view(-1, 4) + scores = batch_scores.view(-1, 1) + clses = batch_clses.view(-1, 1) + + idx = scores.argsort(dim=0, descending=True) + bboxes = bboxes[idx].view(-1, 4) + scores = scores[idx].view(-1) + clses = clses[idx].view(-1) + + valid_bboxes = bboxes[torch.where(scores > 0.05)] + valid_labels = clses[torch.where(scores > 0.05)] + max_coordinate = valid_bboxes.max() + offsets = valid_labels.to(valid_bboxes) * (max_coordinate + 1) + gt_offsets = gt_labels[0].to(gt_bboxes[0]) * (max_coordinate + 1) + + offset_bboxes = valid_bboxes + offsets[:, None] + offset_gtbboxes = gt_bboxes[0] + gt_offsets[:, None] + + iou_matrix = bbox_overlaps(offset_bboxes.numpy(), offset_gtbboxes.numpy()) + assert (iou_matrix == 1).sum() == 3 diff --git a/tests/test_models/test_dense_heads/test_ddod_head.py b/tests/test_models/test_dense_heads/test_ddod_head.py new file mode 100644 index 0000000..c9e658e --- /dev/null +++ b/tests/test_models/test_dense_heads/test_ddod_head.py @@ -0,0 +1,72 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch + +from mmdet.models.dense_heads import DDODHead + + +def test_ddod_head_loss(): + """Tests ddod head loss when truth is empty and non-empty.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + train_cfg = mmcv.Config( + dict( # ATSSAssigner + assigner=dict(type='ATSSAssigner', topk=9, alpha=0.8), + reg_assigner=dict(type='ATSSAssigner', topk=9, alpha=0.5), + allowed_border=-1, + pos_weight=-1, + debug=False)) + self = DDODHead( + num_classes=4, + in_channels=1, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + train_cfg=train_cfg, + norm_cfg=dict(type='GN', num_groups=32, requires_grad=True), + loss_iou=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)) + feat = [ + torch.rand(1, 1, s // feat_size, s // feat_size) + for feat_size in [4, 8, 16, 32, 64] + ] + cls_scores, bbox_preds, iou_preds = self.forward(feat) + + # Test that empty ground truth encourages the network to predict background + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + gt_bboxes_ignore = None + empty_gt_losses = self.loss(cls_scores, bbox_preds, iou_preds, gt_bboxes, + gt_labels, img_metas, gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + empty_cls_loss = sum(empty_gt_losses['loss_cls']) + empty_box_loss = sum(empty_gt_losses['loss_bbox']) + empty_iou_loss = sum(empty_gt_losses['loss_iou']) + assert empty_cls_loss.item() > 0, 'cls loss should be non-zero' + assert empty_box_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + assert empty_iou_loss.item() == 0, ( + 'there should be no iou loss when there are no true boxes') + + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + one_gt_losses = self.loss(cls_scores, bbox_preds, iou_preds, gt_bboxes, + gt_labels, img_metas, gt_bboxes_ignore) + onegt_cls_loss = sum(one_gt_losses['loss_cls']) + onegt_box_loss = sum(one_gt_losses['loss_bbox']) + onegt_iou_loss = sum(one_gt_losses['loss_iou']) + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_box_loss.item() > 0, 'box loss should be non-zero' + assert onegt_iou_loss.item() > 0, 'iou loss should be non-zero' diff --git a/tests/test_models/test_dense_heads/test_dense_heads_attr.py b/tests/test_models/test_dense_heads/test_dense_heads_attr.py new file mode 100644 index 0000000..d4a57de --- /dev/null +++ b/tests/test_models/test_dense_heads/test_dense_heads_attr.py @@ -0,0 +1,44 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import warnings + +from terminaltables import AsciiTable + +from mmdet.models import dense_heads +from mmdet.models.dense_heads import * # noqa: F401,F403 + + +def test_dense_heads_test_attr(): + """Tests inference methods such as simple_test and aug_test.""" + # make list of dense heads + exceptions = ['FeatureAdaption'] # module used in head + all_dense_heads = [m for m in dense_heads.__all__ if m not in exceptions] + + # search attributes + check_attributes = [ + 'simple_test', 'aug_test', 'simple_test_bboxes', 'simple_test_rpn', + 'aug_test_rpn' + ] + table_header = ['head name'] + check_attributes + table_data = [table_header] + not_found = {k: [] for k in check_attributes} + for target_head_name in all_dense_heads: + target_head = globals()[target_head_name] + target_head_attributes = dir(target_head) + check_results = [target_head_name] + for check_attribute in check_attributes: + found = check_attribute in target_head_attributes + check_results.append(found) + if not found: + not_found[check_attribute].append(target_head_name) + table_data.append(check_results) + table = AsciiTable(table_data) + print() + print(table.table) + + # NOTE: this test just checks attributes. + # simple_test of RPN heads will not work now. + assert len(not_found['simple_test']) == 0, \ + f'simple_test not found in {not_found["simple_test"]}' + if len(not_found['aug_test']) != 0: + warnings.warn(f'aug_test not found in {not_found["aug_test"]}. ' + 'Please implement it or raise NotImplementedError.') diff --git a/tests/test_models/test_dense_heads/test_detr_head.py b/tests/test_models/test_dense_heads/test_detr_head.py new file mode 100644 index 0000000..cc2da23 --- /dev/null +++ b/tests/test_models/test_dense_heads/test_detr_head.py @@ -0,0 +1,104 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +from mmcv import ConfigDict + +from mmdet.models.dense_heads import DETRHead + + +def test_detr_head_loss(): + """Tests transformer head loss when truth is empty and non-empty.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3), + 'batch_input_shape': (s, s) + }] + config = ConfigDict( + dict( + type='DETRHead', + num_classes=80, + in_channels=200, + transformer=dict( + type='Transformer', + encoder=dict( + type='DetrTransformerEncoder', + num_layers=6, + transformerlayers=dict( + type='BaseTransformerLayer', + attn_cfgs=[ + dict( + type='MultiheadAttention', + embed_dims=256, + num_heads=8, + dropout=0.1) + ], + feedforward_channels=2048, + ffn_dropout=0.1, + operation_order=('self_attn', 'norm', 'ffn', 'norm'))), + decoder=dict( + type='DetrTransformerDecoder', + return_intermediate=True, + num_layers=6, + transformerlayers=dict( + type='DetrTransformerDecoderLayer', + attn_cfgs=dict( + type='MultiheadAttention', + embed_dims=256, + num_heads=8, + dropout=0.1), + feedforward_channels=2048, + ffn_dropout=0.1, + operation_order=('self_attn', 'norm', 'cross_attn', + 'norm', 'ffn', 'norm')), + )), + positional_encoding=dict( + type='SinePositionalEncoding', num_feats=128, normalize=True), + loss_cls=dict( + type='CrossEntropyLoss', + bg_cls_weight=0.1, + use_sigmoid=False, + loss_weight=1.0, + class_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=5.0), + loss_iou=dict(type='GIoULoss', loss_weight=2.0))) + + self = DETRHead(**config) + self.init_weights() + feat = [torch.rand(1, 200, 10, 10)] + cls_scores, bbox_preds = self.forward(feat, img_metas) + # Test that empty ground truth encourages the network to predict background + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + gt_bboxes_ignore = None + empty_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + for key, loss in empty_gt_losses.items(): + if 'cls' in key: + assert loss.item() > 0, 'cls loss should be non-zero' + elif 'bbox' in key: + assert loss.item( + ) == 0, 'there should be no box loss when there are no true boxes' + elif 'iou' in key: + assert loss.item( + ) == 0, 'there should be no iou loss when there are no true boxes' + + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + one_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + for loss in one_gt_losses.values(): + assert loss.item( + ) > 0, 'cls loss, or box loss, or iou loss should be non-zero' + + # test forward_train + self.forward_train(feat, img_metas, gt_bboxes, gt_labels) + + # test inference mode + self.get_bboxes(cls_scores, bbox_preds, img_metas, rescale=True) diff --git a/tests/test_models/test_dense_heads/test_fcos_head.py b/tests/test_models/test_dense_heads/test_fcos_head.py new file mode 100644 index 0000000..5fbe14f --- /dev/null +++ b/tests/test_models/test_dense_heads/test_fcos_head.py @@ -0,0 +1,64 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch + +from mmdet.models.dense_heads import FCOSHead + + +def test_fcos_head_loss(): + """Tests fcos head loss when truth is empty and non-empty.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + train_cfg = mmcv.Config( + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False)) + # since Focal Loss is not supported on CPU + self = FCOSHead( + num_classes=4, + in_channels=1, + train_cfg=train_cfg, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)) + feat = [ + torch.rand(1, 1, s // feat_size, s // feat_size) + for feat_size in [4, 8, 16, 32, 64] + ] + cls_scores, bbox_preds, centerness = self.forward(feat) + # Test that empty ground truth encourages the network to predict background + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + gt_bboxes_ignore = None + empty_gt_losses = self.loss(cls_scores, bbox_preds, centerness, gt_bboxes, + gt_labels, img_metas, gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + empty_cls_loss = empty_gt_losses['loss_cls'] + empty_box_loss = empty_gt_losses['loss_bbox'] + assert empty_cls_loss.item() > 0, 'cls loss should be non-zero' + assert empty_box_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + one_gt_losses = self.loss(cls_scores, bbox_preds, centerness, gt_bboxes, + gt_labels, img_metas, gt_bboxes_ignore) + onegt_cls_loss = one_gt_losses['loss_cls'] + onegt_box_loss = one_gt_losses['loss_bbox'] + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_box_loss.item() > 0, 'box loss should be non-zero' diff --git a/tests/test_models/test_dense_heads/test_fsaf_head.py b/tests/test_models/test_dense_heads/test_fsaf_head.py new file mode 100644 index 0000000..7851055 --- /dev/null +++ b/tests/test_models/test_dense_heads/test_fsaf_head.py @@ -0,0 +1,82 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch + +from mmdet.models.dense_heads import FSAFHead + + +def test_fsaf_head_loss(): + """Tests anchor head loss when truth is empty and non-empty.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + + cfg = dict( + reg_decoded_bbox=True, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=1, + scales_per_octave=1, + ratios=[1.0], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict(type='TBLRBBoxCoder', normalizer=4.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0, + reduction='none'), + loss_bbox=dict( + type='IoULoss', eps=1e-6, loss_weight=1.0, reduction='none')) + + train_cfg = mmcv.Config( + dict( + assigner=dict( + type='CenterRegionAssigner', + pos_scale=0.2, + neg_scale=0.2, + min_pos_iof=0.01), + allowed_border=-1, + pos_weight=-1, + debug=False)) + head = FSAFHead(num_classes=4, in_channels=1, train_cfg=train_cfg, **cfg) + if torch.cuda.is_available(): + head.cuda() + # FSAF head expects a multiple levels of features per image + feat = [ + torch.rand(1, 1, s // (2**(i + 2)), s // (2**(i + 2))).cuda() + for i in range(len(head.anchor_generator.strides)) + ] + cls_scores, bbox_preds = head.forward(feat) + gt_bboxes_ignore = None + + # When truth is non-empty then both cls and box loss should be nonzero + # for random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]).cuda(), + ] + gt_labels = [torch.LongTensor([2]).cuda()] + one_gt_losses = head.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + onegt_cls_loss = sum(one_gt_losses['loss_cls']) + onegt_box_loss = sum(one_gt_losses['loss_bbox']) + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_box_loss.item() > 0, 'box loss should be non-zero' + + # Test that empty ground truth encourages the network to predict bkg + gt_bboxes = [torch.empty((0, 4)).cuda()] + gt_labels = [torch.LongTensor([]).cuda()] + + empty_gt_losses = head.loss(cls_scores, bbox_preds, gt_bboxes, + gt_labels, img_metas, gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there + # should be no box loss. + empty_cls_loss = sum(empty_gt_losses['loss_cls']) + empty_box_loss = sum(empty_gt_losses['loss_bbox']) + assert empty_cls_loss.item() > 0, 'cls loss should be non-zero' + assert empty_box_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') diff --git a/tests/test_models/test_dense_heads/test_ga_anchor_head.py b/tests/test_models/test_dense_heads/test_ga_anchor_head.py new file mode 100644 index 0000000..374f71b --- /dev/null +++ b/tests/test_models/test_dense_heads/test_ga_anchor_head.py @@ -0,0 +1,91 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch + +from mmdet.models.dense_heads import GuidedAnchorHead + + +def test_ga_anchor_head_loss(): + """Tests anchor head loss when truth is empty and non-empty.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + + cfg = mmcv.Config( + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + ga_assigner=dict( + type='ApproxMaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + ignore_iof_thr=-1), + ga_sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + allowed_border=-1, + center_ratio=0.2, + ignore_ratio=0.5, + pos_weight=-1, + debug=False)) + head = GuidedAnchorHead(num_classes=4, in_channels=4, train_cfg=cfg) + + # Anchor head expects a multiple levels of features per image + if torch.cuda.is_available(): + head.cuda() + feat = [ + torch.rand(1, 4, s // (2**(i + 2)), s // (2**(i + 2))).cuda() + for i in range(len(head.approx_anchor_generator.base_anchors)) + ] + cls_scores, bbox_preds, shape_preds, loc_preds = head.forward(feat) + + # Test that empty ground truth encourages the network to predict + # background + gt_bboxes = [torch.empty((0, 4)).cuda()] + gt_labels = [torch.LongTensor([]).cuda()] + + gt_bboxes_ignore = None + + empty_gt_losses = head.loss(cls_scores, bbox_preds, shape_preds, + loc_preds, gt_bboxes, gt_labels, img_metas, + gt_bboxes_ignore) + + # When there is no truth, the cls loss should be nonzero but there + # should be no box loss. + empty_cls_loss = sum(empty_gt_losses['loss_cls']) + empty_box_loss = sum(empty_gt_losses['loss_bbox']) + assert empty_cls_loss.item() > 0, 'cls loss should be non-zero' + assert empty_box_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + + # When truth is non-empty then both cls and box loss should be nonzero + # for random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]).cuda(), + ] + gt_labels = [torch.LongTensor([2]).cuda()] + one_gt_losses = head.loss(cls_scores, bbox_preds, shape_preds, + loc_preds, gt_bboxes, gt_labels, img_metas, + gt_bboxes_ignore) + onegt_cls_loss = sum(one_gt_losses['loss_cls']) + onegt_box_loss = sum(one_gt_losses['loss_bbox']) + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_box_loss.item() > 0, 'box loss should be non-zero' diff --git a/tests/test_models/test_dense_heads/test_gfl_head.py b/tests/test_models/test_dense_heads/test_gfl_head.py new file mode 100644 index 0000000..6c522fa --- /dev/null +++ b/tests/test_models/test_dense_heads/test_gfl_head.py @@ -0,0 +1,74 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch + +from mmdet.models.dense_heads import GFLHead + + +def test_gfl_head_loss(): + """Tests gfl head loss when truth is empty and non-empty.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + train_cfg = mmcv.Config( + dict( + assigner=dict(type='ATSSAssigner', topk=9), + allowed_border=-1, + pos_weight=-1, + debug=False)) + self = GFLHead( + num_classes=4, + in_channels=1, + train_cfg=train_cfg, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + loss_cls=dict( + type='QualityFocalLoss', + use_sigmoid=True, + beta=2.0, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=2.0)) + feat = [ + torch.rand(1, 1, s // feat_size, s // feat_size) + for feat_size in [4, 8, 16, 32, 64] + ] + cls_scores, bbox_preds = self.forward(feat) + + # Test that empty ground truth encourages the network to predict background + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + gt_bboxes_ignore = None + empty_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + empty_cls_loss = sum(empty_gt_losses['loss_cls']) + empty_box_loss = sum(empty_gt_losses['loss_bbox']) + empty_dfl_loss = sum(empty_gt_losses['loss_dfl']) + assert empty_cls_loss.item() > 0, 'cls loss should be non-zero' + assert empty_box_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + assert empty_dfl_loss.item() == 0, ( + 'there should be no dfl loss when there are no true boxes') + + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + one_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + onegt_cls_loss = sum(one_gt_losses['loss_cls']) + onegt_box_loss = sum(one_gt_losses['loss_bbox']) + onegt_dfl_loss = sum(one_gt_losses['loss_dfl']) + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_box_loss.item() > 0, 'box loss should be non-zero' + assert onegt_dfl_loss.item() > 0, 'dfl loss should be non-zero' diff --git a/tests/test_models/test_dense_heads/test_lad_head.py b/tests/test_models/test_dense_heads/test_lad_head.py new file mode 100644 index 0000000..0ca45f4 --- /dev/null +++ b/tests/test_models/test_dense_heads/test_lad_head.py @@ -0,0 +1,149 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import numpy as np +import torch + +from mmdet.models.dense_heads import LADHead, lad_head +from mmdet.models.dense_heads.lad_head import levels_to_images + + +def test_lad_head_loss(): + """Tests lad head loss when truth is empty and non-empty.""" + + class mock_skm: + + def GaussianMixture(self, *args, **kwargs): + return self + + def fit(self, loss): + pass + + def predict(self, loss): + components = np.zeros_like(loss, dtype=np.long) + return components.reshape(-1) + + def score_samples(self, loss): + scores = np.random.random(len(loss)) + return scores + + lad_head.skm = mock_skm() + + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + train_cfg = mmcv.Config( + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.1, + neg_iou_thr=0.1, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False)) + # since Focal Loss is not supported on CPU + self = LADHead( + num_classes=4, + in_channels=1, + train_cfg=train_cfg, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=1.3), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.5)) + teacher_model = LADHead( + num_classes=4, + in_channels=1, + train_cfg=train_cfg, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=1.3), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.5)) + feat = [ + torch.rand(1, 1, s // feat_size, s // feat_size) + for feat_size in [4, 8, 16, 32, 64] + ] + self.init_weights() + teacher_model.init_weights() + + # Test that empty ground truth encourages the network to predict background + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + gt_bboxes_ignore = None + + outs_teacher = teacher_model(feat) + label_assignment_results = teacher_model.get_label_assignment( + *outs_teacher, gt_bboxes, gt_labels, img_metas, gt_bboxes_ignore) + + outs = teacher_model(feat) + empty_gt_losses = self.loss(*outs, gt_bboxes, gt_labels, img_metas, + gt_bboxes_ignore, label_assignment_results) + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + empty_cls_loss = empty_gt_losses['loss_cls'] + empty_box_loss = empty_gt_losses['loss_bbox'] + empty_iou_loss = empty_gt_losses['loss_iou'] + assert empty_cls_loss.item() > 0, 'cls loss should be non-zero' + assert empty_box_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + assert empty_iou_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + + label_assignment_results = teacher_model.get_label_assignment( + *outs_teacher, gt_bboxes, gt_labels, img_metas, gt_bboxes_ignore) + + one_gt_losses = self.loss(*outs, gt_bboxes, gt_labels, img_metas, + gt_bboxes_ignore, label_assignment_results) + onegt_cls_loss = one_gt_losses['loss_cls'] + onegt_box_loss = one_gt_losses['loss_bbox'] + onegt_iou_loss = one_gt_losses['loss_iou'] + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_box_loss.item() > 0, 'box loss should be non-zero' + assert onegt_iou_loss.item() > 0, 'box loss should be non-zero' + n, c, h, w = 10, 4, 20, 20 + mlvl_tensor = [torch.ones(n, c, h, w) for i in range(5)] + results = levels_to_images(mlvl_tensor) + assert len(results) == n + assert results[0].size() == (h * w * 5, c) + assert self.with_score_voting + + self = LADHead( + num_classes=4, + in_channels=1, + train_cfg=train_cfg, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=1.3), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.5)) + cls_scores = [torch.ones(2, 4, 5, 5)] + bbox_preds = [torch.ones(2, 4, 5, 5)] + iou_preds = [torch.ones(2, 1, 5, 5)] + cfg = mmcv.Config( + dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) + rescale = False + self.get_bboxes( + cls_scores, bbox_preds, iou_preds, img_metas, cfg, rescale=rescale) diff --git a/tests/test_models/test_dense_heads/test_ld_head.py b/tests/test_models/test_dense_heads/test_ld_head.py new file mode 100644 index 0000000..017135d --- /dev/null +++ b/tests/test_models/test_dense_heads/test_ld_head.py @@ -0,0 +1,121 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch + +from mmdet.models.dense_heads import GFLHead, LDHead + + +def test_ld_head_loss(): + """Tests vfnet head loss when truth is empty and non-empty.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + train_cfg = mmcv.Config( + dict( + assigner=dict(type='ATSSAssigner', topk=9, ignore_iof_thr=0.1), + allowed_border=-1, + pos_weight=-1, + debug=False)) + + self = LDHead( + num_classes=4, + in_channels=1, + train_cfg=train_cfg, + loss_ld=dict(type='KnowledgeDistillationKLDivLoss', loss_weight=1.0), + loss_cls=dict( + type='QualityFocalLoss', + use_sigmoid=True, + beta=2.0, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=2.0), + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128])) + + teacher_model = GFLHead( + num_classes=4, + in_channels=1, + train_cfg=train_cfg, + loss_cls=dict( + type='QualityFocalLoss', + use_sigmoid=True, + beta=2.0, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=2.0), + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128])) + + feat = [ + torch.rand(1, 1, s // feat_size, s // feat_size) + for feat_size in [4, 8, 16, 32, 64] + ] + cls_scores, bbox_preds = self.forward(feat) + rand_soft_target = teacher_model.forward(feat)[1] + + # Test that empty ground truth encourages the network to predict + # background + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + gt_bboxes_ignore = None + + empty_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + rand_soft_target, img_metas, gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero, ld loss should + # be non-negative but there should be no box loss. + empty_cls_loss = sum(empty_gt_losses['loss_cls']) + empty_box_loss = sum(empty_gt_losses['loss_bbox']) + empty_ld_loss = sum(empty_gt_losses['loss_ld']) + assert empty_cls_loss.item() > 0, 'cls loss should be non-zero' + assert empty_box_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + assert empty_ld_loss.item() >= 0, 'ld loss should be non-negative' + + # When truth is non-empty then both cls and box loss should be nonzero + # for random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + one_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + rand_soft_target, img_metas, gt_bboxes_ignore) + onegt_cls_loss = sum(one_gt_losses['loss_cls']) + onegt_box_loss = sum(one_gt_losses['loss_bbox']) + + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_box_loss.item() > 0, 'box loss should be non-zero' + + gt_bboxes_ignore = gt_bboxes + + # When truth is non-empty but ignored then the cls loss should be nonzero, + # but there should be no box loss. + ignore_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + rand_soft_target, img_metas, gt_bboxes_ignore) + ignore_cls_loss = sum(ignore_gt_losses['loss_cls']) + ignore_box_loss = sum(ignore_gt_losses['loss_bbox']) + + assert ignore_cls_loss.item() > 0, 'cls loss should be non-zero' + assert ignore_box_loss.item() == 0, 'gt bbox ignored loss should be zero' + + # When truth is non-empty and not ignored then both cls and box loss should + # be nonzero for random inputs + gt_bboxes_ignore = [torch.randn(1, 4)] + + not_ignore_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, + gt_labels, rand_soft_target, img_metas, + gt_bboxes_ignore) + not_ignore_cls_loss = sum(not_ignore_gt_losses['loss_cls']) + not_ignore_box_loss = sum(not_ignore_gt_losses['loss_bbox']) + + assert not_ignore_cls_loss.item() > 0, 'cls loss should be non-zero' + assert not_ignore_box_loss.item( + ) > 0, 'gt bbox not ignored loss should be non-zero' diff --git a/tests/test_models/test_dense_heads/test_mask2former_head.py b/tests/test_models/test_dense_heads/test_mask2former_head.py new file mode 100644 index 0000000..596a325 --- /dev/null +++ b/tests/test_models/test_dense_heads/test_mask2former_head.py @@ -0,0 +1,235 @@ +import numpy as np +import pytest +import torch +from mmcv import ConfigDict + +from mmdet.core.mask import BitmapMasks +from mmdet.models.dense_heads import Mask2FormerHead + + +@pytest.mark.parametrize('num_stuff_classes, \ + label_num', [(53, 100), (0, 80)]) +def test_mask2former_head_loss(num_stuff_classes, label_num): + """Tests head loss when truth is empty and non-empty. + + Tests head loss as Panoptic Segmentation and Instance Segmentation. Tests + forward_train and simple_test with masks and None as gt_semantic_seg + """ + self = _init_model(num_stuff_classes) + img_metas = [{ + 'batch_input_shape': (128, 160), + 'pad_shape': (128, 160, 3), + 'img_shape': (126, 160, 3), + 'ori_shape': (63, 80, 3) + }, { + 'batch_input_shape': (128, 160), + 'pad_shape': (128, 160, 3), + 'img_shape': (120, 160, 3), + 'ori_shape': (60, 80, 3) + }] + feats = [ + torch.rand((2, 64 * 2**i, 4 * 2**(3 - i), 5 * 2**(3 - i))) + for i in range(4) + ] + all_cls_scores, all_mask_preds = self.forward(feats, img_metas) + # Test that empty ground truth encourages the network to predict background + gt_labels_list = [torch.LongTensor([]), torch.LongTensor([])] + gt_masks_list = [ + torch.zeros((0, 128, 160)).long(), + torch.zeros((0, 128, 160)).long() + ] + + empty_gt_losses = self.loss(all_cls_scores, all_mask_preds, gt_labels_list, + gt_masks_list, img_metas) + # When there is no truth, the cls loss should be nonzero but there should + # be no mask loss. + for key, loss in empty_gt_losses.items(): + if 'cls' in key: + assert loss.item() > 0, 'cls loss should be non-zero' + elif 'mask' in key: + assert loss.item( + ) == 0, 'there should be no mask loss when there are no true mask' + elif 'dice' in key: + assert loss.item( + ) == 0, 'there should be no dice loss when there are no true mask' + + # when truth is non-empty then both cls, mask, dice loss should be nonzero + # random inputs + gt_labels_list = [ + torch.tensor([10, label_num]).long(), + torch.tensor([label_num, 10]).long() + ] + mask1 = torch.zeros((2, 128, 160)).long() + mask1[0, :50] = 1 + mask1[1, 50:] = 1 + mask2 = torch.zeros((2, 128, 160)).long() + mask2[0, :, :50] = 1 + mask2[1, :, 50:] = 1 + gt_masks_list = [mask1, mask2] + two_gt_losses = self.loss(all_cls_scores, all_mask_preds, gt_labels_list, + gt_masks_list, img_metas) + for loss in two_gt_losses.values(): + assert loss.item() > 0, 'all loss should be non-zero' + + # test forward_train + gt_bboxes = None + gt_labels = [ + torch.tensor([10]).long(), + torch.tensor([10]).long(), + ] + thing_mask1 = np.zeros((1, 128, 160), dtype=np.int32) + thing_mask1[0, :50] = 1 + thing_mask2 = np.zeros((1, 128, 160), dtype=np.int32) + thing_mask2[0, :, 50:] = 1 + gt_masks = [ + BitmapMasks(thing_mask1, 128, 160), + BitmapMasks(thing_mask2, 128, 160), + ] + stuff_mask1 = torch.zeros((1, 128, 160)).long() + stuff_mask1[0, :50] = 10 + stuff_mask1[0, 50:] = 100 + stuff_mask2 = torch.zeros((1, 128, 160)).long() + stuff_mask2[0, :, 50:] = 10 + stuff_mask2[0, :, :50] = 100 + gt_semantic_seg = [stuff_mask1, stuff_mask2] + + self.forward_train(feats, img_metas, gt_bboxes, gt_labels, gt_masks, + gt_semantic_seg) + + # test when gt_semantic_seg is None + gt_semantic_seg = None + self.forward_train(feats, img_metas, gt_bboxes, gt_labels, gt_masks, + gt_semantic_seg) + + # test inference mode + self.simple_test(feats, img_metas) + + +def _init_model(num_stuff_classes): + base_channels = 64 + num_things_classes = 80 + num_classes = num_things_classes + num_stuff_classes + config = ConfigDict( + dict( + type='Mask2FormerHead', + in_channels=[base_channels * 2**i for i in range(4)], + feat_channels=base_channels, + out_channels=base_channels, + num_things_classes=num_things_classes, + num_stuff_classes=num_stuff_classes, + num_queries=100, + num_transformer_feat_level=3, + pixel_decoder=dict( + type='MSDeformAttnPixelDecoder', + num_outs=3, + norm_cfg=dict(type='GN', num_groups=32), + act_cfg=dict(type='ReLU'), + encoder=dict( + type='DetrTransformerEncoder', + num_layers=6, + transformerlayers=dict( + type='BaseTransformerLayer', + attn_cfgs=dict( + type='MultiScaleDeformableAttention', + embed_dims=base_channels, + num_heads=8, + num_levels=3, + num_points=4, + im2col_step=64, + dropout=0.0, + batch_first=False, + norm_cfg=None, + init_cfg=None), + ffn_cfgs=dict( + type='FFN', + embed_dims=base_channels, + feedforward_channels=base_channels * 4, + num_fcs=2, + ffn_drop=0.0, + act_cfg=dict(type='ReLU', inplace=True)), + feedforward_channels=base_channels * 4, + ffn_dropout=0.0, + operation_order=('self_attn', 'norm', 'ffn', 'norm')), + init_cfg=None), + positional_encoding=dict( + type='SinePositionalEncoding', + num_feats=base_channels // 2, + normalize=True), + init_cfg=None), + enforce_decoder_input_project=False, + positional_encoding=dict( + type='SinePositionalEncoding', + num_feats=base_channels // 2, + normalize=True), + transformer_decoder=dict( + type='DetrTransformerDecoder', + return_intermediate=True, + num_layers=9, + transformerlayers=dict( + type='DetrTransformerDecoderLayer', + attn_cfgs=dict( + type='MultiheadAttention', + embed_dims=base_channels, + num_heads=8, + attn_drop=0.0, + proj_drop=0.0, + dropout_layer=None, + batch_first=False), + ffn_cfgs=dict( + embed_dims=base_channels, + feedforward_channels=base_channels * 8, + num_fcs=2, + act_cfg=dict(type='ReLU', inplace=True), + ffn_drop=0.0, + dropout_layer=None, + add_identity=True), + # the following parameter was not used, + # just make current api happy + feedforward_channels=base_channels * 8, + operation_order=('cross_attn', 'norm', 'self_attn', 'norm', + 'ffn', 'norm')), + init_cfg=None), + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=2.0, + reduction='mean', + class_weight=[1.0] * num_classes + [0.1]), + loss_mask=dict( + type='CrossEntropyLoss', + use_sigmoid=True, + reduction='mean', + loss_weight=5.0), + loss_dice=dict( + type='DiceLoss', + use_sigmoid=True, + activate=True, + reduction='mean', + naive_dice=True, + eps=1.0, + loss_weight=5.0), + train_cfg=dict( + num_points=256, + oversample_ratio=3.0, + importance_sample_ratio=0.75, + assigner=dict( + type='MaskHungarianAssigner', + cls_cost=dict(type='ClassificationCost', weight=2.0), + mask_cost=dict( + type='CrossEntropyLossCost', + weight=5.0, + use_sigmoid=True), + dice_cost=dict( + type='DiceCost', weight=5.0, pred_act=True, eps=1.0)), + sampler=dict(type='MaskPseudoSampler')), + test_cfg=dict( + panoptic_on=True, + semantic_on=False, + instance_on=True, + max_dets_per_image=100, + object_mask_thr=0.8, + iou_thr=0.8))) + self = Mask2FormerHead(**config) + self.init_weights() + + return self diff --git a/tests/test_models/test_dense_heads/test_maskformer_head.py b/tests/test_models/test_dense_heads/test_maskformer_head.py new file mode 100644 index 0000000..c9bebee --- /dev/null +++ b/tests/test_models/test_dense_heads/test_maskformer_head.py @@ -0,0 +1,206 @@ +import numpy as np +import torch +from mmcv import ConfigDict + +from mmdet.core.mask import BitmapMasks +from mmdet.models.dense_heads import MaskFormerHead + + +def test_maskformer_head_loss(): + """Tests head loss when truth is empty and non-empty.""" + base_channels = 64 + # batch_input_shape = (128, 160) + img_metas = [{ + 'batch_input_shape': (128, 160), + 'pad_shape': (128, 160, 3), + 'img_shape': (126, 160, 3), + 'ori_shape': (63, 80, 3) + }, { + 'batch_input_shape': (128, 160), + 'pad_shape': (128, 160, 3), + 'img_shape': (120, 160, 3), + 'ori_shape': (60, 80, 3) + }] + feats = [ + torch.rand((2, 64 * 2**i, 4 * 2**(3 - i), 5 * 2**(3 - i))) + for i in range(4) + ] + num_things_classes = 80 + num_stuff_classes = 53 + num_classes = num_things_classes + num_stuff_classes + config = ConfigDict( + dict( + type='MaskFormerHead', + in_channels=[base_channels * 2**i for i in range(4)], + feat_channels=base_channels, + out_channels=base_channels, + num_things_classes=num_things_classes, + num_stuff_classes=num_stuff_classes, + num_queries=100, + pixel_decoder=dict( + type='TransformerEncoderPixelDecoder', + norm_cfg=dict(type='GN', num_groups=32), + act_cfg=dict(type='ReLU'), + encoder=dict( + type='DetrTransformerEncoder', + num_layers=6, + transformerlayers=dict( + type='BaseTransformerLayer', + attn_cfgs=dict( + type='MultiheadAttention', + embed_dims=base_channels, + num_heads=8, + attn_drop=0.1, + proj_drop=0.1, + dropout_layer=None, + batch_first=False), + ffn_cfgs=dict( + embed_dims=base_channels, + feedforward_channels=base_channels * 8, + num_fcs=2, + act_cfg=dict(type='ReLU', inplace=True), + ffn_drop=0.1, + dropout_layer=None, + add_identity=True), + operation_order=('self_attn', 'norm', 'ffn', 'norm'), + norm_cfg=dict(type='LN'), + init_cfg=None, + batch_first=False), + init_cfg=None), + positional_encoding=dict( + type='SinePositionalEncoding', + num_feats=base_channels // 2, + normalize=True)), + enforce_decoder_input_project=False, + positional_encoding=dict( + type='SinePositionalEncoding', + num_feats=base_channels // 2, + normalize=True), + transformer_decoder=dict( + type='DetrTransformerDecoder', + return_intermediate=True, + num_layers=6, + transformerlayers=dict( + type='DetrTransformerDecoderLayer', + attn_cfgs=dict( + type='MultiheadAttention', + embed_dims=base_channels, + num_heads=8, + attn_drop=0.1, + proj_drop=0.1, + dropout_layer=None, + batch_first=False), + ffn_cfgs=dict( + embed_dims=base_channels, + feedforward_channels=base_channels * 8, + num_fcs=2, + act_cfg=dict(type='ReLU', inplace=True), + ffn_drop=0.1, + dropout_layer=None, + add_identity=True), + # the following parameter was not used, + # just make current api happy + feedforward_channels=base_channels * 8, + operation_order=('self_attn', 'norm', 'cross_attn', 'norm', + 'ffn', 'norm')), + init_cfg=None), + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + loss_weight=1.0, + reduction='mean', + class_weight=[1.0] * num_classes + [0.1]), + loss_mask=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + reduction='mean', + loss_weight=20.0), + loss_dice=dict( + type='DiceLoss', + use_sigmoid=True, + activate=True, + reduction='mean', + naive_dice=True, + eps=1.0, + loss_weight=1.0), + train_cfg=dict( + assigner=dict( + type='MaskHungarianAssigner', + cls_cost=dict(type='ClassificationCost', weight=1.0), + mask_cost=dict( + type='FocalLossCost', weight=20.0, binary_input=True), + dice_cost=dict( + type='DiceCost', weight=1.0, pred_act=True, eps=1.0)), + sampler=dict(type='MaskPseudoSampler')), + test_cfg=dict(object_mask_thr=0.8, iou_thr=0.8))) + self = MaskFormerHead(**config) + self.init_weights() + all_cls_scores, all_mask_preds = self.forward(feats, img_metas) + # Test that empty ground truth encourages the network to predict background + gt_labels_list = [torch.LongTensor([]), torch.LongTensor([])] + gt_masks_list = [ + torch.zeros((0, 128, 160)).long(), + torch.zeros((0, 128, 160)).long() + ] + + empty_gt_losses = self.loss(all_cls_scores, all_mask_preds, gt_labels_list, + gt_masks_list, img_metas) + # When there is no truth, the cls loss should be nonzero but there should + # be no mask loss. + for key, loss in empty_gt_losses.items(): + if 'cls' in key: + assert loss.item() > 0, 'cls loss should be non-zero' + elif 'mask' in key: + assert loss.item( + ) == 0, 'there should be no mask loss when there are no true mask' + elif 'dice' in key: + assert loss.item( + ) == 0, 'there should be no dice loss when there are no true mask' + + # when truth is non-empty then both cls, mask, dice loss should be nonzero + # random inputs + gt_labels_list = [ + torch.tensor([10, 100]).long(), + torch.tensor([100, 10]).long() + ] + mask1 = torch.zeros((2, 128, 160)).long() + mask1[0, :50] = 1 + mask1[1, 50:] = 1 + mask2 = torch.zeros((2, 128, 160)).long() + mask2[0, :, :50] = 1 + mask2[1, :, 50:] = 1 + gt_masks_list = [mask1, mask2] + two_gt_losses = self.loss(all_cls_scores, all_mask_preds, gt_labels_list, + gt_masks_list, img_metas) + for loss in two_gt_losses.values(): + assert loss.item() > 0, 'all loss should be non-zero' + + # test forward_train + gt_bboxes = None + gt_labels = [ + torch.tensor([10]).long(), + torch.tensor([10]).long(), + ] + thing_mask1 = np.zeros((1, 128, 160), dtype=np.int32) + thing_mask1[0, :50] = 1 + thing_mask2 = np.zeros((1, 128, 160), dtype=np.int32) + thing_mask2[0, :, 50:] = 1 + gt_masks = [ + BitmapMasks(thing_mask1, 128, 160), + BitmapMasks(thing_mask2, 128, 160), + ] + stuff_mask1 = torch.zeros((1, 128, 160)).long() + stuff_mask1[0, :50] = 10 + stuff_mask1[0, 50:] = 100 + stuff_mask2 = torch.zeros((1, 128, 160)).long() + stuff_mask2[0, :, 50:] = 10 + stuff_mask2[0, :, :50] = 100 + gt_semantic_seg = [stuff_mask1, stuff_mask2] + + self.forward_train(feats, img_metas, gt_bboxes, gt_labels, gt_masks, + gt_semantic_seg) + + # test inference mode + self.simple_test(feats, img_metas) diff --git a/tests/test_models/test_dense_heads/test_paa_head.py b/tests/test_models/test_dense_heads/test_paa_head.py new file mode 100644 index 0000000..1aa7c6a --- /dev/null +++ b/tests/test_models/test_dense_heads/test_paa_head.py @@ -0,0 +1,135 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import numpy as np +import torch + +from mmdet.models.dense_heads import PAAHead, paa_head +from mmdet.models.dense_heads.paa_head import levels_to_images + + +def test_paa_head_loss(): + """Tests paa head loss when truth is empty and non-empty.""" + + class mock_skm: + + def GaussianMixture(self, *args, **kwargs): + return self + + def fit(self, loss): + pass + + def predict(self, loss): + components = np.zeros_like(loss, dtype=np.long) + return components.reshape(-1) + + def score_samples(self, loss): + scores = np.random.random(len(loss)) + return scores + + paa_head.skm = mock_skm() + + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + train_cfg = mmcv.Config( + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.1, + neg_iou_thr=0.1, + min_pos_iou=0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False)) + # since Focal Loss is not supported on CPU + self = PAAHead( + num_classes=4, + in_channels=1, + train_cfg=train_cfg, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=1.3), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.5)) + feat = [ + torch.rand(1, 1, s // feat_size, s // feat_size) + for feat_size in [4, 8, 16, 32, 64] + ] + self.init_weights() + cls_scores, bbox_preds, iou_preds = self(feat) + # Test that empty ground truth encourages the network to predict background + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + gt_bboxes_ignore = None + empty_gt_losses = self.loss(cls_scores, bbox_preds, iou_preds, gt_bboxes, + gt_labels, img_metas, gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + empty_cls_loss = empty_gt_losses['loss_cls'] + empty_box_loss = empty_gt_losses['loss_bbox'] + empty_iou_loss = empty_gt_losses['loss_iou'] + assert empty_cls_loss.item() > 0, 'cls loss should be non-zero' + assert empty_box_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + assert empty_iou_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + one_gt_losses = self.loss(cls_scores, bbox_preds, iou_preds, gt_bboxes, + gt_labels, img_metas, gt_bboxes_ignore) + onegt_cls_loss = one_gt_losses['loss_cls'] + onegt_box_loss = one_gt_losses['loss_bbox'] + onegt_iou_loss = one_gt_losses['loss_iou'] + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_box_loss.item() > 0, 'box loss should be non-zero' + assert onegt_iou_loss.item() > 0, 'box loss should be non-zero' + n, c, h, w = 10, 4, 20, 20 + mlvl_tensor = [torch.ones(n, c, h, w) for i in range(5)] + results = levels_to_images(mlvl_tensor) + assert len(results) == n + assert results[0].size() == (h * w * 5, c) + assert self.with_score_voting + + self = PAAHead( + num_classes=4, + in_channels=1, + train_cfg=train_cfg, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8]), + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=1.3), + loss_centerness=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=0.5)) + cls_scores = [torch.ones(2, 4, 5, 5)] + bbox_preds = [torch.ones(2, 4, 5, 5)] + iou_preds = [torch.ones(2, 1, 5, 5)] + cfg = mmcv.Config( + dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) + rescale = False + self.get_bboxes( + cls_scores, bbox_preds, iou_preds, img_metas, cfg, rescale=rescale) diff --git a/tests/test_models/test_dense_heads/test_pisa_head.py b/tests/test_models/test_dense_heads/test_pisa_head.py new file mode 100644 index 0000000..996320a --- /dev/null +++ b/tests/test_models/test_dense_heads/test_pisa_head.py @@ -0,0 +1,245 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch + +from mmdet.models.dense_heads import PISARetinaHead, PISASSDHead +from mmdet.models.roi_heads import PISARoIHead + + +def test_pisa_retinanet_head_loss(): + """Tests pisa retinanet head loss when truth is empty and non-empty.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + + cfg = mmcv.Config( + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='RandomSampler', + num=256, + pos_fraction=0.5, + neg_pos_ub=-1, + add_gt_as_proposals=False), + isr=dict(k=2., bias=0.), + carl=dict(k=1., bias=0.2), + allowed_border=0, + pos_weight=-1, + debug=False)) + self = PISARetinaHead(num_classes=4, in_channels=1, train_cfg=cfg) + + # Anchor head expects a multiple levels of features per image + feat = [ + torch.rand(1, 1, s // (2**(i + 2)), s // (2**(i + 2))) + for i in range(len(self.anchor_generator.strides)) + ] + cls_scores, bbox_preds = self.forward(feat) + + # Test that empty ground truth encourages the network to predict background + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + + gt_bboxes_ignore = None + empty_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + empty_cls_loss = empty_gt_losses['loss_cls'].sum() + empty_box_loss = empty_gt_losses['loss_bbox'].sum() + assert empty_cls_loss.item() > 0, 'cls loss should be non-zero' + assert empty_box_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + one_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + onegt_cls_loss = one_gt_losses['loss_cls'].sum() + onegt_box_loss = one_gt_losses['loss_bbox'].sum() + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_box_loss.item() > 0, 'box loss should be non-zero' + + +def test_pisa_ssd_head_loss(): + """Tests pisa ssd head loss when truth is empty and non-empty.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + + cfg = mmcv.Config( + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0., + ignore_iof_thr=-1, + gt_max_assign_all=False), + isr=dict(k=2., bias=0.), + carl=dict(k=1., bias=0.2), + smoothl1_beta=1., + allowed_border=-1, + pos_weight=-1, + neg_pos_ratio=3, + debug=False)) + ssd_anchor_generator = dict( + type='SSDAnchorGenerator', + scale_major=False, + input_size=300, + strides=[1], + ratios=([2], ), + basesize_ratio_range=(0.15, 0.9)) + self = PISASSDHead( + num_classes=4, + in_channels=(1, ), + train_cfg=cfg, + anchor_generator=ssd_anchor_generator) + + # Anchor head expects a multiple levels of features per image + feat = [ + torch.rand(1, 1, s // (2**(i + 2)), s // (2**(i + 2))) + for i in range(len(self.anchor_generator.strides)) + ] + cls_scores, bbox_preds = self.forward(feat) + + # Test that empty ground truth encourages the network to predict background + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + + gt_bboxes_ignore = None + empty_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + empty_cls_loss = sum(empty_gt_losses['loss_cls']) + empty_box_loss = sum(empty_gt_losses['loss_bbox']) + # SSD is special, #pos:#neg = 1: 3, so empth gt will also lead loss cls = 0 + assert empty_cls_loss.item() == 0, 'cls loss should be non-zero' + assert empty_box_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + one_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + onegt_cls_loss = sum(one_gt_losses['loss_cls']) + onegt_box_loss = sum(one_gt_losses['loss_bbox']) + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_box_loss.item() > 0, 'box loss should be non-zero' + + +def test_pisa_roi_head_loss(): + """Tests pisa roi head loss when truth is empty and non-empty.""" + train_cfg = mmcv.Config( + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.7, + neg_iou_thr=0.3, + min_pos_iou=0.3, + match_low_quality=True, + ignore_iof_thr=-1), + sampler=dict( + type='ScoreHLRSampler', + num=4, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True, + k=0.5, + bias=0.), + isr=dict(k=2., bias=0.), + carl=dict(k=1., bias=0.2), + allowed_border=0, + pos_weight=-1, + debug=False)) + + bbox_roi_extractor = dict( + type='SingleRoIExtractor', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0), + out_channels=1, + featmap_strides=[1]) + + bbox_head = dict( + type='Shared2FCBBoxHead', + in_channels=1, + fc_out_channels=2, + roi_feat_size=7, + num_classes=4, + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[0., 0., 0., 0.], + target_stds=[0.1, 0.1, 0.2, 0.2]), + reg_class_agnostic=False, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + loss_bbox=dict(type='L1Loss', loss_weight=1.0)) + + self = PISARoIHead(bbox_roi_extractor, bbox_head, train_cfg=train_cfg) + + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + + # Anchor head expects a multiple levels of features per image + feat = [ + torch.rand(1, 1, s // (2**(i + 2)), s // (2**(i + 2))) + for i in range(1) + ] + + proposal_list = [ + torch.Tensor([[22.6667, 22.8757, 238.6326, 151.8874], [0, 3, 5, 7]]) + ] + + # Test that empty ground truth encourages the network to predict background + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + gt_bboxes_ignore = None + + empty_gt_losses = self.forward_train(feat, img_metas, proposal_list, + gt_bboxes, gt_labels, + gt_bboxes_ignore) + + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + empty_cls_loss = empty_gt_losses['loss_cls'].sum() + empty_box_loss = empty_gt_losses['loss_bbox'].sum() + assert empty_cls_loss.item() > 0, 'cls loss should be non-zero' + assert empty_box_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + + one_gt_losses = self.forward_train(feat, img_metas, proposal_list, + gt_bboxes, gt_labels, gt_bboxes_ignore) + onegt_cls_loss = one_gt_losses['loss_cls'].sum() + onegt_box_loss = one_gt_losses['loss_bbox'].sum() + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_box_loss.item() > 0, 'box loss should be non-zero' diff --git a/tests/test_models/test_dense_heads/test_sabl_retina_head.py b/tests/test_models/test_dense_heads/test_sabl_retina_head.py new file mode 100644 index 0000000..4e89d9a --- /dev/null +++ b/tests/test_models/test_dense_heads/test_sabl_retina_head.py @@ -0,0 +1,76 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch + +from mmdet.models.dense_heads import SABLRetinaHead + + +def test_sabl_retina_head_loss(): + """Tests anchor head loss when truth is empty and non-empty.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + + cfg = mmcv.Config( + dict( + assigner=dict( + type='ApproxMaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0.0, + ignore_iof_thr=-1), + allowed_border=-1, + pos_weight=-1, + debug=False)) + head = SABLRetinaHead( + num_classes=4, + in_channels=3, + feat_channels=10, + loss_cls=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0), + train_cfg=cfg) + if torch.cuda.is_available(): + head.cuda() + # Anchor head expects a multiple levels of features per image + feat = [ + torch.rand(1, 3, s // (2**(i + 2)), s // (2**(i + 2))).cuda() + for i in range(len(head.approx_anchor_generator.base_anchors)) + ] + cls_scores, bbox_preds = head.forward(feat) + + # Test that empty ground truth encourages the network + # to predict background + gt_bboxes = [torch.empty((0, 4)).cuda()] + gt_labels = [torch.LongTensor([]).cuda()] + + gt_bboxes_ignore = None + empty_gt_losses = head.loss(cls_scores, bbox_preds, gt_bboxes, + gt_labels, img_metas, gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there + # should be no box loss. + empty_cls_loss = sum(empty_gt_losses['loss_cls']) + empty_box_cls_loss = sum(empty_gt_losses['loss_bbox_cls']) + empty_box_reg_loss = sum(empty_gt_losses['loss_bbox_reg']) + assert empty_cls_loss.item() > 0, 'cls loss should be non-zero' + assert empty_box_cls_loss.item() == 0, ( + 'there should be no box cls loss when there are no true boxes') + assert empty_box_reg_loss.item() == 0, ( + 'there should be no box reg loss when there are no true boxes') + + # When truth is non-empty then both cls and box loss should + # be nonzero for random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]).cuda(), + ] + gt_labels = [torch.LongTensor([2]).cuda()] + one_gt_losses = head.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + onegt_cls_loss = sum(one_gt_losses['loss_cls']) + onegt_box_cls_loss = sum(one_gt_losses['loss_bbox_cls']) + onegt_box_reg_loss = sum(one_gt_losses['loss_bbox_reg']) + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_box_cls_loss.item() > 0, 'box loss cls should be non-zero' + assert onegt_box_reg_loss.item() > 0, 'box loss reg should be non-zero' diff --git a/tests/test_models/test_dense_heads/test_solo_head.py b/tests/test_models/test_dense_heads/test_solo_head.py new file mode 100644 index 0000000..16cb4f7 --- /dev/null +++ b/tests/test_models/test_dense_heads/test_solo_head.py @@ -0,0 +1,284 @@ +import pytest +import torch + +from mmdet.models.dense_heads import (DecoupledSOLOHead, + DecoupledSOLOLightHead, SOLOHead) + + +def test_solo_head_loss(): + """Tests solo head loss when truth is empty and non-empty.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + self = SOLOHead( + num_classes=4, + in_channels=1, + num_grids=[40, 36, 24, 16, 12], + loss_mask=dict(type='DiceLoss', use_sigmoid=True, loss_weight=3.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0)) + feat = [ + torch.rand(1, 1, s // feat_size, s // feat_size) + for feat_size in [4, 8, 16, 32, 64] + ] + mask_preds, cls_preds = self.forward(feat) + # Test that empty ground truth encourages the network to + # predict background. + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + gt_masks = [torch.empty((0, 550, 550))] + gt_bboxes_ignore = None + empty_gt_losses = self.loss( + mask_preds, + cls_preds, + gt_labels, + gt_masks, + img_metas, + gt_bboxes, + gt_bboxes_ignore=gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + empty_mask_loss = empty_gt_losses['loss_mask'] + empty_cls_loss = empty_gt_losses['loss_cls'] + assert empty_cls_loss.item() > 0, 'cls loss should be non-zero' + assert empty_mask_loss.item() == 0, ( + 'there should be no mask loss when there are no true masks') + + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs. + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + gt_masks = [(torch.rand((1, 256, 256)) > 0.5).float()] + one_gt_losses = self.loss( + mask_preds, + cls_preds, + gt_labels, + gt_masks, + img_metas, + gt_bboxes, + gt_bboxes_ignore=gt_bboxes_ignore) + onegt_mask_loss = one_gt_losses['loss_mask'] + onegt_cls_loss = one_gt_losses['loss_cls'] + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_mask_loss.item() > 0, 'mask loss should be non-zero' + + # When the length of num_grids, scale_ranges, and num_levels are not equal. + with pytest.raises(AssertionError): + SOLOHead( + num_classes=4, + in_channels=1, + num_grids=[36, 24, 16, 12], + loss_mask=dict(type='DiceLoss', use_sigmoid=True, loss_weight=3.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0)) + + # When input feature length is not equal to num_levels. + with pytest.raises(AssertionError): + feat = [ + torch.rand(1, 1, s // feat_size, s // feat_size) + for feat_size in [4, 8, 16, 32] + ] + self.forward(feat) + + +def test_desolo_head_loss(): + """Tests solo head loss when truth is empty and non-empty.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + self = DecoupledSOLOHead( + num_classes=4, + in_channels=1, + num_grids=[40, 36, 24, 16, 12], + loss_mask=dict( + type='DiceLoss', use_sigmoid=True, activate=False, + loss_weight=3.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0)) + feat = [ + torch.rand(1, 1, s // feat_size, s // feat_size) + for feat_size in [4, 8, 16, 32, 64] + ] + mask_preds_x, mask_preds_y, cls_preds = self.forward(feat) + # Test that empty ground truth encourages the network to + # predict background. + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + gt_masks = [torch.empty((0, 550, 550))] + gt_bboxes_ignore = None + empty_gt_losses = self.loss( + mask_preds_x, + mask_preds_y, + cls_preds, + gt_labels, + gt_masks, + img_metas, + gt_bboxes, + gt_bboxes_ignore=gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + empty_mask_loss = empty_gt_losses['loss_mask'] + empty_cls_loss = empty_gt_losses['loss_cls'] + assert empty_cls_loss.item() > 0, 'cls loss should be non-zero' + assert empty_mask_loss.item() == 0, ( + 'there should be no mask loss when there are no true masks') + + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs. + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + gt_masks = [(torch.rand((1, 256, 256)) > 0.5).float()] + one_gt_losses = self.loss( + mask_preds_x, + mask_preds_y, + cls_preds, + gt_labels, + gt_masks, + img_metas, + gt_bboxes, + gt_bboxes_ignore=gt_bboxes_ignore) + onegt_mask_loss = one_gt_losses['loss_mask'] + onegt_cls_loss = one_gt_losses['loss_cls'] + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_mask_loss.item() > 0, 'mask loss should be non-zero' + + # When the length of num_grids, scale_ranges, and num_levels are not equal. + with pytest.raises(AssertionError): + DecoupledSOLOHead( + num_classes=4, + in_channels=1, + num_grids=[36, 24, 16, 12], + loss_mask=dict( + type='DiceLoss', + use_sigmoid=True, + activate=False, + loss_weight=3.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0)) + + # When input feature length is not equal to num_levels. + with pytest.raises(AssertionError): + feat = [ + torch.rand(1, 1, s // feat_size, s // feat_size) + for feat_size in [4, 8, 16, 32] + ] + self.forward(feat) + + +def test_desolo_light_head_loss(): + """Tests solo head loss when truth is empty and non-empty.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + self = DecoupledSOLOLightHead( + num_classes=4, + in_channels=1, + num_grids=[40, 36, 24, 16, 12], + loss_mask=dict( + type='DiceLoss', use_sigmoid=True, activate=False, + loss_weight=3.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0)) + feat = [ + torch.rand(1, 1, s // feat_size, s // feat_size) + for feat_size in [4, 8, 16, 32, 64] + ] + mask_preds_x, mask_preds_y, cls_preds = self.forward(feat) + # Test that empty ground truth encourages the network to + # predict background. + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + gt_masks = [torch.empty((0, 550, 550))] + gt_bboxes_ignore = None + empty_gt_losses = self.loss( + mask_preds_x, + mask_preds_y, + cls_preds, + gt_labels, + gt_masks, + img_metas, + gt_bboxes, + gt_bboxes_ignore=gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + empty_mask_loss = empty_gt_losses['loss_mask'] + empty_cls_loss = empty_gt_losses['loss_cls'] + assert empty_cls_loss.item() > 0, 'cls loss should be non-zero' + assert empty_mask_loss.item() == 0, ( + 'there should be no mask loss when there are no true masks') + + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs. + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + gt_masks = [(torch.rand((1, 256, 256)) > 0.5).float()] + one_gt_losses = self.loss( + mask_preds_x, + mask_preds_y, + cls_preds, + gt_labels, + gt_masks, + img_metas, + gt_bboxes, + gt_bboxes_ignore=gt_bboxes_ignore) + onegt_mask_loss = one_gt_losses['loss_mask'] + onegt_cls_loss = one_gt_losses['loss_cls'] + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_mask_loss.item() > 0, 'mask loss should be non-zero' + + # When the length of num_grids, scale_ranges, and num_levels are not equal. + with pytest.raises(AssertionError): + DecoupledSOLOLightHead( + num_classes=4, + in_channels=1, + num_grids=[36, 24, 16, 12], + loss_mask=dict(type='DiceLoss', use_sigmoid=True, loss_weight=3.0), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0)) + + # When input feature length is not equal to num_levels. + with pytest.raises(AssertionError): + feat = [ + torch.rand(1, 1, s // feat_size, s // feat_size) + for feat_size in [4, 8, 16, 32] + ] + self.forward(feat) diff --git a/tests/test_models/test_dense_heads/test_tood_head.py b/tests/test_models/test_dense_heads/test_tood_head.py new file mode 100644 index 0000000..f96364d --- /dev/null +++ b/tests/test_models/test_dense_heads/test_tood_head.py @@ -0,0 +1,128 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch + +from mmdet.models.dense_heads import TOODHead + + +def test_tood_head_loss(): + """Tests paa head loss when truth is empty and non-empty.""" + + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + train_cfg = mmcv.Config( + dict( + initial_epoch=4, + initial_assigner=dict(type='ATSSAssigner', topk=9), + assigner=dict(type='TaskAlignedAssigner', topk=13), + alpha=1, + beta=6, + allowed_border=-1, + pos_weight=-1, + debug=False)) + test_cfg = mmcv.Config( + dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.6), + max_per_img=100)) + # since Focal Loss is not supported on CPU + self = TOODHead( + num_classes=80, + in_channels=1, + stacked_convs=6, + feat_channels=256, + anchor_type='anchor_free', + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + octave_base_scale=8, + scales_per_octave=1, + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + initial_loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + activated=True, # use probability instead of logit as input + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_cls=dict( + type='QualityFocalLoss', + use_sigmoid=True, + activated=True, # use probability instead of logit as input + beta=2.0, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=2.0), + train_cfg=train_cfg, + test_cfg=test_cfg) + self.init_weights() + feat = [ + torch.rand(1, 1, s // feat_size, s // feat_size) + for feat_size in [8, 16, 32, 64, 128] + ] + cls_scores, bbox_preds = self(feat) + + # test initial assigner and losses + self.epoch = 0 + # Test that empty ground truth encourages the network to predict background + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + gt_bboxes_ignore = None + empty_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + empty_cls_loss = empty_gt_losses['loss_cls'] + empty_box_loss = empty_gt_losses['loss_bbox'] + assert sum(empty_cls_loss).item() > 0, 'cls loss should be non-zero' + assert sum(empty_box_loss).item() == 0, ( + 'there should be no box loss when there are no true boxes') + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + one_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + onegt_cls_loss = one_gt_losses['loss_cls'] + onegt_box_loss = one_gt_losses['loss_bbox'] + assert sum(onegt_cls_loss).item() > 0, 'cls loss should be non-zero' + assert sum(onegt_box_loss).item() > 0, 'box loss should be non-zero' + + # test task alignment assigner and losses + self.epoch = 10 + # Test that empty ground truth encourages the network to predict background + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + gt_bboxes_ignore = None + empty_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + empty_cls_loss = empty_gt_losses['loss_cls'] + empty_box_loss = empty_gt_losses['loss_bbox'] + assert sum(empty_cls_loss).item() > 0, 'cls loss should be non-zero' + assert sum(empty_box_loss).item() == 0, ( + 'there should be no box loss when there are no true boxes') + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + one_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + onegt_cls_loss = one_gt_losses['loss_cls'] + onegt_box_loss = one_gt_losses['loss_bbox'] + assert sum(onegt_cls_loss).item() > 0, 'cls loss should be non-zero' + assert sum(onegt_box_loss).item() > 0, 'box loss should be non-zero' diff --git a/tests/test_models/test_dense_heads/test_vfnet_head.py b/tests/test_models/test_dense_heads/test_vfnet_head.py new file mode 100644 index 0000000..7fec4e5 --- /dev/null +++ b/tests/test_models/test_dense_heads/test_vfnet_head.py @@ -0,0 +1,63 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch + +from mmdet.models.dense_heads import VFNetHead + + +def test_vfnet_head_loss(): + """Tests vfnet head loss when truth is empty and non-empty.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + train_cfg = mmcv.Config( + dict( + assigner=dict(type='ATSSAssigner', topk=9), + allowed_border=-1, + pos_weight=-1, + debug=False)) + # since Focal Loss is not supported on CPU + self = VFNetHead( + num_classes=4, + in_channels=1, + train_cfg=train_cfg, + loss_cls=dict(type='VarifocalLoss', use_sigmoid=True, loss_weight=1.0)) + if torch.cuda.is_available(): + self.cuda() + feat = [ + torch.rand(1, 1, s // feat_size, s // feat_size).cuda() + for feat_size in [4, 8, 16, 32, 64] + ] + cls_scores, bbox_preds, bbox_preds_refine = self.forward(feat) + # Test that empty ground truth encourages the network to predict + # background + gt_bboxes = [torch.empty((0, 4)).cuda()] + gt_labels = [torch.LongTensor([]).cuda()] + gt_bboxes_ignore = None + empty_gt_losses = self.loss(cls_scores, bbox_preds, bbox_preds_refine, + gt_bboxes, gt_labels, img_metas, + gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there + # should be no box loss. + empty_cls_loss = empty_gt_losses['loss_cls'] + empty_box_loss = empty_gt_losses['loss_bbox'] + assert empty_cls_loss.item() > 0, 'cls loss should be non-zero' + assert empty_box_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + + # When truth is non-empty then both cls and box loss should be nonzero + # for random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]).cuda(), + ] + gt_labels = [torch.LongTensor([2]).cuda()] + one_gt_losses = self.loss(cls_scores, bbox_preds, bbox_preds_refine, + gt_bboxes, gt_labels, img_metas, + gt_bboxes_ignore) + onegt_cls_loss = one_gt_losses['loss_cls'] + onegt_box_loss = one_gt_losses['loss_bbox'] + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_box_loss.item() > 0, 'box loss should be non-zero' diff --git a/tests/test_models/test_dense_heads/test_yolact_head.py b/tests/test_models/test_dense_heads/test_yolact_head.py new file mode 100644 index 0000000..e82e0d7 --- /dev/null +++ b/tests/test_models/test_dense_heads/test_yolact_head.py @@ -0,0 +1,137 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch + +from mmdet.models.dense_heads import YOLACTHead, YOLACTProtonet, YOLACTSegmHead + + +def test_yolact_head_loss(): + """Tests yolact head losses when truth is empty and non-empty.""" + s = 550 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + train_cfg = mmcv.Config( + dict( + assigner=dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.4, + min_pos_iou=0., + ignore_iof_thr=-1, + gt_max_assign_all=False), + smoothl1_beta=1., + allowed_border=-1, + pos_weight=-1, + neg_pos_ratio=3, + debug=False, + min_gt_box_wh=[4.0, 4.0])) + bbox_head = YOLACTHead( + num_classes=80, + in_channels=256, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=3, + scales_per_octave=1, + base_sizes=[8, 16, 32, 64, 128], + ratios=[0.5, 1.0, 2.0], + strides=[550.0 / x for x in [69, 35, 18, 9, 5]], + centers=[(550 * 0.5 / x, 550 * 0.5 / x) + for x in [69, 35, 18, 9, 5]]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2]), + loss_cls=dict( + type='CrossEntropyLoss', + use_sigmoid=False, + reduction='none', + loss_weight=1.0), + loss_bbox=dict(type='SmoothL1Loss', beta=1.0, loss_weight=1.5), + num_head_convs=1, + num_protos=32, + use_ohem=True, + train_cfg=train_cfg) + segm_head = YOLACTSegmHead( + in_channels=256, + num_classes=80, + loss_segm=dict( + type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0)) + mask_head = YOLACTProtonet( + num_classes=80, + in_channels=256, + num_protos=32, + max_masks_to_train=100, + loss_mask_weight=6.125) + feat = [ + torch.rand(1, 256, feat_size, feat_size) + for feat_size in [69, 35, 18, 9, 5] + ] + cls_score, bbox_pred, coeff_pred = bbox_head.forward(feat) + # Test that empty ground truth encourages the network to predict background + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + gt_masks = [torch.empty((0, 550, 550))] + gt_bboxes_ignore = None + empty_gt_losses, sampling_results = bbox_head.loss( + cls_score, + bbox_pred, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + empty_cls_loss = sum(empty_gt_losses['loss_cls']) + empty_box_loss = sum(empty_gt_losses['loss_bbox']) + assert empty_cls_loss.item() > 0, 'cls loss should be non-zero' + assert empty_box_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + + # Test segm head and mask head + segm_head_outs = segm_head(feat[0]) + empty_segm_loss = segm_head.loss(segm_head_outs, gt_masks, gt_labels) + mask_pred = mask_head(feat[0], coeff_pred, gt_bboxes, img_metas, + sampling_results) + empty_mask_loss = mask_head.loss(mask_pred, gt_masks, gt_bboxes, img_metas, + sampling_results) + # When there is no truth, the segm and mask loss should be zero. + empty_segm_loss = sum(empty_segm_loss['loss_segm']) + empty_mask_loss = sum(empty_mask_loss['loss_mask']) + assert empty_segm_loss.item() == 0, ( + 'there should be no segm loss when there are no true boxes') + assert empty_mask_loss == 0, ( + 'there should be no mask loss when there are no true boxes') + + # When truth is non-empty then cls, box, mask, segm loss should be + # nonzero for random inputs. + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + gt_masks = [(torch.rand((1, 550, 550)) > 0.5).float()] + + one_gt_losses, sampling_results = bbox_head.loss( + cls_score, + bbox_pred, + gt_bboxes, + gt_labels, + img_metas, + gt_bboxes_ignore=gt_bboxes_ignore) + one_gt_cls_loss = sum(one_gt_losses['loss_cls']) + one_gt_box_loss = sum(one_gt_losses['loss_bbox']) + assert one_gt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert one_gt_box_loss.item() > 0, 'box loss should be non-zero' + + one_gt_segm_loss = segm_head.loss(segm_head_outs, gt_masks, gt_labels) + mask_pred = mask_head(feat[0], coeff_pred, gt_bboxes, img_metas, + sampling_results) + one_gt_mask_loss = mask_head.loss(mask_pred, gt_masks, gt_bboxes, + img_metas, sampling_results) + one_gt_segm_loss = sum(one_gt_segm_loss['loss_segm']) + one_gt_mask_loss = sum(one_gt_mask_loss['loss_mask']) + assert one_gt_segm_loss.item() > 0, 'segm loss should be non-zero' + assert one_gt_mask_loss.item() > 0, 'mask loss should be non-zero' diff --git a/tests/test_models/test_dense_heads/test_yolof_head.py b/tests/test_models/test_dense_heads/test_yolof_head.py new file mode 100644 index 0000000..9810374 --- /dev/null +++ b/tests/test_models/test_dense_heads/test_yolof_head.py @@ -0,0 +1,76 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch + +from mmdet.models.dense_heads import YOLOFHead + + +def test_yolof_head_loss(): + """Tests yolof head loss when truth is empty and non-empty.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + train_cfg = mmcv.Config( + dict( + assigner=dict( + type='UniformAssigner', + pos_ignore_thr=0.15, + neg_ignore_thr=0.7), + allowed_border=-1, + pos_weight=-1, + debug=False)) + self = YOLOFHead( + num_classes=4, + in_channels=1, + reg_decoded_bbox=True, + train_cfg=train_cfg, + anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[1, 2, 4, 8, 16], + strides=[32]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1., 1., 1., 1.], + add_ctr_clamp=True, + ctr_clamp=32), + loss_cls=dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + loss_bbox=dict(type='GIoULoss', loss_weight=1.0)) + feat = [torch.rand(1, 1, s // 32, s // 32)] + cls_scores, bbox_preds = self.forward(feat) + + # Test that empty ground truth encourages the network to predict background + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + gt_bboxes_ignore = None + empty_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + empty_cls_loss = empty_gt_losses['loss_cls'] + empty_box_loss = empty_gt_losses['loss_bbox'] + assert empty_cls_loss.item() > 0, 'cls loss should be non-zero' + assert empty_box_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + one_gt_losses = self.loss(cls_scores, bbox_preds, gt_bboxes, gt_labels, + img_metas, gt_bboxes_ignore) + onegt_cls_loss = one_gt_losses['loss_cls'] + onegt_box_loss = one_gt_losses['loss_bbox'] + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_box_loss.item() > 0, 'box loss should be non-zero' diff --git a/tests/test_models/test_dense_heads/test_yolox_head.py b/tests/test_models/test_dense_heads/test_yolox_head.py new file mode 100644 index 0000000..f82c8a0 --- /dev/null +++ b/tests/test_models/test_dense_heads/test_yolox_head.py @@ -0,0 +1,88 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch +from mmcv.cnn import ConvModule, DepthwiseSeparableConvModule + +from mmdet.models.dense_heads import YOLOXHead + + +def test_yolox_head_loss(): + """Tests yolox head loss when truth is empty and non-empty.""" + s = 256 + img_metas = [{ + 'img_shape': (s, s, 3), + 'scale_factor': 1, + 'pad_shape': (s, s, 3) + }] + train_cfg = mmcv.Config( + dict( + assigner=dict( + type='SimOTAAssigner', + center_radius=2.5, + candidate_topk=10, + iou_weight=3.0, + cls_weight=1.0))) + self = YOLOXHead( + num_classes=4, in_channels=1, use_depthwise=False, train_cfg=train_cfg) + assert not self.use_l1 + assert isinstance(self.multi_level_cls_convs[0][0], ConvModule) + + feat = [ + torch.rand(1, 1, s // feat_size, s // feat_size) + for feat_size in [4, 8, 16] + ] + cls_scores, bbox_preds, objectnesses = self.forward(feat) + + # Test that empty ground truth encourages the network to predict background + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + empty_gt_losses = self.loss(cls_scores, bbox_preds, objectnesses, + gt_bboxes, gt_labels, img_metas) + # When there is no truth, the cls loss should be nonzero but there should + # be no box loss. + empty_cls_loss = empty_gt_losses['loss_cls'].sum() + empty_box_loss = empty_gt_losses['loss_bbox'].sum() + empty_obj_loss = empty_gt_losses['loss_obj'].sum() + assert empty_cls_loss.item() == 0, ( + 'there should be no cls loss when there are no true boxes') + assert empty_box_loss.item() == 0, ( + 'there should be no box loss when there are no true boxes') + assert empty_obj_loss.item() > 0, 'objectness loss should be non-zero' + + # When truth is non-empty then both cls and box loss should be nonzero for + # random inputs + self = YOLOXHead( + num_classes=4, in_channels=1, use_depthwise=True, train_cfg=train_cfg) + assert isinstance(self.multi_level_cls_convs[0][0], + DepthwiseSeparableConvModule) + self.use_l1 = True + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + one_gt_losses = self.loss(cls_scores, bbox_preds, objectnesses, gt_bboxes, + gt_labels, img_metas) + onegt_cls_loss = one_gt_losses['loss_cls'].sum() + onegt_box_loss = one_gt_losses['loss_bbox'].sum() + onegt_obj_loss = one_gt_losses['loss_obj'].sum() + onegt_l1_loss = one_gt_losses['loss_l1'].sum() + assert onegt_cls_loss.item() > 0, 'cls loss should be non-zero' + assert onegt_box_loss.item() > 0, 'box loss should be non-zero' + assert onegt_obj_loss.item() > 0, 'obj loss should be non-zero' + assert onegt_l1_loss.item() > 0, 'l1 loss should be non-zero' + + # Test groud truth out of bound + gt_bboxes = [torch.Tensor([[s * 4, s * 4, s * 4 + 10, s * 4 + 10]])] + gt_labels = [torch.LongTensor([2])] + empty_gt_losses = self.loss(cls_scores, bbox_preds, objectnesses, + gt_bboxes, gt_labels, img_metas) + # When gt_bboxes out of bound, the assign results should be empty, + # so the cls and bbox loss should be zero. + empty_cls_loss = empty_gt_losses['loss_cls'].sum() + empty_box_loss = empty_gt_losses['loss_bbox'].sum() + empty_obj_loss = empty_gt_losses['loss_obj'].sum() + assert empty_cls_loss.item() == 0, ( + 'there should be no cls loss when gt_bboxes out of bound') + assert empty_box_loss.item() == 0, ( + 'there should be no box loss when gt_bboxes out of bound') + assert empty_obj_loss.item() > 0, 'objectness loss should be non-zero' diff --git a/tests/test_models/test_forward.py b/tests/test_models/test_forward.py new file mode 100644 index 0000000..98f75b8 --- /dev/null +++ b/tests/test_models/test_forward.py @@ -0,0 +1,935 @@ +# Copyright (c) OpenMMLab. All rights reserved. +"""pytest tests/test_forward.py.""" +import copy +from os.path import dirname, exists, join + +import numpy as np +import pytest +import torch + + +def _get_config_directory(): + """Find the predefined detector config directory.""" + try: + # Assume we are running in the source mmdetection repo + repo_dpath = dirname(dirname(dirname(__file__))) + except NameError: + # For IPython development when this __file__ is not defined + import mmdet + repo_dpath = dirname(dirname(mmdet.__file__)) + config_dpath = join(repo_dpath, 'configs') + if not exists(config_dpath): + raise Exception('Cannot find config path') + return config_dpath + + +def _get_config_module(fname): + """Load a configuration as a python module.""" + from mmcv import Config + config_dpath = _get_config_directory() + config_fpath = join(config_dpath, fname) + config_mod = Config.fromfile(config_fpath) + return config_mod + + +def _get_detector_cfg(fname): + """Grab configs necessary to create a detector. + + These are deep copied to allow for safe modification of parameters without + influencing other tests. + """ + config = _get_config_module(fname) + model = copy.deepcopy(config.model) + return model + + +def _replace_r50_with_r18(model): + """Replace ResNet50 with ResNet18 in config.""" + model = copy.deepcopy(model) + if model.backbone.type == 'ResNet': + model.backbone.depth = 18 + model.backbone.base_channels = 2 + model.neck.in_channels = [2, 4, 8, 16] + return model + + +def test_sparse_rcnn_forward(): + config_path = 'sparse_rcnn/sparse_rcnn_r50_fpn_1x_coco.py' + model = _get_detector_cfg(config_path) + model = _replace_r50_with_r18(model) + model.backbone.init_cfg = None + from mmdet.models import build_detector + detector = build_detector(model) + detector.init_weights() + input_shape = (1, 3, 100, 100) + mm_inputs = _demo_mm_inputs(input_shape, num_items=[5]) + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + # Test forward train with non-empty truth batch + detector.train() + gt_bboxes = mm_inputs['gt_bboxes'] + gt_bboxes = [item for item in gt_bboxes] + gt_labels = mm_inputs['gt_labels'] + gt_labels = [item for item in gt_labels] + losses = detector.forward( + imgs, + img_metas, + gt_bboxes=gt_bboxes, + gt_labels=gt_labels, + return_loss=True) + assert isinstance(losses, dict) + loss, _ = detector._parse_losses(losses) + assert float(loss.item()) > 0 + detector.forward_dummy(imgs) + + # Test forward train with an empty truth batch + mm_inputs = _demo_mm_inputs(input_shape, num_items=[0]) + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + gt_bboxes = mm_inputs['gt_bboxes'] + gt_bboxes = [item for item in gt_bboxes] + gt_labels = mm_inputs['gt_labels'] + gt_labels = [item for item in gt_labels] + losses = detector.forward( + imgs, + img_metas, + gt_bboxes=gt_bboxes, + gt_labels=gt_labels, + return_loss=True) + assert isinstance(losses, dict) + loss, _ = detector._parse_losses(losses) + assert float(loss.item()) > 0 + + # Test forward test + detector.eval() + with torch.no_grad(): + img_list = [g[None, :] for g in imgs] + batch_results = [] + for one_img, one_meta in zip(img_list, img_metas): + result = detector.forward([one_img], [[one_meta]], + rescale=True, + return_loss=False) + batch_results.append(result) + + # test empty proposal in roi_head + with torch.no_grad(): + # test no proposal in the whole batch + detector.roi_head.simple_test([imgs[0][None, :]], torch.empty( + (1, 0, 4)), torch.empty((1, 100, 4)), [img_metas[0]], + torch.ones((1, 4))) + + +def test_rpn_forward(): + model = _get_detector_cfg('rpn/rpn_r50_fpn_1x_coco.py') + model = _replace_r50_with_r18(model) + model.backbone.init_cfg = None + + from mmdet.models import build_detector + detector = build_detector(model) + + input_shape = (1, 3, 100, 100) + mm_inputs = _demo_mm_inputs(input_shape) + + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + + # Test forward train + gt_bboxes = mm_inputs['gt_bboxes'] + losses = detector.forward( + imgs, img_metas, gt_bboxes=gt_bboxes, return_loss=True) + assert isinstance(losses, dict) + + # Test forward test + with torch.no_grad(): + img_list = [g[None, :] for g in imgs] + batch_results = [] + for one_img, one_meta in zip(img_list, img_metas): + result = detector.forward([one_img], [[one_meta]], + return_loss=False) + batch_results.append(result) + + +@pytest.mark.parametrize( + 'cfg_file', + [ + 'reppoints/reppoints_moment_r50_fpn_1x_coco.py', + 'retinanet/retinanet_r50_fpn_1x_coco.py', + 'guided_anchoring/ga_retinanet_r50_fpn_1x_coco.py', + 'ghm/retinanet_ghm_r50_fpn_1x_coco.py', + 'fcos/fcos_center_r50_caffe_fpn_gn-head_1x_coco.py', + 'foveabox/fovea_align_r50_fpn_gn-head_4x4_2x_coco.py', + # 'free_anchor/retinanet_free_anchor_r50_fpn_1x_coco.py', + # 'atss/atss_r50_fpn_1x_coco.py', # not ready for topk + 'yolo/yolov3_mobilenetv2_320_300e_coco.py', + 'yolox/yolox_tiny_8x8_300e_coco.py' + ]) +def test_single_stage_forward_gpu(cfg_file): + if not torch.cuda.is_available(): + import pytest + pytest.skip('test requires GPU and torch+cuda') + + model = _get_detector_cfg(cfg_file) + model = _replace_r50_with_r18(model) + model.backbone.init_cfg = None + + from mmdet.models import build_detector + detector = build_detector(model) + + input_shape = (2, 3, 128, 128) + mm_inputs = _demo_mm_inputs(input_shape) + + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + + detector = detector.cuda() + imgs = imgs.cuda() + # Test forward train + gt_bboxes = [b.cuda() for b in mm_inputs['gt_bboxes']] + gt_labels = [g.cuda() for g in mm_inputs['gt_labels']] + losses = detector.forward( + imgs, + img_metas, + gt_bboxes=gt_bboxes, + gt_labels=gt_labels, + return_loss=True) + assert isinstance(losses, dict) + + # Test forward test + detector.eval() + with torch.no_grad(): + img_list = [g[None, :] for g in imgs] + batch_results = [] + for one_img, one_meta in zip(img_list, img_metas): + result = detector.forward([one_img], [[one_meta]], + return_loss=False) + batch_results.append(result) + + +def test_faster_rcnn_ohem_forward(): + model = _get_detector_cfg( + 'faster_rcnn/faster_rcnn_r50_fpn_ohem_1x_coco.py') + model = _replace_r50_with_r18(model) + model.backbone.init_cfg = None + + from mmdet.models import build_detector + detector = build_detector(model) + + input_shape = (1, 3, 100, 100) + + # Test forward train with a non-empty truth batch + mm_inputs = _demo_mm_inputs(input_shape, num_items=[10]) + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + gt_bboxes = mm_inputs['gt_bboxes'] + gt_labels = mm_inputs['gt_labels'] + losses = detector.forward( + imgs, + img_metas, + gt_bboxes=gt_bboxes, + gt_labels=gt_labels, + return_loss=True) + assert isinstance(losses, dict) + loss, _ = detector._parse_losses(losses) + assert float(loss.item()) > 0 + + # Test forward train with an empty truth batch + mm_inputs = _demo_mm_inputs(input_shape, num_items=[0]) + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + gt_bboxes = mm_inputs['gt_bboxes'] + gt_labels = mm_inputs['gt_labels'] + losses = detector.forward( + imgs, + img_metas, + gt_bboxes=gt_bboxes, + gt_labels=gt_labels, + return_loss=True) + assert isinstance(losses, dict) + loss, _ = detector._parse_losses(losses) + assert float(loss.item()) > 0 + + # Test RoI forward train with an empty proposals + feature = detector.extract_feat(imgs[0][None, :]) + losses = detector.roi_head.forward_train( + feature, + img_metas, [torch.empty((0, 5))], + gt_bboxes=gt_bboxes, + gt_labels=gt_labels) + assert isinstance(losses, dict) + + +@pytest.mark.parametrize( + 'cfg_file', + [ + # 'cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py', + 'mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py', + # 'grid_rcnn/grid_rcnn_r50_fpn_gn-head_2x_coco.py', + # 'ms_rcnn/ms_rcnn_r50_fpn_1x_coco.py', + # 'htc/htc_r50_fpn_1x_coco.py', + # 'panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco.py', + # 'scnet/scnet_r50_fpn_20e_coco.py', + # 'seesaw_loss/mask_rcnn_r50_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py' # noqa: E501 + ]) +def test_two_stage_forward(cfg_file): + models_with_semantic = [ + 'htc/htc_r50_fpn_1x_coco.py', + 'panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco.py', + 'scnet/scnet_r50_fpn_20e_coco.py', + ] + if cfg_file in models_with_semantic: + with_semantic = True + else: + with_semantic = False + + model = _get_detector_cfg(cfg_file) + model = _replace_r50_with_r18(model) + model.backbone.init_cfg = None + + # Save cost + if cfg_file in [ + 'seesaw_loss/mask_rcnn_r50_fpn_random_seesaw_loss_normed_mask_mstrain_2x_lvis_v1.py' # noqa: E501 + ]: + model.roi_head.bbox_head.num_classes = 80 + model.roi_head.bbox_head.loss_cls.num_classes = 80 + model.roi_head.mask_head.num_classes = 80 + model.test_cfg.rcnn.score_thr = 0.05 + model.test_cfg.rcnn.max_per_img = 100 + + from mmdet.models import build_detector + detector = build_detector(model) + + input_shape = (1, 3, 128, 128) + + # Test forward train with a non-empty truth batch + mm_inputs = _demo_mm_inputs( + input_shape, num_items=[10], with_semantic=with_semantic) + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + losses = detector.forward(imgs, img_metas, return_loss=True, **mm_inputs) + assert isinstance(losses, dict) + loss, _ = detector._parse_losses(losses) + loss.requires_grad_(True) + assert float(loss.item()) > 0 + loss.backward() + + # Test forward train with an empty truth batch + mm_inputs = _demo_mm_inputs( + input_shape, num_items=[0], with_semantic=with_semantic) + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + losses = detector.forward(imgs, img_metas, return_loss=True, **mm_inputs) + assert isinstance(losses, dict) + loss, _ = detector._parse_losses(losses) + loss.requires_grad_(True) + assert float(loss.item()) > 0 + loss.backward() + + # Test RoI forward train with an empty proposals + if cfg_file in [ + 'panoptic_fpn/panoptic_fpn_r50_fpn_1x_coco.py' # noqa: E501 + ]: + mm_inputs.pop('gt_semantic_seg') + + feature = detector.extract_feat(imgs[0][None, :]) + losses = detector.roi_head.forward_train(feature, img_metas, + [torch.empty( + (0, 5))], **mm_inputs) + assert isinstance(losses, dict) + + # Test forward test + with torch.no_grad(): + img_list = [g[None, :] for g in imgs] + batch_results = [] + for one_img, one_meta in zip(img_list, img_metas): + result = detector.forward([one_img], [[one_meta]], + return_loss=False) + batch_results.append(result) + cascade_models = [ + 'cascade_rcnn/cascade_mask_rcnn_r50_fpn_1x_coco.py', + 'htc/htc_r50_fpn_1x_coco.py', + 'scnet/scnet_r50_fpn_20e_coco.py', + ] + # test empty proposal in roi_head + with torch.no_grad(): + # test no proposal in the whole batch + detector.simple_test( + imgs[0][None, :], [img_metas[0]], proposals=[torch.empty((0, 4))]) + + # test no proposal of aug + features = detector.extract_feats([imgs[0][None, :]] * 2) + detector.roi_head.aug_test(features, [torch.empty((0, 4))] * 2, + [[img_metas[0]]] * 2) + + # test rcnn_test_cfg is None + if cfg_file not in cascade_models: + feature = detector.extract_feat(imgs[0][None, :]) + bboxes, scores = detector.roi_head.simple_test_bboxes( + feature, [img_metas[0]], [torch.empty((0, 4))], None) + assert all([bbox.shape == torch.Size((0, 4)) for bbox in bboxes]) + assert all([ + score.shape == torch.Size( + (0, detector.roi_head.bbox_head.fc_cls.out_features)) + for score in scores + ]) + + # test no proposal in the some image + x1y1 = torch.randint(1, 100, (10, 2)).float() + # x2y2 must be greater than x1y1 + x2y2 = x1y1 + torch.randint(1, 100, (10, 2)) + detector.simple_test( + imgs[0][None, :].repeat(2, 1, 1, 1), [img_metas[0]] * 2, + proposals=[torch.empty((0, 4)), + torch.cat([x1y1, x2y2], dim=-1)]) + + # test no proposal of aug + detector.roi_head.aug_test( + features, [torch.cat([x1y1, x2y2], dim=-1), + torch.empty((0, 4))], [[img_metas[0]]] * 2) + + # test rcnn_test_cfg is None + if cfg_file not in cascade_models: + feature = detector.extract_feat(imgs[0][None, :].repeat( + 2, 1, 1, 1)) + bboxes, scores = detector.roi_head.simple_test_bboxes( + feature, [img_metas[0]] * 2, + [torch.empty((0, 4)), + torch.cat([x1y1, x2y2], dim=-1)], None) + assert bboxes[0].shape == torch.Size((0, 4)) + assert scores[0].shape == torch.Size( + (0, detector.roi_head.bbox_head.fc_cls.out_features)) + + +@pytest.mark.parametrize( + 'cfg_file', ['ghm/retinanet_ghm_r50_fpn_1x_coco.py', 'ssd/ssd300_coco.py']) +def test_single_stage_forward_cpu(cfg_file): + model = _get_detector_cfg(cfg_file) + model = _replace_r50_with_r18(model) + model.backbone.init_cfg = None + + from mmdet.models import build_detector + detector = build_detector(model) + + input_shape = (1, 3, 300, 300) + mm_inputs = _demo_mm_inputs(input_shape) + + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + + # Test forward train + gt_bboxes = mm_inputs['gt_bboxes'] + gt_labels = mm_inputs['gt_labels'] + losses = detector.forward( + imgs, + img_metas, + gt_bboxes=gt_bboxes, + gt_labels=gt_labels, + return_loss=True) + assert isinstance(losses, dict) + + # Test forward test + detector.eval() + with torch.no_grad(): + img_list = [g[None, :] for g in imgs] + batch_results = [] + for one_img, one_meta in zip(img_list, img_metas): + result = detector.forward([one_img], [[one_meta]], + return_loss=False) + batch_results.append(result) + + +def _demo_mm_inputs(input_shape=(1, 3, 300, 300), + num_items=None, num_classes=10, + with_semantic=False): # yapf: disable + """Create a superset of inputs needed to run test or train batches. + + Args: + input_shape (tuple): + input batch dimensions + + num_items (None | List[int]): + specifies the number of boxes in each batch item + + num_classes (int): + number of different labels a box might have + """ + from mmdet.core import BitmapMasks + + (N, C, H, W) = input_shape + + rng = np.random.RandomState(0) + + imgs = rng.rand(*input_shape) + + img_metas = [{ + 'img_shape': (H, W, C), + 'ori_shape': (H, W, C), + 'pad_shape': (H, W, C), + 'filename': '.png', + 'scale_factor': np.array([1.1, 1.2, 1.1, 1.2]), + 'flip': False, + 'flip_direction': None, + } for _ in range(N)] + + gt_bboxes = [] + gt_labels = [] + gt_masks = [] + + for batch_idx in range(N): + if num_items is None: + num_boxes = rng.randint(1, 10) + else: + num_boxes = num_items[batch_idx] + + cx, cy, bw, bh = rng.rand(num_boxes, 4).T + + tl_x = ((cx * W) - (W * bw / 2)).clip(0, W) + tl_y = ((cy * H) - (H * bh / 2)).clip(0, H) + br_x = ((cx * W) + (W * bw / 2)).clip(0, W) + br_y = ((cy * H) + (H * bh / 2)).clip(0, H) + + boxes = np.vstack([tl_x, tl_y, br_x, br_y]).T + class_idxs = rng.randint(1, num_classes, size=num_boxes) + + gt_bboxes.append(torch.FloatTensor(boxes)) + gt_labels.append(torch.LongTensor(class_idxs)) + + mask = np.random.randint(0, 2, (len(boxes), H, W), dtype=np.uint8) + gt_masks.append(BitmapMasks(mask, H, W)) + + mm_inputs = { + 'imgs': torch.FloatTensor(imgs).requires_grad_(True), + 'img_metas': img_metas, + 'gt_bboxes': gt_bboxes, + 'gt_labels': gt_labels, + 'gt_bboxes_ignore': None, + 'gt_masks': gt_masks, + } + + if with_semantic: + # assume gt_semantic_seg using scale 1/8 of the img + gt_semantic_seg = np.random.randint( + 0, num_classes, (1, 1, H // 8, W // 8), dtype=np.uint8) + mm_inputs.update( + {'gt_semantic_seg': torch.ByteTensor(gt_semantic_seg)}) + + return mm_inputs + + +def test_yolact_forward(): + model = _get_detector_cfg('yolact/yolact_r50_1x8_coco.py') + model = _replace_r50_with_r18(model) + model.backbone.init_cfg = None + + from mmdet.models import build_detector + detector = build_detector(model) + + input_shape = (1, 3, 100, 100) + mm_inputs = _demo_mm_inputs(input_shape) + + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + + # Test forward train + detector.train() + gt_bboxes = mm_inputs['gt_bboxes'] + gt_labels = mm_inputs['gt_labels'] + gt_masks = mm_inputs['gt_masks'] + losses = detector.forward( + imgs, + img_metas, + gt_bboxes=gt_bboxes, + gt_labels=gt_labels, + gt_masks=gt_masks, + return_loss=True) + assert isinstance(losses, dict) + + # Test forward dummy for get_flops + detector.forward_dummy(imgs) + + # Test forward test + detector.eval() + with torch.no_grad(): + img_list = [g[None, :] for g in imgs] + batch_results = [] + for one_img, one_meta in zip(img_list, img_metas): + result = detector.forward([one_img], [[one_meta]], + rescale=True, + return_loss=False) + batch_results.append(result) + + +def test_detr_forward(): + model = _get_detector_cfg('detr/detr_r50_8x2_150e_coco.py') + model.backbone.depth = 18 + model.bbox_head.in_channels = 512 + model.backbone.init_cfg = None + + from mmdet.models import build_detector + detector = build_detector(model) + + input_shape = (1, 3, 100, 100) + mm_inputs = _demo_mm_inputs(input_shape) + + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + + # Test forward train with non-empty truth batch + detector.train() + gt_bboxes = mm_inputs['gt_bboxes'] + gt_labels = mm_inputs['gt_labels'] + losses = detector.forward( + imgs, + img_metas, + gt_bboxes=gt_bboxes, + gt_labels=gt_labels, + return_loss=True) + assert isinstance(losses, dict) + loss, _ = detector._parse_losses(losses) + assert float(loss.item()) > 0 + + # Test forward train with an empty truth batch + mm_inputs = _demo_mm_inputs(input_shape, num_items=[0]) + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + gt_bboxes = mm_inputs['gt_bboxes'] + gt_labels = mm_inputs['gt_labels'] + losses = detector.forward( + imgs, + img_metas, + gt_bboxes=gt_bboxes, + gt_labels=gt_labels, + return_loss=True) + assert isinstance(losses, dict) + loss, _ = detector._parse_losses(losses) + assert float(loss.item()) > 0 + + # Test forward test + detector.eval() + with torch.no_grad(): + img_list = [g[None, :] for g in imgs] + batch_results = [] + for one_img, one_meta in zip(img_list, img_metas): + result = detector.forward([one_img], [[one_meta]], + rescale=True, + return_loss=False) + batch_results.append(result) + + +def test_inference_detector(): + from mmcv import ConfigDict + + from mmdet.apis import inference_detector + from mmdet.models import build_detector + + # small RetinaNet + num_class = 3 + model_dict = dict( + type='RetinaNet', + backbone=dict( + type='ResNet', + depth=18, + num_stages=4, + out_indices=(3, ), + norm_cfg=dict(type='BN', requires_grad=False), + norm_eval=True, + style='pytorch'), + neck=None, + bbox_head=dict( + type='RetinaHead', + num_classes=num_class, + in_channels=512, + stacked_convs=1, + feat_channels=256, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5], + strides=[32]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0]), + ), + test_cfg=dict( + nms_pre=1000, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) + + rng = np.random.RandomState(0) + img1 = rng.rand(100, 100, 3) + img2 = rng.rand(100, 100, 3) + + model = build_detector(ConfigDict(model_dict)) + config = _get_config_module('retinanet/retinanet_r50_fpn_1x_coco.py') + model.cfg = config + # test single image + result = inference_detector(model, img1) + assert len(result) == num_class + # test multiple image + result = inference_detector(model, [img1, img2]) + assert len(result) == 2 and len(result[0]) == num_class + + +def test_yolox_random_size(): + from mmdet.models import build_detector + model = _get_detector_cfg('yolox/yolox_tiny_8x8_300e_coco.py') + model.random_size_range = (2, 2) + model.input_size = (64, 96) + model.random_size_interval = 1 + + detector = build_detector(model) + input_shape = (1, 3, 64, 64) + mm_inputs = _demo_mm_inputs(input_shape) + + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + + # Test forward train with non-empty truth batch + detector.train() + gt_bboxes = mm_inputs['gt_bboxes'] + gt_labels = mm_inputs['gt_labels'] + detector.forward( + imgs, + img_metas, + gt_bboxes=gt_bboxes, + gt_labels=gt_labels, + return_loss=True) + assert detector._input_size == (64, 96) + + +def test_maskformer_forward(): + model_cfg = _get_detector_cfg( + 'maskformer/maskformer_r50_mstrain_16x1_75e_coco.py') + base_channels = 32 + model_cfg.backbone.depth = 18 + model_cfg.backbone.init_cfg = None + model_cfg.backbone.base_channels = base_channels + model_cfg.panoptic_head.in_channels = [ + base_channels * 2**i for i in range(4) + ] + model_cfg.panoptic_head.feat_channels = base_channels + model_cfg.panoptic_head.out_channels = base_channels + model_cfg.panoptic_head.pixel_decoder.encoder.\ + transformerlayers.attn_cfgs.embed_dims = base_channels + model_cfg.panoptic_head.pixel_decoder.encoder.\ + transformerlayers.ffn_cfgs.embed_dims = base_channels + model_cfg.panoptic_head.pixel_decoder.encoder.\ + transformerlayers.ffn_cfgs.feedforward_channels = base_channels * 8 + model_cfg.panoptic_head.pixel_decoder.\ + positional_encoding.num_feats = base_channels // 2 + model_cfg.panoptic_head.positional_encoding.\ + num_feats = base_channels // 2 + model_cfg.panoptic_head.transformer_decoder.\ + transformerlayers.attn_cfgs.embed_dims = base_channels + model_cfg.panoptic_head.transformer_decoder.\ + transformerlayers.ffn_cfgs.embed_dims = base_channels + model_cfg.panoptic_head.transformer_decoder.\ + transformerlayers.ffn_cfgs.feedforward_channels = base_channels * 8 + model_cfg.panoptic_head.transformer_decoder.\ + transformerlayers.feedforward_channels = base_channels * 8 + + from mmdet.core import BitmapMasks + from mmdet.models import build_detector + detector = build_detector(model_cfg) + + # Test forward train with non-empty truth batch + detector.train() + img_metas = [ + { + 'batch_input_shape': (128, 160), + 'img_shape': (126, 160, 3), + 'ori_shape': (63, 80, 3), + 'pad_shape': (128, 160, 3) + }, + ] + img = torch.rand((1, 3, 128, 160)) + gt_bboxes = None + gt_labels = [ + torch.tensor([10]).long(), + ] + thing_mask1 = np.zeros((1, 128, 160), dtype=np.int32) + thing_mask1[0, :50] = 1 + gt_masks = [ + BitmapMasks(thing_mask1, 128, 160), + ] + stuff_mask1 = torch.zeros((1, 128, 160)).long() + stuff_mask1[0, :50] = 10 + stuff_mask1[0, 50:] = 100 + gt_semantic_seg = [ + stuff_mask1, + ] + losses = detector.forward( + img=img, + img_metas=img_metas, + gt_bboxes=gt_bboxes, + gt_labels=gt_labels, + gt_masks=gt_masks, + gt_semantic_seg=gt_semantic_seg, + return_loss=True) + assert isinstance(losses, dict) + loss, _ = detector._parse_losses(losses) + assert float(loss.item()) > 0 + + # Test forward train with an empty truth batch + gt_bboxes = [ + torch.empty((0, 4)).float(), + ] + gt_labels = [ + torch.empty((0, )).long(), + ] + mask = np.zeros((0, 128, 160), dtype=np.uint8) + gt_masks = [ + BitmapMasks(mask, 128, 160), + ] + gt_semantic_seg = [ + torch.randint(0, 133, (0, 128, 160)), + ] + losses = detector.forward( + img, + img_metas, + gt_bboxes=gt_bboxes, + gt_labels=gt_labels, + gt_masks=gt_masks, + gt_semantic_seg=gt_semantic_seg, + return_loss=True) + assert isinstance(losses, dict) + loss, _ = detector._parse_losses(losses) + assert float(loss.item()) > 0 + + # Test forward test + detector.eval() + with torch.no_grad(): + img_list = [g[None, :] for g in img] + batch_results = [] + for one_img, one_meta in zip(img_list, img_metas): + result = detector.forward([one_img], [[one_meta]], + rescale=True, + return_loss=False) + batch_results.append(result) + + +@pytest.mark.parametrize('cfg_file', [ + 'mask2former/mask2former_r50_lsj_8x2_50e_coco.py', + 'mask2former/mask2former_r50_lsj_8x2_50e_coco-panoptic.py' +]) +def test_mask2former_forward(cfg_file): + # Test Panoptic Segmentation and Instance Segmentation + model_cfg = _get_detector_cfg(cfg_file) + base_channels = 32 + model_cfg.backbone.depth = 18 + model_cfg.backbone.init_cfg = None + model_cfg.backbone.base_channels = base_channels + model_cfg.panoptic_head.in_channels = [ + base_channels * 2**i for i in range(4) + ] + model_cfg.panoptic_head.feat_channels = base_channels + model_cfg.panoptic_head.out_channels = base_channels + model_cfg.panoptic_head.pixel_decoder.encoder.\ + transformerlayers.attn_cfgs.embed_dims = base_channels + model_cfg.panoptic_head.pixel_decoder.encoder.\ + transformerlayers.ffn_cfgs.embed_dims = base_channels + model_cfg.panoptic_head.pixel_decoder.encoder.\ + transformerlayers.ffn_cfgs.feedforward_channels = base_channels * 4 + model_cfg.panoptic_head.pixel_decoder.\ + positional_encoding.num_feats = base_channels // 2 + model_cfg.panoptic_head.positional_encoding.\ + num_feats = base_channels // 2 + model_cfg.panoptic_head.transformer_decoder.\ + transformerlayers.attn_cfgs.embed_dims = base_channels + model_cfg.panoptic_head.transformer_decoder.\ + transformerlayers.ffn_cfgs.embed_dims = base_channels + model_cfg.panoptic_head.transformer_decoder.\ + transformerlayers.ffn_cfgs.feedforward_channels = base_channels * 8 + model_cfg.panoptic_head.transformer_decoder.\ + transformerlayers.feedforward_channels = base_channels * 8 + + num_stuff_classes = model_cfg.panoptic_head.num_stuff_classes + + from mmdet.core import BitmapMasks + from mmdet.models import build_detector + detector = build_detector(model_cfg) + + def _forward_train(): + losses = detector.forward( + img, + img_metas, + gt_bboxes=gt_bboxes, + gt_labels=gt_labels, + gt_masks=gt_masks, + gt_semantic_seg=gt_semantic_seg, + return_loss=True) + assert isinstance(losses, dict) + loss, _ = detector._parse_losses(losses) + assert float(loss.item()) > 0 + + # Test forward train with non-empty truth batch + detector.train() + img_metas = [ + { + 'batch_input_shape': (128, 160), + 'img_shape': (126, 160, 3), + 'ori_shape': (63, 80, 3), + 'pad_shape': (128, 160, 3) + }, + ] + img = torch.rand((1, 3, 128, 160)) + gt_bboxes = None + gt_labels = [ + torch.tensor([10]).long(), + ] + thing_mask1 = np.zeros((1, 128, 160), dtype=np.int32) + thing_mask1[0, :50] = 1 + gt_masks = [ + BitmapMasks(thing_mask1, 128, 160), + ] + stuff_mask1 = torch.zeros((1, 128, 160)).long() + stuff_mask1[0, :50] = 10 + stuff_mask1[0, 50:] = 100 + gt_semantic_seg = [ + stuff_mask1, + ] + _forward_train() + + # Test forward train with non-empty truth batch and gt_semantic_seg=None + gt_semantic_seg = None + _forward_train() + + # Test forward train with an empty truth batch + gt_bboxes = [ + torch.empty((0, 4)).float(), + ] + gt_labels = [ + torch.empty((0, )).long(), + ] + mask = np.zeros((0, 128, 160), dtype=np.uint8) + gt_masks = [ + BitmapMasks(mask, 128, 160), + ] + gt_semantic_seg = [ + torch.randint(0, 133, (0, 128, 160)), + ] + _forward_train() + + # Test forward train with an empty truth batch and gt_semantic_seg=None + gt_semantic_seg = None + _forward_train() + + # Test forward test + detector.eval() + with torch.no_grad(): + img_list = [g[None, :] for g in img] + batch_results = [] + for one_img, one_meta in zip(img_list, img_metas): + result = detector.forward([one_img], [[one_meta]], + rescale=True, + return_loss=False) + + if num_stuff_classes > 0: + assert isinstance(result[0], dict) + else: + assert isinstance(result[0], tuple) + + batch_results.append(result) diff --git a/tests/test_models/test_loss.py b/tests/test_models/test_loss.py new file mode 100644 index 0000000..280f3f6 --- /dev/null +++ b/tests/test_models/test_loss.py @@ -0,0 +1,232 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch +from mmcv.utils import digit_version + +from mmdet.models.losses import (BalancedL1Loss, CrossEntropyLoss, DiceLoss, + DistributionFocalLoss, FocalLoss, + GaussianFocalLoss, + KnowledgeDistillationKLDivLoss, L1Loss, + MSELoss, QualityFocalLoss, SeesawLoss, + SmoothL1Loss, VarifocalLoss) +from mmdet.models.losses.ghm_loss import GHMC, GHMR +from mmdet.models.losses.iou_loss import (BoundedIoULoss, CIoULoss, DIoULoss, + GIoULoss, IoULoss) + + +@pytest.mark.parametrize( + 'loss_class', [IoULoss, BoundedIoULoss, GIoULoss, DIoULoss, CIoULoss]) +def test_iou_type_loss_zeros_weight(loss_class): + pred = torch.rand((10, 4)) + target = torch.rand((10, 4)) + weight = torch.zeros(10) + + loss = loss_class()(pred, target, weight) + assert loss == 0. + + +@pytest.mark.parametrize('loss_class', [ + BalancedL1Loss, BoundedIoULoss, CIoULoss, CrossEntropyLoss, DIoULoss, + FocalLoss, DistributionFocalLoss, MSELoss, SeesawLoss, GaussianFocalLoss, + GIoULoss, IoULoss, L1Loss, QualityFocalLoss, VarifocalLoss, GHMR, GHMC, + SmoothL1Loss, KnowledgeDistillationKLDivLoss, DiceLoss +]) +def test_loss_with_reduction_override(loss_class): + pred = torch.rand((10, 4)) + target = torch.rand((10, 4)), + weight = None + + with pytest.raises(AssertionError): + # only reduction_override from [None, 'none', 'mean', 'sum'] + # is not allowed + reduction_override = True + loss_class()( + pred, target, weight, reduction_override=reduction_override) + + +@pytest.mark.parametrize('loss_class', [ + IoULoss, BoundedIoULoss, GIoULoss, DIoULoss, CIoULoss, MSELoss, L1Loss, + SmoothL1Loss, BalancedL1Loss +]) +@pytest.mark.parametrize('input_shape', [(10, 4), (0, 4)]) +def test_regression_losses(loss_class, input_shape): + pred = torch.rand(input_shape) + target = torch.rand(input_shape) + weight = torch.rand(input_shape) + + # Test loss forward + loss = loss_class()(pred, target) + assert isinstance(loss, torch.Tensor) + + # Test loss forward with weight + loss = loss_class()(pred, target, weight) + assert isinstance(loss, torch.Tensor) + + # Test loss forward with reduction_override + loss = loss_class()(pred, target, reduction_override='mean') + assert isinstance(loss, torch.Tensor) + + # Test loss forward with avg_factor + loss = loss_class()(pred, target, avg_factor=10) + assert isinstance(loss, torch.Tensor) + + with pytest.raises(ValueError): + # loss can evaluate with avg_factor only if + # reduction is None, 'none' or 'mean'. + reduction_override = 'sum' + loss_class()( + pred, target, avg_factor=10, reduction_override=reduction_override) + + # Test loss forward with avg_factor and reduction + for reduction_override in [None, 'none', 'mean']: + loss_class()( + pred, target, avg_factor=10, reduction_override=reduction_override) + assert isinstance(loss, torch.Tensor) + + +@pytest.mark.parametrize('loss_class', [FocalLoss, CrossEntropyLoss]) +@pytest.mark.parametrize('input_shape', [(10, 5), (0, 5)]) +def test_classification_losses(loss_class, input_shape): + if input_shape[0] == 0 and digit_version( + torch.__version__) < digit_version('1.5.0'): + pytest.skip( + f'CELoss in PyTorch {torch.__version__} does not support empty' + f'tensor.') + + pred = torch.rand(input_shape) + target = torch.randint(0, 5, (input_shape[0], )) + + # Test loss forward + loss = loss_class()(pred, target) + assert isinstance(loss, torch.Tensor) + + # Test loss forward with reduction_override + loss = loss_class()(pred, target, reduction_override='mean') + assert isinstance(loss, torch.Tensor) + + # Test loss forward with avg_factor + loss = loss_class()(pred, target, avg_factor=10) + assert isinstance(loss, torch.Tensor) + + with pytest.raises(ValueError): + # loss can evaluate with avg_factor only if + # reduction is None, 'none' or 'mean'. + reduction_override = 'sum' + loss_class()( + pred, target, avg_factor=10, reduction_override=reduction_override) + + # Test loss forward with avg_factor and reduction + for reduction_override in [None, 'none', 'mean']: + loss_class()( + pred, target, avg_factor=10, reduction_override=reduction_override) + assert isinstance(loss, torch.Tensor) + + +@pytest.mark.parametrize('loss_class', [GHMR]) +@pytest.mark.parametrize('input_shape', [(10, 4), (0, 4)]) +def test_GHMR_loss(loss_class, input_shape): + pred = torch.rand(input_shape) + target = torch.rand(input_shape) + weight = torch.rand(input_shape) + + # Test loss forward + loss = loss_class()(pred, target, weight) + assert isinstance(loss, torch.Tensor) + + +@pytest.mark.parametrize('use_sigmoid', [True, False]) +@pytest.mark.parametrize('reduction', ['sum', 'mean', None]) +@pytest.mark.parametrize('avg_non_ignore', [True, False]) +def test_loss_with_ignore_index(use_sigmoid, reduction, avg_non_ignore): + # Test cross_entropy loss + loss_class = CrossEntropyLoss( + use_sigmoid=use_sigmoid, + use_mask=False, + ignore_index=255, + avg_non_ignore=avg_non_ignore) + pred = torch.rand((10, 5)) + target = torch.randint(0, 5, (10, )) + + ignored_indices = torch.randint(0, 10, (2, ), dtype=torch.long) + target[ignored_indices] = 255 + + # Test loss forward with default ignore + loss_with_ignore = loss_class(pred, target, reduction_override=reduction) + assert isinstance(loss_with_ignore, torch.Tensor) + + # Test loss forward with forward ignore + target[ignored_indices] = 255 + loss_with_forward_ignore = loss_class( + pred, target, ignore_index=255, reduction_override=reduction) + assert isinstance(loss_with_forward_ignore, torch.Tensor) + + # Verify correctness + if avg_non_ignore: + # manually remove the ignored elements + not_ignored_indices = (target != 255) + pred = pred[not_ignored_indices] + target = target[not_ignored_indices] + loss = loss_class(pred, target, reduction_override=reduction) + + assert torch.allclose(loss, loss_with_ignore) + assert torch.allclose(loss, loss_with_forward_ignore) + + # test ignore all target + pred = torch.rand((10, 5)) + target = torch.ones((10, ), dtype=torch.long) * 255 + loss = loss_class(pred, target, reduction_override=reduction) + assert loss == 0 + + +@pytest.mark.parametrize('naive_dice', [True, False]) +def test_dice_loss(naive_dice): + loss_class = DiceLoss + pred = torch.rand((10, 4, 4)) + target = torch.rand((10, 4, 4)) + weight = torch.rand((10)) + + # Test loss forward + loss = loss_class(naive_dice=naive_dice)(pred, target) + assert isinstance(loss, torch.Tensor) + + # Test loss forward with weight + loss = loss_class(naive_dice=naive_dice)(pred, target, weight) + assert isinstance(loss, torch.Tensor) + + # Test loss forward with reduction_override + loss = loss_class(naive_dice=naive_dice)( + pred, target, reduction_override='mean') + assert isinstance(loss, torch.Tensor) + + # Test loss forward with avg_factor + loss = loss_class(naive_dice=naive_dice)(pred, target, avg_factor=10) + assert isinstance(loss, torch.Tensor) + + with pytest.raises(ValueError): + # loss can evaluate with avg_factor only if + # reduction is None, 'none' or 'mean'. + reduction_override = 'sum' + loss_class(naive_dice=naive_dice)( + pred, target, avg_factor=10, reduction_override=reduction_override) + + # Test loss forward with avg_factor and reduction + for reduction_override in [None, 'none', 'mean']: + loss_class(naive_dice=naive_dice)( + pred, target, avg_factor=10, reduction_override=reduction_override) + assert isinstance(loss, torch.Tensor) + + # Test loss forward with has_acted=False and use_sigmoid=False + with pytest.raises(NotImplementedError): + loss_class( + use_sigmoid=False, activate=True, naive_dice=naive_dice)(pred, + target) + + # Test loss forward with weight.ndim != loss.ndim + with pytest.raises(AssertionError): + weight = torch.rand((2, 8)) + loss_class(naive_dice=naive_dice)(pred, target, weight) + + # Test loss forward with len(weight) != len(pred) + with pytest.raises(AssertionError): + weight = torch.rand((8)) + loss_class(naive_dice=naive_dice)(pred, target, weight) diff --git a/tests/test_models/test_loss_compatibility.py b/tests/test_models/test_loss_compatibility.py new file mode 100644 index 0000000..97759b8 --- /dev/null +++ b/tests/test_models/test_loss_compatibility.py @@ -0,0 +1,201 @@ +# Copyright (c) OpenMMLab. All rights reserved. +"""pytest tests/test_loss_compatibility.py.""" +import copy +from os.path import dirname, exists, join + +import numpy as np +import pytest +import torch + + +def _get_config_directory(): + """Find the predefined detector config directory.""" + try: + # Assume we are running in the source mmdetection repo + repo_dpath = dirname(dirname(dirname(__file__))) + except NameError: + # For IPython development when this __file__ is not defined + import mmdet + repo_dpath = dirname(dirname(mmdet.__file__)) + config_dpath = join(repo_dpath, 'configs') + if not exists(config_dpath): + raise Exception('Cannot find config path') + return config_dpath + + +def _get_config_module(fname): + """Load a configuration as a python module.""" + from mmcv import Config + config_dpath = _get_config_directory() + config_fpath = join(config_dpath, fname) + config_mod = Config.fromfile(config_fpath) + return config_mod + + +def _get_detector_cfg(fname): + """Grab configs necessary to create a detector. + + These are deep copied to allow for safe modification of parameters without + influencing other tests. + """ + config = _get_config_module(fname) + model = copy.deepcopy(config.model) + return model + + +@pytest.mark.parametrize('loss_bbox', [ + dict(type='L1Loss', loss_weight=1.0), + dict(type='GHMR', mu=0.02, bins=10, momentum=0.7, loss_weight=10.0), + dict(type='IoULoss', loss_weight=1.0), + dict(type='BoundedIoULoss', loss_weight=1.0), + dict(type='GIoULoss', loss_weight=1.0), + dict(type='DIoULoss', loss_weight=1.0), + dict(type='CIoULoss', loss_weight=1.0), + dict(type='MSELoss', loss_weight=1.0), + dict(type='SmoothL1Loss', loss_weight=1.0), + dict(type='BalancedL1Loss', loss_weight=1.0) +]) +def test_bbox_loss_compatibility(loss_bbox): + """Test loss_bbox compatibility. + + Using Faster R-CNN as a sample, modifying the loss function in the config + file to verify the compatibility of Loss APIS + """ + # Faster R-CNN config dict + config_path = '_base_/models/faster_rcnn_r50_fpn.py' + cfg_model = _get_detector_cfg(config_path) + + input_shape = (1, 3, 256, 256) + mm_inputs = _demo_mm_inputs(input_shape, num_items=[10]) + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + + if 'IoULoss' in loss_bbox['type']: + cfg_model.roi_head.bbox_head.reg_decoded_bbox = True + + cfg_model.roi_head.bbox_head.loss_bbox = loss_bbox + + from mmdet.models import build_detector + detector = build_detector(cfg_model) + + loss = detector.forward(imgs, img_metas, return_loss=True, **mm_inputs) + assert isinstance(loss, dict) + loss, _ = detector._parse_losses(loss) + assert float(loss.item()) > 0 + + +@pytest.mark.parametrize('loss_cls', [ + dict(type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0), + dict( + type='FocalLoss', + use_sigmoid=True, + gamma=2.0, + alpha=0.25, + loss_weight=1.0), + dict( + type='GHMC', bins=30, momentum=0.75, use_sigmoid=True, loss_weight=1.0) +]) +def test_cls_loss_compatibility(loss_cls): + """Test loss_cls compatibility. + + Using Faster R-CNN as a sample, modifying the loss function in the config + file to verify the compatibility of Loss APIS + """ + # Faster R-CNN config dict + config_path = '_base_/models/faster_rcnn_r50_fpn.py' + cfg_model = _get_detector_cfg(config_path) + + input_shape = (1, 3, 256, 256) + mm_inputs = _demo_mm_inputs(input_shape, num_items=[10]) + imgs = mm_inputs.pop('imgs') + img_metas = mm_inputs.pop('img_metas') + + # verify class loss function compatibility + # for loss_cls in loss_clses: + cfg_model.roi_head.bbox_head.loss_cls = loss_cls + + from mmdet.models import build_detector + detector = build_detector(cfg_model) + + loss = detector.forward(imgs, img_metas, return_loss=True, **mm_inputs) + assert isinstance(loss, dict) + loss, _ = detector._parse_losses(loss) + assert float(loss.item()) > 0 + + +def _demo_mm_inputs(input_shape=(1, 3, 300, 300), + num_items=None, num_classes=10, + with_semantic=False): # yapf: disable + """Create a superset of inputs needed to run test or train batches. + + Args: + input_shape (tuple): + input batch dimensions + + num_items (None | List[int]): + specifies the number of boxes in each batch item + + num_classes (int): + number of different labels a box might have + """ + from mmdet.core import BitmapMasks + + (N, C, H, W) = input_shape + + rng = np.random.RandomState(0) + + imgs = rng.rand(*input_shape) + + img_metas = [{ + 'img_shape': (H, W, C), + 'ori_shape': (H, W, C), + 'pad_shape': (H, W, C), + 'filename': '.png', + 'scale_factor': np.array([1.1, 1.2, 1.1, 1.2]), + 'flip': False, + 'flip_direction': None, + } for _ in range(N)] + + gt_bboxes = [] + gt_labels = [] + gt_masks = [] + + for batch_idx in range(N): + if num_items is None: + num_boxes = rng.randint(1, 10) + else: + num_boxes = num_items[batch_idx] + + cx, cy, bw, bh = rng.rand(num_boxes, 4).T + + tl_x = ((cx * W) - (W * bw / 2)).clip(0, W) + tl_y = ((cy * H) - (H * bh / 2)).clip(0, H) + br_x = ((cx * W) + (W * bw / 2)).clip(0, W) + br_y = ((cy * H) + (H * bh / 2)).clip(0, H) + + boxes = np.vstack([tl_x, tl_y, br_x, br_y]).T + class_idxs = rng.randint(1, num_classes, size=num_boxes) + + gt_bboxes.append(torch.FloatTensor(boxes)) + gt_labels.append(torch.LongTensor(class_idxs)) + + mask = np.random.randint(0, 2, (len(boxes), H, W), dtype=np.uint8) + gt_masks.append(BitmapMasks(mask, H, W)) + + mm_inputs = { + 'imgs': torch.FloatTensor(imgs).requires_grad_(True), + 'img_metas': img_metas, + 'gt_bboxes': gt_bboxes, + 'gt_labels': gt_labels, + 'gt_bboxes_ignore': None, + 'gt_masks': gt_masks, + } + + if with_semantic: + # assume gt_semantic_seg using scale 1/8 of the img + gt_semantic_seg = np.random.randint( + 0, num_classes, (1, 1, H // 8, W // 8), dtype=np.uint8) + mm_inputs.update( + {'gt_semantic_seg': torch.ByteTensor(gt_semantic_seg)}) + + return mm_inputs diff --git a/tests/test_models/test_necks.py b/tests/test_models/test_necks.py new file mode 100644 index 0000000..ff8c78d --- /dev/null +++ b/tests/test_models/test_necks.py @@ -0,0 +1,673 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch +from torch.nn.modules.batchnorm import _BatchNorm + +from mmdet.models.necks import (FPG, FPN, FPN_CARAFE, NASFCOS_FPN, NASFPN, + YOLOXPAFPN, ChannelMapper, CTResNetNeck, + DilatedEncoder, DyHead, SSDNeck, YOLOV3Neck) + + +def test_fpn(): + """Tests fpn.""" + s = 64 + in_channels = [8, 16, 32, 64] + feat_sizes = [s // 2**i for i in range(4)] # [64, 32, 16, 8] + out_channels = 8 + + # end_level=-1 is equal to end_level=3 + FPN(in_channels=in_channels, + out_channels=out_channels, + start_level=0, + end_level=-1, + num_outs=5) + FPN(in_channels=in_channels, + out_channels=out_channels, + start_level=0, + end_level=3, + num_outs=5) + + # `num_outs` is not equal to end_level - start_level + 1 + with pytest.raises(AssertionError): + FPN(in_channels=in_channels, + out_channels=out_channels, + start_level=1, + end_level=2, + num_outs=3) + + # `num_outs` is not equal to len(in_channels) - start_level + with pytest.raises(AssertionError): + FPN(in_channels=in_channels, + out_channels=out_channels, + start_level=1, + num_outs=2) + + # `end_level` is larger than len(in_channels) - 1 + with pytest.raises(AssertionError): + FPN(in_channels=in_channels, + out_channels=out_channels, + start_level=1, + end_level=4, + num_outs=2) + + # `num_outs` is not equal to end_level - start_level + with pytest.raises(AssertionError): + FPN(in_channels=in_channels, + out_channels=out_channels, + start_level=1, + end_level=3, + num_outs=1) + + # Invalid `add_extra_convs` option + with pytest.raises(AssertionError): + FPN(in_channels=in_channels, + out_channels=out_channels, + start_level=1, + add_extra_convs='on_xxx', + num_outs=5) + + fpn_model = FPN( + in_channels=in_channels, + out_channels=out_channels, + start_level=1, + add_extra_convs=True, + num_outs=5) + + # FPN expects a multiple levels of features per image + feats = [ + torch.rand(1, in_channels[i], feat_sizes[i], feat_sizes[i]) + for i in range(len(in_channels)) + ] + outs = fpn_model(feats) + assert fpn_model.add_extra_convs == 'on_input' + assert len(outs) == fpn_model.num_outs + for i in range(fpn_model.num_outs): + outs[i].shape[1] == out_channels + outs[i].shape[2] == outs[i].shape[3] == s // (2**i) + + # Tests for fpn with no extra convs (pooling is used instead) + fpn_model = FPN( + in_channels=in_channels, + out_channels=out_channels, + start_level=1, + add_extra_convs=False, + num_outs=5) + outs = fpn_model(feats) + assert len(outs) == fpn_model.num_outs + assert not fpn_model.add_extra_convs + for i in range(fpn_model.num_outs): + outs[i].shape[1] == out_channels + outs[i].shape[2] == outs[i].shape[3] == s // (2**i) + + # Tests for fpn with lateral bns + fpn_model = FPN( + in_channels=in_channels, + out_channels=out_channels, + start_level=1, + add_extra_convs=True, + no_norm_on_lateral=False, + norm_cfg=dict(type='BN', requires_grad=True), + num_outs=5) + outs = fpn_model(feats) + assert len(outs) == fpn_model.num_outs + assert fpn_model.add_extra_convs == 'on_input' + for i in range(fpn_model.num_outs): + outs[i].shape[1] == out_channels + outs[i].shape[2] == outs[i].shape[3] == s // (2**i) + bn_exist = False + for m in fpn_model.modules(): + if isinstance(m, _BatchNorm): + bn_exist = True + assert bn_exist + + # Bilinear upsample + fpn_model = FPN( + in_channels=in_channels, + out_channels=out_channels, + start_level=1, + add_extra_convs=True, + upsample_cfg=dict(mode='bilinear', align_corners=True), + num_outs=5) + fpn_model(feats) + outs = fpn_model(feats) + assert len(outs) == fpn_model.num_outs + assert fpn_model.add_extra_convs == 'on_input' + for i in range(fpn_model.num_outs): + outs[i].shape[1] == out_channels + outs[i].shape[2] == outs[i].shape[3] == s // (2**i) + + # Scale factor instead of fixed upsample size upsample + fpn_model = FPN( + in_channels=in_channels, + out_channels=out_channels, + start_level=1, + add_extra_convs=True, + upsample_cfg=dict(scale_factor=2), + num_outs=5) + outs = fpn_model(feats) + assert len(outs) == fpn_model.num_outs + for i in range(fpn_model.num_outs): + outs[i].shape[1] == out_channels + outs[i].shape[2] == outs[i].shape[3] == s // (2**i) + + # Extra convs source is 'inputs' + fpn_model = FPN( + in_channels=in_channels, + out_channels=out_channels, + add_extra_convs='on_input', + start_level=1, + num_outs=5) + assert fpn_model.add_extra_convs == 'on_input' + outs = fpn_model(feats) + assert len(outs) == fpn_model.num_outs + for i in range(fpn_model.num_outs): + outs[i].shape[1] == out_channels + outs[i].shape[2] == outs[i].shape[3] == s // (2**i) + + # Extra convs source is 'laterals' + fpn_model = FPN( + in_channels=in_channels, + out_channels=out_channels, + add_extra_convs='on_lateral', + start_level=1, + num_outs=5) + assert fpn_model.add_extra_convs == 'on_lateral' + outs = fpn_model(feats) + assert len(outs) == fpn_model.num_outs + for i in range(fpn_model.num_outs): + outs[i].shape[1] == out_channels + outs[i].shape[2] == outs[i].shape[3] == s // (2**i) + + # Extra convs source is 'outputs' + fpn_model = FPN( + in_channels=in_channels, + out_channels=out_channels, + add_extra_convs='on_output', + start_level=1, + num_outs=5) + assert fpn_model.add_extra_convs == 'on_output' + outs = fpn_model(feats) + assert len(outs) == fpn_model.num_outs + for i in range(fpn_model.num_outs): + outs[i].shape[1] == out_channels + outs[i].shape[2] == outs[i].shape[3] == s // (2**i) + + +def test_channel_mapper(): + """Tests ChannelMapper.""" + s = 64 + in_channels = [8, 16, 32, 64] + feat_sizes = [s // 2**i for i in range(4)] # [64, 32, 16, 8] + out_channels = 8 + kernel_size = 3 + feats = [ + torch.rand(1, in_channels[i], feat_sizes[i], feat_sizes[i]) + for i in range(len(in_channels)) + ] + + # in_channels must be a list + with pytest.raises(AssertionError): + channel_mapper = ChannelMapper( + in_channels=10, out_channels=out_channels, kernel_size=kernel_size) + # the length of channel_mapper's inputs must be equal to the length of + # in_channels + with pytest.raises(AssertionError): + channel_mapper = ChannelMapper( + in_channels=in_channels[:-1], + out_channels=out_channels, + kernel_size=kernel_size) + channel_mapper(feats) + + channel_mapper = ChannelMapper( + in_channels=in_channels, + out_channels=out_channels, + kernel_size=kernel_size) + + outs = channel_mapper(feats) + assert len(outs) == len(feats) + for i in range(len(feats)): + outs[i].shape[1] == out_channels + outs[i].shape[2] == outs[i].shape[3] == s // (2**i) + + +def test_dilated_encoder(): + in_channels = 16 + out_channels = 32 + out_shape = 34 + dilated_encoder = DilatedEncoder(in_channels, out_channels, 16, 2, + [2, 4, 6, 8]) + feat = [torch.rand(1, in_channels, 34, 34)] + out_feat = dilated_encoder(feat)[0] + assert out_feat.shape == (1, out_channels, out_shape, out_shape) + + +def test_ct_resnet_neck(): + # num_filters/num_kernels must be a list + with pytest.raises(TypeError): + CTResNetNeck( + in_channel=10, num_deconv_filters=10, num_deconv_kernels=4) + + # num_filters/num_kernels must be same length + with pytest.raises(AssertionError): + CTResNetNeck( + in_channel=10, + num_deconv_filters=(10, 10), + num_deconv_kernels=(4, )) + + in_channels = 16 + num_filters = (8, 8) + num_kernels = (4, 4) + feat = torch.rand(1, 16, 4, 4) + ct_resnet_neck = CTResNetNeck( + in_channel=in_channels, + num_deconv_filters=num_filters, + num_deconv_kernels=num_kernels, + use_dcn=False) + + # feat must be list or tuple + with pytest.raises(AssertionError): + ct_resnet_neck(feat) + + out_feat = ct_resnet_neck([feat])[0] + assert out_feat.shape == (1, num_filters[-1], 16, 16) + + if torch.cuda.is_available(): + # test dcn + ct_resnet_neck = CTResNetNeck( + in_channel=in_channels, + num_deconv_filters=num_filters, + num_deconv_kernels=num_kernels) + ct_resnet_neck = ct_resnet_neck.cuda() + feat = feat.cuda() + out_feat = ct_resnet_neck([feat])[0] + assert out_feat.shape == (1, num_filters[-1], 16, 16) + + +def test_yolov3_neck(): + # num_scales, in_channels, out_channels must be same length + with pytest.raises(AssertionError): + YOLOV3Neck(num_scales=3, in_channels=[16, 8, 4], out_channels=[8, 4]) + + # len(feats) must equal to num_scales + with pytest.raises(AssertionError): + neck = YOLOV3Neck( + num_scales=3, in_channels=[16, 8, 4], out_channels=[8, 4, 2]) + feats = (torch.rand(1, 4, 16, 16), torch.rand(1, 8, 16, 16)) + neck(feats) + + # test normal channels + s = 32 + in_channels = [16, 8, 4] + out_channels = [8, 4, 2] + feat_sizes = [s // 2**i for i in range(len(in_channels) - 1, -1, -1)] + feats = [ + torch.rand(1, in_channels[i], feat_sizes[i], feat_sizes[i]) + for i in range(len(in_channels) - 1, -1, -1) + ] + neck = YOLOV3Neck( + num_scales=3, in_channels=in_channels, out_channels=out_channels) + outs = neck(feats) + + assert len(outs) == len(feats) + for i in range(len(outs)): + assert outs[i].shape == \ + (1, out_channels[i], feat_sizes[i], feat_sizes[i]) + + # test more flexible setting + s = 32 + in_channels = [32, 8, 16] + out_channels = [19, 21, 5] + feat_sizes = [s // 2**i for i in range(len(in_channels) - 1, -1, -1)] + feats = [ + torch.rand(1, in_channels[i], feat_sizes[i], feat_sizes[i]) + for i in range(len(in_channels) - 1, -1, -1) + ] + neck = YOLOV3Neck( + num_scales=3, in_channels=in_channels, out_channels=out_channels) + outs = neck(feats) + + assert len(outs) == len(feats) + for i in range(len(outs)): + assert outs[i].shape == \ + (1, out_channels[i], feat_sizes[i], feat_sizes[i]) + + +def test_ssd_neck(): + # level_strides/level_paddings must be same length + with pytest.raises(AssertionError): + SSDNeck( + in_channels=[8, 16], + out_channels=[8, 16, 32], + level_strides=[2], + level_paddings=[2, 1]) + + # length of out_channels must larger than in_channels + with pytest.raises(AssertionError): + SSDNeck( + in_channels=[8, 16], + out_channels=[8], + level_strides=[2], + level_paddings=[2]) + + # len(out_channels) - len(in_channels) must equal to len(level_strides) + with pytest.raises(AssertionError): + SSDNeck( + in_channels=[8, 16], + out_channels=[4, 16, 64], + level_strides=[2, 2], + level_paddings=[2, 2]) + + # in_channels must be same with out_channels[:len(in_channels)] + with pytest.raises(AssertionError): + SSDNeck( + in_channels=[8, 16], + out_channels=[4, 16, 64], + level_strides=[2], + level_paddings=[2]) + + ssd_neck = SSDNeck( + in_channels=[4], + out_channels=[4, 8, 16], + level_strides=[2, 1], + level_paddings=[1, 0]) + feats = (torch.rand(1, 4, 16, 16), ) + outs = ssd_neck(feats) + assert outs[0].shape == (1, 4, 16, 16) + assert outs[1].shape == (1, 8, 8, 8) + assert outs[2].shape == (1, 16, 6, 6) + + # test SSD-Lite Neck + ssd_neck = SSDNeck( + in_channels=[4, 8], + out_channels=[4, 8, 16], + level_strides=[1], + level_paddings=[1], + l2_norm_scale=None, + use_depthwise=True, + norm_cfg=dict(type='BN'), + act_cfg=dict(type='ReLU6')) + assert not hasattr(ssd_neck, 'l2_norm') + + from mmcv.cnn.bricks import DepthwiseSeparableConvModule + assert isinstance(ssd_neck.extra_layers[0][-1], + DepthwiseSeparableConvModule) + + feats = (torch.rand(1, 4, 8, 8), torch.rand(1, 8, 8, 8)) + outs = ssd_neck(feats) + assert outs[0].shape == (1, 4, 8, 8) + assert outs[1].shape == (1, 8, 8, 8) + assert outs[2].shape == (1, 16, 8, 8) + + +def test_yolox_pafpn(): + s = 64 + in_channels = [8, 16, 32, 64] + feat_sizes = [s // 2**i for i in range(4)] # [64, 32, 16, 8] + out_channels = 24 + feats = [ + torch.rand(1, in_channels[i], feat_sizes[i], feat_sizes[i]) + for i in range(len(in_channels)) + ] + neck = YOLOXPAFPN(in_channels=in_channels, out_channels=out_channels) + outs = neck(feats) + assert len(outs) == len(feats) + for i in range(len(feats)): + assert outs[i].shape[1] == out_channels + assert outs[i].shape[2] == outs[i].shape[3] == s // (2**i) + + # test depth-wise + neck = YOLOXPAFPN( + in_channels=in_channels, out_channels=out_channels, use_depthwise=True) + + from mmcv.cnn.bricks import DepthwiseSeparableConvModule + assert isinstance(neck.downsamples[0], DepthwiseSeparableConvModule) + + outs = neck(feats) + assert len(outs) == len(feats) + for i in range(len(feats)): + assert outs[i].shape[1] == out_channels + assert outs[i].shape[2] == outs[i].shape[3] == s // (2**i) + + +def test_dyhead(): + s = 64 + in_channels = 8 + out_channels = 16 + feat_sizes = [s // 2**i for i in range(4)] # [64, 32, 16, 8] + feats = [ + torch.rand(1, in_channels, feat_sizes[i], feat_sizes[i]) + for i in range(len(feat_sizes)) + ] + neck = DyHead( + in_channels=in_channels, out_channels=out_channels, num_blocks=3) + outs = neck(feats) + assert len(outs) == len(feats) + for i in range(len(outs)): + assert outs[i].shape[1] == out_channels + assert outs[i].shape[2] == outs[i].shape[3] == s // (2**i) + + feat = torch.rand(1, 8, 4, 4) + # input feat must be tuple or list + with pytest.raises(AssertionError): + neck(feat) + + +def test_fpg(): + # end_level=-1 is equal to end_level=3 + norm_cfg = dict(type='BN', requires_grad=True) + FPG(in_channels=[8, 16, 32, 64], + out_channels=8, + inter_channels=8, + num_outs=5, + add_extra_convs=True, + start_level=1, + end_level=-1, + stack_times=9, + paths=['bu'] * 9, + same_down_trans=None, + same_up_trans=dict( + type='conv', + kernel_size=3, + stride=2, + padding=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + across_lateral_trans=dict( + type='conv', + kernel_size=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + across_down_trans=dict( + type='interpolation_conv', + mode='nearest', + kernel_size=3, + norm_cfg=norm_cfg, + order=('act', 'conv', 'norm'), + inplace=False), + across_up_trans=None, + across_skip_trans=dict( + type='conv', + kernel_size=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + output_trans=dict( + type='last_conv', + kernel_size=3, + order=('act', 'conv', 'norm'), + inplace=False), + norm_cfg=norm_cfg, + skip_inds=[(0, 1, 2, 3), (0, 1, 2), (0, 1), (0, ), ()]) + FPG(in_channels=[8, 16, 32, 64], + out_channels=8, + inter_channels=8, + num_outs=5, + add_extra_convs=True, + start_level=1, + end_level=3, + stack_times=9, + paths=['bu'] * 9, + same_down_trans=None, + same_up_trans=dict( + type='conv', + kernel_size=3, + stride=2, + padding=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + across_lateral_trans=dict( + type='conv', + kernel_size=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + across_down_trans=dict( + type='interpolation_conv', + mode='nearest', + kernel_size=3, + norm_cfg=norm_cfg, + order=('act', 'conv', 'norm'), + inplace=False), + across_up_trans=None, + across_skip_trans=dict( + type='conv', + kernel_size=1, + norm_cfg=norm_cfg, + inplace=False, + order=('act', 'conv', 'norm')), + output_trans=dict( + type='last_conv', + kernel_size=3, + order=('act', 'conv', 'norm'), + inplace=False), + norm_cfg=norm_cfg, + skip_inds=[(0, 1, 2, 3), (0, 1, 2), (0, 1), (0, ), ()]) + + # `end_level` is larger than len(in_channels) - 1 + with pytest.raises(AssertionError): + FPG(in_channels=[8, 16, 32, 64], + out_channels=8, + stack_times=9, + paths=['bu'] * 9, + start_level=1, + end_level=4, + num_outs=2, + skip_inds=[(0, 1, 2, 3), (0, 1, 2), (0, 1), (0, ), ()]) + + # `num_outs` is not equal to end_level - start_level + 1 + with pytest.raises(AssertionError): + FPG(in_channels=[8, 16, 32, 64], + out_channels=8, + stack_times=9, + paths=['bu'] * 9, + start_level=1, + end_level=2, + num_outs=3, + skip_inds=[(0, 1, 2, 3), (0, 1, 2), (0, 1), (0, ), ()]) + + +def test_fpn_carafe(): + # end_level=-1 is equal to end_level=3 + FPN_CARAFE( + in_channels=[8, 16, 32, 64], + out_channels=8, + start_level=0, + end_level=3, + num_outs=4) + FPN_CARAFE( + in_channels=[8, 16, 32, 64], + out_channels=8, + start_level=0, + end_level=-1, + num_outs=4) + # `end_level` is larger than len(in_channels) - 1 + with pytest.raises(AssertionError): + FPN_CARAFE( + in_channels=[8, 16, 32, 64], + out_channels=8, + start_level=1, + end_level=4, + num_outs=2) + + # `num_outs` is not equal to end_level - start_level + 1 + with pytest.raises(AssertionError): + FPN_CARAFE( + in_channels=[8, 16, 32, 64], + out_channels=8, + start_level=1, + end_level=2, + num_outs=3) + + +def test_nas_fpn(): + # end_level=-1 is equal to end_level=3 + NASFPN( + in_channels=[8, 16, 32, 64], + out_channels=8, + stack_times=9, + start_level=0, + end_level=3, + num_outs=4) + NASFPN( + in_channels=[8, 16, 32, 64], + out_channels=8, + stack_times=9, + start_level=0, + end_level=-1, + num_outs=4) + # `end_level` is larger than len(in_channels) - 1 + with pytest.raises(AssertionError): + NASFPN( + in_channels=[8, 16, 32, 64], + out_channels=8, + stack_times=9, + start_level=1, + end_level=4, + num_outs=2) + + # `num_outs` is not equal to end_level - start_level + 1 + with pytest.raises(AssertionError): + NASFPN( + in_channels=[8, 16, 32, 64], + out_channels=8, + stack_times=9, + start_level=1, + end_level=2, + num_outs=3) + + +def test_nasfcos_fpn(): + # end_level=-1 is equal to end_level=3 + NASFCOS_FPN( + in_channels=[8, 16, 32, 64], + out_channels=8, + start_level=0, + end_level=3, + num_outs=4) + NASFCOS_FPN( + in_channels=[8, 16, 32, 64], + out_channels=8, + start_level=0, + end_level=-1, + num_outs=4) + + # `end_level` is larger than len(in_channels) - 1 + with pytest.raises(AssertionError): + NASFCOS_FPN( + in_channels=[8, 16, 32, 64], + out_channels=8, + start_level=1, + end_level=4, + num_outs=2) + + # `num_outs` is not equal to end_level - start_level + 1 + with pytest.raises(AssertionError): + NASFCOS_FPN( + in_channels=[8, 16, 32, 64], + out_channels=8, + start_level=1, + end_level=2, + num_outs=3) diff --git a/tests/test_models/test_plugins.py b/tests/test_models/test_plugins.py new file mode 100644 index 0000000..8afd1f9 --- /dev/null +++ b/tests/test_models/test_plugins.py @@ -0,0 +1,167 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch +from mmcv import ConfigDict +from mmcv.cnn import build_plugin_layer + +from mmdet.models.plugins import DropBlock + + +def test_dropblock(): + feat = torch.rand(1, 1, 11, 11) + drop_prob = 1.0 + dropblock = DropBlock(drop_prob, block_size=11, warmup_iters=0) + out_feat = dropblock(feat) + assert (out_feat == 0).all() and out_feat.shape == feat.shape + drop_prob = 0.5 + dropblock = DropBlock(drop_prob, block_size=5, warmup_iters=0) + out_feat = dropblock(feat) + assert out_feat.shape == feat.shape + + # drop_prob must be (0,1] + with pytest.raises(AssertionError): + DropBlock(1.5, 3) + + # block_size cannot be an even number + with pytest.raises(AssertionError): + DropBlock(0.5, 2) + + # warmup_iters cannot be less than 0 + with pytest.raises(AssertionError): + DropBlock(0.5, 3, -1) + + +def test_pixel_decoder(): + base_channels = 64 + pixel_decoder_cfg = ConfigDict( + dict( + type='PixelDecoder', + in_channels=[base_channels * 2**i for i in range(4)], + feat_channels=base_channels, + out_channels=base_channels, + norm_cfg=dict(type='GN', num_groups=32), + act_cfg=dict(type='ReLU'))) + self = build_plugin_layer(pixel_decoder_cfg)[1] + img_metas = [{}, {}] + feats = [ + torch.rand((2, base_channels * 2**i, 4 * 2**(3 - i), 5 * 2**(3 - i))) + for i in range(4) + ] + mask_feature, memory = self(feats, img_metas) + + assert (memory == feats[-1]).all() + assert mask_feature.shape == feats[0].shape + + +def test_transformer_encoder_pixel_decoder(): + base_channels = 64 + pixel_decoder_cfg = ConfigDict( + dict( + type='TransformerEncoderPixelDecoder', + in_channels=[base_channels * 2**i for i in range(4)], + feat_channels=base_channels, + out_channels=base_channels, + norm_cfg=dict(type='GN', num_groups=32), + act_cfg=dict(type='ReLU'), + encoder=dict( + type='DetrTransformerEncoder', + num_layers=6, + transformerlayers=dict( + type='BaseTransformerLayer', + attn_cfgs=dict( + type='MultiheadAttention', + embed_dims=base_channels, + num_heads=8, + attn_drop=0.1, + proj_drop=0.1, + dropout_layer=None, + batch_first=False), + ffn_cfgs=dict( + embed_dims=base_channels, + feedforward_channels=base_channels * 8, + num_fcs=2, + act_cfg=dict(type='ReLU', inplace=True), + ffn_drop=0.1, + dropout_layer=None, + add_identity=True), + operation_order=('self_attn', 'norm', 'ffn', 'norm'), + norm_cfg=dict(type='LN'), + init_cfg=None, + batch_first=False), + init_cfg=None), + positional_encoding=dict( + type='SinePositionalEncoding', + num_feats=base_channels // 2, + normalize=True))) + self = build_plugin_layer(pixel_decoder_cfg)[1] + img_metas = [{ + 'batch_input_shape': (128, 160), + 'img_shape': (120, 160, 3), + }, { + 'batch_input_shape': (128, 160), + 'img_shape': (125, 160, 3), + }] + feats = [ + torch.rand((2, base_channels * 2**i, 4 * 2**(3 - i), 5 * 2**(3 - i))) + for i in range(4) + ] + mask_feature, memory = self(feats, img_metas) + + assert memory.shape[-2:] == feats[-1].shape[-2:] + assert mask_feature.shape == feats[0].shape + + +def test_msdeformattn_pixel_decoder(): + base_channels = 64 + pixel_decoder_cfg = ConfigDict( + dict( + type='MSDeformAttnPixelDecoder', + in_channels=[base_channels * 2**i for i in range(4)], + strides=[4, 8, 16, 32], + feat_channels=base_channels, + out_channels=base_channels, + num_outs=3, + norm_cfg=dict(type='GN', num_groups=32), + act_cfg=dict(type='ReLU'), + encoder=dict( + type='DetrTransformerEncoder', + num_layers=6, + transformerlayers=dict( + type='BaseTransformerLayer', + attn_cfgs=dict( + type='MultiScaleDeformableAttention', + embed_dims=base_channels, + num_heads=8, + num_levels=3, + num_points=4, + im2col_step=64, + dropout=0.0, + batch_first=False, + norm_cfg=None, + init_cfg=None), + ffn_cfgs=dict( + type='FFN', + embed_dims=base_channels, + feedforward_channels=base_channels * 4, + num_fcs=2, + ffn_drop=0.0, + act_cfg=dict(type='ReLU', inplace=True)), + operation_order=('self_attn', 'norm', 'ffn', 'norm')), + init_cfg=None), + positional_encoding=dict( + type='SinePositionalEncoding', + num_feats=base_channels // 2, + normalize=True), + init_cfg=None), ) + self = build_plugin_layer(pixel_decoder_cfg)[1] + feats = [ + torch.rand((2, base_channels * 2**i, 4 * 2**(3 - i), 5 * 2**(3 - i))) + for i in range(4) + ] + mask_feature, multi_scale_features = self(feats) + + assert mask_feature.shape == feats[0].shape + assert len(multi_scale_features) == 3 + multi_scale_features = multi_scale_features[::-1] + for i in range(3): + assert multi_scale_features[i].shape[-2:] == feats[i + 1].shape[-2:] diff --git a/tests/test_models/test_roi_heads/__init__.py b/tests/test_models/test_roi_heads/__init__.py new file mode 100644 index 0000000..83cfd58 --- /dev/null +++ b/tests/test_models/test_roi_heads/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .utils import _dummy_bbox_sampling + +__all__ = ['_dummy_bbox_sampling'] diff --git a/tests/test_models/test_roi_heads/test_bbox_head.py b/tests/test_models/test_roi_heads/test_bbox_head.py new file mode 100644 index 0000000..e839d06 --- /dev/null +++ b/tests/test_models/test_roi_heads/test_bbox_head.py @@ -0,0 +1,251 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import numpy as np +import pytest +import torch + +from mmdet.core import bbox2roi +from mmdet.models.roi_heads.bbox_heads import BBoxHead +from .utils import _dummy_bbox_sampling + + +def test_bbox_head_loss(): + """Tests bbox head loss when truth is empty and non-empty.""" + self = BBoxHead(in_channels=8, roi_feat_size=3) + + # Dummy proposals + proposal_list = [ + torch.Tensor([[23.6667, 23.8757, 228.6326, 153.8874]]), + ] + + target_cfg = mmcv.Config(dict(pos_weight=1)) + + # Test bbox loss when truth is empty + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + + sampling_results = _dummy_bbox_sampling(proposal_list, gt_bboxes, + gt_labels) + + bbox_targets = self.get_targets(sampling_results, gt_bboxes, gt_labels, + target_cfg) + labels, label_weights, bbox_targets, bbox_weights = bbox_targets + + # Create dummy features "extracted" for each sampled bbox + num_sampled = sum(len(res.bboxes) for res in sampling_results) + rois = bbox2roi([res.bboxes for res in sampling_results]) + dummy_feats = torch.rand(num_sampled, 8 * 3 * 3) + cls_scores, bbox_preds = self.forward(dummy_feats) + + losses = self.loss(cls_scores, bbox_preds, rois, labels, label_weights, + bbox_targets, bbox_weights) + assert losses.get('loss_cls', 0) > 0, 'cls-loss should be non-zero' + assert losses.get('loss_bbox', 0) == 0, 'empty gt loss should be zero' + + # Test bbox loss when truth is non-empty + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + + sampling_results = _dummy_bbox_sampling(proposal_list, gt_bboxes, + gt_labels) + rois = bbox2roi([res.bboxes for res in sampling_results]) + + bbox_targets = self.get_targets(sampling_results, gt_bboxes, gt_labels, + target_cfg) + labels, label_weights, bbox_targets, bbox_weights = bbox_targets + + # Create dummy features "extracted" for each sampled bbox + num_sampled = sum(len(res.bboxes) for res in sampling_results) + dummy_feats = torch.rand(num_sampled, 8 * 3 * 3) + cls_scores, bbox_preds = self.forward(dummy_feats) + + losses = self.loss(cls_scores, bbox_preds, rois, labels, label_weights, + bbox_targets, bbox_weights) + assert losses.get('loss_cls', 0) > 0, 'cls-loss should be non-zero' + assert losses.get('loss_bbox', 0) > 0, 'box-loss should be non-zero' + + +@pytest.mark.parametrize('num_sample', [0, 1, 2]) +def test_bbox_head_get_bboxes(num_sample): + self = BBoxHead(reg_class_agnostic=True) + + num_class = 6 + rois = torch.rand((num_sample, 5)) + cls_score = torch.rand((num_sample, num_class)) + bbox_pred = torch.rand((num_sample, 4)) + + scale_factor = np.array([2.0, 2.0, 2.0, 2.0]) + det_bboxes, det_labels = self.get_bboxes( + rois, cls_score, bbox_pred, None, scale_factor, rescale=True) + if num_sample == 0: + assert len(det_bboxes) == 0 and len(det_labels) == 0 + else: + assert det_bboxes.shape == bbox_pred.shape + assert det_labels.shape == cls_score.shape + + +def test_refine_boxes(): + """Mirrors the doctest in + ``mmdet.models.bbox_heads.bbox_head.BBoxHead.refine_boxes`` but checks for + multiple values of n_roi / n_img.""" + self = BBoxHead(reg_class_agnostic=True) + + test_settings = [ + + # Corner case: less rois than images + { + 'n_roi': 2, + 'n_img': 4, + 'rng': 34285940 + }, + + # Corner case: no images + { + 'n_roi': 0, + 'n_img': 0, + 'rng': 52925222 + }, + + # Corner cases: few images / rois + { + 'n_roi': 1, + 'n_img': 1, + 'rng': 1200281 + }, + { + 'n_roi': 2, + 'n_img': 1, + 'rng': 1200282 + }, + { + 'n_roi': 2, + 'n_img': 2, + 'rng': 1200283 + }, + { + 'n_roi': 1, + 'n_img': 2, + 'rng': 1200284 + }, + + # Corner case: no rois few images + { + 'n_roi': 0, + 'n_img': 1, + 'rng': 23955860 + }, + { + 'n_roi': 0, + 'n_img': 2, + 'rng': 25830516 + }, + + # Corner case: no rois many images + { + 'n_roi': 0, + 'n_img': 10, + 'rng': 671346 + }, + { + 'n_roi': 0, + 'n_img': 20, + 'rng': 699807 + }, + + # Corner case: cal_similarity num rois and images + { + 'n_roi': 20, + 'n_img': 20, + 'rng': 1200238 + }, + { + 'n_roi': 10, + 'n_img': 20, + 'rng': 1200238 + }, + { + 'n_roi': 5, + 'n_img': 5, + 'rng': 1200238 + }, + + # ---------------------------------- + # Common case: more rois than images + { + 'n_roi': 100, + 'n_img': 1, + 'rng': 337156 + }, + { + 'n_roi': 150, + 'n_img': 2, + 'rng': 275898 + }, + { + 'n_roi': 500, + 'n_img': 5, + 'rng': 4903221 + }, + ] + + for demokw in test_settings: + try: + n_roi = demokw['n_roi'] + n_img = demokw['n_img'] + rng = demokw['rng'] + + print(f'Test refine_boxes case: {demokw!r}') + tup = _demodata_refine_boxes(n_roi, n_img, rng=rng) + rois, labels, bbox_preds, pos_is_gts, img_metas = tup + bboxes_list = self.refine_bboxes(rois, labels, bbox_preds, + pos_is_gts, img_metas) + assert len(bboxes_list) == n_img + assert sum(map(len, bboxes_list)) <= n_roi + assert all(b.shape[1] == 4 for b in bboxes_list) + except Exception: + print(f'Test failed with demokw={demokw!r}') + raise + + +def _demodata_refine_boxes(n_roi, n_img, rng=0): + """Create random test data for the + ``mmdet.models.bbox_heads.bbox_head.BBoxHead.refine_boxes`` method.""" + import numpy as np + + from mmdet.core.bbox.demodata import ensure_rng, random_boxes + try: + import kwarray + except ImportError: + import pytest + pytest.skip('kwarray is required for this test') + scale = 512 + rng = ensure_rng(rng) + img_metas = [{'img_shape': (scale, scale)} for _ in range(n_img)] + # Create rois in the expected format + roi_boxes = random_boxes(n_roi, scale=scale, rng=rng) + if n_img == 0: + assert n_roi == 0, 'cannot have any rois if there are no images' + img_ids = torch.empty((0, ), dtype=torch.long) + roi_boxes = torch.empty((0, 4), dtype=torch.float32) + else: + img_ids = rng.randint(0, n_img, (n_roi, )) + img_ids = torch.from_numpy(img_ids) + rois = torch.cat([img_ids[:, None].float(), roi_boxes], dim=1) + # Create other args + labels = rng.randint(0, 2, (n_roi, )) + labels = torch.from_numpy(labels).long() + bbox_preds = random_boxes(n_roi, scale=scale, rng=rng) + # For each image, pretend random positive boxes are gts + is_label_pos = (labels.numpy() > 0).astype(np.int) + lbl_per_img = kwarray.group_items(is_label_pos, img_ids.numpy()) + pos_per_img = [sum(lbl_per_img.get(gid, [])) for gid in range(n_img)] + # randomly generate with numpy then sort with torch + _pos_is_gts = [ + rng.randint(0, 2, (npos, )).astype(np.uint8) for npos in pos_per_img + ] + pos_is_gts = [ + torch.from_numpy(p).sort(descending=True)[0] for p in _pos_is_gts + ] + return rois, labels, bbox_preds, pos_is_gts, img_metas diff --git a/tests/test_models/test_roi_heads/test_mask_head.py b/tests/test_models/test_roi_heads/test_mask_head.py new file mode 100644 index 0000000..89a476d --- /dev/null +++ b/tests/test_models/test_roi_heads/test_mask_head.py @@ -0,0 +1,97 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch + +from mmdet.models.roi_heads.mask_heads import (DynamicMaskHead, FCNMaskHead, + MaskIoUHead) +from .utils import _dummy_bbox_sampling + + +def test_mask_head_loss(): + """Test mask head loss when mask target is empty.""" + self = FCNMaskHead( + num_convs=1, + roi_feat_size=6, + in_channels=8, + conv_out_channels=8, + num_classes=8) + + # Dummy proposals + proposal_list = [ + torch.Tensor([[23.6667, 23.8757, 228.6326, 153.8874]]), + ] + + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + sampling_results = _dummy_bbox_sampling(proposal_list, gt_bboxes, + gt_labels) + + # create dummy mask + import numpy as np + + from mmdet.core import BitmapMasks + dummy_mask = np.random.randint(0, 2, (1, 160, 240), dtype=np.uint8) + gt_masks = [BitmapMasks(dummy_mask, 160, 240)] + + # create dummy train_cfg + train_cfg = mmcv.Config(dict(mask_size=12, mask_thr_binary=0.5)) + + # Create dummy features "extracted" for each sampled bbox + num_sampled = sum(len(res.bboxes) for res in sampling_results) + dummy_feats = torch.rand(num_sampled, 8, 6, 6) + + mask_pred = self.forward(dummy_feats) + mask_targets = self.get_targets(sampling_results, gt_masks, train_cfg) + pos_labels = torch.cat([res.pos_gt_labels for res in sampling_results]) + loss_mask = self.loss(mask_pred, mask_targets, pos_labels) + + onegt_mask_loss = sum(loss_mask['loss_mask']) + assert onegt_mask_loss.item() > 0, 'mask loss should be non-zero' + + # test mask_iou_head + mask_iou_head = MaskIoUHead( + num_convs=1, + num_fcs=1, + roi_feat_size=6, + in_channels=8, + conv_out_channels=8, + fc_out_channels=8, + num_classes=8) + + pos_mask_pred = mask_pred[range(mask_pred.size(0)), pos_labels] + mask_iou_pred = mask_iou_head(dummy_feats, pos_mask_pred) + pos_mask_iou_pred = mask_iou_pred[range(mask_iou_pred.size(0)), pos_labels] + + mask_iou_targets = mask_iou_head.get_targets(sampling_results, gt_masks, + pos_mask_pred, mask_targets, + train_cfg) + loss_mask_iou = mask_iou_head.loss(pos_mask_iou_pred, mask_iou_targets) + onegt_mask_iou_loss = loss_mask_iou['loss_mask_iou'].sum() + assert onegt_mask_iou_loss.item() >= 0 + + # test dynamic_mask_head + dummy_proposal_feats = torch.rand(num_sampled, 8) + dynamic_mask_head = DynamicMaskHead( + dynamic_conv_cfg=dict( + type='DynamicConv', + in_channels=8, + feat_channels=8, + out_channels=8, + input_feat_shape=6, + with_proj=False, + act_cfg=dict(type='ReLU', inplace=True), + norm_cfg=dict(type='LN')), + num_convs=1, + num_classes=8, + in_channels=8, + roi_feat_size=6) + + mask_pred = dynamic_mask_head(dummy_feats, dummy_proposal_feats) + + mask_target = dynamic_mask_head.get_targets(sampling_results, gt_masks, + train_cfg) + loss_mask = dynamic_mask_head.loss(mask_pred, mask_target, pos_labels) + loss_mask = loss_mask['loss_mask'].sum() + assert loss_mask.item() >= 0 diff --git a/tests/test_models/test_roi_heads/test_roi_extractor.py b/tests/test_models/test_roi_heads/test_roi_extractor.py new file mode 100644 index 0000000..b79dff9 --- /dev/null +++ b/tests/test_models/test_roi_heads/test_roi_extractor.py @@ -0,0 +1,114 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch + +from mmdet.models.roi_heads.roi_extractors import GenericRoIExtractor + + +def test_groie(): + # test with pre/post + cfg = dict( + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32], + pre_cfg=dict( + type='ConvModule', + in_channels=256, + out_channels=256, + kernel_size=5, + padding=2, + inplace=False, + ), + post_cfg=dict( + type='ConvModule', + in_channels=256, + out_channels=256, + kernel_size=5, + padding=2, + inplace=False)) + + groie = GenericRoIExtractor(**cfg) + + feats = ( + torch.rand((1, 256, 200, 336)), + torch.rand((1, 256, 100, 168)), + torch.rand((1, 256, 50, 84)), + torch.rand((1, 256, 25, 42)), + ) + + rois = torch.tensor([[0.0000, 587.8285, 52.1405, 886.2484, 341.5644]]) + + res = groie(feats, rois) + assert res.shape == torch.Size([1, 256, 7, 7]) + + # test w.o. pre/post + cfg = dict( + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=2), + out_channels=256, + featmap_strides=[4, 8, 16, 32]) + + groie = GenericRoIExtractor(**cfg) + + feats = ( + torch.rand((1, 256, 200, 336)), + torch.rand((1, 256, 100, 168)), + torch.rand((1, 256, 50, 84)), + torch.rand((1, 256, 25, 42)), + ) + + rois = torch.tensor([[0.0000, 587.8285, 52.1405, 886.2484, 341.5644]]) + + res = groie(feats, rois) + assert res.shape == torch.Size([1, 256, 7, 7]) + + # test w.o. pre/post concat + cfg = dict( + aggregation='concat', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=2), + out_channels=256 * 4, + featmap_strides=[4, 8, 16, 32]) + + groie = GenericRoIExtractor(**cfg) + + feats = ( + torch.rand((1, 256, 200, 336)), + torch.rand((1, 256, 100, 168)), + torch.rand((1, 256, 50, 84)), + torch.rand((1, 256, 25, 42)), + ) + + rois = torch.tensor([[0.0000, 587.8285, 52.1405, 886.2484, 341.5644]]) + + res = groie(feats, rois) + assert res.shape == torch.Size([1, 1024, 7, 7]) + + # test not supported aggregate method + with pytest.raises(AssertionError): + cfg = dict( + aggregation='not support', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=2), + out_channels=1024, + featmap_strides=[4, 8, 16, 32]) + _ = GenericRoIExtractor(**cfg) + + # test concat channels number + cfg = dict( + aggregation='concat', + roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=2), + out_channels=256 * 5, # 256*5 != 256*4 + featmap_strides=[4, 8, 16, 32]) + + groie = GenericRoIExtractor(**cfg) + + feats = ( + torch.rand((1, 256, 200, 336)), + torch.rand((1, 256, 100, 168)), + torch.rand((1, 256, 50, 84)), + torch.rand((1, 256, 25, 42)), + ) + + rois = torch.tensor([[0.0000, 587.8285, 52.1405, 886.2484, 341.5644]]) + + # out_channels does not sum of feat channels + with pytest.raises(AssertionError): + _ = groie(feats, rois) diff --git a/tests/test_models/test_roi_heads/test_sabl_bbox_head.py b/tests/test_models/test_roi_heads/test_sabl_bbox_head.py new file mode 100644 index 0000000..d412e3a --- /dev/null +++ b/tests/test_models/test_roi_heads/test_sabl_bbox_head.py @@ -0,0 +1,77 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import mmcv +import torch + +from mmdet.core import bbox2roi +from mmdet.models.roi_heads.bbox_heads import SABLHead +from .utils import _dummy_bbox_sampling + + +def test_sabl_bbox_head_loss(): + """Tests bbox head loss when truth is empty and non-empty.""" + self = SABLHead( + num_classes=4, + cls_in_channels=3, + reg_in_channels=3, + cls_out_channels=3, + reg_offset_out_channels=3, + reg_cls_out_channels=3, + roi_feat_size=7) + + # Dummy proposals + proposal_list = [ + torch.Tensor([[23.6667, 23.8757, 228.6326, 153.8874]]), + ] + + target_cfg = mmcv.Config(dict(pos_weight=1)) + + # Test bbox loss when truth is empty + gt_bboxes = [torch.empty((0, 4))] + gt_labels = [torch.LongTensor([])] + + sampling_results = _dummy_bbox_sampling(proposal_list, gt_bboxes, + gt_labels) + + bbox_targets = self.get_targets(sampling_results, gt_bboxes, gt_labels, + target_cfg) + labels, label_weights, bbox_targets, bbox_weights = bbox_targets + + # Create dummy features "extracted" for each sampled bbox + num_sampled = sum(len(res.bboxes) for res in sampling_results) + rois = bbox2roi([res.bboxes for res in sampling_results]) + dummy_feats = torch.rand(num_sampled, 3, 7, 7) + cls_scores, bbox_preds = self.forward(dummy_feats) + + losses = self.loss(cls_scores, bbox_preds, rois, labels, label_weights, + bbox_targets, bbox_weights) + assert losses.get('loss_cls', 0) > 0, 'cls-loss should be non-zero' + assert losses.get('loss_bbox_cls', + 0) == 0, 'empty gt bbox-cls-loss should be zero' + assert losses.get('loss_bbox_reg', + 0) == 0, 'empty gt bbox-reg-loss should be zero' + + # Test bbox loss when truth is non-empty + gt_bboxes = [ + torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]), + ] + gt_labels = [torch.LongTensor([2])] + + sampling_results = _dummy_bbox_sampling(proposal_list, gt_bboxes, + gt_labels) + rois = bbox2roi([res.bboxes for res in sampling_results]) + + bbox_targets = self.get_targets(sampling_results, gt_bboxes, gt_labels, + target_cfg) + labels, label_weights, bbox_targets, bbox_weights = bbox_targets + + # Create dummy features "extracted" for each sampled bbox + num_sampled = sum(len(res.bboxes) for res in sampling_results) + dummy_feats = torch.rand(num_sampled, 3, 7, 7) + cls_scores, bbox_preds = self.forward(dummy_feats) + + losses = self.loss(cls_scores, bbox_preds, rois, labels, label_weights, + bbox_targets, bbox_weights) + assert losses.get('loss_bbox_cls', + 0) > 0, 'empty gt bbox-cls-loss should be zero' + assert losses.get('loss_bbox_reg', + 0) > 0, 'empty gt bbox-reg-loss should be zero' diff --git a/tests/test_models/test_roi_heads/utils.py b/tests/test_models/test_roi_heads/utils.py new file mode 100644 index 0000000..748cb0e --- /dev/null +++ b/tests/test_models/test_roi_heads/utils.py @@ -0,0 +1,38 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch + +from mmdet.core import build_assigner, build_sampler + + +def _dummy_bbox_sampling(proposal_list, gt_bboxes, gt_labels): + """Create sample results that can be passed to BBoxHead.get_targets.""" + num_imgs = 1 + feat = torch.rand(1, 1, 3, 3) + assign_config = dict( + type='MaxIoUAssigner', + pos_iou_thr=0.5, + neg_iou_thr=0.5, + min_pos_iou=0.5, + ignore_iof_thr=-1) + sampler_config = dict( + type='RandomSampler', + num=512, + pos_fraction=0.25, + neg_pos_ub=-1, + add_gt_as_proposals=True) + bbox_assigner = build_assigner(assign_config) + bbox_sampler = build_sampler(sampler_config) + gt_bboxes_ignore = [None for _ in range(num_imgs)] + sampling_results = [] + for i in range(num_imgs): + assign_result = bbox_assigner.assign(proposal_list[i], gt_bboxes[i], + gt_bboxes_ignore[i], gt_labels[i]) + sampling_result = bbox_sampler.sample( + assign_result, + proposal_list[i], + gt_bboxes[i], + gt_labels[i], + feats=feat) + sampling_results.append(sampling_result) + + return sampling_results diff --git a/tests/test_models/test_seg_heads/test_maskformer_fusion_head.py b/tests/test_models/test_seg_heads/test_maskformer_fusion_head.py new file mode 100644 index 0000000..8d5131f --- /dev/null +++ b/tests/test_models/test_seg_heads/test_maskformer_fusion_head.py @@ -0,0 +1,53 @@ +import pytest +import torch +from mmcv import ConfigDict + +from mmdet.models.seg_heads.panoptic_fusion_heads import MaskFormerFusionHead + + +def test_maskformer_fusion_head(): + img_metas = [ + { + 'batch_input_shape': (128, 160), + 'img_shape': (126, 160, 3), + 'ori_shape': (63, 80, 3), + 'pad_shape': (128, 160, 3) + }, + ] + num_things_classes = 80 + num_stuff_classes = 53 + num_classes = num_things_classes + num_stuff_classes + config = ConfigDict( + type='MaskFormerFusionHead', + num_things_classes=num_things_classes, + num_stuff_classes=num_stuff_classes, + loss_panoptic=None, + test_cfg=dict( + panoptic_on=True, + semantic_on=False, + instance_on=True, + max_per_image=100, + object_mask_thr=0.8, + iou_thr=0.8, + filter_low_score=False), + init_cfg=None) + + self = MaskFormerFusionHead(**config) + + # test forward_train + assert self.forward_train() == dict() + + mask_cls_results = torch.rand((1, 100, num_classes + 1)) + mask_pred_results = torch.rand((1, 100, 128, 160)) + + # test panoptic_postprocess and instance_postprocess + results = self.simple_test(mask_cls_results, mask_pred_results, img_metas) + assert 'ins_results' in results[0] and 'pan_results' in results[0] + + # test semantic_postprocess + config.test_cfg.semantic_on = True + with pytest.raises(AssertionError): + self.simple_test(mask_cls_results, mask_pred_results, img_metas) + + with pytest.raises(NotImplementedError): + self.semantic_postprocess(mask_cls_results, mask_pred_results) diff --git a/tests/test_models/test_utils/test_brick_wrappers.py b/tests/test_models/test_utils/test_brick_wrappers.py new file mode 100644 index 0000000..9aa5bd0 --- /dev/null +++ b/tests/test_models/test_utils/test_brick_wrappers.py @@ -0,0 +1,93 @@ +from unittest.mock import patch + +import torch +import torch.nn as nn +import torch.nn.functional as F + +from mmdet.models.utils import AdaptiveAvgPool2d, adaptive_avg_pool2d + +if torch.__version__ != 'parrots': + torch_version = '1.7' +else: + torch_version = 'parrots' + + +@patch('torch.__version__', torch_version) +def test_adaptive_avg_pool2d(): + # Test the empty batch dimension + # Test the two input conditions + x_empty = torch.randn(0, 3, 4, 5) + # 1. tuple[int, int] + wrapper_out = adaptive_avg_pool2d(x_empty, (2, 2)) + assert wrapper_out.shape == (0, 3, 2, 2) + # 2. int + wrapper_out = adaptive_avg_pool2d(x_empty, 2) + assert wrapper_out.shape == (0, 3, 2, 2) + + # wrapper op with 3-dim input + x_normal = torch.randn(3, 3, 4, 5) + wrapper_out = adaptive_avg_pool2d(x_normal, (2, 2)) + ref_out = F.adaptive_avg_pool2d(x_normal, (2, 2)) + assert wrapper_out.shape == (3, 3, 2, 2) + assert torch.equal(wrapper_out, ref_out) + + wrapper_out = adaptive_avg_pool2d(x_normal, 2) + ref_out = F.adaptive_avg_pool2d(x_normal, 2) + assert wrapper_out.shape == (3, 3, 2, 2) + assert torch.equal(wrapper_out, ref_out) + + +@patch('torch.__version__', torch_version) +def test_AdaptiveAvgPool2d(): + # Test the empty batch dimension + x_empty = torch.randn(0, 3, 4, 5) + # Test the four input conditions + # 1. tuple[int, int] + wrapper = AdaptiveAvgPool2d((2, 2)) + wrapper_out = wrapper(x_empty) + assert wrapper_out.shape == (0, 3, 2, 2) + + # 2. int + wrapper = AdaptiveAvgPool2d(2) + wrapper_out = wrapper(x_empty) + assert wrapper_out.shape == (0, 3, 2, 2) + + # 3. tuple[None, int] + wrapper = AdaptiveAvgPool2d((None, 2)) + wrapper_out = wrapper(x_empty) + assert wrapper_out.shape == (0, 3, 4, 2) + + # 3. tuple[int, None] + wrapper = AdaptiveAvgPool2d((2, None)) + wrapper_out = wrapper(x_empty) + assert wrapper_out.shape == (0, 3, 2, 5) + + # Test the normal batch dimension + x_normal = torch.randn(3, 3, 4, 5) + wrapper = AdaptiveAvgPool2d((2, 2)) + ref = nn.AdaptiveAvgPool2d((2, 2)) + wrapper_out = wrapper(x_normal) + ref_out = ref(x_normal) + assert wrapper_out.shape == (3, 3, 2, 2) + assert torch.equal(wrapper_out, ref_out) + + wrapper = AdaptiveAvgPool2d(2) + ref = nn.AdaptiveAvgPool2d(2) + wrapper_out = wrapper(x_normal) + ref_out = ref(x_normal) + assert wrapper_out.shape == (3, 3, 2, 2) + assert torch.equal(wrapper_out, ref_out) + + wrapper = AdaptiveAvgPool2d((None, 2)) + ref = nn.AdaptiveAvgPool2d((None, 2)) + wrapper_out = wrapper(x_normal) + ref_out = ref(x_normal) + assert wrapper_out.shape == (3, 3, 4, 2) + assert torch.equal(wrapper_out, ref_out) + + wrapper = AdaptiveAvgPool2d((2, None)) + ref = nn.AdaptiveAvgPool2d((2, None)) + wrapper_out = wrapper(x_normal) + ref_out = ref(x_normal) + assert wrapper_out.shape == (3, 3, 2, 5) + assert torch.equal(wrapper_out, ref_out) diff --git a/tests/test_models/test_utils/test_conv_upsample.py b/tests/test_models/test_utils/test_conv_upsample.py new file mode 100644 index 0000000..95a0ccc --- /dev/null +++ b/tests/test_models/test_utils/test_conv_upsample.py @@ -0,0 +1,24 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch + +from mmdet.models.utils import ConvUpsample + + +@pytest.mark.parametrize('num_layers', [0, 1, 2]) +def test_conv_upsample(num_layers): + num_upsample = num_layers if num_layers > 0 else 0 + num_layers = num_layers if num_layers > 0 else 1 + layer = ConvUpsample( + 10, + 5, + num_layers=num_layers, + num_upsample=num_upsample, + conv_cfg=None, + norm_cfg=None) + + size = 5 + x = torch.randn((1, 10, size, size)) + size = size * pow(2, num_upsample) + x = layer(x) + assert x.shape[-2:] == (size, size) diff --git a/tests/test_models/test_utils/test_inverted_residual.py b/tests/test_models/test_utils/test_inverted_residual.py new file mode 100644 index 0000000..14a331a --- /dev/null +++ b/tests/test_models/test_utils/test_inverted_residual.py @@ -0,0 +1,76 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch +from mmcv.cnn import is_norm +from torch.nn.modules import GroupNorm + +from mmdet.models.utils import InvertedResidual, SELayer + + +def test_inverted_residual(): + + with pytest.raises(AssertionError): + # stride must be in [1, 2] + InvertedResidual(16, 16, 32, stride=3) + + with pytest.raises(AssertionError): + # se_cfg must be None or dict + InvertedResidual(16, 16, 32, se_cfg=list()) + + with pytest.raises(AssertionError): + # in_channeld and mid_channels must be the same if + # with_expand_conv is False + InvertedResidual(16, 16, 32, with_expand_conv=False) + + # Test InvertedResidual forward, stride=1 + block = InvertedResidual(16, 16, 32, stride=1) + x = torch.randn(1, 16, 56, 56) + x_out = block(x) + assert getattr(block, 'se', None) is None + assert block.with_res_shortcut + assert x_out.shape == torch.Size((1, 16, 56, 56)) + + # Test InvertedResidual forward, stride=2 + block = InvertedResidual(16, 16, 32, stride=2) + x = torch.randn(1, 16, 56, 56) + x_out = block(x) + assert not block.with_res_shortcut + assert x_out.shape == torch.Size((1, 16, 28, 28)) + + # Test InvertedResidual forward with se layer + se_cfg = dict(channels=32) + block = InvertedResidual(16, 16, 32, stride=1, se_cfg=se_cfg) + x = torch.randn(1, 16, 56, 56) + x_out = block(x) + assert isinstance(block.se, SELayer) + assert x_out.shape == torch.Size((1, 16, 56, 56)) + + # Test InvertedResidual forward, with_expand_conv=False + block = InvertedResidual(32, 16, 32, with_expand_conv=False) + x = torch.randn(1, 32, 56, 56) + x_out = block(x) + assert getattr(block, 'expand_conv', None) is None + assert x_out.shape == torch.Size((1, 16, 56, 56)) + + # Test InvertedResidual forward with GroupNorm + block = InvertedResidual( + 16, 16, 32, norm_cfg=dict(type='GN', num_groups=2)) + x = torch.randn(1, 16, 56, 56) + x_out = block(x) + for m in block.modules(): + if is_norm(m): + assert isinstance(m, GroupNorm) + assert x_out.shape == torch.Size((1, 16, 56, 56)) + + # Test InvertedResidual forward with HSigmoid + block = InvertedResidual(16, 16, 32, act_cfg=dict(type='HSigmoid')) + x = torch.randn(1, 16, 56, 56) + x_out = block(x) + assert x_out.shape == torch.Size((1, 16, 56, 56)) + + # Test InvertedResidual forward with checkpoint + block = InvertedResidual(16, 16, 32, with_cp=True) + x = torch.randn(1, 16, 56, 56) + x_out = block(x) + assert block.with_cp + assert x_out.shape == torch.Size((1, 16, 56, 56)) diff --git a/tests/test_models/test_utils/test_model_misc.py b/tests/test_models/test_utils/test_model_misc.py new file mode 100644 index 0000000..93de336 --- /dev/null +++ b/tests/test_models/test_utils/test_model_misc.py @@ -0,0 +1,36 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import torch +from torch.autograd import gradcheck + +from mmdet.models.utils import interpolate_as, sigmoid_geometric_mean + + +def test_interpolate_as(): + source = torch.rand((1, 5, 4, 4)) + target = torch.rand((1, 1, 16, 16)) + + # Test 4D source and target + result = interpolate_as(source, target) + assert result.shape == torch.Size((1, 5, 16, 16)) + + # Test 3D target + result = interpolate_as(source, target.squeeze(0)) + assert result.shape == torch.Size((1, 5, 16, 16)) + + # Test 3D source + result = interpolate_as(source.squeeze(0), target) + assert result.shape == torch.Size((5, 16, 16)) + + # Test type(target) == np.ndarray + target = np.random.rand(16, 16) + result = interpolate_as(source.squeeze(0), target) + assert result.shape == torch.Size((5, 16, 16)) + + +def test_sigmoid_geometric_mean(): + x = torch.randn(20, 20, dtype=torch.double, requires_grad=True) + y = torch.randn(20, 20, dtype=torch.double, requires_grad=True) + inputs = (x, y) + test = gradcheck(sigmoid_geometric_mean, inputs, eps=1e-6, atol=1e-4) + assert test diff --git a/tests/test_models/test_utils/test_position_encoding.py b/tests/test_models/test_utils/test_position_encoding.py new file mode 100644 index 0000000..1119410 --- /dev/null +++ b/tests/test_models/test_utils/test_position_encoding.py @@ -0,0 +1,39 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch + +from mmdet.models.utils import (LearnedPositionalEncoding, + SinePositionalEncoding) + + +def test_sine_positional_encoding(num_feats=16, batch_size=2): + # test invalid type of scale + with pytest.raises(AssertionError): + module = SinePositionalEncoding( + num_feats, scale=(3., ), normalize=True) + + module = SinePositionalEncoding(num_feats) + h, w = 10, 6 + mask = (torch.rand(batch_size, h, w) > 0.5).to(torch.int) + assert not module.normalize + out = module(mask) + assert out.shape == (batch_size, num_feats * 2, h, w) + + # set normalize + module = SinePositionalEncoding(num_feats, normalize=True) + assert module.normalize + out = module(mask) + assert out.shape == (batch_size, num_feats * 2, h, w) + + +def test_learned_positional_encoding(num_feats=16, + row_num_embed=10, + col_num_embed=10, + batch_size=2): + module = LearnedPositionalEncoding(num_feats, row_num_embed, col_num_embed) + assert module.row_embed.weight.shape == (row_num_embed, num_feats) + assert module.col_embed.weight.shape == (col_num_embed, num_feats) + h, w = 10, 6 + mask = torch.rand(batch_size, h, w) > 0.5 + out = module(mask) + assert out.shape == (batch_size, num_feats * 2, h, w) diff --git a/tests/test_models/test_utils/test_se_layer.py b/tests/test_models/test_utils/test_se_layer.py new file mode 100644 index 0000000..b525b91 --- /dev/null +++ b/tests/test_models/test_utils/test_se_layer.py @@ -0,0 +1,54 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch +import torch.nn.functional as F +from mmcv.cnn import constant_init + +from mmdet.models.utils import DyReLU, SELayer + + +def test_se_layer(): + with pytest.raises(AssertionError): + # act_cfg sequence length must equal to 2 + SELayer(channels=32, act_cfg=(dict(type='ReLU'), )) + + with pytest.raises(AssertionError): + # act_cfg sequence must be a tuple of dict + SELayer(channels=32, act_cfg=[dict(type='ReLU'), dict(type='ReLU')]) + + # Test SELayer forward + layer = SELayer(channels=32) + layer.init_weights() + layer.train() + + x = torch.randn((1, 32, 10, 10)) + x_out = layer(x) + assert x_out.shape == torch.Size((1, 32, 10, 10)) + + +def test_dyrelu(): + with pytest.raises(AssertionError): + # act_cfg sequence length must equal to 2 + DyReLU(channels=32, act_cfg=(dict(type='ReLU'), )) + + with pytest.raises(AssertionError): + # act_cfg sequence must be a tuple of dict + DyReLU(channels=32, act_cfg=[dict(type='ReLU'), dict(type='ReLU')]) + + # Test DyReLU forward + layer = DyReLU(channels=32) + layer.init_weights() + layer.train() + x = torch.randn((1, 32, 10, 10)) + x_out = layer(x) + assert x_out.shape == torch.Size((1, 32, 10, 10)) + + # DyReLU should act as standard (static) ReLU + # when eliminating the effect of SE-like module + layer = DyReLU(channels=32) + constant_init(layer.conv2.conv, 0) + layer.train() + x = torch.randn((1, 32, 10, 10)) + x_out = layer(x) + relu_out = F.relu(x) + assert torch.equal(x_out, relu_out) diff --git a/tests/test_models/test_utils/test_transformer.py b/tests/test_models/test_utils/test_transformer.py new file mode 100644 index 0000000..9c6efb4 --- /dev/null +++ b/tests/test_models/test_utils/test_transformer.py @@ -0,0 +1,569 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch +from mmcv.utils import ConfigDict + +from mmdet.models.utils.transformer import (AdaptivePadding, + DetrTransformerDecoder, + DetrTransformerEncoder, PatchEmbed, + PatchMerging, Transformer) + + +def test_adaptive_padding(): + + for padding in ('same', 'corner'): + kernel_size = 16 + stride = 16 + dilation = 1 + input = torch.rand(1, 1, 15, 17) + pool = AdaptivePadding( + kernel_size=kernel_size, + stride=stride, + dilation=dilation, + padding=padding) + out = pool(input) + # padding to divisible by 16 + assert (out.shape[2], out.shape[3]) == (16, 32) + input = torch.rand(1, 1, 16, 17) + out = pool(input) + # padding to divisible by 16 + assert (out.shape[2], out.shape[3]) == (16, 32) + + kernel_size = (2, 2) + stride = (2, 2) + dilation = (1, 1) + + adap_pad = AdaptivePadding( + kernel_size=kernel_size, + stride=stride, + dilation=dilation, + padding=padding) + input = torch.rand(1, 1, 11, 13) + out = adap_pad(input) + # padding to divisible by 2 + assert (out.shape[2], out.shape[3]) == (12, 14) + + kernel_size = (2, 2) + stride = (10, 10) + dilation = (1, 1) + + adap_pad = AdaptivePadding( + kernel_size=kernel_size, + stride=stride, + dilation=dilation, + padding=padding) + input = torch.rand(1, 1, 10, 13) + out = adap_pad(input) + # no padding + assert (out.shape[2], out.shape[3]) == (10, 13) + + kernel_size = (11, 11) + adap_pad = AdaptivePadding( + kernel_size=kernel_size, + stride=stride, + dilation=dilation, + padding=padding) + input = torch.rand(1, 1, 11, 13) + out = adap_pad(input) + # all padding + assert (out.shape[2], out.shape[3]) == (21, 21) + + # test padding as kernel is (7,9) + input = torch.rand(1, 1, 11, 13) + stride = (3, 4) + kernel_size = (4, 5) + dilation = (2, 2) + # actually (7, 9) + adap_pad = AdaptivePadding( + kernel_size=kernel_size, + stride=stride, + dilation=dilation, + padding=padding) + dilation_out = adap_pad(input) + assert (dilation_out.shape[2], dilation_out.shape[3]) == (16, 21) + kernel_size = (7, 9) + dilation = (1, 1) + adap_pad = AdaptivePadding( + kernel_size=kernel_size, + stride=stride, + dilation=dilation, + padding=padding) + kernel79_out = adap_pad(input) + assert (kernel79_out.shape[2], kernel79_out.shape[3]) == (16, 21) + assert kernel79_out.shape == dilation_out.shape + + # assert only support "same" "corner" + with pytest.raises(AssertionError): + AdaptivePadding( + kernel_size=kernel_size, + stride=stride, + dilation=dilation, + padding=1) + + +def test_patch_embed(): + B = 2 + H = 3 + W = 4 + C = 3 + embed_dims = 10 + kernel_size = 3 + stride = 1 + dummy_input = torch.rand(B, C, H, W) + patch_merge_1 = PatchEmbed( + in_channels=C, + embed_dims=embed_dims, + kernel_size=kernel_size, + stride=stride, + padding=0, + dilation=1, + norm_cfg=None) + + x1, shape = patch_merge_1(dummy_input) + # test out shape + assert x1.shape == (2, 2, 10) + # test outsize is correct + assert shape == (1, 2) + # test L = out_h * out_w + assert shape[0] * shape[1] == x1.shape[1] + + B = 2 + H = 10 + W = 10 + C = 3 + embed_dims = 10 + kernel_size = 5 + stride = 2 + dummy_input = torch.rand(B, C, H, W) + # test dilation + patch_merge_2 = PatchEmbed( + in_channels=C, + embed_dims=embed_dims, + kernel_size=kernel_size, + stride=stride, + padding=0, + dilation=2, + norm_cfg=None, + ) + + x2, shape = patch_merge_2(dummy_input) + # test out shape + assert x2.shape == (2, 1, 10) + # test outsize is correct + assert shape == (1, 1) + # test L = out_h * out_w + assert shape[0] * shape[1] == x2.shape[1] + + stride = 2 + input_size = (10, 10) + + dummy_input = torch.rand(B, C, H, W) + # test stride and norm + patch_merge_3 = PatchEmbed( + in_channels=C, + embed_dims=embed_dims, + kernel_size=kernel_size, + stride=stride, + padding=0, + dilation=2, + norm_cfg=dict(type='LN'), + input_size=input_size) + + x3, shape = patch_merge_3(dummy_input) + # test out shape + assert x3.shape == (2, 1, 10) + # test outsize is correct + assert shape == (1, 1) + # test L = out_h * out_w + assert shape[0] * shape[1] == x3.shape[1] + + # test the init_out_size with nn.Unfold + assert patch_merge_3.init_out_size[1] == (input_size[0] - 2 * 4 - + 1) // 2 + 1 + assert patch_merge_3.init_out_size[0] == (input_size[0] - 2 * 4 - + 1) // 2 + 1 + H = 11 + W = 12 + input_size = (H, W) + dummy_input = torch.rand(B, C, H, W) + # test stride and norm + patch_merge_3 = PatchEmbed( + in_channels=C, + embed_dims=embed_dims, + kernel_size=kernel_size, + stride=stride, + padding=0, + dilation=2, + norm_cfg=dict(type='LN'), + input_size=input_size) + + _, shape = patch_merge_3(dummy_input) + # when input_size equal to real input + # the out_size should be equal to `init_out_size` + assert shape == patch_merge_3.init_out_size + + input_size = (H, W) + dummy_input = torch.rand(B, C, H, W) + # test stride and norm + patch_merge_3 = PatchEmbed( + in_channels=C, + embed_dims=embed_dims, + kernel_size=kernel_size, + stride=stride, + padding=0, + dilation=2, + norm_cfg=dict(type='LN'), + input_size=input_size) + + _, shape = patch_merge_3(dummy_input) + # when input_size equal to real input + # the out_size should be equal to `init_out_size` + assert shape == patch_merge_3.init_out_size + + # test adap padding + for padding in ('same', 'corner'): + in_c = 2 + embed_dims = 3 + B = 2 + + # test stride is 1 + input_size = (5, 5) + kernel_size = (5, 5) + stride = (1, 1) + dilation = 1 + bias = False + + x = torch.rand(B, in_c, *input_size) + patch_embed = PatchEmbed( + in_channels=in_c, + embed_dims=embed_dims, + kernel_size=kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + bias=bias) + + x_out, out_size = patch_embed(x) + assert x_out.size() == (B, 25, 3) + assert out_size == (5, 5) + assert x_out.size(1) == out_size[0] * out_size[1] + + # test kernel_size == stride + input_size = (5, 5) + kernel_size = (5, 5) + stride = (5, 5) + dilation = 1 + bias = False + + x = torch.rand(B, in_c, *input_size) + patch_embed = PatchEmbed( + in_channels=in_c, + embed_dims=embed_dims, + kernel_size=kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + bias=bias) + + x_out, out_size = patch_embed(x) + assert x_out.size() == (B, 1, 3) + assert out_size == (1, 1) + assert x_out.size(1) == out_size[0] * out_size[1] + + # test kernel_size == stride + input_size = (6, 5) + kernel_size = (5, 5) + stride = (5, 5) + dilation = 1 + bias = False + + x = torch.rand(B, in_c, *input_size) + patch_embed = PatchEmbed( + in_channels=in_c, + embed_dims=embed_dims, + kernel_size=kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + bias=bias) + + x_out, out_size = patch_embed(x) + assert x_out.size() == (B, 2, 3) + assert out_size == (2, 1) + assert x_out.size(1) == out_size[0] * out_size[1] + + # test different kernel_size with different stride + input_size = (6, 5) + kernel_size = (6, 2) + stride = (6, 2) + dilation = 1 + bias = False + + x = torch.rand(B, in_c, *input_size) + patch_embed = PatchEmbed( + in_channels=in_c, + embed_dims=embed_dims, + kernel_size=kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + bias=bias) + + x_out, out_size = patch_embed(x) + assert x_out.size() == (B, 3, 3) + assert out_size == (1, 3) + assert x_out.size(1) == out_size[0] * out_size[1] + + +def test_patch_merging(): + + # Test the model with int padding + in_c = 3 + out_c = 4 + kernel_size = 3 + stride = 3 + padding = 1 + dilation = 1 + bias = False + # test the case `pad_to_stride` is False + patch_merge = PatchMerging( + in_channels=in_c, + out_channels=out_c, + kernel_size=kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + bias=bias) + B, L, C = 1, 100, 3 + input_size = (10, 10) + x = torch.rand(B, L, C) + x_out, out_size = patch_merge(x, input_size) + assert x_out.size() == (1, 16, 4) + assert out_size == (4, 4) + # assert out size is consistent with real output + assert x_out.size(1) == out_size[0] * out_size[1] + in_c = 4 + out_c = 5 + kernel_size = 6 + stride = 3 + padding = 2 + dilation = 2 + bias = False + patch_merge = PatchMerging( + in_channels=in_c, + out_channels=out_c, + kernel_size=kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + bias=bias) + B, L, C = 1, 100, 4 + input_size = (10, 10) + x = torch.rand(B, L, C) + x_out, out_size = patch_merge(x, input_size) + assert x_out.size() == (1, 4, 5) + assert out_size == (2, 2) + # assert out size is consistent with real output + assert x_out.size(1) == out_size[0] * out_size[1] + + # Test with adaptive padding + for padding in ('same', 'corner'): + in_c = 2 + out_c = 3 + B = 2 + + # test stride is 1 + input_size = (5, 5) + kernel_size = (5, 5) + stride = (1, 1) + dilation = 1 + bias = False + L = input_size[0] * input_size[1] + + x = torch.rand(B, L, in_c) + patch_merge = PatchMerging( + in_channels=in_c, + out_channels=out_c, + kernel_size=kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + bias=bias) + + x_out, out_size = patch_merge(x, input_size) + assert x_out.size() == (B, 25, 3) + assert out_size == (5, 5) + assert x_out.size(1) == out_size[0] * out_size[1] + + # test kernel_size == stride + input_size = (5, 5) + kernel_size = (5, 5) + stride = (5, 5) + dilation = 1 + bias = False + L = input_size[0] * input_size[1] + + x = torch.rand(B, L, in_c) + patch_merge = PatchMerging( + in_channels=in_c, + out_channels=out_c, + kernel_size=kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + bias=bias) + + x_out, out_size = patch_merge(x, input_size) + assert x_out.size() == (B, 1, 3) + assert out_size == (1, 1) + assert x_out.size(1) == out_size[0] * out_size[1] + + # test kernel_size == stride + input_size = (6, 5) + kernel_size = (5, 5) + stride = (5, 5) + dilation = 1 + bias = False + L = input_size[0] * input_size[1] + + x = torch.rand(B, L, in_c) + patch_merge = PatchMerging( + in_channels=in_c, + out_channels=out_c, + kernel_size=kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + bias=bias) + + x_out, out_size = patch_merge(x, input_size) + assert x_out.size() == (B, 2, 3) + assert out_size == (2, 1) + assert x_out.size(1) == out_size[0] * out_size[1] + + # test different kernel_size with different stride + input_size = (6, 5) + kernel_size = (6, 2) + stride = (6, 2) + dilation = 1 + bias = False + L = input_size[0] * input_size[1] + + x = torch.rand(B, L, in_c) + patch_merge = PatchMerging( + in_channels=in_c, + out_channels=out_c, + kernel_size=kernel_size, + stride=stride, + padding=padding, + dilation=dilation, + bias=bias) + + x_out, out_size = patch_merge(x, input_size) + assert x_out.size() == (B, 3, 3) + assert out_size == (1, 3) + assert x_out.size(1) == out_size[0] * out_size[1] + + +def test_detr_transformer_dencoder_encoder_layer(): + config = ConfigDict( + dict( + return_intermediate=True, + num_layers=6, + transformerlayers=dict( + type='DetrTransformerDecoderLayer', + attn_cfgs=dict( + type='MultiheadAttention', + embed_dims=256, + num_heads=8, + dropout=0.1), + feedforward_channels=2048, + ffn_dropout=0.1, + operation_order=( + 'norm', + 'self_attn', + 'norm', + 'cross_attn', + 'norm', + 'ffn', + )))) + assert DetrTransformerDecoder(**config).layers[0].pre_norm + assert len(DetrTransformerDecoder(**config).layers) == 6 + + DetrTransformerDecoder(**config) + with pytest.raises(AssertionError): + config = ConfigDict( + dict( + return_intermediate=True, + num_layers=6, + transformerlayers=[ + dict( + type='DetrTransformerDecoderLayer', + attn_cfgs=dict( + type='MultiheadAttention', + embed_dims=256, + num_heads=8, + dropout=0.1), + feedforward_channels=2048, + ffn_dropout=0.1, + operation_order=('self_attn', 'norm', 'cross_attn', + 'norm', 'ffn', 'norm')) + ] * 5)) + DetrTransformerDecoder(**config) + + config = ConfigDict( + dict( + num_layers=6, + transformerlayers=dict( + type='DetrTransformerDecoderLayer', + attn_cfgs=dict( + type='MultiheadAttention', + embed_dims=256, + num_heads=8, + dropout=0.1), + feedforward_channels=2048, + ffn_dropout=0.1, + operation_order=('norm', 'self_attn', 'norm', 'cross_attn', + 'norm', 'ffn', 'norm')))) + + with pytest.raises(AssertionError): + # len(operation_order) == 6 + DetrTransformerEncoder(**config) + + +def test_transformer(): + config = ConfigDict( + dict( + encoder=dict( + type='DetrTransformerEncoder', + num_layers=6, + transformerlayers=dict( + type='BaseTransformerLayer', + attn_cfgs=[ + dict( + type='MultiheadAttention', + embed_dims=256, + num_heads=8, + dropout=0.1) + ], + feedforward_channels=2048, + ffn_dropout=0.1, + operation_order=('self_attn', 'norm', 'ffn', 'norm'))), + decoder=dict( + type='DetrTransformerDecoder', + return_intermediate=True, + num_layers=6, + transformerlayers=dict( + type='DetrTransformerDecoderLayer', + attn_cfgs=dict( + type='MultiheadAttention', + embed_dims=256, + num_heads=8, + dropout=0.1), + feedforward_channels=2048, + ffn_dropout=0.1, + operation_order=('self_attn', 'norm', 'cross_attn', 'norm', + 'ffn', 'norm')), + ))) + transformer = Transformer(**config) + transformer.init_weights() diff --git a/tests/test_onnx/__init__.py b/tests/test_onnx/__init__.py new file mode 100644 index 0000000..76d466f --- /dev/null +++ b/tests/test_onnx/__init__.py @@ -0,0 +1,4 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from .utils import ort_validate + +__all__ = ['ort_validate'] diff --git a/tests/test_onnx/test_head.py b/tests/test_onnx/test_head.py new file mode 100644 index 0000000..978c46a --- /dev/null +++ b/tests/test_onnx/test_head.py @@ -0,0 +1,453 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +from functools import partial + +import mmcv +import numpy as np +import pytest +import torch +from mmcv.cnn import Scale + +from mmdet import digit_version +from mmdet.models import build_detector +from mmdet.models.dense_heads import (FCOSHead, FSAFHead, RetinaHead, SSDHead, + YOLOV3Head) +from .utils import ort_validate + +data_path = osp.join(osp.dirname(__file__), 'data') + +if digit_version(torch.__version__) <= digit_version('1.5.0'): + pytest.skip( + 'ort backend does not support version below 1.5.0', + allow_module_level=True) + + +def test_cascade_onnx_export(): + + config_path = './configs/cascade_rcnn/cascade_rcnn_r50_fpn_1x_coco.py' + cfg = mmcv.Config.fromfile(config_path) + model = build_detector(cfg.model, test_cfg=cfg.get('test_cfg')) + with torch.no_grad(): + model.forward = partial(model.forward, img_metas=[[dict()]]) + + dynamic_axes = { + 'input_img': { + 0: 'batch', + 2: 'width', + 3: 'height' + }, + 'dets': { + 0: 'batch', + 1: 'num_dets', + }, + 'labels': { + 0: 'batch', + 1: 'num_dets', + }, + } + torch.onnx.export( + model, [torch.rand(1, 3, 400, 500)], + 'tmp.onnx', + output_names=['dets', 'labels'], + input_names=['input_img'], + keep_initializers_as_inputs=True, + do_constant_folding=True, + verbose=False, + opset_version=11, + dynamic_axes=dynamic_axes) + + +def test_faster_onnx_export(): + + config_path = './configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py' + cfg = mmcv.Config.fromfile(config_path) + model = build_detector(cfg.model, test_cfg=cfg.get('test_cfg')) + with torch.no_grad(): + model.forward = partial(model.forward, img_metas=[[dict()]]) + + dynamic_axes = { + 'input_img': { + 0: 'batch', + 2: 'width', + 3: 'height' + }, + 'dets': { + 0: 'batch', + 1: 'num_dets', + }, + 'labels': { + 0: 'batch', + 1: 'num_dets', + }, + } + torch.onnx.export( + model, [torch.rand(1, 3, 400, 500)], + 'tmp.onnx', + output_names=['dets', 'labels'], + input_names=['input_img'], + keep_initializers_as_inputs=True, + do_constant_folding=True, + verbose=False, + opset_version=11, + dynamic_axes=dynamic_axes) + + +def retinanet_config(): + """RetinanNet Head Config.""" + head_cfg = dict( + stacked_convs=6, + feat_channels=2, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0])) + + test_cfg = mmcv.Config( + dict( + deploy_nms_pre=0, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) + + model = RetinaHead( + num_classes=4, in_channels=1, test_cfg=test_cfg, **head_cfg) + model.requires_grad_(False) + + return model + + +def test_retina_head_forward_single(): + """Test RetinaNet Head single forward in torch and onnxruntime env.""" + retina_model = retinanet_config() + + feat = torch.rand(1, retina_model.in_channels, 32, 32) + # validate the result between the torch and ort + ort_validate(retina_model.forward_single, feat) + + +def test_retina_head_forward(): + """Test RetinaNet Head forward in torch and onnxruntime env.""" + retina_model = retinanet_config() + s = 128 + # RetinaNet head expects a multiple levels of features per image + feats = [ + torch.rand(1, retina_model.in_channels, s // (2**(i + 2)), + s // (2**(i + 2))) # [32, 16, 8, 4, 2] + for i in range(len(retina_model.prior_generator.strides)) + ] + ort_validate(retina_model.forward, feats) + + +def test_retinanet_head_onnx_export(): + """Test RetinaNet Head _get_bboxes() in torch and onnxruntime env.""" + retina_model = retinanet_config() + s = 128 + img_metas = [{ + 'img_shape_for_onnx': torch.Tensor([s, s]), + 'scale_factor': np.ones(4), + 'pad_shape': (s, s, 3), + 'img_shape': (s, s, 2) + }] + + # The data of retina_head_get_bboxes.pkl contains two parts: + # cls_score(list(Tensor)) and bboxes(list(Tensor)), + # where each torch.Tensor is generated by torch.rand(). + # the cls_score's size: (1, 36, 32, 32), (1, 36, 16, 16), + # (1, 36, 8, 8), (1, 36, 4, 4), (1, 36, 2, 2). + # the bboxes's size: (1, 36, 32, 32), (1, 36, 16, 16), + # (1, 36, 8, 8), (1, 36, 4, 4), (1, 36, 2, 2) + retina_head_data = 'retina_head_get_bboxes.pkl' + feats = mmcv.load(osp.join(data_path, retina_head_data)) + cls_score = feats[:5] + bboxes = feats[5:] + + retina_model.onnx_export = partial( + retina_model.onnx_export, img_metas=img_metas, with_nms=False) + ort_validate(retina_model.onnx_export, (cls_score, bboxes)) + + +def yolo_config(): + """YoloV3 Head Config.""" + head_cfg = dict( + anchor_generator=dict( + type='YOLOAnchorGenerator', + base_sizes=[[(116, 90), (156, 198), (373, 326)], + [(30, 61), (62, 45), (59, 119)], + [(10, 13), (16, 30), (33, 23)]], + strides=[32, 16, 8]), + bbox_coder=dict(type='YOLOBBoxCoder')) + + test_cfg = mmcv.Config( + dict( + deploy_nms_pre=0, + min_bbox_size=0, + score_thr=0.05, + conf_thr=0.005, + nms=dict(type='nms', iou_threshold=0.45), + max_per_img=100)) + + model = YOLOV3Head( + num_classes=4, + in_channels=[1, 1, 1], + out_channels=[16, 8, 4], + test_cfg=test_cfg, + **head_cfg) + model.requires_grad_(False) + # yolov3 need eval() + model.cpu().eval() + return model + + +def test_yolov3_head_forward(): + """Test Yolov3 head forward() in torch and ort env.""" + yolo_model = yolo_config() + + # Yolov3 head expects a multiple levels of features per image + feats = [ + torch.rand(1, 1, 64 // (2**(i + 2)), 64 // (2**(i + 2))) + for i in range(len(yolo_model.in_channels)) + ] + ort_validate(yolo_model.forward, feats) + + +def test_yolov3_head_onnx_export(): + """Test yolov3 head get_bboxes() in torch and ort env.""" + yolo_model = yolo_config() + s = 128 + img_metas = [{ + 'img_shape_for_onnx': torch.Tensor([s, s]), + 'img_shape': (s, s, 3), + 'scale_factor': np.ones(4), + 'pad_shape': (s, s, 3) + }] + + # The data of yolov3_head_get_bboxes.pkl contains + # a list of torch.Tensor, where each torch.Tensor + # is generated by torch.rand and each tensor size is: + # (1, 27, 32, 32), (1, 27, 16, 16), (1, 27, 8, 8). + yolo_head_data = 'yolov3_head_get_bboxes.pkl' + pred_maps = mmcv.load(osp.join(data_path, yolo_head_data)) + + yolo_model.onnx_export = partial( + yolo_model.onnx_export, img_metas=img_metas, with_nms=False) + ort_validate(yolo_model.onnx_export, pred_maps) + + +def fcos_config(): + """FCOS Head Config.""" + test_cfg = mmcv.Config( + dict( + deploy_nms_pre=0, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) + + model = FCOSHead(num_classes=4, in_channels=1, test_cfg=test_cfg) + + model.requires_grad_(False) + return model + + +def test_fcos_head_forward_single(): + """Test fcos forward single in torch and ort env.""" + fcos_model = fcos_config() + + feat = torch.rand(1, fcos_model.in_channels, 32, 32) + fcos_model.forward_single = partial( + fcos_model.forward_single, + scale=Scale(1.0).requires_grad_(False), + stride=(4, )) + ort_validate(fcos_model.forward_single, feat) + + +def test_fcos_head_forward(): + """Test fcos forward in mutil-level feature map.""" + fcos_model = fcos_config() + s = 128 + feats = [ + torch.rand(1, 1, s // feat_size, s // feat_size) + for feat_size in [4, 8, 16, 32, 64] + ] + ort_validate(fcos_model.forward, feats) + + +def test_fcos_head_onnx_export(): + """Test fcos head get_bboxes() in ort.""" + fcos_model = fcos_config() + s = 128 + img_metas = [{ + 'img_shape_for_onnx': torch.Tensor([s, s]), + 'img_shape': (s, s, 3), + 'scale_factor': np.ones(4), + 'pad_shape': (s, s, 3) + }] + + cls_scores = [ + torch.rand(1, fcos_model.num_classes, s // feat_size, s // feat_size) + for feat_size in [4, 8, 16, 32, 64] + ] + bboxes = [ + torch.rand(1, 4, s // feat_size, s // feat_size) + for feat_size in [4, 8, 16, 32, 64] + ] + centerness = [ + torch.rand(1, 1, s // feat_size, s // feat_size) + for feat_size in [4, 8, 16, 32, 64] + ] + + fcos_model.onnx_export = partial( + fcos_model.onnx_export, img_metas=img_metas, with_nms=False) + ort_validate(fcos_model.onnx_export, (cls_scores, bboxes, centerness)) + + +def fsaf_config(): + """FSAF Head Config.""" + cfg = dict( + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=1, + scales_per_octave=1, + ratios=[1.0], + strides=[8, 16, 32, 64, 128])) + + test_cfg = mmcv.Config( + dict( + deploy_nms_pre=0, + min_bbox_size=0, + score_thr=0.05, + nms=dict(type='nms', iou_threshold=0.5), + max_per_img=100)) + + model = FSAFHead(num_classes=4, in_channels=1, test_cfg=test_cfg, **cfg) + model.requires_grad_(False) + return model + + +def test_fsaf_head_forward_single(): + """Test RetinaNet Head forward_single() in torch and onnxruntime env.""" + fsaf_model = fsaf_config() + + feat = torch.rand(1, fsaf_model.in_channels, 32, 32) + ort_validate(fsaf_model.forward_single, feat) + + +def test_fsaf_head_forward(): + """Test RetinaNet Head forward in torch and onnxruntime env.""" + fsaf_model = fsaf_config() + s = 128 + feats = [ + torch.rand(1, fsaf_model.in_channels, s // (2**(i + 2)), + s // (2**(i + 2))) + for i in range(len(fsaf_model.anchor_generator.strides)) + ] + ort_validate(fsaf_model.forward, feats) + + +def test_fsaf_head_onnx_export(): + """Test RetinaNet Head get_bboxes in torch and onnxruntime env.""" + fsaf_model = fsaf_config() + s = 256 + img_metas = [{ + 'img_shape_for_onnx': torch.Tensor([s, s]), + 'scale_factor': np.ones(4), + 'pad_shape': (s, s, 3), + 'img_shape': (s, s, 2) + }] + + # The data of fsaf_head_get_bboxes.pkl contains two parts: + # cls_score(list(Tensor)) and bboxes(list(Tensor)), + # where each torch.Tensor is generated by torch.rand(). + # the cls_score's size: (1, 4, 64, 64), (1, 4, 32, 32), + # (1, 4, 16, 16), (1, 4, 8, 8), (1, 4, 4, 4). + # the bboxes's size: (1, 4, 64, 64), (1, 4, 32, 32), + # (1, 4, 16, 16), (1, 4, 8, 8), (1, 4, 4, 4). + fsaf_head_data = 'fsaf_head_get_bboxes.pkl' + feats = mmcv.load(osp.join(data_path, fsaf_head_data)) + cls_score = feats[:5] + bboxes = feats[5:] + + fsaf_model.onnx_export = partial( + fsaf_model.onnx_export, img_metas=img_metas, with_nms=False) + ort_validate(fsaf_model.onnx_export, (cls_score, bboxes)) + + +def ssd_config(): + """SSD Head Config.""" + cfg = dict( + anchor_generator=dict( + type='SSDAnchorGenerator', + scale_major=False, + input_size=300, + basesize_ratio_range=(0.15, 0.9), + strides=[8, 16, 32, 64, 100, 300], + ratios=[[2], [2, 3], [2, 3], [2, 3], [2], [2]]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[0.1, 0.1, 0.2, 0.2])) + + test_cfg = mmcv.Config( + dict( + deploy_nms_pre=0, + nms=dict(type='nms', iou_threshold=0.45), + min_bbox_size=0, + score_thr=0.02, + max_per_img=200)) + + model = SSDHead( + num_classes=4, + in_channels=(4, 8, 4, 2, 2, 2), + test_cfg=test_cfg, + **cfg) + + model.requires_grad_(False) + return model + + +def test_ssd_head_forward(): + """Test SSD Head forward in torch and onnxruntime env.""" + ssd_model = ssd_config() + + featmap_size = [38, 19, 10, 6, 5, 3, 1] + + feats = [ + torch.rand(1, ssd_model.in_channels[i], featmap_size[i], + featmap_size[i]) for i in range(len(ssd_model.in_channels)) + ] + ort_validate(ssd_model.forward, feats) + + +def test_ssd_head_onnx_export(): + """Test SSD Head get_bboxes in torch and onnxruntime env.""" + ssd_model = ssd_config() + s = 300 + img_metas = [{ + 'img_shape_for_onnx': torch.Tensor([s, s]), + 'scale_factor': np.ones(4), + 'pad_shape': (s, s, 3), + 'img_shape': (s, s, 2) + }] + + # The data of ssd_head_get_bboxes.pkl contains two parts: + # cls_score(list(Tensor)) and bboxes(list(Tensor)), + # where each torch.Tensor is generated by torch.rand(). + # the cls_score's size: (1, 20, 38, 38), (1, 30, 19, 19), + # (1, 30, 10, 10), (1, 30, 5, 5), (1, 20, 3, 3), (1, 20, 1, 1). + # the bboxes's size: (1, 16, 38, 38), (1, 24, 19, 19), + # (1, 24, 10, 10), (1, 24, 5, 5), (1, 16, 3, 3), (1, 16, 1, 1). + ssd_head_data = 'ssd_head_get_bboxes.pkl' + feats = mmcv.load(osp.join(data_path, ssd_head_data)) + cls_score = feats[:6] + bboxes = feats[6:] + + ssd_model.onnx_export = partial( + ssd_model.onnx_export, img_metas=img_metas, with_nms=False) + ort_validate(ssd_model.onnx_export, (cls_score, bboxes)) diff --git a/tests/test_onnx/test_neck.py b/tests/test_onnx/test_neck.py new file mode 100644 index 0000000..a1a5cc8 --- /dev/null +++ b/tests/test_onnx/test_neck.py @@ -0,0 +1,163 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp + +import mmcv +import pytest +import torch + +from mmdet import digit_version +from mmdet.models.necks import FPN, YOLOV3Neck +from .utils import ort_validate + +if digit_version(torch.__version__) <= digit_version('1.5.0'): + pytest.skip( + 'ort backend does not support version below 1.5.0', + allow_module_level=True) + +# Control the returned model of fpn_neck_config() +fpn_test_step_names = { + 'fpn_normal': 0, + 'fpn_wo_extra_convs': 1, + 'fpn_lateral_bns': 2, + 'fpn_bilinear_upsample': 3, + 'fpn_scale_factor': 4, + 'fpn_extra_convs_inputs': 5, + 'fpn_extra_convs_laterals': 6, + 'fpn_extra_convs_outputs': 7, +} + +# Control the returned model of yolo_neck_config() +yolo_test_step_names = {'yolo_normal': 0} + +data_path = osp.join(osp.dirname(__file__), 'data') + + +def fpn_neck_config(test_step_name): + """Return the class containing the corresponding attributes according to + the fpn_test_step_names.""" + s = 64 + in_channels = [8, 16, 32, 64] + feat_sizes = [s // 2**i for i in range(4)] # [64, 32, 16, 8] + out_channels = 8 + + feats = [ + torch.rand(1, in_channels[i], feat_sizes[i], feat_sizes[i]) + for i in range(len(in_channels)) + ] + + if (fpn_test_step_names[test_step_name] == 0): + fpn_model = FPN( + in_channels=in_channels, + out_channels=out_channels, + add_extra_convs=True, + num_outs=5) + elif (fpn_test_step_names[test_step_name] == 1): + fpn_model = FPN( + in_channels=in_channels, + out_channels=out_channels, + add_extra_convs=False, + num_outs=5) + elif (fpn_test_step_names[test_step_name] == 2): + fpn_model = FPN( + in_channels=in_channels, + out_channels=out_channels, + add_extra_convs=True, + no_norm_on_lateral=False, + norm_cfg=dict(type='BN', requires_grad=True), + num_outs=5) + elif (fpn_test_step_names[test_step_name] == 3): + fpn_model = FPN( + in_channels=in_channels, + out_channels=out_channels, + add_extra_convs=True, + upsample_cfg=dict(mode='bilinear', align_corners=True), + num_outs=5) + elif (fpn_test_step_names[test_step_name] == 4): + fpn_model = FPN( + in_channels=in_channels, + out_channels=out_channels, + add_extra_convs=True, + upsample_cfg=dict(scale_factor=2), + num_outs=5) + elif (fpn_test_step_names[test_step_name] == 5): + fpn_model = FPN( + in_channels=in_channels, + out_channels=out_channels, + add_extra_convs='on_input', + num_outs=5) + elif (fpn_test_step_names[test_step_name] == 6): + fpn_model = FPN( + in_channels=in_channels, + out_channels=out_channels, + add_extra_convs='on_lateral', + num_outs=5) + elif (fpn_test_step_names[test_step_name] == 7): + fpn_model = FPN( + in_channels=in_channels, + out_channels=out_channels, + add_extra_convs='on_output', + num_outs=5) + return fpn_model, feats + + +def yolo_neck_config(test_step_name): + """Config yolov3 Neck.""" + in_channels = [16, 8, 4] + out_channels = [8, 4, 2] + + # The data of yolov3_neck.pkl contains a list of + # torch.Tensor, where each torch.Tensor is generated by + # torch.rand and each tensor size is: + # (1, 4, 64, 64), (1, 8, 32, 32), (1, 16, 16, 16). + yolov3_neck_data = 'yolov3_neck.pkl' + feats = mmcv.load(osp.join(data_path, yolov3_neck_data)) + + if (yolo_test_step_names[test_step_name] == 0): + yolo_model = YOLOV3Neck( + in_channels=in_channels, out_channels=out_channels, num_scales=3) + return yolo_model, feats + + +def test_fpn_normal(): + outs = fpn_neck_config('fpn_normal') + ort_validate(*outs) + + +def test_fpn_wo_extra_convs(): + outs = fpn_neck_config('fpn_wo_extra_convs') + ort_validate(*outs) + + +def test_fpn_lateral_bns(): + outs = fpn_neck_config('fpn_lateral_bns') + ort_validate(*outs) + + +def test_fpn_bilinear_upsample(): + outs = fpn_neck_config('fpn_bilinear_upsample') + ort_validate(*outs) + + +def test_fpn_scale_factor(): + outs = fpn_neck_config('fpn_scale_factor') + ort_validate(*outs) + + +def test_fpn_extra_convs_inputs(): + outs = fpn_neck_config('fpn_extra_convs_inputs') + ort_validate(*outs) + + +def test_fpn_extra_convs_laterals(): + outs = fpn_neck_config('fpn_extra_convs_laterals') + ort_validate(*outs) + + +def test_fpn_extra_convs_outputs(): + outs = fpn_neck_config('fpn_extra_convs_outputs') + ort_validate(*outs) + + +def test_yolo_normal(): + outs = yolo_neck_config('yolo_normal') + ort_validate(*outs) diff --git a/tests/test_onnx/utils.py b/tests/test_onnx/utils.py new file mode 100644 index 0000000..ad95e9e --- /dev/null +++ b/tests/test_onnx/utils.py @@ -0,0 +1,137 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os +import os.path as osp +import warnings + +import numpy as np +import onnx +import onnxruntime as ort +import torch +import torch.nn as nn + +ort_custom_op_path = '' +try: + from mmcv.ops import get_onnxruntime_op_path + ort_custom_op_path = get_onnxruntime_op_path() +except (ImportError, ModuleNotFoundError): + warnings.warn('If input model has custom op from mmcv, \ + you may have to build mmcv with ONNXRuntime from source.') + + +class WrapFunction(nn.Module): + """Wrap the function to be tested for torch.onnx.export tracking.""" + + def __init__(self, wrapped_function): + super(WrapFunction, self).__init__() + self.wrapped_function = wrapped_function + + def forward(self, *args, **kwargs): + return self.wrapped_function(*args, **kwargs) + + +def ort_validate(model, feats, onnx_io='tmp.onnx'): + """Validate the output of the onnxruntime backend is the same as the output + generated by torch. + + Args: + model (nn.Module | function): the function of model or model + to be verified. + feats (tuple(list(torch.Tensor)) | list(torch.Tensor) | torch.Tensor): + the input of model. + onnx_io (str): the name of onnx output file. + """ + # if model is not an instance of nn.Module, then it is a normal + # function and it should be wrapped. + if isinstance(model, nn.Module): + wrap_model = model + else: + wrap_model = WrapFunction(model) + wrap_model.cpu().eval() + with torch.no_grad(): + torch.onnx.export( + wrap_model, + feats, + onnx_io, + export_params=True, + keep_initializers_as_inputs=True, + do_constant_folding=True, + verbose=False, + opset_version=11) + + if isinstance(feats, tuple): + ort_feats = [] + for feat in feats: + ort_feats += feat + else: + ort_feats = feats + # default model name: tmp.onnx + onnx_outputs = get_ort_model_output(ort_feats) + + # remove temp file + if osp.exists(onnx_io): + os.remove(onnx_io) + + if isinstance(feats, tuple): + torch_outputs = convert_result_list(wrap_model.forward(*feats)) + else: + torch_outputs = convert_result_list(wrap_model.forward(feats)) + torch_outputs = [ + torch_output.detach().numpy() for torch_output in torch_outputs + ] + + # match torch_outputs and onnx_outputs + for i in range(len(onnx_outputs)): + np.testing.assert_allclose( + torch_outputs[i], onnx_outputs[i], rtol=1e-03, atol=1e-05) + + +def get_ort_model_output(feat, onnx_io='tmp.onnx'): + """Run the model in onnxruntime env. + + Args: + feat (list[Tensor]): A list of tensors from torch.rand, + each is a 4D-tensor. + + Returns: + list[np.array]: onnxruntime infer result, each is a np.array + """ + + onnx_model = onnx.load(onnx_io) + onnx.checker.check_model(onnx_model) + + session_options = ort.SessionOptions() + # register custom op for onnxruntime + if osp.exists(ort_custom_op_path): + session_options.register_custom_ops_library(ort_custom_op_path) + sess = ort.InferenceSession(onnx_io, session_options) + if isinstance(feat, torch.Tensor): + onnx_outputs = sess.run(None, + {sess.get_inputs()[0].name: feat.numpy()}) + else: + onnx_outputs = sess.run(None, { + sess.get_inputs()[i].name: feat[i].numpy() + for i in range(len(feat)) + }) + return onnx_outputs + + +def convert_result_list(outputs): + """Convert the torch forward outputs containing tuple or list to a list + only containing torch.Tensor. + + Args: + output (list(Tensor) | tuple(list(Tensor) | ...): the outputs + in torch env, maybe containing nested structures such as list + or tuple. + + Returns: + list(Tensor): a list only containing torch.Tensor + """ + # recursive end condition + if isinstance(outputs, torch.Tensor): + return [outputs] + + ret = [] + for sub in outputs: + ret += convert_result_list(sub) + return ret diff --git a/tests/test_runtime/async_benchmark.py b/tests/test_runtime/async_benchmark.py new file mode 100644 index 0000000..aa692c4 --- /dev/null +++ b/tests/test_runtime/async_benchmark.py @@ -0,0 +1,102 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import asyncio +import os +import shutil +import urllib + +import mmcv +import torch + +from mmdet.apis import (async_inference_detector, inference_detector, + init_detector) +from mmdet.utils.contextmanagers import concurrent +from mmdet.utils.profiling import profile_time + + +async def main(): + """Benchmark between async and synchronous inference interfaces. + + Sample runs for 20 demo images on K80 GPU, model - mask_rcnn_r50_fpn_1x: + + async sync + + 7981.79 ms 9660.82 ms + 8074.52 ms 9660.94 ms + 7976.44 ms 9406.83 ms + + Async variant takes about 0.83-0.85 of the time of the synchronous + interface. + """ + project_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + project_dir = os.path.join(project_dir, '..') + + config_file = os.path.join( + project_dir, 'configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py') + checkpoint_file = os.path.join( + project_dir, + 'checkpoints/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth') + + if not os.path.exists(checkpoint_file): + url = ('https://download.openmmlab.com/mmdetection/v2.0' + '/mask_rcnn/mask_rcnn_r50_fpn_1x_coco' + '/mask_rcnn_r50_fpn_1x_coco_20200205-d4b0c5d6.pth') + print(f'Downloading {url} ...') + local_filename, _ = urllib.request.urlretrieve(url) + os.makedirs(os.path.dirname(checkpoint_file), exist_ok=True) + shutil.move(local_filename, checkpoint_file) + print(f'Saved as {checkpoint_file}') + else: + print(f'Using existing checkpoint {checkpoint_file}') + + device = 'cuda:0' + model = init_detector( + config_file, checkpoint=checkpoint_file, device=device) + + # queue is used for concurrent inference of multiple images + streamqueue = asyncio.Queue() + # queue size defines concurrency level + streamqueue_size = 4 + + for _ in range(streamqueue_size): + streamqueue.put_nowait(torch.cuda.Stream(device=device)) + + # test a single image and show the results + img = mmcv.imread(os.path.join(project_dir, 'demo/demo.jpg')) + + # warmup + await async_inference_detector(model, img) + + async def detect(img): + async with concurrent(streamqueue): + return await async_inference_detector(model, img) + + num_of_images = 20 + with profile_time('benchmark', 'async'): + tasks = [ + asyncio.create_task(detect(img)) for _ in range(num_of_images) + ] + async_results = await asyncio.gather(*tasks) + + with torch.cuda.stream(torch.cuda.default_stream()): + with profile_time('benchmark', 'sync'): + sync_results = [ + inference_detector(model, img) for _ in range(num_of_images) + ] + + result_dir = os.path.join(project_dir, 'demo') + model.show_result( + img, + async_results[0], + score_thr=0.5, + show=False, + out_file=os.path.join(result_dir, 'result_async.jpg')) + model.show_result( + img, + sync_results[0], + score_thr=0.5, + show=False, + out_file=os.path.join(result_dir, 'result_sync.jpg')) + + +if __name__ == '__main__': + asyncio.run(main()) diff --git a/tests/test_runtime/test_apis.py b/tests/test_runtime/test_apis.py new file mode 100644 index 0000000..2394d12 --- /dev/null +++ b/tests/test_runtime/test_apis.py @@ -0,0 +1,32 @@ +import os +from pathlib import Path + +import pytest + +from mmdet.apis import init_detector + + +def test_init_detector(): + project_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) + project_dir = os.path.join(project_dir, '..') + + config_file = os.path.join( + project_dir, 'configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py') + + # test init_detector with config_file: str and cfg_options + cfg_options = dict( + model=dict( + backbone=dict( + depth=18, + init_cfg=dict( + type='Pretrained', checkpoint='torchvision://resnet18')))) + model = init_detector(config_file, device='cpu', cfg_options=cfg_options) + + # test init_detector with :obj:`Path` + config_path_object = Path(config_file) + model = init_detector(config_path_object, device='cpu') + + # test init_detector with undesirable type + with pytest.raises(TypeError): + config_list = [config_file] + model = init_detector(config_list) # noqa: F841 diff --git a/tests/test_runtime/test_async.py b/tests/test_runtime/test_async.py new file mode 100644 index 0000000..1af1501 --- /dev/null +++ b/tests/test_runtime/test_async.py @@ -0,0 +1,83 @@ +# Copyright (c) OpenMMLab. All rights reserved. +"""Tests for async interface.""" + +import asyncio +import os +import sys + +import asynctest +import mmcv +import torch + +from mmdet.apis import async_inference_detector, init_detector + +if sys.version_info >= (3, 7): + from mmdet.utils.contextmanagers import concurrent + + +class AsyncTestCase(asynctest.TestCase): + use_default_loop = False + forbid_get_event_loop = True + + TEST_TIMEOUT = int(os.getenv('ASYNCIO_TEST_TIMEOUT', '30')) + + def _run_test_method(self, method): + result = method() + if asyncio.iscoroutine(result): + self.loop.run_until_complete( + asyncio.wait_for(result, timeout=self.TEST_TIMEOUT)) + + +class MaskRCNNDetector: + + def __init__(self, + model_config, + checkpoint=None, + streamqueue_size=3, + device='cuda:0'): + + self.streamqueue_size = streamqueue_size + self.device = device + # build the model and load checkpoint + self.model = init_detector( + model_config, checkpoint=None, device=self.device) + self.streamqueue = None + + async def init(self): + self.streamqueue = asyncio.Queue() + for _ in range(self.streamqueue_size): + stream = torch.cuda.Stream(device=self.device) + self.streamqueue.put_nowait(stream) + + if sys.version_info >= (3, 7): + + async def apredict(self, img): + if isinstance(img, str): + img = mmcv.imread(img) + async with concurrent(self.streamqueue): + result = await async_inference_detector(self.model, img) + return result + + +class AsyncInferenceTestCase(AsyncTestCase): + + if sys.version_info >= (3, 7): + + async def test_simple_inference(self): + if not torch.cuda.is_available(): + import pytest + + pytest.skip('test requires GPU and torch+cuda') + + ori_grad_enabled = torch.is_grad_enabled() + root_dir = os.path.dirname(os.path.dirname(__name__)) + model_config = os.path.join( + root_dir, 'configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py') + detector = MaskRCNNDetector(model_config) + await detector.init() + img_path = os.path.join(root_dir, 'demo/demo.jpg') + bboxes, _ = await detector.apredict(img_path) + self.assertTrue(bboxes) + # asy inference detector will hack grad_enabled, + # so restore here to avoid it to influence other tests + torch.set_grad_enabled(ori_grad_enabled) diff --git a/tests/test_runtime/test_config.py b/tests/test_runtime/test_config.py new file mode 100644 index 0000000..dce88f4 --- /dev/null +++ b/tests/test_runtime/test_config.py @@ -0,0 +1,373 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from os.path import dirname, exists, join +from unittest.mock import Mock + +import pytest + +from mmdet.core import BitmapMasks, PolygonMasks +from mmdet.datasets.builder import DATASETS +from mmdet.datasets.utils import NumClassCheckHook + + +def _get_config_directory(): + """Find the predefined detector config directory.""" + try: + # Assume we are running in the source mmdetection repo + repo_dpath = dirname(dirname(__file__)) + repo_dpath = join(repo_dpath, '..') + except NameError: + # For IPython development when this __file__ is not defined + import mmdet + repo_dpath = dirname(dirname(mmdet.__file__)) + config_dpath = join(repo_dpath, 'configs') + if not exists(config_dpath): + raise Exception('Cannot find config path') + return config_dpath + + +def _check_numclasscheckhook(detector, config_mod): + dummy_runner = Mock() + dummy_runner.model = detector + + def get_dataset_name_classes(dataset): + # deal with `RepeatDataset`,`ConcatDataset`,`ClassBalancedDataset`.. + if isinstance(dataset, (list, tuple)): + dataset = dataset[0] + while ('dataset' in dataset): + dataset = dataset['dataset'] + # ConcatDataset + if isinstance(dataset, (list, tuple)): + dataset = dataset[0] + return dataset['type'], dataset.get('classes', None) + + compatible_check = NumClassCheckHook() + dataset_name, CLASSES = get_dataset_name_classes( + config_mod['data']['train']) + if CLASSES is None: + CLASSES = DATASETS.get(dataset_name).CLASSES + dummy_runner.data_loader.dataset.CLASSES = CLASSES + compatible_check.before_train_epoch(dummy_runner) + + dummy_runner.data_loader.dataset.CLASSES = None + compatible_check.before_train_epoch(dummy_runner) + + dataset_name, CLASSES = get_dataset_name_classes(config_mod['data']['val']) + if CLASSES is None: + CLASSES = DATASETS.get(dataset_name).CLASSES + dummy_runner.data_loader.dataset.CLASSES = CLASSES + compatible_check.before_val_epoch(dummy_runner) + dummy_runner.data_loader.dataset.CLASSES = None + compatible_check.before_val_epoch(dummy_runner) + + +def _check_roi_head(config, head): + # check consistency between head_config and roi_head + assert config['type'] == head.__class__.__name__ + + # check roi_align + bbox_roi_cfg = config.bbox_roi_extractor + bbox_roi_extractor = head.bbox_roi_extractor + _check_roi_extractor(bbox_roi_cfg, bbox_roi_extractor) + + # check bbox head infos + bbox_cfg = config.bbox_head + bbox_head = head.bbox_head + _check_bbox_head(bbox_cfg, bbox_head) + + if head.with_mask: + # check roi_align + if config.mask_roi_extractor: + mask_roi_cfg = config.mask_roi_extractor + mask_roi_extractor = head.mask_roi_extractor + _check_roi_extractor(mask_roi_cfg, mask_roi_extractor, + bbox_roi_extractor) + + # check mask head infos + mask_head = head.mask_head + mask_cfg = config.mask_head + _check_mask_head(mask_cfg, mask_head) + + # check arch specific settings, e.g., cascade/htc + if config['type'] in ['CascadeRoIHead', 'HybridTaskCascadeRoIHead']: + assert config.num_stages == len(head.bbox_head) + assert config.num_stages == len(head.bbox_roi_extractor) + + if head.with_mask: + assert config.num_stages == len(head.mask_head) + assert config.num_stages == len(head.mask_roi_extractor) + + elif config['type'] in ['MaskScoringRoIHead']: + assert (hasattr(head, 'mask_iou_head') + and head.mask_iou_head is not None) + mask_iou_cfg = config.mask_iou_head + mask_iou_head = head.mask_iou_head + assert (mask_iou_cfg.fc_out_channels == + mask_iou_head.fc_mask_iou.in_features) + + elif config['type'] in ['GridRoIHead']: + grid_roi_cfg = config.grid_roi_extractor + grid_roi_extractor = head.grid_roi_extractor + _check_roi_extractor(grid_roi_cfg, grid_roi_extractor, + bbox_roi_extractor) + + config.grid_head.grid_points = head.grid_head.grid_points + + +def _check_roi_extractor(config, roi_extractor, prev_roi_extractor=None): + import torch.nn as nn + + # Separate roi_extractor and prev_roi_extractor checks for flexibility + if isinstance(roi_extractor, nn.ModuleList): + roi_extractor = roi_extractor[0] + if prev_roi_extractor and isinstance(prev_roi_extractor, nn.ModuleList): + prev_roi_extractor = prev_roi_extractor[0] + + assert (len(config.featmap_strides) == len(roi_extractor.roi_layers)) + assert (config.out_channels == roi_extractor.out_channels) + from torch.nn.modules.utils import _pair + assert (_pair(config.roi_layer.output_size) == + roi_extractor.roi_layers[0].output_size) + + if 'use_torchvision' in config.roi_layer: + assert (config.roi_layer.use_torchvision == + roi_extractor.roi_layers[0].use_torchvision) + elif 'aligned' in config.roi_layer: + assert ( + config.roi_layer.aligned == roi_extractor.roi_layers[0].aligned) + + if prev_roi_extractor: + assert (roi_extractor.roi_layers[0].aligned == + prev_roi_extractor.roi_layers[0].aligned) + assert (roi_extractor.roi_layers[0].use_torchvision == + prev_roi_extractor.roi_layers[0].use_torchvision) + + +def _check_mask_head(mask_cfg, mask_head): + import torch.nn as nn + if isinstance(mask_cfg, list): + for single_mask_cfg, single_mask_head in zip(mask_cfg, mask_head): + _check_mask_head(single_mask_cfg, single_mask_head) + elif isinstance(mask_head, nn.ModuleList): + for single_mask_head in mask_head: + _check_mask_head(mask_cfg, single_mask_head) + else: + assert mask_cfg['type'] == mask_head.__class__.__name__ + assert mask_cfg.in_channels == mask_head.in_channels + class_agnostic = mask_cfg.get('class_agnostic', False) + out_dim = (1 if class_agnostic else mask_cfg.num_classes) + if hasattr(mask_head, 'conv_logits'): + assert (mask_cfg.conv_out_channels == + mask_head.conv_logits.in_channels) + assert mask_head.conv_logits.out_channels == out_dim + else: + assert mask_cfg.fc_out_channels == mask_head.fc_logits.in_features + assert (mask_head.fc_logits.out_features == out_dim * + mask_head.output_area) + + +def _check_bbox_head(bbox_cfg, bbox_head): + import torch.nn as nn + if isinstance(bbox_cfg, list): + for single_bbox_cfg, single_bbox_head in zip(bbox_cfg, bbox_head): + _check_bbox_head(single_bbox_cfg, single_bbox_head) + elif isinstance(bbox_head, nn.ModuleList): + for single_bbox_head in bbox_head: + _check_bbox_head(bbox_cfg, single_bbox_head) + else: + assert bbox_cfg['type'] == bbox_head.__class__.__name__ + if bbox_cfg['type'] == 'SABLHead': + assert bbox_cfg.cls_in_channels == bbox_head.cls_in_channels + assert bbox_cfg.reg_in_channels == bbox_head.reg_in_channels + + cls_out_channels = bbox_cfg.get('cls_out_channels', 1024) + assert (cls_out_channels == bbox_head.fc_cls.in_features) + assert (bbox_cfg.num_classes + 1 == bbox_head.fc_cls.out_features) + + elif bbox_cfg['type'] == 'DIIHead': + assert bbox_cfg['num_ffn_fcs'] == bbox_head.ffn.num_fcs + # 3 means FC and LN and Relu + assert bbox_cfg['num_cls_fcs'] == len(bbox_head.cls_fcs) // 3 + assert bbox_cfg['num_reg_fcs'] == len(bbox_head.reg_fcs) // 3 + assert bbox_cfg['in_channels'] == bbox_head.in_channels + assert bbox_cfg['in_channels'] == bbox_head.fc_cls.in_features + assert bbox_cfg['in_channels'] == bbox_head.fc_reg.in_features + assert bbox_cfg['in_channels'] == bbox_head.attention.embed_dims + assert bbox_cfg[ + 'feedforward_channels'] == bbox_head.ffn.feedforward_channels + + else: + assert bbox_cfg.in_channels == bbox_head.in_channels + with_cls = bbox_cfg.get('with_cls', True) + + if with_cls: + fc_out_channels = bbox_cfg.get('fc_out_channels', 2048) + assert (fc_out_channels == bbox_head.fc_cls.in_features) + if bbox_head.custom_cls_channels: + assert (bbox_head.loss_cls.get_cls_channels( + bbox_head.num_classes) == bbox_head.fc_cls.out_features + ) + else: + assert (bbox_cfg.num_classes + + 1 == bbox_head.fc_cls.out_features) + with_reg = bbox_cfg.get('with_reg', True) + if with_reg: + out_dim = (4 if bbox_cfg.reg_class_agnostic else 4 * + bbox_cfg.num_classes) + assert bbox_head.fc_reg.out_features == out_dim + + +def _check_anchorhead(config, head): + # check consistency between head_config and roi_head + assert config['type'] == head.__class__.__name__ + assert config.in_channels == head.in_channels + + num_classes = ( + config.num_classes - + 1 if config.loss_cls.get('use_sigmoid', False) else config.num_classes) + if config['type'] == 'ATSSHead': + assert (config.feat_channels == head.atss_cls.in_channels) + assert (config.feat_channels == head.atss_reg.in_channels) + assert (config.feat_channels == head.atss_centerness.in_channels) + elif config['type'] == 'SABLRetinaHead': + assert (config.feat_channels == head.retina_cls.in_channels) + assert (config.feat_channels == head.retina_bbox_reg.in_channels) + assert (config.feat_channels == head.retina_bbox_cls.in_channels) + else: + assert (config.in_channels == head.conv_cls.in_channels) + assert (config.in_channels == head.conv_reg.in_channels) + assert (head.conv_cls.out_channels == num_classes * head.num_anchors) + assert head.fc_reg.out_channels == 4 * head.num_anchors + + +# Only tests a representative subset of configurations +# TODO: test pipelines using Albu, current Albu throw None given empty GT +@pytest.mark.parametrize( + 'config_rpath', + [ + 'wider_face/ssd300_wider_face.py', + 'pascal_voc/ssd300_voc0712.py', + 'pascal_voc/ssd512_voc0712.py', + # 'albu_example/mask_rcnn_r50_fpn_1x.py', + 'foveabox/fovea_align_r50_fpn_gn-head_mstrain_640-800_4x4_2x_coco.py', + 'mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_1x_coco.py', + 'mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain_1x_coco.py', + 'mask_rcnn/mask_rcnn_r50_fpn_fp16_1x_coco.py' + ]) +def test_config_data_pipeline(config_rpath): + """Test whether the data pipeline is valid and can process corner cases. + + CommandLine: + xdoctest -m tests/test_runtime/ + test_config.py test_config_build_data_pipeline + """ + import numpy as np + from mmcv import Config + + from mmdet.datasets.pipelines import Compose + + config_dpath = _get_config_directory() + print(f'Found config_dpath = {config_dpath}') + + def dummy_masks(h, w, num_obj=3, mode='bitmap'): + assert mode in ('polygon', 'bitmap') + if mode == 'bitmap': + masks = np.random.randint(0, 2, (num_obj, h, w), dtype=np.uint8) + masks = BitmapMasks(masks, h, w) + else: + masks = [] + for i in range(num_obj): + masks.append([]) + masks[-1].append( + np.random.uniform(0, min(h - 1, w - 1), (8 + 4 * i, ))) + masks[-1].append( + np.random.uniform(0, min(h - 1, w - 1), (10 + 4 * i, ))) + masks = PolygonMasks(masks, h, w) + return masks + + config_fpath = join(config_dpath, config_rpath) + cfg = Config.fromfile(config_fpath) + + # remove loading pipeline + loading_pipeline = cfg.train_pipeline.pop(0) + loading_ann_pipeline = cfg.train_pipeline.pop(0) + cfg.test_pipeline.pop(0) + + train_pipeline = Compose(cfg.train_pipeline) + test_pipeline = Compose(cfg.test_pipeline) + + print(f'Building data pipeline, config_fpath = {config_fpath}') + + print(f'Test training data pipeline: \n{train_pipeline!r}') + img = np.random.randint(0, 255, size=(888, 666, 3), dtype=np.uint8) + if loading_pipeline.get('to_float32', False): + img = img.astype(np.float32) + mode = 'bitmap' if loading_ann_pipeline.get('poly2mask', + True) else 'polygon' + results = dict( + filename='test_img.png', + ori_filename='test_img.png', + img=img, + img_shape=img.shape, + ori_shape=img.shape, + gt_bboxes=np.array([[35.2, 11.7, 39.7, 15.7]], dtype=np.float32), + gt_labels=np.array([1], dtype=np.int64), + gt_masks=dummy_masks(img.shape[0], img.shape[1], mode=mode), + ) + results['img_fields'] = ['img'] + results['bbox_fields'] = ['gt_bboxes'] + results['mask_fields'] = ['gt_masks'] + output_results = train_pipeline(results) + assert output_results is not None + + print(f'Test testing data pipeline: \n{test_pipeline!r}') + results = dict( + filename='test_img.png', + ori_filename='test_img.png', + img=img, + img_shape=img.shape, + ori_shape=img.shape, + gt_bboxes=np.array([[35.2, 11.7, 39.7, 15.7]], dtype=np.float32), + gt_labels=np.array([1], dtype=np.int64), + gt_masks=dummy_masks(img.shape[0], img.shape[1], mode=mode), + ) + results['img_fields'] = ['img'] + results['bbox_fields'] = ['gt_bboxes'] + results['mask_fields'] = ['gt_masks'] + output_results = test_pipeline(results) + assert output_results is not None + + # test empty GT + print('Test empty GT with training data pipeline: ' + f'\n{train_pipeline!r}') + results = dict( + filename='test_img.png', + ori_filename='test_img.png', + img=img, + img_shape=img.shape, + ori_shape=img.shape, + gt_bboxes=np.zeros((0, 4), dtype=np.float32), + gt_labels=np.array([], dtype=np.int64), + gt_masks=dummy_masks(img.shape[0], img.shape[1], num_obj=0, mode=mode), + ) + results['img_fields'] = ['img'] + results['bbox_fields'] = ['gt_bboxes'] + results['mask_fields'] = ['gt_masks'] + output_results = train_pipeline(results) + assert output_results is not None + + print(f'Test empty GT with testing data pipeline: \n{test_pipeline!r}') + results = dict( + filename='test_img.png', + ori_filename='test_img.png', + img=img, + img_shape=img.shape, + ori_shape=img.shape, + gt_bboxes=np.zeros((0, 4), dtype=np.float32), + gt_labels=np.array([], dtype=np.int64), + gt_masks=dummy_masks(img.shape[0], img.shape[1], num_obj=0, mode=mode), + ) + results['img_fields'] = ['img'] + results['bbox_fields'] = ['gt_bboxes'] + results['mask_fields'] = ['gt_masks'] + output_results = test_pipeline(results) + assert output_results is not None diff --git a/tests/test_runtime/test_eval_hook.py b/tests/test_runtime/test_eval_hook.py new file mode 100644 index 0000000..ac0f5e9 --- /dev/null +++ b/tests/test_runtime/test_eval_hook.py @@ -0,0 +1,252 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +import tempfile +import unittest.mock as mock +from collections import OrderedDict +from unittest.mock import MagicMock, patch + +import pytest +import torch +import torch.nn as nn +from mmcv.runner import EpochBasedRunner, build_optimizer +from mmcv.utils import get_logger +from torch.utils.data import DataLoader, Dataset + +from mmdet.core import DistEvalHook, EvalHook + + +class ExampleDataset(Dataset): + + def __init__(self): + self.index = 0 + self.eval_result = [0.1, 0.4, 0.3, 0.7, 0.2, 0.05, 0.4, 0.6] + + def __getitem__(self, idx): + results = dict(imgs=torch.tensor([1])) + return results + + def __len__(self): + return 1 + + @mock.create_autospec + def evaluate(self, results, logger=None): + pass + + +class EvalDataset(ExampleDataset): + + def evaluate(self, results, logger=None): + mean_ap = self.eval_result[self.index] + output = OrderedDict(mAP=mean_ap, index=self.index, score=mean_ap) + self.index += 1 + return output + + +class ExampleModel(nn.Module): + + def __init__(self): + super().__init__() + self.conv = nn.Linear(1, 1) + self.test_cfg = None + + def forward(self, imgs, rescale=False, return_loss=False): + return imgs + + def train_step(self, data_batch, optimizer, **kwargs): + outputs = { + 'loss': 0.5, + 'log_vars': { + 'accuracy': 0.98 + }, + 'num_samples': 1 + } + return outputs + + +@pytest.mark.skipif( + not torch.cuda.is_available(), reason='requires CUDA support') +@patch('mmdet.apis.single_gpu_test', MagicMock) +@patch('mmdet.apis.multi_gpu_test', MagicMock) +@pytest.mark.parametrize('EvalHookCls', (EvalHook, DistEvalHook)) +def test_eval_hook(EvalHookCls): + with pytest.raises(TypeError): + # dataloader must be a pytorch DataLoader + test_dataset = ExampleDataset() + data_loader = [ + DataLoader( + test_dataset, + batch_size=1, + sampler=None, + num_worker=0, + shuffle=False) + ] + EvalHookCls(data_loader) + + with pytest.raises(KeyError): + # rule must be in keys of rule_map + test_dataset = ExampleDataset() + data_loader = DataLoader( + test_dataset, + batch_size=1, + sampler=None, + num_workers=0, + shuffle=False) + EvalHookCls(data_loader, save_best='auto', rule='unsupport') + + with pytest.raises(ValueError): + # key_indicator must be valid when rule_map is None + test_dataset = ExampleDataset() + data_loader = DataLoader( + test_dataset, + batch_size=1, + sampler=None, + num_workers=0, + shuffle=False) + EvalHookCls(data_loader, save_best='unsupport') + + optimizer_cfg = dict( + type='SGD', lr=0.01, momentum=0.9, weight_decay=0.0001) + + test_dataset = ExampleDataset() + loader = DataLoader(test_dataset, batch_size=1) + model = ExampleModel() + optimizer = build_optimizer(model, optimizer_cfg) + + data_loader = DataLoader(test_dataset, batch_size=1) + eval_hook = EvalHookCls(data_loader, save_best=None) + with tempfile.TemporaryDirectory() as tmpdir: + logger = get_logger('test_eval') + runner = EpochBasedRunner( + model=model, + batch_processor=None, + optimizer=optimizer, + work_dir=tmpdir, + logger=logger) + runner.register_hook(eval_hook) + runner.run([loader], [('train', 1)], 1) + assert runner.meta is None or 'best_score' not in runner.meta[ + 'hook_msgs'] + assert runner.meta is None or 'best_ckpt' not in runner.meta[ + 'hook_msgs'] + + # when `save_best` is set to 'auto', first metric will be used. + loader = DataLoader(EvalDataset(), batch_size=1) + model = ExampleModel() + data_loader = DataLoader(EvalDataset(), batch_size=1) + eval_hook = EvalHookCls(data_loader, interval=1, save_best='auto') + + with tempfile.TemporaryDirectory() as tmpdir: + logger = get_logger('test_eval') + runner = EpochBasedRunner( + model=model, + batch_processor=None, + optimizer=optimizer, + work_dir=tmpdir, + logger=logger) + runner.register_checkpoint_hook(dict(interval=1)) + runner.register_hook(eval_hook) + runner.run([loader], [('train', 1)], 8) + + real_path = osp.join(tmpdir, 'best_mAP_epoch_4.pth') + + assert runner.meta['hook_msgs']['best_ckpt'] == osp.realpath(real_path) + assert runner.meta['hook_msgs']['best_score'] == 0.7 + + loader = DataLoader(EvalDataset(), batch_size=1) + model = ExampleModel() + data_loader = DataLoader(EvalDataset(), batch_size=1) + eval_hook = EvalHookCls(data_loader, interval=1, save_best='mAP') + + with tempfile.TemporaryDirectory() as tmpdir: + logger = get_logger('test_eval') + runner = EpochBasedRunner( + model=model, + batch_processor=None, + optimizer=optimizer, + work_dir=tmpdir, + logger=logger) + runner.register_checkpoint_hook(dict(interval=1)) + runner.register_hook(eval_hook) + runner.run([loader], [('train', 1)], 8) + + real_path = osp.join(tmpdir, 'best_mAP_epoch_4.pth') + + assert runner.meta['hook_msgs']['best_ckpt'] == osp.realpath(real_path) + assert runner.meta['hook_msgs']['best_score'] == 0.7 + + data_loader = DataLoader(EvalDataset(), batch_size=1) + eval_hook = EvalHookCls( + data_loader, interval=1, save_best='score', rule='greater') + with tempfile.TemporaryDirectory() as tmpdir: + logger = get_logger('test_eval') + runner = EpochBasedRunner( + model=model, + batch_processor=None, + optimizer=optimizer, + work_dir=tmpdir, + logger=logger) + runner.register_checkpoint_hook(dict(interval=1)) + runner.register_hook(eval_hook) + runner.run([loader], [('train', 1)], 8) + + real_path = osp.join(tmpdir, 'best_score_epoch_4.pth') + + assert runner.meta['hook_msgs']['best_ckpt'] == osp.realpath(real_path) + assert runner.meta['hook_msgs']['best_score'] == 0.7 + + data_loader = DataLoader(EvalDataset(), batch_size=1) + eval_hook = EvalHookCls(data_loader, save_best='mAP', rule='less') + with tempfile.TemporaryDirectory() as tmpdir: + logger = get_logger('test_eval') + runner = EpochBasedRunner( + model=model, + batch_processor=None, + optimizer=optimizer, + work_dir=tmpdir, + logger=logger) + runner.register_checkpoint_hook(dict(interval=1)) + runner.register_hook(eval_hook) + runner.run([loader], [('train', 1)], 8) + + real_path = osp.join(tmpdir, 'best_mAP_epoch_6.pth') + + assert runner.meta['hook_msgs']['best_ckpt'] == osp.realpath(real_path) + assert runner.meta['hook_msgs']['best_score'] == 0.05 + + data_loader = DataLoader(EvalDataset(), batch_size=1) + eval_hook = EvalHookCls(data_loader, save_best='mAP') + with tempfile.TemporaryDirectory() as tmpdir: + logger = get_logger('test_eval') + runner = EpochBasedRunner( + model=model, + batch_processor=None, + optimizer=optimizer, + work_dir=tmpdir, + logger=logger) + runner.register_checkpoint_hook(dict(interval=1)) + runner.register_hook(eval_hook) + runner.run([loader], [('train', 1)], 2) + + real_path = osp.join(tmpdir, 'best_mAP_epoch_2.pth') + + assert runner.meta['hook_msgs']['best_ckpt'] == osp.realpath(real_path) + assert runner.meta['hook_msgs']['best_score'] == 0.4 + + resume_from = osp.join(tmpdir, 'latest.pth') + loader = DataLoader(ExampleDataset(), batch_size=1) + eval_hook = EvalHookCls(data_loader, save_best='mAP') + runner = EpochBasedRunner( + model=model, + batch_processor=None, + optimizer=optimizer, + work_dir=tmpdir, + logger=logger) + runner.register_checkpoint_hook(dict(interval=1)) + runner.register_hook(eval_hook) + runner.resume(resume_from) + runner.run([loader], [('train', 1)], 8) + + real_path = osp.join(tmpdir, 'best_mAP_epoch_4.pth') + + assert runner.meta['hook_msgs']['best_ckpt'] == osp.realpath(real_path) + assert runner.meta['hook_msgs']['best_score'] == 0.7 diff --git a/tests/test_runtime/test_fp16.py b/tests/test_runtime/test_fp16.py new file mode 100644 index 0000000..e3dd432 --- /dev/null +++ b/tests/test_runtime/test_fp16.py @@ -0,0 +1,301 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import pytest +import torch +import torch.nn as nn +from mmcv.runner import auto_fp16, force_fp32 +from mmcv.runner.fp16_utils import cast_tensor_type + + +def test_cast_tensor_type(): + inputs = torch.FloatTensor([5.]) + src_type = torch.float32 + dst_type = torch.int32 + outputs = cast_tensor_type(inputs, src_type, dst_type) + assert isinstance(outputs, torch.Tensor) + assert outputs.dtype == dst_type + + inputs = 'tensor' + src_type = str + dst_type = str + outputs = cast_tensor_type(inputs, src_type, dst_type) + assert isinstance(outputs, str) + + inputs = np.array([5.]) + src_type = np.ndarray + dst_type = np.ndarray + outputs = cast_tensor_type(inputs, src_type, dst_type) + assert isinstance(outputs, np.ndarray) + + inputs = dict( + tensor_a=torch.FloatTensor([1.]), tensor_b=torch.FloatTensor([2.])) + src_type = torch.float32 + dst_type = torch.int32 + outputs = cast_tensor_type(inputs, src_type, dst_type) + assert isinstance(outputs, dict) + assert outputs['tensor_a'].dtype == dst_type + assert outputs['tensor_b'].dtype == dst_type + + inputs = [torch.FloatTensor([1.]), torch.FloatTensor([2.])] + src_type = torch.float32 + dst_type = torch.int32 + outputs = cast_tensor_type(inputs, src_type, dst_type) + assert isinstance(outputs, list) + assert outputs[0].dtype == dst_type + assert outputs[1].dtype == dst_type + + inputs = 5 + outputs = cast_tensor_type(inputs, None, None) + assert isinstance(outputs, int) + + +def test_auto_fp16(): + + with pytest.raises(TypeError): + # ExampleObject is not a subclass of nn.Module + + class ExampleObject: + + @auto_fp16() + def __call__(self, x): + return x + + model = ExampleObject() + input_x = torch.ones(1, dtype=torch.float32) + model(input_x) + + # apply to all input args + class ExampleModule(nn.Module): + + @auto_fp16() + def forward(self, x, y): + return x, y + + model = ExampleModule() + input_x = torch.ones(1, dtype=torch.float32) + input_y = torch.ones(1, dtype=torch.float32) + output_x, output_y = model(input_x, input_y) + assert output_x.dtype == torch.float32 + assert output_y.dtype == torch.float32 + + model.fp16_enabled = True + output_x, output_y = model(input_x, input_y) + assert output_x.dtype == torch.half + assert output_y.dtype == torch.half + + if torch.cuda.is_available(): + model.cuda() + output_x, output_y = model(input_x.cuda(), input_y.cuda()) + assert output_x.dtype == torch.half + assert output_y.dtype == torch.half + + # apply to specified input args + class ExampleModule(nn.Module): + + @auto_fp16(apply_to=('x', )) + def forward(self, x, y): + return x, y + + model = ExampleModule() + input_x = torch.ones(1, dtype=torch.float32) + input_y = torch.ones(1, dtype=torch.float32) + output_x, output_y = model(input_x, input_y) + assert output_x.dtype == torch.float32 + assert output_y.dtype == torch.float32 + + model.fp16_enabled = True + output_x, output_y = model(input_x, input_y) + assert output_x.dtype == torch.half + assert output_y.dtype == torch.float32 + + if torch.cuda.is_available(): + model.cuda() + output_x, output_y = model(input_x.cuda(), input_y.cuda()) + assert output_x.dtype == torch.half + assert output_y.dtype == torch.float32 + + # apply to optional input args + class ExampleModule(nn.Module): + + @auto_fp16(apply_to=('x', 'y')) + def forward(self, x, y=None, z=None): + return x, y, z + + model = ExampleModule() + input_x = torch.ones(1, dtype=torch.float32) + input_y = torch.ones(1, dtype=torch.float32) + input_z = torch.ones(1, dtype=torch.float32) + output_x, output_y, output_z = model(input_x, y=input_y, z=input_z) + assert output_x.dtype == torch.float32 + assert output_y.dtype == torch.float32 + assert output_z.dtype == torch.float32 + + model.fp16_enabled = True + output_x, output_y, output_z = model(input_x, y=input_y, z=input_z) + assert output_x.dtype == torch.half + assert output_y.dtype == torch.half + assert output_z.dtype == torch.float32 + + if torch.cuda.is_available(): + model.cuda() + output_x, output_y, output_z = model( + input_x.cuda(), y=input_y.cuda(), z=input_z.cuda()) + assert output_x.dtype == torch.half + assert output_y.dtype == torch.half + assert output_z.dtype == torch.float32 + + # out_fp32=True + class ExampleModule(nn.Module): + + @auto_fp16(apply_to=('x', 'y'), out_fp32=True) + def forward(self, x, y=None, z=None): + return x, y, z + + model = ExampleModule() + input_x = torch.ones(1, dtype=torch.half) + input_y = torch.ones(1, dtype=torch.float32) + input_z = torch.ones(1, dtype=torch.float32) + output_x, output_y, output_z = model(input_x, y=input_y, z=input_z) + assert output_x.dtype == torch.half + assert output_y.dtype == torch.float32 + assert output_z.dtype == torch.float32 + + model.fp16_enabled = True + output_x, output_y, output_z = model(input_x, y=input_y, z=input_z) + assert output_x.dtype == torch.float32 + assert output_y.dtype == torch.float32 + assert output_z.dtype == torch.float32 + + if torch.cuda.is_available(): + model.cuda() + output_x, output_y, output_z = model( + input_x.cuda(), y=input_y.cuda(), z=input_z.cuda()) + assert output_x.dtype == torch.float32 + assert output_y.dtype == torch.float32 + assert output_z.dtype == torch.float32 + + +def test_force_fp32(): + + with pytest.raises(TypeError): + # ExampleObject is not a subclass of nn.Module + + class ExampleObject: + + @force_fp32() + def __call__(self, x): + return x + + model = ExampleObject() + input_x = torch.ones(1, dtype=torch.float32) + model(input_x) + + # apply to all input args + class ExampleModule(nn.Module): + + @force_fp32() + def forward(self, x, y): + return x, y + + model = ExampleModule() + input_x = torch.ones(1, dtype=torch.half) + input_y = torch.ones(1, dtype=torch.half) + output_x, output_y = model(input_x, input_y) + assert output_x.dtype == torch.half + assert output_y.dtype == torch.half + + model.fp16_enabled = True + output_x, output_y = model(input_x, input_y) + assert output_x.dtype == torch.float32 + assert output_y.dtype == torch.float32 + + if torch.cuda.is_available(): + model.cuda() + output_x, output_y = model(input_x.cuda(), input_y.cuda()) + assert output_x.dtype == torch.float32 + assert output_y.dtype == torch.float32 + + # apply to specified input args + class ExampleModule(nn.Module): + + @force_fp32(apply_to=('x', )) + def forward(self, x, y): + return x, y + + model = ExampleModule() + input_x = torch.ones(1, dtype=torch.half) + input_y = torch.ones(1, dtype=torch.half) + output_x, output_y = model(input_x, input_y) + assert output_x.dtype == torch.half + assert output_y.dtype == torch.half + + model.fp16_enabled = True + output_x, output_y = model(input_x, input_y) + assert output_x.dtype == torch.float32 + assert output_y.dtype == torch.half + + if torch.cuda.is_available(): + model.cuda() + output_x, output_y = model(input_x.cuda(), input_y.cuda()) + assert output_x.dtype == torch.float32 + assert output_y.dtype == torch.half + + # apply to optional input args + class ExampleModule(nn.Module): + + @force_fp32(apply_to=('x', 'y')) + def forward(self, x, y=None, z=None): + return x, y, z + + model = ExampleModule() + input_x = torch.ones(1, dtype=torch.half) + input_y = torch.ones(1, dtype=torch.half) + input_z = torch.ones(1, dtype=torch.half) + output_x, output_y, output_z = model(input_x, y=input_y, z=input_z) + assert output_x.dtype == torch.half + assert output_y.dtype == torch.half + assert output_z.dtype == torch.half + + model.fp16_enabled = True + output_x, output_y, output_z = model(input_x, y=input_y, z=input_z) + assert output_x.dtype == torch.float32 + assert output_y.dtype == torch.float32 + assert output_z.dtype == torch.half + + if torch.cuda.is_available(): + model.cuda() + output_x, output_y, output_z = model( + input_x.cuda(), y=input_y.cuda(), z=input_z.cuda()) + assert output_x.dtype == torch.float32 + assert output_y.dtype == torch.float32 + assert output_z.dtype == torch.half + + # out_fp16=True + class ExampleModule(nn.Module): + + @force_fp32(apply_to=('x', 'y'), out_fp16=True) + def forward(self, x, y=None, z=None): + return x, y, z + + model = ExampleModule() + input_x = torch.ones(1, dtype=torch.float32) + input_y = torch.ones(1, dtype=torch.half) + input_z = torch.ones(1, dtype=torch.half) + output_x, output_y, output_z = model(input_x, y=input_y, z=input_z) + assert output_x.dtype == torch.float32 + assert output_y.dtype == torch.half + assert output_z.dtype == torch.half + + model.fp16_enabled = True + output_x, output_y, output_z = model(input_x, y=input_y, z=input_z) + assert output_x.dtype == torch.half + assert output_y.dtype == torch.half + assert output_z.dtype == torch.half + + if torch.cuda.is_available(): + model.cuda() + output_x, output_y, output_z = model( + input_x.cuda(), y=input_y.cuda(), z=input_z.cuda()) + assert output_x.dtype == torch.half + assert output_y.dtype == torch.half + assert output_z.dtype == torch.half diff --git a/tests/test_utils/test_anchor.py b/tests/test_utils/test_anchor.py new file mode 100644 index 0000000..a9aef72 --- /dev/null +++ b/tests/test_utils/test_anchor.py @@ -0,0 +1,769 @@ +# Copyright (c) OpenMMLab. All rights reserved. +""" +CommandLine: + pytest tests/test_utils/test_anchor.py + xdoctest tests/test_utils/test_anchor.py zero + +""" +import pytest +import torch + + +def test_standard_points_generator(): + from mmdet.core.anchor import build_prior_generator + + # teat init + anchor_generator_cfg = dict( + type='MlvlPointGenerator', strides=[4, 8], offset=0) + anchor_generator = build_prior_generator(anchor_generator_cfg) + assert anchor_generator is not None + assert anchor_generator.num_base_priors == [1, 1] + # test_stride + from mmdet.core.anchor import MlvlPointGenerator + + # Square strides + mlvl_points = MlvlPointGenerator(strides=[4, 10], offset=0) + mlvl_points_half_stride_generator = MlvlPointGenerator( + strides=[4, 10], offset=0.5) + assert mlvl_points.num_levels == 2 + + # assert self.num_levels == len(featmap_sizes) + with pytest.raises(AssertionError): + mlvl_points.grid_priors(featmap_sizes=[(2, 2)], device='cpu') + priors = mlvl_points.grid_priors( + featmap_sizes=[(2, 2), (4, 8)], device='cpu') + priors_with_stride = mlvl_points.grid_priors( + featmap_sizes=[(2, 2), (4, 8)], with_stride=True, device='cpu') + assert len(priors) == 2 + + # assert last dimension is (coord_x, coord_y, stride_w, stride_h). + assert priors_with_stride[0].size(1) == 4 + assert priors_with_stride[0][0][2] == 4 + assert priors_with_stride[0][0][3] == 4 + assert priors_with_stride[1][0][2] == 10 + assert priors_with_stride[1][0][3] == 10 + + stride_4_feat_2_2 = priors[0] + assert (stride_4_feat_2_2[1] - stride_4_feat_2_2[0]).sum() == 4 + assert stride_4_feat_2_2.size(0) == 4 + assert stride_4_feat_2_2.size(1) == 2 + + stride_10_feat_4_8 = priors[1] + assert (stride_10_feat_4_8[1] - stride_10_feat_4_8[0]).sum() == 10 + assert stride_10_feat_4_8.size(0) == 4 * 8 + assert stride_10_feat_4_8.size(1) == 2 + + # assert the offset of 0.5 * stride + priors_half_offset = mlvl_points_half_stride_generator.grid_priors( + featmap_sizes=[(2, 2), (4, 8)], device='cpu') + + assert (priors_half_offset[0][0] - priors[0][0]).sum() == 4 * 0.5 * 2 + assert (priors_half_offset[1][0] - priors[1][0]).sum() == 10 * 0.5 * 2 + if torch.cuda.is_available(): + anchor_generator_cfg = dict( + type='MlvlPointGenerator', strides=[4, 8], offset=0) + anchor_generator = build_prior_generator(anchor_generator_cfg) + assert anchor_generator is not None + # Square strides + mlvl_points = MlvlPointGenerator(strides=[4, 10], offset=0) + mlvl_points_half_stride_generator = MlvlPointGenerator( + strides=[4, 10], offset=0.5) + assert mlvl_points.num_levels == 2 + + # assert self.num_levels == len(featmap_sizes) + with pytest.raises(AssertionError): + mlvl_points.grid_priors(featmap_sizes=[(2, 2)], device='cuda') + priors = mlvl_points.grid_priors( + featmap_sizes=[(2, 2), (4, 8)], device='cuda') + priors_with_stride = mlvl_points.grid_priors( + featmap_sizes=[(2, 2), (4, 8)], with_stride=True, device='cuda') + assert len(priors) == 2 + + # assert last dimension is (coord_x, coord_y, stride_w, stride_h). + assert priors_with_stride[0].size(1) == 4 + assert priors_with_stride[0][0][2] == 4 + assert priors_with_stride[0][0][3] == 4 + assert priors_with_stride[1][0][2] == 10 + assert priors_with_stride[1][0][3] == 10 + + stride_4_feat_2_2 = priors[0] + assert (stride_4_feat_2_2[1] - stride_4_feat_2_2[0]).sum() == 4 + assert stride_4_feat_2_2.size(0) == 4 + assert stride_4_feat_2_2.size(1) == 2 + + stride_10_feat_4_8 = priors[1] + assert (stride_10_feat_4_8[1] - stride_10_feat_4_8[0]).sum() == 10 + assert stride_10_feat_4_8.size(0) == 4 * 8 + assert stride_10_feat_4_8.size(1) == 2 + + # assert the offset of 0.5 * stride + priors_half_offset = mlvl_points_half_stride_generator.grid_priors( + featmap_sizes=[(2, 2), (4, 8)], device='cuda') + + assert (priors_half_offset[0][0] - priors[0][0]).sum() == 4 * 0.5 * 2 + assert (priors_half_offset[1][0] - priors[1][0]).sum() == 10 * 0.5 * 2 + + +def test_sparse_prior(): + from mmdet.core.anchor import MlvlPointGenerator + mlvl_points = MlvlPointGenerator(strides=[4, 10], offset=0) + prior_indexs = torch.Tensor([0, 2, 4, 5, 6, 9]).long() + + featmap_sizes = [(3, 5), (6, 4)] + grid_anchors = mlvl_points.grid_priors( + featmap_sizes=featmap_sizes, with_stride=False, device='cpu') + sparse_prior = mlvl_points.sparse_priors( + prior_idxs=prior_indexs, + featmap_size=featmap_sizes[0], + level_idx=0, + device='cpu') + + assert not sparse_prior.is_cuda + assert (sparse_prior == grid_anchors[0][prior_indexs]).all() + sparse_prior = mlvl_points.sparse_priors( + prior_idxs=prior_indexs, + featmap_size=featmap_sizes[1], + level_idx=1, + device='cpu') + assert (sparse_prior == grid_anchors[1][prior_indexs]).all() + + from mmdet.core.anchor import AnchorGenerator + mlvl_anchors = AnchorGenerator( + strides=[16, 32], ratios=[1.], scales=[1.], base_sizes=[4, 8]) + prior_indexs = torch.Tensor([0, 2, 4, 5, 6, 9]).long() + + featmap_sizes = [(3, 5), (6, 4)] + grid_anchors = mlvl_anchors.grid_priors( + featmap_sizes=featmap_sizes, device='cpu') + sparse_prior = mlvl_anchors.sparse_priors( + prior_idxs=prior_indexs, + featmap_size=featmap_sizes[0], + level_idx=0, + device='cpu') + assert (sparse_prior == grid_anchors[0][prior_indexs]).all() + sparse_prior = mlvl_anchors.sparse_priors( + prior_idxs=prior_indexs, + featmap_size=featmap_sizes[1], + level_idx=1, + device='cpu') + assert (sparse_prior == grid_anchors[1][prior_indexs]).all() + + # for ssd + from mmdet.core.anchor.anchor_generator import SSDAnchorGenerator + featmap_sizes = [(38, 38), (19, 19), (10, 10)] + anchor_generator = SSDAnchorGenerator( + scale_major=False, + input_size=300, + basesize_ratio_range=(0.15, 0.9), + strides=[8, 16, 32], + ratios=[[2], [2, 3], [2, 3]]) + ssd_anchors = anchor_generator.grid_anchors(featmap_sizes, device='cpu') + for i in range(len(featmap_sizes)): + sparse_ssd_anchors = anchor_generator.sparse_priors( + prior_idxs=prior_indexs, + level_idx=i, + featmap_size=featmap_sizes[i], + device='cpu') + assert (sparse_ssd_anchors == ssd_anchors[i][prior_indexs]).all() + + # for yolo + from mmdet.core.anchor.anchor_generator import YOLOAnchorGenerator + featmap_sizes = [(38, 38), (19, 19), (10, 10)] + anchor_generator = YOLOAnchorGenerator( + strides=[32, 16, 8], + base_sizes=[ + [(116, 90), (156, 198), (373, 326)], + [(30, 61), (62, 45), (59, 119)], + [(10, 13), (16, 30), (33, 23)], + ]) + yolo_anchors = anchor_generator.grid_anchors(featmap_sizes, device='cpu') + for i in range(len(featmap_sizes)): + sparse_yolo_anchors = anchor_generator.sparse_priors( + prior_idxs=prior_indexs, + level_idx=i, + featmap_size=featmap_sizes[i], + device='cpu') + assert (sparse_yolo_anchors == yolo_anchors[i][prior_indexs]).all() + + if torch.cuda.is_available(): + mlvl_points = MlvlPointGenerator(strides=[4, 10], offset=0) + prior_indexs = torch.Tensor([0, 3, 4, 5, 6, 7, 1, 2, 4, 5, 6, + 9]).long().cuda() + + featmap_sizes = [(6, 8), (6, 4)] + grid_anchors = mlvl_points.grid_priors( + featmap_sizes=featmap_sizes, with_stride=False, device='cuda') + sparse_prior = mlvl_points.sparse_priors( + prior_idxs=prior_indexs, + featmap_size=featmap_sizes[0], + level_idx=0, + device='cuda') + assert (sparse_prior == grid_anchors[0][prior_indexs]).all() + sparse_prior = mlvl_points.sparse_priors( + prior_idxs=prior_indexs, + featmap_size=featmap_sizes[1], + level_idx=1, + device='cuda') + assert (sparse_prior == grid_anchors[1][prior_indexs]).all() + assert sparse_prior.is_cuda + mlvl_anchors = AnchorGenerator( + strides=[16, 32], + ratios=[1., 2.5], + scales=[1., 5.], + base_sizes=[4, 8]) + prior_indexs = torch.Tensor([4, 5, 6, 7, 0, 2, 50, 4, 5, 6, + 9]).long().cuda() + + featmap_sizes = [(13, 5), (16, 4)] + grid_anchors = mlvl_anchors.grid_priors( + featmap_sizes=featmap_sizes, device='cuda') + sparse_prior = mlvl_anchors.sparse_priors( + prior_idxs=prior_indexs, + featmap_size=featmap_sizes[0], + level_idx=0, + device='cuda') + assert (sparse_prior == grid_anchors[0][prior_indexs]).all() + sparse_prior = mlvl_anchors.sparse_priors( + prior_idxs=prior_indexs, + featmap_size=featmap_sizes[1], + level_idx=1, + device='cuda') + assert (sparse_prior == grid_anchors[1][prior_indexs]).all() + + # for ssd + from mmdet.core.anchor.anchor_generator import SSDAnchorGenerator + featmap_sizes = [(38, 38), (19, 19), (10, 10)] + anchor_generator = SSDAnchorGenerator( + scale_major=False, + input_size=300, + basesize_ratio_range=(0.15, 0.9), + strides=[8, 16, 32], + ratios=[[2], [2, 3], [2, 3]]) + ssd_anchors = anchor_generator.grid_anchors( + featmap_sizes, device='cuda') + for i in range(len(featmap_sizes)): + sparse_ssd_anchors = anchor_generator.sparse_priors( + prior_idxs=prior_indexs, + level_idx=i, + featmap_size=featmap_sizes[i], + device='cuda') + assert (sparse_ssd_anchors == ssd_anchors[i][prior_indexs]).all() + + # for yolo + from mmdet.core.anchor.anchor_generator import YOLOAnchorGenerator + featmap_sizes = [(38, 38), (19, 19), (10, 10)] + anchor_generator = YOLOAnchorGenerator( + strides=[32, 16, 8], + base_sizes=[ + [(116, 90), (156, 198), (373, 326)], + [(30, 61), (62, 45), (59, 119)], + [(10, 13), (16, 30), (33, 23)], + ]) + yolo_anchors = anchor_generator.grid_anchors( + featmap_sizes, device='cuda') + for i in range(len(featmap_sizes)): + sparse_yolo_anchors = anchor_generator.sparse_priors( + prior_idxs=prior_indexs, + level_idx=i, + featmap_size=featmap_sizes[i], + device='cuda') + assert (sparse_yolo_anchors == yolo_anchors[i][prior_indexs]).all() + + +def test_standard_anchor_generator(): + from mmdet.core.anchor import build_anchor_generator + anchor_generator_cfg = dict( + type='AnchorGenerator', + scales=[8], + ratios=[0.5, 1.0, 2.0], + strides=[4, 8]) + + anchor_generator = build_anchor_generator(anchor_generator_cfg) + assert anchor_generator.num_base_priors == \ + anchor_generator.num_base_anchors + assert anchor_generator.num_base_priors == [3, 3] + assert anchor_generator is not None + + +def test_strides(): + from mmdet.core import AnchorGenerator + + # Square strides + self = AnchorGenerator([10], [1.], [1.], [10]) + anchors = self.grid_anchors([(2, 2)], device='cpu') + + expected_anchors = torch.tensor([[-5., -5., 5., 5.], [5., -5., 15., 5.], + [-5., 5., 5., 15.], [5., 5., 15., 15.]]) + + assert torch.equal(anchors[0], expected_anchors) + + # Different strides in x and y direction + self = AnchorGenerator([(10, 20)], [1.], [1.], [10]) + anchors = self.grid_anchors([(2, 2)], device='cpu') + + expected_anchors = torch.tensor([[-5., -5., 5., 5.], [5., -5., 15., 5.], + [-5., 15., 5., 25.], [5., 15., 15., 25.]]) + + assert torch.equal(anchors[0], expected_anchors) + + +def test_ssd_anchor_generator(): + from mmdet.core.anchor import build_anchor_generator + if torch.cuda.is_available(): + device = 'cuda' + else: + device = 'cpu' + + # min_sizes max_sizes must set at the same time + with pytest.raises(AssertionError): + anchor_generator_cfg = dict( + type='SSDAnchorGenerator', + scale_major=False, + min_sizes=[48, 100, 150, 202, 253, 300], + max_sizes=None, + strides=[8, 16, 32, 64, 100, 300], + ratios=[[2], [2, 3], [2, 3], [2, 3], [2], [2]]) + build_anchor_generator(anchor_generator_cfg) + + # length of min_sizes max_sizes must be the same + with pytest.raises(AssertionError): + anchor_generator_cfg = dict( + type='SSDAnchorGenerator', + scale_major=False, + min_sizes=[48, 100, 150, 202, 253, 300], + max_sizes=[100, 150, 202, 253], + strides=[8, 16, 32, 64, 100, 300], + ratios=[[2], [2, 3], [2, 3], [2, 3], [2], [2]]) + build_anchor_generator(anchor_generator_cfg) + + # test setting anchor size manually + anchor_generator_cfg = dict( + type='SSDAnchorGenerator', + scale_major=False, + min_sizes=[48, 100, 150, 202, 253, 304], + max_sizes=[100, 150, 202, 253, 304, 320], + strides=[16, 32, 64, 107, 160, 320], + ratios=[[2, 3], [2, 3], [2, 3], [2, 3], [2, 3], [2, 3]]) + + featmap_sizes = [(38, 38), (19, 19), (10, 10), (5, 5), (3, 3), (1, 1)] + anchor_generator = build_anchor_generator(anchor_generator_cfg) + + expected_base_anchors = [ + torch.Tensor([[-16.0000, -16.0000, 32.0000, 32.0000], + [-26.6410, -26.6410, 42.6410, 42.6410], + [-25.9411, -8.9706, 41.9411, 24.9706], + [-8.9706, -25.9411, 24.9706, 41.9411], + [-33.5692, -5.8564, 49.5692, 21.8564], + [-5.8564, -33.5692, 21.8564, 49.5692]]), + torch.Tensor([[-34.0000, -34.0000, 66.0000, 66.0000], + [-45.2372, -45.2372, 77.2372, 77.2372], + [-54.7107, -19.3553, 86.7107, 51.3553], + [-19.3553, -54.7107, 51.3553, 86.7107], + [-70.6025, -12.8675, 102.6025, 44.8675], + [-12.8675, -70.6025, 44.8675, 102.6025]]), + torch.Tensor([[-43.0000, -43.0000, 107.0000, 107.0000], + [-55.0345, -55.0345, 119.0345, 119.0345], + [-74.0660, -21.0330, 138.0660, 85.0330], + [-21.0330, -74.0660, 85.0330, 138.0660], + [-97.9038, -11.3013, 161.9038, 75.3013], + [-11.3013, -97.9038, 75.3013, 161.9038]]), + torch.Tensor([[-47.5000, -47.5000, 154.5000, 154.5000], + [-59.5332, -59.5332, 166.5332, 166.5332], + [-89.3356, -17.9178, 196.3356, 124.9178], + [-17.9178, -89.3356, 124.9178, 196.3356], + [-121.4371, -4.8124, 228.4371, 111.8124], + [-4.8124, -121.4371, 111.8124, 228.4371]]), + torch.Tensor([[-46.5000, -46.5000, 206.5000, 206.5000], + [-58.6651, -58.6651, 218.6651, 218.6651], + [-98.8980, -9.4490, 258.8980, 169.4490], + [-9.4490, -98.8980, 169.4490, 258.8980], + [-139.1044, 6.9652, 299.1044, 153.0348], + [6.9652, -139.1044, 153.0348, 299.1044]]), + torch.Tensor([[8.0000, 8.0000, 312.0000, 312.0000], + [4.0513, 4.0513, 315.9487, 315.9487], + [-54.9605, 52.5198, 374.9604, 267.4802], + [52.5198, -54.9605, 267.4802, 374.9604], + [-103.2717, 72.2428, 423.2717, 247.7572], + [72.2428, -103.2717, 247.7572, 423.2717]]) + ] + + base_anchors = anchor_generator.base_anchors + for i, base_anchor in enumerate(base_anchors): + assert base_anchor.allclose(expected_base_anchors[i]) + + # check valid flags + expected_valid_pixels = [2400, 600, 150, 54, 24, 6] + multi_level_valid_flags = anchor_generator.valid_flags( + featmap_sizes, (320, 320), device) + for i, single_level_valid_flag in enumerate(multi_level_valid_flags): + assert single_level_valid_flag.sum() == expected_valid_pixels[i] + + # check number of base anchors for each level + assert anchor_generator.num_base_anchors == [6, 6, 6, 6, 6, 6] + + # check anchor generation + anchors = anchor_generator.grid_anchors(featmap_sizes, device) + assert len(anchors) == 6 + + # test vgg ssd anchor setting + anchor_generator_cfg = dict( + type='SSDAnchorGenerator', + scale_major=False, + input_size=300, + basesize_ratio_range=(0.15, 0.9), + strides=[8, 16, 32, 64, 100, 300], + ratios=[[2], [2, 3], [2, 3], [2, 3], [2], [2]]) + + featmap_sizes = [(38, 38), (19, 19), (10, 10), (5, 5), (3, 3), (1, 1)] + anchor_generator = build_anchor_generator(anchor_generator_cfg) + + # check base anchors + expected_base_anchors = [ + torch.Tensor([[-6.5000, -6.5000, 14.5000, 14.5000], + [-11.3704, -11.3704, 19.3704, 19.3704], + [-10.8492, -3.4246, 18.8492, 11.4246], + [-3.4246, -10.8492, 11.4246, 18.8492]]), + torch.Tensor([[-14.5000, -14.5000, 30.5000, 30.5000], + [-25.3729, -25.3729, 41.3729, 41.3729], + [-23.8198, -7.9099, 39.8198, 23.9099], + [-7.9099, -23.8198, 23.9099, 39.8198], + [-30.9711, -4.9904, 46.9711, 20.9904], + [-4.9904, -30.9711, 20.9904, 46.9711]]), + torch.Tensor([[-33.5000, -33.5000, 65.5000, 65.5000], + [-45.5366, -45.5366, 77.5366, 77.5366], + [-54.0036, -19.0018, 86.0036, 51.0018], + [-19.0018, -54.0036, 51.0018, 86.0036], + [-69.7365, -12.5788, 101.7365, 44.5788], + [-12.5788, -69.7365, 44.5788, 101.7365]]), + torch.Tensor([[-44.5000, -44.5000, 108.5000, 108.5000], + [-56.9817, -56.9817, 120.9817, 120.9817], + [-76.1873, -22.0937, 140.1873, 86.0937], + [-22.0937, -76.1873, 86.0937, 140.1873], + [-100.5019, -12.1673, 164.5019, 76.1673], + [-12.1673, -100.5019, 76.1673, 164.5019]]), + torch.Tensor([[-53.5000, -53.5000, 153.5000, 153.5000], + [-66.2185, -66.2185, 166.2185, 166.2185], + [-96.3711, -23.1855, 196.3711, 123.1855], + [-23.1855, -96.3711, 123.1855, 196.3711]]), + torch.Tensor([[19.5000, 19.5000, 280.5000, 280.5000], + [6.6342, 6.6342, 293.3658, 293.3658], + [-34.5549, 57.7226, 334.5549, 242.2774], + [57.7226, -34.5549, 242.2774, 334.5549]]), + ] + base_anchors = anchor_generator.base_anchors + for i, base_anchor in enumerate(base_anchors): + assert base_anchor.allclose(expected_base_anchors[i]) + + # check valid flags + expected_valid_pixels = [5776, 2166, 600, 150, 36, 4] + multi_level_valid_flags = anchor_generator.valid_flags( + featmap_sizes, (300, 300), device) + for i, single_level_valid_flag in enumerate(multi_level_valid_flags): + assert single_level_valid_flag.sum() == expected_valid_pixels[i] + + # check number of base anchors for each level + assert anchor_generator.num_base_anchors == [4, 6, 6, 6, 4, 4] + + # check anchor generation + anchors = anchor_generator.grid_anchors(featmap_sizes, device) + assert len(anchors) == 6 + + +def test_anchor_generator_with_tuples(): + from mmdet.core.anchor import build_anchor_generator + if torch.cuda.is_available(): + device = 'cuda' + else: + device = 'cpu' + + anchor_generator_cfg = dict( + type='SSDAnchorGenerator', + scale_major=False, + input_size=300, + basesize_ratio_range=(0.15, 0.9), + strides=[8, 16, 32, 64, 100, 300], + ratios=[[2], [2, 3], [2, 3], [2, 3], [2], [2]]) + + featmap_sizes = [(38, 38), (19, 19), (10, 10), (5, 5), (3, 3), (1, 1)] + anchor_generator = build_anchor_generator(anchor_generator_cfg) + anchors = anchor_generator.grid_anchors(featmap_sizes, device) + + anchor_generator_cfg_tuples = dict( + type='SSDAnchorGenerator', + scale_major=False, + input_size=300, + basesize_ratio_range=(0.15, 0.9), + strides=[(8, 8), (16, 16), (32, 32), (64, 64), (100, 100), (300, 300)], + ratios=[[2], [2, 3], [2, 3], [2, 3], [2], [2]]) + + anchor_generator_tuples = build_anchor_generator( + anchor_generator_cfg_tuples) + anchors_tuples = anchor_generator_tuples.grid_anchors( + featmap_sizes, device) + for anchor, anchor_tuples in zip(anchors, anchors_tuples): + assert torch.equal(anchor, anchor_tuples) + + +def test_yolo_anchor_generator(): + from mmdet.core.anchor import build_anchor_generator + if torch.cuda.is_available(): + device = 'cuda' + else: + device = 'cpu' + + anchor_generator_cfg = dict( + type='YOLOAnchorGenerator', + strides=[32, 16, 8], + base_sizes=[ + [(116, 90), (156, 198), (373, 326)], + [(30, 61), (62, 45), (59, 119)], + [(10, 13), (16, 30), (33, 23)], + ]) + + featmap_sizes = [(14, 18), (28, 36), (56, 72)] + anchor_generator = build_anchor_generator(anchor_generator_cfg) + + # check base anchors + expected_base_anchors = [ + torch.Tensor([[-42.0000, -29.0000, 74.0000, 61.0000], + [-62.0000, -83.0000, 94.0000, 115.0000], + [-170.5000, -147.0000, 202.5000, 179.0000]]), + torch.Tensor([[-7.0000, -22.5000, 23.0000, 38.5000], + [-23.0000, -14.5000, 39.0000, 30.5000], + [-21.5000, -51.5000, 37.5000, 67.5000]]), + torch.Tensor([[-1.0000, -2.5000, 9.0000, 10.5000], + [-4.0000, -11.0000, 12.0000, 19.0000], + [-12.5000, -7.5000, 20.5000, 15.5000]]) + ] + base_anchors = anchor_generator.base_anchors + for i, base_anchor in enumerate(base_anchors): + assert base_anchor.allclose(expected_base_anchors[i]) + + # check number of base anchors for each level + assert anchor_generator.num_base_anchors == [3, 3, 3] + + # check anchor generation + anchors = anchor_generator.grid_anchors(featmap_sizes, device) + assert len(anchors) == 3 + + +def test_retina_anchor(): + from mmdet.models import build_head + if torch.cuda.is_available(): + device = 'cuda' + else: + device = 'cpu' + + # head configs modified from + # configs/nas_fpn/retinanet_r50_fpn_crop640_50e.py + bbox_head = dict( + type='RetinaSepBNHead', + num_classes=4, + num_ins=5, + in_channels=4, + stacked_convs=1, + feat_channels=4, + anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + bbox_coder=dict( + type='DeltaXYWHBBoxCoder', + target_means=[.0, .0, .0, .0], + target_stds=[1.0, 1.0, 1.0, 1.0])) + + retina_head = build_head(bbox_head) + assert retina_head.anchor_generator is not None + + # use the featmap sizes in NASFPN setting to test retina head + featmap_sizes = [(80, 80), (40, 40), (20, 20), (10, 10), (5, 5)] + # check base anchors + expected_base_anchors = [ + torch.Tensor([[-22.6274, -11.3137, 22.6274, 11.3137], + [-28.5088, -14.2544, 28.5088, 14.2544], + [-35.9188, -17.9594, 35.9188, 17.9594], + [-16.0000, -16.0000, 16.0000, 16.0000], + [-20.1587, -20.1587, 20.1587, 20.1587], + [-25.3984, -25.3984, 25.3984, 25.3984], + [-11.3137, -22.6274, 11.3137, 22.6274], + [-14.2544, -28.5088, 14.2544, 28.5088], + [-17.9594, -35.9188, 17.9594, 35.9188]]), + torch.Tensor([[-45.2548, -22.6274, 45.2548, 22.6274], + [-57.0175, -28.5088, 57.0175, 28.5088], + [-71.8376, -35.9188, 71.8376, 35.9188], + [-32.0000, -32.0000, 32.0000, 32.0000], + [-40.3175, -40.3175, 40.3175, 40.3175], + [-50.7968, -50.7968, 50.7968, 50.7968], + [-22.6274, -45.2548, 22.6274, 45.2548], + [-28.5088, -57.0175, 28.5088, 57.0175], + [-35.9188, -71.8376, 35.9188, 71.8376]]), + torch.Tensor([[-90.5097, -45.2548, 90.5097, 45.2548], + [-114.0350, -57.0175, 114.0350, 57.0175], + [-143.6751, -71.8376, 143.6751, 71.8376], + [-64.0000, -64.0000, 64.0000, 64.0000], + [-80.6349, -80.6349, 80.6349, 80.6349], + [-101.5937, -101.5937, 101.5937, 101.5937], + [-45.2548, -90.5097, 45.2548, 90.5097], + [-57.0175, -114.0350, 57.0175, 114.0350], + [-71.8376, -143.6751, 71.8376, 143.6751]]), + torch.Tensor([[-181.0193, -90.5097, 181.0193, 90.5097], + [-228.0701, -114.0350, 228.0701, 114.0350], + [-287.3503, -143.6751, 287.3503, 143.6751], + [-128.0000, -128.0000, 128.0000, 128.0000], + [-161.2699, -161.2699, 161.2699, 161.2699], + [-203.1873, -203.1873, 203.1873, 203.1873], + [-90.5097, -181.0193, 90.5097, 181.0193], + [-114.0350, -228.0701, 114.0350, 228.0701], + [-143.6751, -287.3503, 143.6751, 287.3503]]), + torch.Tensor([[-362.0387, -181.0193, 362.0387, 181.0193], + [-456.1401, -228.0701, 456.1401, 228.0701], + [-574.7006, -287.3503, 574.7006, 287.3503], + [-256.0000, -256.0000, 256.0000, 256.0000], + [-322.5398, -322.5398, 322.5398, 322.5398], + [-406.3747, -406.3747, 406.3747, 406.3747], + [-181.0193, -362.0387, 181.0193, 362.0387], + [-228.0701, -456.1401, 228.0701, 456.1401], + [-287.3503, -574.7006, 287.3503, 574.7006]]) + ] + base_anchors = retina_head.anchor_generator.base_anchors + for i, base_anchor in enumerate(base_anchors): + assert base_anchor.allclose(expected_base_anchors[i]) + + # check valid flags + expected_valid_pixels = [57600, 14400, 3600, 900, 225] + multi_level_valid_flags = retina_head.anchor_generator.valid_flags( + featmap_sizes, (640, 640), device) + for i, single_level_valid_flag in enumerate(multi_level_valid_flags): + assert single_level_valid_flag.sum() == expected_valid_pixels[i] + + # check number of base anchors for each level + assert retina_head.anchor_generator.num_base_anchors == [9, 9, 9, 9, 9] + + # check anchor generation + anchors = retina_head.anchor_generator.grid_anchors(featmap_sizes, device) + assert len(anchors) == 5 + + +def test_guided_anchor(): + from mmdet.models import build_head + if torch.cuda.is_available(): + device = 'cuda' + else: + device = 'cpu' + # head configs modified from + # configs/guided_anchoring/ga_retinanet_r50_fpn_1x_coco.py + bbox_head = dict( + type='GARetinaHead', + num_classes=8, + in_channels=4, + stacked_convs=1, + feat_channels=4, + approx_anchor_generator=dict( + type='AnchorGenerator', + octave_base_scale=4, + scales_per_octave=3, + ratios=[0.5, 1.0, 2.0], + strides=[8, 16, 32, 64, 128]), + square_anchor_generator=dict( + type='AnchorGenerator', + ratios=[1.0], + scales=[4], + strides=[8, 16, 32, 64, 128])) + + ga_retina_head = build_head(bbox_head) + assert ga_retina_head.approx_anchor_generator is not None + + # use the featmap sizes in NASFPN setting to test ga_retina_head + featmap_sizes = [(100, 152), (50, 76), (25, 38), (13, 19), (7, 10)] + # check base anchors + expected_approxs = [ + torch.Tensor([[-22.6274, -11.3137, 22.6274, 11.3137], + [-28.5088, -14.2544, 28.5088, 14.2544], + [-35.9188, -17.9594, 35.9188, 17.9594], + [-16.0000, -16.0000, 16.0000, 16.0000], + [-20.1587, -20.1587, 20.1587, 20.1587], + [-25.3984, -25.3984, 25.3984, 25.3984], + [-11.3137, -22.6274, 11.3137, 22.6274], + [-14.2544, -28.5088, 14.2544, 28.5088], + [-17.9594, -35.9188, 17.9594, 35.9188]]), + torch.Tensor([[-45.2548, -22.6274, 45.2548, 22.6274], + [-57.0175, -28.5088, 57.0175, 28.5088], + [-71.8376, -35.9188, 71.8376, 35.9188], + [-32.0000, -32.0000, 32.0000, 32.0000], + [-40.3175, -40.3175, 40.3175, 40.3175], + [-50.7968, -50.7968, 50.7968, 50.7968], + [-22.6274, -45.2548, 22.6274, 45.2548], + [-28.5088, -57.0175, 28.5088, 57.0175], + [-35.9188, -71.8376, 35.9188, 71.8376]]), + torch.Tensor([[-90.5097, -45.2548, 90.5097, 45.2548], + [-114.0350, -57.0175, 114.0350, 57.0175], + [-143.6751, -71.8376, 143.6751, 71.8376], + [-64.0000, -64.0000, 64.0000, 64.0000], + [-80.6349, -80.6349, 80.6349, 80.6349], + [-101.5937, -101.5937, 101.5937, 101.5937], + [-45.2548, -90.5097, 45.2548, 90.5097], + [-57.0175, -114.0350, 57.0175, 114.0350], + [-71.8376, -143.6751, 71.8376, 143.6751]]), + torch.Tensor([[-181.0193, -90.5097, 181.0193, 90.5097], + [-228.0701, -114.0350, 228.0701, 114.0350], + [-287.3503, -143.6751, 287.3503, 143.6751], + [-128.0000, -128.0000, 128.0000, 128.0000], + [-161.2699, -161.2699, 161.2699, 161.2699], + [-203.1873, -203.1873, 203.1873, 203.1873], + [-90.5097, -181.0193, 90.5097, 181.0193], + [-114.0350, -228.0701, 114.0350, 228.0701], + [-143.6751, -287.3503, 143.6751, 287.3503]]), + torch.Tensor([[-362.0387, -181.0193, 362.0387, 181.0193], + [-456.1401, -228.0701, 456.1401, 228.0701], + [-574.7006, -287.3503, 574.7006, 287.3503], + [-256.0000, -256.0000, 256.0000, 256.0000], + [-322.5398, -322.5398, 322.5398, 322.5398], + [-406.3747, -406.3747, 406.3747, 406.3747], + [-181.0193, -362.0387, 181.0193, 362.0387], + [-228.0701, -456.1401, 228.0701, 456.1401], + [-287.3503, -574.7006, 287.3503, 574.7006]]) + ] + approxs = ga_retina_head.approx_anchor_generator.base_anchors + for i, base_anchor in enumerate(approxs): + assert base_anchor.allclose(expected_approxs[i]) + + # check valid flags + expected_valid_pixels = [136800, 34200, 8550, 2223, 630] + multi_level_valid_flags = ga_retina_head.approx_anchor_generator \ + .valid_flags(featmap_sizes, (800, 1216), device) + for i, single_level_valid_flag in enumerate(multi_level_valid_flags): + assert single_level_valid_flag.sum() == expected_valid_pixels[i] + + # check number of base anchors for each level + assert ga_retina_head.approx_anchor_generator.num_base_anchors == [ + 9, 9, 9, 9, 9 + ] + + # check approx generation + squares = ga_retina_head.square_anchor_generator.grid_anchors( + featmap_sizes, device) + assert len(squares) == 5 + + expected_squares = [ + torch.Tensor([[-16., -16., 16., 16.]]), + torch.Tensor([[-32., -32., 32., 32]]), + torch.Tensor([[-64., -64., 64., 64.]]), + torch.Tensor([[-128., -128., 128., 128.]]), + torch.Tensor([[-256., -256., 256., 256.]]) + ] + squares = ga_retina_head.square_anchor_generator.base_anchors + for i, base_anchor in enumerate(squares): + assert base_anchor.allclose(expected_squares[i]) + + # square_anchor_generator does not check valid flags + # check number of base anchors for each level + assert (ga_retina_head.square_anchor_generator.num_base_anchors == [ + 1, 1, 1, 1, 1 + ]) + + # check square generation + anchors = ga_retina_head.square_anchor_generator.grid_anchors( + featmap_sizes, device) + assert len(anchors) == 5 diff --git a/tests/test_utils/test_assigner.py b/tests/test_utils/test_assigner.py new file mode 100644 index 0000000..7cdb08b --- /dev/null +++ b/tests/test_utils/test_assigner.py @@ -0,0 +1,700 @@ +# Copyright (c) OpenMMLab. All rights reserved. +"""Tests the Assigner objects. + +CommandLine: + pytest tests/test_utils/test_assigner.py + xdoctest tests/test_utils/test_assigner.py zero +""" +import pytest +import torch + +from mmdet.core.bbox.assigners import (ApproxMaxIoUAssigner, + AscendMaxIoUAssigner, + CenterRegionAssigner, HungarianAssigner, + MaskHungarianAssigner, MaxIoUAssigner, + PointAssigner, SimOTAAssigner, + TaskAlignedAssigner, UniformAssigner) + + +def test_max_iou_assigner(): + self = MaxIoUAssigner( + pos_iou_thr=0.5, + neg_iou_thr=0.5, + ) + bboxes = torch.FloatTensor([ + [0, 0, 10, 10], + [10, 10, 20, 20], + [5, 5, 15, 15], + [32, 32, 38, 42], + ]) + gt_bboxes = torch.FloatTensor([ + [0, 0, 10, 9], + [0, 10, 10, 19], + ]) + gt_labels = torch.LongTensor([2, 3]) + assign_result = self.assign(bboxes, gt_bboxes, gt_labels=gt_labels) + assert len(assign_result.gt_inds) == 4 + assert len(assign_result.labels) == 4 + + expected_gt_inds = torch.LongTensor([1, 0, 2, 0]) + assert torch.all(assign_result.gt_inds == expected_gt_inds) + + +def test_max_iou_assigner_with_ignore(): + self = MaxIoUAssigner( + pos_iou_thr=0.5, + neg_iou_thr=0.5, + ignore_iof_thr=0.5, + ignore_wrt_candidates=False, + ) + bboxes = torch.FloatTensor([ + [0, 0, 10, 10], + [10, 10, 20, 20], + [5, 5, 15, 15], + [30, 32, 40, 42], + ]) + gt_bboxes = torch.FloatTensor([ + [0, 0, 10, 9], + [0, 10, 10, 19], + ]) + gt_bboxes_ignore = torch.Tensor([ + [30, 30, 40, 40], + ]) + assign_result = self.assign( + bboxes, gt_bboxes, gt_bboxes_ignore=gt_bboxes_ignore) + + expected_gt_inds = torch.LongTensor([1, 0, 2, -1]) + assert torch.all(assign_result.gt_inds == expected_gt_inds) + + +def test_max_iou_assigner_with_empty_gt(): + """Test corner case where an image might have no true detections.""" + self = MaxIoUAssigner( + pos_iou_thr=0.5, + neg_iou_thr=0.5, + ) + bboxes = torch.FloatTensor([ + [0, 0, 10, 10], + [10, 10, 20, 20], + [5, 5, 15, 15], + [32, 32, 38, 42], + ]) + gt_bboxes = torch.empty(0, 4) + assign_result = self.assign(bboxes, gt_bboxes) + + expected_gt_inds = torch.LongTensor([0, 0, 0, 0]) + assert torch.all(assign_result.gt_inds == expected_gt_inds) + + +def test_max_iou_assigner_with_empty_boxes(): + """Test corner case where a network might predict no boxes.""" + self = MaxIoUAssigner( + pos_iou_thr=0.5, + neg_iou_thr=0.5, + ) + bboxes = torch.empty((0, 4)) + gt_bboxes = torch.FloatTensor([ + [0, 0, 10, 9], + [0, 10, 10, 19], + ]) + gt_labels = torch.LongTensor([2, 3]) + + # Test with gt_labels + assign_result = self.assign(bboxes, gt_bboxes, gt_labels=gt_labels) + assert len(assign_result.gt_inds) == 0 + assert tuple(assign_result.labels.shape) == (0, ) + + # Test without gt_labels + assign_result = self.assign(bboxes, gt_bboxes, gt_labels=None) + assert len(assign_result.gt_inds) == 0 + assert assign_result.labels is None + + +def test_max_iou_assigner_with_empty_boxes_and_ignore(): + """Test corner case where a network might predict no boxes and + ignore_iof_thr is on.""" + self = MaxIoUAssigner( + pos_iou_thr=0.5, + neg_iou_thr=0.5, + ignore_iof_thr=0.5, + ) + bboxes = torch.empty((0, 4)) + gt_bboxes = torch.FloatTensor([ + [0, 0, 10, 9], + [0, 10, 10, 19], + ]) + gt_bboxes_ignore = torch.Tensor([ + [30, 30, 40, 40], + ]) + gt_labels = torch.LongTensor([2, 3]) + + # Test with gt_labels + assign_result = self.assign( + bboxes, + gt_bboxes, + gt_labels=gt_labels, + gt_bboxes_ignore=gt_bboxes_ignore) + assert len(assign_result.gt_inds) == 0 + assert tuple(assign_result.labels.shape) == (0, ) + + # Test without gt_labels + assign_result = self.assign( + bboxes, gt_bboxes, gt_labels=None, gt_bboxes_ignore=gt_bboxes_ignore) + assert len(assign_result.gt_inds) == 0 + assert assign_result.labels is None + + +def test_max_iou_assigner_with_empty_boxes_and_gt(): + """Test corner case where a network might predict no boxes and no gt.""" + self = MaxIoUAssigner( + pos_iou_thr=0.5, + neg_iou_thr=0.5, + ) + bboxes = torch.empty((0, 4)) + gt_bboxes = torch.empty((0, 4)) + assign_result = self.assign(bboxes, gt_bboxes) + assert len(assign_result.gt_inds) == 0 + + +def test_point_assigner(): + self = PointAssigner() + points = torch.FloatTensor([ # [x, y, stride] + [0, 0, 1], + [10, 10, 1], + [5, 5, 1], + [32, 32, 1], + ]) + gt_bboxes = torch.FloatTensor([ + [0, 0, 10, 9], + [0, 10, 10, 19], + ]) + assign_result = self.assign(points, gt_bboxes) + expected_gt_inds = torch.LongTensor([1, 2, 1, 0]) + assert torch.all(assign_result.gt_inds == expected_gt_inds) + + +def test_point_assigner_with_empty_gt(): + """Test corner case where an image might have no true detections.""" + self = PointAssigner() + points = torch.FloatTensor([ # [x, y, stride] + [0, 0, 1], + [10, 10, 1], + [5, 5, 1], + [32, 32, 1], + ]) + gt_bboxes = torch.FloatTensor([]) + assign_result = self.assign(points, gt_bboxes) + + expected_gt_inds = torch.LongTensor([0, 0, 0, 0]) + assert torch.all(assign_result.gt_inds == expected_gt_inds) + + +def test_point_assigner_with_empty_boxes_and_gt(): + """Test corner case where an image might predict no points and no gt.""" + self = PointAssigner() + points = torch.FloatTensor([]) + gt_bboxes = torch.FloatTensor([]) + assign_result = self.assign(points, gt_bboxes) + assert len(assign_result.gt_inds) == 0 + + +def test_approx_iou_assigner(): + self = ApproxMaxIoUAssigner( + pos_iou_thr=0.5, + neg_iou_thr=0.5, + ) + bboxes = torch.FloatTensor([ + [0, 0, 10, 10], + [10, 10, 20, 20], + [5, 5, 15, 15], + [32, 32, 38, 42], + ]) + gt_bboxes = torch.FloatTensor([ + [0, 0, 10, 9], + [0, 10, 10, 19], + ]) + approxs_per_octave = 1 + approxs = bboxes + squares = bboxes + assign_result = self.assign(approxs, squares, approxs_per_octave, + gt_bboxes) + + expected_gt_inds = torch.LongTensor([1, 0, 2, 0]) + assert torch.all(assign_result.gt_inds == expected_gt_inds) + + +def test_approx_iou_assigner_with_empty_gt(): + """Test corner case where an image might have no true detections.""" + self = ApproxMaxIoUAssigner( + pos_iou_thr=0.5, + neg_iou_thr=0.5, + ) + bboxes = torch.FloatTensor([ + [0, 0, 10, 10], + [10, 10, 20, 20], + [5, 5, 15, 15], + [32, 32, 38, 42], + ]) + gt_bboxes = torch.FloatTensor([]) + approxs_per_octave = 1 + approxs = bboxes + squares = bboxes + assign_result = self.assign(approxs, squares, approxs_per_octave, + gt_bboxes) + + expected_gt_inds = torch.LongTensor([0, 0, 0, 0]) + assert torch.all(assign_result.gt_inds == expected_gt_inds) + + +def test_approx_iou_assigner_with_empty_boxes(): + """Test corner case where an network might predict no boxes.""" + self = ApproxMaxIoUAssigner( + pos_iou_thr=0.5, + neg_iou_thr=0.5, + ) + bboxes = torch.empty((0, 4)) + gt_bboxes = torch.FloatTensor([ + [0, 0, 10, 9], + [0, 10, 10, 19], + ]) + approxs_per_octave = 1 + approxs = bboxes + squares = bboxes + assign_result = self.assign(approxs, squares, approxs_per_octave, + gt_bboxes) + assert len(assign_result.gt_inds) == 0 + + +def test_approx_iou_assigner_with_empty_boxes_and_gt(): + """Test corner case where an network might predict no boxes and no gt.""" + self = ApproxMaxIoUAssigner( + pos_iou_thr=0.5, + neg_iou_thr=0.5, + ) + bboxes = torch.empty((0, 4)) + gt_bboxes = torch.empty((0, 4)) + approxs_per_octave = 1 + approxs = bboxes + squares = bboxes + assign_result = self.assign(approxs, squares, approxs_per_octave, + gt_bboxes) + assert len(assign_result.gt_inds) == 0 + + +def test_random_assign_result(): + """Test random instantiation of assign result to catch corner cases.""" + from mmdet.core.bbox.assigners.assign_result import AssignResult + AssignResult.random() + + AssignResult.random(num_gts=0, num_preds=0) + AssignResult.random(num_gts=0, num_preds=3) + AssignResult.random(num_gts=3, num_preds=3) + AssignResult.random(num_gts=0, num_preds=3) + AssignResult.random(num_gts=7, num_preds=7) + AssignResult.random(num_gts=7, num_preds=64) + AssignResult.random(num_gts=24, num_preds=3) + + +def test_center_region_assigner(): + self = CenterRegionAssigner(pos_scale=0.3, neg_scale=1) + bboxes = torch.FloatTensor([[0, 0, 10, 10], [10, 10, 20, 20], [8, 8, 9, + 9]]) + gt_bboxes = torch.FloatTensor([ + [0, 0, 11, 11], # match bboxes[0] + [10, 10, 20, 20], # match bboxes[1] + [4.5, 4.5, 5.5, 5.5], # match bboxes[0] but area is too small + [0, 0, 10, 10], # match bboxes[1] and has a smaller area than gt[0] + ]) + gt_labels = torch.LongTensor([2, 3, 4, 5]) + assign_result = self.assign(bboxes, gt_bboxes, gt_labels=gt_labels) + assert len(assign_result.gt_inds) == 3 + assert len(assign_result.labels) == 3 + expected_gt_inds = torch.LongTensor([4, 2, 0]) + assert torch.all(assign_result.gt_inds == expected_gt_inds) + shadowed_labels = assign_result.get_extra_property('shadowed_labels') + # [8, 8, 9, 9] in the shadowed region of [0, 0, 11, 11] (label: 2) + assert torch.any(shadowed_labels == torch.LongTensor([[2, 2]])) + # [8, 8, 9, 9] in the shadowed region of [0, 0, 10, 10] (label: 5) + assert torch.any(shadowed_labels == torch.LongTensor([[2, 5]])) + # [0, 0, 10, 10] is already assigned to [4.5, 4.5, 5.5, 5.5]. + # Therefore, [0, 0, 11, 11] (label: 2) is shadowed + assert torch.any(shadowed_labels == torch.LongTensor([[0, 2]])) + + +def test_center_region_assigner_with_ignore(): + self = CenterRegionAssigner( + pos_scale=0.5, + neg_scale=1, + ) + bboxes = torch.FloatTensor([ + [0, 0, 10, 10], + [10, 10, 20, 20], + ]) + gt_bboxes = torch.FloatTensor([ + [0, 0, 10, 10], # match bboxes[0] + [10, 10, 20, 20], # match bboxes[1] + ]) + gt_bboxes_ignore = torch.FloatTensor([ + [0, 0, 10, 10], # match bboxes[0] + ]) + gt_labels = torch.LongTensor([1, 2]) + assign_result = self.assign( + bboxes, + gt_bboxes, + gt_bboxes_ignore=gt_bboxes_ignore, + gt_labels=gt_labels) + assert len(assign_result.gt_inds) == 2 + assert len(assign_result.labels) == 2 + + expected_gt_inds = torch.LongTensor([-1, 2]) + assert torch.all(assign_result.gt_inds == expected_gt_inds) + + +def test_center_region_assigner_with_empty_bboxes(): + self = CenterRegionAssigner( + pos_scale=0.5, + neg_scale=1, + ) + bboxes = torch.empty((0, 4)).float() + gt_bboxes = torch.FloatTensor([ + [0, 0, 10, 10], # match bboxes[0] + [10, 10, 20, 20], # match bboxes[1] + ]) + gt_labels = torch.LongTensor([1, 2]) + assign_result = self.assign(bboxes, gt_bboxes, gt_labels=gt_labels) + assert assign_result.gt_inds is None or assign_result.gt_inds.numel() == 0 + assert assign_result.labels is None or assign_result.labels.numel() == 0 + + +def test_center_region_assigner_with_empty_gts(): + self = CenterRegionAssigner( + pos_scale=0.5, + neg_scale=1, + ) + bboxes = torch.FloatTensor([ + [0, 0, 10, 10], + [10, 10, 20, 20], + ]) + gt_bboxes = torch.empty((0, 4)).float() + gt_labels = torch.empty((0, )).long() + assign_result = self.assign(bboxes, gt_bboxes, gt_labels=gt_labels) + assert len(assign_result.gt_inds) == 2 + expected_gt_inds = torch.LongTensor([0, 0]) + assert torch.all(assign_result.gt_inds == expected_gt_inds) + + +def test_hungarian_match_assigner(): + self = HungarianAssigner() + assert self.iou_cost.iou_mode == 'giou' + + # test no gt bboxes + bbox_pred = torch.rand((10, 4)) + cls_pred = torch.rand((10, 81)) + gt_bboxes = torch.empty((0, 4)).float() + gt_labels = torch.empty((0, )).long() + img_meta = dict(img_shape=(10, 8, 3)) + assign_result = self.assign(bbox_pred, cls_pred, gt_bboxes, gt_labels, + img_meta) + assert torch.all(assign_result.gt_inds == 0) + assert torch.all(assign_result.labels == -1) + + # test with gt bboxes + gt_bboxes = torch.FloatTensor([[0, 0, 5, 7], [3, 5, 7, 8]]) + gt_labels = torch.LongTensor([1, 20]) + assign_result = self.assign(bbox_pred, cls_pred, gt_bboxes, gt_labels, + img_meta) + + assert torch.all(assign_result.gt_inds > -1) + assert (assign_result.gt_inds > 0).sum() == gt_bboxes.size(0) + assert (assign_result.labels > -1).sum() == gt_bboxes.size(0) + + # test iou mode + self = HungarianAssigner( + iou_cost=dict(type='IoUCost', iou_mode='iou', weight=1.0)) + assert self.iou_cost.iou_mode == 'iou' + assign_result = self.assign(bbox_pred, cls_pred, gt_bboxes, gt_labels, + img_meta) + assert torch.all(assign_result.gt_inds > -1) + assert (assign_result.gt_inds > 0).sum() == gt_bboxes.size(0) + assert (assign_result.labels > -1).sum() == gt_bboxes.size(0) + + # test focal loss mode + self = HungarianAssigner( + iou_cost=dict(type='IoUCost', iou_mode='giou', weight=1.0), + cls_cost=dict(type='FocalLossCost', weight=1.)) + assert self.iou_cost.iou_mode == 'giou' + assign_result = self.assign(bbox_pred, cls_pred, gt_bboxes, gt_labels, + img_meta) + assert torch.all(assign_result.gt_inds > -1) + assert (assign_result.gt_inds > 0).sum() == gt_bboxes.size(0) + assert (assign_result.labels > -1).sum() == gt_bboxes.size(0) + + +def test_uniform_assigner(): + self = UniformAssigner(0.15, 0.7, 1) + pred_bbox = torch.FloatTensor([ + [1, 1, 12, 8], + [4, 4, 20, 20], + [1, 5, 15, 15], + [30, 5, 32, 42], + ]) + anchor = torch.FloatTensor([ + [0, 0, 10, 10], + [10, 10, 20, 20], + [5, 5, 15, 15], + [32, 32, 38, 42], + ]) + gt_bboxes = torch.FloatTensor([ + [0, 0, 10, 9], + [0, 10, 10, 19], + ]) + gt_labels = torch.LongTensor([2, 3]) + assign_result = self.assign( + pred_bbox, anchor, gt_bboxes, gt_labels=gt_labels) + assert len(assign_result.gt_inds) == 4 + assert len(assign_result.labels) == 4 + + expected_gt_inds = torch.LongTensor([-1, 0, 2, 0]) + assert torch.all(assign_result.gt_inds == expected_gt_inds) + + +def test_uniform_assigner_with_empty_gt(): + """Test corner case where an image might have no true detections.""" + self = UniformAssigner(0.15, 0.7, 1) + pred_bbox = torch.FloatTensor([ + [1, 1, 12, 8], + [4, 4, 20, 20], + [1, 5, 15, 15], + [30, 5, 32, 42], + ]) + anchor = torch.FloatTensor([ + [0, 0, 10, 10], + [10, 10, 20, 20], + [5, 5, 15, 15], + [32, 32, 38, 42], + ]) + gt_bboxes = torch.empty(0, 4) + assign_result = self.assign(pred_bbox, anchor, gt_bboxes) + + expected_gt_inds = torch.LongTensor([0, 0, 0, 0]) + assert torch.all(assign_result.gt_inds == expected_gt_inds) + + +def test_uniform_assigner_with_empty_boxes(): + """Test corner case where a network might predict no boxes.""" + self = UniformAssigner(0.15, 0.7, 1) + pred_bbox = torch.empty((0, 4)) + anchor = torch.empty((0, 4)) + gt_bboxes = torch.FloatTensor([ + [0, 0, 10, 9], + [0, 10, 10, 19], + ]) + gt_labels = torch.LongTensor([2, 3]) + + # Test with gt_labels + assign_result = self.assign( + pred_bbox, anchor, gt_bboxes, gt_labels=gt_labels) + assert len(assign_result.gt_inds) == 0 + assert tuple(assign_result.labels.shape) == (0, ) + + # Test without gt_labels + assign_result = self.assign(pred_bbox, anchor, gt_bboxes, gt_labels=None) + assert len(assign_result.gt_inds) == 0 + + +def test_sim_ota_assigner(): + self = SimOTAAssigner( + center_radius=2.5, candidate_topk=1, iou_weight=3.0, cls_weight=1.0) + pred_scores = torch.FloatTensor([[0.2], [0.8]]) + priors = torch.Tensor([[0, 12, 23, 34], [4, 5, 6, 7]]) + decoded_bboxes = torch.Tensor([[[30, 40, 50, 60]], [[4, 5, 6, 7]]]) + gt_bboxes = torch.Tensor([[23.6667, 23.8757, 238.6326, 151.8874]]) + gt_labels = torch.LongTensor([2]) + assign_result = self.assign(pred_scores, priors, decoded_bboxes, gt_bboxes, + gt_labels) + + expected_gt_inds = torch.LongTensor([0, 0]) + assert torch.all(assign_result.gt_inds == expected_gt_inds) + + +def test_task_aligned_assigner(): + with pytest.raises(AssertionError): + TaskAlignedAssigner(topk=0) + + self = TaskAlignedAssigner(topk=13) + pred_score = torch.FloatTensor([[0.1, 0.2], [0.2, 0.3], [0.3, 0.4], + [0.4, 0.5]]) + pred_bbox = torch.FloatTensor([ + [1, 1, 12, 8], + [4, 4, 20, 20], + [1, 5, 15, 15], + [30, 5, 32, 42], + ]) + anchor = torch.FloatTensor([ + [0, 0, 10, 10], + [10, 10, 20, 20], + [5, 5, 15, 15], + [32, 32, 38, 42], + ]) + gt_bboxes = torch.FloatTensor([ + [0, 0, 10, 9], + [0, 10, 10, 19], + ]) + gt_labels = torch.LongTensor([0, 1]) + assign_result = self.assign( + pred_score, + pred_bbox, + anchor, + gt_bboxes=gt_bboxes, + gt_labels=gt_labels) + assert len(assign_result.gt_inds) == 4 + assert len(assign_result.labels) == 4 + + # test empty gt + gt_bboxes = torch.empty(0, 4) + gt_labels = torch.empty(0, 2) + assign_result = self.assign( + pred_score, pred_bbox, anchor, gt_bboxes=gt_bboxes) + expected_gt_inds = torch.LongTensor([0, 0, 0, 0]) + assert torch.all(assign_result.gt_inds == expected_gt_inds) + + +def test_mask_hungarian_match_assigner(): + # test no gt masks + assigner_cfg = dict( + cls_cost=dict(type='ClassificationCost', weight=1.0), + mask_cost=dict(type='FocalLossCost', weight=20.0, binary_input=True), + dice_cost=dict(type='DiceCost', weight=1.0, pred_act=True, eps=1.0)) + self = MaskHungarianAssigner(**assigner_cfg) + cls_pred = torch.rand((10, 133)) + mask_pred = torch.rand((10, 50, 50)) + + gt_labels = torch.empty((0, )).long() + gt_masks = torch.empty((0, 50, 50)).float() + img_meta = None + assign_result = self.assign(cls_pred, mask_pred, gt_labels, gt_masks, + img_meta) + assert torch.all(assign_result.gt_inds == 0) + assert torch.all(assign_result.labels == -1) + + # test with gt masks of naive_dice is True + gt_labels = torch.LongTensor([10, 100]) + gt_masks = torch.zeros((2, 50, 50)).long() + gt_masks[0, :25] = 1 + gt_masks[0, 25:] = 1 + assign_result = self.assign(cls_pred, mask_pred, gt_labels, gt_masks, + img_meta) + assert torch.all(assign_result.gt_inds > -1) + assert (assign_result.gt_inds > 0).sum() == gt_labels.size(0) + assert (assign_result.labels > -1).sum() == gt_labels.size(0) + + # test with cls mode + assigner_cfg = dict( + cls_cost=dict(type='ClassificationCost', weight=1.0), + mask_cost=dict(type='FocalLossCost', weight=0.0, binary_input=True), + dice_cost=dict(type='DiceCost', weight=0.0, pred_act=True, eps=1.0)) + self = MaskHungarianAssigner(**assigner_cfg) + assign_result = self.assign(cls_pred, mask_pred, gt_labels, gt_masks, + img_meta) + assert torch.all(assign_result.gt_inds > -1) + assert (assign_result.gt_inds > 0).sum() == gt_labels.size(0) + assert (assign_result.labels > -1).sum() == gt_labels.size(0) + + # test with mask focal mode + assigner_cfg = dict( + cls_cost=dict(type='ClassificationCost', weight=0.0), + mask_cost=dict(type='FocalLossCost', weight=1.0, binary_input=True), + dice_cost=dict(type='DiceCost', weight=0.0, pred_act=True, eps=1.0)) + self = MaskHungarianAssigner(**assigner_cfg) + assign_result = self.assign(cls_pred, mask_pred, gt_labels, gt_masks, + img_meta) + assert torch.all(assign_result.gt_inds > -1) + assert (assign_result.gt_inds > 0).sum() == gt_labels.size(0) + assert (assign_result.labels > -1).sum() == gt_labels.size(0) + + # test with mask dice mode + assigner_cfg = dict( + cls_cost=dict(type='ClassificationCost', weight=0.0), + mask_cost=dict(type='FocalLossCost', weight=0.0, binary_input=True), + dice_cost=dict(type='DiceCost', weight=1.0, pred_act=True, eps=1.0)) + self = MaskHungarianAssigner(**assigner_cfg) + assign_result = self.assign(cls_pred, mask_pred, gt_labels, gt_masks, + img_meta) + assert torch.all(assign_result.gt_inds > -1) + assert (assign_result.gt_inds > 0).sum() == gt_labels.size(0) + assert (assign_result.labels > -1).sum() == gt_labels.size(0) + + # test with mask dice mode that naive_dice is False + assigner_cfg = dict( + cls_cost=dict(type='ClassificationCost', weight=0.0), + mask_cost=dict(type='FocalLossCost', weight=0.0, binary_input=True), + dice_cost=dict( + type='DiceCost', + weight=1.0, + pred_act=True, + eps=1.0, + naive_dice=False)) + self = MaskHungarianAssigner(**assigner_cfg) + assign_result = self.assign(cls_pred, mask_pred, gt_labels, gt_masks, + img_meta) + assert torch.all(assign_result.gt_inds > -1) + assert (assign_result.gt_inds > 0).sum() == gt_labels.size(0) + assert (assign_result.labels > -1).sum() == gt_labels.size(0) + + # test with mask bce mode + assigner_cfg = dict( + cls_cost=dict(type='ClassificationCost', weight=0.0), + mask_cost=dict( + type='CrossEntropyLossCost', weight=1.0, use_sigmoid=True), + dice_cost=dict(type='DiceCost', weight=0.0, pred_act=True, eps=1.0)) + self = MaskHungarianAssigner(**assigner_cfg) + assign_result = self.assign(cls_pred, mask_pred, gt_labels, gt_masks, + img_meta) + assert torch.all(assign_result.gt_inds > -1) + assert (assign_result.gt_inds > 0).sum() == gt_labels.size(0) + assert (assign_result.labels > -1).sum() == gt_labels.size(0) + + # test with ce mode of CrossEntropyLossCost which is not supported yet + assigner_cfg = dict( + cls_cost=dict(type='ClassificationCost', weight=0.0), + mask_cost=dict( + type='CrossEntropyLossCost', weight=1.0, use_sigmoid=False), + dice_cost=dict(type='DiceCost', weight=0.0, pred_act=True, eps=1.0)) + with pytest.raises(AssertionError): + self = MaskHungarianAssigner(**assigner_cfg) + + +def test_ascend_max_iou_assigner(): + self = AscendMaxIoUAssigner( + pos_iou_thr=0.5, + neg_iou_thr=0.5, + ) + batch_bboxes = torch.FloatTensor([[ + [0, 0, 10, 10], + [10, 10, 20, 20], + [5, 5, 15, 15], + [32, 32, 38, 42], + ]]) + batch_gt_bboxes = torch.FloatTensor([[ + [0, 0, 10, 9], + [0, 10, 10, 19], + ]]) + batch_gt_labels = torch.LongTensor([[2, 3]]) + batch_bboxes_ignore_mask = torch.IntTensor([[1, 1, 1, 1]]) + assign_result = self.assign( + batch_bboxes, + batch_gt_bboxes, + batch_gt_labels=batch_gt_labels, + batch_bboxes_ignore_mask=batch_bboxes_ignore_mask) + + expected_batch_pos_mask = torch.IntTensor([1, 0, 1, 0]) + expected_batch_anchor_gt_indes = torch.IntTensor([0, 0, 1, 0]) + expected_batch_anchor_gt_labels = torch.IntTensor([2, 0, 3, 0]) + + assert torch.all(assign_result.batch_pos_mask == expected_batch_pos_mask) + assert torch.all( + assign_result.batch_anchor_gt_indes * + assign_result.batch_pos_mask == expected_batch_anchor_gt_indes) + assert torch.all( + assign_result.batch_anchor_gt_labels * + assign_result.batch_pos_mask == expected_batch_anchor_gt_labels) diff --git a/tests/test_utils/test_coder.py b/tests/test_utils/test_coder.py new file mode 100644 index 0000000..f23649d --- /dev/null +++ b/tests/test_utils/test_coder.py @@ -0,0 +1,127 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest +import torch + +from mmdet.core.bbox.coder import (DeltaXYWHBBoxCoder, DistancePointBBoxCoder, + TBLRBBoxCoder, YOLOBBoxCoder) + + +def test_yolo_bbox_coder(): + coder = YOLOBBoxCoder() + bboxes = torch.Tensor([[-42., -29., 74., 61.], [-10., -29., 106., 61.], + [22., -29., 138., 61.], [54., -29., 170., 61.]]) + pred_bboxes = torch.Tensor([[0.4709, 0.6152, 0.1690, -0.4056], + [0.5399, 0.6653, 0.1162, -0.4162], + [0.4654, 0.6618, 0.1548, -0.4301], + [0.4786, 0.6197, 0.1896, -0.4479]]) + grid_size = 32 + expected_decode_bboxes = torch.Tensor( + [[-53.6102, -10.3096, 83.7478, 49.6824], + [-15.8700, -8.3901, 114.4236, 50.9693], + [11.1822, -8.0924, 146.6034, 50.4476], + [41.2068, -8.9232, 181.4236, 48.5840]]) + assert expected_decode_bboxes.allclose( + coder.decode(bboxes, pred_bboxes, grid_size)) + + +def test_delta_bbox_coder(): + coder = DeltaXYWHBBoxCoder() + + rois = torch.Tensor([[0., 0., 1., 1.], [0., 0., 1., 1.], [0., 0., 1., 1.], + [5., 5., 5., 5.]]) + deltas = torch.Tensor([[0., 0., 0., 0.], [1., 1., 1., 1.], + [0., 0., 2., -1.], [0.7, -1.9, -0.5, 0.3]]) + expected_decode_bboxes = torch.Tensor([[0.0000, 0.0000, 1.0000, 1.0000], + [0.1409, 0.1409, 2.8591, 2.8591], + [0.0000, 0.3161, 4.1945, 0.6839], + [5.0000, 5.0000, 5.0000, 5.0000]]) + + out = coder.decode(rois, deltas, max_shape=(32, 32)) + assert expected_decode_bboxes.allclose(out, atol=1e-04) + out = coder.decode(rois, deltas, max_shape=torch.Tensor((32, 32))) + assert expected_decode_bboxes.allclose(out, atol=1e-04) + + batch_rois = rois.unsqueeze(0).repeat(2, 1, 1) + batch_deltas = deltas.unsqueeze(0).repeat(2, 1, 1) + batch_out = coder.decode(batch_rois, batch_deltas, max_shape=(32, 32))[0] + assert out.allclose(batch_out) + batch_out = coder.decode( + batch_rois, batch_deltas, max_shape=[(32, 32), (32, 32)])[0] + assert out.allclose(batch_out) + + # test max_shape is not equal to batch + with pytest.raises(AssertionError): + coder.decode( + batch_rois, batch_deltas, max_shape=[(32, 32), (32, 32), (32, 32)]) + + rois = torch.zeros((0, 4)) + deltas = torch.zeros((0, 4)) + out = coder.decode(rois, deltas, max_shape=(32, 32)) + assert rois.shape == out.shape + + # test add_ctr_clamp + coder = DeltaXYWHBBoxCoder(add_ctr_clamp=True, ctr_clamp=2) + + rois = torch.Tensor([[0., 0., 6., 6.], [0., 0., 1., 1.], [0., 0., 1., 1.], + [5., 5., 5., 5.]]) + deltas = torch.Tensor([[1., 1., 2., 2.], [1., 1., 1., 1.], + [0., 0., 2., -1.], [0.7, -1.9, -0.5, 0.3]]) + expected_decode_bboxes = torch.Tensor([[0.0000, 0.0000, 27.1672, 27.1672], + [0.1409, 0.1409, 2.8591, 2.8591], + [0.0000, 0.3161, 4.1945, 0.6839], + [5.0000, 5.0000, 5.0000, 5.0000]]) + + out = coder.decode(rois, deltas, max_shape=(32, 32)) + assert expected_decode_bboxes.allclose(out, atol=1e-04) + + +def test_tblr_bbox_coder(): + coder = TBLRBBoxCoder(normalizer=15.) + + rois = torch.Tensor([[0., 0., 1., 1.], [0., 0., 1., 1.], [0., 0., 1., 1.], + [5., 5., 5., 5.]]) + deltas = torch.Tensor([[0., 0., 0., 0.], [1., 1., 1., 1.], + [0., 0., 2., -1.], [0.7, -1.9, -0.5, 0.3]]) + expected_decode_bboxes = torch.Tensor([[0.5000, 0.5000, 0.5000, 0.5000], + [0.0000, 0.0000, 12.0000, 13.0000], + [0.0000, 0.5000, 0.0000, 0.5000], + [5.0000, 5.0000, 5.0000, 5.0000]]) + + out = coder.decode(rois, deltas, max_shape=(13, 12)) + assert expected_decode_bboxes.allclose(out) + out = coder.decode(rois, deltas, max_shape=torch.Tensor((13, 12))) + assert expected_decode_bboxes.allclose(out) + + batch_rois = rois.unsqueeze(0).repeat(2, 1, 1) + batch_deltas = deltas.unsqueeze(0).repeat(2, 1, 1) + batch_out = coder.decode(batch_rois, batch_deltas, max_shape=(13, 12))[0] + assert out.allclose(batch_out) + batch_out = coder.decode( + batch_rois, batch_deltas, max_shape=[(13, 12), (13, 12)])[0] + assert out.allclose(batch_out) + + # test max_shape is not equal to batch + with pytest.raises(AssertionError): + coder.decode(batch_rois, batch_deltas, max_shape=[(13, 12)]) + + rois = torch.zeros((0, 4)) + deltas = torch.zeros((0, 4)) + out = coder.decode(rois, deltas, max_shape=(32, 32)) + assert rois.shape == out.shape + + +def test_distance_point_bbox_coder(): + coder = DistancePointBBoxCoder() + + points = torch.Tensor([[74., 61.], [-29., 106.], [138., 61.], [29., 170.]]) + gt_bboxes = torch.Tensor([[74., 61., 75., 62.], [0., 104., 0., 112.], + [100., 90., 100., 120.], [0., 120., 100., 120.]]) + expected_distance = torch.Tensor([[0., 0., 1., 1.], [0., 2., 29., 6.], + [38., 0., 0., 50.], [29., 50., 50., 0.]]) + out_distance = coder.encode(points, gt_bboxes, max_dis=50, eps=0) + assert expected_distance.allclose(out_distance) + + distance = torch.Tensor([[0., 0, 1., 1.], [1., 2., 10., 6.], + [22., -29., 138., 61.], [54., -29., 170., 61.]]) + out_bbox = coder.decode(points, distance, max_shape=(120, 100)) + assert gt_bboxes.allclose(out_bbox) diff --git a/tests/test_utils/test_compat_config.py b/tests/test_utils/test_compat_config.py new file mode 100644 index 0000000..5f8178a --- /dev/null +++ b/tests/test_utils/test_compat_config.py @@ -0,0 +1,115 @@ +import pytest +from mmcv import ConfigDict + +from mmdet.utils.compat_config import (compat_imgs_per_gpu, compat_loader_args, + compat_runner_args) + + +def test_compat_runner_args(): + cfg = ConfigDict(dict(total_epochs=12)) + with pytest.warns(None) as record: + cfg = compat_runner_args(cfg) + assert len(record) == 1 + assert 'runner' in record.list[0].message.args[0] + assert 'runner' in cfg + assert cfg.runner.type == 'EpochBasedRunner' + assert cfg.runner.max_epochs == cfg.total_epochs + + +def test_compat_loader_args(): + cfg = ConfigDict(dict(data=dict(val=dict(), test=dict(), train=dict()))) + cfg = compat_loader_args(cfg) + # auto fill loader args + assert 'val_dataloader' in cfg.data + assert 'train_dataloader' in cfg.data + assert 'test_dataloader' in cfg.data + cfg = ConfigDict( + dict( + data=dict( + samples_per_gpu=1, + persistent_workers=True, + workers_per_gpu=1, + val=dict(samples_per_gpu=3), + test=dict(samples_per_gpu=2), + train=dict()))) + + cfg = compat_loader_args(cfg) + + assert cfg.data.train_dataloader.workers_per_gpu == 1 + assert cfg.data.train_dataloader.samples_per_gpu == 1 + assert cfg.data.train_dataloader.persistent_workers + assert cfg.data.val_dataloader.workers_per_gpu == 1 + assert cfg.data.val_dataloader.samples_per_gpu == 3 + assert cfg.data.test_dataloader.workers_per_gpu == 1 + assert cfg.data.test_dataloader.samples_per_gpu == 2 + + # test test is a list + cfg = ConfigDict( + dict( + data=dict( + samples_per_gpu=1, + persistent_workers=True, + workers_per_gpu=1, + val=dict(samples_per_gpu=3), + test=[dict(samples_per_gpu=2), + dict(samples_per_gpu=3)], + train=dict()))) + + cfg = compat_loader_args(cfg) + assert cfg.data.test_dataloader.samples_per_gpu == 3 + + # assert can not set args at the same time + cfg = ConfigDict( + dict( + data=dict( + samples_per_gpu=1, + persistent_workers=True, + workers_per_gpu=1, + val=dict(samples_per_gpu=3), + test=dict(samples_per_gpu=2), + train=dict(), + train_dataloader=dict(samples_per_gpu=2)))) + # samples_per_gpu can not be set in `train_dataloader` + # and data field at the same time + with pytest.raises(AssertionError): + compat_loader_args(cfg) + cfg = ConfigDict( + dict( + data=dict( + samples_per_gpu=1, + persistent_workers=True, + workers_per_gpu=1, + val=dict(samples_per_gpu=3), + test=dict(samples_per_gpu=2), + train=dict(), + val_dataloader=dict(samples_per_gpu=2)))) + # samples_per_gpu can not be set in `val_dataloader` + # and data field at the same time + with pytest.raises(AssertionError): + compat_loader_args(cfg) + cfg = ConfigDict( + dict( + data=dict( + samples_per_gpu=1, + persistent_workers=True, + workers_per_gpu=1, + val=dict(samples_per_gpu=3), + test=dict(samples_per_gpu=2), + test_dataloader=dict(samples_per_gpu=2)))) + # samples_per_gpu can not be set in `test_dataloader` + # and data field at the same time + with pytest.raises(AssertionError): + compat_loader_args(cfg) + + +def test_compat_imgs_per_gpu(): + cfg = ConfigDict( + dict( + data=dict( + imgs_per_gpu=1, + samples_per_gpu=2, + val=dict(), + test=dict(), + train=dict()))) + cfg = compat_imgs_per_gpu(cfg) + assert cfg.data.samples_per_gpu == cfg.data.imgs_per_gpu diff --git a/tests/test_utils/test_general_data.py b/tests/test_utils/test_general_data.py new file mode 100644 index 0000000..c5525fd --- /dev/null +++ b/tests/test_utils/test_general_data.py @@ -0,0 +1,591 @@ +import copy + +import numpy as np +import pytest +import torch + +from mmdet.core import GeneralData, InstanceData + + +def _equal(a, b): + if isinstance(a, (torch.Tensor, np.ndarray)): + return (a == b).all() + else: + return a == b + + +def test_general_data(): + + # test init + meta_info = dict( + img_size=[256, 256], + path='dadfaff', + scale_factor=np.array([1.5, 1.5]), + img_shape=torch.rand(4)) + + data = dict( + bboxes=torch.rand(4, 4), + labels=torch.rand(4), + masks=np.random.rand(4, 2, 2)) + + instance_data = GeneralData(meta_info=meta_info) + assert 'img_size' in instance_data + assert instance_data.img_size == [256, 256] + assert instance_data['img_size'] == [256, 256] + assert 'path' in instance_data + assert instance_data.path == 'dadfaff' + + # test nice_repr + repr_instance_data = instance_data.new(data=data) + nice_repr = str(repr_instance_data) + for line in nice_repr.split('\n'): + if 'masks' in line: + assert 'shape' in line + assert '(4, 2, 2)' in line + if 'bboxes' in line: + assert 'shape' in line + assert 'torch.Size([4, 4])' in line + if 'path' in line: + assert 'dadfaff' in line + if 'scale_factor' in line: + assert '[1.5 1.5]' in line + + instance_data = GeneralData( + meta_info=meta_info, data=dict(bboxes=torch.rand(5))) + assert 'bboxes' in instance_data + assert len(instance_data.bboxes) == 5 + + # data should be a dict + with pytest.raises(AssertionError): + GeneralData(data=1) + + # test set data + instance_data = GeneralData() + instance_data.set_data(data) + assert 'bboxes' in instance_data + assert len(instance_data.bboxes) == 4 + assert 'masks' in instance_data + assert len(instance_data.masks) == 4 + # data should be a dict + with pytest.raises(AssertionError): + instance_data.set_data(data=1) + + # test set_meta + instance_data = GeneralData() + instance_data.set_meta_info(meta_info) + assert 'img_size' in instance_data + assert instance_data.img_size == [256, 256] + assert instance_data['img_size'] == [256, 256] + assert 'path' in instance_data + assert instance_data.path == 'dadfaff' + # can skip same value when overwrite + instance_data.set_meta_info(meta_info) + + # meta should be a dict + with pytest.raises(AssertionError): + instance_data.set_meta_info(meta_info='fjhka') + + # attribute in `_meta_info_field` is immutable once initialized + instance_data.set_meta_info(meta_info) + # meta should be immutable + with pytest.raises(KeyError): + instance_data.set_meta_info(dict(img_size=[254, 251])) + with pytest.raises(KeyError): + duplicate_meta_info = copy.deepcopy(meta_info) + duplicate_meta_info['path'] = 'dada' + instance_data.set_meta_info(duplicate_meta_info) + with pytest.raises(KeyError): + duplicate_meta_info = copy.deepcopy(meta_info) + duplicate_meta_info['scale_factor'] = np.array([1.5, 1.6]) + instance_data.set_meta_info(duplicate_meta_info) + + # test new_instance_data + instance_data = GeneralData(meta_info) + new_instance_data = instance_data.new() + for k, v in instance_data.meta_info_items(): + assert k in new_instance_data + _equal(v, new_instance_data[k]) + + instance_data = GeneralData(meta_info, data=data) + temp_meta = copy.deepcopy(meta_info) + temp_data = copy.deepcopy(data) + temp_data['time'] = '12212' + temp_meta['img_norm'] = np.random.random(3) + + new_instance_data = instance_data.new(meta_info=temp_meta, data=temp_data) + for k, v in new_instance_data.meta_info_items(): + if k in instance_data: + _equal(v, instance_data[k]) + else: + assert _equal(v, temp_meta[k]) + assert k == 'img_norm' + + for k, v in new_instance_data.items(): + if k in instance_data: + _equal(v, instance_data[k]) + else: + assert k == 'time' + assert _equal(v, temp_data[k]) + + # test keys + instance_data = GeneralData(meta_info, data=dict(bboxes=10)) + assert 'bboxes' in instance_data.keys() + instance_data.b = 10 + assert 'b' in instance_data + + # test meta keys + instance_data = GeneralData(meta_info, data=dict(bboxes=10)) + assert 'path' in instance_data.meta_info_keys() + assert len(instance_data.meta_info_keys()) == len(meta_info) + instance_data.set_meta_info(dict(workdir='fafaf')) + assert 'workdir' in instance_data + assert len(instance_data.meta_info_keys()) == len(meta_info) + 1 + + # test values + instance_data = GeneralData(meta_info, data=dict(bboxes=10)) + assert 10 in instance_data.values() + assert len(instance_data.values()) == 1 + + # test meta values + instance_data = GeneralData(meta_info, data=dict(bboxes=10)) + # torch 1.3 eq() can not compare str and tensor + from mmdet import digit_version + if digit_version(torch.__version__) >= [1, 4]: + assert 'dadfaff' in instance_data.meta_info_values() + assert len(instance_data.meta_info_values()) == len(meta_info) + + # test items + instance_data = GeneralData(data=data) + for k, v in instance_data.items(): + assert k in data + assert _equal(v, data[k]) + + # test meta_info_items + instance_data = GeneralData(meta_info=meta_info) + for k, v in instance_data.meta_info_items(): + assert k in meta_info + assert _equal(v, meta_info[k]) + + # test __setattr__ + new_instance_data = GeneralData(data=data) + new_instance_data.mask = torch.rand(3, 4, 5) + new_instance_data.bboxes = torch.rand(2, 4) + assert 'mask' in new_instance_data + assert len(new_instance_data.mask) == 3 + assert len(new_instance_data.bboxes) == 2 + + # test instance_data_field has been updated + assert 'mask' in new_instance_data._data_fields + assert 'bboxes' in new_instance_data._data_fields + + for k in data: + assert k in new_instance_data._data_fields + + # '_meta_info_field', '_data_fields' is immutable. + with pytest.raises(AttributeError): + new_instance_data._data_fields = None + with pytest.raises(AttributeError): + new_instance_data._meta_info_fields = None + with pytest.raises(AttributeError): + del new_instance_data._data_fields + with pytest.raises(AttributeError): + del new_instance_data._meta_info_fields + + # key in _meta_info_field is immutable + new_instance_data.set_meta_info(meta_info) + with pytest.raises(KeyError): + del new_instance_data.img_size + with pytest.raises(KeyError): + del new_instance_data.scale_factor + for k in new_instance_data.meta_info_keys(): + with pytest.raises(AttributeError): + new_instance_data[k] = None + + # test __delattr__ + # test key can be removed in instance_data_field + assert 'mask' in new_instance_data._data_fields + assert 'mask' in new_instance_data.keys() + assert 'mask' in new_instance_data + assert hasattr(new_instance_data, 'mask') + del new_instance_data.mask + assert 'mask' not in new_instance_data.keys() + assert 'mask' not in new_instance_data + assert 'mask' not in new_instance_data._data_fields + assert not hasattr(new_instance_data, 'mask') + + # tset __delitem__ + new_instance_data.mask = torch.rand(1, 2, 3) + assert 'mask' in new_instance_data._data_fields + assert 'mask' in new_instance_data + assert hasattr(new_instance_data, 'mask') + del new_instance_data['mask'] + assert 'mask' not in new_instance_data + assert 'mask' not in new_instance_data._data_fields + assert 'mask' not in new_instance_data + assert not hasattr(new_instance_data, 'mask') + + # test __setitem__ + new_instance_data['mask'] = torch.rand(1, 2, 3) + assert 'mask' in new_instance_data._data_fields + assert 'mask' in new_instance_data.keys() + assert hasattr(new_instance_data, 'mask') + + # test data_fields has been updated + assert 'mask' in new_instance_data.keys() + assert 'mask' in new_instance_data._data_fields + + # '_meta_info_field', '_data_fields' is immutable. + with pytest.raises(AttributeError): + del new_instance_data['_data_fields'] + with pytest.raises(AttributeError): + del new_instance_data['_meta_info_field'] + + # test __getitem__ + new_instance_data.mask is new_instance_data['mask'] + + # test get + assert new_instance_data.get('mask') is new_instance_data.mask + assert new_instance_data.get('none_attribute', None) is None + assert new_instance_data.get('none_attribute', 1) == 1 + + # test pop + mask = new_instance_data.mask + assert new_instance_data.pop('mask') is mask + assert new_instance_data.pop('mask', None) is None + assert new_instance_data.pop('mask', 1) == 1 + + # '_meta_info_field', '_data_fields' is immutable. + with pytest.raises(KeyError): + new_instance_data.pop('_data_fields') + with pytest.raises(KeyError): + new_instance_data.pop('_meta_info_field') + # attribute in `_meta_info_field` is immutable + with pytest.raises(KeyError): + new_instance_data.pop('img_size') + # test pop attribute in instance_data_filed + new_instance_data['mask'] = torch.rand(1, 2, 3) + new_instance_data.pop('mask') + # test data_field has been updated + assert 'mask' not in new_instance_data + assert 'mask' not in new_instance_data._data_fields + assert 'mask' not in new_instance_data + + # test_keys + new_instance_data.mask = torch.ones(1, 2, 3) + 'mask' in new_instance_data.keys() + has_flag = False + for key in new_instance_data.keys(): + if key == 'mask': + has_flag = True + assert has_flag + + # test values + assert len(list(new_instance_data.keys())) == len( + list(new_instance_data.values())) + mask = new_instance_data.mask + has_flag = False + for value in new_instance_data.values(): + if value is mask: + has_flag = True + assert has_flag + + # test items + assert len(list(new_instance_data.keys())) == len( + list(new_instance_data.items())) + mask = new_instance_data.mask + has_flag = False + for key, value in new_instance_data.items(): + if value is mask: + assert key == 'mask' + has_flag = True + assert has_flag + + # test device + new_instance_data = GeneralData() + if torch.cuda.is_available(): + newnew_instance_data = new_instance_data.new() + devices = ('cpu', 'cuda') + for i in range(10): + device = devices[i % 2] + newnew_instance_data[f'{i}'] = torch.rand(1, 2, 3, device=device) + newnew_instance_data = newnew_instance_data.cpu() + for value in newnew_instance_data.values(): + assert not value.is_cuda + newnew_instance_data = new_instance_data.new() + devices = ('cuda', 'cpu') + for i in range(10): + device = devices[i % 2] + newnew_instance_data[f'{i}'] = torch.rand(1, 2, 3, device=device) + newnew_instance_data = newnew_instance_data.cuda() + for value in newnew_instance_data.values(): + assert value.is_cuda + # test to + double_instance_data = instance_data.new() + double_instance_data.long = torch.LongTensor(1, 2, 3, 4) + double_instance_data.bool = torch.BoolTensor(1, 2, 3, 4) + double_instance_data = instance_data.to(torch.double) + for k, v in double_instance_data.items(): + if isinstance(v, torch.Tensor): + assert v.dtype is torch.double + + # test .cpu() .cuda() + if torch.cuda.is_available(): + cpu_instance_data = double_instance_data.new() + cpu_instance_data.mask = torch.rand(1) + cuda_tensor = torch.rand(1, 2, 3).cuda() + cuda_instance_data = cpu_instance_data.to(cuda_tensor.device) + for value in cuda_instance_data.values(): + assert value.is_cuda + cpu_instance_data = cuda_instance_data.cpu() + for value in cpu_instance_data.values(): + assert not value.is_cuda + cuda_instance_data = cpu_instance_data.cuda() + for value in cuda_instance_data.values(): + assert value.is_cuda + + # test detach + grad_instance_data = double_instance_data.new() + grad_instance_data.mask = torch.rand(2, requires_grad=True) + grad_instance_data.mask_1 = torch.rand(2, requires_grad=True) + detach_instance_data = grad_instance_data.detach() + for value in detach_instance_data.values(): + assert not value.requires_grad + + # test numpy + tensor_instance_data = double_instance_data.new() + tensor_instance_data.mask = torch.rand(2, requires_grad=True) + tensor_instance_data.mask_1 = torch.rand(2, requires_grad=True) + numpy_instance_data = tensor_instance_data.numpy() + for value in numpy_instance_data.values(): + assert isinstance(value, np.ndarray) + if torch.cuda.is_available(): + tensor_instance_data = double_instance_data.new() + tensor_instance_data.mask = torch.rand(2) + tensor_instance_data.mask_1 = torch.rand(2) + tensor_instance_data = tensor_instance_data.cuda() + numpy_instance_data = tensor_instance_data.numpy() + for value in numpy_instance_data.values(): + assert isinstance(value, np.ndarray) + + instance_data['_c'] = 10000 + instance_data.get('dad', None) is None + assert hasattr(instance_data, '_c') + del instance_data['_c'] + assert not hasattr(instance_data, '_c') + instance_data.a = 1000 + instance_data['a'] = 2000 + assert instance_data['a'] == 2000 + assert instance_data.a == 2000 + assert instance_data.get('a') == instance_data['a'] == instance_data.a + instance_data._meta = 1000 + assert '_meta' in instance_data.keys() + if torch.cuda.is_available(): + instance_data.bbox = torch.ones(2, 3, 4, 5).cuda() + instance_data.score = torch.ones(2, 3, 4, 4) + else: + instance_data.bbox = torch.ones(2, 3, 4, 5) + + assert len(instance_data.new().keys()) == 0 + with pytest.raises(AttributeError): + instance_data.img_size = 100 + + for k, v in instance_data.items(): + if k == 'bbox': + assert isinstance(v, torch.Tensor) + assert 'a' in instance_data + instance_data.pop('a') + assert 'a' not in instance_data + + cpu_instance_data = instance_data.cpu() + for k, v in cpu_instance_data.items(): + if isinstance(v, torch.Tensor): + assert not v.is_cuda + + assert isinstance(cpu_instance_data.numpy().bbox, np.ndarray) + + if torch.cuda.is_available(): + cuda_resutls = instance_data.cuda() + for k, v in cuda_resutls.items(): + if isinstance(v, torch.Tensor): + assert v.is_cuda + + +def test_instance_data(): + meta_info = dict( + img_size=(256, 256), + path='dadfaff', + scale_factor=np.array([1.5, 1.5, 1, 1])) + + data = dict( + bboxes=torch.rand(4, 4), + masks=torch.rand(4, 2, 2), + labels=np.random.rand(4), + size=[(i, i) for i in range(4)]) + + # test init + instance_data = InstanceData(meta_info) + assert 'path' in instance_data + instance_data = InstanceData(meta_info, data=data) + assert len(instance_data) == 4 + instance_data.set_data(data) + assert len(instance_data) == 4 + + meta_info = copy.deepcopy(meta_info) + meta_info['img_name'] = 'flag' + + # test newinstance_data + new_instance_data = instance_data.new(meta_info=meta_info) + for k, v in new_instance_data.meta_info_items(): + if k in instance_data: + _equal(v, instance_data[k]) + else: + assert _equal(v, meta_info[k]) + assert k == 'img_name' + # meta info is immutable + with pytest.raises(KeyError): + meta_info = copy.deepcopy(meta_info) + meta_info['path'] = 'fdasfdsd' + instance_data.new(meta_info=meta_info) + + # data fields should have same length + with pytest.raises(AssertionError): + temp_data = copy.deepcopy(data) + temp_data['bboxes'] = torch.rand(5, 4) + instance_data.new(data=temp_data) + + temp_data = copy.deepcopy(data) + temp_data['scores'] = torch.rand(4) + new_instance_data = instance_data.new(data=temp_data) + for k, v in new_instance_data.items(): + if k in instance_data: + _equal(v, instance_data[k]) + else: + assert k == 'scores' + assert _equal(v, temp_data[k]) + + instance_data = instance_data.new() + + # test __setattr__ + # '_meta_info_field', '_data_fields' is immutable. + with pytest.raises(AttributeError): + instance_data._data_fields = dict() + with pytest.raises(AttributeError): + instance_data._data_fields = dict() + + # all attribute in instance_data_field should be + # (torch.Tensor, np.ndarray, list)) + with pytest.raises(AssertionError): + instance_data.a = 1000 + + # instance_data field should has same length + new_instance_data = instance_data.new() + new_instance_data.det_bbox = torch.rand(100, 4) + new_instance_data.det_label = torch.arange(100) + with pytest.raises(AssertionError): + new_instance_data.scores = torch.rand(101, 1) + new_instance_data.none = [None] * 100 + with pytest.raises(AssertionError): + new_instance_data.scores = [None] * 101 + new_instance_data.numpy_det = np.random.random([100, 1]) + with pytest.raises(AssertionError): + new_instance_data.scores = np.random.random([101, 1]) + + # isinstance(str, slice, int, torch.LongTensor, torch.BoolTensor) + item = torch.Tensor([1, 2, 3, 4]) + with pytest.raises(AssertionError): + new_instance_data[item] + len(new_instance_data[item.long()]) == 1 + + # when input is a bool tensor, The shape of + # the input at index 0 should equal to + # the value length in instance_data_field + with pytest.raises(AssertionError): + new_instance_data[item.bool()] + + for i in range(len(new_instance_data)): + assert new_instance_data[i].det_label == i + assert len(new_instance_data[i]) == 1 + + # assert the index should in 0 ~ len(instance_data) -1 + with pytest.raises(IndexError): + new_instance_data[101] + + # assert the index should not be an empty tensor + new_new_instance_data = new_instance_data.new() + with pytest.raises(AssertionError): + new_new_instance_data[0] + + # test str + with pytest.raises(AssertionError): + instance_data.img_size_dummmy = meta_info['img_size'] + + # test slice + ten_ressults = new_instance_data[:10] + len(ten_ressults) == 10 + for v in ten_ressults.values(): + assert len(v) == 10 + + # test Longtensor + long_tensor = torch.randint(100, (50, )) + long_index_instance_data = new_instance_data[long_tensor] + assert len(long_index_instance_data) == len(long_tensor) + for key, value in long_index_instance_data.items(): + if not isinstance(value, list): + assert (long_index_instance_data[key] == new_instance_data[key] + [long_tensor]).all() + else: + len(long_tensor) == len(value) + + # test bool tensor + bool_tensor = torch.rand(100) > 0.5 + bool_index_instance_data = new_instance_data[bool_tensor] + assert len(bool_index_instance_data) == bool_tensor.sum() + for key, value in bool_index_instance_data.items(): + if not isinstance(value, list): + assert (bool_index_instance_data[key] == new_instance_data[key] + [bool_tensor]).all() + else: + assert len(value) == bool_tensor.sum() + + num_instance = 1000 + instance_data_list = [] + + # assert len(instance_lists) > 0 + with pytest.raises(AssertionError): + instance_data.cat(instance_data_list) + + for _ in range(2): + instance_data['bbox'] = torch.rand(num_instance, 4) + instance_data['label'] = torch.rand(num_instance, 1) + instance_data['mask'] = torch.rand(num_instance, 224, 224) + instance_data['instances_infos'] = [1] * num_instance + instance_data['cpu_bbox'] = np.random.random((num_instance, 4)) + if torch.cuda.is_available(): + instance_data.cuda_tensor = torch.rand(num_instance).cuda() + assert instance_data.cuda_tensor.is_cuda + cuda_instance_data = instance_data.cuda() + assert cuda_instance_data.cuda_tensor.is_cuda + + assert len(instance_data[0]) == 1 + with pytest.raises(IndexError): + return instance_data[num_instance + 1] + with pytest.raises(AssertionError): + instance_data.centerness = torch.rand(num_instance + 1, 1) + + mask_tensor = torch.rand(num_instance) > 0.5 + length = mask_tensor.sum() + assert len(instance_data[mask_tensor]) == length + + index_tensor = torch.LongTensor([1, 5, 8, 110, 399]) + length = len(index_tensor) + + assert len(instance_data[index_tensor]) == length + + instance_data_list.append(instance_data) + + cat_resutls = InstanceData.cat(instance_data_list) + assert len(cat_resutls) == num_instance * 2 + + instances = InstanceData(data=dict(bboxes=torch.rand(4, 4))) + # cat only single instance + assert len(InstanceData.cat([instances])) == 4 diff --git a/tests/test_utils/test_hook.py b/tests/test_utils/test_hook.py new file mode 100644 index 0000000..49cd5ca --- /dev/null +++ b/tests/test_utils/test_hook.py @@ -0,0 +1,415 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import logging +import shutil +import sys +import tempfile +from unittest.mock import MagicMock, Mock, call, patch + +import numpy as np +import pytest +import torch +import torch.nn as nn +from mmcv.runner import (CheckpointHook, IterTimerHook, PaviLoggerHook, + build_runner) +from torch.nn.init import constant_ +from torch.utils.data import DataLoader, Dataset + +from mmdet.core.hook import ExpMomentumEMAHook, YOLOXLrUpdaterHook +from mmdet.core.hook.sync_norm_hook import SyncNormHook +from mmdet.core.hook.sync_random_size_hook import SyncRandomSizeHook + + +def _build_demo_runner_without_hook(runner_type='EpochBasedRunner', + max_epochs=1, + max_iters=None, + multi_optimziers=False): + + class Model(nn.Module): + + def __init__(self): + super().__init__() + self.linear = nn.Linear(2, 1) + self.conv = nn.Conv2d(3, 3, 3) + + def forward(self, x): + return self.linear(x) + + def train_step(self, x, optimizer, **kwargs): + return dict(loss=self(x)) + + def val_step(self, x, optimizer, **kwargs): + return dict(loss=self(x)) + + model = Model() + + if multi_optimziers: + optimizer = { + 'model1': + torch.optim.SGD(model.linear.parameters(), lr=0.02, momentum=0.95), + 'model2': + torch.optim.SGD(model.conv.parameters(), lr=0.01, momentum=0.9), + } + else: + optimizer = torch.optim.SGD(model.parameters(), lr=0.02, momentum=0.95) + + tmp_dir = tempfile.mkdtemp() + runner = build_runner( + dict(type=runner_type), + default_args=dict( + model=model, + work_dir=tmp_dir, + optimizer=optimizer, + logger=logging.getLogger(), + max_epochs=max_epochs, + max_iters=max_iters)) + return runner + + +def _build_demo_runner(runner_type='EpochBasedRunner', + max_epochs=1, + max_iters=None, + multi_optimziers=False): + log_config = dict( + interval=1, hooks=[ + dict(type='TextLoggerHook'), + ]) + + runner = _build_demo_runner_without_hook(runner_type, max_epochs, + max_iters, multi_optimziers) + + runner.register_checkpoint_hook(dict(interval=1)) + runner.register_logger_hooks(log_config) + return runner + + +@pytest.mark.parametrize('multi_optimziers', (True, False)) +def test_yolox_lrupdater_hook(multi_optimziers): + """xdoctest -m tests/test_hooks.py test_cosine_runner_hook.""" + # Only used to prevent program errors + YOLOXLrUpdaterHook(0, min_lr_ratio=0.05) + + sys.modules['pavi'] = MagicMock() + loader = DataLoader(torch.ones((10, 2))) + runner = _build_demo_runner(multi_optimziers=multi_optimziers) + + hook_cfg = dict( + type='YOLOXLrUpdaterHook', + warmup='exp', + by_epoch=False, + warmup_by_epoch=True, + warmup_ratio=1, + warmup_iters=5, # 5 epoch + num_last_epochs=15, + min_lr_ratio=0.05) + runner.register_hook_from_cfg(hook_cfg) + runner.register_hook_from_cfg(dict(type='IterTimerHook')) + runner.register_hook(IterTimerHook()) + + # add pavi hook + hook = PaviLoggerHook(interval=1, add_graph=False, add_last_ckpt=True) + runner.register_hook(hook) + runner.run([loader], [('train', 1)]) + shutil.rmtree(runner.work_dir) + + # TODO: use a more elegant way to check values + assert hasattr(hook, 'writer') + if multi_optimziers: + calls = [ + call( + 'train', { + 'learning_rate/model1': 8.000000000000001e-06, + 'learning_rate/model2': 4.000000000000001e-06, + 'momentum/model1': 0.95, + 'momentum/model2': 0.9 + }, 1), + call( + 'train', { + 'learning_rate/model1': 0.00039200000000000004, + 'learning_rate/model2': 0.00019600000000000002, + 'momentum/model1': 0.95, + 'momentum/model2': 0.9 + }, 7), + call( + 'train', { + 'learning_rate/model1': 0.0008000000000000001, + 'learning_rate/model2': 0.0004000000000000001, + 'momentum/model1': 0.95, + 'momentum/model2': 0.9 + }, 10) + ] + else: + calls = [ + call('train', { + 'learning_rate': 8.000000000000001e-06, + 'momentum': 0.95 + }, 1), + call('train', { + 'learning_rate': 0.00039200000000000004, + 'momentum': 0.95 + }, 7), + call('train', { + 'learning_rate': 0.0008000000000000001, + 'momentum': 0.95 + }, 10) + ] + hook.writer.add_scalars.assert_has_calls(calls, any_order=True) + + +def test_ema_hook(): + """xdoctest -m tests/test_hooks.py test_ema_hook.""" + + class DemoModel(nn.Module): + + def __init__(self): + super().__init__() + self.conv = nn.Conv2d( + in_channels=1, + out_channels=2, + kernel_size=1, + padding=1, + bias=True) + self.bn = nn.BatchNorm2d(2) + + self._init_weight() + + def _init_weight(self): + constant_(self.conv.weight, 0) + constant_(self.conv.bias, 0) + constant_(self.bn.weight, 0) + constant_(self.bn.bias, 0) + + def forward(self, x): + return self.bn(self.conv(x)).sum() + + def train_step(self, x, optimizer, **kwargs): + return dict(loss=self(x)) + + def val_step(self, x, optimizer, **kwargs): + return dict(loss=self(x)) + + loader = DataLoader(torch.ones((1, 1, 1, 1))) + runner = _build_demo_runner() + demo_model = DemoModel() + runner.model = demo_model + ema_hook = ExpMomentumEMAHook( + momentum=0.0002, + total_iter=1, + skip_buffers=True, + interval=2, + resume_from=None) + checkpointhook = CheckpointHook(interval=1, by_epoch=True) + runner.register_hook(ema_hook, priority='HIGHEST') + runner.register_hook(checkpointhook) + runner.run([loader, loader], [('train', 1), ('val', 1)]) + checkpoint = torch.load(f'{runner.work_dir}/epoch_1.pth') + num_eam_params = 0 + for name, value in checkpoint['state_dict'].items(): + if 'ema' in name: + num_eam_params += 1 + value.fill_(1) + assert num_eam_params == 4 + torch.save(checkpoint, f'{runner.work_dir}/epoch_1.pth') + + work_dir = runner.work_dir + resume_ema_hook = ExpMomentumEMAHook( + momentum=0.5, + total_iter=10, + skip_buffers=True, + interval=1, + resume_from=f'{work_dir}/epoch_1.pth') + runner = _build_demo_runner(max_epochs=2) + runner.model = demo_model + runner.register_hook(resume_ema_hook, priority='HIGHEST') + checkpointhook = CheckpointHook(interval=1, by_epoch=True) + runner.register_hook(checkpointhook) + runner.run([loader, loader], [('train', 1), ('val', 1)]) + checkpoint = torch.load(f'{runner.work_dir}/epoch_2.pth') + num_eam_params = 0 + desired_output = [0.9094, 0.9094] + for name, value in checkpoint['state_dict'].items(): + if 'ema' in name: + num_eam_params += 1 + assert value.sum() == 2 + else: + if ('weight' in name) or ('bias' in name): + np.allclose(value.data.cpu().numpy().reshape(-1), + desired_output, 1e-4) + assert num_eam_params == 4 + shutil.rmtree(runner.work_dir) + shutil.rmtree(work_dir) + + +def test_sync_norm_hook(): + # Only used to prevent program errors + SyncNormHook() + + loader = DataLoader(torch.ones((5, 2))) + runner = _build_demo_runner() + runner.register_hook_from_cfg(dict(type='SyncNormHook')) + runner.run([loader, loader], [('train', 1), ('val', 1)]) + shutil.rmtree(runner.work_dir) + + +def test_sync_random_size_hook(): + # Only used to prevent program errors + SyncRandomSizeHook() + + class DemoDataset(Dataset): + + def __getitem__(self, item): + return torch.ones(2) + + def __len__(self): + return 5 + + def update_dynamic_scale(self, dynamic_scale): + pass + + loader = DataLoader(DemoDataset()) + runner = _build_demo_runner() + runner.register_hook_from_cfg( + dict(type='SyncRandomSizeHook', device='cpu')) + runner.run([loader, loader], [('train', 1), ('val', 1)]) + shutil.rmtree(runner.work_dir) + + if torch.cuda.is_available(): + runner = _build_demo_runner() + runner.register_hook_from_cfg( + dict(type='SyncRandomSizeHook', device='cuda')) + runner.run([loader, loader], [('train', 1), ('val', 1)]) + shutil.rmtree(runner.work_dir) + + +@pytest.mark.parametrize('set_loss', [ + dict(set_loss_nan=False, set_loss_inf=False), + dict(set_loss_nan=True, set_loss_inf=False), + dict(set_loss_nan=False, set_loss_inf=True) +]) +def test_check_invalid_loss_hook(set_loss): + # Check whether loss is valid during training. + + class DemoModel(nn.Module): + + def __init__(self, set_loss_nan=False, set_loss_inf=False): + super().__init__() + self.set_loss_nan = set_loss_nan + self.set_loss_inf = set_loss_inf + self.linear = nn.Linear(2, 1) + + def forward(self, x): + return self.linear(x) + + def train_step(self, x, optimizer, **kwargs): + if self.set_loss_nan: + return dict(loss=torch.tensor(float('nan'))) + elif self.set_loss_inf: + return dict(loss=torch.tensor(float('inf'))) + else: + return dict(loss=self(x)) + + loader = DataLoader(torch.ones((5, 2))) + runner = _build_demo_runner() + + demo_model = DemoModel(**set_loss) + runner.model = demo_model + runner.register_hook_from_cfg( + dict(type='CheckInvalidLossHook', interval=1)) + if not set_loss['set_loss_nan'] \ + and not set_loss['set_loss_inf']: + # check loss is valid + runner.run([loader], [('train', 1)]) + else: + # check loss is nan or inf + with pytest.raises(AssertionError): + runner.run([loader], [('train', 1)]) + shutil.rmtree(runner.work_dir) + + +def test_set_epoch_info_hook(): + """Test SetEpochInfoHook.""" + + class DemoModel(nn.Module): + + def __init__(self): + super().__init__() + self.epoch = 0 + self.linear = nn.Linear(2, 1) + + def forward(self, x): + return self.linear(x) + + def train_step(self, x, optimizer, **kwargs): + return dict(loss=self(x)) + + def set_epoch(self, epoch): + self.epoch = epoch + + loader = DataLoader(torch.ones((5, 2))) + runner = _build_demo_runner(max_epochs=3) + + demo_model = DemoModel() + runner.model = demo_model + runner.register_hook_from_cfg(dict(type='SetEpochInfoHook')) + runner.run([loader], [('train', 1)]) + assert demo_model.epoch == 2 + + +def test_memory_profiler_hook(): + from collections import namedtuple + + # test ImportError without psutil and memory_profiler + with pytest.raises(ImportError): + from mmdet.core.hook import MemoryProfilerHook + MemoryProfilerHook(1) + + # test ImportError without memory_profiler + sys.modules['psutil'] = MagicMock() + with pytest.raises(ImportError): + from mmdet.core.hook import MemoryProfilerHook + MemoryProfilerHook(1) + + sys.modules['memory_profiler'] = MagicMock() + + def _mock_virtual_memory(): + virtual_memory_type = namedtuple( + 'virtual_memory', ['total', 'available', 'percent', 'used']) + return virtual_memory_type( + total=270109085696, + available=250416816128, + percent=7.3, + used=17840881664) + + def _mock_swap_memory(): + swap_memory_type = namedtuple('swap_memory', [ + 'total', + 'used', + 'percent', + ]) + return swap_memory_type(total=8589930496, used=0, percent=0.0) + + def _mock_memory_usage(): + return [40.22265625] + + mock_virtual_memory = Mock(return_value=_mock_virtual_memory()) + mock_swap_memory = Mock(return_value=_mock_swap_memory()) + mock_memory_usage = Mock(return_value=_mock_memory_usage()) + + @patch('psutil.swap_memory', mock_swap_memory) + @patch('psutil.virtual_memory', mock_virtual_memory) + @patch('memory_profiler.memory_usage', mock_memory_usage) + def _test_memory_profiler_hook(): + from mmdet.core.hook import MemoryProfilerHook + hook = MemoryProfilerHook(1) + runner = _build_demo_runner() + + assert not mock_memory_usage.called + assert not mock_swap_memory.called + assert not mock_memory_usage.called + + hook.after_iter(runner) + + assert mock_memory_usage.called + assert mock_swap_memory.called + assert mock_memory_usage.called + + _test_memory_profiler_hook() diff --git a/tests/test_utils/test_layer_decay_optimizer_constructor.py b/tests/test_utils/test_layer_decay_optimizer_constructor.py new file mode 100644 index 0000000..674f665 --- /dev/null +++ b/tests/test_utils/test_layer_decay_optimizer_constructor.py @@ -0,0 +1,164 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import torch +import torch.nn as nn +from mmcv.cnn import ConvModule + +from mmdet.core.optimizers import LearningRateDecayOptimizerConstructor + +base_lr = 1 +decay_rate = 2 +base_wd = 0.05 +weight_decay = 0.05 + +expected_stage_wise_lr_wd_convnext = [{ + 'weight_decay': 0.0, + 'lr_scale': 128 +}, { + 'weight_decay': 0.0, + 'lr_scale': 1 +}, { + 'weight_decay': 0.05, + 'lr_scale': 64 +}, { + 'weight_decay': 0.0, + 'lr_scale': 64 +}, { + 'weight_decay': 0.05, + 'lr_scale': 32 +}, { + 'weight_decay': 0.0, + 'lr_scale': 32 +}, { + 'weight_decay': 0.05, + 'lr_scale': 16 +}, { + 'weight_decay': 0.0, + 'lr_scale': 16 +}, { + 'weight_decay': 0.05, + 'lr_scale': 8 +}, { + 'weight_decay': 0.0, + 'lr_scale': 8 +}, { + 'weight_decay': 0.05, + 'lr_scale': 128 +}, { + 'weight_decay': 0.05, + 'lr_scale': 1 +}] + +expected_layer_wise_lr_wd_convnext = [{ + 'weight_decay': 0.0, + 'lr_scale': 128 +}, { + 'weight_decay': 0.0, + 'lr_scale': 1 +}, { + 'weight_decay': 0.05, + 'lr_scale': 64 +}, { + 'weight_decay': 0.0, + 'lr_scale': 64 +}, { + 'weight_decay': 0.05, + 'lr_scale': 32 +}, { + 'weight_decay': 0.0, + 'lr_scale': 32 +}, { + 'weight_decay': 0.05, + 'lr_scale': 16 +}, { + 'weight_decay': 0.0, + 'lr_scale': 16 +}, { + 'weight_decay': 0.05, + 'lr_scale': 2 +}, { + 'weight_decay': 0.0, + 'lr_scale': 2 +}, { + 'weight_decay': 0.05, + 'lr_scale': 128 +}, { + 'weight_decay': 0.05, + 'lr_scale': 1 +}] + + +class ToyConvNeXt(nn.Module): + + def __init__(self): + super().__init__() + self.stages = nn.ModuleList() + for i in range(4): + stage = nn.Sequential(ConvModule(3, 4, kernel_size=1, bias=True)) + self.stages.append(stage) + self.norm0 = nn.BatchNorm2d(2) + + # add some variables to meet unit test coverate rate + self.cls_token = nn.Parameter(torch.ones(1)) + self.mask_token = nn.Parameter(torch.ones(1)) + self.pos_embed = nn.Parameter(torch.ones(1)) + self.stem_norm = nn.Parameter(torch.ones(1)) + self.downsample_norm0 = nn.BatchNorm2d(2) + self.downsample_norm1 = nn.BatchNorm2d(2) + self.downsample_norm2 = nn.BatchNorm2d(2) + self.lin = nn.Parameter(torch.ones(1)) + self.lin.requires_grad = False + self.downsample_layers = nn.ModuleList() + for _ in range(4): + stage = nn.Sequential(nn.Conv2d(3, 4, kernel_size=1, bias=True)) + self.downsample_layers.append(stage) + + +class ToyDetector(nn.Module): + + def __init__(self, backbone): + super().__init__() + self.backbone = backbone + self.head = nn.Conv2d(2, 2, kernel_size=1, groups=2) + + +class PseudoDataParallel(nn.Module): + + def __init__(self, model): + super().__init__() + self.module = model + + +def check_optimizer_lr_wd(optimizer, gt_lr_wd): + assert isinstance(optimizer, torch.optim.AdamW) + assert optimizer.defaults['lr'] == base_lr + assert optimizer.defaults['weight_decay'] == base_wd + param_groups = optimizer.param_groups + print(param_groups) + assert len(param_groups) == len(gt_lr_wd) + for i, param_dict in enumerate(param_groups): + assert param_dict['weight_decay'] == gt_lr_wd[i]['weight_decay'] + assert param_dict['lr_scale'] == gt_lr_wd[i]['lr_scale'] + assert param_dict['lr_scale'] == param_dict['lr'] + + +def test_learning_rate_decay_optimizer_constructor(): + + # Test lr wd for ConvNeXT + backbone = ToyConvNeXt() + model = PseudoDataParallel(ToyDetector(backbone)) + optimizer_cfg = dict( + type='AdamW', lr=base_lr, betas=(0.9, 0.999), weight_decay=0.05) + # stagewise decay + stagewise_paramwise_cfg = dict( + decay_rate=decay_rate, decay_type='stage_wise', num_layers=6) + optim_constructor = LearningRateDecayOptimizerConstructor( + optimizer_cfg, stagewise_paramwise_cfg) + optimizer = optim_constructor(model) + check_optimizer_lr_wd(optimizer, expected_stage_wise_lr_wd_convnext) + # layerwise decay + layerwise_paramwise_cfg = dict( + decay_rate=decay_rate, decay_type='layer_wise', num_layers=6) + optim_constructor = LearningRateDecayOptimizerConstructor( + optimizer_cfg, layerwise_paramwise_cfg) + optimizer = optim_constructor(model) + check_optimizer_lr_wd(optimizer, expected_layer_wise_lr_wd_convnext) diff --git a/tests/test_utils/test_logger.py b/tests/test_utils/test_logger.py new file mode 100644 index 0000000..900d6b6 --- /dev/null +++ b/tests/test_utils/test_logger.py @@ -0,0 +1,47 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import pytest + +from mmdet.utils import get_caller_name, log_img_scale + + +def callee_func(): + caller_name = get_caller_name() + return caller_name + + +class CallerClassForTest: + + def __init__(self): + self.caller_name = callee_func() + + +def test_get_caller_name(): + # test the case that caller is a function + caller_name = callee_func() + assert caller_name == 'test_get_caller_name' + + # test the case that caller is a method in a class + caller_class = CallerClassForTest() + assert caller_class.caller_name == 'CallerClassForTest.__init__' + + +def test_log_img_scale(): + img_scale = (800, 1333) + done_logging = log_img_scale(img_scale) + assert done_logging + + img_scale = (1333, 800) + done_logging = log_img_scale(img_scale, shape_order='wh') + assert done_logging + + with pytest.raises(ValueError): + img_scale = (1333, 800) + done_logging = log_img_scale(img_scale, shape_order='xywh') + + img_scale = (640, 640) + done_logging = log_img_scale(img_scale, skip_square=False) + assert done_logging + + img_scale = (640, 640) + done_logging = log_img_scale(img_scale, skip_square=True) + assert not done_logging diff --git a/tests/test_utils/test_masks.py b/tests/test_utils/test_masks.py new file mode 100644 index 0000000..226ca61 --- /dev/null +++ b/tests/test_utils/test_masks.py @@ -0,0 +1,713 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import numpy as np +import pytest +import torch + +from mmdet.core import BitmapMasks, PolygonMasks, mask2bbox + + +def dummy_raw_bitmap_masks(size): + """ + Args: + size (tuple): expected shape of dummy masks, (H, W) or (N, H, W) + + Return: + ndarray: dummy mask + """ + return np.random.randint(0, 2, size, dtype=np.uint8) + + +def dummy_raw_polygon_masks(size): + """ + Args: + size (tuple): expected shape of dummy masks, (N, H, W) + + Return: + list[list[ndarray]]: dummy mask + """ + num_obj, height, width = size + polygons = [] + for _ in range(num_obj): + num_points = np.random.randint(5) * 2 + 6 + polygons.append([np.random.uniform(0, min(height, width), num_points)]) + return polygons + + +def dummy_bboxes(num, max_height, max_width): + x1y1 = np.random.randint(0, min(max_height // 2, max_width // 2), (num, 2)) + wh = np.random.randint(0, min(max_height // 2, max_width // 2), (num, 2)) + x2y2 = x1y1 + wh + return np.concatenate([x1y1, x2y2], axis=1).squeeze().astype(np.float32) + + +def test_bitmap_mask_init(): + # init with empty ndarray masks + raw_masks = np.empty((0, 28, 28), dtype=np.uint8) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + assert len(bitmap_masks) == 0 + assert bitmap_masks.height == 28 + assert bitmap_masks.width == 28 + + # init with empty list masks + raw_masks = [] + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + assert len(bitmap_masks) == 0 + assert bitmap_masks.height == 28 + assert bitmap_masks.width == 28 + + # init with ndarray masks contain 3 instances + raw_masks = dummy_raw_bitmap_masks((3, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + assert len(bitmap_masks) == 3 + assert bitmap_masks.height == 28 + assert bitmap_masks.width == 28 + + # init with list masks contain 3 instances + raw_masks = [dummy_raw_bitmap_masks((28, 28)) for _ in range(3)] + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + assert len(bitmap_masks) == 3 + assert bitmap_masks.height == 28 + assert bitmap_masks.width == 28 + + # init with raw masks of unsupported type + with pytest.raises(AssertionError): + raw_masks = [[dummy_raw_bitmap_masks((28, 28))]] + BitmapMasks(raw_masks, 28, 28) + + +def test_bitmap_mask_rescale(): + # rescale with empty bitmap masks + raw_masks = dummy_raw_bitmap_masks((0, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + rescaled_masks = bitmap_masks.rescale((56, 72)) + assert len(rescaled_masks) == 0 + assert rescaled_masks.height == 56 + assert rescaled_masks.width == 56 + + # rescale with bitmap masks contain 1 instances + raw_masks = np.array([[[1, 0, 0, 0], [0, 1, 0, 1]]]) + bitmap_masks = BitmapMasks(raw_masks, 2, 4) + rescaled_masks = bitmap_masks.rescale((8, 8)) + assert len(rescaled_masks) == 1 + assert rescaled_masks.height == 4 + assert rescaled_masks.width == 8 + truth = np.array([[[1, 1, 0, 0, 0, 0, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0], + [0, 0, 1, 1, 0, 0, 1, 1], [0, 0, 1, 1, 0, 0, 1, 1]]]) + assert (rescaled_masks.masks == truth).all() + + +def test_bitmap_mask_resize(): + # resize with empty bitmap masks + raw_masks = dummy_raw_bitmap_masks((0, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + resized_masks = bitmap_masks.resize((56, 72)) + assert len(resized_masks) == 0 + assert resized_masks.height == 56 + assert resized_masks.width == 72 + + # resize with bitmap masks contain 1 instances + raw_masks = np.diag(np.ones(4, dtype=np.uint8))[np.newaxis, ...] + bitmap_masks = BitmapMasks(raw_masks, 4, 4) + resized_masks = bitmap_masks.resize((8, 8)) + assert len(resized_masks) == 1 + assert resized_masks.height == 8 + assert resized_masks.width == 8 + truth = np.array([[[1, 1, 0, 0, 0, 0, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0], + [0, 0, 1, 1, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0, 0], + [0, 0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 0, 1, 1, 0, 0], + [0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0, 1, 1]]]) + assert (resized_masks.masks == truth).all() + + # resize to non-square + raw_masks = np.diag(np.ones(4, dtype=np.uint8))[np.newaxis, ...] + bitmap_masks = BitmapMasks(raw_masks, 4, 4) + resized_masks = bitmap_masks.resize((4, 8)) + assert len(resized_masks) == 1 + assert resized_masks.height == 4 + assert resized_masks.width == 8 + truth = np.array([[[1, 1, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0, 0], + [0, 0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0, 1, 1]]]) + assert (resized_masks.masks == truth).all() + + +def test_bitmap_mask_get_bboxes(): + # resize with empty bitmap masks + raw_masks = dummy_raw_bitmap_masks((0, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + bboxes = bitmap_masks.get_bboxes() + assert len(bboxes) == 0 + + # resize with bitmap masks contain 1 instances + raw_masks = np.array([[[0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 1, 0, 0, 0, 0], + [0, 0, 1, 1, 0, 0, 0, 0], [0, 0, 1, 1, 1, 0, 0, 0], + [0, 0, 1, 1, 1, 1, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, + 0]]]) + bitmap_masks = BitmapMasks(raw_masks, 8, 8) + bboxes = bitmap_masks.get_bboxes() + assert len(bboxes) == 1 + truth = np.array([[1, 1, 6, 6]]) + assert (bboxes == truth).all() + + # resize to non-square + raw_masks = np.array([[[1, 1, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, + 0]]]) + bitmap_masks = BitmapMasks(raw_masks, 4, 8) + bboxes = bitmap_masks.get_bboxes() + truth = np.array([[0, 0, 6, 3]]) + assert (bboxes == truth).all() + + +def test_bitmap_mask_flip(): + # flip with empty bitmap masks + raw_masks = dummy_raw_bitmap_masks((0, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + flipped_masks = bitmap_masks.flip(flip_direction='horizontal') + assert len(flipped_masks) == 0 + assert flipped_masks.height == 28 + assert flipped_masks.width == 28 + + # horizontally flip with bitmap masks contain 3 instances + raw_masks = dummy_raw_bitmap_masks((3, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + flipped_masks = bitmap_masks.flip(flip_direction='horizontal') + flipped_flipped_masks = flipped_masks.flip(flip_direction='horizontal') + assert flipped_masks.masks.shape == (3, 28, 28) + assert (bitmap_masks.masks == flipped_flipped_masks.masks).all() + assert (flipped_masks.masks == raw_masks[:, :, ::-1]).all() + + # vertically flip with bitmap masks contain 3 instances + raw_masks = dummy_raw_bitmap_masks((3, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + flipped_masks = bitmap_masks.flip(flip_direction='vertical') + flipped_flipped_masks = flipped_masks.flip(flip_direction='vertical') + assert len(flipped_masks) == 3 + assert flipped_masks.height == 28 + assert flipped_masks.width == 28 + assert (bitmap_masks.masks == flipped_flipped_masks.masks).all() + assert (flipped_masks.masks == raw_masks[:, ::-1, :]).all() + + # diagonal flip with bitmap masks contain 3 instances + raw_masks = dummy_raw_bitmap_masks((3, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + flipped_masks = bitmap_masks.flip(flip_direction='diagonal') + flipped_flipped_masks = flipped_masks.flip(flip_direction='diagonal') + assert len(flipped_masks) == 3 + assert flipped_masks.height == 28 + assert flipped_masks.width == 28 + assert (bitmap_masks.masks == flipped_flipped_masks.masks).all() + assert (flipped_masks.masks == raw_masks[:, ::-1, ::-1]).all() + + +def test_bitmap_mask_pad(): + # pad with empty bitmap masks + raw_masks = dummy_raw_bitmap_masks((0, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + padded_masks = bitmap_masks.pad((56, 56)) + assert len(padded_masks) == 0 + assert padded_masks.height == 56 + assert padded_masks.width == 56 + + # pad with bitmap masks contain 3 instances + raw_masks = dummy_raw_bitmap_masks((3, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + padded_masks = bitmap_masks.pad((56, 56)) + assert len(padded_masks) == 3 + assert padded_masks.height == 56 + assert padded_masks.width == 56 + assert (padded_masks.masks[:, 28:, 28:] == 0).all() + + +def test_bitmap_mask_crop(): + # crop with empty bitmap masks + dummy_bbox = np.array([0, 10, 10, 27], dtype=np.int) + raw_masks = dummy_raw_bitmap_masks((0, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + cropped_masks = bitmap_masks.crop(dummy_bbox) + assert len(cropped_masks) == 0 + assert cropped_masks.height == 17 + assert cropped_masks.width == 10 + + # crop with bitmap masks contain 3 instances + raw_masks = dummy_raw_bitmap_masks((3, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + cropped_masks = bitmap_masks.crop(dummy_bbox) + assert len(cropped_masks) == 3 + assert cropped_masks.height == 17 + assert cropped_masks.width == 10 + x1, y1, x2, y2 = dummy_bbox + assert (cropped_masks.masks == raw_masks[:, y1:y2, x1:x2]).all() + + # crop with invalid bbox + with pytest.raises(AssertionError): + dummy_bbox = dummy_bboxes(2, 28, 28) + bitmap_masks.crop(dummy_bbox) + + +def test_bitmap_mask_crop_and_resize(): + dummy_bbox = dummy_bboxes(5, 28, 28) + inds = np.random.randint(0, 3, (5, )) + + # crop and resize with empty bitmap masks + raw_masks = dummy_raw_bitmap_masks((0, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + cropped_resized_masks = bitmap_masks.crop_and_resize( + dummy_bbox, (56, 56), inds) + assert len(cropped_resized_masks) == 0 + assert cropped_resized_masks.height == 56 + assert cropped_resized_masks.width == 56 + + # crop and resize with bitmap masks contain 3 instances + raw_masks = dummy_raw_bitmap_masks((3, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + cropped_resized_masks = bitmap_masks.crop_and_resize( + dummy_bbox, (56, 56), inds) + assert len(cropped_resized_masks) == 5 + assert cropped_resized_masks.height == 56 + assert cropped_resized_masks.width == 56 + + +def test_bitmap_mask_expand(): + # expand with empty bitmap masks + raw_masks = dummy_raw_bitmap_masks((0, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + expanded_masks = bitmap_masks.expand(56, 56, 12, 14) + assert len(expanded_masks) == 0 + assert expanded_masks.height == 56 + assert expanded_masks.width == 56 + + # expand with bitmap masks contain 3 instances + raw_masks = dummy_raw_bitmap_masks((3, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + expanded_masks = bitmap_masks.expand(56, 56, 12, 14) + assert len(expanded_masks) == 3 + assert expanded_masks.height == 56 + assert expanded_masks.width == 56 + assert (expanded_masks.masks[:, :12, :14] == 0).all() + assert (expanded_masks.masks[:, 12 + 28:, 14 + 28:] == 0).all() + + +def test_bitmap_mask_area(): + # area of empty bitmap mask + raw_masks = dummy_raw_bitmap_masks((0, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + assert bitmap_masks.areas.sum() == 0 + + # area of bitmap masks contain 3 instances + raw_masks = dummy_raw_bitmap_masks((3, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + areas = bitmap_masks.areas + assert len(areas) == 3 + assert (areas == raw_masks.sum((1, 2))).all() + + +def test_bitmap_mask_to_ndarray(): + # empty bitmap masks to ndarray + raw_masks = dummy_raw_bitmap_masks((0, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + ndarray_masks = bitmap_masks.to_ndarray() + assert isinstance(ndarray_masks, np.ndarray) + assert ndarray_masks.shape == (0, 28, 28) + + # bitmap masks contain 3 instances to ndarray + raw_masks = dummy_raw_bitmap_masks((3, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + ndarray_masks = bitmap_masks.to_ndarray() + assert isinstance(ndarray_masks, np.ndarray) + assert ndarray_masks.shape == (3, 28, 28) + assert (ndarray_masks == raw_masks).all() + + +def test_bitmap_mask_to_tensor(): + # empty bitmap masks to tensor + raw_masks = dummy_raw_bitmap_masks((0, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + tensor_masks = bitmap_masks.to_tensor(dtype=torch.uint8, device='cpu') + assert isinstance(tensor_masks, torch.Tensor) + assert tensor_masks.shape == (0, 28, 28) + + # bitmap masks contain 3 instances to tensor + raw_masks = dummy_raw_bitmap_masks((3, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + tensor_masks = bitmap_masks.to_tensor(dtype=torch.uint8, device='cpu') + assert isinstance(tensor_masks, torch.Tensor) + assert tensor_masks.shape == (3, 28, 28) + assert (tensor_masks.numpy() == raw_masks).all() + + +def test_bitmap_mask_index(): + raw_masks = dummy_raw_bitmap_masks((3, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + assert (bitmap_masks[0].masks == raw_masks[0]).all() + assert (bitmap_masks[range(2)].masks == raw_masks[range(2)]).all() + + +def test_bitmap_mask_iter(): + raw_masks = dummy_raw_bitmap_masks((3, 28, 28)) + bitmap_masks = BitmapMasks(raw_masks, 28, 28) + for i, bitmap_mask in enumerate(bitmap_masks): + assert bitmap_mask.shape == (28, 28) + assert (bitmap_mask == raw_masks[i]).all() + + +def test_polygon_mask_init(): + # init with empty masks + raw_masks = [] + polygon_masks = BitmapMasks(raw_masks, 28, 28) + assert len(polygon_masks) == 0 + assert polygon_masks.height == 28 + assert polygon_masks.width == 28 + + # init with masks contain 3 instances + raw_masks = dummy_raw_polygon_masks((3, 28, 28)) + polygon_masks = PolygonMasks(raw_masks, 28, 28) + assert isinstance(polygon_masks.masks, list) + assert isinstance(polygon_masks.masks[0], list) + assert isinstance(polygon_masks.masks[0][0], np.ndarray) + assert len(polygon_masks) == 3 + assert polygon_masks.height == 28 + assert polygon_masks.width == 28 + assert polygon_masks.to_ndarray().shape == (3, 28, 28) + + # init with raw masks of unsupported type + with pytest.raises(AssertionError): + raw_masks = [[[]]] + PolygonMasks(raw_masks, 28, 28) + + raw_masks = [dummy_raw_polygon_masks((3, 28, 28))] + PolygonMasks(raw_masks, 28, 28) + + +def test_polygon_mask_rescale(): + # rescale with empty polygon masks + raw_masks = dummy_raw_polygon_masks((0, 28, 28)) + polygon_masks = PolygonMasks(raw_masks, 28, 28) + rescaled_masks = polygon_masks.rescale((56, 72)) + assert len(rescaled_masks) == 0 + assert rescaled_masks.height == 56 + assert rescaled_masks.width == 56 + assert rescaled_masks.to_ndarray().shape == (0, 56, 56) + + # rescale with polygon masks contain 3 instances + raw_masks = [[np.array([1, 1, 3, 1, 4, 3, 2, 4, 1, 3], dtype=np.float)]] + polygon_masks = PolygonMasks(raw_masks, 5, 5) + rescaled_masks = polygon_masks.rescale((12, 10)) + assert len(rescaled_masks) == 1 + assert rescaled_masks.height == 10 + assert rescaled_masks.width == 10 + assert rescaled_masks.to_ndarray().shape == (1, 10, 10) + truth = np.array( + [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 1, 1, 1, 1, 0, 0, 0, 0], [0, 0, 1, 1, 1, 1, 1, 0, 0, 0], + [0, 0, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 1, 1, 1, 1, 1, 1, 0, 0], + [0, 0, 0, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], + np.uint8) + assert (rescaled_masks.to_ndarray() == truth).all() + + +def test_polygon_mask_resize(): + # resize with empty polygon masks + raw_masks = dummy_raw_polygon_masks((0, 28, 28)) + polygon_masks = PolygonMasks(raw_masks, 28, 28) + resized_masks = polygon_masks.resize((56, 72)) + assert len(resized_masks) == 0 + assert resized_masks.height == 56 + assert resized_masks.width == 72 + assert resized_masks.to_ndarray().shape == (0, 56, 72) + assert len(resized_masks.get_bboxes()) == 0 + + # resize with polygon masks contain 1 instance 1 part + raw_masks1 = [[np.array([1, 1, 3, 1, 4, 3, 2, 4, 1, 3], dtype=np.float)]] + polygon_masks1 = PolygonMasks(raw_masks1, 5, 5) + resized_masks1 = polygon_masks1.resize((10, 10)) + assert len(resized_masks1) == 1 + assert resized_masks1.height == 10 + assert resized_masks1.width == 10 + assert resized_masks1.to_ndarray().shape == (1, 10, 10) + truth1 = np.array( + [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 1, 1, 1, 1, 0, 0, 0, 0], [0, 0, 1, 1, 1, 1, 1, 0, 0, 0], + [0, 0, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 1, 1, 1, 1, 1, 1, 0, 0], + [0, 0, 0, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], + np.uint8) + assert (resized_masks1.to_ndarray() == truth1).all() + bboxes = resized_masks1.get_bboxes() + bbox_truth = np.array([[2, 2, 8, 8]]) + assert (bboxes == bbox_truth).all() + + # resize with polygon masks contain 1 instance 2 part + raw_masks2 = [[ + np.array([0., 0., 1., 0., 1., 1.]), + np.array([1., 1., 2., 1., 2., 2., 1., 2.]) + ]] + polygon_masks2 = PolygonMasks(raw_masks2, 3, 3) + resized_masks2 = polygon_masks2.resize((6, 6)) + assert len(resized_masks2) == 1 + assert resized_masks2.height == 6 + assert resized_masks2.width == 6 + assert resized_masks2.to_ndarray().shape == (1, 6, 6) + truth2 = np.array( + [[0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0], + [0, 0, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]], np.uint8) + assert (resized_masks2.to_ndarray() == truth2).all() + + # resize with polygon masks contain 2 instances + raw_masks3 = [raw_masks1[0], raw_masks2[0]] + polygon_masks3 = PolygonMasks(raw_masks3, 5, 5) + resized_masks3 = polygon_masks3.resize((10, 10)) + assert len(resized_masks3) == 2 + assert resized_masks3.height == 10 + assert resized_masks3.width == 10 + assert resized_masks3.to_ndarray().shape == (2, 10, 10) + truth3 = np.stack([truth1, np.pad(truth2, ((0, 4), (0, 4)), 'constant')]) + assert (resized_masks3.to_ndarray() == truth3).all() + + # resize to non-square + raw_masks4 = [[np.array([1, 1, 3, 1, 4, 3, 2, 4, 1, 3], dtype=np.float)]] + polygon_masks4 = PolygonMasks(raw_masks4, 5, 5) + resized_masks4 = polygon_masks4.resize((5, 10)) + assert len(resized_masks4) == 1 + assert resized_masks4.height == 5 + assert resized_masks4.width == 10 + assert resized_masks4.to_ndarray().shape == (1, 5, 10) + truth4 = np.array( + [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 1, 1, 1, 0, 0, 0], + [0, 0, 1, 1, 1, 1, 1, 1, 0, 0], [0, 0, 0, 1, 1, 1, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], np.uint8) + assert (resized_masks4.to_ndarray() == truth4).all() + + +def test_polygon_mask_flip(): + # flip with empty polygon masks + raw_masks = dummy_raw_polygon_masks((0, 28, 28)) + polygon_masks = PolygonMasks(raw_masks, 28, 28) + flipped_masks = polygon_masks.flip(flip_direction='horizontal') + assert len(flipped_masks) == 0 + assert flipped_masks.height == 28 + assert flipped_masks.width == 28 + assert flipped_masks.to_ndarray().shape == (0, 28, 28) + + # TODO: fixed flip correctness checking after v2.0_coord is merged + # horizontally flip with polygon masks contain 3 instances + raw_masks = dummy_raw_polygon_masks((3, 28, 28)) + polygon_masks = PolygonMasks(raw_masks, 28, 28) + flipped_masks = polygon_masks.flip(flip_direction='horizontal') + flipped_flipped_masks = flipped_masks.flip(flip_direction='horizontal') + assert len(flipped_masks) == 3 + assert flipped_masks.height == 28 + assert flipped_masks.width == 28 + assert flipped_masks.to_ndarray().shape == (3, 28, 28) + assert (polygon_masks.to_ndarray() == flipped_flipped_masks.to_ndarray() + ).all() + + # vertically flip with polygon masks contain 3 instances + raw_masks = dummy_raw_polygon_masks((3, 28, 28)) + polygon_masks = PolygonMasks(raw_masks, 28, 28) + flipped_masks = polygon_masks.flip(flip_direction='vertical') + flipped_flipped_masks = flipped_masks.flip(flip_direction='vertical') + assert len(flipped_masks) == 3 + assert flipped_masks.height == 28 + assert flipped_masks.width == 28 + assert flipped_masks.to_ndarray().shape == (3, 28, 28) + assert (polygon_masks.to_ndarray() == flipped_flipped_masks.to_ndarray() + ).all() + + # diagonal flip with polygon masks contain 3 instances + raw_masks = dummy_raw_polygon_masks((3, 28, 28)) + polygon_masks = PolygonMasks(raw_masks, 28, 28) + flipped_masks = polygon_masks.flip(flip_direction='diagonal') + flipped_flipped_masks = flipped_masks.flip(flip_direction='diagonal') + assert len(flipped_masks) == 3 + assert flipped_masks.height == 28 + assert flipped_masks.width == 28 + assert flipped_masks.to_ndarray().shape == (3, 28, 28) + assert (polygon_masks.to_ndarray() == flipped_flipped_masks.to_ndarray() + ).all() + + +def test_polygon_mask_crop(): + dummy_bbox = np.array([0, 10, 10, 27], dtype=np.int) + # crop with empty polygon masks + raw_masks = dummy_raw_polygon_masks((0, 28, 28)) + polygon_masks = PolygonMasks(raw_masks, 28, 28) + cropped_masks = polygon_masks.crop(dummy_bbox) + assert len(cropped_masks) == 0 + assert cropped_masks.height == 17 + assert cropped_masks.width == 10 + assert cropped_masks.to_ndarray().shape == (0, 17, 10) + + # crop with polygon masks contain 1 instances + raw_masks = [[np.array([1., 3., 5., 1., 5., 6., 1, 6])]] + polygon_masks = PolygonMasks(raw_masks, 7, 7) + bbox = np.array([0, 0, 3, 4]) + cropped_masks = polygon_masks.crop(bbox) + assert len(cropped_masks) == 1 + assert cropped_masks.height == 4 + assert cropped_masks.width == 3 + assert cropped_masks.to_ndarray().shape == (1, 4, 3) + truth = np.array([[0, 0, 0], [0, 0, 0], [0, 0, 1], [0, 1, 1]]) + assert (cropped_masks.to_ndarray() == truth).all() + + # crop with invalid bbox + with pytest.raises(AssertionError): + dummy_bbox = dummy_bboxes(2, 28, 28) + polygon_masks.crop(dummy_bbox) + + +def test_polygon_mask_pad(): + # pad with empty polygon masks + raw_masks = dummy_raw_polygon_masks((0, 28, 28)) + polygon_masks = PolygonMasks(raw_masks, 28, 28) + padded_masks = polygon_masks.pad((56, 56)) + assert len(padded_masks) == 0 + assert padded_masks.height == 56 + assert padded_masks.width == 56 + assert padded_masks.to_ndarray().shape == (0, 56, 56) + + # pad with polygon masks contain 3 instances + raw_masks = dummy_raw_polygon_masks((3, 28, 28)) + polygon_masks = PolygonMasks(raw_masks, 28, 28) + padded_masks = polygon_masks.pad((56, 56)) + assert len(padded_masks) == 3 + assert padded_masks.height == 56 + assert padded_masks.width == 56 + assert padded_masks.to_ndarray().shape == (3, 56, 56) + assert (padded_masks.to_ndarray()[:, 28:, 28:] == 0).all() + + +def test_polygon_mask_expand(): + with pytest.raises(NotImplementedError): + raw_masks = dummy_raw_polygon_masks((0, 28, 28)) + polygon_masks = PolygonMasks(raw_masks, 28, 28) + polygon_masks.expand(56, 56, 10, 17) + + +def test_polygon_mask_crop_and_resize(): + dummy_bbox = dummy_bboxes(5, 28, 28) + inds = np.random.randint(0, 3, (5, )) + + # crop and resize with empty polygon masks + raw_masks = dummy_raw_polygon_masks((0, 28, 28)) + polygon_masks = PolygonMasks(raw_masks, 28, 28) + cropped_resized_masks = polygon_masks.crop_and_resize( + dummy_bbox, (56, 56), inds) + assert len(cropped_resized_masks) == 0 + assert cropped_resized_masks.height == 56 + assert cropped_resized_masks.width == 56 + assert cropped_resized_masks.to_ndarray().shape == (0, 56, 56) + + # crop and resize with polygon masks contain 3 instances + raw_masks = dummy_raw_polygon_masks((3, 28, 28)) + polygon_masks = PolygonMasks(raw_masks, 28, 28) + cropped_resized_masks = polygon_masks.crop_and_resize( + dummy_bbox, (56, 56), inds) + assert len(cropped_resized_masks) == 5 + assert cropped_resized_masks.height == 56 + assert cropped_resized_masks.width == 56 + assert cropped_resized_masks.to_ndarray().shape == (5, 56, 56) + + +def test_polygon_mask_area(): + # area of empty polygon masks + raw_masks = dummy_raw_polygon_masks((0, 28, 28)) + polygon_masks = PolygonMasks(raw_masks, 28, 28) + assert polygon_masks.areas.sum() == 0 + + # area of polygon masks contain 1 instance + # here we hack a case that the gap between the area of bitmap and polygon + # is minor + raw_masks = [[np.array([1, 1, 5, 1, 3, 4])]] + polygon_masks = PolygonMasks(raw_masks, 6, 6) + polygon_area = polygon_masks.areas + bitmap_area = polygon_masks.to_bitmap().areas + assert len(polygon_area) == 1 + assert np.isclose(polygon_area, bitmap_area).all() + + +def test_polygon_mask_to_bitmap(): + # polygon masks contain 3 instances to bitmap + raw_masks = dummy_raw_polygon_masks((3, 28, 28)) + polygon_masks = PolygonMasks(raw_masks, 28, 28) + bitmap_masks = polygon_masks.to_bitmap() + assert (polygon_masks.to_ndarray() == bitmap_masks.to_ndarray()).all() + + +def test_polygon_mask_to_ndarray(): + # empty polygon masks to ndarray + raw_masks = dummy_raw_polygon_masks((0, 28, 28)) + polygon_masks = PolygonMasks(raw_masks, 28, 28) + ndarray_masks = polygon_masks.to_ndarray() + assert isinstance(ndarray_masks, np.ndarray) + assert ndarray_masks.shape == (0, 28, 28) + + # polygon masks contain 3 instances to ndarray + raw_masks = dummy_raw_polygon_masks((3, 28, 28)) + polygon_masks = PolygonMasks(raw_masks, 28, 28) + ndarray_masks = polygon_masks.to_ndarray() + assert isinstance(ndarray_masks, np.ndarray) + assert ndarray_masks.shape == (3, 28, 28) + + +def test_polygon_to_tensor(): + # empty polygon masks to tensor + raw_masks = dummy_raw_polygon_masks((0, 28, 28)) + polygon_masks = PolygonMasks(raw_masks, 28, 28) + tensor_masks = polygon_masks.to_tensor(dtype=torch.uint8, device='cpu') + assert isinstance(tensor_masks, torch.Tensor) + assert tensor_masks.shape == (0, 28, 28) + + # polygon masks contain 3 instances to tensor + raw_masks = dummy_raw_polygon_masks((3, 28, 28)) + polygon_masks = PolygonMasks(raw_masks, 28, 28) + tensor_masks = polygon_masks.to_tensor(dtype=torch.uint8, device='cpu') + assert isinstance(tensor_masks, torch.Tensor) + assert tensor_masks.shape == (3, 28, 28) + assert (tensor_masks.numpy() == polygon_masks.to_ndarray()).all() + + +def test_polygon_mask_index(): + raw_masks = dummy_raw_polygon_masks((3, 28, 28)) + polygon_masks = PolygonMasks(raw_masks, 28, 28) + # index by integer + polygon_masks[0] + # index by list + polygon_masks[[0, 1]] + # index by ndarray + polygon_masks[np.asarray([0, 1])] + with pytest.raises(ValueError): + # invalid index + polygon_masks[torch.Tensor([1, 2])] + + +def test_polygon_mask_iter(): + raw_masks = dummy_raw_polygon_masks((3, 28, 28)) + polygon_masks = PolygonMasks(raw_masks, 28, 28) + for i, polygon_mask in enumerate(polygon_masks): + assert np.equal(polygon_mask, raw_masks[i]).all() + + +def test_mask2bbox(): + # no instance + masks = torch.zeros((1, 20, 15), dtype=torch.bool) + bboxes_empty_gt = torch.tensor([[0, 0, 0, 0]]).float() + bboxes = mask2bbox(masks) + assert torch.allclose(bboxes_empty_gt.float(), bboxes) + + # the entire mask is an instance + bboxes_full_gt = torch.tensor([[0, 0, 15, 20]]).float() + masks = torch.ones((1, 20, 15), dtype=torch.bool) + bboxes = mask2bbox(masks) + assert torch.allclose(bboxes_full_gt, bboxes) + + # a pentagon-shaped instance + bboxes_gt = torch.tensor([[2, 2, 7, 6]]).float() + masks = torch.zeros((1, 20, 15), dtype=torch.bool) + masks[0, 2, 4] = True + masks[0, 3, 3:6] = True + masks[0, 4, 2:7] = True + masks[0, 5, 2:7] = True + bboxes = mask2bbox(masks) + assert torch.allclose(bboxes_gt, bboxes) diff --git a/tests/test_utils/test_memory.py b/tests/test_utils/test_memory.py new file mode 100644 index 0000000..840601c --- /dev/null +++ b/tests/test_utils/test_memory.py @@ -0,0 +1,98 @@ +import numpy as np +import pytest +import torch + +from mmdet.utils import AvoidOOM +from mmdet.utils.memory import cast_tensor_type + + +def test_avoidoom(): + tensor = torch.from_numpy(np.random.random((20, 20))) + if torch.cuda.is_available(): + tensor = tensor.cuda() + # get default result + default_result = torch.mm(tensor, tensor.transpose(1, 0)) + + # when not occurred OOM error + AvoidCudaOOM = AvoidOOM() + result = AvoidCudaOOM.retry_if_cuda_oom(torch.mm)(tensor, + tensor.transpose( + 1, 0)) + assert default_result.device == result.device and \ + default_result.dtype == result.dtype and \ + torch.equal(default_result, result) + + # calculate with fp16 and convert back to source type + AvoidCudaOOM = AvoidOOM(test=True) + result = AvoidCudaOOM.retry_if_cuda_oom(torch.mm)(tensor, + tensor.transpose( + 1, 0)) + assert default_result.device == result.device and \ + default_result.dtype == result.dtype and \ + torch.allclose(default_result, result, 1e-3) + + # calculate on cpu and convert back to source device + AvoidCudaOOM = AvoidOOM(test=True) + result = AvoidCudaOOM.retry_if_cuda_oom(torch.mm)(tensor, + tensor.transpose( + 1, 0)) + assert result.dtype == default_result.dtype and \ + result.device == default_result.device and \ + torch.allclose(default_result, result) + + # do not calculate on cpu and the outputs will be same as input + AvoidCudaOOM = AvoidOOM(test=True, to_cpu=False) + result = AvoidCudaOOM.retry_if_cuda_oom(torch.mm)(tensor, + tensor.transpose( + 1, 0)) + assert result.dtype == default_result.dtype and \ + result.device == default_result.device + + else: + default_result = torch.mm(tensor, tensor.transpose(1, 0)) + AvoidCudaOOM = AvoidOOM() + result = AvoidCudaOOM.retry_if_cuda_oom(torch.mm)(tensor, + tensor.transpose( + 1, 0)) + assert default_result.device == result.device and \ + default_result.dtype == result.dtype and \ + torch.equal(default_result, result) + + +def test_cast_tensor_type(): + inputs = torch.rand(10) + if torch.cuda.is_available(): + inputs = inputs.cuda() + with pytest.raises(AssertionError): + cast_tensor_type(inputs, src_type=None, dst_type=None) + # input is a float + out = cast_tensor_type(10., dst_type=torch.half) + assert out == 10. and isinstance(out, float) + # convert Tensor to fp16 and re-convert to fp32 + fp16_out = cast_tensor_type(inputs, dst_type=torch.half) + assert fp16_out.dtype == torch.half + fp32_out = cast_tensor_type(fp16_out, dst_type=torch.float32) + assert fp32_out.dtype == torch.float32 + + # input is a list + list_input = [inputs, inputs] + list_outs = cast_tensor_type(list_input, dst_type=torch.half) + assert len(list_outs) == len(list_input) and \ + isinstance(list_outs, list) + for out in list_outs: + assert out.dtype == torch.half + # input is a dict + dict_input = {'test1': inputs, 'test2': inputs} + dict_outs = cast_tensor_type(dict_input, dst_type=torch.half) + assert len(dict_outs) == len(dict_input) and \ + isinstance(dict_outs, dict) + + # convert the input tensor to CPU and re-convert to GPU + if torch.cuda.is_available(): + cpu_device = torch.empty(0).device + gpu_device = inputs.device + cpu_out = cast_tensor_type(inputs, dst_type=cpu_device) + assert cpu_out.device == cpu_device + + gpu_out = cast_tensor_type(inputs, dst_type=gpu_device) + assert gpu_out.device == gpu_device diff --git a/tests/test_utils/test_misc.py b/tests/test_utils/test_misc.py new file mode 100644 index 0000000..80d9114 --- /dev/null +++ b/tests/test_utils/test_misc.py @@ -0,0 +1,204 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +import tempfile + +import numpy as np +import pytest +import torch + +from mmdet.core.bbox import distance2bbox +from mmdet.core.mask.structures import BitmapMasks, PolygonMasks +from mmdet.core.utils import (center_of_mass, filter_scores_and_topk, + flip_tensor, mask2ndarray, select_single_mlvl) +from mmdet.utils import find_latest_checkpoint + + +def dummy_raw_polygon_masks(size): + """ + Args: + size (tuple): expected shape of dummy masks, (N, H, W) + + Return: + list[list[ndarray]]: dummy mask + """ + num_obj, height, width = size + polygons = [] + for _ in range(num_obj): + num_points = np.random.randint(5) * 2 + 6 + polygons.append([np.random.uniform(0, min(height, width), num_points)]) + return polygons + + +def test_mask2ndarray(): + raw_masks = np.ones((3, 28, 28)) + bitmap_mask = BitmapMasks(raw_masks, 28, 28) + output_mask = mask2ndarray(bitmap_mask) + assert np.allclose(raw_masks, output_mask) + + raw_masks = dummy_raw_polygon_masks((3, 28, 28)) + polygon_masks = PolygonMasks(raw_masks, 28, 28) + output_mask = mask2ndarray(polygon_masks) + assert output_mask.shape == (3, 28, 28) + + raw_masks = np.ones((3, 28, 28)) + output_mask = mask2ndarray(raw_masks) + assert np.allclose(raw_masks, output_mask) + + raw_masks = torch.ones((3, 28, 28)) + output_mask = mask2ndarray(raw_masks) + assert np.allclose(raw_masks, output_mask) + + # test unsupported type + raw_masks = [] + with pytest.raises(TypeError): + output_mask = mask2ndarray(raw_masks) + + +def test_distance2bbox(): + point = torch.Tensor([[74., 61.], [-29., 106.], [138., 61.], [29., 170.]]) + + distance = torch.Tensor([[0., 0, 1., 1.], [1., 2., 10., 6.], + [22., -29., 138., 61.], [54., -29., 170., 61.]]) + expected_decode_bboxes = torch.Tensor([[74., 61., 75., 62.], + [0., 104., 0., 112.], + [100., 90., 100., 120.], + [0., 120., 100., 120.]]) + out_bbox = distance2bbox(point, distance, max_shape=(120, 100)) + assert expected_decode_bboxes.allclose(out_bbox) + out = distance2bbox(point, distance, max_shape=torch.Tensor((120, 100))) + assert expected_decode_bboxes.allclose(out) + + batch_point = point.unsqueeze(0).repeat(2, 1, 1) + batch_distance = distance.unsqueeze(0).repeat(2, 1, 1) + batch_out = distance2bbox( + batch_point, batch_distance, max_shape=(120, 100))[0] + assert out.allclose(batch_out) + batch_out = distance2bbox( + batch_point, batch_distance, max_shape=[(120, 100), (120, 100)])[0] + assert out.allclose(batch_out) + + batch_out = distance2bbox(point, batch_distance, max_shape=(120, 100))[0] + assert out.allclose(batch_out) + + # test max_shape is not equal to batch + with pytest.raises(AssertionError): + distance2bbox( + batch_point, + batch_distance, + max_shape=[(120, 100), (120, 100), (32, 32)]) + + rois = torch.zeros((0, 4)) + deltas = torch.zeros((0, 4)) + out = distance2bbox(rois, deltas, max_shape=(120, 100)) + assert rois.shape == out.shape + + rois = torch.zeros((2, 0, 4)) + deltas = torch.zeros((2, 0, 4)) + out = distance2bbox(rois, deltas, max_shape=(120, 100)) + assert rois.shape == out.shape + + +@pytest.mark.parametrize('mask', [ + torch.ones((28, 28)), + torch.zeros((28, 28)), + torch.rand(28, 28) > 0.5, + torch.tensor([[0, 0, 0, 0], [0, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 0]]) +]) +def test_center_of_mass(mask): + center_h, center_w = center_of_mass(mask) + if mask.shape[0] == 4: + assert center_h == 1.5 + assert center_w == 1.5 + assert isinstance(center_h, torch.Tensor) \ + and isinstance(center_w, torch.Tensor) + assert 0 <= center_h <= 28 \ + and 0 <= center_w <= 28 + + +def test_flip_tensor(): + img = np.random.random((1, 3, 10, 10)) + src_tensor = torch.from_numpy(img) + + # test flip_direction parameter error + with pytest.raises(AssertionError): + flip_tensor(src_tensor, 'flip') + + # test tensor dimension + with pytest.raises(AssertionError): + flip_tensor(src_tensor[0], 'vertical') + + hfilp_tensor = flip_tensor(src_tensor, 'horizontal') + expected_hflip_tensor = torch.from_numpy(img[..., ::-1, :].copy()) + expected_hflip_tensor.allclose(hfilp_tensor) + + vfilp_tensor = flip_tensor(src_tensor, 'vertical') + expected_vflip_tensor = torch.from_numpy(img[..., ::-1].copy()) + expected_vflip_tensor.allclose(vfilp_tensor) + + diag_filp_tensor = flip_tensor(src_tensor, 'diagonal') + expected_diag_filp_tensor = torch.from_numpy(img[..., ::-1, ::-1].copy()) + expected_diag_filp_tensor.allclose(diag_filp_tensor) + + +def test_select_single_mlvl(): + mlvl_tensors = [torch.rand(2, 1, 10, 10)] * 5 + mlvl_tensor_list = select_single_mlvl(mlvl_tensors, 1) + assert len(mlvl_tensor_list) == 5 and mlvl_tensor_list[0].ndim == 3 + + +def test_filter_scores_and_topk(): + score = torch.tensor([[0.1, 0.3, 0.2], [0.12, 0.7, 0.9], [0.02, 0.8, 0.08], + [0.4, 0.1, 0.08]]) + bbox_pred = torch.tensor([[0.2, 0.3], [0.4, 0.7], [0.1, 0.1], [0.5, 0.1]]) + score_thr = 0.15 + nms_pre = 4 + # test results type error + with pytest.raises(NotImplementedError): + filter_scores_and_topk(score, score_thr, nms_pre, (score, )) + + filtered_results = filter_scores_and_topk( + score, score_thr, nms_pre, results=dict(bbox_pred=bbox_pred)) + filtered_score, labels, keep_idxs, results = filtered_results + assert filtered_score.allclose(torch.tensor([0.9, 0.8, 0.7, 0.4])) + assert labels.allclose(torch.tensor([2, 1, 1, 0])) + assert keep_idxs.allclose(torch.tensor([1, 2, 1, 3])) + assert results['bbox_pred'].allclose( + torch.tensor([[0.4, 0.7], [0.1, 0.1], [0.4, 0.7], [0.5, 0.1]])) + + +def test_find_latest_checkpoint(): + with tempfile.TemporaryDirectory() as tmpdir: + path = tmpdir + latest = find_latest_checkpoint(path) + # There are no checkpoints in the path. + assert latest is None + + path = osp.join(tmpdir, 'none') + latest = find_latest_checkpoint(path) + # The path does not exist. + assert latest is None + + with tempfile.TemporaryDirectory() as tmpdir: + with open(osp.join(tmpdir, 'latest.pth'), 'w') as f: + f.write('latest') + path = tmpdir + latest = find_latest_checkpoint(path) + assert latest == osp.join(tmpdir, 'latest.pth') + + with tempfile.TemporaryDirectory() as tmpdir: + with open(osp.join(tmpdir, 'iter_4000.pth'), 'w') as f: + f.write('iter_4000') + with open(osp.join(tmpdir, 'iter_8000.pth'), 'w') as f: + f.write('iter_8000') + path = tmpdir + latest = find_latest_checkpoint(path) + assert latest == osp.join(tmpdir, 'iter_8000.pth') + + with tempfile.TemporaryDirectory() as tmpdir: + with open(osp.join(tmpdir, 'epoch_1.pth'), 'w') as f: + f.write('epoch_1') + with open(osp.join(tmpdir, 'epoch_2.pth'), 'w') as f: + f.write('epoch_2') + path = tmpdir + latest = find_latest_checkpoint(path) + assert latest == osp.join(tmpdir, 'epoch_2.pth') diff --git a/tests/test_utils/test_nms.py b/tests/test_utils/test_nms.py new file mode 100644 index 0000000..5fa92dc --- /dev/null +++ b/tests/test_utils/test_nms.py @@ -0,0 +1,75 @@ +import pytest +import torch + +from mmdet.core.post_processing import mask_matrix_nms + + +def _create_mask(N, h, w): + masks = torch.rand((N, h, w)) > 0.5 + labels = torch.rand(N) + scores = torch.rand(N) + return masks, labels, scores + + +def test_nms_input_errors(): + with pytest.raises(AssertionError): + mask_matrix_nms( + torch.rand((10, 28, 28)), torch.rand(11), torch.rand(11)) + with pytest.raises(AssertionError): + masks = torch.rand((10, 28, 28)) + mask_matrix_nms( + masks, + torch.rand(11), + torch.rand(11), + mask_area=masks.sum((1, 2)).float()[:8]) + with pytest.raises(NotImplementedError): + mask_matrix_nms( + torch.rand((10, 28, 28)), + torch.rand(10), + torch.rand(10), + kernel='None') + # test an empty results + masks, labels, scores = _create_mask(0, 28, 28) + score, label, mask, keep_ind = \ + mask_matrix_nms(masks, labels, scores) + assert len(score) == len(label) == \ + len(mask) == len(keep_ind) == 0 + + # do not use update_thr, nms_pre and max_num + masks, labels, scores = _create_mask(1000, 28, 28) + score, label, mask, keep_ind = \ + mask_matrix_nms(masks, labels, scores) + assert len(score) == len(label) == \ + len(mask) == len(keep_ind) == 1000 + # only use nms_pre + score, label, mask, keep_ind = \ + mask_matrix_nms(masks, labels, scores, nms_pre=500) + assert len(score) == len(label) == \ + len(mask) == len(keep_ind) == 500 + # use max_num + score, label, mask, keep_ind = \ + mask_matrix_nms(masks, labels, scores, + nms_pre=500, max_num=100) + assert len(score) == len(label) == \ + len(mask) == len(keep_ind) == 100 + + masks, labels, _ = _create_mask(1, 28, 28) + scores = torch.Tensor([1.0]) + masks = masks.expand(1000, 28, 28) + labels = labels.expand(1000) + scores = scores.expand(1000) + + # assert scores is decayed and update_thr is worked + # if with the same mask, label, and all scores = 1 + # the first score will set to 1, others will decay. + score, label, mask, keep_ind = \ + mask_matrix_nms(masks, + labels, + scores, + nms_pre=500, + max_num=100, + kernel='gaussian', + sigma=2.0, + filter_thr=0.5) + assert len(score) == 1 + assert score[0] == 1 diff --git a/tests/test_utils/test_replace_cfg_vals.py b/tests/test_utils/test_replace_cfg_vals.py new file mode 100644 index 0000000..85d9d0e --- /dev/null +++ b/tests/test_utils/test_replace_cfg_vals.py @@ -0,0 +1,83 @@ +import os.path as osp +import tempfile +from copy import deepcopy + +import pytest +from mmcv.utils import Config + +from mmdet.utils import replace_cfg_vals + + +def test_replace_cfg_vals(): + temp_file = tempfile.NamedTemporaryFile() + cfg_path = f'{temp_file.name}.py' + with open(cfg_path, 'w') as f: + f.write('configs') + + ori_cfg_dict = dict() + ori_cfg_dict['cfg_name'] = osp.basename(temp_file.name) + ori_cfg_dict['work_dir'] = 'work_dirs/${cfg_name}/${percent}/${fold}' + ori_cfg_dict['percent'] = 5 + ori_cfg_dict['fold'] = 1 + ori_cfg_dict['model_wrapper'] = dict( + type='SoftTeacher', detector='${model}') + ori_cfg_dict['model'] = dict( + type='FasterRCNN', + backbone=dict(type='ResNet'), + neck=dict(type='FPN'), + rpn_head=dict(type='RPNHead'), + roi_head=dict(type='StandardRoIHead'), + train_cfg=dict( + rpn=dict( + assigner=dict(type='MaxIoUAssigner'), + sampler=dict(type='RandomSampler'), + ), + rpn_proposal=dict(nms=dict(type='nms', iou_threshold=0.7)), + rcnn=dict( + assigner=dict(type='MaxIoUAssigner'), + sampler=dict(type='RandomSampler'), + ), + ), + test_cfg=dict( + rpn=dict(nms=dict(type='nms', iou_threshold=0.7)), + rcnn=dict(nms=dict(type='nms', iou_threshold=0.5)), + ), + ) + ori_cfg_dict['iou_threshold'] = dict( + rpn_proposal_nms='${model.train_cfg.rpn_proposal.nms.iou_threshold}', + test_rpn_nms='${model.test_cfg.rpn.nms.iou_threshold}', + test_rcnn_nms='${model.test_cfg.rcnn.nms.iou_threshold}', + ) + + ori_cfg_dict['str'] = 'Hello, world!' + ori_cfg_dict['dict'] = {'Hello': 'world!'} + ori_cfg_dict['list'] = [ + 'Hello, world!', + ] + ori_cfg_dict['tuple'] = ('Hello, world!', ) + ori_cfg_dict['test_str'] = 'xxx${str}xxx' + + ori_cfg = Config(ori_cfg_dict, filename=cfg_path) + updated_cfg = replace_cfg_vals(deepcopy(ori_cfg)) + + assert updated_cfg.work_dir \ + == f'work_dirs/{osp.basename(temp_file.name)}/5/1' + assert updated_cfg.model.detector == ori_cfg.model + assert updated_cfg.iou_threshold.rpn_proposal_nms \ + == ori_cfg.model.train_cfg.rpn_proposal.nms.iou_threshold + assert updated_cfg.test_str == 'xxxHello, world!xxx' + ori_cfg_dict['test_dict'] = 'xxx${dict}xxx' + ori_cfg_dict['test_list'] = 'xxx${list}xxx' + ori_cfg_dict['test_tuple'] = 'xxx${tuple}xxx' + with pytest.raises(AssertionError): + cfg = deepcopy(ori_cfg) + cfg['test_dict'] = 'xxx${dict}xxx' + updated_cfg = replace_cfg_vals(cfg) + with pytest.raises(AssertionError): + cfg = deepcopy(ori_cfg) + cfg['test_list'] = 'xxx${list}xxx' + updated_cfg = replace_cfg_vals(cfg) + with pytest.raises(AssertionError): + cfg = deepcopy(ori_cfg) + cfg['test_tuple'] = 'xxx${tuple}xxx' + updated_cfg = replace_cfg_vals(cfg) diff --git a/tests/test_utils/test_setup_env.py b/tests/test_utils/test_setup_env.py new file mode 100644 index 0000000..70f01b8 --- /dev/null +++ b/tests/test_utils/test_setup_env.py @@ -0,0 +1,68 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import multiprocessing as mp +import os +import platform + +import cv2 +from mmcv import Config + +from mmdet.utils import setup_multi_processes + + +def test_setup_multi_processes(): + # temp save system setting + sys_start_mehod = mp.get_start_method(allow_none=True) + sys_cv_threads = cv2.getNumThreads() + # pop and temp save system env vars + sys_omp_threads = os.environ.pop('OMP_NUM_THREADS', default=None) + sys_mkl_threads = os.environ.pop('MKL_NUM_THREADS', default=None) + + # test config without setting env + config = dict(data=dict(workers_per_gpu=2)) + cfg = Config(config) + setup_multi_processes(cfg) + assert os.getenv('OMP_NUM_THREADS') == '1' + assert os.getenv('MKL_NUM_THREADS') == '1' + # when set to 0, the num threads will be 1 + assert cv2.getNumThreads() == 1 + if platform.system() != 'Windows': + assert mp.get_start_method() == 'fork' + + # test num workers <= 1 + os.environ.pop('OMP_NUM_THREADS') + os.environ.pop('MKL_NUM_THREADS') + config = dict(data=dict(workers_per_gpu=0)) + cfg = Config(config) + setup_multi_processes(cfg) + assert 'OMP_NUM_THREADS' not in os.environ + assert 'MKL_NUM_THREADS' not in os.environ + + # test manually set env var + os.environ['OMP_NUM_THREADS'] = '4' + config = dict(data=dict(workers_per_gpu=2)) + cfg = Config(config) + setup_multi_processes(cfg) + assert os.getenv('OMP_NUM_THREADS') == '4' + + # test manually set opencv threads and mp start method + config = dict( + data=dict(workers_per_gpu=2), + opencv_num_threads=4, + mp_start_method='spawn') + cfg = Config(config) + setup_multi_processes(cfg) + assert cv2.getNumThreads() == 4 + assert mp.get_start_method() == 'spawn' + + # revert setting to avoid affecting other programs + if sys_start_mehod: + mp.set_start_method(sys_start_mehod, force=True) + cv2.setNumThreads(sys_cv_threads) + if sys_omp_threads: + os.environ['OMP_NUM_THREADS'] = sys_omp_threads + else: + os.environ.pop('OMP_NUM_THREADS') + if sys_mkl_threads: + os.environ['MKL_NUM_THREADS'] = sys_mkl_threads + else: + os.environ.pop('MKL_NUM_THREADS') diff --git a/tests/test_utils/test_split_batch.py b/tests/test_utils/test_split_batch.py new file mode 100644 index 0000000..d770f9f --- /dev/null +++ b/tests/test_utils/test_split_batch.py @@ -0,0 +1,95 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +from copy import deepcopy + +import mmcv +import numpy as np +import torch + +from mmdet.utils import split_batch + + +def test_split_batch(): + img_root = osp.join(osp.dirname(__file__), '../data/color.jpg') + img = mmcv.imread(img_root, 'color') + h, w, _ = img.shape + gt_bboxes = np.array([[0.2 * w, 0.2 * h, 0.4 * w, 0.4 * h], + [0.6 * w, 0.6 * h, 0.8 * w, 0.8 * h]], + dtype=np.float32) + gt_lables = np.ones(gt_bboxes.shape[0], dtype=np.int64) + + img = torch.tensor(img).permute(2, 0, 1) + meta = dict() + meta['filename'] = img_root + meta['ori_shape'] = img.shape + meta['img_shape'] = img.shape + meta['img_norm_cfg'] = { + 'mean': np.array([103.53, 116.28, 123.675], dtype=np.float32), + 'std': np.array([1., 1., 1.], dtype=np.float32), + 'to_rgb': False + } + meta['pad_shape'] = img.shape + # For example, tag include sup, unsup_teacher and unsup_student, + # in order to distinguish the difference between the three groups of data, + # the scale_factor of sup is [0.5, 0.5, 0.5, 0.5] + # the scale_factor of unsup_teacher is [1.0, 1.0, 1.0, 1.0] + # the scale_factor of unsup_student is [2.0, 2.0, 2.0, 2.0] + imgs = img.unsqueeze(0).repeat(9, 1, 1, 1) + img_metas = [] + tags = [ + 'sup', 'unsup_teacher', 'unsup_student', 'unsup_teacher', + 'unsup_student', 'unsup_teacher', 'unsup_student', 'unsup_teacher', + 'unsup_student' + ] + for tag in tags: + img_meta = deepcopy(meta) + if tag == 'sup': + img_meta['scale_factor'] = [0.5, 0.5, 0.5, 0.5] + img_meta['tag'] = 'sup' + elif tag == 'unsup_teacher': + img_meta['scale_factor'] = [1.0, 1.0, 1.0, 1.0] + img_meta['tag'] = 'unsup_teacher' + elif tag == 'unsup_student': + img_meta['scale_factor'] = [2.0, 2.0, 2.0, 2.0] + img_meta['tag'] = 'unsup_student' + else: + continue + img_metas.append(img_meta) + kwargs = dict() + kwargs['gt_bboxes'] = [torch.tensor(gt_bboxes)] + [torch.zeros(0, 4)] * 8 + kwargs['gt_lables'] = [torch.tensor(gt_lables)] + [torch.zeros(0, )] * 8 + data_groups = split_batch(imgs, img_metas, kwargs) + assert set(data_groups.keys()) == set(tags) + assert data_groups['sup']['img'].shape == (1, 3, h, w) + assert data_groups['unsup_teacher']['img'].shape == (4, 3, h, w) + assert data_groups['unsup_student']['img'].shape == (4, 3, h, w) + # the scale_factor of sup is [0.5, 0.5, 0.5, 0.5] + assert data_groups['sup']['img_metas'][0]['scale_factor'] == [ + 0.5, 0.5, 0.5, 0.5 + ] + # the scale_factor of unsup_teacher is [1.0, 1.0, 1.0, 1.0] + assert data_groups['unsup_teacher']['img_metas'][0]['scale_factor'] == [ + 1.0, 1.0, 1.0, 1.0 + ] + assert data_groups['unsup_teacher']['img_metas'][1]['scale_factor'] == [ + 1.0, 1.0, 1.0, 1.0 + ] + assert data_groups['unsup_teacher']['img_metas'][2]['scale_factor'] == [ + 1.0, 1.0, 1.0, 1.0 + ] + assert data_groups['unsup_teacher']['img_metas'][3]['scale_factor'] == [ + 1.0, 1.0, 1.0, 1.0 + ] + # the scale_factor of unsup_student is [2.0, 2.0, 2.0, 2.0] + assert data_groups['unsup_student']['img_metas'][0]['scale_factor'] == [ + 2.0, 2.0, 2.0, 2.0 + ] + assert data_groups['unsup_student']['img_metas'][1]['scale_factor'] == [ + 2.0, 2.0, 2.0, 2.0 + ] + assert data_groups['unsup_student']['img_metas'][2]['scale_factor'] == [ + 2.0, 2.0, 2.0, 2.0 + ] + assert data_groups['unsup_student']['img_metas'][3]['scale_factor'] == [ + 2.0, 2.0, 2.0, 2.0 + ] diff --git a/tests/test_utils/test_version.py b/tests/test_utils/test_version.py new file mode 100644 index 0000000..87d2fab --- /dev/null +++ b/tests/test_utils/test_version.py @@ -0,0 +1,16 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from mmdet import digit_version + + +def test_version_check(): + assert digit_version('1.0.5') > digit_version('1.0.5rc0') + assert digit_version('1.0.5') > digit_version('1.0.4rc0') + assert digit_version('1.0.5') > digit_version('1.0rc0') + assert digit_version('1.0.0') > digit_version('0.6.2') + assert digit_version('1.0.0') > digit_version('0.2.16') + assert digit_version('1.0.5rc0') > digit_version('1.0.0rc0') + assert digit_version('1.0.0rc1') > digit_version('1.0.0rc0') + assert digit_version('1.0.0rc2') > digit_version('1.0.0rc0') + assert digit_version('1.0.0rc2') > digit_version('1.0.0rc1') + assert digit_version('1.0.1rc1') > digit_version('1.0.0rc1') + assert digit_version('1.0.0') > digit_version('1.0.0rc1') diff --git a/tests/test_utils/test_visualization.py b/tests/test_utils/test_visualization.py new file mode 100644 index 0000000..1dbdb2b --- /dev/null +++ b/tests/test_utils/test_visualization.py @@ -0,0 +1,173 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os +import os.path as osp +import tempfile + +import mmcv +import numpy as np +import pytest +import torch + +from mmdet.core import visualization as vis +from mmdet.datasets import (CityscapesDataset, CocoDataset, + CocoPanopticDataset, VOCDataset) + + +def test_color(): + assert vis.color_val_matplotlib(mmcv.Color.blue) == (0., 0., 1.) + assert vis.color_val_matplotlib('green') == (0., 1., 0.) + assert vis.color_val_matplotlib((1, 2, 3)) == (3 / 255, 2 / 255, 1 / 255) + assert vis.color_val_matplotlib(100) == (100 / 255, 100 / 255, 100 / 255) + assert vis.color_val_matplotlib(np.zeros(3, dtype=np.int)) == (0., 0., 0.) + # forbid white color + with pytest.raises(TypeError): + vis.color_val_matplotlib([255, 255, 255]) + # forbid float + with pytest.raises(TypeError): + vis.color_val_matplotlib(1.0) + # overflowed + with pytest.raises(AssertionError): + vis.color_val_matplotlib((0, 0, 500)) + + +def test_imshow_det_bboxes(): + tmp_filename = osp.join(tempfile.gettempdir(), 'det_bboxes_image', + 'image.jpg') + image = np.ones((10, 10, 3), np.uint8) + bbox = np.array([[2, 1, 3, 3], [3, 4, 6, 6]]) + label = np.array([0, 1]) + out_image = vis.imshow_det_bboxes( + image, bbox, label, out_file=tmp_filename, show=False) + assert osp.isfile(tmp_filename) + assert image.shape == out_image.shape + assert not np.allclose(image, out_image) + os.remove(tmp_filename) + + # test grayscale images + image = np.ones((10, 10), np.uint8) + bbox = np.array([[2, 1, 3, 3], [3, 4, 6, 6]]) + label = np.array([0, 1]) + out_image = vis.imshow_det_bboxes( + image, bbox, label, out_file=tmp_filename, show=False) + assert osp.isfile(tmp_filename) + assert image.shape == out_image.shape[:2] + os.remove(tmp_filename) + + # test shaped (0,) + image = np.ones((10, 10, 3), np.uint8) + bbox = np.ones((0, 4)) + label = np.ones((0, )) + vis.imshow_det_bboxes( + image, bbox, label, out_file=tmp_filename, show=False) + assert osp.isfile(tmp_filename) + os.remove(tmp_filename) + + # test mask + image = np.ones((10, 10, 3), np.uint8) + bbox = np.array([[2, 1, 3, 3], [3, 4, 6, 6]]) + label = np.array([0, 1]) + segms = np.random.random((2, 10, 10)) > 0.5 + segms = np.array(segms, np.int32) + vis.imshow_det_bboxes( + image, bbox, label, segms, out_file=tmp_filename, show=False) + assert osp.isfile(tmp_filename) + os.remove(tmp_filename) + + # test tensor mask type error + with pytest.raises(AttributeError): + segms = torch.tensor(segms) + vis.imshow_det_bboxes(image, bbox, label, segms, show=False) + + +def test_imshow_gt_det_bboxes(): + tmp_filename = osp.join(tempfile.gettempdir(), 'det_bboxes_image', + 'image.jpg') + image = np.ones((10, 10, 3), np.uint8) + bbox = np.array([[2, 1, 3, 3], [3, 4, 6, 6]]) + label = np.array([0, 1]) + annotation = dict(gt_bboxes=bbox, gt_labels=label) + det_result = np.array([[2, 1, 3, 3, 0], [3, 4, 6, 6, 1]]) + result = [det_result] + out_image = vis.imshow_gt_det_bboxes( + image, annotation, result, out_file=tmp_filename, show=False) + assert osp.isfile(tmp_filename) + assert image.shape == out_image.shape + assert not np.allclose(image, out_image) + os.remove(tmp_filename) + + # test grayscale images + image = np.ones((10, 10), np.uint8) + bbox = np.array([[2, 1, 3, 3], [3, 4, 6, 6]]) + label = np.array([0, 1]) + annotation = dict(gt_bboxes=bbox, gt_labels=label) + det_result = np.array([[2, 1, 3, 3, 0], [3, 4, 6, 6, 1]]) + result = [det_result] + vis.imshow_gt_det_bboxes( + image, annotation, result, out_file=tmp_filename, show=False) + assert osp.isfile(tmp_filename) + os.remove(tmp_filename) + + # test numpy mask + gt_mask = np.ones((2, 10, 10)) + annotation['gt_masks'] = gt_mask + vis.imshow_gt_det_bboxes( + image, annotation, result, out_file=tmp_filename, show=False) + assert osp.isfile(tmp_filename) + os.remove(tmp_filename) + + # test tensor mask + gt_mask = torch.ones((2, 10, 10)) + annotation['gt_masks'] = gt_mask + vis.imshow_gt_det_bboxes( + image, annotation, result, out_file=tmp_filename, show=False) + assert osp.isfile(tmp_filename) + os.remove(tmp_filename) + + # test unsupported type + annotation['gt_masks'] = [] + with pytest.raises(TypeError): + vis.imshow_gt_det_bboxes(image, annotation, result, show=False) + + +def test_palette(): + assert vis.palette_val([(1, 2, 3)])[0] == (1 / 255, 2 / 255, 3 / 255) + + # test list + palette = [(1, 0, 0), (0, 1, 0), (0, 0, 1)] + palette_ = vis.get_palette(palette, 3) + for color, color_ in zip(palette, palette_): + assert color == color_ + + # test tuple + palette = vis.get_palette((1, 2, 3), 3) + assert len(palette) == 3 + for color in palette: + assert color == (1, 2, 3) + + # test color str + palette = vis.get_palette('red', 3) + assert len(palette) == 3 + for color in palette: + assert color == (255, 0, 0) + + # test dataset str + palette = vis.get_palette('coco', len(CocoDataset.CLASSES)) + assert len(palette) == len(CocoDataset.CLASSES) + assert palette[0] == (220, 20, 60) + palette = vis.get_palette('coco', len(CocoPanopticDataset.CLASSES)) + assert len(palette) == len(CocoPanopticDataset.CLASSES) + assert palette[-1] == (250, 141, 255) + palette = vis.get_palette('voc', len(VOCDataset.CLASSES)) + assert len(palette) == len(VOCDataset.CLASSES) + assert palette[0] == (106, 0, 228) + palette = vis.get_palette('citys', len(CityscapesDataset.CLASSES)) + assert len(palette) == len(CityscapesDataset.CLASSES) + assert palette[0] == (220, 20, 60) + + # test random + palette1 = vis.get_palette('random', 3) + palette2 = vis.get_palette(None, 3) + for color1, color2 in zip(palette1, palette2): + assert isinstance(color1, tuple) + assert isinstance(color2, tuple) + assert color1 == color2 diff --git a/tmp/temp_00 b/tmp/temp_00 new file mode 100644 index 0000000..3024cbb --- /dev/null +++ b/tmp/temp_00 @@ -0,0 +1 @@ +tools/starter_scripts/retinanet_18/dist_train_retinanet_18_coco_AQD.sh diff --git a/tmp/temp_01 b/tmp/temp_01 new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/tmp/temp_01 @@ -0,0 +1 @@ + diff --git a/tools/analysis_tools/analyze_logs.py b/tools/analysis_tools/analyze_logs.py new file mode 100755 index 0000000..ca13ea8 --- /dev/null +++ b/tools/analysis_tools/analyze_logs.py @@ -0,0 +1,204 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import json +from collections import defaultdict + +import matplotlib.pyplot as plt +import numpy as np +import seaborn as sns + + +def cal_train_time(log_dicts, args): + for i, log_dict in enumerate(log_dicts): + print(f'{"-" * 5}Analyze train time of {args.json_logs[i]}{"-" * 5}') + all_times = [] + for epoch in log_dict.keys(): + if args.include_outliers: + all_times.append(log_dict[epoch]['time']) + else: + all_times.append(log_dict[epoch]['time'][1:]) + if not all_times: + raise KeyError( + 'Please reduce the log interval in the config so that' + 'interval is less than iterations of one epoch.') + all_times = np.array(all_times) + epoch_ave_time = all_times.mean(-1) + slowest_epoch = epoch_ave_time.argmax() + fastest_epoch = epoch_ave_time.argmin() + std_over_epoch = epoch_ave_time.std() + print(f'slowest epoch {slowest_epoch + 1}, ' + f'average time is {epoch_ave_time[slowest_epoch]:.4f}') + print(f'fastest epoch {fastest_epoch + 1}, ' + f'average time is {epoch_ave_time[fastest_epoch]:.4f}') + print(f'time std over epochs is {std_over_epoch:.4f}') + print(f'average iter time: {np.mean(all_times):.4f} s/iter') + print() + + +def plot_curve(log_dicts, args): + if args.backend is not None: + plt.switch_backend(args.backend) + sns.set_style(args.style) + # if legend is None, use {filename}_{key} as legend + legend = args.legend + if legend is None: + legend = [] + for json_log in args.json_logs: + for metric in args.keys: + legend.append(f'{json_log}_{metric}') + assert len(legend) == (len(args.json_logs) * len(args.keys)) + metrics = args.keys + + num_metrics = len(metrics) + for i, log_dict in enumerate(log_dicts): + epochs = list(log_dict.keys()) + for j, metric in enumerate(metrics): + print(f'plot curve of {args.json_logs[i]}, metric is {metric}') + if metric not in log_dict[epochs[int(args.eval_interval) - 1]]: + if 'mAP' in metric: + raise KeyError( + f'{args.json_logs[i]} does not contain metric ' + f'{metric}. Please check if "--no-validate" is ' + 'specified when you trained the model.') + raise KeyError( + f'{args.json_logs[i]} does not contain metric {metric}. ' + 'Please reduce the log interval in the config so that ' + 'interval is less than iterations of one epoch.') + + if 'mAP' in metric: + xs = [] + ys = [] + for epoch in epochs: + ys += log_dict[epoch][metric] + if 'val' in log_dict[epoch]['mode']: + xs.append(epoch) + plt.xlabel('epoch') + plt.plot(xs, ys, label=legend[i * num_metrics + j], marker='o') + else: + xs = [] + ys = [] + num_iters_per_epoch = log_dict[epochs[0]]['iter'][-2] + for epoch in epochs: + iters = log_dict[epoch]['iter'] + if log_dict[epoch]['mode'][-1] == 'val': + iters = iters[:-1] + xs.append( + np.array(iters) + (epoch - 1) * num_iters_per_epoch) + ys.append(np.array(log_dict[epoch][metric][:len(iters)])) + xs = np.concatenate(xs) + ys = np.concatenate(ys) + plt.xlabel('iter') + plt.plot( + xs, ys, label=legend[i * num_metrics + j], linewidth=0.5) + plt.legend() + if args.title is not None: + plt.title(args.title) + if args.out is None: + plt.show() + else: + print(f'save curve to: {args.out}') + plt.savefig(args.out) + plt.cla() + + +def add_plot_parser(subparsers): + parser_plt = subparsers.add_parser( + 'plot_curve', help='parser for plotting curves') + parser_plt.add_argument( + 'json_logs', + type=str, + nargs='+', + help='path of train log in json format') + parser_plt.add_argument( + '--keys', + type=str, + nargs='+', + default=['bbox_mAP'], + help='the metric that you want to plot') + parser_plt.add_argument( + '--start-epoch', + type=str, + default='1', + help='the epoch that you want to start') + parser_plt.add_argument( + '--eval-interval', + type=str, + default='1', + help='the eval interval when training') + parser_plt.add_argument('--title', type=str, help='title of figure') + parser_plt.add_argument( + '--legend', + type=str, + nargs='+', + default=None, + help='legend of each plot') + parser_plt.add_argument( + '--backend', type=str, default=None, help='backend of plt') + parser_plt.add_argument( + '--style', type=str, default='dark', help='style of plt') + parser_plt.add_argument('--out', type=str, default=None) + + +def add_time_parser(subparsers): + parser_time = subparsers.add_parser( + 'cal_train_time', + help='parser for computing the average time per training iteration') + parser_time.add_argument( + 'json_logs', + type=str, + nargs='+', + help='path of train log in json format') + parser_time.add_argument( + '--include-outliers', + action='store_true', + help='include the first value of every epoch when computing ' + 'the average time') + + +def parse_args(): + parser = argparse.ArgumentParser(description='Analyze Json Log') + # currently only support plot curve and calculate average train time + subparsers = parser.add_subparsers(dest='task', help='task parser') + add_plot_parser(subparsers) + add_time_parser(subparsers) + args = parser.parse_args() + return args + + +def load_json_logs(json_logs): + # load and convert json_logs to log_dict, key is epoch, value is a sub dict + # keys of sub dict is different metrics, e.g. memory, bbox_mAP + # value of sub dict is a list of corresponding values of all iterations + log_dicts = [dict() for _ in json_logs] + for json_log, log_dict in zip(json_logs, log_dicts): + with open(json_log, 'r') as log_file: + for i, line in enumerate(log_file): + log = json.loads(line.strip()) + # skip the first training info line + if i == 0: + continue + # skip lines without `epoch` field + if 'epoch' not in log: + continue + epoch = log.pop('epoch') + if epoch not in log_dict: + log_dict[epoch] = defaultdict(list) + for k, v in log.items(): + log_dict[epoch][k].append(v) + return log_dicts + + +def main(): + args = parse_args() + + json_logs = args.json_logs + for json_log in json_logs: + assert json_log.endswith('.json') + + log_dicts = load_json_logs(json_logs) + + eval(args.task)(log_dicts, args) + + +if __name__ == '__main__': + main() diff --git a/tools/analysis_tools/analyze_results.py b/tools/analysis_tools/analyze_results.py new file mode 100644 index 0000000..4d8b60c --- /dev/null +++ b/tools/analysis_tools/analyze_results.py @@ -0,0 +1,369 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os.path as osp +from multiprocessing import Pool + +import mmcv +import numpy as np +from mmcv import Config, DictAction + +from mmdet.core.evaluation import eval_map +from mmdet.core.visualization import imshow_gt_det_bboxes +from mmdet.datasets import build_dataset, get_loading_pipeline +from mmdet.datasets.api_wrappers import pq_compute_single_core +from mmdet.utils import replace_cfg_vals, update_data_root + + +def bbox_map_eval(det_result, annotation, nproc=4): + """Evaluate mAP of single image det result. + + Args: + det_result (list[list]): [[cls1_det, cls2_det, ...], ...]. + The outer list indicates images, and the inner list indicates + per-class detected bboxes. + annotation (dict): Ground truth annotations where keys of + annotations are: + + - bboxes: numpy array of shape (n, 4) + - labels: numpy array of shape (n, ) + - bboxes_ignore (optional): numpy array of shape (k, 4) + - labels_ignore (optional): numpy array of shape (k, ) + + nproc (int): Processes used for computing mAP. + Default: 4. + + Returns: + float: mAP + """ + + # use only bbox det result + if isinstance(det_result, tuple): + bbox_det_result = [det_result[0]] + else: + bbox_det_result = [det_result] + # mAP + iou_thrs = np.linspace( + .5, 0.95, int(np.round((0.95 - .5) / .05)) + 1, endpoint=True) + + processes = [] + workers = Pool(processes=nproc) + for thr in iou_thrs: + p = workers.apply_async(eval_map, (bbox_det_result, [annotation]), { + 'iou_thr': thr, + 'logger': 'silent', + 'nproc': 1 + }) + processes.append(p) + + workers.close() + workers.join() + + mean_aps = [] + for p in processes: + mean_aps.append(p.get()[0]) + + return sum(mean_aps) / len(mean_aps) + + +class ResultVisualizer: + """Display and save evaluation results. + + Args: + show (bool): Whether to show the image. Default: True. + wait_time (float): Value of waitKey param. Default: 0. + score_thr (float): Minimum score of bboxes to be shown. + Default: 0. + overlay_gt_pred (bool): Whether to plot gts and predictions on the + same image. If False, predictions and gts will be plotted on two + same image which will be concatenated in vertical direction. + The image above is drawn with gt, and the image below is drawn + with the prediction result. Default: False. + """ + + def __init__(self, + show=False, + wait_time=0, + score_thr=0, + overlay_gt_pred=False): + self.show = show + self.wait_time = wait_time + self.score_thr = score_thr + self.overlay_gt_pred = overlay_gt_pred + + def _save_image_gts_results(self, + dataset, + results, + performances, + out_dir=None): + """Display or save image with groung truths and predictions from a + model. + + Args: + dataset (Dataset): A PyTorch dataset. + results (list): Object detection or panoptic segmentation + results from test results pkl file. + performances (dict): A dict contains samples's indices + in dataset and model's performance on them. + out_dir (str, optional): The filename to write the image. + Defaults: None. + """ + mmcv.mkdir_or_exist(out_dir) + + for performance_info in performances: + index, performance = performance_info + data_info = dataset.prepare_train_img(index) + + # calc save file path + filename = data_info['filename'] + if data_info['img_prefix'] is not None: + filename = osp.join(data_info['img_prefix'], filename) + else: + filename = data_info['filename'] + fname, name = osp.splitext(osp.basename(filename)) + save_filename = fname + '_' + str(round(performance, 3)) + name + out_file = osp.join(out_dir, save_filename) + imshow_gt_det_bboxes( + data_info['img'], + data_info, + results[index], + dataset.CLASSES, + gt_bbox_color=dataset.PALETTE, + gt_text_color=(200, 200, 200), + gt_mask_color=dataset.PALETTE, + det_bbox_color=dataset.PALETTE, + det_text_color=(200, 200, 200), + det_mask_color=dataset.PALETTE, + show=self.show, + score_thr=self.score_thr, + wait_time=self.wait_time, + out_file=out_file, + overlay_gt_pred=self.overlay_gt_pred) + + def evaluate_and_show(self, + dataset, + results, + topk=20, + show_dir='work_dir'): + """Evaluate and show results. + + Args: + dataset (Dataset): A PyTorch dataset. + results (list): Object detection or panoptic segmentation + results from test results pkl file. + topk (int): Number of the highest topk and + lowest topk after evaluation index sorting. Default: 20. + show_dir (str, optional): The filename to write the image. + Default: 'work_dir' + eval_fn (callable, optional): Eval function, Default: None. + """ + + assert topk > 0 + if (topk * 2) > len(dataset): + topk = len(dataset) // 2 + + if isinstance(results[0], dict): + good_samples, bad_samples = self.panoptic_evaluate( + dataset, results, topk=topk) + elif isinstance(results[0], list): + good_samples, bad_samples = self.detection_evaluate( + dataset, results, topk=topk) + elif isinstance(results[0], tuple): + results_ = [result[0] for result in results] + good_samples, bad_samples = self.detection_evaluate( + dataset, results_, topk=topk) + else: + raise 'The format of result is not supported yet. ' \ + 'Current dict for panoptic segmentation and list ' \ + 'or tuple for object detection are supported.' + + good_dir = osp.abspath(osp.join(show_dir, 'good')) + bad_dir = osp.abspath(osp.join(show_dir, 'bad')) + self._save_image_gts_results(dataset, results, good_samples, good_dir) + self._save_image_gts_results(dataset, results, bad_samples, bad_dir) + + def detection_evaluate(self, dataset, results, topk=20, eval_fn=None): + """Evaluation for object detection. + + Args: + dataset (Dataset): A PyTorch dataset. + results (list): Object detection results from test + results pkl file. + topk (int): Number of the highest topk and + lowest topk after evaluation index sorting. Default: 20. + eval_fn (callable, optional): Eval function, Default: None. + + Returns: + tuple: A tuple contains good samples and bad samples. + good_mAPs (dict[int, float]): A dict contains good + samples's indices in dataset and model's + performance on them. + bad_mAPs (dict[int, float]): A dict contains bad + samples's indices in dataset and model's + performance on them. + """ + if eval_fn is None: + eval_fn = bbox_map_eval + else: + assert callable(eval_fn) + + prog_bar = mmcv.ProgressBar(len(results)) + _mAPs = {} + for i, (result, ) in enumerate(zip(results)): + # self.dataset[i] should not call directly + # because there is a risk of mismatch + data_info = dataset.prepare_train_img(i) + mAP = eval_fn(result, data_info['ann_info']) + _mAPs[i] = mAP + prog_bar.update() + # descending select topk image + _mAPs = list(sorted(_mAPs.items(), key=lambda kv: kv[1])) + good_mAPs = _mAPs[-topk:] + bad_mAPs = _mAPs[:topk] + + return good_mAPs, bad_mAPs + + def panoptic_evaluate(self, dataset, results, topk=20): + """Evaluation for panoptic segmentation. + + Args: + dataset (Dataset): A PyTorch dataset. + results (list): Panoptic segmentation results from test + results pkl file. + topk (int): Number of the highest topk and + lowest topk after evaluation index sorting. Default: 20. + + Returns: + tuple: A tuple contains good samples and bad samples. + good_pqs (dict[int, float]): A dict contains good + samples's indices in dataset and model's + performance on them. + bad_pqs (dict[int, float]): A dict contains bad + samples's indices in dataset and model's + performance on them. + """ + # image to annotations + gt_json = dataset.coco.img_ann_map + + result_files, tmp_dir = dataset.format_results(results) + pred_json = mmcv.load(result_files['panoptic'])['annotations'] + pred_folder = osp.join(tmp_dir.name, 'panoptic') + gt_folder = dataset.seg_prefix + + pqs = {} + prog_bar = mmcv.ProgressBar(len(results)) + for i in range(len(results)): + data_info = dataset.prepare_train_img(i) + image_id = data_info['img_info']['id'] + gt_ann = { + 'image_id': image_id, + 'segments_info': gt_json[image_id], + 'file_name': data_info['img_info']['segm_file'] + } + pred_ann = pred_json[i] + pq_stat = pq_compute_single_core( + i, [(gt_ann, pred_ann)], + gt_folder, + pred_folder, + dataset.categories, + dataset.file_client, + print_log=False) + pq_results, classwise_results = pq_stat.pq_average( + dataset.categories, isthing=None) + pqs[i] = pq_results['pq'] + prog_bar.update() + + if tmp_dir is not None: + tmp_dir.cleanup() + + # descending select topk image + pqs = list(sorted(pqs.items(), key=lambda kv: kv[1])) + good_pqs = pqs[-topk:] + bad_pqs = pqs[:topk] + + return good_pqs, bad_pqs + + +def parse_args(): + parser = argparse.ArgumentParser( + description='MMDet eval image prediction result for each') + parser.add_argument('config', help='test config file path') + parser.add_argument( + 'prediction_path', help='prediction path where test pkl result') + parser.add_argument( + 'show_dir', help='directory where painted images will be saved') + parser.add_argument('--show', action='store_true', help='show results') + parser.add_argument( + '--wait-time', + type=float, + default=0, + help='the interval of show (s), 0 is block') + parser.add_argument( + '--topk', + default=20, + type=int, + help='saved Number of the highest topk ' + 'and lowest topk after index sorting') + parser.add_argument( + '--show-score-thr', + type=float, + default=0, + help='score threshold (default: 0.)') + parser.add_argument( + '--overlay-gt-pred', + action='store_true', + help='whether to plot gts and predictions on the same image.' + 'If False, predictions and gts will be plotted on two same' + 'image which will be concatenated in vertical direction.' + 'The image above is drawn with gt, and the image below is' + 'drawn with the prediction result.') + parser.add_argument( + '--cfg-options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file. If the value to ' + 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + 'Note that the quotation marks are necessary and that no white space ' + 'is allowed.') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + + mmcv.check_file_exist(args.prediction_path) + + cfg = Config.fromfile(args.config) + + # replace the ${key} with the value of cfg.key + cfg = replace_cfg_vals(cfg) + + # update data root according to MMDET_DATASETS + update_data_root(cfg) + + if args.cfg_options is not None: + cfg.merge_from_dict(args.cfg_options) + cfg.data.test.test_mode = True + + cfg.data.test.pop('samples_per_gpu', 0) + if cfg.data.train.type in ('MultiImageMixDataset', 'ClassBalancedDataset', + 'RepeatDataset', 'ConcatDataset'): + cfg.data.test.pipeline = get_loading_pipeline( + cfg.data.train.dataset.pipeline) + else: + cfg.data.test.pipeline = get_loading_pipeline(cfg.data.train.pipeline) + + dataset = build_dataset(cfg.data.test) + outputs = mmcv.load(args.prediction_path) + + result_visualizer = ResultVisualizer(args.show, args.wait_time, + args.show_score_thr, + args.overlay_gt_pred) + result_visualizer.evaluate_and_show( + dataset, outputs, topk=args.topk, show_dir=args.show_dir) + + +if __name__ == '__main__': + main() diff --git a/tools/analysis_tools/benchmark.py b/tools/analysis_tools/benchmark.py new file mode 100644 index 0000000..c956968 --- /dev/null +++ b/tools/analysis_tools/benchmark.py @@ -0,0 +1,195 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import copy +import os +import time + +import torch +from mmcv import Config, DictAction +from mmcv.cnn import fuse_conv_bn +from mmcv.parallel import MMDistributedDataParallel +from mmcv.runner import init_dist, load_checkpoint, wrap_fp16_model + +from mmdet.datasets import (build_dataloader, build_dataset, + replace_ImageToTensor) +from mmdet.models import build_detector +from mmdet.utils import replace_cfg_vals, update_data_root + + +def parse_args(): + parser = argparse.ArgumentParser(description='MMDet benchmark a model') + parser.add_argument('config', help='test config file path') + parser.add_argument('checkpoint', help='checkpoint file') + parser.add_argument( + '--repeat-num', + type=int, + default=1, + help='number of repeat times of measurement for averaging the results') + parser.add_argument( + '--max-iter', type=int, default=2000, help='num of max iter') + parser.add_argument( + '--log-interval', type=int, default=50, help='interval of logging') + parser.add_argument( + '--fuse-conv-bn', + action='store_true', + help='Whether to fuse conv and bn, this will slightly increase' + 'the inference speed') + parser.add_argument( + '--cfg-options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file. If the value to ' + 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + 'Note that the quotation marks are necessary and that no white space ' + 'is allowed.') + parser.add_argument( + '--launcher', + choices=['none', 'pytorch', 'slurm', 'mpi'], + default='none', + help='job launcher') + parser.add_argument('--local_rank', type=int, default=0) + args = parser.parse_args() + if 'LOCAL_RANK' not in os.environ: + os.environ['LOCAL_RANK'] = str(args.local_rank) + return args + + +def measure_inference_speed(cfg, checkpoint, max_iter, log_interval, + is_fuse_conv_bn): + # set cudnn_benchmark + if cfg.get('cudnn_benchmark', False): + torch.backends.cudnn.benchmark = True + cfg.model.pretrained = None + cfg.data.test.test_mode = True + + # build the dataloader + samples_per_gpu = cfg.data.test.pop('samples_per_gpu', 1) + if samples_per_gpu > 1: + # Replace 'ImageToTensor' to 'DefaultFormatBundle' + cfg.data.test.pipeline = replace_ImageToTensor(cfg.data.test.pipeline) + dataset = build_dataset(cfg.data.test) + data_loader = build_dataloader( + dataset, + samples_per_gpu=1, + # Because multiple processes will occupy additional CPU resources, + # FPS statistics will be more unstable when workers_per_gpu is not 0. + # It is reasonable to set workers_per_gpu to 0. + workers_per_gpu=0, + dist=True, + shuffle=False) + + # build the model and load checkpoint + cfg.model.train_cfg = None + model = build_detector(cfg.model, test_cfg=cfg.get('test_cfg')) + fp16_cfg = cfg.get('fp16', None) + if fp16_cfg is not None: + wrap_fp16_model(model) + load_checkpoint(model, checkpoint, map_location='cpu') + if is_fuse_conv_bn: + model = fuse_conv_bn(model) + + model = MMDistributedDataParallel( + model.cuda(), + device_ids=[torch.cuda.current_device()], + broadcast_buffers=False) + model.eval() + + # the first several iterations may be very slow so skip them + num_warmup = 5 + pure_inf_time = 0 + fps = 0 + + # benchmark with 2000 image and take the average + for i, data in enumerate(data_loader): + + torch.cuda.synchronize() + start_time = time.perf_counter() + + with torch.no_grad(): + model(return_loss=False, rescale=True, **data) + + torch.cuda.synchronize() + elapsed = time.perf_counter() - start_time + + if i >= num_warmup: + pure_inf_time += elapsed + if (i + 1) % log_interval == 0: + fps = (i + 1 - num_warmup) / pure_inf_time + print( + f'Done image [{i + 1:<3}/ {max_iter}], ' + f'fps: {fps:.1f} img / s, ' + f'times per image: {1000 / fps:.1f} ms / img', + flush=True) + + if (i + 1) == max_iter: + fps = (i + 1 - num_warmup) / pure_inf_time + print( + f'Overall fps: {fps:.1f} img / s, ' + f'times per image: {1000 / fps:.1f} ms / img', + flush=True) + break + return fps + + +def repeat_measure_inference_speed(cfg, + checkpoint, + max_iter, + log_interval, + is_fuse_conv_bn, + repeat_num=1): + assert repeat_num >= 1 + + fps_list = [] + + for _ in range(repeat_num): + # + cp_cfg = copy.deepcopy(cfg) + + fps_list.append( + measure_inference_speed(cp_cfg, checkpoint, max_iter, log_interval, + is_fuse_conv_bn)) + + if repeat_num > 1: + fps_list_ = [round(fps, 1) for fps in fps_list] + times_pre_image_list_ = [round(1000 / fps, 1) for fps in fps_list] + mean_fps_ = sum(fps_list_) / len(fps_list_) + mean_times_pre_image_ = sum(times_pre_image_list_) / len( + times_pre_image_list_) + print( + f'Overall fps: {fps_list_}[{mean_fps_:.1f}] img / s, ' + f'times per image: ' + f'{times_pre_image_list_}[{mean_times_pre_image_:.1f}] ms / img', + flush=True) + return fps_list + + return fps_list[0] + + +def main(): + args = parse_args() + + cfg = Config.fromfile(args.config) + + # replace the ${key} with the value of cfg.key + cfg = replace_cfg_vals(cfg) + + # update data root according to MMDET_DATASETS + update_data_root(cfg) + + if args.cfg_options is not None: + cfg.merge_from_dict(args.cfg_options) + + if args.launcher == 'none': + raise NotImplementedError('Only supports distributed mode') + else: + init_dist(args.launcher, **cfg.dist_params) + + repeat_measure_inference_speed(cfg, args.checkpoint, args.max_iter, + args.log_interval, args.fuse_conv_bn, + args.repeat_num) + + +if __name__ == '__main__': + main() diff --git a/tools/analysis_tools/coco_error_analysis.py b/tools/analysis_tools/coco_error_analysis.py new file mode 100644 index 0000000..102ea4e --- /dev/null +++ b/tools/analysis_tools/coco_error_analysis.py @@ -0,0 +1,339 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import copy +import os +from argparse import ArgumentParser +from multiprocessing import Pool + +import matplotlib.pyplot as plt +import numpy as np +from pycocotools.coco import COCO +from pycocotools.cocoeval import COCOeval + + +def makeplot(rs, ps, outDir, class_name, iou_type): + cs = np.vstack([ + np.ones((2, 3)), + np.array([0.31, 0.51, 0.74]), + np.array([0.75, 0.31, 0.30]), + np.array([0.36, 0.90, 0.38]), + np.array([0.50, 0.39, 0.64]), + np.array([1, 0.6, 0]), + ]) + areaNames = ['allarea', 'small', 'medium', 'large'] + types = ['C75', 'C50', 'Loc', 'Sim', 'Oth', 'BG', 'FN'] + for i in range(len(areaNames)): + area_ps = ps[..., i, 0] + figure_title = iou_type + '-' + class_name + '-' + areaNames[i] + aps = [ps_.mean() for ps_ in area_ps] + ps_curve = [ + ps_.mean(axis=1) if ps_.ndim > 1 else ps_ for ps_ in area_ps + ] + ps_curve.insert(0, np.zeros(ps_curve[0].shape)) + fig = plt.figure() + ax = plt.subplot(111) + for k in range(len(types)): + ax.plot(rs, ps_curve[k + 1], color=[0, 0, 0], linewidth=0.5) + ax.fill_between( + rs, + ps_curve[k], + ps_curve[k + 1], + color=cs[k], + label=str(f'[{aps[k]:.3f}]' + types[k]), + ) + plt.xlabel('recall') + plt.ylabel('precision') + plt.xlim(0, 1.0) + plt.ylim(0, 1.0) + plt.title(figure_title) + plt.legend() + # plt.show() + fig.savefig(outDir + f'/{figure_title}.png') + plt.close(fig) + + +def autolabel(ax, rects): + """Attach a text label above each bar in *rects*, displaying its height.""" + for rect in rects: + height = rect.get_height() + if height > 0 and height <= 1: # for percent values + text_label = '{:2.0f}'.format(height * 100) + else: + text_label = '{:2.0f}'.format(height) + ax.annotate( + text_label, + xy=(rect.get_x() + rect.get_width() / 2, height), + xytext=(0, 3), # 3 points vertical offset + textcoords='offset points', + ha='center', + va='bottom', + fontsize='x-small', + ) + + +def makebarplot(rs, ps, outDir, class_name, iou_type): + areaNames = ['allarea', 'small', 'medium', 'large'] + types = ['C75', 'C50', 'Loc', 'Sim', 'Oth', 'BG', 'FN'] + fig, ax = plt.subplots() + x = np.arange(len(areaNames)) # the areaNames locations + width = 0.60 # the width of the bars + rects_list = [] + figure_title = iou_type + '-' + class_name + '-' + 'ap bar plot' + for i in range(len(types) - 1): + type_ps = ps[i, ..., 0] + aps = [ps_.mean() for ps_ in type_ps.T] + rects_list.append( + ax.bar( + x - width / 2 + (i + 1) * width / len(types), + aps, + width / len(types), + label=types[i], + )) + + # Add some text for labels, title and custom x-axis tick labels, etc. + ax.set_ylabel('Mean Average Precision (mAP)') + ax.set_title(figure_title) + ax.set_xticks(x) + ax.set_xticklabels(areaNames) + ax.legend() + + # Add score texts over bars + for rects in rects_list: + autolabel(ax, rects) + + # Save plot + fig.savefig(outDir + f'/{figure_title}.png') + plt.close(fig) + + +def get_gt_area_group_numbers(cocoEval): + areaRng = cocoEval.params.areaRng + areaRngStr = [str(aRng) for aRng in areaRng] + areaRngLbl = cocoEval.params.areaRngLbl + areaRngStr2areaRngLbl = dict(zip(areaRngStr, areaRngLbl)) + areaRngLbl2Number = dict.fromkeys(areaRngLbl, 0) + for evalImg in cocoEval.evalImgs: + if evalImg: + for gtIgnore in evalImg['gtIgnore']: + if not gtIgnore: + aRngLbl = areaRngStr2areaRngLbl[str(evalImg['aRng'])] + areaRngLbl2Number[aRngLbl] += 1 + return areaRngLbl2Number + + +def make_gt_area_group_numbers_plot(cocoEval, outDir, verbose=True): + areaRngLbl2Number = get_gt_area_group_numbers(cocoEval) + areaRngLbl = areaRngLbl2Number.keys() + if verbose: + print('number of annotations per area group:', areaRngLbl2Number) + + # Init figure + fig, ax = plt.subplots() + x = np.arange(len(areaRngLbl)) # the areaNames locations + width = 0.60 # the width of the bars + figure_title = 'number of annotations per area group' + + rects = ax.bar(x, areaRngLbl2Number.values(), width) + + # Add some text for labels, title and custom x-axis tick labels, etc. + ax.set_ylabel('Number of annotations') + ax.set_title(figure_title) + ax.set_xticks(x) + ax.set_xticklabels(areaRngLbl) + + # Add score texts over bars + autolabel(ax, rects) + + # Save plot + fig.tight_layout() + fig.savefig(outDir + f'/{figure_title}.png') + plt.close(fig) + + +def make_gt_area_histogram_plot(cocoEval, outDir): + n_bins = 100 + areas = [ann['area'] for ann in cocoEval.cocoGt.anns.values()] + + # init figure + figure_title = 'gt annotation areas histogram plot' + fig, ax = plt.subplots() + + # Set the number of bins + ax.hist(np.sqrt(areas), bins=n_bins) + + # Add some text for labels, title and custom x-axis tick labels, etc. + ax.set_xlabel('Squareroot Area') + ax.set_ylabel('Number of annotations') + ax.set_title(figure_title) + + # Save plot + fig.tight_layout() + fig.savefig(outDir + f'/{figure_title}.png') + plt.close(fig) + + +def analyze_individual_category(k, + cocoDt, + cocoGt, + catId, + iou_type, + areas=None): + nm = cocoGt.loadCats(catId)[0] + print(f'--------------analyzing {k + 1}-{nm["name"]}---------------') + ps_ = {} + dt = copy.deepcopy(cocoDt) + nm = cocoGt.loadCats(catId)[0] + imgIds = cocoGt.getImgIds() + dt_anns = dt.dataset['annotations'] + select_dt_anns = [] + for ann in dt_anns: + if ann['category_id'] == catId: + select_dt_anns.append(ann) + dt.dataset['annotations'] = select_dt_anns + dt.createIndex() + # compute precision but ignore superclass confusion + gt = copy.deepcopy(cocoGt) + child_catIds = gt.getCatIds(supNms=[nm['supercategory']]) + for idx, ann in enumerate(gt.dataset['annotations']): + if ann['category_id'] in child_catIds and ann['category_id'] != catId: + gt.dataset['annotations'][idx]['ignore'] = 1 + gt.dataset['annotations'][idx]['iscrowd'] = 1 + gt.dataset['annotations'][idx]['category_id'] = catId + cocoEval = COCOeval(gt, copy.deepcopy(dt), iou_type) + cocoEval.params.imgIds = imgIds + cocoEval.params.maxDets = [100] + cocoEval.params.iouThrs = [0.1] + cocoEval.params.useCats = 1 + if areas: + cocoEval.params.areaRng = [[0**2, areas[2]], [0**2, areas[0]], + [areas[0], areas[1]], [areas[1], areas[2]]] + cocoEval.evaluate() + cocoEval.accumulate() + ps_supercategory = cocoEval.eval['precision'][0, :, k, :, :] + ps_['ps_supercategory'] = ps_supercategory + # compute precision but ignore any class confusion + gt = copy.deepcopy(cocoGt) + for idx, ann in enumerate(gt.dataset['annotations']): + if ann['category_id'] != catId: + gt.dataset['annotations'][idx]['ignore'] = 1 + gt.dataset['annotations'][idx]['iscrowd'] = 1 + gt.dataset['annotations'][idx]['category_id'] = catId + cocoEval = COCOeval(gt, copy.deepcopy(dt), iou_type) + cocoEval.params.imgIds = imgIds + cocoEval.params.maxDets = [100] + cocoEval.params.iouThrs = [0.1] + cocoEval.params.useCats = 1 + if areas: + cocoEval.params.areaRng = [[0**2, areas[2]], [0**2, areas[0]], + [areas[0], areas[1]], [areas[1], areas[2]]] + cocoEval.evaluate() + cocoEval.accumulate() + ps_allcategory = cocoEval.eval['precision'][0, :, k, :, :] + ps_['ps_allcategory'] = ps_allcategory + return k, ps_ + + +def analyze_results(res_file, + ann_file, + res_types, + out_dir, + extraplots=None, + areas=None): + for res_type in res_types: + assert res_type in ['bbox', 'segm'] + if areas: + assert len(areas) == 3, '3 integers should be specified as areas, \ + representing 3 area regions' + + directory = os.path.dirname(out_dir + '/') + if not os.path.exists(directory): + print(f'-------------create {out_dir}-----------------') + os.makedirs(directory) + + cocoGt = COCO(ann_file) + cocoDt = cocoGt.loadRes(res_file) + imgIds = cocoGt.getImgIds() + for res_type in res_types: + res_out_dir = out_dir + '/' + res_type + '/' + res_directory = os.path.dirname(res_out_dir) + if not os.path.exists(res_directory): + print(f'-------------create {res_out_dir}-----------------') + os.makedirs(res_directory) + iou_type = res_type + cocoEval = COCOeval( + copy.deepcopy(cocoGt), copy.deepcopy(cocoDt), iou_type) + cocoEval.params.imgIds = imgIds + cocoEval.params.iouThrs = [0.75, 0.5, 0.1] + cocoEval.params.maxDets = [100] + if areas: + cocoEval.params.areaRng = [[0**2, areas[2]], [0**2, areas[0]], + [areas[0], areas[1]], + [areas[1], areas[2]]] + cocoEval.evaluate() + cocoEval.accumulate() + ps = cocoEval.eval['precision'] + ps = np.vstack([ps, np.zeros((4, *ps.shape[1:]))]) + catIds = cocoGt.getCatIds() + recThrs = cocoEval.params.recThrs + with Pool(processes=48) as pool: + args = [(k, cocoDt, cocoGt, catId, iou_type, areas) + for k, catId in enumerate(catIds)] + analyze_results = pool.starmap(analyze_individual_category, args) + for k, catId in enumerate(catIds): + nm = cocoGt.loadCats(catId)[0] + print(f'--------------saving {k + 1}-{nm["name"]}---------------') + analyze_result = analyze_results[k] + assert k == analyze_result[0] + ps_supercategory = analyze_result[1]['ps_supercategory'] + ps_allcategory = analyze_result[1]['ps_allcategory'] + # compute precision but ignore superclass confusion + ps[3, :, k, :, :] = ps_supercategory + # compute precision but ignore any class confusion + ps[4, :, k, :, :] = ps_allcategory + # fill in background and false negative errors and plot + ps[ps == -1] = 0 + ps[5, :, k, :, :] = ps[4, :, k, :, :] > 0 + ps[6, :, k, :, :] = 1.0 + makeplot(recThrs, ps[:, :, k], res_out_dir, nm['name'], iou_type) + if extraplots: + makebarplot(recThrs, ps[:, :, k], res_out_dir, nm['name'], + iou_type) + makeplot(recThrs, ps, res_out_dir, 'allclass', iou_type) + if extraplots: + makebarplot(recThrs, ps, res_out_dir, 'allclass', iou_type) + make_gt_area_group_numbers_plot( + cocoEval=cocoEval, outDir=res_out_dir, verbose=True) + make_gt_area_histogram_plot(cocoEval=cocoEval, outDir=res_out_dir) + + +def main(): + parser = ArgumentParser(description='COCO Error Analysis Tool') + parser.add_argument('result', help='result file (json format) path') + parser.add_argument('out_dir', help='dir to save analyze result images') + parser.add_argument( + '--ann', + default='data/coco/annotations/instances_val2017.json', + help='annotation file path') + parser.add_argument( + '--types', type=str, nargs='+', default=['bbox'], help='result types') + parser.add_argument( + '--extraplots', + action='store_true', + help='export extra bar/stat plots') + parser.add_argument( + '--areas', + type=int, + nargs='+', + default=[1024, 9216, 10000000000], + help='area regions') + args = parser.parse_args() + analyze_results( + args.result, + args.ann, + args.types, + out_dir=args.out_dir, + extraplots=args.extraplots, + areas=args.areas) + + +if __name__ == '__main__': + main() diff --git a/tools/analysis_tools/coco_occluded_separated_recall.py b/tools/analysis_tools/coco_occluded_separated_recall.py new file mode 100644 index 0000000..cbc0ee2 --- /dev/null +++ b/tools/analysis_tools/coco_occluded_separated_recall.py @@ -0,0 +1,44 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from argparse import ArgumentParser + +import mmcv +from mmcv.utils import print_log + +from mmdet.datasets import OccludedSeparatedCocoDataset + + +def main(): + parser = ArgumentParser( + description='Compute recall of COCO occluded and separated masks ' + 'presented in paper https://arxiv.org/abs/2210.10046.') + parser.add_argument('result', help='result file (pkl format) path') + parser.add_argument('--out', help='file path to save evaluation results') + parser.add_argument( + '--score-thr', + type=float, + default=0.3, + help='Score threshold for the recall calculation. Defaults to 0.3') + parser.add_argument( + '--iou-thr', + type=float, + default=0.75, + help='IoU threshold for the recall calculation. Defaults to 0.75.') + parser.add_argument( + '--ann', + default='data/coco/annotations/instances_val2017.json', + help='coco annotation file path') + args = parser.parse_args() + + results = mmcv.load(args.result) + assert isinstance(results[0], tuple), \ + 'The results must be predicted by instance segmentation model.' + dataset = OccludedSeparatedCocoDataset( + ann_file=args.ann, pipeline=[], test_mode=True) + metric_res = dataset.evaluate(results) + if args.out is not None: + mmcv.dump(metric_res, args.out) + print_log(f'Evaluation results have been saved to {args.out}.') + + +if __name__ == '__main__': + main() diff --git a/tools/analysis_tools/confusion_matrix copy.py b/tools/analysis_tools/confusion_matrix copy.py new file mode 100644 index 0000000..5b52ea4 --- /dev/null +++ b/tools/analysis_tools/confusion_matrix copy.py @@ -0,0 +1,273 @@ +import argparse +import os + +import matplotlib.pyplot as plt +import mmcv +import numpy as np +from matplotlib.ticker import MultipleLocator +from mmcv import Config, DictAction +from mmcv.ops import nms + +from mmdet.core.evaluation.bbox_overlaps import bbox_overlaps +from mmdet.datasets import build_dataset +from mmdet.utils import replace_cfg_vals, update_data_root + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Generate confusion matrix from detection results') + parser.add_argument('config', help='test config file path') + parser.add_argument( + 'prediction_path', help='prediction path where test .pkl result') + parser.add_argument( + 'save_dir', help='directory where confusion matrix will be saved') + parser.add_argument( + '--show', action='store_true', help='show confusion matrix') + parser.add_argument( + '--color-theme', + default='plasma', + help='theme of the matrix color map') + parser.add_argument( + '--score-thr', + type=float, + default=0.3, + help='score threshold to filter detection bboxes') + parser.add_argument( + '--tp-iou-thr', + type=float, + default=0.5, + help='IoU threshold to be considered as matched') + parser.add_argument( + '--nms-iou-thr', + type=float, + default=None, + help='nms IoU threshold, only applied when users want to change the' + 'nms IoU threshold.') + parser.add_argument( + '--cfg-options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file. If the value to ' + 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + 'Note that the quotation marks are necessary and that no white space ' + 'is allowed.') + args = parser.parse_args() + return args + + +def calculate_confusion_matrix(dataset, + results, + score_thr=0, + nms_iou_thr=None, + tp_iou_thr=0.5): + """Calculate the confusion matrix. + + Args: + dataset (Dataset): Test or val dataset. + results (list[ndarray]): A list of detection results in each image. + score_thr (float|optional): Score threshold to filter bboxes. + Default: 0. + nms_iou_thr (float|optional): nms IoU threshold, the detection results + have done nms in the detector, only applied when users want to + change the nms IoU threshold. Default: None. + tp_iou_thr (float|optional): IoU threshold to be considered as matched. + Default: 0.5. + """ + num_classes = len(dataset.CLASSES) + confusion_matrix = np.zeros(shape=[num_classes + 1, num_classes + 1]) + assert len(dataset) == len(results) + prog_bar = mmcv.ProgressBar(len(results)) + for idx, per_img_res in enumerate(results): + if isinstance(per_img_res, tuple): + res_bboxes, _ = per_img_res + else: + res_bboxes = per_img_res + ann = dataset.get_ann_info(idx) + gt_bboxes = ann['bboxes'] + labels = ann['labels'] + analyze_per_img_dets(confusion_matrix, gt_bboxes, labels, res_bboxes, + score_thr, tp_iou_thr, nms_iou_thr) + prog_bar.update() + return confusion_matrix + + +def analyze_per_img_dets(confusion_matrix, + gt_bboxes, + gt_labels, + result, + score_thr=0, + tp_iou_thr=0.5, + nms_iou_thr=None): + """Analyze detection results on each image. + + Args: + confusion_matrix (ndarray): The confusion matrix, + has shape (num_classes + 1, num_classes + 1). + gt_bboxes (ndarray): Ground truth bboxes, has shape (num_gt, 4). + gt_labels (ndarray): Ground truth labels, has shape (num_gt). + result (ndarray): Detection results, has shape + (num_classes, num_bboxes, 5). + score_thr (float): Score threshold to filter bboxes. + Default: 0. + tp_iou_thr (float): IoU threshold to be considered as matched. + Default: 0.5. + nms_iou_thr (float|optional): nms IoU threshold, the detection results + have done nms in the detector, only applied when users want to + change the nms IoU threshold. Default: None. + """ + true_positives = np.zeros_like(gt_labels) + for det_label, det_bboxes in enumerate(result): + if nms_iou_thr: + det_bboxes, _ = nms( + det_bboxes[:, :4], + det_bboxes[:, -1], + nms_iou_thr, + score_threshold=score_thr) + ious = bbox_overlaps(det_bboxes[:, :4], gt_bboxes) + for i, det_bbox in enumerate(det_bboxes): + score = det_bbox[4] + det_match = 0 + if score >= score_thr: + for j, gt_label in enumerate(gt_labels): + if ious[i, j] >= tp_iou_thr: + det_match += 1 + if gt_label == det_label: + true_positives[j] += 1 # TP + confusion_matrix[gt_label, det_label] += 1 + if det_match == 0: # BG FP + confusion_matrix[-1, det_label] += 1 + for num_tp, gt_label in zip(true_positives, gt_labels): + if num_tp == 0: # FN + confusion_matrix[gt_label, -1] += 1 + + +def plot_confusion_matrix(confusion_matrix, + labels, + save_dir=None, + show=True, + title='Normalized Confusion Matrix', + color_theme='plasma'): + """Draw confusion matrix with matplotlib. + + Args: + confusion_matrix (ndarray): The confusion matrix. + labels (list[str]): List of class names. + save_dir (str|optional): If set, save the confusion matrix plot to the + given path. Default: None. + show (bool): Whether to show the plot. Default: True. + title (str): Title of the plot. Default: `Normalized Confusion Matrix`. + color_theme (str): Theme of the matrix color map. Default: `plasma`. + """ + # normalize the confusion matrix + per_label_sums = confusion_matrix.sum(axis=1)[:, np.newaxis] + confusion_matrix = \ + confusion_matrix.astype(np.float32) / per_label_sums * 100 + + num_classes = len(labels) + fig, ax = plt.subplots( + figsize=(0.5 * num_classes, 0.5 * num_classes * 0.8), dpi=180) + cmap = plt.get_cmap(color_theme) + im = ax.imshow(confusion_matrix, cmap=cmap) + plt.colorbar(mappable=im, ax=ax) + + title_font = {'weight': 'bold', 'size': 12} + ax.set_title(title, fontdict=title_font) + label_font = {'size': 10} + plt.ylabel('Ground Truth Label', fontdict=label_font) + plt.xlabel('Prediction Label', fontdict=label_font) + + # draw locator + xmajor_locator = MultipleLocator(1) + xminor_locator = MultipleLocator(0.5) + ax.xaxis.set_major_locator(xmajor_locator) + ax.xaxis.set_minor_locator(xminor_locator) + ymajor_locator = MultipleLocator(1) + yminor_locator = MultipleLocator(0.5) + ax.yaxis.set_major_locator(ymajor_locator) + ax.yaxis.set_minor_locator(yminor_locator) + + # draw grid + ax.grid(True, which='minor', linestyle='-') + + # draw label + ax.set_xticks(np.arange(num_classes)) + ax.set_yticks(np.arange(num_classes)) + ax.set_xticklabels(labels) + ax.set_yticklabels(labels) + + ax.tick_params( + axis='x', bottom=False, top=True, labelbottom=False, labeltop=True) + plt.setp( + ax.get_xticklabels(), rotation=45, ha='left', rotation_mode='anchor') + + # draw confution matrix value + for i in range(num_classes): + for j in range(num_classes): + ax.text( + j, + i, + '{}%'.format( + int(confusion_matrix[ + i, + j]) if not np.isnan(confusion_matrix[i, j]) else -1), + ha='center', + va='center', + color='w', + size=7) + + ax.set_ylim(len(confusion_matrix) - 0.5, -0.5) # matplotlib>3.1.1 + + fig.tight_layout() + if save_dir is not None: + plt.savefig( + os.path.join(save_dir, 'confusion_matrix.png'), format='png') + if show: + plt.show() + + +def main(): + args = parse_args() + + cfg = Config.fromfile(args.config) + + # replace the ${key} with the value of cfg.key + cfg = replace_cfg_vals(cfg) + + # update data root according to MMDET_DATASETS + update_data_root(cfg) + + if args.cfg_options is not None: + cfg.merge_from_dict(args.cfg_options) + + results = mmcv.load(args.prediction_path) + assert isinstance(results, list) + if isinstance(results[0], list): + pass + elif isinstance(results[0], tuple): + results = [result[0] for result in results] + else: + raise TypeError('invalid type of prediction results') + + if isinstance(cfg.data.test, dict): + cfg.data.test.test_mode = True + elif isinstance(cfg.data.test, list): + for ds_cfg in cfg.data.test: + ds_cfg.test_mode = True + dataset = build_dataset(cfg.data.test) + + confusion_matrix = calculate_confusion_matrix(dataset, results, + args.score_thr, + args.nms_iou_thr, + args.tp_iou_thr) + plot_confusion_matrix( + confusion_matrix, + dataset.CLASSES + ('background', ), + save_dir=args.save_dir, + show=args.show, + color_theme=args.color_theme) + + +if __name__ == '__main__': + main() diff --git a/tools/analysis_tools/confusion_matrix.py b/tools/analysis_tools/confusion_matrix.py new file mode 100644 index 0000000..2b5dd5f --- /dev/null +++ b/tools/analysis_tools/confusion_matrix.py @@ -0,0 +1,313 @@ +import argparse +import os + +import matplotlib.pyplot as plt +import mmcv +import numpy as np +from matplotlib.ticker import MultipleLocator +from mmcv import Config, DictAction +from mmcv.ops import nms + +from mmdet.core.evaluation.bbox_overlaps import bbox_overlaps +from mmdet.datasets import build_dataset +from mmdet.utils import replace_cfg_vals, update_data_root + +# 一下数据都是经过nms后的 +global_tp_special_list = [] +global_cls_wrong_fp_data = [] # cls型FP +global_loc_wrong_fp_data = [] # iou型FP +global_all_pos_sample_data = [] # 记录所有positive sample的IOU(max)情况。iou>0 + +def parse_args(): + parser = argparse.ArgumentParser( + description='Generate confusion matrix from detection results') + parser.add_argument('config', help='test config file path') + parser.add_argument( + 'prediction_path', help='prediction path where test .pkl result') + parser.add_argument( + 'save_dir', help='directory where confusion matrix will be saved') + parser.add_argument( + '--show', action='store_true', help='show confusion matrix') + parser.add_argument( + '--color-theme', + default='plasma', + help='theme of the matrix color map') + parser.add_argument( + '--score-thr', + type=float, + default=0.05, + help='score threshold to filter detection bboxes') + parser.add_argument( + '--tp-iou-thr', + type=float, + default=0.5, + help='IoU threshold to be considered as matched') + parser.add_argument( + '--nms-iou-thr', + type=float, + default=None, + help='nms IoU threshold, only applied when users want to change the' + 'nms IoU threshold.') + parser.add_argument( + '--cfg-options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file. If the value to ' + 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + 'Note that the quotation marks are necessary and that no white space ' + 'is allowed.') + args = parser.parse_args() + return args + + +def calculate_confusion_matrix(dataset, + results, + score_thr=0, + nms_iou_thr=None, + tp_iou_thr=0.5): + """Calculate the confusion matrix. + + Args: + dataset (Dataset): Test or val dataset. + results (list[ndarray]): A list of detection results in each image. + score_thr (float|optional): Score threshold to filter bboxes. + Default: 0. + nms_iou_thr (float|optional): nms IoU threshold, the detection results + have done nms in the detector, only applied when users want to + change the nms IoU threshold. Default: None. + tp_iou_thr (float|optional): IoU threshold to be considered as matched. + Default: 0.5. + """ + num_classes = len(dataset.CLASSES) + confusion_matrix = np.zeros(shape=[num_classes + 1, num_classes + 1]) + assert len(dataset) == len(results) + prog_bar = mmcv.ProgressBar(len(results)) + for idx, per_img_res in enumerate(results): + if isinstance(per_img_res, tuple): + res_bboxes, _ = per_img_res + else: + res_bboxes = per_img_res + ann = dataset.get_ann_info(idx) + gt_bboxes = ann['bboxes'] + labels = ann['labels'] + analyze_per_img_dets(confusion_matrix, gt_bboxes, labels, res_bboxes, + score_thr, tp_iou_thr, nms_iou_thr) + prog_bar.update() + return confusion_matrix + +# here +def analyze_per_img_dets(confusion_matrix, + gt_bboxes, + gt_labels, + result, + score_thr=0, + tp_iou_thr=0.5, + nms_iou_thr=None): + """Analyze detection results on each image. + + Args: + confusion_matrix (ndarray): The confusion matrix, + has shape (num_classes + 1, num_classes + 1). + gt_bboxes (ndarray): Ground truth bboxes, has shape (num_gt, 4). + gt_labels (ndarray): Ground truth labels, has shape (num_gt). + result (ndarray): Detection results, has shape + (num_classes, num_bboxes, 5). + score_thr (float): Score threshold to filter bboxes. + Default: 0. + tp_iou_thr (float): IoU threshold to be considered as matched. + Default: 0.5. + nms_iou_thr (float|optional): nms IoU threshold, the detection results + have done nms in the detector, only applied when users want to + change the nms IoU threshold. Default: None. + """ + global global_tp_special_list + global global_cls_wrong_fp_data + global global_loc_wrong_fp_data + global global_all_pos_sample_data + + true_positives = np.zeros_like(gt_labels) + for det_label, det_bboxes in enumerate(result): # TODO 看一下这个逻辑是啥, results是啥 + if nms_iou_thr: + det_bboxes, _ = nms( + det_bboxes[:, :4], + det_bboxes[:, -1], + nms_iou_thr, + score_threshold=score_thr) + ious = bbox_overlaps(det_bboxes[:, :4], gt_bboxes) + for i, det_bbox in enumerate(det_bboxes): + score = det_bbox[4] + + max_iou = ious[i].max() + if max_iou>0.00001: + # 如果真的有交集,那么就可以统计 + global_all_pos_sample_data.append([score, max_iou]) + det_match = 0 + if score >= score_thr: + for j, gt_label in enumerate(gt_labels): + if ious[i, j] >= tp_iou_thr: + det_match += 1 + if gt_label == det_label: + true_positives[j] += 1 # TP + # XXX 收集一下每个TP的label、confidence、IOU情况?? + global_tp_special_list.append([det_label, score, ious[i, j]]) + else: + # 说明是cls 错误型FP + global_cls_wrong_fp_data.append([score, ious[i, j]]) + + confusion_matrix[gt_label, det_label] += 1 + elif ious[i, j]>0 and gt_label == det_label: + # 说明是IOU不够的 错误型FP + global_loc_wrong_fp_data.append([score, ious[i, j]]) + if det_match == 0: # BG FP + confusion_matrix[-1, det_label] += 1 + for num_tp, gt_label in zip(true_positives, gt_labels): + if num_tp == 0: # FN + confusion_matrix[gt_label, -1] += 1 + + +def plot_confusion_matrix(confusion_matrix, + labels, + save_dir=None, + show=True, + title='Normalized Confusion Matrix', + color_theme='plasma'): + """Draw confusion matrix with matplotlib. + + Args: + confusion_matrix (ndarray): The confusion matrix. + labels (list[str]): List of class names. + save_dir (str|optional): If set, save the confusion matrix plot to the + given path. Default: None. + show (bool): Whether to show the plot. Default: True. + title (str): Title of the plot. Default: `Normalized Confusion Matrix`. + color_theme (str): Theme of the matrix color map. Default: `plasma`. + """ + # normalize the confusion matrix + per_label_sums = confusion_matrix.sum(axis=1)[:, np.newaxis] + confusion_matrix = \ + confusion_matrix.astype(np.float32) / per_label_sums * 100 + + num_classes = len(labels) + fig, ax = plt.subplots( + figsize=(0.5 * num_classes, 0.5 * num_classes * 0.8), dpi=180) + cmap = plt.get_cmap(color_theme) + im = ax.imshow(confusion_matrix, cmap=cmap) + plt.colorbar(mappable=im, ax=ax) + + title_font = {'weight': 'bold', 'size': 12} + ax.set_title(title, fontdict=title_font) + label_font = {'size': 10} + plt.ylabel('Ground Truth Label', fontdict=label_font) + plt.xlabel('Prediction Label', fontdict=label_font) + + # draw locator + xmajor_locator = MultipleLocator(1) + xminor_locator = MultipleLocator(0.5) + ax.xaxis.set_major_locator(xmajor_locator) + ax.xaxis.set_minor_locator(xminor_locator) + ymajor_locator = MultipleLocator(1) + yminor_locator = MultipleLocator(0.5) + ax.yaxis.set_major_locator(ymajor_locator) + ax.yaxis.set_minor_locator(yminor_locator) + + # draw grid + ax.grid(True, which='minor', linestyle='-') + + # draw label + ax.set_xticks(np.arange(num_classes)) + ax.set_yticks(np.arange(num_classes)) + ax.set_xticklabels(labels) + ax.set_yticklabels(labels) + + ax.tick_params( + axis='x', bottom=False, top=True, labelbottom=False, labeltop=True) + plt.setp( + ax.get_xticklabels(), rotation=45, ha='left', rotation_mode='anchor') + + # draw confution matrix value + for i in range(num_classes): + for j in range(num_classes): + ax.text( + j, + i, + '{}%'.format( + int(confusion_matrix[ + i, + j]) if not np.isnan(confusion_matrix[i, j]) else -1), + ha='center', + va='center', + color='w', + size=7) + + ax.set_ylim(len(confusion_matrix) - 0.5, -0.5) # matplotlib>3.1.1 + + fig.tight_layout() + if save_dir is not None: + plt.savefig( + os.path.join(save_dir, 'confusion_matrix.png'), format='png') + + global global_tp_special_list + global global_cls_wrong_fp_data + global global_loc_wrong_fp_data + global global_all_pos_sample_data + + global_tp_special_list = np.array(global_tp_special_list) + np.save(os.path.join(save_dir, 'tp_special_list.npy'), global_tp_special_list) + global_cls_wrong_fp_data = np.array(global_cls_wrong_fp_data) + np.save(os.path.join(save_dir, 'cls_wrong_fp_data.npy'), global_cls_wrong_fp_data) + global_loc_wrong_fp_data = np.array(global_loc_wrong_fp_data) + np.save(os.path.join(save_dir, 'loc_wrong_fp_data.npy'), global_loc_wrong_fp_data) + global_all_pos_sample_data = np.array(global_all_pos_sample_data) + np.save(os.path.join(save_dir, 'all_pos_sample_data.npy'), global_all_pos_sample_data) + + + if show: + plt.show() + + +def main(): + args = parse_args() + + cfg = Config.fromfile(args.config) + + # replace the ${key} with the value of cfg.key + cfg = replace_cfg_vals(cfg) + + # update data root according to MMDET_DATASETS + update_data_root(cfg) + + if args.cfg_options is not None: + cfg.merge_from_dict(args.cfg_options) + + results = mmcv.load(args.prediction_path) + assert isinstance(results, list) + if isinstance(results[0], list): + pass + elif isinstance(results[0], tuple): + results = [result[0] for result in results] + else: + raise TypeError('invalid type of prediction results') + + if isinstance(cfg.data.test, dict): + cfg.data.test.test_mode = True + elif isinstance(cfg.data.test, list): + for ds_cfg in cfg.data.test: + ds_cfg.test_mode = True + dataset = build_dataset(cfg.data.test) + + confusion_matrix = calculate_confusion_matrix(dataset, results, + args.score_thr, + args.nms_iou_thr, + args.tp_iou_thr) + plot_confusion_matrix( + confusion_matrix, + dataset.CLASSES + ('background', ), + save_dir=args.save_dir, + show=args.show, + color_theme=args.color_theme) + + +if __name__ == '__main__': + main() diff --git a/tools/analysis_tools/eval_metric.py b/tools/analysis_tools/eval_metric.py new file mode 100644 index 0000000..7caafe9 --- /dev/null +++ b/tools/analysis_tools/eval_metric.py @@ -0,0 +1,88 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse + +import mmcv +from mmcv import Config, DictAction + +from mmdet.datasets import build_dataset +from mmdet.utils import replace_cfg_vals, update_data_root + + +def parse_args(): + parser = argparse.ArgumentParser(description='Evaluate metric of the ' + 'results saved in pkl format') + parser.add_argument('config', help='Config of the model') + parser.add_argument('pkl_results', help='Results in pickle format') + parser.add_argument( + '--format-only', + action='store_true', + help='Format the output results without perform evaluation. It is' + 'useful when you want to format the result to a specific format and ' + 'submit it to the test server') + parser.add_argument( + '--eval', + type=str, + nargs='+', + help='Evaluation metrics, which depends on the dataset, e.g., "bbox",' + ' "segm", "proposal" for COCO, and "mAP", "recall" for PASCAL VOC') + parser.add_argument( + '--cfg-options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file. If the value to ' + 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + 'Note that the quotation marks are necessary and that no white space ' + 'is allowed.') + parser.add_argument( + '--eval-options', + nargs='+', + action=DictAction, + help='custom options for evaluation, the key-value pair in xxx=yyy ' + 'format will be kwargs for dataset.evaluate() function') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + + cfg = Config.fromfile(args.config) + + # replace the ${key} with the value of cfg.key + cfg = replace_cfg_vals(cfg) + + # update data root according to MMDET_DATASETS + update_data_root(cfg) + + assert args.eval or args.format_only, ( + 'Please specify at least one operation (eval/format the results) with ' + 'the argument "--eval", "--format-only"') + if args.eval and args.format_only: + raise ValueError('--eval and --format_only cannot be both specified') + + if args.cfg_options is not None: + cfg.merge_from_dict(args.cfg_options) + cfg.data.test.test_mode = True + + dataset = build_dataset(cfg.data.test) + outputs = mmcv.load(args.pkl_results) + + kwargs = {} if args.eval_options is None else args.eval_options + if args.format_only: + dataset.format_results(outputs, **kwargs) + if args.eval: + eval_kwargs = cfg.get('evaluation', {}).copy() + # hard-code way to remove EvalHook args + for key in [ + 'interval', 'tmpdir', 'start', 'gpu_collect', 'save_best', + 'rule' + ]: + eval_kwargs.pop(key, None) + eval_kwargs.update(dict(metric=args.eval, **kwargs)) + print(dataset.evaluate(outputs, **eval_kwargs)) + + +if __name__ == '__main__': + main() diff --git a/tools/analysis_tools/get_flops.py b/tools/analysis_tools/get_flops.py new file mode 100644 index 0000000..4df8732 --- /dev/null +++ b/tools/analysis_tools/get_flops.py @@ -0,0 +1,97 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse + +import numpy as np +import torch +from mmcv import Config, DictAction + +from mmdet.models import build_detector + +try: + from mmcv.cnn import get_model_complexity_info +except ImportError: + raise ImportError('Please upgrade mmcv to >0.6.2') + + +def parse_args(): + parser = argparse.ArgumentParser(description='Train a detector') + parser.add_argument('config', help='train config file path') + parser.add_argument( + '--shape', + type=int, + nargs='+', + default=[1280, 800], + help='input image size') + parser.add_argument( + '--cfg-options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file. If the value to ' + 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + 'Note that the quotation marks are necessary and that no white space ' + 'is allowed.') + parser.add_argument( + '--size-divisor', + type=int, + default=32, + help='Pad the input image, the minimum size that is divisible ' + 'by size_divisor, -1 means do not pad the image.') + args = parser.parse_args() + return args + + +def main(): + + args = parse_args() + + if len(args.shape) == 1: + h = w = args.shape[0] + elif len(args.shape) == 2: + h, w = args.shape + else: + raise ValueError('invalid input shape') + ori_shape = (3, h, w) + divisor = args.size_divisor + if divisor > 0: + h = int(np.ceil(h / divisor)) * divisor + w = int(np.ceil(w / divisor)) * divisor + + input_shape = (3, h, w) + + cfg = Config.fromfile(args.config) + if args.cfg_options is not None: + cfg.merge_from_dict(args.cfg_options) + + model = build_detector( + cfg.model, + train_cfg=cfg.get('train_cfg'), + test_cfg=cfg.get('test_cfg')) + if torch.cuda.is_available(): + model.cuda() + model.eval() + + if hasattr(model, 'forward_dummy'): + model.forward = model.forward_dummy + else: + raise NotImplementedError( + 'FLOPs counter is currently not currently supported with {}'. + format(model.__class__.__name__)) + + flops, params = get_model_complexity_info(model, input_shape) + split_line = '=' * 30 + + if divisor > 0 and \ + input_shape != ori_shape: + print(f'{split_line}\nUse size divisor set input shape ' + f'from {ori_shape} to {input_shape}\n') + print(f'{split_line}\nInput shape: {input_shape}\n' + f'Flops: {flops}\nParams: {params}\n{split_line}') + print('!!!Please be cautious if you use the results in papers. ' + 'You may need to check if all ops are supported and verify that the ' + 'flops computation is correct.') + + +if __name__ == '__main__': + main() diff --git a/tools/analysis_tools/optimize_anchors.py b/tools/analysis_tools/optimize_anchors.py new file mode 100644 index 0000000..421998f --- /dev/null +++ b/tools/analysis_tools/optimize_anchors.py @@ -0,0 +1,376 @@ +# Copyright (c) OpenMMLab. All rights reserved. +"""Optimize anchor settings on a specific dataset. + +This script provides two method to optimize YOLO anchors including k-means +anchor cluster and differential evolution. You can use ``--algorithm k-means`` +and ``--algorithm differential_evolution`` to switch two method. + +Example: + Use k-means anchor cluster:: + + python tools/analysis_tools/optimize_anchors.py ${CONFIG} \ + --algorithm k-means --input-shape ${INPUT_SHAPE [WIDTH HEIGHT]} \ + --output-dir ${OUTPUT_DIR} + Use differential evolution to optimize anchors:: + + python tools/analysis_tools/optimize_anchors.py ${CONFIG} \ + --algorithm differential_evolution \ + --input-shape ${INPUT_SHAPE [WIDTH HEIGHT]} \ + --output-dir ${OUTPUT_DIR} +""" +import argparse +import os.path as osp + +import mmcv +import numpy as np +import torch +from mmcv import Config +from scipy.optimize import differential_evolution + +from mmdet.core import bbox_cxcywh_to_xyxy, bbox_overlaps, bbox_xyxy_to_cxcywh +from mmdet.datasets import build_dataset +from mmdet.utils import get_root_logger, replace_cfg_vals, update_data_root + + +def parse_args(): + parser = argparse.ArgumentParser(description='Optimize anchor parameters.') + parser.add_argument('config', help='Train config file path.') + parser.add_argument( + '--device', default='cuda:0', help='Device used for calculating.') + parser.add_argument( + '--input-shape', + type=int, + nargs='+', + default=[608, 608], + help='input image size') + parser.add_argument( + '--algorithm', + default='differential_evolution', + help='Algorithm used for anchor optimizing.' + 'Support k-means and differential_evolution for YOLO.') + parser.add_argument( + '--iters', + default=1000, + type=int, + help='Maximum iterations for optimizer.') + parser.add_argument( + '--output-dir', + default=None, + type=str, + help='Path to save anchor optimize result.') + + args = parser.parse_args() + return args + + +class BaseAnchorOptimizer: + """Base class for anchor optimizer. + + Args: + dataset (obj:`Dataset`): Dataset object. + input_shape (list[int]): Input image shape of the model. + Format in [width, height]. + logger (obj:`logging.Logger`): The logger for logging. + device (str, optional): Device used for calculating. + Default: 'cuda:0' + out_dir (str, optional): Path to save anchor optimize result. + Default: None + """ + + def __init__(self, + dataset, + input_shape, + logger, + device='cuda:0', + out_dir=None): + self.dataset = dataset + self.input_shape = input_shape + self.logger = logger + self.device = device + self.out_dir = out_dir + bbox_whs, img_shapes = self.get_whs_and_shapes() + ratios = img_shapes.max(1, keepdims=True) / np.array([input_shape]) + + # resize to input shape + self.bbox_whs = bbox_whs / ratios + + def get_whs_and_shapes(self): + """Get widths and heights of bboxes and shapes of images. + + Returns: + tuple[np.ndarray]: Array of bbox shapes and array of image + shapes with shape (num_bboxes, 2) in [width, height] format. + """ + self.logger.info('Collecting bboxes from annotation...') + bbox_whs = [] + img_shapes = [] + prog_bar = mmcv.ProgressBar(len(self.dataset)) + for idx in range(len(self.dataset)): + ann = self.dataset.get_ann_info(idx) + data_info = self.dataset.data_infos[idx] + img_shape = np.array([data_info['width'], data_info['height']]) + gt_bboxes = ann['bboxes'] + for bbox in gt_bboxes: + wh = bbox[2:4] - bbox[0:2] + img_shapes.append(img_shape) + bbox_whs.append(wh) + prog_bar.update() + print('\n') + bbox_whs = np.array(bbox_whs) + img_shapes = np.array(img_shapes) + self.logger.info(f'Collected {bbox_whs.shape[0]} bboxes.') + return bbox_whs, img_shapes + + def get_zero_center_bbox_tensor(self): + """Get a tensor of bboxes centered at (0, 0). + + Returns: + Tensor: Tensor of bboxes with shape (num_bboxes, 4) + in [xmin, ymin, xmax, ymax] format. + """ + whs = torch.from_numpy(self.bbox_whs).to( + self.device, dtype=torch.float32) + bboxes = bbox_cxcywh_to_xyxy( + torch.cat([torch.zeros_like(whs), whs], dim=1)) + return bboxes + + def optimize(self): + raise NotImplementedError + + def save_result(self, anchors, path=None): + anchor_results = [] + for w, h in anchors: + anchor_results.append([round(w), round(h)]) + self.logger.info(f'Anchor optimize result:{anchor_results}') + if path: + json_path = osp.join(path, 'anchor_optimize_result.json') + mmcv.dump(anchor_results, json_path) + self.logger.info(f'Result saved in {json_path}') + + +class YOLOKMeansAnchorOptimizer(BaseAnchorOptimizer): + r"""YOLO anchor optimizer using k-means. Code refer to `AlexeyAB/darknet. + `_. + + Args: + num_anchors (int) : Number of anchors. + iters (int): Maximum iterations for k-means. + """ + + def __init__(self, num_anchors, iters, **kwargs): + + super(YOLOKMeansAnchorOptimizer, self).__init__(**kwargs) + self.num_anchors = num_anchors + self.iters = iters + + def optimize(self): + anchors = self.kmeans_anchors() + self.save_result(anchors, self.out_dir) + + def kmeans_anchors(self): + self.logger.info( + f'Start cluster {self.num_anchors} YOLO anchors with K-means...') + bboxes = self.get_zero_center_bbox_tensor() + cluster_center_idx = torch.randint( + 0, bboxes.shape[0], (self.num_anchors, )).to(self.device) + + assignments = torch.zeros((bboxes.shape[0], )).to(self.device) + cluster_centers = bboxes[cluster_center_idx] + if self.num_anchors == 1: + cluster_centers = self.kmeans_maximization(bboxes, assignments, + cluster_centers) + anchors = bbox_xyxy_to_cxcywh(cluster_centers)[:, 2:].cpu().numpy() + anchors = sorted(anchors, key=lambda x: x[0] * x[1]) + return anchors + + prog_bar = mmcv.ProgressBar(self.iters) + for i in range(self.iters): + converged, assignments = self.kmeans_expectation( + bboxes, assignments, cluster_centers) + if converged: + self.logger.info(f'K-means process has converged at iter {i}.') + break + cluster_centers = self.kmeans_maximization(bboxes, assignments, + cluster_centers) + prog_bar.update() + print('\n') + avg_iou = bbox_overlaps(bboxes, + cluster_centers).max(1)[0].mean().item() + + anchors = bbox_xyxy_to_cxcywh(cluster_centers)[:, 2:].cpu().numpy() + anchors = sorted(anchors, key=lambda x: x[0] * x[1]) + self.logger.info(f'Anchor cluster finish. Average IOU: {avg_iou}') + + return anchors + + def kmeans_maximization(self, bboxes, assignments, centers): + """Maximization part of EM algorithm(Expectation-Maximization)""" + new_centers = torch.zeros_like(centers) + for i in range(centers.shape[0]): + mask = (assignments == i) + if mask.sum(): + new_centers[i, :] = bboxes[mask].mean(0) + return new_centers + + def kmeans_expectation(self, bboxes, assignments, centers): + """Expectation part of EM algorithm(Expectation-Maximization)""" + ious = bbox_overlaps(bboxes, centers) + closest = ious.argmax(1) + converged = (closest == assignments).all() + return converged, closest + + +class YOLODEAnchorOptimizer(BaseAnchorOptimizer): + """YOLO anchor optimizer using differential evolution algorithm. + + Args: + num_anchors (int) : Number of anchors. + iters (int): Maximum iterations for k-means. + strategy (str): The differential evolution strategy to use. + Should be one of: + + - 'best1bin' + - 'best1exp' + - 'rand1exp' + - 'randtobest1exp' + - 'currenttobest1exp' + - 'best2exp' + - 'rand2exp' + - 'randtobest1bin' + - 'currenttobest1bin' + - 'best2bin' + - 'rand2bin' + - 'rand1bin' + + Default: 'best1bin'. + population_size (int): Total population size of evolution algorithm. + Default: 15. + convergence_thr (float): Tolerance for convergence, the + optimizing stops when ``np.std(pop) <= abs(convergence_thr) + + convergence_thr * np.abs(np.mean(population_energies))``, + respectively. Default: 0.0001. + mutation (tuple[float]): Range of dithering randomly changes the + mutation constant. Default: (0.5, 1). + recombination (float): Recombination constant of crossover probability. + Default: 0.7. + """ + + def __init__(self, + num_anchors, + iters, + strategy='best1bin', + population_size=15, + convergence_thr=0.0001, + mutation=(0.5, 1), + recombination=0.7, + **kwargs): + + super(YOLODEAnchorOptimizer, self).__init__(**kwargs) + + self.num_anchors = num_anchors + self.iters = iters + self.strategy = strategy + self.population_size = population_size + self.convergence_thr = convergence_thr + self.mutation = mutation + self.recombination = recombination + + def optimize(self): + anchors = self.differential_evolution() + self.save_result(anchors, self.out_dir) + + def differential_evolution(self): + bboxes = self.get_zero_center_bbox_tensor() + + bounds = [] + for i in range(self.num_anchors): + bounds.extend([(0, self.input_shape[0]), (0, self.input_shape[1])]) + + result = differential_evolution( + func=self.avg_iou_cost, + bounds=bounds, + args=(bboxes, ), + strategy=self.strategy, + maxiter=self.iters, + popsize=self.population_size, + tol=self.convergence_thr, + mutation=self.mutation, + recombination=self.recombination, + updating='immediate', + disp=True) + self.logger.info( + f'Anchor evolution finish. Average IOU: {1 - result.fun}') + anchors = [(w, h) for w, h in zip(result.x[::2], result.x[1::2])] + anchors = sorted(anchors, key=lambda x: x[0] * x[1]) + return anchors + + @staticmethod + def avg_iou_cost(anchor_params, bboxes): + assert len(anchor_params) % 2 == 0 + anchor_whs = torch.tensor( + [[w, h] + for w, h in zip(anchor_params[::2], anchor_params[1::2])]).to( + bboxes.device, dtype=bboxes.dtype) + anchor_boxes = bbox_cxcywh_to_xyxy( + torch.cat([torch.zeros_like(anchor_whs), anchor_whs], dim=1)) + ious = bbox_overlaps(bboxes, anchor_boxes) + max_ious, _ = ious.max(1) + cost = 1 - max_ious.mean().item() + return cost + + +def main(): + logger = get_root_logger() + args = parse_args() + cfg = args.config + cfg = Config.fromfile(cfg) + + # replace the ${key} with the value of cfg.key + cfg = replace_cfg_vals(cfg) + + # update data root according to MMDET_DATASETS + update_data_root(cfg) + + input_shape = args.input_shape + assert len(input_shape) == 2 + + anchor_type = cfg.model.bbox_head.anchor_generator.type + assert anchor_type == 'YOLOAnchorGenerator', \ + f'Only support optimize YOLOAnchor, but get {anchor_type}.' + + base_sizes = cfg.model.bbox_head.anchor_generator.base_sizes + num_anchors = sum([len(sizes) for sizes in base_sizes]) + + train_data_cfg = cfg.data.train + while 'dataset' in train_data_cfg: + train_data_cfg = train_data_cfg['dataset'] + dataset = build_dataset(train_data_cfg) + + if args.algorithm == 'k-means': + optimizer = YOLOKMeansAnchorOptimizer( + dataset=dataset, + input_shape=input_shape, + device=args.device, + num_anchors=num_anchors, + iters=args.iters, + logger=logger, + out_dir=args.output_dir) + elif args.algorithm == 'differential_evolution': + optimizer = YOLODEAnchorOptimizer( + dataset=dataset, + input_shape=input_shape, + device=args.device, + num_anchors=num_anchors, + iters=args.iters, + logger=logger, + out_dir=args.output_dir) + else: + raise NotImplementedError( + f'Only support k-means and differential_evolution, ' + f'but get {args.algorithm}') + + optimizer.optimize() + + +if __name__ == '__main__': + main() diff --git a/tools/analysis_tools/plot_pr_curves.py b/tools/analysis_tools/plot_pr_curves.py new file mode 100644 index 0000000..ecc9be2 --- /dev/null +++ b/tools/analysis_tools/plot_pr_curves.py @@ -0,0 +1,102 @@ +import os +import sys +import mmcv +import numpy as np +import argparse +import matplotlib.pyplot as plt + +from pycocotools.coco import COCO +from pycocotools.cocoeval import COCOeval + +from mmcv import Config +from mmdet.datasets import build_dataset + + +def plot_pr_curve(config_file, result_file, out_pic, metric="bbox"): + """plot precison-recall curve based on testing results of pkl file. + + Args: + config_file (list[list | tuple]): config file path. + result_file (str): pkl file of testing results path. + metric (str): Metrics to be evaluated. Options are + 'bbox', 'segm'. + """ + + cfg = Config.fromfile(config_file) + # turn on test mode of dataset + if isinstance(cfg.data.test, dict): + cfg.data.test.test_mode = True + elif isinstance(cfg.data.test, list): + for ds_cfg in cfg.data.test: + ds_cfg.test_mode = True + + # build dataset + dataset = build_dataset(cfg.data.test) + # load result file in pkl format + pkl_results = mmcv.load(result_file) + # convert pkl file (list[list | tuple | ndarray]) to json + json_results, _ = dataset.format_results(pkl_results) + # initialize COCO instance + coco = COCO(annotation_file=cfg.data.test.ann_file) + coco_gt = coco + coco_dt = coco_gt.loadRes(json_results[metric]) + # initialize COCOeval instance + coco_eval = COCOeval(coco_gt, coco_dt, metric) + coco_eval.evaluate() + coco_eval.accumulate() + coco_eval.summarize() + # extract eval data + precisions = coco_eval.eval["precision"] + ''' + precisions[T, R, K, A, M] + T: iou thresholds [0.5 : 0.05 : 0.95], idx from 0 to 9 + R: recall thresholds [0 : 0.01 : 1], idx from 0 to 100 + K: category, idx from 0 to ... + A: area range, (all, small, medium, large), idx from 0 to 3 + M: max dets, (1, 10, 100), idx from 0 to 2 + ''' + pr_array1 = precisions[0, :, 0, 0, 2] + pr_array2 = precisions[1, :, 0, 0, 2] + pr_array3 = precisions[2, :, 0, 0, 2] + pr_array4 = precisions[3, :, 0, 0, 2] + pr_array5 = precisions[4, :, 0, 0, 2] + pr_array6 = precisions[5, :, 0, 0, 2] + pr_array7 = precisions[6, :, 0, 0, 2] + pr_array8 = precisions[7, :, 0, 0, 2] + pr_array9 = precisions[8, :, 0, 0, 2] + pr_array10 = precisions[9, :, 0, 0, 2] + + x = np.arange(0.0, 1.01, 0.01) + # plot PR curve + plt.plot(x, pr_array1, label="iou=0.5") + plt.plot(x, pr_array2, label="iou=0.55") + plt.plot(x, pr_array3, label="iou=0.6") + plt.plot(x, pr_array4, label="iou=0.65") + plt.plot(x, pr_array5, label="iou=0.7") + plt.plot(x, pr_array6, label="iou=0.75") + plt.plot(x, pr_array7, label="iou=0.8") + plt.plot(x, pr_array8, label="iou=0.85") + plt.plot(x, pr_array9, label="iou=0.9") + plt.plot(x, pr_array10, label="iou=0.95") + + plt.xlabel("recall") + plt.ylabel("precison") + plt.xlim(0, 1.0) + plt.ylim(0, 1.01) + plt.grid(True) + legend_entity = plt.legend(loc="lower right") + for handle in legend_entity.legendHandles: + # handle.set_sizes([30]) + handle.set_alpha(0.5) + plt.savefig(out_pic) + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('config', help='config file path') + parser.add_argument('pkl_result_file', help='pkl result file path') + parser.add_argument('--out', default='pr_curve.png') + parser.add_argument('--eval', default='bbox') + cfg = parser.parse_args() + + plot_pr_curve(config_file=cfg.config, result_file=cfg.pkl_result_file, out_pic=cfg.out, metric=cfg.eval) + diff --git a/tools/analysis_tools/robustness_eval.py b/tools/analysis_tools/robustness_eval.py new file mode 100644 index 0000000..da5ec28 --- /dev/null +++ b/tools/analysis_tools/robustness_eval.py @@ -0,0 +1,251 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import os.path as osp +from argparse import ArgumentParser + +import mmcv +import numpy as np + + +def print_coco_results(results): + + def _print(result, ap=1, iouThr=None, areaRng='all', maxDets=100): + titleStr = 'Average Precision' if ap == 1 else 'Average Recall' + typeStr = '(AP)' if ap == 1 else '(AR)' + iouStr = '0.50:0.95' \ + if iouThr is None else f'{iouThr:0.2f}' + iStr = f' {titleStr:<18} {typeStr} @[ IoU={iouStr:<9} | ' + iStr += f'area={areaRng:>6s} | maxDets={maxDets:>3d} ] = {result:0.3f}' + print(iStr) + + stats = np.zeros((12, )) + stats[0] = _print(results[0], 1) + stats[1] = _print(results[1], 1, iouThr=.5) + stats[2] = _print(results[2], 1, iouThr=.75) + stats[3] = _print(results[3], 1, areaRng='small') + stats[4] = _print(results[4], 1, areaRng='medium') + stats[5] = _print(results[5], 1, areaRng='large') + stats[6] = _print(results[6], 0, maxDets=1) + stats[7] = _print(results[7], 0, maxDets=10) + stats[8] = _print(results[8], 0) + stats[9] = _print(results[9], 0, areaRng='small') + stats[10] = _print(results[10], 0, areaRng='medium') + stats[11] = _print(results[11], 0, areaRng='large') + + +def get_coco_style_results(filename, + task='bbox', + metric=None, + prints='mPC', + aggregate='benchmark'): + + assert aggregate in ['benchmark', 'all'] + + if prints == 'all': + prints = ['P', 'mPC', 'rPC'] + elif isinstance(prints, str): + prints = [prints] + for p in prints: + assert p in ['P', 'mPC', 'rPC'] + + if metric is None: + metrics = [ + 'AP', 'AP50', 'AP75', 'APs', 'APm', 'APl', 'AR1', 'AR10', 'AR100', + 'ARs', 'ARm', 'ARl' + ] + elif isinstance(metric, list): + metrics = metric + else: + metrics = [metric] + + for metric_name in metrics: + assert metric_name in [ + 'AP', 'AP50', 'AP75', 'APs', 'APm', 'APl', 'AR1', 'AR10', 'AR100', + 'ARs', 'ARm', 'ARl' + ] + + eval_output = mmcv.load(filename) + + num_distortions = len(list(eval_output.keys())) + results = np.zeros((num_distortions, 6, len(metrics)), dtype='float32') + + for corr_i, distortion in enumerate(eval_output): + for severity in eval_output[distortion]: + for metric_j, metric_name in enumerate(metrics): + mAP = eval_output[distortion][severity][task][metric_name] + results[corr_i, severity, metric_j] = mAP + + P = results[0, 0, :] + if aggregate == 'benchmark': + mPC = np.mean(results[:15, 1:, :], axis=(0, 1)) + else: + mPC = np.mean(results[:, 1:, :], axis=(0, 1)) + rPC = mPC / P + + print(f'\nmodel: {osp.basename(filename)}') + if metric is None: + if 'P' in prints: + print(f'Performance on Clean Data [P] ({task})') + print_coco_results(P) + if 'mPC' in prints: + print(f'Mean Performance under Corruption [mPC] ({task})') + print_coco_results(mPC) + if 'rPC' in prints: + print(f'Relative Performance under Corruption [rPC] ({task})') + print_coco_results(rPC) + else: + if 'P' in prints: + print(f'Performance on Clean Data [P] ({task})') + for metric_i, metric_name in enumerate(metrics): + print(f'{metric_name:5} = {P[metric_i]:0.3f}') + if 'mPC' in prints: + print(f'Mean Performance under Corruption [mPC] ({task})') + for metric_i, metric_name in enumerate(metrics): + print(f'{metric_name:5} = {mPC[metric_i]:0.3f}') + if 'rPC' in prints: + print(f'Relative Performance under Corruption [rPC] ({task})') + for metric_i, metric_name in enumerate(metrics): + print(f'{metric_name:5} => {rPC[metric_i] * 100:0.1f} %') + + return results + + +def get_voc_style_results(filename, prints='mPC', aggregate='benchmark'): + + assert aggregate in ['benchmark', 'all'] + + if prints == 'all': + prints = ['P', 'mPC', 'rPC'] + elif isinstance(prints, str): + prints = [prints] + for p in prints: + assert p in ['P', 'mPC', 'rPC'] + + eval_output = mmcv.load(filename) + + num_distortions = len(list(eval_output.keys())) + results = np.zeros((num_distortions, 6, 20), dtype='float32') + + for i, distortion in enumerate(eval_output): + for severity in eval_output[distortion]: + mAP = [ + eval_output[distortion][severity][j]['ap'] + for j in range(len(eval_output[distortion][severity])) + ] + results[i, severity, :] = mAP + + P = results[0, 0, :] + if aggregate == 'benchmark': + mPC = np.mean(results[:15, 1:, :], axis=(0, 1)) + else: + mPC = np.mean(results[:, 1:, :], axis=(0, 1)) + rPC = mPC / P + + print(f'\nmodel: {osp.basename(filename)}') + if 'P' in prints: + print(f'Performance on Clean Data [P] in AP50 = {np.mean(P):0.3f}') + if 'mPC' in prints: + print('Mean Performance under Corruption [mPC] in AP50 = ' + f'{np.mean(mPC):0.3f}') + if 'rPC' in prints: + print('Relative Performance under Corruption [rPC] in % = ' + f'{np.mean(rPC) * 100:0.1f}') + + return np.mean(results, axis=2, keepdims=True) + + +def get_results(filename, + dataset='coco', + task='bbox', + metric=None, + prints='mPC', + aggregate='benchmark'): + assert dataset in ['coco', 'voc', 'cityscapes'] + + if dataset in ['coco', 'cityscapes']: + results = get_coco_style_results( + filename, + task=task, + metric=metric, + prints=prints, + aggregate=aggregate) + elif dataset == 'voc': + if task != 'bbox': + print('Only bbox analysis is supported for Pascal VOC') + print('Will report bbox results\n') + if metric not in [None, ['AP'], ['AP50']]: + print('Only the AP50 metric is supported for Pascal VOC') + print('Will report AP50 metric\n') + results = get_voc_style_results( + filename, prints=prints, aggregate=aggregate) + + return results + + +def get_distortions_from_file(filename): + + eval_output = mmcv.load(filename) + + return get_distortions_from_results(eval_output) + + +def get_distortions_from_results(eval_output): + distortions = [] + for i, distortion in enumerate(eval_output): + distortions.append(distortion.replace('_', ' ')) + return distortions + + +def main(): + parser = ArgumentParser(description='Corruption Result Analysis') + parser.add_argument('filename', help='result file path') + parser.add_argument( + '--dataset', + type=str, + choices=['coco', 'voc', 'cityscapes'], + default='coco', + help='dataset type') + parser.add_argument( + '--task', + type=str, + nargs='+', + choices=['bbox', 'segm'], + default=['bbox'], + help='task to report') + parser.add_argument( + '--metric', + nargs='+', + choices=[ + None, 'AP', 'AP50', 'AP75', 'APs', 'APm', 'APl', 'AR1', 'AR10', + 'AR100', 'ARs', 'ARm', 'ARl' + ], + default=None, + help='metric to report') + parser.add_argument( + '--prints', + type=str, + nargs='+', + choices=['P', 'mPC', 'rPC'], + default='mPC', + help='corruption benchmark metric to print') + parser.add_argument( + '--aggregate', + type=str, + choices=['all', 'benchmark'], + default='benchmark', + help='aggregate all results or only those \ + for benchmark corruptions') + + args = parser.parse_args() + + for task in args.task: + get_results( + args.filename, + dataset=args.dataset, + task=task, + metric=args.metric, + prints=args.prints, + aggregate=args.aggregate) + + +if __name__ == '__main__': + main() diff --git a/tools/analysis_tools/test_robustness.py b/tools/analysis_tools/test_robustness.py new file mode 100644 index 0000000..0c1ddbe --- /dev/null +++ b/tools/analysis_tools/test_robustness.py @@ -0,0 +1,387 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import copy +import os +import os.path as osp + +import mmcv +import torch +from mmcv import DictAction +from mmcv.parallel import MMDataParallel, MMDistributedDataParallel +from mmcv.runner import (get_dist_info, init_dist, load_checkpoint, + wrap_fp16_model) +from pycocotools.coco import COCO +from pycocotools.cocoeval import COCOeval + +from mmdet import datasets +from mmdet.apis import multi_gpu_test, set_random_seed, single_gpu_test +from mmdet.core import eval_map +from mmdet.datasets import build_dataloader, build_dataset +from mmdet.models import build_detector +from tools.analysis_tools.robustness_eval import get_results + + +def coco_eval_with_return(result_files, + result_types, + coco, + max_dets=(100, 300, 1000)): + for res_type in result_types: + assert res_type in ['proposal', 'bbox', 'segm', 'keypoints'] + + if mmcv.is_str(coco): + coco = COCO(coco) + assert isinstance(coco, COCO) + + eval_results = {} + for res_type in result_types: + result_file = result_files[res_type] + assert result_file.endswith('.json') + + coco_dets = coco.loadRes(result_file) + img_ids = coco.getImgIds() + iou_type = 'bbox' if res_type == 'proposal' else res_type + cocoEval = COCOeval(coco, coco_dets, iou_type) + cocoEval.params.imgIds = img_ids + if res_type == 'proposal': + cocoEval.params.useCats = 0 + cocoEval.params.maxDets = list(max_dets) + cocoEval.evaluate() + cocoEval.accumulate() + cocoEval.summarize() + if res_type == 'segm' or res_type == 'bbox': + metric_names = [ + 'AP', 'AP50', 'AP75', 'APs', 'APm', 'APl', 'AR1', 'AR10', + 'AR100', 'ARs', 'ARm', 'ARl' + ] + eval_results[res_type] = { + metric_names[i]: cocoEval.stats[i] + for i in range(len(metric_names)) + } + else: + eval_results[res_type] = cocoEval.stats + + return eval_results + + +def voc_eval_with_return(result_file, + dataset, + iou_thr=0.5, + logger='print', + only_ap=True): + det_results = mmcv.load(result_file) + annotations = [dataset.get_ann_info(i) for i in range(len(dataset))] + if hasattr(dataset, 'year') and dataset.year == 2007: + dataset_name = 'voc07' + else: + dataset_name = dataset.CLASSES + mean_ap, eval_results = eval_map( + det_results, + annotations, + scale_ranges=None, + iou_thr=iou_thr, + dataset=dataset_name, + logger=logger) + + if only_ap: + eval_results = [{ + 'ap': eval_results[i]['ap'] + } for i in range(len(eval_results))] + + return mean_ap, eval_results + + +def parse_args(): + parser = argparse.ArgumentParser(description='MMDet test detector') + parser.add_argument('config', help='test config file path') + parser.add_argument('checkpoint', help='checkpoint file') + parser.add_argument('--out', help='output result file') + parser.add_argument( + '--corruptions', + type=str, + nargs='+', + default='benchmark', + choices=[ + 'all', 'benchmark', 'noise', 'blur', 'weather', 'digital', + 'holdout', 'None', 'gaussian_noise', 'shot_noise', 'impulse_noise', + 'defocus_blur', 'glass_blur', 'motion_blur', 'zoom_blur', 'snow', + 'frost', 'fog', 'brightness', 'contrast', 'elastic_transform', + 'pixelate', 'jpeg_compression', 'speckle_noise', 'gaussian_blur', + 'spatter', 'saturate' + ], + help='corruptions') + parser.add_argument( + '--severities', + type=int, + nargs='+', + default=[0, 1, 2, 3, 4, 5], + help='corruption severity levels') + parser.add_argument( + '--eval', + type=str, + nargs='+', + choices=['proposal', 'proposal_fast', 'bbox', 'segm', 'keypoints'], + help='eval types') + parser.add_argument( + '--iou-thr', + type=float, + default=0.5, + help='IoU threshold for pascal voc evaluation') + parser.add_argument( + '--summaries', + type=bool, + default=False, + help='Print summaries for every corruption and severity') + parser.add_argument( + '--workers', type=int, default=32, help='workers per gpu') + parser.add_argument('--show', action='store_true', help='show results') + parser.add_argument( + '--show-dir', help='directory where painted images will be saved') + parser.add_argument( + '--show-score-thr', + type=float, + default=0.3, + help='score threshold (default: 0.3)') + parser.add_argument('--tmpdir', help='tmp dir for writing some results') + parser.add_argument('--seed', type=int, default=None, help='random seed') + parser.add_argument( + '--launcher', + choices=['none', 'pytorch', 'slurm', 'mpi'], + default='none', + help='job launcher') + parser.add_argument('--local_rank', type=int, default=0) + parser.add_argument( + '--final-prints', + type=str, + nargs='+', + choices=['P', 'mPC', 'rPC'], + default='mPC', + help='corruption benchmark metric to print at the end') + parser.add_argument( + '--final-prints-aggregate', + type=str, + choices=['all', 'benchmark'], + default='benchmark', + help='aggregate all results or only those for benchmark corruptions') + parser.add_argument( + '--cfg-options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file. If the value to ' + 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + 'Note that the quotation marks are necessary and that no white space ' + 'is allowed.') + args = parser.parse_args() + if 'LOCAL_RANK' not in os.environ: + os.environ['LOCAL_RANK'] = str(args.local_rank) + return args + + +def main(): + args = parse_args() + + assert args.out or args.show or args.show_dir, \ + ('Please specify at least one operation (save or show the results) ' + 'with the argument "--out", "--show" or "show-dir"') + + if args.out is not None and not args.out.endswith(('.pkl', '.pickle')): + raise ValueError('The output file must be a pkl file.') + + cfg = mmcv.Config.fromfile(args.config) + if args.cfg_options is not None: + cfg.merge_from_dict(args.cfg_options) + # set cudnn_benchmark + if cfg.get('cudnn_benchmark', False): + torch.backends.cudnn.benchmark = True + cfg.model.pretrained = None + cfg.data.test.test_mode = True + if args.workers == 0: + args.workers = cfg.data.workers_per_gpu + + # init distributed env first, since logger depends on the dist info. + if args.launcher == 'none': + distributed = False + else: + distributed = True + init_dist(args.launcher, **cfg.dist_params) + + # set random seeds + if args.seed is not None: + set_random_seed(args.seed) + + if 'all' in args.corruptions: + corruptions = [ + 'gaussian_noise', 'shot_noise', 'impulse_noise', 'defocus_blur', + 'glass_blur', 'motion_blur', 'zoom_blur', 'snow', 'frost', 'fog', + 'brightness', 'contrast', 'elastic_transform', 'pixelate', + 'jpeg_compression', 'speckle_noise', 'gaussian_blur', 'spatter', + 'saturate' + ] + elif 'benchmark' in args.corruptions: + corruptions = [ + 'gaussian_noise', 'shot_noise', 'impulse_noise', 'defocus_blur', + 'glass_blur', 'motion_blur', 'zoom_blur', 'snow', 'frost', 'fog', + 'brightness', 'contrast', 'elastic_transform', 'pixelate', + 'jpeg_compression' + ] + elif 'noise' in args.corruptions: + corruptions = ['gaussian_noise', 'shot_noise', 'impulse_noise'] + elif 'blur' in args.corruptions: + corruptions = [ + 'defocus_blur', 'glass_blur', 'motion_blur', 'zoom_blur' + ] + elif 'weather' in args.corruptions: + corruptions = ['snow', 'frost', 'fog', 'brightness'] + elif 'digital' in args.corruptions: + corruptions = [ + 'contrast', 'elastic_transform', 'pixelate', 'jpeg_compression' + ] + elif 'holdout' in args.corruptions: + corruptions = ['speckle_noise', 'gaussian_blur', 'spatter', 'saturate'] + elif 'None' in args.corruptions: + corruptions = ['None'] + args.severities = [0] + else: + corruptions = args.corruptions + + rank, _ = get_dist_info() + aggregated_results = {} + for corr_i, corruption in enumerate(corruptions): + aggregated_results[corruption] = {} + for sev_i, corruption_severity in enumerate(args.severities): + # evaluate severity 0 (= no corruption) only once + if corr_i > 0 and corruption_severity == 0: + aggregated_results[corruption][0] = \ + aggregated_results[corruptions[0]][0] + continue + + test_data_cfg = copy.deepcopy(cfg.data.test) + # assign corruption and severity + if corruption_severity > 0: + corruption_trans = dict( + type='Corrupt', + corruption=corruption, + severity=corruption_severity) + # TODO: hard coded "1", we assume that the first step is + # loading images, which needs to be fixed in the future + test_data_cfg['pipeline'].insert(1, corruption_trans) + + # print info + print(f'\nTesting {corruption} at severity {corruption_severity}') + + # build the dataloader + # TODO: support multiple images per gpu + # (only minor changes are needed) + dataset = build_dataset(test_data_cfg) + data_loader = build_dataloader( + dataset, + samples_per_gpu=1, + workers_per_gpu=args.workers, + dist=distributed, + shuffle=False) + + # build the model and load checkpoint + cfg.model.train_cfg = None + model = build_detector(cfg.model, test_cfg=cfg.get('test_cfg')) + fp16_cfg = cfg.get('fp16', None) + if fp16_cfg is not None: + wrap_fp16_model(model) + checkpoint = load_checkpoint( + model, args.checkpoint, map_location='cpu') + # old versions did not save class info in checkpoints, + # this walkaround is for backward compatibility + if 'CLASSES' in checkpoint.get('meta', {}): + model.CLASSES = checkpoint['meta']['CLASSES'] + else: + model.CLASSES = dataset.CLASSES + + if not distributed: + model = MMDataParallel(model, device_ids=[0]) + show_dir = args.show_dir + if show_dir is not None: + show_dir = osp.join(show_dir, corruption) + show_dir = osp.join(show_dir, str(corruption_severity)) + if not osp.exists(show_dir): + osp.makedirs(show_dir) + outputs = single_gpu_test(model, data_loader, args.show, + show_dir, args.show_score_thr) + else: + model = MMDistributedDataParallel( + model.cuda(), + device_ids=[torch.cuda.current_device()], + broadcast_buffers=False) + outputs = multi_gpu_test(model, data_loader, args.tmpdir) + + if args.out and rank == 0: + eval_results_filename = ( + osp.splitext(args.out)[0] + '_results' + + osp.splitext(args.out)[1]) + mmcv.dump(outputs, args.out) + eval_types = args.eval + if cfg.dataset_type == 'VOCDataset': + if eval_types: + for eval_type in eval_types: + if eval_type == 'bbox': + test_dataset = mmcv.runner.obj_from_dict( + cfg.data.test, datasets) + logger = 'print' if args.summaries else None + mean_ap, eval_results = \ + voc_eval_with_return( + args.out, test_dataset, + args.iou_thr, logger) + aggregated_results[corruption][ + corruption_severity] = eval_results + else: + print('\nOnly "bbox" evaluation \ + is supported for pascal voc') + else: + if eval_types: + print(f'Starting evaluate {" and ".join(eval_types)}') + if eval_types == ['proposal_fast']: + result_file = args.out + else: + if not isinstance(outputs[0], dict): + result_files = dataset.results2json( + outputs, args.out) + else: + for name in outputs[0]: + print(f'\nEvaluating {name}') + outputs_ = [out[name] for out in outputs] + result_file = args.out + + f'.{name}' + result_files = dataset.results2json( + outputs_, result_file) + eval_results = coco_eval_with_return( + result_files, eval_types, dataset.coco) + aggregated_results[corruption][ + corruption_severity] = eval_results + else: + print('\nNo task was selected for evaluation;' + '\nUse --eval to select a task') + + # save results after each evaluation + mmcv.dump(aggregated_results, eval_results_filename) + + if rank == 0: + # print final results + print('\nAggregated results:') + prints = args.final_prints + aggregate = args.final_prints_aggregate + + if cfg.dataset_type == 'VOCDataset': + get_results( + eval_results_filename, + dataset='voc', + prints=prints, + aggregate=aggregate) + else: + get_results( + eval_results_filename, + dataset='coco', + prints=prints, + aggregate=aggregate) + + +if __name__ == '__main__': + main() diff --git a/tools/confusion_matrix.sh b/tools/confusion_matrix.sh new file mode 100644 index 0000000..38b8fe9 --- /dev/null +++ b/tools/confusion_matrix.sh @@ -0,0 +1,37 @@ +# python tools/analysis_tools/confusion_matrix.py \ +# configs/ssd/ssdlite_mobilenetv2_scratch_600e_voc.py \ +# work_dirs/ssdlite_mobilenetv2_scratch_600e_voc/results.pkl \ +# work_dirs/ssdlite_mobilenetv2_scratch_600e_voc \ + +# python tools/analysis_tools/confusion_matrix.py \ +# work_dirs/retinanet_r18_fpn_1x_voc/retinanet_r18_fpn_1x_voc.py \ +# work_dirs/retinanet_r18_fpn_1x_voc/results.pkl \ +# work_dirs/retinanet_r18_fpn_1x_voc \ + +# python tools/analysis_tools/confusion_matrix.py \ +# work_dirs/retinanet_r18_fpn_voc_w4a4_LSQ/retinanet_r18_fpn_1x_voc_quant_w4a4.py \ +# work_dirs/retinanet_r18_fpn_voc_w4a4_LSQ/best_bbox_mAP_epoch_16.pkl \ +# work_dirs/retinanet_r18_fpn_voc_w4a4_LSQ \ + + +# python tools/analysis_tools/confusion_matrix.py \ +# work_dirs/retinanet_r18_fpn_voc_w2a2_LSQ/retinanet_r18_fpn_1x_voc_quant_w2a2.py \ +# work_dirs/retinanet_r18_fpn_voc_w2a2_LSQ/best_bbox_mAP_epoch_15.pkl \ +# work_dirs/retinanet_r18_fpn_voc_w2a2_LSQ \ + +# python tools/analysis_tools/confusion_matrix.py \ +# work_dirs/retinanet_r50_fpn_1x_voc/retinanet_r50_fpn_1x_voc.py \ +# work_dirs/retinanet_r50_fpn_1x_voc/results.pkl \ +# work_dirs/retinanet_r50_fpn_1x_voc \ + +# python tools/analysis_tools/confusion_matrix.py \ +# work_dirs/retinanet_r50_fpn_voc_w4a4_LSQ/retinanet_r50_fpn_1x_voc_quant_w4a4.py \ +# work_dirs/retinanet_r50_fpn_voc_w4a4_LSQ/best_bbox_mAP_epoch_15.pkl \ +# work_dirs/retinanet_r50_fpn_voc_w4a4_LSQ \ + +python tools/analysis_tools/confusion_matrix.py \ + work_dirs/retinanet_r50_fpn_voc_w2a2_LSQ_le/retinanet_r50_fpn_1x_voc_quant_w2a2.py \ + work_dirs/retinanet_r50_fpn_voc_w2a2_LSQ_le/best_bbox_mAP_epoch_17.pkl \ + work_dirs/retinanet_r50_fpn_voc_w2a2_LSQ_le \ + + diff --git a/tools/confusion_matrix1.sh b/tools/confusion_matrix1.sh new file mode 100644 index 0000000..1748550 --- /dev/null +++ b/tools/confusion_matrix1.sh @@ -0,0 +1,10 @@ +python tools/analysis_tools/confusion_matrix.py \ + # split + configs/ssd/ssdlite_mobilenetv2_scratch_600e_voc.py \ + work_dirs/ssdlite_mobilenetv2_scratch_600e_voc/results.pkl \ + work_dirs/ssdlite_mobilenetv2_scratch_600e_voc \ + # split + # configs/ssd/ssdlite_mobilenetv2_scratch_600e_voc.py \ + # work_dirs/ssdlite_mobilenetv2_scratch_600e_voc/results.pkl \ + # work_dirs/ssdlite_mobilenetv2_scratch_600e_voc \ + diff --git a/tools/dataset_converters/cityscapes.py b/tools/dataset_converters/cityscapes.py new file mode 100644 index 0000000..c8e44b9 --- /dev/null +++ b/tools/dataset_converters/cityscapes.py @@ -0,0 +1,152 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import glob +import os.path as osp + +import cityscapesscripts.helpers.labels as CSLabels +import mmcv +import numpy as np +import pycocotools.mask as maskUtils + + +def collect_files(img_dir, gt_dir): + suffix = 'leftImg8bit.png' + files = [] + for img_file in glob.glob(osp.join(img_dir, '**/*.png')): + assert img_file.endswith(suffix), img_file + inst_file = gt_dir + img_file[ + len(img_dir):-len(suffix)] + 'gtFine_instanceIds.png' + # Note that labelIds are not converted to trainId for seg map + segm_file = gt_dir + img_file[ + len(img_dir):-len(suffix)] + 'gtFine_labelIds.png' + files.append((img_file, inst_file, segm_file)) + assert len(files), f'No images found in {img_dir}' + print(f'Loaded {len(files)} images from {img_dir}') + + return files + + +def collect_annotations(files, nproc=1): + print('Loading annotation images') + if nproc > 1: + images = mmcv.track_parallel_progress( + load_img_info, files, nproc=nproc) + else: + images = mmcv.track_progress(load_img_info, files) + + return images + + +def load_img_info(files): + img_file, inst_file, segm_file = files + inst_img = mmcv.imread(inst_file, 'unchanged') + # ids < 24 are stuff labels (filtering them first is about 5% faster) + unique_inst_ids = np.unique(inst_img[inst_img >= 24]) + anno_info = [] + for inst_id in unique_inst_ids: + # For non-crowd annotations, inst_id // 1000 is the label_id + # Crowd annotations have <1000 instance ids + label_id = inst_id // 1000 if inst_id >= 1000 else inst_id + label = CSLabels.id2label[label_id] + if not label.hasInstances or label.ignoreInEval: + continue + + category_id = label.id + iscrowd = int(inst_id < 1000) + mask = np.asarray(inst_img == inst_id, dtype=np.uint8, order='F') + mask_rle = maskUtils.encode(mask[:, :, None])[0] + + area = maskUtils.area(mask_rle) + # convert to COCO style XYWH format + bbox = maskUtils.toBbox(mask_rle) + + # for json encoding + mask_rle['counts'] = mask_rle['counts'].decode() + + anno = dict( + iscrowd=iscrowd, + category_id=category_id, + bbox=bbox.tolist(), + area=area.tolist(), + segmentation=mask_rle) + anno_info.append(anno) + video_name = osp.basename(osp.dirname(img_file)) + img_info = dict( + # remove img_prefix for filename + file_name=osp.join(video_name, osp.basename(img_file)), + height=inst_img.shape[0], + width=inst_img.shape[1], + anno_info=anno_info, + segm_file=osp.join(video_name, osp.basename(segm_file))) + + return img_info + + +def cvt_annotations(image_infos, out_json_name): + out_json = dict() + img_id = 0 + ann_id = 0 + out_json['images'] = [] + out_json['categories'] = [] + out_json['annotations'] = [] + for image_info in image_infos: + image_info['id'] = img_id + anno_infos = image_info.pop('anno_info') + out_json['images'].append(image_info) + for anno_info in anno_infos: + anno_info['image_id'] = img_id + anno_info['id'] = ann_id + out_json['annotations'].append(anno_info) + ann_id += 1 + img_id += 1 + for label in CSLabels.labels: + if label.hasInstances and not label.ignoreInEval: + cat = dict(id=label.id, name=label.name) + out_json['categories'].append(cat) + + if len(out_json['annotations']) == 0: + out_json.pop('annotations') + + mmcv.dump(out_json, out_json_name) + return out_json + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert Cityscapes annotations to COCO format') + parser.add_argument('cityscapes_path', help='cityscapes data path') + parser.add_argument('--img-dir', default='leftImg8bit', type=str) + parser.add_argument('--gt-dir', default='gtFine', type=str) + parser.add_argument('-o', '--out-dir', help='output path') + parser.add_argument( + '--nproc', default=1, type=int, help='number of process') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + cityscapes_path = args.cityscapes_path + out_dir = args.out_dir if args.out_dir else cityscapes_path + mmcv.mkdir_or_exist(out_dir) + + img_dir = osp.join(cityscapes_path, args.img_dir) + gt_dir = osp.join(cityscapes_path, args.gt_dir) + + set_name = dict( + train='instancesonly_filtered_gtFine_train.json', + val='instancesonly_filtered_gtFine_val.json', + test='instancesonly_filtered_gtFine_test.json') + + for split, json_name in set_name.items(): + print(f'Converting {split} into {json_name}') + with mmcv.Timer( + print_tmpl='It took {}s to convert Cityscapes annotation'): + files = collect_files( + osp.join(img_dir, split), osp.join(gt_dir, split)) + image_infos = collect_annotations(files, nproc=args.nproc) + cvt_annotations(image_infos, osp.join(out_dir, json_name)) + + +if __name__ == '__main__': + main() diff --git a/tools/dataset_converters/images2coco.py b/tools/dataset_converters/images2coco.py new file mode 100644 index 0000000..1c4e2f1 --- /dev/null +++ b/tools/dataset_converters/images2coco.py @@ -0,0 +1,101 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os + +import mmcv +from PIL import Image + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert images to coco format without annotations') + parser.add_argument('img_path', help='The root path of images') + parser.add_argument( + 'classes', type=str, help='The text file name of storage class list') + parser.add_argument( + 'out', + type=str, + help='The output annotation json file name, The save dir is in the ' + 'same directory as img_path') + parser.add_argument( + '-e', + '--exclude-extensions', + type=str, + nargs='+', + help='The suffix of images to be excluded, such as "png" and "bmp"') + args = parser.parse_args() + return args + + +def collect_image_infos(path, exclude_extensions=None): + img_infos = [] + + images_generator = mmcv.scandir(path, recursive=True) + for image_path in mmcv.track_iter_progress(list(images_generator)): + if exclude_extensions is None or ( + exclude_extensions is not None + and not image_path.lower().endswith(exclude_extensions)): + image_path = os.path.join(path, image_path) + img_pillow = Image.open(image_path) + img_info = { + 'filename': image_path, + 'width': img_pillow.width, + 'height': img_pillow.height, + } + img_infos.append(img_info) + return img_infos + + +def cvt_to_coco_json(img_infos, classes): + image_id = 0 + coco = dict() + coco['images'] = [] + coco['type'] = 'instance' + coco['categories'] = [] + coco['annotations'] = [] + image_set = set() + + for category_id, name in enumerate(classes): + category_item = dict() + category_item['supercategory'] = str('none') + category_item['id'] = int(category_id) + category_item['name'] = str(name) + coco['categories'].append(category_item) + + for img_dict in img_infos: + file_name = img_dict['filename'] + assert file_name not in image_set + image_item = dict() + image_item['id'] = int(image_id) + image_item['file_name'] = str(file_name) + image_item['height'] = int(img_dict['height']) + image_item['width'] = int(img_dict['width']) + coco['images'].append(image_item) + image_set.add(file_name) + + image_id += 1 + return coco + + +def main(): + args = parse_args() + assert args.out.endswith( + 'json'), 'The output file name must be json suffix' + + # 1 load image list info + img_infos = collect_image_infos(args.img_path, args.exclude_extensions) + + # 2 convert to coco format data + classes = mmcv.list_from_file(args.classes) + coco_info = cvt_to_coco_json(img_infos, classes) + + # 3 dump + save_dir = os.path.join(args.img_path, '..', 'annotations') + mmcv.mkdir_or_exist(save_dir) + save_path = os.path.join(save_dir, args.out) + mmcv.dump(coco_info, save_path) + print(f'save json file: {save_path}') + + +if __name__ == '__main__': + main() diff --git a/tools/dataset_converters/pascal_voc.py b/tools/dataset_converters/pascal_voc.py new file mode 100644 index 0000000..20f8801 --- /dev/null +++ b/tools/dataset_converters/pascal_voc.py @@ -0,0 +1,237 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os.path as osp +import xml.etree.ElementTree as ET + +import mmcv +import numpy as np + +from mmdet.core import voc_classes + +label_ids = {name: i for i, name in enumerate(voc_classes())} + + +def parse_xml(args): + xml_path, img_path = args + tree = ET.parse(xml_path) + root = tree.getroot() + size = root.find('size') + w = int(size.find('width').text) + h = int(size.find('height').text) + bboxes = [] + labels = [] + bboxes_ignore = [] + labels_ignore = [] + for obj in root.findall('object'): + name = obj.find('name').text + label = label_ids[name] + difficult = int(obj.find('difficult').text) + bnd_box = obj.find('bndbox') + bbox = [ + int(bnd_box.find('xmin').text), + int(bnd_box.find('ymin').text), + int(bnd_box.find('xmax').text), + int(bnd_box.find('ymax').text) + ] + if difficult: + bboxes_ignore.append(bbox) + labels_ignore.append(label) + else: + bboxes.append(bbox) + labels.append(label) + if not bboxes: + bboxes = np.zeros((0, 4)) + labels = np.zeros((0, )) + else: + bboxes = np.array(bboxes, ndmin=2) - 1 + labels = np.array(labels) + if not bboxes_ignore: + bboxes_ignore = np.zeros((0, 4)) + labels_ignore = np.zeros((0, )) + else: + bboxes_ignore = np.array(bboxes_ignore, ndmin=2) - 1 + labels_ignore = np.array(labels_ignore) + annotation = { + 'filename': img_path, + 'width': w, + 'height': h, + 'ann': { + 'bboxes': bboxes.astype(np.float32), + 'labels': labels.astype(np.int64), + 'bboxes_ignore': bboxes_ignore.astype(np.float32), + 'labels_ignore': labels_ignore.astype(np.int64) + } + } + return annotation + + +def cvt_annotations(devkit_path, years, split, out_file): + if not isinstance(years, list): + years = [years] + annotations = [] + for year in years: + filelist = osp.join(devkit_path, + f'VOC{year}/ImageSets/Main/{split}.txt') + if not osp.isfile(filelist): + print(f'filelist does not exist: {filelist}, ' + f'skip voc{year} {split}') + return + img_names = mmcv.list_from_file(filelist) + xml_paths = [ + osp.join(devkit_path, f'VOC{year}/Annotations/{img_name}.xml') + for img_name in img_names + ] + img_paths = [ + f'VOC{year}/JPEGImages/{img_name}.jpg' for img_name in img_names + ] + part_annotations = mmcv.track_progress(parse_xml, + list(zip(xml_paths, img_paths))) + annotations.extend(part_annotations) + if out_file.endswith('json'): + annotations = cvt_to_coco_json(annotations) + mmcv.dump(annotations, out_file) + return annotations + + +def cvt_to_coco_json(annotations): + image_id = 0 + annotation_id = 0 + coco = dict() + coco['images'] = [] + coco['type'] = 'instance' + coco['categories'] = [] + coco['annotations'] = [] + image_set = set() + + def addAnnItem(annotation_id, image_id, category_id, bbox, difficult_flag): + annotation_item = dict() + annotation_item['segmentation'] = [] + + seg = [] + # bbox[] is x1,y1,x2,y2 + # left_top + seg.append(int(bbox[0])) + seg.append(int(bbox[1])) + # left_bottom + seg.append(int(bbox[0])) + seg.append(int(bbox[3])) + # right_bottom + seg.append(int(bbox[2])) + seg.append(int(bbox[3])) + # right_top + seg.append(int(bbox[2])) + seg.append(int(bbox[1])) + + annotation_item['segmentation'].append(seg) + + xywh = np.array( + [bbox[0], bbox[1], bbox[2] - bbox[0], bbox[3] - bbox[1]]) + annotation_item['area'] = int(xywh[2] * xywh[3]) + if difficult_flag == 1: + annotation_item['ignore'] = 0 + annotation_item['iscrowd'] = 1 + else: + annotation_item['ignore'] = 0 + annotation_item['iscrowd'] = 0 + annotation_item['image_id'] = int(image_id) + annotation_item['bbox'] = xywh.astype(int).tolist() + annotation_item['category_id'] = int(category_id) + annotation_item['id'] = int(annotation_id) + coco['annotations'].append(annotation_item) + return annotation_id + 1 + + for category_id, name in enumerate(voc_classes()): + category_item = dict() + category_item['supercategory'] = str('none') + category_item['id'] = int(category_id) + category_item['name'] = str(name) + coco['categories'].append(category_item) + + for ann_dict in annotations: + file_name = ann_dict['filename'] + ann = ann_dict['ann'] + assert file_name not in image_set + image_item = dict() + image_item['id'] = int(image_id) + image_item['file_name'] = str(file_name) + image_item['height'] = int(ann_dict['height']) + image_item['width'] = int(ann_dict['width']) + coco['images'].append(image_item) + image_set.add(file_name) + + bboxes = ann['bboxes'][:, :4] + labels = ann['labels'] + for bbox_id in range(len(bboxes)): + bbox = bboxes[bbox_id] + label = labels[bbox_id] + annotation_id = addAnnItem( + annotation_id, image_id, label, bbox, difficult_flag=0) + + bboxes_ignore = ann['bboxes_ignore'][:, :4] + labels_ignore = ann['labels_ignore'] + for bbox_id in range(len(bboxes_ignore)): + bbox = bboxes_ignore[bbox_id] + label = labels_ignore[bbox_id] + annotation_id = addAnnItem( + annotation_id, image_id, label, bbox, difficult_flag=1) + + image_id += 1 + + return coco + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert PASCAL VOC annotations to mmdetection format') + parser.add_argument('devkit_path', help='pascal voc devkit path') + parser.add_argument('-o', '--out-dir', help='output path') + parser.add_argument( + '--out-format', + default='pkl', + choices=('pkl', 'coco'), + help='output format, "coco" indicates coco annotation format') + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + devkit_path = args.devkit_path + out_dir = args.out_dir if args.out_dir else devkit_path + mmcv.mkdir_or_exist(out_dir) + + years = [] + if osp.isdir(osp.join(devkit_path, 'VOC2007')): + years.append('2007') + if osp.isdir(osp.join(devkit_path, 'VOC2012')): + years.append('2012') + if '2007' in years and '2012' in years: + years.append(['2007', '2012']) + if not years: + raise IOError(f'The devkit path {devkit_path} contains neither ' + '"VOC2007" nor "VOC2012" subfolder') + out_fmt = f'.{args.out_format}' + if args.out_format == 'coco': + out_fmt = '.json' + for year in years: + if year == '2007': + prefix = 'voc07' + elif year == '2012': + prefix = 'voc12' + elif year == ['2007', '2012']: + prefix = 'voc0712' + for split in ['train', 'val', 'trainval']: + dataset_name = prefix + '_' + split + print(f'processing {dataset_name} ...') + cvt_annotations(devkit_path, year, split, + osp.join(out_dir, dataset_name + out_fmt)) + if not isinstance(year, list): + dataset_name = prefix + '_test' + print(f'processing {dataset_name} ...') + cvt_annotations(devkit_path, year, 'test', + osp.join(out_dir, dataset_name + out_fmt)) + print('Done!') + + +if __name__ == '__main__': + main() diff --git a/tools/deployment/mmdet2torchserve.py b/tools/deployment/mmdet2torchserve.py new file mode 100644 index 0000000..70a081a --- /dev/null +++ b/tools/deployment/mmdet2torchserve.py @@ -0,0 +1,110 @@ +# Copyright (c) OpenMMLab. All rights reserved. +from argparse import ArgumentParser, Namespace +from pathlib import Path +from tempfile import TemporaryDirectory + +import mmcv + +try: + from model_archiver.model_packaging import package_model + from model_archiver.model_packaging_utils import ModelExportUtils +except ImportError: + package_model = None + + +def mmdet2torchserve( + config_file: str, + checkpoint_file: str, + output_folder: str, + model_name: str, + model_version: str = '1.0', + force: bool = False, +): + """Converts MMDetection model (config + checkpoint) to TorchServe `.mar`. + + Args: + config_file: + In MMDetection config format. + The contents vary for each task repository. + checkpoint_file: + In MMDetection checkpoint format. + The contents vary for each task repository. + output_folder: + Folder where `{model_name}.mar` will be created. + The file created will be in TorchServe archive format. + model_name: + If not None, used for naming the `{model_name}.mar` file + that will be created under `output_folder`. + If None, `{Path(checkpoint_file).stem}` will be used. + model_version: + Model's version. + force: + If True, if there is an existing `{model_name}.mar` + file under `output_folder` it will be overwritten. + """ + mmcv.mkdir_or_exist(output_folder) + + config = mmcv.Config.fromfile(config_file) + + with TemporaryDirectory() as tmpdir: + config.dump(f'{tmpdir}/config.py') + + args = Namespace( + **{ + 'model_file': f'{tmpdir}/config.py', + 'serialized_file': checkpoint_file, + 'handler': f'{Path(__file__).parent}/mmdet_handler.py', + 'model_name': model_name or Path(checkpoint_file).stem, + 'version': model_version, + 'export_path': output_folder, + 'force': force, + 'requirements_file': None, + 'extra_files': None, + 'runtime': 'python', + 'archive_format': 'default' + }) + manifest = ModelExportUtils.generate_manifest_json(args) + package_model(args, manifest) + + +def parse_args(): + parser = ArgumentParser( + description='Convert MMDetection models to TorchServe `.mar` format.') + parser.add_argument('config', type=str, help='config file path') + parser.add_argument('checkpoint', type=str, help='checkpoint file path') + parser.add_argument( + '--output-folder', + type=str, + required=True, + help='Folder where `{model_name}.mar` will be created.') + parser.add_argument( + '--model-name', + type=str, + default=None, + help='If not None, used for naming the `{model_name}.mar`' + 'file that will be created under `output_folder`.' + 'If None, `{Path(checkpoint_file).stem}` will be used.') + parser.add_argument( + '--model-version', + type=str, + default='1.0', + help='Number used for versioning.') + parser.add_argument( + '-f', + '--force', + action='store_true', + help='overwrite the existing `{model_name}.mar`') + args = parser.parse_args() + + return args + + +if __name__ == '__main__': + args = parse_args() + + if package_model is None: + raise ImportError('`torch-model-archiver` is required.' + 'Try: pip install torch-model-archiver') + + mmdet2torchserve(args.config, args.checkpoint, args.output_folder, + args.model_name, args.model_version, args.force) diff --git a/tools/deployment/mmdet_handler.py b/tools/deployment/mmdet_handler.py new file mode 100644 index 0000000..18fc230 --- /dev/null +++ b/tools/deployment/mmdet_handler.py @@ -0,0 +1,71 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import base64 +import os + +import mmcv +import torch +from ts.torch_handler.base_handler import BaseHandler + +from mmdet.apis import inference_detector, init_detector + + +class MMdetHandler(BaseHandler): + threshold = 0.5 + + def initialize(self, context): + properties = context.system_properties + self.map_location = 'cuda' if torch.cuda.is_available() else 'cpu' + self.device = torch.device(self.map_location + ':' + + str(properties.get('gpu_id')) if torch.cuda. + is_available() else self.map_location) + self.manifest = context.manifest + + model_dir = properties.get('model_dir') + serialized_file = self.manifest['model']['serializedFile'] + checkpoint = os.path.join(model_dir, serialized_file) + self.config_file = os.path.join(model_dir, 'config.py') + + self.model = init_detector(self.config_file, checkpoint, self.device) + self.initialized = True + + def preprocess(self, data): + images = [] + + for row in data: + image = row.get('data') or row.get('body') + if isinstance(image, str): + image = base64.b64decode(image) + image = mmcv.imfrombytes(image) + images.append(image) + + return images + + def inference(self, data, *args, **kwargs): + results = inference_detector(self.model, data) + return results + + def postprocess(self, data): + # Format output following the example ObjectDetectionHandler format + output = [] + for image_index, image_result in enumerate(data): + output.append([]) + if isinstance(image_result, tuple): + bbox_result, segm_result = image_result + if isinstance(segm_result, tuple): + segm_result = segm_result[0] # ms rcnn + else: + bbox_result, segm_result = image_result, None + + for class_index, class_result in enumerate(bbox_result): + class_name = self.model.CLASSES[class_index] + for bbox in class_result: + bbox_coords = bbox[:-1].tolist() + score = float(bbox[-1]) + if score >= self.threshold: + output[image_index].append({ + 'class_name': class_name, + 'bbox': bbox_coords, + 'score': score + }) + + return output diff --git a/tools/deployment/onnx2tensorrt.py b/tools/deployment/onnx2tensorrt.py new file mode 100644 index 0000000..b59e52a --- /dev/null +++ b/tools/deployment/onnx2tensorrt.py @@ -0,0 +1,266 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os +import os.path as osp +import warnings + +import numpy as np +import onnx +import torch +from mmcv import Config +from mmcv.tensorrt import is_tensorrt_plugin_loaded, onnx2trt, save_trt_engine + +from mmdet.core.export import preprocess_example_input +from mmdet.core.export.model_wrappers import (ONNXRuntimeDetector, + TensorRTDetector) +from mmdet.datasets import DATASETS + + +def get_GiB(x: int): + """return x GiB.""" + return x * (1 << 30) + + +def onnx2tensorrt(onnx_file, + trt_file, + input_config, + verify=False, + show=False, + workspace_size=1, + verbose=False): + import tensorrt as trt + onnx_model = onnx.load(onnx_file) + max_shape = input_config['max_shape'] + min_shape = input_config['min_shape'] + opt_shape = input_config['opt_shape'] + fp16_mode = False + # create trt engine and wrapper + opt_shape_dict = {'input': [min_shape, opt_shape, max_shape]} + max_workspace_size = get_GiB(workspace_size) + trt_engine = onnx2trt( + onnx_model, + opt_shape_dict, + log_level=trt.Logger.VERBOSE if verbose else trt.Logger.ERROR, + fp16_mode=fp16_mode, + max_workspace_size=max_workspace_size) + save_dir, _ = osp.split(trt_file) + if save_dir: + os.makedirs(save_dir, exist_ok=True) + save_trt_engine(trt_engine, trt_file) + print(f'Successfully created TensorRT engine: {trt_file}') + + if verify: + # prepare input + one_img, one_meta = preprocess_example_input(input_config) + img_list, img_meta_list = [one_img], [[one_meta]] + img_list = [_.cuda().contiguous() for _ in img_list] + + # wrap ONNX and TensorRT model + onnx_model = ONNXRuntimeDetector(onnx_file, CLASSES, device_id=0) + trt_model = TensorRTDetector(trt_file, CLASSES, device_id=0) + + # inference with wrapped model + with torch.no_grad(): + onnx_results = onnx_model( + img_list, img_metas=img_meta_list, return_loss=False)[0] + trt_results = trt_model( + img_list, img_metas=img_meta_list, return_loss=False)[0] + + if show: + out_file_ort, out_file_trt = None, None + else: + out_file_ort, out_file_trt = 'show-ort.png', 'show-trt.png' + show_img = one_meta['show_img'] + score_thr = 0.3 + onnx_model.show_result( + show_img, + onnx_results, + score_thr=score_thr, + show=True, + win_name='ONNXRuntime', + out_file=out_file_ort) + trt_model.show_result( + show_img, + trt_results, + score_thr=score_thr, + show=True, + win_name='TensorRT', + out_file=out_file_trt) + with_mask = trt_model.with_masks + # compare a part of result + if with_mask: + compare_pairs = list(zip(onnx_results, trt_results)) + else: + compare_pairs = [(onnx_results, trt_results)] + err_msg = 'The numerical values are different between Pytorch' + \ + ' and ONNX, but it does not necessarily mean the' + \ + ' exported ONNX model is problematic.' + # check the numerical value + for onnx_res, pytorch_res in compare_pairs: + for o_res, p_res in zip(onnx_res, pytorch_res): + np.testing.assert_allclose( + o_res, p_res, rtol=1e-03, atol=1e-05, err_msg=err_msg) + print('The numerical values are the same between Pytorch and ONNX') + + +def parse_normalize_cfg(test_pipeline): + transforms = None + for pipeline in test_pipeline: + if 'transforms' in pipeline: + transforms = pipeline['transforms'] + break + assert transforms is not None, 'Failed to find `transforms`' + norm_config_li = [_ for _ in transforms if _['type'] == 'Normalize'] + assert len(norm_config_li) == 1, '`norm_config` should only have one' + norm_config = norm_config_li[0] + return norm_config + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert MMDetection models from ONNX to TensorRT') + parser.add_argument('config', help='test config file path') + parser.add_argument('model', help='Filename of input ONNX model') + parser.add_argument( + '--trt-file', + type=str, + default='tmp.trt', + help='Filename of output TensorRT engine') + parser.add_argument( + '--input-img', type=str, default='', help='Image for test') + parser.add_argument( + '--show', action='store_true', help='Whether to show output results') + parser.add_argument( + '--dataset', + type=str, + default='coco', + help='Dataset name. This argument is deprecated and will be \ + removed in future releases.') + parser.add_argument( + '--verify', + action='store_true', + help='Verify the outputs of ONNXRuntime and TensorRT') + parser.add_argument( + '--verbose', + action='store_true', + help='Whether to verbose logging messages while creating \ + TensorRT engine. Defaults to False.') + parser.add_argument( + '--to-rgb', + action='store_false', + help='Feed model with RGB or BGR image. Default is RGB. This \ + argument is deprecated and will be removed in future releases.') + parser.add_argument( + '--shape', + type=int, + nargs='+', + default=[400, 600], + help='Input size of the model') + parser.add_argument( + '--mean', + type=float, + nargs='+', + default=[123.675, 116.28, 103.53], + help='Mean value used for preprocess input data. This argument \ + is deprecated and will be removed in future releases.') + parser.add_argument( + '--std', + type=float, + nargs='+', + default=[58.395, 57.12, 57.375], + help='Variance value used for preprocess input data. \ + This argument is deprecated and will be removed in future releases.') + parser.add_argument( + '--min-shape', + type=int, + nargs='+', + default=None, + help='Minimum input size of the model in TensorRT') + parser.add_argument( + '--max-shape', + type=int, + nargs='+', + default=None, + help='Maximum input size of the model in TensorRT') + parser.add_argument( + '--workspace-size', + type=int, + default=1, + help='Max workspace size in GiB') + + args = parser.parse_args() + return args + + +if __name__ == '__main__': + + assert is_tensorrt_plugin_loaded(), 'TensorRT plugin should be compiled.' + args = parse_args() + warnings.warn( + 'Arguments like `--to-rgb`, `--mean`, `--std`, `--dataset` would be \ + parsed directly from config file and are deprecated and will be \ + removed in future releases.') + if not args.input_img: + args.input_img = osp.join(osp.dirname(__file__), '../../demo/demo.jpg') + + cfg = Config.fromfile(args.config) + + def parse_shape(shape): + if len(shape) == 1: + shape = (1, 3, shape[0], shape[0]) + elif len(args.shape) == 2: + shape = (1, 3) + tuple(shape) + else: + raise ValueError('invalid input shape') + return shape + + if args.shape: + input_shape = parse_shape(args.shape) + else: + img_scale = cfg.test_pipeline[1]['img_scale'] + input_shape = (1, 3, img_scale[1], img_scale[0]) + + if not args.max_shape: + max_shape = input_shape + else: + max_shape = parse_shape(args.max_shape) + + if not args.min_shape: + min_shape = input_shape + else: + min_shape = parse_shape(args.min_shape) + + dataset = DATASETS.get(cfg.data.test['type']) + assert (dataset is not None) + CLASSES = dataset.CLASSES + normalize_cfg = parse_normalize_cfg(cfg.test_pipeline) + + input_config = { + 'min_shape': min_shape, + 'opt_shape': input_shape, + 'max_shape': max_shape, + 'input_shape': input_shape, + 'input_path': args.input_img, + 'normalize_cfg': normalize_cfg + } + # Create TensorRT engine + onnx2tensorrt( + args.model, + args.trt_file, + input_config, + verify=args.verify, + show=args.show, + workspace_size=args.workspace_size, + verbose=args.verbose) + + # Following strings of text style are from colorama package + bright_style, reset_style = '\x1b[1m', '\x1b[0m' + red_text, blue_text = '\x1b[31m', '\x1b[34m' + white_background = '\x1b[107m' + + msg = white_background + bright_style + red_text + msg += 'DeprecationWarning: This tool will be deprecated in future. ' + msg += blue_text + 'Welcome to use the unified model deployment toolbox ' + msg += 'MMDeploy: https://github.com/open-mmlab/mmdeploy' + msg += reset_style + warnings.warn(msg) diff --git a/tools/deployment/pytorch2onnx.py b/tools/deployment/pytorch2onnx.py new file mode 100644 index 0000000..ee856cc --- /dev/null +++ b/tools/deployment/pytorch2onnx.py @@ -0,0 +1,343 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os.path as osp +import warnings +from functools import partial + +import numpy as np +import onnx +import torch +from mmcv import Config, DictAction + +from mmdet.core.export import build_model_from_cfg, preprocess_example_input +from mmdet.core.export.model_wrappers import ONNXRuntimeDetector + + +def pytorch2onnx(model, + input_img, + input_shape, + normalize_cfg, + opset_version=11, + show=False, + output_file='tmp.onnx', + verify=False, + test_img=None, + do_simplify=False, + dynamic_export=None, + skip_postprocess=False): + + input_config = { + 'input_shape': input_shape, + 'input_path': input_img, + 'normalize_cfg': normalize_cfg + } + # prepare input + one_img, one_meta = preprocess_example_input(input_config) + img_list, img_meta_list = [one_img], [[one_meta]] + + if skip_postprocess: + warnings.warn('Not all models support export onnx without post ' + 'process, especially two stage detectors!') + model.forward = model.forward_dummy + torch.onnx.export( + model, + one_img, + output_file, + input_names=['input'], + export_params=True, + keep_initializers_as_inputs=True, + do_constant_folding=True, + verbose=show, + opset_version=opset_version) + + print(f'Successfully exported ONNX model without ' + f'post process: {output_file}') + return + + # replace original forward function + origin_forward = model.forward + model.forward = partial( + model.forward, + img_metas=img_meta_list, + return_loss=False, + rescale=False) + + output_names = ['dets', 'labels'] + if model.with_mask: + output_names.append('masks') + input_name = 'input' + dynamic_axes = None + if dynamic_export: + dynamic_axes = { + input_name: { + 0: 'batch', + 2: 'height', + 3: 'width' + }, + 'dets': { + 0: 'batch', + 1: 'num_dets', + }, + 'labels': { + 0: 'batch', + 1: 'num_dets', + }, + } + if model.with_mask: + dynamic_axes['masks'] = {0: 'batch', 1: 'num_dets'} + + torch.onnx.export( + model, + img_list, + output_file, + input_names=[input_name], + output_names=output_names, + export_params=True, + keep_initializers_as_inputs=True, + do_constant_folding=True, + verbose=show, + opset_version=opset_version, + dynamic_axes=dynamic_axes) + + model.forward = origin_forward + + if do_simplify: + import onnxsim + + from mmdet import digit_version + + min_required_version = '0.4.0' + assert digit_version(onnxsim.__version__) >= digit_version( + min_required_version + ), f'Requires to install onnxsim>={min_required_version}' + + model_opt, check_ok = onnxsim.simplify(output_file) + if check_ok: + onnx.save(model_opt, output_file) + print(f'Successfully simplified ONNX model: {output_file}') + else: + warnings.warn('Failed to simplify ONNX model.') + print(f'Successfully exported ONNX model: {output_file}') + + if verify: + # check by onnx + onnx_model = onnx.load(output_file) + onnx.checker.check_model(onnx_model) + + # wrap onnx model + onnx_model = ONNXRuntimeDetector(output_file, model.CLASSES, 0) + if dynamic_export: + # scale up to test dynamic shape + h, w = [int((_ * 1.5) // 32 * 32) for _ in input_shape[2:]] + h, w = min(1344, h), min(1344, w) + input_config['input_shape'] = (1, 3, h, w) + + if test_img is None: + input_config['input_path'] = input_img + + # prepare input once again + one_img, one_meta = preprocess_example_input(input_config) + img_list, img_meta_list = [one_img], [[one_meta]] + + # get pytorch output + with torch.no_grad(): + pytorch_results = model( + img_list, + img_metas=img_meta_list, + return_loss=False, + rescale=True)[0] + + img_list = [_.cuda().contiguous() for _ in img_list] + if dynamic_export: + img_list = img_list + [_.flip(-1).contiguous() for _ in img_list] + img_meta_list = img_meta_list * 2 + # get onnx output + onnx_results = onnx_model( + img_list, img_metas=img_meta_list, return_loss=False)[0] + # visualize predictions + score_thr = 0.3 + if show: + out_file_ort, out_file_pt = None, None + else: + out_file_ort, out_file_pt = 'show-ort.png', 'show-pt.png' + + show_img = one_meta['show_img'] + model.show_result( + show_img, + pytorch_results, + score_thr=score_thr, + show=True, + win_name='PyTorch', + out_file=out_file_pt) + onnx_model.show_result( + show_img, + onnx_results, + score_thr=score_thr, + show=True, + win_name='ONNXRuntime', + out_file=out_file_ort) + + # compare a part of result + if model.with_mask: + compare_pairs = list(zip(onnx_results, pytorch_results)) + else: + compare_pairs = [(onnx_results, pytorch_results)] + err_msg = 'The numerical values are different between Pytorch' + \ + ' and ONNX, but it does not necessarily mean the' + \ + ' exported ONNX model is problematic.' + # check the numerical value + for onnx_res, pytorch_res in compare_pairs: + for o_res, p_res in zip(onnx_res, pytorch_res): + np.testing.assert_allclose( + o_res, p_res, rtol=1e-03, atol=1e-05, err_msg=err_msg) + print('The numerical values are the same between Pytorch and ONNX') + + +def parse_normalize_cfg(test_pipeline): + transforms = None + for pipeline in test_pipeline: + if 'transforms' in pipeline: + transforms = pipeline['transforms'] + break + assert transforms is not None, 'Failed to find `transforms`' + norm_config_li = [_ for _ in transforms if _['type'] == 'Normalize'] + assert len(norm_config_li) == 1, '`norm_config` should only have one' + norm_config = norm_config_li[0] + return norm_config + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Convert MMDetection models to ONNX') + parser.add_argument('config', help='test config file path') + parser.add_argument('checkpoint', help='checkpoint file') + parser.add_argument('--input-img', type=str, help='Images for input') + parser.add_argument( + '--show', + action='store_true', + help='Show onnx graph and detection outputs') + parser.add_argument('--output-file', type=str, default='tmp.onnx') + parser.add_argument('--opset-version', type=int, default=11) + parser.add_argument( + '--test-img', type=str, default=None, help='Images for test') + parser.add_argument( + '--dataset', + type=str, + default='coco', + help='Dataset name. This argument is deprecated and will be removed \ + in future releases.') + parser.add_argument( + '--verify', + action='store_true', + help='verify the onnx model output against pytorch output') + parser.add_argument( + '--simplify', + action='store_true', + help='Whether to simplify onnx model.') + parser.add_argument( + '--shape', + type=int, + nargs='+', + default=[800, 1216], + help='input image size') + parser.add_argument( + '--mean', + type=float, + nargs='+', + default=[123.675, 116.28, 103.53], + help='mean value used for preprocess input data.This argument \ + is deprecated and will be removed in future releases.') + parser.add_argument( + '--std', + type=float, + nargs='+', + default=[58.395, 57.12, 57.375], + help='variance value used for preprocess input data. ' + 'This argument is deprecated and will be removed in future releases.') + parser.add_argument( + '--cfg-options', + nargs='+', + action=DictAction, + help='Override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file. If the value to ' + 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + 'Note that the quotation marks are necessary and that no white space ' + 'is allowed.') + parser.add_argument( + '--dynamic-export', + action='store_true', + help='Whether to export onnx with dynamic axis.') + parser.add_argument( + '--skip-postprocess', + action='store_true', + help='Whether to export model without post process. Experimental ' + 'option. We do not guarantee the correctness of the exported ' + 'model.') + args = parser.parse_args() + return args + + +if __name__ == '__main__': + args = parse_args() + warnings.warn('Arguments like `--mean`, `--std`, `--dataset` would be \ + parsed directly from config file and are deprecated and \ + will be removed in future releases.') + + assert args.opset_version == 11, 'MMDet only support opset 11 now' + + try: + from mmcv.onnx.symbolic import register_extra_symbolics + except ModuleNotFoundError: + raise NotImplementedError('please update mmcv to version>=v1.0.4') + register_extra_symbolics(args.opset_version) + + cfg = Config.fromfile(args.config) + if args.cfg_options is not None: + cfg.merge_from_dict(args.cfg_options) + + if args.shape is None: + img_scale = cfg.test_pipeline[1]['img_scale'] + input_shape = (1, 3, img_scale[1], img_scale[0]) + elif len(args.shape) == 1: + input_shape = (1, 3, args.shape[0], args.shape[0]) + elif len(args.shape) == 2: + input_shape = (1, 3) + tuple(args.shape) + else: + raise ValueError('invalid input shape') + + # build the model and load checkpoint + model = build_model_from_cfg(args.config, args.checkpoint, + args.cfg_options) + + if not args.input_img: + args.input_img = osp.join(osp.dirname(__file__), '../../demo/demo.jpg') + + normalize_cfg = parse_normalize_cfg(cfg.test_pipeline) + + # convert model to onnx file + pytorch2onnx( + model, + args.input_img, + input_shape, + normalize_cfg, + opset_version=args.opset_version, + show=args.show, + output_file=args.output_file, + verify=args.verify, + test_img=args.test_img, + do_simplify=args.simplify, + dynamic_export=args.dynamic_export, + skip_postprocess=args.skip_postprocess) + + # Following strings of text style are from colorama package + bright_style, reset_style = '\x1b[1m', '\x1b[0m' + red_text, blue_text = '\x1b[31m', '\x1b[34m' + white_background = '\x1b[107m' + + msg = white_background + bright_style + red_text + msg += 'DeprecationWarning: This tool will be deprecated in future. ' + msg += blue_text + 'Welcome to use the unified model deployment toolbox ' + msg += 'MMDeploy: https://github.com/open-mmlab/mmdeploy' + msg += reset_style + warnings.warn(msg) diff --git a/tools/deployment/test.py b/tools/deployment/test.py new file mode 100644 index 0000000..db8d696 --- /dev/null +++ b/tools/deployment/test.py @@ -0,0 +1,157 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import warnings + +import mmcv +from mmcv import Config, DictAction +from mmcv.parallel import MMDataParallel + +from mmdet.apis import single_gpu_test +from mmdet.datasets import (build_dataloader, build_dataset, + replace_ImageToTensor) +from mmdet.utils import compat_cfg + + +def parse_args(): + parser = argparse.ArgumentParser( + description='MMDet test (and eval) an ONNX model using ONNXRuntime') + parser.add_argument('config', help='test config file path') + parser.add_argument('model', help='Input model file') + parser.add_argument('--out', help='output result file in pickle format') + parser.add_argument( + '--format-only', + action='store_true', + help='Format the output results without perform evaluation. It is' + 'useful when you want to format the result to a specific format and ' + 'submit it to the test server') + parser.add_argument( + '--backend', + required=True, + choices=['onnxruntime', 'tensorrt'], + help='Backend for input model to run. ') + parser.add_argument( + '--eval', + type=str, + nargs='+', + help='evaluation metrics, which depends on the dataset, e.g., "bbox",' + ' "segm", "proposal" for COCO, and "mAP", "recall" for PASCAL VOC') + parser.add_argument('--show', action='store_true', help='show results') + parser.add_argument( + '--show-dir', help='directory where painted images will be saved') + parser.add_argument( + '--show-score-thr', + type=float, + default=0.3, + help='score threshold (default: 0.3)') + parser.add_argument( + '--cfg-options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file. If the value to ' + 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + 'Note that the quotation marks are necessary and that no white space ' + 'is allowed.') + parser.add_argument( + '--eval-options', + nargs='+', + action=DictAction, + help='custom options for evaluation, the key-value pair in xxx=yyy ' + 'format will be kwargs for dataset.evaluate() function') + + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + + assert args.out or args.eval or args.format_only or args.show \ + or args.show_dir, \ + ('Please specify at least one operation (save/eval/format/show the ' + 'results / save the results) with the argument "--out", "--eval"' + ', "--format-only", "--show" or "--show-dir"') + + if args.eval and args.format_only: + raise ValueError('--eval and --format_only cannot be both specified') + + if args.out is not None and not args.out.endswith(('.pkl', '.pickle')): + raise ValueError('The output file must be a pkl file.') + + cfg = Config.fromfile(args.config) + if args.cfg_options is not None: + cfg.merge_from_dict(args.cfg_options) + cfg = compat_cfg(cfg) + # in case the test dataset is concatenated + samples_per_gpu = 1 + if isinstance(cfg.data.test, dict): + cfg.data.test.test_mode = True + samples_per_gpu = cfg.data.test.pop('samples_per_gpu', 1) + if samples_per_gpu > 1: + # Replace 'ImageToTensor' to 'DefaultFormatBundle' + cfg.data.test.pipeline = replace_ImageToTensor( + cfg.data.test.pipeline) + elif isinstance(cfg.data.test, list): + for ds_cfg in cfg.data.test: + ds_cfg.test_mode = True + samples_per_gpu = max( + [ds_cfg.pop('samples_per_gpu', 1) for ds_cfg in cfg.data.test]) + if samples_per_gpu > 1: + for ds_cfg in cfg.data.test: + ds_cfg.pipeline = replace_ImageToTensor(ds_cfg.pipeline) + + # build the dataloader + dataset = build_dataset(cfg.data.test) + data_loader = build_dataloader( + dataset, + samples_per_gpu=samples_per_gpu, + workers_per_gpu=cfg.data.workers_per_gpu, + dist=False, + shuffle=False) + + if args.backend == 'onnxruntime': + from mmdet.core.export.model_wrappers import ONNXRuntimeDetector + model = ONNXRuntimeDetector( + args.model, class_names=dataset.CLASSES, device_id=0) + elif args.backend == 'tensorrt': + from mmdet.core.export.model_wrappers import TensorRTDetector + model = TensorRTDetector( + args.model, class_names=dataset.CLASSES, device_id=0) + + model = MMDataParallel(model, device_ids=[0]) + outputs = single_gpu_test(model, data_loader, args.show, args.show_dir, + args.show_score_thr) + + if args.out: + print(f'\nwriting results to {args.out}') + mmcv.dump(outputs, args.out) + kwargs = {} if args.eval_options is None else args.eval_options + if args.format_only: + dataset.format_results(outputs, **kwargs) + if args.eval: + eval_kwargs = cfg.get('evaluation', {}).copy() + # hard-code way to remove EvalHook args + for key in [ + 'interval', 'tmpdir', 'start', 'gpu_collect', 'save_best', + 'rule' + ]: + eval_kwargs.pop(key, None) + eval_kwargs.update(dict(metric=args.eval, **kwargs)) + print(dataset.evaluate(outputs, **eval_kwargs)) + + +if __name__ == '__main__': + main() + + # Following strings of text style are from colorama package + bright_style, reset_style = '\x1b[1m', '\x1b[0m' + red_text, blue_text = '\x1b[31m', '\x1b[34m' + white_background = '\x1b[107m' + + msg = white_background + bright_style + red_text + msg += 'DeprecationWarning: This tool will be deprecated in future. ' + msg += blue_text + 'Welcome to use the unified model deployment toolbox ' + msg += 'MMDeploy: https://github.com/open-mmlab/mmdeploy' + msg += reset_style + warnings.warn(msg) diff --git a/tools/deployment/test_torchserver.py b/tools/deployment/test_torchserver.py new file mode 100644 index 0000000..dd45234 --- /dev/null +++ b/tools/deployment/test_torchserver.py @@ -0,0 +1,74 @@ +from argparse import ArgumentParser + +import numpy as np +import requests + +from mmdet.apis import inference_detector, init_detector, show_result_pyplot +from mmdet.core import bbox2result + + +def parse_args(): + parser = ArgumentParser() + parser.add_argument('img', help='Image file') + parser.add_argument('config', help='Config file') + parser.add_argument('checkpoint', help='Checkpoint file') + parser.add_argument('model_name', help='The model name in the server') + parser.add_argument( + '--inference-addr', + default='127.0.0.1:8080', + help='Address and port of the inference server') + parser.add_argument( + '--device', default='cuda:0', help='Device used for inference') + parser.add_argument( + '--score-thr', type=float, default=0.5, help='bbox score threshold') + args = parser.parse_args() + return args + + +def parse_result(input, model_class): + bbox = [] + label = [] + score = [] + for anchor in input: + bbox.append(anchor['bbox']) + label.append(model_class.index(anchor['class_name'])) + score.append([anchor['score']]) + bboxes = np.append(bbox, score, axis=1) + labels = np.array(label) + result = bbox2result(bboxes, labels, len(model_class)) + return result + + +def main(args): + # build the model from a config file and a checkpoint file + model = init_detector(args.config, args.checkpoint, device=args.device) + # test a single image + model_result = inference_detector(model, args.img) + for i, anchor_set in enumerate(model_result): + anchor_set = anchor_set[anchor_set[:, 4] >= 0.5] + model_result[i] = anchor_set + # show the results + show_result_pyplot( + model, + args.img, + model_result, + score_thr=args.score_thr, + title='pytorch_result') + url = 'http://' + args.inference_addr + '/predictions/' + args.model_name + with open(args.img, 'rb') as image: + response = requests.post(url, image) + server_result = parse_result(response.json(), model.CLASSES) + show_result_pyplot( + model, + args.img, + server_result, + score_thr=args.score_thr, + title='server_result') + + for i in range(len(model.CLASSES)): + assert np.allclose(model_result[i], server_result[i]) + + +if __name__ == '__main__': + args = parse_args() + main(args) diff --git a/tools/dist_test.sh b/tools/dist_test.sh new file mode 100755 index 0000000..dea131b --- /dev/null +++ b/tools/dist_test.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +CONFIG=$1 +CHECKPOINT=$2 +GPUS=$3 +NNODES=${NNODES:-1} +NODE_RANK=${NODE_RANK:-0} +PORT=${PORT:-29500} +MASTER_ADDR=${MASTER_ADDR:-"127.0.0.1"} + +PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ +python -m torch.distributed.launch \ + --nnodes=$NNODES \ + --node_rank=$NODE_RANK \ + --master_addr=$MASTER_ADDR \ + --nproc_per_node=$GPUS \ + --master_port=$PORT \ + $(dirname "$0")/test.py \ + $CONFIG \ + $CHECKPOINT \ + --launcher pytorch \ + ${@:4} diff --git a/tools/dist_train.sh b/tools/dist_train.sh new file mode 100755 index 0000000..aa71bf4 --- /dev/null +++ b/tools/dist_train.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +CONFIG=$1 +GPUS=$2 +NNODES=${NNODES:-1} +NODE_RANK=${NODE_RANK:-0} +PORT=${PORT:-29500} +MASTER_ADDR=${MASTER_ADDR:-"127.0.0.1"} + +PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ +python -m torch.distributed.launch \ + --nnodes=$NNODES \ + --node_rank=$NODE_RANK \ + --master_addr=$MASTER_ADDR \ + --nproc_per_node=$GPUS \ + --master_port=$PORT \ + $(dirname "$0")/train.py \ + $CONFIG \ + --seed 0 \ + --launcher pytorch ${@:3} diff --git a/tools/fast_test.py b/tools/fast_test.py new file mode 100644 index 0000000..318c7f3 --- /dev/null +++ b/tools/fast_test.py @@ -0,0 +1,541 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os +import os.path as osp +import time +import warnings + +import mmcv +import torch +from mmcv import Config, DictAction +from mmcv.cnn import fuse_conv_bn +from mmcv.runner import (get_dist_info, init_dist, load_checkpoint, + wrap_fp16_model) + +from mmdet.apis import multi_gpu_test, single_gpu_test +from mmdet.datasets import (build_dataloader, build_dataset, + replace_ImageToTensor) +from mmdet.models import build_detector +from mmdet.utils import (build_ddp, build_dp, fast_compat_cfg, get_device, + replace_cfg_vals, rfnext_init_model, + setup_multi_processes, update_data_root) +from mqb_general_process import make_qmodel_for_mmd, prepocess +from mqbench.utils.state import * +import global_placeholder +from mqb_general_process import * +from mmcv.image import tensor2imgs +import numpy as np +from mmdet.core.visualization import imshow_det_bboxes + +def parse_args(): + parser = argparse.ArgumentParser( + description='MMDet test (and eval) a model') + parser.add_argument('config', help='test config file path') + # parser.add_argument('checkpoint', help='checkpoint file') + parser.add_argument('pkl_result_path', help='pkl result file') + # parser.add_argument('quant_config', default=None, help='quant config file path') + # parser.add_argument('--aqd-mode', type=int, default=0, help='when bigger than 0 , it means switch on aqd, and equals the neck output level num') + # parser.add_argument('--quantize', + # action='store_true', help='quant flag') + parser.add_argument('--seed', type=int, default=None, help='random seed') + + parser.add_argument( + '--work-dir', + help='the directory to save the file containing evaluation metrics') + parser.add_argument('--out', help='output result file in pickle format') + parser.add_argument( + '--fuse-conv-bn', + action='store_true', + help='Whether to fuse conv and bn, this will slightly increase' + 'the inference speed') + parser.add_argument( + '--gpu-ids', + type=int, + nargs='+', + help='(Deprecated, please use --gpu-id) ids of gpus to use ' + '(only applicable to non-distributed training)') + parser.add_argument( + '--gpu-id', + type=int, + default=0, + help='id of gpu to use ' + '(only applicable to non-distributed testing)') + parser.add_argument( + '--format-only', + action='store_true', + help='Format the output results without perform evaluation. It is' + 'useful when you want to format the result to a specific format and ' + 'submit it to the test server') + parser.add_argument( + '--eval', + type=str, + nargs='+', + help='evaluation metrics, which depends on the dataset, e.g., "bbox",' + ' "segm", "proposal" for COCO, and "mAP", "recall" for PASCAL VOC') + parser.add_argument('--show', action='store_true', help='show results') + parser.add_argument( + '--show-dir', help='directory where painted images will be saved') + parser.add_argument( + '--show-score-thr', + type=float, + default=0.3, + help='score threshold (default: 0.3)') + parser.add_argument( + '--gpu-collect', + action='store_true', + help='whether to use gpu to collect results.') + parser.add_argument( + '--tmpdir', + help='tmp directory used for collecting results from multiple ' + 'workers, available when gpu-collect is not specified') + parser.add_argument( + '--cfg-options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file. If the value to ' + 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + 'Note that the quotation marks are necessary and that no white space ' + 'is allowed.') + parser.add_argument( + '--options', + nargs='+', + action=DictAction, + help='custom options for evaluation, the key-value pair in xxx=yyy ' + 'format will be kwargs for dataset.evaluate() function (deprecate), ' + 'change to --eval-options instead.') + parser.add_argument( + '--eval-options', + nargs='+', + action=DictAction, + help='custom options for evaluation, the key-value pair in xxx=yyy ' + 'format will be kwargs for dataset.evaluate() function') + parser.add_argument( + '--launcher', + choices=['none', 'pytorch', 'slurm', 'mpi'], + default='none', + help='job launcher') + parser.add_argument('--local_rank', type=int, default=0) + args = parser.parse_args() + if 'LOCAL_RANK' not in os.environ: + os.environ['LOCAL_RANK'] = str(args.local_rank) + + if args.options and args.eval_options: + raise ValueError( + '--options and --eval-options cannot be both ' + 'specified, --options is deprecated in favor of --eval-options') + if args.options: + warnings.warn('--options is deprecated in favor of --eval-options') + args.eval_options = args.options + return args + + +def main(): + args = parse_args() + + assert args.out or args.eval or args.format_only or args.show \ + or args.show_dir, \ + ('Please specify at least one operation (save/eval/format/show the ' + 'results / save the results) with the argument "--out", "--eval"' + ', "--format-only", "--show" or "--show-dir"') + + if args.eval and args.format_only: + raise ValueError('--eval and --format_only cannot be both specified') + + if args.out is not None and not args.out.endswith(('.pkl', '.pickle')): + raise ValueError('The output file must be a pkl file.') + + cfg = Config.fromfile(args.config) + + # replace the ${key} with the value of cfg.key + cfg = replace_cfg_vals(cfg) + + # update data root according to MMDET_DATASETS + update_data_root(cfg) + + if args.cfg_options is not None: + cfg.merge_from_dict(args.cfg_options) + + cfg = fast_compat_cfg(cfg) + + # set multi-process settings + setup_multi_processes(cfg) + set_random_seed(args.seed) + # set cudnn_benchmark + if cfg.get('cudnn_benchmark', False): + torch.backends.cudnn.benchmark = True + + # if 'pretrained' in cfg.model: + # cfg.model.pretrained = None + # elif 'init_cfg' in cfg.model.backbone: + # cfg.model.backbone.init_cfg = None + + # if cfg.model.get('neck'): + # if isinstance(cfg.model.neck, list): + # for neck_cfg in cfg.model.neck: + # if neck_cfg.get('rfp_backbone'): + # if neck_cfg.rfp_backbone.get('pretrained'): + # neck_cfg.rfp_backbone.pretrained = None + # elif cfg.model.neck.get('rfp_backbone'): + # if cfg.model.neck.rfp_backbone.get('pretrained'): + # cfg.model.neck.rfp_backbone.pretrained = None + + if args.gpu_ids is not None: + cfg.gpu_ids = args.gpu_ids[0:1] + warnings.warn('`--gpu-ids` is deprecated, please use `--gpu-id`. ' + 'Because we only support single GPU mode in ' + 'non-distributed testing. Use the first GPU ' + 'in `gpu_ids` now.') + else: + cfg.gpu_ids = [args.gpu_id] + cfg.device = get_device() + # init distributed env first, since logger depends on the dist info. + if args.launcher == 'none': + distributed = False + else: + distributed = True + # init_dist(args.launcher, **cfg.dist_params) + + test_dataloader_default_args = dict( + samples_per_gpu=1, workers_per_gpu=2, dist=distributed, shuffle=False) + + # in case the test dataset is concatenated + if isinstance(cfg.data.test, dict): + cfg.data.test.test_mode = True + if cfg.data.test_dataloader.get('samples_per_gpu', 1) > 1: + # Replace 'ImageToTensor' to 'DefaultFormatBundle' + cfg.data.test.pipeline = replace_ImageToTensor( + cfg.data.test.pipeline) + elif isinstance(cfg.data.test, list): + for ds_cfg in cfg.data.test: + ds_cfg.test_mode = True + if cfg.data.test_dataloader.get('samples_per_gpu', 1) > 1: + for ds_cfg in cfg.data.test: + ds_cfg.pipeline = replace_ImageToTensor(ds_cfg.pipeline) + + test_loader_cfg = { + **test_dataloader_default_args, + **cfg.data.get('test_dataloader', {}) + } + + rank, _ = get_dist_info() + # allows not to create + if args.work_dir is not None and rank == 0: + mmcv.mkdir_or_exist(osp.abspath(args.work_dir)) + timestamp = time.strftime('%Y%m%d_%H%M%S', time.localtime()) + json_file = osp.join(args.work_dir, f'eval_{timestamp}.json') + + # build the dataloader + dataset = build_dataset(cfg.data.test) + data_loader = build_dataloader(dataset, **test_loader_cfg) + + # build the model and load checkpoint + # cfg.model.train_cfg = None + # model = build_detector(cfg.model, test_cfg=cfg.get('test_cfg')) + # global setting + # if args.aqd_mode != 0: + # global_placeholder.modify_AQD_mode(args.aqd_mode) + + # 如果是QAT模型,那么就需要提前定义好量化模型结构 + # if args.quantize: + # quant_config = prepocess(args.quant_config) + # # copy_config_file(args.quant_config, cfg.work_dir) + # logger.info(quant_config) + # global_placeholder.modify_quant_bit(quant_config.extra_prepare_dict.extra_qconfig_dict.w_qscheme.bit) + # global_placeholder.modify_quant_algorithm(quant_config.quantize.quant_algorithm) + # global_placeholder.modify_buff_flag(quant_config.training.my_buff_flag) + # global_placeholder.modify_qloss_flag(quant_config.training.qloss_flag) + # global_placeholder.modify_fold_bn_flag(quant_config.training.fold_bn_flag) + + # model.train() + # model = make_qmodel_for_mmd(model, quant_config, cfg.trace_config) + + # else: + # if 'HQOD' in cfg.work_dir: + # logger.info("插播!!!!直接启用harmony!!") + # logger.info("插播!!!!直接启用harmony!!") + # logger.info("插播!!!!直接启用harmony!!\n") + # global_placeholder.modify_buff_flag(1) # 为mypro + # elif 'HarDet' in cfg.work_dir: + # logger.info("插播!!!!直接启用harmony!!") + # logger.info("插播!!!!直接启用harmony!!") + # logger.info("插播!!!!直接启用harmony!!\n") + # global_placeholder.modify_buff_flag(2) # 为hardet + + # # 检查 num levels 一致性 + # if global_placeholder.aqd_mode != 0 and model.neck.num_outs != global_placeholder.aqd_mode: + # # 说明 num levels给的不对 + # raise ValueError(f'num levels给的不对! aqd_mode={global_placeholder.aqd_mode} 而 neck.num_outs={model.neck.num_outs}') + + # init rfnext if 'RFSearchHook' is defined in cfg + # rfnext_init_model(model, cfg=cfg) + # fp16_cfg = cfg.get('fp16', None) + # if fp16_cfg is None and cfg.get('device', None) == 'npu': + # fp16_cfg = dict(loss_scale='dynamic') + # if fp16_cfg is not None: + # wrap_fp16_model(model) + # checkpoint = load_checkpoint(model, args.checkpoint, map_location='cpu') + # if args.fuse_conv_bn: + # model = fuse_conv_bn(model) + # # old versions did not save class info in checkpoints, this walkaround is + # # for backward compatibility + # if 'CLASSES' in checkpoint.get('meta', {}): + # model.CLASSES = checkpoint['meta']['CLASSES'] + # else: + # model.CLASSES = dataset.CLASSES + + + # if args.quantize: + # enable_quantization(model.backbone) + # enable_quantization(model.neck) + # model_general_architecture = cfg.trace_config.get('model_general_architecture', None) + # if model_general_architecture == 'FasterRCNN': + # enable_quantization(model.rpn_head) + # enable_quantization(model.roi_head.bbox_head) + # else: + # enable_quantization(model.bbox_head) + + # model.eval() + # if not distributed: + # model = build_dp(model, cfg.device, device_ids=cfg.gpu_ids) + # outputs = single_gpu_test(model, data_loader, args.show, args.show_dir, + # args.show_score_thr) + # else: + # model = build_ddp( + # model, + # cfg.device, + # device_ids=[int(os.environ['LOCAL_RANK'])], + # broadcast_buffers=False) + + # # In multi_gpu_test, if tmpdir is None, some tesnors + # # will init on cuda by default, and no device choice supported. + # # Init a tmpdir to avoid error on npu here. + # if cfg.device == 'npu' and args.tmpdir is None: + # args.tmpdir = './npu_tmpdir' + + # outputs = multi_gpu_test( + # model, data_loader, args.tmpdir, args.gpu_collect + # or cfg.evaluation.get('gpu_collect', False)) + + # TODO 加载pkl 文件 + outputs = mmcv.load(args.pkl_result_path) + print(f'Loaded pkl result : {args.pkl_result_path}') + + # # create work_dir + # mmcv.mkdir_or_exist(osp.abspath(os.path.join(args.show_dir, 'imgs'))) + single_gpu_draw(outputs, data_loader, out_dir=args.show_dir) + rank, _ = get_dist_info() + if rank == 0: + # if args.out: + # print(f'\nwriting results to {args.out}') + # mmcv.dump(outputs, args.out) + kwargs = {} if args.eval_options is None else args.eval_options + if args.format_only: + dataset.format_results(outputs, **kwargs) + if args.eval: + eval_kwargs = cfg.get('evaluation', {}).copy() + # hard-code way to remove EvalHook args + for key in [ + 'interval', 'tmpdir', 'start', 'gpu_collect', 'save_best', + 'rule', 'dynamic_intervals' + ]: + eval_kwargs.pop(key, None) + eval_kwargs.update(dict(metric=args.eval, **kwargs)) + metric = dataset.evaluate(outputs, **eval_kwargs) + print(metric) + metric_dict = dict(config=args.config, metric=metric) + if args.work_dir is not None and rank == 0: + mmcv.dump(metric_dict, json_file) + + +def set_random_seed(seed, deterministic=True): + """Set random seed. + + Args: + seed (int): Seed to be used. + deterministic (bool): Whether to set the deterministic option for + CUDNN backend, i.e., set `torch.backends.cudnn.deterministic` + to True and `torch.backends.cudnn.benchmark` to False. + Default: False. + """ + import random + + import numpy as np + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + if deterministic: + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + + + + + +def single_gpu_draw(results, + data_loader, + show=False, + out_dir=None, + show_score_thr=0.3): + # model.eval() + # results = [] + dataset = data_loader.dataset + PALETTE = getattr(dataset, 'PALETTE', None) + prog_bar = mmcv.ProgressBar(len(dataset)) + for i, data in enumerate(data_loader): + # with torch.no_grad(): + # result = model(return_loss=False, rescale=True, **data) + + batch_size = data_loader.batch_size + + result = results[i*batch_size:(i+1)*batch_size] + + + if show or out_dir: + if batch_size == 1 and isinstance(data['img'][0], torch.Tensor): + img_tensor = data['img'][0] + else: + img_tensor = data['img'][0].data[0] + img_metas = data['img_metas'][0].data[0] + imgs = tensor2imgs(img_tensor, **img_metas[0]['img_norm_cfg']) + assert len(imgs) == len(img_metas) + + selected_imgs = None + selected_imgs = ['000062.jpg', '000069.jpg', '000074.jpg', '000108.jpg', '000852.jpg' + ,'001285.jpg','001745.jpg','006193.jpg'] + + for i, (img, img_meta) in enumerate(zip(imgs, img_metas)): + if selected_imgs is not None: + # 说明是筛选模式 + matched_flag = has_matched_img(img_meta, selected_imgs) + if not matched_flag: + # 跳过循环 + continue + h, w, _ = img_meta['img_shape'] + img_show = img[:h, :w, :] + + ori_h, ori_w = img_meta['ori_shape'][:-1] + img_show = mmcv.imresize(img_show, (ori_w, ori_h)) + + if out_dir: + out_file = osp.join(out_dir, img_meta['ori_filename']) + else: + out_file = None + + show_result( + dataset, + img_show, + result[i], + bbox_color=PALETTE, + text_color=PALETTE, + mask_color=PALETTE, + show=show, + out_file=out_file, + score_thr=show_score_thr) + + + for _ in range(batch_size): + prog_bar.update() + return + + +def has_matched_img(img_meta, selected_imgs): + for img_key in selected_imgs: + if img_key in img_meta['filename']: + return True + return False + + +def show_result(dataset, + img, + result, + score_thr=0.3, + bbox_color=(72, 101, 241), + text_color=(72, 101, 241), + mask_color=None, + thickness=2, + font_size=13, + win_name='', + show=False, + wait_time=0, + out_file=None): + """Draw `result` over `img`. + + Args: + img (str or Tensor): The image to be displayed. + result (Tensor or tuple): The results to draw over `img` + bbox_result or (bbox_result, segm_result). + score_thr (float, optional): Minimum score of bboxes to be shown. + Default: 0.3. + bbox_color (str or tuple(int) or :obj:`Color`):Color of bbox lines. + The tuple of color should be in BGR order. Default: 'green' + text_color (str or tuple(int) or :obj:`Color`):Color of texts. + The tuple of color should be in BGR order. Default: 'green' + mask_color (None or str or tuple(int) or :obj:`Color`): + Color of masks. The tuple of color should be in BGR order. + Default: None + thickness (int): Thickness of lines. Default: 2 + font_size (int): Font size of texts. Default: 13 + win_name (str): The window name. Default: '' + wait_time (float): Value of waitKey param. + Default: 0. + show (bool): Whether to show the image. + Default: False. + out_file (str or None): The filename to write the image. + Default: None. + + Returns: + img (Tensor): Only if not `show` or `out_file` + """ + img = mmcv.imread(img) + img = img.copy() + if isinstance(result, tuple): + bbox_result, segm_result = result + if isinstance(segm_result, tuple): + segm_result = segm_result[0] # ms rcnn + else: + bbox_result, segm_result = result, None + bboxes = np.vstack(bbox_result) + labels = [ + np.full(bbox.shape[0], i, dtype=np.int32) + for i, bbox in enumerate(bbox_result) + ] + labels = np.concatenate(labels) + # draw segmentation masks + segms = None + if segm_result is not None and len(labels) > 0: # non empty + segms = mmcv.concat_list(segm_result) + if isinstance(segms[0], torch.Tensor): + segms = torch.stack(segms, dim=0).detach().cpu().numpy() + else: + segms = np.stack(segms, axis=0) + # if out_file specified, do not show image in window + if out_file is not None: + show = False + # draw bounding boxes + img = imshow_det_bboxes( + img, + bboxes, + labels, + segms, + class_names=dataset.CLASSES, + score_thr=score_thr, + bbox_color=bbox_color, + text_color=text_color, + mask_color=mask_color, + thickness=thickness, + font_size=font_size, + win_name=win_name, + show=show, + wait_time=wait_time, + out_file=out_file) + + if not (show or out_file): + return img + + + +if __name__ == '__main__': + main() diff --git a/tools/misc/browse_dataset.py b/tools/misc/browse_dataset.py new file mode 100644 index 0000000..d9fb285 --- /dev/null +++ b/tools/misc/browse_dataset.py @@ -0,0 +1,137 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os +from collections import Sequence +from pathlib import Path + +import mmcv +import numpy as np +from mmcv import Config, DictAction + +from mmdet.core.utils import mask2ndarray +from mmdet.core.visualization import imshow_det_bboxes +from mmdet.datasets.builder import build_dataset +from mmdet.utils import replace_cfg_vals, update_data_root + + +def parse_args(): + parser = argparse.ArgumentParser(description='Browse a dataset') + parser.add_argument('config', help='train config file path') + parser.add_argument( + '--skip-type', + type=str, + nargs='+', + default=['DefaultFormatBundle', 'Normalize', 'Collect'], + help='skip some useless pipeline') + parser.add_argument( + '--output-dir', + default=None, + type=str, + help='If there is no display interface, you can save it') + parser.add_argument('--not-show', default=False, action='store_true') + parser.add_argument( + '--show-interval', + type=float, + default=2, + help='the interval of show (s)') + parser.add_argument( + '--cfg-options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file. If the value to ' + 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + 'Note that the quotation marks are necessary and that no white space ' + 'is allowed.') + args = parser.parse_args() + return args + + +def retrieve_data_cfg(config_path, skip_type, cfg_options): + + def skip_pipeline_steps(config): + config['pipeline'] = [ + x for x in config.pipeline if x['type'] not in skip_type + ] + + cfg = Config.fromfile(config_path) + + # replace the ${key} with the value of cfg.key + cfg = replace_cfg_vals(cfg) + + # update data root according to MMDET_DATASETS + update_data_root(cfg) + + if cfg_options is not None: + cfg.merge_from_dict(cfg_options) + train_data_cfg = cfg.data.train + while 'dataset' in train_data_cfg and train_data_cfg[ + 'type'] != 'MultiImageMixDataset': + train_data_cfg = train_data_cfg['dataset'] + + if isinstance(train_data_cfg, Sequence): + [skip_pipeline_steps(c) for c in train_data_cfg] + else: + skip_pipeline_steps(train_data_cfg) + + return cfg + + +def main(): + args = parse_args() + cfg = retrieve_data_cfg(args.config, args.skip_type, args.cfg_options) + + if 'gt_semantic_seg' in cfg.train_pipeline[-1]['keys']: + cfg.data.train.pipeline = [ + p for p in cfg.data.train.pipeline if p['type'] != 'SegRescale' + ] + dataset = build_dataset(cfg.data.train) + + progress_bar = mmcv.ProgressBar(len(dataset)) + + for item in dataset: + filename = os.path.join(args.output_dir, + Path(item['filename']).name + ) if args.output_dir is not None else None + + gt_bboxes = item['gt_bboxes'] + gt_labels = item['gt_labels'] + gt_masks = item.get('gt_masks', None) + if gt_masks is not None: + gt_masks = mask2ndarray(gt_masks) + + gt_seg = item.get('gt_semantic_seg', None) + if gt_seg is not None: + pad_value = 255 # the padding value of gt_seg + sem_labels = np.unique(gt_seg) + all_labels = np.concatenate((gt_labels, sem_labels), axis=0) + all_labels, counts = np.unique(all_labels, return_counts=True) + stuff_labels = all_labels[np.logical_and(counts < 2, + all_labels != pad_value)] + stuff_masks = gt_seg[None] == stuff_labels[:, None, None] + gt_labels = np.concatenate((gt_labels, stuff_labels), axis=0) + gt_masks = np.concatenate((gt_masks, stuff_masks.astype(np.uint8)), + axis=0) + # If you need to show the bounding boxes, + # please comment the following line + gt_bboxes = None + + imshow_det_bboxes( + item['img'], + gt_bboxes, + gt_labels, + gt_masks, + class_names=dataset.CLASSES, + show=not args.not_show, + wait_time=args.show_interval, + out_file=filename, + bbox_color=dataset.PALETTE, + text_color=(200, 200, 200), + mask_color=dataset.PALETTE) + + progress_bar.update() + + +if __name__ == '__main__': + main() diff --git a/tools/misc/download_dataset.py b/tools/misc/download_dataset.py new file mode 100644 index 0000000..ac37cd2 --- /dev/null +++ b/tools/misc/download_dataset.py @@ -0,0 +1,190 @@ +import argparse +import tarfile +from itertools import repeat +from multiprocessing.pool import ThreadPool +from pathlib import Path +from tarfile import TarFile +from zipfile import ZipFile + +import torch +from mmcv.utils.path import mkdir_or_exist + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Download datasets for training') + parser.add_argument( + '--dataset-name', type=str, help='dataset name', default='coco2017') + parser.add_argument( + '--save-dir', + type=str, + help='the dir to save dataset', + default='data/coco') + parser.add_argument( + '--unzip', + action='store_true', + help='whether unzip dataset or not, zipped files will be saved') + parser.add_argument( + '--delete', + action='store_true', + help='delete the download zipped files') + parser.add_argument( + '--threads', type=int, help='number of threading', default=4) + args = parser.parse_args() + return args + + +def download(url, dir, unzip=True, delete=False, threads=1): + + def download_one(url, dir): + f = dir / Path(url).name + if Path(url).is_file(): + Path(url).rename(f) + elif not f.exists(): + print(f'Downloading {url} to {f}') + torch.hub.download_url_to_file(url, f, progress=True) + if unzip and f.suffix in ('.zip', '.tar'): + print(f'Unzipping {f.name}') + if f.suffix == '.zip': + ZipFile(f).extractall(path=dir) + elif f.suffix == '.tar': + TarFile(f).extractall(path=dir) + if delete: + f.unlink() + print(f'Delete {f}') + + dir = Path(dir) + if threads > 1: + pool = ThreadPool(threads) + pool.imap(lambda x: download_one(*x), zip(url, repeat(dir))) + pool.close() + pool.join() + else: + for u in [url] if isinstance(url, (str, Path)) else url: + download_one(u, dir) + + +def download_objects365v2(url, dir, unzip=True, delete=False, threads=1): + + def download_single(url, dir): + + if 'train' in url: + saving_dir = dir / Path('train_zip') + mkdir_or_exist(saving_dir) + f = saving_dir / Path(url).name + + unzip_dir = dir / Path('train') + mkdir_or_exist(unzip_dir) + elif 'val' in url: + saving_dir = dir / Path('val') + mkdir_or_exist(saving_dir) + f = saving_dir / Path(url).name + + unzip_dir = dir / Path('val') + mkdir_or_exist(unzip_dir) + else: + raise NotImplementedError + + if Path(url).is_file(): + Path(url).rename(f) + elif not f.exists(): + print(f'Downloading {url} to {f}') + torch.hub.download_url_to_file(url, f, progress=True) + + if unzip and str(f).endswith('.tar.gz'): + print(f'Unzipping {f.name}') + tar = tarfile.open(f) + tar.extractall(path=unzip_dir) + if delete: + f.unlink() + print(f'Delete {f}') + + # process annotations + full_url = [] + for _url in url: + if 'zhiyuan_objv2_train.tar.gz' in _url or \ + 'zhiyuan_objv2_val.json' in _url: + full_url.append(_url) + elif 'train' in _url: + for i in range(51): + full_url.append(f'{_url}patch{i}.tar.gz') + elif 'val/images/v1' in _url: + for i in range(16): + full_url.append(f'{_url}patch{i}.tar.gz') + elif 'val/images/v2' in _url: + for i in range(16, 44): + full_url.append(f'{_url}patch{i}.tar.gz') + else: + raise NotImplementedError + + dir = Path(dir) + if threads > 1: + pool = ThreadPool(threads) + pool.imap(lambda x: download_single(*x), zip(full_url, repeat(dir))) + pool.close() + pool.join() + else: + for u in full_url: + download_single(u, dir) + + +def main(): + args = parse_args() + path = Path(args.save_dir) + if not path.exists(): + path.mkdir(parents=True, exist_ok=True) + data2url = dict( + # TODO: Support for downloading Panoptic Segmentation of COCO + coco2017=[ + 'http://images.cocodataset.org/zips/train2017.zip', + 'http://images.cocodataset.org/zips/val2017.zip', + 'http://images.cocodataset.org/zips/test2017.zip', + 'http://images.cocodataset.org/annotations/' + + 'annotations_trainval2017.zip' + ], + lvis=[ + 'https://s3-us-west-2.amazonaws.com/dl.fbaipublicfiles.com/LVIS/lvis_v1_train.json.zip', # noqa + 'https://s3-us-west-2.amazonaws.com/dl.fbaipublicfiles.com/LVIS/lvis_v1_train.json.zip', # noqa + ], + voc2007=[ + 'http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar', # noqa + 'http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar', # noqa + 'http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar', # noqa + ], + # Note: There is no download link for Objects365-V1 right now. If you + # would like to download Objects365-V1, please visit + # http://www.objects365.org/ to concat the author. + objects365v2=[ + # training annotations + 'https://dorc.ks3-cn-beijing.ksyun.com/data-set/2020Objects365%E6%95%B0%E6%8D%AE%E9%9B%86/train/zhiyuan_objv2_train.tar.gz', # noqa + # validation annotations + 'https://dorc.ks3-cn-beijing.ksyun.com/data-set/2020Objects365%E6%95%B0%E6%8D%AE%E9%9B%86/val/zhiyuan_objv2_val.json', # noqa + # training url root + 'https://dorc.ks3-cn-beijing.ksyun.com/data-set/2020Objects365%E6%95%B0%E6%8D%AE%E9%9B%86/train/', # noqa + # validation url root_1 + 'https://dorc.ks3-cn-beijing.ksyun.com/data-set/2020Objects365%E6%95%B0%E6%8D%AE%E9%9B%86/val/images/v1/', # noqa + # validation url root_2 + 'https://dorc.ks3-cn-beijing.ksyun.com/data-set/2020Objects365%E6%95%B0%E6%8D%AE%E9%9B%86/val/images/v2/' # noqa + ]) + url = data2url.get(args.dataset_name, None) + if url is None: + print('Only support COCO, VOC, LVIS, and Objects365v2 now!') + return + if args.dataset_name == 'objects365v2': + download_objects365v2( + url, + dir=path, + unzip=args.unzip, + delete=args.delete, + threads=args.threads) + else: + download( + url, + dir=path, + unzip=args.unzip, + delete=args.delete, + threads=args.threads) + + +if __name__ == '__main__': + main() diff --git a/tools/misc/gen_coco_panoptic_test_info.py b/tools/misc/gen_coco_panoptic_test_info.py new file mode 100644 index 0000000..5ad315d --- /dev/null +++ b/tools/misc/gen_coco_panoptic_test_info.py @@ -0,0 +1,34 @@ +import argparse +import os.path as osp + +import mmcv + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Generate COCO test image information ' + 'for COCO panoptic segmentation.') + parser.add_argument('data_root', help='Path to COCO annotation directory.') + args = parser.parse_args() + + return args + + +def main(): + args = parse_args() + data_root = args.data_root + val_info = mmcv.load(osp.join(data_root, 'panoptic_val2017.json')) + test_old_info = mmcv.load( + osp.join(data_root, 'image_info_test-dev2017.json')) + + # replace categories from image_info_test-dev2017.json + # with categories from panoptic_val2017.json which + # has attribute `isthing`. + test_info = test_old_info + test_info.update({'categories': val_info['categories']}) + mmcv.dump(test_info, + osp.join(data_root, 'panoptic_image_info_test-dev2017.json')) + + +if __name__ == '__main__': + main() diff --git a/tools/misc/get_image_metas.py b/tools/misc/get_image_metas.py new file mode 100644 index 0000000..a9957d9 --- /dev/null +++ b/tools/misc/get_image_metas.py @@ -0,0 +1,116 @@ +# Copyright (c) OpenMMLab. All rights reserved. +"""Get test image metas on a specific dataset. + +Here is an example to run this script. + +Example: + python tools/misc/get_image_metas.py ${CONFIG} \ + --out ${OUTPUT FILE NAME} +""" +import argparse +import csv +import os.path as osp +from multiprocessing import Pool + +import mmcv +from mmcv import Config + + +def parse_args(): + parser = argparse.ArgumentParser(description='Collect image metas') + parser.add_argument('config', help='Config file path') + parser.add_argument( + '--out', + default='validation-image-metas.pkl', + help='The output image metas file name. The save dir is in the ' + 'same directory as `dataset.ann_file` path') + parser.add_argument( + '--nproc', + default=4, + type=int, + help='Processes used for get image metas') + args = parser.parse_args() + return args + + +def get_metas_from_csv_style_ann_file(ann_file): + data_infos = [] + cp_filename = None + with open(ann_file, 'r') as f: + reader = csv.reader(f) + for i, line in enumerate(reader): + if i == 0: + continue + img_id = line[0] + filename = f'{img_id}.jpg' + if filename != cp_filename: + data_infos.append(dict(filename=filename)) + cp_filename = filename + return data_infos + + +def get_metas_from_txt_style_ann_file(ann_file): + with open(ann_file) as f: + lines = f.readlines() + i = 0 + data_infos = [] + while i < len(lines): + filename = lines[i].rstrip() + data_infos.append(dict(filename=filename)) + skip_lines = int(lines[i + 2]) + 3 + i += skip_lines + return data_infos + + +def get_image_metas(data_info, img_prefix): + file_client = mmcv.FileClient(backend='disk') + filename = data_info.get('filename', None) + if filename is not None: + if img_prefix is not None: + filename = osp.join(img_prefix, filename) + img_bytes = file_client.get(filename) + img = mmcv.imfrombytes(img_bytes, flag='color') + meta = dict(filename=filename, ori_shape=img.shape) + else: + raise NotImplementedError('Missing `filename` in data_info') + return meta + + +def main(): + args = parse_args() + assert args.out.endswith('pkl'), 'The output file name must be pkl suffix' + + # load config files + cfg = Config.fromfile(args.config) + ann_file = cfg.data.test.ann_file + img_prefix = cfg.data.test.img_prefix + + print(f'{"-" * 5} Start Processing {"-" * 5}') + if ann_file.endswith('csv'): + data_infos = get_metas_from_csv_style_ann_file(ann_file) + elif ann_file.endswith('txt'): + data_infos = get_metas_from_txt_style_ann_file(ann_file) + else: + shuffix = ann_file.split('.')[-1] + raise NotImplementedError('File name must be csv or txt suffix but ' + f'get {shuffix}') + + print(f'Successfully load annotation file from {ann_file}') + print(f'Processing {len(data_infos)} images...') + pool = Pool(args.nproc) + # get image metas with multiple processes + image_metas = pool.starmap( + get_image_metas, + zip(data_infos, [img_prefix for _ in range(len(data_infos))]), + ) + pool.close() + + # save image metas + root_path = cfg.data.test.ann_file.rsplit('/', 1)[0] + save_path = osp.join(root_path, args.out) + mmcv.dump(image_metas, save_path) + print(f'Image meta file save to: {save_path}') + + +if __name__ == '__main__': + main() diff --git a/tools/misc/print_config.py b/tools/misc/print_config.py new file mode 100644 index 0000000..f10f538 --- /dev/null +++ b/tools/misc/print_config.py @@ -0,0 +1,60 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import warnings + +from mmcv import Config, DictAction + +from mmdet.utils import replace_cfg_vals, update_data_root + + +def parse_args(): + parser = argparse.ArgumentParser(description='Print the whole config') + parser.add_argument('config', help='config file path') + parser.add_argument( + '--options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file (deprecate), ' + 'change to --cfg-options instead.') + parser.add_argument( + '--cfg-options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file. If the value to ' + 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + 'Note that the quotation marks are necessary and that no white space ' + 'is allowed.') + args = parser.parse_args() + + if args.options and args.cfg_options: + raise ValueError( + '--options and --cfg-options cannot be both ' + 'specified, --options is deprecated in favor of --cfg-options') + if args.options: + warnings.warn('--options is deprecated in favor of --cfg-options') + args.cfg_options = args.options + + return args + + +def main(): + args = parse_args() + + cfg = Config.fromfile(args.config) + + # replace the ${key} with the value of cfg.key + cfg = replace_cfg_vals(cfg) + + # update data root according to MMDET_DATASETS + update_data_root(cfg) + + if args.cfg_options is not None: + cfg.merge_from_dict(args.cfg_options) + print(f'Config:\n{cfg.pretty_text}') + + +if __name__ == '__main__': + main() diff --git a/tools/misc/split_coco.py b/tools/misc/split_coco.py new file mode 100644 index 0000000..78cc655 --- /dev/null +++ b/tools/misc/split_coco.py @@ -0,0 +1,109 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os.path as osp + +import mmcv +import numpy as np + +prog_description = '''K-Fold coco split. + +To split coco data for semi-supervised object detection: + python tools/misc/split_coco.py +''' + + +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument( + '--data-root', + type=str, + help='The data root of coco dataset.', + default='./data/coco/') + parser.add_argument( + '--out-dir', + type=str, + help='The output directory of coco semi-supervised annotations.', + default='./data/coco_semi_annos/') + parser.add_argument( + '--labeled-percent', + type=float, + nargs='+', + help='The percentage of labeled data in the training set.', + default=[1, 2, 5, 10]) + parser.add_argument( + '--fold', + type=int, + help='K-fold cross validation for semi-supervised object detection.', + default=5) + args = parser.parse_args() + return args + + +def split_coco(data_root, out_dir, percent, fold): + """Split COCO data for Semi-supervised object detection. + + Args: + data_root (str): The data root of coco dataset. + out_dir (str): The output directory of coco semi-supervised + annotations. + percent (float): The percentage of labeled data in the training set. + fold (int): The fold of dataset and set as random seed for data split. + """ + + def save_anns(name, images, annotations): + sub_anns = dict() + sub_anns['images'] = images + sub_anns['annotations'] = annotations + sub_anns['licenses'] = anns['licenses'] + sub_anns['categories'] = anns['categories'] + sub_anns['info'] = anns['info'] + + mmcv.mkdir_or_exist(out_dir) + mmcv.dump(sub_anns, f'{out_dir}/{name}.json') + + # set random seed with the fold + np.random.seed(fold) + ann_file = osp.join(data_root, 'annotations/instances_train2017.json') + anns = mmcv.load(ann_file) + + image_list = anns['images'] + labeled_total = int(percent / 100. * len(image_list)) + labeled_inds = set( + np.random.choice(range(len(image_list)), size=labeled_total)) + labeled_ids, labeled_images, unlabeled_images = [], [], [] + + for i in range(len(image_list)): + if i in labeled_inds: + labeled_images.append(image_list[i]) + labeled_ids.append(image_list[i]['id']) + else: + unlabeled_images.append(image_list[i]) + + # get all annotations of labeled images + labeled_ids = set(labeled_ids) + labeled_annotations, unlabeled_annotations = [], [] + + for ann in anns['annotations']: + if ann['image_id'] in labeled_ids: + labeled_annotations.append(ann) + else: + unlabeled_annotations.append(ann) + + # save labeled and unlabeled + labeled_name = f'instances_train2017.{fold}@{percent}' + unlabeled_name = f'instances_train2017.{fold}@{percent}-unlabeled' + + save_anns(labeled_name, labeled_images, labeled_annotations) + save_anns(unlabeled_name, unlabeled_images, unlabeled_annotations) + + +def multi_wrapper(args): + return split_coco(*args) + + +if __name__ == '__main__': + args = parse_args() + arguments_list = [(args.data_root, args.out_dir, p, f) + for f in range(1, args.fold + 1) + for p in args.labeled_percent] + mmcv.track_parallel_progress(multi_wrapper, arguments_list, args.fold) diff --git a/tools/model_converters/detectron2pytorch.py b/tools/model_converters/detectron2pytorch.py new file mode 100644 index 0000000..b7264d5 --- /dev/null +++ b/tools/model_converters/detectron2pytorch.py @@ -0,0 +1,83 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +from collections import OrderedDict + +import mmcv +import torch + +arch_settings = {50: (3, 4, 6, 3), 101: (3, 4, 23, 3)} + + +def convert_bn(blobs, state_dict, caffe_name, torch_name, converted_names): + # detectron replace bn with affine channel layer + state_dict[torch_name + '.bias'] = torch.from_numpy(blobs[caffe_name + + '_b']) + state_dict[torch_name + '.weight'] = torch.from_numpy(blobs[caffe_name + + '_s']) + bn_size = state_dict[torch_name + '.weight'].size() + state_dict[torch_name + '.running_mean'] = torch.zeros(bn_size) + state_dict[torch_name + '.running_var'] = torch.ones(bn_size) + converted_names.add(caffe_name + '_b') + converted_names.add(caffe_name + '_s') + + +def convert_conv_fc(blobs, state_dict, caffe_name, torch_name, + converted_names): + state_dict[torch_name + '.weight'] = torch.from_numpy(blobs[caffe_name + + '_w']) + converted_names.add(caffe_name + '_w') + if caffe_name + '_b' in blobs: + state_dict[torch_name + '.bias'] = torch.from_numpy(blobs[caffe_name + + '_b']) + converted_names.add(caffe_name + '_b') + + +def convert(src, dst, depth): + """Convert keys in detectron pretrained ResNet models to pytorch style.""" + # load arch_settings + if depth not in arch_settings: + raise ValueError('Only support ResNet-50 and ResNet-101 currently') + block_nums = arch_settings[depth] + # load caffe model + caffe_model = mmcv.load(src, encoding='latin1') + blobs = caffe_model['blobs'] if 'blobs' in caffe_model else caffe_model + # convert to pytorch style + state_dict = OrderedDict() + converted_names = set() + convert_conv_fc(blobs, state_dict, 'conv1', 'conv1', converted_names) + convert_bn(blobs, state_dict, 'res_conv1_bn', 'bn1', converted_names) + for i in range(1, len(block_nums) + 1): + for j in range(block_nums[i - 1]): + if j == 0: + convert_conv_fc(blobs, state_dict, f'res{i + 1}_{j}_branch1', + f'layer{i}.{j}.downsample.0', converted_names) + convert_bn(blobs, state_dict, f'res{i + 1}_{j}_branch1_bn', + f'layer{i}.{j}.downsample.1', converted_names) + for k, letter in enumerate(['a', 'b', 'c']): + convert_conv_fc(blobs, state_dict, + f'res{i + 1}_{j}_branch2{letter}', + f'layer{i}.{j}.conv{k+1}', converted_names) + convert_bn(blobs, state_dict, + f'res{i + 1}_{j}_branch2{letter}_bn', + f'layer{i}.{j}.bn{k + 1}', converted_names) + # check if all layers are converted + for key in blobs: + if key not in converted_names: + print(f'Not Convert: {key}') + # save checkpoint + checkpoint = dict() + checkpoint['state_dict'] = state_dict + torch.save(checkpoint, dst) + + +def main(): + parser = argparse.ArgumentParser(description='Convert model keys') + parser.add_argument('src', help='src detectron model path') + parser.add_argument('dst', help='save path') + parser.add_argument('depth', type=int, help='ResNet model depth') + args = parser.parse_args() + convert(args.src, args.dst, args.depth) + + +if __name__ == '__main__': + main() diff --git a/tools/model_converters/publish_model.py b/tools/model_converters/publish_model.py new file mode 100644 index 0000000..219fcdf --- /dev/null +++ b/tools/model_converters/publish_model.py @@ -0,0 +1,43 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import subprocess + +import torch + + +def parse_args(): + parser = argparse.ArgumentParser( + description='Process a checkpoint to be published') + parser.add_argument('in_file', help='input checkpoint filename') + parser.add_argument('out_file', help='output checkpoint filename') + args = parser.parse_args() + return args + + +def process_checkpoint(in_file, out_file): + checkpoint = torch.load(in_file, map_location='cpu') + # remove optimizer for smaller file size + if 'optimizer' in checkpoint: + del checkpoint['optimizer'] + # if it is necessary to remove some sensitive data in checkpoint['meta'], + # add the code here. + if torch.__version__ >= '1.6': + torch.save(checkpoint, out_file, _use_new_zipfile_serialization=False) + else: + torch.save(checkpoint, out_file) + sha = subprocess.check_output(['sha256sum', out_file]).decode() + if out_file.endswith('.pth'): + out_file_name = out_file[:-4] + else: + out_file_name = out_file + final_file = out_file_name + f'-{sha[:8]}.pth' + subprocess.Popen(['mv', out_file, final_file]) + + +def main(): + args = parse_args() + process_checkpoint(args.in_file, args.out_file) + + +if __name__ == '__main__': + main() diff --git a/tools/model_converters/regnet2mmdet.py b/tools/model_converters/regnet2mmdet.py new file mode 100644 index 0000000..fbf8c8f --- /dev/null +++ b/tools/model_converters/regnet2mmdet.py @@ -0,0 +1,90 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +from collections import OrderedDict + +import torch + + +def convert_stem(model_key, model_weight, state_dict, converted_names): + new_key = model_key.replace('stem.conv', 'conv1') + new_key = new_key.replace('stem.bn', 'bn1') + state_dict[new_key] = model_weight + converted_names.add(model_key) + print(f'Convert {model_key} to {new_key}') + + +def convert_head(model_key, model_weight, state_dict, converted_names): + new_key = model_key.replace('head.fc', 'fc') + state_dict[new_key] = model_weight + converted_names.add(model_key) + print(f'Convert {model_key} to {new_key}') + + +def convert_reslayer(model_key, model_weight, state_dict, converted_names): + split_keys = model_key.split('.') + layer, block, module = split_keys[:3] + block_id = int(block[1:]) + layer_name = f'layer{int(layer[1:])}' + block_name = f'{block_id - 1}' + + if block_id == 1 and module == 'bn': + new_key = f'{layer_name}.{block_name}.downsample.1.{split_keys[-1]}' + elif block_id == 1 and module == 'proj': + new_key = f'{layer_name}.{block_name}.downsample.0.{split_keys[-1]}' + elif module == 'f': + if split_keys[3] == 'a_bn': + module_name = 'bn1' + elif split_keys[3] == 'b_bn': + module_name = 'bn2' + elif split_keys[3] == 'c_bn': + module_name = 'bn3' + elif split_keys[3] == 'a': + module_name = 'conv1' + elif split_keys[3] == 'b': + module_name = 'conv2' + elif split_keys[3] == 'c': + module_name = 'conv3' + new_key = f'{layer_name}.{block_name}.{module_name}.{split_keys[-1]}' + else: + raise ValueError(f'Unsupported conversion of key {model_key}') + print(f'Convert {model_key} to {new_key}') + state_dict[new_key] = model_weight + converted_names.add(model_key) + + +def convert(src, dst): + """Convert keys in pycls pretrained RegNet models to mmdet style.""" + # load caffe model + regnet_model = torch.load(src) + blobs = regnet_model['model_state'] + # convert to pytorch style + state_dict = OrderedDict() + converted_names = set() + for key, weight in blobs.items(): + if 'stem' in key: + convert_stem(key, weight, state_dict, converted_names) + elif 'head' in key: + convert_head(key, weight, state_dict, converted_names) + elif key.startswith('s'): + convert_reslayer(key, weight, state_dict, converted_names) + + # check if all layers are converted + for key in blobs: + if key not in converted_names: + print(f'not converted: {key}') + # save checkpoint + checkpoint = dict() + checkpoint['state_dict'] = state_dict + torch.save(checkpoint, dst) + + +def main(): + parser = argparse.ArgumentParser(description='Convert model keys') + parser.add_argument('src', help='src detectron model path') + parser.add_argument('dst', help='save path') + args = parser.parse_args() + convert(args.src, args.dst) + + +if __name__ == '__main__': + main() diff --git a/tools/model_converters/selfsup2mmdet.py b/tools/model_converters/selfsup2mmdet.py new file mode 100644 index 0000000..bc8cce1 --- /dev/null +++ b/tools/model_converters/selfsup2mmdet.py @@ -0,0 +1,42 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +from collections import OrderedDict + +import torch + + +def moco_convert(src, dst): + """Convert keys in pycls pretrained moco models to mmdet style.""" + # load caffe model + moco_model = torch.load(src) + blobs = moco_model['state_dict'] + # convert to pytorch style + state_dict = OrderedDict() + for k, v in blobs.items(): + if not k.startswith('module.encoder_q.'): + continue + old_k = k + k = k.replace('module.encoder_q.', '') + state_dict[k] = v + print(old_k, '->', k) + # save checkpoint + checkpoint = dict() + checkpoint['state_dict'] = state_dict + torch.save(checkpoint, dst) + + +def main(): + parser = argparse.ArgumentParser(description='Convert model keys') + parser.add_argument('src', help='src detectron model path') + parser.add_argument('dst', help='save path') + parser.add_argument( + '--selfsup', type=str, choices=['moco', 'swav'], help='save path') + args = parser.parse_args() + if args.selfsup == 'moco': + moco_convert(args.src, args.dst) + elif args.selfsup == 'swav': + print('SWAV does not need to convert the keys') + + +if __name__ == '__main__': + main() diff --git a/tools/model_converters/upgrade_model_version.py b/tools/model_converters/upgrade_model_version.py new file mode 100644 index 0000000..36ee607 --- /dev/null +++ b/tools/model_converters/upgrade_model_version.py @@ -0,0 +1,210 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import re +import tempfile +from collections import OrderedDict + +import torch +from mmcv import Config + + +def is_head(key): + valid_head_list = [ + 'bbox_head', 'mask_head', 'semantic_head', 'grid_head', 'mask_iou_head' + ] + + return any(key.startswith(h) for h in valid_head_list) + + +def parse_config(config_strings): + temp_file = tempfile.NamedTemporaryFile() + config_path = f'{temp_file.name}.py' + with open(config_path, 'w') as f: + f.write(config_strings) + + config = Config.fromfile(config_path) + is_two_stage = True + is_ssd = False + is_retina = False + reg_cls_agnostic = False + if 'rpn_head' not in config.model: + is_two_stage = False + # check whether it is SSD + if config.model.bbox_head.type == 'SSDHead': + is_ssd = True + elif config.model.bbox_head.type == 'RetinaHead': + is_retina = True + elif isinstance(config.model['bbox_head'], list): + reg_cls_agnostic = True + elif 'reg_class_agnostic' in config.model.bbox_head: + reg_cls_agnostic = config.model.bbox_head \ + .reg_class_agnostic + temp_file.close() + return is_two_stage, is_ssd, is_retina, reg_cls_agnostic + + +def reorder_cls_channel(val, num_classes=81): + # bias + if val.dim() == 1: + new_val = torch.cat((val[1:], val[:1]), dim=0) + # weight + else: + out_channels, in_channels = val.shape[:2] + # conv_cls for softmax output + if out_channels != num_classes and out_channels % num_classes == 0: + new_val = val.reshape(-1, num_classes, in_channels, *val.shape[2:]) + new_val = torch.cat((new_val[:, 1:], new_val[:, :1]), dim=1) + new_val = new_val.reshape(val.size()) + # fc_cls + elif out_channels == num_classes: + new_val = torch.cat((val[1:], val[:1]), dim=0) + # agnostic | retina_cls | rpn_cls + else: + new_val = val + + return new_val + + +def truncate_cls_channel(val, num_classes=81): + + # bias + if val.dim() == 1: + if val.size(0) % num_classes == 0: + new_val = val[:num_classes - 1] + else: + new_val = val + # weight + else: + out_channels, in_channels = val.shape[:2] + # conv_logits + if out_channels % num_classes == 0: + new_val = val.reshape(num_classes, in_channels, *val.shape[2:])[1:] + new_val = new_val.reshape(-1, *val.shape[1:]) + # agnostic + else: + new_val = val + + return new_val + + +def truncate_reg_channel(val, num_classes=81): + # bias + if val.dim() == 1: + # fc_reg | rpn_reg + if val.size(0) % num_classes == 0: + new_val = val.reshape(num_classes, -1)[:num_classes - 1] + new_val = new_val.reshape(-1) + # agnostic + else: + new_val = val + # weight + else: + out_channels, in_channels = val.shape[:2] + # fc_reg | rpn_reg + if out_channels % num_classes == 0: + new_val = val.reshape(num_classes, -1, in_channels, + *val.shape[2:])[1:] + new_val = new_val.reshape(-1, *val.shape[1:]) + # agnostic + else: + new_val = val + + return new_val + + +def convert(in_file, out_file, num_classes): + """Convert keys in checkpoints. + + There can be some breaking changes during the development of mmdetection, + and this tool is used for upgrading checkpoints trained with old versions + to the latest one. + """ + checkpoint = torch.load(in_file) + in_state_dict = checkpoint.pop('state_dict') + out_state_dict = OrderedDict() + meta_info = checkpoint['meta'] + is_two_stage, is_ssd, is_retina, reg_cls_agnostic = parse_config( + '#' + meta_info['config']) + if meta_info['mmdet_version'] <= '0.5.3' and is_retina: + upgrade_retina = True + else: + upgrade_retina = False + + # MMDetection v2.5.0 unifies the class order in RPN + # if the model is trained in version=2.5.0 + if meta_info['mmdet_version'] < '2.5.0': + upgrade_rpn = True + else: + upgrade_rpn = False + + for key, val in in_state_dict.items(): + new_key = key + new_val = val + if is_two_stage and is_head(key): + new_key = 'roi_head.{}'.format(key) + + # classification + if upgrade_rpn: + m = re.search( + r'(conv_cls|retina_cls|rpn_cls|fc_cls|fcos_cls|' + r'fovea_cls).(weight|bias)', new_key) + else: + m = re.search( + r'(conv_cls|retina_cls|fc_cls|fcos_cls|' + r'fovea_cls).(weight|bias)', new_key) + if m is not None: + print(f'reorder cls channels of {new_key}') + new_val = reorder_cls_channel(val, num_classes) + + # regression + if upgrade_rpn: + m = re.search(r'(fc_reg).(weight|bias)', new_key) + else: + m = re.search(r'(fc_reg|rpn_reg).(weight|bias)', new_key) + if m is not None and not reg_cls_agnostic: + print(f'truncate regression channels of {new_key}') + new_val = truncate_reg_channel(val, num_classes) + + # mask head + m = re.search(r'(conv_logits).(weight|bias)', new_key) + if m is not None: + print(f'truncate mask prediction channels of {new_key}') + new_val = truncate_cls_channel(val, num_classes) + + m = re.search(r'(cls_convs|reg_convs).\d.(weight|bias)', key) + # Legacy issues in RetinaNet since V1.x + # Use ConvModule instead of nn.Conv2d in RetinaNet + # cls_convs.0.weight -> cls_convs.0.conv.weight + if m is not None and upgrade_retina: + param = m.groups()[1] + new_key = key.replace(param, f'conv.{param}') + out_state_dict[new_key] = val + print(f'rename the name of {key} to {new_key}') + continue + + m = re.search(r'(cls_convs).\d.(weight|bias)', key) + if m is not None and is_ssd: + print(f'reorder cls channels of {new_key}') + new_val = reorder_cls_channel(val, num_classes) + + out_state_dict[new_key] = new_val + checkpoint['state_dict'] = out_state_dict + torch.save(checkpoint, out_file) + + +def main(): + parser = argparse.ArgumentParser(description='Upgrade model version') + parser.add_argument('in_file', help='input checkpoint file') + parser.add_argument('out_file', help='output checkpoint file') + parser.add_argument( + '--num-classes', + type=int, + default=81, + help='number of classes of the original model') + args = parser.parse_args() + convert(args.in_file, args.out_file, args.num_classes) + + +if __name__ == '__main__': + main() diff --git a/tools/model_converters/upgrade_ssd_version.py b/tools/model_converters/upgrade_ssd_version.py new file mode 100644 index 0000000..befff45 --- /dev/null +++ b/tools/model_converters/upgrade_ssd_version.py @@ -0,0 +1,58 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import tempfile +from collections import OrderedDict + +import torch +from mmcv import Config + + +def parse_config(config_strings): + temp_file = tempfile.NamedTemporaryFile() + config_path = f'{temp_file.name}.py' + with open(config_path, 'w') as f: + f.write(config_strings) + + config = Config.fromfile(config_path) + # check whether it is SSD + if config.model.bbox_head.type != 'SSDHead': + raise AssertionError('This is not a SSD model.') + + +def convert(in_file, out_file): + checkpoint = torch.load(in_file) + in_state_dict = checkpoint.pop('state_dict') + out_state_dict = OrderedDict() + meta_info = checkpoint['meta'] + parse_config('#' + meta_info['config']) + for key, value in in_state_dict.items(): + if 'extra' in key: + layer_idx = int(key.split('.')[2]) + new_key = 'neck.extra_layers.{}.{}.conv.'.format( + layer_idx // 2, layer_idx % 2) + key.split('.')[-1] + elif 'l2_norm' in key: + new_key = 'neck.l2_norm.weight' + elif 'bbox_head' in key: + new_key = key[:21] + '.0' + key[21:] + else: + new_key = key + out_state_dict[new_key] = value + checkpoint['state_dict'] = out_state_dict + + if torch.__version__ >= '1.6': + torch.save(checkpoint, out_file, _use_new_zipfile_serialization=False) + else: + torch.save(checkpoint, out_file) + + +def main(): + parser = argparse.ArgumentParser(description='Upgrade SSD version') + parser.add_argument('in_file', help='input checkpoint file') + parser.add_argument('out_file', help='output checkpoint file') + + args = parser.parse_args() + convert(args.in_file, args.out_file) + + +if __name__ == '__main__': + main() diff --git a/tools/pr_curve.sh b/tools/pr_curve.sh new file mode 100644 index 0000000..ed34934 --- /dev/null +++ b/tools/pr_curve.sh @@ -0,0 +1,22 @@ +# python tools/analysis_tools/plot_pr_curves.py \ +# configs/ssd/ssdlite_mobilenetv2_scratch_600e_voc.py \ +# work_dirs/ssdlite_mobilenetv2_scratch_600e_voc/results.pkl \ +# --out work_dirs/ssdlite_mobilenetv2_scratch_600e_voc/pr_curve \ + + +# python tools/analysis_tools/plot_pr_curves.py \ +# configs/ssd/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4.py \ +# work_dirs/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4/results.pkl \ +# --out work_dirs/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4/pr_curve \ + + +# python tools/analysis_tools/plot_pr_curves.py \ +# configs/ssd/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4.py \ +# work_dirs/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4_mypro_temp_qloss/results.pkl \ +# --out work_dirs/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4_mypro_temp_qloss/pr_curve \ + +python tools/analysis_tools/plot_pr_curves.py \ + configs/ssd/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4.py \ + work_dirs/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4_mypro_temp/results.pkl \ + --out work_dirs/ssdlite_mobilenetv2_scratch_600e_voc_quant_w4a4_mypro_temp/pr_curve \ + diff --git a/tools/slurm_test.sh b/tools/slurm_test.sh new file mode 100755 index 0000000..6dd67e5 --- /dev/null +++ b/tools/slurm_test.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +set -x + +PARTITION=$1 +JOB_NAME=$2 +CONFIG=$3 +CHECKPOINT=$4 +GPUS=${GPUS:-8} +GPUS_PER_NODE=${GPUS_PER_NODE:-8} +CPUS_PER_TASK=${CPUS_PER_TASK:-5} +PY_ARGS=${@:5} +SRUN_ARGS=${SRUN_ARGS:-""} + +PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ +srun -p ${PARTITION} \ + --job-name=${JOB_NAME} \ + --gres=gpu:${GPUS_PER_NODE} \ + --ntasks=${GPUS} \ + --ntasks-per-node=${GPUS_PER_NODE} \ + --cpus-per-task=${CPUS_PER_TASK} \ + --kill-on-bad-exit=1 \ + ${SRUN_ARGS} \ + python -u tools/test.py ${CONFIG} ${CHECKPOINT} --launcher="slurm" ${PY_ARGS} diff --git a/tools/slurm_train.sh b/tools/slurm_train.sh new file mode 100755 index 0000000..b3feb3d --- /dev/null +++ b/tools/slurm_train.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +set -x + +PARTITION=$1 +JOB_NAME=$2 +CONFIG=$3 +WORK_DIR=$4 +GPUS=${GPUS:-8} +GPUS_PER_NODE=${GPUS_PER_NODE:-8} +CPUS_PER_TASK=${CPUS_PER_TASK:-5} +SRUN_ARGS=${SRUN_ARGS:-""} +PY_ARGS=${@:5} + +PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ +srun -p ${PARTITION} \ + --job-name=${JOB_NAME} \ + --gres=gpu:${GPUS_PER_NODE} \ + --ntasks=${GPUS} \ + --ntasks-per-node=${GPUS_PER_NODE} \ + --cpus-per-task=${CPUS_PER_TASK} \ + --kill-on-bad-exit=1 \ + ${SRUN_ARGS} \ + python -u tools/train.py ${CONFIG} --work-dir=${WORK_DIR} --launcher="slurm" ${PY_ARGS} diff --git a/tools/starter_scripts/atss_50/qat/coco/dist_lsq_HQOD_atss_50_coco_w2a2.sh b/tools/starter_scripts/atss_50/qat/coco/dist_lsq_HQOD_atss_50_coco_w2a2.sh new file mode 100755 index 0000000..c34c6c2 --- /dev/null +++ b/tools/starter_scripts/atss_50/qat/coco/dist_lsq_HQOD_atss_50_coco_w2a2.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=6,7 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12327 \ + --nproc_per_node=2 \ + tools/train.py \ + configs/atss/atss_r50_fpn_1x_coco_quant_w2a2.py \ + mqbconfig/lsq/quant_config_mypro_w2a2_weight_loose.yaml \ + --work-dir /work_dirs/atss_r50_fpn_1x_coco_w2a2_LSQ_HQOD \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/atss_50/qat/coco/dist_lsq_HQOD_atss_50_coco_w4a4.sh b/tools/starter_scripts/atss_50/qat/coco/dist_lsq_HQOD_atss_50_coco_w4a4.sh new file mode 100755 index 0000000..0d19d86 --- /dev/null +++ b/tools/starter_scripts/atss_50/qat/coco/dist_lsq_HQOD_atss_50_coco_w4a4.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=5 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12326 \ + --nproc_per_node=1 \ + tools/train.py \ + configs/atss/atss_r50_fpn_1x_coco_quant_w4a4.py \ + mqbconfig/lsq/quant_config_mypro_w4a4.yaml \ + --work-dir /work_dirs/atss_r50_fpn_1x_coco_w4a4_LSQ_HQOD \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/atss_50/qat/coco/dist_lsq_atss_50_coco_w2a2.sh b/tools/starter_scripts/atss_50/qat/coco/dist_lsq_atss_50_coco_w2a2.sh new file mode 100755 index 0000000..89a7015 --- /dev/null +++ b/tools/starter_scripts/atss_50/qat/coco/dist_lsq_atss_50_coco_w2a2.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=4,5 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12325 \ + --nproc_per_node=2 \ + tools/train.py \ + configs/atss/atss_r50_fpn_1x_coco_quant_w2a2.py \ + mqbconfig/lsq/quant_config_w2a2_weight_loose.yaml \ + --work-dir /work_dirs/atss_r50_fpn_1x_coco_w2a2_LSQ \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/atss_50/qat/coco/dist_lsq_atss_50_coco_w4a4.sh b/tools/starter_scripts/atss_50/qat/coco/dist_lsq_atss_50_coco_w4a4.sh new file mode 100755 index 0000000..91758b5 --- /dev/null +++ b/tools/starter_scripts/atss_50/qat/coco/dist_lsq_atss_50_coco_w4a4.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=3 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12324 \ + --nproc_per_node=1 \ + tools/train.py \ + configs/atss/atss_r50_fpn_1x_coco_quant_w4a4.py \ + mqbconfig/lsq/quant_config_w4a4.yaml \ + --work-dir /work_dirs/atss_r50_fpn_1x_coco_w4a4_LSQ \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/atss_50/qat/coco/dist_tqt_HQOD_atss_50_coco_w2a2.sh b/tools/starter_scripts/atss_50/qat/coco/dist_tqt_HQOD_atss_50_coco_w2a2.sh new file mode 100755 index 0000000..0400f32 --- /dev/null +++ b/tools/starter_scripts/atss_50/qat/coco/dist_tqt_HQOD_atss_50_coco_w2a2.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12323 \ + --nproc_per_node=8 \ + tools/train.py \ + configs/atss/atss_r50_fpn_1x_coco_quant_w2a2.py \ + mqbconfig/tqt/quant_config_mypro_w2a2.yaml \ + --work-dir /work_dirs/atss_r50_fpn_1x_coco_w2a2_TQT_HQOD \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/atss_50/qat/coco/dist_tqt_HQOD_atss_50_coco_w4a4.sh b/tools/starter_scripts/atss_50/qat/coco/dist_tqt_HQOD_atss_50_coco_w4a4.sh new file mode 100755 index 0000000..56eb947 --- /dev/null +++ b/tools/starter_scripts/atss_50/qat/coco/dist_tqt_HQOD_atss_50_coco_w4a4.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=7 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12322 \ + --nproc_per_node=1 \ + tools/train.py \ + configs/atss/atss_r50_fpn_1x_coco_quant_w4a4.py \ + mqbconfig/tqt/quant_config_mypro_w4a4.yaml \ + --work-dir /work_dirs/atss_r50_fpn_1x_coco_w4a4_TQT_HQOD \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/atss_50/qat/coco/dist_tqt_atss_50_coco_w2a2.sh b/tools/starter_scripts/atss_50/qat/coco/dist_tqt_atss_50_coco_w2a2.sh new file mode 100755 index 0000000..3292a54 --- /dev/null +++ b/tools/starter_scripts/atss_50/qat/coco/dist_tqt_atss_50_coco_w2a2.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12321 \ + --nproc_per_node=8 \ + tools/train.py \ + configs/atss/atss_r50_fpn_1x_coco_quant_w2a2.py \ + mqbconfig/tqt/quant_config_w2a2.yaml \ + --work-dir /work_dirs/atss_r50_fpn_1x_coco_w2a2_TQT \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/atss_50/qat/coco/dist_tqt_atss_50_coco_w4a4.sh b/tools/starter_scripts/atss_50/qat/coco/dist_tqt_atss_50_coco_w4a4.sh new file mode 100755 index 0000000..1538d02 --- /dev/null +++ b/tools/starter_scripts/atss_50/qat/coco/dist_tqt_atss_50_coco_w4a4.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=6 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12320 \ + --nproc_per_node=1 \ + tools/train.py \ + configs/atss/atss_r50_fpn_1x_coco_quant_w4a4.py \ + mqbconfig/tqt/quant_config_w4a4.yaml \ + --work-dir /work_dirs/atss_r50_fpn_1x_coco_w4a4_TQT \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/experiment1.txt b/tools/starter_scripts/experiment1.txt new file mode 100644 index 0000000..d7b83d4 --- /dev/null +++ b/tools/starter_scripts/experiment1.txt @@ -0,0 +1,8 @@ +tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w4a4.sh +tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w2a2.sh +tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_HQOD_retinanet_18_coco_w4a4.sh +tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_HQOD_retinanet_18_coco_w2a2.sh +tools/starter_scripts/retinanet_50/qat/coco/dist_lsq_retinanet_50_coco_w4a4.sh +tools/starter_scripts/retinanet_50/qat/coco/dist_lsq_retinanet_50_coco_w2a2.sh +tools/starter_scripts/retinanet_50/qat/coco/dist_lsq_HQOD_retinanet_50_coco_w4a4.sh +tools/starter_scripts/retinanet_18/dist_train_retinanet_18_coco_AQD.sh \ No newline at end of file diff --git a/tools/starter_scripts/main.sh b/tools/starter_scripts/main.sh new file mode 100644 index 0000000..3cd3518 --- /dev/null +++ b/tools/starter_scripts/main.sh @@ -0,0 +1,41 @@ +# 删除临时文件 clean +rm -f ./temp_* && rm -f ./tmp/* + +# 把上一次的tmux窗口删除 +tmux kill-session -t $tmux_s_name +tmux kill-session -t fake +# 得先制造一个无用的session,否则无法通过conf文件新建session。不太清楚为什么,玄学。 +tmux new-session -d -s fake + +# 创建一个新的tmux会话,并命名为my_session +tmux new-session -d -s $tmux_s_name +# 加载配置文件定制当前tmux会话 +tmux source-file tools/starter_scripts/main.tmux.conf +echo 'Create Tmux!!' + +echo 'sleep 3s, wait zsh init.Maybe nothing.' +sleep 3 + +# # 将命令分别发送到每个窗格并在前台执行 +split -l 1 -d $commands_file temp_ +mv -f ./temp_* ./tmp + +# sendkey_w1 +for i in 0 1 2 3; do + # 这一步是避免zsh的更新提示 + tmux send-keys -t $tmux_s_name:w1.$i "n" Enter + # 先切到对应的conda环境 + tmux send-keys -t $tmux_s_name:w1.$i "conda activate LLML" Enter + sleep 1 + tmux send-keys -t $tmux_s_name:w1.$i "cat ./tmp/temp_0$i | xargs -I {} sh -c 'echo {};{}'" Enter +done + +# sendkey_w2 +for i in 4 5 6 7; do + # 这一步是避免zsh的更新提示 + tmux send-keys -t $tmux_s_name:w2.$(($i - 4)) "n" Enter + tmux send-keys -t $tmux_s_name:w2.$(($i - 4)) "conda activate LLML" Enter + sleep 1 + tmux send-keys -t $tmux_s_name:w2.$(($i - 4)) "cat ./tmp/temp_0$i | xargs -I {} sh -c 'echo {};{}'" Enter +done + diff --git a/tools/starter_scripts/main.tmux.conf b/tools/starter_scripts/main.tmux.conf new file mode 100644 index 0000000..a40564e --- /dev/null +++ b/tools/starter_scripts/main.tmux.conf @@ -0,0 +1,23 @@ + + +# 启用鼠标支持 +set -g mouse on + +# 创建第一个窗口 +rename-window -t 0 "w1" + +# 将窗口设置为2x2布局,并创建4个面板 +split-window -v +split-window -h +select-pane -t 0 +split-window -h + + +# 创建第二个窗口 +new-window -n "w2" + +# 将窗口设置为2x2布局,并创建4个面板 +split-window -v +split-window -h +select-pane -t 0 +split-window -h diff --git a/tools/starter_scripts/retinanet_18/dist_train_retinanet_18_coco_AQD.sh b/tools/starter_scripts/retinanet_18/dist_train_retinanet_18_coco_AQD.sh new file mode 100755 index 0000000..00a7769 --- /dev/null +++ b/tools/starter_scripts/retinanet_18/dist_train_retinanet_18_coco_AQD.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12312 \ + --nproc_per_node=8 \ + tools/train.py \ + configs/retinanet/retinanet_r18_fpn_1x_coco.py \ + shit \ + --work-dir /work_dirs/retinanet_r18_fpn_1x_coco_AQD \ + --aqd-mode 5 \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_HQOD_retinanet_18_coco_w2a2.sh b/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_HQOD_retinanet_18_coco_w2a2.sh new file mode 100755 index 0000000..2a60ef1 --- /dev/null +++ b/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_HQOD_retinanet_18_coco_w2a2.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=5 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12303 \ + --nproc_per_node=1 \ + tools/train.py \ + configs/retinanet/retinanet_r18_fpn_1x_coco_quant_w2a2.py \ + mqbconfig/lsq/quant_config_mypro_w2a2.yaml \ + --work-dir /work_dirs/retinanet_r18_fpn_coco_w2a2_LSQ_HQOD \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_HQOD_retinanet_18_coco_w2a2_abla_HIoU.sh b/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_HQOD_retinanet_18_coco_w2a2_abla_HIoU.sh new file mode 100755 index 0000000..aa396b3 --- /dev/null +++ b/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_HQOD_retinanet_18_coco_w2a2_abla_HIoU.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=1 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12303 \ + --nproc_per_node=1 \ + tools/train.py \ + configs/retinanet/retinanet_r18_fpn_1x_coco_quant_w2a2.py \ + mqbconfig/lsq/quant_config_mypro_w2a2.yaml \ + --work-dir /work_dirs/retinanet_r18_fpn_coco_w2a2_LSQ_HQOD_Abla_HIoU \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_HQOD_retinanet_18_coco_w4a4.sh b/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_HQOD_retinanet_18_coco_w4a4.sh new file mode 100755 index 0000000..fc0b6a9 --- /dev/null +++ b/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_HQOD_retinanet_18_coco_w4a4.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=0 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12302 \ + --nproc_per_node=1 \ + tools/train.py \ + configs/retinanet/retinanet_r18_fpn_1x_coco_quant_w4a4.py \ + mqbconfig/lsq/quant_config_mypro_w4a4.yaml \ + --work-dir work_dirs/retinanet_r18_fpn_coco_w4a4_LSQ_HQOD \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_HarDet_retinanet_18_coco_w2a2.sh b/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_HarDet_retinanet_18_coco_w2a2.sh new file mode 100755 index 0000000..12bcf49 --- /dev/null +++ b/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_HarDet_retinanet_18_coco_w2a2.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=0 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12394 \ + --nproc_per_node=1 \ + tools/train.py \ + configs/retinanet/retinanet_r18_fpn_1x_coco_quant_w2a2.py \ + mqbconfig/lsq/quant_config_hardet_w2a2.yaml \ + --work-dir /work_dirs/retinanet_r18_fpn_coco_w2a2_LSQ_HarDet \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w2a2.sh b/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w2a2.sh new file mode 100755 index 0000000..966318a --- /dev/null +++ b/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w2a2.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=1 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12301 \ + --nproc_per_node=1 \ + tools/train.py \ + configs/retinanet/retinanet_r18_fpn_1x_coco_quant_w2a2.py \ + mqbconfig/lsq/quant_config_w2a2.yaml \ + --work-dir /work_dirs/retinanet_r18_fpn_coco_w2a2_LSQ \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w2a2_AQD.sh b/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w2a2_AQD.sh new file mode 100755 index 0000000..4297635 --- /dev/null +++ b/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w2a2_AQD.sh @@ -0,0 +1,14 @@ +CUDA_VISIBLE_DEVICES=6,7 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12301 \ + --nproc_per_node=2 \ + tools/train.py \ + configs/retinanet/retinanet_r18_fpn_1x_coco_quant_w2a2_aqd.py \ + mqbconfig/lsq/quant_config_w2a2.yaml \ + --work-dir /work_dirs/retinanet_r18_fpn_coco_w2a2_LSQ_AQD \ + --aqd-mode 5 \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w2a2_HQOD_AQD.sh b/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w2a2_HQOD_AQD.sh new file mode 100755 index 0000000..dbc3404 --- /dev/null +++ b/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w2a2_HQOD_AQD.sh @@ -0,0 +1,14 @@ +CUDA_VISIBLE_DEVICES=4,5 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12313 \ + --nproc_per_node=2 \ + tools/train.py \ + configs/retinanet/retinanet_r18_fpn_1x_coco_quant_w2a2_aqd.py \ + mqbconfig/lsq/quant_config_mypro_w2a2.yaml \ + --work-dir /work_dirs/retinanet_r18_fpn_coco_w2a2_LSQ_HQOD_AQD \ + --aqd-mode 5 \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w4a4.sh b/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w4a4.sh new file mode 100755 index 0000000..a706b01 --- /dev/null +++ b/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w4a4.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=0 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12300 \ + --nproc_per_node=1 \ + tools/train.py \ + configs/retinanet/retinanet_r18_fpn_1x_coco_quant_w4a4.py \ + mqbconfig/lsq/quant_config_w4a4.yaml \ + --work-dir /work_dirs/retinanet_r18_fpn_coco_w4a4_LSQ \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w4a4_AQD.sh b/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w4a4_AQD.sh new file mode 100755 index 0000000..f2ba216 --- /dev/null +++ b/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w4a4_AQD.sh @@ -0,0 +1,14 @@ +CUDA_VISIBLE_DEVICES=0,1 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12214 \ + --nproc_per_node=2 \ + tools/train.py \ + configs/retinanet/retinanet_r18_fpn_1x_coco_quant_w4a4_aqd.py \ + mqbconfig/lsq/quant_config_w4a4.yaml \ + --work-dir /work_dirs/retinanet_r18_fpn_coco_w4a4_LSQ_AQD \ + --aqd-mode 5 \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w4a4_HQOD_AQD.sh b/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w4a4_HQOD_AQD.sh new file mode 100755 index 0000000..0fc947b --- /dev/null +++ b/tools/starter_scripts/retinanet_18/qat/coco/dist_lsq_retinanet_18_coco_w4a4_HQOD_AQD.sh @@ -0,0 +1,14 @@ +CUDA_VISIBLE_DEVICES=2,3 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12314 \ + --nproc_per_node=2 \ + tools/train.py \ + configs/retinanet/retinanet_r18_fpn_1x_coco_quant_w4a4_aqd.py \ + mqbconfig/lsq/quant_config_mypro_w4a4.yaml \ + --work-dir /work_dirs/retinanet_r18_fpn_coco_w4a4_LSQ_HQOD_AQD \ + --aqd-mode 5 \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/retinanet_50/qat/coco/dist_lsq_HQOD_retinanet_50_coco_w2a2.sh b/tools/starter_scripts/retinanet_50/qat/coco/dist_lsq_HQOD_retinanet_50_coco_w2a2.sh new file mode 100755 index 0000000..1a6fe6a --- /dev/null +++ b/tools/starter_scripts/retinanet_50/qat/coco/dist_lsq_HQOD_retinanet_50_coco_w2a2.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=4,5,6,7 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12307 \ + --nproc_per_node=4 \ + tools/train.py \ + configs/retinanet/retinanet_r50_fpn_1x_coco_quant_w2a2.py \ + mqbconfig/lsq/quant_config_mypro_w2a2_weight_loose.yaml \ + --work-dir /work_dirs/retinanet_r50_fpn_coco_w2a2_LSQ_HQOD \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/retinanet_50/qat/coco/dist_lsq_HQOD_retinanet_50_coco_w4a4.sh b/tools/starter_scripts/retinanet_50/qat/coco/dist_lsq_HQOD_retinanet_50_coco_w4a4.sh new file mode 100755 index 0000000..a04596b --- /dev/null +++ b/tools/starter_scripts/retinanet_50/qat/coco/dist_lsq_HQOD_retinanet_50_coco_w4a4.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=1 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12306 \ + --nproc_per_node=1 \ + tools/train.py \ + configs/retinanet/retinanet_r50_fpn_1x_coco_quant_w4a4.py \ + mqbconfig/lsq/quant_config_mypro_w4a4.yaml \ + --work-dir /work_dirs/retinanet_r50_fpn_coco_w4a4_LSQ_HQOD \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/retinanet_50/qat/coco/dist_lsq_retinanet_50_coco_w2a2.sh b/tools/starter_scripts/retinanet_50/qat/coco/dist_lsq_retinanet_50_coco_w2a2.sh new file mode 100755 index 0000000..32f9173 --- /dev/null +++ b/tools/starter_scripts/retinanet_50/qat/coco/dist_lsq_retinanet_50_coco_w2a2.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=0,1,2,3 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12305 \ + --nproc_per_node=4 \ + tools/train.py \ + configs/retinanet/retinanet_r50_fpn_1x_coco_quant_w2a2.py \ + mqbconfig/lsq/quant_config_w2a2_weight_loose.yaml \ + --work-dir /work_dirs/retinanet_r50_fpn_coco_w2a2_LSQ \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/retinanet_50/qat/coco/dist_lsq_retinanet_50_coco_w4a4.sh b/tools/starter_scripts/retinanet_50/qat/coco/dist_lsq_retinanet_50_coco_w4a4.sh new file mode 100755 index 0000000..0d6ab0f --- /dev/null +++ b/tools/starter_scripts/retinanet_50/qat/coco/dist_lsq_retinanet_50_coco_w4a4.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=4 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12304 \ + --nproc_per_node=1 \ + tools/train.py \ + configs/retinanet/retinanet_r50_fpn_1x_coco_quant_w4a4.py \ + mqbconfig/lsq/quant_config_w4a4.yaml \ + --work-dir /work_dirs/retinanet_r50_fpn_coco_w4a4_LSQ \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/yolox_s/qat/coco/dist_lsq_HQOD_yolox_s_coco_w2a2.sh b/tools/starter_scripts/yolox_s/qat/coco/dist_lsq_HQOD_yolox_s_coco_w2a2.sh new file mode 100755 index 0000000..317f194 --- /dev/null +++ b/tools/starter_scripts/yolox_s/qat/coco/dist_lsq_HQOD_yolox_s_coco_w2a2.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=3 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12311 \ + --nproc_per_node=1 \ + tools/train.py \ + configs/yolox/yolox_s_8x8_300e_coco_quant_w2a2.py \ + mqbconfig/lsq/quant_config_mypro_w2a2_weight_loose.yaml \ + --work-dir /work_dirs/yolox_s_coco_w2a2_LSQ_HQOD \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/yolox_s/qat/coco/dist_lsq_HQOD_yolox_s_coco_w4a4.sh b/tools/starter_scripts/yolox_s/qat/coco/dist_lsq_HQOD_yolox_s_coco_w4a4.sh new file mode 100755 index 0000000..ccdb37d --- /dev/null +++ b/tools/starter_scripts/yolox_s/qat/coco/dist_lsq_HQOD_yolox_s_coco_w4a4.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=4,5 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12310 \ + --nproc_per_node=1 \ + tools/train.py \ + configs/yolox/yolox_s_8x8_300e_coco_quant_w4a4.py \ + mqbconfig/lsq/quant_config_mypro_w4a4.yaml \ + --work-dir /work_dirs/yolox_s_coco_w4a4_LSQ_HQOD \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/yolox_s/qat/coco/dist_lsq_yolox_s_coco_w2a2.sh b/tools/starter_scripts/yolox_s/qat/coco/dist_lsq_yolox_s_coco_w2a2.sh new file mode 100755 index 0000000..d005ba9 --- /dev/null +++ b/tools/starter_scripts/yolox_s/qat/coco/dist_lsq_yolox_s_coco_w2a2.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=1 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12309 \ + --nproc_per_node=1 \ + tools/train.py \ + configs/yolox/yolox_s_8x8_300e_coco_quant_w2a2.py \ + mqbconfig/lsq/quant_config_w2a2_weight_loose.yaml \ + --work-dir /work_dirs/yolox_s_coco_w2a2_LSQ \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/starter_scripts/yolox_s/qat/coco/dist_lsq_yolox_s_coco_w4a4.sh b/tools/starter_scripts/yolox_s/qat/coco/dist_lsq_yolox_s_coco_w4a4.sh new file mode 100755 index 0000000..871fd56 --- /dev/null +++ b/tools/starter_scripts/yolox_s/qat/coco/dist_lsq_yolox_s_coco_w4a4.sh @@ -0,0 +1,13 @@ +CUDA_VISIBLE_DEVICES=2,3 \ +python -m torch.distributed.launch \ + --use_env \ + --master_port=12308 \ + --nproc_per_node=1 \ + tools/train.py \ + configs/yolox/yolox_s_8x8_300e_coco_quant_w4a4.py \ + mqbconfig/lsq/quant_config_w4a4.yaml \ + --work-dir /work_dirs/yolox_s_coco_w4a4_LSQ \ + --quantize \ + --seed 1005 \ + --deterministic \ + --launcher pytorch diff --git a/tools/test.py b/tools/test.py new file mode 100644 index 0000000..9084cdd --- /dev/null +++ b/tools/test.py @@ -0,0 +1,372 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import os +import os.path as osp +import time +import warnings + +import mmcv +import torch +from mmcv import Config, DictAction +from mmcv.cnn import fuse_conv_bn +from mmcv.runner import (get_dist_info, init_dist, load_checkpoint, + wrap_fp16_model) + +from mmdet.apis import multi_gpu_test, single_gpu_test +from mmdet.datasets import (build_dataloader, build_dataset, + replace_ImageToTensor) +from mmdet.models import build_detector +from mmdet.utils import (build_ddp, build_dp, compat_cfg, get_device, + replace_cfg_vals, rfnext_init_model, + setup_multi_processes, update_data_root) +from mqb_general_process import make_qmodel_for_mmd, prepocess +from mqbench.utils.state import * +import global_placeholder +from mqb_general_process import * + +def parse_args(): + parser = argparse.ArgumentParser( + description='MMDet test (and eval) a model') + parser.add_argument('config', help='test config file path') + parser.add_argument('checkpoint', help='checkpoint file') + parser.add_argument('quant_config', default=None, help='quant config file path') + parser.add_argument('--aqd-mode', type=int, default=0, help='when bigger than 0 , it means switch on aqd, and equals the neck output level num') + parser.add_argument('--quantize', + action='store_true', help='quant flag') + parser.add_argument('--seed', type=int, default=None, help='random seed') + + parser.add_argument( + '--work-dir', + help='the directory to save the file containing evaluation metrics') + parser.add_argument('--out', help='output result file in pickle format') + parser.add_argument( + '--fuse-conv-bn', + action='store_true', + help='Whether to fuse conv and bn, this will slightly increase' + 'the inference speed') + parser.add_argument( + '--gpu-ids', + type=int, + nargs='+', + help='(Deprecated, please use --gpu-id) ids of gpus to use ' + '(only applicable to non-distributed training)') + parser.add_argument( + '--gpu-id', + type=int, + default=0, + help='id of gpu to use ' + '(only applicable to non-distributed testing)') + parser.add_argument( + '--format-only', + action='store_true', + help='Format the output results without perform evaluation. It is' + 'useful when you want to format the result to a specific format and ' + 'submit it to the test server') + parser.add_argument( + '--eval', + type=str, + nargs='+', + help='evaluation metrics, which depends on the dataset, e.g., "bbox",' + ' "segm", "proposal" for COCO, and "mAP", "recall" for PASCAL VOC') + parser.add_argument('--show', action='store_true', help='show results') + parser.add_argument( + '--show-dir', help='directory where painted images will be saved') + parser.add_argument( + '--show-score-thr', + type=float, + default=0.3, + help='score threshold (default: 0.3)') + parser.add_argument( + '--gpu-collect', + action='store_true', + help='whether to use gpu to collect results.') + parser.add_argument( + '--tmpdir', + help='tmp directory used for collecting results from multiple ' + 'workers, available when gpu-collect is not specified') + parser.add_argument( + '--cfg-options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file. If the value to ' + 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + 'Note that the quotation marks are necessary and that no white space ' + 'is allowed.') + parser.add_argument( + '--options', + nargs='+', + action=DictAction, + help='custom options for evaluation, the key-value pair in xxx=yyy ' + 'format will be kwargs for dataset.evaluate() function (deprecate), ' + 'change to --eval-options instead.') + parser.add_argument( + '--eval-options', + nargs='+', + action=DictAction, + help='custom options for evaluation, the key-value pair in xxx=yyy ' + 'format will be kwargs for dataset.evaluate() function') + parser.add_argument( + '--launcher', + choices=['none', 'pytorch', 'slurm', 'mpi'], + default='none', + help='job launcher') + parser.add_argument('--local_rank', type=int, default=0) + args = parser.parse_args() + if 'LOCAL_RANK' not in os.environ: + os.environ['LOCAL_RANK'] = str(args.local_rank) + + if args.options and args.eval_options: + raise ValueError( + '--options and --eval-options cannot be both ' + 'specified, --options is deprecated in favor of --eval-options') + if args.options: + warnings.warn('--options is deprecated in favor of --eval-options') + args.eval_options = args.options + return args + + +def main(): + args = parse_args() + + assert args.out or args.eval or args.format_only or args.show \ + or args.show_dir, \ + ('Please specify at least one operation (save/eval/format/show the ' + 'results / save the results) with the argument "--out", "--eval"' + ', "--format-only", "--show" or "--show-dir"') + + if args.eval and args.format_only: + raise ValueError('--eval and --format_only cannot be both specified') + + if args.out is not None and not args.out.endswith(('.pkl', '.pickle')): + raise ValueError('The output file must be a pkl file.') + + cfg = Config.fromfile(args.config) + + # replace the ${key} with the value of cfg.key + cfg = replace_cfg_vals(cfg) + + # update data root according to MMDET_DATASETS + update_data_root(cfg) + + if args.cfg_options is not None: + cfg.merge_from_dict(args.cfg_options) + + cfg = compat_cfg(cfg) + + # set multi-process settings + setup_multi_processes(cfg) + set_random_seed(args.seed) + # set cudnn_benchmark + if cfg.get('cudnn_benchmark', False): + torch.backends.cudnn.benchmark = True + + if 'pretrained' in cfg.model: + cfg.model.pretrained = None + elif 'init_cfg' in cfg.model.backbone: + cfg.model.backbone.init_cfg = None + + if cfg.model.get('neck'): + if isinstance(cfg.model.neck, list): + for neck_cfg in cfg.model.neck: + if neck_cfg.get('rfp_backbone'): + if neck_cfg.rfp_backbone.get('pretrained'): + neck_cfg.rfp_backbone.pretrained = None + elif cfg.model.neck.get('rfp_backbone'): + if cfg.model.neck.rfp_backbone.get('pretrained'): + cfg.model.neck.rfp_backbone.pretrained = None + + if args.gpu_ids is not None: + cfg.gpu_ids = args.gpu_ids[0:1] + warnings.warn('`--gpu-ids` is deprecated, please use `--gpu-id`. ' + 'Because we only support single GPU mode in ' + 'non-distributed testing. Use the first GPU ' + 'in `gpu_ids` now.') + else: + cfg.gpu_ids = [args.gpu_id] + cfg.device = get_device() + # init distributed env first, since logger depends on the dist info. + if args.launcher == 'none': + distributed = False + else: + distributed = True + init_dist(args.launcher, **cfg.dist_params) + + test_dataloader_default_args = dict( + samples_per_gpu=1, workers_per_gpu=2, dist=distributed, shuffle=False) + + # in case the test dataset is concatenated + if isinstance(cfg.data.test, dict): + cfg.data.test.test_mode = True + if cfg.data.test_dataloader.get('samples_per_gpu', 1) > 1: + # Replace 'ImageToTensor' to 'DefaultFormatBundle' + cfg.data.test.pipeline = replace_ImageToTensor( + cfg.data.test.pipeline) + elif isinstance(cfg.data.test, list): + for ds_cfg in cfg.data.test: + ds_cfg.test_mode = True + if cfg.data.test_dataloader.get('samples_per_gpu', 1) > 1: + for ds_cfg in cfg.data.test: + ds_cfg.pipeline = replace_ImageToTensor(ds_cfg.pipeline) + + test_loader_cfg = { + **test_dataloader_default_args, + **cfg.data.get('test_dataloader', {}) + } + + rank, _ = get_dist_info() + # allows not to create + if args.work_dir is not None and rank == 0: + mmcv.mkdir_or_exist(osp.abspath(args.work_dir)) + timestamp = time.strftime('%Y%m%d_%H%M%S', time.localtime()) + json_file = osp.join(args.work_dir, f'eval_{timestamp}.json') + + # build the dataloader + dataset = build_dataset(cfg.data.test) + data_loader = build_dataloader(dataset, **test_loader_cfg) + + # build the model and load checkpoint + cfg.model.train_cfg = None + model = build_detector(cfg.model, test_cfg=cfg.get('test_cfg')) + # global setting + if args.aqd_mode != 0: + global_placeholder.modify_AQD_mode(args.aqd_mode) + + # 如果是QAT模型,那么就需要提前定义好量化模型结构 + if args.quantize: + quant_config = prepocess(args.quant_config) + # copy_config_file(args.quant_config, cfg.work_dir) + logger.info(quant_config) + global_placeholder.modify_quant_bit(quant_config.extra_prepare_dict.extra_qconfig_dict.w_qscheme.bit) + global_placeholder.modify_quant_algorithm(quant_config.quantize.quant_algorithm) + global_placeholder.modify_buff_flag(quant_config.training.my_buff_flag) + global_placeholder.modify_qloss_flag(quant_config.training.qloss_flag) + global_placeholder.modify_fold_bn_flag(quant_config.training.fold_bn_flag) + + model.train() + model = make_qmodel_for_mmd(model, quant_config, cfg.trace_config) + + # else: + # if 'HQOD' in cfg.work_dir: + # logger.info("插播!!!!直接启用harmony!!") + # logger.info("插播!!!!直接启用harmony!!") + # logger.info("插播!!!!直接启用harmony!!\n") + # global_placeholder.modify_buff_flag(1) # 为mypro + # elif 'HarDet' in cfg.work_dir: + # logger.info("插播!!!!直接启用harmony!!") + # logger.info("插播!!!!直接启用harmony!!") + # logger.info("插播!!!!直接启用harmony!!\n") + # global_placeholder.modify_buff_flag(2) # 为hardet + + # 检查 num levels 一致性 + if global_placeholder.aqd_mode != 0 and model.neck.num_outs != global_placeholder.aqd_mode: + # 说明 num levels给的不对 + raise ValueError(f'num levels给的不对! aqd_mode={global_placeholder.aqd_mode} 而 neck.num_outs={model.neck.num_outs}') + + # init rfnext if 'RFSearchHook' is defined in cfg + rfnext_init_model(model, cfg=cfg) + fp16_cfg = cfg.get('fp16', None) + if fp16_cfg is None and cfg.get('device', None) == 'npu': + fp16_cfg = dict(loss_scale='dynamic') + if fp16_cfg is not None: + wrap_fp16_model(model) + checkpoint = load_checkpoint(model, args.checkpoint, map_location='cpu') + head_list = [] + head_name_list = [] + head_data_list = [] + for key in checkpoint['state_dict'].keys(): + if 'bbox_head' in key and 'scale' in key: + head_list.append([key, checkpoint['state_dict'][key].data.item()]) + head_name_list.append(key) + head_data_list.append(checkpoint['state_dict'][key].data.item()) + if args.fuse_conv_bn: + model = fuse_conv_bn(model) + # old versions did not save class info in checkpoints, this walkaround is + # for backward compatibility + if 'CLASSES' in checkpoint.get('meta', {}): + model.CLASSES = checkpoint['meta']['CLASSES'] + else: + model.CLASSES = dataset.CLASSES + + + if args.quantize: + enable_quantization(model.backbone) + enable_quantization(model.neck) + model_general_architecture = cfg.trace_config.get('model_general_architecture', None) + if model_general_architecture == 'FasterRCNN': + enable_quantization(model.rpn_head) + enable_quantization(model.roi_head.bbox_head) + else: + enable_quantization(model.bbox_head) + + model.eval() + if not distributed: + model = build_dp(model, cfg.device, device_ids=cfg.gpu_ids) + outputs = single_gpu_test(model, data_loader, args.show, args.show_dir, + args.show_score_thr) + else: + model = build_ddp( + model, + cfg.device, + device_ids=[int(os.environ['LOCAL_RANK'])], + broadcast_buffers=False) + + # In multi_gpu_test, if tmpdir is None, some tesnors + # will init on cuda by default, and no device choice supported. + # Init a tmpdir to avoid error on npu here. + if cfg.device == 'npu' and args.tmpdir is None: + args.tmpdir = './npu_tmpdir' + + outputs = multi_gpu_test( + model, data_loader, args.tmpdir, args.gpu_collect + or cfg.evaluation.get('gpu_collect', False)) + + rank, _ = get_dist_info() + if rank == 0: + if args.out: + print(f'\nwriting results to {args.out}') + mmcv.dump(outputs, args.out) + kwargs = {} if args.eval_options is None else args.eval_options + if args.format_only: + dataset.format_results(outputs, **kwargs) + if args.eval: + eval_kwargs = cfg.get('evaluation', {}).copy() + # hard-code way to remove EvalHook args + for key in [ + 'interval', 'tmpdir', 'start', 'gpu_collect', 'save_best', + 'rule', 'dynamic_intervals' + ]: + eval_kwargs.pop(key, None) + eval_kwargs.update(dict(metric=args.eval, **kwargs)) + metric = dataset.evaluate(outputs, **eval_kwargs) + print(metric) + metric_dict = dict(config=args.config, metric=metric) + if args.work_dir is not None and rank == 0: + mmcv.dump(metric_dict, json_file) + + +def set_random_seed(seed, deterministic=True): + """Set random seed. + + Args: + seed (int): Seed to be used. + deterministic (bool): Whether to set the deterministic option for + CUDNN backend, i.e., set `torch.backends.cudnn.deterministic` + to True and `torch.backends.cudnn.benchmark` to False. + Default: False. + """ + import random + + import numpy as np + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + if deterministic: + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + + +if __name__ == '__main__': + main() diff --git a/tools/train.py b/tools/train.py new file mode 100644 index 0000000..ff61dc0 --- /dev/null +++ b/tools/train.py @@ -0,0 +1,303 @@ +# Copyright (c) OpenMMLab. All rights reserved. +import argparse +import copy +import os +import os.path as osp +import time +import warnings + +import mmcv +import torch +import torch.distributed as dist +from mmcv import Config, DictAction +from mmcv.runner import get_dist_info, init_dist +from mmcv.utils import get_git_hash + +from mmdet import __version__ +from mmdet.apis import init_random_seed, set_random_seed, train_detector, qat_detector +from mmdet.datasets import build_dataset +from mmdet.models import build_detector +from mmdet.utils import (collect_env, get_device, get_root_logger, + replace_cfg_vals, rfnext_init_model, + setup_multi_processes, update_data_root) + +import sys +sys.path.append(".") # 这玩意挺香的 +import global_placeholder +from mqb_general_process import * +from mqbench.utils.state import * + +def parse_args(): + parser = argparse.ArgumentParser(description='Train a detector') + parser.add_argument('config', help='train config file path') + parser.add_argument('quant_config', default=None, help='quant config file path') + parser.add_argument('--aqd-mode', type=int, default=0, help='when bigger than 0 , it means switch on aqd, and equals the neck output level num') + parser.add_argument('--quantize', + action='store_true', help='quant flag') + parser.add_argument('--work-dir', help='the dir to save logs and models') + parser.add_argument( + '--resume-from', help='the checkpoint file to resume from') + parser.add_argument( + '--auto-resume', + action='store_true', + help='resume from the latest checkpoint automatically') + parser.add_argument( + '--no-validate', + action='store_true', + help='whether not to evaluate the checkpoint during training') + group_gpus = parser.add_mutually_exclusive_group() + group_gpus.add_argument( + '--gpus', + type=int, + help='(Deprecated, please use --gpu-id) number of gpus to use ' + '(only applicable to non-distributed training)') + group_gpus.add_argument( + '--gpu-ids', + type=int, + nargs='+', + help='(Deprecated, please use --gpu-id) ids of gpus to use ' + '(only applicable to non-distributed training)') + group_gpus.add_argument( + '--gpu-id', + type=int, + default=0, + help='id of gpu to use ' + '(only applicable to non-distributed training)') + parser.add_argument('--seed', type=int, default=None, help='random seed') + parser.add_argument( + '--diff-seed', + action='store_true', + help='Whether or not set different seeds for different ranks') + parser.add_argument( + '--deterministic', + action='store_true', + help='whether to set deterministic options for CUDNN backend.') + parser.add_argument( + '--options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file (deprecate), ' + 'change to --cfg-options instead.') + parser.add_argument( + '--cfg-options', + nargs='+', + action=DictAction, + help='override some settings in the used config, the key-value pair ' + 'in xxx=yyy format will be merged into config file. If the value to ' + 'be overwritten is a list, it should be like key="[a,b]" or key=a,b ' + 'It also allows nested list/tuple values, e.g. key="[(a,b),(c,d)]" ' + 'Note that the quotation marks are necessary and that no white space ' + 'is allowed.') + parser.add_argument( + '--launcher', + choices=['none', 'pytorch', 'slurm', 'mpi'], + default='none', + help='job launcher') + parser.add_argument('--local_rank', type=int, default=0) + parser.add_argument( + '--auto-scale-lr', + action='store_true', + help='enable automatically scaling LR.') + args = parser.parse_args() + if 'LOCAL_RANK' not in os.environ: + os.environ['LOCAL_RANK'] = str(args.local_rank) + + if args.options and args.cfg_options: + raise ValueError( + '--options and --cfg-options cannot be both ' + 'specified, --options is deprecated in favor of --cfg-options') + if args.options: + warnings.warn('--options is deprecated in favor of --cfg-options') + args.cfg_options = args.options + + return args + + +def main(): + args = parse_args() + + cfg = Config.fromfile(args.config) + + # replace the ${key} with the value of cfg.key + cfg = replace_cfg_vals(cfg) + + # update data root according to MMDET_DATASETS + update_data_root(cfg) + + if args.cfg_options is not None: + cfg.merge_from_dict(args.cfg_options) + + if args.auto_scale_lr: + if 'auto_scale_lr' in cfg and \ + 'enable' in cfg.auto_scale_lr and \ + 'base_batch_size' in cfg.auto_scale_lr: + cfg.auto_scale_lr.enable = True + else: + warnings.warn('Can not find "auto_scale_lr" or ' + '"auto_scale_lr.enable" or ' + '"auto_scale_lr.base_batch_size" in your' + ' configuration file. Please update all the ' + 'configuration files to mmdet >= 2.24.1.') + + # set multi-process settings + setup_multi_processes(cfg) + + # set cudnn_benchmark + if cfg.get('cudnn_benchmark', False): + torch.backends.cudnn.benchmark = True + + # work_dir is determined in this priority: CLI > segment in file > filename + if args.work_dir is not None: + # update configs according to CLI args if args.work_dir is not None + cfg.work_dir = args.work_dir + elif cfg.get('work_dir', None) is None: + # use config filename as default work_dir if cfg.work_dir is None + cfg.work_dir = osp.join('./work_dirs', + osp.splitext(osp.basename(args.config))[0]) + + if args.resume_from is not None: + cfg.resume_from = args.resume_from + cfg.auto_resume = args.auto_resume + if args.gpus is not None: + cfg.gpu_ids = range(1) + warnings.warn('`--gpus` is deprecated because we only support ' + 'single GPU mode in non-distributed training. ' + 'Use `gpus=1` now.') + if args.gpu_ids is not None: + cfg.gpu_ids = args.gpu_ids[0:1] + warnings.warn('`--gpu-ids` is deprecated, please use `--gpu-id`. ' + 'Because we only support single GPU mode in ' + 'non-distributed training. Use the first GPU ' + 'in `gpu_ids` now.') + if args.gpus is None and args.gpu_ids is None: + cfg.gpu_ids = [args.gpu_id] + + # init distributed env first, since logger depends on the dist info. + if args.launcher == 'none': + distributed = False + else: + distributed = True + init_dist(args.launcher, **cfg.dist_params) + # re-set gpu_ids with distributed training mode + _, world_size = get_dist_info() + cfg.gpu_ids = range(world_size) + + + + # create work_dir + mmcv.mkdir_or_exist(osp.abspath(cfg.work_dir)) + # dump config + cfg.dump(osp.join(cfg.work_dir, osp.basename(args.config))) + # init the logger before other steps + timestamp = time.strftime('%Y%m%d_%H%M%S', time.localtime()) + log_file = osp.join(cfg.work_dir, f'{timestamp}.log') + logger = get_root_logger(log_file=log_file, log_level=cfg.log_level) + + # TODO 改叫全局设置吧,确实可以引进,舒服一点 后期可以优化一下这里 + if args.aqd_mode != 0: + global_placeholder.modify_AQD_mode(args.aqd_mode) + if args.quantize: + # 加载qat config 文件 + quant_config = prepocess(args.quant_config) + copy_config_file(args.quant_config, cfg.work_dir) + logger.info(quant_config) + global_placeholder.modify_quant_bit(quant_config.extra_prepare_dict.extra_qconfig_dict.w_qscheme.bit) + global_placeholder.modify_quant_algorithm(quant_config.quantize.quant_algorithm) + global_placeholder.modify_buff_flag(quant_config.training.my_buff_flag) + global_placeholder.modify_qloss_flag(quant_config.training.qloss_flag) + global_placeholder.modify_fold_bn_flag(quant_config.training.fold_bn_flag) + else: + if 'HQOD' in cfg.work_dir: + logger.info("插播!!!!直接启用harmony!!") + logger.info("插播!!!!直接启用harmony!!") + logger.info("插播!!!!直接启用harmony!!\n") + global_placeholder.modify_buff_flag(1) # 为mypro + elif 'HarDet' in cfg.work_dir: + logger.info("插播!!!!直接启用harmony!!") + logger.info("插播!!!!直接启用harmony!!") + logger.info("插播!!!!直接启用harmony!!\n") + global_placeholder.modify_buff_flag(2) # 为hardet + # else: + # raise NotImplementedError + + # init the meta dict to record some important information such as + # environment info and seed, which will be logged + meta = dict() + # log env info + env_info_dict = collect_env() + env_info = '\n'.join([(f'{k}: {v}') for k, v in env_info_dict.items()]) + dash_line = '-' * 60 + '\n' + logger.info('Environment info:\n' + dash_line + env_info + '\n' + + dash_line) + meta['env_info'] = env_info + meta['config'] = cfg.pretty_text + # log some basic info + logger.info(f'Distributed training: {distributed}') + logger.info(f'Config:\n{cfg.pretty_text}') + + cfg.device = get_device() + # set random seeds + seed = init_random_seed(args.seed, device=cfg.device) + seed = seed + dist.get_rank() if args.diff_seed else seed + logger.info(f'Set random seed to {seed}, ' + f'deterministic: {args.deterministic}') + set_random_seed(seed, deterministic=args.deterministic) + cfg.seed = seed + meta['seed'] = seed + meta['exp_name'] = osp.basename(args.config) + + model = build_detector( # 这里应该是加载了预训练模型勒 + cfg.model, + train_cfg=cfg.get('train_cfg'), + test_cfg=cfg.get('test_cfg')) + model.init_weights() + + # 检查 num levels 一致性 + if global_placeholder.aqd_mode != 0 and model.neck.num_outs != global_placeholder.aqd_mode: + # 说明 num levels给的不对 + raise ValueError(f'num levels给的不对! aqd_mode={global_placeholder.aqd_mode} 而 neck.num_outs={model.neck.num_outs}') + + # init rfnext if 'RFSearchHook' is defined in cfg + rfnext_init_model(model, cfg=cfg) + + datasets = [build_dataset(cfg.data.train)] + if len(cfg.workflow) == 2: + assert 'val' in [mode for (mode, _) in cfg.workflow] + val_dataset = copy.deepcopy(cfg.data.val) + val_dataset.pipeline = cfg.data.train.get( + 'pipeline', cfg.data.train.dataset.get('pipeline')) + datasets.append(build_dataset(val_dataset)) + if cfg.checkpoint_config is not None: + # save mmdet version, config file content and class names in + # checkpoints as meta data + cfg.checkpoint_config.meta = dict( + mmdet_version=__version__ + get_git_hash()[:7], + CLASSES=datasets[0].CLASSES) + # add an attribute for visualization convenience + model.CLASSES = datasets[0].CLASSES + if args.quantize: + logger.info('QAT Mode On!') + qat_detector( + model, + datasets, + cfg, + quant_config, + distributed=distributed, + validate=(not args.no_validate), + timestamp=timestamp, + meta=meta) + else: + logger.info('Simple Train!!') + train_detector( + model, + datasets, + cfg, + distributed=distributed, + validate=(not args.no_validate), + timestamp=timestamp, + meta=meta) + + +if __name__ == '__main__': + main()